diff --git a/.gitignore b/.gitignore
index 0a28957..3d65f04 100644
--- a/.gitignore
+++ b/.gitignore
@@ -40,20 +40,6 @@
 /third_party/brotli/src/
 /third_party/colorama/src/
 /third_party/dart-sdk/
-/third_party/dart-pkg/archive
-/third_party/dart-pkg/args
-/third_party/dart-pkg/box2d
-/third_party/dart-pkg/cassowary
-/third_party/dart-pkg/collection
-/third_party/dart-pkg/crypto
-/third_party/dart-pkg/newton
-/third_party/dart-pkg/path
-/third_party/dart-pkg/quiver
-/third_party/dart-pkg/source_span
-/third_party/dart-pkg/string_scanner
-/third_party/dart-pkg/vector_math
-/third_party/dart-pkg/vector_math
-/third_party/dart-pkg/yaml
 /third_party/dejavu-fonts-ttf-2.34/ttf/*.ttf
 /third_party/freetype-android/src
 /third_party/go/
diff --git a/DEPS b/DEPS
index 2f09622..737e87a 100644
--- a/DEPS
+++ b/DEPS
@@ -30,19 +30,6 @@
   'lss_revision': '6f97298fe3794e92c8c896a6bc06e0b36e4c3de3',
   'nss_revision': 'bb4e75a43d007518ae7d618665ea2f25b0c60b63',
   'nacl_revision': '8071f876e10f96da879853a7705d9c5aba378839',
-  'archive_dart_revision': '07ffd98c5403b7f9ae067b57dc9487611be420f5',
-  'args_dart_revision': 'e0e8377412ee6cd6a5a4a8632848181c1db91f44',
-  'box2d_dart_revision': 'c5e65d9546275e78ad2a1d51b459e7638f6e4323',
-  'cassowary_dart_revision': '7e5afc5b3956a18636d5b37b1dcba1705865564b',
-  'collection_dart_revision': '79ebc6fc2dae581cb23ad50a5c600c1b7dd132f8',
-  'crypto_dart_revision': 'd4558dea1639e5ad2a41d045265b8ece270c2d90',
-  'newton_dart_revision': '9fbe5fbac809246f7ace4176feca13bdf731e393',
-  'path_dart_revision': '2f3dcdec32011f1bc41194ae3640d6d9292a7096',
-  'quiver_dart_revision': '6bab7dec34189eee579178eb16d3063c8ae69031',
-  'source_span_dart_revision': '5c6c13f62fc111adaace3aeb4a38853d64481d06',
-  'string_scanner_dart_revision': '9f00056b32f41efc376adecfb696a01bc7c593d7',
-  'vector_math_dart_revision': '65915583f7aa606cb47ed265f853c18c60102b81',
-  'yaml_dart_revision': 'd8c1ce75edf051ea1d5583b24474f8656abb4920',
 }
 
 # Only these hosts are allowed for dependencies in this DEPS file.
@@ -113,45 +100,6 @@
   'src/native_client':
     Var('chromium_git') + '/native_client/src/native_client.git' + '@' + Var('nacl_revision'),
 
-  'src/third_party/dart-pkg/archive':
-    Var('chromium_git') + '/external/github.com/brendan-duncan/archive.git' + '@' + Var('archive_dart_revision'),
-
-  'src/third_party/dart-pkg/args':
-    Var('chromium_git') + '/external/github.com/dart-lang/args.git' + '@' + Var('args_dart_revision'),
-
-  'src/third_party/dart-pkg/box2d':
-    Var('chromium_git') + '/external/github.com/google/box2d.dart.git' + '@' + Var('box2d_dart_revision'),
-
-  'src/third_party/dart-pkg/cassowary':
-    Var('chromium_git') + '/external/github.com/domokit/cassowary.git' + '@' + Var('cassowary_dart_revision'),
-
-  'src/third_party/dart-pkg/collection':
-    Var('chromium_git') + '/external/github.com/dart-lang/collection.git' + '@' + Var('collection_dart_revision'),
-
-  'src/third_party/dart-pkg/crypto':
-    Var('chromium_git') + '/external/github.com/dart-lang/crypto.git' + '@' + Var('crypto_dart_revision'),
-
-  'src/third_party/dart-pkg/newton':
-    Var('chromium_git') + '/external/github.com/domokit/newton.git' + '@' + Var('newton_dart_revision'),
-
-  'src/third_party/dart-pkg/path':
-    Var('chromium_git') + '/external/github.com/dart-lang/path.git' + '@' + Var('path_dart_revision'),
-
-  'src/third_party/dart-pkg/quiver':
-    Var('chromium_git') + '/external/github.com/google/quiver-dart.git' + '@' + Var('quiver_dart_revision'),
-
-  'src/third_party/dart-pkg/source_span':
-    Var('chromium_git') + '/external/github.com/dart-lang/source_span.git' + '@' + Var('source_span_dart_revision'),
-
-  'src/third_party/dart-pkg/string_scanner':
-    Var('chromium_git') + '/external/github.com/dart-lang/string_scanner.git' + '@' + Var('string_scanner_dart_revision'),
-
-  'src/third_party/dart-pkg/vector_math':
-    Var('chromium_git') + '/external/github.com/google/vector_math.dart.git' + '@' + Var('vector_math_dart_revision'),
-
-  'src/third_party/dart-pkg/yaml':
-    Var('chromium_git') + '/external/github.com/dart-lang/yaml.git' + '@' + Var('yaml_dart_revision'),
-
   'src/third_party/pyelftools':
     Var('chromium_git') + '/chromiumos/third_party/pyelftools.git' + '@' + '19b3e610c86fcadb837d252c794cb5e8008826ae',
 
@@ -339,20 +287,6 @@
                 '--tools-directory', '../../../tools',
     ],
   },
-  # Run "pub get" on any directories with checked-in pubspec.yaml files
-  # (excluding sky/, whose pubspec.yaml files are not intended for supporting
-  # building in-place in the repo).
-  {
-    'name': 'run_dart_pub_get',
-    'pattern': '',
-    'action': [ 'python',
-                'src/mojo/public/tools/git/dart_pub_get.py',
-                '--repository-root', '../../../..',
-                '--dart-sdk-directory',
-                '../../../../third_party/dart-sdk/dart-sdk',
-                '--dirs-to-ignore', 'sky/',
-    ],
-  },
   {
     # Ensure that we don't accidentally reference any .pyc files whose
     # corresponding .py files have already been deleted.
diff --git a/mojo/dart/embedder/BUILD.gn b/mojo/dart/embedder/BUILD.gn
index c49a140..fd1156b 100644
--- a/mojo/dart/embedder/BUILD.gn
+++ b/mojo/dart/embedder/BUILD.gn
@@ -42,7 +42,6 @@
     "//base:i18n",
     "//dart/runtime:libdart",
     "//dart/runtime/bin:libdart_embedder_noio",
-    "//third_party/dart-pkg",
     "//mojo/message_pump",
     "//mojo/public/c/system",
     "//mojo/public/cpp/system",
diff --git a/mojo/public/dart/BUILD.gn b/mojo/public/dart/BUILD.gn
index 557587b..7f46859 100644
--- a/mojo/public/dart/BUILD.gn
+++ b/mojo/public/dart/BUILD.gn
@@ -7,5 +7,6 @@
     "mojo",
     "mojo_apptest",
     "mojom",
+    "third_party",
   ]
 }
diff --git a/mojo/public/dart/mojo/BUILD.gn b/mojo/public/dart/mojo/BUILD.gn
index 1ac9dbe..8cdb616 100644
--- a/mojo/public/dart/mojo/BUILD.gn
+++ b/mojo/public/dart/mojo/BUILD.gn
@@ -42,8 +42,8 @@
 
   sdk_ext_directory = "sdk_ext"
 
-  # List of mojom targets that the mojo pkg exports
   deps = [
+    "../third_party",
     "../../interfaces",
   ]
 }
diff --git a/mojo/public/dart/mojo_apptest/BUILD.gn b/mojo/public/dart/mojo_apptest/BUILD.gn
index d87b040..6c0c1fe 100644
--- a/mojo/public/dart/mojo_apptest/BUILD.gn
+++ b/mojo/public/dart/mojo_apptest/BUILD.gn
@@ -9,4 +9,8 @@
   sources = [
     "pubspec.yaml",
   ]
+  deps = [
+    "../mojo",
+    "../third_party",
+  ]
 }
diff --git a/mojo/public/dart/mojom/BUILD.gn b/mojo/public/dart/mojom/BUILD.gn
index 9ae40d7..96b4bcb 100644
--- a/mojo/public/dart/mojom/BUILD.gn
+++ b/mojo/public/dart/mojom/BUILD.gn
@@ -22,4 +22,7 @@
     "README.md",
     "pubspec.yaml",
   ]
+  deps = [
+    "../third_party",
+  ]
 }
diff --git a/mojo/public/dart/third_party/.gitignore b/mojo/public/dart/third_party/.gitignore
new file mode 100644
index 0000000..9e0a3ac
--- /dev/null
+++ b/mojo/public/dart/third_party/.gitignore
@@ -0,0 +1,3 @@
+.packages
+packages
+.pub
diff --git a/mojo/public/dart/third_party/BUILD.gn b/mojo/public/dart/third_party/BUILD.gn
new file mode 100644
index 0000000..cc55fef
--- /dev/null
+++ b/mojo/public/dart/third_party/BUILD.gn
@@ -0,0 +1,175 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("../rules.gni")
+
+group("third_party") {
+  deps = [
+    ":analyzer",
+    ":args",
+    ":async",
+    ":barback",
+    ":charcode",
+    ":collection",
+    ":crypto",
+    ":csslib",
+    ":glob",
+    ":html",
+    ":http_multi_server",
+    ":http_parser",
+    ":logging",
+    ":matcher",
+    ":mime",
+    ":package_config",
+    ":path",
+    ":plugin",
+    ":pool",
+    ":pub_semver",
+    ":shelf",
+    ":shelf_static",
+    ":shelf_web_socket",
+    ":source_maps",
+    ":source_map_stack_trace",
+    ":source_span",
+    ":stack_trace",
+    ":string_scanner",
+    ":test",
+    ":unittest",
+    ":utf",
+    ":watcher",
+    ":yaml",
+  ]
+}
+
+dart_pkg("analyzer") {
+  pkg_dir = "analyzer"
+}
+
+dart_pkg("args") {
+  pkg_dir = "args"
+}
+
+dart_pkg("async") {
+  pkg_dir = "async"
+}
+
+dart_pkg("barback") {
+  pkg_dir = "barback"
+}
+
+dart_pkg("charcode") {
+  pkg_dir = "charcode"
+}
+
+dart_pkg("collection") {
+  pkg_dir = "collection"
+}
+
+dart_pkg("crypto") {
+  pkg_dir = "crypto"
+}
+
+dart_pkg("csslib") {
+  pkg_dir = "csslib"
+}
+
+dart_pkg("glob") {
+  pkg_dir = "glob"
+}
+
+dart_pkg("html") {
+  pkg_dir = "html"
+}
+
+dart_pkg("http_multi_server") {
+  pkg_dir = "http_multi_server"
+}
+
+dart_pkg("http_parser") {
+  pkg_dir = "http_parser"
+}
+
+dart_pkg("logging") {
+  pkg_dir = "logging"
+}
+
+dart_pkg("matcher") {
+  pkg_dir = "matcher"
+}
+
+dart_pkg("mime") {
+  pkg_dir = "mime"
+}
+
+dart_pkg("package_config") {
+  pkg_dir = "package_config"
+}
+
+dart_pkg("path") {
+  pkg_dir = "path"
+}
+
+dart_pkg("plugin") {
+  pkg_dir = "plugin"
+}
+
+dart_pkg("pool") {
+  pkg_dir = "pool"
+}
+
+dart_pkg("pub_semver") {
+  pkg_dir = "pub_semver"
+}
+
+dart_pkg("shelf") {
+  pkg_dir = "shelf"
+}
+
+dart_pkg("shelf_static") {
+  pkg_dir = "shelf_static"
+}
+
+dart_pkg("shelf_web_socket") {
+  pkg_dir = "shelf_web_socket"
+}
+
+dart_pkg("source_maps") {
+  pkg_dir = "source_maps"
+}
+
+dart_pkg("source_map_stack_trace") {
+  pkg_dir = "source_map_stack_trace"
+}
+
+dart_pkg("source_span") {
+  pkg_dir = "source_span"
+}
+
+dart_pkg("stack_trace") {
+  pkg_dir = "stack_trace"
+}
+
+dart_pkg("string_scanner") {
+  pkg_dir = "string_scanner"
+}
+
+dart_pkg("test") {
+  pkg_dir = "test"
+}
+
+dart_pkg("unittest") {
+  pkg_dir = "unittest"
+}
+
+dart_pkg("utf") {
+  pkg_dir = "utf"
+}
+
+dart_pkg("watcher") {
+  pkg_dir = "watcher"
+}
+
+dart_pkg("yaml") {
+  pkg_dir = "yaml"
+}
diff --git a/mojo/public/dart/third_party/analyzer/CHANGELOG.md b/mojo/public/dart/third_party/analyzer/CHANGELOG.md
new file mode 100644
index 0000000..2f46b64
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/CHANGELOG.md
@@ -0,0 +1,83 @@
+## 0.26.1+2
+
+* Extension point for WorkManagerFactory(s).
+* Resolve enum documentation comments.
+* Fix display of parameter lists in servers Element structure (issue 24194)
+* Band-aid fix for issue #24191.
+
+## 0.26.1+1
+
+* Removed a warning about importing unnamed libraries
+* Fix handling of empty URIs in `.packages` files (issue 24126)
+
+## 0.26.1
+
+* Fix line starts in multiline comments (issue 23919).
+* Various small fixes to Windows path handling.
+* Update LineInfo computation during incremental resolution.
+* Make exclude list apply to contexts (issue 23941).
+* Fix type propagation for asynchronous for-in statements.
+* Fix ToStringVisitor for external functions (issue 23968).
+* Fix sorting of compilation unit members.
+* Add forwarding for DefaultFormalParameter metadata.
+* Fix most implementations of UriResolver.restoreAbsolute.
+* Disable dart2js hints by default.
+* Support older SDKs (Dart 1.11).
+
+## 0.26.0
+
+* Add hook for listening to implicitly analyzed files
+* Add a PathFilter and AnalysisOptionsProvider utility classes to aid
+  clients in excluding files from analysis when directed to do so by an
+  options file.
+* API change: `UriResolver.resolveUri(..)` now takes an optional `actualUri`.
+* Change `ResolutionCopier.visitAwaitExpression` to copy *Type fields.
+* Fix highlight range for missing enum constant in switch (issue 23904).
+* Fix analyzer's treatment of `ClassName?.staticMember` to match spec.
+* Implement DEP 34 (less restricted mixins).
+* Fix some implementations of `UriResolver.resolveUri(..)` that did not
+  properly handle the new `actualUri` argument.
+
+## 0.25.2
+
+* Requires Dart SDK 1.12-dev or greater
+* Enable null-aware operators (DEP 9) by default.
+* Generic method support in the element model.
+
+## 0.25.2-alpha.1
+
+* `dart:sdk` extension `.sdkext` changed to `_sdkext` (to play nicer with pub).
+
+## 0.25.2-alpha.0
+
+* Initial support for analyzing `dart:sdk` extensions from `.sdkext`. 
+
+## 0.25.1
+
+* (Internal) code reorganization to address analysis warnings due to SDK reorg.
+* First steps towards `.packages` support.
+
+## 0.25.0
+
+* Commandline interface moved to dedicated `analyzer_cli` package. Files moved:
+  * `bin/analyzer.dart`
+  * `lib/options.dart`
+  * `lib/src/analyzer_impl.dart`
+  * `lib/src/error_formatter.dart`
+* Removed dependency on the `args` package.
+
+## 0.22.1
+
+* Changes in the async/await support.
+
+
+## 0.22.0
+
+  New API:
+  
+* `Source.uri` added.
+
+  Breaking changes:
+
+* `DartSdk.fromEncoding` replaced with `fromFileUri`.
+* `Source.resolveRelative` replaced with `resolveRelativeUri`.
diff --git a/mojo/public/dart/third_party/analyzer/LICENSE b/mojo/public/dart/third_party/analyzer/LICENSE
new file mode 100644
index 0000000..ee99930
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2013, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/analyzer/README.md b/mojo/public/dart/third_party/analyzer/README.md
new file mode 100644
index 0000000..eb5c89e
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/README.md
@@ -0,0 +1,27 @@
+The analysis package defines support for performing static analysis of Dart
+code. It was designed to support tooling efforts, but has also been used for
+such things as statistics gathering and code transformers.
+
+If you are interested in providing Dart support in a long-running tool, such as
+an editor or IDE, you should use the analysis server instead of this package.
+The analysis server is currently shipped as an executable in the SDK and will
+be released as a package in the near future. In the meantime, if you'd like to
+learn more about it, please look at the
+[Analysis Server API Specification](http://htmlpreview.github.io/?https://github.com/dart-lang/sdk/blob/master/pkg/analysis_server/doc/api.html)
+or contact the mailing list (see below).
+
+The API's in this package are, quite frankly, a mess at the moment. They were
+originally machine generated by a translator and were based on an earlier Java
+implementation. Several of the API's still look like their Java predecessors
+(or worse) rather than clean Dart API's.
+
+In addition, there is currently no clean distinction between public and internal
+API's. We plan to address this issue soon, but doing so will, unfortunately,
+require a large number of breaking changes. We will try to minimize the pain
+this causes for our clients, but some pain is inevitable.
+
+Questions and requests for additional functionality are welcome, and can be made
+by either opening an issue at
+[http://dartbug.com](http://dartbug.com)
+or by emailing
+[analyzer-discuss@dartlang.org](https://groups.google.com/a/dartlang.org/forum/#!forum/analyzer-discuss).
diff --git a/mojo/public/dart/third_party/analyzer/example/parser_driver.dart b/mojo/public/dart/third_party/analyzer/example/parser_driver.dart
new file mode 100755
index 0000000..8fdf1a9
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/example/parser_driver.dart
@@ -0,0 +1,54 @@
+#!/usr/bin/env dart
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/parser.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+
+main(List<String> args) {
+  print('working dir ${new File('.').resolveSymbolicLinksSync()}');
+
+  if (args.length == 0) {
+    print('Usage: parser_driver [files_to_parse]');
+    exit(0);
+  }
+
+  for (var arg in args) {
+    _parse(new File(arg));
+  }
+}
+
+_parse(File file) {
+  var src = file.readAsStringSync();
+  var errorListener = new _ErrorCollector();
+  var reader = new CharSequenceReader(src);
+  var scanner = new Scanner(null, reader, errorListener);
+  var token = scanner.tokenize();
+  var parser = new Parser(null, errorListener);
+  var unit = parser.parseCompilationUnit(token);
+
+  var visitor = new _ASTVisitor();
+  unit.accept(visitor);
+
+  for (var error in errorListener.errors) {
+    print(error);
+  }
+}
+
+class _ASTVisitor extends GeneralizingAstVisitor {
+  visitNode(AstNode node) {
+    print('${node.runtimeType} : <"$node">');
+    return super.visitNode(node);
+  }
+}
+
+class _ErrorCollector extends AnalysisErrorListener {
+  List<AnalysisError> errors;
+  _ErrorCollector() : errors = new List<AnalysisError>();
+  onError(error) => errors.add(error);
+}
diff --git a/mojo/public/dart/third_party/analyzer/example/resolver_driver.dart b/mojo/public/dart/third_party/analyzer/example/resolver_driver.dart
new file mode 100755
index 0000000..59e66e7
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/example/resolver_driver.dart
@@ -0,0 +1,76 @@
+#!/usr/bin/env dart
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
+import 'package:analyzer/src/generated/sdk_io.dart' show DirectoryBasedDartSdk;
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+
+void main(List<String> args) {
+  print('working dir ${new File('.').resolveSymbolicLinksSync()}');
+
+  if (args.length < 2 || args.length > 3) {
+    print(_usage);
+    exit(0);
+  }
+
+  String packageRoot;
+  if (args.length == 3) {
+    packageRoot = args[2];
+  }
+
+  JavaSystemIO.setProperty("com.google.dart.sdk", args[0]);
+  DartSdk sdk = DirectoryBasedDartSdk.defaultSdk;
+
+  var resolvers = [new DartUriResolver(sdk), new FileUriResolver()];
+
+  if (packageRoot != null) {
+    var packageDirectory = new JavaFile(packageRoot);
+    resolvers.add(new PackageUriResolver([packageDirectory]));
+  }
+
+  AnalysisContext context = AnalysisEngine.instance.createAnalysisContext()
+    ..sourceFactory = new SourceFactory(resolvers);
+
+  Source source = new FileBasedSource(new JavaFile(args[1]));
+  ChangeSet changeSet = new ChangeSet()..addedSource(source);
+  context.applyChanges(changeSet);
+  LibraryElement libElement = context.computeLibraryElement(source);
+  print("libElement: $libElement");
+
+  CompilationUnit resolvedUnit =
+      context.resolveCompilationUnit(source, libElement);
+  var visitor = new _ASTVisitor();
+  resolvedUnit.accept(visitor);
+}
+
+const _usage =
+    'Usage: resolve_driver <path_to_sdk> <file_to_resolve> [<packages_root>]';
+
+class _ASTVisitor extends GeneralizingAstVisitor {
+  visitNode(AstNode node) {
+    var lines = <String>['${node.runtimeType} : <"$node">'];
+    if (node is SimpleIdentifier) {
+      Element element = node.staticElement;
+      if (element != null) {
+        lines.add('  element: ${element.runtimeType}');
+        LibraryElement library = element.library;
+        if (library != null) {
+          var fullName =
+              element.library.definingCompilationUnit.source.fullName;
+          lines.add("  from $fullName");
+        }
+      }
+    }
+    print(lines.join('\n'));
+    return super.visitNode(node);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/example/scanner_driver.dart b/mojo/public/dart/third_party/analyzer/example/scanner_driver.dart
new file mode 100755
index 0000000..d403fab
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/example/scanner_driver.dart
@@ -0,0 +1,32 @@
+#!/usr/bin/env dart
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:analyzer/src/generated/scanner.dart';
+
+main(List<String> args) {
+  print('working dir ${new File('.').resolveSymbolicLinksSync()}');
+
+  if (args.length == 0) {
+    print('Usage: scanner_driver [files_to_scan]');
+    exit(0);
+  }
+
+  for (var arg in args) {
+    _scan(new File(arg));
+  }
+}
+
+_scan(File file) {
+  var src = file.readAsStringSync();
+  var reader = new CharSequenceReader(src);
+  var scanner = new Scanner(null, reader, null);
+  var token = scanner.tokenize();
+  while (token.type != TokenType.EOF) {
+    print(token);
+    token = token.next;
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/analyzer.dart b/mojo/public/dart/third_party/analyzer/lib/analyzer.dart
new file mode 100644
index 0000000..83a72a1
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/analyzer.dart
@@ -0,0 +1,129 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer;
+
+import 'dart:io';
+
+import 'package:path/path.dart' as pathos;
+
+import 'src/error.dart';
+import 'src/generated/ast.dart';
+import 'src/generated/error.dart';
+import 'src/generated/parser.dart';
+import 'src/generated/scanner.dart';
+import 'src/generated/source_io.dart';
+import 'src/string_source.dart';
+
+export 'src/error.dart';
+export 'src/generated/ast.dart';
+export 'src/generated/error.dart';
+export 'src/generated/utilities_dart.dart';
+
+/// Parses a string of Dart code into an AST.
+///
+/// If [name] is passed, it's used in error messages as the name of the code
+/// being parsed.
+///
+/// Throws an [AnalyzerErrorGroup] if any errors occurred, unless
+/// [suppressErrors] is `true`, in which case any errors are discarded.
+///
+/// If [parseFunctionBodies] is [false] then only function signatures will be
+/// parsed.
+CompilationUnit parseCompilationUnit(String contents,
+    {String name, bool suppressErrors: false, bool parseFunctionBodies: true}) {
+  if (name == null) name = '<unknown source>';
+  var source = new StringSource(contents, name);
+  return _parseSource(contents, source,
+      suppressErrors: suppressErrors, parseFunctionBodies: parseFunctionBodies);
+}
+
+/// Parses a Dart file into an AST.
+///
+/// Throws an [AnalyzerErrorGroup] if any errors occurred, unless
+/// [suppressErrors] is `true`, in which case any errors are discarded.
+///
+/// If [parseFunctionBodies] is [false] then only function signatures will be
+/// parsed.
+CompilationUnit parseDartFile(String path,
+    {bool suppressErrors: false, bool parseFunctionBodies: true}) {
+  String contents = new File(path).readAsStringSync();
+  var sourceFactory = new SourceFactory([new FileUriResolver()]);
+
+  var absolutePath = pathos.absolute(path);
+  var source = sourceFactory.forUri(pathos.toUri(absolutePath).toString());
+  if (source == null) {
+    throw new ArgumentError("Can't get source for path $path");
+  }
+  if (!source.exists()) {
+    throw new ArgumentError("Source $source doesn't exist");
+  }
+
+  return _parseSource(contents, source,
+      suppressErrors: suppressErrors, parseFunctionBodies: parseFunctionBodies);
+}
+
+CompilationUnit _parseSource(String contents, Source source,
+    {bool suppressErrors: false, bool parseFunctionBodies: true}) {
+  var reader = new CharSequenceReader(contents);
+  var errorCollector = new _ErrorCollector();
+  var scanner = new Scanner(source, reader, errorCollector);
+  var token = scanner.tokenize();
+  var parser = new Parser(source, errorCollector)
+    ..parseFunctionBodies = parseFunctionBodies;
+  var unit = parser.parseCompilationUnit(token)
+    ..lineInfo = new LineInfo(scanner.lineStarts);
+
+  if (errorCollector.hasErrors && !suppressErrors) throw errorCollector.group;
+
+  return unit;
+}
+
+/// Parses the script tag and directives in a string of Dart code into an AST.
+///
+/// Stops parsing when the first non-directive is encountered. The rest of the
+/// string will not be parsed.
+///
+/// If [name] is passed, it's used in error messages as the name of the code
+/// being parsed.
+///
+/// Throws an [AnalyzerErrorGroup] if any errors occurred, unless
+/// [suppressErrors] is `true`, in which case any errors are discarded.
+CompilationUnit parseDirectives(String contents,
+    {String name, bool suppressErrors: false}) {
+  if (name == null) name = '<unknown source>';
+  var source = new StringSource(contents, name);
+  var errorCollector = new _ErrorCollector();
+  var reader = new CharSequenceReader(contents);
+  var scanner = new Scanner(source, reader, errorCollector);
+  var token = scanner.tokenize();
+  var parser = new Parser(source, errorCollector);
+  var unit = parser.parseDirectives(token);
+  unit.lineInfo = new LineInfo(scanner.lineStarts);
+
+  if (errorCollector.hasErrors && !suppressErrors) throw errorCollector.group;
+
+  return unit;
+}
+
+/// Converts an AST node representing a string literal into a [String].
+String stringLiteralToString(StringLiteral literal) {
+  return literal.stringValue;
+}
+
+/// A simple error listener that collects errors into an [AnalysisErrorGroup].
+class _ErrorCollector extends AnalysisErrorListener {
+  final _errors = <AnalysisError>[];
+
+  _ErrorCollector();
+
+  /// The group of errors collected.
+  AnalyzerErrorGroup get group =>
+      new AnalyzerErrorGroup.fromAnalysisErrors(_errors);
+
+  /// Whether any errors where collected.
+  bool get hasErrors => !_errors.isEmpty;
+
+  void onError(AnalysisError error) => _errors.add(error);
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/file_system/file_system.dart b/mojo/public/dart/third_party/analyzer/lib/file_system/file_system.dart
new file mode 100644
index 0000000..7d3ed95
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/file_system/file_system.dart
@@ -0,0 +1,204 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library file_system;
+
+import 'dart:async';
+
+import 'package:analyzer/src/generated/source.dart';
+import 'package:path/path.dart';
+import 'package:watcher/watcher.dart';
+
+/**
+ * [File]s are leaf [Resource]s which contain data.
+ */
+abstract class File extends Resource {
+  /**
+   * Watch for changes to this file
+   */
+  Stream<WatchEvent> get changes;
+
+  /**
+   * Return the last-modified stamp of the file.
+   * Throws [FileSystemException] if the file does not exist.
+   */
+  int get modificationStamp;
+
+  /**
+   * Create a new [Source] instance that serves this file.
+   */
+  Source createSource([Uri uri]);
+
+  /**
+   * Synchronously read the entire file contents as a [String].
+   * Throws [FileSystemException] if the file does not exist.
+   */
+  String readAsStringSync();
+}
+
+/**
+ * Base class for all file system exceptions.
+ */
+class FileSystemException implements Exception {
+  final String path;
+  final String message;
+
+  FileSystemException(this.path, this.message);
+
+  String toString() => 'FileSystemException(path=$path; message=$message)';
+}
+
+/**
+ * [Folder]s are [Resource]s which may contain files and/or other folders.
+ */
+abstract class Folder extends Resource {
+  /**
+   * Watch for changes to the files inside this folder (and in any nested
+   * folders, including folders reachable via links).
+   */
+  Stream<WatchEvent> get changes;
+
+  /**
+   * If the path [path] is a relative path, convert it to an absolute path
+   * by interpreting it relative to this folder.  If it is already an aboslute
+   * path, then don't change it.
+   *
+   * However, regardless of whether [path] is relative or absolute, normalize
+   * it by removing path components of the form '.' or '..'.
+   */
+  String canonicalizePath(String path);
+
+  /**
+   * Return `true` if absolute [path] references a resource in this folder.
+   */
+  bool contains(String path);
+
+  /**
+   * Return an existing child [Resource] with the given [relPath].
+   * Return a not existing [File] if no such child exist.
+   */
+  Resource getChild(String relPath);
+
+  /**
+   * Return a [Folder] representing a child [Resource] with the given
+   * [relPath].  This call does not check whether a folder with the given name
+   * exists on the filesystem--client must call the [Folder]'s `exists` getter
+   * to determine whether the folder actually exists.
+   */
+  Folder getChildAssumingFolder(String relPath);
+
+  /**
+   * Return a list of existing direct children [Resource]s (folders and files)
+   * in this folder, in no particular order.
+   */
+  List<Resource> getChildren();
+}
+
+/**
+ * The abstract class [Resource] is an abstraction of file or folder.
+ */
+abstract class Resource {
+  /**
+   * Return `true` if this resource exists.
+   */
+  bool get exists;
+
+  /**
+   * Return the [Folder] that contains this resource, or `null` if this resource
+   * is a root folder.
+   */
+  Folder get parent;
+
+  /**
+   * Return the full path to this resource.
+   */
+  String get path;
+
+  /**
+   * Return a short version of the name that can be displayed to the user to
+   * denote this resource.
+   */
+  String get shortName;
+
+  /**
+   * Return `true` if absolute [path] references this resource or a resource in
+   * this folder.
+   */
+  bool isOrContains(String path);
+}
+
+/**
+ * Instances of the class [ResourceProvider] convert [String] paths into
+ * [Resource]s.
+ */
+abstract class ResourceProvider {
+  /**
+   * Get the path context used by this resource provider.
+   */
+  Context get pathContext;
+
+  /**
+   * Return a [File] that corresponds to the given [path].
+   *
+   * A file may or may not exist at this location.
+   */
+  File getFile(String path);
+
+  /**
+   * Return a [Folder] that corresponds to the given [path].
+   *
+   * A folder may or may not exist at this location.
+   */
+  Folder getFolder(String path);
+
+  /**
+   * Return the [Resource] that corresponds to the given [path].
+   */
+  Resource getResource(String path);
+
+  /**
+   * Return the folder in which the plugin with the given [pluginId] can store
+   * state that will persist across sessions. The folder returned for a given id
+   * will not be returned for a different id, ensuring that plugins do not need
+   * to be concerned with file name collisions with other plugins, assuming that
+   * the plugin ids are unique. The plugin ids must be valid folder names.
+   */
+  Folder getStateLocation(String pluginId);
+}
+
+/**
+ * A [UriResolver] for [Resource]s.
+ */
+class ResourceUriResolver extends UriResolver {
+  /**
+   * The name of the `file` scheme.
+   */
+  static String _FILE_SCHEME = "file";
+
+  final ResourceProvider _provider;
+
+  ResourceUriResolver(this._provider);
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    if (!_isFileUri(uri)) {
+      return null;
+    }
+    Resource resource =
+        _provider.getResource(_provider.pathContext.fromUri(uri));
+    if (resource is File) {
+      return resource.createSource(actualUri != null ? actualUri : uri);
+    }
+    return null;
+  }
+
+  @override
+  Uri restoreAbsolute(Source source) =>
+      _provider.pathContext.toUri(source.fullName);
+
+  /**
+   * Return `true` if the given [uri] is a `file` URI.
+   */
+  static bool _isFileUri(Uri uri) => uri.scheme == _FILE_SCHEME;
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/file_system/memory_file_system.dart b/mojo/public/dart/third_party/analyzer/lib/file_system/memory_file_system.dart
new file mode 100644
index 0000000..1684fe9
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/file_system/memory_file_system.dart
@@ -0,0 +1,489 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library memory_file_system;
+
+import 'dart:async';
+import 'dart:collection';
+import 'dart:core' hide Resource;
+
+import 'package:analyzer/src/generated/engine.dart' show TimestampedData;
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:path/path.dart';
+import 'package:watcher/watcher.dart';
+
+import 'file_system.dart';
+
+/**
+ * An in-memory implementation of [ResourceProvider].
+ * Use `/` as a path separator.
+ */
+class MemoryResourceProvider implements ResourceProvider {
+  final Map<String, _MemoryResource> _pathToResource =
+      new HashMap<String, _MemoryResource>();
+  final Map<String, String> _pathToContent = new HashMap<String, String>();
+  final Map<String, int> _pathToTimestamp = new HashMap<String, int>();
+  final Map<String, List<StreamController<WatchEvent>>> _pathToWatchers =
+      new HashMap<String, List<StreamController<WatchEvent>>>();
+  int nextStamp = 0;
+
+  @override
+  Context get pathContext => posix;
+
+  /**
+   * Delete the file with the given path.
+   */
+  void deleteFile(String path) {
+    _checkFileAtPath(path);
+    _pathToResource.remove(path);
+    _pathToContent.remove(path);
+    _pathToTimestamp.remove(path);
+    _notifyWatchers(path, ChangeType.REMOVE);
+  }
+
+  /**
+   * Delete the folder with the given path
+   * and recurively delete nested files and folders.
+   */
+  void deleteFolder(String path) {
+    _checkFolderAtPath(path);
+    _MemoryFolder folder = _pathToResource[path];
+    for (Resource child in folder.getChildren()) {
+      if (child is File) {
+        deleteFile(child.path);
+      } else if (child is Folder) {
+        deleteFolder(child.path);
+      } else {
+        throw 'failed to delete resource: $child';
+      }
+    }
+    _pathToResource.remove(path);
+    _pathToContent.remove(path);
+    _pathToTimestamp.remove(path);
+    _notifyWatchers(path, ChangeType.REMOVE);
+  }
+
+  @override
+  File getFile(String path) => new _MemoryFile(this, path);
+
+  @override
+  Folder getFolder(String path) => newFolder(path);
+
+  @override
+  Resource getResource(String path) {
+    path = pathContext.normalize(path);
+    Resource resource = _pathToResource[path];
+    if (resource == null) {
+      resource = new _MemoryFile(this, path);
+    }
+    return resource;
+  }
+
+  @override
+  Folder getStateLocation(String pluginId) {
+    return newFolder('/user/home/$pluginId');
+  }
+
+  void modifyFile(String path, String content) {
+    _checkFileAtPath(path);
+    _pathToContent[path] = content;
+    _pathToTimestamp[path] = nextStamp++;
+    _notifyWatchers(path, ChangeType.MODIFY);
+  }
+
+  /**
+   * Create a resource representing a dummy link (that is, a File object which
+   * appears in its parent directory, but whose `exists` property is false)
+   */
+  File newDummyLink(String path) {
+    path = pathContext.normalize(path);
+    newFolder(pathContext.dirname(path));
+    _MemoryDummyLink link = new _MemoryDummyLink(this, path);
+    _pathToResource[path] = link;
+    _pathToTimestamp[path] = nextStamp++;
+    _notifyWatchers(path, ChangeType.ADD);
+    return link;
+  }
+
+  File newFile(String path, String content, [int stamp]) {
+    path = pathContext.normalize(path);
+    _MemoryResource folder = _pathToResource[pathContext.dirname(path)];
+    if (folder == null) {
+      newFolder(pathContext.dirname(path));
+    } else if (folder is! Folder) {
+      throw new ArgumentError('Cannot create file ($path) as child of file');
+    }
+    _MemoryFile file = new _MemoryFile(this, path);
+    _pathToResource[path] = file;
+    _pathToContent[path] = content;
+    _pathToTimestamp[path] = stamp != null ? stamp : nextStamp++;
+    _notifyWatchers(path, ChangeType.ADD);
+    return file;
+  }
+
+  Folder newFolder(String path) {
+    path = pathContext.normalize(path);
+    if (!path.startsWith(pathContext.separator)) {
+      throw new ArgumentError(
+          "Path must start with '${pathContext.separator}' : $path");
+    }
+    _MemoryResource resource = _pathToResource[path];
+    if (resource == null) {
+      String parentPath = pathContext.dirname(path);
+      if (parentPath != path) {
+        newFolder(parentPath);
+      }
+      _MemoryFolder folder = new _MemoryFolder(this, path);
+      _pathToResource[path] = folder;
+      _pathToTimestamp[path] = nextStamp++;
+      _notifyWatchers(path, ChangeType.ADD);
+      return folder;
+    } else if (resource is _MemoryFolder) {
+      _notifyWatchers(path, ChangeType.ADD);
+      return resource;
+    } else {
+      String message =
+          'Folder expected at ' "'$path'" 'but ${resource.runtimeType} found';
+      throw new ArgumentError(message);
+    }
+  }
+
+  File updateFile(String path, String content, [int stamp]) {
+    path = pathContext.normalize(path);
+    newFolder(pathContext.dirname(path));
+    _MemoryFile file = new _MemoryFile(this, path);
+    _pathToResource[path] = file;
+    _pathToContent[path] = content;
+    _pathToTimestamp[path] = stamp != null ? stamp : nextStamp++;
+    _notifyWatchers(path, ChangeType.MODIFY);
+    return file;
+  }
+
+  void _checkFileAtPath(String path) {
+    _MemoryResource resource = _pathToResource[path];
+    if (resource is! _MemoryFile) {
+      throw new ArgumentError(
+          'File expected at "$path" but ${resource.runtimeType} found');
+    }
+  }
+
+  void _checkFolderAtPath(String path) {
+    _MemoryResource resource = _pathToResource[path];
+    if (resource is! _MemoryFolder) {
+      throw new ArgumentError(
+          'Folder expected at "$path" but ${resource.runtimeType} found');
+    }
+  }
+
+  void _notifyWatchers(String path, ChangeType changeType) {
+    _pathToWatchers.forEach((String watcherPath,
+        List<StreamController<WatchEvent>> streamControllers) {
+      if (watcherPath == path || pathContext.isWithin(watcherPath, path)) {
+        for (StreamController<WatchEvent> streamController
+            in streamControllers) {
+          streamController.add(new WatchEvent(changeType, path));
+        }
+      }
+    });
+  }
+}
+
+/**
+ * An in-memory implementation of [File] which acts like a symbolic link to a
+ * non-existent file.
+ */
+class _MemoryDummyLink extends _MemoryResource implements File {
+  _MemoryDummyLink(MemoryResourceProvider provider, String path)
+      : super(provider, path);
+
+  @override
+  Stream<WatchEvent> get changes {
+    throw new FileSystemException(path, "File does not exist");
+  }
+
+  @override
+  bool get exists => false;
+
+  int get modificationStamp {
+    int stamp = _provider._pathToTimestamp[path];
+    if (stamp == null) {
+      throw new FileSystemException(path, "File does not exist");
+    }
+    return stamp;
+  }
+
+  String get _content {
+    throw new FileSystemException(path, 'File could not be read');
+  }
+
+  @override
+  Source createSource([Uri uri]) {
+    throw new FileSystemException(path, 'File could not be read');
+  }
+
+  @override
+  bool isOrContains(String path) {
+    return path == this.path;
+  }
+
+  @override
+  String readAsStringSync() {
+    throw new FileSystemException(path, 'File could not be read');
+  }
+}
+
+/**
+ * An in-memory implementation of [File].
+ */
+class _MemoryFile extends _MemoryResource implements File {
+  _MemoryFile(MemoryResourceProvider provider, String path)
+      : super(provider, path);
+
+  @override
+  bool get exists => _provider._pathToResource[path] is _MemoryFile;
+
+  int get modificationStamp {
+    int stamp = _provider._pathToTimestamp[path];
+    if (stamp == null) {
+      throw new FileSystemException(path, 'File "$path" does not exist.');
+    }
+    return stamp;
+  }
+
+  String get _content {
+    String content = _provider._pathToContent[path];
+    if (content == null) {
+      throw new FileSystemException(path, 'File "$path" does not exist.');
+    }
+    return content;
+  }
+
+  @override
+  Source createSource([Uri uri]) {
+    if (uri == null) {
+      uri = _provider.pathContext.toUri(path);
+    }
+    return new _MemoryFileSource(this, uri);
+  }
+
+  @override
+  bool isOrContains(String path) {
+    return path == this.path;
+  }
+
+  @override
+  String readAsStringSync() {
+    String content = _provider._pathToContent[path];
+    if (content == null) {
+      throw new FileSystemException(path, 'File "$path" does not exist.');
+    }
+    return content;
+  }
+}
+
+/**
+ * An in-memory implementation of [Source].
+ */
+class _MemoryFileSource extends Source {
+  /**
+   * Map from encoded URI/filepath pair to a unique integer identifier.  This
+   * identifier is used for equality tests and hash codes.
+   *
+   * The URI and filepath are joined into a pair by separating them with an '@'
+   * character.
+   */
+  static final Map<String, int> _idTable = new HashMap<String, int>();
+
+  final _MemoryFile file;
+
+  final Uri uri;
+
+  /**
+   * The unique ID associated with this [_MemoryFileSource].
+   */
+  final int id;
+
+  _MemoryFileSource(_MemoryFile file, Uri uri)
+      : uri = uri,
+        file = file,
+        id = _idTable.putIfAbsent('$uri@${file.path}', () => _idTable.length);
+
+  @override
+  TimestampedData<String> get contents {
+    return new TimestampedData<String>(modificationStamp, file._content);
+  }
+
+  @override
+  String get encoding {
+    return uri.toString();
+  }
+
+  @override
+  String get fullName => file.path;
+
+  @override
+  int get hashCode => id;
+
+  @override
+  bool get isInSystemLibrary => uriKind == UriKind.DART_URI;
+
+  @override
+  int get modificationStamp {
+    try {
+      return file.modificationStamp;
+    } on FileSystemException {
+      return -1;
+    }
+  }
+
+  @override
+  String get shortName => file.shortName;
+
+  @override
+  UriKind get uriKind {
+    String scheme = uri.scheme;
+    if (scheme == PackageUriResolver.PACKAGE_SCHEME) {
+      return UriKind.PACKAGE_URI;
+    } else if (scheme == DartUriResolver.DART_SCHEME) {
+      return UriKind.DART_URI;
+    } else if (scheme == FileUriResolver.FILE_SCHEME) {
+      return UriKind.FILE_URI;
+    }
+    return UriKind.FILE_URI;
+  }
+
+  @override
+  bool operator ==(other) {
+    return other is _MemoryFileSource && other.id == id;
+  }
+
+  @override
+  bool exists() => file.exists;
+
+  @override
+  Uri resolveRelativeUri(Uri relativeUri) {
+    return uri.resolveUri(relativeUri);
+  }
+
+  @override
+  String toString() => file.toString();
+}
+
+/**
+ * An in-memory implementation of [Folder].
+ */
+class _MemoryFolder extends _MemoryResource implements Folder {
+  _MemoryFolder(MemoryResourceProvider provider, String path)
+      : super(provider, path);
+
+  @override
+  bool get exists => _provider._pathToResource[path] is _MemoryFolder;
+
+  @override
+  String canonicalizePath(String relPath) {
+    relPath = _provider.pathContext.normalize(relPath);
+    String childPath = _provider.pathContext.join(path, relPath);
+    childPath = _provider.pathContext.normalize(childPath);
+    return childPath;
+  }
+
+  @override
+  bool contains(String path) {
+    return _provider.pathContext.isWithin(this.path, path);
+  }
+
+  @override
+  Resource getChild(String relPath) {
+    String childPath = canonicalizePath(relPath);
+    _MemoryResource resource = _provider._pathToResource[childPath];
+    if (resource == null) {
+      resource = new _MemoryFile(_provider, childPath);
+    }
+    return resource;
+  }
+
+  @override
+  _MemoryFolder getChildAssumingFolder(String relPath) {
+    String childPath = canonicalizePath(relPath);
+    _MemoryResource resource = _provider._pathToResource[childPath];
+    if (resource is _MemoryFolder) {
+      return resource;
+    }
+    return new _MemoryFolder(_provider, childPath);
+  }
+
+  @override
+  List<Resource> getChildren() {
+    if (!exists) {
+      throw new FileSystemException(path, 'Folder does not exist.');
+    }
+    List<Resource> children = <Resource>[];
+    _provider._pathToResource.forEach((resourcePath, resource) {
+      if (_provider.pathContext.dirname(resourcePath) == path) {
+        children.add(resource);
+      }
+    });
+    return children;
+  }
+
+  @override
+  bool isOrContains(String path) {
+    if (path == this.path) {
+      return true;
+    }
+    return contains(path);
+  }
+}
+
+/**
+ * An in-memory implementation of [Resource].
+ */
+abstract class _MemoryResource implements Resource {
+  final MemoryResourceProvider _provider;
+  final String path;
+
+  _MemoryResource(this._provider, this.path);
+
+  Stream<WatchEvent> get changes {
+    StreamController<WatchEvent> streamController =
+        new StreamController<WatchEvent>();
+    if (!_provider._pathToWatchers.containsKey(path)) {
+      _provider._pathToWatchers[path] = <StreamController<WatchEvent>>[];
+    }
+    _provider._pathToWatchers[path].add(streamController);
+    streamController.done.then((_) {
+      _provider._pathToWatchers[path].remove(streamController);
+      if (_provider._pathToWatchers[path].isEmpty) {
+        _provider._pathToWatchers.remove(path);
+      }
+    });
+    return streamController.stream;
+  }
+
+  @override
+  get hashCode => path.hashCode;
+
+  @override
+  Folder get parent {
+    String parentPath = _provider.pathContext.dirname(path);
+    if (parentPath == path) {
+      return null;
+    }
+    return _provider.getResource(parentPath);
+  }
+
+  @override
+  String get shortName => _provider.pathContext.basename(path);
+
+  @override
+  bool operator ==(other) {
+    if (runtimeType != other.runtimeType) {
+      return false;
+    }
+    return path == other.path;
+  }
+
+  @override
+  String toString() => path;
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/file_system/physical_file_system.dart b/mojo/public/dart/third_party/analyzer/lib/file_system/physical_file_system.dart
new file mode 100644
index 0000000..b8fdcf1
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/file_system/physical_file_system.dart
@@ -0,0 +1,222 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library physical_file_system;
+
+import 'dart:async';
+import 'dart:core' hide Resource;
+import 'dart:io' as io;
+
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:path/path.dart';
+import 'package:watcher/watcher.dart';
+
+import 'file_system.dart';
+
+/**
+ * A `dart:io` based implementation of [ResourceProvider].
+ */
+class PhysicalResourceProvider implements ResourceProvider {
+  static final NORMALIZE_EOL_ALWAYS =
+      (String string) => string.replaceAll(new RegExp('\r\n?'), '\n');
+
+  static final PhysicalResourceProvider INSTANCE =
+      new PhysicalResourceProvider(null);
+
+  /**
+   * The name of the directory containing plugin specific subfolders used to
+   * store data across sessions.
+   */
+  static final String SERVER_DIR = ".dartServer";
+
+  PhysicalResourceProvider(String fileReadMode(String s)) {
+    if (fileReadMode != null) {
+      FileBasedSource.fileReadMode = fileReadMode;
+    }
+  }
+
+  @override
+  Context get pathContext => io.Platform.isWindows ? windows : posix;
+
+  @override
+  File getFile(String path) => new _PhysicalFile(new io.File(path));
+
+  @override
+  Folder getFolder(String path) => new _PhysicalFolder(new io.Directory(path));
+
+  @override
+  Resource getResource(String path) {
+    if (io.FileSystemEntity.isDirectorySync(path)) {
+      return getFolder(path);
+    } else {
+      return getFile(path);
+    }
+  }
+
+  @override
+  Folder getStateLocation(String pluginId) {
+    String home;
+    if (io.Platform.isWindows) {
+      home = io.Platform.environment['LOCALAPPDATA'];
+    } else {
+      home = io.Platform.environment['HOME'];
+    }
+    if (home != null && io.FileSystemEntity.isDirectorySync(home)) {
+      io.Directory directory =
+          new io.Directory(join(home, SERVER_DIR, pluginId));
+      directory.createSync(recursive: true);
+      return new _PhysicalFolder(directory);
+    }
+    return null;
+  }
+}
+
+/**
+ * A `dart:io` based implementation of [File].
+ */
+class _PhysicalFile extends _PhysicalResource implements File {
+  _PhysicalFile(io.File file) : super(file);
+
+  @override
+  Stream<WatchEvent> get changes => new FileWatcher(_entry.path).events;
+
+  @override
+  int get modificationStamp {
+    try {
+      io.File file = _entry as io.File;
+      return file.lastModifiedSync().millisecondsSinceEpoch;
+    } on io.FileSystemException catch (exception) {
+      throw new FileSystemException(exception.path, exception.message);
+    }
+  }
+
+  @override
+  Source createSource([Uri uri]) {
+    io.File file = _entry as io.File;
+    JavaFile javaFile = new JavaFile(file.absolute.path);
+    if (uri == null) {
+      uri = javaFile.toURI();
+    }
+    return new FileBasedSource(javaFile, uri);
+  }
+
+  @override
+  bool isOrContains(String path) {
+    return path == this.path;
+  }
+
+  @override
+  String readAsStringSync() {
+    try {
+      io.File file = _entry as io.File;
+      return file.readAsStringSync();
+    } on io.FileSystemException catch (exception) {
+      throw new FileSystemException(exception.path, exception.message);
+    }
+  }
+}
+
+/**
+ * A `dart:io` based implementation of [Folder].
+ */
+class _PhysicalFolder extends _PhysicalResource implements Folder {
+  _PhysicalFolder(io.Directory directory) : super(directory);
+
+  @override
+  Stream<WatchEvent> get changes => new DirectoryWatcher(_entry.path).events;
+
+  @override
+  String canonicalizePath(String relPath) {
+    return normalize(join(_entry.absolute.path, relPath));
+  }
+
+  @override
+  bool contains(String path) {
+    return isWithin(this.path, path);
+  }
+
+  @override
+  Resource getChild(String relPath) {
+    String canonicalPath = canonicalizePath(relPath);
+    return PhysicalResourceProvider.INSTANCE.getResource(canonicalPath);
+  }
+
+  @override
+  _PhysicalFolder getChildAssumingFolder(String relPath) {
+    String canonicalPath = canonicalizePath(relPath);
+    io.Directory directory = new io.Directory(canonicalPath);
+    return new _PhysicalFolder(directory);
+  }
+
+  @override
+  List<Resource> getChildren() {
+    try {
+      List<Resource> children = <Resource>[];
+      io.Directory directory = _entry as io.Directory;
+      List<io.FileSystemEntity> entries = directory.listSync(recursive: false);
+      int numEntries = entries.length;
+      for (int i = 0; i < numEntries; i++) {
+        io.FileSystemEntity entity = entries[i];
+        if (entity is io.Directory) {
+          children.add(new _PhysicalFolder(entity));
+        } else if (entity is io.File) {
+          children.add(new _PhysicalFile(entity));
+        }
+      }
+      return children;
+    } on io.FileSystemException catch (exception) {
+      throw new FileSystemException(exception.path, exception.message);
+    }
+  }
+
+  @override
+  bool isOrContains(String path) {
+    if (path == this.path) {
+      return true;
+    }
+    return contains(path);
+  }
+}
+
+/**
+ * A `dart:io` based implementation of [Resource].
+ */
+abstract class _PhysicalResource implements Resource {
+  final io.FileSystemEntity _entry;
+
+  _PhysicalResource(this._entry);
+
+  @override
+  bool get exists => _entry.existsSync();
+
+  @override
+  get hashCode => path.hashCode;
+
+  @override
+  Folder get parent {
+    String parentPath = dirname(path);
+    if (parentPath == path) {
+      return null;
+    }
+    return new _PhysicalFolder(new io.Directory(parentPath));
+  }
+
+  @override
+  String get path => _entry.absolute.path;
+
+  @override
+  String get shortName => basename(path);
+
+  @override
+  bool operator ==(other) {
+    if (runtimeType != other.runtimeType) {
+      return false;
+    }
+    return path == other.path;
+  }
+
+  @override
+  String toString() => path;
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/instrumentation/file_instrumentation.dart b/mojo/public/dart/third_party/analyzer/lib/instrumentation/file_instrumentation.dart
new file mode 100644
index 0000000..ba23b68
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/instrumentation/file_instrumentation.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library file_instrumentation;
+
+import 'dart:io';
+
+import 'package:analyzer/instrumentation/instrumentation.dart';
+
+/**
+ * An [InstrumentationServer] that writes to a file.
+ */
+class FileInstrumentationServer implements InstrumentationServer {
+  IOSink _sink;
+
+  FileInstrumentationServer(String path) {
+    File file = new File(path);
+    _sink = file.openWrite();
+  }
+
+  @override
+  void log(String message) {
+    _sink.writeln(message);
+  }
+
+  @override
+  void logWithPriority(String message) {
+    log(message);
+  }
+
+  @override
+  void shutdown() {
+    _sink.close();
+    _sink = null;
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/instrumentation/instrumentation.dart b/mojo/public/dart/third_party/analyzer/lib/instrumentation/instrumentation.dart
new file mode 100644
index 0000000..40db35e
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/instrumentation/instrumentation.dart
@@ -0,0 +1,374 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library instrumentation;
+
+import 'dart:convert';
+
+import 'package:analyzer/task/model.dart';
+
+/**
+ * A container with analysis performance constants.
+ */
+class AnalysisPerformanceKind {
+  static const String FULL = 'analysis_full';
+  static const String INCREMENTAL = 'analysis_incremental';
+}
+
+/**
+ * The interface used by client code to communicate with an instrumentation
+ * server.
+ */
+abstract class InstrumentationServer {
+  /**
+   * Pass the given [message] to the instrumentation server so that it will be
+   * logged with other messages.
+   *
+   * This method should be used for most logging.
+   */
+  void log(String message);
+
+  /**
+   * Pass the given [message] to the instrumentation server so that it will be
+   * logged with other messages.
+   *
+   * This method should only be used for logging high priority messages, such as
+   * exceptions that cause the server to shutdown.
+   */
+  void logWithPriority(String message);
+
+  /**
+   * Signal that the client is done communicating with the instrumentation
+   * server. This method should be invoked exactly one time and no other methods
+   * should be invoked on this instance after this method has been invoked.
+   */
+  void shutdown();
+}
+
+/**
+ * The interface used by client code to communicate with an instrumentation
+ * server by wrapping an [InstrumentationServer].
+ */
+class InstrumentationService {
+  /**
+   * An instrumentation service that will not log any instrumentation data.
+   */
+  static final InstrumentationService NULL_SERVICE =
+      new InstrumentationService(null);
+
+  static const String TAG_ANALYSIS_TASK = 'Task';
+  static const String TAG_ERROR = 'Err';
+  static const String TAG_EXCEPTION = 'Ex';
+  static const String TAG_FILE_READ = 'Read';
+  static const String TAG_LOG_ENTRY = 'Log';
+  static const String TAG_NOTIFICATION = 'Noti';
+  static const String TAG_PERFORMANCE = 'Perf';
+  static const String TAG_REQUEST = 'Req';
+  static const String TAG_RESPONSE = 'Res';
+  static const String TAG_SUBPROCESS_START = 'SPStart';
+  static const String TAG_SUBPROCESS_RESULT = 'SPResult';
+  static const String TAG_VERSION = 'Ver';
+  static const String TAG_WATCH_EVENT = 'Watch';
+
+  /**
+   * The instrumentation server used to communicate with the server, or `null`
+   * if instrumentation data should not be logged.
+   */
+  InstrumentationServer _instrumentationServer;
+
+  /**
+   * Counter used to generate unique ID's for [logSubprocessStart].
+   */
+  int _subprocessCounter = 0;
+
+  /**
+   * Initialize a newly created instrumentation service to comunicate with the
+   * given [instrumentationServer].
+   */
+  InstrumentationService(this._instrumentationServer);
+
+  /**
+   * Return `true` if this [InstrumentationService] was initialized with a
+   * non-`null` server (and hence instrumentation is active).
+   */
+  bool get isActive => _instrumentationServer != null;
+
+  /**
+   * The current time, expressed as a decimal encoded number of milliseconds.
+   */
+  String get _timestamp => new DateTime.now().millisecondsSinceEpoch.toString();
+
+  /**
+   * Log that the given analysis [task] is being performed in the given
+   * [context].
+   */
+  void logAnalysisTask(String context, dynamic task) {
+    // TODO(brianwilkerson) When the old task model is removed, change the
+    // parameter type to AnalysisTask.
+    if (_instrumentationServer != null) {
+      String description =
+          (task is AnalysisTask) ? task.description : task.toString();
+      _instrumentationServer
+          .log(_join([TAG_ANALYSIS_TASK, context, description]));
+    }
+  }
+
+  /**
+   * Log the fact that an error, described by the given [message], has occurred.
+   */
+  void logError(String message) {
+    _log(TAG_ERROR, message);
+  }
+
+  /**
+   * Log that the given non-priority [exception] was thrown, with the given
+   * [stackTrace].
+   */
+  void logException(dynamic exception, StackTrace stackTrace) {
+    if (_instrumentationServer != null) {
+      String message = _toString(exception);
+      String trace = _toString(stackTrace);
+      _instrumentationServer.log(_join([TAG_EXCEPTION, message, trace]));
+    }
+  }
+
+  /**
+   * Log that the contents of the file with the given [path] were read. The file
+   * had the given [content] and [modificationTime].
+   */
+  void logFileRead(String path, int modificationTime, String content) {
+    if (_instrumentationServer != null) {
+      String timeStamp = _toString(modificationTime);
+      _instrumentationServer
+          .log(_join([TAG_FILE_READ, path, timeStamp, content]));
+    }
+  }
+
+  /**
+   * Log that a log entry that was written to the analysis engine's log. The log
+   * entry has the given [level] and [message], and was created at the given
+   * [time].
+   */
+  void logLogEntry(String level, DateTime time, String message, Object exception, StackTrace stackTrace) {
+    if (_instrumentationServer != null) {
+      String timeStamp =
+          time == null ? 'null' : time.millisecondsSinceEpoch.toString();
+      String exceptionText = exception.toString();
+      String stackTraceText = stackTrace.toString();
+      _instrumentationServer
+          .log(_join([TAG_LOG_ENTRY, level, timeStamp, message, exceptionText, stackTraceText]));
+    }
+  }
+
+  /**
+   * Log that a notification has been sent to the client.
+   */
+  void logNotification(String notification) {
+    _log(TAG_NOTIFICATION, notification);
+  }
+
+  /**
+   * Log the given performance fact.
+   */
+  void logPerformance(String kind, Stopwatch sw, String message) {
+    sw.stop();
+    String elapsed = sw.elapsedMilliseconds.toString();
+    if (_instrumentationServer != null) {
+      _instrumentationServer
+          .log(_join([TAG_PERFORMANCE, kind, elapsed, message]));
+    }
+  }
+
+  /**
+   * Log that the given priority [exception] was thrown, with the given
+   * [stackTrace].
+   */
+  void logPriorityException(dynamic exception, StackTrace stackTrace) {
+    if (_instrumentationServer != null) {
+      String message = _toString(exception);
+      String trace = _toString(stackTrace);
+      _instrumentationServer
+          .logWithPriority(_join([TAG_EXCEPTION, message, trace]));
+    }
+  }
+
+  /**
+   * Log that a request has been sent to the client.
+   */
+  void logRequest(String request) {
+    _log(TAG_REQUEST, request);
+  }
+
+  /**
+   * Log that a response has been sent to the client.
+   */
+  void logResponse(String response) {
+    _log(TAG_RESPONSE, response);
+  }
+
+  /**
+   * Log the result of executing a subprocess.  [subprocessId] should be the
+   * unique IDreturned by [logSubprocessStart].
+   */
+  void logSubprocessResult(
+      int subprocessId, int exitCode, String stdout, String stderr) {
+    if (_instrumentationServer != null) {
+      _instrumentationServer.log(_join([
+        TAG_SUBPROCESS_RESULT,
+        subprocessId.toString(),
+        exitCode.toString(),
+        JSON.encode(stdout),
+        JSON.encode(stderr)
+      ]));
+    }
+  }
+
+  /**
+   * Log that the given subprocess is about to be executed.  Returns a unique
+   * identifier that can be used to identify the subprocess for later log
+   * entries.
+   */
+  int logSubprocessStart(
+      String executablePath, List<String> arguments, String workingDirectory) {
+    int subprocessId = _subprocessCounter++;
+    if (_instrumentationServer != null) {
+      _instrumentationServer.log(_join([
+        TAG_SUBPROCESS_START,
+        subprocessId.toString(),
+        executablePath,
+        workingDirectory,
+        JSON.encode(arguments)
+      ]));
+    }
+    return subprocessId;
+  }
+
+  /**
+   * Signal that the client has started analysis server.
+   * This method should be invoked exactly one time.
+   */
+  void logVersion(String uuid, String clientId, String clientVersion,
+      String serverVersion, String sdkVersion) {
+    String normalize(String value) =>
+        value != null && value.length > 0 ? value : 'unknown';
+
+    if (_instrumentationServer != null) {
+      _instrumentationServer.logWithPriority(_join([
+        TAG_VERSION,
+        uuid,
+        normalize(clientId),
+        normalize(clientVersion),
+        serverVersion,
+        sdkVersion
+      ]));
+    }
+  }
+
+  /**
+   * Log that the file system watcher sent an event. The [folderPath] is the
+   * path to the folder containing the changed file, the [filePath] is the path
+   * of the file that changed, and the [changeType] indicates what kind of
+   * change occurred.
+   */
+  void logWatchEvent(String folderPath, String filePath, String changeType) {
+    if (_instrumentationServer != null) {
+      _instrumentationServer
+          .log(_join([TAG_WATCH_EVENT, folderPath, filePath, changeType]));
+    }
+  }
+
+  /**
+   * Signal that the client is done communicating with the instrumentation
+   * server. This method should be invoked exactly one time and no other methods
+   * should be invoked on this instance after this method has been invoked.
+   */
+  void shutdown() {
+    if (_instrumentationServer != null) {
+      _instrumentationServer.shutdown();
+      _instrumentationServer = null;
+    }
+  }
+
+  /**
+   * Write an escaped version of the given [field] to the given [buffer].
+   */
+  void _escape(StringBuffer buffer, String field) {
+    int index = field.indexOf(':');
+    if (index < 0) {
+      buffer.write(field);
+      return;
+    }
+    int start = 0;
+    while (index >= 0) {
+      buffer.write(field.substring(start, index));
+      buffer.write('::');
+      start = index + 1;
+      index = field.indexOf(':', start);
+    }
+    buffer.write(field.substring(start));
+  }
+
+  /**
+   * Return the result of joining the values of the given fields, escaping the
+   * separator character by doubling it.
+   */
+  String _join(List<String> fields) {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write(_timestamp);
+    for (String field in fields) {
+      buffer.write(':');
+      _escape(buffer, field);
+    }
+    return buffer.toString();
+  }
+
+  /**
+   * Log the given message with the given tag.
+   */
+  void _log(String tag, String message) {
+    if (_instrumentationServer != null) {
+      _instrumentationServer.log(_join([tag, message]));
+    }
+  }
+
+  /**
+   * Convert the given [object] to a string.
+   */
+  String _toString(Object object) {
+    if (object == null) {
+      return 'null';
+    }
+    return object.toString();
+  }
+}
+
+/**
+ * An [InstrumentationServer] that sends messages to multiple instances.
+ */
+class MulticastInstrumentationServer implements InstrumentationServer {
+  final List<InstrumentationServer> _servers;
+
+  MulticastInstrumentationServer(this._servers);
+
+  @override
+  void log(String message) {
+    for (InstrumentationServer server in _servers) {
+      server.log(message);
+    }
+  }
+
+  @override
+  void logWithPriority(String message) {
+    for (InstrumentationServer server in _servers) {
+      server.logWithPriority(message);
+    }
+  }
+
+  @override
+  void shutdown() {
+    for (InstrumentationServer server in _servers) {
+      server.shutdown();
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/plugin/command_line.dart b/mojo/public/dart/third_party/analyzer/lib/plugin/command_line.dart
new file mode 100644
index 0000000..7a6fbd8
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/plugin/command_line.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Support for client code that extends command-line tools that use the analysis
+ * engine by adding new command-line arguments.
+ */
+library analyzer.plugin.command_line;
+
+import 'package:analyzer/src/plugin/command_line_plugin.dart';
+import 'package:args/args.dart';
+import 'package:plugin/plugin.dart';
+
+/**
+ * The identifier of the extension point that allows plugins to add new flags
+ * and options to the command-line parser before the parser is used to parse
+ * the command-line. The object used as an extension must be an
+ * [ArgParserContributor].
+ */
+final String PARSER_CONTRIBUTOR_EXTENSION_POINT_ID = Plugin.join(
+    CommandLinePlugin.UNIQUE_IDENTIFIER,
+    CommandLinePlugin.PARSER_CONTRIBUTOR_EXTENSION_POINT);
+
+/**
+ * The identifier of the extension point that allows plugins to access the
+ * result of parsing the command-line. The object used as an extension must be
+ * an [ArgResultsProcessor].
+ */
+final String RESULT_PROCESSOR_EXTENSION_POINT_ID = Plugin.join(
+    CommandLinePlugin.UNIQUE_IDENTIFIER,
+    CommandLinePlugin.RESULT_PROCESSOR_EXTENSION_POINT);
+
+/**
+ * A function that will contribute flags and options to the command-line parser.
+ */
+typedef void ArgParserContributor(ArgParser parser);
+
+/**
+ * A function that will process the results of parsing the command-line.
+ */
+typedef void ArgResultsProcessor(ArgResults results);
diff --git a/mojo/public/dart/third_party/analyzer/lib/plugin/options.dart b/mojo/public/dart/third_party/analyzer/lib/plugin/options.dart
new file mode 100644
index 0000000..cc0b88d
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/plugin/options.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Support for client code that wants to consume options contributed to the
+/// analysis options file.
+library analyzer.plugin.options;
+
+import 'package:analyzer/src/plugin/options_plugin.dart';
+import 'package:plugin/plugin.dart';
+import 'package:yaml/yaml.dart';
+
+/// The identifier of the extension point that allows plugins to access
+/// options defined in the analysis options file. The object used as an
+/// extension must be an [OptionsProcessor].
+final String OPTIONS_PROCESSOR_EXTENSION_POINT_ID = Plugin.join(
+    OptionsPlugin.UNIQUE_IDENTIFIER,
+    OptionsPlugin.OPTIONS_PROCESSOR_EXTENSION_POINT);
+
+/// Processes options defined in the analysis options file.
+/// 
+/// The options file format is intentionally very open-ended, giving clients
+/// utmost flexibility in defining their own options.  The only hardfast
+/// expectation is that options files will contain a mapping from Strings
+/// (identifying 'scopes') to associated options.  For example, the given
+/// content
+///
+///     linter:
+///       rules:
+///         camel_case_types: true
+///     compiler:
+///       resolver:
+///         useMultiPackage: true
+///       packagePaths:
+///         - /foo/bar/pkg
+///         - /bar/baz/pkg
+///
+/// defines two scopes, `linter` and `compiler`.  Parsing would result in a
+/// map, mapping the `linter` and `compiler` scope identifiers to their
+/// respective parsed option node contents. Extracting values is a simple
+/// matter of inspecting the parsed nodes.  For example, testing whether the
+/// compiler's resolver is set to use the `useMultiPackage` option might look
+/// something like this (eliding error-checking):
+///
+///     bool useMultiPackage =
+///         options['compiler']['resolver']['useMultiPackage'];
+abstract class OptionsProcessor {
+
+  /// Called when an error occurs in processing options.
+  void onError(Exception exception);
+
+  /// Called when the options file is processed.
+  ///
+  /// The options file is processed on analyzer initialization and
+  /// subsequently when the file is changed on disk.  In the event of a
+  /// change notification, note that the notification simply indicates
+  /// a change on disk. Content in specific option scopes may or may not
+  /// be different. It is up to the implementer to check whether specific
+  /// options have changed and to handle those changes appropriately.
+  void optionsProcessed(Map<String, YamlNode> options);
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/plugin/task.dart b/mojo/public/dart/third_party/analyzer/lib/plugin/task.dart
new file mode 100644
index 0000000..72c33fa
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/plugin/task.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Support for client code that extends the analysis engine by adding new
+ * analysis tasks.
+ */
+library analyzer.plugin.task;
+
+import 'package:analyzer/src/generated/engine.dart' hide WorkManager;
+import 'package:analyzer/src/plugin/engine_plugin.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:plugin/plugin.dart';
+
+/**
+ * The identifier of the extension point that allows plugins to register new
+ * analysis tasks with the analysis engine. The object used as an extension must
+ * be a [TaskDescriptor].
+ */
+final String TASK_EXTENSION_POINT_ID = Plugin.join(
+    EnginePlugin.UNIQUE_IDENTIFIER, EnginePlugin.TASK_EXTENSION_POINT);
+
+/**
+ * The identifier of the extension point that allows plugins to register new
+ * work managers with the analysis engine. The object used as an extension must
+ * be a [WorkManagerFactory].
+ */
+final String WORK_MANAGER_EXTENSION_POINT_ID = Plugin.join(
+    EnginePlugin.UNIQUE_IDENTIFIER,
+    EnginePlugin.WORK_MANAGER_FACTORY_EXTENSION_POINT);
+
+/**
+ * A function that will create a new [WorkManager] for the given [context].
+ */
+typedef WorkManager WorkManagerFactory(InternalAnalysisContext context);
diff --git a/mojo/public/dart/third_party/analyzer/lib/source/analysis_options_provider.dart b/mojo/public/dart/third_party/analyzer/lib/source/analysis_options_provider.dart
new file mode 100644
index 0000000..a3ac86b
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/source/analysis_options_provider.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library source.analysis_options_provider;
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:yaml/yaml.dart';
+
+/// Provide the options found in the `.analysis_options` file.
+class AnalysisOptionsProvider {
+  /// The name of the analysis options source file.
+  static const String ANALYSIS_OPTIONS_NAME = '.analysis_options';
+
+  /// Provide the options found in [root]/[ANALYSIS_OPTIONS_NAME].
+  /// Return an empty options map if the file does not exist.
+  Map<String, YamlNode> getOptions(Folder root) {
+    var optionsSource =
+        _readAnalysisOptionsFile(root.getChild(ANALYSIS_OPTIONS_NAME));
+    return getOptionsFromString(optionsSource);
+  }
+
+  /// Provide the options found in [file].
+  /// Return an empty options map if the file does not exist.
+  Map<String, YamlNode> getOptionsFromFile(File file) {
+    var optionsSource = _readAnalysisOptionsFile(file);
+    return getOptionsFromString(optionsSource);
+  }
+
+  /// Provide the options found in [optionsSource].
+  /// Return an empty options map if the source is null.
+  Map<String, YamlNode> getOptionsFromString(String optionsSource) {
+    var options = <String, YamlNode>{};
+    if (optionsSource == null) {
+      return options;
+    }
+    var doc = loadYaml(optionsSource);
+    if (doc is! YamlMap) {
+      throw new Exception(
+          'Bad options file format (expected map, got ${doc.runtimeType})');
+    }
+    if (doc is YamlMap) {
+      doc.forEach((k, v) {
+        if (k is! String) {
+          throw new Exception(
+              'Bad options file format (expected String scope key, '
+              'got ${k.runtimeType})');
+        }
+        options[k] = v;
+      });
+    }
+    return options;
+  }
+
+  /// Read the contents of [file] as a string.
+  /// Returns null if file does not exist.
+  String _readAnalysisOptionsFile(File file) {
+    try {
+      return file.readAsStringSync();
+    } on FileSystemException {
+      // File can't be read.
+      return null;
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/source/package_map_provider.dart b/mojo/public/dart/third_party/analyzer/lib/source/package_map_provider.dart
new file mode 100644
index 0000000..85b493d
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/source/package_map_provider.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library source.package_map_provider;
+
+import 'package:analyzer/file_system/file_system.dart';
+
+/**
+ * Data structure output by PackageMapProvider.  This contains both the package
+ * map and dependency information.
+ */
+class PackageMapInfo {
+  /**
+   * The package map itself.  This is a map from package name to a list of
+   * the folders containing source code for the package.
+   *
+   * `null` if an error occurred.
+   */
+  Map<String, List<Folder>> packageMap;
+
+  /**
+   * Dependency information.  This is a set of the paths which were consulted
+   * in order to generate the package map.  If any of these files is
+   * modified, the package map will need to be regenerated.
+   */
+  Set<String> dependencies;
+
+  PackageMapInfo(this.packageMap, this.dependencies);
+}
+
+/**
+ * A PackageMapProvider is an entity capable of determining the mapping from
+ * package name to source directory for a given folder.
+ */
+abstract class PackageMapProvider {
+  /**
+   * Compute a package map for the given folder, if possible.
+   *
+   * If a package map can't be computed (e.g. because an error occurred), a
+   * [PackageMapInfo] will still be returned, but its packageMap will be null.
+   */
+  PackageMapInfo computePackageMap(Folder folder);
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/source/package_map_resolver.dart b/mojo/public/dart/third_party/analyzer/lib/source/package_map_resolver.dart
new file mode 100644
index 0000000..0fa12ae
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/source/package_map_resolver.dart
@@ -0,0 +1,137 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library source.package_map_resolver;
+
+import 'dart:core' hide Resource;
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/util/asserts.dart' as asserts;
+import 'package:path/path.dart' as pathos;
+
+/**
+ * A [UriResolver] implementation for the `package:` scheme that uses a map of
+ * package names to their directories.
+ */
+class PackageMapUriResolver extends UriResolver {
+  /**
+   * The name of the `package` scheme.
+   */
+  static const String PACKAGE_SCHEME = "package";
+
+  /**
+   * A table mapping package names to the path of the directories containing
+   * the package.
+   */
+  final Map<String, List<Folder>> packageMap;
+
+  /**
+   * The [ResourceProvider] for this resolver.
+   */
+  final ResourceProvider resourceProvider;
+
+  /**
+   * Create a new [PackageMapUriResolver].
+   *
+   * [packageMap] is a table mapping package names to the paths of the
+   * directories containing the package
+   */
+  PackageMapUriResolver(this.resourceProvider, this.packageMap) {
+    asserts.notNull(resourceProvider);
+    asserts.notNull(packageMap);
+  }
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    if (!isPackageUri(uri)) {
+      return null;
+    }
+    // Prepare path.
+    String path = uri.path;
+    // Prepare path components.
+    int index = path.indexOf('/');
+    if (index == -1 || index == 0) {
+      return null;
+    }
+    // <pkgName>/<relPath>
+    String pkgName = path.substring(0, index);
+    String relPath = path.substring(index + 1);
+    // Try to find an existing file.
+    List<Folder> packageDirs = packageMap[pkgName];
+    if (packageDirs != null) {
+      for (Folder packageDir in packageDirs) {
+        if (packageDir.exists) {
+          Resource result = packageDir.getChild(relPath);
+          if (result is File && result.exists) {
+            return result.createSource(uri);
+          }
+        }
+      }
+    }
+    // Return a NonExistingSource instance.
+    // This helps provide more meaningful error messages to users
+    // (a missing file error, as opposed to an invalid URI error).
+    String fullPath = packageDirs != null && packageDirs.isNotEmpty
+        ? packageDirs.first.canonicalizePath(relPath)
+        : relPath;
+    return new NonExistingSource(fullPath, uri, UriKind.PACKAGE_URI);
+  }
+
+  @override
+  Uri restoreAbsolute(Source source) {
+    String sourcePath = source.fullName;
+    Uri bestMatch;
+    int bestMatchLength = -1;
+    pathos.Context pathContext = resourceProvider.pathContext;
+    for (String pkgName in packageMap.keys) {
+      List<Folder> pkgFolders = packageMap[pkgName];
+      for (int i = 0; i < pkgFolders.length; i++) {
+        Folder pkgFolder = pkgFolders[i];
+        String pkgFolderPath = pkgFolder.path;
+        if (pkgFolderPath.length > bestMatchLength &&
+            sourcePath.startsWith(pkgFolderPath + pathContext.separator)) {
+          String relPath = sourcePath.substring(pkgFolderPath.length + 1);
+          if (_isReversibleTranslation(pkgFolders, i, relPath)) {
+            List<String> relPathComponents = pathContext.split(relPath);
+            String relUriPath = pathos.posix.joinAll(relPathComponents);
+            bestMatch = Uri.parse('$PACKAGE_SCHEME:$pkgName/$relUriPath');
+            bestMatchLength = pkgFolderPath.length;
+          }
+        }
+      }
+    }
+    return bestMatch;
+  }
+
+  /**
+   * A translation from file path to package URI has just been found for
+   * using the [packageDirIndex]th element of [packageDirs], and appending the
+   * relative path [relPath].  Determine whether the translation is reversible;
+   * that is, whether translating the package URI pack to a file path will
+   * produce the file path we started with.
+   */
+  bool _isReversibleTranslation(
+      List<Folder> packageDirs, int packageDirIndex, String relPath) {
+    // The translation is reversible provided there is no prior element of
+    // [packageDirs] containing a file matching [relPath].
+    for (int i = 0; i < packageDirIndex; i++) {
+      Folder packageDir = packageDirs[i];
+      if (packageDir.exists) {
+        Resource result = packageDir.getChild(relPath);
+        if (result is File && result.exists) {
+          return false;
+        }
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Returns `true` if [uri] is a `package` URI.
+   */
+  static bool isPackageUri(Uri uri) {
+    return uri.scheme == PACKAGE_SCHEME;
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/source/path_filter.dart b/mojo/public/dart/third_party/analyzer/lib/source/path_filter.dart
new file mode 100644
index 0000000..40e81a6
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/source/path_filter.dart
@@ -0,0 +1,76 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library source.path_filter;
+
+import 'package:glob/glob.dart' as glob;
+import 'package:path/path.dart' as path;
+
+/// Filter paths against a set of [ignorePatterns] relative to a [root]
+/// directory. Paths outside of [root] are also ignored.
+class PathFilter {
+  /// The path context to use when manipulating paths.
+  final path.Context pathContext;
+
+  /// Path that all ignore patterns are relative to.
+  final String root;
+
+  /// List of ignore patterns that paths are tested against.
+  final List<glob.Glob> _ignorePatterns = new List<glob.Glob>();
+
+  /// Construct a new path filter rooted at [root] with [ignorePatterns].
+  /// If [pathContext] is not specified, then the system path context is used.
+  PathFilter(this.root, List<String> ignorePatterns, [path.Context pathContext])
+      : this.pathContext = pathContext != null ? pathContext : path.context {
+    setIgnorePatterns(ignorePatterns);
+  }
+
+  /// Returns true if [path] should be ignored. A path is ignored if it is not
+  /// contained in [root] or matches one of the ignore patterns.
+  /// [path] is absolute or relative to [root].
+  bool ignored(String path) {
+    path = _canonicalize(path);
+    return !_contained(path) || _match(path);
+  }
+
+  /// Set the ignore patterns.
+  void setIgnorePatterns(List<String> ignorePatterns) {
+    _ignorePatterns.clear();
+    if (ignorePatterns != null) {
+      for (var ignorePattern in ignorePatterns) {
+        _ignorePatterns.add(new glob.Glob(ignorePattern));
+      }
+    }
+  }
+
+  /// Returns the absolute path of [path], relative to [root].
+  String _canonicalize(String path) =>
+      pathContext.normalize(pathContext.join(root, path));
+
+  /// Returns true when [path] is contained inside [root].
+  bool _contained(String path) => path.startsWith(root);
+
+  /// Returns true if [path] matches any ignore patterns.
+  bool _match(String path) {
+    path = _relative(path);
+    for (var glob in _ignorePatterns) {
+      if (glob.matches(path)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /// Returns the relative portion of [path] from [root].
+  String _relative(String path) => pathContext.relative(path, from: root);
+
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    for (var pattern in _ignorePatterns) {
+      sb.write('$pattern ');
+    }
+    sb.writeln('');
+    return sb.toString();
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/source/pub_package_map_provider.dart b/mojo/public/dart/third_party/analyzer/lib/source/pub_package_map_provider.dart
new file mode 100644
index 0000000..3e9936d
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/source/pub_package_map_provider.dart
@@ -0,0 +1,171 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library source.pub_package_map_provider;
+
+import 'dart:collection';
+import 'dart:convert';
+import 'dart:core' hide Resource;
+import 'dart:io' as io;
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/source/package_map_provider.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/sdk_io.dart';
+
+/**
+ * The function used to run pub list.
+ */
+typedef io.ProcessResult RunPubList(Folder folder);
+
+/**
+ * Implementation of PackageMapProvider that operates by executing pub.
+ */
+class PubPackageMapProvider implements PackageMapProvider {
+  static const String PUB_LIST_COMMAND = 'list-package-dirs';
+
+  /**
+   * The name of the 'pubspec.lock' file, which we assume is the dependency
+   * in the event that [PUB_LIST_COMMAND] fails.
+   */
+  static const String PUBSPEC_LOCK_NAME = 'pubspec.lock';
+
+  /**
+   * [ResourceProvider] that is used to create the [Folder]s that populate the
+   * package map.
+   */
+  final ResourceProvider resourceProvider;
+
+  /**
+   * Sdk that we use to find the pub executable.
+   */
+  final DirectoryBasedDartSdk sdk;
+
+  /**
+   * The function used to run pub list.
+   */
+  RunPubList _runPubList;
+
+  /**
+   * Construct a new instance.
+   * A [RunPubList] implementation may be injected for testing
+   */
+  PubPackageMapProvider(this.resourceProvider, this.sdk, [this._runPubList]) {
+    if (_runPubList == null) {
+      _runPubList = _runPubListDefault;
+    }
+  }
+
+  @override
+  PackageMapInfo computePackageMap(Folder folder) {
+    // TODO(paulberry) make this asynchronous so that we can (a) do other
+    // analysis while it's in progress, and (b) time out if it takes too long
+    // to respond.
+    io.ProcessResult result;
+    try {
+      result = _runPubList(folder);
+    } on io.ProcessException catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logInformation(
+          "Error running pub $PUB_LIST_COMMAND\n$exception\n$stackTrace");
+    }
+    if (result == null || result.exitCode != 0) {
+      String exitCode =
+          result != null ? 'exit code ${result.exitCode}' : 'null';
+      AnalysisEngine.instance.logger
+          .logInformation("pub $PUB_LIST_COMMAND failed: $exitCode");
+      return computePackageMapError(folder);
+    }
+    try {
+      PackageMapInfo packageMap =
+          parsePackageMap(JSON.decode(result.stdout), folder);
+      return packageMap;
+    } catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logError(
+          "Malformed output from pub $PUB_LIST_COMMAND\n$exception\n$stackTrace");
+    }
+
+    return computePackageMapError(folder);
+  }
+
+  /**
+   * Create a PackageMapInfo object representing an error condition.
+   */
+  PackageMapInfo computePackageMapError(Folder folder) {
+    // Even if an error occurs, we still need to know the dependencies, so that
+    // we'll know when to try running "pub list-package-dirs" again.
+    // Unfortunately, "pub list-package-dirs" doesn't tell us dependencies when
+    // an error occurs, so just assume there is one dependency, "pubspec.lock".
+    List<String> dependencies = <String>[
+      resourceProvider.pathContext.join(folder.path, PUBSPEC_LOCK_NAME)
+    ];
+    return new PackageMapInfo(null, dependencies.toSet());
+  }
+
+  /**
+   * Decode the JSON output from pub into a package map.  Paths in the
+   * output are considered relative to [folder].
+   */
+  PackageMapInfo parsePackageMap(Map obj, Folder folder) {
+    // The output of pub looks like this:
+    // {
+    //   "packages": {
+    //     "foo": "path/to/foo",
+    //     "bar": ["path/to/bar1", "path/to/bar2"],
+    //     "myapp": "path/to/myapp",  // self link is included
+    //   },
+    //   "input_files": [
+    //     "path/to/myapp/pubspec.lock"
+    //   ]
+    // }
+    Map<String, List<Folder>> packageMap = new HashMap<String, List<Folder>>();
+    Map packages = obj['packages'];
+    processPaths(String packageName, List paths) {
+      List<Folder> folders = <Folder>[];
+      for (var path in paths) {
+        if (path is String) {
+          Resource resource = folder.getChildAssumingFolder(path);
+          if (resource is Folder) {
+            folders.add(resource);
+          }
+        }
+      }
+      if (folders.isNotEmpty) {
+        packageMap[packageName] = folders;
+      }
+    }
+    packages.forEach((key, value) {
+      if (value is String) {
+        processPaths(key, [value]);
+      } else if (value is List) {
+        processPaths(key, value);
+      }
+    });
+    Set<String> dependencies = new Set<String>();
+    List inputFiles = obj['input_files'];
+    if (inputFiles != null) {
+      for (var path in inputFiles) {
+        if (path is String) {
+          dependencies.add(folder.canonicalizePath(path));
+        }
+      }
+    }
+    return new PackageMapInfo(packageMap, dependencies);
+  }
+
+  /**
+   * Run pub list to determine the packages and input files.
+   */
+  io.ProcessResult _runPubListDefault(Folder folder) {
+    String executablePath = sdk.pubExecutable.getAbsolutePath();
+    List<String> arguments = [PUB_LIST_COMMAND];
+    String workingDirectory = folder.path;
+    int subprocessId = AnalysisEngine.instance.instrumentationService
+        .logSubprocessStart(executablePath, arguments, workingDirectory);
+    io.ProcessResult result = io.Process.runSync(executablePath, arguments,
+        workingDirectory: workingDirectory);
+    AnalysisEngine.instance.instrumentationService.logSubprocessResult(
+        subprocessId, result.exitCode, result.stdout, result.stderr);
+    return result;
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/source/sdk_ext.dart b/mojo/public/dart/third_party/analyzer/lib/source/sdk_ext.dart
new file mode 100644
index 0000000..d16bb47
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/source/sdk_ext.dart
@@ -0,0 +1,183 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library source.sdk_ext;
+
+import 'dart:convert';
+import 'dart:core' hide Resource;
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/java_io.dart' show JavaFile;
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/source_io.dart' show FileBasedSource;
+import 'package:path/path.dart' as pathos;
+
+/// Given a packageMap (see [PackageMapProvider]), check in each package's lib
+/// directory for the existence of a `_sdkext` file. This file must contain a
+/// JSON encoded map. Each key in the map is a `dart:` library name. Each value
+/// is a path (relative to the directory containing `_sdkext`) to a dart script
+/// for the given library. For example:
+/// {
+///   "dart:sky": "../sdk_ext/dart_sky.dart"
+/// }
+///
+/// If a key doesn't begin with `dart:` it is ignored.
+class SdkExtUriResolver extends UriResolver {
+  static const String SDK_EXT_NAME = '_sdkext';
+  static const String DART_COLON_PREFIX = 'dart:';
+
+  final Map<String, String> _urlMappings = <String,String>{};
+
+  /// Construct a [SdkExtUriResolver] from a package map
+  /// (see [PackageMapProvider]).
+  SdkExtUriResolver(Map<String, List<Folder>> packageMap) {
+    if (packageMap == null) {
+      return;
+    }
+    packageMap.forEach(_processPackage);
+  }
+
+  /// Number of sdk extensions.
+  int get length => _urlMappings.length;
+
+  /// Return the path mapping for [libName] or null if there is none.
+  String operator[](String libName) => _urlMappings[libName];
+
+  /// Programmatically add a new SDK extension given a JSON description
+  /// ([sdkExtJSON]) and a lib directory ([libDir]).
+  void addSdkExt(String sdkExtJSON, Folder libDir) {
+    _processSdkExt(sdkExtJSON, libDir);
+  }
+
+  @override
+  Source resolveAbsolute(Uri importUri, [Uri actualUri]) {
+    String libraryName = _libraryName(importUri);
+    String partPath = _partPath(importUri);
+    // Lookup library name in mappings.
+    String mapping = _urlMappings[libraryName];
+    if (mapping == null) {
+      // Not found.
+      return null;
+    }
+    // This mapping points to the main entry file of the sdk extension.
+    Uri libraryEntry = new Uri.file(mapping);
+    if (!libraryEntry.isAbsolute) {
+      // We expect an absolute path.
+      return null;
+    }
+
+    if (partPath != null) {
+      return _resolvePart(libraryEntry, partPath, importUri);
+    } else {
+      return _resolveEntry(libraryEntry, importUri);
+    }
+  }
+
+  @override
+  Uri restoreAbsolute(Source source) {
+    String extensionName = _findExtensionNameFor(source.fullName);
+    if (extensionName != null) {
+      return Uri.parse(extensionName);
+    }
+    // TODO(johnmccutchan): Handle restoring parts.
+    return null;
+  }
+
+  /// Return the extension name for [fullName] or `null`.
+  String _findExtensionNameFor(String fullName) {
+    var result;
+    _urlMappings.forEach((extensionName, pathMapping) {
+      if (pathMapping == fullName) {
+        result = extensionName;
+      }
+    });
+    return result;
+  }
+
+  /// Return the library name of [importUri].
+  String _libraryName(Uri importUri) {
+    var uri = importUri.toString();
+    int index = uri.indexOf('/');
+    if (index >= 0) {
+      return uri.substring(0, index);
+    }
+    return uri;
+  }
+
+  /// Return the part path of [importUri].
+  String _partPath(Uri importUri) {
+    var uri = importUri.toString();
+    int index = uri.indexOf('/');
+    if (index >= 0) {
+      return uri.substring(index + 1);
+    }
+    return null;
+  }
+
+  /// Given a package [name] and a list of folders ([libDirs]),
+  /// add any found sdk extensions.
+  void _processPackage(String name, List<Folder> libDirs) {
+    for (var libDir in libDirs) {
+      var sdkExt = _readDotSdkExt(libDir);
+      if (sdkExt != null) {
+        _processSdkExt(sdkExt, libDir);
+      }
+    }
+  }
+
+  /// Given the JSON for an SDK extension ([sdkExtJSON]) and a folder
+  /// ([libDir]), setup the uri mapping.
+  void _processSdkExt(String sdkExtJSON, Folder libDir) {
+    var sdkExt;
+    try {
+      sdkExt = JSON.decode(sdkExtJSON);
+    } catch (e) {
+      return;
+    }
+    if ((sdkExt == null) || (sdkExt is! Map)) {
+      return;
+    }
+    sdkExt.forEach((k, v) => _processSdkExtension(k, v, libDir));
+  }
+
+  /// Install the mapping from [name] to [libDir]/[file].
+  void _processSdkExtension(String name, String file, Folder libDir) {
+    if (!name.startsWith(DART_COLON_PREFIX)) {
+      // SDK extensions must begin with 'dart:'.
+      return;
+    }
+    var key = name;
+    var value = libDir.canonicalizePath(file);
+    _urlMappings[key] = value;
+  }
+
+  /// Read the contents of [libDir]/[SDK_EXT_NAME] as a string.
+  /// Returns null if the file doesn't exist.
+  String _readDotSdkExt(Folder libDir) {
+    var file = libDir.getChild(SDK_EXT_NAME);
+    try {
+      return file.readAsStringSync();
+    } on FileSystemException {
+      // File can't be read.
+      return null;
+    }
+  }
+
+  /// Resolve an import of an sdk extension.
+  Source _resolveEntry(Uri libraryEntry, Uri importUri) {
+    // Library entry.
+    JavaFile javaFile = new JavaFile.fromUri(libraryEntry);
+    return new FileBasedSource(javaFile, importUri);
+  }
+
+  /// Resolve a 'part' statement inside an sdk extension.
+  Source _resolvePart(Uri libraryEntry, String partPath, Uri importUri) {
+    // Library part.
+    var directory = pathos.dirname(libraryEntry.path);
+    var partUri = new Uri.file(pathos.join(directory, partPath));
+    assert(partUri.isAbsolute);
+    JavaFile javaFile = new JavaFile.fromUri(partUri);
+    return new FileBasedSource(javaFile, importUri);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/cancelable_future.dart b/mojo/public/dart/third_party/analyzer/lib/src/cancelable_future.dart
new file mode 100644
index 0000000..4ec7b26
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/cancelable_future.dart
@@ -0,0 +1,300 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library cancelable_future;
+
+import 'dart:async';
+
+/**
+ * Type of callback called when the future returned by a CancelableCompleter
+ * is canceled.
+ */
+typedef void CancelHandler();
+
+/**
+ * A way to produce [CancelableFuture] objects and to complete them later with
+ * a value or error.
+ *
+ * This class behaves like the standard library [Completer] class, except that
+ * its [future] getter returns a [CancelableFuture].
+ *
+ * If the future is canceled before being completed, the [CancelHandler] which
+ * was passed to the constructor is invoked, and any further attempt to
+ * complete the future has no effect.  For example, in the following code:
+ *
+ *     main() {
+ *       var cc = new CancelableCompleter(() {
+ *         print('cancelled'); // (2)
+ *       });
+ *       cc.future.then((value) {
+ *         print('completed with value $value');
+ *       }, onError: (error) {
+ *         print('completed with error $error'); // (3)
+ *       });
+ *       cc.future.cancel(); // (1)
+ *     }
+ *
+ * The call at (1) causes (2) to be invoked immediately.  (3) will be invoked
+ * later (on a microtask), with an error that is an instance of
+ * [FutureCanceledError].
+ *
+ * Note that since the closure passed to then() is executed on a microtask,
+ * there is a short window of time between the call to [complete] and the
+ * client being informed that the future has completed.  During this window,
+ * any attempt to cancel the future will have no effect.  For example, in the
+ * following code:
+ *
+ *     main() {
+ *       var cc = new CancelableCompleter(() {
+ *         print('cancelled'); // (3)
+ *       });
+ *       cc.future.then((value) {
+ *         print('completed with value $value'); // (4)
+ *       }, onError: (error) {
+ *         print('completed with error $error');
+ *       });
+ *       cc.complete(100); // (1)
+ *       cc.future.cancel(); // (2)
+ *     }
+ *
+ * The call at (1) will place the completer in the "completed" state, so the
+ * call at (2) will have no effect (in particular, (3) won't ever execute).
+ * Later, (4) will be invoked on a microtask.
+ */
+class CancelableCompleter<T> implements Completer<T> {
+  /**
+   * The completer which holds the state of the computation.  If the
+   * computation is canceled, this completer will remain in the non-completed
+   * state.
+   */
+  final Completer<T> _innerCompleter = new Completer<T>.sync();
+
+  /**
+   * The completer which holds the future that is exposed to the client
+   * through [future].  If the computation is canceled, this completer will
+   * be completed with a FutureCanceledError.
+   */
+  final Completer<T> _outerCompleter = new Completer<T>();
+
+  /**
+   * The callback to invoke if the 'cancel' method is called on the future
+   * returned by [future].  This callback will only be invoked if the future
+   * is canceled before being completed.
+   */
+  final CancelHandler _onCancel;
+
+  _CancelableCompleterFuture<T> _future;
+
+  /**
+   * Create a CancelableCompleter that will invoke the given callback
+   * synchronously if its future is canceled.  The callback will not be
+   * invoked if the future is completed before being canceled.
+   */
+  CancelableCompleter(this._onCancel) {
+    _future = new _CancelableCompleterFuture<T>(this);
+
+    // When the client completes the inner completer, we need to check whether
+    // the outer completer has been completed.  If it has, then the operation
+    // was canceled before it finished, and it's too late to un-cancel it, so
+    // we just ignore the result from the inner completer.  If it hasn't, then
+    // we simply pass along the result from the inner completer to the outer
+    // completer.
+    //
+    // Note that the reason it is safe for the inner completer to be
+    // synchronous is that we don't expose its future to client code, and we
+    // only use it to complete the outer completer (which is asynchronous).
+    _innerCompleter.future.then((T value) {
+      if (!_outerCompleter.isCompleted) {
+        _outerCompleter.complete(value);
+      }
+    }, onError: (Object error, StackTrace stackTrace) {
+      if (!_outerCompleter.isCompleted) {
+        _outerCompleter.completeError(error, stackTrace);
+      }
+    });
+  }
+
+  /**
+   * The [CancelableFuture] that will contain the result provided to this
+   * completer.
+   */
+  @override
+  CancelableFuture<T> get future => _future;
+
+  /**
+   * Whether the future has been completed.  This is independent of whether
+   * the future has been canceled.
+   */
+  @override
+  bool get isCompleted => _innerCompleter.isCompleted;
+
+  /**
+   * Complete [future] with the supplied value.  If the future has previously
+   * been canceled, this will have no effect on [future], however it will
+   * still set [isCompleted] to true.
+   */
+  @override
+  void complete([value]) {
+    _innerCompleter.complete(value);
+  }
+
+  /**
+   * Complete [future] with an error.  If the future has previously been
+   * canceled, this will have no effect on [future], however it will still set
+   * [isCompleted] to true.
+   */
+  @override
+  void completeError(Object error, [StackTrace stackTrace]) {
+    _innerCompleter.completeError(error, stackTrace);
+  }
+
+  void _cancel() {
+    if (!_outerCompleter.isCompleted) {
+      _outerCompleter.completeError(new FutureCanceledError());
+      _onCancel();
+    }
+  }
+}
+
+/**
+ * An object representing a delayed computation that can be canceled.
+ */
+abstract class CancelableFuture<T> implements Future<T> {
+  /**
+   * A CancelableFuture containing the result of calling [computation]
+   * asynchronously.  Since the computation is started without delay, calling
+   * the future's cancel method will have no effect.
+   */
+  factory CancelableFuture(computation()) =>
+      new _WrappedFuture<T>(new Future<T>(computation));
+
+  /**
+   * A CancelableFuture containing the result of calling [computation] after
+   * [duration] has passed.
+   *
+   * TODO(paulberry): if the future is canceled before the duration has
+   * elapsed, the computation should not be performed.
+   */
+  factory CancelableFuture.delayed(Duration duration, [computation()]) =>
+      new _WrappedFuture<T>(new Future<T>.delayed(duration, computation));
+
+  /**
+   * A CancelableFuture that completes with error.  Since the future is
+   * completed without delay, calling the future's cancel method will have no
+   * effect.
+   */
+  factory CancelableFuture.error(Object error, [StackTrace stackTrace]) =>
+      new _WrappedFuture<T>(new Future<T>.error(error, stackTrace));
+
+  /**
+   * A CancelableFuture containing the result of calling [computation]
+   * asynchronously with scheduleMicrotask.  Since the computation is started
+   * without delay, calling the future's cancel method will have no effect.
+   */
+  factory CancelableFuture.microtask(computation()) =>
+      new _WrappedFuture<T>(new Future<T>.microtask(computation));
+
+  /**
+   * A CancelableFuture containing the result of immediately calling
+   * [computation].  Since the computation is started without delay, calling
+   * the future's cancel method will have no effect.
+   */
+  factory CancelableFuture.sync(computation()) =>
+      new _WrappedFuture<T>(new Future<T>.sync(computation));
+
+  /**
+   * A CancelableFuture whose value is available in the next event-loop
+   * iteration.  Since the value is available without delay, calling the
+   * future's cancel method will have no effect.
+   */
+  factory CancelableFuture.value([value]) =>
+      new _WrappedFuture<T>(new Future<T>.value(value));
+
+  /**
+   * If the delayed computation has not yet completed, attempt to cancel it.
+   * Note that the cancellation is not always possible.  If the computation
+   * could be canceled, the future is completed with a FutureCanceledError.
+   * Otherwise it will behave as though cancel() was not called.
+   *
+   * Note that attempting to cancel a future that has already completed will
+   * never succeed--futures that have already completed retain their final
+   * state forever.
+   */
+  void cancel();
+}
+
+/**
+ * Error which is used to complete any [CancelableFuture] which has been
+ * successfully canceled by calling its 'cancel' method.
+ */
+class FutureCanceledError {}
+
+class _CancelableCompleterFuture<T> implements CancelableFuture<T> {
+  final CancelableCompleter<T> _completer;
+
+  _CancelableCompleterFuture(this._completer);
+
+  @override
+  Stream<T> asStream() {
+    // TODO(paulberry): Implement this in such a way that
+    // StreamSubscription.cancel() cancels the future.
+    return _completer._outerCompleter.future.asStream();
+  }
+
+  @override
+  void cancel() {
+    _completer._cancel();
+  }
+
+  @override
+  Future catchError(Function onError, {bool test(Object error)}) =>
+      _completer._outerCompleter.future.catchError(onError, test: test);
+
+  @override
+  Future then(onValue(T value), {Function onError}) =>
+      _completer._outerCompleter.future.then(onValue, onError: onError);
+
+  @override
+  Future timeout(Duration timeLimit, {onTimeout()}) {
+    // TODO(paulberry): Implement this in such a way that a timeout cancels
+    // the future.
+    return _completer._outerCompleter.future.timeout(timeLimit,
+        onTimeout: onTimeout);
+  }
+
+  @override
+  Future<T> whenComplete(action()) =>
+      _completer._outerCompleter.future.whenComplete(action);
+}
+
+/**
+ * A CancelableFuture that wraps an ordinary Future.  Attempting to cancel a
+ * _WrappedFuture has no effect.
+ */
+class _WrappedFuture<T> implements CancelableFuture<T> {
+  final Future<T> _future;
+
+  _WrappedFuture(this._future);
+
+  @override
+  Stream<T> asStream() => _future.asStream();
+
+  @override
+  void cancel() {}
+
+  @override
+  Future catchError(Function onError, {bool test(Object error)}) =>
+      _future.catchError(onError, test: test);
+
+  @override
+  Future then(onValue(value), {Function onError}) =>
+      _future.then(onValue, onError: onError);
+
+  @override
+  Future timeout(Duration timeLimit, {onTimeout()}) =>
+      _future.timeout(timeLimit, onTimeout: onTimeout);
+
+  @override
+  Future<T> whenComplete(action()) => _future.whenComplete(action);
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/context/cache.dart b/mojo/public/dart/third_party/analyzer/lib/src/context/cache.dart
new file mode 100644
index 0000000..d45c729
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/context/cache.dart
@@ -0,0 +1,1150 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.src.context.cache;
+
+import 'dart:async';
+import 'dart:collection';
+
+import 'package:analyzer/src/generated/engine.dart'
+    show AnalysisEngine, CacheState, InternalAnalysisContext, RetentionPriority;
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/utilities_collection.dart';
+import 'package:analyzer/src/task/model.dart';
+import 'package:analyzer/task/model.dart';
+
+/**
+ * Return `true` if the given [target] is a priority one.
+ */
+typedef bool IsPriorityAnalysisTarget(AnalysisTarget target);
+
+/**
+ * An LRU cache of results produced by analysis.
+ */
+class AnalysisCache {
+  /**
+   * A flag used to control whether trace information should be produced when
+   * the content of the cache is modified.
+   */
+  static bool _TRACE_CHANGES = false;
+
+  /**
+   * An array containing the partitions of which this cache is comprised.
+   */
+  final List<CachePartition> _partitions;
+
+  /**
+   * The [StreamController] reporting [InvalidatedResult]s.
+   */
+  final StreamController<InvalidatedResult> _onResultInvalidated =
+      new StreamController<InvalidatedResult>.broadcast(sync: true);
+
+  /**
+   * Initialize a newly created cache to have the given [partitions]. The
+   * partitions will be searched in the order in which they appear in the array,
+   * so the most specific partition (usually an [SdkCachePartition]) should be
+   * first and the most general (usually a [UniversalCachePartition]) last.
+   */
+  AnalysisCache(this._partitions) {
+    for (CachePartition partition in _partitions) {
+      partition.onResultInvalidated.listen((InvalidatedResult event) {
+        _onResultInvalidated.add(event);
+      });
+    }
+  }
+
+  /**
+   * Return the stream that is notified when a value is invalidated.
+   */
+  Stream<InvalidatedResult> get onResultInvalidated =>
+      _onResultInvalidated.stream;
+
+  // TODO(brianwilkerson) Implement or delete this.
+//  /**
+//   * Return information about each of the partitions in this cache.
+//   */
+//  List<AnalysisContextStatistics_PartitionData> get partitionData {
+//    int count = _partitions.length;
+//    List<AnalysisContextStatistics_PartitionData> data =
+//        new List<AnalysisContextStatistics_PartitionData>(count);
+//    for (int i = 0; i < count; i++) {
+//      CachePartition partition = _partitions[i];
+//      data[i] = new AnalysisContextStatisticsImpl_PartitionDataImpl(
+//          partition.astSize,
+//          partition.map.length);
+//    }
+//    return data;
+//  }
+
+  /**
+   * Return an iterator returning all of the [Source] targets.
+   */
+  Iterable<Source> get sources {
+    return _partitions
+        .map((CachePartition partition) => partition._sources)
+        .expand((Iterable<Source> sources) => sources);
+  }
+
+  /**
+   * Return the entry associated with the given [target].
+   */
+  CacheEntry get(AnalysisTarget target) {
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      CachePartition partition = _partitions[i];
+      if (partition.isResponsibleFor(target)) {
+        return partition.get(target);
+      }
+    }
+    //
+    // We should never get to this point because the last partition should
+    // always be a universal partition, except in the case of the SDK context,
+    // in which case the target should always be part of the SDK.
+    //
+    return null;
+  }
+
+  /**
+   * Return the context to which the given [target] was explicitly added.
+   */
+  InternalAnalysisContext getContextFor(AnalysisTarget target) {
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      CachePartition partition = _partitions[i];
+      if (partition.isResponsibleFor(target)) {
+        return partition.context;
+      }
+    }
+    //
+    // We should never get to this point because the last partition should
+    // always be a universal partition, except in the case of the SDK context,
+    // in which case the target should always be part of the SDK.
+    //
+    // TODO(brianwilkerson) Throw an exception here.
+    AnalysisEngine.instance.logger.logInformation(
+        'Could not find context for $target',
+        new CaughtException(new AnalysisException(), null));
+    return null;
+  }
+
+  /**
+   * Return [Source]s whose full path is equal to the given [path].
+   * Maybe empty, but not `null`.
+   */
+  List<Source> getSourcesWithFullName(String path) {
+    List<Source> sources = <Source>[];
+    for (CachePartition partition in _partitions) {
+      List<Source> partitionSources = partition.getSourcesWithFullName(path);
+      sources.addAll(partitionSources);
+    }
+    return sources;
+  }
+
+  /**
+   * Return the state of the given [result] for the given [target].
+   *
+   * It does not update the cache, if the corresponding [CacheEntry] does not
+   * exist, then [CacheState.INVALID] is returned.
+   */
+  CacheState getState(AnalysisTarget target, ResultDescriptor result) {
+    CacheEntry entry = get(target);
+    if (entry == null) {
+      return CacheState.INVALID;
+    }
+    return entry.getState(result);
+  }
+
+  /**
+   * Return the value of the given [result] for the given [target].
+   *
+   * It does not update the cache, if the corresponding [CacheEntry] does not
+   * exist, then the default value is returned.
+   */
+  Object getValue(AnalysisTarget target, ResultDescriptor result) {
+    CacheEntry entry = get(target);
+    if (entry == null) {
+      return result.defaultValue;
+    }
+    return entry.getValue(result);
+  }
+
+  /**
+   * Return an iterator returning all of the map entries mapping targets to
+   * cache entries.
+   */
+  MapIterator<AnalysisTarget, CacheEntry> iterator() {
+    int count = _partitions.length;
+    List<Map<AnalysisTarget, CacheEntry>> maps =
+        new List<Map<AnalysisTarget, CacheEntry>>(count);
+    for (int i = 0; i < count; i++) {
+      maps[i] = _partitions[i].map;
+    }
+    return new MultipleMapIterator<AnalysisTarget, CacheEntry>(maps);
+  }
+
+  /**
+   * Puts the given [entry] into the cache.
+   */
+  void put(CacheEntry entry) {
+    AnalysisTarget target = entry.target;
+    entry.fixExceptionState();
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      CachePartition partition = _partitions[i];
+      if (partition.isResponsibleFor(target)) {
+        if (_TRACE_CHANGES) {
+          CacheEntry oldEntry = partition.get(target);
+          if (oldEntry == null) {
+            AnalysisEngine.instance.logger
+                .logInformation('Added a cache entry for $target.');
+          } else {
+            AnalysisEngine.instance.logger
+                .logInformation('Modified the cache entry for $target.');
+//                'Diff = ${entry.getDiff(oldEntry)}');
+          }
+        }
+        partition.put(entry);
+        return;
+      }
+    }
+    // TODO(brianwilkerson) Handle the case where no partition was found,
+    // possibly by throwing an exception.
+  }
+
+  /**
+   * Remove all information related to the given [target] from this cache.
+   * Return the entry associated with the target, or `null` if there was cache
+   * entry for the target.
+   */
+  CacheEntry remove(AnalysisTarget target) {
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      CachePartition partition = _partitions[i];
+      if (partition.isResponsibleFor(target)) {
+        if (_TRACE_CHANGES) {
+          AnalysisEngine.instance.logger
+              .logInformation('Removed the cache entry for $target.');
+        }
+        return partition.remove(target);
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the number of targets that are mapped to cache entries.
+   */
+  int size() {
+    int size = 0;
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      size += _partitions[i].size();
+    }
+    return size;
+  }
+}
+
+/**
+ * The information cached by an analysis context about an individual target.
+ */
+class CacheEntry {
+  /**
+   * The index of the flag indicating whether the source was explicitly added to
+   * the context or whether the source was implicitly added because it was
+   * referenced by another source.
+   */
+  static int _EXPLICITLY_ADDED_FLAG = 0;
+
+  /**
+   * The target this entry is about.
+   */
+  final AnalysisTarget target;
+
+  /**
+   * The partition that is responsible for this entry.
+   */
+  CachePartition _partition;
+
+  /**
+   * The most recent time at which the state of the target matched the state
+   * represented by this entry, `-1` if the target does not exist.
+   */
+  int modificationTime = -1;
+
+  /**
+   * The exception that caused one or more values to have a state of
+   * [CacheState.ERROR].
+   */
+  CaughtException _exception;
+
+  /**
+   * A bit-encoding of boolean flags associated with this entry's target.
+   */
+  int _flags = 0;
+
+  /**
+   * A table mapping result descriptors to the cached values of those results.
+   */
+  Map<ResultDescriptor, ResultData> _resultMap =
+      new HashMap<ResultDescriptor, ResultData>();
+
+  CacheEntry(this.target);
+
+  /**
+   * The exception that caused one or more values to have a state of
+   * [CacheState.ERROR].
+   */
+  CaughtException get exception => _exception;
+
+  /**
+   * Return `true` if the source was explicitly added to the context or `false`
+   * if the source was implicitly added because it was referenced by another
+   * source.
+   */
+  bool get explicitlyAdded => _getFlag(_EXPLICITLY_ADDED_FLAG);
+
+  /**
+   * Set whether the source was explicitly added to the context to match the
+   * [explicitlyAdded] flag.
+   */
+  void set explicitlyAdded(bool explicitlyAdded) {
+    _setFlag(_EXPLICITLY_ADDED_FLAG, explicitlyAdded);
+  }
+
+  /**
+   * Return a list of result descriptors for results whose state is not
+   * [CacheState.INVALID].
+   */
+  List<ResultDescriptor> get nonInvalidResults => _resultMap.keys.toList();
+
+  /**
+   * Notifies the entry that the client is going to stop using it.
+   */
+  void dispose() {
+    _resultMap.forEach((descriptor, data) {
+      TargetedResult result = new TargetedResult(target, descriptor);
+      for (TargetedResult dependedOnResult in data.dependedOnResults) {
+        ResultData dependedOnData = _partition._getDataFor(dependedOnResult);
+        if (dependedOnData != null) {
+          dependedOnData.dependentResults.remove(result);
+        }
+      }
+    });
+    _resultMap.clear();
+  }
+
+  /**
+   * Fix the state of the [exception] to match the current state of the entry.
+   */
+  void fixExceptionState() {
+    if (!hasErrorState()) {
+      _exception = null;
+    }
+  }
+
+  /**
+   * Look up the [ResultData] of [descriptor], or add a new one if it isn't
+   * there.
+   */
+  ResultData getResultData(ResultDescriptor descriptor) {
+    return _resultMap.putIfAbsent(descriptor, () => new ResultData(descriptor));
+  }
+
+  /**
+   * Return the state of the result represented by the given [descriptor].
+   */
+  CacheState getState(ResultDescriptor descriptor) {
+    ResultData data = _resultMap[descriptor];
+    if (data == null) {
+      return CacheState.INVALID;
+    }
+    return data.state;
+  }
+
+  /**
+   * Return the value of the result represented by the given [descriptor], or
+   * the default value for the result if this entry does not have a valid value.
+   */
+  /*<V>*/ dynamic /*V*/ getValue(ResultDescriptor /*<V>*/ descriptor) {
+    ResultData data = _resultMap[descriptor];
+    if (data == null) {
+      return descriptor.defaultValue;
+    }
+    if (_partition != null) {
+      _partition.resultAccessed(target, descriptor);
+    }
+    return data.value;
+  }
+
+  /**
+   * Return `true` if the state of any data value is [CacheState.ERROR].
+   */
+  bool hasErrorState() {
+    for (ResultData data in _resultMap.values) {
+      if (data.state == CacheState.ERROR) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Invalidate all of the information associated with this entry's target.
+   */
+  void invalidateAllInformation() {
+    _resultMap.clear();
+    _exception = null;
+  }
+
+  /**
+   * Return `true` if the state of the result represented by the given
+   * [descriptor] is [CacheState.INVALID].
+   */
+  bool isInvalid(ResultDescriptor descriptor) =>
+      getState(descriptor) == CacheState.INVALID;
+
+  /**
+   * Return `true` if the state of the result represented by the given
+   * [descriptor] is [CacheState.VALID].
+   */
+  bool isValid(ResultDescriptor descriptor) =>
+      getState(descriptor) == CacheState.VALID;
+
+  /**
+   * For each of the given [descriptors], set their states to
+   * [CacheState.ERROR], their values to the corresponding default values, and
+   * remember the [exception] that caused this state.
+   */
+  void setErrorState(
+      CaughtException exception, List<ResultDescriptor> descriptors) {
+    if (descriptors == null || descriptors.isEmpty) {
+      throw new ArgumentError('at least one descriptor is expected');
+    }
+    if (exception == null) {
+      throw new ArgumentError('an exception is expected');
+    }
+    this._exception = exception;
+    for (ResultDescriptor descriptor in descriptors) {
+      _setErrorState(descriptor, exception);
+    }
+  }
+
+  /**
+   * Set the state of the result represented by the given [descriptor] to the
+   * given [state].
+   */
+  void setState(ResultDescriptor descriptor, CacheState state, {Delta delta}) {
+    if (state == CacheState.ERROR) {
+      throw new ArgumentError('use setErrorState() to set the state to ERROR');
+    }
+    if (state == CacheState.VALID) {
+      throw new ArgumentError('use setValue() to set the state to VALID');
+    }
+    _validateStateChange(descriptor, state);
+    if (state == CacheState.INVALID) {
+      ResultData data = _resultMap[descriptor];
+      if (data != null) {
+        _invalidate(descriptor, delta);
+      }
+    } else {
+      ResultData data = getResultData(descriptor);
+      data.state = state;
+      if (state != CacheState.IN_PROCESS) {
+        //
+        // If the state is in-process, we can leave the current value in the
+        // cache for any 'get' methods to access.
+        //
+        data.value = descriptor.defaultValue;
+      }
+    }
+  }
+
+  /**
+   * Set the value of the result represented by the given [descriptor] to the
+   * given [value].
+   */
+  /*<V>*/ void setValue(ResultDescriptor /*<V>*/ descriptor, dynamic /*V*/
+      value, List<TargetedResult> dependedOn) {
+//    {
+//      String valueStr = '$value';
+//      if (valueStr.length > 20) {
+//        valueStr = valueStr.substring(0, 20) + '...';
+//      }
+//      valueStr = valueStr.replaceAll('\n', '\\n');
+//      print(
+//          'setValue $descriptor for $target value=$valueStr deps=$dependedOn');
+//    }
+    _validateStateChange(descriptor, CacheState.VALID);
+    TargetedResult thisResult = new TargetedResult(target, descriptor);
+    if (_partition != null) {
+      _partition.resultStored(thisResult, value);
+    }
+    ResultData data = getResultData(descriptor);
+    _setDependedOnResults(data, thisResult, dependedOn);
+    data.state = CacheState.VALID;
+    data.value = value == null ? descriptor.defaultValue : value;
+  }
+
+  /**
+   * Set the value of the result represented by the given [descriptor] to the
+   * given [value], keep its dependency, invalidate all the dependent result.
+   */
+  void setValueIncremental(ResultDescriptor descriptor, dynamic value) {
+    ResultData data = getResultData(descriptor);
+    List<TargetedResult> dependedOn = data.dependedOnResults;
+    _invalidate(descriptor, null);
+    setValue(descriptor, value, dependedOn);
+  }
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    _writeOn(buffer);
+    return buffer.toString();
+  }
+
+  /**
+   * Return the value of the flag with the given [index].
+   */
+  bool _getFlag(int index) => BooleanArray.get(_flags, index);
+
+  /**
+   * Invalidate the result represented by the given [descriptor] and propagate
+   * invalidation to other results that depend on it.
+   */
+  void _invalidate(ResultDescriptor descriptor, Delta delta) {
+    DeltaResult deltaResult = null;
+    if (delta != null) {
+      deltaResult = delta.validate(_partition.context, target, descriptor);
+      if (deltaResult == DeltaResult.STOP) {
+//        print('not-invalidate $descriptor for $target');
+        return;
+      }
+    }
+//    print('invalidate $descriptor for $target');
+    ResultData thisData;
+    if (deltaResult == null || deltaResult == DeltaResult.INVALIDATE) {
+      thisData = _resultMap.remove(descriptor);
+    }
+    if (deltaResult == DeltaResult.KEEP_CONTINUE) {
+      thisData = _resultMap[descriptor];
+    }
+    if (thisData == null) {
+      return;
+    }
+    // Stop depending on other results.
+    TargetedResult thisResult = new TargetedResult(target, descriptor);
+    for (TargetedResult dependedOnResult in thisData.dependedOnResults) {
+      ResultData data = _partition._getDataFor(dependedOnResult);
+      if (data != null) {
+        data.dependentResults.remove(thisResult);
+      }
+    }
+    // Invalidate results that depend on this result.
+    List<TargetedResult> dependentResults = thisData.dependentResults.toList();
+    for (TargetedResult dependentResult in dependentResults) {
+      CacheEntry entry = _partition.get(dependentResult.target);
+      if (entry != null) {
+        entry._invalidate(dependentResult.result, delta);
+      }
+    }
+    // If empty, remove the entry altogether.
+    if (_resultMap.isEmpty) {
+      _partition._targetMap.remove(target);
+      _partition._removeIfSource(target);
+    }
+    // Notify controller.
+    _partition._onResultInvalidated
+        .add(new InvalidatedResult(this, descriptor));
+  }
+
+  /**
+   * Invalidates all the results of this entry, with propagation.
+   */
+  void _invalidateAll() {
+    List<ResultDescriptor> results = _resultMap.keys.toList();
+    for (ResultDescriptor result in results) {
+      _invalidate(result, null);
+    }
+  }
+
+  /**
+   * Set the [dependedOn] on which this result depends.
+   */
+  void _setDependedOnResults(ResultData thisData, TargetedResult thisResult,
+      List<TargetedResult> dependedOn) {
+    thisData.dependedOnResults.forEach((TargetedResult dependedOnResult) {
+      ResultData data = _partition._getDataFor(dependedOnResult);
+      if (data != null) {
+        data.dependentResults.remove(thisResult);
+      }
+    });
+    thisData.dependedOnResults = dependedOn;
+    thisData.dependedOnResults.forEach((TargetedResult dependedOnResult) {
+      ResultData data = _partition._getDataFor(dependedOnResult);
+      if (data != null) {
+        data.dependentResults.add(thisResult);
+      }
+    });
+  }
+
+  /**
+   * Set states of the given and dependent results to [CacheState.ERROR] and
+   * their values to the corresponding default values
+   */
+  void _setErrorState(ResultDescriptor descriptor, CaughtException exception) {
+    ResultData thisData = getResultData(descriptor);
+    // Set the error state.
+    _exception = exception;
+    thisData.state = CacheState.ERROR;
+    thisData.value = descriptor.defaultValue;
+    // Propagate the error state.
+    thisData.dependentResults.forEach((TargetedResult dependentResult) {
+      CacheEntry entry = _partition.get(dependentResult.target);
+      entry._setErrorState(dependentResult.result, exception);
+    });
+  }
+
+  /**
+   * Set the value of the flag with the given [index] to the given [value].
+   */
+  void _setFlag(int index, bool value) {
+    _flags = BooleanArray.set(_flags, index, value);
+  }
+
+  /**
+   * If the state of the value described by the given [descriptor] is changing
+   * from ERROR to anything else, capture the information. This is an attempt to
+   * discover the underlying cause of a long-standing bug.
+   */
+  void _validateStateChange(ResultDescriptor descriptor, CacheState newState) {
+    // TODO(brianwilkerson) Decide whether we still want to capture this data.
+//    if (descriptor != CONTENT) {
+//      return;
+//    }
+//    ResultData data = resultMap[CONTENT];
+//    if (data != null && data.state == CacheState.ERROR) {
+//      String message =
+//          'contentState changing from ${data.state} to $newState';
+//      InstrumentationBuilder builder =
+//          Instrumentation.builder2('CacheEntry-validateStateChange');
+//      builder.data3('message', message);
+//      //builder.data('source', source.getFullName());
+//      builder.record(new CaughtException(new AnalysisException(message), null));
+//      builder.log();
+//    }
+  }
+
+  /**
+   * Write a textual representation of this entry to the given [buffer]. The
+   * result should only be used for debugging purposes.
+   */
+  void _writeOn(StringBuffer buffer) {
+    buffer.write('time = ');
+    buffer.write(modificationTime);
+    List<ResultDescriptor> results = _resultMap.keys.toList();
+    results.sort((ResultDescriptor first, ResultDescriptor second) =>
+        first.toString().compareTo(second.toString()));
+    for (ResultDescriptor result in results) {
+      ResultData data = _resultMap[result];
+      buffer.write('; ');
+      buffer.write(result.toString());
+      buffer.write(' = ');
+      buffer.write(data.state);
+    }
+  }
+}
+
+/**
+ * An object that controls flushing of analysis results from the cache.
+ */
+class CacheFlushManager<T> {
+  final IsPriorityAnalysisTarget isPriorityAnalysisTarget;
+  final ResultCachingPolicy<T> policy;
+  final int maxActiveSize;
+  final int maxIdleSize;
+
+  /**
+   * A map of the stored [TargetedResult] to their sizes.
+   */
+  final HashMap<TargetedResult, int> resultSizeMap =
+      new HashMap<TargetedResult, int>();
+
+  /**
+   * A linked set containing the most recently accessed results with the most
+   * recently used at the end of the list. When more results are added than the
+   * maximum size allowed then the least recently used results will be flushed
+   * from the cache.
+   */
+  final LinkedHashSet<TargetedResult> recentlyUsed =
+      new LinkedHashSet<TargetedResult>();
+
+  /**
+   * The current size of stored results.
+   */
+  int currentSize = 0;
+
+  /**
+   * The current maximum cache size.
+   */
+  int maxSize;
+
+  CacheFlushManager(
+      ResultCachingPolicy<T> policy, this.isPriorityAnalysisTarget)
+      : policy = policy,
+        maxActiveSize = policy.maxActiveSize,
+        maxIdleSize = policy.maxIdleSize,
+        maxSize = policy.maxIdleSize;
+
+  /**
+   * If [currentSize] is already less than [maxSize], returns an empty list.
+   * Otherwise returns [TargetedResult]s to flush from the cache to make
+   * [currentSize] less or equal to [maxSize].
+   *
+   * Results for priority files are never flushed, so this method might leave
+   * [currentSize] greater than [maxSize].
+   */
+  List<TargetedResult> flushToSize() {
+    // If still under the cap, done.
+    if (currentSize <= maxSize) {
+      return TargetedResult.EMPTY_LIST;
+    }
+    // Flush results until we are under the cap.
+    List<TargetedResult> resultsToFlush = <TargetedResult>[];
+    for (TargetedResult result in recentlyUsed) {
+      if (isPriorityAnalysisTarget(result.target)) {
+        continue;
+      }
+      resultsToFlush.add(result);
+      int size = resultSizeMap.remove(result);
+      assert(size != null);
+      currentSize -= size;
+      if (currentSize <= maxSize) {
+        break;
+      }
+    }
+    recentlyUsed.removeAll(resultsToFlush);
+    return resultsToFlush;
+  }
+
+  /**
+   * Notifies this manager that the corresponding analysis context is active.
+   */
+  void madeActive() {
+    maxSize = maxActiveSize;
+  }
+
+  /**
+   * Notifies this manager that the corresponding analysis context is idle.
+   * Returns [TargetedResult]s that should be flushed from the cache.
+   */
+  List<TargetedResult> madeIdle() {
+    maxSize = maxIdleSize;
+    return flushToSize();
+  }
+
+  /**
+   * Records that the given [result] was just read from the cache.
+   */
+  void resultAccessed(TargetedResult result) {
+    if (recentlyUsed.remove(result)) {
+      recentlyUsed.add(result);
+    }
+  }
+
+  /**
+   * Records that the given [newResult] and [newValue] were stored to the cache.
+   * Returns [TargetedResult]s that should be flushed from the cache.
+   */
+  List<TargetedResult> resultStored(TargetedResult newResult, T newValue) {
+    if (!recentlyUsed.remove(newResult)) {
+      int size = policy.measure(newValue);
+      resultSizeMap[newResult] = size;
+      currentSize += size;
+    }
+    recentlyUsed.add(newResult);
+    return flushToSize();
+  }
+
+  /**
+   * Records that the given [target] was just removed from to the cache.
+   */
+  void targetRemoved(AnalysisTarget target) {
+    List<TargetedResult> resultsToRemove = <TargetedResult>[];
+    for (TargetedResult result in recentlyUsed) {
+      if (result.target == target) {
+        resultsToRemove.add(result);
+        int size = resultSizeMap.remove(result);
+        assert(size != null);
+        currentSize -= size;
+      }
+    }
+    recentlyUsed.removeAll(resultsToRemove);
+  }
+}
+
+/**
+ * A single partition in an LRU cache of information related to analysis.
+ */
+abstract class CachePartition {
+  /**
+   * The context that owns this partition. Multiple contexts can reference a
+   * partition, but only one context can own it.
+   */
+  final InternalAnalysisContext context;
+
+  /**
+   * A table mapping caching policies to the cache flush managers.
+   */
+  final HashMap<ResultCachingPolicy, CacheFlushManager> _flushManagerMap =
+      new HashMap<ResultCachingPolicy, CacheFlushManager>();
+
+  /**
+   * The [StreamController] reporting [InvalidatedResult]s.
+   */
+  final StreamController<InvalidatedResult> _onResultInvalidated =
+      new StreamController<InvalidatedResult>.broadcast(sync: true);
+
+  /**
+   * A table mapping the targets belonging to this partition to the information
+   * known about those targets.
+   */
+  HashMap<AnalysisTarget, CacheEntry> _targetMap =
+      new HashMap<AnalysisTarget, CacheEntry>();
+
+  /**
+   * A set of the [Source] targets.
+   */
+  final HashSet<Source> _sources = new HashSet<Source>();
+
+  /**
+   * A table mapping full paths to lists of [Source]s with these full paths.
+   */
+  final Map<String, List<Source>> _pathToSources = <String, List<Source>>{};
+
+  /**
+   * Initialize a newly created cache partition, belonging to the given
+   * [context].
+   */
+  CachePartition(this.context);
+
+  /**
+   * Return a table mapping the targets known to the context to the information
+   * known about the target.
+   *
+   * <b>Note:</b> This method is only visible for use by [AnalysisCache] and
+   * should not be used for any other purpose.
+   */
+  Map<AnalysisTarget, CacheEntry> get map => _targetMap;
+
+  /**
+   * Return the stream that is notified when a value is invalidated.
+   */
+  Stream<InvalidatedResult> get onResultInvalidated =>
+      _onResultInvalidated.stream;
+
+  /**
+   * Notifies the partition that the client is going to stop using it.
+   */
+  void dispose() {
+    for (CacheEntry entry in _targetMap.values) {
+      entry.dispose();
+    }
+    _targetMap.clear();
+  }
+
+  /**
+   * Return the entry associated with the given [target].
+   */
+  CacheEntry get(AnalysisTarget target) => _targetMap[target];
+
+  /**
+   * Return [Source]s whose full path is equal to the given [path].
+   * Maybe empty, but not `null`.
+   */
+  List<Source> getSourcesWithFullName(String path) {
+    List<Source> sources = _pathToSources[path];
+    return sources != null ? sources : Source.EMPTY_LIST;
+  }
+
+  /**
+   * Return `true` if this partition is responsible for the given [target].
+   */
+  bool isResponsibleFor(AnalysisTarget target);
+
+  /**
+   * Return an iterator returning all of the map entries mapping targets to
+   * cache entries.
+   */
+  MapIterator<AnalysisTarget, CacheEntry> iterator() =>
+      new SingleMapIterator<AnalysisTarget, CacheEntry>(_targetMap);
+
+  /**
+   * Puts the given [entry] into the partition.
+   */
+  void put(CacheEntry entry) {
+    AnalysisTarget target = entry.target;
+    if (entry._partition != null) {
+      throw new StateError(
+          'The entry for $target is already in ${entry._partition}');
+    }
+    entry._partition = this;
+    entry.fixExceptionState();
+    _targetMap[target] = entry;
+    _addIfSource(target);
+  }
+
+  /**
+   * Remove all information related to the given [target] from this partition.
+   * Return the entry associated with the target, or `null` if there was cache
+   * entry for the target.
+   */
+  CacheEntry remove(AnalysisTarget target) {
+    for (CacheFlushManager flushManager in _flushManagerMap.values) {
+      flushManager.targetRemoved(target);
+    }
+    CacheEntry entry = _targetMap.remove(target);
+    if (entry != null) {
+      entry._invalidateAll();
+    }
+    _removeIfSource(target);
+    return entry;
+  }
+
+  /**
+   * Records that a value of the result described by the given [descriptor]
+   * for the given [target] was just read from the cache.
+   */
+  void resultAccessed(AnalysisTarget target, ResultDescriptor descriptor) {
+    CacheFlushManager flushManager = _getFlushManager(descriptor);
+    TargetedResult result = new TargetedResult(target, descriptor);
+    flushManager.resultAccessed(result);
+  }
+
+  /**
+   * Records that the given [result] was just stored into the cache.
+   */
+  void resultStored(TargetedResult result, Object value) {
+    CacheFlushManager flushManager = _getFlushManager(result.result);
+    List<TargetedResult> resultsToFlush =
+        flushManager.resultStored(result, value);
+    for (TargetedResult result in resultsToFlush) {
+      CacheEntry entry = get(result.target);
+      if (entry != null) {
+        ResultData data = entry._resultMap[result.result];
+        if (data != null) {
+          data.flush();
+        }
+      }
+    }
+  }
+
+  /**
+   * Return the number of targets that are mapped to cache entries.
+   */
+  int size() => _targetMap.length;
+
+  /**
+   * If the given [target] is a [Source], adds it to [_sources].
+   */
+  void _addIfSource(AnalysisTarget target) {
+    if (target is Source) {
+      _sources.add(target);
+      {
+        String fullName = target.fullName;
+        _pathToSources.putIfAbsent(fullName, () => <Source>[]).add(target);
+      }
+    }
+  }
+
+  ResultData _getDataFor(TargetedResult result) {
+    CacheEntry entry = context.analysisCache.get(result.target);
+    return entry != null ? entry._resultMap[result.result] : null;
+  }
+
+  /**
+   * Return the [CacheFlushManager] for the given [descriptor], not `null`.
+   */
+  CacheFlushManager _getFlushManager(ResultDescriptor descriptor) {
+    ResultCachingPolicy policy = descriptor.cachingPolicy;
+    if (identical(policy, DEFAULT_CACHING_POLICY)) {
+      return UnlimitedCacheFlushManager.INSTANCE;
+    }
+    CacheFlushManager manager = _flushManagerMap[policy];
+    if (manager == null) {
+      manager = new CacheFlushManager(policy, _isPriorityAnalysisTarget);
+      _flushManagerMap[policy] = manager;
+    }
+    return manager;
+  }
+
+  bool _isPriorityAnalysisTarget(AnalysisTarget target) {
+    return context.priorityTargets.contains(target);
+  }
+
+  /**
+   * If the given [target] is a [Source], remove it from the list of [_sources].
+   */
+  void _removeIfSource(AnalysisTarget target) {
+    if (target is Source) {
+      _sources.remove(target);
+      String fullName = target.fullName;
+      List<Source> sources = _pathToSources[fullName];
+      if (sources != null) {
+        sources.remove(target);
+        if (sources.isEmpty) {
+          _pathToSources.remove(fullName);
+        }
+      }
+    }
+  }
+}
+
+/**
+ * The description for a change.
+ */
+class Delta {
+  final Source source;
+
+  Delta(this.source);
+
+  /**
+   * Check whether this delta affects the result described by the given
+   * [descriptor] and [target].
+   */
+  DeltaResult validate(InternalAnalysisContext context, AnalysisTarget target,
+      ResultDescriptor descriptor) {
+    return DeltaResult.INVALIDATE;
+  }
+}
+
+/**
+ * The possible results of validating analysis results againt a [Delta].
+ */
+enum DeltaResult { INVALIDATE, KEEP_CONTINUE, STOP }
+
+/**
+ * [InvalidatedResult] describes an invalidated result.
+ */
+class InvalidatedResult {
+  /**
+   * The target in which the result was invalidated.
+   */
+  final CacheEntry entry;
+
+  /**
+   * The descriptor of the result which was invalidated.
+   */
+  final ResultDescriptor descriptor;
+
+  InvalidatedResult(this.entry, this.descriptor);
+
+  @override
+  String toString() => '$descriptor of ${entry.target}';
+}
+
+/**
+ * The data about a single analysis result that is stored in a [CacheEntry].
+ */
+// TODO(brianwilkerson) Consider making this a generic class so that the value
+// can be typed.
+class ResultData {
+  /**
+   * The [ResultDescriptor] this result is for.
+   */
+  final ResultDescriptor descriptor;
+
+  /**
+   * The state of the cached value.
+   */
+  CacheState state;
+
+  /**
+   * The value being cached, or the default value for the result if there is no
+   * value (for example, when the [state] is [CacheState.INVALID]).
+   */
+  Object value;
+
+  /**
+   * A list of the results on which this result depends.
+   */
+  List<TargetedResult> dependedOnResults = <TargetedResult>[];
+
+  /**
+   * A list of the results that depend on this result.
+   */
+  Set<TargetedResult> dependentResults = new Set<TargetedResult>();
+
+  /**
+   * Initialize a newly created result holder to represent the value of data
+   * described by the given [descriptor].
+   */
+  ResultData(this.descriptor) {
+    state = CacheState.INVALID;
+    value = descriptor.defaultValue;
+  }
+
+  /**
+   * Flush this value.
+   */
+  void flush() {
+    state = CacheState.FLUSHED;
+    value = descriptor.defaultValue;
+  }
+}
+
+/**
+ * A cache partition that contains all of the targets in the SDK.
+ */
+class SdkCachePartition extends CachePartition {
+  /**
+   * Initialize a newly created cache partition, belonging to the given
+   * [context].
+   */
+  SdkCachePartition(InternalAnalysisContext context) : super(context);
+
+  @override
+  bool isResponsibleFor(AnalysisTarget target) {
+    if (target is AnalysisContextTarget) {
+      return true;
+    }
+    Source source = target.source;
+    return source != null && source.isInSystemLibrary;
+  }
+}
+
+/**
+ * A cache partition that contains all targets not contained in other partitions.
+ */
+class UniversalCachePartition extends CachePartition {
+  /**
+   * Initialize a newly created cache partition, belonging to the given
+   * [context].
+   */
+  UniversalCachePartition(InternalAnalysisContext context) : super(context);
+
+  @override
+  bool isResponsibleFor(AnalysisTarget target) => true;
+}
+
+/**
+ * [CacheFlushManager] that does nothing, results are never flushed.
+ */
+class UnlimitedCacheFlushManager extends CacheFlushManager {
+  static final CacheFlushManager INSTANCE = new UnlimitedCacheFlushManager();
+
+  UnlimitedCacheFlushManager() : super(DEFAULT_CACHING_POLICY, (_) => false);
+
+  @override
+  void resultAccessed(TargetedResult result) {}
+
+  @override
+  List<TargetedResult> resultStored(TargetedResult newResult, newValue) {
+    return TargetedResult.EMPTY_LIST;
+  }
+
+  @override
+  void targetRemoved(AnalysisTarget target) {}
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/context/context.dart b/mojo/public/dart/third_party/analyzer/lib/src/context/context.dart
new file mode 100644
index 0000000..f472ed1
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/context/context.dart
@@ -0,0 +1,2098 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.src.context.context;
+
+import 'dart:async';
+import 'dart:collection';
+
+import 'package:analyzer/instrumentation/instrumentation.dart';
+import 'package:analyzer/plugin/task.dart';
+import 'package:analyzer/src/cancelable_future.dart';
+import 'package:analyzer/src/context/cache.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/constant.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart'
+    hide
+        AnalysisCache,
+        CachePartition,
+        SdkCachePartition,
+        UniversalCachePartition,
+        WorkManager;
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/html.dart' as ht show HtmlUnit;
+import 'package:analyzer/src/generated/incremental_resolver.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/utilities_collection.dart';
+import 'package:analyzer/src/task/dart.dart';
+import 'package:analyzer/src/task/dart_work_manager.dart';
+import 'package:analyzer/src/task/driver.dart';
+import 'package:analyzer/src/task/incremental_element_builder.dart';
+import 'package:analyzer/src/task/manager.dart';
+import 'package:analyzer/task/dart.dart';
+import 'package:analyzer/task/general.dart';
+import 'package:analyzer/task/html.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:html/dom.dart' show Document;
+
+/**
+ * Type of callback functions used by PendingFuture. Functions of this type
+ * should perform a computation based on the data in [entry] and return it. If
+ * the computation can't be performed yet because more analysis is needed,
+ * `null` should be returned.
+ *
+ * The function may also throw an exception, in which case the corresponding
+ * future will be completed with failure.
+ *
+ * Because this function is called while the state of analysis is being updated,
+ * it should be free of side effects so that it doesn't cause reentrant changes
+ * to the analysis state.
+ */
+typedef T PendingFutureComputer<T>(CacheEntry entry);
+
+/**
+ * An [AnalysisContext] in which analysis can be performed.
+ */
+class AnalysisContextImpl implements InternalAnalysisContext {
+  /**
+   * The next context identifier.
+   */
+  static int _NEXT_ID = 0;
+
+  /**
+   * The unique identifier of this context.
+   */
+  final int _id = _NEXT_ID++;
+
+  /**
+   * A client-provided name used to identify this context, or `null` if the
+   * client has not provided a name.
+   */
+  String name;
+
+  /**
+   * The set of analysis options controlling the behavior of this context.
+   */
+  AnalysisOptionsImpl _options = new AnalysisOptionsImpl();
+
+  /**
+   * A flag indicating whether this context is disposed.
+   */
+  bool _disposed = false;
+
+  /**
+   * A cache of content used to override the default content of a source.
+   */
+  ContentCache _contentCache = new ContentCache();
+
+  /**
+   * The source factory used to create the sources that can be analyzed in this
+   * context.
+   */
+  SourceFactory _sourceFactory;
+
+  /**
+   * The set of declared variables used when computing constant values.
+   */
+  DeclaredVariables _declaredVariables = new DeclaredVariables();
+
+  /**
+   * The partition that contains analysis results that are not shared with other
+   * contexts.
+   */
+  CachePartition _privatePartition;
+
+  /**
+   * The cache in which information about the results associated with targets
+   * are stored.
+   */
+  AnalysisCache _cache;
+
+  /**
+   * The task manager used to manage the tasks used to analyze code.
+   */
+  TaskManager _taskManager;
+
+  /**
+   * A list of all [WorkManager]s used by this context.
+   */
+  final List<WorkManager> workManagers = <WorkManager>[];
+
+  /**
+   * The [DartWorkManager] instance that performs Dart specific scheduling.
+   */
+  DartWorkManager dartWorkManager;
+
+  /**
+   * The analysis driver used to perform analysis.
+   */
+  AnalysisDriver driver;
+
+  /**
+   * A list containing sources for which data should not be flushed.
+   */
+  List<Source> _priorityOrder = <Source>[];
+
+  /**
+   * A map from all sources for which there are futures pending to a list of
+   * the corresponding PendingFuture objects.  These sources will be analyzed
+   * in the same way as priority sources, except with higher priority.
+   */
+  HashMap<AnalysisTarget, List<PendingFuture>> _pendingFutureTargets =
+      new HashMap<AnalysisTarget, List<PendingFuture>>();
+
+  /**
+   * A table mapping sources to the change notices that are waiting to be
+   * returned related to that source.
+   */
+  HashMap<Source, ChangeNoticeImpl> _pendingNotices =
+      new HashMap<Source, ChangeNoticeImpl>();
+
+  /**
+   * The [TypeProvider] for this context, `null` if not yet created.
+   */
+  TypeProvider _typeProvider;
+
+  /**
+   * The controller for sending [SourcesChangedEvent]s.
+   */
+  StreamController<SourcesChangedEvent> _onSourcesChangedController;
+
+  /**
+   * A subscription for a stream of events indicating when files are (and are
+   * not) being implicitly analyzed.
+   */
+  StreamController<ImplicitAnalysisEvent> _implicitAnalysisEventsController;
+
+  /**
+   * The listeners that are to be notified when various analysis results are
+   * produced in this context.
+   */
+  List<AnalysisListener> _listeners = new List<AnalysisListener>();
+
+  /**
+   * The most recently incrementally resolved source, or `null` when it was
+   * already validated, or the most recent change was not incrementally resolved.
+   */
+  Source incrementalResolutionValidation_lastUnitSource;
+
+  /**
+   * The most recently incrementally resolved library source, or `null` when it
+   * was already validated, or the most recent change was not incrementally
+   * resolved.
+   */
+  Source incrementalResolutionValidation_lastLibrarySource;
+
+  /**
+   * The result of incremental resolution result of
+   * [incrementalResolutionValidation_lastSource].
+   */
+  CompilationUnit incrementalResolutionValidation_lastUnit;
+
+  /**
+   * A factory to override how the [ResolverVisitor] is created.
+   */
+  ResolverVisitorFactory resolverVisitorFactory;
+
+  /**
+   * A factory to override how the [TypeResolverVisitor] is created.
+   */
+  TypeResolverVisitorFactory typeResolverVisitorFactory;
+
+  /**
+   * A factory to override how [LibraryResolver] is created.
+   */
+  LibraryResolverFactory libraryResolverFactory;
+
+  /**
+   * Initialize a newly created analysis context.
+   */
+  AnalysisContextImpl() {
+    _privatePartition = new UniversalCachePartition(this);
+    _cache = createCacheFromSourceFactory(null);
+    _taskManager = AnalysisEngine.instance.taskManager;
+    for (WorkManagerFactory factory
+        in AnalysisEngine.instance.enginePlugin.workManagerFactories) {
+      WorkManager workManager = factory(this);
+      if (workManager != null) {
+        workManagers.add(workManager);
+        if (workManager is DartWorkManager) {
+          dartWorkManager = workManager;
+        }
+      }
+    }
+    driver = new AnalysisDriver(_taskManager, workManagers, this);
+    _onSourcesChangedController =
+        new StreamController<SourcesChangedEvent>.broadcast();
+    _implicitAnalysisEventsController =
+        new StreamController<ImplicitAnalysisEvent>.broadcast();
+  }
+
+  @override
+  AnalysisCache get analysisCache => _cache;
+
+  @override
+  AnalysisOptions get analysisOptions => _options;
+
+  @override
+  void set analysisOptions(AnalysisOptions options) {
+    bool needsRecompute = this._options.analyzeFunctionBodiesPredicate !=
+            options.analyzeFunctionBodiesPredicate ||
+        this._options.generateImplicitErrors !=
+            options.generateImplicitErrors ||
+        this._options.generateSdkErrors != options.generateSdkErrors ||
+        this._options.dart2jsHint != options.dart2jsHint ||
+        (this._options.hint && !options.hint) ||
+        (this._options.lint && !options.lint) ||
+        this._options.preserveComments != options.preserveComments ||
+        this._options.enableStrictCallChecks !=
+            options.enableStrictCallChecks ||
+        this._options.enableSuperMixins != options.enableSuperMixins;
+    int cacheSize = options.cacheSize;
+    if (this._options.cacheSize != cacheSize) {
+      this._options.cacheSize = cacheSize;
+    }
+    this._options.analyzeFunctionBodiesPredicate =
+        options.analyzeFunctionBodiesPredicate;
+    this._options.generateImplicitErrors = options.generateImplicitErrors;
+    this._options.generateSdkErrors = options.generateSdkErrors;
+    this._options.dart2jsHint = options.dart2jsHint;
+    this._options.enableStrictCallChecks = options.enableStrictCallChecks;
+    this._options.enableSuperMixins = options.enableSuperMixins;
+    this._options.hint = options.hint;
+    this._options.incremental = options.incremental;
+    this._options.incrementalApi = options.incrementalApi;
+    this._options.incrementalValidation = options.incrementalValidation;
+    this._options.lint = options.lint;
+    this._options.preserveComments = options.preserveComments;
+    if (needsRecompute) {
+      for (WorkManager workManager in workManagers) {
+        workManager.onAnalysisOptionsChanged();
+      }
+    }
+  }
+
+  @override
+  void set analysisPriorityOrder(List<Source> sources) {
+    if (sources == null || sources.isEmpty) {
+      _priorityOrder = Source.EMPTY_LIST;
+    } else {
+      while (sources.remove(null)) {
+        // Nothing else to do.
+      }
+      if (sources.isEmpty) {
+        _priorityOrder = Source.EMPTY_LIST;
+      } else {
+        _priorityOrder = sources;
+      }
+    }
+    for (WorkManager workManager in workManagers) {
+      workManager.applyPriorityTargets(_priorityOrder);
+    }
+  }
+
+  @override
+  set contentCache(ContentCache value) {
+    _contentCache = value;
+  }
+
+  @override
+  DeclaredVariables get declaredVariables => _declaredVariables;
+
+  @override
+  List<AnalysisTarget> get explicitTargets {
+    List<AnalysisTarget> targets = <AnalysisTarget>[];
+    MapIterator<AnalysisTarget, CacheEntry> iterator = _cache.iterator();
+    while (iterator.moveNext()) {
+      if (iterator.value.explicitlyAdded) {
+        targets.add(iterator.key);
+      }
+    }
+    return targets;
+  }
+
+  @override
+  List<Source> get htmlSources => _getSources(SourceKind.HTML);
+
+  @override
+  Stream<ImplicitAnalysisEvent> get implicitAnalysisEvents =>
+      _implicitAnalysisEventsController.stream;
+
+  @override
+  bool get isDisposed => _disposed;
+
+  @override
+  List<Source> get launchableClientLibrarySources {
+    List<Source> sources = <Source>[];
+    for (Source source in _cache.sources) {
+      CacheEntry entry = _cache.get(source);
+      if (entry.getValue(SOURCE_KIND) == SourceKind.LIBRARY &&
+          !source.isInSystemLibrary &&
+          isClientLibrary(source)) {
+        sources.add(source);
+      }
+    }
+    return sources;
+  }
+
+  @override
+  List<Source> get launchableServerLibrarySources {
+    List<Source> sources = <Source>[];
+    for (Source source in _cache.sources) {
+      CacheEntry entry = _cache.get(source);
+      if (source is Source &&
+          entry.getValue(SOURCE_KIND) == SourceKind.LIBRARY &&
+          !source.isInSystemLibrary &&
+          isServerLibrary(source)) {
+        sources.add(source);
+      }
+    }
+    return sources;
+  }
+
+  @override
+  List<Source> get librarySources => _getSources(SourceKind.LIBRARY);
+
+  @override
+  Stream<SourcesChangedEvent> get onSourcesChanged =>
+      _onSourcesChangedController.stream;
+
+  /**
+   * Make _pendingFutureSources available to unit tests.
+   */
+  HashMap<AnalysisTarget,
+      List<PendingFuture>> get pendingFutureSources_forTesting =>
+      _pendingFutureTargets;
+
+  @override
+  List<Source> get prioritySources => _priorityOrder;
+
+  @override
+  List<AnalysisTarget> get priorityTargets => prioritySources;
+
+  @override
+  CachePartition get privateAnalysisCachePartition => _privatePartition;
+
+  @override
+  SourceFactory get sourceFactory => _sourceFactory;
+
+  @override
+  void set sourceFactory(SourceFactory factory) {
+    if (identical(_sourceFactory, factory)) {
+      return;
+    } else if (factory.context != null) {
+      throw new IllegalStateException(
+          "Source factories cannot be shared between contexts");
+    }
+    if (_sourceFactory != null) {
+      _sourceFactory.context = null;
+    }
+    factory.context = this;
+    _sourceFactory = factory;
+    _cache = createCacheFromSourceFactory(factory);
+    for (WorkManager workManager in workManagers) {
+      workManager.onSourceFactoryChanged();
+    }
+  }
+
+  @override
+  List<Source> get sources {
+    return _cache.sources.toList();
+  }
+
+  /**
+   * Return a list of the sources that would be processed by
+   * [performAnalysisTask]. This method duplicates, and must therefore be kept
+   * in sync with, [getNextAnalysisTask]. This method is intended to be used for
+   * testing purposes only.
+   */
+  List<Source> get sourcesNeedingProcessing {
+    HashSet<Source> sources = new HashSet<Source>();
+    bool hintsEnabled = _options.hint;
+    bool lintsEnabled = _options.lint;
+
+    MapIterator<AnalysisTarget, CacheEntry> iterator =
+        _privatePartition.iterator();
+    while (iterator.moveNext()) {
+      AnalysisTarget target = iterator.key;
+      if (target is Source) {
+        _getSourcesNeedingProcessing(
+            target, iterator.value, false, hintsEnabled, lintsEnabled, sources);
+      }
+    }
+    return new List<Source>.from(sources);
+  }
+
+  @override
+  AnalysisContextStatistics get statistics {
+    AnalysisContextStatisticsImpl statistics =
+        new AnalysisContextStatisticsImpl();
+    // TODO(brianwilkerson) Implement this.
+//    visitCacheItems(statistics._internalPutCacheItem);
+//    statistics.partitionData = _cache.partitionData;
+    return statistics;
+  }
+
+  List<Source> get test_priorityOrder => _priorityOrder;
+
+  @override
+  TypeProvider get typeProvider {
+    // Make sure a task didn't accidentally try to call back into the context
+    // to retrieve the type provider.
+    assert(!driver.isTaskRunning);
+
+    if (_typeProvider != null) {
+      return _typeProvider;
+    }
+    Source coreSource = sourceFactory.forUri(DartSdk.DART_CORE);
+    if (coreSource == null) {
+      throw new AnalysisException("Could not create a source for dart:core");
+    }
+    LibraryElement coreElement = computeLibraryElement(coreSource);
+    if (coreElement == null) {
+      throw new AnalysisException("Could not create an element for dart:core");
+    }
+    Source asyncSource = sourceFactory.forUri(DartSdk.DART_ASYNC);
+    if (asyncSource == null) {
+      throw new AnalysisException("Could not create a source for dart:async");
+    }
+    LibraryElement asyncElement = computeLibraryElement(asyncSource);
+    if (asyncElement == null) {
+      throw new AnalysisException("Could not create an element for dart:async");
+    }
+    _typeProvider = new TypeProviderImpl(coreElement, asyncElement);
+    return _typeProvider;
+  }
+
+  /**
+   * Sets the [TypeProvider] for this context.
+   */
+  void set typeProvider(TypeProvider typeProvider) {
+    _typeProvider = typeProvider;
+  }
+
+  @override
+  void addListener(AnalysisListener listener) {
+    if (!_listeners.contains(listener)) {
+      _listeners.add(listener);
+    }
+  }
+
+  @override
+  void applyAnalysisDelta(AnalysisDelta delta) {
+    ChangeSet changeSet = new ChangeSet();
+    delta.analysisLevels.forEach((Source source, AnalysisLevel level) {
+      if (level == AnalysisLevel.NONE) {
+        changeSet.removedSource(source);
+      } else {
+        changeSet.addedSource(source);
+      }
+    });
+    applyChanges(changeSet);
+  }
+
+  @override
+  void applyChanges(ChangeSet changeSet) {
+    if (changeSet.isEmpty) {
+      return;
+    }
+    //
+    // First, compute the list of sources that have been removed.
+    //
+    List<Source> removedSources =
+        new List<Source>.from(changeSet.removedSources);
+    for (SourceContainer container in changeSet.removedContainers) {
+      _addSourcesInContainer(removedSources, container);
+    }
+    //
+    // Then determine which cached results are no longer valid.
+    //
+    for (Source source in changeSet.addedSources) {
+      _sourceAvailable(source);
+    }
+    for (Source source in changeSet.changedSources) {
+      if (_contentCache.getContents(source) != null) {
+        // This source is overridden in the content cache, so the change will
+        // have no effect. Just ignore it to avoid wasting time doing
+        // re-analysis.
+        continue;
+      }
+      _sourceChanged(source);
+    }
+    changeSet.changedContents.forEach((Source key, String value) {
+      _contentsChanged(key, value, false);
+    });
+    changeSet.changedRanges
+        .forEach((Source source, ChangeSet_ContentChange change) {
+      _contentRangeChanged(source, change.contents, change.offset,
+          change.oldLength, change.newLength);
+    });
+    for (Source source in changeSet.deletedSources) {
+      _sourceDeleted(source);
+    }
+    for (Source source in removedSources) {
+      _sourceRemoved(source);
+    }
+    for (WorkManager workManager in workManagers) {
+      workManager.applyChange(
+          changeSet.addedSources, changeSet.changedSources, removedSources);
+    }
+    _onSourcesChangedController.add(new SourcesChangedEvent(changeSet));
+  }
+
+  @override
+  String computeDocumentationComment(Element element) {
+    if (element == null) {
+      return null;
+    }
+    Source source = element.source;
+    if (source == null) {
+      return null;
+    }
+    CompilationUnit unit = parseCompilationUnit(source);
+    if (unit == null) {
+      return null;
+    }
+    NodeLocator locator = new NodeLocator(element.nameOffset);
+    AstNode nameNode = locator.searchWithin(unit);
+    while (nameNode != null) {
+      if (nameNode is AnnotatedNode) {
+        Comment comment = nameNode.documentationComment;
+        if (comment == null) {
+          return null;
+        }
+        StringBuffer buffer = new StringBuffer();
+        List<Token> tokens = comment.tokens;
+        for (int i = 0; i < tokens.length; i++) {
+          if (i > 0) {
+            buffer.write("\n");
+          }
+          buffer.write(tokens[i].lexeme);
+        }
+        return buffer.toString();
+      }
+      nameNode = nameNode.parent;
+    }
+    return null;
+  }
+
+  @override
+  List<AnalysisError> computeErrors(Source source) {
+    String name = source.shortName;
+    if (AnalysisEngine.isDartFileName(name)) {
+      return computeResult(source, DART_ERRORS);
+    } else if (AnalysisEngine.isHtmlFileName(name)) {
+      return computeResult(source, HTML_ERRORS);
+    }
+    return AnalysisError.NO_ERRORS;
+  }
+
+  @override
+  List<Source> computeExportedLibraries(Source source) =>
+      computeResult(source, EXPORTED_LIBRARIES);
+
+  @override
+  @deprecated
+  HtmlElement computeHtmlElement(Source source) {
+    // TODO(brianwilkerson) Remove this method after switching to the new task
+    // model.
+    throw new UnimplementedError('Not supported in the new task model');
+  }
+
+  @override
+  List<Source> computeImportedLibraries(Source source) =>
+      computeResult(source, EXPLICITLY_IMPORTED_LIBRARIES);
+
+  @override
+  SourceKind computeKindOf(Source source) {
+    String name = source.shortName;
+    if (AnalysisEngine.isDartFileName(name)) {
+      return computeResult(source, SOURCE_KIND);
+    } else if (AnalysisEngine.isHtmlFileName(name)) {
+      return SourceKind.HTML;
+    }
+    return SourceKind.UNKNOWN;
+  }
+
+  @override
+  LibraryElement computeLibraryElement(Source source) {
+    //_computeResult(source, HtmlEntry.ELEMENT);
+    return computeResult(source, LIBRARY_ELEMENT);
+  }
+
+  @override
+  LineInfo computeLineInfo(Source source) => computeResult(source, LINE_INFO);
+
+  @override
+  @deprecated
+  CompilationUnit computeResolvableCompilationUnit(Source source) {
+    return null;
+  }
+
+  @override
+  CancelableFuture<CompilationUnit> computeResolvedCompilationUnitAsync(
+      Source unitSource, Source librarySource) {
+    if (!AnalysisEngine.isDartFileName(unitSource.shortName) ||
+        !AnalysisEngine.isDartFileName(librarySource.shortName)) {
+      return new CancelableFuture.error(new AnalysisNotScheduledError());
+    }
+    var unitTarget = new LibrarySpecificUnit(librarySource, unitSource);
+    return new _AnalysisFutureHelper<CompilationUnit>(this)
+        .computeAsync(unitTarget, (CacheEntry entry) {
+      CacheState state = entry.getState(RESOLVED_UNIT);
+      if (state == CacheState.ERROR) {
+        throw entry.exception;
+      } else if (state == CacheState.INVALID) {
+        return null;
+      }
+      return entry.getValue(RESOLVED_UNIT);
+    }, () {
+      dartWorkManager.addPriorityResult(unitTarget, RESOLVED_UNIT);
+    });
+  }
+
+  @override
+  Object /*V*/ computeResult(
+      AnalysisTarget target, ResultDescriptor /*<V>*/ descriptor) {
+    CacheEntry entry = getCacheEntry(target);
+    CacheState state = entry.getState(descriptor);
+    if (state == CacheState.FLUSHED || state == CacheState.INVALID) {
+      driver.computeResult(target, descriptor);
+    }
+    state = entry.getState(descriptor);
+    if (state == CacheState.ERROR) {
+      throw new AnalysisException(
+          'Cannot compute $descriptor for $target', entry.exception);
+    }
+    return entry.getValue(descriptor);
+  }
+
+  /**
+   * Create an analysis cache based on the given source [factory].
+   */
+  AnalysisCache createCacheFromSourceFactory(SourceFactory factory) {
+    if (factory == null) {
+      return new AnalysisCache(<CachePartition>[_privatePartition]);
+    }
+    DartSdk sdk = factory.dartSdk;
+    if (sdk == null) {
+      return new AnalysisCache(<CachePartition>[_privatePartition]);
+    }
+    return new AnalysisCache(<CachePartition>[
+      AnalysisEngine.instance.partitionManager_new.forSdk(sdk),
+      _privatePartition
+    ]);
+  }
+
+  @override
+  void dispose() {
+    _disposed = true;
+    for (List<PendingFuture> pendingFutures in _pendingFutureTargets.values) {
+      for (PendingFuture pendingFuture in pendingFutures) {
+        pendingFuture.forciblyComplete();
+      }
+    }
+    _pendingFutureTargets.clear();
+    _privatePartition.dispose();
+  }
+
+  @override
+  List<CompilationUnit> ensureResolvedDartUnits(Source unitSource) {
+    // Check every library.
+    List<CompilationUnit> units = <CompilationUnit>[];
+    List<Source> containingLibraries = getLibrariesContaining(unitSource);
+    for (Source librarySource in containingLibraries) {
+      LibrarySpecificUnit target =
+          new LibrarySpecificUnit(librarySource, unitSource);
+      CompilationUnit unit = getResult(target, RESOLVED_UNIT);
+      if (unit == null) {
+        units = null;
+        break;
+      }
+      units.add(unit);
+    }
+    // If we have results, then we're done.
+    if (units != null) {
+      return units;
+    }
+    // Schedule recomputing RESOLVED_UNIT results.
+    for (Source librarySource in containingLibraries) {
+      LibrarySpecificUnit target =
+          new LibrarySpecificUnit(librarySource, unitSource);
+      if (_cache.getState(target, RESOLVED_UNIT) == CacheState.FLUSHED) {
+        dartWorkManager.addPriorityResult(target, RESOLVED_UNIT);
+      }
+    }
+    return null;
+  }
+
+  @override
+  bool exists(Source source) {
+    if (source == null) {
+      return false;
+    }
+    if (_contentCache.getContents(source) != null) {
+      return true;
+    }
+    return source.exists();
+  }
+
+  @override
+  CacheEntry getCacheEntry(AnalysisTarget target) {
+    CacheEntry entry = _cache.get(target);
+    if (entry == null) {
+      entry = new CacheEntry(target);
+      if (target is Source) {
+        entry.modificationTime = getModificationStamp(target);
+      }
+      _cache.put(entry);
+      if (target is Source) {
+        _implicitAnalysisEventsController
+            .add(new ImplicitAnalysisEvent(target, true));
+      }
+    }
+    return entry;
+  }
+
+  @override
+  CompilationUnitElement getCompilationUnitElement(
+      Source unitSource, Source librarySource) {
+    AnalysisTarget target = new LibrarySpecificUnit(librarySource, unitSource);
+    return getResult(target, COMPILATION_UNIT_ELEMENT);
+  }
+
+  @override
+  TimestampedData<String> getContents(Source source) {
+    String contents = _contentCache.getContents(source);
+    if (contents != null) {
+      return new TimestampedData<String>(
+          _contentCache.getModificationStamp(source), contents);
+    }
+    return source.contents;
+  }
+
+  @override
+  InternalAnalysisContext getContextFor(Source source) {
+    InternalAnalysisContext context = _cache.getContextFor(source);
+    return context == null ? this : context;
+  }
+
+  @override
+  Element getElement(ElementLocation location) {
+    // TODO(brianwilkerson) This should not be a "get" method.
+    try {
+      List<String> components = location.components;
+      Source source = _computeSourceFromEncoding(components[0]);
+      String sourceName = source.shortName;
+      if (AnalysisEngine.isDartFileName(sourceName)) {
+        ElementImpl element = computeLibraryElement(source) as ElementImpl;
+        for (int i = 1; i < components.length; i++) {
+          if (element == null) {
+            return null;
+          }
+          element = element.getChild(components[i]);
+        }
+        return element;
+      }
+    } catch (exception) {
+      // If the location cannot be decoded for some reason then the underlying
+      // cause should have been logged already and we can fall though to return
+      // null.
+    }
+    return null;
+  }
+
+  @override
+  AnalysisErrorInfo getErrors(Source source) {
+    List<AnalysisError> allErrors = <AnalysisError>[];
+    for (WorkManager workManager in workManagers) {
+      List<AnalysisError> errors = workManager.getErrors(source);
+      allErrors.addAll(errors);
+    }
+    LineInfo lineInfo = getLineInfo(source);
+    return new AnalysisErrorInfoImpl(allErrors, lineInfo);
+  }
+
+  @override
+  @deprecated
+  HtmlElement getHtmlElement(Source source) {
+    // TODO(brianwilkerson) Remove this method after switching to the new task
+    // model.
+    throw new UnimplementedError('Not supported in the new task model');
+  }
+
+  @override
+  List<Source> getHtmlFilesReferencing(Source source) {
+    if (!AnalysisEngine.isDartFileName(source.shortName)) {
+      return Source.EMPTY_LIST;
+    }
+    List<Source> htmlSources = <Source>[];
+    List<Source> librarySources = getLibrariesContaining(source);
+    for (Source source in _cache.sources) {
+      if (AnalysisEngine.isHtmlFileName(source.shortName)) {
+        List<Source> referencedLibraries =
+            getResult(source, REFERENCED_LIBRARIES);
+        if (_containsAny(referencedLibraries, librarySources)) {
+          htmlSources.add(source);
+        }
+      }
+    }
+    if (htmlSources.isEmpty) {
+      return Source.EMPTY_LIST;
+    }
+    return htmlSources;
+  }
+
+  @override
+  SourceKind getKindOf(Source source) {
+    String name = source.shortName;
+    if (AnalysisEngine.isDartFileName(name)) {
+      return getResult(source, SOURCE_KIND);
+    } else if (AnalysisEngine.isHtmlFileName(name)) {
+      return SourceKind.HTML;
+    }
+    return SourceKind.UNKNOWN;
+  }
+
+  @override
+  List<Source> getLibrariesContaining(Source source) {
+    SourceKind kind = getKindOf(source);
+    if (kind == SourceKind.LIBRARY) {
+      return <Source>[source];
+    }
+    return dartWorkManager.getLibrariesContainingPart(source);
+  }
+
+  @override
+  List<Source> getLibrariesDependingOn(Source librarySource) {
+    List<Source> dependentLibraries = <Source>[];
+    for (Source source in _cache.sources) {
+      CacheEntry entry = _cache.get(source);
+      if (entry.getValue(SOURCE_KIND) == SourceKind.LIBRARY) {
+        if (_contains(entry.getValue(EXPORTED_LIBRARIES), librarySource)) {
+          dependentLibraries.add(source);
+        }
+        if (_contains(entry.getValue(IMPORTED_LIBRARIES), librarySource)) {
+          dependentLibraries.add(source);
+        }
+      }
+    }
+    if (dependentLibraries.isEmpty) {
+      return Source.EMPTY_LIST;
+    }
+    return dependentLibraries;
+  }
+
+  @override
+  List<Source> getLibrariesReferencedFromHtml(Source htmlSource) {
+    CacheEntry entry = _cache.get(htmlSource);
+    if (entry != null) {
+      return entry.getValue(REFERENCED_LIBRARIES);
+    }
+    return Source.EMPTY_LIST;
+  }
+
+  @override
+  LibraryElement getLibraryElement(Source source) =>
+      getResult(source, LIBRARY_ELEMENT);
+
+  @override
+  LineInfo getLineInfo(Source source) => getResult(source, LINE_INFO);
+
+  @override
+  int getModificationStamp(Source source) {
+    int stamp = _contentCache.getModificationStamp(source);
+    if (stamp != null) {
+      return stamp;
+    }
+    return source.modificationStamp;
+  }
+
+  @override
+  ChangeNoticeImpl getNotice(Source source) {
+    ChangeNoticeImpl notice = _pendingNotices[source];
+    if (notice == null) {
+      notice = new ChangeNoticeImpl(source);
+      _pendingNotices[source] = notice;
+    }
+    return notice;
+  }
+
+  @override
+  Namespace getPublicNamespace(LibraryElement library) {
+    // TODO(brianwilkerson) Rename this to not start with 'get'.
+    // Note that this is not part of the API of the interface.
+    // TODO(brianwilkerson) The public namespace used to be cached, but no
+    // longer is. Konstantin adds:
+    // The only client of this method is NamespaceBuilder._createExportMapping(),
+    // and it is not used with tasks - instead we compute export namespace once
+    // using BuildExportNamespaceTask and reuse in scopes.
+    NamespaceBuilder builder = new NamespaceBuilder();
+    return builder.createPublicNamespaceForLibrary(library);
+  }
+
+  @override
+  CompilationUnit getResolvedCompilationUnit(
+      Source unitSource, LibraryElement library) {
+    if (library == null ||
+        !AnalysisEngine.isDartFileName(unitSource.shortName)) {
+      return null;
+    }
+    return getResolvedCompilationUnit2(unitSource, library.source);
+  }
+
+  @override
+  CompilationUnit getResolvedCompilationUnit2(
+      Source unitSource, Source librarySource) {
+    if (!AnalysisEngine.isDartFileName(unitSource.shortName) ||
+        !AnalysisEngine.isDartFileName(librarySource.shortName)) {
+      return null;
+    }
+    return getResult(
+        new LibrarySpecificUnit(librarySource, unitSource), RESOLVED_UNIT);
+  }
+
+  @override
+  @deprecated
+  ht.HtmlUnit getResolvedHtmlUnit(Source htmlSource) {
+    // TODO(brianwilkerson) Remove this method after switching to the new task
+    // model.
+    throw new UnimplementedError('Not supported in the new task model');
+  }
+
+  @override
+  Object getResult(AnalysisTarget target, ResultDescriptor result) {
+    return _cache.getValue(target, result);
+  }
+
+  @override
+  List<Source> getSourcesWithFullName(String path) {
+    return analysisCache.getSourcesWithFullName(path);
+  }
+
+  @override
+  bool handleContentsChanged(
+      Source source, String originalContents, String newContents, bool notify) {
+    CacheEntry entry = _cache.get(source);
+    if (entry == null) {
+      return false;
+    }
+    bool changed = newContents != originalContents;
+    if (newContents != null) {
+      if (changed) {
+        if (!analysisOptions.incremental ||
+            !_tryPoorMansIncrementalResolution(source, newContents)) {
+          _sourceChanged(source);
+        }
+        entry.modificationTime = _contentCache.getModificationStamp(source);
+        entry.setValue(CONTENT, newContents, TargetedResult.EMPTY_LIST);
+      } else {
+        entry.modificationTime = _contentCache.getModificationStamp(source);
+      }
+    } else if (originalContents != null) {
+      // We are removing the overlay for the file, check if the file's
+      // contents is the same as it was in the overlay.
+      try {
+        TimestampedData<String> fileContents = getContents(source);
+        newContents = fileContents.data;
+        entry.modificationTime = fileContents.modificationTime;
+        if (newContents == originalContents) {
+          entry.setValue(CONTENT, newContents, TargetedResult.EMPTY_LIST);
+          changed = false;
+        }
+      } catch (e) {}
+      // If not the same content (e.g. the file is being closed without save),
+      // then force analysis.
+      if (changed) {
+        if (!analysisOptions.incremental ||
+            !_tryPoorMansIncrementalResolution(source, newContents)) {
+          _sourceChanged(source);
+        }
+      }
+    }
+    if (notify && changed) {
+      _onSourcesChangedController
+          .add(new SourcesChangedEvent.changedContent(source, newContents));
+    }
+    return changed;
+  }
+
+  @override
+  void invalidateLibraryHints(Source librarySource) {
+    List<Source> sources = getResult(librarySource, UNITS);
+    if (sources != null) {
+      for (Source source in sources) {
+        getCacheEntry(source).setState(HINTS, CacheState.INVALID);
+      }
+    }
+  }
+
+  @override
+  bool isClientLibrary(Source librarySource) {
+    CacheEntry entry = _cache.get(librarySource);
+    return entry.getValue(IS_CLIENT) && entry.getValue(IS_LAUNCHABLE);
+  }
+
+  @override
+  bool isServerLibrary(Source librarySource) {
+    CacheEntry entry = _cache.get(librarySource);
+    return !entry.getValue(IS_CLIENT) && entry.getValue(IS_LAUNCHABLE);
+  }
+
+  @override
+  Stream<ComputedResult> onResultComputed(ResultDescriptor descriptor) {
+    return driver.onResultComputed(descriptor);
+  }
+
+  @override
+  CompilationUnit parseCompilationUnit(Source source) {
+    if (!AnalysisEngine.isDartFileName(source.shortName)) {
+      return null;
+    }
+    try {
+      getContents(source);
+    } catch (exception, stackTrace) {
+      throw new AnalysisException('Could not get contents of $source',
+          new CaughtException(exception, stackTrace));
+    }
+    return computeResult(source, PARSED_UNIT);
+  }
+
+  @override
+  Document parseHtmlDocument(Source source) {
+    if (!AnalysisEngine.isHtmlFileName(source.shortName)) {
+      return null;
+    }
+    return computeResult(source, HTML_DOCUMENT);
+  }
+
+  @override
+  @deprecated // use parseHtmlDocument(source)
+  ht.HtmlUnit parseHtmlUnit(Source source) {
+    // TODO(brianwilkerson) Remove this method after switching to the new task
+    // model.
+    throw new UnimplementedError('Not supported in the new task model');
+  }
+
+  @override
+  AnalysisResult performAnalysisTask() {
+    return PerformanceStatistics.performAnaysis.makeCurrentWhile(() {
+      _evaluatePendingFutures();
+      bool done = !driver.performAnalysisTask();
+      List<ChangeNotice> notices = _getChangeNotices(done);
+      if (notices != null) {
+        int noticeCount = notices.length;
+        for (int i = 0; i < noticeCount; i++) {
+          ChangeNotice notice = notices[i];
+          _notifyErrors(notice.source, notice.errors, notice.lineInfo);
+        }
+      }
+      return new AnalysisResult(notices, -1, '', -1);
+    });
+  }
+
+  @override
+  void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
+    elementMap.forEach((Source librarySource, LibraryElement library) {
+      //
+      // Cache the element in the library's info.
+      //
+      CacheEntry entry = getCacheEntry(librarySource);
+      setValue(ResultDescriptor result, value) {
+        entry.setValue(result, value, TargetedResult.EMPTY_LIST);
+      }
+      setValue(BUILD_DIRECTIVES_ERRORS, AnalysisError.NO_ERRORS);
+      setValue(BUILD_LIBRARY_ERRORS, AnalysisError.NO_ERRORS);
+      // CLASS_ELEMENTS
+      setValue(COMPILATION_UNIT_ELEMENT, library.definingCompilationUnit);
+      // CONSTRUCTORS
+      // CONSTRUCTORS_ERRORS
+      entry.setState(CONTENT, CacheState.FLUSHED);
+      setValue(EXPORTED_LIBRARIES, Source.EMPTY_LIST);
+      // EXPORT_SOURCE_CLOSURE
+      setValue(IMPORTED_LIBRARIES, Source.EMPTY_LIST);
+      // IMPORT_SOURCE_CLOSURE
+      setValue(INCLUDED_PARTS, Source.EMPTY_LIST);
+      setValue(IS_CLIENT, true);
+      setValue(IS_LAUNCHABLE, false);
+      setValue(LIBRARY_ELEMENT, library);
+      setValue(LIBRARY_ELEMENT1, library);
+      setValue(LIBRARY_ELEMENT2, library);
+      setValue(LIBRARY_ELEMENT3, library);
+      setValue(LIBRARY_ELEMENT4, library);
+      setValue(LIBRARY_ELEMENT5, library);
+      setValue(LINE_INFO, new LineInfo(<int>[0]));
+      setValue(PARSE_ERRORS, AnalysisError.NO_ERRORS);
+      entry.setState(PARSED_UNIT, CacheState.FLUSHED);
+      entry.setState(RESOLVE_TYPE_NAMES_ERRORS, CacheState.FLUSHED);
+      setValue(SCAN_ERRORS, AnalysisError.NO_ERRORS);
+      setValue(SOURCE_KIND, SourceKind.LIBRARY);
+      entry.setState(TOKEN_STREAM, CacheState.FLUSHED);
+      setValue(UNITS, <Source>[librarySource]);
+
+      LibrarySpecificUnit unit =
+          new LibrarySpecificUnit(librarySource, librarySource);
+      entry = getCacheEntry(unit);
+      setValue(HINTS, AnalysisError.NO_ERRORS);
+      // dartEntry.setValue(LINTS, AnalysisError.NO_ERRORS);
+      entry.setState(RESOLVE_REFERENCES_ERRORS, CacheState.FLUSHED);
+      entry.setState(RESOLVED_UNIT, CacheState.FLUSHED);
+      entry.setState(RESOLVED_UNIT1, CacheState.FLUSHED);
+      entry.setState(RESOLVED_UNIT2, CacheState.FLUSHED);
+      entry.setState(RESOLVED_UNIT3, CacheState.FLUSHED);
+      entry.setState(RESOLVED_UNIT4, CacheState.FLUSHED);
+      entry.setState(RESOLVED_UNIT5, CacheState.FLUSHED);
+      entry.setState(RESOLVED_UNIT6, CacheState.FLUSHED);
+      entry.setState(RESOLVED_UNIT7, CacheState.FLUSHED);
+      entry.setState(RESOLVED_UNIT8, CacheState.FLUSHED);
+      // USED_IMPORTED_ELEMENTS
+      // USED_LOCAL_ELEMENTS
+      setValue(VERIFY_ERRORS, AnalysisError.NO_ERRORS);
+    });
+
+    CacheEntry entry = getCacheEntry(AnalysisContextTarget.request);
+    entry.setValue(TYPE_PROVIDER, typeProvider, TargetedResult.EMPTY_LIST);
+  }
+
+  @override
+  void removeListener(AnalysisListener listener) {
+    _listeners.remove(listener);
+  }
+
+  @override
+  CompilationUnit resolveCompilationUnit(
+      Source unitSource, LibraryElement library) {
+    if (library == null) {
+      return null;
+    }
+    return resolveCompilationUnit2(unitSource, library.source);
+  }
+
+  @override
+  CompilationUnit resolveCompilationUnit2(
+      Source unitSource, Source librarySource) {
+    if (!AnalysisEngine.isDartFileName(unitSource.shortName) ||
+        !AnalysisEngine.isDartFileName(librarySource.shortName)) {
+      return null;
+    }
+    return computeResult(
+        new LibrarySpecificUnit(librarySource, unitSource), RESOLVED_UNIT);
+  }
+
+  @override
+  @deprecated
+  ht.HtmlUnit resolveHtmlUnit(Source htmlSource) {
+    // TODO(brianwilkerson) Remove this method after switching to the new task
+    // model.
+    throw new UnimplementedError('Not supported in the new task model');
+  }
+
+  @override
+  void setChangedContents(Source source, String contents, int offset,
+      int oldLength, int newLength) {
+    if (_contentRangeChanged(source, contents, offset, oldLength, newLength)) {
+      _onSourcesChangedController.add(new SourcesChangedEvent.changedRange(
+          source, contents, offset, oldLength, newLength));
+    }
+  }
+
+  @override
+  void setContents(Source source, String contents) {
+    _contentsChanged(source, contents, true);
+  }
+
+  @override
+  bool shouldErrorsBeAnalyzed(Source source, Object entry) {
+    CacheEntry entry = analysisCache.get(source);
+    if (source.isInSystemLibrary) {
+      return _options.generateSdkErrors;
+    } else if (!entry.explicitlyAdded) {
+      return _options.generateImplicitErrors;
+    } else {
+      return true;
+    }
+  }
+
+  @override
+  void test_flushAstStructures(Source source) {
+    CacheEntry entry = getCacheEntry(source);
+    entry.setState(PARSED_UNIT, CacheState.FLUSHED);
+    entry.setState(RESOLVED_UNIT1, CacheState.FLUSHED);
+    entry.setState(RESOLVED_UNIT2, CacheState.FLUSHED);
+    entry.setState(RESOLVED_UNIT3, CacheState.FLUSHED);
+    entry.setState(RESOLVED_UNIT4, CacheState.FLUSHED);
+    entry.setState(RESOLVED_UNIT5, CacheState.FLUSHED);
+    entry.setState(RESOLVED_UNIT6, CacheState.FLUSHED);
+    entry.setState(RESOLVED_UNIT5, CacheState.FLUSHED);
+    entry.setState(RESOLVED_UNIT8, CacheState.FLUSHED);
+    entry.setState(RESOLVED_UNIT, CacheState.FLUSHED);
+  }
+
+  @override
+  bool validateCacheConsistency() {
+    int consistencyCheckStart = JavaSystem.nanoTime();
+    HashSet<Source> changedSources = new HashSet<Source>();
+    HashSet<Source> missingSources = new HashSet<Source>();
+    for (Source source in _cache.sources) {
+      CacheEntry entry = _cache.get(source);
+      int sourceTime = getModificationStamp(source);
+      if (sourceTime != entry.modificationTime) {
+        changedSources.add(source);
+      }
+      if (entry.exception != null) {
+        if (!exists(source)) {
+          missingSources.add(source);
+        }
+      }
+    }
+    for (Source source in changedSources) {
+      _sourceChanged(source);
+    }
+    int removalCount = 0;
+    for (Source source in missingSources) {
+      if (getLibrariesContaining(source).isEmpty &&
+          getLibrariesDependingOn(source).isEmpty) {
+        _removeFromCache(source);
+        removalCount++;
+      }
+    }
+    int consistencyCheckEnd = JavaSystem.nanoTime();
+    if (changedSources.length > 0 || missingSources.length > 0) {
+      StringBuffer buffer = new StringBuffer();
+      buffer.write("Consistency check took ");
+      buffer.write((consistencyCheckEnd - consistencyCheckStart) / 1000000.0);
+      buffer.writeln(" ms and found");
+      buffer.write("  ");
+      buffer.write(changedSources.length);
+      buffer.writeln(" inconsistent entries");
+      buffer.write("  ");
+      buffer.write(missingSources.length);
+      buffer.write(" missing sources (");
+      buffer.write(removalCount);
+      buffer.writeln(" removed");
+      for (Source source in missingSources) {
+        buffer.write("    ");
+        buffer.writeln(source.fullName);
+      }
+      _logInformation(buffer.toString());
+    }
+    return changedSources.length > 0;
+  }
+
+  @deprecated
+  @override
+  void visitCacheItems(void callback(Source source, SourceEntry dartEntry,
+      DataDescriptor rowDesc, CacheState state)) {
+    // TODO(brianwilkerson) Figure out where this is used and either remove it
+    // or adjust the call sites to use CacheEntry's.
+//    bool hintsEnabled = _options.hint;
+//    bool lintsEnabled = _options.lint;
+//    MapIterator<AnalysisTarget, cache.CacheEntry> iterator = _cache.iterator();
+//    while (iterator.moveNext()) {
+//      Source source = iterator.key;
+//      cache.CacheEntry entry = iterator.value;
+//      for (DataDescriptor descriptor in entry.descriptors) {
+//        if (descriptor == DartEntry.SOURCE_KIND) {
+//          // The source kind is always valid, so the state isn't interesting.
+//          continue;
+//        } else if (descriptor == DartEntry.CONTAINING_LIBRARIES) {
+//          // The list of containing libraries is always valid, so the state
+//          // isn't interesting.
+//          continue;
+//        } else if (descriptor == DartEntry.PUBLIC_NAMESPACE) {
+//          // The public namespace isn't computed by performAnalysisTask()
+//          // and therefore isn't interesting.
+//          continue;
+//        } else if (descriptor == HtmlEntry.HINTS) {
+//          // We are not currently recording any hints related to HTML.
+//          continue;
+//        }
+//        callback(
+//            source, entry, descriptor, entry.getState(descriptor));
+//      }
+//      if (entry is DartEntry) {
+//        // get library-specific values
+//        List<Source> librarySources = getLibrariesContaining(source);
+//        for (Source librarySource in librarySources) {
+//          for (DataDescriptor descriptor in entry.libraryDescriptors) {
+//            if (descriptor == DartEntry.BUILT_ELEMENT ||
+//                descriptor == DartEntry.BUILT_UNIT) {
+//              // These values are not currently being computed, so their state
+//              // is not interesting.
+//              continue;
+//            } else if (!entry.explicitlyAdded &&
+//                !_generateImplicitErrors &&
+//                (descriptor == DartEntry.VERIFICATION_ERRORS ||
+//                    descriptor == DartEntry.HINTS ||
+//                    descriptor == DartEntry.LINTS)) {
+//              continue;
+//            } else if (source.isInSystemLibrary &&
+//                !_generateSdkErrors &&
+//                (descriptor == DartEntry.VERIFICATION_ERRORS ||
+//                    descriptor == DartEntry.HINTS ||
+//                    descriptor == DartEntry.LINTS)) {
+//              continue;
+//            } else if (!hintsEnabled && descriptor == DartEntry.HINTS) {
+//              continue;
+//            } else if (!lintsEnabled && descriptor == DartEntry.LINTS) {
+//              continue;
+//            }
+//            callback(librarySource, entry, descriptor,
+//                entry.getStateInLibrary(descriptor, librarySource));
+//          }
+//        }
+//      }
+//    }
+  }
+
+  @override
+  void visitContentCache(ContentCacheVisitor visitor) {
+    _contentCache.accept(visitor);
+  }
+
+  /**
+   * Add all of the sources contained in the given source [container] to the
+   * given list of [sources].
+   */
+  void _addSourcesInContainer(List<Source> sources, SourceContainer container) {
+    for (Source source in _cache.sources) {
+      if (container.contains(source)) {
+        sources.add(source);
+      }
+    }
+  }
+
+  /**
+   * Remove the given [pendingFuture] from [_pendingFutureTargets], since the
+   * client has indicated its computation is not needed anymore.
+   */
+  void _cancelFuture(PendingFuture pendingFuture) {
+    List<PendingFuture> pendingFutures =
+        _pendingFutureTargets[pendingFuture.target];
+    if (pendingFutures != null) {
+      pendingFutures.remove(pendingFuture);
+      if (pendingFutures.isEmpty) {
+        _pendingFutureTargets.remove(pendingFuture.target);
+      }
+    }
+  }
+
+  /**
+   * Given the encoded form of a source ([encoding]), use the source factory to
+   * reconstitute the original source.
+   */
+  Source _computeSourceFromEncoding(String encoding) =>
+      _sourceFactory.fromEncoding(encoding);
+
+  /**
+   * Return `true` if the given list of [sources] contains the given
+   * [targetSource].
+   */
+  bool _contains(List<Source> sources, Source targetSource) {
+    for (Source source in sources) {
+      if (source == targetSource) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given list of [sources] contains any of the given
+   * [targetSources].
+   */
+  bool _containsAny(List<Source> sources, List<Source> targetSources) {
+    for (Source targetSource in targetSources) {
+      if (_contains(sources, targetSource)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Set the contents of the given [source] to the given [contents] and mark the
+   * source as having changed. The additional [offset], [oldLength] and
+   * [newLength] information is used by the context to determine what reanalysis
+   * is necessary. The method [setChangedContents] triggers a source changed
+   * event where as this method does not.
+   */
+  bool _contentRangeChanged(Source source, String contents, int offset,
+      int oldLength, int newLength) {
+    bool changed = false;
+    String originalContents = _contentCache.setContents(source, contents);
+    if (contents != null) {
+      if (contents != originalContents) {
+        _sourceChanged(source);
+        changed = true;
+        CacheEntry entry = _cache.get(source);
+        if (entry != null) {
+          entry.modificationTime = _contentCache.getModificationStamp(source);
+          entry.setValue(CONTENT, contents, TargetedResult.EMPTY_LIST);
+        }
+      }
+    } else if (originalContents != null) {
+      _sourceChanged(source);
+      changed = true;
+    }
+    return changed;
+  }
+
+  /**
+   * Set the contents of the given [source] to the given [contents] and mark the
+   * source as having changed. This has the effect of overriding the default
+   * contents of the source. If the contents are `null` the override is removed
+   * so that the default contents will be returned. If [notify] is true, a
+   * source changed event is triggered.
+   */
+  void _contentsChanged(Source source, String contents, bool notify) {
+    String originalContents = _contentCache.setContents(source, contents);
+    handleContentsChanged(source, originalContents, contents, notify);
+  }
+
+  /**
+   * Create a cache entry for the given [source]. The source was explicitly
+   * added to this context if [explicitlyAdded] is `true`. Return the cache
+   * entry that was created.
+   */
+  CacheEntry _createCacheEntry(Source source, bool explicitlyAdded) {
+    CacheEntry entry = new CacheEntry(source);
+    entry.modificationTime = getModificationStamp(source);
+    entry.explicitlyAdded = explicitlyAdded;
+    _cache.put(entry);
+    if (!explicitlyAdded) {
+      _implicitAnalysisEventsController
+          .add(new ImplicitAnalysisEvent(source, true));
+    }
+    return entry;
+  }
+
+  /**
+   * Return a list containing all of the cache entries for targets associated
+   * with the given [source].
+   */
+  List<CacheEntry> _entriesFor(Source source) {
+    List<CacheEntry> entries = <CacheEntry>[];
+    MapIterator<AnalysisTarget, CacheEntry> iterator = _cache.iterator();
+    while (iterator.moveNext()) {
+      if (iterator.key.source == source) {
+        entries.add(iterator.value);
+      }
+    }
+    return entries;
+  }
+
+  void _evaluatePendingFutures() {
+    for (AnalysisTarget target in _pendingFutureTargets.keys) {
+      CacheEntry cacheEntry = _cache.get(target);
+      List<PendingFuture> pendingFutures = _pendingFutureTargets[target];
+      for (int i = 0; i < pendingFutures.length;) {
+        if (pendingFutures[i].evaluate(cacheEntry)) {
+          pendingFutures.removeAt(i);
+        } else {
+          i++;
+        }
+      }
+    }
+  }
+
+  /**
+   * Return a list containing all of the change notices that are waiting to be
+   * returned. If there are no notices, then return either `null` or an empty
+   * list, depending on the value of [nullIfEmpty].
+   */
+  List<ChangeNotice> _getChangeNotices(bool nullIfEmpty) {
+    if (_pendingNotices.isEmpty) {
+      if (nullIfEmpty) {
+        return null;
+      }
+      return ChangeNoticeImpl.EMPTY_LIST;
+    }
+    List<ChangeNotice> notices = new List.from(_pendingNotices.values);
+    _pendingNotices.clear();
+    return notices;
+  }
+
+  /**
+   * Return a list containing all of the sources known to this context that have
+   * the given [kind].
+   */
+  List<Source> _getSources(SourceKind kind) {
+    List<Source> sources = <Source>[];
+    if (kind == SourceKind.LIBRARY || kind == SourceKind.PART) {
+      for (Source source in _cache.sources) {
+        CacheEntry entry = _cache.get(source);
+        if (entry.getValue(SOURCE_KIND) == kind) {
+          sources.add(source);
+        }
+      }
+    } else if (kind == SourceKind.HTML) {
+      for (Source source in _cache.sources) {
+        if (AnalysisEngine.isHtmlFileName(source.shortName)) {
+          sources.add(source);
+        }
+      }
+    }
+    if (sources.isEmpty) {
+      return Source.EMPTY_LIST;
+    }
+    return sources;
+  }
+
+  /**
+   * Look at the given [source] to see whether a task needs to be performed
+   * related to it. If so, add the source to the set of sources that need to be
+   * processed. This method is intended to be used for testing purposes only.
+   */
+  void _getSourcesNeedingProcessing(
+      Source source,
+      CacheEntry entry,
+      bool isPriority,
+      bool hintsEnabled,
+      bool lintsEnabled,
+      HashSet<Source> sources) {
+    CacheState state = entry.getState(CONTENT);
+    if (state == CacheState.INVALID ||
+        (isPriority && state == CacheState.FLUSHED)) {
+      sources.add(source);
+      return;
+    } else if (state == CacheState.ERROR) {
+      return;
+    }
+    state = entry.getState(SOURCE_KIND);
+    if (state == CacheState.INVALID ||
+        (isPriority && state == CacheState.FLUSHED)) {
+      sources.add(source);
+      return;
+    } else if (state == CacheState.ERROR) {
+      return;
+    }
+    SourceKind kind = entry.getValue(SOURCE_KIND);
+    if (kind == SourceKind.LIBRARY || kind == SourceKind.PART) {
+      state = entry.getState(SCAN_ERRORS);
+      if (state == CacheState.INVALID ||
+          (isPriority && state == CacheState.FLUSHED)) {
+        sources.add(source);
+        return;
+      } else if (state == CacheState.ERROR) {
+        return;
+      }
+      state = entry.getState(PARSE_ERRORS);
+      if (state == CacheState.INVALID ||
+          (isPriority && state == CacheState.FLUSHED)) {
+        sources.add(source);
+        return;
+      } else if (state == CacheState.ERROR) {
+        return;
+      }
+//      if (isPriority) {
+//        if (!entry.hasResolvableCompilationUnit) {
+//          sources.add(source);
+//          return;
+//        }
+//      }
+      for (Source librarySource in getLibrariesContaining(source)) {
+        CacheEntry libraryEntry = _cache.get(librarySource);
+        state = libraryEntry.getState(LIBRARY_ELEMENT);
+        if (state == CacheState.INVALID ||
+            (isPriority && state == CacheState.FLUSHED)) {
+          sources.add(source);
+          return;
+        } else if (state == CacheState.ERROR) {
+          return;
+        }
+        CacheEntry unitEntry =
+            _cache.get(new LibrarySpecificUnit(librarySource, source));
+        state = unitEntry.getState(RESOLVED_UNIT);
+        if (state == CacheState.INVALID ||
+            (isPriority && state == CacheState.FLUSHED)) {
+          sources.add(source);
+          return;
+        } else if (state == CacheState.ERROR) {
+          return;
+        }
+        if (shouldErrorsBeAnalyzed(source, unitEntry)) {
+          state = unitEntry.getState(VERIFY_ERRORS);
+          if (state == CacheState.INVALID ||
+              (isPriority && state == CacheState.FLUSHED)) {
+            sources.add(source);
+            return;
+          } else if (state == CacheState.ERROR) {
+            return;
+          }
+          if (hintsEnabled) {
+            state = unitEntry.getState(HINTS);
+            if (state == CacheState.INVALID ||
+                (isPriority && state == CacheState.FLUSHED)) {
+              sources.add(source);
+              return;
+            } else if (state == CacheState.ERROR) {
+              return;
+            }
+          }
+//          if (lintsEnabled) {
+//            state = unitEntry.getState(LINTS);
+//            if (state == CacheState.INVALID ||
+//                (isPriority && state == CacheState.FLUSHED)) {
+//              sources.add(source);
+//              return;
+//            } else if (state == CacheState.ERROR) {
+//              return;
+//            }
+//          }
+        }
+      }
+//    } else if (kind == SourceKind.HTML) {
+//      CacheState parsedUnitState = entry.getState(HtmlEntry.PARSED_UNIT);
+//      if (parsedUnitState == CacheState.INVALID ||
+//          (isPriority && parsedUnitState == CacheState.FLUSHED)) {
+//        sources.add(source);
+//        return;
+//      }
+//      CacheState resolvedUnitState =
+//          entry.getState(HtmlEntry.RESOLVED_UNIT);
+//      if (resolvedUnitState == CacheState.INVALID ||
+//          (isPriority && resolvedUnitState == CacheState.FLUSHED)) {
+//        sources.add(source);
+//        return;
+//      }
+    }
+  }
+
+  /**
+   * Log the given debugging [message].
+   */
+  void _logInformation(String message) {
+    AnalysisEngine.instance.logger.logInformation(message);
+  }
+
+  /**
+   * Notify all of the analysis listeners that the errors associated with the
+   * given [source] has been updated to the given [errors].
+   */
+  void _notifyErrors(
+      Source source, List<AnalysisError> errors, LineInfo lineInfo) {
+    int count = _listeners.length;
+    for (int i = 0; i < count; i++) {
+      _listeners[i].computedErrors(this, source, errors, lineInfo);
+    }
+  }
+
+  void _removeFromCache(Source source) {
+    CacheEntry entry = _cache.remove(source);
+    if (entry != null && !entry.explicitlyAdded) {
+      _implicitAnalysisEventsController
+          .add(new ImplicitAnalysisEvent(source, false));
+    }
+  }
+
+  /**
+   * Remove the given [source] from the priority order if it is in the list.
+   */
+  void _removeFromPriorityOrder(Source source) {
+    int count = _priorityOrder.length;
+    List<Source> newOrder = <Source>[];
+    for (int i = 0; i < count; i++) {
+      if (_priorityOrder[i] != source) {
+        newOrder.add(_priorityOrder[i]);
+      }
+    }
+    if (newOrder.length < count) {
+      analysisPriorityOrder = newOrder;
+    }
+  }
+
+  /**
+   * Create an entry for the newly added [source] and invalidate any sources
+   * that referenced the source before it existed.
+   */
+  void _sourceAvailable(Source source) {
+    // TODO(brianwilkerson) This method needs to check whether the source was
+    // previously being implicitly analyzed. If so, the cache entry needs to be
+    // update to reflect the new status and an event needs to be generated to
+    // inform clients that it is no longer being implicitly analyzed.
+    CacheEntry entry = _cache.get(source);
+    if (entry == null) {
+      _createCacheEntry(source, true);
+    } else {
+      entry.modificationTime = getModificationStamp(source);
+      entry.setState(CONTENT, CacheState.INVALID);
+    }
+  }
+
+  /**
+   * Invalidate the [source] that was changed and any sources that referenced
+   * the source before it existed.
+   */
+  void _sourceChanged(Source source) {
+    CacheEntry entry = _cache.get(source);
+    // If the source is removed, we don't care about it.
+    if (entry == null) {
+      return;
+    }
+    // Check whether the content of the source is the same as it was the last
+    // time.
+    String sourceContent = entry.getValue(CONTENT);
+    if (sourceContent != null) {
+      entry.setState(CONTENT, CacheState.FLUSHED);
+      try {
+        TimestampedData<String> fileContents = getContents(source);
+        if (fileContents.data == sourceContent) {
+          int time = fileContents.modificationTime;
+          for (CacheEntry entry in _entriesFor(source)) {
+            entry.modificationTime = time;
+          }
+          return;
+        }
+      } catch (e) {}
+    }
+    // We need to invalidate the cache.
+    {
+      Object delta = null;
+      if (AnalysisEngine.instance.limitInvalidationInTaskModel &&
+          AnalysisEngine.isDartFileName(source.fullName)) {
+        // TODO(scheglov) Incorrect implementation in general.
+        entry.setState(TOKEN_STREAM, CacheState.FLUSHED);
+        entry.setState(PARSED_UNIT, CacheState.FLUSHED);
+        List<Source> librarySources = getLibrariesContaining(source);
+        if (librarySources.length == 1) {
+          Source librarySource = librarySources[0];
+          CompilationUnit oldUnit =
+              getResolvedCompilationUnit2(source, librarySource);
+          if (oldUnit != null) {
+            CompilationUnit newUnit = parseCompilationUnit(source);
+            IncrementalCompilationUnitElementBuilder builder =
+                new IncrementalCompilationUnitElementBuilder(oldUnit, newUnit);
+            builder.build();
+            CompilationUnitElementDelta unitDelta = builder.unitDelta;
+            if (!unitDelta.hasDirectiveChange) {
+              DartDelta dartDelta = new DartDelta(source);
+              dartDelta.hasDirectiveChange = unitDelta.hasDirectiveChange;
+              unitDelta.addedDeclarations.forEach(dartDelta.elementAdded);
+              unitDelta.removedDeclarations.forEach(dartDelta.elementRemoved);
+//              print(
+//                  'dartDelta: add=${dartDelta.addedNames} remove=${dartDelta.removedNames}');
+              delta = dartDelta;
+              entry.setState(CONTENT, CacheState.INVALID, delta: delta);
+              return;
+            }
+          }
+        }
+      }
+      entry.setState(CONTENT, CacheState.INVALID);
+    }
+    for (WorkManager workManager in workManagers) {
+      workManager.applyChange(
+          Source.EMPTY_LIST, <Source>[source], Source.EMPTY_LIST);
+    }
+  }
+
+  /**
+   * Record that the give [source] has been deleted.
+   */
+  void _sourceDeleted(Source source) {
+    // TODO(brianwilkerson) Implement or remove this.
+//    SourceEntry sourceEntry = _cache.get(source);
+//    if (sourceEntry is HtmlEntry) {
+//      HtmlEntry htmlEntry = sourceEntry;
+//      htmlEntry.recordContentError(new CaughtException(
+//          new AnalysisException("This source was marked as being deleted"),
+//          null));
+//    } else if (sourceEntry is DartEntry) {
+//      DartEntry dartEntry = sourceEntry;
+//      HashSet<Source> libraries = new HashSet<Source>();
+//      for (Source librarySource in getLibrariesContaining(source)) {
+//        libraries.add(librarySource);
+//        for (Source dependentLibrary
+//            in getLibrariesDependingOn(librarySource)) {
+//          libraries.add(dependentLibrary);
+//        }
+//      }
+//      for (Source librarySource in libraries) {
+//        _invalidateLibraryResolution(librarySource);
+//      }
+//      dartEntry.recordContentError(new CaughtException(
+//          new AnalysisException("This source was marked as being deleted"),
+//          null));
+//    }
+    _removeFromPriorityOrder(source);
+  }
+
+  /**
+   * Record that the given [source] has been removed.
+   */
+  void _sourceRemoved(Source source) {
+    _removeFromCache(source);
+    _removeFromPriorityOrder(source);
+  }
+
+  /**
+   * TODO(scheglov) A hackish, limited incremental resolution implementation.
+   */
+  bool _tryPoorMansIncrementalResolution(Source unitSource, String newCode) {
+    return PerformanceStatistics.incrementalAnalysis.makeCurrentWhile(() {
+      incrementalResolutionValidation_lastUnitSource = null;
+      incrementalResolutionValidation_lastLibrarySource = null;
+      incrementalResolutionValidation_lastUnit = null;
+      // prepare the entry
+      CacheEntry sourceEntry = _cache.get(unitSource);
+      if (sourceEntry == null) {
+        return false;
+      }
+      // prepare the (only) library source
+      List<Source> librarySources = getLibrariesContaining(unitSource);
+      if (librarySources.length != 1) {
+        return false;
+      }
+      Source librarySource = librarySources[0];
+      CacheEntry unitEntry =
+          _cache.get(new LibrarySpecificUnit(librarySource, unitSource));
+      if (unitEntry == null) {
+        return false;
+      }
+      // prepare the library element
+      LibraryElement libraryElement = getLibraryElement(librarySource);
+      if (libraryElement == null) {
+        return false;
+      }
+      // prepare the existing unit
+      CompilationUnit oldUnit =
+          getResolvedCompilationUnit2(unitSource, librarySource);
+      if (oldUnit == null) {
+        return false;
+      }
+      // do resolution
+      Stopwatch perfCounter = new Stopwatch()..start();
+      PoorMansIncrementalResolver resolver = new PoorMansIncrementalResolver(
+          typeProvider,
+          unitSource,
+          null,
+          sourceEntry,
+          unitEntry,
+          oldUnit,
+          analysisOptions.incrementalApi,
+          analysisOptions);
+      bool success = resolver.resolve(newCode);
+      AnalysisEngine.instance.instrumentationService.logPerformance(
+          AnalysisPerformanceKind.INCREMENTAL,
+          perfCounter,
+          'success=$success,context_id=$_id,code_length=${newCode.length}');
+      if (!success) {
+        return false;
+      }
+      // if validation, remember the result, but throw it away
+      if (analysisOptions.incrementalValidation) {
+        incrementalResolutionValidation_lastUnitSource = oldUnit.element.source;
+        incrementalResolutionValidation_lastLibrarySource =
+            oldUnit.element.library.source;
+        incrementalResolutionValidation_lastUnit = oldUnit;
+        return false;
+      }
+      // prepare notice
+      {
+        ChangeNoticeImpl notice = getNotice(unitSource);
+        notice.resolvedDartUnit = oldUnit;
+        AnalysisErrorInfo errorInfo = getErrors(unitSource);
+        notice.setErrors(errorInfo.errors, errorInfo.lineInfo);
+      }
+      // schedule
+      dartWorkManager.unitIncrementallyResolved(librarySource, unitSource);
+      // OK
+      return true;
+    });
+  }
+}
+
+/**
+ * An object that manages the partitions that can be shared between analysis
+ * contexts.
+ */
+class PartitionManager {
+  /**
+   * A table mapping SDK's to the partitions used for those SDK's.
+   */
+  HashMap<DartSdk, SdkCachePartition> _sdkPartitions =
+      new HashMap<DartSdk, SdkCachePartition>();
+
+  /**
+   * Clear any cached data being maintained by this manager.
+   */
+  void clearCache() {
+    _sdkPartitions.clear();
+  }
+
+  /**
+   * Return the partition being used for the given [sdk], creating the partition
+   * if necessary.
+   */
+  SdkCachePartition forSdk(DartSdk sdk) {
+    // Call sdk.context now, because when it creates a new
+    // InternalAnalysisContext instance, it calls forSdk() again, so creates an
+    // SdkCachePartition instance.
+    // So, if we initialize context after "partition == null", we end up
+    // with two SdkCachePartition instances.
+    InternalAnalysisContext sdkContext = sdk.context;
+    // Check cache for an existing partition.
+    SdkCachePartition partition = _sdkPartitions[sdk];
+    if (partition == null) {
+      partition = new SdkCachePartition(sdkContext);
+      _sdkPartitions[sdk] = partition;
+    }
+    return partition;
+  }
+}
+
+/**
+ * Representation of a pending computation which is based on the results of
+ * analysis that may or may not have been completed.
+ */
+class PendingFuture<T> {
+  /**
+   * The context in which this computation runs.
+   */
+  final AnalysisContextImpl _context;
+
+  /**
+   * The target used by this computation to compute its value.
+   */
+  final AnalysisTarget target;
+
+  /**
+   * The function which implements the computation.
+   */
+  final PendingFutureComputer<T> _computeValue;
+
+  /**
+   * The completer that should be completed once the computation has succeeded.
+   */
+  CancelableCompleter<T> _completer;
+
+  PendingFuture(this._context, this.target, this._computeValue) {
+    _completer = new CancelableCompleter<T>(_onCancel);
+  }
+
+  /**
+   * Retrieve the future which will be completed when this object is
+   * successfully evaluated.
+   */
+  CancelableFuture<T> get future => _completer.future;
+
+  /**
+   * Execute [_computeValue], passing it the given [entry], and complete
+   * the pending future if it's appropriate to do so.  If the pending future is
+   * completed by this call, true is returned; otherwise false is returned.
+   *
+   * Once this function has returned true, it should not be called again.
+   *
+   * Other than completing the future, this method is free of side effects.
+   * Note that any code the client has attached to the future will be executed
+   * in a microtask, so there is no danger of side effects occurring due to
+   * client callbacks.
+   */
+  bool evaluate(CacheEntry entry) {
+    assert(!_completer.isCompleted);
+    try {
+      T result = _computeValue(entry);
+      if (result == null) {
+        return false;
+      } else {
+        _completer.complete(result);
+        return true;
+      }
+    } catch (exception, stackTrace) {
+      _completer.completeError(exception, stackTrace);
+      return true;
+    }
+  }
+
+  /**
+   * No further analysis updates are expected which affect this future, so
+   * complete it with an AnalysisNotScheduledError in order to avoid
+   * deadlocking the client.
+   */
+  void forciblyComplete() {
+    try {
+      throw new AnalysisNotScheduledError();
+    } catch (exception, stackTrace) {
+      _completer.completeError(exception, stackTrace);
+    }
+  }
+
+  void _onCancel() {
+    _context._cancelFuture(this);
+  }
+}
+
+/**
+ * An [AnalysisContext] that only contains sources for a Dart SDK.
+ */
+class SdkAnalysisContext extends AnalysisContextImpl {
+  @override
+  AnalysisCache createCacheFromSourceFactory(SourceFactory factory) {
+    if (factory == null) {
+      return super.createCacheFromSourceFactory(factory);
+    }
+    DartSdk sdk = factory.dartSdk;
+    if (sdk == null) {
+      throw new IllegalArgumentException(
+          "The source factory for an SDK analysis context must have a DartUriResolver");
+    }
+    return new AnalysisCache(<CachePartition>[
+      AnalysisEngine.instance.partitionManager_new.forSdk(sdk)
+    ]);
+  }
+}
+
+/**
+ * A helper class used to create futures for [AnalysisContextImpl].
+ * Using a helper class allows us to preserve the generic parameter T.
+ */
+class _AnalysisFutureHelper<T> {
+  final AnalysisContextImpl _context;
+
+  _AnalysisFutureHelper(this._context);
+
+  /**
+   * Return a future that will be completed with the result of calling
+   * [computeValue]. If [computeValue] returns non-`null`, the future will be
+   * completed immediately with the resulting value. If it returns `null`, then
+   * [scheduleComputation] is invoked to schedule analysis that will produce
+   * the required result, and [computeValue] will be re-executed in the future,
+   * after the next time the cached information for [target] has changed. If
+   * [computeValue] throws an exception, the future will fail with that
+   * exception.
+   *
+   * If the [computeValue] still returns `null` after there is no further
+   * analysis to be done for [target], then the future will be completed with
+   * the error AnalysisNotScheduledError.
+   *
+   * Since [computeValue] will be called while the state of analysis is being
+   * updated, it should be free of side effects so that it doesn't cause
+   * reentrant changes to the analysis state.
+   */
+  CancelableFuture<T> computeAsync(AnalysisTarget target,
+      T computeValue(CacheEntry entry), void scheduleComputation()) {
+    if (_context.isDisposed) {
+      // No further analysis is expected, so return a future that completes
+      // immediately with AnalysisNotScheduledError.
+      return new CancelableFuture.error(new AnalysisNotScheduledError());
+    }
+    CacheEntry entry = _context.getCacheEntry(target);
+    PendingFuture pendingFuture =
+        new PendingFuture<T>(_context, target, computeValue);
+    if (!pendingFuture.evaluate(entry)) {
+      _context._pendingFutureTargets
+          .putIfAbsent(target, () => <PendingFuture>[])
+          .add(pendingFuture);
+      scheduleComputation();
+    }
+    return pendingFuture.future;
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/error.dart b/mojo/public/dart/third_party/analyzer/lib/src/error.dart
new file mode 100644
index 0000000..60f5cf0
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/error.dart
@@ -0,0 +1,93 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+library error;
+
+import 'dart:collection';
+
+import 'generated/error.dart';
+
+/// The maximum line length when printing extracted source code when converting
+/// an [AnalyzerError] to a string.
+final _MAX_ERROR_LINE_LENGTH = 120;
+
+/// A wrapper around [AnalysisError] that provides a more user-friendly string
+/// representation.
+class AnalyzerError implements Exception {
+  final AnalysisError error;
+
+  AnalyzerError(this.error);
+
+  String get message => toString();
+
+  String toString() {
+    var builder = new StringBuffer();
+
+    // Print a less friendly string representation to ensure that
+    // error.source.contents is not executed, as .contents it isn't async
+    builder.write("Error in ${error.source.shortName}: ${error.message}");
+
+//    var content = error.source.contents.data;
+//    var beforeError = content.substring(0, error.offset);
+//    var lineNumber = "\n".allMatches(beforeError).length + 1;
+//    builder.writeln("Error on line $lineNumber of ${error.source.fullName}: "
+//        "${error.message}");
+
+//    var errorLineIndex = beforeError.lastIndexOf("\n") + 1;
+//    var errorEndOfLineIndex = content.indexOf("\n", error.offset);
+//    if (errorEndOfLineIndex == -1) errorEndOfLineIndex = content.length;
+//    var errorLine = content.substring(
+//        errorLineIndex, errorEndOfLineIndex);
+//    var errorColumn = error.offset - errorLineIndex;
+//    var errorLength = error.length;
+//
+//    // Ensure that the error line we display isn't too long.
+//    if (errorLine.length > _MAX_ERROR_LINE_LENGTH) {
+//      var leftLength = errorColumn;
+//      var rightLength = errorLine.length - leftLength;
+//      if (leftLength > _MAX_ERROR_LINE_LENGTH ~/ 2 &&
+//          rightLength > _MAX_ERROR_LINE_LENGTH ~/ 2) {
+//        errorLine = "..." + errorLine.substring(
+//            errorColumn - _MAX_ERROR_LINE_LENGTH ~/ 2 + 3,
+//            errorColumn + _MAX_ERROR_LINE_LENGTH ~/ 2 - 3)
+//            + "...";
+//        errorColumn = _MAX_ERROR_LINE_LENGTH ~/ 2;
+//      } else if (rightLength > _MAX_ERROR_LINE_LENGTH ~/ 2) {
+//        errorLine = errorLine.substring(0, _MAX_ERROR_LINE_LENGTH - 3) + "...";
+//      } else {
+//        assert(leftLength > _MAX_ERROR_LINE_LENGTH ~/ 2);
+//        errorColumn -= errorLine.length - _MAX_ERROR_LINE_LENGTH;
+//        errorLine = "..." + errorLine.substring(
+//            errorLine.length - _MAX_ERROR_LINE_LENGTH + 3, errorLine.length);
+//      }
+//      errorLength = math.min(errorLength, _MAX_ERROR_LINE_LENGTH - errorColumn);
+//    }
+//    builder.writeln(errorLine);
+//
+//    for (var i = 0; i < errorColumn; i++) builder.write(" ");
+//    for (var i = 0; i < errorLength; i++) builder.write("^");
+    builder.writeln();
+
+    return builder.toString();
+  }
+}
+
+/// An error class that collects multiple [AnalyzerError]s that are emitted
+/// during a single analysis.
+class AnalyzerErrorGroup implements Exception {
+  final List<AnalyzerError> _errors;
+  AnalyzerErrorGroup(Iterable<AnalyzerError> errors)
+      : _errors = errors.toList();
+
+  /// Creates an [AnalyzerErrorGroup] from a list of lower-level
+  /// [AnalysisError]s.
+  AnalyzerErrorGroup.fromAnalysisErrors(Iterable<AnalysisError> errors)
+      : this(errors.map((e) => new AnalyzerError(e)));
+
+  /// The errors in this collection.
+  List<AnalyzerError> get errors =>
+      new UnmodifiableListView<AnalyzerError>(_errors);
+
+  String get message => toString();
+  String toString() => errors.join("\n");
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/ast.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/ast.dart
new file mode 100644
index 0000000..7940662
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/ast.dart
@@ -0,0 +1,20209 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.ast;
+
+import 'dart:collection';
+
+import 'element.dart';
+import 'engine.dart' show AnalysisEngine;
+import 'java_core.dart';
+import 'java_engine.dart';
+import 'parser.dart';
+import 'scanner.dart';
+import 'source.dart' show LineInfo, Source;
+import 'utilities_collection.dart' show TokenMap;
+import 'utilities_dart.dart';
+
+/**
+ * Two or more string literals that are implicitly concatenated because of being
+ * adjacent (separated only by whitespace).
+ *
+ * While the grammar only allows adjacent strings when all of the strings are of
+ * the same kind (single line or multi-line), this class doesn't enforce that
+ * restriction.
+ *
+ * > adjacentStrings ::=
+ * >     [StringLiteral] [StringLiteral]+
+ */
+class AdjacentStrings extends StringLiteral {
+  /**
+   * The strings that are implicitly concatenated.
+   */
+  NodeList<StringLiteral> _strings;
+
+  /**
+   * Initialize a newly created list of adjacent strings. To be syntactically
+   * valid, the list of [strings] must contain at least two elements.
+   */
+  AdjacentStrings(List<StringLiteral> strings) {
+    _strings = new NodeList<StringLiteral>(this, strings);
+  }
+
+  @override
+  Token get beginToken => _strings.beginToken;
+
+  @override
+  Iterable get childEntities => new ChildEntities()..addAll(_strings);
+
+  @override
+  Token get endToken => _strings.endToken;
+
+  /**
+   * Return the strings that are implicitly concatenated.
+   */
+  NodeList<StringLiteral> get strings => _strings;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitAdjacentStrings(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _strings.accept(visitor);
+  }
+
+  @override
+  void _appendStringValue(StringBuffer buffer) {
+    for (StringLiteral stringLiteral in strings) {
+      stringLiteral._appendStringValue(buffer);
+    }
+  }
+}
+
+/**
+ * An AST node that can be annotated with both a documentation comment and a
+ * list of annotations.
+ */
+abstract class AnnotatedNode extends AstNode {
+  /**
+   * The documentation comment associated with this node, or `null` if this node
+   * does not have a documentation comment associated with it.
+   */
+  Comment _comment;
+
+  /**
+   * The annotations associated with this node.
+   */
+  NodeList<Annotation> _metadata;
+
+  /**
+   * Initialize a newly created annotated node. Either or both of the [comment]
+   * and [metadata] can be `null` if the node does not have the corresponding
+   * attribute.
+   */
+  AnnotatedNode(Comment comment, List<Annotation> metadata) {
+    _comment = _becomeParentOf(comment);
+    _metadata = new NodeList<Annotation>(this, metadata);
+  }
+
+  @override
+  Token get beginToken {
+    if (_comment == null) {
+      if (_metadata.isEmpty) {
+        return firstTokenAfterCommentAndMetadata;
+      }
+      return _metadata.beginToken;
+    } else if (_metadata.isEmpty) {
+      return _comment.beginToken;
+    }
+    Token commentToken = _comment.beginToken;
+    Token metadataToken = _metadata.beginToken;
+    if (commentToken.offset < metadataToken.offset) {
+      return commentToken;
+    }
+    return metadataToken;
+  }
+
+  /**
+   * Return the documentation comment associated with this node, or `null` if
+   * this node does not have a documentation comment associated with it.
+   */
+  Comment get documentationComment => _comment;
+
+  /**
+   * Set the documentation comment associated with this node to the given
+   * [comment].
+   */
+  void set documentationComment(Comment comment) {
+    _comment = _becomeParentOf(comment);
+  }
+
+  /**
+   * Return the first token following the comment and metadata.
+   */
+  Token get firstTokenAfterCommentAndMetadata;
+
+  /**
+   * Return the annotations associated with this node.
+   */
+  NodeList<Annotation> get metadata => _metadata;
+
+  /**
+   * Set the metadata associated with this node to the given [metadata].
+   */
+  @deprecated // Directly modify the list returned by "this.metadata"
+  void set metadata(List<Annotation> metadata) {
+    _metadata.clear();
+    _metadata.addAll(metadata);
+  }
+
+  /**
+   * Return a list containing the comment and annotations associated with this
+   * node, sorted in lexical order.
+   */
+  List<AstNode> get sortedCommentAndAnnotations {
+    return <AstNode>[]
+      ..add(_comment)
+      ..addAll(_metadata)
+      ..sort(AstNode.LEXICAL_ORDER);
+  }
+
+  /**
+   * Return a holder of child entities that subclasses can add to.
+   */
+  ChildEntities get _childEntities {
+    ChildEntities result = new ChildEntities();
+    if (_commentIsBeforeAnnotations()) {
+      result
+        ..add(_comment)
+        ..addAll(_metadata);
+    } else {
+      result.addAll(sortedCommentAndAnnotations);
+    }
+    return result;
+  }
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    if (_commentIsBeforeAnnotations()) {
+      _safelyVisitChild(_comment, visitor);
+      _metadata.accept(visitor);
+    } else {
+      for (AstNode child in sortedCommentAndAnnotations) {
+        child.accept(visitor);
+      }
+    }
+  }
+
+  /**
+   * Return `true` if there are no annotations before the comment. Note that a
+   * result of `true` does not imply that there is a comment, nor that there are
+   * annotations associated with this node.
+   */
+  bool _commentIsBeforeAnnotations() {
+    // TODO(brianwilkerson) Convert this to a getter.
+    if (_comment == null || _metadata.isEmpty) {
+      return true;
+    }
+    Annotation firstAnnotation = _metadata[0];
+    return _comment.offset < firstAnnotation.offset;
+  }
+}
+
+/**
+ * An annotation that can be associated with an AST node.
+ *
+ * > metadata ::=
+ * >     annotation*
+ * >
+ * > annotation ::=
+ * >     '@' [Identifier] ('.' [SimpleIdentifier])? [ArgumentList]?
+ */
+class Annotation extends AstNode {
+  /**
+   * The at sign that introduced the annotation.
+   */
+  Token atSign;
+
+  /**
+   * The name of the class defining the constructor that is being invoked or the
+   * name of the field that is being referenced.
+   */
+  Identifier _name;
+
+  /**
+   * The period before the constructor name, or `null` if this annotation is not
+   * the invocation of a named constructor.
+   */
+  Token period;
+
+  /**
+   * The name of the constructor being invoked, or `null` if this annotation is
+   * not the invocation of a named constructor.
+   */
+  SimpleIdentifier _constructorName;
+
+  /**
+   * The arguments to the constructor being invoked, or `null` if this
+   * annotation is not the invocation of a constructor.
+   */
+  ArgumentList _arguments;
+
+  /**
+   * The element associated with this annotation, or `null` if the AST structure
+   * has not been resolved or if this annotation could not be resolved.
+   */
+  Element _element;
+
+  /**
+   * The element annotation representing this annotation in the element model.
+   */
+  ElementAnnotation elementAnnotation;
+
+  /**
+   * Initialize a newly created annotation. Both the [period] and the
+   * [constructorName] can be `null` if the annotation is not referencing a
+   * named constructor. The [arguments] can be `null` if the annotation is not
+   * referencing a constructor.
+   */
+  Annotation(this.atSign, Identifier name, this.period,
+      SimpleIdentifier constructorName, ArgumentList arguments) {
+    _name = _becomeParentOf(name);
+    _constructorName = _becomeParentOf(constructorName);
+    _arguments = _becomeParentOf(arguments);
+  }
+
+  /**
+   * Return the arguments to the constructor being invoked, or `null` if this
+   * annotation is not the invocation of a constructor.
+   */
+  ArgumentList get arguments => _arguments;
+
+  /**
+   * Set the arguments to the constructor being invoked to the given arguments.
+   */
+  void set arguments(ArgumentList arguments) {
+    _arguments = _becomeParentOf(arguments);
+  }
+
+  @override
+  Token get beginToken => atSign;
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(atSign)
+    ..add(_name)
+    ..add(period)
+    ..add(_constructorName)
+    ..add(_arguments);
+
+  /**
+   * Return the name of the constructor being invoked, or `null` if this
+   * annotation is not the invocation of a named constructor.
+   */
+  SimpleIdentifier get constructorName => _constructorName;
+
+  /**
+   * Set the name of the constructor being invoked to the given [name].
+   */
+  void set constructorName(SimpleIdentifier name) {
+    _constructorName = _becomeParentOf(name);
+  }
+
+  /**
+   * Return the element associated with this annotation, or `null` if the AST
+   * structure has not been resolved or if this annotation could not be
+   * resolved.
+   */
+  Element get element {
+    if (_element != null) {
+      return _element;
+    } else if (_name != null) {
+      return _name.staticElement;
+    }
+    return null;
+  }
+
+  /**
+   * Set the element associated with this annotation to the given [element].
+   */
+  void set element(Element element) {
+    _element = element;
+  }
+
+  @override
+  Token get endToken {
+    if (_arguments != null) {
+      return _arguments.endToken;
+    } else if (_constructorName != null) {
+      return _constructorName.endToken;
+    }
+    return _name.endToken;
+  }
+
+  /**
+   * Return the name of the class defining the constructor that is being invoked
+   * or the name of the field that is being referenced.
+   */
+  Identifier get name => _name;
+
+  /**
+   * Set the name of the class defining the constructor that is being invoked or
+   * the name of the field that is being referenced to the given [name].
+   */
+  void set name(Identifier name) {
+    _name = _becomeParentOf(name);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitAnnotation(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_name, visitor);
+    _safelyVisitChild(_constructorName, visitor);
+    _safelyVisitChild(_arguments, visitor);
+  }
+}
+
+/**
+ * A list of arguments in the invocation of an executable element (that is, a
+ * function, method, or constructor).
+ *
+ * > argumentList ::=
+ * >     '(' arguments? ')'
+ * >
+ * > arguments ::=
+ * >     [NamedExpression] (',' [NamedExpression])*
+ * >   | [Expression] (',' [Expression])* (',' [NamedExpression])*
+ */
+class ArgumentList extends AstNode {
+  /**
+   * The left parenthesis.
+   */
+  Token leftParenthesis;
+
+  /**
+   * The expressions producing the values of the arguments.
+   */
+  NodeList<Expression> _arguments;
+
+  /**
+   * The right parenthesis.
+   */
+  Token rightParenthesis;
+
+  /**
+   * A list containing the elements representing the parameters corresponding to
+   * each of the arguments in this list, or `null` if the AST has not been
+   * resolved or if the function or method being invoked could not be determined
+   * based on static type information. The list must be the same length as the
+   * number of arguments, but can contain `null` entries if a given argument
+   * does not correspond to a formal parameter.
+   */
+  List<ParameterElement> _correspondingStaticParameters;
+
+  /**
+   * A list containing the elements representing the parameters corresponding to
+   * each of the arguments in this list, or `null` if the AST has not been
+   * resolved or if the function or method being invoked could not be determined
+   * based on propagated type information. The list must be the same length as
+   * the number of arguments, but can contain `null` entries if a given argument
+   * does not correspond to a formal parameter.
+   */
+  List<ParameterElement> _correspondingPropagatedParameters;
+
+  /**
+   * Initialize a newly created list of arguments. The list of [arguments] can
+   * be `null` if there are no arguments.
+   */
+  ArgumentList(
+      this.leftParenthesis, List<Expression> arguments, this.rightParenthesis) {
+    _arguments = new NodeList<Expression>(this, arguments);
+  }
+
+  /**
+   * Return the expressions producing the values of the arguments. Although the
+   * language requires that positional arguments appear before named arguments,
+   * this class allows them to be intermixed.
+   */
+  NodeList<Expression> get arguments => _arguments;
+
+  @override
+  Token get beginToken => leftParenthesis;
+
+  /**
+   * TODO(paulberry): Add commas.
+   */
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(leftParenthesis)
+    ..addAll(_arguments)
+    ..add(rightParenthesis);
+
+  /**
+   * Set the parameter elements corresponding to each of the arguments in this
+   * list to the given list of [parameters]. The list of parameters must be the
+   * same length as the number of arguments, but can contain `null` entries if a
+   * given argument does not correspond to a formal parameter.
+   */
+  void set correspondingPropagatedParameters(
+      List<ParameterElement> parameters) {
+    if (parameters.length != _arguments.length) {
+      throw new IllegalArgumentException(
+          "Expected ${_arguments.length} parameters, not ${parameters.length}");
+    }
+    _correspondingPropagatedParameters = parameters;
+  }
+
+  /**
+   * Set the parameter elements corresponding to each of the arguments in this
+   * list to the given list of parameters. The list of parameters must be the
+   * same length as the number of arguments, but can contain `null` entries if a
+   * given argument does not correspond to a formal parameter.
+   */
+  void set correspondingStaticParameters(List<ParameterElement> parameters) {
+    if (parameters.length != _arguments.length) {
+      throw new IllegalArgumentException(
+          "Expected ${_arguments.length} parameters, not ${parameters.length}");
+    }
+    _correspondingStaticParameters = parameters;
+  }
+
+  @override
+  Token get endToken => rightParenthesis;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitArgumentList(this);
+
+  /**
+   * If
+   * * the given [expression] is a child of this list,
+   * * the AST structure has been resolved,
+   * * the function being invoked is known based on propagated type information,
+   *   and
+   * * the expression corresponds to one of the parameters of the function being
+   *   invoked,
+   * then return the parameter element representing the parameter to which the
+   * value of the given expression will be bound. Otherwise, return `null`.
+   */
+  @deprecated // Use "expression.propagatedParameterElement"
+  ParameterElement getPropagatedParameterElementFor(Expression expression) {
+    return _getPropagatedParameterElementFor(expression);
+  }
+
+  /**
+   * If
+   * * the given [expression] is a child of this list,
+   * * the AST structure has been resolved,
+   * * the function being invoked is known based on static type information, and
+   * * the expression corresponds to one of the parameters of the function being
+   *   invoked,
+   * then return the parameter element representing the parameter to which the
+   * value of the given expression will be bound. Otherwise, return `null`.
+   */
+  @deprecated // Use "expression.staticParameterElement"
+  ParameterElement getStaticParameterElementFor(Expression expression) {
+    return _getStaticParameterElementFor(expression);
+  }
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _arguments.accept(visitor);
+  }
+
+  /**
+   * If
+   * * the given [expression] is a child of this list,
+   * * the AST structure has been resolved,
+   * * the function being invoked is known based on propagated type information,
+   *   and
+   * * the expression corresponds to one of the parameters of the function being
+   *   invoked,
+   * then return the parameter element representing the parameter to which the
+   * value of the given expression will be bound. Otherwise, return `null`.
+   */
+  ParameterElement _getPropagatedParameterElementFor(Expression expression) {
+    if (_correspondingPropagatedParameters == null ||
+        _correspondingPropagatedParameters.length != _arguments.length) {
+      // Either the AST structure has not been resolved, the invocation of which
+      // this list is a part could not be resolved, or the argument list was
+      // modified after the parameters were set.
+      return null;
+    }
+    int index = _arguments.indexOf(expression);
+    if (index < 0) {
+      // The expression isn't a child of this node.
+      return null;
+    }
+    return _correspondingPropagatedParameters[index];
+  }
+
+  /**
+   * If
+   * * the given [expression] is a child of this list,
+   * * the AST structure has been resolved,
+   * * the function being invoked is known based on static type information, and
+   * * the expression corresponds to one of the parameters of the function being
+   *   invoked,
+   * then return the parameter element representing the parameter to which the
+   * value of the given expression will be bound. Otherwise, return `null`.
+   */
+  ParameterElement _getStaticParameterElementFor(Expression expression) {
+    if (_correspondingStaticParameters == null ||
+        _correspondingStaticParameters.length != _arguments.length) {
+      // Either the AST structure has not been resolved, the invocation of which
+      // this list is a part could not be resolved, or the argument list was
+      // modified after the parameters were set.
+      return null;
+    }
+    int index = _arguments.indexOf(expression);
+    if (index < 0) {
+      // The expression isn't a child of this node.
+      return null;
+    }
+    return _correspondingStaticParameters[index];
+  }
+}
+
+/**
+ * An as expression.
+ *
+ * > asExpression ::=
+ * >     [Expression] 'as' [TypeName]
+ */
+class AsExpression extends Expression {
+  /**
+   * The expression used to compute the value being cast.
+   */
+  Expression _expression;
+
+  /**
+   * The 'as' operator.
+   */
+  Token asOperator;
+
+  /**
+   * The name of the type being cast to.
+   */
+  TypeName _type;
+
+  /**
+   * Initialize a newly created as expression.
+   */
+  AsExpression(Expression expression, this.asOperator, TypeName type) {
+    _expression = _becomeParentOf(expression);
+    _type = _becomeParentOf(type);
+  }
+
+  @override
+  Token get beginToken => _expression.beginToken;
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(_expression)..add(asOperator)..add(_type);
+
+  @override
+  Token get endToken => _type.endToken;
+
+  /**
+   * Return the expression used to compute the value being cast.
+   */
+  Expression get expression => _expression;
+
+  /**
+   * Set the expression used to compute the value being cast to the given
+   * [expression].
+   */
+  void set expression(Expression expression) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  @override
+  int get precedence => 7;
+
+  /**
+   * Return the name of the type being cast to.
+   */
+  TypeName get type => _type;
+
+  /**
+   * Set the name of the type being cast to to the given [name].
+   */
+  void set type(TypeName name) {
+    _type = _becomeParentOf(name);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitAsExpression(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_expression, visitor);
+    _safelyVisitChild(_type, visitor);
+  }
+}
+
+/**
+ * An assert statement.
+ *
+ * > assertStatement ::=
+ * >     'assert' '(' [Expression] ')' ';'
+ */
+class AssertStatement extends Statement {
+  /**
+   * The token representing the 'assert' keyword.
+   */
+  Token assertKeyword;
+
+  /**
+   * The left parenthesis.
+   */
+  Token leftParenthesis;
+
+  /**
+   * The condition that is being asserted to be `true`.
+   */
+  Expression _condition;
+
+  /**
+   * The right parenthesis.
+   */
+  Token rightParenthesis;
+
+  /**
+   * The semicolon terminating the statement.
+   */
+  Token semicolon;
+
+  /**
+   * Initialize a newly created assert statement.
+   */
+  AssertStatement(this.assertKeyword, this.leftParenthesis,
+      Expression condition, this.rightParenthesis, this.semicolon) {
+    _condition = _becomeParentOf(condition);
+  }
+
+  @override
+  Token get beginToken => assertKeyword;
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(assertKeyword)
+    ..add(leftParenthesis)
+    ..add(_condition)
+    ..add(rightParenthesis)
+    ..add(semicolon);
+
+  /**
+   * Return the condition that is being asserted to be `true`.
+   */
+  Expression get condition => _condition;
+
+  /**
+   * Set the condition that is being asserted to be `true` to the given
+   * [expression].
+   */
+  void set condition(Expression condition) {
+    _condition = _becomeParentOf(condition);
+  }
+
+  @override
+  Token get endToken => semicolon;
+
+  /**
+   * Return the token representing the 'assert' keyword.
+   */
+  @deprecated // Use "this.assertKeyword"
+  Token get keyword => assertKeyword;
+
+  /**
+   * Set the token representing the 'assert' keyword to the given [token].
+   */
+  @deprecated // Use "this.assertKeyword"
+  set keyword(Token token) {
+    assertKeyword = token;
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitAssertStatement(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_condition, visitor);
+  }
+}
+
+/**
+ * An assignment expression.
+ *
+ * > assignmentExpression ::=
+ * >     [Expression] operator [Expression]
+ */
+class AssignmentExpression extends Expression {
+  /**
+   * The expression used to compute the left hand side.
+   */
+  Expression _leftHandSide;
+
+  /**
+   * The assignment operator being applied.
+   */
+  Token operator;
+
+  /**
+   * The expression used to compute the right hand side.
+   */
+  Expression _rightHandSide;
+
+  /**
+   * The element associated with the operator based on the static type of the
+   * left-hand-side, or `null` if the AST structure has not been resolved, if
+   * the operator is not a compound operator, or if the operator could not be
+   * resolved.
+   */
+  MethodElement staticElement;
+
+  /**
+   * The element associated with the operator based on the propagated type of
+   * the left-hand-side, or `null` if the AST structure has not been resolved,
+   * if the operator is not a compound operator, or if the operator could not be
+   * resolved.
+   */
+  MethodElement propagatedElement;
+
+  /**
+   * Initialize a newly created assignment expression.
+   */
+  AssignmentExpression(
+      Expression leftHandSide, this.operator, Expression rightHandSide) {
+    if (leftHandSide == null || rightHandSide == null) {
+      String message;
+      if (leftHandSide == null) {
+        if (rightHandSide == null) {
+          message = "Both the left-hand and right-hand sides are null";
+        } else {
+          message = "The left-hand size is null";
+        }
+      } else {
+        message = "The right-hand size is null";
+      }
+      AnalysisEngine.instance.logger.logError(
+          message, new CaughtException(new AnalysisException(message), null));
+    }
+    _leftHandSide = _becomeParentOf(leftHandSide);
+    _rightHandSide = _becomeParentOf(rightHandSide);
+  }
+
+  @override
+  Token get beginToken => _leftHandSide.beginToken;
+
+  /**
+   * Return the best element available for this operator. If resolution was able
+   * to find a better element based on type propagation, that element will be
+   * returned. Otherwise, the element found using the result of static analysis
+   * will be returned. If resolution has not been performed, then `null` will be
+   * returned.
+   */
+  MethodElement get bestElement {
+    MethodElement element = propagatedElement;
+    if (element == null) {
+      element = staticElement;
+    }
+    return element;
+  }
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(_leftHandSide)
+    ..add(operator)
+    ..add(_rightHandSide);
+
+  @override
+  Token get endToken => _rightHandSide.endToken;
+
+  /**
+   * Set the expression used to compute the left hand side to the given
+   * [expression].
+   */
+  Expression get leftHandSide => _leftHandSide;
+
+  /**
+   * Return the expression used to compute the left hand side.
+   */
+  void set leftHandSide(Expression expression) {
+    _leftHandSide = _becomeParentOf(expression);
+  }
+
+  @override
+  int get precedence => 1;
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is
+   * known based on propagated type information, then return the parameter
+   * element representing the parameter to which the value of the right operand
+   * will be bound. Otherwise, return `null`.
+   */
+  @deprecated // Use "expression.propagatedParameterElement"
+  ParameterElement get propagatedParameterElementForRightHandSide {
+    return _propagatedParameterElementForRightHandSide;
+  }
+
+  /**
+   * Return the expression used to compute the right hand side.
+   */
+  Expression get rightHandSide => _rightHandSide;
+
+  /**
+   * Set the expression used to compute the left hand side to the given
+   * [expression].
+   */
+  void set rightHandSide(Expression expression) {
+    _rightHandSide = _becomeParentOf(expression);
+  }
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is
+   * known based on static type information, then return the parameter element
+   * representing the parameter to which the value of the right operand will be
+   * bound. Otherwise, return `null`.
+   */
+  @deprecated // Use "expression.staticParameterElement"
+  ParameterElement get staticParameterElementForRightHandSide {
+    return _staticParameterElementForRightHandSide;
+  }
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is
+   * known based on propagated type information, then return the parameter
+   * element representing the parameter to which the value of the right operand
+   * will be bound. Otherwise, return `null`.
+   */
+  ParameterElement get _propagatedParameterElementForRightHandSide {
+    ExecutableElement executableElement = null;
+    if (propagatedElement != null) {
+      executableElement = propagatedElement;
+    } else {
+      if (_leftHandSide is Identifier) {
+        Identifier identifier = _leftHandSide as Identifier;
+        Element leftElement = identifier.propagatedElement;
+        if (leftElement is ExecutableElement) {
+          executableElement = leftElement;
+        }
+      }
+      if (_leftHandSide is PropertyAccess) {
+        SimpleIdentifier identifier =
+            (_leftHandSide as PropertyAccess).propertyName;
+        Element leftElement = identifier.propagatedElement;
+        if (leftElement is ExecutableElement) {
+          executableElement = leftElement;
+        }
+      }
+    }
+    if (executableElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters = executableElement.parameters;
+    if (parameters.length < 1) {
+      return null;
+    }
+    return parameters[0];
+  }
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is
+   * known based on static type information, then return the parameter element
+   * representing the parameter to which the value of the right operand will be
+   * bound. Otherwise, return `null`.
+   */
+  ParameterElement get _staticParameterElementForRightHandSide {
+    ExecutableElement executableElement = null;
+    if (staticElement != null) {
+      executableElement = staticElement;
+    } else {
+      if (_leftHandSide is Identifier) {
+        Element leftElement = (_leftHandSide as Identifier).staticElement;
+        if (leftElement is ExecutableElement) {
+          executableElement = leftElement;
+        }
+      }
+      if (_leftHandSide is PropertyAccess) {
+        Element leftElement =
+            (_leftHandSide as PropertyAccess).propertyName.staticElement;
+        if (leftElement is ExecutableElement) {
+          executableElement = leftElement;
+        }
+      }
+    }
+    if (executableElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters = executableElement.parameters;
+    if (parameters.length < 1) {
+      return null;
+    }
+    return parameters[0];
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitAssignmentExpression(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_leftHandSide, visitor);
+    _safelyVisitChild(_rightHandSide, visitor);
+  }
+}
+
+/**
+ * An AST visitor that will clone any AST structure that it visits. The cloner
+ * will only clone the structure, it will not preserve any resolution results or
+ * properties associated with the nodes.
+ */
+class AstCloner implements AstVisitor<AstNode> {
+  /**
+   * A flag indicating whether tokens should be cloned while cloning an AST
+   * structure.
+   */
+  final bool cloneTokens;
+
+  /**
+   * Initialize a newly created AST cloner to optionally clone tokens while
+   * cloning AST nodes if [cloneTokens] is `true`.
+   */
+  AstCloner(
+      [this.cloneTokens = false]); // TODO(brianwilkerson) Change this to be a named parameter.
+
+  /**
+   * Return a clone of the given [node].
+   */
+  AstNode cloneNode(AstNode node) {
+    if (node == null) {
+      return null;
+    }
+    return node.accept(this) as AstNode;
+  }
+
+  /**
+   * Return a list containing cloned versions of the nodes in the given list of
+   * [nodes].
+   */
+  List<AstNode> cloneNodeList(NodeList nodes) {
+    int count = nodes.length;
+    List clonedNodes = new List();
+    for (int i = 0; i < count; i++) {
+      clonedNodes.add((nodes[i]).accept(this) as AstNode);
+    }
+    return clonedNodes;
+  }
+
+  /**
+   * Clone the given [token] if tokens are supposed to be cloned.
+   */
+  Token cloneToken(Token token) {
+    if (cloneTokens) {
+      return (token == null ? null : token.copy());
+    } else {
+      return token;
+    }
+  }
+
+  /**
+   * Clone the given [tokens] if tokens are supposed to be cloned.
+   */
+  List<Token> cloneTokenList(List<Token> tokens) {
+    if (cloneTokens) {
+      return tokens.map((Token token) => token.copy()).toList();
+    }
+    return tokens;
+  }
+
+  @override
+  AdjacentStrings visitAdjacentStrings(AdjacentStrings node) =>
+      new AdjacentStrings(cloneNodeList(node.strings));
+
+  @override
+  Annotation visitAnnotation(Annotation node) => new Annotation(
+      cloneToken(node.atSign), cloneNode(node.name), cloneToken(node.period),
+      cloneNode(node.constructorName), cloneNode(node.arguments));
+
+  @override
+  ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList(
+      cloneToken(node.leftParenthesis), cloneNodeList(node.arguments),
+      cloneToken(node.rightParenthesis));
+
+  @override
+  AsExpression visitAsExpression(AsExpression node) => new AsExpression(
+      cloneNode(node.expression), cloneToken(node.asOperator),
+      cloneNode(node.type));
+
+  @override
+  AstNode visitAssertStatement(AssertStatement node) => new AssertStatement(
+      cloneToken(node.assertKeyword), cloneToken(node.leftParenthesis),
+      cloneNode(node.condition), cloneToken(node.rightParenthesis),
+      cloneToken(node.semicolon));
+
+  @override
+  AssignmentExpression visitAssignmentExpression(AssignmentExpression node) =>
+      new AssignmentExpression(cloneNode(node.leftHandSide),
+          cloneToken(node.operator), cloneNode(node.rightHandSide));
+
+  @override
+  AwaitExpression visitAwaitExpression(AwaitExpression node) =>
+      new AwaitExpression(
+          cloneToken(node.awaitKeyword), cloneNode(node.expression));
+
+  @override
+  BinaryExpression visitBinaryExpression(BinaryExpression node) =>
+      new BinaryExpression(cloneNode(node.leftOperand),
+          cloneToken(node.operator), cloneNode(node.rightOperand));
+
+  @override
+  Block visitBlock(Block node) => new Block(cloneToken(node.leftBracket),
+      cloneNodeList(node.statements), cloneToken(node.rightBracket));
+
+  @override
+  BlockFunctionBody visitBlockFunctionBody(
+      BlockFunctionBody node) => new BlockFunctionBody(
+      cloneToken(node.keyword), cloneToken(node.star), cloneNode(node.block));
+
+  @override
+  BooleanLiteral visitBooleanLiteral(BooleanLiteral node) =>
+      new BooleanLiteral(cloneToken(node.literal), node.value);
+
+  @override
+  BreakStatement visitBreakStatement(BreakStatement node) => new BreakStatement(
+      cloneToken(node.breakKeyword), cloneNode(node.label),
+      cloneToken(node.semicolon));
+
+  @override
+  CascadeExpression visitCascadeExpression(CascadeExpression node) =>
+      new CascadeExpression(
+          cloneNode(node.target), cloneNodeList(node.cascadeSections));
+
+  @override
+  CatchClause visitCatchClause(CatchClause node) => new CatchClause(
+      cloneToken(node.onKeyword), cloneNode(node.exceptionType),
+      cloneToken(node.catchKeyword), cloneToken(node.leftParenthesis),
+      cloneNode(node.exceptionParameter), cloneToken(node.comma),
+      cloneNode(node.stackTraceParameter), cloneToken(node.rightParenthesis),
+      cloneNode(node.body));
+
+  @override
+  ClassDeclaration visitClassDeclaration(ClassDeclaration node) {
+    ClassDeclaration copy = new ClassDeclaration(
+        cloneNode(node.documentationComment), cloneNodeList(node.metadata),
+        cloneToken(node.abstractKeyword), cloneToken(node.classKeyword),
+        cloneNode(node.name), cloneNode(node.typeParameters),
+        cloneNode(node.extendsClause), cloneNode(node.withClause),
+        cloneNode(node.implementsClause), cloneToken(node.leftBracket),
+        cloneNodeList(node.members), cloneToken(node.rightBracket));
+    copy.nativeClause = cloneNode(node.nativeClause);
+    return copy;
+  }
+
+  @override
+  ClassTypeAlias visitClassTypeAlias(ClassTypeAlias node) => new ClassTypeAlias(
+      cloneNode(node.documentationComment), cloneNodeList(node.metadata),
+      cloneToken(node.typedefKeyword), cloneNode(node.name),
+      cloneNode(node.typeParameters), cloneToken(node.equals),
+      cloneToken(node.abstractKeyword), cloneNode(node.superclass),
+      cloneNode(node.withClause), cloneNode(node.implementsClause),
+      cloneToken(node.semicolon));
+
+  @override
+  Comment visitComment(Comment node) {
+    if (node.isDocumentation) {
+      return Comment.createDocumentationCommentWithReferences(
+          cloneTokenList(node.tokens), cloneNodeList(node.references));
+    } else if (node.isBlock) {
+      return Comment.createBlockComment(cloneTokenList(node.tokens));
+    }
+    return Comment.createEndOfLineComment(cloneTokenList(node.tokens));
+  }
+
+  @override
+  CommentReference visitCommentReference(CommentReference node) =>
+      new CommentReference(
+          cloneToken(node.newKeyword), cloneNode(node.identifier));
+
+  @override
+  CompilationUnit visitCompilationUnit(CompilationUnit node) {
+    CompilationUnit clone = new CompilationUnit(cloneToken(node.beginToken),
+        cloneNode(node.scriptTag), cloneNodeList(node.directives),
+        cloneNodeList(node.declarations), cloneToken(node.endToken));
+    clone.lineInfo = node.lineInfo;
+    return clone;
+  }
+
+  @override
+  ConditionalExpression visitConditionalExpression(
+      ConditionalExpression node) => new ConditionalExpression(
+      cloneNode(node.condition), cloneToken(node.question),
+      cloneNode(node.thenExpression), cloneToken(node.colon),
+      cloneNode(node.elseExpression));
+
+  @override
+  ConstructorDeclaration visitConstructorDeclaration(
+      ConstructorDeclaration node) => new ConstructorDeclaration(
+      cloneNode(node.documentationComment), cloneNodeList(node.metadata),
+      cloneToken(node.externalKeyword), cloneToken(node.constKeyword),
+      cloneToken(node.factoryKeyword), cloneNode(node.returnType),
+      cloneToken(node.period), cloneNode(node.name), cloneNode(node.parameters),
+      cloneToken(node.separator), cloneNodeList(node.initializers),
+      cloneNode(node.redirectedConstructor), cloneNode(node.body));
+
+  @override
+  ConstructorFieldInitializer visitConstructorFieldInitializer(
+      ConstructorFieldInitializer node) => new ConstructorFieldInitializer(
+      cloneToken(node.thisKeyword), cloneToken(node.period),
+      cloneNode(node.fieldName), cloneToken(node.equals),
+      cloneNode(node.expression));
+
+  @override
+  ConstructorName visitConstructorName(ConstructorName node) =>
+      new ConstructorName(
+          cloneNode(node.type), cloneToken(node.period), cloneNode(node.name));
+
+  @override
+  ContinueStatement visitContinueStatement(ContinueStatement node) =>
+      new ContinueStatement(cloneToken(node.continueKeyword),
+          cloneNode(node.label), cloneToken(node.semicolon));
+
+  @override
+  DeclaredIdentifier visitDeclaredIdentifier(DeclaredIdentifier node) =>
+      new DeclaredIdentifier(cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata), cloneToken(node.keyword),
+          cloneNode(node.type), cloneNode(node.identifier));
+
+  @override
+  DefaultFormalParameter visitDefaultFormalParameter(
+      DefaultFormalParameter node) => new DefaultFormalParameter(
+      cloneNode(node.parameter), node.kind, cloneToken(node.separator),
+      cloneNode(node.defaultValue));
+
+  @override
+  DoStatement visitDoStatement(DoStatement node) => new DoStatement(
+      cloneToken(node.doKeyword), cloneNode(node.body),
+      cloneToken(node.whileKeyword), cloneToken(node.leftParenthesis),
+      cloneNode(node.condition), cloneToken(node.rightParenthesis),
+      cloneToken(node.semicolon));
+
+  @override
+  DoubleLiteral visitDoubleLiteral(DoubleLiteral node) =>
+      new DoubleLiteral(cloneToken(node.literal), node.value);
+
+  @override
+  EmptyFunctionBody visitEmptyFunctionBody(EmptyFunctionBody node) =>
+      new EmptyFunctionBody(cloneToken(node.semicolon));
+
+  @override
+  EmptyStatement visitEmptyStatement(EmptyStatement node) =>
+      new EmptyStatement(cloneToken(node.semicolon));
+
+  @override
+  AstNode visitEnumConstantDeclaration(EnumConstantDeclaration node) =>
+      new EnumConstantDeclaration(cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata), cloneNode(node.name));
+
+  @override
+  EnumDeclaration visitEnumDeclaration(EnumDeclaration node) =>
+      new EnumDeclaration(cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata), cloneToken(node.enumKeyword),
+          cloneNode(node.name), cloneToken(node.leftBracket),
+          cloneNodeList(node.constants), cloneToken(node.rightBracket));
+
+  @override
+  ExportDirective visitExportDirective(ExportDirective node) {
+    ExportDirective directive = new ExportDirective(
+        cloneNode(node.documentationComment), cloneNodeList(node.metadata),
+        cloneToken(node.keyword), cloneNode(node.uri),
+        cloneNodeList(node.combinators), cloneToken(node.semicolon));
+    directive.source = node.source;
+    directive.uriContent = node.uriContent;
+    return directive;
+  }
+
+  @override
+  ExpressionFunctionBody visitExpressionFunctionBody(
+      ExpressionFunctionBody node) => new ExpressionFunctionBody(
+      cloneToken(node.keyword), cloneToken(node.functionDefinition),
+      cloneNode(node.expression), cloneToken(node.semicolon));
+
+  @override
+  ExpressionStatement visitExpressionStatement(ExpressionStatement node) =>
+      new ExpressionStatement(
+          cloneNode(node.expression), cloneToken(node.semicolon));
+
+  @override
+  ExtendsClause visitExtendsClause(ExtendsClause node) => new ExtendsClause(
+      cloneToken(node.extendsKeyword), cloneNode(node.superclass));
+
+  @override
+  FieldDeclaration visitFieldDeclaration(FieldDeclaration node) =>
+      new FieldDeclaration(cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata), cloneToken(node.staticKeyword),
+          cloneNode(node.fields), cloneToken(node.semicolon));
+
+  @override
+  FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) =>
+      new FieldFormalParameter(cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata), cloneToken(node.keyword),
+          cloneNode(node.type), cloneToken(node.thisKeyword),
+          cloneToken(node.period), cloneNode(node.identifier),
+          cloneNode(node.typeParameters), cloneNode(node.parameters));
+
+  @override
+  ForEachStatement visitForEachStatement(ForEachStatement node) {
+    DeclaredIdentifier loopVariable = node.loopVariable;
+    if (loopVariable == null) {
+      return new ForEachStatement.withReference(cloneToken(node.awaitKeyword),
+          cloneToken(node.forKeyword), cloneToken(node.leftParenthesis),
+          cloneNode(node.identifier), cloneToken(node.inKeyword),
+          cloneNode(node.iterable), cloneToken(node.rightParenthesis),
+          cloneNode(node.body));
+    }
+    return new ForEachStatement.withDeclaration(cloneToken(node.awaitKeyword),
+        cloneToken(node.forKeyword), cloneToken(node.leftParenthesis),
+        cloneNode(loopVariable), cloneToken(node.inKeyword),
+        cloneNode(node.iterable), cloneToken(node.rightParenthesis),
+        cloneNode(node.body));
+  }
+
+  @override
+  FormalParameterList visitFormalParameterList(FormalParameterList node) =>
+      new FormalParameterList(cloneToken(node.leftParenthesis),
+          cloneNodeList(node.parameters), cloneToken(node.leftDelimiter),
+          cloneToken(node.rightDelimiter), cloneToken(node.rightParenthesis));
+
+  @override
+  ForStatement visitForStatement(ForStatement node) => new ForStatement(
+      cloneToken(node.forKeyword), cloneToken(node.leftParenthesis),
+      cloneNode(node.variables), cloneNode(node.initialization),
+      cloneToken(node.leftSeparator), cloneNode(node.condition),
+      cloneToken(node.rightSeparator), cloneNodeList(node.updaters),
+      cloneToken(node.rightParenthesis), cloneNode(node.body));
+
+  @override
+  FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node) =>
+      new FunctionDeclaration(cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata), cloneToken(node.externalKeyword),
+          cloneNode(node.returnType), cloneToken(node.propertyKeyword),
+          cloneNode(node.name), cloneNode(node.functionExpression));
+
+  @override
+  FunctionDeclarationStatement visitFunctionDeclarationStatement(
+          FunctionDeclarationStatement node) =>
+      new FunctionDeclarationStatement(cloneNode(node.functionDeclaration));
+
+  @override
+  FunctionExpression visitFunctionExpression(FunctionExpression node) =>
+      new FunctionExpression(cloneNode(node.typeParameters),
+          cloneNode(node.parameters), cloneNode(node.body));
+
+  @override
+  FunctionExpressionInvocation visitFunctionExpressionInvocation(
+      FunctionExpressionInvocation node) => new FunctionExpressionInvocation(
+      cloneNode(node.function), cloneNode(node.typeArguments),
+      cloneNode(node.argumentList));
+
+  @override
+  FunctionTypeAlias visitFunctionTypeAlias(FunctionTypeAlias node) =>
+      new FunctionTypeAlias(cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata), cloneToken(node.typedefKeyword),
+          cloneNode(node.returnType), cloneNode(node.name),
+          cloneNode(node.typeParameters), cloneNode(node.parameters),
+          cloneToken(node.semicolon));
+
+  @override
+  FunctionTypedFormalParameter visitFunctionTypedFormalParameter(
+      FunctionTypedFormalParameter node) => new FunctionTypedFormalParameter(
+      cloneNode(node.documentationComment), cloneNodeList(node.metadata),
+      cloneNode(node.returnType), cloneNode(node.identifier),
+      cloneNode(node.typeParameters), cloneNode(node.parameters));
+
+  @override
+  HideCombinator visitHideCombinator(HideCombinator node) => new HideCombinator(
+      cloneToken(node.keyword), cloneNodeList(node.hiddenNames));
+
+  @override
+  IfStatement visitIfStatement(IfStatement node) => new IfStatement(
+      cloneToken(node.ifKeyword), cloneToken(node.leftParenthesis),
+      cloneNode(node.condition), cloneToken(node.rightParenthesis),
+      cloneNode(node.thenStatement), cloneToken(node.elseKeyword),
+      cloneNode(node.elseStatement));
+
+  @override
+  ImplementsClause visitImplementsClause(ImplementsClause node) =>
+      new ImplementsClause(
+          cloneToken(node.implementsKeyword), cloneNodeList(node.interfaces));
+
+  @override
+  ImportDirective visitImportDirective(ImportDirective node) {
+    ImportDirective directive = new ImportDirective(
+        cloneNode(node.documentationComment), cloneNodeList(node.metadata),
+        cloneToken(node.keyword), cloneNode(node.uri),
+        cloneToken(node.deferredKeyword), cloneToken(node.asKeyword),
+        cloneNode(node.prefix), cloneNodeList(node.combinators),
+        cloneToken(node.semicolon));
+    directive.source = node.source;
+    directive.uriContent = node.uriContent;
+    return directive;
+  }
+
+  @override
+  IndexExpression visitIndexExpression(IndexExpression node) {
+    Token period = node.period;
+    if (period == null) {
+      return new IndexExpression.forTarget(cloneNode(node.target),
+          cloneToken(node.leftBracket), cloneNode(node.index),
+          cloneToken(node.rightBracket));
+    } else {
+      return new IndexExpression.forCascade(cloneToken(period),
+          cloneToken(node.leftBracket), cloneNode(node.index),
+          cloneToken(node.rightBracket));
+    }
+  }
+
+  @override
+  InstanceCreationExpression visitInstanceCreationExpression(
+      InstanceCreationExpression node) => new InstanceCreationExpression(
+      cloneToken(node.keyword), cloneNode(node.constructorName),
+      cloneNode(node.argumentList));
+
+  @override
+  IntegerLiteral visitIntegerLiteral(IntegerLiteral node) =>
+      new IntegerLiteral(cloneToken(node.literal), node.value);
+
+  @override
+  InterpolationExpression visitInterpolationExpression(
+      InterpolationExpression node) => new InterpolationExpression(
+      cloneToken(node.leftBracket), cloneNode(node.expression),
+      cloneToken(node.rightBracket));
+
+  @override
+  InterpolationString visitInterpolationString(InterpolationString node) =>
+      new InterpolationString(cloneToken(node.contents), node.value);
+
+  @override
+  IsExpression visitIsExpression(IsExpression node) => new IsExpression(
+      cloneNode(node.expression), cloneToken(node.isOperator),
+      cloneToken(node.notOperator), cloneNode(node.type));
+
+  @override
+  Label visitLabel(Label node) =>
+      new Label(cloneNode(node.label), cloneToken(node.colon));
+
+  @override
+  LabeledStatement visitLabeledStatement(LabeledStatement node) =>
+      new LabeledStatement(
+          cloneNodeList(node.labels), cloneNode(node.statement));
+
+  @override
+  LibraryDirective visitLibraryDirective(LibraryDirective node) =>
+      new LibraryDirective(cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata), cloneToken(node.libraryKeyword),
+          cloneNode(node.name), cloneToken(node.semicolon));
+
+  @override
+  LibraryIdentifier visitLibraryIdentifier(LibraryIdentifier node) =>
+      new LibraryIdentifier(cloneNodeList(node.components));
+
+  @override
+  ListLiteral visitListLiteral(ListLiteral node) => new ListLiteral(
+      cloneToken(node.constKeyword), cloneNode(node.typeArguments),
+      cloneToken(node.leftBracket), cloneNodeList(node.elements),
+      cloneToken(node.rightBracket));
+
+  @override
+  MapLiteral visitMapLiteral(MapLiteral node) => new MapLiteral(
+      cloneToken(node.constKeyword), cloneNode(node.typeArguments),
+      cloneToken(node.leftBracket), cloneNodeList(node.entries),
+      cloneToken(node.rightBracket));
+
+  @override
+  MapLiteralEntry visitMapLiteralEntry(
+      MapLiteralEntry node) => new MapLiteralEntry(
+      cloneNode(node.key), cloneToken(node.separator), cloneNode(node.value));
+
+  @override
+  MethodDeclaration visitMethodDeclaration(MethodDeclaration node) =>
+      new MethodDeclaration(cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata), cloneToken(node.externalKeyword),
+          cloneToken(node.modifierKeyword), cloneNode(node.returnType),
+          cloneToken(node.propertyKeyword), cloneToken(node.operatorKeyword),
+          cloneNode(node.name), cloneNode(node.typeParameters),
+          cloneNode(node.parameters), cloneNode(node.body));
+
+  @override
+  MethodInvocation visitMethodInvocation(MethodInvocation node) =>
+      new MethodInvocation(cloneNode(node.target), cloneToken(node.operator),
+          cloneNode(node.methodName), cloneNode(node.typeArguments),
+          cloneNode(node.argumentList));
+
+  @override
+  NamedExpression visitNamedExpression(NamedExpression node) =>
+      new NamedExpression(cloneNode(node.name), cloneNode(node.expression));
+
+  @override
+  AstNode visitNativeClause(NativeClause node) =>
+      new NativeClause(cloneToken(node.nativeKeyword), cloneNode(node.name));
+
+  @override
+  NativeFunctionBody visitNativeFunctionBody(NativeFunctionBody node) =>
+      new NativeFunctionBody(cloneToken(node.nativeKeyword),
+          cloneNode(node.stringLiteral), cloneToken(node.semicolon));
+
+  @override
+  NullLiteral visitNullLiteral(NullLiteral node) =>
+      new NullLiteral(cloneToken(node.literal));
+
+  @override
+  ParenthesizedExpression visitParenthesizedExpression(
+      ParenthesizedExpression node) => new ParenthesizedExpression(
+      cloneToken(node.leftParenthesis), cloneNode(node.expression),
+      cloneToken(node.rightParenthesis));
+
+  @override
+  PartDirective visitPartDirective(PartDirective node) {
+    PartDirective directive = new PartDirective(
+        cloneNode(node.documentationComment), cloneNodeList(node.metadata),
+        cloneToken(node.partKeyword), cloneNode(node.uri),
+        cloneToken(node.semicolon));
+    directive.source = node.source;
+    directive.uriContent = node.uriContent;
+    return directive;
+  }
+
+  @override
+  PartOfDirective visitPartOfDirective(PartOfDirective node) =>
+      new PartOfDirective(cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata), cloneToken(node.partKeyword),
+          cloneToken(node.ofKeyword), cloneNode(node.libraryName),
+          cloneToken(node.semicolon));
+
+  @override
+  PostfixExpression visitPostfixExpression(PostfixExpression node) =>
+      new PostfixExpression(cloneNode(node.operand), cloneToken(node.operator));
+
+  @override
+  PrefixedIdentifier visitPrefixedIdentifier(PrefixedIdentifier node) =>
+      new PrefixedIdentifier(cloneNode(node.prefix), cloneToken(node.period),
+          cloneNode(node.identifier));
+
+  @override
+  PrefixExpression visitPrefixExpression(PrefixExpression node) =>
+      new PrefixExpression(cloneToken(node.operator), cloneNode(node.operand));
+
+  @override
+  PropertyAccess visitPropertyAccess(PropertyAccess node) => new PropertyAccess(
+      cloneNode(node.target), cloneToken(node.operator),
+      cloneNode(node.propertyName));
+
+  @override
+  RedirectingConstructorInvocation visitRedirectingConstructorInvocation(
+          RedirectingConstructorInvocation node) =>
+      new RedirectingConstructorInvocation(cloneToken(node.thisKeyword),
+          cloneToken(node.period), cloneNode(node.constructorName),
+          cloneNode(node.argumentList));
+
+  @override
+  RethrowExpression visitRethrowExpression(RethrowExpression node) =>
+      new RethrowExpression(cloneToken(node.rethrowKeyword));
+
+  @override
+  ReturnStatement visitReturnStatement(ReturnStatement node) =>
+      new ReturnStatement(cloneToken(node.returnKeyword),
+          cloneNode(node.expression), cloneToken(node.semicolon));
+
+  @override
+  ScriptTag visitScriptTag(ScriptTag node) =>
+      new ScriptTag(cloneToken(node.scriptTag));
+
+  @override
+  ShowCombinator visitShowCombinator(ShowCombinator node) => new ShowCombinator(
+      cloneToken(node.keyword), cloneNodeList(node.shownNames));
+
+  @override
+  SimpleFormalParameter visitSimpleFormalParameter(
+      SimpleFormalParameter node) => new SimpleFormalParameter(
+      cloneNode(node.documentationComment), cloneNodeList(node.metadata),
+      cloneToken(node.keyword), cloneNode(node.type),
+      cloneNode(node.identifier));
+
+  @override
+  SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) =>
+      new SimpleIdentifier(cloneToken(node.token));
+
+  @override
+  SimpleStringLiteral visitSimpleStringLiteral(SimpleStringLiteral node) =>
+      new SimpleStringLiteral(cloneToken(node.literal), node.value);
+
+  @override
+  StringInterpolation visitStringInterpolation(StringInterpolation node) =>
+      new StringInterpolation(cloneNodeList(node.elements));
+
+  @override
+  SuperConstructorInvocation visitSuperConstructorInvocation(
+      SuperConstructorInvocation node) => new SuperConstructorInvocation(
+      cloneToken(node.superKeyword), cloneToken(node.period),
+      cloneNode(node.constructorName), cloneNode(node.argumentList));
+
+  @override
+  SuperExpression visitSuperExpression(SuperExpression node) =>
+      new SuperExpression(cloneToken(node.superKeyword));
+
+  @override
+  SwitchCase visitSwitchCase(SwitchCase node) => new SwitchCase(
+      cloneNodeList(node.labels), cloneToken(node.keyword),
+      cloneNode(node.expression), cloneToken(node.colon),
+      cloneNodeList(node.statements));
+
+  @override
+  SwitchDefault visitSwitchDefault(SwitchDefault node) => new SwitchDefault(
+      cloneNodeList(node.labels), cloneToken(node.keyword),
+      cloneToken(node.colon), cloneNodeList(node.statements));
+
+  @override
+  SwitchStatement visitSwitchStatement(SwitchStatement node) =>
+      new SwitchStatement(cloneToken(node.switchKeyword),
+          cloneToken(node.leftParenthesis), cloneNode(node.expression),
+          cloneToken(node.rightParenthesis), cloneToken(node.leftBracket),
+          cloneNodeList(node.members), cloneToken(node.rightBracket));
+
+  @override
+  SymbolLiteral visitSymbolLiteral(SymbolLiteral node) => new SymbolLiteral(
+      cloneToken(node.poundSign), cloneTokenList(node.components));
+
+  @override
+  ThisExpression visitThisExpression(ThisExpression node) =>
+      new ThisExpression(cloneToken(node.thisKeyword));
+
+  @override
+  ThrowExpression visitThrowExpression(ThrowExpression node) =>
+      new ThrowExpression(
+          cloneToken(node.throwKeyword), cloneNode(node.expression));
+
+  @override
+  TopLevelVariableDeclaration visitTopLevelVariableDeclaration(
+      TopLevelVariableDeclaration node) => new TopLevelVariableDeclaration(
+      cloneNode(node.documentationComment), cloneNodeList(node.metadata),
+      cloneNode(node.variables), cloneToken(node.semicolon));
+
+  @override
+  TryStatement visitTryStatement(TryStatement node) => new TryStatement(
+      cloneToken(node.tryKeyword), cloneNode(node.body),
+      cloneNodeList(node.catchClauses), cloneToken(node.finallyKeyword),
+      cloneNode(node.finallyBlock));
+
+  @override
+  TypeArgumentList visitTypeArgumentList(TypeArgumentList node) =>
+      new TypeArgumentList(cloneToken(node.leftBracket),
+          cloneNodeList(node.arguments), cloneToken(node.rightBracket));
+
+  @override
+  TypeName visitTypeName(TypeName node) =>
+      new TypeName(cloneNode(node.name), cloneNode(node.typeArguments));
+
+  @override
+  TypeParameter visitTypeParameter(TypeParameter node) => new TypeParameter(
+      cloneNode(node.documentationComment), cloneNodeList(node.metadata),
+      cloneNode(node.name), cloneToken(node.extendsKeyword),
+      cloneNode(node.bound));
+
+  @override
+  TypeParameterList visitTypeParameterList(TypeParameterList node) =>
+      new TypeParameterList(cloneToken(node.leftBracket),
+          cloneNodeList(node.typeParameters), cloneToken(node.rightBracket));
+
+  @override
+  VariableDeclaration visitVariableDeclaration(VariableDeclaration node) =>
+      new VariableDeclaration(cloneNode(node.name), cloneToken(node.equals),
+          cloneNode(node.initializer));
+
+  @override
+  VariableDeclarationList visitVariableDeclarationList(
+      VariableDeclarationList node) => new VariableDeclarationList(
+      cloneNode(node.documentationComment), cloneNodeList(node.metadata),
+      cloneToken(node.keyword), cloneNode(node.type),
+      cloneNodeList(node.variables));
+
+  @override
+  VariableDeclarationStatement visitVariableDeclarationStatement(
+      VariableDeclarationStatement node) => new VariableDeclarationStatement(
+      cloneNode(node.variables), cloneToken(node.semicolon));
+
+  @override
+  WhileStatement visitWhileStatement(WhileStatement node) => new WhileStatement(
+      cloneToken(node.whileKeyword), cloneToken(node.leftParenthesis),
+      cloneNode(node.condition), cloneToken(node.rightParenthesis),
+      cloneNode(node.body));
+
+  @override
+  WithClause visitWithClause(WithClause node) => new WithClause(
+      cloneToken(node.withKeyword), cloneNodeList(node.mixinTypes));
+
+  @override
+  YieldStatement visitYieldStatement(YieldStatement node) => new YieldStatement(
+      cloneToken(node.yieldKeyword), cloneToken(node.star),
+      cloneNode(node.expression), cloneToken(node.semicolon));
+
+  /**
+   * Return a clone of the given [node].
+   */
+  static AstNode clone(AstNode node) {
+    return node.accept(new AstCloner());
+  }
+}
+
+/**
+ * An AstVisitor that compares the structure of two AstNodes to see whether they
+ * are equal.
+ */
+class AstComparator implements AstVisitor<bool> {
+  /**
+   * The AST node with which the node being visited is to be compared. This is
+   * only valid at the beginning of each visit method (until [isEqualNodes] is
+   * invoked).
+   */
+  AstNode _other;
+
+  /**
+   * Return `true` if the [first] node and the [second] node have the same
+   * structure.
+   *
+   * *Note:* This method is only visible for testing purposes and should not be
+   * used by clients.
+   */
+  bool isEqualNodes(AstNode first, AstNode second) {
+    if (first == null) {
+      return second == null;
+    } else if (second == null) {
+      return false;
+    } else if (first.runtimeType != second.runtimeType) {
+      return false;
+    }
+    _other = second;
+    return first.accept(this);
+  }
+
+  /**
+   * Return `true` if the [first] token and the [second] token have the same
+   * structure.
+   *
+   * *Note:* This method is only visible for testing purposes and should not be
+   * used by clients.
+   */
+  bool isEqualTokens(Token first, Token second) {
+    if (first == null) {
+      return second == null;
+    } else if (second == null) {
+      return false;
+    } else if (identical(first, second)) {
+      return true;
+    }
+    return first.offset == second.offset &&
+        first.length == second.length &&
+        first.lexeme == second.lexeme;
+  }
+
+  @override
+  bool visitAdjacentStrings(AdjacentStrings node) {
+    AdjacentStrings other = _other as AdjacentStrings;
+    return _isEqualNodeLists(node.strings, other.strings);
+  }
+
+  @override
+  bool visitAnnotation(Annotation node) {
+    Annotation other = _other as Annotation;
+    return isEqualTokens(node.atSign, other.atSign) &&
+        isEqualNodes(node.name, other.name) &&
+        isEqualTokens(node.period, other.period) &&
+        isEqualNodes(node.constructorName, other.constructorName) &&
+        isEqualNodes(node.arguments, other.arguments);
+  }
+
+  @override
+  bool visitArgumentList(ArgumentList node) {
+    ArgumentList other = _other as ArgumentList;
+    return isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
+        _isEqualNodeLists(node.arguments, other.arguments) &&
+        isEqualTokens(node.rightParenthesis, other.rightParenthesis);
+  }
+
+  @override
+  bool visitAsExpression(AsExpression node) {
+    AsExpression other = _other as AsExpression;
+    return isEqualNodes(node.expression, other.expression) &&
+        isEqualTokens(node.asOperator, other.asOperator) &&
+        isEqualNodes(node.type, other.type);
+  }
+
+  @override
+  bool visitAssertStatement(AssertStatement node) {
+    AssertStatement other = _other as AssertStatement;
+    return isEqualTokens(node.assertKeyword, other.assertKeyword) &&
+        isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
+        isEqualNodes(node.condition, other.condition) &&
+        isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
+        isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitAssignmentExpression(AssignmentExpression node) {
+    AssignmentExpression other = _other as AssignmentExpression;
+    return isEqualNodes(node.leftHandSide, other.leftHandSide) &&
+        isEqualTokens(node.operator, other.operator) &&
+        isEqualNodes(node.rightHandSide, other.rightHandSide);
+  }
+
+  @override
+  bool visitAwaitExpression(AwaitExpression node) {
+    AwaitExpression other = _other as AwaitExpression;
+    return isEqualTokens(node.awaitKeyword, other.awaitKeyword) &&
+        isEqualNodes(node.expression, other.expression);
+  }
+
+  @override
+  bool visitBinaryExpression(BinaryExpression node) {
+    BinaryExpression other = _other as BinaryExpression;
+    return isEqualNodes(node.leftOperand, other.leftOperand) &&
+        isEqualTokens(node.operator, other.operator) &&
+        isEqualNodes(node.rightOperand, other.rightOperand);
+  }
+
+  @override
+  bool visitBlock(Block node) {
+    Block other = _other as Block;
+    return isEqualTokens(node.leftBracket, other.leftBracket) &&
+        _isEqualNodeLists(node.statements, other.statements) &&
+        isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
+  bool visitBlockFunctionBody(BlockFunctionBody node) {
+    BlockFunctionBody other = _other as BlockFunctionBody;
+    return isEqualNodes(node.block, other.block);
+  }
+
+  @override
+  bool visitBooleanLiteral(BooleanLiteral node) {
+    BooleanLiteral other = _other as BooleanLiteral;
+    return isEqualTokens(node.literal, other.literal) &&
+        node.value == other.value;
+  }
+
+  @override
+  bool visitBreakStatement(BreakStatement node) {
+    BreakStatement other = _other as BreakStatement;
+    return isEqualTokens(node.breakKeyword, other.breakKeyword) &&
+        isEqualNodes(node.label, other.label) &&
+        isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitCascadeExpression(CascadeExpression node) {
+    CascadeExpression other = _other as CascadeExpression;
+    return isEqualNodes(node.target, other.target) &&
+        _isEqualNodeLists(node.cascadeSections, other.cascadeSections);
+  }
+
+  @override
+  bool visitCatchClause(CatchClause node) {
+    CatchClause other = _other as CatchClause;
+    return isEqualTokens(node.onKeyword, other.onKeyword) &&
+        isEqualNodes(node.exceptionType, other.exceptionType) &&
+        isEqualTokens(node.catchKeyword, other.catchKeyword) &&
+        isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
+        isEqualNodes(node.exceptionParameter, other.exceptionParameter) &&
+        isEqualTokens(node.comma, other.comma) &&
+        isEqualNodes(node.stackTraceParameter, other.stackTraceParameter) &&
+        isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
+        isEqualNodes(node.body, other.body);
+  }
+
+  @override
+  bool visitClassDeclaration(ClassDeclaration node) {
+    ClassDeclaration other = _other as ClassDeclaration;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.abstractKeyword, other.abstractKeyword) &&
+        isEqualTokens(node.classKeyword, other.classKeyword) &&
+        isEqualNodes(node.name, other.name) &&
+        isEqualNodes(node.typeParameters, other.typeParameters) &&
+        isEqualNodes(node.extendsClause, other.extendsClause) &&
+        isEqualNodes(node.withClause, other.withClause) &&
+        isEqualNodes(node.implementsClause, other.implementsClause) &&
+        isEqualTokens(node.leftBracket, other.leftBracket) &&
+        _isEqualNodeLists(node.members, other.members) &&
+        isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
+  bool visitClassTypeAlias(ClassTypeAlias node) {
+    ClassTypeAlias other = _other as ClassTypeAlias;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.typedefKeyword, other.typedefKeyword) &&
+        isEqualNodes(node.name, other.name) &&
+        isEqualNodes(node.typeParameters, other.typeParameters) &&
+        isEqualTokens(node.equals, other.equals) &&
+        isEqualTokens(node.abstractKeyword, other.abstractKeyword) &&
+        isEqualNodes(node.superclass, other.superclass) &&
+        isEqualNodes(node.withClause, other.withClause) &&
+        isEqualNodes(node.implementsClause, other.implementsClause) &&
+        isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitComment(Comment node) {
+    Comment other = _other as Comment;
+    return _isEqualNodeLists(node.references, other.references);
+  }
+
+  @override
+  bool visitCommentReference(CommentReference node) {
+    CommentReference other = _other as CommentReference;
+    return isEqualTokens(node.newKeyword, other.newKeyword) &&
+        isEqualNodes(node.identifier, other.identifier);
+  }
+
+  @override
+  bool visitCompilationUnit(CompilationUnit node) {
+    CompilationUnit other = _other as CompilationUnit;
+    return isEqualTokens(node.beginToken, other.beginToken) &&
+        isEqualNodes(node.scriptTag, other.scriptTag) &&
+        _isEqualNodeLists(node.directives, other.directives) &&
+        _isEqualNodeLists(node.declarations, other.declarations) &&
+        isEqualTokens(node.endToken, other.endToken);
+  }
+
+  @override
+  bool visitConditionalExpression(ConditionalExpression node) {
+    ConditionalExpression other = _other as ConditionalExpression;
+    return isEqualNodes(node.condition, other.condition) &&
+        isEqualTokens(node.question, other.question) &&
+        isEqualNodes(node.thenExpression, other.thenExpression) &&
+        isEqualTokens(node.colon, other.colon) &&
+        isEqualNodes(node.elseExpression, other.elseExpression);
+  }
+
+  @override
+  bool visitConstructorDeclaration(ConstructorDeclaration node) {
+    ConstructorDeclaration other = _other as ConstructorDeclaration;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.externalKeyword, other.externalKeyword) &&
+        isEqualTokens(node.constKeyword, other.constKeyword) &&
+        isEqualTokens(node.factoryKeyword, other.factoryKeyword) &&
+        isEqualNodes(node.returnType, other.returnType) &&
+        isEqualTokens(node.period, other.period) &&
+        isEqualNodes(node.name, other.name) &&
+        isEqualNodes(node.parameters, other.parameters) &&
+        isEqualTokens(node.separator, other.separator) &&
+        _isEqualNodeLists(node.initializers, other.initializers) &&
+        isEqualNodes(node.redirectedConstructor, other.redirectedConstructor) &&
+        isEqualNodes(node.body, other.body);
+  }
+
+  @override
+  bool visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    ConstructorFieldInitializer other = _other as ConstructorFieldInitializer;
+    return isEqualTokens(node.thisKeyword, other.thisKeyword) &&
+        isEqualTokens(node.period, other.period) &&
+        isEqualNodes(node.fieldName, other.fieldName) &&
+        isEqualTokens(node.equals, other.equals) &&
+        isEqualNodes(node.expression, other.expression);
+  }
+
+  @override
+  bool visitConstructorName(ConstructorName node) {
+    ConstructorName other = _other as ConstructorName;
+    return isEqualNodes(node.type, other.type) &&
+        isEqualTokens(node.period, other.period) &&
+        isEqualNodes(node.name, other.name);
+  }
+
+  @override
+  bool visitContinueStatement(ContinueStatement node) {
+    ContinueStatement other = _other as ContinueStatement;
+    return isEqualTokens(node.continueKeyword, other.continueKeyword) &&
+        isEqualNodes(node.label, other.label) &&
+        isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitDeclaredIdentifier(DeclaredIdentifier node) {
+    DeclaredIdentifier other = _other as DeclaredIdentifier;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.keyword, other.keyword) &&
+        isEqualNodes(node.type, other.type) &&
+        isEqualNodes(node.identifier, other.identifier);
+  }
+
+  @override
+  bool visitDefaultFormalParameter(DefaultFormalParameter node) {
+    DefaultFormalParameter other = _other as DefaultFormalParameter;
+    return isEqualNodes(node.parameter, other.parameter) &&
+        node.kind == other.kind &&
+        isEqualTokens(node.separator, other.separator) &&
+        isEqualNodes(node.defaultValue, other.defaultValue);
+  }
+
+  @override
+  bool visitDoStatement(DoStatement node) {
+    DoStatement other = _other as DoStatement;
+    return isEqualTokens(node.doKeyword, other.doKeyword) &&
+        isEqualNodes(node.body, other.body) &&
+        isEqualTokens(node.whileKeyword, other.whileKeyword) &&
+        isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
+        isEqualNodes(node.condition, other.condition) &&
+        isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
+        isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitDoubleLiteral(DoubleLiteral node) {
+    DoubleLiteral other = _other as DoubleLiteral;
+    return isEqualTokens(node.literal, other.literal) &&
+        node.value == other.value;
+  }
+
+  @override
+  bool visitEmptyFunctionBody(EmptyFunctionBody node) {
+    EmptyFunctionBody other = _other as EmptyFunctionBody;
+    return isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitEmptyStatement(EmptyStatement node) {
+    EmptyStatement other = _other as EmptyStatement;
+    return isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    EnumConstantDeclaration other = _other as EnumConstantDeclaration;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualNodes(node.name, other.name);
+  }
+
+  @override
+  bool visitEnumDeclaration(EnumDeclaration node) {
+    EnumDeclaration other = _other as EnumDeclaration;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.enumKeyword, other.enumKeyword) &&
+        isEqualNodes(node.name, other.name) &&
+        isEqualTokens(node.leftBracket, other.leftBracket) &&
+        _isEqualNodeLists(node.constants, other.constants) &&
+        isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
+  bool visitExportDirective(ExportDirective node) {
+    ExportDirective other = _other as ExportDirective;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.keyword, other.keyword) &&
+        isEqualNodes(node.uri, other.uri) &&
+        _isEqualNodeLists(node.combinators, other.combinators) &&
+        isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    ExpressionFunctionBody other = _other as ExpressionFunctionBody;
+    return isEqualTokens(node.functionDefinition, other.functionDefinition) &&
+        isEqualNodes(node.expression, other.expression) &&
+        isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitExpressionStatement(ExpressionStatement node) {
+    ExpressionStatement other = _other as ExpressionStatement;
+    return isEqualNodes(node.expression, other.expression) &&
+        isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitExtendsClause(ExtendsClause node) {
+    ExtendsClause other = _other as ExtendsClause;
+    return isEqualTokens(node.extendsKeyword, other.extendsKeyword) &&
+        isEqualNodes(node.superclass, other.superclass);
+  }
+
+  @override
+  bool visitFieldDeclaration(FieldDeclaration node) {
+    FieldDeclaration other = _other as FieldDeclaration;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.staticKeyword, other.staticKeyword) &&
+        isEqualNodes(node.fields, other.fields) &&
+        isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitFieldFormalParameter(FieldFormalParameter node) {
+    FieldFormalParameter other = _other as FieldFormalParameter;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.keyword, other.keyword) &&
+        isEqualNodes(node.type, other.type) &&
+        isEqualTokens(node.thisKeyword, other.thisKeyword) &&
+        isEqualTokens(node.period, other.period) &&
+        isEqualNodes(node.identifier, other.identifier);
+  }
+
+  @override
+  bool visitForEachStatement(ForEachStatement node) {
+    ForEachStatement other = _other as ForEachStatement;
+    return isEqualTokens(node.forKeyword, other.forKeyword) &&
+        isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
+        isEqualNodes(node.loopVariable, other.loopVariable) &&
+        isEqualTokens(node.inKeyword, other.inKeyword) &&
+        isEqualNodes(node.iterable, other.iterable) &&
+        isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
+        isEqualNodes(node.body, other.body);
+  }
+
+  @override
+  bool visitFormalParameterList(FormalParameterList node) {
+    FormalParameterList other = _other as FormalParameterList;
+    return isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
+        _isEqualNodeLists(node.parameters, other.parameters) &&
+        isEqualTokens(node.leftDelimiter, other.leftDelimiter) &&
+        isEqualTokens(node.rightDelimiter, other.rightDelimiter) &&
+        isEqualTokens(node.rightParenthesis, other.rightParenthesis);
+  }
+
+  @override
+  bool visitForStatement(ForStatement node) {
+    ForStatement other = _other as ForStatement;
+    return isEqualTokens(node.forKeyword, other.forKeyword) &&
+        isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
+        isEqualNodes(node.variables, other.variables) &&
+        isEqualNodes(node.initialization, other.initialization) &&
+        isEqualTokens(node.leftSeparator, other.leftSeparator) &&
+        isEqualNodes(node.condition, other.condition) &&
+        isEqualTokens(node.rightSeparator, other.rightSeparator) &&
+        _isEqualNodeLists(node.updaters, other.updaters) &&
+        isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
+        isEqualNodes(node.body, other.body);
+  }
+
+  @override
+  bool visitFunctionDeclaration(FunctionDeclaration node) {
+    FunctionDeclaration other = _other as FunctionDeclaration;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.externalKeyword, other.externalKeyword) &&
+        isEqualNodes(node.returnType, other.returnType) &&
+        isEqualTokens(node.propertyKeyword, other.propertyKeyword) &&
+        isEqualNodes(node.name, other.name) &&
+        isEqualNodes(node.functionExpression, other.functionExpression);
+  }
+
+  @override
+  bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    FunctionDeclarationStatement other = _other as FunctionDeclarationStatement;
+    return isEqualNodes(node.functionDeclaration, other.functionDeclaration);
+  }
+
+  @override
+  bool visitFunctionExpression(FunctionExpression node) {
+    FunctionExpression other = _other as FunctionExpression;
+    return isEqualNodes(node.parameters, other.parameters) &&
+        isEqualNodes(node.body, other.body);
+  }
+
+  @override
+  bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    FunctionExpressionInvocation other = _other as FunctionExpressionInvocation;
+    return isEqualNodes(node.function, other.function) &&
+        isEqualNodes(node.argumentList, other.argumentList);
+  }
+
+  @override
+  bool visitFunctionTypeAlias(FunctionTypeAlias node) {
+    FunctionTypeAlias other = _other as FunctionTypeAlias;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.typedefKeyword, other.typedefKeyword) &&
+        isEqualNodes(node.returnType, other.returnType) &&
+        isEqualNodes(node.name, other.name) &&
+        isEqualNodes(node.typeParameters, other.typeParameters) &&
+        isEqualNodes(node.parameters, other.parameters) &&
+        isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    FunctionTypedFormalParameter other = _other as FunctionTypedFormalParameter;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualNodes(node.returnType, other.returnType) &&
+        isEqualNodes(node.identifier, other.identifier) &&
+        isEqualNodes(node.parameters, other.parameters);
+  }
+
+  @override
+  bool visitHideCombinator(HideCombinator node) {
+    HideCombinator other = _other as HideCombinator;
+    return isEqualTokens(node.keyword, other.keyword) &&
+        _isEqualNodeLists(node.hiddenNames, other.hiddenNames);
+  }
+
+  @override
+  bool visitIfStatement(IfStatement node) {
+    IfStatement other = _other as IfStatement;
+    return isEqualTokens(node.ifKeyword, other.ifKeyword) &&
+        isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
+        isEqualNodes(node.condition, other.condition) &&
+        isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
+        isEqualNodes(node.thenStatement, other.thenStatement) &&
+        isEqualTokens(node.elseKeyword, other.elseKeyword) &&
+        isEqualNodes(node.elseStatement, other.elseStatement);
+  }
+
+  @override
+  bool visitImplementsClause(ImplementsClause node) {
+    ImplementsClause other = _other as ImplementsClause;
+    return isEqualTokens(node.implementsKeyword, other.implementsKeyword) &&
+        _isEqualNodeLists(node.interfaces, other.interfaces);
+  }
+
+  @override
+  bool visitImportDirective(ImportDirective node) {
+    ImportDirective other = _other as ImportDirective;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.keyword, other.keyword) &&
+        isEqualNodes(node.uri, other.uri) &&
+        isEqualTokens(node.deferredKeyword, other.deferredKeyword) &&
+        isEqualTokens(node.asKeyword, other.asKeyword) &&
+        isEqualNodes(node.prefix, other.prefix) &&
+        _isEqualNodeLists(node.combinators, other.combinators) &&
+        isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitIndexExpression(IndexExpression node) {
+    IndexExpression other = _other as IndexExpression;
+    return isEqualNodes(node.target, other.target) &&
+        isEqualTokens(node.leftBracket, other.leftBracket) &&
+        isEqualNodes(node.index, other.index) &&
+        isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
+  bool visitInstanceCreationExpression(InstanceCreationExpression node) {
+    InstanceCreationExpression other = _other as InstanceCreationExpression;
+    return isEqualTokens(node.keyword, other.keyword) &&
+        isEqualNodes(node.constructorName, other.constructorName) &&
+        isEqualNodes(node.argumentList, other.argumentList);
+  }
+
+  @override
+  bool visitIntegerLiteral(IntegerLiteral node) {
+    IntegerLiteral other = _other as IntegerLiteral;
+    return isEqualTokens(node.literal, other.literal) &&
+        (node.value == other.value);
+  }
+
+  @override
+  bool visitInterpolationExpression(InterpolationExpression node) {
+    InterpolationExpression other = _other as InterpolationExpression;
+    return isEqualTokens(node.leftBracket, other.leftBracket) &&
+        isEqualNodes(node.expression, other.expression) &&
+        isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
+  bool visitInterpolationString(InterpolationString node) {
+    InterpolationString other = _other as InterpolationString;
+    return isEqualTokens(node.contents, other.contents) &&
+        node.value == other.value;
+  }
+
+  @override
+  bool visitIsExpression(IsExpression node) {
+    IsExpression other = _other as IsExpression;
+    return isEqualNodes(node.expression, other.expression) &&
+        isEqualTokens(node.isOperator, other.isOperator) &&
+        isEqualTokens(node.notOperator, other.notOperator) &&
+        isEqualNodes(node.type, other.type);
+  }
+
+  @override
+  bool visitLabel(Label node) {
+    Label other = _other as Label;
+    return isEqualNodes(node.label, other.label) &&
+        isEqualTokens(node.colon, other.colon);
+  }
+
+  @override
+  bool visitLabeledStatement(LabeledStatement node) {
+    LabeledStatement other = _other as LabeledStatement;
+    return _isEqualNodeLists(node.labels, other.labels) &&
+        isEqualNodes(node.statement, other.statement);
+  }
+
+  @override
+  bool visitLibraryDirective(LibraryDirective node) {
+    LibraryDirective other = _other as LibraryDirective;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.libraryKeyword, other.libraryKeyword) &&
+        isEqualNodes(node.name, other.name) &&
+        isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitLibraryIdentifier(LibraryIdentifier node) {
+    LibraryIdentifier other = _other as LibraryIdentifier;
+    return _isEqualNodeLists(node.components, other.components);
+  }
+
+  @override
+  bool visitListLiteral(ListLiteral node) {
+    ListLiteral other = _other as ListLiteral;
+    return isEqualTokens(node.constKeyword, other.constKeyword) &&
+        isEqualNodes(node.typeArguments, other.typeArguments) &&
+        isEqualTokens(node.leftBracket, other.leftBracket) &&
+        _isEqualNodeLists(node.elements, other.elements) &&
+        isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
+  bool visitMapLiteral(MapLiteral node) {
+    MapLiteral other = _other as MapLiteral;
+    return isEqualTokens(node.constKeyword, other.constKeyword) &&
+        isEqualNodes(node.typeArguments, other.typeArguments) &&
+        isEqualTokens(node.leftBracket, other.leftBracket) &&
+        _isEqualNodeLists(node.entries, other.entries) &&
+        isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
+  bool visitMapLiteralEntry(MapLiteralEntry node) {
+    MapLiteralEntry other = _other as MapLiteralEntry;
+    return isEqualNodes(node.key, other.key) &&
+        isEqualTokens(node.separator, other.separator) &&
+        isEqualNodes(node.value, other.value);
+  }
+
+  @override
+  bool visitMethodDeclaration(MethodDeclaration node) {
+    MethodDeclaration other = _other as MethodDeclaration;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.externalKeyword, other.externalKeyword) &&
+        isEqualTokens(node.modifierKeyword, other.modifierKeyword) &&
+        isEqualNodes(node.returnType, other.returnType) &&
+        isEqualTokens(node.propertyKeyword, other.propertyKeyword) &&
+        isEqualTokens(node.propertyKeyword, other.propertyKeyword) &&
+        isEqualNodes(node.name, other.name) &&
+        isEqualNodes(node.parameters, other.parameters) &&
+        isEqualNodes(node.body, other.body);
+  }
+
+  @override
+  bool visitMethodInvocation(MethodInvocation node) {
+    MethodInvocation other = _other as MethodInvocation;
+    return isEqualNodes(node.target, other.target) &&
+        isEqualTokens(node.operator, other.operator) &&
+        isEqualNodes(node.methodName, other.methodName) &&
+        isEqualNodes(node.argumentList, other.argumentList);
+  }
+
+  @override
+  bool visitNamedExpression(NamedExpression node) {
+    NamedExpression other = _other as NamedExpression;
+    return isEqualNodes(node.name, other.name) &&
+        isEqualNodes(node.expression, other.expression);
+  }
+
+  @override
+  bool visitNativeClause(NativeClause node) {
+    NativeClause other = _other as NativeClause;
+    return isEqualTokens(node.nativeKeyword, other.nativeKeyword) &&
+        isEqualNodes(node.name, other.name);
+  }
+
+  @override
+  bool visitNativeFunctionBody(NativeFunctionBody node) {
+    NativeFunctionBody other = _other as NativeFunctionBody;
+    return isEqualTokens(node.nativeKeyword, other.nativeKeyword) &&
+        isEqualNodes(node.stringLiteral, other.stringLiteral) &&
+        isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitNullLiteral(NullLiteral node) {
+    NullLiteral other = _other as NullLiteral;
+    return isEqualTokens(node.literal, other.literal);
+  }
+
+  @override
+  bool visitParenthesizedExpression(ParenthesizedExpression node) {
+    ParenthesizedExpression other = _other as ParenthesizedExpression;
+    return isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
+        isEqualNodes(node.expression, other.expression) &&
+        isEqualTokens(node.rightParenthesis, other.rightParenthesis);
+  }
+
+  @override
+  bool visitPartDirective(PartDirective node) {
+    PartDirective other = _other as PartDirective;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.partKeyword, other.partKeyword) &&
+        isEqualNodes(node.uri, other.uri) &&
+        isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitPartOfDirective(PartOfDirective node) {
+    PartOfDirective other = _other as PartOfDirective;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.partKeyword, other.partKeyword) &&
+        isEqualTokens(node.ofKeyword, other.ofKeyword) &&
+        isEqualNodes(node.libraryName, other.libraryName) &&
+        isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitPostfixExpression(PostfixExpression node) {
+    PostfixExpression other = _other as PostfixExpression;
+    return isEqualNodes(node.operand, other.operand) &&
+        isEqualTokens(node.operator, other.operator);
+  }
+
+  @override
+  bool visitPrefixedIdentifier(PrefixedIdentifier node) {
+    PrefixedIdentifier other = _other as PrefixedIdentifier;
+    return isEqualNodes(node.prefix, other.prefix) &&
+        isEqualTokens(node.period, other.period) &&
+        isEqualNodes(node.identifier, other.identifier);
+  }
+
+  @override
+  bool visitPrefixExpression(PrefixExpression node) {
+    PrefixExpression other = _other as PrefixExpression;
+    return isEqualTokens(node.operator, other.operator) &&
+        isEqualNodes(node.operand, other.operand);
+  }
+
+  @override
+  bool visitPropertyAccess(PropertyAccess node) {
+    PropertyAccess other = _other as PropertyAccess;
+    return isEqualNodes(node.target, other.target) &&
+        isEqualTokens(node.operator, other.operator) &&
+        isEqualNodes(node.propertyName, other.propertyName);
+  }
+
+  @override
+  bool visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    RedirectingConstructorInvocation other =
+        _other as RedirectingConstructorInvocation;
+    return isEqualTokens(node.thisKeyword, other.thisKeyword) &&
+        isEqualTokens(node.period, other.period) &&
+        isEqualNodes(node.constructorName, other.constructorName) &&
+        isEqualNodes(node.argumentList, other.argumentList);
+  }
+
+  @override
+  bool visitRethrowExpression(RethrowExpression node) {
+    RethrowExpression other = _other as RethrowExpression;
+    return isEqualTokens(node.rethrowKeyword, other.rethrowKeyword);
+  }
+
+  @override
+  bool visitReturnStatement(ReturnStatement node) {
+    ReturnStatement other = _other as ReturnStatement;
+    return isEqualTokens(node.returnKeyword, other.returnKeyword) &&
+        isEqualNodes(node.expression, other.expression) &&
+        isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitScriptTag(ScriptTag node) {
+    ScriptTag other = _other as ScriptTag;
+    return isEqualTokens(node.scriptTag, other.scriptTag);
+  }
+
+  @override
+  bool visitShowCombinator(ShowCombinator node) {
+    ShowCombinator other = _other as ShowCombinator;
+    return isEqualTokens(node.keyword, other.keyword) &&
+        _isEqualNodeLists(node.shownNames, other.shownNames);
+  }
+
+  @override
+  bool visitSimpleFormalParameter(SimpleFormalParameter node) {
+    SimpleFormalParameter other = _other as SimpleFormalParameter;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.keyword, other.keyword) &&
+        isEqualNodes(node.type, other.type) &&
+        isEqualNodes(node.identifier, other.identifier);
+  }
+
+  @override
+  bool visitSimpleIdentifier(SimpleIdentifier node) {
+    SimpleIdentifier other = _other as SimpleIdentifier;
+    return isEqualTokens(node.token, other.token);
+  }
+
+  @override
+  bool visitSimpleStringLiteral(SimpleStringLiteral node) {
+    SimpleStringLiteral other = _other as SimpleStringLiteral;
+    return isEqualTokens(node.literal, other.literal) &&
+        (node.value == other.value);
+  }
+
+  @override
+  bool visitStringInterpolation(StringInterpolation node) {
+    StringInterpolation other = _other as StringInterpolation;
+    return _isEqualNodeLists(node.elements, other.elements);
+  }
+
+  @override
+  bool visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    SuperConstructorInvocation other = _other as SuperConstructorInvocation;
+    return isEqualTokens(node.superKeyword, other.superKeyword) &&
+        isEqualTokens(node.period, other.period) &&
+        isEqualNodes(node.constructorName, other.constructorName) &&
+        isEqualNodes(node.argumentList, other.argumentList);
+  }
+
+  @override
+  bool visitSuperExpression(SuperExpression node) {
+    SuperExpression other = _other as SuperExpression;
+    return isEqualTokens(node.superKeyword, other.superKeyword);
+  }
+
+  @override
+  bool visitSwitchCase(SwitchCase node) {
+    SwitchCase other = _other as SwitchCase;
+    return _isEqualNodeLists(node.labels, other.labels) &&
+        isEqualTokens(node.keyword, other.keyword) &&
+        isEqualNodes(node.expression, other.expression) &&
+        isEqualTokens(node.colon, other.colon) &&
+        _isEqualNodeLists(node.statements, other.statements);
+  }
+
+  @override
+  bool visitSwitchDefault(SwitchDefault node) {
+    SwitchDefault other = _other as SwitchDefault;
+    return _isEqualNodeLists(node.labels, other.labels) &&
+        isEqualTokens(node.keyword, other.keyword) &&
+        isEqualTokens(node.colon, other.colon) &&
+        _isEqualNodeLists(node.statements, other.statements);
+  }
+
+  @override
+  bool visitSwitchStatement(SwitchStatement node) {
+    SwitchStatement other = _other as SwitchStatement;
+    return isEqualTokens(node.switchKeyword, other.switchKeyword) &&
+        isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
+        isEqualNodes(node.expression, other.expression) &&
+        isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
+        isEqualTokens(node.leftBracket, other.leftBracket) &&
+        _isEqualNodeLists(node.members, other.members) &&
+        isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
+  bool visitSymbolLiteral(SymbolLiteral node) {
+    SymbolLiteral other = _other as SymbolLiteral;
+    return isEqualTokens(node.poundSign, other.poundSign) &&
+        _isEqualTokenLists(node.components, other.components);
+  }
+
+  @override
+  bool visitThisExpression(ThisExpression node) {
+    ThisExpression other = _other as ThisExpression;
+    return isEqualTokens(node.thisKeyword, other.thisKeyword);
+  }
+
+  @override
+  bool visitThrowExpression(ThrowExpression node) {
+    ThrowExpression other = _other as ThrowExpression;
+    return isEqualTokens(node.throwKeyword, other.throwKeyword) &&
+        isEqualNodes(node.expression, other.expression);
+  }
+
+  @override
+  bool visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    TopLevelVariableDeclaration other = _other as TopLevelVariableDeclaration;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualNodes(node.variables, other.variables) &&
+        isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitTryStatement(TryStatement node) {
+    TryStatement other = _other as TryStatement;
+    return isEqualTokens(node.tryKeyword, other.tryKeyword) &&
+        isEqualNodes(node.body, other.body) &&
+        _isEqualNodeLists(node.catchClauses, other.catchClauses) &&
+        isEqualTokens(node.finallyKeyword, other.finallyKeyword) &&
+        isEqualNodes(node.finallyBlock, other.finallyBlock);
+  }
+
+  @override
+  bool visitTypeArgumentList(TypeArgumentList node) {
+    TypeArgumentList other = _other as TypeArgumentList;
+    return isEqualTokens(node.leftBracket, other.leftBracket) &&
+        _isEqualNodeLists(node.arguments, other.arguments) &&
+        isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
+  bool visitTypeName(TypeName node) {
+    TypeName other = _other as TypeName;
+    return isEqualNodes(node.name, other.name) &&
+        isEqualNodes(node.typeArguments, other.typeArguments);
+  }
+
+  @override
+  bool visitTypeParameter(TypeParameter node) {
+    TypeParameter other = _other as TypeParameter;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualNodes(node.name, other.name) &&
+        isEqualTokens(node.extendsKeyword, other.extendsKeyword) &&
+        isEqualNodes(node.bound, other.bound);
+  }
+
+  @override
+  bool visitTypeParameterList(TypeParameterList node) {
+    TypeParameterList other = _other as TypeParameterList;
+    return isEqualTokens(node.leftBracket, other.leftBracket) &&
+        _isEqualNodeLists(node.typeParameters, other.typeParameters) &&
+        isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
+  bool visitVariableDeclaration(VariableDeclaration node) {
+    VariableDeclaration other = _other as VariableDeclaration;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualNodes(node.name, other.name) &&
+        isEqualTokens(node.equals, other.equals) &&
+        isEqualNodes(node.initializer, other.initializer);
+  }
+
+  @override
+  bool visitVariableDeclarationList(VariableDeclarationList node) {
+    VariableDeclarationList other = _other as VariableDeclarationList;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.keyword, other.keyword) &&
+        isEqualNodes(node.type, other.type) &&
+        _isEqualNodeLists(node.variables, other.variables);
+  }
+
+  @override
+  bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    VariableDeclarationStatement other = _other as VariableDeclarationStatement;
+    return isEqualNodes(node.variables, other.variables) &&
+        isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  @override
+  bool visitWhileStatement(WhileStatement node) {
+    WhileStatement other = _other as WhileStatement;
+    return isEqualTokens(node.whileKeyword, other.whileKeyword) &&
+        isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
+        isEqualNodes(node.condition, other.condition) &&
+        isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
+        isEqualNodes(node.body, other.body);
+  }
+
+  @override
+  bool visitWithClause(WithClause node) {
+    WithClause other = _other as WithClause;
+    return isEqualTokens(node.withKeyword, other.withKeyword) &&
+        _isEqualNodeLists(node.mixinTypes, other.mixinTypes);
+  }
+
+  @override
+  bool visitYieldStatement(YieldStatement node) {
+    YieldStatement other = _other as YieldStatement;
+    return isEqualTokens(node.yieldKeyword, other.yieldKeyword) &&
+        isEqualNodes(node.expression, other.expression) &&
+        isEqualTokens(node.semicolon, other.semicolon);
+  }
+
+  /**
+   * Return `true` if the [first] and [second] lists of AST nodes have the same
+   * size and corresponding elements are equal.
+   */
+  bool _isEqualNodeLists(NodeList first, NodeList second) {
+    if (first == null) {
+      return second == null;
+    } else if (second == null) {
+      return false;
+    }
+    int size = first.length;
+    if (second.length != size) {
+      return false;
+    }
+    for (int i = 0; i < size; i++) {
+      if (!isEqualNodes(first[i], second[i])) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Return `true` if the [first] and [second] lists of tokens have the same
+   * length and corresponding elements are equal.
+   */
+  bool _isEqualTokenLists(List<Token> first, List<Token> second) {
+    int length = first.length;
+    if (second.length != length) {
+      return false;
+    }
+    for (int i = 0; i < length; i++) {
+      if (!isEqualTokens(first[i], second[i])) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Return `true` if the [first] and [second] nodes are equal.
+   */
+  static bool equalNodes(AstNode first, AstNode second) {
+    AstComparator comparator = new AstComparator();
+    return comparator.isEqualNodes(first, second);
+  }
+}
+
+/**
+ * A node in the AST structure for a Dart program.
+ */
+abstract class AstNode {
+  /**
+   * An empty list of AST nodes.
+   */
+  @deprecated // Use "AstNode.EMPTY_LIST"
+  static const List<AstNode> EMPTY_ARRAY = EMPTY_LIST;
+
+  /**
+   * An empty list of AST nodes.
+   */
+  static const List<AstNode> EMPTY_LIST = const <AstNode>[];
+
+  /**
+   * A comparator that can be used to sort AST nodes in lexical order. In other
+   * words, `compare` will return a negative value if the offset of the first
+   * node is less than the offset of the second node, zero (0) if the nodes have
+   * the same offset, and a positive value if the offset of the first node is
+   * greater than the offset of the second node.
+   */
+  static Comparator<AstNode> LEXICAL_ORDER =
+      (AstNode first, AstNode second) => first.offset - second.offset;
+
+  /**
+   * The parent of the node, or `null` if the node is the root of an AST
+   * structure.
+   */
+  AstNode _parent;
+
+  /**
+   * A table mapping the names of properties to their values, or `null` if this
+   * node does not have any properties associated with it.
+   */
+  Map<String, Object> _propertyMap;
+
+  /**
+   * Return the first token included in this node's source range.
+   */
+  Token get beginToken;
+
+  /**
+   * Iterate through all the entities (either AST nodes or tokens) which make
+   * up the contents of this node, including doc comments but excluding other
+   * comments.
+   */
+  Iterable /*<AstNode | Token>*/ get childEntities;
+
+  /**
+   * Return the offset of the character immediately following the last character
+   * of this node's source range. This is equivalent to
+   * `node.getOffset() + node.getLength()`. For a compilation unit this will be
+   * equal to the length of the unit's source. For synthetic nodes this will be
+   * equivalent to the node's offset (because the length is zero (0) by
+   * definition).
+   */
+  int get end => offset + length;
+
+  /**
+   * Return the last token included in this node's source range.
+   */
+  Token get endToken;
+
+  /**
+   * Return `true` if this node is a synthetic node. A synthetic node is a node
+   * that was introduced by the parser in order to recover from an error in the
+   * code. Synthetic nodes always have a length of zero (`0`).
+   */
+  bool get isSynthetic => false;
+
+  /**
+   * Return the number of characters in the node's source range.
+   */
+  int get length {
+    Token beginToken = this.beginToken;
+    Token endToken = this.endToken;
+    if (beginToken == null || endToken == null) {
+      return -1;
+    }
+    return endToken.offset + endToken.length - beginToken.offset;
+  }
+
+  /**
+   * Return the offset from the beginning of the file to the first character in
+   * the node's source range.
+   */
+  int get offset {
+    Token beginToken = this.beginToken;
+    if (beginToken == null) {
+      return -1;
+    }
+    return beginToken.offset;
+  }
+
+  /**
+   * Return this node's parent node, or `null` if this node is the root of an
+   * AST structure.
+   *
+   * Note that the relationship between an AST node and its parent node may
+   * change over the lifetime of a node.
+   */
+  AstNode get parent => _parent;
+
+  /**
+   * Set the parent of this node to the [newParent].
+   */
+  @deprecated // Never intended for public use.
+  void set parent(AstNode newParent) {
+    _parent = newParent;
+  }
+
+  /**
+   * Return the node at the root of this node's AST structure. Note that this
+   * method's performance is linear with respect to the depth of the node in the
+   * AST structure (O(depth)).
+   */
+  AstNode get root {
+    AstNode root = this;
+    AstNode parent = this.parent;
+    while (parent != null) {
+      root = parent;
+      parent = root.parent;
+    }
+    return root;
+  }
+
+  /**
+   * Use the given [visitor] to visit this node. Return the value returned by
+   * the visitor as a result of visiting this node.
+   */
+  /* <E> E */ accept(AstVisitor /*<E>*/ visitor);
+
+  /**
+   * Make this node the parent of the given [child] node. Return the child node.
+   */
+  @deprecated // Never intended for public use.
+  AstNode becomeParentOf(AstNode child) {
+    return _becomeParentOf(child);
+  }
+
+  /**
+   * Return the most immediate ancestor of this node for which the [predicate]
+   * returns `true`, or `null` if there is no such ancestor. Note that this node
+   * will never be returned.
+   */
+  AstNode getAncestor(Predicate<AstNode> predicate) {
+    // TODO(brianwilkerson) It is a bug that this method can return `this`.
+    AstNode node = this;
+    while (node != null && !predicate(node)) {
+      node = node.parent;
+    }
+    return node;
+  }
+
+  /**
+   * Return the value of the property with the given [name], or `null` if this
+   * node does not have a property with the given name.
+   */
+  Object getProperty(String name) {
+    if (_propertyMap == null) {
+      return null;
+    }
+    return _propertyMap[name];
+  }
+
+  /**
+   * If the given [child] is not `null`, use the given [visitor] to visit it.
+   */
+  @deprecated // Never intended for public use.
+  void safelyVisitChild(AstNode child, AstVisitor visitor) {
+    if (child != null) {
+      child.accept(visitor);
+    }
+  }
+
+  /**
+   * Set the value of the property with the given [name] to the given [value].
+   * If the value is `null`, the property will effectively be removed.
+   */
+  void setProperty(String name, Object value) {
+    if (value == null) {
+      if (_propertyMap != null) {
+        _propertyMap.remove(name);
+        if (_propertyMap.isEmpty) {
+          _propertyMap = null;
+        }
+      }
+    } else {
+      if (_propertyMap == null) {
+        _propertyMap = new HashMap<String, Object>();
+      }
+      _propertyMap[name] = value;
+    }
+  }
+
+  /**
+   * Return a textual description of this node in a form approximating valid
+   * source. The returned string will not be valid source primarily in the case
+   * where the node itself is not well-formed.
+   */
+  String toSource() {
+    PrintStringWriter writer = new PrintStringWriter();
+    accept(new ToSourceVisitor(writer));
+    return writer.toString();
+  }
+
+  @override
+  String toString() => toSource();
+
+  /**
+   * Use the given [visitor] to visit all of the children of this node. The
+   * children will be visited in lexical order.
+   */
+  void visitChildren(AstVisitor visitor);
+
+  /**
+   * Make this node the parent of the given [child] node. Return the child node.
+   */
+  AstNode _becomeParentOf(AstNode child) {
+    if (child != null) {
+      child._parent = this;
+    }
+    return child;
+  }
+
+  /**
+   * If the given [child] is not `null`, use the given [visitor] to visit it.
+   */
+  void _safelyVisitChild(AstNode child, AstVisitor visitor) {
+    if (child != null) {
+      child.accept(visitor);
+    }
+  }
+}
+
+/**
+ * An object that can be used to visit an AST structure.
+ */
+abstract class AstVisitor<R> {
+  R visitAdjacentStrings(AdjacentStrings node);
+
+  R visitAnnotation(Annotation node);
+
+  R visitArgumentList(ArgumentList node);
+
+  R visitAsExpression(AsExpression node);
+
+  R visitAssertStatement(AssertStatement assertStatement);
+
+  R visitAssignmentExpression(AssignmentExpression node);
+
+  R visitAwaitExpression(AwaitExpression node);
+
+  R visitBinaryExpression(BinaryExpression node);
+
+  R visitBlock(Block node);
+
+  R visitBlockFunctionBody(BlockFunctionBody node);
+
+  R visitBooleanLiteral(BooleanLiteral node);
+
+  R visitBreakStatement(BreakStatement node);
+
+  R visitCascadeExpression(CascadeExpression node);
+
+  R visitCatchClause(CatchClause node);
+
+  R visitClassDeclaration(ClassDeclaration node);
+
+  R visitClassTypeAlias(ClassTypeAlias node);
+
+  R visitComment(Comment node);
+
+  R visitCommentReference(CommentReference node);
+
+  R visitCompilationUnit(CompilationUnit node);
+
+  R visitConditionalExpression(ConditionalExpression node);
+
+  R visitConstructorDeclaration(ConstructorDeclaration node);
+
+  R visitConstructorFieldInitializer(ConstructorFieldInitializer node);
+
+  R visitConstructorName(ConstructorName node);
+
+  R visitContinueStatement(ContinueStatement node);
+
+  R visitDeclaredIdentifier(DeclaredIdentifier node);
+
+  R visitDefaultFormalParameter(DefaultFormalParameter node);
+
+  R visitDoStatement(DoStatement node);
+
+  R visitDoubleLiteral(DoubleLiteral node);
+
+  R visitEmptyFunctionBody(EmptyFunctionBody node);
+
+  R visitEmptyStatement(EmptyStatement node);
+
+  R visitEnumConstantDeclaration(EnumConstantDeclaration node);
+
+  R visitEnumDeclaration(EnumDeclaration node);
+
+  R visitExportDirective(ExportDirective node);
+
+  R visitExpressionFunctionBody(ExpressionFunctionBody node);
+
+  R visitExpressionStatement(ExpressionStatement node);
+
+  R visitExtendsClause(ExtendsClause node);
+
+  R visitFieldDeclaration(FieldDeclaration node);
+
+  R visitFieldFormalParameter(FieldFormalParameter node);
+
+  R visitForEachStatement(ForEachStatement node);
+
+  R visitFormalParameterList(FormalParameterList node);
+
+  R visitForStatement(ForStatement node);
+
+  R visitFunctionDeclaration(FunctionDeclaration node);
+
+  R visitFunctionDeclarationStatement(FunctionDeclarationStatement node);
+
+  R visitFunctionExpression(FunctionExpression node);
+
+  R visitFunctionExpressionInvocation(FunctionExpressionInvocation node);
+
+  R visitFunctionTypeAlias(FunctionTypeAlias functionTypeAlias);
+
+  R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node);
+
+  R visitHideCombinator(HideCombinator node);
+
+  R visitIfStatement(IfStatement node);
+
+  R visitImplementsClause(ImplementsClause node);
+
+  R visitImportDirective(ImportDirective node);
+
+  R visitIndexExpression(IndexExpression node);
+
+  R visitInstanceCreationExpression(InstanceCreationExpression node);
+
+  R visitIntegerLiteral(IntegerLiteral node);
+
+  R visitInterpolationExpression(InterpolationExpression node);
+
+  R visitInterpolationString(InterpolationString node);
+
+  R visitIsExpression(IsExpression node);
+
+  R visitLabel(Label node);
+
+  R visitLabeledStatement(LabeledStatement node);
+
+  R visitLibraryDirective(LibraryDirective node);
+
+  R visitLibraryIdentifier(LibraryIdentifier node);
+
+  R visitListLiteral(ListLiteral node);
+
+  R visitMapLiteral(MapLiteral node);
+
+  R visitMapLiteralEntry(MapLiteralEntry node);
+
+  R visitMethodDeclaration(MethodDeclaration node);
+
+  R visitMethodInvocation(MethodInvocation node);
+
+  R visitNamedExpression(NamedExpression node);
+
+  R visitNativeClause(NativeClause node);
+
+  R visitNativeFunctionBody(NativeFunctionBody node);
+
+  R visitNullLiteral(NullLiteral node);
+
+  R visitParenthesizedExpression(ParenthesizedExpression node);
+
+  R visitPartDirective(PartDirective node);
+
+  R visitPartOfDirective(PartOfDirective node);
+
+  R visitPostfixExpression(PostfixExpression node);
+
+  R visitPrefixedIdentifier(PrefixedIdentifier node);
+
+  R visitPrefixExpression(PrefixExpression node);
+
+  R visitPropertyAccess(PropertyAccess node);
+
+  R visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node);
+
+  R visitRethrowExpression(RethrowExpression node);
+
+  R visitReturnStatement(ReturnStatement node);
+
+  R visitScriptTag(ScriptTag node);
+
+  R visitShowCombinator(ShowCombinator node);
+
+  R visitSimpleFormalParameter(SimpleFormalParameter node);
+
+  R visitSimpleIdentifier(SimpleIdentifier node);
+
+  R visitSimpleStringLiteral(SimpleStringLiteral node);
+
+  R visitStringInterpolation(StringInterpolation node);
+
+  R visitSuperConstructorInvocation(SuperConstructorInvocation node);
+
+  R visitSuperExpression(SuperExpression node);
+
+  R visitSwitchCase(SwitchCase node);
+
+  R visitSwitchDefault(SwitchDefault node);
+
+  R visitSwitchStatement(SwitchStatement node);
+
+  R visitSymbolLiteral(SymbolLiteral node);
+
+  R visitThisExpression(ThisExpression node);
+
+  R visitThrowExpression(ThrowExpression node);
+
+  R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node);
+
+  R visitTryStatement(TryStatement node);
+
+  R visitTypeArgumentList(TypeArgumentList node);
+
+  R visitTypeName(TypeName node);
+
+  R visitTypeParameter(TypeParameter node);
+
+  R visitTypeParameterList(TypeParameterList node);
+
+  R visitVariableDeclaration(VariableDeclaration node);
+
+  R visitVariableDeclarationList(VariableDeclarationList node);
+
+  R visitVariableDeclarationStatement(VariableDeclarationStatement node);
+
+  R visitWhileStatement(WhileStatement node);
+
+  R visitWithClause(WithClause node);
+
+  R visitYieldStatement(YieldStatement node);
+}
+
+/**
+ * An await expression.
+ *
+ * > awaitExpression ::=
+ * >     'await' [Expression]
+ */
+class AwaitExpression extends Expression {
+  /**
+   * The 'await' keyword.
+   */
+  Token awaitKeyword;
+
+  /**
+   * The expression whose value is being waited on.
+   */
+  Expression _expression;
+
+  /**
+   * Initialize a newly created await expression.
+   */
+  AwaitExpression(this.awaitKeyword, Expression expression) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  @override
+  Token get beginToken {
+    if (awaitKeyword != null) {
+      return awaitKeyword;
+    }
+    return _expression.beginToken;
+  }
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(awaitKeyword)..add(_expression);
+
+  @override
+  Token get endToken => _expression.endToken;
+
+  /**
+   * Return the expression whose value is being waited on.
+   */
+  Expression get expression => _expression;
+
+  /**
+   * Set the expression whose value is being waited on to the given [expression].
+   */
+  void set expression(Expression expression) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  @override
+  int get precedence => 0;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitAwaitExpression(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_expression, visitor);
+  }
+}
+
+/**
+ * A binary (infix) expression.
+ *
+ * > binaryExpression ::=
+ * >     [Expression] [Token] [Expression]
+ */
+class BinaryExpression extends Expression {
+  /**
+   * The expression used to compute the left operand.
+   */
+  Expression _leftOperand;
+
+  /**
+   * The binary operator being applied.
+   */
+  Token operator;
+
+  /**
+   * The expression used to compute the right operand.
+   */
+  Expression _rightOperand;
+
+  /**
+   * The element associated with the operator based on the static type of the
+   * left operand, or `null` if the AST structure has not been resolved, if the
+   * operator is not user definable, or if the operator could not be resolved.
+   */
+  MethodElement staticElement;
+
+  /**
+   * The element associated with the operator based on the propagated type of
+   * the left operand, or `null` if the AST structure has not been resolved, if
+   * the operator is not user definable, or if the operator could not be
+   * resolved.
+   */
+  MethodElement propagatedElement;
+
+  /**
+   * Initialize a newly created binary expression.
+   */
+  BinaryExpression(
+      Expression leftOperand, this.operator, Expression rightOperand) {
+    _leftOperand = _becomeParentOf(leftOperand);
+    _rightOperand = _becomeParentOf(rightOperand);
+  }
+
+  @override
+  Token get beginToken => _leftOperand.beginToken;
+
+  /**
+   * Return the best element available for this operator. If resolution was able
+   * to find a better element based on type propagation, that element will be
+   * returned. Otherwise, the element found using the result of static analysis
+   * will be returned. If resolution has not been performed, then `null` will be
+   * returned.
+   */
+  MethodElement get bestElement {
+    MethodElement element = propagatedElement;
+    if (element == null) {
+      element = staticElement;
+    }
+    return element;
+  }
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(_leftOperand)..add(operator)..add(_rightOperand);
+
+  @override
+  Token get endToken => _rightOperand.endToken;
+
+  /**
+   * Return the expression used to compute the left operand.
+   */
+  Expression get leftOperand => _leftOperand;
+
+  /**
+   * Set the expression used to compute the left operand to the given
+   * [expression].
+   */
+  void set leftOperand(Expression expression) {
+    _leftOperand = _becomeParentOf(expression);
+  }
+
+  @override
+  int get precedence => operator.type.precedence;
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is
+   * known based on propagated type information, then return the parameter
+   * element representing the parameter to which the value of the right operand
+   * will be bound. Otherwise, return `null`.
+   */
+  @deprecated // Use "expression.propagatedParameterElement"
+  ParameterElement get propagatedParameterElementForRightOperand {
+    return _propagatedParameterElementForRightOperand;
+  }
+
+  /**
+   * Return the expression used to compute the right operand.
+   */
+  Expression get rightOperand => _rightOperand;
+
+  /**
+   * Set the expression used to compute the right operand to the given
+   * [expression].
+   */
+  void set rightOperand(Expression expression) {
+    _rightOperand = _becomeParentOf(expression);
+  }
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is
+   * known based on static type information, then return the parameter element
+   * representing the parameter to which the value of the right operand will be
+   * bound. Otherwise, return `null`.
+   */
+  @deprecated // Use "expression.staticParameterElement"
+  ParameterElement get staticParameterElementForRightOperand {
+    return _staticParameterElementForRightOperand;
+  }
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is
+   * known based on propagated type information, then return the parameter
+   * element representing the parameter to which the value of the right operand
+   * will be bound. Otherwise, return `null`.
+   */
+  ParameterElement get _propagatedParameterElementForRightOperand {
+    if (propagatedElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters = propagatedElement.parameters;
+    if (parameters.length < 1) {
+      return null;
+    }
+    return parameters[0];
+  }
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is
+   * known based on static type information, then return the parameter element
+   * representing the parameter to which the value of the right operand will be
+   * bound. Otherwise, return `null`.
+   */
+  ParameterElement get _staticParameterElementForRightOperand {
+    if (staticElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters = staticElement.parameters;
+    if (parameters.length < 1) {
+      return null;
+    }
+    return parameters[0];
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitBinaryExpression(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_leftOperand, visitor);
+    _safelyVisitChild(_rightOperand, visitor);
+  }
+}
+
+/**
+ * A sequence of statements.
+ *
+ * > block ::=
+ * >     '{' statement* '}'
+ */
+class Block extends Statement {
+  /**
+   * The left curly bracket.
+   */
+  Token leftBracket;
+
+  /**
+   * The statements contained in the block.
+   */
+  NodeList<Statement> _statements;
+
+  /**
+   * The right curly bracket.
+   */
+  Token rightBracket;
+
+  /**
+   * Initialize a newly created block of code.
+   */
+  Block(this.leftBracket, List<Statement> statements, this.rightBracket) {
+    _statements = new NodeList<Statement>(this, statements);
+  }
+
+  @override
+  Token get beginToken => leftBracket;
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(leftBracket)
+    ..addAll(_statements)
+    ..add(rightBracket);
+
+  @override
+  Token get endToken => rightBracket;
+
+  /**
+   * Return the statements contained in the block.
+   */
+  NodeList<Statement> get statements => _statements;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitBlock(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _statements.accept(visitor);
+  }
+}
+
+/**
+ * A function body that consists of a block of statements.
+ *
+ * > blockFunctionBody ::=
+ * >     ('async' | 'async' '*' | 'sync' '*')? [Block]
+ */
+class BlockFunctionBody extends FunctionBody {
+  /**
+   * The token representing the 'async' or 'sync' keyword, or `null` if there is
+   * no such keyword.
+   */
+  Token keyword;
+
+  /**
+   * The star optionally following the 'async' or 'sync' keyword, or `null` if
+   * there is wither no such keyword or no star.
+   */
+  Token star;
+
+  /**
+   * The block representing the body of the function.
+   */
+  Block _block;
+
+  /**
+   * Initialize a newly created function body consisting of a block of
+   * statements. The [keyword] can be `null` if there is no keyword specified
+   * for the block. The [star] can be `null` if there is no star following the
+   * keyword (and must be `null` if there is no keyword).
+   */
+  BlockFunctionBody(this.keyword, this.star, Block block) {
+    _block = _becomeParentOf(block);
+  }
+
+  @override
+  Token get beginToken => _block.beginToken;
+
+  /**
+   * Return the block representing the body of the function.
+   */
+  Block get block => _block;
+
+  /**
+   * Set the block representing the body of the function to the given [block].
+   */
+  void set block(Block block) {
+    _block = _becomeParentOf(block);
+  }
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(keyword)..add(star)..add(_block);
+
+  @override
+  Token get endToken => _block.endToken;
+
+  @override
+  bool get isAsynchronous => keyword != null && keyword.lexeme == Parser.ASYNC;
+
+  @override
+  bool get isGenerator => star != null;
+
+  @override
+  bool get isSynchronous => keyword == null || keyword.lexeme != Parser.ASYNC;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitBlockFunctionBody(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_block, visitor);
+  }
+}
+
+/**
+ * A boolean literal expression.
+ *
+ * > booleanLiteral ::=
+ * >     'false' | 'true'
+ */
+class BooleanLiteral extends Literal {
+  /**
+   * The token representing the literal.
+   */
+  Token literal;
+
+  /**
+   * The value of the literal.
+   */
+  bool value = false;
+
+  /**
+   * Initialize a newly created boolean literal.
+   */
+  BooleanLiteral(this.literal, this.value);
+
+  @override
+  Token get beginToken => literal;
+
+  @override
+  Iterable get childEntities => new ChildEntities()..add(literal);
+
+  @override
+  Token get endToken => literal;
+
+  @override
+  bool get isSynthetic => literal.isSynthetic;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitBooleanLiteral(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    // There are no children to visit.
+  }
+}
+
+/**
+ * An AST visitor that will recursively visit all of the nodes in an AST
+ * structure, similar to [GeneralizingAstVisitor]. This visitor uses a
+ * breadth-first ordering rather than the depth-first ordering of
+ * [GeneralizingAstVisitor].
+ *
+ * Subclasses that override a visit method must either invoke the overridden
+ * visit method or explicitly invoke the more general visit method. Failure to
+ * do so will cause the visit methods for superclasses of the node to not be
+ * invoked and will cause the children of the visited node to not be visited.
+ *
+ * In addition, subclasses should <b>not</b> explicitly visit the children of a
+ * node, but should ensure that the method [visitNode] is used to visit the
+ * children (either directly or indirectly). Failure to do will break the order
+ * in which nodes are visited.
+ */
+class BreadthFirstVisitor<R> extends GeneralizingAstVisitor<R> {
+  /**
+   * A queue holding the nodes that have not yet been visited in the order in
+   * which they ought to be visited.
+   */
+  Queue<AstNode> _queue = new Queue<AstNode>();
+
+  /**
+   * A visitor, used to visit the children of the current node, that will add
+   * the nodes it visits to the [_queue].
+   */
+  GeneralizingAstVisitor<Object> _childVisitor;
+
+  /**
+   * Initialize a newly created visitor.
+   */
+  BreadthFirstVisitor() {
+    _childVisitor = new GeneralizingAstVisitor_BreadthFirstVisitor(this);
+  }
+
+  /**
+   * Visit all nodes in the tree starting at the given [root] node, in
+   * breadth-first order.
+   */
+  void visitAllNodes(AstNode root) {
+    _queue.add(root);
+    while (!_queue.isEmpty) {
+      AstNode next = _queue.removeFirst();
+      next.accept(this);
+    }
+  }
+
+  @override
+  R visitNode(AstNode node) {
+    node.visitChildren(_childVisitor);
+    return null;
+  }
+}
+
+/**
+ * A break statement.
+ *
+ * > breakStatement ::=
+ * >     'break' [SimpleIdentifier]? ';'
+ */
+class BreakStatement extends Statement {
+  /**
+   * The token representing the 'break' keyword.
+   */
+  Token breakKeyword;
+
+  /**
+   * The label associated with the statement, or `null` if there is no label.
+   */
+  SimpleIdentifier _label;
+
+  /**
+   * The semicolon terminating the statement.
+   */
+  Token semicolon;
+
+  /**
+   * The AstNode which this break statement is breaking from.  This will be
+   * either a [Statement] (in the case of breaking out of a loop), a
+   * [SwitchMember] (in the case of a labeled break statement whose label
+   * matches a label on a switch case in an enclosing switch statement), or
+   * `null` if the AST has not yet been resolved or if the target could not be
+   * resolved. Note that if the source code has errors, the target might be
+   * invalid (e.g. trying to break to a switch case).
+   */
+  AstNode target;
+
+  /**
+   * Initialize a newly created break statement. The [label] can be `null` if
+   * there is no label associated with the statement.
+   */
+  BreakStatement(this.breakKeyword, SimpleIdentifier label, this.semicolon) {
+    _label = _becomeParentOf(label);
+  }
+
+  @override
+  Token get beginToken => breakKeyword;
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(breakKeyword)..add(_label)..add(semicolon);
+
+  @override
+  Token get endToken => semicolon;
+
+  /**
+   * Return the token representing the 'break' keyword.
+   */
+  @deprecated // Use "this.breakKeyword"
+  Token get keyword => breakKeyword;
+
+  /**
+   * Sethe token representing the 'break' keyword to the given [token].
+   */
+  @deprecated // Use "this.breakKeyword"
+  void set keyword(Token token) {
+    breakKeyword = token;
+  }
+
+  /**
+   * Return the label associated with the statement, or `null` if there is no
+   * label.
+   */
+  SimpleIdentifier get label => _label;
+
+  /**
+   * Set the label associated with the statement to the given [identifier].
+   */
+  void set label(SimpleIdentifier identifier) {
+    _label = _becomeParentOf(identifier);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitBreakStatement(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_label, visitor);
+  }
+}
+
+/**
+ * A sequence of cascaded expressions: expressions that share a common target.
+ * There are three kinds of expressions that can be used in a cascade
+ * expression: [IndexExpression], [MethodInvocation] and [PropertyAccess].
+ *
+ * > cascadeExpression ::=
+ * >     [Expression] cascadeSection*
+ * >
+ * > cascadeSection ::=
+ * >     '..'  (cascadeSelector arguments*) (assignableSelector arguments*)*
+ * >     (assignmentOperator expressionWithoutCascade)?
+ * >
+ * > cascadeSelector ::=
+ * >     '[ ' expression '] '
+ * >   | identifier
+ */
+class CascadeExpression extends Expression {
+  /**
+   * The target of the cascade sections.
+   */
+  Expression _target;
+
+  /**
+   * The cascade sections sharing the common target.
+   */
+  NodeList<Expression> _cascadeSections;
+
+  /**
+   * Initialize a newly created cascade expression. The list of
+   * [cascadeSections] must contain at least one element.
+   */
+  CascadeExpression(Expression target, List<Expression> cascadeSections) {
+    _target = _becomeParentOf(target);
+    _cascadeSections = new NodeList<Expression>(this, cascadeSections);
+  }
+
+  @override
+  Token get beginToken => _target.beginToken;
+
+  /**
+   * Return the cascade sections sharing the common target.
+   */
+  NodeList<Expression> get cascadeSections => _cascadeSections;
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(_target)
+    ..addAll(_cascadeSections);
+
+  @override
+  Token get endToken => _cascadeSections.endToken;
+
+  @override
+  int get precedence => 2;
+
+  /**
+   * Return the target of the cascade sections.
+   */
+  Expression get target => _target;
+
+  /**
+   * Set the target of the cascade sections to the given [expression].
+   */
+  void set target(Expression target) {
+    _target = _becomeParentOf(target);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitCascadeExpression(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_target, visitor);
+    _cascadeSections.accept(visitor);
+  }
+}
+
+/**
+ * A catch clause within a try statement.
+ *
+ * > onPart ::=
+ * >     catchPart [Block]
+ * >   | 'on' type catchPart? [Block]
+ * >
+ * > catchPart ::=
+ * >     'catch' '(' [SimpleIdentifier] (',' [SimpleIdentifier])? ')'
+ */
+class CatchClause extends AstNode {
+  /**
+   * The token representing the 'on' keyword, or `null` if there is no 'on'
+   * keyword.
+   */
+  Token onKeyword;
+
+  /**
+   * The type of exceptions caught by this catch clause, or `null` if this catch
+   * clause catches every type of exception.
+   */
+  TypeName _exceptionType;
+
+  /**
+   * The token representing the 'catch' keyword, or `null` if there is no
+   * 'catch' keyword.
+   */
+  Token catchKeyword;
+
+  /**
+   * The left parenthesis, or `null` if there is no 'catch' keyword.
+   */
+  Token leftParenthesis;
+
+  /**
+   * The parameter whose value will be the exception that was thrown, or `null`
+   * if there is no 'catch' keyword.
+   */
+  SimpleIdentifier _exceptionParameter;
+
+  /**
+   * The comma separating the exception parameter from the stack trace
+   * parameter, or `null` if there is no stack trace parameter.
+   */
+  Token comma;
+
+  /**
+   * The parameter whose value will be the stack trace associated with the
+   * exception, or `null` if there is no stack trace parameter.
+   */
+  SimpleIdentifier _stackTraceParameter;
+
+  /**
+   * The right parenthesis, or `null` if there is no 'catch' keyword.
+   */
+  Token rightParenthesis;
+
+  /**
+   * The body of the catch block.
+   */
+  Block _body;
+
+  /**
+   * Initialize a newly created catch clause. The [onKeyword] and
+   * [exceptionType] can be `null` if the clause will catch all exceptions. The
+   * [comma] and [stackTraceParameter] can be `null` if the stack trace is not
+   * referencable within the body.
+   */
+  CatchClause(this.onKeyword, TypeName exceptionType, this.catchKeyword,
+      this.leftParenthesis, SimpleIdentifier exceptionParameter, this.comma,
+      SimpleIdentifier stackTraceParameter, this.rightParenthesis, Block body) {
+    _exceptionType = _becomeParentOf(exceptionType);
+    _exceptionParameter = _becomeParentOf(exceptionParameter);
+    _stackTraceParameter = _becomeParentOf(stackTraceParameter);
+    _body = _becomeParentOf(body);
+  }
+
+  @override
+  Token get beginToken {
+    if (onKeyword != null) {
+      return onKeyword;
+    }
+    return catchKeyword;
+  }
+
+  /**
+   * Return the body of the catch block.
+   */
+  Block get body => _body;
+
+  /**
+   * Set the body of the catch block to the given [block].
+   */
+  void set body(Block block) {
+    _body = _becomeParentOf(block);
+  }
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(onKeyword)
+    ..add(_exceptionType)
+    ..add(catchKeyword)
+    ..add(leftParenthesis)
+    ..add(_exceptionParameter)
+    ..add(comma)
+    ..add(_stackTraceParameter)
+    ..add(rightParenthesis)
+    ..add(_body);
+
+  @override
+  Token get endToken => _body.endToken;
+
+  /**
+   * Return the parameter whose value will be the exception that was thrown, or
+   * `null` if there is no 'catch' keyword.
+   */
+  SimpleIdentifier get exceptionParameter => _exceptionParameter;
+
+  /**
+   * Set the parameter whose value will be the exception that was thrown to the
+   * given [parameter].
+   */
+  void set exceptionParameter(SimpleIdentifier parameter) {
+    _exceptionParameter = _becomeParentOf(parameter);
+  }
+
+  /**
+   * Return the type of exceptions caught by this catch clause, or `null` if
+   * this catch clause catches every type of exception.
+   */
+  TypeName get exceptionType => _exceptionType;
+
+  /**
+   * Set the type of exceptions caught by this catch clause to the given
+   * [exceptionType].
+   */
+  void set exceptionType(TypeName exceptionType) {
+    _exceptionType = _becomeParentOf(exceptionType);
+  }
+
+  /**
+   * Return the parameter whose value will be the stack trace associated with
+   * the exception, or `null` if there is no stack trace parameter.
+   */
+  SimpleIdentifier get stackTraceParameter => _stackTraceParameter;
+
+  /**
+   * Set the parameter whose value will be the stack trace associated with the
+   * exception to the given [parameter].
+   */
+  void set stackTraceParameter(SimpleIdentifier parameter) {
+    _stackTraceParameter = _becomeParentOf(parameter);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitCatchClause(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_exceptionType, visitor);
+    _safelyVisitChild(_exceptionParameter, visitor);
+    _safelyVisitChild(_stackTraceParameter, visitor);
+    _safelyVisitChild(_body, visitor);
+  }
+}
+
+/**
+ * Helper class to allow iteration of child entities of an AST node.
+ */
+class ChildEntities extends Object with IterableMixin implements Iterable {
+  /**
+   * The list of child entities to be iterated over.
+   */
+  List _entities = [];
+
+  @override
+  Iterator get iterator => _entities.iterator;
+
+  /**
+   * Add an AST node or token as the next child entity, if it is not null.
+   */
+  void add(entity) {
+    if (entity != null) {
+      assert(entity is Token || entity is AstNode);
+      _entities.add(entity);
+    }
+  }
+
+  /**
+   * Add the given items as the next child entities, if [items] is not null.
+   */
+  void addAll(Iterable items) {
+    if (items != null) {
+      _entities.addAll(items);
+    }
+  }
+}
+
+/**
+ * The declaration of a class.
+ *
+ * > classDeclaration ::=
+ * >     'abstract'? 'class' [SimpleIdentifier] [TypeParameterList]?
+ * >     ([ExtendsClause] [WithClause]?)?
+ * >     [ImplementsClause]?
+ * >     '{' [ClassMember]* '}'
+ */
+class ClassDeclaration extends NamedCompilationUnitMember {
+  /**
+   * The 'abstract' keyword, or `null` if the keyword was absent.
+   */
+  Token abstractKeyword;
+
+  /**
+   * The token representing the 'class' keyword.
+   */
+  Token classKeyword;
+
+  /**
+   * The type parameters for the class, or `null` if the class does not have any
+   * type parameters.
+   */
+  TypeParameterList _typeParameters;
+
+  /**
+   * The extends clause for the class, or `null` if the class does not extend
+   * any other class.
+   */
+  ExtendsClause _extendsClause;
+
+  /**
+   * The with clause for the class, or `null` if the class does not have a with
+   * clause.
+   */
+  WithClause _withClause;
+
+  /**
+   * The implements clause for the class, or `null` if the class does not
+   * implement any interfaces.
+   */
+  ImplementsClause _implementsClause;
+
+  /**
+   * The native clause for the class, or `null` if the class does not have a
+   * native clause.
+   */
+  NativeClause _nativeClause;
+
+  /**
+   * The left curly bracket.
+   */
+  Token leftBracket;
+
+  /**
+   * The members defined by the class.
+   */
+  NodeList<ClassMember> _members;
+
+  /**
+   * The right curly bracket.
+   */
+  Token rightBracket;
+
+  /**
+   * Initialize a newly created class declaration. Either or both of the
+   * [comment] and [metadata] can be `null` if the class does not have the
+   * corresponding attribute. The [abstractKeyword] can be `null` if the class
+   * is not abstract. The [typeParameters] can be `null` if the class does not
+   * have any type parameters. Any or all of the [extendsClause], [withClause],
+   * and [implementsClause] can be `null` if the class does not have the
+   * corresponding clause. The list of [members] can be `null` if the class does
+   * not have any members.
+   */
+  ClassDeclaration(Comment comment, List<Annotation> metadata,
+      this.abstractKeyword, this.classKeyword, SimpleIdentifier name,
+      TypeParameterList typeParameters, ExtendsClause extendsClause,
+      WithClause withClause, ImplementsClause implementsClause,
+      this.leftBracket, List<ClassMember> members, this.rightBracket)
+      : super(comment, metadata, name) {
+    _typeParameters = _becomeParentOf(typeParameters);
+    _extendsClause = _becomeParentOf(extendsClause);
+    _withClause = _becomeParentOf(withClause);
+    _implementsClause = _becomeParentOf(implementsClause);
+    _members = new NodeList<ClassMember>(this, members);
+  }
+
+  @override
+  Iterable get childEntities => super._childEntities
+    ..add(abstractKeyword)
+    ..add(classKeyword)
+    ..add(_name)
+    ..add(_typeParameters)
+    ..add(_extendsClause)
+    ..add(_withClause)
+    ..add(_implementsClause)
+    ..add(_nativeClause)
+    ..add(leftBracket)
+    ..addAll(members)
+    ..add(rightBracket);
+
+  @override
+  ClassElement get element =>
+      _name != null ? (_name.staticElement as ClassElement) : null;
+
+  @override
+  Token get endToken => rightBracket;
+
+  /**
+   * Return the extends clause for this class, or `null` if the class does not
+   * extend any other class.
+   */
+  ExtendsClause get extendsClause => _extendsClause;
+
+  /**
+   * Set the extends clause for this class to the given [extendsClause].
+   */
+  void set extendsClause(ExtendsClause extendsClause) {
+    _extendsClause = _becomeParentOf(extendsClause);
+  }
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata {
+    if (abstractKeyword != null) {
+      return abstractKeyword;
+    }
+    return classKeyword;
+  }
+
+  /**
+   * Return the implements clause for the class, or `null` if the class does not
+   * implement any interfaces.
+   */
+  ImplementsClause get implementsClause => _implementsClause;
+
+  /**
+   * Set the implements clause for the class to the given [implementsClause].
+   */
+  void set implementsClause(ImplementsClause implementsClause) {
+    _implementsClause = _becomeParentOf(implementsClause);
+  }
+
+  /**
+   * Return `true` if this class is declared to be an abstract class.
+   */
+  bool get isAbstract => abstractKeyword != null;
+
+  /**
+   * Return the members defined by the class.
+   */
+  NodeList<ClassMember> get members => _members;
+
+  /**
+   * Return the native clause for this class, or `null` if the class does not
+   * have a native clause.
+   */
+  NativeClause get nativeClause => _nativeClause;
+
+  /**
+   * Set the native clause for this class to the given [nativeClause].
+   */
+  void set nativeClause(NativeClause nativeClause) {
+    _nativeClause = _becomeParentOf(nativeClause);
+  }
+
+  /**
+   * Return the type parameters for the class, or `null` if the class does not
+   * have any type parameters.
+   */
+  TypeParameterList get typeParameters => _typeParameters;
+
+  /**
+   * Set the type parameters for the class to the given list of [typeParameters].
+   */
+  void set typeParameters(TypeParameterList typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters);
+  }
+
+  /**
+   * Return the with clause for the class, or `null` if the class does not have
+   * a with clause.
+   */
+  WithClause get withClause => _withClause;
+
+  /**
+   * Set the with clause for the class to the given [withClause].
+   */
+  void set withClause(WithClause withClause) {
+    _withClause = _becomeParentOf(withClause);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitClassDeclaration(this);
+
+  /**
+   * Return the constructor declared in the class with the given [name], or
+   * `null` if there is no such constructor. If the [name] is `null` then the
+   * default constructor will be searched for.
+   */
+  ConstructorDeclaration getConstructor(String name) {
+    for (ClassMember classMember in _members) {
+      if (classMember is ConstructorDeclaration) {
+        ConstructorDeclaration constructor = classMember;
+        SimpleIdentifier constructorName = constructor.name;
+        if (name == null && constructorName == null) {
+          return constructor;
+        }
+        if (constructorName != null && constructorName.name == name) {
+          return constructor;
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the field declared in the class with the given [name], or `null` if
+   * there is no such field.
+   */
+  VariableDeclaration getField(String name) {
+    for (ClassMember classMember in _members) {
+      if (classMember is FieldDeclaration) {
+        FieldDeclaration fieldDeclaration = classMember;
+        NodeList<VariableDeclaration> fields =
+            fieldDeclaration.fields.variables;
+        for (VariableDeclaration field in fields) {
+          SimpleIdentifier fieldName = field.name;
+          if (fieldName != null && name == fieldName.name) {
+            return field;
+          }
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the method declared in the class with the given [name], or `null` if
+   * there is no such method.
+   */
+  MethodDeclaration getMethod(String name) {
+    for (ClassMember classMember in _members) {
+      if (classMember is MethodDeclaration) {
+        MethodDeclaration method = classMember;
+        SimpleIdentifier methodName = method.name;
+        if (methodName != null && name == methodName.name) {
+          return method;
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_name, visitor);
+    _safelyVisitChild(_typeParameters, visitor);
+    _safelyVisitChild(_extendsClause, visitor);
+    _safelyVisitChild(_withClause, visitor);
+    _safelyVisitChild(_implementsClause, visitor);
+    _safelyVisitChild(_nativeClause, visitor);
+    members.accept(visitor);
+  }
+}
+
+/**
+ * A node that declares a name within the scope of a class.
+ */
+abstract class ClassMember extends Declaration {
+  /**
+   * Initialize a newly created member of a class. Either or both of the
+   * [comment] and [metadata] can be `null` if the member does not have the
+   * corresponding attribute.
+   */
+  ClassMember(Comment comment, List<Annotation> metadata)
+      : super(comment, metadata);
+}
+
+/**
+ * A class type alias.
+ *
+ * > classTypeAlias ::=
+ * >     [SimpleIdentifier] [TypeParameterList]? '=' 'abstract'? mixinApplication
+ * >
+ * > mixinApplication ::=
+ * >     [TypeName] [WithClause] [ImplementsClause]? ';'
+ */
+class ClassTypeAlias extends TypeAlias {
+  /**
+   * The type parameters for the class, or `null` if the class does not have any
+   * type parameters.
+   */
+  TypeParameterList _typeParameters;
+
+  /**
+   * The token for the '=' separating the name from the definition.
+   */
+  Token equals;
+
+  /**
+   * The token for the 'abstract' keyword, or `null` if this is not defining an
+   * abstract class.
+   */
+  Token abstractKeyword;
+
+  /**
+   * The name of the superclass of the class being declared.
+   */
+  TypeName _superclass;
+
+  /**
+   * The with clause for this class.
+   */
+  WithClause _withClause;
+
+  /**
+   * The implements clause for this class, or `null` if there is no implements
+   * clause.
+   */
+  ImplementsClause _implementsClause;
+
+  /**
+   * Initialize a newly created class type alias. Either or both of the
+   * [comment] and [metadata] can be `null` if the class type alias does not
+   * have the corresponding attribute. The [typeParameters] can be `null` if the
+   * class does not have any type parameters. The [abstractKeyword] can be
+   * `null` if the class is not abstract. The [implementsClause] can be `null`
+   * if the class does not implement any interfaces.
+   */
+  ClassTypeAlias(Comment comment, List<Annotation> metadata, Token keyword,
+      SimpleIdentifier name, TypeParameterList typeParameters, this.equals,
+      this.abstractKeyword, TypeName superclass, WithClause withClause,
+      ImplementsClause implementsClause, Token semicolon)
+      : super(comment, metadata, keyword, name, semicolon) {
+    _typeParameters = _becomeParentOf(typeParameters);
+    _superclass = _becomeParentOf(superclass);
+    _withClause = _becomeParentOf(withClause);
+    _implementsClause = _becomeParentOf(implementsClause);
+  }
+
+  @override
+  Iterable get childEntities => super._childEntities
+    ..add(typedefKeyword)
+    ..add(_name)
+    ..add(_typeParameters)
+    ..add(equals)
+    ..add(abstractKeyword)
+    ..add(_superclass)
+    ..add(_withClause)
+    ..add(_implementsClause)
+    ..add(semicolon);
+
+  @override
+  ClassElement get element =>
+      _name != null ? (_name.staticElement as ClassElement) : null;
+
+  /**
+   * Return the implements clause for this class, or `null` if there is no
+   * implements clause.
+   */
+  ImplementsClause get implementsClause => _implementsClause;
+
+  /**
+   * Set the implements clause for this class to the given [implementsClause].
+   */
+  void set implementsClause(ImplementsClause implementsClause) {
+    _implementsClause = _becomeParentOf(implementsClause);
+  }
+
+  /**
+   * Return `true` if this class is declared to be an abstract class.
+   */
+  bool get isAbstract => abstractKeyword != null;
+
+  /**
+   * Return the name of the superclass of the class being declared.
+   */
+  TypeName get superclass => _superclass;
+
+  /**
+   * Set the name of the superclass of the class being declared to the given
+   * [superclass] name.
+   */
+  void set superclass(TypeName superclass) {
+    _superclass = _becomeParentOf(superclass);
+  }
+
+  /**
+   * Return the type parameters for the class, or `null` if the class does not
+   * have any type parameters.
+   */
+  TypeParameterList get typeParameters => _typeParameters;
+
+  /**
+   * Set the type parameters for the class to the given list of [typeParameters].
+   */
+  void set typeParameters(TypeParameterList typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters);
+  }
+
+  /**
+   * Return the with clause for this class.
+   */
+  WithClause get withClause => _withClause;
+
+  /**
+   * Set the with clause for this class to the given with [withClause].
+   */
+  void set withClause(WithClause withClause) {
+    _withClause = _becomeParentOf(withClause);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitClassTypeAlias(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_name, visitor);
+    _safelyVisitChild(_typeParameters, visitor);
+    _safelyVisitChild(_superclass, visitor);
+    _safelyVisitChild(_withClause, visitor);
+    _safelyVisitChild(_implementsClause, visitor);
+  }
+}
+
+/**
+ * A combinator associated with an import or export directive.
+ *
+ * > combinator ::=
+ * >     [HideCombinator]
+ * >   | [ShowCombinator]
+ */
+abstract class Combinator extends AstNode {
+  /**
+   * The 'hide' or 'show' keyword specifying what kind of processing is to be
+   * done on the names.
+   */
+  Token keyword;
+
+  /**
+   * Initialize a newly created combinator.
+   */
+  Combinator(this.keyword);
+
+  @override
+  Token get beginToken => keyword;
+}
+
+/**
+ * A comment within the source code.
+ *
+ * > comment ::=
+ * >     endOfLineComment
+ * >   | blockComment
+ * >   | documentationComment
+ * >
+ * > endOfLineComment ::=
+ * >     '//' (CHARACTER - EOL)* EOL
+ * >
+ * > blockComment ::=
+ * >     '/ *' CHARACTER* '&#42;/'
+ * >
+ * > documentationComment ::=
+ * >     '/ **' (CHARACTER | [CommentReference])* '&#42;/'
+ * >   | ('///' (CHARACTER - EOL)* EOL)+
+ */
+class Comment extends AstNode {
+  /**
+   * The tokens representing the comment.
+   */
+  final List<Token> tokens;
+
+  /**
+   * The type of the comment.
+   */
+  final CommentType _type;
+
+  /**
+   * The references embedded within the documentation comment. This list will be
+   * empty unless this is a documentation comment that has references embedded
+   * within it.
+   */
+  NodeList<CommentReference> _references;
+
+  /**
+   * Initialize a newly created comment. The list of [tokens] must contain at
+   * least one token. The [type] is the type of the comment. The list of
+   * [references] can be empty if the comment does not contain any embedded
+   * references.
+   */
+  Comment(this.tokens, this._type, List<CommentReference> references) {
+    _references = new NodeList<CommentReference>(this, references);
+  }
+
+  @override
+  Token get beginToken => tokens[0];
+
+  @override
+  Iterable get childEntities => new ChildEntities()..addAll(tokens);
+
+  @override
+  Token get endToken => tokens[tokens.length - 1];
+
+  /**
+   * Return `true` if this is a block comment.
+   */
+  bool get isBlock => _type == CommentType.BLOCK;
+
+  /**
+   * Return `true` if this is a documentation comment.
+   */
+  bool get isDocumentation => _type == CommentType.DOCUMENTATION;
+
+  /**
+   * Return `true` if this is an end-of-line comment.
+   */
+  bool get isEndOfLine => _type == CommentType.END_OF_LINE;
+
+  /**
+   * Return the references embedded within the documentation comment.
+   */
+  NodeList<CommentReference> get references => _references;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitComment(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _references.accept(visitor);
+  }
+
+  /**
+   * Create a block comment consisting of the given [tokens].
+   */
+  static Comment createBlockComment(List<Token> tokens) =>
+      new Comment(tokens, CommentType.BLOCK, null);
+
+  /**
+   * Create a documentation comment consisting of the given [tokens].
+   */
+  static Comment createDocumentationComment(List<Token> tokens) => new Comment(
+      tokens, CommentType.DOCUMENTATION, new List<CommentReference>());
+
+  /**
+   * Create a documentation comment consisting of the given [tokens] and having
+   * the given [references] embedded within it.
+   */
+  static Comment createDocumentationCommentWithReferences(
+          List<Token> tokens, List<CommentReference> references) =>
+      new Comment(tokens, CommentType.DOCUMENTATION, references);
+
+  /**
+   * Create an end-of-line comment consisting of the given [tokens].
+   */
+  static Comment createEndOfLineComment(List<Token> tokens) =>
+      new Comment(tokens, CommentType.END_OF_LINE, null);
+}
+
+/**
+ * A reference to a Dart element that is found within a documentation comment.
+ *
+ * > commentReference ::=
+ * >     '[' 'new'? [Identifier] ']'
+ */
+class CommentReference extends AstNode {
+  /**
+   * The token representing the 'new' keyword, or `null` if there was no 'new'
+   * keyword.
+   */
+  Token newKeyword;
+
+  /**
+   * The identifier being referenced.
+   */
+  Identifier _identifier;
+
+  /**
+   * Initialize a newly created reference to a Dart element. The [newKeyword]
+   * can be `null` if the reference is not to a constructor.
+   */
+  CommentReference(this.newKeyword, Identifier identifier) {
+    _identifier = _becomeParentOf(identifier);
+  }
+
+  @override
+  Token get beginToken => _identifier.beginToken;
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(newKeyword)..add(_identifier);
+
+  @override
+  Token get endToken => _identifier.endToken;
+
+  /**
+   * Return the identifier being referenced.
+   */
+  Identifier get identifier => _identifier;
+
+  /**
+   * Set the identifier being referenced to the given [identifier].
+   */
+  void set identifier(Identifier identifier) {
+    _identifier = _becomeParentOf(identifier);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitCommentReference(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_identifier, visitor);
+  }
+}
+
+/**
+ * The possible types of comments that are recognized by the parser.
+ */
+class CommentType {
+  /**
+   * A block comment.
+   */
+  static const CommentType BLOCK = const CommentType('BLOCK');
+
+  /**
+   * A documentation comment.
+   */
+  static const CommentType DOCUMENTATION = const CommentType('DOCUMENTATION');
+
+  /**
+   * An end-of-line comment.
+   */
+  static const CommentType END_OF_LINE = const CommentType('END_OF_LINE');
+
+  /**
+   * The name of the comment type.
+   */
+  final String name;
+
+  /**
+   * Initialize a newly created comment type to have the given [name].
+   */
+  const CommentType(this.name);
+
+  @override
+  String toString() => name;
+}
+
+/**
+ * A compilation unit.
+ *
+ * While the grammar restricts the order of the directives and declarations
+ * within a compilation unit, this class does not enforce those restrictions.
+ * In particular, the children of a compilation unit will be visited in lexical
+ * order even if lexical order does not conform to the restrictions of the
+ * grammar.
+ *
+ * > compilationUnit ::=
+ * >     directives declarations
+ * >
+ * > directives ::=
+ * >     [ScriptTag]? [LibraryDirective]? namespaceDirective* [PartDirective]*
+ * >   | [PartOfDirective]
+ * >
+ * > namespaceDirective ::=
+ * >     [ImportDirective]
+ * >   | [ExportDirective]
+ * >
+ * > declarations ::=
+ * >     [CompilationUnitMember]*
+ */
+class CompilationUnit extends AstNode {
+  /**
+   * The first token in the token stream that was parsed to form this
+   * compilation unit.
+   */
+  Token beginToken;
+
+  /**
+   * The script tag at the beginning of the compilation unit, or `null` if there
+   * is no script tag in this compilation unit.
+   */
+  ScriptTag _scriptTag;
+
+  /**
+   * The directives contained in this compilation unit.
+   */
+  NodeList<Directive> _directives;
+
+  /**
+   * The declarations contained in this compilation unit.
+   */
+  NodeList<CompilationUnitMember> _declarations;
+
+  /**
+   * The last token in the token stream that was parsed to form this compilation
+   * unit. This token should always have a type of [TokenType.EOF].
+   */
+  Token endToken;
+
+  /**
+   * The element associated with this compilation unit, or `null` if the AST
+   * structure has not been resolved.
+   */
+  CompilationUnitElement element;
+
+  /**
+   * The line information for this compilation unit.
+   */
+  LineInfo lineInfo;
+
+  /**
+   * Initialize a newly created compilation unit to have the given directives
+   * and declarations. The [scriptTag] can be `null` if there is no script tag
+   * in the compilation unit. The list of [directives] can be `null` if there
+   * are no directives in the compilation unit. The list of [declarations] can
+   * be `null` if there are no declarations in the compilation unit.
+   */
+  CompilationUnit(this.beginToken, ScriptTag scriptTag,
+      List<Directive> directives, List<CompilationUnitMember> declarations,
+      this.endToken) {
+    _scriptTag = _becomeParentOf(scriptTag);
+    _directives = new NodeList<Directive>(this, directives);
+    _declarations = new NodeList<CompilationUnitMember>(this, declarations);
+  }
+
+  @override
+  Iterable get childEntities {
+    ChildEntities result = new ChildEntities()..add(_scriptTag);
+    if (_directivesAreBeforeDeclarations) {
+      result..addAll(_directives)..addAll(_declarations);
+    } else {
+      result.addAll(sortedDirectivesAndDeclarations);
+    }
+    return result;
+  }
+
+  /**
+   * Return the declarations contained in this compilation unit.
+   */
+  NodeList<CompilationUnitMember> get declarations => _declarations;
+
+  /**
+   * Return the directives contained in this compilation unit.
+   */
+  NodeList<Directive> get directives => _directives;
+
+  @override
+  int get length {
+    Token endToken = this.endToken;
+    if (endToken == null) {
+      return 0;
+    }
+    return endToken.offset + endToken.length;
+  }
+
+  @override
+  int get offset => 0;
+
+  /**
+   * Return the script tag at the beginning of the compilation unit, or `null`
+   * if there is no script tag in this compilation unit.
+   */
+  ScriptTag get scriptTag => _scriptTag;
+
+  /**
+   * Set the script tag at the beginning of the compilation unit to the given
+   * [scriptTag].
+   */
+  void set scriptTag(ScriptTag scriptTag) {
+    _scriptTag = _becomeParentOf(scriptTag);
+  }
+
+  /**
+   * Return a list containing all of the directives and declarations in this
+   * compilation unit, sorted in lexical order.
+   */
+  List<AstNode> get sortedDirectivesAndDeclarations {
+    return <AstNode>[]
+      ..addAll(_directives)
+      ..addAll(_declarations)
+      ..sort(AstNode.LEXICAL_ORDER);
+  }
+
+  /**
+   * Return `true` if all of the directives are lexically before any
+   * declarations.
+   */
+  bool get _directivesAreBeforeDeclarations {
+    if (_directives.isEmpty || _declarations.isEmpty) {
+      return true;
+    }
+    Directive lastDirective = _directives[_directives.length - 1];
+    CompilationUnitMember firstDeclaration = _declarations[0];
+    return lastDirective.offset < firstDeclaration.offset;
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitCompilationUnit(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_scriptTag, visitor);
+    if (_directivesAreBeforeDeclarations) {
+      _directives.accept(visitor);
+      _declarations.accept(visitor);
+    } else {
+      for (AstNode child in sortedDirectivesAndDeclarations) {
+        child.accept(visitor);
+      }
+    }
+  }
+}
+
+/**
+ * A node that declares one or more names within the scope of a compilation
+ * unit.
+ *
+ * > compilationUnitMember ::=
+ * >     [ClassDeclaration]
+ * >   | [TypeAlias]
+ * >   | [FunctionDeclaration]
+ * >   | [MethodDeclaration]
+ * >   | [VariableDeclaration]
+ * >   | [VariableDeclaration]
+ */
+abstract class CompilationUnitMember extends Declaration {
+  /**
+   * Initialize a newly created generic compilation unit member. Either or both
+   * of the [comment] and [metadata] can be `null` if the member does not have
+   * the corresponding attribute.
+   */
+  CompilationUnitMember(Comment comment, List<Annotation> metadata)
+      : super(comment, metadata);
+}
+
+/**
+ * A conditional expression.
+ *
+ * > conditionalExpression ::=
+ * >     [Expression] '?' [Expression] ':' [Expression]
+ */
+class ConditionalExpression extends Expression {
+  /**
+   * The condition used to determine which of the expressions is executed next.
+   */
+  Expression _condition;
+
+  /**
+   * The token used to separate the condition from the then expression.
+   */
+  Token question;
+
+  /**
+   * The expression that is executed if the condition evaluates to `true`.
+   */
+  Expression _thenExpression;
+
+  /**
+   * The token used to separate the then expression from the else expression.
+   */
+  Token colon;
+
+  /**
+   * The expression that is executed if the condition evaluates to `false`.
+   */
+  Expression _elseExpression;
+
+  /**
+   * Initialize a newly created conditional expression.
+   */
+  ConditionalExpression(Expression condition, this.question,
+      Expression thenExpression, this.colon, Expression elseExpression) {
+    _condition = _becomeParentOf(condition);
+    _thenExpression = _becomeParentOf(thenExpression);
+    _elseExpression = _becomeParentOf(elseExpression);
+  }
+
+  @override
+  Token get beginToken => _condition.beginToken;
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(_condition)
+    ..add(question)
+    ..add(_thenExpression)
+    ..add(colon)
+    ..add(_elseExpression);
+
+  /**
+   * Return the condition used to determine which of the expressions is executed
+   * next.
+   */
+  Expression get condition => _condition;
+
+  /**
+   * Set the condition used to determine which of the expressions is executed
+   * next to the given [expression].
+   */
+  void set condition(Expression expression) {
+    _condition = _becomeParentOf(expression);
+  }
+
+  /**
+   * Return the expression that is executed if the condition evaluates to
+   * `false`.
+   */
+  Expression get elseExpression => _elseExpression;
+
+  /**
+   * Set the expression that is executed if the condition evaluates to `false`
+   * to the given [expression].
+   */
+  void set elseExpression(Expression expression) {
+    _elseExpression = _becomeParentOf(expression);
+  }
+
+  @override
+  Token get endToken => _elseExpression.endToken;
+
+  @override
+  int get precedence => 3;
+
+  /**
+   * Return the expression that is executed if the condition evaluates to
+   * `true`.
+   */
+  Expression get thenExpression => _thenExpression;
+
+  /**
+   * Set the expression that is executed if the condition evaluates to `true` to
+   * the given [expression].
+   */
+  void set thenExpression(Expression expression) {
+    _thenExpression = _becomeParentOf(expression);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitConditionalExpression(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_condition, visitor);
+    _safelyVisitChild(_thenExpression, visitor);
+    _safelyVisitChild(_elseExpression, visitor);
+  }
+}
+
+/**
+ * An object that can be used to evaluate constant expressions to produce their
+ * compile-time value. According to the Dart Language Specification:
+ * <blockquote>
+ * A constant expression is one of the following:
+ * * A literal number.
+ * * A literal boolean.
+ * * A literal string where any interpolated expression is a compile-time
+ *   constant that evaluates to a numeric, string or boolean value or to `null`.
+ * * `null`.
+ * * A reference to a static constant variable.
+ * * An identifier expression that denotes a constant variable, a class or a
+ *   type parameter.
+ * * A constant constructor invocation.
+ * * A constant list literal.
+ * * A constant map literal.
+ * * A simple or qualified identifier denoting a top-level function or a static
+ *   method.
+ * * A parenthesized expression `(e)` where `e` is a constant expression.
+ * * An expression of one of the forms `identical(e1, e2)`, `e1 == e2`,
+ *   `e1 != e2` where `e1` and `e2` are constant expressions that evaluate to a
+ *   numeric, string or boolean value or to `null`.
+ * * An expression of one of the forms `!e`, `e1 && e2` or `e1 || e2`, where
+ *   `e`, `e1` and `e2` are constant expressions that evaluate to a boolean
+ *   value or to `null`.
+ * * An expression of one of the forms `~e`, `e1 ^ e2`, `e1 & e2`, `e1 | e2`,
+ *   `e1 >> e2` or `e1 << e2`, where `e`, `e1` and `e2` are constant expressions
+ *   that evaluate to an integer value or to `null`.
+ * * An expression of one of the forms `-e`, `e1 + e2`, `e1 - e2`, `e1 * e2`,
+ *   `e1 / e2`, `e1 ~/ e2`, `e1 > e2`, `e1 < e2`, `e1 >= e2`, `e1 <= e2` or
+ *   `e1 % e2`, where `e`, `e1` and `e2` are constant expressions that evaluate
+ *   to a numeric value or to `null`.
+ * </blockquote>
+ * The values returned by instances of this class are therefore `null` and
+ * instances of the classes `Boolean`, `BigInteger`, `Double`, `String`, and
+ * `DartObject`.
+ *
+ * In addition, this class defines several values that can be returned to
+ * indicate various conditions encountered during evaluation. These are
+ * documented with the static fields that define those values.
+ */
+class ConstantEvaluator extends GeneralizingAstVisitor<Object> {
+  /**
+   * The value returned for expressions (or non-expression nodes) that are not
+   * compile-time constant expressions.
+   */
+  static Object NOT_A_CONSTANT = new Object();
+
+  @override
+  Object visitAdjacentStrings(AdjacentStrings node) {
+    StringBuffer buffer = new StringBuffer();
+    for (StringLiteral string in node.strings) {
+      Object value = string.accept(this);
+      if (identical(value, NOT_A_CONSTANT)) {
+        return value;
+      }
+      buffer.write(value);
+    }
+    return buffer.toString();
+  }
+
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    Object leftOperand = node.leftOperand.accept(this);
+    if (identical(leftOperand, NOT_A_CONSTANT)) {
+      return leftOperand;
+    }
+    Object rightOperand = node.rightOperand.accept(this);
+    if (identical(rightOperand, NOT_A_CONSTANT)) {
+      return rightOperand;
+    }
+    while (true) {
+      if (node.operator.type == TokenType.AMPERSAND) {
+        // integer or {@code null}
+        if (leftOperand is int && rightOperand is int) {
+          return leftOperand & rightOperand;
+        }
+      } else if (node.operator.type == TokenType.AMPERSAND_AMPERSAND) {
+        // boolean or {@code null}
+        if (leftOperand is bool && rightOperand is bool) {
+          return leftOperand && rightOperand;
+        }
+      } else if (node.operator.type == TokenType.BANG_EQ) {
+        // numeric, string, boolean, or {@code null}
+        if (leftOperand is bool && rightOperand is bool) {
+          return leftOperand != rightOperand;
+        } else if (leftOperand is num && rightOperand is num) {
+          return leftOperand != rightOperand;
+        } else if (leftOperand is String && rightOperand is String) {
+          return leftOperand != rightOperand;
+        }
+      } else if (node.operator.type == TokenType.BAR) {
+        // integer or {@code null}
+        if (leftOperand is int && rightOperand is int) {
+          return leftOperand | rightOperand;
+        }
+      } else if (node.operator.type == TokenType.BAR_BAR) {
+        // boolean or {@code null}
+        if (leftOperand is bool && rightOperand is bool) {
+          return leftOperand || rightOperand;
+        }
+      } else if (node.operator.type == TokenType.CARET) {
+        // integer or {@code null}
+        if (leftOperand is int && rightOperand is int) {
+          return leftOperand ^ rightOperand;
+        }
+      } else if (node.operator.type == TokenType.EQ_EQ) {
+        // numeric, string, boolean, or {@code null}
+        if (leftOperand is bool && rightOperand is bool) {
+          return leftOperand == rightOperand;
+        } else if (leftOperand is num && rightOperand is num) {
+          return leftOperand == rightOperand;
+        } else if (leftOperand is String && rightOperand is String) {
+          return leftOperand == rightOperand;
+        }
+      } else if (node.operator.type == TokenType.GT) {
+        // numeric or {@code null}
+        if (leftOperand is num && rightOperand is num) {
+          return leftOperand.compareTo(rightOperand) > 0;
+        }
+      } else if (node.operator.type == TokenType.GT_EQ) {
+        // numeric or {@code null}
+        if (leftOperand is num && rightOperand is num) {
+          return leftOperand.compareTo(rightOperand) >= 0;
+        }
+      } else if (node.operator.type == TokenType.GT_GT) {
+        // integer or {@code null}
+        if (leftOperand is int && rightOperand is int) {
+          return leftOperand >> rightOperand;
+        }
+      } else if (node.operator.type == TokenType.LT) {
+        // numeric or {@code null}
+        if (leftOperand is num && rightOperand is num) {
+          return leftOperand.compareTo(rightOperand) < 0;
+        }
+      } else if (node.operator.type == TokenType.LT_EQ) {
+        // numeric or {@code null}
+        if (leftOperand is num && rightOperand is num) {
+          return leftOperand.compareTo(rightOperand) <= 0;
+        }
+      } else if (node.operator.type == TokenType.LT_LT) {
+        // integer or {@code null}
+        if (leftOperand is int && rightOperand is int) {
+          return leftOperand << rightOperand;
+        }
+      } else if (node.operator.type == TokenType.MINUS) {
+        // numeric or {@code null}
+        if (leftOperand is num && rightOperand is num) {
+          return leftOperand - rightOperand;
+        }
+      } else if (node.operator.type == TokenType.PERCENT) {
+        // numeric or {@code null}
+        if (leftOperand is num && rightOperand is num) {
+          return leftOperand.remainder(rightOperand);
+        }
+      } else if (node.operator.type == TokenType.PLUS) {
+        // numeric or {@code null}
+        if (leftOperand is num && rightOperand is num) {
+          return leftOperand + rightOperand;
+        }
+      } else if (node.operator.type == TokenType.STAR) {
+        // numeric or {@code null}
+        if (leftOperand is num && rightOperand is num) {
+          return leftOperand * rightOperand;
+        }
+      } else if (node.operator.type == TokenType.SLASH) {
+        // numeric or {@code null}
+        if (leftOperand is num && rightOperand is num) {
+          return leftOperand / rightOperand;
+        }
+      } else if (node.operator.type == TokenType.TILDE_SLASH) {
+        // numeric or {@code null}
+        if (leftOperand is num && rightOperand is num) {
+          return leftOperand ~/ rightOperand;
+        }
+      } else {}
+      break;
+    }
+    // TODO(brianwilkerson) This doesn't handle numeric conversions.
+    return visitExpression(node);
+  }
+
+  @override
+  Object visitBooleanLiteral(BooleanLiteral node) => node.value ? true : false;
+
+  @override
+  Object visitDoubleLiteral(DoubleLiteral node) => node.value;
+
+  @override
+  Object visitIntegerLiteral(IntegerLiteral node) => node.value;
+
+  @override
+  Object visitInterpolationExpression(InterpolationExpression node) {
+    Object value = node.expression.accept(this);
+    if (value == null || value is bool || value is String || value is num) {
+      return value;
+    }
+    return NOT_A_CONSTANT;
+  }
+
+  @override
+  Object visitInterpolationString(InterpolationString node) => node.value;
+
+  @override
+  Object visitListLiteral(ListLiteral node) {
+    List<Object> list = new List<Object>();
+    for (Expression element in node.elements) {
+      Object value = element.accept(this);
+      if (identical(value, NOT_A_CONSTANT)) {
+        return value;
+      }
+      list.add(value);
+    }
+    return list;
+  }
+
+  @override
+  Object visitMapLiteral(MapLiteral node) {
+    HashMap<String, Object> map = new HashMap<String, Object>();
+    for (MapLiteralEntry entry in node.entries) {
+      Object key = entry.key.accept(this);
+      Object value = entry.value.accept(this);
+      if (key is! String || identical(value, NOT_A_CONSTANT)) {
+        return NOT_A_CONSTANT;
+      }
+      map[(key as String)] = value;
+    }
+    return map;
+  }
+
+  @override
+  Object visitMethodInvocation(MethodInvocation node) => visitNode(node);
+
+  @override
+  Object visitNode(AstNode node) => NOT_A_CONSTANT;
+
+  @override
+  Object visitNullLiteral(NullLiteral node) => null;
+
+  @override
+  Object visitParenthesizedExpression(ParenthesizedExpression node) =>
+      node.expression.accept(this);
+
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) =>
+      _getConstantValue(null);
+
+  @override
+  Object visitPrefixExpression(PrefixExpression node) {
+    Object operand = node.operand.accept(this);
+    if (identical(operand, NOT_A_CONSTANT)) {
+      return operand;
+    }
+    while (true) {
+      if (node.operator.type == TokenType.BANG) {
+        if (identical(operand, true)) {
+          return false;
+        } else if (identical(operand, false)) {
+          return true;
+        }
+      } else if (node.operator.type == TokenType.TILDE) {
+        if (operand is int) {
+          return ~operand;
+        }
+      } else if (node.operator.type == TokenType.MINUS) {
+        if (operand == null) {
+          return null;
+        } else if (operand is num) {
+          return -operand;
+        }
+      } else {}
+      break;
+    }
+    return NOT_A_CONSTANT;
+  }
+
+  @override
+  Object visitPropertyAccess(PropertyAccess node) => _getConstantValue(null);
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) =>
+      _getConstantValue(null);
+
+  @override
+  Object visitSimpleStringLiteral(SimpleStringLiteral node) => node.value;
+
+  @override
+  Object visitStringInterpolation(StringInterpolation node) {
+    StringBuffer buffer = new StringBuffer();
+    for (InterpolationElement element in node.elements) {
+      Object value = element.accept(this);
+      if (identical(value, NOT_A_CONSTANT)) {
+        return value;
+      }
+      buffer.write(value);
+    }
+    return buffer.toString();
+  }
+
+  @override
+  Object visitSymbolLiteral(SymbolLiteral node) {
+    // TODO(brianwilkerson) This isn't optimal because a Symbol is not a String.
+    StringBuffer buffer = new StringBuffer();
+    for (Token component in node.components) {
+      if (buffer.length > 0) {
+        buffer.writeCharCode(0x2E);
+      }
+      buffer.write(component.lexeme);
+    }
+    return buffer.toString();
+  }
+
+  /**
+   * Return the constant value of the static constant represented by the given
+   * [element].
+   */
+  Object _getConstantValue(Element element) {
+    // TODO(brianwilkerson) Implement this
+    if (element is FieldElement) {
+      FieldElement field = element;
+      if (field.isStatic && field.isConst) {
+        //field.getConstantValue();
+      }
+      //    } else if (element instanceof VariableElement) {
+      //      VariableElement variable = (VariableElement) element;
+      //      if (variable.isStatic() && variable.isConst()) {
+      //        //variable.getConstantValue();
+      //      }
+    }
+    return NOT_A_CONSTANT;
+  }
+}
+
+/**
+ * A constructor declaration.
+ *
+ * > constructorDeclaration ::=
+ * >     constructorSignature [FunctionBody]?
+ * >   | constructorName formalParameterList ':' 'this' ('.' [SimpleIdentifier])? arguments
+ * >
+ * > constructorSignature ::=
+ * >     'external'? constructorName formalParameterList initializerList?
+ * >   | 'external'? 'factory' factoryName formalParameterList initializerList?
+ * >   | 'external'? 'const'  constructorName formalParameterList initializerList?
+ * >
+ * > constructorName ::=
+ * >     [SimpleIdentifier] ('.' [SimpleIdentifier])?
+ * >
+ * > factoryName ::=
+ * >     [Identifier] ('.' [SimpleIdentifier])?
+ * >
+ * > initializerList ::=
+ * >     ':' [ConstructorInitializer] (',' [ConstructorInitializer])*
+ */
+class ConstructorDeclaration extends ClassMember {
+  /**
+   * The token for the 'external' keyword, or `null` if the constructor is not
+   * external.
+   */
+  Token externalKeyword;
+
+  /**
+   * The token for the 'const' keyword, or `null` if the constructor is not a
+   * const constructor.
+   */
+  Token constKeyword;
+
+  /**
+   * The token for the 'factory' keyword, or `null` if the constructor is not a
+   * factory constructor.
+   */
+  Token factoryKeyword;
+
+  /**
+   * The type of object being created. This can be different than the type in
+   * which the constructor is being declared if the constructor is the
+   * implementation of a factory constructor.
+   */
+  Identifier _returnType;
+
+  /**
+   * The token for the period before the constructor name, or `null` if the
+   * constructor being declared is unnamed.
+   */
+  Token period;
+
+  /**
+   * The name of the constructor, or `null` if the constructor being declared is
+   * unnamed.
+   */
+  SimpleIdentifier _name;
+
+  /**
+   * The parameters associated with the constructor.
+   */
+  FormalParameterList _parameters;
+
+  /**
+   * The token for the separator (colon or equals) before the initializer list
+   * or redirection, or `null` if there are no initializers.
+   */
+  Token separator;
+
+  /**
+   * The initializers associated with the constructor.
+   */
+  NodeList<ConstructorInitializer> _initializers;
+
+  /**
+   * The name of the constructor to which this constructor will be redirected,
+   * or `null` if this is not a redirecting factory constructor.
+   */
+  ConstructorName _redirectedConstructor;
+
+  /**
+   * The body of the constructor, or `null` if the constructor does not have a
+   * body.
+   */
+  FunctionBody _body;
+
+  /**
+   * The element associated with this constructor, or `null` if the AST
+   * structure has not been resolved or if this constructor could not be
+   * resolved.
+   */
+  ConstructorElement element;
+
+  /**
+   * Initialize a newly created constructor declaration. The [externalKeyword]
+   * can be `null` if the constructor is not external. Either or both of the
+   * [comment] and [metadata] can be `null` if the constructor does not have the
+   * corresponding attribute. The [constKeyword] can be `null` if the
+   * constructor cannot be used to create a constant. The [factoryKeyword] can
+   * be `null` if the constructor is not a factory. The [period] and [name] can
+   * both be `null` if the constructor is not a named constructor. The
+   * [separator] can be `null` if the constructor does not have any initializers
+   * and does not redirect to a different constructor. The list of
+   * [initializers] can be `null` if the constructor does not have any
+   * initializers. The [redirectedConstructor] can be `null` if the constructor
+   * does not redirect to a different constructor. The [body] can be `null` if
+   * the constructor does not have a body.
+   */
+  ConstructorDeclaration(Comment comment, List<Annotation> metadata,
+      this.externalKeyword, this.constKeyword, this.factoryKeyword,
+      Identifier returnType, this.period, SimpleIdentifier name,
+      FormalParameterList parameters, this.separator,
+      List<ConstructorInitializer> initializers,
+      ConstructorName redirectedConstructor, FunctionBody body)
+      : super(comment, metadata) {
+    _returnType = _becomeParentOf(returnType);
+    _name = _becomeParentOf(name);
+    _parameters = _becomeParentOf(parameters);
+    _initializers = new NodeList<ConstructorInitializer>(this, initializers);
+    _redirectedConstructor = _becomeParentOf(redirectedConstructor);
+    _body = _becomeParentOf(body);
+  }
+
+  /**
+   * Return the body of the constructor, or `null` if the constructor does not
+   * have a body.
+   */
+  FunctionBody get body => _body;
+
+  /**
+   * Set the body of the constructor to the given [functionBody].
+   */
+  void set body(FunctionBody functionBody) {
+    _body = _becomeParentOf(functionBody);
+  }
+
+  @override
+  Iterable get childEntities => super._childEntities
+    ..add(externalKeyword)
+    ..add(constKeyword)
+    ..add(factoryKeyword)
+    ..add(_returnType)
+    ..add(period)
+    ..add(_name)
+    ..add(_parameters)
+    ..add(separator)
+    ..addAll(initializers)
+    ..add(_redirectedConstructor)
+    ..add(_body);
+
+  @override
+  Token get endToken {
+    if (_body != null) {
+      return _body.endToken;
+    } else if (!_initializers.isEmpty) {
+      return _initializers.endToken;
+    }
+    return _parameters.endToken;
+  }
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata {
+    Token leftMost =
+        Token.lexicallyFirst([externalKeyword, constKeyword, factoryKeyword]);
+    if (leftMost != null) {
+      return leftMost;
+    }
+    return _returnType.beginToken;
+  }
+
+  /**
+   * Return the initializers associated with the constructor.
+   */
+  NodeList<ConstructorInitializer> get initializers => _initializers;
+
+  /**
+   * Return the name of the constructor, or `null` if the constructor being
+   * declared is unnamed.
+   */
+  SimpleIdentifier get name => _name;
+
+  /**
+   * Set the name of the constructor to the given [identifier].
+   */
+  void set name(SimpleIdentifier identifier) {
+    _name = _becomeParentOf(identifier);
+  }
+
+  /**
+   * Return the parameters associated with the constructor.
+   */
+  FormalParameterList get parameters => _parameters;
+
+  /**
+   * Set the parameters associated with the constructor to the given list of
+   * [parameters].
+   */
+  void set parameters(FormalParameterList parameters) {
+    _parameters = _becomeParentOf(parameters);
+  }
+
+  /**
+   * Return the name of the constructor to which this constructor will be
+   * redirected, or `null` if this is not a redirecting factory constructor.
+   */
+  ConstructorName get redirectedConstructor => _redirectedConstructor;
+
+  /**
+   * Set the name of the constructor to which this constructor will be
+   * redirected to the given [redirectedConstructor] name.
+   */
+  void set redirectedConstructor(ConstructorName redirectedConstructor) {
+    _redirectedConstructor = _becomeParentOf(redirectedConstructor);
+  }
+
+  /**
+   * Return the type of object being created. This can be different than the
+   * type in which the constructor is being declared if the constructor is the
+   * implementation of a factory constructor.
+   */
+  Identifier get returnType => _returnType;
+
+  /**
+   * Set the type of object being created to the given [typeName].
+   */
+  void set returnType(Identifier typeName) {
+    _returnType = _becomeParentOf(typeName);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitConstructorDeclaration(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_returnType, visitor);
+    _safelyVisitChild(_name, visitor);
+    _safelyVisitChild(_parameters, visitor);
+    _initializers.accept(visitor);
+    _safelyVisitChild(_redirectedConstructor, visitor);
+    _safelyVisitChild(_body, visitor);
+  }
+}
+
+/**
+ * The initialization of a field within a constructor's initialization list.
+ *
+ * > fieldInitializer ::=
+ * >     ('this' '.')? [SimpleIdentifier] '=' [Expression]
+ */
+class ConstructorFieldInitializer extends ConstructorInitializer {
+  /**
+   * The token for the 'this' keyword, or `null` if there is no 'this' keyword.
+   */
+  Token thisKeyword;
+
+  /**
+   * The token for the period after the 'this' keyword, or `null` if there is no
+   * 'this' keyword.
+   */
+  Token period;
+
+  /**
+   * The name of the field being initialized.
+   */
+  SimpleIdentifier _fieldName;
+
+  /**
+   * The token for the equal sign between the field name and the expression.
+   */
+  Token equals;
+
+  /**
+   * The expression computing the value to which the field will be initialized.
+   */
+  Expression _expression;
+
+  /**
+   * Initialize a newly created field initializer to initialize the field with
+   * the given name to the value of the given expression. The [thisKeyword] and
+   * [period] can be `null` if the 'this' keyword was not specified.
+   */
+  ConstructorFieldInitializer(this.thisKeyword, this.period,
+      SimpleIdentifier fieldName, this.equals, Expression expression) {
+    _fieldName = _becomeParentOf(fieldName);
+    _expression = _becomeParentOf(expression);
+  }
+
+  @override
+  Token get beginToken {
+    if (thisKeyword != null) {
+      return thisKeyword;
+    }
+    return _fieldName.beginToken;
+  }
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(thisKeyword)
+    ..add(period)
+    ..add(_fieldName)
+    ..add(equals)
+    ..add(_expression);
+
+  @override
+  Token get endToken => _expression.endToken;
+
+  /**
+   * Return the expression computing the value to which the field will be
+   * initialized.
+   */
+  Expression get expression => _expression;
+
+  /**
+   * Set the expression computing the value to which the field will be
+   * initialized to the given [expression].
+   */
+  void set expression(Expression expression) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  /**
+   * Return the name of the field being initialized.
+   */
+  SimpleIdentifier get fieldName => _fieldName;
+
+  /**
+   * Set the name of the field being initialized to the given [identifier].
+   */
+  void set fieldName(SimpleIdentifier identifier) {
+    _fieldName = _becomeParentOf(identifier);
+  }
+
+  /**
+   * Return the token for the 'this' keyword, or `null` if there is no 'this'
+   * keyword.
+   */
+  @deprecated // Use "this.thisKeyword"
+  Token get keyword => thisKeyword;
+
+  /**
+   * Set the token for the 'this' keyword to the given [token].
+   */
+  @deprecated // Use "this.thisKeyword"
+  set keyword(Token token) {
+    thisKeyword = token;
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitConstructorFieldInitializer(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_fieldName, visitor);
+    _safelyVisitChild(_expression, visitor);
+  }
+}
+
+/**
+ * A node that can occur in the initializer list of a constructor declaration.
+ *
+ * > constructorInitializer ::=
+ * >     [SuperConstructorInvocation]
+ * >   | [ConstructorFieldInitializer]
+ */
+abstract class ConstructorInitializer extends AstNode {}
+
+/**
+ * The name of the constructor.
+ *
+ * > constructorName ::=
+ * >     type ('.' identifier)?
+ */
+class ConstructorName extends AstNode {
+  /**
+   * The name of the type defining the constructor.
+   */
+  TypeName _type;
+
+  /**
+   * The token for the period before the constructor name, or `null` if the
+   * specified constructor is the unnamed constructor.
+   */
+  Token period;
+
+  /**
+   * The name of the constructor, or `null` if the specified constructor is the
+   * unnamed constructor.
+   */
+  SimpleIdentifier _name;
+
+  /**
+   * The element associated with this constructor name based on static type
+   * information, or `null` if the AST structure has not been resolved or if
+   * this constructor name could not be resolved.
+   */
+  ConstructorElement staticElement;
+
+  /**
+   * Initialize a newly created constructor name. The [period] and [name] can be
+   * `null` if the constructor being named is the unnamed constructor.
+   */
+  ConstructorName(TypeName type, this.period, SimpleIdentifier name) {
+    _type = _becomeParentOf(type);
+    _name = _becomeParentOf(name);
+  }
+
+  @override
+  Token get beginToken => _type.beginToken;
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(_type)..add(period)..add(_name);
+
+  @override
+  Token get endToken {
+    if (_name != null) {
+      return _name.endToken;
+    }
+    return _type.endToken;
+  }
+
+  /**
+   * Return the name of the constructor, or `null` if the specified constructor
+   * is the unnamed constructor.
+   */
+  SimpleIdentifier get name => _name;
+
+  /**
+   * Set the name of the constructor to the given [name].
+   */
+  void set name(SimpleIdentifier name) {
+    _name = _becomeParentOf(name);
+  }
+
+  /**
+   * Return the name of the type defining the constructor.
+   */
+  TypeName get type => _type;
+
+  /**
+   * Set the name of the type defining the constructor to the given [type] name.
+   */
+  void set type(TypeName type) {
+    _type = _becomeParentOf(type);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitConstructorName(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_type, visitor);
+    _safelyVisitChild(_name, visitor);
+  }
+}
+
+/**
+ * A continue statement.
+ *
+ * > continueStatement ::=
+ * >     'continue' [SimpleIdentifier]? ';'
+ */
+class ContinueStatement extends Statement {
+  /**
+   * The token representing the 'continue' keyword.
+   */
+  Token continueKeyword;
+
+  /**
+   * The label associated with the statement, or `null` if there is no label.
+   */
+  SimpleIdentifier _label;
+
+  /**
+   * The semicolon terminating the statement.
+   */
+  Token semicolon;
+
+  /**
+   * The AstNode which this continue statement is continuing to.  This will be
+   * either a Statement (in the case of continuing a loop) or a SwitchMember
+   * (in the case of continuing from one switch case to another).  Null if the
+   * AST has not yet been resolved or if the target could not be resolved.
+   * Note that if the source code has errors, the target may be invalid (e.g.
+   * the target may be in an enclosing function).
+   */
+  AstNode target;
+
+  /**
+   * Initialize a newly created continue statement. The [label] can be `null` if
+   * there is no label associated with the statement.
+   */
+  ContinueStatement(
+      this.continueKeyword, SimpleIdentifier label, this.semicolon) {
+    _label = _becomeParentOf(label);
+  }
+
+  @override
+  Token get beginToken => continueKeyword;
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(continueKeyword)..add(_label)..add(semicolon);
+
+  @override
+  Token get endToken => semicolon;
+
+  /**
+   * Return the token for the 'continue' keyword, or `null` if there is no
+   * 'continue' keyword.
+   */
+  @deprecated // Use "this.continueKeyword"
+  Token get keyword => continueKeyword;
+
+  /**
+   * Set the token for the 'continue' keyword to the given [token].
+   */
+  @deprecated // Use "this.continueKeyword"
+  set keyword(Token token) {
+    continueKeyword = token;
+  }
+
+  /**
+   * Return the label associated with the statement, or `null` if there is no
+   * label.
+   */
+  SimpleIdentifier get label => _label;
+
+  /**
+   * Set the label associated with the statement to the given [identifier].
+   */
+  void set label(SimpleIdentifier identifier) {
+    _label = _becomeParentOf(identifier);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitContinueStatement(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_label, visitor);
+  }
+}
+
+/**
+ * A node that represents the declaration of one or more names. Each declared
+ * name is visible within a name scope.
+ */
+abstract class Declaration extends AnnotatedNode {
+  /**
+   * Initialize a newly created declaration. Either or both of the [comment] and
+   * [metadata] can be `null` if the declaration does not have the corresponding
+   * attribute.
+   */
+  Declaration(Comment comment, List<Annotation> metadata)
+      : super(comment, metadata);
+
+  /**
+   * Return the element associated with this declaration, or `null` if either
+   * this node corresponds to a list of declarations or if the AST structure has
+   * not been resolved.
+   */
+  Element get element;
+}
+
+/**
+ * The declaration of a single identifier.
+ *
+ * > declaredIdentifier ::=
+ * >     [Annotation] finalConstVarOrType [SimpleIdentifier]
+ */
+class DeclaredIdentifier extends Declaration {
+  /**
+   * The token representing either the 'final', 'const' or 'var' keyword, or
+   * `null` if no keyword was used.
+   */
+  Token keyword;
+
+  /**
+   * The name of the declared type of the parameter, or `null` if the parameter
+   * does not have a declared type.
+   */
+  TypeName _type;
+
+  /**
+   * The name of the variable being declared.
+   */
+  SimpleIdentifier _identifier;
+
+  /**
+   * Initialize a newly created formal parameter. Either or both of the
+   * [comment] and [metadata] can be `null` if the declaration does not have the
+   * corresponding attribute. The [keyword] can be `null` if a type name is
+   * given. The [type] must be `null` if the keyword is 'var'.
+   */
+  DeclaredIdentifier(Comment comment, List<Annotation> metadata, this.keyword,
+      TypeName type, SimpleIdentifier identifier)
+      : super(comment, metadata) {
+    _type = _becomeParentOf(type);
+    _identifier = _becomeParentOf(identifier);
+  }
+
+  @override
+  Iterable get childEntities =>
+      super._childEntities..add(keyword)..add(_type)..add(_identifier);
+
+  @override
+  LocalVariableElement get element {
+    if (_identifier == null) {
+      return null;
+    }
+    return _identifier.staticElement as LocalVariableElement;
+  }
+
+  @override
+  Token get endToken => _identifier.endToken;
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata {
+    if (keyword != null) {
+      return keyword;
+    } else if (_type != null) {
+      return _type.beginToken;
+    }
+    return _identifier.beginToken;
+  }
+
+  /**
+   * Return the name of the variable being declared.
+   */
+  SimpleIdentifier get identifier => _identifier;
+
+  /**
+   * Set the name of the variable being declared to the given [identifier].
+   */
+  void set identifier(SimpleIdentifier identifier) {
+    _identifier = _becomeParentOf(identifier);
+  }
+
+  /**
+   * Return `true` if this variable was declared with the 'const' modifier.
+   */
+  bool get isConst => (keyword is KeywordToken) &&
+      (keyword as KeywordToken).keyword == Keyword.CONST;
+
+  /**
+   * Return `true` if this variable was declared with the 'final' modifier.
+   * Variables that are declared with the 'const' modifier will return `false`
+   * even though they are implicitly final.
+   */
+  bool get isFinal => (keyword is KeywordToken) &&
+      (keyword as KeywordToken).keyword == Keyword.FINAL;
+
+  /**
+   * Return the name of the declared type of the parameter, or `null` if the
+   * parameter does not have a declared type.
+   */
+  TypeName get type => _type;
+
+  /**
+   * Set the name of the declared type of the parameter to the given [typeName].
+   */
+  void set type(TypeName typeName) {
+    _type = _becomeParentOf(typeName);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitDeclaredIdentifier(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_type, visitor);
+    _safelyVisitChild(_identifier, visitor);
+  }
+}
+
+/**
+ * A formal parameter with a default value. There are two kinds of parameters
+ * that are both represented by this class: named formal parameters and
+ * positional formal parameters.
+ *
+ * > defaultFormalParameter ::=
+ * >     [NormalFormalParameter] ('=' [Expression])?
+ * >
+ * > defaultNamedParameter ::=
+ * >     [NormalFormalParameter] (':' [Expression])?
+ */
+class DefaultFormalParameter extends FormalParameter {
+  /**
+   * The formal parameter with which the default value is associated.
+   */
+  NormalFormalParameter _parameter;
+
+  /**
+   * The kind of this parameter.
+   */
+  ParameterKind kind;
+
+  /**
+   * The token separating the parameter from the default value, or `null` if
+   * there is no default value.
+   */
+  Token separator;
+
+  /**
+   * The expression computing the default value for the parameter, or `null` if
+   * there is no default value.
+   */
+  Expression _defaultValue;
+
+  /**
+   * Initialize a newly created default formal parameter. The [separator] and
+   * [defaultValue] can be `null` if there is no default value.
+   */
+  DefaultFormalParameter(NormalFormalParameter parameter, this.kind,
+      this.separator, Expression defaultValue) {
+    _parameter = _becomeParentOf(parameter);
+    _defaultValue = _becomeParentOf(defaultValue);
+  }
+
+  @override
+  Token get beginToken => _parameter.beginToken;
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(_parameter)..add(separator)..add(_defaultValue);
+
+  /**
+   * Return the expression computing the default value for the parameter, or
+   * `null` if there is no default value.
+   */
+  Expression get defaultValue => _defaultValue;
+
+  /**
+   * Set the expression computing the default value for the parameter to the
+   * given [expression].
+   */
+  void set defaultValue(Expression expression) {
+    _defaultValue = _becomeParentOf(expression);
+  }
+
+  @override
+  Token get endToken {
+    if (_defaultValue != null) {
+      return _defaultValue.endToken;
+    }
+    return _parameter.endToken;
+  }
+
+  @override
+  SimpleIdentifier get identifier => _parameter.identifier;
+
+  @override
+  bool get isConst => _parameter != null && _parameter.isConst;
+
+  @override
+  bool get isFinal => _parameter != null && _parameter.isFinal;
+
+  @override
+  NodeList<Annotation> get metadata => _parameter.metadata;
+
+  /**
+   * Return the formal parameter with which the default value is associated.
+   */
+  NormalFormalParameter get parameter => _parameter;
+
+  /**
+   * Set the formal parameter with which the default value is associated to the
+   * given [formalParameter].
+   */
+  void set parameter(NormalFormalParameter formalParameter) {
+    _parameter = _becomeParentOf(formalParameter);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitDefaultFormalParameter(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_parameter, visitor);
+    _safelyVisitChild(_defaultValue, visitor);
+  }
+}
+
+/**
+ * A recursive AST visitor that is used to run over [Expression]s to determine
+ * whether the expression is composed by at least one deferred
+ * [PrefixedIdentifier].
+ *
+ * See [PrefixedIdentifier.isDeferred].
+ */
+class DeferredLibraryReferenceDetector extends RecursiveAstVisitor<Object> {
+  /**
+   * A flag indicating whether an identifier from a deferred library has been
+   * found.
+   */
+  bool _result = false;
+
+  /**
+   * Return `true` if the visitor found a [PrefixedIdentifier] that returned
+   * `true` to the [PrefixedIdentifier.isDeferred] query.
+   */
+  bool get result => _result;
+
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    if (!_result) {
+      if (node.isDeferred) {
+        _result = true;
+      }
+    }
+    return null;
+  }
+}
+
+/**
+ * A node that represents a directive.
+ *
+ * > directive ::=
+ * >     [ExportDirective]
+ * >   | [ImportDirective]
+ * >   | [LibraryDirective]
+ * >   | [PartDirective]
+ * >   | [PartOfDirective]
+ */
+abstract class Directive extends AnnotatedNode {
+  /**
+   * The element associated with this directive, or `null` if the AST structure
+   * has not been resolved or if this directive could not be resolved.
+   */
+  Element element;
+
+  /**
+   * Initialize a newly create directive. Either or both of the [comment] and
+   * [metadata] can be `null` if the directive does not have the corresponding
+   * attribute.
+   */
+  Directive(Comment comment, List<Annotation> metadata)
+      : super(comment, metadata);
+
+  /**
+   * Return the token representing the keyword that introduces this directive
+   * ('import', 'export', 'library' or 'part').
+   */
+  Token get keyword;
+}
+
+/**
+ * A do statement.
+ *
+ * > doStatement ::=
+ * >     'do' [Statement] 'while' '(' [Expression] ')' ';'
+ */
+class DoStatement extends Statement {
+  /**
+   * The token representing the 'do' keyword.
+   */
+  Token doKeyword;
+
+  /**
+   * The body of the loop.
+   */
+  Statement _body;
+
+  /**
+   * The token representing the 'while' keyword.
+   */
+  Token whileKeyword;
+
+  /**
+   * The left parenthesis.
+   */
+  Token leftParenthesis;
+
+  /**
+   * The condition that determines when the loop will terminate.
+   */
+  Expression _condition;
+
+  /**
+   * The right parenthesis.
+   */
+  Token rightParenthesis;
+
+  /**
+   * The semicolon terminating the statement.
+   */
+  Token semicolon;
+
+  /**
+   * Initialize a newly created do loop.
+   */
+  DoStatement(this.doKeyword, Statement body, this.whileKeyword,
+      this.leftParenthesis, Expression condition, this.rightParenthesis,
+      this.semicolon) {
+    _body = _becomeParentOf(body);
+    _condition = _becomeParentOf(condition);
+  }
+
+  @override
+  Token get beginToken => doKeyword;
+
+  /**
+   * Return the body of the loop.
+   */
+  Statement get body => _body;
+
+  /**
+   * Set the body of the loop to the given [statement].
+   */
+  void set body(Statement statement) {
+    _body = _becomeParentOf(statement);
+  }
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(doKeyword)
+    ..add(_body)
+    ..add(whileKeyword)
+    ..add(leftParenthesis)
+    ..add(_condition)
+    ..add(rightParenthesis)
+    ..add(semicolon);
+
+  /**
+   * Return the condition that determines when the loop will terminate.
+   */
+  Expression get condition => _condition;
+
+  /**
+   * Set the condition that determines when the loop will terminate to the given
+   * [expression].
+   */
+  void set condition(Expression expression) {
+    _condition = _becomeParentOf(expression);
+  }
+
+  @override
+  Token get endToken => semicolon;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitDoStatement(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_body, visitor);
+    _safelyVisitChild(_condition, visitor);
+  }
+}
+
+/**
+ * A floating point literal expression.
+ *
+ * > doubleLiteral ::=
+ * >     decimalDigit+ ('.' decimalDigit*)? exponent?
+ * >   | '.' decimalDigit+ exponent?
+ * >
+ * > exponent ::=
+ * >     ('e' | 'E') ('+' | '-')? decimalDigit+
+ */
+class DoubleLiteral extends Literal {
+  /**
+   * The token representing the literal.
+   */
+  Token literal;
+
+  /**
+   * The value of the literal.
+   */
+  double value;
+
+  /**
+   * Initialize a newly created floating point literal.
+   */
+  DoubleLiteral(this.literal, this.value);
+
+  @override
+  Token get beginToken => literal;
+
+  @override
+  Iterable get childEntities => new ChildEntities()..add(literal);
+
+  @override
+  Token get endToken => literal;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitDoubleLiteral(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    // There are no children to visit.
+  }
+}
+
+/**
+ * An object used to locate the [Element] associated with a given [AstNode].
+ */
+class ElementLocator {
+  /**
+   * Return the element associated with the given [node], or `null` if there is
+   * no element associated with the node.
+   */
+  static Element locate(AstNode node) {
+    if (node == null) {
+      return null;
+    }
+    ElementLocator_ElementMapper mapper = new ElementLocator_ElementMapper();
+    return node.accept(mapper);
+  }
+
+  /**
+   * Return the element associated with the given [node], or `null` if there is
+   * no element associated with the node.
+   */
+  static Element locateWithOffset(AstNode node, int offset) {
+    // TODO(brianwilkerson) 'offset' is not used. Figure out what's going on:
+    // whether there's a bug or whether this method is unnecessary.
+    if (node == null) {
+      return null;
+    }
+    // try to get Element from node
+    Element nodeElement = locate(node);
+    if (nodeElement != null) {
+      return nodeElement;
+    }
+    // no Element
+    return null;
+  }
+}
+
+/**
+ * Visitor that maps nodes to elements.
+ */
+class ElementLocator_ElementMapper extends GeneralizingAstVisitor<Element> {
+  @override
+  Element visitAnnotation(Annotation node) => node.element;
+
+  @override
+  Element visitAssignmentExpression(AssignmentExpression node) =>
+      node.bestElement;
+
+  @override
+  Element visitBinaryExpression(BinaryExpression node) => node.bestElement;
+
+  @override
+  Element visitClassDeclaration(ClassDeclaration node) => node.element;
+
+  @override
+  Element visitCompilationUnit(CompilationUnit node) => node.element;
+
+  @override
+  Element visitConstructorDeclaration(ConstructorDeclaration node) =>
+      node.element;
+
+  @override
+  Element visitFunctionDeclaration(FunctionDeclaration node) => node.element;
+
+  @override
+  Element visitIdentifier(Identifier node) {
+    AstNode parent = node.parent;
+    // Type name in Annotation
+    if (parent is Annotation) {
+      Annotation annotation = parent;
+      if (identical(annotation.name, node) &&
+          annotation.constructorName == null) {
+        return annotation.element;
+      }
+    }
+    // Extra work to map Constructor Declarations to their associated
+    // Constructor Elements
+    if (parent is ConstructorDeclaration) {
+      ConstructorDeclaration decl = parent;
+      Identifier returnType = decl.returnType;
+      if (identical(returnType, node)) {
+        SimpleIdentifier name = decl.name;
+        if (name != null) {
+          return name.bestElement;
+        }
+        Element element = node.bestElement;
+        if (element is ClassElement) {
+          return element.unnamedConstructor;
+        }
+      }
+    }
+    if (parent is LibraryIdentifier) {
+      AstNode grandParent = parent.parent;
+      if (grandParent is PartOfDirective) {
+        Element element = grandParent.element;
+        if (element is LibraryElement) {
+          return element.definingCompilationUnit;
+        }
+      }
+    }
+    return node.bestElement;
+  }
+
+  @override
+  Element visitImportDirective(ImportDirective node) => node.element;
+
+  @override
+  Element visitIndexExpression(IndexExpression node) => node.bestElement;
+
+  @override
+  Element visitInstanceCreationExpression(InstanceCreationExpression node) =>
+      node.staticElement;
+
+  @override
+  Element visitLibraryDirective(LibraryDirective node) => node.element;
+
+  @override
+  Element visitMethodDeclaration(MethodDeclaration node) => node.element;
+
+  @override
+  Element visitMethodInvocation(MethodInvocation node) =>
+      node.methodName.bestElement;
+
+  @override
+  Element visitPostfixExpression(PostfixExpression node) => node.bestElement;
+
+  @override
+  Element visitPrefixedIdentifier(PrefixedIdentifier node) => node.bestElement;
+
+  @override
+  Element visitPrefixExpression(PrefixExpression node) => node.bestElement;
+
+  @override
+  Element visitStringLiteral(StringLiteral node) {
+    AstNode parent = node.parent;
+    if (parent is UriBasedDirective) {
+      return parent.uriElement;
+    }
+    return null;
+  }
+
+  @override
+  Element visitVariableDeclaration(VariableDeclaration node) => node.element;
+}
+
+/**
+ * An empty function body, which can only appear in constructors or abstract
+ * methods.
+ *
+ * > emptyFunctionBody ::=
+ * >     ';'
+ */
+class EmptyFunctionBody extends FunctionBody {
+  /**
+   * The token representing the semicolon that marks the end of the function
+   * body.
+   */
+  Token semicolon;
+
+  /**
+   * Initialize a newly created function body.
+   */
+  EmptyFunctionBody(this.semicolon);
+
+  @override
+  Token get beginToken => semicolon;
+
+  @override
+  Iterable get childEntities => new ChildEntities()..add(semicolon);
+
+  @override
+  Token get endToken => semicolon;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitEmptyFunctionBody(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    // Empty function bodies have no children.
+  }
+}
+
+/**
+ * An empty statement.
+ *
+ * > emptyStatement ::=
+ * >     ';'
+ */
+class EmptyStatement extends Statement {
+  /**
+   * The semicolon terminating the statement.
+   */
+  Token semicolon;
+
+  /**
+   * Initialize a newly created empty statement.
+   */
+  EmptyStatement(this.semicolon);
+
+  @override
+  Token get beginToken => semicolon;
+
+  @override
+  Iterable get childEntities => new ChildEntities()..add(semicolon);
+
+  @override
+  Token get endToken => semicolon;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitEmptyStatement(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    // There are no children to visit.
+  }
+}
+
+/**
+ * The declaration of an enum constant.
+ */
+class EnumConstantDeclaration extends Declaration {
+  /**
+   * The name of the constant.
+   */
+  SimpleIdentifier _name;
+
+  /**
+   * Initialize a newly created enum constant declaration. Either or both of the
+   * [comment] and [metadata] can be `null` if the constant does not have the
+   * corresponding attribute. (Technically, enum constants cannot have metadata,
+   * but we allow it for consistency.)
+   */
+  EnumConstantDeclaration(
+      Comment comment, List<Annotation> metadata, SimpleIdentifier name)
+      : super(comment, metadata) {
+    _name = _becomeParentOf(name);
+  }
+
+  @override
+  Iterable get childEntities => super._childEntities..add(_name);
+
+  @override
+  FieldElement get element =>
+      _name == null ? null : (_name.staticElement as FieldElement);
+
+  @override
+  Token get endToken => _name.endToken;
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
+
+  /**
+   * Return the name of the constant.
+   */
+  SimpleIdentifier get name => _name;
+
+  /**
+   * Set the name of the constant to the given [name].
+   */
+  void set name(SimpleIdentifier name) {
+    _name = _becomeParentOf(name);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitEnumConstantDeclaration(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_name, visitor);
+  }
+}
+
+/**
+ * The declaration of an enumeration.
+ *
+ * > enumType ::=
+ * >     metadata 'enum' [SimpleIdentifier] '{' [SimpleIdentifier] (',' [SimpleIdentifier])* (',')? '}'
+ */
+class EnumDeclaration extends NamedCompilationUnitMember {
+  /**
+   * The 'enum' keyword.
+   */
+  Token enumKeyword;
+
+  /**
+   * The left curly bracket.
+   */
+  Token leftBracket;
+
+  /**
+   * The enumeration constants being declared.
+   */
+  NodeList<EnumConstantDeclaration> _constants;
+
+  /**
+   * The right curly bracket.
+   */
+  Token rightBracket;
+
+  /**
+   * Initialize a newly created enumeration declaration. Either or both of the
+   * [comment] and [metadata] can be `null` if the declaration does not have the
+   * corresponding attribute. The list of [constants] must contain at least one
+   * value.
+   */
+  EnumDeclaration(Comment comment, List<Annotation> metadata, this.enumKeyword,
+      SimpleIdentifier name, this.leftBracket,
+      List<EnumConstantDeclaration> constants, this.rightBracket)
+      : super(comment, metadata, name) {
+    _constants = new NodeList<EnumConstantDeclaration>(this, constants);
+  }
+
+  @override
+  // TODO(brianwilkerson) Add commas?
+  Iterable get childEntities => super._childEntities
+    ..add(enumKeyword)
+    ..add(_name)
+    ..add(leftBracket)
+    ..addAll(_constants)
+    ..add(rightBracket);
+
+  /**
+   * Return the enumeration constants being declared.
+   */
+  NodeList<EnumConstantDeclaration> get constants => _constants;
+
+  @override
+  ClassElement get element =>
+      _name != null ? (_name.staticElement as ClassElement) : null;
+
+  @override
+  Token get endToken => rightBracket;
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata => enumKeyword;
+
+  /**
+   * Return the token for the 'enum' keyword, or `null` if there is no
+   * 'enum' keyword.
+   */
+  @deprecated // Use "this.enumKeyword"
+  Token get keyword => enumKeyword;
+
+  /**
+   * Set the token for the 'enum' keyword to the given [token].
+   */
+  @deprecated // Use "this.enumKeyword"
+  set keyword(Token token) {
+    enumKeyword = token;
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitEnumDeclaration(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_name, visitor);
+    _constants.accept(visitor);
+  }
+}
+
+/**
+ * Ephemeral identifiers are created as needed to mimic the presence of an empty
+ * identifier.
+ */
+class EphemeralIdentifier extends SimpleIdentifier {
+  EphemeralIdentifier(AstNode parent, int location)
+      : super(new StringToken(TokenType.IDENTIFIER, "", location)) {
+    parent._becomeParentOf(this);
+  }
+}
+
+/**
+ * An export directive.
+ *
+ * > exportDirective ::=
+ * >     [Annotation] 'export' [StringLiteral] [Combinator]* ';'
+ */
+class ExportDirective extends NamespaceDirective {
+  /**
+   * Initialize a newly created export directive. Either or both of the
+   * [comment] and [metadata] can be `null` if the directive does not have the
+   * corresponding attribute. The list of [combinators] can be `null` if there
+   * are no combinators.
+   */
+  ExportDirective(Comment comment, List<Annotation> metadata, Token keyword,
+      StringLiteral libraryUri, List<Combinator> combinators, Token semicolon)
+      : super(comment, metadata, keyword, libraryUri, combinators, semicolon);
+
+  @override
+  Iterable get childEntities => super._childEntities
+    ..add(_uri)
+    ..addAll(combinators)
+    ..add(semicolon);
+
+  @override
+  ExportElement get element => super.element as ExportElement;
+
+  @override
+  LibraryElement get uriElement {
+    if (element != null) {
+      return element.exportedLibrary;
+    }
+    return null;
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitExportDirective(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    combinators.accept(visitor);
+  }
+}
+
+/**
+ * A node that represents an expression.
+ *
+ * > expression ::=
+ * >     [AssignmentExpression]
+ * >   | [ConditionalExpression] cascadeSection*
+ * >   | [ThrowExpression]
+ */
+abstract class Expression extends AstNode {
+  /**
+   * An empty list of expressions.
+   */
+  @deprecated // Use "Expression.EMPTY_LIST"
+  static const List<Expression> EMPTY_ARRAY = EMPTY_LIST;
+
+  /**
+   * An empty list of expressions.
+   */
+  static const List<Expression> EMPTY_LIST = const <Expression>[];
+
+  /**
+   * The static type of this expression, or `null` if the AST structure has not
+   * been resolved.
+   */
+  DartType staticType;
+
+  /**
+   * The propagated type of this expression, or `null` if type propagation has
+   * not been performed on the AST structure.
+   */
+  DartType propagatedType;
+
+  /**
+   * Return the best parameter element information available for this
+   * expression. If type propagation was able to find a better parameter element
+   * than static analysis, that type will be returned. Otherwise, the result of
+   * static analysis will be returned.
+   */
+  ParameterElement get bestParameterElement {
+    ParameterElement propagatedElement = propagatedParameterElement;
+    if (propagatedElement != null) {
+      return propagatedElement;
+    }
+    return staticParameterElement;
+  }
+
+  /**
+   * Return the best type information available for this expression. If type
+   * propagation was able to find a better type than static analysis, that type
+   * will be returned. Otherwise, the result of static analysis will be
+   * returned. If no type analysis has been performed, then the type 'dynamic'
+   * will be returned.
+   */
+  DartType get bestType {
+    if (propagatedType != null) {
+      return propagatedType;
+    } else if (staticType != null) {
+      return staticType;
+    }
+    return DynamicTypeImpl.instance;
+  }
+
+  /**
+   * Return `true` if this expression is syntactically valid for the LHS of an
+   * [AssignmentExpression].
+   */
+  bool get isAssignable => false;
+
+  /**
+   * Return the precedence of this expression. The precedence is a positive
+   * integer value that defines how the source code is parsed into an AST. For
+   * example `a * b + c` is parsed as `(a * b) + c` because the precedence of
+   * `*` is greater than the precedence of `+`.
+   *
+   * Clients should not assume that returned values will stay the same, they
+   * might change as result of specification change. Only relative order should
+   * be used.
+   */
+  int get precedence;
+
+  /**
+   * If this expression is an argument to an invocation, and the AST structure
+   * has been resolved, and the function being invoked is known based on
+   * propagated type information, and this expression corresponds to one of the
+   * parameters of the function being invoked, then return the parameter element
+   * representing the parameter to which the value of this expression will be
+   * bound. Otherwise, return `null`.
+   */
+  ParameterElement get propagatedParameterElement {
+    AstNode parent = this.parent;
+    if (parent is ArgumentList) {
+      return parent._getPropagatedParameterElementFor(this);
+    } else if (parent is IndexExpression) {
+      IndexExpression indexExpression = parent;
+      if (identical(indexExpression.index, this)) {
+        return indexExpression._propagatedParameterElementForIndex;
+      }
+    } else if (parent is BinaryExpression) {
+      BinaryExpression binaryExpression = parent;
+      if (identical(binaryExpression.rightOperand, this)) {
+        return binaryExpression._propagatedParameterElementForRightOperand;
+      }
+    } else if (parent is AssignmentExpression) {
+      AssignmentExpression assignmentExpression = parent;
+      if (identical(assignmentExpression.rightHandSide, this)) {
+        return assignmentExpression._propagatedParameterElementForRightHandSide;
+      }
+    } else if (parent is PrefixExpression) {
+      return parent._propagatedParameterElementForOperand;
+    } else if (parent is PostfixExpression) {
+      return parent._propagatedParameterElementForOperand;
+    }
+    return null;
+  }
+
+  /**
+   * If this expression is an argument to an invocation, and the AST structure
+   * has been resolved, and the function being invoked is known based on static
+   * type information, and this expression corresponds to one of the parameters
+   * of the function being invoked, then return the parameter element
+   * representing the parameter to which the value of this expression will be
+   * bound. Otherwise, return `null`.
+   */
+  ParameterElement get staticParameterElement {
+    AstNode parent = this.parent;
+    if (parent is ArgumentList) {
+      return parent._getStaticParameterElementFor(this);
+    } else if (parent is IndexExpression) {
+      IndexExpression indexExpression = parent;
+      if (identical(indexExpression.index, this)) {
+        return indexExpression._staticParameterElementForIndex;
+      }
+    } else if (parent is BinaryExpression) {
+      BinaryExpression binaryExpression = parent;
+      if (identical(binaryExpression.rightOperand, this)) {
+        return binaryExpression._staticParameterElementForRightOperand;
+      }
+    } else if (parent is AssignmentExpression) {
+      AssignmentExpression assignmentExpression = parent;
+      if (identical(assignmentExpression.rightHandSide, this)) {
+        return assignmentExpression._staticParameterElementForRightHandSide;
+      }
+    } else if (parent is PrefixExpression) {
+      return parent._staticParameterElementForOperand;
+    } else if (parent is PostfixExpression) {
+      return parent._staticParameterElementForOperand;
+    }
+    return null;
+  }
+}
+
+/**
+ * A function body consisting of a single expression.
+ *
+ * > expressionFunctionBody ::=
+ * >     'async'? '=>' [Expression] ';'
+ */
+class ExpressionFunctionBody extends FunctionBody {
+  /**
+   * The token representing the 'async' keyword, or `null` if there is no such
+   * keyword.
+   */
+  Token keyword;
+
+  /**
+   * The token introducing the expression that represents the body of the
+   * function.
+   */
+  Token functionDefinition;
+
+  /**
+   * The expression representing the body of the function.
+   */
+  Expression _expression;
+
+  /**
+   * The semicolon terminating the statement.
+   */
+  Token semicolon;
+
+  /**
+   * Initialize a newly created function body consisting of a block of
+   * statements. The [keyword] can be `null` if the function body is not an
+   * async function body.
+   */
+  ExpressionFunctionBody(this.keyword, this.functionDefinition,
+      Expression expression, this.semicolon) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  @override
+  Token get beginToken {
+    if (keyword != null) {
+      return keyword;
+    }
+    return functionDefinition;
+  }
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(keyword)
+    ..add(functionDefinition)
+    ..add(_expression)
+    ..add(semicolon);
+
+  @override
+  Token get endToken {
+    if (semicolon != null) {
+      return semicolon;
+    }
+    return _expression.endToken;
+  }
+
+  /**
+   * Return the expression representing the body of the function.
+   */
+  Expression get expression => _expression;
+
+  /**
+   * Set the expression representing the body of the function to the given
+   * [expression].
+   */
+  void set expression(Expression expression) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  @override
+  bool get isAsynchronous => keyword != null;
+
+  @override
+  bool get isSynchronous => keyword == null;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitExpressionFunctionBody(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_expression, visitor);
+  }
+}
+
+/**
+ * An expression used as a statement.
+ *
+ * > expressionStatement ::=
+ * >     [Expression]? ';'
+ */
+class ExpressionStatement extends Statement {
+  /**
+   * The expression that comprises the statement.
+   */
+  Expression _expression;
+
+  /**
+   * The semicolon terminating the statement, or `null` if the expression is a
+   * function expression and therefore isn't followed by a semicolon.
+   */
+  Token semicolon;
+
+  /**
+   * Initialize a newly created expression statement.
+   */
+  ExpressionStatement(Expression expression, this.semicolon) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  @override
+  Token get beginToken => _expression.beginToken;
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(_expression)..add(semicolon);
+
+  @override
+  Token get endToken {
+    if (semicolon != null) {
+      return semicolon;
+    }
+    return _expression.endToken;
+  }
+
+  /**
+   * Return the expression that comprises the statement.
+   */
+  Expression get expression => _expression;
+
+  /**
+   * Set the expression that comprises the statement to the given [expression].
+   */
+  void set expression(Expression expression) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  @override
+  bool get isSynthetic => _expression.isSynthetic && semicolon.isSynthetic;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitExpressionStatement(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_expression, visitor);
+  }
+}
+
+/**
+ * The "extends" clause in a class declaration.
+ *
+ * > extendsClause ::=
+ * >     'extends' [TypeName]
+ */
+class ExtendsClause extends AstNode {
+  /**
+   * The token representing the 'extends' keyword.
+   */
+  Token extendsKeyword;
+
+  /**
+   * The name of the class that is being extended.
+   */
+  TypeName _superclass;
+
+  /**
+   * Initialize a newly created extends clause.
+   */
+  ExtendsClause(this.extendsKeyword, TypeName superclass) {
+    _superclass = _becomeParentOf(superclass);
+  }
+
+  @override
+  Token get beginToken => extendsKeyword;
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(extendsKeyword)..add(_superclass);
+
+  @override
+  Token get endToken => _superclass.endToken;
+
+  /**
+   * Return the token for the 'extends' keyword.
+   */
+  @deprecated // Use "this.extendsKeyword"
+  Token get keyword => extendsKeyword;
+
+  /**
+   * Set the token for the 'extends' keyword to the given [token].
+   */
+  @deprecated // Use "this.extendsKeyword"
+  set keyword(Token token) {
+    extendsKeyword = token;
+  }
+
+  /**
+   * Return the name of the class that is being extended.
+   */
+  TypeName get superclass => _superclass;
+
+  /**
+   * Set the name of the class that is being extended to the given [name].
+   */
+  void set superclass(TypeName name) {
+    _superclass = _becomeParentOf(name);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitExtendsClause(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_superclass, visitor);
+  }
+}
+
+/**
+ * The declaration of one or more fields of the same type.
+ *
+ * > fieldDeclaration ::=
+ * >     'static'? [VariableDeclarationList] ';'
+ */
+class FieldDeclaration extends ClassMember {
+  /**
+   * The token representing the 'static' keyword, or `null` if the fields are
+   * not static.
+   */
+  Token staticKeyword;
+
+  /**
+   * The fields being declared.
+   */
+  VariableDeclarationList _fieldList;
+
+  /**
+   * The semicolon terminating the declaration.
+   */
+  Token semicolon;
+
+  /**
+   * Initialize a newly created field declaration. Either or both of the
+   * [comment] and [metadata] can be `null` if the declaration does not have the
+   * corresponding attribute. The [staticKeyword] can be `null` if the field is
+   * not a static field.
+   */
+  FieldDeclaration(Comment comment, List<Annotation> metadata,
+      this.staticKeyword, VariableDeclarationList fieldList, this.semicolon)
+      : super(comment, metadata) {
+    _fieldList = _becomeParentOf(fieldList);
+  }
+
+  @override
+  Iterable get childEntities =>
+      super._childEntities..add(staticKeyword)..add(_fieldList)..add(semicolon);
+
+  @override
+  Element get element => null;
+
+  @override
+  Token get endToken => semicolon;
+
+  /**
+   * Return the fields being declared.
+   */
+  VariableDeclarationList get fields => _fieldList;
+
+  /**
+   * Set the fields being declared to the given list of [fields].
+   */
+  void set fields(VariableDeclarationList fields) {
+    _fieldList = _becomeParentOf(fields);
+  }
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata {
+    if (staticKeyword != null) {
+      return staticKeyword;
+    }
+    return _fieldList.beginToken;
+  }
+
+  /**
+   * Return `true` if the fields are declared to be static.
+   */
+  bool get isStatic => staticKeyword != null;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitFieldDeclaration(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_fieldList, visitor);
+  }
+}
+
+/**
+ * A field formal parameter.
+ *
+ * > fieldFormalParameter ::=
+ * >     ('final' [TypeName] | 'const' [TypeName] | 'var' | [TypeName])?
+ * >     'this' '.' [SimpleIdentifier] ([TypeParameterList]? [FormalParameterList])?
+ */
+class FieldFormalParameter extends NormalFormalParameter {
+  /**
+   * The token representing either the 'final', 'const' or 'var' keyword, or
+   * `null` if no keyword was used.
+   */
+  Token keyword;
+
+  /**
+   * The name of the declared type of the parameter, or `null` if the parameter
+   * does not have a declared type.
+   */
+  TypeName _type;
+
+  /**
+   * The token representing the 'this' keyword.
+   */
+  Token thisKeyword;
+
+  /**
+   * The token representing the period.
+   */
+  Token period;
+
+  /**
+   * The type parameters associated with the method, or `null` if the method is
+   * not a generic method.
+   */
+  TypeParameterList _typeParameters;
+
+  /**
+   * The parameters of the function-typed parameter, or `null` if this is not a
+   * function-typed field formal parameter.
+   */
+  FormalParameterList _parameters;
+
+  /**
+   * Initialize a newly created formal parameter. Either or both of the
+   * [comment] and [metadata] can be `null` if the parameter does not have the
+   * corresponding attribute. The [keyword] can be `null` if there is a type.
+   * The [type] must be `null` if the keyword is 'var'. The [thisKeyword] and
+   * [period] can be `null` if the keyword 'this' was not provided.  The
+   * [parameters] can be `null` if this is not a function-typed field formal
+   * parameter.
+   */
+  FieldFormalParameter(Comment comment, List<Annotation> metadata, this.keyword,
+      TypeName type, this.thisKeyword, this.period, SimpleIdentifier identifier,
+      TypeParameterList typeParameters, FormalParameterList parameters)
+      : super(comment, metadata, identifier) {
+    _type = _becomeParentOf(type);
+    _typeParameters = _becomeParentOf(typeParameters);
+    _parameters = _becomeParentOf(parameters);
+  }
+
+  @override
+  Token get beginToken {
+    if (keyword != null) {
+      return keyword;
+    } else if (_type != null) {
+      return _type.beginToken;
+    }
+    return thisKeyword;
+  }
+
+  @override
+  Iterable get childEntities => super._childEntities
+    ..add(keyword)
+    ..add(_type)
+    ..add(thisKeyword)
+    ..add(period)
+    ..add(identifier)
+    ..add(_parameters);
+
+  @override
+  Token get endToken {
+    if (_parameters != null) {
+      return _parameters.endToken;
+    }
+    return identifier.endToken;
+  }
+
+  @override
+  bool get isConst => (keyword is KeywordToken) &&
+      (keyword as KeywordToken).keyword == Keyword.CONST;
+
+  @override
+  bool get isFinal => (keyword is KeywordToken) &&
+      (keyword as KeywordToken).keyword == Keyword.FINAL;
+
+  /**
+   * Return the parameters of the function-typed parameter, or `null` if this is
+   * not a function-typed field formal parameter.
+   */
+  FormalParameterList get parameters => _parameters;
+
+  /**
+   * Set the parameters of the function-typed parameter to the given
+   * [parameters].
+   */
+  void set parameters(FormalParameterList parameters) {
+    _parameters = _becomeParentOf(parameters);
+  }
+
+  /**
+   * Return the token representing the 'this' keyword.
+   */
+  @deprecated // Use "this.thisKeyword"
+  Token get thisToken => thisKeyword;
+
+  /**
+   * Set the token representing the 'this' keyword to the given [token].
+   */
+  @deprecated // Use "this.thisKeyword"
+  set thisToken(Token token) {
+    thisKeyword = token;
+  }
+
+  /**
+   * Return the name of the declared type of the parameter, or `null` if the
+   * parameter does not have a declared type. Note that if this is a
+   * function-typed field formal parameter this is the return type of the
+   * function.
+   */
+  TypeName get type => _type;
+
+  /**
+   * Set the name of the declared type of the parameter to the given [typeName].
+   */
+  void set type(TypeName typeName) {
+    _type = _becomeParentOf(typeName);
+  }
+
+  /**
+   * Return the type parameters associated with this method, or `null` if this
+   * method is not a generic method.
+   */
+  TypeParameterList get typeParameters => _typeParameters;
+
+  /**
+   * Set the type parameters associated with this method to the given
+   * [typeParameters].
+   */
+  void set typeParameters(TypeParameterList typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitFieldFormalParameter(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_type, visitor);
+    _safelyVisitChild(identifier, visitor);
+    _safelyVisitChild(_typeParameters, visitor);
+    _safelyVisitChild(_parameters, visitor);
+  }
+}
+
+/**
+ * A for-each statement.
+ *
+ * > forEachStatement ::=
+ * >     'await'? 'for' '(' [DeclaredIdentifier] 'in' [Expression] ')' [Block]
+ * >   | 'await'? 'for' '(' [SimpleIdentifier] 'in' [Expression] ')' [Block]
+ */
+class ForEachStatement extends Statement {
+  /**
+   * The token representing the 'await' keyword, or `null` if there is no
+   * 'await' keyword.
+   */
+  Token awaitKeyword;
+
+  /**
+   * The token representing the 'for' keyword.
+   */
+  Token forKeyword;
+
+  /**
+   * The left parenthesis.
+   */
+  Token leftParenthesis;
+
+  /**
+   * The declaration of the loop variable, or `null` if the loop variable is a
+   * simple identifier.
+   */
+  DeclaredIdentifier _loopVariable;
+
+  /**
+   * The loop variable, or `null` if the loop variable is declared in the 'for'.
+   */
+  SimpleIdentifier _identifier;
+
+  /**
+   * The token representing the 'in' keyword.
+   */
+  Token inKeyword;
+
+  /**
+   * The expression evaluated to produce the iterator.
+   */
+  Expression _iterable;
+
+  /**
+   * The right parenthesis.
+   */
+  Token rightParenthesis;
+
+  /**
+   * The body of the loop.
+   */
+  Statement _body;
+
+  /**
+   * Initialize a newly created for-each statement. The [awaitKeyword] can be
+   * `null` if this is not an asynchronous for loop.
+   */
+  @deprecated // Use new ForEachStatement.withDeclaration(...)
+  ForEachStatement.con1(this.awaitKeyword, this.forKeyword,
+      this.leftParenthesis, DeclaredIdentifier loopVariable, this.inKeyword,
+      Expression iterator, this.rightParenthesis, Statement body) {
+    _loopVariable = _becomeParentOf(loopVariable);
+    _iterable = _becomeParentOf(iterator);
+    _body = _becomeParentOf(body);
+  }
+
+  /**
+   * Initialize a newly created for-each statement. The [awaitKeyword] can be
+   * `null` if this is not an asynchronous for loop.
+   */
+  @deprecated // Use new ForEachStatement.withReference(...)
+  ForEachStatement.con2(this.awaitKeyword, this.forKeyword,
+      this.leftParenthesis, SimpleIdentifier identifier, this.inKeyword,
+      Expression iterator, this.rightParenthesis, Statement body) {
+    _identifier = _becomeParentOf(identifier);
+    _iterable = _becomeParentOf(iterator);
+    _body = _becomeParentOf(body);
+  }
+
+  /**
+   * Initialize a newly created for-each statement whose loop control variable
+   * is declared internally (in the for-loop part). The [awaitKeyword] can be
+   * `null` if this is not an asynchronous for loop.
+   */
+  ForEachStatement.withDeclaration(this.awaitKeyword, this.forKeyword,
+      this.leftParenthesis, DeclaredIdentifier loopVariable, this.inKeyword,
+      Expression iterator, this.rightParenthesis, Statement body) {
+    _loopVariable = _becomeParentOf(loopVariable);
+    _iterable = _becomeParentOf(iterator);
+    _body = _becomeParentOf(body);
+  }
+
+  /**
+   * Initialize a newly created for-each statement whose loop control variable
+   * is declared outside the for loop. The [awaitKeyword] can be `null` if this
+   * is not an asynchronous for loop.
+   */
+  ForEachStatement.withReference(this.awaitKeyword, this.forKeyword,
+      this.leftParenthesis, SimpleIdentifier identifier, this.inKeyword,
+      Expression iterator, this.rightParenthesis, Statement body) {
+    _identifier = _becomeParentOf(identifier);
+    _iterable = _becomeParentOf(iterator);
+    _body = _becomeParentOf(body);
+  }
+
+  @override
+  Token get beginToken => forKeyword;
+
+  /**
+   * Return the body of the loop.
+   */
+  Statement get body => _body;
+
+  /**
+   * Set the body of the loop to the given [statement].
+   */
+  void set body(Statement statement) {
+    _body = _becomeParentOf(statement);
+  }
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(awaitKeyword)
+    ..add(forKeyword)
+    ..add(leftParenthesis)
+    ..add(_loopVariable)
+    ..add(_identifier)
+    ..add(inKeyword)
+    ..add(_iterable)
+    ..add(rightParenthesis)
+    ..add(_body);
+
+  @override
+  Token get endToken => _body.endToken;
+
+  /**
+   * Return the loop variable, or `null` if the loop variable is declared in the
+   * 'for'.
+   */
+  SimpleIdentifier get identifier => _identifier;
+
+  /**
+   * Set the loop variable to the given [identifier].
+   */
+  void set identifier(SimpleIdentifier identifier) {
+    _identifier = _becomeParentOf(identifier);
+  }
+
+  /**
+   * Return the expression evaluated to produce the iterator.
+   */
+  Expression get iterable => _iterable;
+
+  /**
+   * Set the expression evaluated to produce the iterator to the given
+   * [expression].
+   */
+  void set iterable(Expression expression) {
+    _iterable = _becomeParentOf(expression);
+  }
+
+  /**
+   * Return the expression evaluated to produce the iterator.
+   */
+  @deprecated // Use "this.iterable"
+  Expression get iterator => iterable;
+
+  /**
+   * Return the declaration of the loop variable, or `null` if the loop variable
+   * is a simple identifier.
+   */
+  DeclaredIdentifier get loopVariable => _loopVariable;
+
+  /**
+   * Set the declaration of the loop variable to the given [variable].
+   */
+  void set loopVariable(DeclaredIdentifier variable) {
+    _loopVariable = _becomeParentOf(variable);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitForEachStatement(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_loopVariable, visitor);
+    _safelyVisitChild(_identifier, visitor);
+    _safelyVisitChild(_iterable, visitor);
+    _safelyVisitChild(_body, visitor);
+  }
+}
+
+/**
+ * A node representing a parameter to a function.
+ *
+ * > formalParameter ::=
+ * >     [NormalFormalParameter]
+ * >   | [DefaultFormalParameter]
+ */
+abstract class FormalParameter extends AstNode {
+  /**
+   * Return the element representing this parameter, or `null` if this parameter
+   * has not been resolved.
+   */
+  ParameterElement get element {
+    SimpleIdentifier identifier = this.identifier;
+    if (identifier == null) {
+      return null;
+    }
+    return identifier.staticElement as ParameterElement;
+  }
+
+  /**
+   * Return the name of the parameter being declared.
+   */
+  SimpleIdentifier get identifier;
+
+  /**
+   * Return `true` if this parameter was declared with the 'const' modifier.
+   */
+  bool get isConst;
+
+  /**
+   * Return `true` if this parameter was declared with the 'final' modifier.
+   * Parameters that are declared with the 'const' modifier will return `false`
+   * even though they are implicitly final.
+   */
+  bool get isFinal;
+
+  /**
+   * Return the kind of this parameter.
+   */
+  ParameterKind get kind;
+
+  /**
+   * Return the annotations associated with this parameter.
+   */
+  NodeList<Annotation> get metadata;
+}
+
+/**
+ * The formal parameter list of a method declaration, function declaration, or
+ * function type alias.
+ *
+ * While the grammar requires all optional formal parameters to follow all of
+ * the normal formal parameters and at most one grouping of optional formal
+ * parameters, this class does not enforce those constraints. All parameters are
+ * flattened into a single list, which can have any or all kinds of parameters
+ * (normal, named, and positional) in any order.
+ *
+ * > formalParameterList ::=
+ * >     '(' ')'
+ * >   | '(' normalFormalParameters (',' optionalFormalParameters)? ')'
+ * >   | '(' optionalFormalParameters ')'
+ * >
+ * > normalFormalParameters ::=
+ * >     [NormalFormalParameter] (',' [NormalFormalParameter])*
+ * >
+ * > optionalFormalParameters ::=
+ * >     optionalPositionalFormalParameters
+ * >   | namedFormalParameters
+ * >
+ * > optionalPositionalFormalParameters ::=
+ * >     '[' [DefaultFormalParameter] (',' [DefaultFormalParameter])* ']'
+ * >
+ * > namedFormalParameters ::=
+ * >     '{' [DefaultFormalParameter] (',' [DefaultFormalParameter])* '}'
+ */
+class FormalParameterList extends AstNode {
+  /**
+   * The left parenthesis.
+   */
+  Token leftParenthesis;
+
+  /**
+   * The parameters associated with the method.
+   */
+  NodeList<FormalParameter> _parameters;
+
+  /**
+   * The left square bracket ('[') or left curly brace ('{') introducing the
+   * optional parameters, or `null` if there are no optional parameters.
+   */
+  Token leftDelimiter;
+
+  /**
+   * The right square bracket (']') or right curly brace ('}') terminating the
+   * optional parameters, or `null` if there are no optional parameters.
+   */
+  Token rightDelimiter;
+
+  /**
+   * The right parenthesis.
+   */
+  Token rightParenthesis;
+
+  /**
+   * Initialize a newly created parameter list. The list of [parameters] can be
+   * `null` if there are no parameters. The [leftDelimiter] and [rightDelimiter]
+   * can be `null` if there are no optional parameters.
+   */
+  FormalParameterList(this.leftParenthesis, List<FormalParameter> parameters,
+      this.leftDelimiter, this.rightDelimiter, this.rightParenthesis) {
+    _parameters = new NodeList<FormalParameter>(this, parameters);
+  }
+
+  @override
+  Token get beginToken => leftParenthesis;
+
+  @override
+  Iterable get childEntities {
+    // TODO(paulberry): include commas.
+    ChildEntities result = new ChildEntities()..add(leftParenthesis);
+    bool leftDelimiterNeeded = leftDelimiter != null;
+    for (FormalParameter parameter in _parameters) {
+      if (leftDelimiterNeeded && leftDelimiter.offset < parameter.offset) {
+        result.add(leftDelimiter);
+        leftDelimiterNeeded = false;
+      }
+      result.add(parameter);
+    }
+    return result..add(rightDelimiter)..add(rightParenthesis);
+  }
+
+  @override
+  Token get endToken => rightParenthesis;
+
+  /**
+   * Return a list containing the elements representing the parameters in this
+   * list. The list will contain `null`s if the parameters in this list have not
+   * been resolved.
+   */
+  List<ParameterElement> get parameterElements {
+    int count = _parameters.length;
+    List<ParameterElement> types = new List<ParameterElement>(count);
+    for (int i = 0; i < count; i++) {
+      types[i] = _parameters[i].element;
+    }
+    return types;
+  }
+
+  /**
+   * Return the parameters associated with the method.
+   */
+  NodeList<FormalParameter> get parameters => _parameters;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitFormalParameterList(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _parameters.accept(visitor);
+  }
+}
+
+/**
+ * A for statement.
+ *
+ * > forStatement ::=
+ * >     'for' '(' forLoopParts ')' [Statement]
+ * >
+ * > forLoopParts ::=
+ * >     forInitializerStatement ';' [Expression]? ';' [Expression]?
+ * >
+ * > forInitializerStatement ::=
+ * >     [DefaultFormalParameter]
+ * >   | [Expression]?
+ */
+class ForStatement extends Statement {
+  /**
+   * The token representing the 'for' keyword.
+   */
+  Token forKeyword;
+
+  /**
+   * The left parenthesis.
+   */
+  Token leftParenthesis;
+
+  /**
+   * The declaration of the loop variables, or `null` if there are no variables.
+   * Note that a for statement cannot have both a variable list and an
+   * initialization expression, but can validly have neither.
+   */
+  VariableDeclarationList _variableList;
+
+  /**
+   * The initialization expression, or `null` if there is no initialization
+   * expression. Note that a for statement cannot have both a variable list and
+   * an initialization expression, but can validly have neither.
+   */
+  Expression _initialization;
+
+  /**
+   * The semicolon separating the initializer and the condition.
+   */
+  Token leftSeparator;
+
+  /**
+   * The condition used to determine when to terminate the loop, or `null` if
+   * there is no condition.
+   */
+  Expression _condition;
+
+  /**
+   * The semicolon separating the condition and the updater.
+   */
+  Token rightSeparator;
+
+  /**
+   * The list of expressions run after each execution of the loop body.
+   */
+  NodeList<Expression> _updaters;
+
+  /**
+   * The right parenthesis.
+   */
+  Token rightParenthesis;
+
+  /**
+   * The body of the loop.
+   */
+  Statement _body;
+
+  /**
+   * Initialize a newly created for statement. Either the [variableList] or the
+   * [initialization] must be `null`. Either the [condition] and the list of
+   * [updaters] can be `null` if the loop does not have the corresponding
+   * attribute.
+   */
+  ForStatement(this.forKeyword, this.leftParenthesis,
+      VariableDeclarationList variableList, Expression initialization,
+      this.leftSeparator, Expression condition, this.rightSeparator,
+      List<Expression> updaters, this.rightParenthesis, Statement body) {
+    _variableList = _becomeParentOf(variableList);
+    _initialization = _becomeParentOf(initialization);
+    _condition = _becomeParentOf(condition);
+    _updaters = new NodeList<Expression>(this, updaters);
+    _body = _becomeParentOf(body);
+  }
+
+  @override
+  Token get beginToken => forKeyword;
+
+  /**
+   * Return the body of the loop.
+   */
+  Statement get body => _body;
+
+  /**
+   * Set the body of the loop to the given [statement].
+   */
+  void set body(Statement statement) {
+    _body = _becomeParentOf(statement);
+  }
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(forKeyword)
+    ..add(leftParenthesis)
+    ..add(_variableList)
+    ..add(_initialization)
+    ..add(leftSeparator)
+    ..add(_condition)
+    ..add(rightSeparator)
+    ..addAll(_updaters)
+    ..add(rightParenthesis)
+    ..add(_body);
+
+  /**
+   * Return the condition used to determine when to terminate the loop, or
+   * `null` if there is no condition.
+   */
+  Expression get condition => _condition;
+
+  /**
+   * Set the condition used to determine when to terminate the loop to the given
+   * [expression].
+   */
+  void set condition(Expression expression) {
+    _condition = _becomeParentOf(expression);
+  }
+
+  @override
+  Token get endToken => _body.endToken;
+
+  /**
+   * Return the initialization expression, or `null` if there is no
+   * initialization expression.
+   */
+  Expression get initialization => _initialization;
+
+  /**
+   * Set the initialization expression to the given [expression].
+   */
+  void set initialization(Expression initialization) {
+    _initialization = _becomeParentOf(initialization);
+  }
+
+  /**
+   * Return the list of expressions run after each execution of the loop body.
+   */
+  NodeList<Expression> get updaters => _updaters;
+
+  /**
+   * Return the declaration of the loop variables, or `null` if there are no
+   * variables.
+   */
+  VariableDeclarationList get variables => _variableList;
+
+  /**
+   * Set the declaration of the loop variables to the given [variableList].
+   */
+  void set variables(VariableDeclarationList variableList) {
+    _variableList = _becomeParentOf(variableList);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitForStatement(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_variableList, visitor);
+    _safelyVisitChild(_initialization, visitor);
+    _safelyVisitChild(_condition, visitor);
+    _updaters.accept(visitor);
+    _safelyVisitChild(_body, visitor);
+  }
+}
+
+/**
+ * A node representing the body of a function or method.
+ *
+ * > functionBody ::=
+ * >     [BlockFunctionBody]
+ * >   | [EmptyFunctionBody]
+ * >   | [ExpressionFunctionBody]
+ */
+abstract class FunctionBody extends AstNode {
+  /**
+   * Return `true` if this function body is asynchronous.
+   */
+  bool get isAsynchronous => false;
+
+  /**
+   * Return `true` if this function body is a generator.
+   */
+  bool get isGenerator => false;
+
+  /**
+   * Return `true` if this function body is synchronous.
+   */
+  bool get isSynchronous => true;
+
+  /**
+   * Return the token representing the 'async' or 'sync' keyword, or `null` if
+   * there is no such keyword.
+   */
+  Token get keyword => null;
+
+  /**
+   * Return the star following the 'async' or 'sync' keyword, or `null` if there
+   * is no star.
+   */
+  Token get star => null;
+}
+
+/**
+ * A top-level declaration.
+ *
+ * > functionDeclaration ::=
+ * >     'external' functionSignature
+ * >   | functionSignature [FunctionBody]
+ * >
+ * > functionSignature ::=
+ * >     [Type]? ('get' | 'set')? [SimpleIdentifier] [FormalParameterList]
+ */
+class FunctionDeclaration extends NamedCompilationUnitMember {
+  /**
+   * The token representing the 'external' keyword, or `null` if this is not an
+   * external function.
+   */
+  Token externalKeyword;
+
+  /**
+   * The return type of the function, or `null` if no return type was declared.
+   */
+  TypeName _returnType;
+
+  /**
+   * The token representing the 'get' or 'set' keyword, or `null` if this is a
+   * function declaration rather than a property declaration.
+   */
+  Token propertyKeyword;
+
+  /**
+   * The function expression being wrapped.
+   */
+  FunctionExpression _functionExpression;
+
+  /**
+   * Initialize a newly created function declaration. Either or both of the
+   * [comment] and [metadata] can be `null` if the function does not have the
+   * corresponding attribute. The [externalKeyword] can be `null` if the
+   * function is not an external function. The [returnType] can be `null` if no
+   * return type was specified. The [propertyKeyword] can be `null` if the
+   * function is neither a getter or a setter.
+   */
+  FunctionDeclaration(Comment comment, List<Annotation> metadata,
+      this.externalKeyword, TypeName returnType, this.propertyKeyword,
+      SimpleIdentifier name, FunctionExpression functionExpression)
+      : super(comment, metadata, name) {
+    _returnType = _becomeParentOf(returnType);
+    _functionExpression = _becomeParentOf(functionExpression);
+  }
+
+  @override
+  Iterable get childEntities => super._childEntities
+    ..add(externalKeyword)
+    ..add(_returnType)
+    ..add(propertyKeyword)
+    ..add(_name)
+    ..add(_functionExpression);
+
+  @override
+  ExecutableElement get element =>
+      _name != null ? (_name.staticElement as ExecutableElement) : null;
+
+  @override
+  Token get endToken => _functionExpression.endToken;
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata {
+    if (externalKeyword != null) {
+      return externalKeyword;
+    } else if (_returnType != null) {
+      return _returnType.beginToken;
+    } else if (propertyKeyword != null) {
+      return propertyKeyword;
+    } else if (_name != null) {
+      return _name.beginToken;
+    }
+    return _functionExpression.beginToken;
+  }
+
+  /**
+   * Return the function expression being wrapped.
+   */
+  FunctionExpression get functionExpression => _functionExpression;
+
+  /**
+   * Set the function expression being wrapped to the given
+   * [functionExpression].
+   */
+  void set functionExpression(FunctionExpression functionExpression) {
+    _functionExpression = _becomeParentOf(functionExpression);
+  }
+
+  /**
+   * Return `true` if this function declares a getter.
+   */
+  bool get isGetter => propertyKeyword != null &&
+      (propertyKeyword as KeywordToken).keyword == Keyword.GET;
+
+  /**
+   * Return `true` if this function declares a setter.
+   */
+  bool get isSetter => propertyKeyword != null &&
+      (propertyKeyword as KeywordToken).keyword == Keyword.SET;
+
+  /**
+   * Return the return type of the function, or `null` if no return type was
+   * declared.
+   */
+  TypeName get returnType => _returnType;
+
+  /**
+   * Set the return type of the function to the given [returnType].
+   */
+  void set returnType(TypeName returnType) {
+    _returnType = _becomeParentOf(returnType);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitFunctionDeclaration(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_returnType, visitor);
+    _safelyVisitChild(_name, visitor);
+    _safelyVisitChild(_functionExpression, visitor);
+  }
+}
+
+/**
+ * A [FunctionDeclaration] used as a statement.
+ */
+class FunctionDeclarationStatement extends Statement {
+  /**
+   * The function declaration being wrapped.
+   */
+  FunctionDeclaration _functionDeclaration;
+
+  /**
+   * Initialize a newly created function declaration statement.
+   */
+  FunctionDeclarationStatement(FunctionDeclaration functionDeclaration) {
+    _functionDeclaration = _becomeParentOf(functionDeclaration);
+  }
+
+  @override
+  Token get beginToken => _functionDeclaration.beginToken;
+
+  @override
+  Iterable get childEntities => new ChildEntities()..add(_functionDeclaration);
+
+  @override
+  Token get endToken => _functionDeclaration.endToken;
+
+  /**
+   * Return the function declaration being wrapped.
+   */
+  FunctionDeclaration get functionDeclaration => _functionDeclaration;
+
+  /**
+   * Set the function declaration being wrapped to the given
+   * [functionDeclaration].
+   */
+  void set functionDeclaration(FunctionDeclaration functionDeclaration) {
+    _functionDeclaration = _becomeParentOf(functionDeclaration);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitFunctionDeclarationStatement(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_functionDeclaration, visitor);
+  }
+}
+
+/**
+ * A function expression.
+ *
+ * > functionExpression ::=
+ * >     [TypeParameterList]? [FormalParameterList] [FunctionBody]
+ */
+class FunctionExpression extends Expression {
+  /**
+   * The type parameters associated with the method, or `null` if the method is
+   * not a generic method.
+   */
+  TypeParameterList _typeParameters;
+
+  /**
+   * The parameters associated with the function.
+   */
+  FormalParameterList _parameters;
+
+  /**
+   * The body of the function, or `null` if this is an external function.
+   */
+  FunctionBody _body;
+
+  /**
+   * The element associated with the function, or `null` if the AST structure
+   * has not been resolved.
+   */
+  ExecutableElement element;
+
+  /**
+   * Initialize a newly created function declaration.
+   */
+  FunctionExpression(TypeParameterList typeParameters,
+      FormalParameterList parameters, FunctionBody body) {
+    _typeParameters = _becomeParentOf(typeParameters);
+    _parameters = _becomeParentOf(parameters);
+    _body = _becomeParentOf(body);
+  }
+
+  @override
+  Token get beginToken {
+    if (_typeParameters != null) {
+      return _typeParameters.beginToken;
+    } else if (_parameters != null) {
+      return _parameters.beginToken;
+    } else if (_body != null) {
+      return _body.beginToken;
+    }
+    // This should never be reached because external functions must be named,
+    // hence either the body or the name should be non-null.
+    throw new IllegalStateException("Non-external functions must have a body");
+  }
+
+  /**
+   * Return the body of the function, or `null` if this is an external function.
+   */
+  FunctionBody get body => _body;
+
+  /**
+   * Set the body of the function to the given [functionBody].
+   */
+  void set body(FunctionBody functionBody) {
+    _body = _becomeParentOf(functionBody);
+  }
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(_parameters)..add(_body);
+
+  @override
+  Token get endToken {
+    if (_body != null) {
+      return _body.endToken;
+    } else if (_parameters != null) {
+      return _parameters.endToken;
+    }
+    // This should never be reached because external functions must be named,
+    // hence either the body or the name should be non-null.
+    throw new IllegalStateException("Non-external functions must have a body");
+  }
+
+  /**
+   * Return the parameters associated with the function.
+   */
+  FormalParameterList get parameters => _parameters;
+
+  /**
+   * Set the parameters associated with the function to the given list of
+   * [parameters].
+   */
+  void set parameters(FormalParameterList parameters) {
+    _parameters = _becomeParentOf(parameters);
+  }
+
+  @override
+  int get precedence => 16;
+
+  /**
+   * Return the type parameters associated with this method, or `null` if this
+   * method is not a generic method.
+   */
+  TypeParameterList get typeParameters => _typeParameters;
+
+  /**
+   * Set the type parameters associated with this method to the given
+   * [typeParameters].
+   */
+  void set typeParameters(TypeParameterList typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitFunctionExpression(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_typeParameters, visitor);
+    _safelyVisitChild(_parameters, visitor);
+    _safelyVisitChild(_body, visitor);
+  }
+}
+
+/**
+ * The invocation of a function resulting from evaluating an expression.
+ * Invocations of methods and other forms of functions are represented by
+ * [MethodInvocation] nodes. Invocations of getters and setters are represented
+ * by either [PrefixedIdentifier] or [PropertyAccess] nodes.
+ *
+ * > functionExpressionInvoction ::=
+ * >     [Expression] [TypeArgumentList]? [ArgumentList]
+ */
+class FunctionExpressionInvocation extends Expression {
+  /**
+   * The expression producing the function being invoked.
+   */
+  Expression _function;
+
+  /**
+   * The type arguments to be applied to the method being invoked, or `null` if
+   * no type arguments were provided.
+   */
+  TypeArgumentList _typeArguments;
+
+  /**
+   * The list of arguments to the function.
+   */
+  ArgumentList _argumentList;
+
+  /**
+   * The element associated with the function being invoked based on static type
+   * information, or `null` if the AST structure has not been resolved or the
+   * function could not be resolved.
+   */
+  ExecutableElement staticElement;
+
+  /**
+   * The element associated with the function being invoked based on propagated
+   * type information, or `null` if the AST structure has not been resolved or
+   * the function could not be resolved.
+   */
+  ExecutableElement propagatedElement;
+
+  /**
+   * Initialize a newly created function expression invocation.
+   */
+  FunctionExpressionInvocation(Expression function,
+      TypeArgumentList typeArguments, ArgumentList argumentList) {
+    _function = _becomeParentOf(function);
+    _typeArguments = _becomeParentOf(typeArguments);
+    _argumentList = _becomeParentOf(argumentList);
+  }
+
+  /**
+   * Return the list of arguments to the method.
+   */
+  ArgumentList get argumentList => _argumentList;
+
+  /**
+   * Set the list of arguments to the method to the given [argumentList].
+   */
+  void set argumentList(ArgumentList argumentList) {
+    _argumentList = _becomeParentOf(argumentList);
+  }
+
+  @override
+  Token get beginToken => _function.beginToken;
+
+  /**
+   * Return the best element available for the function being invoked. If
+   * resolution was able to find a better element based on type propagation,
+   * that element will be returned. Otherwise, the element found using the
+   * result of static analysis will be returned. If resolution has not been
+   * performed, then `null` will be returned.
+   */
+  ExecutableElement get bestElement {
+    ExecutableElement element = propagatedElement;
+    if (element == null) {
+      element = staticElement;
+    }
+    return element;
+  }
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(_function)..add(_argumentList);
+
+  @override
+  Token get endToken => _argumentList.endToken;
+
+  /**
+   * Return the expression producing the function being invoked.
+   */
+  Expression get function => _function;
+
+  /**
+   * Set the expression producing the function being invoked to the given
+   * [expression].
+   */
+  void set function(Expression expression) {
+    _function = _becomeParentOf(expression);
+  }
+
+  @override
+  int get precedence => 15;
+
+  /**
+   * Return the type arguments to be applied to the method being invoked, or
+   * `null` if no type arguments were provided.
+   */
+  TypeArgumentList get typeArguments => _typeArguments;
+
+  /**
+   * Set the type arguments to be applied to the method being invoked to the
+   * given [typeArguments].
+   */
+  void set typeArguments(TypeArgumentList typeArguments) {
+    _typeArguments = _becomeParentOf(typeArguments);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitFunctionExpressionInvocation(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_function, visitor);
+    _safelyVisitChild(_typeArguments, visitor);
+    _safelyVisitChild(_argumentList, visitor);
+  }
+}
+
+/**
+ * A function type alias.
+ *
+ * > functionTypeAlias ::=
+ * >     functionPrefix [TypeParameterList]? [FormalParameterList] ';'
+ * >
+ * > functionPrefix ::=
+ * >     [TypeName]? [SimpleIdentifier]
+ */
+class FunctionTypeAlias extends TypeAlias {
+  /**
+   * The name of the return type of the function type being defined, or `null`
+   * if no return type was given.
+   */
+  TypeName _returnType;
+
+  /**
+   * The type parameters for the function type, or `null` if the function type
+   * does not have any type parameters.
+   */
+  TypeParameterList _typeParameters;
+
+  /**
+   * The parameters associated with the function type.
+   */
+  FormalParameterList _parameters;
+
+  /**
+   * Initialize a newly created function type alias. Either or both of the
+   * [comment] and [metadata] can be `null` if the function does not have the
+   * corresponding attribute. The [returnType] can be `null` if no return type
+   * was specified. The [typeParameters] can be `null` if the function has no
+   * type parameters.
+   */
+  FunctionTypeAlias(Comment comment, List<Annotation> metadata, Token keyword,
+      TypeName returnType, SimpleIdentifier name,
+      TypeParameterList typeParameters, FormalParameterList parameters,
+      Token semicolon)
+      : super(comment, metadata, keyword, name, semicolon) {
+    _returnType = _becomeParentOf(returnType);
+    _typeParameters = _becomeParentOf(typeParameters);
+    _parameters = _becomeParentOf(parameters);
+  }
+
+  @override
+  Iterable get childEntities => super._childEntities
+    ..add(typedefKeyword)
+    ..add(_returnType)
+    ..add(_name)
+    ..add(_typeParameters)
+    ..add(_parameters)
+    ..add(semicolon);
+
+  @override
+  FunctionTypeAliasElement get element =>
+      _name != null ? (_name.staticElement as FunctionTypeAliasElement) : null;
+
+  /**
+   * Return the parameters associated with the function type.
+   */
+  FormalParameterList get parameters => _parameters;
+
+  /**
+   * Set the parameters associated with the function type to the given list of
+   * [parameters].
+   */
+  void set parameters(FormalParameterList parameters) {
+    _parameters = _becomeParentOf(parameters);
+  }
+
+  /**
+   * Return the name of the return type of the function type being defined, or
+   * `null` if no return type was given.
+   */
+  TypeName get returnType => _returnType;
+
+  /**
+   * Set the name of the return type of the function type being defined to the
+   * given [typeName].
+   */
+  void set returnType(TypeName typeName) {
+    _returnType = _becomeParentOf(typeName);
+  }
+
+  /**
+   * Return the type parameters for the function type, or `null` if the function
+   * type does not have any type parameters.
+   */
+  TypeParameterList get typeParameters => _typeParameters;
+
+  /**
+   * Set the type parameters for the function type to the given list of
+   * [typeParameters].
+   */
+  void set typeParameters(TypeParameterList typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitFunctionTypeAlias(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_returnType, visitor);
+    _safelyVisitChild(_name, visitor);
+    _safelyVisitChild(_typeParameters, visitor);
+    _safelyVisitChild(_parameters, visitor);
+  }
+}
+
+/**
+ * A function-typed formal parameter.
+ *
+ * > functionSignature ::=
+ * >     [TypeName]? [SimpleIdentifier] [TypeParameterList]? [FormalParameterList]
+ */
+class FunctionTypedFormalParameter extends NormalFormalParameter {
+  /**
+   * The return type of the function, or `null` if the function does not have a
+   * return type.
+   */
+  TypeName _returnType;
+
+  /**
+   * The type parameters associated with the function, or `null` if the function
+   * is not a generic function.
+   */
+  TypeParameterList _typeParameters;
+
+  /**
+   * The parameters of the function-typed parameter.
+   */
+  FormalParameterList _parameters;
+
+  /**
+   * Initialize a newly created formal parameter. Either or both of the
+   * [comment] and [metadata] can be `null` if the parameter does not have the
+   * corresponding attribute. The [returnType] can be `null` if no return type
+   * was specified.
+   */
+  FunctionTypedFormalParameter(Comment comment, List<Annotation> metadata,
+      TypeName returnType, SimpleIdentifier identifier,
+      TypeParameterList typeParameters, FormalParameterList parameters)
+      : super(comment, metadata, identifier) {
+    _returnType = _becomeParentOf(returnType);
+    _typeParameters = _becomeParentOf(typeParameters);
+    _parameters = _becomeParentOf(parameters);
+  }
+
+  @override
+  Token get beginToken {
+    if (_returnType != null) {
+      return _returnType.beginToken;
+    }
+    return identifier.beginToken;
+  }
+
+  @override
+  Iterable get childEntities =>
+      super._childEntities..add(_returnType)..add(identifier)..add(parameters);
+
+  @override
+  Token get endToken => _parameters.endToken;
+
+  @override
+  bool get isConst => false;
+
+  @override
+  bool get isFinal => false;
+
+  /**
+   * Return the parameters of the function-typed parameter.
+   */
+  FormalParameterList get parameters => _parameters;
+
+  /**
+   * Set the parameters of the function-typed parameter to the given
+   * [parameters].
+   */
+  void set parameters(FormalParameterList parameters) {
+    _parameters = _becomeParentOf(parameters);
+  }
+
+  /**
+   * Return the return type of the function, or `null` if the function does not
+   * have a return type.
+   */
+  TypeName get returnType => _returnType;
+
+  /**
+   * Set the return type of the function to the given [type].
+   */
+  void set returnType(TypeName type) {
+    _returnType = _becomeParentOf(type);
+  }
+
+  /**
+   * Return the type parameters associated with this function, or `null` if
+   * this function is not a generic function.
+   */
+  TypeParameterList get typeParameters => _typeParameters;
+
+  /**
+   * Set the type parameters associated with this method to the given
+   * [typeParameters].
+   */
+  void set typeParameters(TypeParameterList typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitFunctionTypedFormalParameter(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_returnType, visitor);
+    _safelyVisitChild(identifier, visitor);
+    _safelyVisitChild(_typeParameters, visitor);
+    _safelyVisitChild(_parameters, visitor);
+  }
+}
+
+/**
+ * An AST visitor that will recursively visit all of the nodes in an AST
+ * structure (like instances of the class [RecursiveAstVisitor]). In addition,
+ * when a node of a specific type is visited not only will the visit method for
+ * that specific type of node be invoked, but additional methods for the
+ * superclasses of that node will also be invoked. For example, using an
+ * instance of this class to visit a [Block] will cause the method [visitBlock]
+ * to be invoked but will also cause the methods [visitStatement] and
+ * [visitNode] to be subsequently invoked. This allows visitors to be written
+ * that visit all statements without needing to override the visit method for
+ * each of the specific subclasses of [Statement].
+ *
+ * Subclasses that override a visit method must either invoke the overridden
+ * visit method or explicitly invoke the more general visit method. Failure to
+ * do so will cause the visit methods for superclasses of the node to not be
+ * invoked and will cause the children of the visited node to not be visited.
+ */
+class GeneralizingAstVisitor<R> implements AstVisitor<R> {
+  @override
+  R visitAdjacentStrings(AdjacentStrings node) => visitStringLiteral(node);
+
+  R visitAnnotatedNode(AnnotatedNode node) => visitNode(node);
+
+  @override
+  R visitAnnotation(Annotation node) => visitNode(node);
+
+  @override
+  R visitArgumentList(ArgumentList node) => visitNode(node);
+
+  @override
+  R visitAsExpression(AsExpression node) => visitExpression(node);
+
+  @override
+  R visitAssertStatement(AssertStatement node) => visitStatement(node);
+
+  @override
+  R visitAssignmentExpression(AssignmentExpression node) =>
+      visitExpression(node);
+
+  @override
+  R visitAwaitExpression(AwaitExpression node) => visitExpression(node);
+
+  @override
+  R visitBinaryExpression(BinaryExpression node) => visitExpression(node);
+
+  @override
+  R visitBlock(Block node) => visitStatement(node);
+
+  @override
+  R visitBlockFunctionBody(BlockFunctionBody node) => visitFunctionBody(node);
+
+  @override
+  R visitBooleanLiteral(BooleanLiteral node) => visitLiteral(node);
+
+  @override
+  R visitBreakStatement(BreakStatement node) => visitStatement(node);
+
+  @override
+  R visitCascadeExpression(CascadeExpression node) => visitExpression(node);
+
+  @override
+  R visitCatchClause(CatchClause node) => visitNode(node);
+
+  @override
+  R visitClassDeclaration(ClassDeclaration node) =>
+      visitNamedCompilationUnitMember(node);
+
+  R visitClassMember(ClassMember node) => visitDeclaration(node);
+
+  @override
+  R visitClassTypeAlias(ClassTypeAlias node) => visitTypeAlias(node);
+
+  R visitCombinator(Combinator node) => visitNode(node);
+
+  @override
+  R visitComment(Comment node) => visitNode(node);
+
+  @override
+  R visitCommentReference(CommentReference node) => visitNode(node);
+
+  @override
+  R visitCompilationUnit(CompilationUnit node) => visitNode(node);
+
+  R visitCompilationUnitMember(CompilationUnitMember node) =>
+      visitDeclaration(node);
+
+  @override
+  R visitConditionalExpression(ConditionalExpression node) =>
+      visitExpression(node);
+
+  @override
+  R visitConstructorDeclaration(ConstructorDeclaration node) =>
+      visitClassMember(node);
+
+  @override
+  R visitConstructorFieldInitializer(ConstructorFieldInitializer node) =>
+      visitConstructorInitializer(node);
+
+  R visitConstructorInitializer(ConstructorInitializer node) => visitNode(node);
+
+  @override
+  R visitConstructorName(ConstructorName node) => visitNode(node);
+
+  @override
+  R visitContinueStatement(ContinueStatement node) => visitStatement(node);
+
+  R visitDeclaration(Declaration node) => visitAnnotatedNode(node);
+
+  @override
+  R visitDeclaredIdentifier(DeclaredIdentifier node) => visitDeclaration(node);
+
+  @override
+  R visitDefaultFormalParameter(DefaultFormalParameter node) =>
+      visitFormalParameter(node);
+
+  R visitDirective(Directive node) => visitAnnotatedNode(node);
+
+  @override
+  R visitDoStatement(DoStatement node) => visitStatement(node);
+
+  @override
+  R visitDoubleLiteral(DoubleLiteral node) => visitLiteral(node);
+
+  @override
+  R visitEmptyFunctionBody(EmptyFunctionBody node) => visitFunctionBody(node);
+
+  @override
+  R visitEmptyStatement(EmptyStatement node) => visitStatement(node);
+
+  @override
+  R visitEnumConstantDeclaration(EnumConstantDeclaration node) =>
+      visitDeclaration(node);
+
+  @override
+  R visitEnumDeclaration(EnumDeclaration node) =>
+      visitNamedCompilationUnitMember(node);
+
+  @override
+  R visitExportDirective(ExportDirective node) => visitNamespaceDirective(node);
+
+  R visitExpression(Expression node) => visitNode(node);
+
+  @override
+  R visitExpressionFunctionBody(ExpressionFunctionBody node) =>
+      visitFunctionBody(node);
+
+  @override
+  R visitExpressionStatement(ExpressionStatement node) => visitStatement(node);
+
+  @override
+  R visitExtendsClause(ExtendsClause node) => visitNode(node);
+
+  @override
+  R visitFieldDeclaration(FieldDeclaration node) => visitClassMember(node);
+
+  @override
+  R visitFieldFormalParameter(FieldFormalParameter node) =>
+      visitNormalFormalParameter(node);
+
+  @override
+  R visitForEachStatement(ForEachStatement node) => visitStatement(node);
+
+  R visitFormalParameter(FormalParameter node) => visitNode(node);
+
+  @override
+  R visitFormalParameterList(FormalParameterList node) => visitNode(node);
+
+  @override
+  R visitForStatement(ForStatement node) => visitStatement(node);
+
+  R visitFunctionBody(FunctionBody node) => visitNode(node);
+
+  @override
+  R visitFunctionDeclaration(FunctionDeclaration node) =>
+      visitNamedCompilationUnitMember(node);
+
+  @override
+  R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) =>
+      visitStatement(node);
+
+  @override
+  R visitFunctionExpression(FunctionExpression node) => visitExpression(node);
+
+  @override
+  R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) =>
+      visitExpression(node);
+
+  @override
+  R visitFunctionTypeAlias(FunctionTypeAlias node) => visitTypeAlias(node);
+
+  @override
+  R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) =>
+      visitNormalFormalParameter(node);
+
+  @override
+  R visitHideCombinator(HideCombinator node) => visitCombinator(node);
+
+  R visitIdentifier(Identifier node) => visitExpression(node);
+
+  @override
+  R visitIfStatement(IfStatement node) => visitStatement(node);
+
+  @override
+  R visitImplementsClause(ImplementsClause node) => visitNode(node);
+
+  @override
+  R visitImportDirective(ImportDirective node) => visitNamespaceDirective(node);
+
+  @override
+  R visitIndexExpression(IndexExpression node) => visitExpression(node);
+
+  @override
+  R visitInstanceCreationExpression(InstanceCreationExpression node) =>
+      visitExpression(node);
+
+  @override
+  R visitIntegerLiteral(IntegerLiteral node) => visitLiteral(node);
+
+  R visitInterpolationElement(InterpolationElement node) => visitNode(node);
+
+  @override
+  R visitInterpolationExpression(InterpolationExpression node) =>
+      visitInterpolationElement(node);
+
+  @override
+  R visitInterpolationString(InterpolationString node) =>
+      visitInterpolationElement(node);
+
+  @override
+  R visitIsExpression(IsExpression node) => visitExpression(node);
+
+  @override
+  R visitLabel(Label node) => visitNode(node);
+
+  @override
+  R visitLabeledStatement(LabeledStatement node) => visitStatement(node);
+
+  @override
+  R visitLibraryDirective(LibraryDirective node) => visitDirective(node);
+
+  @override
+  R visitLibraryIdentifier(LibraryIdentifier node) => visitIdentifier(node);
+
+  @override
+  R visitListLiteral(ListLiteral node) => visitTypedLiteral(node);
+
+  R visitLiteral(Literal node) => visitExpression(node);
+
+  @override
+  R visitMapLiteral(MapLiteral node) => visitTypedLiteral(node);
+
+  @override
+  R visitMapLiteralEntry(MapLiteralEntry node) => visitNode(node);
+
+  @override
+  R visitMethodDeclaration(MethodDeclaration node) => visitClassMember(node);
+
+  @override
+  R visitMethodInvocation(MethodInvocation node) => visitExpression(node);
+
+  R visitNamedCompilationUnitMember(NamedCompilationUnitMember node) =>
+      visitCompilationUnitMember(node);
+
+  @override
+  R visitNamedExpression(NamedExpression node) => visitExpression(node);
+
+  R visitNamespaceDirective(NamespaceDirective node) =>
+      visitUriBasedDirective(node);
+
+  @override
+  R visitNativeClause(NativeClause node) => visitNode(node);
+
+  @override
+  R visitNativeFunctionBody(NativeFunctionBody node) => visitFunctionBody(node);
+
+  R visitNode(AstNode node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  R visitNormalFormalParameter(NormalFormalParameter node) =>
+      visitFormalParameter(node);
+
+  @override
+  R visitNullLiteral(NullLiteral node) => visitLiteral(node);
+
+  @override
+  R visitParenthesizedExpression(ParenthesizedExpression node) =>
+      visitExpression(node);
+
+  @override
+  R visitPartDirective(PartDirective node) => visitUriBasedDirective(node);
+
+  @override
+  R visitPartOfDirective(PartOfDirective node) => visitDirective(node);
+
+  @override
+  R visitPostfixExpression(PostfixExpression node) => visitExpression(node);
+
+  @override
+  R visitPrefixedIdentifier(PrefixedIdentifier node) => visitIdentifier(node);
+
+  @override
+  R visitPrefixExpression(PrefixExpression node) => visitExpression(node);
+
+  @override
+  R visitPropertyAccess(PropertyAccess node) => visitExpression(node);
+
+  @override
+  R visitRedirectingConstructorInvocation(
+          RedirectingConstructorInvocation node) =>
+      visitConstructorInitializer(node);
+
+  @override
+  R visitRethrowExpression(RethrowExpression node) => visitExpression(node);
+
+  @override
+  R visitReturnStatement(ReturnStatement node) => visitStatement(node);
+
+  @override
+  R visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
+
+  @override
+  R visitShowCombinator(ShowCombinator node) => visitCombinator(node);
+
+  @override
+  R visitSimpleFormalParameter(SimpleFormalParameter node) =>
+      visitNormalFormalParameter(node);
+
+  @override
+  R visitSimpleIdentifier(SimpleIdentifier node) => visitIdentifier(node);
+
+  @override
+  R visitSimpleStringLiteral(SimpleStringLiteral node) =>
+      visitSingleStringLiteral(node);
+
+  R visitSingleStringLiteral(SingleStringLiteral node) =>
+      visitStringLiteral(node);
+
+  R visitStatement(Statement node) => visitNode(node);
+
+  @override
+  R visitStringInterpolation(StringInterpolation node) =>
+      visitSingleStringLiteral(node);
+
+  R visitStringLiteral(StringLiteral node) => visitLiteral(node);
+
+  @override
+  R visitSuperConstructorInvocation(SuperConstructorInvocation node) =>
+      visitConstructorInitializer(node);
+
+  @override
+  R visitSuperExpression(SuperExpression node) => visitExpression(node);
+
+  @override
+  R visitSwitchCase(SwitchCase node) => visitSwitchMember(node);
+
+  @override
+  R visitSwitchDefault(SwitchDefault node) => visitSwitchMember(node);
+
+  R visitSwitchMember(SwitchMember node) => visitNode(node);
+
+  @override
+  R visitSwitchStatement(SwitchStatement node) => visitStatement(node);
+
+  @override
+  R visitSymbolLiteral(SymbolLiteral node) => visitLiteral(node);
+
+  @override
+  R visitThisExpression(ThisExpression node) => visitExpression(node);
+
+  @override
+  R visitThrowExpression(ThrowExpression node) => visitExpression(node);
+
+  @override
+  R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) =>
+      visitCompilationUnitMember(node);
+
+  @override
+  R visitTryStatement(TryStatement node) => visitStatement(node);
+
+  R visitTypeAlias(TypeAlias node) => visitNamedCompilationUnitMember(node);
+
+  @override
+  R visitTypeArgumentList(TypeArgumentList node) => visitNode(node);
+
+  R visitTypedLiteral(TypedLiteral node) => visitLiteral(node);
+
+  @override
+  R visitTypeName(TypeName node) => visitNode(node);
+
+  @override
+  R visitTypeParameter(TypeParameter node) => visitNode(node);
+
+  @override
+  R visitTypeParameterList(TypeParameterList node) => visitNode(node);
+
+  R visitUriBasedDirective(UriBasedDirective node) => visitDirective(node);
+
+  @override
+  R visitVariableDeclaration(VariableDeclaration node) =>
+      visitDeclaration(node);
+
+  @override
+  R visitVariableDeclarationList(VariableDeclarationList node) =>
+      visitNode(node);
+
+  @override
+  R visitVariableDeclarationStatement(VariableDeclarationStatement node) =>
+      visitStatement(node);
+
+  @override
+  R visitWhileStatement(WhileStatement node) => visitStatement(node);
+
+  @override
+  R visitWithClause(WithClause node) => visitNode(node);
+
+  @override
+  R visitYieldStatement(YieldStatement node) => visitStatement(node);
+}
+
+class GeneralizingAstVisitor_BreadthFirstVisitor
+    extends GeneralizingAstVisitor<Object> {
+  final BreadthFirstVisitor BreadthFirstVisitor_this;
+
+  GeneralizingAstVisitor_BreadthFirstVisitor(this.BreadthFirstVisitor_this)
+      : super();
+
+  @override
+  Object visitNode(AstNode node) {
+    BreadthFirstVisitor_this._queue.add(node);
+    return null;
+  }
+}
+
+/**
+ * A combinator that restricts the names being imported to those that are not in
+ * a given list.
+ *
+ * > hideCombinator ::=
+ * >     'hide' [SimpleIdentifier] (',' [SimpleIdentifier])*
+ */
+class HideCombinator extends Combinator {
+  /**
+   * The list of names from the library that are hidden by this combinator.
+   */
+  NodeList<SimpleIdentifier> _hiddenNames;
+
+  /**
+   * Initialize a newly created import show combinator.
+   */
+  HideCombinator(Token keyword, List<SimpleIdentifier> hiddenNames)
+      : super(keyword) {
+    _hiddenNames = new NodeList<SimpleIdentifier>(this, hiddenNames);
+  }
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(keyword)
+    ..addAll(_hiddenNames);
+
+  @override
+  Token get endToken => _hiddenNames.endToken;
+
+  /**
+   * Return the list of names from the library that are hidden by this
+   * combinator.
+   */
+  NodeList<SimpleIdentifier> get hiddenNames => _hiddenNames;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitHideCombinator(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _hiddenNames.accept(visitor);
+  }
+}
+
+/**
+ * A node that represents an identifier.
+ *
+ * > identifier ::=
+ * >     [SimpleIdentifier]
+ * >   | [PrefixedIdentifier]
+ */
+abstract class Identifier extends Expression {
+  /**
+   * Return the best element available for this operator. If resolution was able
+   * to find a better element based on type propagation, that element will be
+   * returned. Otherwise, the element found using the result of static analysis
+   * will be returned. If resolution has not been performed, then `null` will be
+   * returned.
+   */
+  Element get bestElement;
+
+  @override
+  bool get isAssignable => true;
+
+  /**
+   * Return the lexical representation of the identifier.
+   */
+  String get name;
+
+  /**
+   * Return the element associated with this identifier based on propagated type
+   * information, or `null` if the AST structure has not been resolved or if
+   * this identifier could not be resolved. One example of the latter case is an
+   * identifier that is not defined within the scope in which it appears.
+   */
+  Element get propagatedElement;
+
+  /**
+   * Return the element associated with this identifier based on static type
+   * information, or `null` if the AST structure has not been resolved or if
+   * this identifier could not be resolved. One example of the latter case is an
+   * identifier that is not defined within the scope in which it appears
+   */
+  Element get staticElement;
+
+  /**
+   * Return `true` if the given [name] is visible only within the library in
+   * which it is declared.
+   */
+  static bool isPrivateName(String name) =>
+      StringUtilities.startsWithChar(name, 0x5F);
+}
+
+/**
+ * An if statement.
+ *
+ * > ifStatement ::=
+ * >     'if' '(' [Expression] ')' [Statement] ('else' [Statement])?
+ */
+class IfStatement extends Statement {
+  /**
+   * The token representing the 'if' keyword.
+   */
+  Token ifKeyword;
+
+  /**
+   * The left parenthesis.
+   */
+  Token leftParenthesis;
+
+  /**
+   * The condition used to determine which of the statements is executed next.
+   */
+  Expression _condition;
+
+  /**
+   * The right parenthesis.
+   */
+  Token rightParenthesis;
+
+  /**
+   * The statement that is executed if the condition evaluates to `true`.
+   */
+  Statement _thenStatement;
+
+  /**
+   * The token representing the 'else' keyword, or `null` if there is no else
+   * statement.
+   */
+  Token elseKeyword;
+
+  /**
+   * The statement that is executed if the condition evaluates to `false`, or
+   * `null` if there is no else statement.
+   */
+  Statement _elseStatement;
+
+  /**
+   * Initialize a newly created if statement. The [elseKeyword] and
+   * [elseStatement] can be `null` if there is no else clause.
+   */
+  IfStatement(this.ifKeyword, this.leftParenthesis, Expression condition,
+      this.rightParenthesis, Statement thenStatement, this.elseKeyword,
+      Statement elseStatement) {
+    _condition = _becomeParentOf(condition);
+    _thenStatement = _becomeParentOf(thenStatement);
+    _elseStatement = _becomeParentOf(elseStatement);
+  }
+
+  @override
+  Token get beginToken => ifKeyword;
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(ifKeyword)
+    ..add(leftParenthesis)
+    ..add(_condition)
+    ..add(rightParenthesis)
+    ..add(_thenStatement)
+    ..add(elseKeyword)
+    ..add(_elseStatement);
+
+  /**
+   * Return the condition used to determine which of the statements is executed
+   * next.
+   */
+  Expression get condition => _condition;
+
+  /**
+   * Set the condition used to determine which of the statements is executed
+   * next to the given [expression].
+   */
+  void set condition(Expression expression) {
+    _condition = _becomeParentOf(expression);
+  }
+
+  /**
+   * Return the statement that is executed if the condition evaluates to
+   * `false`, or `null` if there is no else statement.
+   */
+  Statement get elseStatement => _elseStatement;
+
+  /**
+   * Set the statement that is executed if the condition evaluates to `false`
+   * to the given [statement].
+   */
+  void set elseStatement(Statement statement) {
+    _elseStatement = _becomeParentOf(statement);
+  }
+
+  @override
+  Token get endToken {
+    if (_elseStatement != null) {
+      return _elseStatement.endToken;
+    }
+    return _thenStatement.endToken;
+  }
+
+  /**
+   * Return the statement that is executed if the condition evaluates to `true`.
+   */
+  Statement get thenStatement => _thenStatement;
+
+  /**
+   * Set the statement that is executed if the condition evaluates to `true` to
+   * the given [statement].
+   */
+  void set thenStatement(Statement statement) {
+    _thenStatement = _becomeParentOf(statement);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitIfStatement(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_condition, visitor);
+    _safelyVisitChild(_thenStatement, visitor);
+    _safelyVisitChild(_elseStatement, visitor);
+  }
+}
+
+/**
+ * The "implements" clause in an class declaration.
+ *
+ * > implementsClause ::=
+ * >     'implements' [TypeName] (',' [TypeName])*
+ */
+class ImplementsClause extends AstNode {
+  /**
+   * The token representing the 'implements' keyword.
+   */
+  Token implementsKeyword;
+
+  /**
+   * The interfaces that are being implemented.
+   */
+  NodeList<TypeName> _interfaces;
+
+  /**
+   * Initialize a newly created implements clause.
+   */
+  ImplementsClause(this.implementsKeyword, List<TypeName> interfaces) {
+    _interfaces = new NodeList<TypeName>(this, interfaces);
+  }
+
+  @override
+  Token get beginToken => implementsKeyword;
+
+  /**
+   * TODO(paulberry): add commas.
+   */
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(implementsKeyword)
+    ..addAll(interfaces);
+
+  @override
+  Token get endToken => _interfaces.endToken;
+
+  /**
+   * Return the list of the interfaces that are being implemented.
+   */
+  NodeList<TypeName> get interfaces => _interfaces;
+
+  /**
+   * Return the token representing the 'implements' keyword.
+   */
+  @deprecated // Use "this.implementsKeyword"
+  Token get keyword => implementsKeyword;
+
+  /**
+   * Set the token representing the 'implements' keyword to the given [token].
+   */
+  @deprecated // Use "this.implementsKeyword"
+  set keyword(Token token) {
+    implementsKeyword = token;
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitImplementsClause(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _interfaces.accept(visitor);
+  }
+}
+
+/**
+ * An import directive.
+ *
+ * > importDirective ::=
+ * >     [Annotation] 'import' [StringLiteral] ('as' identifier)? [Combinator]* ';'
+ * >   | [Annotation] 'import' [StringLiteral] 'deferred' 'as' identifier [Combinator]* ';'
+ */
+class ImportDirective extends NamespaceDirective {
+  static Comparator<ImportDirective> COMPARATOR = (ImportDirective import1,
+      ImportDirective import2) {
+    //
+    // uri
+    //
+    StringLiteral uri1 = import1.uri;
+    StringLiteral uri2 = import2.uri;
+    String uriStr1 = uri1.stringValue;
+    String uriStr2 = uri2.stringValue;
+    if (uriStr1 != null || uriStr2 != null) {
+      if (uriStr1 == null) {
+        return -1;
+      } else if (uriStr2 == null) {
+        return 1;
+      } else {
+        int compare = uriStr1.compareTo(uriStr2);
+        if (compare != 0) {
+          return compare;
+        }
+      }
+    }
+    //
+    // as
+    //
+    SimpleIdentifier prefix1 = import1.prefix;
+    SimpleIdentifier prefix2 = import2.prefix;
+    String prefixStr1 = prefix1 != null ? prefix1.name : null;
+    String prefixStr2 = prefix2 != null ? prefix2.name : null;
+    if (prefixStr1 != null || prefixStr2 != null) {
+      if (prefixStr1 == null) {
+        return -1;
+      } else if (prefixStr2 == null) {
+        return 1;
+      } else {
+        int compare = prefixStr1.compareTo(prefixStr2);
+        if (compare != 0) {
+          return compare;
+        }
+      }
+    }
+    //
+    // hides and shows
+    //
+    NodeList<Combinator> combinators1 = import1.combinators;
+    List<String> allHides1 = new List<String>();
+    List<String> allShows1 = new List<String>();
+    for (Combinator combinator in combinators1) {
+      if (combinator is HideCombinator) {
+        NodeList<SimpleIdentifier> hides = combinator.hiddenNames;
+        for (SimpleIdentifier simpleIdentifier in hides) {
+          allHides1.add(simpleIdentifier.name);
+        }
+      } else {
+        NodeList<SimpleIdentifier> shows =
+            (combinator as ShowCombinator).shownNames;
+        for (SimpleIdentifier simpleIdentifier in shows) {
+          allShows1.add(simpleIdentifier.name);
+        }
+      }
+    }
+    NodeList<Combinator> combinators2 = import2.combinators;
+    List<String> allHides2 = new List<String>();
+    List<String> allShows2 = new List<String>();
+    for (Combinator combinator in combinators2) {
+      if (combinator is HideCombinator) {
+        NodeList<SimpleIdentifier> hides = combinator.hiddenNames;
+        for (SimpleIdentifier simpleIdentifier in hides) {
+          allHides2.add(simpleIdentifier.name);
+        }
+      } else {
+        NodeList<SimpleIdentifier> shows =
+            (combinator as ShowCombinator).shownNames;
+        for (SimpleIdentifier simpleIdentifier in shows) {
+          allShows2.add(simpleIdentifier.name);
+        }
+      }
+    }
+    // test lengths of combinator lists first
+    if (allHides1.length != allHides2.length) {
+      return allHides1.length - allHides2.length;
+    }
+    if (allShows1.length != allShows2.length) {
+      return allShows1.length - allShows2.length;
+    }
+    // next ensure that the lists are equivalent
+    if (!javaCollectionContainsAll(allHides1, allHides2)) {
+      return -1;
+    }
+    if (!javaCollectionContainsAll(allShows1, allShows2)) {
+      return -1;
+    }
+    return 0;
+  };
+
+  /**
+   * The token representing the 'deferred' keyword, or `null` if the imported is
+   * not deferred.
+   */
+  Token deferredKeyword;
+
+  /**
+   * The token representing the 'as' keyword, or `null` if the imported names are
+   * not prefixed.
+   */
+  Token asKeyword;
+
+  /**
+   * The prefix to be used with the imported names, or `null` if the imported
+   * names are not prefixed.
+   */
+  SimpleIdentifier _prefix;
+
+  /**
+   * Initialize a newly created import directive. Either or both of the
+   * [comment] and [metadata] can be `null` if the function does not have the
+   * corresponding attribute. The [deferredKeyword] can be `null` if the import
+   * is not deferred. The [asKeyword] and [prefix] can be `null` if the import
+   * does not specify a prefix. The list of [combinators] can be `null` if there
+   * are no combinators.
+   */
+  ImportDirective(Comment comment, List<Annotation> metadata, Token keyword,
+      StringLiteral libraryUri, this.deferredKeyword, this.asKeyword,
+      SimpleIdentifier prefix, List<Combinator> combinators, Token semicolon)
+      : super(comment, metadata, keyword, libraryUri, combinators, semicolon) {
+    _prefix = _becomeParentOf(prefix);
+  }
+
+  /**
+   * The token representing the 'as' token, or `null` if the imported names are
+   * not prefixed.
+   */
+  @deprecated // Use "this.asKeyword"
+  Token get asToken => asKeyword;
+
+  /**
+   * The token representing the 'as' token to the given token.
+   */
+  @deprecated // Use "this.asKeyword"
+  set asToken(Token token) {
+    asKeyword = token;
+  }
+
+  @override
+  Iterable get childEntities => super._childEntities
+    ..add(_uri)
+    ..add(deferredKeyword)
+    ..add(asKeyword)
+    ..add(_prefix)
+    ..addAll(combinators)
+    ..add(semicolon);
+
+  /**
+   * Return the token representing the 'deferred' token, or `null` if the
+   * imported is not deferred.
+   */
+  @deprecated // Use "this.deferredKeyword"
+  Token get deferredToken => deferredKeyword;
+
+  /**
+   * Set the token representing the 'deferred' token to the given token.
+   */
+  @deprecated // Use "this.deferredKeyword"
+  set deferredToken(Token token) {
+    deferredKeyword = token;
+  }
+
+  @override
+  ImportElement get element => super.element as ImportElement;
+
+  /**
+   * Return the prefix to be used with the imported names, or `null` if the
+   * imported names are not prefixed.
+   */
+  SimpleIdentifier get prefix => _prefix;
+
+  /**
+   * Set the prefix to be used with the imported names to the given [identifier].
+   */
+  void set prefix(SimpleIdentifier identifier) {
+    _prefix = _becomeParentOf(identifier);
+  }
+
+  @override
+  LibraryElement get uriElement {
+    ImportElement element = this.element;
+    if (element == null) {
+      return null;
+    }
+    return element.importedLibrary;
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitImportDirective(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_prefix, visitor);
+    combinators.accept(visitor);
+  }
+}
+
+/**
+ * An object that will clone any AST structure that it visits. The cloner will
+ * clone the structure, replacing the specified ASTNode with a new ASTNode,
+ * mapping the old token stream to a new token stream, and preserving resolution
+ * results.
+ */
+class IncrementalAstCloner implements AstVisitor<AstNode> {
+  /**
+   * The node to be replaced during the cloning process.
+   */
+  final AstNode _oldNode;
+
+  /**
+   * The replacement node used during the cloning process.
+   */
+  final AstNode _newNode;
+
+  /**
+   * A mapping of old tokens to new tokens used during the cloning process.
+   */
+  final TokenMap _tokenMap;
+
+  /**
+   * Construct a new instance that will replace the [oldNode] with the [newNode]
+   * in the process of cloning an existing AST structure. The [tokenMap] is a
+   * mapping of old tokens to new tokens.
+   */
+  IncrementalAstCloner(this._oldNode, this._newNode, this._tokenMap);
+
+  @override
+  AdjacentStrings visitAdjacentStrings(AdjacentStrings node) =>
+      new AdjacentStrings(_cloneNodeList(node.strings));
+
+  @override
+  Annotation visitAnnotation(Annotation node) {
+    Annotation copy = new Annotation(_mapToken(node.atSign),
+        _cloneNode(node.name), _mapToken(node.period),
+        _cloneNode(node.constructorName), _cloneNode(node.arguments));
+    copy.element = node.element;
+    return copy;
+  }
+
+  @override
+  ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList(
+      _mapToken(node.leftParenthesis), _cloneNodeList(node.arguments),
+      _mapToken(node.rightParenthesis));
+
+  @override
+  AsExpression visitAsExpression(AsExpression node) {
+    AsExpression copy = new AsExpression(_cloneNode(node.expression),
+        _mapToken(node.asOperator), _cloneNode(node.type));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  AstNode visitAssertStatement(AssertStatement node) => new AssertStatement(
+      _mapToken(node.assertKeyword), _mapToken(node.leftParenthesis),
+      _cloneNode(node.condition), _mapToken(node.rightParenthesis),
+      _mapToken(node.semicolon));
+
+  @override
+  AssignmentExpression visitAssignmentExpression(AssignmentExpression node) {
+    AssignmentExpression copy = new AssignmentExpression(
+        _cloneNode(node.leftHandSide), _mapToken(node.operator),
+        _cloneNode(node.rightHandSide));
+    copy.propagatedElement = node.propagatedElement;
+    copy.propagatedType = node.propagatedType;
+    copy.staticElement = node.staticElement;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  AwaitExpression visitAwaitExpression(AwaitExpression node) =>
+      new AwaitExpression(
+          _mapToken(node.awaitKeyword), _cloneNode(node.expression));
+
+  @override
+  BinaryExpression visitBinaryExpression(BinaryExpression node) {
+    BinaryExpression copy = new BinaryExpression(_cloneNode(node.leftOperand),
+        _mapToken(node.operator), _cloneNode(node.rightOperand));
+    copy.propagatedElement = node.propagatedElement;
+    copy.propagatedType = node.propagatedType;
+    copy.staticElement = node.staticElement;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  Block visitBlock(Block node) => new Block(_mapToken(node.leftBracket),
+      _cloneNodeList(node.statements), _mapToken(node.rightBracket));
+
+  @override
+  BlockFunctionBody visitBlockFunctionBody(
+      BlockFunctionBody node) => new BlockFunctionBody(
+      _mapToken(node.keyword), _mapToken(node.star), _cloneNode(node.block));
+
+  @override
+  BooleanLiteral visitBooleanLiteral(BooleanLiteral node) {
+    BooleanLiteral copy =
+        new BooleanLiteral(_mapToken(node.literal), node.value);
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  BreakStatement visitBreakStatement(BreakStatement node) => new BreakStatement(
+      _mapToken(node.breakKeyword), _cloneNode(node.label),
+      _mapToken(node.semicolon));
+
+  @override
+  CascadeExpression visitCascadeExpression(CascadeExpression node) {
+    CascadeExpression copy = new CascadeExpression(
+        _cloneNode(node.target), _cloneNodeList(node.cascadeSections));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  CatchClause visitCatchClause(CatchClause node) => new CatchClause(
+      _mapToken(node.onKeyword), _cloneNode(node.exceptionType),
+      _mapToken(node.catchKeyword), _mapToken(node.leftParenthesis),
+      _cloneNode(node.exceptionParameter), _mapToken(node.comma),
+      _cloneNode(node.stackTraceParameter), _mapToken(node.rightParenthesis),
+      _cloneNode(node.body));
+
+  @override
+  ClassDeclaration visitClassDeclaration(ClassDeclaration node) {
+    ClassDeclaration copy = new ClassDeclaration(
+        _cloneNode(node.documentationComment), _cloneNodeList(node.metadata),
+        _mapToken(node.abstractKeyword), _mapToken(node.classKeyword),
+        _cloneNode(node.name), _cloneNode(node.typeParameters),
+        _cloneNode(node.extendsClause), _cloneNode(node.withClause),
+        _cloneNode(node.implementsClause), _mapToken(node.leftBracket),
+        _cloneNodeList(node.members), _mapToken(node.rightBracket));
+    copy.nativeClause = _cloneNode(node.nativeClause);
+    return copy;
+  }
+
+  @override
+  ClassTypeAlias visitClassTypeAlias(ClassTypeAlias node) => new ClassTypeAlias(
+      _cloneNode(node.documentationComment), _cloneNodeList(node.metadata),
+      _mapToken(node.typedefKeyword), _cloneNode(node.name),
+      _cloneNode(node.typeParameters), _mapToken(node.equals),
+      _mapToken(node.abstractKeyword), _cloneNode(node.superclass),
+      _cloneNode(node.withClause), _cloneNode(node.implementsClause),
+      _mapToken(node.semicolon));
+
+  @override
+  Comment visitComment(Comment node) {
+    if (node.isDocumentation) {
+      return Comment.createDocumentationCommentWithReferences(
+          _mapTokens(node.tokens), _cloneNodeList(node.references));
+    } else if (node.isBlock) {
+      return Comment.createBlockComment(_mapTokens(node.tokens));
+    }
+    return Comment.createEndOfLineComment(_mapTokens(node.tokens));
+  }
+
+  @override
+  CommentReference visitCommentReference(CommentReference node) =>
+      new CommentReference(
+          _mapToken(node.newKeyword), _cloneNode(node.identifier));
+
+  @override
+  CompilationUnit visitCompilationUnit(CompilationUnit node) {
+    CompilationUnit copy = new CompilationUnit(_mapToken(node.beginToken),
+        _cloneNode(node.scriptTag), _cloneNodeList(node.directives),
+        _cloneNodeList(node.declarations), _mapToken(node.endToken));
+    copy.lineInfo = node.lineInfo;
+    copy.element = node.element;
+    return copy;
+  }
+
+  @override
+  ConditionalExpression visitConditionalExpression(ConditionalExpression node) {
+    ConditionalExpression copy = new ConditionalExpression(
+        _cloneNode(node.condition), _mapToken(node.question),
+        _cloneNode(node.thenExpression), _mapToken(node.colon),
+        _cloneNode(node.elseExpression));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  ConstructorDeclaration visitConstructorDeclaration(
+      ConstructorDeclaration node) {
+    ConstructorDeclaration copy = new ConstructorDeclaration(
+        _cloneNode(node.documentationComment), _cloneNodeList(node.metadata),
+        _mapToken(node.externalKeyword), _mapToken(node.constKeyword),
+        _mapToken(node.factoryKeyword), _cloneNode(node.returnType),
+        _mapToken(node.period), _cloneNode(node.name),
+        _cloneNode(node.parameters), _mapToken(node.separator),
+        _cloneNodeList(node.initializers),
+        _cloneNode(node.redirectedConstructor), _cloneNode(node.body));
+    copy.element = node.element;
+    return copy;
+  }
+
+  @override
+  ConstructorFieldInitializer visitConstructorFieldInitializer(
+      ConstructorFieldInitializer node) => new ConstructorFieldInitializer(
+      _mapToken(node.thisKeyword), _mapToken(node.period),
+      _cloneNode(node.fieldName), _mapToken(node.equals),
+      _cloneNode(node.expression));
+
+  @override
+  ConstructorName visitConstructorName(ConstructorName node) {
+    ConstructorName copy = new ConstructorName(
+        _cloneNode(node.type), _mapToken(node.period), _cloneNode(node.name));
+    copy.staticElement = node.staticElement;
+    return copy;
+  }
+
+  @override
+  ContinueStatement visitContinueStatement(ContinueStatement node) =>
+      new ContinueStatement(_mapToken(node.continueKeyword),
+          _cloneNode(node.label), _mapToken(node.semicolon));
+
+  @override
+  DeclaredIdentifier visitDeclaredIdentifier(DeclaredIdentifier node) =>
+      new DeclaredIdentifier(_cloneNode(node.documentationComment),
+          _cloneNodeList(node.metadata), _mapToken(node.keyword),
+          _cloneNode(node.type), _cloneNode(node.identifier));
+
+  @override
+  DefaultFormalParameter visitDefaultFormalParameter(
+      DefaultFormalParameter node) => new DefaultFormalParameter(
+      _cloneNode(node.parameter), node.kind, _mapToken(node.separator),
+      _cloneNode(node.defaultValue));
+
+  @override
+  DoStatement visitDoStatement(DoStatement node) => new DoStatement(
+      _mapToken(node.doKeyword), _cloneNode(node.body),
+      _mapToken(node.whileKeyword), _mapToken(node.leftParenthesis),
+      _cloneNode(node.condition), _mapToken(node.rightParenthesis),
+      _mapToken(node.semicolon));
+
+  @override
+  DoubleLiteral visitDoubleLiteral(DoubleLiteral node) {
+    DoubleLiteral copy = new DoubleLiteral(_mapToken(node.literal), node.value);
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  EmptyFunctionBody visitEmptyFunctionBody(EmptyFunctionBody node) =>
+      new EmptyFunctionBody(_mapToken(node.semicolon));
+
+  @override
+  EmptyStatement visitEmptyStatement(EmptyStatement node) =>
+      new EmptyStatement(_mapToken(node.semicolon));
+
+  @override
+  AstNode visitEnumConstantDeclaration(EnumConstantDeclaration node) =>
+      new EnumConstantDeclaration(_cloneNode(node.documentationComment),
+          _cloneNodeList(node.metadata), _cloneNode(node.name));
+
+  @override
+  AstNode visitEnumDeclaration(EnumDeclaration node) => new EnumDeclaration(
+      _cloneNode(node.documentationComment), _cloneNodeList(node.metadata),
+      _mapToken(node.enumKeyword), _cloneNode(node.name),
+      _mapToken(node.leftBracket), _cloneNodeList(node.constants),
+      _mapToken(node.rightBracket));
+
+  @override
+  ExportDirective visitExportDirective(ExportDirective node) {
+    ExportDirective copy = new ExportDirective(
+        _cloneNode(node.documentationComment), _cloneNodeList(node.metadata),
+        _mapToken(node.keyword), _cloneNode(node.uri),
+        _cloneNodeList(node.combinators), _mapToken(node.semicolon));
+    copy.element = node.element;
+    return copy;
+  }
+
+  @override
+  ExpressionFunctionBody visitExpressionFunctionBody(
+      ExpressionFunctionBody node) => new ExpressionFunctionBody(
+      _mapToken(node.keyword), _mapToken(node.functionDefinition),
+      _cloneNode(node.expression), _mapToken(node.semicolon));
+
+  @override
+  ExpressionStatement visitExpressionStatement(ExpressionStatement node) =>
+      new ExpressionStatement(
+          _cloneNode(node.expression), _mapToken(node.semicolon));
+
+  @override
+  ExtendsClause visitExtendsClause(ExtendsClause node) => new ExtendsClause(
+      _mapToken(node.extendsKeyword), _cloneNode(node.superclass));
+
+  @override
+  FieldDeclaration visitFieldDeclaration(FieldDeclaration node) =>
+      new FieldDeclaration(_cloneNode(node.documentationComment),
+          _cloneNodeList(node.metadata), _mapToken(node.staticKeyword),
+          _cloneNode(node.fields), _mapToken(node.semicolon));
+
+  @override
+  FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) =>
+      new FieldFormalParameter(_cloneNode(node.documentationComment),
+          _cloneNodeList(node.metadata), _mapToken(node.keyword),
+          _cloneNode(node.type), _mapToken(node.thisKeyword),
+          _mapToken(node.period), _cloneNode(node.identifier),
+          _cloneNode(node.typeParameters), _cloneNode(node.parameters));
+
+  @override
+  ForEachStatement visitForEachStatement(ForEachStatement node) {
+    DeclaredIdentifier loopVariable = node.loopVariable;
+    if (loopVariable == null) {
+      return new ForEachStatement.withReference(_mapToken(node.awaitKeyword),
+          _mapToken(node.forKeyword), _mapToken(node.leftParenthesis),
+          _cloneNode(node.identifier), _mapToken(node.inKeyword),
+          _cloneNode(node.iterable), _mapToken(node.rightParenthesis),
+          _cloneNode(node.body));
+    }
+    return new ForEachStatement.withDeclaration(_mapToken(node.awaitKeyword),
+        _mapToken(node.forKeyword), _mapToken(node.leftParenthesis),
+        _cloneNode(loopVariable), _mapToken(node.inKeyword),
+        _cloneNode(node.iterable), _mapToken(node.rightParenthesis),
+        _cloneNode(node.body));
+  }
+
+  @override
+  FormalParameterList visitFormalParameterList(FormalParameterList node) =>
+      new FormalParameterList(_mapToken(node.leftParenthesis),
+          _cloneNodeList(node.parameters), _mapToken(node.leftDelimiter),
+          _mapToken(node.rightDelimiter), _mapToken(node.rightParenthesis));
+
+  @override
+  ForStatement visitForStatement(ForStatement node) => new ForStatement(
+      _mapToken(node.forKeyword), _mapToken(node.leftParenthesis),
+      _cloneNode(node.variables), _cloneNode(node.initialization),
+      _mapToken(node.leftSeparator), _cloneNode(node.condition),
+      _mapToken(node.rightSeparator), _cloneNodeList(node.updaters),
+      _mapToken(node.rightParenthesis), _cloneNode(node.body));
+
+  @override
+  FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node) =>
+      new FunctionDeclaration(_cloneNode(node.documentationComment),
+          _cloneNodeList(node.metadata), _mapToken(node.externalKeyword),
+          _cloneNode(node.returnType), _mapToken(node.propertyKeyword),
+          _cloneNode(node.name), _cloneNode(node.functionExpression));
+
+  @override
+  FunctionDeclarationStatement visitFunctionDeclarationStatement(
+          FunctionDeclarationStatement node) =>
+      new FunctionDeclarationStatement(_cloneNode(node.functionDeclaration));
+
+  @override
+  FunctionExpression visitFunctionExpression(FunctionExpression node) {
+    FunctionExpression copy = new FunctionExpression(
+        _cloneNode(node.typeParameters), _cloneNode(node.parameters),
+        _cloneNode(node.body));
+    copy.element = node.element;
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  FunctionExpressionInvocation visitFunctionExpressionInvocation(
+      FunctionExpressionInvocation node) {
+    FunctionExpressionInvocation copy = new FunctionExpressionInvocation(
+        _cloneNode(node.function), _cloneNode(node.typeArguments),
+        _cloneNode(node.argumentList));
+    copy.propagatedElement = node.propagatedElement;
+    copy.propagatedType = node.propagatedType;
+    copy.staticElement = node.staticElement;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  FunctionTypeAlias visitFunctionTypeAlias(FunctionTypeAlias node) =>
+      new FunctionTypeAlias(_cloneNode(node.documentationComment),
+          _cloneNodeList(node.metadata), _mapToken(node.typedefKeyword),
+          _cloneNode(node.returnType), _cloneNode(node.name),
+          _cloneNode(node.typeParameters), _cloneNode(node.parameters),
+          _mapToken(node.semicolon));
+
+  @override
+  FunctionTypedFormalParameter visitFunctionTypedFormalParameter(
+      FunctionTypedFormalParameter node) => new FunctionTypedFormalParameter(
+      _cloneNode(node.documentationComment), _cloneNodeList(node.metadata),
+      _cloneNode(node.returnType), _cloneNode(node.identifier),
+      _cloneNode(node.typeParameters), _cloneNode(node.parameters));
+
+  @override
+  HideCombinator visitHideCombinator(HideCombinator node) => new HideCombinator(
+      _mapToken(node.keyword), _cloneNodeList(node.hiddenNames));
+
+  @override
+  IfStatement visitIfStatement(IfStatement node) => new IfStatement(
+      _mapToken(node.ifKeyword), _mapToken(node.leftParenthesis),
+      _cloneNode(node.condition), _mapToken(node.rightParenthesis),
+      _cloneNode(node.thenStatement), _mapToken(node.elseKeyword),
+      _cloneNode(node.elseStatement));
+
+  @override
+  ImplementsClause visitImplementsClause(ImplementsClause node) =>
+      new ImplementsClause(
+          _mapToken(node.implementsKeyword), _cloneNodeList(node.interfaces));
+
+  @override
+  ImportDirective visitImportDirective(ImportDirective node) =>
+      new ImportDirective(_cloneNode(node.documentationComment),
+          _cloneNodeList(node.metadata), _mapToken(node.keyword),
+          _cloneNode(node.uri), _mapToken(node.deferredKeyword),
+          _mapToken(node.asKeyword), _cloneNode(node.prefix),
+          _cloneNodeList(node.combinators), _mapToken(node.semicolon));
+
+  @override
+  IndexExpression visitIndexExpression(IndexExpression node) {
+    Token period = _mapToken(node.period);
+    IndexExpression copy;
+    if (period == null) {
+      copy = new IndexExpression.forTarget(_cloneNode(node.target),
+          _mapToken(node.leftBracket), _cloneNode(node.index),
+          _mapToken(node.rightBracket));
+    } else {
+      copy = new IndexExpression.forCascade(period, _mapToken(node.leftBracket),
+          _cloneNode(node.index), _mapToken(node.rightBracket));
+    }
+    copy.auxiliaryElements = node.auxiliaryElements;
+    copy.propagatedElement = node.propagatedElement;
+    copy.propagatedType = node.propagatedType;
+    copy.staticElement = node.staticElement;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  InstanceCreationExpression visitInstanceCreationExpression(
+      InstanceCreationExpression node) {
+    InstanceCreationExpression copy = new InstanceCreationExpression(
+        _mapToken(node.keyword), _cloneNode(node.constructorName),
+        _cloneNode(node.argumentList));
+    copy.propagatedType = node.propagatedType;
+    copy.staticElement = node.staticElement;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  IntegerLiteral visitIntegerLiteral(IntegerLiteral node) {
+    IntegerLiteral copy =
+        new IntegerLiteral(_mapToken(node.literal), node.value);
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  InterpolationExpression visitInterpolationExpression(
+      InterpolationExpression node) => new InterpolationExpression(
+      _mapToken(node.leftBracket), _cloneNode(node.expression),
+      _mapToken(node.rightBracket));
+
+  @override
+  InterpolationString visitInterpolationString(InterpolationString node) =>
+      new InterpolationString(_mapToken(node.contents), node.value);
+
+  @override
+  IsExpression visitIsExpression(IsExpression node) {
+    IsExpression copy = new IsExpression(_cloneNode(node.expression),
+        _mapToken(node.isOperator), _mapToken(node.notOperator),
+        _cloneNode(node.type));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  Label visitLabel(Label node) =>
+      new Label(_cloneNode(node.label), _mapToken(node.colon));
+
+  @override
+  LabeledStatement visitLabeledStatement(LabeledStatement node) =>
+      new LabeledStatement(
+          _cloneNodeList(node.labels), _cloneNode(node.statement));
+
+  @override
+  LibraryDirective visitLibraryDirective(LibraryDirective node) =>
+      new LibraryDirective(_cloneNode(node.documentationComment),
+          _cloneNodeList(node.metadata), _mapToken(node.libraryKeyword),
+          _cloneNode(node.name), _mapToken(node.semicolon));
+
+  @override
+  LibraryIdentifier visitLibraryIdentifier(LibraryIdentifier node) {
+    LibraryIdentifier copy =
+        new LibraryIdentifier(_cloneNodeList(node.components));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  ListLiteral visitListLiteral(ListLiteral node) {
+    ListLiteral copy = new ListLiteral(_mapToken(node.constKeyword),
+        _cloneNode(node.typeArguments), _mapToken(node.leftBracket),
+        _cloneNodeList(node.elements), _mapToken(node.rightBracket));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  MapLiteral visitMapLiteral(MapLiteral node) {
+    MapLiteral copy = new MapLiteral(_mapToken(node.constKeyword),
+        _cloneNode(node.typeArguments), _mapToken(node.leftBracket),
+        _cloneNodeList(node.entries), _mapToken(node.rightBracket));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  MapLiteralEntry visitMapLiteralEntry(
+      MapLiteralEntry node) => new MapLiteralEntry(
+      _cloneNode(node.key), _mapToken(node.separator), _cloneNode(node.value));
+
+  @override
+  MethodDeclaration visitMethodDeclaration(MethodDeclaration node) =>
+      new MethodDeclaration(_cloneNode(node.documentationComment),
+          _cloneNodeList(node.metadata), _mapToken(node.externalKeyword),
+          _mapToken(node.modifierKeyword), _cloneNode(node.returnType),
+          _mapToken(node.propertyKeyword), _mapToken(node.operatorKeyword),
+          _cloneNode(node.name), _cloneNode(node._typeParameters),
+          _cloneNode(node.parameters), _cloneNode(node.body));
+
+  @override
+  MethodInvocation visitMethodInvocation(MethodInvocation node) {
+    MethodInvocation copy = new MethodInvocation(_cloneNode(node.target),
+        _mapToken(node.operator), _cloneNode(node.methodName),
+        _cloneNode(node.typeArguments), _cloneNode(node.argumentList));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  NamedExpression visitNamedExpression(NamedExpression node) {
+    NamedExpression copy =
+        new NamedExpression(_cloneNode(node.name), _cloneNode(node.expression));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  AstNode visitNativeClause(NativeClause node) =>
+      new NativeClause(_mapToken(node.nativeKeyword), _cloneNode(node.name));
+
+  @override
+  NativeFunctionBody visitNativeFunctionBody(NativeFunctionBody node) =>
+      new NativeFunctionBody(_mapToken(node.nativeKeyword),
+          _cloneNode(node.stringLiteral), _mapToken(node.semicolon));
+
+  @override
+  NullLiteral visitNullLiteral(NullLiteral node) {
+    NullLiteral copy = new NullLiteral(_mapToken(node.literal));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  ParenthesizedExpression visitParenthesizedExpression(
+      ParenthesizedExpression node) {
+    ParenthesizedExpression copy = new ParenthesizedExpression(
+        _mapToken(node.leftParenthesis), _cloneNode(node.expression),
+        _mapToken(node.rightParenthesis));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  PartDirective visitPartDirective(PartDirective node) {
+    PartDirective copy = new PartDirective(
+        _cloneNode(node.documentationComment), _cloneNodeList(node.metadata),
+        _mapToken(node.partKeyword), _cloneNode(node.uri),
+        _mapToken(node.semicolon));
+    copy.element = node.element;
+    return copy;
+  }
+
+  @override
+  PartOfDirective visitPartOfDirective(PartOfDirective node) {
+    PartOfDirective copy = new PartOfDirective(
+        _cloneNode(node.documentationComment), _cloneNodeList(node.metadata),
+        _mapToken(node.partKeyword), _mapToken(node.ofKeyword),
+        _cloneNode(node.libraryName), _mapToken(node.semicolon));
+    copy.element = node.element;
+    return copy;
+  }
+
+  @override
+  PostfixExpression visitPostfixExpression(PostfixExpression node) {
+    PostfixExpression copy = new PostfixExpression(
+        _cloneNode(node.operand), _mapToken(node.operator));
+    copy.propagatedElement = node.propagatedElement;
+    copy.propagatedType = node.propagatedType;
+    copy.staticElement = node.staticElement;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  PrefixedIdentifier visitPrefixedIdentifier(PrefixedIdentifier node) {
+    PrefixedIdentifier copy = new PrefixedIdentifier(_cloneNode(node.prefix),
+        _mapToken(node.period), _cloneNode(node.identifier));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  PrefixExpression visitPrefixExpression(PrefixExpression node) {
+    PrefixExpression copy = new PrefixExpression(
+        _mapToken(node.operator), _cloneNode(node.operand));
+    copy.propagatedElement = node.propagatedElement;
+    copy.propagatedType = node.propagatedType;
+    copy.staticElement = node.staticElement;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  PropertyAccess visitPropertyAccess(PropertyAccess node) {
+    PropertyAccess copy = new PropertyAccess(_cloneNode(node.target),
+        _mapToken(node.operator), _cloneNode(node.propertyName));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  RedirectingConstructorInvocation visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    RedirectingConstructorInvocation copy =
+        new RedirectingConstructorInvocation(_mapToken(node.thisKeyword),
+            _mapToken(node.period), _cloneNode(node.constructorName),
+            _cloneNode(node.argumentList));
+    copy.staticElement = node.staticElement;
+    return copy;
+  }
+
+  @override
+  RethrowExpression visitRethrowExpression(RethrowExpression node) {
+    RethrowExpression copy =
+        new RethrowExpression(_mapToken(node.rethrowKeyword));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  ReturnStatement visitReturnStatement(ReturnStatement node) =>
+      new ReturnStatement(_mapToken(node.returnKeyword),
+          _cloneNode(node.expression), _mapToken(node.semicolon));
+
+  @override
+  ScriptTag visitScriptTag(ScriptTag node) =>
+      new ScriptTag(_mapToken(node.scriptTag));
+
+  @override
+  ShowCombinator visitShowCombinator(ShowCombinator node) => new ShowCombinator(
+      _mapToken(node.keyword), _cloneNodeList(node.shownNames));
+
+  @override
+  SimpleFormalParameter visitSimpleFormalParameter(
+      SimpleFormalParameter node) => new SimpleFormalParameter(
+      _cloneNode(node.documentationComment), _cloneNodeList(node.metadata),
+      _mapToken(node.keyword), _cloneNode(node.type),
+      _cloneNode(node.identifier));
+
+  @override
+  SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) {
+    Token mappedToken = _mapToken(node.token);
+    if (mappedToken == null) {
+      // This only happens for SimpleIdentifiers created by the parser as part
+      // of scanning documentation comments (the tokens for those identifiers
+      // are not in the original token stream and hence do not get copied).
+      // This extra check can be removed if the scanner is changed to scan
+      // documentation comments for the parser.
+      mappedToken = node.token;
+    }
+    SimpleIdentifier copy = new SimpleIdentifier(mappedToken);
+    copy.auxiliaryElements = node.auxiliaryElements;
+    copy.propagatedElement = node.propagatedElement;
+    copy.propagatedType = node.propagatedType;
+    copy.staticElement = node.staticElement;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  SimpleStringLiteral visitSimpleStringLiteral(SimpleStringLiteral node) {
+    SimpleStringLiteral copy =
+        new SimpleStringLiteral(_mapToken(node.literal), node.value);
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  StringInterpolation visitStringInterpolation(StringInterpolation node) {
+    StringInterpolation copy =
+        new StringInterpolation(_cloneNodeList(node.elements));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  SuperConstructorInvocation visitSuperConstructorInvocation(
+      SuperConstructorInvocation node) {
+    SuperConstructorInvocation copy = new SuperConstructorInvocation(
+        _mapToken(node.superKeyword), _mapToken(node.period),
+        _cloneNode(node.constructorName), _cloneNode(node.argumentList));
+    copy.staticElement = node.staticElement;
+    return copy;
+  }
+
+  @override
+  SuperExpression visitSuperExpression(SuperExpression node) {
+    SuperExpression copy = new SuperExpression(_mapToken(node.superKeyword));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  SwitchCase visitSwitchCase(SwitchCase node) => new SwitchCase(
+      _cloneNodeList(node.labels), _mapToken(node.keyword),
+      _cloneNode(node.expression), _mapToken(node.colon),
+      _cloneNodeList(node.statements));
+
+  @override
+  SwitchDefault visitSwitchDefault(SwitchDefault node) => new SwitchDefault(
+      _cloneNodeList(node.labels), _mapToken(node.keyword),
+      _mapToken(node.colon), _cloneNodeList(node.statements));
+
+  @override
+  SwitchStatement visitSwitchStatement(SwitchStatement node) =>
+      new SwitchStatement(_mapToken(node.switchKeyword),
+          _mapToken(node.leftParenthesis), _cloneNode(node.expression),
+          _mapToken(node.rightParenthesis), _mapToken(node.leftBracket),
+          _cloneNodeList(node.members), _mapToken(node.rightBracket));
+
+  @override
+  AstNode visitSymbolLiteral(SymbolLiteral node) {
+    SymbolLiteral copy = new SymbolLiteral(
+        _mapToken(node.poundSign), _mapTokens(node.components));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  ThisExpression visitThisExpression(ThisExpression node) {
+    ThisExpression copy = new ThisExpression(_mapToken(node.thisKeyword));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  ThrowExpression visitThrowExpression(ThrowExpression node) {
+    ThrowExpression copy = new ThrowExpression(
+        _mapToken(node.throwKeyword), _cloneNode(node.expression));
+    copy.propagatedType = node.propagatedType;
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
+  TopLevelVariableDeclaration visitTopLevelVariableDeclaration(
+      TopLevelVariableDeclaration node) => new TopLevelVariableDeclaration(
+      _cloneNode(node.documentationComment), _cloneNodeList(node.metadata),
+      _cloneNode(node.variables), _mapToken(node.semicolon));
+
+  @override
+  TryStatement visitTryStatement(TryStatement node) => new TryStatement(
+      _mapToken(node.tryKeyword), _cloneNode(node.body),
+      _cloneNodeList(node.catchClauses), _mapToken(node.finallyKeyword),
+      _cloneNode(node.finallyBlock));
+
+  @override
+  TypeArgumentList visitTypeArgumentList(TypeArgumentList node) =>
+      new TypeArgumentList(_mapToken(node.leftBracket),
+          _cloneNodeList(node.arguments), _mapToken(node.rightBracket));
+
+  @override
+  TypeName visitTypeName(TypeName node) {
+    TypeName copy =
+        new TypeName(_cloneNode(node.name), _cloneNode(node.typeArguments));
+    copy.type = node.type;
+    return copy;
+  }
+
+  @override
+  TypeParameter visitTypeParameter(TypeParameter node) => new TypeParameter(
+      _cloneNode(node.documentationComment), _cloneNodeList(node.metadata),
+      _cloneNode(node.name), _mapToken(node.extendsKeyword),
+      _cloneNode(node.bound));
+
+  @override
+  TypeParameterList visitTypeParameterList(TypeParameterList node) =>
+      new TypeParameterList(_mapToken(node.leftBracket),
+          _cloneNodeList(node.typeParameters), _mapToken(node.rightBracket));
+
+  @override
+  VariableDeclaration visitVariableDeclaration(VariableDeclaration node) =>
+      new VariableDeclaration(_cloneNode(node.name), _mapToken(node.equals),
+          _cloneNode(node.initializer));
+
+  @override
+  VariableDeclarationList visitVariableDeclarationList(
+      VariableDeclarationList node) => new VariableDeclarationList(null,
+      _cloneNodeList(node.metadata), _mapToken(node.keyword),
+      _cloneNode(node.type), _cloneNodeList(node.variables));
+
+  @override
+  VariableDeclarationStatement visitVariableDeclarationStatement(
+      VariableDeclarationStatement node) => new VariableDeclarationStatement(
+      _cloneNode(node.variables), _mapToken(node.semicolon));
+
+  @override
+  WhileStatement visitWhileStatement(WhileStatement node) => new WhileStatement(
+      _mapToken(node.whileKeyword), _mapToken(node.leftParenthesis),
+      _cloneNode(node.condition), _mapToken(node.rightParenthesis),
+      _cloneNode(node.body));
+
+  @override
+  WithClause visitWithClause(WithClause node) => new WithClause(
+      _mapToken(node.withKeyword), _cloneNodeList(node.mixinTypes));
+
+  @override
+  YieldStatement visitYieldStatement(YieldStatement node) => new YieldStatement(
+      _mapToken(node.yieldKeyword), _mapToken(node.star),
+      _cloneNode(node.expression), _mapToken(node.semicolon));
+
+  AstNode _cloneNode(AstNode node) {
+    if (node == null) {
+      return null;
+    }
+    if (identical(node, _oldNode)) {
+      return _newNode;
+    }
+    return node.accept(this) as AstNode;
+  }
+
+  List _cloneNodeList(NodeList nodes) {
+    List clonedNodes = new List();
+    for (AstNode node in nodes) {
+      clonedNodes.add(_cloneNode(node));
+    }
+    return clonedNodes;
+  }
+
+  Token _mapToken(Token oldToken) {
+    if (oldToken == null) {
+      return null;
+    }
+    return _tokenMap.get(oldToken);
+  }
+
+  List<Token> _mapTokens(List<Token> oldTokens) {
+    List<Token> newTokens = new List<Token>(oldTokens.length);
+    for (int index = 0; index < newTokens.length; index++) {
+      newTokens[index] = _mapToken(oldTokens[index]);
+    }
+    return newTokens;
+  }
+}
+
+/**
+ * An index expression.
+ *
+ * > indexExpression ::=
+ * >     [Expression] '[' [Expression] ']'
+ */
+class IndexExpression extends Expression {
+  /**
+   * The expression used to compute the object being indexed, or `null` if this
+   * index expression is part of a cascade expression.
+   */
+  Expression _target;
+
+  /**
+   * The period ("..") before a cascaded index expression, or `null` if this
+   * index expression is not part of a cascade expression.
+   */
+  Token period;
+
+  /**
+   * The left square bracket.
+   */
+  Token leftBracket;
+
+  /**
+   * The expression used to compute the index.
+   */
+  Expression _index;
+
+  /**
+   * The right square bracket.
+   */
+  Token rightBracket;
+
+  /**
+   * The element associated with the operator based on the static type of the
+   * target, or `null` if the AST structure has not been resolved or if the
+   * operator could not be resolved.
+   */
+  MethodElement staticElement;
+
+  /**
+   * The element associated with the operator based on the propagated type of
+   * the target, or `null` if the AST structure has not been resolved or if the
+   * operator could not be resolved.
+   */
+  MethodElement propagatedElement;
+
+  /**
+   * If this expression is both in a getter and setter context, the
+   * [AuxiliaryElements] will be set to hold onto the static and propagated
+   * information. The auxiliary element will hold onto the elements from the
+   * getter context.
+   */
+  AuxiliaryElements auxiliaryElements = null;
+
+  /**
+   * Initialize a newly created index expression.
+   */
+  IndexExpression.forCascade(
+      this.period, this.leftBracket, Expression index, this.rightBracket) {
+    _index = _becomeParentOf(index);
+  }
+
+  /**
+   * Initialize a newly created index expression.
+   */
+  IndexExpression.forTarget(Expression target, this.leftBracket,
+      Expression index, this.rightBracket) {
+    _target = _becomeParentOf(target);
+    _index = _becomeParentOf(index);
+  }
+
+  @override
+  Token get beginToken {
+    if (_target != null) {
+      return _target.beginToken;
+    }
+    return period;
+  }
+
+  /**
+   * Return the best element available for this operator. If resolution was able
+   * to find a better element based on type propagation, that element will be
+   * returned. Otherwise, the element found using the result of static analysis
+   * will be returned. If resolution has not been performed, then `null` will be
+   * returned.
+   */
+  MethodElement get bestElement {
+    MethodElement element = propagatedElement;
+    if (element == null) {
+      element = staticElement;
+    }
+    return element;
+  }
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(_target)
+    ..add(period)
+    ..add(leftBracket)
+    ..add(_index)
+    ..add(rightBracket);
+
+  @override
+  Token get endToken => rightBracket;
+
+  /**
+   * Return the expression used to compute the index.
+   */
+  Expression get index => _index;
+
+  /**
+   * Set the expression used to compute the index to the given [expression].
+   */
+  void set index(Expression expression) {
+    _index = _becomeParentOf(expression);
+  }
+
+  @override
+  bool get isAssignable => true;
+
+  /**
+   * Return `true` if this expression is cascaded. If it is, then the target of
+   * this expression is not stored locally but is stored in the nearest ancestor
+   * that is a [CascadeExpression].
+   */
+  bool get isCascaded => period != null;
+
+  @override
+  int get precedence => 15;
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is
+   * known based on propagated type information, then return the parameter
+   * element representing the parameter to which the value of the index
+   * expression will be bound. Otherwise, return `null`.
+   */
+  @deprecated // Use "expression.propagatedParameterElement"
+  ParameterElement get propagatedParameterElementForIndex {
+    return _propagatedParameterElementForIndex;
+  }
+
+  /**
+   * Return the expression used to compute the object being indexed. If this
+   * index expression is not part of a cascade expression, then this is the same
+   * as [target]. If this index expression is part of a cascade expression, then
+   * the target expression stored with the cascade expression is returned.
+   */
+  Expression get realTarget {
+    if (isCascaded) {
+      AstNode ancestor = parent;
+      while (ancestor is! CascadeExpression) {
+        if (ancestor == null) {
+          return _target;
+        }
+        ancestor = ancestor.parent;
+      }
+      return (ancestor as CascadeExpression).target;
+    }
+    return _target;
+  }
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is
+   * known based on static type information, then return the parameter element
+   * representing the parameter to which the value of the index expression will
+   * be bound. Otherwise, return `null`.
+   */
+  @deprecated // Use "expression.propagatedParameterElement"
+  ParameterElement get staticParameterElementForIndex {
+    return _staticParameterElementForIndex;
+  }
+
+  /**
+   * Return the expression used to compute the object being indexed, or `null`
+   * if this index expression is part of a cascade expression.
+   *
+   * Use [realTarget] to get the target independent of whether this is part of a
+   * cascade expression.
+   */
+  Expression get target => _target;
+
+  /**
+   * Set the expression used to compute the object being indexed to the given
+   * [expression].
+   */
+  void set target(Expression expression) {
+    _target = _becomeParentOf(expression);
+  }
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is
+   * known based on propagated type information, then return the parameter
+   * element representing the parameter to which the value of the index
+   * expression will be bound. Otherwise, return `null`.
+   */
+  ParameterElement get _propagatedParameterElementForIndex {
+    if (propagatedElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters = propagatedElement.parameters;
+    if (parameters.length < 1) {
+      return null;
+    }
+    return parameters[0];
+  }
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is
+   * known based on static type information, then return the parameter element
+   * representing the parameter to which the value of the index expression will
+   * be bound. Otherwise, return `null`.
+   */
+  ParameterElement get _staticParameterElementForIndex {
+    if (staticElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters = staticElement.parameters;
+    if (parameters.length < 1) {
+      return null;
+    }
+    return parameters[0];
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitIndexExpression(this);
+
+  /**
+   * Return `true` if this expression is computing a right-hand value (that is,
+   * if this expression is in a context where the operator '[]' will be
+   * invoked).
+   *
+   * Note that [inGetterContext] and [inSetterContext] are not opposites, nor
+   * are they mutually exclusive. In other words, it is possible for both
+   * methods to return `true` when invoked on the same node.
+   */
+  bool inGetterContext() {
+    // TODO(brianwilkerson) Convert this to a getter.
+    AstNode parent = this.parent;
+    if (parent is AssignmentExpression) {
+      AssignmentExpression assignment = parent;
+      if (identical(assignment.leftHandSide, this) &&
+          assignment.operator.type == TokenType.EQ) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Return `true` if this expression is computing a left-hand value (that is,
+   * if this expression is in a context where the operator '[]=' will be
+   * invoked).
+   *
+   * Note that [inGetterContext] and [inSetterContext] are not opposites, nor
+   * are they mutually exclusive. In other words, it is possible for both
+   * methods to return `true` when invoked on the same node.
+   */
+  bool inSetterContext() {
+    // TODO(brianwilkerson) Convert this to a getter.
+    AstNode parent = this.parent;
+    if (parent is PrefixExpression) {
+      return parent.operator.type.isIncrementOperator;
+    } else if (parent is PostfixExpression) {
+      return true;
+    } else if (parent is AssignmentExpression) {
+      return identical(parent.leftHandSide, this);
+    }
+    return false;
+  }
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_target, visitor);
+    _safelyVisitChild(_index, visitor);
+  }
+}
+
+/**
+ * An instance creation expression.
+ *
+ * > newExpression ::=
+ * >     ('new' | 'const') [TypeName] ('.' [SimpleIdentifier])? [ArgumentList]
+ */
+class InstanceCreationExpression extends Expression {
+  /**
+   * The 'new' or 'const' keyword used to indicate how an object should be
+   * created.
+   */
+  Token keyword;
+
+  /**
+   * The name of the constructor to be invoked.
+   */
+  ConstructorName _constructorName;
+
+  /**
+   * The list of arguments to the constructor.
+   */
+  ArgumentList _argumentList;
+
+  /**
+   * The element associated with the constructor based on static type
+   * information, or `null` if the AST structure has not been resolved or if the
+   * constructor could not be resolved.
+   */
+  ConstructorElement staticElement;
+
+  /**
+   * Initialize a newly created instance creation expression.
+   */
+  InstanceCreationExpression(this.keyword, ConstructorName constructorName,
+      ArgumentList argumentList) {
+    _constructorName = _becomeParentOf(constructorName);
+    _argumentList = _becomeParentOf(argumentList);
+  }
+
+  /**
+   * Return the list of arguments to the constructor.
+   */
+  ArgumentList get argumentList => _argumentList;
+
+  /**
+   * Set the list of arguments to the constructor to the given [argumentList].
+   */
+  void set argumentList(ArgumentList argumentList) {
+    _argumentList = _becomeParentOf(argumentList);
+  }
+
+  @override
+  Token get beginToken => keyword;
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(keyword)
+    ..add(_constructorName)
+    ..add(_argumentList);
+
+  /**
+   * Return the name of the constructor to be invoked.
+   */
+  ConstructorName get constructorName => _constructorName;
+
+  /**
+   * Set the name of the constructor to be invoked to the given [name].
+   */
+  void set constructorName(ConstructorName name) {
+    _constructorName = _becomeParentOf(name);
+  }
+
+  @override
+  Token get endToken => _argumentList.endToken;
+
+  /**
+   * Return `true` if this creation expression is used to invoke a constant
+   * constructor.
+   */
+  bool get isConst => keyword is KeywordToken &&
+      (keyword as KeywordToken).keyword == Keyword.CONST;
+
+  @override
+  int get precedence => 16;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitInstanceCreationExpression(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_constructorName, visitor);
+    _safelyVisitChild(_argumentList, visitor);
+  }
+}
+
+/**
+ * An integer literal expression.
+ *
+ * > integerLiteral ::=
+ * >     decimalIntegerLiteral
+ * >   | hexidecimalIntegerLiteral
+ * >
+ * > decimalIntegerLiteral ::=
+ * >     decimalDigit+
+ * >
+ * > hexidecimalIntegerLiteral ::=
+ * >     '0x' hexidecimalDigit+
+ * >   | '0X' hexidecimalDigit+
+ */
+class IntegerLiteral extends Literal {
+  /**
+   * The token representing the literal.
+   */
+  Token literal;
+
+  /**
+   * The value of the literal.
+   */
+  int value = 0;
+
+  /**
+   * Initialize a newly created integer literal.
+   */
+  IntegerLiteral(this.literal, this.value);
+
+  @override
+  Token get beginToken => literal;
+
+  @override
+  Iterable get childEntities => new ChildEntities()..add(literal);
+
+  @override
+  Token get endToken => literal;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitIntegerLiteral(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    // There are no children to visit.
+  }
+}
+
+/**
+ * A node within a [StringInterpolation].
+ *
+ * > interpolationElement ::=
+ * >     [InterpolationExpression]
+ * >   | [InterpolationString]
+ */
+abstract class InterpolationElement extends AstNode {}
+
+/**
+ * An expression embedded in a string interpolation.
+ *
+ * > interpolationExpression ::=
+ * >     '$' [SimpleIdentifier]
+ * >   | '$' '{' [Expression] '}'
+ */
+class InterpolationExpression extends InterpolationElement {
+  /**
+   * The token used to introduce the interpolation expression; either '$' if the
+   * expression is a simple identifier or '${' if the expression is a full
+   * expression.
+   */
+  Token leftBracket;
+
+  /**
+   * The expression to be evaluated for the value to be converted into a string.
+   */
+  Expression _expression;
+
+  /**
+   * The right curly bracket, or `null` if the expression is an identifier
+   * without brackets.
+   */
+  Token rightBracket;
+
+  /**
+   * Initialize a newly created interpolation expression.
+   */
+  InterpolationExpression(
+      this.leftBracket, Expression expression, this.rightBracket) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  @override
+  Token get beginToken => leftBracket;
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(leftBracket)
+    ..add(_expression)
+    ..add(rightBracket);
+
+  @override
+  Token get endToken {
+    if (rightBracket != null) {
+      return rightBracket;
+    }
+    return _expression.endToken;
+  }
+
+  /**
+   * Return the expression to be evaluated for the value to be converted into a
+   * string.
+   */
+  Expression get expression => _expression;
+
+  /**
+   * Set the expression to be evaluated for the value to be converted into a
+   * string to the given [expression].
+   */
+  void set expression(Expression expression) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitInterpolationExpression(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_expression, visitor);
+  }
+}
+
+/**
+ * A non-empty substring of an interpolated string.
+ *
+ * > interpolationString ::=
+ * >     characters
+ */
+class InterpolationString extends InterpolationElement {
+  /**
+   * The characters that will be added to the string.
+   */
+  Token contents;
+
+  /**
+   * The value of the literal.
+   */
+  String value;
+
+  /**
+   * Initialize a newly created string of characters that are part of a string
+   * interpolation.
+   */
+  InterpolationString(this.contents, this.value);
+
+  @override
+  Token get beginToken => contents;
+
+  @override
+  Iterable get childEntities => new ChildEntities()..add(contents);
+
+  /**
+   * Return the offset of the after-last contents character.
+   */
+  int get contentsEnd {
+    String lexeme = contents.lexeme;
+    return offset + new StringLexemeHelper(lexeme, true, true).end;
+  }
+
+  /**
+   * Return the offset of the first contents character.
+   */
+  int get contentsOffset {
+    int offset = contents.offset;
+    String lexeme = contents.lexeme;
+    return offset + new StringLexemeHelper(lexeme, true, true).start;
+  }
+
+  @override
+  Token get endToken => contents;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitInterpolationString(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {}
+}
+
+/**
+ * An is expression.
+ *
+ * > isExpression ::=
+ * >     [Expression] 'is' '!'? [TypeName]
+ */
+class IsExpression extends Expression {
+  /**
+   * The expression used to compute the value whose type is being tested.
+   */
+  Expression _expression;
+
+  /**
+   * The is operator.
+   */
+  Token isOperator;
+
+  /**
+   * The not operator, or `null` if the sense of the test is not negated.
+   */
+  Token notOperator;
+
+  /**
+   * The name of the type being tested for.
+   */
+  TypeName _type;
+
+  /**
+   * Initialize a newly created is expression. The [notOperator] can be `null`
+   * if the sense of the test is not negated.
+   */
+  IsExpression(
+      Expression expression, this.isOperator, this.notOperator, TypeName type) {
+    _expression = _becomeParentOf(expression);
+    _type = _becomeParentOf(type);
+  }
+
+  @override
+  Token get beginToken => _expression.beginToken;
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(_expression)
+    ..add(isOperator)
+    ..add(notOperator)
+    ..add(_type);
+
+  @override
+  Token get endToken => _type.endToken;
+
+  /**
+   * Return the expression used to compute the value whose type is being tested.
+   */
+  Expression get expression => _expression;
+
+  /**
+   * Set the expression used to compute the value whose type is being tested to
+   * the given [expression].
+   */
+  void set expression(Expression expression) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  @override
+  int get precedence => 7;
+
+  /**
+   * Return the name of the type being tested for.
+   */
+  TypeName get type => _type;
+
+  /**
+   * Set the name of the type being tested for to the given [name].
+   */
+  void set type(TypeName name) {
+    _type = _becomeParentOf(name);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitIsExpression(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_expression, visitor);
+    _safelyVisitChild(_type, visitor);
+  }
+}
+
+/**
+ * A label on either a [LabeledStatement] or a [NamedExpression].
+ *
+ * > label ::=
+ * >     [SimpleIdentifier] ':'
+ */
+class Label extends AstNode {
+  /**
+   * The label being associated with the statement.
+   */
+  SimpleIdentifier _label;
+
+  /**
+   * The colon that separates the label from the statement.
+   */
+  Token colon;
+
+  /**
+   * Initialize a newly created label.
+   */
+  Label(SimpleIdentifier label, this.colon) {
+    _label = _becomeParentOf(label);
+  }
+
+  @override
+  Token get beginToken => _label.beginToken;
+
+  @override
+  Iterable get childEntities => new ChildEntities()..add(_label)..add(colon);
+
+  @override
+  Token get endToken => colon;
+
+  /**
+   * Return the label being associated with the statement.
+   */
+  SimpleIdentifier get label => _label;
+
+  /**
+   * Set the label being associated with the statement to the given [label].
+   */
+  void set label(SimpleIdentifier label) {
+    _label = _becomeParentOf(label);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitLabel(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_label, visitor);
+  }
+}
+
+/**
+ * A statement that has a label associated with them.
+ *
+ * > labeledStatement ::=
+ * >    [Label]+ [Statement]
+ */
+class LabeledStatement extends Statement {
+  /**
+   * The labels being associated with the statement.
+   */
+  NodeList<Label> _labels;
+
+  /**
+   * The statement with which the labels are being associated.
+   */
+  Statement _statement;
+
+  /**
+   * Initialize a newly created labeled statement.
+   */
+  LabeledStatement(List<Label> labels, Statement statement) {
+    _labels = new NodeList<Label>(this, labels);
+    _statement = _becomeParentOf(statement);
+  }
+
+  @override
+  Token get beginToken {
+    if (!_labels.isEmpty) {
+      return _labels.beginToken;
+    }
+    return _statement.beginToken;
+  }
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..addAll(_labels)
+    ..add(_statement);
+
+  @override
+  Token get endToken => _statement.endToken;
+
+  /**
+   * Return the labels being associated with the statement.
+   */
+  NodeList<Label> get labels => _labels;
+
+  /**
+   * Return the statement with which the labels are being associated.
+   */
+  Statement get statement => _statement;
+
+  /**
+   * Set the statement with which the labels are being associated to the given
+   * [statement].
+   */
+  void set statement(Statement statement) {
+    _statement = _becomeParentOf(statement);
+  }
+
+  @override
+  Statement get unlabeled => _statement.unlabeled;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitLabeledStatement(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _labels.accept(visitor);
+    _safelyVisitChild(_statement, visitor);
+  }
+}
+
+/**
+ * A library directive.
+ *
+ * > libraryDirective ::=
+ * >     [Annotation] 'library' [Identifier] ';'
+ */
+class LibraryDirective extends Directive {
+  /**
+   * The token representing the 'library' keyword.
+   */
+  Token libraryKeyword;
+
+  /**
+   * The name of the library being defined.
+   */
+  LibraryIdentifier _name;
+
+  /**
+   * The semicolon terminating the directive.
+   */
+  Token semicolon;
+
+  /**
+   * Initialize a newly created library directive. Either or both of the
+   * [comment] and [metadata] can be `null` if the directive does not have the
+   * corresponding attribute.
+   */
+  LibraryDirective(Comment comment, List<Annotation> metadata,
+      this.libraryKeyword, LibraryIdentifier name, this.semicolon)
+      : super(comment, metadata) {
+    _name = _becomeParentOf(name);
+  }
+
+  @override
+  Iterable get childEntities =>
+      super._childEntities..add(libraryKeyword)..add(_name)..add(semicolon);
+
+  @override
+  Token get endToken => semicolon;
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata => libraryKeyword;
+
+  @override
+  Token get keyword => libraryKeyword;
+
+  /**
+   * Return the token representing the 'library' token.
+   */
+  @deprecated // Use "this.libraryKeyword"
+  Token get libraryToken => libraryKeyword;
+
+  /**
+   * Set the token representing the 'library' token to the given [token].
+   */
+  @deprecated // Use "this.libraryKeyword"
+  set libraryToken(Token token) {
+    libraryKeyword = token;
+  }
+
+  /**
+   * Return the name of the library being defined.
+   */
+  LibraryIdentifier get name => _name;
+
+  /**
+   * Set the name of the library being defined to the given [name].
+   */
+  void set name(LibraryIdentifier name) {
+    _name = _becomeParentOf(name);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitLibraryDirective(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_name, visitor);
+  }
+}
+
+/**
+ * The identifier for a library.
+ *
+ * > libraryIdentifier ::=
+ * >     [SimpleIdentifier] ('.' [SimpleIdentifier])*
+ */
+class LibraryIdentifier extends Identifier {
+  /**
+   * The components of the identifier.
+   */
+  NodeList<SimpleIdentifier> _components;
+
+  /**
+   * Initialize a newly created prefixed identifier.
+   */
+  LibraryIdentifier(List<SimpleIdentifier> components) {
+    _components = new NodeList<SimpleIdentifier>(this, components);
+  }
+
+  @override
+  Token get beginToken => _components.beginToken;
+
+  @override
+  Element get bestElement => staticElement;
+
+  /**
+   * TODO(paulberry): add "." tokens.
+   */
+  @override
+  Iterable get childEntities => new ChildEntities()..addAll(_components);
+
+  /**
+   * Return the components of the identifier.
+   */
+  NodeList<SimpleIdentifier> get components => _components;
+
+  @override
+  Token get endToken => _components.endToken;
+
+  @override
+  String get name {
+    StringBuffer buffer = new StringBuffer();
+    bool needsPeriod = false;
+    for (SimpleIdentifier identifier in _components) {
+      if (needsPeriod) {
+        buffer.write(".");
+      } else {
+        needsPeriod = true;
+      }
+      buffer.write(identifier.name);
+    }
+    return buffer.toString();
+  }
+
+  @override
+  int get precedence => 15;
+
+  @override
+  Element get propagatedElement => null;
+
+  @override
+  Element get staticElement => null;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitLibraryIdentifier(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _components.accept(visitor);
+  }
+}
+
+/**
+ * A list literal.
+ *
+ * > listLiteral ::=
+ * >     'const'? ('<' [TypeName] '>')? '[' ([Expression] ','?)? ']'
+ */
+class ListLiteral extends TypedLiteral {
+  /**
+   * The left square bracket.
+   */
+  Token leftBracket;
+
+  /**
+   * The expressions used to compute the elements of the list.
+   */
+  NodeList<Expression> _elements;
+
+  /**
+   * The right square bracket.
+   */
+  Token rightBracket;
+
+  /**
+   * Initialize a newly created list literal. The [constKeyword] can be `null`
+   * if the literal is not a constant. The [typeArguments] can be `null` if no
+   * type arguments were declared. The list of [elements] can be `null` if the
+   * list is empty.
+   */
+  ListLiteral(Token constKeyword, TypeArgumentList typeArguments,
+      this.leftBracket, List<Expression> elements, this.rightBracket)
+      : super(constKeyword, typeArguments) {
+    _elements = new NodeList<Expression>(this, elements);
+  }
+
+  @override
+  Token get beginToken {
+    if (constKeyword != null) {
+      return constKeyword;
+    }
+    TypeArgumentList typeArguments = this.typeArguments;
+    if (typeArguments != null) {
+      return typeArguments.beginToken;
+    }
+    return leftBracket;
+  }
+
+  /**
+   * TODO(paulberry): add commas.
+   */
+  @override
+  Iterable get childEntities => super._childEntities
+    ..add(leftBracket)
+    ..addAll(_elements)
+    ..add(rightBracket);
+
+  /**
+   * Return the expressions used to compute the elements of the list.
+   */
+  NodeList<Expression> get elements => _elements;
+
+  @override
+  Token get endToken => rightBracket;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitListLiteral(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _elements.accept(visitor);
+  }
+}
+
+/**
+ * A node that represents a literal expression.
+ *
+ * > literal ::=
+ * >     [BooleanLiteral]
+ * >   | [DoubleLiteral]
+ * >   | [IntegerLiteral]
+ * >   | [ListLiteral]
+ * >   | [MapLiteral]
+ * >   | [NullLiteral]
+ * >   | [StringLiteral]
+ */
+abstract class Literal extends Expression {
+  @override
+  int get precedence => 16;
+}
+
+/**
+ * A literal map.
+ *
+ * > mapLiteral ::=
+ * >     'const'? ('<' [TypeName] (',' [TypeName])* '>')?
+ * >     '{' ([MapLiteralEntry] (',' [MapLiteralEntry])* ','?)? '}'
+ */
+class MapLiteral extends TypedLiteral {
+  /**
+   * The left curly bracket.
+   */
+  Token leftBracket;
+
+  /**
+   * The entries in the map.
+   */
+  NodeList<MapLiteralEntry> _entries;
+
+  /**
+   * The right curly bracket.
+   */
+  Token rightBracket;
+
+  /**
+   * Initialize a newly created map literal. The [constKeyword] can be `null` if
+   * the literal is not a constant. The [typeArguments] can be `null` if no type
+   * arguments were declared. The [entries] can be `null` if the map is empty.
+   */
+  MapLiteral(Token constKeyword, TypeArgumentList typeArguments,
+      this.leftBracket, List<MapLiteralEntry> entries, this.rightBracket)
+      : super(constKeyword, typeArguments) {
+    _entries = new NodeList<MapLiteralEntry>(this, entries);
+  }
+
+  @override
+  Token get beginToken {
+    if (constKeyword != null) {
+      return constKeyword;
+    }
+    TypeArgumentList typeArguments = this.typeArguments;
+    if (typeArguments != null) {
+      return typeArguments.beginToken;
+    }
+    return leftBracket;
+  }
+
+  /**
+   * TODO(paulberry): add commas.
+   */
+  @override
+  Iterable get childEntities => super._childEntities
+    ..add(leftBracket)
+    ..addAll(entries)
+    ..add(rightBracket);
+
+  @override
+  Token get endToken => rightBracket;
+
+  /**
+   * Return the entries in the map.
+   */
+  NodeList<MapLiteralEntry> get entries => _entries;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitMapLiteral(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _entries.accept(visitor);
+  }
+}
+
+/**
+ * A single key/value pair in a map literal.
+ *
+ * > mapLiteralEntry ::=
+ * >     [Expression] ':' [Expression]
+ */
+class MapLiteralEntry extends AstNode {
+  /**
+   * The expression computing the key with which the value will be associated.
+   */
+  Expression _key;
+
+  /**
+   * The colon that separates the key from the value.
+   */
+  Token separator;
+
+  /**
+   * The expression computing the value that will be associated with the key.
+   */
+  Expression _value;
+
+  /**
+   * Initialize a newly created map literal entry.
+   */
+  MapLiteralEntry(Expression key, this.separator, Expression value) {
+    _key = _becomeParentOf(key);
+    _value = _becomeParentOf(value);
+  }
+
+  @override
+  Token get beginToken => _key.beginToken;
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(_key)..add(separator)..add(_value);
+
+  @override
+  Token get endToken => _value.endToken;
+
+  /**
+   * Return the expression computing the key with which the value will be
+   * associated.
+   */
+  Expression get key => _key;
+
+  /**
+   * Set the expression computing the key with which the value will be
+   * associated to the given [string].
+   */
+  void set key(Expression string) {
+    _key = _becomeParentOf(string);
+  }
+
+  /**
+   * Return the expression computing the value that will be associated with the
+   * key.
+   */
+  Expression get value => _value;
+
+  /**
+   * Set the expression computing the value that will be associated with the key
+   * to the given [expression].
+   */
+  void set value(Expression expression) {
+    _value = _becomeParentOf(expression);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitMapLiteralEntry(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_key, visitor);
+    _safelyVisitChild(_value, visitor);
+  }
+}
+
+/**
+ * A method declaration.
+ *
+ * > methodDeclaration ::=
+ * >     methodSignature [FunctionBody]
+ * >
+ * > methodSignature ::=
+ * >     'external'? ('abstract' | 'static')? [Type]? ('get' | 'set')?
+ * >     methodName [TypeParameterList] [FormalParameterList]
+ * >
+ * > methodName ::=
+ * >     [SimpleIdentifier]
+ * >   | 'operator' [SimpleIdentifier]
+ */
+class MethodDeclaration extends ClassMember {
+  /**
+   * The token for the 'external' keyword, or `null` if the constructor is not
+   * external.
+   */
+  Token externalKeyword;
+
+  /**
+   * The token representing the 'abstract' or 'static' keyword, or `null` if
+   * neither modifier was specified.
+   */
+  Token modifierKeyword;
+
+  /**
+   * The return type of the method, or `null` if no return type was declared.
+   */
+  TypeName _returnType;
+
+  /**
+   * The token representing the 'get' or 'set' keyword, or `null` if this is a
+   * method declaration rather than a property declaration.
+   */
+  Token propertyKeyword;
+
+  /**
+   * The token representing the 'operator' keyword, or `null` if this method
+   * does not declare an operator.
+   */
+  Token operatorKeyword;
+
+  /**
+   * The name of the method.
+   */
+  SimpleIdentifier _name;
+
+  /**
+   * The type parameters associated with the method, or `null` if the method is
+   * not a generic method.
+   */
+  TypeParameterList _typeParameters;
+
+  /**
+   * The parameters associated with the method, or `null` if this method
+   * declares a getter.
+   */
+  FormalParameterList _parameters;
+
+  /**
+   * The body of the method.
+   */
+  FunctionBody _body;
+
+  /**
+   * Initialize a newly created method declaration. Either or both of the
+   * [comment] and [metadata] can be `null` if the declaration does not have the
+   * corresponding attribute. The [externalKeyword] can be `null` if the method
+   * is not external. The [modifierKeyword] can be `null` if the method is
+   * neither abstract nor static. The [returnType] can be `null` if no return
+   * type was specified. The [propertyKeyword] can be `null` if the method is
+   * neither a getter or a setter. The [operatorKeyword] can be `null` if the
+   * method does not implement an operator. The [parameters] must be `null` if
+   * this method declares a getter.
+   */
+  MethodDeclaration(Comment comment, List<Annotation> metadata,
+      this.externalKeyword, this.modifierKeyword, TypeName returnType,
+      this.propertyKeyword, this.operatorKeyword, SimpleIdentifier name,
+      TypeParameterList typeParameters, FormalParameterList parameters,
+      FunctionBody body)
+      : super(comment, metadata) {
+    _returnType = _becomeParentOf(returnType);
+    _name = _becomeParentOf(name);
+    _typeParameters = _becomeParentOf(typeParameters);
+    _parameters = _becomeParentOf(parameters);
+    _body = _becomeParentOf(body);
+  }
+
+  /**
+   * Return the body of the method.
+   */
+  FunctionBody get body => _body;
+
+  /**
+   * Set the body of the method to the given [functionBody].
+   */
+  void set body(FunctionBody functionBody) {
+    _body = _becomeParentOf(functionBody);
+  }
+
+  @override
+  Iterable get childEntities => super._childEntities
+    ..add(externalKeyword)
+    ..add(modifierKeyword)
+    ..add(_returnType)
+    ..add(propertyKeyword)
+    ..add(operatorKeyword)
+    ..add(_name)
+    ..add(_parameters)
+    ..add(_body);
+
+  /**
+   * Return the element associated with this method, or `null` if the AST
+   * structure has not been resolved. The element can either be a
+   * [MethodElement], if this represents the declaration of a normal method, or
+   * a [PropertyAccessorElement] if this represents the declaration of either a
+   * getter or a setter.
+   */
+  @override
+  ExecutableElement get element =>
+      _name != null ? (_name.staticElement as ExecutableElement) : null;
+
+  @override
+  Token get endToken => _body.endToken;
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata {
+    if (modifierKeyword != null) {
+      return modifierKeyword;
+    } else if (_returnType != null) {
+      return _returnType.beginToken;
+    } else if (propertyKeyword != null) {
+      return propertyKeyword;
+    } else if (operatorKeyword != null) {
+      return operatorKeyword;
+    }
+    return _name.beginToken;
+  }
+
+  /**
+   * Return `true` if this method is declared to be an abstract method.
+   */
+  bool get isAbstract {
+    FunctionBody body = _body;
+    return externalKeyword == null &&
+        (body is EmptyFunctionBody && !body.semicolon.isSynthetic);
+  }
+
+  /**
+   * Return `true` if this method declares a getter.
+   */
+  bool get isGetter => propertyKeyword != null &&
+      (propertyKeyword as KeywordToken).keyword == Keyword.GET;
+
+  /**
+   * Return `true` if this method declares an operator.
+   */
+  bool get isOperator => operatorKeyword != null;
+
+  /**
+   * Return `true` if this method declares a setter.
+   */
+  bool get isSetter => propertyKeyword != null &&
+      (propertyKeyword as KeywordToken).keyword == Keyword.SET;
+
+  /**
+   * Return `true` if this method is declared to be a static method.
+   */
+  bool get isStatic => modifierKeyword != null &&
+      (modifierKeyword as KeywordToken).keyword == Keyword.STATIC;
+
+  /**
+   * Return the name of the method.
+   */
+  SimpleIdentifier get name => _name;
+
+  /**
+   * Set the name of the method to the given [identifier].
+   */
+  void set name(SimpleIdentifier identifier) {
+    _name = _becomeParentOf(identifier);
+  }
+
+  /**
+   * Return the parameters associated with the method, or `null` if this method
+   * declares a getter.
+   */
+  FormalParameterList get parameters => _parameters;
+
+  /**
+   * Set the parameters associated with the method to the given list of
+   * [parameters].
+   */
+  void set parameters(FormalParameterList parameters) {
+    _parameters = _becomeParentOf(parameters);
+  }
+
+  /**
+   * Return the return type of the method, or `null` if no return type was
+   * declared.
+   */
+  TypeName get returnType => _returnType;
+
+  /**
+   * Set the return type of the method to the given [typeName].
+   */
+  void set returnType(TypeName typeName) {
+    _returnType = _becomeParentOf(typeName);
+  }
+
+  /**
+   * Return the type parameters associated with this method, or `null` if this
+   * method is not a generic method.
+   */
+  TypeParameterList get typeParameters => _typeParameters;
+
+  /**
+   * Set the type parameters associated with this method to the given
+   * [typeParameters].
+   */
+  void set typeParameters(TypeParameterList typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitMethodDeclaration(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_returnType, visitor);
+    _safelyVisitChild(_name, visitor);
+    _safelyVisitChild(_typeParameters, visitor);
+    _safelyVisitChild(_parameters, visitor);
+    _safelyVisitChild(_body, visitor);
+  }
+}
+
+/**
+ * The invocation of either a function or a method. Invocations of functions
+ * resulting from evaluating an expression are represented by
+ * [FunctionExpressionInvocation] nodes. Invocations of getters and setters are
+ * represented by either [PrefixedIdentifier] or [PropertyAccess] nodes.
+ *
+ * > methodInvoction ::=
+ * >     ([Expression] '.')? [SimpleIdentifier] [TypeArgumentList]? [ArgumentList]
+ */
+class MethodInvocation extends Expression {
+  /**
+   * The expression producing the object on which the method is defined, or
+   * `null` if there is no target (that is, the target is implicitly `this`).
+   */
+  Expression _target;
+
+  /**
+   * The operator that separates the target from the method name, or `null`
+   * if there is no target. In an ordinary method invocation this will be a
+   * period ('.'). In a cascade section this will be the cascade operator
+   * ('..').
+   */
+  Token operator;
+
+  /**
+   * The name of the method being invoked.
+   */
+  SimpleIdentifier _methodName;
+
+  /**
+   * The type arguments to be applied to the method being invoked, or `null` if
+   * no type arguments were provided.
+   */
+  TypeArgumentList _typeArguments;
+
+  /**
+   * The list of arguments to the method.
+   */
+  ArgumentList _argumentList;
+
+  /**
+   * Initialize a newly created method invocation. The [target] and [operator]
+   * can be `null` if there is no target.
+   */
+  MethodInvocation(Expression target, this.operator,
+      SimpleIdentifier methodName, TypeArgumentList typeArguments,
+      ArgumentList argumentList) {
+    _target = _becomeParentOf(target);
+    _methodName = _becomeParentOf(methodName);
+    _typeArguments = _becomeParentOf(typeArguments);
+    _argumentList = _becomeParentOf(argumentList);
+  }
+
+  /**
+   * Return the list of arguments to the method.
+   */
+  ArgumentList get argumentList => _argumentList;
+
+  /**
+   * Set the list of arguments to the method to the given [argumentList].
+   */
+  void set argumentList(ArgumentList argumentList) {
+    _argumentList = _becomeParentOf(argumentList);
+  }
+
+  @override
+  Token get beginToken {
+    if (_target != null) {
+      return _target.beginToken;
+    } else if (operator != null) {
+      return operator;
+    }
+    return _methodName.beginToken;
+  }
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(_target)
+    ..add(operator)
+    ..add(_methodName)
+    ..add(_argumentList);
+
+  @override
+  Token get endToken => _argumentList.endToken;
+
+  /**
+   * Return `true` if this expression is cascaded. If it is, then the target of
+   * this expression is not stored locally but is stored in the nearest ancestor
+   * that is a [CascadeExpression].
+   */
+  bool get isCascaded =>
+      operator != null && operator.type == TokenType.PERIOD_PERIOD;
+
+  /**
+   * Return the name of the method being invoked.
+   */
+  SimpleIdentifier get methodName => _methodName;
+
+  /**
+   * Set the name of the method being invoked to the given [identifier].
+   */
+  void set methodName(SimpleIdentifier identifier) {
+    _methodName = _becomeParentOf(identifier);
+  }
+
+  /**
+   * The operator that separates the target from the method name, or `null`
+   * if there is no target. In an ordinary method invocation this will be a
+   * period ('.'). In a cascade section this will be the cascade operator
+   * ('..').
+   */
+  @deprecated // Use this.operator
+  Token get period => operator;
+
+  /**
+   * The operator that separates the target from the method name, or `null`
+   * if there is no target. In an ordinary method invocation this will be a
+   * period ('.'). In a cascade section this will be the cascade operator
+   * ('..').
+   */
+  @deprecated // Use this.operator
+  void set period(Token value) {
+    operator = value;
+  }
+
+  @override
+  int get precedence => 15;
+
+  /**
+   * Return the expression used to compute the receiver of the invocation. If
+   * this invocation is not part of a cascade expression, then this is the same
+   * as [target]. If this invocation is part of a cascade expression, then the
+   * target stored with the cascade expression is returned.
+   */
+  Expression get realTarget {
+    if (isCascaded) {
+      AstNode ancestor = parent;
+      while (ancestor is! CascadeExpression) {
+        if (ancestor == null) {
+          return _target;
+        }
+        ancestor = ancestor.parent;
+      }
+      return (ancestor as CascadeExpression).target;
+    }
+    return _target;
+  }
+
+  /**
+   * Return the expression producing the object on which the method is defined,
+   * or `null` if there is no target (that is, the target is implicitly `this`)
+   * or if this method invocation is part of a cascade expression.
+   *
+   * Use [realTarget] to get the target independent of whether this is part of a
+   * cascade expression.
+   */
+  Expression get target => _target;
+
+  /**
+   * Set the expression producing the object on which the method is defined to
+   * the given [expression].
+   */
+  void set target(Expression expression) {
+    _target = _becomeParentOf(expression);
+  }
+
+  /**
+   * Return the type arguments to be applied to the method being invoked, or
+   * `null` if no type arguments were provided.
+   */
+  TypeArgumentList get typeArguments => _typeArguments;
+
+  /**
+   * Set the type arguments to be applied to the method being invoked to the
+   * given [typeArguments].
+   */
+  void set typeArguments(TypeArgumentList typeArguments) {
+    _typeArguments = _becomeParentOf(typeArguments);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitMethodInvocation(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_target, visitor);
+    _safelyVisitChild(_methodName, visitor);
+    _safelyVisitChild(_typeArguments, visitor);
+    _safelyVisitChild(_argumentList, visitor);
+  }
+}
+
+/**
+ * A node that declares a single name within the scope of a compilation unit.
+ */
+abstract class NamedCompilationUnitMember extends CompilationUnitMember {
+  /**
+   * The name of the member being declared.
+   */
+  SimpleIdentifier _name;
+
+  /**
+   * Initialize a newly created compilation unit member with the given [name].
+   * Either or both of the [comment] and [metadata] can be `null` if the member
+   * does not have the corresponding attribute.
+   */
+  NamedCompilationUnitMember(
+      Comment comment, List<Annotation> metadata, SimpleIdentifier name)
+      : super(comment, metadata) {
+    _name = _becomeParentOf(name);
+  }
+
+  /**
+   * Return the name of the member being declared.
+   */
+  SimpleIdentifier get name => _name;
+
+  /**
+   * Set the name of the member being declared to the given [identifier].
+   */
+  void set name(SimpleIdentifier identifier) {
+    _name = _becomeParentOf(identifier);
+  }
+}
+
+/**
+ * An expression that has a name associated with it. They are used in method
+ * invocations when there are named parameters.
+ *
+ * > namedExpression ::=
+ * >     [Label] [Expression]
+ */
+class NamedExpression extends Expression {
+  /**
+   * The name associated with the expression.
+   */
+  Label _name;
+
+  /**
+   * The expression with which the name is associated.
+   */
+  Expression _expression;
+
+  /**
+   * Initialize a newly created named expression..
+   */
+  NamedExpression(Label name, Expression expression) {
+    _name = _becomeParentOf(name);
+    _expression = _becomeParentOf(expression);
+  }
+
+  @override
+  Token get beginToken => _name.beginToken;
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(_name)..add(_expression);
+
+  /**
+   * Return the element representing the parameter being named by this
+   * expression, or `null` if the AST structure has not been resolved or if
+   * there is no parameter with the same name as this expression.
+   */
+  ParameterElement get element {
+    Element element = _name.label.staticElement;
+    if (element is ParameterElement) {
+      return element;
+    }
+    return null;
+  }
+
+  @override
+  Token get endToken => _expression.endToken;
+
+  /**
+   * Return the expression with which the name is associated.
+   */
+  Expression get expression => _expression;
+
+  /**
+   * Set the expression with which the name is associated to the given
+   * [expression].
+   */
+  void set expression(Expression expression) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  /**
+   * Return the name associated with the expression.
+   */
+  Label get name => _name;
+
+  /**
+   * Set the name associated with the expression to the given [identifier].
+   */
+  void set name(Label identifier) {
+    _name = _becomeParentOf(identifier);
+  }
+
+  @override
+  int get precedence => 0;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitNamedExpression(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_name, visitor);
+    _safelyVisitChild(_expression, visitor);
+  }
+}
+
+/**
+ * A node that represents a directive that impacts the namespace of a library.
+ *
+ * > directive ::=
+ * >     [ExportDirective]
+ * >   | [ImportDirective]
+ */
+abstract class NamespaceDirective extends UriBasedDirective {
+  /**
+   * The token representing the 'import' or 'export' keyword.
+   */
+  Token keyword;
+
+  /**
+   * The combinators used to control which names are imported or exported.
+   */
+  NodeList<Combinator> _combinators;
+
+  /**
+   * The semicolon terminating the directive.
+   */
+  Token semicolon;
+
+  /**
+   * Initialize a newly created namespace directive. Either or both of the
+   * [comment] and [metadata] can be `null` if the directive does not have the
+   * corresponding attribute. The list of [combinators] can be `null` if there
+   * are no combinators.
+   */
+  NamespaceDirective(Comment comment, List<Annotation> metadata, this.keyword,
+      StringLiteral libraryUri, List<Combinator> combinators, this.semicolon)
+      : super(comment, metadata, libraryUri) {
+    _combinators = new NodeList<Combinator>(this, combinators);
+  }
+
+  /**
+   * Return the combinators used to control how names are imported or exported.
+   */
+  NodeList<Combinator> get combinators => _combinators;
+
+  @override
+  Token get endToken => semicolon;
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata => keyword;
+
+  @override
+  LibraryElement get uriElement;
+}
+
+/**
+ * The "native" clause in an class declaration.
+ *
+ * > nativeClause ::=
+ * >     'native' [StringLiteral]
+ */
+class NativeClause extends AstNode {
+  /**
+   * The token representing the 'native' keyword.
+   */
+  Token nativeKeyword;
+
+  /**
+   * The name of the native object that implements the class.
+   */
+  StringLiteral _name;
+
+  /**
+   * Initialize a newly created native clause.
+   */
+  NativeClause(this.nativeKeyword, StringLiteral name) {
+    _name = _becomeParentOf(name);
+  }
+
+  @override
+  Token get beginToken => nativeKeyword;
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(nativeKeyword)..add(_name);
+
+  @override
+  Token get endToken => _name.endToken;
+
+  /**
+   * Get the token representing the 'native' keyword.
+   */
+  @deprecated // Use "this.nativeKeyword"
+  Token get keyword => nativeKeyword;
+
+  /**
+   * Set the token representing the 'native' keyword to the given [token].
+   */
+  @deprecated // Use "this.nativeKeyword"
+  set keyword(Token token) {
+    nativeKeyword = token;
+  }
+
+  /**
+   * Return the name of the native object that implements the class.
+   */
+  StringLiteral get name => _name;
+
+  /**
+   * Sets the name of the native object that implements the class to the given
+   * [name].
+   */
+  void set name(StringLiteral name) {
+    _name = _becomeParentOf(name);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitNativeClause(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_name, visitor);
+  }
+}
+
+/**
+ * A function body that consists of a native keyword followed by a string
+ * literal.
+ *
+ * > nativeFunctionBody ::=
+ * >     'native' [SimpleStringLiteral] ';'
+ */
+class NativeFunctionBody extends FunctionBody {
+  /**
+   * The token representing 'native' that marks the start of the function body.
+   */
+  Token nativeKeyword;
+
+  /**
+   * The string literal, after the 'native' token.
+   */
+  StringLiteral _stringLiteral;
+
+  /**
+   * The token representing the semicolon that marks the end of the function
+   * body.
+   */
+  Token semicolon;
+
+  /**
+   * Initialize a newly created function body consisting of the 'native' token,
+   * a string literal, and a semicolon.
+   */
+  NativeFunctionBody(
+      this.nativeKeyword, StringLiteral stringLiteral, this.semicolon) {
+    _stringLiteral = _becomeParentOf(stringLiteral);
+  }
+
+  @override
+  Token get beginToken => nativeKeyword;
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(nativeKeyword)
+    ..add(_stringLiteral)
+    ..add(semicolon);
+
+  @override
+  Token get endToken => semicolon;
+
+  /**
+   * Return the token representing 'native' that marks the start of the function
+   * body.
+   */
+  @deprecated // Use "this.nativeKeyword"
+  Token get nativeToken => nativeKeyword;
+
+  /**
+   * Set the token representing 'native' that marks the start of the function
+   * body to the given [token].
+   */
+  @deprecated // Use "this.nativeKeyword"
+  set nativeToken(Token token) {
+    nativeKeyword = token;
+  }
+
+  /**
+   * Return the string literal representing the string after the 'native' token.
+   */
+  StringLiteral get stringLiteral => _stringLiteral;
+
+  /**
+   * Set the string literal representing the string after the 'native' token to
+   * the given [stringLiteral].
+   */
+  void set stringLiteral(StringLiteral stringLiteral) {
+    _stringLiteral = _becomeParentOf(stringLiteral);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitNativeFunctionBody(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_stringLiteral, visitor);
+  }
+}
+
+/**
+ * A list of AST nodes that have a common parent.
+ */
+class NodeList<E extends AstNode> extends Object with ListMixin<E> {
+  /**
+   * The node that is the parent of each of the elements in the list.
+   */
+  AstNode owner;
+
+  /**
+   * The elements contained in the list.
+   */
+  List<E> _elements = <E>[];
+
+  /**
+   * Initialize a newly created list of nodes such that all of the nodes that
+   * are added to the list will have their parent set to the given [owner]. The
+   * list will initially be populated with the given [elements].
+   */
+  NodeList(this.owner, [List<E> elements]) {
+    addAll(elements);
+  }
+
+  /**
+   * Return the first token included in this node list's source range, or `null`
+   * if the list is empty.
+   */
+  Token get beginToken {
+    if (_elements.length == 0) {
+      return null;
+    }
+    return _elements[0].beginToken;
+  }
+
+  /**
+   * Return the last token included in this node list's source range, or `null`
+   * if the list is empty.
+   */
+  Token get endToken {
+    int length = _elements.length;
+    if (length == 0) {
+      return null;
+    }
+    return _elements[length - 1].endToken;
+  }
+
+  int get length => _elements.length;
+
+  @deprecated // Never intended for public use.
+  void set length(int value) {
+    throw new UnsupportedError("Cannot resize NodeList.");
+  }
+
+  E operator [](int index) {
+    if (index < 0 || index >= _elements.length) {
+      throw new RangeError("Index: $index, Size: ${_elements.length}");
+    }
+    return _elements[index];
+  }
+
+  void operator []=(int index, E node) {
+    if (index < 0 || index >= _elements.length) {
+      throw new RangeError("Index: $index, Size: ${_elements.length}");
+    }
+    owner._becomeParentOf(node);
+    _elements[index] = node;
+  }
+
+  /**
+   * Use the given [visitor] to visit each of the nodes in this list.
+   */
+  accept(AstVisitor visitor) {
+    int length = _elements.length;
+    for (var i = 0; i < length; i++) {
+      _elements[i].accept(visitor);
+    }
+  }
+
+  @override
+  void add(E node) {
+    insert(length, node);
+  }
+
+  @override
+  bool addAll(Iterable<E> nodes) {
+    if (nodes != null && !nodes.isEmpty) {
+      _elements.addAll(nodes);
+      for (E node in nodes) {
+        owner._becomeParentOf(node);
+      }
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  void clear() {
+    _elements = <E>[];
+  }
+
+  @override
+  void insert(int index, E node) {
+    int length = _elements.length;
+    if (index < 0 || index > length) {
+      throw new RangeError("Index: $index, Size: ${_elements.length}");
+    }
+    owner._becomeParentOf(node);
+    if (length == 0) {
+      _elements.add(node);
+    } else {
+      _elements.insert(index, node);
+    }
+  }
+
+  @override
+  E removeAt(int index) {
+    if (index < 0 || index >= _elements.length) {
+      throw new RangeError("Index: $index, Size: ${_elements.length}");
+    }
+    E removedNode = _elements[index];
+    _elements.removeAt(index);
+    return removedNode;
+  }
+
+  /**
+   * Create an empty list with the given [owner].
+   */
+  @deprecated // Use "new NodeList<E>(owner)"
+  static NodeList create(AstNode owner) => new NodeList(owner);
+}
+
+/**
+ * An object used to locate the [AstNode] associated with a source range, given
+ * the AST structure built from the source. More specifically, they will return
+ * the [AstNode] with the shortest length whose source range completely
+ * encompasses the specified range.
+ */
+class NodeLocator extends UnifyingAstVisitor<Object> {
+  /**
+   * The start offset of the range used to identify the node.
+   */
+  int _startOffset = 0;
+
+  /**
+   * The end offset of the range used to identify the node.
+   */
+  int _endOffset = 0;
+
+  /**
+   * The element that was found that corresponds to the given source range, or
+   * `null` if there is no such element.
+   */
+  AstNode _foundNode;
+
+  /**
+   * Initialize a newly created locator to locate an [AstNode] by locating the
+   * node within an AST structure that corresponds to the given range of
+   * characters (between the [startOffset] and [endOffset] in the source.
+   */
+  NodeLocator(int startOffset, [int endOffset])
+      : this._startOffset = startOffset,
+        this._endOffset = endOffset == null ? startOffset : endOffset;
+
+  /**
+   * Initialize a newly created locator to locate an [AstNode] by locating the
+   * node within an AST structure that corresponds to the given [offset] in the
+   * source.
+   */
+  @deprecated // Use new NodeLocator(offset)
+  NodeLocator.con1(int offset) : this(offset);
+
+  /**
+   * Initialize a newly created locator to locate an [AstNode] by locating the
+   * node within an AST structure that corresponds to the given range of
+   * characters (between the [startOffset] and [endOffset] in the source.
+   */
+  @deprecated // Use new NodeLocator(startOffset, endOffset)
+  NodeLocator.con2(this._startOffset, this._endOffset);
+
+  /**
+   * Return the node that was found that corresponds to the given source range
+   * or `null` if there is no such node.
+   */
+  AstNode get foundNode => _foundNode;
+
+  /**
+   * Search within the given AST [node] for an identifier representing an
+   * element in the specified source range. Return the element that was found,
+   * or `null` if no element was found.
+   */
+  AstNode searchWithin(AstNode node) {
+    if (node == null) {
+      return null;
+    }
+    try {
+      node.accept(this);
+    } on NodeLocator_NodeFoundException {
+      // A node with the right source position was found.
+    } catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logInformation(
+          "Unable to locate element at offset ($_startOffset - $_endOffset)",
+          new CaughtException(exception, stackTrace));
+      return null;
+    }
+    return _foundNode;
+  }
+
+  @override
+  Object visitNode(AstNode node) {
+    Token beginToken = node.beginToken;
+    Token endToken = node.endToken;
+    // Don't include synthetic tokens.
+    while (endToken != beginToken) {
+      if (endToken.type == TokenType.EOF || !endToken.isSynthetic) {
+        break;
+      }
+      endToken = endToken.previous;
+    }
+    int end = endToken.end;
+    int start = node.offset;
+    if (end < _startOffset) {
+      return null;
+    }
+    if (start > _endOffset) {
+      return null;
+    }
+    try {
+      node.visitChildren(this);
+    } on NodeLocator_NodeFoundException {
+      rethrow;
+    } catch (exception, stackTrace) {
+      // Ignore the exception and proceed in order to visit the rest of the
+      // structure.
+      AnalysisEngine.instance.logger.logInformation(
+          "Exception caught while traversing an AST structure.",
+          new CaughtException(exception, stackTrace));
+    }
+    if (start <= _startOffset && _endOffset <= end) {
+      _foundNode = node;
+      throw new NodeLocator_NodeFoundException();
+    }
+    return null;
+  }
+}
+
+/**
+ * An exception used by [NodeLocator] to cancel visiting after a node has been
+ * found.
+ */
+class NodeLocator_NodeFoundException extends RuntimeException {}
+
+/**
+ * An object that will replace one child node in an AST node with another node.
+ */
+class NodeReplacer implements AstVisitor<bool> {
+  /**
+   * The node being replaced.
+   */
+  final AstNode _oldNode;
+
+  /**
+   * The node that is replacing the old node.
+   */
+  final AstNode _newNode;
+
+  /**
+   * Initialize a newly created node locator to replace the [_oldNode] with the
+   * [_newNode].
+   */
+  NodeReplacer(this._oldNode, this._newNode);
+
+  @override
+  bool visitAdjacentStrings(AdjacentStrings node) {
+    if (_replaceInList(node.strings)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  bool visitAnnotatedNode(AnnotatedNode node) {
+    if (identical(node.documentationComment, _oldNode)) {
+      node.documentationComment = _newNode as Comment;
+      return true;
+    } else if (_replaceInList(node.metadata)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitAnnotation(Annotation node) {
+    if (identical(node.arguments, _oldNode)) {
+      node.arguments = _newNode as ArgumentList;
+      return true;
+    } else if (identical(node.constructorName, _oldNode)) {
+      node.constructorName = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.name, _oldNode)) {
+      node.name = _newNode as Identifier;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitArgumentList(ArgumentList node) {
+    if (_replaceInList(node.arguments)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitAsExpression(AsExpression node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    } else if (identical(node.type, _oldNode)) {
+      node.type = _newNode as TypeName;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitAssertStatement(AssertStatement node) {
+    if (identical(node.condition, _oldNode)) {
+      node.condition = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitAssignmentExpression(AssignmentExpression node) {
+    if (identical(node.leftHandSide, _oldNode)) {
+      node.leftHandSide = _newNode as Expression;
+      return true;
+    } else if (identical(node.rightHandSide, _oldNode)) {
+      node.rightHandSide = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitAwaitExpression(AwaitExpression node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitBinaryExpression(BinaryExpression node) {
+    if (identical(node.leftOperand, _oldNode)) {
+      node.leftOperand = _newNode as Expression;
+      return true;
+    } else if (identical(node.rightOperand, _oldNode)) {
+      node.rightOperand = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitBlock(Block node) {
+    if (_replaceInList(node.statements)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitBlockFunctionBody(BlockFunctionBody node) {
+    if (identical(node.block, _oldNode)) {
+      node.block = _newNode as Block;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitBooleanLiteral(BooleanLiteral node) => visitNode(node);
+
+  @override
+  bool visitBreakStatement(BreakStatement node) {
+    if (identical(node.label, _oldNode)) {
+      node.label = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitCascadeExpression(CascadeExpression node) {
+    if (identical(node.target, _oldNode)) {
+      node.target = _newNode as Expression;
+      return true;
+    } else if (_replaceInList(node.cascadeSections)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitCatchClause(CatchClause node) {
+    if (identical(node.exceptionType, _oldNode)) {
+      node.exceptionType = _newNode as TypeName;
+      return true;
+    } else if (identical(node.exceptionParameter, _oldNode)) {
+      node.exceptionParameter = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.stackTraceParameter, _oldNode)) {
+      node.stackTraceParameter = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitClassDeclaration(ClassDeclaration node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.typeParameters, _oldNode)) {
+      node.typeParameters = _newNode as TypeParameterList;
+      return true;
+    } else if (identical(node.extendsClause, _oldNode)) {
+      node.extendsClause = _newNode as ExtendsClause;
+      return true;
+    } else if (identical(node.withClause, _oldNode)) {
+      node.withClause = _newNode as WithClause;
+      return true;
+    } else if (identical(node.implementsClause, _oldNode)) {
+      node.implementsClause = _newNode as ImplementsClause;
+      return true;
+    } else if (identical(node.nativeClause, _oldNode)) {
+      node.nativeClause = _newNode as NativeClause;
+      return true;
+    } else if (_replaceInList(node.members)) {
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitClassTypeAlias(ClassTypeAlias node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.typeParameters, _oldNode)) {
+      node.typeParameters = _newNode as TypeParameterList;
+      return true;
+    } else if (identical(node.superclass, _oldNode)) {
+      node.superclass = _newNode as TypeName;
+      return true;
+    } else if (identical(node.withClause, _oldNode)) {
+      node.withClause = _newNode as WithClause;
+      return true;
+    } else if (identical(node.implementsClause, _oldNode)) {
+      node.implementsClause = _newNode as ImplementsClause;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitComment(Comment node) {
+    if (_replaceInList(node.references)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitCommentReference(CommentReference node) {
+    if (identical(node.identifier, _oldNode)) {
+      node.identifier = _newNode as Identifier;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitCompilationUnit(CompilationUnit node) {
+    if (identical(node.scriptTag, _oldNode)) {
+      node.scriptTag = _newNode as ScriptTag;
+      return true;
+    } else if (_replaceInList(node.directives)) {
+      return true;
+    } else if (_replaceInList(node.declarations)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitConditionalExpression(ConditionalExpression node) {
+    if (identical(node.condition, _oldNode)) {
+      node.condition = _newNode as Expression;
+      return true;
+    } else if (identical(node.thenExpression, _oldNode)) {
+      node.thenExpression = _newNode as Expression;
+      return true;
+    } else if (identical(node.elseExpression, _oldNode)) {
+      node.elseExpression = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitConstructorDeclaration(ConstructorDeclaration node) {
+    if (identical(node.returnType, _oldNode)) {
+      node.returnType = _newNode as Identifier;
+      return true;
+    } else if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.parameters, _oldNode)) {
+      node.parameters = _newNode as FormalParameterList;
+      return true;
+    } else if (identical(node.redirectedConstructor, _oldNode)) {
+      node.redirectedConstructor = _newNode as ConstructorName;
+      return true;
+    } else if (identical(node.body, _oldNode)) {
+      node.body = _newNode as FunctionBody;
+      return true;
+    } else if (_replaceInList(node.initializers)) {
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    if (identical(node.fieldName, _oldNode)) {
+      node.fieldName = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitConstructorName(ConstructorName node) {
+    if (identical(node.type, _oldNode)) {
+      node.type = _newNode as TypeName;
+      return true;
+    } else if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitContinueStatement(ContinueStatement node) {
+    if (identical(node.label, _oldNode)) {
+      node.label = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitDeclaredIdentifier(DeclaredIdentifier node) {
+    if (identical(node.type, _oldNode)) {
+      node.type = _newNode as TypeName;
+      return true;
+    } else if (identical(node.identifier, _oldNode)) {
+      node.identifier = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitDefaultFormalParameter(DefaultFormalParameter node) {
+    if (identical(node.parameter, _oldNode)) {
+      node.parameter = _newNode as NormalFormalParameter;
+      return true;
+    } else if (identical(node.defaultValue, _oldNode)) {
+      node.defaultValue = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitDoStatement(DoStatement node) {
+    if (identical(node.body, _oldNode)) {
+      node.body = _newNode as Statement;
+      return true;
+    } else if (identical(node.condition, _oldNode)) {
+      node.condition = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitDoubleLiteral(DoubleLiteral node) => visitNode(node);
+
+  @override
+  bool visitEmptyFunctionBody(EmptyFunctionBody node) => visitNode(node);
+
+  @override
+  bool visitEmptyStatement(EmptyStatement node) => visitNode(node);
+
+  @override
+  bool visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitEnumDeclaration(EnumDeclaration node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    } else if (_replaceInList(node.constants)) {
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitExportDirective(ExportDirective node) =>
+      visitNamespaceDirective(node);
+
+  @override
+  bool visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitExpressionStatement(ExpressionStatement node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitExtendsClause(ExtendsClause node) {
+    if (identical(node.superclass, _oldNode)) {
+      node.superclass = _newNode as TypeName;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitFieldDeclaration(FieldDeclaration node) {
+    if (identical(node.fields, _oldNode)) {
+      node.fields = _newNode as VariableDeclarationList;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitFieldFormalParameter(FieldFormalParameter node) {
+    if (identical(node.type, _oldNode)) {
+      node.type = _newNode as TypeName;
+      return true;
+    } else if (identical(node.parameters, _oldNode)) {
+      node.parameters = _newNode as FormalParameterList;
+      return true;
+    }
+    return visitNormalFormalParameter(node);
+  }
+
+  @override
+  bool visitForEachStatement(ForEachStatement node) {
+    if (identical(node.loopVariable, _oldNode)) {
+      node.loopVariable = _newNode as DeclaredIdentifier;
+      return true;
+    } else if (identical(node.identifier, _oldNode)) {
+      node.identifier = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.iterable, _oldNode)) {
+      node.iterable = _newNode as Expression;
+      return true;
+    } else if (identical(node.body, _oldNode)) {
+      node.body = _newNode as Statement;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitFormalParameterList(FormalParameterList node) {
+    if (_replaceInList(node.parameters)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitForStatement(ForStatement node) {
+    if (identical(node.variables, _oldNode)) {
+      node.variables = _newNode as VariableDeclarationList;
+      return true;
+    } else if (identical(node.initialization, _oldNode)) {
+      node.initialization = _newNode as Expression;
+      return true;
+    } else if (identical(node.condition, _oldNode)) {
+      node.condition = _newNode as Expression;
+      return true;
+    } else if (identical(node.body, _oldNode)) {
+      node.body = _newNode as Statement;
+      return true;
+    } else if (_replaceInList(node.updaters)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitFunctionDeclaration(FunctionDeclaration node) {
+    if (identical(node.returnType, _oldNode)) {
+      node.returnType = _newNode as TypeName;
+      return true;
+    } else if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.functionExpression, _oldNode)) {
+      node.functionExpression = _newNode as FunctionExpression;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    if (identical(node.functionDeclaration, _oldNode)) {
+      node.functionDeclaration = _newNode as FunctionDeclaration;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitFunctionExpression(FunctionExpression node) {
+    if (identical(node.parameters, _oldNode)) {
+      node.parameters = _newNode as FormalParameterList;
+      return true;
+    } else if (identical(node.body, _oldNode)) {
+      node.body = _newNode as FunctionBody;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    if (identical(node.function, _oldNode)) {
+      node.function = _newNode as Expression;
+      return true;
+    } else if (identical(node.argumentList, _oldNode)) {
+      node.argumentList = _newNode as ArgumentList;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitFunctionTypeAlias(FunctionTypeAlias node) {
+    if (identical(node.returnType, _oldNode)) {
+      node.returnType = _newNode as TypeName;
+      return true;
+    } else if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.typeParameters, _oldNode)) {
+      node.typeParameters = _newNode as TypeParameterList;
+      return true;
+    } else if (identical(node.parameters, _oldNode)) {
+      node.parameters = _newNode as FormalParameterList;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    if (identical(node.returnType, _oldNode)) {
+      node.returnType = _newNode as TypeName;
+      return true;
+    } else if (identical(node.parameters, _oldNode)) {
+      node.parameters = _newNode as FormalParameterList;
+      return true;
+    }
+    return visitNormalFormalParameter(node);
+  }
+
+  @override
+  bool visitHideCombinator(HideCombinator node) {
+    if (_replaceInList(node.hiddenNames)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitIfStatement(IfStatement node) {
+    if (identical(node.condition, _oldNode)) {
+      node.condition = _newNode as Expression;
+      return true;
+    } else if (identical(node.thenStatement, _oldNode)) {
+      node.thenStatement = _newNode as Statement;
+      return true;
+    } else if (identical(node.elseStatement, _oldNode)) {
+      node.elseStatement = _newNode as Statement;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitImplementsClause(ImplementsClause node) {
+    if (_replaceInList(node.interfaces)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitImportDirective(ImportDirective node) {
+    if (identical(node.prefix, _oldNode)) {
+      node.prefix = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitNamespaceDirective(node);
+  }
+
+  @override
+  bool visitIndexExpression(IndexExpression node) {
+    if (identical(node.target, _oldNode)) {
+      node.target = _newNode as Expression;
+      return true;
+    } else if (identical(node.index, _oldNode)) {
+      node.index = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitInstanceCreationExpression(InstanceCreationExpression node) {
+    if (identical(node.constructorName, _oldNode)) {
+      node.constructorName = _newNode as ConstructorName;
+      return true;
+    } else if (identical(node.argumentList, _oldNode)) {
+      node.argumentList = _newNode as ArgumentList;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitIntegerLiteral(IntegerLiteral node) => visitNode(node);
+
+  @override
+  bool visitInterpolationExpression(InterpolationExpression node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitInterpolationString(InterpolationString node) => visitNode(node);
+
+  @override
+  bool visitIsExpression(IsExpression node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    } else if (identical(node.type, _oldNode)) {
+      node.type = _newNode as TypeName;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitLabel(Label node) {
+    if (identical(node.label, _oldNode)) {
+      node.label = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitLabeledStatement(LabeledStatement node) {
+    if (identical(node.statement, _oldNode)) {
+      node.statement = _newNode as Statement;
+      return true;
+    } else if (_replaceInList(node.labels)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitLibraryDirective(LibraryDirective node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as LibraryIdentifier;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitLibraryIdentifier(LibraryIdentifier node) {
+    if (_replaceInList(node.components)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitListLiteral(ListLiteral node) {
+    if (_replaceInList(node.elements)) {
+      return true;
+    }
+    return visitTypedLiteral(node);
+  }
+
+  @override
+  bool visitMapLiteral(MapLiteral node) {
+    if (_replaceInList(node.entries)) {
+      return true;
+    }
+    return visitTypedLiteral(node);
+  }
+
+  @override
+  bool visitMapLiteralEntry(MapLiteralEntry node) {
+    if (identical(node.key, _oldNode)) {
+      node.key = _newNode as Expression;
+      return true;
+    } else if (identical(node.value, _oldNode)) {
+      node.value = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitMethodDeclaration(MethodDeclaration node) {
+    if (identical(node.returnType, _oldNode)) {
+      node.returnType = _newNode as TypeName;
+      return true;
+    } else if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.parameters, _oldNode)) {
+      node.parameters = _newNode as FormalParameterList;
+      return true;
+    } else if (identical(node.body, _oldNode)) {
+      node.body = _newNode as FunctionBody;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitMethodInvocation(MethodInvocation node) {
+    if (identical(node.target, _oldNode)) {
+      node.target = _newNode as Expression;
+      return true;
+    } else if (identical(node.methodName, _oldNode)) {
+      node.methodName = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.argumentList, _oldNode)) {
+      node.argumentList = _newNode as ArgumentList;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitNamedExpression(NamedExpression node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as Label;
+      return true;
+    } else if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  bool visitNamespaceDirective(NamespaceDirective node) {
+    if (_replaceInList(node.combinators)) {
+      return true;
+    }
+    return visitUriBasedDirective(node);
+  }
+
+  @override
+  bool visitNativeClause(NativeClause node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as StringLiteral;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitNativeFunctionBody(NativeFunctionBody node) {
+    if (identical(node.stringLiteral, _oldNode)) {
+      node.stringLiteral = _newNode as StringLiteral;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  bool visitNode(AstNode node) {
+    throw new IllegalArgumentException(
+        "The old node is not a child of it's parent");
+  }
+
+  bool visitNormalFormalParameter(NormalFormalParameter node) {
+    if (identical(node.documentationComment, _oldNode)) {
+      node.documentationComment = _newNode as Comment;
+      return true;
+    } else if (identical(node.identifier, _oldNode)) {
+      node.identifier = _newNode as SimpleIdentifier;
+      return true;
+    } else if (_replaceInList(node.metadata)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitNullLiteral(NullLiteral node) => visitNode(node);
+
+  @override
+  bool visitParenthesizedExpression(ParenthesizedExpression node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitPartDirective(PartDirective node) => visitUriBasedDirective(node);
+
+  @override
+  bool visitPartOfDirective(PartOfDirective node) {
+    if (identical(node.libraryName, _oldNode)) {
+      node.libraryName = _newNode as LibraryIdentifier;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitPostfixExpression(PostfixExpression node) {
+    if (identical(node.operand, _oldNode)) {
+      node.operand = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitPrefixedIdentifier(PrefixedIdentifier node) {
+    if (identical(node.prefix, _oldNode)) {
+      node.prefix = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.identifier, _oldNode)) {
+      node.identifier = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitPrefixExpression(PrefixExpression node) {
+    if (identical(node.operand, _oldNode)) {
+      node.operand = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitPropertyAccess(PropertyAccess node) {
+    if (identical(node.target, _oldNode)) {
+      node.target = _newNode as Expression;
+      return true;
+    } else if (identical(node.propertyName, _oldNode)) {
+      node.propertyName = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    if (identical(node.constructorName, _oldNode)) {
+      node.constructorName = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.argumentList, _oldNode)) {
+      node.argumentList = _newNode as ArgumentList;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitRethrowExpression(RethrowExpression node) => visitNode(node);
+
+  @override
+  bool visitReturnStatement(ReturnStatement node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
+
+  @override
+  bool visitShowCombinator(ShowCombinator node) {
+    if (_replaceInList(node.shownNames)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitSimpleFormalParameter(SimpleFormalParameter node) {
+    if (identical(node.type, _oldNode)) {
+      node.type = _newNode as TypeName;
+      return true;
+    }
+    return visitNormalFormalParameter(node);
+  }
+
+  @override
+  bool visitSimpleIdentifier(SimpleIdentifier node) => visitNode(node);
+
+  @override
+  bool visitSimpleStringLiteral(SimpleStringLiteral node) => visitNode(node);
+
+  @override
+  bool visitStringInterpolation(StringInterpolation node) {
+    if (_replaceInList(node.elements)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    if (identical(node.constructorName, _oldNode)) {
+      node.constructorName = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.argumentList, _oldNode)) {
+      node.argumentList = _newNode as ArgumentList;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitSuperExpression(SuperExpression node) => visitNode(node);
+
+  @override
+  bool visitSwitchCase(SwitchCase node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    }
+    return visitSwitchMember(node);
+  }
+
+  @override
+  bool visitSwitchDefault(SwitchDefault node) => visitSwitchMember(node);
+
+  bool visitSwitchMember(SwitchMember node) {
+    if (_replaceInList(node.labels)) {
+      return true;
+    } else if (_replaceInList(node.statements)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitSwitchStatement(SwitchStatement node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    } else if (_replaceInList(node.members)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitSymbolLiteral(SymbolLiteral node) => visitNode(node);
+
+  @override
+  bool visitThisExpression(ThisExpression node) => visitNode(node);
+
+  @override
+  bool visitThrowExpression(ThrowExpression node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    if (identical(node.variables, _oldNode)) {
+      node.variables = _newNode as VariableDeclarationList;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitTryStatement(TryStatement node) {
+    if (identical(node.body, _oldNode)) {
+      node.body = _newNode as Block;
+      return true;
+    } else if (identical(node.finallyBlock, _oldNode)) {
+      node.finallyBlock = _newNode as Block;
+      return true;
+    } else if (_replaceInList(node.catchClauses)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitTypeArgumentList(TypeArgumentList node) {
+    if (_replaceInList(node.arguments)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  bool visitTypedLiteral(TypedLiteral node) {
+    if (identical(node.typeArguments, _oldNode)) {
+      node.typeArguments = _newNode as TypeArgumentList;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitTypeName(TypeName node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as Identifier;
+      return true;
+    } else if (identical(node.typeArguments, _oldNode)) {
+      node.typeArguments = _newNode as TypeArgumentList;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitTypeParameter(TypeParameter node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.bound, _oldNode)) {
+      node.bound = _newNode as TypeName;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitTypeParameterList(TypeParameterList node) {
+    if (_replaceInList(node.typeParameters)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  bool visitUriBasedDirective(UriBasedDirective node) {
+    if (identical(node.uri, _oldNode)) {
+      node.uri = _newNode as StringLiteral;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitVariableDeclaration(VariableDeclaration node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.initializer, _oldNode)) {
+      node.initializer = _newNode as Expression;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitVariableDeclarationList(VariableDeclarationList node) {
+    if (identical(node.type, _oldNode)) {
+      node.type = _newNode as TypeName;
+      return true;
+    } else if (_replaceInList(node.variables)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    if (identical(node.variables, _oldNode)) {
+      node.variables = _newNode as VariableDeclarationList;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitWhileStatement(WhileStatement node) {
+    if (identical(node.condition, _oldNode)) {
+      node.condition = _newNode as Expression;
+      return true;
+    } else if (identical(node.body, _oldNode)) {
+      node.body = _newNode as Statement;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitWithClause(WithClause node) {
+    if (_replaceInList(node.mixinTypes)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitYieldStatement(YieldStatement node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  bool _replaceInList(NodeList list) {
+    int count = list.length;
+    for (int i = 0; i < count; i++) {
+      if (identical(_oldNode, list[i])) {
+        list[i] = _newNode;
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Replace the [oldNode] with the [newNode] in the AST structure containing
+   * the old node. Return `true` if the replacement was successful.
+   *
+   * Throws an [IllegalArgumentException] if either node is `null`, if the old
+   * node does not have a parent node, or if the AST structure has been
+   * corrupted.
+   */
+  static bool replace(AstNode oldNode, AstNode newNode) {
+    if (oldNode == null || newNode == null) {
+      throw new IllegalArgumentException(
+          "The old and new nodes must be non-null");
+    } else if (identical(oldNode, newNode)) {
+      return true;
+    }
+    AstNode parent = oldNode.parent;
+    if (parent == null) {
+      throw new IllegalArgumentException(
+          "The old node is not a child of another node");
+    }
+    NodeReplacer replacer = new NodeReplacer(oldNode, newNode);
+    return parent.accept(replacer);
+  }
+}
+
+/**
+ * A formal parameter that is required (is not optional).
+ *
+ * > normalFormalParameter ::=
+ * >     [FunctionTypedFormalParameter]
+ * >   | [FieldFormalParameter]
+ * >   | [SimpleFormalParameter]
+ */
+abstract class NormalFormalParameter extends FormalParameter {
+  /**
+   * The documentation comment associated with this parameter, or `null` if this
+   * parameter does not have a documentation comment associated with it.
+   */
+  Comment _comment;
+
+  /**
+   * The annotations associated with this parameter.
+   */
+  NodeList<Annotation> _metadata;
+
+  /**
+   * The name of the parameter being declared.
+   */
+  SimpleIdentifier _identifier;
+
+  /**
+   * Initialize a newly created formal parameter. Either or both of the
+   * [comment] and [metadata] can be `null` if the parameter does not have the
+   * corresponding attribute.
+   */
+  NormalFormalParameter(
+      Comment comment, List<Annotation> metadata, SimpleIdentifier identifier) {
+    _comment = _becomeParentOf(comment);
+    _metadata = new NodeList<Annotation>(this, metadata);
+    _identifier = _becomeParentOf(identifier);
+  }
+
+  /**
+   * Return the documentation comment associated with this parameter, or `null`
+   * if this parameter does not have a documentation comment associated with it.
+   */
+  Comment get documentationComment => _comment;
+
+  /**
+   * Set the documentation comment associated with this parameter to the given
+   * [comment].
+   */
+  void set documentationComment(Comment comment) {
+    _comment = _becomeParentOf(comment);
+  }
+
+  @override
+  SimpleIdentifier get identifier => _identifier;
+
+  /**
+   * Set the name of the parameter being declared to the given [identifier].
+   */
+  void set identifier(SimpleIdentifier identifier) {
+    _identifier = _becomeParentOf(identifier);
+  }
+
+  @override
+  ParameterKind get kind {
+    AstNode parent = this.parent;
+    if (parent is DefaultFormalParameter) {
+      return parent.kind;
+    }
+    return ParameterKind.REQUIRED;
+  }
+
+  @override
+  NodeList<Annotation> get metadata => _metadata;
+
+  /**
+   * Set the metadata associated with this node to the given [metadata].
+   */
+  void set metadata(List<Annotation> metadata) {
+    _metadata.clear();
+    _metadata.addAll(metadata);
+  }
+
+  /**
+   * Return a list containing the comment and annotations associated with this
+   * parameter, sorted in lexical order.
+   */
+  List<AstNode> get sortedCommentAndAnnotations {
+    return <AstNode>[]
+      ..add(_comment)
+      ..addAll(_metadata)
+      ..sort(AstNode.LEXICAL_ORDER);
+  }
+
+  ChildEntities get _childEntities {
+    ChildEntities result = new ChildEntities();
+    if (_commentIsBeforeAnnotations()) {
+      result
+        ..add(_comment)
+        ..addAll(_metadata);
+    } else {
+      result.addAll(sortedCommentAndAnnotations);
+    }
+    return result;
+  }
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    //
+    // Note that subclasses are responsible for visiting the identifier because
+    // they often need to visit other nodes before visiting the identifier.
+    //
+    if (_commentIsBeforeAnnotations()) {
+      _safelyVisitChild(_comment, visitor);
+      _metadata.accept(visitor);
+    } else {
+      for (AstNode child in sortedCommentAndAnnotations) {
+        child.accept(visitor);
+      }
+    }
+  }
+
+  /**
+   * Return `true` if the comment is lexically before any annotations.
+   */
+  bool _commentIsBeforeAnnotations() {
+    if (_comment == null || _metadata.isEmpty) {
+      return true;
+    }
+    Annotation firstAnnotation = _metadata[0];
+    return _comment.offset < firstAnnotation.offset;
+  }
+}
+
+/**
+ * A null literal expression.
+ *
+ * > nullLiteral ::=
+ * >     'null'
+ */
+class NullLiteral extends Literal {
+  /**
+   * The token representing the literal.
+   */
+  Token literal;
+
+  /**
+   * Initialize a newly created null literal.
+   */
+  NullLiteral(this.literal);
+
+  @override
+  Token get beginToken => literal;
+
+  @override
+  Iterable get childEntities => new ChildEntities()..add(literal);
+
+  @override
+  Token get endToken => literal;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitNullLiteral(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    // There are no children to visit.
+  }
+}
+
+/**
+ * A parenthesized expression.
+ *
+ * > parenthesizedExpression ::=
+ * >     '(' [Expression] ')'
+ */
+class ParenthesizedExpression extends Expression {
+  /**
+   * The left parenthesis.
+   */
+  Token leftParenthesis;
+
+  /**
+   * The expression within the parentheses.
+   */
+  Expression _expression;
+
+  /**
+   * The right parenthesis.
+   */
+  Token rightParenthesis;
+
+  /**
+   * Initialize a newly created parenthesized expression.
+   */
+  ParenthesizedExpression(
+      this.leftParenthesis, Expression expression, this.rightParenthesis) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  @override
+  Token get beginToken => leftParenthesis;
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(leftParenthesis)
+    ..add(_expression)
+    ..add(rightParenthesis);
+
+  @override
+  Token get endToken => rightParenthesis;
+
+  /**
+   * Return the expression within the parentheses.
+   */
+  Expression get expression => _expression;
+
+  /**
+   * Set the expression within the parentheses to the given [expression].
+   */
+  void set expression(Expression expression) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  @override
+  int get precedence => 15;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitParenthesizedExpression(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_expression, visitor);
+  }
+}
+
+/**
+ * A part directive.
+ *
+ * > partDirective ::=
+ * >     [Annotation] 'part' [StringLiteral] ';'
+ */
+class PartDirective extends UriBasedDirective {
+  /**
+   * The token representing the 'part' keyword.
+   */
+  Token partKeyword;
+
+  /**
+   * The semicolon terminating the directive.
+   */
+  Token semicolon;
+
+  /**
+   * Initialize a newly created part directive. Either or both of the [comment]
+   * and [metadata] can be `null` if the directive does not have the
+   * corresponding attribute.
+   */
+  PartDirective(Comment comment, List<Annotation> metadata, this.partKeyword,
+      StringLiteral partUri, this.semicolon)
+      : super(comment, metadata, partUri);
+
+  @override
+  Iterable get childEntities =>
+      super._childEntities..add(partKeyword)..add(_uri)..add(semicolon);
+
+  @override
+  Token get endToken => semicolon;
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata => partKeyword;
+
+  @override
+  Token get keyword => partKeyword;
+
+  /**
+   * Return the token representing the 'part' token.
+   */
+  @deprecated // Use "this.partKeyword"
+  Token get partToken => partKeyword;
+
+  /**
+   * Set the token representing the 'part' token to the given [token].
+   */
+  @deprecated // Use "this.partKeyword"
+  set partToken(Token token) {
+    partKeyword = token;
+  }
+
+  @override
+  CompilationUnitElement get uriElement => element as CompilationUnitElement;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitPartDirective(this);
+}
+
+/**
+ * A part-of directive.
+ *
+ * > partOfDirective ::=
+ * >     [Annotation] 'part' 'of' [Identifier] ';'
+ */
+class PartOfDirective extends Directive {
+  /**
+   * The token representing the 'part' keyword.
+   */
+  Token partKeyword;
+
+  /**
+   * The token representing the 'of' keyword.
+   */
+  Token ofKeyword;
+
+  /**
+   * The name of the library that the containing compilation unit is part of.
+   */
+  LibraryIdentifier _libraryName;
+
+  /**
+   * The semicolon terminating the directive.
+   */
+  Token semicolon;
+
+  /**
+   * Initialize a newly created part-of directive. Either or both of the
+   * [comment] and [metadata] can be `null` if the directive does not have the
+   * corresponding attribute.
+   */
+  PartOfDirective(Comment comment, List<Annotation> metadata, this.partKeyword,
+      this.ofKeyword, LibraryIdentifier libraryName, this.semicolon)
+      : super(comment, metadata) {
+    _libraryName = _becomeParentOf(libraryName);
+  }
+
+  @override
+  Iterable get childEntities => super._childEntities
+    ..add(partKeyword)
+    ..add(ofKeyword)
+    ..add(_libraryName)
+    ..add(semicolon);
+
+  @override
+  Token get endToken => semicolon;
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata => partKeyword;
+
+  @override
+  Token get keyword => partKeyword;
+
+  /**
+   * Return the name of the library that the containing compilation unit is part
+   * of.
+   */
+  LibraryIdentifier get libraryName => _libraryName;
+
+  /**
+   * Set the name of the library that the containing compilation unit is part of
+   * to the given [libraryName].
+   */
+  void set libraryName(LibraryIdentifier libraryName) {
+    _libraryName = _becomeParentOf(libraryName);
+  }
+
+  /**
+   * Return the token representing the 'of' token.
+   */
+  @deprecated // Use "this.ofKeyword"
+  Token get ofToken => ofKeyword;
+
+  /**
+   * Set the token representing the 'of' token to the given [token].
+   */
+  @deprecated // Use "this.ofKeyword"
+  set ofToken(Token token) {
+    ofKeyword = token;
+  }
+
+  /**
+   * Return the token representing the 'part' token.
+   */
+  @deprecated // Use "this.partKeyword"
+  Token get partToken => partKeyword;
+
+  /**
+   * Set the token representing the 'part' token to the given [token].
+   */
+  @deprecated // Use "this.partKeyword"
+  set partToken(Token token) {
+    partKeyword = token;
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitPartOfDirective(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_libraryName, visitor);
+  }
+}
+
+/**
+ * A postfix unary expression.
+ *
+ * > postfixExpression ::=
+ * >     [Expression] [Token]
+ */
+class PostfixExpression extends Expression {
+  /**
+   * The expression computing the operand for the operator.
+   */
+  Expression _operand;
+
+  /**
+   * The postfix operator being applied to the operand.
+   */
+  Token operator;
+
+  /**
+   * The element associated with this the operator based on the propagated type
+   * of the operand, or `null` if the AST structure has not been resolved, if
+   * the operator is not user definable, or if the operator could not be
+   * resolved.
+   */
+  MethodElement propagatedElement;
+
+  /**
+   * The element associated with the operator based on the static type of the
+   * operand, or `null` if the AST structure has not been resolved, if the
+   * operator is not user definable, or if the operator could not be resolved.
+   */
+  MethodElement staticElement;
+
+  /**
+   * Initialize a newly created postfix expression.
+   */
+  PostfixExpression(Expression operand, this.operator) {
+    _operand = _becomeParentOf(operand);
+  }
+
+  @override
+  Token get beginToken => _operand.beginToken;
+
+  /**
+   * Return the best element available for this operator. If resolution was able
+   * to find a better element based on type propagation, that element will be
+   * returned. Otherwise, the element found using the result of static analysis
+   * will be returned. If resolution has not been performed, then `null` will be
+   * returned.
+   */
+  MethodElement get bestElement {
+    MethodElement element = propagatedElement;
+    if (element == null) {
+      element = staticElement;
+    }
+    return element;
+  }
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(_operand)..add(operator);
+
+  @override
+  Token get endToken => operator;
+
+  /**
+   * Return the expression computing the operand for the operator.
+   */
+  Expression get operand => _operand;
+
+  /**
+   * Set the expression computing the operand for the operator to the given
+   * [expression].
+   */
+  void set operand(Expression expression) {
+    _operand = _becomeParentOf(expression);
+  }
+
+  @override
+  int get precedence => 15;
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is
+   * known based on propagated type information, then return the parameter
+   * element representing the parameter to which the value of the operand will
+   * be bound. Otherwise, return `null`.
+   */
+  @deprecated // Use "expression.propagatedParameterElement"
+  ParameterElement get propagatedParameterElementForOperand {
+    return _propagatedParameterElementForOperand;
+  }
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is
+   * known based on static type information, then return the parameter element
+   * representing the parameter to which the value of the operand will be bound.
+   * Otherwise, return `null`.
+   */
+  @deprecated // Use "expression.propagatedParameterElement"
+  ParameterElement get staticParameterElementForOperand {
+    return _staticParameterElementForOperand;
+  }
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is
+   * known based on propagated type information, then return the parameter
+   * element representing the parameter to which the value of the operand will
+   * be bound. Otherwise, return `null`.
+   */
+  ParameterElement get _propagatedParameterElementForOperand {
+    if (propagatedElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters = propagatedElement.parameters;
+    if (parameters.length < 1) {
+      return null;
+    }
+    return parameters[0];
+  }
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is
+   * known based on static type information, then return the parameter element
+   * representing the parameter to which the value of the operand will be bound.
+   * Otherwise, return `null`.
+   */
+  ParameterElement get _staticParameterElementForOperand {
+    if (staticElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters = staticElement.parameters;
+    if (parameters.length < 1) {
+      return null;
+    }
+    return parameters[0];
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitPostfixExpression(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_operand, visitor);
+  }
+}
+
+/**
+ * An identifier that is prefixed or an access to an object property where the
+ * target of the property access is a simple identifier.
+ *
+ * > prefixedIdentifier ::=
+ * >     [SimpleIdentifier] '.' [SimpleIdentifier]
+ */
+class PrefixedIdentifier extends Identifier {
+  /**
+   * The prefix associated with the library in which the identifier is defined.
+   */
+  SimpleIdentifier _prefix;
+
+  /**
+   * The period used to separate the prefix from the identifier.
+   */
+  Token period;
+
+  /**
+   * The identifier being prefixed.
+   */
+  SimpleIdentifier _identifier;
+
+  /**
+   * Initialize a newly created prefixed identifier.
+   */
+  PrefixedIdentifier(
+      SimpleIdentifier prefix, this.period, SimpleIdentifier identifier) {
+    _prefix = _becomeParentOf(prefix);
+    _identifier = _becomeParentOf(identifier);
+  }
+
+  @override
+  Token get beginToken => _prefix.beginToken;
+
+  @override
+  Element get bestElement {
+    if (_identifier == null) {
+      return null;
+    }
+    return _identifier.bestElement;
+  }
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(_prefix)..add(period)..add(_identifier);
+
+  @override
+  Token get endToken => _identifier.endToken;
+
+  /**
+   * Return the identifier being prefixed.
+   */
+  SimpleIdentifier get identifier => _identifier;
+
+  /**
+   * Set the identifier being prefixed to the given [identifier].
+   */
+  void set identifier(SimpleIdentifier identifier) {
+    _identifier = _becomeParentOf(identifier);
+  }
+
+  /**
+   * Return `true` if this type is a deferred type. If the AST structure has not
+   * been resolved, then return `false`.
+   *
+   * 15.1 Static Types: A type <i>T</i> is deferred iff it is of the form
+   * </i>p.T</i> where <i>p</i> is a deferred prefix.
+   */
+  bool get isDeferred {
+    Element element = _prefix.staticElement;
+    if (element is! PrefixElement) {
+      return false;
+    }
+    PrefixElement prefixElement = element as PrefixElement;
+    List<ImportElement> imports =
+        prefixElement.enclosingElement.getImportsWithPrefix(prefixElement);
+    if (imports.length != 1) {
+      return false;
+    }
+    return imports[0].isDeferred;
+  }
+
+  @override
+  String get name => "${_prefix.name}.${_identifier.name}";
+
+  @override
+  int get precedence => 15;
+
+  /**
+   * Return the prefix associated with the library in which the identifier is
+   * defined.
+   */
+  SimpleIdentifier get prefix => _prefix;
+
+  /**
+   * Set the prefix associated with the library in which the identifier is
+   * defined to the given [identifier].
+   */
+  void set prefix(SimpleIdentifier identifier) {
+    _prefix = _becomeParentOf(identifier);
+  }
+
+  @override
+  Element get propagatedElement {
+    if (_identifier == null) {
+      return null;
+    }
+    return _identifier.propagatedElement;
+  }
+
+  @override
+  Element get staticElement {
+    if (_identifier == null) {
+      return null;
+    }
+    return _identifier.staticElement;
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitPrefixedIdentifier(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_prefix, visitor);
+    _safelyVisitChild(_identifier, visitor);
+  }
+}
+
+/**
+ * A prefix unary expression.
+ *
+ * > prefixExpression ::=
+ * >     [Token] [Expression]
+ */
+class PrefixExpression extends Expression {
+  /**
+   * The prefix operator being applied to the operand.
+   */
+  Token operator;
+
+  /**
+   * The expression computing the operand for the operator.
+   */
+  Expression _operand;
+
+  /**
+   * The element associated with the operator based on the static type of the
+   * operand, or `null` if the AST structure has not been resolved, if the
+   * operator is not user definable, or if the operator could not be resolved.
+   */
+  MethodElement staticElement;
+
+  /**
+   * The element associated with the operator based on the propagated type of
+   * the operand, or `null` if the AST structure has not been resolved, if the
+   * operator is not user definable, or if the operator could not be resolved.
+   */
+  MethodElement propagatedElement;
+
+  /**
+   * Initialize a newly created prefix expression.
+   */
+  PrefixExpression(this.operator, Expression operand) {
+    _operand = _becomeParentOf(operand);
+  }
+
+  @override
+  Token get beginToken => operator;
+
+  /**
+   * Return the best element available for this operator. If resolution was able
+   * to find a better element based on type propagation, that element will be
+   * returned. Otherwise, the element found using the result of static analysis
+   * will be returned. If resolution has not been performed, then `null` will be
+   * returned.
+   */
+  MethodElement get bestElement {
+    MethodElement element = propagatedElement;
+    if (element == null) {
+      element = staticElement;
+    }
+    return element;
+  }
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(operator)..add(_operand);
+
+  @override
+  Token get endToken => _operand.endToken;
+
+  /**
+   * Return the expression computing the operand for the operator.
+   */
+  Expression get operand => _operand;
+
+  /**
+   * Set the expression computing the operand for the operator to the given
+   * [expression].
+   */
+  void set operand(Expression expression) {
+    _operand = _becomeParentOf(expression);
+  }
+
+  @override
+  int get precedence => 14;
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is
+   * known based on propagated type information, then return the parameter
+   * element representing the parameter to which the value of the operand will
+   * be bound. Otherwise, return `null`.
+   */
+  @deprecated // Use "expression.propagatedParameterElement"
+  ParameterElement get propagatedParameterElementForOperand {
+    return _propagatedParameterElementForOperand;
+  }
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is
+   * known based on static type information, then return the parameter element
+   * representing the parameter to which the value of the operand will be bound.
+   * Otherwise, return `null`.
+   */
+  @deprecated // Use "expression.propagatedParameterElement"
+  ParameterElement get staticParameterElementForOperand {
+    return _staticParameterElementForOperand;
+  }
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is
+   * known based on propagated type information, then return the parameter
+   * element representing the parameter to which the value of the operand will
+   * be bound. Otherwise, return `null`.
+   */
+  ParameterElement get _propagatedParameterElementForOperand {
+    if (propagatedElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters = propagatedElement.parameters;
+    if (parameters.length < 1) {
+      return null;
+    }
+    return parameters[0];
+  }
+
+  /**
+   * If the AST structure has been resolved, and the function being invoked is
+   * known based on static type information, then return the parameter element
+   * representing the parameter to which the value of the operand will be bound.
+   * Otherwise, return `null`.
+   */
+  ParameterElement get _staticParameterElementForOperand {
+    if (staticElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters = staticElement.parameters;
+    if (parameters.length < 1) {
+      return null;
+    }
+    return parameters[0];
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitPrefixExpression(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_operand, visitor);
+  }
+}
+
+/**
+ * The access of a property of an object.
+ *
+ * Note, however, that accesses to properties of objects can also be represented
+ * as [PrefixedIdentifier] nodes in cases where the target is also a simple
+ * identifier.
+ *
+ * > propertyAccess ::=
+ * >     [Expression] '.' [SimpleIdentifier]
+ */
+class PropertyAccess extends Expression {
+  /**
+   * The expression computing the object defining the property being accessed.
+   */
+  Expression _target;
+
+  /**
+   * The property access operator.
+   */
+  Token operator;
+
+  /**
+   * The name of the property being accessed.
+   */
+  SimpleIdentifier _propertyName;
+
+  /**
+   * Initialize a newly created property access expression.
+   */
+  PropertyAccess(
+      Expression target, this.operator, SimpleIdentifier propertyName) {
+    _target = _becomeParentOf(target);
+    _propertyName = _becomeParentOf(propertyName);
+  }
+
+  @override
+  Token get beginToken {
+    if (_target != null) {
+      return _target.beginToken;
+    }
+    return operator;
+  }
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(_target)..add(operator)..add(_propertyName);
+
+  @override
+  Token get endToken => _propertyName.endToken;
+
+  @override
+  bool get isAssignable => true;
+
+  /**
+   * Return `true` if this expression is cascaded. If it is, then the target of
+   * this expression is not stored locally but is stored in the nearest ancestor
+   * that is a [CascadeExpression].
+   */
+  bool get isCascaded =>
+      operator != null && operator.type == TokenType.PERIOD_PERIOD;
+
+  @override
+  int get precedence => 15;
+
+  /**
+   * Return the name of the property being accessed.
+   */
+  SimpleIdentifier get propertyName => _propertyName;
+
+  /**
+   * Set the name of the property being accessed to the given [identifier].
+   */
+  void set propertyName(SimpleIdentifier identifier) {
+    _propertyName = _becomeParentOf(identifier);
+  }
+
+  /**
+   * Return the expression used to compute the receiver of the invocation. If
+   * this invocation is not part of a cascade expression, then this is the same
+   * as [target]. If this invocation is part of a cascade expression, then the
+   * target stored with the cascade expression is returned.
+   */
+  Expression get realTarget {
+    if (isCascaded) {
+      AstNode ancestor = parent;
+      while (ancestor is! CascadeExpression) {
+        if (ancestor == null) {
+          return _target;
+        }
+        ancestor = ancestor.parent;
+      }
+      return (ancestor as CascadeExpression).target;
+    }
+    return _target;
+  }
+
+  /**
+   * Return the expression computing the object defining the property being
+   * accessed, or `null` if this property access is part of a cascade expression.
+   *
+   * Use [realTarget] to get the target independent of whether this is part of a
+   * cascade expression.
+   */
+  Expression get target => _target;
+
+  /**
+   * Set the expression computing the object defining the property being
+   * accessed to the given [expression].
+   */
+  void set target(Expression expression) {
+    _target = _becomeParentOf(expression);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitPropertyAccess(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_target, visitor);
+    _safelyVisitChild(_propertyName, visitor);
+  }
+}
+
+/**
+ * An AST visitor that will recursively visit all of the nodes in an AST
+ * structure. For example, using an instance of this class to visit a [Block]
+ * will also cause all of the statements in the block to be visited.
+ *
+ * Subclasses that override a visit method must either invoke the overridden
+ * visit method or must explicitly ask the visited node to visit its children.
+ * Failure to do so will cause the children of the visited node to not be
+ * visited.
+ */
+class RecursiveAstVisitor<R> implements AstVisitor<R> {
+  @override
+  R visitAdjacentStrings(AdjacentStrings node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitAnnotation(Annotation node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitArgumentList(ArgumentList node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitAsExpression(AsExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitAssertStatement(AssertStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitAssignmentExpression(AssignmentExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitAwaitExpression(AwaitExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitBinaryExpression(BinaryExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitBlock(Block node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitBlockFunctionBody(BlockFunctionBody node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitBooleanLiteral(BooleanLiteral node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitBreakStatement(BreakStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitCascadeExpression(CascadeExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitCatchClause(CatchClause node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitClassDeclaration(ClassDeclaration node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitClassTypeAlias(ClassTypeAlias node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitComment(Comment node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitCommentReference(CommentReference node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitCompilationUnit(CompilationUnit node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitConditionalExpression(ConditionalExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitConstructorDeclaration(ConstructorDeclaration node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitConstructorName(ConstructorName node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitContinueStatement(ContinueStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitDeclaredIdentifier(DeclaredIdentifier node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitDefaultFormalParameter(DefaultFormalParameter node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitDoStatement(DoStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitDoubleLiteral(DoubleLiteral node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitEmptyFunctionBody(EmptyFunctionBody node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitEmptyStatement(EmptyStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitEnumDeclaration(EnumDeclaration node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitExportDirective(ExportDirective node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitExpressionStatement(ExpressionStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitExtendsClause(ExtendsClause node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFieldDeclaration(FieldDeclaration node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFieldFormalParameter(FieldFormalParameter node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitForEachStatement(ForEachStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFormalParameterList(FormalParameterList node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitForStatement(ForStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFunctionDeclaration(FunctionDeclaration node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFunctionExpression(FunctionExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFunctionTypeAlias(FunctionTypeAlias node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitHideCombinator(HideCombinator node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitIfStatement(IfStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitImplementsClause(ImplementsClause node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitImportDirective(ImportDirective node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitIndexExpression(IndexExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitInstanceCreationExpression(InstanceCreationExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitIntegerLiteral(IntegerLiteral node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitInterpolationExpression(InterpolationExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitInterpolationString(InterpolationString node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitIsExpression(IsExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitLabel(Label node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitLabeledStatement(LabeledStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitLibraryDirective(LibraryDirective node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitLibraryIdentifier(LibraryIdentifier node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitListLiteral(ListLiteral node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitMapLiteral(MapLiteral node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitMapLiteralEntry(MapLiteralEntry node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitMethodDeclaration(MethodDeclaration node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitMethodInvocation(MethodInvocation node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitNamedExpression(NamedExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitNativeClause(NativeClause node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitNativeFunctionBody(NativeFunctionBody node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitNullLiteral(NullLiteral node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitParenthesizedExpression(ParenthesizedExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitPartDirective(PartDirective node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitPartOfDirective(PartOfDirective node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitPostfixExpression(PostfixExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitPrefixedIdentifier(PrefixedIdentifier node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitPrefixExpression(PrefixExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitPropertyAccess(PropertyAccess node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitRethrowExpression(RethrowExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitReturnStatement(ReturnStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitScriptTag(ScriptTag node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitShowCombinator(ShowCombinator node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitSimpleFormalParameter(SimpleFormalParameter node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitSimpleIdentifier(SimpleIdentifier node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitSimpleStringLiteral(SimpleStringLiteral node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitStringInterpolation(StringInterpolation node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitSuperExpression(SuperExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitSwitchCase(SwitchCase node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitSwitchDefault(SwitchDefault node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitSwitchStatement(SwitchStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitSymbolLiteral(SymbolLiteral node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitThisExpression(ThisExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitThrowExpression(ThrowExpression node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitTryStatement(TryStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitTypeArgumentList(TypeArgumentList node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitTypeName(TypeName node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitTypeParameter(TypeParameter node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitTypeParameterList(TypeParameterList node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitVariableDeclaration(VariableDeclaration node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitVariableDeclarationList(VariableDeclarationList node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitWhileStatement(WhileStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitWithClause(WithClause node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitYieldStatement(YieldStatement node) {
+    node.visitChildren(this);
+    return null;
+  }
+}
+
+/**
+ * The invocation of a constructor in the same class from within a constructor's
+ * initialization list.
+ *
+ * > redirectingConstructorInvocation ::=
+ * >     'this' ('.' identifier)? arguments
+ */
+class RedirectingConstructorInvocation extends ConstructorInitializer {
+  /**
+   * The token for the 'this' keyword.
+   */
+  Token thisKeyword;
+
+  /**
+   * The token for the period before the name of the constructor that is being
+   * invoked, or `null` if the unnamed constructor is being invoked.
+   */
+  Token period;
+
+  /**
+   * The name of the constructor that is being invoked, or `null` if the unnamed
+   * constructor is being invoked.
+   */
+  SimpleIdentifier _constructorName;
+
+  /**
+   * The list of arguments to the constructor.
+   */
+  ArgumentList _argumentList;
+
+  /**
+   * The element associated with the constructor based on static type
+   * information, or `null` if the AST structure has not been resolved or if the
+   * constructor could not be resolved.
+   */
+  ConstructorElement staticElement;
+
+  /**
+   * Initialize a newly created redirecting invocation to invoke the constructor
+   * with the given name with the given arguments. The [constructorName] can be
+   * `null` if the constructor being invoked is the unnamed constructor.
+   */
+  RedirectingConstructorInvocation(this.thisKeyword, this.period,
+      SimpleIdentifier constructorName, ArgumentList argumentList) {
+    _constructorName = _becomeParentOf(constructorName);
+    _argumentList = _becomeParentOf(argumentList);
+  }
+
+  /**
+   * Return the list of arguments to the constructor.
+   */
+  ArgumentList get argumentList => _argumentList;
+
+  /**
+   * Set the list of arguments to the constructor to the given [argumentList].
+   */
+  void set argumentList(ArgumentList argumentList) {
+    _argumentList = _becomeParentOf(argumentList);
+  }
+
+  @override
+  Token get beginToken => thisKeyword;
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(thisKeyword)
+    ..add(period)
+    ..add(_constructorName)
+    ..add(_argumentList);
+
+  /**
+   * Return the name of the constructor that is being invoked, or `null` if the
+   * unnamed constructor is being invoked.
+   */
+  SimpleIdentifier get constructorName => _constructorName;
+
+  /**
+   * Set the name of the constructor that is being invoked to the given
+   * [identifier].
+   */
+  void set constructorName(SimpleIdentifier identifier) {
+    _constructorName = _becomeParentOf(identifier);
+  }
+
+  @override
+  Token get endToken => _argumentList.endToken;
+
+  /**
+   * Return the token for the 'this' keyword.
+   */
+  @deprecated // Use "this.thisKeyword"
+  Token get keyword => thisKeyword;
+
+  /**
+   * Set the token for the 'this' keyword to the given [token].
+   */
+  @deprecated // Use "this.thisKeyword"
+  set keyword(Token token) {
+    thisKeyword = token;
+  }
+
+  @override
+  accept(AstVisitor visitor) =>
+      visitor.visitRedirectingConstructorInvocation(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_constructorName, visitor);
+    _safelyVisitChild(_argumentList, visitor);
+  }
+}
+
+/**
+ * A rethrow expression.
+ *
+ * > rethrowExpression ::=
+ * >     'rethrow'
+ */
+class RethrowExpression extends Expression {
+  /**
+   * The token representing the 'rethrow' keyword.
+   */
+  Token rethrowKeyword;
+
+  /**
+   * Initialize a newly created rethrow expression.
+   */
+  RethrowExpression(this.rethrowKeyword);
+
+  @override
+  Token get beginToken => rethrowKeyword;
+
+  @override
+  Iterable get childEntities => new ChildEntities()..add(rethrowKeyword);
+
+  @override
+  Token get endToken => rethrowKeyword;
+
+  /**
+   * Return the token representing the 'rethrow' keyword.
+   */
+  @deprecated // Use "this.rethrowKeyword"
+  Token get keyword => rethrowKeyword;
+
+  /**
+   * Set the token representing the 'rethrow' keyword to the given [token].
+   */
+  @deprecated // Use "this.rethrowKeyword"
+  set keyword(Token token) {
+    rethrowKeyword = token;
+  }
+
+  @override
+  int get precedence => 0;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitRethrowExpression(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    // There are no children to visit.
+  }
+}
+
+/**
+ * A return statement.
+ *
+ * > returnStatement ::=
+ * >     'return' [Expression]? ';'
+ */
+class ReturnStatement extends Statement {
+  /**
+   * The token representing the 'return' keyword.
+   */
+  Token returnKeyword;
+
+  /**
+   * The expression computing the value to be returned, or `null` if no explicit
+   * value was provided.
+   */
+  Expression _expression;
+
+  /**
+   * The semicolon terminating the statement.
+   */
+  Token semicolon;
+
+  /**
+   * Initialize a newly created return statement. The [expression] can be `null`
+   * if no explicit value was provided.
+   */
+  ReturnStatement(this.returnKeyword, Expression expression, this.semicolon) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  @override
+  Token get beginToken => returnKeyword;
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(returnKeyword)..add(_expression)..add(semicolon);
+
+  @override
+  Token get endToken => semicolon;
+
+  /**
+   * Return the expression computing the value to be returned, or `null` if no
+   * explicit value was provided.
+   */
+  Expression get expression => _expression;
+
+  /**
+   * Set the expression computing the value to be returned to the given
+   * [expression].
+   */
+  void set expression(Expression expression) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  /**
+   * Return the token representing the 'return' keyword.
+   */
+  @deprecated // Use "this.returnKeyword"
+  Token get keyword => returnKeyword;
+
+  /**
+   * Set the token representing the 'return' keyword to the given [token].
+   */
+  @deprecated // Use "this.returnKeyword"
+  set keyword(Token token) {
+    returnKeyword = token;
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitReturnStatement(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_expression, visitor);
+  }
+}
+
+/**
+ * Traverse the AST from initial child node to successive parents, building a
+ * collection of local variable and parameter names visible to the initial child
+ * node. In case of name shadowing, the first name seen is the most specific one
+ * so names are not redefined.
+ *
+ * Completion test code coverage is 95%. The two basic blocks that are not
+ * executed cannot be executed. They are included for future reference.
+ */
+class ScopedNameFinder extends GeneralizingAstVisitor<Object> {
+  Declaration _declarationNode;
+
+  AstNode _immediateChild;
+
+  Map<String, SimpleIdentifier> _locals =
+      new HashMap<String, SimpleIdentifier>();
+
+  final int _position;
+
+  bool _referenceIsWithinLocalFunction = false;
+
+  ScopedNameFinder(this._position);
+
+  Declaration get declaration => _declarationNode;
+
+  Map<String, SimpleIdentifier> get locals => _locals;
+
+  @override
+  Object visitBlock(Block node) {
+    _checkStatements(node.statements);
+    return super.visitBlock(node);
+  }
+
+  @override
+  Object visitCatchClause(CatchClause node) {
+    _addToScope(node.exceptionParameter);
+    _addToScope(node.stackTraceParameter);
+    return super.visitCatchClause(node);
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    if (!identical(_immediateChild, node.parameters)) {
+      _addParameters(node.parameters.parameters);
+    }
+    _declarationNode = node;
+    return null;
+  }
+
+  @override
+  Object visitFieldDeclaration(FieldDeclaration node) {
+    _declarationNode = node;
+    return null;
+  }
+
+  @override
+  Object visitForEachStatement(ForEachStatement node) {
+    DeclaredIdentifier loopVariable = node.loopVariable;
+    if (loopVariable != null) {
+      _addToScope(loopVariable.identifier);
+    }
+    return super.visitForEachStatement(node);
+  }
+
+  @override
+  Object visitForStatement(ForStatement node) {
+    if (!identical(_immediateChild, node.variables) && node.variables != null) {
+      _addVariables(node.variables.variables);
+    }
+    return super.visitForStatement(node);
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    if (node.parent is! FunctionDeclarationStatement) {
+      _declarationNode = node;
+      return null;
+    }
+    return super.visitFunctionDeclaration(node);
+  }
+
+  @override
+  Object visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    _referenceIsWithinLocalFunction = true;
+    return super.visitFunctionDeclarationStatement(node);
+  }
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    if (node.parameters != null &&
+        !identical(_immediateChild, node.parameters)) {
+      _addParameters(node.parameters.parameters);
+    }
+    return super.visitFunctionExpression(node);
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    _declarationNode = node;
+    if (node.parameters == null) {
+      return null;
+    }
+    if (!identical(_immediateChild, node.parameters)) {
+      _addParameters(node.parameters.parameters);
+    }
+    return null;
+  }
+
+  @override
+  Object visitNode(AstNode node) {
+    _immediateChild = node;
+    AstNode parent = node.parent;
+    if (parent != null) {
+      parent.accept(this);
+    }
+    return null;
+  }
+
+  @override
+  Object visitSwitchMember(SwitchMember node) {
+    _checkStatements(node.statements);
+    return super.visitSwitchMember(node);
+  }
+
+  @override
+  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    _declarationNode = node;
+    return null;
+  }
+
+  @override
+  Object visitTypeAlias(TypeAlias node) {
+    _declarationNode = node;
+    return null;
+  }
+
+  void _addParameters(NodeList<FormalParameter> vars) {
+    for (FormalParameter var2 in vars) {
+      _addToScope(var2.identifier);
+    }
+  }
+
+  void _addToScope(SimpleIdentifier identifier) {
+    if (identifier != null && _isInRange(identifier)) {
+      String name = identifier.name;
+      if (!_locals.containsKey(name)) {
+        _locals[name] = identifier;
+      }
+    }
+  }
+
+  void _addVariables(NodeList<VariableDeclaration> variables) {
+    for (VariableDeclaration variable in variables) {
+      _addToScope(variable.name);
+    }
+  }
+
+  /**
+   * Check the given list of [statements] for any that come before the immediate
+   * child and that define a name that would be visible to the immediate child.
+   */
+  void _checkStatements(List<Statement> statements) {
+    for (Statement statement in statements) {
+      if (identical(statement, _immediateChild)) {
+        return;
+      }
+      if (statement is VariableDeclarationStatement) {
+        _addVariables(statement.variables.variables);
+      } else if (statement is FunctionDeclarationStatement &&
+          !_referenceIsWithinLocalFunction) {
+        _addToScope(statement.functionDeclaration.name);
+      }
+    }
+  }
+
+  bool _isInRange(AstNode node) {
+    if (_position < 0) {
+      // if source position is not set then all nodes are in range
+      return true;
+      // not reached
+    }
+    return node.end < _position;
+  }
+}
+
+/**
+ * A script tag that can optionally occur at the beginning of a compilation unit.
+ *
+ * > scriptTag ::=
+ * >     '#!' (~NEWLINE)* NEWLINE
+ */
+class ScriptTag extends AstNode {
+  /**
+   * The token representing this script tag.
+   */
+  Token scriptTag;
+
+  /**
+   * Initialize a newly created script tag.
+   */
+  ScriptTag(this.scriptTag);
+
+  @override
+  Token get beginToken => scriptTag;
+
+  @override
+  Iterable get childEntities => new ChildEntities()..add(scriptTag);
+
+  @override
+  Token get endToken => scriptTag;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitScriptTag(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    // There are no children to visit.
+  }
+}
+
+/**
+ * A combinator that restricts the names being imported to those in a given list.
+ *
+ * > showCombinator ::=
+ * >     'show' [SimpleIdentifier] (',' [SimpleIdentifier])*
+ */
+class ShowCombinator extends Combinator {
+  /**
+   * The list of names from the library that are made visible by this combinator.
+   */
+  NodeList<SimpleIdentifier> _shownNames;
+
+  /**
+   * Initialize a newly created import show combinator.
+   */
+  ShowCombinator(Token keyword, List<SimpleIdentifier> shownNames)
+      : super(keyword) {
+    _shownNames = new NodeList<SimpleIdentifier>(this, shownNames);
+  }
+
+  /**
+   * TODO(paulberry): add commas.
+   */
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(keyword)
+    ..addAll(_shownNames);
+
+  @override
+  Token get endToken => _shownNames.endToken;
+
+  /**
+   * Return the list of names from the library that are made visible by this
+   * combinator.
+   */
+  NodeList<SimpleIdentifier> get shownNames => _shownNames;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitShowCombinator(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _shownNames.accept(visitor);
+  }
+}
+
+/**
+ * An AST visitor that will do nothing when visiting an AST node. It is intended
+ * to be a superclass for classes that use the visitor pattern primarily as a
+ * dispatch mechanism (and hence don't need to recursively visit a whole
+ * structure) and that only need to visit a small number of node types.
+ */
+class SimpleAstVisitor<R> implements AstVisitor<R> {
+  @override
+  R visitAdjacentStrings(AdjacentStrings node) => null;
+
+  @override
+  R visitAnnotation(Annotation node) => null;
+
+  @override
+  R visitArgumentList(ArgumentList node) => null;
+
+  @override
+  R visitAsExpression(AsExpression node) => null;
+
+  @override
+  R visitAssertStatement(AssertStatement node) => null;
+
+  @override
+  R visitAssignmentExpression(AssignmentExpression node) => null;
+
+  @override
+  R visitAwaitExpression(AwaitExpression node) => null;
+
+  @override
+  R visitBinaryExpression(BinaryExpression node) => null;
+
+  @override
+  R visitBlock(Block node) => null;
+
+  @override
+  R visitBlockFunctionBody(BlockFunctionBody node) => null;
+
+  @override
+  R visitBooleanLiteral(BooleanLiteral node) => null;
+
+  @override
+  R visitBreakStatement(BreakStatement node) => null;
+
+  @override
+  R visitCascadeExpression(CascadeExpression node) => null;
+
+  @override
+  R visitCatchClause(CatchClause node) => null;
+
+  @override
+  R visitClassDeclaration(ClassDeclaration node) => null;
+
+  @override
+  R visitClassTypeAlias(ClassTypeAlias node) => null;
+
+  @override
+  R visitComment(Comment node) => null;
+
+  @override
+  R visitCommentReference(CommentReference node) => null;
+
+  @override
+  R visitCompilationUnit(CompilationUnit node) => null;
+
+  @override
+  R visitConditionalExpression(ConditionalExpression node) => null;
+
+  @override
+  R visitConstructorDeclaration(ConstructorDeclaration node) => null;
+
+  @override
+  R visitConstructorFieldInitializer(ConstructorFieldInitializer node) => null;
+
+  @override
+  R visitConstructorName(ConstructorName node) => null;
+
+  @override
+  R visitContinueStatement(ContinueStatement node) => null;
+
+  @override
+  R visitDeclaredIdentifier(DeclaredIdentifier node) => null;
+
+  @override
+  R visitDefaultFormalParameter(DefaultFormalParameter node) => null;
+
+  @override
+  R visitDoStatement(DoStatement node) => null;
+
+  @override
+  R visitDoubleLiteral(DoubleLiteral node) => null;
+
+  @override
+  R visitEmptyFunctionBody(EmptyFunctionBody node) => null;
+
+  @override
+  R visitEmptyStatement(EmptyStatement node) => null;
+
+  @override
+  R visitEnumConstantDeclaration(EnumConstantDeclaration node) => null;
+
+  @override
+  R visitEnumDeclaration(EnumDeclaration node) => null;
+
+  @override
+  R visitExportDirective(ExportDirective node) => null;
+
+  @override
+  R visitExpressionFunctionBody(ExpressionFunctionBody node) => null;
+
+  @override
+  R visitExpressionStatement(ExpressionStatement node) => null;
+
+  @override
+  R visitExtendsClause(ExtendsClause node) => null;
+
+  @override
+  R visitFieldDeclaration(FieldDeclaration node) => null;
+
+  @override
+  R visitFieldFormalParameter(FieldFormalParameter node) => null;
+
+  @override
+  R visitForEachStatement(ForEachStatement node) => null;
+
+  @override
+  R visitFormalParameterList(FormalParameterList node) => null;
+
+  @override
+  R visitForStatement(ForStatement node) => null;
+
+  @override
+  R visitFunctionDeclaration(FunctionDeclaration node) => null;
+
+  @override
+  R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) =>
+      null;
+
+  @override
+  R visitFunctionExpression(FunctionExpression node) => null;
+
+  @override
+  R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) =>
+      null;
+
+  @override
+  R visitFunctionTypeAlias(FunctionTypeAlias node) => null;
+
+  @override
+  R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) =>
+      null;
+
+  @override
+  R visitHideCombinator(HideCombinator node) => null;
+
+  @override
+  R visitIfStatement(IfStatement node) => null;
+
+  @override
+  R visitImplementsClause(ImplementsClause node) => null;
+
+  @override
+  R visitImportDirective(ImportDirective node) => null;
+
+  @override
+  R visitIndexExpression(IndexExpression node) => null;
+
+  @override
+  R visitInstanceCreationExpression(InstanceCreationExpression node) => null;
+
+  @override
+  R visitIntegerLiteral(IntegerLiteral node) => null;
+
+  @override
+  R visitInterpolationExpression(InterpolationExpression node) => null;
+
+  @override
+  R visitInterpolationString(InterpolationString node) => null;
+
+  @override
+  R visitIsExpression(IsExpression node) => null;
+
+  @override
+  R visitLabel(Label node) => null;
+
+  @override
+  R visitLabeledStatement(LabeledStatement node) => null;
+
+  @override
+  R visitLibraryDirective(LibraryDirective node) => null;
+
+  @override
+  R visitLibraryIdentifier(LibraryIdentifier node) => null;
+
+  @override
+  R visitListLiteral(ListLiteral node) => null;
+
+  @override
+  R visitMapLiteral(MapLiteral node) => null;
+
+  @override
+  R visitMapLiteralEntry(MapLiteralEntry node) => null;
+
+  @override
+  R visitMethodDeclaration(MethodDeclaration node) => null;
+
+  @override
+  R visitMethodInvocation(MethodInvocation node) => null;
+
+  @override
+  R visitNamedExpression(NamedExpression node) => null;
+
+  @override
+  R visitNativeClause(NativeClause node) => null;
+
+  @override
+  R visitNativeFunctionBody(NativeFunctionBody node) => null;
+
+  @override
+  R visitNullLiteral(NullLiteral node) => null;
+
+  @override
+  R visitParenthesizedExpression(ParenthesizedExpression node) => null;
+
+  @override
+  R visitPartDirective(PartDirective node) => null;
+
+  @override
+  R visitPartOfDirective(PartOfDirective node) => null;
+
+  @override
+  R visitPostfixExpression(PostfixExpression node) => null;
+
+  @override
+  R visitPrefixedIdentifier(PrefixedIdentifier node) => null;
+
+  @override
+  R visitPrefixExpression(PrefixExpression node) => null;
+
+  @override
+  R visitPropertyAccess(PropertyAccess node) => null;
+
+  @override
+  R visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) => null;
+
+  @override
+  R visitRethrowExpression(RethrowExpression node) => null;
+
+  @override
+  R visitReturnStatement(ReturnStatement node) => null;
+
+  @override
+  R visitScriptTag(ScriptTag node) => null;
+
+  @override
+  R visitShowCombinator(ShowCombinator node) => null;
+
+  @override
+  R visitSimpleFormalParameter(SimpleFormalParameter node) => null;
+
+  @override
+  R visitSimpleIdentifier(SimpleIdentifier node) => null;
+
+  @override
+  R visitSimpleStringLiteral(SimpleStringLiteral node) => null;
+
+  @override
+  R visitStringInterpolation(StringInterpolation node) => null;
+
+  @override
+  R visitSuperConstructorInvocation(SuperConstructorInvocation node) => null;
+
+  @override
+  R visitSuperExpression(SuperExpression node) => null;
+
+  @override
+  R visitSwitchCase(SwitchCase node) => null;
+
+  @override
+  R visitSwitchDefault(SwitchDefault node) => null;
+
+  @override
+  R visitSwitchStatement(SwitchStatement node) => null;
+
+  @override
+  R visitSymbolLiteral(SymbolLiteral node) => null;
+
+  @override
+  R visitThisExpression(ThisExpression node) => null;
+
+  @override
+  R visitThrowExpression(ThrowExpression node) => null;
+
+  @override
+  R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => null;
+
+  @override
+  R visitTryStatement(TryStatement node) => null;
+
+  @override
+  R visitTypeArgumentList(TypeArgumentList node) => null;
+
+  @override
+  R visitTypeName(TypeName node) => null;
+
+  @override
+  R visitTypeParameter(TypeParameter node) => null;
+
+  @override
+  R visitTypeParameterList(TypeParameterList node) => null;
+
+  @override
+  R visitVariableDeclaration(VariableDeclaration node) => null;
+
+  @override
+  R visitVariableDeclarationList(VariableDeclarationList node) => null;
+
+  @override
+  R visitVariableDeclarationStatement(VariableDeclarationStatement node) =>
+      null;
+
+  @override
+  R visitWhileStatement(WhileStatement node) => null;
+
+  @override
+  R visitWithClause(WithClause node) => null;
+
+  @override
+  R visitYieldStatement(YieldStatement node) => null;
+}
+
+/**
+ * A simple formal parameter.
+ *
+ * > simpleFormalParameter ::=
+ * >     ('final' [TypeName] | 'var' | [TypeName])? [SimpleIdentifier]
+ */
+class SimpleFormalParameter extends NormalFormalParameter {
+  /**
+   * The token representing either the 'final', 'const' or 'var' keyword, or
+   * `null` if no keyword was used.
+   */
+  Token keyword;
+
+  /**
+   * The name of the declared type of the parameter, or `null` if the parameter
+   * does not have a declared type.
+   */
+  TypeName _type;
+
+  /**
+   * Initialize a newly created formal parameter. Either or both of the
+   * [comment] and [metadata] can be `null` if the parameter does not have the
+   * corresponding attribute. The [keyword] can be `null` if a type was
+   * specified. The [type] must be `null` if the keyword is 'var'.
+   */
+  SimpleFormalParameter(Comment comment, List<Annotation> metadata,
+      this.keyword, TypeName type, SimpleIdentifier identifier)
+      : super(comment, metadata, identifier) {
+    _type = _becomeParentOf(type);
+  }
+
+  @override
+  Token get beginToken {
+    NodeList<Annotation> metadata = this.metadata;
+    if (!metadata.isEmpty) {
+      return metadata.beginToken;
+    } else if (keyword != null) {
+      return keyword;
+    } else if (_type != null) {
+      return _type.beginToken;
+    }
+    return identifier.beginToken;
+  }
+
+  @override
+  Iterable get childEntities =>
+      super._childEntities..add(keyword)..add(_type)..add(identifier);
+
+  @override
+  Token get endToken => identifier.endToken;
+
+  @override
+  bool get isConst => (keyword is KeywordToken) &&
+      (keyword as KeywordToken).keyword == Keyword.CONST;
+
+  @override
+  bool get isFinal => (keyword is KeywordToken) &&
+      (keyword as KeywordToken).keyword == Keyword.FINAL;
+
+  /**
+   * Return the name of the declared type of the parameter, or `null` if the
+   * parameter does not have a declared type.
+   */
+  TypeName get type => _type;
+
+  /**
+   * Set the name of the declared type of the parameter to the given [typeName].
+   */
+  void set type(TypeName typeName) {
+    _type = _becomeParentOf(typeName);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitSimpleFormalParameter(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_type, visitor);
+    _safelyVisitChild(identifier, visitor);
+  }
+}
+
+/**
+ * A simple identifier.
+ *
+ * > simpleIdentifier ::=
+ * >     initialCharacter internalCharacter*
+ * >
+ * > initialCharacter ::= '_' | '$' | letter
+ * >
+ * > internalCharacter ::= '_' | '$' | letter | digit
+ */
+class SimpleIdentifier extends Identifier {
+  /**
+   * The token representing the identifier.
+   */
+  Token token;
+
+  /**
+   * The element associated with this identifier based on static type
+   * information, or `null` if the AST structure has not been resolved or if
+   * this identifier could not be resolved.
+   */
+  Element _staticElement;
+
+  /**
+   * The element associated with this identifier based on propagated type
+   * information, or `null` if the AST structure has not been resolved or if
+   * this identifier could not be resolved.
+   */
+  Element _propagatedElement;
+
+  /**
+   * If this expression is both in a getter and setter context, the
+   * [AuxiliaryElements] will be set to hold onto the static and propagated
+   * information. The auxiliary element will hold onto the elements from the
+   * getter context.
+   */
+  AuxiliaryElements auxiliaryElements = null;
+
+  /**
+   * Initialize a newly created identifier.
+   */
+  SimpleIdentifier(this.token);
+
+  @override
+  Token get beginToken => token;
+
+  @override
+  Element get bestElement {
+    if (_propagatedElement == null) {
+      return _staticElement;
+    }
+    return _propagatedElement;
+  }
+
+  @override
+  Iterable get childEntities => new ChildEntities()..add(token);
+
+  @override
+  Token get endToken => token;
+
+  /**
+   * Returns `true` if this identifier is the "name" part of a prefixed
+   * identifier or a method invocation.
+   */
+  bool get isQualified {
+    AstNode parent = this.parent;
+    if (parent is PrefixedIdentifier) {
+      return identical(parent.identifier, this);
+    }
+    if (parent is PropertyAccess) {
+      return identical(parent.propertyName, this);
+    }
+    if (parent is MethodInvocation) {
+      MethodInvocation invocation = parent;
+      return identical(invocation.methodName, this) &&
+          invocation.realTarget != null;
+    }
+    return false;
+  }
+
+  @override
+  bool get isSynthetic => token.isSynthetic;
+
+  @override
+  String get name => token.lexeme;
+
+  @override
+  int get precedence => 16;
+
+  @override
+  Element get propagatedElement => _propagatedElement;
+
+  /**
+   * Set the element associated with this identifier based on propagated type
+   * information to the given [element].
+   */
+  void set propagatedElement(Element element) {
+    _propagatedElement = _validateElement(element);
+  }
+
+  @override
+  Element get staticElement => _staticElement;
+
+  /**
+   * Set the element associated with this identifier based on static type
+   * information to the given [element].
+   */
+  void set staticElement(Element element) {
+    _staticElement = _validateElement(element);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitSimpleIdentifier(this);
+
+  /**
+   * Return `true` if this identifier is the name being declared in a
+   * declaration.
+   */
+  bool inDeclarationContext() {
+    // TODO(brianwilkerson) Convert this to a getter.
+    AstNode parent = this.parent;
+    if (parent is CatchClause) {
+      CatchClause clause = parent;
+      return identical(this, clause.exceptionParameter) ||
+          identical(this, clause.stackTraceParameter);
+    } else if (parent is ClassDeclaration) {
+      return identical(this, parent.name);
+    } else if (parent is ClassTypeAlias) {
+      return identical(this, parent.name);
+    } else if (parent is ConstructorDeclaration) {
+      return identical(this, parent.name);
+    } else if (parent is DeclaredIdentifier) {
+      return identical(this, parent.identifier);
+    } else if (parent is EnumDeclaration) {
+      return identical(this, parent.name);
+    } else if (parent is EnumConstantDeclaration) {
+      return identical(this, parent.name);
+    } else if (parent is FunctionDeclaration) {
+      return identical(this, parent.name);
+    } else if (parent is FunctionTypeAlias) {
+      return identical(this, parent.name);
+    } else if (parent is ImportDirective) {
+      return identical(this, parent.prefix);
+    } else if (parent is Label) {
+      return identical(this, parent.label) &&
+          (parent.parent is LabeledStatement);
+    } else if (parent is MethodDeclaration) {
+      return identical(this, parent.name);
+    } else if (parent is FunctionTypedFormalParameter ||
+        parent is SimpleFormalParameter) {
+      return identical(this, (parent as NormalFormalParameter).identifier);
+    } else if (parent is TypeParameter) {
+      return identical(this, parent.name);
+    } else if (parent is VariableDeclaration) {
+      return identical(this, parent.name);
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if this expression is computing a right-hand value.
+   *
+   * Note that [inGetterContext] and [inSetterContext] are not opposites, nor
+   * are they mutually exclusive. In other words, it is possible for both
+   * methods to return `true` when invoked on the same node.
+   */
+  bool inGetterContext() {
+    // TODO(brianwilkerson) Convert this to a getter.
+    AstNode parent = this.parent;
+    AstNode target = this;
+    // skip prefix
+    if (parent is PrefixedIdentifier) {
+      PrefixedIdentifier prefixed = parent as PrefixedIdentifier;
+      if (identical(prefixed.prefix, this)) {
+        return true;
+      }
+      parent = prefixed.parent;
+      target = prefixed;
+    } else if (parent is PropertyAccess) {
+      PropertyAccess access = parent as PropertyAccess;
+      if (identical(access.target, this)) {
+        return true;
+      }
+      parent = access.parent;
+      target = access;
+    }
+    // skip label
+    if (parent is Label) {
+      return false;
+    }
+    // analyze usage
+    if (parent is AssignmentExpression) {
+      if (identical(parent.leftHandSide, target) &&
+          parent.operator.type == TokenType.EQ) {
+        return false;
+      }
+    }
+    if (parent is ForEachStatement) {
+      if (identical(parent.identifier, target)) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Return `true` if this expression is computing a left-hand value.
+   *
+   * Note that [inGetterContext] and [inSetterContext] are not opposites, nor
+   * are they mutually exclusive. In other words, it is possible for both
+   * methods to return `true` when invoked on the same node.
+   */
+  bool inSetterContext() {
+    // TODO(brianwilkerson) Convert this to a getter.
+    AstNode parent = this.parent;
+    AstNode target = this;
+    // skip prefix
+    if (parent is PrefixedIdentifier) {
+      PrefixedIdentifier prefixed = parent as PrefixedIdentifier;
+      // if this is the prefix, then return false
+      if (identical(prefixed.prefix, this)) {
+        return false;
+      }
+      parent = prefixed.parent;
+      target = prefixed;
+    } else if (parent is PropertyAccess) {
+      PropertyAccess access = parent as PropertyAccess;
+      if (identical(access.target, this)) {
+        return false;
+      }
+      parent = access.parent;
+      target = access;
+    }
+    // analyze usage
+    if (parent is PrefixExpression) {
+      return parent.operator.type.isIncrementOperator;
+    } else if (parent is PostfixExpression) {
+      return true;
+    } else if (parent is AssignmentExpression) {
+      return identical(parent.leftHandSide, target);
+    } else if (parent is ForEachStatement) {
+      return identical(parent.identifier, target);
+    }
+    return false;
+  }
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    // There are no children to visit.
+  }
+
+  /**
+   * Return the given element if it is valid, or report the problem and return
+   * `null` if it is not appropriate.
+   *
+   * The [parent] is the parent of the element, used for reporting when there is
+   * a problem.
+   * The [isValid] is `true` if the element is appropriate.
+   * The [element] is the element to be associated with this identifier.
+   */
+  Element _returnOrReportElement(
+      AstNode parent, bool isValid, Element element) {
+    if (!isValid) {
+      AnalysisEngine.instance.logger.logInformation(
+          "Internal error: attempting to set the name of a ${parent.runtimeType} to a ${element.runtimeType}",
+          new CaughtException(new AnalysisException(), null));
+      return null;
+    }
+    return element;
+  }
+
+  /**
+   * Return the given [element] if it is an appropriate element based on the
+   * parent of this identifier, or `null` if it is not appropriate.
+   */
+  Element _validateElement(Element element) {
+    if (element == null) {
+      return null;
+    }
+    AstNode parent = this.parent;
+    if (parent is ClassDeclaration && identical(parent.name, this)) {
+      return _returnOrReportElement(parent, element is ClassElement, element);
+    } else if (parent is ClassTypeAlias && identical(parent.name, this)) {
+      return _returnOrReportElement(parent, element is ClassElement, element);
+    } else if (parent is DeclaredIdentifier &&
+        identical(parent.identifier, this)) {
+      return _returnOrReportElement(
+          parent, element is LocalVariableElement, element);
+    } else if (parent is FormalParameter &&
+        identical(parent.identifier, this)) {
+      return _returnOrReportElement(
+          parent, element is ParameterElement, element);
+    } else if (parent is FunctionDeclaration && identical(parent.name, this)) {
+      return _returnOrReportElement(
+          parent, element is ExecutableElement, element);
+    } else if (parent is FunctionTypeAlias && identical(parent.name, this)) {
+      return _returnOrReportElement(
+          parent, element is FunctionTypeAliasElement, element);
+    } else if (parent is MethodDeclaration && identical(parent.name, this)) {
+      return _returnOrReportElement(
+          parent, element is ExecutableElement, element);
+    } else if (parent is TypeParameter && identical(parent.name, this)) {
+      return _returnOrReportElement(
+          parent, element is TypeParameterElement, element);
+    } else if (parent is VariableDeclaration && identical(parent.name, this)) {
+      return _returnOrReportElement(
+          parent, element is VariableElement, element);
+    }
+    return element;
+  }
+}
+
+/**
+ * A string literal expression that does not contain any interpolations.
+ *
+ * > simpleStringLiteral ::=
+ * >     rawStringLiteral
+ * >   | basicStringLiteral
+ * >
+ * > rawStringLiteral ::=
+ * >     'r' basicStringLiteral
+ * >
+ * > simpleStringLiteral ::=
+ * >     multiLineStringLiteral
+ * >   | singleLineStringLiteral
+ * >
+ * > multiLineStringLiteral ::=
+ * >     "'''" characters "'''"
+ * >   | '"""' characters '"""'
+ * >
+ * > singleLineStringLiteral ::=
+ * >     "'" characters "'"
+ * >   | '"' characters '"'
+ */
+class SimpleStringLiteral extends SingleStringLiteral {
+  /**
+   * The token representing the literal.
+   */
+  Token literal;
+
+  /**
+   * The value of the literal.
+   */
+  String _value;
+
+  /**
+   * The toolkit specific element associated with this literal, or `null`.
+   */
+  @deprecated // No replacement
+  Element toolkitElement;
+
+  /**
+   * Initialize a newly created simple string literal.
+   */
+  SimpleStringLiteral(this.literal, String value) {
+    _value = StringUtilities.intern(value);
+  }
+
+  @override
+  Token get beginToken => literal;
+
+  @override
+  Iterable get childEntities => new ChildEntities()..add(literal);
+
+  @override
+  int get contentsEnd => offset + _helper.end;
+
+  @override
+  int get contentsOffset => offset + _helper.start;
+
+  @override
+  Token get endToken => literal;
+
+  @override
+  bool get isMultiline => _helper.isMultiline;
+
+  @override
+  bool get isRaw => _helper.isRaw;
+
+  @override
+  bool get isSingleQuoted => _helper.isSingleQuoted;
+
+  @override
+  bool get isSynthetic => literal.isSynthetic;
+
+  /**
+   * Return the value of the literal.
+   */
+  String get value => _value;
+
+  /**
+   * Set the value of the literal to the given [string].
+   */
+  void set value(String string) {
+    _value = StringUtilities.intern(_value);
+  }
+
+  StringLexemeHelper get _helper {
+    return new StringLexemeHelper(literal.lexeme, true, true);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitSimpleStringLiteral(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    // There are no children to visit.
+  }
+
+  @override
+  void _appendStringValue(StringBuffer buffer) {
+    buffer.write(value);
+  }
+}
+
+/**
+ * A single string literal expression.
+ *
+ * > singleStringLiteral ::=
+ * >     [SimpleStringLiteral]
+ * >   | [StringInterpolation]
+ */
+abstract class SingleStringLiteral extends StringLiteral {
+  /**
+   * Return the offset of the after-last contents character.
+   */
+  int get contentsEnd;
+
+  /**
+   * Return the offset of the first contents character.
+   * If the string is multiline, then leading whitespaces are skipped.
+   */
+  int get contentsOffset;
+
+  /**
+   * Return `true` if this string literal is a multi-line string.
+   */
+  bool get isMultiline;
+
+  /**
+   * Return `true` if this string literal is a raw string.
+   */
+  bool get isRaw;
+
+  /**
+   * Return `true` if this string literal uses single qoutes (' or ''').
+   * Return `false` if this string literal uses double qoutes (" or """).
+   */
+  bool get isSingleQuoted;
+}
+
+/**
+ * A node that represents a statement.
+ *
+ * > statement ::=
+ * >     [Block]
+ * >   | [VariableDeclarationStatement]
+ * >   | [ForStatement]
+ * >   | [ForEachStatement]
+ * >   | [WhileStatement]
+ * >   | [DoStatement]
+ * >   | [SwitchStatement]
+ * >   | [IfStatement]
+ * >   | [TryStatement]
+ * >   | [BreakStatement]
+ * >   | [ContinueStatement]
+ * >   | [ReturnStatement]
+ * >   | [ExpressionStatement]
+ * >   | [FunctionDeclarationStatement]
+ */
+abstract class Statement extends AstNode {
+  /**
+   * If this is a labeled statement, return the unlabeled portion of the
+   * statement.  Otherwise return the statement itself.
+   */
+  Statement get unlabeled => this;
+}
+
+/**
+ * A string interpolation literal.
+ *
+ * > stringInterpolation ::=
+ * >     ''' [InterpolationElement]* '''
+ * >   | '"' [InterpolationElement]* '"'
+ */
+class StringInterpolation extends SingleStringLiteral {
+  /**
+   * The elements that will be composed to produce the resulting string.
+   */
+  NodeList<InterpolationElement> _elements;
+
+  /**
+   * Initialize a newly created string interpolation expression.
+   */
+  StringInterpolation(List<InterpolationElement> elements) {
+    _elements = new NodeList<InterpolationElement>(this, elements);
+  }
+
+  @override
+  Token get beginToken => _elements.beginToken;
+
+  @override
+  Iterable get childEntities => new ChildEntities()..addAll(_elements);
+
+  @override
+  int get contentsEnd {
+    InterpolationString element = _elements.last;
+    return element.contentsEnd;
+  }
+
+  @override
+  int get contentsOffset {
+    InterpolationString element = _elements.first;
+    return element.contentsOffset;
+  }
+
+  /**
+   * Return the elements that will be composed to produce the resulting string.
+   */
+  NodeList<InterpolationElement> get elements => _elements;
+
+  @override
+  Token get endToken => _elements.endToken;
+
+  @override
+  bool get isMultiline => _firstHelper.isMultiline;
+
+  @override
+  bool get isRaw => false;
+
+  @override
+  bool get isSingleQuoted => _firstHelper.isSingleQuoted;
+
+  StringLexemeHelper get _firstHelper {
+    InterpolationString lastString = _elements.first;
+    String lexeme = lastString.contents.lexeme;
+    return new StringLexemeHelper(lexeme, true, false);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitStringInterpolation(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _elements.accept(visitor);
+  }
+
+  @override
+  void _appendStringValue(StringBuffer buffer) {
+    throw new IllegalArgumentException();
+  }
+}
+
+/**
+ * A helper for analyzing string lexemes.
+ */
+class StringLexemeHelper {
+  final String lexeme;
+  final bool isFirst;
+  final bool isLast;
+
+  bool isRaw = false;
+  bool isSingleQuoted = false;
+  bool isMultiline = false;
+  int start = 0;
+  int end;
+
+  StringLexemeHelper(this.lexeme, this.isFirst, this.isLast) {
+    if (isFirst) {
+      isRaw = StringUtilities.startsWithChar(lexeme, 0x72);
+      if (isRaw) {
+        start++;
+      }
+      if (StringUtilities.startsWith3(lexeme, start, 0x27, 0x27, 0x27)) {
+        isSingleQuoted = true;
+        isMultiline = true;
+        start += 3;
+        start = _trimInitialWhitespace(start);
+      } else if (StringUtilities.startsWith3(lexeme, start, 0x22, 0x22, 0x22)) {
+        isSingleQuoted = false;
+        isMultiline = true;
+        start += 3;
+        start = _trimInitialWhitespace(start);
+      } else if (start < lexeme.length && lexeme.codeUnitAt(start) == 0x27) {
+        isSingleQuoted = true;
+        isMultiline = false;
+        start++;
+      } else if (start < lexeme.length && lexeme.codeUnitAt(start) == 0x22) {
+        isSingleQuoted = false;
+        isMultiline = false;
+        start++;
+      }
+    }
+    end = lexeme.length;
+    if (isLast) {
+      if (start + 3 <= end &&
+          (StringUtilities.endsWith3(lexeme, 0x22, 0x22, 0x22) ||
+              StringUtilities.endsWith3(lexeme, 0x27, 0x27, 0x27))) {
+        end -= 3;
+      } else if (start + 1 <= end &&
+          (StringUtilities.endsWithChar(lexeme, 0x22) ||
+              StringUtilities.endsWithChar(lexeme, 0x27))) {
+        end -= 1;
+      }
+    }
+  }
+
+  /**
+   * Given the [lexeme] for a multi-line string whose content begins at the
+   * given [start] index, return the index of the first character that is
+   * included in the value of the string. According to the specification:
+   *
+   * If the first line of a multiline string consists solely of the whitespace
+   * characters defined by the production WHITESPACE 20.1), possibly prefixed
+   * by \, then that line is ignored, including the new line at its end.
+   */
+  int _trimInitialWhitespace(int start) {
+    int length = lexeme.length;
+    int index = start;
+    while (index < length) {
+      int currentChar = lexeme.codeUnitAt(index);
+      if (currentChar == 0x0D) {
+        if (index + 1 < length && lexeme.codeUnitAt(index + 1) == 0x0A) {
+          return index + 2;
+        }
+        return index + 1;
+      } else if (currentChar == 0x0A) {
+        return index + 1;
+      } else if (currentChar == 0x5C) {
+        if (index + 1 >= length) {
+          return start;
+        }
+        currentChar = lexeme.codeUnitAt(index + 1);
+        if (currentChar != 0x0D &&
+            currentChar != 0x0A &&
+            currentChar != 0x09 &&
+            currentChar != 0x20) {
+          return start;
+        }
+      } else if (currentChar != 0x09 && currentChar != 0x20) {
+        return start;
+      }
+      index++;
+    }
+    return start;
+  }
+}
+
+/**
+ * A string literal expression.
+ *
+ * > stringLiteral ::=
+ * >     [SimpleStringLiteral]
+ * >   | [AdjacentStrings]
+ * >   | [StringInterpolation]
+ */
+abstract class StringLiteral extends Literal {
+  /**
+   * Return the value of the string literal, or `null` if the string is not a
+   * constant string without any string interpolation.
+   */
+  String get stringValue {
+    StringBuffer buffer = new StringBuffer();
+    try {
+      _appendStringValue(buffer);
+    } on IllegalArgumentException {
+      return null;
+    }
+    return buffer.toString();
+  }
+
+  /**
+   * Append the value of this string literal to the given [buffer]. Throw an
+   * [IllegalArgumentException] if the string is not a constant string without
+   * any string interpolation.
+   */
+  @deprecated // Use "this.stringValue"
+  void appendStringValue(StringBuffer buffer) => _appendStringValue(buffer);
+
+  /**
+   * Append the value of this string literal to the given [buffer]. Throw an
+   * [IllegalArgumentException] if the string is not a constant string without
+   * any string interpolation.
+   */
+  void _appendStringValue(StringBuffer buffer);
+}
+
+/**
+ * The invocation of a superclass' constructor from within a constructor's
+ * initialization list.
+ *
+ * > superInvocation ::=
+ * >     'super' ('.' [SimpleIdentifier])? [ArgumentList]
+ */
+class SuperConstructorInvocation extends ConstructorInitializer {
+  /**
+   * The token for the 'super' keyword.
+   */
+  Token superKeyword;
+
+  /**
+   * The token for the period before the name of the constructor that is being
+   * invoked, or `null` if the unnamed constructor is being invoked.
+   */
+  Token period;
+
+  /**
+   * The name of the constructor that is being invoked, or `null` if the unnamed
+   * constructor is being invoked.
+   */
+  SimpleIdentifier _constructorName;
+
+  /**
+   * The list of arguments to the constructor.
+   */
+  ArgumentList _argumentList;
+
+  /**
+   * The element associated with the constructor based on static type
+   * information, or `null` if the AST structure has not been resolved or if the
+   * constructor could not be resolved.
+   */
+  ConstructorElement staticElement;
+
+  /**
+   * Initialize a newly created super invocation to invoke the inherited
+   * constructor with the given name with the given arguments. The [period] and
+   * [constructorName] can be `null` if the constructor being invoked is the
+   * unnamed constructor.
+   */
+  SuperConstructorInvocation(this.superKeyword, this.period,
+      SimpleIdentifier constructorName, ArgumentList argumentList) {
+    _constructorName = _becomeParentOf(constructorName);
+    _argumentList = _becomeParentOf(argumentList);
+  }
+
+  /**
+   * Return the list of arguments to the constructor.
+   */
+  ArgumentList get argumentList => _argumentList;
+
+  /**
+   * Set the list of arguments to the constructor to the given [argumentList].
+   */
+  void set argumentList(ArgumentList argumentList) {
+    _argumentList = _becomeParentOf(argumentList);
+  }
+
+  @override
+  Token get beginToken => superKeyword;
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(superKeyword)
+    ..add(period)
+    ..add(_constructorName)
+    ..add(_argumentList);
+
+  /**
+   * Return the name of the constructor that is being invoked, or `null` if the
+   * unnamed constructor is being invoked.
+   */
+  SimpleIdentifier get constructorName => _constructorName;
+
+  /**
+   * Set the name of the constructor that is being invoked to the given
+   * [identifier].
+   */
+  void set constructorName(SimpleIdentifier identifier) {
+    _constructorName = _becomeParentOf(identifier);
+  }
+
+  @override
+  Token get endToken => _argumentList.endToken;
+
+  /**
+   * Return the token for the 'super' keyword.
+   */
+  @deprecated // Use "this.superKeyword"
+  Token get keyword => superKeyword;
+
+  /**
+   * Set the token for the 'super' keyword to the given [token].
+   */
+  @deprecated // Use "this.superKeyword"
+  set keyword(Token token) {
+    superKeyword = token;
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitSuperConstructorInvocation(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_constructorName, visitor);
+    _safelyVisitChild(_argumentList, visitor);
+  }
+}
+
+/**
+ * A super expression.
+ *
+ * > superExpression ::=
+ * >     'super'
+ */
+class SuperExpression extends Expression {
+  /**
+   * The token representing the 'super' keyword.
+   */
+  Token superKeyword;
+
+  /**
+   * Initialize a newly created super expression.
+   */
+  SuperExpression(this.superKeyword);
+
+  @override
+  Token get beginToken => superKeyword;
+
+  @override
+  Iterable get childEntities => new ChildEntities()..add(superKeyword);
+
+  @override
+  Token get endToken => superKeyword;
+
+  /**
+   * Return the token for the 'super' keyword.
+   */
+  @deprecated // Use "this.superKeyword"
+  Token get keyword => superKeyword;
+
+  /**
+   * Set the token for the 'super' keyword to the given [token].
+   */
+  @deprecated // Use "this.superKeyword"
+  set keyword(Token token) {
+    superKeyword = token;
+  }
+
+  @override
+  int get precedence => 16;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitSuperExpression(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    // There are no children to visit.
+  }
+}
+
+/**
+ * A case in a switch statement.
+ *
+ * > switchCase ::=
+ * >     [SimpleIdentifier]* 'case' [Expression] ':' [Statement]*
+ */
+class SwitchCase extends SwitchMember {
+  /**
+   * The expression controlling whether the statements will be executed.
+   */
+  Expression _expression;
+
+  /**
+   * Initialize a newly created switch case. The list of [labels] can be `null`
+   * if there are no labels.
+   */
+  SwitchCase(List<Label> labels, Token keyword, Expression expression,
+      Token colon, List<Statement> statements)
+      : super(labels, keyword, colon, statements) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..addAll(labels)
+    ..add(keyword)
+    ..add(_expression)
+    ..add(colon)
+    ..addAll(statements);
+
+  /**
+   * Return the expression controlling whether the statements will be executed.
+   */
+  Expression get expression => _expression;
+
+  /**
+   * Set the expression controlling whether the statements will be executed to
+   * the given [expression].
+   */
+  void set expression(Expression expression) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitSwitchCase(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    labels.accept(visitor);
+    _safelyVisitChild(_expression, visitor);
+    statements.accept(visitor);
+  }
+}
+
+/**
+ * The default case in a switch statement.
+ *
+ * > switchDefault ::=
+ * >     [SimpleIdentifier]* 'default' ':' [Statement]*
+ */
+class SwitchDefault extends SwitchMember {
+  /**
+   * Initialize a newly created switch default. The list of [labels] can be
+   * `null` if there are no labels.
+   */
+  SwitchDefault(List<Label> labels, Token keyword, Token colon,
+      List<Statement> statements)
+      : super(labels, keyword, colon, statements);
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..addAll(labels)
+    ..add(keyword)
+    ..add(colon)
+    ..addAll(statements);
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitSwitchDefault(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    labels.accept(visitor);
+    statements.accept(visitor);
+  }
+}
+
+/**
+ * An element within a switch statement.
+ *
+ * > switchMember ::=
+ * >     switchCase
+ * >   | switchDefault
+ */
+abstract class SwitchMember extends AstNode {
+  /**
+   * The labels associated with the switch member.
+   */
+  NodeList<Label> _labels;
+
+  /**
+   * The token representing the 'case' or 'default' keyword.
+   */
+  Token keyword;
+
+  /**
+   * The colon separating the keyword or the expression from the statements.
+   */
+  Token colon;
+
+  /**
+   * The statements that will be executed if this switch member is selected.
+   */
+  NodeList<Statement> _statements;
+
+  /**
+   * Initialize a newly created switch member. The list of [labels] can be
+   * `null` if there are no labels.
+   */
+  SwitchMember(List<Label> labels, this.keyword, this.colon,
+      List<Statement> statements) {
+    _labels = new NodeList<Label>(this, labels);
+    _statements = new NodeList<Statement>(this, statements);
+  }
+
+  @override
+  Token get beginToken {
+    if (!_labels.isEmpty) {
+      return _labels.beginToken;
+    }
+    return keyword;
+  }
+
+  @override
+  Token get endToken {
+    if (!_statements.isEmpty) {
+      return _statements.endToken;
+    }
+    return colon;
+  }
+
+  /**
+   * Return the labels associated with the switch member.
+   */
+  NodeList<Label> get labels => _labels;
+
+  /**
+   * Return the statements that will be executed if this switch member is
+   * selected.
+   */
+  NodeList<Statement> get statements => _statements;
+}
+
+/**
+ * A switch statement.
+ *
+ * > switchStatement ::=
+ * >     'switch' '(' [Expression] ')' '{' [SwitchCase]* [SwitchDefault]? '}'
+ */
+class SwitchStatement extends Statement {
+  /**
+   * The token representing the 'switch' keyword.
+   */
+  Token switchKeyword;
+
+  /**
+   * The left parenthesis.
+   */
+  Token leftParenthesis;
+
+  /**
+   * The expression used to determine which of the switch members will be
+   * selected.
+   */
+  Expression _expression;
+
+  /**
+   * The right parenthesis.
+   */
+  Token rightParenthesis;
+
+  /**
+   * The left curly bracket.
+   */
+  Token leftBracket;
+
+  /**
+   * The switch members that can be selected by the expression.
+   */
+  NodeList<SwitchMember> _members;
+
+  /**
+   * The right curly bracket.
+   */
+  Token rightBracket;
+
+  /**
+   * Initialize a newly created switch statement. The list of [members] can be
+   * `null` if there are no switch members.
+   */
+  SwitchStatement(this.switchKeyword, this.leftParenthesis,
+      Expression expression, this.rightParenthesis, this.leftBracket,
+      List<SwitchMember> members, this.rightBracket) {
+    _expression = _becomeParentOf(expression);
+    _members = new NodeList<SwitchMember>(this, members);
+  }
+
+  @override
+  Token get beginToken => switchKeyword;
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(switchKeyword)
+    ..add(leftParenthesis)
+    ..add(_expression)
+    ..add(rightParenthesis)
+    ..add(leftBracket)
+    ..addAll(_members)
+    ..add(rightBracket);
+
+  @override
+  Token get endToken => rightBracket;
+
+  /**
+   * Return the expression used to determine which of the switch members will be
+   * selected.
+   */
+  Expression get expression => _expression;
+
+  /**
+   * Set the expression used to determine which of the switch members will be
+   * selected to the given [expression].
+   */
+  void set expression(Expression expression) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  /**
+   * Return the token representing the 'switch' keyword.
+   */
+  @deprecated // Use "this.switchKeyword"
+  Token get keyword => switchKeyword;
+
+  /**
+   * Set the token representing the 'switch' keyword to the given [token].
+   */
+  @deprecated // Use "this.switchKeyword"
+  set keyword(Token token) {
+    switchKeyword = token;
+  }
+
+  /**
+   * Return the switch members that can be selected by the expression.
+   */
+  NodeList<SwitchMember> get members => _members;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitSwitchStatement(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_expression, visitor);
+    _members.accept(visitor);
+  }
+}
+
+/**
+ * A symbol literal expression.
+ *
+ * > symbolLiteral ::=
+ * >     '#' (operator | (identifier ('.' identifier)*))
+ */
+class SymbolLiteral extends Literal {
+  /**
+   * The token introducing the literal.
+   */
+  Token poundSign;
+
+  /**
+   * The components of the literal.
+   */
+  final List<Token> components;
+
+  /**
+   * Initialize a newly created symbol literal.
+   */
+  SymbolLiteral(this.poundSign, this.components);
+
+  @override
+  Token get beginToken => poundSign;
+
+  /**
+   * TODO(paulberry): add "." tokens.
+   */
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(poundSign)
+    ..addAll(components);
+
+  @override
+  Token get endToken => components[components.length - 1];
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitSymbolLiteral(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    // There are no children to visit.
+  }
+}
+
+/**
+ * A this expression.
+ *
+ * > thisExpression ::=
+ * >     'this'
+ */
+class ThisExpression extends Expression {
+  /**
+   * The token representing the 'this' keyword.
+   */
+  Token thisKeyword;
+
+  /**
+   * Initialize a newly created this expression.
+   */
+  ThisExpression(this.thisKeyword);
+
+  @override
+  Token get beginToken => thisKeyword;
+
+  @override
+  Iterable get childEntities => new ChildEntities()..add(thisKeyword);
+
+  @override
+  Token get endToken => thisKeyword;
+
+  /**
+   * Return the token representing the 'this' keyword.
+   */
+  @deprecated // Use "this.thisKeyword"
+  Token get keyword => thisKeyword;
+
+  /**
+   * Set the token representing the 'this' keyword to the given [token].
+   */
+  @deprecated // Use "this.thisKeyword"
+  set keyword(Token token) {
+    thisKeyword = token;
+  }
+
+  @override
+  int get precedence => 16;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitThisExpression(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    // There are no children to visit.
+  }
+}
+
+/**
+ * A throw expression.
+ *
+ * > throwExpression ::=
+ * >     'throw' [Expression]
+ */
+class ThrowExpression extends Expression {
+  /**
+   * The token representing the 'throw' keyword.
+   */
+  Token throwKeyword;
+
+  /**
+   * The expression computing the exception to be thrown.
+   */
+  Expression _expression;
+
+  /**
+   * Initialize a newly created throw expression.
+   */
+  ThrowExpression(this.throwKeyword, Expression expression) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  @override
+  Token get beginToken => throwKeyword;
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(throwKeyword)..add(_expression);
+
+  @override
+  Token get endToken {
+    if (_expression != null) {
+      return _expression.endToken;
+    }
+    return throwKeyword;
+  }
+
+  /**
+   * Return the expression computing the exception to be thrown.
+   */
+  Expression get expression => _expression;
+
+  /**
+   * Set the expression computing the exception to be thrown to the given
+   * [expression].
+   */
+  void set expression(Expression expression) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  /**
+   * Return the token representing the 'throw' keyword.
+   */
+  @deprecated // Use "this.throwKeyword"
+  Token get keyword => throwKeyword;
+
+  /**
+   * Set the token representing the 'throw' keyword to the given [token].
+   */
+  @deprecated // Use "this.throwKeyword"
+  set keyword(Token token) {
+    throwKeyword = token;
+  }
+
+  @override
+  int get precedence => 0;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitThrowExpression(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_expression, visitor);
+  }
+}
+
+/**
+ * The declaration of one or more top-level variables of the same type.
+ *
+ * > topLevelVariableDeclaration ::=
+ * >     ('final' | 'const') type? staticFinalDeclarationList ';'
+ * >   | variableDeclaration ';'
+ */
+class TopLevelVariableDeclaration extends CompilationUnitMember {
+  /**
+   * The top-level variables being declared.
+   */
+  VariableDeclarationList _variableList;
+
+  /**
+   * The semicolon terminating the declaration.
+   */
+  Token semicolon;
+
+  /**
+   * Initialize a newly created top-level variable declaration. Either or both
+   * of the [comment] and [metadata] can be `null` if the variable does not have
+   * the corresponding attribute.
+   */
+  TopLevelVariableDeclaration(Comment comment, List<Annotation> metadata,
+      VariableDeclarationList variableList, this.semicolon)
+      : super(comment, metadata) {
+    _variableList = _becomeParentOf(variableList);
+  }
+
+  @override
+  Iterable get childEntities =>
+      super._childEntities..add(_variableList)..add(semicolon);
+
+  @override
+  Element get element => null;
+
+  @override
+  Token get endToken => semicolon;
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata => _variableList.beginToken;
+
+  /**
+   * Return the top-level variables being declared.
+   */
+  VariableDeclarationList get variables => _variableList;
+
+  /**
+   * Set the top-level variables being declared to the given list of
+   * [variables].
+   */
+  void set variables(VariableDeclarationList variables) {
+    _variableList = _becomeParentOf(variables);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitTopLevelVariableDeclaration(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_variableList, visitor);
+  }
+}
+
+/**
+ * A visitor used to write a source representation of a visited AST node (and
+ * all of it's children) to a writer.
+ */
+class ToSourceVisitor implements AstVisitor<Object> {
+  /**
+   * The writer to which the source is to be written.
+   */
+  final PrintWriter _writer;
+
+  /**
+   * Initialize a newly created visitor to write source code representing the
+   * visited nodes to the given [writer].
+   */
+  ToSourceVisitor(this._writer);
+
+  @override
+  Object visitAdjacentStrings(AdjacentStrings node) {
+    _visitNodeListWithSeparator(node.strings, " ");
+    return null;
+  }
+
+  @override
+  Object visitAnnotation(Annotation node) {
+    _writer.print('@');
+    _visitNode(node.name);
+    _visitNodeWithPrefix(".", node.constructorName);
+    _visitNode(node.arguments);
+    return null;
+  }
+
+  @override
+  Object visitArgumentList(ArgumentList node) {
+    _writer.print('(');
+    _visitNodeListWithSeparator(node.arguments, ", ");
+    _writer.print(')');
+    return null;
+  }
+
+  @override
+  Object visitAsExpression(AsExpression node) {
+    _visitNode(node.expression);
+    _writer.print(" as ");
+    _visitNode(node.type);
+    return null;
+  }
+
+  @override
+  Object visitAssertStatement(AssertStatement node) {
+    _writer.print("assert (");
+    _visitNode(node.condition);
+    _writer.print(");");
+    return null;
+  }
+
+  @override
+  Object visitAssignmentExpression(AssignmentExpression node) {
+    _visitNode(node.leftHandSide);
+    _writer.print(' ');
+    _writer.print(node.operator.lexeme);
+    _writer.print(' ');
+    _visitNode(node.rightHandSide);
+    return null;
+  }
+
+  @override
+  Object visitAwaitExpression(AwaitExpression node) {
+    _writer.print("await ");
+    _visitNode(node.expression);
+    _writer.print(";");
+    return null;
+  }
+
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    _visitNode(node.leftOperand);
+    _writer.print(' ');
+    _writer.print(node.operator.lexeme);
+    _writer.print(' ');
+    _visitNode(node.rightOperand);
+    return null;
+  }
+
+  @override
+  Object visitBlock(Block node) {
+    _writer.print('{');
+    _visitNodeListWithSeparator(node.statements, " ");
+    _writer.print('}');
+    return null;
+  }
+
+  @override
+  Object visitBlockFunctionBody(BlockFunctionBody node) {
+    Token keyword = node.keyword;
+    if (keyword != null) {
+      _writer.print(keyword.lexeme);
+      if (node.star != null) {
+        _writer.print('*');
+      }
+      _writer.print(' ');
+    }
+    _visitNode(node.block);
+    return null;
+  }
+
+  @override
+  Object visitBooleanLiteral(BooleanLiteral node) {
+    _writer.print(node.literal.lexeme);
+    return null;
+  }
+
+  @override
+  Object visitBreakStatement(BreakStatement node) {
+    _writer.print("break");
+    _visitNodeWithPrefix(" ", node.label);
+    _writer.print(";");
+    return null;
+  }
+
+  @override
+  Object visitCascadeExpression(CascadeExpression node) {
+    _visitNode(node.target);
+    _visitNodeList(node.cascadeSections);
+    return null;
+  }
+
+  @override
+  Object visitCatchClause(CatchClause node) {
+    _visitNodeWithPrefix("on ", node.exceptionType);
+    if (node.catchKeyword != null) {
+      if (node.exceptionType != null) {
+        _writer.print(' ');
+      }
+      _writer.print("catch (");
+      _visitNode(node.exceptionParameter);
+      _visitNodeWithPrefix(", ", node.stackTraceParameter);
+      _writer.print(") ");
+    } else {
+      _writer.print(" ");
+    }
+    _visitNode(node.body);
+    return null;
+  }
+
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitTokenWithSuffix(node.abstractKeyword, " ");
+    _writer.print("class ");
+    _visitNode(node.name);
+    _visitNode(node.typeParameters);
+    _visitNodeWithPrefix(" ", node.extendsClause);
+    _visitNodeWithPrefix(" ", node.withClause);
+    _visitNodeWithPrefix(" ", node.implementsClause);
+    _writer.print(" {");
+    _visitNodeListWithSeparator(node.members, " ");
+    _writer.print("}");
+    return null;
+  }
+
+  @override
+  Object visitClassTypeAlias(ClassTypeAlias node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    if (node.abstractKeyword != null) {
+      _writer.print("abstract ");
+    }
+    _writer.print("class ");
+    _visitNode(node.name);
+    _visitNode(node.typeParameters);
+    _writer.print(" = ");
+    _visitNode(node.superclass);
+    _visitNodeWithPrefix(" ", node.withClause);
+    _visitNodeWithPrefix(" ", node.implementsClause);
+    _writer.print(";");
+    return null;
+  }
+
+  @override
+  Object visitComment(Comment node) => null;
+
+  @override
+  Object visitCommentReference(CommentReference node) => null;
+
+  @override
+  Object visitCompilationUnit(CompilationUnit node) {
+    ScriptTag scriptTag = node.scriptTag;
+    NodeList<Directive> directives = node.directives;
+    _visitNode(scriptTag);
+    String prefix = scriptTag == null ? "" : " ";
+    _visitNodeListWithSeparatorAndPrefix(prefix, directives, " ");
+    prefix = scriptTag == null && directives.isEmpty ? "" : " ";
+    _visitNodeListWithSeparatorAndPrefix(prefix, node.declarations, " ");
+    return null;
+  }
+
+  @override
+  Object visitConditionalExpression(ConditionalExpression node) {
+    _visitNode(node.condition);
+    _writer.print(" ? ");
+    _visitNode(node.thenExpression);
+    _writer.print(" : ");
+    _visitNode(node.elseExpression);
+    return null;
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitTokenWithSuffix(node.externalKeyword, " ");
+    _visitTokenWithSuffix(node.constKeyword, " ");
+    _visitTokenWithSuffix(node.factoryKeyword, " ");
+    _visitNode(node.returnType);
+    _visitNodeWithPrefix(".", node.name);
+    _visitNode(node.parameters);
+    _visitNodeListWithSeparatorAndPrefix(" : ", node.initializers, ", ");
+    _visitNodeWithPrefix(" = ", node.redirectedConstructor);
+    _visitFunctionWithPrefix(" ", node.body);
+    return null;
+  }
+
+  @override
+  Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    _visitTokenWithSuffix(node.thisKeyword, ".");
+    _visitNode(node.fieldName);
+    _writer.print(" = ");
+    _visitNode(node.expression);
+    return null;
+  }
+
+  @override
+  Object visitConstructorName(ConstructorName node) {
+    _visitNode(node.type);
+    _visitNodeWithPrefix(".", node.name);
+    return null;
+  }
+
+  @override
+  Object visitContinueStatement(ContinueStatement node) {
+    _writer.print("continue");
+    _visitNodeWithPrefix(" ", node.label);
+    _writer.print(";");
+    return null;
+  }
+
+  @override
+  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitTokenWithSuffix(node.keyword, " ");
+    _visitNodeWithSuffix(node.type, " ");
+    _visitNode(node.identifier);
+    return null;
+  }
+
+  @override
+  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+    _visitNode(node.parameter);
+    if (node.separator != null) {
+      _writer.print(" ");
+      _writer.print(node.separator.lexeme);
+      _visitNodeWithPrefix(" ", node.defaultValue);
+    }
+    return null;
+  }
+
+  @override
+  Object visitDoStatement(DoStatement node) {
+    _writer.print("do ");
+    _visitNode(node.body);
+    _writer.print(" while (");
+    _visitNode(node.condition);
+    _writer.print(");");
+    return null;
+  }
+
+  @override
+  Object visitDoubleLiteral(DoubleLiteral node) {
+    _writer.print(node.literal.lexeme);
+    return null;
+  }
+
+  @override
+  Object visitEmptyFunctionBody(EmptyFunctionBody node) {
+    _writer.print(';');
+    return null;
+  }
+
+  @override
+  Object visitEmptyStatement(EmptyStatement node) {
+    _writer.print(';');
+    return null;
+  }
+
+  @override
+  Object visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitNode(node.name);
+    return null;
+  }
+
+  @override
+  Object visitEnumDeclaration(EnumDeclaration node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _writer.print("enum ");
+    _visitNode(node.name);
+    _writer.print(" {");
+    _visitNodeListWithSeparator(node.constants, ", ");
+    _writer.print("}");
+    return null;
+  }
+
+  @override
+  Object visitExportDirective(ExportDirective node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _writer.print("export ");
+    _visitNode(node.uri);
+    _visitNodeListWithSeparatorAndPrefix(" ", node.combinators, " ");
+    _writer.print(';');
+    return null;
+  }
+
+  @override
+  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    Token keyword = node.keyword;
+    if (keyword != null) {
+      _writer.print(keyword.lexeme);
+      _writer.print(' ');
+    }
+    _writer.print("=> ");
+    _visitNode(node.expression);
+    if (node.semicolon != null) {
+      _writer.print(';');
+    }
+    return null;
+  }
+
+  @override
+  Object visitExpressionStatement(ExpressionStatement node) {
+    _visitNode(node.expression);
+    _writer.print(';');
+    return null;
+  }
+
+  @override
+  Object visitExtendsClause(ExtendsClause node) {
+    _writer.print("extends ");
+    _visitNode(node.superclass);
+    return null;
+  }
+
+  @override
+  Object visitFieldDeclaration(FieldDeclaration node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitTokenWithSuffix(node.staticKeyword, " ");
+    _visitNode(node.fields);
+    _writer.print(";");
+    return null;
+  }
+
+  @override
+  Object visitFieldFormalParameter(FieldFormalParameter node) {
+    _visitTokenWithSuffix(node.keyword, " ");
+    _visitNodeWithSuffix(node.type, " ");
+    _writer.print("this.");
+    _visitNode(node.identifier);
+    _visitNode(node.typeParameters);
+    _visitNode(node.parameters);
+    return null;
+  }
+
+  @override
+  Object visitForEachStatement(ForEachStatement node) {
+    DeclaredIdentifier loopVariable = node.loopVariable;
+    if (node.awaitKeyword != null) {
+      _writer.print("await ");
+    }
+    _writer.print("for (");
+    if (loopVariable == null) {
+      _visitNode(node.identifier);
+    } else {
+      _visitNode(loopVariable);
+    }
+    _writer.print(" in ");
+    _visitNode(node.iterable);
+    _writer.print(") ");
+    _visitNode(node.body);
+    return null;
+  }
+
+  @override
+  Object visitFormalParameterList(FormalParameterList node) {
+    String groupEnd = null;
+    _writer.print('(');
+    NodeList<FormalParameter> parameters = node.parameters;
+    int size = parameters.length;
+    for (int i = 0; i < size; i++) {
+      FormalParameter parameter = parameters[i];
+      if (i > 0) {
+        _writer.print(", ");
+      }
+      if (groupEnd == null && parameter is DefaultFormalParameter) {
+        if (parameter.kind == ParameterKind.NAMED) {
+          groupEnd = "}";
+          _writer.print('{');
+        } else {
+          groupEnd = "]";
+          _writer.print('[');
+        }
+      }
+      parameter.accept(this);
+    }
+    if (groupEnd != null) {
+      _writer.print(groupEnd);
+    }
+    _writer.print(')');
+    return null;
+  }
+
+  @override
+  Object visitForStatement(ForStatement node) {
+    Expression initialization = node.initialization;
+    _writer.print("for (");
+    if (initialization != null) {
+      _visitNode(initialization);
+    } else {
+      _visitNode(node.variables);
+    }
+    _writer.print(";");
+    _visitNodeWithPrefix(" ", node.condition);
+    _writer.print(";");
+    _visitNodeListWithSeparatorAndPrefix(" ", node.updaters, ", ");
+    _writer.print(") ");
+    _visitNode(node.body);
+    return null;
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitTokenWithSuffix(node.externalKeyword, " ");
+    _visitNodeWithSuffix(node.returnType, " ");
+    _visitTokenWithSuffix(node.propertyKeyword, " ");
+    _visitNode(node.name);
+    _visitNode(node.functionExpression);
+    return null;
+  }
+
+  @override
+  Object visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    _visitNode(node.functionDeclaration);
+    return null;
+  }
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    _visitNode(node.typeParameters);
+    _visitNode(node.parameters);
+    if (node.body is! EmptyFunctionBody) {
+      _writer.print(' ');
+    }
+    _visitNode(node.body);
+    return null;
+  }
+
+  @override
+  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    _visitNode(node.function);
+    _visitNode(node.typeArguments);
+    _visitNode(node.argumentList);
+    return null;
+  }
+
+  @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _writer.print("typedef ");
+    _visitNodeWithSuffix(node.returnType, " ");
+    _visitNode(node.name);
+    _visitNode(node.typeParameters);
+    _visitNode(node.parameters);
+    _writer.print(";");
+    return null;
+  }
+
+  @override
+  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    _visitNodeWithSuffix(node.returnType, " ");
+    _visitNode(node.identifier);
+    _visitNode(node.typeParameters);
+    _visitNode(node.parameters);
+    return null;
+  }
+
+  @override
+  Object visitHideCombinator(HideCombinator node) {
+    _writer.print("hide ");
+    _visitNodeListWithSeparator(node.hiddenNames, ", ");
+    return null;
+  }
+
+  @override
+  Object visitIfStatement(IfStatement node) {
+    _writer.print("if (");
+    _visitNode(node.condition);
+    _writer.print(") ");
+    _visitNode(node.thenStatement);
+    _visitNodeWithPrefix(" else ", node.elseStatement);
+    return null;
+  }
+
+  @override
+  Object visitImplementsClause(ImplementsClause node) {
+    _writer.print("implements ");
+    _visitNodeListWithSeparator(node.interfaces, ", ");
+    return null;
+  }
+
+  @override
+  Object visitImportDirective(ImportDirective node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _writer.print("import ");
+    _visitNode(node.uri);
+    if (node.deferredKeyword != null) {
+      _writer.print(" deferred");
+    }
+    _visitNodeWithPrefix(" as ", node.prefix);
+    _visitNodeListWithSeparatorAndPrefix(" ", node.combinators, " ");
+    _writer.print(';');
+    return null;
+  }
+
+  @override
+  Object visitIndexExpression(IndexExpression node) {
+    if (node.isCascaded) {
+      _writer.print("..");
+    } else {
+      _visitNode(node.target);
+    }
+    _writer.print('[');
+    _visitNode(node.index);
+    _writer.print(']');
+    return null;
+  }
+
+  @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    _visitTokenWithSuffix(node.keyword, " ");
+    _visitNode(node.constructorName);
+    _visitNode(node.argumentList);
+    return null;
+  }
+
+  @override
+  Object visitIntegerLiteral(IntegerLiteral node) {
+    _writer.print(node.literal.lexeme);
+    return null;
+  }
+
+  @override
+  Object visitInterpolationExpression(InterpolationExpression node) {
+    if (node.rightBracket != null) {
+      _writer.print("\${");
+      _visitNode(node.expression);
+      _writer.print("}");
+    } else {
+      _writer.print("\$");
+      _visitNode(node.expression);
+    }
+    return null;
+  }
+
+  @override
+  Object visitInterpolationString(InterpolationString node) {
+    _writer.print(node.contents.lexeme);
+    return null;
+  }
+
+  @override
+  Object visitIsExpression(IsExpression node) {
+    _visitNode(node.expression);
+    if (node.notOperator == null) {
+      _writer.print(" is ");
+    } else {
+      _writer.print(" is! ");
+    }
+    _visitNode(node.type);
+    return null;
+  }
+
+  @override
+  Object visitLabel(Label node) {
+    _visitNode(node.label);
+    _writer.print(":");
+    return null;
+  }
+
+  @override
+  Object visitLabeledStatement(LabeledStatement node) {
+    _visitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
+    _visitNode(node.statement);
+    return null;
+  }
+
+  @override
+  Object visitLibraryDirective(LibraryDirective node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _writer.print("library ");
+    _visitNode(node.name);
+    _writer.print(';');
+    return null;
+  }
+
+  @override
+  Object visitLibraryIdentifier(LibraryIdentifier node) {
+    _writer.print(node.name);
+    return null;
+  }
+
+  @override
+  Object visitListLiteral(ListLiteral node) {
+    if (node.constKeyword != null) {
+      _writer.print(node.constKeyword.lexeme);
+      _writer.print(' ');
+    }
+    _visitNodeWithSuffix(node.typeArguments, " ");
+    _writer.print("[");
+    _visitNodeListWithSeparator(node.elements, ", ");
+    _writer.print("]");
+    return null;
+  }
+
+  @override
+  Object visitMapLiteral(MapLiteral node) {
+    if (node.constKeyword != null) {
+      _writer.print(node.constKeyword.lexeme);
+      _writer.print(' ');
+    }
+    _visitNodeWithSuffix(node.typeArguments, " ");
+    _writer.print("{");
+    _visitNodeListWithSeparator(node.entries, ", ");
+    _writer.print("}");
+    return null;
+  }
+
+  @override
+  Object visitMapLiteralEntry(MapLiteralEntry node) {
+    _visitNode(node.key);
+    _writer.print(" : ");
+    _visitNode(node.value);
+    return null;
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitTokenWithSuffix(node.externalKeyword, " ");
+    _visitTokenWithSuffix(node.modifierKeyword, " ");
+    _visitNodeWithSuffix(node.returnType, " ");
+    _visitTokenWithSuffix(node.propertyKeyword, " ");
+    _visitTokenWithSuffix(node.operatorKeyword, " ");
+    _visitNode(node.name);
+    if (!node.isGetter) {
+      _visitNode(node.typeParameters);
+      _visitNode(node.parameters);
+    }
+    _visitFunctionWithPrefix(" ", node.body);
+    return null;
+  }
+
+  @override
+  Object visitMethodInvocation(MethodInvocation node) {
+    if (node.isCascaded) {
+      _writer.print("..");
+    } else {
+      if (node.target != null) {
+        node.target.accept(this);
+        _writer.print(node.operator.lexeme);
+      }
+    }
+    _visitNode(node.methodName);
+    _visitNode(node.typeArguments);
+    _visitNode(node.argumentList);
+    return null;
+  }
+
+  @override
+  Object visitNamedExpression(NamedExpression node) {
+    _visitNode(node.name);
+    _visitNodeWithPrefix(" ", node.expression);
+    return null;
+  }
+
+  @override
+  Object visitNativeClause(NativeClause node) {
+    _writer.print("native ");
+    _visitNode(node.name);
+    return null;
+  }
+
+  @override
+  Object visitNativeFunctionBody(NativeFunctionBody node) {
+    _writer.print("native ");
+    _visitNode(node.stringLiteral);
+    _writer.print(';');
+    return null;
+  }
+
+  @override
+  Object visitNullLiteral(NullLiteral node) {
+    _writer.print("null");
+    return null;
+  }
+
+  @override
+  Object visitParenthesizedExpression(ParenthesizedExpression node) {
+    _writer.print('(');
+    _visitNode(node.expression);
+    _writer.print(')');
+    return null;
+  }
+
+  @override
+  Object visitPartDirective(PartDirective node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _writer.print("part ");
+    _visitNode(node.uri);
+    _writer.print(';');
+    return null;
+  }
+
+  @override
+  Object visitPartOfDirective(PartOfDirective node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _writer.print("part of ");
+    _visitNode(node.libraryName);
+    _writer.print(';');
+    return null;
+  }
+
+  @override
+  Object visitPostfixExpression(PostfixExpression node) {
+    _visitNode(node.operand);
+    _writer.print(node.operator.lexeme);
+    return null;
+  }
+
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    _visitNode(node.prefix);
+    _writer.print('.');
+    _visitNode(node.identifier);
+    return null;
+  }
+
+  @override
+  Object visitPrefixExpression(PrefixExpression node) {
+    _writer.print(node.operator.lexeme);
+    _visitNode(node.operand);
+    return null;
+  }
+
+  @override
+  Object visitPropertyAccess(PropertyAccess node) {
+    if (node.isCascaded) {
+      _writer.print("..");
+    } else {
+      _visitNode(node.target);
+      _writer.print(node.operator.lexeme);
+    }
+    _visitNode(node.propertyName);
+    return null;
+  }
+
+  @override
+  Object visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    _writer.print("this");
+    _visitNodeWithPrefix(".", node.constructorName);
+    _visitNode(node.argumentList);
+    return null;
+  }
+
+  @override
+  Object visitRethrowExpression(RethrowExpression node) {
+    _writer.print("rethrow");
+    return null;
+  }
+
+  @override
+  Object visitReturnStatement(ReturnStatement node) {
+    Expression expression = node.expression;
+    if (expression == null) {
+      _writer.print("return;");
+    } else {
+      _writer.print("return ");
+      expression.accept(this);
+      _writer.print(";");
+    }
+    return null;
+  }
+
+  @override
+  Object visitScriptTag(ScriptTag node) {
+    _writer.print(node.scriptTag.lexeme);
+    return null;
+  }
+
+  @override
+  Object visitShowCombinator(ShowCombinator node) {
+    _writer.print("show ");
+    _visitNodeListWithSeparator(node.shownNames, ", ");
+    return null;
+  }
+
+  @override
+  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+    _visitTokenWithSuffix(node.keyword, " ");
+    _visitNodeWithSuffix(node.type, " ");
+    _visitNode(node.identifier);
+    return null;
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    _writer.print(node.token.lexeme);
+    return null;
+  }
+
+  @override
+  Object visitSimpleStringLiteral(SimpleStringLiteral node) {
+    _writer.print(node.literal.lexeme);
+    return null;
+  }
+
+  @override
+  Object visitStringInterpolation(StringInterpolation node) {
+    _visitNodeList(node.elements);
+    return null;
+  }
+
+  @override
+  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    _writer.print("super");
+    _visitNodeWithPrefix(".", node.constructorName);
+    _visitNode(node.argumentList);
+    return null;
+  }
+
+  @override
+  Object visitSuperExpression(SuperExpression node) {
+    _writer.print("super");
+    return null;
+  }
+
+  @override
+  Object visitSwitchCase(SwitchCase node) {
+    _visitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
+    _writer.print("case ");
+    _visitNode(node.expression);
+    _writer.print(": ");
+    _visitNodeListWithSeparator(node.statements, " ");
+    return null;
+  }
+
+  @override
+  Object visitSwitchDefault(SwitchDefault node) {
+    _visitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
+    _writer.print("default: ");
+    _visitNodeListWithSeparator(node.statements, " ");
+    return null;
+  }
+
+  @override
+  Object visitSwitchStatement(SwitchStatement node) {
+    _writer.print("switch (");
+    _visitNode(node.expression);
+    _writer.print(") {");
+    _visitNodeListWithSeparator(node.members, " ");
+    _writer.print("}");
+    return null;
+  }
+
+  @override
+  Object visitSymbolLiteral(SymbolLiteral node) {
+    _writer.print("#");
+    List<Token> components = node.components;
+    for (int i = 0; i < components.length; i++) {
+      if (i > 0) {
+        _writer.print(".");
+      }
+      _writer.print(components[i].lexeme);
+    }
+    return null;
+  }
+
+  @override
+  Object visitThisExpression(ThisExpression node) {
+    _writer.print("this");
+    return null;
+  }
+
+  @override
+  Object visitThrowExpression(ThrowExpression node) {
+    _writer.print("throw ");
+    _visitNode(node.expression);
+    return null;
+  }
+
+  @override
+  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    _visitNodeWithSuffix(node.variables, ";");
+    return null;
+  }
+
+  @override
+  Object visitTryStatement(TryStatement node) {
+    _writer.print("try ");
+    _visitNode(node.body);
+    _visitNodeListWithSeparatorAndPrefix(" ", node.catchClauses, " ");
+    _visitNodeWithPrefix(" finally ", node.finallyBlock);
+    return null;
+  }
+
+  @override
+  Object visitTypeArgumentList(TypeArgumentList node) {
+    _writer.print('<');
+    _visitNodeListWithSeparator(node.arguments, ", ");
+    _writer.print('>');
+    return null;
+  }
+
+  @override
+  Object visitTypeName(TypeName node) {
+    _visitNode(node.name);
+    _visitNode(node.typeArguments);
+    return null;
+  }
+
+  @override
+  Object visitTypeParameter(TypeParameter node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitNode(node.name);
+    _visitNodeWithPrefix(" extends ", node.bound);
+    return null;
+  }
+
+  @override
+  Object visitTypeParameterList(TypeParameterList node) {
+    _writer.print('<');
+    _visitNodeListWithSeparator(node.typeParameters, ", ");
+    _writer.print('>');
+    return null;
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitNode(node.name);
+    _visitNodeWithPrefix(" = ", node.initializer);
+    return null;
+  }
+
+  @override
+  Object visitVariableDeclarationList(VariableDeclarationList node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitTokenWithSuffix(node.keyword, " ");
+    _visitNodeWithSuffix(node.type, " ");
+    _visitNodeListWithSeparator(node.variables, ", ");
+    return null;
+  }
+
+  @override
+  Object visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    _visitNode(node.variables);
+    _writer.print(";");
+    return null;
+  }
+
+  @override
+  Object visitWhileStatement(WhileStatement node) {
+    _writer.print("while (");
+    _visitNode(node.condition);
+    _writer.print(") ");
+    _visitNode(node.body);
+    return null;
+  }
+
+  @override
+  Object visitWithClause(WithClause node) {
+    _writer.print("with ");
+    _visitNodeListWithSeparator(node.mixinTypes, ", ");
+    return null;
+  }
+
+  @override
+  Object visitYieldStatement(YieldStatement node) {
+    if (node.star != null) {
+      _writer.print("yield* ");
+    } else {
+      _writer.print("yield ");
+    }
+    _visitNode(node.expression);
+    _writer.print(";");
+    return null;
+  }
+
+  /**
+   * Visit the given function [body], printing the [prefix] before if the body
+   * is not empty.
+   */
+  void _visitFunctionWithPrefix(String prefix, FunctionBody body) {
+    if (body is! EmptyFunctionBody) {
+      _writer.print(prefix);
+    }
+    _visitNode(body);
+  }
+
+  /**
+   * Safely visit the given [node].
+   */
+  void _visitNode(AstNode node) {
+    if (node != null) {
+      node.accept(this);
+    }
+  }
+
+  /**
+   * Print a list of [nodes] without any separation.
+   */
+  void _visitNodeList(NodeList<AstNode> nodes) {
+    _visitNodeListWithSeparator(nodes, "");
+  }
+
+  /**
+   * Print a list of [nodes], separated by the given [separator].
+   */
+  void _visitNodeListWithSeparator(NodeList<AstNode> nodes, String separator) {
+    if (nodes != null) {
+      int size = nodes.length;
+      for (int i = 0; i < size; i++) {
+        if (i > 0) {
+          _writer.print(separator);
+        }
+        nodes[i].accept(this);
+      }
+    }
+  }
+
+  /**
+   * Print a list of [nodes], prefixed by the given [prefix] if the list is not
+   * empty, and separated by the given [separator].
+   */
+  void _visitNodeListWithSeparatorAndPrefix(
+      String prefix, NodeList<AstNode> nodes, String separator) {
+    if (nodes != null) {
+      int size = nodes.length;
+      if (size > 0) {
+        _writer.print(prefix);
+        for (int i = 0; i < size; i++) {
+          if (i > 0) {
+            _writer.print(separator);
+          }
+          nodes[i].accept(this);
+        }
+      }
+    }
+  }
+
+  /**
+   * Print a list of [nodes], separated by the given [separator], followed by
+   * the given [suffix] if the list is not empty.
+   */
+  void _visitNodeListWithSeparatorAndSuffix(
+      NodeList<AstNode> nodes, String separator, String suffix) {
+    if (nodes != null) {
+      int size = nodes.length;
+      if (size > 0) {
+        for (int i = 0; i < size; i++) {
+          if (i > 0) {
+            _writer.print(separator);
+          }
+          nodes[i].accept(this);
+        }
+        _writer.print(suffix);
+      }
+    }
+  }
+
+  /**
+   * Safely visit the given [node], printing the [prefix] before the node if it
+   * is non-`null`.
+   */
+  void _visitNodeWithPrefix(String prefix, AstNode node) {
+    if (node != null) {
+      _writer.print(prefix);
+      node.accept(this);
+    }
+  }
+
+  /**
+   * Safely visit the given [node], printing the [suffix] after the node if it
+   * is non-`null`.
+   */
+  void _visitNodeWithSuffix(AstNode node, String suffix) {
+    if (node != null) {
+      node.accept(this);
+      _writer.print(suffix);
+    }
+  }
+
+  /**
+   * Safely visit the given [token], printing the [suffix] after the token if it
+   * is non-`null`.
+   */
+  void _visitTokenWithSuffix(Token token, String suffix) {
+    if (token != null) {
+      _writer.print(token.lexeme);
+      _writer.print(suffix);
+    }
+  }
+}
+
+/**
+ * A try statement.
+ *
+ * > tryStatement ::=
+ * >     'try' [Block] ([CatchClause]+ finallyClause? | finallyClause)
+ * >
+ * > finallyClause ::=
+ * >     'finally' [Block]
+ */
+class TryStatement extends Statement {
+  /**
+   * The token representing the 'try' keyword.
+   */
+  Token tryKeyword;
+
+  /**
+   * The body of the statement.
+   */
+  Block _body;
+
+  /**
+   * The catch clauses contained in the try statement.
+   */
+  NodeList<CatchClause> _catchClauses;
+
+  /**
+   * The token representing the 'finally' keyword, or `null` if the statement
+   * does not contain a finally clause.
+   */
+  Token finallyKeyword;
+
+  /**
+   * The finally block contained in the try statement, or `null` if the
+   * statement does not contain a finally clause.
+   */
+  Block _finallyBlock;
+
+  /**
+   * Initialize a newly created try statement. The list of [catchClauses] can be
+   * `null` if there are no catch clauses. The [finallyKeyword] and
+   * [finallyBlock] can be `null` if there is no finally clause.
+   */
+  TryStatement(this.tryKeyword, Block body, List<CatchClause> catchClauses,
+      this.finallyKeyword, Block finallyBlock) {
+    _body = _becomeParentOf(body);
+    _catchClauses = new NodeList<CatchClause>(this, catchClauses);
+    _finallyBlock = _becomeParentOf(finallyBlock);
+  }
+
+  @override
+  Token get beginToken => tryKeyword;
+
+  /**
+   * Return the body of the statement.
+   */
+  Block get body => _body;
+
+  /**
+   * Set the body of the statement to the given [block].
+   */
+  void set body(Block block) {
+    _body = _becomeParentOf(block);
+  }
+
+  /**
+   * Return the catch clauses contained in the try statement.
+   */
+  NodeList<CatchClause> get catchClauses => _catchClauses;
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(tryKeyword)
+    ..add(_body)
+    ..addAll(_catchClauses)
+    ..add(finallyKeyword)
+    ..add(_finallyBlock);
+
+  @override
+  Token get endToken {
+    if (_finallyBlock != null) {
+      return _finallyBlock.endToken;
+    } else if (finallyKeyword != null) {
+      return finallyKeyword;
+    } else if (!_catchClauses.isEmpty) {
+      return _catchClauses.endToken;
+    }
+    return _body.endToken;
+  }
+
+  /**
+   * Return the finally block contained in the try statement, or `null` if the
+   * statement does not contain a finally clause.
+   */
+  Block get finallyBlock => _finallyBlock;
+
+  /**
+   * Set the finally block contained in the try statement to the given [block].
+   */
+  void set finallyBlock(Block block) {
+    _finallyBlock = _becomeParentOf(block);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitTryStatement(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_body, visitor);
+    _catchClauses.accept(visitor);
+    _safelyVisitChild(_finallyBlock, visitor);
+  }
+}
+
+/**
+ * The declaration of a type alias.
+ *
+ * > typeAlias ::=
+ * >     'typedef' typeAliasBody
+ * >
+ * > typeAliasBody ::=
+ * >     classTypeAlias
+ * >   | functionTypeAlias
+ */
+abstract class TypeAlias extends NamedCompilationUnitMember {
+  /**
+   * The token representing the 'typedef' keyword.
+   */
+  Token typedefKeyword;
+
+  /**
+   * The semicolon terminating the declaration.
+   */
+  Token semicolon;
+
+  /**
+   * Initialize a newly created type alias. Either or both of the [comment] and
+   * [metadata] can be `null` if the declaration does not have the corresponding
+   * attribute.
+   */
+  TypeAlias(Comment comment, List<Annotation> metadata, this.typedefKeyword,
+      SimpleIdentifier name, this.semicolon)
+      : super(comment, metadata, name);
+
+  @override
+  Token get endToken => semicolon;
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata => typedefKeyword;
+
+  /**
+   * Return the token representing the 'typedef' keyword.
+   */
+  @deprecated // Use "this.typedefKeyword"
+  Token get keyword => typedefKeyword;
+
+  /**
+   * Set the token representing the 'typedef' keyword to the given [token].
+   */
+  @deprecated // Use "this.typedefKeyword"
+  set keyword(Token token) {
+    typedefKeyword = token;
+  }
+}
+
+/**
+ * A list of type arguments.
+ *
+ * > typeArguments ::=
+ * >     '<' typeName (',' typeName)* '>'
+ */
+class TypeArgumentList extends AstNode {
+  /**
+   * The left bracket.
+   */
+  Token leftBracket;
+
+  /**
+   * The type arguments associated with the type.
+   */
+  NodeList<TypeName> _arguments;
+
+  /**
+   * The right bracket.
+   */
+  Token rightBracket;
+
+  /**
+   * Initialize a newly created list of type arguments.
+   */
+  TypeArgumentList(
+      this.leftBracket, List<TypeName> arguments, this.rightBracket) {
+    _arguments = new NodeList<TypeName>(this, arguments);
+  }
+
+  /**
+   * Return the type arguments associated with the type.
+   */
+  NodeList<TypeName> get arguments => _arguments;
+
+  @override
+  Token get beginToken => leftBracket;
+
+  /**
+   * TODO(paulberry): Add commas.
+   */
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(leftBracket)
+    ..addAll(_arguments)
+    ..add(rightBracket);
+
+  @override
+  Token get endToken => rightBracket;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitTypeArgumentList(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _arguments.accept(visitor);
+  }
+}
+
+/**
+ * A literal that has a type associated with it.
+ *
+ * > typedLiteral ::=
+ * >     [ListLiteral]
+ * >   | [MapLiteral]
+ */
+abstract class TypedLiteral extends Literal {
+  /**
+   * The token representing the 'const' keyword, or `null` if the literal is not
+   * a constant.
+   */
+  Token constKeyword;
+
+  /**
+   * The type argument associated with this literal, or `null` if no type
+   * arguments were declared.
+   */
+  TypeArgumentList _typeArguments;
+
+  /**
+   * Initialize a newly created typed literal. The [constKeyword] can be `null`\
+   * if the literal is not a constant. The [typeArguments] can be `null` if no
+   * type arguments were declared.
+   */
+  TypedLiteral(this.constKeyword, TypeArgumentList typeArguments) {
+    _typeArguments = _becomeParentOf(typeArguments);
+  }
+
+  /**
+   * Return the type argument associated with this literal, or `null` if no type
+   * arguments were declared.
+   */
+  TypeArgumentList get typeArguments => _typeArguments;
+
+  /**
+   * Set the type argument associated with this literal to the given
+   * [typeArguments].
+   */
+  void set typeArguments(TypeArgumentList typeArguments) {
+    _typeArguments = _becomeParentOf(typeArguments);
+  }
+
+  ChildEntities get _childEntities =>
+      new ChildEntities()..add(constKeyword)..add(_typeArguments);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_typeArguments, visitor);
+  }
+}
+
+/**
+ * The name of a type, which can optionally include type arguments.
+ *
+ * > typeName ::=
+ * >     [Identifier] typeArguments?
+ */
+class TypeName extends AstNode {
+  /**
+   * The name of the type.
+   */
+  Identifier _name;
+
+  /**
+   * The type arguments associated with the type, or `null` if there are no type
+   * arguments.
+   */
+  TypeArgumentList _typeArguments;
+
+  /**
+   * The type being named, or `null` if the AST structure has not been resolved.
+   */
+  DartType type;
+
+  /**
+   * Initialize a newly created type name. The [typeArguments] can be `null` if
+   * there are no type arguments.
+   */
+  TypeName(Identifier name, TypeArgumentList typeArguments) {
+    _name = _becomeParentOf(name);
+    _typeArguments = _becomeParentOf(typeArguments);
+  }
+
+  @override
+  Token get beginToken => _name.beginToken;
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(_name)..add(_typeArguments);
+
+  @override
+  Token get endToken {
+    if (_typeArguments != null) {
+      return _typeArguments.endToken;
+    }
+    return _name.endToken;
+  }
+
+  /**
+   * Return `true` if this type is a deferred type.
+   *
+   * 15.1 Static Types: A type <i>T</i> is deferred iff it is of the form
+   * </i>p.T</i> where <i>p</i> is a deferred prefix.
+   */
+  bool get isDeferred {
+    Identifier identifier = name;
+    if (identifier is! PrefixedIdentifier) {
+      return false;
+    }
+    return (identifier as PrefixedIdentifier).isDeferred;
+  }
+
+  @override
+  bool get isSynthetic => _name.isSynthetic && _typeArguments == null;
+
+  /**
+   * Return the name of the type.
+   */
+  Identifier get name => _name;
+
+  /**
+   * Set the name of the type to the given [identifier].
+   */
+  void set name(Identifier identifier) {
+    _name = _becomeParentOf(identifier);
+  }
+
+  /**
+   * Return the type arguments associated with the type, or `null` if there are
+   * no type arguments.
+   */
+  TypeArgumentList get typeArguments => _typeArguments;
+
+  /**
+   * Set the type arguments associated with the type to the given
+   * [typeArguments].
+   */
+  void set typeArguments(TypeArgumentList typeArguments) {
+    _typeArguments = _becomeParentOf(typeArguments);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitTypeName(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_name, visitor);
+    _safelyVisitChild(_typeArguments, visitor);
+  }
+}
+
+/**
+ * A type parameter.
+ *
+ * > typeParameter ::=
+ * >     [SimpleIdentifier] ('extends' [TypeName])?
+ */
+class TypeParameter extends Declaration {
+  /**
+   * The name of the type parameter.
+   */
+  SimpleIdentifier _name;
+
+  /**
+   * The token representing the 'extends' keyword, or `null` if there is no
+   * explicit upper bound.
+   */
+  Token extendsKeyword;
+
+  /**
+   * The name of the upper bound for legal arguments, or `null` if there is no
+   * explicit upper bound.
+   */
+  TypeName _bound;
+
+  /**
+   * Initialize a newly created type parameter. Either or both of the [comment]
+   * and [metadata] can be `null` if the parameter does not have the
+   * corresponding attribute. The [extendsKeyword] and [bound] can be `null` if
+   * the parameter does not have an upper bound.
+   */
+  TypeParameter(Comment comment, List<Annotation> metadata,
+      SimpleIdentifier name, this.extendsKeyword, TypeName bound)
+      : super(comment, metadata) {
+    _name = _becomeParentOf(name);
+    _bound = _becomeParentOf(bound);
+  }
+
+  /**
+   * Return the name of the upper bound for legal arguments, or `null` if there
+   * is no explicit upper bound.
+   */
+  TypeName get bound => _bound;
+
+  /**
+   * Set the name of the upper bound for legal arguments to the given
+   * [typeName].
+   */
+  void set bound(TypeName typeName) {
+    _bound = _becomeParentOf(typeName);
+  }
+
+  @override
+  Iterable get childEntities =>
+      super._childEntities..add(_name)..add(extendsKeyword)..add(_bound);
+
+  @override
+  TypeParameterElement get element =>
+      _name != null ? (_name.staticElement as TypeParameterElement) : null;
+
+  @override
+  Token get endToken {
+    if (_bound == null) {
+      return _name.endToken;
+    }
+    return _bound.endToken;
+  }
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
+
+  /**
+   * Return the token representing the 'extends' keyword, or `null` if there is
+   * no explicit upper bound.
+   */
+  @deprecated // Use "this.extendsKeyword"
+  Token get keyword => extendsKeyword;
+
+  /**
+   * Set the token representing the 'extends' keyword to the given [token].
+   */
+  @deprecated // Use "this.extendsKeyword"
+  set keyword(Token token) {
+    extendsKeyword = token;
+  }
+
+  /**
+   * Return the name of the type parameter.
+   */
+  SimpleIdentifier get name => _name;
+
+  /**
+   * Set the name of the type parameter to the given [identifier].
+   */
+  void set name(SimpleIdentifier identifier) {
+    _name = _becomeParentOf(identifier);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitTypeParameter(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_name, visitor);
+    _safelyVisitChild(_bound, visitor);
+  }
+}
+
+/**
+ * Type parameters within a declaration.
+ *
+ * > typeParameterList ::=
+ * >     '<' [TypeParameter] (',' [TypeParameter])* '>'
+ */
+class TypeParameterList extends AstNode {
+  /**
+   * The left angle bracket.
+   */
+  final Token leftBracket;
+
+  /**
+   * The type parameters in the list.
+   */
+  NodeList<TypeParameter> _typeParameters;
+
+  /**
+   * The right angle bracket.
+   */
+  final Token rightBracket;
+
+  /**
+   * Initialize a newly created list of type parameters.
+   */
+  TypeParameterList(
+      this.leftBracket, List<TypeParameter> typeParameters, this.rightBracket) {
+    _typeParameters = new NodeList<TypeParameter>(this, typeParameters);
+  }
+
+  @override
+  Token get beginToken => leftBracket;
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(leftBracket)
+    ..addAll(_typeParameters)
+    ..add(rightBracket);
+
+  @override
+  Token get endToken => rightBracket;
+
+  /**
+   * Return the type parameters for the type.
+   */
+  NodeList<TypeParameter> get typeParameters => _typeParameters;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitTypeParameterList(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _typeParameters.accept(visitor);
+  }
+}
+
+/**
+ * An AST visitor that will recursively visit all of the nodes in an AST
+ * structure (like instances of the class [RecursiveAstVisitor]). In addition,
+ * every node will also be visited by using a single unified [visitNode] method.
+ *
+ * Subclasses that override a visit method must either invoke the overridden
+ * visit method or explicitly invoke the more general [visitNode] method.
+ * Failure to do so will cause the children of the visited node to not be
+ * visited.
+ */
+class UnifyingAstVisitor<R> implements AstVisitor<R> {
+  @override
+  R visitAdjacentStrings(AdjacentStrings node) => visitNode(node);
+
+  @override
+  R visitAnnotation(Annotation node) => visitNode(node);
+
+  @override
+  R visitArgumentList(ArgumentList node) => visitNode(node);
+
+  @override
+  R visitAsExpression(AsExpression node) => visitNode(node);
+
+  @override
+  R visitAssertStatement(AssertStatement node) => visitNode(node);
+
+  @override
+  R visitAssignmentExpression(AssignmentExpression node) => visitNode(node);
+
+  @override
+  R visitAwaitExpression(AwaitExpression node) => visitNode(node);
+
+  @override
+  R visitBinaryExpression(BinaryExpression node) => visitNode(node);
+
+  @override
+  R visitBlock(Block node) => visitNode(node);
+
+  @override
+  R visitBlockFunctionBody(BlockFunctionBody node) => visitNode(node);
+
+  @override
+  R visitBooleanLiteral(BooleanLiteral node) => visitNode(node);
+
+  @override
+  R visitBreakStatement(BreakStatement node) => visitNode(node);
+
+  @override
+  R visitCascadeExpression(CascadeExpression node) => visitNode(node);
+
+  @override
+  R visitCatchClause(CatchClause node) => visitNode(node);
+
+  @override
+  R visitClassDeclaration(ClassDeclaration node) => visitNode(node);
+
+  @override
+  R visitClassTypeAlias(ClassTypeAlias node) => visitNode(node);
+
+  @override
+  R visitComment(Comment node) => visitNode(node);
+
+  @override
+  R visitCommentReference(CommentReference node) => visitNode(node);
+
+  @override
+  R visitCompilationUnit(CompilationUnit node) => visitNode(node);
+
+  @override
+  R visitConditionalExpression(ConditionalExpression node) => visitNode(node);
+
+  @override
+  R visitConstructorDeclaration(ConstructorDeclaration node) => visitNode(node);
+
+  @override
+  R visitConstructorFieldInitializer(ConstructorFieldInitializer node) =>
+      visitNode(node);
+
+  @override
+  R visitConstructorName(ConstructorName node) => visitNode(node);
+
+  @override
+  R visitContinueStatement(ContinueStatement node) => visitNode(node);
+
+  @override
+  R visitDeclaredIdentifier(DeclaredIdentifier node) => visitNode(node);
+
+  @override
+  R visitDefaultFormalParameter(DefaultFormalParameter node) => visitNode(node);
+
+  @override
+  R visitDoStatement(DoStatement node) => visitNode(node);
+
+  @override
+  R visitDoubleLiteral(DoubleLiteral node) => visitNode(node);
+
+  @override
+  R visitEmptyFunctionBody(EmptyFunctionBody node) => visitNode(node);
+
+  @override
+  R visitEmptyStatement(EmptyStatement node) => visitNode(node);
+
+  @override
+  R visitEnumConstantDeclaration(EnumConstantDeclaration node) =>
+      visitNode(node);
+
+  @override
+  R visitEnumDeclaration(EnumDeclaration node) => visitNode(node);
+
+  @override
+  R visitExportDirective(ExportDirective node) => visitNode(node);
+
+  @override
+  R visitExpressionFunctionBody(ExpressionFunctionBody node) => visitNode(node);
+
+  @override
+  R visitExpressionStatement(ExpressionStatement node) => visitNode(node);
+
+  @override
+  R visitExtendsClause(ExtendsClause node) => visitNode(node);
+
+  @override
+  R visitFieldDeclaration(FieldDeclaration node) => visitNode(node);
+
+  @override
+  R visitFieldFormalParameter(FieldFormalParameter node) => visitNode(node);
+
+  @override
+  R visitForEachStatement(ForEachStatement node) => visitNode(node);
+
+  @override
+  R visitFormalParameterList(FormalParameterList node) => visitNode(node);
+
+  @override
+  R visitForStatement(ForStatement node) => visitNode(node);
+
+  @override
+  R visitFunctionDeclaration(FunctionDeclaration node) => visitNode(node);
+
+  @override
+  R visitFunctionDeclarationStatement(FunctionDeclarationStatement node) =>
+      visitNode(node);
+
+  @override
+  R visitFunctionExpression(FunctionExpression node) => visitNode(node);
+
+  @override
+  R visitFunctionExpressionInvocation(FunctionExpressionInvocation node) =>
+      visitNode(node);
+
+  @override
+  R visitFunctionTypeAlias(FunctionTypeAlias node) => visitNode(node);
+
+  @override
+  R visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) =>
+      visitNode(node);
+
+  @override
+  R visitHideCombinator(HideCombinator node) => visitNode(node);
+
+  @override
+  R visitIfStatement(IfStatement node) => visitNode(node);
+
+  @override
+  R visitImplementsClause(ImplementsClause node) => visitNode(node);
+
+  @override
+  R visitImportDirective(ImportDirective node) => visitNode(node);
+
+  @override
+  R visitIndexExpression(IndexExpression node) => visitNode(node);
+
+  @override
+  R visitInstanceCreationExpression(InstanceCreationExpression node) =>
+      visitNode(node);
+
+  @override
+  R visitIntegerLiteral(IntegerLiteral node) => visitNode(node);
+
+  @override
+  R visitInterpolationExpression(InterpolationExpression node) =>
+      visitNode(node);
+
+  @override
+  R visitInterpolationString(InterpolationString node) => visitNode(node);
+
+  @override
+  R visitIsExpression(IsExpression node) => visitNode(node);
+
+  @override
+  R visitLabel(Label node) => visitNode(node);
+
+  @override
+  R visitLabeledStatement(LabeledStatement node) => visitNode(node);
+
+  @override
+  R visitLibraryDirective(LibraryDirective node) => visitNode(node);
+
+  @override
+  R visitLibraryIdentifier(LibraryIdentifier node) => visitNode(node);
+
+  @override
+  R visitListLiteral(ListLiteral node) => visitNode(node);
+
+  @override
+  R visitMapLiteral(MapLiteral node) => visitNode(node);
+
+  @override
+  R visitMapLiteralEntry(MapLiteralEntry node) => visitNode(node);
+
+  @override
+  R visitMethodDeclaration(MethodDeclaration node) => visitNode(node);
+
+  @override
+  R visitMethodInvocation(MethodInvocation node) => visitNode(node);
+
+  @override
+  R visitNamedExpression(NamedExpression node) => visitNode(node);
+
+  @override
+  R visitNativeClause(NativeClause node) => visitNode(node);
+
+  @override
+  R visitNativeFunctionBody(NativeFunctionBody node) => visitNode(node);
+
+  R visitNode(AstNode node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitNullLiteral(NullLiteral node) => visitNode(node);
+
+  @override
+  R visitParenthesizedExpression(ParenthesizedExpression node) =>
+      visitNode(node);
+
+  @override
+  R visitPartDirective(PartDirective node) => visitNode(node);
+
+  @override
+  R visitPartOfDirective(PartOfDirective node) => visitNode(node);
+
+  @override
+  R visitPostfixExpression(PostfixExpression node) => visitNode(node);
+
+  @override
+  R visitPrefixedIdentifier(PrefixedIdentifier node) => visitNode(node);
+
+  @override
+  R visitPrefixExpression(PrefixExpression node) => visitNode(node);
+
+  @override
+  R visitPropertyAccess(PropertyAccess node) => visitNode(node);
+
+  @override
+  R visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) => visitNode(node);
+
+  @override
+  R visitRethrowExpression(RethrowExpression node) => visitNode(node);
+
+  @override
+  R visitReturnStatement(ReturnStatement node) => visitNode(node);
+
+  @override
+  R visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
+
+  @override
+  R visitShowCombinator(ShowCombinator node) => visitNode(node);
+
+  @override
+  R visitSimpleFormalParameter(SimpleFormalParameter node) => visitNode(node);
+
+  @override
+  R visitSimpleIdentifier(SimpleIdentifier node) => visitNode(node);
+
+  @override
+  R visitSimpleStringLiteral(SimpleStringLiteral node) => visitNode(node);
+
+  @override
+  R visitStringInterpolation(StringInterpolation node) => visitNode(node);
+
+  @override
+  R visitSuperConstructorInvocation(SuperConstructorInvocation node) =>
+      visitNode(node);
+
+  @override
+  R visitSuperExpression(SuperExpression node) => visitNode(node);
+
+  @override
+  R visitSwitchCase(SwitchCase node) => visitNode(node);
+
+  @override
+  R visitSwitchDefault(SwitchDefault node) => visitNode(node);
+
+  @override
+  R visitSwitchStatement(SwitchStatement node) => visitNode(node);
+
+  @override
+  R visitSymbolLiteral(SymbolLiteral node) => visitNode(node);
+
+  @override
+  R visitThisExpression(ThisExpression node) => visitNode(node);
+
+  @override
+  R visitThrowExpression(ThrowExpression node) => visitNode(node);
+
+  @override
+  R visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) =>
+      visitNode(node);
+
+  @override
+  R visitTryStatement(TryStatement node) => visitNode(node);
+
+  @override
+  R visitTypeArgumentList(TypeArgumentList node) => visitNode(node);
+
+  @override
+  R visitTypeName(TypeName node) => visitNode(node);
+
+  @override
+  R visitTypeParameter(TypeParameter node) => visitNode(node);
+
+  @override
+  R visitTypeParameterList(TypeParameterList node) => visitNode(node);
+
+  @override
+  R visitVariableDeclaration(VariableDeclaration node) => visitNode(node);
+
+  @override
+  R visitVariableDeclarationList(VariableDeclarationList node) =>
+      visitNode(node);
+
+  @override
+  R visitVariableDeclarationStatement(VariableDeclarationStatement node) =>
+      visitNode(node);
+
+  @override
+  R visitWhileStatement(WhileStatement node) => visitNode(node);
+
+  @override
+  R visitWithClause(WithClause node) => visitNode(node);
+
+  @override
+  R visitYieldStatement(YieldStatement node) => visitNode(node);
+}
+
+/**
+ * A directive that references a URI.
+ *
+ * > uriBasedDirective ::=
+ * >     [ExportDirective]
+ * >   | [ImportDirective]
+ * >   | [PartDirective]
+ */
+abstract class UriBasedDirective extends Directive {
+  /**
+   * The prefix of a URI using the `dart-ext` scheme to reference a native code
+   * library.
+   */
+  static String _DART_EXT_SCHEME = "dart-ext:";
+
+  /**
+   * The URI referenced by this directive.
+   */
+  StringLiteral _uri;
+
+  /**
+   * The content of the URI.
+   */
+  String uriContent;
+
+  /**
+   * The source to which the URI was resolved.
+   */
+  Source source;
+
+  /**
+   * Initialize a newly create URI-based directive. Either or both of the
+   * [comment] and [metadata] can be `null` if the directive does not have the
+   * corresponding attribute.
+   */
+  UriBasedDirective(
+      Comment comment, List<Annotation> metadata, StringLiteral uri)
+      : super(comment, metadata) {
+    _uri = _becomeParentOf(uri);
+  }
+
+  /**
+   * Return the URI referenced by this directive.
+   */
+  StringLiteral get uri => _uri;
+
+  /**
+   * Set the URI referenced by this directive to the given [uri].
+   */
+  void set uri(StringLiteral uri) {
+    _uri = _becomeParentOf(uri);
+  }
+
+  /**
+   * Return the element associated with the URI of this directive, or `null` if
+   * the AST structure has not been resolved or if the URI could not be
+   * resolved. Examples of the latter case include a directive that contains an
+   * invalid URL or a URL that does not exist.
+   */
+  Element get uriElement;
+
+  /**
+   * Validate this directive, but do not check for existence. Return a code
+   * indicating the problem if there is one, or `null` no problem
+   */
+  UriValidationCode validate() {
+    StringLiteral uriLiteral = uri;
+    if (uriLiteral is StringInterpolation) {
+      return UriValidationCode.URI_WITH_INTERPOLATION;
+    }
+    String uriContent = this.uriContent;
+    if (uriContent == null) {
+      return UriValidationCode.INVALID_URI;
+    }
+    if (this is ImportDirective && uriContent.startsWith(_DART_EXT_SCHEME)) {
+      return UriValidationCode.URI_WITH_DART_EXT_SCHEME;
+    }
+    try {
+      parseUriWithException(Uri.encodeFull(uriContent));
+    } on URISyntaxException {
+      return UriValidationCode.INVALID_URI;
+    }
+    return null;
+  }
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_uri, visitor);
+  }
+}
+
+/**
+ * Validation codes returned by [UriBasedDirective.validate].
+ */
+class UriValidationCode {
+  static const UriValidationCode INVALID_URI =
+      const UriValidationCode('INVALID_URI');
+
+  static const UriValidationCode URI_WITH_INTERPOLATION =
+      const UriValidationCode('URI_WITH_INTERPOLATION');
+
+  static const UriValidationCode URI_WITH_DART_EXT_SCHEME =
+      const UriValidationCode('URI_WITH_DART_EXT_SCHEME');
+
+  /**
+   * The name of the validation code.
+   */
+  final String name;
+
+  /**
+   * Initialize a newly created validation code to have the given [name].
+   */
+  const UriValidationCode(this.name);
+
+  @override
+  String toString() => name;
+}
+
+/**
+ * An identifier that has an initial value associated with it. Instances of this
+ * class are always children of the class [VariableDeclarationList].
+ *
+ * > variableDeclaration ::=
+ * >     [SimpleIdentifier] ('=' [Expression])?
+ *
+ * TODO(paulberry): the grammar does not allow metadata to be associated with
+ * a VariableDeclaration, and currently we don't record comments for it either.
+ * Consider changing the class hierarchy so that [VariableDeclaration] does not
+ * extend [Declaration].
+ */
+class VariableDeclaration extends Declaration {
+  /**
+   * The name of the variable being declared.
+   */
+  SimpleIdentifier _name;
+
+  /**
+   * The equal sign separating the variable name from the initial value, or
+   * `null` if the initial value was not specified.
+   */
+  Token equals;
+
+  /**
+   * The expression used to compute the initial value for the variable, or
+   * `null` if the initial value was not specified.
+   */
+  Expression _initializer;
+
+  /**
+   * Initialize a newly created variable declaration. The [equals] and
+   * [initializer] can be `null` if there is no initializer.
+   */
+  VariableDeclaration(
+      SimpleIdentifier name, this.equals, Expression initializer)
+      : super(null, null) {
+    _name = _becomeParentOf(name);
+    _initializer = _becomeParentOf(initializer);
+  }
+
+  @override
+  Iterable get childEntities =>
+      super._childEntities..add(_name)..add(equals)..add(_initializer);
+
+  /**
+   * This overridden implementation of getDocumentationComment() looks in the
+   * grandparent node for dartdoc comments if no documentation is specifically
+   * available on the node.
+   */
+  @override
+  Comment get documentationComment {
+    Comment comment = super.documentationComment;
+    if (comment == null) {
+      if (parent != null && parent.parent != null) {
+        AstNode node = parent.parent;
+        if (node is AnnotatedNode) {
+          return node.documentationComment;
+        }
+      }
+    }
+    return comment;
+  }
+
+  @override
+  VariableElement get element =>
+      _name != null ? (_name.staticElement as VariableElement) : null;
+
+  @override
+  Token get endToken {
+    if (_initializer != null) {
+      return _initializer.endToken;
+    }
+    return _name.endToken;
+  }
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
+
+  /**
+   * Return the expression used to compute the initial value for the variable,
+   * or `null` if the initial value was not specified.
+   */
+  Expression get initializer => _initializer;
+
+  /**
+   * Set the expression used to compute the initial value for the variable to
+   * the given [expression].
+   */
+  void set initializer(Expression expression) {
+    _initializer = _becomeParentOf(expression);
+  }
+
+  /**
+   * Return `true` if this variable was declared with the 'const' modifier.
+   */
+  bool get isConst {
+    AstNode parent = this.parent;
+    return parent is VariableDeclarationList && parent.isConst;
+  }
+
+  /**
+   * Return `true` if this variable was declared with the 'final' modifier.
+   * Variables that are declared with the 'const' modifier will return `false`
+   * even though they are implicitly final.
+   */
+  bool get isFinal {
+    AstNode parent = this.parent;
+    return parent is VariableDeclarationList && parent.isFinal;
+  }
+
+  /**
+   * Return the name of the variable being declared.
+   */
+  SimpleIdentifier get name => _name;
+
+  /**
+   * Set the name of the variable being declared to the given [identifier].
+   */
+  void set name(SimpleIdentifier identifier) {
+    _name = _becomeParentOf(identifier);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitVariableDeclaration(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_name, visitor);
+    _safelyVisitChild(_initializer, visitor);
+  }
+}
+
+/**
+ * The declaration of one or more variables of the same type.
+ *
+ * > variableDeclarationList ::=
+ * >     finalConstVarOrType [VariableDeclaration] (',' [VariableDeclaration])*
+ * >
+ * > finalConstVarOrType ::=
+ * >   | 'final' [TypeName]?
+ * >   | 'const' [TypeName]?
+ * >   | 'var'
+ * >   | [TypeName]
+ */
+class VariableDeclarationList extends AnnotatedNode {
+  /**
+   * The token representing the 'final', 'const' or 'var' keyword, or `null` if
+   * no keyword was included.
+   */
+  Token keyword;
+
+  /**
+   * The type of the variables being declared, or `null` if no type was provided.
+   */
+  TypeName _type;
+
+  /**
+   * A list containing the individual variables being declared.
+   */
+  NodeList<VariableDeclaration> _variables;
+
+  /**
+   * Initialize a newly created variable declaration list. Either or both of the
+   * [comment] and [metadata] can be `null` if the variable list does not have
+   * the corresponding attribute. The [keyword] can be `null` if a type was
+   * specified. The [type] must be `null` if the keyword is 'var'.
+   */
+  VariableDeclarationList(Comment comment, List<Annotation> metadata,
+      this.keyword, TypeName type, List<VariableDeclaration> variables)
+      : super(comment, metadata) {
+    _type = _becomeParentOf(type);
+    _variables = new NodeList<VariableDeclaration>(this, variables);
+  }
+
+  /**
+   * TODO(paulberry): include commas.
+   */
+  @override
+  Iterable get childEntities => super._childEntities
+    ..add(keyword)
+    ..add(_type)
+    ..addAll(_variables);
+
+  @override
+  Token get endToken => _variables.endToken;
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata {
+    if (keyword != null) {
+      return keyword;
+    } else if (_type != null) {
+      return _type.beginToken;
+    }
+    return _variables.beginToken;
+  }
+
+  /**
+   * Return `true` if the variables in this list were declared with the 'const'
+   * modifier.
+   */
+  bool get isConst => keyword is KeywordToken &&
+      (keyword as KeywordToken).keyword == Keyword.CONST;
+
+  /**
+   * Return `true` if the variables in this list were declared with the 'final'
+   * modifier. Variables that are declared with the 'const' modifier will return
+   * `false` even though they are implicitly final. (In other words, this is a
+   * syntactic check rather than a semantic check.)
+   */
+  bool get isFinal => keyword is KeywordToken &&
+      (keyword as KeywordToken).keyword == Keyword.FINAL;
+
+  /**
+   * Return the type of the variables being declared, or `null` if no type was
+   * provided.
+   */
+  TypeName get type => _type;
+
+  /**
+   * Set the type of the variables being declared to the given [typeName].
+   */
+  void set type(TypeName typeName) {
+    _type = _becomeParentOf(typeName);
+  }
+
+  /**
+   * Return a list containing the individual variables being declared.
+   */
+  NodeList<VariableDeclaration> get variables => _variables;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitVariableDeclarationList(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _safelyVisitChild(_type, visitor);
+    _variables.accept(visitor);
+  }
+}
+
+/**
+ * A list of variables that are being declared in a context where a statement is
+ * required.
+ *
+ * > variableDeclarationStatement ::=
+ * >     [VariableDeclarationList] ';'
+ */
+class VariableDeclarationStatement extends Statement {
+  /**
+   * The variables being declared.
+   */
+  VariableDeclarationList _variableList;
+
+  /**
+   * The semicolon terminating the statement.
+   */
+  Token semicolon;
+
+  /**
+   * Initialize a newly created variable declaration statement.
+   */
+  VariableDeclarationStatement(
+      VariableDeclarationList variableList, this.semicolon) {
+    _variableList = _becomeParentOf(variableList);
+  }
+
+  @override
+  Token get beginToken => _variableList.beginToken;
+
+  @override
+  Iterable get childEntities =>
+      new ChildEntities()..add(_variableList)..add(semicolon);
+
+  @override
+  Token get endToken => semicolon;
+
+  /**
+   * Return the variables being declared.
+   */
+  VariableDeclarationList get variables => _variableList;
+
+  /**
+   * Set the variables being declared to the given list of [variables].
+   */
+  void set variables(VariableDeclarationList variables) {
+    _variableList = _becomeParentOf(variables);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitVariableDeclarationStatement(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_variableList, visitor);
+  }
+}
+
+/**
+ * A while statement.
+ *
+ * > whileStatement ::=
+ * >     'while' '(' [Expression] ')' [Statement]
+ */
+class WhileStatement extends Statement {
+  /**
+   * The token representing the 'while' keyword.
+   */
+  Token whileKeyword;
+
+  /**
+   * The left parenthesis.
+   */
+  Token leftParenthesis;
+
+  /**
+   * The expression used to determine whether to execute the body of the loop.
+   */
+  Expression _condition;
+
+  /**
+   * The right parenthesis.
+   */
+  Token rightParenthesis;
+
+  /**
+   * The body of the loop.
+   */
+  Statement _body;
+
+  /**
+   * Initialize a newly created while statement.
+   */
+  WhileStatement(this.whileKeyword, this.leftParenthesis, Expression condition,
+      this.rightParenthesis, Statement body) {
+    _condition = _becomeParentOf(condition);
+    _body = _becomeParentOf(body);
+  }
+
+  @override
+  Token get beginToken => whileKeyword;
+
+  /**
+   * Return the body of the loop.
+   */
+  Statement get body => _body;
+
+  /**
+   * Set the body of the loop to the given [statement].
+   */
+  void set body(Statement statement) {
+    _body = _becomeParentOf(statement);
+  }
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(whileKeyword)
+    ..add(leftParenthesis)
+    ..add(_condition)
+    ..add(rightParenthesis)
+    ..add(_body);
+
+  /**
+   * Return the expression used to determine whether to execute the body of the
+   * loop.
+   */
+  Expression get condition => _condition;
+
+  /**
+   * Set the expression used to determine whether to execute the body of the
+   * loop to the given [expression].
+   */
+  void set condition(Expression expression) {
+    _condition = _becomeParentOf(expression);
+  }
+
+  @override
+  Token get endToken => _body.endToken;
+
+  /**
+   * Return the token representing the 'while' keyword.
+   */
+  @deprecated // Use "this.whileKeyword"
+  Token get keyword => whileKeyword;
+
+  /**
+   * Set the token representing the 'while' keyword to the given [token].
+   */
+  @deprecated // Use "this.whileKeyword"
+  set keyword(Token token) {
+    whileKeyword = token;
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitWhileStatement(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_condition, visitor);
+    _safelyVisitChild(_body, visitor);
+  }
+}
+
+/**
+ * The with clause in a class declaration.
+ *
+ * > withClause ::=
+ * >     'with' [TypeName] (',' [TypeName])*
+ */
+class WithClause extends AstNode {
+  /**
+   * The token representing the 'with' keyword.
+   */
+  Token withKeyword;
+
+  /**
+   * The names of the mixins that were specified.
+   */
+  NodeList<TypeName> _mixinTypes;
+
+  /**
+   * Initialize a newly created with clause.
+   */
+  WithClause(this.withKeyword, List<TypeName> mixinTypes) {
+    _mixinTypes = new NodeList<TypeName>(this, mixinTypes);
+  }
+
+  @override
+  Token get beginToken => withKeyword;
+
+  /**
+   * TODO(paulberry): add commas.
+   */
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(withKeyword)
+    ..addAll(_mixinTypes);
+
+  @override
+  Token get endToken => _mixinTypes.endToken;
+
+  /**
+   * Set the token representing the 'with' keyword to the given [token].
+   */
+  @deprecated // Use "this.withKeyword"
+  void set mixinKeyword(Token token) {
+    this.withKeyword = token;
+  }
+
+  /**
+   * Return the names of the mixins that were specified.
+   */
+  NodeList<TypeName> get mixinTypes => _mixinTypes;
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitWithClause(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _mixinTypes.accept(visitor);
+  }
+}
+
+/**
+ * A yield statement.
+ *
+ * > yieldStatement ::=
+ * >     'yield' '*'? [Expression] ‘;’
+ */
+class YieldStatement extends Statement {
+  /**
+   * The 'yield' keyword.
+   */
+  Token yieldKeyword;
+
+  /**
+   * The star optionally following the 'yield' keyword.
+   */
+  Token star;
+
+  /**
+   * The expression whose value will be yielded.
+   */
+  Expression _expression;
+
+  /**
+   * The semicolon following the expression.
+   */
+  Token semicolon;
+
+  /**
+   * Initialize a newly created yield expression. The [star] can be `null` if no
+   * star was provided.
+   */
+  YieldStatement(
+      this.yieldKeyword, this.star, Expression expression, this.semicolon) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  @override
+  Token get beginToken {
+    if (yieldKeyword != null) {
+      return yieldKeyword;
+    }
+    return _expression.beginToken;
+  }
+
+  @override
+  Iterable get childEntities => new ChildEntities()
+    ..add(yieldKeyword)
+    ..add(star)
+    ..add(_expression)
+    ..add(semicolon);
+
+  @override
+  Token get endToken {
+    if (semicolon != null) {
+      return semicolon;
+    }
+    return _expression.endToken;
+  }
+
+  /**
+   * Return the expression whose value will be yielded.
+   */
+  Expression get expression => _expression;
+
+  /**
+   * Set the expression whose value will be yielded to the given [expression].
+   */
+  void set expression(Expression expression) {
+    _expression = _becomeParentOf(expression);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitYieldStatement(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    _safelyVisitChild(_expression, visitor);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/constant.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/constant.dart
new file mode 100644
index 0000000..999ae5b
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/constant.dart
@@ -0,0 +1,5276 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.constant;
+
+import 'dart:collection';
+
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/utilities_general.dart';
+import 'package:analyzer/src/task/dart.dart';
+
+import 'ast.dart';
+import 'element.dart';
+import 'engine.dart' show AnalysisEngine, RecordingErrorListener;
+import 'error.dart';
+import 'java_core.dart';
+import 'resolver.dart' show TypeProvider, TypeSystem, TypeSystemImpl;
+import 'scanner.dart' show Token, TokenType;
+import 'source.dart' show Source;
+import 'utilities_collection.dart';
+import 'utilities_dart.dart' show ParameterKind;
+
+/**
+ * Callback used by [ReferenceFinder] to report that a dependency was found.
+ */
+typedef void ReferenceFinderCallback(ConstantEvaluationTarget dependency);
+
+/**
+ * The state of an object representing a boolean value.
+ */
+class BoolState extends InstanceState {
+  /**
+   * An instance representing the boolean value 'false'.
+   */
+  static BoolState FALSE_STATE = new BoolState(false);
+
+  /**
+   * An instance representing the boolean value 'true'.
+   */
+  static BoolState TRUE_STATE = new BoolState(true);
+
+  /**
+   * A state that can be used to represent a boolean whose value is not known.
+   */
+  static BoolState UNKNOWN_VALUE = new BoolState(null);
+
+  /**
+   * The value of this instance.
+   */
+  final bool value;
+
+  /**
+   * Initialize a newly created state to represent the given [value].
+   */
+  BoolState(this.value);
+
+  @override
+  bool get hasExactValue => true;
+
+  @override
+  int get hashCode => value == null ? 0 : (value ? 2 : 3);
+
+  @override
+  bool get isBool => true;
+
+  @override
+  bool get isBoolNumStringOrNull => true;
+
+  @override
+  bool get isUnknown => value == null;
+
+  @override
+  String get typeName => "bool";
+
+  @override
+  bool operator ==(Object object) =>
+      object is BoolState && identical(value, object.value);
+
+  @override
+  BoolState convertToBool() => this;
+
+  @override
+  StringState convertToString() {
+    if (value == null) {
+      return StringState.UNKNOWN_VALUE;
+    }
+    return new StringState(value ? "true" : "false");
+  }
+
+  @override
+  BoolState equalEqual(InstanceState rightOperand) {
+    assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    if (rightOperand is BoolState) {
+      bool rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      }
+      return BoolState.from(identical(value, rightValue));
+    } else if (rightOperand is DynamicState) {
+      return UNKNOWN_VALUE;
+    }
+    return FALSE_STATE;
+  }
+
+  @override
+  BoolState logicalAnd(InstanceState rightOperand) {
+    assertBool(rightOperand);
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    return value ? rightOperand.convertToBool() : FALSE_STATE;
+  }
+
+  @override
+  BoolState logicalNot() {
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    return value ? FALSE_STATE : TRUE_STATE;
+  }
+
+  @override
+  BoolState logicalOr(InstanceState rightOperand) {
+    assertBool(rightOperand);
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    return value ? TRUE_STATE : rightOperand.convertToBool();
+  }
+
+  @override
+  String toString() => value == null ? "-unknown-" : (value ? "true" : "false");
+
+  /**
+   * Return the boolean state representing the given boolean [value].
+   */
+  static BoolState from(bool value) =>
+      value ? BoolState.TRUE_STATE : BoolState.FALSE_STATE;
+}
+
+/**
+ * An [AstCloner] that copies the necessary information from the AST to allow
+ * constants to be evaluated.
+ */
+class ConstantAstCloner extends AstCloner {
+  ConstantAstCloner() : super(true);
+
+  @override
+  InstanceCreationExpression visitInstanceCreationExpression(
+      InstanceCreationExpression node) {
+    InstanceCreationExpression expression =
+        super.visitInstanceCreationExpression(node);
+    expression.staticElement = node.staticElement;
+    return expression;
+  }
+
+  @override
+  RedirectingConstructorInvocation visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    RedirectingConstructorInvocation invocation =
+        super.visitRedirectingConstructorInvocation(node);
+    invocation.staticElement = node.staticElement;
+    return invocation;
+  }
+
+  @override
+  SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) {
+    SimpleIdentifier identifier = super.visitSimpleIdentifier(node);
+    identifier.staticElement = node.staticElement;
+    return identifier;
+  }
+
+  @override
+  SuperConstructorInvocation visitSuperConstructorInvocation(
+      SuperConstructorInvocation node) {
+    SuperConstructorInvocation invocation =
+        super.visitSuperConstructorInvocation(node);
+    invocation.staticElement = node.staticElement;
+    return invocation;
+  }
+}
+
+/**
+ * Helper class encapsulating the methods for evaluating constants and
+ * constant instance creation expressions.
+ */
+class ConstantEvaluationEngine {
+  /**
+   * Parameter to "fromEnvironment" methods that denotes the default value.
+   */
+  static String _DEFAULT_VALUE_PARAM = "defaultValue";
+
+  /**
+   * Source of RegExp matching any public identifier.
+   * From sdk/lib/internal/symbol.dart.
+   */
+  static String _PUBLIC_IDENTIFIER_RE =
+      "(?!${ConstantValueComputer._RESERVED_WORD_RE}\\b(?!\\\$))[a-zA-Z\$][\\w\$]*";
+
+  /**
+   * RegExp that validates a non-empty non-private symbol.
+   * From sdk/lib/internal/symbol.dart.
+   */
+  static RegExp _PUBLIC_SYMBOL_PATTERN = new RegExp(
+      "^(?:${ConstantValueComputer._OPERATOR_RE}\$|$_PUBLIC_IDENTIFIER_RE(?:=?\$|[.](?!\$)))+?\$");
+
+  /**
+   * The type system.  This is used to gues the types of constants when their
+   * exact value is unknown.
+   */
+  final TypeSystem typeSystem;
+
+  /**
+   * The set of variables declared on the command line using '-D'.
+   */
+  final DeclaredVariables _declaredVariables;
+
+  /**
+   * Validator used to verify correct dependency analysis when running unit
+   * tests.
+   */
+  final ConstantEvaluationValidator validator;
+
+  /**
+   * Initialize a newly created [ConstantEvaluationEngine].  The [typeProvider]
+   * is used to access known types.  [_declaredVariables] is the set of
+   * variables declared on the command line using '-D'.  The [validator], if
+   * given, is used to verify correct dependency analysis when running unit
+   * tests.
+   */
+  ConstantEvaluationEngine(TypeProvider typeProvider, this._declaredVariables,
+      {ConstantEvaluationValidator validator})
+      : validator = validator != null
+          ? validator
+          : new ConstantEvaluationValidator_ForProduction(),
+        typeSystem = new TypeSystemImpl(typeProvider);
+
+  /**
+   * The type provider used to access the known types.
+   */
+  TypeProvider get typeProvider => typeSystem.typeProvider;
+
+  /**
+   * Check that the arguments to a call to fromEnvironment() are correct. The
+   * [arguments] are the AST nodes of the arguments. The [argumentValues] are
+   * the values of the unnamed arguments. The [namedArgumentValues] are the
+   * values of the named arguments. The [expectedDefaultValueType] is the
+   * allowed type of the "defaultValue" parameter (if present). Note:
+   * "defaultValue" is always allowed to be null. Return `true` if the arguments
+   * are correct, `false` if there is an error.
+   */
+  bool checkFromEnvironmentArguments(NodeList<Expression> arguments,
+      List<DartObjectImpl> argumentValues,
+      HashMap<String, DartObjectImpl> namedArgumentValues,
+      InterfaceType expectedDefaultValueType) {
+    int argumentCount = arguments.length;
+    if (argumentCount < 1 || argumentCount > 2) {
+      return false;
+    }
+    if (arguments[0] is NamedExpression) {
+      return false;
+    }
+    if (!identical(argumentValues[0].type, typeProvider.stringType)) {
+      return false;
+    }
+    if (argumentCount == 2) {
+      if (arguments[1] is! NamedExpression) {
+        return false;
+      }
+      if (!((arguments[1] as NamedExpression).name.label.name ==
+          _DEFAULT_VALUE_PARAM)) {
+        return false;
+      }
+      ParameterizedType defaultValueType =
+          namedArgumentValues[_DEFAULT_VALUE_PARAM].type;
+      if (!(identical(defaultValueType, expectedDefaultValueType) ||
+          identical(defaultValueType, typeProvider.nullType))) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Check that the arguments to a call to Symbol() are correct. The [arguments]
+   * are the AST nodes of the arguments. The [argumentValues] are the values of
+   * the unnamed arguments. The [namedArgumentValues] are the values of the
+   * named arguments. Return `true` if the arguments are correct, `false` if
+   * there is an error.
+   */
+  bool checkSymbolArguments(NodeList<Expression> arguments,
+      List<DartObjectImpl> argumentValues,
+      HashMap<String, DartObjectImpl> namedArgumentValues) {
+    if (arguments.length != 1) {
+      return false;
+    }
+    if (arguments[0] is NamedExpression) {
+      return false;
+    }
+    if (!identical(argumentValues[0].type, typeProvider.stringType)) {
+      return false;
+    }
+    String name = argumentValues[0].stringValue;
+    return isValidPublicSymbol(name);
+  }
+
+  /**
+   * Compute the constant value associated with the given [constant].
+   */
+  void computeConstantValue(ConstantEvaluationTarget constant) {
+    validator.beforeComputeValue(constant);
+    if (constant is ParameterElement) {
+      if (constant.initializer != null) {
+        Expression defaultValue =
+            (constant as PotentiallyConstVariableElement).constantInitializer;
+        if (defaultValue != null) {
+          RecordingErrorListener errorListener = new RecordingErrorListener();
+          ErrorReporter errorReporter =
+              new ErrorReporter(errorListener, constant.source);
+          DartObjectImpl dartObject =
+              defaultValue.accept(new ConstantVisitor(this, errorReporter));
+          (constant as ParameterElementImpl).evaluationResult =
+              new EvaluationResultImpl(dartObject, errorListener.errors);
+        }
+      }
+    } else if (constant is VariableElement) {
+      Expression constantInitializer =
+          (constant as PotentiallyConstVariableElement).constantInitializer;
+      if (constantInitializer != null) {
+        RecordingErrorListener errorListener = new RecordingErrorListener();
+        ErrorReporter errorReporter =
+            new ErrorReporter(errorListener, constant.source);
+        DartObjectImpl dartObject = constantInitializer
+            .accept(new ConstantVisitor(this, errorReporter));
+        // Only check the type for truly const declarations (don't check final
+        // fields with initializers, since their types may be generic.  The type
+        // of the final field will be checked later, when the constructor is
+        // invoked).
+        if (dartObject != null && constant.isConst) {
+          if (!runtimeTypeMatch(dartObject, constant.type)) {
+            errorReporter.reportErrorForElement(
+                CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH,
+                constant, [dartObject.type, constant.type]);
+          }
+        }
+        (constant as VariableElementImpl).evaluationResult =
+            new EvaluationResultImpl(dartObject, errorListener.errors);
+      }
+    } else if (constant is ConstructorElement) {
+      if (constant.isConst) {
+        // No evaluation needs to be done; constructor declarations are only in
+        // the dependency graph to ensure that any constants referred to in
+        // initializer lists and parameter defaults are evaluated before
+        // invocations of the constructor.  However we do need to annotate the
+        // element as being free of constant evaluation cycles so that later
+        // code will know that it is safe to evaluate.
+        (constant as ConstructorElementImpl).isCycleFree = true;
+      }
+    } else if (constant is ConstantEvaluationTarget_Annotation) {
+      Annotation constNode = constant.annotation;
+      ElementAnnotationImpl elementAnnotation = constNode.elementAnnotation;
+      // elementAnnotation is null if the annotation couldn't be resolved, in
+      // which case we skip it.
+      if (elementAnnotation != null) {
+        Element element = elementAnnotation.element;
+        if (element is PropertyAccessorElement &&
+            element.variable is VariableElementImpl) {
+          // The annotation is a reference to a compile-time constant variable.
+          // Just copy the evaluation result.
+          VariableElementImpl variableElement =
+              element.variable as VariableElementImpl;
+          if (variableElement.evaluationResult != null) {
+            elementAnnotation.evaluationResult =
+                variableElement.evaluationResult;
+          } else {
+            // This could happen in the event that the annotation refers to a
+            // non-constant.  The error is detected elsewhere, so just silently
+            // ignore it here.
+            elementAnnotation.evaluationResult = new EvaluationResultImpl(null);
+          }
+        } else if (element is ConstructorElementImpl &&
+            element.isConst &&
+            constNode.arguments != null) {
+          RecordingErrorListener errorListener = new RecordingErrorListener();
+          CompilationUnit sourceCompilationUnit =
+              constNode.getAncestor((node) => node is CompilationUnit);
+          ErrorReporter errorReporter = new ErrorReporter(
+              errorListener, sourceCompilationUnit.element.source);
+          ConstantVisitor constantVisitor =
+              new ConstantVisitor(this, errorReporter);
+          DartObjectImpl result = evaluateConstructorCall(constNode,
+              constNode.arguments.arguments, element, constantVisitor,
+              errorReporter);
+          elementAnnotation.evaluationResult =
+              new EvaluationResultImpl(result, errorListener.errors);
+        } else {
+          // This may happen for invalid code (e.g. failing to pass arguments
+          // to an annotation which references a const constructor).  The error
+          // is detected elsewhere, so just silently ignore it here.
+          elementAnnotation.evaluationResult = new EvaluationResultImpl(null);
+        }
+      }
+    } else {
+      // Should not happen.
+      assert(false);
+      AnalysisEngine.instance.logger.logError(
+          "Constant value computer trying to compute the value of a node of type ${constant.runtimeType}");
+      return;
+    }
+  }
+
+  /**
+   * Determine which constant elements need to have their values computed
+   * prior to computing the value of [constant], and report them using
+   * [callback].
+   *
+   * Note that it's possible (in erroneous code) for a constant to depend on a
+   * non-constant.  When this happens, we report the dependency anyhow so that
+   * if the non-constant changes to a constant, we will know to recompute the
+   * thing that depends on it.  [computeDependencies] and
+   * [computeConstantValue] are responsible for ignoring the request if they
+   * are asked to act on a non-constant target.
+   */
+  void computeDependencies(
+      ConstantEvaluationTarget constant, ReferenceFinderCallback callback) {
+    ReferenceFinder referenceFinder = new ReferenceFinder(callback);
+    if (constant is ParameterElement) {
+      if (constant.initializer != null) {
+        Expression defaultValue =
+            (constant as ConstVariableElement).constantInitializer;
+        if (defaultValue != null) {
+          defaultValue.accept(referenceFinder);
+        }
+      }
+    } else if (constant is PotentiallyConstVariableElement) {
+      Expression initializer = constant.constantInitializer;
+      if (initializer != null) {
+        initializer.accept(referenceFinder);
+      }
+    } else if (constant is ConstructorElementImpl) {
+      if (constant.isConst) {
+        constant.isCycleFree = false;
+        ConstructorElement redirectedConstructor =
+            getConstRedirectedConstructor(constant);
+        if (redirectedConstructor != null) {
+          ConstructorElement redirectedConstructorBase =
+              ConstantEvaluationEngine
+                  ._getConstructorBase(redirectedConstructor);
+          callback(redirectedConstructorBase);
+          return;
+        } else if (constant.isFactory) {
+          // Factory constructor, but getConstRedirectedConstructor returned
+          // null.  This can happen if we're visiting one of the special external
+          // const factory constructors in the SDK, or if the code contains
+          // errors (such as delegating to a non-const constructor, or delegating
+          // to a constructor that can't be resolved).  In any of these cases,
+          // we'll evaluate calls to this constructor without having to refer to
+          // any other constants.  So we don't need to report any dependencies.
+          return;
+        }
+        bool superInvocationFound = false;
+        List<ConstructorInitializer> initializers =
+            constant.constantInitializers;
+        for (ConstructorInitializer initializer in initializers) {
+          if (initializer is SuperConstructorInvocation) {
+            superInvocationFound = true;
+          }
+          initializer.accept(referenceFinder);
+        }
+        if (!superInvocationFound) {
+          // No explicit superconstructor invocation found, so we need to
+          // manually insert a reference to the implicit superconstructor.
+          InterfaceType superclass =
+              (constant.returnType as InterfaceType).superclass;
+          if (superclass != null && !superclass.isObject) {
+            ConstructorElement unnamedConstructor = ConstantEvaluationEngine
+                ._getConstructorBase(superclass.element.unnamedConstructor);
+            if (unnamedConstructor != null) {
+              callback(unnamedConstructor);
+            }
+          }
+        }
+        for (FieldElement field in constant.enclosingElement.fields) {
+          // Note: non-static const isn't allowed but we handle it anyway so
+          // that we won't be confused by incorrect code.
+          if ((field.isFinal || field.isConst) &&
+              !field.isStatic &&
+              field.initializer != null) {
+            callback(field);
+          }
+        }
+        for (ParameterElement parameterElement in constant.parameters) {
+          callback(parameterElement);
+        }
+      }
+    } else if (constant is ConstantEvaluationTarget_Annotation) {
+      Annotation constNode = constant.annotation;
+      ElementAnnotationImpl elementAnnotation = constNode.elementAnnotation;
+      // elementAnnotation is null if the annotation couldn't be resolved, in
+      // which case we skip it.
+      if (elementAnnotation != null) {
+        Element element = elementAnnotation.element;
+        if (element is PropertyAccessorElement &&
+            element.variable is VariableElementImpl) {
+          // The annotation is a reference to a compile-time constant variable,
+          // so it depends on the variable.
+          callback(element.variable);
+        } else if (element is ConstructorElementImpl) {
+          // The annotation is a constructor invocation, so it depends on the
+          // constructor.
+          callback(element);
+        } else {
+          // This could happen in the event of invalid code.  The error will be
+          // reported at constant evaluation time.
+        }
+      }
+      if (constNode.arguments != null) {
+        constNode.arguments.accept(referenceFinder);
+      }
+    } else {
+      // Should not happen.
+      assert(false);
+      AnalysisEngine.instance.logger.logError(
+          "Constant value computer trying to compute the value of a node of type ${constant.runtimeType}");
+    }
+  }
+
+  /**
+   * Evaluate a call to fromEnvironment() on the bool, int, or String class. The
+   * [environmentValue] is the value fetched from the environment. The
+   * [builtInDefaultValue] is the value that should be used as the default if no
+   * "defaultValue" argument appears in [namedArgumentValues]. The
+   * [namedArgumentValues] are the values of the named parameters passed to
+   * fromEnvironment(). Return a [DartObjectImpl] object corresponding to the
+   * evaluated result.
+   */
+  DartObjectImpl computeValueFromEnvironment(DartObject environmentValue,
+      DartObjectImpl builtInDefaultValue,
+      HashMap<String, DartObjectImpl> namedArgumentValues) {
+    DartObjectImpl value = environmentValue as DartObjectImpl;
+    if (value.isUnknown || value.isNull) {
+      // The name either doesn't exist in the environment or we couldn't parse
+      // the corresponding value.
+      // If the code supplied an explicit default, use it.
+      if (namedArgumentValues.containsKey(_DEFAULT_VALUE_PARAM)) {
+        value = namedArgumentValues[_DEFAULT_VALUE_PARAM];
+      } else if (value.isNull) {
+        // The code didn't supply an explicit default.
+        // The name exists in the environment but we couldn't parse the
+        // corresponding value.
+        // So use the built-in default value, because this is what the VM does.
+        value = builtInDefaultValue;
+      } else {
+        // The code didn't supply an explicit default.
+        // The name doesn't exist in the environment.
+        // The VM would use the built-in default value, but we don't want to do
+        // that for analysis because it's likely to lead to cascading errors.
+        // So just leave [value] in the unknown state.
+      }
+    }
+    return value;
+  }
+
+  DartObjectImpl evaluateConstructorCall(AstNode node,
+      NodeList<Expression> arguments, ConstructorElement constructor,
+      ConstantVisitor constantVisitor, ErrorReporter errorReporter) {
+    if (!_getConstructorBase(constructor).isCycleFree) {
+      // It's not safe to evaluate this constructor, so bail out.
+      // TODO(paulberry): ensure that a reasonable error message is produced
+      // in this case, as well as other cases involving constant expression
+      // circularities (e.g. "compile-time constant expression depends on
+      // itself")
+      return new DartObjectImpl.validWithUnknownValue(constructor.returnType);
+    }
+    int argumentCount = arguments.length;
+    List<DartObjectImpl> argumentValues =
+        new List<DartObjectImpl>(argumentCount);
+    List<Expression> argumentNodes = new List<Expression>(argumentCount);
+    HashMap<String, DartObjectImpl> namedArgumentValues =
+        new HashMap<String, DartObjectImpl>();
+    HashMap<String, NamedExpression> namedArgumentNodes =
+        new HashMap<String, NamedExpression>();
+    for (int i = 0; i < argumentCount; i++) {
+      Expression argument = arguments[i];
+      if (argument is NamedExpression) {
+        String name = argument.name.label.name;
+        namedArgumentValues[name] =
+            constantVisitor._valueOf(argument.expression);
+        namedArgumentNodes[name] = argument;
+        argumentValues[i] = typeProvider.nullObject;
+      } else {
+        argumentValues[i] = constantVisitor._valueOf(argument);
+        argumentNodes[i] = argument;
+      }
+    }
+    constructor = followConstantRedirectionChain(constructor);
+    InterfaceType definingClass = constructor.returnType as InterfaceType;
+    if (constructor.isFactory) {
+      // We couldn't find a non-factory constructor.
+      // See if it's because we reached an external const factory constructor
+      // that we can emulate.
+      if (constructor.name == "fromEnvironment") {
+        if (!checkFromEnvironmentArguments(
+            arguments, argumentValues, namedArgumentValues, definingClass)) {
+          errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, node);
+          return null;
+        }
+        String variableName =
+            argumentCount < 1 ? null : argumentValues[0].stringValue;
+        if (identical(definingClass, typeProvider.boolType)) {
+          DartObject valueFromEnvironment;
+          valueFromEnvironment =
+              _declaredVariables.getBool(typeProvider, variableName);
+          return computeValueFromEnvironment(valueFromEnvironment,
+              new DartObjectImpl(typeProvider.boolType, BoolState.FALSE_STATE),
+              namedArgumentValues);
+        } else if (identical(definingClass, typeProvider.intType)) {
+          DartObject valueFromEnvironment;
+          valueFromEnvironment =
+              _declaredVariables.getInt(typeProvider, variableName);
+          return computeValueFromEnvironment(valueFromEnvironment,
+              new DartObjectImpl(typeProvider.nullType, NullState.NULL_STATE),
+              namedArgumentValues);
+        } else if (identical(definingClass, typeProvider.stringType)) {
+          DartObject valueFromEnvironment;
+          valueFromEnvironment =
+              _declaredVariables.getString(typeProvider, variableName);
+          return computeValueFromEnvironment(valueFromEnvironment,
+              new DartObjectImpl(typeProvider.nullType, NullState.NULL_STATE),
+              namedArgumentValues);
+        }
+      } else if (constructor.name == "" &&
+          identical(definingClass, typeProvider.symbolType) &&
+          argumentCount == 1) {
+        if (!checkSymbolArguments(
+            arguments, argumentValues, namedArgumentValues)) {
+          errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, node);
+          return null;
+        }
+        String argumentValue = argumentValues[0].stringValue;
+        return new DartObjectImpl(
+            definingClass, new SymbolState(argumentValue));
+      }
+      // Either it's an external const factory constructor that we can't
+      // emulate, or an error occurred (a cycle, or a const constructor trying
+      // to delegate to a non-const constructor).
+      // In the former case, the best we can do is consider it an unknown value.
+      // In the latter case, the error has already been reported, so considering
+      // it an unknown value will suppress further errors.
+      return new DartObjectImpl.validWithUnknownValue(definingClass);
+    }
+    ConstructorElementImpl constructorBase = _getConstructorBase(constructor);
+    validator.beforeGetConstantInitializers(constructorBase);
+    List<ConstructorInitializer> initializers =
+        constructorBase.constantInitializers;
+    if (initializers == null) {
+      // This can happen in some cases where there are compile errors in the
+      // code being analyzed (for example if the code is trying to create a
+      // const instance using a non-const constructor, or the node we're
+      // visiting is involved in a cycle).  The error has already been reported,
+      // so consider it an unknown value to suppress further errors.
+      return new DartObjectImpl.validWithUnknownValue(definingClass);
+    }
+    HashMap<String, DartObjectImpl> fieldMap =
+        new HashMap<String, DartObjectImpl>();
+    // Start with final fields that are initialized at their declaration site.
+    for (FieldElement field in constructor.enclosingElement.fields) {
+      if ((field.isFinal || field.isConst) &&
+          !field.isStatic &&
+          field is ConstFieldElementImpl) {
+        validator.beforeGetFieldEvaluationResult(field);
+        EvaluationResultImpl evaluationResult = field.evaluationResult;
+        DartType fieldType =
+            FieldMember.from(field, constructor.returnType).type;
+        DartObjectImpl fieldValue = evaluationResult.value;
+        if (fieldValue != null && !runtimeTypeMatch(fieldValue, fieldType)) {
+          errorReporter.reportErrorForNode(
+              CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
+              node, [fieldValue.type, field.name, fieldType]);
+        }
+        fieldMap[field.name] = evaluationResult.value;
+      }
+    }
+    // Now evaluate the constructor declaration.
+    HashMap<String, DartObjectImpl> parameterMap =
+        new HashMap<String, DartObjectImpl>();
+    List<ParameterElement> parameters = constructor.parameters;
+    int parameterCount = parameters.length;
+    for (int i = 0; i < parameterCount; i++) {
+      ParameterElement parameter = parameters[i];
+      ParameterElement baseParameter = parameter;
+      while (baseParameter is ParameterMember) {
+        baseParameter = (baseParameter as ParameterMember).baseElement;
+      }
+      DartObjectImpl argumentValue = null;
+      AstNode errorTarget = null;
+      if (baseParameter.parameterKind == ParameterKind.NAMED) {
+        argumentValue = namedArgumentValues[baseParameter.name];
+        errorTarget = namedArgumentNodes[baseParameter.name];
+      } else if (i < argumentCount) {
+        argumentValue = argumentValues[i];
+        errorTarget = argumentNodes[i];
+      }
+      if (errorTarget == null) {
+        // No argument node that we can direct error messages to, because we
+        // are handling an optional parameter that wasn't specified.  So just
+        // direct error messages to the constructor call.
+        errorTarget = node;
+      }
+      if (argumentValue == null && baseParameter is ParameterElementImpl) {
+        // The parameter is an optional positional parameter for which no value
+        // was provided, so use the default value.
+        validator.beforeGetParameterDefault(baseParameter);
+        EvaluationResultImpl evaluationResult = baseParameter.evaluationResult;
+        if (evaluationResult == null) {
+          // No default was provided, so the default value is null.
+          argumentValue = typeProvider.nullObject;
+        } else if (evaluationResult.value != null) {
+          argumentValue = evaluationResult.value;
+        }
+      }
+      if (argumentValue != null) {
+        if (!runtimeTypeMatch(argumentValue, parameter.type)) {
+          errorReporter.reportErrorForNode(
+              CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
+              errorTarget, [argumentValue.type, parameter.type]);
+        }
+        if (baseParameter.isInitializingFormal) {
+          FieldElement field = (parameter as FieldFormalParameterElement).field;
+          if (field != null) {
+            DartType fieldType = field.type;
+            if (fieldType != parameter.type) {
+              // We've already checked that the argument can be assigned to the
+              // parameter; we also need to check that it can be assigned to
+              // the field.
+              if (!runtimeTypeMatch(argumentValue, fieldType)) {
+                errorReporter.reportErrorForNode(
+                    CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
+                    errorTarget, [argumentValue.type, fieldType]);
+              }
+            }
+            String fieldName = field.name;
+            if (fieldMap.containsKey(fieldName)) {
+              errorReporter.reportErrorForNode(
+                  CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, node);
+            }
+            fieldMap[fieldName] = argumentValue;
+          }
+        } else {
+          String name = baseParameter.name;
+          parameterMap[name] = argumentValue;
+        }
+      }
+    }
+    ConstantVisitor initializerVisitor = new ConstantVisitor(
+        this, errorReporter, lexicalEnvironment: parameterMap);
+    String superName = null;
+    NodeList<Expression> superArguments = null;
+    for (ConstructorInitializer initializer in initializers) {
+      if (initializer is ConstructorFieldInitializer) {
+        ConstructorFieldInitializer constructorFieldInitializer = initializer;
+        Expression initializerExpression =
+            constructorFieldInitializer.expression;
+        DartObjectImpl evaluationResult =
+            initializerExpression.accept(initializerVisitor);
+        if (evaluationResult != null) {
+          String fieldName = constructorFieldInitializer.fieldName.name;
+          if (fieldMap.containsKey(fieldName)) {
+            errorReporter.reportErrorForNode(
+                CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, node);
+          }
+          fieldMap[fieldName] = evaluationResult;
+          PropertyAccessorElement getter = definingClass.getGetter(fieldName);
+          if (getter != null) {
+            PropertyInducingElement field = getter.variable;
+            if (!runtimeTypeMatch(evaluationResult, field.type)) {
+              errorReporter.reportErrorForNode(
+                  CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
+                  node, [evaluationResult.type, fieldName, field.type]);
+            }
+          }
+        }
+      } else if (initializer is SuperConstructorInvocation) {
+        SuperConstructorInvocation superConstructorInvocation = initializer;
+        SimpleIdentifier name = superConstructorInvocation.constructorName;
+        if (name != null) {
+          superName = name.name;
+        }
+        superArguments = superConstructorInvocation.argumentList.arguments;
+      } else if (initializer is RedirectingConstructorInvocation) {
+        // This is a redirecting constructor, so just evaluate the constructor
+        // it redirects to.
+        ConstructorElement constructor = initializer.staticElement;
+        if (constructor != null && constructor.isConst) {
+          return evaluateConstructorCall(node,
+              initializer.argumentList.arguments, constructor,
+              initializerVisitor, errorReporter);
+        }
+      }
+    }
+    // Evaluate explicit or implicit call to super().
+    InterfaceType superclass = definingClass.superclass;
+    if (superclass != null && !superclass.isObject) {
+      ConstructorElement superConstructor =
+          superclass.lookUpConstructor(superName, constructor.library);
+      if (superConstructor != null) {
+        if (superArguments == null) {
+          superArguments = new NodeList<Expression>(null);
+        }
+        evaluateSuperConstructorCall(node, fieldMap, superConstructor,
+            superArguments, initializerVisitor, errorReporter);
+      }
+    }
+    return new DartObjectImpl(definingClass, new GenericState(fieldMap));
+  }
+
+  void evaluateSuperConstructorCall(AstNode node,
+      HashMap<String, DartObjectImpl> fieldMap,
+      ConstructorElement superConstructor, NodeList<Expression> superArguments,
+      ConstantVisitor initializerVisitor, ErrorReporter errorReporter) {
+    if (superConstructor != null && superConstructor.isConst) {
+      DartObjectImpl evaluationResult = evaluateConstructorCall(node,
+          superArguments, superConstructor, initializerVisitor, errorReporter);
+      if (evaluationResult != null) {
+        fieldMap[GenericState.SUPERCLASS_FIELD] = evaluationResult;
+      }
+    }
+  }
+
+  /**
+   * Attempt to follow the chain of factory redirections until a constructor is
+   * reached which is not a const factory constructor. Return the constant
+   * constructor which terminates the chain of factory redirections, if the
+   * chain terminates. If there is a problem (e.g. a redirection can't be found,
+   * or a cycle is encountered), the chain will be followed as far as possible
+   * and then a const factory constructor will be returned.
+   */
+  ConstructorElement followConstantRedirectionChain(
+      ConstructorElement constructor) {
+    HashSet<ConstructorElement> constructorsVisited =
+        new HashSet<ConstructorElement>();
+    while (true) {
+      ConstructorElement redirectedConstructor =
+          getConstRedirectedConstructor(constructor);
+      if (redirectedConstructor == null) {
+        break;
+      } else {
+        ConstructorElement constructorBase = _getConstructorBase(constructor);
+        constructorsVisited.add(constructorBase);
+        ConstructorElement redirectedConstructorBase =
+            _getConstructorBase(redirectedConstructor);
+        if (constructorsVisited.contains(redirectedConstructorBase)) {
+          // Cycle in redirecting factory constructors--this is not allowed
+          // and is checked elsewhere--see
+          // [ErrorVerifier.checkForRecursiveFactoryRedirect()]).
+          break;
+        }
+      }
+      constructor = redirectedConstructor;
+    }
+    return constructor;
+  }
+
+  /**
+   * Generate an error indicating that the given [constant] is not a valid
+   * compile-time constant because it references at least one of the constants
+   * in the given [cycle], each of which directly or indirectly references the
+   * constant.
+   */
+  void generateCycleError(Iterable<ConstantEvaluationTarget> cycle,
+      ConstantEvaluationTarget constant) {
+    if (constant is VariableElement) {
+      RecordingErrorListener errorListener = new RecordingErrorListener();
+      ErrorReporter errorReporter =
+          new ErrorReporter(errorListener, constant.source);
+      // TODO(paulberry): It would be really nice if we could extract enough
+      // information from the 'cycle' argument to provide the user with a
+      // description of the cycle.
+      errorReporter.reportErrorForElement(
+          CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT, constant, []);
+      (constant as VariableElementImpl).evaluationResult =
+          new EvaluationResultImpl(null, errorListener.errors);
+    } else if (constant is ConstructorElement) {
+      // We don't report cycle errors on constructor declarations since there
+      // is nowhere to put the error information.
+    } else {
+      // Should not happen.  Formal parameter defaults and annotations should
+      // never appear as part of a cycle because they can't be referred to.
+      assert(false);
+      AnalysisEngine.instance.logger.logError(
+          "Constant value computer trying to report a cycle error for a node of type ${constant.runtimeType}");
+    }
+  }
+
+  /**
+   * If [constructor] redirects to another const constructor, return the
+   * const constructor it redirects to.  Otherwise return `null`.
+   */
+  ConstructorElement getConstRedirectedConstructor(
+      ConstructorElement constructor) {
+    if (!constructor.isFactory) {
+      return null;
+    }
+    if (identical(constructor.enclosingElement.type, typeProvider.symbolType)) {
+      // The dart:core.Symbol has a const factory constructor that redirects
+      // to dart:_internal.Symbol.  That in turn redirects to an external
+      // const constructor, which we won't be able to evaluate.
+      // So stop following the chain of redirections at dart:core.Symbol, and
+      // let [evaluateInstanceCreationExpression] handle it specially.
+      return null;
+    }
+    ConstructorElement redirectedConstructor =
+        constructor.redirectedConstructor;
+    if (redirectedConstructor == null) {
+      // This can happen if constructor is an external factory constructor.
+      return null;
+    }
+    if (!redirectedConstructor.isConst) {
+      // Delegating to a non-const constructor--this is not allowed (and
+      // is checked elsewhere--see
+      // [ErrorVerifier.checkForRedirectToNonConstConstructor()]).
+      return null;
+    }
+    return redirectedConstructor;
+  }
+
+  /**
+   * Check if the object [obj] matches the type [type] according to runtime type
+   * checking rules.
+   */
+  bool runtimeTypeMatch(DartObjectImpl obj, DartType type) {
+    if (obj.isNull) {
+      return true;
+    }
+    if (type.isUndefined) {
+      return false;
+    }
+    return obj.type.isSubtypeOf(type);
+  }
+
+  /**
+   * Determine whether the given string is a valid name for a public symbol
+   * (i.e. whether it is allowed for a call to the Symbol constructor).
+   */
+  static bool isValidPublicSymbol(String name) => name.isEmpty ||
+      name == "void" ||
+      new JavaPatternMatcher(_PUBLIC_SYMBOL_PATTERN, name).matches();
+
+  static ConstructorElementImpl _getConstructorBase(
+      ConstructorElement constructor) {
+    while (constructor is ConstructorMember) {
+      constructor = (constructor as ConstructorMember).baseElement;
+    }
+    return constructor;
+  }
+}
+
+/**
+ * Wrapper around an [Annotation] which can be used as a
+ * [ConstantEvaluationTarget].
+ */
+class ConstantEvaluationTarget_Annotation implements ConstantEvaluationTarget {
+  final AnalysisContext context;
+  final Source source;
+  final Source librarySource;
+  final Annotation annotation;
+
+  ConstantEvaluationTarget_Annotation(
+      this.context, this.source, this.librarySource, this.annotation);
+
+  @override
+  int get hashCode => JenkinsSmiHash.hash3(
+      source.hashCode, librarySource.hashCode, annotation.hashCode);
+
+  @override
+  bool operator ==(other) {
+    if (other is ConstantEvaluationTarget_Annotation) {
+      return this.context == other.context &&
+          this.source == other.source &&
+          this.librarySource == other.librarySource &&
+          this.annotation == other.annotation;
+    } else {
+      return false;
+    }
+  }
+}
+
+/**
+ * Interface used by unit tests to verify correct dependency analysis during
+ * constant evaluation.
+ */
+abstract class ConstantEvaluationValidator {
+  /**
+   * This method is called just before computing the constant value associated
+   * with [constant]. Unit tests will override this method to introduce
+   * additional error checking.
+   */
+  void beforeComputeValue(ConstantEvaluationTarget constant);
+
+  /**
+   * This method is called just before getting the constant initializers
+   * associated with the [constructor]. Unit tests will override this method to
+   * introduce additional error checking.
+   */
+  void beforeGetConstantInitializers(ConstructorElement constructor);
+
+  /**
+   * This method is called just before retrieving an evaluation result from an
+   * element. Unit tests will override it to introduce additional error
+   * checking.
+   */
+  void beforeGetEvaluationResult(ConstantEvaluationTarget constant);
+
+  /**
+   * This method is called just before getting the constant value of a field
+   * with an initializer.  Unit tests will override this method to introduce
+   * additional error checking.
+   */
+  void beforeGetFieldEvaluationResult(FieldElementImpl field);
+
+  /**
+   * This method is called just before getting a parameter's default value. Unit
+   * tests will override this method to introduce additional error checking.
+   */
+  void beforeGetParameterDefault(ParameterElement parameter);
+}
+
+/**
+ * Implementation of [ConstantEvaluationValidator] used in production; does no
+ * validation.
+ */
+class ConstantEvaluationValidator_ForProduction
+    implements ConstantEvaluationValidator {
+  @override
+  void beforeComputeValue(ConstantEvaluationTarget constant) {}
+
+  @override
+  void beforeGetConstantInitializers(ConstructorElement constructor) {}
+
+  @override
+  void beforeGetEvaluationResult(ConstantEvaluationTarget constant) {}
+
+  @override
+  void beforeGetFieldEvaluationResult(FieldElementImpl field) {}
+
+  @override
+  void beforeGetParameterDefault(ParameterElement parameter) {}
+}
+
+/**
+ * Instances of the class `ConstantEvaluator` evaluate constant expressions to
+ * produce their compile-time value. According to the Dart Language
+ * Specification:
+ * <blockquote>
+ * A constant expression is one of the following:
+ * * A literal number.
+ * * A literal boolean.
+ * * A literal string where any interpolated expression is a compile-time
+ *   constant that evaluates to a numeric, string or boolean value or to
+ *   <b>null</b>.
+ * * A literal symbol.
+ * * <b>null</b>.
+ * * A qualified reference to a static constant variable.
+ * * An identifier expression that denotes a constant variable, class or type
+ *   alias.
+ * * A constant constructor invocation.
+ * * A constant list literal.
+ * * A constant map literal.
+ * * A simple or qualified identifier denoting a top-level function or a static
+ *   method.
+ * * A parenthesized expression <i>(e)</i> where <i>e</i> is a constant
+ *   expression.
+ * * An expression of the form <i>identical(e<sub>1</sub>, e<sub>2</sub>)</i>
+ *   where <i>e<sub>1</sub></i> and <i>e<sub>2</sub></i> are constant
+ *   expressions and <i>identical()</i> is statically bound to the predefined
+ *   dart function <i>identical()</i> discussed above.
+ * * An expression of one of the forms <i>e<sub>1</sub> == e<sub>2</sub></i> or
+ *   <i>e<sub>1</sub> != e<sub>2</sub></i> where <i>e<sub>1</sub></i> and
+ *   <i>e<sub>2</sub></i> are constant expressions that evaluate to a numeric,
+ *   string or boolean value.
+ * * An expression of one of the forms <i>!e</i>, <i>e<sub>1</sub> &amp;&amp;
+ *   e<sub>2</sub></i> or <i>e<sub>1</sub> || e<sub>2</sub></i>, where <i>e</i>,
+ *   <i>e1</sub></i> and <i>e2</sub></i> are constant expressions that evaluate
+ *   to a boolean value.
+ * * An expression of one of the forms <i>~e</i>, <i>e<sub>1</sub> ^
+ *   e<sub>2</sub></i>, <i>e<sub>1</sub> &amp; e<sub>2</sub></i>,
+ *   <i>e<sub>1</sub> | e<sub>2</sub></i>, <i>e<sub>1</sub> &gt;&gt;
+ *   e<sub>2</sub></i> or <i>e<sub>1</sub> &lt;&lt; e<sub>2</sub></i>, where
+ *   <i>e</i>, <i>e<sub>1</sub></i> and <i>e<sub>2</sub></i> are constant
+ *   expressions that evaluate to an integer value or to <b>null</b>.
+ * * An expression of one of the forms <i>-e</i>, <i>e<sub>1</sub> +
+ *   e<sub>2</sub></i>, <i>e<sub>1</sub> -e<sub>2</sub></i>, <i>e<sub>1</sub> *
+ *   e<sub>2</sub></i>, <i>e<sub>1</sub> / e<sub>2</sub></i>, <i>e<sub>1</sub>
+ *   ~/ e<sub>2</sub></i>, <i>e<sub>1</sub> &gt; e<sub>2</sub></i>,
+ *   <i>e<sub>1</sub> &lt; e<sub>2</sub></i>, <i>e<sub>1</sub> &gt;=
+ *   e<sub>2</sub></i>, <i>e<sub>1</sub> &lt;= e<sub>2</sub></i> or
+ *   <i>e<sub>1</sub> % e<sub>2</sub></i>, where <i>e</i>, <i>e<sub>1</sub></i>
+ *   and <i>e<sub>2</sub></i> are constant expressions that evaluate to a
+ *   numeric value or to <b>null</b>.
+ * * An expression of the form <i>e<sub>1</sub> ? e<sub>2</sub> :
+ *   e<sub>3</sub></i> where <i>e<sub>1</sub></i>, <i>e<sub>2</sub></i> and
+ *   <i>e<sub>3</sub></i> are constant expressions, and <i>e<sub>1</sub></i>
+ *   evaluates to a boolean value.
+ * </blockquote>
+ */
+class ConstantEvaluator {
+  /**
+   * The source containing the expression(s) that will be evaluated.
+   */
+  final Source _source;
+
+  /**
+   * The type provider used to access the known types.
+   */
+  final TypeProvider _typeProvider;
+
+  /**
+   * Initialize a newly created evaluator to evaluate expressions in the given
+   * [source]. The [typeProvider] is the type provider used to access known
+   * types.
+   */
+  ConstantEvaluator(this._source, this._typeProvider);
+
+  EvaluationResult evaluate(Expression expression) {
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    ErrorReporter errorReporter = new ErrorReporter(errorListener, _source);
+    DartObjectImpl result = expression.accept(new ConstantVisitor(
+        new ConstantEvaluationEngine(_typeProvider, new DeclaredVariables()),
+        errorReporter));
+    if (result != null) {
+      return EvaluationResult.forValue(result);
+    }
+    return EvaluationResult.forErrors(errorListener.errors);
+  }
+}
+
+/**
+ * A visitor used to traverse the AST structures of all of the compilation units
+ * being resolved and build tables of the constant variables, constant
+ * constructors, constant constructor invocations, and annotations found in
+ * those compilation units.
+ */
+class ConstantFinder extends RecursiveAstVisitor<Object> {
+  final AnalysisContext context;
+  final Source source;
+  final Source librarySource;
+
+  /**
+   * The elements and AST nodes whose constant values need to be computed.
+   */
+  HashSet<ConstantEvaluationTarget> constantsToCompute =
+      new HashSet<ConstantEvaluationTarget>();
+
+  /**
+   * True if instance variables marked as "final" should be treated as "const".
+   */
+  bool treatFinalInstanceVarAsConst = false;
+
+  ConstantFinder(this.context, this.source, this.librarySource);
+
+  @override
+  Object visitAnnotation(Annotation node) {
+    super.visitAnnotation(node);
+    constantsToCompute.add(new ConstantEvaluationTarget_Annotation(
+        context, source, librarySource, node));
+    return null;
+  }
+
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    bool prevTreatFinalInstanceVarAsConst = treatFinalInstanceVarAsConst;
+    if (node.element.constructors.any((ConstructorElement e) => e.isConst)) {
+      // Instance vars marked "final" need to be included in the dependency
+      // graph, since constant constructors implicitly use the values in their
+      // initializers.
+      treatFinalInstanceVarAsConst = true;
+    }
+    try {
+      return super.visitClassDeclaration(node);
+    } finally {
+      treatFinalInstanceVarAsConst = prevTreatFinalInstanceVarAsConst;
+    }
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    super.visitConstructorDeclaration(node);
+    if (node.constKeyword != null) {
+      ConstructorElement element = node.element;
+      if (element != null) {
+        constantsToCompute.add(element);
+        constantsToCompute.addAll(element.parameters);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    super.visitVariableDeclaration(node);
+    Expression initializer = node.initializer;
+    VariableElement element = node.element;
+    if (initializer != null &&
+        (node.isConst ||
+            treatFinalInstanceVarAsConst &&
+                element is FieldElement &&
+                node.isFinal &&
+                !element.isStatic)) {
+      if (node.element != null) {
+        constantsToCompute.add(node.element);
+      }
+    }
+    return null;
+  }
+}
+
+/**
+ * An object used to compute the values of constant variables and constant
+ * constructor invocations in one or more compilation units. The expected usage
+ * pattern is for the compilation units to be added to this computer using the
+ * method [add] and then for the method [computeValues] to be invoked exactly
+ * once. Any use of an instance after invoking the method [computeValues] will
+ * result in unpredictable behavior.
+ */
+class ConstantValueComputer {
+  /**
+   * Source of RegExp matching declarable operator names.
+   * From sdk/lib/internal/symbol.dart.
+   */
+  static String _OPERATOR_RE =
+      "(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)";
+
+  /**
+   * Source of RegExp matching Dart reserved words.
+   * From sdk/lib/internal/symbol.dart.
+   */
+  static String _RESERVED_WORD_RE =
+      "(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))";
+
+  /**
+   * A graph in which the nodes are the constants, and the edges are from each
+   * constant to the other constants that are referenced by it.
+   */
+  DirectedGraph<ConstantEvaluationTarget> referenceGraph =
+      new DirectedGraph<ConstantEvaluationTarget>();
+
+  /**
+   * The elements whose constant values need to be computed.  Any elements
+   * which appear in [referenceGraph] but not in this set either belong to a
+   * different library cycle (and hence don't need to be recomputed) or were
+   * computed during a previous stage of resolution stage (e.g. constants
+   * associated with enums).
+   */
+  HashSet<ConstantEvaluationTarget> _constantsToCompute =
+      new HashSet<ConstantEvaluationTarget>();
+
+  /**
+   * The evaluation engine that does the work of evaluating instance creation
+   * expressions.
+   */
+  final ConstantEvaluationEngine evaluationEngine;
+
+  final AnalysisContext _context;
+
+  /**
+   * Initialize a newly created constant value computer. The [typeProvider] is
+   * the type provider used to access known types. The [declaredVariables] is
+   * the set of variables declared on the command line using '-D'.
+   */
+  ConstantValueComputer(this._context, TypeProvider typeProvider,
+      DeclaredVariables declaredVariables,
+      [ConstantEvaluationValidator validator])
+      : evaluationEngine = new ConstantEvaluationEngine(
+          typeProvider, declaredVariables, validator: validator);
+
+  /**
+   * Add the constants in the given compilation [unit] to the list of constants
+   * whose value needs to be computed.
+   */
+  void add(CompilationUnit unit, Source source, Source librarySource) {
+    ConstantFinder constantFinder =
+        new ConstantFinder(_context, source, librarySource);
+    unit.accept(constantFinder);
+    _constantsToCompute.addAll(constantFinder.constantsToCompute);
+  }
+
+  /**
+   * Compute values for all of the constants in the compilation units that were
+   * added.
+   */
+  void computeValues() {
+    for (ConstantEvaluationTarget constant in _constantsToCompute) {
+      referenceGraph.addNode(constant);
+      evaluationEngine.computeDependencies(constant,
+          (ConstantEvaluationTarget dependency) {
+        referenceGraph.addEdge(constant, dependency);
+      });
+    }
+    List<List<ConstantEvaluationTarget>> topologicalSort =
+        referenceGraph.computeTopologicalSort();
+    for (List<ConstantEvaluationTarget> constantsInCycle in topologicalSort) {
+      if (constantsInCycle.length == 1) {
+        ConstantEvaluationTarget constant = constantsInCycle[0];
+        if (!referenceGraph.getTails(constant).contains(constant)) {
+          _computeValueFor(constant);
+          continue;
+        }
+      }
+      for (ConstantEvaluationTarget constant in constantsInCycle) {
+        evaluationEngine.generateCycleError(constantsInCycle, constant);
+      }
+    }
+  }
+
+  /**
+   * Compute a value for the given [constant].
+   */
+  void _computeValueFor(ConstantEvaluationTarget constant) {
+    if (!_constantsToCompute.contains(constant)) {
+      // Element is in the dependency graph but should have been computed by
+      // a previous stage of analysis.
+      // TODO(paulberry): once we have moved over to the new task model, this
+      // should only occur for constants associated with enum members.  Once
+      // that happens we should add an assertion to verify that it doesn't
+      // occur in any other cases.
+      return;
+    }
+    evaluationEngine.computeConstantValue(constant);
+  }
+}
+
+/**
+ * A visitor used to evaluate constant expressions to produce their compile-time
+ * value. According to the Dart Language Specification: <blockquote> A constant
+ * expression is one of the following:
+ *
+ * * A literal number.
+ * * A literal boolean.
+ * * A literal string where any interpolated expression is a compile-time
+ *   constant that evaluates to a numeric, string or boolean value or to
+ *   <b>null</b>.
+ * * A literal symbol.
+ * * <b>null</b>.
+ * * A qualified reference to a static constant variable.
+ * * An identifier expression that denotes a constant variable, class or type
+ *   alias.
+ * * A constant constructor invocation.
+ * * A constant list literal.
+ * * A constant map literal.
+ * * A simple or qualified identifier denoting a top-level function or a static
+ *   method.
+ * * A parenthesized expression <i>(e)</i> where <i>e</i> is a constant
+ *   expression.
+ * * An expression of the form <i>identical(e<sub>1</sub>, e<sub>2</sub>)</i>
+ *   where <i>e<sub>1</sub></i> and <i>e<sub>2</sub></i> are constant
+ *   expressions and <i>identical()</i> is statically bound to the predefined
+ *   dart function <i>identical()</i> discussed above.
+ * * An expression of one of the forms <i>e<sub>1</sub> == e<sub>2</sub></i> or
+ *   <i>e<sub>1</sub> != e<sub>2</sub></i> where <i>e<sub>1</sub></i> and
+ *   <i>e<sub>2</sub></i> are constant expressions that evaluate to a numeric,
+ *   string or boolean value.
+ * * An expression of one of the forms <i>!e</i>, <i>e<sub>1</sub> &amp;&amp;
+ *   e<sub>2</sub></i> or <i>e<sub>1</sub> || e<sub>2</sub></i>, where <i>e</i>,
+ *   <i>e1</sub></i> and <i>e2</sub></i> are constant expressions that evaluate
+ *   to a boolean value.
+ * * An expression of one of the forms <i>~e</i>, <i>e<sub>1</sub> ^
+ *   e<sub>2</sub></i>, <i>e<sub>1</sub> &amp; e<sub>2</sub></i>,
+ *   <i>e<sub>1</sub> | e<sub>2</sub></i>, <i>e<sub>1</sub> &gt;&gt;
+ *   e<sub>2</sub></i> or <i>e<sub>1</sub> &lt;&lt; e<sub>2</sub></i>, where
+ *   <i>e</i>, <i>e<sub>1</sub></i> and <i>e<sub>2</sub></i> are constant
+ *   expressions that evaluate to an integer value or to <b>null</b>.
+ * * An expression of one of the forms <i>-e</i>, <i>e<sub>1</sub> +
+ *   e<sub>2</sub></i>, <i>e<sub>1</sub> - e<sub>2</sub></i>, <i>e<sub>1</sub> *
+ *   e<sub>2</sub></i>, <i>e<sub>1</sub> / e<sub>2</sub></i>, <i>e<sub>1</sub>
+ *   ~/ e<sub>2</sub></i>, <i>e<sub>1</sub> &gt; e<sub>2</sub></i>,
+ *   <i>e<sub>1</sub> &lt; e<sub>2</sub></i>, <i>e<sub>1</sub> &gt;=
+ *   e<sub>2</sub></i>, <i>e<sub>1</sub> &lt;= e<sub>2</sub></i> or
+ *   <i>e<sub>1</sub> % e<sub>2</sub></i>, where <i>e</i>, <i>e<sub>1</sub></i>
+ *   and <i>e<sub>2</sub></i> are constant expressions that evaluate to a
+ *   numeric value or to <b>null</b>.
+ * * An expression of the form <i>e<sub>1</sub> ? e<sub>2</sub> :
+ *   e<sub>3</sub></i> where <i>e<sub>1</sub></i>, <i>e<sub>2</sub></i> and
+ *   <i>e<sub>3</sub></i> are constant expressions, and <i>e<sub>1</sub></i>
+ *   evaluates to a boolean value.
+ * </blockquote>
+ */
+class ConstantVisitor extends UnifyingAstVisitor<DartObjectImpl> {
+  /**
+   * The type provider used to access the known types.
+   */
+  final ConstantEvaluationEngine evaluationEngine;
+
+  final HashMap<String, DartObjectImpl> _lexicalEnvironment;
+
+  /**
+   * Error reporter that we use to report errors accumulated while computing the
+   * constant.
+   */
+  final ErrorReporter _errorReporter;
+
+  /**
+   * Helper class used to compute constant values.
+   */
+  DartObjectComputer _dartObjectComputer;
+
+  /**
+   * Initialize a newly created constant visitor. The [evaluationEngine] is
+   * used to evaluate instance creation expressions. The [lexicalEnvironment]
+   * is a map containing values which should override identifiers, or `null` if
+   * no overriding is necessary. The [_errorReporter] is used to report errors
+   * found during evaluation.  The [validator] is used by unit tests to verify
+   * correct dependency analysis.
+   */
+  ConstantVisitor(this.evaluationEngine, this._errorReporter,
+      {HashMap<String, DartObjectImpl> lexicalEnvironment})
+      : _lexicalEnvironment = lexicalEnvironment {
+    this._dartObjectComputer =
+        new DartObjectComputer(_errorReporter, evaluationEngine.typeProvider);
+  }
+
+  /**
+   * Convenience getter to gain access to the [evalationEngine]'s type
+   * provider.
+   */
+  TypeProvider get _typeProvider => evaluationEngine.typeProvider;
+
+  /**
+   * Convenience getter to gain access to the [evaluationEngine]'s type system.
+   */
+  TypeSystem get _typeSystem => evaluationEngine.typeSystem;
+
+  @override
+  DartObjectImpl visitAdjacentStrings(AdjacentStrings node) {
+    DartObjectImpl result = null;
+    for (StringLiteral string in node.strings) {
+      if (result == null) {
+        result = string.accept(this);
+      } else {
+        result =
+            _dartObjectComputer.concatenate(node, result, string.accept(this));
+      }
+    }
+    return result;
+  }
+
+  @override
+  DartObjectImpl visitBinaryExpression(BinaryExpression node) {
+    DartObjectImpl leftResult = node.leftOperand.accept(this);
+    DartObjectImpl rightResult = node.rightOperand.accept(this);
+    TokenType operatorType = node.operator.type;
+    // 'null' is almost never good operand
+    if (operatorType != TokenType.BANG_EQ && operatorType != TokenType.EQ_EQ) {
+      if (leftResult != null && leftResult.isNull ||
+          rightResult != null && rightResult.isNull) {
+        _error(node, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+        return null;
+      }
+    }
+    // evaluate operator
+    while (true) {
+      if (operatorType == TokenType.AMPERSAND) {
+        return _dartObjectComputer.bitAnd(node, leftResult, rightResult);
+      } else if (operatorType == TokenType.AMPERSAND_AMPERSAND) {
+        return _dartObjectComputer.logicalAnd(node, leftResult, rightResult);
+      } else if (operatorType == TokenType.BANG_EQ) {
+        return _dartObjectComputer.notEqual(node, leftResult, rightResult);
+      } else if (operatorType == TokenType.BAR) {
+        return _dartObjectComputer.bitOr(node, leftResult, rightResult);
+      } else if (operatorType == TokenType.BAR_BAR) {
+        return _dartObjectComputer.logicalOr(node, leftResult, rightResult);
+      } else if (operatorType == TokenType.CARET) {
+        return _dartObjectComputer.bitXor(node, leftResult, rightResult);
+      } else if (operatorType == TokenType.EQ_EQ) {
+        return _dartObjectComputer.equalEqual(node, leftResult, rightResult);
+      } else if (operatorType == TokenType.GT) {
+        return _dartObjectComputer.greaterThan(node, leftResult, rightResult);
+      } else if (operatorType == TokenType.GT_EQ) {
+        return _dartObjectComputer.greaterThanOrEqual(
+            node, leftResult, rightResult);
+      } else if (operatorType == TokenType.GT_GT) {
+        return _dartObjectComputer.shiftRight(node, leftResult, rightResult);
+      } else if (operatorType == TokenType.LT) {
+        return _dartObjectComputer.lessThan(node, leftResult, rightResult);
+      } else if (operatorType == TokenType.LT_EQ) {
+        return _dartObjectComputer.lessThanOrEqual(
+            node, leftResult, rightResult);
+      } else if (operatorType == TokenType.LT_LT) {
+        return _dartObjectComputer.shiftLeft(node, leftResult, rightResult);
+      } else if (operatorType == TokenType.MINUS) {
+        return _dartObjectComputer.minus(node, leftResult, rightResult);
+      } else if (operatorType == TokenType.PERCENT) {
+        return _dartObjectComputer.remainder(node, leftResult, rightResult);
+      } else if (operatorType == TokenType.PLUS) {
+        return _dartObjectComputer.add(node, leftResult, rightResult);
+      } else if (operatorType == TokenType.STAR) {
+        return _dartObjectComputer.times(node, leftResult, rightResult);
+      } else if (operatorType == TokenType.SLASH) {
+        return _dartObjectComputer.divide(node, leftResult, rightResult);
+      } else if (operatorType == TokenType.TILDE_SLASH) {
+        return _dartObjectComputer.integerDivide(node, leftResult, rightResult);
+      } else {
+        // TODO(brianwilkerson) Figure out which error to report.
+        _error(node, null);
+        return null;
+      }
+      break;
+    }
+  }
+
+  @override
+  DartObjectImpl visitBooleanLiteral(BooleanLiteral node) =>
+      new DartObjectImpl(_typeProvider.boolType, BoolState.from(node.value));
+
+  @override
+  DartObjectImpl visitConditionalExpression(ConditionalExpression node) {
+    Expression condition = node.condition;
+    DartObjectImpl conditionResult = condition.accept(this);
+    DartObjectImpl thenResult = node.thenExpression.accept(this);
+    DartObjectImpl elseResult = node.elseExpression.accept(this);
+    if (conditionResult == null) {
+      return conditionResult;
+    } else if (!conditionResult.isBool) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL, condition);
+      return null;
+    } else if (thenResult == null) {
+      return thenResult;
+    } else if (elseResult == null) {
+      return elseResult;
+    }
+    conditionResult =
+        _dartObjectComputer.applyBooleanConversion(condition, conditionResult);
+    if (conditionResult == null) {
+      return conditionResult;
+    }
+    if (conditionResult.isTrue) {
+      return thenResult;
+    } else if (conditionResult.isFalse) {
+      return elseResult;
+    }
+    ParameterizedType thenType = thenResult.type;
+    ParameterizedType elseType = elseResult.type;
+    return new DartObjectImpl.validWithUnknownValue(
+        _typeSystem.getLeastUpperBound(thenType, elseType) as InterfaceType);
+  }
+
+  @override
+  DartObjectImpl visitDoubleLiteral(DoubleLiteral node) =>
+      new DartObjectImpl(_typeProvider.doubleType, new DoubleState(node.value));
+
+  @override
+  DartObjectImpl visitInstanceCreationExpression(
+      InstanceCreationExpression node) {
+    if (!node.isConst) {
+      // TODO(brianwilkerson) Figure out which error to report.
+      _error(node, null);
+      return null;
+    }
+    ConstructorElement constructor = node.staticElement;
+    if (constructor == null) {
+      // Couldn't resolve the constructor so we can't compute a value.  No
+      // problem - the error has already been reported.
+      return null;
+    }
+    return evaluationEngine.evaluateConstructorCall(
+        node, node.argumentList.arguments, constructor, this, _errorReporter);
+  }
+
+  @override
+  DartObjectImpl visitIntegerLiteral(IntegerLiteral node) =>
+      new DartObjectImpl(_typeProvider.intType, new IntState(node.value));
+
+  @override
+  DartObjectImpl visitInterpolationExpression(InterpolationExpression node) {
+    DartObjectImpl result = node.expression.accept(this);
+    if (result != null && !result.isBoolNumStringOrNull) {
+      _error(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING);
+      return null;
+    }
+    return _dartObjectComputer.performToString(node, result);
+  }
+
+  @override
+  DartObjectImpl visitInterpolationString(InterpolationString node) =>
+      new DartObjectImpl(_typeProvider.stringType, new StringState(node.value));
+
+  @override
+  DartObjectImpl visitListLiteral(ListLiteral node) {
+    if (node.constKeyword == null) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.MISSING_CONST_IN_LIST_LITERAL, node);
+      return null;
+    }
+    bool errorOccurred = false;
+    List<DartObjectImpl> elements = new List<DartObjectImpl>();
+    for (Expression element in node.elements) {
+      DartObjectImpl elementResult = element.accept(this);
+      if (elementResult == null) {
+        errorOccurred = true;
+      } else {
+        elements.add(elementResult);
+      }
+    }
+    if (errorOccurred) {
+      return null;
+    }
+    DartType elementType = _typeProvider.dynamicType;
+    if (node.typeArguments != null &&
+        node.typeArguments.arguments.length == 1) {
+      DartType type = node.typeArguments.arguments[0].type;
+      if (type != null) {
+        elementType = type;
+      }
+    }
+    InterfaceType listType = _typeProvider.listType.substitute4([elementType]);
+    return new DartObjectImpl(listType, new ListState(elements));
+  }
+
+  @override
+  DartObjectImpl visitMapLiteral(MapLiteral node) {
+    if (node.constKeyword == null) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.MISSING_CONST_IN_MAP_LITERAL, node);
+      return null;
+    }
+    bool errorOccurred = false;
+    HashMap<DartObjectImpl, DartObjectImpl> map =
+        new HashMap<DartObjectImpl, DartObjectImpl>();
+    for (MapLiteralEntry entry in node.entries) {
+      DartObjectImpl keyResult = entry.key.accept(this);
+      DartObjectImpl valueResult = entry.value.accept(this);
+      if (keyResult == null || valueResult == null) {
+        errorOccurred = true;
+      } else {
+        map[keyResult] = valueResult;
+      }
+    }
+    if (errorOccurred) {
+      return null;
+    }
+    DartType keyType = _typeProvider.dynamicType;
+    DartType valueType = _typeProvider.dynamicType;
+    if (node.typeArguments != null &&
+        node.typeArguments.arguments.length == 2) {
+      DartType keyTypeCandidate = node.typeArguments.arguments[0].type;
+      if (keyTypeCandidate != null) {
+        keyType = keyTypeCandidate;
+      }
+      DartType valueTypeCandidate = node.typeArguments.arguments[1].type;
+      if (valueTypeCandidate != null) {
+        valueType = valueTypeCandidate;
+      }
+    }
+    InterfaceType mapType =
+        _typeProvider.mapType.substitute4([keyType, valueType]);
+    return new DartObjectImpl(mapType, new MapState(map));
+  }
+
+  @override
+  DartObjectImpl visitMethodInvocation(MethodInvocation node) {
+    Element element = node.methodName.staticElement;
+    if (element is FunctionElement) {
+      FunctionElement function = element;
+      if (function.name == "identical") {
+        NodeList<Expression> arguments = node.argumentList.arguments;
+        if (arguments.length == 2) {
+          Element enclosingElement = function.enclosingElement;
+          if (enclosingElement is CompilationUnitElement) {
+            LibraryElement library = enclosingElement.library;
+            if (library.isDartCore) {
+              DartObjectImpl leftArgument = arguments[0].accept(this);
+              DartObjectImpl rightArgument = arguments[1].accept(this);
+              return _dartObjectComputer.isIdentical(
+                  node, leftArgument, rightArgument);
+            }
+          }
+        }
+      }
+    }
+    // TODO(brianwilkerson) Figure out which error to report.
+    _error(node, null);
+    return null;
+  }
+
+  @override
+  DartObjectImpl visitNamedExpression(NamedExpression node) =>
+      node.expression.accept(this);
+
+  @override
+  DartObjectImpl visitNode(AstNode node) {
+    // TODO(brianwilkerson) Figure out which error to report.
+    _error(node, null);
+    return null;
+  }
+
+  @override
+  DartObjectImpl visitNullLiteral(NullLiteral node) => _typeProvider.nullObject;
+
+  @override
+  DartObjectImpl visitParenthesizedExpression(ParenthesizedExpression node) =>
+      node.expression.accept(this);
+
+  @override
+  DartObjectImpl visitPrefixedIdentifier(PrefixedIdentifier node) {
+    SimpleIdentifier prefixNode = node.prefix;
+    Element prefixElement = prefixNode.staticElement;
+    // String.length
+    if (prefixElement is! PrefixElement && prefixElement is! ClassElement) {
+      DartObjectImpl prefixResult = node.prefix.accept(this);
+      if (_isStringLength(prefixResult, node.identifier)) {
+        return prefixResult.stringLength(_typeProvider);
+      }
+    }
+    // importPrefix.CONST
+    if (prefixElement is! PrefixElement) {
+      DartObjectImpl prefixResult = prefixNode.accept(this);
+      if (prefixResult == null) {
+        // The error has already been reported.
+        return null;
+      }
+    }
+    // validate prefixed identifier
+    return _getConstantValue(node, node.staticElement);
+  }
+
+  @override
+  DartObjectImpl visitPrefixExpression(PrefixExpression node) {
+    DartObjectImpl operand = node.operand.accept(this);
+    if (operand != null && operand.isNull) {
+      _error(node, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+      return null;
+    }
+    while (true) {
+      if (node.operator.type == TokenType.BANG) {
+        return _dartObjectComputer.logicalNot(node, operand);
+      } else if (node.operator.type == TokenType.TILDE) {
+        return _dartObjectComputer.bitNot(node, operand);
+      } else if (node.operator.type == TokenType.MINUS) {
+        return _dartObjectComputer.negated(node, operand);
+      } else {
+        // TODO(brianwilkerson) Figure out which error to report.
+        _error(node, null);
+        return null;
+      }
+      break;
+    }
+  }
+
+  @override
+  DartObjectImpl visitPropertyAccess(PropertyAccess node) {
+    if (node.target != null) {
+      DartObjectImpl prefixResult = node.target.accept(this);
+      if (_isStringLength(prefixResult, node.propertyName)) {
+        return prefixResult.stringLength(_typeProvider);
+      }
+    }
+    return _getConstantValue(node, node.propertyName.staticElement);
+  }
+
+  @override
+  DartObjectImpl visitSimpleIdentifier(SimpleIdentifier node) {
+    if (_lexicalEnvironment != null &&
+        _lexicalEnvironment.containsKey(node.name)) {
+      return _lexicalEnvironment[node.name];
+    }
+    return _getConstantValue(node, node.staticElement);
+  }
+
+  @override
+  DartObjectImpl visitSimpleStringLiteral(SimpleStringLiteral node) =>
+      new DartObjectImpl(_typeProvider.stringType, new StringState(node.value));
+
+  @override
+  DartObjectImpl visitStringInterpolation(StringInterpolation node) {
+    DartObjectImpl result = null;
+    bool first = true;
+    for (InterpolationElement element in node.elements) {
+      if (first) {
+        result = element.accept(this);
+        first = false;
+      } else {
+        result =
+            _dartObjectComputer.concatenate(node, result, element.accept(this));
+      }
+    }
+    return result;
+  }
+
+  @override
+  DartObjectImpl visitSymbolLiteral(SymbolLiteral node) {
+    StringBuffer buffer = new StringBuffer();
+    List<Token> components = node.components;
+    for (int i = 0; i < components.length; i++) {
+      if (i > 0) {
+        buffer.writeCharCode(0x2E);
+      }
+      buffer.write(components[i].lexeme);
+    }
+    return new DartObjectImpl(
+        _typeProvider.symbolType, new SymbolState(buffer.toString()));
+  }
+
+  /**
+   * Create an error associated with the given [node]. The error will have the
+   * given error [code].
+   */
+  void _error(AstNode node, ErrorCode code) {
+    _errorReporter.reportErrorForNode(
+        code == null ? CompileTimeErrorCode.INVALID_CONSTANT : code, node);
+  }
+
+  /**
+   * Return the constant value of the static constant represented by the given
+   * [element]. The [node] is the node to be used if an error needs to be
+   * reported.
+   */
+  DartObjectImpl _getConstantValue(AstNode node, Element element) {
+    if (element is PropertyAccessorElement) {
+      element = (element as PropertyAccessorElement).variable;
+    }
+    if (element is VariableElementImpl) {
+      VariableElementImpl variableElementImpl = element;
+      evaluationEngine.validator.beforeGetEvaluationResult(element);
+      EvaluationResultImpl value = variableElementImpl.evaluationResult;
+      if (variableElementImpl.isConst && value != null) {
+        return value.value;
+      }
+    } else if (element is ExecutableElement) {
+      ExecutableElement function = element;
+      if (function.isStatic) {
+        ParameterizedType functionType = function.type;
+        if (functionType == null) {
+          functionType = _typeProvider.functionType;
+        }
+        return new DartObjectImpl(functionType, new FunctionState(function));
+      }
+    } else if (element is ClassElement ||
+        element is FunctionTypeAliasElement ||
+        element is DynamicElementImpl) {
+      return new DartObjectImpl(_typeProvider.typeType, new TypeState(element));
+    }
+    // TODO(brianwilkerson) Figure out which error to report.
+    _error(node, null);
+    return null;
+  }
+
+  /**
+   * Return `true` if the given [targetResult] represents a string and the
+   * [identifier] is "length".
+   */
+  bool _isStringLength(
+      DartObjectImpl targetResult, SimpleIdentifier identifier) {
+    if (targetResult == null || targetResult.type != _typeProvider.stringType) {
+      return false;
+    }
+    return identifier.name == 'length';
+  }
+
+  /**
+   * Return the value of the given [expression], or a representation of 'null'
+   * if the expression cannot be evaluated.
+   */
+  DartObjectImpl _valueOf(Expression expression) {
+    DartObjectImpl expressionValue = expression.accept(this);
+    if (expressionValue != null) {
+      return expressionValue;
+    }
+    return _typeProvider.nullObject;
+  }
+}
+
+/**
+ * The state of a Dart object.
+ */
+abstract class DartObject {
+  /**
+   * Return the boolean value of this object, or `null` if either the value of
+   * this object is not known or this object is not of type 'bool'.
+   */
+  bool get boolValue;
+
+  /**
+   * Return the floating point value of this object, or `null` if either the
+   * value of this object is not known or this object is not of type 'double'.
+   */
+  double get doubleValue;
+
+  /**
+   * Return `true` if this object's value can be represented exactly.
+   */
+  bool get hasExactValue;
+
+  /**
+   * Return the integer value of this object, or `null` if either the value of
+   * this object is not known or this object is not of type 'int'.
+   */
+  int get intValue;
+
+  /**
+   * Return `true` if this object represents the value 'false'.
+   */
+  bool get isFalse;
+
+  /**
+   * Return `true` if this object represents the value 'null'.
+   */
+  bool get isNull;
+
+  /**
+   * Return `true` if this object represents the value 'true'.
+   */
+  bool get isTrue;
+
+  /**
+   * Return the string value of this object, or `null` if either the value of
+   * this object is not known or this object is not of type 'String'.
+   */
+  String get stringValue;
+
+  /**
+   * Return the run-time type of this object.
+   */
+  ParameterizedType get type;
+
+  /**
+   * Return this object's value if it can be represented exactly, or `null` if
+   * either the value cannot be represented exactly or if the value is `null`.
+   * Clients should use [hasExactValue] to distinguish between these two cases.
+   */
+  Object get value;
+}
+
+/**
+ * A utility class that contains methods for manipulating instances of a Dart
+ * class and for collecting errors during evaluation.
+ */
+class DartObjectComputer {
+  /**
+   * The error reporter that we are using to collect errors.
+   */
+  final ErrorReporter _errorReporter;
+
+  /**
+   * The type provider used to create objects of the appropriate types, and to
+   * identify when an object is of a built-in type.
+   */
+  final TypeProvider _typeProvider;
+
+  DartObjectComputer(this._errorReporter, this._typeProvider);
+
+  DartObjectImpl add(BinaryExpression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.add(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+        return null;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the result of applying boolean conversion to the [evaluationResult].
+   * The [node] is the node against which errors should be reported.
+   */
+  DartObjectImpl applyBooleanConversion(
+      AstNode node, DartObjectImpl evaluationResult) {
+    if (evaluationResult != null) {
+      try {
+        return evaluationResult.convertToBool(_typeProvider);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl bitAnd(BinaryExpression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.bitAnd(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl bitNot(Expression node, DartObjectImpl evaluationResult) {
+    if (evaluationResult != null) {
+      try {
+        return evaluationResult.bitNot(_typeProvider);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl bitOr(BinaryExpression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.bitOr(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl bitXor(BinaryExpression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.bitXor(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl concatenate(Expression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.concatenate(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl divide(BinaryExpression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.divide(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl equalEqual(Expression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.equalEqual(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl greaterThan(BinaryExpression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.greaterThan(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl greaterThanOrEqual(BinaryExpression node,
+      DartObjectImpl leftOperand, DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.greaterThanOrEqual(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl integerDivide(BinaryExpression node,
+      DartObjectImpl leftOperand, DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.integerDivide(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl isIdentical(Expression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.isIdentical(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl lessThan(BinaryExpression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.lessThan(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl lessThanOrEqual(BinaryExpression node,
+      DartObjectImpl leftOperand, DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.lessThanOrEqual(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl logicalAnd(BinaryExpression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.logicalAnd(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl logicalNot(Expression node, DartObjectImpl evaluationResult) {
+    if (evaluationResult != null) {
+      try {
+        return evaluationResult.logicalNot(_typeProvider);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl logicalOr(BinaryExpression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.logicalOr(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl minus(BinaryExpression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.minus(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl negated(Expression node, DartObjectImpl evaluationResult) {
+    if (evaluationResult != null) {
+      try {
+        return evaluationResult.negated(_typeProvider);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl notEqual(BinaryExpression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.notEqual(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl performToString(
+      AstNode node, DartObjectImpl evaluationResult) {
+    if (evaluationResult != null) {
+      try {
+        return evaluationResult.performToString(_typeProvider);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl remainder(BinaryExpression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.remainder(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl shiftLeft(BinaryExpression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.shiftLeft(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl shiftRight(BinaryExpression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.shiftRight(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the result of invoking the 'length' getter on the
+   * [evaluationResult]. The [node] is the node against which errors should be
+   * reported.
+   */
+  EvaluationResultImpl stringLength(
+      Expression node, EvaluationResultImpl evaluationResult) {
+    if (evaluationResult.value != null) {
+      try {
+        return new EvaluationResultImpl(
+            evaluationResult.value.stringLength(_typeProvider));
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return new EvaluationResultImpl(null);
+  }
+
+  DartObjectImpl times(BinaryExpression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.times(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+}
+
+/**
+ * An instance of a Dart class.
+ */
+class DartObjectImpl implements DartObject {
+  /**
+   * An empty list of objects.
+   */
+  static const List<DartObjectImpl> EMPTY_LIST = const <DartObjectImpl>[];
+
+  /**
+   * The run-time type of this object.
+   */
+  final ParameterizedType type;
+
+  /**
+   * The state of the object.
+   */
+  final InstanceState _state;
+
+  /**
+   * Initialize a newly created object to have the given [type] and [_state].
+   */
+  DartObjectImpl(this.type, this._state);
+
+  /**
+   * Create an object to represent an unknown value.
+   */
+  factory DartObjectImpl.validWithUnknownValue(InterfaceType type) {
+    if (type.element.library.isDartCore) {
+      String typeName = type.name;
+      if (typeName == "bool") {
+        return new DartObjectImpl(type, BoolState.UNKNOWN_VALUE);
+      } else if (typeName == "double") {
+        return new DartObjectImpl(type, DoubleState.UNKNOWN_VALUE);
+      } else if (typeName == "int") {
+        return new DartObjectImpl(type, IntState.UNKNOWN_VALUE);
+      } else if (typeName == "String") {
+        return new DartObjectImpl(type, StringState.UNKNOWN_VALUE);
+      }
+    }
+    return new DartObjectImpl(type, GenericState.UNKNOWN_VALUE);
+  }
+
+  @override
+  bool get boolValue {
+    if (_state is BoolState) {
+      return (_state as BoolState).value;
+    }
+    return null;
+  }
+
+  @override
+  double get doubleValue {
+    if (_state is DoubleState) {
+      return (_state as DoubleState).value;
+    }
+    return null;
+  }
+
+  HashMap<String, DartObjectImpl> get fields => _state.fields;
+
+  @override
+  bool get hasExactValue => _state.hasExactValue;
+
+  @override
+  int get hashCode => JenkinsSmiHash.hash2(type.hashCode, _state.hashCode);
+
+  @override
+  int get intValue {
+    if (_state is IntState) {
+      return (_state as IntState).value;
+    }
+    return null;
+  }
+
+  /**
+   * Return `true` if this object represents an object whose type is 'bool'.
+   */
+  bool get isBool => _state.isBool;
+
+  /**
+   * Return `true` if this object represents an object whose type is either
+   * 'bool', 'num', 'String', or 'Null'.
+   */
+  bool get isBoolNumStringOrNull => _state.isBoolNumStringOrNull;
+
+  @override
+  bool get isFalse =>
+      _state is BoolState && identical((_state as BoolState).value, false);
+
+  @override
+  bool get isNull => _state is NullState;
+
+  @override
+  bool get isTrue =>
+      _state is BoolState && identical((_state as BoolState).value, true);
+
+  /**
+   * Return `true` if this object represents an unknown value.
+   */
+  bool get isUnknown => _state.isUnknown;
+
+  /**
+   * Return `true` if this object represents an instance of a user-defined
+   * class.
+   */
+  bool get isUserDefinedObject => _state is GenericState;
+
+  @override
+  String get stringValue {
+    if (_state is StringState) {
+      return (_state as StringState).value;
+    }
+    return null;
+  }
+
+  @override
+  Object get value => _state.value;
+
+  @override
+  bool operator ==(Object object) {
+    if (object is! DartObjectImpl) {
+      return false;
+    }
+    DartObjectImpl dartObject = object as DartObjectImpl;
+    return type == dartObject.type && _state == dartObject._state;
+  }
+
+  /**
+   * Return the result of invoking the '+' operator on this object with the
+   * given [rightOperand]. The [typeProvider] is the type provider used to find
+   * known types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl add(TypeProvider typeProvider, DartObjectImpl rightOperand) {
+    InstanceState result = _state.add(rightOperand._state);
+    if (result is IntState) {
+      return new DartObjectImpl(typeProvider.intType, result);
+    } else if (result is DoubleState) {
+      return new DartObjectImpl(typeProvider.doubleType, result);
+    } else if (result is NumState) {
+      return new DartObjectImpl(typeProvider.numType, result);
+    } else if (result is StringState) {
+      return new DartObjectImpl(typeProvider.stringType, result);
+    }
+    // We should never get here.
+    throw new IllegalStateException("add returned a ${result.runtimeType}");
+  }
+
+  /**
+   * Return the result of invoking the '&' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl bitAnd(
+          TypeProvider typeProvider, DartObjectImpl rightOperand) =>
+      new DartObjectImpl(
+          typeProvider.intType, _state.bitAnd(rightOperand._state));
+
+  /**
+   * Return the result of invoking the '~' operator on this object. The
+   * [typeProvider] is the type provider used to find known types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl bitNot(TypeProvider typeProvider) =>
+      new DartObjectImpl(typeProvider.intType, _state.bitNot());
+
+  /**
+   * Return the result of invoking the '|' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl bitOr(
+          TypeProvider typeProvider, DartObjectImpl rightOperand) =>
+      new DartObjectImpl(
+          typeProvider.intType, _state.bitOr(rightOperand._state));
+
+  /**
+   * Return the result of invoking the '^' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl bitXor(
+          TypeProvider typeProvider, DartObjectImpl rightOperand) =>
+      new DartObjectImpl(
+          typeProvider.intType, _state.bitXor(rightOperand._state));
+
+  /**
+   * Return the result of invoking the ' ' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl concatenate(
+          TypeProvider typeProvider, DartObjectImpl rightOperand) =>
+      new DartObjectImpl(
+          typeProvider.stringType, _state.concatenate(rightOperand._state));
+
+  /**
+   * Return the result of applying boolean conversion to this object. The
+   * [typeProvider] is the type provider used to find known types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl convertToBool(TypeProvider typeProvider) {
+    InterfaceType boolType = typeProvider.boolType;
+    if (identical(type, boolType)) {
+      return this;
+    }
+    return new DartObjectImpl(boolType, _state.convertToBool());
+  }
+
+  /**
+   * Return the result of invoking the '/' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for
+   * an object of this kind.
+   */
+  DartObjectImpl divide(
+      TypeProvider typeProvider, DartObjectImpl rightOperand) {
+    InstanceState result = _state.divide(rightOperand._state);
+    if (result is IntState) {
+      return new DartObjectImpl(typeProvider.intType, result);
+    } else if (result is DoubleState) {
+      return new DartObjectImpl(typeProvider.doubleType, result);
+    } else if (result is NumState) {
+      return new DartObjectImpl(typeProvider.numType, result);
+    }
+    // We should never get here.
+    throw new IllegalStateException("divide returned a ${result.runtimeType}");
+  }
+
+  /**
+   * Return the result of invoking the '==' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl equalEqual(
+      TypeProvider typeProvider, DartObjectImpl rightOperand) {
+    if (type != rightOperand.type) {
+      String typeName = type.name;
+      if (!(typeName == "bool" ||
+          typeName == "double" ||
+          typeName == "int" ||
+          typeName == "num" ||
+          typeName == "String" ||
+          typeName == "Null" ||
+          type.isDynamic)) {
+        throw new EvaluationException(
+            CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING);
+      }
+    }
+    return new DartObjectImpl(
+        typeProvider.boolType, _state.equalEqual(rightOperand._state));
+  }
+
+  /**
+   * Return the result of invoking the '&gt;' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl greaterThan(
+          TypeProvider typeProvider, DartObjectImpl rightOperand) =>
+      new DartObjectImpl(
+          typeProvider.boolType, _state.greaterThan(rightOperand._state));
+
+  /**
+   * Return the result of invoking the '&gt;=' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl greaterThanOrEqual(TypeProvider typeProvider,
+      DartObjectImpl rightOperand) => new DartObjectImpl(
+      typeProvider.boolType, _state.greaterThanOrEqual(rightOperand._state));
+
+  /**
+   * Return the result of invoking the '~/' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl integerDivide(
+          TypeProvider typeProvider, DartObjectImpl rightOperand) =>
+      new DartObjectImpl(
+          typeProvider.intType, _state.integerDivide(rightOperand._state));
+
+  /**
+   * Return the result of invoking the identical function on this object with
+   * the [rightOperand]. The [typeProvider] is the type provider used to find
+   * known types.
+   */
+  DartObjectImpl isIdentical(
+      TypeProvider typeProvider, DartObjectImpl rightOperand) {
+    return new DartObjectImpl(
+        typeProvider.boolType, _state.isIdentical(rightOperand._state));
+  }
+
+  /**
+   * Return the result of invoking the '&lt;' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl lessThan(
+          TypeProvider typeProvider, DartObjectImpl rightOperand) =>
+      new DartObjectImpl(
+          typeProvider.boolType, _state.lessThan(rightOperand._state));
+
+  /**
+   * Return the result of invoking the '&lt;=' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl lessThanOrEqual(
+          TypeProvider typeProvider, DartObjectImpl rightOperand) =>
+      new DartObjectImpl(
+          typeProvider.boolType, _state.lessThanOrEqual(rightOperand._state));
+
+  /**
+   * Return the result of invoking the '&&' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl logicalAnd(
+          TypeProvider typeProvider, DartObjectImpl rightOperand) =>
+      new DartObjectImpl(
+          typeProvider.boolType, _state.logicalAnd(rightOperand._state));
+
+  /**
+   * Return the result of invoking the '!' operator on this object. The
+   * [typeProvider] is the type provider used to find known types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl logicalNot(TypeProvider typeProvider) =>
+      new DartObjectImpl(typeProvider.boolType, _state.logicalNot());
+
+  /**
+   * Return the result of invoking the '||' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl logicalOr(
+          TypeProvider typeProvider, DartObjectImpl rightOperand) =>
+      new DartObjectImpl(
+          typeProvider.boolType, _state.logicalOr(rightOperand._state));
+
+  /**
+   * Return the result of invoking the '-' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl minus(TypeProvider typeProvider, DartObjectImpl rightOperand) {
+    InstanceState result = _state.minus(rightOperand._state);
+    if (result is IntState) {
+      return new DartObjectImpl(typeProvider.intType, result);
+    } else if (result is DoubleState) {
+      return new DartObjectImpl(typeProvider.doubleType, result);
+    } else if (result is NumState) {
+      return new DartObjectImpl(typeProvider.numType, result);
+    }
+    // We should never get here.
+    throw new IllegalStateException("minus returned a ${result.runtimeType}");
+  }
+
+  /**
+   * Return the result of invoking the '-' operator on this object. The
+   * [typeProvider] is the type provider used to find known types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl negated(TypeProvider typeProvider) {
+    InstanceState result = _state.negated();
+    if (result is IntState) {
+      return new DartObjectImpl(typeProvider.intType, result);
+    } else if (result is DoubleState) {
+      return new DartObjectImpl(typeProvider.doubleType, result);
+    } else if (result is NumState) {
+      return new DartObjectImpl(typeProvider.numType, result);
+    }
+    // We should never get here.
+    throw new IllegalStateException("negated returned a ${result.runtimeType}");
+  }
+
+  /**
+   * Return the result of invoking the '!=' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl notEqual(
+      TypeProvider typeProvider, DartObjectImpl rightOperand) {
+    if (type != rightOperand.type) {
+      String typeName = type.name;
+      if (typeName != "bool" &&
+          typeName != "double" &&
+          typeName != "int" &&
+          typeName != "num" &&
+          typeName != "String") {
+        return new DartObjectImpl(typeProvider.boolType, BoolState.TRUE_STATE);
+      }
+    }
+    return new DartObjectImpl(typeProvider.boolType,
+        _state.equalEqual(rightOperand._state).logicalNot());
+  }
+
+  /**
+   * Return the result of converting this object to a 'String'. The
+   * [typeProvider] is the type provider used to find known types.
+   *
+   * Throws an [EvaluationException] if the object cannot be converted to a
+   * 'String'.
+   */
+  DartObjectImpl performToString(TypeProvider typeProvider) {
+    InterfaceType stringType = typeProvider.stringType;
+    if (identical(type, stringType)) {
+      return this;
+    }
+    return new DartObjectImpl(stringType, _state.convertToString());
+  }
+
+  /**
+   * Return the result of invoking the '%' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl remainder(
+      TypeProvider typeProvider, DartObjectImpl rightOperand) {
+    InstanceState result = _state.remainder(rightOperand._state);
+    if (result is IntState) {
+      return new DartObjectImpl(typeProvider.intType, result);
+    } else if (result is DoubleState) {
+      return new DartObjectImpl(typeProvider.doubleType, result);
+    } else if (result is NumState) {
+      return new DartObjectImpl(typeProvider.numType, result);
+    }
+    // We should never get here.
+    throw new IllegalStateException(
+        "remainder returned a ${result.runtimeType}");
+  }
+
+  /**
+   * Return the result of invoking the '&lt;&lt;' operator on this object with
+   * the [rightOperand]. The [typeProvider] is the type provider used to find
+   * known types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl shiftLeft(
+          TypeProvider typeProvider, DartObjectImpl rightOperand) =>
+      new DartObjectImpl(
+          typeProvider.intType, _state.shiftLeft(rightOperand._state));
+
+  /**
+   * Return the result of invoking the '&gt;&gt;' operator on this object with
+   * the [rightOperand]. The [typeProvider] is the type provider used to find
+   * known types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl shiftRight(
+          TypeProvider typeProvider, DartObjectImpl rightOperand) =>
+      new DartObjectImpl(
+          typeProvider.intType, _state.shiftRight(rightOperand._state));
+
+  /**
+   * Return the result of invoking the 'length' getter on this object. The
+   * [typeProvider] is the type provider used to find known types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl stringLength(TypeProvider typeProvider) =>
+      new DartObjectImpl(typeProvider.intType, _state.stringLength());
+
+  /**
+   * Return the result of invoking the '*' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl times(TypeProvider typeProvider, DartObjectImpl rightOperand) {
+    InstanceState result = _state.times(rightOperand._state);
+    if (result is IntState) {
+      return new DartObjectImpl(typeProvider.intType, result);
+    } else if (result is DoubleState) {
+      return new DartObjectImpl(typeProvider.doubleType, result);
+    } else if (result is NumState) {
+      return new DartObjectImpl(typeProvider.numType, result);
+    }
+    // We should never get here.
+    throw new IllegalStateException("times returned a ${result.runtimeType}");
+  }
+
+  @override
+  String toString() => "${type.displayName} ($_state)";
+}
+
+/**
+ * An object used to provide access to the values of variables that have been
+ * defined on the command line using the `-D` option.
+ */
+class DeclaredVariables {
+  /**
+   * A table mapping the names of declared variables to their values.
+   */
+  HashMap<String, String> _declaredVariables = new HashMap<String, String>();
+
+  /**
+   * Define a variable with the given [name] to have the given [value].
+   */
+  void define(String name, String value) {
+    _declaredVariables[name] = value;
+  }
+
+  /**
+   * Return the value of the variable with the given [name] interpreted as a
+   * 'boolean' value. If the variable is not defined (or [name] is `null`), a
+   * DartObject representing "unknown" is returned. If the value cannot be
+   * parsed as a boolean, a DartObject representing 'null' is returned. The
+   * [typeProvider] is the type provider used to find the type 'bool'.
+   */
+  DartObject getBool(TypeProvider typeProvider, String name) {
+    String value = _declaredVariables[name];
+    if (value == null) {
+      return new DartObjectImpl(typeProvider.boolType, BoolState.UNKNOWN_VALUE);
+    }
+    if (value == "true") {
+      return new DartObjectImpl(typeProvider.boolType, BoolState.TRUE_STATE);
+    } else if (value == "false") {
+      return new DartObjectImpl(typeProvider.boolType, BoolState.FALSE_STATE);
+    }
+    return new DartObjectImpl(typeProvider.nullType, NullState.NULL_STATE);
+  }
+
+  /**
+   * Return the value of the variable with the given [name] interpreted as an
+   * integer value. If the variable is not defined (or [name] is `null`), a
+   * DartObject representing "unknown" is returned. If the value cannot be
+   * parsed as an integer, a DartObject representing 'null' is returned.
+   */
+  DartObject getInt(TypeProvider typeProvider, String name) {
+    String value = _declaredVariables[name];
+    if (value == null) {
+      return new DartObjectImpl(typeProvider.intType, IntState.UNKNOWN_VALUE);
+    }
+    int bigInteger;
+    try {
+      bigInteger = int.parse(value);
+    } on FormatException {
+      return new DartObjectImpl(typeProvider.nullType, NullState.NULL_STATE);
+    }
+    return new DartObjectImpl(typeProvider.intType, new IntState(bigInteger));
+  }
+
+  /**
+   * Return the value of the variable with the given [name] interpreted as a
+   * String value, or `null` if the variable is not defined. Return the value of
+   * the variable with the given name interpreted as a String value. If the
+   * variable is not defined (or [name] is `null`), a DartObject representing
+   * "unknown" is returned. The [typeProvider] is the type provider used to find
+   * the type 'String'.
+   */
+  DartObject getString(TypeProvider typeProvider, String name) {
+    String value = _declaredVariables[name];
+    if (value == null) {
+      return new DartObjectImpl(
+          typeProvider.stringType, StringState.UNKNOWN_VALUE);
+    }
+    return new DartObjectImpl(typeProvider.stringType, new StringState(value));
+  }
+}
+
+/**
+ * The state of an object representing a double.
+ */
+class DoubleState extends NumState {
+  /**
+   * A state that can be used to represent a double whose value is not known.
+   */
+  static DoubleState UNKNOWN_VALUE = new DoubleState(null);
+
+  /**
+   * The value of this instance.
+   */
+  final double value;
+
+  /**
+   * Initialize a newly created state to represent a double with the given
+   * [value].
+   */
+  DoubleState(this.value);
+
+  @override
+  bool get hasExactValue => true;
+
+  @override
+  int get hashCode => value == null ? 0 : value.hashCode;
+
+  @override
+  bool get isBoolNumStringOrNull => true;
+
+  @override
+  bool get isUnknown => value == null;
+
+  @override
+  String get typeName => "double";
+
+  @override
+  bool operator ==(Object object) =>
+      object is DoubleState && (value == object.value);
+
+  @override
+  NumState add(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      }
+      return new DoubleState(value + rightValue.toDouble());
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      }
+      return new DoubleState(value + rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  StringState convertToString() {
+    if (value == null) {
+      return StringState.UNKNOWN_VALUE;
+    }
+    return new StringState(value.toString());
+  }
+
+  @override
+  NumState divide(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      }
+      return new DoubleState(value / rightValue.toDouble());
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      }
+      return new DoubleState(value / rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  BoolState equalEqual(InstanceState rightOperand) {
+    assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState greaterThan(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (value == null) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value > rightValue.toDouble());
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value > rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  BoolState greaterThanOrEqual(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (value == null) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value >= rightValue.toDouble());
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value >= rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  IntState integerDivide(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (value == null) {
+      return IntState.UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return IntState.UNKNOWN_VALUE;
+      }
+      double result = value / rightValue.toDouble();
+      return new IntState(result.toInt());
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return IntState.UNKNOWN_VALUE;
+      }
+      double result = value / rightValue;
+      return new IntState(result.toInt());
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return IntState.UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
+    if (value == null) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value == rightValue);
+    } else if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value == rightValue.toDouble());
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    return BoolState.FALSE_STATE;
+  }
+
+  @override
+  BoolState lessThan(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (value == null) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value < rightValue.toDouble());
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value < rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  BoolState lessThanOrEqual(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (value == null) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value <= rightValue.toDouble());
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value <= rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  NumState minus(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      }
+      return new DoubleState(value - rightValue.toDouble());
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      }
+      return new DoubleState(value - rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  NumState negated() {
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    return new DoubleState(-(value));
+  }
+
+  @override
+  NumState remainder(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      }
+      return new DoubleState(value % rightValue.toDouble());
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      }
+      return new DoubleState(value % rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  NumState times(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      }
+      return new DoubleState(value * rightValue.toDouble());
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      }
+      return new DoubleState(value * rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  String toString() => value == null ? "-unknown-" : value.toString();
+}
+
+/**
+ * The state of an object representing a Dart object for which there is no type
+ * information.
+ */
+class DynamicState extends InstanceState {
+  /**
+   * The unique instance of this class.
+   */
+  static DynamicState DYNAMIC_STATE = new DynamicState();
+
+  @override
+  bool get isBool => true;
+
+  @override
+  bool get isBoolNumStringOrNull => true;
+
+  @override
+  String get typeName => "dynamic";
+
+  @override
+  NumState add(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    return _unknownNum(rightOperand);
+  }
+
+  @override
+  IntState bitAnd(InstanceState rightOperand) {
+    assertIntOrNull(rightOperand);
+    return IntState.UNKNOWN_VALUE;
+  }
+
+  @override
+  IntState bitNot() => IntState.UNKNOWN_VALUE;
+
+  @override
+  IntState bitOr(InstanceState rightOperand) {
+    assertIntOrNull(rightOperand);
+    return IntState.UNKNOWN_VALUE;
+  }
+
+  @override
+  IntState bitXor(InstanceState rightOperand) {
+    assertIntOrNull(rightOperand);
+    return IntState.UNKNOWN_VALUE;
+  }
+
+  @override
+  StringState concatenate(InstanceState rightOperand) {
+    assertString(rightOperand);
+    return StringState.UNKNOWN_VALUE;
+  }
+
+  @override
+  BoolState convertToBool() => BoolState.UNKNOWN_VALUE;
+
+  @override
+  StringState convertToString() => StringState.UNKNOWN_VALUE;
+
+  @override
+  NumState divide(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    return _unknownNum(rightOperand);
+  }
+
+  @override
+  BoolState equalEqual(InstanceState rightOperand) {
+    assertBoolNumStringOrNull(rightOperand);
+    return BoolState.UNKNOWN_VALUE;
+  }
+
+  @override
+  BoolState greaterThan(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    return BoolState.UNKNOWN_VALUE;
+  }
+
+  @override
+  BoolState greaterThanOrEqual(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    return BoolState.UNKNOWN_VALUE;
+  }
+
+  @override
+  IntState integerDivide(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    return IntState.UNKNOWN_VALUE;
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
+    return BoolState.UNKNOWN_VALUE;
+  }
+
+  @override
+  BoolState lessThan(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    return BoolState.UNKNOWN_VALUE;
+  }
+
+  @override
+  BoolState lessThanOrEqual(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    return BoolState.UNKNOWN_VALUE;
+  }
+
+  @override
+  BoolState logicalAnd(InstanceState rightOperand) {
+    assertBool(rightOperand);
+    return BoolState.UNKNOWN_VALUE;
+  }
+
+  @override
+  BoolState logicalNot() => BoolState.UNKNOWN_VALUE;
+
+  @override
+  BoolState logicalOr(InstanceState rightOperand) {
+    assertBool(rightOperand);
+    return rightOperand.convertToBool();
+  }
+
+  @override
+  NumState minus(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    return _unknownNum(rightOperand);
+  }
+
+  @override
+  NumState negated() => NumState.UNKNOWN_VALUE;
+
+  @override
+  NumState remainder(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    return _unknownNum(rightOperand);
+  }
+
+  @override
+  IntState shiftLeft(InstanceState rightOperand) {
+    assertIntOrNull(rightOperand);
+    return IntState.UNKNOWN_VALUE;
+  }
+
+  @override
+  IntState shiftRight(InstanceState rightOperand) {
+    assertIntOrNull(rightOperand);
+    return IntState.UNKNOWN_VALUE;
+  }
+
+  @override
+  NumState times(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    return _unknownNum(rightOperand);
+  }
+
+  /**
+   * Return an object representing an unknown numeric value whose type is based
+   * on the type of the [rightOperand].
+   */
+  NumState _unknownNum(InstanceState rightOperand) {
+    if (rightOperand is IntState) {
+      return IntState.UNKNOWN_VALUE;
+    } else if (rightOperand is DoubleState) {
+      return DoubleState.UNKNOWN_VALUE;
+    }
+    return NumState.UNKNOWN_VALUE;
+  }
+}
+
+/**
+ * A run-time exception that would be thrown during the evaluation of Dart code.
+ */
+class EvaluationException extends JavaException {
+  /**
+   * The error code associated with the exception.
+   */
+  final ErrorCode errorCode;
+
+  /**
+   * Initialize a newly created exception to have the given [errorCode].
+   */
+  EvaluationException(this.errorCode);
+}
+
+/**
+ * The result of attempting to evaluate an expression.
+ */
+class EvaluationResult {
+  /**
+   * The value of the expression.
+   */
+  final DartObject value;
+
+  /**
+   * The errors that should be reported for the expression(s) that were
+   * evaluated.
+   */
+  final List<AnalysisError> _errors;
+
+  /**
+   * Initialize a newly created result object with the given [value] and set of
+   * [_errors]. Clients should use one of the factory methods: [forErrors] and
+   * [forValue].
+   */
+  EvaluationResult(this.value, this._errors);
+
+  /**
+   * Return a list containing the errors that should be reported for the
+   * expression(s) that were evaluated. If there are no such errors, the list
+   * will be empty. The list can be empty even if the expression is not a valid
+   * compile time constant if the errors would have been reported by other parts
+   * of the analysis engine.
+   */
+  List<AnalysisError> get errors =>
+      _errors == null ? AnalysisError.NO_ERRORS : _errors;
+
+  /**
+   * Return `true` if the expression is a compile-time constant expression that
+   * would not throw an exception when evaluated.
+   */
+  bool get isValid => _errors == null;
+
+  /**
+   * Return an evaluation result representing the result of evaluating an
+   * expression that is not a compile-time constant because of the given
+   * [errors].
+   */
+  static EvaluationResult forErrors(List<AnalysisError> errors) =>
+      new EvaluationResult(null, errors);
+
+  /**
+   * Return an evaluation result representing the result of evaluating an
+   * expression that is a compile-time constant that evaluates to the given
+   * [value].
+   */
+  static EvaluationResult forValue(DartObject value) =>
+      new EvaluationResult(value, null);
+}
+
+/**
+ * The result of attempting to evaluate a expression.
+ */
+class EvaluationResultImpl {
+  /**
+   * The errors encountered while trying to evaluate the compile time constant.
+   * These errors may or may not have prevented the expression from being a
+   * valid compile time constant.
+   */
+  List<AnalysisError> _errors;
+
+  /**
+   * The value of the expression, or `null` if the value couldn't be computed
+   * due to errors.
+   */
+  final DartObjectImpl value;
+
+  EvaluationResultImpl(this.value, [List<AnalysisError> errors]) {
+    this._errors = errors == null ? <AnalysisError>[] : errors;
+  }
+
+  @deprecated // Use new EvaluationResultImpl(value)
+  EvaluationResultImpl.con1(this.value) {
+    this._errors = new List<AnalysisError>(0);
+  }
+
+  @deprecated // Use new EvaluationResultImpl(value, errors)
+  EvaluationResultImpl.con2(this.value, List<AnalysisError> this._errors);
+
+  List<AnalysisError> get errors => _errors;
+
+  bool equalValues(TypeProvider typeProvider, EvaluationResultImpl result) {
+    if (this.value != null) {
+      if (result.value == null) {
+        return false;
+      }
+      return value == result.value;
+    } else {
+      return false;
+    }
+  }
+
+  @override
+  String toString() {
+    if (value == null) {
+      return "error";
+    }
+    return value.toString();
+  }
+}
+
+/**
+ * The state of an object representing a function.
+ */
+class FunctionState extends InstanceState {
+  /**
+   * The element representing the function being modeled.
+   */
+  final ExecutableElement _element;
+
+  /**
+   * Initialize a newly created state to represent the function with the given
+   * [element].
+   */
+  FunctionState(this._element);
+
+  @override
+  int get hashCode => _element == null ? 0 : _element.hashCode;
+
+  @override
+  String get typeName => "Function";
+
+  @override
+  bool operator ==(Object object) =>
+      object is FunctionState && (_element == object._element);
+
+  @override
+  StringState convertToString() {
+    if (_element == null) {
+      return StringState.UNKNOWN_VALUE;
+    }
+    return new StringState(_element.name);
+  }
+
+  @override
+  BoolState equalEqual(InstanceState rightOperand) {
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
+    if (_element == null) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    if (rightOperand is FunctionState) {
+      ExecutableElement rightElement = rightOperand._element;
+      if (rightElement == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(_element == rightElement);
+    } else if (rightOperand is DynamicState) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    return BoolState.FALSE_STATE;
+  }
+
+  @override
+  String toString() => _element == null ? "-unknown-" : _element.name;
+}
+
+/**
+ * The state of an object representing a Dart object for which there is no more
+ * specific state.
+ */
+class GenericState extends InstanceState {
+  /**
+   * Pseudo-field that we use to represent fields in the superclass.
+   */
+  static String SUPERCLASS_FIELD = "(super)";
+
+  /**
+   * A state that can be used to represent an object whose state is not known.
+   */
+  static GenericState UNKNOWN_VALUE =
+      new GenericState(new HashMap<String, DartObjectImpl>());
+
+  /**
+   * The values of the fields of this instance.
+   */
+  final HashMap<String, DartObjectImpl> _fieldMap;
+
+  /**
+   * Initialize a newly created state to represent a newly created object. The
+   * [fieldMap] contains the values of the fields of the instance.
+   */
+  GenericState(this._fieldMap);
+
+  @override
+  HashMap<String, DartObjectImpl> get fields => _fieldMap;
+
+  @override
+  int get hashCode {
+    int hashCode = 0;
+    for (DartObjectImpl value in _fieldMap.values) {
+      hashCode += value.hashCode;
+    }
+    return hashCode;
+  }
+
+  @override
+  bool get isUnknown => identical(this, UNKNOWN_VALUE);
+
+  @override
+  String get typeName => "user defined type";
+
+  @override
+  bool operator ==(Object object) {
+    if (object is! GenericState) {
+      return false;
+    }
+    GenericState state = object as GenericState;
+    HashSet<String> otherFields =
+        new HashSet<String>.from(state._fieldMap.keys.toSet());
+    for (String fieldName in _fieldMap.keys.toSet()) {
+      if (_fieldMap[fieldName] != state._fieldMap[fieldName]) {
+        return false;
+      }
+      otherFields.remove(fieldName);
+    }
+    for (String fieldName in otherFields) {
+      if (state._fieldMap[fieldName] != _fieldMap[fieldName]) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  @override
+  StringState convertToString() => StringState.UNKNOWN_VALUE;
+
+  @override
+  BoolState equalEqual(InstanceState rightOperand) {
+    assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
+    if (rightOperand is DynamicState) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    return BoolState.from(this == rightOperand);
+  }
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    List<String> fieldNames = _fieldMap.keys.toList();
+    fieldNames.sort();
+    bool first = true;
+    for (String fieldName in fieldNames) {
+      if (first) {
+        first = false;
+      } else {
+        buffer.write('; ');
+      }
+      buffer.write(fieldName);
+      buffer.write(' = ');
+      buffer.write(_fieldMap[fieldName]);
+    }
+    return buffer.toString();
+  }
+}
+
+/**
+ * The state of an object representing a Dart object.
+ */
+abstract class InstanceState {
+  /**
+   * If this represents a generic dart object, return a map from its field names
+   * to their values. Otherwise return null.
+   */
+  HashMap<String, DartObjectImpl> get fields => null;
+
+  /**
+   * Return `true` if this object's value can be represented exactly.
+   */
+  bool get hasExactValue => false;
+
+  /**
+   * Return `true` if this object represents an object whose type is 'bool'.
+   */
+  bool get isBool => false;
+
+  /**
+   * Return `true` if this object represents an object whose type is either
+   * 'bool', 'num', 'String', or 'Null'.
+   */
+  bool get isBoolNumStringOrNull => false;
+
+  /**
+   * Return `true` if this object represents an unknown value.
+   */
+  bool get isUnknown => false;
+
+  /**
+   * Return the name of the type of this value.
+   */
+  String get typeName;
+
+  /**
+   * Return this object's value if it can be represented exactly, or `null` if
+   * either the value cannot be represented exactly or if the value is `null`.
+   * Clients should use [hasExactValue] to distinguish between these two cases.
+   */
+  Object get value => null;
+
+  /**
+   * Return the result of invoking the '+' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  InstanceState add(InstanceState rightOperand) {
+    if (this is StringState && rightOperand is StringState) {
+      return concatenate(rightOperand);
+    }
+    assertNumOrNull(this);
+    assertNumOrNull(rightOperand);
+    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+  }
+
+  /**
+   * Throw an exception if the given [state] does not represent a boolean value.
+   */
+  void assertBool(InstanceState state) {
+    if (!(state is BoolState || state is DynamicState)) {
+      throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL);
+    }
+  }
+
+  /**
+   * Throw an exception if the given [state] does not represent a boolean,
+   * numeric, string or null value.
+   */
+  void assertBoolNumStringOrNull(InstanceState state) {
+    if (!(state is BoolState ||
+        state is DoubleState ||
+        state is IntState ||
+        state is NumState ||
+        state is StringState ||
+        state is NullState ||
+        state is DynamicState)) {
+      throw new EvaluationException(
+          CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING);
+    }
+  }
+
+  /**
+   * Throw an exception if the given [state] does not represent an integer or
+   * null value.
+   */
+  void assertIntOrNull(InstanceState state) {
+    if (!(state is IntState ||
+        state is NumState ||
+        state is NullState ||
+        state is DynamicState)) {
+      throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
+    }
+  }
+
+  /**
+   * Throw an exception if the given [state] does not represent a boolean,
+   * numeric, string or null value.
+   */
+  void assertNumOrNull(InstanceState state) {
+    if (!(state is DoubleState ||
+        state is IntState ||
+        state is NumState ||
+        state is NullState ||
+        state is DynamicState)) {
+      throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
+    }
+  }
+
+  /**
+   * Throw an exception if the given [state] does not represent a String value.
+   */
+  void assertString(InstanceState state) {
+    if (!(state is StringState || state is DynamicState)) {
+      throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL);
+    }
+  }
+
+  /**
+   * Return the result of invoking the '&' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  IntState bitAnd(InstanceState rightOperand) {
+    assertIntOrNull(this);
+    assertIntOrNull(rightOperand);
+    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+  }
+
+  /**
+   * Return the result of invoking the '~' operator on this object.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  IntState bitNot() {
+    assertIntOrNull(this);
+    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+  }
+
+  /**
+   * Return the result of invoking the '|' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  IntState bitOr(InstanceState rightOperand) {
+    assertIntOrNull(this);
+    assertIntOrNull(rightOperand);
+    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+  }
+
+  /**
+   * Return the result of invoking the '^' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  IntState bitXor(InstanceState rightOperand) {
+    assertIntOrNull(this);
+    assertIntOrNull(rightOperand);
+    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+  }
+
+  /**
+   * Return the result of invoking the ' ' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  StringState concatenate(InstanceState rightOperand) {
+    assertString(rightOperand);
+    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+  }
+
+  /**
+   * Return the result of applying boolean conversion to this object.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  BoolState convertToBool() => BoolState.FALSE_STATE;
+
+  /**
+   * Return the result of converting this object to a String.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  StringState convertToString();
+
+  /**
+   * Return the result of invoking the '/' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  NumState divide(InstanceState rightOperand) {
+    assertNumOrNull(this);
+    assertNumOrNull(rightOperand);
+    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+  }
+
+  /**
+   * Return the result of invoking the '==' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  BoolState equalEqual(InstanceState rightOperand);
+
+  /**
+   * Return the result of invoking the '&gt;' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  BoolState greaterThan(InstanceState rightOperand) {
+    assertNumOrNull(this);
+    assertNumOrNull(rightOperand);
+    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+  }
+
+  /**
+   * Return the result of invoking the '&gt;=' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  BoolState greaterThanOrEqual(InstanceState rightOperand) {
+    assertNumOrNull(this);
+    assertNumOrNull(rightOperand);
+    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+  }
+
+  /**
+   * Return the result of invoking the '~/' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  IntState integerDivide(InstanceState rightOperand) {
+    assertNumOrNull(this);
+    assertNumOrNull(rightOperand);
+    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+  }
+
+  /**
+   * Return the result of invoking the identical function on this object with
+   * the [rightOperand].
+   */
+  BoolState isIdentical(InstanceState rightOperand);
+
+  /**
+   * Return the result of invoking the '&lt;' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  BoolState lessThan(InstanceState rightOperand) {
+    assertNumOrNull(this);
+    assertNumOrNull(rightOperand);
+    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+  }
+
+  /**
+   * Return the result of invoking the '&lt;=' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  BoolState lessThanOrEqual(InstanceState rightOperand) {
+    assertNumOrNull(this);
+    assertNumOrNull(rightOperand);
+    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+  }
+
+  /**
+   * Return the result of invoking the '&&' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  BoolState logicalAnd(InstanceState rightOperand) {
+    assertBool(this);
+    assertBool(rightOperand);
+    return BoolState.FALSE_STATE;
+  }
+
+  /**
+   * Return the result of invoking the '!' operator on this object.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  BoolState logicalNot() {
+    assertBool(this);
+    return BoolState.TRUE_STATE;
+  }
+
+  /**
+   * Return the result of invoking the '||' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  BoolState logicalOr(InstanceState rightOperand) {
+    assertBool(this);
+    assertBool(rightOperand);
+    return rightOperand.convertToBool();
+  }
+
+  /**
+   * Return the result of invoking the '-' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  NumState minus(InstanceState rightOperand) {
+    assertNumOrNull(this);
+    assertNumOrNull(rightOperand);
+    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+  }
+
+  /**
+   * Return the result of invoking the '-' operator on this object.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  NumState negated() {
+    assertNumOrNull(this);
+    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+  }
+
+  /**
+   * Return the result of invoking the '%' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  NumState remainder(InstanceState rightOperand) {
+    assertNumOrNull(this);
+    assertNumOrNull(rightOperand);
+    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+  }
+
+  /**
+   * Return the result of invoking the '&lt;&lt;' operator on this object with
+   * the [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  IntState shiftLeft(InstanceState rightOperand) {
+    assertIntOrNull(this);
+    assertIntOrNull(rightOperand);
+    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+  }
+
+  /**
+   * Return the result of invoking the '&gt;&gt;' operator on this object with
+   * the [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  IntState shiftRight(InstanceState rightOperand) {
+    assertIntOrNull(this);
+    assertIntOrNull(rightOperand);
+    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+  }
+
+  /**
+   * Return the result of invoking the 'length' getter on this object.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  IntState stringLength() {
+    assertString(this);
+    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+  }
+
+  /**
+   * Return the result of invoking the '*' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  NumState times(InstanceState rightOperand) {
+    assertNumOrNull(this);
+    assertNumOrNull(rightOperand);
+    throw new EvaluationException(CompileTimeErrorCode.INVALID_CONSTANT);
+  }
+}
+
+/**
+ * The state of an object representing an int.
+ */
+class IntState extends NumState {
+  /**
+   * A state that can be used to represent an int whose value is not known.
+   */
+  static IntState UNKNOWN_VALUE = new IntState(null);
+
+  /**
+   * The value of this instance.
+   */
+  final int value;
+
+  /**
+   * Initialize a newly created state to represent an int with the given
+   * [value].
+   */
+  IntState(this.value);
+
+  @override
+  bool get hasExactValue => true;
+
+  @override
+  int get hashCode => value == null ? 0 : value.hashCode;
+
+  @override
+  bool get isBoolNumStringOrNull => true;
+
+  @override
+  bool get isUnknown => value == null;
+
+  @override
+  String get typeName => "int";
+
+  @override
+  bool operator ==(Object object) =>
+      object is IntState && (value == object.value);
+
+  @override
+  NumState add(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (value == null) {
+      if (rightOperand is DoubleState) {
+        return DoubleState.UNKNOWN_VALUE;
+      }
+      return UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      }
+      return new IntState(value + rightValue);
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return DoubleState.UNKNOWN_VALUE;
+      }
+      return new DoubleState(value.toDouble() + rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  IntState bitAnd(InstanceState rightOperand) {
+    assertIntOrNull(rightOperand);
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      }
+      return new IntState(value & rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  IntState bitNot() {
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    return new IntState(~value);
+  }
+
+  @override
+  IntState bitOr(InstanceState rightOperand) {
+    assertIntOrNull(rightOperand);
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      }
+      return new IntState(value | rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  IntState bitXor(InstanceState rightOperand) {
+    assertIntOrNull(rightOperand);
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      }
+      return new IntState(value ^ rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  StringState convertToString() {
+    if (value == null) {
+      return StringState.UNKNOWN_VALUE;
+    }
+    return new StringState(value.toString());
+  }
+
+  @override
+  NumState divide(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (value == null) {
+      return DoubleState.UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return DoubleState.UNKNOWN_VALUE;
+      } else {
+        return new DoubleState(value.toDouble() / rightValue.toDouble());
+      }
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return DoubleState.UNKNOWN_VALUE;
+      }
+      return new DoubleState(value.toDouble() / rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return DoubleState.UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  BoolState equalEqual(InstanceState rightOperand) {
+    assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState greaterThan(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (value == null) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value.compareTo(rightValue) > 0);
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value.toDouble() > rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  BoolState greaterThanOrEqual(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (value == null) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value.compareTo(rightValue) >= 0);
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value.toDouble() >= rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  IntState integerDivide(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      } else if (rightValue == 0) {
+        throw new EvaluationException(
+            CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE);
+      }
+      return new IntState(value ~/ rightValue);
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      }
+      double result = value.toDouble() / rightValue;
+      return new IntState(result.toInt());
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
+    if (value == null) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value == rightValue);
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(rightValue == value.toDouble());
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    return BoolState.FALSE_STATE;
+  }
+
+  @override
+  BoolState lessThan(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (value == null) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value.compareTo(rightValue) < 0);
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value.toDouble() < rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  BoolState lessThanOrEqual(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (value == null) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value.compareTo(rightValue) <= 0);
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value.toDouble() <= rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  NumState minus(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (value == null) {
+      if (rightOperand is DoubleState) {
+        return DoubleState.UNKNOWN_VALUE;
+      }
+      return UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      }
+      return new IntState(value - rightValue);
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return DoubleState.UNKNOWN_VALUE;
+      }
+      return new DoubleState(value.toDouble() - rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  NumState negated() {
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    return new IntState(-value);
+  }
+
+  @override
+  NumState remainder(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (value == null) {
+      if (rightOperand is DoubleState) {
+        return DoubleState.UNKNOWN_VALUE;
+      }
+      return UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      } else if (rightValue == 0) {
+        return new DoubleState(value.toDouble() % rightValue.toDouble());
+      }
+      return new IntState(value.remainder(rightValue));
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return DoubleState.UNKNOWN_VALUE;
+      }
+      return new DoubleState(value.toDouble() % rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  IntState shiftLeft(InstanceState rightOperand) {
+    assertIntOrNull(rightOperand);
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      } else if (rightValue.bitLength > 31) {
+        return UNKNOWN_VALUE;
+      }
+      return new IntState(value << rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  IntState shiftRight(InstanceState rightOperand) {
+    assertIntOrNull(rightOperand);
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      } else if (rightValue.bitLength > 31) {
+        return UNKNOWN_VALUE;
+      }
+      return new IntState(value >> rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  NumState times(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (value == null) {
+      if (rightOperand is DoubleState) {
+        return DoubleState.UNKNOWN_VALUE;
+      }
+      return UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      }
+      return new IntState(value * rightValue);
+    } else if (rightOperand is DoubleState) {
+      double rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return DoubleState.UNKNOWN_VALUE;
+      }
+      return new DoubleState(value.toDouble() * rightValue);
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  String toString() => value == null ? "-unknown-" : value.toString();
+}
+
+/**
+ * The state of an object representing a list.
+ */
+class ListState extends InstanceState {
+  /**
+   * The elements of the list.
+   */
+  final List<DartObjectImpl> _elements;
+
+  /**
+   * Initialize a newly created state to represent a list with the given
+   * [elements].
+   */
+  ListState(this._elements);
+
+  @override
+  bool get hasExactValue {
+    int count = _elements.length;
+    for (int i = 0; i < count; i++) {
+      if (!_elements[i].hasExactValue) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  @override
+  int get hashCode {
+    int value = 0;
+    int count = _elements.length;
+    for (int i = 0; i < count; i++) {
+      value = (value << 3) ^ _elements[i].hashCode;
+    }
+    return value;
+  }
+
+  @override
+  String get typeName => "List";
+
+  @override
+  List<Object> get value {
+    int count = _elements.length;
+    List<Object> result = new List<Object>(count);
+    for (int i = 0; i < count; i++) {
+      DartObjectImpl element = _elements[i];
+      if (!element.hasExactValue) {
+        return null;
+      }
+      result[i] = element.value;
+    }
+    return result;
+  }
+
+  @override
+  bool operator ==(Object object) {
+    if (object is! ListState) {
+      return false;
+    }
+    List<DartObjectImpl> otherElements = (object as ListState)._elements;
+    int count = _elements.length;
+    if (otherElements.length != count) {
+      return false;
+    } else if (count == 0) {
+      return true;
+    }
+    for (int i = 0; i < count; i++) {
+      if (_elements[i] != otherElements[i]) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  @override
+  StringState convertToString() => StringState.UNKNOWN_VALUE;
+
+  @override
+  BoolState equalEqual(InstanceState rightOperand) {
+    assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
+    if (rightOperand is DynamicState) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    return BoolState.from(this == rightOperand);
+  }
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write('[');
+    bool first = true;
+    _elements.forEach((DartObjectImpl element) {
+      if (first) {
+        first = false;
+      } else {
+        buffer.write(', ');
+      }
+      buffer.write(element);
+    });
+    buffer.write(']');
+    return buffer.toString();
+  }
+}
+
+/**
+ * The state of an object representing a map.
+ */
+class MapState extends InstanceState {
+  /**
+   * The entries in the map.
+   */
+  final HashMap<DartObjectImpl, DartObjectImpl> _entries;
+
+  /**
+   * Initialize a newly created state to represent a map with the given
+   * [entries].
+   */
+  MapState(this._entries);
+
+  @override
+  bool get hasExactValue {
+    for (DartObjectImpl key in _entries.keys) {
+      if (!key.hasExactValue || !_entries[key].hasExactValue) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  @override
+  int get hashCode {
+    int value = 0;
+    for (DartObjectImpl key in _entries.keys.toSet()) {
+      value = (value << 3) ^ key.hashCode;
+    }
+    return value;
+  }
+
+  @override
+  String get typeName => "Map";
+
+  @override
+  Map<Object, Object> get value {
+    HashMap<Object, Object> result = new HashMap<Object, Object>();
+    for (DartObjectImpl key in _entries.keys) {
+      DartObjectImpl value = _entries[key];
+      if (!key.hasExactValue || !value.hasExactValue) {
+        return null;
+      }
+      result[key.value] = value.value;
+    }
+    return result;
+  }
+
+  @override
+  bool operator ==(Object object) {
+    if (object is! MapState) {
+      return false;
+    }
+    HashMap<DartObjectImpl, DartObjectImpl> otherElements =
+        (object as MapState)._entries;
+    int count = _entries.length;
+    if (otherElements.length != count) {
+      return false;
+    } else if (count == 0) {
+      return true;
+    }
+    for (DartObjectImpl key in _entries.keys) {
+      DartObjectImpl value = _entries[key];
+      DartObjectImpl otherValue = otherElements[key];
+      if (value != otherValue) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  @override
+  StringState convertToString() => StringState.UNKNOWN_VALUE;
+
+  @override
+  BoolState equalEqual(InstanceState rightOperand) {
+    assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
+    if (rightOperand is DynamicState) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    return BoolState.from(this == rightOperand);
+  }
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write('{');
+    bool first = true;
+    _entries.forEach((DartObjectImpl key, DartObjectImpl value) {
+      if (first) {
+        first = false;
+      } else {
+        buffer.write(', ');
+      }
+      buffer.write(key);
+      buffer.write(' = ');
+      buffer.write(value);
+    });
+    buffer.write('}');
+    return buffer.toString();
+  }
+}
+
+/**
+ * The state of an object representing the value 'null'.
+ */
+class NullState extends InstanceState {
+  /**
+   * An instance representing the boolean value 'null'.
+   */
+  static NullState NULL_STATE = new NullState();
+
+  @override
+  bool get hasExactValue => true;
+
+  @override
+  int get hashCode => 0;
+
+  @override
+  bool get isBoolNumStringOrNull => true;
+
+  @override
+  String get typeName => "Null";
+
+  @override
+  bool operator ==(Object object) => object is NullState;
+
+  @override
+  BoolState convertToBool() {
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  StringState convertToString() => new StringState("null");
+
+  @override
+  BoolState equalEqual(InstanceState rightOperand) {
+    assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
+    if (rightOperand is DynamicState) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    return BoolState.from(rightOperand is NullState);
+  }
+
+  @override
+  BoolState logicalNot() {
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
+  String toString() => "null";
+}
+
+/**
+ * The state of an object representing a number of an unknown type (a 'num').
+ */
+class NumState extends InstanceState {
+  /**
+   * A state that can be used to represent a number whose value is not known.
+   */
+  static NumState UNKNOWN_VALUE = new NumState();
+
+  @override
+  int get hashCode => 7;
+
+  @override
+  bool get isBoolNumStringOrNull => true;
+
+  @override
+  bool get isUnknown => identical(this, UNKNOWN_VALUE);
+
+  @override
+  String get typeName => "num";
+
+  @override
+  bool operator ==(Object object) => object is NumState;
+
+  @override
+  NumState add(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    return UNKNOWN_VALUE;
+  }
+
+  @override
+  StringState convertToString() => StringState.UNKNOWN_VALUE;
+
+  @override
+  NumState divide(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    return DoubleState.UNKNOWN_VALUE;
+  }
+
+  @override
+  BoolState equalEqual(InstanceState rightOperand) {
+    assertBoolNumStringOrNull(rightOperand);
+    return BoolState.UNKNOWN_VALUE;
+  }
+
+  @override
+  BoolState greaterThan(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    return BoolState.UNKNOWN_VALUE;
+  }
+
+  @override
+  BoolState greaterThanOrEqual(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    return BoolState.UNKNOWN_VALUE;
+  }
+
+  @override
+  IntState integerDivide(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return IntState.UNKNOWN_VALUE;
+      } else if (rightValue == 0) {
+        throw new EvaluationException(
+            CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE);
+      }
+    } else if (rightOperand is DynamicState) {
+      return IntState.UNKNOWN_VALUE;
+    }
+    return IntState.UNKNOWN_VALUE;
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
+    return BoolState.UNKNOWN_VALUE;
+  }
+
+  @override
+  BoolState lessThan(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    return BoolState.UNKNOWN_VALUE;
+  }
+
+  @override
+  BoolState lessThanOrEqual(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    return BoolState.UNKNOWN_VALUE;
+  }
+
+  @override
+  NumState minus(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    return UNKNOWN_VALUE;
+  }
+
+  @override
+  NumState negated() => UNKNOWN_VALUE;
+
+  @override
+  NumState remainder(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    return UNKNOWN_VALUE;
+  }
+
+  @override
+  NumState times(InstanceState rightOperand) {
+    assertNumOrNull(rightOperand);
+    return UNKNOWN_VALUE;
+  }
+
+  @override
+  String toString() => "-unknown-";
+}
+
+/**
+ * An object used to add reference information for a given variable to the
+ * bi-directional mapping used to order the evaluation of constants.
+ */
+class ReferenceFinder extends RecursiveAstVisitor<Object> {
+  /**
+   * The callback which should be used to report any dependencies that were
+   * found.
+   */
+  final ReferenceFinderCallback _callback;
+
+  /**
+   * Initialize a newly created reference finder to find references from a given
+   * variable to other variables and to add those references to the given graph.
+   * The [_callback] will be invoked for every dependency found.
+   */
+  ReferenceFinder(this._callback);
+
+  @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    if (node.isConst) {
+      ConstructorElement constructor =
+          ConstantEvaluationEngine._getConstructorBase(node.staticElement);
+      if (constructor != null) {
+        _callback(constructor);
+      }
+    }
+    return super.visitInstanceCreationExpression(node);
+  }
+
+  @override
+  Object visitLabel(Label node) {
+    // We are visiting the "label" part of a named expression in a function
+    // call (presumably a constructor call), e.g. "const C(label: ...)".  We
+    // don't want to visit the SimpleIdentifier for the label because that's a
+    // reference to a function parameter that needs to be filled in; it's not a
+    // constant whose value we depend on.
+    return null;
+  }
+
+  @override
+  Object visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    super.visitRedirectingConstructorInvocation(node);
+    ConstructorElement target =
+        ConstantEvaluationEngine._getConstructorBase(node.staticElement);
+    if (target != null) {
+      _callback(target);
+    }
+    return null;
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    if (element is PropertyAccessorElement) {
+      element = (element as PropertyAccessorElement).variable;
+    }
+    if (element is VariableElement) {
+      _callback(element);
+    }
+    return null;
+  }
+
+  @override
+  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    super.visitSuperConstructorInvocation(node);
+    ConstructorElement constructor =
+        ConstantEvaluationEngine._getConstructorBase(node.staticElement);
+    if (constructor != null) {
+      _callback(constructor);
+    }
+    return null;
+  }
+}
+
+/**
+ * The state of an object representing a string.
+ */
+class StringState extends InstanceState {
+  /**
+   * A state that can be used to represent a double whose value is not known.
+   */
+  static StringState UNKNOWN_VALUE = new StringState(null);
+
+  /**
+   * The value of this instance.
+   */
+  final String value;
+
+  /**
+   * Initialize a newly created state to represent the given [value].
+   */
+  StringState(this.value);
+
+  @override
+  bool get hasExactValue => true;
+
+  @override
+  int get hashCode => value == null ? 0 : value.hashCode;
+
+  @override
+  bool get isBoolNumStringOrNull => true;
+
+  @override
+  bool get isUnknown => value == null;
+
+  @override
+  String get typeName => "String";
+
+  @override
+  bool operator ==(Object object) =>
+      object is StringState && (value == object.value);
+
+  @override
+  StringState concatenate(InstanceState rightOperand) {
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    if (rightOperand is StringState) {
+      String rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      }
+      return new StringState("$value$rightValue");
+    } else if (rightOperand is DynamicState) {
+      return UNKNOWN_VALUE;
+    }
+    return super.concatenate(rightOperand);
+  }
+
+  @override
+  StringState convertToString() => this;
+
+  @override
+  BoolState equalEqual(InstanceState rightOperand) {
+    assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
+    if (value == null) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    if (rightOperand is StringState) {
+      String rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value == rightValue);
+    } else if (rightOperand is DynamicState) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    return BoolState.FALSE_STATE;
+  }
+
+  @override
+  IntState stringLength() {
+    if (value == null) {
+      return IntState.UNKNOWN_VALUE;
+    }
+    return new IntState(value.length);
+  }
+
+  @override
+  String toString() => value == null ? "-unknown-" : "'$value'";
+}
+
+/**
+ * The state of an object representing a symbol.
+ */
+class SymbolState extends InstanceState {
+  /**
+   * The value of this instance.
+   */
+  final String value;
+
+  /**
+   * Initialize a newly created state to represent the given [value].
+   */
+  SymbolState(this.value);
+
+  @override
+  bool get hasExactValue => true;
+
+  @override
+  int get hashCode => value == null ? 0 : value.hashCode;
+
+  @override
+  String get typeName => "Symbol";
+
+  @override
+  bool operator ==(Object object) =>
+      object is SymbolState && (value == object.value);
+
+  @override
+  StringState convertToString() {
+    if (value == null) {
+      return StringState.UNKNOWN_VALUE;
+    }
+    return new StringState(value);
+  }
+
+  @override
+  BoolState equalEqual(InstanceState rightOperand) {
+    assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
+    if (value == null) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    if (rightOperand is SymbolState) {
+      String rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(value == rightValue);
+    } else if (rightOperand is DynamicState) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    return BoolState.FALSE_STATE;
+  }
+
+  @override
+  String toString() => value == null ? "-unknown-" : "#$value";
+}
+
+/**
+ * The state of an object representing a type.
+ */
+class TypeState extends InstanceState {
+  /**
+   * The element representing the type being modeled.
+   */
+  final Element _element;
+
+  /**
+   * Initialize a newly created state to represent the given [value].
+   */
+  TypeState(this._element);
+
+  @override
+  int get hashCode => _element == null ? 0 : _element.hashCode;
+
+  @override
+  String get typeName => "Type";
+
+  @override
+  Element get value => _element;
+
+  @override
+  bool operator ==(Object object) =>
+      object is TypeState && (_element == object._element);
+
+  @override
+  StringState convertToString() {
+    if (_element == null) {
+      return StringState.UNKNOWN_VALUE;
+    }
+    return new StringState(_element.name);
+  }
+
+  @override
+  BoolState equalEqual(InstanceState rightOperand) {
+    assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
+    if (_element == null) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    if (rightOperand is TypeState) {
+      Element rightElement = rightOperand._element;
+      if (rightElement == null) {
+        return BoolState.UNKNOWN_VALUE;
+      }
+      return BoolState.from(_element == rightElement);
+    } else if (rightOperand is DynamicState) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    return BoolState.FALSE_STATE;
+  }
+
+  @override
+  String toString() => _element == null ? "-unknown-" : _element.name;
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/element.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/element.dart
new file mode 100644
index 0000000..45f52bf
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/element.dart
@@ -0,0 +1,10798 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.element;
+
+import 'dart:collection';
+
+import 'package:analyzer/src/generated/utilities_general.dart';
+import 'package:analyzer/src/task/dart.dart';
+import 'package:analyzer/task/model.dart'
+    show AnalysisTarget, ConstantEvaluationTarget;
+
+import 'ast.dart';
+import 'constant.dart' show EvaluationResultImpl;
+import 'engine.dart' show AnalysisContext, AnalysisEngine, AnalysisException;
+import 'html.dart' show XmlAttributeNode, XmlTagNode;
+import 'java_core.dart';
+import 'java_engine.dart';
+import 'resolver.dart';
+import 'scanner.dart' show Keyword;
+import 'sdk.dart' show DartSdk;
+import 'source.dart';
+import 'utilities_collection.dart';
+import 'utilities_dart.dart';
+
+/**
+ * For AST nodes that could be in both the getter and setter contexts
+ * ([IndexExpression]s and [SimpleIdentifier]s), the additional resolved
+ * elements are stored in the AST node, in an [AuxiliaryElements]. Because
+ * resolved elements are either statically resolved or resolved using propagated
+ * type information, this class is a wrapper for a pair of [ExecutableElement]s,
+ * not just a single [ExecutableElement].
+ */
+class AuxiliaryElements {
+  /**
+   * The element based on propagated type information, or `null` if the AST
+   * structure has not been resolved or if the node could not be resolved.
+   */
+  final ExecutableElement propagatedElement;
+
+  /**
+   * The element based on static type information, or `null` if the AST
+   * structure has not been resolved or if the node could not be resolved.
+   */
+  final ExecutableElement staticElement;
+
+  /**
+   * Initialize a newly created pair to have both the [staticElement] and the
+   * [propagatedElement].
+   */
+  AuxiliaryElements(this.staticElement, this.propagatedElement);
+}
+
+/**
+ * A [Type] that represents the type 'bottom'.
+ */
+class BottomTypeImpl extends TypeImpl {
+  /**
+   * The unique instance of this class.
+   */
+  static BottomTypeImpl _INSTANCE = new BottomTypeImpl._();
+
+  /**
+   * Return the unique instance of this class.
+   */
+  static BottomTypeImpl get instance => _INSTANCE;
+
+  /**
+   * Prevent the creation of instances of this class.
+   */
+  BottomTypeImpl._() : super(null, "<bottom>");
+
+  @override
+  int get hashCode => 0;
+
+  @override
+  bool get isBottom => true;
+
+  @override
+  bool operator ==(Object object) => identical(object, this);
+
+  @override
+  bool isMoreSpecificThan(DartType type,
+          [bool withDynamic = false, Set<Element> visitedElements]) =>
+      true;
+
+  @override
+  bool isSubtypeOf(DartType type) => true;
+
+  @override
+  bool isSupertypeOf(DartType type) => false;
+
+  @override
+  TypeImpl pruned(List<FunctionTypeAliasElement> prune) => this;
+
+  @override
+  BottomTypeImpl substitute2(
+          List<DartType> argumentTypes, List<DartType> parameterTypes,
+          [List<FunctionTypeAliasElement> prune]) =>
+      this;
+}
+
+/**
+ * Type created internally if a circular reference is ever detected.  Behaves
+ * like `dynamic`, except that when converted to a string it is displayed as
+ * `...`.
+ */
+class CircularTypeImpl extends DynamicTypeImpl {
+  CircularTypeImpl() : super._circular();
+
+  @override
+  int get hashCode => 1;
+
+  @override
+  bool operator ==(Object object) => object is CircularTypeImpl;
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    buffer.write('...');
+  }
+
+  @override
+  TypeImpl pruned(List<FunctionTypeAliasElement> prune) => this;
+}
+
+/**
+ * An element that represents a class.
+ */
+abstract class ClassElement implements TypeDefiningElement {
+  /**
+   * An empty list of class elements.
+   */
+  static const List<ClassElement> EMPTY_LIST = const <ClassElement>[];
+
+  /**
+   * Return a list containing all of the accessors (getters and setters)
+   * declared in this class.
+   */
+  List<PropertyAccessorElement> get accessors;
+
+  /**
+   * Return a list containing all the supertypes defined for this class and its
+   * supertypes. This includes superclasses, mixins and interfaces.
+   */
+  List<InterfaceType> get allSupertypes;
+
+  /**
+   * Return a list containing all of the constructors declared in this class.
+   */
+  List<ConstructorElement> get constructors;
+
+  /**
+   * Return a list containing all of the fields declared in this class.
+   */
+  List<FieldElement> get fields;
+
+  /**
+   * Return `true` if this class or its superclass declares a non-final instance
+   * field.
+   */
+  bool get hasNonFinalField;
+
+  /**
+   * Return `true` if this class has reference to super (so, for example, cannot
+   * be used as a mixin).
+   */
+  bool get hasReferenceToSuper;
+
+  /**
+   * Return `true` if this class declares a static member.
+   */
+  bool get hasStaticMember;
+
+  /**
+   * Return a list containing all of the interfaces that are implemented by this
+   * class.
+   *
+   * <b>Note:</b> Because the element model represents the state of the code, it
+   * is possible for it to be semantically invalid. In particular, it is not
+   * safe to assume that the inheritance structure of a class does not contain a
+   * cycle. Clients that traverse the inheritance structure must explicitly
+   * guard against infinite loops.
+   */
+  List<InterfaceType> get interfaces;
+
+  /**
+   * Return `true` if this class is abstract. A class is abstract if it has an
+   * explicit `abstract` modifier. Note, that this definition of <i>abstract</i>
+   * is different from <i>has unimplemented members</i>.
+   */
+  bool get isAbstract;
+
+  /**
+   * Return `true` if this class is defined by an enum declaration.
+   */
+  bool get isEnum;
+
+  /**
+   * Return `true` if this class is a mixin application.  A class is a mixin
+   * application if it was declared using the syntax "class A = B with C;".
+   */
+  bool get isMixinApplication;
+
+  /**
+   * Return `true` if this class [isProxy], or if it inherits the proxy
+   * annotation from a supertype.
+   */
+  bool get isOrInheritsProxy;
+
+  /**
+   * Return `true` if this element has an annotation of the form '@proxy'.
+   */
+  bool get isProxy;
+
+  /**
+   * Return `true` if this class is a mixin application.  Deprecated--please
+   * use [isMixinApplication] instead.
+   */
+  @deprecated
+  bool get isTypedef;
+
+  /**
+   * Return `true` if this class can validly be used as a mixin when defining
+   * another class. The behavior of this method is defined by the Dart Language
+   * Specification in section 9:
+   * <blockquote>
+   * It is a compile-time error if a declared or derived mixin refers to super.
+   * It is a compile-time error if a declared or derived mixin explicitly
+   * declares a constructor. It is a compile-time error if a mixin is derived
+   * from a class whose superclass is not Object.
+   * </blockquote>
+   */
+  bool get isValidMixin;
+
+  /**
+   * Return a list containing all of the methods declared in this class.
+   */
+  List<MethodElement> get methods;
+
+  /**
+   * Return a list containing all of the mixins that are applied to the class
+   * being extended in order to derive the superclass of this class.
+   *
+   * <b>Note:</b> Because the element model represents the state of the code, it
+   * is possible for it to be semantically invalid. In particular, it is not
+   * safe to assume that the inheritance structure of a class does not contain a
+   * cycle. Clients that traverse the inheritance structure must explicitly
+   * guard against infinite loops.
+   */
+  List<InterfaceType> get mixins;
+
+  /**
+   * Return the superclass of this class, or `null` if the class represents the
+   * class 'Object'. All other classes will have a non-`null` superclass. If the
+   * superclass was not explicitly declared then the implicit superclass
+   * 'Object' will be returned.
+   *
+   * <b>Note:</b> Because the element model represents the state of the code, it
+   * is possible for it to be semantically invalid. In particular, it is not
+   * safe to assume that the inheritance structure of a class does not contain a
+   * cycle. Clients that traverse the inheritance structure must explicitly
+   * guard against infinite loops.
+   */
+  InterfaceType get supertype;
+
+  @override
+  InterfaceType get type;
+
+  /**
+   * Return a list containing all of the type parameters declared for this
+   * class.
+   */
+  List<TypeParameterElement> get typeParameters;
+
+  /**
+   * Return the unnamed constructor declared in this class, or `null` if this
+   * class does not declare an unnamed constructor but does declare named
+   * constructors. The returned constructor will be synthetic if this class does
+   * not declare any constructors, in which case it will represent the default
+   * constructor for the class.
+   */
+  ConstructorElement get unnamedConstructor;
+
+  /**
+   * Return the resolved [ClassDeclaration] or [EnumDeclaration] node that
+   * declares this [ClassElement].
+   *
+   * This method is expensive, because resolved AST might be evicted from cache,
+   * so parsing and resolving will be performed.
+   */
+  @override
+  NamedCompilationUnitMember computeNode();
+
+  /**
+   * Return the field (synthetic or explicit) defined in this class that has the
+   * given [name], or `null` if this class does not define a field with the
+   * given name.
+   */
+  FieldElement getField(String name);
+
+  /**
+   * Return the element representing the getter with the given [name] that is
+   * declared in this class, or `null` if this class does not declare a getter
+   * with the given name.
+   */
+  PropertyAccessorElement getGetter(String name);
+
+  /**
+   * Return the element representing the method with the given [name] that is
+   * declared in this class, or `null` if this class does not declare a method
+   * with the given name.
+   */
+  MethodElement getMethod(String name);
+
+  /**
+   * Return the named constructor declared in this class with the given [name],
+   * or `null` if this class does not declare a named constructor with the given
+   * name.
+   */
+  ConstructorElement getNamedConstructor(String name);
+
+  /**
+   * Return the element representing the setter with the given [name] that is
+   * declared in this class, or `null` if this class does not declare a setter
+   * with the given name.
+   */
+  PropertyAccessorElement getSetter(String name);
+
+  /**
+   * Determine whether the given [constructor], which exists in the superclass
+   * of this class, is accessible to constructors in this class.
+   */
+  bool isSuperConstructorAccessible(ConstructorElement constructor);
+
+  /**
+   * Return the element representing the method that results from looking up the
+   * given [methodName] in this class with respect to the given [library],
+   * ignoring abstract methods, or `null` if the look up fails. The behavior of
+   * this method is defined by the Dart Language Specification in section
+   * 16.15.1:
+   * <blockquote>
+   * The result of looking up method <i>m</i> in class <i>C</i> with respect to
+   * library <i>L</i> is: If <i>C</i> declares an instance method named <i>m</i>
+   * that is accessible to <i>L</i>, then that method is the result of the
+   * lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result
+   * of the lookup is the result of looking up method <i>m</i> in <i>S</i> with
+   * respect to <i>L</i>. Otherwise, we say that the lookup has failed.
+   * </blockquote>
+   */
+  MethodElement lookUpConcreteMethod(String methodName, LibraryElement library);
+
+  /**
+   * Return the element representing the getter that results from looking up the
+   * given [getterName] in this class with respect to the given [library], or
+   * `null` if the look up fails. The behavior of this method is defined by the
+   * Dart Language Specification in section 16.15.2:
+   * <blockquote>
+   * The result of looking up getter (respectively setter) <i>m</i> in class
+   * <i>C</i> with respect to library <i>L</i> is: If <i>C</i> declares an
+   * instance getter (respectively setter) named <i>m</i> that is accessible to
+   * <i>L</i>, then that getter (respectively setter) is the result of the
+   * lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result
+   * of the lookup is the result of looking up getter (respectively setter)
+   * <i>m</i> in <i>S</i> with respect to <i>L</i>. Otherwise, we say that the
+   * lookup has failed.
+   * </blockquote>
+   */
+  PropertyAccessorElement lookUpGetter(
+      String getterName, LibraryElement library);
+
+  /**
+   * Return the element representing the getter that results from looking up the
+   * given [getterName] in the superclass of this class with respect to the
+   * given [library], ignoring abstract getters, or `null` if the look up fails.
+   * The behavior of this method is defined by the Dart Language Specification
+   * in section 16.15.2:
+   * <blockquote>
+   * The result of looking up getter (respectively setter) <i>m</i> in class
+   * <i>C</i> with respect to library <i>L</i> is: If <i>C</i> declares an
+   * instance getter (respectively setter) named <i>m</i> that is accessible to
+   * <i>L</i>, then that getter (respectively setter) is the result of the
+   * lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result
+   * of the lookup is the result of looking up getter (respectively setter)
+   * <i>m</i> in <i>S</i> with respect to <i>L</i>. Otherwise, we say that the
+   * lookup has failed.
+   * </blockquote>
+   */
+  PropertyAccessorElement lookUpInheritedConcreteGetter(
+      String getterName, LibraryElement library);
+
+  /**
+   * Return the element representing the method that results from looking up the
+   * given [methodName] in the superclass of this class with respect to the
+   * given [library], ignoring abstract methods, or `null` if the look up fails.
+   * The behavior of this method is defined by the Dart Language Specification
+   * in section 16.15.1:
+   * <blockquote>
+   * The result of looking up method <i>m</i> in class <i>C</i> with respect to
+   * library <i>L</i> is:  If <i>C</i> declares an instance method named
+   * <i>m</i> that is accessible to <i>L</i>, then that method is the result of
+   * the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the
+   * result of the lookup is the result of looking up method <i>m</i> in
+   * <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
+   * failed.
+   * </blockquote>
+   */
+  MethodElement lookUpInheritedConcreteMethod(
+      String methodName, LibraryElement library);
+
+  /**
+   * Return the element representing the setter that results from looking up the
+   * given [setterName] in the superclass of this class with respect to the
+   * given [library], ignoring abstract setters, or `null` if the look up fails.
+   * The behavior of this method is defined by the Dart Language Specification
+   * in section 16.15.2:
+   * <blockquote>
+   * The result of looking up getter (respectively setter) <i>m</i> in class
+   * <i>C</i> with respect to library <i>L</i> is:  If <i>C</i> declares an
+   * instance getter (respectively setter) named <i>m</i> that is accessible to
+   * <i>L</i>, then that getter (respectively setter) is the result of the
+   * lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result
+   * of the lookup is the result of looking up getter (respectively setter)
+   * <i>m</i> in <i>S</i> with respect to <i>L</i>. Otherwise, we say that the
+   * lookup has failed.
+   * </blockquote>
+   */
+  PropertyAccessorElement lookUpInheritedConcreteSetter(
+      String setterName, LibraryElement library);
+
+  /**
+   * Return the element representing the method that results from looking up the
+   * given [methodName] in the superclass of this class with respect to the
+   * given [library], or `null` if the look up fails. The behavior of this
+   * method is defined by the Dart Language Specification in section 16.15.1:
+   * <blockquote>
+   * The result of looking up method <i>m</i> in class <i>C</i> with respect to
+   * library <i>L</i> is:  If <i>C</i> declares an instance method named
+   * <i>m</i> that is accessible to <i>L</i>, then that method is the result of
+   * the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the
+   * result of the lookup is the result of looking up method <i>m</i> in
+   * <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
+   * failed.
+   * </blockquote>
+   */
+  MethodElement lookUpInheritedMethod(
+      String methodName, LibraryElement library);
+
+  /**
+   * Return the element representing the method that results from looking up the
+   * given [methodName] in this class with respect to the given [library], or
+   * `null` if the look up fails. The behavior of this method is defined by the
+   * Dart Language Specification in section 16.15.1:
+   * <blockquote>
+   * The result of looking up method <i>m</i> in class <i>C</i> with respect to
+   * library <i>L</i> is:  If <i>C</i> declares an instance method named
+   * <i>m</i> that is accessible to <i>L</i>, then that method is the result of
+   * the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the
+   * result of the lookup is the result of looking up method <i>m</i> in
+   * <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
+   * failed.
+   * </blockquote>
+   */
+  MethodElement lookUpMethod(String methodName, LibraryElement library);
+
+  /**
+   * Return the element representing the setter that results from looking up the
+   * given [setterName] in this class with respect to the given [library], or
+   * `null` if the look up fails. The behavior of this method is defined by the
+   * Dart Language Specification in section 16.15.2:
+   * <blockquote>
+   * The result of looking up getter (respectively setter) <i>m</i> in class
+   * <i>C</i> with respect to library <i>L</i> is: If <i>C</i> declares an
+   * instance getter (respectively setter) named <i>m</i> that is accessible to
+   * <i>L</i>, then that getter (respectively setter) is the result of the
+   * lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result
+   * of the lookup is the result of looking up getter (respectively setter)
+   * <i>m</i> in <i>S</i> with respect to <i>L</i>. Otherwise, we say that the
+   * lookup has failed.
+   * </blockquote>
+   */
+  PropertyAccessorElement lookUpSetter(
+      String setterName, LibraryElement library);
+}
+
+/**
+ * A concrete implementation of a [ClassElement].
+ */
+class ClassElementImpl extends ElementImpl implements ClassElement {
+  /**
+   * An empty list of class elements.
+   */
+  @deprecated // Use ClassElement.EMPTY_LIST
+  static const List<ClassElement> EMPTY_ARRAY = const <ClassElement>[];
+
+  /**
+   * A list containing all of the accessors (getters and setters) contained in
+   * this class.
+   */
+  List<PropertyAccessorElement> _accessors = PropertyAccessorElement.EMPTY_LIST;
+
+  /**
+   * For classes which are not mixin applications, a list containing all of the
+   * constructors contained in this class, or `null` if the list of
+   * constructors has not yet been built.
+   *
+   * For classes which are mixin applications, the list of constructors is
+   * computed on the fly by the [constructors] getter, and this field is
+   * `null`.
+   */
+  List<ConstructorElement> _constructors;
+
+  /**
+   * A list containing all of the fields contained in this class.
+   */
+  List<FieldElement> _fields = FieldElement.EMPTY_LIST;
+
+  /**
+   * A list containing all of the mixins that are applied to the class being
+   * extended in order to derive the superclass of this class.
+   */
+  List<InterfaceType> mixins = InterfaceType.EMPTY_LIST;
+
+  /**
+   * A list containing all of the interfaces that are implemented by this class.
+   */
+  List<InterfaceType> interfaces = InterfaceType.EMPTY_LIST;
+
+  /**
+   * A list containing all of the methods contained in this class.
+   */
+  List<MethodElement> _methods = MethodElement.EMPTY_LIST;
+
+  /**
+   * The superclass of the class, or `null` if the class does not have an
+   * explicit superclass.
+   */
+  InterfaceType supertype;
+
+  /**
+   * The type defined by the class.
+   */
+  InterfaceType type;
+
+  /**
+   * A list containing all of the type parameters defined for this class.
+   */
+  List<TypeParameterElement> _typeParameters = TypeParameterElement.EMPTY_LIST;
+
+  /**
+   * The [SourceRange] of the `with` clause, `null` if there is no one.
+   */
+  SourceRange withClauseRange;
+
+  /**
+   * A flag indicating whether the types associated with the instance members of
+   * this class have been inferred.
+   */
+  bool hasBeenInferred = false;
+
+  /**
+   * Initialize a newly created class element to have the given [name] at the
+   * given [offset] in the file that contains the declaration of this element.
+   */
+  ClassElementImpl(String name, int offset) : super(name, offset);
+
+  /**
+   * Initialize a newly created class element to have the given [name].
+   */
+  ClassElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  /**
+   * Set whether this class is abstract.
+   */
+  void set abstract(bool isAbstract) {
+    setModifier(Modifier.ABSTRACT, isAbstract);
+  }
+
+  @override
+  List<PropertyAccessorElement> get accessors => _accessors;
+
+  /**
+   * Set the accessors contained in this class to the given [accessors].
+   */
+  void set accessors(List<PropertyAccessorElement> accessors) {
+    for (PropertyAccessorElement accessor in accessors) {
+      (accessor as PropertyAccessorElementImpl).enclosingElement = this;
+    }
+    this._accessors = accessors;
+  }
+
+  @override
+  List<InterfaceType> get allSupertypes {
+    List<InterfaceType> list = new List<InterfaceType>();
+    _collectAllSupertypes(list);
+    return list;
+  }
+
+  @override
+  List<ConstructorElement> get constructors {
+    if (!isMixinApplication) {
+      assert(_constructors != null);
+      return _constructors == null
+          ? ConstructorElement.EMPTY_LIST
+          : _constructors;
+    }
+
+    return _computeMixinAppConstructors();
+  }
+
+  /**
+   * Set the constructors contained in this class to the given [constructors].
+   *
+   * Should only be used for class elements that are not mixin applications.
+   */
+  void set constructors(List<ConstructorElement> constructors) {
+    assert(!isMixinApplication);
+    for (ConstructorElement constructor in constructors) {
+      (constructor as ConstructorElementImpl).enclosingElement = this;
+    }
+    this._constructors = constructors;
+  }
+
+  /**
+   * Return `true` if [CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS] should
+   * be reported for this class.
+   */
+  bool get doesMixinLackConstructors {
+    if (!isMixinApplication && mixins.isEmpty) {
+      // This class is not a mixin application and it doesn't have a "with"
+      // clause, so CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS is
+      // inapplicable.
+      return false;
+    }
+    if (supertype == null) {
+      // Should never happen, since Object is the only class that has no
+      // supertype, and it should have been caught by the test above.
+      assert(false);
+      return false;
+    }
+    // Find the nearest class in the supertype chain that is not a mixin
+    // application.
+    ClassElement nearestNonMixinClass = supertype.element;
+    if (nearestNonMixinClass.isMixinApplication) {
+      // Use a list to keep track of the classes we've seen, so that we won't
+      // go into an infinite loop in the event of a non-trivial loop in the
+      // class hierarchy.
+      List<ClassElementImpl> classesSeen = <ClassElementImpl>[this];
+      while (nearestNonMixinClass.isMixinApplication) {
+        if (classesSeen.contains(nearestNonMixinClass)) {
+          // Loop in the class hierarchy (which is reported elsewhere).  Don't
+          // confuse the user with further errors.
+          return false;
+        }
+        classesSeen.add(nearestNonMixinClass);
+        if (nearestNonMixinClass.supertype == null) {
+          // Should never happen, since Object is the only class that has no
+          // supertype, and it is not a mixin application.
+          assert(false);
+          return false;
+        }
+        nearestNonMixinClass = nearestNonMixinClass.supertype.element;
+      }
+    }
+    return !nearestNonMixinClass.constructors.any(isSuperConstructorAccessible);
+  }
+
+  /**
+   * Set whether this class is defined by an enum declaration.
+   */
+  void set enum2(bool isEnum) {
+    setModifier(Modifier.ENUM, isEnum);
+  }
+
+  @override
+  List<FieldElement> get fields => _fields;
+
+  /**
+   * Set the fields contained in this class to the given [fields].
+   */
+  void set fields(List<FieldElement> fields) {
+    for (FieldElement field in fields) {
+      (field as FieldElementImpl).enclosingElement = this;
+    }
+    this._fields = fields;
+  }
+
+  @override
+  bool get hasNonFinalField {
+    List<ClassElement> classesToVisit = new List<ClassElement>();
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+    classesToVisit.add(this);
+    while (!classesToVisit.isEmpty) {
+      ClassElement currentElement = classesToVisit.removeAt(0);
+      if (visitedClasses.add(currentElement)) {
+        // check fields
+        for (FieldElement field in currentElement.fields) {
+          if (!field.isFinal &&
+              !field.isConst &&
+              !field.isStatic &&
+              !field.isSynthetic) {
+            return true;
+          }
+        }
+        // check mixins
+        for (InterfaceType mixinType in currentElement.mixins) {
+          ClassElement mixinElement = mixinType.element;
+          classesToVisit.add(mixinElement);
+        }
+        // check super
+        InterfaceType supertype = currentElement.supertype;
+        if (supertype != null) {
+          ClassElement superElement = supertype.element;
+          if (superElement != null) {
+            classesToVisit.add(superElement);
+          }
+        }
+      }
+    }
+    // not found
+    return false;
+  }
+
+  @override
+  bool get hasReferenceToSuper => hasModifier(Modifier.REFERENCES_SUPER);
+
+  /**
+   * Set whether this class references 'super'.
+   */
+  void set hasReferenceToSuper(bool isReferencedSuper) {
+    setModifier(Modifier.REFERENCES_SUPER, isReferencedSuper);
+  }
+
+  @override
+  bool get hasStaticMember {
+    for (MethodElement method in _methods) {
+      if (method.isStatic) {
+        return true;
+      }
+    }
+    for (PropertyAccessorElement accessor in _accessors) {
+      if (accessor.isStatic) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  bool get isAbstract => hasModifier(Modifier.ABSTRACT);
+
+  @override
+  bool get isEnum => hasModifier(Modifier.ENUM);
+
+  @override
+  bool get isMixinApplication => hasModifier(Modifier.MIXIN_APPLICATION);
+
+  @override
+  bool get isOrInheritsProxy =>
+      _safeIsOrInheritsProxy(this, new HashSet<ClassElement>());
+
+  @override
+  bool get isProxy {
+    for (ElementAnnotation annotation in metadata) {
+      if (annotation.isProxy) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  @deprecated
+  bool get isTypedef => isMixinApplication;
+
+  @override
+  bool get isValidMixin => hasModifier(Modifier.MIXIN);
+
+  @override
+  ElementKind get kind => ElementKind.CLASS;
+
+  @override
+  List<MethodElement> get methods => _methods;
+
+  /**
+   * Set the methods contained in this class to the given [methods].
+   */
+  void set methods(List<MethodElement> methods) {
+    for (MethodElement method in methods) {
+      (method as MethodElementImpl).enclosingElement = this;
+    }
+    this._methods = methods;
+  }
+
+  /**
+   * Set whether this class is a mixin application.
+   */
+  void set mixinApplication(bool isMixinApplication) {
+    setModifier(Modifier.MIXIN_APPLICATION, isMixinApplication);
+  }
+
+  @override
+  List<TypeParameterElement> get typeParameters => _typeParameters;
+
+  /**
+   * Set the type parameters defined for this class to the given
+   * [typeParameters].
+   */
+  void set typeParameters(List<TypeParameterElement> typeParameters) {
+    for (TypeParameterElement typeParameter in typeParameters) {
+      (typeParameter as TypeParameterElementImpl).enclosingElement = this;
+    }
+    this._typeParameters = typeParameters;
+  }
+
+  @override
+  ConstructorElement get unnamedConstructor {
+    for (ConstructorElement element in constructors) {
+      String name = element.displayName;
+      if (name == null || name.isEmpty) {
+        return element;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Set whether this class is a valid mixin.
+   */
+  void set validMixin(bool isValidMixin) {
+    setModifier(Modifier.MIXIN, isValidMixin);
+  }
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitClassElement(this);
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    String name = displayName;
+    if (name == null) {
+      buffer.write("{unnamed class}");
+    } else {
+      buffer.write(name);
+    }
+    int variableCount = _typeParameters.length;
+    if (variableCount > 0) {
+      buffer.write("<");
+      for (int i = 0; i < variableCount; i++) {
+        if (i > 0) {
+          buffer.write(", ");
+        }
+        (_typeParameters[i] as TypeParameterElementImpl).appendTo(buffer);
+      }
+      buffer.write(">");
+    }
+  }
+
+  @override
+  NamedCompilationUnitMember computeNode() {
+    if (isEnum) {
+      return getNodeMatching((node) => node is EnumDeclaration);
+    } else {
+      return getNodeMatching(
+          (node) => node is ClassDeclaration || node is ClassTypeAlias);
+    }
+  }
+
+  @override
+  ElementImpl getChild(String identifier) {
+    //
+    // The casts in this method are safe because the set methods would have
+    // thrown a CCE if any of the elements in the arrays were not of the
+    // expected types.
+    //
+    for (PropertyAccessorElement accessor in _accessors) {
+      if ((accessor as PropertyAccessorElementImpl).identifier == identifier) {
+        return accessor as PropertyAccessorElementImpl;
+      }
+    }
+    for (ConstructorElement constructor in _constructors) {
+      if ((constructor as ConstructorElementImpl).identifier == identifier) {
+        return constructor as ConstructorElementImpl;
+      }
+    }
+    for (FieldElement field in _fields) {
+      if ((field as FieldElementImpl).identifier == identifier) {
+        return field as FieldElementImpl;
+      }
+    }
+    for (MethodElement method in _methods) {
+      if ((method as MethodElementImpl).identifier == identifier) {
+        return method as MethodElementImpl;
+      }
+    }
+    for (TypeParameterElement typeParameter in _typeParameters) {
+      if ((typeParameter as TypeParameterElementImpl).identifier ==
+          identifier) {
+        return typeParameter as TypeParameterElementImpl;
+      }
+    }
+    return null;
+  }
+
+  @override
+  FieldElement getField(String name) {
+    for (FieldElement fieldElement in _fields) {
+      if (name == fieldElement.name) {
+        return fieldElement;
+      }
+    }
+    return null;
+  }
+
+  @override
+  PropertyAccessorElement getGetter(String getterName) {
+    for (PropertyAccessorElement accessor in _accessors) {
+      if (accessor.isGetter && accessor.name == getterName) {
+        return accessor;
+      }
+    }
+    return null;
+  }
+
+  @override
+  MethodElement getMethod(String methodName) {
+    for (MethodElement method in _methods) {
+      if (method.name == methodName) {
+        return method;
+      }
+    }
+    return null;
+  }
+
+  @override
+  ConstructorElement getNamedConstructor(String name) {
+    for (ConstructorElement element in constructors) {
+      String elementName = element.name;
+      if (elementName != null && elementName == name) {
+        return element;
+      }
+    }
+    return null;
+  }
+
+  @override
+  PropertyAccessorElement getSetter(String setterName) {
+    // TODO (jwren) revisit- should we append '=' here or require clients to
+    // include it?
+    // Do we need the check for isSetter below?
+    if (!StringUtilities.endsWithChar(setterName, 0x3D)) {
+      setterName += '=';
+    }
+    for (PropertyAccessorElement accessor in _accessors) {
+      if (accessor.isSetter && accessor.name == setterName) {
+        return accessor;
+      }
+    }
+    return null;
+  }
+
+  @override
+  bool isSuperConstructorAccessible(ConstructorElement constructor) {
+    // If this class has no mixins, then all superclass constructors are
+    // accessible.
+    if (mixins.isEmpty) {
+      return true;
+    }
+    // Otherwise only constructors that lack optional parameters are
+    // accessible (see dartbug.com/19576).
+    for (ParameterElement parameter in constructor.parameters) {
+      if (parameter.parameterKind != ParameterKind.REQUIRED) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  @override
+  MethodElement lookUpConcreteMethod(
+          String methodName, LibraryElement library) =>
+      _internalLookUpConcreteMethod(methodName, library, true);
+
+  @override
+  PropertyAccessorElement lookUpGetter(
+          String getterName, LibraryElement library) =>
+      _internalLookUpGetter(getterName, library, true);
+
+  @override
+  PropertyAccessorElement lookUpInheritedConcreteGetter(
+          String getterName, LibraryElement library) =>
+      _internalLookUpConcreteGetter(getterName, library, false);
+
+  @override
+  MethodElement lookUpInheritedConcreteMethod(
+          String methodName, LibraryElement library) =>
+      _internalLookUpConcreteMethod(methodName, library, false);
+
+  @override
+  PropertyAccessorElement lookUpInheritedConcreteSetter(
+          String setterName, LibraryElement library) =>
+      _internalLookUpConcreteSetter(setterName, library, false);
+
+  @override
+  MethodElement lookUpInheritedMethod(
+          String methodName, LibraryElement library) =>
+      _internalLookUpMethod(methodName, library, false);
+
+  @override
+  MethodElement lookUpMethod(String methodName, LibraryElement library) =>
+      _internalLookUpMethod(methodName, library, true);
+
+  @override
+  PropertyAccessorElement lookUpSetter(
+          String setterName, LibraryElement library) =>
+      _internalLookUpSetter(setterName, library, true);
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChildren(_accessors, visitor);
+    safelyVisitChildren(_constructors, visitor);
+    safelyVisitChildren(_fields, visitor);
+    safelyVisitChildren(_methods, visitor);
+    safelyVisitChildren(_typeParameters, visitor);
+  }
+
+  void _collectAllSupertypes(List<InterfaceType> supertypes) {
+    List<InterfaceType> typesToVisit = new List<InterfaceType>();
+    List<ClassElement> visitedClasses = new List<ClassElement>();
+    typesToVisit.add(this.type);
+    while (!typesToVisit.isEmpty) {
+      InterfaceType currentType = typesToVisit.removeAt(0);
+      ClassElement currentElement = currentType.element;
+      if (!visitedClasses.contains(currentElement)) {
+        visitedClasses.add(currentElement);
+        if (!identical(currentType, this.type)) {
+          supertypes.add(currentType);
+        }
+        InterfaceType supertype = currentType.superclass;
+        if (supertype != null) {
+          typesToVisit.add(supertype);
+        }
+        for (InterfaceType type in currentElement.interfaces) {
+          typesToVisit.add(type);
+        }
+        for (InterfaceType type in currentElement.mixins) {
+          ClassElement element = type.element;
+          if (!visitedClasses.contains(element)) {
+            supertypes.add(type);
+          }
+        }
+      }
+    }
+  }
+
+  /**
+   * Compute a list of constructors for this class, which is a mixin
+   * application.  If specified, [visitedClasses] is a list of the other mixin
+   * application classes which have been visited on the way to reaching this
+   * one (this is used to detect circularities).
+   */
+  List<ConstructorElement> _computeMixinAppConstructors(
+      [List<ClassElementImpl> visitedClasses = null]) {
+    // First get the list of constructors of the superclass which need to be
+    // forwarded to this class.
+    Iterable<ConstructorElement> constructorsToForward;
+    if (supertype == null) {
+      // Shouldn't ever happen, since the only class with no supertype is
+      // Object, and it isn't a mixin application.  But for safety's sake just
+      // assume an empty list.
+      assert(false);
+      constructorsToForward = <ConstructorElement>[];
+    } else if (!supertype.element.isMixinApplication) {
+      List<ConstructorElement> superclassConstructors =
+          supertype.element.constructors;
+      // Filter out any constructors with optional parameters (see
+      // dartbug.com/15101).
+      constructorsToForward =
+          superclassConstructors.where(isSuperConstructorAccessible);
+    } else {
+      if (visitedClasses == null) {
+        visitedClasses = <ClassElementImpl>[this];
+      } else {
+        if (visitedClasses.contains(this)) {
+          // Loop in the class hierarchy.  Don't try to forward any
+          // constructors.
+          return <ConstructorElement>[];
+        }
+        visitedClasses.add(this);
+      }
+      try {
+        ClassElementImpl superclass = supertype.element;
+        constructorsToForward =
+            superclass._computeMixinAppConstructors(visitedClasses);
+      } finally {
+        visitedClasses.removeLast();
+      }
+    }
+
+    // Figure out the type parameter substitution we need to perform in order
+    // to produce constructors for this class.  We want to be robust in the
+    // face of errors, so drop any extra type arguments and fill in any missing
+    // ones with `dynamic`.
+    List<DartType> parameterTypes =
+        TypeParameterTypeImpl.getTypes(supertype.typeParameters);
+    List<DartType> argumentTypes = new List<DartType>.filled(
+        parameterTypes.length, DynamicTypeImpl.instance);
+    for (int i = 0; i < supertype.typeArguments.length; i++) {
+      if (i >= argumentTypes.length) {
+        break;
+      }
+      argumentTypes[i] = supertype.typeArguments[i];
+    }
+
+    // Now create an implicit constructor for every constructor found above,
+    // substituting type parameters as appropriate.
+    return constructorsToForward
+        .map((ConstructorElement superclassConstructor) {
+      ConstructorElementImpl implicitConstructor =
+          new ConstructorElementImpl(superclassConstructor.name, -1);
+      implicitConstructor.synthetic = true;
+      implicitConstructor.redirectedConstructor = superclassConstructor;
+      implicitConstructor.const2 = superclassConstructor.isConst;
+      implicitConstructor.returnType = type;
+      List<ParameterElement> superParameters = superclassConstructor.parameters;
+      int count = superParameters.length;
+      if (count > 0) {
+        List<ParameterElement> implicitParameters =
+            new List<ParameterElement>(count);
+        for (int i = 0; i < count; i++) {
+          ParameterElement superParameter = superParameters[i];
+          ParameterElementImpl implicitParameter =
+              new ParameterElementImpl(superParameter.name, -1);
+          implicitParameter.const3 = superParameter.isConst;
+          implicitParameter.final2 = superParameter.isFinal;
+          implicitParameter.parameterKind = superParameter.parameterKind;
+          implicitParameter.synthetic = true;
+          implicitParameter.type =
+              superParameter.type.substitute2(argumentTypes, parameterTypes);
+          implicitParameters[i] = implicitParameter;
+        }
+        implicitConstructor.parameters = implicitParameters;
+      }
+      FunctionTypeImpl constructorType =
+          new FunctionTypeImpl(implicitConstructor);
+      constructorType.typeArguments = type.typeArguments;
+      implicitConstructor.type = constructorType;
+      implicitConstructor.enclosingElement = this;
+      return implicitConstructor;
+    }).toList();
+  }
+
+  PropertyAccessorElement _internalLookUpConcreteGetter(
+      String getterName, LibraryElement library, bool includeThisClass) {
+    PropertyAccessorElement getter =
+        _internalLookUpGetter(getterName, library, includeThisClass);
+    while (getter != null && getter.isAbstract) {
+      Element definingClass = getter.enclosingElement;
+      if (definingClass is! ClassElementImpl) {
+        return null;
+      }
+      getter = (definingClass as ClassElementImpl)
+          ._internalLookUpGetter(getterName, library, false);
+    }
+    return getter;
+  }
+
+  MethodElement _internalLookUpConcreteMethod(
+      String methodName, LibraryElement library, bool includeThisClass) {
+    MethodElement method =
+        _internalLookUpMethod(methodName, library, includeThisClass);
+    while (method != null && method.isAbstract) {
+      ClassElement definingClass = method.enclosingElement;
+      if (definingClass == null) {
+        return null;
+      }
+      method = definingClass.lookUpInheritedMethod(methodName, library);
+    }
+    return method;
+  }
+
+  PropertyAccessorElement _internalLookUpConcreteSetter(
+      String setterName, LibraryElement library, bool includeThisClass) {
+    PropertyAccessorElement setter =
+        _internalLookUpSetter(setterName, library, includeThisClass);
+    while (setter != null && setter.isAbstract) {
+      Element definingClass = setter.enclosingElement;
+      if (definingClass is! ClassElementImpl) {
+        return null;
+      }
+      setter = (definingClass as ClassElementImpl)
+          ._internalLookUpSetter(setterName, library, false);
+    }
+    return setter;
+  }
+
+  PropertyAccessorElement _internalLookUpGetter(
+      String getterName, LibraryElement library, bool includeThisClass) {
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+    ClassElement currentElement = this;
+    if (includeThisClass) {
+      PropertyAccessorElement element = currentElement.getGetter(getterName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+    }
+    while (currentElement != null && visitedClasses.add(currentElement)) {
+      for (InterfaceType mixin in currentElement.mixins.reversed) {
+        ClassElement mixinElement = mixin.element;
+        if (mixinElement != null) {
+          PropertyAccessorElement element = mixinElement.getGetter(getterName);
+          if (element != null && element.isAccessibleIn(library)) {
+            return element;
+          }
+        }
+      }
+      InterfaceType supertype = currentElement.supertype;
+      if (supertype == null) {
+        return null;
+      }
+      currentElement = supertype.element;
+      PropertyAccessorElement element = currentElement.getGetter(getterName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+    }
+    return null;
+  }
+
+  MethodElement _internalLookUpMethod(
+      String methodName, LibraryElement library, bool includeThisClass) {
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+    ClassElement currentElement = this;
+    if (includeThisClass) {
+      MethodElement element = currentElement.getMethod(methodName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+    }
+    while (currentElement != null && visitedClasses.add(currentElement)) {
+      for (InterfaceType mixin in currentElement.mixins.reversed) {
+        ClassElement mixinElement = mixin.element;
+        if (mixinElement != null) {
+          MethodElement element = mixinElement.getMethod(methodName);
+          if (element != null && element.isAccessibleIn(library)) {
+            return element;
+          }
+        }
+      }
+      InterfaceType supertype = currentElement.supertype;
+      if (supertype == null) {
+        return null;
+      }
+      currentElement = supertype.element;
+      MethodElement element = currentElement.getMethod(methodName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+    }
+    return null;
+  }
+
+  PropertyAccessorElement _internalLookUpSetter(
+      String setterName, LibraryElement library, bool includeThisClass) {
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+    ClassElement currentElement = this;
+    if (includeThisClass) {
+      PropertyAccessorElement element = currentElement.getSetter(setterName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+    }
+    while (currentElement != null && visitedClasses.add(currentElement)) {
+      for (InterfaceType mixin in currentElement.mixins.reversed) {
+        ClassElement mixinElement = mixin.element;
+        if (mixinElement != null) {
+          PropertyAccessorElement element = mixinElement.getSetter(setterName);
+          if (element != null && element.isAccessibleIn(library)) {
+            return element;
+          }
+        }
+      }
+      InterfaceType supertype = currentElement.supertype;
+      if (supertype == null) {
+        return null;
+      }
+      currentElement = supertype.element;
+      PropertyAccessorElement element = currentElement.getSetter(setterName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+    }
+    return null;
+  }
+
+  bool _safeIsOrInheritsProxy(
+      ClassElement classElt, HashSet<ClassElement> visitedClassElts) {
+    if (visitedClassElts.contains(classElt)) {
+      return false;
+    }
+    visitedClassElts.add(classElt);
+    if (classElt.isProxy) {
+      return true;
+    } else if (classElt.supertype != null &&
+        _safeIsOrInheritsProxy(classElt.supertype.element, visitedClassElts)) {
+      return true;
+    }
+    List<InterfaceType> supertypes = classElt.interfaces;
+    for (int i = 0; i < supertypes.length; i++) {
+      if (_safeIsOrInheritsProxy(supertypes[i].element, visitedClassElts)) {
+        return true;
+      }
+    }
+    supertypes = classElt.mixins;
+    for (int i = 0; i < supertypes.length; i++) {
+      if (_safeIsOrInheritsProxy(supertypes[i].element, visitedClassElts)) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+/**
+ * An element that is contained within a [ClassElement].
+ */
+abstract class ClassMemberElement implements Element {
+  /**
+   * Return the type in which this member is defined.
+   */
+  @override
+  ClassElement get enclosingElement;
+
+  /**
+   * Return `true` if this element is a static element. A static element is an
+   * element that is not associated with a particular instance, but rather with
+   * an entire library or class.
+   */
+  bool get isStatic;
+}
+
+/**
+ * An element representing a compilation unit.
+ */
+abstract class CompilationUnitElement implements Element, UriReferencedElement {
+  /**
+   * An empty list of compilation unit elements.
+   */
+  static const List<CompilationUnitElement> EMPTY_LIST =
+      const <CompilationUnitElement>[];
+
+  /**
+   * Return a list containing all of the top-level accessors (getters and
+   * setters) contained in this compilation unit.
+   */
+  List<PropertyAccessorElement> get accessors;
+
+  /**
+   * Return the library in which this compilation unit is defined.
+   */
+  @override
+  LibraryElement get enclosingElement;
+
+  /**
+   * Return a list containing all of the enums contained in this compilation
+   * unit.
+   */
+  List<ClassElement> get enums;
+
+  /**
+   * Return a list containing all of the top-level functions contained in this
+   * compilation unit.
+   */
+  List<FunctionElement> get functions;
+
+  /**
+   * Return a list containing all of the function type aliases contained in this
+   * compilation unit.
+   */
+  List<FunctionTypeAliasElement> get functionTypeAliases;
+
+  /**
+   * Return `true` if this compilation unit defines a top-level function named
+   * `loadLibrary`.
+   */
+  bool get hasLoadLibraryFunction;
+
+  /**
+   * Return a list containing all of the top-level variables contained in this
+   * compilation unit.
+   */
+  List<TopLevelVariableElement> get topLevelVariables;
+
+  /**
+   * Return a list containing all of the classes contained in this compilation
+   * unit.
+   */
+  List<ClassElement> get types;
+
+  /**
+   * Return the resolved [CompilationUnit] node that declares this element.
+   *
+   * This method is expensive, because resolved AST might be evicted from cache,
+   * so parsing and resolving will be performed.
+   */
+  @override
+  CompilationUnit computeNode();
+
+  /**
+   * Return the element at the given [offset], maybe `null` if no such element.
+   */
+  Element getElementAt(int offset);
+
+  /**
+   * Return the enum defined in this compilation unit that has the given [name],
+   * or `null` if this compilation unit does not define an enum with the given
+   * name.
+   */
+  ClassElement getEnum(String name);
+
+  /**
+   * Return the class defined in this compilation unit that has the given
+   * [name], or `null` if this compilation unit does not define a class with the
+   * given name.
+   */
+  ClassElement getType(String name);
+}
+
+/**
+ * A concrete implementation of a [CompilationUnitElement].
+ */
+class CompilationUnitElementImpl extends UriReferencedElementImpl
+    implements CompilationUnitElement {
+  /**
+   * An empty list of compilation unit elements.
+   */
+  @deprecated // Use CompilationUnitElement.EMPTY_LIST
+  static const List<CompilationUnitElement> EMPTY_ARRAY =
+      const <CompilationUnitElement>[];
+
+  /**
+   * The source that corresponds to this compilation unit.
+   */
+  Source source;
+
+  /**
+   * The source of the library containing this compilation unit.
+   *
+   * This is the same as the source of the containing [LibraryElement],
+   * except that it does not require the containing [LibraryElement] to be
+   * computed.
+   */
+  Source librarySource;
+
+  /**
+   * A list containing all of the top-level accessors (getters and setters)
+   * contained in this compilation unit.
+   */
+  List<PropertyAccessorElement> _accessors = PropertyAccessorElement.EMPTY_LIST;
+
+  /**
+   * A list containing all of the enums contained in this compilation unit.
+   */
+  List<ClassElement> _enums = ClassElement.EMPTY_LIST;
+
+  /**
+   * A list containing all of the top-level functions contained in this
+   * compilation unit.
+   */
+  List<FunctionElement> _functions = FunctionElement.EMPTY_LIST;
+
+  /**
+   * A list containing all of the function type aliases contained in this
+   * compilation unit.
+   */
+  List<FunctionTypeAliasElement> _typeAliases =
+      FunctionTypeAliasElement.EMPTY_LIST;
+
+  /**
+   * A list containing all of the types contained in this compilation unit.
+   */
+  List<ClassElement> _types = ClassElement.EMPTY_LIST;
+
+  /**
+   * A list containing all of the variables contained in this compilation unit.
+   */
+  List<TopLevelVariableElement> _variables = TopLevelVariableElement.EMPTY_LIST;
+
+  /**
+   * A map from offsets to elements of this unit at these offsets.
+   */
+  final Map<int, Element> _offsetToElementMap = new HashMap<int, Element>();
+
+  /**
+   * Initialize a newly created compilation unit element to have the given
+   * [name].
+   */
+  CompilationUnitElementImpl(String name) : super(name, -1);
+
+  @override
+  List<PropertyAccessorElement> get accessors => _accessors;
+
+  /**
+   * Set the top-level accessors (getters and setters) contained in this
+   * compilation unit to the given [accessors].
+   */
+  void set accessors(List<PropertyAccessorElement> accessors) {
+    for (PropertyAccessorElement accessor in accessors) {
+      (accessor as PropertyAccessorElementImpl).enclosingElement = this;
+    }
+    this._accessors = accessors;
+  }
+
+  @override
+  LibraryElement get enclosingElement =>
+      super.enclosingElement as LibraryElement;
+
+  @override
+  List<ClassElement> get enums => _enums;
+
+  /**
+   * Set the enums contained in this compilation unit to the given [enums].
+   */
+  void set enums(List<ClassElement> enums) {
+    for (ClassElement enumDeclaration in enums) {
+      (enumDeclaration as ClassElementImpl).enclosingElement = this;
+    }
+    this._enums = enums;
+  }
+
+  @override
+  List<FunctionElement> get functions => _functions;
+
+  /**
+   * Set the top-level functions contained in this compilation unit to the given
+   * [functions].
+   */
+  void set functions(List<FunctionElement> functions) {
+    for (FunctionElement function in functions) {
+      (function as FunctionElementImpl).enclosingElement = this;
+    }
+    this._functions = functions;
+  }
+
+  @override
+  List<FunctionTypeAliasElement> get functionTypeAliases => _typeAliases;
+
+  @override
+  int get hashCode => source.hashCode;
+
+  @override
+  bool get hasLoadLibraryFunction {
+    for (int i = 0; i < _functions.length; i++) {
+      if (_functions[i].name == FunctionElement.LOAD_LIBRARY_NAME) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  String get identifier => source.encoding;
+
+  @override
+  ElementKind get kind => ElementKind.COMPILATION_UNIT;
+
+  @override
+  List<TopLevelVariableElement> get topLevelVariables => _variables;
+
+  /**
+   * Set the top-level variables contained in this compilation unit to the given
+   * [variables].
+   */
+  void set topLevelVariables(List<TopLevelVariableElement> variables) {
+    for (TopLevelVariableElement field in variables) {
+      (field as TopLevelVariableElementImpl).enclosingElement = this;
+    }
+    this._variables = variables;
+  }
+
+  /**
+   * Set the function type aliases contained in this compilation unit to the
+   * given [typeAliases].
+   */
+  void set typeAliases(List<FunctionTypeAliasElement> typeAliases) {
+    for (FunctionTypeAliasElement typeAlias in typeAliases) {
+      (typeAlias as FunctionTypeAliasElementImpl).enclosingElement = this;
+    }
+    this._typeAliases = typeAliases;
+  }
+
+  @override
+  List<ClassElement> get types => _types;
+
+  /**
+   * Set the types contained in this compilation unit to the given [types].
+   */
+  void set types(List<ClassElement> types) {
+    for (ClassElement type in types) {
+      (type as ClassElementImpl).enclosingElement = this;
+    }
+    this._types = types;
+  }
+
+  @override
+  bool operator ==(Object object) =>
+      object is CompilationUnitElementImpl && source == object.source;
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitCompilationUnitElement(this);
+
+  /**
+   * This method is invoked after this unit was incrementally resolved.
+   */
+  void afterIncrementalResolution() {
+    _offsetToElementMap.clear();
+  }
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    if (source == null) {
+      buffer.write("{compilation unit}");
+    } else {
+      buffer.write(source.fullName);
+    }
+  }
+
+  @override
+  CompilationUnit computeNode() => unit;
+
+  @override
+  ElementImpl getChild(String identifier) {
+    //
+    // The casts in this method are safe because the set methods would have
+    // thrown a CCE if any of the elements in the arrays were not of the
+    // expected types.
+    //
+    for (PropertyAccessorElement accessor in _accessors) {
+      if ((accessor as PropertyAccessorElementImpl).identifier == identifier) {
+        return accessor as PropertyAccessorElementImpl;
+      }
+    }
+    for (VariableElement variable in _variables) {
+      if ((variable as VariableElementImpl).identifier == identifier) {
+        return variable as VariableElementImpl;
+      }
+    }
+    for (ExecutableElement function in _functions) {
+      if ((function as ExecutableElementImpl).identifier == identifier) {
+        return function as ExecutableElementImpl;
+      }
+    }
+    for (FunctionTypeAliasElement typeAlias in _typeAliases) {
+      if ((typeAlias as FunctionTypeAliasElementImpl).identifier ==
+          identifier) {
+        return typeAlias as FunctionTypeAliasElementImpl;
+      }
+    }
+    for (ClassElement type in _types) {
+      if ((type as ClassElementImpl).identifier == identifier) {
+        return type as ClassElementImpl;
+      }
+    }
+    for (ClassElement type in _enums) {
+      if ((type as ClassElementImpl).identifier == identifier) {
+        return type as ClassElementImpl;
+      }
+    }
+    return null;
+  }
+
+  @override
+  Element getElementAt(int offset) {
+    if (_offsetToElementMap.isEmpty) {
+      accept(new _BuildOffsetToElementMap(_offsetToElementMap));
+    }
+    return _offsetToElementMap[offset];
+  }
+
+  @override
+  ClassElement getEnum(String enumName) {
+    for (ClassElement enumDeclaration in _enums) {
+      if (enumDeclaration.name == enumName) {
+        return enumDeclaration;
+      }
+    }
+    return null;
+  }
+
+  @override
+  ClassElement getType(String className) {
+    for (ClassElement type in _types) {
+      if (type.name == className) {
+        return type;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Replace the given [from] top-level variable with [to] in this compilation unit.
+   */
+  void replaceTopLevelVariable(
+      TopLevelVariableElement from, TopLevelVariableElement to) {
+    int index = _variables.indexOf(from);
+    _variables[index] = to;
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChildren(_accessors, visitor);
+    safelyVisitChildren(_enums, visitor);
+    safelyVisitChildren(_functions, visitor);
+    safelyVisitChildren(_typeAliases, visitor);
+    safelyVisitChildren(_types, visitor);
+    safelyVisitChildren(_variables, visitor);
+  }
+}
+
+/**
+ * A [FieldElement] for a 'const' or 'final' field that has an initializer.
+ *
+ * TODO(paulberry): we should rename this class to reflect the fact that it's
+ * used for both const and final fields.  However, we shouldn't do so until
+ * we've created an API for reading the values of constants; until that API is
+ * available, clients are likely to read constant values by casting to
+ * ConstFieldElementImpl, so it would be a breaking change to rename this
+ * class.
+ */
+class ConstFieldElementImpl extends FieldElementImpl with ConstVariableElement {
+  /**
+   * The result of evaluating this variable's initializer.
+   */
+  EvaluationResultImpl _result;
+
+  /**
+   * Initialize a newly created synthetic field element to have the given
+   * [name] and [offset].
+   */
+  ConstFieldElementImpl(String name, int offset) : super(name, offset);
+
+  /**
+   * Initialize a newly created field element to have the given [name].
+   */
+  @deprecated // Use new ConstFieldElementImpl.forNode(name)
+  ConstFieldElementImpl.con1(Identifier name) : super.forNode(name);
+
+  /**
+   * Initialize a newly created synthetic field element to have the given
+   * [name] and [offset].
+   */
+  @deprecated // Use new ConstFieldElementImpl(name, offset)
+  ConstFieldElementImpl.con2(String name, int offset) : super(name, offset);
+
+  /**
+   * Initialize a newly created field element to have the given [name].
+   */
+  ConstFieldElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  @override
+  EvaluationResultImpl get evaluationResult => _result;
+
+  @override
+  void set evaluationResult(EvaluationResultImpl result) {
+    this._result = result;
+  }
+}
+
+/**
+ * A [LocalVariableElement] for a local 'const' variable that has an
+ * initializer.
+ */
+class ConstLocalVariableElementImpl extends LocalVariableElementImpl
+    with ConstVariableElement {
+  /**
+   * The result of evaluating this variable's initializer.
+   */
+  EvaluationResultImpl _result;
+
+  /**
+   * Initialize a newly created local variable element to have the given [name]
+   * and [offset].
+   */
+  ConstLocalVariableElementImpl(String name, int offset) : super(name, offset);
+
+  /**
+   * Initialize a newly created local variable element to have the given [name].
+   */
+  ConstLocalVariableElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  @override
+  EvaluationResultImpl get evaluationResult => _result;
+
+  @override
+  void set evaluationResult(EvaluationResultImpl result) {
+    this._result = result;
+  }
+}
+
+/**
+ * An element representing a constructor or a factory method defined within a
+ * class.
+ */
+abstract class ConstructorElement
+    implements ClassMemberElement, ExecutableElement, ConstantEvaluationTarget {
+  /**
+   * An empty list of constructor elements.
+   */
+  static const List<ConstructorElement> EMPTY_LIST =
+      const <ConstructorElement>[];
+
+  /**
+   * Return `true` if this constructor is a const constructor.
+   */
+  bool get isConst;
+
+  /**
+   * Return `true` if this constructor can be used as a default constructor -
+   * unnamed and has no required parameters.
+   */
+  bool get isDefaultConstructor;
+
+  /**
+   * Return `true` if this constructor represents a factory constructor.
+   */
+  bool get isFactory;
+
+  /**
+   * Return the offset of the character immediately following the last character
+   * of this constructor's name, or `null` if not named.
+   */
+  int get nameEnd;
+
+  /**
+   * Return the offset of the `.` before this constructor name, or `null` if
+   * not named.
+   */
+  int get periodOffset;
+
+  /**
+   * Return the constructor to which this constructor is redirecting, or `null`
+   * if this constructor does not redirect to another constructor or if the
+   * library containing this constructor has not yet been resolved.
+   */
+  ConstructorElement get redirectedConstructor;
+
+  /**
+   * Return the resolved [ConstructorDeclaration] node that declares this
+   * [ConstructorElement] .
+   *
+   * This method is expensive, because resolved AST might be evicted from cache,
+   * so parsing and resolving will be performed.
+   */
+  @override
+  ConstructorDeclaration computeNode();
+}
+
+/**
+ * A concrete implementation of a [ConstructorElement].
+ */
+class ConstructorElementImpl extends ExecutableElementImpl
+    implements ConstructorElement {
+  /**
+   * An empty list of constructor elements.
+   */
+  @deprecated // Use ConstructorElement.EMPTY_LIST
+  static const List<ConstructorElement> EMPTY_ARRAY =
+      const <ConstructorElement>[];
+
+  /**
+   * The constructor to which this constructor is redirecting.
+   */
+  ConstructorElement redirectedConstructor;
+
+  /**
+   * The initializers for this constructor (used for evaluating constant
+   * instance creation expressions).
+   */
+  List<ConstructorInitializer> constantInitializers;
+
+  /**
+   * The offset of the `.` before this constructor name or `null` if not named.
+   */
+  int periodOffset;
+
+  /**
+   * Return the offset of the character immediately following the last character
+   * of this constructor's name, or `null` if not named.
+   */
+  int nameEnd;
+
+  /**
+   * True if this constructor has been found by constant evaluation to be free
+   * of redirect cycles, and is thus safe to evaluate.
+   */
+  bool isCycleFree = false;
+
+  /**
+   * Initialize a newly created constructor element to have the given [name] and
+   * [offset].
+   */
+  ConstructorElementImpl(String name, int offset) : super(name, offset);
+
+  /**
+   * Initialize a newly created constructor element to have the given [name].
+   */
+  ConstructorElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  /**
+   * Set whether this constructor represents a 'const' constructor.
+   */
+  void set const2(bool isConst) {
+    setModifier(Modifier.CONST, isConst);
+  }
+
+  @override
+  ClassElement get enclosingElement => super.enclosingElement as ClassElement;
+
+  /**
+   * Set whether this constructor represents a factory method.
+   */
+  void set factory(bool isFactory) {
+    setModifier(Modifier.FACTORY, isFactory);
+  }
+
+  @override
+  bool get isConst => hasModifier(Modifier.CONST);
+
+  @override
+  bool get isDefaultConstructor {
+    // unnamed
+    String name = this.name;
+    if (name != null && name.length != 0) {
+      return false;
+    }
+    // no required parameters
+    for (ParameterElement parameter in parameters) {
+      if (parameter.parameterKind == ParameterKind.REQUIRED) {
+        return false;
+      }
+    }
+    // OK, can be used as default constructor
+    return true;
+  }
+
+  @override
+  bool get isFactory => hasModifier(Modifier.FACTORY);
+
+  @override
+  bool get isStatic => false;
+
+  @override
+  ElementKind get kind => ElementKind.CONSTRUCTOR;
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitConstructorElement(this);
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    if (enclosingElement == null) {
+      String message;
+      String name = displayName;
+      if (name != null && !name.isEmpty) {
+        message =
+            'Found constructor element named $name with no enclosing element';
+      } else {
+        message = 'Found unnamed constructor element with no enclosing element';
+      }
+      AnalysisEngine.instance.logger.logError(message);
+      buffer.write('<unknown class>');
+    } else {
+      buffer.write(enclosingElement.displayName);
+    }
+    String name = displayName;
+    if (name != null && !name.isEmpty) {
+      buffer.write(".");
+      buffer.write(name);
+    }
+    super.appendTo(buffer);
+  }
+
+  @override
+  ConstructorDeclaration computeNode() =>
+      getNodeMatching((node) => node is ConstructorDeclaration);
+}
+
+/**
+ * A constructor element defined in a parameterized type where the values of the
+ * type parameters are known.
+ */
+class ConstructorMember extends ExecutableMember implements ConstructorElement {
+  /**
+   * Initialize a newly created element to represent a constructor, based on the
+   * [baseElement], defined by the [definingType].
+   */
+  ConstructorMember(ConstructorElement baseElement, InterfaceType definingType)
+      : super(baseElement, definingType);
+
+  @override
+  ConstructorElement get baseElement => super.baseElement as ConstructorElement;
+
+  @override
+  InterfaceType get definingType => super.definingType as InterfaceType;
+
+  @override
+  ClassElement get enclosingElement => baseElement.enclosingElement;
+
+  @override
+  bool get isConst => baseElement.isConst;
+
+  @override
+  bool get isDefaultConstructor => baseElement.isDefaultConstructor;
+
+  @override
+  bool get isFactory => baseElement.isFactory;
+
+  @override
+  int get nameEnd => baseElement.nameEnd;
+
+  @override
+  int get periodOffset => baseElement.periodOffset;
+
+  @override
+  ConstructorElement get redirectedConstructor =>
+      from(baseElement.redirectedConstructor, definingType);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitConstructorElement(this);
+
+  @override
+  ConstructorDeclaration computeNode() => baseElement.computeNode();
+
+  @override
+  String toString() {
+    ConstructorElement baseElement = this.baseElement;
+    List<ParameterElement> parameters = this.parameters;
+    FunctionType type = this.type;
+    StringBuffer buffer = new StringBuffer();
+    buffer.write(baseElement.enclosingElement.displayName);
+    String name = displayName;
+    if (name != null && !name.isEmpty) {
+      buffer.write(".");
+      buffer.write(name);
+    }
+    buffer.write("(");
+    int parameterCount = parameters.length;
+    for (int i = 0; i < parameterCount; i++) {
+      if (i > 0) {
+        buffer.write(", ");
+      }
+      buffer.write(parameters[i]);
+    }
+    buffer.write(")");
+    if (type != null) {
+      buffer.write(Element.RIGHT_ARROW);
+      buffer.write(type.returnType);
+    }
+    return buffer.toString();
+  }
+
+  /**
+   * If the given [constructor]'s type is different when any type parameters
+   * from the defining type's declaration are replaced with the actual type
+   * arguments from the [definingType], create a constructor member representing
+   * the given constructor. Return the member that was created, or the original
+   * constructor if no member was created.
+   */
+  static ConstructorElement from(
+      ConstructorElement constructor, InterfaceType definingType) {
+    if (constructor == null || definingType.typeArguments.length == 0) {
+      return constructor;
+    }
+    FunctionType baseType = constructor.type;
+    if (baseType == null) {
+      // TODO(brianwilkerson) We need to understand when this can happen.
+      return constructor;
+    }
+    List<DartType> argumentTypes = definingType.typeArguments;
+    List<DartType> parameterTypes = definingType.element.type.typeArguments;
+    FunctionType substitutedType =
+        baseType.substitute2(argumentTypes, parameterTypes);
+    if (baseType == substitutedType) {
+      return constructor;
+    }
+    // TODO(brianwilkerson) Consider caching the substituted type in the
+    // instance. It would use more memory but speed up some operations.
+    // We need to see how often the type is being re-computed.
+    return new ConstructorMember(constructor, definingType);
+  }
+}
+
+/**
+ * A [TopLevelVariableElement] for a top-level 'const' variable that has an
+ * initializer.
+ */
+class ConstTopLevelVariableElementImpl extends TopLevelVariableElementImpl
+    with ConstVariableElement {
+  /**
+   * The result of evaluating this variable's initializer.
+   */
+  EvaluationResultImpl _result;
+
+  /**
+   * Initialize a newly created top-level variable element to have the given
+   * [name].
+   */
+  ConstTopLevelVariableElementImpl(Identifier name) : super.forNode(name);
+
+  @override
+  EvaluationResultImpl get evaluationResult => _result;
+
+  @override
+  void set evaluationResult(EvaluationResultImpl result) {
+    this._result = result;
+  }
+}
+
+/**
+ * Mixin used by elements that represent constant variables and have
+ * initializers.
+ *
+ * Note that in correct Dart code, all constant variables must have
+ * initializers.  However, analyzer also needs to handle incorrect Dart code,
+ * in which case there might be some constant variables that lack initializers.
+ * This interface is only used for constant variables that have initializers.
+ *
+ * This class is not intended to be part of the public API for analyzer.
+ */
+abstract class ConstVariableElement implements PotentiallyConstVariableElement {
+  /**
+   * If this element represents a constant variable, and it has an initializer,
+   * a copy of the initializer for the constant.  Otherwise `null`.
+   *
+   * Note that in correct Dart code, all constant variables must have
+   * initializers.  However, analyzer also needs to handle incorrect Dart code,
+   * in which case there might be some constant variables that lack
+   * initializers.
+   */
+  Expression constantInitializer;
+}
+
+/**
+ * The type associated with elements in the element model.
+ */
+abstract class DartType {
+  /**
+   * An empty list of types.
+   */
+  static const List<DartType> EMPTY_LIST = const <DartType>[];
+
+  /**
+   * Return the name of this type as it should appear when presented to users in
+   * contexts such as error messages.
+   */
+  String get displayName;
+
+  /**
+   * Return the element representing the declaration of this type, or `null` if
+   * the type has not, or cannot, be associated with an element. The former case
+   * will occur if the element model is not yet complete; the latter case will
+   * occur if this object represents an undefined type.
+   */
+  Element get element;
+
+  /**
+   * Return `true` if this type represents the bottom type.
+   */
+  bool get isBottom;
+
+  /**
+   * Return `true` if this type represents the type 'Function' defined in the
+   * dart:core library.
+   */
+  bool get isDartCoreFunction;
+
+  /**
+   * Return `true` if this type represents the type 'dynamic'.
+   */
+  bool get isDynamic;
+
+  /**
+   * Return `true` if this type represents the type 'Object'.
+   */
+  bool get isObject;
+
+  /**
+   * Return `true` if this type represents a typename that couldn't be resolved.
+   */
+  bool get isUndefined;
+
+  /**
+   * Return `true` if this type represents the type 'void'.
+   */
+  bool get isVoid;
+
+  /**
+   * Return the name of this type, or `null` if the type does not have a name,
+   * such as when the type represents the type of an unnamed function.
+   */
+  String get name;
+
+  /**
+   * Return the least upper bound of this type and the given [type], or `null`
+   * if there is no least upper bound.
+   *
+   * Deprecated, since it is impossible to implement the correct algorithm
+   * without access to a [TypeProvider].  Please use
+   * [TypeSystem.getLeastUpperBound] instead.
+   */
+  @deprecated
+  DartType getLeastUpperBound(DartType type);
+
+  /**
+   * Return `true` if this type is assignable to the given [type]. A type
+   * <i>T</i> may be assigned to a type <i>S</i>, written <i>T</i> &hArr;
+   * <i>S</i>, iff either <i>T</i> <: <i>S</i> or <i>S</i> <: <i>T</i>.
+   */
+  bool isAssignableTo(DartType type);
+
+  /**
+   * Return `true` if this type is more specific than the given [type].
+   */
+  bool isMoreSpecificThan(DartType type);
+
+  /**
+   * Return `true` if this type is a subtype of the given [type].
+   */
+  bool isSubtypeOf(DartType type);
+
+  /**
+   * Return `true` if this type is a supertype of the given [type]. A type
+   * <i>S</i> is a supertype of <i>T</i>, written <i>S</i> :> <i>T</i>, iff
+   * <i>T</i> is a subtype of <i>S</i>.
+   */
+  bool isSupertypeOf(DartType type);
+
+  /**
+   * Return the type resulting from substituting the given [argumentTypes] for
+   * the given [parameterTypes] in this type. The specification defines this
+   * operation in section 2:
+   * <blockquote>
+   * The notation <i>[x<sub>1</sub>, ..., x<sub>n</sub>/y<sub>1</sub>, ...,
+   * y<sub>n</sub>]E</i> denotes a copy of <i>E</i> in which all occurrences of
+   * <i>y<sub>i</sub>, 1 <= i <= n</i> have been replaced with
+   * <i>x<sub>i</sub></i>.
+   * </blockquote>
+   * Note that, contrary to the specification, this method will not create a
+   * copy of this type if no substitutions were required, but will return this
+   * type directly.
+   *
+   * Note too that the current implementation of this method is only guaranteed
+   * to work when the parameter types are type variables.
+   */
+  DartType substitute2(
+      List<DartType> argumentTypes, List<DartType> parameterTypes);
+}
+
+/**
+ * A [FieldFormalParameterElementImpl] for parameters that have an initializer.
+ */
+class DefaultFieldFormalParameterElementImpl
+    extends FieldFormalParameterElementImpl with ConstVariableElement {
+  /**
+   * The result of evaluating this variable's initializer.
+   */
+  EvaluationResultImpl _result;
+
+  /**
+   * Initialize a newly created parameter element to have the given [name].
+   */
+  DefaultFieldFormalParameterElementImpl(Identifier name) : super(name);
+
+  @override
+  EvaluationResultImpl get evaluationResult => _result;
+
+  @override
+  void set evaluationResult(EvaluationResultImpl result) {
+    this._result = result;
+  }
+}
+
+/**
+ * A [ParameterElement] for parameters that have an initializer.
+ */
+class DefaultParameterElementImpl extends ParameterElementImpl
+    with ConstVariableElement {
+  /**
+   * The result of evaluating this variable's initializer.
+   */
+  EvaluationResultImpl _result;
+
+  /**
+   * Initialize a newly created parameter element to have the given [name].
+   */
+  DefaultParameterElementImpl(Identifier name) : super.forNode(name);
+
+  @override
+  EvaluationResultImpl get evaluationResult => _result;
+
+  @override
+  void set evaluationResult(EvaluationResultImpl result) {
+    this._result = result;
+  }
+
+  @override
+  DefaultFormalParameter computeNode() =>
+      getNodeMatching((node) => node is DefaultFormalParameter);
+}
+
+/**
+ * The synthetic element representing the declaration of the type `dynamic`.
+ */
+class DynamicElementImpl extends ElementImpl implements TypeDefiningElement {
+  /**
+   * Return the unique instance of this class.
+   */
+  static DynamicElementImpl get instance =>
+      DynamicTypeImpl.instance.element as DynamicElementImpl;
+
+  @override
+  DynamicTypeImpl type;
+
+  /**
+   * Initialize a newly created instance of this class. Instances of this class
+   * should <b>not</b> be created except as part of creating the type associated
+   * with this element. The single instance of this class should be accessed
+   * through the method [getInstance].
+   */
+  DynamicElementImpl() : super(Keyword.DYNAMIC.syntax, -1) {
+    setModifier(Modifier.SYNTHETIC, true);
+  }
+
+  @override
+  ElementKind get kind => ElementKind.DYNAMIC;
+
+  @override
+  accept(ElementVisitor visitor) => null;
+}
+
+/**
+ * The [Type] representing the type `dynamic`.
+ */
+class DynamicTypeImpl extends TypeImpl {
+  /**
+   * The unique instance of this class.
+   */
+  static DynamicTypeImpl _INSTANCE = new DynamicTypeImpl._();
+
+  /**
+   * Return the unique instance of this class.
+   */
+  static DynamicTypeImpl get instance => _INSTANCE;
+
+  /**
+   * Prevent the creation of instances of this class.
+   */
+  DynamicTypeImpl._()
+      : super(new DynamicElementImpl(), Keyword.DYNAMIC.syntax) {
+    (element as DynamicElementImpl).type = this;
+  }
+
+  /**
+   * Constructor used by [CircularTypeImpl].
+   */
+  DynamicTypeImpl._circular()
+      : super(_INSTANCE.element, Keyword.DYNAMIC.syntax);
+
+  @override
+  int get hashCode => 1;
+
+  @override
+  bool get isDynamic => true;
+
+  @override
+  bool operator ==(Object object) => identical(object, this);
+
+  @override
+  bool isMoreSpecificThan(DartType type,
+      [bool withDynamic = false, Set<Element> visitedElements]) {
+    // T is S
+    if (identical(this, type)) {
+      return true;
+    }
+    // else
+    return withDynamic;
+  }
+
+  @override
+  bool isSubtypeOf(DartType type) => true;
+
+  @override
+  bool isSupertypeOf(DartType type) => true;
+
+  @override
+  TypeImpl pruned(List<FunctionTypeAliasElement> prune) => this;
+
+  @override
+  DartType substitute2(
+      List<DartType> argumentTypes, List<DartType> parameterTypes,
+      [List<FunctionTypeAliasElement> prune]) {
+    int length = parameterTypes.length;
+    for (int i = 0; i < length; i++) {
+      if (parameterTypes[i] == this) {
+        return argumentTypes[i];
+      }
+    }
+    return this;
+  }
+}
+
+/**
+ * The base class for all of the elements in the element model. Generally
+ * speaking, the element model is a semantic model of the program that
+ * represents things that are declared with a name and hence can be referenced
+ * elsewhere in the code.
+ *
+ * There are two exceptions to the general case. First, there are elements in
+ * the element model that are created for the convenience of various kinds of
+ * analysis but that do not have any corresponding declaration within the source
+ * code. Such elements are marked as being <i>synthetic</i>. Examples of
+ * synthetic elements include
+ * * default constructors in classes that do not define any explicit
+ *   constructors,
+ * * getters and setters that are induced by explicit field declarations,
+ * * fields that are induced by explicit declarations of getters and setters,
+ *   and
+ * * functions representing the initialization expression for a variable.
+ *
+ * Second, there are elements in the element model that do not have a name.
+ * These correspond to unnamed functions and exist in order to more accurately
+ * represent the semantic structure of the program.
+ */
+abstract class Element implements AnalysisTarget {
+  /**
+   * An Unicode right arrow.
+   */
+  static final String RIGHT_ARROW = " \u2192 ";
+
+  /**
+   * A comparator that can be used to sort elements by their name offset.
+   * Elements with a smaller offset will be sorted to be before elements with a
+   * larger name offset.
+   */
+  static final Comparator<Element> SORT_BY_OFFSET = (Element firstElement,
+          Element secondElement) =>
+      firstElement.nameOffset - secondElement.nameOffset;
+
+  /**
+   * Return the analysis context in which this element is defined.
+   */
+  AnalysisContext get context;
+
+  /**
+   * Return the display name of this element, or `null` if this element does not
+   * have a name.
+   *
+   * In most cases the name and the display name are the same. Differences
+   * though are cases such as setters where the name of some setter `set f(x)`
+   * is `f=`, instead of `f`.
+   */
+  String get displayName;
+
+  /**
+   * Return the element that either physically or logically encloses this
+   * element. This will be `null` if this element is a library because libraries
+   * are the top-level elements in the model.
+   */
+  Element get enclosingElement;
+
+  /**
+   * The unique integer identifier of this element.
+   */
+  int get id;
+
+  /**
+   * Return `true` if this element has an annotation of the form '@deprecated'
+   * or '@Deprecated('..')'.
+   */
+  bool get isDeprecated;
+
+  /**
+   * Return `true` if this element has an annotation of the form '@override'.
+   */
+  bool get isOverride;
+
+  /**
+   * Return `true` if this element is private. Private elements are visible only
+   * within the library in which they are declared.
+   */
+  bool get isPrivate;
+
+  /**
+   * Return `true` if this element is public. Public elements are visible within
+   * any library that imports the library in which they are declared.
+   */
+  bool get isPublic;
+
+  /**
+   * Return `true` if this element is synthetic. A synthetic element is an
+   * element that is not represented in the source code explicitly, but is
+   * implied by the source code, such as the default constructor for a class
+   * that does not explicitly define any constructors.
+   */
+  bool get isSynthetic;
+
+  /**
+   * Return the kind of element that this is.
+   */
+  ElementKind get kind;
+
+  /**
+   * Return the library that contains this element. This will be the element
+   * itself if it is a library element. This will be `null` if this element is
+   * an HTML file because HTML files are not contained in libraries.
+   */
+  LibraryElement get library;
+
+  /**
+   * Return an object representing the location of this element in the element
+   * model. The object can be used to locate this element at a later time.
+   */
+  ElementLocation get location;
+
+  /**
+   * Return a list containing all of the metadata associated with this element.
+   * The array will be empty if the element does not have any metadata or if the
+   * library containing this element has not yet been resolved.
+   */
+  List<ElementAnnotation> get metadata;
+
+  /**
+   * Return the name of this element, or `null` if this element does not have a
+   * name.
+   */
+  String get name;
+
+  /**
+   * Return the offset of the name of this element in the file that contains the
+   * declaration of this element, or `-1` if this element is synthetic, does not
+   * have a name, or otherwise does not have an offset.
+   */
+  int get nameOffset;
+
+  /**
+   * **DEPRECATED** Use `computeNode()` instead.
+   *
+   * Return the resolved [AstNode] node that declares this element, or `null` if
+   * this element is synthetic or isn't contained in a compilation unit, such as
+   * a [LibraryElement].
+   *
+   * This method is expensive, because resolved AST might be evicted from cache,
+   * so parsing and resolving will be performed.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  @deprecated
+  AstNode get node;
+
+  /**
+   * Return the source that contains this element, or `null` if this element is
+   * not contained in a source.
+   */
+  Source get source;
+
+  /**
+   * Return the resolved [CompilationUnit] that declares this element, or `null`
+   * if this element is synthetic.
+   *
+   * This method is expensive, because resolved AST might have been already
+   * evicted from cache, so parsing and resolving will be performed.
+   */
+  CompilationUnit get unit;
+
+  /**
+   * Use the given [visitor] to visit this element. Return the value returned by
+   * the visitor as a result of visiting this element.
+   */
+  accept(ElementVisitor visitor);
+
+  /**
+   * Return the documentation comment for this element as it appears in the
+   * original source (complete with the beginning and ending delimiters), or
+   * `null` if this element does not have a documentation comment associated
+   * with it. This can be a long-running operation if the information needed to
+   * access the comment is not cached.
+   *
+   * Throws [AnalysisException] if the documentation comment could not be
+   * determined because the analysis could not be performed
+   */
+  String computeDocumentationComment();
+
+  /**
+   * Return the resolved [AstNode] node that declares this element, or `null` if
+   * this element is synthetic or isn't contained in a compilation unit, such as
+   * a [LibraryElement].
+   *
+   * This method is expensive, because resolved AST might be evicted from cache,
+   * so parsing and resolving will be performed.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  AstNode computeNode();
+
+  /**
+   * Return the most immediate ancestor of this element for which the
+   * [predicate] returns `true`, or `null` if there is no such ancestor. Note
+   * that this element will never be returned.
+   */
+  Element getAncestor(Predicate<Element> predicate);
+
+  /**
+   * Return a display name for the given element that includes the path to the
+   * compilation unit in which the type is defined. If [shortName] is `null`
+   * then [getDisplayName] will be used as the name of this element. Otherwise
+   * the provided name will be used.
+   */
+  // TODO(brianwilkerson) Make the parameter optional.
+  String getExtendedDisplayName(String shortName);
+
+  /**
+   * Return `true` if this element, assuming that it is within scope, is
+   * accessible to code in the given [library]. This is defined by the Dart
+   * Language Specification in section 3.2:
+   * <blockquote>
+   * A declaration <i>m</i> is accessible to library <i>L</i> if <i>m</i> is
+   * declared in <i>L</i> or if <i>m</i> is public.
+   * </blockquote>
+   */
+  bool isAccessibleIn(LibraryElement library);
+
+  /**
+   * Use the given [visitor] to visit all of the children of this element. There
+   * is no guarantee of the order in which the children will be visited.
+   */
+  void visitChildren(ElementVisitor visitor);
+}
+
+/**
+ * A single annotation associated with an element.
+ */
+abstract class ElementAnnotation {
+  /**
+   * An empty list of annotations.
+   */
+  static const List<ElementAnnotation> EMPTY_LIST = const <ElementAnnotation>[];
+
+  /**
+   * Return the element representing the field, variable, or const constructor
+   * being used as an annotation.
+   */
+  Element get element;
+
+  /**
+   * Return `true` if this annotation marks the associated element as being
+   * deprecated.
+   */
+  bool get isDeprecated;
+
+  /**
+   * Return `true` if this annotation marks the associated method as being
+   * expected to override an inherited method.
+   */
+  bool get isOverride;
+
+  /**
+   * Return `true` if this annotation marks the associated class as implementing
+   * a proxy object.
+   */
+  bool get isProxy;
+}
+
+/**
+ * A concrete implementation of an [ElementAnnotation].
+ */
+class ElementAnnotationImpl implements ElementAnnotation {
+  /**
+   * An empty list of annotations.
+   */
+  @deprecated // Use ElementAnnotation.EMPTY_LIST
+  static const List<ElementAnnotationImpl> EMPTY_ARRAY =
+      const <ElementAnnotationImpl>[];
+
+  /**
+   * The name of the class used to mark an element as being deprecated.
+   */
+  static String _DEPRECATED_CLASS_NAME = "Deprecated";
+
+  /**
+   * The name of the top-level variable used to mark an element as being
+   * deprecated.
+   */
+  static String _DEPRECATED_VARIABLE_NAME = "deprecated";
+
+  /**
+   * The name of the top-level variable used to mark a method as being expected
+   * to override an inherited method.
+   */
+  static String _OVERRIDE_VARIABLE_NAME = "override";
+
+  /**
+   * The name of the top-level variable used to mark a class as implementing a
+   * proxy object.
+   */
+  static String PROXY_VARIABLE_NAME = "proxy";
+
+  /**
+   * The element representing the field, variable, or constructor being used as
+   * an annotation.
+   */
+  final Element element;
+
+  /**
+   * The result of evaluating this annotation as a compile-time constant
+   * expression, or `null` if the compilation unit containing the variable has
+   * not been resolved.
+   */
+  EvaluationResultImpl evaluationResult;
+
+  /**
+   * Initialize a newly created annotation. The given [element] is the element
+   * representing the field, variable, or constructor being used as an
+   * annotation.
+   */
+  ElementAnnotationImpl(this.element);
+
+  @override
+  bool get isDeprecated {
+    if (element != null) {
+      LibraryElement library = element.library;
+      if (library != null && library.isDartCore) {
+        if (element is ConstructorElement) {
+          ConstructorElement constructorElement = element as ConstructorElement;
+          if (constructorElement.enclosingElement.name ==
+              _DEPRECATED_CLASS_NAME) {
+            return true;
+          }
+        } else if (element is PropertyAccessorElement &&
+            element.name == _DEPRECATED_VARIABLE_NAME) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  @override
+  bool get isOverride {
+    if (element != null) {
+      LibraryElement library = element.library;
+      if (library != null && library.isDartCore) {
+        if (element is PropertyAccessorElement &&
+            element.name == _OVERRIDE_VARIABLE_NAME) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  @override
+  bool get isProxy {
+    if (element != null) {
+      LibraryElement library = element.library;
+      if (library != null && library.isDartCore) {
+        if (element is PropertyAccessorElement &&
+            element.name == PROXY_VARIABLE_NAME) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  @override
+  String toString() => '@$element';
+}
+
+/**
+ * A base class for concrete implementations of an [Element].
+ */
+abstract class ElementImpl implements Element {
+  static int _NEXT_ID = 0;
+
+  final int id = _NEXT_ID++;
+
+  /**
+   * The enclosing element of this element, or `null` if this element is at the
+   * root of the element structure.
+   */
+  ElementImpl _enclosingElement;
+
+  /**
+   * The name of this element.
+   */
+  String _name;
+
+  /**
+   * The offset of the name of this element in the file that contains the
+   * declaration of this element.
+   */
+  int _nameOffset = 0;
+
+  /**
+   * A bit-encoded form of the modifiers associated with this element.
+   */
+  int _modifiers = 0;
+
+  /**
+   * A list containing all of the metadata associated with this element.
+   */
+  List<ElementAnnotation> metadata = ElementAnnotation.EMPTY_LIST;
+
+  /**
+   * A cached copy of the calculated hashCode for this element.
+   */
+  int _cachedHashCode;
+
+  /**
+   * A cached copy of the calculated location for this element.
+   */
+  ElementLocation _cachedLocation;
+
+  /**
+   * Initialize a newly created element to have the given [name] at the given
+   * [_nameOffset].
+   */
+  ElementImpl(String name, this._nameOffset) {
+    this._name = StringUtilities.intern(name);
+  }
+
+  /**
+   * Initialize a newly created element to have the given [name].
+   */
+  ElementImpl.forNode(Identifier name)
+      : this(name == null ? "" : name.name, name == null ? -1 : name.offset);
+
+  @override
+  AnalysisContext get context {
+    if (_enclosingElement == null) {
+      return null;
+    }
+    return _enclosingElement.context;
+  }
+
+  @override
+  String get displayName => _name;
+
+  @override
+  Element get enclosingElement => _enclosingElement;
+
+  /**
+   * Set the enclosing element of this element to the given [element].
+   */
+  void set enclosingElement(Element element) {
+    _enclosingElement = element as ElementImpl;
+    _cachedLocation = null;
+    _cachedHashCode = null;
+  }
+
+  @override
+  int get hashCode {
+    // TODO: We might want to re-visit this optimization in the future.
+    // We cache the hash code value as this is a very frequently called method.
+    if (_cachedHashCode == null) {
+      int hashIdentifier = identifier.hashCode;
+      Element enclosing = enclosingElement;
+      if (enclosing != null) {
+        _cachedHashCode = hashIdentifier + enclosing.hashCode;
+      } else {
+        _cachedHashCode = hashIdentifier;
+      }
+    }
+    return _cachedHashCode;
+  }
+
+  /**
+   * Return an identifier that uniquely identifies this element among the
+   * children of this element's parent.
+   */
+  String get identifier => name;
+
+  @override
+  bool get isDeprecated {
+    for (ElementAnnotation annotation in metadata) {
+      if (annotation.isDeprecated) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  bool get isOverride {
+    for (ElementAnnotation annotation in metadata) {
+      if (annotation.isOverride) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  bool get isPrivate {
+    String name = displayName;
+    if (name == null) {
+      return true;
+    }
+    return Identifier.isPrivateName(name);
+  }
+
+  @override
+  bool get isPublic => !isPrivate;
+
+  @override
+  bool get isSynthetic => hasModifier(Modifier.SYNTHETIC);
+
+  @override
+  LibraryElement get library =>
+      getAncestor((element) => element is LibraryElement);
+
+  @override
+  ElementLocation get location {
+    if (_cachedLocation == null) {
+      _cachedLocation = new ElementLocationImpl.con1(this);
+    }
+    return _cachedLocation;
+  }
+
+  @override
+  String get name => _name;
+
+  void set name(String name) {
+    this._name = name;
+    _cachedLocation = null;
+    _cachedHashCode = null;
+  }
+
+  /**
+   * The offset of the name of this element in the file that contains the
+   * declaration of this element.
+   */
+  int get nameOffset => _nameOffset;
+
+  /**
+   * Sets the offset of the name of this element in the file that contains the
+   * declaration of this element.
+   */
+  void set nameOffset(int offset) {
+    _nameOffset = offset;
+    _cachedHashCode = null;
+    _cachedLocation = null;
+  }
+
+  @deprecated
+  @override
+  AstNode get node => computeNode();
+
+  @override
+  Source get source {
+    if (_enclosingElement == null) {
+      return null;
+    }
+    return _enclosingElement.source;
+  }
+
+  /**
+   * Set whether this element is synthetic.
+   */
+  void set synthetic(bool isSynthetic) {
+    setModifier(Modifier.SYNTHETIC, isSynthetic);
+  }
+
+  @override
+  CompilationUnit get unit => context.resolveCompilationUnit(source, library);
+
+  @override
+  bool operator ==(Object object) {
+    if (identical(this, object)) {
+      return true;
+    }
+    if (object == null || hashCode != object.hashCode) {
+      return false;
+    }
+    return object.runtimeType == runtimeType &&
+        (object as Element).location == location;
+  }
+
+  /**
+   * Append a textual representation of this element to the given [buffer].
+   */
+  void appendTo(StringBuffer buffer) {
+    if (_name == null) {
+      buffer.write("<unnamed ");
+      buffer.write(runtimeType.toString());
+      buffer.write(">");
+    } else {
+      buffer.write(_name);
+    }
+  }
+
+  @override
+  String computeDocumentationComment() {
+    AnalysisContext context = this.context;
+    if (context == null) {
+      return null;
+    }
+    return context.computeDocumentationComment(this);
+  }
+
+  @override
+  AstNode computeNode() => getNodeMatching((node) => node is AstNode);
+
+  /**
+   * Set this element as the enclosing element for given [element].
+   */
+  void encloseElement(ElementImpl element) {
+    element.enclosingElement = this;
+  }
+
+  @override
+  Element getAncestor(Predicate<Element> predicate) {
+    Element ancestor = _enclosingElement;
+    while (ancestor != null && !predicate(ancestor)) {
+      ancestor = ancestor.enclosingElement;
+    }
+    return ancestor;
+  }
+
+  /**
+   * Return the child of this element that is uniquely identified by the given
+   * [identifier], or `null` if there is no such child.
+   */
+  ElementImpl getChild(String identifier) => null;
+
+  @override
+  String getExtendedDisplayName(String shortName) {
+    if (shortName == null) {
+      shortName = displayName;
+    }
+    Source source = this.source;
+    if (source != null) {
+      return "$shortName (${source.fullName})";
+    }
+    return shortName;
+  }
+
+  /**
+   * Return the resolved [AstNode] of the given type enclosing [getNameOffset].
+   */
+  AstNode getNodeMatching(Predicate<AstNode> predicate) {
+    CompilationUnit unit = this.unit;
+    if (unit == null) {
+      return null;
+    }
+    int offset = nameOffset;
+    AstNode node = new NodeLocator(offset).searchWithin(unit);
+    if (node == null) {
+      return null;
+    }
+    return node.getAncestor(predicate);
+  }
+
+  /**
+   * Return `true` if this element has the given [modifier] associated with it.
+   */
+  bool hasModifier(Modifier modifier) =>
+      BooleanArray.getEnum(_modifiers, modifier);
+
+  @override
+  bool isAccessibleIn(LibraryElement library) {
+    if (Identifier.isPrivateName(_name)) {
+      return library == this.library;
+    }
+    return true;
+  }
+
+  /**
+   * If the given [child] is not `null`, use the given [visitor] to visit it.
+   */
+  void safelyVisitChild(Element child, ElementVisitor visitor) {
+    if (child != null) {
+      child.accept(visitor);
+    }
+  }
+
+  /**
+   * Use the given [visitor] to visit all of the [children] in the given array.
+   */
+  void safelyVisitChildren(List<Element> children, ElementVisitor visitor) {
+    if (children != null) {
+      for (Element child in children) {
+        child.accept(visitor);
+      }
+    }
+  }
+
+  /**
+   * Set whether the given [modifier] is associated with this element to
+   * correspond to the given [value].
+   */
+  void setModifier(Modifier modifier, bool value) {
+    _modifiers = BooleanArray.setEnum(_modifiers, modifier, value);
+  }
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    appendTo(buffer);
+    return buffer.toString();
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    // There are no children to visit
+  }
+}
+
+/**
+ * The enumeration `ElementKind` defines the various kinds of elements in the
+ * element model.
+ */
+class ElementKind extends Enum<ElementKind> {
+  static const ElementKind CLASS = const ElementKind('CLASS', 0, "class");
+
+  static const ElementKind COMPILATION_UNIT =
+      const ElementKind('COMPILATION_UNIT', 1, "compilation unit");
+
+  static const ElementKind CONSTRUCTOR =
+      const ElementKind('CONSTRUCTOR', 2, "constructor");
+
+  static const ElementKind DYNAMIC =
+      const ElementKind('DYNAMIC', 3, "<dynamic>");
+
+  static const ElementKind EMBEDDED_HTML_SCRIPT =
+      const ElementKind('EMBEDDED_HTML_SCRIPT', 4, "embedded html script");
+
+  static const ElementKind ERROR = const ElementKind('ERROR', 5, "<error>");
+
+  static const ElementKind EXPORT =
+      const ElementKind('EXPORT', 6, "export directive");
+
+  static const ElementKind EXTERNAL_HTML_SCRIPT =
+      const ElementKind('EXTERNAL_HTML_SCRIPT', 7, "external html script");
+
+  static const ElementKind FIELD = const ElementKind('FIELD', 8, "field");
+
+  static const ElementKind FUNCTION =
+      const ElementKind('FUNCTION', 9, "function");
+
+  static const ElementKind GETTER = const ElementKind('GETTER', 10, "getter");
+
+  static const ElementKind HTML = const ElementKind('HTML', 11, "html");
+
+  static const ElementKind IMPORT =
+      const ElementKind('IMPORT', 12, "import directive");
+
+  static const ElementKind LABEL = const ElementKind('LABEL', 13, "label");
+
+  static const ElementKind LIBRARY =
+      const ElementKind('LIBRARY', 14, "library");
+
+  static const ElementKind LOCAL_VARIABLE =
+      const ElementKind('LOCAL_VARIABLE', 15, "local variable");
+
+  static const ElementKind METHOD = const ElementKind('METHOD', 16, "method");
+
+  static const ElementKind NAME = const ElementKind('NAME', 17, "<name>");
+
+  static const ElementKind PARAMETER =
+      const ElementKind('PARAMETER', 18, "parameter");
+
+  static const ElementKind PREFIX =
+      const ElementKind('PREFIX', 19, "import prefix");
+
+  static const ElementKind SETTER = const ElementKind('SETTER', 20, "setter");
+
+  static const ElementKind TOP_LEVEL_VARIABLE =
+      const ElementKind('TOP_LEVEL_VARIABLE', 21, "top level variable");
+
+  static const ElementKind FUNCTION_TYPE_ALIAS =
+      const ElementKind('FUNCTION_TYPE_ALIAS', 22, "function type alias");
+
+  static const ElementKind TYPE_PARAMETER =
+      const ElementKind('TYPE_PARAMETER', 23, "type parameter");
+
+  static const ElementKind UNIVERSE =
+      const ElementKind('UNIVERSE', 24, "<universe>");
+
+  static const List<ElementKind> values = const [
+    CLASS,
+    COMPILATION_UNIT,
+    CONSTRUCTOR,
+    DYNAMIC,
+    EMBEDDED_HTML_SCRIPT,
+    ERROR,
+    EXPORT,
+    EXTERNAL_HTML_SCRIPT,
+    FIELD,
+    FUNCTION,
+    GETTER,
+    HTML,
+    IMPORT,
+    LABEL,
+    LIBRARY,
+    LOCAL_VARIABLE,
+    METHOD,
+    NAME,
+    PARAMETER,
+    PREFIX,
+    SETTER,
+    TOP_LEVEL_VARIABLE,
+    FUNCTION_TYPE_ALIAS,
+    TYPE_PARAMETER,
+    UNIVERSE
+  ];
+
+  /**
+   * The name displayed in the UI for this kind of element.
+   */
+  final String displayName;
+
+  /**
+   * Initialize a newly created element kind to have the given [displayName].
+   */
+  const ElementKind(String name, int ordinal, this.displayName)
+      : super(name, ordinal);
+
+  /**
+   * Return the kind of the given [element], or [ERROR] if the element is
+   * `null`. This is a utility method that can reduce the need for null checks
+   * in other places.
+   */
+  static ElementKind of(Element element) {
+    if (element == null) {
+      return ERROR;
+    }
+    return element.kind;
+  }
+}
+
+/**
+ * The location of an element within the element model.
+ */
+abstract class ElementLocation {
+  /**
+   * Return the path to the element whose location is represented by this
+   * object. Clients must not modify the returned array.
+   */
+  List<String> get components;
+
+  /**
+   * Return an encoded representation of this location that can be used to
+   * create a location that is equal to this location.
+   */
+  String get encoding;
+}
+
+/**
+ * A concrete implementation of an [ElementLocation].
+ */
+class ElementLocationImpl implements ElementLocation {
+  /**
+   * The character used to separate components in the encoded form.
+   */
+  static int _SEPARATOR_CHAR = 0x3B;
+
+  /**
+   * The path to the element whose location is represented by this object.
+   */
+  List<String> _components;
+
+  /**
+   * The object managing [indexKeyId] and [indexLocationId].
+   */
+  Object indexOwner;
+
+  /**
+   * A cached id of this location in index.
+   */
+  int indexKeyId;
+
+  /**
+   * A cached id of this location in index.
+   */
+  int indexLocationId;
+
+  /**
+   * Initialize a newly created location to represent the given [element].
+   */
+  ElementLocationImpl.con1(Element element) {
+    List<String> components = new List<String>();
+    Element ancestor = element;
+    while (ancestor != null) {
+      components.insert(0, (ancestor as ElementImpl).identifier);
+      ancestor = ancestor.enclosingElement;
+    }
+    this._components = components;
+  }
+
+  /**
+   * Initialize a newly created location from the given [encoding].
+   */
+  ElementLocationImpl.con2(String encoding) {
+    this._components = _decode(encoding);
+  }
+
+  /**
+   * Initialize a newly created location from the given [components].
+   */
+  ElementLocationImpl.con3(List<String> components) {
+    this._components = components;
+  }
+
+  @override
+  List<String> get components => _components;
+
+  @override
+  String get encoding {
+    StringBuffer buffer = new StringBuffer();
+    int length = _components.length;
+    for (int i = 0; i < length; i++) {
+      if (i > 0) {
+        buffer.writeCharCode(_SEPARATOR_CHAR);
+      }
+      _encode(buffer, _components[i]);
+    }
+    return buffer.toString();
+  }
+
+  @override
+  int get hashCode {
+    int result = 1;
+    for (int i = 0; i < _components.length; i++) {
+      String component = _components[i];
+      result = 31 * result + component.hashCode;
+    }
+    return result;
+  }
+
+  @override
+  bool operator ==(Object object) {
+    if (identical(this, object)) {
+      return true;
+    }
+    if (object is! ElementLocationImpl) {
+      return false;
+    }
+    ElementLocationImpl location = object as ElementLocationImpl;
+    List<String> otherComponents = location._components;
+    int length = _components.length;
+    if (otherComponents.length != length) {
+      return false;
+    }
+    for (int i = 0; i < length; i++) {
+      if (_components[i] != otherComponents[i]) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  @override
+  String toString() => encoding;
+
+  /**
+   * Decode the [encoding] of a location into a list of components and return
+   * the components.
+   */
+  List<String> _decode(String encoding) {
+    List<String> components = new List<String>();
+    StringBuffer buffer = new StringBuffer();
+    int index = 0;
+    int length = encoding.length;
+    while (index < length) {
+      int currentChar = encoding.codeUnitAt(index);
+      if (currentChar == _SEPARATOR_CHAR) {
+        if (index + 1 < length &&
+            encoding.codeUnitAt(index + 1) == _SEPARATOR_CHAR) {
+          buffer.writeCharCode(_SEPARATOR_CHAR);
+          index += 2;
+        } else {
+          components.add(buffer.toString());
+          buffer = new StringBuffer();
+          index++;
+        }
+      } else {
+        buffer.writeCharCode(currentChar);
+        index++;
+      }
+    }
+    components.add(buffer.toString());
+    return components;
+  }
+
+  /**
+   * Append an encoded form of the given [component] to the given [buffer].
+   */
+  void _encode(StringBuffer buffer, String component) {
+    int length = component.length;
+    for (int i = 0; i < length; i++) {
+      int currentChar = component.codeUnitAt(i);
+      if (currentChar == _SEPARATOR_CHAR) {
+        buffer.writeCharCode(_SEPARATOR_CHAR);
+      }
+      buffer.writeCharCode(currentChar);
+    }
+  }
+}
+
+/**
+ * An object that can be used to visit an element structure.
+ */
+abstract class ElementVisitor<R> {
+  R visitClassElement(ClassElement element);
+
+  R visitCompilationUnitElement(CompilationUnitElement element);
+
+  R visitConstructorElement(ConstructorElement element);
+
+  @deprecated
+  R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element);
+
+  R visitExportElement(ExportElement element);
+
+  @deprecated
+  R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element);
+
+  R visitFieldElement(FieldElement element);
+
+  R visitFieldFormalParameterElement(FieldFormalParameterElement element);
+
+  R visitFunctionElement(FunctionElement element);
+
+  R visitFunctionTypeAliasElement(FunctionTypeAliasElement element);
+
+  @deprecated
+  R visitHtmlElement(HtmlElement element);
+
+  R visitImportElement(ImportElement element);
+
+  R visitLabelElement(LabelElement element);
+
+  R visitLibraryElement(LibraryElement element);
+
+  R visitLocalVariableElement(LocalVariableElement element);
+
+  R visitMethodElement(MethodElement element);
+
+  R visitMultiplyDefinedElement(MultiplyDefinedElement element);
+
+  R visitParameterElement(ParameterElement element);
+
+  R visitPrefixElement(PrefixElement element);
+
+  R visitPropertyAccessorElement(PropertyAccessorElement element);
+
+  R visitTopLevelVariableElement(TopLevelVariableElement element);
+
+  R visitTypeParameterElement(TypeParameterElement element);
+}
+
+/**
+ * A script tag in an HTML file having content that defines a Dart library.
+ */
+@deprecated
+abstract class EmbeddedHtmlScriptElement implements HtmlScriptElement {
+  /**
+   * Return the library element defined by the content of the script tag.
+   */
+  LibraryElement get scriptLibrary;
+}
+
+/**
+ * A concrete implementation of an [EmbeddedHtmlScriptElement].
+ */
+@deprecated
+class EmbeddedHtmlScriptElementImpl extends HtmlScriptElementImpl
+    implements EmbeddedHtmlScriptElement {
+  /**
+   * The library defined by the script tag's content.
+   */
+  LibraryElement _scriptLibrary;
+
+  /**
+   * Initialize a newly created script element to represent the given [node].
+   */
+  EmbeddedHtmlScriptElementImpl(XmlTagNode node) : super(node);
+
+  @override
+  ElementKind get kind => ElementKind.EMBEDDED_HTML_SCRIPT;
+
+  @override
+  LibraryElement get scriptLibrary => _scriptLibrary;
+
+  /**
+   * Set the script library defined by the script tag's content to the given
+   * [library].
+   */
+  void set scriptLibrary(LibraryElementImpl library) {
+    library.enclosingElement = this;
+    _scriptLibrary = library;
+  }
+
+  @override
+  accept(ElementVisitor visitor) =>
+      visitor.visitEmbeddedHtmlScriptElement(this);
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    safelyVisitChild(_scriptLibrary, visitor);
+  }
+}
+
+/**
+ * An element representing an executable object, including functions, methods,
+ * constructors, getters, and setters.
+ */
+abstract class ExecutableElement implements Element {
+  /**
+   * An empty list of executable elements.
+   */
+  static const List<ExecutableElement> EMPTY_LIST = const <ExecutableElement>[];
+
+  /**
+   * Return a list containing all of the functions defined within this
+   * executable element.
+   */
+  List<FunctionElement> get functions;
+
+  /**
+   * Return `true` if this executable element did not have an explicit return
+   * type specified for it in the original source. Note that if there was no
+   * explicit return type, and if the element model is fully populated, then
+   * the [returnType] will not be `null`.
+   */
+  bool get hasImplicitReturnType;
+
+  /**
+   * Return `true` if this executable element is abstract. Executable elements
+   * are abstract if they are not external and have no body.
+   */
+  bool get isAbstract;
+
+  /**
+   * Return `true` if this executable element has body marked as being
+   * asynchronous.
+   */
+  bool get isAsynchronous;
+
+  /**
+   * Return `true` if this executable element is external. Executable elements
+   * are external if they are explicitly marked as such using the 'external'
+   * keyword.
+   */
+  bool get isExternal;
+
+  /**
+   * Return `true` if this executable element has a body marked as being a
+   * generator.
+   */
+  bool get isGenerator;
+
+  /**
+   * Return `true` if this executable element is an operator. The test may be
+   * based on the name of the executable element, in which case the result will
+   * be correct when the name is legal.
+   */
+  bool get isOperator;
+
+  /**
+   * Return `true` if this element is a static element. A static element is an
+   * element that is not associated with a particular instance, but rather with
+   * an entire library or class.
+   */
+  bool get isStatic;
+
+  /**
+   * Return `true` if this executable element has a body marked as being
+   * synchronous.
+   */
+  bool get isSynchronous;
+
+  /**
+   * Return a list containing all of the labels defined within this executable
+   * element.
+   */
+  List<LabelElement> get labels;
+
+  /**
+   * Return a list containing all of the local variables defined within this
+   * executable element.
+   */
+  List<LocalVariableElement> get localVariables;
+
+  /**
+   * Return a list containing all of the parameters defined by this executable
+   * element.
+   */
+  List<ParameterElement> get parameters;
+
+  /**
+   * Return the return type defined by this executable element. If the element
+   * model is fully populated, then the [returnType] will not be `null`, even
+   * if no return type was explicitly specified.
+   */
+  DartType get returnType;
+
+  /**
+   * Return the type of function defined by this executable element.
+   */
+  FunctionType get type;
+
+  /**
+   * Return a list containing all of the type parameters defined for this
+   * executable element.
+   */
+  List<TypeParameterElement> get typeParameters;
+}
+
+/**
+ * A base class for concrete implementations of an [ExecutableElement].
+ */
+abstract class ExecutableElementImpl extends ElementImpl
+    implements ExecutableElement {
+  /**
+   * An empty list of executable elements.
+   */
+  @deprecated // Use ExecutableElement.EMPTY_LIST
+  static const List<ExecutableElement> EMPTY_ARRAY =
+      const <ExecutableElement>[];
+
+  /**
+   * A list containing all of the functions defined within this executable
+   * element.
+   */
+  List<FunctionElement> _functions = FunctionElement.EMPTY_LIST;
+
+  /**
+   * A list containing all of the labels defined within this executable element.
+   */
+  List<LabelElement> _labels = LabelElement.EMPTY_LIST;
+
+  /**
+   * A list containing all of the local variables defined within this executable
+   * element.
+   */
+  List<LocalVariableElement> _localVariables = LocalVariableElement.EMPTY_LIST;
+
+  /**
+   * A list containing all of the parameters defined by this executable element.
+   */
+  List<ParameterElement> _parameters = ParameterElement.EMPTY_LIST;
+
+  /**
+   * A list containing all of the type parameters defined for this executable
+   * element.
+   */
+  List<TypeParameterElement> _typeParameters = TypeParameterElement.EMPTY_LIST;
+
+  /**
+   * The return type defined by this executable element.
+   */
+  DartType returnType;
+
+  /**
+   * The type of function defined by this executable element.
+   */
+  FunctionType type;
+
+  /**
+   * Initialize a newly created executable element to have the given [name] and
+   * [offset].
+   */
+  ExecutableElementImpl(String name, int offset) : super(name, offset);
+
+  /**
+   * Initialize a newly created executable element to have the given [name].
+   */
+  ExecutableElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  /**
+   * Set whether this executable element's body is asynchronous.
+   */
+  void set asynchronous(bool isAsynchronous) {
+    setModifier(Modifier.ASYNCHRONOUS, isAsynchronous);
+  }
+
+  /**
+   * Set whether this executable element is external.
+   */
+  void set external(bool isExternal) {
+    setModifier(Modifier.EXTERNAL, isExternal);
+  }
+
+  @override
+  List<FunctionElement> get functions => _functions;
+
+  /**
+   * Set the functions defined within this executable element to the given
+   * [functions].
+   */
+  void set functions(List<FunctionElement> functions) {
+    for (FunctionElement function in functions) {
+      (function as FunctionElementImpl).enclosingElement = this;
+    }
+    this._functions = functions;
+  }
+
+  /**
+   * Set whether this method's body is a generator.
+   */
+  void set generator(bool isGenerator) {
+    setModifier(Modifier.GENERATOR, isGenerator);
+  }
+
+  @override
+  bool get hasImplicitReturnType => hasModifier(Modifier.IMPLICIT_TYPE);
+
+  /**
+   * Set whether this executable element has an implicit return type.
+   */
+  void set hasImplicitReturnType(bool hasImplicitReturnType) {
+    setModifier(Modifier.IMPLICIT_TYPE, hasImplicitReturnType);
+  }
+
+  @override
+  bool get isAbstract => hasModifier(Modifier.ABSTRACT);
+
+  @override
+  bool get isAsynchronous => hasModifier(Modifier.ASYNCHRONOUS);
+
+  @override
+  bool get isExternal => hasModifier(Modifier.EXTERNAL);
+
+  @override
+  bool get isGenerator => hasModifier(Modifier.GENERATOR);
+
+  @override
+  bool get isOperator => false;
+
+  @override
+  bool get isSynchronous => !hasModifier(Modifier.ASYNCHRONOUS);
+
+  @override
+  List<LabelElement> get labels => _labels;
+
+  /**
+   * Set the labels defined within this executable element to the given
+   * [labels].
+   */
+  void set labels(List<LabelElement> labels) {
+    for (LabelElement label in labels) {
+      (label as LabelElementImpl).enclosingElement = this;
+    }
+    this._labels = labels;
+  }
+
+  @override
+  List<LocalVariableElement> get localVariables => _localVariables;
+
+  /**
+   * Set the local variables defined within this executable element to the given
+   * [variables].
+   */
+  void set localVariables(List<LocalVariableElement> variables) {
+    for (LocalVariableElement variable in variables) {
+      (variable as LocalVariableElementImpl).enclosingElement = this;
+    }
+    this._localVariables = variables;
+  }
+
+  @override
+  List<ParameterElement> get parameters => _parameters;
+
+  /**
+   * Set the parameters defined by this executable element to the given
+   * [parameters].
+   */
+  void set parameters(List<ParameterElement> parameters) {
+    for (ParameterElement parameter in parameters) {
+      (parameter as ParameterElementImpl).enclosingElement = this;
+    }
+    this._parameters = parameters;
+  }
+
+  @override
+  List<TypeParameterElement> get typeParameters => _typeParameters;
+
+  /**
+   * Set the type parameters defined by this executable element to the given
+   * [typeParameters].
+   */
+  void set typeParameters(List<TypeParameterElement> typeParameters) {
+    for (TypeParameterElement parameter in typeParameters) {
+      (parameter as TypeParameterElementImpl).enclosingElement = this;
+    }
+    this._typeParameters = typeParameters;
+  }
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    if (this.kind != ElementKind.GETTER) {
+      int typeParameterCount = _typeParameters.length;
+      if (typeParameterCount > 0) {
+        buffer.write('<');
+        for (int i = 0; i < typeParameterCount; i++) {
+          if (i > 0) {
+            buffer.write(", ");
+          }
+          (_typeParameters[i] as TypeParameterElementImpl).appendTo(buffer);
+        }
+        buffer.write('>');
+      }
+      buffer.write("(");
+      String closing = null;
+      ParameterKind kind = ParameterKind.REQUIRED;
+      int parameterCount = _parameters.length;
+      for (int i = 0; i < parameterCount; i++) {
+        if (i > 0) {
+          buffer.write(", ");
+        }
+        ParameterElementImpl parameter = _parameters[i] as ParameterElementImpl;
+        ParameterKind parameterKind = parameter.parameterKind;
+        if (parameterKind != kind) {
+          if (closing != null) {
+            buffer.write(closing);
+          }
+          if (parameterKind == ParameterKind.POSITIONAL) {
+            buffer.write("[");
+            closing = "]";
+          } else if (parameterKind == ParameterKind.NAMED) {
+            buffer.write("{");
+            closing = "}";
+          } else {
+            closing = null;
+          }
+        }
+        kind = parameterKind;
+        parameter.appendToWithoutDelimiters(buffer);
+      }
+      if (closing != null) {
+        buffer.write(closing);
+      }
+      buffer.write(")");
+    }
+    if (type != null) {
+      buffer.write(Element.RIGHT_ARROW);
+      buffer.write(type.returnType);
+    }
+  }
+
+  @override
+  ElementImpl getChild(String identifier) {
+    for (ExecutableElement function in _functions) {
+      if ((function as ExecutableElementImpl).identifier == identifier) {
+        return function as ExecutableElementImpl;
+      }
+    }
+    for (LabelElement label in _labels) {
+      if ((label as LabelElementImpl).identifier == identifier) {
+        return label as LabelElementImpl;
+      }
+    }
+    for (VariableElement variable in _localVariables) {
+      if ((variable as VariableElementImpl).identifier == identifier) {
+        return variable as VariableElementImpl;
+      }
+    }
+    for (ParameterElement parameter in _parameters) {
+      if ((parameter as ParameterElementImpl).identifier == identifier) {
+        return parameter as ParameterElementImpl;
+      }
+    }
+    return null;
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChildren(_functions, visitor);
+    safelyVisitChildren(_labels, visitor);
+    safelyVisitChildren(_localVariables, visitor);
+    safelyVisitChildren(_parameters, visitor);
+  }
+}
+
+/**
+ * An executable element defined in a parameterized type where the values of the
+ * type parameters are known.
+ */
+abstract class ExecutableMember extends Member implements ExecutableElement {
+  /**
+   * Initialize a newly created element to represent a constructor, based on the
+   * [baseElement], defined by the [definingType].
+   */
+  ExecutableMember(ExecutableElement baseElement, InterfaceType definingType)
+      : super(baseElement, definingType);
+
+  @override
+  ExecutableElement get baseElement => super.baseElement as ExecutableElement;
+
+  @override
+  List<FunctionElement> get functions {
+    //
+    // Elements within this element should have type parameters substituted,
+    // just like this element.
+    //
+    throw new UnsupportedOperationException();
+//    return getBaseElement().getFunctions();
+  }
+
+  @override
+  bool get hasImplicitReturnType => baseElement.hasImplicitReturnType;
+
+  @override
+  bool get isAbstract => baseElement.isAbstract;
+
+  @override
+  bool get isAsynchronous => baseElement.isAsynchronous;
+
+  @override
+  bool get isExternal => baseElement.isExternal;
+
+  @override
+  bool get isGenerator => baseElement.isGenerator;
+
+  @override
+  bool get isOperator => baseElement.isOperator;
+
+  @override
+  bool get isStatic => baseElement.isStatic;
+
+  @override
+  bool get isSynchronous => baseElement.isSynchronous;
+
+  @override
+  List<LabelElement> get labels => baseElement.labels;
+
+  @override
+  List<LocalVariableElement> get localVariables {
+    //
+    // Elements within this element should have type parameters substituted,
+    // just like this element.
+    //
+    throw new UnsupportedOperationException();
+//    return getBaseElement().getLocalVariables();
+  }
+
+  @override
+  List<ParameterElement> get parameters {
+    List<ParameterElement> baseParameters = baseElement.parameters;
+    int parameterCount = baseParameters.length;
+    if (parameterCount == 0) {
+      return baseParameters;
+    }
+    List<ParameterElement> parameterizedParameters =
+        new List<ParameterElement>(parameterCount);
+    for (int i = 0; i < parameterCount; i++) {
+      parameterizedParameters[i] =
+          ParameterMember.from(baseParameters[i], definingType);
+    }
+    return parameterizedParameters;
+  }
+
+  @override
+  DartType get returnType => substituteFor(baseElement.returnType);
+
+  @override
+  FunctionType get type => substituteFor(baseElement.type);
+
+  @override
+  List<TypeParameterElement> get typeParameters => baseElement.typeParameters;
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    // TODO(brianwilkerson) We need to finish implementing the accessors used
+    // below so that we can safely invoke them.
+    super.visitChildren(visitor);
+    safelyVisitChildren(baseElement.functions, visitor);
+    safelyVisitChildren(labels, visitor);
+    safelyVisitChildren(baseElement.localVariables, visitor);
+    safelyVisitChildren(parameters, visitor);
+  }
+}
+
+/**
+ * An export directive within a library.
+ */
+abstract class ExportElement implements Element, UriReferencedElement {
+  /**
+   * An empty list of export elements.
+   */
+  @deprecated // Use ExportElement.EMPTY_LIST
+  static const List<ExportElement> EMPTY_ARRAY = const <ExportElement>[];
+
+  /**
+   * An empty list of export elements.
+   */
+  static const List<ExportElement> EMPTY_LIST = const <ExportElement>[];
+
+  /**
+   * Return a list containing the combinators that were specified as part of the
+   * export directive in the order in which they were specified.
+   */
+  List<NamespaceCombinator> get combinators;
+
+  /**
+   * Return the library that is exported from this library by this export
+   * directive.
+   */
+  LibraryElement get exportedLibrary;
+}
+
+/**
+ * A concrete implementation of an [ExportElement].
+ */
+class ExportElementImpl extends UriReferencedElementImpl
+    implements ExportElement {
+  /**
+   * The library that is exported from this library by this export directive.
+   */
+  LibraryElement exportedLibrary;
+
+  /**
+   * The combinators that were specified as part of the export directive in the
+   * order in which they were specified.
+   */
+  List<NamespaceCombinator> combinators = NamespaceCombinator.EMPTY_LIST;
+
+  /**
+   * Initialize a newly created export element at the given [offset].
+   */
+  ExportElementImpl(int offset) : super(null, offset);
+
+  @override
+  String get identifier => exportedLibrary.name;
+
+  @override
+  ElementKind get kind => ElementKind.EXPORT;
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitExportElement(this);
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    buffer.write("export ");
+    (exportedLibrary as LibraryElementImpl).appendTo(buffer);
+  }
+}
+
+/**
+ * A script tag in an HTML file having a `source` attribute that references a
+ * Dart library source file.
+ */
+@deprecated
+abstract class ExternalHtmlScriptElement implements HtmlScriptElement {
+  /**
+   * Return the source referenced by this element, or `null` if this element
+   * does not reference a Dart library source file.
+   */
+  Source get scriptSource;
+}
+
+/**
+ * A concrete implementation of an [ExternalHtmlScriptElement].
+ */
+@deprecated
+class ExternalHtmlScriptElementImpl extends HtmlScriptElementImpl
+    implements ExternalHtmlScriptElement {
+  /**
+   * The source specified in the `source` attribute or `null` if unspecified.
+   */
+  Source scriptSource;
+
+  /**
+   * Initialize a newly created script element to correspond to the given
+   * [node].
+   */
+  ExternalHtmlScriptElementImpl(XmlTagNode node) : super(node);
+
+  @override
+  ElementKind get kind => ElementKind.EXTERNAL_HTML_SCRIPT;
+
+  @override
+  accept(ElementVisitor visitor) =>
+      visitor.visitExternalHtmlScriptElement(this);
+}
+
+/**
+ * A field defined within a type.
+ */
+abstract class FieldElement
+    implements ClassMemberElement, PropertyInducingElement {
+  /**
+   * An empty list of field elements.
+   */
+  static const List<FieldElement> EMPTY_LIST = const <FieldElement>[];
+
+  /**
+   * Return {@code true} if this element is an enum constant.
+   */
+  bool get isEnumConstant;
+
+  /**
+   * Return the resolved [VariableDeclaration] or [EnumConstantDeclaration]
+   * node that declares this [FieldElement].
+   *
+   * This method is expensive, because resolved AST might be evicted from cache,
+   * so parsing and resolving will be performed.
+   */
+  @override
+  AstNode computeNode();
+}
+
+/**
+ * A concrete implementation of a [FieldElement].
+ */
+class FieldElementImpl extends PropertyInducingElementImpl
+    with PotentiallyConstVariableElement
+    implements FieldElement {
+  /**
+   * An empty list of field elements.
+   */
+  @deprecated // Use FieldElement.EMPTY_LIST
+  static const List<FieldElement> EMPTY_ARRAY = const <FieldElement>[];
+
+  /**
+   * Initialize a newly created synthetic field element to have the given [name]
+   * at the given [offset].
+   */
+  FieldElementImpl(String name, int offset) : super(name, offset);
+
+  /**
+   * Initialize a newly created field element to have the given [name].
+   */
+  FieldElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  @override
+  ClassElement get enclosingElement => super.enclosingElement as ClassElement;
+
+  @override
+  bool get isEnumConstant =>
+      enclosingElement != null ? enclosingElement.isEnum : false;
+
+  @override
+  ElementKind get kind => ElementKind.FIELD;
+
+  /**
+   * Set whether this field is static.
+   */
+  void set static(bool isStatic) {
+    setModifier(Modifier.STATIC, isStatic);
+  }
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitFieldElement(this);
+
+  @override
+  AstNode computeNode() {
+    if (isEnumConstant) {
+      return getNodeMatching((node) => node is EnumConstantDeclaration);
+    } else {
+      return getNodeMatching((node) => node is VariableDeclaration);
+    }
+  }
+}
+
+/**
+ * A field formal parameter defined within a constructor element.
+ */
+abstract class FieldFormalParameterElement implements ParameterElement {
+  /**
+   * Return the field element associated with this field formal parameter, or
+   * `null` if the parameter references a field that doesn't exist.
+   */
+  FieldElement get field;
+}
+
+/**
+ * A [ParameterElementImpl] that has the additional information of the
+ * [FieldElement] associated with the parameter.
+ */
+class FieldFormalParameterElementImpl extends ParameterElementImpl
+    implements FieldFormalParameterElement {
+  /**
+   * The field associated with this field formal parameter.
+   */
+  FieldElement field;
+
+  /**
+   * Initialize a newly created parameter element to have the given [name].
+   */
+  FieldFormalParameterElementImpl(Identifier name) : super.forNode(name);
+
+  @override
+  bool get isInitializingFormal => true;
+
+  @override
+  accept(ElementVisitor visitor) =>
+      visitor.visitFieldFormalParameterElement(this);
+}
+
+/**
+ * A parameter element defined in a parameterized type where the values of the
+ * type parameters are known.
+ */
+class FieldFormalParameterMember extends ParameterMember
+    implements FieldFormalParameterElement {
+  /**
+   * Initialize a newly created element to represent a constructor, based on the
+   * [baseElement], defined by the [definingType].
+   */
+  FieldFormalParameterMember(
+      FieldFormalParameterElement baseElement, ParameterizedType definingType)
+      : super(baseElement, definingType);
+
+  @override
+  FieldElement get field {
+    FieldElement field = (baseElement as FieldFormalParameterElement).field;
+    if (field is FieldElement) {
+      return FieldMember.from(field, definingType);
+    }
+    return field;
+  }
+
+  @override
+  accept(ElementVisitor visitor) =>
+      visitor.visitFieldFormalParameterElement(this);
+}
+
+/**
+ * A field element defined in a parameterized type where the values of the type
+ * parameters are known.
+ */
+class FieldMember extends VariableMember implements FieldElement {
+  /**
+   * Initialize a newly created element to represent a constructor, based on the
+   * [baseElement], defined by the [definingType].
+   */
+  FieldMember(FieldElement baseElement, InterfaceType definingType)
+      : super(baseElement, definingType);
+
+  @override
+  FieldElement get baseElement => super.baseElement as FieldElement;
+
+  @override
+  InterfaceType get definingType => super.definingType as InterfaceType;
+
+  @override
+  ClassElement get enclosingElement => baseElement.enclosingElement;
+
+  @override
+  PropertyAccessorElement get getter =>
+      PropertyAccessorMember.from(baseElement.getter, definingType);
+
+  @override
+  bool get isEnumConstant => baseElement.isEnumConstant;
+
+  @override
+  DartType get propagatedType => substituteFor(baseElement.propagatedType);
+
+  @override
+  PropertyAccessorElement get setter =>
+      PropertyAccessorMember.from(baseElement.setter, definingType);
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitFieldElement(this);
+
+  @override
+  VariableDeclaration computeNode() => baseElement.computeNode();
+
+  @override
+  String toString() => '$type $displayName';
+
+  /**
+   * If the given [field]'s type is different when any type parameters from the
+   * defining type's declaration are replaced with the actual type arguments
+   * from the [definingType], create a field member representing the given
+   * field. Return the member that was created, or the base field if no member
+   * was created.
+   */
+  static FieldElement from(FieldElement field, InterfaceType definingType) {
+    if (!_isChangedByTypeSubstitution(field, definingType)) {
+      return field;
+    }
+    // TODO(brianwilkerson) Consider caching the substituted type in the
+    // instance. It would use more memory but speed up some operations.
+    // We need to see how often the type is being re-computed.
+    return new FieldMember(field, definingType);
+  }
+
+  /**
+   * Determine whether the given [field]'s type is changed when type parameters
+   * from the [definingType]'s declaration are replaced with the actual type
+   * arguments from the defining type.
+   */
+  static bool _isChangedByTypeSubstitution(
+      FieldElement field, InterfaceType definingType) {
+    List<DartType> argumentTypes = definingType.typeArguments;
+    if (field != null && argumentTypes.length != 0) {
+      DartType baseType = field.type;
+      List<DartType> parameterTypes = definingType.element.type.typeArguments;
+      if (baseType != null) {
+        DartType substitutedType =
+            baseType.substitute2(argumentTypes, parameterTypes);
+        if (baseType != substitutedType) {
+          return true;
+        }
+      }
+      // If the field has a propagated type, then we need to check whether the
+      // propagated type needs substitution.
+      DartType basePropagatedType = field.propagatedType;
+      if (basePropagatedType != null) {
+        DartType substitutedPropagatedType =
+            basePropagatedType.substitute2(argumentTypes, parameterTypes);
+        if (basePropagatedType != substitutedPropagatedType) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+}
+
+/**
+ * A (non-method) function. This can be either a top-level function, a local
+ * function, a closure, or the initialization expression for a field or
+ * variable.
+ */
+abstract class FunctionElement implements ExecutableElement, LocalElement {
+  /**
+   * An empty list of function elements.
+   */
+  static const List<FunctionElement> EMPTY_LIST = const <FunctionElement>[];
+
+  /**
+   * The name of the method that can be implemented by a class to allow its
+   * instances to be invoked as if they were a function.
+   */
+  static final String CALL_METHOD_NAME = "call";
+
+  /**
+   * The name of the synthetic function defined for libraries that are deferred.
+   */
+  static final String LOAD_LIBRARY_NAME = "loadLibrary";
+
+  /**
+   * The name of the function used as an entry point.
+   */
+  static const String MAIN_FUNCTION_NAME = "main";
+
+  /**
+   * The name of the method that will be invoked if an attempt is made to invoke
+   * an undefined method on an object.
+   */
+  static final String NO_SUCH_METHOD_METHOD_NAME = "noSuchMethod";
+
+  /**
+   * Return `true` if the function is an entry point, i.e. a top-level function
+   * and has the name `main`.
+   */
+  bool get isEntryPoint;
+
+  /**
+   * Return the resolved function declaration node that declares this element.
+   *
+   * This method is expensive, because resolved AST might be evicted from cache,
+   * so parsing and resolving will be performed.
+   */
+  @override
+  FunctionDeclaration computeNode();
+}
+
+/**
+ * A concrete implementation of a [FunctionElement].
+ */
+class FunctionElementImpl extends ExecutableElementImpl
+    implements FunctionElement {
+  /**
+   * An empty list of function elements.
+   */
+  @deprecated // Use FunctionElement.EMPTY_LIST
+  static const List<FunctionElement> EMPTY_ARRAY = const <FunctionElement>[];
+
+  /**
+   * The offset to the beginning of the visible range for this element.
+   */
+  int _visibleRangeOffset = 0;
+
+  /**
+   * The length of the visible range for this element, or `-1` if this element
+   * does not have a visible range.
+   */
+  int _visibleRangeLength = -1;
+
+  /**
+   * Initialize a newly created function element to have the given [name] and
+   * [offset].
+   */
+  FunctionElementImpl(String name, int offset) : super(name, offset);
+
+  /**
+   * Initialize a newly created function element to have the given [name].
+   */
+  FunctionElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  /**
+   * Initialize a newly created function element to have no name and the given
+   * [offset]. This is used for function expressions, that have no name.
+   */
+  FunctionElementImpl.forOffset(int nameOffset) : super("", nameOffset);
+
+  @override
+  String get identifier {
+    String identifier = super.identifier;
+    if (!isStatic) {
+      identifier += "@$nameOffset";
+    }
+    return identifier;
+  }
+
+  @override
+  bool get isEntryPoint {
+    return isStatic && displayName == FunctionElement.MAIN_FUNCTION_NAME;
+  }
+
+  @override
+  bool get isStatic => enclosingElement is CompilationUnitElement;
+
+  @override
+  ElementKind get kind => ElementKind.FUNCTION;
+
+  @override
+  SourceRange get visibleRange {
+    if (_visibleRangeLength < 0) {
+      return null;
+    }
+    return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
+  }
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitFunctionElement(this);
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    String name = displayName;
+    if (name != null) {
+      buffer.write(name);
+    }
+    super.appendTo(buffer);
+  }
+
+  @override
+  FunctionDeclaration computeNode() =>
+      getNodeMatching((node) => node is FunctionDeclaration);
+
+  /**
+   * Set the visible range for this element to the range starting at the given
+   * [offset] with the given [length].
+   */
+  void setVisibleRange(int offset, int length) {
+    _visibleRangeOffset = offset;
+    _visibleRangeLength = length;
+  }
+}
+
+/**
+ * The type of a function, method, constructor, getter, or setter. Function
+ * types come in three variations:
+ *
+ * * The types of functions that only have required parameters. These have the
+ *   general form <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T</i>.
+ * * The types of functions with optional positional parameters. These have the
+ *   general form <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, [T<sub>n+1</sub>
+ *   &hellip;, T<sub>n+k</sub>]) &rarr; T</i>.
+ * * The types of functions with named parameters. These have the general form
+ *   <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {T<sub>x1</sub> x1, &hellip;,
+ *   T<sub>xk</sub> xk}) &rarr; T</i>.
+ */
+abstract class FunctionType implements ParameterizedType {
+  /**
+   * Return a map from the names of named parameters to the types of the named
+   * parameters of this type of function. The entries in the map will be
+   * iterated in the same order as the order in which the named parameters were
+   * defined. If there were no named parameters declared then the map will be
+   * empty.
+   */
+  Map<String, DartType> get namedParameterTypes;
+
+  /**
+   * Return a list containing the types of the normal parameters of this type of
+   * function. The parameter types are in the same order as they appear in the
+   * declaration of the function.
+   */
+  List<DartType> get normalParameterTypes;
+
+  /**
+   * Return a map from the names of optional (positional) parameters to the
+   * types of the optional parameters of this type of function. The entries in
+   * the map will be iterated in the same order as the order in which the
+   * optional parameters were defined. If there were no optional parameters
+   * declared then the map will be empty.
+   */
+  List<DartType> get optionalParameterTypes;
+
+  /**
+   * Return a list containing the parameters elements of this type of function.
+   * The parameter types are in the same order as they appear in the declaration
+   * of the function.
+   */
+  List<ParameterElement> get parameters;
+
+  /**
+   * Return the type of object returned by this type of function.
+   */
+  DartType get returnType;
+
+  /**
+   * Return `true` if this type is a subtype of the given [type].
+   *
+   * A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T</i> is
+   * a subtype of the function type <i>(S<sub>1</sub>, &hellip;, S<sub>n</sub>)
+   * &rarr; S</i>, if all of the following conditions are met:
+   *
+   * * Either
+   *   * <i>S</i> is void, or
+   *   * <i>T &hArr; S</i>.
+   *
+   * * For all <i>i</i>, 1 <= <i>i</i> <= <i>n</i>, <i>T<sub>i</sub> &hArr;
+   *   S<sub>i</sub></i>.
+   *
+   * A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>,
+   * [T<sub>n+1</sub>, &hellip;, T<sub>n+k</sub>]) &rarr; T</i> is a subtype of
+   * the function type <i>(S<sub>1</sub>, &hellip;, S<sub>n</sub>,
+   * [S<sub>n+1</sub>, &hellip;, S<sub>n+m</sub>]) &rarr; S</i>, if all of the
+   * following conditions are met:
+   *
+   * * Either
+   *   * <i>S</i> is void, or
+   *   * <i>T &hArr; S</i>.
+   *
+   * * <i>k</i> >= <i>m</i> and for all <i>i</i>, 1 <= <i>i</i> <= <i>n+m</i>,
+   *   <i>T<sub>i</sub> &hArr; S<sub>i</sub></i>.
+   *
+   * A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>,
+   * {T<sub>x1</sub> x1, &hellip;, T<sub>xk</sub> xk}) &rarr; T</i> is a subtype
+   * of the function type <i>(S<sub>1</sub>, &hellip;, S<sub>n</sub>,
+   * {S<sub>y1</sub> y1, &hellip;, S<sub>ym</sub> ym}) &rarr; S</i>, if all of
+   * the following conditions are met:
+   * * Either
+   *   * <i>S</i> is void,
+   *   * or <i>T &hArr; S</i>.
+   *
+   * * For all <i>i</i>, 1 <= <i>i</i> <= <i>n</i>, <i>T<sub>i</sub> &hArr;
+   *   S<sub>i</sub></i>.
+   * * <i>k</i> >= <i>m</i> and <i>y<sub>i</sub></i> in <i>{x<sub>1</sub>,
+   *   &hellip;, x<sub>k</sub>}</i>, 1 <= <i>i</i> <= <i>m</i>.
+   * * For all <i>y<sub>i</sub></i> in <i>{y<sub>1</sub>, &hellip;,
+   *   y<sub>m</sub>}</i>, <i>y<sub>i</sub> = x<sub>j</sub> => Tj &hArr; Si</i>.
+   *
+   * In addition, the following subtype rules apply:
+   *
+   * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, []) &rarr; T <: (T<sub>1</sub>,
+   * &hellip;, T<sub>n</sub>) &rarr; T.</i><br>
+   * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T <: (T<sub>1</sub>,
+   * &hellip;, T<sub>n</sub>, {}) &rarr; T.</i><br>
+   * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {}) &rarr; T <: (T<sub>1</sub>,
+   * &hellip;, T<sub>n</sub>) &rarr; T.</i><br>
+   * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T <: (T<sub>1</sub>,
+   * &hellip;, T<sub>n</sub>, []) &rarr; T.</i>
+   *
+   * All functions implement the class `Function`. However not all function
+   * types are a subtype of `Function`. If an interface type <i>I</i> includes a
+   * method named `call()`, and the type of `call()` is the function type
+   * <i>F</i>, then <i>I</i> is considered to be a subtype of <i>F</i>.
+   */
+  @override
+  bool isSubtypeOf(DartType type);
+
+  @override
+  FunctionType substitute2(
+      List<DartType> argumentTypes, List<DartType> parameterTypes);
+
+  /**
+   * Return the type resulting from substituting the given [argumentTypes] for
+   * this type's parameters. This is fully equivalent to
+   * `substitute(argumentTypes, getTypeArguments())`.
+   */
+  FunctionType substitute3(List<DartType> argumentTypes);
+}
+
+/**
+ * A function type alias (`typedef`).
+ */
+abstract class FunctionTypeAliasElement implements TypeDefiningElement {
+  /**
+   * An empty array of type alias elements.
+   */
+  static List<FunctionTypeAliasElement> EMPTY_LIST =
+      new List<FunctionTypeAliasElement>(0);
+
+  /**
+   * Return the compilation unit in which this type alias is defined.
+   */
+  @override
+  CompilationUnitElement get enclosingElement;
+
+  /**
+   * Return a list containing all of the parameters defined by this type alias.
+   */
+  List<ParameterElement> get parameters;
+
+  /**
+   * Return the return type defined by this type alias.
+   */
+  DartType get returnType;
+
+  @override
+  FunctionType get type;
+
+  /**
+   * Return a list containing all of the type parameters defined for this type.
+   */
+  List<TypeParameterElement> get typeParameters;
+
+  /**
+   * Return the resolved function type alias node that declares this element.
+   *
+   * This method is expensive, because resolved AST might be evicted from cache,
+   * so parsing and resolving will be performed.
+   */
+  @override
+  FunctionTypeAlias computeNode();
+}
+
+/**
+ * A concrete implementation of a [FunctionTypeAliasElement].
+ */
+class FunctionTypeAliasElementImpl extends ElementImpl
+    implements FunctionTypeAliasElement {
+  /**
+   * An empty array of type alias elements.
+   */
+  @deprecated // Use FunctionTypeAliasElement.EMPTY_LIST
+  static List<FunctionTypeAliasElement> EMPTY_ARRAY =
+      new List<FunctionTypeAliasElement>(0);
+
+  /**
+   * A list containing all of the parameters defined by this type alias.
+   */
+  List<ParameterElement> _parameters = ParameterElement.EMPTY_LIST;
+
+  /**
+   * The return type defined by this type alias.
+   */
+  DartType returnType;
+
+  /**
+   * The type of function defined by this type alias.
+   */
+  FunctionType type;
+
+  /**
+   * A list containing all of the type parameters defined for this type.
+   */
+  List<TypeParameterElement> _typeParameters = TypeParameterElement.EMPTY_LIST;
+
+  /**
+   * Initialize a newly created type alias element to have the given name.
+   *
+   * [name] the name of this element
+   * [nameOffset] the offset of the name of this element in the file that
+   *    contains the declaration of this element
+   */
+  FunctionTypeAliasElementImpl(String name, int nameOffset)
+      : super(name, nameOffset);
+
+  /**
+   * Initialize a newly created type alias element to have the given [name].
+   */
+  FunctionTypeAliasElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  @override
+  CompilationUnitElement get enclosingElement =>
+      super.enclosingElement as CompilationUnitElement;
+
+  @override
+  ElementKind get kind => ElementKind.FUNCTION_TYPE_ALIAS;
+
+  @override
+  List<ParameterElement> get parameters => _parameters;
+
+  /**
+   * Set the parameters defined by this type alias to the given [parameters].
+   */
+  void set parameters(List<ParameterElement> parameters) {
+    if (parameters != null) {
+      for (ParameterElement parameter in parameters) {
+        (parameter as ParameterElementImpl).enclosingElement = this;
+      }
+    }
+    this._parameters = parameters;
+  }
+
+  @override
+  List<TypeParameterElement> get typeParameters => _typeParameters;
+
+  /**
+   * Set the type parameters defined for this type to the given
+   * [typeParameters].
+   */
+  void set typeParameters(List<TypeParameterElement> typeParameters) {
+    for (TypeParameterElement typeParameter in typeParameters) {
+      (typeParameter as TypeParameterElementImpl).enclosingElement = this;
+    }
+    this._typeParameters = typeParameters;
+  }
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitFunctionTypeAliasElement(this);
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    buffer.write("typedef ");
+    buffer.write(displayName);
+    int typeParameterCount = _typeParameters.length;
+    if (typeParameterCount > 0) {
+      buffer.write("<");
+      for (int i = 0; i < typeParameterCount; i++) {
+        if (i > 0) {
+          buffer.write(", ");
+        }
+        (_typeParameters[i] as TypeParameterElementImpl).appendTo(buffer);
+      }
+      buffer.write(">");
+    }
+    buffer.write("(");
+    int parameterCount = _parameters.length;
+    for (int i = 0; i < parameterCount; i++) {
+      if (i > 0) {
+        buffer.write(", ");
+      }
+      (_parameters[i] as ParameterElementImpl).appendTo(buffer);
+    }
+    buffer.write(")");
+    if (type != null) {
+      buffer.write(Element.RIGHT_ARROW);
+      buffer.write(type.returnType);
+    } else if (returnType != null) {
+      buffer.write(Element.RIGHT_ARROW);
+      buffer.write(returnType);
+    }
+  }
+
+  @override
+  FunctionTypeAlias computeNode() =>
+      getNodeMatching((node) => node is FunctionTypeAlias);
+
+  @override
+  ElementImpl getChild(String identifier) {
+    for (VariableElement parameter in _parameters) {
+      if ((parameter as VariableElementImpl).identifier == identifier) {
+        return parameter as VariableElementImpl;
+      }
+    }
+    for (TypeParameterElement typeParameter in _typeParameters) {
+      if ((typeParameter as TypeParameterElementImpl).identifier ==
+          identifier) {
+        return typeParameter as TypeParameterElementImpl;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Set the parameters defined by this type alias to the given [parameters]
+   * without becoming the parent of the parameters. This should only be used by
+   * the [TypeResolverVisitor] when creating a synthetic type alias.
+   */
+  void shareParameters(List<ParameterElement> parameters) {
+    this._parameters = parameters;
+  }
+
+  /**
+   * Set the type parameters defined for this type to the given [typeParameters]
+   * without becoming the parent of the parameters. This should only be used by
+   * the [TypeResolverVisitor] when creating a synthetic type alias.
+   */
+  void shareTypeParameters(List<TypeParameterElement> typeParameters) {
+    this._typeParameters = typeParameters;
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChildren(_parameters, visitor);
+    safelyVisitChildren(_typeParameters, visitor);
+  }
+}
+
+/**
+ * The type of a function, method, constructor, getter, or setter.
+ */
+class FunctionTypeImpl extends TypeImpl implements FunctionType {
+  /**
+   * A list containing the actual types of the type arguments.
+   */
+  List<DartType> typeArguments = DartType.EMPTY_LIST;
+
+  /**
+   * The set of typedefs which should not be expanded when exploring this type,
+   * to avoid creating infinite types in response to self-referential typedefs.
+   */
+  final List<FunctionTypeAliasElement> prunedTypedefs;
+
+  /**
+   * Initialize a newly created function type to be declared by the given
+   * [element].
+   */
+  FunctionTypeImpl(ExecutableElement element, [this.prunedTypedefs])
+      : super(element, null);
+
+  /**
+   * Initialize a newly created function type to be declared by the given
+   * [element].
+   */
+  @deprecated // Use new FunctionTypeImpl(element)
+  FunctionTypeImpl.con1(ExecutableElement element)
+      : prunedTypedefs = null,
+        super(element, null);
+
+  /**
+   * Initialize a newly created function type to be declared by the given
+   * [element].
+   */
+  @deprecated // Use new FunctionTypeImpl.forTypedef(element)
+  FunctionTypeImpl.con2(FunctionTypeAliasElement element)
+      : prunedTypedefs = null,
+        super(element, element == null ? null : element.name);
+
+  /**
+   * Initialize a newly created function type to be declared by the given
+   * [element].
+   */
+  FunctionTypeImpl.forTypedef(FunctionTypeAliasElement element,
+      [this.prunedTypedefs])
+      : super(element, element == null ? null : element.name);
+
+  /**
+   * Private constructor.
+   */
+  FunctionTypeImpl._(Element element, String name, this.prunedTypedefs)
+      : super(element, name);
+
+  /**
+   * Return the base parameter elements of this function element.
+   */
+  List<ParameterElement> get baseParameters {
+    Element element = this.element;
+    if (element is ExecutableElement) {
+      return element.parameters;
+    } else {
+      return (element as FunctionTypeAliasElement).parameters;
+    }
+  }
+
+  /**
+   * Return the return type defined by this function's element.
+   */
+  DartType get baseReturnType {
+    Element element = this.element;
+    if (element is ExecutableElement) {
+      return element.returnType;
+    } else {
+      return (element as FunctionTypeAliasElement).returnType;
+    }
+  }
+
+  @override
+  String get displayName {
+    String name = this.name;
+    if (name == null || name.length == 0) {
+      // Function types have an empty name when they are defined implicitly by
+      // either a closure or as part of a parameter declaration.
+      List<DartType> normalParameterTypes = this.normalParameterTypes;
+      List<DartType> optionalParameterTypes = this.optionalParameterTypes;
+      Map<String, DartType> namedParameterTypes = this.namedParameterTypes;
+      DartType returnType = this.returnType;
+      StringBuffer buffer = new StringBuffer();
+      buffer.write("(");
+      bool needsComma = false;
+      if (normalParameterTypes.length > 0) {
+        for (DartType type in normalParameterTypes) {
+          if (needsComma) {
+            buffer.write(", ");
+          } else {
+            needsComma = true;
+          }
+          buffer.write(type.displayName);
+        }
+      }
+      if (optionalParameterTypes.length > 0) {
+        if (needsComma) {
+          buffer.write(", ");
+          needsComma = false;
+        }
+        buffer.write("[");
+        for (DartType type in optionalParameterTypes) {
+          if (needsComma) {
+            buffer.write(", ");
+          } else {
+            needsComma = true;
+          }
+          buffer.write(type.displayName);
+        }
+        buffer.write("]");
+        needsComma = true;
+      }
+      if (namedParameterTypes.length > 0) {
+        if (needsComma) {
+          buffer.write(", ");
+          needsComma = false;
+        }
+        buffer.write("{");
+        namedParameterTypes.forEach((String name, DartType type) {
+          if (needsComma) {
+            buffer.write(", ");
+          } else {
+            needsComma = true;
+          }
+          buffer.write(name);
+          buffer.write(": ");
+          buffer.write(type.displayName);
+        });
+        buffer.write("}");
+        needsComma = true;
+      }
+      buffer.write(")");
+      buffer.write(Element.RIGHT_ARROW);
+      if (returnType == null) {
+        buffer.write("null");
+      } else {
+        buffer.write(returnType.displayName);
+      }
+      name = buffer.toString();
+    }
+    return name;
+  }
+
+  @override
+  int get hashCode {
+    if (element == null) {
+      return 0;
+    }
+    // Reference the arrays of parameters
+    List<DartType> normalParameterTypes = this.normalParameterTypes;
+    List<DartType> optionalParameterTypes = this.optionalParameterTypes;
+    Iterable<DartType> namedParameterTypes = this.namedParameterTypes.values;
+    // Generate the hashCode
+    int code = (returnType as TypeImpl).hashCode;
+    for (int i = 0; i < normalParameterTypes.length; i++) {
+      code = (code << 1) + (normalParameterTypes[i] as TypeImpl).hashCode;
+    }
+    for (int i = 0; i < optionalParameterTypes.length; i++) {
+      code = (code << 1) + (optionalParameterTypes[i] as TypeImpl).hashCode;
+    }
+    for (DartType type in namedParameterTypes) {
+      code = (code << 1) + (type as TypeImpl).hashCode;
+    }
+    return code;
+  }
+
+  @override
+  Map<String, DartType> get namedParameterTypes {
+    LinkedHashMap<String, DartType> namedParameterTypes =
+        new LinkedHashMap<String, DartType>();
+    List<ParameterElement> parameters = baseParameters;
+    if (parameters.length == 0) {
+      return namedParameterTypes;
+    }
+    List<DartType> typeParameters =
+        TypeParameterTypeImpl.getTypes(this.typeParameters);
+    for (ParameterElement parameter in parameters) {
+      if (parameter.parameterKind == ParameterKind.NAMED) {
+        DartType type = parameter.type;
+        if (typeArguments.length != 0 &&
+            typeArguments.length == typeParameters.length) {
+          type = (type as TypeImpl)
+              .substitute2(typeArguments, typeParameters, newPrune);
+        } else {
+          type = (type as TypeImpl).pruned(newPrune);
+        }
+        namedParameterTypes[parameter.name] = type;
+      }
+    }
+    return namedParameterTypes;
+  }
+
+  /**
+   * Determine the new set of typedefs which should be pruned when expanding
+   * this function type.
+   */
+  List<FunctionTypeAliasElement> get newPrune {
+    Element element = this.element;
+    if (element is FunctionTypeAliasElement && !element.isSynthetic) {
+      // This typedef should be pruned, along with anything that was previously
+      // pruned.
+      if (prunedTypedefs == null) {
+        return <FunctionTypeAliasElement>[element];
+      } else {
+        return new List<FunctionTypeAliasElement>.from(prunedTypedefs)
+          ..add(element);
+      }
+    } else {
+      // This is not a typedef, so nothing additional needs to be pruned.
+      return prunedTypedefs;
+    }
+  }
+
+  @override
+  List<DartType> get normalParameterTypes {
+    List<ParameterElement> parameters = baseParameters;
+    if (parameters.length == 0) {
+      return DartType.EMPTY_LIST;
+    }
+    List<DartType> typeParameters =
+        TypeParameterTypeImpl.getTypes(this.typeParameters);
+    List<DartType> types = new List<DartType>();
+    for (ParameterElement parameter in parameters) {
+      if (parameter.parameterKind == ParameterKind.REQUIRED) {
+        DartType type = parameter.type;
+        if (typeArguments.length != 0 &&
+            typeArguments.length == typeParameters.length) {
+          type = (type as TypeImpl)
+              .substitute2(typeArguments, typeParameters, newPrune);
+        } else {
+          type = (type as TypeImpl).pruned(newPrune);
+        }
+        types.add(type);
+      }
+    }
+    return types;
+  }
+
+  @override
+  List<DartType> get optionalParameterTypes {
+    List<ParameterElement> parameters = baseParameters;
+    if (parameters.length == 0) {
+      return DartType.EMPTY_LIST;
+    }
+    List<DartType> typeParameters =
+        TypeParameterTypeImpl.getTypes(this.typeParameters);
+    List<DartType> types = new List<DartType>();
+    for (ParameterElement parameter in parameters) {
+      if (parameter.parameterKind == ParameterKind.POSITIONAL) {
+        DartType type = parameter.type;
+        if (typeArguments.length != 0 &&
+            typeArguments.length == typeParameters.length) {
+          type = (type as TypeImpl)
+              .substitute2(typeArguments, typeParameters, newPrune);
+        } else {
+          type = (type as TypeImpl).pruned(newPrune);
+        }
+        types.add(type);
+      }
+    }
+    return types;
+  }
+
+  @override
+  List<ParameterElement> get parameters {
+    List<ParameterElement> baseParameters = this.baseParameters;
+    // no parameters, quick return
+    int parameterCount = baseParameters.length;
+    if (parameterCount == 0) {
+      return baseParameters;
+    }
+    // create specialized parameters
+    List<ParameterElement> specializedParameters =
+        new List<ParameterElement>(parameterCount);
+    for (int i = 0; i < parameterCount; i++) {
+      specializedParameters[i] = ParameterMember.from(baseParameters[i], this);
+    }
+    return specializedParameters;
+  }
+
+  @override
+  DartType get returnType {
+    DartType baseReturnType = this.baseReturnType;
+    if (baseReturnType == null) {
+      // TODO(brianwilkerson) This is a patch. The return type should never be
+      // null and we need to understand why it is and fix it.
+      return DynamicTypeImpl.instance;
+    }
+    // If there are no arguments to substitute, or if the arguments size doesn't
+    // match the parameter size, return the base return type.
+    if (typeArguments.length == 0 ||
+        typeArguments.length != typeParameters.length) {
+      return (baseReturnType as TypeImpl).pruned(newPrune);
+    }
+    return (baseReturnType as TypeImpl).substitute2(typeArguments,
+        TypeParameterTypeImpl.getTypes(typeParameters), newPrune);
+  }
+
+  @override
+  List<TypeParameterElement> get typeParameters {
+    Element element = this.element;
+    if (element is FunctionTypeAliasElement) {
+      return element.typeParameters;
+    }
+    ClassElement definingClass =
+        element.getAncestor((element) => element is ClassElement);
+    if (definingClass != null) {
+      return definingClass.typeParameters;
+    }
+    return TypeParameterElement.EMPTY_LIST;
+  }
+
+  @override
+  bool operator ==(Object object) {
+    if (object is! FunctionTypeImpl) {
+      return false;
+    }
+    FunctionTypeImpl otherType = object as FunctionTypeImpl;
+    return returnType == otherType.returnType &&
+        TypeImpl.equalArrays(
+            normalParameterTypes, otherType.normalParameterTypes) &&
+        TypeImpl.equalArrays(
+            optionalParameterTypes, otherType.optionalParameterTypes) &&
+        _equals(namedParameterTypes, otherType.namedParameterTypes);
+  }
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    List<DartType> normalParameterTypes = this.normalParameterTypes;
+    List<DartType> optionalParameterTypes = this.optionalParameterTypes;
+    Map<String, DartType> namedParameterTypes = this.namedParameterTypes;
+    DartType returnType = this.returnType;
+    buffer.write("(");
+    bool needsComma = false;
+    if (normalParameterTypes.length > 0) {
+      for (DartType type in normalParameterTypes) {
+        if (needsComma) {
+          buffer.write(", ");
+        } else {
+          needsComma = true;
+        }
+        (type as TypeImpl).appendTo(buffer);
+      }
+    }
+    if (optionalParameterTypes.length > 0) {
+      if (needsComma) {
+        buffer.write(", ");
+        needsComma = false;
+      }
+      buffer.write("[");
+      for (DartType type in optionalParameterTypes) {
+        if (needsComma) {
+          buffer.write(", ");
+        } else {
+          needsComma = true;
+        }
+        (type as TypeImpl).appendTo(buffer);
+      }
+      buffer.write("]");
+      needsComma = true;
+    }
+    if (namedParameterTypes.length > 0) {
+      if (needsComma) {
+        buffer.write(", ");
+        needsComma = false;
+      }
+      buffer.write("{");
+      namedParameterTypes.forEach((String name, DartType type) {
+        if (needsComma) {
+          buffer.write(", ");
+        } else {
+          needsComma = true;
+        }
+        buffer.write(name);
+        buffer.write(": ");
+        (type as TypeImpl).appendTo(buffer);
+      });
+      buffer.write("}");
+      needsComma = true;
+    }
+    buffer.write(")");
+    buffer.write(Element.RIGHT_ARROW);
+    if (returnType == null) {
+      buffer.write("null");
+    } else {
+      (returnType as TypeImpl).appendTo(buffer);
+    }
+  }
+
+  @override
+  bool isAssignableTo(DartType type) {
+    // A function type T may be assigned to a function type S, written T <=> S,
+    // iff T <: S.
+    return isSubtypeOf(type);
+  }
+
+  @override
+  bool isMoreSpecificThan(DartType type,
+      [bool withDynamic = false, Set<Element> visitedElements]) {
+    // Note: visitedElements is only used for breaking recursion in the type
+    // hierarchy; we don't use it when recursing into the function type.
+
+    // trivial base cases
+    if (type == null) {
+      return false;
+    } else if (identical(this, type) ||
+        type.isDynamic ||
+        type.isDartCoreFunction ||
+        type.isObject) {
+      return true;
+    } else if (type is! FunctionType) {
+      return false;
+    } else if (this == type) {
+      return true;
+    }
+    FunctionType t = this;
+    FunctionType s = type as FunctionType;
+    List<DartType> tTypes = t.normalParameterTypes;
+    List<DartType> tOpTypes = t.optionalParameterTypes;
+    List<DartType> sTypes = s.normalParameterTypes;
+    List<DartType> sOpTypes = s.optionalParameterTypes;
+    // If one function has positional and the other has named parameters,
+    // return false.
+    if ((sOpTypes.length > 0 && t.namedParameterTypes.length > 0) ||
+        (tOpTypes.length > 0 && s.namedParameterTypes.length > 0)) {
+      return false;
+    }
+    // named parameters case
+    if (t.namedParameterTypes.length > 0) {
+      // check that the number of required parameters are equal, and check that
+      // every t_i is more specific than every s_i
+      if (t.normalParameterTypes.length != s.normalParameterTypes.length) {
+        return false;
+      } else if (t.normalParameterTypes.length > 0) {
+        for (int i = 0; i < tTypes.length; i++) {
+          if (!(tTypes[i] as TypeImpl)
+              .isMoreSpecificThan(sTypes[i], withDynamic)) {
+            return false;
+          }
+        }
+      }
+      Map<String, DartType> namedTypesT = t.namedParameterTypes;
+      Map<String, DartType> namedTypesS = s.namedParameterTypes;
+      // if k >= m is false, return false: the passed function type has more
+      // named parameter types than this
+      if (namedTypesT.length < namedTypesS.length) {
+        return false;
+      }
+      // Loop through each element in S verifying that T has a matching
+      // parameter name and that the corresponding type is more specific then
+      // the type in S.
+      for (String keyS in namedTypesS.keys) {
+        DartType typeT = namedTypesT[keyS];
+        if (typeT == null) {
+          return false;
+        }
+        if (!(typeT as TypeImpl)
+            .isMoreSpecificThan(namedTypesS[keyS], withDynamic)) {
+          return false;
+        }
+      }
+    } else if (s.namedParameterTypes.length > 0) {
+      return false;
+    } else {
+      // positional parameter case
+      int tArgLength = tTypes.length + tOpTypes.length;
+      int sArgLength = sTypes.length + sOpTypes.length;
+      // Check that the total number of parameters in t is greater than or equal
+      // to the number of parameters in s and that the number of required
+      // parameters in s is greater than or equal to the number of required
+      // parameters in t.
+      if (tArgLength < sArgLength || sTypes.length < tTypes.length) {
+        return false;
+      }
+      if (tOpTypes.length == 0 && sOpTypes.length == 0) {
+        // No positional arguments, don't copy contents to new array
+        for (int i = 0; i < sTypes.length; i++) {
+          if (!(tTypes[i] as TypeImpl)
+              .isMoreSpecificThan(sTypes[i], withDynamic)) {
+            return false;
+          }
+        }
+      } else {
+        // Else, we do have positional parameters, copy required and positional
+        // parameter types into arrays to do the compare (for loop below).
+        List<DartType> tAllTypes = new List<DartType>(sArgLength);
+        for (int i = 0; i < tTypes.length; i++) {
+          tAllTypes[i] = tTypes[i];
+        }
+        for (int i = tTypes.length, j = 0; i < sArgLength; i++, j++) {
+          tAllTypes[i] = tOpTypes[j];
+        }
+        List<DartType> sAllTypes = new List<DartType>(sArgLength);
+        for (int i = 0; i < sTypes.length; i++) {
+          sAllTypes[i] = sTypes[i];
+        }
+        for (int i = sTypes.length, j = 0; i < sArgLength; i++, j++) {
+          sAllTypes[i] = sOpTypes[j];
+        }
+        for (int i = 0; i < sAllTypes.length; i++) {
+          if (!(tAllTypes[i] as TypeImpl)
+              .isMoreSpecificThan(sAllTypes[i], withDynamic)) {
+            return false;
+          }
+        }
+      }
+    }
+    DartType tRetType = t.returnType;
+    DartType sRetType = s.returnType;
+    return sRetType.isVoid ||
+        (tRetType as TypeImpl).isMoreSpecificThan(sRetType, withDynamic);
+  }
+
+  @override
+  bool isSubtypeOf(DartType type) {
+    // trivial base cases
+    if (type == null) {
+      return false;
+    } else if (identical(this, type) ||
+        type.isDynamic ||
+        type.isDartCoreFunction ||
+        type.isObject) {
+      return true;
+    } else if (type is! FunctionType) {
+      return false;
+    } else if (this == type) {
+      return true;
+    }
+    FunctionType t = this;
+    FunctionType s = type as FunctionType;
+    List<DartType> tTypes = t.normalParameterTypes;
+    List<DartType> tOpTypes = t.optionalParameterTypes;
+    List<DartType> sTypes = s.normalParameterTypes;
+    List<DartType> sOpTypes = s.optionalParameterTypes;
+    // If one function has positional and the other has named parameters,
+    // return false.
+    if ((sOpTypes.length > 0 && t.namedParameterTypes.length > 0) ||
+        (tOpTypes.length > 0 && s.namedParameterTypes.length > 0)) {
+      return false;
+    }
+    // named parameters case
+    if (t.namedParameterTypes.length > 0) {
+      // check that the number of required parameters are equal,
+      // and check that every t_i is assignable to every s_i
+      if (t.normalParameterTypes.length != s.normalParameterTypes.length) {
+        return false;
+      } else if (t.normalParameterTypes.length > 0) {
+        for (int i = 0; i < tTypes.length; i++) {
+          if (!(tTypes[i] as TypeImpl).isAssignableTo(sTypes[i])) {
+            return false;
+          }
+        }
+      }
+      Map<String, DartType> namedTypesT = t.namedParameterTypes;
+      Map<String, DartType> namedTypesS = s.namedParameterTypes;
+      // if k >= m is false, return false: the passed function type has more
+      // named parameter types than this
+      if (namedTypesT.length < namedTypesS.length) {
+        return false;
+      }
+      // Loop through each element in S verifying that T has a matching
+      // parameter name and that the corresponding type is assignable to the
+      // type in S.
+      for (String keyS in namedTypesS.keys) {
+        DartType typeT = namedTypesT[keyS];
+        if (typeT == null) {
+          return false;
+        }
+        if (!(typeT as TypeImpl).isAssignableTo(namedTypesS[keyS])) {
+          return false;
+        }
+      }
+    } else if (s.namedParameterTypes.length > 0) {
+      return false;
+    } else {
+      // positional parameter case
+      int tArgLength = tTypes.length + tOpTypes.length;
+      int sArgLength = sTypes.length + sOpTypes.length;
+      // Check that the total number of parameters in t is greater than or
+      // equal to the number of parameters in s and that the number of
+      // required parameters in s is greater than or equal to the number of
+      // required parameters in t.
+      if (tArgLength < sArgLength || sTypes.length < tTypes.length) {
+        return false;
+      }
+      if (tOpTypes.length == 0 && sOpTypes.length == 0) {
+        // No positional arguments, don't copy contents to new array
+        for (int i = 0; i < sTypes.length; i++) {
+          if (!(tTypes[i] as TypeImpl).isAssignableTo(sTypes[i])) {
+            return false;
+          }
+        }
+      } else {
+        // Else, we do have positional parameters, copy required and
+        // positional parameter types into arrays to do the compare (for loop
+        // below).
+        List<DartType> tAllTypes = new List<DartType>(sArgLength);
+        for (int i = 0; i < tTypes.length; i++) {
+          tAllTypes[i] = tTypes[i];
+        }
+        for (int i = tTypes.length, j = 0; i < sArgLength; i++, j++) {
+          tAllTypes[i] = tOpTypes[j];
+        }
+        List<DartType> sAllTypes = new List<DartType>(sArgLength);
+        for (int i = 0; i < sTypes.length; i++) {
+          sAllTypes[i] = sTypes[i];
+        }
+        for (int i = sTypes.length, j = 0; i < sArgLength; i++, j++) {
+          sAllTypes[i] = sOpTypes[j];
+        }
+        for (int i = 0; i < sAllTypes.length; i++) {
+          if (!(tAllTypes[i] as TypeImpl).isAssignableTo(sAllTypes[i])) {
+            return false;
+          }
+        }
+      }
+    }
+    DartType tRetType = t.returnType;
+    DartType sRetType = s.returnType;
+    return sRetType.isVoid || (tRetType as TypeImpl).isAssignableTo(sRetType);
+  }
+
+  @override
+  TypeImpl pruned(List<FunctionTypeAliasElement> prune) {
+    if (prune == null) {
+      return this;
+    } else if (prune.contains(element)) {
+      // Circularity found.  Prune the type declaration.
+      return new CircularTypeImpl();
+    } else {
+      // There should never be a reason to prune a type that has already been
+      // pruned, since pruning is only done when expanding a function type
+      // alias, and function type aliases are always expanded by starting with
+      // base types.
+      assert(this.prunedTypedefs == null);
+      FunctionTypeImpl result = new FunctionTypeImpl._(element, name, prune);
+      result.typeArguments =
+          typeArguments.map((TypeImpl t) => t.pruned(prune)).toList();
+      return result;
+    }
+  }
+
+  @override
+  DartType substitute2(
+      List<DartType> argumentTypes, List<DartType> parameterTypes,
+      [List<FunctionTypeAliasElement> prune]) {
+    // Pruned types should only ever result from peforming type variable
+    // substitution, and it doesn't make sense to substitute again after
+    // substituting once.
+    assert(this.prunedTypedefs == null);
+    if (argumentTypes.length != parameterTypes.length) {
+      throw new IllegalArgumentException(
+          "argumentTypes.length (${argumentTypes.length}) != parameterTypes.length (${parameterTypes.length})");
+    }
+    Element element = this.element;
+    if (prune != null && prune.contains(element)) {
+      // Circularity found.  Prune the type declaration.
+      return new CircularTypeImpl();
+    }
+    if (argumentTypes.length == 0) {
+      return this.pruned(prune);
+    }
+    FunctionTypeImpl newType = (element is ExecutableElement)
+        ? new FunctionTypeImpl(element, prune)
+        : new FunctionTypeImpl.forTypedef(
+            element as FunctionTypeAliasElement, prune);
+    newType.typeArguments =
+        TypeImpl.substitute(typeArguments, argumentTypes, parameterTypes);
+    return newType;
+  }
+
+  @override
+  FunctionTypeImpl substitute3(List<DartType> argumentTypes) =>
+      substitute2(argumentTypes, typeArguments);
+
+  /**
+   * Compute the least upper bound of types [f] and [g], both of which are
+   * known to be function types.
+   *
+   * In the event that f and g have different numbers of required parameters,
+   * `null` is returned, in which case the least upper bound is the interface
+   * type `Function`.
+   */
+  static FunctionType computeLeastUpperBound(FunctionType f, FunctionType g) {
+    // TODO(paulberry): implement this.
+    return null;
+  }
+
+  /**
+   * Return `true` if all of the name/type pairs in the first map ([firstTypes])
+   * are equal to the corresponding name/type pairs in the second map
+   * ([secondTypes]). The maps are expected to iterate over their entries in the
+   * same order in which those entries were added to the map.
+   */
+  static bool _equals(
+      Map<String, DartType> firstTypes, Map<String, DartType> secondTypes) {
+    if (secondTypes.length != firstTypes.length) {
+      return false;
+    }
+    Iterator<String> firstKeys = firstTypes.keys.iterator;
+    Iterator<String> secondKeys = secondTypes.keys.iterator;
+    while (firstKeys.moveNext() && secondKeys.moveNext()) {
+      String firstKey = firstKeys.current;
+      String secondKey = secondKeys.current;
+      TypeImpl firstType = firstTypes[firstKey];
+      TypeImpl secondType = secondTypes[secondKey];
+      if (firstKey != secondKey || firstType != secondType) {
+        return false;
+      }
+    }
+    return true;
+  }
+}
+
+/**
+ * An element visitor that will recursively visit all of the elements in an
+ * element model (like instances of the class [RecursiveElementVisitor]). In
+ * addition, when an element of a specific type is visited not only will the
+ * visit method for that specific type of element be invoked, but additional
+ * methods for the supertypes of that element will also be invoked. For example,
+ * using an instance of this class to visit a [MethodElement] will cause the
+ * method [visitMethodElement] to be invoked but will also cause the methods
+ * [visitExecutableElement] and [visitElement] to be subsequently invoked. This
+ * allows visitors to be written that visit all executable elements without
+ * needing to override the visit method for each of the specific subclasses of
+ * [ExecutableElement].
+ *
+ * Note, however, that unlike many visitors, element visitors visit objects
+ * based on the interfaces implemented by those elements. Because interfaces
+ * form a graph structure rather than a tree structure the way classes do, and
+ * because it is generally undesirable for an object to be visited more than
+ * once, this class flattens the interface graph into a pseudo-tree. In
+ * particular, this class treats elements as if the element types were
+ * structured in the following way:
+ *
+ * <pre>
+ * Element
+ *   ClassElement
+ *   CompilationUnitElement
+ *   ExecutableElement
+ *       ConstructorElement
+ *       LocalElement
+ *           FunctionElement
+ *       MethodElement
+ *       PropertyAccessorElement
+ *   ExportElement
+ *   HtmlElement
+ *   ImportElement
+ *   LabelElement
+ *   LibraryElement
+ *   MultiplyDefinedElement
+ *   PrefixElement
+ *   TypeAliasElement
+ *   TypeParameterElement
+ *   UndefinedElement
+ *   VariableElement
+ *       PropertyInducingElement
+ *           FieldElement
+ *           TopLevelVariableElement
+ *       LocalElement
+ *           LocalVariableElement
+ *           ParameterElement
+ *               FieldFormalParameterElement
+ * </pre>
+ *
+ * Subclasses that override a visit method must either invoke the overridden
+ * visit method or explicitly invoke the more general visit method. Failure to
+ * do so will cause the visit methods for superclasses of the element to not be
+ * invoked and will cause the children of the visited node to not be visited.
+ */
+class GeneralizingElementVisitor<R> implements ElementVisitor<R> {
+  @override
+  R visitClassElement(ClassElement element) => visitElement(element);
+
+  @override
+  R visitCompilationUnitElement(CompilationUnitElement element) =>
+      visitElement(element);
+
+  @override
+  R visitConstructorElement(ConstructorElement element) =>
+      visitExecutableElement(element);
+
+  R visitElement(Element element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  @deprecated
+  R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) =>
+      visitHtmlScriptElement(element);
+
+  R visitExecutableElement(ExecutableElement element) => visitElement(element);
+
+  @override
+  R visitExportElement(ExportElement element) => visitElement(element);
+
+  @override
+  @deprecated
+  R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) =>
+      visitHtmlScriptElement(element);
+
+  @override
+  R visitFieldElement(FieldElement element) =>
+      visitPropertyInducingElement(element);
+
+  @override
+  R visitFieldFormalParameterElement(FieldFormalParameterElement element) =>
+      visitParameterElement(element);
+
+  @override
+  R visitFunctionElement(FunctionElement element) => visitLocalElement(element);
+
+  @override
+  R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) =>
+      visitElement(element);
+
+  @override
+  @deprecated
+  R visitHtmlElement(HtmlElement element) => visitElement(element);
+
+  @deprecated
+  R visitHtmlScriptElement(HtmlScriptElement element) => visitElement(element);
+
+  @override
+  R visitImportElement(ImportElement element) => visitElement(element);
+
+  @override
+  R visitLabelElement(LabelElement element) => visitElement(element);
+
+  @override
+  R visitLibraryElement(LibraryElement element) => visitElement(element);
+
+  R visitLocalElement(LocalElement element) {
+    if (element is LocalVariableElement) {
+      return visitVariableElement(element);
+    } else if (element is ParameterElement) {
+      return visitVariableElement(element);
+    } else if (element is FunctionElement) {
+      return visitExecutableElement(element);
+    }
+    return null;
+  }
+
+  @override
+  R visitLocalVariableElement(LocalVariableElement element) =>
+      visitLocalElement(element);
+
+  @override
+  R visitMethodElement(MethodElement element) =>
+      visitExecutableElement(element);
+
+  @override
+  R visitMultiplyDefinedElement(MultiplyDefinedElement element) =>
+      visitElement(element);
+
+  @override
+  R visitParameterElement(ParameterElement element) =>
+      visitLocalElement(element);
+
+  @override
+  R visitPrefixElement(PrefixElement element) => visitElement(element);
+
+  @override
+  R visitPropertyAccessorElement(PropertyAccessorElement element) =>
+      visitExecutableElement(element);
+
+  R visitPropertyInducingElement(PropertyInducingElement element) =>
+      visitVariableElement(element);
+
+  @override
+  R visitTopLevelVariableElement(TopLevelVariableElement element) =>
+      visitPropertyInducingElement(element);
+
+  @override
+  R visitTypeParameterElement(TypeParameterElement element) =>
+      visitElement(element);
+
+  R visitVariableElement(VariableElement element) => visitElement(element);
+}
+
+/**
+ * A combinator that causes some of the names in a namespace to be hidden when
+ * being imported.
+ */
+abstract class HideElementCombinator implements NamespaceCombinator {
+  /**
+   * Return a list containing the names that are not to be made visible in the
+   * importing library even if they are defined in the imported library.
+   */
+  List<String> get hiddenNames;
+}
+
+/**
+ * A concrete implementation of a [HideElementCombinator].
+ */
+class HideElementCombinatorImpl implements HideElementCombinator {
+  /**
+   * The names that are not to be made visible in the importing library even if
+   * they are defined in the imported library.
+   */
+  List<String> hiddenNames = StringUtilities.EMPTY_ARRAY;
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("show ");
+    int count = hiddenNames.length;
+    for (int i = 0; i < count; i++) {
+      if (i > 0) {
+        buffer.write(", ");
+      }
+      buffer.write(hiddenNames[i]);
+    }
+    return buffer.toString();
+  }
+}
+
+/**
+ * An HTML file.
+ */
+@deprecated
+abstract class HtmlElement implements Element {
+  /**
+   * An empty list of HTML file elements.
+   */
+  static const List<HtmlElement> EMPTY_LIST = const <HtmlElement>[];
+
+  /**
+   * Return a list containing all of the script elements contained in the HTML
+   * file. This includes scripts with libraries that are defined by the content
+   * of a script tag as well as libraries that are referenced in the `source`
+   * attribute of a script tag.
+   */
+  List<HtmlScriptElement> get scripts;
+}
+
+/**
+ * A concrete implementation of an [HtmlElement].
+ */
+@deprecated
+class HtmlElementImpl extends ElementImpl implements HtmlElement {
+  /**
+   * An empty list of HTML file elements.
+   */
+  @deprecated // Use HtmlElement.EMPTY_LIST
+  static const List<HtmlElement> EMPTY_ARRAY = const <HtmlElement>[];
+
+  /**
+   * The analysis context in which this library is defined.
+   */
+  final AnalysisContext context;
+
+  /**
+   * The scripts contained in or referenced from script tags in the HTML file.
+   */
+  List<HtmlScriptElement> _scripts = HtmlScriptElement.EMPTY_LIST;
+
+  /**
+   * The source that corresponds to this HTML file.
+   */
+  Source source;
+
+  /**
+   * Initialize a newly created HTML element in the given [context] to have the
+   * given [name].
+   */
+  HtmlElementImpl(this.context, String name) : super(name, -1);
+
+  @override
+  int get hashCode => source.hashCode;
+
+  @override
+  String get identifier => source.encoding;
+
+  @override
+  ElementKind get kind => ElementKind.HTML;
+
+  @override
+  List<HtmlScriptElement> get scripts => _scripts;
+
+  /**
+   * Set the scripts contained in the HTML file to the given [scripts].
+   */
+  void set scripts(List<HtmlScriptElement> scripts) {
+    if (scripts.length == 0) {
+      this._scripts = HtmlScriptElement.EMPTY_LIST;
+      return;
+    }
+    for (HtmlScriptElement script in scripts) {
+      (script as HtmlScriptElementImpl).enclosingElement = this;
+    }
+    this._scripts = scripts;
+  }
+
+  @override
+  bool operator ==(Object object) {
+    if (identical(object, this)) {
+      return true;
+    }
+    return object is HtmlElementImpl && source == object.source;
+  }
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitHtmlElement(this);
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    if (source == null) {
+      buffer.write("{HTML file}");
+    } else {
+      buffer.write(source.fullName);
+    }
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChildren(_scripts, visitor);
+  }
+}
+
+/**
+ * A script tag in an HTML file.
+ *
+ * See [EmbeddedHtmlScriptElement], and [ExternalHtmlScriptElement].
+ */
+@deprecated
+abstract class HtmlScriptElement implements Element {
+  /**
+   * An empty list of HTML script elements.
+   */
+  static const List<HtmlScriptElement> EMPTY_LIST = const <HtmlScriptElement>[];
+}
+
+/**
+ * A concrete implementation of an [HtmlScriptElement].
+ */
+@deprecated
+abstract class HtmlScriptElementImpl extends ElementImpl
+    implements HtmlScriptElement {
+  /**
+   * An empty list of HTML script elements.
+   */
+  @deprecated // Use HtmlScriptElement.EMPTY_LIST
+  static const List<HtmlScriptElement> EMPTY_ARRAY =
+      const <HtmlScriptElement>[];
+
+  /**
+   * Initialize a newly created script element corresponding to the given
+   * [node].
+   */
+  HtmlScriptElementImpl(XmlTagNode node)
+      : super(node.tag, node.tagToken.offset);
+}
+
+/**
+ * A single import directive within a library.
+ */
+abstract class ImportElement implements Element, UriReferencedElement {
+  /**
+   * An empty list of import elements.
+   */
+  @deprecated // Use ImportElement.EMPTY_LIST
+  static const List<ImportElement> EMPTY_ARRAY = const <ImportElement>[];
+
+  /**
+   * An empty list of import elements.
+   */
+  static const List<ImportElement> EMPTY_LIST = const <ImportElement>[];
+
+  /**
+   * Return a list containing the combinators that were specified as part of the
+   * import directive in the order in which they were specified.
+   */
+  List<NamespaceCombinator> get combinators;
+
+  /**
+   * Return the library that is imported into this library by this import
+   * directive.
+   */
+  LibraryElement get importedLibrary;
+
+  /**
+   * Return `true` if this import is for a deferred library.
+   */
+  bool get isDeferred;
+
+  /**
+   * Return the prefix that was specified as part of the import directive, or
+   * `null` if there was no prefix specified.
+   */
+  PrefixElement get prefix;
+
+  /**
+   * Return the offset of the prefix of this import in the file that contains
+   * this import directive, or `-1` if this import is synthetic, does not have a
+   * prefix, or otherwise does not have an offset.
+   */
+  int get prefixOffset;
+}
+
+/**
+ * A concrete implementation of an [ImportElement].
+ */
+class ImportElementImpl extends UriReferencedElementImpl
+    implements ImportElement {
+  /**
+   * The offset of the prefix of this import in the file that contains the this
+   * import directive, or `-1` if this import is synthetic.
+   */
+  int prefixOffset = 0;
+
+  /**
+   * The library that is imported into this library by this import directive.
+   */
+  LibraryElement importedLibrary;
+
+  /**
+   * The combinators that were specified as part of the import directive in the
+   * order in which they were specified.
+   */
+  List<NamespaceCombinator> combinators = NamespaceCombinator.EMPTY_LIST;
+
+  /**
+   * The prefix that was specified as part of the import directive, or `null` if
+   * there was no prefix specified.
+   */
+  PrefixElement prefix;
+
+  /**
+   * Initialize a newly created import element at the given [offset].
+   * The offset may be `-1` if the import is synthetic.
+   */
+  ImportElementImpl(int offset) : super(null, offset);
+
+  /**
+   * Set whether this import is for a deferred library.
+   */
+  void set deferred(bool isDeferred) {
+    setModifier(Modifier.DEFERRED, isDeferred);
+  }
+
+  @override
+  String get identifier =>
+      "${(importedLibrary as LibraryElementImpl).identifier}@$nameOffset";
+
+  @override
+  bool get isDeferred => hasModifier(Modifier.DEFERRED);
+
+  @override
+  ElementKind get kind => ElementKind.IMPORT;
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitImportElement(this);
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    buffer.write("import ");
+    (importedLibrary as LibraryElementImpl).appendTo(buffer);
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChild(prefix, visitor);
+  }
+}
+
+/**
+ * The type introduced by either a class or an interface, or a reference to such
+ * a type.
+ */
+abstract class InterfaceType implements ParameterizedType {
+  /**
+   * An empty list of types.
+   */
+  @deprecated // Use InterfaceType.EMPTY_LIST
+  static const List<InterfaceType> EMPTY_ARRAY = const <InterfaceType>[];
+
+  /**
+   * An empty list of types.
+   */
+  static const List<InterfaceType> EMPTY_LIST = const <InterfaceType>[];
+
+  /**
+   * Return a list containing all of the accessors (getters and setters)
+   * declared in this type.
+   */
+  List<PropertyAccessorElement> get accessors;
+
+  /**
+   * Return a list containing all of the constructors declared in this type.
+   */
+  List<ConstructorElement> get constructors;
+
+  @override
+  ClassElement get element;
+
+  /**
+   * Return a list containing all of the interfaces that are implemented by this
+   * interface. Note that this is <b>not</b>, in general, equivalent to getting
+   * the interfaces from this type's element because the types returned by this
+   * method will have had their type parameters replaced.
+   */
+  List<InterfaceType> get interfaces;
+
+  /**
+   * Return a list containing all of the methods declared in this type.
+   */
+  List<MethodElement> get methods;
+
+  /**
+   * Return a list containing all of the mixins that are applied to the class
+   * being extended in order to derive the superclass of this class. Note that
+   * this is <b>not</b>, in general, equivalent to getting the mixins from this
+   * type's element because the types returned by this method will have had
+   * their type parameters replaced.
+   */
+  List<InterfaceType> get mixins;
+
+  /**
+   * Return the type representing the superclass of this type, or null if this
+   * type represents the class 'Object'. Note that this is <b>not</b>, in
+   * general, equivalent to getting the superclass from this type's element
+   * because the type returned by this method will have had it's type parameters
+   * replaced.
+   */
+  InterfaceType get superclass;
+
+  /**
+   * Return the element representing the getter with the given [name] that is
+   * declared in this class, or `null` if this class does not declare a getter
+   * with the given name.
+   */
+  PropertyAccessorElement getGetter(String name);
+
+  /**
+   * Return the least upper bound of this type and the given [type], or `null`
+   * if there is no least upper bound.
+   *
+   * Given two interfaces <i>I</i> and <i>J</i>, let <i>S<sub>I</sub></i> be the
+   * set of superinterfaces of <i>I<i>, let <i>S<sub>J</sub></i> be the set of
+   * superinterfaces of <i>J</i> and let <i>S = (I &cup; S<sub>I</sub>) &cap;
+   * (J &cup; S<sub>J</sub>)</i>. Furthermore, we define <i>S<sub>n</sub> =
+   * {T | T &isin; S &and; depth(T) = n}</i> for any finite <i>n</i>, where
+   * <i>depth(T)</i> is the number of steps in the longest inheritance path from
+   * <i>T</i> to <i>Object</i>. Let <i>q</i> be the largest number such that
+   * <i>S<sub>q</sub></i> has cardinality one. The least upper bound of <i>I</i>
+   * and <i>J</i> is the sole element of <i>S<sub>q</sub></i>.
+   */
+  @override
+  @deprecated
+  DartType getLeastUpperBound(DartType type);
+
+  /**
+   * Return the element representing the method with the given [name] that is
+   * declared in this class, or `null` if this class does not declare a method
+   * with the given name.
+   */
+  MethodElement getMethod(String name);
+
+  /**
+   * Return the element representing the setter with the given [name] that is
+   * declared in this class, or `null` if this class does not declare a setter
+   * with the given name.
+   */
+  PropertyAccessorElement getSetter(String name);
+
+  /**
+   * Return `true` if this type is a direct supertype of the given [type]. The
+   * implicit interface of class <i>I</i> is a direct supertype of the implicit
+   * interface of class <i>J</i> iff:
+   *
+   * * <i>I</i> is Object, and <i>J</i> has no extends clause.
+   * * <i>I</i> is listed in the extends clause of <i>J</i>.
+   * * <i>I</i> is listed in the implements clause of <i>J</i>.
+   * * <i>I</i> is listed in the with clause of <i>J</i>.
+   * * <i>J</i> is a mixin application of the mixin of <i>I</i>.
+   */
+  bool isDirectSupertypeOf(InterfaceType type);
+
+  /**
+   * Return `true` if this type is more specific than the given [type]. An
+   * interface type <i>T</i> is more specific than an interface type <i>S</i>,
+   * written <i>T &laquo; S</i>, if one of the following conditions is met:
+   *
+   * * Reflexivity: <i>T</i> is <i>S</i>.
+   * * <i>T</i> is bottom.
+   * * <i>S</i> is dynamic.
+   * * Direct supertype: <i>S</i> is a direct supertype of <i>T</i>.
+   * * <i>T</i> is a type parameter and <i>S</i> is the upper bound of <i>T</i>.
+   * * Covariance: <i>T</i> is of the form <i>I&lt;T<sub>1</sub>, &hellip;,
+   *   T<sub>n</sub>&gt;</i> and S</i> is of the form <i>I&lt;S<sub>1</sub>,
+   *   &hellip;, S<sub>n</sub>&gt;</i> and <i>T<sub>i</sub> &laquo;
+   *   S<sub>i</sub></i>, <i>1 <= i <= n</i>.
+   * * Transitivity: <i>T &laquo; U</i> and <i>U &laquo; S</i>.
+   */
+  @override
+  bool isMoreSpecificThan(DartType type);
+
+  /**
+   * Return `true` if this type is a subtype of the given [type]. An interface
+   * type <i>T</i> is a subtype of an interface type <i>S</i>, written <i>T</i>
+   * <: <i>S</i>, iff <i>[bottom/dynamic]T</i> &laquo; <i>S</i> (<i>T</i> is
+   * more specific than <i>S</i>). If an interface type <i>I</i> includes a
+   * method named <i>call()</i>, and the type of <i>call()</i> is the function
+   * type <i>F</i>, then <i>I</i> is considered to be a subtype of <i>F</i>.
+   */
+  @override
+  bool isSubtypeOf(DartType type);
+
+  /**
+   * Return the element representing the constructor that results from looking
+   * up the constructor with the given [name] in this class with respect to the
+   * given [library], or `null` if the look up fails. The behavior of this
+   * method is defined by the Dart Language Specification in section 12.11.1:
+   * <blockquote>
+   * If <i>e</i> is of the form <b>new</b> <i>T.id()</i> then let <i>q<i> be the
+   * constructor <i>T.id</i>, otherwise let <i>q<i> be the constructor <i>T<i>.
+   * Otherwise, if <i>q</i> is not defined or not accessible, a
+   * NoSuchMethodException is thrown.
+   * </blockquote>
+   */
+  ConstructorElement lookUpConstructor(String name, LibraryElement library);
+
+  /**
+   * Return the element representing the getter that results from looking up the
+   * getter with the given [name] in this class with respect to the given
+   * [library], or `null` if the look up fails. The behavior of this method is
+   * defined by the Dart Language Specification in section 12.15.1:
+   * <blockquote>
+   * The result of looking up getter (respectively setter) <i>m</i> in class
+   * <i>C</i> with respect to library <i>L</i> is:
+   * * If <i>C</i> declares an instance getter (respectively setter) named
+   *   <i>m</i> that is accessible to <i>L</i>, then that getter (respectively
+   *   setter) is the result of the lookup. Otherwise, if <i>C</i> has a
+   *   superclass <i>S</i>, then the result of the lookup is the result of
+   *   looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect
+   *   to <i>L</i>. Otherwise, we say that the lookup has failed.
+   * </blockquote>
+   */
+  PropertyAccessorElement lookUpGetter(String name, LibraryElement library);
+
+  /**
+   * Return the element representing the getter that results from looking up the
+   * getter with the given [name] in the superclass of this class with respect
+   * to the given [library], or `null` if the look up fails. The behavior of
+   * this method is defined by the Dart Language Specification in section
+   * 12.15.1:
+   * <blockquote>
+   * The result of looking up getter (respectively setter) <i>m</i> in class
+   * <i>C</i> with respect to library <i>L</i> is:
+   * * If <i>C</i> declares an instance getter (respectively setter) named
+   *   <i>m</i> that is accessible to <i>L</i>, then that getter (respectively
+   *   setter) is the result of the lookup. Otherwise, if <i>C</i> has a
+   *   superclass <i>S</i>, then the result of the lookup is the result of
+   *   looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect
+   *   to <i>L</i>. Otherwise, we say that the lookup has failed.
+   * </blockquote>
+   */
+  PropertyAccessorElement lookUpGetterInSuperclass(
+      String name, LibraryElement library);
+
+  /**
+   * Return the element representing the method that results from looking up the
+   * method with the given [name] in this class with respect to the given
+   * [library], or `null` if the look up fails. The behavior of this method is
+   * defined by the Dart Language Specification in section 12.15.1:
+   * <blockquote>
+   * The result of looking up method <i>m</i> in class <i>C</i> with respect to
+   * library <i>L</i> is:
+   * * If <i>C</i> declares an instance method named <i>m</i> that is accessible
+   *   to <i>L</i>, then that method is the result of the lookup. Otherwise, if
+   *   <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the
+   *   result of looking up method <i>m</i> in <i>S</i> with respect to <i>L</i>
+   *   Otherwise, we say that the lookup has failed.
+   * </blockquote>
+   */
+  MethodElement lookUpMethod(String name, LibraryElement library);
+
+  /**
+   * Return the element representing the method that results from looking up the
+   * method with the given [name] in the superclass of this class with respect
+   * to the given [library], or `null` if the look up fails. The behavior of
+   * this method is defined by the Dart Language Specification in section
+   * 12.15.1:
+   * <blockquote>
+   * The result of looking up method <i>m</i> in class <i>C</i> with respect to
+   * library <i>L</i> is:
+   * * If <i>C</i> declares an instance method named <i>m</i> that is accessible
+   *   to <i>L</i>, then that method is the result of the lookup. Otherwise, if
+   * <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the
+   * result of looking up method <i>m</i> in <i>S</i> with respect to <i>L</i>.
+   * Otherwise, we say that the lookup has failed.
+   * </blockquote>
+   */
+  MethodElement lookUpMethodInSuperclass(String name, LibraryElement library);
+
+  /**
+   * Return the element representing the setter that results from looking up the
+   * setter with the given [name] in this class with respect to the given
+   * [library], or `null` if the look up fails. The behavior of this method is
+   * defined by the Dart Language Specification in section 12.16:
+   * <blockquote>
+   * The result of looking up getter (respectively setter) <i>m</i> in class
+   * <i>C</i> with respect to library <i>L</i> is:
+   * * If <i>C</i> declares an instance getter (respectively setter) named
+   *   <i>m</i> that is accessible to <i>L</i>, then that getter (respectively
+   *   setter) is the result of the lookup. Otherwise, if <i>C</i> has a
+   *   superclass <i>S</i>, then the result of the lookup is the result of
+   *   looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect
+   *   to <i>L</i>. Otherwise, we say that the lookup has failed.
+   * </blockquote>
+   */
+  PropertyAccessorElement lookUpSetter(String name, LibraryElement library);
+
+  /**
+   * Return the element representing the setter that results from looking up the
+   * setter with the given [name] in the superclass of this class with respect
+   * to the given [library], or `null` if the look up fails. The behavior of
+   * this method is defined by the Dart Language Specification in section 12.16:
+   * <blockquote>
+   * The result of looking up getter (respectively setter) <i>m</i> in class
+   * <i>C</i> with respect to library <i>L</i> is:
+   * * If <i>C</i> declares an instance getter (respectively setter) named
+   *   <i>m</i> that is accessible to <i>L</i>, then that getter (respectively
+   *   setter) is the result of the lookup. Otherwise, if <i>C</i> has a
+   *   superclass <i>S</i>, then the result of the lookup is the result of
+   *   looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect
+   *   to <i>L</i>. Otherwise, we say that the lookup has failed.
+   * </blockquote>
+   */
+  PropertyAccessorElement lookUpSetterInSuperclass(
+      String name, LibraryElement library);
+
+  @override
+  InterfaceType substitute2(
+      List<DartType> argumentTypes, List<DartType> parameterTypes);
+
+  /**
+   * Return the type resulting from substituting the given arguments for this
+   * type's parameters. This is fully equivalent to `substitute2(argumentTypes,
+   * getTypeArguments())`.
+   */
+  InterfaceType substitute4(List<DartType> argumentTypes);
+
+  /**
+   * Returns a "smart" version of the "least upper bound" of the given types.
+   *
+   * If these types have the same element and differ only in terms of the type
+   * arguments, attempts to find a compatible set of type arguments.
+   *
+   * Otherwise, calls [DartType.getLeastUpperBound].
+   */
+  static InterfaceType getSmartLeastUpperBound(
+      InterfaceType first, InterfaceType second) {
+    // TODO(paulberry): this needs to be deprecated and replaced with a method
+    // in [TypeSystem], since it relies on the deprecated functionality of
+    // [DartType.getLeastUpperBound].
+    if (first.element == second.element) {
+      return _leastUpperBound(first, second);
+    }
+    return first.getLeastUpperBound(second);
+  }
+
+  /**
+   * Return the "least upper bound" of the given types under the assumption that
+   * the types have the same element and differ only in terms of the type
+   * arguments.
+   *
+   * The resulting type is composed by comparing the corresponding type
+   * arguments, keeping those that are the same, and using 'dynamic' for those
+   * that are different.
+   */
+  static InterfaceType _leastUpperBound(
+      InterfaceType firstType, InterfaceType secondType) {
+    ClassElement firstElement = firstType.element;
+    ClassElement secondElement = secondType.element;
+    if (firstElement != secondElement) {
+      throw new IllegalArgumentException('The same elements expected, but '
+          '$firstElement and $secondElement are given.');
+    }
+    if (firstType == secondType) {
+      return firstType;
+    }
+    List<DartType> firstArguments = firstType.typeArguments;
+    List<DartType> secondArguments = secondType.typeArguments;
+    int argumentCount = firstArguments.length;
+    if (argumentCount == 0) {
+      return firstType;
+    }
+    List<DartType> lubArguments = new List<DartType>(argumentCount);
+    for (int i = 0; i < argumentCount; i++) {
+      //
+      // Ideally we would take the least upper bound of the two argument types,
+      // but this can cause an infinite recursion (such as when finding the
+      // least upper bound of String and num).
+      //
+      if (firstArguments[i] == secondArguments[i]) {
+        lubArguments[i] = firstArguments[i];
+      }
+      if (lubArguments[i] == null) {
+        lubArguments[i] = DynamicTypeImpl.instance;
+      }
+    }
+    InterfaceTypeImpl lub = new InterfaceTypeImpl(firstElement);
+    lub.typeArguments = lubArguments;
+    return lub;
+  }
+}
+
+/**
+ * A concrete implementation of an [InterfaceType].
+ */
+class InterfaceTypeImpl extends TypeImpl implements InterfaceType {
+  /**
+   * A list containing the actual types of the type arguments.
+   */
+  List<DartType> typeArguments = DartType.EMPTY_LIST;
+
+  /**
+   * The set of typedefs which should not be expanded when exploring this type,
+   * to avoid creating infinite types in response to self-referential typedefs.
+   */
+  final List<FunctionTypeAliasElement> prunedTypedefs;
+
+  /**
+   * Initialize a newly created type to be declared by the given [element].
+   */
+  InterfaceTypeImpl(ClassElement element, [this.prunedTypedefs])
+      : super(element, element.displayName);
+
+  /**
+   * Initialize a newly created type to be declared by the given [element].
+   */
+  @deprecated // Use new InterfaceTypeImpl(element)
+  InterfaceTypeImpl.con1(ClassElement element)
+      : prunedTypedefs = null,
+        super(element, element.displayName);
+
+  /**
+   * Initialize a newly created type to have the given [name]. This constructor
+   * should only be used in cases where there is no declaration of the type.
+   */
+  @deprecated // Use new InterfaceTypeImpl.named(name)
+  InterfaceTypeImpl.con2(String name)
+      : prunedTypedefs = null,
+        super(null, name);
+
+  /**
+   * Initialize a newly created type to have the given [name]. This constructor
+   * should only be used in cases where there is no declaration of the type.
+   */
+  InterfaceTypeImpl.named(String name)
+      : prunedTypedefs = null,
+        super(null, name);
+
+  /**
+   * Private constructor.
+   */
+  InterfaceTypeImpl._(Element element, String name, this.prunedTypedefs)
+      : super(element, name);
+
+  @override
+  List<PropertyAccessorElement> get accessors {
+    List<PropertyAccessorElement> accessors = element.accessors;
+    List<PropertyAccessorElement> members =
+        new List<PropertyAccessorElement>(accessors.length);
+    for (int i = 0; i < accessors.length; i++) {
+      members[i] = PropertyAccessorMember.from(accessors[i], this);
+    }
+    return members;
+  }
+
+  @override
+  List<ConstructorElement> get constructors {
+    List<ConstructorElement> constructors = element.constructors;
+    List<ConstructorElement> members =
+        new List<ConstructorElement>(constructors.length);
+    for (int i = 0; i < constructors.length; i++) {
+      members[i] = ConstructorMember.from(constructors[i], this);
+    }
+    return members;
+  }
+
+  @override
+  String get displayName {
+    String name = this.name;
+    List<DartType> typeArguments = this.typeArguments;
+    bool allDynamic = true;
+    for (DartType type in typeArguments) {
+      if (type != null && !type.isDynamic) {
+        allDynamic = false;
+        break;
+      }
+    }
+    // If there is at least one non-dynamic type, then list them out
+    if (!allDynamic) {
+      StringBuffer buffer = new StringBuffer();
+      buffer.write(name);
+      buffer.write("<");
+      for (int i = 0; i < typeArguments.length; i++) {
+        if (i != 0) {
+          buffer.write(", ");
+        }
+        DartType typeArg = typeArguments[i];
+        buffer.write(typeArg.displayName);
+      }
+      buffer.write(">");
+      name = buffer.toString();
+    }
+    return name;
+  }
+
+  @override
+  ClassElement get element => super.element as ClassElement;
+
+  @override
+  int get hashCode {
+    ClassElement element = this.element;
+    if (element == null) {
+      return 0;
+    }
+    return element.hashCode;
+  }
+
+  @override
+  List<InterfaceType> get interfaces {
+    ClassElement classElement = element;
+    List<InterfaceType> interfaces = classElement.interfaces;
+    List<TypeParameterElement> typeParameters = classElement.typeParameters;
+    List<DartType> parameterTypes = classElement.type.typeArguments;
+    if (typeParameters.length == 0) {
+      return interfaces;
+    }
+    int count = interfaces.length;
+    List<InterfaceType> typedInterfaces = new List<InterfaceType>(count);
+    for (int i = 0; i < count; i++) {
+      typedInterfaces[i] =
+          interfaces[i].substitute2(typeArguments, parameterTypes);
+    }
+    return typedInterfaces;
+  }
+
+  @override
+  bool get isDartCoreFunction {
+    ClassElement element = this.element;
+    if (element == null) {
+      return false;
+    }
+    return element.name == "Function" && element.library.isDartCore;
+  }
+
+  @override
+  bool get isObject => element.supertype == null;
+
+  @override
+  List<MethodElement> get methods {
+    List<MethodElement> methods = element.methods;
+    List<MethodElement> members = new List<MethodElement>(methods.length);
+    for (int i = 0; i < methods.length; i++) {
+      members[i] = MethodMember.from(methods[i], this);
+    }
+    return members;
+  }
+
+  @override
+  List<InterfaceType> get mixins {
+    ClassElement classElement = element;
+    List<InterfaceType> mixins = classElement.mixins;
+    List<TypeParameterElement> typeParameters = classElement.typeParameters;
+    List<DartType> parameterTypes = classElement.type.typeArguments;
+    if (typeParameters.length == 0) {
+      return mixins;
+    }
+    int count = mixins.length;
+    List<InterfaceType> typedMixins = new List<InterfaceType>(count);
+    for (int i = 0; i < count; i++) {
+      typedMixins[i] = mixins[i].substitute2(typeArguments, parameterTypes);
+    }
+    return typedMixins;
+  }
+
+  @override
+  InterfaceType get superclass {
+    ClassElement classElement = element;
+    InterfaceType supertype = classElement.supertype;
+    if (supertype == null) {
+      return null;
+    }
+    List<DartType> typeParameters = classElement.type.typeArguments;
+    if (typeArguments.length == 0 ||
+        typeArguments.length != typeParameters.length) {
+      return supertype;
+    }
+    return supertype.substitute2(typeArguments, typeParameters);
+  }
+
+  @override
+  List<TypeParameterElement> get typeParameters => element.typeParameters;
+
+  @override
+  bool operator ==(Object object) {
+    if (identical(object, this)) {
+      return true;
+    }
+    if (object is! InterfaceTypeImpl) {
+      return false;
+    }
+    InterfaceTypeImpl otherType = object as InterfaceTypeImpl;
+    return (element == otherType.element) &&
+        TypeImpl.equalArrays(typeArguments, otherType.typeArguments);
+  }
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    buffer.write(name);
+    int argumentCount = typeArguments.length;
+    if (argumentCount > 0) {
+      buffer.write("<");
+      for (int i = 0; i < argumentCount; i++) {
+        if (i > 0) {
+          buffer.write(", ");
+        }
+        (typeArguments[i] as TypeImpl).appendTo(buffer);
+      }
+      buffer.write(">");
+    }
+  }
+
+  @override
+  PropertyAccessorElement getGetter(String getterName) => PropertyAccessorMember
+      .from((element as ClassElementImpl).getGetter(getterName), this);
+
+  @override
+  @deprecated
+  DartType getLeastUpperBound(DartType type) {
+    // quick check for self
+    if (identical(type, this)) {
+      return this;
+    }
+    // dynamic
+    DartType dynamicType = DynamicTypeImpl.instance;
+    if (identical(this, dynamicType) || identical(type, dynamicType)) {
+      return dynamicType;
+    }
+    // TODO (jwren) opportunity here for a better, faster algorithm if this
+    // turns out to be a bottle-neck
+    if (type is! InterfaceType) {
+      return null;
+    }
+    return computeLeastUpperBound(this, type);
+  }
+
+  @override
+  MethodElement getMethod(String methodName) => MethodMember.from(
+      (element as ClassElementImpl).getMethod(methodName), this);
+
+  @override
+  PropertyAccessorElement getSetter(String setterName) => PropertyAccessorMember
+      .from((element as ClassElementImpl).getSetter(setterName), this);
+
+  @override
+  bool isDirectSupertypeOf(InterfaceType type) {
+    InterfaceType i = this;
+    InterfaceType j = type;
+    ClassElement jElement = j.element;
+    InterfaceType supertype = jElement.supertype;
+    //
+    // If J has no direct supertype then it is Object, and Object has no direct
+    // supertypes.
+    //
+    if (supertype == null) {
+      return false;
+    }
+    //
+    // I is listed in the extends clause of J.
+    //
+    List<DartType> jArgs = j.typeArguments;
+    List<DartType> jVars = jElement.type.typeArguments;
+    supertype = supertype.substitute2(jArgs, jVars);
+    if (supertype == i) {
+      return true;
+    }
+    //
+    // I is listed in the implements clause of J.
+    //
+    for (InterfaceType interfaceType in jElement.interfaces) {
+      interfaceType = interfaceType.substitute2(jArgs, jVars);
+      if (interfaceType == i) {
+        return true;
+      }
+    }
+    //
+    // I is listed in the with clause of J.
+    //
+    for (InterfaceType mixinType in jElement.mixins) {
+      mixinType = mixinType.substitute2(jArgs, jVars);
+      if (mixinType == i) {
+        return true;
+      }
+    }
+    //
+    // J is a mixin application of the mixin of I.
+    //
+    // TODO(brianwilkerson) Determine whether this needs to be implemented or
+    // whether it is covered by the case above.
+    return false;
+  }
+
+  @override
+  bool isMoreSpecificThan(DartType type,
+      [bool withDynamic = false, Set<Element> visitedElements]) {
+    //
+    // S is dynamic.
+    // The test to determine whether S is dynamic is done here because dynamic
+    // is not an instance of InterfaceType.
+    //
+    if (type.isDynamic) {
+      return true;
+    }
+    //
+    // A type T is more specific than a type S, written T << S,
+    // if one of the following conditions is met:
+    //
+    // Reflexivity: T is S.
+    //
+    if (this == type) {
+      return true;
+    }
+    if (type is InterfaceType) {
+      //
+      // T is bottom. (This case is handled by the class BottomTypeImpl.)
+      //
+      // Direct supertype: S is a direct supertype of T.
+      //
+      if (type.isDirectSupertypeOf(this)) {
+        return true;
+      }
+      //
+      // Covariance: T is of the form I<T1, ..., Tn> and S is of the form
+      // I<S1, ..., Sn> and Ti << Si, 1 <= i <= n.
+      //
+      ClassElement tElement = this.element;
+      ClassElement sElement = type.element;
+      if (tElement == sElement) {
+        List<DartType> tArguments = typeArguments;
+        List<DartType> sArguments = type.typeArguments;
+        if (tArguments.length != sArguments.length) {
+          return false;
+        }
+        for (int i = 0; i < tArguments.length; i++) {
+          if (!(tArguments[i] as TypeImpl)
+              .isMoreSpecificThan(sArguments[i], withDynamic)) {
+            return false;
+          }
+        }
+        return true;
+      }
+    }
+    //
+    // Transitivity: T << U and U << S.
+    //
+    // First check for infinite loops
+    if (element == null) {
+      return false;
+    }
+    if (visitedElements == null) {
+      visitedElements = new HashSet<ClassElement>();
+    } else if (visitedElements.contains(element)) {
+      return false;
+    }
+    visitedElements.add(element);
+    try {
+      // Iterate over all of the types U that are more specific than T because
+      // they are direct supertypes of T and return true if any of them are more
+      // specific than S.
+      InterfaceTypeImpl supertype = superclass;
+      if (supertype != null &&
+          supertype.isMoreSpecificThan(type, withDynamic, visitedElements)) {
+        return true;
+      }
+      for (InterfaceType interfaceType in interfaces) {
+        if ((interfaceType as InterfaceTypeImpl)
+            .isMoreSpecificThan(type, withDynamic, visitedElements)) {
+          return true;
+        }
+      }
+      for (InterfaceType mixinType in mixins) {
+        if ((mixinType as InterfaceTypeImpl)
+            .isMoreSpecificThan(type, withDynamic, visitedElements)) {
+          return true;
+        }
+      }
+      // If a type I includes an instance method named `call`, and the type of
+      // `call` is the function type F, then I is considered to be more specific
+      // than F.
+      MethodElement callMethod = getMethod('call');
+      if (callMethod != null && !callMethod.isStatic) {
+        FunctionTypeImpl callType = callMethod.type;
+        if (callType.isMoreSpecificThan(type, withDynamic, visitedElements)) {
+          return true;
+        }
+      }
+      return false;
+    } finally {
+      visitedElements.remove(element);
+    }
+  }
+
+  @override
+  ConstructorElement lookUpConstructor(
+      String constructorName, LibraryElement library) {
+    // prepare base ConstructorElement
+    ConstructorElement constructorElement;
+    if (constructorName == null) {
+      constructorElement = element.unnamedConstructor;
+    } else {
+      constructorElement = element.getNamedConstructor(constructorName);
+    }
+    // not found or not accessible
+    if (constructorElement == null ||
+        !constructorElement.isAccessibleIn(library)) {
+      return null;
+    }
+    // return member
+    return ConstructorMember.from(constructorElement, this);
+  }
+
+  @override
+  PropertyAccessorElement lookUpGetter(
+      String getterName, LibraryElement library) {
+    PropertyAccessorElement element = getGetter(getterName);
+    if (element != null && element.isAccessibleIn(library)) {
+      return element;
+    }
+    return lookUpGetterInSuperclass(getterName, library);
+  }
+
+  @override
+  PropertyAccessorElement lookUpGetterInSuperclass(
+      String getterName, LibraryElement library) {
+    for (InterfaceType mixin in mixins.reversed) {
+      PropertyAccessorElement element = mixin.getGetter(getterName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+    }
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+    InterfaceType supertype = superclass;
+    ClassElement supertypeElement =
+        supertype == null ? null : supertype.element;
+    while (supertype != null && !visitedClasses.contains(supertypeElement)) {
+      visitedClasses.add(supertypeElement);
+      PropertyAccessorElement element = supertype.getGetter(getterName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+      for (InterfaceType mixin in supertype.mixins.reversed) {
+        element = mixin.getGetter(getterName);
+        if (element != null && element.isAccessibleIn(library)) {
+          return element;
+        }
+      }
+      supertype = supertype.superclass;
+      supertypeElement = supertype == null ? null : supertype.element;
+    }
+    return null;
+  }
+
+  @override
+  MethodElement lookUpMethod(String methodName, LibraryElement library) {
+    MethodElement element = getMethod(methodName);
+    if (element != null && element.isAccessibleIn(library)) {
+      return element;
+    }
+    return lookUpMethodInSuperclass(methodName, library);
+  }
+
+  @override
+  MethodElement lookUpMethodInSuperclass(
+      String methodName, LibraryElement library) {
+    for (InterfaceType mixin in mixins.reversed) {
+      MethodElement element = mixin.getMethod(methodName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+    }
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+    InterfaceType supertype = superclass;
+    ClassElement supertypeElement =
+        supertype == null ? null : supertype.element;
+    while (supertype != null && !visitedClasses.contains(supertypeElement)) {
+      visitedClasses.add(supertypeElement);
+      MethodElement element = supertype.getMethod(methodName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+      for (InterfaceType mixin in supertype.mixins.reversed) {
+        element = mixin.getMethod(methodName);
+        if (element != null && element.isAccessibleIn(library)) {
+          return element;
+        }
+      }
+      supertype = supertype.superclass;
+      supertypeElement = supertype == null ? null : supertype.element;
+    }
+    return null;
+  }
+
+  @override
+  PropertyAccessorElement lookUpSetter(
+      String setterName, LibraryElement library) {
+    PropertyAccessorElement element = getSetter(setterName);
+    if (element != null && element.isAccessibleIn(library)) {
+      return element;
+    }
+    return lookUpSetterInSuperclass(setterName, library);
+  }
+
+  @override
+  PropertyAccessorElement lookUpSetterInSuperclass(
+      String setterName, LibraryElement library) {
+    for (InterfaceType mixin in mixins.reversed) {
+      PropertyAccessorElement element = mixin.getSetter(setterName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+    }
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+    InterfaceType supertype = superclass;
+    ClassElement supertypeElement =
+        supertype == null ? null : supertype.element;
+    while (supertype != null && !visitedClasses.contains(supertypeElement)) {
+      visitedClasses.add(supertypeElement);
+      PropertyAccessorElement element = supertype.getSetter(setterName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+      for (InterfaceType mixin in supertype.mixins.reversed) {
+        element = mixin.getSetter(setterName);
+        if (element != null && element.isAccessibleIn(library)) {
+          return element;
+        }
+      }
+      supertype = supertype.superclass;
+      supertypeElement = supertype == null ? null : supertype.element;
+    }
+    return null;
+  }
+
+  @override
+  InterfaceTypeImpl pruned(List<FunctionTypeAliasElement> prune) {
+    if (prune == null) {
+      return this;
+    } else {
+      // There should never be a reason to prune a type that has already been
+      // pruned, since pruning is only done when expanding a function type
+      // alias, and function type aliases are always expanded by starting with
+      // base types.
+      assert(this.prunedTypedefs == null);
+      InterfaceTypeImpl result = new InterfaceTypeImpl._(element, name, prune);
+      result.typeArguments =
+          typeArguments.map((TypeImpl t) => t.pruned(prune)).toList();
+      return result;
+    }
+  }
+
+  @override
+  InterfaceTypeImpl substitute2(
+      List<DartType> argumentTypes, List<DartType> parameterTypes,
+      [List<FunctionTypeAliasElement> prune]) {
+    // Pruned types should only ever result from performing type variable
+    // substitution, and it doesn't make sense to substitute again after
+    // substituting once.
+    assert(this.prunedTypedefs == null);
+    if (argumentTypes.length != parameterTypes.length) {
+      throw new IllegalArgumentException(
+          "argumentTypes.length (${argumentTypes.length}) != parameterTypes.length (${parameterTypes.length})");
+    }
+    if (argumentTypes.length == 0 || typeArguments.length == 0) {
+      return this.pruned(prune);
+    }
+    List<DartType> newTypeArguments = TypeImpl.substitute(
+        typeArguments, argumentTypes, parameterTypes, prune);
+    if (JavaArrays.equals(newTypeArguments, typeArguments)) {
+      return this;
+    }
+    InterfaceTypeImpl newType = new InterfaceTypeImpl(element, prune);
+    newType.typeArguments = newTypeArguments;
+    return newType;
+  }
+
+  @override
+  InterfaceTypeImpl substitute4(List<DartType> argumentTypes) =>
+      substitute2(argumentTypes, typeArguments);
+
+  /**
+   * Compute the least upper bound of types [i] and [j], both of which are
+   * known to be interface types.
+   *
+   * In the event that the algorithm fails (which might occur due to a bug in
+   * the analyzer), `null` is returned.
+   */
+  static InterfaceType computeLeastUpperBound(
+      InterfaceType i, InterfaceType j) {
+    // compute set of supertypes
+    Set<InterfaceType> si = computeSuperinterfaceSet(i);
+    Set<InterfaceType> sj = computeSuperinterfaceSet(j);
+    // union si with i and sj with j
+    si.add(i);
+    sj.add(j);
+    // compute intersection, reference as set 's'
+    List<InterfaceType> s = _intersection(si, sj);
+    // for each element in Set s, compute the largest inheritance path to Object
+    List<int> depths = new List<int>.filled(s.length, 0);
+    int maxDepth = 0;
+    for (int n = 0; n < s.length; n++) {
+      depths[n] = computeLongestInheritancePathToObject(s[n]);
+      if (depths[n] > maxDepth) {
+        maxDepth = depths[n];
+      }
+    }
+    // ensure that the currently computed maxDepth is unique,
+    // otherwise, decrement and test for uniqueness again
+    for (; maxDepth >= 0; maxDepth--) {
+      int indexOfLeastUpperBound = -1;
+      int numberOfTypesAtMaxDepth = 0;
+      for (int m = 0; m < depths.length; m++) {
+        if (depths[m] == maxDepth) {
+          numberOfTypesAtMaxDepth++;
+          indexOfLeastUpperBound = m;
+        }
+      }
+      if (numberOfTypesAtMaxDepth == 1) {
+        return s[indexOfLeastUpperBound];
+      }
+    }
+    // Should be impossible--there should always be exactly one type with the
+    // maximum depth.
+    assert(false);
+    return null;
+  }
+
+  /**
+   * Return the length of the longest inheritance path from the given [type] to
+   * Object.
+   *
+   * See [computeLeastUpperBound].
+   */
+  static int computeLongestInheritancePathToObject(InterfaceType type) =>
+      _computeLongestInheritancePathToObject(
+          type, 0, new HashSet<ClassElement>());
+
+  /**
+   * Returns the set of all superinterfaces of the given [type].
+   *
+   * See [computeLeastUpperBound].
+   */
+  static Set<InterfaceType> computeSuperinterfaceSet(InterfaceType type) =>
+      _computeSuperinterfaceSet(type, new HashSet<InterfaceType>());
+
+  /**
+   * Return the length of the longest inheritance path from a subtype of the
+   * given [type] to Object, where the given [depth] is the length of the
+   * longest path from the subtype to this type. The set of [visitedTypes] is
+   * used to prevent infinite recursion in the case of a cyclic type structure.
+   *
+   * See [computeLongestInheritancePathToObject], and [computeLeastUpperBound].
+   */
+  static int _computeLongestInheritancePathToObject(
+      InterfaceType type, int depth, HashSet<ClassElement> visitedTypes) {
+    ClassElement classElement = type.element;
+    // Object case
+    if (classElement.supertype == null || visitedTypes.contains(classElement)) {
+      return depth;
+    }
+    int longestPath = 1;
+    try {
+      visitedTypes.add(classElement);
+      List<InterfaceType> superinterfaces = classElement.interfaces;
+      int pathLength;
+      if (superinterfaces.length > 0) {
+        // loop through each of the superinterfaces recursively calling this
+        // method and keeping track of the longest path to return
+        for (InterfaceType superinterface in superinterfaces) {
+          pathLength = _computeLongestInheritancePathToObject(
+              superinterface, depth + 1, visitedTypes);
+          if (pathLength > longestPath) {
+            longestPath = pathLength;
+          }
+        }
+      }
+      // finally, perform this same check on the super type
+      // TODO(brianwilkerson) Does this also need to add in the number of mixin
+      // classes?
+      InterfaceType supertype = classElement.supertype;
+      pathLength = _computeLongestInheritancePathToObject(
+          supertype, depth + 1, visitedTypes);
+      if (pathLength > longestPath) {
+        longestPath = pathLength;
+      }
+    } finally {
+      visitedTypes.remove(classElement);
+    }
+    return longestPath;
+  }
+
+  /**
+   * Add all of the superinterfaces of the given [type] to the given [set].
+   * Return the [set] as a convenience.
+   *
+   * See [computeSuperinterfaceSet], and [computeLeastUpperBound].
+   */
+  static Set<InterfaceType> _computeSuperinterfaceSet(
+      InterfaceType type, HashSet<InterfaceType> set) {
+    Element element = type.element;
+    if (element != null) {
+      List<InterfaceType> superinterfaces = type.interfaces;
+      for (InterfaceType superinterface in superinterfaces) {
+        if (set.add(superinterface)) {
+          _computeSuperinterfaceSet(superinterface, set);
+        }
+      }
+      InterfaceType supertype = type.superclass;
+      if (supertype != null) {
+        if (set.add(supertype)) {
+          _computeSuperinterfaceSet(supertype, set);
+        }
+      }
+    }
+    return set;
+  }
+
+  /**
+   * Return the intersection of the [first] and [second] sets of types, where
+   * intersection is based on the equality of the types themselves.
+   */
+  static List<InterfaceType> _intersection(
+      Set<InterfaceType> first, Set<InterfaceType> second) {
+    Set<InterfaceType> result = new HashSet<InterfaceType>.from(first);
+    result.retainAll(second);
+    return new List.from(result);
+  }
+}
+
+/**
+ * A label associated with a statement.
+ */
+abstract class LabelElement implements Element {
+  /**
+   * An empty list of label elements.
+   */
+  static const List<LabelElement> EMPTY_LIST = const <LabelElement>[];
+
+  /**
+   * Return the executable element in which this label is defined.
+   */
+  @override
+  ExecutableElement get enclosingElement;
+}
+
+/**
+ * A concrete implementation of a [LabelElement].
+ */
+class LabelElementImpl extends ElementImpl implements LabelElement {
+  /**
+   * An empty list of label elements.
+   */
+  @deprecated // Use LabelElement.EMPTY_LIST
+  static const List<LabelElement> EMPTY_ARRAY = const <LabelElement>[];
+
+  /**
+   * A flag indicating whether this label is associated with a `switch`
+   * statement.
+   */
+  // TODO(brianwilkerson) Make this a modifier.
+  final bool _onSwitchStatement;
+
+  /**
+   * A flag indicating whether this label is associated with a `switch` member
+   * (`case` or `default`).
+   */
+  // TODO(brianwilkerson) Make this a modifier.
+  final bool _onSwitchMember;
+
+  /**
+   * Initialize a newly created label element to have the given [name].
+   * [onSwitchStatement] should be `true` if this label is associated with a
+   * `switch` statement and [onSwitchMember] should be `true` if this label is
+   * associated with a `switch` member.
+   */
+  LabelElementImpl(
+      Identifier name, this._onSwitchStatement, this._onSwitchMember)
+      : super.forNode(name);
+
+  @override
+  ExecutableElement get enclosingElement =>
+      super.enclosingElement as ExecutableElement;
+
+  /**
+   * Return `true` if this label is associated with a `switch` member (`case` or
+   * `default`).
+   */
+  bool get isOnSwitchMember => _onSwitchMember;
+
+  /**
+   * Return `true` if this label is associated with a `switch` statement.
+   */
+  bool get isOnSwitchStatement => _onSwitchStatement;
+
+  @override
+  ElementKind get kind => ElementKind.LABEL;
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitLabelElement(this);
+}
+
+/**
+ * A library.
+ */
+abstract class LibraryElement implements Element {
+  /**
+   * An empty list of library elements.
+   */
+  static const List<LibraryElement> EMPTY_LIST = const <LibraryElement>[];
+
+  /**
+   * Return the compilation unit that defines this library.
+   */
+  CompilationUnitElement get definingCompilationUnit;
+
+  /**
+   * Return the entry point for this library, or `null` if this library does not
+   * have an entry point. The entry point is defined to be a zero argument
+   * top-level function whose name is `main`.
+   */
+  FunctionElement get entryPoint;
+
+  /**
+   * Return a list containing all of the libraries that are exported from this
+   * library.
+   */
+  List<LibraryElement> get exportedLibraries;
+
+  /**
+   * The export [Namespace] of this library, `null` if it has not been
+   * computed yet.
+   */
+  Namespace get exportNamespace;
+
+  /**
+   * Return a list containing all of the exports defined in this library.
+   */
+  List<ExportElement> get exports;
+
+  /**
+   * Return `true` if the defining compilation unit of this library contains at
+   * least one import directive whose URI uses the "dart-ext" scheme.
+   */
+  bool get hasExtUri;
+
+  /**
+   * Return `true` if this library defines a top-level function named
+   * `loadLibrary`.
+   */
+  bool get hasLoadLibraryFunction;
+
+  /**
+   * Return a list containing all of the libraries that are imported into this
+   * library. This includes all of the libraries that are imported using a
+   * prefix (also available through the prefixes returned by [getPrefixes]) and
+   * those that are imported without a prefix.
+   */
+  List<LibraryElement> get importedLibraries;
+
+  /**
+   * Return a list containing all of the imports defined in this library.
+   */
+  List<ImportElement> get imports;
+
+  /**
+   * Return `true` if this library is an application that can be run in the
+   * browser.
+   */
+  bool get isBrowserApplication;
+
+  /**
+   * Return `true` if this library is the dart:core library.
+   */
+  bool get isDartCore;
+
+  /**
+   * Return `true` if this library is part of the SDK.
+   */
+  bool get isInSdk;
+
+  /**
+   * Return the element representing the synthetic function `loadLibrary` that
+   * is implicitly defined for this library if the library is imported using a
+   * deferred import.
+   */
+  FunctionElement get loadLibraryFunction;
+
+  /**
+   * Return a list containing all of the compilation units that are included in
+   * this library using a `part` directive. This does not include the defining
+   * compilation unit that contains the `part` directives.
+   */
+  List<CompilationUnitElement> get parts;
+
+  /**
+   * Return a list containing elements for each of the prefixes used to `import`
+   * libraries into this library. Each prefix can be used in more than one
+   * `import` directive.
+   */
+  List<PrefixElement> get prefixes;
+
+  /**
+   * The public [Namespace] of this library, `null` if it has not been
+   * computed yet.
+   */
+  Namespace get publicNamespace;
+
+  /**
+   * Return a list containing all of the compilation units this library consists
+   * of. This includes the defining compilation unit and units included using
+   * the `part` directive.
+   */
+  List<CompilationUnitElement> get units;
+
+  /**
+   * Return a list containing all directly and indirectly imported libraries.
+   */
+  List<LibraryElement> get visibleLibraries;
+
+  /**
+   * Return a list containing all of the imports that share the given [prefix],
+   * or an empty array if there are no such imports.
+   */
+  List<ImportElement> getImportsWithPrefix(PrefixElement prefix);
+
+  /**
+   * Return the class defined in this library that has the given [name], or
+   * `null` if this library does not define a class with the given name.
+   */
+  ClassElement getType(String className);
+
+  /**
+   * Return `true` if this library is up to date with respect to the given
+   * [timeStamp]. If any transitively referenced Source is newer than the time
+   * stamp, this method returns false.
+   */
+  bool isUpToDate(int timeStamp);
+}
+
+/**
+ * A concrete implementation of a [LibraryElement].
+ */
+class LibraryElementImpl extends ElementImpl implements LibraryElement {
+  /**
+   * An empty list of library elements.
+   */
+  @deprecated // Use LibraryElement.EMPTY_LIST
+  static const List<LibraryElement> EMPTY_ARRAY = const <LibraryElement>[];
+
+  /**
+   * The analysis context in which this library is defined.
+   */
+  final AnalysisContext context;
+
+  /**
+   * The compilation unit that defines this library.
+   */
+  CompilationUnitElement _definingCompilationUnit;
+
+  /**
+   * The entry point for this library, or `null` if this library does not have
+   * an entry point.
+   */
+  FunctionElement entryPoint;
+
+  /**
+   * A list containing specifications of all of the imports defined in this
+   * library.
+   */
+  List<ImportElement> _imports = ImportElement.EMPTY_LIST;
+
+  /**
+   * A list containing specifications of all of the exports defined in this
+   * library.
+   */
+  List<ExportElement> _exports = ExportElement.EMPTY_LIST;
+
+  /**
+   * A list containing all of the compilation units that are included in this
+   * library using a `part` directive.
+   */
+  List<CompilationUnitElement> _parts = CompilationUnitElement.EMPTY_LIST;
+
+  /**
+   * The element representing the synthetic function `loadLibrary` that is
+   * defined for this library, or `null` if the element has not yet been created.
+   */
+  FunctionElement _loadLibraryFunction;
+
+  /**
+   * The export [Namespace] of this library, `null` if it has not been
+   * computed yet.
+   */
+  @override
+  Namespace exportNamespace;
+
+  /**
+   * The public [Namespace] of this library, `null` if it has not been
+   * computed yet.
+   */
+  @override
+  Namespace publicNamespace;
+
+  /**
+   * Initialize a newly created library element in the given [context] to have
+   * the given [name] and [offset].
+   */
+  LibraryElementImpl(this.context, String name, int offset)
+      : super(name, offset);
+
+  /**
+   * Initialize a newly created library element in the given [context] to have
+   * the given [name].
+   */
+  LibraryElementImpl.forNode(this.context, LibraryIdentifier name)
+      : super.forNode(name);
+
+  @override
+  CompilationUnitElement get definingCompilationUnit =>
+      _definingCompilationUnit;
+
+  /**
+   * Set the compilation unit that defines this library to the given compilation
+   * [unit].
+   */
+  void set definingCompilationUnit(CompilationUnitElement unit) {
+    assert((unit as CompilationUnitElementImpl).librarySource == unit.source);
+    (unit as CompilationUnitElementImpl).enclosingElement = this;
+    this._definingCompilationUnit = unit;
+  }
+
+  @override
+  List<LibraryElement> get exportedLibraries {
+    HashSet<LibraryElement> libraries = new HashSet<LibraryElement>();
+    for (ExportElement element in _exports) {
+      LibraryElement library = element.exportedLibrary;
+      if (library != null) {
+        libraries.add(library);
+      }
+    }
+    return new List.from(libraries);
+  }
+
+  @override
+  List<ExportElement> get exports => _exports;
+
+  /**
+   * Set the specifications of all of the exports defined in this library to the
+   * given list of [exports].
+   */
+  void set exports(List<ExportElement> exports) {
+    for (ExportElement exportElement in exports) {
+      (exportElement as ExportElementImpl).enclosingElement = this;
+    }
+    this._exports = exports;
+  }
+
+  @override
+  bool get hasExtUri => hasModifier(Modifier.HAS_EXT_URI);
+
+  /**
+   * Set whether this library has an import of a "dart-ext" URI.
+   */
+  void set hasExtUri(bool hasExtUri) {
+    setModifier(Modifier.HAS_EXT_URI, hasExtUri);
+  }
+
+  @override
+  int get hashCode => _definingCompilationUnit.hashCode;
+
+  @override
+  bool get hasLoadLibraryFunction {
+    if (_definingCompilationUnit.hasLoadLibraryFunction) {
+      return true;
+    }
+    for (int i = 0; i < _parts.length; i++) {
+      if (_parts[i].hasLoadLibraryFunction) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  String get identifier => _definingCompilationUnit.source.encoding;
+
+  @override
+  List<LibraryElement> get importedLibraries {
+    HashSet<LibraryElement> libraries = new HashSet<LibraryElement>();
+    for (ImportElement element in _imports) {
+      LibraryElement library = element.importedLibrary;
+      if (library != null) {
+        libraries.add(library);
+      }
+    }
+    return new List.from(libraries);
+  }
+
+  @override
+  List<ImportElement> get imports => _imports;
+
+  /**
+   * Set the specifications of all of the imports defined in this library to the
+   * given list of [imports].
+   */
+  void set imports(List<ImportElement> imports) {
+    for (ImportElement importElement in imports) {
+      (importElement as ImportElementImpl).enclosingElement = this;
+      PrefixElementImpl prefix = importElement.prefix as PrefixElementImpl;
+      if (prefix != null) {
+        prefix.enclosingElement = this;
+      }
+    }
+    this._imports = imports;
+  }
+
+  @override
+  bool get isBrowserApplication =>
+      entryPoint != null && isOrImportsBrowserLibrary;
+
+  @override
+  bool get isDartCore => name == "dart.core";
+
+  @override
+  bool get isInSdk =>
+      StringUtilities.startsWith5(name, 0, 0x64, 0x61, 0x72, 0x74, 0x2E);
+
+  /**
+   * Return `true` if the receiver directly or indirectly imports the
+   * 'dart:html' libraries.
+   */
+  bool get isOrImportsBrowserLibrary {
+    List<LibraryElement> visited = new List<LibraryElement>();
+    Source htmlLibSource = context.sourceFactory.forUri(DartSdk.DART_HTML);
+    visited.add(this);
+    for (int index = 0; index < visited.length; index++) {
+      LibraryElement library = visited[index];
+      Source source = library.definingCompilationUnit.source;
+      if (source == htmlLibSource) {
+        return true;
+      }
+      for (LibraryElement importedLibrary in library.importedLibraries) {
+        if (!visited.contains(importedLibrary)) {
+          visited.add(importedLibrary);
+        }
+      }
+      for (LibraryElement exportedLibrary in library.exportedLibraries) {
+        if (!visited.contains(exportedLibrary)) {
+          visited.add(exportedLibrary);
+        }
+      }
+    }
+    return false;
+  }
+
+  @override
+  ElementKind get kind => ElementKind.LIBRARY;
+
+  @override
+  LibraryElement get library => this;
+
+  @override
+  FunctionElement get loadLibraryFunction {
+    if (_loadLibraryFunction == null) {
+      FunctionElementImpl function =
+          new FunctionElementImpl(FunctionElement.LOAD_LIBRARY_NAME, -1);
+      function.synthetic = true;
+      function.enclosingElement = this;
+      function.returnType = loadLibraryReturnType;
+      function.type = new FunctionTypeImpl(function);
+      _loadLibraryFunction = function;
+    }
+    return _loadLibraryFunction;
+  }
+
+  /**
+   * Return the object representing the type 'Future' from the 'dart:async'
+   * library, or the type 'void' if the type 'Future' cannot be accessed.
+   */
+  DartType get loadLibraryReturnType {
+    try {
+      Source asyncSource = context.sourceFactory.forUri(DartSdk.DART_ASYNC);
+      if (asyncSource == null) {
+        AnalysisEngine.instance.logger
+            .logError("Could not create a source for dart:async");
+        return VoidTypeImpl.instance;
+      }
+      LibraryElement asyncElement = context.computeLibraryElement(asyncSource);
+      if (asyncElement == null) {
+        AnalysisEngine.instance.logger
+            .logError("Could not build the element model for dart:async");
+        return VoidTypeImpl.instance;
+      }
+      ClassElement futureElement = asyncElement.getType("Future");
+      if (futureElement == null) {
+        AnalysisEngine.instance.logger
+            .logError("Could not find type Future in dart:async");
+        return VoidTypeImpl.instance;
+      }
+      InterfaceType futureType = futureElement.type;
+      return futureType.substitute4(<DartType>[DynamicTypeImpl.instance]);
+    } on AnalysisException catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logError(
+          "Could not build the element model for dart:async",
+          new CaughtException(exception, stackTrace));
+      return VoidTypeImpl.instance;
+    }
+  }
+
+  @override
+  List<CompilationUnitElement> get parts => _parts;
+
+  /**
+   * Set the compilation units that are included in this library using a `part`
+   * directive to the given list of [parts].
+   */
+  void set parts(List<CompilationUnitElement> parts) {
+    for (CompilationUnitElement compilationUnit in parts) {
+      assert((compilationUnit as CompilationUnitElementImpl).librarySource ==
+          source);
+      (compilationUnit as CompilationUnitElementImpl).enclosingElement = this;
+    }
+    this._parts = parts;
+  }
+
+  @override
+  List<PrefixElement> get prefixes {
+    HashSet<PrefixElement> prefixes = new HashSet<PrefixElement>();
+    for (ImportElement element in _imports) {
+      PrefixElement prefix = element.prefix;
+      if (prefix != null) {
+        prefixes.add(prefix);
+      }
+    }
+    return new List.from(prefixes);
+  }
+
+  @override
+  Source get source {
+    if (_definingCompilationUnit == null) {
+      return null;
+    }
+    return _definingCompilationUnit.source;
+  }
+
+  @override
+  List<CompilationUnitElement> get units {
+    List<CompilationUnitElement> units = new List<CompilationUnitElement>();
+    units.add(_definingCompilationUnit);
+    units.addAll(_parts);
+    return units;
+  }
+
+  @override
+  List<LibraryElement> get visibleLibraries {
+    Set<LibraryElement> visibleLibraries = new Set();
+    _addVisibleLibraries(visibleLibraries, false);
+    return new List.from(visibleLibraries);
+  }
+
+  @override
+  bool operator ==(Object object) => object is LibraryElementImpl &&
+      _definingCompilationUnit == object.definingCompilationUnit;
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitLibraryElement(this);
+
+  @override
+  ElementImpl getChild(String identifier) {
+    if ((_definingCompilationUnit as CompilationUnitElementImpl).identifier ==
+        identifier) {
+      return _definingCompilationUnit as CompilationUnitElementImpl;
+    }
+    for (CompilationUnitElement part in _parts) {
+      if ((part as CompilationUnitElementImpl).identifier == identifier) {
+        return part as CompilationUnitElementImpl;
+      }
+    }
+    for (ImportElement importElement in _imports) {
+      if ((importElement as ImportElementImpl).identifier == identifier) {
+        return importElement as ImportElementImpl;
+      }
+    }
+    for (ExportElement exportElement in _exports) {
+      if ((exportElement as ExportElementImpl).identifier == identifier) {
+        return exportElement as ExportElementImpl;
+      }
+    }
+    return null;
+  }
+
+  @override
+  List<ImportElement> getImportsWithPrefix(PrefixElement prefixElement) {
+    int count = _imports.length;
+    List<ImportElement> importList = new List<ImportElement>();
+    for (int i = 0; i < count; i++) {
+      if (identical(_imports[i].prefix, prefixElement)) {
+        importList.add(_imports[i]);
+      }
+    }
+    return importList;
+  }
+
+  @override
+  ClassElement getType(String className) {
+    ClassElement type = _definingCompilationUnit.getType(className);
+    if (type != null) {
+      return type;
+    }
+    for (CompilationUnitElement part in _parts) {
+      type = part.getType(className);
+      if (type != null) {
+        return type;
+      }
+    }
+    return null;
+  }
+
+  @override
+  bool isUpToDate(int timeStamp) {
+    Set<LibraryElement> visitedLibraries = new Set();
+    return _safeIsUpToDate(this, timeStamp, visitedLibraries);
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChild(_definingCompilationUnit, visitor);
+    safelyVisitChildren(_exports, visitor);
+    safelyVisitChildren(_imports, visitor);
+    safelyVisitChildren(_parts, visitor);
+  }
+
+  /**
+   * Recursively fills set of visible libraries for
+   * [getVisibleElementsLibraries].
+   */
+  void _addVisibleLibraries(
+      Set<LibraryElement> visibleLibraries, bool includeExports) {
+    // maybe already processed
+    if (!visibleLibraries.add(this)) {
+      return;
+    }
+    // add imported libraries
+    for (ImportElement importElement in _imports) {
+      LibraryElement importedLibrary = importElement.importedLibrary;
+      if (importedLibrary != null) {
+        (importedLibrary as LibraryElementImpl)
+            ._addVisibleLibraries(visibleLibraries, true);
+      }
+    }
+    // add exported libraries
+    if (includeExports) {
+      for (ExportElement exportElement in _exports) {
+        LibraryElement exportedLibrary = exportElement.exportedLibrary;
+        if (exportedLibrary != null) {
+          (exportedLibrary as LibraryElementImpl)
+              ._addVisibleLibraries(visibleLibraries, true);
+        }
+      }
+    }
+  }
+
+  /**
+   * Return `true` if the given [library] is up to date with respect to the
+   * given [timeStamp]. The set of [visitedLibraries] is used to prevent
+   * infinite recusion in the case of mutually dependent libraries.
+   */
+  static bool _safeIsUpToDate(LibraryElement library, int timeStamp,
+      Set<LibraryElement> visitedLibraries) {
+    if (!visitedLibraries.contains(library)) {
+      visitedLibraries.add(library);
+      AnalysisContext context = library.context;
+      // Check the defining compilation unit.
+      if (timeStamp <
+          context
+              .getModificationStamp(library.definingCompilationUnit.source)) {
+        return false;
+      }
+      // Check the parted compilation units.
+      for (CompilationUnitElement element in library.parts) {
+        if (timeStamp < context.getModificationStamp(element.source)) {
+          return false;
+        }
+      }
+      // Check the imported libraries.
+      for (LibraryElement importedLibrary in library.importedLibraries) {
+        if (!_safeIsUpToDate(importedLibrary, timeStamp, visitedLibraries)) {
+          return false;
+        }
+      }
+      // Check the exported libraries.
+      for (LibraryElement exportedLibrary in library.exportedLibraries) {
+        if (!_safeIsUpToDate(exportedLibrary, timeStamp, visitedLibraries)) {
+          return false;
+        }
+      }
+    }
+    return true;
+  }
+}
+
+/**
+ * An element that can be (but are not required to be) defined within a method
+ * or function (an [ExecutableElement]).
+ */
+abstract class LocalElement implements Element {
+  /**
+   * Return a source range that covers the approximate portion of the source in
+   * which the name of this element is visible, or `null` if there is no single
+   * range of characters within which the element name is visible.
+   *
+   * * For a local variable, this includes everything from the end of the
+   *   variable's initializer to the end of the block that encloses the variable
+   *   declaration.
+   * * For a parameter, this includes the body of the method or function that
+   *   declares the parameter.
+   * * For a local function, this includes everything from the beginning of the
+   *   function's body to the end of the block that encloses the function
+   *   declaration.
+   * * For top-level functions, `null` will be returned because they are
+   *   potentially visible in multiple sources.
+   */
+  SourceRange get visibleRange;
+}
+
+/**
+ * A local variable.
+ */
+abstract class LocalVariableElement implements LocalElement, VariableElement {
+  /**
+   * An empty list of field elements.
+   */
+  static const List<LocalVariableElement> EMPTY_LIST =
+      const <LocalVariableElement>[];
+
+  /**
+   * Return the resolved [VariableDeclaration] node that declares this
+   * [LocalVariableElement].
+   *
+   * This method is expensive, because resolved AST might be evicted from cache,
+   * so parsing and resolving will be performed.
+   */
+  @override
+  VariableDeclaration computeNode();
+}
+
+/**
+ * A concrete implementation of a [LocalVariableElement].
+ */
+class LocalVariableElementImpl extends VariableElementImpl
+    with PotentiallyConstVariableElement
+    implements LocalVariableElement {
+  /**
+   * An empty list of field elements.
+   */
+  @deprecated // Use LocalVariableElement.EMPTY_LIST
+  static const List<LocalVariableElement> EMPTY_ARRAY =
+      const <LocalVariableElement>[];
+
+  /**
+   * The offset to the beginning of the visible range for this element.
+   */
+  int _visibleRangeOffset = 0;
+
+  /**
+   * The length of the visible range for this element, or `-1` if this element
+   * does not have a visible range.
+   */
+  int _visibleRangeLength = -1;
+
+  /**
+   * Initialize a newly created method element to have the given [name] and
+   * [offset].
+   */
+  LocalVariableElementImpl(String name, int offset) : super(name, offset);
+
+  /**
+   * Initialize a newly created local variable element to have the given [name].
+   */
+  LocalVariableElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  @override
+  String get identifier {
+    int enclosingOffset =
+        enclosingElement != null ? enclosingElement.nameOffset : 0;
+    int delta = nameOffset - enclosingOffset;
+    return '${super.identifier}@$delta';
+  }
+
+  @override
+  bool get isPotentiallyMutatedInClosure =>
+      hasModifier(Modifier.POTENTIALLY_MUTATED_IN_CONTEXT);
+
+  @override
+  bool get isPotentiallyMutatedInScope =>
+      hasModifier(Modifier.POTENTIALLY_MUTATED_IN_SCOPE);
+
+  @override
+  ElementKind get kind => ElementKind.LOCAL_VARIABLE;
+
+  @override
+  SourceRange get visibleRange {
+    if (_visibleRangeLength < 0) {
+      return null;
+    }
+    return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
+  }
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitLocalVariableElement(this);
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    buffer.write(type);
+    buffer.write(" ");
+    buffer.write(displayName);
+  }
+
+  @override
+  VariableDeclaration computeNode() =>
+      getNodeMatching((node) => node is VariableDeclaration);
+
+  /**
+   * Specifies that this variable is potentially mutated somewhere in closure.
+   */
+  void markPotentiallyMutatedInClosure() {
+    setModifier(Modifier.POTENTIALLY_MUTATED_IN_CONTEXT, true);
+  }
+
+  /**
+   * Specifies that this variable is potentially mutated somewhere in its scope.
+   */
+  void markPotentiallyMutatedInScope() {
+    setModifier(Modifier.POTENTIALLY_MUTATED_IN_SCOPE, true);
+  }
+
+  /**
+   * Set the visible range for this element to the range starting at the given
+   * [offset] with the given [length].
+   */
+  void setVisibleRange(int offset, int length) {
+    _visibleRangeOffset = offset;
+    _visibleRangeLength = length;
+  }
+}
+
+/**
+ * An element defined in a parameterized type where the values of the type
+ * parameters are known.
+ */
+abstract class Member implements Element {
+  /**
+   * The element on which the parameterized element was created.
+   */
+  final Element _baseElement;
+
+  /**
+   * The type in which the element is defined.
+   */
+  final ParameterizedType _definingType;
+
+  /**
+   * Initialize a newly created element to represent a constructor, based on the
+   * [baseElement], defined by the [definingType].
+   */
+  Member(this._baseElement, this._definingType);
+
+  /**
+   * Return the element on which the parameterized element was created.
+   */
+  Element get baseElement => _baseElement;
+
+  @override
+  AnalysisContext get context => _baseElement.context;
+
+  /**
+   * Return the type in which the element is defined.
+   */
+  ParameterizedType get definingType => _definingType;
+
+  @override
+  String get displayName => _baseElement.displayName;
+
+  int get id => _baseElement.id;
+
+  @override
+  bool get isDeprecated => _baseElement.isDeprecated;
+
+  @override
+  bool get isOverride => _baseElement.isOverride;
+
+  @override
+  bool get isPrivate => _baseElement.isPrivate;
+
+  @override
+  bool get isPublic => _baseElement.isPublic;
+
+  @override
+  bool get isSynthetic => _baseElement.isSynthetic;
+
+  @override
+  ElementKind get kind => _baseElement.kind;
+
+  @override
+  LibraryElement get library => _baseElement.library;
+
+  @override
+  ElementLocation get location => _baseElement.location;
+
+  @override
+  List<ElementAnnotation> get metadata => _baseElement.metadata;
+
+  @override
+  String get name => _baseElement.name;
+
+  @override
+  int get nameOffset => _baseElement.nameOffset;
+
+  @deprecated
+  @override
+  AstNode get node => computeNode();
+
+  @override
+  Source get source => _baseElement.source;
+
+  @override
+  CompilationUnit get unit => _baseElement.unit;
+
+  @override
+  String computeDocumentationComment() =>
+      _baseElement.computeDocumentationComment();
+
+  @override
+  AstNode computeNode() => _baseElement.computeNode();
+
+  @override
+  Element getAncestor(Predicate<Element> predicate) =>
+      baseElement.getAncestor(predicate);
+
+  @override
+  String getExtendedDisplayName(String shortName) =>
+      _baseElement.getExtendedDisplayName(shortName);
+
+  @override
+  bool isAccessibleIn(LibraryElement library) =>
+      _baseElement.isAccessibleIn(library);
+
+  /**
+   * If the given [child] is not `null`, use the given [visitor] to visit it.
+   */
+  void safelyVisitChild(Element child, ElementVisitor visitor) {
+    // TODO(brianwilkerson) Make this private
+    if (child != null) {
+      child.accept(visitor);
+    }
+  }
+
+  /**
+   * Use the given [visitor] to visit all of the [children].
+   */
+  void safelyVisitChildren(List<Element> children, ElementVisitor visitor) {
+    // TODO(brianwilkerson) Make this private
+    if (children != null) {
+      for (Element child in children) {
+        child.accept(visitor);
+      }
+    }
+  }
+
+  /**
+   * Return the type that results from replacing the type parameters in the
+   * given [type] with the type arguments associated with this member.
+   */
+  DartType substituteFor(DartType type) {
+    if (type == null) {
+      return null;
+    }
+    List<DartType> argumentTypes = _definingType.typeArguments;
+    List<DartType> parameterTypes =
+        TypeParameterTypeImpl.getTypes(_definingType.typeParameters);
+    return type.substitute2(argumentTypes, parameterTypes);
+  }
+
+  /**
+   * Return the list of types that results from replacing the type parameters in
+   * the given [types] with the type arguments associated with this member.
+   */
+  List<InterfaceType> substituteFor2(List<InterfaceType> types) {
+    int count = types.length;
+    List<InterfaceType> substitutedTypes = new List<InterfaceType>(count);
+    for (int i = 0; i < count; i++) {
+      substitutedTypes[i] = substituteFor(types[i]);
+    }
+    return substitutedTypes;
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    // There are no children to visit
+  }
+}
+
+/**
+ * An element that represents a method defined within a type.
+ */
+abstract class MethodElement implements ClassMemberElement, ExecutableElement {
+  /**
+   * An empty list of method elements.
+   */
+  static const List<MethodElement> EMPTY_LIST = const <MethodElement>[];
+
+  /**
+   * Return the resolved [MethodDeclaration] node that declares this
+   * [MethodElement].
+   *
+   * This method is expensive, because resolved AST might be evicted from cache,
+   * so parsing and resolving will be performed.
+   */
+  @override
+  MethodDeclaration computeNode();
+}
+
+/**
+ * A concrete implementation of a [MethodElement].
+ */
+class MethodElementImpl extends ExecutableElementImpl implements MethodElement {
+  /**
+   * An empty list of method elements.
+   */
+  @deprecated // Use MethodElement.EMPTY_LIST
+  static const List<MethodElement> EMPTY_ARRAY = const <MethodElement>[];
+
+  /**
+   * Initialize a newly created method element to have the given [name] at the
+   * given [offset].
+   */
+  MethodElementImpl(String name, int offset) : super(name, offset);
+
+  /**
+   * Initialize a newly created method element to have the given [name].
+   */
+  MethodElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  /**
+   * Set whether this method is abstract.
+   */
+  void set abstract(bool isAbstract) {
+    setModifier(Modifier.ABSTRACT, isAbstract);
+  }
+
+  @override
+  String get displayName {
+    String displayName = super.displayName;
+    if ("unary-" == displayName) {
+      return "-";
+    }
+    return displayName;
+  }
+
+  @override
+  ClassElement get enclosingElement => super.enclosingElement as ClassElement;
+
+  @override
+  bool get isOperator {
+    String name = displayName;
+    if (name.isEmpty) {
+      return false;
+    }
+    int first = name.codeUnitAt(0);
+    return !((0x61 <= first && first <= 0x7A) ||
+        (0x41 <= first && first <= 0x5A) ||
+        first == 0x5F ||
+        first == 0x24);
+  }
+
+  @override
+  bool get isStatic => hasModifier(Modifier.STATIC);
+
+  @override
+  ElementKind get kind => ElementKind.METHOD;
+
+  @override
+  String get name {
+    String name = super.name;
+    if (isOperator && name == "-") {
+      if (parameters.length == 0) {
+        return "unary-";
+      }
+    }
+    return super.name;
+  }
+
+  /**
+   * Set whether this method is static.
+   */
+  void set static(bool isStatic) {
+    setModifier(Modifier.STATIC, isStatic);
+  }
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitMethodElement(this);
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    buffer.write(displayName);
+    super.appendTo(buffer);
+  }
+
+  @override
+  MethodDeclaration computeNode() =>
+      getNodeMatching((node) => node is MethodDeclaration);
+}
+
+/**
+ * A method element defined in a parameterized type where the values of the type
+ * parameters are known.
+ */
+class MethodMember extends ExecutableMember implements MethodElement {
+  /**
+   * Initialize a newly created element to represent a constructor, based on the
+   * [baseElement], defined by the [definingType].
+   */
+  MethodMember(MethodElement baseElement, InterfaceType definingType)
+      : super(baseElement, definingType);
+
+  @override
+  MethodElement get baseElement => super.baseElement as MethodElement;
+
+  @override
+  ClassElement get enclosingElement => baseElement.enclosingElement;
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitMethodElement(this);
+
+  @override
+  MethodDeclaration computeNode() => baseElement.computeNode();
+
+  @override
+  String toString() {
+    MethodElement baseElement = this.baseElement;
+    List<ParameterElement> parameters = this.parameters;
+    FunctionType type = this.type;
+    StringBuffer buffer = new StringBuffer();
+    buffer.write(baseElement.enclosingElement.displayName);
+    buffer.write(".");
+    buffer.write(baseElement.displayName);
+    buffer.write("(");
+    int parameterCount = parameters.length;
+    for (int i = 0; i < parameterCount; i++) {
+      if (i > 0) {
+        buffer.write(", ");
+      }
+      buffer.write(parameters[i]);
+    }
+    buffer.write(")");
+    if (type != null) {
+      buffer.write(Element.RIGHT_ARROW);
+      buffer.write(type.returnType);
+    }
+    return buffer.toString();
+  }
+
+  /**
+   * If the given [method]'s type is different when any type parameters from the
+   * defining type's declaration are replaced with the actual type arguments
+   * from the [definingType], create a method member representing the given
+   * method. Return the member that was created, or the base method if no member
+   * was created.
+   */
+  static MethodElement from(MethodElement method, InterfaceType definingType) {
+    if (method == null || definingType.typeArguments.length == 0) {
+      return method;
+    }
+    FunctionType baseType = method.type;
+    List<DartType> argumentTypes = definingType.typeArguments;
+    List<DartType> parameterTypes = definingType.element.type.typeArguments;
+    FunctionType substitutedType =
+        baseType.substitute2(argumentTypes, parameterTypes);
+    if (baseType == substitutedType) {
+      return method;
+    }
+    // TODO(brianwilkerson) Consider caching the substituted type in the
+    // instance. It would use more memory but speed up some operations.
+    // We need to see how often the type is being re-computed.
+    return new MethodMember(method, definingType);
+  }
+}
+
+/**
+ * The enumeration `Modifier` defines constants for all of the modifiers defined
+ * by the Dart language and for a few additional flags that are useful.
+ */
+class Modifier extends Enum<Modifier> {
+  /**
+   * Indicates that the modifier 'abstract' was applied to the element.
+   */
+  static const Modifier ABSTRACT = const Modifier('ABSTRACT', 0);
+
+  /**
+   * Indicates that an executable element has a body marked as being
+   * asynchronous.
+   */
+  static const Modifier ASYNCHRONOUS = const Modifier('ASYNCHRONOUS', 1);
+
+  /**
+   * Indicates that the modifier 'const' was applied to the element.
+   */
+  static const Modifier CONST = const Modifier('CONST', 2);
+
+  /**
+   * Indicates that the import element represents a deferred library.
+   */
+  static const Modifier DEFERRED = const Modifier('DEFERRED', 3);
+
+  /**
+   * Indicates that a class element was defined by an enum declaration.
+   */
+  static const Modifier ENUM = const Modifier('ENUM', 4);
+
+  /**
+   * Indicates that a class element was defined by an enum declaration.
+   */
+  static const Modifier EXTERNAL = const Modifier('EXTERNAL', 5);
+
+  /**
+   * Indicates that the modifier 'factory' was applied to the element.
+   */
+  static const Modifier FACTORY = const Modifier('FACTORY', 6);
+
+  /**
+   * Indicates that the modifier 'final' was applied to the element.
+   */
+  static const Modifier FINAL = const Modifier('FINAL', 7);
+
+  /**
+   * Indicates that an executable element has a body marked as being a
+   * generator.
+   */
+  static const Modifier GENERATOR = const Modifier('GENERATOR', 8);
+
+  /**
+   * Indicates that the pseudo-modifier 'get' was applied to the element.
+   */
+  static const Modifier GETTER = const Modifier('GETTER', 9);
+
+  /**
+   * A flag used for libraries indicating that the defining compilation unit
+   * contains at least one import directive whose URI uses the "dart-ext"
+   * scheme.
+   */
+  static const Modifier HAS_EXT_URI = const Modifier('HAS_EXT_URI', 10);
+
+  /**
+   * Indicates that the associated element did not have an explicit type
+   * associated with it. If the element is an [ExecutableElement], then the
+   * type being referred to is the return type.
+   */
+  static const Modifier IMPLICIT_TYPE = const Modifier('IMPLICIT_TYPE', 11);
+
+  /**
+   * Indicates that a class can validly be used as a mixin.
+   */
+  static const Modifier MIXIN = const Modifier('MIXIN', 12);
+
+  /**
+   * Indicates that a class is a mixin application.
+   */
+  static const Modifier MIXIN_APPLICATION =
+      const Modifier('MIXIN_APPLICATION', 13);
+
+  /**
+   * Indicates that the value of a parameter or local variable might be mutated
+   * within the context.
+   */
+  static const Modifier POTENTIALLY_MUTATED_IN_CONTEXT =
+      const Modifier('POTENTIALLY_MUTATED_IN_CONTEXT', 14);
+
+  /**
+   * Indicates that the value of a parameter or local variable might be mutated
+   * within the scope.
+   */
+  static const Modifier POTENTIALLY_MUTATED_IN_SCOPE =
+      const Modifier('POTENTIALLY_MUTATED_IN_SCOPE', 15);
+
+  /**
+   * Indicates that a class contains an explicit reference to 'super'.
+   */
+  static const Modifier REFERENCES_SUPER =
+      const Modifier('REFERENCES_SUPER', 16);
+
+  /**
+   * Indicates that the pseudo-modifier 'set' was applied to the element.
+   */
+  static const Modifier SETTER = const Modifier('SETTER', 17);
+
+  /**
+   * Indicates that the modifier 'static' was applied to the element.
+   */
+  static const Modifier STATIC = const Modifier('STATIC', 18);
+
+  /**
+   * Indicates that the element does not appear in the source code but was
+   * implicitly created. For example, if a class does not define any
+   * constructors, an implicit zero-argument constructor will be created and it
+   * will be marked as being synthetic.
+   */
+  static const Modifier SYNTHETIC = const Modifier('SYNTHETIC', 19);
+
+  static const List<Modifier> values = const [
+    ABSTRACT,
+    ASYNCHRONOUS,
+    CONST,
+    DEFERRED,
+    ENUM,
+    EXTERNAL,
+    FACTORY,
+    FINAL,
+    GENERATOR,
+    GETTER,
+    HAS_EXT_URI,
+    IMPLICIT_TYPE,
+    MIXIN,
+    MIXIN_APPLICATION,
+    POTENTIALLY_MUTATED_IN_CONTEXT,
+    POTENTIALLY_MUTATED_IN_SCOPE,
+    REFERENCES_SUPER,
+    SETTER,
+    STATIC,
+    SYNTHETIC
+  ];
+
+  const Modifier(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
+ * A pseudo-element that represents multiple elements defined within a single
+ * scope that have the same name. This situation is not allowed by the language,
+ * so objects implementing this interface always represent an error. As a
+ * result, most of the normal operations on elements do not make sense and will
+ * return useless results.
+ */
+abstract class MultiplyDefinedElement implements Element {
+  /**
+   * Return a list containing all of the elements that were defined within the
+   * scope to have the same name.
+   */
+  List<Element> get conflictingElements;
+
+  /**
+   * Return the type of this element as the dynamic type.
+   */
+  DartType get type;
+}
+
+/**
+ * A concrete implementation of a [MultiplyDefinedElement].
+ */
+class MultiplyDefinedElementImpl implements MultiplyDefinedElement {
+  /**
+   * The unique integer identifier of this element.
+   */
+  final int id = ElementImpl._NEXT_ID++;
+
+  /**
+   * The analysis context in which the multiply defined elements are defined.
+   */
+  final AnalysisContext context;
+
+  /**
+   * The name of the conflicting elements.
+   */
+  String _name;
+
+  /**
+   * A list containing all of the elements that conflict.
+   */
+  final List<Element> conflictingElements;
+
+  /**
+   * Initialize a newly created element in the given [context] to represent a
+   * list of [conflictingElements].
+   */
+  MultiplyDefinedElementImpl(this.context, this.conflictingElements) {
+    _name = conflictingElements[0].name;
+  }
+
+  @override
+  String get displayName => _name;
+
+  @override
+  Element get enclosingElement => null;
+
+  @override
+  bool get isDeprecated => false;
+
+  @override
+  bool get isOverride => false;
+
+  @override
+  bool get isPrivate {
+    String name = displayName;
+    if (name == null) {
+      return false;
+    }
+    return Identifier.isPrivateName(name);
+  }
+
+  @override
+  bool get isPublic => !isPrivate;
+
+  @override
+  bool get isSynthetic => true;
+
+  @override
+  ElementKind get kind => ElementKind.ERROR;
+
+  @override
+  LibraryElement get library => null;
+
+  @override
+  ElementLocation get location => null;
+
+  @override
+  List<ElementAnnotation> get metadata => ElementAnnotation.EMPTY_LIST;
+
+  @override
+  String get name => _name;
+
+  @override
+  int get nameOffset => -1;
+
+  @deprecated
+  @override
+  AstNode get node => null;
+
+  @override
+  Source get source => null;
+
+  @override
+  DartType get type => DynamicTypeImpl.instance;
+
+  @override
+  CompilationUnit get unit => null;
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitMultiplyDefinedElement(this);
+
+  @override
+  String computeDocumentationComment() => null;
+
+  @override
+  AstNode computeNode() => null;
+
+  @override
+  Element getAncestor(Predicate<Element> predicate) => null;
+
+  @override
+  String getExtendedDisplayName(String shortName) {
+    if (shortName != null) {
+      return shortName;
+    }
+    return displayName;
+  }
+
+  @override
+  bool isAccessibleIn(LibraryElement library) {
+    for (Element element in conflictingElements) {
+      if (element.isAccessibleIn(library)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("[");
+    int count = conflictingElements.length;
+    for (int i = 0; i < count; i++) {
+      if (i > 0) {
+        buffer.write(", ");
+      }
+      (conflictingElements[i] as ElementImpl).appendTo(buffer);
+    }
+    buffer.write("]");
+    return buffer.toString();
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    // There are no children to visit
+  }
+
+  /**
+   * Return an element in the given [context] that represents the fact that the
+   * [firstElement] and [secondElement] conflict. (If the elements are the same,
+   * then one of the two will be returned directly.)
+   */
+  static Element fromElements(
+      AnalysisContext context, Element firstElement, Element secondElement) {
+    List<Element> conflictingElements =
+        _computeConflictingElements(firstElement, secondElement);
+    int length = conflictingElements.length;
+    if (length == 0) {
+      return null;
+    } else if (length == 1) {
+      return conflictingElements[0];
+    }
+    return new MultiplyDefinedElementImpl(context, conflictingElements);
+  }
+
+  /**
+   * Add the given [element] to the list of [elements]. If the element is a
+   * multiply-defined element, add all of the conflicting elements that it
+   * represents.
+   */
+  static void _add(HashSet<Element> elements, Element element) {
+    if (element is MultiplyDefinedElementImpl) {
+      for (Element conflictingElement in element.conflictingElements) {
+        elements.add(conflictingElement);
+      }
+    } else {
+      elements.add(element);
+    }
+  }
+
+  /**
+   * Use the given elements to construct a list of conflicting elements. If
+   * either the [firstElement] or [secondElement] are multiply-defined elements
+   * then the conflicting elements they represent will be included in the array.
+   * Otherwise, the element itself will be included.
+   */
+  static List<Element> _computeConflictingElements(
+      Element firstElement, Element secondElement) {
+    HashSet<Element> elements = new HashSet<Element>();
+    _add(elements, firstElement);
+    _add(elements, secondElement);
+    return new List.from(elements);
+  }
+}
+
+/**
+ * An [ExecutableElement], with the additional information of a list of
+ * [ExecutableElement]s from which this element was composed.
+ */
+abstract class MultiplyInheritedExecutableElement implements ExecutableElement {
+  /**
+   * Return a list containing all of the executable elements defined within this
+   * executable element.
+   */
+  List<ExecutableElement> get inheritedElements;
+}
+
+/**
+ * A [MethodElementImpl], with the additional information of a list of
+ * [ExecutableElement]s from which this element was composed.
+ */
+class MultiplyInheritedMethodElementImpl extends MethodElementImpl
+    implements MultiplyInheritedExecutableElement {
+  /**
+   * A list the array of executable elements that were used to compose this
+   * element.
+   */
+  List<ExecutableElement> _elements = MethodElement.EMPTY_LIST;
+
+  MultiplyInheritedMethodElementImpl(Identifier name) : super.forNode(name) {
+    synthetic = true;
+  }
+
+  @override
+  List<ExecutableElement> get inheritedElements => _elements;
+
+  void set inheritedElements(List<ExecutableElement> elements) {
+    this._elements = elements;
+  }
+}
+
+/**
+ * A [PropertyAccessorElementImpl], with the additional information of a list of
+ * [ExecutableElement]s from which this element was composed.
+ */
+class MultiplyInheritedPropertyAccessorElementImpl
+    extends PropertyAccessorElementImpl
+    implements MultiplyInheritedExecutableElement {
+  /**
+   * A list the array of executable elements that were used to compose this
+   * element.
+   */
+  List<ExecutableElement> _elements = PropertyAccessorElement.EMPTY_LIST;
+
+  MultiplyInheritedPropertyAccessorElementImpl(Identifier name)
+      : super.forNode(name) {
+    synthetic = true;
+  }
+
+  @override
+  List<ExecutableElement> get inheritedElements => _elements;
+
+  void set inheritedElements(List<ExecutableElement> elements) {
+    this._elements = elements;
+  }
+}
+
+/**
+ * An object that controls how namespaces are combined.
+ */
+abstract class NamespaceCombinator {
+  /**
+   * An empty list of namespace combinators.
+   */
+  @deprecated // Use NamespaceCombinator.EMPTY_LIST
+  static const List<NamespaceCombinator> EMPTY_ARRAY =
+      const <NamespaceCombinator>[];
+
+  /**
+   * An empty list of namespace combinators.
+   */
+  static const List<NamespaceCombinator> EMPTY_LIST =
+      const <NamespaceCombinator>[];
+}
+
+/**
+ * A parameter defined within an executable element.
+ */
+abstract class ParameterElement
+    implements LocalElement, VariableElement, ConstantEvaluationTarget {
+  /**
+   * An empty list of parameter elements.
+   */
+  static const List<ParameterElement> EMPTY_LIST = const <ParameterElement>[];
+
+  /**
+   * Return the Dart code of the default value, or `null` if no default value.
+   */
+  String get defaultValueCode;
+
+  /**
+   * Return `true` if this parameter is an initializing formal parameter.
+   */
+  bool get isInitializingFormal;
+
+  /**
+   * Return the kind of this parameter.
+   */
+  ParameterKind get parameterKind;
+
+  /**
+   * Return a list containing all of the parameters defined by this parameter.
+   * A parameter will only define other parameters if it is a function typed
+   * parameter.
+   */
+  List<ParameterElement> get parameters;
+
+  /**
+   * Return a list containing all of the type parameters defined by this
+   * parameter. A parameter will only define other parameters if it is a
+   * function typed parameter.
+   */
+  List<TypeParameterElement> get typeParameters;
+
+  /**
+   * Append the type, name and possibly the default value of this parameter to
+   * the given [buffer].
+   */
+  void appendToWithoutDelimiters(StringBuffer buffer);
+
+  @override
+  FormalParameter computeNode();
+}
+
+/**
+ * A concrete implementation of a [ParameterElement].
+ */
+class ParameterElementImpl extends VariableElementImpl
+    with ParameterElementMixin, PotentiallyConstVariableElement
+    implements ParameterElement {
+  /**
+   * An empty list of parameter elements.
+   */
+  @deprecated // Use ParameterElement.EMPTY_LIST
+  static const List<ParameterElement> EMPTY_ARRAY = const <ParameterElement>[];
+
+  /**
+   * A list containing all of the parameters defined by this parameter element.
+   * There will only be parameters if this parameter is a function typed
+   * parameter.
+   */
+  List<ParameterElement> _parameters = ParameterElement.EMPTY_LIST;
+
+  /**
+   * A list containing all of the type parameters defined for this parameter
+   * element. There will only be parameters if this parameter is a function
+   * typed parameter.
+   */
+  List<TypeParameterElement> _typeParameters = TypeParameterElement.EMPTY_LIST;
+
+  /**
+   * The kind of this parameter.
+   */
+  ParameterKind parameterKind;
+
+  /**
+   * The Dart code of the default value.
+   */
+  String _defaultValueCode;
+
+  /**
+   * The offset to the beginning of the visible range for this element.
+   */
+  int _visibleRangeOffset = 0;
+
+  /**
+   * The length of the visible range for this element, or `-1` if this element
+   * does not have a visible range.
+   */
+  int _visibleRangeLength = -1;
+
+  /**
+   * Initialize a newly created parameter element to have the given [name] and
+   * [offset].
+   */
+  ParameterElementImpl(String name, int nameOffset) : super(name, nameOffset);
+
+  /**
+   * Initialize a newly created parameter element to have the given [name].
+   */
+  ParameterElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  @override
+  String get defaultValueCode => _defaultValueCode;
+
+  /**
+   * Set Dart code of the default value.
+   */
+  void set defaultValueCode(String defaultValueCode) {
+    this._defaultValueCode = StringUtilities.intern(defaultValueCode);
+  }
+
+  @override
+  bool get isInitializingFormal => false;
+
+  @override
+  bool get isPotentiallyMutatedInClosure =>
+      hasModifier(Modifier.POTENTIALLY_MUTATED_IN_CONTEXT);
+
+  @override
+  bool get isPotentiallyMutatedInScope =>
+      hasModifier(Modifier.POTENTIALLY_MUTATED_IN_SCOPE);
+
+  @override
+  ElementKind get kind => ElementKind.PARAMETER;
+
+  @override
+  List<ParameterElement> get parameters => _parameters;
+
+  /**
+   * Set the parameters defined by this executable element to the given
+   * [parameters].
+   */
+  void set parameters(List<ParameterElement> parameters) {
+    for (ParameterElement parameter in parameters) {
+      (parameter as ParameterElementImpl).enclosingElement = this;
+    }
+    this._parameters = parameters;
+  }
+
+  @override
+  List<TypeParameterElement> get typeParameters => _typeParameters;
+
+  /**
+   * Set the type parameters defined by this parameter element to the given
+   * [typeParameters].
+   */
+  void set typeParameters(List<TypeParameterElement> typeParameters) {
+    for (TypeParameterElement parameter in typeParameters) {
+      (parameter as TypeParameterElementImpl).enclosingElement = this;
+    }
+    this._typeParameters = typeParameters;
+  }
+
+  @override
+  SourceRange get visibleRange {
+    if (_visibleRangeLength < 0) {
+      return null;
+    }
+    return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
+  }
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitParameterElement(this);
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    String left = "";
+    String right = "";
+    while (true) {
+      if (parameterKind == ParameterKind.NAMED) {
+        left = "{";
+        right = "}";
+      } else if (parameterKind == ParameterKind.POSITIONAL) {
+        left = "[";
+        right = "]";
+      } else if (parameterKind == ParameterKind.REQUIRED) {}
+      break;
+    }
+    buffer.write(left);
+    appendToWithoutDelimiters(buffer);
+    buffer.write(right);
+  }
+
+  @override
+  FormalParameter computeNode() =>
+      getNodeMatching((node) => node is FormalParameter);
+
+  @override
+  ElementImpl getChild(String identifier) {
+    for (ParameterElement parameter in _parameters) {
+      if ((parameter as ParameterElementImpl).identifier == identifier) {
+        return parameter as ParameterElementImpl;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Specifies that this variable is potentially mutated somewhere in closure.
+   */
+  void markPotentiallyMutatedInClosure() {
+    setModifier(Modifier.POTENTIALLY_MUTATED_IN_CONTEXT, true);
+  }
+
+  /**
+   * Specifies that this variable is potentially mutated somewhere in its scope.
+   */
+  void markPotentiallyMutatedInScope() {
+    setModifier(Modifier.POTENTIALLY_MUTATED_IN_SCOPE, true);
+  }
+
+  /**
+   * Set the visible range for this element to the range starting at the given
+   * [offset] with the given [length].
+   */
+  void setVisibleRange(int offset, int length) {
+    _visibleRangeOffset = offset;
+    _visibleRangeLength = length;
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChildren(_parameters, visitor);
+  }
+}
+
+/**
+ * A mixin that provides a common implementation for methods defined in
+ * [ParameterElement].
+ */
+abstract class ParameterElementMixin implements ParameterElement {
+  @override
+  void appendToWithoutDelimiters(StringBuffer buffer) {
+    buffer.write(type);
+    buffer.write(" ");
+    buffer.write(displayName);
+    if (defaultValueCode != null) {
+      if (parameterKind == ParameterKind.NAMED) {
+        buffer.write(": ");
+      }
+      if (parameterKind == ParameterKind.POSITIONAL) {
+        buffer.write(" = ");
+      }
+      buffer.write(defaultValueCode);
+    }
+  }
+}
+
+/**
+ * A type with type parameters, such as a class or function type alias.
+ */
+abstract class ParameterizedType implements DartType {
+  /**
+   * Return a list containing the actual types of the type arguments. If this
+   * type's element does not have type parameters, then the array should be
+   * empty (although it is possible for type arguments to be erroneously
+   * declared). If the element has type parameters and the actual type does not
+   * explicitly include argument values, then the type "dynamic" will be
+   * automatically provided.
+   */
+  List<DartType> get typeArguments;
+
+  /**
+   * Return a list containing all of the type parameters declared for this type.
+   */
+  List<TypeParameterElement> get typeParameters;
+}
+
+/**
+ * A parameter element defined in a parameterized type where the values of the
+ * type parameters are known.
+ */
+class ParameterMember extends VariableMember
+    with ParameterElementMixin
+    implements ParameterElement {
+  /**
+   * Initialize a newly created element to represent a constructor, based on the
+   * [baseElement], defined by the [definingType].
+   */
+  ParameterMember(ParameterElement baseElement, ParameterizedType definingType)
+      : super(baseElement, definingType);
+
+  @override
+  ParameterElement get baseElement => super.baseElement as ParameterElement;
+
+  @override
+  String get defaultValueCode => baseElement.defaultValueCode;
+
+  @override
+  Element get enclosingElement => baseElement.enclosingElement;
+
+  @override
+  bool get isInitializingFormal => baseElement.isInitializingFormal;
+
+  @override
+  ParameterKind get parameterKind => baseElement.parameterKind;
+
+  @override
+  List<ParameterElement> get parameters {
+    List<ParameterElement> baseParameters = baseElement.parameters;
+    int parameterCount = baseParameters.length;
+    if (parameterCount == 0) {
+      return baseParameters;
+    }
+    List<ParameterElement> parameterizedParameters =
+        new List<ParameterElement>(parameterCount);
+    for (int i = 0; i < parameterCount; i++) {
+      parameterizedParameters[i] =
+          ParameterMember.from(baseParameters[i], definingType);
+    }
+    return parameterizedParameters;
+  }
+
+  @override
+  List<TypeParameterElement> get typeParameters => baseElement.typeParameters;
+
+  @override
+  SourceRange get visibleRange => baseElement.visibleRange;
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitParameterElement(this);
+
+  @override
+  FormalParameter computeNode() => baseElement.computeNode();
+
+  @override
+  Element getAncestor(Predicate<Element> predicate) {
+    Element element = baseElement.getAncestor(predicate);
+    ParameterizedType definingType = this.definingType;
+    if (definingType is InterfaceType) {
+      InterfaceType definingInterfaceType = definingType;
+      if (element is ConstructorElement) {
+        return ConstructorMember.from(element, definingInterfaceType);
+      } else if (element is MethodElement) {
+        return MethodMember.from(element, definingInterfaceType);
+      } else if (element is PropertyAccessorElement) {
+        return PropertyAccessorMember.from(element, definingInterfaceType);
+      }
+    }
+    return element;
+  }
+
+  @override
+  String toString() {
+    ParameterElement baseElement = this.baseElement;
+    String left = "";
+    String right = "";
+    while (true) {
+      if (baseElement.parameterKind == ParameterKind.NAMED) {
+        left = "{";
+        right = "}";
+      } else if (baseElement.parameterKind == ParameterKind.POSITIONAL) {
+        left = "[";
+        right = "]";
+      } else if (baseElement.parameterKind == ParameterKind.REQUIRED) {}
+      break;
+    }
+    return '$left$type ${baseElement.displayName}$right';
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChildren(parameters, visitor);
+  }
+
+  /**
+   * If the given [parameter]'s type is different when any type parameters from
+   * the defining type's declaration are replaced with the actual type
+   * arguments from the [definingType], create a parameter member representing
+   * the given parameter. Return the member that was created, or the base
+   * parameter if no member was created.
+   */
+  static ParameterElement from(
+      ParameterElement parameter, ParameterizedType definingType) {
+    if (parameter == null || definingType.typeArguments.length == 0) {
+      return parameter;
+    }
+    // Check if parameter type depends on defining type type arguments.
+    // It is possible that we did not resolve field formal parameter yet,
+    // so skip this check for it.
+    bool isFieldFormal = parameter is FieldFormalParameterElement;
+    if (!isFieldFormal) {
+      DartType baseType = parameter.type;
+      List<DartType> argumentTypes = definingType.typeArguments;
+      List<DartType> parameterTypes =
+          TypeParameterTypeImpl.getTypes(definingType.typeParameters);
+      DartType substitutedType =
+          baseType.substitute2(argumentTypes, parameterTypes);
+      if (baseType == substitutedType) {
+        return parameter;
+      }
+    }
+    // TODO(brianwilkerson) Consider caching the substituted type in the
+    // instance. It would use more memory but speed up some operations.
+    // We need to see how often the type is being re-computed.
+    if (isFieldFormal) {
+      return new FieldFormalParameterMember(
+          parameter as FieldFormalParameterElement, definingType);
+    }
+    return new ParameterMember(parameter, definingType);
+  }
+}
+
+/**
+ * Interface used by elements that might represent constant variables.
+ *
+ * This class may be used as a mixin in the case where [constInitializer] is
+ * known to return null.
+ *
+ * This class is not intended to be part of the public API for analyzer.
+ */
+abstract class PotentiallyConstVariableElement
+    implements VariableElementImpl, ConstantEvaluationTarget {
+  /**
+   * If this element represents a constant variable, and it has an initializer,
+   * a copy of the initializer for the constant.  Otherwise `null`.
+   *
+   * Note that in correct Dart code, all constant variables must have
+   * initializers.  However, analyzer also needs to handle incorrect Dart code,
+   * in which case there might be some constant variables that lack
+   * initializers.
+   */
+  Expression get constantInitializer => null;
+}
+
+/**
+ * A prefix used to import one or more libraries into another library.
+ */
+abstract class PrefixElement implements Element {
+  /**
+   * An empty list of prefix elements.
+   */
+  static const List<PrefixElement> EMPTY_LIST = const <PrefixElement>[];
+
+  /**
+   * Return the library into which other libraries are imported using this
+   * prefix.
+   */
+  @override
+  LibraryElement get enclosingElement;
+
+  /**
+   * Return a list containing all of the libraries that are imported using this
+   * prefix.
+   */
+  List<LibraryElement> get importedLibraries;
+}
+
+/**
+ * A concrete implementation of a [PrefixElement].
+ */
+class PrefixElementImpl extends ElementImpl implements PrefixElement {
+  /**
+   * An empty list of prefix elements.
+   */
+  @deprecated // Use PrefixElement.EMPTY_LIST
+  static const List<PrefixElement> EMPTY_ARRAY = const <PrefixElement>[];
+
+  /**
+   * A list containing all of the libraries that are imported using this prefix.
+   */
+  List<LibraryElement> _importedLibraries = LibraryElement.EMPTY_LIST;
+
+  /**
+   * Initialize a newly created method element to have the given [name] and
+   * [offset].
+   */
+  PrefixElementImpl(String name, int nameOffset) : super(name, nameOffset);
+
+  /**
+   * Initialize a newly created prefix element to have the given [name].
+   */
+  PrefixElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  @override
+  LibraryElement get enclosingElement =>
+      super.enclosingElement as LibraryElement;
+
+  @override
+  String get identifier => "_${super.identifier}";
+
+  @override
+  List<LibraryElement> get importedLibraries => _importedLibraries;
+
+  /**
+   * Set the libraries that are imported using this prefix to the given
+   * [libraries].
+   */
+  void set importedLibraries(List<LibraryElement> libraries) {
+    for (LibraryElement library in libraries) {
+      (library as LibraryElementImpl).enclosingElement = this;
+    }
+    _importedLibraries = libraries;
+  }
+
+  @override
+  ElementKind get kind => ElementKind.PREFIX;
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitPrefixElement(this);
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    buffer.write("as ");
+    super.appendTo(buffer);
+  }
+}
+
+/**
+ * A getter or a setter. Note that explicitly defined property accessors
+ * implicitly define a synthetic field. Symmetrically, synthetic accessors are
+ * implicitly created for explicitly defined fields. The following rules apply:
+ *
+ * * Every explicit field is represented by a non-synthetic [FieldElement].
+ * * Every explicit field induces a getter and possibly a setter, both of which
+ *   are represented by synthetic [PropertyAccessorElement]s.
+ * * Every explicit getter or setter is represented by a non-synthetic
+ *   [PropertyAccessorElement].
+ * * Every explicit getter or setter (or pair thereof if they have the same
+ *   name) induces a field that is represented by a synthetic [FieldElement].
+ */
+abstract class PropertyAccessorElement implements ExecutableElement {
+  /**
+   * An empty list of property accessor elements.
+   */
+  static const List<PropertyAccessorElement> EMPTY_LIST =
+      const <PropertyAccessorElement>[];
+
+  /**
+   * Return the accessor representing the getter that corresponds to (has the
+   * same name as) this setter, or `null` if this accessor is not a setter or if
+   * there is no corresponding getter.
+   */
+  PropertyAccessorElement get correspondingGetter;
+
+  /**
+   * Return the accessor representing the setter that corresponds to (has the
+   * same name as) this getter, or `null` if this accessor is not a getter or if
+   * there is no corresponding setter.
+   */
+  PropertyAccessorElement get correspondingSetter;
+
+  /**
+   * Return `true` if this accessor represents a getter.
+   */
+  bool get isGetter;
+
+  /**
+   * Return `true` if this accessor represents a setter.
+   */
+  bool get isSetter;
+
+  /**
+   * Return the field or top-level variable associated with this accessor. If
+   * this accessor was explicitly defined (is not synthetic) then the variable
+   * associated with it will be synthetic.
+   */
+  PropertyInducingElement get variable;
+}
+
+/**
+ * A concrete implementation of a [PropertyAccessorElement].
+ */
+class PropertyAccessorElementImpl extends ExecutableElementImpl
+    implements PropertyAccessorElement {
+  /**
+   * An empty list of property accessor elements.
+   */
+  @deprecated // Use PropertyAccessorElement.EMPTY_LIST
+  static const List<PropertyAccessorElement> EMPTY_ARRAY =
+      const <PropertyAccessorElement>[];
+
+  /**
+   * The variable associated with this accessor.
+   */
+  PropertyInducingElement variable;
+
+  /**
+   * Initialize a newly created property accessor element to have the given
+   * [name].
+   */
+  PropertyAccessorElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  /**
+   * Initialize a newly created synthetic property accessor element to be
+   * associated with the given [variable].
+   */
+  PropertyAccessorElementImpl.forVariable(PropertyInducingElementImpl variable)
+      : super(variable.name, variable.nameOffset) {
+    this.variable = variable;
+    static = variable.isStatic;
+    synthetic = true;
+  }
+
+  /**
+   * Set whether this accessor is abstract.
+   */
+  void set abstract(bool isAbstract) {
+    setModifier(Modifier.ABSTRACT, isAbstract);
+  }
+
+  @override
+  PropertyAccessorElement get correspondingGetter {
+    if (isGetter || variable == null) {
+      return null;
+    }
+    return variable.getter;
+  }
+
+  @override
+  PropertyAccessorElement get correspondingSetter {
+    if (isSetter || variable == null) {
+      return null;
+    }
+    return variable.setter;
+  }
+
+  /**
+   * Set whether this accessor is a getter.
+   */
+  void set getter(bool isGetter) {
+    setModifier(Modifier.GETTER, isGetter);
+  }
+
+  @override
+  int get hashCode => JenkinsSmiHash.hash2(super.hashCode, isGetter ? 1 : 2);
+
+  @override
+  String get identifier {
+    String name = displayName;
+    String suffix = isGetter ? "?" : "=";
+    return "$name$suffix";
+  }
+
+  @override
+  bool get isGetter => hasModifier(Modifier.GETTER);
+
+  @override
+  bool get isSetter => hasModifier(Modifier.SETTER);
+
+  @override
+  bool get isStatic => hasModifier(Modifier.STATIC);
+
+  @override
+  ElementKind get kind {
+    if (isGetter) {
+      return ElementKind.GETTER;
+    }
+    return ElementKind.SETTER;
+  }
+
+  @override
+  String get name {
+    if (isSetter) {
+      return "${super.name}=";
+    }
+    return super.name;
+  }
+
+  /**
+   * Set whether this accessor is a setter.
+   */
+  void set setter(bool isSetter) {
+    setModifier(Modifier.SETTER, isSetter);
+  }
+
+  /**
+   * Set whether this accessor is static.
+   */
+  void set static(bool isStatic) {
+    setModifier(Modifier.STATIC, isStatic);
+  }
+
+  @override
+  bool operator ==(Object object) => super == object &&
+      isGetter == (object as PropertyAccessorElement).isGetter;
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this);
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    buffer.write(isGetter ? "get " : "set ");
+    buffer.write(variable.displayName);
+    super.appendTo(buffer);
+  }
+
+  @override
+  AstNode computeNode() {
+    if (isSynthetic) {
+      return null;
+    }
+    if (enclosingElement is ClassElement) {
+      return getNodeMatching((node) => node is MethodDeclaration);
+    }
+    if (enclosingElement is CompilationUnitElement) {
+      return getNodeMatching((node) => node is FunctionDeclaration);
+    }
+    return null;
+  }
+}
+
+/**
+ * A property accessor element defined in a parameterized type where the values
+ * of the type parameters are known.
+ */
+class PropertyAccessorMember extends ExecutableMember
+    implements PropertyAccessorElement {
+  /**
+   * Initialize a newly created element to represent a constructor, based on the
+   * [baseElement], defined by the [definingType].
+   */
+  PropertyAccessorMember(
+      PropertyAccessorElement baseElement, InterfaceType definingType)
+      : super(baseElement, definingType);
+
+  @override
+  PropertyAccessorElement get baseElement =>
+      super.baseElement as PropertyAccessorElement;
+
+  @override
+  PropertyAccessorElement get correspondingGetter =>
+      from(baseElement.correspondingGetter, definingType);
+
+  @override
+  PropertyAccessorElement get correspondingSetter =>
+      from(baseElement.correspondingSetter, definingType);
+
+  @override
+  InterfaceType get definingType => super.definingType as InterfaceType;
+
+  @override
+  Element get enclosingElement => baseElement.enclosingElement;
+
+  @override
+  bool get isGetter => baseElement.isGetter;
+
+  @override
+  bool get isSetter => baseElement.isSetter;
+
+  @override
+  PropertyInducingElement get variable {
+    PropertyInducingElement variable = baseElement.variable;
+    if (variable is FieldElement) {
+      return FieldMember.from(variable, definingType);
+    }
+    return variable;
+  }
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this);
+
+  @override
+  String toString() {
+    PropertyAccessorElement baseElement = this.baseElement;
+    List<ParameterElement> parameters = this.parameters;
+    FunctionType type = this.type;
+    StringBuffer builder = new StringBuffer();
+    if (isGetter) {
+      builder.write("get ");
+    } else {
+      builder.write("set ");
+    }
+    builder.write(baseElement.enclosingElement.displayName);
+    builder.write(".");
+    builder.write(baseElement.displayName);
+    builder.write("(");
+    int parameterCount = parameters.length;
+    for (int i = 0; i < parameterCount; i++) {
+      if (i > 0) {
+        builder.write(", ");
+      }
+      builder.write(parameters[i]);
+    }
+    builder.write(")");
+    if (type != null) {
+      builder.write(Element.RIGHT_ARROW);
+      builder.write(type.returnType);
+    }
+    return builder.toString();
+  }
+
+  /**
+   * If the given [accessor]'s type is different when any type parameters from
+   * the defining type's declaration are replaced with the actual type
+   * arguments from the [definingType], create an accessor member representing
+   * the given accessor. Return the member that was created, or the base
+   * accessor if no member was created.
+   */
+  static PropertyAccessorElement from(
+      PropertyAccessorElement accessor, InterfaceType definingType) {
+    if (!_isChangedByTypeSubstitution(accessor, definingType)) {
+      return accessor;
+    }
+    // TODO(brianwilkerson) Consider caching the substituted type in the
+    // instance. It would use more memory but speed up some operations.
+    // We need to see how often the type is being re-computed.
+    return new PropertyAccessorMember(accessor, definingType);
+  }
+
+  /**
+   * Determine whether the given property [accessor]'s type is changed when type
+   * parameters from the defining type's declaration are replaced with the
+   * actual type arguments from the [definingType].
+   */
+  static bool _isChangedByTypeSubstitution(
+      PropertyAccessorElement accessor, InterfaceType definingType) {
+    List<DartType> argumentTypes = definingType.typeArguments;
+    if (accessor != null && argumentTypes.length != 0) {
+      FunctionType baseType = accessor.type;
+      if (baseType == null) {
+        AnalysisEngine.instance.logger.logInformation(
+            'Type of $accessor is null in PropertyAccessorMember._isChangedByTypeSubstitution');
+        return false;
+      }
+      List<DartType> parameterTypes = definingType.element.type.typeArguments;
+      FunctionType substitutedType =
+          baseType.substitute2(argumentTypes, parameterTypes);
+      if (baseType != substitutedType) {
+        return true;
+      }
+      // If this property accessor is based on a field, that field might have a
+      // propagated type. In which case we need to check whether the propagated
+      // type of the field needs substitution.
+      PropertyInducingElement field = accessor.variable;
+      if (!field.isSynthetic) {
+        DartType baseFieldType = field.propagatedType;
+        if (baseFieldType != null) {
+          DartType substitutedFieldType =
+              baseFieldType.substitute2(argumentTypes, parameterTypes);
+          if (baseFieldType != substitutedFieldType) {
+            return true;
+          }
+        }
+      }
+    }
+    return false;
+  }
+}
+
+/**
+ * A variable that has an associated getter and possibly a setter. Note that
+ * explicitly defined variables implicitly define a synthetic getter and that
+ * non-`final` explicitly defined variables implicitly define a synthetic
+ * setter. Symmetrically, synthetic fields are implicitly created for explicitly
+ * defined getters and setters. The following rules apply:
+ *
+ * * Every explicit variable is represented by a non-synthetic
+ *   [PropertyInducingElement].
+ * * Every explicit variable induces a getter and possibly a setter, both of
+ *   which are represented by synthetic [PropertyAccessorElement]s.
+ * * Every explicit getter or setter is represented by a non-synthetic
+ *   [PropertyAccessorElement].
+ * * Every explicit getter or setter (or pair thereof if they have the same
+ *   name) induces a variable that is represented by a synthetic
+ *   [PropertyInducingElement].
+ */
+abstract class PropertyInducingElement implements VariableElement {
+  /**
+   * An empty list of elements.
+   */
+  static const List<PropertyInducingElement> EMPTY_LIST =
+      const <PropertyInducingElement>[];
+
+  /**
+   * Return the getter associated with this variable. If this variable was
+   * explicitly defined (is not synthetic) then the getter associated with it
+   * will be synthetic.
+   */
+  PropertyAccessorElement get getter;
+
+  /**
+   * Return the propagated type of this variable, or `null` if type propagation
+   * has not been performed, for example because the variable is not final.
+   */
+  DartType get propagatedType;
+
+  /**
+   * Return the setter associated with this variable, or `null` if the variable
+   * is effectively `final` and therefore does not have a setter associated with
+   * it. (This can happen either because the variable is explicitly defined as
+   * being `final` or because the variable is induced by an explicit getter that
+   * does not have a corresponding setter.) If this variable was explicitly
+   * defined (is not synthetic) then the setter associated with it will be
+   * synthetic.
+   */
+  PropertyAccessorElement get setter;
+}
+
+/**
+ * A concrete implementation of a [PropertyInducingElement].
+ */
+abstract class PropertyInducingElementImpl extends VariableElementImpl
+    implements PropertyInducingElement {
+  /**
+   * An empty list of elements.
+   */
+  @deprecated // Use PropertyInducingElement.EMPTY_LIST
+  static const List<PropertyInducingElement> EMPTY_ARRAY =
+      const <PropertyInducingElement>[];
+
+  /**
+   * The getter associated with this element.
+   */
+  PropertyAccessorElement getter;
+
+  /**
+   * The setter associated with this element, or `null` if the element is
+   * effectively `final` and therefore does not have a setter associated with
+   * it.
+   */
+  PropertyAccessorElement setter;
+
+  /**
+   * The propagated type of this variable, or `null` if type propagation has not
+   * been performed.
+   */
+  DartType propagatedType;
+
+  /**
+   * Initialize a newly created synthetic element to have the given [name] and
+   * [offset].
+   */
+  PropertyInducingElementImpl(String name, int offset) : super(name, offset);
+
+  /**
+   * Initialize a newly created element to have the given [name].
+   */
+  PropertyInducingElementImpl.forNode(Identifier name) : super.forNode(name);
+}
+
+/**
+ * A visitor that will recursively visit all of the element in an element model.
+ * For example, using an instance of this class to visit a
+ * [CompilationUnitElement] will also cause all of the types in the compilation
+ * unit to be visited.
+ *
+ * Subclasses that override a visit method must either invoke the overridden
+ * visit method or must explicitly ask the visited element to visit its
+ * children. Failure to do so will cause the children of the visited element to
+ * not be visited.
+ */
+class RecursiveElementVisitor<R> implements ElementVisitor<R> {
+  @override
+  R visitClassElement(ClassElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitCompilationUnitElement(CompilationUnitElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitConstructorElement(ConstructorElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  @deprecated
+  R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitExportElement(ExportElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  @deprecated
+  R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFieldElement(FieldElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFieldFormalParameterElement(FieldFormalParameterElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFunctionElement(FunctionElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  @deprecated
+  R visitHtmlElement(HtmlElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitImportElement(ImportElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitLabelElement(LabelElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitLibraryElement(LibraryElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitLocalVariableElement(LocalVariableElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitMethodElement(MethodElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitMultiplyDefinedElement(MultiplyDefinedElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitParameterElement(ParameterElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitPrefixElement(PrefixElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitPropertyAccessorElement(PropertyAccessorElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitTopLevelVariableElement(TopLevelVariableElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitTypeParameterElement(TypeParameterElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+}
+
+/**
+ * A combinator that cause some of the names in a namespace to be visible (and
+ * the rest hidden) when being imported.
+ */
+abstract class ShowElementCombinator implements NamespaceCombinator {
+  /**
+   * Return the offset of the character immediately following the last character
+   * of this node.
+   */
+  int get end;
+
+  /**
+   * Return the offset of the 'show' keyword of this element.
+   */
+  int get offset;
+
+  /**
+   * Return a list containing the names that are to be made visible in the
+   * importing library if they are defined in the imported library.
+   */
+  List<String> get shownNames;
+}
+
+/**
+ * A concrete implementation of a [ShowElementCombinator].
+ */
+class ShowElementCombinatorImpl implements ShowElementCombinator {
+  /**
+   * The names that are to be made visible in the importing library if they are
+   * defined in the imported library.
+   */
+  List<String> shownNames = StringUtilities.EMPTY_ARRAY;
+
+  /**
+   * The offset of the character immediately following the last character of
+   * this node.
+   */
+  int end = -1;
+
+  /**
+   * The offset of the 'show' keyword of this element.
+   */
+  int offset = 0;
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("show ");
+    int count = shownNames.length;
+    for (int i = 0; i < count; i++) {
+      if (i > 0) {
+        buffer.write(", ");
+      }
+      buffer.write(shownNames[i]);
+    }
+    return buffer.toString();
+  }
+}
+
+/**
+ * A visitor that will do nothing when visiting an element. It is intended to be
+ * a superclass for classes that use the visitor pattern primarily as a dispatch
+ * mechanism (and hence don't need to recursively visit a whole structure) and
+ * that only need to visit a small number of element types.
+ */
+class SimpleElementVisitor<R> implements ElementVisitor<R> {
+  @override
+  R visitClassElement(ClassElement element) => null;
+
+  @override
+  R visitCompilationUnitElement(CompilationUnitElement element) => null;
+
+  @override
+  R visitConstructorElement(ConstructorElement element) => null;
+
+  @override
+  @deprecated
+  R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) => null;
+
+  @override
+  R visitExportElement(ExportElement element) => null;
+
+  @override
+  @deprecated
+  R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) => null;
+
+  @override
+  R visitFieldElement(FieldElement element) => null;
+
+  @override
+  R visitFieldFormalParameterElement(FieldFormalParameterElement element) =>
+      null;
+
+  @override
+  R visitFunctionElement(FunctionElement element) => null;
+
+  @override
+  R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) => null;
+
+  @override
+  @deprecated
+  R visitHtmlElement(HtmlElement element) => null;
+
+  @override
+  R visitImportElement(ImportElement element) => null;
+
+  @override
+  R visitLabelElement(LabelElement element) => null;
+
+  @override
+  R visitLibraryElement(LibraryElement element) => null;
+
+  @override
+  R visitLocalVariableElement(LocalVariableElement element) => null;
+
+  @override
+  R visitMethodElement(MethodElement element) => null;
+
+  @override
+  R visitMultiplyDefinedElement(MultiplyDefinedElement element) => null;
+
+  @override
+  R visitParameterElement(ParameterElement element) => null;
+
+  @override
+  R visitPrefixElement(PrefixElement element) => null;
+
+  @override
+  R visitPropertyAccessorElement(PropertyAccessorElement element) => null;
+
+  @override
+  R visitTopLevelVariableElement(TopLevelVariableElement element) => null;
+
+  @override
+  R visitTypeParameterElement(TypeParameterElement element) => null;
+}
+
+/**
+ * A top-level variable.
+ */
+abstract class TopLevelVariableElement implements PropertyInducingElement {
+  /**
+   * An empty list of top-level variable elements.
+   */
+  static const List<TopLevelVariableElement> EMPTY_LIST =
+      const <TopLevelVariableElement>[];
+
+  @override
+  VariableDeclaration computeNode();
+}
+
+/**
+ * A concrete implementation of a [TopLevelVariableElement].
+ */
+class TopLevelVariableElementImpl extends PropertyInducingElementImpl
+    with PotentiallyConstVariableElement
+    implements TopLevelVariableElement {
+  /**
+   * An empty list of top-level variable elements.
+   */
+  @deprecated // Use TopLevelVariableElement.EMPTY_LIST
+  static const List<TopLevelVariableElement> EMPTY_ARRAY =
+      const <TopLevelVariableElement>[];
+
+  /**
+   * Initialize a newly created synthetic top-level variable element to have the
+   * given [name] and [offset].
+   */
+  TopLevelVariableElementImpl(String name, int offset) : super(name, offset);
+
+  /**
+   * Initialize a newly created top-level variable element to have the given
+   * [name].
+   */
+  TopLevelVariableElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  @override
+  bool get isStatic => true;
+
+  @override
+  ElementKind get kind => ElementKind.TOP_LEVEL_VARIABLE;
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitTopLevelVariableElement(this);
+
+  @override
+  VariableDeclaration computeNode() =>
+      getNodeMatching((node) => node is VariableDeclaration);
+}
+
+/**
+ * An element that defines a type.
+ */
+abstract class TypeDefiningElement implements Element {
+  /**
+   * Return the type defined by this element.
+   */
+  DartType get type;
+}
+
+/**
+ * The abstract class `TypeImpl` implements the behavior common to objects
+ * representing the declared type of elements in the element model.
+ */
+abstract class TypeImpl implements DartType {
+  /**
+   * An empty list of types.
+   */
+  @deprecated // Use DartType.EMPTY_LIST
+  static const List<DartType> EMPTY_ARRAY = const <DartType>[];
+
+  /**
+   * The element representing the declaration of this type, or `null` if the
+   * type has not, or cannot, be associated with an element.
+   */
+  final Element _element;
+
+  /**
+   * The name of this type, or `null` if the type does not have a name.
+   */
+  final String name;
+
+  /**
+   * Initialize a newly created type to be declared by the given [element] and
+   * to have the given [name].
+   */
+  TypeImpl(this._element, this.name);
+
+  @override
+  String get displayName => name;
+
+  @override
+  Element get element => _element;
+
+  @override
+  bool get isBottom => false;
+
+  @override
+  bool get isDartCoreFunction => false;
+
+  @override
+  bool get isDynamic => false;
+
+  @override
+  bool get isObject => false;
+
+  @override
+  bool get isUndefined => false;
+
+  @override
+  bool get isVoid => false;
+
+  /**
+   * Append a textual representation of this type to the given [buffer]. The set
+   * of [visitedTypes] is used to prevent infinite recusion.
+   */
+  void appendTo(StringBuffer buffer) {
+    if (name == null) {
+      buffer.write("<unnamed type>");
+    } else {
+      buffer.write(name);
+    }
+  }
+
+  @override
+  DartType getLeastUpperBound(DartType type) => null;
+
+  /**
+   * Return `true` if this type is assignable to the given [type] (written in
+   * the spec as "T <=> S", where T=[this] and S=[type]).
+   *
+   * The sets [thisExpansions] and [typeExpansions], if given, are the sets of
+   * function type aliases that have been expanded so far in the process of
+   * reaching [this] and [type], respectively.  These are used to avoid
+   * infinite regress when analyzing invalid code; since the language spec
+   * forbids a typedef from referring to itself directly or indirectly, we can
+   * use these as sets of function type aliases that don't need to be expanded.
+   */
+  @override
+  bool isAssignableTo(DartType type) {
+    // An interface type T may be assigned to a type S, written T <=> S, iff
+    // either T <: S or S <: T.
+    return isSubtypeOf(type) || (type as TypeImpl).isSubtypeOf(this);
+  }
+
+  /**
+   * Return `true` if this type is more specific than the given [type] (written
+   * in the spec as "T << S", where T=[this] and S=[type]).
+   *
+   * If [withDynamic] is `true`, then "dynamic" should be considered as a
+   * subtype of any type (as though "dynamic" had been replaced with bottom).
+   *
+   * The set [visitedElements], if given, is the set of classes and type
+   * parameters that have been visited so far while examining the class
+   * hierarchy of [this].  This is used to avoid infinite regress when
+   * analyzing invalid code; since the language spec forbids loops in the class
+   * hierarchy, we can use this as a set of classes that don't need to be
+   * examined when walking the class hierarchy.
+   */
+  @override
+  bool isMoreSpecificThan(DartType type,
+      [bool withDynamic = false, Set<Element> visitedElements]);
+
+  /**
+   * Return `true` if this type is a subtype of the given [type] (written in
+   * the spec as "T <: S", where T=[this] and S=[type]).
+   *
+   * The sets [thisExpansions] and [typeExpansions], if given, are the sets of
+   * function type aliases that have been expanded so far in the process of
+   * reaching [this] and [type], respectively.  These are used to avoid
+   * infinite regress when analyzing invalid code; since the language spec
+   * forbids a typedef from referring to itself directly or indirectly, we can
+   * use these as sets of function type aliases that don't need to be expanded.
+   */
+  @override
+  bool isSubtypeOf(DartType type) {
+    // For non-function types, T <: S iff [_|_/dynamic]T << S.
+    return isMoreSpecificThan(type, true);
+  }
+
+  @override
+  bool isSupertypeOf(DartType type) => type.isSubtypeOf(this);
+
+  /**
+   * Create a new [TypeImpl] that is identical to [this] except that when
+   * visiting type parameters, function parameter types, and function return
+   * types, function types listed in [prune] will not be expanded.  This is
+   * used to avoid creating infinite types in the presence of circular
+   * typedefs.
+   *
+   * If [prune] is null, then [this] is returned unchanged.
+   *
+   * Only legal to call on a [TypeImpl] that is not already subject to pruning.
+   */
+  TypeImpl pruned(List<FunctionTypeAliasElement> prune);
+
+  /**
+   * Return the type resulting from substituting the given [argumentTypes] for
+   * the given [parameterTypes] in this type.
+   *
+   * In all classes derived from [TypeImpl], a new optional argument
+   * [prune] is added.  If specified, it is a list of function typdefs
+   * which should not be expanded.  This is used to avoid creating infinite
+   * types in response to self-referential typedefs.
+   */
+  @override
+  DartType substitute2(
+      List<DartType> argumentTypes, List<DartType> parameterTypes,
+      [List<FunctionTypeAliasElement> prune]);
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    appendTo(buffer);
+    return buffer.toString();
+  }
+
+  /**
+   * Return `true` if corresponding elements of the [first] and [second] lists
+   * of type arguments are all equal.
+   */
+  static bool equalArrays(List<DartType> first, List<DartType> second) {
+    if (first.length != second.length) {
+      return false;
+    }
+    for (int i = 0; i < first.length; i++) {
+      if (first[i] == null) {
+        AnalysisEngine.instance.logger
+            .logInformation('Found null type argument in TypeImpl.equalArrays');
+        return second[i] == null;
+      } else if (second[i] == null) {
+        AnalysisEngine.instance.logger
+            .logInformation('Found null type argument in TypeImpl.equalArrays');
+        return false;
+      }
+      if (first[i] != second[i]) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Return a list containing the results of using the given [argumentTypes] and
+   * [parameterTypes] to perform a substitution on all of the given [types].
+   *
+   * If [prune] is specified, it is a list of function typdefs which should not
+   * be expanded.  This is used to avoid creating infinite types in response to
+   * self-referential typedefs.
+   */
+  static List<DartType> substitute(List<DartType> types,
+      List<DartType> argumentTypes, List<DartType> parameterTypes,
+      [List<FunctionTypeAliasElement> prune]) {
+    int length = types.length;
+    if (length == 0) {
+      return types;
+    }
+    List<DartType> newTypes = new List<DartType>(length);
+    for (int i = 0; i < length; i++) {
+      newTypes[i] = (types[i] as TypeImpl)
+          .substitute2(argumentTypes, parameterTypes, prune);
+    }
+    return newTypes;
+  }
+}
+
+/**
+ * A type parameter.
+ */
+abstract class TypeParameterElement implements TypeDefiningElement {
+  /**
+   * An empty list of type parameter elements.
+   */
+  static const List<TypeParameterElement> EMPTY_LIST =
+      const <TypeParameterElement>[];
+
+  /**
+   * Return the type representing the bound associated with this parameter, or
+   * `null` if this parameter does not have an explicit bound.
+   */
+  DartType get bound;
+
+  /**
+   * Return the type defined by this type parameter.
+   */
+  TypeParameterType get type;
+}
+
+/**
+ * A concrete implementation of a [TypeParameterElement].
+ */
+class TypeParameterElementImpl extends ElementImpl
+    implements TypeParameterElement {
+  /**
+   * An empty list of type parameter elements.
+   */
+  @deprecated // Use TypeParameterElement.EMPTY_LIST
+  static const List<TypeParameterElement> EMPTY_ARRAY =
+      const <TypeParameterElement>[];
+
+  /**
+   * The type defined by this type parameter.
+   */
+  TypeParameterType type;
+
+  /**
+   * The type representing the bound associated with this parameter, or `null`
+   * if this parameter does not have an explicit bound.
+   */
+  DartType bound;
+
+  /**
+   * Initialize a newly created method element to have the given [name] and
+   * [offset].
+   */
+  TypeParameterElementImpl(String name, int offset) : super(name, offset);
+
+  /**
+   * Initialize a newly created type parameter element to have the given [name].
+   */
+  TypeParameterElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  @override
+  ElementKind get kind => ElementKind.TYPE_PARAMETER;
+
+  @override
+  accept(ElementVisitor visitor) => visitor.visitTypeParameterElement(this);
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    buffer.write(displayName);
+    if (bound != null) {
+      buffer.write(" extends ");
+      buffer.write(bound);
+    }
+  }
+}
+
+/**
+ * The type introduced by a type parameter.
+ */
+abstract class TypeParameterType implements DartType {
+  /**
+   * An empty list of type parameter types.
+   */
+  static const List<TypeParameterType> EMPTY_LIST = const <TypeParameterType>[];
+
+  @override
+  TypeParameterElement get element;
+}
+
+/**
+ * A concrete implementation of a [TypeParameterType].
+ */
+class TypeParameterTypeImpl extends TypeImpl implements TypeParameterType {
+  /**
+   * An empty list of type parameter types.
+   */
+  @deprecated // Use TypeParameterType.EMPTY_LIST
+  static const List<TypeParameterType> EMPTY_ARRAY =
+      const <TypeParameterType>[];
+
+  /**
+   * Initialize a newly created type parameter type to be declared by the given
+   * [element] and to have the given name.
+   */
+  TypeParameterTypeImpl(TypeParameterElement element)
+      : super(element, element.name);
+
+  @override
+  TypeParameterElement get element => super.element as TypeParameterElement;
+
+  @override
+  int get hashCode => element.hashCode;
+
+  @override
+  bool operator ==(Object object) =>
+      object is TypeParameterTypeImpl && (element == object.element);
+
+  @override
+  bool isMoreSpecificThan(DartType s,
+      [bool withDynamic = false, Set<Element> visitedElements]) {
+    //
+    // A type T is more specific than a type S, written T << S,
+    // if one of the following conditions is met:
+    //
+    // Reflexivity: T is S.
+    //
+    if (this == s) {
+      return true;
+    }
+    // S is dynamic.
+    //
+    if (s.isDynamic) {
+      return true;
+    }
+    //
+    // T is a type parameter and S is the upper bound of T.
+    //
+    TypeImpl bound = element.bound;
+    if (s == bound) {
+      return true;
+    }
+    //
+    // T is a type parameter and S is Object.
+    //
+    if (s.isObject) {
+      return true;
+    }
+    // We need upper bound to continue.
+    if (bound == null) {
+      return false;
+    }
+    //
+    // Transitivity: T << U and U << S.
+    //
+    // First check for infinite loops
+    if (element == null) {
+      return false;
+    }
+    if (visitedElements == null) {
+      visitedElements = new HashSet<Element>();
+    } else if (visitedElements.contains(element)) {
+      return false;
+    }
+    visitedElements.add(element);
+    try {
+      return bound.isMoreSpecificThan(s, withDynamic, visitedElements);
+    } finally {
+      visitedElements.remove(element);
+    }
+  }
+
+  @override
+  bool isSubtypeOf(DartType type) => isMoreSpecificThan(type, true);
+
+  @override
+  TypeImpl pruned(List<FunctionTypeAliasElement> prune) => this;
+
+  @override
+  DartType substitute2(
+      List<DartType> argumentTypes, List<DartType> parameterTypes,
+      [List<FunctionTypeAliasElement> prune]) {
+    int length = parameterTypes.length;
+    for (int i = 0; i < length; i++) {
+      if (parameterTypes[i] == this) {
+        return argumentTypes[i];
+      }
+    }
+    return this;
+  }
+
+  /**
+   * Return a list containing the type parameter types defined by the given
+   * array of type parameter elements ([typeParameters]).
+   */
+  static List<TypeParameterType> getTypes(
+      List<TypeParameterElement> typeParameters) {
+    int count = typeParameters.length;
+    if (count == 0) {
+      return TypeParameterType.EMPTY_LIST;
+    }
+    List<TypeParameterType> types = new List<TypeParameterType>(count);
+    for (int i = 0; i < count; i++) {
+      types[i] = typeParameters[i].type;
+    }
+    return types;
+  }
+}
+
+/**
+ * A pseudo-elements that represents names that are undefined. This situation is
+ * not allowed by the language, so objects implementing this interface always
+ * represent an error. As a result, most of the normal operations on elements do
+ * not make sense and will return useless results.
+ */
+abstract class UndefinedElement implements Element {}
+
+/**
+ * The unique instance of the class `UndefinedTypeImpl` implements the type of
+ * typenames that couldn't be resolved.
+ *
+ * This class behaves like DynamicTypeImpl in almost every respect, to reduce
+ * cascading errors.
+ */
+class UndefinedTypeImpl extends TypeImpl {
+  /**
+   * The unique instance of this class.
+   */
+  static UndefinedTypeImpl _INSTANCE = new UndefinedTypeImpl._();
+
+  /**
+   * Return the unique instance of this class.
+   */
+  static UndefinedTypeImpl get instance => _INSTANCE;
+
+  /**
+   * Prevent the creation of instances of this class.
+   */
+  UndefinedTypeImpl._()
+      : super(DynamicElementImpl.instance, Keyword.DYNAMIC.syntax);
+
+  @override
+  int get hashCode => 1;
+
+  @override
+  bool get isDynamic => true;
+
+  @override
+  bool get isUndefined => true;
+
+  @override
+  bool operator ==(Object object) => identical(object, this);
+
+  @override
+  bool isMoreSpecificThan(DartType type,
+      [bool withDynamic = false, Set<Element> visitedElements]) {
+    // T is S
+    if (identical(this, type)) {
+      return true;
+    }
+    // else
+    return withDynamic;
+  }
+
+  @override
+  bool isSubtypeOf(DartType type) => true;
+
+  @override
+  bool isSupertypeOf(DartType type) => true;
+
+  @override
+  TypeImpl pruned(List<FunctionTypeAliasElement> prune) => this;
+
+  @override
+  DartType substitute2(
+      List<DartType> argumentTypes, List<DartType> parameterTypes,
+      [List<FunctionTypeAliasElement> prune]) {
+    int length = parameterTypes.length;
+    for (int i = 0; i < length; i++) {
+      if (parameterTypes[i] == this) {
+        return argumentTypes[i];
+      }
+    }
+    return this;
+  }
+}
+
+/**
+ * An element included into a library using some URI.
+ */
+abstract class UriReferencedElement implements Element {
+  /**
+   * Return the URI that is used to include this element into the enclosing
+   * library, or `null` if this is the defining compilation unit of a library.
+   */
+  String get uri;
+
+  /**
+   * Return the offset of the character immediately following the last character
+   * of this node's URI, or `-1` for synthetic import.
+   */
+  int get uriEnd;
+
+  /**
+   * Return the offset of the URI in the file, or `-1` if this element is
+   * synthetic.
+   */
+  int get uriOffset;
+}
+
+/**
+ * A concrete implementation of a [UriReferencedElement].
+ */
+abstract class UriReferencedElementImpl extends ElementImpl
+    implements UriReferencedElement {
+  /**
+   * The offset of the URI in the file, may be `-1` if synthetic.
+   */
+  int uriOffset = -1;
+
+  /**
+   * The offset of the character immediately following the last character of
+   * this node's URI, may be `-1` if synthetic.
+   */
+  int uriEnd = -1;
+
+  /**
+   * The URI that is specified by this directive.
+   */
+  String uri;
+
+  /**
+   * Initialize a newly created import element to heve the given [name] and
+   * [offset]. The offset may be `-1` if the element is synthetic.
+   */
+  UriReferencedElementImpl(String name, int offset) : super(name, offset);
+}
+
+/**
+ * A variable. There are concrete subclasses for different kinds of variables.
+ */
+abstract class VariableElement implements Element, ConstantEvaluationTarget {
+  /**
+   * An empty list of variable elements.
+   */
+  static const List<VariableElement> EMPTY_LIST = const <VariableElement>[];
+
+  /**
+   * Return `true` if this variable element did not have an explicit type
+   * specified for it.
+   */
+  bool get hasImplicitType;
+
+  /**
+   * Return a synthetic function representing this variable's initializer, or
+   * `null` if this variable does not have an initializer. The function will
+   * have no parameters. The return type of the function will be the
+   * compile-time type of the initialization expression.
+   */
+  FunctionElement get initializer;
+
+  /**
+   * Return `true` if this variable was declared with the 'const' modifier.
+   */
+  bool get isConst;
+
+  /**
+   * Return `true` if this variable was declared with the 'final' modifier.
+   * Variables that are declared with the 'const' modifier will return `false`
+   * even though they are implicitly final.
+   */
+  bool get isFinal;
+
+  /**
+   * Return `true` if this variable is potentially mutated somewhere in a
+   * closure. This information is only available for local variables (including
+   * parameters) and only after the compilation unit containing the variable has
+   * been resolved.
+   */
+  bool get isPotentiallyMutatedInClosure;
+
+  /**
+   * Return `true` if this variable is potentially mutated somewhere in its
+   * scope. This information is only available for local variables (including
+   * parameters) and only after the compilation unit containing the variable has
+   * been resolved.
+   */
+  bool get isPotentiallyMutatedInScope;
+
+  /**
+   * Return `true` if this element is a static variable, as per section 8 of the
+   * Dart Language Specification:
+   *
+   * > A static variable is a variable that is not associated with a particular
+   * > instance, but rather with an entire library or class. Static variables
+   * > include library variables and class variables. Class variables are
+   * > variables whose declaration is immediately nested inside a class
+   * > declaration and includes the modifier static. A library variable is
+   * > implicitly static.
+   */
+  bool get isStatic;
+
+  /**
+   * Return the declared type of this variable, or `null` if the variable did
+   * not have a declared type (such as if it was declared using the keyword
+   * 'var').
+   */
+  DartType get type;
+}
+
+/**
+ * A concrete implementation of a [VariableElement].
+ */
+abstract class VariableElementImpl extends ElementImpl
+    implements VariableElement {
+  /**
+   * An empty list of variable elements.
+   */
+  @deprecated // Use VariableElement.EMPTY_LIST
+  static const List<VariableElement> EMPTY_ARRAY = const <VariableElement>[];
+
+  /**
+   * The declared type of this variable.
+   */
+  DartType type;
+
+  /**
+   * A synthetic function representing this variable's initializer, or `null` if
+   * this variable does not have an initializer.
+   */
+  FunctionElement _initializer;
+
+  /**
+   * Initialize a newly created variable element to have the given [name] and
+   * [offset].
+   */
+  VariableElementImpl(String name, int offset) : super(name, offset);
+
+  /**
+   * Initialize a newly created variable element to have the given [name].
+   */
+  VariableElementImpl.forNode(Identifier name) : super.forNode(name);
+
+  /**
+   * Set whether this variable is const.
+   */
+  void set const3(bool isConst) {
+    setModifier(Modifier.CONST, isConst);
+  }
+
+  /**
+   * Return the result of evaluating this variable's initializer as a
+   * compile-time constant expression, or `null` if this variable is not a
+   * 'const' variable, if it does not have an initializer, or if the compilation
+   * unit containing the variable has not been resolved.
+   */
+  EvaluationResultImpl get evaluationResult => null;
+
+  /**
+   * Set the result of evaluating this variable's initializer as a compile-time
+   * constant expression to the given [result].
+   */
+  void set evaluationResult(EvaluationResultImpl result) {
+    throw new IllegalStateException(
+        "Invalid attempt to set a compile-time constant result");
+  }
+
+  /**
+   * Set whether this variable is final.
+   */
+  void set final2(bool isFinal) {
+    setModifier(Modifier.FINAL, isFinal);
+  }
+
+  @override
+  bool get hasImplicitType => hasModifier(Modifier.IMPLICIT_TYPE);
+
+  /**
+   * Set whether this variable element has an implicit type.
+   */
+  void set hasImplicitType(bool hasImplicitType) {
+    setModifier(Modifier.IMPLICIT_TYPE, hasImplicitType);
+  }
+
+  @override
+  FunctionElement get initializer => _initializer;
+
+  /**
+   * Set the function representing this variable's initializer to the given
+   * [function].
+   */
+  void set initializer(FunctionElement function) {
+    if (function != null) {
+      (function as FunctionElementImpl).enclosingElement = this;
+    }
+    this._initializer = function;
+  }
+
+  @override
+  bool get isConst => hasModifier(Modifier.CONST);
+
+  @override
+  bool get isFinal => hasModifier(Modifier.FINAL);
+
+  @override
+  bool get isPotentiallyMutatedInClosure => false;
+
+  @override
+  bool get isPotentiallyMutatedInScope => false;
+
+  @override
+  bool get isStatic => hasModifier(Modifier.STATIC);
+
+  @override
+  void appendTo(StringBuffer buffer) {
+    buffer.write(type);
+    buffer.write(" ");
+    buffer.write(displayName);
+  }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChild(_initializer, visitor);
+  }
+}
+
+/**
+ * A variable element defined in a parameterized type where the values of the
+ * type parameters are known.
+ */
+abstract class VariableMember extends Member implements VariableElement {
+  /**
+   * Initialize a newly created element to represent a constructor, based on the
+   * [baseElement], defined by the [definingType].
+   */
+  VariableMember(VariableElement baseElement, ParameterizedType definingType)
+      : super(baseElement, definingType);
+
+  @override
+  VariableElement get baseElement => super.baseElement as VariableElement;
+
+  @override
+  bool get hasImplicitType => baseElement.hasImplicitType;
+
+  @override
+  FunctionElement get initializer {
+    //
+    // Elements within this element should have type parameters substituted,
+    // just like this element.
+    //
+    throw new UnsupportedOperationException();
+    //    return getBaseElement().getInitializer();
+  }
+
+  @override
+  bool get isConst => baseElement.isConst;
+
+  @override
+  bool get isFinal => baseElement.isFinal;
+
+  @override
+  bool get isPotentiallyMutatedInClosure =>
+      baseElement.isPotentiallyMutatedInClosure;
+
+  @override
+  bool get isPotentiallyMutatedInScope =>
+      baseElement.isPotentiallyMutatedInScope;
+
+  @override
+  bool get isStatic => baseElement.isStatic;
+
+  @override
+  DartType get type => substituteFor(baseElement.type);
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    // TODO(brianwilkerson) We need to finish implementing the accessors used
+    // below so that we can safely invoke them.
+    super.visitChildren(visitor);
+    safelyVisitChild(baseElement.initializer, visitor);
+  }
+}
+
+/**
+ * The type `void`.
+ */
+abstract class VoidType implements DartType {
+  @override
+  VoidType substitute2(
+      List<DartType> argumentTypes, List<DartType> parameterTypes);
+}
+
+/**
+ * A concrete implementation of a [VoidType].
+ */
+class VoidTypeImpl extends TypeImpl implements VoidType {
+  /**
+   * The unique instance of this class.
+   */
+  static VoidTypeImpl _INSTANCE = new VoidTypeImpl();
+
+  /**
+   * Return the unique instance of this class.
+   */
+  static VoidTypeImpl get instance => _INSTANCE;
+
+  /**
+   * Prevent the creation of instances of this class.
+   */
+  VoidTypeImpl() : super(null, Keyword.VOID.syntax);
+
+  @override
+  int get hashCode => 2;
+
+  @override
+  bool get isVoid => true;
+
+  @override
+  bool operator ==(Object object) => identical(object, this);
+
+  @override
+  bool isMoreSpecificThan(DartType type,
+          [bool withDynamic = false, Set<Element> visitedElements]) =>
+      isSubtypeOf(type);
+
+  @override
+  bool isSubtypeOf(DartType type) {
+    // The only subtype relations that pertain to void are therefore:
+    // void <: void (by reflexivity)
+    // bottom <: void (as bottom is a subtype of all types).
+    // void <: dynamic (as dynamic is a supertype of all types)
+    return identical(type, this) || type.isDynamic;
+  }
+
+  @override
+  TypeImpl pruned(List<FunctionTypeAliasElement> prune) => this;
+
+  @override
+  VoidTypeImpl substitute2(
+          List<DartType> argumentTypes, List<DartType> parameterTypes,
+          [List<FunctionTypeAliasElement> prune]) =>
+      this;
+}
+
+/**
+ * A visitor that visit all the elements recursively and fill the given [map].
+ */
+class _BuildOffsetToElementMap extends GeneralizingElementVisitor {
+  final Map<int, Element> map;
+
+  _BuildOffsetToElementMap(this.map);
+
+  @override
+  void visitElement(Element element) {
+    int offset = element.nameOffset;
+    if (offset != -1) {
+      map[offset] = element;
+    }
+    super.visitElement(element);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/element_handle.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/element_handle.dart
new file mode 100644
index 0000000..94bb7a4
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/element_handle.dart
@@ -0,0 +1,1122 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.element_handle;
+
+import 'ast.dart';
+import 'element.dart';
+import 'engine.dart';
+import 'java_core.dart';
+import 'java_engine.dart';
+import 'resolver.dart';
+import 'source.dart';
+import 'utilities_dart.dart';
+
+/**
+ * Instances of the class `ClassElementHandle` implement a handle to a `ClassElement`.
+ */
+class ClassElementHandle extends ElementHandle implements ClassElement {
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  ClassElementHandle(ClassElement element) : super(element);
+
+  @override
+  List<PropertyAccessorElement> get accessors => actualElement.accessors;
+
+  @override
+  ClassElement get actualElement => super.actualElement as ClassElement;
+
+  @override
+  List<InterfaceType> get allSupertypes => actualElement.allSupertypes;
+
+  @override
+  List<ConstructorElement> get constructors => actualElement.constructors;
+
+  @override
+  List<FieldElement> get fields => actualElement.fields;
+
+  @override
+  bool get hasNonFinalField => actualElement.hasNonFinalField;
+
+  @override
+  bool get hasReferenceToSuper => actualElement.hasReferenceToSuper;
+
+  @override
+  bool get hasStaticMember => actualElement.hasStaticMember;
+
+  @override
+  List<InterfaceType> get interfaces => actualElement.interfaces;
+
+  @override
+  bool get isAbstract => actualElement.isAbstract;
+
+  @override
+  bool get isEnum => actualElement.isEnum;
+
+  @override
+  bool get isMixinApplication => actualElement.isMixinApplication;
+
+  @override
+  bool get isOrInheritsProxy => actualElement.isOrInheritsProxy;
+
+  @override
+  bool get isProxy => actualElement.isProxy;
+
+  @override
+  @deprecated
+  bool get isTypedef => actualElement.isMixinApplication;
+
+  @override
+  bool get isValidMixin => actualElement.isValidMixin;
+
+  @override
+  ElementKind get kind => ElementKind.CLASS;
+
+  @override
+  List<MethodElement> get methods => actualElement.methods;
+
+  @override
+  List<InterfaceType> get mixins => actualElement.mixins;
+
+  @override
+  InterfaceType get supertype => actualElement.supertype;
+
+  @override
+  InterfaceType get type => actualElement.type;
+
+  @override
+  List<TypeParameterElement> get typeParameters => actualElement.typeParameters;
+
+  @override
+  ConstructorElement get unnamedConstructor => actualElement.unnamedConstructor;
+
+  @override
+  FieldElement getField(String fieldName) => actualElement.getField(fieldName);
+
+  @override
+  PropertyAccessorElement getGetter(String getterName) =>
+      actualElement.getGetter(getterName);
+
+  @override
+  MethodElement getMethod(String methodName) =>
+      actualElement.getMethod(methodName);
+
+  @override
+  ConstructorElement getNamedConstructor(String name) =>
+      actualElement.getNamedConstructor(name);
+
+  @override
+  PropertyAccessorElement getSetter(String setterName) =>
+      actualElement.getSetter(setterName);
+
+  @override
+  bool isSuperConstructorAccessible(ConstructorElement constructor) =>
+      actualElement.isSuperConstructorAccessible(constructor);
+
+  @override
+  MethodElement lookUpConcreteMethod(
+          String methodName, LibraryElement library) =>
+      actualElement.lookUpConcreteMethod(methodName, library);
+
+  @override
+  PropertyAccessorElement lookUpGetter(
+          String getterName, LibraryElement library) =>
+      actualElement.lookUpGetter(getterName, library);
+
+  @override
+  PropertyAccessorElement lookUpInheritedConcreteGetter(
+          String methodName, LibraryElement library) =>
+      actualElement.lookUpInheritedConcreteGetter(methodName, library);
+
+  @override
+  MethodElement lookUpInheritedConcreteMethod(
+          String methodName, LibraryElement library) =>
+      actualElement.lookUpInheritedConcreteMethod(methodName, library);
+
+  @override
+  PropertyAccessorElement lookUpInheritedConcreteSetter(
+          String methodName, LibraryElement library) =>
+      actualElement.lookUpInheritedConcreteSetter(methodName, library);
+
+  @override
+  MethodElement lookUpInheritedMethod(
+          String methodName, LibraryElement library) =>
+      actualElement.lookUpInheritedMethod(methodName, library);
+
+  @override
+  MethodElement lookUpMethod(String methodName, LibraryElement library) =>
+      actualElement.lookUpMethod(methodName, library);
+
+  @override
+  PropertyAccessorElement lookUpSetter(
+          String setterName, LibraryElement library) =>
+      actualElement.lookUpSetter(setterName, library);
+}
+
+/**
+ * Instances of the class `CompilationUnitElementHandle` implements a handle to a
+ * [CompilationUnitElement].
+ */
+class CompilationUnitElementHandle extends ElementHandle
+    implements CompilationUnitElement {
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  CompilationUnitElementHandle(CompilationUnitElement element) : super(element);
+
+  @override
+  List<PropertyAccessorElement> get accessors => actualElement.accessors;
+
+  @override
+  CompilationUnitElement get actualElement =>
+      super.actualElement as CompilationUnitElement;
+
+  @override
+  LibraryElement get enclosingElement =>
+      super.enclosingElement as LibraryElement;
+
+  @override
+  List<ClassElement> get enums => actualElement.enums;
+
+  @override
+  List<FunctionElement> get functions => actualElement.functions;
+
+  @override
+  List<FunctionTypeAliasElement> get functionTypeAliases =>
+      actualElement.functionTypeAliases;
+
+  @override
+  bool get hasLoadLibraryFunction => actualElement.hasLoadLibraryFunction;
+
+  @override
+  ElementKind get kind => ElementKind.COMPILATION_UNIT;
+
+  @override
+  Source get source => actualElement.source;
+
+  @override
+  List<TopLevelVariableElement> get topLevelVariables =>
+      actualElement.topLevelVariables;
+
+  @override
+  List<ClassElement> get types => actualElement.types;
+
+  @override
+  String get uri => actualElement.uri;
+
+  @override
+  int get uriEnd => actualElement.uriEnd;
+
+  @override
+  int get uriOffset => actualElement.uriOffset;
+
+  @override
+  CompilationUnit computeNode() => actualElement.computeNode();
+
+  @override
+  Element getElementAt(int offset) {
+    return actualElement.getElementAt(offset);
+  }
+
+  @override
+  ClassElement getEnum(String enumName) => actualElement.getEnum(enumName);
+
+  @override
+  ClassElement getType(String className) => actualElement.getType(className);
+}
+
+/**
+ * Instances of the class `ConstructorElementHandle` implement a handle to a
+ * `ConstructorElement`.
+ */
+class ConstructorElementHandle extends ExecutableElementHandle
+    implements ConstructorElement {
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  ConstructorElementHandle(ConstructorElement element) : super(element);
+
+  @override
+  ConstructorElement get actualElement =>
+      super.actualElement as ConstructorElement;
+
+  @override
+  ClassElement get enclosingElement => actualElement.enclosingElement;
+
+  @override
+  bool get isConst => actualElement.isConst;
+
+  @override
+  bool get isDefaultConstructor => actualElement.isDefaultConstructor;
+
+  @override
+  bool get isFactory => actualElement.isFactory;
+
+  @override
+  ElementKind get kind => ElementKind.CONSTRUCTOR;
+
+  @override
+  int get nameEnd => actualElement.nameEnd;
+
+  @override
+  int get periodOffset => actualElement.periodOffset;
+
+  @override
+  ConstructorElement get redirectedConstructor =>
+      actualElement.redirectedConstructor;
+
+  @override
+  ConstructorDeclaration computeNode() => actualElement.computeNode();
+}
+
+/**
+ * The abstract class `ElementHandle` implements the behavior common to objects that implement
+ * a handle to an [Element].
+ */
+abstract class ElementHandle implements Element {
+  /**
+   * The unique integer identifier of this element.
+   */
+  final int id = 0;
+
+  /**
+   * The context in which the element is defined.
+   */
+  AnalysisContext _context;
+
+  /**
+   * The location of this element, used to reconstitute the element if it has been garbage
+   * collected.
+   */
+  ElementLocation _location;
+
+  /**
+   * A reference to the element being referenced by this handle, or `null` if the element has
+   * been garbage collected.
+   */
+  WeakReference<Element> _elementReference;
+
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  ElementHandle(Element element) {
+    _context = element.context;
+    _location = element.location;
+    _elementReference = new WeakReference<Element>(element);
+  }
+
+  /**
+   * Return the element being represented by this handle, reconstituting the element if the
+   * reference has been set to `null`.
+   *
+   * @return the element being represented by this handle
+   */
+  Element get actualElement {
+    Element element = _elementReference.get();
+    if (element == null) {
+      element = _context.getElement(_location);
+      _elementReference = new WeakReference<Element>(element);
+    }
+    return element;
+  }
+
+  @override
+  AnalysisContext get context => _context;
+
+  @override
+  String get displayName => actualElement.displayName;
+
+  @override
+  Element get enclosingElement => actualElement.enclosingElement;
+
+  @override
+  int get hashCode => _location.hashCode;
+
+  @override
+  bool get isDeprecated => actualElement.isDeprecated;
+
+  @override
+  bool get isOverride => actualElement.isOverride;
+
+  @override
+  bool get isPrivate => actualElement.isPrivate;
+
+  @override
+  bool get isPublic => actualElement.isPublic;
+
+  @override
+  bool get isSynthetic => actualElement.isSynthetic;
+
+  @override
+  LibraryElement get library =>
+      getAncestor((element) => element is LibraryElement);
+
+  @override
+  ElementLocation get location => _location;
+
+  @override
+  List<ElementAnnotation> get metadata => actualElement.metadata;
+
+  @override
+  String get name => actualElement.name;
+
+  @override
+  int get nameOffset => actualElement.nameOffset;
+
+  @deprecated
+  @override
+  AstNode get node => computeNode();
+
+  @override
+  Source get source => actualElement.source;
+
+  @override
+  CompilationUnit get unit => actualElement.unit;
+
+  @override
+  bool operator ==(Object object) =>
+      object is Element && object.location == _location;
+
+  @override
+  accept(ElementVisitor visitor) => actualElement.accept(visitor);
+
+  @override
+  String computeDocumentationComment() =>
+      actualElement.computeDocumentationComment();
+
+  @override
+  AstNode computeNode() => actualElement.computeNode();
+
+  @override
+  Element getAncestor(Predicate<Element> predicate) =>
+      actualElement.getAncestor(predicate);
+
+  @override
+  String getExtendedDisplayName(String shortName) =>
+      actualElement.getExtendedDisplayName(shortName);
+
+  @override
+  bool isAccessibleIn(LibraryElement library) =>
+      actualElement.isAccessibleIn(library);
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    actualElement.visitChildren(visitor);
+  }
+
+  /**
+   * Return a handle on the given element. If the element is already a handle, then it will be
+   * returned directly, otherwise a handle of the appropriate class will be constructed.
+   *
+   * @param element the element for which a handle is to be constructed
+   * @return a handle on the given element
+   */
+  static Element forElement(Element element) {
+    if (element is ElementHandle) {
+      return element;
+    }
+    while (true) {
+      if (element.kind == ElementKind.CLASS) {
+        return new ClassElementHandle(element as ClassElement);
+      } else if (element.kind == ElementKind.COMPILATION_UNIT) {
+        return new CompilationUnitElementHandle(
+            element as CompilationUnitElement);
+      } else if (element.kind == ElementKind.CONSTRUCTOR) {
+        return new ConstructorElementHandle(element as ConstructorElement);
+      } else if (element.kind == ElementKind.EXPORT) {
+        return new ExportElementHandle(element as ExportElement);
+      } else if (element.kind == ElementKind.FIELD) {
+        return new FieldElementHandle(element as FieldElement);
+      } else if (element.kind == ElementKind.FUNCTION) {
+        return new FunctionElementHandle(element as FunctionElement);
+      } else if (element.kind == ElementKind.GETTER) {
+        return new PropertyAccessorElementHandle(
+            element as PropertyAccessorElement);
+      } else if (element.kind == ElementKind.IMPORT) {
+        return new ImportElementHandle(element as ImportElement);
+      } else if (element.kind == ElementKind.LABEL) {
+        return new LabelElementHandle(element as LabelElement);
+      } else if (element.kind == ElementKind.LIBRARY) {
+        return new LibraryElementHandle(element as LibraryElement);
+      } else if (element.kind == ElementKind.LOCAL_VARIABLE) {
+        return new LocalVariableElementHandle(element as LocalVariableElement);
+      } else if (element.kind == ElementKind.METHOD) {
+        return new MethodElementHandle(element as MethodElement);
+      } else if (element.kind == ElementKind.PARAMETER) {
+        return new ParameterElementHandle(element as ParameterElement);
+      } else if (element.kind == ElementKind.PREFIX) {
+        return new PrefixElementHandle(element as PrefixElement);
+      } else if (element.kind == ElementKind.SETTER) {
+        return new PropertyAccessorElementHandle(
+            element as PropertyAccessorElement);
+      } else if (element.kind == ElementKind.TOP_LEVEL_VARIABLE) {
+        return new TopLevelVariableElementHandle(
+            element as TopLevelVariableElement);
+      } else if (element.kind == ElementKind.FUNCTION_TYPE_ALIAS) {
+        return new FunctionTypeAliasElementHandle(
+            element as FunctionTypeAliasElement);
+      } else if (element.kind == ElementKind.TYPE_PARAMETER) {
+        return new TypeParameterElementHandle(element as TypeParameterElement);
+      } else {
+        throw new UnsupportedOperationException();
+      }
+      break;
+    }
+  }
+
+  /**
+   * Return an array of the same size as the given array where each element of the returned array is
+   * a handle for the corresponding element of the given array.
+   *
+   * @param elements the elements for which handles are to be created
+   * @return an array of handles to the given elements
+   */
+  static List<Element> forElements(List<Element> elements) {
+    int length = elements.length;
+    List<Element> handles = new List<Element>.from(elements);
+    for (int i = 0; i < length; i++) {
+      handles[i] = forElement(elements[i]);
+    }
+    return handles;
+  }
+}
+
+/**
+ * The abstract class `ExecutableElementHandle` implements the behavior common to objects that
+ * implement a handle to an [ExecutableElement].
+ */
+abstract class ExecutableElementHandle extends ElementHandle
+    implements ExecutableElement {
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  ExecutableElementHandle(ExecutableElement element) : super(element);
+
+  @override
+  ExecutableElement get actualElement =>
+      super.actualElement as ExecutableElement;
+
+  @override
+  List<FunctionElement> get functions => actualElement.functions;
+
+  @override
+  bool get hasImplicitReturnType => actualElement.hasImplicitReturnType;
+
+  @override
+  bool get isAbstract => actualElement.isAbstract;
+
+  @override
+  bool get isAsynchronous => actualElement.isAsynchronous;
+
+  @override
+  bool get isExternal => actualElement.isExternal;
+
+  @override
+  bool get isGenerator => actualElement.isGenerator;
+
+  @override
+  bool get isOperator => actualElement.isOperator;
+
+  @override
+  bool get isStatic => actualElement.isStatic;
+
+  @override
+  bool get isSynchronous => actualElement.isSynchronous;
+
+  @override
+  List<LabelElement> get labels => actualElement.labels;
+
+  @override
+  List<LocalVariableElement> get localVariables => actualElement.localVariables;
+
+  @override
+  List<ParameterElement> get parameters => actualElement.parameters;
+
+  @override
+  DartType get returnType => actualElement.returnType;
+
+  @override
+  FunctionType get type => actualElement.type;
+
+  @override
+  List<TypeParameterElement> get typeParameters => actualElement.typeParameters;
+}
+
+/**
+ * Instances of the class `ExportElementHandle` implement a handle to an `ExportElement`
+ * .
+ */
+class ExportElementHandle extends ElementHandle implements ExportElement {
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  ExportElementHandle(ExportElement element) : super(element);
+
+  @override
+  ExportElement get actualElement => super.actualElement as ExportElement;
+
+  @override
+  List<NamespaceCombinator> get combinators => actualElement.combinators;
+
+  @override
+  LibraryElement get exportedLibrary => actualElement.exportedLibrary;
+
+  @override
+  ElementKind get kind => ElementKind.EXPORT;
+
+  @override
+  String get uri => actualElement.uri;
+
+  @override
+  int get uriEnd => actualElement.uriEnd;
+
+  @override
+  int get uriOffset => actualElement.uriOffset;
+}
+
+/**
+ * Instances of the class `FieldElementHandle` implement a handle to a `FieldElement`.
+ */
+class FieldElementHandle extends PropertyInducingElementHandle
+    implements FieldElement {
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  FieldElementHandle(FieldElement element) : super(element);
+
+  @override
+  FieldElement get actualElement => super.actualElement as FieldElement;
+
+  @override
+  ClassElement get enclosingElement => actualElement.enclosingElement;
+
+  @override
+  bool get isEnumConstant => actualElement.isEnumConstant;
+
+  @override
+  ElementKind get kind => ElementKind.FIELD;
+
+  @override
+  VariableDeclaration computeNode() => actualElement.computeNode();
+}
+
+/**
+ * Instances of the class `FunctionElementHandle` implement a handle to a
+ * `FunctionElement`.
+ */
+class FunctionElementHandle extends ExecutableElementHandle
+    implements FunctionElement {
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  FunctionElementHandle(FunctionElement element) : super(element);
+
+  @override
+  FunctionElement get actualElement => super.actualElement as FunctionElement;
+
+  @override
+  bool get isEntryPoint => actualElement.isEntryPoint;
+
+  @override
+  ElementKind get kind => ElementKind.FUNCTION;
+
+  @override
+  SourceRange get visibleRange => actualElement.visibleRange;
+
+  @override
+  FunctionDeclaration computeNode() => actualElement.computeNode();
+}
+
+/**
+ * Instances of the class `FunctionTypeAliasElementHandle` implement a handle to a
+ * `FunctionTypeAliasElement`.
+ */
+class FunctionTypeAliasElementHandle extends ElementHandle
+    implements FunctionTypeAliasElement {
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  FunctionTypeAliasElementHandle(FunctionTypeAliasElement element)
+      : super(element);
+
+  @override
+  FunctionTypeAliasElement get actualElement =>
+      super.actualElement as FunctionTypeAliasElement;
+
+  @override
+  CompilationUnitElement get enclosingElement =>
+      super.enclosingElement as CompilationUnitElement;
+
+  @override
+  ElementKind get kind => ElementKind.FUNCTION_TYPE_ALIAS;
+
+  @override
+  List<ParameterElement> get parameters => actualElement.parameters;
+
+  @override
+  DartType get returnType => actualElement.returnType;
+
+  @override
+  FunctionType get type => actualElement.type;
+
+  @override
+  List<TypeParameterElement> get typeParameters => actualElement.typeParameters;
+
+  @override
+  FunctionTypeAlias computeNode() => actualElement.computeNode();
+}
+
+/**
+ * Instances of the class `ImportElementHandle` implement a handle to an `ImportElement`
+ * .
+ */
+class ImportElementHandle extends ElementHandle implements ImportElement {
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  ImportElementHandle(ImportElement element) : super(element);
+
+  @override
+  ImportElement get actualElement => super.actualElement as ImportElement;
+
+  @override
+  List<NamespaceCombinator> get combinators => actualElement.combinators;
+
+  @override
+  LibraryElement get importedLibrary => actualElement.importedLibrary;
+
+  @override
+  bool get isDeferred => actualElement.isDeferred;
+
+  @override
+  ElementKind get kind => ElementKind.IMPORT;
+
+  @override
+  PrefixElement get prefix => actualElement.prefix;
+
+  @override
+  int get prefixOffset => actualElement.prefixOffset;
+
+  @override
+  String get uri => actualElement.uri;
+
+  @override
+  int get uriEnd => actualElement.uriEnd;
+
+  @override
+  int get uriOffset => actualElement.uriOffset;
+}
+
+/**
+ * Instances of the class `LabelElementHandle` implement a handle to a `LabelElement`.
+ */
+class LabelElementHandle extends ElementHandle implements LabelElement {
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  LabelElementHandle(LabelElement element) : super(element);
+
+  @override
+  ExecutableElement get enclosingElement =>
+      super.enclosingElement as ExecutableElement;
+
+  @override
+  ElementKind get kind => ElementKind.LABEL;
+}
+
+/**
+ * Instances of the class `LibraryElementHandle` implement a handle to a
+ * `LibraryElement`.
+ */
+class LibraryElementHandle extends ElementHandle implements LibraryElement {
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  LibraryElementHandle(LibraryElement element) : super(element);
+
+  @override
+  LibraryElement get actualElement => super.actualElement as LibraryElement;
+
+  @override
+  CompilationUnitElement get definingCompilationUnit =>
+      actualElement.definingCompilationUnit;
+
+  @override
+  FunctionElement get entryPoint => actualElement.entryPoint;
+
+  @override
+  List<LibraryElement> get exportedLibraries => actualElement.exportedLibraries;
+
+  @override
+  Namespace get exportNamespace => actualElement.exportNamespace;
+
+  @override
+  List<ExportElement> get exports => actualElement.exports;
+
+  @override
+  bool get hasExtUri => actualElement.hasExtUri;
+
+  @override
+  bool get hasLoadLibraryFunction => actualElement.hasLoadLibraryFunction;
+
+  @override
+  List<LibraryElement> get importedLibraries => actualElement.importedLibraries;
+
+  @override
+  List<ImportElement> get imports => actualElement.imports;
+
+  @override
+  bool get isBrowserApplication => actualElement.isBrowserApplication;
+
+  @override
+  bool get isDartCore => actualElement.isDartCore;
+
+  @override
+  bool get isInSdk => actualElement.isInSdk;
+
+  @override
+  ElementKind get kind => ElementKind.LIBRARY;
+
+  @override
+  FunctionElement get loadLibraryFunction => actualElement.loadLibraryFunction;
+
+  @override
+  List<CompilationUnitElement> get parts => actualElement.parts;
+
+  @override
+  List<PrefixElement> get prefixes => actualElement.prefixes;
+
+  @override
+  Namespace get publicNamespace => actualElement.publicNamespace;
+
+  @override
+  List<CompilationUnitElement> get units => actualElement.units;
+
+  @override
+  List<LibraryElement> get visibleLibraries => actualElement.visibleLibraries;
+
+  @override
+  List<ImportElement> getImportsWithPrefix(PrefixElement prefixElement) =>
+      actualElement.getImportsWithPrefix(prefixElement);
+
+  @override
+  ClassElement getType(String className) => actualElement.getType(className);
+
+  @override
+  bool isUpToDate(int timeStamp) => actualElement.isUpToDate(timeStamp);
+}
+
+/**
+ * Instances of the class `LocalVariableElementHandle` implement a handle to a
+ * `LocalVariableElement`.
+ */
+class LocalVariableElementHandle extends VariableElementHandle
+    implements LocalVariableElement {
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  LocalVariableElementHandle(LocalVariableElement element) : super(element);
+
+  @override
+  LocalVariableElement get actualElement =>
+      super.actualElement as LocalVariableElement;
+
+  @override
+  ElementKind get kind => ElementKind.LOCAL_VARIABLE;
+
+  @override
+  SourceRange get visibleRange => actualElement.visibleRange;
+
+  @override
+  VariableDeclaration computeNode() => actualElement.computeNode();
+}
+
+/**
+ * Instances of the class `MethodElementHandle` implement a handle to a `MethodElement`.
+ */
+class MethodElementHandle extends ExecutableElementHandle
+    implements MethodElement {
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  MethodElementHandle(MethodElement element) : super(element);
+
+  @override
+  MethodElement get actualElement => super.actualElement as MethodElement;
+
+  @override
+  ClassElement get enclosingElement => super.enclosingElement as ClassElement;
+
+  @override
+  bool get isStatic => actualElement.isStatic;
+
+  @override
+  ElementKind get kind => ElementKind.METHOD;
+
+  @override
+  MethodDeclaration computeNode() => actualElement.computeNode();
+}
+
+/**
+ * Instances of the class `ParameterElementHandle` implement a handle to a
+ * `ParameterElement`.
+ */
+class ParameterElementHandle extends VariableElementHandle
+    with ParameterElementMixin
+    implements ParameterElement {
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  ParameterElementHandle(ParameterElement element) : super(element);
+
+  @override
+  ParameterElement get actualElement => super.actualElement as ParameterElement;
+
+  @override
+  String get defaultValueCode => actualElement.defaultValueCode;
+
+  @override
+  bool get isInitializingFormal => actualElement.isInitializingFormal;
+
+  @override
+  ElementKind get kind => ElementKind.PARAMETER;
+
+  @override
+  ParameterKind get parameterKind => actualElement.parameterKind;
+
+  @override
+  List<ParameterElement> get parameters => actualElement.parameters;
+
+  @override
+  List<TypeParameterElement> get typeParameters => actualElement.typeParameters;
+
+  @override
+  SourceRange get visibleRange => actualElement.visibleRange;
+}
+
+/**
+ * Instances of the class `PrefixElementHandle` implement a handle to a `PrefixElement`.
+ */
+class PrefixElementHandle extends ElementHandle implements PrefixElement {
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  PrefixElementHandle(PrefixElement element) : super(element);
+
+  @override
+  PrefixElement get actualElement => super.actualElement as PrefixElement;
+
+  @override
+  LibraryElement get enclosingElement =>
+      super.enclosingElement as LibraryElement;
+
+  @override
+  List<LibraryElement> get importedLibraries => actualElement.importedLibraries;
+
+  @override
+  ElementKind get kind => ElementKind.PREFIX;
+}
+
+/**
+ * Instances of the class `PropertyAccessorElementHandle` implement a handle to a
+ * `PropertyAccessorElement`.
+ */
+class PropertyAccessorElementHandle extends ExecutableElementHandle
+    implements PropertyAccessorElement {
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  PropertyAccessorElementHandle(PropertyAccessorElement element)
+      : super(element);
+
+  @override
+  PropertyAccessorElement get actualElement =>
+      super.actualElement as PropertyAccessorElement;
+
+  @override
+  PropertyAccessorElement get correspondingGetter =>
+      actualElement.correspondingGetter;
+
+  @override
+  PropertyAccessorElement get correspondingSetter =>
+      actualElement.correspondingSetter;
+
+  @override
+  bool get isGetter => actualElement.isGetter;
+
+  @override
+  bool get isSetter => actualElement.isSetter;
+
+  @override
+  ElementKind get kind {
+    if (isGetter) {
+      return ElementKind.GETTER;
+    } else {
+      return ElementKind.SETTER;
+    }
+  }
+
+  @override
+  PropertyInducingElement get variable => actualElement.variable;
+}
+
+/**
+ * The abstract class `PropertyInducingElementHandle` implements the behavior common to
+ * objects that implement a handle to an `PropertyInducingElement`.
+ */
+abstract class PropertyInducingElementHandle extends VariableElementHandle
+    implements PropertyInducingElement {
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  PropertyInducingElementHandle(PropertyInducingElement element)
+      : super(element);
+
+  @override
+  PropertyInducingElement get actualElement =>
+      super.actualElement as PropertyInducingElement;
+
+  @override
+  PropertyAccessorElement get getter => actualElement.getter;
+
+  @override
+  DartType get propagatedType => actualElement.propagatedType;
+
+  @override
+  PropertyAccessorElement get setter => actualElement.setter;
+}
+
+/**
+ * Instances of the class `TopLevelVariableElementHandle` implement a handle to a
+ * `TopLevelVariableElement`.
+ */
+class TopLevelVariableElementHandle extends PropertyInducingElementHandle
+    implements TopLevelVariableElement {
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  TopLevelVariableElementHandle(TopLevelVariableElement element)
+      : super(element);
+
+  @override
+  ElementKind get kind => ElementKind.TOP_LEVEL_VARIABLE;
+}
+
+/**
+ * Instances of the class `TypeParameterElementHandle` implement a handle to a
+ * [TypeParameterElement].
+ */
+class TypeParameterElementHandle extends ElementHandle
+    implements TypeParameterElement {
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  TypeParameterElementHandle(TypeParameterElement element) : super(element);
+
+  @override
+  TypeParameterElement get actualElement =>
+      super.actualElement as TypeParameterElement;
+
+  @override
+  DartType get bound => actualElement.bound;
+
+  @override
+  ElementKind get kind => ElementKind.TYPE_PARAMETER;
+
+  @override
+  TypeParameterType get type => actualElement.type;
+}
+
+/**
+ * The abstract class `VariableElementHandle` implements the behavior common to objects that
+ * implement a handle to an `VariableElement`.
+ */
+abstract class VariableElementHandle extends ElementHandle
+    implements VariableElement {
+  /**
+   * Initialize a newly created element handle to represent the given element.
+   *
+   * @param element the element being represented
+   */
+  VariableElementHandle(VariableElement element) : super(element);
+
+  @override
+  VariableElement get actualElement => super.actualElement as VariableElement;
+
+  @override
+  bool get hasImplicitType => actualElement.hasImplicitType;
+
+  @override
+  FunctionElement get initializer => actualElement.initializer;
+
+  @override
+  bool get isConst => actualElement.isConst;
+
+  @override
+  bool get isFinal => actualElement.isFinal;
+
+  @override
+  bool get isPotentiallyMutatedInClosure =>
+      actualElement.isPotentiallyMutatedInClosure;
+
+  @override
+  bool get isPotentiallyMutatedInScope =>
+      actualElement.isPotentiallyMutatedInScope;
+
+  @override
+  bool get isStatic => actualElement.isStatic;
+
+  @override
+  DartType get type => actualElement.type;
+}
+
+/**
+ * TODO(scheglov) invalid implementation
+ */
+class WeakReference<T> {
+  final T value;
+  WeakReference(this.value);
+  T get() => value;
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/element_resolver.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/element_resolver.dart
new file mode 100644
index 0000000..1e5794a
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/element_resolver.dart
@@ -0,0 +1,2809 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.resolver.element_resolver;
+
+import 'dart:collection';
+
+import 'ast.dart';
+import 'element.dart';
+import 'engine.dart';
+import 'error.dart';
+import 'resolver.dart';
+import 'scanner.dart' as sc;
+import 'utilities_dart.dart';
+
+/**
+ * An object used by instances of [ResolverVisitor] to resolve references within
+ * the AST structure to the elements being referenced. The requirements for the
+ * element resolver are:
+ *
+ * 1. Every [SimpleIdentifier] should be resolved to the element to which it
+ *    refers. Specifically:
+ *    * An identifier within the declaration of that name should resolve to the
+ *      element being declared.
+ *    * An identifier denoting a prefix should resolve to the element
+ *      representing the import that defines the prefix (an [ImportElement]).
+ *    * An identifier denoting a variable should resolve to the element
+ *      representing the variable (a [VariableElement]).
+ *    * An identifier denoting a parameter should resolve to the element
+ *      representing the parameter (a [ParameterElement]).
+ *    * An identifier denoting a field should resolve to the element
+ *      representing the getter or setter being invoked (a
+ *      [PropertyAccessorElement]).
+ *    * An identifier denoting the name of a method or function being invoked
+ *      should resolve to the element representing the method or function (an
+ *      [ExecutableElement]).
+ *    * An identifier denoting a label should resolve to the element
+ *      representing the label (a [LabelElement]).
+ *    The identifiers within directives are exceptions to this rule and are
+ *    covered below.
+ * 2. Every node containing a token representing an operator that can be
+ *    overridden ( [BinaryExpression], [PrefixExpression], [PostfixExpression])
+ *    should resolve to the element representing the method invoked by that
+ *    operator (a [MethodElement]).
+ * 3. Every [FunctionExpressionInvocation] should resolve to the element
+ *    representing the function being invoked (a [FunctionElement]). This will
+ *    be the same element as that to which the name is resolved if the function
+ *    has a name, but is provided for those cases where an unnamed function is
+ *    being invoked.
+ * 4. Every [LibraryDirective] and [PartOfDirective] should resolve to the
+ *    element representing the library being specified by the directive (a
+ *    [LibraryElement]) unless, in the case of a part-of directive, the
+ *    specified library does not exist.
+ * 5. Every [ImportDirective] and [ExportDirective] should resolve to the
+ *    element representing the library being specified by the directive unless
+ *    the specified library does not exist (an [ImportElement] or
+ *    [ExportElement]).
+ * 6. The identifier representing the prefix in an [ImportDirective] should
+ *    resolve to the element representing the prefix (a [PrefixElement]).
+ * 7. The identifiers in the hide and show combinators in [ImportDirective]s
+ *    and [ExportDirective]s should resolve to the elements that are being
+ *    hidden or shown, respectively, unless those names are not defined in the
+ *    specified library (or the specified library does not exist).
+ * 8. Every [PartDirective] should resolve to the element representing the
+ *    compilation unit being specified by the string unless the specified
+ *    compilation unit does not exist (a [CompilationUnitElement]).
+ *
+ * Note that AST nodes that would represent elements that are not defined are
+ * not resolved to anything. This includes such things as references to
+ * undeclared variables (which is an error) and names in hide and show
+ * combinators that are not defined in the imported library (which is not an
+ * error).
+ */
+class ElementResolver extends SimpleAstVisitor<Object> {
+  /**
+   * The resolver driving this participant.
+   */
+  final ResolverVisitor _resolver;
+
+  /**
+   * The element for the library containing the compilation unit being visited.
+   */
+  LibraryElement _definingLibrary;
+
+  /**
+   * A flag indicating whether we should generate hints.
+   */
+  bool _enableHints = false;
+
+  /**
+   * A flag indicating whether we should strictly follow the specification when
+   * generating warnings on "call" methods (fixes dartbug.com/21938).
+   */
+  bool _enableStrictCallChecks = false;
+
+  /**
+   * The type representing the type 'dynamic'.
+   */
+  DartType _dynamicType;
+
+  /**
+   * The type representing the type 'type'.
+   */
+  DartType _typeType;
+
+  /**
+   * A utility class for the resolver to answer the question of "what are my
+   * subtypes?".
+   */
+  SubtypeManager _subtypeManager;
+
+  /**
+   * The object keeping track of which elements have had their types promoted.
+   */
+  TypePromotionManager _promoteManager;
+
+  /**
+   * Initialize a newly created visitor to work for the given [_resolver] to
+   * resolve the nodes in a compilation unit.
+   */
+  ElementResolver(this._resolver) {
+    this._definingLibrary = _resolver.definingLibrary;
+    AnalysisOptions options = _definingLibrary.context.analysisOptions;
+    _enableHints = options.hint;
+    _enableStrictCallChecks = options.enableStrictCallChecks;
+    _dynamicType = _resolver.typeProvider.dynamicType;
+    _typeType = _resolver.typeProvider.typeType;
+    _subtypeManager = new SubtypeManager();
+    _promoteManager = _resolver.promoteManager;
+  }
+
+  /**
+   * Return `true` iff the current enclosing function is a constant constructor
+   * declaration.
+   */
+  bool get isInConstConstructor {
+    ExecutableElement function = _resolver.enclosingFunction;
+    if (function is ConstructorElement) {
+      return function.isConst;
+    }
+    return false;
+  }
+
+  @override
+  Object visitAssignmentExpression(AssignmentExpression node) {
+    sc.Token operator = node.operator;
+    sc.TokenType operatorType = operator.type;
+    if (operatorType != sc.TokenType.EQ &&
+        operatorType != sc.TokenType.QUESTION_QUESTION_EQ) {
+      operatorType = _operatorFromCompoundAssignment(operatorType);
+      Expression leftHandSide = node.leftHandSide;
+      if (leftHandSide != null) {
+        String methodName = operatorType.lexeme;
+        DartType staticType = _getStaticType(leftHandSide);
+        MethodElement staticMethod =
+            _lookUpMethod(leftHandSide, staticType, methodName);
+        node.staticElement = staticMethod;
+        DartType propagatedType = _getPropagatedType(leftHandSide);
+        MethodElement propagatedMethod =
+            _lookUpMethod(leftHandSide, propagatedType, methodName);
+        node.propagatedElement = propagatedMethod;
+        if (_shouldReportMissingMember(staticType, staticMethod)) {
+          _recordUndefinedToken(staticType.element,
+              StaticTypeWarningCode.UNDEFINED_METHOD, operator, [
+            methodName,
+            staticType.displayName
+          ]);
+        } else if (_enableHints &&
+            _shouldReportMissingMember(propagatedType, propagatedMethod) &&
+            !_memberFoundInSubclass(
+                propagatedType.element, methodName, true, false)) {
+          _recordUndefinedToken(propagatedType.element,
+              HintCode.UNDEFINED_METHOD, operator, [
+            methodName,
+            propagatedType.displayName
+          ]);
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    sc.Token operator = node.operator;
+    if (operator.isUserDefinableOperator) {
+      _resolveBinaryExpression(node, operator.lexeme);
+    } else if (operator.type == sc.TokenType.BANG_EQ) {
+      _resolveBinaryExpression(node, sc.TokenType.EQ_EQ.lexeme);
+    }
+    return null;
+  }
+
+  @override
+  Object visitBreakStatement(BreakStatement node) {
+    node.target = _lookupBreakOrContinueTarget(node, node.label, false);
+    return null;
+  }
+
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    setMetadata(node.element, node);
+    return null;
+  }
+  @override
+  Object visitClassTypeAlias(ClassTypeAlias node) {
+    setMetadata(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitCommentReference(CommentReference node) {
+    Identifier identifier = node.identifier;
+    if (identifier is SimpleIdentifier) {
+      SimpleIdentifier simpleIdentifier = identifier;
+      Element element = _resolveSimpleIdentifier(simpleIdentifier);
+      if (element == null) {
+        //
+        // This might be a reference to an imported name that is missing the
+        // prefix.
+        //
+        element = _findImportWithoutPrefix(simpleIdentifier);
+        if (element is MultiplyDefinedElement) {
+          // TODO(brianwilkerson) Report this error?
+          element = null;
+        }
+      }
+      if (element == null) {
+        // TODO(brianwilkerson) Report this error?
+        //        resolver.reportError(
+        //            StaticWarningCode.UNDEFINED_IDENTIFIER,
+        //            simpleIdentifier,
+        //            simpleIdentifier.getName());
+      } else {
+        if (element.library == null || element.library != _definingLibrary) {
+          // TODO(brianwilkerson) Report this error?
+        }
+        simpleIdentifier.staticElement = element;
+        if (node.newKeyword != null) {
+          if (element is ClassElement) {
+            ConstructorElement constructor = element.unnamedConstructor;
+            if (constructor == null) {
+              // TODO(brianwilkerson) Report this error.
+            } else {
+              simpleIdentifier.staticElement = constructor;
+            }
+          } else {
+            // TODO(brianwilkerson) Report this error.
+          }
+        }
+      }
+    } else if (identifier is PrefixedIdentifier) {
+      PrefixedIdentifier prefixedIdentifier = identifier;
+      SimpleIdentifier prefix = prefixedIdentifier.prefix;
+      SimpleIdentifier name = prefixedIdentifier.identifier;
+      Element element = _resolveSimpleIdentifier(prefix);
+      if (element == null) {
+//        resolver.reportError(StaticWarningCode.UNDEFINED_IDENTIFIER, prefix, prefix.getName());
+      } else {
+        if (element is PrefixElement) {
+          prefix.staticElement = element;
+          // TODO(brianwilkerson) Report this error?
+          element = _resolver.nameScope.lookup(identifier, _definingLibrary);
+          name.staticElement = element;
+          return null;
+        }
+        LibraryElement library = element.library;
+        if (library == null) {
+          // TODO(brianwilkerson) We need to understand how the library could
+          // ever be null.
+          AnalysisEngine.instance.logger
+              .logError("Found element with null library: ${element.name}");
+        } else if (library != _definingLibrary) {
+          // TODO(brianwilkerson) Report this error.
+        }
+        name.staticElement = element;
+        if (node.newKeyword == null) {
+          if (element is ClassElement) {
+            Element memberElement =
+                _lookupGetterOrMethod(element.type, name.name);
+            if (memberElement == null) {
+              memberElement = element.getNamedConstructor(name.name);
+              if (memberElement == null) {
+                memberElement = _lookUpSetter(prefix, element.type, name.name);
+              }
+            }
+            if (memberElement == null) {
+//              reportGetterOrSetterNotFound(prefixedIdentifier, name, element.getDisplayName());
+            } else {
+              name.staticElement = memberElement;
+            }
+          } else {
+            // TODO(brianwilkerson) Report this error.
+          }
+        } else {
+          if (element is ClassElement) {
+            ConstructorElement constructor =
+                element.getNamedConstructor(name.name);
+            if (constructor == null) {
+              // TODO(brianwilkerson) Report this error.
+            } else {
+              name.staticElement = constructor;
+            }
+          } else {
+            // TODO(brianwilkerson) Report this error.
+          }
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    super.visitConstructorDeclaration(node);
+    ConstructorElement element = node.element;
+    if (element is ConstructorElementImpl) {
+      ConstructorElementImpl constructorElement = element;
+      ConstructorName redirectedNode = node.redirectedConstructor;
+      if (redirectedNode != null) {
+        // set redirected factory constructor
+        ConstructorElement redirectedElement = redirectedNode.staticElement;
+        constructorElement.redirectedConstructor = redirectedElement;
+      } else {
+        // set redirected generative constructor
+        for (ConstructorInitializer initializer in node.initializers) {
+          if (initializer is RedirectingConstructorInvocation) {
+            ConstructorElement redirectedElement = initializer.staticElement;
+            constructorElement.redirectedConstructor = redirectedElement;
+          }
+        }
+      }
+      setMetadata(constructorElement, node);
+    }
+    return null;
+  }
+
+  @override
+  Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    SimpleIdentifier fieldName = node.fieldName;
+    ClassElement enclosingClass = _resolver.enclosingClass;
+    FieldElement fieldElement = enclosingClass.getField(fieldName.name);
+    fieldName.staticElement = fieldElement;
+    return null;
+  }
+
+  @override
+  Object visitConstructorName(ConstructorName node) {
+    DartType type = node.type.type;
+    if (type != null && type.isDynamic) {
+      return null;
+    } else if (type is! InterfaceType) {
+// TODO(brianwilkerson) Report these errors.
+//      ASTNode parent = node.getParent();
+//      if (parent instanceof InstanceCreationExpression) {
+//        if (((InstanceCreationExpression) parent).isConst()) {
+//          // CompileTimeErrorCode.CONST_WITH_NON_TYPE
+//        } else {
+//          // StaticWarningCode.NEW_WITH_NON_TYPE
+//        }
+//      } else {
+//        // This is part of a redirecting factory constructor; not sure which error code to use
+//      }
+      return null;
+    }
+    // look up ConstructorElement
+    ConstructorElement constructor;
+    SimpleIdentifier name = node.name;
+    InterfaceType interfaceType = type as InterfaceType;
+    if (name == null) {
+      constructor = interfaceType.lookUpConstructor(null, _definingLibrary);
+    } else {
+      constructor =
+          interfaceType.lookUpConstructor(name.name, _definingLibrary);
+      name.staticElement = constructor;
+    }
+    node.staticElement = constructor;
+    return null;
+  }
+
+  @override
+  Object visitContinueStatement(ContinueStatement node) {
+    node.target = _lookupBreakOrContinueTarget(node, node.label, true);
+    return null;
+  }
+
+  @override
+  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+    setMetadata(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitEnumDeclaration(EnumDeclaration node) {
+    setMetadata(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitExportDirective(ExportDirective node) {
+    ExportElement exportElement = node.element;
+    if (exportElement != null) {
+      // The element is null when the URI is invalid
+      // TODO(brianwilkerson) Figure out whether the element can ever be
+      // something other than an ExportElement
+      _resolveCombinators(exportElement.exportedLibrary, node.combinators);
+      setMetadata(exportElement, node);
+    }
+    return null;
+  }
+
+  @override
+  Object visitFieldFormalParameter(FieldFormalParameter node) {
+    _setMetadataForParameter(node.element, node);
+    return super.visitFieldFormalParameter(node);
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    setMetadata(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    // TODO(brianwilkerson) Can we ever resolve the function being invoked?
+    Expression expression = node.function;
+    if (expression is FunctionExpression) {
+      FunctionExpression functionExpression = expression;
+      ExecutableElement functionElement = functionExpression.element;
+      ArgumentList argumentList = node.argumentList;
+      List<ParameterElement> parameters =
+          _resolveArgumentsToFunction(false, argumentList, functionElement);
+      if (parameters != null) {
+        argumentList.correspondingStaticParameters = parameters;
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    setMetadata(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    _setMetadataForParameter(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitImportDirective(ImportDirective node) {
+    SimpleIdentifier prefixNode = node.prefix;
+    if (prefixNode != null) {
+      String prefixName = prefixNode.name;
+      for (PrefixElement prefixElement in _definingLibrary.prefixes) {
+        if (prefixElement.displayName == prefixName) {
+          prefixNode.staticElement = prefixElement;
+          break;
+        }
+      }
+    }
+    ImportElement importElement = node.element;
+    if (importElement != null) {
+      // The element is null when the URI is invalid
+      LibraryElement library = importElement.importedLibrary;
+      if (library != null) {
+        _resolveCombinators(library, node.combinators);
+      }
+      setMetadata(importElement, node);
+    }
+    return null;
+  }
+
+  @override
+  Object visitIndexExpression(IndexExpression node) {
+    Expression target = node.realTarget;
+    DartType staticType = _getStaticType(target);
+    DartType propagatedType = _getPropagatedType(target);
+    String getterMethodName = sc.TokenType.INDEX.lexeme;
+    String setterMethodName = sc.TokenType.INDEX_EQ.lexeme;
+    bool isInGetterContext = node.inGetterContext();
+    bool isInSetterContext = node.inSetterContext();
+    if (isInGetterContext && isInSetterContext) {
+      // lookup setter
+      MethodElement setterStaticMethod =
+          _lookUpMethod(target, staticType, setterMethodName);
+      MethodElement setterPropagatedMethod =
+          _lookUpMethod(target, propagatedType, setterMethodName);
+      // set setter element
+      node.staticElement = setterStaticMethod;
+      node.propagatedElement = setterPropagatedMethod;
+      // generate undefined method warning
+      _checkForUndefinedIndexOperator(node, target, getterMethodName,
+          setterStaticMethod, setterPropagatedMethod, staticType,
+          propagatedType);
+      // lookup getter method
+      MethodElement getterStaticMethod =
+          _lookUpMethod(target, staticType, getterMethodName);
+      MethodElement getterPropagatedMethod =
+          _lookUpMethod(target, propagatedType, getterMethodName);
+      // set getter element
+      AuxiliaryElements auxiliaryElements =
+          new AuxiliaryElements(getterStaticMethod, getterPropagatedMethod);
+      node.auxiliaryElements = auxiliaryElements;
+      // generate undefined method warning
+      _checkForUndefinedIndexOperator(node, target, getterMethodName,
+          getterStaticMethod, getterPropagatedMethod, staticType,
+          propagatedType);
+    } else if (isInGetterContext) {
+      // lookup getter method
+      MethodElement staticMethod =
+          _lookUpMethod(target, staticType, getterMethodName);
+      MethodElement propagatedMethod =
+          _lookUpMethod(target, propagatedType, getterMethodName);
+      // set getter element
+      node.staticElement = staticMethod;
+      node.propagatedElement = propagatedMethod;
+      // generate undefined method warning
+      _checkForUndefinedIndexOperator(node, target, getterMethodName,
+          staticMethod, propagatedMethod, staticType, propagatedType);
+    } else if (isInSetterContext) {
+      // lookup setter method
+      MethodElement staticMethod =
+          _lookUpMethod(target, staticType, setterMethodName);
+      MethodElement propagatedMethod =
+          _lookUpMethod(target, propagatedType, setterMethodName);
+      // set setter element
+      node.staticElement = staticMethod;
+      node.propagatedElement = propagatedMethod;
+      // generate undefined method warning
+      _checkForUndefinedIndexOperator(node, target, setterMethodName,
+          staticMethod, propagatedMethod, staticType, propagatedType);
+    }
+    return null;
+  }
+
+  @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    ConstructorElement invokedConstructor = node.constructorName.staticElement;
+    node.staticElement = invokedConstructor;
+    ArgumentList argumentList = node.argumentList;
+    List<ParameterElement> parameters = _resolveArgumentsToFunction(
+        node.isConst, argumentList, invokedConstructor);
+    if (parameters != null) {
+      argumentList.correspondingStaticParameters = parameters;
+    }
+    return null;
+  }
+
+  @override
+  Object visitLibraryDirective(LibraryDirective node) {
+    setMetadata(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    setMetadata(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitMethodInvocation(MethodInvocation node) {
+    SimpleIdentifier methodName = node.methodName;
+    //
+    // Synthetic identifiers have been already reported during parsing.
+    //
+    if (methodName.isSynthetic) {
+      return null;
+    }
+    //
+    // We have a method invocation of one of two forms: 'e.m(a1, ..., an)' or
+    // 'm(a1, ..., an)'. The first step is to figure out which executable is
+    // being invoked, using both the static and the propagated type information.
+    //
+    Expression target = node.realTarget;
+    if (target is SuperExpression && !_isSuperInValidContext(target)) {
+      return null;
+    }
+    Element staticElement;
+    Element propagatedElement;
+    DartType staticType = null;
+    DartType propagatedType = null;
+    if (target == null) {
+      staticElement = _resolveInvokedElement(methodName);
+      propagatedElement = null;
+    } else if (methodName.name == FunctionElement.LOAD_LIBRARY_NAME &&
+        _isDeferredPrefix(target)) {
+      if (node.operator.type == sc.TokenType.QUESTION_PERIOD) {
+        _resolver.reportErrorForNode(
+            CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT, target,
+            [(target as SimpleIdentifier).name]);
+      }
+      LibraryElement importedLibrary = _getImportedLibrary(target);
+      methodName.staticElement = importedLibrary.loadLibraryFunction;
+      return null;
+    } else {
+      staticType = _getStaticType(target);
+      propagatedType = _getPropagatedType(target);
+      //
+      // If this method invocation is of the form 'C.m' where 'C' is a class,
+      // then we don't call resolveInvokedElement(...) which walks up the class
+      // hierarchy, instead we just look for the member in the type only.  This
+      // does not apply to conditional method invocation (i.e. 'C?.m(...)').
+      //
+      bool isConditional = node.operator.type == sc.TokenType.QUESTION_PERIOD;
+      ClassElementImpl typeReference = getTypeReference(target);
+      if (typeReference != null) {
+        staticElement =
+            propagatedElement = _resolveElement(typeReference, methodName);
+      } else {
+        staticElement = _resolveInvokedElementWithTarget(
+            target, staticType, methodName, isConditional);
+        propagatedElement = _resolveInvokedElementWithTarget(
+            target, propagatedType, methodName, isConditional);
+      }
+    }
+    staticElement = _convertSetterToGetter(staticElement);
+    propagatedElement = _convertSetterToGetter(propagatedElement);
+    //
+    // Record the results.
+    //
+    methodName.staticElement = staticElement;
+    methodName.propagatedElement = propagatedElement;
+    ArgumentList argumentList = node.argumentList;
+    if (staticElement != null) {
+      List<ParameterElement> parameters =
+          _computeCorrespondingParameters(argumentList, staticElement);
+      if (parameters != null) {
+        argumentList.correspondingStaticParameters = parameters;
+      }
+    }
+    if (propagatedElement != null) {
+      List<ParameterElement> parameters =
+          _computeCorrespondingParameters(argumentList, propagatedElement);
+      if (parameters != null) {
+        argumentList.correspondingPropagatedParameters = parameters;
+      }
+    }
+    //
+    // Then check for error conditions.
+    //
+    ErrorCode errorCode = _checkForInvocationError(target, true, staticElement);
+    bool generatedWithTypePropagation = false;
+    if (_enableHints && errorCode == null && staticElement == null) {
+      // The method lookup may have failed because there were multiple
+      // incompatible choices. In this case we don't want to generate a hint.
+      errorCode = _checkForInvocationError(target, false, propagatedElement);
+      if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) {
+        ClassElement classElementContext = null;
+        if (target == null) {
+          classElementContext = _resolver.enclosingClass;
+        } else {
+          DartType type = _getBestType(target);
+          if (type != null) {
+            if (type.element is ClassElement) {
+              classElementContext = type.element as ClassElement;
+            }
+          }
+        }
+        if (classElementContext != null) {
+          _subtypeManager.ensureLibraryVisited(_definingLibrary);
+          HashSet<ClassElement> subtypeElements =
+              _subtypeManager.computeAllSubtypes(classElementContext);
+          for (ClassElement subtypeElement in subtypeElements) {
+            if (subtypeElement.getMethod(methodName.name) != null) {
+              errorCode = null;
+            }
+          }
+        }
+      }
+      generatedWithTypePropagation = true;
+    }
+    if (errorCode == null) {
+      return null;
+    }
+    if (identical(
+            errorCode, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION) ||
+        identical(errorCode,
+            CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT) ||
+        identical(errorCode, StaticTypeWarningCode.UNDEFINED_FUNCTION)) {
+      _resolver.reportErrorForNode(errorCode, methodName, [methodName.name]);
+    } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) {
+      String targetTypeName;
+      if (target == null) {
+        ClassElement enclosingClass = _resolver.enclosingClass;
+        targetTypeName = enclosingClass.displayName;
+        ErrorCode proxyErrorCode = (generatedWithTypePropagation
+            ? HintCode.UNDEFINED_METHOD
+            : StaticTypeWarningCode.UNDEFINED_METHOD);
+        _recordUndefinedNode(_resolver.enclosingClass, proxyErrorCode,
+            methodName, [methodName.name, targetTypeName]);
+      } else {
+        // ignore Function "call"
+        // (if we are about to create a hint using type propagation,
+        // then we can use type propagation here as well)
+        DartType targetType = null;
+        if (!generatedWithTypePropagation) {
+          targetType = _getStaticType(target);
+        } else {
+          // choose the best type
+          targetType = _getPropagatedType(target);
+          if (targetType == null) {
+            targetType = _getStaticType(target);
+          }
+        }
+        if (!_enableStrictCallChecks &&
+            targetType != null &&
+            targetType.isDartCoreFunction &&
+            methodName.name == FunctionElement.CALL_METHOD_NAME) {
+          // TODO(brianwilkerson) Can we ever resolve the function being
+          // invoked?
+//          resolveArgumentsToParameters(node.getArgumentList(), invokedFunction);
+          return null;
+        }
+        targetTypeName = targetType == null ? null : targetType.displayName;
+        ErrorCode proxyErrorCode = (generatedWithTypePropagation
+            ? HintCode.UNDEFINED_METHOD
+            : StaticTypeWarningCode.UNDEFINED_METHOD);
+        _recordUndefinedNode(targetType.element, proxyErrorCode, methodName, [
+          methodName.name,
+          targetTypeName
+        ]);
+      }
+    } else if (identical(
+        errorCode, StaticTypeWarningCode.UNDEFINED_SUPER_METHOD)) {
+      // Generate the type name.
+      // The error code will never be generated via type propagation
+      DartType targetType = _getStaticType(target);
+      if (targetType is InterfaceType && !targetType.isObject) {
+        targetType = (targetType as InterfaceType).superclass;
+      }
+      String targetTypeName = targetType == null ? null : targetType.name;
+      _resolver.reportErrorForNode(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD,
+          methodName, [methodName.name, targetTypeName]);
+    }
+    return null;
+  }
+
+  @override
+  Object visitPartDirective(PartDirective node) {
+    setMetadata(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitPartOfDirective(PartOfDirective node) {
+    setMetadata(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitPostfixExpression(PostfixExpression node) {
+    Expression operand = node.operand;
+    String methodName = _getPostfixOperator(node);
+    DartType staticType = _getStaticType(operand);
+    MethodElement staticMethod = _lookUpMethod(operand, staticType, methodName);
+    node.staticElement = staticMethod;
+    DartType propagatedType = _getPropagatedType(operand);
+    MethodElement propagatedMethod =
+        _lookUpMethod(operand, propagatedType, methodName);
+    node.propagatedElement = propagatedMethod;
+    if (_shouldReportMissingMember(staticType, staticMethod)) {
+      if (operand is SuperExpression) {
+        _recordUndefinedToken(staticType.element,
+            StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, node.operator, [
+          methodName,
+          staticType.displayName
+        ]);
+      } else {
+        _recordUndefinedToken(staticType.element,
+            StaticTypeWarningCode.UNDEFINED_OPERATOR, node.operator, [
+          methodName,
+          staticType.displayName
+        ]);
+      }
+    } else if (_enableHints &&
+        _shouldReportMissingMember(propagatedType, propagatedMethod) &&
+        !_memberFoundInSubclass(
+            propagatedType.element, methodName, true, false)) {
+      _recordUndefinedToken(propagatedType.element, HintCode.UNDEFINED_OPERATOR,
+          node.operator, [methodName, propagatedType.displayName]);
+    }
+    return null;
+  }
+
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    SimpleIdentifier prefix = node.prefix;
+    SimpleIdentifier identifier = node.identifier;
+    //
+    // First, check the "lib.loadLibrary" case
+    //
+    if (identifier.name == FunctionElement.LOAD_LIBRARY_NAME &&
+        _isDeferredPrefix(prefix)) {
+      LibraryElement importedLibrary = _getImportedLibrary(prefix);
+      identifier.staticElement = importedLibrary.loadLibraryFunction;
+      return null;
+    }
+    //
+    // Check to see whether the prefix is really a prefix.
+    //
+    Element prefixElement = prefix.staticElement;
+    if (prefixElement is PrefixElement) {
+      Element element = _resolver.nameScope.lookup(node, _definingLibrary);
+      if (element == null && identifier.inSetterContext()) {
+        element = _resolver.nameScope.lookup(
+            new SyntheticIdentifier("${node.name}=", node), _definingLibrary);
+      }
+      if (element == null) {
+        if (identifier.inSetterContext()) {
+          _resolver.reportErrorForNode(StaticWarningCode.UNDEFINED_SETTER,
+              identifier, [identifier.name, prefixElement.name]);
+        } else if (node.parent is Annotation) {
+          Annotation annotation = node.parent as Annotation;
+          _resolver.reportErrorForNode(
+              CompileTimeErrorCode.INVALID_ANNOTATION, annotation);
+          return null;
+        } else {
+          _resolver.reportErrorForNode(StaticWarningCode.UNDEFINED_GETTER,
+              identifier, [identifier.name, prefixElement.name]);
+        }
+        return null;
+      }
+      if (element is PropertyAccessorElement && identifier.inSetterContext()) {
+        PropertyInducingElement variable =
+            (element as PropertyAccessorElement).variable;
+        if (variable != null) {
+          PropertyAccessorElement setter = variable.setter;
+          if (setter != null) {
+            element = setter;
+          }
+        }
+      }
+      // TODO(brianwilkerson) The prefix needs to be resolved to the element for
+      // the import that defines the prefix, not the prefix's element.
+      identifier.staticElement = element;
+      // Validate annotation element.
+      if (node.parent is Annotation) {
+        Annotation annotation = node.parent as Annotation;
+        _resolveAnnotationElement(annotation);
+        return null;
+      }
+      return null;
+    }
+    // May be annotation, resolve invocation of "const" constructor.
+    if (node.parent is Annotation) {
+      Annotation annotation = node.parent as Annotation;
+      _resolveAnnotationElement(annotation);
+    }
+    //
+    // Otherwise, the prefix is really an expression that happens to be a simple
+    // identifier and this is really equivalent to a property access node.
+    //
+    _resolvePropertyAccess(prefix, identifier);
+    return null;
+  }
+
+  @override
+  Object visitPrefixExpression(PrefixExpression node) {
+    sc.Token operator = node.operator;
+    sc.TokenType operatorType = operator.type;
+    if (operatorType.isUserDefinableOperator ||
+        operatorType == sc.TokenType.PLUS_PLUS ||
+        operatorType == sc.TokenType.MINUS_MINUS) {
+      Expression operand = node.operand;
+      String methodName = _getPrefixOperator(node);
+      DartType staticType = _getStaticType(operand);
+      MethodElement staticMethod =
+          _lookUpMethod(operand, staticType, methodName);
+      node.staticElement = staticMethod;
+      DartType propagatedType = _getPropagatedType(operand);
+      MethodElement propagatedMethod =
+          _lookUpMethod(operand, propagatedType, methodName);
+      node.propagatedElement = propagatedMethod;
+      if (_shouldReportMissingMember(staticType, staticMethod)) {
+        if (operand is SuperExpression) {
+          _recordUndefinedToken(staticType.element,
+              StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, operator, [
+            methodName,
+            staticType.displayName
+          ]);
+        } else {
+          _recordUndefinedToken(staticType.element,
+              StaticTypeWarningCode.UNDEFINED_OPERATOR, operator, [
+            methodName,
+            staticType.displayName
+          ]);
+        }
+      } else if (_enableHints &&
+          _shouldReportMissingMember(propagatedType, propagatedMethod) &&
+          !_memberFoundInSubclass(
+              propagatedType.element, methodName, true, false)) {
+        _recordUndefinedToken(propagatedType.element,
+            HintCode.UNDEFINED_OPERATOR, operator, [
+          methodName,
+          propagatedType.displayName
+        ]);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitPropertyAccess(PropertyAccess node) {
+    Expression target = node.realTarget;
+    if (target is SuperExpression && !_isSuperInValidContext(target)) {
+      return null;
+    }
+    SimpleIdentifier propertyName = node.propertyName;
+    _resolvePropertyAccess(target, propertyName);
+    return null;
+  }
+
+  @override
+  Object visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    ClassElement enclosingClass = _resolver.enclosingClass;
+    if (enclosingClass == null) {
+      // TODO(brianwilkerson) Report this error.
+      return null;
+    }
+    SimpleIdentifier name = node.constructorName;
+    ConstructorElement element;
+    if (name == null) {
+      element = enclosingClass.unnamedConstructor;
+    } else {
+      element = enclosingClass.getNamedConstructor(name.name);
+    }
+    if (element == null) {
+      // TODO(brianwilkerson) Report this error and decide what element to
+      // associate with the node.
+      return null;
+    }
+    if (name != null) {
+      name.staticElement = element;
+    }
+    node.staticElement = element;
+    ArgumentList argumentList = node.argumentList;
+    List<ParameterElement> parameters =
+        _resolveArgumentsToFunction(false, argumentList, element);
+    if (parameters != null) {
+      argumentList.correspondingStaticParameters = parameters;
+    }
+    return null;
+  }
+
+  @override
+  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+    _setMetadataForParameter(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    //
+    // Synthetic identifiers have been already reported during parsing.
+    //
+    if (node.isSynthetic) {
+      return null;
+    }
+    //
+    // We ignore identifiers that have already been resolved, such as
+    // identifiers representing the name in a declaration.
+    //
+    if (node.staticElement != null) {
+      return null;
+    }
+    //
+    // The name dynamic denotes a Type object even though dynamic is not a
+    // class.
+    //
+    if (node.name == _dynamicType.name) {
+      node.staticElement = _dynamicType.element;
+      node.staticType = _typeType;
+      return null;
+    }
+    //
+    // Otherwise, the node should be resolved.
+    //
+    Element element = _resolveSimpleIdentifier(node);
+    ClassElement enclosingClass = _resolver.enclosingClass;
+    if (_isFactoryConstructorReturnType(node) &&
+        !identical(element, enclosingClass)) {
+      _resolver.reportErrorForNode(
+          CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS, node);
+    } else if (_isConstructorReturnType(node) &&
+        !identical(element, enclosingClass)) {
+      _resolver.reportErrorForNode(
+          CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node);
+      element = null;
+    } else if (element == null ||
+        (element is PrefixElement && !_isValidAsPrefix(node))) {
+      // TODO(brianwilkerson) Recover from this error.
+      if (_isConstructorReturnType(node)) {
+        _resolver.reportErrorForNode(
+            CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node);
+      } else if (node.parent is Annotation) {
+        Annotation annotation = node.parent as Annotation;
+        _resolver.reportErrorForNode(
+            CompileTimeErrorCode.INVALID_ANNOTATION, annotation);
+      } else if (element is PrefixElement) {
+        _resolver.reportErrorForNode(
+            CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT, node,
+            [element.name]);
+      } else {
+        _recordUndefinedNode(_resolver.enclosingClass,
+            StaticWarningCode.UNDEFINED_IDENTIFIER, node, [node.name]);
+      }
+    }
+    node.staticElement = element;
+    if (node.inSetterContext() &&
+        node.inGetterContext() &&
+        enclosingClass != null) {
+      InterfaceType enclosingType = enclosingClass.type;
+      AuxiliaryElements auxiliaryElements = new AuxiliaryElements(
+          _lookUpGetter(null, enclosingType, node.name), null);
+      node.auxiliaryElements = auxiliaryElements;
+    }
+    //
+    // Validate annotation element.
+    //
+    if (node.parent is Annotation) {
+      Annotation annotation = node.parent as Annotation;
+      _resolveAnnotationElement(annotation);
+    }
+    return null;
+  }
+
+  @override
+  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    ClassElementImpl enclosingClass = _resolver.enclosingClass;
+    if (enclosingClass == null) {
+      // TODO(brianwilkerson) Report this error.
+      return null;
+    }
+    InterfaceType superType = enclosingClass.supertype;
+    if (superType == null) {
+      // TODO(brianwilkerson) Report this error.
+      return null;
+    }
+    SimpleIdentifier name = node.constructorName;
+    String superName = name != null ? name.name : null;
+    ConstructorElement element =
+        superType.lookUpConstructor(superName, _definingLibrary);
+    if (element == null ||
+        (!enclosingClass.doesMixinLackConstructors &&
+            !enclosingClass.isSuperConstructorAccessible(element))) {
+      if (name != null) {
+        _resolver.reportErrorForNode(
+            CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, node, [
+          superType.displayName,
+          name
+        ]);
+      } else {
+        _resolver.reportErrorForNode(
+            CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT,
+            node, [superType.displayName]);
+      }
+      return null;
+    } else {
+      if (element.isFactory) {
+        _resolver.reportErrorForNode(
+            CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node, [element]);
+      }
+    }
+    if (name != null) {
+      name.staticElement = element;
+    }
+    node.staticElement = element;
+    ArgumentList argumentList = node.argumentList;
+    List<ParameterElement> parameters = _resolveArgumentsToFunction(
+        isInConstConstructor, argumentList, element);
+    if (parameters != null) {
+      argumentList.correspondingStaticParameters = parameters;
+    }
+    return null;
+  }
+
+  @override
+  Object visitSuperExpression(SuperExpression node) {
+    if (!_isSuperInValidContext(node)) {
+      _resolver.reportErrorForNode(
+          CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, node);
+    }
+    return super.visitSuperExpression(node);
+  }
+
+  @override
+  Object visitTypeParameter(TypeParameter node) {
+    setMetadata(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    setMetadata(node.element, node);
+    return null;
+  }
+
+  /**
+   * Given that we have found code to invoke the given [element], return the
+   * error code that should be reported, or `null` if no error should be
+   * reported. The [target] is the target of the invocation, or `null` if there
+   * was no target. The flag [useStaticContext] should be `true` if the
+   * invocation is in a static constant (does not have access to instance state.
+   */
+  ErrorCode _checkForInvocationError(
+      Expression target, bool useStaticContext, Element element) {
+    // Prefix is not declared, instead "prefix.id" are declared.
+    if (element is PrefixElement) {
+      return CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT;
+    }
+    if (element is PropertyAccessorElement) {
+      //
+      // This is really a function expression invocation.
+      //
+      // TODO(brianwilkerson) Consider the possibility of re-writing the AST.
+      FunctionType getterType = element.type;
+      if (getterType != null) {
+        DartType returnType = getterType.returnType;
+        if (!_isExecutableType(returnType)) {
+          return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
+        }
+      }
+    } else if (element is ExecutableElement) {
+      return null;
+    } else if (element is MultiplyDefinedElement) {
+      // The error has already been reported
+      return null;
+    } else if (element == null && target is SuperExpression) {
+      // TODO(jwren) We should split the UNDEFINED_METHOD into two error codes,
+      // this one, and a code that describes the situation where the method was
+      // found, but it was not accessible from the current library.
+      return StaticTypeWarningCode.UNDEFINED_SUPER_METHOD;
+    } else {
+      //
+      // This is really a function expression invocation.
+      //
+      // TODO(brianwilkerson) Consider the possibility of re-writing the AST.
+      if (element is PropertyInducingElement) {
+        PropertyAccessorElement getter = element.getter;
+        FunctionType getterType = getter.type;
+        if (getterType != null) {
+          DartType returnType = getterType.returnType;
+          if (!_isExecutableType(returnType)) {
+            return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
+          }
+        }
+      } else if (element is VariableElement) {
+        DartType variableType = element.type;
+        if (!_isExecutableType(variableType)) {
+          return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
+        }
+      } else {
+        if (target == null) {
+          ClassElement enclosingClass = _resolver.enclosingClass;
+          if (enclosingClass == null) {
+            return StaticTypeWarningCode.UNDEFINED_FUNCTION;
+          } else if (element == null) {
+            // Proxy-conditional warning, based on state of
+            // resolver.getEnclosingClass()
+            return StaticTypeWarningCode.UNDEFINED_METHOD;
+          } else {
+            return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
+          }
+        } else {
+          DartType targetType;
+          if (useStaticContext) {
+            targetType = _getStaticType(target);
+          } else {
+            // Compute and use the propagated type, if it is null, then it may
+            // be the case that static type is some type, in which the static
+            // type should be used.
+            targetType = _getBestType(target);
+          }
+          if (targetType == null) {
+            return StaticTypeWarningCode.UNDEFINED_FUNCTION;
+          } else if (!targetType.isDynamic && !targetType.isBottom) {
+            // Proxy-conditional warning, based on state of
+            // targetType.getElement()
+            return StaticTypeWarningCode.UNDEFINED_METHOD;
+          }
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Check that the given index [expression] was resolved, otherwise a
+   * [StaticTypeWarningCode.UNDEFINED_OPERATOR] is generated. The [target] is
+   * the target of the expression. The [methodName] is the name of the operator
+   * associated with the context of using of the given index expression.
+   */
+  bool _checkForUndefinedIndexOperator(IndexExpression expression,
+      Expression target, String methodName, MethodElement staticMethod,
+      MethodElement propagatedMethod, DartType staticType,
+      DartType propagatedType) {
+    bool shouldReportMissingMember_static =
+        _shouldReportMissingMember(staticType, staticMethod);
+    bool shouldReportMissingMember_propagated =
+        !shouldReportMissingMember_static &&
+            _enableHints &&
+            _shouldReportMissingMember(propagatedType, propagatedMethod) &&
+            !_memberFoundInSubclass(
+                propagatedType.element, methodName, true, false);
+    if (shouldReportMissingMember_static ||
+        shouldReportMissingMember_propagated) {
+      sc.Token leftBracket = expression.leftBracket;
+      sc.Token rightBracket = expression.rightBracket;
+      ErrorCode errorCode;
+      if (shouldReportMissingMember_static) {
+        if (target is SuperExpression) {
+          errorCode = StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR;
+        } else {
+          errorCode = StaticTypeWarningCode.UNDEFINED_OPERATOR;
+        }
+      } else {
+        errorCode = HintCode.UNDEFINED_OPERATOR;
+      }
+      DartType type =
+          shouldReportMissingMember_static ? staticType : propagatedType;
+      if (leftBracket == null || rightBracket == null) {
+        _recordUndefinedNode(type.element, errorCode, expression, [
+          methodName,
+          type.displayName
+        ]);
+      } else {
+        int offset = leftBracket.offset;
+        int length = rightBracket.offset - offset + 1;
+        _recordUndefinedOffset(type.element, errorCode, offset, length, [
+          methodName,
+          type.displayName
+        ]);
+      }
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Given an [argumentList] and the executable [element] that  will be invoked
+   * using those arguments, compute the list of parameters that correspond to
+   * the list of arguments. Return the parameters that correspond to the
+   * arguments, or `null` if no correspondence could be computed.
+   */
+  List<ParameterElement> _computeCorrespondingParameters(
+      ArgumentList argumentList, Element element) {
+    if (element is PropertyAccessorElement) {
+      //
+      // This is an invocation of the call method defined on the value returned
+      // by the getter.
+      //
+      FunctionType getterType = element.type;
+      if (getterType != null) {
+        DartType getterReturnType = getterType.returnType;
+        if (getterReturnType is InterfaceType) {
+          MethodElement callMethod = getterReturnType.lookUpMethod(
+              FunctionElement.CALL_METHOD_NAME, _definingLibrary);
+          if (callMethod != null) {
+            return _resolveArgumentsToFunction(false, argumentList, callMethod);
+          }
+        } else if (getterReturnType is FunctionType) {
+          List<ParameterElement> parameters = getterReturnType.parameters;
+          return _resolveArgumentsToParameters(false, argumentList, parameters);
+        }
+      }
+    } else if (element is ExecutableElement) {
+      return _resolveArgumentsToFunction(false, argumentList, element);
+    } else if (element is VariableElement) {
+      VariableElement variable = element;
+      DartType type = _promoteManager.getStaticType(variable);
+      if (type is FunctionType) {
+        FunctionType functionType = type;
+        List<ParameterElement> parameters = functionType.parameters;
+        return _resolveArgumentsToParameters(false, argumentList, parameters);
+      } else if (type is InterfaceType) {
+        // "call" invocation
+        MethodElement callMethod = type.lookUpMethod(
+            FunctionElement.CALL_METHOD_NAME, _definingLibrary);
+        if (callMethod != null) {
+          List<ParameterElement> parameters = callMethod.parameters;
+          return _resolveArgumentsToParameters(false, argumentList, parameters);
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * If the given [element] is a setter, return the getter associated with it.
+   * Otherwise, return the element unchanged.
+   */
+  Element _convertSetterToGetter(Element element) {
+    // TODO(brianwilkerson) Determine whether and why the element could ever be
+    // a setter.
+    if (element is PropertyAccessorElement) {
+      return element.variable.getter;
+    }
+    return element;
+  }
+
+  /**
+   * Return `true` if the given [element] is not a proxy. See
+   * [ClassElement.isOrInheritsProxy].
+   */
+  bool _doesntHaveProxy(Element element) =>
+      !(element is ClassElement && element.isOrInheritsProxy);
+
+  /**
+   * Look for any declarations of the given [identifier] that are imported using
+   * a prefix. Return the element that was found, or `null` if the name is not
+   * imported using a prefix.
+   */
+  Element _findImportWithoutPrefix(SimpleIdentifier identifier) {
+    Element element = null;
+    Scope nameScope = _resolver.nameScope;
+    for (ImportElement importElement in _definingLibrary.imports) {
+      PrefixElement prefixElement = importElement.prefix;
+      if (prefixElement != null) {
+        Identifier prefixedIdentifier = new SyntheticIdentifier(
+            "${prefixElement.name}.${identifier.name}", identifier);
+        Element importedElement =
+            nameScope.lookup(prefixedIdentifier, _definingLibrary);
+        if (importedElement != null) {
+          if (element == null) {
+            element = importedElement;
+          } else {
+            element = MultiplyDefinedElementImpl.fromElements(
+                _definingLibrary.context, element, importedElement);
+          }
+        }
+      }
+    }
+    return element;
+  }
+
+  /**
+   * Return the best type of the given [expression] that is to be used for
+   * type analysis.
+   */
+  DartType _getBestType(Expression expression) {
+    DartType bestType = _resolveTypeParameter(expression.bestType);
+    if (bestType is FunctionType) {
+      //
+      // All function types are subtypes of 'Function', which is itself a
+      // subclass of 'Object'.
+      //
+      bestType = _resolver.typeProvider.functionType;
+    }
+    return bestType;
+  }
+
+  /**
+   * Assuming that the given [expression] is a prefix for a deferred import,
+   * return the library that is being imported.
+   */
+  LibraryElement _getImportedLibrary(Expression expression) {
+    PrefixElement prefixElement =
+        (expression as SimpleIdentifier).staticElement as PrefixElement;
+    List<ImportElement> imports =
+        prefixElement.enclosingElement.getImportsWithPrefix(prefixElement);
+    return imports[0].importedLibrary;
+  }
+
+  /**
+   * Return the name of the method invoked by the given postfix [expression].
+   */
+  String _getPostfixOperator(PostfixExpression expression) =>
+      (expression.operator.type == sc.TokenType.PLUS_PLUS)
+          ? sc.TokenType.PLUS.lexeme
+          : sc.TokenType.MINUS.lexeme;
+
+  /**
+   * Return the name of the method invoked by the given postfix [expression].
+   */
+  String _getPrefixOperator(PrefixExpression expression) {
+    sc.Token operator = expression.operator;
+    sc.TokenType operatorType = operator.type;
+    if (operatorType == sc.TokenType.PLUS_PLUS) {
+      return sc.TokenType.PLUS.lexeme;
+    } else if (operatorType == sc.TokenType.MINUS_MINUS) {
+      return sc.TokenType.MINUS.lexeme;
+    } else if (operatorType == sc.TokenType.MINUS) {
+      return "unary-";
+    } else {
+      return operator.lexeme;
+    }
+  }
+
+  /**
+   * Return the propagated type of the given [expression] that is to be used for
+   * type analysis.
+   */
+  DartType _getPropagatedType(Expression expression) {
+    DartType propagatedType = _resolveTypeParameter(expression.propagatedType);
+    if (propagatedType is FunctionType) {
+      //
+      // All function types are subtypes of 'Function', which is itself a
+      // subclass of 'Object'.
+      //
+      propagatedType = _resolver.typeProvider.functionType;
+    }
+    return propagatedType;
+  }
+
+  /**
+   * Return the static type of the given [expression] that is to be used for
+   * type analysis.
+   */
+  DartType _getStaticType(Expression expression) {
+    if (expression is NullLiteral) {
+      return _resolver.typeProvider.bottomType;
+    }
+    DartType staticType = _resolveTypeParameter(expression.staticType);
+    if (staticType is FunctionType) {
+      //
+      // All function types are subtypes of 'Function', which is itself a
+      // subclass of 'Object'.
+      //
+      staticType = _resolver.typeProvider.functionType;
+    }
+    return staticType;
+  }
+
+  /**
+   * Return `true` if the given [expression] is a prefix for a deferred import.
+   */
+  bool _isDeferredPrefix(Expression expression) {
+    if (expression is! SimpleIdentifier) {
+      return false;
+    }
+    Element element = (expression as SimpleIdentifier).staticElement;
+    if (element is! PrefixElement) {
+      return false;
+    }
+    PrefixElement prefixElement = element as PrefixElement;
+    List<ImportElement> imports =
+        prefixElement.enclosingElement.getImportsWithPrefix(prefixElement);
+    if (imports.length != 1) {
+      return false;
+    }
+    return imports[0].isDeferred;
+  }
+
+  /**
+   * Return `true` if the given [type] represents an object that could be
+   * invoked using the call operator '()'.
+   */
+  bool _isExecutableType(DartType type) {
+    if (type.isDynamic || type is FunctionType) {
+      return true;
+    } else if (!_enableStrictCallChecks &&
+        (type.isDartCoreFunction || type.isObject)) {
+      return true;
+    } else if (type is InterfaceType) {
+      ClassElement classElement = type.element;
+      // 16078 from Gilad: If the type is a Functor with the @proxy annotation,
+      // treat it as an executable type.
+      // example code: NonErrorResolverTest.
+      // test_invocationOfNonFunction_proxyOnFunctionClass()
+      if (classElement.isProxy &&
+          type.isSubtypeOf(_resolver.typeProvider.functionType)) {
+        return true;
+      }
+      MethodElement methodElement = classElement.lookUpMethod(
+          FunctionElement.CALL_METHOD_NAME, _definingLibrary);
+      return methodElement != null;
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given [element] is a static element.
+   */
+  bool _isStatic(Element element) {
+    if (element is ExecutableElement) {
+      return element.isStatic;
+    } else if (element is PropertyInducingElement) {
+      return element.isStatic;
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given [node] can validly be resolved to a prefix:
+   * * it is the prefix in an import directive, or
+   * * it is the prefix in a prefixed identifier.
+   */
+  bool _isValidAsPrefix(SimpleIdentifier node) {
+    AstNode parent = node.parent;
+    if (parent is ImportDirective) {
+      return identical(parent.prefix, node);
+    } else if (parent is PrefixedIdentifier) {
+      return true;
+    } else if (parent is MethodInvocation) {
+      return identical(parent.target, node);
+    }
+    return false;
+  }
+
+  /**
+   * Return the target of a break or continue statement, and update the static
+   * element of its label (if any). The [parentNode] is the AST node of the
+   * break or continue statement. The [labelNode] is the label contained in that
+   * statement (if any). The flag [isContinue] is `true` if the node being
+   * visited is a continue statement.
+   */
+  AstNode _lookupBreakOrContinueTarget(
+      AstNode parentNode, SimpleIdentifier labelNode, bool isContinue) {
+    if (labelNode == null) {
+      return _resolver.implicitLabelScope.getTarget(isContinue);
+    } else {
+      LabelScope labelScope = _resolver.labelScope;
+      if (labelScope == null) {
+        // There are no labels in scope, so by definition the label is
+        // undefined.
+        _resolver.reportErrorForNode(
+            CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [labelNode.name]);
+        return null;
+      }
+      LabelScope definingScope = labelScope.lookup(labelNode.name);
+      if (definingScope == null) {
+        // No definition of the given label name could be found in any
+        // enclosing scope.
+        _resolver.reportErrorForNode(
+            CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [labelNode.name]);
+        return null;
+      }
+      // The target has been found.
+      labelNode.staticElement = definingScope.element;
+      ExecutableElement labelContainer = definingScope.element
+          .getAncestor((element) => element is ExecutableElement);
+      if (!identical(labelContainer, _resolver.enclosingFunction)) {
+        _resolver.reportErrorForNode(CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE,
+            labelNode, [labelNode.name]);
+      }
+      return definingScope.node;
+    }
+  }
+
+  /**
+   * Look up the getter with the given [getterName] in the given [type]. Return
+   * the element representing the getter that was found, or `null` if there is
+   * no getter with the given name. The [target] is the target of the
+   * invocation, or `null` if there is no target.
+   */
+  PropertyAccessorElement _lookUpGetter(
+      Expression target, DartType type, String getterName) {
+    type = _resolveTypeParameter(type);
+    if (type is InterfaceType) {
+      InterfaceType interfaceType = type;
+      PropertyAccessorElement accessor;
+      if (target is SuperExpression) {
+        accessor = interfaceType.lookUpGetterInSuperclass(
+            getterName, _definingLibrary);
+      } else {
+        accessor = interfaceType.lookUpGetter(getterName, _definingLibrary);
+      }
+      if (accessor != null) {
+        return accessor;
+      }
+      return _lookUpGetterInInterfaces(
+          interfaceType, false, getterName, new HashSet<ClassElement>());
+    }
+    return null;
+  }
+
+  /**
+   * Look up the getter with the given [getterName] in the interfaces
+   * implemented by the given [targetType], either directly or indirectly.
+   * Return the element representing the getter that was found, or `null` if
+   * there is no getter with the given name. The flag [includeTargetType] should
+   * be `true` if the search should include the target type. The
+   * [visitedInterfaces] is a set containing all of the interfaces that have
+   * been examined, used to prevent infinite recursion and to optimize the
+   * search.
+   */
+  PropertyAccessorElement _lookUpGetterInInterfaces(InterfaceType targetType,
+      bool includeTargetType, String getterName,
+      HashSet<ClassElement> visitedInterfaces) {
+    // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the
+    // specification (titled "Inheritance and Overriding" under "Interfaces")
+    // describes a much more complex scheme for finding the inherited member.
+    // We need to follow that scheme. The code below should cover the 80% case.
+    ClassElement targetClass = targetType.element;
+    if (visitedInterfaces.contains(targetClass)) {
+      return null;
+    }
+    visitedInterfaces.add(targetClass);
+    if (includeTargetType) {
+      PropertyAccessorElement getter = targetType.getGetter(getterName);
+      if (getter != null && getter.isAccessibleIn(_definingLibrary)) {
+        return getter;
+      }
+    }
+    for (InterfaceType interfaceType in targetType.interfaces) {
+      PropertyAccessorElement getter = _lookUpGetterInInterfaces(
+          interfaceType, true, getterName, visitedInterfaces);
+      if (getter != null) {
+        return getter;
+      }
+    }
+    for (InterfaceType mixinType in targetType.mixins.reversed) {
+      PropertyAccessorElement getter = _lookUpGetterInInterfaces(
+          mixinType, true, getterName, visitedInterfaces);
+      if (getter != null) {
+        return getter;
+      }
+    }
+    InterfaceType superclass = targetType.superclass;
+    if (superclass == null) {
+      return null;
+    }
+    return _lookUpGetterInInterfaces(
+        superclass, true, getterName, visitedInterfaces);
+  }
+
+  /**
+   * Look up the method or getter with the given [memberName] in the given
+   * [type]. Return the element representing the method or getter that was
+   * found, or `null` if there is no method or getter with the given name.
+   */
+  ExecutableElement _lookupGetterOrMethod(DartType type, String memberName) {
+    type = _resolveTypeParameter(type);
+    if (type is InterfaceType) {
+      InterfaceType interfaceType = type;
+      ExecutableElement member =
+          interfaceType.lookUpMethod(memberName, _definingLibrary);
+      if (member != null) {
+        return member;
+      }
+      member = interfaceType.lookUpGetter(memberName, _definingLibrary);
+      if (member != null) {
+        return member;
+      }
+      return _lookUpGetterOrMethodInInterfaces(
+          interfaceType, false, memberName, new HashSet<ClassElement>());
+    }
+    return null;
+  }
+
+  /**
+   * Look up the method or getter with the given [memberName] in the interfaces
+   * implemented by the given [targetType], either directly or indirectly.
+   * Return the element representing the method or getter that was found, or
+   * `null` if there is no method or getter with the given name. The flag
+   * [includeTargetType] should be `true` if the search should include the
+   * target type. The [visitedInterfaces] is a set containing all of the
+   * interfaces that have been examined, used to prevent infinite recursion and
+   * to optimize the search.
+   */
+  ExecutableElement _lookUpGetterOrMethodInInterfaces(InterfaceType targetType,
+      bool includeTargetType, String memberName,
+      HashSet<ClassElement> visitedInterfaces) {
+    // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the
+    // specification (titled "Inheritance and Overriding" under "Interfaces")
+    // describes a much more complex scheme for finding the inherited member.
+    // We need to follow that scheme. The code below should cover the 80% case.
+    ClassElement targetClass = targetType.element;
+    if (visitedInterfaces.contains(targetClass)) {
+      return null;
+    }
+    visitedInterfaces.add(targetClass);
+    if (includeTargetType) {
+      ExecutableElement member = targetType.getMethod(memberName);
+      if (member != null) {
+        return member;
+      }
+      member = targetType.getGetter(memberName);
+      if (member != null) {
+        return member;
+      }
+    }
+    for (InterfaceType interfaceType in targetType.interfaces) {
+      ExecutableElement member = _lookUpGetterOrMethodInInterfaces(
+          interfaceType, true, memberName, visitedInterfaces);
+      if (member != null) {
+        return member;
+      }
+    }
+    for (InterfaceType mixinType in targetType.mixins.reversed) {
+      ExecutableElement member = _lookUpGetterOrMethodInInterfaces(
+          mixinType, true, memberName, visitedInterfaces);
+      if (member != null) {
+        return member;
+      }
+    }
+    InterfaceType superclass = targetType.superclass;
+    if (superclass == null) {
+      return null;
+    }
+    return _lookUpGetterOrMethodInInterfaces(
+        superclass, true, memberName, visitedInterfaces);
+  }
+
+  /**
+   * Look up the method with the given [methodName] in the given [type]. Return
+   * the element representing the method that was found, or `null` if there is
+   * no method with the given name. The [target] is the target of the
+   * invocation, or `null` if there is no target.
+   */
+  MethodElement _lookUpMethod(
+      Expression target, DartType type, String methodName) {
+    type = _resolveTypeParameter(type);
+    if (type is InterfaceType) {
+      InterfaceType interfaceType = type;
+      MethodElement method;
+      if (target is SuperExpression) {
+        method = interfaceType.lookUpMethodInSuperclass(
+            methodName, _definingLibrary);
+      } else {
+        method = interfaceType.lookUpMethod(methodName, _definingLibrary);
+      }
+      if (method != null) {
+        return method;
+      }
+      return _lookUpMethodInInterfaces(
+          interfaceType, false, methodName, new HashSet<ClassElement>());
+    }
+    return null;
+  }
+
+  /**
+   * Look up the method with the given [methodName] in the interfaces
+   * implemented by the given [targetType], either directly or indirectly.
+   * Return the element representing the method that was found, or `null` if
+   * there is no method with the given name. The flag [includeTargetType] should
+   * be `true` if the search should include the target type. The
+   * [visitedInterfaces] is a set containing all of the interfaces that have
+   * been examined, used to prevent infinite recursion and to optimize the
+   * search.
+   */
+  MethodElement _lookUpMethodInInterfaces(InterfaceType targetType,
+      bool includeTargetType, String methodName,
+      HashSet<ClassElement> visitedInterfaces) {
+    // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the
+    // specification (titled "Inheritance and Overriding" under "Interfaces")
+    // describes a much more complex scheme for finding the inherited member.
+    // We need to follow that scheme. The code below should cover the 80% case.
+    ClassElement targetClass = targetType.element;
+    if (visitedInterfaces.contains(targetClass)) {
+      return null;
+    }
+    visitedInterfaces.add(targetClass);
+    if (includeTargetType) {
+      MethodElement method = targetType.getMethod(methodName);
+      if (method != null && method.isAccessibleIn(_definingLibrary)) {
+        return method;
+      }
+    }
+    for (InterfaceType interfaceType in targetType.interfaces) {
+      MethodElement method = _lookUpMethodInInterfaces(
+          interfaceType, true, methodName, visitedInterfaces);
+      if (method != null) {
+        return method;
+      }
+    }
+    for (InterfaceType mixinType in targetType.mixins.reversed) {
+      MethodElement method = _lookUpMethodInInterfaces(
+          mixinType, true, methodName, visitedInterfaces);
+      if (method != null) {
+        return method;
+      }
+    }
+    InterfaceType superclass = targetType.superclass;
+    if (superclass == null) {
+      return null;
+    }
+    return _lookUpMethodInInterfaces(
+        superclass, true, methodName, visitedInterfaces);
+  }
+
+  /**
+   * Look up the setter with the given [setterName] in the given [type]. Return
+   * the element representing the setter that was found, or `null` if there is
+   * no setter with the given name. The [target] is the target of the
+   * invocation, or `null` if there is no target.
+   */
+  PropertyAccessorElement _lookUpSetter(
+      Expression target, DartType type, String setterName) {
+    type = _resolveTypeParameter(type);
+    if (type is InterfaceType) {
+      InterfaceType interfaceType = type;
+      PropertyAccessorElement accessor;
+      if (target is SuperExpression) {
+        accessor = interfaceType.lookUpSetterInSuperclass(
+            setterName, _definingLibrary);
+      } else {
+        accessor = interfaceType.lookUpSetter(setterName, _definingLibrary);
+      }
+      if (accessor != null) {
+        return accessor;
+      }
+      return _lookUpSetterInInterfaces(
+          interfaceType, false, setterName, new HashSet<ClassElement>());
+    }
+    return null;
+  }
+
+  /**
+   * Look up the setter with the given [setterName] in the interfaces
+   * implemented by the given [targetType], either directly or indirectly.
+   * Return the element representing the setter that was found, or `null` if
+   * there is no setter with the given name. The [targetType] is the type in
+   * which the setter might be defined. The flag [includeTargetType] should be
+   * `true` if the search should include the target type. The
+   * [visitedInterfaces] is a set containing all of the interfaces that have
+   * been examined, used to prevent infinite recursion and to optimize the
+   * search.
+   */
+  PropertyAccessorElement _lookUpSetterInInterfaces(InterfaceType targetType,
+      bool includeTargetType, String setterName,
+      HashSet<ClassElement> visitedInterfaces) {
+    // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the
+    // specification (titled "Inheritance and Overriding" under "Interfaces")
+    // describes a much more complex scheme for finding the inherited member.
+    // We need to follow that scheme. The code below should cover the 80% case.
+    ClassElement targetClass = targetType.element;
+    if (visitedInterfaces.contains(targetClass)) {
+      return null;
+    }
+    visitedInterfaces.add(targetClass);
+    if (includeTargetType) {
+      PropertyAccessorElement setter = targetType.getSetter(setterName);
+      if (setter != null && setter.isAccessibleIn(_definingLibrary)) {
+        return setter;
+      }
+    }
+    for (InterfaceType interfaceType in targetType.interfaces) {
+      PropertyAccessorElement setter = _lookUpSetterInInterfaces(
+          interfaceType, true, setterName, visitedInterfaces);
+      if (setter != null) {
+        return setter;
+      }
+    }
+    for (InterfaceType mixinType in targetType.mixins.reversed) {
+      PropertyAccessorElement setter = _lookUpSetterInInterfaces(
+          mixinType, true, setterName, visitedInterfaces);
+      if (setter != null) {
+        return setter;
+      }
+    }
+    InterfaceType superclass = targetType.superclass;
+    if (superclass == null) {
+      return null;
+    }
+    return _lookUpSetterInInterfaces(
+        superclass, true, setterName, visitedInterfaces);
+  }
+
+  /**
+   * Given some class [element], this method uses [_subtypeManager] to find the
+   * set of all subtypes; the subtypes are then searched for a member (method,
+   * getter, or setter), that has the given [memberName]. The flag [asMethod]
+   * should be `true` if the methods should be searched for in the subtypes. The
+   * flag [asAccessor] should be `true` if the accessors (getters and setters)
+   * should be searched for in the subtypes.
+   */
+  bool _memberFoundInSubclass(
+      Element element, String memberName, bool asMethod, bool asAccessor) {
+    if (element is ClassElement) {
+      _subtypeManager.ensureLibraryVisited(_definingLibrary);
+      HashSet<ClassElement> subtypeElements =
+          _subtypeManager.computeAllSubtypes(element);
+      for (ClassElement subtypeElement in subtypeElements) {
+        if (asMethod && subtypeElement.getMethod(memberName) != null) {
+          return true;
+        } else if (asAccessor &&
+            (subtypeElement.getGetter(memberName) != null ||
+                subtypeElement.getSetter(memberName) != null)) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Return the binary operator that is invoked by the given compound assignment
+   * [operator].
+   */
+  sc.TokenType _operatorFromCompoundAssignment(sc.TokenType operator) {
+    while (true) {
+      if (operator == sc.TokenType.AMPERSAND_EQ) {
+        return sc.TokenType.AMPERSAND;
+      } else if (operator == sc.TokenType.BAR_EQ) {
+        return sc.TokenType.BAR;
+      } else if (operator == sc.TokenType.CARET_EQ) {
+        return sc.TokenType.CARET;
+      } else if (operator == sc.TokenType.GT_GT_EQ) {
+        return sc.TokenType.GT_GT;
+      } else if (operator == sc.TokenType.LT_LT_EQ) {
+        return sc.TokenType.LT_LT;
+      } else if (operator == sc.TokenType.MINUS_EQ) {
+        return sc.TokenType.MINUS;
+      } else if (operator == sc.TokenType.PERCENT_EQ) {
+        return sc.TokenType.PERCENT;
+      } else if (operator == sc.TokenType.PLUS_EQ) {
+        return sc.TokenType.PLUS;
+      } else if (operator == sc.TokenType.SLASH_EQ) {
+        return sc.TokenType.SLASH;
+      } else if (operator == sc.TokenType.STAR_EQ) {
+        return sc.TokenType.STAR;
+      } else if (operator == sc.TokenType.TILDE_SLASH_EQ) {
+        return sc.TokenType.TILDE_SLASH;
+      } else {
+        // Internal error: Unmapped assignment operator.
+        AnalysisEngine.instance.logger.logError(
+            "Failed to map ${operator.lexeme} to it's corresponding operator");
+        return operator;
+      }
+      break;
+    }
+  }
+
+  /**
+   * Record that the given [node] is undefined, causing an error to be reported
+   * if appropriate. The [declaringElement] is the element inside which no
+   * declaration was found. If this element is a proxy, no error will be
+   * reported. If null, then an error will always be reported. The [errorCode]
+   * is the error code to report. The [arguments] are the arguments to the error
+   * message.
+   */
+  void _recordUndefinedNode(Element declaringElement, ErrorCode errorCode,
+      AstNode node, List<Object> arguments) {
+    if (_doesntHaveProxy(declaringElement)) {
+      _resolver.reportErrorForNode(errorCode, node, arguments);
+    }
+  }
+
+  /**
+   * Record that the given [offset]/[length] is undefined, causing an error to
+   * be reported if appropriate. The [declaringElement] is the element inside
+   * which no declaration was found. If this element is a proxy, no error will
+   * be reported. If null, then an error will always be reported. The
+   * [errorCode] is the error code to report. The [arguments] are arguments to
+   * the error message.
+   */
+  void _recordUndefinedOffset(Element declaringElement, ErrorCode errorCode,
+      int offset, int length, List<Object> arguments) {
+    if (_doesntHaveProxy(declaringElement)) {
+      _resolver.reportErrorForOffset(errorCode, offset, length, arguments);
+    }
+  }
+
+  /**
+   * Record that the given [token] is undefined, causing an error to be reported
+   * if appropriate. The [declaringElement] is the element inside which no
+   * declaration was found. If this element is a proxy, no error will be
+   * reported. If null, then an error will always be reported. The [errorCode]
+   * is the error code to report. The [arguments] are arguments to the error
+   * message.
+   */
+  void _recordUndefinedToken(Element declaringElement, ErrorCode errorCode,
+      sc.Token token, List<Object> arguments) {
+    if (_doesntHaveProxy(declaringElement)) {
+      _resolver.reportErrorForToken(errorCode, token, arguments);
+    }
+  }
+
+  void _resolveAnnotationConstructorInvocationArguments(
+      Annotation annotation, ConstructorElement constructor) {
+    ArgumentList argumentList = annotation.arguments;
+    // error will be reported in ConstantVerifier
+    if (argumentList == null) {
+      return;
+    }
+    // resolve arguments to parameters
+    List<ParameterElement> parameters =
+        _resolveArgumentsToFunction(true, argumentList, constructor);
+    if (parameters != null) {
+      argumentList.correspondingStaticParameters = parameters;
+    }
+  }
+
+  /**
+   * Continues resolution of the given [annotation].
+   */
+  void _resolveAnnotationElement(Annotation annotation) {
+    SimpleIdentifier nameNode1;
+    SimpleIdentifier nameNode2;
+    {
+      Identifier annName = annotation.name;
+      if (annName is PrefixedIdentifier) {
+        PrefixedIdentifier prefixed = annName;
+        nameNode1 = prefixed.prefix;
+        nameNode2 = prefixed.identifier;
+      } else {
+        nameNode1 = annName as SimpleIdentifier;
+        nameNode2 = null;
+      }
+    }
+    SimpleIdentifier nameNode3 = annotation.constructorName;
+    ConstructorElement constructor = null;
+    //
+    // CONST or Class(args)
+    //
+    if (nameNode1 != null && nameNode2 == null && nameNode3 == null) {
+      Element element1 = nameNode1.staticElement;
+      // CONST
+      if (element1 is PropertyAccessorElement) {
+        _resolveAnnotationElementGetter(annotation, element1);
+        return;
+      }
+      // Class(args)
+      if (element1 is ClassElement) {
+        ClassElement classElement = element1;
+        constructor = new InterfaceTypeImpl(classElement).lookUpConstructor(
+            null, _definingLibrary);
+      }
+    }
+    //
+    // prefix.CONST or prefix.Class() or Class.CONST or Class.constructor(args)
+    //
+    if (nameNode1 != null && nameNode2 != null && nameNode3 == null) {
+      Element element1 = nameNode1.staticElement;
+      Element element2 = nameNode2.staticElement;
+      // Class.CONST - not resolved yet
+      if (element1 is ClassElement) {
+        ClassElement classElement = element1;
+        element2 = classElement.lookUpGetter(nameNode2.name, _definingLibrary);
+      }
+      // prefix.CONST or Class.CONST
+      if (element2 is PropertyAccessorElement) {
+        nameNode2.staticElement = element2;
+        annotation.element = element2;
+        _resolveAnnotationElementGetter(annotation, element2);
+        return;
+      }
+      // prefix.Class()
+      if (element2 is ClassElement) {
+        constructor = element2.unnamedConstructor;
+      }
+      // Class.constructor(args)
+      if (element1 is ClassElement) {
+        ClassElement classElement = element1;
+        constructor = new InterfaceTypeImpl(classElement).lookUpConstructor(
+            nameNode2.name, _definingLibrary);
+        nameNode2.staticElement = constructor;
+      }
+    }
+    //
+    // prefix.Class.CONST or prefix.Class.constructor(args)
+    //
+    if (nameNode1 != null && nameNode2 != null && nameNode3 != null) {
+      Element element2 = nameNode2.staticElement;
+      // element2 should be ClassElement
+      if (element2 is ClassElement) {
+        ClassElement classElement = element2;
+        String name3 = nameNode3.name;
+        // prefix.Class.CONST
+        PropertyAccessorElement getter =
+            classElement.lookUpGetter(name3, _definingLibrary);
+        if (getter != null) {
+          nameNode3.staticElement = getter;
+          annotation.element = element2;
+          _resolveAnnotationElementGetter(annotation, getter);
+          return;
+        }
+        // prefix.Class.constructor(args)
+        constructor = new InterfaceTypeImpl(classElement).lookUpConstructor(
+            name3, _definingLibrary);
+        nameNode3.staticElement = constructor;
+      }
+    }
+    // we need constructor
+    if (constructor == null) {
+      _resolver.reportErrorForNode(
+          CompileTimeErrorCode.INVALID_ANNOTATION, annotation);
+      return;
+    }
+    // record element
+    annotation.element = constructor;
+    // resolve arguments
+    _resolveAnnotationConstructorInvocationArguments(annotation, constructor);
+  }
+
+  void _resolveAnnotationElementGetter(
+      Annotation annotation, PropertyAccessorElement accessorElement) {
+    // accessor should be synthetic
+    if (!accessorElement.isSynthetic) {
+      _resolver.reportErrorForNode(
+          CompileTimeErrorCode.INVALID_ANNOTATION, annotation);
+      return;
+    }
+    // variable should be constant
+    VariableElement variableElement = accessorElement.variable;
+    if (!variableElement.isConst) {
+      _resolver.reportErrorForNode(
+          CompileTimeErrorCode.INVALID_ANNOTATION, annotation);
+    }
+    // OK
+    return;
+  }
+
+  /**
+   * Given an [argumentList] and the [executableElement] that will be invoked
+   * using those argument, compute the list of parameters that correspond to the
+   * list of arguments. An error will be reported if any of the arguments cannot
+   * be matched to a parameter. The flag [reportError] should be `true` if a
+   * compile-time error should be reported; or `false` if a compile-time warning
+   * should be reported. Return the parameters that correspond to the arguments,
+   * or `null` if no correspondence could be computed.
+   */
+  List<ParameterElement> _resolveArgumentsToFunction(bool reportError,
+      ArgumentList argumentList, ExecutableElement executableElement) {
+    if (executableElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters = executableElement.parameters;
+    return _resolveArgumentsToParameters(reportError, argumentList, parameters);
+  }
+
+  /**
+   * Given an [argumentList] and the [parameters] related to the element that
+   * will be invoked using those arguments, compute the list of parameters that
+   * correspond to the list of arguments. An error will be reported if any of
+   * the arguments cannot be matched to a parameter. The flag [reportError]
+   * should be `true` if a compile-time error should be reported; or `false` if
+   * a compile-time warning should be reported. Return the parameters that
+   * correspond to the arguments.
+   */
+  List<ParameterElement> _resolveArgumentsToParameters(bool reportError,
+      ArgumentList argumentList, List<ParameterElement> parameters) {
+    List<ParameterElement> requiredParameters = new List<ParameterElement>();
+    List<ParameterElement> positionalParameters = new List<ParameterElement>();
+    HashMap<String, ParameterElement> namedParameters =
+        new HashMap<String, ParameterElement>();
+    for (ParameterElement parameter in parameters) {
+      ParameterKind kind = parameter.parameterKind;
+      if (kind == ParameterKind.REQUIRED) {
+        requiredParameters.add(parameter);
+      } else if (kind == ParameterKind.POSITIONAL) {
+        positionalParameters.add(parameter);
+      } else {
+        namedParameters[parameter.name] = parameter;
+      }
+    }
+    List<ParameterElement> unnamedParameters =
+        new List<ParameterElement>.from(requiredParameters);
+    unnamedParameters.addAll(positionalParameters);
+    int unnamedParameterCount = unnamedParameters.length;
+    int unnamedIndex = 0;
+    NodeList<Expression> arguments = argumentList.arguments;
+    int argumentCount = arguments.length;
+    List<ParameterElement> resolvedParameters =
+        new List<ParameterElement>(argumentCount);
+    int positionalArgumentCount = 0;
+    HashSet<String> usedNames = new HashSet<String>();
+    bool noBlankArguments = true;
+    for (int i = 0; i < argumentCount; i++) {
+      Expression argument = arguments[i];
+      if (argument is NamedExpression) {
+        SimpleIdentifier nameNode = argument.name.label;
+        String name = nameNode.name;
+        ParameterElement element = namedParameters[name];
+        if (element == null) {
+          ErrorCode errorCode = (reportError
+              ? CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER
+              : StaticWarningCode.UNDEFINED_NAMED_PARAMETER);
+          _resolver.reportErrorForNode(errorCode, nameNode, [name]);
+        } else {
+          resolvedParameters[i] = element;
+          nameNode.staticElement = element;
+        }
+        if (!usedNames.add(name)) {
+          _resolver.reportErrorForNode(
+              CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT, nameNode, [name]);
+        }
+      } else {
+        if (argument is SimpleIdentifier && argument.name.isEmpty) {
+          noBlankArguments = false;
+        }
+        positionalArgumentCount++;
+        if (unnamedIndex < unnamedParameterCount) {
+          resolvedParameters[i] = unnamedParameters[unnamedIndex++];
+        }
+      }
+    }
+    if (positionalArgumentCount < requiredParameters.length &&
+        noBlankArguments) {
+      ErrorCode errorCode = (reportError
+          ? CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS
+          : StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS);
+      _resolver.reportErrorForNode(errorCode, argumentList, [
+        requiredParameters.length,
+        positionalArgumentCount
+      ]);
+    } else if (positionalArgumentCount > unnamedParameterCount &&
+        noBlankArguments) {
+      ErrorCode errorCode = (reportError
+          ? CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS
+          : StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS);
+      _resolver.reportErrorForNode(errorCode, argumentList, [
+        unnamedParameterCount,
+        positionalArgumentCount
+      ]);
+    }
+    return resolvedParameters;
+  }
+
+  void _resolveBinaryExpression(BinaryExpression node, String methodName) {
+    Expression leftOperand = node.leftOperand;
+    if (leftOperand != null) {
+      DartType staticType = _getStaticType(leftOperand);
+      MethodElement staticMethod =
+          _lookUpMethod(leftOperand, staticType, methodName);
+      node.staticElement = staticMethod;
+      DartType propagatedType = _getPropagatedType(leftOperand);
+      MethodElement propagatedMethod =
+          _lookUpMethod(leftOperand, propagatedType, methodName);
+      node.propagatedElement = propagatedMethod;
+      if (_shouldReportMissingMember(staticType, staticMethod)) {
+        if (leftOperand is SuperExpression) {
+          _recordUndefinedToken(staticType.element,
+              StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, node.operator, [
+            methodName,
+            staticType.displayName
+          ]);
+        } else {
+          _recordUndefinedToken(staticType.element,
+              StaticTypeWarningCode.UNDEFINED_OPERATOR, node.operator, [
+            methodName,
+            staticType.displayName
+          ]);
+        }
+      } else if (_enableHints &&
+          _shouldReportMissingMember(propagatedType, propagatedMethod) &&
+          !_memberFoundInSubclass(
+              propagatedType.element, methodName, true, false)) {
+        _recordUndefinedToken(propagatedType.element,
+            HintCode.UNDEFINED_OPERATOR, node.operator, [
+          methodName,
+          propagatedType.displayName
+        ]);
+      }
+    }
+  }
+
+  /**
+   * Resolve the names in the given [combinators] in the scope of the given
+   * [library].
+   */
+  void _resolveCombinators(
+      LibraryElement library, NodeList<Combinator> combinators) {
+    if (library == null) {
+      //
+      // The library will be null if the directive containing the combinators
+      // has a URI that is not valid.
+      //
+      return;
+    }
+    Namespace namespace =
+        new NamespaceBuilder().createExportNamespaceForLibrary(library);
+    for (Combinator combinator in combinators) {
+      NodeList<SimpleIdentifier> names;
+      if (combinator is HideCombinator) {
+        names = combinator.hiddenNames;
+      } else {
+        names = (combinator as ShowCombinator).shownNames;
+      }
+      for (SimpleIdentifier name in names) {
+        String nameStr = name.name;
+        Element element = namespace.get(nameStr);
+        if (element == null) {
+          element = namespace.get("$nameStr=");
+        }
+        if (element != null) {
+          // Ensure that the name always resolves to a top-level variable
+          // rather than a getter or setter
+          if (element is PropertyAccessorElement) {
+            element = (element as PropertyAccessorElement).variable;
+          }
+          name.staticElement = element;
+        }
+      }
+    }
+  }
+
+  /**
+   * Given that we are accessing a property of the given [classElement] with the
+   * given [propertyName], return the element that represents the property.
+   */
+  Element _resolveElement(
+      ClassElementImpl classElement, SimpleIdentifier propertyName) {
+    String name = propertyName.name;
+    Element element = null;
+    if (propertyName.inSetterContext()) {
+      element = classElement.getSetter(name);
+    }
+    if (element == null) {
+      element = classElement.getGetter(name);
+    }
+    if (element == null) {
+      element = classElement.getMethod(name);
+    }
+    if (element != null && element.isAccessibleIn(_definingLibrary)) {
+      return element;
+    }
+    return null;
+  }
+
+  /**
+   * Given an invocation of the form 'm(a1, ..., an)', resolve 'm' to the
+   * element being invoked. If the returned element is a method, then the method
+   * will be invoked. If the returned element is a getter, the getter will be
+   * invoked without arguments and the result of that invocation will then be
+   * invoked with the arguments. The [methodName] is the name of the method
+   * being invoked ('m').
+   */
+  Element _resolveInvokedElement(SimpleIdentifier methodName) {
+    //
+    // Look first in the lexical scope.
+    //
+    Element element = _resolver.nameScope.lookup(methodName, _definingLibrary);
+    if (element == null) {
+      //
+      // If it isn't defined in the lexical scope, and the invocation is within
+      // a class, then look in the inheritance scope.
+      //
+      ClassElement enclosingClass = _resolver.enclosingClass;
+      if (enclosingClass != null) {
+        InterfaceType enclosingType = enclosingClass.type;
+        element = _lookUpMethod(null, enclosingType, methodName.name);
+        if (element == null) {
+          //
+          // If there's no method, then it's possible that 'm' is a getter that
+          // returns a function.
+          //
+          element = _lookUpGetter(null, enclosingType, methodName.name);
+        }
+      }
+    }
+    // TODO(brianwilkerson) Report this error.
+    return element;
+  }
+
+  /**
+   * Given an invocation of the form 'e.m(a1, ..., an)', resolve 'e.m' to the
+   * element being invoked. If the returned element is a method, then the method
+   * will be invoked. If the returned element is a getter, the getter will be
+   * invoked without arguments and the result of that invocation will then be
+   * invoked with the arguments. The [target] is the target of the invocation
+   * ('e'). The [targetType] is the type of the target. The [methodName] is th
+   * name of the method being invoked ('m').  [isConditional] indicates
+   * whether the invocatoin uses a '?.' operator.
+   */
+  Element _resolveInvokedElementWithTarget(Expression target,
+      DartType targetType, SimpleIdentifier methodName, bool isConditional) {
+    if (targetType is InterfaceType) {
+      Element element = _lookUpMethod(target, targetType, methodName.name);
+      if (element == null) {
+        //
+        // If there's no method, then it's possible that 'm' is a getter that
+        // returns a function.
+        //
+        // TODO (collinsn): need to add union type support here too, in the
+        // style of [lookUpMethod].
+        element = _lookUpGetter(target, targetType, methodName.name);
+      }
+      return element;
+    } else if (target is SimpleIdentifier) {
+      Element targetElement = target.staticElement;
+      if (targetElement is PrefixElement) {
+        if (isConditional) {
+          _resolver.reportErrorForNode(
+              CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT,
+              target, [target.name]);
+        }
+        //
+        // Look to see whether the name of the method is really part of a
+        // prefixed identifier for an imported top-level function or top-level
+        // getter that returns a function.
+        //
+        String name = "${target.name}.$methodName";
+        Identifier functionName = new SyntheticIdentifier(name, methodName);
+        Element element =
+            _resolver.nameScope.lookup(functionName, _definingLibrary);
+        if (element != null) {
+          // TODO(brianwilkerson) This isn't a method invocation, it's a
+          // function invocation where the function name is a prefixed
+          // identifier. Consider re-writing the AST.
+          return element;
+        }
+      }
+    }
+    // TODO(brianwilkerson) Report this error.
+    return null;
+  }
+
+  /**
+   * Given that we are accessing a property of the given [targetType] with the
+   * given [propertyName], return the element that represents the property. The
+   * [target] is the target of the invocation ('e').
+   */
+  ExecutableElement _resolveProperty(
+      Expression target, DartType targetType, SimpleIdentifier propertyName) {
+    ExecutableElement memberElement = null;
+    if (propertyName.inSetterContext()) {
+      memberElement = _lookUpSetter(target, targetType, propertyName.name);
+    }
+    if (memberElement == null) {
+      memberElement = _lookUpGetter(target, targetType, propertyName.name);
+    }
+    if (memberElement == null) {
+      memberElement = _lookUpMethod(target, targetType, propertyName.name);
+    }
+    return memberElement;
+  }
+
+  void _resolvePropertyAccess(
+      Expression target, SimpleIdentifier propertyName) {
+    DartType staticType = _getStaticType(target);
+    DartType propagatedType = _getPropagatedType(target);
+    Element staticElement = null;
+    Element propagatedElement = null;
+    //
+    // If this property access is of the form 'C.m' where 'C' is a class,
+    // then we don't call resolveProperty(...) which walks up the class
+    // hierarchy, instead we just look for the member in the type only.  This
+    // does not apply to conditional property accesses (i.e. 'C?.m').
+    //
+    ClassElementImpl typeReference = getTypeReference(target);
+    if (typeReference != null) {
+      // TODO(brianwilkerson) Why are we setting the propagated element here?
+      // It looks wrong.
+      staticElement =
+          propagatedElement = _resolveElement(typeReference, propertyName);
+    } else {
+      staticElement = _resolveProperty(target, staticType, propertyName);
+      propagatedElement =
+          _resolveProperty(target, propagatedType, propertyName);
+    }
+    // May be part of annotation, record property element only if exists.
+    // Error was already reported in validateAnnotationElement().
+    if (target.parent.parent is Annotation) {
+      if (staticElement != null) {
+        propertyName.staticElement = staticElement;
+      }
+      return;
+    }
+    propertyName.staticElement = staticElement;
+    propertyName.propagatedElement = propagatedElement;
+    bool shouldReportMissingMember_static =
+        _shouldReportMissingMember(staticType, staticElement);
+    bool shouldReportMissingMember_propagated =
+        !shouldReportMissingMember_static &&
+            _enableHints &&
+            _shouldReportMissingMember(propagatedType, propagatedElement) &&
+            !_memberFoundInSubclass(
+                propagatedType.element, propertyName.name, false, true);
+    if (shouldReportMissingMember_static ||
+        shouldReportMissingMember_propagated) {
+      DartType staticOrPropagatedType =
+          shouldReportMissingMember_static ? staticType : propagatedType;
+      Element staticOrPropagatedEnclosingElt = staticOrPropagatedType.element;
+      bool isStaticProperty = _isStatic(staticOrPropagatedEnclosingElt);
+      DartType displayType = staticOrPropagatedType != null
+          ? staticOrPropagatedType
+          : propagatedType != null ? propagatedType : staticType;
+      // Special getter cases.
+      if (propertyName.inGetterContext()) {
+        if (!isStaticProperty &&
+            staticOrPropagatedEnclosingElt is ClassElement) {
+          ClassElement classElement = staticOrPropagatedEnclosingElt;
+          InterfaceType targetType = classElement.type;
+          if (!_enableStrictCallChecks &&
+              targetType != null &&
+              targetType.isDartCoreFunction &&
+              propertyName.name == FunctionElement.CALL_METHOD_NAME) {
+            // TODO(brianwilkerson) Can we ever resolve the function being
+            // invoked?
+//            resolveArgumentsToParameters(node.getArgumentList(), invokedFunction);
+            return;
+          } else if (classElement.isEnum && propertyName.name == "_name") {
+            _resolver.reportErrorForNode(
+                CompileTimeErrorCode.ACCESS_PRIVATE_ENUM_FIELD, propertyName,
+                [propertyName.name]);
+            return;
+          }
+        }
+      }
+      Element declaringElement =
+          staticType.isVoid ? null : staticOrPropagatedEnclosingElt;
+      if (propertyName.inSetterContext()) {
+        ErrorCode errorCode;
+        if (shouldReportMissingMember_static) {
+          if (target is SuperExpression) {
+            if (isStaticProperty && !staticType.isVoid) {
+              errorCode = StaticWarningCode.UNDEFINED_SUPER_SETTER;
+            } else {
+              errorCode = StaticTypeWarningCode.UNDEFINED_SUPER_SETTER;
+            }
+          } else {
+            if (isStaticProperty && !staticType.isVoid) {
+              errorCode = StaticWarningCode.UNDEFINED_SETTER;
+            } else {
+              errorCode = StaticTypeWarningCode.UNDEFINED_SETTER;
+            }
+          }
+        } else {
+          errorCode = HintCode.UNDEFINED_SETTER;
+        }
+        _recordUndefinedNode(declaringElement, errorCode, propertyName, [
+          propertyName.name,
+          displayType.displayName
+        ]);
+      } else if (propertyName.inGetterContext()) {
+        ErrorCode errorCode;
+        if (shouldReportMissingMember_static) {
+          if (target is SuperExpression) {
+            if (isStaticProperty && !staticType.isVoid) {
+              errorCode = StaticWarningCode.UNDEFINED_SUPER_GETTER;
+            } else {
+              errorCode = StaticTypeWarningCode.UNDEFINED_SUPER_GETTER;
+            }
+          } else {
+            if (isStaticProperty && !staticType.isVoid) {
+              errorCode = StaticWarningCode.UNDEFINED_GETTER;
+            } else {
+              errorCode = StaticTypeWarningCode.UNDEFINED_GETTER;
+            }
+          }
+        } else {
+          errorCode = HintCode.UNDEFINED_GETTER;
+        }
+        _recordUndefinedNode(declaringElement, errorCode, propertyName, [
+          propertyName.name,
+          displayType.displayName
+        ]);
+      } else {
+        _recordUndefinedNode(declaringElement,
+            StaticWarningCode.UNDEFINED_IDENTIFIER, propertyName,
+            [propertyName.name]);
+      }
+    }
+  }
+
+  /**
+   * Resolve the given simple [identifier] if possible. Return the element to
+   * which it could be resolved, or `null` if it could not be resolved. This
+   * does not record the results of the resolution.
+   */
+  Element _resolveSimpleIdentifier(SimpleIdentifier identifier) {
+    Element element = _resolver.nameScope.lookup(identifier, _definingLibrary);
+    if (element is PropertyAccessorElement && identifier.inSetterContext()) {
+      PropertyInducingElement variable =
+          (element as PropertyAccessorElement).variable;
+      if (variable != null) {
+        PropertyAccessorElement setter = variable.setter;
+        if (setter == null) {
+          //
+          // Check to see whether there might be a locally defined getter and
+          // an inherited setter.
+          //
+          ClassElement enclosingClass = _resolver.enclosingClass;
+          if (enclosingClass != null) {
+            setter = _lookUpSetter(null, enclosingClass.type, identifier.name);
+          }
+        }
+        if (setter != null) {
+          element = setter;
+        }
+      }
+    } else if (element == null &&
+        (identifier.inSetterContext() ||
+            identifier.parent is CommentReference)) {
+      element = _resolver.nameScope.lookup(
+          new SyntheticIdentifier("${identifier.name}=", identifier),
+          _definingLibrary);
+    }
+    ClassElement enclosingClass = _resolver.enclosingClass;
+    if (element == null && enclosingClass != null) {
+      InterfaceType enclosingType = enclosingClass.type;
+      if (element == null &&
+          (identifier.inSetterContext() ||
+              identifier.parent is CommentReference)) {
+        element = _lookUpSetter(null, enclosingType, identifier.name);
+      }
+      if (element == null && identifier.inGetterContext()) {
+        element = _lookUpGetter(null, enclosingType, identifier.name);
+      }
+      if (element == null) {
+        element = _lookUpMethod(null, enclosingType, identifier.name);
+      }
+    }
+    return element;
+  }
+
+  /**
+   * If the given [type] is a type parameter, resolve it to the type that should
+   * be used when looking up members. Otherwise, return the original type.
+   */
+  DartType _resolveTypeParameter(DartType type) {
+    if (type is TypeParameterType) {
+      DartType bound = type.element.bound;
+      if (bound == null) {
+        return _resolver.typeProvider.objectType;
+      }
+      return bound;
+    }
+    return type;
+  }
+
+  /**
+   * Given a [node] that can have annotations associated with it and the
+   * [element] to which that node has been resolved, create the annotations in
+   * the element model representing the annotations on the node.
+   */
+  void _setMetadataForParameter(Element element, NormalFormalParameter node) {
+    if (element is! ElementImpl) {
+      return;
+    }
+    List<ElementAnnotationImpl> annotationList =
+        new List<ElementAnnotationImpl>();
+    _addAnnotations(annotationList, node.metadata);
+    if (!annotationList.isEmpty) {
+      (element as ElementImpl).metadata = annotationList;
+    }
+  }
+
+  /**
+   * Return `true` if we should report an error as a result of looking up a
+   * [member] in the given [type] and not finding any member.
+   */
+  bool _shouldReportMissingMember(DartType type, Element member) {
+    if (member != null || type == null || type.isDynamic || type.isBottom) {
+      return false;
+    }
+    return true;
+  }
+
+  /**
+   * Checks whether the given [expression] is a reference to a class. If it is
+   * then the element representing the class is returned, otherwise `null` is
+   * returned.
+   */
+  static ClassElementImpl getTypeReference(Expression expression) {
+    if (expression is Identifier) {
+      Element staticElement = expression.staticElement;
+      if (staticElement is ClassElementImpl) {
+        return staticElement;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Given a [node] that can have annotations associated with it and the
+   * [element] to which that node has been resolved, create the annotations in
+   * the element model representing the annotations on the node.
+   */
+  static void setMetadata(Element element, AnnotatedNode node) {
+    if (element is! ElementImpl) {
+      return;
+    }
+    List<ElementAnnotationImpl> annotationList = <ElementAnnotationImpl>[];
+    _addAnnotations(annotationList, node.metadata);
+    if (node is VariableDeclaration && node.parent is VariableDeclarationList) {
+      VariableDeclarationList list = node.parent as VariableDeclarationList;
+      _addAnnotations(annotationList, list.metadata);
+      if (list.parent is FieldDeclaration) {
+        FieldDeclaration fieldDeclaration = list.parent as FieldDeclaration;
+        _addAnnotations(annotationList, fieldDeclaration.metadata);
+      } else if (list.parent is TopLevelVariableDeclaration) {
+        TopLevelVariableDeclaration variableDeclaration =
+            list.parent as TopLevelVariableDeclaration;
+        _addAnnotations(annotationList, variableDeclaration.metadata);
+      }
+    }
+    if (!annotationList.isEmpty) {
+      (element as ElementImpl).metadata = annotationList;
+    }
+  }
+
+  /**
+   * Generate annotation elements for each of the annotations in the
+   * [annotationList] and add them to the given list of [annotations].
+   */
+  static void _addAnnotations(List<ElementAnnotationImpl> annotationList,
+      NodeList<Annotation> annotations) {
+    int annotationCount = annotations.length;
+    for (int i = 0; i < annotationCount; i++) {
+      Annotation annotation = annotations[i];
+      Element resolvedElement = annotation.element;
+      if (resolvedElement != null) {
+        ElementAnnotationImpl elementAnnotation =
+            new ElementAnnotationImpl(resolvedElement);
+        annotation.elementAnnotation = elementAnnotation;
+        annotationList.add(elementAnnotation);
+      }
+    }
+  }
+
+  /**
+   * Return `true` if the given [identifier] is the return type of a constructor
+   * declaration.
+   */
+  static bool _isConstructorReturnType(SimpleIdentifier identifier) {
+    AstNode parent = identifier.parent;
+    if (parent is ConstructorDeclaration) {
+      return identical(parent.returnType, identifier);
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given [identifier] is the return type of a factory
+   * constructor.
+   */
+  static bool _isFactoryConstructorReturnType(SimpleIdentifier identifier) {
+    AstNode parent = identifier.parent;
+    if (parent is ConstructorDeclaration) {
+      ConstructorDeclaration constructor = parent;
+      return identical(constructor.returnType, identifier) &&
+          constructor.factoryKeyword != null;
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given 'super' [expression] is used in a valid context.
+   */
+  static bool _isSuperInValidContext(SuperExpression expression) {
+    for (AstNode node = expression; node != null; node = node.parent) {
+      if (node is CompilationUnit) {
+        return false;
+      }
+      if (node is ConstructorDeclaration) {
+        return node.factoryKeyword == null;
+      }
+      if (node is ConstructorFieldInitializer) {
+        return false;
+      }
+      if (node is MethodDeclaration) {
+        return !node.isStatic;
+      }
+    }
+    return false;
+  }
+}
+
+/**
+ * An identifier that can be used to look up names in the lexical scope when
+ * there is no identifier in the AST structure. There is no identifier in the
+ * AST when the parser could not distinguish between a method invocation and an
+ * invocation of a top-level function imported with a prefix.
+ */
+class SyntheticIdentifier extends Identifier {
+  /**
+   * The name of the synthetic identifier.
+   */
+  final String name;
+
+  /**
+   * The identifier to be highlighted in case of an error
+   */
+  final Identifier targetIdentifier;
+
+  /**
+   * Initialize a newly created synthetic identifier to have the given [name]
+   * and [targetIdentifier].
+   */
+  SyntheticIdentifier(this.name, this.targetIdentifier);
+
+  @override
+  sc.Token get beginToken => null;
+
+  @override
+  Element get bestElement => null;
+
+  @override
+  Iterable get childEntities {
+    // Should never be called, since a SyntheticIdentifier never appears in the
+    // AST--it is just used for lookup.
+    assert(false);
+    return new ChildEntities();
+  }
+
+  @override
+  sc.Token get endToken => null;
+
+  @override
+  int get length => targetIdentifier.length;
+
+  @override
+  int get offset => targetIdentifier.offset;
+
+  @override
+  int get precedence => 16;
+
+  @override
+  Element get propagatedElement => null;
+
+  @override
+  Element get staticElement => null;
+
+  @override
+  accept(AstVisitor visitor) => null;
+
+  @override
+  void visitChildren(AstVisitor visitor) {}
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/engine.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/engine.dart
new file mode 100644
index 0000000..0e8f9c8
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/engine.dart
@@ -0,0 +1,12026 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine;
+
+import 'dart:async';
+import 'dart:collection';
+import 'dart:math' as math;
+
+import 'package:analyzer/src/cancelable_future.dart';
+import 'package:analyzer/src/context/cache.dart' as cache;
+import 'package:analyzer/src/context/context.dart' as newContext;
+import 'package:analyzer/src/generated/incremental_resolution_validator.dart';
+import 'package:analyzer/src/plugin/command_line_plugin.dart';
+import 'package:analyzer/src/plugin/engine_plugin.dart';
+import 'package:analyzer/src/plugin/options_plugin.dart';
+import 'package:analyzer/src/services/lint.dart';
+import 'package:analyzer/src/task/manager.dart';
+import 'package:analyzer/task/dart.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:html/dom.dart' show Document;
+import 'package:plugin/manager.dart';
+import 'package:plugin/plugin.dart';
+
+import '../../instrumentation/instrumentation.dart';
+import 'ast.dart';
+import 'constant.dart';
+import 'element.dart';
+import 'error.dart';
+import 'error_verifier.dart';
+import 'html.dart' as ht;
+import 'incremental_resolver.dart'
+    show IncrementalResolver, PoorMansIncrementalResolver;
+import 'incremental_scanner.dart';
+import 'java_core.dart';
+import 'java_engine.dart';
+import 'parser.dart' show Parser, IncrementalParser;
+import 'resolver.dart';
+import 'scanner.dart';
+import 'sdk.dart' show DartSdk;
+import 'source.dart';
+import 'utilities_collection.dart';
+import 'utilities_general.dart';
+
+/**
+ * Used by [AnalysisOptions] to allow function bodies to be analyzed in some
+ * sources but not others.
+ */
+typedef bool AnalyzeFunctionBodiesPredicate(Source source);
+
+/**
+ * Type of callback functions used by PendingFuture.  Functions of this type
+ * should perform a computation based on the data in [sourceEntry] and return
+ * it.  If the computation can't be performed yet because more analysis is
+ * needed, null should be returned.
+ *
+ * The function may also throw an exception, in which case the corresponding
+ * future will be completed with failure.
+ *
+ * Since this function is called while the state of analysis is being updated,
+ * it should be free of side effects so that it doesn't cause reentrant
+ * changes to the analysis state.
+ */
+typedef T PendingFutureComputer<T>(SourceEntry sourceEntry);
+
+/**
+ * An LRU cache of information related to analysis.
+ */
+class AnalysisCache {
+  /**
+   * A flag used to control whether trace information should be produced when
+   * the content of the cache is modified.
+   */
+  static bool _TRACE_CHANGES = false;
+
+  /**
+   * A list containing the partitions of which this cache is comprised.
+   */
+  final List<CachePartition> _partitions;
+
+  /**
+   * Initialize a newly created cache to have the given [_partitions]. The
+   * partitions will be searched in the order in which they appear in the list,
+   * so the most specific partition (usually an [SdkCachePartition]) should be
+   * first and the most general (usually a [UniversalCachePartition]) last.
+   */
+  AnalysisCache(this._partitions);
+
+  /**
+   * Return the number of entries in this cache that have an AST associated with
+   * them.
+   */
+  int get astSize => _partitions[_partitions.length - 1].astSize;
+
+  /**
+   * Return information about each of the partitions in this cache.
+   */
+  List<AnalysisContextStatistics_PartitionData> get partitionData {
+    int count = _partitions.length;
+    List<AnalysisContextStatistics_PartitionData> data =
+        new List<AnalysisContextStatistics_PartitionData>(count);
+    for (int i = 0; i < count; i++) {
+      CachePartition partition = _partitions[i];
+      data[i] = new AnalysisContextStatisticsImpl_PartitionDataImpl(
+          partition.astSize, partition.map.length);
+    }
+    return data;
+  }
+
+  /**
+   * Record that the AST associated with the given [source] was just read from
+   * the cache.
+   */
+  void accessedAst(Source source) {
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      if (_partitions[i].contains(source)) {
+        _partitions[i].accessedAst(source);
+        return;
+      }
+    }
+  }
+
+  /**
+   * Return the entry associated with the given [source].
+   */
+  SourceEntry get(Source source) {
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      if (_partitions[i].contains(source)) {
+        return _partitions[i].get(source);
+      }
+    }
+    //
+    // We should never get to this point because the last partition should
+    // always be a universal partition, except in the case of the SDK context,
+    // in which case the source should always be part of the SDK.
+    //
+    return null;
+  }
+
+  /**
+   * Return context that owns the given [source].
+   */
+  InternalAnalysisContext getContextFor(Source source) {
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      if (_partitions[i].contains(source)) {
+        return _partitions[i].context;
+      }
+    }
+    //
+    // We should never get to this point because the last partition should
+    // always be a universal partition, except in the case of the SDK context,
+    // in which case the source should always be part of the SDK.
+    //
+    AnalysisEngine.instance.logger.logInformation(
+        "Could not find context for ${source.fullName}",
+        new CaughtException(new AnalysisException(), null));
+    return null;
+  }
+
+  /**
+   * Return an iterator returning all of the map entries mapping sources to
+   * cache entries.
+   */
+  MapIterator<Source, SourceEntry> iterator() {
+    int count = _partitions.length;
+    List<Map<Source, SourceEntry>> maps =
+        new List<Map<Source, SourceEntry>>(count);
+    for (int i = 0; i < count; i++) {
+      maps[i] = _partitions[i].map;
+    }
+    return new MultipleMapIterator<Source, SourceEntry>(maps);
+  }
+
+  /**
+   * Associate the given [entry] with the given [source].
+   */
+  void put(Source source, SourceEntry entry) {
+    entry.fixExceptionState();
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      if (_partitions[i].contains(source)) {
+        if (_TRACE_CHANGES) {
+          try {
+            SourceEntry oldEntry = _partitions[i].get(source);
+            if (oldEntry == null) {
+              AnalysisEngine.instance.logger.logInformation(
+                  "Added a cache entry for '${source.fullName}'.");
+            } else {
+              AnalysisEngine.instance.logger.logInformation(
+                  "Modified the cache entry for ${source.fullName}'. Diff = ${entry.getDiff(oldEntry)}");
+            }
+          } catch (exception) {
+            // Ignored
+            JavaSystem.currentTimeMillis();
+          }
+        }
+        _partitions[i].put(source, entry);
+        return;
+      }
+    }
+  }
+
+  /**
+   * Remove all information related to the given [source] from this cache.
+   * Return the entry associated with the source, or `null` if there was cache
+   * entry for the source.
+   */
+  SourceEntry remove(Source source) {
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      if (_partitions[i].contains(source)) {
+        if (_TRACE_CHANGES) {
+          try {
+            AnalysisEngine.instance.logger.logInformation(
+                "Removed the cache entry for ${source.fullName}'.");
+          } catch (exception) {
+            // Ignored
+            JavaSystem.currentTimeMillis();
+          }
+        }
+        return _partitions[i].remove(source);
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Record that the AST associated with the given [source] was just removed
+   * from the cache.
+   */
+  void removedAst(Source source) {
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      if (_partitions[i].contains(source)) {
+        _partitions[i].removedAst(source);
+        return;
+      }
+    }
+  }
+
+  /**
+   * Return the number of sources that are mapped to cache entries.
+   */
+  int size() {
+    int size = 0;
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      size += _partitions[i].size();
+    }
+    return size;
+  }
+
+  /**
+   * Record that the AST associated with the given [source] was just stored to
+   * the cache.
+   */
+  void storedAst(Source source) {
+    int count = _partitions.length;
+    for (int i = 0; i < count; i++) {
+      if (_partitions[i].contains(source)) {
+        _partitions[i].storedAst(source);
+        return;
+      }
+    }
+  }
+}
+
+/**
+ * A context in which a single analysis can be performed and incrementally
+ * maintained. The context includes such information as the version of the SDK
+ * being analyzed against as well as the package-root used to resolve 'package:'
+ * URI's. (Both of which are known indirectly through the [SourceFactory].)
+ *
+ * An analysis context also represents the state of the analysis, which includes
+ * knowing which sources have been included in the analysis (either directly or
+ * indirectly) and the results of the analysis. Sources must be added and
+ * removed from the context using the method [applyChanges], which is also used
+ * to notify the context when sources have been modified and, consequently,
+ * previously known results might have been invalidated.
+ *
+ * There are two ways to access the results of the analysis. The most common is
+ * to use one of the 'get' methods to access the results. The 'get' methods have
+ * the advantage that they will always return quickly, but have the disadvantage
+ * that if the results are not currently available they will return either
+ * nothing or in some cases an incomplete result. The second way to access
+ * results is by using one of the 'compute' methods. The 'compute' methods will
+ * always attempt to compute the requested results but might block the caller
+ * for a significant period of time.
+ *
+ * When results have been invalidated, have never been computed (as is the case
+ * for newly added sources), or have been removed from the cache, they are
+ * <b>not</b> automatically recreated. They will only be recreated if one of the
+ * 'compute' methods is invoked.
+ *
+ * However, this is not always acceptable. Some clients need to keep the
+ * analysis results up-to-date. For such clients there is a mechanism that
+ * allows them to incrementally perform needed analysis and get notified of the
+ * consequent changes to the analysis results. This mechanism is realized by the
+ * method [performAnalysisTask].
+ *
+ * Analysis engine allows for having more than one context. This can be used,
+ * for example, to perform one analysis based on the state of files on disk and
+ * a separate analysis based on the state of those files in open editors. It can
+ * also be used to perform an analysis based on a proposed future state, such as
+ * the state after a refactoring.
+ */
+abstract class AnalysisContext {
+  /**
+   * An empty list of contexts.
+   */
+  static const List<AnalysisContext> EMPTY_LIST = const <AnalysisContext>[];
+
+  /**
+   * Return the set of analysis options controlling the behavior of this
+   * context. Clients should not modify the returned set of options. The options
+   * should only be set by invoking the method [setAnalysisOptions].
+   */
+  AnalysisOptions get analysisOptions;
+
+  /**
+   * Set the set of analysis options controlling the behavior of this context to
+   * the given [options]. Clients can safely assume that all necessary analysis
+   * results have been invalidated.
+   */
+  void set analysisOptions(AnalysisOptions options);
+
+  /**
+   * Set the order in which sources will be analyzed by [performAnalysisTask] to
+   * match the order of the sources in the given list of [sources]. If a source
+   * that needs to be analyzed is not contained in the list, then it will be
+   * treated as if it were at the end of the list. If the list is empty (or
+   * `null`) then no sources will be given priority over other sources.
+   *
+   * Changes made to the list after this method returns will <b>not</b> be
+   * reflected in the priority order.
+   */
+  void set analysisPriorityOrder(List<Source> sources);
+
+  /**
+   * Return the set of declared variables used when computing constant values.
+   */
+  DeclaredVariables get declaredVariables;
+
+  /**
+   * Return a list containing all of the sources known to this context that
+   * represent HTML files. The contents of the list can be incomplete.
+   */
+  List<Source> get htmlSources;
+
+  /**
+   * The stream that is notified when a source either starts or stops being
+   * analyzed implicitly.
+   */
+  Stream<ImplicitAnalysisEvent> get implicitAnalysisEvents;
+
+  /**
+   * Returns `true` if this context was disposed using [dispose].
+   */
+  bool get isDisposed;
+
+  /**
+   * Return a list containing all of the sources known to this context that
+   * represent the defining compilation unit of a library that can be run within
+   * a browser. The sources that are returned represent libraries that have a
+   * 'main' method and are either referenced by an HTML file or import, directly
+   * or indirectly, a client-only library. The contents of the list can be
+   * incomplete.
+   */
+  List<Source> get launchableClientLibrarySources;
+
+  /**
+   * Return a list containing all of the sources known to this context that
+   * represent the defining compilation unit of a library that can be run
+   * outside of a browser. The contents of the list can be incomplete.
+   */
+  List<Source> get launchableServerLibrarySources;
+
+  /**
+   * Return a list containing all of the sources known to this context that
+   * represent the defining compilation unit of a library. The contents of the
+   * list can be incomplete.
+   */
+  List<Source> get librarySources;
+
+  /**
+   * Return a client-provided name used to identify this context, or `null` if
+   * the client has not provided a name.
+   */
+  String get name;
+
+  /**
+   * Set the client-provided name used to identify this context to the given
+   * [name].
+   */
+  set name(String name);
+
+  /**
+   * The stream that is notified when sources have been added or removed,
+   * or the source's content has changed.
+   */
+  Stream<SourcesChangedEvent> get onSourcesChanged;
+
+  /**
+   * Return the source factory used to create the sources that can be analyzed
+   * in this context.
+   */
+  SourceFactory get sourceFactory;
+
+  /**
+   * Set the source factory used to create the sources that can be analyzed in
+   * this context to the given source [factory]. Clients can safely assume that
+   * all analysis results have been invalidated.
+   */
+  void set sourceFactory(SourceFactory factory);
+
+  /**
+   * Return a list containing all of the sources known to this context.
+   */
+  List<Source> get sources;
+
+  /**
+   * Return a type provider for this context or throw [AnalysisException] if
+   * either `dart:core` or `dart:async` cannot be resolved.
+   */
+  TypeProvider get typeProvider;
+
+  /**
+   * Add the given [listener] to the list of objects that are to be notified
+   * when various analysis results are produced in this context.
+   */
+  void addListener(AnalysisListener listener);
+
+  /**
+   * Apply the given [delta] to change the level of analysis that will be
+   * performed for the sources known to this context.
+   */
+  void applyAnalysisDelta(AnalysisDelta delta);
+
+  /**
+   * Apply the changes specified by the given [changeSet] to this context. Any
+   * analysis results that have been invalidated by these changes will be
+   * removed.
+   */
+  void applyChanges(ChangeSet changeSet);
+
+  /**
+   * Return the documentation comment for the given [element] as it appears in
+   * the original source (complete with the beginning and ending delimiters) for
+   * block documentation comments, or lines starting with `"///"` and separated
+   * with `"\n"` characters for end-of-line documentation comments, or `null` if
+   * the element does not have a documentation comment associated with it. This
+   * can be a long-running operation if the information needed to access the
+   * comment is not cached.
+   *
+   * Throws an [AnalysisException] if the documentation comment could not be
+   * determined because the analysis could not be performed.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  String computeDocumentationComment(Element element);
+
+  /**
+   * Return a list containing all of the errors associated with the given
+   * [source]. If the errors are not already known then the source will be
+   * analyzed in order to determine the errors associated with it.
+   *
+   * Throws an [AnalysisException] if the errors could not be determined because
+   * the analysis could not be performed.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   *
+   * See [getErrors].
+   */
+  List<AnalysisError> computeErrors(Source source);
+
+  /**
+   * Return the element model corresponding to the HTML file defined by the
+   * given [source]. If the element model does not yet exist it will be created.
+   * The process of creating an element model for an HTML file can be
+   * long-running, depending on the size of the file and the number of libraries
+   * that are defined in it (via script tags) that also need to have a model
+   * built for them.
+   *
+   * Throws AnalysisException if the element model could not be determined
+   * because the analysis could not be performed.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   *
+   * See [getHtmlElement].
+   */
+  @deprecated
+  HtmlElement computeHtmlElement(Source source);
+
+  /**
+   * Return the kind of the given [source], computing it's kind if it is not
+   * already known. Return [SourceKind.UNKNOWN] if the source is not contained
+   * in this context.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   *
+   * See [getKindOf].
+   */
+  SourceKind computeKindOf(Source source);
+
+  /**
+   * Return the element model corresponding to the library defined by the given
+   * [source]. If the element model does not yet exist it will be created. The
+   * process of creating an element model for a library can long-running,
+   * depending on the size of the library and the number of libraries that are
+   * imported into it that also need to have a model built for them.
+   *
+   * Throws an [AnalysisException] if the element model could not be determined
+   * because the analysis could not be performed.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   *
+   * See [getLibraryElement].
+   */
+  LibraryElement computeLibraryElement(Source source);
+
+  /**
+   * Return the line information for the given [source], or `null` if the source
+   * is not of a recognized kind (neither a Dart nor HTML file). If the line
+   * information was not previously known it will be created. The line
+   * information is used to map offsets from the beginning of the source to line
+   * and column pairs.
+   *
+   * Throws an [AnalysisException] if the line information could not be
+   * determined because the analysis could not be performed.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   *
+   * See [getLineInfo].
+   */
+  LineInfo computeLineInfo(Source source);
+
+  /**
+   * Return a future which will be completed with the fully resolved AST for a
+   * single compilation unit within the given library, once that AST is up to
+   * date.
+   *
+   * If the resolved AST can't be computed for some reason, the future will be
+   * completed with an error.  One possible error is AnalysisNotScheduledError,
+   * which means that the resolved AST can't be computed because the given
+   * source file is not scheduled to be analyzed within the context of the
+   * given library.
+   */
+  CancelableFuture<CompilationUnit> computeResolvedCompilationUnitAsync(
+      Source source, Source librarySource);
+
+  /**
+   * Perform work until the given [result] has been computed for the given
+   * [target]. Return the computed value.
+   */
+  Object /*V*/ computeResult(AnalysisTarget target, ResultDescriptor /*<V>*/ result);
+
+  /**
+   * Notifies the context that the client is going to stop using this context.
+   */
+  void dispose();
+
+  /**
+   * Return `true` if the given [source] exists.
+   *
+   * This method should be used rather than the method [Source.exists] because
+   * contexts can have local overrides of the content of a source that the
+   * source is not aware of and a source with local content is considered to
+   * exist even if there is no file on disk.
+   */
+  bool exists(Source source);
+
+  /**
+   * Return the element model corresponding to the compilation unit defined by
+   * the given [unitSource] in the library defined by the given [librarySource],
+   * or `null` if the element model does not currently exist or if the library
+   * cannot be analyzed for some reason.
+   */
+  CompilationUnitElement getCompilationUnitElement(
+      Source unitSource, Source librarySource);
+
+  /**
+   * Return the contents and timestamp of the given [source].
+   *
+   * This method should be used rather than the method [Source.getContents]
+   * because contexts can have local overrides of the content of a source that
+   * the source is not aware of.
+   */
+  TimestampedData<String> getContents(Source source);
+
+  /**
+   * Return the element referenced by the given [location], or `null` if the
+   * element is not immediately available or if there is no element with the
+   * given location. The latter condition can occur, for example, if the
+   * location describes an element from a different context or if the element
+   * has been removed from this context as a result of some change since it was
+   * originally obtained.
+   */
+  Element getElement(ElementLocation location);
+
+  /**
+   * Return an analysis error info containing the list of all of the errors and
+   * the line info associated with the given [source]. The list of errors will
+   * be empty if the source is not known to this context or if there are no
+   * errors in the source. The errors contained in the list can be incomplete.
+   *
+   * See [computeErrors].
+   */
+  AnalysisErrorInfo getErrors(Source source);
+
+  /**
+   * Return the element model corresponding to the HTML file defined by the
+   * given [source], or `null` if the source does not represent an HTML file,
+   * the element representing the file has not yet been created, or the analysis
+   * of the HTML file failed for some reason.
+   *
+   * See [computeHtmlElement].
+   */
+  @deprecated
+  HtmlElement getHtmlElement(Source source);
+
+  /**
+   * Return the sources for the HTML files that reference the compilation unit
+   * with the given [source]. If the source does not represent a Dart source or
+   * is not known to this context, the returned list will be empty. The contents
+   * of the list can be incomplete.
+   */
+  List<Source> getHtmlFilesReferencing(Source source);
+
+  /**
+   * Return the kind of the given [source], or `null` if the kind is not known
+   * to this context.
+   *
+   * See [computeKindOf].
+   */
+  SourceKind getKindOf(Source source);
+
+  /**
+   * Return the sources for the defining compilation units of any libraries of
+   * which the given [source] is a part. The list will normally contain a single
+   * library because most Dart sources are only included in a single library,
+   * but it is possible to have a part that is contained in multiple identically
+   * named libraries. If the source represents the defining compilation unit of
+   * a library, then the returned list will contain the given source as its only
+   * element. If the source does not represent a Dart source or is not known to
+   * this context, the returned list will be empty. The contents of the list can
+   * be incomplete.
+   */
+  List<Source> getLibrariesContaining(Source source);
+
+  /**
+   * Return the sources for the defining compilation units of any libraries that
+   * depend on the library defined by the given [librarySource]. One library
+   * depends on another if it either imports or exports that library.
+   */
+  List<Source> getLibrariesDependingOn(Source librarySource);
+
+  /**
+   * Return the sources for the defining compilation units of any libraries that
+   * are referenced from the HTML file defined by the given [htmlSource].
+   */
+  List<Source> getLibrariesReferencedFromHtml(Source htmlSource);
+
+  /**
+   * Return the element model corresponding to the library defined by the given
+   * [source], or `null` if the element model does not currently exist or if the
+   * library cannot be analyzed for some reason.
+   */
+  LibraryElement getLibraryElement(Source source);
+
+  /**
+   * Return the line information for the given [source], or `null` if the line
+   * information is not known. The line information is used to map offsets from
+   * the beginning of the source to line and column pairs.
+   *
+   * See [computeLineInfo].
+   */
+  LineInfo getLineInfo(Source source);
+
+  /**
+   * Return the modification stamp for the [source], or a negative value if the
+   * source does not exist. A modification stamp is a non-negative integer with
+   * the property that if the contents of the source have not been modified
+   * since the last time the modification stamp was accessed then the same value
+   * will be returned, but if the contents of the source have been modified one
+   * or more times (even if the net change is zero) the stamps will be different.
+   *
+   * This method should be used rather than the method
+   * [Source.getModificationStamp] because contexts can have local overrides of
+   * the content of a source that the source is not aware of.
+   */
+  int getModificationStamp(Source source);
+
+  /**
+   * Return a fully resolved AST for the compilation unit defined by the given
+   * [unitSource] within the given [library], or `null` if the resolved AST is
+   * not already computed.
+   *
+   * See [resolveCompilationUnit].
+   */
+  CompilationUnit getResolvedCompilationUnit(
+      Source unitSource, LibraryElement library);
+
+  /**
+   * Return a fully resolved AST for the compilation unit defined by the given
+   * [unitSource] within the library defined by the given [librarySource], or
+   * `null` if the resolved AST is not already computed.
+   *
+   * See [resolveCompilationUnit2].
+   */
+  CompilationUnit getResolvedCompilationUnit2(
+      Source unitSource, Source librarySource);
+
+  /**
+   * Return the fully resolved HTML unit defined by the given [htmlSource], or
+   * `null` if the resolved unit is not already computed.
+   *
+   * See [resolveHtmlUnit].
+   */
+  @deprecated
+  ht.HtmlUnit getResolvedHtmlUnit(Source htmlSource);
+
+  /**
+   * Return the value of the given [result] for the given [target].
+   *
+   * If the corresponding [target] does not exist, or the [result] is not
+   * computed yet, then the default value is returned.
+   */
+  Object /*V*/ getResult(AnalysisTarget target, ResultDescriptor /*<V>*/ result);
+
+  /**
+   * Return a list of the sources being analyzed in this context whose full path
+   * is equal to the given [path].
+   */
+  List<Source> getSourcesWithFullName(String path);
+
+  /**
+   * Invalidates hints in the given [librarySource] and included parts.
+   */
+  void invalidateLibraryHints(Source librarySource);
+
+  /**
+   * Return `true` if the given [librarySource] is known to be the defining
+   * compilation unit of a library that can be run on a client (references
+   * 'dart:html', either directly or indirectly).
+   *
+   * <b>Note:</b> In addition to the expected case of returning `false` if the
+   * source is known to be a library that cannot be run on a client, this method
+   * will also return `false` if the source is not known to be a library or if
+   * we do not know whether it can be run on a client.
+   */
+  bool isClientLibrary(Source librarySource);
+
+  /**
+   * Return `true` if the given [librarySource] is known to be the defining
+   * compilation unit of a library that can be run on the server (does not
+   * reference 'dart:html', either directly or indirectly).
+   *
+   * <b>Note:</b> In addition to the expected case of returning `false` if the
+   * source is known to be a library that cannot be run on the server, this
+   * method will also return `false` if the source is not known to be a library
+   * or if we do not know whether it can be run on the server.
+   */
+  bool isServerLibrary(Source librarySource);
+
+  /**
+   * Return the stream that is notified when a new value for the given
+   * [descriptor] is computed.
+   */
+  Stream<ComputedResult> onResultComputed(ResultDescriptor descriptor);
+
+  /**
+   * Parse the content of the given [source] to produce an AST structure. The
+   * resulting AST structure may or may not be resolved, and may have a slightly
+   * different structure depending upon whether it is resolved.
+   *
+   * Throws an [AnalysisException] if the analysis could not be performed
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  CompilationUnit parseCompilationUnit(Source source);
+
+  /**
+   * Parse a single HTML [source] to produce a document model.
+   *
+   * Throws an [AnalysisException] if the analysis could not be performed
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  Document parseHtmlDocument(Source source);
+
+  /**
+   * Parse a single HTML [source] to produce an AST structure. The resulting
+   * HTML AST structure may or may not be resolved, and may have a slightly
+   * different structure depending upon whether it is resolved.
+   *
+   * Throws an [AnalysisException] if the analysis could not be performed
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  @deprecated // use parseHtmlDocument(source)
+  ht.HtmlUnit parseHtmlUnit(Source source);
+
+  /**
+   * Perform the next unit of work required to keep the analysis results
+   * up-to-date and return information about the consequent changes to the
+   * analysis results. This method can be long running.
+   *
+   * The implementation that uses the task model notifies subscribers of
+   * [onResultComputed] about computed results.
+   *
+   * The following results are computed for Dart sources.
+   *
+   * 1. For explicit and implicit sources:
+   *    [PARSED_UNIT]
+   *    [RESOLVED_UNIT]
+   *
+   * 2. For explicit sources:
+   *    [DART_ERRORS].
+   *
+   * 3. For explicit and implicit library sources:
+   *    [LIBRARY_ELEMENT].
+   */
+  AnalysisResult performAnalysisTask();
+
+  /**
+   * Remove the given [listener] from the list of objects that are to be
+   * notified when various analysis results are produced in this context.
+   */
+  void removeListener(AnalysisListener listener);
+
+  /**
+   * Return a fully resolved AST for the compilation unit defined by the given
+   * [unitSource] within the given [library].
+   *
+   * Throws an [AnalysisException] if the analysis could not be performed.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   *
+   * See [getResolvedCompilationUnit].
+   */
+  CompilationUnit resolveCompilationUnit(
+      Source unitSource, LibraryElement library);
+
+  /**
+   * Return a fully resolved AST for the compilation unit defined by the given
+   * [unitSource] within the library defined by the given [librarySource].
+   *
+   * Throws an [AnalysisException] if the analysis could not be performed.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   *
+   * See [getResolvedCompilationUnit2].
+   */
+  CompilationUnit resolveCompilationUnit2(
+      Source unitSource, Source librarySource);
+
+  /**
+   * Parse and resolve a single [htmlSource] within the given context to produce
+   * a fully resolved AST.
+   *
+   * Throws an [AnalysisException] if the analysis could not be performed.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  @deprecated
+  ht.HtmlUnit resolveHtmlUnit(Source htmlSource);
+
+  /**
+   * Set the contents of the given [source] to the given [contents] and mark the
+   * source as having changed. The additional [offset] and [length] information
+   * is used by the context to determine what reanalysis is necessary.
+   */
+  void setChangedContents(
+      Source source, String contents, int offset, int oldLength, int newLength);
+
+  /**
+   * Set the contents of the given [source] to the given [contents] and mark the
+   * source as having changed. This has the effect of overriding the default
+   * contents of the source. If the contents are `null` the override is removed
+   * so that the default contents will be returned.
+   */
+  void setContents(Source source, String contents);
+
+  /**
+   * Check the cache for any invalid entries (entries whose modification time
+   * does not match the modification time of the source associated with the
+   * entry). Invalid entries will be marked as invalid so that the source will
+   * be re-analyzed. Return `true` if at least one entry was invalid.
+   */
+  bool validateCacheConsistency();
+}
+
+/**
+ * An [AnalysisContext].
+ */
+class AnalysisContextImpl implements InternalAnalysisContext {
+  /**
+   * The difference between the maximum cache size and the maximum priority
+   * order size. The priority list must be capped so that it is less than the
+   * cache size. Failure to do so can result in an infinite loop in
+   * performAnalysisTask() because re-caching one AST structure can cause
+   * another priority source's AST structure to be flushed.
+   */
+  static int _PRIORITY_ORDER_SIZE_DELTA = 4;
+
+  /**
+   * A flag indicating whether trace output should be produced as analysis tasks
+   * are performed. Used for debugging.
+   */
+  static bool _TRACE_PERFORM_TASK = false;
+
+  /**
+   * The next context identifier.
+   */
+  static int _NEXT_ID = 0;
+
+  /**
+   * The unique identifier of this context.
+   */
+  final int _id = _NEXT_ID++;
+
+  /**
+   * A client-provided name used to identify this context, or `null` if the
+   * client has not provided a name.
+   */
+  String name;
+
+  /**
+   * The set of analysis options controlling the behavior of this context.
+   */
+  AnalysisOptionsImpl _options = new AnalysisOptionsImpl();
+
+  /**
+   * A flag indicating whether errors related to implicitly analyzed sources
+   * should be generated and reported.
+   */
+  bool _generateImplicitErrors = true;
+
+  /**
+   * A flag indicating whether errors related to sources in the SDK should be
+   * generated and reported.
+   */
+  bool _generateSdkErrors = true;
+
+  /**
+   * A flag indicating whether this context is disposed.
+   */
+  bool _disposed = false;
+
+  /**
+   * A cache of content used to override the default content of a source.
+   */
+  ContentCache _contentCache = new ContentCache();
+
+  /**
+   * The source factory used to create the sources that can be analyzed in this
+   * context.
+   */
+  SourceFactory _sourceFactory;
+
+  /**
+   * The set of declared variables used when computing constant values.
+   */
+  DeclaredVariables _declaredVariables = new DeclaredVariables();
+
+  /**
+   * A source representing the core library.
+   */
+  Source _coreLibrarySource;
+
+  /**
+   * A source representing the async library.
+   */
+  Source _asyncLibrarySource;
+
+  /**
+   * The partition that contains analysis results that are not shared with other
+   * contexts.
+   */
+  CachePartition _privatePartition;
+
+  /**
+   * A table mapping the sources known to the context to the information known
+   * about the source.
+   */
+  AnalysisCache _cache;
+
+  /**
+   * A list containing sources for which data should not be flushed.
+   */
+  List<Source> _priorityOrder = Source.EMPTY_LIST;
+
+  /**
+   * A map from all sources for which there are futures pending to a list of
+   * the corresponding PendingFuture objects.  These sources will be analyzed
+   * in the same way as priority sources, except with higher priority.
+   *
+   * TODO(paulberry): since the size of this map is not constrained (as it is
+   * for _priorityOrder), we run the risk of creating an analysis loop if
+   * re-caching one AST structure causes the AST structure for another source
+   * with pending futures to be flushed.  However, this is unlikely to happen
+   * in practice since sources are removed from this hash set as soon as their
+   * futures have completed.
+   */
+  HashMap<Source, List<PendingFuture>> _pendingFutureSources =
+      new HashMap<Source, List<PendingFuture>>();
+
+  /**
+   * A list containing sources whose AST structure is needed in order to resolve
+   * the next library to be resolved.
+   */
+  HashSet<Source> _neededForResolution = null;
+
+  /**
+   * A table mapping sources to the change notices that are waiting to be
+   * returned related to that source.
+   */
+  HashMap<Source, ChangeNoticeImpl> _pendingNotices =
+      new HashMap<Source, ChangeNoticeImpl>();
+
+  /**
+   * The object used to record the results of performing an analysis task.
+   */
+  AnalysisContextImpl_AnalysisTaskResultRecorder _resultRecorder;
+
+  /**
+   * Cached information used in incremental analysis or `null` if none.
+   */
+  IncrementalAnalysisCache _incrementalAnalysisCache;
+
+  /**
+   * The [TypeProvider] for this context, `null` if not yet created.
+   */
+  TypeProvider _typeProvider;
+
+  /**
+   * The object used to manage the list of sources that need to be analyzed.
+   */
+  WorkManager _workManager = new WorkManager();
+
+  /**
+   * The [Stopwatch] of the current "perform tasks cycle".
+   */
+  Stopwatch _performAnalysisTaskStopwatch;
+
+  /**
+   * The controller for sending [SourcesChangedEvent]s.
+   */
+  StreamController<SourcesChangedEvent> _onSourcesChangedController;
+
+  /**
+   * A subscription for a stream of events indicating when files are (and are
+   * not) being implicitly analyzed.
+   */
+  StreamController<ImplicitAnalysisEvent> _implicitAnalysisEventsController;
+
+  /**
+   * The listeners that are to be notified when various analysis results are
+   * produced in this context.
+   */
+  List<AnalysisListener> _listeners = new List<AnalysisListener>();
+
+  /**
+   * The most recently incrementally resolved source, or `null` when it was
+   * already validated, or the most recent change was not incrementally resolved.
+   */
+  Source incrementalResolutionValidation_lastUnitSource;
+
+  /**
+   * The most recently incrementally resolved library source, or `null` when it
+   * was already validated, or the most recent change was not incrementally
+   * resolved.
+   */
+  Source incrementalResolutionValidation_lastLibrarySource;
+
+  /**
+   * The result of incremental resolution result of
+   * [incrementalResolutionValidation_lastSource].
+   */
+  CompilationUnit incrementalResolutionValidation_lastUnit;
+
+  /**
+   * A factory to override how the [ResolverVisitor] is created.
+   */
+  ResolverVisitorFactory resolverVisitorFactory;
+
+  /**
+   * A factory to override how the [TypeResolverVisitor] is created.
+   */
+  TypeResolverVisitorFactory typeResolverVisitorFactory;
+
+  /**
+   * A factory to override how [LibraryResolver] is created.
+   */
+  LibraryResolverFactory libraryResolverFactory;
+
+  /**
+   * Initialize a newly created analysis context.
+   */
+  AnalysisContextImpl() {
+    _resultRecorder = new AnalysisContextImpl_AnalysisTaskResultRecorder(this);
+    _privatePartition = new UniversalCachePartition(
+        this,
+        AnalysisOptionsImpl.DEFAULT_CACHE_SIZE,
+        new AnalysisContextImpl_ContextRetentionPolicy(this));
+    _cache = createCacheFromSourceFactory(null);
+    _onSourcesChangedController =
+        new StreamController<SourcesChangedEvent>.broadcast();
+    _implicitAnalysisEventsController =
+        new StreamController<ImplicitAnalysisEvent>.broadcast();
+  }
+
+  @override
+  AnalysisCache get analysisCache => _cache;
+
+  @override
+  AnalysisOptions get analysisOptions => _options;
+
+  @override
+  void set analysisOptions(AnalysisOptions options) {
+    bool needsRecompute = this._options.analyzeFunctionBodiesPredicate !=
+            options.analyzeFunctionBodiesPredicate ||
+        this._options.generateImplicitErrors !=
+            options.generateImplicitErrors ||
+        this._options.generateSdkErrors != options.generateSdkErrors ||
+        this._options.dart2jsHint != options.dart2jsHint ||
+        (this._options.hint && !options.hint) ||
+        this._options.preserveComments != options.preserveComments ||
+        this._options.strongMode != options.strongMode ||
+        this._options.enableStrictCallChecks !=
+            options.enableStrictCallChecks ||
+        this._options.enableSuperMixins != options.enableSuperMixins;
+    int cacheSize = options.cacheSize;
+    if (this._options.cacheSize != cacheSize) {
+      this._options.cacheSize = cacheSize;
+      //cache.setMaxCacheSize(cacheSize);
+      _privatePartition.maxCacheSize = cacheSize;
+      //
+      // Cap the size of the priority list to being less than the cache size.
+      // Failure to do so can result in an infinite loop in
+      // performAnalysisTask() because re-caching one AST structure
+      // can cause another priority source's AST structure to be flushed.
+      //
+      // TODO(brianwilkerson) Remove this constraint when the new task model is
+      // implemented.
+      //
+      int maxPriorityOrderSize = cacheSize - _PRIORITY_ORDER_SIZE_DELTA;
+      if (_priorityOrder.length > maxPriorityOrderSize) {
+        _priorityOrder = _priorityOrder.sublist(0, maxPriorityOrderSize);
+      }
+    }
+    this._options.analyzeFunctionBodiesPredicate =
+        options.analyzeFunctionBodiesPredicate;
+    this._options.generateImplicitErrors = options.generateImplicitErrors;
+    this._options.generateSdkErrors = options.generateSdkErrors;
+    this._options.dart2jsHint = options.dart2jsHint;
+    this._options.enableStrictCallChecks = options.enableStrictCallChecks;
+    this._options.enableSuperMixins = options.enableSuperMixins;
+    this._options.hint = options.hint;
+    this._options.incremental = options.incremental;
+    this._options.incrementalApi = options.incrementalApi;
+    this._options.incrementalValidation = options.incrementalValidation;
+    this._options.lint = options.lint;
+    this._options.preserveComments = options.preserveComments;
+    this._options.strongMode = options.strongMode;
+    _generateImplicitErrors = options.generateImplicitErrors;
+    _generateSdkErrors = options.generateSdkErrors;
+    if (needsRecompute) {
+      _invalidateAllLocalResolutionInformation(false);
+    }
+  }
+
+  @override
+  void set analysisPriorityOrder(List<Source> sources) {
+    if (sources == null || sources.isEmpty) {
+      _priorityOrder = Source.EMPTY_LIST;
+    } else {
+      while (sources.remove(null)) {
+        // Nothing else to do.
+      }
+      if (sources.isEmpty) {
+        _priorityOrder = Source.EMPTY_LIST;
+      }
+      //
+      // Cap the size of the priority list to being less than the cache size.
+      // Failure to do so can result in an infinite loop in
+      // performAnalysisTask() because re-caching one AST structure
+      // can cause another priority source's AST structure to be flushed.
+      //
+      int count = math.min(
+          sources.length, _options.cacheSize - _PRIORITY_ORDER_SIZE_DELTA);
+      _priorityOrder = new List<Source>(count);
+      for (int i = 0; i < count; i++) {
+        _priorityOrder[i] = sources[i];
+      }
+      // Ensure entries for every priority source.
+      for (var source in _priorityOrder) {
+        SourceEntry entry = _getReadableSourceEntry(source);
+        if (entry == null) {
+          _createSourceEntry(source, false);
+        }
+      }
+    }
+  }
+
+  @override
+  set contentCache(ContentCache value) {
+    _contentCache = value;
+  }
+
+  @override
+  DeclaredVariables get declaredVariables => _declaredVariables;
+
+  @override
+  List<AnalysisTarget> get explicitTargets {
+    List<AnalysisTarget> targets = <AnalysisTarget>[];
+    MapIterator<Source, SourceEntry> iterator = _cache.iterator();
+    while (iterator.moveNext()) {
+      if (iterator.value.explicitlyAdded) {
+        targets.add(iterator.key);
+      }
+    }
+    return targets;
+  }
+
+  @override
+  List<Source> get htmlSources => _getSources(SourceKind.HTML);
+
+  @override
+  Stream<ImplicitAnalysisEvent> get implicitAnalysisEvents =>
+      _implicitAnalysisEventsController.stream;
+
+  @override
+  bool get isDisposed => _disposed;
+
+  @override
+  List<Source> get launchableClientLibrarySources {
+    // TODO(brianwilkerson) This needs to filter out libraries that do not
+    // reference dart:html, either directly or indirectly.
+    List<Source> sources = new List<Source>();
+    MapIterator<Source, SourceEntry> iterator = _cache.iterator();
+    while (iterator.moveNext()) {
+      Source source = iterator.key;
+      SourceEntry sourceEntry = iterator.value;
+      if (sourceEntry.kind == SourceKind.LIBRARY && !source.isInSystemLibrary) {
+//          DartEntry dartEntry = (DartEntry) sourceEntry;
+//          if (dartEntry.getValue(DartEntry.IS_LAUNCHABLE) && dartEntry.getValue(DartEntry.IS_CLIENT)) {
+        sources.add(source);
+//          }
+      }
+    }
+    return sources;
+  }
+
+  @override
+  List<Source> get launchableServerLibrarySources {
+    // TODO(brianwilkerson) This needs to filter out libraries that reference
+    // dart:html, either directly or indirectly.
+    List<Source> sources = new List<Source>();
+    MapIterator<Source, SourceEntry> iterator = _cache.iterator();
+    while (iterator.moveNext()) {
+      Source source = iterator.key;
+      SourceEntry sourceEntry = iterator.value;
+      if (sourceEntry.kind == SourceKind.LIBRARY && !source.isInSystemLibrary) {
+//          DartEntry dartEntry = (DartEntry) sourceEntry;
+//          if (dartEntry.getValue(DartEntry.IS_LAUNCHABLE) && !dartEntry.getValue(DartEntry.IS_CLIENT)) {
+        sources.add(source);
+//          }
+      }
+    }
+    return sources;
+  }
+
+  @override
+  List<Source> get librarySources => _getSources(SourceKind.LIBRARY);
+
+  /**
+   * Look through the cache for a task that needs to be performed. Return the
+   * task that was found, or `null` if there is no more work to be done.
+   */
+  AnalysisTask get nextAnalysisTask {
+    bool hintsEnabled = _options.hint;
+    bool lintsEnabled = _options.lint;
+    bool hasBlockedTask = false;
+    //
+    // Look for incremental analysis
+    //
+    if (_incrementalAnalysisCache != null &&
+        _incrementalAnalysisCache.hasWork) {
+      AnalysisTask task =
+          new IncrementalAnalysisTask(this, _incrementalAnalysisCache);
+      _incrementalAnalysisCache = null;
+      return task;
+    }
+    //
+    // Look for a source that needs to be analyzed because it has futures
+    // pending.
+    //
+    if (_pendingFutureSources.isNotEmpty) {
+      List<Source> sourcesToRemove = <Source>[];
+      AnalysisTask task;
+      for (Source source in _pendingFutureSources.keys) {
+        SourceEntry sourceEntry = _cache.get(source);
+        List<PendingFuture> pendingFutures = _pendingFutureSources[source];
+        for (int i = 0; i < pendingFutures.length;) {
+          if (pendingFutures[i].evaluate(sourceEntry)) {
+            pendingFutures.removeAt(i);
+          } else {
+            i++;
+          }
+        }
+        if (pendingFutures.isEmpty) {
+          sourcesToRemove.add(source);
+          continue;
+        }
+        AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(
+            source, sourceEntry, true, hintsEnabled, lintsEnabled);
+        task = taskData.task;
+        if (task != null) {
+          break;
+        } else if (taskData.isBlocked) {
+          hasBlockedTask = true;
+        } else {
+          // There is no more work to do for this task, so forcibly complete
+          // all its pending futures.
+          for (PendingFuture pendingFuture in pendingFutures) {
+            pendingFuture.forciblyComplete();
+          }
+          sourcesToRemove.add(source);
+        }
+      }
+      for (Source source in sourcesToRemove) {
+        _pendingFutureSources.remove(source);
+      }
+      if (task != null) {
+        return task;
+      }
+    }
+    //
+    // Look for a priority source that needs to be analyzed.
+    //
+    int priorityCount = _priorityOrder.length;
+    for (int i = 0; i < priorityCount; i++) {
+      Source source = _priorityOrder[i];
+      AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(
+          source, _cache.get(source), true, hintsEnabled, lintsEnabled);
+      AnalysisTask task = taskData.task;
+      if (task != null) {
+        return task;
+      } else if (taskData.isBlocked) {
+        hasBlockedTask = true;
+      }
+    }
+    if (_neededForResolution != null) {
+      List<Source> sourcesToRemove = new List<Source>();
+      for (Source source in _neededForResolution) {
+        SourceEntry sourceEntry = _cache.get(source);
+        if (sourceEntry is DartEntry) {
+          DartEntry dartEntry = sourceEntry;
+          if (!dartEntry.hasResolvableCompilationUnit) {
+            if (dartEntry.getState(DartEntry.PARSED_UNIT) == CacheState.ERROR) {
+              sourcesToRemove.add(source);
+            } else {
+              AnalysisContextImpl_TaskData taskData =
+                  _createParseDartTask(source, dartEntry);
+              AnalysisTask task = taskData.task;
+              if (task != null) {
+                return task;
+              } else if (taskData.isBlocked) {
+                hasBlockedTask = true;
+              }
+            }
+          }
+        }
+      }
+      int count = sourcesToRemove.length;
+      for (int i = 0; i < count; i++) {
+        _neededForResolution.remove(sourcesToRemove[i]);
+      }
+    }
+    //
+    // Look for a non-priority source that needs to be analyzed.
+    //
+    List<Source> sourcesToRemove = new List<Source>();
+    WorkManager_WorkIterator sources = _workManager.iterator();
+    try {
+      while (sources.hasNext) {
+        Source source = sources.next();
+        AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(
+            source, _cache.get(source), false, hintsEnabled, lintsEnabled);
+        AnalysisTask task = taskData.task;
+        if (task != null) {
+          return task;
+        } else if (taskData.isBlocked) {
+          hasBlockedTask = true;
+        } else {
+          sourcesToRemove.add(source);
+        }
+      }
+    } finally {
+      int count = sourcesToRemove.length;
+      for (int i = 0; i < count; i++) {
+        _workManager.remove(sourcesToRemove[i]);
+      }
+    }
+    if (hasBlockedTask) {
+      // All of the analysis work is blocked waiting for an asynchronous task
+      // to complete.
+      return WaitForAsyncTask.instance;
+    }
+    return null;
+  }
+
+  @override
+  Stream<SourcesChangedEvent> get onSourcesChanged =>
+      _onSourcesChangedController.stream;
+
+  /**
+   * Make _pendingFutureSources available to unit tests.
+   */
+  HashMap<Source, List<PendingFuture>> get pendingFutureSources_forTesting =>
+      _pendingFutureSources;
+
+  @override
+  List<Source> get prioritySources => _priorityOrder;
+
+  @override
+  List<AnalysisTarget> get priorityTargets => prioritySources;
+
+  @override
+  CachePartition get privateAnalysisCachePartition => _privatePartition;
+
+  @override
+  SourceFactory get sourceFactory => _sourceFactory;
+
+  @override
+  void set sourceFactory(SourceFactory factory) {
+    if (identical(_sourceFactory, factory)) {
+      return;
+    } else if (factory.context != null) {
+      throw new IllegalStateException(
+          "Source factories cannot be shared between contexts");
+    }
+    if (_sourceFactory != null) {
+      _sourceFactory.context = null;
+    }
+    factory.context = this;
+    _sourceFactory = factory;
+    _coreLibrarySource = _sourceFactory.forUri(DartSdk.DART_CORE);
+    _asyncLibrarySource = _sourceFactory.forUri(DartSdk.DART_ASYNC);
+    _cache = createCacheFromSourceFactory(factory);
+    _invalidateAllLocalResolutionInformation(true);
+  }
+
+  @override
+  List<Source> get sources {
+    List<Source> sources = new List<Source>();
+    MapIterator<Source, SourceEntry> iterator = _cache.iterator();
+    while (iterator.moveNext()) {
+      sources.add(iterator.key);
+    }
+    return sources;
+  }
+
+  /**
+   * Return a list of the sources that would be processed by
+   * [performAnalysisTask]. This method duplicates, and must therefore be kept
+   * in sync with, [getNextAnalysisTask]. This method is intended to be used for
+   * testing purposes only.
+   */
+  List<Source> get sourcesNeedingProcessing {
+    HashSet<Source> sources = new HashSet<Source>();
+    bool hintsEnabled = _options.hint;
+    bool lintsEnabled = _options.lint;
+
+    //
+    // Look for priority sources that need to be analyzed.
+    //
+    for (Source source in _priorityOrder) {
+      _getSourcesNeedingProcessing(source, _cache.get(source), true,
+          hintsEnabled, lintsEnabled, sources);
+    }
+    //
+    // Look for non-priority sources that need to be analyzed.
+    //
+    WorkManager_WorkIterator iterator = _workManager.iterator();
+    while (iterator.hasNext) {
+      Source source = iterator.next();
+      _getSourcesNeedingProcessing(source, _cache.get(source), false,
+          hintsEnabled, lintsEnabled, sources);
+    }
+    return new List<Source>.from(sources);
+  }
+
+  @override
+  AnalysisContextStatistics get statistics {
+    AnalysisContextStatisticsImpl statistics =
+        new AnalysisContextStatisticsImpl();
+    visitCacheItems(statistics._internalPutCacheItem);
+    statistics.partitionData = _cache.partitionData;
+    return statistics;
+  }
+
+  IncrementalAnalysisCache get test_incrementalAnalysisCache {
+    return _incrementalAnalysisCache;
+  }
+
+  set test_incrementalAnalysisCache(IncrementalAnalysisCache value) {
+    _incrementalAnalysisCache = value;
+  }
+
+  List<Source> get test_priorityOrder => _priorityOrder;
+
+  @override
+  TypeProvider get typeProvider {
+    if (_typeProvider != null) {
+      return _typeProvider;
+    }
+    Source coreSource = sourceFactory.forUri(DartSdk.DART_CORE);
+    if (coreSource == null) {
+      throw new AnalysisException("Could not create a source for dart:core");
+    }
+    LibraryElement coreElement = computeLibraryElement(coreSource);
+    if (coreElement == null) {
+      throw new AnalysisException("Could not create an element for dart:core");
+    }
+    Source asyncSource = sourceFactory.forUri(DartSdk.DART_ASYNC);
+    if (asyncSource == null) {
+      throw new AnalysisException("Could not create a source for dart:async");
+    }
+    LibraryElement asyncElement = computeLibraryElement(asyncSource);
+    if (asyncElement == null) {
+      throw new AnalysisException("Could not create an element for dart:async");
+    }
+    _typeProvider = new TypeProviderImpl(coreElement, asyncElement);
+    return _typeProvider;
+  }
+
+  /**
+   * Sets the [TypeProvider] for this context.
+   */
+  void set typeProvider(TypeProvider typeProvider) {
+    _typeProvider = typeProvider;
+  }
+
+  @override
+  void addListener(AnalysisListener listener) {
+    if (!_listeners.contains(listener)) {
+      _listeners.add(listener);
+    }
+  }
+
+  @override
+  void applyAnalysisDelta(AnalysisDelta delta) {
+    ChangeSet changeSet = new ChangeSet();
+    delta.analysisLevels.forEach((Source source, AnalysisLevel level) {
+      if (level == AnalysisLevel.NONE) {
+        changeSet.removedSource(source);
+      } else {
+        changeSet.addedSource(source);
+      }
+    });
+    applyChanges(changeSet);
+  }
+
+  @override
+  void applyChanges(ChangeSet changeSet) {
+    if (changeSet.isEmpty) {
+      return;
+    }
+    //
+    // First, compute the list of sources that have been removed.
+    //
+    List<Source> removedSources =
+        new List<Source>.from(changeSet.removedSources);
+    for (SourceContainer container in changeSet.removedContainers) {
+      _addSourcesInContainer(removedSources, container);
+    }
+    //
+    // Then determine which cached results are no longer valid.
+    //
+    for (Source source in changeSet.addedSources) {
+      _sourceAvailable(source);
+    }
+    for (Source source in changeSet.changedSources) {
+      if (_contentCache.getContents(source) != null) {
+        // This source is overridden in the content cache, so the change will
+        // have no effect. Just ignore it to avoid wasting time doing
+        // re-analysis.
+        continue;
+      }
+      _sourceChanged(source);
+    }
+    changeSet.changedContents.forEach((Source key, String value) {
+      _contentsChanged(key, value, false);
+    });
+    changeSet.changedRanges
+        .forEach((Source source, ChangeSet_ContentChange change) {
+      _contentRangeChanged(source, change.contents, change.offset,
+          change.oldLength, change.newLength);
+    });
+    for (Source source in changeSet.deletedSources) {
+      _sourceDeleted(source);
+    }
+    for (Source source in removedSources) {
+      _sourceRemoved(source);
+    }
+    _onSourcesChangedController.add(new SourcesChangedEvent(changeSet));
+  }
+
+  @override
+  String computeDocumentationComment(Element element) {
+    if (element == null) {
+      return null;
+    }
+    Source source = element.source;
+    if (source == null) {
+      return null;
+    }
+    CompilationUnit unit = parseCompilationUnit(source);
+    if (unit == null) {
+      return null;
+    }
+    NodeLocator locator = new NodeLocator(element.nameOffset);
+    AstNode nameNode = locator.searchWithin(unit);
+    while (nameNode != null) {
+      if (nameNode is AnnotatedNode) {
+        Comment comment = nameNode.documentationComment;
+        if (comment == null) {
+          return null;
+        }
+        StringBuffer buffer = new StringBuffer();
+        List<Token> tokens = comment.tokens;
+        for (int i = 0; i < tokens.length; i++) {
+          if (i > 0) {
+            buffer.write("\n");
+          }
+          buffer.write(tokens[i].lexeme);
+        }
+        return buffer.toString();
+      }
+      nameNode = nameNode.parent;
+    }
+    return null;
+  }
+
+  @override
+  List<AnalysisError> computeErrors(Source source) {
+    bool enableHints = _options.hint;
+    bool enableLints = _options.lint;
+
+    SourceEntry sourceEntry = _getReadableSourceEntry(source);
+    if (sourceEntry is DartEntry) {
+      List<AnalysisError> errors = new List<AnalysisError>();
+      try {
+        DartEntry dartEntry = sourceEntry;
+        ListUtilities.addAll(
+            errors, _getDartScanData(source, dartEntry, DartEntry.SCAN_ERRORS));
+        dartEntry = _getReadableDartEntry(source);
+        ListUtilities.addAll(errors,
+            _getDartParseData(source, dartEntry, DartEntry.PARSE_ERRORS));
+        dartEntry = _getReadableDartEntry(source);
+        if (dartEntry.getValue(DartEntry.SOURCE_KIND) == SourceKind.LIBRARY) {
+          ListUtilities.addAll(
+              errors,
+              _getDartResolutionData(
+                  source, source, dartEntry, DartEntry.RESOLUTION_ERRORS));
+          dartEntry = _getReadableDartEntry(source);
+          ListUtilities.addAll(
+              errors,
+              _getDartVerificationData(
+                  source, source, dartEntry, DartEntry.VERIFICATION_ERRORS));
+          if (enableHints) {
+            dartEntry = _getReadableDartEntry(source);
+            ListUtilities.addAll(errors,
+                _getDartHintData(source, source, dartEntry, DartEntry.HINTS));
+          }
+          if (enableLints) {
+            dartEntry = _getReadableDartEntry(source);
+            ListUtilities.addAll(errors,
+                _getDartLintData(source, source, dartEntry, DartEntry.LINTS));
+          }
+        } else {
+          List<Source> libraries = getLibrariesContaining(source);
+          for (Source librarySource in libraries) {
+            ListUtilities.addAll(
+                errors,
+                _getDartResolutionData(source, librarySource, dartEntry,
+                    DartEntry.RESOLUTION_ERRORS));
+            dartEntry = _getReadableDartEntry(source);
+            ListUtilities.addAll(
+                errors,
+                _getDartVerificationData(source, librarySource, dartEntry,
+                    DartEntry.VERIFICATION_ERRORS));
+            if (enableHints) {
+              dartEntry = _getReadableDartEntry(source);
+              ListUtilities.addAll(
+                  errors,
+                  _getDartHintData(
+                      source, librarySource, dartEntry, DartEntry.HINTS));
+            }
+            if (enableLints) {
+              dartEntry = _getReadableDartEntry(source);
+              ListUtilities.addAll(
+                  errors,
+                  _getDartLintData(
+                      source, librarySource, dartEntry, DartEntry.LINTS));
+            }
+          }
+        }
+      } on ObsoleteSourceAnalysisException catch (exception, stackTrace) {
+        AnalysisEngine.instance.logger.logInformation(
+            "Could not compute errors",
+            new CaughtException(exception, stackTrace));
+      }
+      if (errors.isEmpty) {
+        return AnalysisError.NO_ERRORS;
+      }
+      return errors;
+    } else if (sourceEntry is HtmlEntry) {
+      HtmlEntry htmlEntry = sourceEntry;
+      try {
+        return _getHtmlResolutionData2(
+            source, htmlEntry, HtmlEntry.RESOLUTION_ERRORS);
+      } on ObsoleteSourceAnalysisException catch (exception, stackTrace) {
+        AnalysisEngine.instance.logger.logInformation(
+            "Could not compute errors",
+            new CaughtException(exception, stackTrace));
+      }
+    }
+    return AnalysisError.NO_ERRORS;
+  }
+
+  @override
+  List<Source> computeExportedLibraries(Source source) => _getDartParseData2(
+      source, DartEntry.EXPORTED_LIBRARIES, Source.EMPTY_LIST);
+
+  @override
+  @deprecated
+  HtmlElement computeHtmlElement(Source source) =>
+      _getHtmlResolutionData(source, HtmlEntry.ELEMENT, null);
+
+  @override
+  List<Source> computeImportedLibraries(Source source) => _getDartParseData2(
+      source, DartEntry.IMPORTED_LIBRARIES, Source.EMPTY_LIST);
+
+  @override
+  SourceKind computeKindOf(Source source) {
+    SourceEntry sourceEntry = _getReadableSourceEntry(source);
+    if (sourceEntry == null) {
+      return SourceKind.UNKNOWN;
+    } else if (sourceEntry is DartEntry) {
+      try {
+        return _getDartParseData(source, sourceEntry, DartEntry.SOURCE_KIND);
+      } on AnalysisException {
+        return SourceKind.UNKNOWN;
+      }
+    }
+    return sourceEntry.kind;
+  }
+
+  @override
+  LibraryElement computeLibraryElement(Source source) =>
+      _getDartResolutionData2(source, source, DartEntry.ELEMENT, null);
+
+  @override
+  LineInfo computeLineInfo(Source source) {
+    SourceEntry sourceEntry = _getReadableSourceEntry(source);
+    try {
+      if (sourceEntry is HtmlEntry) {
+        return _getHtmlParseData(source, SourceEntry.LINE_INFO, null);
+      } else if (sourceEntry is DartEntry) {
+        return _getDartScanData2(source, SourceEntry.LINE_INFO, null);
+      }
+    } on ObsoleteSourceAnalysisException catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logInformation(
+          "Could not compute ${SourceEntry.LINE_INFO}",
+          new CaughtException(exception, stackTrace));
+    }
+    return null;
+  }
+
+  @override
+  CompilationUnit computeResolvableCompilationUnit(Source source) {
+    DartEntry dartEntry = _getReadableDartEntry(source);
+    if (dartEntry == null) {
+      throw new AnalysisException(
+          "computeResolvableCompilationUnit for non-Dart: ${source.fullName}");
+    }
+    dartEntry = _cacheDartParseData(source, dartEntry, DartEntry.PARSED_UNIT);
+    CompilationUnit unit = dartEntry.resolvableCompilationUnit;
+    if (unit == null) {
+      throw new AnalysisException(
+          "Internal error: computeResolvableCompilationUnit could not parse ${source.fullName}",
+          new CaughtException(dartEntry.exception, null));
+    }
+    return unit;
+  }
+
+  @override
+  CancelableFuture<CompilationUnit> computeResolvedCompilationUnitAsync(
+      Source unitSource, Source librarySource) {
+    return new _AnalysisFutureHelper<CompilationUnit>(this)
+        .computeAsync(unitSource, (SourceEntry sourceEntry) {
+      if (sourceEntry is DartEntry) {
+        if (sourceEntry.getStateInLibrary(
+                DartEntry.RESOLVED_UNIT, librarySource) ==
+            CacheState.ERROR) {
+          throw sourceEntry.exception;
+        }
+        return sourceEntry.getValueInLibrary(
+            DartEntry.RESOLVED_UNIT, librarySource);
+      }
+      throw new AnalysisNotScheduledError();
+    });
+  }
+
+  @override
+  Object computeResult(AnalysisTarget target, ResultDescriptor result) {
+    return result.defaultValue;
+  }
+
+  /**
+   * Create an analysis cache based on the given source [factory].
+   */
+  AnalysisCache createCacheFromSourceFactory(SourceFactory factory) {
+    if (factory == null) {
+      return new AnalysisCache(<CachePartition>[_privatePartition]);
+    }
+    DartSdk sdk = factory.dartSdk;
+    if (sdk == null) {
+      return new AnalysisCache(<CachePartition>[_privatePartition]);
+    }
+    return new AnalysisCache(<CachePartition>[
+      AnalysisEngine.instance.partitionManager.forSdk(sdk),
+      _privatePartition
+    ]);
+  }
+
+  @override
+  void dispose() {
+    _disposed = true;
+    for (List<PendingFuture> pendingFutures in _pendingFutureSources.values) {
+      for (PendingFuture pendingFuture in pendingFutures) {
+        pendingFuture.forciblyComplete();
+      }
+    }
+    _pendingFutureSources.clear();
+  }
+
+  @override
+  List<CompilationUnit> ensureResolvedDartUnits(Source unitSource) {
+    SourceEntry sourceEntry = _cache.get(unitSource);
+    if (sourceEntry is! DartEntry) {
+      return null;
+    }
+    DartEntry dartEntry = sourceEntry;
+    // Check every library.
+    List<CompilationUnit> units = <CompilationUnit>[];
+    List<Source> containingLibraries = dartEntry.containingLibraries;
+    for (Source librarySource in containingLibraries) {
+      CompilationUnit unit =
+          dartEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource);
+      if (unit == null) {
+        units = null;
+        break;
+      }
+      units.add(unit);
+    }
+    // Invalidate the flushed RESOLVED_UNIT to force it eventually.
+    if (units == null) {
+      bool shouldBeScheduled = false;
+      for (Source librarySource in containingLibraries) {
+        if (dartEntry.getStateInLibrary(
+                DartEntry.RESOLVED_UNIT, librarySource) ==
+            CacheState.FLUSHED) {
+          dartEntry.setStateInLibrary(
+              DartEntry.RESOLVED_UNIT, librarySource, CacheState.INVALID);
+          shouldBeScheduled = true;
+        }
+      }
+      if (shouldBeScheduled) {
+        _workManager.add(unitSource, SourcePriority.UNKNOWN);
+      }
+      // We cannot provide resolved units right now,
+      // but the future analysis will.
+      return null;
+    }
+    // done
+    return units;
+  }
+
+  @override
+  bool exists(Source source) {
+    if (source == null) {
+      return false;
+    }
+    if (_contentCache.getContents(source) != null) {
+      return true;
+    }
+    return source.exists();
+  }
+
+  @override
+  cache.CacheEntry getCacheEntry(AnalysisTarget target) {
+    return null;
+  }
+
+  @override
+  CompilationUnitElement getCompilationUnitElement(
+      Source unitSource, Source librarySource) {
+    LibraryElement libraryElement = getLibraryElement(librarySource);
+    if (libraryElement != null) {
+      // try defining unit
+      CompilationUnitElement definingUnit =
+          libraryElement.definingCompilationUnit;
+      if (definingUnit.source == unitSource) {
+        return definingUnit;
+      }
+      // try parts
+      for (CompilationUnitElement partUnit in libraryElement.parts) {
+        if (partUnit.source == unitSource) {
+          return partUnit;
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  TimestampedData<String> getContents(Source source) {
+    String contents = _contentCache.getContents(source);
+    if (contents != null) {
+      return new TimestampedData<String>(
+          _contentCache.getModificationStamp(source), contents);
+    }
+    return source.contents;
+  }
+
+  @override
+  InternalAnalysisContext getContextFor(Source source) {
+    InternalAnalysisContext context = _cache.getContextFor(source);
+    return context == null ? this : context;
+  }
+
+  @override
+  Element getElement(ElementLocation location) {
+    // TODO(brianwilkerson) This should not be a "get" method.
+    try {
+      List<String> components = location.components;
+      Source source = _computeSourceFromEncoding(components[0]);
+      String sourceName = source.shortName;
+      if (AnalysisEngine.isDartFileName(sourceName)) {
+        ElementImpl element = computeLibraryElement(source) as ElementImpl;
+        for (int i = 1; i < components.length; i++) {
+          if (element == null) {
+            return null;
+          }
+          element = element.getChild(components[i]);
+        }
+        return element;
+      }
+      if (AnalysisEngine.isHtmlFileName(sourceName)) {
+        return computeHtmlElement(source);
+      }
+    } catch (exception) {
+      // If the location cannot be decoded for some reason then the underlying
+      // cause should have been logged already and we can fall though to return
+      // null.
+    }
+    return null;
+  }
+
+  @override
+  AnalysisErrorInfo getErrors(Source source) {
+    SourceEntry sourceEntry = getReadableSourceEntryOrNull(source);
+    if (sourceEntry is DartEntry) {
+      DartEntry dartEntry = sourceEntry;
+      return new AnalysisErrorInfoImpl(
+          dartEntry.allErrors, dartEntry.getValue(SourceEntry.LINE_INFO));
+    } else if (sourceEntry is HtmlEntry) {
+      HtmlEntry htmlEntry = sourceEntry;
+      return new AnalysisErrorInfoImpl(
+          htmlEntry.allErrors, htmlEntry.getValue(SourceEntry.LINE_INFO));
+    }
+    return new AnalysisErrorInfoImpl(AnalysisError.NO_ERRORS, null);
+  }
+
+  @override
+  @deprecated
+  HtmlElement getHtmlElement(Source source) {
+    SourceEntry sourceEntry = getReadableSourceEntryOrNull(source);
+    if (sourceEntry is HtmlEntry) {
+      return sourceEntry.getValue(HtmlEntry.ELEMENT);
+    }
+    return null;
+  }
+
+  @override
+  List<Source> getHtmlFilesReferencing(Source source) {
+    SourceKind sourceKind = getKindOf(source);
+    if (sourceKind == null) {
+      return Source.EMPTY_LIST;
+    }
+    List<Source> htmlSources = new List<Source>();
+    while (true) {
+      if (sourceKind == SourceKind.PART) {
+        List<Source> librarySources = getLibrariesContaining(source);
+        MapIterator<Source, SourceEntry> partIterator = _cache.iterator();
+        while (partIterator.moveNext()) {
+          SourceEntry sourceEntry = partIterator.value;
+          if (sourceEntry.kind == SourceKind.HTML) {
+            List<Source> referencedLibraries = (sourceEntry as HtmlEntry)
+                .getValue(HtmlEntry.REFERENCED_LIBRARIES);
+            if (_containsAny(referencedLibraries, librarySources)) {
+              htmlSources.add(partIterator.key);
+            }
+          }
+        }
+      } else {
+        MapIterator<Source, SourceEntry> iterator = _cache.iterator();
+        while (iterator.moveNext()) {
+          SourceEntry sourceEntry = iterator.value;
+          if (sourceEntry.kind == SourceKind.HTML) {
+            List<Source> referencedLibraries = (sourceEntry as HtmlEntry)
+                .getValue(HtmlEntry.REFERENCED_LIBRARIES);
+            if (_contains(referencedLibraries, source)) {
+              htmlSources.add(iterator.key);
+            }
+          }
+        }
+      }
+      break;
+    }
+    if (htmlSources.isEmpty) {
+      return Source.EMPTY_LIST;
+    }
+    return htmlSources;
+  }
+
+  @override
+  SourceKind getKindOf(Source source) {
+    SourceEntry sourceEntry = getReadableSourceEntryOrNull(source);
+    if (sourceEntry == null) {
+      return SourceKind.UNKNOWN;
+    }
+    return sourceEntry.kind;
+  }
+
+  @override
+  List<Source> getLibrariesContaining(Source source) {
+    SourceEntry sourceEntry = getReadableSourceEntryOrNull(source);
+    if (sourceEntry is DartEntry) {
+      return sourceEntry.containingLibraries;
+    }
+    return Source.EMPTY_LIST;
+  }
+
+  @override
+  List<Source> getLibrariesDependingOn(Source librarySource) {
+    List<Source> dependentLibraries = new List<Source>();
+    MapIterator<Source, SourceEntry> iterator = _cache.iterator();
+    while (iterator.moveNext()) {
+      SourceEntry sourceEntry = iterator.value;
+      if (sourceEntry.kind == SourceKind.LIBRARY) {
+        if (_contains(
+            (sourceEntry as DartEntry).getValue(DartEntry.EXPORTED_LIBRARIES),
+            librarySource)) {
+          dependentLibraries.add(iterator.key);
+        }
+        if (_contains(
+            (sourceEntry as DartEntry).getValue(DartEntry.IMPORTED_LIBRARIES),
+            librarySource)) {
+          dependentLibraries.add(iterator.key);
+        }
+      }
+    }
+    if (dependentLibraries.isEmpty) {
+      return Source.EMPTY_LIST;
+    }
+    return dependentLibraries;
+  }
+
+  @override
+  List<Source> getLibrariesReferencedFromHtml(Source htmlSource) {
+    SourceEntry sourceEntry = getReadableSourceEntryOrNull(htmlSource);
+    if (sourceEntry is HtmlEntry) {
+      HtmlEntry htmlEntry = sourceEntry;
+      return htmlEntry.getValue(HtmlEntry.REFERENCED_LIBRARIES);
+    }
+    return Source.EMPTY_LIST;
+  }
+
+  @override
+  LibraryElement getLibraryElement(Source source) {
+    SourceEntry sourceEntry = getReadableSourceEntryOrNull(source);
+    if (sourceEntry is DartEntry) {
+      return sourceEntry.getValue(DartEntry.ELEMENT);
+    }
+    return null;
+  }
+
+  @override
+  LineInfo getLineInfo(Source source) {
+    SourceEntry sourceEntry = getReadableSourceEntryOrNull(source);
+    if (sourceEntry != null) {
+      return sourceEntry.getValue(SourceEntry.LINE_INFO);
+    }
+    return null;
+  }
+
+  @override
+  int getModificationStamp(Source source) {
+    int stamp = _contentCache.getModificationStamp(source);
+    if (stamp != null) {
+      return stamp;
+    }
+    return source.modificationStamp;
+  }
+
+  @override
+  ChangeNoticeImpl getNotice(Source source) {
+    ChangeNoticeImpl notice = _pendingNotices[source];
+    if (notice == null) {
+      notice = new ChangeNoticeImpl(source);
+      _pendingNotices[source] = notice;
+    }
+    return notice;
+  }
+
+  @override
+  Namespace getPublicNamespace(LibraryElement library) {
+    // TODO(brianwilkerson) Rename this to not start with 'get'.
+    // Note that this is not part of the API of the interface.
+    Source source = library.definingCompilationUnit.source;
+    DartEntry dartEntry = _getReadableDartEntry(source);
+    if (dartEntry == null) {
+      return null;
+    }
+    Namespace namespace = null;
+    if (identical(dartEntry.getValue(DartEntry.ELEMENT), library)) {
+      namespace = dartEntry.getValue(DartEntry.PUBLIC_NAMESPACE);
+    }
+    if (namespace == null) {
+      NamespaceBuilder builder = new NamespaceBuilder();
+      namespace = builder.createPublicNamespaceForLibrary(library);
+      if (dartEntry == null) {
+        AnalysisEngine.instance.logger.logError(
+            "Could not compute the public namespace for ${library.source.fullName}",
+            new CaughtException(
+                new AnalysisException(
+                    "A Dart file became a non-Dart file: ${source.fullName}"),
+                null));
+        return null;
+      }
+      if (identical(dartEntry.getValue(DartEntry.ELEMENT), library)) {
+        dartEntry.setValue(DartEntry.PUBLIC_NAMESPACE, namespace);
+      }
+    }
+    return namespace;
+  }
+
+  /**
+   * Return the cache entry associated with the given [source], or `null` if
+   * there is no entry associated with the source.
+   */
+  SourceEntry getReadableSourceEntryOrNull(Source source) => _cache.get(source);
+
+  @override
+  CompilationUnit getResolvedCompilationUnit(
+      Source unitSource, LibraryElement library) {
+    if (library == null) {
+      return null;
+    }
+    return getResolvedCompilationUnit2(unitSource, library.source);
+  }
+
+  @override
+  CompilationUnit getResolvedCompilationUnit2(
+      Source unitSource, Source librarySource) {
+    SourceEntry sourceEntry = getReadableSourceEntryOrNull(unitSource);
+    if (sourceEntry is DartEntry) {
+      return sourceEntry.getValueInLibrary(
+          DartEntry.RESOLVED_UNIT, librarySource);
+    }
+    return null;
+  }
+
+  @override
+  @deprecated
+  ht.HtmlUnit getResolvedHtmlUnit(Source htmlSource) {
+    SourceEntry sourceEntry = getReadableSourceEntryOrNull(htmlSource);
+    if (sourceEntry is HtmlEntry) {
+      HtmlEntry htmlEntry = sourceEntry;
+      return htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT);
+    }
+    return null;
+  }
+
+  @override
+  Object getResult(AnalysisTarget target, ResultDescriptor result) {
+    return result.defaultValue;
+  }
+
+  @override
+  List<Source> getSourcesWithFullName(String path) {
+    List<Source> sources = <Source>[];
+    MapIterator<Source, SourceEntry> iterator = _cache.iterator();
+    while (iterator.moveNext()) {
+      if (iterator.key.fullName == path) {
+        sources.add(iterator.key);
+      }
+    }
+    return sources;
+  }
+
+  @override
+  bool handleContentsChanged(
+      Source source, String originalContents, String newContents, bool notify) {
+    SourceEntry sourceEntry = _cache.get(source);
+    if (sourceEntry == null) {
+      return false;
+    }
+    bool changed = newContents != originalContents;
+    if (newContents != null) {
+      if (changed) {
+        _incrementalAnalysisCache =
+            IncrementalAnalysisCache.clear(_incrementalAnalysisCache, source);
+        if (!analysisOptions.incremental ||
+            !_tryPoorMansIncrementalResolution(source, newContents)) {
+          _sourceChanged(source);
+        }
+        sourceEntry.modificationTime =
+            _contentCache.getModificationStamp(source);
+        sourceEntry.setValue(SourceEntry.CONTENT, newContents);
+      } else {
+        sourceEntry.modificationTime =
+            _contentCache.getModificationStamp(source);
+      }
+    } else if (originalContents != null) {
+      _incrementalAnalysisCache =
+          IncrementalAnalysisCache.clear(_incrementalAnalysisCache, source);
+      // We are removing the overlay for the file, check if the file's
+      // contents is the same as it was in the overlay.
+      try {
+        TimestampedData<String> fileContents = getContents(source);
+        newContents = fileContents.data;
+        sourceEntry.modificationTime = fileContents.modificationTime;
+        if (newContents == originalContents) {
+          sourceEntry.setValue(SourceEntry.CONTENT, newContents);
+          changed = false;
+        }
+      } catch (e) {}
+      // If not the same content (e.g. the file is being closed without save),
+      // then force analysis.
+      if (changed) {
+        if (!analysisOptions.incremental ||
+            !_tryPoorMansIncrementalResolution(source, newContents)) {
+          _sourceChanged(source);
+        }
+      }
+    }
+    if (notify && changed) {
+      _onSourcesChangedController
+          .add(new SourcesChangedEvent.changedContent(source, newContents));
+    }
+    return changed;
+  }
+
+  @override
+  void invalidateLibraryHints(Source librarySource) {
+    SourceEntry sourceEntry = _cache.get(librarySource);
+    if (sourceEntry is! DartEntry) {
+      return;
+    }
+    DartEntry dartEntry = sourceEntry;
+    // Prepare sources to invalidate hints in.
+    List<Source> sources = <Source>[librarySource];
+    sources.addAll(dartEntry.getValue(DartEntry.INCLUDED_PARTS));
+    // Invalidate hints and lints.
+    for (Source source in sources) {
+      DartEntry dartEntry = _cache.get(source);
+      if (dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource) ==
+          CacheState.VALID) {
+        dartEntry.setStateInLibrary(
+            DartEntry.HINTS, librarySource, CacheState.INVALID);
+      }
+      if (dartEntry.getStateInLibrary(DartEntry.LINTS, librarySource) ==
+          CacheState.VALID) {
+        dartEntry.setStateInLibrary(
+            DartEntry.LINTS, librarySource, CacheState.INVALID);
+      }
+    }
+  }
+
+  @override
+  bool isClientLibrary(Source librarySource) {
+    SourceEntry sourceEntry = _getReadableSourceEntry(librarySource);
+    if (sourceEntry is DartEntry) {
+      DartEntry dartEntry = sourceEntry;
+      return dartEntry.getValue(DartEntry.IS_CLIENT) &&
+          dartEntry.getValue(DartEntry.IS_LAUNCHABLE);
+    }
+    return false;
+  }
+
+  @override
+  bool isServerLibrary(Source librarySource) {
+    SourceEntry sourceEntry = _getReadableSourceEntry(librarySource);
+    if (sourceEntry is DartEntry) {
+      DartEntry dartEntry = sourceEntry;
+      return !dartEntry.getValue(DartEntry.IS_CLIENT) &&
+          dartEntry.getValue(DartEntry.IS_LAUNCHABLE);
+    }
+    return false;
+  }
+
+  @override
+  Stream<ComputedResult> onResultComputed(ResultDescriptor descriptor) {
+    throw new NotImplementedException('In not task-based AnalysisContext.');
+  }
+
+  @override
+  CompilationUnit parseCompilationUnit(Source source) =>
+      _getDartParseData2(source, DartEntry.PARSED_UNIT, null);
+
+  @override
+  Document parseHtmlDocument(Source source) {
+    return null;
+  }
+
+  @override
+  @deprecated
+  ht.HtmlUnit parseHtmlUnit(Source source) =>
+      _getHtmlParseData(source, HtmlEntry.PARSED_UNIT, null);
+
+  @override
+  AnalysisResult performAnalysisTask() {
+    if (_TRACE_PERFORM_TASK) {
+      print("----------------------------------------");
+    }
+    return PerformanceStatistics.performAnaysis.makeCurrentWhile(() {
+      int getStart = JavaSystem.currentTimeMillis();
+      AnalysisTask task = PerformanceStatistics.nextTask
+          .makeCurrentWhile(() => nextAnalysisTask);
+      int getEnd = JavaSystem.currentTimeMillis();
+      if (task == null) {
+        _validateLastIncrementalResolutionResult();
+        if (_performAnalysisTaskStopwatch != null) {
+          AnalysisEngine.instance.instrumentationService.logPerformance(
+              AnalysisPerformanceKind.FULL,
+              _performAnalysisTaskStopwatch,
+              'context_id=$_id');
+          _performAnalysisTaskStopwatch = null;
+        }
+        return new AnalysisResult(
+            _getChangeNotices(true), getEnd - getStart, null, -1);
+      }
+      if (_performAnalysisTaskStopwatch == null) {
+        _performAnalysisTaskStopwatch = new Stopwatch()..start();
+      }
+      String taskDescription = task.toString();
+      _notifyAboutToPerformTask(taskDescription);
+      if (_TRACE_PERFORM_TASK) {
+        print(taskDescription);
+      }
+      int performStart = JavaSystem.currentTimeMillis();
+      try {
+        task.perform(_resultRecorder);
+      } on ObsoleteSourceAnalysisException catch (exception, stackTrace) {
+        AnalysisEngine.instance.logger.logInformation(
+            "Could not perform analysis task: $taskDescription",
+            new CaughtException(exception, stackTrace));
+      } on AnalysisException catch (exception, stackTrace) {
+        if (exception.cause is! JavaIOException) {
+          AnalysisEngine.instance.logger.logError(
+              "Internal error while performing the task: $task",
+              new CaughtException(exception, stackTrace));
+        }
+      }
+      int performEnd = JavaSystem.currentTimeMillis();
+      List<ChangeNotice> notices = _getChangeNotices(false);
+      int noticeCount = notices.length;
+      for (int i = 0; i < noticeCount; i++) {
+        ChangeNotice notice = notices[i];
+        Source source = notice.source;
+        // TODO(brianwilkerson) Figure out whether the compilation unit is
+        // always resolved, or whether we need to decide whether to invoke the
+        // "parsed" or "resolved" method. This might be better done when
+        // recording task results in order to reduce the chance of errors.
+//        if (notice.getCompilationUnit() != null) {
+//          notifyResolvedDart(source, notice.getCompilationUnit());
+//        } else if (notice.getHtmlUnit() != null) {
+//          notifyResolvedHtml(source, notice.getHtmlUnit());
+//        }
+        _notifyErrors(source, notice.errors, notice.lineInfo);
+      }
+      return new AnalysisResult(notices, getEnd - getStart,
+          task.runtimeType.toString(), performEnd - performStart);
+    });
+  }
+
+  @override
+  void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
+    Source htmlSource = _sourceFactory.forUri(DartSdk.DART_HTML);
+    elementMap.forEach((Source librarySource, LibraryElement library) {
+      //
+      // Cache the element in the library's info.
+      //
+      DartEntry dartEntry = _getReadableDartEntry(librarySource);
+      if (dartEntry != null) {
+        _recordElementData(dartEntry, library, library.source, htmlSource);
+        dartEntry.setState(SourceEntry.CONTENT, CacheState.FLUSHED);
+        dartEntry.setValue(SourceEntry.LINE_INFO, new LineInfo(<int>[0]));
+        // DartEntry.ELEMENT - set in recordElementData
+        dartEntry.setValue(DartEntry.EXPORTED_LIBRARIES, Source.EMPTY_LIST);
+        dartEntry.setValue(DartEntry.IMPORTED_LIBRARIES, Source.EMPTY_LIST);
+        dartEntry.setValue(DartEntry.INCLUDED_PARTS, Source.EMPTY_LIST);
+        // DartEntry.IS_CLIENT - set in recordElementData
+        // DartEntry.IS_LAUNCHABLE - set in recordElementData
+        dartEntry.setValue(DartEntry.PARSE_ERRORS, AnalysisError.NO_ERRORS);
+        dartEntry.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
+        dartEntry.setState(DartEntry.PUBLIC_NAMESPACE, CacheState.FLUSHED);
+        dartEntry.setValue(DartEntry.SCAN_ERRORS, AnalysisError.NO_ERRORS);
+        dartEntry.setValue(DartEntry.SOURCE_KIND, SourceKind.LIBRARY);
+        dartEntry.setState(DartEntry.TOKEN_STREAM, CacheState.FLUSHED);
+        dartEntry.setValueInLibrary(DartEntry.RESOLUTION_ERRORS, librarySource,
+            AnalysisError.NO_ERRORS);
+        dartEntry.setStateInLibrary(
+            DartEntry.RESOLVED_UNIT, librarySource, CacheState.FLUSHED);
+        dartEntry.setValueInLibrary(DartEntry.VERIFICATION_ERRORS,
+            librarySource, AnalysisError.NO_ERRORS);
+        dartEntry.setValueInLibrary(
+            DartEntry.HINTS, librarySource, AnalysisError.NO_ERRORS);
+        dartEntry.setValueInLibrary(
+            DartEntry.LINTS, librarySource, AnalysisError.NO_ERRORS);
+      }
+    });
+  }
+
+  /**
+   * Record the results produced by performing a [task] and return the cache
+   * entry associated with the results.
+   */
+  DartEntry recordResolveDartLibraryCycleTaskResults(
+      ResolveDartLibraryCycleTask task) {
+    LibraryResolver2 resolver = task.libraryResolver;
+    CaughtException thrownException = task.exception;
+    Source unitSource = task.unitSource;
+    DartEntry unitEntry = _getReadableDartEntry(unitSource);
+    if (resolver != null) {
+      //
+      // The resolver should only be null if an exception was thrown before (or
+      // while) it was being created.
+      //
+      List<ResolvableLibrary> resolvedLibraries = resolver.resolvedLibraries;
+      if (resolvedLibraries == null) {
+        //
+        // The resolved libraries should only be null if an exception was thrown
+        // during resolution.
+        //
+        if (thrownException == null) {
+          var message = "In recordResolveDartLibraryCycleTaskResults, "
+              "resolvedLibraries was null and there was no thrown exception";
+          unitEntry.recordResolutionError(
+              new CaughtException(new AnalysisException(message), null));
+        } else {
+          unitEntry.recordResolutionError(thrownException);
+        }
+        _removeFromCache(unitSource);
+        if (thrownException != null) {
+          throw new AnalysisException('<rethrow>', thrownException);
+        }
+        return unitEntry;
+      }
+      Source htmlSource = sourceFactory.forUri(DartSdk.DART_HTML);
+      RecordingErrorListener errorListener = resolver.errorListener;
+      for (ResolvableLibrary library in resolvedLibraries) {
+        Source librarySource = library.librarySource;
+        for (Source source in library.compilationUnitSources) {
+          CompilationUnit unit = library.getAST(source);
+          List<AnalysisError> errors = errorListener.getErrorsForSource(source);
+          LineInfo lineInfo = getLineInfo(source);
+          DartEntry dartEntry = _cache.get(source);
+          if (thrownException == null) {
+            dartEntry.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
+            dartEntry.setValueInLibrary(
+                DartEntry.RESOLVED_UNIT, librarySource, unit);
+            dartEntry.setValueInLibrary(
+                DartEntry.RESOLUTION_ERRORS, librarySource, errors);
+            if (source == librarySource) {
+              _recordElementData(
+                  dartEntry, library.libraryElement, librarySource, htmlSource);
+            }
+            _cache.storedAst(source);
+          } else {
+            dartEntry.recordResolutionErrorInLibrary(
+                librarySource, thrownException);
+          }
+          if (source != librarySource) {
+            _workManager.add(source, SourcePriority.PRIORITY_PART);
+          }
+          ChangeNoticeImpl notice = getNotice(source);
+          notice.resolvedDartUnit = unit;
+          notice.setErrors(dartEntry.allErrors, lineInfo);
+        }
+      }
+    }
+    if (thrownException != null) {
+      throw new AnalysisException('<rethrow>', thrownException);
+    }
+    return unitEntry;
+  }
+
+  /**
+   * Record the results produced by performing a [task] and return the cache
+   * entry associated with the results.
+   */
+  DartEntry recordResolveDartLibraryTaskResults(ResolveDartLibraryTask task) {
+    LibraryResolver resolver = task.libraryResolver;
+    CaughtException thrownException = task.exception;
+    Source unitSource = task.unitSource;
+    DartEntry unitEntry = _getReadableDartEntry(unitSource);
+    if (resolver != null) {
+      //
+      // The resolver should only be null if an exception was thrown before (or
+      // while) it was being created.
+      //
+      Set<Library> resolvedLibraries = resolver.resolvedLibraries;
+      if (resolvedLibraries == null) {
+        //
+        // The resolved libraries should only be null if an exception was thrown
+        // during resolution.
+        //
+        if (thrownException == null) {
+          String message = "In recordResolveDartLibraryTaskResults, "
+              "resolvedLibraries was null and there was no thrown exception";
+          unitEntry.recordResolutionError(
+              new CaughtException(new AnalysisException(message), null));
+        } else {
+          unitEntry.recordResolutionError(thrownException);
+        }
+        _removeFromCache(unitSource);
+        if (thrownException != null) {
+          throw new AnalysisException('<rethrow>', thrownException);
+        }
+        return unitEntry;
+      }
+      Source htmlSource = sourceFactory.forUri(DartSdk.DART_HTML);
+      RecordingErrorListener errorListener = resolver.errorListener;
+      for (Library library in resolvedLibraries) {
+        Source librarySource = library.librarySource;
+        for (Source source in library.compilationUnitSources) {
+          CompilationUnit unit = library.getAST(source);
+          List<AnalysisError> errors = errorListener.getErrorsForSource(source);
+          LineInfo lineInfo = getLineInfo(source);
+          DartEntry dartEntry = _cache.get(source);
+          if (thrownException == null) {
+            dartEntry.setValue(SourceEntry.LINE_INFO, lineInfo);
+            dartEntry.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
+            dartEntry.setValueInLibrary(
+                DartEntry.RESOLVED_UNIT, librarySource, unit);
+            dartEntry.setValueInLibrary(
+                DartEntry.RESOLUTION_ERRORS, librarySource, errors);
+            if (source == librarySource) {
+              _recordElementData(
+                  dartEntry, library.libraryElement, librarySource, htmlSource);
+            }
+            _cache.storedAst(source);
+          } else {
+            dartEntry.recordResolutionErrorInLibrary(
+                librarySource, thrownException);
+            _removeFromCache(source);
+          }
+          if (source != librarySource) {
+            _workManager.add(source, SourcePriority.PRIORITY_PART);
+          }
+          ChangeNoticeImpl notice = getNotice(source);
+          notice.resolvedDartUnit = unit;
+          notice.setErrors(dartEntry.allErrors, lineInfo);
+        }
+      }
+    }
+    if (thrownException != null) {
+      throw new AnalysisException('<rethrow>', thrownException);
+    }
+    return unitEntry;
+  }
+
+  @override
+  void removeListener(AnalysisListener listener) {
+    _listeners.remove(listener);
+  }
+
+  @override
+  CompilationUnit resolveCompilationUnit(
+      Source unitSource, LibraryElement library) {
+    if (library == null) {
+      return null;
+    }
+    return resolveCompilationUnit2(unitSource, library.source);
+  }
+
+  @override
+  CompilationUnit resolveCompilationUnit2(
+          Source unitSource, Source librarySource) =>
+      _getDartResolutionData2(
+          unitSource, librarySource, DartEntry.RESOLVED_UNIT, null);
+
+  @override
+  @deprecated
+  ht.HtmlUnit resolveHtmlUnit(Source htmlSource) {
+    computeHtmlElement(htmlSource);
+    return parseHtmlUnit(htmlSource);
+  }
+
+  @override
+  void setChangedContents(Source source, String contents, int offset,
+      int oldLength, int newLength) {
+    if (_contentRangeChanged(source, contents, offset, oldLength, newLength)) {
+      _onSourcesChangedController.add(new SourcesChangedEvent.changedRange(
+          source, contents, offset, oldLength, newLength));
+    }
+  }
+
+  @override
+  void setContents(Source source, String contents) {
+    _contentsChanged(source, contents, true);
+  }
+
+  @override
+  bool shouldErrorsBeAnalyzed(Source source, Object entry) {
+    DartEntry dartEntry = entry;
+    if (source.isInSystemLibrary) {
+      return _generateSdkErrors;
+    } else if (!dartEntry.explicitlyAdded) {
+      return _generateImplicitErrors;
+    } else {
+      return true;
+    }
+  }
+
+  @override
+  void test_flushAstStructures(Source source) {
+    DartEntry dartEntry = getReadableSourceEntryOrNull(source);
+    dartEntry.flushAstStructures();
+  }
+
+  @override
+  bool validateCacheConsistency() {
+    int consistencyCheckStart = JavaSystem.nanoTime();
+    List<Source> changedSources = new List<Source>();
+    List<Source> missingSources = new List<Source>();
+    MapIterator<Source, SourceEntry> iterator = _cache.iterator();
+    while (iterator.moveNext()) {
+      Source source = iterator.key;
+      SourceEntry sourceEntry = iterator.value;
+      int sourceTime = getModificationStamp(source);
+      if (sourceTime != sourceEntry.modificationTime) {
+        changedSources.add(source);
+      }
+      if (sourceEntry.exception != null) {
+        if (!exists(source)) {
+          missingSources.add(source);
+        }
+      }
+    }
+    int count = changedSources.length;
+    for (int i = 0; i < count; i++) {
+      _sourceChanged(changedSources[i]);
+    }
+    int removalCount = 0;
+    for (Source source in missingSources) {
+      if (getLibrariesContaining(source).isEmpty &&
+          getLibrariesDependingOn(source).isEmpty) {
+        _removeFromCache(source);
+        removalCount++;
+      }
+    }
+    int consistencyCheckEnd = JavaSystem.nanoTime();
+    if (changedSources.length > 0 || missingSources.length > 0) {
+      StringBuffer buffer = new StringBuffer();
+      buffer.write("Consistency check took ");
+      buffer.write((consistencyCheckEnd - consistencyCheckStart) / 1000000.0);
+      buffer.writeln(" ms and found");
+      buffer.write("  ");
+      buffer.write(changedSources.length);
+      buffer.writeln(" inconsistent entries");
+      buffer.write("  ");
+      buffer.write(missingSources.length);
+      buffer.write(" missing sources (");
+      buffer.write(removalCount);
+      buffer.writeln(" removed");
+      for (Source source in missingSources) {
+        buffer.write("    ");
+        buffer.writeln(source.fullName);
+      }
+      _logInformation(buffer.toString());
+    }
+    return changedSources.length > 0;
+  }
+
+  @deprecated
+  @override
+  void visitCacheItems(void callback(Source source, SourceEntry dartEntry,
+      DataDescriptor rowDesc, CacheState state)) {
+    bool hintsEnabled = _options.hint;
+    bool lintsEnabled = _options.lint;
+    MapIterator<Source, SourceEntry> iterator = _cache.iterator();
+    while (iterator.moveNext()) {
+      Source source = iterator.key;
+      SourceEntry sourceEntry = iterator.value;
+      for (DataDescriptor descriptor in sourceEntry.descriptors) {
+        if (descriptor == DartEntry.SOURCE_KIND) {
+          // The source kind is always valid, so the state isn't interesting.
+          continue;
+        } else if (descriptor == DartEntry.CONTAINING_LIBRARIES) {
+          // The list of containing libraries is always valid, so the state
+          // isn't interesting.
+          continue;
+        } else if (descriptor == DartEntry.PUBLIC_NAMESPACE) {
+          // The public namespace isn't computed by performAnalysisTask()
+          // and therefore isn't interesting.
+          continue;
+        } else if (descriptor == HtmlEntry.HINTS) {
+          // We are not currently recording any hints related to HTML.
+          continue;
+        }
+        callback(
+            source, sourceEntry, descriptor, sourceEntry.getState(descriptor));
+      }
+      if (sourceEntry is DartEntry) {
+        // get library-specific values
+        List<Source> librarySources = getLibrariesContaining(source);
+        for (Source librarySource in librarySources) {
+          for (DataDescriptor descriptor in sourceEntry.libraryDescriptors) {
+            if (descriptor == DartEntry.BUILT_ELEMENT ||
+                descriptor == DartEntry.BUILT_UNIT) {
+              // These values are not currently being computed, so their state
+              // is not interesting.
+              continue;
+            } else if (!sourceEntry.explicitlyAdded &&
+                !_generateImplicitErrors &&
+                (descriptor == DartEntry.VERIFICATION_ERRORS ||
+                    descriptor == DartEntry.HINTS ||
+                    descriptor == DartEntry.LINTS)) {
+              continue;
+            } else if (source.isInSystemLibrary &&
+                !_generateSdkErrors &&
+                (descriptor == DartEntry.VERIFICATION_ERRORS ||
+                    descriptor == DartEntry.HINTS ||
+                    descriptor == DartEntry.LINTS)) {
+              continue;
+            } else if (!hintsEnabled && descriptor == DartEntry.HINTS) {
+              continue;
+            } else if (!lintsEnabled && descriptor == DartEntry.LINTS) {
+              continue;
+            }
+            callback(librarySource, sourceEntry, descriptor,
+                sourceEntry.getStateInLibrary(descriptor, librarySource));
+          }
+        }
+      }
+    }
+  }
+
+  @override
+  void visitContentCache(ContentCacheVisitor visitor) {
+    _contentCache.accept(visitor);
+  }
+
+  /**
+   * Record that we have accessed the AST structure associated with the given
+   * [source]. At the moment, there is no differentiation between the parsed and
+   * resolved forms of the AST.
+   */
+  void _accessedAst(Source source) {
+    _cache.accessedAst(source);
+  }
+
+  /**
+   * Add all of the sources contained in the given source [container] to the
+   * given list of [sources].
+   */
+  void _addSourcesInContainer(List<Source> sources, SourceContainer container) {
+    MapIterator<Source, SourceEntry> iterator = _cache.iterator();
+    while (iterator.moveNext()) {
+      Source source = iterator.key;
+      if (container.contains(source)) {
+        sources.add(source);
+      }
+    }
+  }
+
+  /**
+   * Given the [unitSource] of a Dart file and the [librarySource] of the
+   * library that contains it, return a cache entry in which the state of the
+   * data represented by the given [descriptor] is either [CacheState.VALID] or
+   * [CacheState.ERROR]. This method assumes that the data can be produced by
+   * generating hints for the library if the data is not already cached. The
+   * [dartEntry] is the cache entry associated with the Dart file.
+   *
+   * Throws an [AnalysisException] if data could not be returned because the
+   * source could not be parsed.
+   */
+  DartEntry _cacheDartHintData(Source unitSource, Source librarySource,
+      DartEntry dartEntry, DataDescriptor descriptor) {
+    //
+    // Check to see whether we already have the information being requested.
+    //
+    CacheState state = dartEntry.getStateInLibrary(descriptor, librarySource);
+    while (state != CacheState.ERROR && state != CacheState.VALID) {
+      //
+      // If not, compute the information.
+      // Unless the modification date of the source continues to change,
+      // this loop will eventually terminate.
+      //
+      DartEntry libraryEntry = _getReadableDartEntry(librarySource);
+      libraryEntry = _cacheDartResolutionData(
+          librarySource, librarySource, libraryEntry, DartEntry.ELEMENT);
+      LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
+      CompilationUnitElement definingUnit =
+          libraryElement.definingCompilationUnit;
+      List<CompilationUnitElement> parts = libraryElement.parts;
+      List<TimestampedData<CompilationUnit>> units =
+          new List<TimestampedData<CompilationUnit>>(parts.length + 1);
+      units[0] = _getResolvedUnit(definingUnit, librarySource);
+      if (units[0] == null) {
+        Source source = definingUnit.source;
+        units[0] = new TimestampedData<CompilationUnit>(
+            getModificationStamp(source),
+            resolveCompilationUnit(source, libraryElement));
+      }
+      for (int i = 0; i < parts.length; i++) {
+        units[i + 1] = _getResolvedUnit(parts[i], librarySource);
+        if (units[i + 1] == null) {
+          Source source = parts[i].source;
+          units[i + 1] = new TimestampedData<CompilationUnit>(
+              getModificationStamp(source),
+              resolveCompilationUnit(source, libraryElement));
+        }
+      }
+      dartEntry = new GenerateDartHintsTask(
+              this, units, getLibraryElement(librarySource))
+          .perform(_resultRecorder) as DartEntry;
+      state = dartEntry.getStateInLibrary(descriptor, librarySource);
+    }
+    return dartEntry;
+  }
+
+  /**
+   * Given a source for a Dart file and the library that contains it, return a
+   * cache entry in which the state of the data represented by the given
+   * descriptor is either [CacheState.VALID] or [CacheState.ERROR]. This method
+   * assumes that the data can be produced by generating lints for the library
+   * if the data is not already cached.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  DartEntry _cacheDartLintData(Source unitSource, Source librarySource,
+      DartEntry dartEntry, DataDescriptor descriptor) {
+    //
+    // Check to see whether we already have the information being requested.
+    //
+    CacheState state = dartEntry.getStateInLibrary(descriptor, librarySource);
+    while (state != CacheState.ERROR && state != CacheState.VALID) {
+      //
+      // If not, compute the information.
+      // Unless the modification date of the source continues to change,
+      // this loop will eventually terminate.
+      //
+      DartEntry libraryEntry = _getReadableDartEntry(librarySource);
+      libraryEntry = _cacheDartResolutionData(
+          librarySource, librarySource, libraryEntry, DartEntry.ELEMENT);
+      LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
+      CompilationUnitElement definingUnit =
+          libraryElement.definingCompilationUnit;
+      List<CompilationUnitElement> parts = libraryElement.parts;
+      List<TimestampedData<CompilationUnit>> units =
+          new List<TimestampedData<CompilationUnit>>(parts.length + 1);
+      units[0] = _getResolvedUnit(definingUnit, librarySource);
+      if (units[0] == null) {
+        Source source = definingUnit.source;
+        units[0] = new TimestampedData<CompilationUnit>(
+            getModificationStamp(source),
+            resolveCompilationUnit(source, libraryElement));
+      }
+      for (int i = 0; i < parts.length; i++) {
+        units[i + 1] = _getResolvedUnit(parts[i], librarySource);
+        if (units[i + 1] == null) {
+          Source source = parts[i].source;
+          units[i + 1] = new TimestampedData<CompilationUnit>(
+              getModificationStamp(source),
+              resolveCompilationUnit(source, libraryElement));
+        }
+      }
+      //TODO(pquitslund): revisit if we need all units or whether one will do
+      dartEntry = new GenerateDartLintsTask(
+              this, units, getLibraryElement(librarySource))
+          .perform(_resultRecorder) as DartEntry;
+      state = dartEntry.getStateInLibrary(descriptor, librarySource);
+    }
+    return dartEntry;
+  }
+
+  /**
+   * Given a source for a Dart file, return a cache entry in which the state of
+   * the data represented by the given descriptor is either [CacheState.VALID]
+   * or [CacheState.ERROR]. This method assumes that the data can be produced by
+   * parsing the source if it is not already cached.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  DartEntry _cacheDartParseData(
+      Source source, DartEntry dartEntry, DataDescriptor descriptor) {
+    if (identical(descriptor, DartEntry.PARSED_UNIT)) {
+      if (dartEntry.hasResolvableCompilationUnit) {
+        return dartEntry;
+      }
+    }
+    //
+    // Check to see whether we already have the information being requested.
+    //
+    CacheState state = dartEntry.getState(descriptor);
+    while (state != CacheState.ERROR && state != CacheState.VALID) {
+      //
+      // If not, compute the information. Unless the modification date of the
+      // source continues to change, this loop will eventually terminate.
+      //
+      dartEntry = _cacheDartScanData(source, dartEntry, DartEntry.TOKEN_STREAM);
+      dartEntry = new ParseDartTask(
+              this,
+              source,
+              dartEntry.getValue(DartEntry.TOKEN_STREAM),
+              dartEntry.getValue(SourceEntry.LINE_INFO))
+          .perform(_resultRecorder) as DartEntry;
+      state = dartEntry.getState(descriptor);
+    }
+    return dartEntry;
+  }
+
+  /**
+   * Given a source for a Dart file and the library that contains it, return a
+   * cache entry in which the state of the data represented by the given
+   * descriptor is either [CacheState.VALID] or [CacheState.ERROR]. This method
+   * assumes that the data can be produced by resolving the source in the
+   * context of the library if it is not already cached.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  DartEntry _cacheDartResolutionData(Source unitSource, Source librarySource,
+      DartEntry dartEntry, DataDescriptor descriptor) {
+    //
+    // Check to see whether we already have the information being requested.
+    //
+    CacheState state = (identical(descriptor, DartEntry.ELEMENT))
+        ? dartEntry.getState(descriptor)
+        : dartEntry.getStateInLibrary(descriptor, librarySource);
+    while (state != CacheState.ERROR && state != CacheState.VALID) {
+      //
+      // If not, compute the information. Unless the modification date of the
+      // source continues to change, this loop will eventually terminate.
+      //
+      // TODO(brianwilkerson) As an optimization, if we already have the
+      // element model for the library we can use ResolveDartUnitTask to produce
+      // the resolved AST structure much faster.
+      dartEntry = new ResolveDartLibraryTask(this, unitSource, librarySource)
+          .perform(_resultRecorder) as DartEntry;
+      state = (identical(descriptor, DartEntry.ELEMENT))
+          ? dartEntry.getState(descriptor)
+          : dartEntry.getStateInLibrary(descriptor, librarySource);
+    }
+    return dartEntry;
+  }
+
+  /**
+   * Given a source for a Dart file, return a cache entry in which the state of
+   * the data represented by the given descriptor is either [CacheState.VALID]
+   * or [CacheState.ERROR]. This method assumes that the data can be produced by
+   * scanning the source if it is not already cached.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  DartEntry _cacheDartScanData(
+      Source source, DartEntry dartEntry, DataDescriptor descriptor) {
+    //
+    // Check to see whether we already have the information being requested.
+    //
+    CacheState state = dartEntry.getState(descriptor);
+    while (state != CacheState.ERROR && state != CacheState.VALID) {
+      //
+      // If not, compute the information. Unless the modification date of the
+      // source continues to change, this loop will eventually terminate.
+      //
+      try {
+        if (dartEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) {
+          dartEntry = new GetContentTask(this, source).perform(_resultRecorder)
+              as DartEntry;
+        }
+        dartEntry = new ScanDartTask(
+                this, source, dartEntry.getValue(SourceEntry.CONTENT))
+            .perform(_resultRecorder) as DartEntry;
+      } on AnalysisException catch (exception) {
+        throw exception;
+      } catch (exception, stackTrace) {
+        throw new AnalysisException(
+            "Exception", new CaughtException(exception, stackTrace));
+      }
+      state = dartEntry.getState(descriptor);
+    }
+    return dartEntry;
+  }
+
+  /**
+   * Given a source for a Dart file and the library that contains it, return a
+   * cache entry in which the state of the data represented by the given
+   * descriptor is either [CacheState.VALID] or [CacheState.ERROR]. This method
+   * assumes that the data can be produced by verifying the source in the given
+   * library if the data is not already cached.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  DartEntry _cacheDartVerificationData(Source unitSource, Source librarySource,
+      DartEntry dartEntry, DataDescriptor descriptor) {
+    //
+    // Check to see whether we already have the information being requested.
+    //
+    CacheState state = dartEntry.getStateInLibrary(descriptor, librarySource);
+    while (state != CacheState.ERROR && state != CacheState.VALID) {
+      //
+      // If not, compute the information. Unless the modification date of the
+      // source continues to change, this loop will eventually terminate.
+      //
+      LibraryElement library = computeLibraryElement(librarySource);
+      CompilationUnit unit = resolveCompilationUnit(unitSource, library);
+      if (unit == null) {
+        throw new AnalysisException(
+            "Could not resolve compilation unit ${unitSource.fullName} in ${librarySource.fullName}");
+      }
+      dartEntry = new GenerateDartErrorsTask(this, unitSource, unit, library)
+          .perform(_resultRecorder) as DartEntry;
+      state = dartEntry.getStateInLibrary(descriptor, librarySource);
+    }
+    return dartEntry;
+  }
+
+  /**
+   * Given a source for an HTML file, return a cache entry in which all of the
+   * data represented by the state of the given descriptors is either
+   * [CacheState.VALID] or [CacheState.ERROR]. This method assumes that the data
+   * can be produced by parsing the source if it is not already cached.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  HtmlEntry _cacheHtmlParseData(
+      Source source, HtmlEntry htmlEntry, DataDescriptor descriptor) {
+    if (identical(descriptor, HtmlEntry.PARSED_UNIT)) {
+      ht.HtmlUnit unit = htmlEntry.anyParsedUnit;
+      if (unit != null) {
+        return htmlEntry;
+      }
+    }
+    //
+    // Check to see whether we already have the information being requested.
+    //
+    CacheState state = htmlEntry.getState(descriptor);
+    while (state != CacheState.ERROR && state != CacheState.VALID) {
+      //
+      // If not, compute the information. Unless the modification date of the
+      // source continues to change, this loop will eventually terminate.
+      //
+      try {
+        if (htmlEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) {
+          htmlEntry = new GetContentTask(this, source).perform(_resultRecorder)
+              as HtmlEntry;
+        }
+        htmlEntry = new ParseHtmlTask(
+                this, source, htmlEntry.getValue(SourceEntry.CONTENT))
+            .perform(_resultRecorder) as HtmlEntry;
+      } on AnalysisException catch (exception) {
+        throw exception;
+      } catch (exception, stackTrace) {
+        throw new AnalysisException(
+            "Exception", new CaughtException(exception, stackTrace));
+      }
+      state = htmlEntry.getState(descriptor);
+    }
+    return htmlEntry;
+  }
+
+  /**
+   * Given a source for an HTML file, return a cache entry in which the state of
+   * the data represented by the given descriptor is either [CacheState.VALID]
+   * or [CacheState.ERROR]. This method assumes that the data can be produced by
+   * resolving the source if it is not already cached.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  HtmlEntry _cacheHtmlResolutionData(
+      Source source, HtmlEntry htmlEntry, DataDescriptor descriptor) {
+    //
+    // Check to see whether we already have the information being requested.
+    //
+    CacheState state = htmlEntry.getState(descriptor);
+    while (state != CacheState.ERROR && state != CacheState.VALID) {
+      //
+      // If not, compute the information. Unless the modification date of the
+      // source continues to change, this loop will eventually terminate.
+      //
+      htmlEntry = _cacheHtmlParseData(source, htmlEntry, HtmlEntry.PARSED_UNIT);
+      htmlEntry = new ResolveHtmlTask(this, source, htmlEntry.modificationTime,
+              htmlEntry.getValue(HtmlEntry.PARSED_UNIT))
+          .perform(_resultRecorder) as HtmlEntry;
+      state = htmlEntry.getState(descriptor);
+    }
+    return htmlEntry;
+  }
+
+  /**
+   * Remove the given [pendingFuture] from [_pendingFutureSources], since the
+   * client has indicated its computation is not needed anymore.
+   */
+  void _cancelFuture(PendingFuture pendingFuture) {
+    List<PendingFuture> pendingFutures =
+        _pendingFutureSources[pendingFuture.source];
+    if (pendingFutures != null) {
+      pendingFutures.remove(pendingFuture);
+      if (pendingFutures.isEmpty) {
+        _pendingFutureSources.remove(pendingFuture.source);
+      }
+    }
+  }
+
+  /**
+   * Compute the transitive closure of all libraries that depend on the given
+   * [library] by adding such libraries to the given collection of
+   * [librariesToInvalidate].
+   */
+  void _computeAllLibrariesDependingOn(
+      Source library, HashSet<Source> librariesToInvalidate) {
+    if (librariesToInvalidate.add(library)) {
+      for (Source dependentLibrary in getLibrariesDependingOn(library)) {
+        _computeAllLibrariesDependingOn(
+            dependentLibrary, librariesToInvalidate);
+      }
+    }
+  }
+
+  /**
+   * Return the priority that should be used when the source associated with
+   * the given [dartEntry] is added to the work manager.
+   */
+  SourcePriority _computePriority(DartEntry dartEntry) {
+    SourceKind kind = dartEntry.kind;
+    if (kind == SourceKind.LIBRARY) {
+      return SourcePriority.LIBRARY;
+    } else if (kind == SourceKind.PART) {
+      return SourcePriority.NORMAL_PART;
+    }
+    return SourcePriority.UNKNOWN;
+  }
+
+  /**
+   * Given the encoded form of a source ([encoding]), use the source factory to
+   * reconstitute the original source.
+   */
+  Source _computeSourceFromEncoding(String encoding) =>
+      _sourceFactory.fromEncoding(encoding);
+
+  /**
+   * Return `true` if the given list of [sources] contains the given
+   * [targetSource].
+   */
+  bool _contains(List<Source> sources, Source targetSource) {
+    for (Source source in sources) {
+      if (source == targetSource) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given list of [sources] contains any of the given
+   * [targetSources].
+   */
+  bool _containsAny(List<Source> sources, List<Source> targetSources) {
+    for (Source targetSource in targetSources) {
+      if (_contains(sources, targetSource)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Set the contents of the given [source] to the given [contents] and mark the
+   * source as having changed. The additional [offset], [oldLength] and
+   * [newLength] information is used by the context to determine what reanalysis
+   * is necessary. The method [setChangedContents] triggers a source changed
+   * event where as this method does not.
+   */
+  bool _contentRangeChanged(Source source, String contents, int offset,
+      int oldLength, int newLength) {
+    bool changed = false;
+    String originalContents = _contentCache.setContents(source, contents);
+    if (contents != null) {
+      if (contents != originalContents) {
+        if (_options.incremental) {
+          _incrementalAnalysisCache = IncrementalAnalysisCache.update(
+              _incrementalAnalysisCache,
+              source,
+              originalContents,
+              contents,
+              offset,
+              oldLength,
+              newLength,
+              _getReadableSourceEntry(source));
+        }
+        _sourceChanged(source);
+        changed = true;
+        SourceEntry sourceEntry = _cache.get(source);
+        if (sourceEntry != null) {
+          sourceEntry.modificationTime =
+              _contentCache.getModificationStamp(source);
+          sourceEntry.setValue(SourceEntry.CONTENT, contents);
+        }
+      }
+    } else if (originalContents != null) {
+      _incrementalAnalysisCache =
+          IncrementalAnalysisCache.clear(_incrementalAnalysisCache, source);
+      _sourceChanged(source);
+      changed = true;
+    }
+    return changed;
+  }
+
+  /**
+   * Set the contents of the given [source] to the given [contents] and mark the
+   * source as having changed. This has the effect of overriding the default
+   * contents of the source. If the contents are `null` the override is removed
+   * so that the default contents will be returned. If [notify] is true, a
+   * source changed event is triggered.
+   */
+  void _contentsChanged(Source source, String contents, bool notify) {
+    String originalContents = _contentCache.setContents(source, contents);
+    handleContentsChanged(source, originalContents, contents, notify);
+  }
+
+  /**
+   * Create a [GenerateDartErrorsTask] for the given [unitSource], marking the
+   * verification errors as being in-process. The compilation unit and the
+   * library can be the same if the compilation unit is the defining compilation
+   * unit of the library.
+   */
+  AnalysisContextImpl_TaskData _createGenerateDartErrorsTask(Source unitSource,
+      DartEntry unitEntry, Source librarySource, DartEntry libraryEntry) {
+    if (unitEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource) !=
+            CacheState.VALID ||
+        libraryEntry.getState(DartEntry.ELEMENT) != CacheState.VALID) {
+      return _createResolveDartLibraryTask(librarySource, libraryEntry);
+    }
+    CompilationUnit unit =
+        unitEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource);
+    if (unit == null) {
+      CaughtException exception = new CaughtException(
+          new AnalysisException(
+              "Entry has VALID state for RESOLVED_UNIT but null value for ${unitSource.fullName} in ${librarySource.fullName}"),
+          null);
+      AnalysisEngine.instance.logger
+          .logInformation(exception.toString(), exception);
+      unitEntry.recordResolutionError(exception);
+      return new AnalysisContextImpl_TaskData(null, false);
+    }
+    LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
+    return new AnalysisContextImpl_TaskData(
+        new GenerateDartErrorsTask(this, unitSource, unit, libraryElement),
+        false);
+  }
+
+  /**
+   * Create a [GenerateDartHintsTask] for the given [source], marking the hints
+   * as being in-process.
+   */
+  AnalysisContextImpl_TaskData _createGenerateDartHintsTask(Source source,
+      DartEntry dartEntry, Source librarySource, DartEntry libraryEntry) {
+    if (libraryEntry.getState(DartEntry.ELEMENT) != CacheState.VALID) {
+      return _createResolveDartLibraryTask(librarySource, libraryEntry);
+    }
+    LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
+    CompilationUnitElement definingUnit =
+        libraryElement.definingCompilationUnit;
+    List<CompilationUnitElement> parts = libraryElement.parts;
+    List<TimestampedData<CompilationUnit>> units =
+        new List<TimestampedData<CompilationUnit>>(parts.length + 1);
+    units[0] = _getResolvedUnit(definingUnit, librarySource);
+    if (units[0] == null) {
+      // TODO(brianwilkerson) We should return a ResolveDartUnitTask
+      // (unless there are multiple ASTs that need to be resolved).
+      return _createResolveDartLibraryTask(librarySource, libraryEntry);
+    }
+    for (int i = 0; i < parts.length; i++) {
+      units[i + 1] = _getResolvedUnit(parts[i], librarySource);
+      if (units[i + 1] == null) {
+        // TODO(brianwilkerson) We should return a ResolveDartUnitTask
+        // (unless there are multiple ASTs that need to be resolved).
+        return _createResolveDartLibraryTask(librarySource, libraryEntry);
+      }
+    }
+    return new AnalysisContextImpl_TaskData(
+        new GenerateDartHintsTask(this, units, libraryElement), false);
+  }
+
+  /**
+   * Create a [GenerateDartLintsTask] for the given [source], marking the lints
+   * as being in-process.
+   */
+  AnalysisContextImpl_TaskData _createGenerateDartLintsTask(Source source,
+      DartEntry dartEntry, Source librarySource, DartEntry libraryEntry) {
+    if (libraryEntry.getState(DartEntry.ELEMENT) != CacheState.VALID) {
+      return _createResolveDartLibraryTask(librarySource, libraryEntry);
+    }
+    LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
+    CompilationUnitElement definingUnit =
+        libraryElement.definingCompilationUnit;
+    List<CompilationUnitElement> parts = libraryElement.parts;
+    List<TimestampedData<CompilationUnit>> units =
+        new List<TimestampedData<CompilationUnit>>(parts.length + 1);
+    units[0] = _getResolvedUnit(definingUnit, librarySource);
+    if (units[0] == null) {
+      // TODO(brianwilkerson) We should return a ResolveDartUnitTask
+      // (unless there are multiple ASTs that need to be resolved).
+      return _createResolveDartLibraryTask(librarySource, libraryEntry);
+    }
+    for (int i = 0; i < parts.length; i++) {
+      units[i + 1] = _getResolvedUnit(parts[i], librarySource);
+      if (units[i + 1] == null) {
+        // TODO(brianwilkerson) We should return a ResolveDartUnitTask
+        // (unless there are multiple ASTs that need to be resolved).
+        return _createResolveDartLibraryTask(librarySource, libraryEntry);
+      }
+    }
+    //TODO(pquitslund): revisit if we need all units or whether one will do
+    return new AnalysisContextImpl_TaskData(
+        new GenerateDartLintsTask(this, units, libraryElement), false);
+  }
+
+  /**
+   * Create a [GetContentTask] for the given [source], marking the content as
+   * being in-process.
+   */
+  AnalysisContextImpl_TaskData _createGetContentTask(
+      Source source, SourceEntry sourceEntry) {
+    return new AnalysisContextImpl_TaskData(
+        new GetContentTask(this, source), false);
+  }
+
+  /**
+   * Create a [ParseDartTask] for the given [source].
+   */
+  AnalysisContextImpl_TaskData _createParseDartTask(
+      Source source, DartEntry dartEntry) {
+    if (dartEntry.getState(DartEntry.TOKEN_STREAM) != CacheState.VALID ||
+        dartEntry.getState(SourceEntry.LINE_INFO) != CacheState.VALID) {
+      return _createScanDartTask(source, dartEntry);
+    }
+    Token tokenStream = dartEntry.getValue(DartEntry.TOKEN_STREAM);
+    dartEntry.setState(DartEntry.TOKEN_STREAM, CacheState.FLUSHED);
+    return new AnalysisContextImpl_TaskData(
+        new ParseDartTask(this, source, tokenStream,
+            dartEntry.getValue(SourceEntry.LINE_INFO)),
+        false);
+  }
+
+  /**
+   * Create a [ParseHtmlTask] for the given [source].
+   */
+  AnalysisContextImpl_TaskData _createParseHtmlTask(
+      Source source, HtmlEntry htmlEntry) {
+    if (htmlEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) {
+      return _createGetContentTask(source, htmlEntry);
+    }
+    String content = htmlEntry.getValue(SourceEntry.CONTENT);
+    htmlEntry.setState(SourceEntry.CONTENT, CacheState.FLUSHED);
+    return new AnalysisContextImpl_TaskData(
+        new ParseHtmlTask(this, source, content), false);
+  }
+
+  /**
+   * Create a [ResolveDartLibraryTask] for the given [source], marking ? as
+   * being in-process.
+   */
+  AnalysisContextImpl_TaskData _createResolveDartLibraryTask(
+      Source source, DartEntry dartEntry) {
+    try {
+      AnalysisContextImpl_CycleBuilder builder =
+          new AnalysisContextImpl_CycleBuilder(this);
+      PerformanceStatistics.cycles.makeCurrentWhile(() {
+        builder.computeCycleContaining(source);
+      });
+      AnalysisContextImpl_TaskData taskData = builder.taskData;
+      if (taskData != null) {
+        return taskData;
+      }
+      return new AnalysisContextImpl_TaskData(
+          new ResolveDartLibraryCycleTask(
+              this, source, source, builder.librariesInCycle),
+          false);
+    } on AnalysisException catch (exception, stackTrace) {
+      dartEntry
+          .recordResolutionError(new CaughtException(exception, stackTrace));
+      AnalysisEngine.instance.logger.logError(
+          "Internal error trying to create a ResolveDartLibraryTask",
+          new CaughtException(exception, stackTrace));
+    }
+    return new AnalysisContextImpl_TaskData(null, false);
+  }
+
+  /**
+   * Create a [ResolveHtmlTask] for the given [source], marking the resolved
+   * unit as being in-process.
+   */
+  AnalysisContextImpl_TaskData _createResolveHtmlTask(
+      Source source, HtmlEntry htmlEntry) {
+    if (htmlEntry.getState(HtmlEntry.PARSED_UNIT) != CacheState.VALID) {
+      return _createParseHtmlTask(source, htmlEntry);
+    }
+    return new AnalysisContextImpl_TaskData(
+        new ResolveHtmlTask(this, source, htmlEntry.modificationTime,
+            htmlEntry.getValue(HtmlEntry.PARSED_UNIT)),
+        false);
+  }
+
+  /**
+   * Create a [ScanDartTask] for the given [source], marking the scan errors as
+   * being in-process.
+   */
+  AnalysisContextImpl_TaskData _createScanDartTask(
+      Source source, DartEntry dartEntry) {
+    if (dartEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) {
+      return _createGetContentTask(source, dartEntry);
+    }
+    String content = dartEntry.getValue(SourceEntry.CONTENT);
+    dartEntry.setState(SourceEntry.CONTENT, CacheState.FLUSHED);
+    return new AnalysisContextImpl_TaskData(
+        new ScanDartTask(this, source, content), false);
+  }
+
+  /**
+   * Create a source entry for the given [source]. Return the source entry that
+   * was created, or `null` if the source should not be tracked by this context.
+   */
+  SourceEntry _createSourceEntry(Source source, bool explicitlyAdded) {
+    String name = source.shortName;
+    if (AnalysisEngine.isHtmlFileName(name)) {
+      HtmlEntry htmlEntry = new HtmlEntry();
+      htmlEntry.modificationTime = getModificationStamp(source);
+      htmlEntry.explicitlyAdded = explicitlyAdded;
+      _cache.put(source, htmlEntry);
+      if (!explicitlyAdded) {
+        _implicitAnalysisEventsController
+            .add(new ImplicitAnalysisEvent(source, true));
+      }
+      return htmlEntry;
+    } else {
+      DartEntry dartEntry = new DartEntry();
+      dartEntry.modificationTime = getModificationStamp(source);
+      dartEntry.explicitlyAdded = explicitlyAdded;
+      _cache.put(source, dartEntry);
+      if (!explicitlyAdded) {
+        _implicitAnalysisEventsController
+            .add(new ImplicitAnalysisEvent(source, true));
+      }
+      return dartEntry;
+    }
+  }
+
+  /**
+   * Return a list containing all of the change notices that are waiting to be
+   * returned. If there are no notices, then return either `null` or an empty
+   * list, depending on the value of [nullIfEmpty].
+   */
+  List<ChangeNotice> _getChangeNotices(bool nullIfEmpty) {
+    if (_pendingNotices.isEmpty) {
+      if (nullIfEmpty) {
+        return null;
+      }
+      return ChangeNoticeImpl.EMPTY_LIST;
+    }
+    List<ChangeNotice> notices = new List.from(_pendingNotices.values);
+    _pendingNotices.clear();
+    return notices;
+  }
+
+  /**
+   * Given a source for a Dart file and the library that contains it, return the
+   * data represented by the given descriptor that is associated with that
+   * source. This method assumes that the data can be produced by generating
+   * hints for the library if it is not already cached.
+   *
+   * Throws an [AnalysisException] if data could not be returned because the
+   * source could not be resolved.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  Object _getDartHintData(Source unitSource, Source librarySource,
+      DartEntry dartEntry, DataDescriptor descriptor) {
+    dartEntry =
+        _cacheDartHintData(unitSource, librarySource, dartEntry, descriptor);
+    if (identical(descriptor, DartEntry.ELEMENT)) {
+      return dartEntry.getValue(descriptor);
+    }
+    return dartEntry.getValueInLibrary(descriptor, librarySource);
+  }
+
+  /**
+   * Given a source for a Dart file and the library that contains it, return the
+   * data represented by the given descriptor that is associated with that
+   * source. This method assumes that the data can be produced by generating
+   * lints for the library if it is not already cached.
+   *
+   * Throws an [AnalysisException] if data could not be returned because the
+   * source could not be resolved.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  Object _getDartLintData(Source unitSource, Source librarySource,
+      DartEntry dartEntry, DataDescriptor descriptor) {
+    dartEntry =
+        _cacheDartLintData(unitSource, librarySource, dartEntry, descriptor);
+    if (identical(descriptor, DartEntry.ELEMENT)) {
+      return dartEntry.getValue(descriptor);
+    }
+    return dartEntry.getValueInLibrary(descriptor, librarySource);
+  }
+
+  /**
+   * Given a source for a Dart file, return the data represented by the given
+   * descriptor that is associated with that source. This method assumes that
+   * the data can be produced by parsing the source if it is not already cached.
+   *
+   * Throws an [AnalysisException] if data could not be returned because the
+   * source could not be parsed.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  Object _getDartParseData(
+      Source source, DartEntry dartEntry, DataDescriptor descriptor) {
+    dartEntry = _cacheDartParseData(source, dartEntry, descriptor);
+    if (identical(descriptor, DartEntry.PARSED_UNIT)) {
+      _accessedAst(source);
+      return dartEntry.anyParsedCompilationUnit;
+    }
+    return dartEntry.getValue(descriptor);
+  }
+
+  /**
+   * Given a source for a Dart file, return the data represented by the given
+   * descriptor that is associated with that source, or the given default value
+   * if the source is not a Dart file. This method assumes that the data can be
+   * produced by parsing the source if it is not already cached.
+   *
+   * Throws an [AnalysisException] if data could not be returned because the
+   * source could not be parsed.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  Object _getDartParseData2(
+      Source source, DataDescriptor descriptor, Object defaultValue) {
+    DartEntry dartEntry = _getReadableDartEntry(source);
+    if (dartEntry == null) {
+      return defaultValue;
+    }
+    try {
+      return _getDartParseData(source, dartEntry, descriptor);
+    } on ObsoleteSourceAnalysisException catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logInformation(
+          "Could not compute $descriptor",
+          new CaughtException(exception, stackTrace));
+      return defaultValue;
+    }
+  }
+
+  /**
+   * Given a source for a Dart file and the library that contains it, return the
+   * data represented by the given descriptor that is associated with that
+   * source. This method assumes that the data can be produced by resolving the
+   * source in the context of the library if it is not already cached.
+   *
+   * Throws an [AnalysisException] if data could not be returned because the
+   * source could not be resolved.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  Object _getDartResolutionData(Source unitSource, Source librarySource,
+      DartEntry dartEntry, DataDescriptor descriptor) {
+    dartEntry = _cacheDartResolutionData(
+        unitSource, librarySource, dartEntry, descriptor);
+    if (identical(descriptor, DartEntry.ELEMENT)) {
+      return dartEntry.getValue(descriptor);
+    } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
+      _accessedAst(unitSource);
+    }
+    return dartEntry.getValueInLibrary(descriptor, librarySource);
+  }
+
+  /**
+   * Given a source for a Dart file and the library that contains it, return the
+   * data represented by the given descriptor that is associated with that
+   * source, or the given default value if the source is not a Dart file. This
+   * method assumes that the data can be produced by resolving the source in the
+   * context of the library if it is not already cached.
+   *
+   * Throws an [AnalysisException] if data could not be returned because the
+   * source could not be resolved.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  Object _getDartResolutionData2(Source unitSource, Source librarySource,
+      DataDescriptor descriptor, Object defaultValue) {
+    DartEntry dartEntry = _getReadableDartEntry(unitSource);
+    if (dartEntry == null) {
+      return defaultValue;
+    }
+    try {
+      return _getDartResolutionData(
+          unitSource, librarySource, dartEntry, descriptor);
+    } on ObsoleteSourceAnalysisException catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logInformation(
+          "Could not compute $descriptor",
+          new CaughtException(exception, stackTrace));
+      return defaultValue;
+    }
+  }
+
+  /**
+   * Given a source for a Dart file, return the data represented by the given
+   * descriptor that is associated with that source. This method assumes that
+   * the data can be produced by scanning the source if it is not already
+   * cached.
+   *
+   * Throws an [AnalysisException] if data could not be returned because the
+   * source could not be scanned.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  Object _getDartScanData(
+      Source source, DartEntry dartEntry, DataDescriptor descriptor) {
+    dartEntry = _cacheDartScanData(source, dartEntry, descriptor);
+    return dartEntry.getValue(descriptor);
+  }
+
+  /**
+   * Given a source for a Dart file, return the data represented by the given
+   * descriptor that is associated with that source, or the given default value
+   * if the source is not a Dart file. This method assumes that the data can be
+   * produced by scanning the source if it is not already cached.
+   *
+   * Throws an [AnalysisException] if data could not be returned because the
+   * source could not be scanned.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  Object _getDartScanData2(
+      Source source, DataDescriptor descriptor, Object defaultValue) {
+    DartEntry dartEntry = _getReadableDartEntry(source);
+    if (dartEntry == null) {
+      return defaultValue;
+    }
+    try {
+      return _getDartScanData(source, dartEntry, descriptor);
+    } on ObsoleteSourceAnalysisException catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logInformation(
+          "Could not compute $descriptor",
+          new CaughtException(exception, stackTrace));
+      return defaultValue;
+    }
+  }
+
+  /**
+   * Given a source for a Dart file and the library that contains it, return the
+   * data represented by the given descriptor that is associated with that
+   * source. This method assumes that the data can be produced by verifying the
+   * source within the given library if it is not already cached.
+   *
+   * Throws an [AnalysisException] if data could not be returned because the
+   * source could not be resolved.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  Object _getDartVerificationData(Source unitSource, Source librarySource,
+      DartEntry dartEntry, DataDescriptor descriptor) {
+    dartEntry = _cacheDartVerificationData(
+        unitSource, librarySource, dartEntry, descriptor);
+    return dartEntry.getValueInLibrary(descriptor, librarySource);
+  }
+
+  /**
+   * Given a source for an HTML file, return the data represented by the given
+   * descriptor that is associated with that source, or the given default value
+   * if the source is not an HTML file. This method assumes that the data can be
+   * produced by parsing the source if it is not already cached.
+   *
+   * Throws an [AnalysisException] if data could not be returned because the
+   * source could not be parsed.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  Object _getHtmlParseData(
+      Source source, DataDescriptor descriptor, Object defaultValue) {
+    HtmlEntry htmlEntry = _getReadableHtmlEntry(source);
+    if (htmlEntry == null) {
+      return defaultValue;
+    }
+    htmlEntry = _cacheHtmlParseData(source, htmlEntry, descriptor);
+    if (identical(descriptor, HtmlEntry.PARSED_UNIT)) {
+      _accessedAst(source);
+      return htmlEntry.anyParsedUnit;
+    }
+    return htmlEntry.getValue(descriptor);
+  }
+
+  /**
+   * Given a source for an HTML file, return the data represented by the given
+   * descriptor that is associated with that source, or the given default value
+   * if the source is not an HTML file. This method assumes that the data can be
+   * produced by resolving the source if it is not already cached.
+   *
+   * Throws an [AnalysisException] if data could not be returned because the
+   * source could not be resolved.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  Object _getHtmlResolutionData(
+      Source source, DataDescriptor descriptor, Object defaultValue) {
+    HtmlEntry htmlEntry = _getReadableHtmlEntry(source);
+    if (htmlEntry == null) {
+      return defaultValue;
+    }
+    try {
+      return _getHtmlResolutionData2(source, htmlEntry, descriptor);
+    } on ObsoleteSourceAnalysisException catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logInformation(
+          "Could not compute $descriptor",
+          new CaughtException(exception, stackTrace));
+      return defaultValue;
+    }
+  }
+
+  /**
+   * Given a source for an HTML file, return the data represented by the given
+   * descriptor that is associated with that source. This method assumes that
+   * the data can be produced by resolving the source if it is not already
+   * cached.
+   *
+   * Throws an [AnalysisException] if data could not be returned because the
+   * source could not be resolved.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   */
+  Object _getHtmlResolutionData2(
+      Source source, HtmlEntry htmlEntry, DataDescriptor descriptor) {
+    htmlEntry = _cacheHtmlResolutionData(source, htmlEntry, descriptor);
+    if (identical(descriptor, HtmlEntry.RESOLVED_UNIT)) {
+      _accessedAst(source);
+    }
+    return htmlEntry.getValue(descriptor);
+  }
+
+  /**
+   * Look at the given [source] to see whether a task needs to be performed
+   * related to it. Return the task that should be performed, or `null` if there
+   * is no more work to be done for the source.
+   */
+  AnalysisContextImpl_TaskData _getNextAnalysisTaskForSource(
+      Source source,
+      SourceEntry sourceEntry,
+      bool isPriority,
+      bool hintsEnabled,
+      bool lintsEnabled) {
+    // Refuse to generate tasks for html based files that are above 1500 KB
+    if (_isTooBigHtmlSourceEntry(source, sourceEntry)) {
+      // TODO (jwren) we still need to report an error of some kind back to the
+      // client.
+      return new AnalysisContextImpl_TaskData(null, false);
+    }
+    if (sourceEntry == null) {
+      return new AnalysisContextImpl_TaskData(null, false);
+    }
+    CacheState contentState = sourceEntry.getState(SourceEntry.CONTENT);
+    if (contentState == CacheState.INVALID) {
+      return _createGetContentTask(source, sourceEntry);
+    } else if (contentState == CacheState.IN_PROCESS) {
+      // We are already in the process of getting the content.
+      // There's nothing else we can do with this source until that's complete.
+      return new AnalysisContextImpl_TaskData(null, true);
+    } else if (contentState == CacheState.ERROR) {
+      // We have done all of the analysis we can for this source because we
+      // cannot get its content.
+      return new AnalysisContextImpl_TaskData(null, false);
+    }
+    if (sourceEntry is DartEntry) {
+      DartEntry dartEntry = sourceEntry;
+      CacheState scanErrorsState = dartEntry.getState(DartEntry.SCAN_ERRORS);
+      if (scanErrorsState == CacheState.INVALID ||
+          (isPriority && scanErrorsState == CacheState.FLUSHED)) {
+        return _createScanDartTask(source, dartEntry);
+      }
+      CacheState parseErrorsState = dartEntry.getState(DartEntry.PARSE_ERRORS);
+      if (parseErrorsState == CacheState.INVALID ||
+          (isPriority && parseErrorsState == CacheState.FLUSHED)) {
+        return _createParseDartTask(source, dartEntry);
+      }
+      if (isPriority && parseErrorsState != CacheState.ERROR) {
+        if (!dartEntry.hasResolvableCompilationUnit) {
+          return _createParseDartTask(source, dartEntry);
+        }
+      }
+      SourceKind kind = dartEntry.getValue(DartEntry.SOURCE_KIND);
+      if (kind == SourceKind.UNKNOWN) {
+        return _createParseDartTask(source, dartEntry);
+      } else if (kind == SourceKind.LIBRARY) {
+        CacheState elementState = dartEntry.getState(DartEntry.ELEMENT);
+        if (elementState == CacheState.INVALID) {
+          return _createResolveDartLibraryTask(source, dartEntry);
+        }
+      }
+      List<Source> librariesContaining = dartEntry.containingLibraries;
+      for (Source librarySource in librariesContaining) {
+        SourceEntry librarySourceEntry = _cache.get(librarySource);
+        if (librarySourceEntry is DartEntry) {
+          DartEntry libraryEntry = librarySourceEntry;
+          CacheState elementState = libraryEntry.getState(DartEntry.ELEMENT);
+          if (elementState == CacheState.INVALID ||
+              (isPriority && elementState == CacheState.FLUSHED)) {
+//            return createResolveDartLibraryTask(librarySource, (DartEntry) libraryEntry);
+            return new AnalysisContextImpl_TaskData(
+                new ResolveDartLibraryTask(this, source, librarySource), false);
+          }
+          CacheState resolvedUnitState = dartEntry.getStateInLibrary(
+              DartEntry.RESOLVED_UNIT, librarySource);
+          if (resolvedUnitState == CacheState.INVALID ||
+              (isPriority && resolvedUnitState == CacheState.FLUSHED)) {
+            //
+            // The commented out lines below are an optimization that doesn't
+            // quite work yet. The problem is that if the source was not
+            // resolved because it wasn't part of any library, then there won't
+            // be any elements in the element model that we can use to resolve
+            // it.
+            //
+//            LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
+//            if (libraryElement != null) {
+//              return new ResolveDartUnitTask(this, source, libraryElement);
+//            }
+            // Possibly replace with:
+//             return createResolveDartLibraryTask(librarySource, (DartEntry) libraryEntry);
+            return new AnalysisContextImpl_TaskData(
+                new ResolveDartLibraryTask(this, source, librarySource), false);
+          }
+          if (shouldErrorsBeAnalyzed(source, dartEntry)) {
+            CacheState verificationErrorsState = dartEntry.getStateInLibrary(
+                DartEntry.VERIFICATION_ERRORS, librarySource);
+            if (verificationErrorsState == CacheState.INVALID ||
+                (isPriority && verificationErrorsState == CacheState.FLUSHED)) {
+              return _createGenerateDartErrorsTask(
+                  source, dartEntry, librarySource, libraryEntry);
+            }
+            if (hintsEnabled) {
+              CacheState hintsState =
+                  dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource);
+              if (hintsState == CacheState.INVALID ||
+                  (isPriority && hintsState == CacheState.FLUSHED)) {
+                return _createGenerateDartHintsTask(
+                    source, dartEntry, librarySource, libraryEntry);
+              }
+            }
+            if (lintsEnabled) {
+              CacheState lintsState =
+                  dartEntry.getStateInLibrary(DartEntry.LINTS, librarySource);
+              if (lintsState == CacheState.INVALID ||
+                  (isPriority && lintsState == CacheState.FLUSHED)) {
+                return _createGenerateDartLintsTask(
+                    source, dartEntry, librarySource, libraryEntry);
+              }
+            }
+          }
+        }
+      }
+    } else if (sourceEntry is HtmlEntry) {
+      HtmlEntry htmlEntry = sourceEntry;
+      CacheState parseErrorsState = htmlEntry.getState(HtmlEntry.PARSE_ERRORS);
+      if (parseErrorsState == CacheState.INVALID ||
+          (isPriority && parseErrorsState == CacheState.FLUSHED)) {
+        return _createParseHtmlTask(source, htmlEntry);
+      }
+      if (isPriority && parseErrorsState != CacheState.ERROR) {
+        ht.HtmlUnit parsedUnit = htmlEntry.anyParsedUnit;
+        if (parsedUnit == null) {
+          return _createParseHtmlTask(source, htmlEntry);
+        }
+      }
+      CacheState resolvedUnitState =
+          htmlEntry.getState(HtmlEntry.RESOLVED_UNIT);
+      if (resolvedUnitState == CacheState.INVALID ||
+          (isPriority && resolvedUnitState == CacheState.FLUSHED)) {
+        return _createResolveHtmlTask(source, htmlEntry);
+      }
+    }
+    return new AnalysisContextImpl_TaskData(null, false);
+  }
+
+  /**
+   * Return the cache entry associated with the given [source], or `null` if the
+   * source is not a Dart file.
+   *
+   * @param source the source for which a cache entry is being sought
+   * @return the source cache entry associated with the given source
+   */
+  DartEntry _getReadableDartEntry(Source source) {
+    SourceEntry sourceEntry = _cache.get(source);
+    if (sourceEntry == null) {
+      sourceEntry = _createSourceEntry(source, false);
+    }
+    if (sourceEntry is DartEntry) {
+      return sourceEntry;
+    }
+    return null;
+  }
+
+  /**
+   * Return the cache entry associated with the given [source], or `null` if the
+   * source is not an HTML file.
+   */
+  HtmlEntry _getReadableHtmlEntry(Source source) {
+    SourceEntry sourceEntry = _cache.get(source);
+    if (sourceEntry == null) {
+      sourceEntry = _createSourceEntry(source, false);
+    }
+    if (sourceEntry is HtmlEntry) {
+      return sourceEntry;
+    }
+    return null;
+  }
+
+  /**
+   * Return the cache entry associated with the given [source], creating it if
+   * necessary.
+   */
+  SourceEntry _getReadableSourceEntry(Source source) {
+    SourceEntry sourceEntry = _cache.get(source);
+    if (sourceEntry == null) {
+      sourceEntry = _createSourceEntry(source, false);
+    }
+    return sourceEntry;
+  }
+
+  /**
+   * Return a resolved compilation unit corresponding to the given [element] in
+   * the library defined by the given [librarySource], or `null` if the
+   * information is not cached.
+   */
+  TimestampedData<CompilationUnit> _getResolvedUnit(
+      CompilationUnitElement element, Source librarySource) {
+    SourceEntry sourceEntry = _cache.get(element.source);
+    if (sourceEntry is DartEntry) {
+      DartEntry dartEntry = sourceEntry;
+      if (dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource) ==
+          CacheState.VALID) {
+        return new TimestampedData<CompilationUnit>(
+            dartEntry.modificationTime,
+            dartEntry.getValueInLibrary(
+                DartEntry.RESOLVED_UNIT, librarySource));
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return a list containing all of the sources known to this context that have
+   * the given [kind].
+   */
+  List<Source> _getSources(SourceKind kind) {
+    List<Source> sources = new List<Source>();
+    MapIterator<Source, SourceEntry> iterator = _cache.iterator();
+    while (iterator.moveNext()) {
+      if (iterator.value.kind == kind) {
+        sources.add(iterator.key);
+      }
+    }
+    return sources;
+  }
+
+  /**
+   * Look at the given [source] to see whether a task needs to be performed
+   * related to it. If so, add the source to the set of sources that need to be
+   * processed. This method duplicates, and must therefore be kept in sync with,
+   * [_getNextAnalysisTaskForSource]. This method is intended to be used for
+   * testing purposes only.
+   */
+  void _getSourcesNeedingProcessing(
+      Source source,
+      SourceEntry sourceEntry,
+      bool isPriority,
+      bool hintsEnabled,
+      bool lintsEnabled,
+      HashSet<Source> sources) {
+    if (sourceEntry is DartEntry) {
+      DartEntry dartEntry = sourceEntry;
+      CacheState scanErrorsState = dartEntry.getState(DartEntry.SCAN_ERRORS);
+      if (scanErrorsState == CacheState.INVALID ||
+          (isPriority && scanErrorsState == CacheState.FLUSHED)) {
+        sources.add(source);
+        return;
+      }
+      CacheState parseErrorsState = dartEntry.getState(DartEntry.PARSE_ERRORS);
+      if (parseErrorsState == CacheState.INVALID ||
+          (isPriority && parseErrorsState == CacheState.FLUSHED)) {
+        sources.add(source);
+        return;
+      }
+      if (isPriority) {
+        if (!dartEntry.hasResolvableCompilationUnit) {
+          sources.add(source);
+          return;
+        }
+      }
+      for (Source librarySource in getLibrariesContaining(source)) {
+        SourceEntry libraryEntry = _cache.get(librarySource);
+        if (libraryEntry is DartEntry) {
+          CacheState elementState = libraryEntry.getState(DartEntry.ELEMENT);
+          if (elementState == CacheState.INVALID ||
+              (isPriority && elementState == CacheState.FLUSHED)) {
+            sources.add(source);
+            return;
+          }
+          CacheState resolvedUnitState = dartEntry.getStateInLibrary(
+              DartEntry.RESOLVED_UNIT, librarySource);
+          if (resolvedUnitState == CacheState.INVALID ||
+              (isPriority && resolvedUnitState == CacheState.FLUSHED)) {
+            LibraryElement libraryElement =
+                libraryEntry.getValue(DartEntry.ELEMENT);
+            if (libraryElement != null) {
+              sources.add(source);
+              return;
+            }
+          }
+          if (shouldErrorsBeAnalyzed(source, dartEntry)) {
+            CacheState verificationErrorsState = dartEntry.getStateInLibrary(
+                DartEntry.VERIFICATION_ERRORS, librarySource);
+            if (verificationErrorsState == CacheState.INVALID ||
+                (isPriority && verificationErrorsState == CacheState.FLUSHED)) {
+              LibraryElement libraryElement =
+                  libraryEntry.getValue(DartEntry.ELEMENT);
+              if (libraryElement != null) {
+                sources.add(source);
+                return;
+              }
+            }
+            if (hintsEnabled) {
+              CacheState hintsState =
+                  dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource);
+              if (hintsState == CacheState.INVALID ||
+                  (isPriority && hintsState == CacheState.FLUSHED)) {
+                LibraryElement libraryElement =
+                    libraryEntry.getValue(DartEntry.ELEMENT);
+                if (libraryElement != null) {
+                  sources.add(source);
+                  return;
+                }
+              }
+            }
+            if (lintsEnabled) {
+              CacheState lintsState =
+                  dartEntry.getStateInLibrary(DartEntry.LINTS, librarySource);
+              if (lintsState == CacheState.INVALID ||
+                  (isPriority && lintsState == CacheState.FLUSHED)) {
+                LibraryElement libraryElement =
+                    libraryEntry.getValue(DartEntry.ELEMENT);
+                if (libraryElement != null) {
+                  sources.add(source);
+                  return;
+                }
+              }
+            }
+          }
+        }
+      }
+    } else if (sourceEntry is HtmlEntry) {
+      HtmlEntry htmlEntry = sourceEntry;
+      CacheState parsedUnitState = htmlEntry.getState(HtmlEntry.PARSED_UNIT);
+      if (parsedUnitState == CacheState.INVALID ||
+          (isPriority && parsedUnitState == CacheState.FLUSHED)) {
+        sources.add(source);
+        return;
+      }
+      CacheState resolvedUnitState =
+          htmlEntry.getState(HtmlEntry.RESOLVED_UNIT);
+      if (resolvedUnitState == CacheState.INVALID ||
+          (isPriority && resolvedUnitState == CacheState.FLUSHED)) {
+        sources.add(source);
+        return;
+      }
+    }
+  }
+
+  /**
+   * Invalidate all of the resolution results computed by this context. The flag
+   * [invalidateUris] should be `true` if the cached results of converting URIs
+   * to source files should also be invalidated.
+   */
+  void _invalidateAllLocalResolutionInformation(bool invalidateUris) {
+    HashMap<Source, List<Source>> oldPartMap =
+        new HashMap<Source, List<Source>>();
+    MapIterator<Source, SourceEntry> iterator = _privatePartition.iterator();
+    while (iterator.moveNext()) {
+      Source source = iterator.key;
+      SourceEntry sourceEntry = iterator.value;
+      if (sourceEntry is HtmlEntry) {
+        HtmlEntry htmlEntry = sourceEntry;
+        htmlEntry.invalidateAllResolutionInformation(invalidateUris);
+        iterator.value = htmlEntry;
+        _workManager.add(source, SourcePriority.HTML);
+      } else if (sourceEntry is DartEntry) {
+        DartEntry dartEntry = sourceEntry;
+        oldPartMap[source] = dartEntry.getValue(DartEntry.INCLUDED_PARTS);
+        dartEntry.invalidateAllResolutionInformation(invalidateUris);
+        iterator.value = dartEntry;
+        _workManager.add(source, _computePriority(dartEntry));
+      }
+    }
+    _removeFromPartsUsingMap(oldPartMap);
+  }
+
+  /**
+   * In response to a change to at least one of the compilation units in the
+   * library defined by the given [librarySource], invalidate any results that
+   * are dependent on the result of resolving that library.
+   *
+   * <b>Note:</b> Any cache entries that were accessed before this method was
+   * invoked must be re-accessed after this method returns.
+   */
+  void _invalidateLibraryResolution(Source librarySource) {
+    // TODO(brianwilkerson) This could be optimized. There's no need to flush
+    // all of these entries if the public namespace hasn't changed, which will
+    // be a fairly common case. The question is whether we can afford the time
+    // to compute the namespace to look for differences.
+    DartEntry libraryEntry = _getReadableDartEntry(librarySource);
+    if (libraryEntry != null) {
+      List<Source> includedParts =
+          libraryEntry.getValue(DartEntry.INCLUDED_PARTS);
+      libraryEntry.invalidateAllResolutionInformation(false);
+      _workManager.add(librarySource, SourcePriority.LIBRARY);
+      for (Source partSource in includedParts) {
+        SourceEntry partEntry = _cache.get(partSource);
+        if (partEntry is DartEntry) {
+          partEntry.invalidateAllResolutionInformation(false);
+        }
+      }
+    }
+  }
+
+  /**
+   * Return `true` if the given [library] is, or depends on, 'dart:html'. The
+   * [visitedLibraries] is a collection of the libraries that have been visited,
+   * used to prevent infinite recursion.
+   */
+  bool _isClient(LibraryElement library, Source htmlSource,
+      HashSet<LibraryElement> visitedLibraries) {
+    if (visitedLibraries.contains(library)) {
+      return false;
+    }
+    if (library.source == htmlSource) {
+      return true;
+    }
+    visitedLibraries.add(library);
+    for (LibraryElement imported in library.importedLibraries) {
+      if (_isClient(imported, htmlSource, visitedLibraries)) {
+        return true;
+      }
+    }
+    for (LibraryElement exported in library.exportedLibraries) {
+      if (_isClient(exported, htmlSource, visitedLibraries)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  bool _isTooBigHtmlSourceEntry(Source source, SourceEntry sourceEntry) =>
+      false;
+
+//  /**
+//   * Notify all of the analysis listeners that the given source is no longer included in the set of
+//   * sources that are being analyzed.
+//   *
+//   * @param source the source that is no longer being analyzed
+//   */
+//  void _notifyExcludedSource(Source source) {
+//    int count = _listeners.length;
+//    for (int i = 0; i < count; i++) {
+//      _listeners[i].excludedSource(this, source);
+//    }
+//  }
+
+//  /**
+//   * Notify all of the analysis listeners that the given source is now included in the set of
+//   * sources that are being analyzed.
+//   *
+//   * @param source the source that is now being analyzed
+//   */
+//  void _notifyIncludedSource(Source source) {
+//    int count = _listeners.length;
+//    for (int i = 0; i < count; i++) {
+//      _listeners[i].includedSource(this, source);
+//    }
+//  }
+
+//  /**
+//   * Notify all of the analysis listeners that the given Dart source was parsed.
+//   *
+//   * @param source the source that was parsed
+//   * @param unit the result of parsing the source
+//   */
+//  void _notifyParsedDart(Source source, CompilationUnit unit) {
+//    int count = _listeners.length;
+//    for (int i = 0; i < count; i++) {
+//      _listeners[i].parsedDart(this, source, unit);
+//    }
+//  }
+
+//  /**
+//   * Notify all of the analysis listeners that the given HTML source was parsed.
+//   *
+//   * @param source the source that was parsed
+//   * @param unit the result of parsing the source
+//   */
+//  void _notifyParsedHtml(Source source, ht.HtmlUnit unit) {
+//    int count = _listeners.length;
+//    for (int i = 0; i < count; i++) {
+//      _listeners[i].parsedHtml(this, source, unit);
+//    }
+//  }
+
+//  /**
+//   * Notify all of the analysis listeners that the given Dart source was resolved.
+//   *
+//   * @param source the source that was resolved
+//   * @param unit the result of resolving the source
+//   */
+//  void _notifyResolvedDart(Source source, CompilationUnit unit) {
+//    int count = _listeners.length;
+//    for (int i = 0; i < count; i++) {
+//      _listeners[i].resolvedDart(this, source, unit);
+//    }
+//  }
+
+//  /**
+//   * Notify all of the analysis listeners that the given HTML source was resolved.
+//   *
+//   * @param source the source that was resolved
+//   * @param unit the result of resolving the source
+//   */
+//  void _notifyResolvedHtml(Source source, ht.HtmlUnit unit) {
+//    int count = _listeners.length;
+//    for (int i = 0; i < count; i++) {
+//      _listeners[i].resolvedHtml(this, source, unit);
+//    }
+//  }
+
+  /**
+   * Log the given debugging [message].
+   */
+  void _logInformation(String message) {
+    AnalysisEngine.instance.logger.logInformation(message);
+  }
+
+  /**
+   * Notify all of the analysis listeners that a task is about to be performed.
+   */
+  void _notifyAboutToPerformTask(String taskDescription) {
+    int count = _listeners.length;
+    for (int i = 0; i < count; i++) {
+      _listeners[i].aboutToPerformTask(this, taskDescription);
+    }
+  }
+
+  /**
+   * Notify all of the analysis listeners that the errors associated with the
+   * given [source] has been updated to the given [errors].
+   */
+  void _notifyErrors(
+      Source source, List<AnalysisError> errors, LineInfo lineInfo) {
+    int count = _listeners.length;
+    for (int i = 0; i < count; i++) {
+      _listeners[i].computedErrors(this, source, errors, lineInfo);
+    }
+  }
+
+  /**
+   * Given that the given [source] (with the corresponding [sourceEntry]) has
+   * been invalidated, invalidate all of the libraries that depend on it.
+   */
+  void _propagateInvalidation(Source source, SourceEntry sourceEntry) {
+    if (sourceEntry is HtmlEntry) {
+      HtmlEntry htmlEntry = sourceEntry;
+      htmlEntry.modificationTime = getModificationStamp(source);
+      htmlEntry.invalidateAllInformation();
+      _cache.removedAst(source);
+      _workManager.add(source, SourcePriority.HTML);
+    } else if (sourceEntry is DartEntry) {
+      List<Source> containingLibraries = getLibrariesContaining(source);
+      List<Source> dependentLibraries = getLibrariesDependingOn(source);
+      HashSet<Source> librariesToInvalidate = new HashSet<Source>();
+      for (Source containingLibrary in containingLibraries) {
+        _computeAllLibrariesDependingOn(
+            containingLibrary, librariesToInvalidate);
+      }
+      for (Source dependentLibrary in dependentLibraries) {
+        _computeAllLibrariesDependingOn(
+            dependentLibrary, librariesToInvalidate);
+      }
+      for (Source library in librariesToInvalidate) {
+        _invalidateLibraryResolution(library);
+      }
+      DartEntry dartEntry = _cache.get(source);
+      _removeFromParts(source, dartEntry);
+      dartEntry.modificationTime = getModificationStamp(source);
+      dartEntry.invalidateAllInformation();
+      _cache.removedAst(source);
+      _workManager.add(source, SourcePriority.UNKNOWN);
+    }
+    // reset unit in the notification, it is out of date now
+    ChangeNoticeImpl notice = _pendingNotices[source];
+    if (notice != null) {
+      notice.resolvedDartUnit = null;
+      notice.resolvedHtmlUnit = null;
+    }
+  }
+
+  /**
+   * Given a [dartEntry] and a [library] element, record the library element and
+   * other information gleaned from the element in the cache entry.
+   */
+  void _recordElementData(DartEntry dartEntry, LibraryElement library,
+      Source librarySource, Source htmlSource) {
+    dartEntry.setValue(DartEntry.ELEMENT, library);
+    dartEntry.setValue(DartEntry.IS_LAUNCHABLE, library.entryPoint != null);
+    dartEntry.setValue(DartEntry.IS_CLIENT,
+        _isClient(library, htmlSource, new HashSet<LibraryElement>()));
+  }
+
+  /**
+   * Record the results produced by performing a [task] and return the cache
+   * entry associated with the results.
+   */
+  DartEntry _recordGenerateDartErrorsTask(GenerateDartErrorsTask task) {
+    Source source = task.source;
+    DartEntry dartEntry = _cache.get(source);
+    Source librarySource = task.libraryElement.source;
+    CaughtException thrownException = task.exception;
+    if (thrownException != null) {
+      dartEntry.recordVerificationErrorInLibrary(
+          librarySource, thrownException);
+      throw new AnalysisException('<rethrow>', thrownException);
+    }
+    dartEntry.setValueInLibrary(
+        DartEntry.VERIFICATION_ERRORS, librarySource, task.errors);
+    ChangeNoticeImpl notice = getNotice(source);
+    LineInfo lineInfo = dartEntry.getValue(SourceEntry.LINE_INFO);
+    notice.setErrors(dartEntry.allErrors, lineInfo);
+    return dartEntry;
+  }
+
+  /**
+   * Record the results produced by performing a [task] and return the cache
+   * entry associated with the results.
+   */
+  DartEntry _recordGenerateDartHintsTask(GenerateDartHintsTask task) {
+    Source librarySource = task.libraryElement.source;
+    CaughtException thrownException = task.exception;
+    DartEntry libraryEntry = null;
+    HashMap<Source, List<AnalysisError>> hintMap = task.hintMap;
+    if (hintMap == null) {
+      // We don't have any information about which sources to mark as invalid
+      // other than the library source.
+      DartEntry libraryEntry = _cache.get(librarySource);
+      if (thrownException == null) {
+        String message = "GenerateDartHintsTask returned a null hint map "
+            "without throwing an exception: ${librarySource.fullName}";
+        thrownException =
+            new CaughtException(new AnalysisException(message), null);
+      }
+      libraryEntry.recordHintErrorInLibrary(librarySource, thrownException);
+      throw new AnalysisException('<rethrow>', thrownException);
+    }
+    hintMap.forEach((Source unitSource, List<AnalysisError> hints) {
+      DartEntry dartEntry = _cache.get(unitSource);
+      if (unitSource == librarySource) {
+        libraryEntry = dartEntry;
+      }
+      if (thrownException == null) {
+        dartEntry.setValueInLibrary(DartEntry.HINTS, librarySource, hints);
+        ChangeNoticeImpl notice = getNotice(unitSource);
+        LineInfo lineInfo = dartEntry.getValue(SourceEntry.LINE_INFO);
+        notice.setErrors(dartEntry.allErrors, lineInfo);
+      } else {
+        dartEntry.recordHintErrorInLibrary(librarySource, thrownException);
+      }
+    });
+    if (thrownException != null) {
+      throw new AnalysisException('<rethrow>', thrownException);
+    }
+    return libraryEntry;
+  }
+
+  /**
+   * Record the results produced by performing a [task] and return the cache
+   * entry associated with the results.
+   */
+  DartEntry _recordGenerateDartLintsTask(GenerateDartLintsTask task) {
+    Source librarySource = task.libraryElement.source;
+    CaughtException thrownException = task.exception;
+    DartEntry libraryEntry = null;
+    HashMap<Source, List<AnalysisError>> lintMap = task.lintMap;
+    if (lintMap == null) {
+      // We don't have any information about which sources to mark as invalid
+      // other than the library source.
+      DartEntry libraryEntry = _cache.get(librarySource);
+      if (thrownException == null) {
+        String message = "GenerateDartLintsTask returned a null lint map "
+            "without throwing an exception: ${librarySource.fullName}";
+        thrownException =
+            new CaughtException(new AnalysisException(message), null);
+      }
+      libraryEntry.recordLintErrorInLibrary(librarySource, thrownException);
+      throw new AnalysisException('<rethrow>', thrownException);
+    }
+    lintMap.forEach((Source unitSource, List<AnalysisError> lints) {
+      DartEntry dartEntry = _cache.get(unitSource);
+      if (unitSource == librarySource) {
+        libraryEntry = dartEntry;
+      }
+      if (thrownException == null) {
+        dartEntry.setValueInLibrary(DartEntry.LINTS, librarySource, lints);
+        ChangeNoticeImpl notice = getNotice(unitSource);
+        LineInfo lineInfo = dartEntry.getValue(SourceEntry.LINE_INFO);
+        notice.setErrors(dartEntry.allErrors, lineInfo);
+      } else {
+        dartEntry.recordLintErrorInLibrary(librarySource, thrownException);
+      }
+    });
+    if (thrownException != null) {
+      throw new AnalysisException('<rethrow>', thrownException);
+    }
+    return libraryEntry;
+  }
+
+  /**
+   * Record the results produced by performing a [task] and return the cache
+   * entry associated with the results.
+   */
+  SourceEntry _recordGetContentsTask(GetContentTask task) {
+    if (!task.isComplete) {
+      return null;
+    }
+    Source source = task.source;
+    SourceEntry sourceEntry = _cache.get(source);
+    CaughtException thrownException = task.exception;
+    if (thrownException != null) {
+      sourceEntry.recordContentError(thrownException);
+      {
+        sourceEntry.setValue(SourceEntry.CONTENT_ERRORS, task.errors);
+        ChangeNoticeImpl notice = getNotice(source);
+        notice.setErrors(sourceEntry.allErrors, null);
+      }
+      _workManager.remove(source);
+      throw new AnalysisException('<rethrow>', thrownException);
+    }
+    sourceEntry.modificationTime = task.modificationTime;
+    sourceEntry.setValue(SourceEntry.CONTENT, task.content);
+    return sourceEntry;
+  }
+
+  /**
+   * Record the results produced by performing a [task] and return the cache
+   * entry associated with the results.
+   */
+  DartEntry _recordIncrementalAnalysisTaskResults(
+      IncrementalAnalysisTask task) {
+    CompilationUnit unit = task.compilationUnit;
+    if (unit != null) {
+      ChangeNoticeImpl notice = getNotice(task.source);
+      notice.resolvedDartUnit = unit;
+      _incrementalAnalysisCache =
+          IncrementalAnalysisCache.cacheResult(task.cache, unit);
+    }
+    return null;
+  }
+
+  /**
+   * Record the results produced by performing a [task] and return the cache
+   * entry associated with the results.
+   */
+  DartEntry _recordParseDartTaskResults(ParseDartTask task) {
+    Source source = task.source;
+    DartEntry dartEntry = _cache.get(source);
+    _removeFromParts(source, dartEntry);
+    CaughtException thrownException = task.exception;
+    if (thrownException != null) {
+      _removeFromParts(source, dartEntry);
+      dartEntry.recordParseError(thrownException);
+      _cache.removedAst(source);
+      throw new AnalysisException('<rethrow>', thrownException);
+    }
+    if (task.hasNonPartOfDirective) {
+      dartEntry.setValue(DartEntry.SOURCE_KIND, SourceKind.LIBRARY);
+      dartEntry.containingLibrary = source;
+      _workManager.add(source, SourcePriority.LIBRARY);
+    } else if (task.hasPartOfDirective) {
+      dartEntry.setValue(DartEntry.SOURCE_KIND, SourceKind.PART);
+      dartEntry.removeContainingLibrary(source);
+      _workManager.add(source, SourcePriority.NORMAL_PART);
+    } else {
+      // The file contains no directives.
+      List<Source> containingLibraries = dartEntry.containingLibraries;
+      if (containingLibraries.length > 1 ||
+          (containingLibraries.length == 1 &&
+              containingLibraries[0] != source)) {
+        dartEntry.setValue(DartEntry.SOURCE_KIND, SourceKind.PART);
+        dartEntry.removeContainingLibrary(source);
+        _workManager.add(source, SourcePriority.NORMAL_PART);
+      } else {
+        dartEntry.setValue(DartEntry.SOURCE_KIND, SourceKind.LIBRARY);
+        dartEntry.containingLibrary = source;
+        _workManager.add(source, SourcePriority.LIBRARY);
+      }
+    }
+    List<Source> newParts = task.includedSources;
+    for (int i = 0; i < newParts.length; i++) {
+      Source partSource = newParts[i];
+      DartEntry partEntry = _getReadableDartEntry(partSource);
+      if (partEntry != null && !identical(partEntry, dartEntry)) {
+        // TODO(brianwilkerson) Change the kind of the "part" if it was marked
+        // as a library and it has no directives.
+        partEntry.addContainingLibrary(source);
+      }
+    }
+    dartEntry.setValue(DartEntry.PARSED_UNIT, task.compilationUnit);
+    dartEntry.setValue(DartEntry.PARSE_ERRORS, task.errors);
+    dartEntry.setValue(DartEntry.EXPORTED_LIBRARIES, task.exportedSources);
+    dartEntry.setValue(DartEntry.IMPORTED_LIBRARIES, task.importedSources);
+    dartEntry.setValue(DartEntry.INCLUDED_PARTS, newParts);
+    _cache.storedAst(source);
+    ChangeNoticeImpl notice = getNotice(source);
+    if (notice.resolvedDartUnit == null) {
+      notice.parsedDartUnit = task.compilationUnit;
+    }
+    notice.setErrors(dartEntry.allErrors, task.lineInfo);
+    // Verify that the incrementally parsed and resolved unit in the incremental
+    // cache is structurally equivalent to the fully parsed unit
+    _incrementalAnalysisCache = IncrementalAnalysisCache.verifyStructure(
+        _incrementalAnalysisCache, source, task.compilationUnit);
+    return dartEntry;
+  }
+
+  /**
+   * Record the results produced by performing a [task] and return the cache
+   * entry associated with the results.
+   */
+  HtmlEntry _recordParseHtmlTaskResults(ParseHtmlTask task) {
+    Source source = task.source;
+    HtmlEntry htmlEntry = _cache.get(source);
+    CaughtException thrownException = task.exception;
+    if (thrownException != null) {
+      htmlEntry.recordParseError(thrownException);
+      _cache.removedAst(source);
+      throw new AnalysisException('<rethrow>', thrownException);
+    }
+    LineInfo lineInfo = task.lineInfo;
+    htmlEntry.setValue(SourceEntry.LINE_INFO, lineInfo);
+    htmlEntry.setValue(HtmlEntry.PARSED_UNIT, task.htmlUnit);
+    htmlEntry.setValue(HtmlEntry.PARSE_ERRORS, task.errors);
+    htmlEntry.setValue(
+        HtmlEntry.REFERENCED_LIBRARIES, task.referencedLibraries);
+    _cache.storedAst(source);
+    ChangeNoticeImpl notice = getNotice(source);
+    notice.setErrors(htmlEntry.allErrors, lineInfo);
+    return htmlEntry;
+  }
+
+  /**
+   * Record the results produced by performing a [task] and return the cache
+   * entry associated with the results.
+   */
+  DartEntry _recordResolveDartUnitTaskResults(ResolveDartUnitTask task) {
+    Source unitSource = task.source;
+    DartEntry dartEntry = _cache.get(unitSource);
+    Source librarySource = task.librarySource;
+    CaughtException thrownException = task.exception;
+    if (thrownException != null) {
+      dartEntry.recordResolutionErrorInLibrary(librarySource, thrownException);
+      _cache.removedAst(unitSource);
+      throw new AnalysisException('<rethrow>', thrownException);
+    }
+    dartEntry.setValueInLibrary(
+        DartEntry.RESOLVED_UNIT, librarySource, task.resolvedUnit);
+    _cache.storedAst(unitSource);
+    return dartEntry;
+  }
+
+  /**
+   * Record the results produced by performing a [task] and return the cache
+   * entry associated with the results.
+   */
+  HtmlEntry _recordResolveHtmlTaskResults(ResolveHtmlTask task) {
+    Source source = task.source;
+    HtmlEntry htmlEntry = _cache.get(source);
+    CaughtException thrownException = task.exception;
+    if (thrownException != null) {
+      htmlEntry.recordResolutionError(thrownException);
+      _cache.removedAst(source);
+      throw new AnalysisException('<rethrow>', thrownException);
+    }
+    htmlEntry.setState(HtmlEntry.PARSED_UNIT, CacheState.FLUSHED);
+    htmlEntry.setValue(HtmlEntry.RESOLVED_UNIT, task.resolvedUnit);
+    htmlEntry.setValue(HtmlEntry.ELEMENT, task.element);
+    htmlEntry.setValue(HtmlEntry.RESOLUTION_ERRORS, task.resolutionErrors);
+    _cache.storedAst(source);
+    ChangeNoticeImpl notice = getNotice(source);
+    notice.resolvedHtmlUnit = task.resolvedUnit;
+    LineInfo lineInfo = htmlEntry.getValue(SourceEntry.LINE_INFO);
+    notice.setErrors(htmlEntry.allErrors, lineInfo);
+    return htmlEntry;
+  }
+
+  /**
+   * Record the results produced by performing a [task] and return the cache
+   * entry associated with the results.
+   */
+  DartEntry _recordScanDartTaskResults(ScanDartTask task) {
+    Source source = task.source;
+    DartEntry dartEntry = _cache.get(source);
+    CaughtException thrownException = task.exception;
+    if (thrownException != null) {
+      _removeFromParts(source, dartEntry);
+      dartEntry.recordScanError(thrownException);
+      _cache.removedAst(source);
+      throw new AnalysisException('<rethrow>', thrownException);
+    }
+    LineInfo lineInfo = task.lineInfo;
+    dartEntry.setValue(SourceEntry.LINE_INFO, lineInfo);
+    dartEntry.setValue(DartEntry.TOKEN_STREAM, task.tokenStream);
+    dartEntry.setValue(DartEntry.SCAN_ERRORS, task.errors);
+    _cache.storedAst(source);
+    ChangeNoticeImpl notice = getNotice(source);
+    notice.setErrors(dartEntry.allErrors, lineInfo);
+    return dartEntry;
+  }
+
+  void _removeFromCache(Source source) {
+    SourceEntry entry = _cache.remove(source);
+    if (entry != null && !entry.explicitlyAdded) {
+      _implicitAnalysisEventsController
+          .add(new ImplicitAnalysisEvent(source, false));
+    }
+  }
+
+  /**
+   * Remove the given [librarySource] from the list of containing libraries for
+   * all of the parts referenced by the given [dartEntry].
+   */
+  void _removeFromParts(Source librarySource, DartEntry dartEntry) {
+    List<Source> oldParts = dartEntry.getValue(DartEntry.INCLUDED_PARTS);
+    for (int i = 0; i < oldParts.length; i++) {
+      Source partSource = oldParts[i];
+      DartEntry partEntry = _getReadableDartEntry(partSource);
+      if (partEntry != null && !identical(partEntry, dartEntry)) {
+        partEntry.removeContainingLibrary(librarySource);
+        if (partEntry.containingLibraries.length == 0 && !exists(partSource)) {
+          _removeFromCache(partSource);
+        }
+      }
+    }
+  }
+
+  /**
+   * Remove the given libraries that are keys in the given map from the list of
+   * containing libraries for each of the parts in the corresponding value.
+   */
+  void _removeFromPartsUsingMap(HashMap<Source, List<Source>> oldPartMap) {
+    oldPartMap.forEach((Source librarySource, List<Source> oldParts) {
+      for (int i = 0; i < oldParts.length; i++) {
+        Source partSource = oldParts[i];
+        if (partSource != librarySource) {
+          DartEntry partEntry = _getReadableDartEntry(partSource);
+          if (partEntry != null) {
+            partEntry.removeContainingLibrary(librarySource);
+            if (partEntry.containingLibraries.length == 0 &&
+                !exists(partSource)) {
+              _removeFromCache(partSource);
+            }
+          }
+        }
+      }
+    });
+  }
+
+  /**
+   * Remove the given [source] from the priority order if it is in the list.
+   */
+  void _removeFromPriorityOrder(Source source) {
+    int count = _priorityOrder.length;
+    List<Source> newOrder = new List<Source>();
+    for (int i = 0; i < count; i++) {
+      if (_priorityOrder[i] != source) {
+        newOrder.add(_priorityOrder[i]);
+      }
+    }
+    if (newOrder.length < count) {
+      analysisPriorityOrder = newOrder;
+    }
+  }
+
+  /**
+   * Create an entry for the newly added [source] and invalidate any sources
+   * that referenced the source before it existed.
+   */
+  void _sourceAvailable(Source source) {
+    // TODO(brianwilkerson) This method needs to check whether the source was
+    // previously being implicitly analyzed. If so, the cache entry needs to be
+    // update to reflect the new status and an event needs to be generated to
+    // inform clients that it is no longer being implicitly analyzed.
+    SourceEntry sourceEntry = _cache.get(source);
+    if (sourceEntry == null) {
+      sourceEntry = _createSourceEntry(source, true);
+    } else {
+      _propagateInvalidation(source, sourceEntry);
+      sourceEntry = _cache.get(source);
+    }
+    if (sourceEntry is HtmlEntry) {
+      _workManager.add(source, SourcePriority.HTML);
+    } else if (sourceEntry is DartEntry) {
+      _workManager.add(source, _computePriority(sourceEntry));
+    }
+  }
+
+  /**
+   * Invalidate the [source] that was changed and any sources that referenced
+   * the source before it existed.
+   */
+  void _sourceChanged(Source source) {
+    SourceEntry sourceEntry = _cache.get(source);
+    // If the source is removed, we don't care about it.
+    if (sourceEntry == null) {
+      return;
+    }
+    // Check if the content of the source is the same as it was the last time.
+    String sourceContent = sourceEntry.getValue(SourceEntry.CONTENT);
+    if (sourceContent != null) {
+      sourceEntry.setState(SourceEntry.CONTENT, CacheState.FLUSHED);
+      try {
+        TimestampedData<String> fileContents = getContents(source);
+        if (fileContents.data == sourceContent) {
+          return;
+        }
+      } catch (e) {}
+    }
+    // We have to invalidate the cache.
+    _propagateInvalidation(source, sourceEntry);
+  }
+
+  /**
+   * Record that the give [source] has been deleted.
+   */
+  void _sourceDeleted(Source source) {
+    SourceEntry sourceEntry = _cache.get(source);
+    if (sourceEntry is HtmlEntry) {
+      HtmlEntry htmlEntry = sourceEntry;
+      htmlEntry.recordContentError(new CaughtException(
+          new AnalysisException("This source was marked as being deleted"),
+          null));
+    } else if (sourceEntry is DartEntry) {
+      DartEntry dartEntry = sourceEntry;
+      HashSet<Source> libraries = new HashSet<Source>();
+      for (Source librarySource in getLibrariesContaining(source)) {
+        libraries.add(librarySource);
+        for (Source dependentLibrary
+            in getLibrariesDependingOn(librarySource)) {
+          libraries.add(dependentLibrary);
+        }
+      }
+      for (Source librarySource in libraries) {
+        _invalidateLibraryResolution(librarySource);
+      }
+      dartEntry.recordContentError(new CaughtException(
+          new AnalysisException("This source was marked as being deleted"),
+          null));
+    }
+    _workManager.remove(source);
+    _removeFromPriorityOrder(source);
+  }
+
+  /**
+   * Record that the given [source] has been removed.
+   */
+  void _sourceRemoved(Source source) {
+    SourceEntry sourceEntry = _cache.get(source);
+    if (sourceEntry is HtmlEntry) {} else if (sourceEntry is DartEntry) {
+      HashSet<Source> libraries = new HashSet<Source>();
+      for (Source librarySource in getLibrariesContaining(source)) {
+        libraries.add(librarySource);
+        for (Source dependentLibrary
+            in getLibrariesDependingOn(librarySource)) {
+          libraries.add(dependentLibrary);
+        }
+      }
+      for (Source librarySource in libraries) {
+        _invalidateLibraryResolution(librarySource);
+      }
+    }
+    _removeFromCache(source);
+    _workManager.remove(source);
+    _removeFromPriorityOrder(source);
+  }
+
+  /**
+   * TODO(scheglov) A hackish, limited incremental resolution implementation.
+   */
+  bool _tryPoorMansIncrementalResolution(Source unitSource, String newCode) {
+    return PerformanceStatistics.incrementalAnalysis.makeCurrentWhile(() {
+      incrementalResolutionValidation_lastUnitSource = null;
+      incrementalResolutionValidation_lastLibrarySource = null;
+      incrementalResolutionValidation_lastUnit = null;
+      // prepare the entry
+      DartEntry dartEntry = _cache.get(unitSource);
+      if (dartEntry == null) {
+        return false;
+      }
+      // prepare the (only) library source
+      List<Source> librarySources = getLibrariesContaining(unitSource);
+      if (librarySources.length != 1) {
+        return false;
+      }
+      Source librarySource = librarySources[0];
+      // prepare the library element
+      LibraryElement libraryElement = getLibraryElement(librarySource);
+      if (libraryElement == null) {
+        return false;
+      }
+      // prepare the existing unit
+      CompilationUnit oldUnit =
+          getResolvedCompilationUnit2(unitSource, librarySource);
+      if (oldUnit == null) {
+        return false;
+      }
+      // do resolution
+      Stopwatch perfCounter = new Stopwatch()..start();
+      PoorMansIncrementalResolver resolver = new PoorMansIncrementalResolver(
+          typeProvider,
+          unitSource,
+          getReadableSourceEntryOrNull(unitSource),
+          null,
+          null,
+          oldUnit,
+          analysisOptions.incrementalApi,
+          analysisOptions);
+      bool success = resolver.resolve(newCode);
+      AnalysisEngine.instance.instrumentationService.logPerformance(
+          AnalysisPerformanceKind.INCREMENTAL,
+          perfCounter,
+          'success=$success,context_id=$_id,code_length=${newCode.length}');
+      if (!success) {
+        return false;
+      }
+      // if validation, remember the result, but throw it away
+      if (analysisOptions.incrementalValidation) {
+        incrementalResolutionValidation_lastUnitSource = oldUnit.element.source;
+        incrementalResolutionValidation_lastLibrarySource =
+            oldUnit.element.library.source;
+        incrementalResolutionValidation_lastUnit = oldUnit;
+        return false;
+      }
+      // prepare notice
+      {
+        LineInfo lineInfo = getLineInfo(unitSource);
+        ChangeNoticeImpl notice = getNotice(unitSource);
+        notice.resolvedDartUnit = oldUnit;
+        notice.setErrors(dartEntry.allErrors, lineInfo);
+      }
+      // OK
+      return true;
+    });
+  }
+
+  void _validateLastIncrementalResolutionResult() {
+    if (incrementalResolutionValidation_lastUnitSource == null ||
+        incrementalResolutionValidation_lastLibrarySource == null ||
+        incrementalResolutionValidation_lastUnit == null) {
+      return;
+    }
+    CompilationUnit fullUnit = getResolvedCompilationUnit2(
+        incrementalResolutionValidation_lastUnitSource,
+        incrementalResolutionValidation_lastLibrarySource);
+    if (fullUnit != null) {
+      try {
+        assertSameResolution(
+            incrementalResolutionValidation_lastUnit, fullUnit);
+      } on IncrementalResolutionMismatch catch (mismatch, stack) {
+        String failure = mismatch.message;
+        String message =
+            'Incremental resolution mismatch:\n$failure\nat\n$stack';
+        AnalysisEngine.instance.logger.logError(message);
+      }
+    }
+    incrementalResolutionValidation_lastUnitSource = null;
+    incrementalResolutionValidation_lastLibrarySource = null;
+    incrementalResolutionValidation_lastUnit = null;
+  }
+}
+
+/**
+ * An object used by an analysis context to record the results of a task.
+ */
+class AnalysisContextImpl_AnalysisTaskResultRecorder
+    implements AnalysisTaskVisitor<SourceEntry> {
+  final AnalysisContextImpl AnalysisContextImpl_this;
+
+  AnalysisContextImpl_AnalysisTaskResultRecorder(this.AnalysisContextImpl_this);
+
+  @override
+  DartEntry visitGenerateDartErrorsTask(GenerateDartErrorsTask task) =>
+      AnalysisContextImpl_this._recordGenerateDartErrorsTask(task);
+
+  @override
+  DartEntry visitGenerateDartHintsTask(GenerateDartHintsTask task) =>
+      AnalysisContextImpl_this._recordGenerateDartHintsTask(task);
+
+  @override
+  DartEntry visitGenerateDartLintsTask(GenerateDartLintsTask task) =>
+      AnalysisContextImpl_this._recordGenerateDartLintsTask(task);
+
+  @override
+  SourceEntry visitGetContentTask(GetContentTask task) =>
+      AnalysisContextImpl_this._recordGetContentsTask(task);
+
+  @override
+  DartEntry visitIncrementalAnalysisTask(IncrementalAnalysisTask task) =>
+      AnalysisContextImpl_this._recordIncrementalAnalysisTaskResults(task);
+
+  @override
+  DartEntry visitParseDartTask(ParseDartTask task) =>
+      AnalysisContextImpl_this._recordParseDartTaskResults(task);
+
+  @override
+  HtmlEntry visitParseHtmlTask(ParseHtmlTask task) =>
+      AnalysisContextImpl_this._recordParseHtmlTaskResults(task);
+
+  @override
+  DartEntry visitResolveDartLibraryCycleTask(
+          ResolveDartLibraryCycleTask task) =>
+      AnalysisContextImpl_this.recordResolveDartLibraryCycleTaskResults(task);
+
+  @override
+  DartEntry visitResolveDartLibraryTask(ResolveDartLibraryTask task) =>
+      AnalysisContextImpl_this.recordResolveDartLibraryTaskResults(task);
+
+  @override
+  DartEntry visitResolveDartUnitTask(ResolveDartUnitTask task) =>
+      AnalysisContextImpl_this._recordResolveDartUnitTaskResults(task);
+
+  @override
+  HtmlEntry visitResolveHtmlTask(ResolveHtmlTask task) =>
+      AnalysisContextImpl_this._recordResolveHtmlTaskResults(task);
+
+  @override
+  DartEntry visitScanDartTask(ScanDartTask task) =>
+      AnalysisContextImpl_this._recordScanDartTaskResults(task);
+}
+
+class AnalysisContextImpl_ContextRetentionPolicy
+    implements CacheRetentionPolicy {
+  final AnalysisContextImpl AnalysisContextImpl_this;
+
+  AnalysisContextImpl_ContextRetentionPolicy(this.AnalysisContextImpl_this);
+
+  @override
+  RetentionPriority getAstPriority(Source source, SourceEntry sourceEntry) {
+    int priorityCount = AnalysisContextImpl_this._priorityOrder.length;
+    for (int i = 0; i < priorityCount; i++) {
+      if (source == AnalysisContextImpl_this._priorityOrder[i]) {
+        return RetentionPriority.HIGH;
+      }
+    }
+    if (AnalysisContextImpl_this._neededForResolution != null &&
+        AnalysisContextImpl_this._neededForResolution.contains(source)) {
+      return RetentionPriority.HIGH;
+    }
+    if (sourceEntry is DartEntry) {
+      DartEntry dartEntry = sourceEntry;
+      if (_astIsNeeded(dartEntry)) {
+        return RetentionPriority.MEDIUM;
+      }
+    }
+    return RetentionPriority.LOW;
+  }
+
+  bool _astIsNeeded(DartEntry dartEntry) =>
+      dartEntry.hasInvalidData(DartEntry.HINTS) ||
+          dartEntry.hasInvalidData(DartEntry.LINTS) ||
+          dartEntry.hasInvalidData(DartEntry.VERIFICATION_ERRORS) ||
+          dartEntry.hasInvalidData(DartEntry.RESOLUTION_ERRORS);
+}
+
+/**
+ * An object used to construct a list of the libraries that must be resolved
+ * together in order to resolve any one of the libraries.
+ */
+class AnalysisContextImpl_CycleBuilder {
+  final AnalysisContextImpl AnalysisContextImpl_this;
+
+  /**
+   * A table mapping the sources of the defining compilation units of libraries
+   * to the representation of the library that has the information needed to
+   * resolve the library.
+   */
+  HashMap<Source, ResolvableLibrary> _libraryMap =
+      new HashMap<Source, ResolvableLibrary>();
+
+  /**
+   * The dependency graph used to compute the libraries in the cycle.
+   */
+  DirectedGraph<ResolvableLibrary> _dependencyGraph;
+
+  /**
+   * A list containing the libraries that are ready to be resolved.
+   */
+  List<ResolvableLibrary> _librariesInCycle;
+
+  /**
+   * The analysis task that needs to be performed before the cycle of libraries
+   * can be resolved, or `null` if the libraries are ready to be resolved.
+   */
+  AnalysisContextImpl_TaskData _taskData;
+
+  /**
+   * Initialize a newly created cycle builder.
+   */
+  AnalysisContextImpl_CycleBuilder(this.AnalysisContextImpl_this) : super();
+
+  /**
+   * Return a list containing the libraries that are ready to be resolved
+   * (assuming that [getTaskData] returns `null`).
+   */
+  List<ResolvableLibrary> get librariesInCycle => _librariesInCycle;
+
+  /**
+   * Return a representation of an analysis task that needs to be performed
+   * before the cycle of libraries can be resolved, or `null` if the libraries
+   * are ready to be resolved.
+   */
+  AnalysisContextImpl_TaskData get taskData => _taskData;
+
+  /**
+   * Compute a list of the libraries that need to be resolved together in orde
+   *  to resolve the given [librarySource].
+   */
+  void computeCycleContaining(Source librarySource) {
+    //
+    // Create the object representing the library being resolved.
+    //
+    ResolvableLibrary targetLibrary = _createLibrary(librarySource);
+    //
+    // Compute the set of libraries that need to be resolved together.
+    //
+    _dependencyGraph = new DirectedGraph<ResolvableLibrary>();
+    _computeLibraryDependencies(targetLibrary);
+    if (_taskData != null) {
+      return;
+    }
+    _librariesInCycle = _dependencyGraph.findCycleContaining(targetLibrary);
+    //
+    // Ensure that all of the data needed to resolve them has been computed.
+    //
+    _ensureImportsAndExports();
+    if (_taskData != null) {
+      // At least one imported library needs to be resolved before the target
+      // library.
+      AnalysisTask task = _taskData.task;
+      if (task is ResolveDartLibraryTask) {
+        AnalysisContextImpl_this._workManager
+            .addFirst(task.librarySource, SourcePriority.LIBRARY);
+      }
+      return;
+    }
+    _computePartsInCycle(librarySource);
+    if (_taskData != null) {
+      // At least one part needs to be parsed.
+      return;
+    }
+    // All of the AST's necessary to perform a resolution of the library cycle
+    // have been gathered, so it is no longer necessary to retain them in the
+    // cache.
+    AnalysisContextImpl_this._neededForResolution = null;
+  }
+
+  bool _addDependency(ResolvableLibrary dependant, Source dependency,
+      List<ResolvableLibrary> dependencyList) {
+    if (dependant.librarySource == dependency) {
+      // Don't add a dependency of a library on itself; there's no point.
+      return true;
+    }
+    ResolvableLibrary importedLibrary = _libraryMap[dependency];
+    if (importedLibrary == null) {
+      importedLibrary = _createLibraryOrNull(dependency);
+      if (importedLibrary != null) {
+        _computeLibraryDependencies(importedLibrary);
+        if (_taskData != null) {
+          return false;
+        }
+      }
+    }
+    if (importedLibrary != null) {
+      if (dependencyList != null) {
+        dependencyList.add(importedLibrary);
+      }
+      _dependencyGraph.addEdge(dependant, importedLibrary);
+    }
+    return true;
+  }
+
+  /**
+   * Recursively traverse the libraries reachable from the given [library],
+   * creating instances of the class [Library] to represent them, and record the
+   * references in the library objects.
+   *
+   * Throws an [AnalysisException] if some portion of the library graph could
+   * not be traversed.
+   */
+  void _computeLibraryDependencies(ResolvableLibrary library) {
+    Source librarySource = library.librarySource;
+    DartEntry dartEntry =
+        AnalysisContextImpl_this._getReadableDartEntry(librarySource);
+    List<Source> importedSources =
+        _getSources(librarySource, dartEntry, DartEntry.IMPORTED_LIBRARIES);
+    if (_taskData != null) {
+      return;
+    }
+    List<Source> exportedSources =
+        _getSources(librarySource, dartEntry, DartEntry.EXPORTED_LIBRARIES);
+    if (_taskData != null) {
+      return;
+    }
+    _computeLibraryDependenciesFromDirectives(
+        library, importedSources, exportedSources);
+  }
+
+  /**
+   * Recursively traverse the libraries reachable from the given [library],
+   * creating instances of the class [Library] to represent them, and record the
+   * references in the library objects. The [importedSources] is a list
+   * containing the sources that are imported into the given library. The
+   * [exportedSources] is a list containing the sources that are exported from
+   * the given library.
+   */
+  void _computeLibraryDependenciesFromDirectives(ResolvableLibrary library,
+      List<Source> importedSources, List<Source> exportedSources) {
+    int importCount = importedSources.length;
+    List<ResolvableLibrary> importedLibraries = new List<ResolvableLibrary>();
+    bool explicitlyImportsCore = false;
+    bool importsAsync = false;
+    for (int i = 0; i < importCount; i++) {
+      Source importedSource = importedSources[i];
+      if (importedSource == AnalysisContextImpl_this._coreLibrarySource) {
+        explicitlyImportsCore = true;
+      } else if (importedSource ==
+          AnalysisContextImpl_this._asyncLibrarySource) {
+        importsAsync = true;
+      }
+      if (!_addDependency(library, importedSource, importedLibraries)) {
+        return;
+      }
+    }
+    library.explicitlyImportsCore = explicitlyImportsCore;
+    if (!explicitlyImportsCore) {
+      if (!_addDependency(library, AnalysisContextImpl_this._coreLibrarySource,
+          importedLibraries)) {
+        return;
+      }
+    }
+    if (!importsAsync) {
+      // Add a dependency on async to ensure that the Future element will be
+      // built before we generate errors and warnings for async methods.  Also
+      // include it in importedLibraries, so that it will be picked up by
+      // LibraryResolver2._buildLibraryMap().
+      // TODO(paulberry): this is a bit of a hack, since the async library
+      // isn't actually being imported.  Also, it's not clear whether it should
+      // be necessary: in theory, dart:core already (indirectly) imports
+      // dart:async, so if core has been built, async should have been built
+      // too.  However, removing this code causes unit test failures.
+      if (!_addDependency(library, AnalysisContextImpl_this._asyncLibrarySource,
+          importedLibraries)) {
+        return;
+      }
+    }
+    library.importedLibraries = importedLibraries;
+    int exportCount = exportedSources.length;
+    if (exportCount > 0) {
+      List<ResolvableLibrary> exportedLibraries = new List<ResolvableLibrary>();
+      for (int i = 0; i < exportCount; i++) {
+        Source exportedSource = exportedSources[i];
+        if (!_addDependency(library, exportedSource, exportedLibraries)) {
+          return;
+        }
+      }
+      library.exportedLibraries = exportedLibraries;
+    }
+  }
+
+  /**
+   * Gather the resolvable AST structures for each of the compilation units in
+   * each of the libraries in the cycle. This is done in two phases: first we
+   * ensure that we have cached an AST structure for each compilation unit, then
+   * we gather them. We split the work this way because getting the AST
+   * structures can change the state of the cache in such a way that we would
+   * have more work to do if any compilation unit didn't have a resolvable AST
+   * structure.
+   */
+  void _computePartsInCycle(Source librarySource) {
+    int count = _librariesInCycle.length;
+    List<CycleBuilder_LibraryPair> libraryData =
+        new List<CycleBuilder_LibraryPair>();
+    for (int i = 0; i < count; i++) {
+      ResolvableLibrary library = _librariesInCycle[i];
+      libraryData.add(new CycleBuilder_LibraryPair(
+          library, _ensurePartsInLibrary(library)));
+    }
+    AnalysisContextImpl_this._neededForResolution = _gatherSources(libraryData);
+    if (AnalysisContextImpl._TRACE_PERFORM_TASK) {
+      print(
+          "  preserve resolution data for ${AnalysisContextImpl_this._neededForResolution.length} sources while resolving ${librarySource.fullName}");
+    }
+    if (_taskData != null) {
+      return;
+    }
+    for (int i = 0; i < count; i++) {
+      _computePartsInLibrary(libraryData[i]);
+    }
+  }
+
+  /**
+   * Gather the resolvable compilation units for each of the compilation units
+   * in the library represented by the [libraryPair].
+   */
+  void _computePartsInLibrary(CycleBuilder_LibraryPair libraryPair) {
+    ResolvableLibrary library = libraryPair.library;
+    List<CycleBuilder_SourceEntryPair> entryPairs = libraryPair.entryPairs;
+    int count = entryPairs.length;
+    List<ResolvableCompilationUnit> units =
+        new List<ResolvableCompilationUnit>(count);
+    for (int i = 0; i < count; i++) {
+      CycleBuilder_SourceEntryPair entryPair = entryPairs[i];
+      Source source = entryPair.source;
+      DartEntry dartEntry = entryPair.entry;
+      units[i] = new ResolvableCompilationUnit(
+          source, dartEntry.resolvableCompilationUnit);
+    }
+    library.resolvableCompilationUnits = units;
+  }
+
+  /**
+   * Create an object to represent the information about the library defined by
+   * the compilation unit with the given [librarySource].
+   */
+  ResolvableLibrary _createLibrary(Source librarySource) {
+    ResolvableLibrary library = new ResolvableLibrary(librarySource);
+    SourceEntry sourceEntry =
+        AnalysisContextImpl_this._cache.get(librarySource);
+    if (sourceEntry is DartEntry) {
+      LibraryElementImpl libraryElement =
+          sourceEntry.getValue(DartEntry.ELEMENT) as LibraryElementImpl;
+      if (libraryElement != null) {
+        library.libraryElement = libraryElement;
+      }
+    }
+    _libraryMap[librarySource] = library;
+    return library;
+  }
+
+  /**
+   * Create an object to represent the information about the library defined by
+   * the compilation unit with the given [librarySource].
+   */
+  ResolvableLibrary _createLibraryOrNull(Source librarySource) {
+    ResolvableLibrary library = new ResolvableLibrary(librarySource);
+    SourceEntry sourceEntry =
+        AnalysisContextImpl_this._cache.get(librarySource);
+    if (sourceEntry is DartEntry) {
+      LibraryElementImpl libraryElement =
+          sourceEntry.getValue(DartEntry.ELEMENT) as LibraryElementImpl;
+      if (libraryElement != null) {
+        library.libraryElement = libraryElement;
+      }
+    }
+    _libraryMap[librarySource] = library;
+    return library;
+  }
+
+  /**
+   * Ensure that the given [library] has an element model built for it. If
+   * another task needs to be executed first in order to build the element
+   * model, that task is placed in [taskData].
+   */
+  void _ensureElementModel(ResolvableLibrary library) {
+    Source librarySource = library.librarySource;
+    DartEntry libraryEntry =
+        AnalysisContextImpl_this._getReadableDartEntry(librarySource);
+    if (libraryEntry != null &&
+        libraryEntry.getState(DartEntry.PARSED_UNIT) != CacheState.ERROR) {
+      AnalysisContextImpl_this._workManager
+          .addFirst(librarySource, SourcePriority.LIBRARY);
+      if (_taskData == null) {
+        _taskData = AnalysisContextImpl_this._createResolveDartLibraryTask(
+            librarySource, libraryEntry);
+      }
+    }
+  }
+
+  /**
+   * Ensure that all of the libraries that are exported by the given [library]
+   * (but are not themselves in the cycle) have element models built for them.
+   * If another task needs to be executed first in order to build the element
+   * model, that task is placed in [taskData].
+   */
+  void _ensureExports(
+      ResolvableLibrary library, HashSet<Source> visitedLibraries) {
+    List<ResolvableLibrary> dependencies = library.exports;
+    int dependencyCount = dependencies.length;
+    for (int i = 0; i < dependencyCount; i++) {
+      ResolvableLibrary dependency = dependencies[i];
+      if (!_librariesInCycle.contains(dependency) &&
+          visitedLibraries.add(dependency.librarySource)) {
+        if (dependency.libraryElement == null) {
+          _ensureElementModel(dependency);
+        } else {
+          _ensureExports(dependency, visitedLibraries);
+        }
+        if (_taskData != null) {
+          return;
+        }
+      }
+    }
+  }
+
+  /**
+   * Ensure that all of the libraries that are exported by the given [library]
+   * (but are not themselves in the cycle) have element models built for them.
+   * If another task needs to be executed first in order to build the element
+   * model, that task is placed in [taskData].
+   */
+  void _ensureImports(ResolvableLibrary library) {
+    List<ResolvableLibrary> dependencies = library.imports;
+    int dependencyCount = dependencies.length;
+    for (int i = 0; i < dependencyCount; i++) {
+      ResolvableLibrary dependency = dependencies[i];
+      if (!_librariesInCycle.contains(dependency) &&
+          dependency.libraryElement == null) {
+        _ensureElementModel(dependency);
+        if (_taskData != null) {
+          return;
+        }
+      }
+    }
+  }
+
+  /**
+   * Ensure that all of the libraries that are either imported or exported by
+   * libraries in the cycle (but are not themselves in the cycle) have element
+   * models built for them.
+   */
+  void _ensureImportsAndExports() {
+    HashSet<Source> visitedLibraries = new HashSet<Source>();
+    int libraryCount = _librariesInCycle.length;
+    for (int i = 0; i < libraryCount; i++) {
+      ResolvableLibrary library = _librariesInCycle[i];
+      _ensureImports(library);
+      if (_taskData != null) {
+        return;
+      }
+      _ensureExports(library, visitedLibraries);
+      if (_taskData != null) {
+        return;
+      }
+    }
+  }
+
+  /**
+   * Ensure that there is a resolvable compilation unit available for all of the
+   * compilation units in the given [library].
+   */
+  List<CycleBuilder_SourceEntryPair> _ensurePartsInLibrary(
+      ResolvableLibrary library) {
+    List<CycleBuilder_SourceEntryPair> pairs =
+        new List<CycleBuilder_SourceEntryPair>();
+    Source librarySource = library.librarySource;
+    DartEntry libraryEntry =
+        AnalysisContextImpl_this._getReadableDartEntry(librarySource);
+    if (libraryEntry == null) {
+      throw new AnalysisException(
+          "Cannot find entry for ${librarySource.fullName}");
+    } else if (libraryEntry.getState(DartEntry.PARSED_UNIT) ==
+        CacheState.ERROR) {
+      String message =
+          "Cannot compute parsed unit for ${librarySource.fullName}";
+      CaughtException exception = libraryEntry.exception;
+      if (exception == null) {
+        throw new AnalysisException(message);
+      }
+      throw new AnalysisException(
+          message, new CaughtException(exception, null));
+    }
+    _ensureResolvableCompilationUnit(librarySource, libraryEntry);
+    pairs.add(new CycleBuilder_SourceEntryPair(librarySource, libraryEntry));
+    List<Source> partSources =
+        _getSources(librarySource, libraryEntry, DartEntry.INCLUDED_PARTS);
+    int count = partSources.length;
+    for (int i = 0; i < count; i++) {
+      Source partSource = partSources[i];
+      DartEntry partEntry =
+          AnalysisContextImpl_this._getReadableDartEntry(partSource);
+      if (partEntry != null &&
+          partEntry.getState(DartEntry.PARSED_UNIT) != CacheState.ERROR) {
+        _ensureResolvableCompilationUnit(partSource, partEntry);
+        pairs.add(new CycleBuilder_SourceEntryPair(partSource, partEntry));
+      }
+    }
+    return pairs;
+  }
+
+  /**
+   * Ensure that there is a resolvable compilation unit available for the given
+   * [source].
+   */
+  void _ensureResolvableCompilationUnit(Source source, DartEntry dartEntry) {
+    // The entry will be null if the source represents a non-Dart file.
+    if (dartEntry != null && !dartEntry.hasResolvableCompilationUnit) {
+      if (_taskData == null) {
+        _taskData =
+            AnalysisContextImpl_this._createParseDartTask(source, dartEntry);
+      }
+    }
+  }
+
+  HashSet<Source> _gatherSources(List<CycleBuilder_LibraryPair> libraryData) {
+    int libraryCount = libraryData.length;
+    HashSet<Source> sources = new HashSet<Source>();
+    for (int i = 0; i < libraryCount; i++) {
+      List<CycleBuilder_SourceEntryPair> entryPairs = libraryData[i].entryPairs;
+      int entryCount = entryPairs.length;
+      for (int j = 0; j < entryCount; j++) {
+        sources.add(entryPairs[j].source);
+      }
+    }
+    return sources;
+  }
+
+  /**
+   * Return the sources described by the given [descriptor].
+   */
+  List<Source> _getSources(Source source, DartEntry dartEntry,
+      DataDescriptor<List<Source>> descriptor) {
+    if (dartEntry == null) {
+      return Source.EMPTY_LIST;
+    }
+    CacheState exportState = dartEntry.getState(descriptor);
+    if (exportState == CacheState.ERROR) {
+      return Source.EMPTY_LIST;
+    } else if (exportState != CacheState.VALID) {
+      if (_taskData == null) {
+        _taskData =
+            AnalysisContextImpl_this._createParseDartTask(source, dartEntry);
+      }
+      return Source.EMPTY_LIST;
+    }
+    return dartEntry.getValue(descriptor);
+  }
+}
+
+/**
+ * Information about the next task to be performed. Each data has an implicit
+ * associated source: the source that might need to be analyzed. There are
+ * essentially three states that can be represented:
+ *
+ * * If [getTask] returns a non-`null` value, then that is the task that should
+ *   be executed to further analyze the associated source.
+ * * Otherwise, if [isBlocked] returns `true`, then there is no work that can be
+ *   done, but analysis for the associated source is not complete.
+ * * Otherwise, [getDependentSource] should return a source that needs to be
+ *   analyzed before the analysis of the associated source can be completed.
+ */
+class AnalysisContextImpl_TaskData {
+  /**
+   * The task that is to be performed.
+   */
+  final AnalysisTask task;
+
+  /**
+   * A flag indicating whether the associated source is blocked waiting for its
+   * contents to be loaded.
+   */
+  final bool _blocked;
+
+  /**
+   * Initialize a newly created data holder.
+   */
+  AnalysisContextImpl_TaskData(this.task, this._blocked);
+
+  /**
+   * Return `true` if the associated source is blocked waiting for its contents
+   * to be loaded.
+   */
+  bool get isBlocked => _blocked;
+
+  @override
+  String toString() {
+    if (task == null) {
+      return "blocked: $_blocked";
+    }
+    return task.toString();
+  }
+}
+
+/**
+ * Statistics and information about a single [AnalysisContext].
+ */
+abstract class AnalysisContextStatistics {
+  /**
+   * Return the statistics for each kind of cached data.
+   */
+  List<AnalysisContextStatistics_CacheRow> get cacheRows;
+
+  /**
+   * Return the exceptions that caused some entries to have a state of
+   * [CacheState.ERROR].
+   */
+  List<CaughtException> get exceptions;
+
+  /**
+   * Return information about each of the partitions in the cache.
+   */
+  List<AnalysisContextStatistics_PartitionData> get partitionData;
+
+  /**
+   * Return a list containing all of the sources in the cache.
+   */
+  List<Source> get sources;
+}
+
+/**
+ * Information about single piece of data in the cache.
+ */
+abstract class AnalysisContextStatistics_CacheRow {
+  /**
+   * List of possible states which can be queried.
+   */
+  static const List<CacheState> STATES = const <CacheState>[
+    CacheState.ERROR,
+    CacheState.FLUSHED,
+    CacheState.IN_PROCESS,
+    CacheState.INVALID,
+    CacheState.VALID
+  ];
+
+  /**
+   * Return the number of entries whose state is [CacheState.ERROR].
+   */
+  int get errorCount;
+
+  /**
+   * Return the number of entries whose state is [CacheState.FLUSHED].
+   */
+  int get flushedCount;
+
+  /**
+   * Return the number of entries whose state is [CacheState.IN_PROCESS].
+   */
+  int get inProcessCount;
+
+  /**
+   * Return the number of entries whose state is [CacheState.INVALID].
+   */
+  int get invalidCount;
+
+  /**
+   * Return the name of the data represented by this object.
+   */
+  String get name;
+
+  /**
+   * Return the number of entries whose state is [CacheState.VALID].
+   */
+  int get validCount;
+
+  /**
+   * Return the number of entries whose state is [state].
+   */
+  int getCount(CacheState state);
+}
+
+/**
+ * Information about a single partition in the cache.
+ */
+abstract class AnalysisContextStatistics_PartitionData {
+  /**
+   * Return the number of entries in the partition that have an AST structure in
+   * one state or another.
+   */
+  int get astCount;
+
+  /**
+   * Return the total number of entries in the partition.
+   */
+  int get totalCount;
+}
+
+/**
+ * Implementation of the [AnalysisContextStatistics].
+ */
+class AnalysisContextStatisticsImpl implements AnalysisContextStatistics {
+  Map<String, AnalysisContextStatistics_CacheRow> _dataMap =
+      new HashMap<String, AnalysisContextStatistics_CacheRow>();
+
+  List<Source> _sources = new List<Source>();
+
+  HashSet<CaughtException> _exceptions = new HashSet<CaughtException>();
+
+  List<AnalysisContextStatistics_PartitionData> _partitionData;
+
+  @override
+  List<AnalysisContextStatistics_CacheRow> get cacheRows =>
+      _dataMap.values.toList();
+
+  @override
+  List<CaughtException> get exceptions => new List.from(_exceptions);
+
+  @override
+  List<AnalysisContextStatistics_PartitionData> get partitionData =>
+      _partitionData;
+
+  /**
+   * Set the partition data returned by this object to the given data.
+   */
+  void set partitionData(List<AnalysisContextStatistics_PartitionData> data) {
+    _partitionData = data;
+  }
+
+  @override
+  List<Source> get sources => _sources;
+
+  void addSource(Source source) {
+    _sources.add(source);
+  }
+
+  void _internalPutCacheItem(Source source, SourceEntry dartEntry,
+      DataDescriptor rowDesc, CacheState state) {
+    String rowName = rowDesc.toString();
+    AnalysisContextStatisticsImpl_CacheRowImpl row =
+        _dataMap[rowName] as AnalysisContextStatisticsImpl_CacheRowImpl;
+    if (row == null) {
+      row = new AnalysisContextStatisticsImpl_CacheRowImpl(rowName);
+      _dataMap[rowName] = row;
+    }
+    row._incState(state);
+    if (state == CacheState.ERROR) {
+      CaughtException exception = dartEntry.exception;
+      if (exception != null) {
+        _exceptions.add(exception);
+      }
+    }
+  }
+}
+
+class AnalysisContextStatisticsImpl_CacheRowImpl
+    implements AnalysisContextStatistics_CacheRow {
+  final String name;
+
+  Map<CacheState, int> _counts = <CacheState, int>{};
+
+  AnalysisContextStatisticsImpl_CacheRowImpl(this.name);
+
+  @override
+  int get errorCount => getCount(CacheState.ERROR);
+
+  @override
+  int get flushedCount => getCount(CacheState.FLUSHED);
+
+  @override
+  int get hashCode => name.hashCode;
+
+  @override
+  int get inProcessCount => getCount(CacheState.IN_PROCESS);
+
+  @override
+  int get invalidCount => getCount(CacheState.INVALID);
+
+  @override
+  int get validCount => getCount(CacheState.VALID);
+
+  @override
+  bool operator ==(Object obj) =>
+      obj is AnalysisContextStatisticsImpl_CacheRowImpl && obj.name == name;
+
+  @override
+  int getCount(CacheState state) {
+    int count = _counts[state];
+    if (count != null) {
+      return count;
+    } else {
+      return 0;
+    }
+  }
+
+  void _incState(CacheState state) {
+    if (_counts[state] == null) {
+      _counts[state] = 1;
+    } else {
+      _counts[state]++;
+    }
+  }
+}
+
+class AnalysisContextStatisticsImpl_PartitionDataImpl
+    implements AnalysisContextStatistics_PartitionData {
+  final int astCount;
+
+  final int totalCount;
+
+  AnalysisContextStatisticsImpl_PartitionDataImpl(
+      this.astCount, this.totalCount);
+}
+
+/**
+ * A representation of changes to the types of analysis that should be
+ * performed.
+ */
+class AnalysisDelta {
+  /**
+   * A mapping from source to what type of analysis should be performed on that
+   * source.
+   */
+  HashMap<Source, AnalysisLevel> _analysisMap =
+      new HashMap<Source, AnalysisLevel>();
+
+  /**
+   * Return a collection of the sources that have been added. This is equivalent
+   * to calling [getAnalysisLevels] and collecting all sources that do not have
+   * an analysis level of [AnalysisLevel.NONE].
+   */
+  List<Source> get addedSources {
+    List<Source> result = new List<Source>();
+    _analysisMap.forEach((Source source, AnalysisLevel level) {
+      if (level != AnalysisLevel.NONE) {
+        result.add(source);
+      }
+    });
+    return result;
+  }
+
+  /**
+   * Return a mapping of sources to the level of analysis that should be
+   * performed.
+   */
+  Map<Source, AnalysisLevel> get analysisLevels => _analysisMap;
+
+  /**
+   * Record that the given [source] should be analyzed at the given [level].
+   */
+  void setAnalysisLevel(Source source, AnalysisLevel level) {
+    _analysisMap[source] = level;
+  }
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    bool needsSeparator = _appendSources(buffer, false, AnalysisLevel.ALL);
+    needsSeparator =
+        _appendSources(buffer, needsSeparator, AnalysisLevel.RESOLVED);
+    _appendSources(buffer, needsSeparator, AnalysisLevel.NONE);
+    return buffer.toString();
+  }
+
+  /**
+   * Appendto the given [buffer] all sources with the given analysis [level],
+   * prefixed with a label and a separator if [needsSeparator] is `true`.
+   */
+  bool _appendSources(
+      StringBuffer buffer, bool needsSeparator, AnalysisLevel level) {
+    bool first = true;
+    _analysisMap.forEach((Source source, AnalysisLevel sourceLevel) {
+      if (sourceLevel == level) {
+        if (first) {
+          first = false;
+          if (needsSeparator) {
+            buffer.write("; ");
+          }
+          buffer.write(level);
+          buffer.write(" ");
+        } else {
+          buffer.write(", ");
+        }
+        buffer.write(source.fullName);
+      }
+    });
+    return needsSeparator || !first;
+  }
+}
+
+/**
+ * The entry point for the functionality provided by the analysis engine. There
+ * is a single instance of this class.
+ */
+class AnalysisEngine {
+  /**
+   * The suffix used for Dart source files.
+   */
+  static const String SUFFIX_DART = "dart";
+
+  /**
+   * The short suffix used for HTML files.
+   */
+  static const String SUFFIX_HTM = "htm";
+
+  /**
+   * The long suffix used for HTML files.
+   */
+  static const String SUFFIX_HTML = "html";
+
+  /**
+   * The unique instance of this class.
+   */
+  static final AnalysisEngine instance = new AnalysisEngine._();
+
+  /**
+   * The logger that should receive information about errors within the analysis
+   * engine.
+   */
+  Logger _logger = Logger.NULL;
+
+  /**
+   * The plugin that defines the extension points and extensions that are defined by
+   * command-line applications using the analysis engine.
+   */
+  final CommandLinePlugin commandLinePlugin = new CommandLinePlugin();
+
+  /**
+   * The plugin that defines the extension points and extensions that are
+   * inherently defined by the analysis engine.
+   */
+  final EnginePlugin enginePlugin = new EnginePlugin();
+
+  /***
+   * The plugin that defines the extension points and extensions that are defined
+   * by applications that want to consume options defined in the analysis
+   * options file.
+   */
+  final OptionsPlugin optionsPlugin = new OptionsPlugin();
+
+  /**
+   * The instrumentation service that is to be used by this analysis engine.
+   */
+  InstrumentationService _instrumentationService =
+      InstrumentationService.NULL_SERVICE;
+
+  /**
+   * The list of supported plugins for processing by clients.
+   */
+  List<Plugin> _supportedPlugins;
+
+  /**
+   * The partition manager being used to manage the shared partitions.
+   */
+  final PartitionManager partitionManager = new PartitionManager();
+
+  /**
+   * The partition manager being used to manage the shared partitions.
+   */
+  final newContext.PartitionManager partitionManager_new =
+      new newContext.PartitionManager();
+
+  /**
+   * A flag indicating whether the (new) task model should be used to perform
+   * analysis.
+   */
+  bool useTaskModel = false;
+
+  /**
+   * A flag indicating whether the task model should attempt to limit
+   * invalidation after a change.
+   */
+  bool limitInvalidationInTaskModel = false;
+
+  /**
+   * The task manager used to manage the tasks used to analyze code.
+   */
+  TaskManager _taskManager;
+
+  AnalysisEngine._();
+
+  /**
+   * Return the instrumentation service that is to be used by this analysis
+   * engine.
+   */
+  InstrumentationService get instrumentationService => _instrumentationService;
+
+  /**
+   * Set the instrumentation service that is to be used by this analysis engine
+   * to the given [service].
+   */
+  void set instrumentationService(InstrumentationService service) {
+    if (service == null) {
+      _instrumentationService = InstrumentationService.NULL_SERVICE;
+    } else {
+      _instrumentationService = service;
+    }
+  }
+
+  /**
+   * Return the logger that should receive information about errors within the
+   * analysis engine.
+   */
+  Logger get logger => _logger;
+
+  /**
+   * Set the logger that should receive information about errors within the
+   * analysis engine to the given [logger].
+   */
+  void set logger(Logger logger) {
+    this._logger = logger == null ? Logger.NULL : logger;
+  }
+
+  /**
+   * Return the list of supported plugins for processing by clients.
+   */
+  List<Plugin> get supportedPlugins {
+    if (_supportedPlugins == null) {
+      _supportedPlugins = <Plugin>[
+        enginePlugin,
+        commandLinePlugin,
+        optionsPlugin
+      ];
+    }
+    return _supportedPlugins;
+  }
+
+  /**
+   * Return the task manager used to manage the tasks used to analyze code.
+   */
+  TaskManager get taskManager {
+    if (_taskManager == null) {
+      if (enginePlugin.taskExtensionPoint == null) {
+        // The plugin wasn't used, so tasks are not registered.
+        new ExtensionManager().processPlugins([enginePlugin]);
+      }
+      _taskManager = new TaskManager();
+      _taskManager.addTaskDescriptors(enginePlugin.taskDescriptors);
+      // TODO(brianwilkerson) Create a way to associate different results with
+      // different file suffixes, then make this pluggable.
+      _taskManager.addGeneralResult(DART_ERRORS);
+    }
+    return _taskManager;
+  }
+
+  /**
+   * Clear any caches holding on to analysis results so that a full re-analysis
+   * will be performed the next time an analysis context is created.
+   */
+  void clearCaches() {
+    partitionManager.clearCache();
+  }
+
+  /**
+   * Create and return a new context in which analysis can be performed.
+   */
+  AnalysisContext createAnalysisContext() {
+    if (useTaskModel) {
+      return new newContext.AnalysisContextImpl();
+    }
+    return new AnalysisContextImpl();
+  }
+
+  /**
+   * Return `true` if the given [fileName] is assumed to contain Dart source
+   * code.
+   */
+  static bool isDartFileName(String fileName) {
+    if (fileName == null) {
+      return false;
+    }
+    return javaStringEqualsIgnoreCase(
+        FileNameUtilities.getExtension(fileName), SUFFIX_DART);
+  }
+
+  /**
+   * Return `true` if the given [fileName] is assumed to contain HTML.
+   */
+  static bool isHtmlFileName(String fileName) {
+    if (fileName == null) {
+      return false;
+    }
+    String extension = FileNameUtilities.getExtension(fileName);
+    return javaStringEqualsIgnoreCase(extension, SUFFIX_HTML) ||
+        javaStringEqualsIgnoreCase(extension, SUFFIX_HTM);
+  }
+}
+
+/**
+ * The analysis errors and line information for the errors.
+ */
+abstract class AnalysisErrorInfo {
+  /**
+   * Return the errors that as a result of the analysis, or `null` if there were
+   * no errors.
+   */
+  List<AnalysisError> get errors;
+
+  /**
+   * Return the line information associated with the errors, or `null` if there
+   * were no errors.
+   */
+  LineInfo get lineInfo;
+}
+
+/**
+ * The analysis errors and line info associated with a source.
+ */
+class AnalysisErrorInfoImpl implements AnalysisErrorInfo {
+  /**
+   * The analysis errors associated with a source, or `null` if there are no
+   * errors.
+   */
+  final List<AnalysisError> errors;
+
+  /**
+   * The line information associated with the errors, or `null` if there are no
+   * errors.
+   */
+  final LineInfo lineInfo;
+
+  /**
+   * Initialize an newly created error info with the given [errors] and
+   * [lineInfo].
+   */
+  AnalysisErrorInfoImpl(this.errors, this.lineInfo);
+}
+
+/**
+ * The levels at which a source can be analyzed.
+ */
+class AnalysisLevel extends Enum<AnalysisLevel> {
+  /**
+   * Indicates a source should be fully analyzed.
+   */
+  static const AnalysisLevel ALL = const AnalysisLevel('ALL', 0);
+
+  /**
+   * Indicates a source should be resolved and that errors, warnings and hints are needed.
+   */
+  static const AnalysisLevel ERRORS = const AnalysisLevel('ERRORS', 1);
+
+  /**
+   * Indicates a source should be resolved, but that errors, warnings and hints are not needed.
+   */
+  static const AnalysisLevel RESOLVED = const AnalysisLevel('RESOLVED', 2);
+
+  /**
+   * Indicates a source is not of interest to the client.
+   */
+  static const AnalysisLevel NONE = const AnalysisLevel('NONE', 3);
+
+  static const List<AnalysisLevel> values = const [ALL, ERRORS, RESOLVED, NONE];
+
+  const AnalysisLevel(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
+ * An object that is listening for results being produced by an analysis
+ * context.
+ */
+abstract class AnalysisListener {
+  /**
+   * Reports that a task, described by the given [taskDescription] is about to
+   * be performed by the given [context].
+   */
+  void aboutToPerformTask(AnalysisContext context, String taskDescription);
+
+  /**
+   * Reports that the [errors] associated with the given [source] in the given
+   * [context] has been updated to the given errors. The [lineInfo] is the line
+   * information associated with the source.
+   */
+  void computedErrors(AnalysisContext context, Source source,
+      List<AnalysisError> errors, LineInfo lineInfo);
+
+  /**
+   * Reports that the given [source] is no longer included in the set of sources
+   * that are being analyzed by the given analysis [context].
+   */
+  void excludedSource(AnalysisContext context, Source source);
+
+  /**
+   * Reports that the given [source] is now included in the set of sources that
+   * are being analyzed by the given analysis [context].
+   */
+  void includedSource(AnalysisContext context, Source source);
+
+  /**
+   * Reports that the given Dart [source] was parsed in the given [context],
+   * producing the given [unit].
+   */
+  void parsedDart(AnalysisContext context, Source source, CompilationUnit unit);
+
+  /**
+   * Reports that the given HTML [source] was parsed in the given [context].
+   */
+  @deprecated
+  void parsedHtml(AnalysisContext context, Source source, ht.HtmlUnit unit);
+
+  /**
+   * Reports that the given Dart [source] was resolved in the given [context].
+   */
+  void resolvedDart(
+      AnalysisContext context, Source source, CompilationUnit unit);
+
+  /**
+   * Reports that the given HTML [source] was resolved in the given [context].
+   */
+  @deprecated
+  void resolvedHtml(AnalysisContext context, Source source, ht.HtmlUnit unit);
+}
+
+/**
+ * Futures returned by [AnalysisContext] for pending analysis results will
+ * complete with this error if it is determined that analysis results will
+ * never become available (e.g. because the requested source is not subject to
+ * analysis, or because the requested source is a part file which is not a part
+ * of any known library).
+ */
+class AnalysisNotScheduledError implements Exception {}
+
+/**
+ * A set of analysis options used to control the behavior of an analysis
+ * context.
+ */
+abstract class AnalysisOptions {
+  /**
+   * If analysis is to parse and analyze all function bodies, return `true`.
+   * If analysis is to skip all function bodies, return `false`.  If analysis
+   * is to parse and analyze function bodies in some sources and not in others,
+   * throw an exception.
+   *
+   * This getter is deprecated; consider using [analyzeFunctionBodiesPredicate]
+   * instead.
+   */
+  @deprecated // Use this.analyzeFunctionBodiesPredicate
+  bool get analyzeFunctionBodies;
+
+  /**
+   * Function that returns `true` if analysis is to parse and analyze function
+   * bodies for a given source.
+   */
+  AnalyzeFunctionBodiesPredicate get analyzeFunctionBodiesPredicate;
+
+  /**
+   * Return the maximum number of sources for which AST structures should be
+   * kept in the cache.
+   */
+  int get cacheSize;
+
+  /**
+   * Return `true` if analysis is to generate dart2js related hint results.
+   */
+  bool get dart2jsHint;
+
+  /**
+   * Return `true` if analysis is to include the new async support.
+   */
+  @deprecated // Always true
+  bool get enableAsync;
+
+  /**
+   * Return `true` if analysis is to include the new deferred loading support.
+   */
+  @deprecated // Always true
+  bool get enableDeferredLoading;
+
+  /**
+   * Return `true` if analysis is to include the new enum support.
+   */
+  @deprecated // Always true
+  bool get enableEnum;
+
+  /**
+   * Return `true` to enable generic methods (DEP 22).
+   */
+  bool get enableGenericMethods => null;
+
+  /**
+   * Return `true` to enable null-aware operators (DEP 9).
+   */
+  @deprecated // Always true
+  bool get enableNullAwareOperators;
+
+  /**
+   * Return `true` to strictly follow the specification when generating
+   * warnings on "call" methods (fixes dartbug.com/21938).
+   */
+  bool get enableStrictCallChecks;
+
+  /**
+   * Return `true` if mixins are allowed to inherit from types other than
+   * Object, and are allowed to reference `super`.
+   */
+  bool get enableSuperMixins;
+
+  /**
+   * Return `true` if errors, warnings and hints should be generated for sources
+   * that are implicitly being analyzed. The default value is `true`.
+   */
+  bool get generateImplicitErrors;
+
+  /**
+   * Return `true` if errors, warnings and hints should be generated for sources
+   * in the SDK. The default value is `false`.
+   */
+  bool get generateSdkErrors;
+
+  /**
+   * Return `true` if analysis is to generate hint results (e.g. type inference
+   * based information and pub best practices).
+   */
+  bool get hint;
+
+  /**
+   * Return `true` if incremental analysis should be used.
+   */
+  bool get incremental;
+
+  /**
+   * A flag indicating whether incremental analysis should be used for API
+   * changes.
+   */
+  bool get incrementalApi;
+
+  /**
+   * A flag indicating whether validation should be performed after incremental
+   * analysis.
+   */
+  bool get incrementalValidation;
+
+  /**
+   * Return `true` if analysis is to generate lint warnings.
+   */
+  bool get lint;
+
+  /**
+   * Return `true` if analysis is to parse comments.
+   */
+  bool get preserveComments;
+
+  /**
+   * Return `true` if strong mode analysis should be used.
+   */
+  bool get strongMode;
+}
+
+/**
+ * A set of analysis options used to control the behavior of an analysis
+ * context.
+ */
+class AnalysisOptionsImpl implements AnalysisOptions {
+  /**
+   * The maximum number of sources for which data should be kept in the cache.
+   */
+  static const int DEFAULT_CACHE_SIZE = 64;
+
+  /**
+   * The default value for enabling deferred loading.
+   */
+  @deprecated
+  static bool DEFAULT_ENABLE_DEFERRED_LOADING = true;
+
+  /**
+   * The default value for enabling enum support.
+   */
+  @deprecated
+  static bool DEFAULT_ENABLE_ENUM = true;
+
+  /**
+   * A predicate indicating whether analysis is to parse and analyze function
+   * bodies.
+   */
+  AnalyzeFunctionBodiesPredicate _analyzeFunctionBodiesPredicate =
+      _analyzeAllFunctionBodies;
+
+  /**
+   * The maximum number of sources for which AST structures should be kept in
+   * the cache.
+   */
+  int cacheSize = DEFAULT_CACHE_SIZE;
+
+  /**
+   * A flag indicating whether analysis is to generate dart2js related hint
+   * results.
+   */
+  bool dart2jsHint = false;
+
+  /**
+   * A flag indicating whether generic methods are to be supported (DEP 22).
+   */
+  bool enableGenericMethods = false;
+
+  /**
+   * A flag indicating whether analysis is to strictly follow the specification
+   * when generating warnings on "call" methods (fixes dartbug.com/21938).
+   */
+  bool enableStrictCallChecks = false;
+
+  /**
+   * A flag indicating whether mixins are allowed to inherit from types other
+   * than Object, and are allowed to reference `super`.
+   */
+  bool enableSuperMixins = false;
+
+  /**
+   * A flag indicating whether errors, warnings and hints should be generated
+   * for sources that are implicitly being analyzed.
+   */
+  bool generateImplicitErrors = true;
+
+  /**
+   * A flag indicating whether errors, warnings and hints should be generated
+   * for sources in the SDK.
+   */
+  bool generateSdkErrors = false;
+
+  /**
+   * A flag indicating whether analysis is to generate hint results (e.g. type
+   * inference based information and pub best practices).
+   */
+  bool hint = true;
+
+  /**
+   * A flag indicating whether incremental analysis should be used.
+   */
+  bool incremental = false;
+
+  /**
+   * A flag indicating whether incremental analysis should be used for API
+   * changes.
+   */
+  bool incrementalApi = false;
+
+  /**
+   * A flag indicating whether validation should be performed after incremental
+   * analysis.
+   */
+  bool incrementalValidation = false;
+
+  /**
+   * A flag indicating whether analysis is to generate lint warnings.
+   */
+  bool lint = false;
+
+  /**
+   * A flag indicating whether analysis is to parse comments.
+   */
+  bool preserveComments = true;
+
+  /**
+   * A flag indicating whether strong-mode analysis should be used.
+   */
+  bool strongMode = false;
+
+  /**
+   * Initialize a newly created set of analysis options to have their default
+   * values.
+   */
+  AnalysisOptionsImpl();
+
+  /**
+   * Initialize a newly created set of analysis options to have the same values
+   * as those in the given set of analysis [options].
+   */
+  @deprecated // Use new AnalysisOptionsImpl.from(options)
+  AnalysisOptionsImpl.con1(AnalysisOptions options) {
+    analyzeFunctionBodiesPredicate = options.analyzeFunctionBodiesPredicate;
+    cacheSize = options.cacheSize;
+    dart2jsHint = options.dart2jsHint;
+    enableStrictCallChecks = options.enableStrictCallChecks;
+    enableSuperMixins = options.enableSuperMixins;
+    generateImplicitErrors = options.generateImplicitErrors;
+    generateSdkErrors = options.generateSdkErrors;
+    hint = options.hint;
+    incremental = options.incremental;
+    incrementalApi = options.incrementalApi;
+    incrementalValidation = options.incrementalValidation;
+    lint = options.lint;
+    preserveComments = options.preserveComments;
+    strongMode = options.strongMode;
+  }
+
+  /**
+   * Initialize a newly created set of analysis options to have the same values
+   * as those in the given set of analysis [options].
+   */
+  AnalysisOptionsImpl.from(AnalysisOptions options) {
+    analyzeFunctionBodiesPredicate = options.analyzeFunctionBodiesPredicate;
+    cacheSize = options.cacheSize;
+    dart2jsHint = options.dart2jsHint;
+    enableStrictCallChecks = options.enableStrictCallChecks;
+    enableSuperMixins = options.enableSuperMixins;
+    generateImplicitErrors = options.generateImplicitErrors;
+    generateSdkErrors = options.generateSdkErrors;
+    hint = options.hint;
+    incremental = options.incremental;
+    incrementalApi = options.incrementalApi;
+    incrementalValidation = options.incrementalValidation;
+    lint = options.lint;
+    preserveComments = options.preserveComments;
+    strongMode = options.strongMode;
+  }
+
+  bool get analyzeFunctionBodies {
+    if (identical(analyzeFunctionBodiesPredicate, _analyzeAllFunctionBodies)) {
+      return true;
+    } else if (identical(
+        analyzeFunctionBodiesPredicate, _analyzeNoFunctionBodies)) {
+      return false;
+    } else {
+      throw new StateError('analyzeFunctionBodiesPredicate in use');
+    }
+  }
+
+  set analyzeFunctionBodies(bool value) {
+    if (value) {
+      analyzeFunctionBodiesPredicate = _analyzeAllFunctionBodies;
+    } else {
+      analyzeFunctionBodiesPredicate = _analyzeNoFunctionBodies;
+    }
+  }
+
+  @override
+  AnalyzeFunctionBodiesPredicate get analyzeFunctionBodiesPredicate =>
+      _analyzeFunctionBodiesPredicate;
+
+  set analyzeFunctionBodiesPredicate(AnalyzeFunctionBodiesPredicate value) {
+    if (value == null) {
+      throw new ArgumentError.notNull('analyzeFunctionBodiesPredicate');
+    }
+    _analyzeFunctionBodiesPredicate = value;
+  }
+
+  @deprecated
+  @override
+  bool get enableAsync => true;
+
+  @deprecated
+  void set enableAsync(bool enable) {
+    // Async support cannot be disabled
+  }
+
+  @deprecated
+  @override
+  bool get enableDeferredLoading => true;
+
+  @deprecated
+  void set enableDeferredLoading(bool enable) {
+    // Deferred loading support cannot be disabled
+  }
+
+  @deprecated
+  @override
+  bool get enableEnum => true;
+
+  @deprecated
+  void set enableEnum(bool enable) {
+    // Enum support cannot be disabled
+  }
+
+  @deprecated
+  @override
+  bool get enableNullAwareOperators => true;
+
+  @deprecated
+  void set enableNullAwareOperators(bool enable) {
+    // Null-aware operator support cannot be disabled
+  }
+
+  /**
+   * Predicate used for [analyzeFunctionBodiesPredicate] when
+   * [analyzeFunctionBodies] is set to `true`.
+   */
+  static bool _analyzeAllFunctionBodies(Source _) => true;
+
+  /**
+   * Predicate used for [analyzeFunctionBodiesPredicate] when
+   * [analyzeFunctionBodies] is set to `false`.
+   */
+  static bool _analyzeNoFunctionBodies(Source _) => false;
+}
+
+/**
+ *
+ */
+class AnalysisResult {
+  /**
+   * The change notices associated with this result, or `null` if there were no
+   * changes and there is no more work to be done.
+   */
+  final List<ChangeNotice> _notices;
+
+  /**
+   * The number of milliseconds required to determine which task was to be
+   * performed.
+   */
+  final int getTime;
+
+  /**
+   * The name of the class of the task that was performed.
+   */
+  final String taskClassName;
+
+  /**
+   * The number of milliseconds required to perform the task.
+   */
+  final int performTime;
+
+  /**
+   * Initialize a newly created analysis result to have the given values. The
+   * [notices] is the change notices associated with this result. The [getTime]
+   * is the number of milliseconds required to determine which task was to be
+   * performed. The [taskClassName] is the name of the class of the task that
+   * was performed. The [performTime] is the number of milliseconds required to
+   * perform the task.
+   */
+  AnalysisResult(
+      this._notices, this.getTime, this.taskClassName, this.performTime);
+
+  /**
+   * Return the change notices associated with this result, or `null` if there
+   * were no changes and there is no more work to be done.
+   */
+  List<ChangeNotice> get changeNotices => _notices;
+
+  /**
+   * Return `true` if there is more to be performed after the task that was
+   * performed.
+   */
+  bool get hasMoreWork => _notices != null;
+}
+
+/**
+ * An analysis task.
+ */
+abstract class AnalysisTask {
+  /**
+   * The context in which the task is to be performed.
+   */
+  final InternalAnalysisContext context;
+
+  /**
+   * The exception that was thrown while performing this task, or `null` if the
+   * task completed successfully.
+   */
+  CaughtException _thrownException;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given
+   * [context].
+   */
+  AnalysisTask(this.context);
+
+  /**
+   * Return the exception that was thrown while performing this task, or `null`
+   * if the task completed successfully.
+   */
+  CaughtException get exception => _thrownException;
+
+  /**
+   * Return a textual description of this task.
+   */
+  String get taskDescription;
+
+  /**
+   * Use the given [visitor] to visit this task. Throws an [AnalysisException]
+   * if the visitor throws the exception.
+   */
+  accept(AnalysisTaskVisitor visitor);
+
+  /**
+   * Perform this analysis task, protected by an exception handler. Throws an
+   * [AnalysisException] if an exception occurs while performing the task.
+   */
+  void internalPerform();
+
+  /**
+   * Perform this analysis task and use the given [visitor] to visit this task
+   * after it has completed. Throws an [AnalysisException] if the visitor throws
+   * the exception.
+   */
+  Object perform(AnalysisTaskVisitor visitor) {
+    try {
+      _safelyPerform();
+    } on AnalysisException catch (exception, stackTrace) {
+      _thrownException = new CaughtException(exception, stackTrace);
+      AnalysisEngine.instance.logger.logInformation(
+          "Task failed: $taskDescription",
+          new CaughtException(exception, stackTrace));
+    }
+    return PerformanceStatistics.analysisTaskVisitor
+        .makeCurrentWhile(() => accept(visitor));
+  }
+
+  @override
+  String toString() => taskDescription;
+
+  /**
+   * Perform this analysis task, ensuring that all exceptions are wrapped in an
+   * [AnalysisException]. Throws an [AnalysisException] if any exception occurs
+   * while performing the task
+   */
+  void _safelyPerform() {
+    try {
+      String contextName = context.name;
+      if (contextName == null) {
+        contextName = 'unnamed';
+      }
+      AnalysisEngine.instance.instrumentationService
+          .logAnalysisTask(contextName, taskDescription);
+      internalPerform();
+    } on AnalysisException {
+      rethrow;
+    } catch (exception, stackTrace) {
+      throw new AnalysisException(
+          exception.toString(), new CaughtException(exception, stackTrace));
+    }
+  }
+}
+
+/**
+ * An object used to visit tasks. While tasks are not structured in any
+ * interesting way, this class provides the ability to dispatch to an
+ * appropriate method.
+ */
+abstract class AnalysisTaskVisitor<E> {
+  /**
+   * Visit the given [task], returning the result of the visit. This method will
+   * throw an AnalysisException if the visitor throws an exception.
+   */
+  E visitGenerateDartErrorsTask(GenerateDartErrorsTask task);
+
+  /**
+   * Visit the given [task], returning the result of the visit. This method will
+   * throw an AnalysisException if the visitor throws an exception.
+   */
+  E visitGenerateDartHintsTask(GenerateDartHintsTask task);
+
+  /**
+   * Visit the given [task], returning the result of the visit. This method will
+   * throw an AnalysisException if the visitor throws an exception.
+   */
+  E visitGenerateDartLintsTask(GenerateDartLintsTask task);
+
+  /**
+   * Visit the given [task], returning the result of the visit. This method will
+   * throw an AnalysisException if the visitor throws an exception.
+   */
+  E visitGetContentTask(GetContentTask task);
+
+  /**
+   * Visit the given [task], returning the result of the visit. This method will
+   * throw an AnalysisException if the visitor throws an exception.
+   */
+  E visitIncrementalAnalysisTask(
+      IncrementalAnalysisTask incrementalAnalysisTask);
+
+  /**
+   * Visit the given [task], returning the result of the visit. This method will
+   * throw an AnalysisException if the visitor throws an exception.
+   */
+  E visitParseDartTask(ParseDartTask task);
+
+  /**
+   * Visit the given [task], returning the result of the visit. This method will
+   * throw an AnalysisException if the visitor throws an exception.
+   */
+  E visitParseHtmlTask(ParseHtmlTask task);
+
+  /**
+   * Visit the given [task], returning the result of the visit. This method will
+   * throw an AnalysisException if the visitor throws an exception.
+   */
+  E visitResolveDartLibraryCycleTask(ResolveDartLibraryCycleTask task);
+
+  /**
+   * Visit the given [task], returning the result of the visit. This method will
+   * throw an AnalysisException if the visitor throws an exception.
+   */
+  E visitResolveDartLibraryTask(ResolveDartLibraryTask task);
+
+  /**
+   * Visit the given [task], returning the result of the visit. This method will
+   * throw an AnalysisException if the visitor throws an exception.
+   */
+  E visitResolveDartUnitTask(ResolveDartUnitTask task);
+
+  /**
+   * Visit the given [task], returning the result of the visit. This method will
+   * throw an AnalysisException if the visitor throws an exception.
+   */
+  E visitResolveHtmlTask(ResolveHtmlTask task);
+
+  /**
+   * Visit the given [task], returning the result of the visit. This method will
+   * throw an AnalysisException if the visitor throws an exception.
+   */
+  E visitScanDartTask(ScanDartTask task);
+}
+
+/**
+ * A `CachedResult` is a single analysis result that is stored in a
+ * [SourceEntry].
+ */
+class CachedResult<E> {
+  /**
+   * The state of the cached value.
+   */
+  CacheState state;
+
+  /**
+   * The value being cached, or `null` if there is no value (for example, when
+   * the [state] is [CacheState.INVALID].
+   */
+  E value;
+
+  /**
+   * Initialize a newly created result holder to represent the value of data
+   * described by the given [descriptor].
+   */
+  CachedResult(DataDescriptor descriptor) {
+    state = CacheState.INVALID;
+    value = descriptor.defaultValue;
+  }
+}
+
+/**
+ * A single partition in an LRU cache of information related to analysis.
+ */
+abstract class CachePartition {
+  /**
+   * The context that owns this partition. Multiple contexts can reference a
+   * partition, but only one context can own it.
+   */
+  final InternalAnalysisContext context;
+
+  /**
+   * The maximum number of sources for which AST structures should be kept in
+   * the cache.
+   */
+  int _maxCacheSize = 0;
+
+  /**
+   * The policy used to determine which pieces of data to remove from the cache.
+   */
+  final CacheRetentionPolicy _retentionPolicy;
+
+  /**
+   * A table mapping the sources belonging to this partition to the information
+   * known about those sources.
+   */
+  HashMap<Source, SourceEntry> _sourceMap = new HashMap<Source, SourceEntry>();
+
+  /**
+   * A list containing the most recently accessed sources with the most recently
+   * used at the end of the list. When more sources are added than the maximum
+   * allowed then the least recently used source will be removed and will have
+   * it's cached AST structure flushed.
+   */
+  List<Source> _recentlyUsed;
+
+  /**
+   * Initialize a newly created cache to maintain at most [maxCacheSize] AST
+   * structures in the cache. The cache is owned by the give [context], and the
+   * [retentionPolicy] will be used to determine which pieces of data to remove
+   * from the cache.
+   */
+  CachePartition(this.context, this._maxCacheSize, this._retentionPolicy) {
+    _recentlyUsed = new List<Source>();
+  }
+
+  /**
+   * Return the number of entries in this partition that have an AST associated
+   * with them.
+   */
+  int get astSize {
+    int astSize = 0;
+    int count = _recentlyUsed.length;
+    for (int i = 0; i < count; i++) {
+      Source source = _recentlyUsed[i];
+      SourceEntry sourceEntry = _sourceMap[source];
+      if (sourceEntry is DartEntry) {
+        if (sourceEntry.anyParsedCompilationUnit != null) {
+          astSize++;
+        }
+      } else if (sourceEntry is HtmlEntry) {
+        if (sourceEntry.anyParsedUnit != null) {
+          astSize++;
+        }
+      }
+    }
+    return astSize;
+  }
+
+  /**
+   * Return a table mapping the sources known to the context to the information
+   * known about the source.
+   *
+   * <b>Note:</b> This method is only visible for use by [AnalysisCache] and
+   * should not be used for any other purpose.
+   */
+  Map<Source, SourceEntry> get map => _sourceMap;
+
+  /**
+   * Set the maximum size of the cache to the given [size].
+   */
+  void set maxCacheSize(int size) {
+    _maxCacheSize = size;
+    while (_recentlyUsed.length > _maxCacheSize) {
+      if (!_flushAstFromCache()) {
+        break;
+      }
+    }
+  }
+
+  /**
+   * Record that the AST associated with the given source was just read from the
+   * cache.
+   */
+  void accessedAst(Source source) {
+    if (_recentlyUsed.remove(source)) {
+      _recentlyUsed.add(source);
+      return;
+    }
+    while (_recentlyUsed.length >= _maxCacheSize) {
+      if (!_flushAstFromCache()) {
+        break;
+      }
+    }
+    _recentlyUsed.add(source);
+  }
+
+  /**
+   * Return `true` if the given [source] is contained in this partition.
+   */
+  bool contains(Source source);
+
+  /**
+   * Return the entry associated with the given [source].
+   */
+  SourceEntry get(Source source) => _sourceMap[source];
+
+  /**
+   * Return an iterator returning all of the map entries mapping sources to
+   * cache entries.
+   */
+  MapIterator<Source, SourceEntry> iterator() =>
+      new SingleMapIterator<Source, SourceEntry>(_sourceMap);
+
+  /**
+   * Associate the given [entry] with the given [source].
+   */
+  void put(Source source, SourceEntry entry) {
+    entry.fixExceptionState();
+    _sourceMap[source] = entry;
+  }
+
+  /**
+   * Remove all information related to the given [source] from this partition.
+   * Return the entry associated with the source, or `null` if there was cache
+   * entry for the source.
+   */
+  SourceEntry remove(Source source) {
+    _recentlyUsed.remove(source);
+    return _sourceMap.remove(source);
+  }
+
+  /**
+   * Record that the AST associated with the given [source] was just removed
+   * from the cache.
+   */
+  void removedAst(Source source) {
+    _recentlyUsed.remove(source);
+  }
+
+  /**
+   * Return the number of sources that are mapped to cache entries.
+   */
+  int size() => _sourceMap.length;
+
+  /**
+   * Record that the AST associated with the given [source] was just stored to
+   * the cache.
+   */
+  void storedAst(Source source) {
+    if (_recentlyUsed.contains(source)) {
+      return;
+    }
+    while (_recentlyUsed.length >= _maxCacheSize) {
+      if (!_flushAstFromCache()) {
+        break;
+      }
+    }
+    _recentlyUsed.add(source);
+  }
+
+  /**
+   * Attempt to flush one AST structure from the cache. Return `true` if a
+   * structure was flushed.
+   */
+  bool _flushAstFromCache() {
+    Source removedSource = _removeAstToFlush();
+    if (removedSource == null) {
+      return false;
+    }
+    SourceEntry sourceEntry = _sourceMap[removedSource];
+    if (sourceEntry is HtmlEntry) {
+      HtmlEntry htmlEntry = sourceEntry;
+      htmlEntry.flushAstStructures();
+    } else if (sourceEntry is DartEntry) {
+      DartEntry dartEntry = sourceEntry;
+      dartEntry.flushAstStructures();
+    }
+    return true;
+  }
+
+  /**
+   * Remove and return one source from the list of recently used sources whose
+   * AST structure can be flushed from the cache. The source that will be
+   * returned will be the source that has been unreferenced for the longest
+   * period of time but that is not a priority for analysis.
+   */
+  Source _removeAstToFlush() {
+    int sourceToRemove = -1;
+    for (int i = 0; i < _recentlyUsed.length; i++) {
+      Source source = _recentlyUsed[i];
+      RetentionPriority priority =
+          _retentionPolicy.getAstPriority(source, _sourceMap[source]);
+      if (priority == RetentionPriority.LOW) {
+        return _recentlyUsed.removeAt(i);
+      } else if (priority == RetentionPriority.MEDIUM && sourceToRemove < 0) {
+        sourceToRemove = i;
+      }
+    }
+    if (sourceToRemove < 0) {
+      // This happens if the retention policy returns a priority of HIGH for all
+      // of the sources that have been recently used. This is the case, for
+      // example, when the list of priority sources is bigger than the current
+      // cache size.
+      return null;
+    }
+    return _recentlyUsed.removeAt(sourceToRemove);
+  }
+}
+
+/**
+ * An object used to determine how important it is for data to be retained in
+ * the analysis cache.
+ */
+abstract class CacheRetentionPolicy {
+  /**
+   * Return the priority of retaining the AST structure for the given [source].
+   */
+  RetentionPriority getAstPriority(Source source, SourceEntry sourceEntry);
+}
+
+/**
+ * The possible states of cached data.
+ */
+class CacheState extends Enum<CacheState> {
+  /**
+   * The data is not in the cache and the last time an attempt was made to
+   * compute the data an exception occurred, making it pointless to attempt to
+   * compute the data again.
+   *
+   * Valid Transitions:
+   * * [INVALID] if a source was modified that might cause the data to be
+   *   computable
+   */
+  static const CacheState ERROR = const CacheState('ERROR', 0);
+
+  /**
+   * The data is not in the cache because it was flushed from the cache in order
+   * to control memory usage. If the data is recomputed, results do not need to
+   * be reported.
+   *
+   * Valid Transitions:
+   * * [IN_PROCESS] if the data is being recomputed
+   * * [INVALID] if a source was modified that causes the data to need to be
+   *   recomputed
+   */
+  static const CacheState FLUSHED = const CacheState('FLUSHED', 1);
+
+  /**
+   * The data might or might not be in the cache but is in the process of being
+   * recomputed.
+   *
+   * Valid Transitions:
+   * * [ERROR] if an exception occurred while trying to compute the data
+   * * [VALID] if the data was successfully computed and stored in the cache
+   */
+  static const CacheState IN_PROCESS = const CacheState('IN_PROCESS', 2);
+
+  /**
+   * The data is not in the cache and needs to be recomputed so that results can
+   * be reported.
+   *
+   * Valid Transitions:
+   * * [IN_PROCESS] if an attempt is being made to recompute the data
+   */
+  static const CacheState INVALID = const CacheState('INVALID', 3);
+
+  /**
+   * The data is in the cache and up-to-date.
+   *
+   * Valid Transitions:
+   * * [FLUSHED] if the data is removed in order to manage memory usage
+   * * [INVALID] if a source was modified in such a way as to invalidate the
+   *   previous data
+   */
+  static const CacheState VALID = const CacheState('VALID', 4);
+
+  static const List<CacheState> values = const [
+    ERROR,
+    FLUSHED,
+    IN_PROCESS,
+    INVALID,
+    VALID
+  ];
+
+  const CacheState(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
+ * An object that represents a change to the analysis results associated with a
+ * given source.
+ */
+abstract class ChangeNotice implements AnalysisErrorInfo {
+  /**
+   * The parsed, but maybe not resolved Dart AST that changed as a result of
+   * the analysis, or `null` if the AST was not changed.
+   */
+  CompilationUnit get parsedDartUnit;
+
+  /**
+   * The fully resolved Dart AST that changed as a result of the analysis, or
+   * `null` if the AST was not changed.
+   */
+  CompilationUnit get resolvedDartUnit;
+
+  /**
+   * The fully resolved HTML AST that changed as a result of the analysis, or
+   * `null` if the AST was not changed.
+   */
+  @deprecated
+  ht.HtmlUnit get resolvedHtmlUnit;
+
+  /**
+   * Return the source for which the result is being reported.
+   */
+  Source get source;
+}
+
+/**
+ * An implementation of a [ChangeNotice].
+ */
+class ChangeNoticeImpl implements ChangeNotice {
+  /**
+   * An empty list of change notices.
+   */
+  static const List<ChangeNoticeImpl> EMPTY_LIST = const <ChangeNoticeImpl>[];
+
+  /**
+   * The source for which the result is being reported.
+   */
+  final Source source;
+
+  /**
+   * The parsed, but maybe not resolved Dart AST that changed as a result of
+   * the analysis, or `null` if the AST was not changed.
+   */
+  CompilationUnit parsedDartUnit;
+
+  /**
+   * The fully resolved Dart AST that changed as a result of the analysis, or
+   * `null` if the AST was not changed.
+   */
+  CompilationUnit resolvedDartUnit;
+
+  /**
+   * The fully resolved HTML AST that changed as a result of the analysis, or
+   * `null` if the AST was not changed.
+   */
+  @deprecated
+  ht.HtmlUnit resolvedHtmlUnit;
+
+  /**
+   * The errors that changed as a result of the analysis, or `null` if errors
+   * were not changed.
+   */
+  List<AnalysisError> _errors;
+
+  /**
+   * The line information associated with the source, or `null` if errors were
+   * not changed.
+   */
+  LineInfo _lineInfo;
+
+  /**
+   * Initialize a newly created notice associated with the given source.
+   *
+   * @param source the source for which the change is being reported
+   */
+  ChangeNoticeImpl(this.source);
+
+  @override
+  List<AnalysisError> get errors => _errors;
+
+  @override
+  LineInfo get lineInfo => _lineInfo;
+
+  /**
+   * Set the errors that changed as a result of the analysis to the given
+   * [errors] and set the line information to the given [lineInfo].
+   */
+  void setErrors(List<AnalysisError> errors, LineInfo lineInfo) {
+    this._errors = errors;
+    this._lineInfo = lineInfo;
+    if (lineInfo == null) {
+      AnalysisEngine.instance.logger.logInformation("No line info: $source",
+          new CaughtException(new AnalysisException(), null));
+    }
+  }
+
+  @override
+  String toString() => "Changes for ${source.fullName}";
+}
+
+/**
+ * An indication of which sources have been added, changed, removed, or deleted.
+ * In the case of a changed source, there are multiple ways of indicating the
+ * nature of the change.
+ *
+ * No source should be added to the change set more than once, either with the
+ * same or a different kind of change. It does not make sense, for example, for
+ * a source to be both added and removed, and it is redundant for a source to be
+ * marked as changed in its entirety and changed in some specific range.
+ */
+class ChangeSet {
+  /**
+   * A list containing the sources that have been added.
+   */
+  final List<Source> addedSources = new List<Source>();
+
+  /**
+   * A list containing the sources that have been changed.
+   */
+  final List<Source> changedSources = new List<Source>();
+
+  /**
+   * A table mapping the sources whose content has been changed to the current
+   * content of those sources.
+   */
+  HashMap<Source, String> _changedContent = new HashMap<Source, String>();
+
+  /**
+   * A table mapping the sources whose content has been changed within a single
+   * range to the current content of those sources and information about the
+   * affected range.
+   */
+  final HashMap<Source, ChangeSet_ContentChange> changedRanges =
+      new HashMap<Source, ChangeSet_ContentChange>();
+
+  /**
+   * A list containing the sources that have been removed.
+   */
+  final List<Source> removedSources = new List<Source>();
+
+  /**
+   * A list containing the source containers specifying additional sources that
+   * have been removed.
+   */
+  final List<SourceContainer> removedContainers = new List<SourceContainer>();
+
+  /**
+   * A list containing the sources that have been deleted.
+   */
+  final List<Source> deletedSources = new List<Source>();
+
+  /**
+   * Return a table mapping the sources whose content has been changed to the
+   * current content of those sources.
+   */
+  Map<Source, String> get changedContents => _changedContent;
+
+  /**
+   * Return `true` if this change set does not contain any changes.
+   */
+  bool get isEmpty => addedSources.isEmpty &&
+      changedSources.isEmpty &&
+      _changedContent.isEmpty &&
+      changedRanges.isEmpty &&
+      removedSources.isEmpty &&
+      removedContainers.isEmpty &&
+      deletedSources.isEmpty;
+
+  /**
+   * Record that the specified [source] has been added and that its content is
+   * the default contents of the source.
+   */
+  void addedSource(Source source) {
+    addedSources.add(source);
+  }
+
+  /**
+   * Record that the specified [source] has been changed and that its content is
+   * the given [contents].
+   */
+  void changedContent(Source source, String contents) {
+    _changedContent[source] = contents;
+  }
+
+  /**
+   * Record that the specified [source] has been changed and that its content is
+   * the given [contents]. The [offset] is the offset into the current contents.
+   * The [oldLength] is the number of characters in the original contents that
+   * were replaced. The [newLength] is the number of characters in the
+   * replacement text.
+   */
+  void changedRange(Source source, String contents, int offset, int oldLength,
+      int newLength) {
+    changedRanges[source] =
+        new ChangeSet_ContentChange(contents, offset, oldLength, newLength);
+  }
+
+  /**
+   * Record that the specified [source] has been changed. If the content of the
+   * source was previously overridden, this has no effect (the content remains
+   * overridden). To cancel (or change) the override, use [changedContent]
+   * instead.
+   */
+  void changedSource(Source source) {
+    changedSources.add(source);
+  }
+
+  /**
+   * Record that the specified [source] has been deleted.
+   */
+  void deletedSource(Source source) {
+    deletedSources.add(source);
+  }
+
+  /**
+   * Record that the specified source [container] has been removed.
+   */
+  void removedContainer(SourceContainer container) {
+    if (container != null) {
+      removedContainers.add(container);
+    }
+  }
+
+  /**
+   * Record that the specified [source] has been removed.
+   */
+  void removedSource(Source source) {
+    if (source != null) {
+      removedSources.add(source);
+    }
+  }
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    bool needsSeparator =
+        _appendSources(buffer, addedSources, false, "addedSources");
+    needsSeparator = _appendSources(
+        buffer, changedSources, needsSeparator, "changedSources");
+    needsSeparator = _appendSources2(
+        buffer, _changedContent, needsSeparator, "changedContent");
+    needsSeparator =
+        _appendSources2(buffer, changedRanges, needsSeparator, "changedRanges");
+    needsSeparator = _appendSources(
+        buffer, deletedSources, needsSeparator, "deletedSources");
+    needsSeparator = _appendSources(
+        buffer, removedSources, needsSeparator, "removedSources");
+    int count = removedContainers.length;
+    if (count > 0) {
+      if (removedSources.isEmpty) {
+        if (needsSeparator) {
+          buffer.write("; ");
+        }
+        buffer.write("removed: from ");
+        buffer.write(count);
+        buffer.write(" containers");
+      } else {
+        buffer.write(", and more from ");
+        buffer.write(count);
+        buffer.write(" containers");
+      }
+    }
+    return buffer.toString();
+  }
+
+  /**
+   * Append the given [sources] to the given [buffer], prefixed with the given
+   * [label] and a separator if [needsSeparator] is `true`. Return `true` if
+   * future lists of sources will need a separator.
+   */
+  bool _appendSources(StringBuffer buffer, List<Source> sources,
+      bool needsSeparator, String label) {
+    if (sources.isEmpty) {
+      return needsSeparator;
+    }
+    if (needsSeparator) {
+      buffer.write("; ");
+    }
+    buffer.write(label);
+    String prefix = " ";
+    for (Source source in sources) {
+      buffer.write(prefix);
+      buffer.write(source.fullName);
+      prefix = ", ";
+    }
+    return true;
+  }
+
+  /**
+   * Append the given [sources] to the given [builder], prefixed with the given
+   * [label] and a separator if [needsSeparator] is `true`. Return `true` if
+   * future lists of sources will need a separator.
+   */
+  bool _appendSources2(StringBuffer buffer, HashMap<Source, dynamic> sources,
+      bool needsSeparator, String label) {
+    if (sources.isEmpty) {
+      return needsSeparator;
+    }
+    if (needsSeparator) {
+      buffer.write("; ");
+    }
+    buffer.write(label);
+    String prefix = " ";
+    for (Source source in sources.keys.toSet()) {
+      buffer.write(prefix);
+      buffer.write(source.fullName);
+      prefix = ", ";
+    }
+    return true;
+  }
+}
+
+/**
+ * A change to the content of a source.
+ */
+class ChangeSet_ContentChange {
+  /**
+   * The new contents of the source.
+   */
+  final String contents;
+
+  /**
+   * The offset into the current contents.
+   */
+  final int offset;
+
+  /**
+   * The number of characters in the original contents that were replaced
+   */
+  final int oldLength;
+
+  /**
+   * The number of characters in the replacement text.
+   */
+  final int newLength;
+
+  /**
+   * Initialize a newly created change object to represent a change to the
+   * content of a source. The [contents] is the new contents of the source. The
+   * [offse] ist the offset into the current contents. The [oldLength] is the
+   * number of characters in the original contents that were replaced. The
+   * [newLength] is the number of characters in the replacement text.
+   */
+  ChangeSet_ContentChange(
+      this.contents, this.offset, this.oldLength, this.newLength);
+}
+
+/**
+ * [ComputedResult] describes a value computed for a [ResultDescriptor].
+ */
+class ComputedResult<V> {
+  /**
+   * The context in which the value was computed.
+   */
+  final AnalysisContext context;
+
+  /**
+   * The descriptor of the result which was computed.
+   */
+  final ResultDescriptor<V> descriptor;
+
+  /**
+   * The target for which the result was computed.
+   */
+  final AnalysisTarget target;
+
+  /**
+   * The computed value.
+   */
+  final V value;
+
+  ComputedResult(this.context, this.descriptor, this.target, this.value);
+
+  @override
+  String toString() => '$descriptor of $target in $context';
+}
+
+/**
+ * A pair containing a library and a list of the (source, entry) pairs for
+ * compilation units in the library.
+ */
+class CycleBuilder_LibraryPair {
+  /**
+   * The library containing the compilation units.
+   */
+  ResolvableLibrary library;
+
+  /**
+   * The (source, entry) pairs representing the compilation units in the
+   * library.
+   */
+  List<CycleBuilder_SourceEntryPair> entryPairs;
+
+  /**
+   * Initialize a newly created pair from the given [library] and [entryPairs].
+   */
+  CycleBuilder_LibraryPair(this.library, this.entryPairs);
+}
+
+/**
+ * A pair containing a source and the cache entry associated with that source.
+ * They are used to reduce the number of times an entry must be looked up in the
+ * cache.
+ */
+class CycleBuilder_SourceEntryPair {
+  /**
+   * The source associated with the entry.
+   */
+  Source source;
+
+  /**
+   * The entry associated with the source.
+   */
+  DartEntry entry;
+
+  /**
+   * Initialize a newly created pair from the given [source] and [entry].
+   */
+  CycleBuilder_SourceEntryPair(this.source, this.entry);
+}
+
+/**
+ * The information cached by an analysis context about an individual Dart file.
+ */
+class DartEntry extends SourceEntry {
+  /**
+   * The data descriptor representing the element model representing a single
+   * compilation unit. This model is incomplete and should not be used except as
+   * input to another task.
+   */
+  static final DataDescriptor<List<AnalysisError>> BUILT_ELEMENT =
+      new DataDescriptor<List<AnalysisError>>("DartEntry.BUILT_ELEMENT");
+
+  /**
+   * The data descriptor representing the AST structure after the element model
+   * has been built (and declarations are resolved) but before other resolution
+   * has been performed.
+   */
+  static final DataDescriptor<CompilationUnit> BUILT_UNIT =
+      new DataDescriptor<CompilationUnit>("DartEntry.BUILT_UNIT");
+
+  /**
+   * The data descriptor representing the list of libraries that contain this
+   * compilation unit.
+   */
+  static final DataDescriptor<List<Source>> CONTAINING_LIBRARIES =
+      new DataDescriptor<List<Source>>(
+          "DartEntry.CONTAINING_LIBRARIES", Source.EMPTY_LIST);
+
+  /**
+   * The data descriptor representing the library element for the library. This
+   * data is only available for Dart files that are the defining compilation
+   * unit of a library.
+   */
+  static final DataDescriptor<LibraryElement> ELEMENT =
+      new DataDescriptor<LibraryElement>("DartEntry.ELEMENT");
+
+  /**
+   * The data descriptor representing the list of exported libraries. This data
+   * is only available for Dart files that are the defining compilation unit of
+   * a library.
+   */
+  static final DataDescriptor<List<Source>> EXPORTED_LIBRARIES =
+      new DataDescriptor<List<Source>>(
+          "DartEntry.EXPORTED_LIBRARIES", Source.EMPTY_LIST);
+
+  /**
+   * The data descriptor representing the hints resulting from auditing the
+   * source.
+   */
+  static final DataDescriptor<List<AnalysisError>> HINTS =
+      new DataDescriptor<List<AnalysisError>>(
+          "DartEntry.HINTS", AnalysisError.NO_ERRORS);
+
+  /**
+   * The data descriptor representing the list of imported libraries. This data
+   * is only available for Dart files that are the defining compilation unit of
+   * a library.
+   */
+  static final DataDescriptor<List<Source>> IMPORTED_LIBRARIES =
+      new DataDescriptor<List<Source>>(
+          "DartEntry.IMPORTED_LIBRARIES", Source.EMPTY_LIST);
+
+  /**
+   * The data descriptor representing the list of included parts. This data is
+   * only available for Dart files that are the defining compilation unit of a
+   * library.
+   */
+  static final DataDescriptor<List<Source>> INCLUDED_PARTS =
+      new DataDescriptor<List<Source>>(
+          "DartEntry.INCLUDED_PARTS", Source.EMPTY_LIST);
+
+  /**
+   * The data descriptor representing the client flag. This data is only
+   * available for Dart files that are the defining compilation unit of a
+   * library.
+   */
+  static final DataDescriptor<bool> IS_CLIENT =
+      new DataDescriptor<bool>("DartEntry.IS_CLIENT", false);
+
+  /**
+   * The data descriptor representing the launchable flag. This data is only
+   * available for Dart files that are the defining compilation unit of a
+   * library.
+   */
+  static final DataDescriptor<bool> IS_LAUNCHABLE =
+      new DataDescriptor<bool>("DartEntry.IS_LAUNCHABLE", false);
+
+  /**
+   * The data descriptor representing lint warnings resulting from auditing the
+   * source.
+   */
+  static final DataDescriptor<List<AnalysisError>> LINTS =
+      new DataDescriptor<List<AnalysisError>>(
+          "DartEntry.LINTS", AnalysisError.NO_ERRORS);
+
+  /**
+   * The data descriptor representing the errors resulting from parsing the
+   * source.
+   */
+  static final DataDescriptor<List<AnalysisError>> PARSE_ERRORS =
+      new DataDescriptor<List<AnalysisError>>(
+          "DartEntry.PARSE_ERRORS", AnalysisError.NO_ERRORS);
+
+  /**
+   * The data descriptor representing the parsed AST structure.
+   */
+  static final DataDescriptor<CompilationUnit> PARSED_UNIT =
+      new DataDescriptor<CompilationUnit>("DartEntry.PARSED_UNIT");
+
+  /**
+   * The data descriptor representing the public namespace of the library. This
+   * data is only available for Dart files that are the defining compilation
+   * unit of a library.
+   */
+  static final DataDescriptor<Namespace> PUBLIC_NAMESPACE =
+      new DataDescriptor<Namespace>("DartEntry.PUBLIC_NAMESPACE");
+
+  /**
+   * The data descriptor representing the errors resulting from resolving the
+   * source.
+   */
+  static final DataDescriptor<List<AnalysisError>> RESOLUTION_ERRORS =
+      new DataDescriptor<List<AnalysisError>>(
+          "DartEntry.RESOLUTION_ERRORS", AnalysisError.NO_ERRORS);
+
+  /**
+   * The data descriptor representing the resolved AST structure.
+   */
+  static final DataDescriptor<CompilationUnit> RESOLVED_UNIT =
+      new DataDescriptor<CompilationUnit>("DartEntry.RESOLVED_UNIT");
+
+  /**
+   * The data descriptor representing the errors resulting from scanning the
+   * source.
+   */
+  static final DataDescriptor<List<AnalysisError>> SCAN_ERRORS =
+      new DataDescriptor<List<AnalysisError>>(
+          "DartEntry.SCAN_ERRORS", AnalysisError.NO_ERRORS);
+
+  /**
+   * The data descriptor representing the source kind.
+   */
+  static final DataDescriptor<SourceKind> SOURCE_KIND =
+      new DataDescriptor<SourceKind>(
+          "DartEntry.SOURCE_KIND", SourceKind.UNKNOWN);
+
+  /**
+   * The data descriptor representing the token stream.
+   */
+  static final DataDescriptor<Token> TOKEN_STREAM =
+      new DataDescriptor<Token>("DartEntry.TOKEN_STREAM");
+
+  /**
+   * The data descriptor representing the errors resulting from verifying the
+   * source.
+   */
+  static final DataDescriptor<List<AnalysisError>> VERIFICATION_ERRORS =
+      new DataDescriptor<List<AnalysisError>>(
+          "DartEntry.VERIFICATION_ERRORS", AnalysisError.NO_ERRORS);
+
+  /**
+   * The list of libraries that contain this compilation unit. The list will be
+   * empty if there are no known libraries that contain this compilation unit.
+   */
+  List<Source> _containingLibraries = new List<Source>();
+
+  /**
+   * The information known as a result of resolving this compilation unit as
+   * part of the library that contains this unit. This field will never be
+   * `null`.
+   */
+  ResolutionState _resolutionState = new ResolutionState();
+
+  /**
+   * Return all of the errors associated with the compilation unit that are
+   * currently cached.
+   */
+  List<AnalysisError> get allErrors {
+    List<AnalysisError> errors = new List<AnalysisError>();
+    errors.addAll(super.allErrors);
+    errors.addAll(getValue(SCAN_ERRORS));
+    errors.addAll(getValue(PARSE_ERRORS));
+    ResolutionState state = _resolutionState;
+    while (state != null) {
+      errors.addAll(state.getValue(RESOLUTION_ERRORS));
+      errors.addAll(state.getValue(VERIFICATION_ERRORS));
+      errors.addAll(state.getValue(HINTS));
+      errors.addAll(state.getValue(LINTS));
+      state = state._nextState;
+    }
+    if (errors.length == 0) {
+      return AnalysisError.NO_ERRORS;
+    }
+    return errors;
+  }
+
+  /**
+   * Return a valid parsed compilation unit, either an unresolved AST structure
+   * or the result of resolving the AST structure in the context of some
+   * library, or `null` if there is no parsed compilation unit available.
+   */
+  CompilationUnit get anyParsedCompilationUnit {
+    if (getState(PARSED_UNIT) == CacheState.VALID) {
+      return getValue(PARSED_UNIT);
+    }
+    ResolutionState state = _resolutionState;
+    while (state != null) {
+      if (state.getState(BUILT_UNIT) == CacheState.VALID) {
+        return state.getValue(BUILT_UNIT);
+      }
+      state = state._nextState;
+    }
+
+    return anyResolvedCompilationUnit;
+  }
+
+  /**
+   * Return the result of resolving the compilation unit as part of any library,
+   * or `null` if there is no cached resolved compilation unit.
+   */
+  CompilationUnit get anyResolvedCompilationUnit {
+    ResolutionState state = _resolutionState;
+    while (state != null) {
+      if (state.getState(RESOLVED_UNIT) == CacheState.VALID) {
+        return state.getValue(RESOLVED_UNIT);
+      }
+      state = state._nextState;
+    }
+    return null;
+  }
+
+  /**
+   * The libraries that are known to contain this part.
+   */
+  List<Source> get containingLibraries => _containingLibraries;
+
+  /**
+   * Set the list of libraries that contain this compilation unit to contain
+   * only the given [librarySource]. This method should only be invoked on
+   * entries that represent a library.
+   */
+  void set containingLibrary(Source librarySource) {
+    _containingLibraries.clear();
+    _containingLibraries.add(librarySource);
+  }
+
+  @override
+  List<DataDescriptor> get descriptors {
+    List<DataDescriptor> result = super.descriptors;
+    result.addAll(<DataDescriptor>[
+      DartEntry.SOURCE_KIND,
+      DartEntry.CONTAINING_LIBRARIES,
+      DartEntry.PARSE_ERRORS,
+      DartEntry.PARSED_UNIT,
+      DartEntry.SCAN_ERRORS,
+      DartEntry.SOURCE_KIND,
+      DartEntry.TOKEN_STREAM
+    ]);
+    SourceKind kind = getValue(DartEntry.SOURCE_KIND);
+    if (kind == SourceKind.LIBRARY) {
+      result.addAll(<DataDescriptor>[
+        DartEntry.ELEMENT,
+        DartEntry.EXPORTED_LIBRARIES,
+        DartEntry.IMPORTED_LIBRARIES,
+        DartEntry.INCLUDED_PARTS,
+        DartEntry.IS_CLIENT,
+        DartEntry.IS_LAUNCHABLE,
+        DartEntry.PUBLIC_NAMESPACE
+      ]);
+    }
+    return result;
+  }
+
+  /**
+   * Return `true` if this entry has an AST structure that can be resolved, even
+   * if it needs to be copied. Returning `true` implies that the method
+   * [resolvableCompilationUnit] will return a non-`null` result.
+   */
+  bool get hasResolvableCompilationUnit {
+    if (getState(PARSED_UNIT) == CacheState.VALID) {
+      return true;
+    }
+    ResolutionState state = _resolutionState;
+    while (state != null) {
+      if (state.getState(BUILT_UNIT) == CacheState.VALID ||
+          state.getState(RESOLVED_UNIT) == CacheState.VALID) {
+        return true;
+      }
+      state = state._nextState;
+    }
+
+    return false;
+  }
+
+  @override
+  SourceKind get kind => getValue(SOURCE_KIND);
+
+  /**
+   * The library sources containing the receiver's source.
+   */
+  List<Source> get librariesContaining {
+    ResolutionState state = _resolutionState;
+    List<Source> result = new List<Source>();
+    while (state != null) {
+      if (state._librarySource != null) {
+        result.add(state._librarySource);
+      }
+      state = state._nextState;
+    }
+    return result;
+  }
+
+  /**
+   * Get a list of all the library-dependent descriptors for which values may
+   * be stored in this SourceEntry.
+   */
+  List<DataDescriptor> get libraryDescriptors {
+    return <DataDescriptor>[
+      DartEntry.BUILT_ELEMENT,
+      DartEntry.BUILT_UNIT,
+      DartEntry.RESOLUTION_ERRORS,
+      DartEntry.RESOLVED_UNIT,
+      DartEntry.VERIFICATION_ERRORS,
+      DartEntry.HINTS,
+      DartEntry.LINTS
+    ];
+  }
+
+  /**
+   * A compilation unit that has not been accessed by any other client and can
+   * therefore safely be modified by the reconciler, or `null` if the source has
+   * not been parsed.
+   */
+  CompilationUnit get resolvableCompilationUnit {
+    if (getState(PARSED_UNIT) == CacheState.VALID) {
+      CompilationUnit unit = getValue(PARSED_UNIT);
+      setState(PARSED_UNIT, CacheState.FLUSHED);
+      return unit;
+    }
+    ResolutionState state = _resolutionState;
+    while (state != null) {
+      if (state.getState(BUILT_UNIT) == CacheState.VALID) {
+        // TODO(brianwilkerson) We're cloning the structure to remove any
+        // previous resolution data, but I'm not sure that's necessary.
+        return state.getValue(BUILT_UNIT).accept(new AstCloner());
+      }
+      if (state.getState(RESOLVED_UNIT) == CacheState.VALID) {
+        return state.getValue(RESOLVED_UNIT).accept(new AstCloner());
+      }
+      state = state._nextState;
+    }
+    return null;
+  }
+
+  /**
+   * Add the given [librarySource] to the list of libraries that contain this
+   * part. This method should only be invoked on entries that represent a part.
+   */
+  void addContainingLibrary(Source librarySource) {
+    _containingLibraries.add(librarySource);
+  }
+
+  /**
+   * Flush any AST structures being maintained by this entry.
+   */
+  void flushAstStructures() {
+    _flush(TOKEN_STREAM);
+    _flush(PARSED_UNIT);
+    _resolutionState.flushAstStructures();
+  }
+
+  /**
+   * Return the state of the data represented by the given [descriptor] in the
+   * context of the given [librarySource].
+   */
+  CacheState getStateInLibrary(
+      DataDescriptor descriptor, Source librarySource) {
+    if (!_isValidLibraryDescriptor(descriptor)) {
+      throw new ArgumentError("Invalid descriptor: $descriptor");
+    }
+    ResolutionState state = _resolutionState;
+    while (state != null) {
+      if (librarySource == state._librarySource) {
+        return state.getState(descriptor);
+      }
+      state = state._nextState;
+    }
+    return CacheState.INVALID;
+  }
+
+  /**
+   * Return the value of the data represented by the given [descriptor] in the
+   * context of the given [librarySource], or `null` if the data represented by
+   * the descriptor is not in the cache.
+   */
+  Object getValueInLibrary(DataDescriptor descriptor, Source librarySource) {
+    if (!_isValidLibraryDescriptor(descriptor)) {
+      throw new ArgumentError("Invalid descriptor: $descriptor");
+    }
+    ResolutionState state = _resolutionState;
+    while (state != null) {
+      if (librarySource == state._librarySource) {
+        return state.getValue(descriptor);
+      }
+      state = state._nextState;
+    }
+    return descriptor.defaultValue;
+  }
+
+  /**
+   * Return `true` if the data represented by the given [descriptor] is marked
+   * as being invalid. If the descriptor represents library-specific data then
+   * this method will return `true` if the data associated with any library it
+   * marked as invalid.
+   */
+  bool hasInvalidData(DataDescriptor descriptor) {
+    if (_isValidDescriptor(descriptor)) {
+      return getState(descriptor) == CacheState.INVALID;
+    } else if (_isValidLibraryDescriptor(descriptor)) {
+      ResolutionState state = _resolutionState;
+      while (state != null) {
+        if (state.getState(descriptor) == CacheState.INVALID) {
+          return true;
+        }
+        state = state._nextState;
+      }
+    }
+    return false;
+  }
+
+  @override
+  void invalidateAllInformation() {
+    super.invalidateAllInformation();
+    setState(SCAN_ERRORS, CacheState.INVALID);
+    setState(TOKEN_STREAM, CacheState.INVALID);
+    setState(SOURCE_KIND, CacheState.INVALID);
+    setState(PARSE_ERRORS, CacheState.INVALID);
+    setState(PARSED_UNIT, CacheState.INVALID);
+    _discardCachedResolutionInformation(true);
+  }
+
+  /**
+   * Invalidate all of the resolution information associated with the
+   * compilation unit. The flag [invalidateUris] should be `true` if the cached
+   * results of converting URIs to source files should also be invalidated.
+   */
+  void invalidateAllResolutionInformation(bool invalidateUris) {
+    if (getState(PARSED_UNIT) == CacheState.FLUSHED) {
+      ResolutionState state = _resolutionState;
+      while (state != null) {
+        if (state.getState(BUILT_UNIT) == CacheState.VALID) {
+          CompilationUnit unit = state.getValue(BUILT_UNIT);
+          setValue(PARSED_UNIT, unit.accept(new AstCloner()));
+          break;
+        } else if (state.getState(RESOLVED_UNIT) == CacheState.VALID) {
+          CompilationUnit unit = state.getValue(RESOLVED_UNIT);
+          setValue(PARSED_UNIT, unit.accept(new AstCloner()));
+          break;
+        }
+        state = state._nextState;
+      }
+    }
+    _discardCachedResolutionInformation(invalidateUris);
+  }
+
+  /**
+   * Invalidate all of the parse and resolution information associated with
+   * this source.
+   */
+  void invalidateParseInformation() {
+    setState(SOURCE_KIND, CacheState.INVALID);
+    setState(PARSE_ERRORS, CacheState.INVALID);
+    setState(PARSED_UNIT, CacheState.INVALID);
+    _containingLibraries.clear();
+    _discardCachedResolutionInformation(true);
+  }
+
+  /**
+   * Record that an [exception] occurred while attempting to build the element
+   * model for the source represented by this entry in the context of the given
+   * [library]. This will set the state of all resolution-based information as
+   * being in error, but will not change the state of any parse results.
+   */
+  void recordBuildElementErrorInLibrary(
+      Source librarySource, CaughtException exception) {
+    setStateInLibrary(BUILT_ELEMENT, librarySource, CacheState.ERROR);
+    setStateInLibrary(BUILT_UNIT, librarySource, CacheState.ERROR);
+    recordResolutionErrorInLibrary(librarySource, exception);
+  }
+
+  @override
+  void recordContentError(CaughtException exception) {
+    super.recordContentError(exception);
+    recordScanError(exception);
+  }
+
+  /**
+   * Record that an error occurred while attempting to generate hints for the
+   * source represented by this entry. This will set the state of all
+   * verification information as being in error. The [librarySource] is the
+   * source of the library in which hints were being generated. The [exception]
+   * is the exception that shows where the error occurred.
+   */
+  void recordHintErrorInLibrary(
+      Source librarySource, CaughtException exception) {
+    this.exception = exception;
+    ResolutionState state = _getOrCreateResolutionState(librarySource);
+    state.recordHintError();
+  }
+
+  /**
+   * Record that an error occurred while attempting to generate lints for the
+   * source represented by this entry. This will set the state of all
+   * verification information as being in error. The [librarySource] is the
+   * source of the library in which lints were being generated. The [exception]
+   * is the exception that shows where the error occurred.
+   */
+  void recordLintErrorInLibrary(
+      Source librarySource, CaughtException exception) {
+    this.exception = exception;
+    ResolutionState state = _getOrCreateResolutionState(librarySource);
+    state.recordLintError();
+  }
+
+  /**
+   * Record that an [exception] occurred while attempting to scan or parse the
+   * entry represented by this entry. This will set the state of all information,
+   * including any resolution-based information, as being in error.
+   */
+  void recordParseError(CaughtException exception) {
+    setState(SOURCE_KIND, CacheState.ERROR);
+    setState(PARSE_ERRORS, CacheState.ERROR);
+    setState(PARSED_UNIT, CacheState.ERROR);
+    setState(EXPORTED_LIBRARIES, CacheState.ERROR);
+    setState(IMPORTED_LIBRARIES, CacheState.ERROR);
+    setState(INCLUDED_PARTS, CacheState.ERROR);
+    recordResolutionError(exception);
+  }
+
+  /**
+   * Record that an [exception] occurred while attempting to resolve the source
+   * represented by this entry. This will set the state of all resolution-based
+   * information as being in error, but will not change the state of any parse
+   * results.
+   */
+  void recordResolutionError(CaughtException exception) {
+    this.exception = exception;
+    setState(ELEMENT, CacheState.ERROR);
+    setState(IS_CLIENT, CacheState.ERROR);
+    setState(IS_LAUNCHABLE, CacheState.ERROR);
+    setState(PUBLIC_NAMESPACE, CacheState.ERROR);
+    _resolutionState.recordResolutionErrorsInAllLibraries();
+  }
+
+  /**
+   * Record that an error occurred while attempting to resolve the source
+   * represented by this entry. This will set the state of all resolution-based
+   * information as being in error, but will not change the state of any parse
+   * results. The [librarySource] is the source of the library in which
+   * resolution was being performed. The [exception] is the exception that shows
+   * where the error occurred.
+   */
+  void recordResolutionErrorInLibrary(
+      Source librarySource, CaughtException exception) {
+    this.exception = exception;
+    setState(ELEMENT, CacheState.ERROR);
+    setState(IS_CLIENT, CacheState.ERROR);
+    setState(IS_LAUNCHABLE, CacheState.ERROR);
+    setState(PUBLIC_NAMESPACE, CacheState.ERROR);
+    ResolutionState state = _getOrCreateResolutionState(librarySource);
+    state.recordResolutionError();
+  }
+
+  /**
+   * Record that an [exception] occurred while attempting to scan or parse the
+   * entry represented by this entry. This will set the state of all
+   * information, including any resolution-based information, as being in error.
+   */
+  @override
+  void recordScanError(CaughtException exception) {
+    super.recordScanError(exception);
+    setState(SCAN_ERRORS, CacheState.ERROR);
+    setState(TOKEN_STREAM, CacheState.ERROR);
+    recordParseError(exception);
+  }
+
+  /**
+   * Record that an [exception] occurred while attempting to generate errors and
+   * warnings for the source represented by this entry. This will set the state
+   * of all verification information as being in error. The [librarySource] is
+   * the source of the library in which verification was being performed. The
+   * [exception] is the exception that shows where the error occurred.
+   */
+  void recordVerificationErrorInLibrary(
+      Source librarySource, CaughtException exception) {
+    this.exception = exception;
+    ResolutionState state = _getOrCreateResolutionState(librarySource);
+    state.recordVerificationError();
+  }
+
+  /**
+   * Remove the given [library] from the list of libraries that contain this
+   * part. This method should only be invoked on entries that represent a part.
+   */
+  void removeContainingLibrary(Source library) {
+    _containingLibraries.remove(library);
+  }
+
+  /**
+   * Remove any resolution information associated with this compilation unit
+   * being part of the given [library], presumably because it is no longer part
+   * of the library.
+   */
+  void removeResolution(Source library) {
+    if (library != null) {
+      if (library == _resolutionState._librarySource) {
+        if (_resolutionState._nextState == null) {
+          _resolutionState.invalidateAllResolutionInformation();
+        } else {
+          _resolutionState = _resolutionState._nextState;
+        }
+      } else {
+        ResolutionState priorState = _resolutionState;
+        ResolutionState state = _resolutionState._nextState;
+        while (state != null) {
+          if (library == state._librarySource) {
+            priorState._nextState = state._nextState;
+            break;
+          }
+          priorState = state;
+          state = state._nextState;
+        }
+      }
+    }
+  }
+
+  /**
+   * Set the state of the data represented by the given [descriptor] in the
+   * context of the given [library] to the given [state].
+   */
+  void setStateInLibrary(
+      DataDescriptor descriptor, Source library, CacheState state) {
+    if (!_isValidLibraryDescriptor(descriptor)) {
+      throw new ArgumentError("Invalid descriptor: $descriptor");
+    }
+    ResolutionState resolutionState = _getOrCreateResolutionState(library);
+    resolutionState.setState(descriptor, state);
+  }
+
+  /**
+   * Set the value of the data represented by the given [descriptor] in the
+   * context of the given [library] to the given [value], and set the state of
+   * that data to [CacheState.VALID].
+   */
+  void setValueInLibrary(
+      DataDescriptor descriptor, Source library, Object value) {
+    if (!_isValidLibraryDescriptor(descriptor)) {
+      throw new ArgumentError("Invalid descriptor: $descriptor");
+    }
+    ResolutionState state = _getOrCreateResolutionState(library);
+    state.setValue(descriptor, value);
+  }
+
+  /**
+   * Invalidate all of the resolution information associated with the
+   * compilation unit. The flag [invalidateUris] should be `true` if the cached
+   * results of converting URIs to source files should also be invalidated.
+   */
+  void _discardCachedResolutionInformation(bool invalidateUris) {
+    setState(ELEMENT, CacheState.INVALID);
+    setState(IS_CLIENT, CacheState.INVALID);
+    setState(IS_LAUNCHABLE, CacheState.INVALID);
+    setState(PUBLIC_NAMESPACE, CacheState.INVALID);
+    _resolutionState.invalidateAllResolutionInformation();
+    if (invalidateUris) {
+      setState(EXPORTED_LIBRARIES, CacheState.INVALID);
+      setState(IMPORTED_LIBRARIES, CacheState.INVALID);
+      setState(INCLUDED_PARTS, CacheState.INVALID);
+    }
+  }
+
+  /**
+   * Return a resolution state for the specified [library], creating one as
+   * necessary.
+   */
+  ResolutionState _getOrCreateResolutionState(Source library) {
+    ResolutionState state = _resolutionState;
+    if (state._librarySource == null) {
+      state._librarySource = library;
+      return state;
+    }
+    while (state._librarySource != library) {
+      if (state._nextState == null) {
+        ResolutionState newState = new ResolutionState();
+        newState._librarySource = library;
+        state._nextState = newState;
+        return newState;
+      }
+      state = state._nextState;
+    }
+    return state;
+  }
+
+  @override
+  bool _isValidDescriptor(DataDescriptor descriptor) {
+    return descriptor == CONTAINING_LIBRARIES ||
+        descriptor == ELEMENT ||
+        descriptor == EXPORTED_LIBRARIES ||
+        descriptor == IMPORTED_LIBRARIES ||
+        descriptor == INCLUDED_PARTS ||
+        descriptor == IS_CLIENT ||
+        descriptor == IS_LAUNCHABLE ||
+        descriptor == PARSED_UNIT ||
+        descriptor == PARSE_ERRORS ||
+        descriptor == PUBLIC_NAMESPACE ||
+        descriptor == SCAN_ERRORS ||
+        descriptor == SOURCE_KIND ||
+        descriptor == TOKEN_STREAM ||
+        super._isValidDescriptor(descriptor);
+  }
+
+  /**
+   * Return `true` if the [descriptor] is valid for this entry when the data is
+   * relative to a library.
+   */
+  bool _isValidLibraryDescriptor(DataDescriptor descriptor) {
+    return descriptor == BUILT_ELEMENT ||
+        descriptor == BUILT_UNIT ||
+        descriptor == HINTS ||
+        descriptor == LINTS ||
+        descriptor == RESOLUTION_ERRORS ||
+        descriptor == RESOLVED_UNIT ||
+        descriptor == VERIFICATION_ERRORS;
+  }
+
+  @override
+  bool _writeDiffOn(StringBuffer buffer, SourceEntry oldEntry) {
+    bool needsSeparator = super._writeDiffOn(buffer, oldEntry);
+    if (oldEntry is! DartEntry) {
+      if (needsSeparator) {
+        buffer.write("; ");
+      }
+      buffer.write("entry type changed; was ");
+      buffer.write(oldEntry.runtimeType.toString());
+      return true;
+    }
+    needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "tokenStream",
+        DartEntry.TOKEN_STREAM, oldEntry);
+    needsSeparator = _writeStateDiffOn(
+        buffer, needsSeparator, "scanErrors", DartEntry.SCAN_ERRORS, oldEntry);
+    needsSeparator = _writeStateDiffOn(
+        buffer, needsSeparator, "sourceKind", DartEntry.SOURCE_KIND, oldEntry);
+    needsSeparator = _writeStateDiffOn(
+        buffer, needsSeparator, "parsedUnit", DartEntry.PARSED_UNIT, oldEntry);
+    needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "parseErrors",
+        DartEntry.PARSE_ERRORS, oldEntry);
+    needsSeparator = _writeStateDiffOn(buffer, needsSeparator,
+        "importedLibraries", DartEntry.IMPORTED_LIBRARIES, oldEntry);
+    needsSeparator = _writeStateDiffOn(buffer, needsSeparator,
+        "exportedLibraries", DartEntry.EXPORTED_LIBRARIES, oldEntry);
+    needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "includedParts",
+        DartEntry.INCLUDED_PARTS, oldEntry);
+    needsSeparator = _writeStateDiffOn(
+        buffer, needsSeparator, "element", DartEntry.ELEMENT, oldEntry);
+    needsSeparator = _writeStateDiffOn(buffer, needsSeparator,
+        "publicNamespace", DartEntry.PUBLIC_NAMESPACE, oldEntry);
+    needsSeparator = _writeStateDiffOn(
+        buffer, needsSeparator, "clientServer", DartEntry.IS_CLIENT, oldEntry);
+    needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "launchable",
+        DartEntry.IS_LAUNCHABLE, oldEntry);
+    // TODO(brianwilkerson) Add better support for containingLibraries.
+    // It would be nice to be able to report on size-preserving changes.
+    int oldLibraryCount = (oldEntry as DartEntry)._containingLibraries.length;
+    int libraryCount = _containingLibraries.length;
+    if (oldLibraryCount != libraryCount) {
+      if (needsSeparator) {
+        buffer.write("; ");
+      }
+      buffer.write("containingLibraryCount = ");
+      buffer.write(oldLibraryCount);
+      buffer.write(" -> ");
+      buffer.write(libraryCount);
+      needsSeparator = true;
+    }
+    //
+    // Report change to the per-library state.
+    //
+    HashMap<Source, ResolutionState> oldStateMap =
+        new HashMap<Source, ResolutionState>();
+    ResolutionState state = (oldEntry as DartEntry)._resolutionState;
+    while (state != null) {
+      Source librarySource = state._librarySource;
+      if (librarySource != null) {
+        oldStateMap[librarySource] = state;
+      }
+      state = state._nextState;
+    }
+    state = _resolutionState;
+    while (state != null) {
+      Source librarySource = state._librarySource;
+      if (librarySource != null) {
+        ResolutionState oldState = oldStateMap.remove(librarySource);
+        if (oldState == null) {
+          if (needsSeparator) {
+            buffer.write("; ");
+          }
+          buffer.write("added resolution for ");
+          buffer.write(librarySource.fullName);
+          needsSeparator = true;
+        } else {
+          needsSeparator = oldState._writeDiffOn(
+              buffer, needsSeparator, oldEntry as DartEntry);
+        }
+      }
+      state = state._nextState;
+    }
+    for (Source librarySource in oldStateMap.keys.toSet()) {
+      if (needsSeparator) {
+        buffer.write("; ");
+      }
+      buffer.write("removed resolution for ");
+      buffer.write(librarySource.fullName);
+      needsSeparator = true;
+    }
+    return needsSeparator;
+  }
+
+  @override
+  void _writeOn(StringBuffer buffer) {
+    buffer.write("Dart: ");
+    super._writeOn(buffer);
+    _writeStateOn(buffer, "tokenStream", TOKEN_STREAM);
+    _writeStateOn(buffer, "scanErrors", SCAN_ERRORS);
+    _writeStateOn(buffer, "sourceKind", SOURCE_KIND);
+    _writeStateOn(buffer, "parsedUnit", PARSED_UNIT);
+    _writeStateOn(buffer, "parseErrors", PARSE_ERRORS);
+    _writeStateOn(buffer, "exportedLibraries", EXPORTED_LIBRARIES);
+    _writeStateOn(buffer, "importedLibraries", IMPORTED_LIBRARIES);
+    _writeStateOn(buffer, "includedParts", INCLUDED_PARTS);
+    _writeStateOn(buffer, "element", ELEMENT);
+    _writeStateOn(buffer, "publicNamespace", PUBLIC_NAMESPACE);
+    _writeStateOn(buffer, "clientServer", IS_CLIENT);
+    _writeStateOn(buffer, "launchable", IS_LAUNCHABLE);
+    _resolutionState._writeOn(buffer);
+  }
+}
+
+/**
+ * An immutable constant representing data that can be stored in the cache.
+ */
+class DataDescriptor<E> {
+  /**
+   * The next artificial hash code.
+   */
+  static int _NEXT_HASH_CODE = 0;
+
+  /**
+   * The artifitial hash code for this object.
+   */
+  final int _hashCode = _NEXT_HASH_CODE++;
+
+  /**
+   * The name of the descriptor, used for debugging purposes.
+   */
+  final String _name;
+
+  /**
+   * The default value used when the data does not exist.
+   */
+  final E defaultValue;
+
+  /**
+   * Initialize a newly created descriptor to have the given [name] and
+   * [defaultValue].
+   */
+  DataDescriptor(this._name, [this.defaultValue = null]);
+
+  @override
+  int get hashCode => _hashCode;
+
+  @override
+  String toString() => _name;
+}
+
+/**
+ * A retention policy that will keep AST's in the cache if there is analysis
+ * information that needs to be computed for a source, where the computation is
+ * dependent on having the AST.
+ */
+class DefaultRetentionPolicy implements CacheRetentionPolicy {
+  /**
+   * An instance of this class that can be shared.
+   */
+  static DefaultRetentionPolicy POLICY = new DefaultRetentionPolicy();
+
+  /**
+   * Return `true` if there is analysis information in the given [dartEntry]
+   * that needs to be computed, where the computation is dependent on having the
+   * AST.
+   */
+  bool astIsNeeded(DartEntry dartEntry) =>
+      dartEntry.hasInvalidData(DartEntry.HINTS) ||
+          dartEntry.hasInvalidData(DartEntry.LINTS) ||
+          dartEntry.hasInvalidData(DartEntry.VERIFICATION_ERRORS) ||
+          dartEntry.hasInvalidData(DartEntry.RESOLUTION_ERRORS);
+
+  @override
+  RetentionPriority getAstPriority(Source source, SourceEntry sourceEntry) {
+    if (sourceEntry is DartEntry) {
+      DartEntry dartEntry = sourceEntry;
+      if (astIsNeeded(dartEntry)) {
+        return RetentionPriority.MEDIUM;
+      }
+    }
+    return RetentionPriority.LOW;
+  }
+}
+
+/**
+ * Instances of the class `GenerateDartErrorsTask` generate errors and warnings for a single
+ * Dart source.
+ */
+class GenerateDartErrorsTask extends AnalysisTask {
+  /**
+   * The source for which errors and warnings are to be produced.
+   */
+  final Source source;
+
+  /**
+   * The compilation unit used to resolve the dependencies.
+   */
+  final CompilationUnit _unit;
+
+  /**
+   * The element model for the library containing the source.
+   */
+  final LibraryElement libraryElement;
+
+  /**
+   * The errors that were generated for the source.
+   */
+  List<AnalysisError> _errors;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given context.
+   *
+   * @param context the context in which the task is to be performed
+   * @param source the source for which errors and warnings are to be produced
+   * @param unit the compilation unit used to resolve the dependencies
+   * @param libraryElement the element model for the library containing the source
+   */
+  GenerateDartErrorsTask(InternalAnalysisContext context, this.source,
+      this._unit, this.libraryElement)
+      : super(context);
+
+  /**
+   * Return the errors that were generated for the source.
+   *
+   * @return the errors that were generated for the source
+   */
+  List<AnalysisError> get errors => _errors;
+
+  @override
+  String get taskDescription =>
+      "generate errors and warnings for ${source.fullName}";
+
+  @override
+  accept(AnalysisTaskVisitor visitor) =>
+      visitor.visitGenerateDartErrorsTask(this);
+
+  @override
+  void internalPerform() {
+    PerformanceStatistics.errors.makeCurrentWhile(() {
+      RecordingErrorListener errorListener = new RecordingErrorListener();
+      ErrorReporter errorReporter = new ErrorReporter(errorListener, source);
+      TypeProvider typeProvider = context.typeProvider;
+      //
+      // Validate the directives
+      //
+      validateDirectives(context, source, _unit, errorListener);
+      //
+      // Use the ConstantVerifier to verify the use of constants.
+      // This needs to happen before using the ErrorVerifier because some error
+      // codes need the computed constant values.
+      //
+      // TODO(paulberry): as a temporary workaround for issue 21572,
+      // ConstantVerifier is being run right after ConstantValueComputer, so we
+      // don't need to run it here.  Once issue 21572 is fixed, re-enable the
+      // call to ConstantVerifier.
+//      ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, libraryElement, typeProvider);
+//      _unit.accept(constantVerifier);
+      //
+      // Use the ErrorVerifier to compute the rest of the errors.
+      //
+      ErrorVerifier errorVerifier = new ErrorVerifier(
+          errorReporter,
+          libraryElement,
+          typeProvider,
+          new InheritanceManager(libraryElement),
+          context.analysisOptions.enableSuperMixins);
+      _unit.accept(errorVerifier);
+      _errors = errorListener.getErrorsForSource(source);
+    });
+  }
+
+  /**
+   * Check each directive in the given compilation unit to see if the referenced source exists and
+   * report an error if it does not.
+   *
+   * @param context the context in which the library exists
+   * @param librarySource the source representing the library containing the directives
+   * @param unit the compilation unit containing the directives to be validated
+   * @param errorListener the error listener to which errors should be reported
+   */
+  static void validateDirectives(AnalysisContext context, Source librarySource,
+      CompilationUnit unit, AnalysisErrorListener errorListener) {
+    for (Directive directive in unit.directives) {
+      if (directive is UriBasedDirective) {
+        validateReferencedSource(
+            context, librarySource, directive, errorListener);
+      }
+    }
+  }
+
+  /**
+   * Check the given directive to see if the referenced source exists and report an error if it does
+   * not.
+   *
+   * @param context the context in which the library exists
+   * @param librarySource the source representing the library containing the directive
+   * @param directive the directive to be verified
+   * @param errorListener the error listener to which errors should be reported
+   */
+  static void validateReferencedSource(
+      AnalysisContext context,
+      Source librarySource,
+      UriBasedDirective directive,
+      AnalysisErrorListener errorListener) {
+    Source source = directive.source;
+    if (source != null) {
+      if (context.exists(source)) {
+        return;
+      }
+    } else {
+      // Don't report errors already reported by ParseDartTask.resolveDirective
+      if (directive.validate() != null) {
+        return;
+      }
+    }
+    StringLiteral uriLiteral = directive.uri;
+    errorListener.onError(new AnalysisError(
+        librarySource,
+        uriLiteral.offset,
+        uriLiteral.length,
+        CompileTimeErrorCode.URI_DOES_NOT_EXIST,
+        [directive.uriContent]));
+  }
+}
+
+/**
+ * Instances of the class `GenerateDartHintsTask` generate hints for a single Dart library.
+ */
+class GenerateDartHintsTask extends AnalysisTask {
+  /**
+   * The compilation units that comprise the library, with the defining compilation unit appearing
+   * first in the list.
+   */
+  final List<TimestampedData<CompilationUnit>> _units;
+
+  /**
+   * The element model for the library being analyzed.
+   */
+  final LibraryElement libraryElement;
+
+  /**
+   * A table mapping the sources that were analyzed to the hints that were
+   * generated for the sources.
+   */
+  HashMap<Source, List<AnalysisError>> _hintMap;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given context.
+   *
+   * @param context the context in which the task is to be performed
+   * @param units the compilation units that comprise the library, with the defining compilation
+   *          unit appearing first in the list
+   * @param libraryElement the element model for the library being analyzed
+   */
+  GenerateDartHintsTask(
+      InternalAnalysisContext context, this._units, this.libraryElement)
+      : super(context);
+
+  /**
+   * Return a table mapping the sources that were analyzed to the hints that were generated for the
+   * sources, or `null` if the task has not been performed or if the analysis did not complete
+   * normally.
+   *
+   * @return a table mapping the sources that were analyzed to the hints that were generated for the
+   *         sources
+   */
+  HashMap<Source, List<AnalysisError>> get hintMap => _hintMap;
+
+  @override
+  String get taskDescription {
+    Source librarySource = libraryElement.source;
+    if (librarySource == null) {
+      return "generate Dart hints for library without source";
+    }
+    return "generate Dart hints for ${librarySource.fullName}";
+  }
+
+  @override
+  accept(AnalysisTaskVisitor visitor) =>
+      visitor.visitGenerateDartHintsTask(this);
+
+  @override
+  void internalPerform() {
+    //
+    // Gather the compilation units.
+    //
+    int unitCount = _units.length;
+    List<CompilationUnit> compilationUnits =
+        new List<CompilationUnit>(unitCount);
+    for (int i = 0; i < unitCount; i++) {
+      compilationUnits[i] = _units[i].data;
+    }
+    //
+    // Analyze all of the units.
+    //
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    HintGenerator hintGenerator =
+        new HintGenerator(compilationUnits, context, errorListener);
+    hintGenerator.generateForLibrary();
+    //
+    // Store the results.
+    //
+    _hintMap = new HashMap<Source, List<AnalysisError>>();
+    for (int i = 0; i < unitCount; i++) {
+      Source source = _units[i].data.element.source;
+      _hintMap[source] = errorListener.getErrorsForSource(source);
+    }
+  }
+}
+
+/// Generates lint feedback for a single Dart library.
+class GenerateDartLintsTask extends AnalysisTask {
+  ///The compilation units that comprise the library, with the defining
+  ///compilation unit appearing first in the list.
+  final List<TimestampedData<CompilationUnit>> _units;
+
+  /// The element model for the library being analyzed.
+  final LibraryElement libraryElement;
+
+  /// A mapping of analyzed sources to their associated lint warnings.
+  /// May be [null] if the task has not been performed or if analysis did not
+  /// complete normally.
+  HashMap<Source, List<AnalysisError>> lintMap;
+
+  /// Initialize a newly created task to perform lint checking over these
+  /// [_units] belonging to this [libraryElement] within the given [context].
+  GenerateDartLintsTask(context, this._units, this.libraryElement)
+      : super(context);
+
+  @override
+  String get taskDescription {
+    Source librarySource = libraryElement.source;
+    return (librarySource == null)
+        ? "generate Dart lints for library without source"
+        : "generate Dart lints for ${librarySource.fullName}";
+  }
+
+  @override
+  accept(AnalysisTaskVisitor visitor) =>
+      visitor.visitGenerateDartLintsTask(this);
+
+  @override
+  void internalPerform() {
+    Iterable<CompilationUnit> compilationUnits =
+        _units.map((TimestampedData<CompilationUnit> unit) => unit.data);
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    LintGenerator lintGenerator =
+        new LintGenerator(compilationUnits, errorListener);
+    lintGenerator.generate();
+
+    lintMap = new HashMap<Source, List<AnalysisError>>();
+    compilationUnits.forEach((CompilationUnit unit) {
+      Source source = unit.element.source;
+      lintMap[source] = errorListener.getErrorsForSource(source);
+    });
+  }
+}
+
+/**
+ * Instances of the class `GetContentTask` get the contents of a source.
+ */
+class GetContentTask extends AnalysisTask {
+  /**
+   * The source to be read.
+   */
+  final Source source;
+
+  /**
+   * A flag indicating whether this task is complete.
+   */
+  bool _complete = false;
+
+  /**
+   * The contents of the source.
+   */
+  String _content;
+
+  /**
+   * The errors that were produced by getting the source content.
+   */
+  final List<AnalysisError> errors = <AnalysisError>[];
+
+  /**
+   * The time at which the contents of the source were last modified.
+   */
+  int _modificationTime = -1;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given context.
+   *
+   * @param context the context in which the task is to be performed
+   * @param source the source to be parsed
+   * @param contentData the time-stamped contents of the source
+   */
+  GetContentTask(InternalAnalysisContext context, this.source)
+      : super(context) {
+    if (source == null) {
+      throw new IllegalArgumentException("Cannot get contents of null source");
+    }
+  }
+
+  /**
+   * Return the contents of the source, or `null` if the task has not completed or if there
+   * was an exception while getting the contents.
+   *
+   * @return the contents of the source
+   */
+  String get content => _content;
+
+  /**
+   * Return `true` if this task is complete. Unlike most tasks, this task is allowed to be
+   * visited more than once in order to support asynchronous IO. If the task is not complete when it
+   * is visited synchronously as part of the [AnalysisTask.perform]
+   * method, it will be visited again, using the same visitor, when the IO operation has been
+   * performed.
+   *
+   * @return `true` if this task is complete
+   */
+  bool get isComplete => _complete;
+
+  /**
+   * Return the time at which the contents of the source that was parsed were last modified, or a
+   * negative value if the task has not yet been performed or if an exception occurred.
+   *
+   * @return the time at which the contents of the source that was parsed were last modified
+   */
+  int get modificationTime => _modificationTime;
+
+  @override
+  String get taskDescription => "get contents of ${source.fullName}";
+
+  @override
+  accept(AnalysisTaskVisitor visitor) => visitor.visitGetContentTask(this);
+
+  @override
+  void internalPerform() {
+    _complete = true;
+    try {
+      TimestampedData<String> data = context.getContents(source);
+      _content = data.data;
+      _modificationTime = data.modificationTime;
+      AnalysisEngine.instance.instrumentationService
+          .logFileRead(source.fullName, _modificationTime, _content);
+    } catch (exception, stackTrace) {
+      errors.add(new AnalysisError(
+          source, 0, 0, ScannerErrorCode.UNABLE_GET_CONTENT, [exception]));
+      throw new AnalysisException("Could not get contents of $source",
+          new CaughtException(exception, stackTrace));
+    }
+  }
+}
+
+/**
+ * The information cached by an analysis context about an individual HTML file.
+ */
+class HtmlEntry extends SourceEntry {
+  /**
+   * The data descriptor representing the HTML element.
+   */
+  static final DataDescriptor<HtmlElement> ELEMENT =
+      new DataDescriptor<HtmlElement>("HtmlEntry.ELEMENT");
+
+  /**
+   * The data descriptor representing the hints resulting from auditing the
+   * source.
+   */
+  static final DataDescriptor<List<AnalysisError>> HINTS =
+      new DataDescriptor<List<AnalysisError>>(
+          "HtmlEntry.HINTS", AnalysisError.NO_ERRORS);
+
+  /**
+   * The data descriptor representing the errors resulting from parsing the
+   * source.
+   */
+  static final DataDescriptor<List<AnalysisError>> PARSE_ERRORS =
+      new DataDescriptor<List<AnalysisError>>(
+          "HtmlEntry.PARSE_ERRORS", AnalysisError.NO_ERRORS);
+
+  /**
+   * The data descriptor representing the parsed AST structure.
+   */
+  static final DataDescriptor<ht.HtmlUnit> PARSED_UNIT =
+      new DataDescriptor<ht.HtmlUnit>("HtmlEntry.PARSED_UNIT");
+
+  /**
+   * The data descriptor representing the resolved AST structure.
+   */
+  static final DataDescriptor<ht.HtmlUnit> RESOLVED_UNIT =
+      new DataDescriptor<ht.HtmlUnit>("HtmlEntry.RESOLVED_UNIT");
+
+  /**
+   * The data descriptor representing the list of referenced libraries.
+   */
+  static final DataDescriptor<List<Source>> REFERENCED_LIBRARIES =
+      new DataDescriptor<List<Source>>(
+          "HtmlEntry.REFERENCED_LIBRARIES", Source.EMPTY_LIST);
+
+  /**
+   * The data descriptor representing the errors resulting from resolving the
+   * source.
+   */
+  static final DataDescriptor<List<AnalysisError>> RESOLUTION_ERRORS =
+      new DataDescriptor<List<AnalysisError>>(
+          "HtmlEntry.RESOLUTION_ERRORS", AnalysisError.NO_ERRORS);
+
+  /**
+   * Return all of the errors associated with the HTML file that are currently
+   * cached.
+   */
+  List<AnalysisError> get allErrors {
+    List<AnalysisError> errors = new List<AnalysisError>();
+    errors.addAll(super.allErrors);
+    errors.addAll(getValue(PARSE_ERRORS));
+    errors.addAll(getValue(RESOLUTION_ERRORS));
+    errors.addAll(getValue(HINTS));
+    if (errors.length == 0) {
+      return AnalysisError.NO_ERRORS;
+    }
+    return errors;
+  }
+
+  /**
+   * Return a valid parsed unit, either an unresolved AST structure or the
+   * result of resolving the AST structure, or `null` if there is no parsed unit
+   * available.
+   */
+  ht.HtmlUnit get anyParsedUnit {
+    if (getState(PARSED_UNIT) == CacheState.VALID) {
+      return getValue(PARSED_UNIT);
+    }
+    if (getState(RESOLVED_UNIT) == CacheState.VALID) {
+      return getValue(RESOLVED_UNIT);
+    }
+    return null;
+  }
+
+  @override
+  List<DataDescriptor> get descriptors {
+    List<DataDescriptor> result = super.descriptors;
+    result.addAll([
+      HtmlEntry.ELEMENT,
+      HtmlEntry.PARSE_ERRORS,
+      HtmlEntry.PARSED_UNIT,
+      HtmlEntry.RESOLUTION_ERRORS,
+      HtmlEntry.RESOLVED_UNIT,
+      HtmlEntry.HINTS
+    ]);
+    return result;
+  }
+
+  @override
+  SourceKind get kind => SourceKind.HTML;
+
+  /**
+   * Flush any AST structures being maintained by this entry.
+   */
+  void flushAstStructures() {
+    _flush(PARSED_UNIT);
+    _flush(RESOLVED_UNIT);
+  }
+
+  @override
+  void invalidateAllInformation() {
+    super.invalidateAllInformation();
+    setState(PARSE_ERRORS, CacheState.INVALID);
+    setState(PARSED_UNIT, CacheState.INVALID);
+    setState(RESOLVED_UNIT, CacheState.INVALID);
+    invalidateAllResolutionInformation(true);
+  }
+
+  /**
+   * Invalidate all of the resolution information associated with the HTML file.
+   * If [invalidateUris] is `true`, the cached results of converting URIs to
+   * source files should also be invalidated.
+   */
+  void invalidateAllResolutionInformation(bool invalidateUris) {
+    setState(RESOLVED_UNIT, CacheState.INVALID);
+    setState(ELEMENT, CacheState.INVALID);
+    setState(RESOLUTION_ERRORS, CacheState.INVALID);
+    setState(HINTS, CacheState.INVALID);
+    if (invalidateUris) {
+      setState(REFERENCED_LIBRARIES, CacheState.INVALID);
+    }
+  }
+
+  /**
+   * Invalidate all of the parse and resolution information associated with
+   * this source.
+   */
+  void invalidateParseInformation() {
+    setState(PARSE_ERRORS, CacheState.INVALID);
+    setState(PARSED_UNIT, CacheState.INVALID);
+    invalidateAllResolutionInformation(true);
+  }
+
+  @override
+  void recordContentError(CaughtException exception) {
+    super.recordContentError(exception);
+    recordParseError(exception);
+  }
+
+  /**
+   * Record that an [exception] was encountered while attempting to parse the
+   * source associated with this entry.
+   */
+  void recordParseError(CaughtException exception) {
+    // If the scanning and parsing of HTML are separated,
+    // the following line can be removed.
+    recordScanError(exception);
+    setState(PARSE_ERRORS, CacheState.ERROR);
+    setState(PARSED_UNIT, CacheState.ERROR);
+    setState(REFERENCED_LIBRARIES, CacheState.ERROR);
+    recordResolutionError(exception);
+  }
+
+  /**
+   * Record that an [exception] was encountered while attempting to resolve the
+   * source associated with this entry.
+   */
+  void recordResolutionError(CaughtException exception) {
+    this.exception = exception;
+    setState(RESOLVED_UNIT, CacheState.ERROR);
+    setState(ELEMENT, CacheState.ERROR);
+    setState(RESOLUTION_ERRORS, CacheState.ERROR);
+    setState(HINTS, CacheState.ERROR);
+  }
+
+  @override
+  bool _isValidDescriptor(DataDescriptor descriptor) {
+    return descriptor == ELEMENT ||
+        descriptor == HINTS ||
+        descriptor == PARSED_UNIT ||
+        descriptor == PARSE_ERRORS ||
+        descriptor == REFERENCED_LIBRARIES ||
+        descriptor == RESOLUTION_ERRORS ||
+        descriptor == RESOLVED_UNIT ||
+        super._isValidDescriptor(descriptor);
+  }
+
+  @override
+  bool _writeDiffOn(StringBuffer buffer, SourceEntry oldEntry) {
+    bool needsSeparator = super._writeDiffOn(buffer, oldEntry);
+    if (oldEntry is! HtmlEntry) {
+      if (needsSeparator) {
+        buffer.write("; ");
+      }
+      buffer.write("entry type changed; was ");
+      buffer.write(oldEntry.runtimeType);
+      return true;
+    }
+    needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "parseErrors",
+        HtmlEntry.PARSE_ERRORS, oldEntry);
+    needsSeparator = _writeStateDiffOn(
+        buffer, needsSeparator, "parsedUnit", HtmlEntry.PARSED_UNIT, oldEntry);
+    needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "resolvedUnit",
+        HtmlEntry.RESOLVED_UNIT, oldEntry);
+    needsSeparator = _writeStateDiffOn(buffer, needsSeparator,
+        "resolutionErrors", HtmlEntry.RESOLUTION_ERRORS, oldEntry);
+    needsSeparator = _writeStateDiffOn(buffer, needsSeparator,
+        "referencedLibraries", HtmlEntry.REFERENCED_LIBRARIES, oldEntry);
+    needsSeparator = _writeStateDiffOn(
+        buffer, needsSeparator, "element", HtmlEntry.ELEMENT, oldEntry);
+    return needsSeparator;
+  }
+
+  @override
+  void _writeOn(StringBuffer buffer) {
+    buffer.write("Html: ");
+    super._writeOn(buffer);
+    _writeStateOn(buffer, "parseErrors", PARSE_ERRORS);
+    _writeStateOn(buffer, "parsedUnit", PARSED_UNIT);
+    _writeStateOn(buffer, "resolvedUnit", RESOLVED_UNIT);
+    _writeStateOn(buffer, "resolutionErrors", RESOLUTION_ERRORS);
+    _writeStateOn(buffer, "referencedLibraries", REFERENCED_LIBRARIES);
+    _writeStateOn(buffer, "element", ELEMENT);
+  }
+}
+
+/**
+ * An event indicating when a source either starts or stops being implicitly
+ * analyzed.
+ */
+class ImplicitAnalysisEvent {
+  /**
+   * The source whose status has changed.
+   */
+  final Source source;
+
+  /**
+   * A flag indicating whether the source is now being analyzed.
+   */
+  final bool isAnalyzed;
+
+  /**
+   * Initialize a newly created event to indicate that the given [source] has
+   * changed it status to match the [isAnalyzed] flag.
+   */
+  ImplicitAnalysisEvent(this.source, this.isAnalyzed);
+
+  @override
+  String toString() =>
+      '${isAnalyzed ? '' : 'not '}analyzing ${source.fullName}';
+}
+
+/**
+ * Instances of the class `IncrementalAnalysisCache` hold information used to perform
+ * incremental analysis.
+ *
+ * See [AnalysisContextImpl.setChangedContents].
+ */
+class IncrementalAnalysisCache {
+  final Source librarySource;
+
+  final Source source;
+
+  final String oldContents;
+
+  final CompilationUnit resolvedUnit;
+
+  String _newContents;
+
+  int _offset = 0;
+
+  int _oldLength = 0;
+
+  int _newLength = 0;
+
+  IncrementalAnalysisCache(
+      this.librarySource,
+      this.source,
+      this.resolvedUnit,
+      this.oldContents,
+      this._newContents,
+      this._offset,
+      this._oldLength,
+      this._newLength);
+
+  /**
+   * Determine if the cache contains source changes that need to be analyzed
+   *
+   * @return `true` if the cache contains changes to be analyzed, else `false`
+   */
+  bool get hasWork => _oldLength > 0 || _newLength > 0;
+
+  /**
+   * Return the current contents for the receiver's source.
+   *
+   * @return the contents (not `null`)
+   */
+  String get newContents => _newContents;
+
+  /**
+   * Return the number of characters in the replacement text.
+   *
+   * @return the replacement length (zero or greater)
+   */
+  int get newLength => _newLength;
+
+  /**
+   * Return the character position of the first changed character.
+   *
+   * @return the offset (zero or greater)
+   */
+  int get offset => _offset;
+
+  /**
+   * Return the number of characters that were replaced.
+   *
+   * @return the replaced length (zero or greater)
+   */
+  int get oldLength => _oldLength;
+
+  /**
+   * Determine if the incremental analysis result can be cached for the next incremental analysis.
+   *
+   * @param cache the prior incremental analysis cache
+   * @param unit the incrementally updated compilation unit
+   * @return the cache used for incremental analysis or `null` if incremental analysis results
+   *         cannot be cached for the next incremental analysis
+   */
+  static IncrementalAnalysisCache cacheResult(
+      IncrementalAnalysisCache cache, CompilationUnit unit) {
+    if (cache != null && unit != null) {
+      return new IncrementalAnalysisCache(cache.librarySource, cache.source,
+          unit, cache._newContents, cache._newContents, 0, 0, 0);
+    }
+    return null;
+  }
+
+  /**
+   * Determine if the cache should be cleared.
+   *
+   * @param cache the prior cache or `null` if none
+   * @param source the source being updated (not `null`)
+   * @return the cache used for incremental analysis or `null` if incremental analysis cannot
+   *         be performed
+   */
+  static IncrementalAnalysisCache clear(
+      IncrementalAnalysisCache cache, Source source) {
+    if (cache == null || cache.source == source) {
+      return null;
+    }
+    return cache;
+  }
+
+  /**
+   * Determine if incremental analysis can be performed from the given information.
+   *
+   * @param cache the prior cache or `null` if none
+   * @param source the source being updated (not `null`)
+   * @param oldContents the original source contents prior to this update (may be `null`)
+   * @param newContents the new contents after this incremental change (not `null`)
+   * @param offset the offset at which the change occurred
+   * @param oldLength the length of the text being replaced
+   * @param newLength the length of the replacement text
+   * @param sourceEntry the cached entry for the given source or `null` if none
+   * @return the cache used for incremental analysis or `null` if incremental analysis cannot
+   *         be performed
+   */
+  static IncrementalAnalysisCache update(
+      IncrementalAnalysisCache cache,
+      Source source,
+      String oldContents,
+      String newContents,
+      int offset,
+      int oldLength,
+      int newLength,
+      SourceEntry sourceEntry) {
+    // Determine the cache resolved unit
+    Source librarySource = null;
+    CompilationUnit unit = null;
+    if (sourceEntry is DartEntry) {
+      DartEntry dartEntry = sourceEntry;
+      List<Source> librarySources = dartEntry.librariesContaining;
+      if (librarySources.length == 1) {
+        librarySource = librarySources[0];
+        if (librarySource != null) {
+          unit = dartEntry.getValueInLibrary(
+              DartEntry.RESOLVED_UNIT, librarySource);
+        }
+      }
+    }
+    // Create a new cache if there is not an existing cache or the source is
+    // different or a new resolved compilation unit is available.
+    if (cache == null || cache.source != source || unit != null) {
+      if (unit == null) {
+        return null;
+      }
+      if (oldContents == null) {
+        if (oldLength != 0) {
+          return null;
+        }
+        oldContents =
+            "${newContents.substring(0, offset)}${newContents.substring(offset + newLength)}";
+      }
+      return new IncrementalAnalysisCache(librarySource, source, unit,
+          oldContents, newContents, offset, oldLength, newLength);
+    }
+    // Update the existing cache if the change is contiguous
+    if (cache._oldLength == 0 && cache._newLength == 0) {
+      cache._offset = offset;
+      cache._oldLength = oldLength;
+      cache._newLength = newLength;
+    } else {
+      if (cache._offset > offset || offset > cache._offset + cache._newLength) {
+        return null;
+      }
+      cache._newLength += newLength - oldLength;
+    }
+    cache._newContents = newContents;
+    return cache;
+  }
+
+  /**
+   * Verify that the incrementally parsed and resolved unit in the incremental cache is structurally
+   * equivalent to the fully parsed unit.
+   *
+   * @param cache the prior cache or `null` if none
+   * @param source the source of the compilation unit that was parsed (not `null`)
+   * @param unit the compilation unit that was just parsed
+   * @return the cache used for incremental analysis or `null` if incremental analysis results
+   *         cannot be cached for the next incremental analysis
+   */
+  static IncrementalAnalysisCache verifyStructure(
+      IncrementalAnalysisCache cache, Source source, CompilationUnit unit) {
+    if (cache != null && unit != null && cache.source == source) {
+      if (!AstComparator.equalNodes(cache.resolvedUnit, unit)) {
+        return null;
+      }
+    }
+    return cache;
+  }
+}
+
+/**
+ * Instances of the class `IncrementalAnalysisTask` incrementally update existing analysis.
+ */
+class IncrementalAnalysisTask extends AnalysisTask {
+  /**
+   * The information used to perform incremental analysis.
+   */
+  final IncrementalAnalysisCache cache;
+
+  /**
+   * The compilation unit that was produced by incrementally updating the existing unit.
+   */
+  CompilationUnit _updatedUnit;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given context.
+   *
+   * @param context the context in which the task is to be performed
+   * @param cache the incremental analysis cache used to perform the analysis
+   */
+  IncrementalAnalysisTask(InternalAnalysisContext context, this.cache)
+      : super(context);
+
+  /**
+   * Return the compilation unit that was produced by incrementally updating the existing
+   * compilation unit, or `null` if the task has not yet been performed, could not be
+   * performed, or if an exception occurred.
+   *
+   * @return the compilation unit
+   */
+  CompilationUnit get compilationUnit => _updatedUnit;
+
+  /**
+   * Return the source that is to be incrementally analyzed.
+   *
+   * @return the source
+   */
+  Source get source => cache != null ? cache.source : null;
+
+  @override
+  String get taskDescription =>
+      "incremental analysis ${cache != null ? cache.source : "null"}";
+
+  /**
+   * Return the type provider used for incremental resolution.
+   *
+   * @return the type provider (or `null` if an exception occurs)
+   */
+  TypeProvider get typeProvider {
+    try {
+      return context.typeProvider;
+    } on AnalysisException {
+      return null;
+    }
+  }
+
+  @override
+  accept(AnalysisTaskVisitor visitor) =>
+      visitor.visitIncrementalAnalysisTask(this);
+
+  @override
+  void internalPerform() {
+    if (cache == null) {
+      return;
+    }
+    // Only handle small changes
+    if (cache.oldLength > 0 || cache.newLength > 30) {
+      return;
+    }
+    // Produce an updated token stream
+    CharacterReader reader = new CharSequenceReader(cache.newContents);
+    BooleanErrorListener errorListener = new BooleanErrorListener();
+    IncrementalScanner scanner = new IncrementalScanner(
+        cache.source, reader, errorListener, context.analysisOptions);
+    scanner.rescan(cache.resolvedUnit.beginToken, cache.offset, cache.oldLength,
+        cache.newLength);
+    if (errorListener.errorReported) {
+      return;
+    }
+    // Produce an updated AST
+    IncrementalParser parser = new IncrementalParser(
+        cache.source, scanner.tokenMap, AnalysisErrorListener.NULL_LISTENER);
+    _updatedUnit = parser.reparse(cache.resolvedUnit, scanner.leftToken,
+        scanner.rightToken, cache.offset, cache.offset + cache.oldLength);
+    // Update the resolution
+    TypeProvider typeProvider = this.typeProvider;
+    if (_updatedUnit != null && typeProvider != null) {
+      CompilationUnitElement element = _updatedUnit.element;
+      if (element != null) {
+        LibraryElement library = element.library;
+        if (library != null) {
+          IncrementalResolver resolver = new IncrementalResolver(null, null,
+              null, element, cache.offset, cache.oldLength, cache.newLength);
+          resolver.resolve(parser.updatedNode);
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Additional behavior for an analysis context that is required by internal
+ * users of the context.
+ */
+abstract class InternalAnalysisContext implements AnalysisContext {
+  /**
+   * A table mapping the sources known to the context to the information known
+   * about the source.
+   *
+   * TODO(scheglov) add the type, once we have only one cache.
+   */
+  dynamic get analysisCache;
+
+  /**
+   * Allow the client to supply its own content cache.  This will take the
+   * place of the content cache created by default, allowing clients to share
+   * the content cache between contexts.
+   */
+  set contentCache(ContentCache value);
+
+  /**
+   * Return a list of the explicit targets being analyzed by this context.
+   */
+  List<AnalysisTarget> get explicitTargets;
+
+  /**
+   * A factory to override how [LibraryResolver] is created.
+   */
+  LibraryResolverFactory get libraryResolverFactory;
+
+  /**
+   * Return a list containing all of the sources that have been marked as
+   * priority sources. Clients must not modify the returned list.
+   */
+  List<Source> get prioritySources;
+
+  /**
+   * Return a list of the priority targets being analyzed by this context.
+   */
+  List<AnalysisTarget> get priorityTargets;
+
+  /**
+   * The partition that contains analysis results that are not shared with other
+   * contexts.
+   *
+   * TODO(scheglov) add the type, once we have only one cache.
+   */
+  dynamic get privateAnalysisCachePartition;
+
+  /**
+   * A factory to override how [ResolverVisitor] is created.
+   */
+  ResolverVisitorFactory get resolverVisitorFactory;
+
+  /**
+   * Returns a statistics about this context.
+   */
+  AnalysisContextStatistics get statistics;
+
+  /**
+   * Sets the [TypeProvider] for this context.
+   */
+  void set typeProvider(TypeProvider typeProvider);
+
+  /**
+   * A factory to override how [TypeResolverVisitor] is created.
+   */
+  TypeResolverVisitorFactory get typeResolverVisitorFactory;
+
+  /**
+   * Return a list containing the sources of the libraries that are exported by
+   * the library with the given [source]. The list will be empty if the given
+   * source is invalid, if the given source does not represent a library, or if
+   * the library does not export any other libraries.
+   *
+   * Throws an [AnalysisException] if the exported libraries could not be
+   * computed.
+   */
+  List<Source> computeExportedLibraries(Source source);
+
+  /**
+   * Return a list containing the sources of the libraries that are imported by
+   * the library with the given [source]. The list will be empty if the given
+   * source is invalid, if the given source does not represent a library, or if
+   * the library does not import any other libraries.
+   *
+   * Throws an [AnalysisException] if the imported libraries could not be
+   * computed.
+   */
+  List<Source> computeImportedLibraries(Source source);
+
+  /**
+   * Return an AST structure corresponding to the given [source], but ensure
+   * that the structure has not already been resolved and will not be resolved
+   * by any other threads or in any other library.
+   *
+   * Throws an [AnalysisException] if the analysis could not be performed.
+   *
+   * <b>Note:</b> This method cannot be used in an async environment
+   */
+  CompilationUnit computeResolvableCompilationUnit(Source source);
+
+  /**
+   * Return all the resolved [CompilationUnit]s for the given [source] if not
+   * flushed, otherwise return `null` and ensures that the [CompilationUnit]s
+   * will be eventually returned to the client from [performAnalysisTask].
+   */
+  List<CompilationUnit> ensureResolvedDartUnits(Source source);
+
+  /**
+   * Return the cache entry associated with the given [target].
+   */
+  cache.CacheEntry getCacheEntry(AnalysisTarget target);
+
+  /**
+   * Return context that owns the given [source].
+   */
+  InternalAnalysisContext getContextFor(Source source);
+
+  /**
+   * Return a change notice for the given [source], creating one if one does not
+   * already exist.
+   */
+  ChangeNoticeImpl getNotice(Source source);
+
+  /**
+   * Return a namespace containing mappings for all of the public names defined
+   * by the given [library].
+   */
+  Namespace getPublicNamespace(LibraryElement library);
+
+  /**
+   * Respond to a change which has been made to the given [source] file.
+   * [originalContents] is the former contents of the file, and [newContents]
+   * is the updated contents.  If [notify] is true, a source changed event is
+   * triggered.
+   *
+   * Normally it should not be necessary for clients to call this function,
+   * since it will be automatically invoked in response to a call to
+   * [applyChanges] or [setContents].  However, if this analysis context is
+   * sharing its content cache with other contexts, then the client must
+   * manually update the content cache and call this function for each context.
+   *
+   * Return `true` if the change was significant to this context (i.e. [source]
+   * is either implicitly or explicitly analyzed by this context, and a change
+   * actually occurred).
+   */
+  bool handleContentsChanged(
+      Source source, String originalContents, String newContents, bool notify);
+
+  /**
+   * Given an [elementMap] mapping the source for the libraries represented by
+   * the corresponding elements to the elements representing the libraries,
+   * record those mappings.
+   */
+  void recordLibraryElements(Map<Source, LibraryElement> elementMap);
+
+  /**
+   * Return `true` if errors should be produced for the given [source].
+   * The [entry] associated with the source is passed in for efficiency.
+   *
+   * TODO(scheglov) remove [entry] after migration to the new task model.
+   * It is not used there anyway.
+   */
+  bool shouldErrorsBeAnalyzed(Source source, Object entry);
+
+  /**
+   * For testing only: flush all representations of the AST (both resolved and
+   * unresolved) for the given [source] out of the cache.
+   */
+  void test_flushAstStructures(Source source);
+
+  /**
+   * Call the given callback function for eache cache item in the context.
+   */
+  @deprecated
+  void visitCacheItems(void callback(Source source, SourceEntry dartEntry,
+      DataDescriptor rowDesc, CacheState state));
+
+  /**
+   * Visit all entries of the content cache.
+   */
+  void visitContentCache(ContentCacheVisitor visitor);
+}
+
+/**
+ * An object that can be used to receive information about errors within the
+ * analysis engine. Implementations usually write this information to a file,
+ * but can also record the information for later use (such as during testing) or
+ * even ignore the information.
+ */
+abstract class Logger {
+  /**
+   * A logger that ignores all logging.
+   */
+  static final Logger NULL = new NullLogger();
+
+  /**
+   * Log the given message as an error. The [message] is expected to be an
+   * explanation of why the error occurred or what it means. The [exception] is
+   * expected to be the reason for the error. At least one argument must be
+   * provided.
+   */
+  void logError(String message, [CaughtException exception]);
+
+  /**
+   * Log the given [exception] as one representing an error. The [message] is an
+   * explanation of why the error occurred or what it means.
+   */
+  @deprecated // Use logError(message, exception)
+  void logError2(String message, Object exception);
+
+  /**
+   * Log the given informational message. The [message] is expected to be an
+   * explanation of why the error occurred or what it means. The [exception] is
+   * expected to be the reason for the error.
+   */
+  void logInformation(String message, [CaughtException exception]);
+
+  /**
+   * Log the given [exception] as one representing an informational message. The
+   * [message] is an explanation of why the error occurred or what it means.
+   */
+  @deprecated // Use logInformation(message, exception)
+  void logInformation2(String message, Object exception);
+}
+
+/**
+ * An implementation of [Logger] that does nothing.
+ */
+class NullLogger implements Logger {
+  @override
+  void logError(String message, [CaughtException exception]) {}
+
+  @override
+  void logError2(String message, Object exception) {}
+
+  @override
+  void logInformation(String message, [CaughtException exception]) {}
+
+  @override
+  void logInformation2(String message, Object exception) {}
+}
+
+/**
+ * An exception created when an analysis attempt fails because a source was
+ * deleted between the time the analysis started and the time the results of the
+ * analysis were ready to be recorded.
+ */
+class ObsoleteSourceAnalysisException extends AnalysisException {
+  /**
+   * The source that was removed while it was being analyzed.
+   */
+  Source _source;
+
+  /**
+   * Initialize a newly created exception to represent the removal of the given
+   * [source].
+   */
+  ObsoleteSourceAnalysisException(Source source)
+      : super(
+            "The source '${source.fullName}' was removed while it was being analyzed") {
+    this._source = source;
+  }
+
+  /**
+   * Return the source that was removed while it was being analyzed.
+   */
+  Source get source => _source;
+}
+
+/**
+ * Instances of the class `ParseDartTask` parse a specific source as a Dart file.
+ */
+class ParseDartTask extends AnalysisTask {
+  /**
+   * The source to be parsed.
+   */
+  final Source source;
+
+  /**
+   * The head of the token stream used for parsing.
+   */
+  final Token _tokenStream;
+
+  /**
+   * The line information associated with the source.
+   */
+  final LineInfo lineInfo;
+
+  /**
+   * The compilation unit that was produced by parsing the source.
+   */
+  CompilationUnit _unit;
+
+  /**
+   * A flag indicating whether the source contains a 'part of' directive.
+   */
+  bool _containsPartOfDirective = false;
+
+  /**
+   * A flag indicating whether the source contains any directive other than a 'part of' directive.
+   */
+  bool _containsNonPartOfDirective = false;
+
+  /**
+   * A set containing the sources referenced by 'export' directives.
+   */
+  HashSet<Source> _exportedSources = new HashSet<Source>();
+
+  /**
+   * A set containing the sources referenced by 'import' directives.
+   */
+  HashSet<Source> _importedSources = new HashSet<Source>();
+
+  /**
+   * A set containing the sources referenced by 'part' directives.
+   */
+  HashSet<Source> _includedSources = new HashSet<Source>();
+
+  /**
+   * The errors that were produced by scanning and parsing the source.
+   */
+  List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given context.
+   *
+   * @param context the context in which the task is to be performed
+   * @param source the source to be parsed
+   * @param tokenStream the head of the token stream used for parsing
+   * @param lineInfo the line information associated with the source
+   */
+  ParseDartTask(InternalAnalysisContext context, this.source, this._tokenStream,
+      this.lineInfo)
+      : super(context);
+
+  /**
+   * Return the compilation unit that was produced by parsing the source, or `null` if the
+   * task has not yet been performed or if an exception occurred.
+   *
+   * @return the compilation unit that was produced by parsing the source
+   */
+  CompilationUnit get compilationUnit => _unit;
+
+  /**
+   * Return the errors that were produced by scanning and parsing the source, or an empty list if
+   * the task has not yet been performed or if an exception occurred.
+   *
+   * @return the errors that were produced by scanning and parsing the source
+   */
+  List<AnalysisError> get errors => _errors;
+
+  /**
+   * Return a list containing the sources referenced by 'export' directives, or an empty list if
+   * the task has not yet been performed or if an exception occurred.
+   *
+   * @return an list containing the sources referenced by 'export' directives
+   */
+  List<Source> get exportedSources => _toArray(_exportedSources);
+
+  /**
+   * Return `true` if the source contains any directive other than a 'part of' directive, or
+   * `false` if the task has not yet been performed or if an exception occurred.
+   *
+   * @return `true` if the source contains any directive other than a 'part of' directive
+   */
+  bool get hasNonPartOfDirective => _containsNonPartOfDirective;
+
+  /**
+   * Return `true` if the source contains a 'part of' directive, or `false` if the task
+   * has not yet been performed or if an exception occurred.
+   *
+   * @return `true` if the source contains a 'part of' directive
+   */
+  bool get hasPartOfDirective => _containsPartOfDirective;
+
+  /**
+   * Return a list containing the sources referenced by 'import' directives, or an empty list if
+   * the task has not yet been performed or if an exception occurred.
+   *
+   * @return a list containing the sources referenced by 'import' directives
+   */
+  List<Source> get importedSources => _toArray(_importedSources);
+
+  /**
+   * Return a list containing the sources referenced by 'part' directives, or an empty list if
+   * the task has not yet been performed or if an exception occurred.
+   *
+   * @return a list containing the sources referenced by 'part' directives
+   */
+  List<Source> get includedSources => _toArray(_includedSources);
+
+  @override
+  String get taskDescription {
+    if (source == null) {
+      return "parse as dart null source";
+    }
+    return "parse as dart ${source.fullName}";
+  }
+
+  @override
+  accept(AnalysisTaskVisitor visitor) => visitor.visitParseDartTask(this);
+
+  @override
+  void internalPerform() {
+    //
+    // Then parse the token stream.
+    //
+    PerformanceStatistics.parse.makeCurrentWhile(() {
+      RecordingErrorListener errorListener = new RecordingErrorListener();
+      Parser parser = new Parser(source, errorListener);
+      AnalysisOptions options = context.analysisOptions;
+      parser.parseFunctionBodies =
+          options.analyzeFunctionBodiesPredicate(source);
+      parser.parseGenericMethods = options.enableGenericMethods;
+      _unit = parser.parseCompilationUnit(_tokenStream);
+      _unit.lineInfo = lineInfo;
+      AnalysisContext analysisContext = context;
+      for (Directive directive in _unit.directives) {
+        if (directive is PartOfDirective) {
+          _containsPartOfDirective = true;
+        } else {
+          _containsNonPartOfDirective = true;
+          if (directive is UriBasedDirective) {
+            Source referencedSource = resolveDirective(
+                analysisContext, source, directive, errorListener);
+            if (referencedSource != null) {
+              if (directive is ExportDirective) {
+                _exportedSources.add(referencedSource);
+              } else if (directive is ImportDirective) {
+                _importedSources.add(referencedSource);
+              } else if (directive is PartDirective) {
+                if (referencedSource != source) {
+                  _includedSources.add(referencedSource);
+                }
+              } else {
+                throw new AnalysisException(
+                    "$runtimeType failed to handle a ${directive.runtimeType}");
+              }
+            }
+          }
+        }
+      }
+      _errors = errorListener.getErrorsForSource(source);
+    });
+  }
+
+  /**
+   * Efficiently convert the given set of [sources] to a list.
+   */
+  List<Source> _toArray(HashSet<Source> sources) {
+    int size = sources.length;
+    if (size == 0) {
+      return Source.EMPTY_LIST;
+    }
+    return new List.from(sources);
+  }
+
+  /**
+   * Return the result of resolving the URI of the given URI-based directive against the URI of the
+   * given library, or `null` if the URI is not valid.
+   *
+   * @param context the context in which the resolution is to be performed
+   * @param librarySource the source representing the library containing the directive
+   * @param directive the directive which URI should be resolved
+   * @param errorListener the error listener to which errors should be reported
+   * @return the result of resolving the URI against the URI of the library
+   */
+  static Source resolveDirective(AnalysisContext context, Source librarySource,
+      UriBasedDirective directive, AnalysisErrorListener errorListener) {
+    StringLiteral uriLiteral = directive.uri;
+    String uriContent = uriLiteral.stringValue;
+    if (uriContent != null) {
+      uriContent = uriContent.trim();
+      directive.uriContent = uriContent;
+    }
+    UriValidationCode code = directive.validate();
+    if (code == null) {
+      String encodedUriContent = Uri.encodeFull(uriContent);
+      try {
+        Source source =
+            context.sourceFactory.resolveUri(librarySource, encodedUriContent);
+        directive.source = source;
+        return source;
+      } on JavaIOException {
+        code = UriValidationCode.INVALID_URI;
+      }
+    }
+    if (code == UriValidationCode.URI_WITH_DART_EXT_SCHEME) {
+      return null;
+    }
+    if (code == UriValidationCode.URI_WITH_INTERPOLATION) {
+      errorListener.onError(new AnalysisError(librarySource, uriLiteral.offset,
+          uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION));
+      return null;
+    }
+    if (code == UriValidationCode.INVALID_URI) {
+      errorListener.onError(new AnalysisError(librarySource, uriLiteral.offset,
+          uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent]));
+      return null;
+    }
+    throw new RuntimeException(
+        message: "Failed to handle validation code: $code");
+  }
+}
+
+/**
+ * Instances of the class `ParseHtmlTask` parse a specific source as an HTML file.
+ */
+class ParseHtmlTask extends AnalysisTask {
+  /**
+   * The name of the 'src' attribute in a HTML tag.
+   */
+  static String _ATTRIBUTE_SRC = "src";
+
+  /**
+   * The name of the 'script' tag in an HTML file.
+   */
+  static String _TAG_SCRIPT = "script";
+
+  /**
+   * The source to be parsed.
+   */
+  final Source source;
+
+  /**
+   * The contents of the source.
+   */
+  final String _content;
+
+  /**
+   * The line information that was produced.
+   */
+  LineInfo _lineInfo;
+
+  /**
+   * The HTML unit that was produced by parsing the source.
+   */
+  ht.HtmlUnit _unit;
+
+  /**
+   * The errors that were produced by scanning and parsing the source.
+   */
+  List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
+
+  /**
+   * A list containing the sources of the libraries that are referenced within the HTML.
+   */
+  List<Source> _referencedLibraries = Source.EMPTY_LIST;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given context.
+   *
+   * @param context the context in which the task is to be performed
+   * @param source the source to be parsed
+   * @param content the contents of the source
+   */
+  ParseHtmlTask(InternalAnalysisContext context, this.source, this._content)
+      : super(context);
+
+  /**
+   * Return the errors that were produced by scanning and parsing the source, or `null` if the
+   * task has not yet been performed or if an exception occurred.
+   *
+   * @return the errors that were produced by scanning and parsing the source
+   */
+  List<AnalysisError> get errors => _errors;
+
+  /**
+   * Return the HTML unit that was produced by parsing the source.
+   *
+   * @return the HTML unit that was produced by parsing the source
+   */
+  ht.HtmlUnit get htmlUnit => _unit;
+
+  /**
+   * Return the sources of libraries that are referenced in the specified HTML file.
+   *
+   * @return the sources of libraries that are referenced in the HTML file
+   */
+  List<Source> get librarySources {
+    List<Source> libraries = new List<Source>();
+    _unit.accept(new ParseHtmlTask_getLibrarySources(this, libraries));
+    if (libraries.isEmpty) {
+      return Source.EMPTY_LIST;
+    }
+    return libraries;
+  }
+
+  /**
+   * Return the line information that was produced, or `null` if the task has not yet been
+   * performed or if an exception occurred.
+   *
+   * @return the line information that was produced
+   */
+  LineInfo get lineInfo => _lineInfo;
+
+  /**
+   * Return a list containing the sources of the libraries that are referenced within the HTML.
+   *
+   * @return the sources of the libraries that are referenced within the HTML
+   */
+  List<Source> get referencedLibraries => _referencedLibraries;
+
+  @override
+  String get taskDescription {
+    if (source == null) {
+      return "parse as html null source";
+    }
+    return "parse as html ${source.fullName}";
+  }
+
+  @override
+  accept(AnalysisTaskVisitor visitor) => visitor.visitParseHtmlTask(this);
+
+  @override
+  void internalPerform() {
+    try {
+      ht.AbstractScanner scanner = new ht.StringScanner(source, _content);
+      scanner.passThroughElements = <String>[_TAG_SCRIPT];
+      ht.Token token = scanner.tokenize();
+      _lineInfo = new LineInfo(scanner.lineStarts);
+      RecordingErrorListener errorListener = new RecordingErrorListener();
+      _unit = new ht.HtmlParser(source, errorListener, context.analysisOptions)
+          .parse(token, _lineInfo);
+      _unit.accept(new RecursiveXmlVisitor_ParseHtmlTask_internalPerform(
+          this, errorListener));
+      _errors = errorListener.getErrorsForSource(source);
+      _referencedLibraries = librarySources;
+    } catch (exception, stackTrace) {
+      throw new AnalysisException(
+          "Exception", new CaughtException(exception, stackTrace));
+    }
+  }
+
+  /**
+   * Resolves directives in the given [CompilationUnit].
+   */
+  void _resolveScriptDirectives(
+      CompilationUnit script, AnalysisErrorListener errorListener) {
+    if (script == null) {
+      return;
+    }
+    AnalysisContext analysisContext = context;
+    for (Directive directive in script.directives) {
+      if (directive is UriBasedDirective) {
+        ParseDartTask.resolveDirective(
+            analysisContext, source, directive, errorListener);
+      }
+    }
+  }
+}
+
+class ParseHtmlTask_getLibrarySources extends ht.RecursiveXmlVisitor<Object> {
+  final ParseHtmlTask _task;
+
+  List<Source> libraries;
+
+  ParseHtmlTask_getLibrarySources(this._task, this.libraries) : super();
+
+  @override
+  Object visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) {
+    ht.XmlAttributeNode scriptAttribute = null;
+    for (ht.XmlAttributeNode attribute in node.attributes) {
+      if (javaStringEqualsIgnoreCase(
+          attribute.name, ParseHtmlTask._ATTRIBUTE_SRC)) {
+        scriptAttribute = attribute;
+      }
+    }
+    if (scriptAttribute != null) {
+      try {
+        Uri uri = Uri.parse(scriptAttribute.text);
+        String fileName = uri.path;
+        Source librarySource =
+            _task.context.sourceFactory.resolveUri(_task.source, fileName);
+        if (_task.context.exists(librarySource)) {
+          libraries.add(librarySource);
+        }
+      } on FormatException {
+        // ignored - invalid URI reported during resolution phase
+      }
+    }
+    return super.visitHtmlScriptTagNode(node);
+  }
+}
+
+/**
+ * An object that manages the partitions that can be shared between analysis
+ * contexts.
+ */
+class PartitionManager {
+  /**
+   * The default cache size for a Dart SDK partition.
+   */
+  static int _DEFAULT_SDK_CACHE_SIZE = 256;
+
+  /**
+   * A table mapping SDK's to the partitions used for those SDK's.
+   */
+  HashMap<DartSdk, SdkCachePartition> _sdkPartitions =
+      new HashMap<DartSdk, SdkCachePartition>();
+
+  /**
+   * Clear any cached data being maintained by this manager.
+   */
+  void clearCache() {
+    _sdkPartitions.clear();
+  }
+
+  /**
+   * Return the partition being used for the given [sdk], creating the partition
+   * if necessary.
+   */
+  SdkCachePartition forSdk(DartSdk sdk) {
+    // Call sdk.context now, because when it creates a new
+    // InternalAnalysisContext instance, it calls forSdk() again, so creates an
+    // SdkCachePartition instance.
+    // So, if we initialize context after "partition == null", we end up
+    // with two SdkCachePartition instances.
+    InternalAnalysisContext sdkContext = sdk.context;
+    // Check cache for an existing partition.
+    SdkCachePartition partition = _sdkPartitions[sdk];
+    if (partition == null) {
+      partition = new SdkCachePartition(sdkContext, _DEFAULT_SDK_CACHE_SIZE);
+      _sdkPartitions[sdk] = partition;
+    }
+    return partition;
+  }
+}
+
+/**
+ * Representation of a pending computation which is based on the results of
+ * analysis that may or may not have been completed.
+ */
+class PendingFuture<T> {
+  /**
+   * The context in which this computation runs.
+   */
+  final AnalysisContextImpl _context;
+
+  /**
+   * The source used by this computation to compute its value.
+   */
+  final Source source;
+
+  /**
+   * The function which implements the computation.
+   */
+  final PendingFutureComputer<T> _computeValue;
+
+  /**
+   * The completer that should be completed once the computation has succeeded.
+   */
+  CancelableCompleter<T> _completer;
+
+  PendingFuture(this._context, this.source, this._computeValue) {
+    _completer = new CancelableCompleter<T>(_onCancel);
+  }
+
+  /**
+   * Retrieve the future which will be completed when this object is
+   * successfully evaluated.
+   */
+  CancelableFuture<T> get future => _completer.future;
+
+  /**
+   * Execute [_computeValue], passing it the given [sourceEntry], and complete
+   * the pending future if it's appropriate to do so.  If the pending future is
+   * completed by this call, true is returned; otherwise false is returned.
+   *
+   * Once this function has returned true, it should not be called again.
+   *
+   * Other than completing the future, this method is free of side effects.
+   * Note that any code the client has attached to the future will be executed
+   * in a microtask, so there is no danger of side effects occurring due to
+   * client callbacks.
+   */
+  bool evaluate(SourceEntry sourceEntry) {
+    assert(!_completer.isCompleted);
+    try {
+      T result = _computeValue(sourceEntry);
+      if (result == null) {
+        return false;
+      } else {
+        _completer.complete(result);
+        return true;
+      }
+    } catch (exception, stackTrace) {
+      _completer.completeError(exception, stackTrace);
+      return true;
+    }
+  }
+
+  /**
+   * No further analysis updates are expected which affect this future, so
+   * complete it with an AnalysisNotScheduledError in order to avoid
+   * deadlocking the client.
+   */
+  void forciblyComplete() {
+    try {
+      throw new AnalysisNotScheduledError();
+    } catch (exception, stackTrace) {
+      _completer.completeError(exception, stackTrace);
+    }
+  }
+
+  void _onCancel() {
+    _context._cancelFuture(this);
+  }
+}
+
+/**
+ * Container with global [AnalysisContext] performance statistics.
+ */
+class PerformanceStatistics {
+  /**
+   * The [PerformanceTag] for time spent in reading files.
+   */
+  static PerformanceTag io = new PerformanceTag('io');
+
+  /**
+   * The [PerformanceTag] for time spent in scanning.
+   */
+  static PerformanceTag scan = new PerformanceTag('scan');
+
+  /**
+   * The [PerformanceTag] for time spent in parsing.
+   */
+  static PerformanceTag parse = new PerformanceTag('parse');
+
+  /**
+   * The [PerformanceTag] for time spent in resolving.
+   */
+  static PerformanceTag resolve = new PerformanceTag('resolve');
+
+  /**
+   * The [PerformanceTag] for time spent in error verifier.
+   */
+  static PerformanceTag errors = new PerformanceTag('errors');
+
+  /**
+   * The [PerformanceTag] for time spent in hints generator.
+   */
+  static PerformanceTag hints = new PerformanceTag('hints');
+
+  /**
+   * The [PerformanceTag] for time spent in linting.
+   */
+  static PerformanceTag lint = new PerformanceTag('lint');
+
+  /**
+   * The [PerformanceTag] for time spent computing cycles.
+   */
+  static PerformanceTag cycles = new PerformanceTag('cycles');
+
+  /**
+   * The [PerformanceTag] for time spent in other phases of analysis.
+   */
+  static PerformanceTag performAnaysis = new PerformanceTag('performAnaysis');
+
+  /**
+   * The [PerformanceTag] for time spent in the analysis task visitor after
+   * tasks are complete.
+   */
+  static PerformanceTag analysisTaskVisitor =
+      new PerformanceTag('analysisTaskVisitor');
+
+  /**
+   * The [PerformanceTag] for time spent in the getter
+   * AnalysisContextImpl.nextAnalysisTask.
+   */
+  static var nextTask = new PerformanceTag('nextAnalysisTask');
+
+  /**
+   * The [PerformanceTag] for time spent during otherwise not accounted parts
+   * incremental of analysis.
+   */
+  static PerformanceTag incrementalAnalysis =
+      new PerformanceTag('incrementalAnalysis');
+}
+
+/**
+ * An error listener that will record the errors that are reported to it in a
+ * way that is appropriate for caching those errors within an analysis context.
+ */
+class RecordingErrorListener implements AnalysisErrorListener {
+  /**
+   * A map of sets containing the errors that were collected, keyed by each
+   * source.
+   */
+  Map<Source, HashSet<AnalysisError>> _errors =
+      new HashMap<Source, HashSet<AnalysisError>>();
+
+  /**
+   * Return the errors collected by the listener.
+   */
+  List<AnalysisError> get errors {
+    int numEntries = _errors.length;
+    if (numEntries == 0) {
+      return AnalysisError.NO_ERRORS;
+    }
+    List<AnalysisError> resultList = new List<AnalysisError>();
+    for (HashSet<AnalysisError> errors in _errors.values) {
+      resultList.addAll(errors);
+    }
+    return resultList;
+  }
+
+  /**
+   * Add all of the errors recorded by the given [listener] to this listener.
+   */
+  void addAll(RecordingErrorListener listener) {
+    for (AnalysisError error in listener.errors) {
+      onError(error);
+    }
+  }
+
+  /**
+   * Return the errors collected by the listener for the given [source].
+   */
+  List<AnalysisError> getErrorsForSource(Source source) {
+    HashSet<AnalysisError> errorsForSource = _errors[source];
+    if (errorsForSource == null) {
+      return AnalysisError.NO_ERRORS;
+    } else {
+      return new List.from(errorsForSource);
+    }
+  }
+
+  @override
+  void onError(AnalysisError error) {
+    Source source = error.source;
+    HashSet<AnalysisError> errorsForSource = _errors[source];
+    if (_errors[source] == null) {
+      errorsForSource = new HashSet<AnalysisError>();
+      _errors[source] = errorsForSource;
+    }
+    errorsForSource.add(error);
+  }
+}
+
+class RecursiveXmlVisitor_ParseHtmlTask_internalPerform
+    extends ht.RecursiveXmlVisitor<Object> {
+  final ParseHtmlTask ParseHtmlTask_this;
+
+  RecordingErrorListener errorListener;
+
+  RecursiveXmlVisitor_ParseHtmlTask_internalPerform(
+      this.ParseHtmlTask_this, this.errorListener)
+      : super();
+
+  @override
+  Object visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) {
+    ParseHtmlTask_this._resolveScriptDirectives(node.script, errorListener);
+    return null;
+  }
+}
+
+class RecursiveXmlVisitor_ResolveHtmlTask_internalPerform
+    extends ht.RecursiveXmlVisitor<Object> {
+  final ResolveHtmlTask ResolveHtmlTask_this;
+
+  RecordingErrorListener errorListener;
+
+  RecursiveXmlVisitor_ResolveHtmlTask_internalPerform(
+      this.ResolveHtmlTask_this, this.errorListener)
+      : super();
+
+  @override
+  Object visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) {
+    CompilationUnit script = node.script;
+    if (script != null) {
+      GenerateDartErrorsTask.validateDirectives(ResolveHtmlTask_this.context,
+          ResolveHtmlTask_this.source, script, errorListener);
+    }
+    return null;
+  }
+}
+
+/**
+ * An visitor that removes any resolution information from an AST structure when
+ * used to visit that structure.
+ */
+class ResolutionEraser extends GeneralizingAstVisitor<Object> {
+  @override
+  Object visitAssignmentExpression(AssignmentExpression node) {
+    node.staticElement = null;
+    node.propagatedElement = null;
+    return super.visitAssignmentExpression(node);
+  }
+
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    node.staticElement = null;
+    node.propagatedElement = null;
+    return super.visitBinaryExpression(node);
+  }
+
+  @override
+  Object visitBreakStatement(BreakStatement node) {
+    node.target = null;
+    return super.visitBreakStatement(node);
+  }
+
+  @override
+  Object visitCompilationUnit(CompilationUnit node) {
+    node.element = null;
+    return super.visitCompilationUnit(node);
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    node.element = null;
+    return super.visitConstructorDeclaration(node);
+  }
+
+  @override
+  Object visitConstructorName(ConstructorName node) {
+    node.staticElement = null;
+    return super.visitConstructorName(node);
+  }
+
+  @override
+  Object visitContinueStatement(ContinueStatement node) {
+    node.target = null;
+    return super.visitContinueStatement(node);
+  }
+
+  @override
+  Object visitDirective(Directive node) {
+    node.element = null;
+    return super.visitDirective(node);
+  }
+
+  @override
+  Object visitExpression(Expression node) {
+    node.staticType = null;
+    node.propagatedType = null;
+    return super.visitExpression(node);
+  }
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    node.element = null;
+    return super.visitFunctionExpression(node);
+  }
+
+  @override
+  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    node.staticElement = null;
+    node.propagatedElement = null;
+    return super.visitFunctionExpressionInvocation(node);
+  }
+
+  @override
+  Object visitIndexExpression(IndexExpression node) {
+    node.staticElement = null;
+    node.propagatedElement = null;
+    return super.visitIndexExpression(node);
+  }
+
+  @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    node.staticElement = null;
+    return super.visitInstanceCreationExpression(node);
+  }
+
+  @override
+  Object visitPostfixExpression(PostfixExpression node) {
+    node.staticElement = null;
+    node.propagatedElement = null;
+    return super.visitPostfixExpression(node);
+  }
+
+  @override
+  Object visitPrefixExpression(PrefixExpression node) {
+    node.staticElement = null;
+    node.propagatedElement = null;
+    return super.visitPrefixExpression(node);
+  }
+
+  @override
+  Object visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    node.staticElement = null;
+    return super.visitRedirectingConstructorInvocation(node);
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    node.staticElement = null;
+    node.propagatedElement = null;
+    return super.visitSimpleIdentifier(node);
+  }
+
+  @override
+  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    node.staticElement = null;
+    return super.visitSuperConstructorInvocation(node);
+  }
+
+  /**
+   * Remove any resolution information from the given AST structure.
+   */
+  static void erase(AstNode node) {
+    node.accept(new ResolutionEraser());
+  }
+}
+
+/**
+ * The information produced by resolving a compilation unit as part of a
+ * specific library.
+ */
+class ResolutionState {
+  /**
+   * The next resolution state or `null` if none.
+   */
+  ResolutionState _nextState;
+
+  /**
+   * The source for the defining compilation unit of the library that contains
+   * this unit. If this unit is the defining compilation unit for it's library,
+   * then this will be the source for this unit.
+   */
+  Source _librarySource;
+
+  /**
+   * A table mapping descriptors to the cached results for those descriptors.
+   * If there is no entry for a given descriptor then the state is implicitly
+   * [CacheState.INVALID] and the value is implicitly the default value.
+   */
+  Map<DataDescriptor, CachedResult> resultMap =
+      new HashMap<DataDescriptor, CachedResult>();
+
+  /**
+   * Flush any AST structures being maintained by this state.
+   */
+  void flushAstStructures() {
+    _flush(DartEntry.BUILT_UNIT);
+    _flush(DartEntry.RESOLVED_UNIT);
+    if (_nextState != null) {
+      _nextState.flushAstStructures();
+    }
+  }
+
+  /**
+   * Return the state of the data represented by the given [descriptor].
+   */
+  CacheState getState(DataDescriptor descriptor) {
+    CachedResult result = resultMap[descriptor];
+    if (result == null) {
+      return CacheState.INVALID;
+    }
+    return result.state;
+  }
+
+  /**
+   * Return the value of the data represented by the given [descriptor], or
+   * `null` if the data represented by the descriptor is not valid.
+   */
+  /*<V>*/ dynamic /*V*/ getValue(DataDescriptor /*<V>*/ descriptor) {
+    CachedResult result = resultMap[descriptor];
+    if (result == null) {
+      return descriptor.defaultValue;
+    }
+    return result.value;
+  }
+
+  /**
+   * Return `true` if the state of any data value is [CacheState.ERROR].
+   */
+  bool hasErrorState() {
+    for (CachedResult result in resultMap.values) {
+      if (result.state == CacheState.ERROR) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Invalidate all of the resolution information associated with the compilation unit.
+   */
+  void invalidateAllResolutionInformation() {
+    _nextState = null;
+    _librarySource = null;
+    setState(DartEntry.BUILT_UNIT, CacheState.INVALID);
+    setState(DartEntry.BUILT_ELEMENT, CacheState.INVALID);
+    setState(DartEntry.HINTS, CacheState.INVALID);
+    setState(DartEntry.LINTS, CacheState.INVALID);
+    setState(DartEntry.RESOLVED_UNIT, CacheState.INVALID);
+    setState(DartEntry.RESOLUTION_ERRORS, CacheState.INVALID);
+    setState(DartEntry.VERIFICATION_ERRORS, CacheState.INVALID);
+  }
+
+  /**
+   * Record that an exception occurred while attempting to build the element
+   * model for the source associated with this state.
+   */
+  void recordBuildElementError() {
+    setState(DartEntry.BUILT_UNIT, CacheState.ERROR);
+    setState(DartEntry.BUILT_ELEMENT, CacheState.ERROR);
+    recordResolutionError();
+  }
+
+  /**
+   * Record that an exception occurred while attempting to generate hints for
+   * the source associated with this entry. This will set the state of all
+   * verification information as being in error.
+   */
+  void recordHintError() {
+    setState(DartEntry.HINTS, CacheState.ERROR);
+  }
+
+  /**
+   * Record that an exception occurred while attempting to generate lints for
+   * the source associated with this entry. This will set the state of all
+   * verification information as being in error.
+   */
+  void recordLintError() {
+    setState(DartEntry.LINTS, CacheState.ERROR);
+  }
+
+  /**
+   * Record that an exception occurred while attempting to resolve the source
+   * associated with this state.
+   */
+  void recordResolutionError() {
+    setState(DartEntry.RESOLVED_UNIT, CacheState.ERROR);
+    setState(DartEntry.RESOLUTION_ERRORS, CacheState.ERROR);
+    recordVerificationError();
+  }
+
+  /**
+   * Record that an exception occurred while attempting to scan or parse the
+   * source associated with this entry. This will set the state of all
+   * resolution-based information as being in error.
+   */
+  void recordResolutionErrorsInAllLibraries() {
+    recordBuildElementError();
+    if (_nextState != null) {
+      _nextState.recordResolutionErrorsInAllLibraries();
+    }
+  }
+
+  /**
+   * Record that an exception occurred while attempting to generate errors and
+   * warnings for the source associated with this entry. This will set the state
+   * of all verification information as being in error.
+   */
+  void recordVerificationError() {
+    setState(DartEntry.VERIFICATION_ERRORS, CacheState.ERROR);
+    recordHintError();
+  }
+
+  /**
+   * Set the state of the data represented by the given [descriptor] to the
+   * given [state].
+   */
+  void setState(DataDescriptor descriptor, CacheState state) {
+    if (state == CacheState.VALID) {
+      throw new ArgumentError("use setValue() to set the state to VALID");
+    }
+    if (state == CacheState.INVALID) {
+      resultMap.remove(descriptor);
+    } else {
+      CachedResult result =
+          resultMap.putIfAbsent(descriptor, () => new CachedResult(descriptor));
+      result.state = state;
+      if (state != CacheState.IN_PROCESS) {
+        //
+        // If the state is in-process, we can leave the current value in the
+        // cache for any 'get' methods to access.
+        //
+        result.value = descriptor.defaultValue;
+      }
+    }
+  }
+
+  /**
+   * Set the value of the data represented by the given [descriptor] to the
+   * given [value].
+   */
+  void setValue(DataDescriptor /*<V>*/ descriptor, dynamic /*V*/ value) {
+    CachedResult result =
+        resultMap.putIfAbsent(descriptor, () => new CachedResult(descriptor));
+    SourceEntry.countTransition(descriptor, result);
+    result.state = CacheState.VALID;
+    result.value = value == null ? descriptor.defaultValue : value;
+  }
+
+  /**
+   * Flush the value of the data described by the [descriptor].
+   */
+  void _flush(DataDescriptor descriptor) {
+    CachedResult result = resultMap[descriptor];
+    if (result != null && result.state == CacheState.VALID) {
+      result.state = CacheState.FLUSHED;
+      result.value = descriptor.defaultValue;
+    }
+  }
+
+  /**
+   * Write a textual representation of the difference between the old entry and
+   * this entry to the given string [buffer]. A separator will be written before
+   * the first difference if [needsSeparator] is `true`. The [oldEntry] is the
+   * entry that was replaced by this entry. Return `true` is a separator is
+   * needed before writing any subsequent differences.
+   */
+  bool _writeDiffOn(
+      StringBuffer buffer, bool needsSeparator, DartEntry oldEntry) {
+    needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "resolvedUnit",
+        DartEntry.RESOLVED_UNIT, oldEntry);
+    needsSeparator = _writeStateDiffOn(buffer, needsSeparator,
+        "resolutionErrors", DartEntry.RESOLUTION_ERRORS, oldEntry);
+    needsSeparator = _writeStateDiffOn(buffer, needsSeparator,
+        "verificationErrors", DartEntry.VERIFICATION_ERRORS, oldEntry);
+    needsSeparator = _writeStateDiffOn(
+        buffer, needsSeparator, "hints", DartEntry.HINTS, oldEntry);
+    needsSeparator = _writeStateDiffOn(
+        buffer, needsSeparator, "lints", DartEntry.LINTS, oldEntry);
+    return needsSeparator;
+  }
+
+  /**
+   * Write a textual representation of this state to the given [buffer]. The
+   * result will only be used for debugging purposes.
+   */
+  void _writeOn(StringBuffer buffer) {
+    if (_librarySource != null) {
+      _writeStateOn(buffer, "builtElement", DartEntry.BUILT_ELEMENT);
+      _writeStateOn(buffer, "builtUnit", DartEntry.BUILT_UNIT);
+      _writeStateOn(buffer, "resolvedUnit", DartEntry.RESOLVED_UNIT);
+      _writeStateOn(buffer, "resolutionErrors", DartEntry.RESOLUTION_ERRORS);
+      _writeStateOn(
+          buffer, "verificationErrors", DartEntry.VERIFICATION_ERRORS);
+      _writeStateOn(buffer, "hints", DartEntry.HINTS);
+      _writeStateOn(buffer, "lints", DartEntry.LINTS);
+      if (_nextState != null) {
+        _nextState._writeOn(buffer);
+      }
+    }
+  }
+
+  /**
+   * Write a textual representation of the difference between the state of the
+   * value described by the given [descriptor] between the [oldEntry] and this
+   * entry to the given [buffer]. Return `true` if some difference was written.
+   */
+  bool _writeStateDiffOn(StringBuffer buffer, bool needsSeparator, String label,
+      DataDescriptor descriptor, SourceEntry oldEntry) {
+    CacheState oldState = oldEntry.getState(descriptor);
+    CacheState newState = getState(descriptor);
+    if (oldState != newState) {
+      if (needsSeparator) {
+        buffer.write("; ");
+      }
+      buffer.write(label);
+      buffer.write(" = ");
+      buffer.write(oldState);
+      buffer.write(" -> ");
+      buffer.write(newState);
+      return true;
+    }
+    return needsSeparator;
+  }
+
+  /**
+   * Write a textual representation of the state of the value described by the
+   * given [descriptor] to the given bugger, prefixed by the given [label] to
+   * the given [buffer].
+   */
+  void _writeStateOn(
+      StringBuffer buffer, String label, DataDescriptor descriptor) {
+    CachedResult result = resultMap[descriptor];
+    buffer.write("; ");
+    buffer.write(label);
+    buffer.write(" = ");
+    buffer.write(result == null ? CacheState.INVALID : result.state);
+  }
+}
+
+/**
+ * A compilation unit that is not referenced by any other objects. It is used by
+ * the [LibraryResolver] to resolve a library.
+ */
+class ResolvableCompilationUnit {
+  /**
+   * The source of the compilation unit.
+   */
+  final Source source;
+
+  /**
+   * The compilation unit.
+   */
+  final CompilationUnit compilationUnit;
+
+  /**
+   * Initialize a newly created holder to hold the given [source] and
+   * [compilationUnit].
+   */
+  ResolvableCompilationUnit(this.source, this.compilationUnit);
+}
+
+/**
+ * Instances of the class `ResolveDartLibraryTask` resolve a specific Dart library.
+ */
+class ResolveDartLibraryCycleTask extends AnalysisTask {
+  /**
+   * The source representing the file whose compilation unit is to be returned. TODO(brianwilkerson)
+   * This should probably be removed, but is being left in for now to ease the transition.
+   */
+  final Source unitSource;
+
+  /**
+   * The source representing the library to be resolved.
+   */
+  final Source librarySource;
+
+  /**
+   * The libraries that are part of the cycle containing the library to be resolved.
+   */
+  final List<ResolvableLibrary> _librariesInCycle;
+
+  /**
+   * The library resolver holding information about the libraries that were resolved.
+   */
+  LibraryResolver2 _resolver;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given context.
+   *
+   * @param context the context in which the task is to be performed
+   * @param unitSource the source representing the file whose compilation unit is to be returned
+   * @param librarySource the source representing the library to be resolved
+   * @param librariesInCycle the libraries that are part of the cycle containing the library to be
+   *          resolved
+   */
+  ResolveDartLibraryCycleTask(InternalAnalysisContext context, this.unitSource,
+      this.librarySource, this._librariesInCycle)
+      : super(context);
+
+  /**
+   * Return the library resolver holding information about the libraries that were resolved.
+   *
+   * @return the library resolver holding information about the libraries that were resolved
+   */
+  LibraryResolver2 get libraryResolver => _resolver;
+
+  @override
+  String get taskDescription {
+    if (librarySource == null) {
+      return "resolve library null source";
+    }
+    return "resolve library ${librarySource.fullName}";
+  }
+
+  @override
+  accept(AnalysisTaskVisitor visitor) =>
+      visitor.visitResolveDartLibraryCycleTask(this);
+
+  @override
+  void internalPerform() {
+    _resolver = new LibraryResolver2(context);
+    _resolver.resolveLibrary(librarySource, _librariesInCycle);
+  }
+}
+
+/**
+ * Instances of the class `ResolveDartLibraryTask` resolve a specific Dart library.
+ */
+class ResolveDartLibraryTask extends AnalysisTask {
+  /**
+   * The source representing the file whose compilation unit is to be returned.
+   */
+  final Source unitSource;
+
+  /**
+   * The source representing the library to be resolved.
+   */
+  final Source librarySource;
+
+  /**
+   * The library resolver holding information about the libraries that were resolved.
+   */
+  LibraryResolver _resolver;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given context.
+   *
+   * @param context the context in which the task is to be performed
+   * @param unitSource the source representing the file whose compilation unit is to be returned
+   * @param librarySource the source representing the library to be resolved
+   */
+  ResolveDartLibraryTask(
+      InternalAnalysisContext context, this.unitSource, this.librarySource)
+      : super(context);
+
+  /**
+   * Return the library resolver holding information about the libraries that were resolved.
+   *
+   * @return the library resolver holding information about the libraries that were resolved
+   */
+  LibraryResolver get libraryResolver => _resolver;
+
+  @override
+  String get taskDescription {
+    if (librarySource == null) {
+      return "resolve library null source";
+    }
+    return "resolve library ${librarySource.fullName}";
+  }
+
+  @override
+  accept(AnalysisTaskVisitor visitor) =>
+      visitor.visitResolveDartLibraryTask(this);
+
+  @override
+  void internalPerform() {
+    LibraryResolverFactory resolverFactory = context.libraryResolverFactory;
+    _resolver = resolverFactory == null
+        ? new LibraryResolver(context)
+        : resolverFactory(context);
+    _resolver.resolveLibrary(librarySource, true);
+  }
+}
+
+/**
+ * Instances of the class `ResolveDartUnitTask` resolve a single Dart file based on a existing
+ * element model.
+ */
+class ResolveDartUnitTask extends AnalysisTask {
+  /**
+   * The source that is to be resolved.
+   */
+  final Source source;
+
+  /**
+   * The element model for the library containing the source.
+   */
+  final LibraryElement _libraryElement;
+
+  /**
+   * The compilation unit that was resolved by this task.
+   */
+  CompilationUnit _resolvedUnit;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given context.
+   *
+   * @param context the context in which the task is to be performed
+   * @param source the source to be parsed
+   * @param libraryElement the element model for the library containing the source
+   */
+  ResolveDartUnitTask(
+      InternalAnalysisContext context, this.source, this._libraryElement)
+      : super(context);
+
+  /**
+   * Return the source for the library containing the source that is to be resolved.
+   *
+   * @return the source for the library containing the source that is to be resolved
+   */
+  Source get librarySource => _libraryElement.source;
+
+  /**
+   * Return the compilation unit that was resolved by this task.
+   *
+   * @return the compilation unit that was resolved by this task
+   */
+  CompilationUnit get resolvedUnit => _resolvedUnit;
+
+  @override
+  String get taskDescription {
+    Source librarySource = _libraryElement.source;
+    if (librarySource == null) {
+      return "resolve unit null source";
+    }
+    return "resolve unit ${librarySource.fullName}";
+  }
+
+  @override
+  accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartUnitTask(this);
+
+  @override
+  void internalPerform() {
+    TypeProvider typeProvider = _libraryElement.context.typeProvider;
+    CompilationUnit unit = context.computeResolvableCompilationUnit(source);
+    if (unit == null) {
+      throw new AnalysisException(
+          "Internal error: computeResolvableCompilationUnit returned a value without a parsed Dart unit");
+    }
+    //
+    // Resolve names in declarations.
+    //
+    new DeclarationResolver().resolve(unit, _find(_libraryElement, source));
+    //
+    // Resolve the type names.
+    //
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    TypeResolverVisitor typeResolverVisitor = new TypeResolverVisitor(
+        _libraryElement, source, typeProvider, errorListener);
+    unit.accept(typeResolverVisitor);
+    //
+    // Resolve the rest of the structure
+    //
+    InheritanceManager inheritanceManager =
+        new InheritanceManager(_libraryElement);
+    ResolverVisitor resolverVisitor = new ResolverVisitor(
+        _libraryElement, source, typeProvider, errorListener,
+        inheritanceManager: inheritanceManager);
+    unit.accept(resolverVisitor);
+    //
+    // Perform additional error checking.
+    //
+    PerformanceStatistics.errors.makeCurrentWhile(() {
+      ErrorReporter errorReporter = new ErrorReporter(errorListener, source);
+      ErrorVerifier errorVerifier = new ErrorVerifier(
+          errorReporter,
+          _libraryElement,
+          typeProvider,
+          inheritanceManager,
+          context.analysisOptions.enableSuperMixins);
+      unit.accept(errorVerifier);
+      // TODO(paulberry): as a temporary workaround for issue 21572,
+      // ConstantVerifier is being run right after ConstantValueComputer, so we
+      // don't need to run it here.  Once issue 21572 is fixed, re-enable the
+      // call to ConstantVerifier.
+//       ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, _libraryElement, typeProvider);
+//       unit.accept(constantVerifier);
+    });
+    //
+    // Capture the results.
+    //
+    _resolvedUnit = unit;
+  }
+
+  /**
+   * Search the compilation units that are part of the given library and return the element
+   * representing the compilation unit with the given source. Return `null` if there is no
+   * such compilation unit.
+   *
+   * @param libraryElement the element representing the library being searched through
+   * @param unitSource the source for the compilation unit whose element is to be returned
+   * @return the element representing the compilation unit
+   */
+  CompilationUnitElement _find(
+      LibraryElement libraryElement, Source unitSource) {
+    CompilationUnitElement element = libraryElement.definingCompilationUnit;
+    if (element.source == unitSource) {
+      return element;
+    }
+    for (CompilationUnitElement partElement in libraryElement.parts) {
+      if (partElement.source == unitSource) {
+        return partElement;
+      }
+    }
+    return null;
+  }
+}
+
+/**
+ * Instances of the class `ResolveHtmlTask` resolve a specific source as an HTML file.
+ */
+class ResolveHtmlTask extends AnalysisTask {
+  /**
+   * The source to be resolved.
+   */
+  final Source source;
+
+  /**
+   * The time at which the contents of the source were last modified.
+   */
+  final int modificationTime;
+
+  /**
+   * The HTML unit to be resolved.
+   */
+  final ht.HtmlUnit _unit;
+
+  /**
+   * The [HtmlUnit] that was resolved by this task.
+   */
+  ht.HtmlUnit _resolvedUnit;
+
+  /**
+   * The element produced by resolving the source.
+   */
+  HtmlElement _element = null;
+
+  /**
+   * The resolution errors that were discovered while resolving the source.
+   */
+  List<AnalysisError> _resolutionErrors = AnalysisError.NO_ERRORS;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given context.
+   *
+   * @param context the context in which the task is to be performed
+   * @param source the source to be resolved
+   * @param modificationTime the time at which the contents of the source were last modified
+   * @param unit the HTML unit to be resolved
+   */
+  ResolveHtmlTask(InternalAnalysisContext context, this.source,
+      this.modificationTime, this._unit)
+      : super(context);
+
+  HtmlElement get element => _element;
+
+  List<AnalysisError> get resolutionErrors => _resolutionErrors;
+
+  /**
+   * Return the [HtmlUnit] that was resolved by this task.
+   *
+   * @return the [HtmlUnit] that was resolved by this task
+   */
+  ht.HtmlUnit get resolvedUnit => _resolvedUnit;
+
+  @override
+  String get taskDescription {
+    if (source == null) {
+      return "resolve as html null source";
+    }
+    return "resolve as html ${source.fullName}";
+  }
+
+  @override
+  accept(AnalysisTaskVisitor visitor) => visitor.visitResolveHtmlTask(this);
+
+  @override
+  void internalPerform() {
+    //
+    // Build the standard HTML element.
+    //
+    HtmlUnitBuilder builder = new HtmlUnitBuilder(context);
+    _element = builder.buildHtmlElement(source, _unit);
+    RecordingErrorListener errorListener = builder.errorListener;
+    //
+    // Validate the directives
+    //
+    _unit.accept(new RecursiveXmlVisitor_ResolveHtmlTask_internalPerform(
+        this, errorListener));
+    //
+    // Record all resolution errors.
+    //
+    _resolutionErrors = errorListener.getErrorsForSource(source);
+    //
+    // Remember the resolved unit.
+    //
+    _resolvedUnit = _unit;
+  }
+}
+
+/**
+ * The priority of data in the cache in terms of the desirability of retaining
+ * some specified data about a specified source.
+ */
+class RetentionPriority extends Enum<RetentionPriority> {
+  /**
+   * A priority indicating that a given piece of data can be removed from the
+   * cache without reservation.
+   */
+  static const RetentionPriority LOW = const RetentionPriority('LOW', 0);
+
+  /**
+   * A priority indicating that a given piece of data should not be removed from
+   * the cache unless there are no sources for which the corresponding data has
+   * a lower priority. Currently used for data that is needed in order to finish
+   * some outstanding analysis task.
+   */
+  static const RetentionPriority MEDIUM = const RetentionPriority('MEDIUM', 1);
+
+  /**
+   * A priority indicating that a given piece of data should not be removed from
+   * the cache. Currently used for data related to a priority source.
+   */
+  static const RetentionPriority HIGH = const RetentionPriority('HIGH', 2);
+
+  static const List<RetentionPriority> values = const [LOW, MEDIUM, HIGH];
+
+  const RetentionPriority(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
+ * Instances of the class `ScanDartTask` scan a specific source as a Dart file.
+ */
+class ScanDartTask extends AnalysisTask {
+  /**
+   * The source to be scanned.
+   */
+  final Source source;
+
+  /**
+   * The contents of the source.
+   */
+  final String _content;
+
+  /**
+   * The token stream that was produced by scanning the source.
+   */
+  Token _tokenStream;
+
+  /**
+   * The line information that was produced.
+   */
+  LineInfo _lineInfo;
+
+  /**
+   * The errors that were produced by scanning the source.
+   */
+  List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given context.
+   *
+   * @param context the context in which the task is to be performed
+   * @param source the source to be parsed
+   * @param content the contents of the source
+   */
+  ScanDartTask(InternalAnalysisContext context, this.source, this._content)
+      : super(context);
+
+  /**
+   * Return the errors that were produced by scanning the source, or `null` if the task has
+   * not yet been performed or if an exception occurred.
+   *
+   * @return the errors that were produced by scanning the source
+   */
+  List<AnalysisError> get errors => _errors;
+
+  /**
+   * Return the line information that was produced, or `null` if the task has not yet been
+   * performed or if an exception occurred.
+   *
+   * @return the line information that was produced
+   */
+  LineInfo get lineInfo => _lineInfo;
+
+  @override
+  String get taskDescription {
+    if (source == null) {
+      return "scan as dart null source";
+    }
+    return "scan as dart ${source.fullName}";
+  }
+
+  /**
+   * Return the token stream that was produced by scanning the source, or `null` if the task
+   * has not yet been performed or if an exception occurred.
+   *
+   * @return the token stream that was produced by scanning the source
+   */
+  Token get tokenStream => _tokenStream;
+
+  @override
+  accept(AnalysisTaskVisitor visitor) => visitor.visitScanDartTask(this);
+
+  @override
+  void internalPerform() {
+    PerformanceStatistics.scan.makeCurrentWhile(() {
+      RecordingErrorListener errorListener = new RecordingErrorListener();
+      try {
+        Scanner scanner = new Scanner(
+            source, new CharSequenceReader(_content), errorListener);
+        scanner.preserveComments = context.analysisOptions.preserveComments;
+        _tokenStream = scanner.tokenize();
+        _lineInfo = new LineInfo(scanner.lineStarts);
+        _errors = errorListener.getErrorsForSource(source);
+      } catch (exception, stackTrace) {
+        throw new AnalysisException(
+            "Exception", new CaughtException(exception, stackTrace));
+      }
+    });
+  }
+}
+
+/**
+ * An [AnalysisContext] that only contains sources for a Dart SDK.
+ */
+class SdkAnalysisContext extends AnalysisContextImpl {
+  @override
+  AnalysisCache createCacheFromSourceFactory(SourceFactory factory) {
+    if (factory == null) {
+      return super.createCacheFromSourceFactory(factory);
+    }
+    DartSdk sdk = factory.dartSdk;
+    if (sdk == null) {
+      throw new IllegalArgumentException(
+          "The source factory for an SDK analysis context must have a DartUriResolver");
+    }
+    return new AnalysisCache(
+        <CachePartition>[AnalysisEngine.instance.partitionManager.forSdk(sdk)]);
+  }
+}
+
+/**
+ * A cache partition that contains all of the sources in the SDK.
+ */
+class SdkCachePartition extends CachePartition {
+  /**
+   * Initialize a newly created partition. The [context] is the context that
+   * owns this partition. The [maxCacheSize] is the maximum number of sources
+   * for which AST structures should be kept in the cache.
+   */
+  SdkCachePartition(InternalAnalysisContext context, int maxCacheSize)
+      : super(context, maxCacheSize, DefaultRetentionPolicy.POLICY);
+
+  @override
+  bool contains(Source source) => source.isInSystemLibrary;
+}
+
+/**
+ * The information cached by an analysis context about an individual source, no
+ * matter what kind of source it is.
+ */
+abstract class SourceEntry {
+  /**
+   * The data descriptor representing the contents of the source.
+   */
+  static final DataDescriptor<String> CONTENT =
+      new DataDescriptor<String>("SourceEntry.CONTENT");
+
+  /**
+   * The data descriptor representing the errors resulting from reading the
+   * source content.
+   */
+  static final DataDescriptor<List<AnalysisError>> CONTENT_ERRORS =
+      new DataDescriptor<List<AnalysisError>>(
+          "SourceEntry.CONTENT_ERRORS", AnalysisError.NO_ERRORS);
+
+  /**
+   * The data descriptor representing the line information.
+   */
+  static final DataDescriptor<LineInfo> LINE_INFO =
+      new DataDescriptor<LineInfo>("SourceEntry.LINE_INFO");
+
+  /**
+   * The index of the flag indicating whether the source was explicitly added to
+   * the context or whether the source was implicitly added because it was
+   * referenced by another source.
+   */
+  static int _EXPLICITLY_ADDED_FLAG = 0;
+
+  /**
+   * A table mapping data descriptors to a count of the number of times a value
+   * was set when in a given state.
+   */
+  static final Map<DataDescriptor, Map<CacheState, int>> transitionMap =
+      new HashMap<DataDescriptor, Map<CacheState, int>>();
+
+  /**
+   * The most recent time at which the state of the source matched the state
+   * represented by this entry.
+   */
+  int modificationTime = 0;
+
+  /**
+   * The exception that caused one or more values to have a state of
+   * [CacheState.ERROR].
+   */
+  CaughtException exception;
+
+  /**
+   * A bit-encoding of boolean flags associated with this element.
+   */
+  int _flags = 0;
+
+  /**
+   * A table mapping data descriptors to the cached results for those
+   * descriptors.
+   */
+  Map<DataDescriptor, CachedResult> resultMap =
+      new HashMap<DataDescriptor, CachedResult>();
+
+  /**
+   * Return all of the errors associated with this entry.
+   */
+  List<AnalysisError> get allErrors {
+    return getValue(CONTENT_ERRORS);
+  }
+
+  /**
+   * Get a list of all the library-independent descriptors for which values may
+   * be stored in this SourceEntry.
+   */
+  List<DataDescriptor> get descriptors {
+    return <DataDescriptor>[CONTENT, CONTENT_ERRORS, LINE_INFO];
+  }
+
+  /**
+   * Return `true` if the source was explicitly added to the context or `false`
+   * if the source was implicitly added because it was referenced by another
+   * source.
+   */
+  bool get explicitlyAdded => _getFlag(_EXPLICITLY_ADDED_FLAG);
+
+  /**
+   * Set whether the source was explicitly added to the context to match the
+   * [explicitlyAdded] flag.
+   */
+  void set explicitlyAdded(bool explicitlyAdded) {
+    _setFlag(_EXPLICITLY_ADDED_FLAG, explicitlyAdded);
+  }
+
+  /**
+   * Return the kind of the source, or `null` if the kind is not currently
+   * cached.
+   */
+  SourceKind get kind;
+
+  /**
+   * Fix the state of the [exception] to match the current state of the entry.
+   */
+  void fixExceptionState() {
+    if (hasErrorState()) {
+      if (exception == null) {
+        //
+        // This code should never be reached, but is a fail-safe in case an
+        // exception is not recorded when it should be.
+        //
+        String message = "State set to ERROR without setting an exception";
+        exception = new CaughtException(new AnalysisException(message), null);
+      }
+    } else {
+      exception = null;
+    }
+  }
+
+  /**
+   * Return a textual representation of the difference between the [oldEntry]
+   * and this entry. The difference is represented as a sequence of fields whose
+   * value would change if the old entry were converted into the new entry.
+   */
+  String getDiff(SourceEntry oldEntry) {
+    StringBuffer buffer = new StringBuffer();
+    _writeDiffOn(buffer, oldEntry);
+    return buffer.toString();
+  }
+
+  /**
+   * Return the state of the data represented by the given [descriptor].
+   */
+  CacheState getState(DataDescriptor descriptor) {
+    if (!_isValidDescriptor(descriptor)) {
+      throw new ArgumentError("Invalid descriptor: $descriptor");
+    }
+    CachedResult result = resultMap[descriptor];
+    if (result == null) {
+      return CacheState.INVALID;
+    }
+    return result.state;
+  }
+
+  /**
+   * Return the value of the data represented by the given [descriptor], or
+   * `null` if the data represented by the descriptor is not valid.
+   */
+  /*<V>*/ dynamic /*V*/ getValue(DataDescriptor /*<V>*/ descriptor) {
+    if (!_isValidDescriptor(descriptor)) {
+      throw new ArgumentError("Invalid descriptor: $descriptor");
+    }
+    CachedResult result = resultMap[descriptor];
+    if (result == null) {
+      return descriptor.defaultValue;
+    }
+    return result.value;
+  }
+
+  /**
+   * Return `true` if the state of any data value is [CacheState.ERROR].
+   */
+  bool hasErrorState() {
+    for (CachedResult result in resultMap.values) {
+      if (result.state == CacheState.ERROR) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Invalidate all of the information associated with this source.
+   */
+  void invalidateAllInformation() {
+    setState(CONTENT, CacheState.INVALID);
+    setState(CONTENT_ERRORS, CacheState.INVALID);
+    setState(LINE_INFO, CacheState.INVALID);
+  }
+
+  /**
+   * Record that an [exception] occurred while attempting to get the contents of
+   * the source represented by this entry. This will set the state of all
+   * information, including any resolution-based information, as being in error.
+   */
+  void recordContentError(CaughtException exception) {
+    setState(CONTENT, CacheState.ERROR);
+    recordScanError(exception);
+  }
+
+  /**
+   * Record that an [exception] occurred while attempting to scan or parse the
+   * entry represented by this entry. This will set the state of all
+   * information, including any resolution-based information, as being in error.
+   */
+  void recordScanError(CaughtException exception) {
+    this.exception = exception;
+    setState(LINE_INFO, CacheState.ERROR);
+  }
+
+  /**
+   * Set the state of the data represented by the given [descriptor] to the
+   * given [state].
+   */
+  void setState(DataDescriptor descriptor, CacheState state) {
+    if (!_isValidDescriptor(descriptor)) {
+      throw new ArgumentError("Invalid descriptor: $descriptor");
+    }
+    if (state == CacheState.VALID) {
+      throw new ArgumentError("use setValue() to set the state to VALID");
+    }
+    _validateStateChange(descriptor, state);
+    if (state == CacheState.INVALID) {
+      resultMap.remove(descriptor);
+    } else {
+      CachedResult result =
+          resultMap.putIfAbsent(descriptor, () => new CachedResult(descriptor));
+      result.state = state;
+      if (state != CacheState.IN_PROCESS) {
+        //
+        // If the state is in-process, we can leave the current value in the
+        // cache for any 'get' methods to access.
+        //
+        result.value = descriptor.defaultValue;
+      }
+    }
+  }
+
+  /**
+   * Set the value of the data represented by the given [descriptor] to the
+   * given [value].
+   */
+  void setValue(DataDescriptor /*<V>*/ descriptor, dynamic /*V*/ value) {
+    if (!_isValidDescriptor(descriptor)) {
+      throw new ArgumentError("Invalid descriptor: $descriptor");
+    }
+    _validateStateChange(descriptor, CacheState.VALID);
+    CachedResult result =
+        resultMap.putIfAbsent(descriptor, () => new CachedResult(descriptor));
+    countTransition(descriptor, result);
+    result.state = CacheState.VALID;
+    result.value = value == null ? descriptor.defaultValue : value;
+  }
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    _writeOn(buffer);
+    return buffer.toString();
+  }
+
+  /**
+   * Flush the value of the data described by the [descriptor].
+   */
+  void _flush(DataDescriptor descriptor) {
+    CachedResult result = resultMap[descriptor];
+    if (result != null && result.state == CacheState.VALID) {
+      _validateStateChange(descriptor, CacheState.FLUSHED);
+      result.state = CacheState.FLUSHED;
+      result.value = descriptor.defaultValue;
+    }
+  }
+
+  /**
+   * Return the value of the flag with the given [index].
+   */
+  bool _getFlag(int index) => BooleanArray.get(_flags, index);
+
+  /**
+   * Return `true` if the [descriptor] is valid for this entry.
+   */
+  bool _isValidDescriptor(DataDescriptor descriptor) {
+    return descriptor == CONTENT ||
+        descriptor == CONTENT_ERRORS ||
+        descriptor == LINE_INFO;
+  }
+
+  /**
+   * Set the value of the flag with the given [index] to the given [value].
+   */
+  void _setFlag(int index, bool value) {
+    _flags = BooleanArray.set(_flags, index, value);
+  }
+
+  /**
+   * If the state of the value described by the given [descriptor] is changing
+   * from ERROR to anything else, capture the information. This is an attempt to
+   * discover the underlying cause of a long-standing bug.
+   */
+  void _validateStateChange(DataDescriptor descriptor, CacheState newState) {
+    // TODO(brianwilkerson) Decide whether we still want to capture this data.
+//    if (descriptor != CONTENT) {
+//      return;
+//    }
+//    CachedResult result = resultMap[CONTENT];
+//    if (result != null && result.state == CacheState.ERROR) {
+//      String message =
+//          "contentState changing from ${result.state} to $newState";
+//      InstrumentationBuilder builder =
+//          Instrumentation.builder2("SourceEntry-validateStateChange");
+//      builder.data3("message", message);
+//      //builder.data("source", source.getFullName());
+//      builder.record(new CaughtException(new AnalysisException(message), null));
+//      builder.log();
+//    }
+  }
+
+  /**
+   * Write a textual representation of the difference between the [oldEntry] and
+   * this entry to the given string [buffer]. Return `true` if some difference
+   * was written.
+   */
+  bool _writeDiffOn(StringBuffer buffer, SourceEntry oldEntry) {
+    bool needsSeparator = false;
+    CaughtException oldException = oldEntry.exception;
+    if (!identical(oldException, exception)) {
+      buffer.write("exception = ");
+      buffer.write(oldException.runtimeType);
+      buffer.write(" -> ");
+      buffer.write(exception.runtimeType);
+      needsSeparator = true;
+    }
+    int oldModificationTime = oldEntry.modificationTime;
+    if (oldModificationTime != modificationTime) {
+      if (needsSeparator) {
+        buffer.write("; ");
+      }
+      buffer.write("time = ");
+      buffer.write(oldModificationTime);
+      buffer.write(" -> ");
+      buffer.write(modificationTime);
+      needsSeparator = true;
+    }
+    needsSeparator =
+        _writeStateDiffOn(buffer, needsSeparator, "content", CONTENT, oldEntry);
+    needsSeparator = _writeStateDiffOn(
+        buffer, needsSeparator, "contentErrors", CONTENT_ERRORS, oldEntry);
+    needsSeparator = _writeStateDiffOn(
+        buffer, needsSeparator, "lineInfo", LINE_INFO, oldEntry);
+    return needsSeparator;
+  }
+
+  /**
+   * Write a textual representation of this entry to the given [buffer]. The
+   * result should only be used for debugging purposes.
+   */
+  void _writeOn(StringBuffer buffer) {
+    buffer.write("time = ");
+    buffer.write(modificationTime);
+    _writeStateOn(buffer, "content", CONTENT);
+    _writeStateOn(buffer, "contentErrors", CONTENT_ERRORS);
+    _writeStateOn(buffer, "lineInfo", LINE_INFO);
+  }
+
+  /**
+   * Write a textual representation of the difference between the state of the
+   * value described by the given [descriptor] between the [oldEntry] and this
+   * entry to the given [buffer]. Return `true` if some difference was written.
+   */
+  bool _writeStateDiffOn(StringBuffer buffer, bool needsSeparator, String label,
+      DataDescriptor descriptor, SourceEntry oldEntry) {
+    CacheState oldState = oldEntry.getState(descriptor);
+    CacheState newState = getState(descriptor);
+    if (oldState != newState) {
+      if (needsSeparator) {
+        buffer.write("; ");
+      }
+      buffer.write(label);
+      buffer.write(" = ");
+      buffer.write(oldState);
+      buffer.write(" -> ");
+      buffer.write(newState);
+      return true;
+    }
+    return needsSeparator;
+  }
+
+  /**
+   * Write a textual representation of the state of the value described by the
+   * given [descriptor] to the given bugger, prefixed by the given [label] to
+   * the given [buffer].
+   */
+  void _writeStateOn(
+      StringBuffer buffer, String label, DataDescriptor descriptor) {
+    CachedResult result = resultMap[descriptor];
+    buffer.write("; ");
+    buffer.write(label);
+    buffer.write(" = ");
+    buffer.write(result == null ? CacheState.INVALID : result.state);
+  }
+
+  /**
+   * Increment the count of the number of times that data represented by the
+   * given [descriptor] was transitioned from the current state (as found in the
+   * given [result] to a valid state.
+   */
+  static void countTransition(DataDescriptor descriptor, CachedResult result) {
+    Map<CacheState, int> countMap = transitionMap.putIfAbsent(
+        descriptor, () => new HashMap<CacheState, int>());
+    int count = countMap[result.state];
+    countMap[result.state] = count == null ? 1 : count + 1;
+  }
+}
+
+/**
+ * The priority levels used to return sources in an optimal order. A smaller
+ * ordinal value equates to a higher priority.
+ */
+class SourcePriority extends Enum<SourcePriority> {
+  /**
+   * Used for a Dart source that is known to be a part contained in a library
+   * that was recently resolved. These parts are given a higher priority because
+   * there is a high probability that their AST structure is still in the cache
+   * and therefore would not need to be re-created.
+   */
+  static const SourcePriority PRIORITY_PART =
+      const SourcePriority('PRIORITY_PART', 0);
+
+  /**
+   * Used for a Dart source that is known to be a library.
+   */
+  static const SourcePriority LIBRARY = const SourcePriority('LIBRARY', 1);
+
+  /**
+   * Used for a Dart source whose kind is unknown.
+   */
+  static const SourcePriority UNKNOWN = const SourcePriority('UNKNOWN', 2);
+
+  /**
+   * Used for a Dart source that is known to be a part but whose library has not
+   * yet been resolved.
+   */
+  static const SourcePriority NORMAL_PART =
+      const SourcePriority('NORMAL_PART', 3);
+
+  /**
+   * Used for an HTML source.
+   */
+  static const SourcePriority HTML = const SourcePriority('HTML', 4);
+
+  static const List<SourcePriority> values = const [
+    PRIORITY_PART,
+    LIBRARY,
+    UNKNOWN,
+    NORMAL_PART,
+    HTML
+  ];
+
+  const SourcePriority(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
+ * [SourcesChangedEvent] indicates which sources have been added, removed,
+ * or whose contents have changed.
+ */
+class SourcesChangedEvent {
+  /**
+   * The internal representation of what has changed. Clients should not access
+   * this field directly.
+   */
+  final ChangeSet _changeSet;
+
+  /**
+   * Construct an instance representing the given changes.
+   */
+  SourcesChangedEvent(ChangeSet changeSet) : _changeSet = changeSet;
+
+  /**
+   * Construct an instance representing a source content change.
+   */
+  factory SourcesChangedEvent.changedContent(Source source, String contents) {
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.changedContent(source, contents);
+    return new SourcesChangedEvent(changeSet);
+  }
+
+  /**
+   * Construct an instance representing a source content change.
+   */
+  factory SourcesChangedEvent.changedRange(Source source, String contents,
+      int offset, int oldLength, int newLength) {
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.changedRange(source, contents, offset, oldLength, newLength);
+    return new SourcesChangedEvent(changeSet);
+  }
+
+  /**
+   * Return the collection of sources for which content has changed.
+   */
+  Iterable<Source> get changedSources {
+    List<Source> changedSources = new List.from(_changeSet.changedSources);
+    changedSources.addAll(_changeSet.changedContents.keys);
+    changedSources.addAll(_changeSet.changedRanges.keys);
+    return changedSources;
+  }
+
+  /**
+   * Return `true` if any sources were added.
+   */
+  bool get wereSourcesAdded => _changeSet.addedSources.length > 0;
+
+  /**
+   * Return `true` if any sources were removed or deleted.
+   */
+  bool get wereSourcesRemovedOrDeleted =>
+      _changeSet.removedSources.length > 0 ||
+          _changeSet.removedContainers.length > 0 ||
+          _changeSet.deletedSources.length > 0;
+}
+
+/**
+ * Analysis data for which we have a modification time.
+ */
+class TimestampedData<E> {
+  /**
+   * The modification time of the source from which the data was created.
+   */
+  final int modificationTime;
+
+  /**
+   * The data that was created from the source.
+   */
+  final E data;
+
+  /**
+   * Initialize a newly created holder to associate the given [data] with the
+   * given [modificationTime].
+   */
+  TimestampedData(this.modificationTime, this.data);
+}
+
+/**
+ * A cache partition that contains all sources not contained in other
+ * partitions.
+ */
+class UniversalCachePartition extends CachePartition {
+  /**
+   * Initialize a newly created partition. The [context] is the context that
+   * owns this partition. The [maxCacheSize] is the maximum number of sources
+   * for which AST structures should be kept in the cache. The [retentionPolicy]
+   * is the policy used to determine which pieces of data to remove from the
+   * cache.
+   */
+  UniversalCachePartition(InternalAnalysisContext context, int maxCacheSize,
+      CacheRetentionPolicy retentionPolicy)
+      : super(context, maxCacheSize, retentionPolicy);
+
+  @override
+  bool contains(Source source) => true;
+}
+
+/**
+ * The unique instances of the class `WaitForAsyncTask` represents a state in which there is
+ * no analysis work that can be done until some asynchronous task (such as IO) has completed, but
+ * where analysis is not yet complete.
+ */
+class WaitForAsyncTask extends AnalysisTask {
+  /**
+   * The unique instance of this class.
+   */
+  static WaitForAsyncTask _UniqueInstance = new WaitForAsyncTask();
+
+  /**
+   * Return the unique instance of this class.
+   *
+   * @return the unique instance of this class
+   */
+  static WaitForAsyncTask get instance => _UniqueInstance;
+
+  /**
+   * Prevent the creation of instances of this class.
+   */
+  WaitForAsyncTask() : super(null);
+
+  @override
+  String get taskDescription => "Waiting for async analysis";
+
+  @override
+  accept(AnalysisTaskVisitor visitor) => null;
+
+  @override
+  void internalPerform() {
+    // There is no work to be done.
+  }
+}
+
+/**
+ * An object that manages a list of sources that need to have analysis work
+ * performed on them.
+ */
+class WorkManager {
+  /**
+   * A list containing the various queues is priority order.
+   */
+  List<List<Source>> _workQueues;
+
+  /**
+   * Initialize a newly created manager to have no work queued up.
+   */
+  WorkManager() {
+    int queueCount = SourcePriority.values.length;
+    _workQueues = new List<List<Source>>(queueCount);
+    for (int i = 0; i < queueCount; i++) {
+      _workQueues[i] = new List<Source>();
+    }
+  }
+
+  /**
+   * Record that the given [source] needs to be analyzed. The [priority] level
+   * is used to control when the source will be analyzed with respect to other
+   * sources. If the source was previously added then it's priority is updated.
+   * If it was previously added with the same priority then it's position in the
+   * queue is unchanged.
+   */
+  void add(Source source, SourcePriority priority) {
+    int queueCount = _workQueues.length;
+    int ordinal = priority.ordinal;
+    for (int i = 0; i < queueCount; i++) {
+      List<Source> queue = _workQueues[i];
+      if (i == ordinal) {
+        if (!queue.contains(source)) {
+          queue.add(source);
+        }
+      } else {
+        queue.remove(source);
+      }
+    }
+  }
+
+  /**
+   * Record that the given [source] needs to be analyzed. The [priority] level
+   * is used to control when the source will be analyzed with respect to other
+   * sources. If the source was previously added then it's priority is updated.
+   * In either case, it will be analyzed before other sources of the same
+   * priority.
+   */
+  void addFirst(Source source, SourcePriority priority) {
+    int queueCount = _workQueues.length;
+    int ordinal = priority.ordinal;
+    for (int i = 0; i < queueCount; i++) {
+      List<Source> queue = _workQueues[i];
+      if (i == ordinal) {
+        queue.remove(source);
+        queue.insert(0, source);
+      } else {
+        queue.remove(source);
+      }
+    }
+  }
+
+  /**
+   * Return an iterator that can be used to access the sources to be analyzed in
+   * the order in which they should be analyzed.
+   *
+   * <b>Note:</b> As with other iterators, no sources can be added or removed
+   * from this work manager while the iterator is being used. Unlike some
+   * implementations, however, the iterator will not detect when this
+   * requirement has been violated; it might work correctly, it might return the
+   * wrong source, or it might throw an exception.
+   */
+  WorkManager_WorkIterator iterator() => new WorkManager_WorkIterator(this);
+
+  /**
+   * Record that the given source is fully analyzed.
+   */
+  void remove(Source source) {
+    int queueCount = _workQueues.length;
+    for (int i = 0; i < queueCount; i++) {
+      _workQueues[i].remove(source);
+    }
+  }
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    List<SourcePriority> priorities = SourcePriority.values;
+    bool needsSeparator = false;
+    int queueCount = _workQueues.length;
+    for (int i = 0; i < queueCount; i++) {
+      List<Source> queue = _workQueues[i];
+      if (!queue.isEmpty) {
+        if (needsSeparator) {
+          buffer.write("; ");
+        }
+        buffer.write(priorities[i]);
+        buffer.write(": ");
+        int queueSize = queue.length;
+        for (int j = 0; j < queueSize; j++) {
+          if (j > 0) {
+            buffer.write(", ");
+          }
+          buffer.write(queue[j].fullName);
+        }
+        needsSeparator = true;
+      }
+    }
+    return buffer.toString();
+  }
+}
+
+/**
+ * An iterator that returns the sources in a work manager in the order in which
+ * they are to be analyzed.
+ */
+class WorkManager_WorkIterator {
+  final WorkManager _manager;
+
+  /**
+   * The index of the work queue through which we are currently iterating.
+   */
+  int _queueIndex = 0;
+
+  /**
+   * The index of the next element of the work queue to be returned.
+   */
+  int _index = -1;
+
+  /**
+   * Initialize a newly created iterator to be ready to return the first element
+   * in the iteration.
+   */
+  WorkManager_WorkIterator(this._manager) {
+    _advance();
+  }
+
+  /**
+   * Return `true` if there is another [Source] available for processing.
+   */
+  bool get hasNext => _queueIndex < _manager._workQueues.length;
+
+  /**
+   * Return the next [Source] available for processing and advance so that the
+   * returned source will not be returned again.
+   */
+  Source next() {
+    if (!hasNext) {
+      throw new NoSuchElementException();
+    }
+    Source source = _manager._workQueues[_queueIndex][_index];
+    _advance();
+    return source;
+  }
+
+  /**
+   * Increment the [index] and [queueIndex] so that they are either indicating
+   * the next source to be returned or are indicating that there are no more
+   * sources to be returned.
+   */
+  void _advance() {
+    _index++;
+    if (_index >= _manager._workQueues[_queueIndex].length) {
+      _index = 0;
+      _queueIndex++;
+      while (_queueIndex < _manager._workQueues.length &&
+          _manager._workQueues[_queueIndex].isEmpty) {
+        _queueIndex++;
+      }
+    }
+  }
+}
+
+/**
+ * A helper class used to create futures for AnalysisContextImpl. Using a helper
+ * class allows us to preserve the generic parameter T.
+ */
+class _AnalysisFutureHelper<T> {
+  final AnalysisContextImpl _context;
+
+  _AnalysisFutureHelper(this._context);
+
+  /**
+   * Return a future that will be completed with the result of calling
+   * [computeValue].  If [computeValue] returns non-null, the future will be
+   * completed immediately with the resulting value.  If it returns null, then
+   * it will be re-executed in the future, after the next time the cached
+   * information for [source] has changed.  If [computeValue] throws an
+   * exception, the future will fail with that exception.
+   *
+   * If the [computeValue] still returns null after there is no further
+   * analysis to be done for [source], then the future will be completed with
+   * the error AnalysisNotScheduledError.
+   *
+   * Since [computeValue] will be called while the state of analysis is being
+   * updated, it should be free of side effects so that it doesn't cause
+   * reentrant changes to the analysis state.
+   */
+  CancelableFuture<T> computeAsync(
+      Source source, T computeValue(SourceEntry sourceEntry)) {
+    if (_context.isDisposed) {
+      // No further analysis is expected, so return a future that completes
+      // immediately with AnalysisNotScheduledError.
+      return new CancelableFuture.error(new AnalysisNotScheduledError());
+    }
+    SourceEntry sourceEntry = _context.getReadableSourceEntryOrNull(source);
+    if (sourceEntry == null) {
+      return new CancelableFuture.error(new AnalysisNotScheduledError());
+    }
+    PendingFuture pendingFuture =
+        new PendingFuture<T>(_context, source, computeValue);
+    if (!pendingFuture.evaluate(sourceEntry)) {
+      _context._pendingFutureSources
+          .putIfAbsent(source, () => <PendingFuture>[])
+          .add(pendingFuture);
+    }
+    return pendingFuture.future;
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/error.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/error.dart
new file mode 100644
index 0000000..93d1ce8
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/error.dart
@@ -0,0 +1,4947 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.error;
+
+import 'dart:collection';
+
+import 'ast.dart' show AstNode;
+import 'element.dart';
+import 'java_core.dart';
+import 'scanner.dart' show Token;
+import 'source.dart';
+
+/**
+ * An error discovered during the analysis of some Dart code.
+ *
+ * See [AnalysisErrorListener].
+ */
+class AnalysisError {
+  /**
+   * An empty array of errors used when no errors are expected.
+   */
+  static const List<AnalysisError> NO_ERRORS = const <AnalysisError>[];
+
+  /**
+   * A [Comparator] that sorts by the name of the file that the [AnalysisError]
+   * was found.
+   */
+  static Comparator<AnalysisError> FILE_COMPARATOR = (AnalysisError o1,
+      AnalysisError o2) => o1.source.shortName.compareTo(o2.source.shortName);
+
+  /**
+   * A [Comparator] that sorts error codes first by their severity (errors
+   * first, warnings second), and then by the the error code type.
+   */
+  static Comparator<AnalysisError> ERROR_CODE_COMPARATOR = (AnalysisError o1,
+      AnalysisError o2) {
+    ErrorCode errorCode1 = o1.errorCode;
+    ErrorCode errorCode2 = o2.errorCode;
+    ErrorSeverity errorSeverity1 = errorCode1.errorSeverity;
+    ErrorSeverity errorSeverity2 = errorCode2.errorSeverity;
+    if (errorSeverity1 == errorSeverity2) {
+      ErrorType errorType1 = errorCode1.type;
+      ErrorType errorType2 = errorCode2.type;
+      return errorType1.compareTo(errorType2);
+    } else {
+      return errorSeverity2.compareTo(errorSeverity1);
+    }
+  };
+
+  /**
+   * The error code associated with the error.
+   */
+  final ErrorCode errorCode;
+
+  /**
+   * The localized error message.
+   */
+  String _message;
+
+  /**
+   * The correction to be displayed for this error, or `null` if there is no
+   * correction information for this error.
+   */
+  String _correction;
+
+  /**
+   * The source in which the error occurred, or `null` if unknown.
+   */
+  Source source;
+
+  /**
+   * The character offset from the beginning of the source (zero based) where
+   * the error occurred.
+   */
+  int offset = 0;
+
+  /**
+   * The number of characters from the offset to the end of the source which
+   * encompasses the compilation error.
+   */
+  int length = 0;
+
+  /**
+   * A flag indicating whether this error can be shown to be a non-issue because
+   * of the result of type propagation.
+   */
+  bool isStaticOnly = false;
+
+  /**
+   * Initialize a newly created analysis error. The error is associated with the
+   * given [source] and is located at the given [offset] with the given
+   * [length]. The error will have the given [errorCode] and the list of
+   * [arguments] will be used to complete the message.
+   */
+  AnalysisError(this.source, this.offset, this.length, this.errorCode,
+      [List<Object> arguments]) {
+    this._message = formatList(errorCode.message, arguments);
+    String correctionTemplate = errorCode.correction;
+    if (correctionTemplate != null) {
+      this._correction = formatList(correctionTemplate, arguments);
+    }
+  }
+
+  /**
+   * Initialize a newly created analysis error for the specified [source]. The
+   * error will have the given [errorCode] and the list of [arguments] will be
+   * used to complete the message. The error has no location information.
+   */
+  @deprecated // Use new AnalysisError(source, 0, 0, errorCode, arguments)
+  AnalysisError.con1(Source source, ErrorCode errorCode,
+      [List<Object> arguments])
+      : this(source, 0, 0, errorCode, arguments);
+
+  /**
+   * Initialize a newly created analysis error for the specified [source] at the
+   * given [offset] with the given [length]. The error will have the given
+   * [errorCode] and the list of [arguments] will be used to complete the
+   * message.
+   */
+  @deprecated // Use new AnalysisError(source, offset, length, errorCode, arguments)
+  AnalysisError.con2(Source source, int offset, int length, ErrorCode errorCode,
+      [List<Object> arguments])
+      : this(source, offset, length, errorCode, arguments);
+
+  /**
+   * Return the template used to create the correction to be displayed for this
+   * error, or `null` if there is no correction information for this error. The
+   * correction should indicate how the user can fix the error.
+   */
+  String get correction => _correction;
+
+  @override
+  int get hashCode {
+    int hashCode = offset;
+    hashCode ^= (_message != null) ? _message.hashCode : 0;
+    hashCode ^= (source != null) ? source.hashCode : 0;
+    return hashCode;
+  }
+
+  /**
+   * Return the message to be displayed for this error. The message should
+   * indicate what is wrong and why it is wrong.
+   */
+  String get message => _message;
+
+  @override
+  bool operator ==(Object obj) {
+    if (identical(obj, this)) {
+      return true;
+    }
+    // prepare other AnalysisError
+    if (obj is! AnalysisError) {
+      return false;
+    }
+    AnalysisError other = obj as AnalysisError;
+    // Quick checks.
+    if (!identical(errorCode, other.errorCode)) {
+      return false;
+    }
+    if (offset != other.offset || length != other.length) {
+      return false;
+    }
+    if (isStaticOnly != other.isStaticOnly) {
+      return false;
+    }
+    // Deep checks.
+    if (_message != other._message) {
+      return false;
+    }
+    if (source != other.source) {
+      return false;
+    }
+    // OK
+    return true;
+  }
+
+  /**
+   * Return the value of the given [property], or `null` if the given property
+   * is not defined for this error.
+   */
+  Object getProperty(ErrorProperty property) => null;
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write((source != null) ? source.fullName : "<unknown source>");
+    buffer.write("(");
+    buffer.write(offset);
+    buffer.write("..");
+    buffer.write(offset + length - 1);
+    buffer.write("): ");
+    //buffer.write("(" + lineNumber + ":" + columnNumber + "): ");
+    buffer.write(_message);
+    return buffer.toString();
+  }
+
+  /**
+   * Merge all of the errors in the lists in the given list of [errorLists] into
+   * a single list of errors.
+   */
+  static List<AnalysisError> mergeLists(List<List<AnalysisError>> errorLists) {
+    Set<AnalysisError> errors = new HashSet<AnalysisError>();
+    for (List<AnalysisError> errorList in errorLists) {
+      errors.addAll(errorList);
+    }
+    return errors.toList();
+  }
+}
+
+/**
+ * An object that listen for [AnalysisError]s being produced by the analysis
+ * engine.
+ */
+abstract class AnalysisErrorListener {
+  /**
+   * An error listener that ignores errors that are reported to it.
+   */
+  static final AnalysisErrorListener NULL_LISTENER =
+      new AnalysisErrorListener_NULL_LISTENER();
+
+  /**
+   * This method is invoked when an [error] has been found by the analysis
+   * engine.
+   */
+  void onError(AnalysisError error);
+}
+
+/**
+ * An [AnalysisErrorListener] that ignores error.
+ */
+class AnalysisErrorListener_NULL_LISTENER implements AnalysisErrorListener {
+  @override
+  void onError(AnalysisError event) {
+    // Ignore errors
+  }
+}
+
+/**
+ * An [AnalysisError] that can have arbitrary properties associated with it.
+ */
+class AnalysisErrorWithProperties extends AnalysisError {
+  /**
+   * The properties associated with this error.
+   */
+  HashMap<ErrorProperty, Object> _propertyMap =
+      new HashMap<ErrorProperty, Object>();
+
+  /**
+   * Initialize a newly created analysis error. The error is associated with the
+   * given [source] and is located at the given [offset] with the given
+   * [length]. The error will have the given [errorCode] and the list of
+   * [arguments] will be used to complete the message.
+   */
+  AnalysisErrorWithProperties(
+      Source source, int offset, int length, ErrorCode errorCode,
+      [List<Object> arguments])
+      : super(source, offset, length, errorCode, arguments);
+
+  /**
+   * Initialize a newly created analysis error for the specified [source]. The
+   * error will have the given [errorCode] and the list of [arguments] will be
+   * used to complete the message. The error has no location information.
+   */
+  @deprecated // Use new AnalysisErrorWithProperties(source, 0, 0, errorCode, arguments)
+  AnalysisErrorWithProperties.con1(Source source, ErrorCode errorCode,
+      [List<Object> arguments])
+      : this(source, 0, 0, errorCode, arguments);
+
+  /**
+   * Initialize a newly created analysis error for the specified [source] at the
+   * given [offset] with the given [length]. The error will have the given
+   * [errorCode] and the list of [arguments] will be used to complete the
+   * message.
+   */
+  @deprecated // Use new AnalysisErrorWithProperties(source, offset, length, errorCode, arguments)
+  AnalysisErrorWithProperties.con2(
+      Source source, int offset, int length, ErrorCode errorCode,
+      [List<Object> arguments])
+      : this(source, offset, length, errorCode, arguments);
+
+  @override
+  Object getProperty(ErrorProperty property) => _propertyMap[property];
+
+  /**
+   * Set the value of the given [property] to the given [value]. Using a value
+   * of `null` will effectively remove the property from this error.
+   */
+  void setProperty(ErrorProperty property, Object value) {
+    _propertyMap[property] = value;
+  }
+}
+
+/**
+ * An [AnalysisErrorListener] that keeps track of whether any error has been
+ * reported to it.
+ */
+class BooleanErrorListener implements AnalysisErrorListener {
+  /**
+   * A flag indicating whether an error has been reported to this listener.
+   */
+  bool _errorReported = false;
+
+  /**
+   * Return `true` if an error has been reported to this listener.
+   */
+  bool get errorReported => _errorReported;
+
+  @override
+  void onError(AnalysisError error) {
+    _errorReported = true;
+  }
+}
+
+/**
+ * The error codes used for compile time errors caused by constant evaluation
+ * that would throw an exception when run in checked mode. The client of the
+ * analysis engine is responsible for determining how these errors should be
+ * presented to the user (for example, a command-line compiler might elect to
+ * treat these errors differently depending whether it is compiling it "checked"
+ * mode).
+ */
+class CheckedModeCompileTimeErrorCode extends ErrorCode {
+  // TODO(paulberry): improve the text of these error messages so that it's
+  // clear to the user that the error is coming from constant evaluation (and
+  // hence the constant needs to be a subtype of the annotated type) as opposed
+  // to static type analysis (which only requires that the two types be
+  // assignable).  Also consider populating the "correction" field for these
+  // errors.
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant
+   * object results in an uncaught exception being thrown.
+   */
+  static const CheckedModeCompileTimeErrorCode CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH =
+      const CheckedModeCompileTimeErrorCode(
+          'CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH',
+          "The object type '{0}' cannot be assigned to the field '{1}', which has type '{2}'");
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant
+   * object results in an uncaught exception being thrown.
+   */
+  static const CheckedModeCompileTimeErrorCode CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH =
+      const CheckedModeCompileTimeErrorCode(
+          'CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH',
+          "The object type '{0}' cannot be assigned to a parameter of type '{1}'");
+
+  /**
+   * 7.6.1 Generative Constructors: In checked mode, it is a dynamic type error
+   * if o is not <b>null</b> and the interface of the class of <i>o</i> is not a
+   * subtype of the static type of the field <i>v</i>.
+   *
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant
+   * object results in an uncaught exception being thrown.
+   *
+   * Parameters:
+   * 0: the name of the type of the initializer expression
+   * 1: the name of the type of the field
+   */
+  static const CheckedModeCompileTimeErrorCode CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE =
+      const CheckedModeCompileTimeErrorCode(
+          'CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE',
+          "The initializer type '{0}' cannot be assigned to the field type '{1}'");
+
+  /**
+   * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i>
+   * ... <i>e<sub>n</sub></i>] is evaluated as follows:
+   * * The operator []= is invoked on <i>a</i> with first argument <i>i</i> and
+   *   second argument <i>o<sub>i+1</sub></i><i>, 1 &lt;= i &lt;= n</i>
+   *
+   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static
+   * type of <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of
+   * <i>p<sub>i</sub>, 1 &lt;= i &lt;= n+k</i> and let <i>S<sub>q</sub></i> be
+   * the type of the named parameter <i>q</i> of <i>f</i>. It is a static
+   * warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>,
+   * 1 &lt;= j &lt;= m</i>.
+   */
+  static const CheckedModeCompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE =
+      const CheckedModeCompileTimeErrorCode('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE',
+          "The element type '{0}' cannot be assigned to the list type '{1}'");
+
+  /**
+   * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt;
+   * [<i>k<sub>1</sub></i> : <i>e<sub>1</sub></i> ... <i>k<sub>n</sub></i> :
+   * <i>e<sub>n</sub></i>] is evaluated as follows:
+   * * The operator []= is invoked on <i>m</i> with first argument
+   *   <i>k<sub>i</sub></i> and second argument <i>e<sub>i</sub></i><i>, 1 &lt;=
+   *   i &lt;= n</i>
+   *
+   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static
+   * type of <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of
+   * <i>p<sub>i</sub>, 1 &lt;= i &lt;= n+k</i> and let <i>S<sub>q</sub></i> be
+   * the type of the named parameter <i>q</i> of <i>f</i>. It is a static
+   * warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1
+   * &lt;= j &lt;= m</i>.
+   */
+  static const CheckedModeCompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE =
+      const CheckedModeCompileTimeErrorCode('MAP_KEY_TYPE_NOT_ASSIGNABLE',
+          "The element type '{0}' cannot be assigned to the map key type '{1}'");
+
+  /**
+   * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt;
+   * [<i>k<sub>1</sub></i> : <i>e<sub>1</sub></i> ... <i>k<sub>n</sub></i> :
+   * <i>e<sub>n</sub></i>] is evaluated as follows:
+   * * The operator []= is invoked on <i>m</i> with first argument
+   *   <i>k<sub>i</sub></i> and second argument <i>e<sub>i</sub></i><i>, 1 &lt;=
+   *   i &lt;= n</i>
+   *
+   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static
+   * type of <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of
+   * <i>p<sub>i</sub>, 1 &lt;= i &lt;= n+k</i> and let <i>S<sub>q</sub></i> be
+   * the type of the named parameter <i>q</i> of <i>f</i>. It is a static
+   * warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1
+   * &lt;= j &lt;= m</i>.
+   */
+  static const CheckedModeCompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE =
+      const CheckedModeCompileTimeErrorCode('MAP_VALUE_TYPE_NOT_ASSIGNABLE',
+          "The element type '{0}' cannot be assigned to the map value type '{1}'");
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant
+   * object results in an uncaught exception being thrown.
+   */
+  static const CheckedModeCompileTimeErrorCode VARIABLE_TYPE_MISMATCH =
+      const CheckedModeCompileTimeErrorCode('VARIABLE_TYPE_MISMATCH',
+          "The object type '{0}' cannot be assigned to a variable of type '{1}'");
+
+  /**
+   * Initialize a newly created error code to have the given [name]. The message
+   * associated with the error will be created from the given [message]
+   * template. The correction associated with the error will be created from the
+   * given [correction] template.
+   */
+  const CheckedModeCompileTimeErrorCode(String name, String message,
+      [String correction])
+      : super(name, message, correction);
+
+  @override
+  ErrorSeverity get errorSeverity =>
+      ErrorType.CHECKED_MODE_COMPILE_TIME_ERROR.severity;
+
+  @override
+  ErrorType get type => ErrorType.CHECKED_MODE_COMPILE_TIME_ERROR;
+}
+
+/**
+ * The error codes used for compile time errors. The convention for this class
+ * is for the name of the error code to indicate the problem that caused the
+ * error to be generated and for the error message to explain what is wrong and,
+ * when appropriate, how the problem can be corrected.
+ */
+class CompileTimeErrorCode extends ErrorCode {
+  /**
+   * Enum proposal: It is also a compile-time error to explicitly instantiate an
+   * enum via 'new' or 'const' or to access its private fields.
+   */
+  static const CompileTimeErrorCode ACCESS_PRIVATE_ENUM_FIELD =
+      const CompileTimeErrorCode('ACCESS_PRIVATE_ENUM_FIELD',
+          "The private fields of an enum cannot be accessed, even within the same library");
+
+  /**
+   * 14.2 Exports: It is a compile-time error if a name <i>N</i> is re-exported
+   * by a library <i>L</i> and <i>N</i> is introduced into the export namespace
+   * of <i>L</i> by more than one export, unless each all exports refer to same
+   * declaration for the name N.
+   *
+   * Parameters:
+   * 0: the name of the ambiguous element
+   * 1: the name of the first library that the type is found
+   * 2: the name of the second library that the type is found
+   */
+  static const CompileTimeErrorCode AMBIGUOUS_EXPORT =
+      const CompileTimeErrorCode('AMBIGUOUS_EXPORT',
+          "The name '{0}' is defined in the libraries '{1}' and '{2}'");
+
+  /**
+   * 12.33 Argument Definition Test: It is a compile time error if <i>v</i> does
+   * not denote a formal parameter.
+   *
+   * Parameters:
+   * 0: the name of the identifier in the argument definition test that is not a
+   *    parameter
+   */
+  static const CompileTimeErrorCode ARGUMENT_DEFINITION_TEST_NON_PARAMETER =
+      const CompileTimeErrorCode(
+          'ARGUMENT_DEFINITION_TEST_NON_PARAMETER', "'{0}' is not a parameter");
+
+  /**
+   * ?? Asynchronous For-in: It is a compile-time error if an asynchronous
+   * for-in statement appears inside a synchronous function.
+   */
+  static const CompileTimeErrorCode ASYNC_FOR_IN_WRONG_CONTEXT =
+      const CompileTimeErrorCode('ASYNC_FOR_IN_WRONG_CONTEXT',
+          "The asynchronous for-in can only be used in a function marked with async or async*");
+
+  /**
+   * ??: It is a compile-time error if the function immediately enclosing a is
+   * not declared asynchronous.
+   */
+  static const CompileTimeErrorCode AWAIT_IN_WRONG_CONTEXT =
+      const CompileTimeErrorCode('AWAIT_IN_WRONG_CONTEXT',
+          "The await expression can only be used in a function marked as async or async*");
+
+  /**
+   * 12.30 Identifier Reference: It is a compile-time error to use a built-in
+   * identifier other than dynamic as a type annotation.
+   */
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE =
+      const CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPE',
+          "The built-in identifier '{0}' cannot be used as a type");
+
+  /**
+   * 12.30 Identifier Reference: It is a compile-time error if a built-in
+   * identifier is used as the declared name of a class, type parameter or type
+   * alias.
+   */
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_NAME =
+      const CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPE_NAME',
+          "The built-in identifier '{0}' cannot be used as a type name");
+
+  /**
+   * 12.30 Identifier Reference: It is a compile-time error if a built-in
+   * identifier is used as the declared name of a class, type parameter or type
+   * alias.
+   */
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME =
+      const CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME',
+          "The built-in identifier '{0}' cannot be used as a type alias name");
+
+  /**
+   * 12.30 Identifier Reference: It is a compile-time error if a built-in
+   * identifier is used as the declared name of a class, type parameter or type
+   * alias.
+   */
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME =
+      const CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME',
+          "The built-in identifier '{0}' cannot be used as a type parameter name");
+
+  /**
+   * 13.9 Switch: It is a compile-time error if the class <i>C</i> implements
+   * the operator <i>==</i>.
+   */
+  static const CompileTimeErrorCode CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS =
+      const CompileTimeErrorCode('CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS',
+          "The switch case expression type '{0}' cannot override the == operator");
+
+  /**
+   * 12.1 Constants: It is a compile-time error if evaluation of a compile-time
+   * constant would raise
+   * an exception.
+   */
+  static const CompileTimeErrorCode COMPILE_TIME_CONSTANT_RAISES_EXCEPTION =
+      const CompileTimeErrorCode('COMPILE_TIME_CONSTANT_RAISES_EXCEPTION', "");
+
+  /**
+   * 7.2 Getters: It is a compile-time error if a class has both a getter and a
+   * method with the same name. This restriction holds regardless of whether the
+   * getter is defined explicitly or implicitly, or whether the getter or the
+   * method are inherited or not.
+   */
+  static const CompileTimeErrorCode CONFLICTING_GETTER_AND_METHOD =
+      const CompileTimeErrorCode('CONFLICTING_GETTER_AND_METHOD',
+          "Class '{0}' cannot have both getter '{1}.{2}' and method with the same name");
+
+  /**
+   * 7.2 Getters: It is a compile-time error if a class has both a getter and a
+   * method with the same name. This restriction holds regardless of whether the
+   * getter is defined explicitly or implicitly, or whether the getter or the
+   * method are inherited or not.
+   */
+  static const CompileTimeErrorCode CONFLICTING_METHOD_AND_GETTER =
+      const CompileTimeErrorCode('CONFLICTING_METHOD_AND_GETTER',
+          "Class '{0}' cannot have both method '{1}.{2}' and getter with the same name");
+
+  /**
+   * 7.6 Constructors: A constructor name always begins with the name of its
+   * immediately enclosing class, and may optionally be followed by a dot and an
+   * identifier <i>id</i>. It is a compile-time error if <i>id</i> is the name
+   * of a member declared in the immediately enclosing class.
+   */
+  static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD =
+      const CompileTimeErrorCode('CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD',
+          "'{0}' cannot be used to name a constructor and a field in this class");
+
+  /**
+   * 7.6 Constructors: A constructor name always begins with the name of its
+   * immediately enclosing class, and may optionally be followed by a dot and an
+   * identifier <i>id</i>. It is a compile-time error if <i>id</i> is the name
+   * of a member declared in the immediately enclosing class.
+   */
+  static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD =
+      const CompileTimeErrorCode('CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD',
+          "'{0}' cannot be used to name a constructor and a method in this class");
+
+  /**
+   * 7. Classes: It is a compile time error if a generic class declares a type
+   * variable with the same name as the class or any of its members or
+   * constructors.
+   */
+  static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_CLASS =
+      const CompileTimeErrorCode('CONFLICTING_TYPE_VARIABLE_AND_CLASS',
+          "'{0}' cannot be used to name a type varaible in a class with the same name");
+
+  /**
+   * 7. Classes: It is a compile time error if a generic class declares a type
+   * variable with the same name as the class or any of its members or
+   * constructors.
+   */
+  static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_MEMBER =
+      const CompileTimeErrorCode('CONFLICTING_TYPE_VARIABLE_AND_MEMBER',
+          "'{0}' cannot be used to name a type varaible and member in this class");
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant
+   * object results in an uncaught exception being thrown.
+   */
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_THROWS_EXCEPTION =
+      const CompileTimeErrorCode('CONST_CONSTRUCTOR_THROWS_EXCEPTION',
+          "'const' constructors cannot throw exceptions");
+
+  /**
+   * 10.6.3 Constant Constructors: It is a compile-time error if a constant
+   * constructor is declared by a class C if any instance variable declared in C
+   * is initialized with an expression that is not a constant expression.
+   */
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST =
+      const CompileTimeErrorCode(
+          'CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST',
+          "Can't define the 'const' constructor because the field '{0}' is initialized with a non-constant value");
+
+  /**
+   * 7.6.3 Constant Constructors: The superinitializer that appears, explicitly
+   * or implicitly, in the initializer list of a constant constructor must
+   * specify a constant constructor of the superclass of the immediately
+   * enclosing class or a compile-time error occurs.
+   *
+   * 9 Mixins: For each generative constructor named ... an implicitly declared
+   * constructor named ... is declared.
+   */
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_MIXIN =
+      const CompileTimeErrorCode('CONST_CONSTRUCTOR_WITH_MIXIN',
+          "Constant constructor cannot be declared for a class with a mixin");
+
+  /**
+   * 7.6.3 Constant Constructors: The superinitializer that appears, explicitly
+   * or implicitly, in the initializer list of a constant constructor must
+   * specify a constant constructor of the superclass of the immediately
+   * enclosing class or a compile-time error occurs.
+   */
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER =
+      const CompileTimeErrorCode('CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER',
+          "Constant constructor cannot call non-constant super constructor of '{0}'");
+
+  /**
+   * 7.6.3 Constant Constructors: It is a compile-time error if a constant
+   * constructor is declared by a class that has a non-final instance variable.
+   *
+   * The above refers to both locally declared and inherited instance variables.
+   */
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD =
+      const CompileTimeErrorCode('CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD',
+          "Cannot define the 'const' constructor for a class with non-final fields");
+
+  /**
+   * 12.12.2 Const: It is a compile-time error if <i>T</i> is a deferred type.
+   */
+  static const CompileTimeErrorCode CONST_DEFERRED_CLASS =
+      const CompileTimeErrorCode('CONST_DEFERRED_CLASS',
+          "Deferred classes cannot be created with 'const'");
+
+  /**
+   * 6.2 Formal Parameters: It is a compile-time error if a formal parameter is
+   * declared as a constant variable.
+   */
+  static const CompileTimeErrorCode CONST_FORMAL_PARAMETER =
+      const CompileTimeErrorCode(
+          'CONST_FORMAL_PARAMETER', "Parameters cannot be 'const'");
+
+  /**
+   * 5 Variables: A constant variable must be initialized to a compile-time
+   * constant or a compile-time error occurs.
+   */
+  static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE =
+      const CompileTimeErrorCode('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE',
+          "'const' variables must be constant value");
+
+  /**
+   * 5 Variables: A constant variable must be initialized to a compile-time
+   * constant or a compile-time error occurs.
+   *
+   * 12.1 Constants: A qualified reference to a static constant variable that is
+   * not qualified by a deferred prefix.
+   */
+  static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY =
+      const CompileTimeErrorCode(
+          'CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY',
+          "Constant values from a deferred library cannot be used to initialized a 'const' variable");
+
+  /**
+   * 7.5 Instance Variables: It is a compile-time error if an instance variable
+   * is declared to be constant.
+   */
+  static const CompileTimeErrorCode CONST_INSTANCE_FIELD =
+      const CompileTimeErrorCode('CONST_INSTANCE_FIELD',
+          "Only static fields can be declared as 'const'");
+
+  /**
+   * 12.8 Maps: It is a compile-time error if the key of an entry in a constant
+   * map literal is an instance of a class that implements the operator
+   * <i>==</i> unless the key is a string or integer.
+   */
+  static const CompileTimeErrorCode CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS =
+      const CompileTimeErrorCode(
+          'CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS',
+          "The constant map entry key expression type '{0}' cannot override the == operator");
+
+  /**
+   * 5 Variables: A constant variable must be initialized to a compile-time
+   * constant (12.1) or a compile-time error occurs.
+   *
+   * Parameters:
+   * 0: the name of the uninitialized final variable
+   */
+  static const CompileTimeErrorCode CONST_NOT_INITIALIZED =
+      const CompileTimeErrorCode('CONST_NOT_INITIALIZED',
+          "The const variable '{0}' must be initialized");
+
+  /**
+   * 12.11.2 Const: An expression of one of the forms !e, e1 && e2 or e1 || e2,
+   * where e, e1 and e2 are constant expressions that evaluate to a boolean
+   * value.
+   */
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL =
+      const CompileTimeErrorCode('CONST_EVAL_TYPE_BOOL',
+          "In constant expressions, operand(s) of this operator must be of type 'bool'");
+
+  /**
+   * 12.11.2 Const: An expression of one of the forms e1 == e2 or e1 != e2 where
+   * e1 and e2 are constant expressions that evaluate to a numeric, string or
+   * boolean value or to null.
+   */
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_NUM_STRING =
+      const CompileTimeErrorCode('CONST_EVAL_TYPE_BOOL_NUM_STRING',
+          "In constant expressions, operands of this operator must be of type 'bool', 'num', 'String' or 'null'");
+
+  /**
+   * 12.11.2 Const: An expression of one of the forms ~e, e1 ^ e2, e1 & e2,
+   * e1 | e2, e1 >> e2 or e1 << e2, where e, e1 and e2 are constant expressions
+   * that evaluate to an integer value or to null.
+   */
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_INT =
+      const CompileTimeErrorCode('CONST_EVAL_TYPE_INT',
+          "In constant expressions, operand(s) of this operator must be of type 'int'");
+
+  /**
+   * 12.11.2 Const: An expression of one of the forms e, e1 + e2, e1 - e2, e1 *
+   * e2, e1 / e2, e1 ~/ e2, e1 > e2, e1 < e2, e1 >= e2, e1 <= e2 or e1 % e2,
+   * where e, e1 and e2 are constant expressions that evaluate to a numeric
+   * value or to null.
+   */
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_NUM =
+      const CompileTimeErrorCode('CONST_EVAL_TYPE_NUM',
+          "In constant expressions, operand(s) of this operator must be of type 'num'");
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant
+   * object results in an uncaught exception being thrown.
+   */
+  static const CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION =
+      const CompileTimeErrorCode('CONST_EVAL_THROWS_EXCEPTION',
+          "Evaluation of this constant expression causes exception");
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant
+   * object results in an uncaught exception being thrown.
+   */
+  static const CompileTimeErrorCode CONST_EVAL_THROWS_IDBZE =
+      const CompileTimeErrorCode('CONST_EVAL_THROWS_IDBZE',
+          "Evaluation of this constant expression throws IntegerDivisionByZeroException");
+
+  /**
+   * 12.11.2 Const: If <i>T</i> is a parameterized type <i>S&lt;U<sub>1</sub>,
+   * &hellip;, U<sub>m</sub>&gt;</i>, let <i>R = S</i>; It is a compile time
+   * error if <i>S</i> is not a generic type with <i>m</i> type parameters.
+   *
+   * Parameters:
+   * 0: the name of the type being referenced (<i>S</i>)
+   * 1: the number of type parameters that were declared
+   * 2: the number of type arguments provided
+   *
+   * See [CompileTimeErrorCode.NEW_WITH_INVALID_TYPE_PARAMETERS], and
+   * [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS].
+   */
+  static const CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS =
+      const CompileTimeErrorCode('CONST_WITH_INVALID_TYPE_PARAMETERS',
+          "The type '{0}' is declared with {1} type parameters, but {2} type arguments were given");
+
+  /**
+   * 12.11.2 Const: If <i>e</i> is of the form <i>const T(a<sub>1</sub>,
+   * &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;,
+   * x<sub>n+k</sub>: a<sub>n+k</sub>)</i> it is a compile-time error if the
+   * type <i>T</i> does not declare a constant constructor with the same name as
+   * the declaration of <i>T</i>.
+   */
+  static const CompileTimeErrorCode CONST_WITH_NON_CONST =
+      const CompileTimeErrorCode('CONST_WITH_NON_CONST',
+          "The constructor being called is not a 'const' constructor");
+
+  /**
+   * 12.11.2 Const: In all of the above cases, it is a compile-time error if
+   * <i>a<sub>i</sub>, 1 &lt;= i &lt;= n + k</i>, is not a compile-time constant
+   * expression.
+   */
+  static const CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT =
+      const CompileTimeErrorCode('CONST_WITH_NON_CONSTANT_ARGUMENT',
+          "Arguments of a constant creation must be constant expressions");
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class
+   * accessible in the current scope, optionally followed by type arguments.
+   *
+   * 12.11.2 Const: If <i>e</i> is of the form <i>const T.id(a<sub>1</sub>,
+   * &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;
+   * x<sub>n+k</sub>: a<sub>n+k</sub>)</i> it is a compile-time error if
+   * <i>T</i> is not a class accessible in the current scope, optionally
+   * followed by type arguments.
+   *
+   * Parameters:
+   * 0: the name of the non-type element
+   */
+  static const CompileTimeErrorCode CONST_WITH_NON_TYPE =
+      const CompileTimeErrorCode(
+          'CONST_WITH_NON_TYPE', "The name '{0}' is not a class");
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if <i>T</i> includes any type
+   * parameters.
+   */
+  static const CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS =
+      const CompileTimeErrorCode('CONST_WITH_TYPE_PARAMETERS',
+          "The constant creation cannot use a type parameter");
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of
+   * a constant constructor declared by the type <i>T</i>.
+   *
+   * Parameters:
+   * 0: the name of the type
+   * 1: the name of the requested constant constructor
+   */
+  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR =
+      const CompileTimeErrorCode('CONST_WITH_UNDEFINED_CONSTRUCTOR',
+          "The class '{0}' does not have a constant constructor '{1}'");
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of
+   * a constant constructor declared by the type <i>T</i>.
+   *
+   * Parameters:
+   * 0: the name of the type
+   */
+  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT =
+      const CompileTimeErrorCode('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT',
+          "The class '{0}' does not have a default constant constructor");
+
+  /**
+   * 15.3.1 Typedef: It is a compile-time error if any default values are
+   * specified in the signature of a function type alias.
+   */
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS =
+      const CompileTimeErrorCode('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS',
+          "Default values aren't allowed in typedefs");
+
+  /**
+   * 6.2.1 Required Formals: By means of a function signature that names the
+   * parameter and describes its type as a function type. It is a compile-time
+   * error if any default values are specified in the signature of such a
+   * function type.
+   */
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER =
+      const CompileTimeErrorCode('DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER',
+          "Default values aren't allowed in function type parameters");
+
+  /**
+   * 7.6.2 Factories: It is a compile-time error if <i>k</i> explicitly
+   * specifies a default value for an optional parameter.
+   */
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR =
+      const CompileTimeErrorCode(
+          'DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR',
+          "Default values aren't allowed in factory constructors that redirect to another constructor");
+
+  /**
+   * 3.1 Scoping: It is a compile-time error if there is more than one entity
+   * with the same name declared in the same scope.
+   */
+  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_DEFAULT =
+      const CompileTimeErrorCode('DUPLICATE_CONSTRUCTOR_DEFAULT',
+          "The default constructor is already defined");
+
+  /**
+   * 3.1 Scoping: It is a compile-time error if there is more than one entity
+   * with the same name declared in the same scope.
+   *
+   * Parameters:
+   * 0: the name of the duplicate entity
+   */
+  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME =
+      const CompileTimeErrorCode('DUPLICATE_CONSTRUCTOR_NAME',
+          "The constructor with name '{0}' is already defined");
+
+  /**
+   * 3.1 Scoping: It is a compile-time error if there is more than one entity
+   * with the same name declared in the same scope.
+   *
+   * 7 Classes: It is a compile-time error if a class declares two members of
+   * the same name.
+   *
+   * 7 Classes: It is a compile-time error if a class has an instance member and
+   * a static member with the same name.
+   *
+   * Parameters:
+   * 0: the name of the duplicate entity
+   */
+  static const CompileTimeErrorCode DUPLICATE_DEFINITION =
+      const CompileTimeErrorCode(
+          'DUPLICATE_DEFINITION', "The name '{0}' is already defined");
+
+  /**
+   * 7. Classes: It is a compile-time error if a class has an instance member
+   * and a static member with the same name.
+   *
+   * This covers the additional duplicate definition cases where inheritance has
+   * to be considered.
+   *
+   * Parameters:
+   * 0: the name of the class that has conflicting instance/static members
+   * 1: the name of the conflicting members
+   *
+   * See [DUPLICATE_DEFINITION].
+   */
+  static const CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE =
+      const CompileTimeErrorCode('DUPLICATE_DEFINITION_INHERITANCE',
+          "The name '{0}' is already defined in '{1}'");
+
+  /**
+   * 12.14.2 Binding Actuals to Formals: It is a compile-time error if
+   * <i>q<sub>i</sub> = q<sub>j</sub></i> for any <i>i != j</i> [where
+   * <i>q<sub>i</sub></i> is the label for a named argument].
+   */
+  static const CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT =
+      const CompileTimeErrorCode('DUPLICATE_NAMED_ARGUMENT',
+          "The argument for the named parameter '{0}' was already specified");
+
+  /**
+   * SDK implementation libraries can be exported only by other SDK libraries.
+   *
+   * Parameters:
+   * 0: the uri pointing to a library
+   */
+  static const CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY =
+      const CompileTimeErrorCode('EXPORT_INTERNAL_LIBRARY',
+          "The library '{0}' is internal and cannot be exported");
+
+  /**
+   * 14.2 Exports: It is a compile-time error if the compilation unit found at
+   * the specified URI is not a library declaration.
+   *
+   * Parameters:
+   * 0: the uri pointing to a non-library declaration
+   */
+  static const CompileTimeErrorCode EXPORT_OF_NON_LIBRARY =
+      const CompileTimeErrorCode('EXPORT_OF_NON_LIBRARY',
+          "The exported library '{0}' must not have a part-of directive");
+
+  /**
+   * Enum proposal: It is a compile-time error to subclass, mix-in or implement
+   * an enum.
+   */
+  static const CompileTimeErrorCode EXTENDS_ENUM = const CompileTimeErrorCode(
+      'EXTENDS_ENUM', "Classes cannot extend an enum");
+
+  /**
+   * 7.9 Superclasses: It is a compile-time error if the extends clause of a
+   * class <i>C</i> includes a type expression that does not denote a class
+   * available in the lexical scope of <i>C</i>.
+   *
+   * Parameters:
+   * 0: the name of the superclass that was not found
+   */
+  static const CompileTimeErrorCode EXTENDS_NON_CLASS =
+      const CompileTimeErrorCode(
+          'EXTENDS_NON_CLASS', "Classes can only extend other classes");
+
+  /**
+   * 12.2 Null: It is a compile-time error for a class to attempt to extend or
+   * implement Null.
+   *
+   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend
+   * or implement int.
+   *
+   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend
+   * or implement double.
+   *
+   * 12.3 Numbers: It is a compile-time error for any type other than the types
+   * int and double to
+   * attempt to extend or implement num.
+   *
+   * 12.4 Booleans: It is a compile-time error for a class to attempt to extend
+   * or implement bool.
+   *
+   * 12.5 Strings: It is a compile-time error for a class to attempt to extend
+   * or implement String.
+   *
+   * Parameters:
+   * 0: the name of the type that cannot be extended
+   *
+   * See [IMPLEMENTS_DISALLOWED_CLASS].
+   */
+  static const CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS =
+      const CompileTimeErrorCode(
+          'EXTENDS_DISALLOWED_CLASS', "Classes cannot extend '{0}'");
+
+  /**
+   * 7.9 Superclasses: It is a compile-time error if the extends clause of a
+   * class <i>C</i> includes a deferred type expression.
+   *
+   * Parameters:
+   * 0: the name of the type that cannot be extended
+   *
+   * See [IMPLEMENTS_DEFERRED_CLASS], and [MIXIN_DEFERRED_CLASS].
+   */
+  static const CompileTimeErrorCode EXTENDS_DEFERRED_CLASS =
+      const CompileTimeErrorCode('EXTENDS_DEFERRED_CLASS',
+          "This class cannot extend the deferred class '{0}'");
+
+  /**
+   * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt;
+   * h</i> or if <i>m &gt; n</i>.
+   *
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant
+   * object results in an uncaught exception being thrown.
+   *
+   * Parameters:
+   * 0: the maximum number of positional arguments
+   * 1: the actual number of positional arguments given
+   */
+  static const CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS =
+      const CompileTimeErrorCode('EXTRA_POSITIONAL_ARGUMENTS',
+          "{0} positional arguments expected, but {1} found");
+
+  /**
+   * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It
+   * is a compile time error if more than one initializer corresponding to a
+   * given instance variable appears in <i>k</i>'s list.
+   */
+  static const CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS =
+      const CompileTimeErrorCode('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS',
+          "The field '{0}' cannot be initialized twice in the same constructor");
+
+  /**
+   * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It
+   * is a compile time error if <i>k</i>'s initializer list contains an
+   * initializer for a variable that is initialized by means of an initializing
+   * formal of <i>k</i>.
+   */
+  static const CompileTimeErrorCode FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER =
+      const CompileTimeErrorCode(
+          'FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER',
+          "Fields cannot be initialized in both the parameter list and the initializers");
+
+  /**
+   * 5 Variables: It is a compile-time error if a final instance variable that
+   * has is initialized by means of an initializing formal of a constructor is
+   * also initialized elsewhere in the same constructor.
+   *
+   * Parameters:
+   * 0: the name of the field in question
+   */
+  static const CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES =
+      const CompileTimeErrorCode('FINAL_INITIALIZED_MULTIPLE_TIMES',
+          "'{0}' is a final field and so can only be set once");
+
+  /**
+   * 7.6.1 Generative Constructors: It is a compile-time error if an
+   * initializing formal is used by a function other than a non-redirecting
+   * generative constructor.
+   */
+  static const CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR =
+      const CompileTimeErrorCode('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR',
+          "Initializing formal fields cannot be used in factory constructors");
+
+  /**
+   * 7.6.1 Generative Constructors: It is a compile-time error if an
+   * initializing formal is used by a function other than a non-redirecting
+   * generative constructor.
+   */
+  static const CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR =
+      const CompileTimeErrorCode('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR',
+          "Initializing formal fields can only be used in constructors");
+
+  /**
+   * 7.6.1 Generative Constructors: A generative constructor may be redirecting,
+   * in which case its only action is to invoke another generative constructor.
+   *
+   * 7.6.1 Generative Constructors: It is a compile-time error if an
+   * initializing formal is used by a function other than a non-redirecting
+   * generative constructor.
+   */
+  static const CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR =
+      const CompileTimeErrorCode('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR',
+          "The redirecting constructor cannot have a field initializer");
+
+  /**
+   * 7.2 Getters: It is a compile-time error if a class has both a getter and a
+   * method with the same name.
+   *
+   * Parameters:
+   * 0: the conflicting name of the getter and method
+   */
+  static const CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME =
+      const CompileTimeErrorCode('GETTER_AND_METHOD_WITH_SAME_NAME',
+          "'{0}' cannot be used to name a getter, there is already a method with the same name");
+
+  /**
+   * 7.10 Superinterfaces: It is a compile-time error if the implements clause
+   * of a class <i>C</i> specifies a malformed type or deferred type as a
+   * superinterface.
+   *
+   * Parameters:
+   * 0: the name of the type that cannot be extended
+   *
+   * See [EXTENDS_DEFERRED_CLASS], and [MIXIN_DEFERRED_CLASS].
+   */
+  static const CompileTimeErrorCode IMPLEMENTS_DEFERRED_CLASS =
+      const CompileTimeErrorCode('IMPLEMENTS_DEFERRED_CLASS',
+          "This class cannot implement the deferred class '{0}'");
+
+  /**
+   * 12.2 Null: It is a compile-time error for a class to attempt to extend or
+   * implement Null.
+   *
+   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend
+   * or implement int.
+   *
+   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend
+   * or implement double.
+   *
+   * 12.3 Numbers: It is a compile-time error for any type other than the types
+   * int and double to
+   * attempt to extend or implement num.
+   *
+   * 12.4 Booleans: It is a compile-time error for a class to attempt to extend
+   * or implement bool.
+   *
+   * 12.5 Strings: It is a compile-time error for a class to attempt to extend
+   * or implement String.
+   *
+   * Parameters:
+   * 0: the name of the type that cannot be implemented
+   *
+   * See [EXTENDS_DISALLOWED_CLASS].
+   */
+  static const CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS =
+      const CompileTimeErrorCode(
+          'IMPLEMENTS_DISALLOWED_CLASS', "Classes cannot implement '{0}'");
+
+  /**
+   * 7.10 Superinterfaces: It is a compile-time error if the implements clause
+   * of a class includes type dynamic.
+   */
+  static const CompileTimeErrorCode IMPLEMENTS_DYNAMIC =
+      const CompileTimeErrorCode(
+          'IMPLEMENTS_DYNAMIC', "Classes cannot implement 'dynamic'");
+
+  /**
+   * Enum proposal: It is a compile-time error to subclass, mix-in or implement
+   * an enum.
+   */
+  static const CompileTimeErrorCode IMPLEMENTS_ENUM =
+      const CompileTimeErrorCode(
+          'IMPLEMENTS_ENUM', "Classes cannot implement an enum");
+
+  /**
+   * 7.10 Superinterfaces: It is a compile-time error if the implements clause
+   * of a class <i>C</i> includes a type expression that does not denote a class
+   * available in the lexical scope of <i>C</i>.
+   *
+   * Parameters:
+   * 0: the name of the interface that was not found
+   */
+  static const CompileTimeErrorCode IMPLEMENTS_NON_CLASS =
+      const CompileTimeErrorCode(
+          'IMPLEMENTS_NON_CLASS', "Classes can only implement other classes");
+
+  /**
+   * 7.10 Superinterfaces: It is a compile-time error if a type <i>T</i> appears
+   * more than once in the implements clause of a class.
+   *
+   * Parameters:
+   * 0: the name of the class that is implemented more than once
+   */
+  static const CompileTimeErrorCode IMPLEMENTS_REPEATED =
+      const CompileTimeErrorCode(
+          'IMPLEMENTS_REPEATED', "'{0}' can only be implemented once");
+
+  /**
+   * 7.10 Superinterfaces: It is a compile-time error if the superclass of a
+   * class <i>C</i> appears in the implements clause of <i>C</i>.
+   *
+   * Parameters:
+   * 0: the name of the class that appears in both "extends" and "implements"
+   *    clauses
+   */
+  static const CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS =
+      const CompileTimeErrorCode('IMPLEMENTS_SUPER_CLASS',
+          "'{0}' cannot be used in both 'extends' and 'implements' clauses");
+
+  /**
+   * 7.6.1 Generative Constructors: Note that <b>this</b> is not in scope on the
+   * right hand side of an initializer.
+   *
+   * 12.10 This: It is a compile-time error if this appears in a top-level
+   * function or variable initializer, in a factory constructor, or in a static
+   * method or variable initializer, or in the initializer of an instance
+   * variable.
+   *
+   * Parameters:
+   * 0: the name of the type in question
+   */
+  static const CompileTimeErrorCode IMPLICIT_THIS_REFERENCE_IN_INITIALIZER =
+      const CompileTimeErrorCode('IMPLICIT_THIS_REFERENCE_IN_INITIALIZER',
+          "Only static members can be accessed in initializers");
+
+  /**
+   * SDK implementation libraries can be imported only by other SDK libraries.
+   *
+   * Parameters:
+   * 0: the uri pointing to a library
+   */
+  static const CompileTimeErrorCode IMPORT_INTERNAL_LIBRARY =
+      const CompileTimeErrorCode('IMPORT_INTERNAL_LIBRARY',
+          "The library '{0}' is internal and cannot be imported");
+
+  /**
+   * 14.1 Imports: It is a compile-time error if the specified URI of an
+   * immediate import does not refer to a library declaration.
+   *
+   * Parameters:
+   * 0: the uri pointing to a non-library declaration
+   *
+   * See [StaticWarningCode.IMPORT_OF_NON_LIBRARY].
+   */
+  static const CompileTimeErrorCode IMPORT_OF_NON_LIBRARY =
+      const CompileTimeErrorCode('IMPORT_OF_NON_LIBRARY',
+          "The imported library '{0}' must not have a part-of directive");
+
+  /**
+   * 13.9 Switch: It is a compile-time error if values of the expressions
+   * <i>e<sub>k</sub></i> are not instances of the same class <i>C</i>, for all
+   * <i>1 &lt;= k &lt;= n</i>.
+   *
+   * Parameters:
+   * 0: the expression source code that is the unexpected type
+   * 1: the name of the expected type
+   */
+  static const CompileTimeErrorCode INCONSISTENT_CASE_EXPRESSION_TYPES =
+      const CompileTimeErrorCode('INCONSISTENT_CASE_EXPRESSION_TYPES',
+          "Case expressions must have the same types, '{0}' is not a '{1}'");
+
+  /**
+   * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It
+   * is a compile-time error if <i>k</i>'s initializer list contains an
+   * initializer for a variable that is not an instance variable declared in the
+   * immediately surrounding class.
+   *
+   * Parameters:
+   * 0: the name of the initializing formal that is not an instance variable in
+   *    the immediately enclosing class
+   *
+   * See [INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD].
+   */
+  static const CompileTimeErrorCode INITIALIZER_FOR_NON_EXISTENT_FIELD =
+      const CompileTimeErrorCode('INITIALIZER_FOR_NON_EXISTENT_FIELD',
+          "'{0}' is not a variable in the enclosing class");
+
+  /**
+   * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It
+   * is a compile-time error if <i>k</i>'s initializer list contains an
+   * initializer for a variable that is not an instance variable declared in the
+   * immediately surrounding class.
+   *
+   * Parameters:
+   * 0: the name of the initializing formal that is a static variable in the
+   *    immediately enclosing class
+   *
+   * See [INITIALIZING_FORMAL_FOR_STATIC_FIELD].
+   */
+  static const CompileTimeErrorCode INITIALIZER_FOR_STATIC_FIELD =
+      const CompileTimeErrorCode('INITIALIZER_FOR_STATIC_FIELD',
+          "'{0}' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
+
+  /**
+   * 7.6.1 Generative Constructors: An initializing formal has the form
+   * <i>this.id</i>. It is a compile-time error if <i>id</i> is not the name of
+   * an instance variable of the immediately enclosing class.
+   *
+   * Parameters:
+   * 0: the name of the initializing formal that is not an instance variable in
+   *    the immediately enclosing class
+   *
+   * See [INITIALIZING_FORMAL_FOR_STATIC_FIELD], and
+   * [INITIALIZER_FOR_NON_EXISTENT_FIELD].
+   */
+  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD =
+      const CompileTimeErrorCode('INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD',
+          "'{0}' is not a variable in the enclosing class");
+
+  /**
+   * 7.6.1 Generative Constructors: An initializing formal has the form
+   * <i>this.id</i>. It is a compile-time error if <i>id</i> is not the name of
+   * an instance variable of the immediately enclosing class.
+   *
+   * Parameters:
+   * 0: the name of the initializing formal that is a static variable in the
+   *    immediately enclosing class
+   *
+   * See [INITIALIZER_FOR_STATIC_FIELD].
+   */
+  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_STATIC_FIELD =
+      const CompileTimeErrorCode('INITIALIZING_FORMAL_FOR_STATIC_FIELD',
+          "'{0}' is a static field in the enclosing class, fields initialized in a constructor cannot be static");
+
+  /**
+   * 12.30 Identifier Reference: Otherwise, e is equivalent to the property
+   * extraction <b>this</b>.<i>id</i>.
+   */
+  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_FACTORY =
+      const CompileTimeErrorCode('INSTANCE_MEMBER_ACCESS_FROM_FACTORY',
+          "Instance members cannot be accessed from a factory constructor");
+
+  /**
+   * 12.30 Identifier Reference: Otherwise, e is equivalent to the property
+   * extraction <b>this</b>.<i>id</i>.
+   */
+  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_STATIC =
+      const CompileTimeErrorCode('INSTANCE_MEMBER_ACCESS_FROM_STATIC',
+          "Instance members cannot be accessed from a static method");
+
+  /**
+   * Enum proposal: It is also a compile-time error to explicitly instantiate an
+   * enum via 'new' or 'const' or to access its private fields.
+   */
+  static const CompileTimeErrorCode INSTANTIATE_ENUM =
+      const CompileTimeErrorCode(
+          'INSTANTIATE_ENUM', "Enums cannot be instantiated");
+
+  /**
+   * 11 Metadata: Metadata consists of a series of annotations, each of which
+   * begin with the character @, followed by a constant expression that must be
+   * either a reference to a compile-time constant variable, or a call to a
+   * constant constructor.
+   */
+  static const CompileTimeErrorCode INVALID_ANNOTATION = const CompileTimeErrorCode(
+      'INVALID_ANNOTATION',
+      "Annotation can be only constant variable or constant constructor invocation");
+
+  /**
+   * 11 Metadata: Metadata consists of a series of annotations, each of which
+   * begin with the character @, followed by a constant expression that must be
+   * either a reference to a compile-time constant variable, or a call to a
+   * constant constructor.
+   *
+   * 12.1 Constants: A qualified reference to a static constant variable that is
+   * not qualified by a deferred prefix.
+   */
+  static const CompileTimeErrorCode INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY =
+      const CompileTimeErrorCode('INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY',
+          "Constant values from a deferred library cannot be used as annotations");
+
+  /**
+   * 15.31 Identifier Reference: It is a compile-time error if any of the
+   * identifiers async, await or yield is used as an identifier in a function
+   * body marked with either async, async* or sync*.
+   */
+  static const CompileTimeErrorCode INVALID_IDENTIFIER_IN_ASYNC =
+      const CompileTimeErrorCode('INVALID_IDENTIFIER_IN_ASYNC',
+          "The identifier '{0}' cannot be used in a function marked with async, async* or sync*");
+
+  /**
+   * 9. Functions: It is a compile-time error if an async, async* or sync*
+   * modifier is attached to the body of a setter or constructor.
+   */
+  static const CompileTimeErrorCode INVALID_MODIFIER_ON_CONSTRUCTOR =
+      const CompileTimeErrorCode('INVALID_MODIFIER_ON_CONSTRUCTOR',
+          "The modifier '{0}' cannot be applied to the body of a constructor");
+
+  /**
+   * 9. Functions: It is a compile-time error if an async, async* or sync*
+   * modifier is attached to the body of a setter or constructor.
+   */
+  static const CompileTimeErrorCode INVALID_MODIFIER_ON_SETTER =
+      const CompileTimeErrorCode('INVALID_MODIFIER_ON_SETTER',
+          "The modifier '{0}' cannot be applied to the body of a setter");
+
+  /**
+   * TODO(brianwilkerson) Remove this when we have decided on how to report
+   * errors in compile-time constants. Until then, this acts as a placeholder
+   * for more informative errors.
+   *
+   * See TODOs in ConstantVisitor
+   */
+  static const CompileTimeErrorCode INVALID_CONSTANT =
+      const CompileTimeErrorCode('INVALID_CONSTANT', "Invalid constant value");
+
+  /**
+   * 7.6 Constructors: It is a compile-time error if the name of a constructor
+   * is not a constructor name.
+   */
+  static const CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME =
+      const CompileTimeErrorCode(
+          'INVALID_CONSTRUCTOR_NAME', "Invalid constructor name");
+
+  /**
+   * 7.6.2 Factories: It is a compile-time error if <i>M</i> is not the name of
+   * the immediately enclosing class.
+   */
+  static const CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS =
+      const CompileTimeErrorCode('INVALID_FACTORY_NAME_NOT_A_CLASS',
+          "The name of the immediately enclosing class expected");
+
+  /**
+   * 12.10 This: It is a compile-time error if this appears in a top-level
+   * function or variable initializer, in a factory constructor, or in a static
+   * method or variable initializer, or in the initializer of an instance
+   * variable.
+   */
+  static const CompileTimeErrorCode INVALID_REFERENCE_TO_THIS =
+      const CompileTimeErrorCode('INVALID_REFERENCE_TO_THIS',
+          "Invalid reference to 'this' expression");
+
+  /**
+   * 12.6 Lists: It is a compile time error if the type argument of a constant
+   * list literal includes a type parameter.
+   *
+   * Parameters:
+   * 0: the name of the type parameter
+   */
+  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST =
+      const CompileTimeErrorCode('INVALID_TYPE_ARGUMENT_IN_CONST_LIST',
+          "Constant list literals cannot include a type parameter as a type argument, such as '{0}'");
+
+  /**
+   * 12.7 Maps: It is a compile time error if the type arguments of a constant
+   * map literal include a type parameter.
+   *
+   * Parameters:
+   * 0: the name of the type parameter
+   */
+  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP =
+      const CompileTimeErrorCode('INVALID_TYPE_ARGUMENT_IN_CONST_MAP',
+          "Constant map literals cannot include a type parameter as a type argument, such as '{0}'");
+
+  /**
+   * 14.2 Exports: It is a compile-time error if the compilation unit found at
+   * the specified URI is not a library declaration.
+   *
+   * 14.1 Imports: It is a compile-time error if the compilation unit found at
+   * the specified URI is not a library declaration.
+   *
+   * 14.3 Parts: It is a compile time error if the contents of the URI are not a
+   * valid part declaration.
+   *
+   * Parameters:
+   * 0: the URI that is invalid
+   *
+   * See [URI_DOES_NOT_EXIST].
+   */
+  static const CompileTimeErrorCode INVALID_URI =
+      const CompileTimeErrorCode('INVALID_URI', "Invalid URI syntax: '{0}'");
+
+  /**
+   * 13.13 Break: It is a compile-time error if no such statement
+   * <i>s<sub>E</sub></i> exists within the innermost function in which
+   * <i>s<sub>b</sub></i> occurs.
+   *
+   * 13.14 Continue: It is a compile-time error if no such statement or case
+   * clause <i>s<sub>E</sub></i> exists within the innermost function in which
+   * <i>s<sub>c</sub></i> occurs.
+   *
+   * Parameters:
+   * 0: the name of the unresolvable label
+   */
+  static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE =
+      const CompileTimeErrorCode('LABEL_IN_OUTER_SCOPE',
+          "Cannot reference label '{0}' declared in an outer method");
+
+  /**
+   * 13.13 Break: It is a compile-time error if no such statement
+   * <i>s<sub>E</sub></i> exists within the innermost function in which
+   * <i>s<sub>b</sub></i> occurs.
+   *
+   * 13.14 Continue: It is a compile-time error if no such statement or case
+   * clause <i>s<sub>E</sub></i> exists within the innermost function in which
+   * <i>s<sub>c</sub></i> occurs.
+   *
+   * Parameters:
+   * 0: the name of the unresolvable label
+   */
+  static const CompileTimeErrorCode LABEL_UNDEFINED =
+      const CompileTimeErrorCode(
+          'LABEL_UNDEFINED', "Cannot reference undefined label '{0}'");
+
+  /**
+   * 7 Classes: It is a compile time error if a class <i>C</i> declares a member
+   * with the same name as <i>C</i>.
+   */
+  static const CompileTimeErrorCode MEMBER_WITH_CLASS_NAME =
+      const CompileTimeErrorCode('MEMBER_WITH_CLASS_NAME',
+          "Class members cannot have the same name as the enclosing class");
+
+  /**
+   * 7.2 Getters: It is a compile-time error if a class has both a getter and a
+   * method with the same name.
+   *
+   * Parameters:
+   * 0: the conflicting name of the getter and method
+   */
+  static const CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME =
+      const CompileTimeErrorCode('METHOD_AND_GETTER_WITH_SAME_NAME',
+          "'{0}' cannot be used to name a method, there is already a getter with the same name");
+
+  /**
+   * 12.1 Constants: A constant expression is ... a constant list literal.
+   */
+  static const CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL =
+      const CompileTimeErrorCode('MISSING_CONST_IN_LIST_LITERAL',
+          "List literals must be prefixed with 'const' when used as a constant expression");
+
+  /**
+   * 12.1 Constants: A constant expression is ... a constant map literal.
+   */
+  static const CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL =
+      const CompileTimeErrorCode('MISSING_CONST_IN_MAP_LITERAL',
+          "Map literals must be prefixed with 'const' when used as a constant expression");
+
+  /**
+   * Enum proposal: It is a static warning if all of the following conditions
+   * hold:
+   * * The switch statement does not have a 'default' clause.
+   * * The static type of <i>e</i> is an enumerated typed with elements
+   *   <i>id<sub>1</sub></i>, &hellip;, <i>id<sub>n</sub></i>.
+   * * The sets {<i>e<sub>1</sub></i>, &hellip;, <i>e<sub>k</sub></i>} and
+   *   {<i>id<sub>1</sub></i>, &hellip;, <i>id<sub>n</sub></i>} are not the
+   *   same.
+   *
+   * Parameters:
+   * 0: the name of the constant that is missing
+   */
+  static const CompileTimeErrorCode MISSING_ENUM_CONSTANT_IN_SWITCH =
+      const CompileTimeErrorCode('MISSING_ENUM_CONSTANT_IN_SWITCH',
+          "Missing case clause for '{0}'",
+          "Add a case clause for the missing constant or add a default clause.");
+
+  /**
+   * 9 Mixins: It is a compile-time error if a declared or derived mixin
+   * explicitly declares a constructor.
+   *
+   * Parameters:
+   * 0: the name of the mixin that is invalid
+   */
+  static const CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR =
+      const CompileTimeErrorCode('MIXIN_DECLARES_CONSTRUCTOR',
+          "The class '{0}' cannot be used as a mixin because it declares a constructor");
+
+  /**
+   * 9.1 Mixin Application: It is a compile-time error if the with clause of a
+   * mixin application <i>C</i> includes a deferred type expression.
+   *
+   * Parameters:
+   * 0: the name of the type that cannot be extended
+   *
+   * See [EXTENDS_DEFERRED_CLASS], and [IMPLEMENTS_DEFERRED_CLASS].
+   */
+  static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS =
+      const CompileTimeErrorCode('MIXIN_DEFERRED_CLASS',
+          "This class cannot mixin the deferred class '{0}'");
+
+  /**
+   * Not yet in the spec, but consistent with VM behavior.  It is a
+   * compile-time error if all of the constructors of a mixin's base class have
+   * at least one optional parameter (since only constructors that lack
+   * optional parameters can be forwarded to the mixin).  See
+   * https://code.google.com/p/dart/issues/detail?id=15101#c4
+   */
+  static const CompileTimeErrorCode MIXIN_HAS_NO_CONSTRUCTORS =
+      const CompileTimeErrorCode('MIXIN_HAS_NO_CONSTRUCTORS',
+          "This mixin application is invalid because all of the constructors "
+          "in the base class '{0}' have optional parameters.");
+
+  /**
+   * 9 Mixins: It is a compile-time error if a mixin is derived from a class
+   * whose superclass is not Object.
+   *
+   * Parameters:
+   * 0: the name of the mixin that is invalid
+   */
+  static const CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT =
+      const CompileTimeErrorCode('MIXIN_INHERITS_FROM_NOT_OBJECT',
+          "The class '{0}' cannot be used as a mixin because it extends a class other than Object");
+
+  /**
+   * 12.2 Null: It is a compile-time error for a class to attempt to extend or
+   * implement Null.
+   *
+   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend
+   * or implement int.
+   *
+   * 12.3 Numbers: It is a compile-time error for a class to attempt to extend
+   * or implement double.
+   *
+   * 12.3 Numbers: It is a compile-time error for any type other than the types
+   * int and double to attempt to extend or implement num.
+   *
+   * 12.4 Booleans: It is a compile-time error for a class to attempt to extend
+   * or implement bool.
+   *
+   * 12.5 Strings: It is a compile-time error for a class to attempt to extend
+   * or implement String.
+   *
+   * Parameters:
+   * 0: the name of the type that cannot be extended
+   *
+   * See [IMPLEMENTS_DISALLOWED_CLASS].
+   */
+  static const CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS =
+      const CompileTimeErrorCode(
+          'MIXIN_OF_DISALLOWED_CLASS', "Classes cannot mixin '{0}'");
+
+  /**
+   * Enum proposal: It is a compile-time error to subclass, mix-in or implement
+   * an enum.
+   */
+  static const CompileTimeErrorCode MIXIN_OF_ENUM = const CompileTimeErrorCode(
+      'MIXIN_OF_ENUM', "Classes cannot mixin an enum");
+
+  /**
+   * 9.1 Mixin Application: It is a compile-time error if <i>M</i> does not
+   * denote a class or mixin available in the immediately enclosing scope.
+   */
+  static const CompileTimeErrorCode MIXIN_OF_NON_CLASS =
+      const CompileTimeErrorCode(
+          'MIXIN_OF_NON_CLASS', "Classes can only mixin other classes");
+
+  /**
+   * 9 Mixins: It is a compile-time error if a declared or derived mixin refers
+   * to super.
+   */
+  static const CompileTimeErrorCode MIXIN_REFERENCES_SUPER =
+      const CompileTimeErrorCode('MIXIN_REFERENCES_SUPER',
+          "The class '{0}' cannot be used as a mixin because it references 'super'");
+
+  /**
+   * 9.1 Mixin Application: It is a compile-time error if <i>S</i> does not
+   * denote a class available in the immediately enclosing scope.
+   */
+  static const CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS =
+      const CompileTimeErrorCode('MIXIN_WITH_NON_CLASS_SUPERCLASS',
+          "Mixin can only be applied to class");
+
+  /**
+   * 7.6.1 Generative Constructors: A generative constructor may be redirecting,
+   * in which case its only action is to invoke another generative constructor.
+   */
+  static const CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS =
+      const CompileTimeErrorCode('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS',
+          "Constructor may have at most one 'this' redirection");
+
+  /**
+   * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor.
+   * Then <i>k</i> may include at most one superinitializer in its initializer
+   * list or a compile time error occurs.
+   */
+  static const CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS =
+      const CompileTimeErrorCode('MULTIPLE_SUPER_INITIALIZERS',
+          "Constructor may have at most one 'super' initializer");
+
+  /**
+   * 11 Metadata: Metadata consists of a series of annotations, each of which
+   * begin with the character @, followed by a constant expression that must be
+   * either a reference to a compile-time constant variable, or a call to a
+   * constant constructor.
+   */
+  static const CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS =
+      const CompileTimeErrorCode('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS',
+          "Annotation creation must have arguments");
+
+  /**
+   * 7.6.1 Generative Constructors: If no superinitializer is provided, an
+   * implicit superinitializer of the form <b>super</b>() is added at the end of
+   * <i>k</i>'s initializer list, unless the enclosing class is class
+   * <i>Object</i>.
+   *
+   * 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i>
+   * does not declare a generative constructor named <i>S</i> (respectively
+   * <i>S.id</i>)
+   */
+  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT =
+      const CompileTimeErrorCode('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT',
+          "The class '{0}' does not have a default constructor");
+
+  /**
+   * 7.6 Constructors: Iff no constructor is specified for a class <i>C</i>, it
+   * implicitly has a default constructor C() : <b>super<b>() {}, unless
+   * <i>C</i> is class <i>Object</i>.
+   *
+   * 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i>
+   * does not declare a generative constructor named <i>S</i> (respectively
+   * <i>S.id</i>)
+   */
+  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT =
+      const CompileTimeErrorCode('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT',
+          "The class '{0}' does not have a default constructor");
+
+  /**
+   * 13.2 Expression Statements: It is a compile-time error if a non-constant
+   * map literal that has no explicit type arguments appears in a place where a
+   * statement is expected.
+   */
+  static const CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT =
+      const CompileTimeErrorCode('NON_CONST_MAP_AS_EXPRESSION_STATEMENT',
+          "A non-constant map literal without type arguments cannot be used as an expression statement");
+
+  /**
+   * 13.9 Switch: Given a switch statement of the form <i>switch (e) {
+   * label<sub>11</sub> &hellip; label<sub>1j1</sub> case e<sub>1</sub>:
+   * s<sub>1</sub> &hellip; label<sub>n1</sub> &hellip; label<sub>njn</sub> case
+   * e<sub>n</sub>: s<sub>n</sub> default: s<sub>n+1</sub>}</i> or the form
+   * <i>switch (e) { label<sub>11</sub> &hellip; label<sub>1j1</sub> case
+   * e<sub>1</sub>: s<sub>1</sub> &hellip; label<sub>n1</sub> &hellip;
+   * label<sub>njn</sub> case e<sub>n</sub>: s<sub>n</sub>}</i>, it is a
+   * compile-time error if the expressions <i>e<sub>k</sub></i> are not
+   * compile-time constants, for all <i>1 &lt;= k &lt;= n</i>.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION =
+      const CompileTimeErrorCode(
+          'NON_CONSTANT_CASE_EXPRESSION', "Case expressions must be constant");
+
+  /**
+   * 13.9 Switch: Given a switch statement of the form <i>switch (e) {
+   * label<sub>11</sub> &hellip; label<sub>1j1</sub> case e<sub>1</sub>:
+   * s<sub>1</sub> &hellip; label<sub>n1</sub> &hellip; label<sub>njn</sub> case
+   * e<sub>n</sub>: s<sub>n</sub> default: s<sub>n+1</sub>}</i> or the form
+   * <i>switch (e) { label<sub>11</sub> &hellip; label<sub>1j1</sub> case
+   * e<sub>1</sub>: s<sub>1</sub> &hellip; label<sub>n1</sub> &hellip;
+   * label<sub>njn</sub> case e<sub>n</sub>: s<sub>n</sub>}</i>, it is a
+   * compile-time error if the expressions <i>e<sub>k</sub></i> are not
+   * compile-time constants, for all <i>1 &lt;= k &lt;= n</i>.
+   *
+   * 12.1 Constants: A qualified reference to a static constant variable that is
+   * not qualified by a deferred prefix.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY =
+      const CompileTimeErrorCode(
+          'NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY',
+          "Constant values from a deferred library cannot be used as a case expression");
+
+  /**
+   * 6.2.2 Optional Formals: It is a compile-time error if the default value of
+   * an optional parameter is not a compile-time constant.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE =
+      const CompileTimeErrorCode('NON_CONSTANT_DEFAULT_VALUE',
+          "Default values of an optional parameter must be constant");
+
+  /**
+   * 6.2.2 Optional Formals: It is a compile-time error if the default value of
+   * an optional parameter is not a compile-time constant.
+   *
+   * 12.1 Constants: A qualified reference to a static constant variable that is
+   * not qualified by a deferred prefix.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY =
+      const CompileTimeErrorCode(
+          'NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY',
+          "Constant values from a deferred library cannot be used as a default parameter value");
+
+  /**
+   * 12.6 Lists: It is a compile time error if an element of a constant list
+   * literal is not a compile-time constant.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT =
+      const CompileTimeErrorCode('NON_CONSTANT_LIST_ELEMENT',
+          "'const' lists must have all constant values");
+
+  /**
+   * 12.6 Lists: It is a compile time error if an element of a constant list
+   * literal is not a compile-time constant.
+   *
+   * 12.1 Constants: A qualified reference to a static constant variable that is
+   * not qualified by a deferred prefix.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY =
+      const CompileTimeErrorCode(
+          'NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY',
+          "Constant values from a deferred library cannot be used as values in a 'const' list");
+
+  /**
+   * 12.7 Maps: It is a compile time error if either a key or a value of an
+   * entry in a constant map literal is not a compile-time constant.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY =
+      const CompileTimeErrorCode(
+          'NON_CONSTANT_MAP_KEY', "The keys in a map must be constant");
+
+  /**
+   * 12.7 Maps: It is a compile time error if either a key or a value of an
+   * entry in a constant map literal is not a compile-time constant.
+   *
+   * 12.1 Constants: A qualified reference to a static constant variable that is
+   * not qualified by a deferred prefix.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY =
+      const CompileTimeErrorCode('NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY',
+          "Constant values from a deferred library cannot be used as keys in a map");
+
+  /**
+   * 12.7 Maps: It is a compile time error if either a key or a value of an
+   * entry in a constant map literal is not a compile-time constant.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE =
+      const CompileTimeErrorCode('NON_CONSTANT_MAP_VALUE',
+          "The values in a 'const' map must be constant");
+
+  /**
+   * 12.7 Maps: It is a compile time error if either a key or a value of an
+   * entry in a constant map literal is not a compile-time constant.
+   *
+   * 12.1 Constants: A qualified reference to a static constant variable that is
+   * not qualified by a deferred prefix.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY =
+      const CompileTimeErrorCode('NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY',
+          "Constant values from a deferred library cannot be used as values in a 'const' map");
+
+  /**
+   * 11 Metadata: Metadata consists of a series of annotations, each of which
+   * begin with the character @, followed by a constant expression that must be
+   * either a reference to a compile-time constant variable, or a call to a
+   * constant constructor.
+   *
+   * "From deferred library" case is covered by
+   * [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY].
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR =
+      const CompileTimeErrorCode('NON_CONSTANT_ANNOTATION_CONSTRUCTOR',
+          "Annotation creation can use only 'const' constructor");
+
+  /**
+   * 7.6.3 Constant Constructors: Any expression that appears within the
+   * initializer list of a constant constructor must be a potentially constant
+   * expression, or a compile-time error occurs.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER =
+      const CompileTimeErrorCode('NON_CONSTANT_VALUE_IN_INITIALIZER',
+          "Initializer expressions in constant constructors must be constants");
+
+  /**
+   * 7.6.3 Constant Constructors: Any expression that appears within the
+   * initializer list of a constant constructor must be a potentially constant
+   * expression, or a compile-time error occurs.
+   *
+   * 12.1 Constants: A qualified reference to a static constant variable that is
+   * not qualified by a deferred prefix.
+   */
+  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY =
+      const CompileTimeErrorCode(
+          'NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY',
+          "Constant values from a deferred library cannot be used as constant initializers");
+
+  /**
+   * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i>
+   * or if <i>m > n</i>.
+   *
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant
+   * object results in an uncaught exception being thrown.
+   *
+   * Parameters:
+   * 0: the expected number of required arguments
+   * 1: the actual number of positional arguments given
+   */
+  static const CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS =
+      const CompileTimeErrorCode('NOT_ENOUGH_REQUIRED_ARGUMENTS',
+          "{0} required argument(s) expected, but {1} found");
+
+  /**
+   * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the
+   * superinitializer appears and let <i>S</i> be the superclass of <i>C</i>.
+   * Let <i>k</i> be a generative constructor. It is a compile-time error if
+   * class <i>S</i> does not declare a generative constructor named <i>S</i>
+   * (respectively <i>S.id</i>)
+   */
+  static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR =
+      const CompileTimeErrorCode('NON_GENERATIVE_CONSTRUCTOR',
+          "The generative constructor '{0}' expected, but factory found");
+
+  /**
+   * 7.9 Superclasses: It is a compile-time error to specify an extends clause
+   * for class Object.
+   */
+  static const CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS =
+      const CompileTimeErrorCode('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', "");
+
+  /**
+   * 7.1.1 Operators: It is a compile-time error to declare an optional
+   * parameter in an operator.
+   */
+  static const CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR =
+      const CompileTimeErrorCode('OPTIONAL_PARAMETER_IN_OPERATOR',
+          "Optional parameters are not allowed when defining an operator");
+
+  /**
+   * 14.3 Parts: It is a compile time error if the contents of the URI are not a
+   * valid part declaration.
+   *
+   * Parameters:
+   * 0: the uri pointing to a non-library declaration
+   */
+  static const CompileTimeErrorCode PART_OF_NON_PART =
+      const CompileTimeErrorCode('PART_OF_NON_PART',
+          "The included part '{0}' must have a part-of directive");
+
+  /**
+   * 14.1 Imports: It is a compile-time error if the current library declares a
+   * top-level member named <i>p</i>.
+   */
+  static const CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER =
+      const CompileTimeErrorCode('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER',
+          "The name '{0}' is already used as an import prefix and cannot be used to name a top-level element");
+
+  /**
+   * 16.32 Identifier Reference: If d is a prefix p, a compile-time error
+   * occurs unless the token immediately following d is '.'.
+   */
+  static const CompileTimeErrorCode PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT =
+      const CompileTimeErrorCode('PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT',
+          "The name '{0}' refers to an import prefix, so it must be followed by '.'");
+
+  /**
+   * 6.2.2 Optional Formals: It is a compile-time error if the name of a named
+   * optional parameter begins with an '_' character.
+   */
+  static const CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER =
+      const CompileTimeErrorCode('PRIVATE_OPTIONAL_PARAMETER',
+          "Named optional parameters cannot start with an underscore");
+
+  /**
+   * 12.1 Constants: It is a compile-time error if the value of a compile-time
+   * constant expression depends on itself.
+   */
+  static const CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT =
+      const CompileTimeErrorCode('RECURSIVE_COMPILE_TIME_CONSTANT',
+          "Compile-time constant expression depends on itself");
+
+  /**
+   * 7.6.1 Generative Constructors: A generative constructor may be redirecting,
+   * in which case its only action is to invoke another generative constructor.
+   *
+   * TODO(scheglov) review this later, there are no explicit "it is a
+   * compile-time error" in specification. But it was added to the co19 and
+   * there is same error for factories.
+   *
+   * https://code.google.com/p/dart/issues/detail?id=954
+   */
+  static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT =
+      const CompileTimeErrorCode('RECURSIVE_CONSTRUCTOR_REDIRECT',
+          "Cycle in redirecting generative constructors");
+
+  /**
+   * 7.6.2 Factories: It is a compile-time error if a redirecting factory
+   * constructor redirects to itself, either directly or indirectly via a
+   * sequence of redirections.
+   */
+  static const CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT =
+      const CompileTimeErrorCode('RECURSIVE_FACTORY_REDIRECT',
+          "Cycle in redirecting factory constructors");
+
+  /**
+   * 7.10 Superinterfaces: It is a compile-time error if the interface of a
+   * class <i>C</i> is a superinterface of itself.
+   *
+   * 8.1 Superinterfaces: It is a compile-time error if an interface is a
+   * superinterface of itself.
+   *
+   * 7.9 Superclasses: It is a compile-time error if a class <i>C</i> is a
+   * superclass of itself.
+   *
+   * Parameters:
+   * 0: the name of the class that implements itself recursively
+   * 1: a string representation of the implements loop
+   */
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE =
+      const CompileTimeErrorCode('RECURSIVE_INTERFACE_INHERITANCE',
+          "'{0}' cannot be a superinterface of itself: {1}");
+
+  /**
+   * 7.10 Superinterfaces: It is a compile-time error if the interface of a
+   * class <i>C</i> is a superinterface of itself.
+   *
+   * 8.1 Superinterfaces: It is a compile-time error if an interface is a
+   * superinterface of itself.
+   *
+   * 7.9 Superclasses: It is a compile-time error if a class <i>C</i> is a
+   * superclass of itself.
+   *
+   * Parameters:
+   * 0: the name of the class that implements itself recursively
+   */
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS =
+      const CompileTimeErrorCode(
+          'RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS',
+          "'{0}' cannot extend itself");
+
+  /**
+   * 7.10 Superinterfaces: It is a compile-time error if the interface of a
+   * class <i>C</i> is a superinterface of itself.
+   *
+   * 8.1 Superinterfaces: It is a compile-time error if an interface is a
+   * superinterface of itself.
+   *
+   * 7.9 Superclasses: It is a compile-time error if a class <i>C</i> is a
+   * superclass of itself.
+   *
+   * Parameters:
+   * 0: the name of the class that implements itself recursively
+   */
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS =
+      const CompileTimeErrorCode(
+          'RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS',
+          "'{0}' cannot implement itself");
+
+  /**
+   * 7.10 Superinterfaces: It is a compile-time error if the interface of a
+   * class <i>C</i> is a superinterface of itself.
+   *
+   * 8.1 Superinterfaces: It is a compile-time error if an interface is a
+   * superinterface of itself.
+   *
+   * 7.9 Superclasses: It is a compile-time error if a class <i>C</i> is a
+   * superclass of itself.
+   *
+   * Parameters:
+   * 0: the name of the class that implements itself recursively
+   */
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH =
+      const CompileTimeErrorCode(
+          'RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH',
+          "'{0}' cannot use itself as a mixin");
+
+  /**
+   * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with
+   * the const modifier but <i>k'</i> is not a constant constructor.
+   */
+  static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR =
+      const CompileTimeErrorCode('REDIRECT_TO_MISSING_CONSTRUCTOR',
+          "The constructor '{0}' could not be found in '{1}'");
+
+  /**
+   * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with
+   * the const modifier but <i>k'</i> is not a constant constructor.
+   */
+  static const CompileTimeErrorCode REDIRECT_TO_NON_CLASS =
+      const CompileTimeErrorCode('REDIRECT_TO_NON_CLASS',
+          "The name '{0}' is not a type and cannot be used in a redirected constructor");
+
+  /**
+   * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with
+   * the const modifier but <i>k'</i> is not a constant constructor.
+   */
+  static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR =
+      const CompileTimeErrorCode('REDIRECT_TO_NON_CONST_CONSTRUCTOR',
+          "Constant factory constructor cannot delegate to a non-constant constructor");
+
+  /**
+   * 7.6.1 Generative constructors: A generative constructor may be
+   * <i>redirecting</i>, in which case its only action is to invoke another
+   * generative constructor.
+   */
+  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR =
+      const CompileTimeErrorCode('REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR',
+          "The constructor '{0}' could not be found in '{1}'");
+
+  /**
+   * 7.6.1 Generative constructors: A generative constructor may be
+   * <i>redirecting</i>, in which case its only action is to invoke another
+   * generative constructor.
+   */
+  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR =
+      const CompileTimeErrorCode(
+          'REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR',
+          "Generative constructor cannot redirect to a factory constructor");
+
+  /**
+   * 5 Variables: A local variable may only be referenced at a source code
+   * location that is after its initializer, if any, is complete, or a
+   * compile-time error occurs.
+   */
+  static const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION =
+      const CompileTimeErrorCode('REFERENCED_BEFORE_DECLARATION',
+          "Local variables cannot be referenced before they are declared");
+
+  /**
+   * 12.8.1 Rethrow: It is a compile-time error if an expression of the form
+   * <i>rethrow;</i> is not enclosed within a on-catch clause.
+   */
+  static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH =
+      const CompileTimeErrorCode(
+          'RETHROW_OUTSIDE_CATCH', "rethrow must be inside of a catch clause");
+
+  /**
+   * 13.12 Return: It is a compile-time error if a return statement of the form
+   * <i>return e;</i> appears in a generative constructor.
+   */
+  static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR =
+      const CompileTimeErrorCode('RETURN_IN_GENERATIVE_CONSTRUCTOR',
+          "Constructors cannot return a value");
+
+  /**
+   * 13.12 Return: It is a compile-time error if a return statement of the form
+   * <i>return e;</i> appears in a generator function.
+   */
+  static const CompileTimeErrorCode RETURN_IN_GENERATOR =
+      const CompileTimeErrorCode('RETURN_IN_GENERATOR',
+          "Cannot return a value from a generator function (one marked with either 'async*' or 'sync*')");
+
+  /**
+   * 14.1 Imports: It is a compile-time error if a prefix used in a deferred
+   * import is used in another import clause.
+   */
+  static const CompileTimeErrorCode SHARED_DEFERRED_PREFIX =
+      const CompileTimeErrorCode('SHARED_DEFERRED_PREFIX',
+          "The prefix of a deferred import cannot be used in other import directives");
+
+  /**
+   * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
+   * <i>super.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
+   * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. It is a
+   * compile-time error if a super method invocation occurs in a top-level
+   * function or variable initializer, in an instance variable initializer or
+   * initializer list, in class Object, in a factory constructor, or in a static
+   * method or variable initializer.
+   */
+  static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT =
+      const CompileTimeErrorCode(
+          'SUPER_IN_INVALID_CONTEXT', "Invalid context for 'super' invocation");
+
+  /**
+   * 7.6.1 Generative Constructors: A generative constructor may be redirecting,
+   * in which case its only action is to invoke another generative constructor.
+   */
+  static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR =
+      const CompileTimeErrorCode('SUPER_IN_REDIRECTING_CONSTRUCTOR',
+          "The redirecting constructor cannot have a 'super' initializer");
+
+  /**
+   * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It
+   * is a compile-time error if a generative constructor of class Object
+   * includes a superinitializer.
+   */
+  static const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT =
+      const CompileTimeErrorCode('SUPER_INITIALIZER_IN_OBJECT', "");
+
+  /**
+   * 12.11 Instance Creation: It is a static type warning if any of the type
+   * arguments to a constructor of a generic type <i>G</i> invoked by a new
+   * expression or a constant object expression are not subtypes of the bounds
+   * of the corresponding formal type parameters of <i>G</i>.
+   *
+   * 12.11.1 New: If T is malformed a dynamic error occurs. In checked mode, if
+   * T is mal-bounded a dynamic error occurs.
+   *
+   * 12.1 Constants: It is a compile-time error if evaluation of a compile-time
+   * constant would raise an exception.
+   *
+   * Parameters:
+   * 0: the name of the type used in the instance creation that should be
+   *    limited by the bound as specified in the class declaration
+   * 1: the name of the bounding type
+   *
+   * See [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS].
+   */
+  static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS =
+      const CompileTimeErrorCode(
+          'TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', "'{0}' does not extend '{1}'");
+
+  /**
+   * 15.3.1 Typedef: Any self reference, either directly, or recursively via
+   * another typedef, is a compile time error.
+   */
+  static const CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF =
+      const CompileTimeErrorCode('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF',
+          "Type alias cannot reference itself directly or recursively via another typedef");
+
+  /**
+   * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class
+   * accessible in the current scope, optionally followed by type arguments.
+   */
+  static const CompileTimeErrorCode UNDEFINED_CLASS =
+      const CompileTimeErrorCode('UNDEFINED_CLASS', "Undefined class '{0}'");
+
+  /**
+   * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the
+   * superinitializer appears and let <i>S</i> be the superclass of <i>C</i>.
+   * Let <i>k</i> be a generative constructor. It is a compile-time error if
+   * class <i>S</i> does not declare a generative constructor named <i>S</i>
+   * (respectively <i>S.id</i>)
+   */
+  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER =
+      const CompileTimeErrorCode('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER',
+          "The class '{0}' does not have a generative constructor '{1}'");
+
+  /**
+   * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the
+   * superinitializer appears and let <i>S</i> be the superclass of <i>C</i>.
+   * Let <i>k</i> be a generative constructor. It is a compile-time error if
+   * class <i>S</i> does not declare a generative constructor named <i>S</i>
+   * (respectively <i>S.id</i>)
+   */
+  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT =
+      const CompileTimeErrorCode('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT',
+          "The class '{0}' does not have a default generative constructor");
+
+  /**
+   * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>,
+   * <i>1<=i<=l</i>, must have a corresponding named parameter in the set
+   * {<i>p<sub>n+1</sub></i> ... <i>p<sub>n+k</sub></i>} or a static warning
+   * occurs.
+   *
+   * 12.11.2 Const: It is a compile-time error if evaluation of a constant
+   * object results in an uncaught exception being thrown.
+   *
+   * Parameters:
+   * 0: the name of the requested named parameter
+   */
+  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER =
+      const CompileTimeErrorCode('UNDEFINED_NAMED_PARAMETER',
+          "The named parameter '{0}' is not defined");
+
+  /**
+   * 14.2 Exports: It is a compile-time error if the compilation unit found at
+   * the specified URI is not a library declaration.
+   *
+   * 14.1 Imports: It is a compile-time error if the compilation unit found at
+   * the specified URI is not a library declaration.
+   *
+   * 14.3 Parts: It is a compile time error if the contents of the URI are not a
+   * valid part declaration.
+   *
+   * Parameters:
+   * 0: the URI pointing to a non-existent file
+   *
+   * See [INVALID_URI].
+   */
+  static const CompileTimeErrorCode URI_DOES_NOT_EXIST =
+      const CompileTimeErrorCode(
+          'URI_DOES_NOT_EXIST', "Target of URI does not exist: '{0}'");
+
+  /**
+   * 14.1 Imports: It is a compile-time error if <i>x</i> is not a compile-time
+   * constant, or if <i>x</i> involves string interpolation.
+   *
+   * 14.3 Parts: It is a compile-time error if <i>s</i> is not a compile-time
+   * constant, or if <i>s</i> involves string interpolation.
+   *
+   * 14.5 URIs: It is a compile-time error if the string literal <i>x</i> that
+   * describes a URI is not a compile-time constant, or if <i>x</i> involves
+   * string interpolation.
+   */
+  static const CompileTimeErrorCode URI_WITH_INTERPOLATION =
+      const CompileTimeErrorCode(
+          'URI_WITH_INTERPOLATION', "URIs cannot use string interpolation");
+
+  /**
+   * 7.1.1 Operators: It is a compile-time error if the arity of the
+   * user-declared operator []= is not 2. It is a compile time error if the
+   * arity of a user-declared operator with one of the names: &lt;, &gt;, &lt;=,
+   * &gt;=, ==, +, /, ~/, *, %, |, ^, &, &lt;&lt;, &gt;&gt;, [] is not 1. It is
+   * a compile time error if the arity of the user-declared operator - is not 0
+   * or 1. It is a compile time error if the arity of the user-declared operator
+   * ~ is not 0.
+   *
+   * Parameters:
+   * 0: the name of the declared operator
+   * 1: the number of parameters expected
+   * 2: the number of parameters found in the operator declaration
+   */
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR =
+      const CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR',
+          "Operator '{0}' should declare exactly {1} parameter(s), but {2} found");
+
+  /**
+   * 7.1.1 Operators: It is a compile time error if the arity of the
+   * user-declared operator - is not 0 or 1.
+   *
+   * Parameters:
+   * 0: the number of parameters found in the operator declaration
+   */
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS =
+      const CompileTimeErrorCode(
+          'WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS',
+          "Operator '-' should declare 0 or 1 parameter, but {0} found");
+
+  /**
+   * 7.3 Setters: It is a compile-time error if a setter's formal parameter list
+   * does not include exactly one required formal parameter <i>p</i>.
+   */
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER =
+      const CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER',
+          "Setters should declare exactly one required parameter");
+
+  /**
+   * ?? Yield: It is a compile-time error if a yield statement appears in a
+   * function that is not a generator function.
+   */
+  static const CompileTimeErrorCode YIELD_EACH_IN_NON_GENERATOR =
+      const CompileTimeErrorCode('YIELD_EACH_IN_NON_GENERATOR',
+          "Yield-each statements must be in a generator function (one marked with either 'async*' or 'sync*')");
+
+  /**
+   * ?? Yield: It is a compile-time error if a yield statement appears in a
+   * function that is not a generator function.
+   */
+  static const CompileTimeErrorCode YIELD_IN_NON_GENERATOR =
+      const CompileTimeErrorCode('YIELD_IN_NON_GENERATOR',
+          "Yield statements must be in a generator function (one marked with either 'async*' or 'sync*')");
+
+  /**
+   * Initialize a newly created error code to have the given [name]. The message
+   * associated with the error will be created from the given [message]
+   * template. The correction associated with the error will be created from the
+   * given [correction] template.
+   */
+  const CompileTimeErrorCode(String name, String message, [String correction])
+      : super(name, message, correction);
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorType.COMPILE_TIME_ERROR.severity;
+
+  @override
+  ErrorType get type => ErrorType.COMPILE_TIME_ERROR;
+}
+
+/**
+ * An error code associated with an [AnalysisError].
+ *
+ * Generally, we want to provide messages that consist of three sentences. From
+ * the user's perspective these sentences should explain:
+ * 1. what is wrong,
+ * 2. why is it wrong, and
+ * 3. how do I fix it.
+ * However, we combine the first two in the [message] and the last in the
+ * [correction].
+ */
+abstract class ErrorCode {
+  /**
+   * An empty list of error codes.
+   */
+  static const List<ErrorCode> EMPTY_LIST = const <ErrorCode>[];
+
+  /**
+   * The name of the error code.
+   */
+  final String name;
+
+  /**
+   * The template used to create the message to be displayed for this error. The
+   * message should indicate what is wrong and why it is wrong.
+   */
+  final String message;
+
+  /**
+   * The template used to create the correction to be displayed for this error,
+   * or `null` if there is no correction information for this error. The
+   * correction should indicate how the user can fix the error.
+   */
+  final String correction;
+
+  /**
+   * Initialize a newly created error code to have the given [name]. The message
+   * associated with the error will be created from the given [message]
+   * template. The correction associated with the error will be created from the
+   * given [correction] template.
+   */
+  const ErrorCode(this.name, this.message, [this.correction]);
+
+  /**
+   * The severity of the error.
+   */
+  ErrorSeverity get errorSeverity;
+
+  /**
+   * The type of the error.
+   */
+  ErrorType get type;
+
+  /**
+   * The unique name of this error code.
+   */
+  String get uniqueName => "$runtimeType.$name";
+}
+
+/**
+ * The properties that can be associated with an [AnalysisError].
+ */
+class ErrorProperty extends Enum<ErrorProperty> {
+  /**
+   * A property whose value is a list of [FieldElement]s that are final, but
+   * not initialized by a constructor.
+   */
+  static const ErrorProperty NOT_INITIALIZED_FIELDS =
+      const ErrorProperty('NOT_INITIALIZED_FIELDS', 0);
+
+  /**
+   * A property whose value is the name of the library that is used by all
+   * of the "part of" directives, so should be used in the "library" directive.
+   * Is `null` if there is no a single name used by all of the parts.
+   */
+  static const ErrorProperty PARTS_LIBRARY_NAME =
+      const ErrorProperty('PARTS_LIBRARY_NAME', 1);
+
+  /**
+   * A property whose value is a list of [ExecutableElement] that should
+   * be but are not implemented by a concrete class.
+   */
+  static const ErrorProperty UNIMPLEMENTED_METHODS =
+      const ErrorProperty('UNIMPLEMENTED_METHODS', 2);
+
+  static const List<ErrorProperty> values = const [
+    NOT_INITIALIZED_FIELDS,
+    PARTS_LIBRARY_NAME,
+    UNIMPLEMENTED_METHODS
+  ];
+
+  const ErrorProperty(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
+ * An object used to create analysis errors and report then to an error
+ * listener.
+ */
+class ErrorReporter {
+  /**
+   * The error listener to which errors will be reported.
+   */
+  final AnalysisErrorListener _errorListener;
+
+  /**
+   * The default source to be used when reporting errors.
+   */
+  final Source _defaultSource;
+
+  /**
+   * The source to be used when reporting errors.
+   */
+  Source _source;
+
+  /**
+   * Initialize a newly created error reporter that will report errors to the
+   * given [_errorListener]. Errors will be reported against the
+   * [_defaultSource] unless another source is provided later.
+   */
+  ErrorReporter(this._errorListener, this._defaultSource) {
+    if (_errorListener == null) {
+      throw new IllegalArgumentException("An error listener must be provided");
+    } else if (_defaultSource == null) {
+      throw new IllegalArgumentException("A default source must be provided");
+    }
+    this._source = _defaultSource;
+  }
+
+  Source get source => _source;
+
+  /**
+   * Set the source to be used when reporting errors to the given [source].
+   * Setting the source to `null` will cause the default source to be used.
+   */
+  void set source(Source source) {
+    this._source = source == null ? _defaultSource : source;
+  }
+
+  /**
+   * Creates an error with properties with the given [errorCode] and
+   * [arguments]. The [node] is used to compute the location of the error.
+   */
+  AnalysisErrorWithProperties newErrorWithProperties(
+          ErrorCode errorCode, AstNode node, List<Object> arguments) =>
+      new AnalysisErrorWithProperties(
+          _source, node.offset, node.length, errorCode, arguments);
+
+  /**
+   * Report the given [error].
+   */
+  void reportError(AnalysisError error) {
+    _errorListener.onError(error);
+  }
+
+  /**
+   * Report an error with the given [errorCode] and [arguments]. The [element]
+   * is used to compute the location of the error.
+   */
+  void reportErrorForElement(
+      ErrorCode errorCode, Element element, List<Object> arguments) {
+    String displayName = element.displayName;
+    int length = 0;
+    if (displayName != null) {
+      length = displayName.length;
+    } else if (element is ImportElement) {
+      length = 6; // 'import'.length
+    } else if (element is ExportElement) {
+      length = 6; // 'export'.length
+    }
+    reportErrorForOffset(errorCode, element.nameOffset, length, arguments);
+  }
+
+  /**
+   * Report an error with the given [errorCode] and [arguments].
+   * The [node] is used to compute the location of the error.
+   *
+   * If the arguments contain the names of two or more types, the method
+   * [reportTypeErrorForNode] should be used and the types
+   * themselves (rather than their names) should be passed as arguments.
+   */
+  void reportErrorForNode(ErrorCode errorCode, AstNode node,
+      [List<Object> arguments]) {
+    reportErrorForOffset(errorCode, node.offset, node.length, arguments);
+  }
+
+  /**
+   * Report an error with the given [errorCode] and [arguments]. The location of
+   * the error is specified by the given [offset] and [length].
+   */
+  void reportErrorForOffset(ErrorCode errorCode, int offset, int length,
+      [List<Object> arguments]) {
+    _errorListener.onError(
+        new AnalysisError(_source, offset, length, errorCode, arguments));
+  }
+
+  /**
+   * Report an error with the given [errorCode] and [arguments]. The [token] is
+   * used to compute the location of the error.
+   */
+  void reportErrorForToken(ErrorCode errorCode, Token token,
+      [List<Object> arguments]) {
+    reportErrorForOffset(errorCode, token.offset, token.length, arguments);
+  }
+
+  /**
+   * Report an error with the given [errorCode] and [arguments]. The [node] is
+   * used to compute the location of the error. The arguments are expected to
+   * contain two or more types. Convert the types into strings by using the
+   * display names of the types, unless there are two or more types with the
+   * same names, in which case the extended display names of the types will be
+   * used in order to clarify the message.
+   *
+   * If there are not two or more types in the argument list, the method
+   * [reportErrorForNode] should be used instead.
+   */
+  void reportTypeErrorForNode(
+      ErrorCode errorCode, AstNode node, List<Object> arguments) {
+    _convertTypeNames(arguments);
+    reportErrorForOffset(errorCode, node.offset, node.length, arguments);
+  }
+
+  /**
+   * Given an array of [arguments] that is expected to contain two or more
+   * types, convert the types into strings by using the display names of the
+   * types, unless there are two or more types with the same names, in which
+   * case the extended display names of the types will be used in order to
+   * clarify the message.
+   */
+  void _convertTypeNames(List<Object> arguments) {
+    if (_hasEqualTypeNames(arguments)) {
+      int count = arguments.length;
+      for (int i = 0; i < count; i++) {
+        Object argument = arguments[i];
+        if (argument is DartType) {
+          DartType type = argument;
+          Element element = type.element;
+          if (element == null) {
+            arguments[i] = type.displayName;
+          } else {
+            arguments[i] = element.getExtendedDisplayName(type.displayName);
+          }
+        }
+      }
+    } else {
+      int count = arguments.length;
+      for (int i = 0; i < count; i++) {
+        Object argument = arguments[i];
+        if (argument is DartType) {
+          arguments[i] = argument.displayName;
+        }
+      }
+    }
+  }
+
+  /**
+   * Return `true` if the given array of [arguments] contains two or more types
+   * with the same display name.
+   */
+  bool _hasEqualTypeNames(List<Object> arguments) {
+    int count = arguments.length;
+    HashSet<String> typeNames = new HashSet<String>();
+    for (int i = 0; i < count; i++) {
+      if (arguments[i] is DartType &&
+          !typeNames.add((arguments[i] as DartType).displayName)) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+/**
+ * The severity of an [ErrorCode].
+ */
+class ErrorSeverity extends Enum<ErrorSeverity> {
+  /**
+   * The severity representing a non-error. This is never used for any error
+   * code, but is useful for clients.
+   */
+  static const ErrorSeverity NONE = const ErrorSeverity('NONE', 0, " ", "none");
+
+  /**
+   * The severity representing an informational level analysis issue.
+   */
+  static const ErrorSeverity INFO = const ErrorSeverity('INFO', 1, "I", "info");
+
+  /**
+   * The severity representing a warning. Warnings can become errors if the `-Werror` command
+   * line flag is specified.
+   */
+  static const ErrorSeverity WARNING =
+      const ErrorSeverity('WARNING', 2, "W", "warning");
+
+  /**
+   * The severity representing an error.
+   */
+  static const ErrorSeverity ERROR =
+      const ErrorSeverity('ERROR', 3, "E", "error");
+
+  static const List<ErrorSeverity> values = const [NONE, INFO, WARNING, ERROR];
+
+  /**
+   * The name of the severity used when producing machine output.
+   */
+  final String machineCode;
+
+  /**
+   * The name of the severity used when producing readable output.
+   */
+  final String displayName;
+
+  /**
+   * Initialize a newly created severity with the given names.
+   *
+   * Parameters:
+   * 0: the name of the severity used when producing machine output
+   * 1: the name of the severity used when producing readable output
+   */
+  const ErrorSeverity(
+      String name, int ordinal, this.machineCode, this.displayName)
+      : super(name, ordinal);
+
+  /**
+   * Return the severity constant that represents the greatest severity.
+   */
+  ErrorSeverity max(ErrorSeverity severity) =>
+      this.ordinal >= severity.ordinal ? this : severity;
+}
+
+/**
+ * The type of an [ErrorCode].
+ */
+class ErrorType extends Enum<ErrorType> {
+  /**
+   * Task (todo) comments in user code.
+   */
+  static const ErrorType TODO = const ErrorType('TODO', 0, ErrorSeverity.INFO);
+
+  /**
+   * Extra analysis run over the code to follow best practices, which are not in
+   * the Dart Language Specification.
+   */
+  static const ErrorType HINT = const ErrorType('HINT', 1, ErrorSeverity.INFO);
+
+  /**
+   * Compile-time errors are errors that preclude execution. A compile time
+   * error must be reported by a Dart compiler before the erroneous code is
+   * executed.
+   */
+  static const ErrorType COMPILE_TIME_ERROR =
+      const ErrorType('COMPILE_TIME_ERROR', 2, ErrorSeverity.ERROR);
+
+  /**
+   * Checked mode compile-time errors are errors that preclude execution in
+   * checked mode.
+   */
+  static const ErrorType CHECKED_MODE_COMPILE_TIME_ERROR = const ErrorType(
+      'CHECKED_MODE_COMPILE_TIME_ERROR', 3, ErrorSeverity.ERROR);
+
+  /**
+   * Static warnings are those warnings reported by the static checker. They
+   * have no effect on execution. Static warnings must be provided by Dart
+   * compilers used during development.
+   */
+  static const ErrorType STATIC_WARNING =
+      const ErrorType('STATIC_WARNING', 4, ErrorSeverity.WARNING);
+
+  /**
+   * Many, but not all, static warnings relate to types, in which case they are
+   * known as static type warnings.
+   */
+  static const ErrorType STATIC_TYPE_WARNING =
+      const ErrorType('STATIC_TYPE_WARNING', 5, ErrorSeverity.WARNING);
+
+  /**
+   * Syntactic errors are errors produced as a result of input that does not
+   * conform to the grammar.
+   */
+  static const ErrorType SYNTACTIC_ERROR =
+      const ErrorType('SYNTACTIC_ERROR', 6, ErrorSeverity.ERROR);
+
+  /**
+   * Lint warnings describe style and best practice recommendations that can be
+   * used to formalize a project's style guidelines.
+   */
+  static const ErrorType LINT = const ErrorType('LINT', 7, ErrorSeverity.INFO);
+
+  static const List<ErrorType> values = const [
+    TODO,
+    HINT,
+    COMPILE_TIME_ERROR,
+    CHECKED_MODE_COMPILE_TIME_ERROR,
+    STATIC_WARNING,
+    STATIC_TYPE_WARNING,
+    SYNTACTIC_ERROR,
+    LINT
+  ];
+
+  /**
+   * The severity of this type of error.
+   */
+  final ErrorSeverity severity;
+
+  /**
+   * Initialize a newly created error type to have the given [name] and
+   * [severity].
+   */
+  const ErrorType(String name, int ordinal, this.severity)
+      : super(name, ordinal);
+
+  String get displayName => name.toLowerCase().replaceAll('_', ' ');
+}
+
+/**
+ * The hints and coding recommendations for best practices which are not
+ * mentioned in the Dart Language Specification.
+ */
+class HintCode extends ErrorCode {
+  /**
+   * This hint is generated anywhere where the
+   * [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE] would have been generated,
+   * if we used propagated information for the warnings.
+   *
+   * Parameters:
+   * 0: the name of the actual argument type
+   * 1: the name of the expected type
+   */
+  static const HintCode ARGUMENT_TYPE_NOT_ASSIGNABLE = const HintCode(
+      'ARGUMENT_TYPE_NOT_ASSIGNABLE',
+      "The argument type '{0}' cannot be assigned to the parameter type '{1}'");
+
+  /**
+   * Dead code is code that is never reached, this can happen for instance if a
+   * statement follows a return statement.
+   */
+  static const HintCode DEAD_CODE = const HintCode('DEAD_CODE', "Dead code");
+
+  /**
+   * Dead code is code that is never reached. This case covers cases where the
+   * user has catch clauses after `catch (e)` or `on Object catch (e)`.
+   */
+  static const HintCode DEAD_CODE_CATCH_FOLLOWING_CATCH = const HintCode(
+      'DEAD_CODE_CATCH_FOLLOWING_CATCH',
+      "Dead code, catch clauses after a 'catch (e)' or an 'on Object catch (e)' are never reached");
+
+  /**
+   * Dead code is code that is never reached. This case covers cases where the
+   * user has an on-catch clause such as `on A catch (e)`, where a supertype of
+   * `A` was already caught.
+   *
+   * Parameters:
+   * 0: name of the subtype
+   * 1: name of the supertype
+   */
+  static const HintCode DEAD_CODE_ON_CATCH_SUBTYPE = const HintCode(
+      'DEAD_CODE_ON_CATCH_SUBTYPE',
+      "Dead code, this on-catch block will never be executed since '{0}' is a subtype of '{1}'");
+
+  /**
+   * Deprecated members should not be invoked or used.
+   *
+   * Parameters:
+   * 0: the name of the member
+   */
+  static const HintCode DEPRECATED_MEMBER_USE =
+      const HintCode('DEPRECATED_MEMBER_USE', "'{0}' is deprecated");
+
+  /**
+   * Duplicate imports.
+   */
+  static const HintCode DUPLICATE_IMPORT =
+      const HintCode('DUPLICATE_IMPORT', "Duplicate import");
+
+  /**
+   * Hint to use the ~/ operator.
+   */
+  static const HintCode DIVISION_OPTIMIZATION = const HintCode(
+      'DIVISION_OPTIMIZATION',
+      "The operator x ~/ y is more efficient than (x / y).toInt()");
+
+  /**
+   * Hint for the `x is double` type checks.
+   */
+  static const HintCode IS_DOUBLE = const HintCode('IS_DOUBLE',
+      "When compiled to JS, this test might return true when the left hand side is an int");
+
+  /**
+   * Hint for the `x is int` type checks.
+   */
+  static const HintCode IS_INT = const HintCode('IS_INT',
+      "When compiled to JS, this test might return true when the left hand side is a double");
+
+  /**
+   * Hint for the `x is! double` type checks.
+   */
+  static const HintCode IS_NOT_DOUBLE = const HintCode('IS_NOT_DOUBLE',
+      "When compiled to JS, this test might return false when the left hand side is an int");
+
+  /**
+   * Hint for the `x is! int` type checks.
+   */
+  static const HintCode IS_NOT_INT = const HintCode('IS_NOT_INT',
+      "When compiled to JS, this test might return false when the left hand side is a double");
+
+  /**
+   * Deferred libraries shouldn't define a top level function 'loadLibrary'.
+   */
+  static const HintCode IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION = const HintCode(
+      'IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION',
+      "The library '{0}' defines a top-level function named 'loadLibrary' which is hidden by deferring this library");
+
+  /**
+   * This hint is generated anywhere where the
+   * [StaticTypeWarningCode.INVALID_ASSIGNMENT] would have been generated, if we
+   * used propagated information for the warnings.
+   *
+   * Parameters:
+   * 0: the name of the right hand side type
+   * 1: the name of the left hand side type
+   */
+  static const HintCode INVALID_ASSIGNMENT = const HintCode(
+      'INVALID_ASSIGNMENT',
+      "A value of type '{0}' cannot be assigned to a variable of type '{1}'");
+
+  /**
+   * Generate a hint for methods or functions that have a return type, but do
+   * not have a non-void return statement on all branches. At the end of methods
+   * or functions with no return, Dart implicitly returns `null`, avoiding these
+   * implicit returns is considered a best practice.
+   *
+   * Parameters:
+   * 0: the name of the declared return type
+   */
+  static const HintCode MISSING_RETURN = const HintCode('MISSING_RETURN',
+      "This function declares a return type of '{0}', but does not end with a return statement",
+      "Either add a return statement or change the return type to 'void'");
+
+  /**
+   * A getter with the override annotation does not override an existing getter.
+   */
+  static const HintCode OVERRIDE_ON_NON_OVERRIDING_GETTER = const HintCode(
+      'OVERRIDE_ON_NON_OVERRIDING_GETTER',
+      "Getter does not override an inherited getter");
+
+  /**
+   * A method with the override annotation does not override an existing method.
+   */
+  static const HintCode OVERRIDE_ON_NON_OVERRIDING_METHOD = const HintCode(
+      'OVERRIDE_ON_NON_OVERRIDING_METHOD',
+      "Method does not override an inherited method");
+
+  /**
+   * A setter with the override annotation does not override an existing setter.
+   */
+  static const HintCode OVERRIDE_ON_NON_OVERRIDING_SETTER = const HintCode(
+      'OVERRIDE_ON_NON_OVERRIDING_SETTER',
+      "Setter does not override an inherited setter");
+
+  /**
+   * Hint for classes that override equals, but not hashCode.
+   *
+   * Parameters:
+   * 0: the name of the current class
+   */
+  static const HintCode OVERRIDE_EQUALS_BUT_NOT_HASH_CODE = const HintCode(
+      'OVERRIDE_EQUALS_BUT_NOT_HASH_CODE',
+      "The class '{0}' overrides 'operator==', but not 'get hashCode'");
+
+  /**
+   * Type checks of the type `x is! Null` should be done with `x != null`.
+   */
+  static const HintCode TYPE_CHECK_IS_NOT_NULL = const HintCode(
+      'TYPE_CHECK_IS_NOT_NULL',
+      "Tests for non-null should be done with '!= null'");
+
+  /**
+   * Type checks of the type `x is Null` should be done with `x == null`.
+   */
+  static const HintCode TYPE_CHECK_IS_NULL = const HintCode(
+      'TYPE_CHECK_IS_NULL', "Tests for null should be done with '== null'");
+
+  /**
+   * This hint is generated anywhere where the
+   * [StaticTypeWarningCode.UNDEFINED_GETTER] or
+   * [StaticWarningCode.UNDEFINED_GETTER] would have been generated, if we used
+   * propagated information for the warnings.
+   *
+   * Parameters:
+   * 0: the name of the getter
+   * 1: the name of the enclosing type where the getter is being looked for
+   */
+  static const HintCode UNDEFINED_GETTER = const HintCode('UNDEFINED_GETTER',
+      "The getter '{0}' is not defined for the class '{1}'");
+
+  /**
+   * This hint is generated anywhere where the
+   * [StaticTypeWarningCode.UNDEFINED_METHOD] would have been generated, if we
+   * used propagated information for the warnings.
+   *
+   * Parameters:
+   * 0: the name of the method that is undefined
+   * 1: the resolved type name that the method lookup is happening on
+   */
+  static const HintCode UNDEFINED_METHOD = const HintCode('UNDEFINED_METHOD',
+      "The method '{0}' is not defined for the class '{1}'");
+
+  /**
+   * This hint is generated anywhere where the
+   * [StaticTypeWarningCode.UNDEFINED_OPERATOR] would have been generated, if we
+   * used propagated information for the warnings.
+   *
+   * Parameters:
+   * 0: the name of the operator
+   * 1: the name of the enclosing type where the operator is being looked for
+   */
+  static const HintCode UNDEFINED_OPERATOR = const HintCode(
+      'UNDEFINED_OPERATOR',
+      "The operator '{0}' is not defined for the class '{1}'");
+
+  /**
+   * This hint is generated anywhere where the
+   * [StaticTypeWarningCode.UNDEFINED_SETTER] or
+   * [StaticWarningCode.UNDEFINED_SETTER] would have been generated, if we used
+   * propagated information for the warnings.
+   *
+   * Parameters:
+   * 0: the name of the setter
+   * 1: the name of the enclosing type where the setter is being looked for
+   */
+  static const HintCode UNDEFINED_SETTER = const HintCode('UNDEFINED_SETTER',
+      "The setter '{0}' is not defined for the class '{1}'");
+
+  /**
+   * Unnecessary cast.
+   */
+  static const HintCode UNNECESSARY_CAST =
+      const HintCode('UNNECESSARY_CAST', "Unnecessary cast");
+
+  /**
+   * Unnecessary type checks, the result is always true.
+   */
+  static const HintCode UNNECESSARY_TYPE_CHECK_FALSE = const HintCode(
+      'UNNECESSARY_TYPE_CHECK_FALSE',
+      "Unnecessary type check, the result is always false");
+
+  /**
+   * Unnecessary type checks, the result is always false.
+   */
+  static const HintCode UNNECESSARY_TYPE_CHECK_TRUE = const HintCode(
+      'UNNECESSARY_TYPE_CHECK_TRUE',
+      "Unnecessary type check, the result is always true");
+
+  /**
+   * See [Modifier.IS_USED_IN_LIBRARY].
+   */
+  static const HintCode UNUSED_ELEMENT =
+      const HintCode('UNUSED_ELEMENT', "The {0} '{1}' is not used");
+
+  /**
+   * Unused fields are fields which are never read.
+   */
+  static const HintCode UNUSED_FIELD = const HintCode(
+      'UNUSED_FIELD', "The value of the field '{0}' is not used");
+
+  /**
+   * Unused imports are imports which are never used.
+   */
+  static const HintCode UNUSED_IMPORT =
+      const HintCode('UNUSED_IMPORT', "Unused import");
+
+  /**
+   * Unused catch exception variables.
+   */
+  static const HintCode UNUSED_CATCH_CLAUSE = const HintCode(
+      'UNUSED_CATCH_CLAUSE',
+      "The exception variable '{0}' is not used, so the 'catch' clause can be removed");
+
+  /**
+   * Unused catch stack trace variables.
+   */
+  static const HintCode UNUSED_CATCH_STACK = const HintCode(
+      'UNUSED_CATCH_STACK',
+      "The stack trace variable '{0}' is not used and can be removed");
+
+  /**
+   * Unused local variables are local varaibles which are never read.
+   */
+  static const HintCode UNUSED_LOCAL_VARIABLE = const HintCode(
+      'UNUSED_LOCAL_VARIABLE',
+      "The value of the local variable '{0}' is not used");
+
+  /**
+   * Hint for cases where the source expects a method or function to return a
+   * non-void result, but the method or function signature returns void.
+   *
+   * Parameters:
+   * 0: the name of the method or function that returns void
+   */
+  static const HintCode USE_OF_VOID_RESULT = const HintCode(
+      'USE_OF_VOID_RESULT',
+      "The result of '{0}' is being used, even though it is declared to be 'void'");
+
+  /**
+   * It is a bad practice for a source file in a package "lib" directory
+   * hierarchy to traverse outside that directory hierarchy. For example, a
+   * source file in the "lib" directory should not contain a directive such as
+   * `import '../web/some.dart'` which references a file outside the lib
+   * directory.
+   */
+  static const HintCode FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE =
+      const HintCode('FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE',
+          "A file in the 'lib' directory hierarchy should not reference a file outside that hierarchy");
+
+  /**
+   * It is a bad practice for a source file ouside a package "lib" directory
+   * hierarchy to traverse into that directory hierarchy. For example, a source
+   * file in the "web" directory should not contain a directive such as
+   * `import '../lib/some.dart'` which references a file inside the lib
+   * directory.
+   */
+  static const HintCode FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE =
+      const HintCode('FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE',
+          "A file outside the 'lib' directory hierarchy should not reference a file inside that hierarchy. Use a package: reference instead.");
+
+  /**
+   * It is a bad practice for a package import to reference anything outside the
+   * given package, or more generally, it is bad practice for a package import
+   * to contain a "..". For example, a source file should not contain a
+   * directive such as `import 'package:foo/../some.dart'`.
+   */
+  static const HintCode PACKAGE_IMPORT_CONTAINS_DOT_DOT = const HintCode(
+      'PACKAGE_IMPORT_CONTAINS_DOT_DOT',
+      "A package import should not contain '..'");
+
+  /**
+   * Initialize a newly created error code to have the given [name]. The message
+   * associated with the error will be created from the given [message]
+   * template. The correction associated with the error will be created from the
+   * given [correction] template.
+   */
+  const HintCode(String name, String message, [String correction])
+      : super(name, message, correction);
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorType.HINT.severity;
+
+  @override
+  ErrorType get type => ErrorType.HINT;
+}
+
+/**
+ * The error codes used for errors in HTML files. The convention for this
+ * class is for the name of the error code to indicate the problem that caused
+ * the error to be generated and for the error message to explain what is wrong
+ * and, when appropriate, how the problem can be corrected.
+ */
+class HtmlErrorCode extends ErrorCode {
+  /**
+   * An error code indicating that there is a syntactic error in the file.
+   *
+   * Parameters:
+   * 0: the error message from the parse error
+   */
+  static const HtmlErrorCode PARSE_ERROR =
+      const HtmlErrorCode('PARSE_ERROR', '{0}');
+
+  /**
+   * Initialize a newly created error code to have the given [name]. The message
+   * associated with the error will be created from the given [message]
+   * template. The correction associated with the error will be created from the
+   * given [correction] template.
+   */
+  const HtmlErrorCode(String name, String message, [String correction])
+      : super(name, message, correction);
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;
+
+  @override
+  ErrorType get type => ErrorType.COMPILE_TIME_ERROR;
+}
+
+/**
+ * The error codes used for warnings in HTML files. The convention for this
+ * class is for the name of the error code to indicate the problem that caused
+ * the error to be generated and for the error message to explain what is wrong
+ * and, when appropriate, how the problem can be corrected.
+ */
+class HtmlWarningCode extends ErrorCode {
+  /**
+   * An error code indicating that the value of the 'src' attribute of a Dart
+   * script tag is not a valid URI.
+   *
+   * Parameters:
+   * 0: the URI that is invalid
+   */
+  static const HtmlWarningCode INVALID_URI =
+      const HtmlWarningCode('INVALID_URI', "Invalid URI syntax: '{0}'");
+
+  /**
+   * An error code indicating that the value of the 'src' attribute of a Dart
+   * script tag references a file that does not exist.
+   *
+   * Parameters:
+   * 0: the URI pointing to a non-existent file
+   */
+  static const HtmlWarningCode URI_DOES_NOT_EXIST = const HtmlWarningCode(
+      'URI_DOES_NOT_EXIST', "Target of URI does not exist: '{0}'");
+
+  /**
+   * Initialize a newly created error code to have the given [name]. The message
+   * associated with the error will be created from the given [message]
+   * template. The correction associated with the error will be created from the
+   * given [correction] template.
+   */
+  const HtmlWarningCode(String name, String message, [String correction])
+      : super(name, message, correction);
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorSeverity.WARNING;
+
+  @override
+  ErrorType get type => ErrorType.STATIC_WARNING;
+}
+
+/**
+ * Defines style and best practice recommendations.
+ *
+ * Unlike [HintCode]s, which are akin to traditional static warnings from a
+ * compiler, lint recommendations focus on matters of style and practices that
+ * might aggregated to define a project's style guide.
+ */
+class LintCode extends ErrorCode {
+  const LintCode(String name, String message, [String correction])
+      : super(name, message, correction);
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorSeverity.INFO;
+
+  @override
+  ErrorType get type => ErrorType.LINT;
+}
+
+/**
+ * The error codes used for static type warnings. The convention for this class
+ * is for the name of the error code to indicate the problem that caused the
+ * error to be generated and for the error message to explain what is wrong and,
+ * when appropriate, how the problem can be corrected.
+ */
+class StaticTypeWarningCode extends ErrorCode {
+  /**
+   * 12.7 Lists: A fresh instance (7.6.1) <i>a</i>, of size <i>n</i>, whose
+   * class implements the built-in class <i>List&lt;E></i> is allocated.
+   *
+   * Parameters:
+   * 0: the number of provided type arguments
+   */
+  static const StaticTypeWarningCode EXPECTED_ONE_LIST_TYPE_ARGUMENTS =
+      const StaticTypeWarningCode('EXPECTED_ONE_LIST_TYPE_ARGUMENTS',
+          "List literal requires exactly one type arguments or none, but {0} found");
+
+  /**
+   * 12.8 Maps: A fresh instance (7.6.1) <i>m</i>, of size <i>n</i>, whose class
+   * implements the built-in class <i>Map&lt;K, V></i> is allocated.
+   *
+   * Parameters:
+   * 0: the number of provided type arguments
+   */
+  static const StaticTypeWarningCode EXPECTED_TWO_MAP_TYPE_ARGUMENTS =
+      const StaticTypeWarningCode('EXPECTED_TWO_MAP_TYPE_ARGUMENTS',
+          "Map literal requires exactly two type arguments or none, but {0} found");
+
+  /**
+   * 9 Functions: It is a static warning if the declared return type of a
+   * function marked async* may not be assigned to Stream.
+   */
+  static const StaticTypeWarningCode ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE =
+      const StaticTypeWarningCode('ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE',
+          "Functions marked 'async*' must have a return type assignable to 'Stream'");
+
+  /**
+   * 9 Functions: It is a static warning if the declared return type of a
+   * function marked async may not be assigned to Future.
+   */
+  static const StaticTypeWarningCode ILLEGAL_ASYNC_RETURN_TYPE =
+      const StaticTypeWarningCode('ILLEGAL_ASYNC_RETURN_TYPE',
+          "Functions marked 'async' must have a return type assignable to 'Future'");
+
+  /**
+   * 9 Functions: It is a static warning if the declared return type of a
+   * function marked sync* may not be assigned to Iterable.
+   */
+  static const StaticTypeWarningCode ILLEGAL_SYNC_GENERATOR_RETURN_TYPE =
+      const StaticTypeWarningCode('ILLEGAL_SYNC_GENERATOR_RETURN_TYPE',
+          "Functions marked 'sync*' must have a return type assignable to 'Iterable'");
+
+  /**
+   * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>.
+   * It is a static type warning if <i>T</i> does not have an accessible
+   * instance setter named <i>v=</i>.
+   *
+   * See [UNDEFINED_SETTER].
+   */
+  static const StaticTypeWarningCode INACCESSIBLE_SETTER =
+      const StaticTypeWarningCode('INACCESSIBLE_SETTER', "");
+
+  /**
+   * 8.1.1 Inheritance and Overriding: However, if the above rules would cause
+   * multiple members <i>m<sub>1</sub>, &hellip;, m<sub>k</sub></i> with the
+   * same name <i>n</i> that would be inherited (because identically named
+   * members existed in several superinterfaces) then at most one member is
+   * inherited.
+   *
+   * If the static types <i>T<sub>1</sub>, &hellip;, T<sub>k</sub></i> of the
+   * members <i>m<sub>1</sub>, &hellip;, m<sub>k</sub></i> are not identical,
+   * then there must be a member <i>m<sub>x</sub></i> such that <i>T<sub>x</sub>
+   * &lt;: T<sub>i</sub>, 1 &lt;= x &lt;= k</i> for all <i>i, 1 &lt;= i &lt;=
+   * k</i>, or a static type warning occurs. The member that is inherited is
+   * <i>m<sub>x</sub></i>, if it exists; otherwise:
+   * * Let <i>numberOfPositionals</i>(<i>f</i>) denote the number of positional
+   *   parameters of a function <i>f</i>, and let
+   *   <i>numberOfRequiredParams</i>(<i>f</i>) denote the number of required
+   *   parameters of a function <i>f</i>. Furthermore, let <i>s</i> denote the
+   *   set of all named parameters of the <i>m<sub>1</sub>, &hellip;,
+   *   m<sub>k</sub></i>. Then let
+   * * <i>h = max(numberOfPositionals(m<sub>i</sub>)),</i>
+   * * <i>r = min(numberOfRequiredParams(m<sub>i</sub>)), for all <i>i</i>, 1 <=
+   *   i <= k.</i> If <i>r <= h</i> then <i>I</i> has a method named <i>n</i>,
+   *   with <i>r</i> required parameters of type <b>dynamic</b>, <i>h</i>
+   *   positional parameters of type <b>dynamic</b>, named parameters <i>s</i>
+   *   of type <b>dynamic</b> and return type <b>dynamic</b>.
+   * * Otherwise none of the members <i>m<sub>1</sub>, &hellip;,
+   *   m<sub>k</sub></i> is inherited.
+   */
+  static const StaticTypeWarningCode INCONSISTENT_METHOD_INHERITANCE =
+      const StaticTypeWarningCode('INCONSISTENT_METHOD_INHERITANCE',
+          "'{0}' is inherited by at least two interfaces inconsistently, from {1}");
+
+  /**
+   * 12.15.1 Ordinary Invocation: It is a static type warning if <i>T</i> does
+   * not have an accessible (3.2) instance member named <i>m</i>.
+   *
+   * Parameters:
+   * 0: the name of the static member
+   *
+   * See [UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER].
+   */
+  static const StaticTypeWarningCode INSTANCE_ACCESS_TO_STATIC_MEMBER =
+      const StaticTypeWarningCode('INSTANCE_ACCESS_TO_STATIC_MEMBER',
+          "Static member '{0}' cannot be accessed using instance access");
+
+  /**
+   * 12.18 Assignment: It is a static type warning if the static type of
+   * <i>e</i> may not be assigned to the static type of <i>v</i>. The static
+   * type of the expression <i>v = e</i> is the static type of <i>e</i>.
+   *
+   * 12.18 Assignment: It is a static type warning if the static type of
+   * <i>e</i> may not be assigned to the static type of <i>C.v</i>. The static
+   * type of the expression <i>C.v = e</i> is the static type of <i>e</i>.
+   *
+   * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>.
+   * It is a static type warning if the static type of <i>e<sub>2</sub></i> may
+   * not be assigned to <i>T</i>.
+   *
+   * Parameters:
+   * 0: the name of the right hand side type
+   * 1: the name of the left hand side type
+   */
+  static const StaticTypeWarningCode INVALID_ASSIGNMENT =
+      const StaticTypeWarningCode('INVALID_ASSIGNMENT',
+          "A value of type '{0}' cannot be assigned to a variable of type '{1}'");
+
+  /**
+   * 12.15.1 Ordinary Invocation: An ordinary method invocation <i>i</i> has the
+   * form <i>o.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
+   * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+k</sub>)</i>.
+   *
+   * Let <i>T</i> be the static type of <i>o</i>. It is a static type warning if
+   * <i>T</i> does not have an accessible instance member named <i>m</i>. If
+   * <i>T.m</i> exists, it is a static warning if the type <i>F</i> of
+   * <i>T.m</i> may not be assigned to a function type. If <i>T.m</i> does not
+   * exist, or if <i>F</i> is not a function type, the static type of <i>i</i>
+   * is dynamic.
+   *
+   * 12.15.3 Static Invocation: It is a static type warning if the type <i>F</i>
+   * of <i>C.m</i> may not be assigned to a function type.
+   *
+   * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
+   * <i>super.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
+   * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. If
+   * <i>S.m</i> exists, it is a static warning if the type <i>F</i> of
+   * <i>S.m</i> may not be assigned to a function type.
+   *
+   * Parameters:
+   * 0: the name of the identifier that is not a function type
+   */
+  static const StaticTypeWarningCode INVOCATION_OF_NON_FUNCTION =
+      const StaticTypeWarningCode(
+          'INVOCATION_OF_NON_FUNCTION', "'{0}' is not a method");
+
+  /**
+   * 12.14.4 Function Expression Invocation: A function expression invocation
+   * <i>i</i> has the form <i>e<sub>f</sub>(a<sub>1</sub>, &hellip;,
+   * a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>:
+   * a<sub>n+k</sub>)</i>, where <i>e<sub>f</sub></i> is an expression.
+   *
+   * It is a static type warning if the static type <i>F</i> of
+   * <i>e<sub>f</sub></i> may not be assigned to a function type.
+   */
+  static const StaticTypeWarningCode INVOCATION_OF_NON_FUNCTION_EXPRESSION =
+      const StaticTypeWarningCode('INVOCATION_OF_NON_FUNCTION_EXPRESSION',
+          "Cannot invoke a non-function");
+
+  /**
+   * 12.20 Conditional: It is a static type warning if the type of
+   * <i>e<sub>1</sub></i> may not be assigned to bool.
+   *
+   * 13.5 If: It is a static type warning if the type of the expression <i>b</i>
+   * may not be assigned to bool.
+   *
+   * 13.7 While: It is a static type warning if the type of <i>e</i> may not be
+   * assigned to bool.
+   *
+   * 13.8 Do: It is a static type warning if the type of <i>e</i> cannot be
+   * assigned to bool.
+   */
+  static const StaticTypeWarningCode NON_BOOL_CONDITION =
+      const StaticTypeWarningCode(
+          'NON_BOOL_CONDITION', "Conditions must have a static type of 'bool'");
+
+  /**
+   * 13.15 Assert: It is a static type warning if the type of <i>e</i> may not
+   * be assigned to either bool or () &rarr; bool
+   */
+  static const StaticTypeWarningCode NON_BOOL_EXPRESSION =
+      const StaticTypeWarningCode('NON_BOOL_EXPRESSION',
+          "Assertions must be on either a 'bool' or '() -> bool'");
+
+  /**
+   * 12.28 Unary Expressions: The expression !<i>e</i> is equivalent to the
+   * expression <i>e</i>?<b>false<b> : <b>true</b>.
+   *
+   * 12.20 Conditional: It is a static type warning if the type of
+   * <i>e<sub>1</sub></i> may not be assigned to bool.
+   */
+  static const StaticTypeWarningCode NON_BOOL_NEGATION_EXPRESSION =
+      const StaticTypeWarningCode('NON_BOOL_NEGATION_EXPRESSION',
+          "Negation argument must have a static type of 'bool'");
+
+  /**
+   * 12.21 Logical Boolean Expressions: It is a static type warning if the
+   * static types of both of <i>e<sub>1</sub></i> and <i>e<sub>2</sub></i> may
+   * not be assigned to bool.
+   *
+   * Parameters:
+   * 0: the lexeme of the logical operator
+   */
+  static const StaticTypeWarningCode NON_BOOL_OPERAND =
+      const StaticTypeWarningCode('NON_BOOL_OPERAND',
+          "The operands of the '{0}' operator must be assignable to 'bool'");
+
+  /**
+   * 15.8 Parameterized Types: It is a static type warning if <i>A<sub>i</sub>,
+   * 1 &lt;= i &lt;= n</i> does not denote a type in the enclosing lexical scope.
+   */
+  static const StaticTypeWarningCode NON_TYPE_AS_TYPE_ARGUMENT =
+      const StaticTypeWarningCode('NON_TYPE_AS_TYPE_ARGUMENT',
+          "The name '{0}' is not a type and cannot be used as a parameterized type");
+
+  /**
+   * 13.11 Return: It is a static type warning if the type of <i>e</i> may not
+   * be assigned to the declared return type of the immediately enclosing
+   * function.
+   *
+   * Parameters:
+   * 0: the return type as declared in the return statement
+   * 1: the expected return type as defined by the method
+   * 2: the name of the method
+   */
+  static const StaticTypeWarningCode RETURN_OF_INVALID_TYPE =
+      const StaticTypeWarningCode('RETURN_OF_INVALID_TYPE',
+          "The return type '{0}' is not a '{1}', as defined by the method '{2}'");
+
+  /**
+   * 12.11 Instance Creation: It is a static type warning if any of the type
+   * arguments to a constructor of a generic type <i>G</i> invoked by a new
+   * expression or a constant object expression are not subtypes of the bounds
+   * of the corresponding formal type parameters of <i>G</i>.
+   *
+   * 15.8 Parameterized Types: If <i>S</i> is the static type of a member
+   * <i>m</i> of <i>G</i>, then the static type of the member <i>m</i> of
+   * <i>G&lt;A<sub>1</sub>, &hellip;, A<sub>n</sub>&gt;</i> is <i>[A<sub>1</sub>,
+   * &hellip;, A<sub>n</sub>/T<sub>1</sub>, &hellip;, T<sub>n</sub>]S</i> where
+   * <i>T<sub>1</sub>, &hellip;, T<sub>n</sub></i> are the formal type
+   * parameters of <i>G</i>. Let <i>B<sub>i</sub></i> be the bounds of
+   * <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>. It is a static type warning if
+   * <i>A<sub>i</sub></i> is not a subtype of <i>[A<sub>1</sub>, &hellip;,
+   * A<sub>n</sub>/T<sub>1</sub>, &hellip;, T<sub>n</sub>]B<sub>i</sub>, 1 &lt;=
+   * i &lt;= n</i>.
+   *
+   * 7.6.2 Factories: It is a static type warning if any of the type arguments
+   * to <i>k'</i> are not subtypes of the bounds of the corresponding formal
+   * type parameters of type.
+   *
+   * Parameters:
+   * 0: the name of the type used in the instance creation that should be
+   *    limited by the bound as specified in the class declaration
+   * 1: the name of the bounding type
+   *
+   * See [TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND].
+   */
+  static const StaticTypeWarningCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS =
+      const StaticTypeWarningCode(
+          'TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', "'{0}' does not extend '{1}'");
+
+  /**
+   * 10 Generics: It is a static type warning if a type parameter is a supertype
+   * of its upper bound.
+   *
+   * Parameters:
+   * 0: the name of the type parameter
+   *
+   * See [TYPE_ARGUMENT_NOT_MATCHING_BOUNDS].
+   */
+  static const StaticTypeWarningCode TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND =
+      const StaticTypeWarningCode('TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND',
+          "'{0}' cannot be a supertype of its upper bound");
+
+  /**
+   * 12.17 Getter Invocation: It is a static warning if there is no class
+   * <i>C</i> in the enclosing lexical scope of <i>i</i>, or if <i>C</i> does
+   * not declare, implicitly or explicitly, a getter named <i>m</i>.
+   *
+   * Parameters:
+   * 0: the name of the enumeration constant that is not defined
+   * 1: the name of the enumeration used to access the constant
+   */
+  static const StaticTypeWarningCode UNDEFINED_ENUM_CONSTANT =
+      const StaticTypeWarningCode('UNDEFINED_ENUM_CONSTANT',
+          "There is no constant named '{0}' in '{1}'");
+
+  /**
+   * 12.15.3 Unqualified Invocation: If there exists a lexically visible
+   * declaration named <i>id</i>, let <i>f<sub>id</sub></i> be the innermost
+   * such declaration. Then: [skip]. Otherwise, <i>f<sub>id</sub></i> is
+   * considered equivalent to the ordinary method invocation
+   * <b>this</b>.<i>id</i>(<i>a<sub>1</sub></i>, ..., <i>a<sub>n</sub></i>,
+   * <i>x<sub>n+1</sub></i> : <i>a<sub>n+1</sub></i>, ...,
+   * <i>x<sub>n+k</sub></i> : <i>a<sub>n+k</sub></i>).
+   *
+   * Parameters:
+   * 0: the name of the method that is undefined
+   */
+  static const StaticTypeWarningCode UNDEFINED_FUNCTION =
+      const StaticTypeWarningCode(
+          'UNDEFINED_FUNCTION', "The function '{0}' is not defined");
+
+  /**
+   * 12.17 Getter Invocation: Let <i>T</i> be the static type of <i>e</i>. It is
+   * a static type warning if <i>T</i> does not have a getter named <i>m</i>.
+   *
+   * Parameters:
+   * 0: the name of the getter
+   * 1: the name of the enclosing type where the getter is being looked for
+   */
+  static const StaticTypeWarningCode UNDEFINED_GETTER =
+      const StaticTypeWarningCode('UNDEFINED_GETTER',
+          "The getter '{0}' is not defined for the class '{1}'");
+
+  /**
+   * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>.
+   * It is a static type warning if <i>T</i> does not have an accessible
+   * instance member named <i>m</i>.
+   *
+   * Parameters:
+   * 0: the name of the method that is undefined
+   * 1: the resolved type name that the method lookup is happening on
+   */
+  static const StaticTypeWarningCode UNDEFINED_METHOD =
+      const StaticTypeWarningCode('UNDEFINED_METHOD',
+          "The method '{0}' is not defined for the class '{1}'");
+
+  /**
+   * 12.18 Assignment: Evaluation of an assignment of the form
+   * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] = <i>e<sub>3</sub></i> is
+   * equivalent to the evaluation of the expression (a, i, e){a.[]=(i, e);
+   * return e;} (<i>e<sub>1</sub></i>, <i>e<sub>2</sub></i>,
+   * <i>e<sub>2</sub></i>).
+   *
+   * 12.29 Assignable Expressions: An assignable expression of the form
+   * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] is evaluated as a method
+   * invocation of the operator method [] on <i>e<sub>1</sub></i> with argument
+   * <i>e<sub>2</sub></i>.
+   *
+   * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>.
+   * It is a static type warning if <i>T</i> does not have an accessible
+   * instance member named <i>m</i>.
+   *
+   * Parameters:
+   * 0: the name of the operator
+   * 1: the name of the enclosing type where the operator is being looked for
+   */
+  static const StaticTypeWarningCode UNDEFINED_OPERATOR =
+      const StaticTypeWarningCode('UNDEFINED_OPERATOR',
+          "The operator '{0}' is not defined for the class '{1}'");
+
+  /**
+   * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>.
+   * It is a static type warning if <i>T</i> does not have an accessible
+   * instance setter named <i>v=</i>.
+   *
+   * Parameters:
+   * 0: the name of the setter
+   * 1: the name of the enclosing type where the setter is being looked for
+   *
+   * See [INACCESSIBLE_SETTER].
+   */
+  static const StaticTypeWarningCode UNDEFINED_SETTER =
+      const StaticTypeWarningCode('UNDEFINED_SETTER',
+          "The setter '{0}' is not defined for the class '{1}'");
+
+  /**
+   * 12.17 Getter Invocation: Let <i>T</i> be the static type of <i>e</i>. It is
+   * a static type warning if <i>T</i> does not have a getter named <i>m</i>.
+   *
+   * Parameters:
+   * 0: the name of the getter
+   * 1: the name of the enclosing type where the getter is being looked for
+   */
+  static const StaticTypeWarningCode UNDEFINED_SUPER_GETTER =
+      const StaticTypeWarningCode('UNDEFINED_SUPER_GETTER',
+          "The getter '{0}' is not defined in a superclass of '{1}'");
+
+  /**
+   * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
+   * <i>super.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
+   * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. It is a
+   * static type warning if <i>S</i> does not have an accessible instance member
+   * named <i>m</i>.
+   *
+   * Parameters:
+   * 0: the name of the method that is undefined
+   * 1: the resolved type name that the method lookup is happening on
+   */
+  static const StaticTypeWarningCode UNDEFINED_SUPER_METHOD =
+      const StaticTypeWarningCode('UNDEFINED_SUPER_METHOD',
+          "The method '{0}' is not defined in a superclass of '{1}'");
+
+  /**
+   * 12.18 Assignment: Evaluation of an assignment of the form
+   * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] = <i>e<sub>3</sub></i> is
+   * equivalent to the evaluation of the expression (a, i, e){a.[]=(i, e);
+   * return e;} (<i>e<sub>1</sub></i>, <i>e<sub>2</sub></i>,
+   * <i>e<sub>2</sub></i>).
+   *
+   * 12.29 Assignable Expressions: An assignable expression of the form
+   * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] is evaluated as a method
+   * invocation of the operator method [] on <i>e<sub>1</sub></i> with argument
+   * <i>e<sub>2</sub></i>.
+   *
+   * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>.
+   * It is a static type warning if <i>T</i> does not have an accessible
+   * instance member named <i>m</i>.
+   *
+   * Parameters:
+   * 0: the name of the operator
+   * 1: the name of the enclosing type where the operator is being looked for
+   */
+  static const StaticTypeWarningCode UNDEFINED_SUPER_OPERATOR =
+      const StaticTypeWarningCode('UNDEFINED_SUPER_OPERATOR',
+          "The operator '{0}' is not defined in a superclass of '{1}'");
+
+  /**
+   * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>.
+   * It is a static type warning if <i>T</i> does not have an accessible
+   * instance setter named <i>v=</i>.
+   *
+   * Parameters:
+   * 0: the name of the setter
+   * 1: the name of the enclosing type where the setter is being looked for
+   *
+   * See [INACCESSIBLE_SETTER].
+   */
+  static const StaticTypeWarningCode UNDEFINED_SUPER_SETTER =
+      const StaticTypeWarningCode('UNDEFINED_SUPER_SETTER',
+          "The setter '{0}' is not defined in a superclass of '{1}'");
+
+  /**
+   * 12.15.1 Ordinary Invocation: It is a static type warning if <i>T</i> does
+   * not have an accessible (3.2) instance member named <i>m</i>.
+   *
+   * This is a specialization of [INSTANCE_ACCESS_TO_STATIC_MEMBER] that is used
+   * when we are able to find the name defined in a supertype. It exists to
+   * provide a more informative error message.
+   */
+  static const StaticTypeWarningCode UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER =
+      const StaticTypeWarningCode(
+          'UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER',
+          "Static members from supertypes must be qualified by the name of the defining type");
+
+  /**
+   * 15.8 Parameterized Types: It is a static type warning if <i>G</i> is not a
+   * generic type with exactly <i>n</i> type parameters.
+   *
+   * Parameters:
+   * 0: the name of the type being referenced (<i>G</i>)
+   * 1: the number of type parameters that were declared
+   * 2: the number of type arguments provided
+   *
+   * See [CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS], and
+   * [CompileTimeErrorCode.NEW_WITH_INVALID_TYPE_PARAMETERS].
+   */
+  static const StaticTypeWarningCode WRONG_NUMBER_OF_TYPE_ARGUMENTS =
+      const StaticTypeWarningCode('WRONG_NUMBER_OF_TYPE_ARGUMENTS',
+          "The type '{0}' is declared with {1} type parameters, but {2} type arguments were given");
+
+  /**
+   * 17.16.1 Yield: Let T be the static type of e [the expression to the right
+   * of "yield"] and let f be the immediately enclosing function.  It is a
+   * static type warning if either:
+   *
+   * - the body of f is marked async* and the type Stream<T> may not be
+   *   assigned to the declared return type of f.
+   *
+   * - the body of f is marked sync* and the type Iterable<T> may not be
+   *   assigned to the declared return type of f.
+   *
+   * 17.16.2 Yield-Each: Let T be the static type of e [the expression to the
+   * right of "yield*"] and let f be the immediately enclosing function.  It is
+   * a static type warning if T may not be assigned to the declared return type
+   * of f.  If f is synchronous it is a static type warning if T may not be
+   * assigned to Iterable.  If f is asynchronous it is a static type warning if
+   * T may not be assigned to Stream.
+   */
+  static const StaticTypeWarningCode YIELD_OF_INVALID_TYPE =
+      const StaticTypeWarningCode('YIELD_OF_INVALID_TYPE',
+          "The type '{0}' implied by the 'yield' expression must be assignable to '{1}'");
+
+  /**
+   * Initialize a newly created error code to have the given [name]. The message
+   * associated with the error will be created from the given [message]
+   * template. The correction associated with the error will be created from the
+   * given [correction] template.
+   */
+  const StaticTypeWarningCode(String name, String message, [String correction])
+      : super(name, message, correction);
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorType.STATIC_TYPE_WARNING.severity;
+
+  @override
+  ErrorType get type => ErrorType.STATIC_TYPE_WARNING;
+}
+
+/**
+ * The error codes used for static warnings. The convention for this class is
+ * for the name of the error code to indicate the problem that caused the error
+ * to be generated and for the error message to explain what is wrong and, when
+ * appropriate, how the problem can be corrected.
+ */
+class StaticWarningCode extends ErrorCode {
+  /**
+   * 14.1 Imports: If a name <i>N</i> is referenced by a library <i>L</i> and
+   * <i>N</i> is introduced into the top level scope <i>L</i> by more than one
+   * import then:
+   * 1. A static warning occurs.
+   * 2. If <i>N</i> is referenced as a function, getter or setter, a
+   *    <i>NoSuchMethodError</i> is raised.
+   * 3. If <i>N</i> is referenced as a type, it is treated as a malformed type.
+   *
+   * Parameters:
+   * 0: the name of the ambiguous type
+   * 1: the name of the first library that the type is found
+   * 2: the name of the second library that the type is found
+   */
+  static const StaticWarningCode AMBIGUOUS_IMPORT = const StaticWarningCode(
+      'AMBIGUOUS_IMPORT', "The name '{0}' is defined in the libraries {1}",
+      "Consider using 'as prefix' for one of the import directives "
+      "or hiding the name from all but one of the imports.");
+
+  /**
+   * 12.11.1 New: It is a static warning if the static type of <i>a<sub>i</sub>,
+   * 1 &lt;= i &lt;= n+ k</i> may not be assigned to the type of the
+   * corresponding formal parameter of the constructor <i>T.id</i> (respectively
+   * <i>T</i>).
+   *
+   * 12.11.2 Const: It is a static warning if the static type of
+   * <i>a<sub>i</sub>, 1 &lt;= i &lt;= n+ k</i> may not be assigned to the type
+   * of the corresponding formal parameter of the constructor <i>T.id</i>
+   * (respectively <i>T</i>).
+   *
+   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static
+   * type of <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of
+   * <i>p<sub>i</sub>, 1 &lt;= i &lt;= n+k</i> and let <i>S<sub>q</sub></i> be
+   * the type of the named parameter <i>q</i> of <i>f</i>. It is a static
+   * warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1
+   * &lt;= j &lt;= m</i>.
+   *
+   * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub>, 1
+   * &lt;= i &lt;= l</i>, must have a corresponding named parameter in the set
+   * <i>{p<sub>n+1</sub>, &hellip; p<sub>n+k</sub>}</i> or a static warning
+   * occurs. It is a static warning if <i>T<sub>m+j</sub></i> may not be
+   * assigned to <i>S<sub>r</sub></i>, where <i>r = q<sub>j</sub>, 1 &lt;= j
+   * &lt;= l</i>.
+   *
+   * Parameters:
+   * 0: the name of the actual argument type
+   * 1: the name of the expected type
+   */
+  static const StaticWarningCode ARGUMENT_TYPE_NOT_ASSIGNABLE =
+      const StaticWarningCode('ARGUMENT_TYPE_NOT_ASSIGNABLE',
+          "The argument type '{0}' cannot be assigned to the parameter type '{1}'");
+
+  /**
+   * 5 Variables: Attempting to assign to a final variable elsewhere will cause
+   * a NoSuchMethodError to be thrown, because no setter is defined for it. The
+   * assignment will also give rise to a static warning for the same reason.
+   *
+   * A constant variable is always implicitly final.
+   */
+  static const StaticWarningCode ASSIGNMENT_TO_CONST = const StaticWarningCode(
+      'ASSIGNMENT_TO_CONST', "Constant variables cannot be assigned a value");
+
+  /**
+   * 5 Variables: Attempting to assign to a final variable elsewhere will cause
+   * a NoSuchMethodError to be thrown, because no setter is defined for it. The
+   * assignment will also give rise to a static warning for the same reason.
+   */
+  static const StaticWarningCode ASSIGNMENT_TO_FINAL = const StaticWarningCode(
+      'ASSIGNMENT_TO_FINAL', "'{0}' cannot be used as a setter, it is final");
+
+  /**
+   * 5 Variables: Attempting to assign to a final variable elsewhere will cause
+   * a NoSuchMethodError to be thrown, because no setter is defined for it. The
+   * assignment will also give rise to a static warning for the same reason.
+   */
+  static const StaticWarningCode ASSIGNMENT_TO_FINAL_NO_SETTER =
+      const StaticWarningCode('ASSIGNMENT_TO_FINAL_NO_SETTER',
+          "No setter named '{0}' in class '{1}'");
+
+  /**
+   * 12.18 Assignment: It is as static warning if an assignment of the form
+   * <i>v = e</i> occurs inside a top level or static function (be it function,
+   * method, getter, or setter) or variable initializer and there is neither a
+   * local variable declaration with name <i>v</i> nor setter declaration with
+   * name <i>v=</i> in the lexical scope enclosing the assignment.
+   */
+  static const StaticWarningCode ASSIGNMENT_TO_FUNCTION =
+      const StaticWarningCode(
+          'ASSIGNMENT_TO_FUNCTION', "Functions cannot be assigned a value");
+
+  /**
+   * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>
+   * It is a static type warning if <i>T</i> does not have an accessible
+   * instance setter named <i>v=</i>.
+   */
+  static const StaticWarningCode ASSIGNMENT_TO_METHOD = const StaticWarningCode(
+      'ASSIGNMENT_TO_METHOD', "Methods cannot be assigned a value");
+
+  /**
+   * 12.18 Assignment: It is as static warning if an assignment of the form
+   * <i>v = e</i> occurs inside a top level or static function (be it function,
+   * method, getter, or setter) or variable initializer and there is neither a
+   * local variable declaration with name <i>v</i> nor setter declaration with
+   * name <i>v=</i> in the lexical scope enclosing the assignment.
+   */
+  static const StaticWarningCode ASSIGNMENT_TO_TYPE = const StaticWarningCode(
+      'ASSIGNMENT_TO_TYPE', "Types cannot be assigned a value");
+
+  /**
+   * 13.9 Switch: It is a static warning if the last statement of the statement
+   * sequence <i>s<sub>k</sub></i> is not a break, continue, return or throw
+   * statement.
+   */
+  static const StaticWarningCode CASE_BLOCK_NOT_TERMINATED =
+      const StaticWarningCode('CASE_BLOCK_NOT_TERMINATED',
+          "The last statement of the 'case' should be 'break', 'continue', 'return' or 'throw'");
+
+  /**
+   * 12.32 Type Cast: It is a static warning if <i>T</i> does not denote a type
+   * available in the current lexical scope.
+   */
+  static const StaticWarningCode CAST_TO_NON_TYPE = const StaticWarningCode(
+      'CAST_TO_NON_TYPE',
+      "The name '{0}' is not a type and cannot be used in an 'as' expression");
+
+  /**
+   * 7.4 Abstract Instance Members: It is a static warning if an abstract member
+   * is declared or inherited in a concrete class.
+   */
+  static const StaticWarningCode CONCRETE_CLASS_WITH_ABSTRACT_MEMBER =
+      const StaticWarningCode('CONCRETE_CLASS_WITH_ABSTRACT_MEMBER',
+          "'{0}' must have a method body because '{1}' is not abstract");
+
+  /**
+   * 14.1 Imports: If a name <i>N</i> is referenced by a library <i>L</i> and
+   * <i>N</i> would be introduced into the top level scope of <i>L</i> by an
+   * import from a library whose URI begins with <i>dart:</i> and an import from
+   * a library whose URI does not begin with <i>dart:</i>:
+   * * The import from <i>dart:</i> is implicitly extended by a hide N clause.
+   * * A static warning is issued.
+   *
+   * Parameters:
+   * 0: the ambiguous name
+   * 1: the name of the dart: library in which the element is found
+   * 1: the name of the non-dart: library in which the element is found
+   */
+  static const StaticWarningCode CONFLICTING_DART_IMPORT =
+      const StaticWarningCode('CONFLICTING_DART_IMPORT',
+          "Element '{0}' from SDK library '{1}' is implicitly hidden by '{2}'");
+
+  /**
+   * 7.2 Getters: It is a static warning if a class <i>C</i> declares an
+   * instance getter named <i>v</i> and an accessible static member named
+   * <i>v</i> or <i>v=</i> is declared in a superclass of <i>C</i>.
+   *
+   * Parameters:
+   * 0: the name of the super class declaring a static member
+   */
+  static const StaticWarningCode CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER =
+      const StaticWarningCode(
+          'CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER',
+          "Superclass '{0}' declares static member with the same name");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares
+   * an instance method named <i>n</i> and has a setter named <i>n=</i>.
+   */
+  static const StaticWarningCode CONFLICTING_INSTANCE_METHOD_SETTER =
+      const StaticWarningCode('CONFLICTING_INSTANCE_METHOD_SETTER',
+          "Class '{0}' declares instance method '{1}', but also has a setter with the same name from '{2}'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares
+   * an instance method named <i>n</i> and has a setter named <i>n=</i>.
+   */
+  static const StaticWarningCode CONFLICTING_INSTANCE_METHOD_SETTER2 =
+      const StaticWarningCode('CONFLICTING_INSTANCE_METHOD_SETTER2',
+          "Class '{0}' declares the setter '{1}', but also has an instance method in the same class");
+
+  /**
+   * 7.3 Setters: It is a static warning if a class <i>C</i> declares an
+   * instance setter named <i>v=</i> and an accessible static member named
+   * <i>v=</i> or <i>v</i> is declared in a superclass of <i>C</i>.
+   *
+   * Parameters:
+   * 0: the name of the super class declaring a static member
+   */
+  static const StaticWarningCode CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER =
+      const StaticWarningCode(
+          'CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER',
+          "Superclass '{0}' declares static member with the same name");
+
+  /**
+   * 7.2 Getters: It is a static warning if a class declares a static getter
+   * named <i>v</i> and also has a non-static setter named <i>v=</i>.
+   */
+  static const StaticWarningCode CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER =
+      const StaticWarningCode('CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER',
+          "Class '{0}' declares non-static setter with the same name");
+
+  /**
+   * 7.3 Setters: It is a static warning if a class declares a static setter
+   * named <i>v=</i> and also has a non-static member named <i>v</i>.
+   */
+  static const StaticWarningCode CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER =
+      const StaticWarningCode('CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER',
+          "Class '{0}' declares non-static member with the same name");
+
+  /**
+   * 12.11.2 Const: Given an instance creation expression of the form <i>const
+   * q(a<sub>1</sub>, &hellip; a<sub>n</sub>)</i> it is a static warning if
+   * <i>q</i> is the constructor of an abstract class but <i>q</i> is not a
+   * factory constructor.
+   */
+  static const StaticWarningCode CONST_WITH_ABSTRACT_CLASS =
+      const StaticWarningCode('CONST_WITH_ABSTRACT_CLASS',
+          "Abstract classes cannot be created with a 'const' expression");
+
+  /**
+   * 12.7 Maps: It is a static warning if the values of any two keys in a map
+   * literal are equal.
+   */
+  static const StaticWarningCode EQUAL_KEYS_IN_MAP = const StaticWarningCode(
+      'EQUAL_KEYS_IN_MAP', "Keys in a map cannot be equal");
+
+  /**
+   * 14.2 Exports: It is a static warning to export two different libraries with
+   * the same name.
+   *
+   * Parameters:
+   * 0: the uri pointing to a first library
+   * 1: the uri pointing to a second library
+   * 2:e the shared name of the exported libraries
+   */
+  static const StaticWarningCode EXPORT_DUPLICATED_LIBRARY_NAMED =
+      const StaticWarningCode('EXPORT_DUPLICATED_LIBRARY_NAMED',
+          "The exported libraries '{0}' and '{1}' cannot have the same name '{2}'");
+
+  /**
+   * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt;
+   * h</i> or if <i>m &gt; n</i>.
+   *
+   * Parameters:
+   * 0: the maximum number of positional arguments
+   * 1: the actual number of positional arguments given
+   *
+   * See [NOT_ENOUGH_REQUIRED_ARGUMENTS].
+   */
+  static const StaticWarningCode EXTRA_POSITIONAL_ARGUMENTS =
+      const StaticWarningCode('EXTRA_POSITIONAL_ARGUMENTS',
+          "{0} positional arguments expected, but {1} found");
+
+  /**
+   * 5. Variables: It is a static warning if a final instance variable that has
+   * been initialized at its point of declaration is also initialized in a
+   * constructor.
+   */
+  static const StaticWarningCode FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION =
+      const StaticWarningCode(
+          'FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION',
+          "Values cannot be set in the constructor if they are final, and have already been set");
+
+  /**
+   * 5. Variables: It is a static warning if a final instance variable that has
+   * been initialized at its point of declaration is also initialized in a
+   * constructor.
+   *
+   * Parameters:
+   * 0: the name of the field in question
+   */
+  static const StaticWarningCode FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR =
+      const StaticWarningCode(
+          'FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR',
+          "'{0}' is final and was given a value when it was declared, so it cannot be set to a new value");
+
+  /**
+   * 7.6.1 Generative Constructors: Execution of an initializer of the form
+   * <b>this</b>.<i>v</i> = <i>e</i> proceeds as follows: First, the expression
+   * <i>e</i> is evaluated to an object <i>o</i>. Then, the instance variable
+   * <i>v</i> of the object denoted by this is bound to <i>o</i>.
+   *
+   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static
+   * type of <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of
+   * <i>p<sub>i</sub>, 1 &lt;= i &lt;= n+k</i> and let <i>S<sub>q</sub></i> be
+   * the type of the named parameter <i>q</i> of <i>f</i>. It is a static
+   * warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1
+   * &lt;= j &lt;= m</i>.
+   *
+   * Parameters:
+   * 0: the name of the type of the initializer expression
+   * 1: the name of the type of the field
+   */
+  static const StaticWarningCode FIELD_INITIALIZER_NOT_ASSIGNABLE =
+      const StaticWarningCode('FIELD_INITIALIZER_NOT_ASSIGNABLE',
+          "The initializer type '{0}' cannot be assigned to the field type '{1}'");
+
+  /**
+   * 7.6.1 Generative Constructors: An initializing formal has the form
+   * <i>this.id</i>. It is a static warning if the static type of <i>id</i> is
+   * not assignable to <i>T<sub>id</sub></i>.
+   *
+   * Parameters:
+   * 0: the name of the type of the field formal parameter
+   * 1: the name of the type of the field
+   */
+  static const StaticWarningCode FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE =
+      const StaticWarningCode('FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE',
+          "The parameter type '{0}' is incompatable with the field type '{1}'");
+
+  /**
+   * 5 Variables: It is a static warning if a library, static or local variable
+   * <i>v</i> is final and <i>v</i> is not initialized at its point of
+   * declaration.
+   *
+   * Parameters:
+   * 0: the name of the uninitialized final variable
+   */
+  static const StaticWarningCode FINAL_NOT_INITIALIZED =
+      const StaticWarningCode('FINAL_NOT_INITIALIZED',
+          "The final variable '{0}' must be initialized");
+
+  /**
+   * 7.6.1 Generative Constructors: Each final instance variable <i>f</i>
+   * declared in the immediately enclosing class must have an initializer in
+   * <i>k</i>'s initializer list unless it has already been initialized by one
+   * of the following means:
+   * * Initialization at the declaration of <i>f</i>.
+   * * Initialization by means of an initializing formal of <i>k</i>.
+   * or a static warning occurs.
+   *
+   * Parameters:
+   * 0: the name of the uninitialized final variable
+   */
+  static const StaticWarningCode FINAL_NOT_INITIALIZED_CONSTRUCTOR_1 =
+      const StaticWarningCode('FINAL_NOT_INITIALIZED_CONSTRUCTOR_1',
+          "The final variable '{0}' must be initialized");
+
+  /**
+   * 7.6.1 Generative Constructors: Each final instance variable <i>f</i>
+   * declared in the immediately enclosing class must have an initializer in
+   * <i>k</i>'s initializer list unless it has already been initialized by one
+   * of the following means:
+   * * Initialization at the declaration of <i>f</i>.
+   * * Initialization by means of an initializing formal of <i>k</i>.
+   * or a static warning occurs.
+   *
+   * Parameters:
+   * 0: the name of the uninitialized final variable
+   * 1: the name of the uninitialized final variable
+   */
+  static const StaticWarningCode FINAL_NOT_INITIALIZED_CONSTRUCTOR_2 =
+      const StaticWarningCode('FINAL_NOT_INITIALIZED_CONSTRUCTOR_2',
+          "The final variables '{0}' and '{1}' must be initialized");
+
+  /**
+   * 7.6.1 Generative Constructors: Each final instance variable <i>f</i>
+   * declared in the immediately enclosing class must have an initializer in
+   * <i>k</i>'s initializer list unless it has already been initialized by one
+   * of the following means:
+   * * Initialization at the declaration of <i>f</i>.
+   * * Initialization by means of an initializing formal of <i>k</i>.
+   * or a static warning occurs.
+   *
+   * Parameters:
+   * 0: the name of the uninitialized final variable
+   * 1: the name of the uninitialized final variable
+   * 2: the number of additional not initialized variables that aren't listed
+   */
+  static const StaticWarningCode FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS =
+      const StaticWarningCode('FINAL_NOT_INITIALIZED_CONSTRUCTOR_3',
+          "The final variables '{0}', '{1}' and '{2}' more must be initialized");
+
+  /**
+   * 15.5 Function Types: It is a static warning if a concrete class implements
+   * Function and does not have a concrete method named call().
+   */
+  static const StaticWarningCode FUNCTION_WITHOUT_CALL = const StaticWarningCode(
+      'FUNCTION_WITHOUT_CALL',
+      "Concrete classes that implement Function must implement the method call()");
+
+  /**
+   * 14.1 Imports: It is a static warning to import two different libraries with
+   * the same name.
+   *
+   * Parameters:
+   * 0: the uri pointing to a first library
+   * 1: the uri pointing to a second library
+   * 2: the shared name of the imported libraries
+   */
+  static const StaticWarningCode IMPORT_DUPLICATED_LIBRARY_NAMED =
+      const StaticWarningCode('IMPORT_DUPLICATED_LIBRARY_NAMED',
+          "The imported libraries '{0}' and '{1}' cannot have the same name '{2}'");
+
+  /**
+   * 14.1 Imports: It is a static warning if the specified URI of a deferred
+   * import does not refer to a library declaration.
+   *
+   * Parameters:
+   * 0: the uri pointing to a non-library declaration
+   *
+   * See [CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY].
+   */
+  static const StaticWarningCode IMPORT_OF_NON_LIBRARY =
+      const StaticWarningCode('IMPORT_OF_NON_LIBRARY',
+          "The imported library '{0}' must not have a part-of directive");
+
+  /**
+   * 8.1.1 Inheritance and Overriding: However, if the above rules would cause
+   * multiple members <i>m<sub>1</sub>, &hellip;, m<sub>k</sub></i> with the
+   * same name <i>n</i> that would be inherited (because identically named
+   * members existed in several superinterfaces) then at most one member is
+   * inherited.
+   *
+   * If some but not all of the <i>m<sub>i</sub>, 1 &lt;= i &lt;= k</i> are
+   * getters none of the <i>m<sub>i</sub></i> are inherited, and a static
+   * warning is issued.
+   */
+  static const StaticWarningCode INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD =
+      const StaticWarningCode(
+          'INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD',
+          "'{0}' is inherited as a getter and also a method");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares
+   * an instance method named <i>n</i> and an accessible static member named
+   * <i>n</i> is declared in a superclass of <i>C</i>.
+   *
+   * Parameters:
+   * 0: the name of the member with the name conflict
+   * 1: the name of the enclosing class that has the static member
+   */
+  static const StaticWarningCode INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC =
+      const StaticWarningCode(
+          'INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC',
+          "'{0}' collides with a static member in the superclass '{1}'");
+
+  /**
+   * 7.2 Getters: It is a static warning if a getter <i>m1</i> overrides a
+   * getter <i>m2</i> and the type of <i>m1</i> is not a subtype of the type of
+   * <i>m2</i>.
+   *
+   * Parameters:
+   * 0: the name of the actual return type
+   * 1: the name of the expected return type, not assignable to the actual
+   *    return type
+   * 2: the name of the class where the overridden getter is declared
+   *
+   * See [INVALID_METHOD_OVERRIDE_RETURN_TYPE].
+   */
+  static const StaticWarningCode INVALID_GETTER_OVERRIDE_RETURN_TYPE =
+      const StaticWarningCode('INVALID_GETTER_OVERRIDE_RETURN_TYPE',
+          "The return type '{0}' is not assignable to '{1}' as required by the getter it is overriding from '{2}'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method
+   * <i>m1</i> overrides an instance method <i>m2</i> and the type of <i>m1</i>
+   * is not a subtype of the type of <i>m2</i>.
+   *
+   * Parameters:
+   * 0: the name of the actual parameter type
+   * 1: the name of the expected parameter type, not assignable to the actual
+   *    parameter type
+   * 2: the name of the class where the overridden method is declared
+   */
+  static const StaticWarningCode INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE =
+      const StaticWarningCode('INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE',
+          "The parameter type '{0}' is not assignable to '{1}' as required by the method it is overriding from '{2}'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method
+   * <i>m1</i> overrides an instance method <i>m2</i> and the type of <i>m1</i>
+   * is not a subtype of the type of <i>m2</i>.
+   *
+   * Parameters:
+   * 0: the name of the actual parameter type
+   * 1: the name of the expected parameter type, not assignable to the actual
+   *    parameter type
+   * 2: the name of the class where the overridden method is declared
+   * See [INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE].
+   */
+  static const StaticWarningCode INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE =
+      const StaticWarningCode('INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE',
+          "The parameter type '{0}' is not assignable to '{1}' as required by the method it is overriding from '{2}'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method
+   * <i>m1</i> overrides an instance method <i>m2</i> and the type of <i>m1</i>
+   * is not a subtype of the type of <i>m2</i>.
+   *
+   * Parameters:
+   * 0: the name of the actual parameter type
+   * 1: the name of the expected parameter type, not assignable to the actual
+   *    parameter type
+   * 2: the name of the class where the overridden method is declared
+   */
+  static const StaticWarningCode INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE =
+      const StaticWarningCode('INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE',
+          "The parameter type '{0}' is not assignable to '{1}' as required by the method it is overriding from '{2}'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method
+   * <i>m1</i> overrides an instance method <i>m2</i> and the type of <i>m1</i>
+   * is not a subtype of the type of <i>m2</i>.
+   *
+   * Parameters:
+   * 0: the name of the actual return type
+   * 1: the name of the expected return type, not assignable to the actual
+   *    return type
+   * 2: the name of the class where the overridden method is declared
+   *
+   * See [INVALID_GETTER_OVERRIDE_RETURN_TYPE].
+   */
+  static const StaticWarningCode INVALID_METHOD_OVERRIDE_RETURN_TYPE =
+      const StaticWarningCode('INVALID_METHOD_OVERRIDE_RETURN_TYPE',
+          "The return type '{0}' is not assignable to '{1}' as required by the method it is overriding from '{2}'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method
+   * <i>m1</i> overrides an instance member <i>m2</i>, the signature of
+   * <i>m2</i> explicitly specifies a default value for a formal parameter
+   * <i>p</i> and the signature of <i>m1</i> specifies a different default value
+   * for <i>p</i>.
+   */
+  static const StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED =
+      const StaticWarningCode('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED',
+          "Parameters cannot override default values, this method overrides '{0}.{1}' where '{2}' has a different value");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method
+   * <i>m1</i> overrides an instance member <i>m2</i>, the signature of
+   * <i>m2</i> explicitly specifies a default value for a formal parameter
+   * <i>p</i> and the signature of <i>m1</i> specifies a different default value
+   * for <i>p</i>.
+   */
+  static const StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL =
+      const StaticWarningCode(
+          'INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL',
+          "Parameters cannot override default values, this method overrides '{0}.{1}' where this positional parameter has a different value");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method
+   * <i>m1</i> overrides an instance member <i>m2</i> and <i>m1</i> does not
+   * declare all the named parameters declared by <i>m2</i>.
+   *
+   * Parameters:
+   * 0: the number of named parameters in the overridden member
+   * 1: the name of the class from the overridden method
+   */
+  static const StaticWarningCode INVALID_OVERRIDE_NAMED = const StaticWarningCode(
+      'INVALID_OVERRIDE_NAMED',
+      "Missing the named parameter '{0}' to match the overridden method from '{1}'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method
+   * <i>m1</i> overrides an instance member <i>m2</i> and <i>m1</i> has fewer
+   * positional parameters than <i>m2</i>.
+   *
+   * Parameters:
+   * 0: the number of positional parameters in the overridden member
+   * 1: the name of the class from the overridden method
+   */
+  static const StaticWarningCode INVALID_OVERRIDE_POSITIONAL =
+      const StaticWarningCode('INVALID_OVERRIDE_POSITIONAL',
+          "Must have at least {0} parameters to match the overridden method from '{1}'");
+
+  /**
+   * 7.1 Instance Methods: It is a static warning if an instance method
+   * <i>m1</i> overrides an instance member <i>m2</i> and <i>m1</i> has a
+   * greater number of required parameters than <i>m2</i>.
+   *
+   * Parameters:
+   * 0: the number of required parameters in the overridden member
+   * 1: the name of the class from the overridden method
+   */
+  static const StaticWarningCode INVALID_OVERRIDE_REQUIRED =
+      const StaticWarningCode('INVALID_OVERRIDE_REQUIRED',
+          "Must have {0} required parameters or less to match the overridden method from '{1}'");
+
+  /**
+   * 7.3 Setters: It is a static warning if a setter <i>m1</i> overrides a
+   * setter <i>m2</i> and the type of <i>m1</i> is not a subtype of the type of
+   * <i>m2</i>.
+   *
+   * Parameters:
+   * 0: the name of the actual parameter type
+   * 1: the name of the expected parameter type, not assignable to the actual
+   * parameter type
+   * 2: the name of the class where the overridden setter is declared
+   *
+   * See [INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE].
+   */
+  static const StaticWarningCode INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE =
+      const StaticWarningCode('INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE',
+          "The parameter type '{0}' is not assignable to '{1}' as required by the setter it is overriding from '{2}'");
+
+  /**
+   * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i>
+   * &hellip; <i>e<sub>n</sub></i>] is evaluated as follows:
+   * * The operator []= is invoked on <i>a</i> with first argument <i>i</i> and
+   *   second argument <i>o<sub>i+1</sub></i><i>, 1 &lt;= i &lt;= n</i>
+   *
+   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static
+   * type of <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of
+   * <i>p<sub>i</sub>, 1 &lt;= i &lt;= n+k</i> and let <i>S<sub>q</sub></i> be
+   * the type of the named parameter <i>q</i> of <i>f</i>. It is a static
+   * warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1
+   * &lt;= j &lt;= m</i>.
+   */
+  static const StaticWarningCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE =
+      const StaticWarningCode('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE',
+          "The element type '{0}' cannot be assigned to the list type '{1}'");
+
+  /**
+   * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt;
+   * [<i>k<sub>1</sub></i> : <i>e<sub>1</sub></i> &hellip; <i>k<sub>n</sub></i>
+   * : <i>e<sub>n</sub></i>] is evaluated as follows:
+   * * The operator []= is invoked on <i>m</i> with first argument
+   *   <i>k<sub>i</sub></i> and second argument <i>e<sub>i</sub></i><i>, 1 &lt;=
+   *   i &lt;= n</i>
+   *
+   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static
+   * type of <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of
+   * <i>p<sub>i</sub>, 1 &lt;= i &lt;= n+k</i> and let <i>S<sub>q</sub></i> be
+   * the type of the named parameter <i>q</i> of <i>f</i>. It is a static
+   * warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1
+   * &lt;= j &lt;= m</i>.
+   */
+  static const StaticWarningCode MAP_KEY_TYPE_NOT_ASSIGNABLE =
+      const StaticWarningCode('MAP_KEY_TYPE_NOT_ASSIGNABLE',
+          "The element type '{0}' cannot be assigned to the map key type '{1}'");
+
+  /**
+   * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt;
+   * [<i>k<sub>1</sub></i> : <i>e<sub>1</sub></i> &hellip; <i>k<sub>n</sub></i>
+   * : <i>e<sub>n</sub></i>] is evaluated as follows:
+   * * The operator []= is invoked on <i>m</i> with first argument
+   *   <i>k<sub>i</sub></i> and second argument <i>e<sub>i</sub></i><i>, 1 &lt;=
+   *   i &lt;= n</i>
+   *
+   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static
+   * type of <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of
+   * <i>p<sub>i</sub>, 1 &lt;= i &lt;= n+k</i> and let <i>S<sub>q</sub></i> be
+   * the type of the named parameter <i>q</i> of <i>f</i>. It is a static
+   * warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1
+   * &lt;= j &lt;= m</i>.
+   */
+  static const StaticWarningCode MAP_VALUE_TYPE_NOT_ASSIGNABLE =
+      const StaticWarningCode('MAP_VALUE_TYPE_NOT_ASSIGNABLE',
+          "The element type '{0}' cannot be assigned to the map value type '{1}'");
+
+  /**
+   * 7.3 Setters: It is a static warning if a class has a setter named <i>v=</i>
+   * with argument type <i>T</i> and a getter named <i>v</i> with return type
+   * <i>S</i>, and <i>T</i> may not be assigned to <i>S</i>.
+   */
+  static const StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES =
+      const StaticWarningCode('MISMATCHED_GETTER_AND_SETTER_TYPES',
+          "The parameter type for setter '{0}' is '{1}' which is not assignable to its getter (of type '{2}')");
+
+  /**
+   * 7.3 Setters: It is a static warning if a class has a setter named <i>v=</i>
+   * with argument type <i>T</i> and a getter named <i>v</i> with return type
+   * <i>S</i>, and <i>T</i> may not be assigned to <i>S</i>.
+   */
+  static const StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE =
+      const StaticWarningCode(
+          'MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE',
+          "The parameter type for setter '{0}' is '{1}' which is not assignable to its getter (of type '{2}'), from superclass '{3}'");
+
+  /**
+   * 13.12 Return: It is a static warning if a function contains both one or
+   * more return statements of the form <i>return;</i> and one or more return
+   * statements of the form <i>return e;</i>.
+   */
+  static const StaticWarningCode MIXED_RETURN_TYPES = const StaticWarningCode(
+      'MIXED_RETURN_TYPES',
+      "Methods and functions cannot use return both with and without values");
+
+  /**
+   * 12.11.1 New: It is a static warning if <i>q</i> is a constructor of an
+   * abstract class and <i>q</i> is not a factory constructor.
+   */
+  static const StaticWarningCode NEW_WITH_ABSTRACT_CLASS =
+      const StaticWarningCode('NEW_WITH_ABSTRACT_CLASS',
+          "Abstract classes cannot be created with a 'new' expression");
+
+  /**
+   * 15.8 Parameterized Types: Any use of a malbounded type gives rise to a
+   * static warning.
+   *
+   * Parameters:
+   * 0: the name of the type being referenced (<i>S</i>)
+   * 1: the number of type parameters that were declared
+   * 2: the number of type arguments provided
+   *
+   * See [CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS], and
+   * [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS].
+   */
+  static const StaticWarningCode NEW_WITH_INVALID_TYPE_PARAMETERS =
+      const StaticWarningCode('NEW_WITH_INVALID_TYPE_PARAMETERS',
+          "The type '{0}' is declared with {1} type parameters, but {2} type arguments were given");
+
+  /**
+   * 12.11.1 New: It is a static warning if <i>T</i> is not a class accessible
+   * in the current scope, optionally followed by type arguments.
+   *
+   * Parameters:
+   * 0: the name of the non-type element
+   */
+  static const StaticWarningCode NEW_WITH_NON_TYPE = const StaticWarningCode(
+      'NEW_WITH_NON_TYPE', "The name '{0}' is not a class");
+
+  /**
+   * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the
+   * current scope then:
+   * 1. If <i>e</i> is of the form <i>new T.id(a<sub>1</sub>, &hellip;,
+   *    a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;,
+   *    x<sub>n+k</sub>: a<sub>n+k</sub>)</i> it is a static warning if
+   *    <i>T.id</i> is not the name of a constructor declared by the type
+   *    <i>T</i>.
+   * If <i>e</i> of the form <i>new T(a<sub>1</sub>, &hellip;, a<sub>n</sub>,
+   * x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>:
+   * a<sub>n+kM/sub>)</i> it is a static warning if the type <i>T</i> does not
+   * declare a constructor with the same name as the declaration of <i>T</i>.
+   */
+  static const StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR =
+      const StaticWarningCode('NEW_WITH_UNDEFINED_CONSTRUCTOR',
+          "The class '{0}' does not have a constructor '{1}'");
+
+  /**
+   * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the
+   * current scope then:
+   * 1. If <i>e</i> is of the form <i>new T.id(a<sub>1</sub>, &hellip;,
+   * a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>:
+   * a<sub>n+k</sub>)</i> it is a static warning if <i>T.id</i> is not the name
+   * of a constructor declared by the type <i>T</i>. If <i>e</i> of the form
+   * <i>new T(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
+   * a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+kM/sub>)</i> it is a
+   * static warning if the type <i>T</i> does not declare a constructor with the
+   * same name as the declaration of <i>T</i>.
+   */
+  static const StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT =
+      const StaticWarningCode('NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT',
+          "The class '{0}' does not have a default constructor");
+
+  /**
+   * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract
+   * class inherits an abstract method.
+   *
+   * 7.10 Superinterfaces: Let <i>C</i> be a concrete class that does not
+   * declare its own <i>noSuchMethod()</i> method. It is a static warning if the
+   * implicit interface of <i>C</i> includes an instance member <i>m</i> of type
+   * <i>F</i> and <i>C</i> does not declare or inherit a corresponding instance
+   * member <i>m</i> of type <i>F'</i> such that <i>F' <: F</i>.
+   *
+   * 7.4 Abstract Instance Members: It is a static warning if an abstract member
+   * is declared or inherited in a concrete class unless that member overrides a
+   * concrete one.
+   *
+   * Parameters:
+   * 0: the name of the first member
+   * 1: the name of the second member
+   * 2: the name of the third member
+   * 3: the name of the fourth member
+   * 4: the number of additional missing members that aren't listed
+   */
+  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS =
+      const StaticWarningCode(
+          'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS',
+          "Missing concrete implementation of {0}, {1}, {2}, {3} and {4} more");
+
+  /**
+   * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract
+   * class inherits an abstract method.
+   *
+   * 7.10 Superinterfaces: Let <i>C</i> be a concrete class that does not
+   * declare its own <i>noSuchMethod()</i> method. It is a static warning if the
+   * implicit interface of <i>C</i> includes an instance member <i>m</i> of type
+   * <i>F</i> and <i>C</i> does not declare or inherit a corresponding instance
+   * member <i>m</i> of type <i>F'</i> such that <i>F' <: F</i>.
+   *
+   * 7.4 Abstract Instance Members: It is a static warning if an abstract member
+   * is declared or inherited in a concrete class unless that member overrides a
+   * concrete one.
+   *
+   * Parameters:
+   * 0: the name of the first member
+   * 1: the name of the second member
+   * 2: the name of the third member
+   * 3: the name of the fourth member
+   */
+  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR =
+      const StaticWarningCode(
+          'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR',
+          "Missing concrete implementation of {0}, {1}, {2} and {3}");
+
+  /**
+   * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract
+   * class inherits an abstract method.
+   *
+   * 7.10 Superinterfaces: Let <i>C</i> be a concrete class that does not
+   * declare its own <i>noSuchMethod()</i> method. It is a static warning if the
+   * implicit interface of <i>C</i> includes an instance member <i>m</i> of type
+   * <i>F</i> and <i>C</i> does not declare or inherit a corresponding instance
+   * member <i>m</i> of type <i>F'</i> such that <i>F' <: F</i>.
+   *
+   * 7.4 Abstract Instance Members: It is a static warning if an abstract member
+   * is declared or inherited in a concrete class unless that member overrides a
+   * concrete one.
+   *
+   * Parameters:
+   * 0: the name of the member
+   */
+  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE =
+      const StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE',
+          "Missing concrete implementation of {0}");
+
+  /**
+   * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract
+   * class inherits an abstract method.
+   *
+   * 7.10 Superinterfaces: Let <i>C</i> be a concrete class that does not
+   * declare its own <i>noSuchMethod()</i> method. It is a static warning if the
+   * implicit interface of <i>C</i> includes an instance member <i>m</i> of type
+   * <i>F</i> and <i>C</i> does not declare or inherit a corresponding instance
+   * member <i>m</i> of type <i>F'</i> such that <i>F' <: F</i>.
+   *
+   * 7.4 Abstract Instance Members: It is a static warning if an abstract member
+   * is declared or inherited in a concrete class unless that member overrides a
+   * concrete one.
+   *
+   * Parameters:
+   * 0: the name of the first member
+   * 1: the name of the second member
+   * 2: the name of the third member
+   */
+  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE =
+      const StaticWarningCode(
+          'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE',
+          "Missing concrete implementation of {0}, {1} and {2}");
+
+  /**
+   * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract
+   * class inherits an abstract method.
+   *
+   * 7.10 Superinterfaces: Let <i>C</i> be a concrete class that does not
+   * declare its own <i>noSuchMethod()</i> method. It is a static warning if the
+   * implicit interface of <i>C</i> includes an instance member <i>m</i> of type
+   * <i>F</i> and <i>C</i> does not declare or inherit a corresponding instance
+   * member <i>m</i> of type <i>F'</i> such that <i>F' <: F</i>.
+   *
+   * 7.4 Abstract Instance Members: It is a static warning if an abstract member
+   * is declared or inherited in a concrete class unless that member overrides a
+   * concrete one.
+   *
+   * Parameters:
+   * 0: the name of the first member
+   * 1: the name of the second member
+   */
+  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO =
+      const StaticWarningCode('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO',
+          "Missing concrete implementation of {0} and {1}");
+
+  /**
+   * 13.11 Try: An on-catch clause of the form <i>on T catch (p<sub>1</sub>,
+   * p<sub>2</sub>) s</i> or <i>on T s</i> matches an object <i>o</i> if the
+   * type of <i>o</i> is a subtype of <i>T</i>. It is a static warning if
+   * <i>T</i> does not denote a type available in the lexical scope of the
+   * catch clause.
+   *
+   * Parameters:
+   * 0: the name of the non-type element
+   */
+  static const StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE =
+      const StaticWarningCode('NON_TYPE_IN_CATCH_CLAUSE',
+          "The name '{0}' is not a type and cannot be used in an on-catch clause");
+
+  /**
+   * 7.1.1 Operators: It is a static warning if the return type of the
+   * user-declared operator []= is explicitly declared and not void.
+   */
+  static const StaticWarningCode NON_VOID_RETURN_FOR_OPERATOR =
+      const StaticWarningCode('NON_VOID_RETURN_FOR_OPERATOR',
+          "The return type of the operator []= must be 'void'");
+
+  /**
+   * 7.3 Setters: It is a static warning if a setter declares a return type
+   * other than void.
+   */
+  static const StaticWarningCode NON_VOID_RETURN_FOR_SETTER =
+      const StaticWarningCode('NON_VOID_RETURN_FOR_SETTER',
+          "The return type of the setter must be 'void'");
+
+  /**
+   * 15.1 Static Types: A type <i>T</i> is malformed iff:
+   * * <i>T</i> has the form <i>id</i> or the form <i>prefix.id</i>, and in the
+   *   enclosing lexical scope, the name <i>id</i> (respectively
+   *   <i>prefix.id</i>) does not denote a type.
+   * * <i>T</i> denotes a type parameter in the enclosing lexical scope, but
+   * occurs in the signature or body of a static member.
+   * * <i>T</i> is a parameterized type of the form <i>G&lt;S<sub>1</sub>, ..,
+   * S<sub>n</sub>&gt;</i>,
+   *
+   * Any use of a malformed type gives rise to a static warning.
+   *
+   * Parameters:
+   * 0: the name that is not a type
+   */
+  static const StaticWarningCode NOT_A_TYPE =
+      const StaticWarningCode('NOT_A_TYPE', "{0} is not a type");
+
+  /**
+   * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt;
+   * h</i> or if <i>m &gt; n</i>.
+   *
+   * Parameters:
+   * 0: the expected number of required arguments
+   * 1: the actual number of positional arguments given
+   *
+   * See [EXTRA_POSITIONAL_ARGUMENTS].
+   */
+  static const StaticWarningCode NOT_ENOUGH_REQUIRED_ARGUMENTS =
+      const StaticWarningCode('NOT_ENOUGH_REQUIRED_ARGUMENTS',
+          "{0} required argument(s) expected, but {1} found");
+
+  /**
+   * 14.3 Parts: It is a static warning if the referenced part declaration
+   * <i>p</i> names a library other than the current library as the library to
+   * which <i>p</i> belongs.
+   *
+   * Parameters:
+   * 0: the name of expected library name
+   * 1: the non-matching actual library name from the "part of" declaration
+   */
+  static const StaticWarningCode PART_OF_DIFFERENT_LIBRARY =
+      const StaticWarningCode('PART_OF_DIFFERENT_LIBRARY',
+          "Expected this library to be part of '{0}', not '{1}'");
+
+  /**
+   * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i>
+   * is not a subtype of the type of <i>k</i>.
+   *
+   * Parameters:
+   * 0: the name of the redirected constructor
+   * 1: the name of the redirecting constructor
+   */
+  static const StaticWarningCode REDIRECT_TO_INVALID_FUNCTION_TYPE =
+      const StaticWarningCode('REDIRECT_TO_INVALID_FUNCTION_TYPE',
+          "The redirected constructor '{0}' has incompatible parameters with '{1}'");
+
+  /**
+   * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i>
+   * is not a subtype of the type of <i>k</i>.
+   *
+   * Parameters:
+   * 0: the name of the redirected constructor return type
+   * 1: the name of the redirecting constructor return type
+   */
+  static const StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE =
+      const StaticWarningCode('REDIRECT_TO_INVALID_RETURN_TYPE',
+          "The return type '{0}' of the redirected constructor is not assignable to '{1}'");
+
+  /**
+   * 7.6.2 Factories: It is a static warning if type does not denote a class
+   * accessible in the current scope; if type does denote such a class <i>C</i>
+   * it is a static warning if the referenced constructor (be it <i>type</i> or
+   * <i>type.id</i>) is not a constructor of <i>C</i>.
+   */
+  static const StaticWarningCode REDIRECT_TO_MISSING_CONSTRUCTOR =
+      const StaticWarningCode('REDIRECT_TO_MISSING_CONSTRUCTOR',
+          "The constructor '{0}' could not be found in '{1}'");
+
+  /**
+   * 7.6.2 Factories: It is a static warning if type does not denote a class
+   * accessible in the current scope; if type does denote such a class <i>C</i>
+   * it is a static warning if the referenced constructor (be it <i>type</i> or
+   * <i>type.id</i>) is not a constructor of <i>C</i>.
+   */
+  static const StaticWarningCode REDIRECT_TO_NON_CLASS = const StaticWarningCode(
+      'REDIRECT_TO_NON_CLASS',
+      "The name '{0}' is not a type and cannot be used in a redirected constructor");
+
+  /**
+   * 13.12 Return: Let <i>f</i> be the function immediately enclosing a return
+   * statement of the form <i>return;</i> It is a static warning if both of the
+   * following conditions hold:
+   * * <i>f</i> is not a generative constructor.
+   * * The return type of <i>f</i> may not be assigned to void.
+   */
+  static const StaticWarningCode RETURN_WITHOUT_VALUE = const StaticWarningCode(
+      'RETURN_WITHOUT_VALUE', "Missing return value after 'return'");
+
+  /**
+   * 12.16.3 Static Invocation: It is a static warning if <i>C</i> does not
+   * declare a static method or getter <i>m</i>.
+   *
+   * Parameters:
+   * 0: the name of the instance member
+   */
+  static const StaticWarningCode STATIC_ACCESS_TO_INSTANCE_MEMBER =
+      const StaticWarningCode('STATIC_ACCESS_TO_INSTANCE_MEMBER',
+          "Instance member '{0}' cannot be accessed using static access");
+
+  /**
+   * 13.9 Switch: It is a static warning if the type of <i>e</i> may not be
+   * assigned to the type of <i>e<sub>k</sub></i>.
+   */
+  static const StaticWarningCode SWITCH_EXPRESSION_NOT_ASSIGNABLE =
+      const StaticWarningCode('SWITCH_EXPRESSION_NOT_ASSIGNABLE',
+          "Type '{0}' of the switch expression is not assignable to the type '{1}' of case expressions");
+
+  /**
+   * 15.1 Static Types: It is a static warning to use a deferred type in a type
+   * annotation.
+   *
+   * Parameters:
+   * 0: the name of the type that is deferred and being used in a type
+   *    annotation
+   */
+  static const StaticWarningCode TYPE_ANNOTATION_DEFERRED_CLASS =
+      const StaticWarningCode('TYPE_ANNOTATION_DEFERRED_CLASS',
+          "The deferred type '{0}' cannot be used in a declaration, cast or type test");
+
+  /**
+   * 12.31 Type Test: It is a static warning if <i>T</i> does not denote a type
+   * available in the current lexical scope.
+   */
+  static const StaticWarningCode TYPE_TEST_WITH_NON_TYPE = const StaticWarningCode(
+      'TYPE_TEST_WITH_NON_TYPE',
+      "The name '{0}' is not a type and cannot be used in an 'is' expression");
+
+  /**
+   * 12.31 Type Test: It is a static warning if <i>T</i> does not denote a type
+   * available in the current lexical scope.
+   */
+  static const StaticWarningCode TYPE_TEST_WITH_UNDEFINED_NAME =
+      const StaticWarningCode('TYPE_TEST_WITH_UNDEFINED_NAME',
+          "The name '{0}' is not defined and cannot be used in an 'is' expression");
+
+  /**
+   * 10 Generics: However, a type parameter is considered to be a malformed type
+   * when referenced by a static member.
+   *
+   * 15.1 Static Types: Any use of a malformed type gives rise to a static
+   * warning. A malformed type is then interpreted as dynamic by the static type
+   * checker and the runtime.
+   */
+  static const StaticWarningCode TYPE_PARAMETER_REFERENCED_BY_STATIC =
+      const StaticWarningCode('TYPE_PARAMETER_REFERENCED_BY_STATIC',
+          "Static members cannot reference type parameters");
+
+  /**
+   * 12.16.3 Static Invocation: A static method invocation <i>i</i> has the form
+   * <i>C.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
+   * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. It is a
+   * static warning if <i>C</i> does not denote a class in the current scope.
+   *
+   * Parameters:
+   * 0: the name of the undefined class
+   */
+  static const StaticWarningCode UNDEFINED_CLASS =
+      const StaticWarningCode('UNDEFINED_CLASS', "Undefined class '{0}'");
+
+  /**
+   * Same as [UNDEFINED_CLASS], but to catch using "boolean" instead of "bool".
+   */
+  static const StaticWarningCode UNDEFINED_CLASS_BOOLEAN =
+      const StaticWarningCode('UNDEFINED_CLASS_BOOLEAN',
+          "Undefined class 'boolean'; did you mean 'bool'?");
+
+  /**
+   * 12.17 Getter Invocation: It is a static warning if there is no class
+   * <i>C</i> in the enclosing lexical scope of <i>i</i>, or if <i>C</i> does
+   * not declare, implicitly or explicitly, a getter named <i>m</i>.
+   *
+   * Parameters:
+   * 0: the name of the getter
+   * 1: the name of the enclosing type where the getter is being looked for
+   */
+  static const StaticWarningCode UNDEFINED_GETTER = const StaticWarningCode(
+      'UNDEFINED_GETTER',
+      "The getter '{0}' is not defined for the class '{1}'");
+
+  /**
+   * 12.30 Identifier Reference: It is as static warning if an identifier
+   * expression of the form <i>id</i> occurs inside a top level or static
+   * function (be it function, method, getter, or setter) or variable
+   * initializer and there is no declaration <i>d</i> with name <i>id</i> in the
+   * lexical scope enclosing the expression.
+   *
+   * Parameters:
+   * 0: the name of the identifier
+   */
+  static const StaticWarningCode UNDEFINED_IDENTIFIER =
+      const StaticWarningCode('UNDEFINED_IDENTIFIER', "Undefined name '{0}'");
+
+  /**
+   * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>,
+   * <i>1<=i<=l</i>, must have a corresponding named parameter in the set
+   * {<i>p<sub>n+1</sub></i> &hellip; <i>p<sub>n+k</sub></i>} or a static
+   * warning occurs.
+   *
+   * Parameters:
+   * 0: the name of the requested named parameter
+   */
+  static const StaticWarningCode UNDEFINED_NAMED_PARAMETER =
+      const StaticWarningCode('UNDEFINED_NAMED_PARAMETER',
+          "The named parameter '{0}' is not defined");
+
+  /**
+   * 12.18 Assignment: It is as static warning if an assignment of the form
+   * <i>v = e</i> occurs inside a top level or static function (be it function,
+   * method, getter, or setter) or variable initializer and there is no
+   * declaration <i>d</i> with name <i>v=</i> in the lexical scope enclosing the
+   * assignment.
+   *
+   * 12.18 Assignment: It is a static warning if there is no class <i>C</i> in
+   * the enclosing lexical scope of the assignment, or if <i>C</i> does not
+   * declare, implicitly or explicitly, a setter <i>v=</i>.
+   *
+   * Parameters:
+   * 0: the name of the getter
+   * 1: the name of the enclosing type where the setter is being looked for
+   */
+  static const StaticWarningCode UNDEFINED_SETTER = const StaticWarningCode(
+      'UNDEFINED_SETTER',
+      "The setter '{0}' is not defined for the class '{1}'");
+
+  /**
+   * 12.16.3 Static Invocation: It is a static warning if <i>C</i> does not
+   * declare a static method or getter <i>m</i>.
+   *
+   * Parameters:
+   * 0: the name of the method
+   * 1: the name of the enclosing type where the method is being looked for
+   */
+  static const StaticWarningCode UNDEFINED_STATIC_METHOD_OR_GETTER =
+      const StaticWarningCode('UNDEFINED_STATIC_METHOD_OR_GETTER',
+          "The static method, getter or setter '{0}' is not defined for the class '{1}'");
+
+  /**
+   * 12.17 Getter Invocation: It is a static warning if there is no class
+   * <i>C</i> in the enclosing lexical scope of <i>i</i>, or if <i>C</i> does
+   * not declare, implicitly or explicitly, a getter named <i>m</i>.
+   *
+   * Parameters:
+   * 0: the name of the getter
+   * 1: the name of the enclosing type where the getter is being looked for
+   */
+  static const StaticWarningCode UNDEFINED_SUPER_GETTER =
+      const StaticWarningCode('UNDEFINED_SUPER_GETTER',
+          "The getter '{0}' is not defined in a superclass of '{1}'");
+
+  /**
+   * 12.18 Assignment: It is as static warning if an assignment of the form
+   * <i>v = e</i> occurs inside a top level or static function (be it function,
+   * method, getter, or setter) or variable initializer and there is no
+   * declaration <i>d</i> with name <i>v=</i> in the lexical scope enclosing the
+   * assignment.
+   *
+   * 12.18 Assignment: It is a static warning if there is no class <i>C</i> in
+   * the enclosing lexical scope of the assignment, or if <i>C</i> does not
+   * declare, implicitly or explicitly, a setter <i>v=</i>.
+   *
+   * Parameters:
+   * 0: the name of the getter
+   * 1: the name of the enclosing type where the setter is being looked for
+   */
+  static const StaticWarningCode UNDEFINED_SUPER_SETTER =
+      const StaticWarningCode('UNDEFINED_SUPER_SETTER',
+          "The setter '{0}' is not defined in a superclass of '{1}'");
+
+  /**
+   * 7.2 Getters: It is a static warning if the return type of a getter is void.
+   */
+  static const StaticWarningCode VOID_RETURN_FOR_GETTER =
+      const StaticWarningCode('VOID_RETURN_FOR_GETTER',
+          "The return type of the getter must not be 'void'");
+
+  /**
+   * Initialize a newly created error code to have the given [name]. The message
+   * associated with the error will be created from the given [message]
+   * template. The correction associated with the error will be created from the
+   * given [correction] template.
+   */
+  const StaticWarningCode(String name, String message, [String correction])
+      : super(name, message, correction);
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorType.STATIC_WARNING.severity;
+
+  @override
+  ErrorType get type => ErrorType.STATIC_WARNING;
+}
+
+/**
+ * The error code indicating a marker in code for work that needs to be finished
+ * or revisited.
+ */
+class TodoCode extends ErrorCode {
+  /**
+   * The single enum of TodoCode.
+   */
+  static const TodoCode TODO = const TodoCode('TODO');
+
+  /**
+   * This matches the two common Dart task styles
+   *
+   * * TODO:
+   * * TODO(username):
+   *
+   * As well as
+   * * TODO
+   *
+   * But not
+   * * todo
+   * * TODOS
+   */
+  static RegExp TODO_REGEX =
+      new RegExp("([\\s/\\*])((TODO[^\\w\\d][^\\r\\n]*)|(TODO:?\$))");
+
+  /**
+   * Initialize a newly created error code to have the given [name].
+   */
+  const TodoCode(String name) : super(name, "{0}");
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorSeverity.INFO;
+
+  @override
+  ErrorType get type => ErrorType.TODO;
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/error_verifier.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/error_verifier.dart
new file mode 100644
index 0000000..9624115
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/error_verifier.dart
@@ -0,0 +1,6001 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.resolver.error_verifier;
+
+import 'dart:collection';
+import "dart:math" as math;
+
+import 'package:analyzer/src/generated/static_type_analyzer.dart';
+
+import 'ast.dart';
+import 'constant.dart';
+import 'element.dart';
+import 'element_resolver.dart';
+import 'error.dart';
+import 'java_engine.dart';
+import 'parser.dart' show Parser, ParserErrorCode;
+import 'resolver.dart';
+import 'scanner.dart' as sc;
+import 'sdk.dart' show DartSdk, SdkLibrary;
+import 'utilities_dart.dart';
+
+/**
+ * A visitor used to traverse an AST structure looking for additional errors and
+ * warnings not covered by the parser and resolver.
+ */
+class ErrorVerifier extends RecursiveAstVisitor<Object> {
+  /**
+   * Static final string with value `"getter "` used in the construction of the
+   * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE], and
+   * similar, error code messages.
+   *
+   * See [_checkForNonAbstractClassInheritsAbstractMember].
+   */
+  static String _GETTER_SPACE = "getter ";
+
+  /**
+   * Static final string with value `"setter "` used in the construction of the
+   * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE], and
+   * similar, error code messages.
+   *
+   * See [_checkForNonAbstractClassInheritsAbstractMember].
+   */
+  static String _SETTER_SPACE = "setter ";
+
+  /**
+   * The error reporter by which errors will be reported.
+   */
+  final ErrorReporter _errorReporter;
+
+  /**
+   * The current library that is being analyzed.
+   */
+  final LibraryElement _currentLibrary;
+
+  /**
+   * The type representing the type 'bool'.
+   */
+  InterfaceType _boolType;
+
+  /**
+   * The type representing the type 'int'.
+   */
+  InterfaceType _intType;
+
+  /**
+   * The object providing access to the types defined by the language.
+   */
+  final TypeProvider _typeProvider;
+
+  /**
+   * The manager for the inheritance mappings.
+   */
+  final InheritanceManager _inheritanceManager;
+
+  /**
+   * A flag indicating whether the visitor is currently within a constructor
+   * declaration that is 'const'.
+   *
+   * See [visitConstructorDeclaration].
+   */
+  bool _isEnclosingConstructorConst = false;
+
+  /**
+   * A flag indicating whether we are currently within a function body marked as
+   * being asynchronous.
+   */
+  bool _inAsync = false;
+
+  /**
+   * A flag indicating whether we are currently within a function body marked a
+   *  being a generator.
+   */
+  bool _inGenerator = false;
+
+  /**
+   * A flag indicating whether the visitor is currently within a catch clause.
+   *
+   * See [visitCatchClause].
+   */
+  bool _isInCatchClause = false;
+
+  /**
+   * A flag indicating whether the visitor is currently within a comment.
+   */
+  bool _isInComment = false;
+
+  /**
+   * A flag indicating whether the visitor is currently within an instance
+   * creation expression.
+   */
+  bool _isInConstInstanceCreation = false;
+
+  /**
+   * A flag indicating whether the visitor is currently within a native class
+   * declaration.
+   */
+  bool _isInNativeClass = false;
+
+  /**
+   * A flag indicating whether the visitor is currently within a static variable
+   * declaration.
+   */
+  bool _isInStaticVariableDeclaration = false;
+
+  /**
+   * A flag indicating whether the visitor is currently within an instance
+   * variable declaration.
+   */
+  bool _isInInstanceVariableDeclaration = false;
+
+  /**
+   * A flag indicating whether the visitor is currently within an instance
+   * variable initializer.
+   */
+  bool _isInInstanceVariableInitializer = false;
+
+  /**
+   * A flag indicating whether the visitor is currently within a constructor
+   * initializer.
+   */
+  bool _isInConstructorInitializer = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently within a function typed
+   * formal parameter.
+   */
+  bool _isInFunctionTypedFormalParameter = false;
+
+  /**
+   * A flag indicating whether the visitor is currently within a static method.
+   * By "method" here getter, setter and operator declarations are also implied
+   * since they are all represented with a [MethodDeclaration] in the AST
+   * structure.
+   */
+  bool _isInStaticMethod = false;
+
+  /**
+   * A flag indicating whether the visitor is currently within a factory
+   * constructor.
+   */
+  bool _isInFactory = false;
+
+  /**
+   * A flag indicating whether the visitor is currently within code in the SDK.
+   */
+  bool _isInSystemLibrary = false;
+
+  /**
+   * A flag indicating whether the current library contains at least one import
+   * directive with a URI that uses the "dart-ext" scheme.
+   */
+  bool _hasExtUri = false;
+
+  /**
+   * This is set to `false` on the entry of every [BlockFunctionBody], and is
+   * restored to the enclosing value on exit. The value is used in
+   * [_checkForMixedReturns] to prevent both
+   * [StaticWarningCode.MIXED_RETURN_TYPES] and
+   * [StaticWarningCode.RETURN_WITHOUT_VALUE] from being generated in the same
+   * function body.
+   */
+  bool _hasReturnWithoutValue = false;
+
+  /**
+   * The class containing the AST nodes being visited, or `null` if we are not
+   * in the scope of a class.
+   */
+  ClassElement _enclosingClass;
+
+  /**
+   * The method or function that we are currently visiting, or `null` if we are
+   * not inside a method or function.
+   */
+  ExecutableElement _enclosingFunction;
+
+  /**
+   * The return statements found in the method or function that we are currently
+   * visiting that have a return value.
+   */
+  List<ReturnStatement> _returnsWith = new List<ReturnStatement>();
+
+  /**
+   * The return statements found in the method or function that we are currently
+   * visiting that do not have a return value.
+   */
+  List<ReturnStatement> _returnsWithout = new List<ReturnStatement>();
+
+  /**
+   * This map is initialized when visiting the contents of a class declaration.
+   * If the visitor is not in an enclosing class declaration, then the map is
+   * set to `null`.
+   *
+   * When set the map maps the set of [FieldElement]s in the class to an
+   * [INIT_STATE.NOT_INIT] or [INIT_STATE.INIT_IN_DECLARATION]. The `checkFor*`
+   * methods, specifically [_checkForAllFinalInitializedErrorCodes], can make a
+   * copy of the map to compute error code states. The `checkFor*` methods
+   * should only ever make a copy, or read from this map after it has been set
+   * in [visitClassDeclaration].
+   *
+   * See [visitClassDeclaration], and [_checkForAllFinalInitializedErrorCodes].
+   */
+  HashMap<FieldElement, INIT_STATE> _initialFieldElementsMap;
+
+  /**
+   * A table mapping name of the library to the export directive which export
+   * this library.
+   */
+  HashMap<String, LibraryElement> _nameToExportElement =
+      new HashMap<String, LibraryElement>();
+
+  /**
+   * A table mapping name of the library to the import directive which import
+   * this library.
+   */
+  HashMap<String, LibraryElement> _nameToImportElement =
+      new HashMap<String, LibraryElement>();
+
+  /**
+   * A table mapping names to the exported elements.
+   */
+  HashMap<String, Element> _exportedElements = new HashMap<String, Element>();
+
+  /**
+   * A set of the names of the variable initializers we are visiting now.
+   */
+  HashSet<String> _namesForReferenceToDeclaredVariableInInitializer =
+      new HashSet<String>();
+
+  /**
+   * A list of types used by the [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]
+   * and [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS] error codes.
+   */
+  List<InterfaceType> _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT;
+
+  /**
+   * If `true`, mixins are allowed to inherit from types other than Object, and
+   * are allowed to reference `super`.
+   */
+  final bool enableSuperMixins;
+
+  /**
+   * Initialize a newly created error verifier.
+   */
+  ErrorVerifier(this._errorReporter, this._currentLibrary, this._typeProvider,
+      this._inheritanceManager, this.enableSuperMixins) {
+    this._isInSystemLibrary = _currentLibrary.source.isInSystemLibrary;
+    this._hasExtUri = _currentLibrary.hasExtUri;
+    _isEnclosingConstructorConst = false;
+    _isInCatchClause = false;
+    _isInStaticVariableDeclaration = false;
+    _isInInstanceVariableDeclaration = false;
+    _isInInstanceVariableInitializer = false;
+    _isInConstructorInitializer = false;
+    _isInStaticMethod = false;
+    _boolType = _typeProvider.boolType;
+    _intType = _typeProvider.intType;
+    _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT = _typeProvider.nonSubtypableTypes;
+  }
+
+  @override
+  Object visitAnnotation(Annotation node) {
+    _checkForInvalidAnnotationFromDeferredLibrary(node);
+    return super.visitAnnotation(node);
+  }
+
+  @override
+  Object visitArgumentList(ArgumentList node) {
+    _checkForArgumentTypesNotAssignableInList(node);
+    return super.visitArgumentList(node);
+  }
+
+  @override
+  Object visitAsExpression(AsExpression node) {
+    _checkForTypeAnnotationDeferredClass(node.type);
+    return super.visitAsExpression(node);
+  }
+
+  @override
+  Object visitAssertStatement(AssertStatement node) {
+    _checkForNonBoolExpression(node);
+    return super.visitAssertStatement(node);
+  }
+
+  @override
+  Object visitAssignmentExpression(AssignmentExpression node) {
+    sc.TokenType operatorType = node.operator.type;
+    Expression lhs = node.leftHandSide;
+    Expression rhs = node.rightHandSide;
+    if (operatorType == sc.TokenType.EQ ||
+        operatorType == sc.TokenType.QUESTION_QUESTION_EQ) {
+      _checkForInvalidAssignment(lhs, rhs);
+    } else {
+      _checkForInvalidCompoundAssignment(node, lhs, rhs);
+      _checkForArgumentTypeNotAssignableForArgument(rhs);
+    }
+    _checkForAssignmentToFinal(lhs);
+    return super.visitAssignmentExpression(node);
+  }
+
+  @override
+  Object visitAwaitExpression(AwaitExpression node) {
+    if (!_inAsync) {
+      _errorReporter.reportErrorForToken(
+          CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT, node.awaitKeyword);
+    }
+    return super.visitAwaitExpression(node);
+  }
+
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    sc.Token operator = node.operator;
+    sc.TokenType type = operator.type;
+    if (type == sc.TokenType.AMPERSAND_AMPERSAND ||
+        type == sc.TokenType.BAR_BAR) {
+      String lexeme = operator.lexeme;
+      _checkForAssignability(node.leftOperand, _boolType,
+          StaticTypeWarningCode.NON_BOOL_OPERAND, [lexeme]);
+      _checkForAssignability(node.rightOperand, _boolType,
+          StaticTypeWarningCode.NON_BOOL_OPERAND, [lexeme]);
+    } else {
+      _checkForArgumentTypeNotAssignableForArgument(node.rightOperand);
+    }
+    return super.visitBinaryExpression(node);
+  }
+
+  @override
+  Object visitBlockFunctionBody(BlockFunctionBody node) {
+    bool wasInAsync = _inAsync;
+    bool wasInGenerator = _inGenerator;
+    bool previousHasReturnWithoutValue = _hasReturnWithoutValue;
+    _hasReturnWithoutValue = false;
+    List<ReturnStatement> previousReturnsWith = _returnsWith;
+    List<ReturnStatement> previousReturnsWithout = _returnsWithout;
+    try {
+      _inAsync = node.isAsynchronous;
+      _inGenerator = node.isGenerator;
+      _returnsWith = new List<ReturnStatement>();
+      _returnsWithout = new List<ReturnStatement>();
+      super.visitBlockFunctionBody(node);
+      _checkForMixedReturns(node);
+    } finally {
+      _inAsync = wasInAsync;
+      _inGenerator = wasInGenerator;
+      _returnsWith = previousReturnsWith;
+      _returnsWithout = previousReturnsWithout;
+      _hasReturnWithoutValue = previousHasReturnWithoutValue;
+    }
+    return null;
+  }
+
+  @override
+  Object visitBreakStatement(BreakStatement node) {
+    SimpleIdentifier labelNode = node.label;
+    if (labelNode != null) {
+      Element labelElement = labelNode.staticElement;
+      if (labelElement is LabelElementImpl && labelElement.isOnSwitchMember) {
+        _errorReporter.reportErrorForNode(
+            ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER, labelNode);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitCatchClause(CatchClause node) {
+    bool previousIsInCatchClause = _isInCatchClause;
+    try {
+      _isInCatchClause = true;
+      _checkForTypeAnnotationDeferredClass(node.exceptionType);
+      return super.visitCatchClause(node);
+    } finally {
+      _isInCatchClause = previousIsInCatchClause;
+    }
+  }
+
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    ClassElement outerClass = _enclosingClass;
+    try {
+      _isInNativeClass = node.nativeClause != null;
+      _enclosingClass = node.element;
+      ExtendsClause extendsClause = node.extendsClause;
+      ImplementsClause implementsClause = node.implementsClause;
+      WithClause withClause = node.withClause;
+      _checkForBuiltInIdentifierAsName(
+          node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME);
+      _checkForMemberWithClassName();
+      _checkForNoDefaultSuperConstructorImplicit(node);
+      _checkForConflictingTypeVariableErrorCodes(node);
+      // Only do error checks on the clause nodes if there is a non-null clause
+      if (implementsClause != null ||
+          extendsClause != null ||
+          withClause != null) {
+        // Only check for all of the inheritance logic around clauses if there
+        // isn't an error code such as "Cannot extend double" already on the
+        // class.
+        if (!_checkForImplementsDisallowedClass(implementsClause) &&
+            !_checkForExtendsDisallowedClass(extendsClause) &&
+            !_checkForAllMixinErrorCodes(withClause)) {
+          _checkForExtendsDeferredClass(extendsClause);
+          _checkForImplementsDeferredClass(implementsClause);
+          _checkForNonAbstractClassInheritsAbstractMember(node.name);
+          _checkForInconsistentMethodInheritance();
+          _checkForRecursiveInterfaceInheritance(_enclosingClass);
+          _checkForConflictingGetterAndMethod();
+          _checkForConflictingInstanceGetterAndSuperclassMember();
+          _checkImplementsSuperClass(node);
+          _checkImplementsFunctionWithoutCall(node);
+          _checkForMixinHasNoConstructors(node);
+        }
+      }
+      visitClassDeclarationIncrementally(node);
+      _checkForFinalNotInitializedInClass(node);
+      _checkForDuplicateDefinitionInheritance();
+      _checkForConflictingInstanceMethodSetter(node);
+      return super.visitClassDeclaration(node);
+    } finally {
+      _isInNativeClass = false;
+      _initialFieldElementsMap = null;
+      _enclosingClass = outerClass;
+    }
+  }
+
+  /**
+   * Implementation of this method should be synchronized with
+   * [visitClassDeclaration].
+   */
+  void visitClassDeclarationIncrementally(ClassDeclaration node) {
+    _isInNativeClass = node.nativeClause != null;
+    _enclosingClass = node.element;
+    // initialize initialFieldElementsMap
+    if (_enclosingClass != null) {
+      List<FieldElement> fieldElements = _enclosingClass.fields;
+      _initialFieldElementsMap = new HashMap<FieldElement, INIT_STATE>();
+      for (FieldElement fieldElement in fieldElements) {
+        if (!fieldElement.isSynthetic) {
+          _initialFieldElementsMap[fieldElement] = fieldElement.initializer ==
+              null ? INIT_STATE.NOT_INIT : INIT_STATE.INIT_IN_DECLARATION;
+        }
+      }
+    }
+  }
+
+  @override
+  Object visitClassTypeAlias(ClassTypeAlias node) {
+    _checkForBuiltInIdentifierAsName(
+        node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
+    ClassElement outerClassElement = _enclosingClass;
+    try {
+      _enclosingClass = node.element;
+      ImplementsClause implementsClause = node.implementsClause;
+      // Only check for all of the inheritance logic around clauses if there
+      // isn't an error code such as "Cannot extend double" already on the
+      // class.
+      if (!_checkForExtendsDisallowedClassInTypeAlias(node) &&
+          !_checkForImplementsDisallowedClass(implementsClause) &&
+          !_checkForAllMixinErrorCodes(node.withClause)) {
+        _checkForExtendsDeferredClassInTypeAlias(node);
+        _checkForImplementsDeferredClass(implementsClause);
+        _checkForRecursiveInterfaceInheritance(_enclosingClass);
+        _checkForNonAbstractClassInheritsAbstractMember(node.name);
+        _checkForMixinHasNoConstructors(node);
+      }
+    } finally {
+      _enclosingClass = outerClassElement;
+    }
+    return super.visitClassTypeAlias(node);
+  }
+
+  @override
+  Object visitComment(Comment node) {
+    _isInComment = true;
+    try {
+      return super.visitComment(node);
+    } finally {
+      _isInComment = false;
+    }
+  }
+
+  @override
+  Object visitCompilationUnit(CompilationUnit node) {
+    _checkForDeferredPrefixCollisions(node);
+    return super.visitCompilationUnit(node);
+  }
+
+  @override
+  Object visitConditionalExpression(ConditionalExpression node) {
+    _checkForNonBoolCondition(node.condition);
+    return super.visitConditionalExpression(node);
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    ExecutableElement outerFunction = _enclosingFunction;
+    try {
+      ConstructorElement constructorElement = node.element;
+      _enclosingFunction = constructorElement;
+      _isEnclosingConstructorConst = node.constKeyword != null;
+      _isInFactory = node.factoryKeyword != null;
+      _checkForInvalidModifierOnBody(
+          node.body, CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR);
+      _checkForConstConstructorWithNonFinalField(node, constructorElement);
+      _checkForConstConstructorWithNonConstSuper(node);
+      _checkForConflictingConstructorNameAndMember(node, constructorElement);
+      _checkForAllFinalInitializedErrorCodes(node);
+      _checkForRedirectingConstructorErrorCodes(node);
+      _checkForMultipleSuperInitializers(node);
+      _checkForRecursiveConstructorRedirect(node, constructorElement);
+      if (!_checkForRecursiveFactoryRedirect(node, constructorElement)) {
+        _checkForAllRedirectConstructorErrorCodes(node);
+      }
+      _checkForUndefinedConstructorInInitializerImplicit(node);
+      _checkForRedirectToNonConstConstructor(node, constructorElement);
+      _checkForReturnInGenerativeConstructor(node);
+      return super.visitConstructorDeclaration(node);
+    } finally {
+      _isEnclosingConstructorConst = false;
+      _isInFactory = false;
+      _enclosingFunction = outerFunction;
+    }
+  }
+
+  @override
+  Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    _isInConstructorInitializer = true;
+    try {
+      SimpleIdentifier fieldName = node.fieldName;
+      Element staticElement = fieldName.staticElement;
+      _checkForInvalidField(node, fieldName, staticElement);
+      _checkForFieldInitializerNotAssignable(node, staticElement);
+      return super.visitConstructorFieldInitializer(node);
+    } finally {
+      _isInConstructorInitializer = false;
+    }
+  }
+
+  @override
+  Object visitContinueStatement(ContinueStatement node) {
+    SimpleIdentifier labelNode = node.label;
+    if (labelNode != null) {
+      Element labelElement = labelNode.staticElement;
+      if (labelElement is LabelElementImpl &&
+          labelElement.isOnSwitchStatement) {
+        _errorReporter.reportErrorForNode(
+            ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH, labelNode);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+    _checkForInvalidAssignment(node.identifier, node.defaultValue);
+    _checkForDefaultValueInFunctionTypedParameter(node);
+    return super.visitDefaultFormalParameter(node);
+  }
+
+  @override
+  Object visitDoStatement(DoStatement node) {
+    _checkForNonBoolCondition(node.condition);
+    return super.visitDoStatement(node);
+  }
+
+  @override
+  Object visitEnumDeclaration(EnumDeclaration node) {
+    ClassElement outerClass = _enclosingClass;
+    try {
+      _isInNativeClass = false;
+      _enclosingClass = node.element;
+      return super.visitEnumDeclaration(node);
+    } finally {
+      _enclosingClass = outerClass;
+    }
+  }
+
+  @override
+  Object visitExportDirective(ExportDirective node) {
+    ExportElement exportElement = node.element;
+    if (exportElement != null) {
+      LibraryElement exportedLibrary = exportElement.exportedLibrary;
+      _checkForAmbiguousExport(node, exportElement, exportedLibrary);
+      _checkForExportDuplicateLibraryName(node, exportElement, exportedLibrary);
+      _checkForExportInternalLibrary(node, exportElement);
+    }
+    return super.visitExportDirective(node);
+  }
+
+  @override
+  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    bool wasInAsync = _inAsync;
+    bool wasInGenerator = _inGenerator;
+    try {
+      _inAsync = node.isAsynchronous;
+      _inGenerator = node.isGenerator;
+      FunctionType functionType =
+          _enclosingFunction == null ? null : _enclosingFunction.type;
+      DartType expectedReturnType = functionType == null
+          ? DynamicTypeImpl.instance
+          : functionType.returnType;
+      _checkForReturnOfInvalidType(node.expression, expectedReturnType);
+      return super.visitExpressionFunctionBody(node);
+    } finally {
+      _inAsync = wasInAsync;
+      _inGenerator = wasInGenerator;
+    }
+  }
+
+  @override
+  Object visitFieldDeclaration(FieldDeclaration node) {
+    _isInStaticVariableDeclaration = node.isStatic;
+    _isInInstanceVariableDeclaration = !_isInStaticVariableDeclaration;
+    if (_isInInstanceVariableDeclaration) {
+      VariableDeclarationList variables = node.fields;
+      if (variables.isConst) {
+        _errorReporter.reportErrorForToken(
+            CompileTimeErrorCode.CONST_INSTANCE_FIELD, variables.keyword);
+      }
+    }
+    try {
+      _checkForAllInvalidOverrideErrorCodesForField(node);
+      return super.visitFieldDeclaration(node);
+    } finally {
+      _isInStaticVariableDeclaration = false;
+      _isInInstanceVariableDeclaration = false;
+    }
+  }
+
+  @override
+  Object visitFieldFormalParameter(FieldFormalParameter node) {
+    _checkForValidField(node);
+    _checkForConstFormalParameter(node);
+    _checkForPrivateOptionalParameter(node);
+    _checkForFieldInitializingFormalRedirectingConstructor(node);
+    _checkForTypeAnnotationDeferredClass(node.type);
+    return super.visitFieldFormalParameter(node);
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    ExecutableElement outerFunction = _enclosingFunction;
+    try {
+      SimpleIdentifier identifier = node.name;
+      String methodName = "";
+      if (identifier != null) {
+        methodName = identifier.name;
+      }
+      _enclosingFunction = node.element;
+      TypeName returnType = node.returnType;
+      if (node.isSetter || node.isGetter) {
+        _checkForMismatchedAccessorTypes(node, methodName);
+        if (node.isSetter) {
+          FunctionExpression functionExpression = node.functionExpression;
+          if (functionExpression != null) {
+            _checkForWrongNumberOfParametersForSetter(
+                identifier, functionExpression.parameters);
+          }
+          _checkForNonVoidReturnTypeForSetter(returnType);
+        }
+      }
+      if (node.isSetter) {
+        _checkForInvalidModifierOnBody(node.functionExpression.body,
+            CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER);
+      }
+      _checkForTypeAnnotationDeferredClass(returnType);
+      _checkForIllegalReturnType(returnType);
+      return super.visitFunctionDeclaration(node);
+    } finally {
+      _enclosingFunction = outerFunction;
+    }
+  }
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    // If this function expression is wrapped in a function declaration, don't
+    // change the enclosingFunction field.
+    if (node.parent is! FunctionDeclaration) {
+      ExecutableElement outerFunction = _enclosingFunction;
+      try {
+        _enclosingFunction = node.element;
+        return super.visitFunctionExpression(node);
+      } finally {
+        _enclosingFunction = outerFunction;
+      }
+    } else {
+      return super.visitFunctionExpression(node);
+    }
+  }
+
+  @override
+  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    Expression functionExpression = node.function;
+    DartType expressionType = functionExpression.staticType;
+    if (!_isFunctionType(expressionType)) {
+      _errorReporter.reportErrorForNode(
+          StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION,
+          functionExpression);
+    }
+    return super.visitFunctionExpressionInvocation(node);
+  }
+
+  @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    _checkForBuiltInIdentifierAsName(
+        node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
+    _checkForDefaultValueInFunctionTypeAlias(node);
+    _checkForTypeAliasCannotReferenceItself_function(node);
+    return super.visitFunctionTypeAlias(node);
+  }
+
+  @override
+  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    bool old = _isInFunctionTypedFormalParameter;
+    _isInFunctionTypedFormalParameter = true;
+    try {
+      _checkForTypeAnnotationDeferredClass(node.returnType);
+      return super.visitFunctionTypedFormalParameter(node);
+    } finally {
+      _isInFunctionTypedFormalParameter = old;
+    }
+  }
+
+  @override
+  Object visitIfStatement(IfStatement node) {
+    _checkForNonBoolCondition(node.condition);
+    return super.visitIfStatement(node);
+  }
+
+  @override
+  Object visitImportDirective(ImportDirective node) {
+    ImportElement importElement = node.element;
+    if (importElement != null) {
+      _checkForImportDuplicateLibraryName(node, importElement);
+      _checkForImportInternalLibrary(node, importElement);
+    }
+    return super.visitImportDirective(node);
+  }
+
+  @override
+  Object visitIndexExpression(IndexExpression node) {
+    _checkForArgumentTypeNotAssignableForArgument(node.index);
+    return super.visitIndexExpression(node);
+  }
+
+  @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    bool wasInConstInstanceCreation = _isInConstInstanceCreation;
+    _isInConstInstanceCreation = node.isConst;
+    try {
+      ConstructorName constructorName = node.constructorName;
+      TypeName typeName = constructorName.type;
+      DartType type = typeName.type;
+      if (type is InterfaceType) {
+        InterfaceType interfaceType = type;
+        _checkForConstOrNewWithAbstractClass(node, typeName, interfaceType);
+        _checkForConstOrNewWithEnum(node, typeName, interfaceType);
+        if (_isInConstInstanceCreation) {
+          _checkForConstWithNonConst(node);
+          _checkForConstWithUndefinedConstructor(
+              node, constructorName, typeName);
+          _checkForConstWithTypeParameters(typeName);
+          _checkForConstDeferredClass(node, constructorName, typeName);
+        } else {
+          _checkForNewWithUndefinedConstructor(node, constructorName, typeName);
+        }
+      }
+      return super.visitInstanceCreationExpression(node);
+    } finally {
+      _isInConstInstanceCreation = wasInConstInstanceCreation;
+    }
+  }
+
+  @override
+  Object visitIsExpression(IsExpression node) {
+    _checkForTypeAnnotationDeferredClass(node.type);
+    return super.visitIsExpression(node);
+  }
+
+  @override
+  Object visitListLiteral(ListLiteral node) {
+    TypeArgumentList typeArguments = node.typeArguments;
+    if (typeArguments != null) {
+      if (node.constKeyword != null) {
+        NodeList<TypeName> arguments = typeArguments.arguments;
+        if (arguments.length != 0) {
+          _checkForInvalidTypeArgumentInConstTypedLiteral(arguments,
+              CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST);
+        }
+      }
+      _checkForExpectedOneListTypeArgument(node, typeArguments);
+      _checkForListElementTypeNotAssignable(node, typeArguments);
+    }
+    return super.visitListLiteral(node);
+  }
+
+  @override
+  Object visitMapLiteral(MapLiteral node) {
+    TypeArgumentList typeArguments = node.typeArguments;
+    if (typeArguments != null) {
+      NodeList<TypeName> arguments = typeArguments.arguments;
+      if (arguments.length != 0) {
+        if (node.constKeyword != null) {
+          _checkForInvalidTypeArgumentInConstTypedLiteral(arguments,
+              CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP);
+        }
+      }
+      _checkExpectedTwoMapTypeArguments(typeArguments);
+      _checkForMapTypeNotAssignable(node, typeArguments);
+    }
+    _checkForNonConstMapAsExpressionStatement(node);
+    return super.visitMapLiteral(node);
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    ExecutableElement previousFunction = _enclosingFunction;
+    try {
+      _isInStaticMethod = node.isStatic;
+      _enclosingFunction = node.element;
+      SimpleIdentifier identifier = node.name;
+      String methodName = "";
+      if (identifier != null) {
+        methodName = identifier.name;
+      }
+      TypeName returnTypeName = node.returnType;
+      if (node.isSetter || node.isGetter) {
+        _checkForMismatchedAccessorTypes(node, methodName);
+      }
+      if (node.isGetter) {
+        _checkForVoidReturnType(node);
+        _checkForConflictingStaticGetterAndInstanceSetter(node);
+      } else if (node.isSetter) {
+        _checkForInvalidModifierOnBody(
+            node.body, CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER);
+        _checkForWrongNumberOfParametersForSetter(node.name, node.parameters);
+        _checkForNonVoidReturnTypeForSetter(returnTypeName);
+        _checkForConflictingStaticSetterAndInstanceMember(node);
+      } else if (node.isOperator) {
+        _checkForOptionalParameterInOperator(node);
+        _checkForWrongNumberOfParametersForOperator(node);
+        _checkForNonVoidReturnTypeForOperator(node);
+      }
+      _checkForConcreteClassWithAbstractMember(node);
+      _checkForAllInvalidOverrideErrorCodesForMethod(node);
+      _checkForTypeAnnotationDeferredClass(returnTypeName);
+      _checkForIllegalReturnType(returnTypeName);
+      return super.visitMethodDeclaration(node);
+    } finally {
+      _enclosingFunction = previousFunction;
+      _isInStaticMethod = false;
+    }
+  }
+
+  @override
+  Object visitMethodInvocation(MethodInvocation node) {
+    Expression target = node.realTarget;
+    SimpleIdentifier methodName = node.methodName;
+    if (target != null) {
+      ClassElement typeReference = ElementResolver.getTypeReference(target);
+      _checkForStaticAccessToInstanceMember(typeReference, methodName);
+      _checkForInstanceAccessToStaticMember(typeReference, methodName);
+    } else {
+      _checkForUnqualifiedReferenceToNonLocalStaticMember(methodName);
+    }
+    return super.visitMethodInvocation(node);
+  }
+
+  @override
+  Object visitNativeClause(NativeClause node) {
+    // TODO(brianwilkerson) Figure out the right rule for when 'native' is
+    // allowed.
+    if (!_isInSystemLibrary) {
+      _errorReporter.reportErrorForNode(
+          ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE, node);
+    }
+    return super.visitNativeClause(node);
+  }
+
+  @override
+  Object visitNativeFunctionBody(NativeFunctionBody node) {
+    _checkForNativeFunctionBodyInNonSDKCode(node);
+    return super.visitNativeFunctionBody(node);
+  }
+
+  @override
+  Object visitPostfixExpression(PostfixExpression node) {
+    _checkForAssignmentToFinal(node.operand);
+    _checkForIntNotAssignable(node.operand);
+    return super.visitPostfixExpression(node);
+  }
+
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    if (node.parent is! Annotation) {
+      ClassElement typeReference =
+          ElementResolver.getTypeReference(node.prefix);
+      SimpleIdentifier name = node.identifier;
+      _checkForStaticAccessToInstanceMember(typeReference, name);
+      _checkForInstanceAccessToStaticMember(typeReference, name);
+    }
+    return super.visitPrefixedIdentifier(node);
+  }
+
+  @override
+  Object visitPrefixExpression(PrefixExpression node) {
+    sc.TokenType operatorType = node.operator.type;
+    Expression operand = node.operand;
+    if (operatorType == sc.TokenType.BANG) {
+      _checkForNonBoolNegationExpression(operand);
+    } else if (operatorType.isIncrementOperator) {
+      _checkForAssignmentToFinal(operand);
+    }
+    _checkForIntNotAssignable(operand);
+    return super.visitPrefixExpression(node);
+  }
+
+  @override
+  Object visitPropertyAccess(PropertyAccess node) {
+    bool isConditional = node.operator.type == sc.TokenType.QUESTION_PERIOD;
+    ClassElement typeReference =
+        ElementResolver.getTypeReference(node.realTarget);
+    SimpleIdentifier propertyName = node.propertyName;
+    _checkForStaticAccessToInstanceMember(typeReference, propertyName);
+    _checkForInstanceAccessToStaticMember(typeReference, propertyName);
+    return super.visitPropertyAccess(node);
+  }
+
+  @override
+  Object visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    _isInConstructorInitializer = true;
+    try {
+      return super.visitRedirectingConstructorInvocation(node);
+    } finally {
+      _isInConstructorInitializer = false;
+    }
+  }
+
+  @override
+  Object visitRethrowExpression(RethrowExpression node) {
+    _checkForRethrowOutsideCatch(node);
+    return super.visitRethrowExpression(node);
+  }
+
+  @override
+  Object visitReturnStatement(ReturnStatement node) {
+    if (node.expression == null) {
+      _returnsWithout.add(node);
+    } else {
+      _returnsWith.add(node);
+    }
+    _checkForAllReturnStatementErrorCodes(node);
+    return super.visitReturnStatement(node);
+  }
+
+  @override
+  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+    _checkForConstFormalParameter(node);
+    _checkForPrivateOptionalParameter(node);
+    _checkForTypeAnnotationDeferredClass(node.type);
+    return super.visitSimpleFormalParameter(node);
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    _checkForImplicitThisReferenceInInitializer(node);
+    if (!_isUnqualifiedReferenceToNonLocalStaticMemberAllowed(node)) {
+      _checkForUnqualifiedReferenceToNonLocalStaticMember(node);
+    }
+    return super.visitSimpleIdentifier(node);
+  }
+
+  @override
+  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    _isInConstructorInitializer = true;
+    try {
+      return super.visitSuperConstructorInvocation(node);
+    } finally {
+      _isInConstructorInitializer = false;
+    }
+  }
+
+  @override
+  Object visitSwitchStatement(SwitchStatement node) {
+    _checkForSwitchExpressionNotAssignable(node);
+    _checkForCaseBlocksNotTerminated(node);
+    _checkForMissingEnumConstantInSwitch(node);
+    return super.visitSwitchStatement(node);
+  }
+
+  @override
+  Object visitThisExpression(ThisExpression node) {
+    _checkForInvalidReferenceToThis(node);
+    return super.visitThisExpression(node);
+  }
+
+  @override
+  Object visitThrowExpression(ThrowExpression node) {
+    _checkForConstEvalThrowsException(node);
+    return super.visitThrowExpression(node);
+  }
+
+  @override
+  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    _checkForFinalNotInitialized(node.variables);
+    return super.visitTopLevelVariableDeclaration(node);
+  }
+
+  @override
+  Object visitTypeArgumentList(TypeArgumentList node) {
+    NodeList<TypeName> list = node.arguments;
+    for (TypeName typeName in list) {
+      _checkForTypeAnnotationDeferredClass(typeName);
+    }
+    return super.visitTypeArgumentList(node);
+  }
+
+  @override
+  Object visitTypeName(TypeName node) {
+    _checkForTypeArgumentNotMatchingBounds(node);
+    _checkForTypeParameterReferencedByStatic(node);
+    return super.visitTypeName(node);
+  }
+
+  @override
+  Object visitTypeParameter(TypeParameter node) {
+    _checkForBuiltInIdentifierAsName(node.name,
+        CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME);
+    _checkForTypeParameterSupertypeOfItsBound(node);
+    _checkForTypeAnnotationDeferredClass(node.bound);
+    return super.visitTypeParameter(node);
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    SimpleIdentifier nameNode = node.name;
+    Expression initializerNode = node.initializer;
+    // do checks
+    _checkForInvalidAssignment(nameNode, initializerNode);
+    // visit name
+    nameNode.accept(this);
+    // visit initializer
+    String name = nameNode.name;
+    _namesForReferenceToDeclaredVariableInInitializer.add(name);
+    bool wasInInstanceVariableInitializer = _isInInstanceVariableInitializer;
+    _isInInstanceVariableInitializer = _isInInstanceVariableDeclaration;
+    try {
+      if (initializerNode != null) {
+        initializerNode.accept(this);
+      }
+    } finally {
+      _isInInstanceVariableInitializer = wasInInstanceVariableInitializer;
+      _namesForReferenceToDeclaredVariableInInitializer.remove(name);
+    }
+    // done
+    return null;
+  }
+
+  @override
+  Object visitVariableDeclarationList(VariableDeclarationList node) {
+    _checkForTypeAnnotationDeferredClass(node.type);
+    return super.visitVariableDeclarationList(node);
+  }
+
+  @override
+  Object visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    _checkForFinalNotInitialized(node.variables);
+    return super.visitVariableDeclarationStatement(node);
+  }
+
+  @override
+  Object visitWhileStatement(WhileStatement node) {
+    _checkForNonBoolCondition(node.condition);
+    return super.visitWhileStatement(node);
+  }
+
+  @override
+  Object visitYieldStatement(YieldStatement node) {
+    if (_inGenerator) {
+      _checkForYieldOfInvalidType(node.expression, node.star != null);
+    } else {
+      CompileTimeErrorCode errorCode;
+      if (node.star != null) {
+        errorCode = CompileTimeErrorCode.YIELD_EACH_IN_NON_GENERATOR;
+      } else {
+        errorCode = CompileTimeErrorCode.YIELD_IN_NON_GENERATOR;
+      }
+      _errorReporter.reportErrorForNode(errorCode, node);
+    }
+    return super.visitYieldStatement(node);
+  }
+
+  /**
+   * Verify that the given list of [typeArguments] contains exactly two
+   * elements.
+   *
+   * See [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS].
+   */
+  bool _checkExpectedTwoMapTypeArguments(TypeArgumentList typeArguments) {
+    // check number of type arguments
+    int num = typeArguments.arguments.length;
+    if (num == 2) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(
+        StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS, typeArguments,
+        [num]);
+    return true;
+  }
+
+  /**
+   * Verify that the given [constructor] declaration does not violate any of the
+   * error codes relating to the initialization of fields in the enclosing
+   * class.
+   *
+   * See [_initialFieldElementsMap],
+   * [StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR], and
+   * [CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES].
+   */
+  bool _checkForAllFinalInitializedErrorCodes(
+      ConstructorDeclaration constructor) {
+    if (constructor.factoryKeyword != null ||
+        constructor.redirectedConstructor != null ||
+        constructor.externalKeyword != null) {
+      return false;
+    }
+    // Ignore if native class.
+    if (_isInNativeClass) {
+      return false;
+    }
+    bool foundError = false;
+    HashMap<FieldElement, INIT_STATE> fieldElementsMap =
+        new HashMap<FieldElement, INIT_STATE>.from(_initialFieldElementsMap);
+    // Visit all of the field formal parameters
+    NodeList<FormalParameter> formalParameters =
+        constructor.parameters.parameters;
+    for (FormalParameter formalParameter in formalParameters) {
+      FormalParameter parameter = formalParameter;
+      if (parameter is DefaultFormalParameter) {
+        parameter = (parameter as DefaultFormalParameter).parameter;
+      }
+      if (parameter is FieldFormalParameter) {
+        FieldElement fieldElement =
+            (parameter.element as FieldFormalParameterElementImpl).field;
+        INIT_STATE state = fieldElementsMap[fieldElement];
+        if (state == INIT_STATE.NOT_INIT) {
+          fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_FIELD_FORMAL;
+        } else if (state == INIT_STATE.INIT_IN_DECLARATION) {
+          if (fieldElement.isFinal || fieldElement.isConst) {
+            _errorReporter.reportErrorForNode(
+                StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR,
+                formalParameter.identifier, [fieldElement.displayName]);
+            foundError = true;
+          }
+        } else if (state == INIT_STATE.INIT_IN_FIELD_FORMAL) {
+          if (fieldElement.isFinal || fieldElement.isConst) {
+            _errorReporter.reportErrorForNode(
+                CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES,
+                formalParameter.identifier, [fieldElement.displayName]);
+            foundError = true;
+          }
+        }
+      }
+    }
+    // Visit all of the initializers
+    NodeList<ConstructorInitializer> initializers = constructor.initializers;
+    for (ConstructorInitializer constructorInitializer in initializers) {
+      if (constructorInitializer is RedirectingConstructorInvocation) {
+        return false;
+      }
+      if (constructorInitializer is ConstructorFieldInitializer) {
+        ConstructorFieldInitializer constructorFieldInitializer =
+            constructorInitializer;
+        SimpleIdentifier fieldName = constructorFieldInitializer.fieldName;
+        Element element = fieldName.staticElement;
+        if (element is FieldElement) {
+          FieldElement fieldElement = element;
+          INIT_STATE state = fieldElementsMap[fieldElement];
+          if (state == INIT_STATE.NOT_INIT) {
+            fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_INITIALIZERS;
+          } else if (state == INIT_STATE.INIT_IN_DECLARATION) {
+            if (fieldElement.isFinal || fieldElement.isConst) {
+              _errorReporter.reportErrorForNode(
+                  StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION,
+                  fieldName);
+              foundError = true;
+            }
+          } else if (state == INIT_STATE.INIT_IN_FIELD_FORMAL) {
+            _errorReporter.reportErrorForNode(
+                CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER,
+                fieldName);
+            foundError = true;
+          } else if (state == INIT_STATE.INIT_IN_INITIALIZERS) {
+            _errorReporter.reportErrorForNode(
+                CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
+                fieldName, [fieldElement.displayName]);
+            foundError = true;
+          }
+        }
+      }
+    }
+    // Prepare a list of not initialized fields.
+    List<FieldElement> notInitFinalFields = <FieldElement>[];
+    fieldElementsMap.forEach((FieldElement fieldElement, INIT_STATE state) {
+      if (state == INIT_STATE.NOT_INIT) {
+        if (fieldElement.isFinal) {
+          notInitFinalFields.add(fieldElement);
+        }
+      }
+    });
+    // Visit all of the states in the map to ensure that none were never
+    // initialized.
+    fieldElementsMap.forEach((FieldElement fieldElement, INIT_STATE state) {
+      if (state == INIT_STATE.NOT_INIT) {
+        if (fieldElement.isConst) {
+          _errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.CONST_NOT_INITIALIZED,
+              constructor.returnType, [fieldElement.name]);
+          foundError = true;
+        }
+      }
+    });
+    if (notInitFinalFields.isNotEmpty) {
+      foundError = true;
+      AnalysisErrorWithProperties analysisError;
+      if (notInitFinalFields.length == 1) {
+        analysisError = _errorReporter.newErrorWithProperties(
+            StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1,
+            constructor.returnType, [notInitFinalFields[0].name]);
+      } else if (notInitFinalFields.length == 2) {
+        analysisError = _errorReporter.newErrorWithProperties(
+            StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_2,
+            constructor.returnType, [
+          notInitFinalFields[0].name,
+          notInitFinalFields[1].name
+        ]);
+      } else {
+        analysisError = _errorReporter.newErrorWithProperties(
+            StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS,
+            constructor.returnType, [
+          notInitFinalFields[0].name,
+          notInitFinalFields[1].name,
+          notInitFinalFields.length - 2
+        ]);
+      }
+      analysisError.setProperty(
+          ErrorProperty.NOT_INITIALIZED_FIELDS, notInitFinalFields);
+      _errorReporter.reportError(analysisError);
+    }
+    return foundError;
+  }
+
+  /**
+   * Check the given [executableElement] against override-error codes. The
+   * [overriddenExecutable] is the element that the executable element is
+   * overriding. The [parameters] is the parameters of the executable element.
+   * The [errorNameTarget] is the node to report problems on.
+   *
+   * See [StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC],
+   * [CompileTimeErrorCode.INVALID_OVERRIDE_REQUIRED],
+   * [CompileTimeErrorCode.INVALID_OVERRIDE_POSITIONAL],
+   * [CompileTimeErrorCode.INVALID_OVERRIDE_NAMED],
+   * [StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE],
+   * [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE],
+   * [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE],
+   * [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE],
+   * [StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE],
+   * [StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE], and
+   * [StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES].
+   */
+  bool _checkForAllInvalidOverrideErrorCodes(
+      ExecutableElement executableElement,
+      ExecutableElement overriddenExecutable, List<ParameterElement> parameters,
+      List<AstNode> parameterLocations, SimpleIdentifier errorNameTarget) {
+    bool isGetter = false;
+    bool isSetter = false;
+    if (executableElement is PropertyAccessorElement) {
+      PropertyAccessorElement accessorElement = executableElement;
+      isGetter = accessorElement.isGetter;
+      isSetter = accessorElement.isSetter;
+    }
+    String executableElementName = executableElement.name;
+    FunctionType overridingFT = executableElement.type;
+    FunctionType overriddenFT = overriddenExecutable.type;
+    InterfaceType enclosingType = _enclosingClass.type;
+    overriddenFT = _inheritanceManager
+        .substituteTypeArgumentsInMemberFromInheritance(
+            overriddenFT, executableElementName, enclosingType);
+    if (overridingFT == null || overriddenFT == null) {
+      return false;
+    }
+    DartType overridingFTReturnType = overridingFT.returnType;
+    DartType overriddenFTReturnType = overriddenFT.returnType;
+    List<DartType> overridingNormalPT = overridingFT.normalParameterTypes;
+    List<DartType> overriddenNormalPT = overriddenFT.normalParameterTypes;
+    List<DartType> overridingPositionalPT = overridingFT.optionalParameterTypes;
+    List<DartType> overriddenPositionalPT = overriddenFT.optionalParameterTypes;
+    Map<String, DartType> overridingNamedPT = overridingFT.namedParameterTypes;
+    Map<String, DartType> overriddenNamedPT = overriddenFT.namedParameterTypes;
+    // CTEC.INVALID_OVERRIDE_REQUIRED, CTEC.INVALID_OVERRIDE_POSITIONAL and
+    // CTEC.INVALID_OVERRIDE_NAMED
+    if (overridingNormalPT.length > overriddenNormalPT.length) {
+      _errorReporter.reportErrorForNode(
+          StaticWarningCode.INVALID_OVERRIDE_REQUIRED, errorNameTarget, [
+        overriddenNormalPT.length,
+        overriddenExecutable.enclosingElement.displayName
+      ]);
+      return true;
+    }
+    if (overridingNormalPT.length + overridingPositionalPT.length <
+        overriddenPositionalPT.length + overriddenNormalPT.length) {
+      _errorReporter.reportErrorForNode(
+          StaticWarningCode.INVALID_OVERRIDE_POSITIONAL, errorNameTarget, [
+        overriddenPositionalPT.length + overriddenNormalPT.length,
+        overriddenExecutable.enclosingElement.displayName
+      ]);
+      return true;
+    }
+    // For each named parameter in the overridden method, verify that there is
+    // the same name in the overriding method.
+    for (String overriddenParamName in overriddenNamedPT.keys) {
+      if (!overridingNamedPT.containsKey(overriddenParamName)) {
+        // The overridden method expected the overriding method to have
+        // overridingParamName, but it does not.
+        _errorReporter.reportErrorForNode(
+            StaticWarningCode.INVALID_OVERRIDE_NAMED, errorNameTarget, [
+          overriddenParamName,
+          overriddenExecutable.enclosingElement.displayName
+        ]);
+        return true;
+      }
+    }
+    // SWC.INVALID_METHOD_OVERRIDE_RETURN_TYPE
+    if (overriddenFTReturnType != VoidTypeImpl.instance &&
+        !overridingFTReturnType.isAssignableTo(overriddenFTReturnType)) {
+      _errorReporter.reportTypeErrorForNode(!isGetter
+              ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE
+              : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE,
+          errorNameTarget, [
+        overridingFTReturnType,
+        overriddenFTReturnType,
+        overriddenExecutable.enclosingElement.displayName
+      ]);
+      return true;
+    }
+    // SWC.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
+    if (parameterLocations == null) {
+      return false;
+    }
+    int parameterIndex = 0;
+    for (int i = 0; i < overridingNormalPT.length; i++) {
+      if (!overridingNormalPT[i].isAssignableTo(overriddenNormalPT[i])) {
+        _errorReporter.reportTypeErrorForNode(!isSetter
+                ? StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
+                : StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE,
+            parameterLocations[parameterIndex], [
+          overridingNormalPT[i],
+          overriddenNormalPT[i],
+          overriddenExecutable.enclosingElement.displayName
+        ]);
+        return true;
+      }
+      parameterIndex++;
+    }
+    // SWC.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE
+    for (int i = 0; i < overriddenPositionalPT.length; i++) {
+      if (!overridingPositionalPT[i]
+          .isAssignableTo(overriddenPositionalPT[i])) {
+        _errorReporter.reportTypeErrorForNode(
+            StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE,
+            parameterLocations[parameterIndex], [
+          overridingPositionalPT[i],
+          overriddenPositionalPT[i],
+          overriddenExecutable.enclosingElement.displayName
+        ]);
+        return true;
+      }
+      parameterIndex++;
+    }
+    // SWC.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE &
+    // SWC.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES
+    for (String overriddenName in overriddenNamedPT.keys) {
+      DartType overridingType = overridingNamedPT[overriddenName];
+      if (overridingType == null) {
+        // Error, this is never reached- INVALID_OVERRIDE_NAMED would have been
+        // created above if this could be reached.
+        continue;
+      }
+      DartType overriddenType = overriddenNamedPT[overriddenName];
+      if (!overriddenType.isAssignableTo(overridingType)) {
+        // lookup the parameter for the error to select
+        ParameterElement parameterToSelect = null;
+        AstNode parameterLocationToSelect = null;
+        for (int i = 0; i < parameters.length; i++) {
+          ParameterElement parameter = parameters[i];
+          if (parameter.parameterKind == ParameterKind.NAMED &&
+              overriddenName == parameter.name) {
+            parameterToSelect = parameter;
+            parameterLocationToSelect = parameterLocations[i];
+            break;
+          }
+        }
+        if (parameterToSelect != null) {
+          _errorReporter.reportTypeErrorForNode(
+              StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE,
+              parameterLocationToSelect, [
+            overridingType,
+            overriddenType,
+            overriddenExecutable.enclosingElement.displayName
+          ]);
+          return true;
+        }
+      }
+    }
+    // SWC.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES
+    //
+    // Create three lists: a list of the optional parameter ASTs
+    // (FormalParameters), a list of the optional parameters elements from our
+    // method, and finally a list of the optional parameter elements from the
+    // method we are overriding.
+    //
+    bool foundError = false;
+    List<AstNode> formalParameters = new List<AstNode>();
+    List<ParameterElementImpl> parameterElts = new List<ParameterElementImpl>();
+    List<ParameterElementImpl> overriddenParameterElts =
+        new List<ParameterElementImpl>();
+    List<ParameterElement> overriddenPEs = overriddenExecutable.parameters;
+    for (int i = 0; i < parameters.length; i++) {
+      ParameterElement parameter = parameters[i];
+      if (parameter.parameterKind.isOptional) {
+        formalParameters.add(parameterLocations[i]);
+        parameterElts.add(parameter as ParameterElementImpl);
+      }
+    }
+    for (ParameterElement parameterElt in overriddenPEs) {
+      if (parameterElt.parameterKind.isOptional) {
+        if (parameterElt is ParameterElementImpl) {
+          overriddenParameterElts.add(parameterElt);
+        }
+      }
+    }
+    //
+    // Next compare the list of optional parameter elements to the list of
+    // overridden optional parameter elements.
+    //
+    if (parameterElts.length > 0) {
+      if (parameterElts[0].parameterKind == ParameterKind.NAMED) {
+        // Named parameters, consider the names when matching the parameterElts
+        // to the overriddenParameterElts
+        for (int i = 0; i < parameterElts.length; i++) {
+          ParameterElementImpl parameterElt = parameterElts[i];
+          EvaluationResultImpl result = parameterElt.evaluationResult;
+          // TODO (jwren) Ignore Object types, see Dart bug 11287
+          if (_isUserDefinedObject(result)) {
+            continue;
+          }
+          String parameterName = parameterElt.name;
+          for (int j = 0; j < overriddenParameterElts.length; j++) {
+            ParameterElementImpl overriddenParameterElt =
+                overriddenParameterElts[j];
+            if (overriddenParameterElt.initializer == null) {
+              // There is no warning if the overridden parameter has an
+              // implicit default.
+              continue;
+            }
+            String overriddenParameterName = overriddenParameterElt.name;
+            if (parameterName != null &&
+                parameterName == overriddenParameterName) {
+              EvaluationResultImpl overriddenResult =
+                  overriddenParameterElt.evaluationResult;
+              if (_isUserDefinedObject(overriddenResult)) {
+                break;
+              }
+              if (!result.equalValues(_typeProvider, overriddenResult)) {
+                _errorReporter.reportErrorForNode(
+                    StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED,
+                    formalParameters[i], [
+                  overriddenExecutable.enclosingElement.displayName,
+                  overriddenExecutable.displayName,
+                  parameterName
+                ]);
+                foundError = true;
+              }
+            }
+          }
+        }
+      } else {
+        // Positional parameters, consider the positions when matching the
+        // parameterElts to the overriddenParameterElts
+        for (int i = 0;
+            i < parameterElts.length && i < overriddenParameterElts.length;
+            i++) {
+          ParameterElementImpl parameterElt = parameterElts[i];
+          EvaluationResultImpl result = parameterElt.evaluationResult;
+          // TODO (jwren) Ignore Object types, see Dart bug 11287
+          if (_isUserDefinedObject(result)) {
+            continue;
+          }
+          ParameterElementImpl overriddenParameterElt =
+              overriddenParameterElts[i];
+          if (overriddenParameterElt.initializer == null) {
+            // There is no warning if the overridden parameter has an implicit
+            // default.
+            continue;
+          }
+          EvaluationResultImpl overriddenResult =
+              overriddenParameterElt.evaluationResult;
+          if (_isUserDefinedObject(overriddenResult)) {
+            continue;
+          }
+          if (!result.equalValues(_typeProvider, overriddenResult)) {
+            _errorReporter.reportErrorForNode(
+                StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL,
+                formalParameters[i], [
+              overriddenExecutable.enclosingElement.displayName,
+              overriddenExecutable.displayName
+            ]);
+            foundError = true;
+          }
+        }
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * Check the given [executableElement] against override-error codes. This
+   * method computes the given executableElement is overriding and calls
+   * [_checkForAllInvalidOverrideErrorCodes] when the [InheritanceManager]
+   * returns a [MultiplyInheritedExecutableElement], this method loops through
+   * the list in the [MultiplyInheritedExecutableElement]. The [parameters] are
+   * the parameters of the executable element. The [errorNameTarget] is the node
+   * to report problems on.
+   */
+  bool _checkForAllInvalidOverrideErrorCodesForExecutable(
+      ExecutableElement executableElement, List<ParameterElement> parameters,
+      List<AstNode> parameterLocations, SimpleIdentifier errorNameTarget) {
+    //
+    // Compute the overridden executable from the InheritanceManager
+    //
+    List<ExecutableElement> overriddenExecutables = _inheritanceManager
+        .lookupOverrides(_enclosingClass, executableElement.name);
+    if (_checkForInstanceMethodNameCollidesWithSuperclassStatic(
+        executableElement, errorNameTarget)) {
+      return true;
+    }
+    for (ExecutableElement overriddenElement in overriddenExecutables) {
+      if (_checkForAllInvalidOverrideErrorCodes(executableElement,
+          overriddenElement, parameters, parameterLocations, errorNameTarget)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Check the given field [declaration] against override-error codes.
+   *
+   * See [_checkForAllInvalidOverrideErrorCodes].
+   */
+  bool _checkForAllInvalidOverrideErrorCodesForField(
+      FieldDeclaration declaration) {
+    if (_enclosingClass == null || declaration.isStatic) {
+      return false;
+    }
+    bool hasProblems = false;
+    VariableDeclarationList fields = declaration.fields;
+    for (VariableDeclaration field in fields.variables) {
+      FieldElement element = field.element as FieldElement;
+      if (element == null) {
+        continue;
+      }
+      PropertyAccessorElement getter = element.getter;
+      PropertyAccessorElement setter = element.setter;
+      SimpleIdentifier fieldName = field.name;
+      if (getter != null) {
+        if (_checkForAllInvalidOverrideErrorCodesForExecutable(getter,
+            ParameterElement.EMPTY_LIST, AstNode.EMPTY_LIST, fieldName)) {
+          hasProblems = true;
+        }
+      }
+      if (setter != null) {
+        if (_checkForAllInvalidOverrideErrorCodesForExecutable(
+            setter, setter.parameters, <AstNode>[fieldName], fieldName)) {
+          hasProblems = true;
+        }
+      }
+    }
+    return hasProblems;
+  }
+
+  /**
+   * Check the given [method] declaration against override-error codes.
+   *
+   * See [_checkForAllInvalidOverrideErrorCodes].
+   */
+  bool _checkForAllInvalidOverrideErrorCodesForMethod(
+      MethodDeclaration method) {
+    if (_enclosingClass == null ||
+        method.isStatic ||
+        method.body is NativeFunctionBody) {
+      return false;
+    }
+    ExecutableElement executableElement = method.element;
+    if (executableElement == null) {
+      return false;
+    }
+    SimpleIdentifier methodName = method.name;
+    if (methodName.isSynthetic) {
+      return false;
+    }
+    FormalParameterList formalParameterList = method.parameters;
+    NodeList<FormalParameter> parameterList =
+        formalParameterList != null ? formalParameterList.parameters : null;
+    List<AstNode> parameters =
+        parameterList != null ? new List.from(parameterList) : null;
+    return _checkForAllInvalidOverrideErrorCodesForExecutable(executableElement,
+        executableElement.parameters, parameters, methodName);
+  }
+
+  /**
+   * Verify that all classes of the given [withClause] are valid.
+   *
+   * See [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR],
+   * [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT], and
+   * [CompileTimeErrorCode.MIXIN_REFERENCES_SUPER].
+   */
+  bool _checkForAllMixinErrorCodes(WithClause withClause) {
+    if (withClause == null) {
+      return false;
+    }
+    bool problemReported = false;
+    for (TypeName mixinName in withClause.mixinTypes) {
+      DartType mixinType = mixinName.type;
+      if (mixinType is! InterfaceType) {
+        continue;
+      }
+      if (_checkForExtendsOrImplementsDisallowedClass(
+          mixinName, CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS)) {
+        problemReported = true;
+      } else {
+        ClassElement mixinElement = (mixinType as InterfaceType).element;
+        if (_checkForExtendsOrImplementsDeferredClass(
+            mixinName, CompileTimeErrorCode.MIXIN_DEFERRED_CLASS)) {
+          problemReported = true;
+        }
+        if (_checkForMixinDeclaresConstructor(mixinName, mixinElement)) {
+          problemReported = true;
+        }
+        if (!enableSuperMixins &&
+            _checkForMixinInheritsNotFromObject(mixinName, mixinElement)) {
+          problemReported = true;
+        }
+        if (_checkForMixinReferencesSuper(mixinName, mixinElement)) {
+          problemReported = true;
+        }
+      }
+    }
+    return problemReported;
+  }
+
+  /**
+   * Check for errors related to the redirected constructors.
+   *
+   * See [StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE],
+   * [StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE], and
+   * [StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR].
+   */
+  bool _checkForAllRedirectConstructorErrorCodes(
+      ConstructorDeclaration declaration) {
+    //
+    // Prepare redirected constructor node
+    //
+    ConstructorName redirectedConstructor = declaration.redirectedConstructor;
+    if (redirectedConstructor == null) {
+      return false;
+    }
+    //
+    // Prepare redirected constructor type
+    //
+    ConstructorElement redirectedElement = redirectedConstructor.staticElement;
+    if (redirectedElement == null) {
+      //
+      // If the element is null, we check for the
+      // REDIRECT_TO_MISSING_CONSTRUCTOR case
+      //
+      TypeName constructorTypeName = redirectedConstructor.type;
+      DartType redirectedType = constructorTypeName.type;
+      if (redirectedType != null &&
+          redirectedType.element != null &&
+          !redirectedType.isDynamic) {
+        //
+        // Prepare the constructor name
+        //
+        String constructorStrName = constructorTypeName.name.name;
+        if (redirectedConstructor.name != null) {
+          constructorStrName += ".${redirectedConstructor.name.name}";
+        }
+        ErrorCode errorCode = (declaration.constKeyword != null
+            ? CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR
+            : StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR);
+        _errorReporter.reportErrorForNode(errorCode, redirectedConstructor, [
+          constructorStrName,
+          redirectedType.displayName
+        ]);
+        return true;
+      }
+      return false;
+    }
+    FunctionType redirectedType = redirectedElement.type;
+    DartType redirectedReturnType = redirectedType.returnType;
+    //
+    // Report specific problem when return type is incompatible
+    //
+    FunctionType constructorType = declaration.element.type;
+    DartType constructorReturnType = constructorType.returnType;
+    if (!redirectedReturnType.isAssignableTo(constructorReturnType)) {
+      _errorReporter.reportErrorForNode(
+          StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE,
+          redirectedConstructor, [redirectedReturnType, constructorReturnType]);
+      return true;
+    }
+    //
+    // Check parameters
+    //
+    if (!redirectedType.isSubtypeOf(constructorType)) {
+      _errorReporter.reportErrorForNode(
+          StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE,
+          redirectedConstructor, [redirectedType, constructorType]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Check that the return [statement] of the form <i>return e;</i> is not in a
+   * generative constructor.
+   *
+   * Check that return statements without expressions are not in a generative
+   * constructor and the return type is not assignable to `null`; that is, we
+   * don't have `return;` if the enclosing method has a return type.
+   *
+   * Check that the return type matches the type of the declared return type in
+   * the enclosing method or function.
+   *
+   * See [CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR],
+   * [StaticWarningCode.RETURN_WITHOUT_VALUE], and
+   * [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE].
+   */
+  bool _checkForAllReturnStatementErrorCodes(ReturnStatement statement) {
+    FunctionType functionType =
+        _enclosingFunction == null ? null : _enclosingFunction.type;
+    DartType expectedReturnType = functionType == null
+        ? DynamicTypeImpl.instance
+        : functionType.returnType;
+    Expression returnExpression = statement.expression;
+    // RETURN_IN_GENERATIVE_CONSTRUCTOR
+    bool isGenerativeConstructor = _enclosingFunction is ConstructorElement &&
+        !(_enclosingFunction as ConstructorElement).isFactory;
+    if (isGenerativeConstructor) {
+      if (returnExpression == null) {
+        return false;
+      }
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR,
+          returnExpression);
+      return true;
+    }
+    // RETURN_WITHOUT_VALUE
+    if (returnExpression == null) {
+      if (_inGenerator ||
+          _computeReturnTypeForMethod(null)
+              .isAssignableTo(expectedReturnType)) {
+        return false;
+      }
+      _hasReturnWithoutValue = true;
+      _errorReporter.reportErrorForNode(
+          StaticWarningCode.RETURN_WITHOUT_VALUE, statement);
+      return true;
+    } else if (_inGenerator) {
+      // RETURN_IN_GENERATOR
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.RETURN_IN_GENERATOR, statement);
+    }
+    // RETURN_OF_INVALID_TYPE
+    return _checkForReturnOfInvalidType(returnExpression, expectedReturnType);
+  }
+
+  /**
+   * Verify that the export namespace of the given export [directive] does not
+   * export any name already exported by another export directive. The
+   * [exportElement] is the [ExportElement] retrieved from the node. If the
+   * element in the node was `null`, then this method is not called. The
+   * [exportedLibrary] is the library element containing the exported element.
+   *
+   * See [CompileTimeErrorCode.AMBIGUOUS_EXPORT].
+   */
+  bool _checkForAmbiguousExport(ExportDirective directive,
+      ExportElement exportElement, LibraryElement exportedLibrary) {
+    if (exportedLibrary == null) {
+      return false;
+    }
+    // check exported names
+    Namespace namespace =
+        new NamespaceBuilder().createExportNamespaceForDirective(exportElement);
+    Map<String, Element> definedNames = namespace.definedNames;
+    for (String name in definedNames.keys) {
+      Element element = definedNames[name];
+      Element prevElement = _exportedElements[name];
+      if (element != null && prevElement != null && prevElement != element) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.AMBIGUOUS_EXPORT,
+            directive, [
+          name,
+          prevElement.library.definingCompilationUnit.displayName,
+          element.library.definingCompilationUnit.displayName
+        ]);
+        return true;
+      } else {
+        _exportedElements[name] = element;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the given [expression] can be assigned to its corresponding
+   * parameters. The [expectedStaticType] is the expected static type of the
+   * parameter. The [actualStaticType] is the actual static type of the
+   * argument.
+   *
+   * This method corresponds to
+   * [BestPracticesVerifier.checkForArgumentTypeNotAssignable].
+   *
+   * See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE],
+   * [CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE],
+   * [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE],
+   * [CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE],
+   * [CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE],
+   * [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE], and
+   * [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE].
+   */
+  bool _checkForArgumentTypeNotAssignable(Expression expression,
+      DartType expectedStaticType, DartType actualStaticType,
+      ErrorCode errorCode) {
+    //
+    // Warning case: test static type information
+    //
+    if (actualStaticType != null && expectedStaticType != null) {
+      if (!actualStaticType.isAssignableTo(expectedStaticType)) {
+        _errorReporter.reportTypeErrorForNode(
+            errorCode, expression, [actualStaticType, expectedStaticType]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the given [argument] can be assigned to its corresponding
+   * parameter.
+   *
+   * This method corresponds to
+   * [BestPracticesVerifier.checkForArgumentTypeNotAssignableForArgument].
+   *
+   * See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
+   */
+  bool _checkForArgumentTypeNotAssignableForArgument(Expression argument) {
+    if (argument == null) {
+      return false;
+    }
+    ParameterElement staticParameterElement = argument.staticParameterElement;
+    DartType staticParameterType =
+        staticParameterElement == null ? null : staticParameterElement.type;
+    return _checkForArgumentTypeNotAssignableWithExpectedTypes(argument,
+        staticParameterType, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
+  }
+
+  /**
+   * Verify that the given [expression] can be assigned to its corresponding
+   * parameters. The [expectedStaticType] is the expected static type.
+   *
+   * This method corresponds to
+   * [BestPracticesVerifier.checkForArgumentTypeNotAssignableWithExpectedTypes].
+   *
+   * See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE],
+   * [CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE],
+   * [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE],
+   * [CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE],
+   * [CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE],
+   * [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE], and
+   * [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE].
+   */
+  bool _checkForArgumentTypeNotAssignableWithExpectedTypes(
+      Expression expression, DartType expectedStaticType,
+      ErrorCode errorCode) => _checkForArgumentTypeNotAssignable(
+          expression, expectedStaticType, getStaticType(expression), errorCode);
+
+  /**
+   * Verify that the arguments in the given [argumentList] can be assigned to
+   * their corresponding parameters.
+   *
+   * This method corresponds to
+   * [BestPracticesVerifier.checkForArgumentTypesNotAssignableInList].
+   *
+   * See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
+   */
+  bool _checkForArgumentTypesNotAssignableInList(ArgumentList argumentList) {
+    if (argumentList == null) {
+      return false;
+    }
+    bool problemReported = false;
+    for (Expression argument in argumentList.arguments) {
+      if (_checkForArgumentTypeNotAssignableForArgument(argument)) {
+        problemReported = true;
+      }
+    }
+    return problemReported;
+  }
+
+  /**
+   * Check that the static type of the given expression is assignable to the
+   * given type. If it isn't, report an error with the given error code. The
+   * [type] is the type that the expression must be assignable to. The
+   * [errorCode] is the error code to be reported. The [arguments] are the
+   * arguments to pass in when creating the error.
+   */
+  bool _checkForAssignability(Expression expression, InterfaceType type,
+      ErrorCode errorCode, List<Object> arguments) {
+    if (expression == null) {
+      return false;
+    }
+    DartType expressionType = expression.staticType;
+    if (expressionType == null) {
+      return false;
+    }
+    if (expressionType.isAssignableTo(type)) {
+      return false;
+    }
+    _errorReporter.reportErrorForNode(errorCode, expression, arguments);
+    return true;
+  }
+
+  /**
+   * Verify that the given [expression] is not final.
+   *
+   * See [StaticWarningCode.ASSIGNMENT_TO_CONST],
+   * [StaticWarningCode.ASSIGNMENT_TO_FINAL], and
+   * [StaticWarningCode.ASSIGNMENT_TO_METHOD].
+   */
+  bool _checkForAssignmentToFinal(Expression expression) {
+    // prepare element
+    Element element = null;
+    AstNode highlightedNode = expression;
+    if (expression is Identifier) {
+      element = expression.staticElement;
+      if (expression is PrefixedIdentifier) {
+        highlightedNode = expression.identifier;
+      }
+    } else if (expression is PropertyAccess) {
+      PropertyAccess propertyAccess = expression;
+      element = propertyAccess.propertyName.staticElement;
+      highlightedNode = propertyAccess.propertyName;
+    }
+    // check if element is assignable
+    if (element is PropertyAccessorElement) {
+      PropertyAccessorElement accessor = element as PropertyAccessorElement;
+      element = accessor.variable;
+    }
+    if (element is VariableElement) {
+      if (element.isConst) {
+        _errorReporter.reportErrorForNode(
+            StaticWarningCode.ASSIGNMENT_TO_CONST, expression);
+        return true;
+      }
+      if (element.isFinal) {
+        if (element is FieldElementImpl &&
+            element.setter == null &&
+            element.isSynthetic) {
+          _errorReporter.reportErrorForNode(
+              StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER, highlightedNode,
+              [element.name, element.enclosingElement.displayName]);
+          return true;
+        }
+        _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_FINAL,
+            highlightedNode, [element.name]);
+        return true;
+      }
+      return false;
+    }
+    if (element is FunctionElement) {
+      _errorReporter.reportErrorForNode(
+          StaticWarningCode.ASSIGNMENT_TO_FUNCTION, expression);
+      return true;
+    }
+    if (element is MethodElement) {
+      _errorReporter.reportErrorForNode(
+          StaticWarningCode.ASSIGNMENT_TO_METHOD, expression);
+      return true;
+    }
+    if (element is ClassElement ||
+        element is FunctionTypeAliasElement ||
+        element is TypeParameterElement) {
+      _errorReporter.reportErrorForNode(
+          StaticWarningCode.ASSIGNMENT_TO_TYPE, expression);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the given [identifier] is not a keyword, and generates the
+   * given [errorCode] on the identifier if it is a keyword.
+   *
+   * See [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME],
+   * [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME], and
+   * [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME].
+   */
+  bool _checkForBuiltInIdentifierAsName(
+      SimpleIdentifier identifier, ErrorCode errorCode) {
+    sc.Token token = identifier.token;
+    if (token.type == sc.TokenType.KEYWORD) {
+      _errorReporter.reportErrorForNode(
+          errorCode, identifier, [identifier.name]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the given [switchCase] is terminated with 'break', 'continue',
+   * 'return' or 'throw'.
+   *
+   * see [StaticWarningCode.CASE_BLOCK_NOT_TERMINATED].
+   */
+  bool _checkForCaseBlockNotTerminated(SwitchCase switchCase) {
+    NodeList<Statement> statements = switchCase.statements;
+    if (statements.isEmpty) {
+      // fall-through without statements at all
+      AstNode parent = switchCase.parent;
+      if (parent is SwitchStatement) {
+        SwitchStatement switchStatement = parent;
+        NodeList<SwitchMember> members = switchStatement.members;
+        int index = members.indexOf(switchCase);
+        if (index != -1 && index < members.length - 1) {
+          return false;
+        }
+      }
+      // no other switch member after this one
+    } else {
+      Statement statement = statements[statements.length - 1];
+      // terminated with statement
+      if (statement is BreakStatement ||
+          statement is ContinueStatement ||
+          statement is ReturnStatement) {
+        return false;
+      }
+      // terminated with 'throw' expression
+      if (statement is ExpressionStatement) {
+        Expression expression = statement.expression;
+        if (expression is ThrowExpression) {
+          return false;
+        }
+      }
+    }
+    // report error
+    _errorReporter.reportErrorForToken(
+        StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, switchCase.keyword);
+    return true;
+  }
+
+  /**
+   * Verify that the switch cases in the given switch [statement] are terminated
+   * with 'break', 'continue', 'return' or 'throw'.
+   *
+   * See [StaticWarningCode.CASE_BLOCK_NOT_TERMINATED].
+   */
+  bool _checkForCaseBlocksNotTerminated(SwitchStatement statement) {
+    bool foundError = false;
+    NodeList<SwitchMember> members = statement.members;
+    int lastMember = members.length - 1;
+    for (int i = 0; i < lastMember; i++) {
+      SwitchMember member = members[i];
+      if (member is SwitchCase && _checkForCaseBlockNotTerminated(member)) {
+        foundError = true;
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * Verify that the given [method] declaration is abstract only if the
+   * enclosing class is also abstract.
+   *
+   * See [StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER].
+   */
+  bool _checkForConcreteClassWithAbstractMember(MethodDeclaration method) {
+    if (method.isAbstract &&
+        _enclosingClass != null &&
+        !_enclosingClass.isAbstract) {
+      SimpleIdentifier nameNode = method.name;
+      String memberName = nameNode.name;
+      ExecutableElement overriddenMember;
+      if (method.isGetter) {
+        overriddenMember = _enclosingClass.lookUpInheritedConcreteGetter(
+            memberName, _currentLibrary);
+      } else if (method.isSetter) {
+        overriddenMember = _enclosingClass.lookUpInheritedConcreteSetter(
+            memberName, _currentLibrary);
+      } else {
+        overriddenMember = _enclosingClass.lookUpInheritedConcreteMethod(
+            memberName, _currentLibrary);
+      }
+      if (overriddenMember == null) {
+        _errorReporter.reportErrorForNode(
+            StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, nameNode, [
+          memberName,
+          _enclosingClass.displayName
+        ]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Verify all possible conflicts of the given [constructor]'s name with other
+   * constructors and members of the same class. The [constructorElement] is the
+   * constructor's element.
+   *
+   * See [CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT],
+   * [CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME],
+   * [CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD], and
+   * [CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD].
+   */
+  bool _checkForConflictingConstructorNameAndMember(
+      ConstructorDeclaration constructor,
+      ConstructorElement constructorElement) {
+    SimpleIdentifier constructorName = constructor.name;
+    String name = constructorElement.name;
+    ClassElement classElement = constructorElement.enclosingElement;
+    // constructors
+    List<ConstructorElement> constructors = classElement.constructors;
+    for (ConstructorElement otherConstructor in constructors) {
+      if (identical(otherConstructor, constructorElement)) {
+        continue;
+      }
+      if (name == otherConstructor.name) {
+        if (name == null || name.length == 0) {
+          _errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT, constructor);
+        } else {
+          _errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME, constructor,
+              [name]);
+        }
+        return true;
+      }
+    }
+    // conflict with class member
+    if (constructorName != null &&
+        constructorElement != null &&
+        !constructorName.isSynthetic) {
+      // fields
+      FieldElement field = classElement.getField(name);
+      if (field != null) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD,
+            constructor, [name]);
+        return true;
+      }
+      // methods
+      MethodElement method = classElement.getMethod(name);
+      if (method != null) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD,
+            constructor, [name]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the [_enclosingClass] does not have a method and getter pair
+   * with the same name on, via inheritance.
+   *
+   * See [CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD], and
+   * [CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER].
+   */
+  bool _checkForConflictingGetterAndMethod() {
+    if (_enclosingClass == null) {
+      return false;
+    }
+    bool hasProblem = false;
+    // method declared in the enclosing class vs. inherited getter
+    for (MethodElement method in _enclosingClass.methods) {
+      String name = method.name;
+      // find inherited property accessor (and can be only getter)
+      ExecutableElement inherited =
+          _inheritanceManager.lookupInheritance(_enclosingClass, name);
+      if (inherited is! PropertyAccessorElement) {
+        continue;
+      }
+      // report problem
+      hasProblem = true;
+      _errorReporter.reportErrorForOffset(
+          CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD, method.nameOffset,
+          name.length, [
+        _enclosingClass.displayName,
+        inherited.enclosingElement.displayName,
+        name
+      ]);
+    }
+    // getter declared in the enclosing class vs. inherited method
+    for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
+      if (!accessor.isGetter) {
+        continue;
+      }
+      String name = accessor.name;
+      // find inherited method
+      ExecutableElement inherited =
+          _inheritanceManager.lookupInheritance(_enclosingClass, name);
+      if (inherited is! MethodElement) {
+        continue;
+      }
+      // report problem
+      hasProblem = true;
+      _errorReporter.reportErrorForOffset(
+          CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER,
+          accessor.nameOffset, name.length, [
+        _enclosingClass.displayName,
+        inherited.enclosingElement.displayName,
+        name
+      ]);
+    }
+    // done
+    return hasProblem;
+  }
+
+  /**
+   * Verify that the superclass of the [_enclosingClass] does not declare
+   * accessible static members with the same name as the instance
+   * getters/setters declared in [_enclosingClass].
+   *
+   * See [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER], and
+   * [StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER].
+   */
+  bool _checkForConflictingInstanceGetterAndSuperclassMember() {
+    if (_enclosingClass == null) {
+      return false;
+    }
+    InterfaceType enclosingType = _enclosingClass.type;
+    // check every accessor
+    bool hasProblem = false;
+    for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
+      // we analyze instance accessors here
+      if (accessor.isStatic) {
+        continue;
+      }
+      // prepare accessor properties
+      String name = accessor.displayName;
+      bool getter = accessor.isGetter;
+      // if non-final variable, ignore setter - we alreay reported problem for
+      // getter
+      if (accessor.isSetter && accessor.isSynthetic) {
+        continue;
+      }
+      // try to find super element
+      ExecutableElement superElement;
+      superElement =
+          enclosingType.lookUpGetterInSuperclass(name, _currentLibrary);
+      if (superElement == null) {
+        superElement =
+            enclosingType.lookUpSetterInSuperclass(name, _currentLibrary);
+      }
+      if (superElement == null) {
+        superElement =
+            enclosingType.lookUpMethodInSuperclass(name, _currentLibrary);
+      }
+      if (superElement == null) {
+        continue;
+      }
+      // OK, not static
+      if (!superElement.isStatic) {
+        continue;
+      }
+      // prepare "super" type to report its name
+      ClassElement superElementClass =
+          superElement.enclosingElement as ClassElement;
+      InterfaceType superElementType = superElementClass.type;
+      // report problem
+      hasProblem = true;
+      if (getter) {
+        _errorReporter.reportErrorForElement(
+            StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER,
+            accessor, [superElementType.displayName]);
+      } else {
+        _errorReporter.reportErrorForElement(
+            StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER,
+            accessor, [superElementType.displayName]);
+      }
+    }
+    // done
+    return hasProblem;
+  }
+
+  /**
+   * Verify that the enclosing class does not have a setter with the same name
+   * as the given instance method declaration.
+   *
+   * TODO(jwren) add other "conflicting" error codes into algorithm/ data
+   * structure.
+   *
+   * See [StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER].
+   */
+  bool _checkForConflictingInstanceMethodSetter(ClassDeclaration declaration) {
+    // Reference all of the class members in this class.
+    NodeList<ClassMember> classMembers = declaration.members;
+    if (classMembers.isEmpty) {
+      return false;
+    }
+    // Create a HashMap to track conflicting members, and then loop through
+    // members in the class to construct the HashMap, at the same time,
+    // look for violations.  Don't add members if they are part of a conflict,
+    // this prevents multiple warnings for one issue.
+    bool foundError = false;
+    HashMap<String, ClassMember> memberHashMap =
+        new HashMap<String, ClassMember>();
+    for (ClassMember classMember in classMembers) {
+      if (classMember is MethodDeclaration) {
+        MethodDeclaration method = classMember;
+        if (method.isStatic) {
+          continue;
+        }
+        // prepare name
+        SimpleIdentifier name = method.name;
+        if (name == null) {
+          continue;
+        }
+        bool addThisMemberToTheMap = true;
+        bool isGetter = method.isGetter;
+        bool isSetter = method.isSetter;
+        bool isOperator = method.isOperator;
+        bool isMethod = !isGetter && !isSetter && !isOperator;
+        // Do lookups in the enclosing class (and the inherited member) if the
+        // member is a method or a setter for
+        // StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER warning.
+        if (isMethod) {
+          String setterName = "${name.name}=";
+          Element enclosingElementOfSetter = null;
+          ClassMember conflictingSetter = memberHashMap[setterName];
+          if (conflictingSetter != null) {
+            enclosingElementOfSetter =
+                conflictingSetter.element.enclosingElement;
+          } else {
+            ExecutableElement elementFromInheritance = _inheritanceManager
+                .lookupInheritance(_enclosingClass, setterName);
+            if (elementFromInheritance != null) {
+              enclosingElementOfSetter =
+                  elementFromInheritance.enclosingElement;
+            }
+          }
+          if (enclosingElementOfSetter != null) {
+            // report problem
+            _errorReporter.reportErrorForNode(
+                StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER, name, [
+              _enclosingClass.displayName,
+              name.name,
+              enclosingElementOfSetter.displayName
+            ]);
+            foundError = true;
+            addThisMemberToTheMap = false;
+          }
+        } else if (isSetter) {
+          String methodName = name.name;
+          ClassMember conflictingMethod = memberHashMap[methodName];
+          if (conflictingMethod != null &&
+              conflictingMethod is MethodDeclaration &&
+              !conflictingMethod.isGetter) {
+            // report problem
+            _errorReporter.reportErrorForNode(
+                StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER2, name, [
+              _enclosingClass.displayName,
+              name.name
+            ]);
+            foundError = true;
+            addThisMemberToTheMap = false;
+          }
+        }
+        // Finally, add this member into the HashMap.
+        if (addThisMemberToTheMap) {
+          if (method.isSetter) {
+            memberHashMap["${name.name}="] = method;
+          } else {
+            memberHashMap[name.name] = method;
+          }
+        }
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * Verify that the enclosing class does not have an instance member with the
+   * same name as the given static [method] declaration.
+   *
+   * See [StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER].
+   */
+  bool _checkForConflictingStaticGetterAndInstanceSetter(
+      MethodDeclaration method) {
+    if (!method.isStatic) {
+      return false;
+    }
+    // prepare name
+    SimpleIdentifier nameNode = method.name;
+    if (nameNode == null) {
+      return false;
+    }
+    String name = nameNode.name;
+    // prepare enclosing type
+    if (_enclosingClass == null) {
+      return false;
+    }
+    InterfaceType enclosingType = _enclosingClass.type;
+    // try to find setter
+    ExecutableElement setter =
+        enclosingType.lookUpSetter(name, _currentLibrary);
+    if (setter == null) {
+      return false;
+    }
+    // OK, also static
+    if (setter.isStatic) {
+      return false;
+    }
+    // prepare "setter" type to report its name
+    ClassElement setterClass = setter.enclosingElement as ClassElement;
+    InterfaceType setterType = setterClass.type;
+    // report problem
+    _errorReporter.reportErrorForNode(
+        StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER,
+        nameNode, [setterType.displayName]);
+    return true;
+  }
+
+  /**
+   * Verify that the enclosing class does not have an instance member with the
+   * same name as the given static [method] declaration.
+   *
+   * See [StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER].
+   */
+  bool _checkForConflictingStaticSetterAndInstanceMember(
+      MethodDeclaration method) {
+    if (!method.isStatic) {
+      return false;
+    }
+    // prepare name
+    SimpleIdentifier nameNode = method.name;
+    if (nameNode == null) {
+      return false;
+    }
+    String name = nameNode.name;
+    // prepare enclosing type
+    if (_enclosingClass == null) {
+      return false;
+    }
+    InterfaceType enclosingType = _enclosingClass.type;
+    // try to find member
+    ExecutableElement member;
+    member = enclosingType.lookUpMethod(name, _currentLibrary);
+    if (member == null) {
+      member = enclosingType.lookUpGetter(name, _currentLibrary);
+    }
+    if (member == null) {
+      member = enclosingType.lookUpSetter(name, _currentLibrary);
+    }
+    if (member == null) {
+      return false;
+    }
+    // OK, also static
+    if (member.isStatic) {
+      return false;
+    }
+    // prepare "member" type to report its name
+    ClassElement memberClass = member.enclosingElement as ClassElement;
+    InterfaceType memberType = memberClass.type;
+    // report problem
+    _errorReporter.reportErrorForNode(
+        StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER,
+        nameNode, [memberType.displayName]);
+    return true;
+  }
+
+  /**
+   * Verify all conflicts between type variable and enclosing class.
+   * TODO(scheglov)
+   *
+   * See [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS], and
+   * [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER].
+   */
+  bool _checkForConflictingTypeVariableErrorCodes(
+      ClassDeclaration declaration) {
+    bool problemReported = false;
+    for (TypeParameterElement typeParameter in _enclosingClass.typeParameters) {
+      String name = typeParameter.name;
+      // name is same as the name of the enclosing class
+      if (_enclosingClass.name == name) {
+        _errorReporter.reportErrorForOffset(
+            CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS,
+            typeParameter.nameOffset, name.length, [name]);
+        problemReported = true;
+      }
+      // check members
+      if (_enclosingClass.getMethod(name) != null ||
+          _enclosingClass.getGetter(name) != null ||
+          _enclosingClass.getSetter(name) != null) {
+        _errorReporter.reportErrorForOffset(
+            CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER,
+            typeParameter.nameOffset, name.length, [name]);
+        problemReported = true;
+      }
+    }
+    return problemReported;
+  }
+
+  /**
+   * Verify that if the given [constructor] declaration is 'const' then there
+   * are no invocations of non-'const' super constructors.
+   *
+   * See [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER].
+   */
+  bool _checkForConstConstructorWithNonConstSuper(
+      ConstructorDeclaration constructor) {
+    if (!_isEnclosingConstructorConst) {
+      return false;
+    }
+    // OK, const factory, checked elsewhere
+    if (constructor.factoryKeyword != null) {
+      return false;
+    }
+    // check for mixins
+    if (_enclosingClass.mixins.length != 0) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN,
+          constructor.returnType);
+      return true;
+    }
+    // try to find and check super constructor invocation
+    for (ConstructorInitializer initializer in constructor.initializers) {
+      if (initializer is SuperConstructorInvocation) {
+        SuperConstructorInvocation superInvocation = initializer;
+        ConstructorElement element = superInvocation.staticElement;
+        if (element == null || element.isConst) {
+          return false;
+        }
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER,
+            superInvocation, [element.enclosingElement.displayName]);
+        return true;
+      }
+    }
+    // no explicit super constructor invocation, check default constructor
+    InterfaceType supertype = _enclosingClass.supertype;
+    if (supertype == null) {
+      return false;
+    }
+    if (supertype.isObject) {
+      return false;
+    }
+    ConstructorElement unnamedConstructor =
+        supertype.element.unnamedConstructor;
+    if (unnamedConstructor == null) {
+      return false;
+    }
+    if (unnamedConstructor.isConst) {
+      return false;
+    }
+    // default constructor is not 'const', report problem
+    _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER,
+        constructor.returnType, [supertype.displayName]);
+    return true;
+  }
+
+  /**
+   * Verify that if the given [constructor] declaration is 'const' then there
+   * are no non-final instance variable. The [constructorElement] is the
+   * constructor element.
+   *
+   * See [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD].
+   */
+  bool _checkForConstConstructorWithNonFinalField(
+      ConstructorDeclaration constructor,
+      ConstructorElement constructorElement) {
+    if (!_isEnclosingConstructorConst) {
+      return false;
+    }
+    // check if there is non-final field
+    ClassElement classElement = constructorElement.enclosingElement;
+    if (!classElement.hasNonFinalField) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
+        constructor);
+    return true;
+  }
+
+  /**
+   * Verify that the given 'const' instance creation [expression] is not
+   * creating a deferred type. The [constructorName] is the constructor name,
+   * always non-`null`. The [typeName] is the name of the type defining the
+   * constructor, always non-`null`.
+   *
+   * See [CompileTimeErrorCode.CONST_DEFERRED_CLASS].
+   */
+  bool _checkForConstDeferredClass(InstanceCreationExpression expression,
+      ConstructorName constructorName, TypeName typeName) {
+    if (typeName.isDeferred) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.CONST_DEFERRED_CLASS, constructorName,
+          [typeName.name.name]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the given throw [expression] is not enclosed in a 'const'
+   * constructor declaration.
+   *
+   * See [CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION].
+   */
+  bool _checkForConstEvalThrowsException(ThrowExpression expression) {
+    if (_isEnclosingConstructorConst) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION, expression);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the given normal formal [parameter] is not 'const'.
+   *
+   * See [CompileTimeErrorCode.CONST_FORMAL_PARAMETER].
+   */
+  bool _checkForConstFormalParameter(NormalFormalParameter parameter) {
+    if (parameter.isConst) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.CONST_FORMAL_PARAMETER, parameter);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the given instance creation [expression] is not being invoked
+   * on an abstract class. The [typeName] is the [TypeName] of the
+   * [ConstructorName] from the [InstanceCreationExpression], this is the AST
+   * node that the error is attached to. The [type] is the type being
+   * constructed with this [InstanceCreationExpression].
+   *
+   * See [StaticWarningCode.CONST_WITH_ABSTRACT_CLASS], and
+   * [StaticWarningCode.NEW_WITH_ABSTRACT_CLASS].
+   */
+  bool _checkForConstOrNewWithAbstractClass(
+      InstanceCreationExpression expression, TypeName typeName,
+      InterfaceType type) {
+    if (type.element.isAbstract) {
+      ConstructorElement element = expression.staticElement;
+      if (element != null && !element.isFactory) {
+        if ((expression.keyword as sc.KeywordToken).keyword ==
+            sc.Keyword.CONST) {
+          _errorReporter.reportErrorForNode(
+              StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, typeName);
+        } else {
+          _errorReporter.reportErrorForNode(
+              StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, typeName);
+        }
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the given instance creation [expression] is not being invoked
+   * on an enum. The [typeName] is the [TypeName] of the [ConstructorName] from
+   * the [InstanceCreationExpression], this is the AST node that the error is
+   * attached to. The [type] is the type being constructed with this
+   * [InstanceCreationExpression].
+   *
+   * See [CompileTimeErrorCode.INSTANTIATE_ENUM].
+   */
+  bool _checkForConstOrNewWithEnum(InstanceCreationExpression expression,
+      TypeName typeName, InterfaceType type) {
+    if (type.element.isEnum) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.INSTANTIATE_ENUM, typeName);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the given 'const' instance creation [expression] is not being
+   * invoked on a constructor that is not 'const'.
+   *
+   * This method assumes that the instance creation was tested to be 'const'
+   * before being called.
+   *
+   * See [CompileTimeErrorCode.CONST_WITH_NON_CONST].
+   */
+  bool _checkForConstWithNonConst(InstanceCreationExpression expression) {
+    ConstructorElement constructorElement = expression.staticElement;
+    if (constructorElement != null && !constructorElement.isConst) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.CONST_WITH_NON_CONST, expression);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the given [typeName] does not reference any type parameters.
+   *
+   * See [CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS].
+   */
+  bool _checkForConstWithTypeParameters(TypeName typeName) {
+    // something wrong with AST
+    if (typeName == null) {
+      return false;
+    }
+    Identifier name = typeName.name;
+    if (name == null) {
+      return false;
+    }
+    // should not be a type parameter
+    if (name.staticElement is TypeParameterElement) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS, name);
+    }
+    // check type arguments
+    TypeArgumentList typeArguments = typeName.typeArguments;
+    if (typeArguments != null) {
+      bool hasError = false;
+      for (TypeName argument in typeArguments.arguments) {
+        if (_checkForConstWithTypeParameters(argument)) {
+          hasError = true;
+        }
+      }
+      return hasError;
+    }
+    // OK
+    return false;
+  }
+
+  /**
+   * Verify that if the given 'const' instance creation [expression] is being
+   * invoked on the resolved constructor. The [constructorName] is the
+   * constructor name, always non-`null`. The [typeName] is the name of the type
+   * defining the constructor, always non-`null`.
+   *
+   * This method assumes that the instance creation was tested to be 'const'
+   * before being called.
+   *
+   * See [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR], and
+   * [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT].
+   */
+  bool _checkForConstWithUndefinedConstructor(
+      InstanceCreationExpression expression, ConstructorName constructorName,
+      TypeName typeName) {
+    // OK if resolved
+    if (expression.staticElement != null) {
+      return false;
+    }
+    DartType type = typeName.type;
+    if (type is InterfaceType) {
+      ClassElement element = type.element;
+      if (element != null && element.isEnum) {
+        // We have already reported the error.
+        return false;
+      }
+    }
+    Identifier className = typeName.name;
+    // report as named or default constructor absence
+    SimpleIdentifier name = constructorName.name;
+    if (name != null) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR, name, [
+        className,
+        name
+      ]);
+    } else {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
+          constructorName, [className]);
+    }
+    return true;
+  }
+
+  /**
+   * Verify that there are no default parameters in the given function type
+   * [alias].
+   *
+   * See [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS].
+   */
+  bool _checkForDefaultValueInFunctionTypeAlias(FunctionTypeAlias alias) {
+    bool result = false;
+    FormalParameterList formalParameterList = alias.parameters;
+    NodeList<FormalParameter> parameters = formalParameterList.parameters;
+    for (FormalParameter formalParameter in parameters) {
+      if (formalParameter is DefaultFormalParameter) {
+        DefaultFormalParameter defaultFormalParameter = formalParameter;
+        if (defaultFormalParameter.defaultValue != null) {
+          _errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS, alias);
+          result = true;
+        }
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Verify that the given default formal [parameter] is not part of a function
+   * typed parameter.
+   *
+   * See [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER].
+   */
+  bool _checkForDefaultValueInFunctionTypedParameter(
+      DefaultFormalParameter parameter) {
+    // OK, not in a function typed parameter.
+    if (!_isInFunctionTypedFormalParameter) {
+      return false;
+    }
+    // OK, no default value.
+    if (parameter.defaultValue == null) {
+      return false;
+    }
+    // Report problem.
+    _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER,
+        parameter);
+    return true;
+  }
+
+  /**
+   * Verify that any deferred imports in the given compilation [unit] have a
+   * unique prefix.
+   *
+   * See [CompileTimeErrorCode.SHARED_DEFERRED_PREFIX].
+   */
+  bool _checkForDeferredPrefixCollisions(CompilationUnit unit) {
+    bool foundError = false;
+    NodeList<Directive> directives = unit.directives;
+    int count = directives.length;
+    if (count > 0) {
+      HashMap<PrefixElement, List<ImportDirective>> prefixToDirectivesMap =
+          new HashMap<PrefixElement, List<ImportDirective>>();
+      for (int i = 0; i < count; i++) {
+        Directive directive = directives[i];
+        if (directive is ImportDirective) {
+          ImportDirective importDirective = directive;
+          SimpleIdentifier prefix = importDirective.prefix;
+          if (prefix != null) {
+            Element element = prefix.staticElement;
+            if (element is PrefixElement) {
+              PrefixElement prefixElement = element;
+              List<ImportDirective> elements =
+                  prefixToDirectivesMap[prefixElement];
+              if (elements == null) {
+                elements = new List<ImportDirective>();
+                prefixToDirectivesMap[prefixElement] = elements;
+              }
+              elements.add(importDirective);
+            }
+          }
+        }
+      }
+      for (List<ImportDirective> imports in prefixToDirectivesMap.values) {
+        if (_hasDeferredPrefixCollision(imports)) {
+          foundError = true;
+        }
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * Verify that the enclosing class does not have an instance member with the
+   * given name of the static member.
+   *
+   * See [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE].
+   */
+  bool _checkForDuplicateDefinitionInheritance() {
+    if (_enclosingClass == null) {
+      return false;
+    }
+    bool hasProblem = false;
+    for (ExecutableElement member in _enclosingClass.methods) {
+      if (member.isStatic && _checkForDuplicateDefinitionOfMember(member)) {
+        hasProblem = true;
+      }
+    }
+    for (ExecutableElement member in _enclosingClass.accessors) {
+      if (member.isStatic && _checkForDuplicateDefinitionOfMember(member)) {
+        hasProblem = true;
+      }
+    }
+    return hasProblem;
+  }
+
+  /**
+   * Verify that the enclosing class does not have an instance member with the
+   * given name of the [staticMember].
+   *
+   * See [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE].
+   */
+  bool _checkForDuplicateDefinitionOfMember(ExecutableElement staticMember) {
+    // prepare name
+    String name = staticMember.name;
+    if (name == null) {
+      return false;
+    }
+    // try to find member
+    ExecutableElement inheritedMember =
+        _inheritanceManager.lookupInheritance(_enclosingClass, name);
+    if (inheritedMember == null) {
+      return false;
+    }
+    // OK, also static
+    if (inheritedMember.isStatic) {
+      return false;
+    }
+    // determine the display name, use the extended display name if the
+    // enclosing class of the inherited member is in a different source
+    String displayName;
+    Element enclosingElement = inheritedMember.enclosingElement;
+    if (enclosingElement.source == _enclosingClass.source) {
+      displayName = enclosingElement.displayName;
+    } else {
+      displayName = enclosingElement.getExtendedDisplayName(null);
+    }
+    // report problem
+    _errorReporter.reportErrorForOffset(
+        CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE,
+        staticMember.nameOffset, name.length, [name, displayName]);
+    return true;
+  }
+
+  /**
+   * Verify that if the given list [literal] has type arguments then there is
+   * exactly one. The [typeArguments] are the type arguments.
+   *
+   * See [StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS].
+   */
+  bool _checkForExpectedOneListTypeArgument(
+      ListLiteral literal, TypeArgumentList typeArguments) {
+    // check number of type arguments
+    int num = typeArguments.arguments.length;
+    if (num == 1) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(
+        StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS, typeArguments,
+        [num]);
+    return true;
+  }
+
+  /**
+   * Verify that the given export [directive] has a unique name among other
+   * exported libraries. The [exportElement] is the [ExportElement] retrieved
+   * from the node, if the element in the node was `null`, then this method is
+   * not called. The [exportedLibrary] is the library element containing the
+   * exported element.
+   *
+   * See [CompileTimeErrorCode.EXPORT_DUPLICATED_LIBRARY_NAME].
+   */
+  bool _checkForExportDuplicateLibraryName(ExportDirective directive,
+      ExportElement exportElement, LibraryElement exportedLibrary) {
+    if (exportedLibrary == null) {
+      return false;
+    }
+    String name = exportedLibrary.name;
+    // check if there is other exported library with the same name
+    LibraryElement prevLibrary = _nameToExportElement[name];
+    if (prevLibrary != null) {
+      if (prevLibrary != exportedLibrary) {
+        if (!name.isEmpty) {
+          _errorReporter.reportErrorForNode(
+              StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAMED, directive, [
+            prevLibrary.definingCompilationUnit.displayName,
+            exportedLibrary.definingCompilationUnit.displayName,
+            name
+          ]);
+        }
+        return true;
+      }
+    } else {
+      _nameToExportElement[name] = exportedLibrary;
+    }
+    // OK
+    return false;
+  }
+
+  /**
+   * Check that if the visiting library is not system, then any given library
+   * should not be SDK internal library. The [exportElement] is the
+   * [ExportElement] retrieved from the node, if the element in the node was
+   * `null`, then this method is not called.
+   *
+   * See [CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY].
+   */
+  bool _checkForExportInternalLibrary(
+      ExportDirective directive, ExportElement exportElement) {
+    if (_isInSystemLibrary) {
+      return false;
+    }
+    // should be private
+    DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
+    String uri = exportElement.uri;
+    SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri);
+    if (sdkLibrary == null) {
+      return false;
+    }
+    if (!sdkLibrary.isInternal) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY, directive,
+        [directive.uri]);
+    return true;
+  }
+
+  /**
+   * Verify that the given extends [clause] does not extend a deferred class.
+   *
+   * See [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS].
+   */
+  bool _checkForExtendsDeferredClass(ExtendsClause clause) {
+    if (clause == null) {
+      return false;
+    }
+    return _checkForExtendsOrImplementsDeferredClass(
+        clause.superclass, CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS);
+  }
+
+  /**
+   * Verify that the given type [alias] does not extend a deferred class.
+   *
+   * See [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS].
+   */
+  bool _checkForExtendsDeferredClassInTypeAlias(ClassTypeAlias alias) {
+    if (alias == null) {
+      return false;
+    }
+    return _checkForExtendsOrImplementsDeferredClass(
+        alias.superclass, CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS);
+  }
+
+  /**
+   * Verify that the given extends [clause] does not extend classes such as
+   * 'num' or 'String'.
+   *
+   * See [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS].
+   */
+  bool _checkForExtendsDisallowedClass(ExtendsClause clause) {
+    if (clause == null) {
+      return false;
+    }
+    return _checkForExtendsOrImplementsDisallowedClass(
+        clause.superclass, CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS);
+  }
+
+  /**
+   * Verify that the given type [alias] does not extend classes such as 'num' or
+   * 'String'.
+   *
+   * See [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS].
+   */
+  bool _checkForExtendsDisallowedClassInTypeAlias(ClassTypeAlias alias) {
+    if (alias == null) {
+      return false;
+    }
+    return _checkForExtendsOrImplementsDisallowedClass(
+        alias.superclass, CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS);
+  }
+
+  /**
+   * Verify that the given [typeName] does not extend, implement or mixin
+   * classes that are deferred.
+   *
+   * See [_checkForExtendsDeferredClass],
+   * [_checkForExtendsDeferredClassInTypeAlias],
+   * [_checkForImplementsDeferredClass],
+   * [_checkForAllMixinErrorCodes],
+   * [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS],
+   * [CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS], and
+   * [CompileTimeErrorCode.MIXIN_DEFERRED_CLASS].
+   */
+  bool _checkForExtendsOrImplementsDeferredClass(
+      TypeName typeName, ErrorCode errorCode) {
+    if (typeName.isSynthetic) {
+      return false;
+    }
+    if (typeName.isDeferred) {
+      _errorReporter.reportErrorForNode(
+          errorCode, typeName, [typeName.name.name]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the given [typeName] does not extend, implement or mixin
+   * classes such as 'num' or 'String'.
+   *
+   * See [_checkForExtendsDisallowedClass],
+   * [_checkForExtendsDisallowedClassInTypeAlias],
+   * [_checkForImplementsDisallowedClass],
+   * [_checkForAllMixinErrorCodes],
+   * [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS],
+   * [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS], and
+   * [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS].
+   */
+  bool _checkForExtendsOrImplementsDisallowedClass(
+      TypeName typeName, ErrorCode errorCode) {
+    if (typeName.isSynthetic) {
+      return false;
+    }
+    DartType superType = typeName.type;
+    for (InterfaceType disallowedType
+        in _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT) {
+      if (superType != null && superType == disallowedType) {
+        // if the violating type happens to be 'num', we need to rule out the
+        // case where the enclosing class is 'int' or 'double'
+        if (superType == _typeProvider.numType) {
+          AstNode grandParent = typeName.parent.parent;
+          // Note: this is a corner case that won't happen often, so adding a
+          // field currentClass (see currentFunction) to ErrorVerifier isn't
+          // worth if for this case, but if the field currentClass is added,
+          // then this message should become a todo to not lookup the
+          // grandparent node.
+          if (grandParent is ClassDeclaration) {
+            ClassElement classElement = grandParent.element;
+            DartType classType = classElement.type;
+            if (classType != null &&
+                (classType == _intType ||
+                    classType == _typeProvider.doubleType)) {
+              return false;
+            }
+          }
+        }
+        // otherwise, report the error
+        _errorReporter.reportErrorForNode(
+            errorCode, typeName, [disallowedType.displayName]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the given constructor field [initializer] has compatible field
+   * and initializer expression types. The [staticElement] is the static element
+   * from the name in the [ConstructorFieldInitializer].
+   *
+   * See [CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE], and
+   * [StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE].
+   */
+  bool _checkForFieldInitializerNotAssignable(
+      ConstructorFieldInitializer initializer, Element staticElement) {
+    // prepare field element
+    if (staticElement is! FieldElement) {
+      return false;
+    }
+    FieldElement fieldElement = staticElement as FieldElement;
+    // prepare field type
+    DartType fieldType = fieldElement.type;
+    // prepare expression type
+    Expression expression = initializer.expression;
+    if (expression == null) {
+      return false;
+    }
+    // test the static type of the expression
+    DartType staticType = getStaticType(expression);
+    if (staticType == null) {
+      return false;
+    }
+    if (staticType.isAssignableTo(fieldType)) {
+      return false;
+    }
+    // report problem
+    if (_isEnclosingConstructorConst) {
+      // TODO(paulberry): this error should be based on the actual type of the
+      // constant, not the static type.  See dartbug.com/21119.
+      _errorReporter.reportTypeErrorForNode(
+          CheckedModeCompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE,
+          expression, [staticType, fieldType]);
+    }
+    _errorReporter.reportTypeErrorForNode(
+        StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [
+      staticType,
+      fieldType
+    ]);
+    return true;
+    // TODO(brianwilkerson) Define a hint corresponding to these errors and
+    // report it if appropriate.
+//        // test the propagated type of the expression
+//        Type propagatedType = expression.getPropagatedType();
+//        if (propagatedType != null && propagatedType.isAssignableTo(fieldType)) {
+//          return false;
+//        }
+//        // report problem
+//        if (isEnclosingConstructorConst) {
+//          errorReporter.reportTypeErrorForNode(
+//              CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE,
+//              expression,
+//              propagatedType == null ? staticType : propagatedType,
+//              fieldType);
+//        } else {
+//          errorReporter.reportTypeErrorForNode(
+//              StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE,
+//              expression,
+//              propagatedType == null ? staticType : propagatedType,
+//              fieldType);
+//        }
+//        return true;
+  }
+
+  /**
+   * Verify that the given field formal [parameter] is in a constructor
+   * declaration.
+   *
+   * See [CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR].
+   */
+  bool _checkForFieldInitializingFormalRedirectingConstructor(
+      FieldFormalParameter parameter) {
+    ConstructorDeclaration constructor =
+        parameter.getAncestor((node) => node is ConstructorDeclaration);
+    if (constructor == null) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
+          parameter);
+      return true;
+    }
+    // constructor cannot be a factory
+    if (constructor.factoryKeyword != null) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY_CONSTRUCTOR,
+          parameter);
+      return true;
+    }
+    // constructor cannot have a redirection
+    for (ConstructorInitializer initializer in constructor.initializers) {
+      if (initializer is RedirectingConstructorInvocation) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR,
+            parameter);
+        return true;
+      }
+    }
+    // OK
+    return false;
+  }
+
+  /**
+   * Verify that the given variable declaration [list] has only initialized
+   * variables if the list is final or const.
+   *
+   * See [CompileTimeErrorCode.CONST_NOT_INITIALIZED], and
+   * [StaticWarningCode.FINAL_NOT_INITIALIZED].
+   */
+  bool _checkForFinalNotInitialized(VariableDeclarationList list) {
+    if (_isInNativeClass) {
+      return false;
+    }
+    bool foundError = false;
+    if (!list.isSynthetic) {
+      NodeList<VariableDeclaration> variables = list.variables;
+      for (VariableDeclaration variable in variables) {
+        if (variable.initializer == null) {
+          if (list.isConst) {
+            _errorReporter.reportErrorForNode(
+                CompileTimeErrorCode.CONST_NOT_INITIALIZED, variable.name,
+                [variable.name.name]);
+          } else if (list.isFinal) {
+            _errorReporter.reportErrorForNode(
+                StaticWarningCode.FINAL_NOT_INITIALIZED, variable.name,
+                [variable.name.name]);
+          }
+          foundError = true;
+        }
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * Verify that final fields in the given clas [declaration] that are declared,
+   * without any constructors in the enclosing class, are initialized. Cases in
+   * which there is at least one constructor are handled at the end of
+   * [_checkForAllFinalInitializedErrorCodes].
+   *
+   * See [CompileTimeErrorCode.CONST_NOT_INITIALIZED], and
+   * [StaticWarningCode.FINAL_NOT_INITIALIZED].
+   */
+  bool _checkForFinalNotInitializedInClass(ClassDeclaration declaration) {
+    NodeList<ClassMember> classMembers = declaration.members;
+    for (ClassMember classMember in classMembers) {
+      if (classMember is ConstructorDeclaration) {
+        return false;
+      }
+    }
+    bool foundError = false;
+    for (ClassMember classMember in classMembers) {
+      if (classMember is FieldDeclaration &&
+          _checkForFinalNotInitialized(classMember.fields)) {
+        foundError = true;
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * If the current function is async, async*, or sync*, verify that its
+   * declared return type is assignable to Future, Stream, or Iterable,
+   * respectively.  If not, report the error using [returnType].
+   */
+  void _checkForIllegalReturnType(TypeName returnType) {
+    if (returnType == null) {
+      // No declared return type, so the return type must be dynamic, which is
+      // assignable to everything.
+      return;
+    }
+    if (_enclosingFunction.isAsynchronous) {
+      if (_enclosingFunction.isGenerator) {
+        if (!_enclosingFunction.returnType
+            .isAssignableTo(_typeProvider.streamDynamicType)) {
+          _errorReporter.reportErrorForNode(
+              StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE,
+              returnType);
+        }
+      } else {
+        if (!_enclosingFunction.returnType
+            .isAssignableTo(_typeProvider.futureDynamicType)) {
+          _errorReporter.reportErrorForNode(
+              StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, returnType);
+        }
+      }
+    } else if (_enclosingFunction.isGenerator) {
+      if (!_enclosingFunction.returnType
+          .isAssignableTo(_typeProvider.iterableDynamicType)) {
+        _errorReporter.reportErrorForNode(
+            StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE,
+            returnType);
+      }
+    }
+  }
+
+  /**
+   * Verify that the given implements [clause] does not implement classes that
+   * are deferred.
+   *
+   * See [CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS].
+   */
+  bool _checkForImplementsDeferredClass(ImplementsClause clause) {
+    if (clause == null) {
+      return false;
+    }
+    bool foundError = false;
+    for (TypeName type in clause.interfaces) {
+      if (_checkForExtendsOrImplementsDeferredClass(
+          type, CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS)) {
+        foundError = true;
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * Verify that the given implements [clause] does not implement classes such
+   * as 'num' or 'String'.
+   *
+   * See [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS].
+   */
+  bool _checkForImplementsDisallowedClass(ImplementsClause clause) {
+    if (clause == null) {
+      return false;
+    }
+    bool foundError = false;
+    for (TypeName type in clause.interfaces) {
+      if (_checkForExtendsOrImplementsDisallowedClass(
+          type, CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS)) {
+        foundError = true;
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * Verify that if the given [identifier] is part of a constructor initializer,
+   * then it does not implicitly reference 'this' expression.
+   *
+   * See [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER], and
+   * [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC].
+   * TODO(scheglov) rename thid method
+   */
+  bool _checkForImplicitThisReferenceInInitializer(
+      SimpleIdentifier identifier) {
+    if (!_isInConstructorInitializer &&
+        !_isInStaticMethod &&
+        !_isInFactory &&
+        !_isInInstanceVariableInitializer &&
+        !_isInStaticVariableDeclaration) {
+      return false;
+    }
+    // prepare element
+    Element element = identifier.staticElement;
+    if (!(element is MethodElement || element is PropertyAccessorElement)) {
+      return false;
+    }
+    // static element
+    ExecutableElement executableElement = element as ExecutableElement;
+    if (executableElement.isStatic) {
+      return false;
+    }
+    // not a class member
+    Element enclosingElement = element.enclosingElement;
+    if (enclosingElement is! ClassElement) {
+      return false;
+    }
+    // comment
+    AstNode parent = identifier.parent;
+    if (parent is CommentReference) {
+      return false;
+    }
+    // qualified method invocation
+    if (parent is MethodInvocation) {
+      MethodInvocation invocation = parent;
+      if (identical(invocation.methodName, identifier) &&
+          invocation.realTarget != null) {
+        return false;
+      }
+    }
+    // qualified property access
+    if (parent is PropertyAccess) {
+      PropertyAccess access = parent;
+      if (identical(access.propertyName, identifier) &&
+          access.realTarget != null) {
+        return false;
+      }
+    }
+    if (parent is PrefixedIdentifier) {
+      PrefixedIdentifier prefixed = parent;
+      if (identical(prefixed.identifier, identifier)) {
+        return false;
+      }
+    }
+    // report problem
+    if (_isInStaticMethod) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC, identifier);
+    } else if (_isInFactory) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY, identifier);
+    } else {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER,
+          identifier);
+    }
+    return true;
+  }
+
+  /**
+   * Verify that the given import [directive] has a unique name among other
+   * imported libraries. The [importElement] is the [ImportElement] retrieved
+   * from the node, if the element in the node was `null`, then this method is
+   * not called.
+   *
+   * See [CompileTimeErrorCode.IMPORT_DUPLICATED_LIBRARY_NAME].
+   */
+  bool _checkForImportDuplicateLibraryName(
+      ImportDirective directive, ImportElement importElement) {
+    // prepare imported library
+    LibraryElement nodeLibrary = importElement.importedLibrary;
+    if (nodeLibrary == null) {
+      return false;
+    }
+    String name = nodeLibrary.name;
+    // check if there is another imported library with the same name
+    LibraryElement prevLibrary = _nameToImportElement[name];
+    if (prevLibrary != null) {
+      if (prevLibrary != nodeLibrary) {
+        if (!name.isEmpty) {
+          _errorReporter.reportErrorForNode(
+              StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAMED, directive, [
+            prevLibrary.definingCompilationUnit.displayName,
+            nodeLibrary.definingCompilationUnit.displayName,
+            name
+          ]);
+        }
+        return true;
+      }
+    } else {
+      _nameToImportElement[name] = nodeLibrary;
+    }
+    // OK
+    return false;
+  }
+
+  /**
+   * Check that if the visiting library is not system, then any given library
+   * should not be SDK internal library. The [importElement] is the
+   * [ImportElement] retrieved from the node, if the element in the node was
+   * `null`, then this method is not called
+   *
+   * See [CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY].
+   */
+  bool _checkForImportInternalLibrary(
+      ImportDirective directive, ImportElement importElement) {
+    if (_isInSystemLibrary) {
+      return false;
+    }
+    // should be private
+    DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
+    String uri = importElement.uri;
+    SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri);
+    if (sdkLibrary == null) {
+      return false;
+    }
+    if (!sdkLibrary.isInternal) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY, directive,
+        [directive.uri]);
+    return true;
+  }
+
+  /**
+   * For each class declaration, this method is called which verifies that all
+   * inherited members are inherited consistently.
+   *
+   * See [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE].
+   */
+  bool _checkForInconsistentMethodInheritance() {
+    // Ensure that the inheritance manager has a chance to generate all errors
+    // we may care about, note that we ensure that the interfaces data since
+    // there are no errors.
+    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(_enclosingClass);
+    HashSet<AnalysisError> errors =
+        _inheritanceManager.getErrors(_enclosingClass);
+    if (errors == null || errors.isEmpty) {
+      return false;
+    }
+    for (AnalysisError error in errors) {
+      _errorReporter.reportError(error);
+    }
+    return true;
+  }
+
+  /**
+   * Check that the given [typeReference] is not a type reference and that then
+   * the [name] is reference to an instance member.
+   *
+   * See [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER].
+   */
+  bool _checkForInstanceAccessToStaticMember(
+      ClassElement typeReference, SimpleIdentifier name) {
+    // OK, in comment
+    if (_isInComment) {
+      return false;
+    }
+    // OK, target is a type
+    if (typeReference != null) {
+      return false;
+    }
+    // prepare member Element
+    Element element = name.staticElement;
+    if (element is! ExecutableElement) {
+      return false;
+    }
+    ExecutableElement executableElement = element as ExecutableElement;
+    // OK, top-level element
+    if (executableElement.enclosingElement is! ClassElement) {
+      return false;
+    }
+    // OK, instance member
+    if (!executableElement.isStatic) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(
+        StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, name,
+        [name.name]);
+    return true;
+  }
+
+  /**
+   * Check whether the given [executableElement] collides with the name of a
+   * static method in one of its superclasses, and reports the appropriate
+   * warning if it does. The [errorNameTarget] is the node to report problems
+   * on.
+   *
+   * See [StaticTypeWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC].
+   */
+  bool _checkForInstanceMethodNameCollidesWithSuperclassStatic(
+      ExecutableElement executableElement, SimpleIdentifier errorNameTarget) {
+    String executableElementName = executableElement.name;
+    if (executableElement is! PropertyAccessorElement &&
+        !executableElement.isOperator) {
+      HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+      InterfaceType superclassType = _enclosingClass.supertype;
+      ClassElement superclassElement =
+          superclassType == null ? null : superclassType.element;
+      bool executableElementPrivate =
+          Identifier.isPrivateName(executableElementName);
+      while (superclassElement != null &&
+          !visitedClasses.contains(superclassElement)) {
+        visitedClasses.add(superclassElement);
+        LibraryElement superclassLibrary = superclassElement.library;
+        // Check fields.
+        FieldElement fieldElt =
+            superclassElement.getField(executableElementName);
+        if (fieldElt != null) {
+          // Ignore if private in a different library - cannot collide.
+          if (executableElementPrivate &&
+              _currentLibrary != superclassLibrary) {
+            continue;
+          }
+          // instance vs. static
+          if (fieldElt.isStatic) {
+            _errorReporter.reportErrorForNode(
+                StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC,
+                errorNameTarget, [
+              executableElementName,
+              fieldElt.enclosingElement.displayName
+            ]);
+            return true;
+          }
+        }
+        // Check methods.
+        List<MethodElement> methodElements = superclassElement.methods;
+        for (MethodElement methodElement in methodElements) {
+          // We need the same name.
+          if (methodElement.name != executableElementName) {
+            continue;
+          }
+          // Ignore if private in a different library - cannot collide.
+          if (executableElementPrivate &&
+              _currentLibrary != superclassLibrary) {
+            continue;
+          }
+          // instance vs. static
+          if (methodElement.isStatic) {
+            _errorReporter.reportErrorForNode(
+                StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC,
+                errorNameTarget, [
+              executableElementName,
+              methodElement.enclosingElement.displayName
+            ]);
+            return true;
+          }
+        }
+        superclassType = superclassElement.supertype;
+        superclassElement =
+            superclassType == null ? null : superclassType.element;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Verify that an 'int' can be assigned to the parameter corresponding to the
+   * given [argument]. This is used for prefix and postfix expressions where
+   * the argument value is implicit.
+   *
+   * See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
+   */
+  bool _checkForIntNotAssignable(Expression argument) {
+    if (argument == null) {
+      return false;
+    }
+    ParameterElement staticParameterElement = argument.staticParameterElement;
+    DartType staticParameterType =
+        staticParameterElement == null ? null : staticParameterElement.type;
+    return _checkForArgumentTypeNotAssignable(argument, staticParameterType,
+        _intType, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
+  }
+
+  /**
+   * Verify that the given [annotation] isn't defined in a deferred library.
+   *
+   * See [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY].
+   */
+  bool _checkForInvalidAnnotationFromDeferredLibrary(Annotation annotation) {
+    Identifier nameIdentifier = annotation.name;
+    if (nameIdentifier is PrefixedIdentifier) {
+      if (nameIdentifier.isDeferred) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY,
+            annotation.name);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the given left hand side ([lhs]) and right hand side ([rhs])
+   * represent a valid assignment.
+   *
+   * See [StaticTypeWarningCode.INVALID_ASSIGNMENT].
+   */
+  bool _checkForInvalidAssignment(Expression lhs, Expression rhs) {
+    if (lhs == null || rhs == null) {
+      return false;
+    }
+    VariableElement leftVariableElement = getVariableElement(lhs);
+    DartType leftType = (leftVariableElement == null)
+        ? getStaticType(lhs)
+        : leftVariableElement.type;
+    DartType staticRightType = getStaticType(rhs);
+    if (!staticRightType.isAssignableTo(leftType)) {
+      _errorReporter.reportTypeErrorForNode(
+          StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [
+        staticRightType,
+        leftType
+      ]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Given an [assignment] using a compound assignment operator, this verifies
+   * that the given assignment is valid. The [lhs] is the left hand side
+   * expression. The [rhs] is the right hand side expression.
+   *
+   * See [StaticTypeWarningCode.INVALID_ASSIGNMENT].
+   */
+  bool _checkForInvalidCompoundAssignment(
+      AssignmentExpression assignment, Expression lhs, Expression rhs) {
+    if (lhs == null) {
+      return false;
+    }
+    VariableElement leftVariableElement = getVariableElement(lhs);
+    DartType leftType = (leftVariableElement == null)
+        ? getStaticType(lhs)
+        : leftVariableElement.type;
+    MethodElement invokedMethod = assignment.staticElement;
+    if (invokedMethod == null) {
+      return false;
+    }
+    DartType rightType = invokedMethod.type.returnType;
+    if (leftType == null || rightType == null) {
+      return false;
+    }
+    if (!rightType.isAssignableTo(leftType)) {
+      _errorReporter.reportTypeErrorForNode(
+          StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightType, leftType]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Check the given [initializer] to ensure that the field being initialized is
+   * a valid field. The [fieldName] is the field name from the
+   * [ConstructorFieldInitializer]. The [staticElement] is the static element
+   * from the name in the [ConstructorFieldInitializer].
+   */
+  void _checkForInvalidField(ConstructorFieldInitializer initializer,
+      SimpleIdentifier fieldName, Element staticElement) {
+    if (staticElement is FieldElement) {
+      FieldElement fieldElement = staticElement;
+      if (fieldElement.isSynthetic) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD,
+            initializer, [fieldName]);
+      } else if (fieldElement.isStatic) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, initializer,
+            [fieldName]);
+      }
+    } else {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD, initializer,
+          [fieldName]);
+      return;
+    }
+  }
+
+  /**
+   * Check to see whether the given function [body] has a modifier associated
+   * with it, and report it as an error if it does.
+   */
+  bool _checkForInvalidModifierOnBody(
+      FunctionBody body, CompileTimeErrorCode errorCode) {
+    sc.Token keyword = body.keyword;
+    if (keyword != null) {
+      _errorReporter.reportErrorForToken(errorCode, keyword, [keyword.lexeme]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the usage of the given 'this' is valid.
+   *
+   * See [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS].
+   */
+  bool _checkForInvalidReferenceToThis(ThisExpression expression) {
+    if (!_isThisInValidContext(expression)) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, expression);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Checks to ensure that the given list of type [arguments] does not have a
+   * type parameter as a type argument. The [errorCode] is either
+   * [CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST] or
+   * [CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP].
+   */
+  bool _checkForInvalidTypeArgumentInConstTypedLiteral(
+      NodeList<TypeName> arguments, ErrorCode errorCode) {
+    bool foundError = false;
+    for (TypeName typeName in arguments) {
+      if (typeName.type is TypeParameterType) {
+        _errorReporter.reportErrorForNode(errorCode, typeName, [typeName.name]);
+        foundError = true;
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * Verify that the elements given list [literal] are subtypes of the specified
+   * element type. The [typeArguments] are the type arguments.
+   *
+   * See [CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE], and
+   * [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE].
+   */
+  bool _checkForListElementTypeNotAssignable(
+      ListLiteral literal, TypeArgumentList typeArguments) {
+    NodeList<TypeName> typeNames = typeArguments.arguments;
+    if (typeNames.length < 1) {
+      return false;
+    }
+    DartType listElementType = typeNames[0].type;
+    // Check every list element.
+    bool hasProblems = false;
+    for (Expression element in literal.elements) {
+      if (literal.constKeyword != null) {
+        // TODO(paulberry): this error should be based on the actual type of the
+        // list element, not the static type.  See dartbug.com/21119.
+        if (_checkForArgumentTypeNotAssignableWithExpectedTypes(element,
+            listElementType,
+            CheckedModeCompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE)) {
+          hasProblems = true;
+        }
+      }
+      if (_checkForArgumentTypeNotAssignableWithExpectedTypes(element,
+          listElementType,
+          StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE)) {
+        hasProblems = true;
+      }
+    }
+    return hasProblems;
+  }
+
+  /**
+   * Verify that the key/value of entries of the given map [literal] are
+   * subtypes of the key/value types specified in the type arguments. The
+   * [typeArguments] are the type arguments.
+   *
+   * See [CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE],
+   * [CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE],
+   * [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE], and
+   * [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE].
+   */
+  bool _checkForMapTypeNotAssignable(
+      MapLiteral literal, TypeArgumentList typeArguments) {
+    // Prepare maps key/value types.
+    NodeList<TypeName> typeNames = typeArguments.arguments;
+    if (typeNames.length < 2) {
+      return false;
+    }
+    DartType keyType = typeNames[0].type;
+    DartType valueType = typeNames[1].type;
+    // Check every map entry.
+    bool hasProblems = false;
+    NodeList<MapLiteralEntry> entries = literal.entries;
+    for (MapLiteralEntry entry in entries) {
+      Expression key = entry.key;
+      Expression value = entry.value;
+      if (literal.constKeyword != null) {
+        // TODO(paulberry): this error should be based on the actual type of the
+        // list element, not the static type.  See dartbug.com/21119.
+        if (_checkForArgumentTypeNotAssignableWithExpectedTypes(key, keyType,
+            CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE)) {
+          hasProblems = true;
+        }
+        if (_checkForArgumentTypeNotAssignableWithExpectedTypes(value,
+            valueType,
+            CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE)) {
+          hasProblems = true;
+        }
+      }
+      if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
+          key, keyType, StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE)) {
+        hasProblems = true;
+      }
+      if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
+          value, valueType, StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE)) {
+        hasProblems = true;
+      }
+    }
+    return hasProblems;
+  }
+
+  /**
+   * Verify that the [_enclosingClass] does not define members with the same name
+   * as the enclosing class.
+   *
+   * See [CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME].
+   */
+  bool _checkForMemberWithClassName() {
+    if (_enclosingClass == null) {
+      return false;
+    }
+    String className = _enclosingClass.name;
+    if (className == null) {
+      return false;
+    }
+    bool problemReported = false;
+    // check accessors
+    for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
+      if (className == accessor.name) {
+        _errorReporter.reportErrorForOffset(
+            CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME, accessor.nameOffset,
+            className.length);
+        problemReported = true;
+      }
+    }
+    // don't check methods, they would be constructors
+    // done
+    return problemReported;
+  }
+
+  /**
+   * Check to make sure that all similarly typed accessors are of the same type
+   * (including inherited accessors).
+   *
+   * See [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES], and
+   * [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE].
+   */
+  bool _checkForMismatchedAccessorTypes(
+      Declaration accessorDeclaration, String accessorTextName) {
+    ExecutableElement accessorElement =
+        accessorDeclaration.element as ExecutableElement;
+    if (accessorElement is! PropertyAccessorElement) {
+      return false;
+    }
+    PropertyAccessorElement propertyAccessorElement =
+        accessorElement as PropertyAccessorElement;
+    PropertyAccessorElement counterpartAccessor = null;
+    ClassElement enclosingClassForCounterpart = null;
+    if (propertyAccessorElement.isGetter) {
+      counterpartAccessor = propertyAccessorElement.correspondingSetter;
+    } else {
+      counterpartAccessor = propertyAccessorElement.correspondingGetter;
+      // If the setter and getter are in the same enclosing element, return,
+      // this prevents having MISMATCHED_GETTER_AND_SETTER_TYPES reported twice.
+      if (counterpartAccessor != null &&
+          identical(counterpartAccessor.enclosingElement,
+              propertyAccessorElement.enclosingElement)) {
+        return false;
+      }
+    }
+    if (counterpartAccessor == null) {
+      // If the accessor is declared in a class, check the superclasses.
+      if (_enclosingClass != null) {
+        // Figure out the correct identifier to lookup in the inheritance graph,
+        // if 'x', then 'x=', or if 'x=', then 'x'.
+        String lookupIdentifier = propertyAccessorElement.name;
+        if (StringUtilities.endsWithChar(lookupIdentifier, 0x3D)) {
+          lookupIdentifier =
+              lookupIdentifier.substring(0, lookupIdentifier.length - 1);
+        } else {
+          lookupIdentifier += "=";
+        }
+        // lookup with the identifier.
+        ExecutableElement elementFromInheritance = _inheritanceManager
+            .lookupInheritance(_enclosingClass, lookupIdentifier);
+        // Verify that we found something, and that it is an accessor
+        if (elementFromInheritance != null &&
+            elementFromInheritance is PropertyAccessorElement) {
+          enclosingClassForCounterpart =
+              elementFromInheritance.enclosingElement as ClassElement;
+          counterpartAccessor = elementFromInheritance;
+        }
+      }
+      if (counterpartAccessor == null) {
+        return false;
+      }
+    }
+    // Default of null == no accessor or no type (dynamic)
+    DartType getterType = null;
+    DartType setterType = null;
+    // Get an existing counterpart accessor if any.
+    if (propertyAccessorElement.isGetter) {
+      getterType = _getGetterType(propertyAccessorElement);
+      setterType = _getSetterType(counterpartAccessor);
+    } else if (propertyAccessorElement.isSetter) {
+      setterType = _getSetterType(propertyAccessorElement);
+      getterType = _getGetterType(counterpartAccessor);
+    }
+    // If either types are not assignable to each other, report an error
+    // (if the getter is null, it is dynamic which is assignable to everything).
+    if (setterType != null &&
+        getterType != null &&
+        !getterType.isAssignableTo(setterType)) {
+      if (enclosingClassForCounterpart == null) {
+        _errorReporter.reportTypeErrorForNode(
+            StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES,
+            accessorDeclaration, [accessorTextName, setterType, getterType]);
+        return true;
+      } else {
+        _errorReporter.reportTypeErrorForNode(
+            StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE,
+            accessorDeclaration, [
+          accessorTextName,
+          setterType,
+          getterType,
+          enclosingClassForCounterpart.displayName
+        ]);
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Check to make sure that the given switch [statement] whose static type is
+   * an enum type either have a default case or include all of the enum
+   * constants.
+   */
+  bool _checkForMissingEnumConstantInSwitch(SwitchStatement statement) {
+    // TODO(brianwilkerson) This needs to be checked after constant values have
+    // been computed.
+    Expression expression = statement.expression;
+    DartType expressionType = getStaticType(expression);
+    if (expressionType == null) {
+      return false;
+    }
+    Element expressionElement = expressionType.element;
+    if (expressionElement is! ClassElement) {
+      return false;
+    }
+    ClassElement classElement = expressionElement as ClassElement;
+    if (!classElement.isEnum) {
+      return false;
+    }
+    List<String> constantNames = new List<String>();
+    List<FieldElement> fields = classElement.fields;
+    int fieldCount = fields.length;
+    for (int i = 0; i < fieldCount; i++) {
+      FieldElement field = fields[i];
+      if (field.isStatic && !field.isSynthetic) {
+        constantNames.add(field.name);
+      }
+    }
+    NodeList<SwitchMember> members = statement.members;
+    int memberCount = members.length;
+    for (int i = 0; i < memberCount; i++) {
+      SwitchMember member = members[i];
+      if (member is SwitchDefault) {
+        return false;
+      }
+      String constantName = _getConstantName((member as SwitchCase).expression);
+      if (constantName != null) {
+        constantNames.remove(constantName);
+      }
+    }
+    int nameCount = constantNames.length;
+    if (nameCount == 0) {
+      return false;
+    }
+    for (int i = 0; i < nameCount; i++) {
+      int offset = statement.offset;
+      int end = statement.rightParenthesis.end;
+      _errorReporter.reportErrorForOffset(
+          CompileTimeErrorCode.MISSING_ENUM_CONSTANT_IN_SWITCH, offset,
+          end - offset, [constantNames[i]]);
+    }
+    return true;
+  }
+
+  /**
+   * Verify that the given function [body] does not contain return statements
+   * that both have and do not have return values.
+   *
+   * See [StaticWarningCode.MIXED_RETURN_TYPES].
+   */
+  bool _checkForMixedReturns(BlockFunctionBody body) {
+    if (_hasReturnWithoutValue) {
+      return false;
+    }
+    int withCount = _returnsWith.length;
+    int withoutCount = _returnsWithout.length;
+    if (withCount > 0 && withoutCount > 0) {
+      for (int i = 0; i < withCount; i++) {
+        _errorReporter.reportErrorForToken(StaticWarningCode.MIXED_RETURN_TYPES,
+            _returnsWith[i].returnKeyword);
+      }
+      for (int i = 0; i < withoutCount; i++) {
+        _errorReporter.reportErrorForToken(StaticWarningCode.MIXED_RETURN_TYPES,
+            _returnsWithout[i].returnKeyword);
+      }
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the given mixin does not have an explicitly declared
+   * constructor. The [mixinName] is the node to report problem on. The
+   * [mixinElement] is the mixing to evaluate.
+   *
+   * See [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR].
+   */
+  bool _checkForMixinDeclaresConstructor(
+      TypeName mixinName, ClassElement mixinElement) {
+    for (ConstructorElement constructor in mixinElement.constructors) {
+      if (!constructor.isSynthetic && !constructor.isFactory) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR, mixinName,
+            [mixinElement.name]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Report the error [CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS] if
+   * appropriate.
+   */
+  void _checkForMixinHasNoConstructors(AstNode node) {
+    if ((_enclosingClass as ClassElementImpl).doesMixinLackConstructors) {
+      ErrorCode errorCode = CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS;
+      _errorReporter.reportErrorForNode(
+          errorCode, node, [_enclosingClass.supertype]);
+    }
+  }
+
+  /**
+   * Verify that the given mixin has the 'Object' superclass. The [mixinName] is
+   * the node to report problem on. The [mixinElement] is the mixing to
+   * evaluate.
+   *
+   * See [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT].
+   */
+  bool _checkForMixinInheritsNotFromObject(
+      TypeName mixinName, ClassElement mixinElement) {
+    InterfaceType mixinSupertype = mixinElement.supertype;
+    if (mixinSupertype != null) {
+      if (!mixinSupertype.isObject ||
+          !mixinElement.isMixinApplication && mixinElement.mixins.length != 0) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, mixinName,
+            [mixinElement.name]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the given mixin does not reference 'super'. The [mixinName] is
+   * the node to report problem on. The [mixinElement] is the mixing to
+   * evaluate.
+   *
+   * See [CompileTimeErrorCode.MIXIN_REFERENCES_SUPER].
+   */
+  bool _checkForMixinReferencesSuper(
+      TypeName mixinName, ClassElement mixinElement) {
+    if (!enableSuperMixins && mixinElement.hasReferenceToSuper) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.MIXIN_REFERENCES_SUPER, mixinName,
+          [mixinElement.name]);
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the given [constructor] has at most one 'super' initializer.
+   *
+   * See [CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS].
+   */
+  bool _checkForMultipleSuperInitializers(ConstructorDeclaration constructor) {
+    int numSuperInitializers = 0;
+    for (ConstructorInitializer initializer in constructor.initializers) {
+      if (initializer is SuperConstructorInvocation) {
+        numSuperInitializers++;
+        if (numSuperInitializers > 1) {
+          _errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS, initializer);
+        }
+      }
+    }
+    return numSuperInitializers > 0;
+  }
+
+  /**
+   * Checks to ensure that the given native function [body] is in SDK code.
+   *
+   * See [ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE].
+   */
+  bool _checkForNativeFunctionBodyInNonSDKCode(NativeFunctionBody body) {
+    if (!_isInSystemLibrary && !_hasExtUri) {
+      _errorReporter.reportErrorForNode(
+          ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE, body);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the given instance creation [expression] invokes an existing
+   * constructor. The [constructorName] is the constructor name. The [typeName]
+   * is the name of the type defining the constructor.
+   *
+   * This method assumes that the instance creation was tested to be 'new'
+   * before being called.
+   *
+   * See [StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR].
+   */
+  bool _checkForNewWithUndefinedConstructor(
+      InstanceCreationExpression expression, ConstructorName constructorName,
+      TypeName typeName) {
+    // OK if resolved
+    if (expression.staticElement != null) {
+      return false;
+    }
+    DartType type = typeName.type;
+    if (type is InterfaceType) {
+      ClassElement element = type.element;
+      if (element != null && element.isEnum) {
+        // We have already reported the error.
+        return false;
+      }
+    }
+    // prepare class name
+    Identifier className = typeName.name;
+    // report as named or default constructor absence
+    SimpleIdentifier name = constructorName.name;
+    if (name != null) {
+      _errorReporter.reportErrorForNode(
+          StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR, name, [
+        className,
+        name
+      ]);
+    } else {
+      _errorReporter.reportErrorForNode(
+          StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
+          constructorName, [className]);
+    }
+    return true;
+  }
+
+  /**
+   * Check that if the given class [declaration] implicitly calls default
+   * constructor of its superclass, there should be such default constructor -
+   * implicit or explicit.
+   *
+   * See [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT].
+   */
+  bool _checkForNoDefaultSuperConstructorImplicit(
+      ClassDeclaration declaration) {
+    // do nothing if mixin errors have already been reported for this class.
+    ClassElementImpl enclosingClass = _enclosingClass;
+    if (enclosingClass.doesMixinLackConstructors) {
+      return false;
+    }
+    // do nothing if there is explicit constructor
+    List<ConstructorElement> constructors = _enclosingClass.constructors;
+    if (!constructors[0].isSynthetic) {
+      return false;
+    }
+    // prepare super
+    InterfaceType superType = _enclosingClass.supertype;
+    if (superType == null) {
+      return false;
+    }
+    ClassElement superElement = superType.element;
+    // try to find default generative super constructor
+    ConstructorElement superUnnamedConstructor =
+        superElement.unnamedConstructor;
+    if (superUnnamedConstructor != null) {
+      if (superUnnamedConstructor.isFactory) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, declaration.name,
+            [superUnnamedConstructor]);
+        return true;
+      }
+      if (superUnnamedConstructor.isDefaultConstructor &&
+          _enclosingClass
+              .isSuperConstructorAccessible(superUnnamedConstructor)) {
+        return true;
+      }
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
+        declaration.name, [superType.displayName]);
+    return true;
+  }
+
+  /**
+   * Check that the given class declaration overrides all members required by
+   * its superclasses and interfaces. The [classNameNode] is the
+   * [SimpleIdentifier] to be used if there is a violation, this is either the
+   * named from the [ClassDeclaration] or from the [ClassTypeAlias].
+   *
+   * See [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE],
+   * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO],
+   * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE],
+   * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR], and
+   * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS].
+   */
+  bool _checkForNonAbstractClassInheritsAbstractMember(
+      SimpleIdentifier classNameNode) {
+    if (_enclosingClass.isAbstract) {
+      return false;
+    }
+    //
+    // Store in local sets the set of all method and accessor names
+    //
+    MethodElement method =
+        _enclosingClass.getMethod(FunctionElement.NO_SUCH_METHOD_METHOD_NAME);
+    if (method != null) {
+      // If the enclosing class declares the method noSuchMethod(), then return.
+      // From Spec:  It is a static warning if a concrete class does not have an
+      // implementation for a method in any of its superinterfaces unless it
+      // declares its own noSuchMethod method (7.10).
+      return false;
+    }
+    HashSet<ExecutableElement> missingOverrides =
+        new HashSet<ExecutableElement>();
+    //
+    // Loop through the set of all executable elements declared in the implicit
+    // interface.
+    //
+    MemberMap membersInheritedFromInterfaces = _inheritanceManager
+        .getMapOfMembersInheritedFromInterfaces(_enclosingClass);
+    MemberMap membersInheritedFromSuperclasses = _inheritanceManager
+        .getMapOfMembersInheritedFromClasses(_enclosingClass);
+    for (int i = 0; i < membersInheritedFromInterfaces.size; i++) {
+      String memberName = membersInheritedFromInterfaces.getKey(i);
+      ExecutableElement executableElt =
+          membersInheritedFromInterfaces.getValue(i);
+      if (memberName == null) {
+        break;
+      }
+      // If the element is not synthetic and can be determined to be defined in
+      // Object, skip it.
+      if (executableElt.enclosingElement != null &&
+          (executableElt.enclosingElement as ClassElement).type.isObject) {
+        continue;
+      }
+      // Check to see if some element is in local enclosing class that matches
+      // the name of the required member.
+      if (_isMemberInClassOrMixin(executableElt, _enclosingClass)) {
+        // We do not have to verify that this implementation of the found method
+        // matches the required function type: the set of
+        // StaticWarningCode.INVALID_METHOD_OVERRIDE_* warnings break out the
+        // different specific situations.
+        continue;
+      }
+      // First check to see if this element was declared in the superclass
+      // chain, in which case there is already a concrete implementation.
+      ExecutableElement elt = membersInheritedFromSuperclasses.get(memberName);
+      // Check to see if an element was found in the superclass chain with the
+      // correct name.
+      if (elt != null) {
+        // Reference the types, if any are null then continue.
+        InterfaceType enclosingType = _enclosingClass.type;
+        FunctionType concreteType = elt.type;
+        FunctionType requiredMemberType = executableElt.type;
+        if (enclosingType == null ||
+            concreteType == null ||
+            requiredMemberType == null) {
+          continue;
+        }
+        // Some element was found in the superclass chain that matches the name
+        // of the required member.
+        // If it is not abstract and it is the correct one (types match- the
+        // version of this method that we have has the correct number of
+        // parameters, etc), then this class has a valid implementation of this
+        // method, so skip it.
+        if ((elt is MethodElement && !elt.isAbstract) ||
+            (elt is PropertyAccessorElement && !elt.isAbstract)) {
+          // Since we are comparing two function types, we need to do the
+          // appropriate type substitutions first ().
+          FunctionType foundConcreteFT = _inheritanceManager
+              .substituteTypeArgumentsInMemberFromInheritance(
+                  concreteType, memberName, enclosingType);
+          FunctionType requiredMemberFT = _inheritanceManager
+              .substituteTypeArgumentsInMemberFromInheritance(
+                  requiredMemberType, memberName, enclosingType);
+          if (foundConcreteFT.isSubtypeOf(requiredMemberFT)) {
+            continue;
+          }
+        }
+      }
+      // The not qualifying concrete executable element was found, add it to the
+      // list.
+      missingOverrides.add(executableElt);
+    }
+    // Now that we have the set of missing overrides, generate a warning on this
+    // class.
+    int missingOverridesSize = missingOverrides.length;
+    if (missingOverridesSize == 0) {
+      return false;
+    }
+    List<ExecutableElement> missingOverridesArray =
+        new List.from(missingOverrides);
+    List<String> stringMembersArrayListSet = new List<String>();
+    for (int i = 0; i < missingOverridesArray.length; i++) {
+      String newStrMember;
+      Element enclosingElement = missingOverridesArray[i].enclosingElement;
+      String prefix = StringUtilities.EMPTY;
+      if (missingOverridesArray[i] is PropertyAccessorElement) {
+        PropertyAccessorElement propertyAccessorElement =
+            missingOverridesArray[i] as PropertyAccessorElement;
+        if (propertyAccessorElement.isGetter) {
+          prefix = _GETTER_SPACE;
+          // "getter "
+        } else {
+          prefix = _SETTER_SPACE;
+          // "setter "
+        }
+      }
+      if (enclosingElement != null) {
+        newStrMember =
+            "$prefix'${enclosingElement.displayName}.${missingOverridesArray[i].displayName}'";
+      } else {
+        newStrMember = "$prefix'${missingOverridesArray[i].displayName}'";
+      }
+      stringMembersArrayListSet.add(newStrMember);
+    }
+    List<String> stringMembersArray = new List.from(stringMembersArrayListSet);
+    AnalysisErrorWithProperties analysisError;
+    if (stringMembersArray.length == 1) {
+      analysisError = _errorReporter.newErrorWithProperties(
+          StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          classNameNode, [stringMembersArray[0]]);
+    } else if (stringMembersArray.length == 2) {
+      analysisError = _errorReporter.newErrorWithProperties(
+          StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO,
+          classNameNode, [stringMembersArray[0], stringMembersArray[1]]);
+    } else if (stringMembersArray.length == 3) {
+      analysisError = _errorReporter.newErrorWithProperties(
+          StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE,
+          classNameNode, [
+        stringMembersArray[0],
+        stringMembersArray[1],
+        stringMembersArray[2]
+      ]);
+    } else if (stringMembersArray.length == 4) {
+      analysisError = _errorReporter.newErrorWithProperties(
+          StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR,
+          classNameNode, [
+        stringMembersArray[0],
+        stringMembersArray[1],
+        stringMembersArray[2],
+        stringMembersArray[3]
+      ]);
+    } else {
+      analysisError = _errorReporter.newErrorWithProperties(
+          StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS,
+          classNameNode, [
+        stringMembersArray[0],
+        stringMembersArray[1],
+        stringMembersArray[2],
+        stringMembersArray[3],
+        stringMembersArray.length - 4
+      ]);
+    }
+    analysisError.setProperty(
+        ErrorProperty.UNIMPLEMENTED_METHODS, missingOverridesArray);
+    _errorReporter.reportError(analysisError);
+    return true;
+  }
+
+  /**
+   * Check to ensure that the [condition] is of type bool, are. Otherwise an
+   * error is reported on the expression.
+   *
+   * See [StaticTypeWarningCode.NON_BOOL_CONDITION].
+   */
+  bool _checkForNonBoolCondition(Expression condition) {
+    DartType conditionType = getStaticType(condition);
+    if (conditionType != null && !conditionType.isAssignableTo(_boolType)) {
+      _errorReporter.reportErrorForNode(
+          StaticTypeWarningCode.NON_BOOL_CONDITION, condition);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the given assert [statement] has either a 'bool' or
+   * '() -> bool' input.
+   *
+   * See [StaticTypeWarningCode.NON_BOOL_EXPRESSION].
+   */
+  bool _checkForNonBoolExpression(AssertStatement statement) {
+    Expression expression = statement.condition;
+    DartType type = getStaticType(expression);
+    if (type is InterfaceType) {
+      if (!type.isAssignableTo(_boolType)) {
+        _errorReporter.reportErrorForNode(
+            StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression);
+        return true;
+      }
+    } else if (type is FunctionType) {
+      FunctionType functionType = type;
+      if (functionType.typeArguments.length == 0 &&
+          !functionType.returnType.isAssignableTo(_boolType)) {
+        _errorReporter.reportErrorForNode(
+            StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Checks to ensure that the given [expression] is assignable to bool.
+   *
+   * See [StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION].
+   */
+  bool _checkForNonBoolNegationExpression(Expression expression) {
+    DartType conditionType = getStaticType(expression);
+    if (conditionType != null && !conditionType.isAssignableTo(_boolType)) {
+      _errorReporter.reportErrorForNode(
+          StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION, expression);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Verify the given map [literal] either:
+   * * has `const modifier`
+   * * has explicit type arguments
+   * * is not start of the statement
+   *
+   * See [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT].
+   */
+  bool _checkForNonConstMapAsExpressionStatement(MapLiteral literal) {
+    // "const"
+    if (literal.constKeyword != null) {
+      return false;
+    }
+    // has type arguments
+    if (literal.typeArguments != null) {
+      return false;
+    }
+    // prepare statement
+    Statement statement =
+        literal.getAncestor((node) => node is ExpressionStatement);
+    if (statement == null) {
+      return false;
+    }
+    // OK, statement does not start with map
+    if (!identical(statement.beginToken, literal.beginToken)) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT, literal);
+    return true;
+  }
+
+  /**
+   * Verify that the given method [declaration] of operator `[]=`, has `void`
+   * return type.
+   *
+   * See [StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR].
+   */
+  bool _checkForNonVoidReturnTypeForOperator(MethodDeclaration declaration) {
+    // check that []= operator
+    SimpleIdentifier name = declaration.name;
+    if (name.name != "[]=") {
+      return false;
+    }
+    // check return type
+    TypeName typeName = declaration.returnType;
+    if (typeName != null) {
+      DartType type = typeName.type;
+      if (type != null && !type.isVoid) {
+        _errorReporter.reportErrorForNode(
+            StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR, typeName);
+      }
+    }
+    // no warning
+    return false;
+  }
+
+  /**
+   * Verify the [typeName], used as the return type of a setter, is valid
+   * (either `null` or the type 'void').
+   *
+   * See [StaticWarningCode.NON_VOID_RETURN_FOR_SETTER].
+   */
+  bool _checkForNonVoidReturnTypeForSetter(TypeName typeName) {
+    if (typeName != null) {
+      DartType type = typeName.type;
+      if (type != null && !type.isVoid) {
+        _errorReporter.reportErrorForNode(
+            StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, typeName);
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Verify the given operator-method [declaration], does not have an optional
+   * parameter. This method assumes that the method declaration was tested to be
+   * an operator declaration before being called.
+   *
+   * See [CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR].
+   */
+  bool _checkForOptionalParameterInOperator(MethodDeclaration declaration) {
+    FormalParameterList parameterList = declaration.parameters;
+    if (parameterList == null) {
+      return false;
+    }
+    bool foundError = false;
+    NodeList<FormalParameter> formalParameters = parameterList.parameters;
+    for (FormalParameter formalParameter in formalParameters) {
+      if (formalParameter.kind.isOptional) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR,
+            formalParameter);
+        foundError = true;
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * Check that the given named optional [parameter] does not begin with '_'.
+   *
+   * See [CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER].
+   */
+  bool _checkForPrivateOptionalParameter(FormalParameter parameter) {
+    // should be named parameter
+    if (parameter.kind != ParameterKind.NAMED) {
+      return false;
+    }
+    // name should start with '_'
+    SimpleIdentifier name = parameter.identifier;
+    if (name.isSynthetic || !StringUtilities.startsWithChar(name.name, 0x5F)) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, parameter);
+    return true;
+  }
+
+  /**
+   * Check whether the given constructor [declaration] is the redirecting
+   * generative constructor and references itself directly or indirectly. The
+   * [constructorElement] is the constructor element.
+   *
+   * See [CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT].
+   */
+  bool _checkForRecursiveConstructorRedirect(ConstructorDeclaration declaration,
+      ConstructorElement constructorElement) {
+    // we check generative constructor here
+    if (declaration.factoryKeyword != null) {
+      return false;
+    }
+    // try to find redirecting constructor invocation and analyzer it for
+    // recursion
+    for (ConstructorInitializer initializer in declaration.initializers) {
+      if (initializer is RedirectingConstructorInvocation) {
+        // OK if no cycle
+        if (!_hasRedirectingFactoryConstructorCycle(constructorElement)) {
+          return false;
+        }
+        // report error
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT, initializer);
+        return true;
+      }
+    }
+    // OK, no redirecting constructor invocation
+    return false;
+  }
+
+  /**
+   * Check whether the given constructor [declaration] has redirected
+   * constructor and references itself directly or indirectly. The
+   * constructor [element] is the element introduced by the declaration.
+   *
+   * See [CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT].
+   */
+  bool _checkForRecursiveFactoryRedirect(
+      ConstructorDeclaration declaration, ConstructorElement element) {
+    // prepare redirected constructor
+    ConstructorName redirectedConstructorNode =
+        declaration.redirectedConstructor;
+    if (redirectedConstructorNode == null) {
+      return false;
+    }
+    // OK if no cycle
+    if (!_hasRedirectingFactoryConstructorCycle(element)) {
+      return false;
+    }
+    // report error
+    _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+        redirectedConstructorNode);
+    return true;
+  }
+
+  /**
+   * Check that the class [element] is not a superinterface to itself.
+   *
+   * See [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE],
+   * [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS], and
+   * [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS].
+   */
+  bool _checkForRecursiveInterfaceInheritance(ClassElement element) {
+    if (element == null) {
+      return false;
+    }
+    return _safeCheckForRecursiveInterfaceInheritance(
+        element, new List<ClassElement>());
+  }
+
+  /**
+   * Check that the given constructor [declaration] has a valid combination of
+   * redirected constructor invocation(s), super constructor invocations and
+   * field initializers.
+   *
+   * See [CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR],
+   * [CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR],
+   * [CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS],
+   * [CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR], and
+   * [CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR].
+   */
+  bool _checkForRedirectingConstructorErrorCodes(
+      ConstructorDeclaration declaration) {
+    bool errorReported = false;
+    //
+    // Check for default values in the parameters
+    //
+    ConstructorName redirectedConstructor = declaration.redirectedConstructor;
+    if (redirectedConstructor != null) {
+      for (FormalParameter parameter in declaration.parameters.parameters) {
+        if (parameter is DefaultFormalParameter &&
+            parameter.defaultValue != null) {
+          _errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR,
+              parameter.identifier);
+          errorReported = true;
+        }
+      }
+    }
+    // check if there are redirected invocations
+    int numRedirections = 0;
+    for (ConstructorInitializer initializer in declaration.initializers) {
+      if (initializer is RedirectingConstructorInvocation) {
+        if (numRedirections > 0) {
+          _errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS,
+              initializer);
+          errorReported = true;
+        }
+        if (declaration.factoryKeyword == null) {
+          RedirectingConstructorInvocation invocation = initializer;
+          ConstructorElement redirectingElement = invocation.staticElement;
+          if (redirectingElement == null) {
+            String enclosingTypeName = _enclosingClass.displayName;
+            String constructorStrName = enclosingTypeName;
+            if (invocation.constructorName != null) {
+              constructorStrName += ".${invocation.constructorName.name}";
+            }
+            _errorReporter.reportErrorForNode(
+                CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR,
+                invocation, [constructorStrName, enclosingTypeName]);
+          } else {
+            if (redirectingElement.isFactory) {
+              _errorReporter.reportErrorForNode(
+                  CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR,
+                  initializer);
+            }
+          }
+        }
+        numRedirections++;
+      }
+    }
+    // check for other initializers
+    if (numRedirections > 0) {
+      for (ConstructorInitializer initializer in declaration.initializers) {
+        if (initializer is SuperConstructorInvocation) {
+          _errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR,
+              initializer);
+          errorReported = true;
+        }
+        if (initializer is ConstructorFieldInitializer) {
+          _errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR,
+              initializer);
+          errorReported = true;
+        }
+      }
+    }
+    // done
+    return errorReported;
+  }
+
+  /**
+   * Check whether the given constructor [declaration] has redirected
+   * constructor and references itself directly or indirectly. The
+   * constructor [element] is the element introduced by the declaration.
+   *
+   * See [CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR].
+   */
+  bool _checkForRedirectToNonConstConstructor(
+      ConstructorDeclaration declaration, ConstructorElement element) {
+    // prepare redirected constructor
+    ConstructorName redirectedConstructorNode =
+        declaration.redirectedConstructor;
+    if (redirectedConstructorNode == null) {
+      return false;
+    }
+    // prepare element
+    if (element == null) {
+      return false;
+    }
+    // OK, it is not 'const'
+    if (!element.isConst) {
+      return false;
+    }
+    // prepare redirected constructor
+    ConstructorElement redirectedConstructor = element.redirectedConstructor;
+    if (redirectedConstructor == null) {
+      return false;
+    }
+    // OK, it is also 'const'
+    if (redirectedConstructor.isConst) {
+      return false;
+    }
+    // report error
+    _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR,
+        redirectedConstructorNode);
+    return true;
+  }
+
+  /**
+   * Check that the given rethrow [expression] is inside of a catch clause.
+   *
+   * See [CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH].
+   */
+  bool _checkForRethrowOutsideCatch(RethrowExpression expression) {
+    if (!_isInCatchClause) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH, expression);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Check that if the the given constructor [declaration] is generative, then
+   * it does not have an expression function body.
+   *
+   * See [CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR].
+   */
+  bool _checkForReturnInGenerativeConstructor(
+      ConstructorDeclaration declaration) {
+    // ignore factory
+    if (declaration.factoryKeyword != null) {
+      return false;
+    }
+    // block body (with possible return statement) is checked elsewhere
+    FunctionBody body = declaration.body;
+    if (body is! ExpressionFunctionBody) {
+      return false;
+    }
+    // report error
+    _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR, body);
+    return true;
+  }
+
+  /**
+   * Check that a type mis-match between the type of the [returnExpression] and
+   * the [expectedReturnType] by the enclosing method or function.
+   *
+   * This method is called both by [_checkForAllReturnStatementErrorCodes]
+   * and [visitExpressionFunctionBody].
+   *
+   * See [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE].
+   */
+  bool _checkForReturnOfInvalidType(
+      Expression returnExpression, DartType expectedReturnType) {
+    if (_enclosingFunction == null) {
+      return false;
+    }
+    if (_inGenerator) {
+      // "return expression;" is disallowed in generators, but this is checked
+      // elsewhere.  Bare "return" is always allowed in generators regardless
+      // of the return type.  So no need to do any further checking.
+      return false;
+    }
+    DartType staticReturnType = _computeReturnTypeForMethod(returnExpression);
+    if (expectedReturnType.isVoid) {
+      if (staticReturnType.isVoid ||
+          staticReturnType.isDynamic ||
+          staticReturnType.isBottom) {
+        return false;
+      }
+      _errorReporter.reportTypeErrorForNode(
+          StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
+        staticReturnType,
+        expectedReturnType,
+        _enclosingFunction.displayName
+      ]);
+      return true;
+    }
+    if (staticReturnType.isAssignableTo(expectedReturnType)) {
+      return false;
+    }
+    _errorReporter.reportTypeErrorForNode(
+        StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
+      staticReturnType,
+      expectedReturnType,
+      _enclosingFunction.displayName
+    ]);
+    return true;
+    // TODO(brianwilkerson) Define a hint corresponding to the warning and
+    // report it if appropriate.
+//        Type propagatedReturnType = returnExpression.getPropagatedType();
+//        boolean isPropagatedAssignable = propagatedReturnType.isAssignableTo(expectedReturnType);
+//        if (isStaticAssignable || isPropagatedAssignable) {
+//          return false;
+//        }
+//        errorReporter.reportTypeErrorForNode(
+//            StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
+//            returnExpression,
+//            staticReturnType,
+//            expectedReturnType,
+//            enclosingFunction.getDisplayName());
+//        return true;
+  }
+
+  /**
+   * Check the given [typeReference] and that the [name] is not the reference to
+   * an instance member.
+   *
+   * See [StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER].
+   */
+  bool _checkForStaticAccessToInstanceMember(
+      ClassElement typeReference, SimpleIdentifier name) {
+    // OK, target is not a type
+    if (typeReference == null) {
+      return false;
+    }
+    // prepare member Element
+    Element element = name.staticElement;
+    if (element is! ExecutableElement) {
+      return false;
+    }
+    ExecutableElement memberElement = element as ExecutableElement;
+    // OK, static
+    if (memberElement.isStatic) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(
+        StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER, name, [name.name]);
+    return true;
+  }
+
+  /**
+   * Check that the type of the expression in the given 'switch' [statement] is
+   * assignable to the type of the 'case' members.
+   *
+   * See [StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE].
+   */
+  bool _checkForSwitchExpressionNotAssignable(SwitchStatement statement) {
+    // prepare 'switch' expression type
+    Expression expression = statement.expression;
+    DartType expressionType = getStaticType(expression);
+    if (expressionType == null) {
+      return false;
+    }
+    // compare with type of the first 'case'
+    NodeList<SwitchMember> members = statement.members;
+    for (SwitchMember switchMember in members) {
+      if (switchMember is! SwitchCase) {
+        continue;
+      }
+      SwitchCase switchCase = switchMember as SwitchCase;
+      // prepare 'case' type
+      Expression caseExpression = switchCase.expression;
+      DartType caseType = getStaticType(caseExpression);
+      // check types
+      if (expressionType.isAssignableTo(caseType)) {
+        return false;
+      }
+      // report problem
+      _errorReporter.reportErrorForNode(
+          StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE, expression, [
+        expressionType,
+        caseType
+      ]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the given function type [alias] does not reference itself
+   * directly.
+   *
+   * See [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF].
+   */
+  bool _checkForTypeAliasCannotReferenceItself_function(
+      FunctionTypeAlias alias) {
+    FunctionTypeAliasElement element = alias.element;
+    if (!_hasTypedefSelfReference(element)) {
+      return false;
+    }
+    _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, alias);
+    return true;
+  }
+
+  /**
+   * Verify that the given type [name] is not a deferred type.
+   *
+   * See [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS].
+   */
+  bool _checkForTypeAnnotationDeferredClass(TypeName name) {
+    if (name != null && name.isDeferred) {
+      _errorReporter.reportErrorForNode(
+          StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS, name, [name.name]);
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the type arguments in the given [typeName] are all within
+   * their bounds.
+   *
+   * See [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS].
+   */
+  bool _checkForTypeArgumentNotMatchingBounds(TypeName typeName) {
+    if (typeName.typeArguments == null) {
+      return false;
+    }
+    // prepare Type
+    DartType type = typeName.type;
+    if (type == null) {
+      return false;
+    }
+    // prepare ClassElement
+    Element element = type.element;
+    if (element is! ClassElement) {
+      return false;
+    }
+    ClassElement classElement = element as ClassElement;
+    // prepare type parameters
+    List<DartType> typeParameters = classElement.type.typeArguments;
+    List<TypeParameterElement> boundingElts = classElement.typeParameters;
+    // iterate over each bounded type parameter and corresponding argument
+    NodeList<TypeName> typeNameArgList = typeName.typeArguments.arguments;
+    List<DartType> typeArguments = (type as InterfaceType).typeArguments;
+    int loopThroughIndex =
+        math.min(typeNameArgList.length, boundingElts.length);
+    bool foundError = false;
+    for (int i = 0; i < loopThroughIndex; i++) {
+      TypeName argTypeName = typeNameArgList[i];
+      DartType argType = argTypeName.type;
+      DartType boundType = boundingElts[i].bound;
+      if (argType != null && boundType != null) {
+        if (typeArguments.length != 0 &&
+            typeArguments.length == typeParameters.length) {
+          boundType = boundType.substitute2(typeArguments, typeParameters);
+        }
+        if (!argType.isSubtypeOf(boundType)) {
+          ErrorCode errorCode;
+          if (_isInConstInstanceCreation) {
+            errorCode = CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS;
+          } else {
+            errorCode = StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS;
+          }
+          _errorReporter.reportTypeErrorForNode(
+              errorCode, argTypeName, [argType, boundType]);
+          foundError = true;
+        }
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * Check whether the given type [name] is a type parameter being used to
+   * define a static member.
+   *
+   * See [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC].
+   */
+  bool _checkForTypeParameterReferencedByStatic(TypeName name) {
+    if (_isInStaticMethod || _isInStaticVariableDeclaration) {
+      DartType type = name.type;
+      if (type is TypeParameterType) {
+        _errorReporter.reportErrorForNode(
+            StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC, name);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Check whether the given type [parameter] is a supertype of its bound.
+   *
+   * See [StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND].
+   */
+  bool _checkForTypeParameterSupertypeOfItsBound(TypeParameter parameter) {
+    TypeParameterElement element = parameter.element;
+    // prepare bound
+    DartType bound = element.bound;
+    if (bound == null) {
+      return false;
+    }
+    // OK, type parameter is not supertype of its bound
+    if (!bound.isMoreSpecificThan(element.type)) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(
+        StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, parameter,
+        [element.displayName]);
+    return true;
+  }
+
+  /**
+   * Check that if the given generative [constructor] has neither an explicit
+   * super constructor invocation nor a redirecting constructor invocation, that
+   * the superclass has a default generative constructor.
+   *
+   * See [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT],
+   * [CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR], and
+   * [StaticWarningCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT].
+   */
+  bool _checkForUndefinedConstructorInInitializerImplicit(
+      ConstructorDeclaration constructor) {
+    if (_enclosingClass == null) {
+      return false;
+    }
+    // do nothing if mixin errors have already been reported for this class.
+    ClassElementImpl enclosingClass = _enclosingClass;
+    if (enclosingClass.doesMixinLackConstructors) {
+      return false;
+    }
+    //
+    // Ignore if the constructor is not generative.
+    //
+    if (constructor.factoryKeyword != null) {
+      return false;
+    }
+    //
+    // Ignore if the constructor has either an implicit super constructor
+    // invocation or a redirecting constructor invocation.
+    //
+    for (ConstructorInitializer constructorInitializer
+        in constructor.initializers) {
+      if (constructorInitializer is SuperConstructorInvocation ||
+          constructorInitializer is RedirectingConstructorInvocation) {
+        return false;
+      }
+    }
+    //
+    // Check to see whether the superclass has a non-factory unnamed
+    // constructor.
+    //
+    InterfaceType superType = _enclosingClass.supertype;
+    if (superType == null) {
+      return false;
+    }
+    ClassElement superElement = superType.element;
+    ConstructorElement superUnnamedConstructor =
+        superElement.unnamedConstructor;
+    if (superUnnamedConstructor != null) {
+      if (superUnnamedConstructor.isFactory) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR,
+            constructor.returnType, [superUnnamedConstructor]);
+        return true;
+      }
+      if (!superUnnamedConstructor.isDefaultConstructor ||
+          !_enclosingClass
+              .isSuperConstructorAccessible(superUnnamedConstructor)) {
+        int offset;
+        int length;
+        {
+          Identifier returnType = constructor.returnType;
+          SimpleIdentifier name = constructor.name;
+          offset = returnType.offset;
+          length = (name != null ? name.end : returnType.end) - offset;
+        }
+        _errorReporter.reportErrorForOffset(
+            CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, offset,
+            length, [superType.displayName]);
+      }
+      return false;
+    }
+    _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT,
+        constructor.returnType, [superElement.name]);
+    return true;
+  }
+
+  /**
+   * Check that if the given [name] is a reference to a static member it is
+   * defined in the enclosing class rather than in a superclass.
+   *
+   * See [StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER].
+   */
+  bool _checkForUnqualifiedReferenceToNonLocalStaticMember(
+      SimpleIdentifier name) {
+    Element element = name.staticElement;
+    if (element == null || element is TypeParameterElement) {
+      return false;
+    }
+    Element enclosingElement = element.enclosingElement;
+    if (enclosingElement is! ClassElement) {
+      return false;
+    }
+    if ((element is MethodElement && !element.isStatic) ||
+        (element is PropertyAccessorElement && !element.isStatic)) {
+      return false;
+    }
+    if (identical(enclosingElement, _enclosingClass)) {
+      return false;
+    }
+    _errorReporter.reportErrorForNode(
+        StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
+        name, [name.name]);
+    return true;
+  }
+
+  void _checkForValidField(FieldFormalParameter parameter) {
+    ParameterElement element = parameter.element;
+    if (element is FieldFormalParameterElement) {
+      FieldElement fieldElement = element.field;
+      if (fieldElement == null || fieldElement.isSynthetic) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD,
+            parameter, [parameter.identifier.name]);
+      } else {
+        ParameterElement parameterElement = parameter.element;
+        if (parameterElement is FieldFormalParameterElementImpl) {
+          FieldFormalParameterElementImpl fieldFormal = parameterElement;
+          DartType declaredType = fieldFormal.type;
+          DartType fieldType = fieldElement.type;
+          if (fieldElement.isSynthetic) {
+            _errorReporter.reportErrorForNode(
+                CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD,
+                parameter, [parameter.identifier.name]);
+          } else if (fieldElement.isStatic) {
+            _errorReporter.reportErrorForNode(
+                CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD,
+                parameter, [parameter.identifier.name]);
+          } else if (declaredType != null &&
+              fieldType != null &&
+              !declaredType.isAssignableTo(fieldType)) {
+            _errorReporter.reportTypeErrorForNode(
+                StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE,
+                parameter, [declaredType, fieldType]);
+          }
+        } else {
+          if (fieldElement.isSynthetic) {
+            _errorReporter.reportErrorForNode(
+                CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD,
+                parameter, [parameter.identifier.name]);
+          } else if (fieldElement.isStatic) {
+            _errorReporter.reportErrorForNode(
+                CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD,
+                parameter, [parameter.identifier.name]);
+          }
+        }
+      }
+    }
+//        else {
+//        // TODO(jwren) Report error, constructor initializer variable is a top level element
+//        // (Either here or in ErrorVerifier.checkForAllFinalInitializedErrorCodes)
+//        }
+  }
+
+  /**
+   * Verify that the given [getter] does not have a return type of 'void'.
+   *
+   * See [StaticWarningCode.VOID_RETURN_FOR_GETTER].
+   */
+  bool _checkForVoidReturnType(MethodDeclaration getter) {
+    TypeName returnType = getter.returnType;
+    if (returnType == null || returnType.name.name != "void") {
+      return false;
+    }
+    _errorReporter.reportErrorForNode(
+        StaticWarningCode.VOID_RETURN_FOR_GETTER, returnType);
+    return true;
+  }
+
+  /**
+   * Verify the given operator-method [declaration], has correct number of
+   * parameters.
+   *
+   * This method assumes that the method declaration was tested to be an
+   * operator declaration before being called.
+   *
+   * See [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR].
+   */
+  bool _checkForWrongNumberOfParametersForOperator(
+      MethodDeclaration declaration) {
+    // prepare number of parameters
+    FormalParameterList parameterList = declaration.parameters;
+    if (parameterList == null) {
+      return false;
+    }
+    int numParameters = parameterList.parameters.length;
+    // prepare operator name
+    SimpleIdentifier nameNode = declaration.name;
+    if (nameNode == null) {
+      return false;
+    }
+    String name = nameNode.name;
+    // check for exact number of parameters
+    int expected = -1;
+    if ("[]=" == name) {
+      expected = 2;
+    } else if ("<" == name ||
+        ">" == name ||
+        "<=" == name ||
+        ">=" == name ||
+        "==" == name ||
+        "+" == name ||
+        "/" == name ||
+        "~/" == name ||
+        "*" == name ||
+        "%" == name ||
+        "|" == name ||
+        "^" == name ||
+        "&" == name ||
+        "<<" == name ||
+        ">>" == name ||
+        "[]" == name) {
+      expected = 1;
+    } else if ("~" == name) {
+      expected = 0;
+    }
+    if (expected != -1 && numParameters != expected) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR,
+          nameNode, [name, expected, numParameters]);
+      return true;
+    }
+    // check for operator "-"
+    if ("-" == name && numParameters > 1) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS,
+          nameNode, [numParameters]);
+      return true;
+    }
+    // OK
+    return false;
+  }
+
+  /**
+   * Verify that the given setter [parameterList] has only one required
+   * parameter. The [setterName] is the name of the setter to report problems
+   * on.
+   *
+   * This method assumes that the method declaration was tested to be a setter
+   * before being called.
+   *
+   * See [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER].
+   */
+  bool _checkForWrongNumberOfParametersForSetter(
+      SimpleIdentifier setterName, FormalParameterList parameterList) {
+    if (setterName == null) {
+      return false;
+    }
+    if (parameterList == null) {
+      return false;
+    }
+    NodeList<FormalParameter> parameters = parameterList.parameters;
+    if (parameters.length != 1 ||
+        parameters[0].kind != ParameterKind.REQUIRED) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER,
+          setterName);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Check for a type mis-match between the yielded type and the declared
+   * return type of a generator function.
+   *
+   * This method should only be called in generator functions.
+   */
+  bool _checkForYieldOfInvalidType(
+      Expression yieldExpression, bool isYieldEach) {
+    assert(_inGenerator);
+    if (_enclosingFunction == null) {
+      return false;
+    }
+    DartType declaredReturnType = _enclosingFunction.returnType;
+    DartType staticYieldedType = getStaticType(yieldExpression);
+    DartType impliedReturnType;
+    if (isYieldEach) {
+      impliedReturnType = staticYieldedType;
+    } else if (_enclosingFunction.isAsynchronous) {
+      impliedReturnType =
+          _typeProvider.streamType.substitute4(<DartType>[staticYieldedType]);
+    } else {
+      impliedReturnType =
+          _typeProvider.iterableType.substitute4(<DartType>[staticYieldedType]);
+    }
+    if (!impliedReturnType.isAssignableTo(declaredReturnType)) {
+      _errorReporter.reportTypeErrorForNode(
+          StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, yieldExpression, [
+        impliedReturnType,
+        declaredReturnType
+      ]);
+      return true;
+    }
+    if (isYieldEach) {
+      // Since the declared return type might have been "dynamic", we need to
+      // also check that the implied return type is assignable to generic
+      // Stream/Iterable.
+      DartType requiredReturnType;
+      if (_enclosingFunction.isAsynchronous) {
+        requiredReturnType = _typeProvider.streamDynamicType;
+      } else {
+        requiredReturnType = _typeProvider.iterableDynamicType;
+      }
+      if (!impliedReturnType.isAssignableTo(requiredReturnType)) {
+        _errorReporter.reportTypeErrorForNode(
+            StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, yieldExpression, [
+          impliedReturnType,
+          requiredReturnType
+        ]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Verify that if the given class [declaration] implements the class Function
+   * that it has a concrete implementation of the call method.
+   *
+   * See [StaticWarningCode.FUNCTION_WITHOUT_CALL].
+   */
+  bool _checkImplementsFunctionWithoutCall(ClassDeclaration declaration) {
+    if (declaration.isAbstract) {
+      return false;
+    }
+    ClassElement classElement = declaration.element;
+    if (classElement == null) {
+      return false;
+    }
+    if (!classElement.type.isSubtypeOf(_typeProvider.functionType)) {
+      return false;
+    }
+    // If there is a noSuchMethod method, then don't report the warning,
+    // see dartbug.com/16078
+    if (classElement.getMethod(FunctionElement.NO_SUCH_METHOD_METHOD_NAME) !=
+        null) {
+      return false;
+    }
+    ExecutableElement callMethod = _inheritanceManager.lookupMember(
+        classElement, FunctionElement.CALL_METHOD_NAME);
+    if (callMethod == null ||
+        callMethod is! MethodElement ||
+        (callMethod as MethodElement).isAbstract) {
+      _errorReporter.reportErrorForNode(
+          StaticWarningCode.FUNCTION_WITHOUT_CALL, declaration.name);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Verify that the given class [declaration] does not have the same class in
+   * the 'extends' and 'implements' clauses.
+   *
+   * See [CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS].
+   */
+  bool _checkImplementsSuperClass(ClassDeclaration declaration) {
+    // prepare super type
+    InterfaceType superType = _enclosingClass.supertype;
+    if (superType == null) {
+      return false;
+    }
+    // prepare interfaces
+    ImplementsClause implementsClause = declaration.implementsClause;
+    if (implementsClause == null) {
+      return false;
+    }
+    // check interfaces
+    bool hasProblem = false;
+    for (TypeName interfaceNode in implementsClause.interfaces) {
+      if (interfaceNode.type == superType) {
+        hasProblem = true;
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS, interfaceNode,
+            [superType.displayName]);
+      }
+    }
+    // done
+    return hasProblem;
+  }
+
+  DartType _computeReturnTypeForMethod(Expression returnExpression) {
+    // This method should never be called for generators, since generators are
+    // never allowed to contain return statements with expressions.
+    assert(!_inGenerator);
+    if (returnExpression == null) {
+      if (_enclosingFunction.isAsynchronous) {
+        return _typeProvider.futureNullType;
+      } else {
+        return VoidTypeImpl.instance;
+      }
+    }
+    DartType staticReturnType = getStaticType(returnExpression);
+    if (staticReturnType != null && _enclosingFunction.isAsynchronous) {
+      return _typeProvider.futureType.substitute4(<DartType>[
+        StaticTypeAnalyzer.flattenFutures(_typeProvider, staticReturnType)
+      ]);
+    }
+    return staticReturnType;
+  }
+
+  /**
+   * Return the error code that should be used when the given class [element]
+   * references itself directly.
+   */
+  ErrorCode _getBaseCaseErrorCode(ClassElement element) {
+    InterfaceType supertype = element.supertype;
+    if (supertype != null && _enclosingClass == supertype.element) {
+      return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS;
+    }
+    List<InterfaceType> mixins = element.mixins;
+    for (int i = 0; i < mixins.length; i++) {
+      if (_enclosingClass == mixins[i].element) {
+        return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH;
+      }
+    }
+    return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS;
+  }
+
+  /**
+   * Given an [expression] in a switch case whose value is expected to be an
+   * enum constant, return the name of the constant.
+   */
+  String _getConstantName(Expression expression) {
+    // TODO(brianwilkerson) Convert this to return the element representing the
+    // constant.
+    if (expression is SimpleIdentifier) {
+      return expression.name;
+    } else if (expression is PrefixedIdentifier) {
+      return expression.identifier.name;
+    } else if (expression is PropertyAccess) {
+      return expression.propertyName.name;
+    }
+    return null;
+  }
+
+  /**
+   * Return the return type of the given [getter].
+   */
+  DartType _getGetterType(PropertyAccessorElement getter) {
+    FunctionType functionType = getter.type;
+    if (functionType != null) {
+      return functionType.returnType;
+    } else {
+      return null;
+    }
+  }
+
+  /**
+   * Return the type of the first and only parameter of the given [setter].
+   */
+  DartType _getSetterType(PropertyAccessorElement setter) {
+    // Get the parameters for MethodDeclaration or FunctionDeclaration
+    List<ParameterElement> setterParameters = setter.parameters;
+    // If there are no setter parameters, return no type.
+    if (setterParameters.length == 0) {
+      return null;
+    }
+    return setterParameters[0].type;
+  }
+
+  /**
+   * Given a list of [directives] that have the same prefix, generate an error
+   * if there is more than one import and any of those imports is deferred.
+   *
+   * See [CompileTimeErrorCode.SHARED_DEFERRED_PREFIX].
+   */
+  bool _hasDeferredPrefixCollision(List<ImportDirective> directives) {
+    bool foundError = false;
+    int count = directives.length;
+    if (count > 1) {
+      for (int i = 0; i < count; i++) {
+        sc.Token deferredToken = directives[i].deferredKeyword;
+        if (deferredToken != null) {
+          _errorReporter.reportErrorForToken(
+              CompileTimeErrorCode.SHARED_DEFERRED_PREFIX, deferredToken);
+          foundError = true;
+        }
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * Return `true` if the given [constructor] redirects to itself, directly or
+   * indirectly.
+   */
+  bool _hasRedirectingFactoryConstructorCycle(ConstructorElement constructor) {
+    Set<ConstructorElement> constructors = new HashSet<ConstructorElement>();
+    ConstructorElement current = constructor;
+    while (current != null) {
+      if (constructors.contains(current)) {
+        return identical(current, constructor);
+      }
+      constructors.add(current);
+      current = current.redirectedConstructor;
+      if (current is ConstructorMember) {
+        current = (current as ConstructorMember).baseElement;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given [element] has direct or indirect reference to
+   * itself from anywhere except a class element or type parameter bounds.
+   */
+  bool _hasTypedefSelfReference(Element element) {
+    Set<Element> checked = new HashSet<Element>();
+    List<Element> toCheck = new List<Element>();
+    GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference elementVisitor =
+        new GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference(
+            toCheck);
+    toCheck.add(element);
+    bool firstIteration = true;
+    while (true) {
+      Element current;
+      // get next element
+      while (true) {
+        // may be no more elements to check
+        if (toCheck.isEmpty) {
+          return false;
+        }
+        // try to get next element
+        current = toCheck.removeAt(toCheck.length - 1);
+        if (element == current) {
+          if (firstIteration) {
+            firstIteration = false;
+            break;
+          } else {
+            return true;
+          }
+        }
+        if (current != null && !checked.contains(current)) {
+          break;
+        }
+      }
+      // check current element
+      current.accept(elementVisitor);
+      checked.add(current);
+    }
+  }
+
+  bool _isFunctionType(DartType type) {
+    if (type.isDynamic || type.isBottom) {
+      return true;
+    } else if (type is FunctionType || type.isDartCoreFunction) {
+      return true;
+    } else if (type is InterfaceType) {
+      MethodElement callMethod =
+          type.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _currentLibrary);
+      return callMethod != null;
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` iff the given [classElement] has a concrete method, getter or
+   * setter that matches the name of the given [executableElement] in either the
+   * class itself, or one of its' mixins.
+   *
+   * By "match", only the name of the member is tested to match, it does not
+   * have to equal or be a subtype of the given executable element, this is due
+   * to the specific use where this method is used in
+   * [_checkForNonAbstractClassInheritsAbstractMember].
+   */
+  bool _isMemberInClassOrMixin(
+      ExecutableElement executableElement, ClassElement classElement) {
+    ExecutableElement foundElt = null;
+    String executableName = executableElement.name;
+    if (executableElement is MethodElement) {
+      foundElt = classElement.getMethod(executableName);
+      if (foundElt != null && !(foundElt as MethodElement).isAbstract) {
+        return true;
+      }
+      List<InterfaceType> mixins = classElement.mixins;
+      for (int i = 0; i < mixins.length && foundElt == null; i++) {
+        foundElt = mixins[i].getMethod(executableName);
+      }
+      if (foundElt != null && !(foundElt as MethodElement).isAbstract) {
+        return true;
+      }
+    } else if (executableElement is PropertyAccessorElement) {
+      PropertyAccessorElement propertyAccessorElement = executableElement;
+      if (propertyAccessorElement.isGetter) {
+        foundElt = classElement.getGetter(executableName);
+      }
+      if (foundElt == null && propertyAccessorElement.isSetter) {
+        foundElt = classElement.getSetter(executableName);
+      }
+      if (foundElt != null &&
+          !(foundElt as PropertyAccessorElement).isAbstract) {
+        return true;
+      }
+      List<InterfaceType> mixins = classElement.mixins;
+      for (int i = 0; i < mixins.length && foundElt == null; i++) {
+        foundElt = mixins[i].getGetter(executableName);
+        if (foundElt == null) {
+          foundElt = mixins[i].getSetter(executableName);
+        }
+      }
+      if (foundElt != null &&
+          !(foundElt as PropertyAccessorElement).isAbstract) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given 'this' [expression] is in a valid context.
+   */
+  bool _isThisInValidContext(ThisExpression expression) {
+    for (AstNode node = expression.parent; node != null; node = node.parent) {
+      if (node is CompilationUnit) {
+        return false;
+      }
+      if (node is ConstructorDeclaration) {
+        return node.factoryKeyword == null;
+      }
+      if (node is ConstructorInitializer) {
+        return false;
+      }
+      if (node is MethodDeclaration) {
+        return !node.isStatic;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given [identifier] is in a location where it is
+   * allowed to resolve to a static member of a supertype.
+   */
+  bool _isUnqualifiedReferenceToNonLocalStaticMemberAllowed(
+      SimpleIdentifier identifier) {
+    if (identifier.inDeclarationContext()) {
+      return true;
+    }
+    AstNode parent = identifier.parent;
+    if (parent is ConstructorName ||
+        parent is MethodInvocation ||
+        parent is PropertyAccess ||
+        parent is SuperConstructorInvocation) {
+      return true;
+    }
+    if (parent is PrefixedIdentifier &&
+        identical(parent.identifier, identifier)) {
+      return true;
+    }
+    if (parent is Annotation && identical(parent.constructorName, identifier)) {
+      return true;
+    }
+    if (parent is CommentReference) {
+      CommentReference commentReference = parent;
+      if (commentReference.newKeyword != null) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  bool _isUserDefinedObject(EvaluationResultImpl result) => result == null ||
+      (result.value != null && result.value.isUserDefinedObject);
+
+  /**
+   * Check that the given class [element] is not a superinterface to itself. The
+   * [path] is a list containing the potentially cyclic implements path.
+   *
+   * See [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE],
+   * [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS],
+   * [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS],
+   * and [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH].
+   */
+  bool _safeCheckForRecursiveInterfaceInheritance(
+      ClassElement element, List<ClassElement> path) {
+    // Detect error condition.
+    int size = path.length;
+    // If this is not the base case (size > 0), and the enclosing class is the
+    // given class element then an error an error.
+    if (size > 0 && _enclosingClass == element) {
+      String enclosingClassName = _enclosingClass.displayName;
+      if (size > 1) {
+        // Construct a string showing the cyclic implements path:
+        // "A, B, C, D, A"
+        String separator = ", ";
+        StringBuffer buffer = new StringBuffer();
+        for (int i = 0; i < size; i++) {
+          buffer.write(path[i].displayName);
+          buffer.write(separator);
+        }
+        buffer.write(element.displayName);
+        _errorReporter.reportErrorForOffset(
+            CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+            _enclosingClass.nameOffset, enclosingClassName.length, [
+          enclosingClassName,
+          buffer.toString()
+        ]);
+        return true;
+      } else {
+        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS or
+        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS or
+        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH
+        _errorReporter.reportErrorForOffset(_getBaseCaseErrorCode(element),
+            _enclosingClass.nameOffset, enclosingClassName.length,
+            [enclosingClassName]);
+        return true;
+      }
+    }
+    if (path.indexOf(element) > 0) {
+      return false;
+    }
+    path.add(element);
+    // n-case
+    InterfaceType supertype = element.supertype;
+    if (supertype != null &&
+        _safeCheckForRecursiveInterfaceInheritance(supertype.element, path)) {
+      return true;
+    }
+    List<InterfaceType> interfaceTypes = element.interfaces;
+    for (InterfaceType interfaceType in interfaceTypes) {
+      if (_safeCheckForRecursiveInterfaceInheritance(
+          interfaceType.element, path)) {
+        return true;
+      }
+    }
+    List<InterfaceType> mixinTypes = element.mixins;
+    for (InterfaceType mixinType in mixinTypes) {
+      if (_safeCheckForRecursiveInterfaceInheritance(mixinType.element, path)) {
+        return true;
+      }
+    }
+    path.removeAt(path.length - 1);
+    return false;
+  }
+
+  /**
+   * Return the static type of the given [expression] that is to be used for
+   * type analysis.
+   */
+  static DartType getStaticType(Expression expression) {
+    DartType type = expression.staticType;
+    if (type == null) {
+      // TODO(brianwilkerson) This should never happen.
+      return DynamicTypeImpl.instance;
+    }
+    return type;
+  }
+
+  /**
+   * Return the variable element represented by the given [expression], or
+   * `null` if there is no such element.
+   */
+  static VariableElement getVariableElement(Expression expression) {
+    if (expression is Identifier) {
+      Element element = expression.staticElement;
+      if (element is VariableElement) {
+        return element;
+      }
+    }
+    return null;
+  }
+}
+
+class GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference
+    extends GeneralizingElementVisitor<Object> {
+  List<Element> toCheck;
+
+  GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference(this.toCheck)
+      : super();
+
+  @override
+  Object visitClassElement(ClassElement element) {
+    // Typedefs are allowed to reference themselves via classes.
+    return null;
+  }
+
+  @override
+  Object visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
+    _addTypeToCheck(element.returnType);
+    return super.visitFunctionTypeAliasElement(element);
+  }
+
+  @override
+  Object visitParameterElement(ParameterElement element) {
+    _addTypeToCheck(element.type);
+    return super.visitParameterElement(element);
+  }
+
+  @override
+  Object visitTypeParameterElement(TypeParameterElement element) {
+    _addTypeToCheck(element.bound);
+    return super.visitTypeParameterElement(element);
+  }
+
+  void _addTypeToCheck(DartType type) {
+    if (type == null) {
+      return;
+    }
+    // schedule for checking
+    toCheck.add(type.element);
+    // type arguments
+    if (type is InterfaceType) {
+      InterfaceType interfaceType = type;
+      for (DartType typeArgument in interfaceType.typeArguments) {
+        _addTypeToCheck(typeArgument);
+      }
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/html.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/html.dart
new file mode 100644
index 0000000..a72a1c8
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/html.dart
@@ -0,0 +1,1883 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.html;
+
+import 'dart:collection';
+
+import 'ast.dart';
+import 'element.dart';
+import 'engine.dart' show AnalysisOptions, AnalysisEngine;
+import 'error.dart' show AnalysisErrorListener;
+import 'java_core.dart';
+import 'java_engine.dart';
+import 'parser.dart' show Parser;
+import 'scanner.dart' as sc show Scanner, SubSequenceReader, Token;
+import 'source.dart';
+
+/**
+ * The abstract class `AbstractScanner` implements a scanner for HTML code. Subclasses are
+ * required to implement the interface used to access the characters being scanned.
+ */
+abstract class AbstractScanner {
+  static List<String> _NO_PASS_THROUGH_ELEMENTS = <String>[];
+
+  /**
+   * The source being scanned.
+   */
+  final Source source;
+
+  /**
+   * The token pointing to the head of the linked list of tokens.
+   */
+  Token _tokens;
+
+  /**
+   * The last token that was scanned.
+   */
+  Token _tail;
+
+  /**
+   * A list containing the offsets of the first character of each line in the source code.
+   */
+  List<int> _lineStarts = new List<int>();
+
+  /**
+   * An array of element tags for which the content between tags should be consider a single token.
+   */
+  List<String> _passThroughElements = _NO_PASS_THROUGH_ELEMENTS;
+
+  /**
+   * Initialize a newly created scanner.
+   *
+   * @param source the source being scanned
+   */
+  AbstractScanner(this.source) {
+    _tokens = new Token.con1(TokenType.EOF, -1);
+    _tokens.setNext(_tokens);
+    _tail = _tokens;
+    recordStartOfLine();
+  }
+
+  /**
+   * Return an array containing the offsets of the first character of each line in the source code.
+   *
+   * @return an array containing the offsets of the first character of each line in the source code
+   */
+  List<int> get lineStarts => _lineStarts;
+
+  /**
+   * Return the current offset relative to the beginning of the file. Return the initial offset if
+   * the scanner has not yet scanned the source code, and one (1) past the end of the source code if
+   * the source code has been scanned.
+   *
+   * @return the current offset of the scanner in the source
+   */
+  int get offset;
+
+  /**
+   * Set array of element tags for which the content between tags should be consider a single token.
+   */
+  void set passThroughElements(List<String> passThroughElements) {
+    this._passThroughElements = passThroughElements != null
+        ? passThroughElements
+        : _NO_PASS_THROUGH_ELEMENTS;
+  }
+
+  /**
+   * Advance the current position and return the character at the new current position.
+   *
+   * @return the character at the new current position
+   */
+  int advance();
+
+  /**
+   * Return the substring of the source code between the start offset and the modified current
+   * position. The current position is modified by adding the end delta.
+   *
+   * @param start the offset to the beginning of the string, relative to the start of the file
+   * @param endDelta the number of character after the current location to be included in the
+   *          string, or the number of characters before the current location to be excluded if the
+   *          offset is negative
+   * @return the specified substring of the source code
+   */
+  String getString(int start, int endDelta);
+
+  /**
+   * Return the character at the current position without changing the current position.
+   *
+   * @return the character at the current position
+   */
+  int peek();
+
+  /**
+   * Record the fact that we are at the beginning of a new line in the source.
+   */
+  void recordStartOfLine() {
+    _lineStarts.add(offset);
+  }
+
+  /**
+   * Scan the source code to produce a list of tokens representing the source.
+   *
+   * @return the first token in the list of tokens that were produced
+   */
+  Token tokenize() {
+    _scan();
+    _appendEofToken();
+    return _firstToken();
+  }
+
+  void _appendEofToken() {
+    Token eofToken = new Token.con1(TokenType.EOF, offset);
+    // The EOF token points to itself so that there is always infinite
+    // look-ahead.
+    eofToken.setNext(eofToken);
+    _tail = _tail.setNext(eofToken);
+  }
+
+  Token _emit(Token token) {
+    _tail.setNext(token);
+    _tail = token;
+    return token;
+  }
+
+  Token _emitWithOffset(TokenType type, int start) =>
+      _emit(new Token.con1(type, start));
+
+  Token _emitWithOffsetAndLength(TokenType type, int start, int count) =>
+      _emit(new Token.con2(type, start, getString(start, count)));
+
+  Token _firstToken() => _tokens.next;
+
+  int _recordStartOfLineAndAdvance(int c) {
+    if (c == 0xD) {
+      c = advance();
+      if (c == 0xA) {
+        c = advance();
+      }
+      recordStartOfLine();
+    } else if (c == 0xA) {
+      c = advance();
+      recordStartOfLine();
+    } else {
+      c = advance();
+    }
+    return c;
+  }
+
+  void _scan() {
+    bool inBrackets = false;
+    String endPassThrough = null;
+    int c = advance();
+    while (c >= 0) {
+      int start = offset;
+      if (c == 0x3C) {
+        c = advance();
+        if (c == 0x21) {
+          c = advance();
+          if (c == 0x2D && peek() == 0x2D) {
+            // handle a comment
+            c = advance();
+            int dashCount = 1;
+            while (c >= 0) {
+              if (c == 0x2D) {
+                dashCount++;
+              } else if (c == 0x3E && dashCount >= 2) {
+                c = advance();
+                break;
+              } else {
+                dashCount = 0;
+              }
+              c = _recordStartOfLineAndAdvance(c);
+            }
+            _emitWithOffsetAndLength(TokenType.COMMENT, start, -1);
+            // Capture <!--> and <!---> as tokens but report an error
+            if (_tail.length < 7) {
+              // TODO (danrubel): Report invalid HTML comment
+            }
+          } else {
+            // handle a declaration
+            while (c >= 0) {
+              if (c == 0x3E) {
+                c = advance();
+                break;
+              }
+              c = _recordStartOfLineAndAdvance(c);
+            }
+            _emitWithOffsetAndLength(TokenType.DECLARATION, start, -1);
+            if (!StringUtilities.endsWithChar(_tail.lexeme, 0x3E)) {
+              // TODO (danrubel): Report missing '>' in directive
+            }
+          }
+        } else if (c == 0x3F) {
+          // handle a directive
+          while (c >= 0) {
+            if (c == 0x3F) {
+              c = advance();
+              if (c == 0x3E) {
+                c = advance();
+                break;
+              }
+            } else {
+              c = _recordStartOfLineAndAdvance(c);
+            }
+          }
+          _emitWithOffsetAndLength(TokenType.DIRECTIVE, start, -1);
+          if (_tail.length < 4) {
+            // TODO (danrubel): Report invalid directive
+          }
+        } else if (c == 0x2F) {
+          _emitWithOffset(TokenType.LT_SLASH, start);
+          inBrackets = true;
+          c = advance();
+        } else {
+          inBrackets = true;
+          _emitWithOffset(TokenType.LT, start);
+          // ignore whitespace in braces
+          while (Character.isWhitespace(c)) {
+            c = _recordStartOfLineAndAdvance(c);
+          }
+          // get tag
+          if (Character.isLetterOrDigit(c)) {
+            int tagStart = offset;
+            c = advance();
+            while (Character.isLetterOrDigit(c) || c == 0x2D || c == 0x5F) {
+              c = advance();
+            }
+            _emitWithOffsetAndLength(TokenType.TAG, tagStart, -1);
+            // check tag against passThrough elements
+            String tag = _tail.lexeme;
+            for (String str in _passThroughElements) {
+              if (str == tag) {
+                endPassThrough = "</$str>";
+                break;
+              }
+            }
+          }
+        }
+      } else if (c == 0x3E) {
+        _emitWithOffset(TokenType.GT, start);
+        inBrackets = false;
+        c = advance();
+        // if passThrough != null, read until we match it
+        if (endPassThrough != null) {
+          bool endFound = false;
+          int len = endPassThrough.length;
+          int firstC = endPassThrough.codeUnitAt(0);
+          int index = 0;
+          int nextC = firstC;
+          while (c >= 0) {
+            if (c == nextC) {
+              index++;
+              if (index == len) {
+                endFound = true;
+                break;
+              }
+              nextC = endPassThrough.codeUnitAt(index);
+            } else if (c == firstC) {
+              index = 1;
+              nextC = endPassThrough.codeUnitAt(1);
+            } else {
+              index = 0;
+              nextC = firstC;
+            }
+            c = _recordStartOfLineAndAdvance(c);
+          }
+          if (start + 1 < offset) {
+            if (endFound) {
+              _emitWithOffsetAndLength(TokenType.TEXT, start + 1, -len);
+              _emitWithOffset(TokenType.LT_SLASH, offset - len + 1);
+              _emitWithOffsetAndLength(TokenType.TAG, offset - len + 3, -1);
+            } else {
+              _emitWithOffsetAndLength(TokenType.TEXT, start + 1, -1);
+            }
+          }
+          endPassThrough = null;
+        }
+      } else if (c == 0x2F && peek() == 0x3E) {
+        advance();
+        _emitWithOffset(TokenType.SLASH_GT, start);
+        inBrackets = false;
+        c = advance();
+      } else if (!inBrackets) {
+        c = _recordStartOfLineAndAdvance(c);
+        while (c != 0x3C && c >= 0) {
+          c = _recordStartOfLineAndAdvance(c);
+        }
+        _emitWithOffsetAndLength(TokenType.TEXT, start, -1);
+      } else if (c == 0x22 || c == 0x27) {
+        // read a string
+        int endQuote = c;
+        c = advance();
+        while (c >= 0) {
+          if (c == endQuote) {
+            c = advance();
+            break;
+          }
+          c = _recordStartOfLineAndAdvance(c);
+        }
+        _emitWithOffsetAndLength(TokenType.STRING, start, -1);
+      } else if (c == 0x3D) {
+        // a non-char token
+        _emitWithOffset(TokenType.EQ, start);
+        c = advance();
+      } else if (Character.isWhitespace(c)) {
+        // ignore whitespace in braces
+        do {
+          c = _recordStartOfLineAndAdvance(c);
+        } while (Character.isWhitespace(c));
+      } else if (Character.isLetterOrDigit(c)) {
+        c = advance();
+        while (Character.isLetterOrDigit(c) || c == 0x2D || c == 0x5F) {
+          c = advance();
+        }
+        _emitWithOffsetAndLength(TokenType.TAG, start, -1);
+      } else {
+        // a non-char token
+        _emitWithOffsetAndLength(TokenType.TEXT, start, 0);
+        c = advance();
+      }
+    }
+  }
+}
+
+/**
+ * Instances of the class `HtmlParser` are used to parse tokens into a AST structure comprised
+ * of [XmlNode]s.
+ */
+class HtmlParser extends XmlParser {
+  static String _APPLICATION_DART_IN_DOUBLE_QUOTES = "\"application/dart\"";
+
+  static String _APPLICATION_DART_IN_SINGLE_QUOTES = "'application/dart'";
+
+  static String _SCRIPT = "script";
+
+  static String _TYPE = "type";
+
+  /**
+   * A set containing the names of tags that do not have a closing tag.
+   */
+  static Set<String> SELF_CLOSING = new HashSet<String>.from(<String>[
+    "area",
+    "base",
+    "basefont",
+    "br",
+    "col",
+    "frame",
+    "hr",
+    "img",
+    "input",
+    "link",
+    "meta",
+    "param",
+    "!"
+  ]);
+
+  /**
+   * The line information associated with the source being parsed.
+   */
+  LineInfo _lineInfo;
+
+  /**
+   * The error listener to which errors will be reported.
+   */
+  final AnalysisErrorListener _errorListener;
+
+  final AnalysisOptions _options;
+
+  /**
+   * Construct a parser for the specified source.
+   *
+   * [source] is the source being parsed.  [_errorListener] is the error
+   * listener to which errors will be reported.  [_options] is the analysis
+   * options which should be used for parsing.
+   */
+  HtmlParser(Source source, this._errorListener, this._options) : super(source);
+
+  @override
+  XmlAttributeNode createAttributeNode(Token name, Token equals, Token value) =>
+      new XmlAttributeNode(name, equals, value);
+
+  @override
+  XmlTagNode createTagNode(Token nodeStart, Token tag,
+      List<XmlAttributeNode> attributes, Token attributeEnd,
+      List<XmlTagNode> tagNodes, Token contentEnd, Token closingTag,
+      Token nodeEnd) {
+    if (_isScriptNode(tag, attributes, tagNodes)) {
+      HtmlScriptTagNode tagNode = new HtmlScriptTagNode(nodeStart, tag,
+          attributes, attributeEnd, tagNodes, contentEnd, closingTag, nodeEnd);
+      String contents = tagNode.content;
+      int contentOffset = attributeEnd.end;
+      LineInfo_Location location = _lineInfo.getLocation(contentOffset);
+      sc.Scanner scanner = new sc.Scanner(source,
+          new sc.SubSequenceReader(contents, contentOffset), _errorListener);
+      scanner.setSourceStart(location.lineNumber, location.columnNumber);
+      sc.Token firstToken = scanner.tokenize();
+      Parser parser = new Parser(source, _errorListener);
+      CompilationUnit unit = parser.parseCompilationUnit(firstToken);
+      unit.lineInfo = _lineInfo;
+      tagNode.script = unit;
+      return tagNode;
+    }
+    return new XmlTagNode(nodeStart, tag, attributes, attributeEnd, tagNodes,
+        contentEnd, closingTag, nodeEnd);
+  }
+
+  @override
+  bool isSelfClosing(Token tag) => SELF_CLOSING.contains(tag.lexeme);
+
+  /**
+   * Parse the given tokens.
+   *
+   * @param token the first token in the stream of tokens to be parsed
+   * @param lineInfo the line information created by the scanner
+   * @return the parse result (not `null`)
+   */
+  HtmlUnit parse(Token token, LineInfo lineInfo) {
+    this._lineInfo = lineInfo;
+    List<XmlTagNode> tagNodes = parseTopTagNodes(token);
+    return new HtmlUnit(token, tagNodes, currentToken);
+  }
+
+  /**
+   * Determine if the specified node is a Dart script.
+   *
+   * @param node the node to be tested (not `null`)
+   * @return `true` if the node is a Dart script
+   */
+  bool _isScriptNode(
+      Token tag, List<XmlAttributeNode> attributes, List<XmlTagNode> tagNodes) {
+    if (tagNodes.length != 0 || tag.lexeme != _SCRIPT) {
+      return false;
+    }
+    for (XmlAttributeNode attribute in attributes) {
+      if (attribute.name == _TYPE) {
+        Token valueToken = attribute.valueToken;
+        if (valueToken != null) {
+          String value = valueToken.lexeme;
+          if (value == _APPLICATION_DART_IN_DOUBLE_QUOTES ||
+              value == _APPLICATION_DART_IN_SINGLE_QUOTES) {
+            return true;
+          }
+        }
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Given the contents of an embedded expression that occurs at the given offset, parse it as a
+   * Dart expression. The contents should not include the expression's delimiters.
+   *
+   * @param source the source that contains that given token
+   * @param token the token to start parsing from
+   * @return the Dart expression that was parsed
+   */
+  static Expression parseEmbeddedExpression(
+      Source source, sc.Token token, AnalysisErrorListener errorListener) {
+    Parser parser = new Parser(source, errorListener);
+    return parser.parseExpression(token);
+  }
+
+  /**
+   * Given the contents of an embedded expression that occurs at the given offset, scans it as a
+   * Dart code.
+   *
+   * @param source the source of that contains the given contents
+   * @param contents the contents to scan
+   * @param contentOffset the offset of the contents in the larger file
+   * @return the first Dart token
+   */
+  static sc.Token scanDartSource(Source source, LineInfo lineInfo,
+      String contents, int contentOffset, AnalysisErrorListener errorListener) {
+    LineInfo_Location location = lineInfo.getLocation(contentOffset);
+    sc.Scanner scanner = new sc.Scanner(source,
+        new sc.SubSequenceReader(contents, contentOffset), errorListener);
+    scanner.setSourceStart(location.lineNumber, location.columnNumber);
+    return scanner.tokenize();
+  }
+}
+
+/**
+ * Instances of the class `HtmlScriptTagNode` represent a script tag within an HTML file that
+ * references a Dart script.
+ */
+@deprecated
+class HtmlScriptTagNode extends XmlTagNode {
+  /**
+   * The AST structure representing the Dart code within this tag.
+   */
+  CompilationUnit _script;
+
+  /**
+   * The element representing this script.
+   */
+  HtmlScriptElement scriptElement;
+
+  /**
+   * Initialize a newly created node to represent a script tag within an HTML file that references a
+   * Dart script.
+   *
+   * @param nodeStart the token marking the beginning of the tag
+   * @param tag the name of the tag
+   * @param attributes the attributes in the tag
+   * @param attributeEnd the token terminating the region where attributes can be
+   * @param tagNodes the children of the tag
+   * @param contentEnd the token that starts the closing tag
+   * @param closingTag the name of the tag that occurs in the closing tag
+   * @param nodeEnd the last token in the tag
+   */
+  HtmlScriptTagNode(Token nodeStart, Token tag,
+      List<XmlAttributeNode> attributes, Token attributeEnd,
+      List<XmlTagNode> tagNodes, Token contentEnd, Token closingTag,
+      Token nodeEnd)
+      : super(nodeStart, tag, attributes, attributeEnd, tagNodes, contentEnd,
+          closingTag, nodeEnd);
+
+  /**
+   * Return the AST structure representing the Dart code within this tag, or `null` if this
+   * tag references an external script.
+   *
+   * @return the AST structure representing the Dart code within this tag
+   */
+  CompilationUnit get script => _script;
+
+  /**
+   * Set the AST structure representing the Dart code within this tag to the given compilation unit.
+   *
+   * @param unit the AST structure representing the Dart code within this tag
+   */
+  void set script(CompilationUnit unit) {
+    _script = unit;
+  }
+
+  @override
+  accept(XmlVisitor visitor) => visitor.visitHtmlScriptTagNode(this);
+}
+
+/**
+ * Instances of the class `HtmlUnit` represent the contents of an HTML file.
+ */
+@deprecated
+class HtmlUnit extends XmlNode {
+  /**
+   * The first token in the token stream that was parsed to form this HTML unit.
+   */
+  final Token beginToken;
+
+  /**
+   * The last token in the token stream that was parsed to form this compilation unit. This token
+   * should always have a type of [TokenType.EOF].
+   */
+  final Token endToken;
+
+  /**
+   * The tag nodes contained in the receiver (not `null`, contains no `null`s).
+   */
+  List<XmlTagNode> _tagNodes;
+
+  /**
+   * Construct a new instance representing the content of an HTML file.
+   *
+   * @param beginToken the first token in the file (not `null`)
+   * @param tagNodes child tag nodes of the receiver (not `null`, contains no `null`s)
+   * @param endToken the last token in the token stream which should be of type
+   *          [TokenType.EOF]
+   */
+  HtmlUnit(this.beginToken, List<XmlTagNode> tagNodes, this.endToken) {
+    this._tagNodes = becomeParentOfAll(tagNodes);
+  }
+
+  /**
+   * Return the element associated with this HTML unit.
+   *
+   * @return the element or `null` if the receiver is not resolved
+   */
+  @override
+  HtmlElement get element => super.element as HtmlElement;
+
+  @override
+  void set element(Element element) {
+    if (element != null && element is! HtmlElement) {
+      throw new IllegalArgumentException(
+          "HtmlElement expected, but ${element.runtimeType} given");
+    }
+    super.element = element;
+  }
+
+  /**
+   * Answer the tag nodes contained in the receiver. Callers should not manipulate the returned list
+   * to edit the AST structure.
+   *
+   * @return the children (not `null`, contains no `null`s)
+   */
+  List<XmlTagNode> get tagNodes => _tagNodes;
+
+  @override
+  accept(XmlVisitor visitor) => visitor.visitHtmlUnit(this);
+
+  @override
+  void visitChildren(XmlVisitor visitor) {
+    for (XmlTagNode node in _tagNodes) {
+      node.accept(visitor);
+    }
+  }
+}
+
+/**
+ * Instances of the class `RecursiveXmlVisitor` implement an XML visitor that will recursively
+ * visit all of the nodes in an XML structure. For example, using an instance of this class to visit
+ * a [XmlTagNode] will also cause all of the contained [XmlAttributeNode]s and
+ * [XmlTagNode]s to be visited.
+ *
+ * Subclasses that override a visit method must either invoke the overridden visit method or must
+ * explicitly ask the visited node to visit its children. Failure to do so will cause the children
+ * of the visited node to not be visited.
+ */
+class RecursiveXmlVisitor<R> implements XmlVisitor<R> {
+  @override
+  R visitHtmlScriptTagNode(HtmlScriptTagNode node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitHtmlUnit(HtmlUnit node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitXmlAttributeNode(XmlAttributeNode node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitXmlTagNode(XmlTagNode node) {
+    node.visitChildren(this);
+    return null;
+  }
+}
+
+/**
+ * Instances of the class `SimpleXmlVisitor` implement an AST visitor that will do nothing
+ * when visiting an AST node. It is intended to be a superclass for classes that use the visitor
+ * pattern primarily as a dispatch mechanism (and hence don't need to recursively visit a whole
+ * structure) and that only need to visit a small number of node types.
+ */
+class SimpleXmlVisitor<R> implements XmlVisitor<R> {
+  @override
+  R visitHtmlScriptTagNode(HtmlScriptTagNode node) => null;
+
+  @override
+  R visitHtmlUnit(HtmlUnit htmlUnit) => null;
+
+  @override
+  R visitXmlAttributeNode(XmlAttributeNode xmlAttributeNode) => null;
+
+  @override
+  R visitXmlTagNode(XmlTagNode xmlTagNode) => null;
+}
+
+/**
+ * Instances of the class `StringScanner` implement a scanner that reads from a string. The
+ * scanning logic is in the superclass.
+ */
+class StringScanner extends AbstractScanner {
+  /**
+   * The string from which characters will be read.
+   */
+  final String _string;
+
+  /**
+   * The number of characters in the string.
+   */
+  int _stringLength = 0;
+
+  /**
+   * The index, relative to the string, of the last character that was read.
+   */
+  int _charOffset = 0;
+
+  /**
+   * Initialize a newly created scanner to scan the characters in the given string.
+   *
+   * @param source the source being scanned
+   * @param string the string from which characters will be read
+   */
+  StringScanner(Source source, this._string) : super(source) {
+    this._stringLength = _string.length;
+    this._charOffset = -1;
+  }
+
+  @override
+  int get offset => _charOffset;
+
+  void set offset(int offset) {
+    _charOffset = offset;
+  }
+
+  @override
+  int advance() {
+    if (++_charOffset < _stringLength) {
+      return _string.codeUnitAt(_charOffset);
+    }
+    _charOffset = _stringLength;
+    return -1;
+  }
+
+  @override
+  String getString(int start, int endDelta) =>
+      _string.substring(start, _charOffset + 1 + endDelta).toString();
+
+  @override
+  int peek() {
+    if (_charOffset + 1 < _stringLength) {
+      return _string.codeUnitAt(_charOffset + 1);
+    }
+    return -1;
+  }
+}
+
+/**
+ * Instances of the class `Token` represent a token that was scanned from the input. Each
+ * token knows which token follows it, acting as the head of a linked list of tokens.
+ */
+class Token {
+  /**
+   * The offset from the beginning of the file to the first character in the token.
+   */
+  final int offset;
+
+  /**
+   * The previous token in the token stream.
+   */
+  Token previous;
+
+  /**
+   * The next token in the token stream.
+   */
+  Token _next;
+
+  /**
+   * The type of the token.
+   */
+  final TokenType type;
+
+  /**
+   * The lexeme represented by this token.
+   */
+  String _value;
+
+  /**
+   * Initialize a newly created token.
+   *
+   * @param type the token type (not `null`)
+   * @param offset the offset from the beginning of the file to the first character in the token
+   */
+  Token.con1(TokenType type, int offset) : this.con2(type, offset, type.lexeme);
+
+  /**
+   * Initialize a newly created token.
+   *
+   * @param type the token type (not `null`)
+   * @param offset the offset from the beginning of the file to the first character in the token
+   * @param value the lexeme represented by this token (not `null`)
+   */
+  Token.con2(this.type, this.offset, String value) {
+    this._value = StringUtilities.intern(value);
+  }
+
+  /**
+   * Return the offset from the beginning of the file to the character after last character of the
+   * token.
+   *
+   * @return the offset from the beginning of the file to the first character after last character
+   *         of the token
+   */
+  int get end => offset + length;
+
+  /**
+   * Return `true` if this token is a synthetic token. A synthetic token is a token that was
+   * introduced by the parser in order to recover from an error in the code. Synthetic tokens always
+   * have a length of zero (`0`).
+   *
+   * @return `true` if this token is a synthetic token
+   */
+  bool get isSynthetic => length == 0;
+
+  /**
+   * Return the number of characters in the node's source range.
+   *
+   * @return the number of characters in the node's source range
+   */
+  int get length => lexeme.length;
+
+  /**
+   * Return the lexeme that represents this token.
+   *
+   * @return the lexeme (not `null`)
+   */
+  String get lexeme => _value;
+
+  /**
+   * Return the next token in the token stream.
+   *
+   * @return the next token in the token stream
+   */
+  Token get next => _next;
+
+  /**
+   * Set the next token in the token stream to the given token. This has the side-effect of setting
+   * this token to be the previous token for the given token.
+   *
+   * @param token the next token in the token stream
+   * @return the token that was passed in
+   */
+  Token setNext(Token token) {
+    _next = token;
+    token.previous = this;
+    return token;
+  }
+
+  @override
+  String toString() => lexeme;
+}
+
+/**
+ * The enumeration `TokenType` defines the types of tokens that can be returned by the
+ * scanner.
+ */
+class TokenType extends Enum<TokenType> {
+  /**
+   * The type of the token that marks the end of the input.
+   */
+  static const TokenType EOF = const TokenType_EOF('EOF', 0, "");
+
+  static const TokenType EQ = const TokenType('EQ', 1, "=");
+
+  static const TokenType GT = const TokenType('GT', 2, ">");
+
+  static const TokenType LT_SLASH = const TokenType('LT_SLASH', 3, "</");
+
+  static const TokenType LT = const TokenType('LT', 4, "<");
+
+  static const TokenType SLASH_GT = const TokenType('SLASH_GT', 5, "/>");
+
+  static const TokenType COMMENT = const TokenType('COMMENT', 6, null);
+
+  static const TokenType DECLARATION = const TokenType('DECLARATION', 7, null);
+
+  static const TokenType DIRECTIVE = const TokenType('DIRECTIVE', 8, null);
+
+  static const TokenType STRING = const TokenType('STRING', 9, null);
+
+  static const TokenType TAG = const TokenType('TAG', 10, null);
+
+  static const TokenType TEXT = const TokenType('TEXT', 11, null);
+
+  static const List<TokenType> values = const [
+    EOF,
+    EQ,
+    GT,
+    LT_SLASH,
+    LT,
+    SLASH_GT,
+    COMMENT,
+    DECLARATION,
+    DIRECTIVE,
+    STRING,
+    TAG,
+    TEXT
+  ];
+
+  /**
+   * The lexeme that defines this type of token, or `null` if there is more than one possible
+   * lexeme for this type of token.
+   */
+  final String lexeme;
+
+  const TokenType(String name, int ordinal, this.lexeme) : super(name, ordinal);
+}
+
+class TokenType_EOF extends TokenType {
+  const TokenType_EOF(String name, int ordinal, String arg0)
+      : super(name, ordinal, arg0);
+
+  @override
+  String toString() => "-eof-";
+}
+
+/**
+ * Instances of the class `ToSourceVisitor` write a source representation of a visited XML
+ * node (and all of it's children) to a writer.
+ */
+class ToSourceVisitor implements XmlVisitor<Object> {
+  /**
+   * The writer to which the source is to be written.
+   */
+  final PrintWriter _writer;
+
+  /**
+   * Initialize a newly created visitor to write source code representing the visited nodes to the
+   * given writer.
+   *
+   * @param writer the writer to which the source is to be written
+   */
+  ToSourceVisitor(this._writer);
+
+  @override
+  Object visitHtmlScriptTagNode(HtmlScriptTagNode node) =>
+      visitXmlTagNode(node);
+
+  @override
+  Object visitHtmlUnit(HtmlUnit node) {
+    for (XmlTagNode child in node.tagNodes) {
+      _visit(child);
+    }
+    return null;
+  }
+
+  @override
+  Object visitXmlAttributeNode(XmlAttributeNode node) {
+    String name = node.name;
+    Token value = node.valueToken;
+    if (name.length == 0) {
+      _writer.print("__");
+    } else {
+      _writer.print(name);
+    }
+    _writer.print("=");
+    if (value == null) {
+      _writer.print("__");
+    } else {
+      _writer.print(value.lexeme);
+    }
+    return null;
+  }
+
+  @override
+  Object visitXmlTagNode(XmlTagNode node) {
+    _writer.print("<");
+    String tagName = node.tag;
+    _writer.print(tagName);
+    for (XmlAttributeNode attribute in node.attributes) {
+      _writer.print(" ");
+      _visit(attribute);
+    }
+    _writer.print(node.attributeEnd.lexeme);
+    if (node.closingTag != null) {
+      for (XmlTagNode child in node.tagNodes) {
+        _visit(child);
+      }
+      _writer.print("</");
+      _writer.print(tagName);
+      _writer.print(">");
+    }
+    return null;
+  }
+
+  /**
+   * Safely visit the given node.
+   *
+   * @param node the node to be visited
+   */
+  void _visit(XmlNode node) {
+    if (node != null) {
+      node.accept(this);
+    }
+  }
+}
+
+/**
+ * Instances of `XmlAttributeNode` represent name/value pairs owned by an [XmlTagNode].
+ */
+class XmlAttributeNode extends XmlNode {
+  /**
+   * An empty list of XML attribute nodes.
+   */
+  static const List<XmlAttributeNode> EMPTY_LIST = const <XmlAttributeNode>[];
+
+  final Token _name;
+
+  final Token equals;
+
+  final Token _value;
+
+  List<XmlExpression> expressions = XmlExpression.EMPTY_ARRAY;
+
+  /**
+   * Construct a new instance representing an XML attribute.
+   *
+   * @param name the name token (not `null`). This may be a zero length token if the attribute
+   *          is badly formed.
+   * @param equals the equals sign or `null` if none
+   * @param value the value token (not `null`)
+   */
+  XmlAttributeNode(this._name, this.equals, this._value);
+
+  @override
+  Token get beginToken => _name;
+
+  @override
+  Token get endToken => _value;
+
+  /**
+   * Answer the attribute name. This may be a zero length string if the attribute is badly formed.
+   *
+   * @return the name (not `null`)
+   */
+  String get name => _name.lexeme;
+
+  /**
+   * Answer the attribute name token. This may be a zero length token if the attribute is badly
+   * formed.
+   *
+   * @return the name token (not `null`)
+   */
+  Token get nameToken => _name;
+
+  /**
+   * Answer the lexeme for the value token without the leading and trailing quotes.
+   *
+   * @return the text or `null` if the value is not specified
+   */
+  String get text {
+    if (_value == null) {
+      return null;
+    }
+    //TODO (danrubel): replace HTML character encodings with the actual
+    // characters
+    String text = _value.lexeme;
+    int len = text.length;
+    if (len > 0) {
+      if (text.codeUnitAt(0) == 0x22) {
+        if (len > 1 && text.codeUnitAt(len - 1) == 0x22) {
+          return text.substring(1, len - 1);
+        } else {
+          return text.substring(1);
+        }
+      } else if (text.codeUnitAt(0) == 0x27) {
+        if (len > 1 && text.codeUnitAt(len - 1) == 0x27) {
+          return text.substring(1, len - 1);
+        } else {
+          return text.substring(1);
+        }
+      }
+    }
+    return text;
+  }
+
+  /**
+   * Answer the offset of the value after the leading quote.
+   *
+   * @return the offset of the value, or `-1` if the value is not specified
+   */
+  int get textOffset {
+    if (_value == null) {
+      return -1;
+    }
+    String text = _value.lexeme;
+    if (StringUtilities.startsWithChar(text, 0x22) ||
+        StringUtilities.startsWithChar(text, 0x27)) {
+      return _value.offset + 1;
+    }
+    return _value.offset;
+  }
+
+  /**
+   * Answer the attribute value token. A properly formed value will start and end with matching
+   * quote characters, but the value returned may not be properly formed.
+   *
+   * @return the value token or `null` if this represents a badly formed attribute
+   */
+  Token get valueToken => _value;
+
+  @override
+  accept(XmlVisitor visitor) => visitor.visitXmlAttributeNode(this);
+
+  @override
+  void visitChildren(XmlVisitor visitor) {
+    // no children to visit
+  }
+}
+
+/**
+ * Instances of the class `XmlExpression` represent an abstract expression embedded into
+ * [XmlNode].
+ */
+abstract class XmlExpression {
+  /**
+   * An empty list of expressions.
+   */
+  static const List<XmlExpression> EMPTY_ARRAY = const <XmlExpression>[];
+
+  /**
+   * Return the offset of the character immediately following the last character of this
+   * expression's source range. This is equivalent to `getOffset() + getLength()`.
+   *
+   * @return the offset of the character just past the expression's source range
+   */
+  int get end;
+
+  /**
+   * Return the number of characters in the expression's source range.
+   */
+  int get length;
+
+  /**
+   * Return the offset of the first character in the expression's source range.
+   */
+  int get offset;
+
+  /**
+   * Check if the given offset belongs to the expression's source range.
+   */
+  bool contains(int offset) => this.offset <= offset && offset < end;
+
+  /**
+   * Return the [Reference] at the given offset.
+   *
+   * @param offset the offset from the beginning of the file
+   * @return the [Reference] at the given offset, maybe `null`
+   */
+  XmlExpression_Reference getReference(int offset);
+}
+
+/**
+ * The reference to the [Element].
+ */
+class XmlExpression_Reference {
+  Element element;
+
+  int offset = 0;
+
+  int length = 0;
+
+  XmlExpression_Reference(this.element, this.offset, this.length);
+}
+
+/**
+ * The abstract class `XmlNode` defines behavior common to all XML/HTML nodes.
+ */
+abstract class XmlNode {
+  /**
+   * The parent of the node, or `null` if the node is the root of an AST structure.
+   */
+  XmlNode _parent;
+
+  /**
+   * The element associated with this node or `null` if the receiver is not resolved.
+   */
+  Element _element;
+
+  /**
+   * Return the first token included in this node's source range.
+   *
+   * @return the first token or `null` if none
+   */
+  Token get beginToken;
+
+  /**
+   * Return the element associated with this node.
+   *
+   * @return the element or `null` if the receiver is not resolved
+   */
+  Element get element => _element;
+
+  /**
+   * Set the element associated with this node.
+   *
+   * @param element the element
+   */
+  void set element(Element element) {
+    this._element = element;
+  }
+
+  /**
+   * Return the offset of the character immediately following the last character of this node's
+   * source range. This is equivalent to `node.getOffset() + node.getLength()`. For an html
+   * unit this will be equal to the length of the unit's source.
+   *
+   * @return the offset of the character just past the node's source range
+   */
+  int get end => offset + length;
+
+  /**
+   * Return the last token included in this node's source range.
+   *
+   * @return the last token or `null` if none
+   */
+  Token get endToken;
+
+  /**
+   * Return the number of characters in the node's source range.
+   *
+   * @return the number of characters in the node's source range
+   */
+  int get length {
+    Token beginToken = this.beginToken;
+    Token endToken = this.endToken;
+    if (beginToken == null || endToken == null) {
+      return -1;
+    }
+    return endToken.offset + endToken.length - beginToken.offset;
+  }
+
+  /**
+   * Return the offset from the beginning of the file to the first character in the node's source
+   * range.
+   *
+   * @return the offset from the beginning of the file to the first character in the node's source
+   *         range
+   */
+  int get offset {
+    Token beginToken = this.beginToken;
+    if (beginToken == null) {
+      return -1;
+    }
+    return this.beginToken.offset;
+  }
+
+  /**
+   * Return this node's parent node, or `null` if this node is the root of an AST structure.
+   *
+   * Note that the relationship between an AST node and its parent node may change over the lifetime
+   * of a node.
+   *
+   * @return the parent of this node, or `null` if none
+   */
+  XmlNode get parent => _parent;
+
+  /**
+   * Set the parent of this node to the given node.
+   *
+   * @param newParent the node that is to be made the parent of this node
+   */
+  void set parent(XmlNode newParent) {
+    XmlNode current = newParent;
+    while (current != null) {
+      if (identical(current, this)) {
+        AnalysisEngine.instance.logger.logError(
+            "Circular structure while setting an XML node's parent",
+            new CaughtException(
+                new ArgumentError(_buildRecursiveStructureMessage(newParent)),
+                null));
+        return;
+      }
+      current = current.parent;
+    }
+    _parent = newParent;
+  }
+
+  /**
+   * Use the given visitor to visit this node.
+   *
+   * @param visitor the visitor that will visit this node
+   * @return the value returned by the visitor as a result of visiting this node
+   */
+  accept(XmlVisitor visitor);
+
+  /**
+   * Make this node the parent of the given child node.
+   *
+   * @param child the node that will become a child of this node
+   * @return the node that was made a child of this node
+   */
+  XmlNode becomeParentOf(XmlNode child) {
+    if (child != null) {
+      XmlNode node = child;
+      node.parent = this;
+    }
+    return child;
+  }
+
+  /**
+   * Make this node the parent of the given child nodes.
+   *
+   * @param children the nodes that will become the children of this node
+   * @param ifEmpty the (empty) nodes to return if "children" is empty
+   * @return the nodes that were made children of this node
+   */
+  List becomeParentOfAll(List children, {List ifEmpty}) {
+    if (children == null || children.isEmpty) {
+      if (ifEmpty != null) {
+        return ifEmpty;
+      }
+    }
+    if (children != null) {
+      children.forEach((XmlNode node) {
+        node.parent = this;
+      });
+    }
+    return children;
+  }
+
+  @override
+  String toString() {
+    PrintStringWriter writer = new PrintStringWriter();
+    accept(new ToSourceVisitor(writer));
+    return writer.toString();
+  }
+
+  /**
+   * Use the given visitor to visit all of the children of this node. The children will be visited
+   * in source order.
+   *
+   * @param visitor the visitor that will be used to visit the children of this node
+   */
+  void visitChildren(XmlVisitor visitor);
+
+  /**
+   * This method exists for debugging purposes only.
+   */
+  void _appendIdentifier(StringBuffer buffer, XmlNode node) {
+    if (node is XmlTagNode) {
+      buffer.write(node.tag);
+    } else if (node is XmlAttributeNode) {
+      buffer.write(node.name);
+    } else {
+      buffer.write("htmlUnit");
+    }
+  }
+
+  /**
+   * This method exists for debugging purposes only.
+   */
+  String _buildRecursiveStructureMessage(XmlNode newParent) {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("Attempt to create recursive structure: ");
+    XmlNode current = newParent;
+    while (current != null) {
+      if (!identical(current, newParent)) {
+        buffer.write(" -> ");
+      }
+      if (identical(current, this)) {
+        buffer.writeCharCode(0x2A);
+        _appendIdentifier(buffer, current);
+        buffer.writeCharCode(0x2A);
+      } else {
+        _appendIdentifier(buffer, current);
+      }
+      current = current.parent;
+    }
+    return buffer.toString();
+  }
+}
+
+/**
+ * Instances of the class `XmlParser` are used to parse tokens into a AST structure comprised
+ * of [XmlNode]s.
+ */
+class XmlParser {
+  /**
+   * The source being parsed.
+   */
+  final Source source;
+
+  /**
+   * The next token to be parsed.
+   */
+  Token _currentToken;
+
+  /**
+   * Construct a parser for the specified source.
+   *
+   * @param source the source being parsed
+   */
+  XmlParser(this.source);
+
+  /**
+   * Answer the current token.
+   *
+   * @return the current token
+   */
+  Token get currentToken => _currentToken;
+
+  /**
+   * Create a node representing an attribute.
+   *
+   * @param name the name of the attribute
+   * @param equals the equals sign, or `null` if there is no value
+   * @param value the value of the attribute
+   * @return the node that was created
+   */
+  XmlAttributeNode createAttributeNode(Token name, Token equals, Token value) =>
+      new XmlAttributeNode(name, equals, value);
+
+  /**
+   * Create a node representing a tag.
+   *
+   * @param nodeStart the token marking the beginning of the tag
+   * @param tag the name of the tag
+   * @param attributes the attributes in the tag
+   * @param attributeEnd the token terminating the region where attributes can be
+   * @param tagNodes the children of the tag
+   * @param contentEnd the token that starts the closing tag
+   * @param closingTag the name of the tag that occurs in the closing tag
+   * @param nodeEnd the last token in the tag
+   * @return the node that was created
+   */
+  XmlTagNode createTagNode(Token nodeStart, Token tag,
+      List<XmlAttributeNode> attributes, Token attributeEnd,
+      List<XmlTagNode> tagNodes, Token contentEnd, Token closingTag,
+      Token nodeEnd) => new XmlTagNode(nodeStart, tag, attributes, attributeEnd,
+      tagNodes, contentEnd, closingTag, nodeEnd);
+
+  /**
+   * Answer `true` if the specified tag is self closing and thus should never have content or
+   * child tag nodes.
+   *
+   * @param tag the tag (not `null`)
+   * @return `true` if self closing
+   */
+  bool isSelfClosing(Token tag) => false;
+
+  /**
+   * Parse the entire token stream and in the process, advance the current token to the end of the
+   * token stream.
+   *
+   * @return the list of tag nodes found (not `null`, contains no `null`)
+   */
+  List<XmlTagNode> parseTopTagNodes(Token firstToken) {
+    _currentToken = firstToken;
+    List<XmlTagNode> tagNodes = new List<XmlTagNode>();
+    TokenType type = _currentToken.type;
+    while (type != TokenType.EOF) {
+      if (type == TokenType.LT) {
+        tagNodes.add(_parseTagNode());
+      } else if (type == TokenType.DECLARATION ||
+          type == TokenType.DIRECTIVE ||
+          type == TokenType.COMMENT) {
+        // ignored tokens
+        _currentToken = _currentToken.next;
+      } else {
+        _reportUnexpectedToken();
+        _currentToken = _currentToken.next;
+      }
+      type = _currentToken.type;
+    }
+    return tagNodes;
+  }
+
+  /**
+   * Insert a synthetic token of the specified type before the current token
+   *
+   * @param type the type of token to be inserted (not `null`)
+   * @return the synthetic token that was inserted (not `null`)
+   */
+  Token _insertSyntheticToken(TokenType type) {
+    Token token = new Token.con2(type, _currentToken.offset, "");
+    _currentToken.previous.setNext(token);
+    token.setNext(_currentToken);
+    return token;
+  }
+
+  /**
+   * Parse the token stream for an attribute. This method advances the current token over the
+   * attribute, but should not be called if the [currentToken] is not [TokenType.TAG].
+   *
+   * @return the attribute (not `null`)
+   */
+  XmlAttributeNode _parseAttribute() {
+    // Assume the current token is a tag
+    Token name = _currentToken;
+    _currentToken = _currentToken.next;
+    // Equals sign
+    Token equals;
+    if (_currentToken.type == TokenType.EQ) {
+      equals = _currentToken;
+      _currentToken = _currentToken.next;
+    } else {
+      _reportUnexpectedToken();
+      equals = _insertSyntheticToken(TokenType.EQ);
+    }
+    // String value
+    Token value;
+    if (_currentToken.type == TokenType.STRING) {
+      value = _currentToken;
+      _currentToken = _currentToken.next;
+    } else {
+      _reportUnexpectedToken();
+      value = _insertSyntheticToken(TokenType.STRING);
+    }
+    return createAttributeNode(name, equals, value);
+  }
+
+  /**
+   * Parse the stream for a sequence of attributes. This method advances the current token to the
+   * next [TokenType.GT], [TokenType.SLASH_GT], or [TokenType.EOF].
+   *
+   * @return a collection of zero or more attributes (not `null`, contains no `null`s)
+   */
+  List<XmlAttributeNode> _parseAttributes() {
+    TokenType type = _currentToken.type;
+    if (type == TokenType.GT ||
+        type == TokenType.SLASH_GT ||
+        type == TokenType.EOF) {
+      return XmlTagNode.NO_ATTRIBUTES;
+    }
+    List<XmlAttributeNode> attributes = new List<XmlAttributeNode>();
+    while (type != TokenType.GT &&
+        type != TokenType.SLASH_GT &&
+        type != TokenType.EOF) {
+      if (type == TokenType.TAG) {
+        attributes.add(_parseAttribute());
+      } else {
+        _reportUnexpectedToken();
+        _currentToken = _currentToken.next;
+      }
+      type = _currentToken.type;
+    }
+    return attributes;
+  }
+
+  /**
+   * Parse the stream for a sequence of tag nodes existing within a parent tag node. This method
+   * advances the current token to the next [TokenType.LT_SLASH] or [TokenType.EOF].
+   *
+   * @return a list of nodes (not `null`, contains no `null`s)
+   */
+  List<XmlTagNode> _parseChildTagNodes() {
+    TokenType type = _currentToken.type;
+    if (type == TokenType.LT_SLASH || type == TokenType.EOF) {
+      return XmlTagNode.NO_TAG_NODES;
+    }
+    List<XmlTagNode> nodes = new List<XmlTagNode>();
+    while (type != TokenType.LT_SLASH && type != TokenType.EOF) {
+      if (type == TokenType.LT) {
+        nodes.add(_parseTagNode());
+      } else if (type == TokenType.COMMENT) {
+        // ignored token
+        _currentToken = _currentToken.next;
+      } else {
+        _reportUnexpectedToken();
+        _currentToken = _currentToken.next;
+      }
+      type = _currentToken.type;
+    }
+    return nodes;
+  }
+
+  /**
+   * Parse the token stream for the next tag node. This method advances current token over the
+   * parsed tag node, but should only be called if the current token is [TokenType.LT]
+   *
+   * @return the tag node or `null` if none found
+   */
+  XmlTagNode _parseTagNode() {
+    // Assume that the current node is a tag node start TokenType.LT
+    Token nodeStart = _currentToken;
+    _currentToken = _currentToken.next;
+    // Get the tag or create a synthetic tag and report an error
+    Token tag;
+    if (_currentToken.type == TokenType.TAG) {
+      tag = _currentToken;
+      _currentToken = _currentToken.next;
+    } else {
+      _reportUnexpectedToken();
+      tag = _insertSyntheticToken(TokenType.TAG);
+    }
+    // Parse the attributes
+    List<XmlAttributeNode> attributes = _parseAttributes();
+    // Token ending attribute list
+    Token attributeEnd;
+    if (_currentToken.type == TokenType.GT ||
+        _currentToken.type == TokenType.SLASH_GT) {
+      attributeEnd = _currentToken;
+      _currentToken = _currentToken.next;
+    } else {
+      _reportUnexpectedToken();
+      attributeEnd = _insertSyntheticToken(TokenType.SLASH_GT);
+    }
+    // If the node has no children, then return the node
+    if (attributeEnd.type == TokenType.SLASH_GT || isSelfClosing(tag)) {
+      return createTagNode(nodeStart, tag, attributes, attributeEnd,
+          XmlTagNode.NO_TAG_NODES, _currentToken, null, attributeEnd);
+    }
+    // Parse the child tag nodes
+    List<XmlTagNode> tagNodes = _parseChildTagNodes();
+    // Token ending child tag nodes
+    Token contentEnd;
+    if (_currentToken.type == TokenType.LT_SLASH) {
+      contentEnd = _currentToken;
+      _currentToken = _currentToken.next;
+    } else {
+      // TODO (danrubel): handle self closing HTML elements by inserting
+      // synthetic tokens but not reporting an error
+      _reportUnexpectedToken();
+      contentEnd = _insertSyntheticToken(TokenType.LT_SLASH);
+    }
+    // Closing tag
+    Token closingTag;
+    if (_currentToken.type == TokenType.TAG) {
+      closingTag = _currentToken;
+      _currentToken = _currentToken.next;
+    } else {
+      _reportUnexpectedToken();
+      closingTag = _insertSyntheticToken(TokenType.TAG);
+    }
+    // Token ending node
+    Token nodeEnd;
+    if (_currentToken.type == TokenType.GT) {
+      nodeEnd = _currentToken;
+      _currentToken = _currentToken.next;
+    } else {
+      _reportUnexpectedToken();
+      nodeEnd = _insertSyntheticToken(TokenType.GT);
+    }
+    return createTagNode(nodeStart, tag, attributes, attributeEnd, tagNodes,
+        contentEnd, closingTag, nodeEnd);
+  }
+
+  /**
+   * Report the current token as unexpected
+   */
+  void _reportUnexpectedToken() {
+    // TODO (danrubel): report unexpected token
+  }
+}
+
+/**
+ * Instances of `XmlTagNode` represent XML or HTML elements such as `` and
+ * `<body foo="bar"> ... </body>`.
+ */
+class XmlTagNode extends XmlNode {
+  /**
+   * Constant representing empty list of attributes.
+   */
+  static List<XmlAttributeNode> NO_ATTRIBUTES =
+      new UnmodifiableListView(new List<XmlAttributeNode>());
+
+  /**
+   * Constant representing empty list of tag nodes.
+   */
+  static List<XmlTagNode> NO_TAG_NODES =
+      new UnmodifiableListView(new List<XmlTagNode>());
+
+  /**
+   * The starting [TokenType.LT] token (not `null`).
+   */
+  final Token nodeStart;
+
+  /**
+   * The [TokenType.TAG] token after the starting '&lt;' (not `null`).
+   */
+  final Token _tag;
+
+  /**
+   * The attributes contained by the receiver (not `null`, contains no `null`s).
+   */
+  List<XmlAttributeNode> _attributes;
+
+  /**
+   * The [TokenType.GT] or [TokenType.SLASH_GT] token after the attributes (not
+   * `null`). The token may be the same token as [nodeEnd] if there are no child
+   * [tagNodes].
+   */
+  final Token attributeEnd;
+
+  /**
+   * The tag nodes contained in the receiver (not `null`, contains no `null`s).
+   */
+  List<XmlTagNode> _tagNodes;
+
+  /**
+   * The token (not `null`) after the content, which may be
+   * * (1) [TokenType.LT_SLASH] for nodes with open and close tags, or
+   * * (2) the [TokenType.LT] nodeStart of the next sibling node if this node is self
+   * closing or the attributeEnd is [TokenType.SLASH_GT], or
+   * * (3) [TokenType.EOF] if the node does not have a closing tag and is the last node in
+   * the stream [TokenType.LT_SLASH] token after the content, or `null` if there is no
+   * content and the attributes ended with [TokenType.SLASH_GT].
+   */
+  final Token contentEnd;
+
+  /**
+   * The closing [TokenType.TAG] after the child elements or `null` if there is no
+   * content and the attributes ended with [TokenType.SLASH_GT]
+   */
+  final Token closingTag;
+
+  /**
+   * The ending [TokenType.GT] or [TokenType.SLASH_GT] token (not `null`).
+   */
+  final Token nodeEnd;
+
+  /**
+   * The expressions that are embedded in the tag's content.
+   */
+  List<XmlExpression> expressions = XmlExpression.EMPTY_ARRAY;
+
+  /**
+   * Construct a new instance representing an XML or HTML element
+   *
+   * @param nodeStart the starting [TokenType.LT] token (not `null`)
+   * @param tag the [TokenType.TAG] token after the starting '&lt;' (not `null`).
+   * @param attributes the attributes associated with this element or [NO_ATTRIBUTES] (not
+   *          `null`, contains no `null`s)
+   * @param attributeEnd The [TokenType.GT] or [TokenType.SLASH_GT] token after the
+   *          attributes (not `null`). The token may be the same token as [nodeEnd] if
+   *          there are no child [tagNodes].
+   * @param tagNodes child tag nodes of the receiver or [NO_TAG_NODES] (not `null`,
+   *          contains no `null`s)
+   * @param contentEnd the token (not `null`) after the content, which may be
+   *          * (1) [TokenType.LT_SLASH] for nodes with open and close tags, or
+   *          * (2) the [TokenType.LT] nodeStart of the next sibling node if this node is
+   *          self closing or the attributeEnd is [TokenType.SLASH_GT], or
+   *          * (3) [TokenType.EOF] if the node does not have a closing tag and is the last
+   *          node in the stream [TokenType.LT_SLASH] token after the content, or `null`
+   *          if there is no content and the attributes ended with [TokenType.SLASH_GT].
+   * @param closingTag the closing [TokenType.TAG] after the child elements or `null` if
+   *          there is no content and the attributes ended with [TokenType.SLASH_GT]
+   * @param nodeEnd the ending [TokenType.GT] or [TokenType.SLASH_GT] token (not
+   *          `null`)
+   */
+  XmlTagNode(this.nodeStart, this._tag, List<XmlAttributeNode> attributes,
+      this.attributeEnd, List<XmlTagNode> tagNodes, this.contentEnd,
+      this.closingTag, this.nodeEnd) {
+    this._attributes = becomeParentOfAll(attributes, ifEmpty: NO_ATTRIBUTES);
+    this._tagNodes = becomeParentOfAll(tagNodes, ifEmpty: NO_TAG_NODES);
+  }
+
+  /**
+   * Answer the receiver's attributes. Callers should not manipulate the returned list to edit the
+   * AST structure.
+   *
+   * @return the attributes (not `null`, contains no `null`s)
+   */
+  List<XmlAttributeNode> get attributes => _attributes;
+
+  @override
+  Token get beginToken => nodeStart;
+
+  /**
+   * Return a string representing the content contained in the receiver. This
+   * includes the textual representation of any child tag nodes ([getTagNodes]).
+   * Whitespace between '&lt;', '&lt;/', and '>', '/>' is discarded, but all
+   * other whitespace is preserved.
+   */
+  String get content {
+    Token token = attributeEnd.next;
+    if (identical(token, contentEnd)) {
+      return "";
+    }
+    // TODO(danrubel) Handle CDATA and replace HTML character encodings with
+    // the actual characters.
+    String content = token.lexeme;
+    token = token.next;
+    if (identical(token, contentEnd)) {
+      return content;
+    }
+    StringBuffer buffer = new StringBuffer();
+    buffer.write(content);
+    while (!identical(token, contentEnd)) {
+      buffer.write(token.lexeme);
+      token = token.next;
+    }
+    return buffer.toString();
+  }
+
+  @override
+  Token get endToken {
+    if (nodeEnd != null) {
+      return nodeEnd;
+    }
+    if (closingTag != null) {
+      return closingTag;
+    }
+    if (contentEnd != null) {
+      return contentEnd;
+    }
+    if (!_tagNodes.isEmpty) {
+      return _tagNodes[_tagNodes.length - 1].endToken;
+    }
+    if (attributeEnd != null) {
+      return attributeEnd;
+    }
+    if (!_attributes.isEmpty) {
+      return _attributes[_attributes.length - 1].endToken;
+    }
+    return _tag;
+  }
+
+  /**
+   * Answer the tag name after the starting '&lt;'.
+   *
+   * @return the tag name (not `null`)
+   */
+  String get tag => _tag.lexeme;
+
+  /**
+   * Answer the tag nodes contained in the receiver. Callers should not manipulate the returned list
+   * to edit the AST structure.
+   *
+   * @return the children (not `null`, contains no `null`s)
+   */
+  List<XmlTagNode> get tagNodes => _tagNodes;
+
+  /**
+   * Answer the [TokenType.TAG] token after the starting '&lt;'.
+   *
+   * @return the token (not `null`)
+   */
+  Token get tagToken => _tag;
+
+  @override
+  accept(XmlVisitor visitor) => visitor.visitXmlTagNode(this);
+
+  /**
+   * Answer the attribute with the specified name.
+   *
+   * @param name the attribute name
+   * @return the attribute or `null` if no matching attribute is found
+   */
+  XmlAttributeNode getAttribute(String name) {
+    for (XmlAttributeNode attribute in _attributes) {
+      if (attribute.name == name) {
+        return attribute;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Find the attribute with the given name (see [getAttribute] and answer the lexeme
+   * for the attribute's value token without the leading and trailing quotes (see
+   * [XmlAttributeNode.getText]).
+   *
+   * @param name the attribute name
+   * @return the attribute text or `null` if no matching attribute is found
+   */
+  String getAttributeText(String name) {
+    XmlAttributeNode attribute = getAttribute(name);
+    return attribute != null ? attribute.text : null;
+  }
+
+  @override
+  void visitChildren(XmlVisitor visitor) {
+    for (XmlAttributeNode node in _attributes) {
+      node.accept(visitor);
+    }
+    for (XmlTagNode node in _tagNodes) {
+      node.accept(visitor);
+    }
+  }
+}
+
+/**
+ * The interface `XmlVisitor` defines the behavior of objects that can be used to visit an
+ * [XmlNode] structure.
+ */
+abstract class XmlVisitor<R> {
+  R visitHtmlScriptTagNode(HtmlScriptTagNode node);
+
+  R visitHtmlUnit(HtmlUnit htmlUnit);
+
+  R visitXmlAttributeNode(XmlAttributeNode xmlAttributeNode);
+
+  R visitXmlTagNode(XmlTagNode xmlTagNode);
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/incremental_logger.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/incremental_logger.dart
new file mode 100644
index 0000000..8abc6fe
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/incremental_logger.dart
@@ -0,0 +1,186 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.incremental_logger;
+
+/**
+ * The shared instance of [Logger] used by several incremental resolution
+ * classes. It is initialized externally by the Analysis Engine client.
+ */
+Logger logger = NULL_LOGGER;
+
+/**
+ * An instance of [Logger] that does not print anything.
+ */
+final Logger NULL_LOGGER = new _NullLogger();
+
+/**
+ * An instance of [Logger] that uses `print` for output.
+ */
+final Logger PRINT_LOGGER = new StringSinkLogger(new _PrintStringSink());
+
+/**
+ * A simple hierarchical logger.
+ */
+abstract class Logger {
+  /**
+   * Mark an enter to a new section with the given [name].
+   */
+  void enter(String name);
+
+  /**
+   * Mark an exit from the current sections, logs the duration.
+   */
+  void exit();
+
+  /**
+   * Logs the given [obj].
+   */
+  void log(Object obj);
+
+  /**
+   * Starts a new timer.
+   */
+  LoggingTimer startTimer();
+}
+
+/**
+ * The handle of a timer.
+ */
+class LoggingTimer {
+  final Logger _logger;
+  final Stopwatch _stopwatch = new Stopwatch();
+
+  LoggingTimer(this._logger) {
+    _stopwatch.start();
+  }
+
+  /**
+   * This methods stop the timer and logs the elapsed time.
+   */
+  void stop(String message) {
+    _stopwatch.stop();
+    _logger.log('$message in ${_stopwatch.elapsedMilliseconds} ms');
+  }
+}
+
+/**
+ * A [Logger] that writes to a [StringSink].
+ */
+class StringSinkLogger implements Logger {
+  static const int _MAX_LINE_LENGTH = 512;
+  final StringSink _sink;
+  final List<_LoggerSection> _sectionStack = <_LoggerSection>[];
+  _LoggerSection _section = new _LoggerSection('', 'ROOT');
+
+  StringSinkLogger(this._sink);
+
+  @override
+  void enter(String name) {
+    log('+++ $name');
+    _sectionStack.add(_section);
+    _section = new _LoggerSection(_section.indent + '\t', name);
+  }
+
+  @override
+  void exit() {
+    DateTime now = new DateTime.now();
+    Duration duration = now.difference(_section.start);
+    String message = '--- ${_section.name} in ${duration.inMilliseconds} ms';
+    _section = _sectionStack.removeLast();
+    log(message);
+  }
+
+  @override
+  void log(Object obj) {
+    DateTime now = new DateTime.now();
+    String indent = _section.indent;
+    String objStr = _getObjectString(obj);
+    String line = '[$now] $indent$objStr';
+    _sink.writeln(line);
+  }
+
+  @override
+  LoggingTimer startTimer() {
+    return new LoggingTimer(this);
+  }
+
+  String _getObjectString(Object obj) {
+    if (obj == null) {
+      return 'null';
+    }
+    if (obj is Function) {
+      obj = obj();
+    }
+    String str = obj.toString();
+    if (str.length < _MAX_LINE_LENGTH) {
+      return str;
+    }
+    return str.split('\n').map((String line) {
+      if (line.length > _MAX_LINE_LENGTH) {
+        line = line.substring(0, _MAX_LINE_LENGTH) + '...';
+      }
+      return line;
+    }).join('\n');
+  }
+}
+
+class _LoggerSection {
+  final DateTime start = new DateTime.now();
+  final String indent;
+  final String name;
+  _LoggerSection(this.indent, this.name);
+}
+
+/**
+ * A [Logger] that does nothing.
+ */
+class _NullLogger implements Logger {
+  @override
+  void enter(String name) {}
+
+  @override
+  void exit() {}
+
+  @override
+  void log(Object obj) {}
+
+  @override
+  LoggingTimer startTimer() {
+    return new LoggingTimer(this);
+  }
+}
+
+/**
+ * A [StringSink] implementation that uses `print`.
+ */
+class _PrintStringSink implements StringSink {
+  String _line = '';
+
+  @override
+  void write(Object obj) {
+    if (obj == null) {
+      _line += 'null';
+    } else {
+      _line += obj.toString();
+    }
+  }
+
+  @override
+  void writeAll(Iterable objects, [String separator = '']) {
+    _line += objects.join(separator);
+  }
+
+  @override
+  void writeCharCode(int charCode) {
+    _line += new String.fromCharCode(charCode);
+  }
+
+  @override
+  void writeln([Object obj = '']) {
+    _line += obj;
+    print(_line);
+    _line = '';
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/incremental_resolution_validator.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/incremental_resolution_validator.dart
new file mode 100644
index 0000000..bab107e
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/incremental_resolution_validator.dart
@@ -0,0 +1,938 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.incremental_resolution_validator;
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+
+/**
+ * Validates that the [actual] and the [expected] units have the same structure
+ * and resolution. Throws [IncrementalResolutionMismatch] otherwise.
+ */
+void assertSameResolution(CompilationUnit actual, CompilationUnit expected,
+    {bool validateTypes: false}) {
+  _SameResolutionValidator validator =
+      new _SameResolutionValidator(validateTypes, expected);
+  actual.accept(validator);
+}
+
+/**
+ * This exception is thrown when a mismatch between actual and expected AST
+ * or resolution is found.
+ */
+class IncrementalResolutionMismatch {
+  final String message;
+  IncrementalResolutionMismatch(this.message);
+}
+
+class _SameResolutionValidator implements AstVisitor {
+  final bool validateTypes;
+  AstNode other;
+
+  _SameResolutionValidator(this.validateTypes, this.other);
+
+  @override
+  visitAdjacentStrings(AdjacentStrings node) {}
+
+  @override
+  visitAnnotation(Annotation node) {
+    Annotation other = this.other;
+    _visitNode(node.name, other.name);
+    _visitNode(node.constructorName, other.constructorName);
+    _visitNode(node.arguments, other.arguments);
+    _verifyElement(node.element, other.element);
+  }
+
+  @override
+  visitArgumentList(ArgumentList node) {
+    ArgumentList other = this.other;
+    _visitList(node.arguments, other.arguments);
+  }
+
+  @override
+  visitAsExpression(AsExpression node) {
+    AsExpression other = this.other;
+    _visitExpression(node, other);
+    _visitNode(node.expression, other.expression);
+    _visitNode(node.type, other.type);
+  }
+
+  @override
+  visitAssertStatement(AssertStatement node) {
+    AssertStatement other = this.other;
+    _visitNode(node.condition, other.condition);
+  }
+
+  @override
+  visitAssignmentExpression(AssignmentExpression node) {
+    AssignmentExpression other = this.other;
+    _visitExpression(node, other);
+    _verifyElement(node.staticElement, other.staticElement);
+    _verifyElement(node.propagatedElement, other.propagatedElement);
+    _visitNode(node.leftHandSide, other.leftHandSide);
+    _visitNode(node.rightHandSide, other.rightHandSide);
+  }
+
+  @override
+  visitAwaitExpression(AwaitExpression node) {
+    AwaitExpression other = this.other;
+    _visitExpression(node, other);
+    _visitNode(node.expression, other.expression);
+  }
+
+  @override
+  visitBinaryExpression(BinaryExpression node) {
+    BinaryExpression other = this.other;
+    _visitExpression(node, other);
+    _verifyElement(node.staticElement, other.staticElement);
+    _verifyElement(node.propagatedElement, other.propagatedElement);
+    _visitNode(node.leftOperand, other.leftOperand);
+    _visitNode(node.rightOperand, other.rightOperand);
+  }
+
+  @override
+  visitBlock(Block node) {
+    Block other = this.other;
+    _visitList(node.statements, other.statements);
+  }
+
+  @override
+  visitBlockFunctionBody(BlockFunctionBody node) {
+    BlockFunctionBody other = this.other;
+    _visitNode(node.block, other.block);
+  }
+
+  @override
+  visitBooleanLiteral(BooleanLiteral node) {
+    BooleanLiteral other = this.other;
+    _visitExpression(node, other);
+  }
+
+  @override
+  visitBreakStatement(BreakStatement node) {
+    BreakStatement other = this.other;
+    _visitNode(node.label, other.label);
+  }
+
+  @override
+  visitCascadeExpression(CascadeExpression node) {
+    CascadeExpression other = this.other;
+    _visitExpression(node, other);
+    _visitNode(node.target, other.target);
+    _visitList(node.cascadeSections, other.cascadeSections);
+  }
+
+  @override
+  visitCatchClause(CatchClause node) {
+    CatchClause other = this.other;
+    _visitNode(node.exceptionType, other.exceptionType);
+    _visitNode(node.exceptionParameter, other.exceptionParameter);
+    _visitNode(node.stackTraceParameter, other.stackTraceParameter);
+    _visitNode(node.body, other.body);
+  }
+
+  @override
+  visitClassDeclaration(ClassDeclaration node) {
+    ClassDeclaration other = this.other;
+    _visitDeclaration(node, other);
+    _visitNode(node.name, other.name);
+    _visitNode(node.typeParameters, other.typeParameters);
+    _visitNode(node.extendsClause, other.extendsClause);
+    _visitNode(node.implementsClause, other.implementsClause);
+    _visitNode(node.withClause, other.withClause);
+    _visitList(node.members, other.members);
+  }
+
+  @override
+  visitClassTypeAlias(ClassTypeAlias node) {
+    ClassTypeAlias other = this.other;
+    _visitDeclaration(node, other);
+    _visitNode(node.name, other.name);
+    _visitNode(node.typeParameters, other.typeParameters);
+    _visitNode(node.superclass, other.superclass);
+    _visitNode(node.withClause, other.withClause);
+  }
+
+  @override
+  visitComment(Comment node) {
+    Comment other = this.other;
+    _visitList(node.references, other.references);
+  }
+
+  @override
+  visitCommentReference(CommentReference node) {
+    CommentReference other = this.other;
+    _visitNode(node.identifier, other.identifier);
+  }
+
+  @override
+  visitCompilationUnit(CompilationUnit node) {
+    CompilationUnit other = this.other;
+    _verifyElement(node.element, other.element);
+    _visitList(node.directives, other.directives);
+    _visitList(node.declarations, other.declarations);
+  }
+
+  @override
+  visitConditionalExpression(ConditionalExpression node) {
+    ConditionalExpression other = this.other;
+    _visitExpression(node, other);
+    _visitNode(node.condition, other.condition);
+    _visitNode(node.thenExpression, other.thenExpression);
+    _visitNode(node.elseExpression, other.elseExpression);
+  }
+
+  @override
+  visitConstructorDeclaration(ConstructorDeclaration node) {
+    ConstructorDeclaration other = this.other;
+    _visitDeclaration(node, other);
+    _visitNode(node.returnType, other.returnType);
+    _visitNode(node.name, other.name);
+    _visitNode(node.parameters, other.parameters);
+    _visitNode(node.redirectedConstructor, other.redirectedConstructor);
+    _visitList(node.initializers, other.initializers);
+  }
+
+  @override
+  visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    ConstructorFieldInitializer other = this.other;
+    _visitNode(node.fieldName, other.fieldName);
+    _visitNode(node.expression, other.expression);
+  }
+
+  @override
+  visitConstructorName(ConstructorName node) {
+    ConstructorName other = this.other;
+    _verifyElement(node.staticElement, other.staticElement);
+    _visitNode(node.type, other.type);
+    _visitNode(node.name, other.name);
+  }
+
+  @override
+  visitContinueStatement(ContinueStatement node) {
+    ContinueStatement other = this.other;
+    _visitNode(node.label, other.label);
+  }
+
+  @override
+  visitDeclaredIdentifier(DeclaredIdentifier node) {
+    DeclaredIdentifier other = this.other;
+    _visitNode(node.type, other.type);
+    _visitNode(node.identifier, other.identifier);
+  }
+
+  @override
+  visitDefaultFormalParameter(DefaultFormalParameter node) {
+    DefaultFormalParameter other = this.other;
+    _visitNode(node.parameter, other.parameter);
+    _visitNode(node.defaultValue, other.defaultValue);
+  }
+
+  @override
+  visitDoStatement(DoStatement node) {
+    DoStatement other = this.other;
+    _visitNode(node.condition, other.condition);
+    _visitNode(node.body, other.body);
+  }
+
+  @override
+  visitDoubleLiteral(DoubleLiteral node) {
+    DoubleLiteral other = this.other;
+    _visitExpression(node, other);
+  }
+
+  @override
+  visitEmptyFunctionBody(EmptyFunctionBody node) {}
+
+  @override
+  visitEmptyStatement(EmptyStatement node) {}
+
+  @override
+  visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    EnumConstantDeclaration other = this.other;
+    _visitDeclaration(node, other);
+    _visitNode(node.name, other.name);
+  }
+
+  @override
+  visitEnumDeclaration(EnumDeclaration node) {
+    EnumDeclaration other = this.other;
+    _visitDeclaration(node, other);
+    _visitNode(node.name, other.name);
+    _visitList(node.constants, other.constants);
+  }
+
+  @override
+  visitExportDirective(ExportDirective node) {
+    ExportDirective other = this.other;
+    _visitDirective(node, other);
+  }
+
+  @override
+  visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    ExpressionFunctionBody other = this.other;
+    _visitNode(node.expression, other.expression);
+  }
+
+  @override
+  visitExpressionStatement(ExpressionStatement node) {
+    ExpressionStatement other = this.other;
+    _visitNode(node.expression, other.expression);
+  }
+
+  @override
+  visitExtendsClause(ExtendsClause node) {
+    ExtendsClause other = this.other;
+    _visitNode(node.superclass, other.superclass);
+  }
+
+  @override
+  visitFieldDeclaration(FieldDeclaration node) {
+    FieldDeclaration other = this.other;
+    _visitDeclaration(node, other);
+    _visitNode(node.fields, other.fields);
+  }
+
+  @override
+  visitFieldFormalParameter(FieldFormalParameter node) {
+    FieldFormalParameter other = this.other;
+    _visitNormalFormalParameter(node, other);
+    _visitNode(node.type, other.type);
+    _visitNode(node.parameters, other.parameters);
+  }
+
+  @override
+  visitForEachStatement(ForEachStatement node) {
+    ForEachStatement other = this.other;
+    _visitNode(node.identifier, other.identifier);
+    _visitNode(node.loopVariable, other.loopVariable);
+    _visitNode(node.iterable, other.iterable);
+  }
+
+  @override
+  visitFormalParameterList(FormalParameterList node) {
+    FormalParameterList other = this.other;
+    _visitList(node.parameters, other.parameters);
+  }
+
+  @override
+  visitForStatement(ForStatement node) {
+    ForStatement other = this.other;
+    _visitNode(node.variables, other.variables);
+    _visitNode(node.initialization, other.initialization);
+    _visitNode(node.condition, other.condition);
+    _visitList(node.updaters, other.updaters);
+    _visitNode(node.body, other.body);
+  }
+
+  @override
+  visitFunctionDeclaration(FunctionDeclaration node) {
+    FunctionDeclaration other = this.other;
+    _visitDeclaration(node, other);
+    _visitNode(node.returnType, other.returnType);
+    _visitNode(node.name, other.name);
+    _visitNode(node.functionExpression, other.functionExpression);
+  }
+
+  @override
+  visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    FunctionDeclarationStatement other = this.other;
+    _visitNode(node.functionDeclaration, other.functionDeclaration);
+  }
+
+  @override
+  visitFunctionExpression(FunctionExpression node) {
+    FunctionExpression other = this.other;
+    _visitExpression(node, other);
+    _verifyElement(node.element, other.element);
+    _visitNode(node.parameters, other.parameters);
+    _visitNode(node.body, other.body);
+  }
+
+  @override
+  visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    FunctionExpressionInvocation other = this.other;
+    _visitExpression(node, other);
+    _verifyElement(node.staticElement, other.staticElement);
+    _verifyElement(node.propagatedElement, other.propagatedElement);
+    _visitNode(node.function, other.function);
+    _visitNode(node.argumentList, other.argumentList);
+  }
+
+  @override
+  visitFunctionTypeAlias(FunctionTypeAlias node) {
+    FunctionTypeAlias other = this.other;
+    _visitDeclaration(node, other);
+    _visitNode(node.returnType, other.returnType);
+    _visitNode(node.name, other.name);
+    _visitNode(node.typeParameters, other.typeParameters);
+    _visitNode(node.parameters, other.parameters);
+  }
+
+  @override
+  visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    FunctionTypedFormalParameter other = this.other;
+    _visitNormalFormalParameter(node, other);
+    _visitNode(node.returnType, other.returnType);
+    _visitNode(node.parameters, other.parameters);
+  }
+
+  @override
+  visitHideCombinator(HideCombinator node) {
+    HideCombinator other = this.other;
+    _visitList(node.hiddenNames, other.hiddenNames);
+  }
+
+  @override
+  visitIfStatement(IfStatement node) {
+    IfStatement other = this.other;
+    _visitNode(node.condition, other.condition);
+    _visitNode(node.thenStatement, other.thenStatement);
+    _visitNode(node.elseStatement, other.elseStatement);
+  }
+
+  @override
+  visitImplementsClause(ImplementsClause node) {
+    ImplementsClause other = this.other;
+    _visitList(node.interfaces, other.interfaces);
+  }
+
+  @override
+  visitImportDirective(ImportDirective node) {
+    ImportDirective other = this.other;
+    _visitDirective(node, other);
+    _visitNode(node.prefix, other.prefix);
+    _verifyElement(node.uriElement, other.uriElement);
+  }
+
+  @override
+  visitIndexExpression(IndexExpression node) {
+    IndexExpression other = this.other;
+    _visitExpression(node, other);
+    _verifyElement(node.staticElement, other.staticElement);
+    _verifyElement(node.propagatedElement, other.propagatedElement);
+    _visitNode(node.target, other.target);
+    _visitNode(node.index, other.index);
+  }
+
+  @override
+  visitInstanceCreationExpression(InstanceCreationExpression node) {
+    InstanceCreationExpression other = this.other;
+    _visitExpression(node, other);
+    _verifyElement(node.staticElement, other.staticElement);
+    _visitNode(node.constructorName, other.constructorName);
+    _visitNode(node.argumentList, other.argumentList);
+  }
+
+  @override
+  visitIntegerLiteral(IntegerLiteral node) {
+    IntegerLiteral other = this.other;
+    _visitExpression(node, other);
+  }
+
+  @override
+  visitInterpolationExpression(InterpolationExpression node) {
+    InterpolationExpression other = this.other;
+    _visitNode(node.expression, other.expression);
+  }
+
+  @override
+  visitInterpolationString(InterpolationString node) {}
+
+  @override
+  visitIsExpression(IsExpression node) {
+    IsExpression other = this.other;
+    _visitExpression(node, other);
+    _visitNode(node.expression, other.expression);
+    _visitNode(node.type, other.type);
+  }
+
+  @override
+  visitLabel(Label node) {
+    Label other = this.other;
+    _visitNode(node.label, other.label);
+  }
+
+  @override
+  visitLabeledStatement(LabeledStatement node) {
+    LabeledStatement other = this.other;
+    _visitList(node.labels, other.labels);
+    _visitNode(node.statement, other.statement);
+  }
+
+  @override
+  visitLibraryDirective(LibraryDirective node) {
+    LibraryDirective other = this.other;
+    _visitDirective(node, other);
+    _visitNode(node.name, other.name);
+  }
+
+  @override
+  visitLibraryIdentifier(LibraryIdentifier node) {
+    LibraryIdentifier other = this.other;
+    _visitList(node.components, other.components);
+  }
+
+  @override
+  visitListLiteral(ListLiteral node) {
+    ListLiteral other = this.other;
+    _visitExpression(node, other);
+    _visitList(node.elements, other.elements);
+  }
+
+  @override
+  visitMapLiteral(MapLiteral node) {
+    MapLiteral other = this.other;
+    _visitExpression(node, other);
+    _visitList(node.entries, other.entries);
+  }
+
+  @override
+  visitMapLiteralEntry(MapLiteralEntry node) {
+    MapLiteralEntry other = this.other;
+    _visitNode(node.key, other.key);
+    _visitNode(node.value, other.value);
+  }
+
+  @override
+  visitMethodDeclaration(MethodDeclaration node) {
+    MethodDeclaration other = this.other;
+    _visitDeclaration(node, other);
+    _visitNode(node.name, other.name);
+    _visitNode(node.parameters, other.parameters);
+    _visitNode(node.body, other.body);
+  }
+
+  @override
+  visitMethodInvocation(MethodInvocation node) {
+    MethodInvocation other = this.other;
+    _visitNode(node.target, other.target);
+    _visitNode(node.methodName, other.methodName);
+    _visitNode(node.argumentList, other.argumentList);
+  }
+
+  @override
+  visitNamedExpression(NamedExpression node) {
+    NamedExpression other = this.other;
+    _visitNode(node.name, other.name);
+    _visitNode(node.expression, other.expression);
+  }
+
+  @override
+  visitNativeClause(NativeClause node) {}
+
+  @override
+  visitNativeFunctionBody(NativeFunctionBody node) {}
+
+  @override
+  visitNullLiteral(NullLiteral node) {
+    NullLiteral other = this.other;
+    _visitExpression(node, other);
+  }
+
+  @override
+  visitParenthesizedExpression(ParenthesizedExpression node) {
+    ParenthesizedExpression other = this.other;
+    _visitNode(node.expression, other.expression);
+  }
+
+  @override
+  visitPartDirective(PartDirective node) {
+    PartDirective other = this.other;
+    _visitDirective(node, other);
+  }
+
+  @override
+  visitPartOfDirective(PartOfDirective node) {
+    PartOfDirective other = this.other;
+    _visitDirective(node, other);
+    _visitNode(node.libraryName, other.libraryName);
+  }
+
+  @override
+  visitPostfixExpression(PostfixExpression node) {
+    PostfixExpression other = this.other;
+    _visitExpression(node, other);
+    _verifyElement(node.staticElement, other.staticElement);
+    _verifyElement(node.propagatedElement, other.propagatedElement);
+    _visitNode(node.operand, other.operand);
+  }
+
+  @override
+  visitPrefixedIdentifier(PrefixedIdentifier node) {
+    PrefixedIdentifier other = this.other;
+    _visitExpression(node, other);
+    _visitNode(node.prefix, other.prefix);
+    _visitNode(node.identifier, other.identifier);
+  }
+
+  @override
+  visitPrefixExpression(PrefixExpression node) {
+    PrefixExpression other = this.other;
+    _visitExpression(node, other);
+    _verifyElement(node.staticElement, other.staticElement);
+    _verifyElement(node.propagatedElement, other.propagatedElement);
+    _visitNode(node.operand, other.operand);
+  }
+
+  @override
+  visitPropertyAccess(PropertyAccess node) {
+    PropertyAccess other = this.other;
+    _visitExpression(node, other);
+    _visitNode(node.target, other.target);
+    _visitNode(node.propertyName, other.propertyName);
+  }
+
+  @override
+  visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    RedirectingConstructorInvocation other = this.other;
+    _verifyElement(node.staticElement, other.staticElement);
+    _visitNode(node.constructorName, other.constructorName);
+    _visitNode(node.argumentList, other.argumentList);
+  }
+
+  @override
+  visitRethrowExpression(RethrowExpression node) {
+    RethrowExpression other = this.other;
+    _visitExpression(node, other);
+  }
+
+  @override
+  visitReturnStatement(ReturnStatement node) {
+    ReturnStatement other = this.other;
+    _visitNode(node.expression, other.expression);
+  }
+
+  @override
+  visitScriptTag(ScriptTag node) {}
+
+  @override
+  visitShowCombinator(ShowCombinator node) {
+    ShowCombinator other = this.other;
+    _visitList(node.shownNames, other.shownNames);
+  }
+
+  @override
+  visitSimpleFormalParameter(SimpleFormalParameter node) {
+    SimpleFormalParameter other = this.other;
+    _visitNormalFormalParameter(node, other);
+    _visitNode(node.type, other.type);
+  }
+
+  @override
+  visitSimpleIdentifier(SimpleIdentifier node) {
+    SimpleIdentifier other = this.other;
+    _verifyElement(node.staticElement, other.staticElement);
+    _verifyElement(node.propagatedElement, other.propagatedElement);
+    _visitExpression(node, other);
+  }
+
+  @override
+  visitSimpleStringLiteral(SimpleStringLiteral node) {}
+
+  @override
+  visitStringInterpolation(StringInterpolation node) {
+    StringInterpolation other = this.other;
+    _visitList(node.elements, other.elements);
+  }
+
+  @override
+  visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    SuperConstructorInvocation other = this.other;
+    _verifyElement(node.staticElement, other.staticElement);
+    _visitNode(node.constructorName, other.constructorName);
+    _visitNode(node.argumentList, other.argumentList);
+  }
+
+  @override
+  visitSuperExpression(SuperExpression node) {
+    SuperExpression other = this.other;
+    _visitExpression(node, other);
+  }
+
+  @override
+  visitSwitchCase(SwitchCase node) {
+    SwitchCase other = this.other;
+    _visitList(node.labels, other.labels);
+    _visitNode(node.expression, other.expression);
+    _visitList(node.statements, other.statements);
+  }
+
+  @override
+  visitSwitchDefault(SwitchDefault node) {
+    SwitchDefault other = this.other;
+    _visitList(node.statements, other.statements);
+  }
+
+  @override
+  visitSwitchStatement(SwitchStatement node) {
+    SwitchStatement other = this.other;
+    _visitNode(node.expression, other.expression);
+    _visitList(node.members, other.members);
+  }
+
+  @override
+  visitSymbolLiteral(SymbolLiteral node) {}
+
+  @override
+  visitThisExpression(ThisExpression node) {
+    ThisExpression other = this.other;
+    _visitExpression(node, other);
+  }
+
+  @override
+  visitThrowExpression(ThrowExpression node) {
+    ThrowExpression other = this.other;
+    _visitNode(node.expression, other.expression);
+  }
+
+  @override
+  visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    TopLevelVariableDeclaration other = this.other;
+    _visitNode(node.variables, other.variables);
+  }
+
+  @override
+  visitTryStatement(TryStatement node) {
+    TryStatement other = this.other;
+    _visitNode(node.body, other.body);
+    _visitList(node.catchClauses, other.catchClauses);
+    _visitNode(node.finallyBlock, other.finallyBlock);
+  }
+
+  @override
+  visitTypeArgumentList(TypeArgumentList node) {
+    TypeArgumentList other = this.other;
+    _visitList(node.arguments, other.arguments);
+  }
+
+  @override
+  visitTypeName(TypeName node) {
+    TypeName other = this.other;
+    _verifyType(node.type, other.type);
+    _visitNode(node.name, node.name);
+    _visitNode(node.typeArguments, other.typeArguments);
+  }
+
+  @override
+  visitTypeParameter(TypeParameter node) {
+    TypeParameter other = this.other;
+    _visitNode(node.name, other.name);
+    _visitNode(node.bound, other.bound);
+  }
+
+  @override
+  visitTypeParameterList(TypeParameterList node) {
+    TypeParameterList other = this.other;
+    _visitList(node.typeParameters, other.typeParameters);
+  }
+
+  @override
+  visitVariableDeclaration(VariableDeclaration node) {
+    VariableDeclaration other = this.other;
+    _visitDeclaration(node, other);
+    _visitNode(node.name, other.name);
+    _visitNode(node.initializer, other.initializer);
+  }
+
+  @override
+  visitVariableDeclarationList(VariableDeclarationList node) {
+    VariableDeclarationList other = this.other;
+    _visitNode(node.type, other.type);
+    _visitList(node.variables, other.variables);
+  }
+
+  @override
+  visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    VariableDeclarationStatement other = this.other;
+    _visitNode(node.variables, other.variables);
+  }
+
+  @override
+  visitWhileStatement(WhileStatement node) {
+    WhileStatement other = this.other;
+    _visitNode(node.condition, other.condition);
+    _visitNode(node.body, other.body);
+  }
+
+  @override
+  visitWithClause(WithClause node) {
+    WithClause other = this.other;
+    _visitList(node.mixinTypes, other.mixinTypes);
+  }
+
+  @override
+  visitYieldStatement(YieldStatement node) {
+    YieldStatement other = this.other;
+    _visitNode(node.expression, other.expression);
+  }
+
+  void _assertNode(AstNode a, AstNode b) {
+    _expectEquals(a.offset, b.offset);
+    _expectEquals(a.length, b.length);
+  }
+
+  void _expectEquals(actual, expected) {
+    if (actual != expected) {
+      String message = '';
+      message += 'Expected: $expected\n';
+      message += '  Actual: $actual\n';
+      _fail(message);
+    }
+  }
+
+  void _expectIsNull(obj) {
+    if (obj != null) {
+      String message = '';
+      message += 'Expected: null\n';
+      message += '  Actual: $obj\n';
+      _fail(message);
+    }
+  }
+
+  void _expectLength(List actualList, int expected) {
+    String message = '';
+    message += 'Expected length: $expected\n';
+    if (actualList == null) {
+      message += 'but null found.';
+      _fail(message);
+    }
+    int actual = actualList.length;
+    if (actual != expected) {
+      message += 'but $actual found\n';
+      message += 'in $actualList';
+      _fail(message);
+    }
+  }
+
+  void _fail(String message) {
+    throw new IncrementalResolutionMismatch(message);
+  }
+
+  void _verifyElement(Element a, Element b) {
+    if (a is Member && b is Member) {
+      a = (a as Member).baseElement;
+      b = (b as Member).baseElement;
+    }
+    String locationA = _getElementLocationWithoutUri(a);
+    String locationB = _getElementLocationWithoutUri(b);
+    if (locationA != locationB) {
+      int offset = other.offset;
+      _fail('[$offset]\nExpected: $b ($locationB)\n  Actual: $a ($locationA)');
+    }
+    if (a == null && b == null) {
+      return;
+    }
+    if (a.nameOffset != b.nameOffset) {
+      _fail('Expected: ${b.nameOffset}\n  Actual: ${a.nameOffset}');
+    }
+  }
+
+  void _verifyType(DartType a, DartType b) {
+    if (!validateTypes) {
+      return;
+    }
+    if (a != b) {
+      int offset = other.offset;
+      _fail('[$offset]\nExpected: $b\n  Actual: $a');
+    }
+  }
+
+  void _visitAnnotatedNode(AnnotatedNode node, AnnotatedNode other) {
+    _visitNode(node.documentationComment, other.documentationComment);
+    _visitList(node.metadata, other.metadata);
+  }
+
+  _visitDeclaration(Declaration node, Declaration other) {
+    _verifyElement(node.element, other.element);
+    _visitAnnotatedNode(node, other);
+  }
+
+  _visitDirective(Directive node, Directive other) {
+    _verifyElement(node.element, other.element);
+    _visitAnnotatedNode(node, other);
+  }
+
+  void _visitExpression(Expression a, Expression b) {
+//    print('[${a.offset}] |$a| vs. [${b.offset}] |$b|');
+    _verifyType(a.staticType, b.staticType);
+    _verifyType(a.propagatedType, b.propagatedType);
+    _verifyElement(a.staticParameterElement, b.staticParameterElement);
+    _verifyElement(a.propagatedParameterElement, b.propagatedParameterElement);
+    _assertNode(a, b);
+  }
+
+  void _visitList(NodeList nodeList, NodeList otherList) {
+    int length = nodeList.length;
+    _expectLength(otherList, length);
+    for (int i = 0; i < length; i++) {
+      _visitNode(nodeList[i], otherList[i]);
+    }
+  }
+
+  void _visitNode(AstNode node, AstNode other) {
+    if (node == null) {
+      _expectIsNull(other);
+    } else {
+      this.other = other;
+      _assertNode(node, other);
+      node.accept(this);
+    }
+  }
+
+  void _visitNormalFormalParameter(
+      NormalFormalParameter node, NormalFormalParameter other) {
+    _verifyElement(node.element, other.element);
+    _visitNode(node.documentationComment, other.documentationComment);
+    _visitList(node.metadata, other.metadata);
+    _visitNode(node.identifier, other.identifier);
+  }
+
+  /**
+   * Returns an URI scheme independent version of the [element] location.
+   */
+  static String _getElementLocationWithoutUri(Element element) {
+    if (element == null) {
+      return '<null>';
+    }
+    if (element is UriReferencedElementImpl) {
+      return '<ignored>';
+    }
+    ElementLocation location = element.location;
+    List<String> components = location.components;
+    String uriPrefix = '';
+    Element unit = element is CompilationUnitElement
+        ? element
+        : element.getAncestor((e) => e is CompilationUnitElement);
+    if (unit != null) {
+      String libComponent = components[0];
+      String unitComponent = components[1];
+      components = components.sublist(2);
+      uriPrefix = _getShortElementLocationUri(libComponent) +
+          ':' +
+          _getShortElementLocationUri(unitComponent);
+    } else {
+      String libComponent = components[0];
+      components = components.sublist(1);
+      uriPrefix = _getShortElementLocationUri(libComponent);
+    }
+    return uriPrefix + ':' + components.join(':');
+  }
+
+  /**
+   * Returns a "short" version of the given [uri].
+   *
+   * For example:
+   *     /User/me/project/lib/my_lib.dart -> my_lib.dart
+   *     package:project/my_lib.dart      -> my_lib.dart
+   */
+  static String _getShortElementLocationUri(String uri) {
+    int index = uri.lastIndexOf('/');
+    if (index == -1) {
+      return uri;
+    }
+    return uri.substring(index + 1);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/incremental_resolver.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/incremental_resolver.dart
new file mode 100644
index 0000000..ea1e0fa
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/incremental_resolver.dart
@@ -0,0 +1,2024 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.incremental_resolver;
+
+import 'dart:collection';
+import 'dart:math' as math;
+
+import 'package:analyzer/src/context/cache.dart'
+    show CacheEntry, TargetedResult;
+import 'package:analyzer/src/generated/constant.dart';
+import 'package:analyzer/src/task/dart.dart'
+    show
+        HINTS,
+        PARSE_ERRORS,
+        RESOLVE_REFERENCES_ERRORS,
+        RESOLVE_TYPE_NAMES_ERRORS,
+        SCAN_ERRORS,
+        USED_IMPORTED_ELEMENTS,
+        USED_LOCAL_ELEMENTS,
+        VARIABLE_REFERENCE_ERRORS,
+        VERIFY_ERRORS;
+import 'package:analyzer/task/dart.dart'
+    show DART_ERRORS, LibrarySpecificUnit, PARSED_UNIT, TOKEN_STREAM;
+import 'package:analyzer/task/general.dart' show CONTENT, LINE_INFO;
+import 'package:analyzer/task/model.dart' show ResultDescriptor, TargetedResult;
+
+import 'ast.dart';
+import 'element.dart';
+import 'engine.dart';
+import 'error.dart';
+import 'error_verifier.dart';
+import 'incremental_logger.dart' show logger, LoggingTimer;
+import 'java_engine.dart';
+import 'parser.dart';
+import 'resolver.dart';
+import 'scanner.dart';
+import 'source.dart';
+import 'utilities_dart.dart';
+
+/**
+ * If `true`, an attempt to resolve API-changing modifications is made.
+ */
+bool _resolveApiChanges = false;
+
+/**
+ * This method is used to enable/disable API-changing modifications resolution.
+ */
+void set test_resolveApiChanges(bool value) {
+  _resolveApiChanges = value;
+}
+
+/**
+ * Instances of the class [DeclarationMatcher] determine whether the element
+ * model defined by a given AST structure matches an existing element model.
+ */
+class DeclarationMatcher extends RecursiveAstVisitor {
+  /**
+   * The libary containing the AST nodes being visited.
+   */
+  LibraryElement _enclosingLibrary;
+
+  /**
+   * The compilation unit containing the AST nodes being visited.
+   */
+  CompilationUnitElement _enclosingUnit;
+
+  /**
+   * The function type alias containing the AST nodes being visited, or `null` if we are not
+   * in the scope of a function type alias.
+   */
+  FunctionTypeAliasElement _enclosingAlias;
+
+  /**
+   * The class containing the AST nodes being visited, or `null` if we are not
+   * in the scope of a class.
+   */
+  ClassElementImpl _enclosingClass;
+
+  /**
+   * The parameter containing the AST nodes being visited, or `null` if we are not in the
+   * scope of a parameter.
+   */
+  ParameterElement _enclosingParameter;
+
+  FieldDeclaration _enclosingFieldNode = null;
+  bool _inTopLevelVariableDeclaration = false;
+
+  /**
+   * Is `true` if the current class declaration has a constructor.
+   */
+  bool _hasConstructor = false;
+
+  /**
+   * A set containing all of the elements in the element model that were defined by the old AST node
+   * corresponding to the AST node being visited.
+   */
+  HashSet<Element> _allElements = new HashSet<Element>();
+
+  /**
+   * A set containing all of the elements were defined in the old element model,
+   * but are not defined in the new element model.
+   */
+  HashSet<Element> _removedElements = new HashSet<Element>();
+
+  /**
+   * A set containing all of the elements are defined in the new element model,
+   * but were not defined in the old element model.
+   */
+  HashSet<Element> _addedElements = new HashSet<Element>();
+
+  /**
+   * Determines how elements model corresponding to the given [node] differs
+   * from the [element].
+   */
+  DeclarationMatchKind matches(AstNode node, Element element) {
+    logger.enter('match $element @ ${element.nameOffset}');
+    try {
+      _captureEnclosingElements(element);
+      _gatherElements(element);
+      node.accept(this);
+    } on _DeclarationMismatchException {
+      return DeclarationMatchKind.MISMATCH;
+    } finally {
+      logger.exit();
+    }
+    // no API changes
+    if (_removedElements.isEmpty && _addedElements.isEmpty) {
+      return DeclarationMatchKind.MATCH;
+    }
+    // simple API change
+    logger.log('_removedElements: $_removedElements');
+    logger.log('_addedElements: $_addedElements');
+    _removedElements.forEach(_removeElement);
+    if (_removedElements.length <= 1 && _addedElements.length == 1) {
+      return DeclarationMatchKind.MISMATCH_OK;
+    }
+    // something more complex
+    return DeclarationMatchKind.MISMATCH;
+  }
+
+  @override
+  visitBlockFunctionBody(BlockFunctionBody node) {
+    // ignore bodies
+  }
+
+  @override
+  visitClassDeclaration(ClassDeclaration node) {
+    String name = node.name.name;
+    ClassElement element = _findElement(_enclosingUnit.types, name);
+    _enclosingClass = element;
+    _processElement(element);
+    _assertSameAnnotations(node, element);
+    _assertSameTypeParameters(node.typeParameters, element.typeParameters);
+    // check for missing clauses
+    if (node.extendsClause == null) {
+      _assertTrue(element.supertype.name == 'Object');
+    }
+    if (node.implementsClause == null) {
+      _assertTrue(element.interfaces.isEmpty);
+    }
+    if (node.withClause == null) {
+      _assertTrue(element.mixins.isEmpty);
+    }
+    // process clauses and members
+    _hasConstructor = false;
+    super.visitClassDeclaration(node);
+    // process default constructor
+    if (!_hasConstructor) {
+      ConstructorElement constructor = element.unnamedConstructor;
+      _processElement(constructor);
+      if (!constructor.isSynthetic) {
+        _assertEquals(constructor.parameters.length, 0);
+      }
+    }
+  }
+
+  @override
+  visitClassTypeAlias(ClassTypeAlias node) {
+    String name = node.name.name;
+    ClassElement element = _findElement(_enclosingUnit.types, name);
+    _enclosingClass = element;
+    _processElement(element);
+    _assertSameTypeParameters(node.typeParameters, element.typeParameters);
+    super.visitClassTypeAlias(node);
+  }
+
+  @override
+  visitCompilationUnit(CompilationUnit node) {
+    _processElement(_enclosingUnit);
+    super.visitCompilationUnit(node);
+  }
+
+  @override
+  visitConstructorDeclaration(ConstructorDeclaration node) {
+    _hasConstructor = true;
+    SimpleIdentifier constructorName = node.name;
+    ConstructorElementImpl element = constructorName == null
+        ? _enclosingClass.unnamedConstructor
+        : _enclosingClass.getNamedConstructor(constructorName.name);
+    _processElement(element);
+    _assertEquals(node.constKeyword != null, element.isConst);
+    _assertEquals(node.factoryKeyword != null, element.isFactory);
+    _assertCompatibleParameters(node.parameters, element.parameters);
+    // matches, update the existing element
+    ExecutableElement newElement = node.element;
+    node.element = element;
+    _setLocalElements(element, newElement);
+  }
+
+  @override
+  visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    String name = node.name.name;
+    FieldElement element = _findElement(_enclosingClass.fields, name);
+    _processElement(element);
+  }
+
+  @override
+  visitEnumDeclaration(EnumDeclaration node) {
+    String name = node.name.name;
+    ClassElement element = _findElement(_enclosingUnit.enums, name);
+    _enclosingClass = element;
+    _processElement(element);
+    _assertTrue(element.isEnum);
+    super.visitEnumDeclaration(node);
+  }
+
+  @override
+  visitExportDirective(ExportDirective node) {
+    String uri = _getStringValue(node.uri);
+    if (uri != null) {
+      ExportElement element =
+          _findUriReferencedElement(_enclosingLibrary.exports, uri);
+      _processElement(element);
+      _assertCombinators(node.combinators, element.combinators);
+    }
+  }
+
+  @override
+  visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    // ignore bodies
+  }
+
+  @override
+  visitExtendsClause(ExtendsClause node) {
+    _assertSameType(node.superclass, _enclosingClass.supertype);
+  }
+
+  @override
+  visitFieldDeclaration(FieldDeclaration node) {
+    _enclosingFieldNode = node;
+    try {
+      super.visitFieldDeclaration(node);
+    } finally {
+      _enclosingFieldNode = null;
+    }
+  }
+
+  @override
+  visitFunctionDeclaration(FunctionDeclaration node) {
+    // prepare element name
+    String name = node.name.name;
+    if (node.isSetter) {
+      name += '=';
+    }
+    // prepare element
+    Token property = node.propertyKeyword;
+    ExecutableElementImpl element;
+    if (property == null) {
+      element = _findElement(_enclosingUnit.functions, name);
+    } else {
+      element = _findElement(_enclosingUnit.accessors, name);
+    }
+    // process element
+    _processElement(element);
+    _assertSameAnnotations(node, element);
+    _assertFalse(element.isSynthetic);
+    _assertSameType(node.returnType, element.returnType);
+    _assertCompatibleParameters(
+        node.functionExpression.parameters, element.parameters);
+    _assertBody(node.functionExpression.body, element);
+    // matches, update the existing element
+    ExecutableElement newElement = node.element;
+    node.name.staticElement = element;
+    node.functionExpression.element = element;
+    _setLocalElements(element, newElement);
+  }
+
+  @override
+  visitFunctionTypeAlias(FunctionTypeAlias node) {
+    String name = node.name.name;
+    FunctionTypeAliasElement element =
+        _findElement(_enclosingUnit.functionTypeAliases, name);
+    _processElement(element);
+    _assertSameTypeParameters(node.typeParameters, element.typeParameters);
+    _assertSameType(node.returnType, element.returnType);
+    _assertCompatibleParameters(node.parameters, element.parameters);
+  }
+
+  @override
+  visitImplementsClause(ImplementsClause node) {
+    List<TypeName> nodes = node.interfaces;
+    List<InterfaceType> types = _enclosingClass.interfaces;
+    _assertSameTypes(nodes, types);
+  }
+
+  @override
+  visitImportDirective(ImportDirective node) {
+    String uri = _getStringValue(node.uri);
+    if (uri != null) {
+      ImportElement element =
+          _findUriReferencedElement(_enclosingLibrary.imports, uri);
+      _processElement(element);
+      // match the prefix
+      SimpleIdentifier prefixNode = node.prefix;
+      PrefixElement prefixElement = element.prefix;
+      if (prefixNode == null) {
+        _assertNull(prefixElement);
+      } else {
+        _assertNotNull(prefixElement);
+        _assertEquals(prefixNode.name, prefixElement.name);
+      }
+      // match combinators
+      _assertCombinators(node.combinators, element.combinators);
+    }
+  }
+
+  @override
+  visitMethodDeclaration(MethodDeclaration node) {
+    // prepare element name
+    String name = node.name.name;
+    if (name == TokenType.MINUS.lexeme &&
+        node.parameters.parameters.length == 0) {
+      name = "unary-";
+    }
+    if (node.isSetter) {
+      name += '=';
+    }
+    // prepare element
+    Token property = node.propertyKeyword;
+    ExecutableElementImpl element;
+    if (property == null) {
+      element = _findElement(_enclosingClass.methods, name);
+    } else {
+      element = _findElement(_enclosingClass.accessors, name);
+    }
+    // process element
+    ExecutableElement newElement = node.element;
+    try {
+      _assertNotNull(element);
+      _assertSameAnnotations(node, element);
+      _assertEquals(node.isStatic, element.isStatic);
+      _assertSameType(node.returnType, element.returnType);
+      _assertCompatibleParameters(node.parameters, element.parameters);
+      _assertBody(node.body, element);
+      _removedElements.remove(element);
+      // matches, update the existing element
+      node.name.staticElement = element;
+      _setLocalElements(element, newElement);
+    } on _DeclarationMismatchException {
+      _removeElement(element);
+      // add new element
+      if (newElement != null) {
+        _addedElements.add(newElement);
+        if (newElement is MethodElement) {
+          List<MethodElement> methods = _enclosingClass.methods;
+          methods.add(newElement);
+          _enclosingClass.methods = methods;
+        } else {
+          List<PropertyAccessorElement> accessors = _enclosingClass.accessors;
+          accessors.add(newElement);
+          _enclosingClass.accessors = accessors;
+        }
+      }
+    }
+  }
+
+  @override
+  visitPartDirective(PartDirective node) {
+    String uri = _getStringValue(node.uri);
+    if (uri != null) {
+      CompilationUnitElement element =
+          _findUriReferencedElement(_enclosingLibrary.parts, uri);
+      _processElement(element);
+    }
+    super.visitPartDirective(node);
+  }
+
+  @override
+  visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    _inTopLevelVariableDeclaration = true;
+    try {
+      super.visitTopLevelVariableDeclaration(node);
+    } finally {
+      _inTopLevelVariableDeclaration = false;
+    }
+  }
+
+  @override
+  visitVariableDeclaration(VariableDeclaration node) {
+    // prepare variable
+    String name = node.name.name;
+    PropertyInducingElement element;
+    if (_inTopLevelVariableDeclaration) {
+      element = _findElement(_enclosingUnit.topLevelVariables, name);
+    } else {
+      element = _findElement(_enclosingClass.fields, name);
+    }
+    // verify
+    PropertyInducingElement newElement = node.name.staticElement;
+    _processElement(element);
+    _assertSameAnnotations(node, element);
+    _assertEquals(node.isConst, element.isConst);
+    _assertEquals(node.isFinal, element.isFinal);
+    if (_enclosingFieldNode != null) {
+      _assertEquals(_enclosingFieldNode.isStatic, element.isStatic);
+    }
+    _assertSameType(
+        (node.parent as VariableDeclarationList).type, element.type);
+    // matches, restore the existing element
+    node.name.staticElement = element;
+    if (element is VariableElementImpl) {
+      (element as VariableElementImpl).initializer = newElement.initializer;
+    }
+  }
+
+  @override
+  visitWithClause(WithClause node) {
+    List<TypeName> nodes = node.mixinTypes;
+    List<InterfaceType> types = _enclosingClass.mixins;
+    _assertSameTypes(nodes, types);
+  }
+
+  /**
+   * Assert that the given [body] is compatible with the given [element].
+   * It should not be empty if the [element] is not an abstract class member.
+   * If it is present, it should have the same async / generator modifiers.
+   */
+  void _assertBody(FunctionBody body, ExecutableElementImpl element) {
+    if (body is EmptyFunctionBody) {
+      _assertTrue(element.isAbstract);
+    } else {
+      _assertFalse(element.isAbstract);
+      _assertEquals(body.isSynchronous, element.isSynchronous);
+      _assertEquals(body.isGenerator, element.isGenerator);
+    }
+  }
+
+  void _assertCombinators(List<Combinator> nodeCombinators,
+      List<NamespaceCombinator> elementCombinators) {
+    // prepare shown/hidden names in the element
+    Set<String> showNames = new Set<String>();
+    Set<String> hideNames = new Set<String>();
+    for (NamespaceCombinator combinator in elementCombinators) {
+      if (combinator is ShowElementCombinator) {
+        showNames.addAll(combinator.shownNames);
+      } else if (combinator is HideElementCombinator) {
+        hideNames.addAll(combinator.hiddenNames);
+      }
+    }
+    // match combinators with the node
+    for (Combinator combinator in nodeCombinators) {
+      if (combinator is ShowCombinator) {
+        for (SimpleIdentifier nameNode in combinator.shownNames) {
+          String name = nameNode.name;
+          _assertTrue(showNames.remove(name));
+        }
+      } else if (combinator is HideCombinator) {
+        for (SimpleIdentifier nameNode in combinator.hiddenNames) {
+          String name = nameNode.name;
+          _assertTrue(hideNames.remove(name));
+        }
+      }
+    }
+    _assertTrue(showNames.isEmpty);
+    _assertTrue(hideNames.isEmpty);
+  }
+
+  void _assertCompatibleParameter(
+      FormalParameter node, ParameterElement element) {
+    _assertEquals(node.kind, element.parameterKind);
+    if (node.kind == ParameterKind.NAMED) {
+      _assertEquals(node.identifier.name, element.name);
+    }
+    // check parameter type specific properties
+    if (node is DefaultFormalParameter) {
+      Expression nodeDefault = node.defaultValue;
+      if (nodeDefault == null) {
+        _assertNull(element.defaultValueCode);
+      } else {
+        _assertEquals(nodeDefault.toSource(), element.defaultValueCode);
+      }
+      _assertCompatibleParameter(node.parameter, element);
+    } else if (node is FieldFormalParameter) {
+      _assertTrue(element.isInitializingFormal);
+      _assertCompatibleParameters(node.parameters, element.parameters);
+    } else if (node is FunctionTypedFormalParameter) {
+      _assertFalse(element.isInitializingFormal);
+      _assertTrue(element.type is FunctionType);
+      FunctionType elementType = element.type;
+      _assertCompatibleParameters(node.parameters, element.parameters);
+      _assertSameType(node.returnType, elementType.returnType);
+    } else if (node is SimpleFormalParameter) {
+      _assertFalse(element.isInitializingFormal);
+      _assertSameType(node.type, element.type);
+    }
+  }
+
+  void _assertCompatibleParameters(
+      FormalParameterList nodes, List<ParameterElement> elements) {
+    if (nodes == null) {
+      return _assertEquals(elements.length, 0);
+    }
+    List<FormalParameter> parameters = nodes.parameters;
+    int length = parameters.length;
+    _assertEquals(length, elements.length);
+    for (int i = 0; i < length; i++) {
+      _assertCompatibleParameter(parameters[i], elements[i]);
+    }
+  }
+
+  /**
+   * Asserts that there is an import with the same prefix as the given
+   * [prefixNode], which exposes the given [element].
+   */
+  void _assertElementVisibleWithPrefix(
+      SimpleIdentifier prefixNode, Element element) {
+    if (prefixNode == null) {
+      return;
+    }
+    String prefixName = prefixNode.name;
+    for (ImportElement import in _enclosingLibrary.imports) {
+      if (import.prefix != null && import.prefix.name == prefixName) {
+        Namespace namespace =
+            new NamespaceBuilder().createImportNamespaceForDirective(import);
+        Iterable<Element> visibleElements = namespace.definedNames.values;
+        if (visibleElements.contains(element)) {
+          return;
+        }
+      }
+    }
+    _assertTrue(false);
+  }
+
+  void _assertEquals(Object a, Object b) {
+    if (a != b) {
+      throw new _DeclarationMismatchException();
+    }
+  }
+
+  void _assertFalse(bool condition) {
+    if (condition) {
+      throw new _DeclarationMismatchException();
+    }
+  }
+
+  void _assertNotNull(Object object) {
+    if (object == null) {
+      throw new _DeclarationMismatchException();
+    }
+  }
+
+  void _assertNull(Object object) {
+    if (object != null) {
+      throw new _DeclarationMismatchException();
+    }
+  }
+
+  void _assertSameAnnotation(Annotation node, ElementAnnotation annotation) {
+    Element element = annotation.element;
+    if (element is ConstructorElement) {
+      _assertTrue(node.name is SimpleIdentifier);
+      _assertNull(node.constructorName);
+      TypeName nodeType = new TypeName(node.name, null);
+      _assertSameType(nodeType, element.returnType);
+      // TODO(scheglov) validate arguments
+    }
+    if (element is PropertyAccessorElement) {
+      _assertTrue(node.name is SimpleIdentifier);
+      String nodeName = node.name.name;
+      String elementName = element.displayName;
+      _assertEquals(nodeName, elementName);
+    }
+  }
+
+  void _assertSameAnnotations(AnnotatedNode node, Element element) {
+    List<Annotation> nodeAnnotaitons = node.metadata;
+    List<ElementAnnotation> elementAnnotations = element.metadata;
+    int length = nodeAnnotaitons.length;
+    _assertEquals(elementAnnotations.length, length);
+    for (int i = 0; i < length; i++) {
+      _assertSameAnnotation(nodeAnnotaitons[i], elementAnnotations[i]);
+    }
+  }
+
+  void _assertSameType(TypeName node, DartType type) {
+    // no type == dynamic
+    if (node == null) {
+      return _assertTrue(type == null || type.isDynamic);
+    }
+    if (type == null) {
+      return _assertTrue(false);
+    }
+    // prepare name
+    SimpleIdentifier prefixIdentifier = null;
+    Identifier nameIdentifier = node.name;
+    if (nameIdentifier is PrefixedIdentifier) {
+      PrefixedIdentifier prefixedIdentifier = nameIdentifier;
+      prefixIdentifier = prefixedIdentifier.prefix;
+      nameIdentifier = prefixedIdentifier.identifier;
+    }
+    String nodeName = nameIdentifier.name;
+    // check specific type kinds
+    if (type is ParameterizedType) {
+      _assertEquals(nodeName, type.name);
+      _assertElementVisibleWithPrefix(prefixIdentifier, type.element);
+      // check arguments
+      TypeArgumentList nodeArgumentList = node.typeArguments;
+      List<DartType> typeArguments = type.typeArguments;
+      if (nodeArgumentList == null) {
+        // Node doesn't have type arguments, so all type arguments of the
+        // element must be "dynamic".
+        for (DartType typeArgument in typeArguments) {
+          _assertTrue(typeArgument.isDynamic);
+        }
+      } else {
+        List<TypeName> nodeArguments = nodeArgumentList.arguments;
+        _assertSameTypes(nodeArguments, typeArguments);
+      }
+    } else if (type is TypeParameterType) {
+      _assertEquals(nodeName, type.name);
+      // TODO(scheglov) it should be possible to rename type parameters
+    } else if (type.isVoid) {
+      _assertEquals(nodeName, 'void');
+    } else if (type.isDynamic) {
+      _assertEquals(nodeName, 'dynamic');
+    } else {
+      // TODO(scheglov) support other types
+      logger.log('node: $node type: $type  type.type: ${type.runtimeType}');
+      _assertTrue(false);
+    }
+  }
+
+  void _assertSameTypeParameter(
+      TypeParameter node, TypeParameterElement element) {
+    _assertSameType(node.bound, element.bound);
+  }
+
+  void _assertSameTypeParameters(
+      TypeParameterList nodesList, List<TypeParameterElement> elements) {
+    if (nodesList == null) {
+      return _assertEquals(elements.length, 0);
+    }
+    List<TypeParameter> nodes = nodesList.typeParameters;
+    int length = nodes.length;
+    _assertEquals(length, elements.length);
+    for (int i = 0; i < length; i++) {
+      _assertSameTypeParameter(nodes[i], elements[i]);
+    }
+  }
+
+  void _assertSameTypes(List<TypeName> nodes, List<DartType> types) {
+    int length = nodes.length;
+    _assertEquals(length, types.length);
+    for (int i = 0; i < length; i++) {
+      _assertSameType(nodes[i], types[i]);
+    }
+  }
+
+  void _assertTrue(bool condition) {
+    if (!condition) {
+      throw new _DeclarationMismatchException();
+    }
+  }
+
+  /**
+   * Given that the comparison is to begin with the given [element], capture
+   * the enclosing elements that might be used while performing the comparison.
+   */
+  void _captureEnclosingElements(Element element) {
+    Element parent =
+        element is CompilationUnitElement ? element : element.enclosingElement;
+    while (parent != null) {
+      if (parent is CompilationUnitElement) {
+        _enclosingUnit = parent;
+        _enclosingLibrary = element.library;
+      } else if (parent is ClassElement) {
+        if (_enclosingClass == null) {
+          _enclosingClass = parent;
+        }
+      } else if (parent is FunctionTypeAliasElement) {
+        if (_enclosingAlias == null) {
+          _enclosingAlias = parent;
+        }
+      } else if (parent is ParameterElement) {
+        if (_enclosingParameter == null) {
+          _enclosingParameter = parent;
+        }
+      }
+      parent = parent.enclosingElement;
+    }
+  }
+
+  void _gatherElements(Element element) {
+    _ElementsGatherer gatherer = new _ElementsGatherer(this);
+    element.accept(gatherer);
+    // TODO(scheglov) what if a change in a directive?
+    if (identical(element, _enclosingLibrary.definingCompilationUnit)) {
+      gatherer.addElements(_enclosingLibrary.imports);
+      gatherer.addElements(_enclosingLibrary.exports);
+      gatherer.addElements(_enclosingLibrary.parts);
+    }
+  }
+
+  void _processElement(Element element) {
+    _assertNotNull(element);
+    if (!_allElements.contains(element)) {
+      throw new _DeclarationMismatchException();
+    }
+    _removedElements.remove(element);
+  }
+
+  void _removeElement(Element element) {
+    if (element != null) {
+      Element enclosingElement = element.enclosingElement;
+      if (element is MethodElement) {
+        ClassElement classElement = enclosingElement;
+        _removeIdenticalElement(classElement.methods, element);
+      } else if (element is PropertyAccessorElement) {
+        if (enclosingElement is ClassElement) {
+          _removeIdenticalElement(enclosingElement.accessors, element);
+        }
+        if (enclosingElement is CompilationUnitElement) {
+          _removeIdenticalElement(enclosingElement.accessors, element);
+        }
+      }
+    }
+  }
+
+  /**
+   * Return the [Element] in [elements] with the given [name].
+   */
+  static Element _findElement(List<Element> elements, String name) {
+    for (Element element in elements) {
+      if (element.name == name) {
+        return element;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the [UriReferencedElement] from [elements] with the given [uri], or
+   * `null` if there is no such element.
+   */
+  static UriReferencedElement _findUriReferencedElement(
+      List<UriReferencedElement> elements, String uri) {
+    for (UriReferencedElement element in elements) {
+      if (element.uri == uri) {
+        return element;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the value of [literal], or `null` if the string is not a constant
+   * string without any string interpolation.
+   */
+  static String _getStringValue(StringLiteral literal) {
+    if (literal is StringInterpolation) {
+      return null;
+    }
+    return literal.stringValue;
+  }
+
+  /**
+   * Removes the first element identical to the given [element] from [elements].
+   */
+  static void _removeIdenticalElement(List elements, Object element) {
+    int length = elements.length;
+    for (int i = 0; i < length; i++) {
+      if (identical(elements[i], element)) {
+        elements.removeAt(i);
+        return;
+      }
+    }
+  }
+
+  static void _setLocalElements(
+      ExecutableElementImpl to, ExecutableElement from) {
+    if (from != null) {
+      to.functions = from.functions;
+      to.labels = from.labels;
+      to.localVariables = from.localVariables;
+      to.parameters = from.parameters;
+    }
+  }
+}
+
+/**
+ * Describes how declarations match an existing elements model.
+ */
+class DeclarationMatchKind {
+  /**
+   * Complete match, no API changes.
+   */
+  static const MATCH = const DeclarationMatchKind('MATCH');
+
+  /**
+   * Has API changes that we might be able to resolve incrementally.
+   */
+  static const MISMATCH_OK = const DeclarationMatchKind('MISMATCH_OK');
+
+  /**
+   * Has API changes that we cannot resolve incrementally.
+   */
+  static const MISMATCH = const DeclarationMatchKind('MISMATCH');
+
+  final String name;
+
+  const DeclarationMatchKind(this.name);
+
+  @override
+  String toString() => name;
+}
+
+/**
+ * Instances of the class [IncrementalResolver] resolve the smallest portion of
+ * an AST structure that we currently know how to resolve.
+ */
+class IncrementalResolver {
+  /**
+   * The element of the compilation unit being resolved.
+   */
+  final CompilationUnitElementImpl _definingUnit;
+
+  /**
+   * The context the compilation unit being resolved in.
+   */
+  AnalysisContext _context;
+
+  /**
+   * The object used to access the types from the core library.
+   */
+  TypeProvider _typeProvider;
+
+  /**
+   * The element for the library containing the compilation unit being resolved.
+   */
+  LibraryElementImpl _definingLibrary;
+
+  /**
+   * The [DartEntry] corresponding to the source being resolved.
+   */
+  DartEntry oldEntry;
+
+  /**
+   * The [CacheEntry] corresponding to the source being resolved.
+   */
+  CacheEntry newSourceEntry;
+
+  /**
+   * The [CacheEntry] corresponding to the [LibrarySpecificUnit] being resolved.
+   */
+  CacheEntry newUnitEntry;
+
+  /**
+   * The source representing the compilation unit being visited.
+   */
+  Source _source;
+
+  /**
+   * The source representing the library of the compilation unit being visited.
+   */
+  Source _librarySource;
+
+  /**
+   * The offset of the changed contents.
+   */
+  final int _updateOffset;
+
+  /**
+   * The end of the changed contents in the old unit.
+   */
+  final int _updateEndOld;
+
+  /**
+   * The end of the changed contents in the new unit.
+   */
+  final int _updateEndNew;
+
+  int _updateDelta;
+
+  RecordingErrorListener errorListener = new RecordingErrorListener();
+  ResolutionContext _resolutionContext;
+
+  List<AnalysisError> _resolveErrors = AnalysisError.NO_ERRORS;
+  List<AnalysisError> _verifyErrors = AnalysisError.NO_ERRORS;
+
+  /**
+   * Initialize a newly created incremental resolver to resolve a node in the
+   * given source in the given library.
+   */
+  IncrementalResolver(
+      this.oldEntry,
+      this.newSourceEntry,
+      this.newUnitEntry,
+      this._definingUnit,
+      this._updateOffset,
+      this._updateEndOld,
+      this._updateEndNew) {
+    _updateDelta = _updateEndNew - _updateEndOld;
+    _definingLibrary = _definingUnit.library;
+    _librarySource = _definingLibrary.source;
+    _source = _definingUnit.source;
+    _context = _definingUnit.context;
+    _typeProvider = _context.typeProvider;
+  }
+
+  /**
+   * Resolve [node], reporting any errors or warnings to the given listener.
+   *
+   * [node] - the root of the AST structure to be resolved.
+   *
+   * Returns `true` if resolution was successful.
+   */
+  bool resolve(AstNode node) {
+    logger.enter('resolve: $_definingUnit');
+    try {
+      AstNode rootNode = _findResolutionRoot(node);
+      _prepareResolutionContext(rootNode);
+      // update elements
+      _updateElementNameOffsets();
+      _buildElements(rootNode);
+      if (!_canBeIncrementallyResolved(rootNode)) {
+        return false;
+      }
+      // resolve
+      _resolveReferences(rootNode);
+      _computeConstants(rootNode);
+      _resolveErrors = errorListener.getErrorsForSource(_source);
+      // verify
+      _verify(rootNode);
+      _context.invalidateLibraryHints(_librarySource);
+      // update entry errors
+      _updateEntry();
+      // notify unit
+      _definingUnit.afterIncrementalResolution();
+      // OK
+      return true;
+    } finally {
+      logger.exit();
+    }
+  }
+
+  void _buildElements(AstNode node) {
+    LoggingTimer timer = logger.startTimer();
+    try {
+      ElementHolder holder = new ElementHolder();
+      ElementBuilder builder = new ElementBuilder(holder);
+      if (_resolutionContext.enclosingClassDeclaration != null) {
+        builder.visitClassDeclarationIncrementally(
+            _resolutionContext.enclosingClassDeclaration);
+      }
+      node.accept(builder);
+    } finally {
+      timer.stop('build elements');
+    }
+  }
+
+  /**
+   * Return `true` if [node] does not have element model changes, or these
+   * changes can be incrementally propagated.
+   */
+  bool _canBeIncrementallyResolved(AstNode node) {
+    // If we are replacing the whole declaration, this means that its signature
+    // is changed. It might be an API change, or not.
+    //
+    // If, for example, a required parameter is changed, it is not an API
+    // change, but we want to find the existing corresponding Element in the
+    // enclosing one, set it for the node and update as needed.
+    //
+    // If, for example, the name of a method is changed, it is an API change,
+    // we need to know the old Element and the new Element. Again, we need to
+    // check the whole enclosing Element.
+    if (node is Declaration) {
+      node = node.parent;
+    }
+    Element element = _getElement(node);
+    DeclarationMatcher matcher = new DeclarationMatcher();
+    DeclarationMatchKind matchKind = matcher.matches(node, element);
+    if (matchKind == DeclarationMatchKind.MATCH) {
+      return true;
+    }
+    // mismatch that cannot be incrementally fixed
+    return false;
+  }
+
+  /**
+   * Return `true` if the given node can be resolved independently of any other
+   * nodes.
+   *
+   * *Note*: This method needs to be kept in sync with
+   * [ScopeBuilder.ContextBuilder].
+   *
+   * [node] - the node being tested.
+   */
+  bool _canBeResolved(AstNode node) => node is ClassDeclaration ||
+      node is ClassTypeAlias ||
+      node is CompilationUnit ||
+      node is ConstructorDeclaration ||
+      node is FunctionDeclaration ||
+      node is FunctionTypeAlias ||
+      node is MethodDeclaration ||
+      node is TopLevelVariableDeclaration;
+
+  /**
+   * Compute a value for all of the constants in the given [node].
+   */
+  void _computeConstants(AstNode node) {
+    // compute values
+    {
+      CompilationUnit unit = node.getAncestor((n) => n is CompilationUnit);
+      ConstantValueComputer computer = new ConstantValueComputer(
+          _context, _typeProvider, _context.declaredVariables);
+      computer.add(unit, _source, _librarySource);
+      computer.computeValues();
+    }
+    // validate
+    {
+      ErrorReporter errorReporter = new ErrorReporter(errorListener, _source);
+      ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter,
+          _definingLibrary, _typeProvider, _context.declaredVariables);
+      node.accept(constantVerifier);
+    }
+  }
+
+  /**
+   * Starting at [node], find the smallest AST node that can be resolved
+   * independently of any other nodes. Return the node that was found.
+   *
+   * [node] - the node at which the search is to begin
+   *
+   * Throws [AnalysisException] if there is no such node.
+   */
+  AstNode _findResolutionRoot(AstNode node) {
+    while (node != null) {
+      if (_canBeResolved(node)) {
+        return node;
+      }
+      node = node.parent;
+    }
+    throw new AnalysisException("Cannot resolve node: no resolvable node");
+  }
+
+  /**
+   * Return the element defined by [node], or `null` if the node does not
+   * define an element.
+   */
+  Element _getElement(AstNode node) {
+    if (node is Declaration) {
+      return node.element;
+    } else if (node is CompilationUnit) {
+      return node.element;
+    }
+    return null;
+  }
+
+  void _prepareResolutionContext(AstNode node) {
+    if (_resolutionContext == null) {
+      _resolutionContext =
+          ResolutionContextBuilder.contextFor(node, errorListener);
+    }
+  }
+
+  _resolveReferences(AstNode node) {
+    LoggingTimer timer = logger.startTimer();
+    try {
+      _prepareResolutionContext(node);
+      Scope scope = _resolutionContext.scope;
+      // resolve types
+      {
+        TypeResolverVisitor visitor = new TypeResolverVisitor(
+            _definingLibrary, _source, _typeProvider, errorListener,
+            nameScope: scope);
+        node.accept(visitor);
+      }
+      // resolve variables
+      {
+        VariableResolverVisitor visitor = new VariableResolverVisitor(
+            _definingLibrary, _source, _typeProvider, errorListener,
+            nameScope: scope);
+        node.accept(visitor);
+      }
+      // resolve references
+      {
+        ResolverVisitor visitor = new ResolverVisitor(
+            _definingLibrary, _source, _typeProvider, errorListener,
+            nameScope: scope);
+        if (_resolutionContext.enclosingClassDeclaration != null) {
+          visitor.visitClassDeclarationIncrementally(
+              _resolutionContext.enclosingClassDeclaration);
+        }
+        if (node is Comment) {
+          visitor.resolveOnlyCommentInFunctionBody = true;
+          node = node.parent;
+        }
+        visitor.initForIncrementalResolution();
+        node.accept(visitor);
+      }
+    } finally {
+      timer.stop('resolve references');
+    }
+  }
+
+  void _shiftEntryErrors() {
+    if (oldEntry != null) {
+      _shiftEntryErrors_OLD();
+    } else {
+      _shiftEntryErrors_NEW();
+    }
+  }
+
+  void _shiftEntryErrors_NEW() {
+    _shiftErrors_NEW(HINTS);
+    _shiftErrors_NEW(RESOLVE_REFERENCES_ERRORS);
+    _shiftErrors_NEW(RESOLVE_TYPE_NAMES_ERRORS);
+    _shiftErrors_NEW(VARIABLE_REFERENCE_ERRORS);
+    _shiftErrors_NEW(VERIFY_ERRORS);
+  }
+
+  void _shiftEntryErrors_OLD() {
+    _shiftErrors_OLD(DartEntry.RESOLUTION_ERRORS);
+    _shiftErrors_OLD(DartEntry.VERIFICATION_ERRORS);
+    _shiftErrors_OLD(DartEntry.HINTS);
+    _shiftErrors_OLD(DartEntry.LINTS);
+  }
+
+  void _shiftErrors(List<AnalysisError> errors) {
+    for (AnalysisError error in errors) {
+      int errorOffset = error.offset;
+      if (errorOffset > _updateOffset) {
+        error.offset += _updateDelta;
+      }
+    }
+  }
+
+  void _shiftErrors_NEW(ResultDescriptor<List<AnalysisError>> descriptor) {
+    List<AnalysisError> errors = newUnitEntry.getValue(descriptor);
+    _shiftErrors(errors);
+  }
+
+  void _shiftErrors_OLD(DataDescriptor<List<AnalysisError>> descriptor) {
+    List<AnalysisError> errors =
+        oldEntry.getValueInLibrary(descriptor, _librarySource);
+    _shiftErrors(errors);
+  }
+
+  void _updateElementNameOffsets() {
+    LoggingTimer timer = logger.startTimer();
+    try {
+      _definingUnit
+          .accept(new _ElementNameOffsetUpdater(_updateOffset, _updateDelta));
+    } finally {
+      timer.stop('update element offsets');
+    }
+  }
+
+  void _updateEntry() {
+    if (oldEntry != null) {
+      _updateEntry_OLD();
+    } else {
+      _updateEntry_NEW();
+    }
+  }
+
+  void _updateEntry_NEW() {
+    _updateErrors_NEW(RESOLVE_REFERENCES_ERRORS, _resolveErrors);
+    _updateErrors_NEW(RESOLVE_TYPE_NAMES_ERRORS, []);
+    _updateErrors_NEW(VARIABLE_REFERENCE_ERRORS, []);
+    _updateErrors_NEW(VERIFY_ERRORS, _verifyErrors);
+    // invalidate results we don't update incrementally
+    newUnitEntry.setState(USED_IMPORTED_ELEMENTS, CacheState.INVALID);
+    newUnitEntry.setState(USED_LOCAL_ELEMENTS, CacheState.INVALID);
+    newUnitEntry.setState(HINTS, CacheState.INVALID);
+  }
+
+  void _updateEntry_OLD() {
+    _updateErrors_OLD(DartEntry.RESOLUTION_ERRORS, _resolveErrors);
+    _updateErrors_OLD(DartEntry.VERIFICATION_ERRORS, _verifyErrors);
+  }
+
+  List<AnalysisError> _updateErrors(
+      List<AnalysisError> oldErrors, List<AnalysisError> newErrors) {
+    List<AnalysisError> errors = new List<AnalysisError>();
+    // add updated old errors
+    for (AnalysisError error in oldErrors) {
+      int errorOffset = error.offset;
+      if (errorOffset < _updateOffset) {
+        errors.add(error);
+      } else if (errorOffset > _updateEndOld) {
+        error.offset += _updateDelta;
+        errors.add(error);
+      }
+    }
+    // add new errors
+    for (AnalysisError error in newErrors) {
+      int errorOffset = error.offset;
+      if (errorOffset > _updateOffset && errorOffset < _updateEndNew) {
+        errors.add(error);
+      }
+    }
+    // done
+    return errors;
+  }
+
+  void _updateErrors_NEW(ResultDescriptor<List<AnalysisError>> descriptor,
+      List<AnalysisError> newErrors) {
+    List<AnalysisError> oldErrors = newUnitEntry.getValue(descriptor);
+    List<AnalysisError> errors = _updateErrors(oldErrors, newErrors);
+    newUnitEntry.setValueIncremental(descriptor, errors);
+  }
+
+  void _updateErrors_OLD(DataDescriptor<List<AnalysisError>> descriptor,
+      List<AnalysisError> newErrors) {
+    List<AnalysisError> oldErrors =
+        oldEntry.getValueInLibrary(descriptor, _librarySource);
+    List<AnalysisError> errors = _updateErrors(oldErrors, newErrors);
+    oldEntry.setValueInLibrary(descriptor, _librarySource, errors);
+  }
+
+  void _verify(AstNode node) {
+    LoggingTimer timer = logger.startTimer();
+    try {
+      RecordingErrorListener errorListener = new RecordingErrorListener();
+      ErrorReporter errorReporter = new ErrorReporter(errorListener, _source);
+      ErrorVerifier errorVerifier = new ErrorVerifier(
+          errorReporter,
+          _definingLibrary,
+          _typeProvider,
+          new InheritanceManager(_definingLibrary),
+          _context.analysisOptions.enableSuperMixins);
+      if (_resolutionContext.enclosingClassDeclaration != null) {
+        errorVerifier.visitClassDeclarationIncrementally(
+            _resolutionContext.enclosingClassDeclaration);
+      }
+      node.accept(errorVerifier);
+      _verifyErrors = errorListener.getErrorsForSource(_source);
+    } finally {
+      timer.stop('verify');
+    }
+  }
+}
+
+class PoorMansIncrementalResolver {
+  final TypeProvider _typeProvider;
+  final Source _unitSource;
+
+  /**
+   * The [DartEntry] corresponding to the source being resolved.
+   */
+  DartEntry _oldEntry;
+
+  /**
+   * The [CacheEntry] corresponding to the source being resolved.
+   */
+  CacheEntry _newSourceEntry;
+
+  /**
+   * The [CacheEntry] corresponding to the [LibrarySpecificUnit] being resolved.
+   */
+  CacheEntry _newUnitEntry;
+
+  final CompilationUnit _oldUnit;
+  final AnalysisOptions _options;
+  CompilationUnitElement _unitElement;
+
+  int _updateOffset;
+  int _updateDelta;
+  int _updateEndOld;
+  int _updateEndNew;
+
+  LineInfo _newLineInfo;
+  List<AnalysisError> _newScanErrors = <AnalysisError>[];
+  List<AnalysisError> _newParseErrors = <AnalysisError>[];
+
+  PoorMansIncrementalResolver(
+      this._typeProvider,
+      this._unitSource,
+      this._oldEntry,
+      this._newSourceEntry,
+      this._newUnitEntry,
+      this._oldUnit,
+      bool resolveApiChanges,
+      this._options) {
+    _resolveApiChanges = resolveApiChanges;
+  }
+
+  /**
+   * Attempts to update [_oldUnit] to the state corresponding to [newCode].
+   * Returns `true` if success, or `false` otherwise.
+   * The [_oldUnit] might be damaged.
+   */
+  bool resolve(String newCode) {
+    logger.enter('diff/resolve $_unitSource');
+    try {
+      // prepare old unit
+      if (!_areCurlyBracketsBalanced(_oldUnit.beginToken)) {
+        logger.log('Unbalanced number of curly brackets in the old unit.');
+        return false;
+      }
+      _unitElement = _oldUnit.element;
+      // prepare new unit
+      CompilationUnit newUnit = _parseUnit(newCode);
+      if (!_areCurlyBracketsBalanced(newUnit.beginToken)) {
+        logger.log('Unbalanced number of curly brackets in the new unit.');
+        return false;
+      }
+      // find difference
+      _TokenPair firstPair =
+          _findFirstDifferentToken(_oldUnit.beginToken, newUnit.beginToken);
+      _TokenPair lastPair =
+          _findLastDifferentToken(_oldUnit.endToken, newUnit.endToken);
+      if (firstPair != null && lastPair != null) {
+        int firstOffsetOld = firstPair.oldToken.offset;
+        int firstOffsetNew = firstPair.newToken.offset;
+        int lastOffsetOld = lastPair.oldToken.end;
+        int lastOffsetNew = lastPair.newToken.end;
+        int beginOffsetOld = math.min(firstOffsetOld, lastOffsetOld);
+        int endOffsetOld = math.max(firstOffsetOld, lastOffsetOld);
+        int beginOffsetNew = math.min(firstOffsetNew, lastOffsetNew);
+        int endOffsetNew = math.max(firstOffsetNew, lastOffsetNew);
+        // check for a whitespace only change
+        if (identical(lastPair.oldToken, firstPair.oldToken) &&
+            identical(lastPair.newToken, firstPair.newToken)) {
+          _updateOffset = beginOffsetOld - 1;
+          _updateEndOld = endOffsetOld;
+          _updateEndNew = endOffsetNew;
+          _updateDelta = newUnit.length - _oldUnit.length;
+          // A Dart documentation comment change.
+          if (firstPair.kind == _TokenDifferenceKind.COMMENT_DOC) {
+            bool success = _resolveCommentDoc(newUnit, firstPair);
+            logger.log('Documentation comment resolved: $success');
+            return success;
+          }
+          // A pure whitespace change.
+          if (firstPair.kind == _TokenDifferenceKind.OFFSET) {
+            logger.log('Whitespace change.');
+            _shiftTokens(firstPair.oldToken);
+            {
+              IncrementalResolver incrementalResolver = new IncrementalResolver(
+                  _oldEntry,
+                  _newSourceEntry,
+                  _newUnitEntry,
+                  _unitElement,
+                  _updateOffset,
+                  _updateEndOld,
+                  _updateEndNew);
+              incrementalResolver._updateElementNameOffsets();
+              incrementalResolver._shiftEntryErrors();
+            }
+            _updateEntry();
+            logger.log('Success.');
+            return true;
+          }
+          // fall-through, end-of-line comment
+        }
+        // Find nodes covering the "old" and "new" token ranges.
+        AstNode oldNode =
+            _findNodeCovering(_oldUnit, beginOffsetOld, endOffsetOld - 1);
+        AstNode newNode =
+            _findNodeCovering(newUnit, beginOffsetNew, endOffsetNew - 1);
+        logger.log(() => 'oldNode: $oldNode');
+        logger.log(() => 'newNode: $newNode');
+        // Try to find the smallest common node, a FunctionBody currently.
+        {
+          List<AstNode> oldParents = _getParents(oldNode);
+          List<AstNode> newParents = _getParents(newNode);
+          int length = math.min(oldParents.length, newParents.length);
+          bool found = false;
+          for (int i = 0; i < length; i++) {
+            AstNode oldParent = oldParents[i];
+            AstNode newParent = newParents[i];
+            if (oldParent is ConstructorInitializer ||
+                newParent is ConstructorInitializer) {
+              logger.log('Failure: changes in constant constructor initializers'
+                  ' may cause external changes in constant objects.');
+              return false;
+            }
+            if (oldParent is FunctionDeclaration &&
+                    newParent is FunctionDeclaration ||
+                oldParent is MethodDeclaration &&
+                    newParent is MethodDeclaration ||
+                oldParent is ConstructorDeclaration &&
+                    newParent is ConstructorDeclaration) {
+              Element oldElement = (oldParent as Declaration).element;
+              if (new DeclarationMatcher().matches(newParent, oldElement) ==
+                  DeclarationMatchKind.MATCH) {
+                oldNode = oldParent;
+                newNode = newParent;
+                found = true;
+              }
+            }
+            if (oldParent is BlockFunctionBody &&
+                newParent is BlockFunctionBody) {
+              oldNode = oldParent;
+              newNode = newParent;
+              found = true;
+              break;
+            }
+          }
+          if (!found) {
+            logger.log('Failure: no enclosing function body or executable.');
+            return false;
+          }
+          // fail if a comment change outside the bodies
+          if (firstPair.kind == _TokenDifferenceKind.COMMENT) {
+            if (beginOffsetOld <= oldNode.offset ||
+                beginOffsetNew <= newNode.offset) {
+              logger.log('Failure: comment outside a function body.');
+              return false;
+            }
+          }
+        }
+        logger.log(() => 'oldNode: $oldNode');
+        logger.log(() => 'newNode: $newNode');
+        // prepare update range
+        _updateOffset = oldNode.offset;
+        _updateEndOld = oldNode.end;
+        _updateEndNew = newNode.end;
+        _updateDelta = _updateEndNew - _updateEndOld;
+        // replace node
+        NodeReplacer.replace(oldNode, newNode);
+        // update token references
+        {
+          Token oldBeginToken = _getBeginTokenNotComment(oldNode);
+          Token newBeginToken = _getBeginTokenNotComment(newNode);
+          if (oldBeginToken.previous.type == TokenType.EOF) {
+            _oldUnit.beginToken = newBeginToken;
+          } else {
+            oldBeginToken.previous.setNext(newBeginToken);
+          }
+          newNode.endToken.setNext(oldNode.endToken.next);
+          _shiftTokens(oldNode.endToken.next);
+        }
+        // perform incremental resolution
+        IncrementalResolver incrementalResolver = new IncrementalResolver(
+            _oldEntry,
+            _newSourceEntry,
+            _newUnitEntry,
+            _unitElement,
+            _updateOffset,
+            _updateEndOld,
+            _updateEndNew);
+        bool success = incrementalResolver.resolve(newNode);
+        // check if success
+        if (!success) {
+          logger.log('Failure: element model changed.');
+          return false;
+        }
+        // update DartEntry
+        _updateEntry();
+        logger.log('Success.');
+        return true;
+      }
+    } catch (e, st) {
+      logger.log(e);
+      logger.log(st);
+      logger.log('Failure: exception.');
+    } finally {
+      logger.exit();
+    }
+    return false;
+  }
+
+  CompilationUnit _parseUnit(String code) {
+    LoggingTimer timer = logger.startTimer();
+    try {
+      Token token = _scan(code);
+      RecordingErrorListener errorListener = new RecordingErrorListener();
+      Parser parser = new Parser(_unitSource, errorListener);
+      AnalysisOptions options = _unitElement.context.analysisOptions;
+      parser.parseGenericMethods = options.enableGenericMethods;
+      CompilationUnit unit = parser.parseCompilationUnit(token);
+      _newParseErrors = errorListener.errors;
+      return unit;
+    } finally {
+      timer.stop('parse');
+    }
+  }
+
+  /**
+   * Attempts to resolve a documentation comment change.
+   * Returns `true` if success.
+   */
+  bool _resolveCommentDoc(CompilationUnit newUnit, _TokenPair firstPair) {
+    Token oldToken = firstPair.oldToken;
+    Token newToken = firstPair.newToken;
+    CommentToken oldComments = oldToken.precedingComments;
+    CommentToken newComments = newToken.precedingComments;
+    if (oldComments == null || newComments == null) {
+      return false;
+    }
+    // find nodes
+    int offset = oldComments.offset;
+    logger.log('offset: $offset');
+    Comment oldComment = _findNodeCovering(_oldUnit, offset, offset);
+    Comment newComment = _findNodeCovering(newUnit, offset, offset);
+    logger.log('oldComment.beginToken: ${oldComment.beginToken}');
+    logger.log('newComment.beginToken: ${newComment.beginToken}');
+    _updateOffset = oldToken.offset - 1;
+    // update token references
+    _shiftTokens(firstPair.oldToken);
+    _setPrecedingComments(oldToken, newComment.tokens.first);
+    // replace node
+    NodeReplacer.replace(oldComment, newComment);
+    // update elements
+    IncrementalResolver incrementalResolver = new IncrementalResolver(
+        _oldEntry,
+        _newSourceEntry,
+        _newUnitEntry,
+        _unitElement,
+        _updateOffset,
+        _updateEndOld,
+        _updateEndNew);
+    incrementalResolver._updateElementNameOffsets();
+    incrementalResolver._shiftEntryErrors();
+    _updateEntry();
+    // resolve references in the comment
+    incrementalResolver._resolveReferences(newComment);
+    // OK
+    return true;
+  }
+
+  Token _scan(String code) {
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    CharSequenceReader reader = new CharSequenceReader(code);
+    Scanner scanner = new Scanner(_unitSource, reader, errorListener);
+    Token token = scanner.tokenize();
+    _newLineInfo = new LineInfo(scanner.lineStarts);
+    _newScanErrors = errorListener.errors;
+    return token;
+  }
+
+  /**
+   * Set the given [comment] as a "precedingComments" for [token].
+   */
+  void _setPrecedingComments(Token token, CommentToken comment) {
+    if (token is BeginTokenWithComment) {
+      token.precedingComments = comment;
+    } else if (token is KeywordTokenWithComment) {
+      token.precedingComments = comment;
+    } else if (token is StringTokenWithComment) {
+      token.precedingComments = comment;
+    } else if (token is TokenWithComment) {
+      token.precedingComments = comment;
+    } else {
+      Type parentType = token != null ? token.runtimeType : null;
+      throw new AnalysisException('Uknown parent token type: $parentType');
+    }
+  }
+
+  void _shiftTokens(Token token) {
+    while (token != null) {
+      if (token.offset > _updateOffset) {
+        token.offset += _updateDelta;
+      }
+      // comments
+      _shiftTokens(token.precedingComments);
+      if (token is DocumentationCommentToken) {
+        for (Token reference in token.references) {
+          _shiftTokens(reference);
+        }
+      }
+      // next
+      if (token.type == TokenType.EOF) {
+        break;
+      }
+      token = token.next;
+    }
+  }
+
+  void _updateEntry() {
+    if (_oldEntry != null) {
+      _updateEntry_OLD();
+    } else {
+      _updateEntry_NEW();
+    }
+  }
+
+  void _updateEntry_NEW() {
+    _newSourceEntry.setState(DART_ERRORS, CacheState.INVALID);
+    // scan results
+    _newSourceEntry.setState(SCAN_ERRORS, CacheState.INVALID);
+    List<TargetedResult> scanDeps = <TargetedResult>[
+      new TargetedResult(_unitSource, CONTENT)
+    ];
+    _newSourceEntry.setValue(LINE_INFO, _newLineInfo, scanDeps);
+    _newSourceEntry.setValue(SCAN_ERRORS, _newScanErrors, scanDeps);
+    // parse results
+    List<TargetedResult> parseDeps = <TargetedResult>[
+      new TargetedResult(_unitSource, TOKEN_STREAM)
+    ];
+    _newSourceEntry.setState(PARSE_ERRORS, CacheState.INVALID);
+    _newSourceEntry.setValue(PARSE_ERRORS, _newParseErrors, parseDeps);
+    _newSourceEntry.setValue(PARSED_UNIT, _oldUnit, parseDeps);
+  }
+
+  void _updateEntry_OLD() {
+    _oldEntry.setValue(SourceEntry.LINE_INFO, _newLineInfo);
+    _oldEntry.setValue(DartEntry.SCAN_ERRORS, _newScanErrors);
+    _oldEntry.setValue(DartEntry.PARSE_ERRORS, _newParseErrors);
+  }
+
+  /**
+   * Checks if [token] has a balanced number of open and closed curly brackets.
+   */
+  static bool _areCurlyBracketsBalanced(Token token) {
+    int numOpen = _getTokenCount(token, TokenType.OPEN_CURLY_BRACKET);
+    int numOpen2 =
+        _getTokenCount(token, TokenType.STRING_INTERPOLATION_EXPRESSION);
+    int numClosed = _getTokenCount(token, TokenType.CLOSE_CURLY_BRACKET);
+    return numOpen + numOpen2 == numClosed;
+  }
+
+  static _TokenDifferenceKind _compareToken(
+      Token oldToken, Token newToken, int delta, bool forComment) {
+    while (true) {
+      if (oldToken == null && newToken == null) {
+        return null;
+      }
+      if (oldToken == null || newToken == null) {
+        return _TokenDifferenceKind.CONTENT;
+      }
+      if (oldToken.type != newToken.type) {
+        return _TokenDifferenceKind.CONTENT;
+      }
+      if (oldToken.lexeme != newToken.lexeme) {
+        return _TokenDifferenceKind.CONTENT;
+      }
+      if (newToken.offset - oldToken.offset != delta) {
+        return _TokenDifferenceKind.OFFSET;
+      }
+      // continue if comment tokens are being checked
+      if (!forComment) {
+        break;
+      }
+      oldToken = oldToken.next;
+      newToken = newToken.next;
+    }
+    return null;
+  }
+
+  static _TokenPair _findFirstDifferentToken(Token oldToken, Token newToken) {
+    while (true) {
+      if (oldToken.type == TokenType.EOF && newToken.type == TokenType.EOF) {
+        return null;
+      }
+      if (oldToken.type == TokenType.EOF || newToken.type == TokenType.EOF) {
+        return new _TokenPair(_TokenDifferenceKind.CONTENT, oldToken, newToken);
+      }
+      // compare comments
+      {
+        Token oldComment = oldToken.precedingComments;
+        Token newComment = newToken.precedingComments;
+        if (_compareToken(oldComment, newComment, 0, true) != null) {
+          _TokenDifferenceKind diffKind = _TokenDifferenceKind.COMMENT;
+          if (oldComment is DocumentationCommentToken ||
+              newComment is DocumentationCommentToken) {
+            diffKind = _TokenDifferenceKind.COMMENT_DOC;
+          }
+          return new _TokenPair(diffKind, oldToken, newToken);
+        }
+      }
+      // compare tokens
+      _TokenDifferenceKind diffKind =
+          _compareToken(oldToken, newToken, 0, false);
+      if (diffKind != null) {
+        return new _TokenPair(diffKind, oldToken, newToken);
+      }
+      // next tokens
+      oldToken = oldToken.next;
+      newToken = newToken.next;
+    }
+    // no difference
+    return null;
+  }
+
+  static _TokenPair _findLastDifferentToken(Token oldToken, Token newToken) {
+    int delta = newToken.offset - oldToken.offset;
+    while (oldToken.previous != oldToken && newToken.previous != newToken) {
+      // compare tokens
+      _TokenDifferenceKind diffKind =
+          _compareToken(oldToken, newToken, delta, false);
+      if (diffKind != null) {
+        return new _TokenPair(diffKind, oldToken.next, newToken.next);
+      }
+      // compare comments
+      {
+        Token oldComment = oldToken.precedingComments;
+        Token newComment = newToken.precedingComments;
+        if (_compareToken(oldComment, newComment, delta, true) != null) {
+          _TokenDifferenceKind diffKind = _TokenDifferenceKind.COMMENT;
+          if (oldComment is DocumentationCommentToken ||
+              newComment is DocumentationCommentToken) {
+            diffKind = _TokenDifferenceKind.COMMENT_DOC;
+          }
+          return new _TokenPair(diffKind, oldToken, newToken);
+        }
+      }
+      // next tokens
+      oldToken = oldToken.previous;
+      newToken = newToken.previous;
+    }
+    return null;
+  }
+
+  static AstNode _findNodeCovering(AstNode root, int offset, int end) {
+    NodeLocator nodeLocator = new NodeLocator(offset, end);
+    return nodeLocator.searchWithin(root);
+  }
+
+  static Token _getBeginTokenNotComment(AstNode node) {
+    Token oldBeginToken = node.beginToken;
+    if (oldBeginToken is CommentToken) {
+      oldBeginToken = (oldBeginToken as CommentToken).parent;
+    }
+    return oldBeginToken;
+  }
+
+  static List<AstNode> _getParents(AstNode node) {
+    List<AstNode> parents = <AstNode>[];
+    while (node != null) {
+      parents.insert(0, node);
+      node = node.parent;
+    }
+    return parents;
+  }
+
+  /**
+   * Returns number of tokens with the given [type].
+   */
+  static int _getTokenCount(Token token, TokenType type) {
+    int count = 0;
+    while (token.type != TokenType.EOF) {
+      if (token.type == type) {
+        count++;
+      }
+      token = token.next;
+    }
+    return count;
+  }
+}
+
+/**
+ * The context to resolve an [AstNode] in.
+ */
+class ResolutionContext {
+  CompilationUnitElement enclosingUnit;
+  ClassDeclaration enclosingClassDeclaration;
+  ClassElement enclosingClass;
+  Scope scope;
+}
+
+/**
+ * Instances of the class [ResolutionContextBuilder] build the context for a
+ * given node in an AST structure. At the moment, this class only handles
+ * top-level and class-level declarations.
+ */
+class ResolutionContextBuilder {
+  /**
+   * The listener to which analysis errors will be reported.
+   */
+  final AnalysisErrorListener _errorListener;
+
+  /**
+   * The class containing the enclosing [CompilationUnitElement].
+   */
+  CompilationUnitElement _enclosingUnit;
+
+  /**
+   * The class containing the enclosing [ClassDeclaration], or `null` if we are
+   * not in the scope of a class.
+   */
+  ClassDeclaration _enclosingClassDeclaration;
+
+  /**
+   * The class containing the enclosing [ClassElement], or `null` if we are not
+   * in the scope of a class.
+   */
+  ClassElement _enclosingClass;
+
+  /**
+   * Initialize a newly created scope builder to generate a scope that will
+   * report errors to the given listener.
+   */
+  ResolutionContextBuilder(this._errorListener);
+
+  Scope _scopeFor(AstNode node) {
+    if (node is CompilationUnit) {
+      return _scopeForAstNode(node);
+    }
+    AstNode parent = node.parent;
+    if (parent == null) {
+      throw new AnalysisException(
+          "Cannot create scope: node is not part of a CompilationUnit");
+    }
+    return _scopeForAstNode(parent);
+  }
+
+  /**
+   * Return the scope in which the given AST structure should be resolved.
+   *
+   * *Note:* This method needs to be kept in sync with
+   * [IncrementalResolver.canBeResolved].
+   *
+   * [node] - the root of the AST structure to be resolved.
+   *
+   * Throws [AnalysisException] if the AST structure has not been resolved or
+   * is not part of a [CompilationUnit]
+   */
+  Scope _scopeForAstNode(AstNode node) {
+    if (node is CompilationUnit) {
+      return _scopeForCompilationUnit(node);
+    }
+    AstNode parent = node.parent;
+    if (parent == null) {
+      throw new AnalysisException(
+          "Cannot create scope: node is not part of a CompilationUnit");
+    }
+    Scope scope = _scopeForAstNode(parent);
+    if (node is ClassDeclaration) {
+      _enclosingClassDeclaration = node;
+      _enclosingClass = node.element;
+      if (_enclosingClass == null) {
+        throw new AnalysisException(
+            "Cannot build a scope for an unresolved class");
+      }
+      scope = new ClassScope(
+          new TypeParameterScope(scope, _enclosingClass), _enclosingClass);
+    } else if (node is ClassTypeAlias) {
+      ClassElement element = node.element;
+      if (element == null) {
+        throw new AnalysisException(
+            "Cannot build a scope for an unresolved class type alias");
+      }
+      scope = new ClassScope(new TypeParameterScope(scope, element), element);
+    } else if (node is ConstructorDeclaration) {
+      ConstructorElement element = node.element;
+      if (element == null) {
+        throw new AnalysisException(
+            "Cannot build a scope for an unresolved constructor");
+      }
+      FunctionScope functionScope = new FunctionScope(scope, element);
+      functionScope.defineParameters();
+      scope = functionScope;
+    } else if (node is FunctionDeclaration) {
+      ExecutableElement element = node.element;
+      if (element == null) {
+        throw new AnalysisException(
+            "Cannot build a scope for an unresolved function");
+      }
+      FunctionScope functionScope = new FunctionScope(scope, element);
+      functionScope.defineParameters();
+      scope = functionScope;
+    } else if (node is FunctionTypeAlias) {
+      scope = new FunctionTypeScope(scope, node.element);
+    } else if (node is MethodDeclaration) {
+      ExecutableElement element = node.element;
+      if (element == null) {
+        throw new AnalysisException(
+            "Cannot build a scope for an unresolved method");
+      }
+      FunctionScope functionScope = new FunctionScope(scope, element);
+      functionScope.defineParameters();
+      scope = functionScope;
+    }
+    return scope;
+  }
+
+  Scope _scopeForCompilationUnit(CompilationUnit node) {
+    _enclosingUnit = node.element;
+    if (_enclosingUnit == null) {
+      throw new AnalysisException(
+          "Cannot create scope: compilation unit is not resolved");
+    }
+    LibraryElement libraryElement = _enclosingUnit.library;
+    if (libraryElement == null) {
+      throw new AnalysisException(
+          "Cannot create scope: compilation unit is not part of a library");
+    }
+    return new LibraryScope(libraryElement, _errorListener);
+  }
+
+  /**
+   * Return the context in which the given AST structure should be resolved.
+   *
+   * [node] - the root of the AST structure to be resolved.
+   * [errorListener] - the listener to which analysis errors will be reported.
+   *
+   * Throws [AnalysisException] if the AST structure has not been resolved or
+   * is not part of a [CompilationUnit]
+   */
+  static ResolutionContext contextFor(
+      AstNode node, AnalysisErrorListener errorListener) {
+    if (node == null) {
+      throw new AnalysisException("Cannot create context: node is null");
+    }
+    // build scope
+    ResolutionContextBuilder builder =
+        new ResolutionContextBuilder(errorListener);
+    Scope scope = builder._scopeFor(node);
+    // prepare context
+    ResolutionContext context = new ResolutionContext();
+    context.scope = scope;
+    context.enclosingUnit = builder._enclosingUnit;
+    context.enclosingClassDeclaration = builder._enclosingClassDeclaration;
+    context.enclosingClass = builder._enclosingClass;
+    return context;
+  }
+}
+
+/**
+ * Instances of the class [_DeclarationMismatchException] represent an exception
+ * that is thrown when the element model defined by a given AST structure does
+ * not match an existing element model.
+ */
+class _DeclarationMismatchException {}
+
+class _ElementNameOffsetUpdater extends GeneralizingElementVisitor {
+  final int updateOffset;
+  final int updateDelta;
+
+  _ElementNameOffsetUpdater(this.updateOffset, this.updateDelta);
+
+  @override
+  visitElement(Element element) {
+    int nameOffset = element.nameOffset;
+    if (nameOffset > updateOffset) {
+      (element as ElementImpl).nameOffset = nameOffset + updateDelta;
+    }
+    super.visitElement(element);
+  }
+}
+
+class _ElementsGatherer extends GeneralizingElementVisitor {
+  final DeclarationMatcher matcher;
+
+  _ElementsGatherer(this.matcher);
+
+  void addElements(List<Element> elements) {
+    for (Element element in elements) {
+      if (!element.isSynthetic) {
+        _addElement(element);
+      }
+    }
+  }
+
+  @override
+  visitElement(Element element) {
+    _addElement(element);
+    super.visitElement(element);
+  }
+
+  @override
+  visitExecutableElement(ExecutableElement element) {
+    _addElement(element);
+  }
+
+  @override
+  visitParameterElement(ParameterElement element) {}
+
+  @override
+  visitPropertyAccessorElement(PropertyAccessorElement element) {
+    if (!element.isSynthetic) {
+      _addElement(element);
+    }
+    // Don't visit children (such as synthetic setter parameters).
+  }
+
+  @override
+  visitPropertyInducingElement(PropertyInducingElement element) {
+    if (!element.isSynthetic) {
+      _addElement(element);
+    }
+    // Don't visit children (such as property accessors).
+  }
+
+  @override
+  visitTypeParameterElement(TypeParameterElement element) {}
+
+  void _addElement(Element element) {
+    if (element != null) {
+      matcher._allElements.add(element);
+      matcher._removedElements.add(element);
+    }
+  }
+}
+
+/**
+ * Describes how two [Token]s are different.
+ */
+class _TokenDifferenceKind {
+  static const COMMENT = const _TokenDifferenceKind('COMMENT');
+  static const COMMENT_DOC = const _TokenDifferenceKind('COMMENT_DOC');
+  static const CONTENT = const _TokenDifferenceKind('CONTENT');
+  static const OFFSET = const _TokenDifferenceKind('OFFSET');
+
+  final String name;
+
+  const _TokenDifferenceKind(this.name);
+
+  @override
+  String toString() => name;
+}
+
+class _TokenPair {
+  final _TokenDifferenceKind kind;
+  final Token oldToken;
+  final Token newToken;
+  _TokenPair(this.kind, this.oldToken, this.newToken);
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/incremental_scanner.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/incremental_scanner.dart
new file mode 100644
index 0000000..a2e4daf
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/incremental_scanner.dart
@@ -0,0 +1,248 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.incremental_scanner;
+
+import "dart:math" as math;
+
+import 'package:analyzer/src/generated/engine.dart';
+
+import 'error.dart';
+import 'scanner.dart';
+import 'source.dart';
+import 'utilities_collection.dart' show TokenMap;
+
+/**
+ * An `IncrementalScanner` is a scanner that scans a subset of a string and
+ * inserts the resulting tokens into the middle of an existing token stream.
+ */
+class IncrementalScanner {
+  /**
+   * The source being scanned.
+   */
+  final Source source;
+
+  /**
+   * The reader used to access the characters in the source.
+   */
+  final CharacterReader reader;
+
+  /**
+   * The error listener that will be informed of any errors that are found
+   * during the scan.
+   *
+   * TODO(brianwilkerson) Replace this with a list of errors so that we can
+   * update the errors.
+   */
+  final AnalysisErrorListener errorListener;
+
+  final AnalysisOptions _options;
+
+  /**
+   * A map from tokens that were copied to the copies of the tokens.
+   */
+  TokenMap _tokenMap = new TokenMap();
+
+  /**
+   * The token immediately to the left of the range of tokens that were
+   * modified.
+   */
+  Token leftToken;
+
+  /**
+   * The token immediately to the right of the range of tokens that were
+   * modified.
+   */
+  Token rightToken;
+
+  /**
+   * A flag indicating whether there were any non-comment tokens changed (other
+   * than having their position updated) as a result of the modification.
+   */
+  bool hasNonWhitespaceChange = false;
+
+  /**
+   * Initialize a newly created scanner to scan characters within the given
+   * [source]. The content of the source can be read using the given [reader].
+   * Any errors that are found will be reported to the given [errorListener].
+   * [_options] will determine how scanning is to be performed.
+   */
+  IncrementalScanner(
+      this.source, this.reader, this.errorListener, this._options);
+
+  /**
+   * Return a map from tokens that were copied to the copies of the tokens.
+   *
+   * @return a map from tokens that were copied to the copies of the tokens
+   */
+  TokenMap get tokenMap => _tokenMap;
+
+  /**
+   * Given the [stream] of tokens scanned from the original source, the modified
+   * source (the result of replacing one contiguous range of characters with
+   * another string of characters), and a specification of the modification that
+   * was made, update the token stream to reflect the modified source. Return
+   * the first token in the updated token stream.
+   *
+   * The [stream] is expected to be the first non-EOF token in the token stream.
+   *
+   * The modification is specified by the [index] of the first character in both
+   * the original and modified source that was affected by the modification, the
+   * number of characters removed from the original source (the [removedLength])
+   * and the number of characters added to the modified source (the
+   * [insertedLength]).
+   */
+  Token rescan(Token stream, int index, int removedLength, int insertedLength) {
+    Token leftEof = stream.previous;
+    //
+    // Compute the delta between the character index of characters after the
+    // modified region in the original source and the index of the corresponding
+    // character in the modified source.
+    //
+    int delta = insertedLength - removedLength;
+    //
+    // Skip past the tokens whose end is less than the replacement start. (If
+    // the replacement start is equal to the end of an existing token, then it
+    // means that the existing token might have been modified, so we need to
+    // rescan it.)
+    //
+    while (stream.type != TokenType.EOF && stream.end < index) {
+      _tokenMap.put(stream, stream);
+      stream = stream.next;
+    }
+    Token oldFirst = stream;
+    Token oldLeftToken = stream.previous;
+    leftToken = oldLeftToken;
+    //
+    // Skip past tokens until we find a token whose offset is greater than the
+    // end of the removed region. (If the end of the removed region is equal to
+    // the beginning of an existing token, then it means that the existing token
+    // might have been modified, so we need to rescan it.)
+    //
+    int removedEnd = index + (removedLength == 0 ? 0 : removedLength - 1);
+    while (stream.type != TokenType.EOF && stream.offset <= removedEnd) {
+      stream = stream.next;
+    }
+    //
+    // Figure out which region of characters actually needs to be re-scanned.
+    //
+    Token oldLast;
+    Token oldRightToken;
+    if (stream.type != TokenType.EOF && removedEnd + 1 == stream.offset) {
+      oldLast = stream;
+      stream = stream.next;
+      oldRightToken = stream;
+    } else {
+      oldLast = stream.previous;
+      oldRightToken = stream;
+    }
+    //
+    // Compute the range of characters that are known to need to be rescanned.
+    // If the index is within an existing token, then we need to start at the
+    // beginning of the token.
+    //
+    int scanStart = math.max(oldLeftToken.end, 0);
+    int scanEnd = oldRightToken.offset + delta;
+    //
+    // Rescan the characters that need to be rescanned.
+    //
+    Token replacementStart = _scanRange(scanStart, scanEnd);
+    oldLeftToken.setNext(replacementStart);
+    Token replacementEnd = _findEof(replacementStart).previous;
+    replacementEnd.setNext(stream);
+    //
+    // Apply the delta to the tokens after the last new token.
+    //
+    _updateOffsets(stream, delta);
+    rightToken = stream;
+    //
+    // If the index is immediately after an existing token and the inserted
+    // characters did not change that original token, then adjust the leftToken
+    // to be the next token. For example, in "a; c;" --> "a;b c;", the leftToken
+    // was ";", but this code advances it to "b" since "b" is the first new
+    // token.
+    //
+    Token newFirst = leftToken.next;
+    while (!identical(newFirst, rightToken) &&
+        !identical(oldFirst, oldRightToken) &&
+        newFirst.type != TokenType.EOF &&
+        _equalTokens(oldFirst, newFirst)) {
+      _tokenMap.put(oldFirst, newFirst);
+      oldLeftToken = oldFirst;
+      oldFirst = oldFirst.next;
+      leftToken = newFirst;
+      newFirst = newFirst.next;
+    }
+    Token newLast = rightToken.previous;
+    while (!identical(newLast, leftToken) &&
+        !identical(oldLast, oldLeftToken) &&
+        newLast.type != TokenType.EOF &&
+        _equalTokens(oldLast, newLast)) {
+      _tokenMap.put(oldLast, newLast);
+      oldRightToken = oldLast;
+      oldLast = oldLast.previous;
+      rightToken = newLast;
+      newLast = newLast.previous;
+    }
+    hasNonWhitespaceChange = !identical(leftToken.next, rightToken) ||
+        !identical(oldLeftToken.next, oldRightToken);
+    //
+    // TODO(brianwilkerson) Begin tokens are not getting associated with the
+    // corresponding end tokens (because the end tokens have not been copied
+    // when we're copying the begin tokens). This could have implications for
+    // parsing.
+    // TODO(brianwilkerson) Update the lineInfo.
+    //
+    return leftEof.next;
+  }
+
+  /**
+   * Return `true` if the [oldToken] and the [newToken] are equal to each other.
+   * For the purposes of the incremental scanner, two tokens are equal if they
+   * have the same type and lexeme.
+   */
+  bool _equalTokens(Token oldToken, Token newToken) =>
+      oldToken.type == newToken.type &&
+          oldToken.length == newToken.length &&
+          oldToken.lexeme == newToken.lexeme;
+
+  /**
+   * Given a [token], return the EOF token that follows the token.
+   */
+  Token _findEof(Token token) {
+    while (token.type != TokenType.EOF) {
+      token = token.next;
+    }
+    return token;
+  }
+
+  /**
+   * Scan the token between the [start] (inclusive) and [end] (exclusive)
+   * offsets.
+   */
+  Token _scanRange(int start, int end) {
+    Scanner scanner = new Scanner(
+        source, new CharacterRangeReader(reader, start, end), errorListener);
+    return scanner.tokenize();
+  }
+
+  /**
+   * Update the offsets of every token from the given [token] to the end of the
+   * stream by adding the given [delta].
+   */
+  void _updateOffsets(Token token, int delta) {
+    while (token.type != TokenType.EOF) {
+      _tokenMap.put(token, token);
+      token.offset += delta;
+      Token comment = token.precedingComments;
+      while (comment != null) {
+        comment.offset += delta;
+        comment = comment.next;
+      }
+      token = token.next;
+    }
+    _tokenMap.put(token, token);
+    token.offset += delta;
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/interner.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/interner.dart
new file mode 100644
index 0000000..9ff047b
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/interner.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library interner;
+
+import 'dart:collection';
+
+/**
+ * The interface `Interner` defines the behavior of objects that can intern
+ * strings.
+ */
+abstract class Interner {
+  /**
+   * Return a string that is identical to all of the other strings that have
+   * been interned that are equal to the given [string].
+   */
+  String intern(String string);
+}
+
+/**
+ * The class `MappedInterner` implements an interner that uses a map to manage
+ * the strings that have been interned.
+ */
+class MappedInterner implements Interner {
+  /**
+   * A table mapping strings to themselves.
+   */
+  Map<String, String> _table = new HashMap<String, String>();
+
+  @override
+  String intern(String string) {
+    String original = _table[string];
+    if (original == null) {
+      _table[string] = string;
+      return string;
+    }
+    return original;
+  }
+}
+
+/**
+ * The class `NullInterner` implements an interner that does nothing (does not
+ * actually intern any strings).
+ */
+class NullInterner implements Interner {
+  @override
+  String intern(String string) => string;
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/java_core.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/java_core.dart
new file mode 100644
index 0000000..9a0185a
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/java_core.dart
@@ -0,0 +1,440 @@
+library java.core;
+
+const int LONG_MAX_VALUE = 0x7fffffffffffffff;
+
+final Stopwatch nanoTimeStopwatch = new Stopwatch();
+
+/**
+ * Inserts the given arguments into [pattern].
+ *
+ *     format('Hello, {0}!', 'John') = 'Hello, John!'
+ *     format('{0} are you {1}ing?', 'How', 'do') = 'How are you doing?'
+ *     format('{0} are you {1}ing?', 'What', 'read') = 'What are you reading?'
+ */
+String format(String pattern,
+    [arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7]) {
+  return formatList(pattern, [arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7]);
+}
+
+/**
+ * Inserts the given [args] into [pattern].
+ *
+ *     format('Hello, {0}!', ['John']) = 'Hello, John!'
+ *     format('{0} are you {1}ing?', ['How', 'do']) = 'How are you doing?'
+ *     format('{0} are you {1}ing?', ['What', 'read']) = 'What are you reading?'
+ */
+String formatList(String pattern, List<Object> arguments) {
+  if (arguments == null || arguments.isEmpty) {
+    assert(!pattern.contains(new RegExp(r'\{(\d+)\}')));
+    return pattern;
+  }
+  return pattern.replaceAllMapped(new RegExp(r'\{(\d+)\}'), (match) {
+    String indexStr = match.group(1);
+    int index = int.parse(indexStr);
+    Object arg = arguments[index];
+    assert(arg != null);
+    return arg != null ? arg.toString() : null;
+  });
+}
+
+bool javaCollectionContainsAll(Iterable list, Iterable c) {
+  return c.fold(true, (bool prev, e) => prev && list.contains(e));
+}
+
+javaListSet(List list, int index, newValue) {
+  var oldValue = list[index];
+  list[index] = newValue;
+  return oldValue;
+}
+
+bool javaSetEquals(Set a, Set b) {
+  return a.containsAll(b) && b.containsAll(a);
+}
+
+bool javaStringEqualsIgnoreCase(String a, String b) {
+  return a.toLowerCase() == b.toLowerCase();
+}
+
+bool javaStringRegionMatches(
+    String t, int toffset, String o, int ooffset, int len) {
+  if (toffset < 0) return false;
+  if (ooffset < 0) return false;
+  var tend = toffset + len;
+  var oend = ooffset + len;
+  if (tend > t.length) return false;
+  if (oend > o.length) return false;
+  return t.substring(toffset, tend) == o.substring(ooffset, oend);
+}
+
+/// Parses given string to [Uri], throws [URISyntaxException] if invalid.
+Uri parseUriWithException(String str) {
+  Uri uri;
+  try {
+    uri = Uri.parse(str);
+  } on FormatException catch (e) {
+    throw new URISyntaxException(e.toString());
+  }
+  if (uri.path.isEmpty) {
+    throw new URISyntaxException('empty path');
+  }
+  return uri;
+}
+
+/**
+ * Very limited printf implementation, supports only %s and %d.
+ */
+String _printf(String fmt, List args) {
+  StringBuffer sb = new StringBuffer();
+  bool markFound = false;
+  int argIndex = 0;
+  for (int i = 0; i < fmt.length; i++) {
+    int c = fmt.codeUnitAt(i);
+    if (c == 0x25) {
+      if (markFound) {
+        sb.writeCharCode(c);
+        markFound = false;
+      } else {
+        markFound = true;
+      }
+      continue;
+    }
+    if (markFound) {
+      markFound = false;
+      // %d
+      if (c == 0x64) {
+        sb.write(args[argIndex++]);
+        continue;
+      }
+      // %s
+      if (c == 0x73) {
+        sb.write(args[argIndex++]);
+        continue;
+      }
+      // unknown
+      throw new IllegalArgumentException(
+          '[$fmt][$i] = 0x${c.toRadixString(16)}');
+    } else {
+      sb.writeCharCode(c);
+    }
+  }
+  return sb.toString();
+}
+
+class Character {
+  static const int MAX_VALUE = 0xffff;
+  static const int MAX_CODE_POINT = 0x10ffff;
+  static const int MIN_SUPPLEMENTARY_CODE_POINT = 0x010000;
+  static const int MIN_LOW_SURROGATE = 0xDC00;
+  static const int MIN_HIGH_SURROGATE = 0xD800;
+  static int digit(int codePoint, int radix) {
+    if (radix != 16) {
+      throw new ArgumentError("only radix == 16 is supported");
+    }
+    if (0x30 <= codePoint && codePoint <= 0x39) {
+      return codePoint - 0x30;
+    }
+    if (0x41 <= codePoint && codePoint <= 0x46) {
+      return 0xA + (codePoint - 0x41);
+    }
+    if (0x61 <= codePoint && codePoint <= 0x66) {
+      return 0xA + (codePoint - 0x61);
+    }
+    return -1;
+  }
+  static bool isDigit(int c) {
+    return c >= 0x30 && c <= 0x39;
+  }
+  static bool isLetter(int c) {
+    return c >= 0x41 && c <= 0x5A || c >= 0x61 && c <= 0x7A;
+  }
+  static bool isLetterOrDigit(int c) {
+    return isLetter(c) || isDigit(c);
+  }
+  static bool isLowerCase(int c) {
+    return c >= 0x61 && c <= 0x7A;
+  }
+  static bool isUpperCase(int c) {
+    return c >= 0x41 && c <= 0x5A;
+  }
+  static bool isWhitespace(int c) {
+    return c == 0x09 || c == 0x20 || c == 0x0A || c == 0x0D;
+  }
+  static String toChars(int codePoint) {
+    if (codePoint < 0 || codePoint > MAX_CODE_POINT) {
+      throw new IllegalArgumentException();
+    }
+    if (codePoint < MIN_SUPPLEMENTARY_CODE_POINT) {
+      return new String.fromCharCode(codePoint);
+    }
+    int offset = codePoint - MIN_SUPPLEMENTARY_CODE_POINT;
+    int c0 = ((offset & 0x7FFFFFFF) >> 10) + MIN_HIGH_SURROGATE;
+    int c1 = (offset & 0x3ff) + MIN_LOW_SURROGATE;
+    return new String.fromCharCodes([c0, c1]);
+  }
+  static int toLowerCase(int c) {
+    if (c >= 0x41 && c <= 0x5A) {
+      return 0x61 + (c - 0x41);
+    }
+    return c;
+  }
+  static int toUpperCase(int c) {
+    if (c >= 0x61 && c <= 0x7A) {
+      return 0x41 + (c - 0x61);
+    }
+    return c;
+  }
+}
+
+abstract class Enum<E extends Enum> implements Comparable<E> {
+  /// The name of this enum constant, as declared in the enum declaration.
+  final String name;
+  /// The position in the enum declaration.
+  final int ordinal;
+  const Enum(this.name, this.ordinal);
+  int get hashCode => ordinal;
+  int compareTo(E other) => ordinal - other.ordinal;
+  String toString() => name;
+}
+
+class IllegalArgumentException extends JavaException {
+  IllegalArgumentException([message = "", cause = null])
+      : super(message, cause);
+}
+
+class IllegalStateException extends JavaException {
+  IllegalStateException([message = ""]) : super(message);
+}
+
+class JavaArrays {
+  static bool equals(List a, List b) {
+    if (identical(a, b)) {
+      return true;
+    }
+    if (a.length != b.length) {
+      return false;
+    }
+    var len = a.length;
+    for (int i = 0; i < len; i++) {
+      if (a[i] != b[i]) {
+        return false;
+      }
+    }
+    return true;
+  }
+  static int makeHashCode(List a) {
+    if (a == null) {
+      return 0;
+    }
+    int result = 1;
+    for (var element in a) {
+      result = 31 * result + (element == null ? 0 : element.hashCode);
+    }
+    return result;
+  }
+}
+
+class JavaException implements Exception {
+  final String message;
+  final Exception cause;
+  JavaException([this.message = "", this.cause = null]);
+  JavaException.withCause(this.cause) : message = null;
+  String toString() => "$runtimeType: $message $cause";
+}
+
+class JavaIOException extends JavaException {
+  JavaIOException([message = "", cause = null]) : super(message, cause);
+}
+
+class JavaPatternMatcher {
+  Iterator<Match> _matches;
+  Match _match;
+  JavaPatternMatcher(RegExp re, String input) {
+    _matches = re.allMatches(input).iterator;
+  }
+  int end() => _match.end;
+  bool find() {
+    if (!_matches.moveNext()) {
+      return false;
+    }
+    _match = _matches.current;
+    return true;
+  }
+  String group(int i) => _match[i];
+  bool matches() => find();
+  int start() => _match.start;
+}
+
+class JavaString {
+  static int indexOf(String target, String str, int fromIndex) {
+    if (fromIndex > target.length) return -1;
+    if (fromIndex < 0) fromIndex = 0;
+    return target.indexOf(str, fromIndex);
+  }
+  static int lastIndexOf(String target, String str, int fromIndex) {
+    if (fromIndex > target.length) return -1;
+    if (fromIndex < 0) fromIndex = 0;
+    return target.lastIndexOf(str, fromIndex);
+  }
+  static bool startsWithBefore(String s, String other, int start) {
+    return s.indexOf(other, start) != -1;
+  }
+}
+
+class JavaSystem {
+  @deprecated
+  static void arraycopy(
+      List src, int srcPos, List dest, int destPos, int length) {
+    for (int i = 0; i < length; i++) {
+      dest[destPos + i] = src[srcPos + i];
+    }
+  }
+
+  static int currentTimeMillis() {
+    return (new DateTime.now()).millisecondsSinceEpoch;
+  }
+
+  static int nanoTime() {
+    if (!nanoTimeStopwatch.isRunning) {
+      nanoTimeStopwatch.start();
+    }
+    return nanoTimeStopwatch.elapsedMicroseconds * 1000;
+  }
+}
+
+class MissingFormatArgumentException implements Exception {
+  final String s;
+
+  MissingFormatArgumentException(this.s);
+
+  String toString() => "MissingFormatArgumentException: $s";
+}
+
+class NoSuchElementException extends JavaException {
+  String toString() => "NoSuchElementException";
+}
+
+class NotImplementedException extends JavaException {
+  NotImplementedException(message) : super(message);
+}
+
+class NumberFormatException extends JavaException {
+  String toString() => "NumberFormatException";
+}
+
+class PrintStringWriter extends PrintWriter {
+  final StringBuffer _sb = new StringBuffer();
+
+  void print(x) {
+    _sb.write(x);
+  }
+
+  String toString() => _sb.toString();
+}
+
+abstract class PrintWriter {
+  void newLine() {
+    this.print('\n');
+  }
+
+  void print(x);
+
+  void printf(String fmt, List args) {
+    this.print(_printf(fmt, args));
+  }
+
+  void println(String s) {
+    this.print(s);
+    this.newLine();
+  }
+}
+
+class RuntimeException extends JavaException {
+  RuntimeException({String message: "", Exception cause: null})
+      : super(message, cause);
+}
+
+class StringIndexOutOfBoundsException extends JavaException {
+  StringIndexOutOfBoundsException(int index) : super('$index');
+}
+
+class StringUtils {
+  static String capitalize(String str) {
+    if (isEmpty(str)) {
+      return str;
+    }
+    return str.substring(0, 1).toUpperCase() + str.substring(1);
+  }
+
+  static bool equals(String cs1, String cs2) {
+    if (cs1 == cs2) {
+      return true;
+    }
+    if (cs1 == null || cs2 == null) {
+      return false;
+    }
+    return cs1 == cs2;
+  }
+
+  static bool isEmpty(String str) {
+    return str == null || str.isEmpty;
+  }
+
+  static String join(Iterable iter,
+      [String separator = ' ', int start = 0, int end = -1]) {
+    if (start != 0) {
+      iter = iter.skip(start);
+    }
+    if (end != -1) {
+      iter = iter.take(end - start);
+    }
+    return iter.join(separator);
+  }
+
+  static void printf(StringBuffer buffer, String fmt, List args) {
+    buffer.write(_printf(fmt, args));
+  }
+
+  static String remove(String str, String remove) {
+    if (isEmpty(str) || isEmpty(remove)) {
+      return str;
+    }
+    return str.replaceAll(remove, '');
+  }
+
+  static String removeStart(String str, String remove) {
+    if (isEmpty(str) || isEmpty(remove)) {
+      return str;
+    }
+    if (str.startsWith(remove)) {
+      return str.substring(remove.length);
+    }
+    return str;
+  }
+
+  static String repeat(String s, int n) {
+    StringBuffer sb = new StringBuffer();
+    for (int i = 0; i < n; i++) {
+      sb.write(s);
+    }
+    return sb.toString();
+  }
+
+  static List<String> split(String s, [String pattern = ' ']) {
+    return s.split(pattern);
+  }
+
+  static List<String> splitByWholeSeparatorPreserveAllTokens(
+      String s, String pattern) {
+    return s.split(pattern);
+  }
+}
+
+class UnsupportedOperationException extends JavaException {
+  UnsupportedOperationException([message = ""]) : super(message);
+}
+
+class URISyntaxException implements Exception {
+  final String message;
+  URISyntaxException(this.message);
+  String toString() => "URISyntaxException: $message";
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/java_engine.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/java_engine.dart
new file mode 100644
index 0000000..98ff8e4
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/java_engine.dart
@@ -0,0 +1,331 @@
+library java.engine;
+
+import 'interner.dart';
+import 'java_core.dart';
+
+/**
+ * A predicate is a one-argument function that returns a boolean value.
+ */
+typedef bool Predicate<E>(E argument);
+
+/**
+ * Instances of the class `AnalysisException` represent an exception that
+ * occurred during the analysis of one or more sources.
+ */
+class AnalysisException implements Exception {
+  /**
+   * The message that explains why the exception occurred.
+   */
+  final String message;
+
+  /**
+   * The exception that caused this exception, or `null` if this exception was
+   * not caused by another exception.
+   */
+  final CaughtException cause;
+
+  /**
+   * Initialize a newly created exception to have the given [message] and
+   * [cause].
+   */
+  AnalysisException([this.message = 'Exception', this.cause = null]);
+
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("AnalysisException: ");
+    buffer.writeln(message);
+    if (cause != null) {
+      buffer.write('Caused by ');
+      cause._writeOn(buffer);
+    }
+    return buffer.toString();
+  }
+}
+
+/**
+ * Instances of the class `CaughtException` represent an exception that was
+ * caught and has an associated stack trace.
+ */
+class CaughtException implements Exception {
+  /**
+   * The exception that was caught.
+   */
+  final Object exception;
+
+  /**
+   * The stack trace associated with the exception.
+   */
+  StackTrace stackTrace;
+
+  /**
+   * Initialize a newly created caught exception to have the given [exception]
+   * and [stackTrace].
+   */
+  CaughtException(this.exception, stackTrace) {
+    if (stackTrace == null) {
+      try {
+        throw this;
+      } catch (_, st) {
+        stackTrace = st;
+      }
+    }
+    this.stackTrace = stackTrace;
+  }
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    _writeOn(buffer);
+    return buffer.toString();
+  }
+
+  /**
+   * Write a textual representation of the caught exception and its associated
+   * stack trace.
+   */
+  void _writeOn(StringBuffer buffer) {
+    if (exception is AnalysisException) {
+      AnalysisException analysisException = exception;
+      buffer.writeln(analysisException.message);
+      if (stackTrace != null) {
+        buffer.writeln(stackTrace.toString());
+      }
+      CaughtException cause = analysisException.cause;
+      if (cause != null) {
+        buffer.write('Caused by ');
+        cause._writeOn(buffer);
+      }
+    } else {
+      buffer.writeln(exception.toString());
+      buffer.writeln(stackTrace.toString());
+    }
+  }
+}
+
+class FileNameUtilities {
+  static String getExtension(String fileName) {
+    if (fileName == null) {
+      return "";
+    }
+    int index = fileName.lastIndexOf('.');
+    if (index >= 0) {
+      return fileName.substring(index + 1);
+    }
+    return "";
+  }
+}
+
+class StringUtilities {
+  static const String EMPTY = '';
+  static const List<String> EMPTY_ARRAY = const <String>[];
+
+  static Interner INTERNER = new NullInterner();
+
+  static endsWith3(String str, int c1, int c2, int c3) {
+    var length = str.length;
+    return length >= 3 &&
+        str.codeUnitAt(length - 3) == c1 &&
+        str.codeUnitAt(length - 2) == c2 &&
+        str.codeUnitAt(length - 1) == c3;
+  }
+  static endsWithChar(String str, int c) {
+    int length = str.length;
+    return length > 0 && str.codeUnitAt(length - 1) == c;
+  }
+  static int indexOf1(String str, int start, int c) {
+    int index = start;
+    int last = str.length;
+    while (index < last) {
+      if (str.codeUnitAt(index) == c) {
+        return index;
+      }
+      index++;
+    }
+    return -1;
+  }
+  static int indexOf2(String str, int start, int c1, int c2) {
+    int index = start;
+    int last = str.length - 1;
+    while (index < last) {
+      if (str.codeUnitAt(index) == c1 && str.codeUnitAt(index + 1) == c2) {
+        return index;
+      }
+      index++;
+    }
+    return -1;
+  }
+  static int indexOf4(
+      String string, int start, int c1, int c2, int c3, int c4) {
+    int index = start;
+    int last = string.length - 3;
+    while (index < last) {
+      if (string.codeUnitAt(index) == c1 &&
+          string.codeUnitAt(index + 1) == c2 &&
+          string.codeUnitAt(index + 2) == c3 &&
+          string.codeUnitAt(index + 3) == c4) {
+        return index;
+      }
+      index++;
+    }
+    return -1;
+  }
+  static int indexOf5(
+      String str, int start, int c1, int c2, int c3, int c4, int c5) {
+    int index = start;
+    int last = str.length - 4;
+    while (index < last) {
+      if (str.codeUnitAt(index) == c1 &&
+          str.codeUnitAt(index + 1) == c2 &&
+          str.codeUnitAt(index + 2) == c3 &&
+          str.codeUnitAt(index + 3) == c4 &&
+          str.codeUnitAt(index + 4) == c5) {
+        return index;
+      }
+      index++;
+    }
+    return -1;
+  }
+
+  /**
+   * Return the index of the first not letter/digit character in the [string]
+   * that is at or after the [startIndex]. Return the length of the [string] if
+   * all characters to the end are letters/digits.
+   */
+  static int indexOfFirstNotLetterDigit(String string, int startIndex) {
+    int index = startIndex;
+    int last = string.length;
+    while (index < last) {
+      int c = string.codeUnitAt(index);
+      if (!Character.isLetterOrDigit(c)) {
+        return index;
+      }
+      index++;
+    }
+    return last;
+  }
+  static String intern(String string) => INTERNER.intern(string);
+  static bool isEmpty(String s) {
+    return s == null || s.isEmpty;
+  }
+  static bool isTagName(String s) {
+    if (s == null || s.length == 0) {
+      return false;
+    }
+    int sz = s.length;
+    for (int i = 0; i < sz; i++) {
+      int c = s.codeUnitAt(i);
+      if (!Character.isLetter(c)) {
+        if (i == 0) {
+          return false;
+        }
+        if (!Character.isDigit(c) && c != 0x2D) {
+          return false;
+        }
+      }
+    }
+    return true;
+  }
+  /**
+   * Produce a string containing all of the names in the given array, surrounded by single quotes,
+   * and separated by commas. The list must contain at least two elements.
+   *
+   * @param names the names to be printed
+   * @return the result of printing the names
+   */
+  static String printListOfQuotedNames(List<String> names) {
+    if (names == null) {
+      throw new IllegalArgumentException("The list must not be null");
+    }
+    int count = names.length;
+    if (count < 2) {
+      throw new IllegalArgumentException(
+          "The list must contain at least two names");
+    }
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("'");
+    buffer.write(names[0]);
+    buffer.write("'");
+    for (int i = 1; i < count - 1; i++) {
+      buffer.write(", '");
+      buffer.write(names[i]);
+      buffer.write("'");
+    }
+    buffer.write(" and '");
+    buffer.write(names[count - 1]);
+    buffer.write("'");
+    return buffer.toString();
+  }
+  static startsWith2(String str, int start, int c1, int c2) {
+    return str.length - start >= 2 &&
+        str.codeUnitAt(start) == c1 &&
+        str.codeUnitAt(start + 1) == c2;
+  }
+  static startsWith3(String str, int start, int c1, int c2, int c3) {
+    return str.length - start >= 3 &&
+        str.codeUnitAt(start) == c1 &&
+        str.codeUnitAt(start + 1) == c2 &&
+        str.codeUnitAt(start + 2) == c3;
+  }
+  static startsWith4(String str, int start, int c1, int c2, int c3, int c4) {
+    return str.length - start >= 4 &&
+        str.codeUnitAt(start) == c1 &&
+        str.codeUnitAt(start + 1) == c2 &&
+        str.codeUnitAt(start + 2) == c3 &&
+        str.codeUnitAt(start + 3) == c4;
+  }
+  static startsWith5(
+      String str, int start, int c1, int c2, int c3, int c4, int c5) {
+    return str.length - start >= 5 &&
+        str.codeUnitAt(start) == c1 &&
+        str.codeUnitAt(start + 1) == c2 &&
+        str.codeUnitAt(start + 2) == c3 &&
+        str.codeUnitAt(start + 3) == c4 &&
+        str.codeUnitAt(start + 4) == c5;
+  }
+  static startsWith6(
+      String str, int start, int c1, int c2, int c3, int c4, int c5, int c6) {
+    return str.length - start >= 6 &&
+        str.codeUnitAt(start) == c1 &&
+        str.codeUnitAt(start + 1) == c2 &&
+        str.codeUnitAt(start + 2) == c3 &&
+        str.codeUnitAt(start + 3) == c4 &&
+        str.codeUnitAt(start + 4) == c5 &&
+        str.codeUnitAt(start + 5) == c6;
+  }
+  static startsWithChar(String str, int c) {
+    return str.length != 0 && str.codeUnitAt(0) == c;
+  }
+
+  static String substringBefore(String str, String separator) {
+    if (str == null || str.isEmpty) {
+      return str;
+    }
+    if (separator == null) {
+      return str;
+    }
+    int pos = str.indexOf(separator);
+    if (pos < 0) {
+      return str;
+    }
+    return str.substring(0, pos);
+  }
+
+  static String substringBeforeChar(String str, int c) {
+    if (isEmpty(str)) {
+      return str;
+    }
+    int pos = indexOf1(str, 0, c);
+    if (pos < 0) {
+      return str;
+    }
+    return str.substring(0, pos);
+  }
+}
+
+class UUID {
+  static int __nextId = 0;
+  final String id;
+  UUID(this.id);
+  String toString() => id;
+  static UUID randomUUID() => new UUID((__nextId).toString());
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/java_engine_io.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/java_engine_io.dart
new file mode 100644
index 0000000..749695a
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/java_engine_io.dart
@@ -0,0 +1,16 @@
+library java.engine.io;
+
+import "dart:io";
+import "java_io.dart";
+
+class OSUtilities {
+  static String LINE_SEPARATOR = isWindows() ? '\r\n' : '\n';
+  static bool isWindows() => Platform.operatingSystem == 'windows';
+  static bool isMac() => Platform.operatingSystem == 'macos';
+}
+
+class FileUtilities2 {
+  static JavaFile createFile(String path) {
+    return new JavaFile(path).getAbsoluteFile();
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/java_io.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/java_io.dart
new file mode 100644
index 0000000..000746f
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/java_io.dart
@@ -0,0 +1,160 @@
+library java.io;
+
+import "dart:io";
+
+import 'package:path/path.dart' as path;
+
+import 'java_core.dart' show JavaIOException;
+
+class JavaFile {
+  static path.Context pathContext = path.context;
+  static final String separator = Platform.pathSeparator;
+  static final int separatorChar = Platform.pathSeparator.codeUnitAt(0);
+  String _path;
+  JavaFile(String path) {
+    _path = path;
+  }
+  JavaFile.fromUri(Uri uri) : this(pathContext.fromUri(uri));
+  JavaFile.relative(JavaFile base, String child) {
+    if (child.isEmpty) {
+      this._path = base._path;
+    } else {
+      this._path = pathContext.join(base._path, child);
+    }
+  }
+  int get hashCode => _path.hashCode;
+  bool operator ==(other) {
+    return other is JavaFile && other._path == _path;
+  }
+
+  bool exists() {
+    if (_newFile().existsSync()) {
+      return true;
+    }
+    if (_newDirectory().existsSync()) {
+      return true;
+    }
+    return false;
+  }
+
+  JavaFile getAbsoluteFile() => new JavaFile(getAbsolutePath());
+  String getAbsolutePath() {
+    String path = pathContext.absolute(_path);
+    path = pathContext.normalize(path);
+    return path;
+  }
+
+  JavaFile getCanonicalFile() => new JavaFile(getCanonicalPath());
+  String getCanonicalPath() {
+    try {
+      return _newFile().resolveSymbolicLinksSync();
+    } catch (e) {
+      throw new JavaIOException('IOException', e);
+    }
+  }
+
+  String getName() => pathContext.basename(_path);
+  String getParent() {
+    var result = pathContext.dirname(_path);
+    // "." or  "/" or  "C:\"
+    if (result.length < 4) return null;
+    return result;
+  }
+
+  JavaFile getParentFile() {
+    var parent = getParent();
+    if (parent == null) return null;
+    return new JavaFile(parent);
+  }
+
+  String getPath() => _path;
+  bool isDirectory() {
+    return _newDirectory().existsSync();
+  }
+
+  bool isExecutable() {
+    return _newFile().statSync().mode & 0x111 != 0;
+  }
+
+  bool isFile() {
+    return _newFile().existsSync();
+  }
+
+  int lastModified() {
+    try {
+      return _newFile().lastModifiedSync().millisecondsSinceEpoch;
+    } catch (exception) {
+      return -1;
+    }
+  }
+
+  List<JavaFile> listFiles() {
+    var files = <JavaFile>[];
+    var entities = _newDirectory().listSync();
+    for (FileSystemEntity entity in entities) {
+      files.add(new JavaFile(entity.path));
+    }
+    return files;
+  }
+
+  String readAsStringSync() => _newFile().readAsStringSync();
+  String toString() => _path.toString();
+  Uri toURI() {
+    String path = getAbsolutePath();
+    return pathContext.toUri(path);
+  }
+
+  Directory _newDirectory() => new Directory(_path);
+  File _newFile() => new File(_path);
+}
+
+class JavaSystemIO {
+  static Map<String, String> _properties = new Map();
+  static String getenv(String name) => Platform.environment[name];
+  static String getProperty(String name) {
+    {
+      String value = _properties[name];
+      if (value != null) {
+        return value;
+      }
+    }
+    if (name == 'os.name') {
+      return Platform.operatingSystem;
+    }
+    if (name == 'line.separator') {
+      if (Platform.isWindows) {
+        return '\r\n';
+      }
+      return '\n';
+    }
+    if (name == 'com.google.dart.sdk') {
+      String exec = Platform.executable;
+      if (exec.length != 0) {
+        String sdkPath;
+        // may be "xcodebuild/ReleaseIA32/dart" with "sdk" sibling
+        {
+          var outDir =
+              JavaFile.pathContext.dirname(JavaFile.pathContext.dirname(exec));
+          sdkPath = JavaFile.pathContext
+              .join(JavaFile.pathContext.dirname(outDir), "sdk");
+          if (new Directory(sdkPath).existsSync()) {
+            _properties[name] = sdkPath;
+            return sdkPath;
+          }
+        }
+        // probably be "dart-sdk/bin/dart"
+        sdkPath =
+            JavaFile.pathContext.dirname(JavaFile.pathContext.dirname(exec));
+        _properties[name] = sdkPath;
+        return sdkPath;
+      }
+    }
+    return null;
+  }
+
+  static String setProperty(String name, String value) {
+    String oldValue = _properties[name];
+    _properties[name] = value;
+    return oldValue;
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/parser.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/parser.dart
new file mode 100644
index 0000000..47a4bc1
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/parser.dart
@@ -0,0 +1,10679 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.parser;
+
+import 'dart:collection';
+import "dart:math" as math;
+
+import 'ast.dart';
+import 'engine.dart' show AnalysisEngine, AnalysisOptionsImpl;
+import 'error.dart';
+import 'java_core.dart';
+import 'java_engine.dart';
+import 'scanner.dart';
+import 'source.dart';
+import 'utilities_collection.dart' show TokenMap;
+import 'utilities_dart.dart';
+
+Map<String, MethodTrampoline> methodTable_Parser = <String, MethodTrampoline>{
+  'parseCompilationUnit_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target.parseCompilationUnit(arg0)),
+  'parseDirectives_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target.parseDirectives(arg0)),
+  'parseExpression_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target.parseExpression(arg0)),
+  'parseStatement_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target.parseStatement(arg0)),
+  'parseStatements_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target.parseStatements(arg0)),
+  'parseAnnotation_0':
+      new MethodTrampoline(0, (Parser target) => target.parseAnnotation()),
+  'parseArgument_0':
+      new MethodTrampoline(0, (Parser target) => target.parseArgument()),
+  'parseArgumentList_0':
+      new MethodTrampoline(0, (Parser target) => target.parseArgumentList()),
+  'parseBitwiseOrExpression_0': new MethodTrampoline(
+      0, (Parser target) => target.parseBitwiseOrExpression()),
+  'parseBlock_0':
+      new MethodTrampoline(0, (Parser target) => target.parseBlock()),
+  'parseClassMember_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target.parseClassMember(arg0)),
+  'parseCompilationUnit_0': new MethodTrampoline(
+      0, (Parser target) => target.parseCompilationUnit2()),
+  'parseConditionalExpression_0': new MethodTrampoline(
+      0, (Parser target) => target.parseConditionalExpression()),
+  'parseConstructorName_0':
+      new MethodTrampoline(0, (Parser target) => target.parseConstructorName()),
+  'parseExpression_0':
+      new MethodTrampoline(0, (Parser target) => target.parseExpression2()),
+  'parseExpressionWithoutCascade_0': new MethodTrampoline(
+      0, (Parser target) => target.parseExpressionWithoutCascade()),
+  'parseExtendsClause_0':
+      new MethodTrampoline(0, (Parser target) => target.parseExtendsClause()),
+  'parseFormalParameterList_0': new MethodTrampoline(
+      0, (Parser target) => target.parseFormalParameterList()),
+  'parseFunctionExpression_0': new MethodTrampoline(
+      0, (Parser target) => target.parseFunctionExpression()),
+  'parseImplementsClause_0': new MethodTrampoline(
+      0, (Parser target) => target.parseImplementsClause()),
+  'parseLabel_0':
+      new MethodTrampoline(0, (Parser target) => target.parseLabel()),
+  'parseLibraryIdentifier_0': new MethodTrampoline(
+      0, (Parser target) => target.parseLibraryIdentifier()),
+  'parseLogicalOrExpression_0': new MethodTrampoline(
+      0, (Parser target) => target.parseLogicalOrExpression()),
+  'parseMapLiteralEntry_0':
+      new MethodTrampoline(0, (Parser target) => target.parseMapLiteralEntry()),
+  'parseNormalFormalParameter_0': new MethodTrampoline(
+      0, (Parser target) => target.parseNormalFormalParameter()),
+  'parsePrefixedIdentifier_0': new MethodTrampoline(
+      0, (Parser target) => target.parsePrefixedIdentifier()),
+  'parseReturnType_0':
+      new MethodTrampoline(0, (Parser target) => target.parseReturnType()),
+  'parseSimpleIdentifier_0': new MethodTrampoline(
+      0, (Parser target) => target.parseSimpleIdentifier()),
+  'parseStatement_0':
+      new MethodTrampoline(0, (Parser target) => target.parseStatement2()),
+  'parseStringLiteral_0':
+      new MethodTrampoline(0, (Parser target) => target.parseStringLiteral()),
+  'parseTypeArgumentList_0': new MethodTrampoline(
+      0, (Parser target) => target.parseTypeArgumentList()),
+  'parseTypeName_0':
+      new MethodTrampoline(0, (Parser target) => target.parseTypeName()),
+  'parseTypeParameter_0':
+      new MethodTrampoline(0, (Parser target) => target.parseTypeParameter()),
+  'parseTypeParameterList_0': new MethodTrampoline(
+      0, (Parser target) => target.parseTypeParameterList()),
+  'parseWithClause_0':
+      new MethodTrampoline(0, (Parser target) => target.parseWithClause()),
+  'advance_0': new MethodTrampoline(0, (Parser target) => target._advance()),
+  'appendScalarValue_5': new MethodTrampoline(5, (Parser target, arg0, arg1,
+      arg2, arg3,
+      arg4) => target._appendScalarValue(arg0, arg1, arg2, arg3, arg4)),
+  'computeStringValue_3': new MethodTrampoline(3, (Parser target, arg0, arg1,
+      arg2) => target._computeStringValue(arg0, arg1, arg2)),
+  'convertToFunctionDeclaration_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._convertToFunctionDeclaration(arg0)),
+  'couldBeStartOfCompilationUnitMember_0': new MethodTrampoline(
+      0, (Parser target) => target._couldBeStartOfCompilationUnitMember()),
+  'createSyntheticIdentifier_0': new MethodTrampoline(
+      0, (Parser target) => target._createSyntheticIdentifier()),
+  'createSyntheticKeyword_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._createSyntheticKeyword(arg0)),
+  'createSyntheticStringLiteral_0': new MethodTrampoline(
+      0, (Parser target) => target._createSyntheticStringLiteral()),
+  'createSyntheticToken_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._createSyntheticToken(arg0)),
+  'ensureAssignable_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._ensureAssignable(arg0)),
+  'expect_1':
+      new MethodTrampoline(1, (Parser target, arg0) => target._expect(arg0)),
+  'expectGt_0': new MethodTrampoline(0, (Parser target) => target._expectGt()),
+  'expectKeyword_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._expectKeyword(arg0)),
+  'expectSemicolon_0':
+      new MethodTrampoline(0, (Parser target) => target._expectSemicolon()),
+  'findRange_2': new MethodTrampoline(
+      2, (Parser target, arg0, arg1) => target._findRange(arg0, arg1)),
+  'getCodeBlockRanges_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._getCodeBlockRanges(arg0)),
+  'getEndToken_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._getEndToken(arg0)),
+  'injectToken_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._injectToken(arg0)),
+  'isFunctionDeclaration_0': new MethodTrampoline(
+      0, (Parser target) => target._isFunctionDeclaration()),
+  'isFunctionExpression_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._isFunctionExpression(arg0)),
+  'isHexDigit_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._isHexDigit(arg0)),
+  'isInitializedVariableDeclaration_0': new MethodTrampoline(
+      0, (Parser target) => target._isInitializedVariableDeclaration()),
+  'isLinkText_2': new MethodTrampoline(
+      2, (Parser target, arg0, arg1) => target._isLinkText(arg0, arg1)),
+  'isOperator_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._isOperator(arg0)),
+  'isSwitchMember_0':
+      new MethodTrampoline(0, (Parser target) => target._isSwitchMember()),
+  'isTypedIdentifier_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._isTypedIdentifier(arg0)),
+  'lockErrorListener_0':
+      new MethodTrampoline(0, (Parser target) => target._lockErrorListener()),
+  'matches_1':
+      new MethodTrampoline(1, (Parser target, arg0) => target._matches(arg0)),
+  'matchesGt_0':
+      new MethodTrampoline(0, (Parser target) => target._matchesGt()),
+  'matchesIdentifier_0':
+      new MethodTrampoline(0, (Parser target) => target._matchesIdentifier()),
+  'matchesKeyword_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._matchesKeyword(arg0)),
+  'matchesString_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._matchesString(arg0)),
+  'optional_1':
+      new MethodTrampoline(1, (Parser target, arg0) => target._optional(arg0)),
+  'parseAdditiveExpression_0': new MethodTrampoline(
+      0, (Parser target) => target._parseAdditiveExpression()),
+  'parseAssertStatement_0': new MethodTrampoline(
+      0, (Parser target) => target._parseAssertStatement()),
+  'parseAssignableExpression_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._parseAssignableExpression(arg0)),
+  'parseAssignableSelector_2': new MethodTrampoline(2, (Parser target, arg0,
+      arg1) => target._parseAssignableSelector(arg0, arg1)),
+  'parseAwaitExpression_0': new MethodTrampoline(
+      0, (Parser target) => target._parseAwaitExpression()),
+  'parseBitwiseAndExpression_0': new MethodTrampoline(
+      0, (Parser target) => target._parseBitwiseAndExpression()),
+  'parseBitwiseXorExpression_0': new MethodTrampoline(
+      0, (Parser target) => target._parseBitwiseXorExpression()),
+  'parseBreakStatement_0':
+      new MethodTrampoline(0, (Parser target) => target._parseBreakStatement()),
+  'parseCascadeSection_0':
+      new MethodTrampoline(0, (Parser target) => target._parseCascadeSection()),
+  'parseClassDeclaration_2': new MethodTrampoline(2,
+      (Parser target, arg0, arg1) => target._parseClassDeclaration(arg0, arg1)),
+  'parseClassMembers_2': new MethodTrampoline(
+      2, (Parser target, arg0, arg1) => target._parseClassMembers(arg0, arg1)),
+  'parseClassTypeAlias_3': new MethodTrampoline(3, (Parser target, arg0, arg1,
+      arg2) => target._parseClassTypeAlias(arg0, arg1, arg2)),
+  'parseCombinator_0':
+      new MethodTrampoline(0, (Parser target) => target.parseCombinator()),
+  'parseCombinators_0':
+      new MethodTrampoline(0, (Parser target) => target._parseCombinators()),
+  'parseCommentAndMetadata_0': new MethodTrampoline(
+      0, (Parser target) => target._parseCommentAndMetadata()),
+  'parseCommentReference_2': new MethodTrampoline(2,
+      (Parser target, arg0, arg1) => target._parseCommentReference(arg0, arg1)),
+  'parseCommentReferences_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._parseCommentReferences(arg0)),
+  'parseCompilationUnitMember_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._parseCompilationUnitMember(arg0)),
+  'parseConstExpression_0': new MethodTrampoline(
+      0, (Parser target) => target._parseConstExpression()),
+  'parseConstructor_8': new MethodTrampoline(8, (Parser target, arg0, arg1,
+          arg2, arg3, arg4, arg5, arg6, arg7) =>
+      target._parseConstructor(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7)),
+  'parseConstructorFieldInitializer_0': new MethodTrampoline(
+      0, (Parser target) => target._parseConstructorFieldInitializer()),
+  'parseContinueStatement_0': new MethodTrampoline(
+      0, (Parser target) => target._parseContinueStatement()),
+  'parseDirective_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._parseDirective(arg0)),
+  'parseDirectives_0':
+      new MethodTrampoline(0, (Parser target) => target._parseDirectives()),
+  'parseDocumentationComment_0': new MethodTrampoline(
+      0, (Parser target) => target._parseDocumentationComment()),
+  'parseDoStatement_0':
+      new MethodTrampoline(0, (Parser target) => target._parseDoStatement()),
+  'parseEmptyStatement_0':
+      new MethodTrampoline(0, (Parser target) => target._parseEmptyStatement()),
+  'parseEnumConstantDeclaration_0': new MethodTrampoline(
+      0, (Parser target) => target._parseEnumConstantDeclaration()),
+  'parseEnumDeclaration_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._parseEnumDeclaration(arg0)),
+  'parseEqualityExpression_0': new MethodTrampoline(
+      0, (Parser target) => target._parseEqualityExpression()),
+  'parseExportDirective_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._parseExportDirective(arg0)),
+  'parseExpressionList_0':
+      new MethodTrampoline(0, (Parser target) => target._parseExpressionList()),
+  'parseFinalConstVarOrType_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._parseFinalConstVarOrType(arg0)),
+  'parseFormalParameter_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._parseFormalParameter(arg0)),
+  'parseForStatement_0':
+      new MethodTrampoline(0, (Parser target) => target._parseForStatement()),
+  'parseFunctionBody_3': new MethodTrampoline(3, (Parser target, arg0, arg1,
+      arg2) => target._parseFunctionBody(arg0, arg1, arg2)),
+  'parseFunctionDeclaration_3': new MethodTrampoline(3, (Parser target, arg0,
+      arg1, arg2) => target._parseFunctionDeclaration(arg0, arg1, arg2)),
+  'parseFunctionDeclarationStatement_0': new MethodTrampoline(
+      0, (Parser target) => target._parseFunctionDeclarationStatement()),
+  'parseFunctionDeclarationStatementAfterReturnType_2': new MethodTrampoline(2,
+      (Parser target, arg0, arg1) =>
+          target._parseFunctionDeclarationStatementAfterReturnType(arg0, arg1)),
+  'parseFunctionTypeAlias_2': new MethodTrampoline(2, (Parser target, arg0,
+      arg1) => target._parseFunctionTypeAlias(arg0, arg1)),
+  'parseGetter_4': new MethodTrampoline(4, (Parser target, arg0, arg1, arg2,
+      arg3) => target._parseGetter(arg0, arg1, arg2, arg3)),
+  'parseIdentifierList_0':
+      new MethodTrampoline(0, (Parser target) => target._parseIdentifierList()),
+  'parseIfStatement_0':
+      new MethodTrampoline(0, (Parser target) => target._parseIfStatement()),
+  'parseImportDirective_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._parseImportDirective(arg0)),
+  'parseInitializedIdentifierList_4': new MethodTrampoline(4,
+      (Parser target, arg0, arg1, arg2, arg3) =>
+          target._parseInitializedIdentifierList(arg0, arg1, arg2, arg3)),
+  'parseInstanceCreationExpression_1': new MethodTrampoline(1,
+      (Parser target, arg0) => target._parseInstanceCreationExpression(arg0)),
+  'parseLibraryDirective_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._parseLibraryDirective(arg0)),
+  'parseLibraryName_2': new MethodTrampoline(
+      2, (Parser target, arg0, arg1) => target._parseLibraryName(arg0, arg1)),
+  'parseListLiteral_2': new MethodTrampoline(
+      2, (Parser target, arg0, arg1) => target._parseListLiteral(arg0, arg1)),
+  'parseListOrMapLiteral_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._parseListOrMapLiteral(arg0)),
+  'parseLogicalAndExpression_0': new MethodTrampoline(
+      0, (Parser target) => target._parseLogicalAndExpression()),
+  'parseMapLiteral_2': new MethodTrampoline(
+      2, (Parser target, arg0, arg1) => target._parseMapLiteral(arg0, arg1)),
+  'parseMethodDeclarationAfterParameters_7': new MethodTrampoline(7,
+      (Parser target, arg0, arg1, arg2, arg3, arg4, arg5, arg6) => target
+          ._parseMethodDeclarationAfterParameters(
+              arg0, arg1, arg2, arg3, arg4, arg5, arg6)),
+  'parseMethodDeclarationAfterReturnType_4': new MethodTrampoline(4,
+      (Parser target, arg0, arg1, arg2, arg3) => target
+          ._parseMethodDeclarationAfterReturnType(arg0, arg1, arg2, arg3)),
+  'parseModifiers_0':
+      new MethodTrampoline(0, (Parser target) => target._parseModifiers()),
+  'parseMultiplicativeExpression_0': new MethodTrampoline(
+      0, (Parser target) => target._parseMultiplicativeExpression()),
+  'parseNativeClause_0':
+      new MethodTrampoline(0, (Parser target) => target._parseNativeClause()),
+  'parseNewExpression_0':
+      new MethodTrampoline(0, (Parser target) => target._parseNewExpression()),
+  'parseNonLabeledStatement_0': new MethodTrampoline(
+      0, (Parser target) => target._parseNonLabeledStatement()),
+  'parseOperator_3': new MethodTrampoline(3, (Parser target, arg0, arg1,
+      arg2) => target._parseOperator(arg0, arg1, arg2)),
+  'parseOptionalReturnType_0': new MethodTrampoline(
+      0, (Parser target) => target._parseOptionalReturnType()),
+  'parsePartDirective_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._parsePartDirective(arg0)),
+  'parsePostfixExpression_0': new MethodTrampoline(
+      0, (Parser target) => target._parsePostfixExpression()),
+  'parsePrimaryExpression_0': new MethodTrampoline(
+      0, (Parser target) => target._parsePrimaryExpression()),
+  'parseRedirectingConstructorInvocation_0': new MethodTrampoline(
+      0, (Parser target) => target._parseRedirectingConstructorInvocation()),
+  'parseRelationalExpression_0': new MethodTrampoline(
+      0, (Parser target) => target._parseRelationalExpression()),
+  'parseRethrowExpression_0': new MethodTrampoline(
+      0, (Parser target) => target._parseRethrowExpression()),
+  'parseReturnStatement_0': new MethodTrampoline(
+      0, (Parser target) => target._parseReturnStatement()),
+  'parseSetter_4': new MethodTrampoline(4, (Parser target, arg0, arg1, arg2,
+      arg3) => target._parseSetter(arg0, arg1, arg2, arg3)),
+  'parseShiftExpression_0': new MethodTrampoline(
+      0, (Parser target) => target._parseShiftExpression()),
+  'parseStatementList_0':
+      new MethodTrampoline(0, (Parser target) => target._parseStatementList()),
+  'parseStringInterpolation_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._parseStringInterpolation(arg0)),
+  'parseSuperConstructorInvocation_0': new MethodTrampoline(
+      0, (Parser target) => target._parseSuperConstructorInvocation()),
+  'parseSwitchStatement_0': new MethodTrampoline(
+      0, (Parser target) => target._parseSwitchStatement()),
+  'parseSymbolLiteral_0':
+      new MethodTrampoline(0, (Parser target) => target._parseSymbolLiteral()),
+  'parseThrowExpression_0': new MethodTrampoline(
+      0, (Parser target) => target._parseThrowExpression()),
+  'parseThrowExpressionWithoutCascade_0': new MethodTrampoline(
+      0, (Parser target) => target._parseThrowExpressionWithoutCascade()),
+  'parseTryStatement_0':
+      new MethodTrampoline(0, (Parser target) => target._parseTryStatement()),
+  'parseTypeAlias_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._parseTypeAlias(arg0)),
+  'parseUnaryExpression_0': new MethodTrampoline(
+      0, (Parser target) => target._parseUnaryExpression()),
+  'parseVariableDeclaration_0': new MethodTrampoline(
+      0, (Parser target) => target._parseVariableDeclaration()),
+  'parseVariableDeclarationListAfterMetadata_1': new MethodTrampoline(1,
+      (Parser target, arg0) =>
+          target._parseVariableDeclarationListAfterMetadata(arg0)),
+  'parseVariableDeclarationListAfterType_3': new MethodTrampoline(3,
+      (Parser target, arg0, arg1, arg2) =>
+          target._parseVariableDeclarationListAfterType(arg0, arg1, arg2)),
+  'parseVariableDeclarationStatementAfterMetadata_1': new MethodTrampoline(1,
+      (Parser target, arg0) =>
+          target._parseVariableDeclarationStatementAfterMetadata(arg0)),
+  'parseVariableDeclarationStatementAfterType_3': new MethodTrampoline(3,
+      (Parser target, arg0, arg1, arg2) =>
+          target._parseVariableDeclarationStatementAfterType(arg0, arg1, arg2)),
+  'parseWhileStatement_0':
+      new MethodTrampoline(0, (Parser target) => target._parseWhileStatement()),
+  'parseYieldStatement_0':
+      new MethodTrampoline(0, (Parser target) => target._parseYieldStatement()),
+  'peek_0': new MethodTrampoline(0, (Parser target) => target._peek()),
+  'peekAt_1':
+      new MethodTrampoline(1, (Parser target, arg0) => target._peekAt(arg0)),
+  'reportError_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._reportError(arg0)),
+  'reportErrorForCurrentToken_2': new MethodTrampoline(2, (Parser target, arg0,
+      arg1) => target._reportErrorForCurrentToken(arg0, arg1)),
+  'reportErrorForNode_3': new MethodTrampoline(3, (Parser target, arg0, arg1,
+      arg2) => target._reportErrorForNode(arg0, arg1, arg2)),
+  'reportErrorForToken_3': new MethodTrampoline(3, (Parser target, arg0, arg1,
+      arg2) => target._reportErrorForToken(arg0, arg1, arg2)),
+  'skipBlock_0':
+      new MethodTrampoline(0, (Parser target) => target._skipBlock()),
+  'skipFinalConstVarOrType_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._skipFinalConstVarOrType(arg0)),
+  'skipFormalParameterList_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._skipFormalParameterList(arg0)),
+  'skipPastMatchingToken_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._skipPastMatchingToken(arg0)),
+  'skipPrefixedIdentifier_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._skipPrefixedIdentifier(arg0)),
+  'skipReturnType_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._skipReturnType(arg0)),
+  'skipSimpleIdentifier_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._skipSimpleIdentifier(arg0)),
+  'skipStringInterpolation_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._skipStringInterpolation(arg0)),
+  'skipStringLiteral_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._skipStringLiteral(arg0)),
+  'skipTypeArgumentList_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._skipTypeArgumentList(arg0)),
+  'skipTypeName_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._skipTypeName(arg0)),
+  'skipTypeParameterList_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._skipTypeParameterList(arg0)),
+  'tokenMatches_2': new MethodTrampoline(
+      2, (Parser target, arg0, arg1) => target._tokenMatches(arg0, arg1)),
+  'tokenMatchesIdentifier_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._tokenMatchesIdentifier(arg0)),
+  'tokenMatchesKeyword_2': new MethodTrampoline(2,
+      (Parser target, arg0, arg1) => target._tokenMatchesKeyword(arg0, arg1)),
+  'tokenMatchesString_2': new MethodTrampoline(
+      2, (Parser target, arg0, arg1) => target._tokenMatchesString(arg0, arg1)),
+  'translateCharacter_3': new MethodTrampoline(3, (Parser target, arg0, arg1,
+      arg2) => target._translateCharacter(arg0, arg1, arg2)),
+  'unlockErrorListener_0':
+      new MethodTrampoline(0, (Parser target) => target._unlockErrorListener()),
+  'validateFormalParameterList_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._validateFormalParameterList(arg0)),
+  'validateModifiersForClass_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._validateModifiersForClass(arg0)),
+  'validateModifiersForConstructor_1': new MethodTrampoline(1,
+      (Parser target, arg0) => target._validateModifiersForConstructor(arg0)),
+  'validateModifiersForEnum_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._validateModifiersForEnum(arg0)),
+  'validateModifiersForField_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._validateModifiersForField(arg0)),
+  'validateModifiersForFunctionDeclarationStatement_1': new MethodTrampoline(1,
+      (Parser target, arg0) =>
+          target._validateModifiersForFunctionDeclarationStatement(arg0)),
+  'validateModifiersForGetterOrSetterOrMethod_1': new MethodTrampoline(1,
+      (Parser target, arg0) =>
+          target._validateModifiersForGetterOrSetterOrMethod(arg0)),
+  'validateModifiersForOperator_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._validateModifiersForOperator(arg0)),
+  'validateModifiersForTopLevelDeclaration_1': new MethodTrampoline(1,
+      (Parser target, arg0) =>
+          target._validateModifiersForTopLevelDeclaration(arg0)),
+  'validateModifiersForTopLevelFunction_1': new MethodTrampoline(1,
+      (Parser target, arg0) =>
+          target._validateModifiersForTopLevelFunction(arg0)),
+  'validateModifiersForTopLevelVariable_1': new MethodTrampoline(1,
+      (Parser target, arg0) =>
+          target._validateModifiersForTopLevelVariable(arg0)),
+  'validateModifiersForTypedef_1': new MethodTrampoline(
+      1, (Parser target, arg0) => target._validateModifiersForTypedef(arg0)),
+};
+
+Object invokeParserMethodImpl(
+    Parser parser, String methodName, List<Object> objects, Token tokenStream) {
+  parser.currentToken = tokenStream;
+  MethodTrampoline method =
+      methodTable_Parser['${methodName}_${objects.length}'];
+  if (method == null) {
+    throw new IllegalArgumentException('There is no method named $methodName');
+  }
+  return method.invoke(parser, objects);
+}
+
+/**
+ * A simple data-holder for a method that needs to return multiple values.
+ */
+class CommentAndMetadata {
+  /**
+   * The documentation comment that was parsed, or `null` if none was given.
+   */
+  final Comment comment;
+
+  /**
+   * The metadata that was parsed.
+   */
+  final List<Annotation> metadata;
+
+  /**
+   * Initialize a newly created holder with the given [comment] and [metadata].
+   */
+  CommentAndMetadata(this.comment, this.metadata);
+}
+
+/**
+ * A simple data-holder for a method that needs to return multiple values.
+ */
+class FinalConstVarOrType {
+  /**
+   * The 'final', 'const' or 'var' keyword, or `null` if none was given.
+   */
+  final Token keyword;
+
+  /**
+   * The type, of `null` if no type was specified.
+   */
+  final TypeName type;
+
+  /**
+   * Initialize a newly created holder with the given [keyword] and [type].
+   */
+  FinalConstVarOrType(this.keyword, this.type);
+}
+
+/**
+ * A dispatcher that will invoke the right parse method when re-parsing a
+ * specified child of the visited node. All of the methods in this class assume
+ * that the parser is positioned to parse the replacement for the node. All of
+ * the methods will throw an [IncrementalParseException] if the node could not
+ * be parsed for some reason.
+ */
+class IncrementalParseDispatcher implements AstVisitor<AstNode> {
+  /**
+   * The parser used to parse the replacement for the node.
+   */
+  final Parser _parser;
+
+  /**
+   * The node that is to be replaced.
+   */
+  final AstNode _oldNode;
+
+  /**
+   * Initialize a newly created dispatcher to parse a single node that will
+   * use the [_parser] to replace the [_oldNode].
+   */
+  IncrementalParseDispatcher(this._parser, this._oldNode);
+
+  @override
+  AstNode visitAdjacentStrings(AdjacentStrings node) {
+    if (node.strings.contains(_oldNode)) {
+      return _parser.parseStringLiteral();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitAnnotation(Annotation node) {
+    if (identical(_oldNode, node.name)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.constructorName)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.arguments)) {
+      return _parser.parseArgumentList();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitArgumentList(ArgumentList node) {
+    if (node.arguments.contains(_oldNode)) {
+      return _parser.parseArgument();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitAsExpression(AsExpression node) {
+    if (identical(_oldNode, node.expression)) {
+      return _parser.parseBitwiseOrExpression();
+    } else if (identical(_oldNode, node.type)) {
+      return _parser.parseTypeName();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitAssertStatement(AssertStatement node) {
+    if (identical(_oldNode, node.condition)) {
+      return _parser.parseExpression2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitAssignmentExpression(AssignmentExpression node) {
+    if (identical(_oldNode, node.leftHandSide)) {
+      // TODO(brianwilkerson) If the assignment is part of a cascade section,
+      // then we don't have a single parse method that will work.
+      // Otherwise, we can parse a conditional expression, but need to ensure
+      // that the resulting expression is assignable.
+//      return parser.parseConditionalExpression();
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.rightHandSide)) {
+      if (_isCascadeAllowedInAssignment(node)) {
+        return _parser.parseExpression2();
+      }
+      return _parser.parseExpressionWithoutCascade();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitAwaitExpression(AwaitExpression node) {
+    if (identical(_oldNode, node.expression)) {
+      // TODO(brianwilkerson) Depending on precedence,
+      // this might not be sufficient.
+      return _parser.parseExpression2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitBinaryExpression(BinaryExpression node) {
+    if (identical(_oldNode, node.leftOperand)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.rightOperand)) {
+      throw new InsufficientContextException();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitBlock(Block node) {
+    if (node.statements.contains(_oldNode)) {
+      return _parser.parseStatement2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitBlockFunctionBody(BlockFunctionBody node) {
+    if (identical(_oldNode, node.block)) {
+      return _parser.parseBlock();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitBooleanLiteral(BooleanLiteral node) => _notAChild(node);
+
+  @override
+  AstNode visitBreakStatement(BreakStatement node) {
+    if (identical(_oldNode, node.label)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitCascadeExpression(CascadeExpression node) {
+    if (identical(_oldNode, node.target)) {
+      return _parser.parseConditionalExpression();
+    } else if (node.cascadeSections.contains(_oldNode)) {
+      throw new InsufficientContextException();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitCatchClause(CatchClause node) {
+    if (identical(_oldNode, node.exceptionType)) {
+      return _parser.parseTypeName();
+    } else if (identical(_oldNode, node.exceptionParameter)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.stackTraceParameter)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.body)) {
+      return _parser.parseBlock();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitClassDeclaration(ClassDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.name)) {
+      // Changing the class name changes whether a member is interpreted as a
+      // constructor or not, so we'll just have to re-parse the entire class.
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.typeParameters)) {
+      return _parser.parseTypeParameterList();
+    } else if (identical(_oldNode, node.extendsClause)) {
+      return _parser.parseExtendsClause();
+    } else if (identical(_oldNode, node.withClause)) {
+      return _parser.parseWithClause();
+    } else if (identical(_oldNode, node.implementsClause)) {
+      return _parser.parseImplementsClause();
+    } else if (node.members.contains(_oldNode)) {
+      ClassMember member = _parser.parseClassMember(node.name.name);
+      if (member == null) {
+        throw new InsufficientContextException();
+      }
+      return member;
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitClassTypeAlias(ClassTypeAlias node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.typeParameters)) {
+      return _parser.parseTypeParameterList();
+    } else if (identical(_oldNode, node.superclass)) {
+      return _parser.parseTypeName();
+    } else if (identical(_oldNode, node.withClause)) {
+      return _parser.parseWithClause();
+    } else if (identical(_oldNode, node.implementsClause)) {
+      return _parser.parseImplementsClause();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitComment(Comment node) {
+    throw new InsufficientContextException();
+  }
+
+  @override
+  AstNode visitCommentReference(CommentReference node) {
+    if (identical(_oldNode, node.identifier)) {
+      return _parser.parsePrefixedIdentifier();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitCompilationUnit(CompilationUnit node) {
+    throw new InsufficientContextException();
+  }
+
+  @override
+  AstNode visitConditionalExpression(ConditionalExpression node) {
+    if (identical(_oldNode, node.condition)) {
+      return _parser.parseIfNullExpression();
+    } else if (identical(_oldNode, node.thenExpression)) {
+      return _parser.parseExpressionWithoutCascade();
+    } else if (identical(_oldNode, node.elseExpression)) {
+      return _parser.parseExpressionWithoutCascade();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitConstructorDeclaration(ConstructorDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.returnType)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.name)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.parameters)) {
+      return _parser.parseFormalParameterList();
+    } else if (identical(_oldNode, node.redirectedConstructor)) {
+      throw new InsufficientContextException();
+    } else if (node.initializers.contains(_oldNode)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.body)) {
+      throw new InsufficientContextException();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    if (identical(_oldNode, node.fieldName)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.expression)) {
+      throw new InsufficientContextException();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitConstructorName(ConstructorName node) {
+    if (identical(_oldNode, node.type)) {
+      return _parser.parseTypeName();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitContinueStatement(ContinueStatement node) {
+    if (identical(_oldNode, node.label)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitDeclaredIdentifier(DeclaredIdentifier node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.type)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.identifier)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitDefaultFormalParameter(DefaultFormalParameter node) {
+    if (identical(_oldNode, node.parameter)) {
+      return _parser.parseNormalFormalParameter();
+    } else if (identical(_oldNode, node.defaultValue)) {
+      return _parser.parseExpression2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitDoStatement(DoStatement node) {
+    if (identical(_oldNode, node.body)) {
+      return _parser.parseStatement2();
+    } else if (identical(_oldNode, node.condition)) {
+      return _parser.parseExpression2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitDoubleLiteral(DoubleLiteral node) => _notAChild(node);
+
+  @override
+  AstNode visitEmptyFunctionBody(EmptyFunctionBody node) => _notAChild(node);
+
+  @override
+  AstNode visitEmptyStatement(EmptyStatement node) => _notAChild(node);
+
+  @override
+  AstNode visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitEnumDeclaration(EnumDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (node.constants.contains(_oldNode)) {
+      throw new InsufficientContextException();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitExportDirective(ExportDirective node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.uri)) {
+      return _parser.parseStringLiteral();
+    } else if (node.combinators.contains(_oldNode)) {
+      throw new IncrementalParseException();
+      //return parser.parseCombinator();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    if (identical(_oldNode, node.expression)) {
+      return _parser.parseExpression2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitExpressionStatement(ExpressionStatement node) {
+    if (identical(_oldNode, node.expression)) {
+      return _parser.parseExpression2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitExtendsClause(ExtendsClause node) {
+    if (identical(_oldNode, node.superclass)) {
+      return _parser.parseTypeName();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitFieldDeclaration(FieldDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.fields)) {
+      throw new InsufficientContextException();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitFieldFormalParameter(FieldFormalParameter node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.type)) {
+      return _parser.parseTypeName();
+    } else if (identical(_oldNode, node.identifier)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.parameters)) {
+      return _parser.parseFormalParameterList();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitForEachStatement(ForEachStatement node) {
+    if (identical(_oldNode, node.loopVariable)) {
+      throw new InsufficientContextException();
+      //return parser.parseDeclaredIdentifier();
+    } else if (identical(_oldNode, node.identifier)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.body)) {
+      return _parser.parseStatement2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitFormalParameterList(FormalParameterList node) {
+    // We don't know which kind of parameter to parse.
+    throw new InsufficientContextException();
+  }
+
+  @override
+  AstNode visitForStatement(ForStatement node) {
+    if (identical(_oldNode, node.variables)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.initialization)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.condition)) {
+      return _parser.parseExpression2();
+    } else if (node.updaters.contains(_oldNode)) {
+      return _parser.parseExpression2();
+    } else if (identical(_oldNode, node.body)) {
+      return _parser.parseStatement2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitFunctionDeclaration(FunctionDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.returnType)) {
+      return _parser.parseReturnType();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.functionExpression)) {
+      throw new InsufficientContextException();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    if (identical(_oldNode, node.functionDeclaration)) {
+      throw new InsufficientContextException();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitFunctionExpression(FunctionExpression node) {
+    if (identical(_oldNode, node.parameters)) {
+      return _parser.parseFormalParameterList();
+    } else if (identical(_oldNode, node.body)) {
+      throw new InsufficientContextException();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    if (identical(_oldNode, node.function)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.argumentList)) {
+      return _parser.parseArgumentList();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitFunctionTypeAlias(FunctionTypeAlias node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.returnType)) {
+      return _parser.parseReturnType();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.typeParameters)) {
+      return _parser.parseTypeParameterList();
+    } else if (identical(_oldNode, node.parameters)) {
+      return _parser.parseFormalParameterList();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.returnType)) {
+      return _parser.parseReturnType();
+    } else if (identical(_oldNode, node.identifier)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.parameters)) {
+      return _parser.parseFormalParameterList();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitHideCombinator(HideCombinator node) {
+    if (node.hiddenNames.contains(_oldNode)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitIfStatement(IfStatement node) {
+    if (identical(_oldNode, node.condition)) {
+      return _parser.parseExpression2();
+    } else if (identical(_oldNode, node.thenStatement)) {
+      return _parser.parseStatement2();
+    } else if (identical(_oldNode, node.elseStatement)) {
+      return _parser.parseStatement2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitImplementsClause(ImplementsClause node) {
+    if (node.interfaces.contains(node)) {
+      return _parser.parseTypeName();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitImportDirective(ImportDirective node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.uri)) {
+      return _parser.parseStringLiteral();
+    } else if (identical(_oldNode, node.prefix)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (node.combinators.contains(_oldNode)) {
+      return _parser.parseCombinator();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitIndexExpression(IndexExpression node) {
+    if (identical(_oldNode, node.target)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.index)) {
+      return _parser.parseExpression2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitInstanceCreationExpression(InstanceCreationExpression node) {
+    if (identical(_oldNode, node.constructorName)) {
+      return _parser.parseConstructorName();
+    } else if (identical(_oldNode, node.argumentList)) {
+      return _parser.parseArgumentList();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitIntegerLiteral(IntegerLiteral node) => _notAChild(node);
+
+  @override
+  AstNode visitInterpolationExpression(InterpolationExpression node) {
+    if (identical(_oldNode, node.expression)) {
+      if (node.leftBracket == null) {
+        throw new InsufficientContextException();
+        //return parser.parseThisOrSimpleIdentifier();
+      }
+      return _parser.parseExpression2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitInterpolationString(InterpolationString node) {
+    throw new InsufficientContextException();
+  }
+
+  @override
+  AstNode visitIsExpression(IsExpression node) {
+    if (identical(_oldNode, node.expression)) {
+      return _parser.parseBitwiseOrExpression();
+    } else if (identical(_oldNode, node.type)) {
+      return _parser.parseTypeName();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitLabel(Label node) {
+    if (identical(_oldNode, node.label)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitLabeledStatement(LabeledStatement node) {
+    if (node.labels.contains(_oldNode)) {
+      return _parser.parseLabel();
+    } else if (identical(_oldNode, node.statement)) {
+      return _parser.parseStatement2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitLibraryDirective(LibraryDirective node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseLibraryIdentifier();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitLibraryIdentifier(LibraryIdentifier node) {
+    if (node.components.contains(_oldNode)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitListLiteral(ListLiteral node) {
+    if (identical(_oldNode, node.typeArguments)) {
+      return _parser.parseTypeArgumentList();
+    } else if (node.elements.contains(_oldNode)) {
+      return _parser.parseExpression2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitMapLiteral(MapLiteral node) {
+    if (identical(_oldNode, node.typeArguments)) {
+      return _parser.parseTypeArgumentList();
+    } else if (node.entries.contains(_oldNode)) {
+      return _parser.parseMapLiteralEntry();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitMapLiteralEntry(MapLiteralEntry node) {
+    if (identical(_oldNode, node.key)) {
+      return _parser.parseExpression2();
+    } else if (identical(_oldNode, node.value)) {
+      return _parser.parseExpression2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitMethodDeclaration(MethodDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.returnType)) {
+      throw new InsufficientContextException();
+      //return parser.parseTypeName();
+      //return parser.parseReturnType();
+    } else if (identical(_oldNode, node.name)) {
+      if (node.operatorKeyword != null) {
+        throw new InsufficientContextException();
+      }
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.body)) {
+      //return parser.parseFunctionBody();
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.parameters)) {
+      // TODO(paulberry): if we want errors to be correct, we'll need to also
+      // call _validateFormalParameterList, and sometimes
+      // _validateModifiersForGetterOrSetterOrMethod.
+      return _parser.parseFormalParameterList();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitMethodInvocation(MethodInvocation node) {
+    if (identical(_oldNode, node.target)) {
+      throw new IncrementalParseException();
+    } else if (identical(_oldNode, node.methodName)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.argumentList)) {
+      return _parser.parseArgumentList();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitNamedExpression(NamedExpression node) {
+    if (identical(_oldNode, node.name)) {
+      return _parser.parseLabel();
+    } else if (identical(_oldNode, node.expression)) {
+      return _parser.parseExpression2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitNativeClause(NativeClause node) {
+    if (identical(_oldNode, node.name)) {
+      return _parser.parseStringLiteral();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitNativeFunctionBody(NativeFunctionBody node) {
+    if (identical(_oldNode, node.stringLiteral)) {
+      return _parser.parseStringLiteral();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitNullLiteral(NullLiteral node) => _notAChild(node);
+
+  @override
+  AstNode visitParenthesizedExpression(ParenthesizedExpression node) {
+    if (identical(_oldNode, node.expression)) {
+      return _parser.parseExpression2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitPartDirective(PartDirective node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.uri)) {
+      return _parser.parseStringLiteral();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitPartOfDirective(PartOfDirective node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.libraryName)) {
+      return _parser.parseLibraryIdentifier();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitPostfixExpression(PostfixExpression node) {
+    if (identical(_oldNode, node.operand)) {
+      throw new InsufficientContextException();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitPrefixedIdentifier(PrefixedIdentifier node) {
+    if (identical(_oldNode, node.prefix)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.identifier)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitPrefixExpression(PrefixExpression node) {
+    if (identical(_oldNode, node.operand)) {
+      throw new InsufficientContextException();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitPropertyAccess(PropertyAccess node) {
+    if (identical(_oldNode, node.target)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.propertyName)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    if (identical(_oldNode, node.constructorName)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.argumentList)) {
+      return _parser.parseArgumentList();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitRethrowExpression(RethrowExpression node) => _notAChild(node);
+
+  @override
+  AstNode visitReturnStatement(ReturnStatement node) {
+    if (identical(_oldNode, node.expression)) {
+      return _parser.parseExpression2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitScriptTag(ScriptTag node) => _notAChild(node);
+
+  @override
+  AstNode visitShowCombinator(ShowCombinator node) {
+    if (node.shownNames.contains(_oldNode)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitSimpleFormalParameter(SimpleFormalParameter node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.type)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.identifier)) {
+      throw new InsufficientContextException();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitSimpleIdentifier(SimpleIdentifier node) => _notAChild(node);
+
+  @override
+  AstNode visitSimpleStringLiteral(SimpleStringLiteral node) =>
+      _notAChild(node);
+
+  @override
+  AstNode visitStringInterpolation(StringInterpolation node) {
+    if (node.elements.contains(_oldNode)) {
+      throw new InsufficientContextException();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    if (identical(_oldNode, node.constructorName)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.argumentList)) {
+      return _parser.parseArgumentList();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitSuperExpression(SuperExpression node) => _notAChild(node);
+
+  @override
+  AstNode visitSwitchCase(SwitchCase node) {
+    if (node.labels.contains(_oldNode)) {
+      return _parser.parseLabel();
+    } else if (identical(_oldNode, node.expression)) {
+      return _parser.parseExpression2();
+    } else if (node.statements.contains(_oldNode)) {
+      return _parser.parseStatement2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitSwitchDefault(SwitchDefault node) {
+    if (node.labels.contains(_oldNode)) {
+      return _parser.parseLabel();
+    } else if (node.statements.contains(_oldNode)) {
+      return _parser.parseStatement2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitSwitchStatement(SwitchStatement node) {
+    if (identical(_oldNode, node.expression)) {
+      return _parser.parseExpression2();
+    } else if (node.members.contains(_oldNode)) {
+      throw new InsufficientContextException();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitSymbolLiteral(SymbolLiteral node) => _notAChild(node);
+
+  @override
+  AstNode visitThisExpression(ThisExpression node) => _notAChild(node);
+
+  @override
+  AstNode visitThrowExpression(ThrowExpression node) {
+    if (identical(_oldNode, node.expression)) {
+      if (_isCascadeAllowedInThrow(node)) {
+        return _parser.parseExpression2();
+      }
+      return _parser.parseExpressionWithoutCascade();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.variables)) {
+      throw new InsufficientContextException();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitTryStatement(TryStatement node) {
+    if (identical(_oldNode, node.body)) {
+      return _parser.parseBlock();
+    } else if (node.catchClauses.contains(_oldNode)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.finallyBlock)) {
+      throw new InsufficientContextException();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitTypeArgumentList(TypeArgumentList node) {
+    if (node.arguments.contains(_oldNode)) {
+      return _parser.parseTypeName();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitTypeName(TypeName node) {
+    if (identical(_oldNode, node.name)) {
+      return _parser.parsePrefixedIdentifier();
+    } else if (identical(_oldNode, node.typeArguments)) {
+      return _parser.parseTypeArgumentList();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitTypeParameter(TypeParameter node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (identical(_oldNode, node.bound)) {
+      return _parser.parseTypeName();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitTypeParameterList(TypeParameterList node) {
+    if (node.typeParameters.contains(node)) {
+      return _parser.parseTypeParameter();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitVariableDeclaration(VariableDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.name)) {
+      throw new InsufficientContextException();
+    } else if (identical(_oldNode, node.initializer)) {
+      throw new InsufficientContextException();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitVariableDeclarationList(VariableDeclarationList node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.type)) {
+      // There is not enough context to know whether we should reparse the type
+      // using parseReturnType() (which allows 'void') or parseTypeName()
+      // (which doesn't).  Note that even though the language disallows
+      // variables of type 'void', the parser sometimes accepts them in the
+      // course of error recovery (e.g. "class C { void v; }"
+      throw new InsufficientContextException();
+    } else if (node.variables.contains(_oldNode)) {
+      throw new InsufficientContextException();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    if (identical(_oldNode, node.variables)) {
+      throw new InsufficientContextException();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitWhileStatement(WhileStatement node) {
+    if (identical(_oldNode, node.condition)) {
+      return _parser.parseExpression2();
+    } else if (identical(_oldNode, node.body)) {
+      return _parser.parseStatement2();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitWithClause(WithClause node) {
+    if (node.mixinTypes.contains(node)) {
+      return _parser.parseTypeName();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitYieldStatement(YieldStatement node) {
+    if (identical(_oldNode, node.expression)) {
+      return _parser.parseExpression2();
+    }
+    return _notAChild(node);
+  }
+
+  /**
+   * Return `true` if the given assignment [expression] can have a cascade
+   * expression on the right-hand side.
+   */
+  bool _isCascadeAllowedInAssignment(AssignmentExpression expression) {
+    // TODO(brianwilkerson) Implement this method.
+    throw new InsufficientContextException();
+  }
+
+  /**
+   * Return `true` if the given throw [expression] can have a cascade
+   * expression.
+   */
+  bool _isCascadeAllowedInThrow(ThrowExpression expression) {
+    // TODO(brianwilkerson) Implement this method.
+    throw new InsufficientContextException();
+  }
+
+  /**
+   * Throw an exception indicating that the visited [node] was not the parent of
+   * the node to be replaced.
+   */
+  AstNode _notAChild(AstNode node) {
+    throw new IncrementalParseException.con1(
+        "Internal error: the visited node (a ${node.runtimeType}) was not the parent of the node to be replaced (a ${_oldNode.runtimeType})");
+  }
+}
+
+/**
+ * An exception that occurred while attempting to parse a replacement for a
+ * specified node in an existing AST structure.
+ */
+class IncrementalParseException extends RuntimeException {
+  /**
+   * Initialize a newly created exception to have no message and to be its own
+   * cause.
+   */
+  IncrementalParseException() : super();
+
+  /**
+   * Initialize a newly created exception to have the given [message] and to be
+   * its own cause.
+   */
+  IncrementalParseException.con1(String message) : super(message: message);
+
+  /**
+   * Initialize a newly created exception to have no message and to have the
+   * given [cause].
+   */
+  IncrementalParseException.con2(Exception cause) : super(cause: cause);
+}
+
+/**
+ * An object used to re-parse a single AST structure within a larger AST
+ * structure.
+ */
+class IncrementalParser {
+  /**
+   * The source being parsed.
+   */
+  final Source _source;
+
+  /**
+   * A map from old tokens to new tokens used during the cloning process.
+   */
+  final TokenMap _tokenMap;
+
+  /**
+   * The error listener that will be informed of any errors that are found
+   * during the parse.
+   */
+  final AnalysisErrorListener _errorListener;
+
+  /**
+   * The node in the AST structure that contains the revised content.
+   */
+  AstNode _updatedNode;
+
+  /**
+   * Initialize a newly created incremental parser to parse a portion of the
+   * content of the given [_source]. The [_tokenMap] is a map from old tokens to
+   * new tokens that is used during the cloning process. The [_errorListener]
+   * will be informed of any errors that are found during the parse.
+   */
+  IncrementalParser(this._source, this._tokenMap, this._errorListener);
+
+  /**
+   * Return the node in the AST structure that contains the revised content.
+   */
+  AstNode get updatedNode => _updatedNode;
+
+  /**
+   * Given a range of tokens that were re-scanned, re-parse the minimum number
+   * of tokens to produce a consistent AST structure. The range is represented
+   * by the first and last tokens in the range.
+   *
+   * More specifically, the [leftToken] is the token in the new token stream
+   * immediately to the left of the range of tokens that were inserted and the
+   * [rightToken] is the token in the new token stream immediately to the right
+   * of the range of tokens that were inserted. The [originalStart] and
+   * [originalEnd] are the offsets in the original source of the first and last
+   * characters that were modified.
+   *
+   * The tokens are assumed to be contained in the same token stream.
+   */
+  AstNode reparse(AstNode originalStructure, Token leftToken, Token rightToken,
+      int originalStart, int originalEnd) {
+    AstNode oldNode = null;
+    AstNode newNode = null;
+    //
+    // Find the first token that needs to be re-parsed.
+    //
+    Token firstToken = leftToken.next;
+    if (identical(firstToken, rightToken)) {
+      // If there are no new tokens, then we need to include at least one copied
+      // node in the range.
+      firstToken = leftToken;
+    }
+    //
+    // Find the smallest AST node that encompasses the range of re-scanned
+    // tokens.
+    //
+    if (originalEnd < originalStart) {
+      oldNode = new NodeLocator(originalStart).searchWithin(originalStructure);
+    } else {
+      oldNode = new NodeLocator(originalStart, originalEnd)
+          .searchWithin(originalStructure);
+    }
+    //
+    // Find the token at which parsing is to begin.
+    //
+    int originalOffset = oldNode.offset;
+    Token parseToken = _findTokenAt(firstToken, originalOffset);
+    if (parseToken == null) {
+      return null;
+    }
+    //
+    // Parse the appropriate AST structure starting at the appropriate place.
+    //
+    Parser parser = new Parser(_source, _errorListener);
+    parser.currentToken = parseToken;
+    while (newNode == null) {
+      AstNode parent = oldNode.parent;
+      if (parent == null) {
+        parseToken = _findFirstToken(parseToken);
+        parser.currentToken = parseToken;
+        return parser.parseCompilationUnit2();
+      }
+      bool advanceToParent = false;
+      try {
+        IncrementalParseDispatcher dispatcher =
+            new IncrementalParseDispatcher(parser, oldNode);
+        IncrementalParseStateBuilder contextBuilder =
+            new IncrementalParseStateBuilder(parser);
+        contextBuilder.buildState(oldNode);
+        newNode = parent.accept(dispatcher);
+        //
+        // Validate that the new node can replace the old node.
+        //
+        Token mappedToken = _tokenMap.get(oldNode.endToken.next);
+        if (mappedToken == null ||
+            newNode == null ||
+            mappedToken.offset != newNode.endToken.next.offset ||
+            newNode.offset != oldNode.offset) {
+          advanceToParent = true;
+        }
+      } on InsufficientContextException {
+        advanceToParent = true;
+      } catch (exception) {
+        return null;
+      }
+      if (advanceToParent) {
+        newNode = null;
+        oldNode = parent;
+        originalOffset = oldNode.offset;
+        parseToken = _findTokenAt(parseToken, originalOffset);
+        parser.currentToken = parseToken;
+      }
+    }
+    _updatedNode = newNode;
+    //
+    // Replace the old node with the new node in a copy of the original AST
+    // structure.
+    //
+    if (identical(oldNode, originalStructure)) {
+      // We ended up re-parsing the whole structure, so there's no need for a
+      // copy.
+      ResolutionCopier.copyResolutionData(oldNode, newNode);
+      return newNode;
+    }
+    ResolutionCopier.copyResolutionData(oldNode, newNode);
+    IncrementalAstCloner cloner =
+        new IncrementalAstCloner(oldNode, newNode, _tokenMap);
+    return originalStructure.accept(cloner) as AstNode;
+  }
+
+  /**
+   * Return the first (non-EOF) token in the token stream containing the
+   * [firstToken].
+   */
+  Token _findFirstToken(Token firstToken) {
+    while (firstToken.type != TokenType.EOF) {
+      firstToken = firstToken.previous;
+    }
+    return firstToken.next;
+  }
+
+  /**
+   * Find the token at or before the [firstToken] with the given [offset], or
+   * `null` if there is no such token.
+   */
+  Token _findTokenAt(Token firstToken, int offset) {
+    while (firstToken.offset > offset && firstToken.type != TokenType.EOF) {
+      firstToken = firstToken.previous;
+    }
+    return firstToken;
+  }
+}
+
+/**
+ * A visitor capable of inferring the correct parser state for incremental
+ * parsing.  This visitor visits each parent/child relationship in the chain of
+ * ancestors of the node to be replaced (starting with the root of the parse
+ * tree), updating the parser to the correct state for parsing the child of the
+ * given parent.  Once it has visited all of these relationships, the parser
+ * will be in the correct state for reparsing the node to be replaced.
+ */
+class IncrementalParseStateBuilder extends SimpleAstVisitor {
+  // TODO(paulberry): add support for other pieces of parser state (_inAsync,
+  // _inGenerator, _inLoop, and _inSwitch).  Note that _inLoop and _inSwitch
+  // only affect error message generation.
+
+  /**
+   * The parser whose state should be built.
+   */
+  final Parser _parser;
+
+  /**
+   * The child node in the parent/child relationship currently being visited.
+   * (The corresponding parent is the node passed to the visit...() function.)
+   */
+  AstNode _childNode;
+
+  /**
+   * Create an IncrementalParseStateBuilder which will build the correct state
+   * for [_parser].
+   */
+  IncrementalParseStateBuilder(this._parser);
+
+  /**
+   * Build the correct parser state for parsing a replacement for [node].
+   */
+  void buildState(AstNode node) {
+    List<AstNode> ancestors = <AstNode>[];
+    while (node != null) {
+      ancestors.add(node);
+      node = node.parent;
+    }
+    _parser._inInitializer = false;
+    for (int i = ancestors.length - 2; i >= 0; i--) {
+      _childNode = ancestors[i];
+      ancestors[i + 1].accept(this);
+    }
+  }
+
+  @override
+  void visitArgumentList(ArgumentList node) {
+    _parser._inInitializer = false;
+  }
+
+  @override
+  void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    if (identical(_childNode, node.expression)) {
+      _parser._inInitializer = true;
+    }
+  }
+
+  @override
+  void visitIndexExpression(IndexExpression node) {
+    if (identical(_childNode, node.index)) {
+      _parser._inInitializer = false;
+    }
+  }
+
+  @override
+  void visitInterpolationExpression(InterpolationExpression node) {
+    if (identical(_childNode, node.expression)) {
+      _parser._inInitializer = false;
+    }
+  }
+
+  @override
+  void visitListLiteral(ListLiteral node) {
+    if (node.elements.contains(_childNode)) {
+      _parser._inInitializer = false;
+    }
+  }
+
+  @override
+  void visitMapLiteral(MapLiteral node) {
+    if (node.entries.contains(_childNode)) {
+      _parser._inInitializer = false;
+    }
+  }
+
+  @override
+  void visitParenthesizedExpression(ParenthesizedExpression node) {
+    if (identical(_childNode, node.expression)) {
+      _parser._inInitializer = false;
+    }
+  }
+}
+
+/**
+ * An exception indicating that an AST node cannot be re-parsed because there is
+ * not enough context to know how to re-parse the node. Clients can attempt to
+ * re-parse the parent of the node.
+ */
+class InsufficientContextException extends IncrementalParseException {
+  /**
+   * Initialize a newly created exception to have no message and to be its own
+   * cause.
+   */
+  InsufficientContextException() : super();
+
+  /**
+   * Initialize a newly created exception to have the given [message] and to be
+   * its own cause.
+   */
+  InsufficientContextException.con1(String message) : super.con1(message);
+
+  /**
+   * Initialize a newly created exception to have no message and to have the
+   * given [cause].
+   */
+  InsufficientContextException.con2(Exception cause) : super.con2(cause);
+}
+
+/**
+ * Wrapper around [Function] which should be called with "target" and
+ * "arguments".
+ */
+class MethodTrampoline {
+  int parameterCount;
+  Function trampoline;
+  MethodTrampoline(this.parameterCount, this.trampoline);
+  Object invoke(target, List arguments) {
+    if (arguments.length != parameterCount) {
+      throw new IllegalArgumentException(
+          "${arguments.length} != $parameterCount");
+    }
+    switch (parameterCount) {
+      case 0:
+        return trampoline(target);
+      case 1:
+        return trampoline(target, arguments[0]);
+      case 2:
+        return trampoline(target, arguments[0], arguments[1]);
+      case 3:
+        return trampoline(target, arguments[0], arguments[1], arguments[2]);
+      case 4:
+        return trampoline(
+            target, arguments[0], arguments[1], arguments[2], arguments[3]);
+      default:
+        throw new IllegalArgumentException("Not implemented for > 4 arguments");
+    }
+  }
+}
+
+/**
+ * A simple data-holder for a method that needs to return multiple values.
+ */
+class Modifiers {
+  /**
+   * The token representing the keyword 'abstract', or `null` if the keyword was
+   * not found.
+   */
+  Token abstractKeyword;
+
+  /**
+   * The token representing the keyword 'const', or `null` if the keyword was
+   * not found.
+   */
+  Token constKeyword;
+
+  /**
+   * The token representing the keyword 'external', or `null` if the keyword was
+   * not found.
+   */
+  Token externalKeyword;
+
+  /**
+   * The token representing the keyword 'factory', or `null` if the keyword was
+   * not found.
+   */
+  Token factoryKeyword;
+
+  /**
+   * The token representing the keyword 'final', or `null` if the keyword was
+   * not found.
+   */
+  Token finalKeyword;
+
+  /**
+   * The token representing the keyword 'static', or `null` if the keyword was
+   * not found.
+   */
+  Token staticKeyword;
+
+  /**
+   * The token representing the keyword 'var', or `null` if the keyword was not
+   * found.
+   */
+  Token varKeyword;
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    bool needsSpace = _appendKeyword(buffer, false, abstractKeyword);
+    needsSpace = _appendKeyword(buffer, needsSpace, constKeyword);
+    needsSpace = _appendKeyword(buffer, needsSpace, externalKeyword);
+    needsSpace = _appendKeyword(buffer, needsSpace, factoryKeyword);
+    needsSpace = _appendKeyword(buffer, needsSpace, finalKeyword);
+    needsSpace = _appendKeyword(buffer, needsSpace, staticKeyword);
+    _appendKeyword(buffer, needsSpace, varKeyword);
+    return buffer.toString();
+  }
+
+  /**
+   * If the given [keyword] is not `null`, append it to the given [builder],
+   * prefixing it with a space if [needsSpace] is `true`. Return `true` if
+   * subsequent keywords need to be prefixed with a space.
+   */
+  bool _appendKeyword(StringBuffer buffer, bool needsSpace, Token keyword) {
+    if (keyword != null) {
+      if (needsSpace) {
+        buffer.writeCharCode(0x20);
+      }
+      buffer.write(keyword.lexeme);
+      return true;
+    }
+    return needsSpace;
+  }
+}
+
+/**
+ * A parser used to parse tokens into an AST structure.
+ */
+class Parser {
+  static String ASYNC = "async";
+
+  static String _AWAIT = "await";
+
+  static String _HIDE = "hide";
+
+  static String _OF = "of";
+
+  static String _ON = "on";
+
+  static String _NATIVE = "native";
+
+  static String _SHOW = "show";
+
+  static String SYNC = "sync";
+
+  static String _YIELD = "yield";
+
+  /**
+   * The source being parsed.
+   */
+  final Source _source;
+
+  /**
+   * The error listener that will be informed of any errors that are found
+   * during the parse.
+   */
+  final AnalysisErrorListener _errorListener;
+
+  /**
+   * An [errorListener] lock, if more than `0`, then errors are not reported.
+   */
+  int _errorListenerLock = 0;
+
+  /**
+   * A flag indicating whether parser is to parse function bodies.
+   */
+  bool _parseFunctionBodies = true;
+
+  /**
+   * The next token to be parsed.
+   */
+  Token _currentToken;
+
+  /**
+   * A flag indicating whether the parser is currently in a function body marked
+   * as being 'async'.
+   */
+  bool _inAsync = false;
+
+  /**
+   * A flag indicating whether the parser is currently in a function body marked
+   * as being 'async'.
+   */
+  bool _inGenerator = false;
+
+  /**
+   * A flag indicating whether the parser is currently in the body of a loop.
+   */
+  bool _inLoop = false;
+
+  /**
+   * A flag indicating whether the parser is currently in a switch statement.
+   */
+  bool _inSwitch = false;
+
+  /**
+   * A flag indicating whether the parser is currently in a constructor field
+   * initializer, with no intervening parens, braces, or brackets.
+   */
+  bool _inInitializer = false;
+
+  /**
+   * A flag indicating whether the parser is to parse generic method syntax.
+   */
+  bool parseGenericMethods = false;
+
+  /**
+   * Initialize a newly created parser to parse the content of the given
+   * [_source] and to report any errors that are found to the given
+   * [_errorListener].
+   */
+  Parser(this._source, this._errorListener);
+
+  void set currentToken(Token currentToken) {
+    this._currentToken = currentToken;
+  }
+
+  /**
+   * Return `true` if the current token is the first token of a return type that
+   * is followed by an identifier, possibly followed by a list of type
+   * parameters, followed by a left-parenthesis. This is used by
+   * [_parseTypeAlias] to determine whether or not to parse a return type.
+   */
+  bool get hasReturnTypeInTypeAlias {
+    Token next = _skipReturnType(_currentToken);
+    if (next == null) {
+      return false;
+    }
+    return _tokenMatchesIdentifier(next);
+  }
+
+  /**
+   * Set whether the parser is to parse the async support.
+   */
+  @deprecated
+  void set parseAsync(bool parseAsync) {
+    // Async support cannot be disabled
+  }
+
+  /**
+   * Set whether the parser is to parse deferred libraries.
+   */
+  @deprecated
+  void set parseDeferredLibraries(bool parseDeferredLibraries) {
+    // Deferred libraries support cannot be disabled
+  }
+
+  /**
+   * Set whether the parser is to parse enum declarations.
+   */
+  @deprecated
+  void set parseEnum(bool parseEnum) {
+    // Enum support cannot be disabled
+  }
+
+  /**
+   * Set whether parser is to parse function bodies.
+   */
+  void set parseFunctionBodies(bool parseFunctionBodies) {
+    this._parseFunctionBodies = parseFunctionBodies;
+  }
+
+  /**
+   * Advance to the next token in the token stream, making it the new current
+   * token and return the token that was current before this method was invoked.
+   */
+  Token getAndAdvance() {
+    Token token = _currentToken;
+    _advance();
+    return token;
+  }
+
+  /**
+   * Parse an annotation. Return the annotation that was parsed.
+   *
+   *     annotation ::=
+   *         '@' qualified ('.' identifier)? arguments?
+   *
+   */
+  Annotation parseAnnotation() {
+    Token atSign = _expect(TokenType.AT);
+    Identifier name = parsePrefixedIdentifier();
+    Token period = null;
+    SimpleIdentifier constructorName = null;
+    if (_matches(TokenType.PERIOD)) {
+      period = getAndAdvance();
+      constructorName = parseSimpleIdentifier();
+    }
+    ArgumentList arguments = null;
+    if (_matches(TokenType.OPEN_PAREN)) {
+      arguments = parseArgumentList();
+    }
+    return new Annotation(atSign, name, period, constructorName, arguments);
+  }
+
+  /**
+   * Parse an argument. Return the argument that was parsed.
+   *
+   *     argument ::=
+   *         namedArgument
+   *       | expression
+   *
+   *     namedArgument ::=
+   *         label expression
+   */
+  Expression parseArgument() {
+    //
+    // Both namedArgument and expression can start with an identifier, but only
+    // namedArgument can have an identifier followed by a colon.
+    //
+    if (_matchesIdentifier() && _tokenMatches(_peek(), TokenType.COLON)) {
+      return new NamedExpression(parseLabel(), parseExpression2());
+    } else {
+      return parseExpression2();
+    }
+  }
+
+  /**
+   * Parse a list of arguments. Return the argument list that was parsed.
+   *
+   *     arguments ::=
+   *         '(' argumentList? ')'
+   *
+   *     argumentList ::=
+   *         namedArgument (',' namedArgument)*
+   *       | expressionList (',' namedArgument)*
+   */
+  ArgumentList parseArgumentList() {
+    Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
+    List<Expression> arguments = new List<Expression>();
+    if (_matches(TokenType.CLOSE_PAREN)) {
+      return new ArgumentList(leftParenthesis, arguments, getAndAdvance());
+    }
+    //
+    // Even though unnamed arguments must all appear before any named arguments,
+    // we allow them to appear in any order so that we can recover faster.
+    //
+    bool wasInInitializer = _inInitializer;
+    _inInitializer = false;
+    try {
+      Expression argument = parseArgument();
+      arguments.add(argument);
+      bool foundNamedArgument = argument is NamedExpression;
+      bool generatedError = false;
+      while (_optional(TokenType.COMMA)) {
+        argument = parseArgument();
+        arguments.add(argument);
+        if (foundNamedArgument) {
+          bool blankArgument =
+              argument is SimpleIdentifier && argument.name.isEmpty;
+          if (!generatedError &&
+              !(argument is NamedExpression && !blankArgument)) {
+            // Report the error, once, but allow the arguments to be in any
+            // order in the AST.
+            _reportErrorForCurrentToken(
+                ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT);
+            generatedError = true;
+          }
+        } else if (argument is NamedExpression) {
+          foundNamedArgument = true;
+        }
+      }
+      // TODO(brianwilkerson) Recovery: Look at the left parenthesis to see
+      // whether there is a matching right parenthesis. If there is, then we're
+      // more likely missing a comma and should go back to parsing arguments.
+      Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
+      return new ArgumentList(leftParenthesis, arguments, rightParenthesis);
+    } finally {
+      _inInitializer = wasInInitializer;
+    }
+  }
+
+  /**
+   * Parse a bitwise or expression. Return the bitwise or expression that was
+   * parsed.
+   *
+   *     bitwiseOrExpression ::=
+   *         bitwiseXorExpression ('|' bitwiseXorExpression)*
+   *       | 'super' ('|' bitwiseXorExpression)+
+   */
+  Expression parseBitwiseOrExpression() {
+    Expression expression;
+    if (_matchesKeyword(Keyword.SUPER) &&
+        _tokenMatches(_peek(), TokenType.BAR)) {
+      expression = new SuperExpression(getAndAdvance());
+    } else {
+      expression = _parseBitwiseXorExpression();
+    }
+    while (_matches(TokenType.BAR)) {
+      Token operator = getAndAdvance();
+      expression = new BinaryExpression(
+          expression, operator, _parseBitwiseXorExpression());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse a block. Return the block that was parsed.
+   *
+   *     block ::=
+   *         '{' statements '}'
+   */
+  Block parseBlock() {
+    Token leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET);
+    List<Statement> statements = new List<Statement>();
+    Token statementStart = _currentToken;
+    while (
+        !_matches(TokenType.EOF) && !_matches(TokenType.CLOSE_CURLY_BRACKET)) {
+      Statement statement = parseStatement2();
+      if (statement != null) {
+        statements.add(statement);
+      }
+      if (identical(_currentToken, statementStart)) {
+        // Ensure that we are making progress and report an error if we're not.
+        _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken,
+            [_currentToken.lexeme]);
+        _advance();
+      }
+      statementStart = _currentToken;
+    }
+    Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET);
+    return new Block(leftBracket, statements, rightBracket);
+  }
+
+  /**
+   * Parse a class member. The [className] is the name of the class containing
+   * the member being parsed. Return the class member that was parsed, or `null`
+   * if what was found was not a valid class member.
+   *
+   *     classMemberDefinition ::=
+   *         declaration ';'
+   *       | methodSignature functionBody
+   */
+  ClassMember parseClassMember(String className) {
+    CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
+    Modifiers modifiers = _parseModifiers();
+    if (_matchesKeyword(Keyword.VOID)) {
+      TypeName returnType = parseReturnType();
+      if (_matchesKeyword(Keyword.GET) && _tokenMatchesIdentifier(_peek())) {
+        _validateModifiersForGetterOrSetterOrMethod(modifiers);
+        return _parseGetter(commentAndMetadata, modifiers.externalKeyword,
+            modifiers.staticKeyword, returnType);
+      } else if (_matchesKeyword(Keyword.SET) &&
+          _tokenMatchesIdentifier(_peek())) {
+        _validateModifiersForGetterOrSetterOrMethod(modifiers);
+        return _parseSetter(commentAndMetadata, modifiers.externalKeyword,
+            modifiers.staticKeyword, returnType);
+      } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) {
+        _validateModifiersForOperator(modifiers);
+        return _parseOperator(
+            commentAndMetadata, modifiers.externalKeyword, returnType);
+      } else if (_matchesIdentifier() &&
+          _peek().matchesAny([
+        TokenType.OPEN_PAREN,
+        TokenType.OPEN_CURLY_BRACKET,
+        TokenType.FUNCTION,
+        TokenType.LT
+      ])) {
+        _validateModifiersForGetterOrSetterOrMethod(modifiers);
+        return _parseMethodDeclarationAfterReturnType(commentAndMetadata,
+            modifiers.externalKeyword, modifiers.staticKeyword, returnType);
+      } else {
+        //
+        // We have found an error of some kind. Try to recover.
+        //
+        if (_matchesIdentifier()) {
+          if (_peek().matchesAny(
+              [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
+            //
+            // We appear to have a variable declaration with a type of "void".
+            //
+            _reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType);
+            return _parseInitializedIdentifierList(commentAndMetadata,
+                modifiers.staticKeyword, _validateModifiersForField(modifiers),
+                returnType);
+          }
+        }
+        if (_isOperator(_currentToken)) {
+          //
+          // We appear to have found an operator declaration without the
+          // 'operator' keyword.
+          //
+          _validateModifiersForOperator(modifiers);
+          return _parseOperator(
+              commentAndMetadata, modifiers.externalKeyword, returnType);
+        }
+        _reportErrorForToken(
+            ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken);
+        return null;
+      }
+    } else if (_matchesKeyword(Keyword.GET) &&
+        _tokenMatchesIdentifier(_peek())) {
+      _validateModifiersForGetterOrSetterOrMethod(modifiers);
+      return _parseGetter(commentAndMetadata, modifiers.externalKeyword,
+          modifiers.staticKeyword, null);
+    } else if (_matchesKeyword(Keyword.SET) &&
+        _tokenMatchesIdentifier(_peek())) {
+      _validateModifiersForGetterOrSetterOrMethod(modifiers);
+      return _parseSetter(commentAndMetadata, modifiers.externalKeyword,
+          modifiers.staticKeyword, null);
+    } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) {
+      _validateModifiersForOperator(modifiers);
+      return _parseOperator(
+          commentAndMetadata, modifiers.externalKeyword, null);
+    } else if (!_matchesIdentifier()) {
+      //
+      // Recover from an error.
+      //
+      if (_matchesKeyword(Keyword.CLASS)) {
+        _reportErrorForCurrentToken(ParserErrorCode.CLASS_IN_CLASS);
+        // TODO(brianwilkerson) We don't currently have any way to capture the
+        // class that was parsed.
+        _parseClassDeclaration(commentAndMetadata, null);
+        return null;
+      } else if (_matchesKeyword(Keyword.ABSTRACT) &&
+          _tokenMatchesKeyword(_peek(), Keyword.CLASS)) {
+        _reportErrorForToken(ParserErrorCode.CLASS_IN_CLASS, _peek());
+        // TODO(brianwilkerson) We don't currently have any way to capture the
+        // class that was parsed.
+        _parseClassDeclaration(commentAndMetadata, getAndAdvance());
+        return null;
+      } else if (_matchesKeyword(Keyword.ENUM)) {
+        _reportErrorForToken(ParserErrorCode.ENUM_IN_CLASS, _peek());
+        // TODO(brianwilkerson) We don't currently have any way to capture the
+        // enum that was parsed.
+        _parseEnumDeclaration(commentAndMetadata);
+        return null;
+      } else if (_isOperator(_currentToken)) {
+        //
+        // We appear to have found an operator declaration without the
+        // 'operator' keyword.
+        //
+        _validateModifiersForOperator(modifiers);
+        return _parseOperator(
+            commentAndMetadata, modifiers.externalKeyword, null);
+      }
+      Token keyword = modifiers.varKeyword;
+      if (keyword == null) {
+        keyword = modifiers.finalKeyword;
+      }
+      if (keyword == null) {
+        keyword = modifiers.constKeyword;
+      }
+      if (keyword != null) {
+        //
+        // We appear to have found an incomplete field declaration.
+        //
+        _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
+        List<VariableDeclaration> variables = new List<VariableDeclaration>();
+        variables.add(
+            new VariableDeclaration(_createSyntheticIdentifier(), null, null));
+        return new FieldDeclaration(commentAndMetadata.comment,
+            commentAndMetadata.metadata, null,
+            new VariableDeclarationList(null, null, keyword, null, variables),
+            _expectSemicolon());
+      }
+      _reportErrorForToken(
+          ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken);
+      if (commentAndMetadata.comment != null ||
+          !commentAndMetadata.metadata.isEmpty) {
+        //
+        // We appear to have found an incomplete declaration at the end of the
+        // class. At this point it consists of a metadata, which we don't want
+        // to loose, so we'll treat it as a method declaration with a missing
+        // name, parameters and empty body.
+        //
+        return new MethodDeclaration(commentAndMetadata.comment,
+            commentAndMetadata.metadata, null, null, null, null, null,
+            _createSyntheticIdentifier(), null, new FormalParameterList(
+                null, new List<FormalParameter>(), null, null, null),
+            new EmptyFunctionBody(_createSyntheticToken(TokenType.SEMICOLON)));
+      }
+      return null;
+    } else if (_tokenMatches(_peek(), TokenType.PERIOD) &&
+        _tokenMatchesIdentifier(_peekAt(2)) &&
+        _tokenMatches(_peekAt(3), TokenType.OPEN_PAREN)) {
+      return _parseConstructor(commentAndMetadata, modifiers.externalKeyword,
+          _validateModifiersForConstructor(modifiers), modifiers.factoryKeyword,
+          parseSimpleIdentifier(), getAndAdvance(), parseSimpleIdentifier(),
+          parseFormalParameterList());
+    } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+      SimpleIdentifier methodName = parseSimpleIdentifier();
+      FormalParameterList parameters = parseFormalParameterList();
+      if (_matches(TokenType.COLON) ||
+          modifiers.factoryKeyword != null ||
+          methodName.name == className) {
+        return _parseConstructor(commentAndMetadata, modifiers.externalKeyword,
+            _validateModifiersForConstructor(modifiers),
+            modifiers.factoryKeyword, methodName, null, null, parameters);
+      }
+      _validateModifiersForGetterOrSetterOrMethod(modifiers);
+      _validateFormalParameterList(parameters);
+      return _parseMethodDeclarationAfterParameters(commentAndMetadata,
+          modifiers.externalKeyword, modifiers.staticKeyword, null, methodName,
+          null, parameters);
+    } else if (_peek()
+        .matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
+      if (modifiers.constKeyword == null &&
+          modifiers.finalKeyword == null &&
+          modifiers.varKeyword == null) {
+        _reportErrorForCurrentToken(
+            ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE);
+      }
+      return _parseInitializedIdentifierList(commentAndMetadata,
+          modifiers.staticKeyword, _validateModifiersForField(modifiers), null);
+    } else if (_matchesKeyword(Keyword.TYPEDEF)) {
+      _reportErrorForCurrentToken(ParserErrorCode.TYPEDEF_IN_CLASS);
+      // TODO(brianwilkerson) We don't currently have any way to capture the
+      // function type alias that was parsed.
+      _parseFunctionTypeAlias(commentAndMetadata, getAndAdvance());
+      return null;
+    } else if (parseGenericMethods) {
+      Token token = _skipTypeParameterList(_peek());
+      if (token != null && _tokenMatches(token, TokenType.OPEN_PAREN)) {
+        return _parseMethodDeclarationAfterReturnType(commentAndMetadata,
+            modifiers.externalKeyword, modifiers.staticKeyword, null);
+      }
+    }
+    TypeName type = parseTypeName();
+    if (_matchesKeyword(Keyword.GET) && _tokenMatchesIdentifier(_peek())) {
+      _validateModifiersForGetterOrSetterOrMethod(modifiers);
+      return _parseGetter(commentAndMetadata, modifiers.externalKeyword,
+          modifiers.staticKeyword, type);
+    } else if (_matchesKeyword(Keyword.SET) &&
+        _tokenMatchesIdentifier(_peek())) {
+      _validateModifiersForGetterOrSetterOrMethod(modifiers);
+      return _parseSetter(commentAndMetadata, modifiers.externalKeyword,
+          modifiers.staticKeyword, type);
+    } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) {
+      _validateModifiersForOperator(modifiers);
+      return _parseOperator(
+          commentAndMetadata, modifiers.externalKeyword, type);
+    } else if (!_matchesIdentifier()) {
+      if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
+        //
+        // We appear to have found an incomplete declaration at the end of the
+        // class. At this point it consists of a type name, so we'll treat it as
+        // a field declaration with a missing field name and semicolon.
+        //
+        return _parseInitializedIdentifierList(commentAndMetadata,
+            modifiers.staticKeyword, _validateModifiersForField(modifiers),
+            type);
+      }
+      if (_isOperator(_currentToken)) {
+        //
+        // We appear to have found an operator declaration without the
+        // 'operator' keyword.
+        //
+        _validateModifiersForOperator(modifiers);
+        return _parseOperator(
+            commentAndMetadata, modifiers.externalKeyword, type);
+      }
+      //
+      // We appear to have found an incomplete declaration before another
+      // declaration. At this point it consists of a type name, so we'll treat
+      // it as a field declaration with a missing field name and semicolon.
+      //
+      _reportErrorForToken(
+          ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken);
+      try {
+        _lockErrorListener();
+        return _parseInitializedIdentifierList(commentAndMetadata,
+            modifiers.staticKeyword, _validateModifiersForField(modifiers),
+            type);
+      } finally {
+        _unlockErrorListener();
+      }
+    } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+      SimpleIdentifier methodName = parseSimpleIdentifier();
+      FormalParameterList parameters = parseFormalParameterList();
+      if (methodName.name == className) {
+        _reportErrorForNode(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, type);
+        return _parseConstructor(commentAndMetadata, modifiers.externalKeyword,
+            _validateModifiersForConstructor(modifiers),
+            modifiers.factoryKeyword, methodName, null, null, parameters);
+      }
+      _validateModifiersForGetterOrSetterOrMethod(modifiers);
+      _validateFormalParameterList(parameters);
+      return _parseMethodDeclarationAfterParameters(commentAndMetadata,
+          modifiers.externalKeyword, modifiers.staticKeyword, type, methodName,
+          null, parameters);
+    } else if (parseGenericMethods && _tokenMatches(_peek(), TokenType.LT)) {
+      return _parseMethodDeclarationAfterReturnType(commentAndMetadata,
+          modifiers.externalKeyword, modifiers.staticKeyword, type);
+    } else if (_tokenMatches(_peek(), TokenType.OPEN_CURLY_BRACKET)) {
+      // We have found "TypeName identifier {", and are guessing that this is a
+      // getter without the keyword 'get'.
+      _validateModifiersForGetterOrSetterOrMethod(modifiers);
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_GET);
+      _currentToken = _injectToken(
+          new Parser_SyntheticKeywordToken(Keyword.GET, _currentToken.offset));
+      return _parseGetter(commentAndMetadata, modifiers.externalKeyword,
+          modifiers.staticKeyword, type);
+    }
+    return _parseInitializedIdentifierList(commentAndMetadata,
+        modifiers.staticKeyword, _validateModifiersForField(modifiers), type);
+  }
+
+  /**
+   * Parse a single combinator. Return the combinator that was parsed, or `null`
+   * if no combinator is found.
+   *
+   *     combinator ::=
+   *         'show' identifier (',' identifier)*
+   *       | 'hide' identifier (',' identifier)*
+   */
+  Combinator parseCombinator() {
+    if (_matchesString(_SHOW) || _matchesString(_HIDE)) {
+      Token keyword = getAndAdvance();
+      List<SimpleIdentifier> names = _parseIdentifierList();
+      if (keyword.lexeme == _SHOW) {
+        return new ShowCombinator(keyword, names);
+      } else {
+        return new HideCombinator(keyword, names);
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Parse a compilation unit, starting with the given [token]. Return the
+   * compilation unit that was parsed.
+   */
+  CompilationUnit parseCompilationUnit(Token token) {
+    _currentToken = token;
+    return parseCompilationUnit2();
+  }
+
+  /**
+   * Parse a compilation unit. Return the compilation unit that was parsed.
+   *
+   * Specified:
+   *
+   *     compilationUnit ::=
+   *         scriptTag? directive* topLevelDeclaration*
+   *
+   * Actual:
+   *
+   *     compilationUnit ::=
+   *         scriptTag? topLevelElement*
+   *
+   *     topLevelElement ::=
+   *         directive
+   *       | topLevelDeclaration
+   */
+  CompilationUnit parseCompilationUnit2() {
+    Token firstToken = _currentToken;
+    ScriptTag scriptTag = null;
+    if (_matches(TokenType.SCRIPT_TAG)) {
+      scriptTag = new ScriptTag(getAndAdvance());
+    }
+    //
+    // Even though all directives must appear before declarations and must occur
+    // in a given order, we allow directives and declarations to occur in any
+    // order so that we can recover better.
+    //
+    bool libraryDirectiveFound = false;
+    bool partOfDirectiveFound = false;
+    bool partDirectiveFound = false;
+    bool directiveFoundAfterDeclaration = false;
+    List<Directive> directives = new List<Directive>();
+    List<CompilationUnitMember> declarations =
+        new List<CompilationUnitMember>();
+    Token memberStart = _currentToken;
+    while (!_matches(TokenType.EOF)) {
+      CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
+      if ((_matchesKeyword(Keyword.IMPORT) ||
+              _matchesKeyword(Keyword.EXPORT) ||
+              _matchesKeyword(Keyword.LIBRARY) ||
+              _matchesKeyword(Keyword.PART)) &&
+          !_tokenMatches(_peek(), TokenType.PERIOD) &&
+          !_tokenMatches(_peek(), TokenType.LT) &&
+          !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+        Directive directive = _parseDirective(commentAndMetadata);
+        if (declarations.length > 0 && !directiveFoundAfterDeclaration) {
+          _reportErrorForToken(ParserErrorCode.DIRECTIVE_AFTER_DECLARATION,
+              directive.beginToken);
+          directiveFoundAfterDeclaration = true;
+        }
+        if (directive is LibraryDirective) {
+          if (libraryDirectiveFound) {
+            _reportErrorForCurrentToken(
+                ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES);
+          } else {
+            if (directives.length > 0) {
+              _reportErrorForToken(ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST,
+                  directive.libraryKeyword);
+            }
+            libraryDirectiveFound = true;
+          }
+        } else if (directive is PartDirective) {
+          partDirectiveFound = true;
+        } else if (partDirectiveFound) {
+          if (directive is ExportDirective) {
+            _reportErrorForToken(
+                ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE,
+                directive.keyword);
+          } else if (directive is ImportDirective) {
+            _reportErrorForToken(
+                ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE,
+                directive.keyword);
+          }
+        }
+        if (directive is PartOfDirective) {
+          if (partOfDirectiveFound) {
+            _reportErrorForCurrentToken(
+                ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES);
+          } else {
+            int directiveCount = directives.length;
+            for (int i = 0; i < directiveCount; i++) {
+              _reportErrorForToken(
+                  ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART,
+                  directives[i].keyword);
+            }
+            partOfDirectiveFound = true;
+          }
+        } else {
+          if (partOfDirectiveFound) {
+            _reportErrorForToken(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART,
+                directive.keyword);
+          }
+        }
+        directives.add(directive);
+      } else if (_matches(TokenType.SEMICOLON)) {
+        _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken,
+            [_currentToken.lexeme]);
+        _advance();
+      } else {
+        CompilationUnitMember member =
+            _parseCompilationUnitMember(commentAndMetadata);
+        if (member != null) {
+          declarations.add(member);
+        }
+      }
+      if (identical(_currentToken, memberStart)) {
+        _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken,
+            [_currentToken.lexeme]);
+        _advance();
+        while (!_matches(TokenType.EOF) &&
+            !_couldBeStartOfCompilationUnitMember()) {
+          _advance();
+        }
+      }
+      memberStart = _currentToken;
+    }
+    return new CompilationUnit(
+        firstToken, scriptTag, directives, declarations, _currentToken);
+  }
+
+  /**
+   * Parse a conditional expression. Return the conditional expression that was
+   * parsed.
+   *
+   *     conditionalExpression ::=
+   *         ifNullExpression ('?' expressionWithoutCascade ':' expressionWithoutCascade)?
+   */
+  Expression parseConditionalExpression() {
+    Expression condition = parseIfNullExpression();
+    if (!_matches(TokenType.QUESTION)) {
+      return condition;
+    }
+    Token question = getAndAdvance();
+    Expression thenExpression = parseExpressionWithoutCascade();
+    Token colon = _expect(TokenType.COLON);
+    Expression elseExpression = parseExpressionWithoutCascade();
+    return new ConditionalExpression(
+        condition, question, thenExpression, colon, elseExpression);
+  }
+
+  /**
+   * Parse the name of a constructor. Return the constructor name that was
+   * parsed.
+   *
+   *     constructorName:
+   *         type ('.' identifier)?
+   */
+  ConstructorName parseConstructorName() {
+    TypeName type = parseTypeName();
+    Token period = null;
+    SimpleIdentifier name = null;
+    if (_matches(TokenType.PERIOD)) {
+      period = getAndAdvance();
+      name = parseSimpleIdentifier();
+    }
+    return new ConstructorName(type, period, name);
+  }
+
+  /**
+   * Parse the script tag and directives in a compilation unit, starting with
+   * the given [token], until the first non-directive is encountered. The
+   * remainder of the compilation unit will not be parsed. Specifically, if
+   * there are directives later in the file, they will not be parsed. Return the
+   * compilation unit that was parsed.
+   */
+  CompilationUnit parseDirectives(Token token) {
+    _currentToken = token;
+    return _parseDirectives();
+  }
+
+  /**
+   * Parse an expression, starting with the given [token]. Return the expression
+   * that was parsed, or `null` if the tokens do not represent a recognizable
+   * expression.
+   */
+  Expression parseExpression(Token token) {
+    _currentToken = token;
+    return parseExpression2();
+  }
+
+  /**
+   * Parse an expression that might contain a cascade. Return the expression
+   * that was parsed.
+   *
+   *     expression ::=
+   *         assignableExpression assignmentOperator expression
+   *       | conditionalExpression cascadeSection*
+   *       | throwExpression
+   */
+  Expression parseExpression2() {
+    if (_matchesKeyword(Keyword.THROW)) {
+      return _parseThrowExpression();
+    } else if (_matchesKeyword(Keyword.RETHROW)) {
+      // TODO(brianwilkerson) Rethrow is a statement again.
+      return _parseRethrowExpression();
+    }
+    //
+    // assignableExpression is a subset of conditionalExpression, so we can
+    // parse a conditional expression and then determine whether it is followed
+    // by an assignmentOperator, checking for conformance to the restricted
+    // grammar after making that determination.
+    //
+    Expression expression = parseConditionalExpression();
+    TokenType tokenType = _currentToken.type;
+    if (tokenType == TokenType.PERIOD_PERIOD) {
+      List<Expression> cascadeSections = new List<Expression>();
+      while (tokenType == TokenType.PERIOD_PERIOD) {
+        Expression section = _parseCascadeSection();
+        if (section != null) {
+          cascadeSections.add(section);
+        }
+        tokenType = _currentToken.type;
+      }
+      return new CascadeExpression(expression, cascadeSections);
+    } else if (tokenType.isAssignmentOperator) {
+      Token operator = getAndAdvance();
+      _ensureAssignable(expression);
+      return new AssignmentExpression(expression, operator, parseExpression2());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse an expression that does not contain any cascades. Return the
+   * expression that was parsed.
+   *
+   *     expressionWithoutCascade ::=
+   *         assignableExpression assignmentOperator expressionWithoutCascade
+   *       | conditionalExpression
+   *       | throwExpressionWithoutCascade
+   */
+  Expression parseExpressionWithoutCascade() {
+    if (_matchesKeyword(Keyword.THROW)) {
+      return _parseThrowExpressionWithoutCascade();
+    } else if (_matchesKeyword(Keyword.RETHROW)) {
+      return _parseRethrowExpression();
+    }
+    //
+    // assignableExpression is a subset of conditionalExpression, so we can
+    // parse a conditional expression and then determine whether it is followed
+    // by an assignmentOperator, checking for conformance to the restricted
+    // grammar after making that determination.
+    //
+    Expression expression = parseConditionalExpression();
+    if (_currentToken.type.isAssignmentOperator) {
+      Token operator = getAndAdvance();
+      _ensureAssignable(expression);
+      expression = new AssignmentExpression(
+          expression, operator, parseExpressionWithoutCascade());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse a class extends clause. Return the class extends clause that was
+   * parsed.
+   *
+   *     classExtendsClause ::=
+   *         'extends' type
+   */
+  ExtendsClause parseExtendsClause() {
+    Token keyword = _expectKeyword(Keyword.EXTENDS);
+    TypeName superclass = parseTypeName();
+    return new ExtendsClause(keyword, superclass);
+  }
+
+  /**
+   * Parse a list of formal parameters. Return the formal parameters that were
+   * parsed.
+   *
+   *     formalParameterList ::=
+   *         '(' ')'
+   *       | '(' normalFormalParameters (',' optionalFormalParameters)? ')'
+   *       | '(' optionalFormalParameters ')'
+   *
+   *     normalFormalParameters ::=
+   *         normalFormalParameter (',' normalFormalParameter)*
+   *
+   *     optionalFormalParameters ::=
+   *         optionalPositionalFormalParameters
+   *       | namedFormalParameters
+   *
+   *     optionalPositionalFormalParameters ::=
+   *         '[' defaultFormalParameter (',' defaultFormalParameter)* ']'
+   *
+   *     namedFormalParameters ::=
+   *         '{' defaultNamedParameter (',' defaultNamedParameter)* '}'
+   */
+  FormalParameterList parseFormalParameterList() {
+    Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
+    if (_matches(TokenType.CLOSE_PAREN)) {
+      return new FormalParameterList(
+          leftParenthesis, null, null, null, getAndAdvance());
+    }
+    //
+    // Even though it is invalid to have default parameters outside of brackets,
+    // required parameters inside of brackets, or multiple groups of default and
+    // named parameters, we allow all of these cases so that we can recover
+    // better.
+    //
+    List<FormalParameter> parameters = new List<FormalParameter>();
+    List<FormalParameter> normalParameters = new List<FormalParameter>();
+    List<FormalParameter> positionalParameters = new List<FormalParameter>();
+    List<FormalParameter> namedParameters = new List<FormalParameter>();
+    List<FormalParameter> currentParameters = normalParameters;
+    Token leftSquareBracket = null;
+    Token rightSquareBracket = null;
+    Token leftCurlyBracket = null;
+    Token rightCurlyBracket = null;
+    ParameterKind kind = ParameterKind.REQUIRED;
+    bool firstParameter = true;
+    bool reportedMuliplePositionalGroups = false;
+    bool reportedMulipleNamedGroups = false;
+    bool reportedMixedGroups = false;
+    bool wasOptionalParameter = false;
+    Token initialToken = null;
+    do {
+      if (firstParameter) {
+        firstParameter = false;
+      } else if (!_optional(TokenType.COMMA)) {
+        // TODO(brianwilkerson) The token is wrong, we need to recover from this
+        // case.
+        if (_getEndToken(leftParenthesis) != null) {
+          _reportErrorForCurrentToken(
+              ParserErrorCode.EXPECTED_TOKEN, [TokenType.COMMA.lexeme]);
+        } else {
+          _reportErrorForToken(ParserErrorCode.MISSING_CLOSING_PARENTHESIS,
+              _currentToken.previous);
+          break;
+        }
+      }
+      initialToken = _currentToken;
+      //
+      // Handle the beginning of parameter groups.
+      //
+      if (_matches(TokenType.OPEN_SQUARE_BRACKET)) {
+        wasOptionalParameter = true;
+        if (leftSquareBracket != null && !reportedMuliplePositionalGroups) {
+          _reportErrorForCurrentToken(
+              ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS);
+          reportedMuliplePositionalGroups = true;
+        }
+        if (leftCurlyBracket != null && !reportedMixedGroups) {
+          _reportErrorForCurrentToken(ParserErrorCode.MIXED_PARAMETER_GROUPS);
+          reportedMixedGroups = true;
+        }
+        leftSquareBracket = getAndAdvance();
+        currentParameters = positionalParameters;
+        kind = ParameterKind.POSITIONAL;
+      } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+        wasOptionalParameter = true;
+        if (leftCurlyBracket != null && !reportedMulipleNamedGroups) {
+          _reportErrorForCurrentToken(
+              ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS);
+          reportedMulipleNamedGroups = true;
+        }
+        if (leftSquareBracket != null && !reportedMixedGroups) {
+          _reportErrorForCurrentToken(ParserErrorCode.MIXED_PARAMETER_GROUPS);
+          reportedMixedGroups = true;
+        }
+        leftCurlyBracket = getAndAdvance();
+        currentParameters = namedParameters;
+        kind = ParameterKind.NAMED;
+      }
+      //
+      // Parse and record the parameter.
+      //
+      FormalParameter parameter = _parseFormalParameter(kind);
+      parameters.add(parameter);
+      currentParameters.add(parameter);
+      if (kind == ParameterKind.REQUIRED && wasOptionalParameter) {
+        _reportErrorForNode(
+            ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS, parameter);
+      }
+      //
+      // Handle the end of parameter groups.
+      //
+      // TODO(brianwilkerson) Improve the detection and reporting of missing and
+      // mismatched delimiters.
+      if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) {
+        rightSquareBracket = getAndAdvance();
+        currentParameters = normalParameters;
+        if (leftSquareBracket == null) {
+          if (leftCurlyBracket != null) {
+            _reportErrorForCurrentToken(
+                ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
+            rightCurlyBracket = rightSquareBracket;
+            rightSquareBracket = null;
+          } else {
+            _reportErrorForCurrentToken(
+                ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP,
+                ["["]);
+          }
+        }
+        kind = ParameterKind.REQUIRED;
+      } else if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
+        rightCurlyBracket = getAndAdvance();
+        currentParameters = normalParameters;
+        if (leftCurlyBracket == null) {
+          if (leftSquareBracket != null) {
+            _reportErrorForCurrentToken(
+                ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
+            rightSquareBracket = rightCurlyBracket;
+            rightCurlyBracket = null;
+          } else {
+            _reportErrorForCurrentToken(
+                ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP,
+                ["{"]);
+          }
+        }
+        kind = ParameterKind.REQUIRED;
+      }
+    } while (!_matches(TokenType.CLOSE_PAREN) &&
+        !identical(initialToken, _currentToken));
+    Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
+    //
+    // Check that the groups were closed correctly.
+    //
+    if (leftSquareBracket != null && rightSquareBracket == null) {
+      _reportErrorForCurrentToken(
+          ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["]"]);
+    }
+    if (leftCurlyBracket != null && rightCurlyBracket == null) {
+      _reportErrorForCurrentToken(
+          ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP, ["}"]);
+    }
+    //
+    // Build the parameter list.
+    //
+    if (leftSquareBracket == null) {
+      leftSquareBracket = leftCurlyBracket;
+    }
+    if (rightSquareBracket == null) {
+      rightSquareBracket = rightCurlyBracket;
+    }
+    return new FormalParameterList(leftParenthesis, parameters,
+        leftSquareBracket, rightSquareBracket, rightParenthesis);
+  }
+
+  /**
+   * Parse a function expression. Return the function expression that was
+   * parsed.
+   *
+   *     functionExpression ::=
+   *         typeParameters? formalParameterList functionExpressionBody
+   */
+  FunctionExpression parseFunctionExpression() {
+    TypeParameterList typeParameters = null;
+    if (parseGenericMethods && _matches(TokenType.LT)) {
+      typeParameters = parseTypeParameterList();
+    }
+    FormalParameterList parameters = parseFormalParameterList();
+    _validateFormalParameterList(parameters);
+    FunctionBody body =
+        _parseFunctionBody(false, ParserErrorCode.MISSING_FUNCTION_BODY, true);
+    return new FunctionExpression(typeParameters, parameters, body);
+  }
+
+  /**
+   * Parse an if-null expression.  Return the if-null expression that was
+   * parsed.
+   *
+   *     ifNullExpression ::= logicalOrExpression ('??' logicalOrExpression)*
+   */
+  Expression parseIfNullExpression() {
+    Expression expression = parseLogicalOrExpression();
+    while (_matches(TokenType.QUESTION_QUESTION)) {
+      Token operator = getAndAdvance();
+      expression = new BinaryExpression(
+          expression, operator, parseLogicalOrExpression());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse an implements clause. Return the implements clause that was parsed.
+   *
+   *     implementsClause ::=
+   *         'implements' type (',' type)*
+   */
+  ImplementsClause parseImplementsClause() {
+    Token keyword = _expectKeyword(Keyword.IMPLEMENTS);
+    List<TypeName> interfaces = new List<TypeName>();
+    interfaces.add(parseTypeName());
+    while (_optional(TokenType.COMMA)) {
+      interfaces.add(parseTypeName());
+    }
+    return new ImplementsClause(keyword, interfaces);
+  }
+
+  /**
+   * Parse a label. Return the label that was parsed.
+   *
+   *     label ::=
+   *         identifier ':'
+   */
+  Label parseLabel() {
+    SimpleIdentifier label = parseSimpleIdentifier();
+    Token colon = _expect(TokenType.COLON);
+    return new Label(label, colon);
+  }
+
+  /**
+   * Parse a library identifier. Return the library identifier that was parsed.
+   *
+   *     libraryIdentifier ::=
+   *         identifier ('.' identifier)*
+   */
+  LibraryIdentifier parseLibraryIdentifier() {
+    List<SimpleIdentifier> components = new List<SimpleIdentifier>();
+    components.add(parseSimpleIdentifier());
+    while (_matches(TokenType.PERIOD)) {
+      _advance();
+      components.add(parseSimpleIdentifier());
+    }
+    return new LibraryIdentifier(components);
+  }
+
+  /**
+   * Parse a logical or expression. Return the logical or expression that was
+   * parsed.
+   *
+   *     logicalOrExpression ::=
+   *         logicalAndExpression ('||' logicalAndExpression)*
+   */
+  Expression parseLogicalOrExpression() {
+    Expression expression = _parseLogicalAndExpression();
+    while (_matches(TokenType.BAR_BAR)) {
+      Token operator = getAndAdvance();
+      expression = new BinaryExpression(
+          expression, operator, _parseLogicalAndExpression());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse a map literal entry. Return the map literal entry that was parsed.
+   *
+   *     mapLiteralEntry ::=
+   *         expression ':' expression
+   */
+  MapLiteralEntry parseMapLiteralEntry() {
+    Expression key = parseExpression2();
+    Token separator = _expect(TokenType.COLON);
+    Expression value = parseExpression2();
+    return new MapLiteralEntry(key, separator, value);
+  }
+
+  /**
+   * Parse a normal formal parameter. Return the normal formal parameter that
+   * was parsed.
+   *
+   *     normalFormalParameter ::=
+   *         functionSignature
+   *       | fieldFormalParameter
+   *       | simpleFormalParameter
+   *
+   *     functionSignature:
+   *         metadata returnType? identifier typeParameters? formalParameterList
+   *
+   *     fieldFormalParameter ::=
+   *         metadata finalConstVarOrType? 'this' '.' identifier
+   *
+   *     simpleFormalParameter ::=
+   *         declaredIdentifier
+   *       | metadata identifier
+   */
+  NormalFormalParameter parseNormalFormalParameter() {
+    CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
+    FinalConstVarOrType holder = _parseFinalConstVarOrType(true);
+    Token thisKeyword = null;
+    Token period = null;
+    if (_matchesKeyword(Keyword.THIS)) {
+      thisKeyword = getAndAdvance();
+      period = _expect(TokenType.PERIOD);
+    }
+    SimpleIdentifier identifier = parseSimpleIdentifier();
+    TypeParameterList typeParameters = null;
+    if (parseGenericMethods && _matches(TokenType.LT)) {
+      typeParameters = parseTypeParameterList();
+    }
+    if (_matches(TokenType.OPEN_PAREN)) {
+      FormalParameterList parameters = parseFormalParameterList();
+      if (thisKeyword == null) {
+        if (holder.keyword != null) {
+          _reportErrorForToken(
+              ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, holder.keyword);
+        }
+        return new FunctionTypedFormalParameter(commentAndMetadata.comment,
+            commentAndMetadata.metadata, holder.type, identifier,
+            typeParameters, parameters);
+      } else {
+        return new FieldFormalParameter(commentAndMetadata.comment,
+            commentAndMetadata.metadata, holder.keyword, holder.type,
+            thisKeyword, period, identifier, typeParameters, parameters);
+      }
+    } else if (typeParameters != null) {
+      // TODO(brianwilkerson) Report an error. It looks like a function-typed
+      // parameter with no parameter list.
+      //_reportErrorForToken(ParserErrorCode.MISSING_PARAMETERS, typeParameters.endToken);
+    }
+    TypeName type = holder.type;
+    if (type != null) {
+      if (_tokenMatchesKeyword(type.name.beginToken, Keyword.VOID)) {
+        _reportErrorForToken(
+            ParserErrorCode.VOID_PARAMETER, type.name.beginToken);
+      } else if (holder.keyword != null &&
+          _tokenMatchesKeyword(holder.keyword, Keyword.VAR)) {
+        _reportErrorForToken(ParserErrorCode.VAR_AND_TYPE, holder.keyword);
+      }
+    }
+    if (thisKeyword != null) {
+      // TODO(brianwilkerson) If there are type parameters but no parameters,
+      // should we create a synthetic empty parameter list here so we can
+      // capture the type parameters?
+      return new FieldFormalParameter(commentAndMetadata.comment,
+          commentAndMetadata.metadata, holder.keyword, holder.type, thisKeyword,
+          period, identifier, null, null);
+    }
+    return new SimpleFormalParameter(commentAndMetadata.comment,
+        commentAndMetadata.metadata, holder.keyword, holder.type, identifier);
+  }
+
+  /**
+   * Parse a prefixed identifier. Return the prefixed identifier that was
+   * parsed.
+   *
+   *     prefixedIdentifier ::=
+   *         identifier ('.' identifier)?
+   */
+  Identifier parsePrefixedIdentifier() {
+    SimpleIdentifier qualifier = parseSimpleIdentifier();
+    if (!_matches(TokenType.PERIOD)) {
+      return qualifier;
+    }
+    Token period = getAndAdvance();
+    SimpleIdentifier qualified = parseSimpleIdentifier();
+    return new PrefixedIdentifier(qualifier, period, qualified);
+  }
+
+  /**
+   * Parse a return type. Return the return type that was parsed.
+   *
+   *     returnType ::=
+   *         'void'
+   *       | type
+   */
+  TypeName parseReturnType() {
+    if (_matchesKeyword(Keyword.VOID)) {
+      return new TypeName(new SimpleIdentifier(getAndAdvance()), null);
+    } else {
+      return parseTypeName();
+    }
+  }
+
+  /**
+   * Parse a simple identifier. Return the simple identifier that was parsed.
+   *
+   *     identifier ::=
+   *         IDENTIFIER
+   */
+  SimpleIdentifier parseSimpleIdentifier() {
+    if (_matchesIdentifier()) {
+      String lexeme = _currentToken.lexeme;
+      if ((_inAsync || _inGenerator) &&
+          (lexeme == 'async' || lexeme == 'await' || lexeme == 'yield')) {
+        _reportErrorForCurrentToken(
+            ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER);
+      }
+      return new SimpleIdentifier(getAndAdvance());
+    }
+    _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
+    return _createSyntheticIdentifier();
+  }
+
+  /**
+   * Parse a statement, starting with the given [token]. Return the statement
+   * that was parsed, or `null` if the tokens do not represent a recognizable
+   * statement.
+   */
+  Statement parseStatement(Token token) {
+    _currentToken = token;
+    return parseStatement2();
+  }
+
+  /**
+   * Parse a statement. Return the statement that was parsed.
+   *
+   *     statement ::=
+   *         label* nonLabeledStatement
+   */
+  Statement parseStatement2() {
+    List<Label> labels = new List<Label>();
+    while (_matchesIdentifier() && _tokenMatches(_peek(), TokenType.COLON)) {
+      labels.add(parseLabel());
+    }
+    Statement statement = _parseNonLabeledStatement();
+    if (labels.isEmpty) {
+      return statement;
+    }
+    return new LabeledStatement(labels, statement);
+  }
+
+  /**
+   * Parse a sequence of statements, starting with the given [token]. Return the
+   * statements that were parsed, or `null` if the tokens do not represent a
+   * recognizable sequence of statements.
+   */
+  List<Statement> parseStatements(Token token) {
+    _currentToken = token;
+    return _parseStatementList();
+  }
+
+  /**
+   * Parse a string literal. Return the string literal that was parsed.
+   *
+   *     stringLiteral ::=
+   *         MULTI_LINE_STRING+
+   *       | SINGLE_LINE_STRING+
+   */
+  StringLiteral parseStringLiteral() {
+    List<StringLiteral> strings = new List<StringLiteral>();
+    while (_matches(TokenType.STRING)) {
+      Token string = getAndAdvance();
+      if (_matches(TokenType.STRING_INTERPOLATION_EXPRESSION) ||
+          _matches(TokenType.STRING_INTERPOLATION_IDENTIFIER)) {
+        strings.add(_parseStringInterpolation(string));
+      } else {
+        strings.add(new SimpleStringLiteral(
+            string, _computeStringValue(string.lexeme, true, true)));
+      }
+    }
+    if (strings.length < 1) {
+      _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_STRING_LITERAL);
+      return _createSyntheticStringLiteral();
+    } else if (strings.length == 1) {
+      return strings[0];
+    } else {
+      return new AdjacentStrings(strings);
+    }
+  }
+
+  /**
+   * Parse a list of type arguments. Return the type argument list that was
+   * parsed.
+   *
+   *     typeArguments ::=
+   *         '<' typeList '>'
+   *
+   *     typeList ::=
+   *         type (',' type)*
+   */
+  TypeArgumentList parseTypeArgumentList() {
+    Token leftBracket = _expect(TokenType.LT);
+    List<TypeName> arguments = new List<TypeName>();
+    arguments.add(parseTypeName());
+    while (_optional(TokenType.COMMA)) {
+      arguments.add(parseTypeName());
+    }
+    Token rightBracket = _expectGt();
+    return new TypeArgumentList(leftBracket, arguments, rightBracket);
+  }
+
+  /**
+   * Parse a type name. Return the type name that was parsed.
+   *
+   *     type ::=
+   *         qualified typeArguments?
+   */
+  TypeName parseTypeName() {
+    Identifier typeName;
+    if (_matchesKeyword(Keyword.VAR)) {
+      _reportErrorForCurrentToken(ParserErrorCode.VAR_AS_TYPE_NAME);
+      typeName = new SimpleIdentifier(getAndAdvance());
+    } else if (_matchesIdentifier()) {
+      typeName = parsePrefixedIdentifier();
+    } else {
+      typeName = _createSyntheticIdentifier();
+      _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_TYPE_NAME);
+    }
+    TypeArgumentList typeArguments = null;
+    if (_matches(TokenType.LT)) {
+      typeArguments = parseTypeArgumentList();
+    }
+    return new TypeName(typeName, typeArguments);
+  }
+
+  /**
+   * Parse a type parameter. Return the type parameter that was parsed.
+   *
+   *     typeParameter ::=
+   *         metadata name ('extends' bound)?
+   */
+  TypeParameter parseTypeParameter() {
+    CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
+    SimpleIdentifier name = parseSimpleIdentifier();
+    if (_matchesKeyword(Keyword.EXTENDS)) {
+      Token keyword = getAndAdvance();
+      TypeName bound = parseTypeName();
+      return new TypeParameter(commentAndMetadata.comment,
+          commentAndMetadata.metadata, name, keyword, bound);
+    }
+    return new TypeParameter(commentAndMetadata.comment,
+        commentAndMetadata.metadata, name, null, null);
+  }
+
+  /**
+   * Parse a list of type parameters. Return the list of type parameters that
+   * were parsed.
+   *
+   *     typeParameterList ::=
+   *         '<' typeParameter (',' typeParameter)* '>'
+   */
+  TypeParameterList parseTypeParameterList() {
+    Token leftBracket = _expect(TokenType.LT);
+    List<TypeParameter> typeParameters = new List<TypeParameter>();
+    typeParameters.add(parseTypeParameter());
+    while (_optional(TokenType.COMMA)) {
+      typeParameters.add(parseTypeParameter());
+    }
+    Token rightBracket = _expectGt();
+    return new TypeParameterList(leftBracket, typeParameters, rightBracket);
+  }
+
+  /**
+   * Parse a with clause. Return the with clause that was parsed.
+   *
+   *     withClause ::=
+   *         'with' typeName (',' typeName)*
+   */
+  WithClause parseWithClause() {
+    Token with2 = _expectKeyword(Keyword.WITH);
+    List<TypeName> types = new List<TypeName>();
+    types.add(parseTypeName());
+    while (_optional(TokenType.COMMA)) {
+      types.add(parseTypeName());
+    }
+    return new WithClause(with2, types);
+  }
+
+  /**
+   * Advance to the next token in the token stream.
+   */
+  void _advance() {
+    _currentToken = _currentToken.next;
+  }
+
+  /**
+   * Append the character equivalent of the given [scalarValue] to the given
+   * [builder]. Use the [startIndex] and [endIndex] to report an error, and
+   * don't append anything to the builder, if the scalar value is invalid. The
+   * [escapeSequence] is the escape sequence that was parsed to produce the
+   * scalar value (used for error reporting).
+   */
+  void _appendScalarValue(StringBuffer buffer, String escapeSequence,
+      int scalarValue, int startIndex, int endIndex) {
+    if (scalarValue < 0 ||
+        scalarValue > Character.MAX_CODE_POINT ||
+        (scalarValue >= 0xD800 && scalarValue <= 0xDFFF)) {
+      _reportErrorForCurrentToken(
+          ParserErrorCode.INVALID_CODE_POINT, [escapeSequence]);
+      return;
+    }
+    if (scalarValue < Character.MAX_VALUE) {
+      buffer.writeCharCode(scalarValue);
+    } else {
+      buffer.write(Character.toChars(scalarValue));
+    }
+  }
+
+  /**
+   * Return the content of a string with the given literal representation. The
+   * [lexeme] is the literal representation of the string. The flag [isFirst] is
+   * `true` if this is the first token in a string literal. The flag [isLast] is
+   * `true` if this is the last token in a string literal.
+   */
+  String _computeStringValue(String lexeme, bool isFirst, bool isLast) {
+    StringLexemeHelper helper = new StringLexemeHelper(lexeme, isFirst, isLast);
+    int start = helper.start;
+    int end = helper.end;
+    bool stringEndsAfterStart = end >= start;
+    assert(stringEndsAfterStart);
+    if (!stringEndsAfterStart) {
+      AnalysisEngine.instance.logger.logError(
+          "Internal error: computeStringValue($lexeme, $isFirst, $isLast)");
+      return "";
+    }
+    if (helper.isRaw) {
+      return lexeme.substring(start, end);
+    }
+    StringBuffer buffer = new StringBuffer();
+    int index = start;
+    while (index < end) {
+      index = _translateCharacter(buffer, lexeme, index);
+    }
+    return buffer.toString();
+  }
+
+  /**
+   * Convert the given [method] declaration into the nearest valid top-level
+   * function declaration (that is, the function declaration that most closely
+   * captures the components of the given method declaration).
+   */
+  FunctionDeclaration _convertToFunctionDeclaration(MethodDeclaration method) =>
+      new FunctionDeclaration(method.documentationComment, method.metadata,
+          method.externalKeyword, method.returnType, method.propertyKeyword,
+          method.name, new FunctionExpression(
+              method.typeParameters, method.parameters, method.body));
+
+  /**
+   * Return `true` if the current token could be the start of a compilation unit
+   * member. This method is used for recovery purposes to decide when to stop
+   * skipping tokens after finding an error while parsing a compilation unit
+   * member.
+   */
+  bool _couldBeStartOfCompilationUnitMember() {
+    if ((_matchesKeyword(Keyword.IMPORT) ||
+            _matchesKeyword(Keyword.EXPORT) ||
+            _matchesKeyword(Keyword.LIBRARY) ||
+            _matchesKeyword(Keyword.PART)) &&
+        !_tokenMatches(_peek(), TokenType.PERIOD) &&
+        !_tokenMatches(_peek(), TokenType.LT)) {
+      // This looks like the start of a directive
+      return true;
+    } else if (_matchesKeyword(Keyword.CLASS)) {
+      // This looks like the start of a class definition
+      return true;
+    } else if (_matchesKeyword(Keyword.TYPEDEF) &&
+        !_tokenMatches(_peek(), TokenType.PERIOD) &&
+        !_tokenMatches(_peek(), TokenType.LT)) {
+      // This looks like the start of a typedef
+      return true;
+    } else if (_matchesKeyword(Keyword.VOID) ||
+        ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) &&
+            _tokenMatchesIdentifier(_peek())) ||
+        (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek()))) {
+      // This looks like the start of a function
+      return true;
+    } else if (_matchesIdentifier()) {
+      if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+        // This looks like the start of a function
+        return true;
+      }
+      Token token = _skipReturnType(_currentToken);
+      if (token == null) {
+        return false;
+      }
+      if (_matchesKeyword(Keyword.GET) ||
+          _matchesKeyword(Keyword.SET) ||
+          (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) ||
+          _matchesIdentifier()) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Return a synthetic identifier.
+   */
+  SimpleIdentifier _createSyntheticIdentifier() {
+    Token syntheticToken;
+    if (_currentToken.type == TokenType.KEYWORD) {
+      // Consider current keyword token as an identifier.
+      // It is not always true, e.g. "^is T" where "^" is place the place for
+      // synthetic identifier. By creating SyntheticStringToken we can
+      // distinguish a real identifier from synthetic. In the code completion
+      // behavior will depend on a cursor position - before or on "is".
+      syntheticToken = _injectToken(new SyntheticStringToken(
+          TokenType.IDENTIFIER, _currentToken.lexeme, _currentToken.offset));
+    } else {
+      syntheticToken = _createSyntheticToken(TokenType.IDENTIFIER);
+    }
+    return new SimpleIdentifier(syntheticToken);
+  }
+
+  /**
+   * Return a synthetic token representing the given [keyword].
+   */
+  Token _createSyntheticKeyword(Keyword keyword) => _injectToken(
+      new Parser_SyntheticKeywordToken(keyword, _currentToken.offset));
+
+  /**
+   * Return a synthetic string literal.
+   */
+  SimpleStringLiteral _createSyntheticStringLiteral() =>
+      new SimpleStringLiteral(_createSyntheticToken(TokenType.STRING), "");
+
+  /**
+   * Return a synthetic token with the given [type].
+   */
+  Token _createSyntheticToken(TokenType type) =>
+      _injectToken(new StringToken(type, "", _currentToken.offset));
+
+  /**
+   * Create and return a new token with the given [type]. The token will replace
+   * the first portion of the given [token], so it will have the same offset and
+   * will have any comments that might have preceeded the token.
+   */
+  Token _createToken(Token token, TokenType type, {bool isBegin: false}) {
+    CommentToken comments = token.precedingComments;
+    if (comments == null) {
+      if (isBegin) {
+        return new BeginToken(type, token.offset);
+      }
+      return new Token(type, token.offset);
+    } else if (isBegin) {
+      return new BeginTokenWithComment(type, token.offset, comments);
+    }
+    return new TokenWithComment(type, token.offset, comments);
+  }
+
+  /**
+   * Check that the given [expression] is assignable and report an error if it
+   * isn't.
+   *
+   *     assignableExpression ::=
+   *         primary (arguments* assignableSelector)+
+   *       | 'super' unconditionalAssignableSelector
+   *       | identifier
+   *
+   *     unconditionalAssignableSelector ::=
+   *         '[' expression ']'
+   *       | '.' identifier
+   *
+   *     assignableSelector ::=
+   *         unconditionalAssignableSelector
+   *       | '?.' identifier
+   */
+  void _ensureAssignable(Expression expression) {
+    if (expression != null && !expression.isAssignable) {
+      _reportErrorForCurrentToken(
+          ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE);
+    }
+  }
+
+  /**
+   * If the current token has the expected type, return it after advancing to
+   * the next token. Otherwise report an error and return the current token
+   * without advancing.
+   *
+   * Note that the method [_expectGt] should be used if the argument to this
+   * method would be [TokenType.GT].
+   *
+   * The [type] is the type of token that is expected.
+   */
+  Token _expect(TokenType type) {
+    if (_matches(type)) {
+      return getAndAdvance();
+    }
+    // Remove uses of this method in favor of matches?
+    // Pass in the error code to use to report the error?
+    if (type == TokenType.SEMICOLON) {
+      if (_tokenMatches(_currentToken.next, TokenType.SEMICOLON)) {
+        _reportErrorForCurrentToken(
+            ParserErrorCode.UNEXPECTED_TOKEN, [_currentToken.lexeme]);
+        _advance();
+        return getAndAdvance();
+      }
+      _reportErrorForToken(ParserErrorCode.EXPECTED_TOKEN,
+          _currentToken.previous, [type.lexeme]);
+    } else {
+      _reportErrorForCurrentToken(
+          ParserErrorCode.EXPECTED_TOKEN, [type.lexeme]);
+    }
+    return _currentToken;
+  }
+
+  /**
+   * If the current token has the type [TokenType.GT], return it after advancing
+   * to the next token. Otherwise report an error and return the current token
+   * without advancing.
+   */
+  Token _expectGt() {
+    if (_matchesGt()) {
+      return getAndAdvance();
+    }
+    _reportErrorForCurrentToken(
+        ParserErrorCode.EXPECTED_TOKEN, [TokenType.GT.lexeme]);
+    return _currentToken;
+  }
+
+  /**
+   * If the current token is a keyword matching the given [keyword], return it
+   * after advancing to the next token. Otherwise report an error and return the
+   * current token without advancing.
+   */
+  Token _expectKeyword(Keyword keyword) {
+    if (_matchesKeyword(keyword)) {
+      return getAndAdvance();
+    }
+    // Remove uses of this method in favor of matches?
+    // Pass in the error code to use to report the error?
+    _reportErrorForCurrentToken(
+        ParserErrorCode.EXPECTED_TOKEN, [keyword.syntax]);
+    return _currentToken;
+  }
+
+  /**
+   * If the current token is a semicolon, return it after advancing to the next
+   * token. Otherwise report an error and create a synthetic semicolon.
+   */
+  Token _expectSemicolon() {
+    // TODO(scheglov) consider pushing this behavior into [_expect]
+    if (_matches(TokenType.SEMICOLON)) {
+      return getAndAdvance();
+    } else {
+      _reportErrorForToken(
+          ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, [";"]);
+      return _createSyntheticToken(TokenType.SEMICOLON);
+    }
+  }
+
+  /**
+   * Search the given list of [ranges] for a range that contains the given
+   * [index]. Return the range that was found, or `null` if none of the ranges
+   * contain the index.
+   */
+  List<int> _findRange(List<List<int>> ranges, int index) {
+    int rangeCount = ranges.length;
+    for (int i = 0; i < rangeCount; i++) {
+      List<int> range = ranges[i];
+      if (range[0] <= index && index <= range[1]) {
+        return range;
+      } else if (index < range[0]) {
+        return null;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return a list of the ranges of characters in the given [comment] that
+   * should be treated as code blocks.
+   */
+  List<List<int>> _getCodeBlockRanges(String comment) {
+    List<List<int>> ranges = new List<List<int>>();
+    int length = comment.length;
+    if (length < 3) {
+      return ranges;
+    }
+    int index = 0;
+    int firstChar = comment.codeUnitAt(0);
+    if (firstChar == 0x2F) {
+      int secondChar = comment.codeUnitAt(1);
+      int thirdChar = comment.codeUnitAt(2);
+      if ((secondChar == 0x2A && thirdChar == 0x2A) ||
+          (secondChar == 0x2F && thirdChar == 0x2F)) {
+        index = 3;
+      }
+    }
+    while (index < length) {
+      int currentChar = comment.codeUnitAt(index);
+      if (currentChar == 0xD || currentChar == 0xA) {
+        index = index + 1;
+        while (index < length &&
+            Character.isWhitespace(comment.codeUnitAt(index))) {
+          index = index + 1;
+        }
+        if (StringUtilities.startsWith6(
+            comment, index, 0x2A, 0x20, 0x20, 0x20, 0x20, 0x20)) {
+          int end = index + 6;
+          while (end < length &&
+              comment.codeUnitAt(end) != 0xD &&
+              comment.codeUnitAt(end) != 0xA) {
+            end = end + 1;
+          }
+          ranges.add(<int>[index, end]);
+          index = end;
+        }
+      } else if (index + 1 < length &&
+          currentChar == 0x5B &&
+          comment.codeUnitAt(index + 1) == 0x3A) {
+        int end = StringUtilities.indexOf2(comment, index + 2, 0x3A, 0x5D);
+        if (end < 0) {
+          end = length;
+        }
+        ranges.add(<int>[index, end]);
+        index = end + 1;
+      } else {
+        index = index + 1;
+      }
+    }
+    return ranges;
+  }
+
+  /**
+   * Return the end token associated with the given [beginToken], or `null` if
+   * either the given token is not a begin token or it does not have an end
+   * token associated with it.
+   */
+  Token _getEndToken(Token beginToken) {
+    if (beginToken is BeginToken) {
+      return beginToken.endToken;
+    }
+    return null;
+  }
+
+  /**
+   * Inject the given [token] into the token stream immediately before the
+   * current token.
+   */
+  Token _injectToken(Token token) {
+    Token previous = _currentToken.previous;
+    token.setNext(_currentToken);
+    previous.setNext(token);
+    return token;
+  }
+
+  /**
+   * Return `true` if the current token appears to be the beginning of a
+   * function declaration.
+   */
+  bool _isFunctionDeclaration() {
+    if (_matchesKeyword(Keyword.VOID)) {
+      return true;
+    }
+    Token afterReturnType = _skipTypeName(_currentToken);
+    if (afterReturnType == null) {
+      // There was no return type, but it is optional, so go back to where we
+      // started.
+      afterReturnType = _currentToken;
+    }
+    Token afterIdentifier = _skipSimpleIdentifier(afterReturnType);
+    if (afterIdentifier == null) {
+      // It's possible that we parsed the function name as if it were a type
+      // name, so see whether it makes sense if we assume that there is no type.
+      afterIdentifier = _skipSimpleIdentifier(_currentToken);
+    }
+    if (afterIdentifier == null) {
+      return false;
+    }
+    if (_isFunctionExpression(afterIdentifier)) {
+      return true;
+    }
+    // It's possible that we have found a getter. While this isn't valid at this
+    // point we test for it in order to recover better.
+    if (_matchesKeyword(Keyword.GET)) {
+      Token afterName = _skipSimpleIdentifier(_currentToken.next);
+      if (afterName == null) {
+        return false;
+      }
+      return _tokenMatches(afterName, TokenType.FUNCTION) ||
+          _tokenMatches(afterName, TokenType.OPEN_CURLY_BRACKET);
+    } else if (_tokenMatchesKeyword(afterReturnType, Keyword.GET)) {
+      Token afterName = _skipSimpleIdentifier(afterReturnType.next);
+      if (afterName == null) {
+        return false;
+      }
+      return _tokenMatches(afterName, TokenType.FUNCTION) ||
+          _tokenMatches(afterName, TokenType.OPEN_CURLY_BRACKET);
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given [token] appears to be the beginning of a
+   * function expression.
+   */
+  bool _isFunctionExpression(Token token) {
+    // Function expressions aren't allowed in initializer lists.
+    if (_inInitializer) {
+      return false;
+    }
+    Token afterTypeParameters = _skipTypeParameterList(token);
+    if (afterTypeParameters == null) {
+      afterTypeParameters = token;
+    }
+    Token afterParameters = _skipFormalParameterList(afterTypeParameters);
+    if (afterParameters == null) {
+      return false;
+    }
+    if (afterParameters
+        .matchesAny([TokenType.OPEN_CURLY_BRACKET, TokenType.FUNCTION])) {
+      return true;
+    }
+    String lexeme = afterParameters.lexeme;
+    return lexeme == ASYNC || lexeme == SYNC;
+  }
+
+  /**
+   * Return `true` if the given [character] is a valid hexadecimal digit.
+   */
+  bool _isHexDigit(int character) => (0x30 <= character && character <= 0x39) ||
+      (0x41 <= character && character <= 0x46) ||
+      (0x61 <= character && character <= 0x66);
+
+  /**
+   * Return `true` if the current token is the first token in an initialized
+   * variable declaration rather than an expression. This method assumes that we
+   * have already skipped past any metadata that might be associated with the
+   * declaration.
+   *
+   *     initializedVariableDeclaration ::=
+   *         declaredIdentifier ('=' expression)? (',' initializedIdentifier)*
+   *
+   *     declaredIdentifier ::=
+   *         metadata finalConstVarOrType identifier
+   *
+   *     finalConstVarOrType ::=
+   *         'final' type?
+   *       | 'const' type?
+   *       | 'var'
+   *       | type
+   *
+   *     type ::=
+   *         qualified typeArguments?
+   *
+   *     initializedIdentifier ::=
+   *         identifier ('=' expression)?
+   */
+  bool _isInitializedVariableDeclaration() {
+    if (_matchesKeyword(Keyword.FINAL) || _matchesKeyword(Keyword.VAR)) {
+      // An expression cannot start with a keyword other than 'const',
+      // 'rethrow', or 'throw'.
+      return true;
+    }
+    if (_matchesKeyword(Keyword.CONST)) {
+      // Look to see whether we might be at the start of a list or map literal,
+      // otherwise this should be the start of a variable declaration.
+      return !_peek().matchesAny([
+        TokenType.LT,
+        TokenType.OPEN_CURLY_BRACKET,
+        TokenType.OPEN_SQUARE_BRACKET,
+        TokenType.INDEX
+      ]);
+    }
+    // We know that we have an identifier, and need to see whether it might be
+    // a type name.
+    Token token = _skipTypeName(_currentToken);
+    if (token == null) {
+      // There was no type name, so this can't be a declaration.
+      return false;
+    }
+    token = _skipSimpleIdentifier(token);
+    if (token == null) {
+      return false;
+    }
+    TokenType type = token.type;
+    return type == TokenType.EQ ||
+        type == TokenType.COMMA ||
+        type == TokenType.SEMICOLON ||
+        _tokenMatchesKeyword(token, Keyword.IN);
+  }
+
+  bool _isLikelyParameterList() {
+    if (_matches(TokenType.OPEN_PAREN)) {
+      return true;
+    }
+    if (!parseGenericMethods) {
+      return false;
+    }
+    Token token = _skipTypeArgumentList(_currentToken);
+    return token != null && _tokenMatches(token, TokenType.OPEN_PAREN);
+  }
+
+  /**
+   * Given that we have just found bracketed text within the given [comment],
+   * look to see whether that text is (a) followed by a parenthesized link
+   * address, (b) followed by a colon, or (c) followed by optional whitespace
+   * and another square bracket. The [rightIndex] is the index of the right
+   * bracket. Return `true` if the bracketed text is followed by a link address.
+   *
+   * This method uses the syntax described by the
+   * <a href="http://daringfireball.net/projects/markdown/syntax">markdown</a>
+   * project.
+   */
+  bool _isLinkText(String comment, int rightIndex) {
+    int length = comment.length;
+    int index = rightIndex + 1;
+    if (index >= length) {
+      return false;
+    }
+    int nextChar = comment.codeUnitAt(index);
+    if (nextChar == 0x28 || nextChar == 0x3A) {
+      return true;
+    }
+    while (Character.isWhitespace(nextChar)) {
+      index = index + 1;
+      if (index >= length) {
+        return false;
+      }
+      nextChar = comment.codeUnitAt(index);
+    }
+    return nextChar == 0x5B;
+  }
+
+  /**
+   * Return `true` if the given [startToken] appears to be the beginning of an
+   * operator declaration.
+   */
+  bool _isOperator(Token startToken) {
+    // Accept any operator here, even if it is not user definable.
+    if (!startToken.isOperator) {
+      return false;
+    }
+    // Token "=" means that it is actually field initializer.
+    if (startToken.type == TokenType.EQ) {
+      return false;
+    }
+    // Consume all operator tokens.
+    Token token = startToken.next;
+    while (token.isOperator) {
+      token = token.next;
+    }
+    // Formal parameter list is expect now.
+    return _tokenMatches(token, TokenType.OPEN_PAREN);
+  }
+
+  /**
+   * Return `true` if the current token appears to be the beginning of a switch
+   * member.
+   */
+  bool _isSwitchMember() {
+    Token token = _currentToken;
+    while (_tokenMatches(token, TokenType.IDENTIFIER) &&
+        _tokenMatches(token.next, TokenType.COLON)) {
+      token = token.next.next;
+    }
+    if (token.type == TokenType.KEYWORD) {
+      Keyword keyword = (token as KeywordToken).keyword;
+      return keyword == Keyword.CASE || keyword == Keyword.DEFAULT;
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the [startToken] appears to be the first token of a type
+   * name that is followed by a variable or field formal parameter.
+   */
+  bool _isTypedIdentifier(Token startToken) {
+    Token token = _skipReturnType(startToken);
+    if (token == null) {
+      return false;
+    } else if (_tokenMatchesIdentifier(token)) {
+      return true;
+    } else if (_tokenMatchesKeyword(token, Keyword.THIS) &&
+        _tokenMatches(token.next, TokenType.PERIOD) &&
+        _tokenMatchesIdentifier(token.next.next)) {
+      return true;
+    } else if (_tokenMatchesKeyword(startToken, Keyword.VOID)) {
+      // The keyword 'void' isn't a valid identifier, so it should be assumed to
+      // be a type name.
+      return true;
+    } else if (startToken.next != token &&
+        !_tokenMatches(token, TokenType.OPEN_PAREN)) {
+      // The type is more than a simple identifier, so it should be assumed to
+      // be a type name.
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Increments the error reporting lock level. If level is more than `0`, then
+   * [reportError] wont report any error.
+   */
+  void _lockErrorListener() {
+    _errorListenerLock++;
+  }
+
+  /**
+   * Return `true` if the current token has the given [type]. Note that the
+   * method [_matchesGt] should be used if the argument to this method would be
+   * [TokenType.GT].
+   */
+  bool _matches(TokenType type) => _currentToken.type == type;
+
+  /**
+   * Return `true` if the current token has a type of [TokenType.GT]. Note that
+   * this method, unlike other variants, will modify the token stream if
+   * possible to match desired type. In particular, if the next token is either
+   * a '>>' or '>>>', the token stream will be re-written and `true` will be
+   * returned.
+   */
+  bool _matchesGt() {
+    TokenType currentType = _currentToken.type;
+    if (currentType == TokenType.GT) {
+      return true;
+    } else if (currentType == TokenType.GT_GT) {
+      Token first = _createToken(_currentToken, TokenType.GT);
+      Token second = new Token(TokenType.GT, _currentToken.offset + 1);
+      second.setNext(_currentToken.next);
+      first.setNext(second);
+      _currentToken.previous.setNext(first);
+      _currentToken = first;
+      return true;
+    } else if (currentType == TokenType.GT_EQ) {
+      Token first = _createToken(_currentToken, TokenType.GT);
+      Token second = new Token(TokenType.EQ, _currentToken.offset + 1);
+      second.setNext(_currentToken.next);
+      first.setNext(second);
+      _currentToken.previous.setNext(first);
+      _currentToken = first;
+      return true;
+    } else if (currentType == TokenType.GT_GT_EQ) {
+      int offset = _currentToken.offset;
+      Token first = _createToken(_currentToken, TokenType.GT);
+      Token second = new Token(TokenType.GT, offset + 1);
+      Token third = new Token(TokenType.EQ, offset + 2);
+      third.setNext(_currentToken.next);
+      second.setNext(third);
+      first.setNext(second);
+      _currentToken.previous.setNext(first);
+      _currentToken = first;
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the current token is a valid identifier. Valid identifiers
+   * include built-in identifiers (pseudo-keywords).
+   */
+  bool _matchesIdentifier() => _tokenMatchesIdentifier(_currentToken);
+
+  /**
+   * Return `true` if the current token matches the given [keyword].
+   */
+  bool _matchesKeyword(Keyword keyword) =>
+      _tokenMatchesKeyword(_currentToken, keyword);
+
+  /**
+   * Return `true` if the current token matches the given [identifier].
+   */
+  bool _matchesString(String identifier) =>
+      _currentToken.type == TokenType.IDENTIFIER &&
+          _currentToken.lexeme == identifier;
+
+  /**
+   * If the current token has the given [type], then advance to the next token
+   * and return `true`. Otherwise, return `false` without advancing. This method
+   * should not be invoked with an argument value of [TokenType.GT].
+   */
+  bool _optional(TokenType type) {
+    if (_matches(type)) {
+      _advance();
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Parse an additive expression. Return the additive expression that was
+   * parsed.
+   *
+   *     additiveExpression ::=
+   *         multiplicativeExpression (additiveOperator multiplicativeExpression)*
+   *       | 'super' (additiveOperator multiplicativeExpression)+
+   */
+  Expression _parseAdditiveExpression() {
+    Expression expression;
+    if (_matchesKeyword(Keyword.SUPER) &&
+        _currentToken.next.type.isAdditiveOperator) {
+      expression = new SuperExpression(getAndAdvance());
+    } else {
+      expression = _parseMultiplicativeExpression();
+    }
+    while (_currentToken.type.isAdditiveOperator) {
+      Token operator = getAndAdvance();
+      expression = new BinaryExpression(
+          expression, operator, _parseMultiplicativeExpression());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse an assert statement. Return the assert statement.
+   *
+   *     assertStatement ::=
+   *         'assert' '(' conditionalExpression ')' ';'
+   */
+  AssertStatement _parseAssertStatement() {
+    Token keyword = _expectKeyword(Keyword.ASSERT);
+    Token leftParen = _expect(TokenType.OPEN_PAREN);
+    Expression expression = parseExpression2();
+    if (expression is AssignmentExpression) {
+      _reportErrorForNode(
+          ParserErrorCode.ASSERT_DOES_NOT_TAKE_ASSIGNMENT, expression);
+    } else if (expression is CascadeExpression) {
+      _reportErrorForNode(
+          ParserErrorCode.ASSERT_DOES_NOT_TAKE_CASCADE, expression);
+    } else if (expression is ThrowExpression) {
+      _reportErrorForNode(
+          ParserErrorCode.ASSERT_DOES_NOT_TAKE_THROW, expression);
+    } else if (expression is RethrowExpression) {
+      _reportErrorForNode(
+          ParserErrorCode.ASSERT_DOES_NOT_TAKE_RETHROW, expression);
+    }
+    Token rightParen = _expect(TokenType.CLOSE_PAREN);
+    Token semicolon = _expect(TokenType.SEMICOLON);
+    return new AssertStatement(
+        keyword, leftParen, expression, rightParen, semicolon);
+  }
+
+  /**
+   * Parse an assignable expression. The [primaryAllowed] is `true` if the
+   * expression is allowed to be a primary without any assignable selector.
+   * Return the assignable expression that was parsed.
+   *
+   *     assignableExpression ::=
+   *         primary (arguments* assignableSelector)+
+   *       | 'super' unconditionalAssignableSelector
+   *       | identifier
+   */
+  Expression _parseAssignableExpression(bool primaryAllowed) {
+    if (_matchesKeyword(Keyword.SUPER)) {
+      return _parseAssignableSelector(
+          new SuperExpression(getAndAdvance()), false, allowConditional: false);
+    }
+    //
+    // A primary expression can start with an identifier. We resolve the
+    // ambiguity by determining whether the primary consists of anything other
+    // than an identifier and/or is followed by an assignableSelector.
+    //
+    Expression expression = _parsePrimaryExpression();
+    bool isOptional = primaryAllowed || expression is SimpleIdentifier;
+    while (true) {
+      while (_isLikelyParameterList()) {
+        TypeArgumentList typeArguments = null;
+        if (_matches(TokenType.LT)) {
+          typeArguments = parseTypeArgumentList();
+        }
+        ArgumentList argumentList = parseArgumentList();
+        if (expression is SimpleIdentifier) {
+          expression = new MethodInvocation(null, null,
+              expression as SimpleIdentifier, typeArguments, argumentList);
+        } else if (expression is PrefixedIdentifier) {
+          PrefixedIdentifier identifier = expression as PrefixedIdentifier;
+          expression = new MethodInvocation(identifier.prefix,
+              identifier.period, identifier.identifier, typeArguments,
+              argumentList);
+        } else if (expression is PropertyAccess) {
+          PropertyAccess access = expression as PropertyAccess;
+          expression = new MethodInvocation(access.target, access.operator,
+              access.propertyName, typeArguments, argumentList);
+        } else {
+          expression = new FunctionExpressionInvocation(
+              expression, typeArguments, argumentList);
+        }
+        if (!primaryAllowed) {
+          isOptional = false;
+        }
+      }
+      Expression selectorExpression = _parseAssignableSelector(
+          expression, isOptional || (expression is PrefixedIdentifier));
+      if (identical(selectorExpression, expression)) {
+        if (!isOptional && (expression is PrefixedIdentifier)) {
+          PrefixedIdentifier identifier = expression as PrefixedIdentifier;
+          expression = new PropertyAccess(
+              identifier.prefix, identifier.period, identifier.identifier);
+        }
+        return expression;
+      }
+      expression = selectorExpression;
+      isOptional = true;
+    }
+  }
+
+  /**
+   * Parse an assignable selector. The [prefix] is the expression preceding the
+   * selector. The [optional] is `true` if the selector is optional. Return the
+   * assignable selector that was parsed, or the original prefix if there was no
+   * assignable selector.  If [allowConditional] is false, then the '?.'
+   * operator will still be parsed, but a parse error will be generated.
+   *
+   *     unconditionalAssignableSelector ::=
+   *         '[' expression ']'
+   *       | '.' identifier
+   *
+   *     assignableSelector ::=
+   *         unconditionalAssignableSelector
+   *       | '?.' identifier
+   */
+  Expression _parseAssignableSelector(Expression prefix, bool optional,
+      {bool allowConditional: true}) {
+    if (_matches(TokenType.OPEN_SQUARE_BRACKET)) {
+      Token leftBracket = getAndAdvance();
+      bool wasInInitializer = _inInitializer;
+      _inInitializer = false;
+      try {
+        Expression index = parseExpression2();
+        Token rightBracket = _expect(TokenType.CLOSE_SQUARE_BRACKET);
+        return new IndexExpression.forTarget(
+            prefix, leftBracket, index, rightBracket);
+      } finally {
+        _inInitializer = wasInInitializer;
+      }
+    } else if (_matches(TokenType.PERIOD) ||
+        _matches(TokenType.QUESTION_PERIOD)) {
+      if (_matches(TokenType.QUESTION_PERIOD) && !allowConditional) {
+        _reportErrorForCurrentToken(
+            ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, [_currentToken.lexeme]);
+      }
+      Token operator = getAndAdvance();
+      return new PropertyAccess(prefix, operator, parseSimpleIdentifier());
+    } else {
+      if (!optional) {
+        // Report the missing selector.
+        _reportErrorForCurrentToken(
+            ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR);
+      }
+      return prefix;
+    }
+  }
+
+  /**
+   * Parse a await expression. Return the await expression that was parsed.
+   *
+   *     awaitExpression ::=
+   *         'await' unaryExpression
+   */
+  AwaitExpression _parseAwaitExpression() {
+    Token awaitToken = getAndAdvance();
+    Expression expression = _parseUnaryExpression();
+    return new AwaitExpression(awaitToken, expression);
+  }
+
+  /**
+   * Parse a bitwise and expression. Return the bitwise and expression that was
+   * parsed.
+   *
+   *     bitwiseAndExpression ::=
+   *         shiftExpression ('&' shiftExpression)*
+   *       | 'super' ('&' shiftExpression)+
+   */
+  Expression _parseBitwiseAndExpression() {
+    Expression expression;
+    if (_matchesKeyword(Keyword.SUPER) &&
+        _tokenMatches(_peek(), TokenType.AMPERSAND)) {
+      expression = new SuperExpression(getAndAdvance());
+    } else {
+      expression = _parseShiftExpression();
+    }
+    while (_matches(TokenType.AMPERSAND)) {
+      Token operator = getAndAdvance();
+      expression =
+          new BinaryExpression(expression, operator, _parseShiftExpression());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse a bitwise exclusive-or expression. Return the bitwise exclusive-or
+   * expression that was parsed.
+   *
+   *     bitwiseXorExpression ::=
+   *         bitwiseAndExpression ('^' bitwiseAndExpression)*
+   *       | 'super' ('^' bitwiseAndExpression)+
+   */
+  Expression _parseBitwiseXorExpression() {
+    Expression expression;
+    if (_matchesKeyword(Keyword.SUPER) &&
+        _tokenMatches(_peek(), TokenType.CARET)) {
+      expression = new SuperExpression(getAndAdvance());
+    } else {
+      expression = _parseBitwiseAndExpression();
+    }
+    while (_matches(TokenType.CARET)) {
+      Token operator = getAndAdvance();
+      expression = new BinaryExpression(
+          expression, operator, _parseBitwiseAndExpression());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse a break statement. Return the break statement that was parsed.
+   *
+   *     breakStatement ::=
+   *         'break' identifier? ';'
+   */
+  Statement _parseBreakStatement() {
+    Token breakKeyword = _expectKeyword(Keyword.BREAK);
+    SimpleIdentifier label = null;
+    if (_matchesIdentifier()) {
+      label = parseSimpleIdentifier();
+    }
+    if (!_inLoop && !_inSwitch && label == null) {
+      _reportErrorForToken(ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, breakKeyword);
+    }
+    Token semicolon = _expect(TokenType.SEMICOLON);
+    return new BreakStatement(breakKeyword, label, semicolon);
+  }
+
+  /**
+   * Parse a cascade section. Return the expression representing the cascaded
+   * method invocation.
+   *
+   *     cascadeSection ::=
+   *         '..' (cascadeSelector typeArguments? arguments*)
+   *         (assignableSelector typeArguments? arguments*)* cascadeAssignment?
+   *
+   *     cascadeSelector ::=
+   *         '[' expression ']'
+   *       | identifier
+   *
+   *     cascadeAssignment ::=
+   *         assignmentOperator expressionWithoutCascade
+   */
+  Expression _parseCascadeSection() {
+    Token period = _expect(TokenType.PERIOD_PERIOD);
+    Expression expression = null;
+    SimpleIdentifier functionName = null;
+    if (_matchesIdentifier()) {
+      functionName = parseSimpleIdentifier();
+    } else if (_currentToken.type == TokenType.OPEN_SQUARE_BRACKET) {
+      Token leftBracket = getAndAdvance();
+      bool wasInInitializer = _inInitializer;
+      _inInitializer = false;
+      try {
+        Expression index = parseExpression2();
+        Token rightBracket = _expect(TokenType.CLOSE_SQUARE_BRACKET);
+        expression = new IndexExpression.forCascade(
+            period, leftBracket, index, rightBracket);
+        period = null;
+      } finally {
+        _inInitializer = wasInInitializer;
+      }
+    } else {
+      _reportErrorForToken(ParserErrorCode.MISSING_IDENTIFIER, _currentToken,
+          [_currentToken.lexeme]);
+      functionName = _createSyntheticIdentifier();
+    }
+    assert((expression == null && functionName != null) ||
+        (expression != null && functionName == null));
+    if (_isLikelyParameterList()) {
+      while (_isLikelyParameterList()) {
+        TypeArgumentList typeArguments = null;
+        if (_matches(TokenType.LT)) {
+          typeArguments = parseTypeArgumentList();
+        }
+        if (functionName != null) {
+          expression = new MethodInvocation(expression, period, functionName,
+              typeArguments, parseArgumentList());
+          period = null;
+          functionName = null;
+        } else if (expression == null) {
+          // It should not be possible to get here.
+          expression = new MethodInvocation(expression, period,
+              _createSyntheticIdentifier(), typeArguments, parseArgumentList());
+        } else {
+          expression = new FunctionExpressionInvocation(
+              expression, typeArguments, parseArgumentList());
+        }
+      }
+    } else if (functionName != null) {
+      expression = new PropertyAccess(expression, period, functionName);
+      period = null;
+    }
+    assert(expression != null);
+    bool progress = true;
+    while (progress) {
+      progress = false;
+      Expression selector = _parseAssignableSelector(expression, true);
+      if (!identical(selector, expression)) {
+        expression = selector;
+        progress = true;
+        while (_isLikelyParameterList()) {
+          TypeArgumentList typeArguments = null;
+          if (_matches(TokenType.LT)) {
+            typeArguments = parseTypeArgumentList();
+          }
+          if (expression is PropertyAccess) {
+            PropertyAccess propertyAccess = expression as PropertyAccess;
+            expression = new MethodInvocation(propertyAccess.target,
+                propertyAccess.operator, propertyAccess.propertyName,
+                typeArguments, parseArgumentList());
+          } else {
+            expression = new FunctionExpressionInvocation(
+                expression, typeArguments, parseArgumentList());
+          }
+        }
+      }
+    }
+    if (_currentToken.type.isAssignmentOperator) {
+      Token operator = getAndAdvance();
+      _ensureAssignable(expression);
+      expression = new AssignmentExpression(
+          expression, operator, parseExpressionWithoutCascade());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse a class declaration. The [commentAndMetadata] is the metadata to be
+   * associated with the member. The [abstractKeyword] is the token for the
+   * keyword 'abstract', or `null` if the keyword was not given. Return the
+   * class declaration that was parsed.
+   *
+   *     classDeclaration ::=
+   *         metadata 'abstract'? 'class' name typeParameterList? (extendsClause withClause?)? implementsClause? '{' classMembers '}' |
+   *         metadata 'abstract'? 'class' mixinApplicationClass
+   */
+  CompilationUnitMember _parseClassDeclaration(
+      CommentAndMetadata commentAndMetadata, Token abstractKeyword) {
+    Token keyword = _expectKeyword(Keyword.CLASS);
+    if (_matchesIdentifier()) {
+      Token next = _peek();
+      if (_tokenMatches(next, TokenType.LT)) {
+        next = _skipTypeParameterList(next);
+        if (next != null && _tokenMatches(next, TokenType.EQ)) {
+          return _parseClassTypeAlias(
+              commentAndMetadata, abstractKeyword, keyword);
+        }
+      } else if (_tokenMatches(next, TokenType.EQ)) {
+        return _parseClassTypeAlias(
+            commentAndMetadata, abstractKeyword, keyword);
+      }
+    }
+    SimpleIdentifier name = parseSimpleIdentifier();
+    String className = name.name;
+    TypeParameterList typeParameters = null;
+    if (_matches(TokenType.LT)) {
+      typeParameters = parseTypeParameterList();
+    }
+    //
+    // Parse the clauses. The parser accepts clauses in any order, but will
+    // generate errors if they are not in the order required by the
+    // specification.
+    //
+    ExtendsClause extendsClause = null;
+    WithClause withClause = null;
+    ImplementsClause implementsClause = null;
+    bool foundClause = true;
+    while (foundClause) {
+      if (_matchesKeyword(Keyword.EXTENDS)) {
+        if (extendsClause == null) {
+          extendsClause = parseExtendsClause();
+          if (withClause != null) {
+            _reportErrorForToken(
+                ParserErrorCode.WITH_BEFORE_EXTENDS, withClause.withKeyword);
+          } else if (implementsClause != null) {
+            _reportErrorForToken(ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS,
+                implementsClause.implementsKeyword);
+          }
+        } else {
+          _reportErrorForToken(ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES,
+              extendsClause.extendsKeyword);
+          parseExtendsClause();
+        }
+      } else if (_matchesKeyword(Keyword.WITH)) {
+        if (withClause == null) {
+          withClause = parseWithClause();
+          if (implementsClause != null) {
+            _reportErrorForToken(ParserErrorCode.IMPLEMENTS_BEFORE_WITH,
+                implementsClause.implementsKeyword);
+          }
+        } else {
+          _reportErrorForToken(
+              ParserErrorCode.MULTIPLE_WITH_CLAUSES, withClause.withKeyword);
+          parseWithClause();
+          // TODO(brianwilkerson) Should we merge the list of applied mixins
+          // into a single list?
+        }
+      } else if (_matchesKeyword(Keyword.IMPLEMENTS)) {
+        if (implementsClause == null) {
+          implementsClause = parseImplementsClause();
+        } else {
+          _reportErrorForToken(ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES,
+              implementsClause.implementsKeyword);
+          parseImplementsClause();
+          // TODO(brianwilkerson) Should we merge the list of implemented
+          // classes into a single list?
+        }
+      } else {
+        foundClause = false;
+      }
+    }
+    if (withClause != null && extendsClause == null) {
+      _reportErrorForToken(
+          ParserErrorCode.WITH_WITHOUT_EXTENDS, withClause.withKeyword);
+    }
+    //
+    // Look for and skip over the extra-lingual 'native' specification.
+    //
+    NativeClause nativeClause = null;
+    if (_matchesString(_NATIVE) && _tokenMatches(_peek(), TokenType.STRING)) {
+      nativeClause = _parseNativeClause();
+    }
+    //
+    // Parse the body of the class.
+    //
+    Token leftBracket = null;
+    List<ClassMember> members = null;
+    Token rightBracket = null;
+    if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+      leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET);
+      members = _parseClassMembers(className, _getEndToken(leftBracket));
+      rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET);
+    } else {
+      leftBracket = _createSyntheticToken(TokenType.OPEN_CURLY_BRACKET);
+      rightBracket = _createSyntheticToken(TokenType.CLOSE_CURLY_BRACKET);
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_CLASS_BODY);
+    }
+    ClassDeclaration classDeclaration = new ClassDeclaration(
+        commentAndMetadata.comment, commentAndMetadata.metadata,
+        abstractKeyword, keyword, name, typeParameters, extendsClause,
+        withClause, implementsClause, leftBracket, members, rightBracket);
+    classDeclaration.nativeClause = nativeClause;
+    return classDeclaration;
+  }
+
+  /**
+   * Parse a list of class members. The [className] is the name of the class
+   * whose members are being parsed. The [closingBracket] is the closing bracket
+   * for the class, or `null` if the closing bracket is missing. Return the list
+   * of class members that were parsed.
+   *
+   *     classMembers ::=
+   *         (metadata memberDefinition)*
+   */
+  List<ClassMember> _parseClassMembers(String className, Token closingBracket) {
+    List<ClassMember> members = new List<ClassMember>();
+    Token memberStart = _currentToken;
+    while (!_matches(TokenType.EOF) &&
+        !_matches(TokenType.CLOSE_CURLY_BRACKET) &&
+        (closingBracket != null ||
+            (!_matchesKeyword(Keyword.CLASS) &&
+                !_matchesKeyword(Keyword.TYPEDEF)))) {
+      if (_matches(TokenType.SEMICOLON)) {
+        _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken,
+            [_currentToken.lexeme]);
+        _advance();
+      } else {
+        ClassMember member = parseClassMember(className);
+        if (member != null) {
+          members.add(member);
+        }
+      }
+      if (identical(_currentToken, memberStart)) {
+        _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken,
+            [_currentToken.lexeme]);
+        _advance();
+      }
+      memberStart = _currentToken;
+    }
+    return members;
+  }
+
+  /**
+   * Parse a class type alias. The [commentAndMetadata] is the metadata to be
+   * associated with the member. The [abstractKeyword] is the token representing
+   * the 'abstract' keyword. The [classKeyword] is the token representing the
+   * 'class' keyword. Return the class type alias that was parsed.
+   *
+   *     classTypeAlias ::=
+   *         identifier typeParameters? '=' 'abstract'? mixinApplication
+   *
+   *     mixinApplication ::=
+   *         type withClause implementsClause? ';'
+   */
+  ClassTypeAlias _parseClassTypeAlias(CommentAndMetadata commentAndMetadata,
+      Token abstractKeyword, Token classKeyword) {
+    SimpleIdentifier className = parseSimpleIdentifier();
+    TypeParameterList typeParameters = null;
+    if (_matches(TokenType.LT)) {
+      typeParameters = parseTypeParameterList();
+    }
+    Token equals = _expect(TokenType.EQ);
+    TypeName superclass = parseTypeName();
+    WithClause withClause = null;
+    if (_matchesKeyword(Keyword.WITH)) {
+      withClause = parseWithClause();
+    } else {
+      _reportErrorForCurrentToken(
+          ParserErrorCode.EXPECTED_TOKEN, [Keyword.WITH.syntax]);
+    }
+    ImplementsClause implementsClause = null;
+    if (_matchesKeyword(Keyword.IMPLEMENTS)) {
+      implementsClause = parseImplementsClause();
+    }
+    Token semicolon;
+    if (_matches(TokenType.SEMICOLON)) {
+      semicolon = getAndAdvance();
+    } else {
+      if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+        _reportErrorForCurrentToken(
+            ParserErrorCode.EXPECTED_TOKEN, [TokenType.SEMICOLON.lexeme]);
+        Token leftBracket = getAndAdvance();
+        _parseClassMembers(className.name, _getEndToken(leftBracket));
+        _expect(TokenType.CLOSE_CURLY_BRACKET);
+      } else {
+        _reportErrorForToken(ParserErrorCode.EXPECTED_TOKEN,
+            _currentToken.previous, [TokenType.SEMICOLON.lexeme]);
+      }
+      semicolon = _createSyntheticToken(TokenType.SEMICOLON);
+    }
+    return new ClassTypeAlias(commentAndMetadata.comment,
+        commentAndMetadata.metadata, classKeyword, className, typeParameters,
+        equals, abstractKeyword, superclass, withClause, implementsClause,
+        semicolon);
+  }
+
+  /**
+   * Parse a list of combinators in a directive. Return the combinators that
+   * were parsed.
+   *
+   *     combinator ::=
+   *         'show' identifier (',' identifier)*
+   *       | 'hide' identifier (',' identifier)*
+   */
+  List<Combinator> _parseCombinators() {
+    List<Combinator> combinators = new List<Combinator>();
+    while (true) {
+      Combinator combinator = parseCombinator();
+      if (combinator == null) {
+        break;
+      }
+      combinators.add(combinator);
+    }
+    return combinators;
+  }
+
+  /**
+   * Parse the documentation comment and metadata preceding a declaration. This
+   * method allows any number of documentation comments to occur before, after
+   * or between the metadata, but only returns the last (right-most)
+   * documentation comment that is found. Return the documentation comment and
+   * metadata that were parsed.
+   *
+   *     metadata ::=
+   *         annotation*
+   */
+  CommentAndMetadata _parseCommentAndMetadata() {
+    Comment comment = _parseDocumentationComment();
+    List<Annotation> metadata = new List<Annotation>();
+    while (_matches(TokenType.AT)) {
+      metadata.add(parseAnnotation());
+      Comment optionalComment = _parseDocumentationComment();
+      if (optionalComment != null) {
+        comment = optionalComment;
+      }
+    }
+    return new CommentAndMetadata(comment, metadata);
+  }
+
+  /**
+   * Parse a comment reference from the source between square brackets. The
+   * [referenceSource] is the source occurring between the square brackets
+   * within a documentation comment. The [sourceOffset] is the offset of the
+   * first character of the reference source. Return the comment reference that
+   * was parsed, or `null` if no reference could be found.
+   *
+   *     commentReference ::=
+   *         'new'? prefixedIdentifier
+   */
+  CommentReference _parseCommentReference(
+      String referenceSource, int sourceOffset) {
+    // TODO(brianwilkerson) The errors are not getting the right offset/length
+    // and are being duplicated.
+    if (referenceSource.length == 0) {
+      Token syntheticToken =
+          new SyntheticStringToken(TokenType.IDENTIFIER, "", sourceOffset);
+      return new CommentReference(null, new SimpleIdentifier(syntheticToken));
+    }
+    try {
+      BooleanErrorListener listener = new BooleanErrorListener();
+      Scanner scanner = new Scanner(
+          null, new SubSequenceReader(referenceSource, sourceOffset), listener);
+      scanner.setSourceStart(1, 1);
+      Token firstToken = scanner.tokenize();
+      if (listener.errorReported) {
+        return null;
+      }
+      Token newKeyword = null;
+      if (_tokenMatchesKeyword(firstToken, Keyword.NEW)) {
+        newKeyword = firstToken;
+        firstToken = firstToken.next;
+      }
+      if (_tokenMatchesIdentifier(firstToken)) {
+        Token secondToken = firstToken.next;
+        Token thirdToken = secondToken.next;
+        Token nextToken;
+        Identifier identifier;
+        if (_tokenMatches(secondToken, TokenType.PERIOD) &&
+            _tokenMatchesIdentifier(thirdToken)) {
+          identifier = new PrefixedIdentifier(new SimpleIdentifier(firstToken),
+              secondToken, new SimpleIdentifier(thirdToken));
+          nextToken = thirdToken.next;
+        } else {
+          identifier = new SimpleIdentifier(firstToken);
+          nextToken = firstToken.next;
+        }
+        if (nextToken.type != TokenType.EOF) {
+          return null;
+        }
+        return new CommentReference(newKeyword, identifier);
+      } else if (_tokenMatchesKeyword(firstToken, Keyword.THIS) ||
+          _tokenMatchesKeyword(firstToken, Keyword.NULL) ||
+          _tokenMatchesKeyword(firstToken, Keyword.TRUE) ||
+          _tokenMatchesKeyword(firstToken, Keyword.FALSE)) {
+        // TODO(brianwilkerson) If we want to support this we will need to
+        // extend the definition of CommentReference to take an expression
+        // rather than an identifier. For now we just ignore it to reduce the
+        // number of errors produced, but that's probably not a valid long term
+        // approach.
+        return null;
+      }
+    } catch (exception) {
+      // Ignored because we assume that it wasn't a real comment reference.
+    }
+    return null;
+  }
+
+  /**
+   * Parse all of the comment references occurring in the given array of
+   * documentation comments. The [tokens] are the comment tokens representing
+   * the documentation comments to be parsed. Return the comment references that
+   * were parsed.
+   *
+   *     commentReference ::=
+   *         '[' 'new'? qualified ']' libraryReference?
+   *
+   *     libraryReference ::=
+   *          '(' stringLiteral ')'
+   */
+  List<CommentReference> _parseCommentReferences(
+      List<DocumentationCommentToken> tokens) {
+    List<CommentReference> references = new List<CommentReference>();
+    for (DocumentationCommentToken token in tokens) {
+      String comment = token.lexeme;
+      int length = comment.length;
+      List<List<int>> codeBlockRanges = _getCodeBlockRanges(comment);
+      int leftIndex = comment.indexOf('[');
+      while (leftIndex >= 0 && leftIndex + 1 < length) {
+        List<int> range = _findRange(codeBlockRanges, leftIndex);
+        if (range == null) {
+          int nameOffset = token.offset + leftIndex + 1;
+          int rightIndex = JavaString.indexOf(comment, ']', leftIndex);
+          if (rightIndex >= 0) {
+            int firstChar = comment.codeUnitAt(leftIndex + 1);
+            if (firstChar != 0x27 && firstChar != 0x22) {
+              if (_isLinkText(comment, rightIndex)) {
+                // TODO(brianwilkerson) Handle the case where there's a library
+                // URI in the link text.
+              } else {
+                CommentReference reference = _parseCommentReference(
+                    comment.substring(leftIndex + 1, rightIndex), nameOffset);
+                if (reference != null) {
+                  references.add(reference);
+                  token.references.add(reference.beginToken);
+                }
+              }
+            }
+          } else {
+            // terminating ']' is not typed yet
+            int charAfterLeft = comment.codeUnitAt(leftIndex + 1);
+            if (Character.isLetterOrDigit(charAfterLeft)) {
+              int nameEnd = StringUtilities.indexOfFirstNotLetterDigit(
+                  comment, leftIndex + 1);
+              String name = comment.substring(leftIndex + 1, nameEnd);
+              Token nameToken =
+                  new StringToken(TokenType.IDENTIFIER, name, nameOffset);
+              references.add(
+                  new CommentReference(null, new SimpleIdentifier(nameToken)));
+            } else {
+              Token nameToken = new SyntheticStringToken(
+                  TokenType.IDENTIFIER, "", nameOffset);
+              references.add(
+                  new CommentReference(null, new SimpleIdentifier(nameToken)));
+            }
+            // next character
+            rightIndex = leftIndex + 1;
+          }
+          leftIndex = JavaString.indexOf(comment, '[', rightIndex);
+        } else {
+          leftIndex = JavaString.indexOf(comment, '[', range[1] + 1);
+        }
+      }
+    }
+    return references;
+  }
+
+  /**
+   * Parse a compilation unit member. The [commentAndMetadata] is the metadata
+   * to be associated with the member. Return the compilation unit member that
+   * was parsed, or `null` if what was parsed could not be represented as a
+   * compilation unit member.
+   *
+   *     compilationUnitMember ::=
+   *         classDefinition
+   *       | functionTypeAlias
+   *       | external functionSignature
+   *       | external getterSignature
+   *       | external setterSignature
+   *       | functionSignature functionBody
+   *       | returnType? getOrSet identifier formalParameterList functionBody
+   *       | (final | const) type? staticFinalDeclarationList ';'
+   *       | variableDeclaration ';'
+   */
+  CompilationUnitMember _parseCompilationUnitMember(
+      CommentAndMetadata commentAndMetadata) {
+    Modifiers modifiers = _parseModifiers();
+    if (_matchesKeyword(Keyword.CLASS)) {
+      return _parseClassDeclaration(
+          commentAndMetadata, _validateModifiersForClass(modifiers));
+    } else if (_matchesKeyword(Keyword.TYPEDEF) &&
+        !_tokenMatches(_peek(), TokenType.PERIOD) &&
+        !_tokenMatches(_peek(), TokenType.LT) &&
+        !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+      _validateModifiersForTypedef(modifiers);
+      return _parseTypeAlias(commentAndMetadata);
+    } else if (_matchesKeyword(Keyword.ENUM)) {
+      _validateModifiersForEnum(modifiers);
+      return _parseEnumDeclaration(commentAndMetadata);
+    }
+    if (_matchesKeyword(Keyword.VOID)) {
+      TypeName returnType = parseReturnType();
+      if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) &&
+          _tokenMatchesIdentifier(_peek())) {
+        _validateModifiersForTopLevelFunction(modifiers);
+        return _parseFunctionDeclaration(
+            commentAndMetadata, modifiers.externalKeyword, returnType);
+      } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) {
+        _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken);
+        return _convertToFunctionDeclaration(_parseOperator(
+            commentAndMetadata, modifiers.externalKeyword, returnType));
+      } else if (_matchesIdentifier() &&
+          _peek().matchesAny([
+        TokenType.OPEN_PAREN,
+        TokenType.OPEN_CURLY_BRACKET,
+        TokenType.FUNCTION
+      ])) {
+        _validateModifiersForTopLevelFunction(modifiers);
+        return _parseFunctionDeclaration(
+            commentAndMetadata, modifiers.externalKeyword, returnType);
+      } else {
+        //
+        // We have found an error of some kind. Try to recover.
+        //
+        if (_matchesIdentifier()) {
+          if (_peek().matchesAny(
+              [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
+            //
+            // We appear to have a variable declaration with a type of "void".
+            //
+            _reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType);
+            return new TopLevelVariableDeclaration(commentAndMetadata.comment,
+                commentAndMetadata.metadata,
+                _parseVariableDeclarationListAfterType(null,
+                    _validateModifiersForTopLevelVariable(modifiers), null),
+                _expect(TokenType.SEMICOLON));
+          }
+        }
+        _reportErrorForToken(
+            ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken);
+        return null;
+      }
+    } else if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) &&
+        _tokenMatchesIdentifier(_peek())) {
+      _validateModifiersForTopLevelFunction(modifiers);
+      return _parseFunctionDeclaration(
+          commentAndMetadata, modifiers.externalKeyword, null);
+    } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) {
+      _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken);
+      return _convertToFunctionDeclaration(
+          _parseOperator(commentAndMetadata, modifiers.externalKeyword, null));
+    } else if (!_matchesIdentifier()) {
+      Token keyword = modifiers.varKeyword;
+      if (keyword == null) {
+        keyword = modifiers.finalKeyword;
+      }
+      if (keyword == null) {
+        keyword = modifiers.constKeyword;
+      }
+      if (keyword != null) {
+        //
+        // We appear to have found an incomplete top-level variable declaration.
+        //
+        _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
+        List<VariableDeclaration> variables = new List<VariableDeclaration>();
+        variables.add(
+            new VariableDeclaration(_createSyntheticIdentifier(), null, null));
+        return new TopLevelVariableDeclaration(commentAndMetadata.comment,
+            commentAndMetadata.metadata,
+            new VariableDeclarationList(null, null, keyword, null, variables),
+            _expectSemicolon());
+      }
+      _reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken);
+      return null;
+    } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+      _validateModifiersForTopLevelFunction(modifiers);
+      return _parseFunctionDeclaration(
+          commentAndMetadata, modifiers.externalKeyword, null);
+    } else if (_peek()
+        .matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
+      if (modifiers.constKeyword == null &&
+          modifiers.finalKeyword == null &&
+          modifiers.varKeyword == null) {
+        _reportErrorForCurrentToken(
+            ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE);
+      }
+      return new TopLevelVariableDeclaration(commentAndMetadata.comment,
+          commentAndMetadata.metadata, _parseVariableDeclarationListAfterType(
+              null, _validateModifiersForTopLevelVariable(modifiers), null),
+          _expect(TokenType.SEMICOLON));
+    }
+    TypeName returnType = parseReturnType();
+    if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) &&
+        _tokenMatchesIdentifier(_peek())) {
+      _validateModifiersForTopLevelFunction(modifiers);
+      return _parseFunctionDeclaration(
+          commentAndMetadata, modifiers.externalKeyword, returnType);
+    } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) {
+      _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken);
+      return _convertToFunctionDeclaration(_parseOperator(
+          commentAndMetadata, modifiers.externalKeyword, returnType));
+    } else if (_matches(TokenType.AT)) {
+      return new TopLevelVariableDeclaration(commentAndMetadata.comment,
+          commentAndMetadata.metadata, _parseVariableDeclarationListAfterType(
+              null, _validateModifiersForTopLevelVariable(modifiers),
+              returnType), _expect(TokenType.SEMICOLON));
+    } else if (!_matchesIdentifier()) {
+      // TODO(brianwilkerson) Generalize this error. We could also be parsing a
+      // top-level variable at this point.
+      _reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken);
+      Token semicolon;
+      if (_matches(TokenType.SEMICOLON)) {
+        semicolon = getAndAdvance();
+      } else {
+        semicolon = _createSyntheticToken(TokenType.SEMICOLON);
+      }
+      List<VariableDeclaration> variables = new List<VariableDeclaration>();
+      variables.add(
+          new VariableDeclaration(_createSyntheticIdentifier(), null, null));
+      return new TopLevelVariableDeclaration(commentAndMetadata.comment,
+          commentAndMetadata.metadata,
+          new VariableDeclarationList(null, null, null, returnType, variables),
+          semicolon);
+    }
+    if (_peek().matchesAny([
+      TokenType.OPEN_PAREN,
+      TokenType.FUNCTION,
+      TokenType.OPEN_CURLY_BRACKET
+    ])) {
+      _validateModifiersForTopLevelFunction(modifiers);
+      return _parseFunctionDeclaration(
+          commentAndMetadata, modifiers.externalKeyword, returnType);
+    }
+    return new TopLevelVariableDeclaration(commentAndMetadata.comment,
+        commentAndMetadata.metadata, _parseVariableDeclarationListAfterType(
+            null, _validateModifiersForTopLevelVariable(modifiers), returnType),
+        _expect(TokenType.SEMICOLON));
+  }
+
+  /**
+   * Parse a const expression. Return the const expression that was parsed.
+   *
+   *     constExpression ::=
+   *         instanceCreationExpression
+   *       | listLiteral
+   *       | mapLiteral
+   */
+  Expression _parseConstExpression() {
+    Token keyword = _expectKeyword(Keyword.CONST);
+    if (_matches(TokenType.OPEN_SQUARE_BRACKET) || _matches(TokenType.INDEX)) {
+      return _parseListLiteral(keyword, null);
+    } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+      return _parseMapLiteral(keyword, null);
+    } else if (_matches(TokenType.LT)) {
+      return _parseListOrMapLiteral(keyword);
+    }
+    return _parseInstanceCreationExpression(keyword);
+  }
+
+  ConstructorDeclaration _parseConstructor(
+      CommentAndMetadata commentAndMetadata, Token externalKeyword,
+      Token constKeyword, Token factoryKeyword, SimpleIdentifier returnType,
+      Token period, SimpleIdentifier name, FormalParameterList parameters) {
+    bool bodyAllowed = externalKeyword == null;
+    Token separator = null;
+    List<ConstructorInitializer> initializers = null;
+    if (_matches(TokenType.COLON)) {
+      separator = getAndAdvance();
+      initializers = new List<ConstructorInitializer>();
+      do {
+        if (_matchesKeyword(Keyword.THIS)) {
+          if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+            bodyAllowed = false;
+            initializers.add(_parseRedirectingConstructorInvocation());
+          } else if (_tokenMatches(_peek(), TokenType.PERIOD) &&
+              _tokenMatches(_peekAt(3), TokenType.OPEN_PAREN)) {
+            bodyAllowed = false;
+            initializers.add(_parseRedirectingConstructorInvocation());
+          } else {
+            initializers.add(_parseConstructorFieldInitializer());
+          }
+        } else if (_matchesKeyword(Keyword.SUPER)) {
+          initializers.add(_parseSuperConstructorInvocation());
+        } else if (_matches(TokenType.OPEN_CURLY_BRACKET) ||
+            _matches(TokenType.FUNCTION)) {
+          _reportErrorForCurrentToken(ParserErrorCode.MISSING_INITIALIZER);
+        } else {
+          initializers.add(_parseConstructorFieldInitializer());
+        }
+      } while (_optional(TokenType.COMMA));
+      if (factoryKeyword != null) {
+        _reportErrorForToken(
+            ParserErrorCode.FACTORY_WITH_INITIALIZERS, factoryKeyword);
+      }
+    }
+    ConstructorName redirectedConstructor = null;
+    FunctionBody body;
+    if (_matches(TokenType.EQ)) {
+      separator = getAndAdvance();
+      redirectedConstructor = parseConstructorName();
+      body = new EmptyFunctionBody(_expect(TokenType.SEMICOLON));
+      if (factoryKeyword == null) {
+        _reportErrorForNode(
+            ParserErrorCode.REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR,
+            redirectedConstructor);
+      }
+    } else {
+      body = _parseFunctionBody(
+          true, ParserErrorCode.MISSING_FUNCTION_BODY, false);
+      if (constKeyword != null &&
+          factoryKeyword != null &&
+          externalKeyword == null) {
+        _reportErrorForToken(ParserErrorCode.CONST_FACTORY, factoryKeyword);
+      } else if (body is EmptyFunctionBody) {
+        if (factoryKeyword != null &&
+            externalKeyword == null &&
+            _parseFunctionBodies) {
+          _reportErrorForToken(
+              ParserErrorCode.FACTORY_WITHOUT_BODY, factoryKeyword);
+        }
+      } else {
+        if (constKeyword != null) {
+          _reportErrorForNode(
+              ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY, body);
+        } else if (!bodyAllowed) {
+          _reportErrorForNode(
+              ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY, body);
+        }
+      }
+    }
+    return new ConstructorDeclaration(commentAndMetadata.comment,
+        commentAndMetadata.metadata, externalKeyword, constKeyword,
+        factoryKeyword, returnType, period, name, parameters, separator,
+        initializers, redirectedConstructor, body);
+  }
+
+  /**
+   * Parse a field initializer within a constructor. Return the field
+   * initializer that was parsed.
+   *
+   *     fieldInitializer:
+   *         ('this' '.')? identifier '=' conditionalExpression cascadeSection*
+   */
+  ConstructorFieldInitializer _parseConstructorFieldInitializer() {
+    Token keyword = null;
+    Token period = null;
+    if (_matchesKeyword(Keyword.THIS)) {
+      keyword = getAndAdvance();
+      period = _expect(TokenType.PERIOD);
+    }
+    SimpleIdentifier fieldName = parseSimpleIdentifier();
+    Token equals = null;
+    if (_matches(TokenType.EQ)) {
+      equals = getAndAdvance();
+    } else if (!_matchesKeyword(Keyword.THIS) &&
+        !_matchesKeyword(Keyword.SUPER) &&
+        !_matches(TokenType.OPEN_CURLY_BRACKET) &&
+        !_matches(TokenType.FUNCTION)) {
+      _reportErrorForCurrentToken(
+          ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER);
+      equals = _createSyntheticToken(TokenType.EQ);
+    } else {
+      _reportErrorForCurrentToken(
+          ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER);
+      return new ConstructorFieldInitializer(keyword, period, fieldName,
+          _createSyntheticToken(TokenType.EQ), _createSyntheticIdentifier());
+    }
+    bool wasInInitializer = _inInitializer;
+    _inInitializer = true;
+    try {
+      Expression expression = parseConditionalExpression();
+      TokenType tokenType = _currentToken.type;
+      if (tokenType == TokenType.PERIOD_PERIOD) {
+        List<Expression> cascadeSections = new List<Expression>();
+        while (tokenType == TokenType.PERIOD_PERIOD) {
+          Expression section = _parseCascadeSection();
+          if (section != null) {
+            cascadeSections.add(section);
+          }
+          tokenType = _currentToken.type;
+        }
+        expression = new CascadeExpression(expression, cascadeSections);
+      }
+      return new ConstructorFieldInitializer(
+          keyword, period, fieldName, equals, expression);
+    } finally {
+      _inInitializer = wasInInitializer;
+    }
+  }
+
+  /**
+   * Parse a continue statement. Return the continue statement that was parsed.
+   *
+   *     continueStatement ::=
+   *         'continue' identifier? ';'
+   */
+  Statement _parseContinueStatement() {
+    Token continueKeyword = _expectKeyword(Keyword.CONTINUE);
+    if (!_inLoop && !_inSwitch) {
+      _reportErrorForToken(
+          ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, continueKeyword);
+    }
+    SimpleIdentifier label = null;
+    if (_matchesIdentifier()) {
+      label = parseSimpleIdentifier();
+    }
+    if (_inSwitch && !_inLoop && label == null) {
+      _reportErrorForToken(
+          ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE, continueKeyword);
+    }
+    Token semicolon = _expect(TokenType.SEMICOLON);
+    return new ContinueStatement(continueKeyword, label, semicolon);
+  }
+
+  /**
+   * Parse a directive. The [commentAndMetadata] is the metadata to be
+   * associated with the directive. Return the directive that was parsed.
+   *
+   *     directive ::=
+   *         exportDirective
+   *       | libraryDirective
+   *       | importDirective
+   *       | partDirective
+   */
+  Directive _parseDirective(CommentAndMetadata commentAndMetadata) {
+    if (_matchesKeyword(Keyword.IMPORT)) {
+      return _parseImportDirective(commentAndMetadata);
+    } else if (_matchesKeyword(Keyword.EXPORT)) {
+      return _parseExportDirective(commentAndMetadata);
+    } else if (_matchesKeyword(Keyword.LIBRARY)) {
+      return _parseLibraryDirective(commentAndMetadata);
+    } else if (_matchesKeyword(Keyword.PART)) {
+      return _parsePartDirective(commentAndMetadata);
+    } else {
+      // Internal error: this method should not have been invoked if the current
+      // token was something other than one of the above.
+      throw new IllegalStateException(
+          "parseDirective invoked in an invalid state; currentToken = $_currentToken");
+    }
+  }
+
+  /**
+   * Parse the script tag and directives in a compilation unit until the first
+   * non-directive is encountered. Return the compilation unit that was parsed.
+   *
+   *     compilationUnit ::=
+   *         scriptTag? directive*
+   */
+  CompilationUnit _parseDirectives() {
+    Token firstToken = _currentToken;
+    ScriptTag scriptTag = null;
+    if (_matches(TokenType.SCRIPT_TAG)) {
+      scriptTag = new ScriptTag(getAndAdvance());
+    }
+    List<Directive> directives = new List<Directive>();
+    while (!_matches(TokenType.EOF)) {
+      CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
+      if ((_matchesKeyword(Keyword.IMPORT) ||
+              _matchesKeyword(Keyword.EXPORT) ||
+              _matchesKeyword(Keyword.LIBRARY) ||
+              _matchesKeyword(Keyword.PART)) &&
+          !_tokenMatches(_peek(), TokenType.PERIOD) &&
+          !_tokenMatches(_peek(), TokenType.LT) &&
+          !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+        directives.add(_parseDirective(commentAndMetadata));
+      } else if (_matches(TokenType.SEMICOLON)) {
+        _advance();
+      } else {
+        while (!_matches(TokenType.EOF)) {
+          _advance();
+        }
+        return new CompilationUnit(firstToken, scriptTag, directives,
+            new List<CompilationUnitMember>(), _currentToken);
+      }
+    }
+    return new CompilationUnit(firstToken, scriptTag, directives,
+        new List<CompilationUnitMember>(), _currentToken);
+  }
+
+  /**
+   * Parse a documentation comment. Return the documentation comment that was
+   * parsed, or `null` if there was no comment.
+   *
+   *     documentationComment ::=
+   *         multiLineComment?
+   *       | singleLineComment*
+   */
+  Comment _parseDocumentationComment() {
+    List<DocumentationCommentToken> documentationTokens =
+        <DocumentationCommentToken>[];
+    CommentToken commentToken = _currentToken.precedingComments;
+    while (commentToken != null) {
+      if (commentToken is DocumentationCommentToken) {
+        if (documentationTokens.isNotEmpty) {
+          if (commentToken.type == TokenType.SINGLE_LINE_COMMENT) {
+            if (documentationTokens[0].type != TokenType.SINGLE_LINE_COMMENT) {
+              documentationTokens.clear();
+            }
+          } else {
+            documentationTokens.clear();
+          }
+        }
+        documentationTokens.add(commentToken);
+      }
+      commentToken = commentToken.next;
+    }
+    if (documentationTokens.isEmpty) {
+      return null;
+    }
+    List<CommentReference> references =
+        _parseCommentReferences(documentationTokens);
+    return Comment.createDocumentationCommentWithReferences(
+        documentationTokens, references);
+  }
+
+  /**
+   * Parse a do statement. Return the do statement that was parsed.
+   *
+   *     doStatement ::=
+   *         'do' statement 'while' '(' expression ')' ';'
+   */
+  Statement _parseDoStatement() {
+    bool wasInLoop = _inLoop;
+    _inLoop = true;
+    try {
+      Token doKeyword = _expectKeyword(Keyword.DO);
+      Statement body = parseStatement2();
+      Token whileKeyword = _expectKeyword(Keyword.WHILE);
+      Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
+      Expression condition = parseExpression2();
+      Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
+      Token semicolon = _expect(TokenType.SEMICOLON);
+      return new DoStatement(doKeyword, body, whileKeyword, leftParenthesis,
+          condition, rightParenthesis, semicolon);
+    } finally {
+      _inLoop = wasInLoop;
+    }
+  }
+
+  /**
+   * Parse an empty statement. Return the empty statement that was parsed.
+   *
+   *     emptyStatement ::=
+   *         ';'
+   */
+  Statement _parseEmptyStatement() => new EmptyStatement(getAndAdvance());
+
+  EnumConstantDeclaration _parseEnumConstantDeclaration() {
+    CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
+    SimpleIdentifier name;
+    if (_matchesIdentifier()) {
+      name = parseSimpleIdentifier();
+    } else {
+      name = _createSyntheticIdentifier();
+    }
+    if (commentAndMetadata.metadata.isNotEmpty) {
+      _reportErrorForNode(ParserErrorCode.ANNOTATION_ON_ENUM_CONSTANT,
+          commentAndMetadata.metadata[0]);
+    }
+    return new EnumConstantDeclaration(
+        commentAndMetadata.comment, commentAndMetadata.metadata, name);
+  }
+
+  /**
+   * Parse an enum declaration. The [commentAndMetadata] is the metadata to be
+   * associated with the member. Return the enum declaration that was parsed.
+   *
+   *     enumType ::=
+   *         metadata 'enum' id '{' id (',' id)* (',')? '}'
+   */
+  EnumDeclaration _parseEnumDeclaration(CommentAndMetadata commentAndMetadata) {
+    Token keyword = _expectKeyword(Keyword.ENUM);
+    SimpleIdentifier name = parseSimpleIdentifier();
+    Token leftBracket = null;
+    List<EnumConstantDeclaration> constants =
+        new List<EnumConstantDeclaration>();
+    Token rightBracket = null;
+    if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+      leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET);
+      if (_matchesIdentifier() || _matches(TokenType.AT)) {
+        constants.add(_parseEnumConstantDeclaration());
+      } else if (_matches(TokenType.COMMA) &&
+          _tokenMatchesIdentifier(_peek())) {
+        constants.add(_parseEnumConstantDeclaration());
+        _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
+      } else {
+        constants.add(_parseEnumConstantDeclaration());
+        _reportErrorForCurrentToken(ParserErrorCode.EMPTY_ENUM_BODY);
+      }
+      while (_optional(TokenType.COMMA)) {
+        if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
+          break;
+        }
+        constants.add(_parseEnumConstantDeclaration());
+      }
+      rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET);
+    } else {
+      leftBracket = _createSyntheticToken(TokenType.OPEN_CURLY_BRACKET);
+      rightBracket = _createSyntheticToken(TokenType.CLOSE_CURLY_BRACKET);
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_ENUM_BODY);
+    }
+    return new EnumDeclaration(commentAndMetadata.comment,
+        commentAndMetadata.metadata, keyword, name, leftBracket, constants,
+        rightBracket);
+  }
+
+  /**
+   * Parse an equality expression. Return the equality expression that was
+   * parsed.
+   *
+   *     equalityExpression ::=
+   *         relationalExpression (equalityOperator relationalExpression)?
+   *       | 'super' equalityOperator relationalExpression
+   */
+  Expression _parseEqualityExpression() {
+    Expression expression;
+    if (_matchesKeyword(Keyword.SUPER) &&
+        _currentToken.next.type.isEqualityOperator) {
+      expression = new SuperExpression(getAndAdvance());
+    } else {
+      expression = _parseRelationalExpression();
+    }
+    bool leftEqualityExpression = false;
+    while (_currentToken.type.isEqualityOperator) {
+      Token operator = getAndAdvance();
+      if (leftEqualityExpression) {
+        _reportErrorForNode(
+            ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND, expression);
+      }
+      expression = new BinaryExpression(
+          expression, operator, _parseRelationalExpression());
+      leftEqualityExpression = true;
+    }
+    return expression;
+  }
+
+  /**
+   * Parse an export directive. The [commentAndMetadata] is the metadata to be
+   * associated with the directive. Return the export directive that was parsed.
+   *
+   *     exportDirective ::=
+   *         metadata 'export' stringLiteral combinator*';'
+   */
+  ExportDirective _parseExportDirective(CommentAndMetadata commentAndMetadata) {
+    Token exportKeyword = _expectKeyword(Keyword.EXPORT);
+    StringLiteral libraryUri = _parseUri();
+    List<Combinator> combinators = _parseCombinators();
+    Token semicolon = _expectSemicolon();
+    return new ExportDirective(commentAndMetadata.comment,
+        commentAndMetadata.metadata, exportKeyword, libraryUri, combinators,
+        semicolon);
+  }
+
+  /**
+   * Parse a list of expressions. Return the expression that was parsed.
+   *
+   *     expressionList ::=
+   *         expression (',' expression)*
+   */
+  List<Expression> _parseExpressionList() {
+    List<Expression> expressions = new List<Expression>();
+    expressions.add(parseExpression2());
+    while (_optional(TokenType.COMMA)) {
+      expressions.add(parseExpression2());
+    }
+    return expressions;
+  }
+
+  /**
+   * Parse the 'final', 'const', 'var' or type preceding a variable declaration.
+   * The [optional] is `true` if the keyword and type are optional. Return the
+   * 'final', 'const', 'var' or type that was parsed.
+   *
+   *     finalConstVarOrType ::=
+   *         'final' type?
+   *       | 'const' type?
+   *       | 'var'
+   *       | type
+   */
+  FinalConstVarOrType _parseFinalConstVarOrType(bool optional) {
+    Token keyword = null;
+    TypeName type = null;
+    if (_matchesKeyword(Keyword.FINAL) || _matchesKeyword(Keyword.CONST)) {
+      keyword = getAndAdvance();
+      if (_isTypedIdentifier(_currentToken)) {
+        type = parseTypeName();
+      }
+    } else if (_matchesKeyword(Keyword.VAR)) {
+      keyword = getAndAdvance();
+    } else {
+      if (_isTypedIdentifier(_currentToken)) {
+        type = parseReturnType();
+      } else if (!optional) {
+        _reportErrorForCurrentToken(
+            ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE);
+      }
+    }
+    return new FinalConstVarOrType(keyword, type);
+  }
+
+  /**
+   * Parse a formal parameter. At most one of `isOptional` and `isNamed` can be
+   * `true`. The [kind] is the kind of parameter being expected based on the
+   * presence or absence of group delimiters. Return the formal parameter that
+   * was parsed.
+   *
+   *     defaultFormalParameter ::=
+   *         normalFormalParameter ('=' expression)?
+   *
+   *     defaultNamedParameter ::=
+   *         normalFormalParameter (':' expression)?
+   */
+  FormalParameter _parseFormalParameter(ParameterKind kind) {
+    NormalFormalParameter parameter = parseNormalFormalParameter();
+    if (_matches(TokenType.EQ)) {
+      Token seperator = getAndAdvance();
+      Expression defaultValue = parseExpression2();
+      if (kind == ParameterKind.NAMED) {
+        _reportErrorForToken(
+            ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER, seperator);
+      } else if (kind == ParameterKind.REQUIRED) {
+        _reportErrorForNode(
+            ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP, parameter);
+      }
+      return new DefaultFormalParameter(
+          parameter, kind, seperator, defaultValue);
+    } else if (_matches(TokenType.COLON)) {
+      Token seperator = getAndAdvance();
+      Expression defaultValue = parseExpression2();
+      if (kind == ParameterKind.POSITIONAL) {
+        _reportErrorForToken(
+            ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER,
+            seperator);
+      } else if (kind == ParameterKind.REQUIRED) {
+        _reportErrorForNode(
+            ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP, parameter);
+      }
+      return new DefaultFormalParameter(
+          parameter, kind, seperator, defaultValue);
+    } else if (kind != ParameterKind.REQUIRED) {
+      return new DefaultFormalParameter(parameter, kind, null, null);
+    }
+    return parameter;
+  }
+
+  /**
+   * Parse a for statement. Return the for statement that was parsed.
+   *
+   *     forStatement ::=
+   *         'for' '(' forLoopParts ')' statement
+   *
+   *     forLoopParts ::=
+   *         forInitializerStatement expression? ';' expressionList?
+   *       | declaredIdentifier 'in' expression
+   *       | identifier 'in' expression
+   *
+   *     forInitializerStatement ::=
+   *         localVariableDeclaration ';'
+   *       | expression? ';'
+   */
+  Statement _parseForStatement() {
+    bool wasInLoop = _inLoop;
+    _inLoop = true;
+    try {
+      Token awaitKeyword = null;
+      if (_matchesString(_AWAIT)) {
+        awaitKeyword = getAndAdvance();
+      }
+      Token forKeyword = _expectKeyword(Keyword.FOR);
+      Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
+      VariableDeclarationList variableList = null;
+      Expression initialization = null;
+      if (!_matches(TokenType.SEMICOLON)) {
+        CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
+        if (_matchesIdentifier() &&
+            (_tokenMatchesKeyword(_peek(), Keyword.IN) ||
+                _tokenMatches(_peek(), TokenType.COLON))) {
+          List<VariableDeclaration> variables = new List<VariableDeclaration>();
+          SimpleIdentifier variableName = parseSimpleIdentifier();
+          variables.add(new VariableDeclaration(variableName, null, null));
+          variableList = new VariableDeclarationList(commentAndMetadata.comment,
+              commentAndMetadata.metadata, null, null, variables);
+        } else if (_isInitializedVariableDeclaration()) {
+          variableList =
+              _parseVariableDeclarationListAfterMetadata(commentAndMetadata);
+        } else {
+          initialization = parseExpression2();
+        }
+        if (_matchesKeyword(Keyword.IN) || _matches(TokenType.COLON)) {
+          if (_matches(TokenType.COLON)) {
+            _reportErrorForCurrentToken(ParserErrorCode.COLON_IN_PLACE_OF_IN);
+          }
+          DeclaredIdentifier loopVariable = null;
+          SimpleIdentifier identifier = null;
+          if (variableList == null) {
+            // We found: <expression> 'in'
+            _reportErrorForCurrentToken(
+                ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH);
+          } else {
+            NodeList<VariableDeclaration> variables = variableList.variables;
+            if (variables.length > 1) {
+              _reportErrorForCurrentToken(
+                  ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH,
+                  [variables.length.toString()]);
+            }
+            VariableDeclaration variable = variables[0];
+            if (variable.initializer != null) {
+              _reportErrorForCurrentToken(
+                  ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH);
+            }
+            Token keyword = variableList.keyword;
+            TypeName type = variableList.type;
+            if (keyword != null || type != null) {
+              loopVariable = new DeclaredIdentifier(commentAndMetadata.comment,
+                  commentAndMetadata.metadata, keyword, type, variable.name);
+            } else {
+              if (!commentAndMetadata.metadata.isEmpty) {
+                // TODO(jwren) metadata isn't allowed before the identifier in
+                // "identifier in expression", add warning if commentAndMetadata
+                // has content
+              }
+              identifier = variable.name;
+            }
+          }
+          Token inKeyword = getAndAdvance();
+          Expression iterator = parseExpression2();
+          Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
+          Statement body = parseStatement2();
+          if (loopVariable == null) {
+            return new ForEachStatement.withReference(awaitKeyword, forKeyword,
+                leftParenthesis, identifier, inKeyword, iterator,
+                rightParenthesis, body);
+          }
+          return new ForEachStatement.withDeclaration(awaitKeyword, forKeyword,
+              leftParenthesis, loopVariable, inKeyword, iterator,
+              rightParenthesis, body);
+        }
+      }
+      if (awaitKeyword != null) {
+        _reportErrorForToken(
+            ParserErrorCode.INVALID_AWAIT_IN_FOR, awaitKeyword);
+      }
+      Token leftSeparator = _expect(TokenType.SEMICOLON);
+      Expression condition = null;
+      if (!_matches(TokenType.SEMICOLON)) {
+        condition = parseExpression2();
+      }
+      Token rightSeparator = _expect(TokenType.SEMICOLON);
+      List<Expression> updaters = null;
+      if (!_matches(TokenType.CLOSE_PAREN)) {
+        updaters = _parseExpressionList();
+      }
+      Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
+      Statement body = parseStatement2();
+      return new ForStatement(forKeyword, leftParenthesis, variableList,
+          initialization, leftSeparator, condition, rightSeparator, updaters,
+          rightParenthesis, body);
+    } finally {
+      _inLoop = wasInLoop;
+    }
+  }
+
+  /**
+   * Parse a function body. The [mayBeEmpty] is `true` if the function body is
+   * allowed to be empty. The [emptyErrorCode] is the error code to report if
+   * function body expected, but not found. The [inExpression] is `true` if the
+   * function body is being parsed as part of an expression and therefore does
+   * not have a terminating semicolon. Return the function body that was parsed.
+   *
+   *     functionBody ::=
+   *         '=>' expression ';'
+   *       | block
+   *
+   *     functionExpressionBody ::=
+   *         '=>' expression
+   *       | block
+   */
+  FunctionBody _parseFunctionBody(
+      bool mayBeEmpty, ParserErrorCode emptyErrorCode, bool inExpression) {
+    bool wasInAsync = _inAsync;
+    bool wasInGenerator = _inGenerator;
+    bool wasInLoop = _inLoop;
+    bool wasInSwitch = _inSwitch;
+    _inAsync = false;
+    _inGenerator = false;
+    _inLoop = false;
+    _inSwitch = false;
+    try {
+      if (_matches(TokenType.SEMICOLON)) {
+        if (!mayBeEmpty) {
+          _reportErrorForCurrentToken(emptyErrorCode);
+        }
+        return new EmptyFunctionBody(getAndAdvance());
+      } else if (_matchesString(_NATIVE)) {
+        Token nativeToken = getAndAdvance();
+        StringLiteral stringLiteral = null;
+        if (_matches(TokenType.STRING)) {
+          stringLiteral = parseStringLiteral();
+        }
+        return new NativeFunctionBody(
+            nativeToken, stringLiteral, _expect(TokenType.SEMICOLON));
+      }
+      Token keyword = null;
+      Token star = null;
+      if (_matchesString(ASYNC)) {
+        keyword = getAndAdvance();
+        if (_matches(TokenType.STAR)) {
+          star = getAndAdvance();
+          _inGenerator = true;
+        }
+        _inAsync = true;
+      } else if (_matchesString(SYNC)) {
+        keyword = getAndAdvance();
+        if (_matches(TokenType.STAR)) {
+          star = getAndAdvance();
+          _inGenerator = true;
+        }
+      }
+      if (_matches(TokenType.FUNCTION)) {
+        if (keyword != null) {
+          if (!_tokenMatchesString(keyword, ASYNC)) {
+            _reportErrorForToken(ParserErrorCode.INVALID_SYNC, keyword);
+            keyword = null;
+          } else if (star != null) {
+            _reportErrorForToken(
+                ParserErrorCode.INVALID_STAR_AFTER_ASYNC, star);
+          }
+        }
+        Token functionDefinition = getAndAdvance();
+        if (_matchesKeyword(Keyword.RETURN)) {
+          _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken,
+              [_currentToken.lexeme]);
+          _advance();
+        }
+        Expression expression = parseExpression2();
+        Token semicolon = null;
+        if (!inExpression) {
+          semicolon = _expect(TokenType.SEMICOLON);
+        }
+        if (!_parseFunctionBodies) {
+          return new EmptyFunctionBody(
+              _createSyntheticToken(TokenType.SEMICOLON));
+        }
+        return new ExpressionFunctionBody(
+            keyword, functionDefinition, expression, semicolon);
+      } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+        if (keyword != null) {
+          if (_tokenMatchesString(keyword, SYNC) && star == null) {
+            _reportErrorForToken(
+                ParserErrorCode.MISSING_STAR_AFTER_SYNC, keyword);
+          }
+        }
+        if (!_parseFunctionBodies) {
+          _skipBlock();
+          return new EmptyFunctionBody(
+              _createSyntheticToken(TokenType.SEMICOLON));
+        }
+        return new BlockFunctionBody(keyword, star, parseBlock());
+      } else {
+        // Invalid function body
+        _reportErrorForCurrentToken(emptyErrorCode);
+        return new EmptyFunctionBody(
+            _createSyntheticToken(TokenType.SEMICOLON));
+      }
+    } finally {
+      _inAsync = wasInAsync;
+      _inGenerator = wasInGenerator;
+      _inLoop = wasInLoop;
+      _inSwitch = wasInSwitch;
+    }
+  }
+
+  /**
+   * Parse a function declaration. The [commentAndMetadata] is the documentation
+   * comment and metadata to be associated with the declaration. The
+   * [externalKeyword] is the 'external' keyword, or `null` if the function is
+   * not external. The [returnType] is the return type, or `null` if there is no
+   * return type. The [isStatement] is `true` if the function declaration is
+   * being parsed as a statement. Return the function declaration that was
+   * parsed.
+   *
+   *     functionDeclaration ::=
+   *         functionSignature functionBody
+   *       | returnType? getOrSet identifier formalParameterList functionBody
+   */
+  FunctionDeclaration _parseFunctionDeclaration(
+      CommentAndMetadata commentAndMetadata, Token externalKeyword,
+      TypeName returnType) {
+    Token keyword = null;
+    bool isGetter = false;
+    if (_matchesKeyword(Keyword.GET) &&
+        !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+      keyword = getAndAdvance();
+      isGetter = true;
+    } else if (_matchesKeyword(Keyword.SET) &&
+        !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+      keyword = getAndAdvance();
+    }
+    SimpleIdentifier name = parseSimpleIdentifier();
+    TypeParameterList typeParameters = null;
+    if (parseGenericMethods && _matches(TokenType.LT)) {
+      typeParameters = parseTypeParameterList();
+    }
+    FormalParameterList parameters = null;
+    if (!isGetter) {
+      if (_matches(TokenType.OPEN_PAREN)) {
+        parameters = parseFormalParameterList();
+        _validateFormalParameterList(parameters);
+      } else {
+        _reportErrorForCurrentToken(
+            ParserErrorCode.MISSING_FUNCTION_PARAMETERS);
+        parameters = new FormalParameterList(
+            _createSyntheticToken(TokenType.OPEN_PAREN), null, null, null,
+            _createSyntheticToken(TokenType.CLOSE_PAREN));
+      }
+    } else if (_matches(TokenType.OPEN_PAREN)) {
+      _reportErrorForCurrentToken(ParserErrorCode.GETTER_WITH_PARAMETERS);
+      parseFormalParameterList();
+    }
+    FunctionBody body;
+    if (externalKeyword == null) {
+      body = _parseFunctionBody(
+          false, ParserErrorCode.MISSING_FUNCTION_BODY, false);
+    } else {
+      body = new EmptyFunctionBody(_expect(TokenType.SEMICOLON));
+    }
+//        if (!isStatement && matches(TokenType.SEMICOLON)) {
+//          // TODO(brianwilkerson) Improve this error message.
+//          reportError(ParserErrorCode.UNEXPECTED_TOKEN, currentToken.getLexeme());
+//          advance();
+//        }
+    return new FunctionDeclaration(commentAndMetadata.comment,
+        commentAndMetadata.metadata, externalKeyword, returnType, keyword, name,
+        new FunctionExpression(typeParameters, parameters, body));
+  }
+
+  /**
+   * Parse a function declaration statement. Return the function declaration
+   * statement that was parsed.
+   *
+   *     functionDeclarationStatement ::=
+   *         functionSignature functionBody
+   */
+  Statement _parseFunctionDeclarationStatement() {
+    Modifiers modifiers = _parseModifiers();
+    _validateModifiersForFunctionDeclarationStatement(modifiers);
+    return _parseFunctionDeclarationStatementAfterReturnType(
+        _parseCommentAndMetadata(), _parseOptionalReturnType());
+  }
+
+  /**
+   * Parse a function declaration statement. The [commentAndMetadata] is the
+   * documentation comment and metadata to be associated with the declaration.
+   * The [returnType] is the return type, or `null` if there is no return type.
+   * Return the function declaration statement that was parsed.
+   *
+   *     functionDeclarationStatement ::=
+   *         functionSignature functionBody
+   */
+  Statement _parseFunctionDeclarationStatementAfterReturnType(
+      CommentAndMetadata commentAndMetadata, TypeName returnType) {
+    FunctionDeclaration declaration =
+        _parseFunctionDeclaration(commentAndMetadata, null, returnType);
+    Token propertyKeyword = declaration.propertyKeyword;
+    if (propertyKeyword != null) {
+      if ((propertyKeyword as KeywordToken).keyword == Keyword.GET) {
+        _reportErrorForToken(
+            ParserErrorCode.GETTER_IN_FUNCTION, propertyKeyword);
+      } else {
+        _reportErrorForToken(
+            ParserErrorCode.SETTER_IN_FUNCTION, propertyKeyword);
+      }
+    }
+    return new FunctionDeclarationStatement(declaration);
+  }
+
+  /**
+   * Parse a function type alias. The [commentAndMetadata] is the metadata to be
+   * associated with the member. The [keyword] is the token representing the
+   * 'typedef' keyword. Return the function type alias that was parsed.
+   *
+   *     functionTypeAlias ::=
+   *         functionPrefix typeParameterList? formalParameterList ';'
+   *
+   *     functionPrefix ::=
+   *         returnType? name
+   */
+  FunctionTypeAlias _parseFunctionTypeAlias(
+      CommentAndMetadata commentAndMetadata, Token keyword) {
+    TypeName returnType = null;
+    if (hasReturnTypeInTypeAlias) {
+      returnType = parseReturnType();
+    }
+    SimpleIdentifier name = parseSimpleIdentifier();
+    TypeParameterList typeParameters = null;
+    if (_matches(TokenType.LT)) {
+      typeParameters = parseTypeParameterList();
+    }
+    if (_matches(TokenType.SEMICOLON) || _matches(TokenType.EOF)) {
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS);
+      FormalParameterList parameters = new FormalParameterList(
+          _createSyntheticToken(TokenType.OPEN_PAREN), null, null, null,
+          _createSyntheticToken(TokenType.CLOSE_PAREN));
+      Token semicolon = _expect(TokenType.SEMICOLON);
+      return new FunctionTypeAlias(commentAndMetadata.comment,
+          commentAndMetadata.metadata, keyword, returnType, name,
+          typeParameters, parameters, semicolon);
+    } else if (!_matches(TokenType.OPEN_PAREN)) {
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS);
+      // TODO(brianwilkerson) Recover from this error. At the very least we
+      // should skip to the start of the next valid compilation unit member,
+      // allowing for the possibility of finding the typedef parameters before
+      // that point.
+      return new FunctionTypeAlias(commentAndMetadata.comment,
+          commentAndMetadata.metadata, keyword, returnType, name,
+          typeParameters, new FormalParameterList(
+              _createSyntheticToken(TokenType.OPEN_PAREN), null, null, null,
+              _createSyntheticToken(TokenType.CLOSE_PAREN)),
+          _createSyntheticToken(TokenType.SEMICOLON));
+    }
+    FormalParameterList parameters = parseFormalParameterList();
+    _validateFormalParameterList(parameters);
+    Token semicolon = _expect(TokenType.SEMICOLON);
+    return new FunctionTypeAlias(commentAndMetadata.comment,
+        commentAndMetadata.metadata, keyword, returnType, name, typeParameters,
+        parameters, semicolon);
+  }
+
+  /**
+   * Parse a getter. The [commentAndMetadata] is the documentation comment and
+   * metadata to be associated with the declaration. The externalKeyword] is the
+   * 'external' token. The staticKeyword] is the static keyword, or `null` if
+   * the getter is not static. The [returnType] the return type that has already
+   * been parsed, or `null` if there was no return type. Return the getter that
+   * was parsed.
+   *
+   *     getter ::=
+   *         getterSignature functionBody?
+   *
+   *     getterSignature ::=
+   *         'external'? 'static'? returnType? 'get' identifier
+   */
+  MethodDeclaration _parseGetter(CommentAndMetadata commentAndMetadata,
+      Token externalKeyword, Token staticKeyword, TypeName returnType) {
+    Token propertyKeyword = _expectKeyword(Keyword.GET);
+    SimpleIdentifier name = parseSimpleIdentifier();
+    if (_matches(TokenType.OPEN_PAREN) &&
+        _tokenMatches(_peek(), TokenType.CLOSE_PAREN)) {
+      _reportErrorForCurrentToken(ParserErrorCode.GETTER_WITH_PARAMETERS);
+      _advance();
+      _advance();
+    }
+    FunctionBody body = _parseFunctionBody(
+        externalKeyword != null || staticKeyword == null,
+        ParserErrorCode.STATIC_GETTER_WITHOUT_BODY, false);
+    if (externalKeyword != null && body is! EmptyFunctionBody) {
+      _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_GETTER_WITH_BODY);
+    }
+    return new MethodDeclaration(commentAndMetadata.comment,
+        commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType,
+        propertyKeyword, null, name, null, null, body);
+  }
+
+  /**
+   * Parse a list of identifiers. Return the list of identifiers that were
+   * parsed.
+   *
+   *     identifierList ::=
+   *         identifier (',' identifier)*
+   */
+  List<SimpleIdentifier> _parseIdentifierList() {
+    List<SimpleIdentifier> identifiers = new List<SimpleIdentifier>();
+    identifiers.add(parseSimpleIdentifier());
+    while (_matches(TokenType.COMMA)) {
+      _advance();
+      identifiers.add(parseSimpleIdentifier());
+    }
+    return identifiers;
+  }
+
+  /**
+   * Parse an if statement. Return the if statement that was parsed.
+   *
+   *     ifStatement ::=
+   *         'if' '(' expression ')' statement ('else' statement)?
+   */
+  Statement _parseIfStatement() {
+    Token ifKeyword = _expectKeyword(Keyword.IF);
+    Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
+    Expression condition = parseExpression2();
+    Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
+    Statement thenStatement = parseStatement2();
+    Token elseKeyword = null;
+    Statement elseStatement = null;
+    if (_matchesKeyword(Keyword.ELSE)) {
+      elseKeyword = getAndAdvance();
+      elseStatement = parseStatement2();
+    }
+    return new IfStatement(ifKeyword, leftParenthesis, condition,
+        rightParenthesis, thenStatement, elseKeyword, elseStatement);
+  }
+
+  /**
+   * Parse an import directive. The [commentAndMetadata] is the metadata to be
+   * associated with the directive. Return the import directive that was parsed.
+   *
+   *     importDirective ::=
+   *         metadata 'import' stringLiteral (deferred)? ('as' identifier)? combinator*';'
+   */
+  ImportDirective _parseImportDirective(CommentAndMetadata commentAndMetadata) {
+    Token importKeyword = _expectKeyword(Keyword.IMPORT);
+    StringLiteral libraryUri = _parseUri();
+    Token deferredToken = null;
+    Token asToken = null;
+    SimpleIdentifier prefix = null;
+    if (_matchesKeyword(Keyword.DEFERRED)) {
+      deferredToken = getAndAdvance();
+    }
+    if (_matchesKeyword(Keyword.AS)) {
+      asToken = getAndAdvance();
+      prefix = parseSimpleIdentifier();
+    } else if (deferredToken != null) {
+      _reportErrorForCurrentToken(
+          ParserErrorCode.MISSING_PREFIX_IN_DEFERRED_IMPORT);
+    } else if (!_matches(TokenType.SEMICOLON) &&
+        !_matchesString(_SHOW) &&
+        !_matchesString(_HIDE)) {
+      Token nextToken = _peek();
+      if (_tokenMatchesKeyword(nextToken, Keyword.AS) ||
+          _tokenMatchesString(nextToken, _SHOW) ||
+          _tokenMatchesString(nextToken, _HIDE)) {
+        _reportErrorForCurrentToken(
+            ParserErrorCode.UNEXPECTED_TOKEN, [_currentToken]);
+        _advance();
+        if (_matchesKeyword(Keyword.AS)) {
+          asToken = getAndAdvance();
+          prefix = parseSimpleIdentifier();
+        }
+      }
+    }
+    List<Combinator> combinators = _parseCombinators();
+    Token semicolon = _expectSemicolon();
+    return new ImportDirective(commentAndMetadata.comment,
+        commentAndMetadata.metadata, importKeyword, libraryUri, deferredToken,
+        asToken, prefix, combinators, semicolon);
+  }
+
+  /**
+   * Parse a list of initialized identifiers. The [commentAndMetadata] is the
+   * documentation comment and metadata to be associated with the declaration.
+   * The [staticKeyword] is the static keyword, or `null` if the getter is not
+   * static. The [keyword] is the token representing the 'final', 'const' or
+   * 'var' keyword, or `null` if there is no keyword. The [type] is the type
+   * that has already been parsed, or `null` if 'var' was provided. Return the
+   * getter that was parsed.
+   *
+   *     ?? ::=
+   *         'static'? ('var' | type) initializedIdentifierList ';'
+   *       | 'final' type? initializedIdentifierList ';'
+   *
+   *     initializedIdentifierList ::=
+   *         initializedIdentifier (',' initializedIdentifier)*
+   *
+   *     initializedIdentifier ::=
+   *         identifier ('=' expression)?
+   */
+  FieldDeclaration _parseInitializedIdentifierList(
+      CommentAndMetadata commentAndMetadata, Token staticKeyword, Token keyword,
+      TypeName type) {
+    VariableDeclarationList fieldList =
+        _parseVariableDeclarationListAfterType(null, keyword, type);
+    return new FieldDeclaration(commentAndMetadata.comment,
+        commentAndMetadata.metadata, staticKeyword, fieldList,
+        _expect(TokenType.SEMICOLON));
+  }
+
+  /**
+   * Parse an instance creation expression. The [keyword] is the 'new' or
+   * 'const' keyword that introduces the expression. Return the instance
+   * creation expression that was parsed.
+   *
+   *     instanceCreationExpression ::=
+   *         ('new' | 'const') type ('.' identifier)? argumentList
+   */
+  InstanceCreationExpression _parseInstanceCreationExpression(Token keyword) {
+    ConstructorName constructorName = parseConstructorName();
+    ArgumentList argumentList = parseArgumentList();
+    return new InstanceCreationExpression(
+        keyword, constructorName, argumentList);
+  }
+
+  /**
+   * Parse a library directive. The [commentAndMetadata] is the metadata to be
+   * associated with the directive. Return the library directive that was
+   * parsed.
+   *
+   *     libraryDirective ::=
+   *         metadata 'library' identifier ';'
+   */
+  LibraryDirective _parseLibraryDirective(
+      CommentAndMetadata commentAndMetadata) {
+    Token keyword = _expectKeyword(Keyword.LIBRARY);
+    LibraryIdentifier libraryName = _parseLibraryName(
+        ParserErrorCode.MISSING_NAME_IN_LIBRARY_DIRECTIVE, keyword);
+    Token semicolon = _expect(TokenType.SEMICOLON);
+    return new LibraryDirective(commentAndMetadata.comment,
+        commentAndMetadata.metadata, keyword, libraryName, semicolon);
+  }
+
+  /**
+   * Parse a library name. The [missingNameError] is the error code to be used
+   * if the library name is missing. The [missingNameToken] is the token
+   * associated with the error produced if the library name is missing. Return
+   * the library name that was parsed.
+   *
+   *     libraryName ::=
+   *         libraryIdentifier
+   */
+  LibraryIdentifier _parseLibraryName(
+      ParserErrorCode missingNameError, Token missingNameToken) {
+    if (_matchesIdentifier()) {
+      return parseLibraryIdentifier();
+    } else if (_matches(TokenType.STRING)) {
+      // TODO(brianwilkerson) Recovery: This should be extended to handle
+      // arbitrary tokens until we can find a token that can start a compilation
+      // unit member.
+      StringLiteral string = parseStringLiteral();
+      _reportErrorForNode(ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME, string);
+    } else {
+      _reportErrorForToken(missingNameError, missingNameToken);
+    }
+    List<SimpleIdentifier> components = new List<SimpleIdentifier>();
+    components.add(_createSyntheticIdentifier());
+    return new LibraryIdentifier(components);
+  }
+
+  /**
+   * Parse a list literal. The [modifier] is the 'const' modifier appearing
+   * before the literal, or `null` if there is no modifier. The [typeArguments]
+   * is the type arguments appearing before the literal, or `null` if there are
+   * no type arguments. Return the list literal that was parsed.
+   *
+   *     listLiteral ::=
+   *         'const'? typeArguments? '[' (expressionList ','?)? ']'
+   */
+  ListLiteral _parseListLiteral(
+      Token modifier, TypeArgumentList typeArguments) {
+    // may be empty list literal
+    if (_matches(TokenType.INDEX)) {
+      BeginToken leftBracket = _createToken(
+          _currentToken, TokenType.OPEN_SQUARE_BRACKET, isBegin: true);
+      Token rightBracket =
+          new Token(TokenType.CLOSE_SQUARE_BRACKET, _currentToken.offset + 1);
+      leftBracket.endToken = rightBracket;
+      rightBracket.setNext(_currentToken.next);
+      leftBracket.setNext(rightBracket);
+      _currentToken.previous.setNext(leftBracket);
+      _currentToken = _currentToken.next;
+      return new ListLiteral(
+          modifier, typeArguments, leftBracket, null, rightBracket);
+    }
+    // open
+    Token leftBracket = _expect(TokenType.OPEN_SQUARE_BRACKET);
+    if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) {
+      return new ListLiteral(
+          modifier, typeArguments, leftBracket, null, getAndAdvance());
+    }
+    bool wasInInitializer = _inInitializer;
+    _inInitializer = false;
+    try {
+      List<Expression> elements = new List<Expression>();
+      elements.add(parseExpression2());
+      while (_optional(TokenType.COMMA)) {
+        if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) {
+          return new ListLiteral(
+              modifier, typeArguments, leftBracket, elements, getAndAdvance());
+        }
+        elements.add(parseExpression2());
+      }
+      Token rightBracket = _expect(TokenType.CLOSE_SQUARE_BRACKET);
+      return new ListLiteral(
+          modifier, typeArguments, leftBracket, elements, rightBracket);
+    } finally {
+      _inInitializer = wasInInitializer;
+    }
+  }
+
+  /**
+   * Parse a list or map literal. The [modifier] is the 'const' modifier
+   * appearing before the literal, or `null` if there is no modifier. Return the
+   * list or map literal that was parsed.
+   *
+   *     listOrMapLiteral ::=
+   *         listLiteral
+   *       | mapLiteral
+   */
+  TypedLiteral _parseListOrMapLiteral(Token modifier) {
+    TypeArgumentList typeArguments = null;
+    if (_matches(TokenType.LT)) {
+      typeArguments = parseTypeArgumentList();
+    }
+    if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+      return _parseMapLiteral(modifier, typeArguments);
+    } else if (_matches(TokenType.OPEN_SQUARE_BRACKET) ||
+        _matches(TokenType.INDEX)) {
+      return _parseListLiteral(modifier, typeArguments);
+    }
+    _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL);
+    return new ListLiteral(modifier, typeArguments,
+        _createSyntheticToken(TokenType.OPEN_SQUARE_BRACKET), null,
+        _createSyntheticToken(TokenType.CLOSE_SQUARE_BRACKET));
+  }
+
+  /**
+   * Parse a logical and expression. Return the logical and expression that was
+   * parsed.
+   *
+   *     logicalAndExpression ::=
+   *         equalityExpression ('&&' equalityExpression)*
+   */
+  Expression _parseLogicalAndExpression() {
+    Expression expression = _parseEqualityExpression();
+    while (_matches(TokenType.AMPERSAND_AMPERSAND)) {
+      Token operator = getAndAdvance();
+      expression = new BinaryExpression(
+          expression, operator, _parseEqualityExpression());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse a map literal. The [modifier] is the 'const' modifier appearing
+   * before the literal, or `null` if there is no modifier. The [typeArguments]
+   * is the type arguments that were declared, or `null` if there are no type
+   * arguments. Return the map literal that was parsed.
+   *
+   *     mapLiteral ::=
+   *         'const'? typeArguments? '{' (mapLiteralEntry (',' mapLiteralEntry)* ','?)? '}'
+   */
+  MapLiteral _parseMapLiteral(Token modifier, TypeArgumentList typeArguments) {
+    Token leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET);
+    List<MapLiteralEntry> entries = new List<MapLiteralEntry>();
+    if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
+      return new MapLiteral(
+          modifier, typeArguments, leftBracket, entries, getAndAdvance());
+    }
+    bool wasInInitializer = _inInitializer;
+    _inInitializer = false;
+    try {
+      entries.add(parseMapLiteralEntry());
+      while (_optional(TokenType.COMMA)) {
+        if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
+          return new MapLiteral(
+              modifier, typeArguments, leftBracket, entries, getAndAdvance());
+        }
+        entries.add(parseMapLiteralEntry());
+      }
+      Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET);
+      return new MapLiteral(
+          modifier, typeArguments, leftBracket, entries, rightBracket);
+    } finally {
+      _inInitializer = wasInInitializer;
+    }
+  }
+
+  /**
+   * Parse a method declaration. The [commentAndMetadata] is the documentation
+   * comment and metadata to be associated with the declaration. The
+   * [externalKeyword] is the 'external' token. The [staticKeyword] is the
+   * static keyword, or `null` if the getter is not static. The [returnType] is
+   * the return type of the method. The [name] is the name of the method. The
+   * [parameters] is the parameters to the method. Return the method declaration
+   * that was parsed.
+   *
+   *     functionDeclaration ::=
+   *         ('external' 'static'?)? functionSignature functionBody
+   *       | 'external'? functionSignature ';'
+   */
+  MethodDeclaration _parseMethodDeclarationAfterParameters(
+      CommentAndMetadata commentAndMetadata, Token externalKeyword,
+      Token staticKeyword, TypeName returnType, SimpleIdentifier name,
+      TypeParameterList typeParameters, FormalParameterList parameters) {
+    FunctionBody body = _parseFunctionBody(
+        externalKeyword != null || staticKeyword == null,
+        ParserErrorCode.MISSING_FUNCTION_BODY, false);
+    if (externalKeyword != null) {
+      if (body is! EmptyFunctionBody) {
+        _reportErrorForNode(ParserErrorCode.EXTERNAL_METHOD_WITH_BODY, body);
+      }
+    } else if (staticKeyword != null) {
+      if (body is EmptyFunctionBody && _parseFunctionBodies) {
+        _reportErrorForNode(ParserErrorCode.ABSTRACT_STATIC_METHOD, body);
+      }
+    }
+    return new MethodDeclaration(commentAndMetadata.comment,
+        commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType,
+        null, null, name, typeParameters, parameters, body);
+  }
+
+  /**
+   * Parse a method declaration. The [commentAndMetadata] is the documentation
+   * comment and metadata to be associated with the declaration. The
+   * [externalKeyword] is the 'external' token. The [staticKeyword] is the
+   * static keyword, or `null` if the getter is not static. The [returnType] is
+   * the return type of the method. Return the method declaration that was
+   * parsed.
+   *
+   *     functionDeclaration ::=
+   *         'external'? 'static'? functionSignature functionBody
+   *       | 'external'? functionSignature ';'
+   */
+  MethodDeclaration _parseMethodDeclarationAfterReturnType(
+      CommentAndMetadata commentAndMetadata, Token externalKeyword,
+      Token staticKeyword, TypeName returnType) {
+    SimpleIdentifier methodName = parseSimpleIdentifier();
+    TypeParameterList typeParameters = null;
+    if (parseGenericMethods && _matches(TokenType.LT)) {
+      typeParameters = parseTypeParameterList();
+    }
+    FormalParameterList parameters;
+    if (!_matches(TokenType.OPEN_PAREN) &&
+        (_matches(TokenType.OPEN_CURLY_BRACKET) ||
+            _matches(TokenType.FUNCTION))) {
+      _reportErrorForToken(
+          ParserErrorCode.MISSING_METHOD_PARAMETERS, _currentToken.previous);
+      parameters = new FormalParameterList(
+          _createSyntheticToken(TokenType.OPEN_PAREN), null, null, null,
+          _createSyntheticToken(TokenType.CLOSE_PAREN));
+    } else {
+      parameters = parseFormalParameterList();
+    }
+    _validateFormalParameterList(parameters);
+    return _parseMethodDeclarationAfterParameters(commentAndMetadata,
+        externalKeyword, staticKeyword, returnType, methodName, typeParameters,
+        parameters);
+  }
+
+  /**
+   * Parse the modifiers preceding a declaration. This method allows the
+   * modifiers to appear in any order but does generate errors for duplicated
+   * modifiers. Checks for other problems, such as having the modifiers appear
+   * in the wrong order or specifying both 'const' and 'final', are reported in
+   * one of the methods whose name is prefixed with `validateModifiersFor`.
+   * Return the modifiers that were parsed.
+   *
+   *     modifiers ::=
+   *         ('abstract' | 'const' | 'external' | 'factory' | 'final' | 'static' | 'var')*
+   */
+  Modifiers _parseModifiers() {
+    Modifiers modifiers = new Modifiers();
+    bool progress = true;
+    while (progress) {
+      if (_tokenMatches(_peek(), TokenType.PERIOD) ||
+          _tokenMatches(_peek(), TokenType.LT) ||
+          _tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
+        return modifiers;
+      }
+      if (_matchesKeyword(Keyword.ABSTRACT)) {
+        if (modifiers.abstractKeyword != null) {
+          _reportErrorForCurrentToken(
+              ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          _advance();
+        } else {
+          modifiers.abstractKeyword = getAndAdvance();
+        }
+      } else if (_matchesKeyword(Keyword.CONST)) {
+        if (modifiers.constKeyword != null) {
+          _reportErrorForCurrentToken(
+              ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          _advance();
+        } else {
+          modifiers.constKeyword = getAndAdvance();
+        }
+      } else if (_matchesKeyword(Keyword.EXTERNAL) &&
+          !_tokenMatches(_peek(), TokenType.PERIOD) &&
+          !_tokenMatches(_peek(), TokenType.LT)) {
+        if (modifiers.externalKeyword != null) {
+          _reportErrorForCurrentToken(
+              ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          _advance();
+        } else {
+          modifiers.externalKeyword = getAndAdvance();
+        }
+      } else if (_matchesKeyword(Keyword.FACTORY) &&
+          !_tokenMatches(_peek(), TokenType.PERIOD) &&
+          !_tokenMatches(_peek(), TokenType.LT)) {
+        if (modifiers.factoryKeyword != null) {
+          _reportErrorForCurrentToken(
+              ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          _advance();
+        } else {
+          modifiers.factoryKeyword = getAndAdvance();
+        }
+      } else if (_matchesKeyword(Keyword.FINAL)) {
+        if (modifiers.finalKeyword != null) {
+          _reportErrorForCurrentToken(
+              ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          _advance();
+        } else {
+          modifiers.finalKeyword = getAndAdvance();
+        }
+      } else if (_matchesKeyword(Keyword.STATIC) &&
+          !_tokenMatches(_peek(), TokenType.PERIOD) &&
+          !_tokenMatches(_peek(), TokenType.LT)) {
+        if (modifiers.staticKeyword != null) {
+          _reportErrorForCurrentToken(
+              ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          _advance();
+        } else {
+          modifiers.staticKeyword = getAndAdvance();
+        }
+      } else if (_matchesKeyword(Keyword.VAR)) {
+        if (modifiers.varKeyword != null) {
+          _reportErrorForCurrentToken(
+              ParserErrorCode.DUPLICATED_MODIFIER, [_currentToken.lexeme]);
+          _advance();
+        } else {
+          modifiers.varKeyword = getAndAdvance();
+        }
+      } else {
+        progress = false;
+      }
+    }
+    return modifiers;
+  }
+
+  /**
+   * Parse a multiplicative expression. Return the multiplicative expression
+   * that was parsed.
+   *
+   *     multiplicativeExpression ::=
+   *         unaryExpression (multiplicativeOperator unaryExpression)*
+   *       | 'super' (multiplicativeOperator unaryExpression)+
+   */
+  Expression _parseMultiplicativeExpression() {
+    Expression expression;
+    if (_matchesKeyword(Keyword.SUPER) &&
+        _currentToken.next.type.isMultiplicativeOperator) {
+      expression = new SuperExpression(getAndAdvance());
+    } else {
+      expression = _parseUnaryExpression();
+    }
+    while (_currentToken.type.isMultiplicativeOperator) {
+      Token operator = getAndAdvance();
+      expression =
+          new BinaryExpression(expression, operator, _parseUnaryExpression());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse a class native clause. Return the native clause that was parsed.
+   *
+   *     classNativeClause ::=
+   *         'native' name
+   */
+  NativeClause _parseNativeClause() {
+    Token keyword = getAndAdvance();
+    StringLiteral name = parseStringLiteral();
+    return new NativeClause(keyword, name);
+  }
+
+  /**
+   * Parse a new expression. Return the new expression that was parsed.
+   *
+   *     newExpression ::=
+   *         instanceCreationExpression
+   */
+  InstanceCreationExpression _parseNewExpression() =>
+      _parseInstanceCreationExpression(_expectKeyword(Keyword.NEW));
+
+  /**
+   * Parse a non-labeled statement. Return the non-labeled statement that was
+   * parsed.
+   *
+   *     nonLabeledStatement ::=
+   *         block
+   *       | assertStatement
+   *       | breakStatement
+   *       | continueStatement
+   *       | doStatement
+   *       | forStatement
+   *       | ifStatement
+   *       | returnStatement
+   *       | switchStatement
+   *       | tryStatement
+   *       | whileStatement
+   *       | variableDeclarationList ';'
+   *       | expressionStatement
+   *       | functionSignature functionBody
+   */
+  Statement _parseNonLabeledStatement() {
+    // TODO(brianwilkerson) Pass the comment and metadata on where appropriate.
+    CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
+    if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+      if (_tokenMatches(_peek(), TokenType.STRING)) {
+        Token afterString = _skipStringLiteral(_currentToken.next);
+        if (afterString != null && afterString.type == TokenType.COLON) {
+          return new ExpressionStatement(
+              parseExpression2(), _expect(TokenType.SEMICOLON));
+        }
+      }
+      return parseBlock();
+    } else if (_matches(TokenType.KEYWORD) &&
+        !(_currentToken as KeywordToken).keyword.isPseudoKeyword) {
+      Keyword keyword = (_currentToken as KeywordToken).keyword;
+      // TODO(jwren) compute some metrics to figure out a better order for this
+      // if-then sequence to optimize performance
+      if (keyword == Keyword.ASSERT) {
+        return _parseAssertStatement();
+      } else if (keyword == Keyword.BREAK) {
+        return _parseBreakStatement();
+      } else if (keyword == Keyword.CONTINUE) {
+        return _parseContinueStatement();
+      } else if (keyword == Keyword.DO) {
+        return _parseDoStatement();
+      } else if (keyword == Keyword.FOR) {
+        return _parseForStatement();
+      } else if (keyword == Keyword.IF) {
+        return _parseIfStatement();
+      } else if (keyword == Keyword.RETHROW) {
+        return new ExpressionStatement(
+            _parseRethrowExpression(), _expect(TokenType.SEMICOLON));
+      } else if (keyword == Keyword.RETURN) {
+        return _parseReturnStatement();
+      } else if (keyword == Keyword.SWITCH) {
+        return _parseSwitchStatement();
+      } else if (keyword == Keyword.THROW) {
+        return new ExpressionStatement(
+            _parseThrowExpression(), _expect(TokenType.SEMICOLON));
+      } else if (keyword == Keyword.TRY) {
+        return _parseTryStatement();
+      } else if (keyword == Keyword.WHILE) {
+        return _parseWhileStatement();
+      } else if (keyword == Keyword.VAR || keyword == Keyword.FINAL) {
+        return _parseVariableDeclarationStatementAfterMetadata(
+            commentAndMetadata);
+      } else if (keyword == Keyword.VOID) {
+        TypeName returnType = parseReturnType();
+        if (_matchesIdentifier() &&
+            _peek().matchesAny([
+          TokenType.OPEN_PAREN,
+          TokenType.OPEN_CURLY_BRACKET,
+          TokenType.FUNCTION
+        ])) {
+          return _parseFunctionDeclarationStatementAfterReturnType(
+              commentAndMetadata, returnType);
+        } else {
+          //
+          // We have found an error of some kind. Try to recover.
+          //
+          if (_matchesIdentifier()) {
+            if (_peek().matchesAny(
+                [TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) {
+              //
+              // We appear to have a variable declaration with a type of "void".
+              //
+              _reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType);
+              return _parseVariableDeclarationStatementAfterMetadata(
+                  commentAndMetadata);
+            }
+          } else if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
+            //
+            // We appear to have found an incomplete statement at the end of a
+            // block. Parse it as a variable declaration.
+            //
+            return _parseVariableDeclarationStatementAfterType(
+                commentAndMetadata, null, returnType);
+          }
+          _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT);
+          // TODO(brianwilkerson) Recover from this error.
+          return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON));
+        }
+      } else if (keyword == Keyword.CONST) {
+        if (_peek().matchesAny([
+          TokenType.LT,
+          TokenType.OPEN_CURLY_BRACKET,
+          TokenType.OPEN_SQUARE_BRACKET,
+          TokenType.INDEX
+        ])) {
+          return new ExpressionStatement(
+              parseExpression2(), _expect(TokenType.SEMICOLON));
+        } else if (_tokenMatches(_peek(), TokenType.IDENTIFIER)) {
+          Token afterType = _skipTypeName(_peek());
+          if (afterType != null) {
+            if (_tokenMatches(afterType, TokenType.OPEN_PAREN) ||
+                (_tokenMatches(afterType, TokenType.PERIOD) &&
+                    _tokenMatches(afterType.next, TokenType.IDENTIFIER) &&
+                    _tokenMatches(afterType.next.next, TokenType.OPEN_PAREN))) {
+              return new ExpressionStatement(
+                  parseExpression2(), _expect(TokenType.SEMICOLON));
+            }
+          }
+        }
+        return _parseVariableDeclarationStatementAfterMetadata(
+            commentAndMetadata);
+      } else if (keyword == Keyword.NEW ||
+          keyword == Keyword.TRUE ||
+          keyword == Keyword.FALSE ||
+          keyword == Keyword.NULL ||
+          keyword == Keyword.SUPER ||
+          keyword == Keyword.THIS) {
+        return new ExpressionStatement(
+            parseExpression2(), _expect(TokenType.SEMICOLON));
+      } else {
+        //
+        // We have found an error of some kind. Try to recover.
+        //
+        _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT);
+        return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON));
+      }
+    } else if (_inGenerator && _matchesString(_YIELD)) {
+      return _parseYieldStatement();
+    } else if (_inAsync && _matchesString(_AWAIT)) {
+      if (_tokenMatchesKeyword(_peek(), Keyword.FOR)) {
+        return _parseForStatement();
+      }
+      return new ExpressionStatement(
+          parseExpression2(), _expect(TokenType.SEMICOLON));
+    } else if (_matchesString(_AWAIT) &&
+        _tokenMatchesKeyword(_peek(), Keyword.FOR)) {
+      Token awaitToken = _currentToken;
+      Statement statement = _parseForStatement();
+      if (statement is! ForStatement) {
+        _reportErrorForToken(
+            CompileTimeErrorCode.ASYNC_FOR_IN_WRONG_CONTEXT, awaitToken);
+      }
+      return statement;
+    } else if (_matches(TokenType.SEMICOLON)) {
+      return _parseEmptyStatement();
+    } else if (_isInitializedVariableDeclaration()) {
+      return _parseVariableDeclarationStatementAfterMetadata(
+          commentAndMetadata);
+    } else if (_isFunctionDeclaration()) {
+      return _parseFunctionDeclarationStatement();
+    } else if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT);
+      return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON));
+    } else {
+      return new ExpressionStatement(parseExpression2(), _expectSemicolon());
+    }
+  }
+
+  /**
+   * Parse an operator declaration. The [commentAndMetadata] is the
+   * documentation comment and metadata to be associated with the declaration.
+   * The [externalKeyword] is the 'external' token. The [returnType] is the
+   * return type that has already been parsed, or `null` if there was no return
+   * type. Return the operator declaration that was parsed.
+   *
+   *     operatorDeclaration ::=
+   *         operatorSignature (';' | functionBody)
+   *
+   *     operatorSignature ::=
+   *         'external'? returnType? 'operator' operator formalParameterList
+   */
+  MethodDeclaration _parseOperator(CommentAndMetadata commentAndMetadata,
+      Token externalKeyword, TypeName returnType) {
+    Token operatorKeyword;
+    if (_matchesKeyword(Keyword.OPERATOR)) {
+      operatorKeyword = getAndAdvance();
+    } else {
+      _reportErrorForToken(
+          ParserErrorCode.MISSING_KEYWORD_OPERATOR, _currentToken);
+      operatorKeyword = _createSyntheticKeyword(Keyword.OPERATOR);
+    }
+    if (!_currentToken.isUserDefinableOperator) {
+      _reportErrorForCurrentToken(
+          ParserErrorCode.NON_USER_DEFINABLE_OPERATOR, [_currentToken.lexeme]);
+    }
+    SimpleIdentifier name = new SimpleIdentifier(getAndAdvance());
+    if (_matches(TokenType.EQ)) {
+      Token previous = _currentToken.previous;
+      if ((_tokenMatches(previous, TokenType.EQ_EQ) ||
+              _tokenMatches(previous, TokenType.BANG_EQ)) &&
+          _currentToken.offset == previous.offset + 2) {
+        _reportErrorForCurrentToken(ParserErrorCode.INVALID_OPERATOR,
+            ["${previous.lexeme}${_currentToken.lexeme}"]);
+        _advance();
+      }
+    }
+    FormalParameterList parameters = parseFormalParameterList();
+    _validateFormalParameterList(parameters);
+    FunctionBody body =
+        _parseFunctionBody(true, ParserErrorCode.MISSING_FUNCTION_BODY, false);
+    if (externalKeyword != null && body is! EmptyFunctionBody) {
+      _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY);
+    }
+    return new MethodDeclaration(commentAndMetadata.comment,
+        commentAndMetadata.metadata, externalKeyword, null, returnType, null,
+        operatorKeyword, name, null, parameters, body);
+  }
+
+  /**
+   * Parse a return type if one is given, otherwise return `null` without
+   * advancing. Return the return type that was parsed.
+   */
+  TypeName _parseOptionalReturnType() {
+    if (_matchesKeyword(Keyword.VOID)) {
+      return parseReturnType();
+    } else if (_matchesIdentifier() &&
+        !_matchesKeyword(Keyword.GET) &&
+        !_matchesKeyword(Keyword.SET) &&
+        !_matchesKeyword(Keyword.OPERATOR) &&
+        (_tokenMatchesIdentifier(_peek()) ||
+            _tokenMatches(_peek(), TokenType.LT))) {
+      return parseReturnType();
+    } else if (_matchesIdentifier() &&
+        _tokenMatches(_peek(), TokenType.PERIOD) &&
+        _tokenMatchesIdentifier(_peekAt(2)) &&
+        (_tokenMatchesIdentifier(_peekAt(3)) ||
+            _tokenMatches(_peekAt(3), TokenType.LT))) {
+      return parseReturnType();
+    }
+    return null;
+  }
+
+  /**
+   * Parse a part or part-of directive. The [commentAndMetadata] is the metadata
+   * to be associated with the directive. Return the part or part-of directive
+   * that was parsed.
+   *
+   *     partDirective ::=
+   *         metadata 'part' stringLiteral ';'
+   *
+   *     partOfDirective ::=
+   *         metadata 'part' 'of' identifier ';'
+   */
+  Directive _parsePartDirective(CommentAndMetadata commentAndMetadata) {
+    Token partKeyword = _expectKeyword(Keyword.PART);
+    if (_matchesString(_OF)) {
+      Token ofKeyword = getAndAdvance();
+      LibraryIdentifier libraryName = _parseLibraryName(
+          ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE, ofKeyword);
+      Token semicolon = _expect(TokenType.SEMICOLON);
+      return new PartOfDirective(commentAndMetadata.comment,
+          commentAndMetadata.metadata, partKeyword, ofKeyword, libraryName,
+          semicolon);
+    }
+    StringLiteral partUri = _parseUri();
+    Token semicolon = _expect(TokenType.SEMICOLON);
+    return new PartDirective(commentAndMetadata.comment,
+        commentAndMetadata.metadata, partKeyword, partUri, semicolon);
+  }
+
+  /**
+   * Parse a postfix expression. Return the postfix expression that was parsed.
+   *
+   *     postfixExpression ::=
+   *         assignableExpression postfixOperator
+   *       | primary selector*
+   *
+   *     selector ::=
+   *         assignableSelector
+   *       | argumentList
+   */
+  Expression _parsePostfixExpression() {
+    Expression operand = _parseAssignableExpression(true);
+    if (_matches(TokenType.OPEN_SQUARE_BRACKET) ||
+        _matches(TokenType.PERIOD) ||
+        _matches(TokenType.QUESTION_PERIOD) ||
+        _matches(TokenType.OPEN_PAREN) ||
+        (parseGenericMethods && _matches(TokenType.LT))) {
+      do {
+        if (_isLikelyParameterList()) {
+          TypeArgumentList typeArguments = null;
+          if (_matches(TokenType.LT)) {
+            typeArguments = parseTypeArgumentList();
+          }
+          ArgumentList argumentList = parseArgumentList();
+          if (operand is PropertyAccess) {
+            PropertyAccess access = operand as PropertyAccess;
+            operand = new MethodInvocation(access.target, access.operator,
+                access.propertyName, typeArguments, argumentList);
+          } else {
+            operand = new FunctionExpressionInvocation(
+                operand, typeArguments, argumentList);
+          }
+        } else {
+          operand = _parseAssignableSelector(operand, true);
+        }
+      } while (_matches(TokenType.OPEN_SQUARE_BRACKET) ||
+          _matches(TokenType.PERIOD) ||
+          _matches(TokenType.QUESTION_PERIOD) ||
+          _matches(TokenType.OPEN_PAREN));
+      return operand;
+    }
+    if (!_currentToken.type.isIncrementOperator) {
+      return operand;
+    }
+    _ensureAssignable(operand);
+    Token operator = getAndAdvance();
+    return new PostfixExpression(operand, operator);
+  }
+
+  /**
+   * Parse a primary expression. Return the primary expression that was parsed.
+   *
+   *     primary ::=
+   *         thisExpression
+   *       | 'super' unconditionalAssignableSelector
+   *       | functionExpression
+   *       | literal
+   *       | identifier
+   *       | newExpression
+   *       | constObjectExpression
+   *       | '(' expression ')'
+   *       | argumentDefinitionTest
+   *
+   *     literal ::=
+   *         nullLiteral
+   *       | booleanLiteral
+   *       | numericLiteral
+   *       | stringLiteral
+   *       | symbolLiteral
+   *       | mapLiteral
+   *       | listLiteral
+   */
+  Expression _parsePrimaryExpression() {
+    if (_matchesKeyword(Keyword.THIS)) {
+      return new ThisExpression(getAndAdvance());
+    } else if (_matchesKeyword(Keyword.SUPER)) {
+      // TODO(paulberry): verify with Gilad that "super" must be followed by
+      // unconditionalAssignableSelector in this case.
+      return _parseAssignableSelector(
+          new SuperExpression(getAndAdvance()), false, allowConditional: false);
+    } else if (_matchesKeyword(Keyword.NULL)) {
+      return new NullLiteral(getAndAdvance());
+    } else if (_matchesKeyword(Keyword.FALSE)) {
+      return new BooleanLiteral(getAndAdvance(), false);
+    } else if (_matchesKeyword(Keyword.TRUE)) {
+      return new BooleanLiteral(getAndAdvance(), true);
+    } else if (_matches(TokenType.DOUBLE)) {
+      Token token = getAndAdvance();
+      double value = 0.0;
+      try {
+        value = double.parse(token.lexeme);
+      } on FormatException {
+        // The invalid format should have been reported by the scanner.
+      }
+      return new DoubleLiteral(token, value);
+    } else if (_matches(TokenType.HEXADECIMAL)) {
+      Token token = getAndAdvance();
+      int value = null;
+      try {
+        value = int.parse(token.lexeme.substring(2), radix: 16);
+      } on FormatException {
+        // The invalid format should have been reported by the scanner.
+      }
+      return new IntegerLiteral(token, value);
+    } else if (_matches(TokenType.INT)) {
+      Token token = getAndAdvance();
+      int value = null;
+      try {
+        value = int.parse(token.lexeme);
+      } on FormatException {
+        // The invalid format should have been reported by the scanner.
+      }
+      return new IntegerLiteral(token, value);
+    } else if (_matches(TokenType.STRING)) {
+      return parseStringLiteral();
+    } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+      return _parseMapLiteral(null, null);
+    } else if (_matches(TokenType.OPEN_SQUARE_BRACKET) ||
+        _matches(TokenType.INDEX)) {
+      return _parseListLiteral(null, null);
+    } else if (_matchesIdentifier()) {
+      // TODO(brianwilkerson) The code below was an attempt to recover from an
+      // error case, but it needs to be applied as a recovery only after we
+      // know that parsing it as an identifier doesn't work. Leaving the code as
+      // a reminder of how to recover.
+//            if (isFunctionExpression(peek())) {
+//              //
+//              // Function expressions were allowed to have names at one point, but this is now illegal.
+//              //
+//              reportError(ParserErrorCode.NAMED_FUNCTION_EXPRESSION, getAndAdvance());
+//              return parseFunctionExpression();
+//            }
+      return parsePrefixedIdentifier();
+    } else if (_matchesKeyword(Keyword.NEW)) {
+      return _parseNewExpression();
+    } else if (_matchesKeyword(Keyword.CONST)) {
+      return _parseConstExpression();
+    } else if (_matches(TokenType.OPEN_PAREN)) {
+      if (_isFunctionExpression(_currentToken)) {
+        return parseFunctionExpression();
+      }
+      Token leftParenthesis = getAndAdvance();
+      bool wasInInitializer = _inInitializer;
+      _inInitializer = false;
+      try {
+        Expression expression = parseExpression2();
+        Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
+        return new ParenthesizedExpression(
+            leftParenthesis, expression, rightParenthesis);
+      } finally {
+        _inInitializer = wasInInitializer;
+      }
+    } else if (_matches(TokenType.LT)) {
+      return _parseListOrMapLiteral(null);
+    } else if (_matches(TokenType.QUESTION) &&
+        _tokenMatches(_peek(), TokenType.IDENTIFIER)) {
+      _reportErrorForCurrentToken(
+          ParserErrorCode.UNEXPECTED_TOKEN, [_currentToken.lexeme]);
+      _advance();
+      return _parsePrimaryExpression();
+    } else if (_matchesKeyword(Keyword.VOID)) {
+      //
+      // Recover from having a return type of "void" where a return type is not
+      // expected.
+      //
+      // TODO(brianwilkerson) Improve this error message.
+      _reportErrorForCurrentToken(
+          ParserErrorCode.UNEXPECTED_TOKEN, [_currentToken.lexeme]);
+      _advance();
+      return _parsePrimaryExpression();
+    } else if (_matches(TokenType.HASH)) {
+      return _parseSymbolLiteral();
+    } else {
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
+      return _createSyntheticIdentifier();
+    }
+  }
+
+  /**
+   * Parse a redirecting constructor invocation. Return the redirecting
+   * constructor invocation that was parsed.
+   *
+   *     redirectingConstructorInvocation ::=
+   *         'this' ('.' identifier)? arguments
+   */
+  RedirectingConstructorInvocation _parseRedirectingConstructorInvocation() {
+    Token keyword = _expectKeyword(Keyword.THIS);
+    Token period = null;
+    SimpleIdentifier constructorName = null;
+    if (_matches(TokenType.PERIOD)) {
+      period = getAndAdvance();
+      constructorName = parseSimpleIdentifier();
+    }
+    ArgumentList argumentList = parseArgumentList();
+    return new RedirectingConstructorInvocation(
+        keyword, period, constructorName, argumentList);
+  }
+
+  /**
+   * Parse a relational expression. Return the relational expression that was
+   * parsed.
+   *
+   *     relationalExpression ::=
+   *         bitwiseOrExpression ('is' '!'? type | 'as' type | relationalOperator bitwiseOrExpression)?
+   *       | 'super' relationalOperator bitwiseOrExpression
+   */
+  Expression _parseRelationalExpression() {
+    if (_matchesKeyword(Keyword.SUPER) &&
+        _currentToken.next.type.isRelationalOperator) {
+      Expression expression = new SuperExpression(getAndAdvance());
+      Token operator = getAndAdvance();
+      expression = new BinaryExpression(
+          expression, operator, parseBitwiseOrExpression());
+      return expression;
+    }
+    Expression expression = parseBitwiseOrExpression();
+    if (_matchesKeyword(Keyword.AS)) {
+      Token asOperator = getAndAdvance();
+      expression = new AsExpression(expression, asOperator, parseTypeName());
+    } else if (_matchesKeyword(Keyword.IS)) {
+      Token isOperator = getAndAdvance();
+      Token notOperator = null;
+      if (_matches(TokenType.BANG)) {
+        notOperator = getAndAdvance();
+      }
+      expression = new IsExpression(
+          expression, isOperator, notOperator, parseTypeName());
+    } else if (_currentToken.type.isRelationalOperator) {
+      Token operator = getAndAdvance();
+      expression = new BinaryExpression(
+          expression, operator, parseBitwiseOrExpression());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse a rethrow expression. Return the rethrow expression that was parsed.
+   *
+   *     rethrowExpression ::=
+   *         'rethrow'
+   */
+  Expression _parseRethrowExpression() =>
+      new RethrowExpression(_expectKeyword(Keyword.RETHROW));
+
+  /**
+   * Parse a return statement. Return the return statement that was parsed.
+   *
+   *     returnStatement ::=
+   *         'return' expression? ';'
+   */
+  Statement _parseReturnStatement() {
+    Token returnKeyword = _expectKeyword(Keyword.RETURN);
+    if (_matches(TokenType.SEMICOLON)) {
+      return new ReturnStatement(returnKeyword, null, getAndAdvance());
+    }
+    Expression expression = parseExpression2();
+    Token semicolon = _expect(TokenType.SEMICOLON);
+    return new ReturnStatement(returnKeyword, expression, semicolon);
+  }
+
+  /**
+   * Parse a setter. The [commentAndMetadata] is the documentation comment and
+   * metadata to be associated with the declaration. The [externalKeyword] is
+   * the 'external' token. The [staticKeyword] is the static keyword, or `null`
+   * if the setter is not static. The [returnType] is the return type that has
+   * already been parsed, or `null` if there was no return type. Return the
+   * setter that was parsed.
+   *
+   *     setter ::=
+   *         setterSignature functionBody?
+   *
+   *     setterSignature ::=
+   *         'external'? 'static'? returnType? 'set' identifier formalParameterList
+   */
+  MethodDeclaration _parseSetter(CommentAndMetadata commentAndMetadata,
+      Token externalKeyword, Token staticKeyword, TypeName returnType) {
+    Token propertyKeyword = _expectKeyword(Keyword.SET);
+    SimpleIdentifier name = parseSimpleIdentifier();
+    FormalParameterList parameters = parseFormalParameterList();
+    _validateFormalParameterList(parameters);
+    FunctionBody body = _parseFunctionBody(
+        externalKeyword != null || staticKeyword == null,
+        ParserErrorCode.STATIC_SETTER_WITHOUT_BODY, false);
+    if (externalKeyword != null && body is! EmptyFunctionBody) {
+      _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_SETTER_WITH_BODY);
+    }
+    return new MethodDeclaration(commentAndMetadata.comment,
+        commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType,
+        propertyKeyword, null, name, null, parameters, body);
+  }
+
+  /**
+   * Parse a shift expression. Return the shift expression that was parsed.
+   *
+   *     shiftExpression ::=
+   *         additiveExpression (shiftOperator additiveExpression)*
+   *       | 'super' (shiftOperator additiveExpression)+
+   */
+  Expression _parseShiftExpression() {
+    Expression expression;
+    if (_matchesKeyword(Keyword.SUPER) &&
+        _currentToken.next.type.isShiftOperator) {
+      expression = new SuperExpression(getAndAdvance());
+    } else {
+      expression = _parseAdditiveExpression();
+    }
+    while (_currentToken.type.isShiftOperator) {
+      Token operator = getAndAdvance();
+      expression = new BinaryExpression(
+          expression, operator, _parseAdditiveExpression());
+    }
+    return expression;
+  }
+
+  /**
+   * Parse a list of statements within a switch statement. Return the statements
+   * that were parsed.
+   *
+   *     statements ::=
+   *         statement*
+   */
+  List<Statement> _parseStatementList() {
+    List<Statement> statements = new List<Statement>();
+    Token statementStart = _currentToken;
+    while (!_matches(TokenType.EOF) &&
+        !_matches(TokenType.CLOSE_CURLY_BRACKET) &&
+        !_isSwitchMember()) {
+      statements.add(parseStatement2());
+      if (identical(_currentToken, statementStart)) {
+        _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken,
+            [_currentToken.lexeme]);
+        _advance();
+      }
+      statementStart = _currentToken;
+    }
+    return statements;
+  }
+
+  /**
+   * Parse a string literal that contains interpolations. Return the string
+   * literal that was parsed.
+   */
+  StringInterpolation _parseStringInterpolation(Token string) {
+    List<InterpolationElement> elements = new List<InterpolationElement>();
+    bool hasMore = _matches(TokenType.STRING_INTERPOLATION_EXPRESSION) ||
+        _matches(TokenType.STRING_INTERPOLATION_IDENTIFIER);
+    elements.add(new InterpolationString(
+        string, _computeStringValue(string.lexeme, true, !hasMore)));
+    while (hasMore) {
+      if (_matches(TokenType.STRING_INTERPOLATION_EXPRESSION)) {
+        Token openToken = getAndAdvance();
+        bool wasInInitializer = _inInitializer;
+        _inInitializer = false;
+        try {
+          Expression expression = parseExpression2();
+          Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET);
+          elements.add(
+              new InterpolationExpression(openToken, expression, rightBracket));
+        } finally {
+          _inInitializer = wasInInitializer;
+        }
+      } else {
+        Token openToken = getAndAdvance();
+        Expression expression = null;
+        if (_matchesKeyword(Keyword.THIS)) {
+          expression = new ThisExpression(getAndAdvance());
+        } else {
+          expression = parseSimpleIdentifier();
+        }
+        elements.add(new InterpolationExpression(openToken, expression, null));
+      }
+      if (_matches(TokenType.STRING)) {
+        string = getAndAdvance();
+        hasMore = _matches(TokenType.STRING_INTERPOLATION_EXPRESSION) ||
+            _matches(TokenType.STRING_INTERPOLATION_IDENTIFIER);
+        elements.add(new InterpolationString(
+            string, _computeStringValue(string.lexeme, false, !hasMore)));
+      } else {
+        hasMore = false;
+      }
+    }
+    return new StringInterpolation(elements);
+  }
+
+  /**
+   * Parse a super constructor invocation. Return the super constructor
+   * invocation that was parsed.
+   *
+   *     superConstructorInvocation ::=
+   *         'super' ('.' identifier)? arguments
+   */
+  SuperConstructorInvocation _parseSuperConstructorInvocation() {
+    Token keyword = _expectKeyword(Keyword.SUPER);
+    Token period = null;
+    SimpleIdentifier constructorName = null;
+    if (_matches(TokenType.PERIOD)) {
+      period = getAndAdvance();
+      constructorName = parseSimpleIdentifier();
+    }
+    ArgumentList argumentList = parseArgumentList();
+    return new SuperConstructorInvocation(
+        keyword, period, constructorName, argumentList);
+  }
+
+  /**
+   * Parse a switch statement. Return the switch statement that was parsed.
+   *
+   *     switchStatement ::=
+   *         'switch' '(' expression ')' '{' switchCase* defaultCase? '}'
+   *
+   *     switchCase ::=
+   *         label* ('case' expression ':') statements
+   *
+   *     defaultCase ::=
+   *         label* 'default' ':' statements
+   */
+  SwitchStatement _parseSwitchStatement() {
+    bool wasInSwitch = _inSwitch;
+    _inSwitch = true;
+    try {
+      HashSet<String> definedLabels = new HashSet<String>();
+      Token keyword = _expectKeyword(Keyword.SWITCH);
+      Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
+      Expression expression = parseExpression2();
+      Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
+      Token leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET);
+      Token defaultKeyword = null;
+      List<SwitchMember> members = new List<SwitchMember>();
+      while (!_matches(TokenType.EOF) &&
+          !_matches(TokenType.CLOSE_CURLY_BRACKET)) {
+        List<Label> labels = new List<Label>();
+        while (
+            _matchesIdentifier() && _tokenMatches(_peek(), TokenType.COLON)) {
+          SimpleIdentifier identifier = parseSimpleIdentifier();
+          String label = identifier.token.lexeme;
+          if (definedLabels.contains(label)) {
+            _reportErrorForToken(
+                ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT,
+                identifier.token, [label]);
+          } else {
+            definedLabels.add(label);
+          }
+          Token colon = _expect(TokenType.COLON);
+          labels.add(new Label(identifier, colon));
+        }
+        if (_matchesKeyword(Keyword.CASE)) {
+          Token caseKeyword = getAndAdvance();
+          Expression caseExpression = parseExpression2();
+          Token colon = _expect(TokenType.COLON);
+          members.add(new SwitchCase(labels, caseKeyword, caseExpression, colon,
+              _parseStatementList()));
+          if (defaultKeyword != null) {
+            _reportErrorForToken(
+                ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE,
+                caseKeyword);
+          }
+        } else if (_matchesKeyword(Keyword.DEFAULT)) {
+          if (defaultKeyword != null) {
+            _reportErrorForToken(
+                ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES, _peek());
+          }
+          defaultKeyword = getAndAdvance();
+          Token colon = _expect(TokenType.COLON);
+          members.add(new SwitchDefault(
+              labels, defaultKeyword, colon, _parseStatementList()));
+        } else {
+          // We need to advance, otherwise we could end up in an infinite loop,
+          // but this could be a lot smarter about recovering from the error.
+          _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_CASE_OR_DEFAULT);
+          while (!_matches(TokenType.EOF) &&
+              !_matches(TokenType.CLOSE_CURLY_BRACKET) &&
+              !_matchesKeyword(Keyword.CASE) &&
+              !_matchesKeyword(Keyword.DEFAULT)) {
+            _advance();
+          }
+        }
+      }
+      Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET);
+      return new SwitchStatement(keyword, leftParenthesis, expression,
+          rightParenthesis, leftBracket, members, rightBracket);
+    } finally {
+      _inSwitch = wasInSwitch;
+    }
+  }
+
+  /**
+   * Parse a symbol literal. Return the symbol literal that was parsed.
+   *
+   *     symbolLiteral ::=
+   *         '#' identifier ('.' identifier)*
+   */
+  SymbolLiteral _parseSymbolLiteral() {
+    Token poundSign = getAndAdvance();
+    List<Token> components = new List<Token>();
+    if (_matchesIdentifier()) {
+      components.add(getAndAdvance());
+      while (_matches(TokenType.PERIOD)) {
+        _advance();
+        if (_matchesIdentifier()) {
+          components.add(getAndAdvance());
+        } else {
+          _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
+          components.add(_createSyntheticToken(TokenType.IDENTIFIER));
+          break;
+        }
+      }
+    } else if (_currentToken.isOperator) {
+      components.add(getAndAdvance());
+    } else if (_tokenMatchesKeyword(_currentToken, Keyword.VOID)) {
+      components.add(getAndAdvance());
+    } else {
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
+      components.add(_createSyntheticToken(TokenType.IDENTIFIER));
+    }
+    return new SymbolLiteral(poundSign, components);
+  }
+
+  /**
+   * Parse a throw expression. Return the throw expression that was parsed.
+   *
+   *     throwExpression ::=
+   *         'throw' expression
+   */
+  Expression _parseThrowExpression() {
+    Token keyword = _expectKeyword(Keyword.THROW);
+    if (_matches(TokenType.SEMICOLON) || _matches(TokenType.CLOSE_PAREN)) {
+      _reportErrorForToken(
+          ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _currentToken);
+      return new ThrowExpression(keyword, _createSyntheticIdentifier());
+    }
+    Expression expression = parseExpression2();
+    return new ThrowExpression(keyword, expression);
+  }
+
+  /**
+   * Parse a throw expression. Return the throw expression that was parsed.
+   *
+   *     throwExpressionWithoutCascade ::=
+   *         'throw' expressionWithoutCascade
+   */
+  Expression _parseThrowExpressionWithoutCascade() {
+    Token keyword = _expectKeyword(Keyword.THROW);
+    if (_matches(TokenType.SEMICOLON) || _matches(TokenType.CLOSE_PAREN)) {
+      _reportErrorForToken(
+          ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _currentToken);
+      return new ThrowExpression(keyword, _createSyntheticIdentifier());
+    }
+    Expression expression = parseExpressionWithoutCascade();
+    return new ThrowExpression(keyword, expression);
+  }
+
+  /**
+   * Parse a try statement. Return the try statement that was parsed.
+   *
+   *     tryStatement ::=
+   *         'try' block (onPart+ finallyPart? | finallyPart)
+   *
+   *     onPart ::=
+   *         catchPart block
+   *       | 'on' type catchPart? block
+   *
+   *     catchPart ::=
+   *         'catch' '(' identifier (',' identifier)? ')'
+   *
+   *     finallyPart ::=
+   *         'finally' block
+   */
+  Statement _parseTryStatement() {
+    Token tryKeyword = _expectKeyword(Keyword.TRY);
+    Block body = parseBlock();
+    List<CatchClause> catchClauses = new List<CatchClause>();
+    Block finallyClause = null;
+    while (_matchesString(_ON) || _matchesKeyword(Keyword.CATCH)) {
+      Token onKeyword = null;
+      TypeName exceptionType = null;
+      if (_matchesString(_ON)) {
+        onKeyword = getAndAdvance();
+        exceptionType = parseTypeName();
+      }
+      Token catchKeyword = null;
+      Token leftParenthesis = null;
+      SimpleIdentifier exceptionParameter = null;
+      Token comma = null;
+      SimpleIdentifier stackTraceParameter = null;
+      Token rightParenthesis = null;
+      if (_matchesKeyword(Keyword.CATCH)) {
+        catchKeyword = getAndAdvance();
+        leftParenthesis = _expect(TokenType.OPEN_PAREN);
+        exceptionParameter = parseSimpleIdentifier();
+        if (_matches(TokenType.COMMA)) {
+          comma = getAndAdvance();
+          stackTraceParameter = parseSimpleIdentifier();
+        }
+        rightParenthesis = _expect(TokenType.CLOSE_PAREN);
+      }
+      Block catchBody = parseBlock();
+      catchClauses.add(new CatchClause(onKeyword, exceptionType, catchKeyword,
+          leftParenthesis, exceptionParameter, comma, stackTraceParameter,
+          rightParenthesis, catchBody));
+    }
+    Token finallyKeyword = null;
+    if (_matchesKeyword(Keyword.FINALLY)) {
+      finallyKeyword = getAndAdvance();
+      finallyClause = parseBlock();
+    } else {
+      if (catchClauses.isEmpty) {
+        _reportErrorForCurrentToken(ParserErrorCode.MISSING_CATCH_OR_FINALLY);
+      }
+    }
+    return new TryStatement(
+        tryKeyword, body, catchClauses, finallyKeyword, finallyClause);
+  }
+
+  /**
+   * Parse a type alias. The [commentAndMetadata] is the metadata to be
+   * associated with the member. Return the type alias that was parsed.
+   *
+   *     typeAlias ::=
+   *         'typedef' typeAliasBody
+   *
+   *     typeAliasBody ::=
+   *         classTypeAlias
+   *       | functionTypeAlias
+   *
+   *     classTypeAlias ::=
+   *         identifier typeParameters? '=' 'abstract'? mixinApplication
+   *
+   *     mixinApplication ::=
+   *         qualified withClause implementsClause? ';'
+   *
+   *     functionTypeAlias ::=
+   *         functionPrefix typeParameterList? formalParameterList ';'
+   *
+   *     functionPrefix ::=
+   *         returnType? name
+   */
+  TypeAlias _parseTypeAlias(CommentAndMetadata commentAndMetadata) {
+    Token keyword = _expectKeyword(Keyword.TYPEDEF);
+    if (_matchesIdentifier()) {
+      Token next = _peek();
+      if (_tokenMatches(next, TokenType.LT)) {
+        next = _skipTypeParameterList(next);
+        if (next != null && _tokenMatches(next, TokenType.EQ)) {
+          TypeAlias typeAlias =
+              _parseClassTypeAlias(commentAndMetadata, null, keyword);
+          _reportErrorForToken(
+              ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, keyword);
+          return typeAlias;
+        }
+      } else if (_tokenMatches(next, TokenType.EQ)) {
+        TypeAlias typeAlias =
+            _parseClassTypeAlias(commentAndMetadata, null, keyword);
+        _reportErrorForToken(
+            ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, keyword);
+        return typeAlias;
+      }
+    }
+    return _parseFunctionTypeAlias(commentAndMetadata, keyword);
+  }
+
+  /**
+   * Parse a unary expression. Return the unary expression that was parsed.
+   *
+   *     unaryExpression ::=
+   *         prefixOperator unaryExpression
+   *       | awaitExpression
+   *       | postfixExpression
+   *       | unaryOperator 'super'
+   *       | '-' 'super'
+   *       | incrementOperator assignableExpression
+   */
+  Expression _parseUnaryExpression() {
+    if (_matches(TokenType.MINUS) ||
+        _matches(TokenType.BANG) ||
+        _matches(TokenType.TILDE)) {
+      Token operator = getAndAdvance();
+      if (_matchesKeyword(Keyword.SUPER)) {
+        if (_tokenMatches(_peek(), TokenType.OPEN_SQUARE_BRACKET) ||
+            _tokenMatches(_peek(), TokenType.PERIOD)) {
+          //     "prefixOperator unaryExpression"
+          // --> "prefixOperator postfixExpression"
+          // --> "prefixOperator primary                    selector*"
+          // --> "prefixOperator 'super' assignableSelector selector*"
+          return new PrefixExpression(operator, _parseUnaryExpression());
+        }
+        return new PrefixExpression(
+            operator, new SuperExpression(getAndAdvance()));
+      }
+      return new PrefixExpression(operator, _parseUnaryExpression());
+    } else if (_currentToken.type.isIncrementOperator) {
+      Token operator = getAndAdvance();
+      if (_matchesKeyword(Keyword.SUPER)) {
+        if (_tokenMatches(_peek(), TokenType.OPEN_SQUARE_BRACKET) ||
+            _tokenMatches(_peek(), TokenType.PERIOD)) {
+          // --> "prefixOperator 'super' assignableSelector selector*"
+          return new PrefixExpression(operator, _parseUnaryExpression());
+        }
+        //
+        // Even though it is not valid to use an incrementing operator
+        // ('++' or '--') before 'super', we can (and therefore must) interpret
+        // "--super" as semantically equivalent to "-(-super)". Unfortunately,
+        // we cannot do the same for "++super" because "+super" is also not
+        // valid.
+        //
+        if (operator.type == TokenType.MINUS_MINUS) {
+          Token firstOperator = _createToken(operator, TokenType.MINUS);
+          Token secondOperator =
+              new Token(TokenType.MINUS, operator.offset + 1);
+          secondOperator.setNext(_currentToken);
+          firstOperator.setNext(secondOperator);
+          operator.previous.setNext(firstOperator);
+          return new PrefixExpression(firstOperator, new PrefixExpression(
+              secondOperator, new SuperExpression(getAndAdvance())));
+        } else {
+          // Invalid operator before 'super'
+          _reportErrorForCurrentToken(
+              ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, [operator.lexeme]);
+          return new PrefixExpression(
+              operator, new SuperExpression(getAndAdvance()));
+        }
+      }
+      return new PrefixExpression(operator, _parseAssignableExpression(false));
+    } else if (_matches(TokenType.PLUS)) {
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
+      return _createSyntheticIdentifier();
+    } else if (_inAsync && _matchesString(_AWAIT)) {
+      return _parseAwaitExpression();
+    }
+    return _parsePostfixExpression();
+  }
+
+  /**
+   * Parse a string literal representing a URI. Return the string literal that
+   * was parsed.
+   */
+  StringLiteral _parseUri() {
+    bool iskeywordAfterUri(Token token) => token.lexeme == Keyword.AS.syntax ||
+        token.lexeme == _HIDE ||
+        token.lexeme == _SHOW;
+    if (!_matches(TokenType.STRING) &&
+        !_matches(TokenType.SEMICOLON) &&
+        !iskeywordAfterUri(_currentToken)) {
+      // Attempt to recover in the case where the URI was not enclosed in
+      // quotes.
+      Token token = _currentToken;
+      while ((_tokenMatchesIdentifier(token) && !iskeywordAfterUri(token)) ||
+          _tokenMatches(token, TokenType.COLON) ||
+          _tokenMatches(token, TokenType.SLASH) ||
+          _tokenMatches(token, TokenType.PERIOD) ||
+          _tokenMatches(token, TokenType.PERIOD_PERIOD) ||
+          _tokenMatches(token, TokenType.PERIOD_PERIOD_PERIOD) ||
+          _tokenMatches(token, TokenType.INT) ||
+          _tokenMatches(token, TokenType.DOUBLE)) {
+        token = token.next;
+      }
+      if (_tokenMatches(token, TokenType.SEMICOLON) ||
+          iskeywordAfterUri(token)) {
+        Token endToken = token.previous;
+        token = _currentToken;
+        int endOffset = token.end;
+        StringBuffer buffer = new StringBuffer();
+        buffer.write(token.lexeme);
+        while (token != endToken) {
+          token = token.next;
+          if (token.offset != endOffset || token.precedingComments != null) {
+            return parseStringLiteral();
+          }
+          buffer.write(token.lexeme);
+          endOffset = token.end;
+        }
+        String value = buffer.toString();
+        Token newToken =
+            new StringToken(TokenType.STRING, "'$value'", _currentToken.offset);
+        _reportErrorForToken(
+            ParserErrorCode.NON_STRING_LITERAL_AS_URI, newToken);
+        _currentToken = endToken.next;
+        return new SimpleStringLiteral(newToken, value);
+      }
+    }
+    return parseStringLiteral();
+  }
+
+  /**
+   * Parse a variable declaration. Return the variable declaration that was
+   * parsed.
+   *
+   *     variableDeclaration ::=
+   *         identifier ('=' expression)?
+   */
+  VariableDeclaration _parseVariableDeclaration() {
+    // TODO(paulberry): prior to the fix for bug 23204, we permitted
+    // annotations before variable declarations (e.g. "String @deprecated s;").
+    // Although such constructions are prohibited by the spec, we may want to
+    // consider handling them anyway to allow for better parser recovery in the
+    // event that the user erroneously tries to use them.  However, as a
+    // counterargument, this would likely degrade parser recovery in the event
+    // of a construct like "class C { int @deprecated foo() {} }" (i.e. the
+    // user is in the middle of inserting "int bar;" prior to
+    // "@deprecated foo() {}").
+    SimpleIdentifier name = parseSimpleIdentifier();
+    Token equals = null;
+    Expression initializer = null;
+    if (_matches(TokenType.EQ)) {
+      equals = getAndAdvance();
+      initializer = parseExpression2();
+    }
+    return new VariableDeclaration(name, equals, initializer);
+  }
+
+  /**
+   * Parse a variable declaration list. The [commentAndMetadata] is the metadata
+   * to be associated with the variable declaration list. Return the variable
+   * declaration list that was parsed.
+   *
+   *     variableDeclarationList ::=
+   *         finalConstVarOrType variableDeclaration (',' variableDeclaration)*
+   */
+  VariableDeclarationList _parseVariableDeclarationListAfterMetadata(
+      CommentAndMetadata commentAndMetadata) {
+    FinalConstVarOrType holder = _parseFinalConstVarOrType(false);
+    return _parseVariableDeclarationListAfterType(
+        commentAndMetadata, holder.keyword, holder.type);
+  }
+
+  /**
+   * Parse a variable declaration list. The [commentAndMetadata] is the metadata
+   * to be associated with the variable declaration list, or `null` if there is
+   * no attempt at parsing the comment and metadata. The [keyword] is the token
+   * representing the 'final', 'const' or 'var' keyword, or `null` if there is
+   * no keyword. The [type] is the type of the variables in the list. Return the
+   * variable declaration list that was parsed.
+   *
+   *     variableDeclarationList ::=
+   *         finalConstVarOrType variableDeclaration (',' variableDeclaration)*
+   */
+  VariableDeclarationList _parseVariableDeclarationListAfterType(
+      CommentAndMetadata commentAndMetadata, Token keyword, TypeName type) {
+    if (type != null &&
+        keyword != null &&
+        _tokenMatchesKeyword(keyword, Keyword.VAR)) {
+      _reportErrorForToken(ParserErrorCode.VAR_AND_TYPE, keyword);
+    }
+    List<VariableDeclaration> variables = new List<VariableDeclaration>();
+    variables.add(_parseVariableDeclaration());
+    while (_matches(TokenType.COMMA)) {
+      _advance();
+      variables.add(_parseVariableDeclaration());
+    }
+    return new VariableDeclarationList(
+        commentAndMetadata != null ? commentAndMetadata.comment : null,
+        commentAndMetadata != null ? commentAndMetadata.metadata : null,
+        keyword, type, variables);
+  }
+
+  /**
+   * Parse a variable declaration statement. The [commentAndMetadata] is the
+   * metadata to be associated with the variable declaration statement, or
+   * `null` if there is no attempt at parsing the comment and metadata. Return
+   * the variable declaration statement that was parsed.
+   *
+   *     variableDeclarationStatement ::=
+   *         variableDeclarationList ';'
+   */
+  VariableDeclarationStatement _parseVariableDeclarationStatementAfterMetadata(
+      CommentAndMetadata commentAndMetadata) {
+    //    Token startToken = currentToken;
+    VariableDeclarationList variableList =
+        _parseVariableDeclarationListAfterMetadata(commentAndMetadata);
+//        if (!matches(TokenType.SEMICOLON)) {
+//          if (matches(startToken, Keyword.VAR) && isTypedIdentifier(startToken.getNext())) {
+//            // TODO(brianwilkerson) This appears to be of the form "var type variable". We should do
+//            // a better job of recovering in this case.
+//          }
+//        }
+    Token semicolon = _expect(TokenType.SEMICOLON);
+    return new VariableDeclarationStatement(variableList, semicolon);
+  }
+
+  /**
+   * Parse a variable declaration statement. The [commentAndMetadata] is the
+   * metadata to be associated with the variable declaration statement, or
+   * `null` if there is no attempt at parsing the comment and metadata. The
+   * [keyword] is the token representing the 'final', 'const' or 'var' keyword,
+   * or `null` if there is no keyword. The [type] is the type of the variables
+   * in the list. Return the variable declaration statement that was parsed.
+   *
+   *     variableDeclarationStatement ::=
+   *         variableDeclarationList ';'
+   */
+  VariableDeclarationStatement _parseVariableDeclarationStatementAfterType(
+      CommentAndMetadata commentAndMetadata, Token keyword, TypeName type) {
+    VariableDeclarationList variableList =
+        _parseVariableDeclarationListAfterType(
+            commentAndMetadata, keyword, type);
+    Token semicolon = _expect(TokenType.SEMICOLON);
+    return new VariableDeclarationStatement(variableList, semicolon);
+  }
+
+  /**
+   * Parse a while statement. Return the while statement that was parsed.
+   *
+   *     whileStatement ::=
+   *         'while' '(' expression ')' statement
+   */
+  Statement _parseWhileStatement() {
+    bool wasInLoop = _inLoop;
+    _inLoop = true;
+    try {
+      Token keyword = _expectKeyword(Keyword.WHILE);
+      Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
+      Expression condition = parseExpression2();
+      Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
+      Statement body = parseStatement2();
+      return new WhileStatement(
+          keyword, leftParenthesis, condition, rightParenthesis, body);
+    } finally {
+      _inLoop = wasInLoop;
+    }
+  }
+
+  /**
+   * Parse a yield statement. Return the yield statement that was parsed.
+   *
+   *     yieldStatement ::=
+   *         'yield' '*'? expression ';'
+   */
+  YieldStatement _parseYieldStatement() {
+    Token yieldToken = getAndAdvance();
+    Token star = null;
+    if (_matches(TokenType.STAR)) {
+      star = getAndAdvance();
+    }
+    Expression expression = parseExpression2();
+    Token semicolon = _expect(TokenType.SEMICOLON);
+    return new YieldStatement(yieldToken, star, expression, semicolon);
+  }
+
+  /**
+   * Return the token that is immediately after the current token. This is
+   * equivalent to [_peekAt](1).
+   */
+  Token _peek() => _currentToken.next;
+
+  /**
+   * Return the token that is the given [distance] after the current token,
+   * where the distance is the number of tokens to look ahead. A distance of `0`
+   * is the current token, `1` is the next token, etc.
+   */
+  Token _peekAt(int distance) {
+    Token token = _currentToken;
+    for (int i = 0; i < distance; i++) {
+      token = token.next;
+    }
+    return token;
+  }
+
+  /**
+   * Report the given [error].
+   */
+  void _reportError(AnalysisError error) {
+    if (_errorListenerLock != 0) {
+      return;
+    }
+    _errorListener.onError(error);
+  }
+
+  /**
+   * Report an error with the given [errorCode] and [arguments] associated with
+   * the current token.
+   */
+  void _reportErrorForCurrentToken(ParserErrorCode errorCode,
+      [List<Object> arguments]) {
+    _reportErrorForToken(errorCode, _currentToken, arguments);
+  }
+
+  /**
+   * Report an error with the given [errorCode] and [arguments] associated with
+   * the given [node].
+   */
+  void _reportErrorForNode(ParserErrorCode errorCode, AstNode node,
+      [List<Object> arguments]) {
+    _reportError(new AnalysisError(
+        _source, node.offset, node.length, errorCode, arguments));
+  }
+
+  /**
+   * Report an error with the given [errorCode] and [arguments] associated with
+   * the given [token].
+   */
+  void _reportErrorForToken(ErrorCode errorCode, Token token,
+      [List<Object> arguments]) {
+    if (token.type == TokenType.EOF) {
+      token = token.previous;
+    }
+    _reportError(new AnalysisError(_source, token.offset,
+        math.max(token.length, 1), errorCode, arguments));
+  }
+
+  /**
+   * Skips a block with all containing blocks.
+   */
+  void _skipBlock() {
+    Token endToken = (_currentToken as BeginToken).endToken;
+    if (endToken == null) {
+      endToken = _currentToken.next;
+      while (!identical(endToken, _currentToken)) {
+        _currentToken = endToken;
+        endToken = _currentToken.next;
+      }
+      _reportErrorForToken(
+          ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, ["}"]);
+    } else {
+      _currentToken = endToken.next;
+    }
+  }
+
+  /**
+   * Parse the 'final', 'const', 'var' or type preceding a variable declaration,
+   * starting at the given token, without actually creating a type or changing
+   * the current token. Return the token following the type that was parsed, or
+   * `null` if the given token is not the first token in a valid type. The
+   * [startToken] is the token at which parsing is to begin. Return the token
+   * following the type that was parsed.
+   *
+   * finalConstVarOrType ::=
+   *   | 'final' type?
+   *   | 'const' type?
+   *   | 'var'
+   *   | type
+   */
+  Token _skipFinalConstVarOrType(Token startToken) {
+    if (_tokenMatchesKeyword(startToken, Keyword.FINAL) ||
+        _tokenMatchesKeyword(startToken, Keyword.CONST)) {
+      Token next = startToken.next;
+      if (_tokenMatchesIdentifier(next)) {
+        Token next2 = next.next;
+        // "Type parameter" or "Type<" or "prefix.Type"
+        if (_tokenMatchesIdentifier(next2) ||
+            _tokenMatches(next2, TokenType.LT) ||
+            _tokenMatches(next2, TokenType.PERIOD)) {
+          return _skipTypeName(next);
+        }
+        // "parameter"
+        return next;
+      }
+    } else if (_tokenMatchesKeyword(startToken, Keyword.VAR)) {
+      return startToken.next;
+    } else if (_tokenMatchesIdentifier(startToken)) {
+      Token next = startToken.next;
+      if (_tokenMatchesIdentifier(next) ||
+          _tokenMatches(next, TokenType.LT) ||
+          _tokenMatchesKeyword(next, Keyword.THIS) ||
+          (_tokenMatches(next, TokenType.PERIOD) &&
+              _tokenMatchesIdentifier(next.next) &&
+              (_tokenMatchesIdentifier(next.next.next) ||
+                  _tokenMatches(next.next.next, TokenType.LT) ||
+                  _tokenMatchesKeyword(next.next.next, Keyword.THIS)))) {
+        return _skipReturnType(startToken);
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Parse a list of formal parameters, starting at the [startToken], without
+   * actually creating a formal parameter list or changing the current token.
+   * Return the token following the formal parameter list that was parsed, or
+   * `null` if the given token is not the first token in a valid list of formal
+   * parameter.
+   *
+   * Note that unlike other skip methods, this method uses a heuristic. In the
+   * worst case, the parameters could be prefixed by metadata, which would
+   * require us to be able to skip arbitrary expressions. Rather than duplicate
+   * the logic of most of the parse methods we simply look for something that is
+   * likely to be a list of parameters and then skip to returning the token
+   * after the closing parenthesis.
+   *
+   * This method must be kept in sync with [parseFormalParameterList].
+   *
+   *     formalParameterList ::=
+   *         '(' ')'
+   *       | '(' normalFormalParameters (',' optionalFormalParameters)? ')'
+   *       | '(' optionalFormalParameters ')'
+   *
+   *     normalFormalParameters ::=
+   *         normalFormalParameter (',' normalFormalParameter)*
+   *
+   *     optionalFormalParameters ::=
+   *         optionalPositionalFormalParameters
+   *       | namedFormalParameters
+   *
+   *     optionalPositionalFormalParameters ::=
+   *         '[' defaultFormalParameter (',' defaultFormalParameter)* ']'
+   *
+   *     namedFormalParameters ::=
+   *         '{' defaultNamedParameter (',' defaultNamedParameter)* '}'
+   */
+  Token _skipFormalParameterList(Token startToken) {
+    if (!_tokenMatches(startToken, TokenType.OPEN_PAREN)) {
+      return null;
+    }
+    Token next = startToken.next;
+    if (_tokenMatches(next, TokenType.CLOSE_PAREN)) {
+      return next.next;
+    }
+    //
+    // Look to see whether the token after the open parenthesis is something
+    // that should only occur at the beginning of a parameter list.
+    //
+    if (next.matchesAny([
+      TokenType.AT,
+      TokenType.OPEN_SQUARE_BRACKET,
+      TokenType.OPEN_CURLY_BRACKET
+    ]) ||
+        _tokenMatchesKeyword(next, Keyword.VOID) ||
+        (_tokenMatchesIdentifier(next) &&
+            (next.next.matchesAny([TokenType.COMMA, TokenType.CLOSE_PAREN])))) {
+      return _skipPastMatchingToken(startToken);
+    }
+    //
+    // Look to see whether the first parameter is a function typed parameter
+    // without a return type.
+    //
+    if (_tokenMatchesIdentifier(next) &&
+        _tokenMatches(next.next, TokenType.OPEN_PAREN)) {
+      Token afterParameters = _skipFormalParameterList(next.next);
+      if (afterParameters != null &&
+          (afterParameters
+              .matchesAny([TokenType.COMMA, TokenType.CLOSE_PAREN]))) {
+        return _skipPastMatchingToken(startToken);
+      }
+    }
+    //
+    // Look to see whether the first parameter has a type or is a function typed
+    // parameter with a return type.
+    //
+    Token afterType = _skipFinalConstVarOrType(next);
+    if (afterType == null) {
+      return null;
+    }
+    if (_skipSimpleIdentifier(afterType) == null) {
+      return null;
+    }
+    return _skipPastMatchingToken(startToken);
+  }
+
+  /**
+   * If the [startToken] is a begin token with an associated end token, then
+   * return the token following the end token. Otherwise, return `null`.
+   */
+  Token _skipPastMatchingToken(Token startToken) {
+    if (startToken is! BeginToken) {
+      return null;
+    }
+    Token closeParen = (startToken as BeginToken).endToken;
+    if (closeParen == null) {
+      return null;
+    }
+    return closeParen.next;
+  }
+
+  /**
+   * Parse a prefixed identifier, starting at the [startToken], without actually
+   * creating a prefixed identifier or changing the current token. Return the
+   * token following the prefixed identifier that was parsed, or `null` if the
+   * given token is not the first token in a valid prefixed identifier.
+   *
+   * This method must be kept in sync with [parsePrefixedIdentifier].
+   *
+   *     prefixedIdentifier ::=
+   *         identifier ('.' identifier)?
+   */
+  Token _skipPrefixedIdentifier(Token startToken) {
+    Token token = _skipSimpleIdentifier(startToken);
+    if (token == null) {
+      return null;
+    } else if (!_tokenMatches(token, TokenType.PERIOD)) {
+      return token;
+    }
+    token = token.next;
+    Token nextToken = _skipSimpleIdentifier(token);
+    if (nextToken != null) {
+      return nextToken;
+    } else if (_tokenMatches(token, TokenType.CLOSE_PAREN) ||
+        _tokenMatches(token, TokenType.COMMA)) {
+      // If the `id.` is followed by something that cannot produce a valid
+      // structure then assume this is a prefixed identifier but missing the
+      // trailing identifier
+      return token;
+    }
+    return null;
+  }
+
+  /**
+   * Parse a return type, starting at the [startToken], without actually
+   * creating a return type or changing the current token. Return the token
+   * following the return type that was parsed, or `null` if the given token is
+   * not the first token in a valid return type.
+   *
+   * This method must be kept in sync with [parseReturnType].
+   *
+   *     returnType ::=
+   *         'void'
+   *       | type
+   */
+  Token _skipReturnType(Token startToken) {
+    if (_tokenMatchesKeyword(startToken, Keyword.VOID)) {
+      return startToken.next;
+    } else {
+      return _skipTypeName(startToken);
+    }
+  }
+
+  /**
+   * Parse a simple identifier, starting at the [startToken], without actually
+   * creating a simple identifier or changing the current token. Return the
+   * token following the simple identifier that was parsed, or `null` if the
+   * given token is not the first token in a valid simple identifier.
+   *
+   * This method must be kept in sync with [parseSimpleIdentifier].
+   *
+   *     identifier ::=
+   *         IDENTIFIER
+   */
+  Token _skipSimpleIdentifier(Token startToken) {
+    if (_tokenMatches(startToken, TokenType.IDENTIFIER) ||
+        (_tokenMatches(startToken, TokenType.KEYWORD) &&
+            (startToken as KeywordToken).keyword.isPseudoKeyword)) {
+      return startToken.next;
+    }
+    return null;
+  }
+
+  /**
+   * Parse a string literal that contains interpolations, starting at the
+   * [startToken], without actually creating a string literal or changing the
+   * current token. Return the token following the string literal that was
+   * parsed, or `null` if the given token is not the first token in a valid
+   * string literal.
+   *
+   * This method must be kept in sync with [parseStringInterpolation].
+   */
+  Token _skipStringInterpolation(Token startToken) {
+    Token token = startToken;
+    TokenType type = token.type;
+    while (type == TokenType.STRING_INTERPOLATION_EXPRESSION ||
+        type == TokenType.STRING_INTERPOLATION_IDENTIFIER) {
+      if (type == TokenType.STRING_INTERPOLATION_EXPRESSION) {
+        token = token.next;
+        type = token.type;
+        //
+        // Rather than verify that the following tokens represent a valid
+        // expression, we simply skip tokens until we reach the end of the
+        // interpolation, being careful to handle nested string literals.
+        //
+        int bracketNestingLevel = 1;
+        while (bracketNestingLevel > 0) {
+          if (type == TokenType.EOF) {
+            return null;
+          } else if (type == TokenType.OPEN_CURLY_BRACKET) {
+            bracketNestingLevel++;
+          } else if (type == TokenType.CLOSE_CURLY_BRACKET) {
+            bracketNestingLevel--;
+          } else if (type == TokenType.STRING) {
+            token = _skipStringLiteral(token);
+            if (token == null) {
+              return null;
+            }
+          } else {
+            token = token.next;
+          }
+          type = token.type;
+        }
+        token = token.next;
+        type = token.type;
+      } else {
+        token = token.next;
+        if (token.type != TokenType.IDENTIFIER) {
+          return null;
+        }
+        token = token.next;
+      }
+      type = token.type;
+      if (type == TokenType.STRING) {
+        token = token.next;
+        type = token.type;
+      }
+    }
+    return token;
+  }
+
+  /**
+   * Parse a string literal, starting at the [startToken], without actually
+   * creating a string literal or changing the current token. Return the token
+   * following the string literal that was parsed, or `null` if the given token
+   * is not the first token in a valid string literal.
+   *
+   * This method must be kept in sync with [parseStringLiteral].
+   *
+   *     stringLiteral ::=
+   *         MULTI_LINE_STRING+
+   *       | SINGLE_LINE_STRING+
+   */
+  Token _skipStringLiteral(Token startToken) {
+    Token token = startToken;
+    while (token != null && _tokenMatches(token, TokenType.STRING)) {
+      token = token.next;
+      TokenType type = token.type;
+      if (type == TokenType.STRING_INTERPOLATION_EXPRESSION ||
+          type == TokenType.STRING_INTERPOLATION_IDENTIFIER) {
+        token = _skipStringInterpolation(token);
+      }
+    }
+    if (identical(token, startToken)) {
+      return null;
+    }
+    return token;
+  }
+
+  /**
+   * Parse a list of type arguments, starting at the [startToken], without
+   * actually creating a type argument list or changing the current token.
+   * Return the token following the type argument list that was parsed, or
+   * `null` if the given token is not the first token in a valid type argument
+   * list.
+   *
+   * This method must be kept in sync with [parseTypeArgumentList].
+   *
+   *     typeArguments ::=
+   *         '<' typeList '>'
+   *
+   *     typeList ::=
+   *         type (',' type)*
+   */
+  Token _skipTypeArgumentList(Token startToken) {
+    Token token = startToken;
+    if (!_tokenMatches(token, TokenType.LT)) {
+      return null;
+    }
+    token = _skipTypeName(token.next);
+    if (token == null) {
+      // If the start token '<' is followed by '>'
+      // then assume this should be type argument list but is missing a type
+      token = startToken.next;
+      if (_tokenMatches(token, TokenType.GT)) {
+        return token.next;
+      }
+      return null;
+    }
+    while (_tokenMatches(token, TokenType.COMMA)) {
+      token = _skipTypeName(token.next);
+      if (token == null) {
+        return null;
+      }
+    }
+    if (token.type == TokenType.GT) {
+      return token.next;
+    } else if (token.type == TokenType.GT_GT) {
+      Token second = new Token(TokenType.GT, token.offset + 1);
+      second.setNextWithoutSettingPrevious(token.next);
+      return second;
+    }
+    return null;
+  }
+
+  /**
+   * Parse a type name, starting at the [startToken], without actually creating
+   * a type name or changing the current token. Return the token following the
+   * type name that was parsed, or `null` if the given token is not the first
+   * token in a valid type name.
+   *
+   * This method must be kept in sync with [parseTypeName].
+   *
+   *     type ::=
+   *         qualified typeArguments?
+   */
+  Token _skipTypeName(Token startToken) {
+    Token token = _skipPrefixedIdentifier(startToken);
+    if (token == null) {
+      return null;
+    }
+    if (_tokenMatches(token, TokenType.LT)) {
+      token = _skipTypeArgumentList(token);
+    }
+    return token;
+  }
+
+  /**
+   * Parse a list of type parameters, starting at the [startToken], without
+   * actually creating a type parameter list or changing the current token.
+   * Return the token following the type parameter list that was parsed, or
+   * `null` if the given token is not the first token in a valid type parameter
+   * list.
+   *
+   * This method must be kept in sync with [parseTypeParameterList].
+   *
+   *     typeParameterList ::=
+   *         '<' typeParameter (',' typeParameter)* '>'
+   */
+  Token _skipTypeParameterList(Token startToken) {
+    if (!_tokenMatches(startToken, TokenType.LT)) {
+      return null;
+    }
+    //
+    // We can't skip a type parameter because it can be preceeded by metadata,
+    // so we just assume that everything before the matching end token is valid.
+    //
+    int depth = 1;
+    Token next = startToken.next;
+    while (depth > 0) {
+      if (_tokenMatches(next, TokenType.EOF)) {
+        return null;
+      } else if (_tokenMatches(next, TokenType.LT)) {
+        depth++;
+      } else if (_tokenMatches(next, TokenType.GT)) {
+        depth--;
+      } else if (_tokenMatches(next, TokenType.GT_EQ)) {
+        if (depth == 1) {
+          Token fakeEquals = new Token(TokenType.EQ, next.offset + 2);
+          fakeEquals.setNextWithoutSettingPrevious(next.next);
+          return fakeEquals;
+        }
+        depth--;
+      } else if (_tokenMatches(next, TokenType.GT_GT)) {
+        depth -= 2;
+      } else if (_tokenMatches(next, TokenType.GT_GT_EQ)) {
+        if (depth < 2) {
+          return null;
+        } else if (depth == 2) {
+          Token fakeEquals = new Token(TokenType.EQ, next.offset + 2);
+          fakeEquals.setNextWithoutSettingPrevious(next.next);
+          return fakeEquals;
+        }
+        depth -= 2;
+      }
+      next = next.next;
+    }
+    return next;
+  }
+
+  /**
+   * Return `true` if the given [token] has the given [type].
+   */
+  bool _tokenMatches(Token token, TokenType type) => token.type == type;
+
+  /**
+   * Return `true` if the given [token] is a valid identifier. Valid identifiers
+   * include built-in identifiers (pseudo-keywords).
+   */
+  bool _tokenMatchesIdentifier(Token token) =>
+      _tokenMatches(token, TokenType.IDENTIFIER) ||
+          (_tokenMatches(token, TokenType.KEYWORD) &&
+              (token as KeywordToken).keyword.isPseudoKeyword);
+
+  /**
+   * Return `true` if the given [token] matches the given [keyword].
+   */
+  bool _tokenMatchesKeyword(Token token, Keyword keyword) =>
+      token.type == TokenType.KEYWORD &&
+          (token as KeywordToken).keyword == keyword;
+
+  /**
+   * Return `true` if the given [token] matches the given [identifier].
+   */
+  bool _tokenMatchesString(Token token, String identifier) =>
+      token.type == TokenType.IDENTIFIER && token.lexeme == identifier;
+
+  /**
+   * Translate the characters at the given [index] in the given [lexeme],
+   * appending the translated character to the given [buffer]. The index is
+   * assumed to be valid.
+   */
+  int _translateCharacter(StringBuffer buffer, String lexeme, int index) {
+    int currentChar = lexeme.codeUnitAt(index);
+    if (currentChar != 0x5C) {
+      buffer.writeCharCode(currentChar);
+      return index + 1;
+    }
+    //
+    // We have found an escape sequence, so we parse the string to determine
+    // what kind of escape sequence and what character to add to the builder.
+    //
+    int length = lexeme.length;
+    int currentIndex = index + 1;
+    if (currentIndex >= length) {
+      // Illegal escape sequence: no char after escape.
+      // This cannot actually happen because it would require the escape
+      // character to be the last character in the string, but if it were it
+      // would escape the closing quote, leaving the string unclosed.
+      // reportError(ParserErrorCode.MISSING_CHAR_IN_ESCAPE_SEQUENCE);
+      return length;
+    }
+    currentChar = lexeme.codeUnitAt(currentIndex);
+    if (currentChar == 0x6E) {
+      buffer.writeCharCode(0xA);
+      // newline
+    } else if (currentChar == 0x72) {
+      buffer.writeCharCode(0xD);
+      // carriage return
+    } else if (currentChar == 0x66) {
+      buffer.writeCharCode(0xC);
+      // form feed
+    } else if (currentChar == 0x62) {
+      buffer.writeCharCode(0x8);
+      // backspace
+    } else if (currentChar == 0x74) {
+      buffer.writeCharCode(0x9);
+      // tab
+    } else if (currentChar == 0x76) {
+      buffer.writeCharCode(0xB);
+      // vertical tab
+    } else if (currentChar == 0x78) {
+      if (currentIndex + 2 >= length) {
+        // Illegal escape sequence: not enough hex digits
+        _reportErrorForCurrentToken(ParserErrorCode.INVALID_HEX_ESCAPE);
+        return length;
+      }
+      int firstDigit = lexeme.codeUnitAt(currentIndex + 1);
+      int secondDigit = lexeme.codeUnitAt(currentIndex + 2);
+      if (!_isHexDigit(firstDigit) || !_isHexDigit(secondDigit)) {
+        // Illegal escape sequence: invalid hex digit
+        _reportErrorForCurrentToken(ParserErrorCode.INVALID_HEX_ESCAPE);
+      } else {
+        int charCode = (Character.digit(firstDigit, 16) << 4) +
+            Character.digit(secondDigit, 16);
+        buffer.writeCharCode(charCode);
+      }
+      return currentIndex + 3;
+    } else if (currentChar == 0x75) {
+      currentIndex++;
+      if (currentIndex >= length) {
+        // Illegal escape sequence: not enough hex digits
+        _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE);
+        return length;
+      }
+      currentChar = lexeme.codeUnitAt(currentIndex);
+      if (currentChar == 0x7B) {
+        currentIndex++;
+        if (currentIndex >= length) {
+          // Illegal escape sequence: incomplete escape
+          _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE);
+          return length;
+        }
+        currentChar = lexeme.codeUnitAt(currentIndex);
+        int digitCount = 0;
+        int value = 0;
+        while (currentChar != 0x7D) {
+          if (!_isHexDigit(currentChar)) {
+            // Illegal escape sequence: invalid hex digit
+            _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE);
+            currentIndex++;
+            while (currentIndex < length &&
+                lexeme.codeUnitAt(currentIndex) != 0x7D) {
+              currentIndex++;
+            }
+            return currentIndex + 1;
+          }
+          digitCount++;
+          value = (value << 4) + Character.digit(currentChar, 16);
+          currentIndex++;
+          if (currentIndex >= length) {
+            // Illegal escape sequence: incomplete escape
+            _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE);
+            return length;
+          }
+          currentChar = lexeme.codeUnitAt(currentIndex);
+        }
+        if (digitCount < 1 || digitCount > 6) {
+          // Illegal escape sequence: not enough or too many hex digits
+          _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE);
+        }
+        _appendScalarValue(buffer, lexeme.substring(index, currentIndex + 1),
+            value, index, currentIndex);
+        return currentIndex + 1;
+      } else {
+        if (currentIndex + 3 >= length) {
+          // Illegal escape sequence: not enough hex digits
+          _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE);
+          return length;
+        }
+        int firstDigit = currentChar;
+        int secondDigit = lexeme.codeUnitAt(currentIndex + 1);
+        int thirdDigit = lexeme.codeUnitAt(currentIndex + 2);
+        int fourthDigit = lexeme.codeUnitAt(currentIndex + 3);
+        if (!_isHexDigit(firstDigit) ||
+            !_isHexDigit(secondDigit) ||
+            !_isHexDigit(thirdDigit) ||
+            !_isHexDigit(fourthDigit)) {
+          // Illegal escape sequence: invalid hex digits
+          _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE);
+        } else {
+          _appendScalarValue(
+              buffer,
+              lexeme
+                  .substring(
+                      index,
+                      currentIndex + 1),
+              (((((Character.digit(firstDigit, 16) << 4) +
+                                  Character.digit(secondDigit, 16)) <<
+                              4) +
+                          Character.digit(thirdDigit, 16)) <<
+                      4) +
+                  Character
+                      .digit(fourthDigit, 16),
+              index,
+              currentIndex +
+                  3);
+        }
+        return currentIndex + 4;
+      }
+    } else {
+      buffer.writeCharCode(currentChar);
+    }
+    return currentIndex + 1;
+  }
+
+  /**
+   * Decrements the error reporting lock level. If level is more than `0`, then
+   * [reportError] wont report any error.
+   */
+  void _unlockErrorListener() {
+    if (_errorListenerLock == 0) {
+      throw new IllegalStateException(
+          "Attempt to unlock not locked error listener.");
+    }
+    _errorListenerLock--;
+  }
+
+  /**
+   * Validate that the given [parameterList] does not contain any field
+   * initializers.
+   */
+  void _validateFormalParameterList(FormalParameterList parameterList) {
+    for (FormalParameter parameter in parameterList.parameters) {
+      if (parameter is FieldFormalParameter) {
+        _reportErrorForNode(
+            ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
+            parameter.identifier);
+      }
+    }
+  }
+
+  /**
+   * Validate that the given set of [modifiers] is appropriate for a class and
+   * return the 'abstract' keyword if there is one.
+   */
+  Token _validateModifiersForClass(Modifiers modifiers) {
+    _validateModifiersForTopLevelDeclaration(modifiers);
+    if (modifiers.constKeyword != null) {
+      _reportErrorForToken(ParserErrorCode.CONST_CLASS, modifiers.constKeyword);
+    }
+    if (modifiers.externalKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.EXTERNAL_CLASS, modifiers.externalKeyword);
+    }
+    if (modifiers.finalKeyword != null) {
+      _reportErrorForToken(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword);
+    }
+    if (modifiers.varKeyword != null) {
+      _reportErrorForToken(ParserErrorCode.VAR_CLASS, modifiers.varKeyword);
+    }
+    return modifiers.abstractKeyword;
+  }
+
+  /**
+   * Validate that the given set of [modifiers] is appropriate for a constructor
+   * and return the 'const' keyword if there is one.
+   */
+  Token _validateModifiersForConstructor(Modifiers modifiers) {
+    if (modifiers.abstractKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.ABSTRACT_CLASS_MEMBER, modifiers.abstractKeyword);
+    }
+    if (modifiers.finalKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.FINAL_CONSTRUCTOR, modifiers.finalKeyword);
+    }
+    if (modifiers.staticKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.STATIC_CONSTRUCTOR, modifiers.staticKeyword);
+    }
+    if (modifiers.varKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, modifiers.varKeyword);
+    }
+    Token externalKeyword = modifiers.externalKeyword;
+    Token constKeyword = modifiers.constKeyword;
+    Token factoryKeyword = modifiers.factoryKeyword;
+    if (externalKeyword != null &&
+        constKeyword != null &&
+        constKeyword.offset < externalKeyword.offset) {
+      _reportErrorForToken(
+          ParserErrorCode.EXTERNAL_AFTER_CONST, externalKeyword);
+    }
+    if (externalKeyword != null &&
+        factoryKeyword != null &&
+        factoryKeyword.offset < externalKeyword.offset) {
+      _reportErrorForToken(
+          ParserErrorCode.EXTERNAL_AFTER_FACTORY, externalKeyword);
+    }
+    return constKeyword;
+  }
+
+  /**
+   * Validate that the given set of [modifiers] is appropriate for a class and
+   * return the 'abstract' keyword if there is one.
+   */
+  void _validateModifiersForEnum(Modifiers modifiers) {
+    _validateModifiersForTopLevelDeclaration(modifiers);
+    if (modifiers.abstractKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.ABSTRACT_ENUM, modifiers.abstractKeyword);
+    }
+    if (modifiers.constKeyword != null) {
+      _reportErrorForToken(ParserErrorCode.CONST_ENUM, modifiers.constKeyword);
+    }
+    if (modifiers.externalKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.EXTERNAL_ENUM, modifiers.externalKeyword);
+    }
+    if (modifiers.finalKeyword != null) {
+      _reportErrorForToken(ParserErrorCode.FINAL_ENUM, modifiers.finalKeyword);
+    }
+    if (modifiers.varKeyword != null) {
+      _reportErrorForToken(ParserErrorCode.VAR_ENUM, modifiers.varKeyword);
+    }
+  }
+
+  /**
+   * Validate that the given set of [modifiers] is appropriate for a field and
+   * return the 'final', 'const' or 'var' keyword if there is one.
+   */
+  Token _validateModifiersForField(Modifiers modifiers) {
+    if (modifiers.abstractKeyword != null) {
+      _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER);
+    }
+    if (modifiers.externalKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKeyword);
+    }
+    if (modifiers.factoryKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword);
+    }
+    Token staticKeyword = modifiers.staticKeyword;
+    Token constKeyword = modifiers.constKeyword;
+    Token finalKeyword = modifiers.finalKeyword;
+    Token varKeyword = modifiers.varKeyword;
+    if (constKeyword != null) {
+      if (finalKeyword != null) {
+        _reportErrorForToken(ParserErrorCode.CONST_AND_FINAL, finalKeyword);
+      }
+      if (varKeyword != null) {
+        _reportErrorForToken(ParserErrorCode.CONST_AND_VAR, varKeyword);
+      }
+      if (staticKeyword != null && constKeyword.offset < staticKeyword.offset) {
+        _reportErrorForToken(ParserErrorCode.STATIC_AFTER_CONST, staticKeyword);
+      }
+    } else if (finalKeyword != null) {
+      if (varKeyword != null) {
+        _reportErrorForToken(ParserErrorCode.FINAL_AND_VAR, varKeyword);
+      }
+      if (staticKeyword != null && finalKeyword.offset < staticKeyword.offset) {
+        _reportErrorForToken(ParserErrorCode.STATIC_AFTER_FINAL, staticKeyword);
+      }
+    } else if (varKeyword != null &&
+        staticKeyword != null &&
+        varKeyword.offset < staticKeyword.offset) {
+      _reportErrorForToken(ParserErrorCode.STATIC_AFTER_VAR, staticKeyword);
+    }
+    return Token.lexicallyFirst([constKeyword, finalKeyword, varKeyword]);
+  }
+
+  /**
+   * Validate that the given set of [modifiers] is appropriate for a local
+   * function.
+   */
+  void _validateModifiersForFunctionDeclarationStatement(Modifiers modifiers) {
+    if (modifiers.abstractKeyword != null ||
+        modifiers.constKeyword != null ||
+        modifiers.externalKeyword != null ||
+        modifiers.factoryKeyword != null ||
+        modifiers.finalKeyword != null ||
+        modifiers.staticKeyword != null ||
+        modifiers.varKeyword != null) {
+      _reportErrorForCurrentToken(
+          ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER);
+    }
+  }
+
+  /**
+   * Validate that the given set of [modifiers] is appropriate for a getter,
+   * setter, or method.
+   */
+  void _validateModifiersForGetterOrSetterOrMethod(Modifiers modifiers) {
+    if (modifiers.abstractKeyword != null) {
+      _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER);
+    }
+    if (modifiers.constKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.CONST_METHOD, modifiers.constKeyword);
+    }
+    if (modifiers.factoryKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword);
+    }
+    if (modifiers.finalKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword);
+    }
+    if (modifiers.varKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword);
+    }
+    Token externalKeyword = modifiers.externalKeyword;
+    Token staticKeyword = modifiers.staticKeyword;
+    if (externalKeyword != null &&
+        staticKeyword != null &&
+        staticKeyword.offset < externalKeyword.offset) {
+      _reportErrorForToken(
+          ParserErrorCode.EXTERNAL_AFTER_STATIC, externalKeyword);
+    }
+  }
+
+  /**
+   * Validate that the given set of [modifiers] is appropriate for a getter,
+   * setter, or method.
+   */
+  void _validateModifiersForOperator(Modifiers modifiers) {
+    if (modifiers.abstractKeyword != null) {
+      _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER);
+    }
+    if (modifiers.constKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.CONST_METHOD, modifiers.constKeyword);
+    }
+    if (modifiers.factoryKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.factoryKeyword);
+    }
+    if (modifiers.finalKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword);
+    }
+    if (modifiers.staticKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.STATIC_OPERATOR, modifiers.staticKeyword);
+    }
+    if (modifiers.varKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword);
+    }
+  }
+
+  /**
+   * Validate that the given set of [modifiers] is appropriate for a top-level
+   * declaration.
+   */
+  void _validateModifiersForTopLevelDeclaration(Modifiers modifiers) {
+    if (modifiers.factoryKeyword != null) {
+      _reportErrorForToken(ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION,
+          modifiers.factoryKeyword);
+    }
+    if (modifiers.staticKeyword != null) {
+      _reportErrorForToken(ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION,
+          modifiers.staticKeyword);
+    }
+  }
+
+  /**
+   * Validate that the given set of [modifiers] is appropriate for a top-level
+   * function.
+   */
+  void _validateModifiersForTopLevelFunction(Modifiers modifiers) {
+    _validateModifiersForTopLevelDeclaration(modifiers);
+    if (modifiers.abstractKeyword != null) {
+      _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION);
+    }
+    if (modifiers.constKeyword != null) {
+      _reportErrorForToken(ParserErrorCode.CONST_CLASS, modifiers.constKeyword);
+    }
+    if (modifiers.finalKeyword != null) {
+      _reportErrorForToken(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword);
+    }
+    if (modifiers.varKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword);
+    }
+  }
+
+  /**
+   * Validate that the given set of [modifiers] is appropriate for a field and
+   * return the 'final', 'const' or 'var' keyword if there is one.
+   */
+  Token _validateModifiersForTopLevelVariable(Modifiers modifiers) {
+    _validateModifiersForTopLevelDeclaration(modifiers);
+    if (modifiers.abstractKeyword != null) {
+      _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE);
+    }
+    if (modifiers.externalKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKeyword);
+    }
+    Token constKeyword = modifiers.constKeyword;
+    Token finalKeyword = modifiers.finalKeyword;
+    Token varKeyword = modifiers.varKeyword;
+    if (constKeyword != null) {
+      if (finalKeyword != null) {
+        _reportErrorForToken(ParserErrorCode.CONST_AND_FINAL, finalKeyword);
+      }
+      if (varKeyword != null) {
+        _reportErrorForToken(ParserErrorCode.CONST_AND_VAR, varKeyword);
+      }
+    } else if (finalKeyword != null) {
+      if (varKeyword != null) {
+        _reportErrorForToken(ParserErrorCode.FINAL_AND_VAR, varKeyword);
+      }
+    }
+    return Token.lexicallyFirst([constKeyword, finalKeyword, varKeyword]);
+  }
+
+  /**
+   * Validate that the given set of [modifiers] is appropriate for a class and
+   * return the 'abstract' keyword if there is one.
+   */
+  void _validateModifiersForTypedef(Modifiers modifiers) {
+    _validateModifiersForTopLevelDeclaration(modifiers);
+    if (modifiers.abstractKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.ABSTRACT_TYPEDEF, modifiers.abstractKeyword);
+    }
+    if (modifiers.constKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.CONST_TYPEDEF, modifiers.constKeyword);
+    }
+    if (modifiers.externalKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.EXTERNAL_TYPEDEF, modifiers.externalKeyword);
+    }
+    if (modifiers.finalKeyword != null) {
+      _reportErrorForToken(
+          ParserErrorCode.FINAL_TYPEDEF, modifiers.finalKeyword);
+    }
+    if (modifiers.varKeyword != null) {
+      _reportErrorForToken(ParserErrorCode.VAR_TYPEDEF, modifiers.varKeyword);
+    }
+  }
+}
+/**
+ * A synthetic keyword token.
+ */
+class Parser_SyntheticKeywordToken extends KeywordToken {
+  /**
+   * Initialize a newly created token to represent the given [keyword] at the
+   * given [offset].
+   */
+  Parser_SyntheticKeywordToken(Keyword keyword, int offset)
+      : super(keyword, offset);
+
+  @override
+  int get length => 0;
+
+  @override
+  Token copy() => new Parser_SyntheticKeywordToken(keyword, offset);
+}
+
+/**
+ * The error codes used for errors detected by the parser. The convention for
+ * this class is for the name of the error code to indicate the problem that
+ * caused the error to be generated and for the error message to explain what
+ * is wrong and, when appropriate, how the problem can be corrected.
+ */
+class ParserErrorCode extends ErrorCode {
+  static const ParserErrorCode ABSTRACT_CLASS_MEMBER = const ParserErrorCode(
+      'ABSTRACT_CLASS_MEMBER',
+      "Members of classes cannot be declared to be 'abstract'");
+
+  static const ParserErrorCode ABSTRACT_ENUM = const ParserErrorCode(
+      'ABSTRACT_ENUM', "Enums cannot be declared to be 'abstract'");
+
+  static const ParserErrorCode ABSTRACT_STATIC_METHOD = const ParserErrorCode(
+      'ABSTRACT_STATIC_METHOD',
+      "Static methods cannot be declared to be 'abstract'");
+
+  static const ParserErrorCode ABSTRACT_TOP_LEVEL_FUNCTION =
+      const ParserErrorCode('ABSTRACT_TOP_LEVEL_FUNCTION',
+          "Top-level functions cannot be declared to be 'abstract'");
+
+  static const ParserErrorCode ABSTRACT_TOP_LEVEL_VARIABLE =
+      const ParserErrorCode('ABSTRACT_TOP_LEVEL_VARIABLE',
+          "Top-level variables cannot be declared to be 'abstract'");
+
+  static const ParserErrorCode ABSTRACT_TYPEDEF = const ParserErrorCode(
+      'ABSTRACT_TYPEDEF', "Type aliases cannot be declared to be 'abstract'");
+
+  static const ParserErrorCode ANNOTATION_ON_ENUM_CONSTANT =
+      const ParserErrorCode('ANNOTATION_ON_ENUM_CONSTANT',
+          "Enum constants cannot have annotations");
+
+  static const ParserErrorCode ASSERT_DOES_NOT_TAKE_ASSIGNMENT =
+      const ParserErrorCode('ASSERT_DOES_NOT_TAKE_ASSIGNMENT',
+          "Assert cannot be called on an assignment");
+
+  static const ParserErrorCode ASSERT_DOES_NOT_TAKE_CASCADE =
+      const ParserErrorCode(
+          'ASSERT_DOES_NOT_TAKE_CASCADE', "Assert cannot be called on cascade");
+
+  static const ParserErrorCode ASSERT_DOES_NOT_TAKE_THROW =
+      const ParserErrorCode(
+          'ASSERT_DOES_NOT_TAKE_THROW', "Assert cannot be called on throws");
+
+  static const ParserErrorCode ASSERT_DOES_NOT_TAKE_RETHROW =
+      const ParserErrorCode('ASSERT_DOES_NOT_TAKE_RETHROW',
+          "Assert cannot be called on rethrows");
+
+  /**
+   * 16.32 Identifier Reference: It is a compile-time error if any of the
+   * identifiers async, await, or yield is used as an identifier in a function
+   * body marked with either async, async*, or sync*.
+   */
+  static const ParserErrorCode ASYNC_KEYWORD_USED_AS_IDENTIFIER =
+      const ParserErrorCode('ASYNC_KEYWORD_USED_AS_IDENTIFIER',
+          "The keywords 'async', 'await', and 'yield' may not be used as identifiers in an asynchronous or generator function.");
+
+  static const ParserErrorCode BREAK_OUTSIDE_OF_LOOP = const ParserErrorCode(
+      'BREAK_OUTSIDE_OF_LOOP',
+      "A break statement cannot be used outside of a loop or switch statement");
+
+  static const ParserErrorCode CLASS_IN_CLASS = const ParserErrorCode(
+      'CLASS_IN_CLASS', "Classes cannot be declared inside other classes");
+
+  static const ParserErrorCode COLON_IN_PLACE_OF_IN = const ParserErrorCode(
+      'COLON_IN_PLACE_OF_IN', "For-in loops use 'in' rather than a colon");
+
+  static const ParserErrorCode CONST_AND_FINAL = const ParserErrorCode(
+      'CONST_AND_FINAL',
+      "Members cannot be declared to be both 'const' and 'final'");
+
+  static const ParserErrorCode CONST_AND_VAR = const ParserErrorCode(
+      'CONST_AND_VAR',
+      "Members cannot be declared to be both 'const' and 'var'");
+
+  static const ParserErrorCode CONST_CLASS = const ParserErrorCode(
+      'CONST_CLASS', "Classes cannot be declared to be 'const'");
+
+  static const ParserErrorCode CONST_CONSTRUCTOR_WITH_BODY =
+      const ParserErrorCode('CONST_CONSTRUCTOR_WITH_BODY',
+          "'const' constructors cannot have a body");
+
+  static const ParserErrorCode CONST_ENUM = const ParserErrorCode(
+      'CONST_ENUM', "Enums cannot be declared to be 'const'");
+
+  static const ParserErrorCode CONST_FACTORY = const ParserErrorCode(
+      'CONST_FACTORY',
+      "Only redirecting factory constructors can be declared to be 'const'");
+
+  static const ParserErrorCode CONST_METHOD = const ParserErrorCode(
+      'CONST_METHOD',
+      "Getters, setters and methods cannot be declared to be 'const'");
+
+  static const ParserErrorCode CONST_TYPEDEF = const ParserErrorCode(
+      'CONST_TYPEDEF', "Type aliases cannot be declared to be 'const'");
+
+  static const ParserErrorCode CONSTRUCTOR_WITH_RETURN_TYPE =
+      const ParserErrorCode('CONSTRUCTOR_WITH_RETURN_TYPE',
+          "Constructors cannot have a return type");
+
+  static const ParserErrorCode CONTINUE_OUTSIDE_OF_LOOP = const ParserErrorCode(
+      'CONTINUE_OUTSIDE_OF_LOOP',
+      "A continue statement cannot be used outside of a loop or switch statement");
+
+  static const ParserErrorCode CONTINUE_WITHOUT_LABEL_IN_CASE =
+      const ParserErrorCode('CONTINUE_WITHOUT_LABEL_IN_CASE',
+          "A continue statement in a switch statement must have a label as a target");
+
+  static const ParserErrorCode DEPRECATED_CLASS_TYPE_ALIAS =
+      const ParserErrorCode('DEPRECATED_CLASS_TYPE_ALIAS',
+          "The 'typedef' mixin application was replaced with 'class'");
+
+  static const ParserErrorCode DIRECTIVE_AFTER_DECLARATION =
+      const ParserErrorCode('DIRECTIVE_AFTER_DECLARATION',
+          "Directives must appear before any declarations");
+
+  static const ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT =
+      const ParserErrorCode('DUPLICATE_LABEL_IN_SWITCH_STATEMENT',
+          "The label {0} was already used in this switch statement");
+
+  static const ParserErrorCode DUPLICATED_MODIFIER = const ParserErrorCode(
+      'DUPLICATED_MODIFIER', "The modifier '{0}' was already specified.");
+
+  static const ParserErrorCode EMPTY_ENUM_BODY = const ParserErrorCode(
+      'EMPTY_ENUM_BODY', "An enum must declare at least one constant name");
+
+  static const ParserErrorCode ENUM_IN_CLASS = const ParserErrorCode(
+      'ENUM_IN_CLASS', "Enums cannot be declared inside classes");
+
+  static const ParserErrorCode EQUALITY_CANNOT_BE_EQUALITY_OPERAND =
+      const ParserErrorCode('EQUALITY_CANNOT_BE_EQUALITY_OPERAND',
+          "Equality expression cannot be operand of another equality expression.");
+
+  static const ParserErrorCode EXPECTED_CASE_OR_DEFAULT = const ParserErrorCode(
+      'EXPECTED_CASE_OR_DEFAULT', "Expected 'case' or 'default'");
+
+  static const ParserErrorCode EXPECTED_CLASS_MEMBER =
+      const ParserErrorCode('EXPECTED_CLASS_MEMBER', "Expected a class member");
+
+  static const ParserErrorCode EXPECTED_EXECUTABLE = const ParserErrorCode(
+      'EXPECTED_EXECUTABLE',
+      "Expected a method, getter, setter or operator declaration");
+
+  static const ParserErrorCode EXPECTED_LIST_OR_MAP_LITERAL =
+      const ParserErrorCode(
+          'EXPECTED_LIST_OR_MAP_LITERAL', "Expected a list or map literal");
+
+  static const ParserErrorCode EXPECTED_STRING_LITERAL = const ParserErrorCode(
+      'EXPECTED_STRING_LITERAL', "Expected a string literal");
+
+  static const ParserErrorCode EXPECTED_TOKEN =
+      const ParserErrorCode('EXPECTED_TOKEN', "Expected to find '{0}'");
+
+  static const ParserErrorCode EXPECTED_TYPE_NAME =
+      const ParserErrorCode('EXPECTED_TYPE_NAME', "Expected a type name");
+
+  static const ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE =
+      const ParserErrorCode('EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE',
+          "Export directives must preceed part directives");
+
+  static const ParserErrorCode EXTERNAL_AFTER_CONST = const ParserErrorCode(
+      'EXTERNAL_AFTER_CONST',
+      "The modifier 'external' should be before the modifier 'const'");
+
+  static const ParserErrorCode EXTERNAL_AFTER_FACTORY = const ParserErrorCode(
+      'EXTERNAL_AFTER_FACTORY',
+      "The modifier 'external' should be before the modifier 'factory'");
+
+  static const ParserErrorCode EXTERNAL_AFTER_STATIC = const ParserErrorCode(
+      'EXTERNAL_AFTER_STATIC',
+      "The modifier 'external' should be before the modifier 'static'");
+
+  static const ParserErrorCode EXTERNAL_CLASS = const ParserErrorCode(
+      'EXTERNAL_CLASS', "Classes cannot be declared to be 'external'");
+
+  static const ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY =
+      const ParserErrorCode('EXTERNAL_CONSTRUCTOR_WITH_BODY',
+          "External constructors cannot have a body");
+
+  static const ParserErrorCode EXTERNAL_ENUM = const ParserErrorCode(
+      'EXTERNAL_ENUM', "Enums cannot be declared to be 'external'");
+
+  static const ParserErrorCode EXTERNAL_FIELD = const ParserErrorCode(
+      'EXTERNAL_FIELD', "Fields cannot be declared to be 'external'");
+
+  static const ParserErrorCode EXTERNAL_GETTER_WITH_BODY =
+      const ParserErrorCode(
+          'EXTERNAL_GETTER_WITH_BODY', "External getters cannot have a body");
+
+  static const ParserErrorCode EXTERNAL_METHOD_WITH_BODY =
+      const ParserErrorCode(
+          'EXTERNAL_METHOD_WITH_BODY', "External methods cannot have a body");
+
+  static const ParserErrorCode EXTERNAL_OPERATOR_WITH_BODY =
+      const ParserErrorCode('EXTERNAL_OPERATOR_WITH_BODY',
+          "External operators cannot have a body");
+
+  static const ParserErrorCode EXTERNAL_SETTER_WITH_BODY =
+      const ParserErrorCode(
+          'EXTERNAL_SETTER_WITH_BODY', "External setters cannot have a body");
+
+  static const ParserErrorCode EXTERNAL_TYPEDEF = const ParserErrorCode(
+      'EXTERNAL_TYPEDEF', "Type aliases cannot be declared to be 'external'");
+
+  static const ParserErrorCode FACTORY_TOP_LEVEL_DECLARATION =
+      const ParserErrorCode('FACTORY_TOP_LEVEL_DECLARATION',
+          "Top-level declarations cannot be declared to be 'factory'");
+
+  static const ParserErrorCode FACTORY_WITH_INITIALIZERS =
+      const ParserErrorCode('FACTORY_WITH_INITIALIZERS',
+          "A 'factory' constructor cannot have initializers",
+          "Either remove the 'factory' keyword to make this a generative "
+          "constructor or remove the initializers.");
+
+  static const ParserErrorCode FACTORY_WITHOUT_BODY = const ParserErrorCode(
+      'FACTORY_WITHOUT_BODY',
+      "A non-redirecting 'factory' constructor must have a body");
+
+  static const ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR =
+      const ParserErrorCode('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR',
+          "Field initializers can only be used in a constructor");
+
+  static const ParserErrorCode FINAL_AND_VAR = const ParserErrorCode(
+      'FINAL_AND_VAR',
+      "Members cannot be declared to be both 'final' and 'var'");
+
+  static const ParserErrorCode FINAL_CLASS = const ParserErrorCode(
+      'FINAL_CLASS', "Classes cannot be declared to be 'final'");
+
+  static const ParserErrorCode FINAL_CONSTRUCTOR = const ParserErrorCode(
+      'FINAL_CONSTRUCTOR', "A constructor cannot be declared to be 'final'");
+
+  static const ParserErrorCode FINAL_ENUM = const ParserErrorCode(
+      'FINAL_ENUM', "Enums cannot be declared to be 'final'");
+
+  static const ParserErrorCode FINAL_METHOD = const ParserErrorCode(
+      'FINAL_METHOD',
+      "Getters, setters and methods cannot be declared to be 'final'");
+
+  static const ParserErrorCode FINAL_TYPEDEF = const ParserErrorCode(
+      'FINAL_TYPEDEF', "Type aliases cannot be declared to be 'final'");
+
+  static const ParserErrorCode FUNCTION_TYPED_PARAMETER_VAR = const ParserErrorCode(
+      'FUNCTION_TYPED_PARAMETER_VAR',
+      "Function typed parameters cannot specify 'const', 'final' or 'var' instead of return type");
+
+  static const ParserErrorCode GETTER_IN_FUNCTION = const ParserErrorCode(
+      'GETTER_IN_FUNCTION',
+      "Getters cannot be defined within methods or functions");
+
+  static const ParserErrorCode GETTER_WITH_PARAMETERS = const ParserErrorCode(
+      'GETTER_WITH_PARAMETERS',
+      "Getter should be declared without a parameter list");
+
+  static const ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE =
+      const ParserErrorCode('ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE',
+          "Illegal assignment to non-assignable expression");
+
+  static const ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS =
+      const ParserErrorCode('IMPLEMENTS_BEFORE_EXTENDS',
+          "The extends clause must be before the implements clause");
+
+  static const ParserErrorCode IMPLEMENTS_BEFORE_WITH = const ParserErrorCode(
+      'IMPLEMENTS_BEFORE_WITH',
+      "The with clause must be before the implements clause");
+
+  static const ParserErrorCode IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE =
+      const ParserErrorCode('IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE',
+          "Import directives must preceed part directives");
+
+  static const ParserErrorCode INITIALIZED_VARIABLE_IN_FOR_EACH =
+      const ParserErrorCode('INITIALIZED_VARIABLE_IN_FOR_EACH',
+          "The loop variable in a for-each loop cannot be initialized");
+
+  static const ParserErrorCode INVALID_AWAIT_IN_FOR = const ParserErrorCode(
+      'INVALID_AWAIT_IN_FOR',
+      "The modifier 'await' is not allowed for a normal 'for' statement",
+      "Remove the keyword or use a for-each statement.");
+
+  static const ParserErrorCode INVALID_CODE_POINT = const ParserErrorCode(
+      'INVALID_CODE_POINT',
+      "The escape sequence '{0}' is not a valid code point");
+
+  static const ParserErrorCode INVALID_COMMENT_REFERENCE = const ParserErrorCode(
+      'INVALID_COMMENT_REFERENCE',
+      "Comment references should contain a possibly prefixed identifier and can start with 'new', but should not contain anything else");
+
+  static const ParserErrorCode INVALID_HEX_ESCAPE = const ParserErrorCode(
+      'INVALID_HEX_ESCAPE',
+      "An escape sequence starting with '\\x' must be followed by 2 hexidecimal digits");
+
+  static const ParserErrorCode INVALID_OPERATOR = const ParserErrorCode(
+      'INVALID_OPERATOR', "The string '{0}' is not a valid operator");
+
+  static const ParserErrorCode INVALID_OPERATOR_FOR_SUPER =
+      const ParserErrorCode('INVALID_OPERATOR_FOR_SUPER',
+          "The operator '{0}' cannot be used with 'super'");
+
+  static const ParserErrorCode INVALID_STAR_AFTER_ASYNC = const ParserErrorCode(
+      'INVALID_STAR_AFTER_ASYNC',
+      "The modifier 'async*' is not allowed for an expression function body",
+      "Convert the body to a block.");
+
+  static const ParserErrorCode INVALID_SYNC = const ParserErrorCode(
+      'INVALID_SYNC',
+      "The modifier 'sync' is not allowed for an exrpression function body",
+      "Convert the body to a block.");
+
+  static const ParserErrorCode INVALID_UNICODE_ESCAPE = const ParserErrorCode(
+      'INVALID_UNICODE_ESCAPE',
+      "An escape sequence starting with '\\u' must be followed by 4 hexidecimal digits or from 1 to 6 digits between '{' and '}'");
+
+  static const ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST =
+      const ParserErrorCode('LIBRARY_DIRECTIVE_NOT_FIRST',
+          "The library directive must appear before all other directives");
+
+  static const ParserErrorCode LOCAL_FUNCTION_DECLARATION_MODIFIER =
+      const ParserErrorCode('LOCAL_FUNCTION_DECLARATION_MODIFIER',
+          "Local function declarations cannot specify any modifier");
+
+  static const ParserErrorCode MISSING_ASSIGNABLE_SELECTOR =
+      const ParserErrorCode('MISSING_ASSIGNABLE_SELECTOR',
+          "Missing selector such as \".<identifier>\" or \"[0]\"");
+
+  static const ParserErrorCode MISSING_ASSIGNMENT_IN_INITIALIZER =
+      const ParserErrorCode('MISSING_ASSIGNMENT_IN_INITIALIZER',
+          "Expected an assignment after the field name");
+
+  static const ParserErrorCode MISSING_CATCH_OR_FINALLY = const ParserErrorCode(
+      'MISSING_CATCH_OR_FINALLY',
+      "A try statement must have either a catch or finally clause");
+
+  static const ParserErrorCode MISSING_CLASS_BODY = const ParserErrorCode(
+      'MISSING_CLASS_BODY',
+      "A class definition must have a body, even if it is empty");
+
+  static const ParserErrorCode MISSING_CLOSING_PARENTHESIS =
+      const ParserErrorCode(
+          'MISSING_CLOSING_PARENTHESIS', "The closing parenthesis is missing");
+
+  static const ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE =
+      const ParserErrorCode('MISSING_CONST_FINAL_VAR_OR_TYPE',
+          "Variables must be declared using the keywords 'const', 'final', 'var' or a type name");
+
+  static const ParserErrorCode MISSING_ENUM_BODY = const ParserErrorCode(
+      'MISSING_ENUM_BODY',
+      "An enum definition must have a body with at least one constant name");
+
+  static const ParserErrorCode MISSING_EXPRESSION_IN_INITIALIZER =
+      const ParserErrorCode('MISSING_EXPRESSION_IN_INITIALIZER',
+          "Expected an expression after the assignment operator");
+
+  static const ParserErrorCode MISSING_EXPRESSION_IN_THROW =
+      const ParserErrorCode('MISSING_EXPRESSION_IN_THROW',
+          "Throw expressions must compute the object to be thrown");
+
+  static const ParserErrorCode MISSING_FUNCTION_BODY = const ParserErrorCode(
+      'MISSING_FUNCTION_BODY', "A function body must be provided");
+
+  static const ParserErrorCode MISSING_FUNCTION_PARAMETERS =
+      const ParserErrorCode('MISSING_FUNCTION_PARAMETERS',
+          "Functions must have an explicit list of parameters");
+
+  static const ParserErrorCode MISSING_METHOD_PARAMETERS =
+      const ParserErrorCode('MISSING_METHOD_PARAMETERS',
+          "Methods must have an explicit list of parameters");
+
+  static const ParserErrorCode MISSING_GET = const ParserErrorCode(
+      'MISSING_GET',
+      "Getters must have the keyword 'get' before the getter name");
+
+  static const ParserErrorCode MISSING_IDENTIFIER =
+      const ParserErrorCode('MISSING_IDENTIFIER', "Expected an identifier");
+
+  static const ParserErrorCode MISSING_INITIALIZER =
+      const ParserErrorCode('MISSING_INITIALIZER', "Expected an initializer");
+
+  static const ParserErrorCode MISSING_KEYWORD_OPERATOR = const ParserErrorCode(
+      'MISSING_KEYWORD_OPERATOR',
+      "Operator declarations must be preceeded by the keyword 'operator'");
+
+  static const ParserErrorCode MISSING_NAME_IN_LIBRARY_DIRECTIVE =
+      const ParserErrorCode('MISSING_NAME_IN_LIBRARY_DIRECTIVE',
+          "Library directives must include a library name");
+
+  static const ParserErrorCode MISSING_NAME_IN_PART_OF_DIRECTIVE =
+      const ParserErrorCode('MISSING_NAME_IN_PART_OF_DIRECTIVE',
+          "Library directives must include a library name");
+
+  static const ParserErrorCode MISSING_PREFIX_IN_DEFERRED_IMPORT =
+      const ParserErrorCode('MISSING_PREFIX_IN_DEFERRED_IMPORT',
+          "Deferred imports must have a prefix");
+
+  static const ParserErrorCode MISSING_STAR_AFTER_SYNC = const ParserErrorCode(
+      'MISSING_STAR_AFTER_SYNC',
+      "The modifier 'sync' must be followed by a star ('*')",
+      "Remove the modifier or add a star.");
+
+  static const ParserErrorCode MISSING_STATEMENT =
+      const ParserErrorCode('MISSING_STATEMENT', "Expected a statement");
+
+  static const ParserErrorCode MISSING_TERMINATOR_FOR_PARAMETER_GROUP =
+      const ParserErrorCode('MISSING_TERMINATOR_FOR_PARAMETER_GROUP',
+          "There is no '{0}' to close the parameter group");
+
+  static const ParserErrorCode MISSING_TYPEDEF_PARAMETERS =
+      const ParserErrorCode('MISSING_TYPEDEF_PARAMETERS',
+          "Type aliases for functions must have an explicit list of parameters");
+
+  static const ParserErrorCode MISSING_VARIABLE_IN_FOR_EACH = const ParserErrorCode(
+      'MISSING_VARIABLE_IN_FOR_EACH',
+      "A loop variable must be declared in a for-each loop before the 'in', but none were found");
+
+  static const ParserErrorCode MIXED_PARAMETER_GROUPS = const ParserErrorCode(
+      'MIXED_PARAMETER_GROUPS',
+      "Cannot have both positional and named parameters in a single parameter list");
+
+  static const ParserErrorCode MULTIPLE_EXTENDS_CLAUSES = const ParserErrorCode(
+      'MULTIPLE_EXTENDS_CLAUSES',
+      "Each class definition can have at most one extends clause");
+
+  static const ParserErrorCode MULTIPLE_IMPLEMENTS_CLAUSES =
+      const ParserErrorCode('MULTIPLE_IMPLEMENTS_CLAUSES',
+          "Each class definition can have at most one implements clause");
+
+  static const ParserErrorCode MULTIPLE_LIBRARY_DIRECTIVES =
+      const ParserErrorCode('MULTIPLE_LIBRARY_DIRECTIVES',
+          "Only one library directive may be declared in a file");
+
+  static const ParserErrorCode MULTIPLE_NAMED_PARAMETER_GROUPS =
+      const ParserErrorCode('MULTIPLE_NAMED_PARAMETER_GROUPS',
+          "Cannot have multiple groups of named parameters in a single parameter list");
+
+  static const ParserErrorCode MULTIPLE_PART_OF_DIRECTIVES =
+      const ParserErrorCode('MULTIPLE_PART_OF_DIRECTIVES',
+          "Only one part-of directive may be declared in a file");
+
+  static const ParserErrorCode MULTIPLE_POSITIONAL_PARAMETER_GROUPS =
+      const ParserErrorCode('MULTIPLE_POSITIONAL_PARAMETER_GROUPS',
+          "Cannot have multiple groups of positional parameters in a single parameter list");
+
+  static const ParserErrorCode MULTIPLE_VARIABLES_IN_FOR_EACH =
+      const ParserErrorCode('MULTIPLE_VARIABLES_IN_FOR_EACH',
+          "A single loop variable must be declared in a for-each loop before the 'in', but {0} were found");
+
+  static const ParserErrorCode MULTIPLE_WITH_CLAUSES = const ParserErrorCode(
+      'MULTIPLE_WITH_CLAUSES',
+      "Each class definition can have at most one with clause");
+
+  static const ParserErrorCode NAMED_FUNCTION_EXPRESSION =
+      const ParserErrorCode(
+          'NAMED_FUNCTION_EXPRESSION', "Function expressions cannot be named");
+
+  static const ParserErrorCode NAMED_PARAMETER_OUTSIDE_GROUP =
+      const ParserErrorCode('NAMED_PARAMETER_OUTSIDE_GROUP',
+          "Named parameters must be enclosed in curly braces ('{' and '}')");
+
+  static const ParserErrorCode NATIVE_CLAUSE_IN_NON_SDK_CODE =
+      const ParserErrorCode('NATIVE_CLAUSE_IN_NON_SDK_CODE',
+          "Native clause can only be used in the SDK and code that is loaded through native extensions");
+
+  static const ParserErrorCode NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE =
+      const ParserErrorCode('NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE',
+          "Native functions can only be declared in the SDK and code that is loaded through native extensions");
+
+  static const ParserErrorCode NON_CONSTRUCTOR_FACTORY = const ParserErrorCode(
+      'NON_CONSTRUCTOR_FACTORY',
+      "Only constructors can be declared to be a 'factory'");
+
+  static const ParserErrorCode NON_IDENTIFIER_LIBRARY_NAME =
+      const ParserErrorCode('NON_IDENTIFIER_LIBRARY_NAME',
+          "The name of a library must be an identifier");
+
+  static const ParserErrorCode NON_PART_OF_DIRECTIVE_IN_PART =
+      const ParserErrorCode('NON_PART_OF_DIRECTIVE_IN_PART',
+          "The part-of directive must be the only directive in a part");
+
+  static const ParserErrorCode NON_STRING_LITERAL_AS_URI =
+      const ParserErrorCode('NON_STRING_LITERAL_AS_URI',
+          "The URI must be a string literal",
+          "Enclose the URI in either single or double quotes.");
+
+  static const ParserErrorCode NON_USER_DEFINABLE_OPERATOR =
+      const ParserErrorCode('NON_USER_DEFINABLE_OPERATOR',
+          "The operator '{0}' is not user definable");
+
+  static const ParserErrorCode NORMAL_BEFORE_OPTIONAL_PARAMETERS =
+      const ParserErrorCode('NORMAL_BEFORE_OPTIONAL_PARAMETERS',
+          "Normal parameters must occur before optional parameters");
+
+  static const ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT =
+      const ParserErrorCode('POSITIONAL_AFTER_NAMED_ARGUMENT',
+          "Positional arguments must occur before named arguments");
+
+  static const ParserErrorCode POSITIONAL_PARAMETER_OUTSIDE_GROUP =
+      const ParserErrorCode('POSITIONAL_PARAMETER_OUTSIDE_GROUP',
+          "Positional parameters must be enclosed in square brackets ('[' and ']')");
+
+  static const ParserErrorCode REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR =
+      const ParserErrorCode('REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR',
+          "Only factory constructor can specify '=' redirection.");
+
+  static const ParserErrorCode SETTER_IN_FUNCTION = const ParserErrorCode(
+      'SETTER_IN_FUNCTION',
+      "Setters cannot be defined within methods or functions");
+
+  static const ParserErrorCode STATIC_AFTER_CONST = const ParserErrorCode(
+      'STATIC_AFTER_CONST',
+      "The modifier 'static' should be before the modifier 'const'");
+
+  static const ParserErrorCode STATIC_AFTER_FINAL = const ParserErrorCode(
+      'STATIC_AFTER_FINAL',
+      "The modifier 'static' should be before the modifier 'final'");
+
+  static const ParserErrorCode STATIC_AFTER_VAR = const ParserErrorCode(
+      'STATIC_AFTER_VAR',
+      "The modifier 'static' should be before the modifier 'var'");
+
+  static const ParserErrorCode STATIC_CONSTRUCTOR = const ParserErrorCode(
+      'STATIC_CONSTRUCTOR', "Constructors cannot be static");
+
+  static const ParserErrorCode STATIC_GETTER_WITHOUT_BODY =
+      const ParserErrorCode(
+          'STATIC_GETTER_WITHOUT_BODY', "A 'static' getter must have a body");
+
+  static const ParserErrorCode STATIC_OPERATOR =
+      const ParserErrorCode('STATIC_OPERATOR', "Operators cannot be static");
+
+  static const ParserErrorCode STATIC_SETTER_WITHOUT_BODY =
+      const ParserErrorCode(
+          'STATIC_SETTER_WITHOUT_BODY', "A 'static' setter must have a body");
+
+  static const ParserErrorCode STATIC_TOP_LEVEL_DECLARATION =
+      const ParserErrorCode('STATIC_TOP_LEVEL_DECLARATION',
+          "Top-level declarations cannot be declared to be 'static'");
+
+  static const ParserErrorCode SWITCH_HAS_CASE_AFTER_DEFAULT_CASE =
+      const ParserErrorCode('SWITCH_HAS_CASE_AFTER_DEFAULT_CASE',
+          "The 'default' case should be the last case in a switch statement");
+
+  static const ParserErrorCode SWITCH_HAS_MULTIPLE_DEFAULT_CASES =
+      const ParserErrorCode('SWITCH_HAS_MULTIPLE_DEFAULT_CASES',
+          "The 'default' case can only be declared once");
+
+  static const ParserErrorCode TOP_LEVEL_OPERATOR = const ParserErrorCode(
+      'TOP_LEVEL_OPERATOR', "Operators must be declared within a class");
+
+  static const ParserErrorCode TYPEDEF_IN_CLASS = const ParserErrorCode(
+      'TYPEDEF_IN_CLASS',
+      "Function type aliases cannot be declared inside classes");
+
+  static const ParserErrorCode UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP =
+      const ParserErrorCode('UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP',
+          "There is no '{0}' to open a parameter group");
+
+  static const ParserErrorCode UNEXPECTED_TOKEN =
+      const ParserErrorCode('UNEXPECTED_TOKEN', "Unexpected token '{0}'");
+
+  static const ParserErrorCode WITH_BEFORE_EXTENDS = const ParserErrorCode(
+      'WITH_BEFORE_EXTENDS',
+      "The extends clause must be before the with clause");
+
+  static const ParserErrorCode WITH_WITHOUT_EXTENDS = const ParserErrorCode(
+      'WITH_WITHOUT_EXTENDS',
+      "The with clause cannot be used without an extends clause");
+
+  static const ParserErrorCode WRONG_SEPARATOR_FOR_NAMED_PARAMETER =
+      const ParserErrorCode('WRONG_SEPARATOR_FOR_NAMED_PARAMETER',
+          "The default value of a named parameter should be preceeded by ':'");
+
+  static const ParserErrorCode WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER =
+      const ParserErrorCode('WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER',
+          "The default value of a positional parameter should be preceeded by '='");
+
+  static const ParserErrorCode WRONG_TERMINATOR_FOR_PARAMETER_GROUP =
+      const ParserErrorCode('WRONG_TERMINATOR_FOR_PARAMETER_GROUP',
+          "Expected '{0}' to close parameter group");
+
+  static const ParserErrorCode VAR_AND_TYPE = const ParserErrorCode(
+      'VAR_AND_TYPE',
+      "Variables cannot be declared using both 'var' and a type name; remove the 'var'");
+
+  static const ParserErrorCode VAR_AS_TYPE_NAME = const ParserErrorCode(
+      'VAR_AS_TYPE_NAME', "The keyword 'var' cannot be used as a type name");
+
+  static const ParserErrorCode VAR_CLASS = const ParserErrorCode(
+      'VAR_CLASS', "Classes cannot be declared to be 'var'");
+
+  static const ParserErrorCode VAR_ENUM =
+      const ParserErrorCode('VAR_ENUM', "Enums cannot be declared to be 'var'");
+
+  static const ParserErrorCode VAR_RETURN_TYPE = const ParserErrorCode(
+      'VAR_RETURN_TYPE', "The return type cannot be 'var'");
+
+  static const ParserErrorCode VAR_TYPEDEF = const ParserErrorCode(
+      'VAR_TYPEDEF', "Type aliases cannot be declared to be 'var'");
+
+  static const ParserErrorCode VOID_PARAMETER = const ParserErrorCode(
+      'VOID_PARAMETER', "Parameters cannot have a type of 'void'");
+
+  static const ParserErrorCode VOID_VARIABLE = const ParserErrorCode(
+      'VOID_VARIABLE', "Variables cannot have a type of 'void'");
+
+  /**
+   * Initialize a newly created error code to have the given [name]. The message
+   * associated with the error will be created from the given [message]
+   * template. The correction associated with the error will be created from the
+   * given [correction] template.
+   */
+  const ParserErrorCode(String name, String message, [String correction])
+      : super(name, message, correction);
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;
+
+  @override
+  ErrorType get type => ErrorType.SYNTACTIC_ERROR;
+}
+
+/**
+ * An object that copies resolution information from one AST structure to
+ * another as long as the structures of the corresponding children of a pair of
+ * nodes are the same.
+ */
+class ResolutionCopier implements AstVisitor<bool> {
+  /**
+   * The AST node with which the node being visited is to be compared. This is
+   * only valid at the beginning of each visit method (until [isEqualNodes] is
+   * invoked).
+   */
+  AstNode _toNode;
+
+  @override
+  bool visitAdjacentStrings(AdjacentStrings node) {
+    AdjacentStrings toNode = this._toNode as AdjacentStrings;
+    return _isEqualNodeLists(node.strings, toNode.strings);
+  }
+
+  @override
+  bool visitAnnotation(Annotation node) {
+    Annotation toNode = this._toNode as Annotation;
+    if (_and(_isEqualTokens(node.atSign, toNode.atSign),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualTokens(node.period, toNode.period),
+        _isEqualNodes(node.constructorName, toNode.constructorName),
+        _isEqualNodes(node.arguments, toNode.arguments))) {
+      toNode.element = node.element;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitArgumentList(ArgumentList node) {
+    ArgumentList toNode = this._toNode as ArgumentList;
+    return _and(_isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodeLists(node.arguments, toNode.arguments),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis));
+  }
+
+  @override
+  bool visitAsExpression(AsExpression node) {
+    AsExpression toNode = this._toNode as AsExpression;
+    if (_and(_isEqualNodes(node.expression, toNode.expression),
+        _isEqualTokens(node.asOperator, toNode.asOperator),
+        _isEqualNodes(node.type, toNode.type))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitAssertStatement(AssertStatement node) {
+    AssertStatement toNode = this._toNode as AssertStatement;
+    return _and(_isEqualTokens(node.assertKeyword, toNode.assertKeyword),
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodes(node.condition, toNode.condition),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
+  }
+
+  @override
+  bool visitAssignmentExpression(AssignmentExpression node) {
+    AssignmentExpression toNode = this._toNode as AssignmentExpression;
+    if (_and(_isEqualNodes(node.leftHandSide, toNode.leftHandSide),
+        _isEqualTokens(node.operator, toNode.operator),
+        _isEqualNodes(node.rightHandSide, toNode.rightHandSide))) {
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitAwaitExpression(AwaitExpression node) {
+    AwaitExpression toNode = this._toNode as AwaitExpression;
+    if (_and(_isEqualTokens(node.awaitKeyword, toNode.awaitKeyword),
+        _isEqualNodes(node.expression, toNode.expression))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitBinaryExpression(BinaryExpression node) {
+    BinaryExpression toNode = this._toNode as BinaryExpression;
+    if (_and(_isEqualNodes(node.leftOperand, toNode.leftOperand),
+        _isEqualTokens(node.operator, toNode.operator),
+        _isEqualNodes(node.rightOperand, toNode.rightOperand))) {
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitBlock(Block node) {
+    Block toNode = this._toNode as Block;
+    return _and(_isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodeLists(node.statements, toNode.statements),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket));
+  }
+
+  @override
+  bool visitBlockFunctionBody(BlockFunctionBody node) {
+    BlockFunctionBody toNode = this._toNode as BlockFunctionBody;
+    return _isEqualNodes(node.block, toNode.block);
+  }
+
+  @override
+  bool visitBooleanLiteral(BooleanLiteral node) {
+    BooleanLiteral toNode = this._toNode as BooleanLiteral;
+    if (_and(_isEqualTokens(node.literal, toNode.literal),
+        node.value == toNode.value)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitBreakStatement(BreakStatement node) {
+    BreakStatement toNode = this._toNode as BreakStatement;
+    if (_and(_isEqualTokens(node.breakKeyword, toNode.breakKeyword),
+        _isEqualNodes(node.label, toNode.label),
+        _isEqualTokens(node.semicolon, toNode.semicolon))) {
+      // TODO(paulberry): map node.target to toNode.target.
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitCascadeExpression(CascadeExpression node) {
+    CascadeExpression toNode = this._toNode as CascadeExpression;
+    if (_and(_isEqualNodes(node.target, toNode.target),
+        _isEqualNodeLists(node.cascadeSections, toNode.cascadeSections))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitCatchClause(CatchClause node) {
+    CatchClause toNode = this._toNode as CatchClause;
+    return _and(_isEqualTokens(node.onKeyword, toNode.onKeyword),
+        _isEqualNodes(node.exceptionType, toNode.exceptionType),
+        _isEqualTokens(node.catchKeyword, toNode.catchKeyword),
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodes(node.exceptionParameter, toNode.exceptionParameter),
+        _isEqualTokens(node.comma, toNode.comma),
+        _isEqualNodes(node.stackTraceParameter, toNode.stackTraceParameter),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+        _isEqualNodes(node.body, toNode.body));
+  }
+
+  @override
+  bool visitClassDeclaration(ClassDeclaration node) {
+    ClassDeclaration toNode = this._toNode as ClassDeclaration;
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.abstractKeyword, toNode.abstractKeyword),
+        _isEqualTokens(node.classKeyword, toNode.classKeyword),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualNodes(node.typeParameters, toNode.typeParameters),
+        _isEqualNodes(node.extendsClause, toNode.extendsClause),
+        _isEqualNodes(node.withClause, toNode.withClause),
+        _isEqualNodes(node.implementsClause, toNode.implementsClause),
+        _isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodeLists(node.members, toNode.members),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket));
+  }
+
+  @override
+  bool visitClassTypeAlias(ClassTypeAlias node) {
+    ClassTypeAlias toNode = this._toNode as ClassTypeAlias;
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.typedefKeyword, toNode.typedefKeyword),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualNodes(node.typeParameters, toNode.typeParameters),
+        _isEqualTokens(node.equals, toNode.equals),
+        _isEqualTokens(node.abstractKeyword, toNode.abstractKeyword),
+        _isEqualNodes(node.superclass, toNode.superclass),
+        _isEqualNodes(node.withClause, toNode.withClause),
+        _isEqualNodes(node.implementsClause, toNode.implementsClause),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
+  }
+
+  @override
+  bool visitComment(Comment node) {
+    Comment toNode = this._toNode as Comment;
+    return _isEqualNodeLists(node.references, toNode.references);
+  }
+
+  @override
+  bool visitCommentReference(CommentReference node) {
+    CommentReference toNode = this._toNode as CommentReference;
+    return _and(_isEqualTokens(node.newKeyword, toNode.newKeyword),
+        _isEqualNodes(node.identifier, toNode.identifier));
+  }
+
+  @override
+  bool visitCompilationUnit(CompilationUnit node) {
+    CompilationUnit toNode = this._toNode as CompilationUnit;
+    if (_and(_isEqualTokens(node.beginToken, toNode.beginToken),
+        _isEqualNodes(node.scriptTag, toNode.scriptTag),
+        _isEqualNodeLists(node.directives, toNode.directives),
+        _isEqualNodeLists(node.declarations, toNode.declarations),
+        _isEqualTokens(node.endToken, toNode.endToken))) {
+      toNode.element = node.element;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitConditionalExpression(ConditionalExpression node) {
+    ConditionalExpression toNode = this._toNode as ConditionalExpression;
+    if (_and(_isEqualNodes(node.condition, toNode.condition),
+        _isEqualTokens(node.question, toNode.question),
+        _isEqualNodes(node.thenExpression, toNode.thenExpression),
+        _isEqualTokens(node.colon, toNode.colon),
+        _isEqualNodes(node.elseExpression, toNode.elseExpression))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitConstructorDeclaration(ConstructorDeclaration node) {
+    ConstructorDeclaration toNode = this._toNode as ConstructorDeclaration;
+    if (_and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.externalKeyword, toNode.externalKeyword),
+        _isEqualTokens(node.constKeyword, toNode.constKeyword),
+        _isEqualTokens(node.factoryKeyword, toNode.factoryKeyword),
+        _isEqualNodes(node.returnType, toNode.returnType),
+        _isEqualTokens(node.period, toNode.period),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualNodes(node.parameters, toNode.parameters),
+        _isEqualTokens(node.separator, toNode.separator),
+        _isEqualNodeLists(node.initializers, toNode.initializers),
+        _isEqualNodes(node.redirectedConstructor, toNode.redirectedConstructor),
+        _isEqualNodes(node.body, toNode.body))) {
+      toNode.element = node.element;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    ConstructorFieldInitializer toNode =
+        this._toNode as ConstructorFieldInitializer;
+    return _and(_isEqualTokens(node.thisKeyword, toNode.thisKeyword),
+        _isEqualTokens(node.period, toNode.period),
+        _isEqualNodes(node.fieldName, toNode.fieldName),
+        _isEqualTokens(node.equals, toNode.equals),
+        _isEqualNodes(node.expression, toNode.expression));
+  }
+
+  @override
+  bool visitConstructorName(ConstructorName node) {
+    ConstructorName toNode = this._toNode as ConstructorName;
+    if (_and(_isEqualNodes(node.type, toNode.type),
+        _isEqualTokens(node.period, toNode.period),
+        _isEqualNodes(node.name, toNode.name))) {
+      toNode.staticElement = node.staticElement;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitContinueStatement(ContinueStatement node) {
+    ContinueStatement toNode = this._toNode as ContinueStatement;
+    if (_and(_isEqualTokens(node.continueKeyword, toNode.continueKeyword),
+        _isEqualNodes(node.label, toNode.label),
+        _isEqualTokens(node.semicolon, toNode.semicolon))) {
+      // TODO(paulberry): map node.target to toNode.target.
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitDeclaredIdentifier(DeclaredIdentifier node) {
+    DeclaredIdentifier toNode = this._toNode as DeclaredIdentifier;
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.type, toNode.type),
+        _isEqualNodes(node.identifier, toNode.identifier));
+  }
+
+  @override
+  bool visitDefaultFormalParameter(DefaultFormalParameter node) {
+    DefaultFormalParameter toNode = this._toNode as DefaultFormalParameter;
+    return _and(_isEqualNodes(node.parameter, toNode.parameter),
+        node.kind == toNode.kind,
+        _isEqualTokens(node.separator, toNode.separator),
+        _isEqualNodes(node.defaultValue, toNode.defaultValue));
+  }
+
+  @override
+  bool visitDoStatement(DoStatement node) {
+    DoStatement toNode = this._toNode as DoStatement;
+    return _and(_isEqualTokens(node.doKeyword, toNode.doKeyword),
+        _isEqualNodes(node.body, toNode.body),
+        _isEqualTokens(node.whileKeyword, toNode.whileKeyword),
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodes(node.condition, toNode.condition),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
+  }
+
+  @override
+  bool visitDoubleLiteral(DoubleLiteral node) {
+    DoubleLiteral toNode = this._toNode as DoubleLiteral;
+    if (_and(_isEqualTokens(node.literal, toNode.literal),
+        node.value == toNode.value)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitEmptyFunctionBody(EmptyFunctionBody node) {
+    EmptyFunctionBody toNode = this._toNode as EmptyFunctionBody;
+    return _isEqualTokens(node.semicolon, toNode.semicolon);
+  }
+
+  @override
+  bool visitEmptyStatement(EmptyStatement node) {
+    EmptyStatement toNode = this._toNode as EmptyStatement;
+    return _isEqualTokens(node.semicolon, toNode.semicolon);
+  }
+
+  @override
+  bool visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    EnumConstantDeclaration toNode = this._toNode as EnumConstantDeclaration;
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualNodes(node.name, toNode.name));
+  }
+
+  @override
+  bool visitEnumDeclaration(EnumDeclaration node) {
+    EnumDeclaration toNode = this._toNode as EnumDeclaration;
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.enumKeyword, toNode.enumKeyword),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodeLists(node.constants, toNode.constants),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket));
+  }
+
+  @override
+  bool visitExportDirective(ExportDirective node) {
+    ExportDirective toNode = this._toNode as ExportDirective;
+    if (_and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.uri, toNode.uri),
+        _isEqualNodeLists(node.combinators, toNode.combinators),
+        _isEqualTokens(node.semicolon, toNode.semicolon))) {
+      toNode.element = node.element;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    ExpressionFunctionBody toNode = this._toNode as ExpressionFunctionBody;
+    return _and(
+        _isEqualTokens(node.functionDefinition, toNode.functionDefinition),
+        _isEqualNodes(node.expression, toNode.expression),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
+  }
+
+  @override
+  bool visitExpressionStatement(ExpressionStatement node) {
+    ExpressionStatement toNode = this._toNode as ExpressionStatement;
+    return _and(_isEqualNodes(node.expression, toNode.expression),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
+  }
+
+  @override
+  bool visitExtendsClause(ExtendsClause node) {
+    ExtendsClause toNode = this._toNode as ExtendsClause;
+    return _and(_isEqualTokens(node.extendsKeyword, toNode.extendsKeyword),
+        _isEqualNodes(node.superclass, toNode.superclass));
+  }
+
+  @override
+  bool visitFieldDeclaration(FieldDeclaration node) {
+    FieldDeclaration toNode = this._toNode as FieldDeclaration;
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.staticKeyword, toNode.staticKeyword),
+        _isEqualNodes(node.fields, toNode.fields),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
+  }
+
+  @override
+  bool visitFieldFormalParameter(FieldFormalParameter node) {
+    FieldFormalParameter toNode = this._toNode as FieldFormalParameter;
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.type, toNode.type),
+        _isEqualTokens(node.thisKeyword, toNode.thisKeyword),
+        _isEqualTokens(node.period, toNode.period),
+        _isEqualNodes(node.identifier, toNode.identifier));
+  }
+
+  @override
+  bool visitForEachStatement(ForEachStatement node) {
+    ForEachStatement toNode = this._toNode as ForEachStatement;
+    return _and(_isEqualTokens(node.forKeyword, toNode.forKeyword),
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodes(node.loopVariable, toNode.loopVariable),
+        _isEqualTokens(node.inKeyword, toNode.inKeyword),
+        _isEqualNodes(node.iterable, toNode.iterable),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+        _isEqualNodes(node.body, toNode.body));
+  }
+
+  @override
+  bool visitFormalParameterList(FormalParameterList node) {
+    FormalParameterList toNode = this._toNode as FormalParameterList;
+    return _and(_isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodeLists(node.parameters, toNode.parameters),
+        _isEqualTokens(node.leftDelimiter, toNode.leftDelimiter),
+        _isEqualTokens(node.rightDelimiter, toNode.rightDelimiter),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis));
+  }
+
+  @override
+  bool visitForStatement(ForStatement node) {
+    ForStatement toNode = this._toNode as ForStatement;
+    return _and(_isEqualTokens(node.forKeyword, toNode.forKeyword),
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodes(node.variables, toNode.variables),
+        _isEqualNodes(node.initialization, toNode.initialization),
+        _isEqualTokens(node.leftSeparator, toNode.leftSeparator),
+        _isEqualNodes(node.condition, toNode.condition),
+        _isEqualTokens(node.rightSeparator, toNode.rightSeparator),
+        _isEqualNodeLists(node.updaters, toNode.updaters),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+        _isEqualNodes(node.body, toNode.body));
+  }
+
+  @override
+  bool visitFunctionDeclaration(FunctionDeclaration node) {
+    FunctionDeclaration toNode = this._toNode as FunctionDeclaration;
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.externalKeyword, toNode.externalKeyword),
+        _isEqualNodes(node.returnType, toNode.returnType),
+        _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualNodes(node.functionExpression, toNode.functionExpression));
+  }
+
+  @override
+  bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    FunctionDeclarationStatement toNode =
+        this._toNode as FunctionDeclarationStatement;
+    return _isEqualNodes(node.functionDeclaration, toNode.functionDeclaration);
+  }
+
+  @override
+  bool visitFunctionExpression(FunctionExpression node) {
+    FunctionExpression toNode = this._toNode as FunctionExpression;
+    if (_and(_isEqualNodes(node.parameters, toNode.parameters),
+        _isEqualNodes(node.body, toNode.body))) {
+      toNode.element = node.element;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    FunctionExpressionInvocation toNode =
+        this._toNode as FunctionExpressionInvocation;
+    if (_and(_isEqualNodes(node.function, toNode.function),
+        _isEqualNodes(node.argumentList, toNode.argumentList))) {
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitFunctionTypeAlias(FunctionTypeAlias node) {
+    FunctionTypeAlias toNode = this._toNode as FunctionTypeAlias;
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.typedefKeyword, toNode.typedefKeyword),
+        _isEqualNodes(node.returnType, toNode.returnType),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualNodes(node.typeParameters, toNode.typeParameters),
+        _isEqualNodes(node.parameters, toNode.parameters),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
+  }
+
+  @override
+  bool visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    FunctionTypedFormalParameter toNode =
+        this._toNode as FunctionTypedFormalParameter;
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualNodes(node.returnType, toNode.returnType),
+        _isEqualNodes(node.identifier, toNode.identifier),
+        _isEqualNodes(node.parameters, toNode.parameters));
+  }
+
+  @override
+  bool visitHideCombinator(HideCombinator node) {
+    HideCombinator toNode = this._toNode as HideCombinator;
+    return _and(_isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodeLists(node.hiddenNames, toNode.hiddenNames));
+  }
+
+  @override
+  bool visitIfStatement(IfStatement node) {
+    IfStatement toNode = this._toNode as IfStatement;
+    return _and(_isEqualTokens(node.ifKeyword, toNode.ifKeyword),
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodes(node.condition, toNode.condition),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+        _isEqualNodes(node.thenStatement, toNode.thenStatement),
+        _isEqualTokens(node.elseKeyword, toNode.elseKeyword),
+        _isEqualNodes(node.elseStatement, toNode.elseStatement));
+  }
+
+  @override
+  bool visitImplementsClause(ImplementsClause node) {
+    ImplementsClause toNode = this._toNode as ImplementsClause;
+    return _and(
+        _isEqualTokens(node.implementsKeyword, toNode.implementsKeyword),
+        _isEqualNodeLists(node.interfaces, toNode.interfaces));
+  }
+
+  @override
+  bool visitImportDirective(ImportDirective node) {
+    ImportDirective toNode = this._toNode as ImportDirective;
+    if (_and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.uri, toNode.uri),
+        _isEqualTokens(node.asKeyword, toNode.asKeyword),
+        _isEqualNodes(node.prefix, toNode.prefix),
+        _isEqualNodeLists(node.combinators, toNode.combinators),
+        _isEqualTokens(node.semicolon, toNode.semicolon))) {
+      toNode.element = node.element;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitIndexExpression(IndexExpression node) {
+    IndexExpression toNode = this._toNode as IndexExpression;
+    if (_and(_isEqualNodes(node.target, toNode.target),
+        _isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodes(node.index, toNode.index),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
+      toNode.auxiliaryElements = node.auxiliaryElements;
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitInstanceCreationExpression(InstanceCreationExpression node) {
+    InstanceCreationExpression toNode =
+        this._toNode as InstanceCreationExpression;
+    if (_and(_isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.constructorName, toNode.constructorName),
+        _isEqualNodes(node.argumentList, toNode.argumentList))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitIntegerLiteral(IntegerLiteral node) {
+    IntegerLiteral toNode = this._toNode as IntegerLiteral;
+    if (_and(_isEqualTokens(node.literal, toNode.literal),
+        node.value == toNode.value)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitInterpolationExpression(InterpolationExpression node) {
+    InterpolationExpression toNode = this._toNode as InterpolationExpression;
+    return _and(_isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodes(node.expression, toNode.expression),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket));
+  }
+
+  @override
+  bool visitInterpolationString(InterpolationString node) {
+    InterpolationString toNode = this._toNode as InterpolationString;
+    return _and(_isEqualTokens(node.contents, toNode.contents),
+        node.value == toNode.value);
+  }
+
+  @override
+  bool visitIsExpression(IsExpression node) {
+    IsExpression toNode = this._toNode as IsExpression;
+    if (_and(_isEqualNodes(node.expression, toNode.expression),
+        _isEqualTokens(node.isOperator, toNode.isOperator),
+        _isEqualTokens(node.notOperator, toNode.notOperator),
+        _isEqualNodes(node.type, toNode.type))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitLabel(Label node) {
+    Label toNode = this._toNode as Label;
+    return _and(_isEqualNodes(node.label, toNode.label),
+        _isEqualTokens(node.colon, toNode.colon));
+  }
+
+  @override
+  bool visitLabeledStatement(LabeledStatement node) {
+    LabeledStatement toNode = this._toNode as LabeledStatement;
+    return _and(_isEqualNodeLists(node.labels, toNode.labels),
+        _isEqualNodes(node.statement, toNode.statement));
+  }
+
+  @override
+  bool visitLibraryDirective(LibraryDirective node) {
+    LibraryDirective toNode = this._toNode as LibraryDirective;
+    if (_and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.libraryKeyword, toNode.libraryKeyword),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualTokens(node.semicolon, toNode.semicolon))) {
+      toNode.element = node.element;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitLibraryIdentifier(LibraryIdentifier node) {
+    LibraryIdentifier toNode = this._toNode as LibraryIdentifier;
+    if (_isEqualNodeLists(node.components, toNode.components)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitListLiteral(ListLiteral node) {
+    ListLiteral toNode = this._toNode as ListLiteral;
+    if (_and(_isEqualTokens(node.constKeyword, toNode.constKeyword),
+        _isEqualNodes(node.typeArguments, toNode.typeArguments),
+        _isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodeLists(node.elements, toNode.elements),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitMapLiteral(MapLiteral node) {
+    MapLiteral toNode = this._toNode as MapLiteral;
+    if (_and(_isEqualTokens(node.constKeyword, toNode.constKeyword),
+        _isEqualNodes(node.typeArguments, toNode.typeArguments),
+        _isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodeLists(node.entries, toNode.entries),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitMapLiteralEntry(MapLiteralEntry node) {
+    MapLiteralEntry toNode = this._toNode as MapLiteralEntry;
+    return _and(_isEqualNodes(node.key, toNode.key),
+        _isEqualTokens(node.separator, toNode.separator),
+        _isEqualNodes(node.value, toNode.value));
+  }
+
+  @override
+  bool visitMethodDeclaration(MethodDeclaration node) {
+    MethodDeclaration toNode = this._toNode as MethodDeclaration;
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.externalKeyword, toNode.externalKeyword),
+        _isEqualTokens(node.modifierKeyword, toNode.modifierKeyword),
+        _isEqualNodes(node.returnType, toNode.returnType),
+        _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword),
+        _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualNodes(node.parameters, toNode.parameters),
+        _isEqualNodes(node.body, toNode.body));
+  }
+
+  @override
+  bool visitMethodInvocation(MethodInvocation node) {
+    MethodInvocation toNode = this._toNode as MethodInvocation;
+    if (_and(_isEqualNodes(node.target, toNode.target),
+        _isEqualTokens(node.operator, toNode.operator),
+        _isEqualNodes(node.methodName, toNode.methodName),
+        _isEqualNodes(node.argumentList, toNode.argumentList))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitNamedExpression(NamedExpression node) {
+    NamedExpression toNode = this._toNode as NamedExpression;
+    if (_and(_isEqualNodes(node.name, toNode.name),
+        _isEqualNodes(node.expression, toNode.expression))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitNativeClause(NativeClause node) {
+    NativeClause toNode = this._toNode as NativeClause;
+    return _and(_isEqualTokens(node.nativeKeyword, toNode.nativeKeyword),
+        _isEqualNodes(node.name, toNode.name));
+  }
+
+  @override
+  bool visitNativeFunctionBody(NativeFunctionBody node) {
+    NativeFunctionBody toNode = this._toNode as NativeFunctionBody;
+    return _and(_isEqualTokens(node.nativeKeyword, toNode.nativeKeyword),
+        _isEqualNodes(node.stringLiteral, toNode.stringLiteral),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
+  }
+
+  @override
+  bool visitNullLiteral(NullLiteral node) {
+    NullLiteral toNode = this._toNode as NullLiteral;
+    if (_isEqualTokens(node.literal, toNode.literal)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitParenthesizedExpression(ParenthesizedExpression node) {
+    ParenthesizedExpression toNode = this._toNode as ParenthesizedExpression;
+    if (_and(_isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodes(node.expression, toNode.expression),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitPartDirective(PartDirective node) {
+    PartDirective toNode = this._toNode as PartDirective;
+    if (_and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.partKeyword, toNode.partKeyword),
+        _isEqualNodes(node.uri, toNode.uri),
+        _isEqualTokens(node.semicolon, toNode.semicolon))) {
+      toNode.element = node.element;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitPartOfDirective(PartOfDirective node) {
+    PartOfDirective toNode = this._toNode as PartOfDirective;
+    if (_and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.partKeyword, toNode.partKeyword),
+        _isEqualTokens(node.ofKeyword, toNode.ofKeyword),
+        _isEqualNodes(node.libraryName, toNode.libraryName),
+        _isEqualTokens(node.semicolon, toNode.semicolon))) {
+      toNode.element = node.element;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitPostfixExpression(PostfixExpression node) {
+    PostfixExpression toNode = this._toNode as PostfixExpression;
+    if (_and(_isEqualNodes(node.operand, toNode.operand),
+        _isEqualTokens(node.operator, toNode.operator))) {
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitPrefixedIdentifier(PrefixedIdentifier node) {
+    PrefixedIdentifier toNode = this._toNode as PrefixedIdentifier;
+    if (_and(_isEqualNodes(node.prefix, toNode.prefix),
+        _isEqualTokens(node.period, toNode.period),
+        _isEqualNodes(node.identifier, toNode.identifier))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitPrefixExpression(PrefixExpression node) {
+    PrefixExpression toNode = this._toNode as PrefixExpression;
+    if (_and(_isEqualTokens(node.operator, toNode.operator),
+        _isEqualNodes(node.operand, toNode.operand))) {
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitPropertyAccess(PropertyAccess node) {
+    PropertyAccess toNode = this._toNode as PropertyAccess;
+    if (_and(_isEqualNodes(node.target, toNode.target),
+        _isEqualTokens(node.operator, toNode.operator),
+        _isEqualNodes(node.propertyName, toNode.propertyName))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    RedirectingConstructorInvocation toNode =
+        this._toNode as RedirectingConstructorInvocation;
+    if (_and(_isEqualTokens(node.thisKeyword, toNode.thisKeyword),
+        _isEqualTokens(node.period, toNode.period),
+        _isEqualNodes(node.constructorName, toNode.constructorName),
+        _isEqualNodes(node.argumentList, toNode.argumentList))) {
+      toNode.staticElement = node.staticElement;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitRethrowExpression(RethrowExpression node) {
+    RethrowExpression toNode = this._toNode as RethrowExpression;
+    if (_isEqualTokens(node.rethrowKeyword, toNode.rethrowKeyword)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitReturnStatement(ReturnStatement node) {
+    ReturnStatement toNode = this._toNode as ReturnStatement;
+    return _and(_isEqualTokens(node.returnKeyword, toNode.returnKeyword),
+        _isEqualNodes(node.expression, toNode.expression),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
+  }
+
+  @override
+  bool visitScriptTag(ScriptTag node) {
+    ScriptTag toNode = this._toNode as ScriptTag;
+    return _isEqualTokens(node.scriptTag, toNode.scriptTag);
+  }
+
+  @override
+  bool visitShowCombinator(ShowCombinator node) {
+    ShowCombinator toNode = this._toNode as ShowCombinator;
+    return _and(_isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodeLists(node.shownNames, toNode.shownNames));
+  }
+
+  @override
+  bool visitSimpleFormalParameter(SimpleFormalParameter node) {
+    SimpleFormalParameter toNode = this._toNode as SimpleFormalParameter;
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.type, toNode.type),
+        _isEqualNodes(node.identifier, toNode.identifier));
+  }
+
+  @override
+  bool visitSimpleIdentifier(SimpleIdentifier node) {
+    SimpleIdentifier toNode = this._toNode as SimpleIdentifier;
+    if (_isEqualTokens(node.token, toNode.token)) {
+      toNode.staticElement = node.staticElement;
+      toNode.staticType = node.staticType;
+      toNode.propagatedElement = node.propagatedElement;
+      toNode.propagatedType = node.propagatedType;
+      toNode.auxiliaryElements = node.auxiliaryElements;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitSimpleStringLiteral(SimpleStringLiteral node) {
+    SimpleStringLiteral toNode = this._toNode as SimpleStringLiteral;
+    if (_and(_isEqualTokens(node.literal, toNode.literal),
+        node.value == toNode.value)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitStringInterpolation(StringInterpolation node) {
+    StringInterpolation toNode = this._toNode as StringInterpolation;
+    if (_isEqualNodeLists(node.elements, toNode.elements)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    SuperConstructorInvocation toNode =
+        this._toNode as SuperConstructorInvocation;
+    if (_and(_isEqualTokens(node.superKeyword, toNode.superKeyword),
+        _isEqualTokens(node.period, toNode.period),
+        _isEqualNodes(node.constructorName, toNode.constructorName),
+        _isEqualNodes(node.argumentList, toNode.argumentList))) {
+      toNode.staticElement = node.staticElement;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitSuperExpression(SuperExpression node) {
+    SuperExpression toNode = this._toNode as SuperExpression;
+    if (_isEqualTokens(node.superKeyword, toNode.superKeyword)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitSwitchCase(SwitchCase node) {
+    SwitchCase toNode = this._toNode as SwitchCase;
+    return _and(_isEqualNodeLists(node.labels, toNode.labels),
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.expression, toNode.expression),
+        _isEqualTokens(node.colon, toNode.colon),
+        _isEqualNodeLists(node.statements, toNode.statements));
+  }
+
+  @override
+  bool visitSwitchDefault(SwitchDefault node) {
+    SwitchDefault toNode = this._toNode as SwitchDefault;
+    return _and(_isEqualNodeLists(node.labels, toNode.labels),
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualTokens(node.colon, toNode.colon),
+        _isEqualNodeLists(node.statements, toNode.statements));
+  }
+
+  @override
+  bool visitSwitchStatement(SwitchStatement node) {
+    SwitchStatement toNode = this._toNode as SwitchStatement;
+    return _and(_isEqualTokens(node.switchKeyword, toNode.switchKeyword),
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodes(node.expression, toNode.expression),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+        _isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodeLists(node.members, toNode.members),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket));
+  }
+
+  @override
+  bool visitSymbolLiteral(SymbolLiteral node) {
+    SymbolLiteral toNode = this._toNode as SymbolLiteral;
+    if (_and(_isEqualTokens(node.poundSign, toNode.poundSign),
+        _isEqualTokenLists(node.components, toNode.components))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitThisExpression(ThisExpression node) {
+    ThisExpression toNode = this._toNode as ThisExpression;
+    if (_isEqualTokens(node.thisKeyword, toNode.thisKeyword)) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitThrowExpression(ThrowExpression node) {
+    ThrowExpression toNode = this._toNode as ThrowExpression;
+    if (_and(_isEqualTokens(node.throwKeyword, toNode.throwKeyword),
+        _isEqualNodes(node.expression, toNode.expression))) {
+      toNode.propagatedType = node.propagatedType;
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    TopLevelVariableDeclaration toNode =
+        this._toNode as TopLevelVariableDeclaration;
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualNodes(node.variables, toNode.variables),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
+  }
+
+  @override
+  bool visitTryStatement(TryStatement node) {
+    TryStatement toNode = this._toNode as TryStatement;
+    return _and(_isEqualTokens(node.tryKeyword, toNode.tryKeyword),
+        _isEqualNodes(node.body, toNode.body),
+        _isEqualNodeLists(node.catchClauses, toNode.catchClauses),
+        _isEqualTokens(node.finallyKeyword, toNode.finallyKeyword),
+        _isEqualNodes(node.finallyBlock, toNode.finallyBlock));
+  }
+
+  @override
+  bool visitTypeArgumentList(TypeArgumentList node) {
+    TypeArgumentList toNode = this._toNode as TypeArgumentList;
+    return _and(_isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodeLists(node.arguments, toNode.arguments),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket));
+  }
+
+  @override
+  bool visitTypeName(TypeName node) {
+    TypeName toNode = this._toNode as TypeName;
+    if (_and(_isEqualNodes(node.name, toNode.name),
+        _isEqualNodes(node.typeArguments, toNode.typeArguments))) {
+      toNode.type = node.type;
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitTypeParameter(TypeParameter node) {
+    TypeParameter toNode = this._toNode as TypeParameter;
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualTokens(node.extendsKeyword, toNode.extendsKeyword),
+        _isEqualNodes(node.bound, toNode.bound));
+  }
+
+  @override
+  bool visitTypeParameterList(TypeParameterList node) {
+    TypeParameterList toNode = this._toNode as TypeParameterList;
+    return _and(_isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodeLists(node.typeParameters, toNode.typeParameters),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket));
+  }
+
+  @override
+  bool visitVariableDeclaration(VariableDeclaration node) {
+    VariableDeclaration toNode = this._toNode as VariableDeclaration;
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualTokens(node.equals, toNode.equals),
+        _isEqualNodes(node.initializer, toNode.initializer));
+  }
+
+  @override
+  bool visitVariableDeclarationList(VariableDeclarationList node) {
+    VariableDeclarationList toNode = this._toNode as VariableDeclarationList;
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.type, toNode.type),
+        _isEqualNodeLists(node.variables, toNode.variables));
+  }
+
+  @override
+  bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    VariableDeclarationStatement toNode =
+        this._toNode as VariableDeclarationStatement;
+    return _and(_isEqualNodes(node.variables, toNode.variables),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
+  }
+
+  @override
+  bool visitWhileStatement(WhileStatement node) {
+    WhileStatement toNode = this._toNode as WhileStatement;
+    return _and(_isEqualTokens(node.whileKeyword, toNode.whileKeyword),
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodes(node.condition, toNode.condition),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+        _isEqualNodes(node.body, toNode.body));
+  }
+
+  @override
+  bool visitWithClause(WithClause node) {
+    WithClause toNode = this._toNode as WithClause;
+    return _and(_isEqualTokens(node.withKeyword, toNode.withKeyword),
+        _isEqualNodeLists(node.mixinTypes, toNode.mixinTypes));
+  }
+
+  @override
+  bool visitYieldStatement(YieldStatement node) {
+    YieldStatement toNode = this._toNode as YieldStatement;
+    return _and(_isEqualTokens(node.yieldKeyword, toNode.yieldKeyword),
+        _isEqualNodes(node.expression, toNode.expression),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
+  }
+
+  /**
+   * Return `true` if all of the parameters are `true`.
+   */
+  bool _and(bool b1, bool b2, [bool b3 = true, bool b4 = true, bool b5 = true,
+      bool b6 = true, bool b7 = true, bool b8 = true, bool b9 = true,
+      bool b10 = true, bool b11 = true, bool b12 = true, bool b13 = true]) {
+    // TODO(brianwilkerson) Inline this method.
+    return b1 &&
+        b2 &&
+        b3 &&
+        b4 &&
+        b5 &&
+        b6 &&
+        b7 &&
+        b8 &&
+        b9 &&
+        b10 &&
+        b11 &&
+        b12 &&
+        b13;
+  }
+
+  /**
+   * Return `true` if the [first] and [second] lists of AST nodes have the same
+   * size and corresponding elements are equal.
+   */
+  bool _isEqualNodeLists(NodeList first, NodeList second) {
+    if (first == null) {
+      return second == null;
+    } else if (second == null) {
+      return false;
+    }
+    int size = first.length;
+    if (second.length != size) {
+      return false;
+    }
+    bool equal = true;
+    for (int i = 0; i < size; i++) {
+      if (!_isEqualNodes(first[i], second[i])) {
+        equal = false;
+      }
+    }
+    return equal;
+  }
+
+  /**
+   * Return `true` if the [fromNode] and [toNode] have the same structure. As a
+   * side-effect, if the nodes do have the same structure, any resolution data
+   * from the first node will be copied to the second node.
+   */
+  bool _isEqualNodes(AstNode fromNode, AstNode toNode) {
+    if (fromNode == null) {
+      return toNode == null;
+    } else if (toNode == null) {
+      return false;
+    } else if (fromNode.runtimeType == toNode.runtimeType) {
+      this._toNode = toNode;
+      return fromNode.accept(this);
+    }
+    //
+    // Check for a simple transformation caused by entering a period.
+    //
+    if (toNode is PrefixedIdentifier) {
+      SimpleIdentifier prefix = toNode.prefix;
+      if (fromNode.runtimeType == prefix.runtimeType) {
+        this._toNode = prefix;
+        return fromNode.accept(this);
+      }
+    } else if (toNode is PropertyAccess) {
+      Expression target = toNode.target;
+      if (fromNode.runtimeType == target.runtimeType) {
+        this._toNode = target;
+        return fromNode.accept(this);
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the [first] and [second] arrays of tokens have the same
+   * length and corresponding elements are equal.
+   */
+  bool _isEqualTokenLists(List<Token> first, List<Token> second) {
+    int length = first.length;
+    if (second.length != length) {
+      return false;
+    }
+    for (int i = 0; i < length; i++) {
+      if (!_isEqualTokens(first[i], second[i])) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Return `true` if the [first] and [second] tokens have the same structure.
+   */
+  bool _isEqualTokens(Token first, Token second) {
+    if (first == null) {
+      return second == null;
+    } else if (second == null) {
+      return false;
+    }
+    return first.lexeme == second.lexeme;
+  }
+
+  /**
+   * Copy resolution data from the [fromNode] to the [toNode].
+   */
+  static void copyResolutionData(AstNode fromNode, AstNode toNode) {
+    ResolutionCopier copier = new ResolutionCopier();
+    copier._isEqualNodes(fromNode, toNode);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/resolver.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/resolver.dart
new file mode 100644
index 0000000..bd316bf
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/resolver.dart
@@ -0,0 +1,15409 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.resolver;
+
+import 'dart:collection';
+
+import 'ast.dart';
+import 'constant.dart';
+import 'element.dart';
+import 'element_resolver.dart';
+import 'engine.dart';
+import 'error.dart';
+import 'error_verifier.dart';
+import 'html.dart' as ht;
+import 'java_core.dart';
+import 'java_engine.dart';
+import 'scanner.dart' as sc;
+import 'sdk.dart' show DartSdk, SdkLibrary;
+import 'source.dart';
+import 'static_type_analyzer.dart';
+import 'utilities_dart.dart';
+
+/**
+ * Callback signature used by ImplicitConstructorBuilder to register
+ * computations to be performed, and their dependencies.  A call to this
+ * callback indicates that [computation] may be used to compute implicit
+ * constructors for [classElement], but that the computation may not be invoked
+ * until after implicit constructors have been built for [superclassElement].
+ */
+typedef void ImplicitConstructorBuilderCallback(ClassElement classElement,
+    ClassElement superclassElement, void computation());
+
+typedef LibraryResolver LibraryResolverFactory(AnalysisContext context);
+
+typedef ResolverVisitor ResolverVisitorFactory(
+    Library library, Source source, TypeProvider typeProvider);
+
+typedef StaticTypeAnalyzer StaticTypeAnalyzerFactory(ResolverVisitor visitor);
+
+typedef TypeResolverVisitor TypeResolverVisitorFactory(
+    Library library, Source source, TypeProvider typeProvider);
+
+typedef void VoidFunction();
+
+/**
+ * Instances of the class `BestPracticesVerifier` traverse an AST structure looking for
+ * violations of Dart best practices.
+ */
+class BestPracticesVerifier extends RecursiveAstVisitor<Object> {
+//  static String _HASHCODE_GETTER_NAME = "hashCode";
+
+  static String _NULL_TYPE_NAME = "Null";
+
+  static String _TO_INT_METHOD_NAME = "toInt";
+
+  /**
+   * The class containing the AST nodes being visited, or `null` if we are not in the scope of
+   * a class.
+   */
+  ClassElement _enclosingClass;
+
+  /**
+   * The error reporter by which errors will be reported.
+   */
+  final ErrorReporter _errorReporter;
+
+  /**
+   * The type Future<Null>, which is needed for determining whether it is safe
+   * to have a bare "return;" in an async method.
+   */
+  final InterfaceType _futureNullType;
+
+  /**
+   * Create a new instance of the [BestPracticesVerifier].
+   *
+   * @param errorReporter the error reporter
+   */
+  BestPracticesVerifier(this._errorReporter, TypeProvider typeProvider)
+      : _futureNullType = typeProvider.futureNullType;
+
+  @override
+  Object visitArgumentList(ArgumentList node) {
+    _checkForArgumentTypesNotAssignableInList(node);
+    return super.visitArgumentList(node);
+  }
+
+  @override
+  Object visitAsExpression(AsExpression node) {
+    _checkForUnnecessaryCast(node);
+    return super.visitAsExpression(node);
+  }
+
+  @override
+  Object visitAssignmentExpression(AssignmentExpression node) {
+    sc.TokenType operatorType = node.operator.type;
+    if (operatorType == sc.TokenType.EQ) {
+      _checkForUseOfVoidResult(node.rightHandSide);
+      _checkForInvalidAssignment(node.leftHandSide, node.rightHandSide);
+    } else {
+      _checkForDeprecatedMemberUse(node.bestElement, node);
+    }
+    return super.visitAssignmentExpression(node);
+  }
+
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    _checkForDivisionOptimizationHint(node);
+    _checkForDeprecatedMemberUse(node.bestElement, node);
+    return super.visitBinaryExpression(node);
+  }
+
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    ClassElement outerClass = _enclosingClass;
+    try {
+      _enclosingClass = node.element;
+      // Commented out until we decide that we want this hint in the analyzer
+      //    checkForOverrideEqualsButNotHashCode(node);
+      return super.visitClassDeclaration(node);
+    } finally {
+      _enclosingClass = outerClass;
+    }
+  }
+
+  @override
+  Object visitExportDirective(ExportDirective node) {
+    _checkForDeprecatedMemberUse(node.uriElement, node);
+    return super.visitExportDirective(node);
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    _checkForMissingReturn(node.returnType, node.functionExpression.body);
+    return super.visitFunctionDeclaration(node);
+  }
+
+  @override
+  Object visitImportDirective(ImportDirective node) {
+    _checkForDeprecatedMemberUse(node.uriElement, node);
+    ImportElement importElement = node.element;
+    if (importElement != null) {
+      if (importElement.isDeferred) {
+        _checkForLoadLibraryFunction(node, importElement);
+      }
+    }
+    return super.visitImportDirective(node);
+  }
+
+  @override
+  Object visitIndexExpression(IndexExpression node) {
+    _checkForDeprecatedMemberUse(node.bestElement, node);
+    return super.visitIndexExpression(node);
+  }
+
+  @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    _checkForDeprecatedMemberUse(node.staticElement, node);
+    return super.visitInstanceCreationExpression(node);
+  }
+
+  @override
+  Object visitIsExpression(IsExpression node) {
+    _checkAllTypeChecks(node);
+    return super.visitIsExpression(node);
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    // This was determined to not be a good hint, see: dartbug.com/16029
+    //checkForOverridingPrivateMember(node);
+    _checkForMissingReturn(node.returnType, node.body);
+    return super.visitMethodDeclaration(node);
+  }
+
+  @override
+  Object visitPostfixExpression(PostfixExpression node) {
+    _checkForDeprecatedMemberUse(node.bestElement, node);
+    return super.visitPostfixExpression(node);
+  }
+
+  @override
+  Object visitPrefixExpression(PrefixExpression node) {
+    _checkForDeprecatedMemberUse(node.bestElement, node);
+    return super.visitPrefixExpression(node);
+  }
+
+  @override
+  Object visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    _checkForDeprecatedMemberUse(node.staticElement, node);
+    return super.visitRedirectingConstructorInvocation(node);
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    _checkForDeprecatedMemberUseAtIdentifier(node);
+    return super.visitSimpleIdentifier(node);
+  }
+
+  @override
+  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    _checkForDeprecatedMemberUse(node.staticElement, node);
+    return super.visitSuperConstructorInvocation(node);
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    _checkForUseOfVoidResult(node.initializer);
+    _checkForInvalidAssignment(node.name, node.initializer);
+    return super.visitVariableDeclaration(node);
+  }
+
+  /**
+   * Check for the passed is expression for the unnecessary type check hint codes as well as null
+   * checks expressed using an is expression.
+   *
+   * @param node the is expression to check
+   * @return `true` if and only if a hint code is generated on the passed node
+   * See [HintCode.TYPE_CHECK_IS_NOT_NULL], [HintCode.TYPE_CHECK_IS_NULL],
+   * [HintCode.UNNECESSARY_TYPE_CHECK_TRUE], and
+   * [HintCode.UNNECESSARY_TYPE_CHECK_FALSE].
+   */
+  bool _checkAllTypeChecks(IsExpression node) {
+    Expression expression = node.expression;
+    TypeName typeName = node.type;
+    DartType lhsType = expression.staticType;
+    DartType rhsType = typeName.type;
+    if (lhsType == null || rhsType == null) {
+      return false;
+    }
+    String rhsNameStr = typeName.name.name;
+    // if x is dynamic
+    if (rhsType.isDynamic && rhsNameStr == sc.Keyword.DYNAMIC.syntax) {
+      if (node.notOperator == null) {
+        // the is case
+        _errorReporter.reportErrorForNode(
+            HintCode.UNNECESSARY_TYPE_CHECK_TRUE, node);
+      } else {
+        // the is not case
+        _errorReporter.reportErrorForNode(
+            HintCode.UNNECESSARY_TYPE_CHECK_FALSE, node);
+      }
+      return true;
+    }
+    Element rhsElement = rhsType.element;
+    LibraryElement libraryElement =
+        rhsElement != null ? rhsElement.library : null;
+    if (libraryElement != null && libraryElement.isDartCore) {
+      // if x is Object or null is Null
+      if (rhsType.isObject ||
+          (expression is NullLiteral && rhsNameStr == _NULL_TYPE_NAME)) {
+        if (node.notOperator == null) {
+          // the is case
+          _errorReporter.reportErrorForNode(
+              HintCode.UNNECESSARY_TYPE_CHECK_TRUE, node);
+        } else {
+          // the is not case
+          _errorReporter.reportErrorForNode(
+              HintCode.UNNECESSARY_TYPE_CHECK_FALSE, node);
+        }
+        return true;
+      } else if (rhsNameStr == _NULL_TYPE_NAME) {
+        if (node.notOperator == null) {
+          // the is case
+          _errorReporter.reportErrorForNode(HintCode.TYPE_CHECK_IS_NULL, node);
+        } else {
+          // the is not case
+          _errorReporter.reportErrorForNode(
+              HintCode.TYPE_CHECK_IS_NOT_NULL, node);
+        }
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed expression can be assigned to its corresponding parameters.
+   *
+   * This method corresponds to ErrorVerifier.checkForArgumentTypeNotAssignable.
+   *
+   * TODO (jwren) In the ErrorVerifier there are other warnings that we could have a corresponding
+   * hint for: see other callers of ErrorVerifier.checkForArgumentTypeNotAssignable(..).
+   *
+   * @param expression the expression to evaluate
+   * @param expectedStaticType the expected static type of the parameter
+   * @param actualStaticType the actual static type of the argument
+   * @param expectedPropagatedType the expected propagated type of the parameter, may be
+   *          `null`
+   * @param actualPropagatedType the expected propagated type of the parameter, may be `null`
+   * @return `true` if and only if an hint code is generated on the passed node
+   * See [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
+   */
+  bool _checkForArgumentTypeNotAssignable(
+      Expression expression,
+      DartType expectedStaticType,
+      DartType actualStaticType,
+      DartType expectedPropagatedType,
+      DartType actualPropagatedType,
+      ErrorCode hintCode) {
+    //
+    // Warning case: test static type information
+    //
+    if (actualStaticType != null && expectedStaticType != null) {
+      if (!actualStaticType.isAssignableTo(expectedStaticType)) {
+        // A warning was created in the ErrorVerifier, return false, don't
+        // create a hint when a warning has already been created.
+        return false;
+      }
+    }
+    //
+    // Hint case: test propagated type information
+    //
+    // Compute the best types to use.
+    DartType expectedBestType = expectedPropagatedType != null
+        ? expectedPropagatedType
+        : expectedStaticType;
+    DartType actualBestType =
+        actualPropagatedType != null ? actualPropagatedType : actualStaticType;
+    if (actualBestType != null && expectedBestType != null) {
+      if (!actualBestType.isAssignableTo(expectedBestType)) {
+        _errorReporter.reportTypeErrorForNode(
+            hintCode, expression, [actualBestType, expectedBestType]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed argument can be assigned to its corresponding parameter.
+   *
+   * This method corresponds to ErrorCode.checkForArgumentTypeNotAssignableForArgument.
+   *
+   * @param argument the argument to evaluate
+   * @return `true` if and only if an hint code is generated on the passed node
+   * See [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
+   */
+  bool _checkForArgumentTypeNotAssignableForArgument(Expression argument) {
+    if (argument == null) {
+      return false;
+    }
+    ParameterElement staticParameterElement = argument.staticParameterElement;
+    DartType staticParameterType =
+        staticParameterElement == null ? null : staticParameterElement.type;
+    ParameterElement propagatedParameterElement =
+        argument.propagatedParameterElement;
+    DartType propagatedParameterType = propagatedParameterElement == null
+        ? null
+        : propagatedParameterElement.type;
+    return _checkForArgumentTypeNotAssignableWithExpectedTypes(
+        argument,
+        staticParameterType,
+        propagatedParameterType,
+        HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
+  }
+
+  /**
+   * This verifies that the passed expression can be assigned to its corresponding parameters.
+   *
+   * This method corresponds to ErrorCode.checkForArgumentTypeNotAssignableWithExpectedTypes.
+   *
+   * @param expression the expression to evaluate
+   * @param expectedStaticType the expected static type
+   * @param expectedPropagatedType the expected propagated type, may be `null`
+   * @return `true` if and only if an hint code is generated on the passed node
+   * See [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
+   */
+  bool _checkForArgumentTypeNotAssignableWithExpectedTypes(
+          Expression expression,
+          DartType expectedStaticType,
+          DartType expectedPropagatedType,
+          ErrorCode errorCode) =>
+      _checkForArgumentTypeNotAssignable(
+          expression,
+          expectedStaticType,
+          expression.staticType,
+          expectedPropagatedType,
+          expression.propagatedType,
+          errorCode);
+
+  /**
+   * This verifies that the passed arguments can be assigned to their corresponding parameters.
+   *
+   * This method corresponds to ErrorCode.checkForArgumentTypesNotAssignableInList.
+   *
+   * @param node the arguments to evaluate
+   * @return `true` if and only if an hint code is generated on the passed node
+   * See [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
+   */
+  bool _checkForArgumentTypesNotAssignableInList(ArgumentList argumentList) {
+    if (argumentList == null) {
+      return false;
+    }
+    bool problemReported = false;
+    for (Expression argument in argumentList.arguments) {
+      if (_checkForArgumentTypeNotAssignableForArgument(argument)) {
+        problemReported = true;
+      }
+    }
+    return problemReported;
+  }
+
+  /**
+   * Given some [Element], look at the associated metadata and report the use of the member if
+   * it is declared as deprecated.
+   *
+   * @param element some element to check for deprecated use of
+   * @param node the node use for the location of the error
+   * @return `true` if and only if a hint code is generated on the passed node
+   * See [HintCode.DEPRECATED_MEMBER_USE].
+   */
+  bool _checkForDeprecatedMemberUse(Element element, AstNode node) {
+    if (element != null && element.isDeprecated) {
+      String displayName = element.displayName;
+      if (element is ConstructorElement) {
+        // TODO(jwren) We should modify ConstructorElement.getDisplayName(),
+        // or have the logic centralized elsewhere, instead of doing this logic
+        // here.
+        ConstructorElement constructorElement = element;
+        displayName = constructorElement.enclosingElement.displayName;
+        if (!constructorElement.displayName.isEmpty) {
+          displayName = "$displayName.${constructorElement.displayName}";
+        }
+      }
+      _errorReporter.reportErrorForNode(
+          HintCode.DEPRECATED_MEMBER_USE, node, [displayName]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * For [SimpleIdentifier]s, only call [checkForDeprecatedMemberUse]
+   * if the node is not in a declaration context.
+   *
+   * Also, if the identifier is a constructor name in a constructor invocation, then calls to the
+   * deprecated constructor will be caught by
+   * [visitInstanceCreationExpression] and
+   * [visitSuperConstructorInvocation], and can be ignored by
+   * this visit method.
+   *
+   * @param identifier some simple identifier to check for deprecated use of
+   * @return `true` if and only if a hint code is generated on the passed node
+   * See [HintCode.DEPRECATED_MEMBER_USE].
+   */
+  bool _checkForDeprecatedMemberUseAtIdentifier(SimpleIdentifier identifier) {
+    if (identifier.inDeclarationContext()) {
+      return false;
+    }
+    AstNode parent = identifier.parent;
+    if ((parent is ConstructorName && identical(identifier, parent.name)) ||
+        (parent is SuperConstructorInvocation &&
+            identical(identifier, parent.constructorName)) ||
+        parent is HideCombinator) {
+      return false;
+    }
+    return _checkForDeprecatedMemberUse(identifier.bestElement, identifier);
+  }
+
+  /**
+   * Check for the passed binary expression for the [HintCode.DIVISION_OPTIMIZATION].
+   *
+   * @param node the binary expression to check
+   * @return `true` if and only if a hint code is generated on the passed node
+   * See [HintCode.DIVISION_OPTIMIZATION].
+   */
+  bool _checkForDivisionOptimizationHint(BinaryExpression node) {
+    // Return if the operator is not '/'
+    if (node.operator.type != sc.TokenType.SLASH) {
+      return false;
+    }
+    // Return if the '/' operator is not defined in core, or if we don't know
+    // its static or propagated type
+    MethodElement methodElement = node.bestElement;
+    if (methodElement == null) {
+      return false;
+    }
+    LibraryElement libraryElement = methodElement.library;
+    if (libraryElement != null && !libraryElement.isDartCore) {
+      return false;
+    }
+    // Report error if the (x/y) has toInt() invoked on it
+    if (node.parent is ParenthesizedExpression) {
+      ParenthesizedExpression parenthesizedExpression =
+          _wrapParenthesizedExpression(node.parent as ParenthesizedExpression);
+      if (parenthesizedExpression.parent is MethodInvocation) {
+        MethodInvocation methodInvocation =
+            parenthesizedExpression.parent as MethodInvocation;
+        if (_TO_INT_METHOD_NAME == methodInvocation.methodName.name &&
+            methodInvocation.argumentList.arguments.isEmpty) {
+          _errorReporter.reportErrorForNode(
+              HintCode.DIVISION_OPTIMIZATION, methodInvocation);
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed left hand side and right hand side represent a valid assignment.
+   *
+   * This method corresponds to ErrorVerifier.checkForInvalidAssignment.
+   *
+   * @param lhs the left hand side expression
+   * @param rhs the right hand side expression
+   * @return `true` if and only if an error code is generated on the passed node
+   * See [HintCode.INVALID_ASSIGNMENT].
+   */
+  bool _checkForInvalidAssignment(Expression lhs, Expression rhs) {
+    if (lhs == null || rhs == null) {
+      return false;
+    }
+    VariableElement leftVariableElement = ErrorVerifier.getVariableElement(lhs);
+    DartType leftType = (leftVariableElement == null)
+        ? ErrorVerifier.getStaticType(lhs)
+        : leftVariableElement.type;
+    DartType staticRightType = ErrorVerifier.getStaticType(rhs);
+    if (!staticRightType.isAssignableTo(leftType)) {
+      // The warning was generated on this rhs
+      return false;
+    }
+    // Test for, and then generate the hint
+    DartType bestRightType = rhs.bestType;
+    if (leftType != null && bestRightType != null) {
+      if (!bestRightType.isAssignableTo(leftType)) {
+        _errorReporter.reportTypeErrorForNode(
+            HintCode.INVALID_ASSIGNMENT, rhs, [bestRightType, leftType]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Check that the imported library does not define a loadLibrary function. The import has already
+   * been determined to be deferred when this is called.
+   *
+   * @param node the import directive to evaluate
+   * @param importElement the [ImportElement] retrieved from the node
+   * @return `true` if and only if an error code is generated on the passed node
+   * See [CompileTimeErrorCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION].
+   */
+  bool _checkForLoadLibraryFunction(
+      ImportDirective node, ImportElement importElement) {
+    LibraryElement importedLibrary = importElement.importedLibrary;
+    if (importedLibrary == null) {
+      return false;
+    }
+    if (importedLibrary.hasLoadLibraryFunction) {
+      _errorReporter.reportErrorForNode(
+          HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION,
+          node,
+          [importedLibrary.name]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Generate a hint for functions or methods that have a return type, but do not have a return
+   * statement on all branches. At the end of blocks with no return, Dart implicitly returns
+   * `null`, avoiding these implicit returns is considered a best practice.
+   *
+   * Note: for async functions/methods, this hint only applies when the
+   * function has a return type that Future<Null> is not assignable to.
+   *
+   * @param node the binary expression to check
+   * @param body the function body
+   * @return `true` if and only if a hint code is generated on the passed node
+   * See [HintCode.MISSING_RETURN].
+   */
+  bool _checkForMissingReturn(TypeName returnType, FunctionBody body) {
+    // Check that the method or function has a return type, and a function body
+    if (returnType == null || body == null) {
+      return false;
+    }
+    // Check that the body is a BlockFunctionBody
+    if (body is! BlockFunctionBody) {
+      return false;
+    }
+    // Generators are never required to have a return statement.
+    if (body.isGenerator) {
+      return false;
+    }
+    // Check that the type is resolvable, and is not "void"
+    DartType returnTypeType = returnType.type;
+    if (returnTypeType == null || returnTypeType.isVoid) {
+      return false;
+    }
+    // For async, give no hint if Future<Null> is assignable to the return
+    // type.
+    if (body.isAsynchronous && _futureNullType.isAssignableTo(returnTypeType)) {
+      return false;
+    }
+    // Check the block for a return statement, if not, create the hint
+    BlockFunctionBody blockFunctionBody = body as BlockFunctionBody;
+    if (!ExitDetector.exits(blockFunctionBody)) {
+      _errorReporter.reportErrorForNode(
+          HintCode.MISSING_RETURN, returnType, [returnTypeType.displayName]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Check for the passed class declaration for the
+   * [HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE] hint code.
+   *
+   * @param node the class declaration to check
+   * @return `true` if and only if a hint code is generated on the passed node
+   * See [HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE].
+   */
+//  bool _checkForOverrideEqualsButNotHashCode(ClassDeclaration node) {
+//    ClassElement classElement = node.element;
+//    if (classElement == null) {
+//      return false;
+//    }
+//    MethodElement equalsOperatorMethodElement =
+//        classElement.getMethod(sc.TokenType.EQ_EQ.lexeme);
+//    if (equalsOperatorMethodElement != null) {
+//      PropertyAccessorElement hashCodeElement =
+//          classElement.getGetter(_HASHCODE_GETTER_NAME);
+//      if (hashCodeElement == null) {
+//        _errorReporter.reportErrorForNode(
+//            HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE,
+//            node.name,
+//            [classElement.displayName]);
+//        return true;
+//      }
+//    }
+//    return false;
+//  }
+
+  /**
+   * Check for the passed as expression for the [HintCode.UNNECESSARY_CAST] hint code.
+   *
+   * @param node the as expression to check
+   * @return `true` if and only if a hint code is generated on the passed node
+   * See [HintCode.UNNECESSARY_CAST].
+   */
+  bool _checkForUnnecessaryCast(AsExpression node) {
+    // TODO(jwren) After dartbug.com/13732, revisit this, we should be able to
+    // remove the (x is! TypeParameterType) checks.
+    AstNode parent = node.parent;
+    if (parent is ConditionalExpression &&
+        (node == parent.thenExpression || node == parent.elseExpression)) {
+      Expression thenExpression = parent.thenExpression;
+      DartType thenType;
+      if (thenExpression is AsExpression) {
+        thenType = thenExpression.expression.staticType;
+      } else {
+        thenType = thenExpression.staticType;
+      }
+      Expression elseExpression = parent.elseExpression;
+      DartType elseType;
+      if (elseExpression is AsExpression) {
+        elseType = elseExpression.expression.staticType;
+      } else {
+        elseType = elseExpression.staticType;
+      }
+      if (thenType != null &&
+          elseType != null &&
+          !thenType.isDynamic &&
+          !elseType.isDynamic &&
+          !thenType.isMoreSpecificThan(elseType) &&
+          !elseType.isMoreSpecificThan(thenType)) {
+        return false;
+      }
+    }
+    DartType lhsType = node.expression.staticType;
+    DartType rhsType = node.type.type;
+    if (lhsType != null &&
+        rhsType != null &&
+        !lhsType.isDynamic &&
+        !rhsType.isDynamic &&
+        lhsType.isMoreSpecificThan(rhsType)) {
+      _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_CAST, node);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Check for situations where the result of a method or function is used, when it returns 'void'.
+   *
+   * TODO(jwren) Many other situations of use could be covered. We currently cover the cases var x =
+   * m() and x = m(), but we could also cover cases such as m().x, m()[k], a + m(), f(m()), return
+   * m().
+   *
+   * @param node expression on the RHS of some assignment
+   * @return `true` if and only if a hint code is generated on the passed node
+   * See [HintCode.USE_OF_VOID_RESULT].
+   */
+  bool _checkForUseOfVoidResult(Expression expression) {
+    if (expression == null || expression is! MethodInvocation) {
+      return false;
+    }
+    MethodInvocation methodInvocation = expression as MethodInvocation;
+    if (identical(methodInvocation.staticType, VoidTypeImpl.instance)) {
+      SimpleIdentifier methodName = methodInvocation.methodName;
+      _errorReporter.reportErrorForNode(
+          HintCode.USE_OF_VOID_RESULT, methodName, [methodName.name]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Given a parenthesized expression, this returns the parent (or recursively grand-parent) of the
+   * expression that is a parenthesized expression, but whose parent is not a parenthesized
+   * expression.
+   *
+   * For example given the code `(((e)))`: `(e) -> (((e)))`.
+   *
+   * @param parenthesizedExpression some expression whose parent is a parenthesized expression
+   * @return the first parent or grand-parent that is a parenthesized expression, that does not have
+   *         a parenthesized expression parent
+   */
+  static ParenthesizedExpression _wrapParenthesizedExpression(
+      ParenthesizedExpression parenthesizedExpression) {
+    if (parenthesizedExpression.parent is ParenthesizedExpression) {
+      return _wrapParenthesizedExpression(
+          parenthesizedExpression.parent as ParenthesizedExpression);
+    }
+    return parenthesizedExpression;
+  }
+}
+
+/**
+ * Instances of the class `ClassScope` implement the scope defined by a class.
+ */
+class ClassScope extends EnclosedScope {
+  /**
+   * Initialize a newly created scope enclosed within another scope.
+   *
+   * @param enclosingScope the scope in which this scope is lexically enclosed
+   * @param typeElement the element representing the type represented by this scope
+   */
+  ClassScope(Scope enclosingScope, ClassElement typeElement)
+      : super(enclosingScope) {
+    if (typeElement == null) {
+      throw new IllegalArgumentException("class element cannot be null");
+    }
+    _defineMembers(typeElement);
+  }
+
+  @override
+  AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
+    if (existing is PropertyAccessorElement && duplicate is MethodElement) {
+      if (existing.nameOffset < duplicate.nameOffset) {
+        return new AnalysisError(
+            duplicate.source,
+            duplicate.nameOffset,
+            duplicate.displayName.length,
+            CompileTimeErrorCode.METHOD_AND_GETTER_WITH_SAME_NAME,
+            [existing.displayName]);
+      } else {
+        return new AnalysisError(
+            existing.source,
+            existing.nameOffset,
+            existing.displayName.length,
+            CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME,
+            [existing.displayName]);
+      }
+    }
+    return super.getErrorForDuplicate(existing, duplicate);
+  }
+
+  /**
+   * Define the instance members defined by the class.
+   *
+   * @param typeElement the element representing the type represented by this scope
+   */
+  void _defineMembers(ClassElement typeElement) {
+    for (PropertyAccessorElement accessor in typeElement.accessors) {
+      define(accessor);
+    }
+    for (MethodElement method in typeElement.methods) {
+      define(method);
+    }
+  }
+}
+
+/**
+ * A `CompilationUnitBuilder` builds an element model for a single compilation
+ * unit.
+ */
+class CompilationUnitBuilder {
+  /**
+   * Build the compilation unit element for the given [source] based on the
+   * compilation [unit] associated with the source. Throw an AnalysisException
+   * if the element could not be built.  [librarySource] is the source for the
+   * containing library.
+   */
+  CompilationUnitElementImpl buildCompilationUnit(
+      Source source, CompilationUnit unit, Source librarySource) {
+    return PerformanceStatistics.resolve.makeCurrentWhile(() {
+      if (unit == null) {
+        return null;
+      }
+      ElementHolder holder = new ElementHolder();
+      ElementBuilder builder = new ElementBuilder(holder);
+      unit.accept(builder);
+      CompilationUnitElementImpl element =
+          new CompilationUnitElementImpl(source.shortName);
+      element.accessors = holder.accessors;
+      element.enums = holder.enums;
+      element.functions = holder.functions;
+      element.source = source;
+      element.librarySource = librarySource;
+      element.typeAliases = holder.typeAliases;
+      element.types = holder.types;
+      element.topLevelVariables = holder.topLevelVariables;
+      unit.element = element;
+      holder.validate();
+      return element;
+    });
+  }
+}
+
+/**
+ * Instances of the class `ConstantVerifier` traverse an AST structure looking for additional
+ * errors and warnings not covered by the parser and resolver. In particular, it looks for errors
+ * and warnings related to constant expressions.
+ */
+class ConstantVerifier extends RecursiveAstVisitor<Object> {
+  /**
+   * The error reporter by which errors will be reported.
+   */
+  final ErrorReporter _errorReporter;
+
+  /**
+   * The type provider used to access the known types.
+   */
+  final TypeProvider _typeProvider;
+
+  /**
+   * The set of variables declared using '-D' on the command line.
+   */
+  final DeclaredVariables declaredVariables;
+
+  /**
+   * The type representing the type 'bool'.
+   */
+  InterfaceType _boolType;
+
+  /**
+   * The type representing the type 'int'.
+   */
+  InterfaceType _intType;
+
+  /**
+   * The type representing the type 'num'.
+   */
+  InterfaceType _numType;
+
+  /**
+   * The type representing the type 'string'.
+   */
+  InterfaceType _stringType;
+
+  /**
+   * The current library that is being analyzed.
+   */
+  final LibraryElement _currentLibrary;
+
+  /**
+   * Initialize a newly created constant verifier.
+   *
+   * @param errorReporter the error reporter by which errors will be reported
+   */
+  ConstantVerifier(this._errorReporter, this._currentLibrary,
+      this._typeProvider, this.declaredVariables) {
+    this._boolType = _typeProvider.boolType;
+    this._intType = _typeProvider.intType;
+    this._numType = _typeProvider.numType;
+    this._stringType = _typeProvider.stringType;
+  }
+
+  @override
+  Object visitAnnotation(Annotation node) {
+    super.visitAnnotation(node);
+    // check annotation creation
+    Element element = node.element;
+    if (element is ConstructorElement) {
+      ConstructorElement constructorElement = element;
+      // should 'const' constructor
+      if (!constructorElement.isConst) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR, node);
+        return null;
+      }
+      // should have arguments
+      ArgumentList argumentList = node.arguments;
+      if (argumentList == null) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS, node);
+        return null;
+      }
+      // arguments should be constants
+      _validateConstantArguments(argumentList);
+    }
+    return null;
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    if (node.constKeyword != null) {
+      _validateConstructorInitializers(node);
+      _validateFieldInitializers(node.parent as ClassDeclaration, node);
+    }
+    _validateDefaultValues(node.parameters);
+    return super.visitConstructorDeclaration(node);
+  }
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    super.visitFunctionExpression(node);
+    _validateDefaultValues(node.parameters);
+    return null;
+  }
+
+  @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    if (node.isConst) {
+      // We need to evaluate the constant to see if any errors occur during its
+      // evaluation.
+      ConstructorElement constructor = node.staticElement;
+      if (constructor != null) {
+        ConstantEvaluationEngine evaluationEngine =
+            new ConstantEvaluationEngine(_typeProvider, declaredVariables);
+        ConstantVisitor constantVisitor =
+            new ConstantVisitor(evaluationEngine, _errorReporter);
+        evaluationEngine.evaluateConstructorCall(
+            node,
+            node.argumentList.arguments,
+            constructor,
+            constantVisitor,
+            _errorReporter);
+      }
+    }
+    _validateInstanceCreationArguments(node);
+    return super.visitInstanceCreationExpression(node);
+  }
+
+  @override
+  Object visitListLiteral(ListLiteral node) {
+    super.visitListLiteral(node);
+    if (node.constKeyword != null) {
+      DartObjectImpl result;
+      for (Expression element in node.elements) {
+        result =
+            _validate(element, CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT);
+        if (result != null) {
+          _reportErrorIfFromDeferredLibrary(element,
+              CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY);
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitMapLiteral(MapLiteral node) {
+    super.visitMapLiteral(node);
+    bool isConst = node.constKeyword != null;
+    bool reportEqualKeys = true;
+    HashSet<DartObject> keys = new HashSet<DartObject>();
+    List<Expression> invalidKeys = new List<Expression>();
+    for (MapLiteralEntry entry in node.entries) {
+      Expression key = entry.key;
+      if (isConst) {
+        DartObjectImpl keyResult =
+            _validate(key, CompileTimeErrorCode.NON_CONSTANT_MAP_KEY);
+        Expression valueExpression = entry.value;
+        DartObjectImpl valueResult = _validate(
+            valueExpression, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE);
+        if (valueResult != null) {
+          _reportErrorIfFromDeferredLibrary(valueExpression,
+              CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY);
+        }
+        if (keyResult != null) {
+          _reportErrorIfFromDeferredLibrary(key,
+              CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY);
+          if (keys.contains(keyResult)) {
+            invalidKeys.add(key);
+          } else {
+            keys.add(keyResult);
+          }
+          DartType type = keyResult.type;
+          if (_implementsEqualsWhenNotAllowed(type)) {
+            _errorReporter.reportErrorForNode(
+                CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
+                key,
+                [type.displayName]);
+          }
+        }
+      } else {
+        // Note: we throw the errors away because this isn't actually a const.
+        AnalysisErrorListener errorListener =
+            AnalysisErrorListener.NULL_LISTENER;
+        ErrorReporter subErrorReporter =
+            new ErrorReporter(errorListener, _errorReporter.source);
+        DartObjectImpl result = key.accept(new ConstantVisitor(
+            new ConstantEvaluationEngine(_typeProvider, declaredVariables),
+            subErrorReporter));
+        if (result != null) {
+          if (keys.contains(result)) {
+            invalidKeys.add(key);
+          } else {
+            keys.add(result);
+          }
+        } else {
+          reportEqualKeys = false;
+        }
+      }
+    }
+    if (reportEqualKeys) {
+      for (Expression key in invalidKeys) {
+        _errorReporter.reportErrorForNode(
+            StaticWarningCode.EQUAL_KEYS_IN_MAP, key);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    super.visitMethodDeclaration(node);
+    _validateDefaultValues(node.parameters);
+    return null;
+  }
+
+  @override
+  Object visitSwitchStatement(SwitchStatement node) {
+    // TODO(paulberry): to minimize error messages, it would be nice to
+    // compare all types with the most popular type rather than the first
+    // type.
+    NodeList<SwitchMember> switchMembers = node.members;
+    bool foundError = false;
+    DartType firstType = null;
+    for (SwitchMember switchMember in switchMembers) {
+      if (switchMember is SwitchCase) {
+        SwitchCase switchCase = switchMember;
+        Expression expression = switchCase.expression;
+        DartObjectImpl caseResult = _validate(
+            expression, CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION);
+        if (caseResult != null) {
+          _reportErrorIfFromDeferredLibrary(expression,
+              CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY);
+          DartObject value = caseResult;
+          if (firstType == null) {
+            firstType = value.type;
+          } else {
+            DartType nType = value.type;
+            if (firstType != nType) {
+              _errorReporter.reportErrorForNode(
+                  CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES,
+                  expression,
+                  [expression.toSource(), firstType.displayName]);
+              foundError = true;
+            }
+          }
+        }
+      }
+    }
+    if (!foundError) {
+      _checkForCaseExpressionTypeImplementsEquals(node, firstType);
+    }
+    return super.visitSwitchStatement(node);
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    super.visitVariableDeclaration(node);
+    Expression initializer = node.initializer;
+    if (initializer != null && (node.isConst || node.isFinal)) {
+      VariableElementImpl element = node.element as VariableElementImpl;
+      EvaluationResultImpl result = element.evaluationResult;
+      if (result == null) {
+        // Variables marked "const" should have had their values computed by
+        // ConstantValueComputer.  Other variables will only have had their
+        // values computed if the value was needed (e.g. final variables in a
+        // class containing const constructors).
+        assert(!node.isConst);
+        return null;
+      }
+      _reportErrors(result.errors,
+          CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE);
+      _reportErrorIfFromDeferredLibrary(initializer,
+          CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY);
+    }
+    return null;
+  }
+
+  /**
+   * This verifies that the passed switch statement does not have a case expression with the
+   * operator '==' overridden.
+   *
+   * @param node the switch statement to evaluate
+   * @param type the common type of all 'case' expressions
+   * @return `true` if and only if an error code is generated on the passed node
+   * See [CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS].
+   */
+  bool _checkForCaseExpressionTypeImplementsEquals(
+      SwitchStatement node, DartType type) {
+    if (!_implementsEqualsWhenNotAllowed(type)) {
+      return false;
+    }
+    // report error
+    _errorReporter.reportErrorForToken(
+        CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
+        node.switchKeyword,
+        [type.displayName]);
+    return true;
+  }
+
+  /**
+   * @return `true` if given [Type] implements operator <i>==</i>, and it is not
+   *         <i>int</i> or <i>String</i>.
+   */
+  bool _implementsEqualsWhenNotAllowed(DartType type) {
+    // ignore int or String
+    if (type == null || type == _intType || type == _typeProvider.stringType) {
+      return false;
+    } else if (type == _typeProvider.doubleType) {
+      return true;
+    }
+    // prepare ClassElement
+    Element element = type.element;
+    if (element is! ClassElement) {
+      return false;
+    }
+    ClassElement classElement = element as ClassElement;
+    // lookup for ==
+    MethodElement method =
+        classElement.lookUpConcreteMethod("==", _currentLibrary);
+    if (method == null || method.enclosingElement.type.isObject) {
+      return false;
+    }
+    // there is == that we don't like
+    return true;
+  }
+
+  /**
+   * Given some computed [Expression], this method generates the passed [ErrorCode] on
+   * the node if its' value consists of information from a deferred library.
+   *
+   * @param expression the expression to be tested for a deferred library reference
+   * @param errorCode the error code to be used if the expression is or consists of a reference to a
+   *          deferred library
+   */
+  void _reportErrorIfFromDeferredLibrary(
+      Expression expression, ErrorCode errorCode) {
+    DeferredLibraryReferenceDetector referenceDetector =
+        new DeferredLibraryReferenceDetector();
+    expression.accept(referenceDetector);
+    if (referenceDetector.result) {
+      _errorReporter.reportErrorForNode(errorCode, expression);
+    }
+  }
+
+  /**
+   * Report any errors in the given list. Except for special cases, use the given error code rather
+   * than the one reported in the error.
+   *
+   * @param errors the errors that need to be reported
+   * @param errorCode the error code to be used
+   */
+  void _reportErrors(List<AnalysisError> errors, ErrorCode errorCode) {
+    for (AnalysisError data in errors) {
+      ErrorCode dataErrorCode = data.errorCode;
+      if (identical(dataErrorCode,
+              CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION) ||
+          identical(
+              dataErrorCode, CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE) ||
+          identical(dataErrorCode,
+              CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING) ||
+          identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL) ||
+          identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_INT) ||
+          identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM) ||
+          identical(dataErrorCode,
+              CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT) ||
+          identical(dataErrorCode,
+              CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH) ||
+          identical(dataErrorCode,
+              CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH) ||
+          identical(dataErrorCode,
+              CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH)) {
+        _errorReporter.reportError(data);
+      } else if (errorCode != null) {
+        _errorReporter.reportError(new AnalysisError(
+            data.source, data.offset, data.length, errorCode));
+      }
+    }
+  }
+
+  /**
+   * Validate that the given expression is a compile time constant. Return the value of the compile
+   * time constant, or `null` if the expression is not a compile time constant.
+   *
+   * @param expression the expression to be validated
+   * @param errorCode the error code to be used if the expression is not a compile time constant
+   * @return the value of the compile time constant
+   */
+  DartObjectImpl _validate(Expression expression, ErrorCode errorCode) {
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    ErrorReporter subErrorReporter =
+        new ErrorReporter(errorListener, _errorReporter.source);
+    DartObjectImpl result = expression.accept(new ConstantVisitor(
+        new ConstantEvaluationEngine(_typeProvider, declaredVariables),
+        subErrorReporter));
+    _reportErrors(errorListener.errors, errorCode);
+    return result;
+  }
+
+  /**
+   * Validate that if the passed arguments are constant expressions.
+   *
+   * @param argumentList the argument list to evaluate
+   */
+  void _validateConstantArguments(ArgumentList argumentList) {
+    for (Expression argument in argumentList.arguments) {
+      if (argument is NamedExpression) {
+        argument = (argument as NamedExpression).expression;
+      }
+      _validate(
+          argument, CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT);
+    }
+  }
+
+  /**
+   * Validates that the expressions of the given initializers (of a constant constructor) are all
+   * compile time constants.
+   *
+   * @param constructor the constant constructor declaration to validate
+   */
+  void _validateConstructorInitializers(ConstructorDeclaration constructor) {
+    List<ParameterElement> parameterElements =
+        constructor.parameters.parameterElements;
+    NodeList<ConstructorInitializer> initializers = constructor.initializers;
+    for (ConstructorInitializer initializer in initializers) {
+      if (initializer is ConstructorFieldInitializer) {
+        ConstructorFieldInitializer fieldInitializer = initializer;
+        _validateInitializerExpression(
+            parameterElements, fieldInitializer.expression);
+      }
+      if (initializer is RedirectingConstructorInvocation) {
+        RedirectingConstructorInvocation invocation = initializer;
+        _validateInitializerInvocationArguments(
+            parameterElements, invocation.argumentList);
+      }
+      if (initializer is SuperConstructorInvocation) {
+        SuperConstructorInvocation invocation = initializer;
+        _validateInitializerInvocationArguments(
+            parameterElements, invocation.argumentList);
+      }
+    }
+  }
+
+  /**
+   * Validate that the default value associated with each of the parameters in the given list is a
+   * compile time constant.
+   *
+   * @param parameters the list of parameters to be validated
+   */
+  void _validateDefaultValues(FormalParameterList parameters) {
+    if (parameters == null) {
+      return;
+    }
+    for (FormalParameter parameter in parameters.parameters) {
+      if (parameter is DefaultFormalParameter) {
+        DefaultFormalParameter defaultParameter = parameter;
+        Expression defaultValue = defaultParameter.defaultValue;
+        DartObjectImpl result;
+        if (defaultValue == null) {
+          result =
+              new DartObjectImpl(_typeProvider.nullType, NullState.NULL_STATE);
+        } else {
+          result = _validate(
+              defaultValue, CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE);
+          if (result != null) {
+            _reportErrorIfFromDeferredLibrary(defaultValue,
+                CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY);
+          }
+        }
+        VariableElementImpl element = parameter.element as VariableElementImpl;
+        element.evaluationResult = new EvaluationResultImpl(result);
+      }
+    }
+  }
+
+  /**
+   * Validates that the expressions of any field initializers in the class declaration are all
+   * compile time constants. Since this is only required if the class has a constant constructor,
+   * the error is reported at the constructor site.
+   *
+   * @param classDeclaration the class which should be validated
+   * @param errorSite the site at which errors should be reported.
+   */
+  void _validateFieldInitializers(
+      ClassDeclaration classDeclaration, ConstructorDeclaration errorSite) {
+    NodeList<ClassMember> members = classDeclaration.members;
+    for (ClassMember member in members) {
+      if (member is FieldDeclaration) {
+        FieldDeclaration fieldDeclaration = member;
+        if (!fieldDeclaration.isStatic) {
+          for (VariableDeclaration variableDeclaration
+              in fieldDeclaration.fields.variables) {
+            Expression initializer = variableDeclaration.initializer;
+            if (initializer != null) {
+              // Ignore any errors produced during validation--if the constant
+              // can't be eavluated we'll just report a single error.
+              AnalysisErrorListener errorListener =
+                  AnalysisErrorListener.NULL_LISTENER;
+              ErrorReporter subErrorReporter =
+                  new ErrorReporter(errorListener, _errorReporter.source);
+              DartObjectImpl result = initializer.accept(new ConstantVisitor(
+                  new ConstantEvaluationEngine(
+                      _typeProvider, declaredVariables),
+                  subErrorReporter));
+              if (result == null) {
+                _errorReporter.reportErrorForNode(
+                    CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST,
+                    errorSite,
+                    [variableDeclaration.name.name]);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  /**
+   * Validates that the given expression is a compile time constant.
+   *
+   * @param parameterElements the elements of parameters of constant constructor, they are
+   *          considered as a valid potentially constant expressions
+   * @param expression the expression to validate
+   */
+  void _validateInitializerExpression(
+      List<ParameterElement> parameterElements, Expression expression) {
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    ErrorReporter subErrorReporter =
+        new ErrorReporter(errorListener, _errorReporter.source);
+    DartObjectImpl result = expression.accept(
+        new _ConstantVerifier_validateInitializerExpression(_typeProvider,
+            subErrorReporter, this, parameterElements, declaredVariables));
+    _reportErrors(errorListener.errors,
+        CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER);
+    if (result != null) {
+      _reportErrorIfFromDeferredLibrary(expression,
+          CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY);
+    }
+  }
+
+  /**
+   * Validates that all of the arguments of a constructor initializer are compile time constants.
+   *
+   * @param parameterElements the elements of parameters of constant constructor, they are
+   *          considered as a valid potentially constant expressions
+   * @param argumentList the argument list to validate
+   */
+  void _validateInitializerInvocationArguments(
+      List<ParameterElement> parameterElements, ArgumentList argumentList) {
+    if (argumentList == null) {
+      return;
+    }
+    for (Expression argument in argumentList.arguments) {
+      _validateInitializerExpression(parameterElements, argument);
+    }
+  }
+
+  /**
+   * Validate that if the passed instance creation is 'const' then all its arguments are constant
+   * expressions.
+   *
+   * @param node the instance creation evaluate
+   */
+  void _validateInstanceCreationArguments(InstanceCreationExpression node) {
+    if (!node.isConst) {
+      return;
+    }
+    ArgumentList argumentList = node.argumentList;
+    if (argumentList == null) {
+      return;
+    }
+    _validateConstantArguments(argumentList);
+  }
+}
+
+/**
+ * Instances of the class `Dart2JSVerifier` traverse an AST structure looking for hints for
+ * code that will be compiled to JS, such as [HintCode.IS_DOUBLE].
+ */
+class Dart2JSVerifier extends RecursiveAstVisitor<Object> {
+  /**
+   * The name of the `double` type.
+   */
+  static String _DOUBLE_TYPE_NAME = "double";
+
+  /**
+   * The error reporter by which errors will be reported.
+   */
+  final ErrorReporter _errorReporter;
+
+  /**
+   * Create a new instance of the [Dart2JSVerifier].
+   *
+   * @param errorReporter the error reporter
+   */
+  Dart2JSVerifier(this._errorReporter);
+
+  @override
+  Object visitIsExpression(IsExpression node) {
+    _checkForIsDoubleHints(node);
+    return super.visitIsExpression(node);
+  }
+
+  /**
+   * Check for instances of `x is double`, `x is int`, `x is! double` and
+   * `x is! int`.
+   *
+   * @param node the is expression to check
+   * @return `true` if and only if a hint code is generated on the passed node
+   * See [HintCode.IS_DOUBLE],
+   * [HintCode.IS_INT],
+   * [HintCode.IS_NOT_DOUBLE], and
+   * [HintCode.IS_NOT_INT].
+   */
+  bool _checkForIsDoubleHints(IsExpression node) {
+    TypeName typeName = node.type;
+    DartType type = typeName.type;
+    if (type != null && type.element != null) {
+      Element element = type.element;
+      String typeNameStr = element.name;
+      LibraryElement libraryElement = element.library;
+      //      if (typeNameStr.equals(INT_TYPE_NAME) && libraryElement != null
+      //          && libraryElement.isDartCore()) {
+      //        if (node.getNotOperator() == null) {
+      //          errorReporter.reportError(HintCode.IS_INT, node);
+      //        } else {
+      //          errorReporter.reportError(HintCode.IS_NOT_INT, node);
+      //        }
+      //        return true;
+      //      } else
+      if (typeNameStr == _DOUBLE_TYPE_NAME &&
+          libraryElement != null &&
+          libraryElement.isDartCore) {
+        if (node.notOperator == null) {
+          _errorReporter.reportErrorForNode(HintCode.IS_DOUBLE, node);
+        } else {
+          _errorReporter.reportErrorForNode(HintCode.IS_NOT_DOUBLE, node);
+        }
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+/**
+ * Instances of the class `DeadCodeVerifier` traverse an AST structure looking for cases of
+ * [HintCode.DEAD_CODE].
+ */
+class DeadCodeVerifier extends RecursiveAstVisitor<Object> {
+  /**
+   * The error reporter by which errors will be reported.
+   */
+  final ErrorReporter _errorReporter;
+
+  /**
+   * Create a new instance of the [DeadCodeVerifier].
+   *
+   * @param errorReporter the error reporter
+   */
+  DeadCodeVerifier(this._errorReporter);
+
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    sc.Token operator = node.operator;
+    bool isAmpAmp = operator.type == sc.TokenType.AMPERSAND_AMPERSAND;
+    bool isBarBar = operator.type == sc.TokenType.BAR_BAR;
+    if (isAmpAmp || isBarBar) {
+      Expression lhsCondition = node.leftOperand;
+      if (!_isDebugConstant(lhsCondition)) {
+        EvaluationResultImpl lhsResult = _getConstantBooleanValue(lhsCondition);
+        if (lhsResult != null) {
+          if (lhsResult.value.isTrue && isBarBar) {
+            // report error on else block: true || !e!
+            _errorReporter.reportErrorForNode(
+                HintCode.DEAD_CODE, node.rightOperand);
+            // only visit the LHS:
+            _safelyVisit(lhsCondition);
+            return null;
+          } else if (lhsResult.value.isFalse && isAmpAmp) {
+            // report error on if block: false && !e!
+            _errorReporter.reportErrorForNode(
+                HintCode.DEAD_CODE, node.rightOperand);
+            // only visit the LHS:
+            _safelyVisit(lhsCondition);
+            return null;
+          }
+        }
+      }
+      // How do we want to handle the RHS? It isn't dead code, but "pointless"
+      // or "obscure"...
+//            Expression rhsCondition = node.getRightOperand();
+//            ValidResult rhsResult = getConstantBooleanValue(rhsCondition);
+//            if (rhsResult != null) {
+//              if (rhsResult == ValidResult.RESULT_TRUE && isBarBar) {
+//                // report error on else block: !e! || true
+//                errorReporter.reportError(HintCode.DEAD_CODE, node.getRightOperand());
+//                // only visit the RHS:
+//                safelyVisit(rhsCondition);
+//                return null;
+//              } else if (rhsResult == ValidResult.RESULT_FALSE && isAmpAmp) {
+//                // report error on if block: !e! && false
+//                errorReporter.reportError(HintCode.DEAD_CODE, node.getRightOperand());
+//                // only visit the RHS:
+//                safelyVisit(rhsCondition);
+//                return null;
+//              }
+//            }
+    }
+    return super.visitBinaryExpression(node);
+  }
+
+  /**
+   * For each [Block], this method reports and error on all statements between the end of the
+   * block and the first return statement (assuming there it is not at the end of the block.)
+   *
+   * @param node the block to evaluate
+   */
+  @override
+  Object visitBlock(Block node) {
+    NodeList<Statement> statements = node.statements;
+    _checkForDeadStatementsInNodeList(statements);
+    return null;
+  }
+
+  @override
+  Object visitConditionalExpression(ConditionalExpression node) {
+    Expression conditionExpression = node.condition;
+    _safelyVisit(conditionExpression);
+    if (!_isDebugConstant(conditionExpression)) {
+      EvaluationResultImpl result =
+          _getConstantBooleanValue(conditionExpression);
+      if (result != null) {
+        if (result.value.isTrue) {
+          // report error on else block: true ? 1 : !2!
+          _errorReporter.reportErrorForNode(
+              HintCode.DEAD_CODE, node.elseExpression);
+          _safelyVisit(node.thenExpression);
+          return null;
+        } else {
+          // report error on if block: false ? !1! : 2
+          _errorReporter.reportErrorForNode(
+              HintCode.DEAD_CODE, node.thenExpression);
+          _safelyVisit(node.elseExpression);
+          return null;
+        }
+      }
+    }
+    return super.visitConditionalExpression(node);
+  }
+
+  @override
+  Object visitIfStatement(IfStatement node) {
+    Expression conditionExpression = node.condition;
+    _safelyVisit(conditionExpression);
+    if (!_isDebugConstant(conditionExpression)) {
+      EvaluationResultImpl result =
+          _getConstantBooleanValue(conditionExpression);
+      if (result != null) {
+        if (result.value.isTrue) {
+          // report error on else block: if(true) {} else {!}
+          Statement elseStatement = node.elseStatement;
+          if (elseStatement != null) {
+            _errorReporter.reportErrorForNode(
+                HintCode.DEAD_CODE, elseStatement);
+            _safelyVisit(node.thenStatement);
+            return null;
+          }
+        } else {
+          // report error on if block: if (false) {!} else {}
+          _errorReporter.reportErrorForNode(
+              HintCode.DEAD_CODE, node.thenStatement);
+          _safelyVisit(node.elseStatement);
+          return null;
+        }
+      }
+    }
+    return super.visitIfStatement(node);
+  }
+
+  @override
+  Object visitSwitchCase(SwitchCase node) {
+    _checkForDeadStatementsInNodeList(node.statements);
+    return super.visitSwitchCase(node);
+  }
+
+  @override
+  Object visitSwitchDefault(SwitchDefault node) {
+    _checkForDeadStatementsInNodeList(node.statements);
+    return super.visitSwitchDefault(node);
+  }
+
+  @override
+  Object visitTryStatement(TryStatement node) {
+    _safelyVisit(node.body);
+    _safelyVisit(node.finallyBlock);
+    NodeList<CatchClause> catchClauses = node.catchClauses;
+    int numOfCatchClauses = catchClauses.length;
+    List<DartType> visitedTypes = new List<DartType>();
+    for (int i = 0; i < numOfCatchClauses; i++) {
+      CatchClause catchClause = catchClauses[i];
+      if (catchClause.onKeyword != null) {
+        // on-catch clause found, verify that the exception type is not a
+        // subtype of a previous on-catch exception type
+        TypeName typeName = catchClause.exceptionType;
+        if (typeName != null && typeName.type != null) {
+          DartType currentType = typeName.type;
+          if (currentType.isObject) {
+            // Found catch clause clause that has Object as an exception type,
+            // this is equivalent to having a catch clause that doesn't have an
+            // exception type, visit the block, but generate an error on any
+            // following catch clauses (and don't visit them).
+            _safelyVisit(catchClause);
+            if (i + 1 != numOfCatchClauses) {
+              // this catch clause is not the last in the try statement
+              CatchClause nextCatchClause = catchClauses[i + 1];
+              CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
+              int offset = nextCatchClause.offset;
+              int length = lastCatchClause.end - offset;
+              _errorReporter.reportErrorForOffset(
+                  HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length);
+              return null;
+            }
+          }
+          for (DartType type in visitedTypes) {
+            if (currentType.isSubtypeOf(type)) {
+              CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
+              int offset = catchClause.offset;
+              int length = lastCatchClause.end - offset;
+              _errorReporter.reportErrorForOffset(
+                  HintCode.DEAD_CODE_ON_CATCH_SUBTYPE,
+                  offset,
+                  length,
+                  [currentType.displayName, type.displayName]);
+              return null;
+            }
+          }
+          visitedTypes.add(currentType);
+        }
+        _safelyVisit(catchClause);
+      } else {
+        // Found catch clause clause that doesn't have an exception type,
+        // visit the block, but generate an error on any following catch clauses
+        // (and don't visit them).
+        _safelyVisit(catchClause);
+        if (i + 1 != numOfCatchClauses) {
+          // this catch clause is not the last in the try statement
+          CatchClause nextCatchClause = catchClauses[i + 1];
+          CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
+          int offset = nextCatchClause.offset;
+          int length = lastCatchClause.end - offset;
+          _errorReporter.reportErrorForOffset(
+              HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length);
+          return null;
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitWhileStatement(WhileStatement node) {
+    Expression conditionExpression = node.condition;
+    _safelyVisit(conditionExpression);
+    if (!_isDebugConstant(conditionExpression)) {
+      EvaluationResultImpl result =
+          _getConstantBooleanValue(conditionExpression);
+      if (result != null) {
+        if (result.value.isFalse) {
+          // report error on if block: while (false) {!}
+          _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.body);
+          return null;
+        }
+      }
+    }
+    _safelyVisit(node.body);
+    return null;
+  }
+
+  /**
+   * Given some [NodeList] of [Statement]s, from either a [Block] or
+   * [SwitchMember], this loops through the list in reverse order searching for statements
+   * after a return, unlabeled break or unlabeled continue statement to mark them as dead code.
+   *
+   * @param statements some ordered list of statements in a [Block] or [SwitchMember]
+   */
+  void _checkForDeadStatementsInNodeList(NodeList<Statement> statements) {
+    int size = statements.length;
+    for (int i = 0; i < size; i++) {
+      Statement currentStatement = statements[i];
+      _safelyVisit(currentStatement);
+      bool returnOrBreakingStatement = currentStatement is ReturnStatement ||
+          (currentStatement is BreakStatement &&
+              currentStatement.label == null) ||
+          (currentStatement is ContinueStatement &&
+              currentStatement.label == null);
+      if (returnOrBreakingStatement && i != size - 1) {
+        Statement nextStatement = statements[i + 1];
+        Statement lastStatement = statements[size - 1];
+        int offset = nextStatement.offset;
+        int length = lastStatement.end - offset;
+        _errorReporter.reportErrorForOffset(HintCode.DEAD_CODE, offset, length);
+        return;
+      }
+    }
+  }
+
+  /**
+   * Given some [Expression], this method returns [ValidResult.RESULT_TRUE] if it is
+   * `true`, [ValidResult.RESULT_FALSE] if it is `false`, or `null` if the
+   * expression is not a constant boolean value.
+   *
+   * @param expression the expression to evaluate
+   * @return [ValidResult.RESULT_TRUE] if it is `true`, [ValidResult.RESULT_FALSE]
+   *         if it is `false`, or `null` if the expression is not a constant boolean
+   *         value
+   */
+  EvaluationResultImpl _getConstantBooleanValue(Expression expression) {
+    if (expression is BooleanLiteral) {
+      if (expression.value) {
+        return new EvaluationResultImpl(
+            new DartObjectImpl(null, BoolState.from(true)));
+      } else {
+        return new EvaluationResultImpl(
+            new DartObjectImpl(null, BoolState.from(false)));
+      }
+    }
+    // Don't consider situations where we could evaluate to a constant boolean
+    // expression with the ConstantVisitor
+    // else {
+    // EvaluationResultImpl result = expression.accept(new ConstantVisitor());
+    // if (result == ValidResult.RESULT_TRUE) {
+    // return ValidResult.RESULT_TRUE;
+    // } else if (result == ValidResult.RESULT_FALSE) {
+    // return ValidResult.RESULT_FALSE;
+    // }
+    // return null;
+    // }
+    return null;
+  }
+
+  /**
+   * Return `true` if and only if the passed expression is resolved to a constant variable.
+   *
+   * @param expression some conditional expression
+   * @return `true` if and only if the passed expression is resolved to a constant variable
+   */
+  bool _isDebugConstant(Expression expression) {
+    Element element = null;
+    if (expression is Identifier) {
+      Identifier identifier = expression;
+      element = identifier.staticElement;
+    } else if (expression is PropertyAccess) {
+      PropertyAccess propertyAccess = expression;
+      element = propertyAccess.propertyName.staticElement;
+    }
+    if (element is PropertyAccessorElement) {
+      PropertyInducingElement variable = element.variable;
+      return variable != null && variable.isConst;
+    }
+    return false;
+  }
+
+  /**
+   * If the given node is not `null`, visit this instance of the dead code verifier.
+   *
+   * @param node the node to be visited
+   */
+  void _safelyVisit(AstNode node) {
+    if (node != null) {
+      node.accept(this);
+    }
+  }
+}
+
+/**
+ * Instances of the class `DeclarationResolver` are used to resolve declarations in an AST
+ * structure to already built elements.
+ */
+class DeclarationResolver extends RecursiveAstVisitor<Object> {
+  /**
+   * The compilation unit containing the AST nodes being visited.
+   */
+  CompilationUnitElement _enclosingUnit;
+
+  /**
+   * The function type alias containing the AST nodes being visited, or `null` if we are not
+   * in the scope of a function type alias.
+   */
+  FunctionTypeAliasElement _enclosingAlias;
+
+  /**
+   * The class containing the AST nodes being visited, or `null` if we are not in the scope of
+   * a class.
+   */
+  ClassElement _enclosingClass;
+
+  /**
+   * The method or function containing the AST nodes being visited, or `null` if we are not in
+   * the scope of a method or function.
+   */
+  ExecutableElement _enclosingExecutable;
+
+  /**
+   * The parameter containing the AST nodes being visited, or `null` if we are not in the
+   * scope of a parameter.
+   */
+  ParameterElement _enclosingParameter;
+
+  /**
+   * Resolve the declarations within the given compilation unit to the elements rooted at the given
+   * element.
+   *
+   * @param unit the compilation unit to be resolved
+   * @param element the root of the element model used to resolve the AST nodes
+   */
+  void resolve(CompilationUnit unit, CompilationUnitElement element) {
+    _enclosingUnit = element;
+    unit.element = element;
+    unit.accept(this);
+  }
+
+  @override
+  Object visitCatchClause(CatchClause node) {
+    SimpleIdentifier exceptionParameter = node.exceptionParameter;
+    if (exceptionParameter != null) {
+      List<LocalVariableElement> localVariables =
+          _enclosingExecutable.localVariables;
+      _findIdentifier(localVariables, exceptionParameter);
+      SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
+      if (stackTraceParameter != null) {
+        _findIdentifier(localVariables, stackTraceParameter);
+      }
+    }
+    return super.visitCatchClause(node);
+  }
+
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    ClassElement outerClass = _enclosingClass;
+    try {
+      SimpleIdentifier className = node.name;
+      _enclosingClass = _findIdentifier(_enclosingUnit.types, className);
+      return super.visitClassDeclaration(node);
+    } finally {
+      _enclosingClass = outerClass;
+    }
+  }
+
+  @override
+  Object visitClassTypeAlias(ClassTypeAlias node) {
+    ClassElement outerClass = _enclosingClass;
+    try {
+      SimpleIdentifier className = node.name;
+      _enclosingClass = _findIdentifier(_enclosingUnit.types, className);
+      return super.visitClassTypeAlias(node);
+    } finally {
+      _enclosingClass = outerClass;
+    }
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    ExecutableElement outerExecutable = _enclosingExecutable;
+    try {
+      SimpleIdentifier constructorName = node.name;
+      if (constructorName == null) {
+        _enclosingExecutable = _enclosingClass.unnamedConstructor;
+      } else {
+        _enclosingExecutable =
+            _enclosingClass.getNamedConstructor(constructorName.name);
+        constructorName.staticElement = _enclosingExecutable;
+      }
+      node.element = _enclosingExecutable as ConstructorElement;
+      return super.visitConstructorDeclaration(node);
+    } finally {
+      _enclosingExecutable = outerExecutable;
+    }
+  }
+
+  @override
+  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+    SimpleIdentifier variableName = node.identifier;
+    _findIdentifier(_enclosingExecutable.localVariables, variableName);
+    return super.visitDeclaredIdentifier(node);
+  }
+
+  @override
+  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+    SimpleIdentifier parameterName = node.parameter.identifier;
+    ParameterElement element = _getElementForParameter(node, parameterName);
+    Expression defaultValue = node.defaultValue;
+    if (defaultValue != null) {
+      ExecutableElement outerExecutable = _enclosingExecutable;
+      try {
+        if (element == null) {
+          // TODO(brianwilkerson) Report this internal error.
+        } else {
+          _enclosingExecutable = element.initializer;
+        }
+        defaultValue.accept(this);
+      } finally {
+        _enclosingExecutable = outerExecutable;
+      }
+    }
+    ParameterElement outerParameter = _enclosingParameter;
+    try {
+      _enclosingParameter = element;
+      return super.visitDefaultFormalParameter(node);
+    } finally {
+      _enclosingParameter = outerParameter;
+    }
+  }
+
+  @override
+  Object visitEnumDeclaration(EnumDeclaration node) {
+    ClassElement enclosingEnum =
+        _findIdentifier(_enclosingUnit.enums, node.name);
+    List<FieldElement> constants = enclosingEnum.fields;
+    for (EnumConstantDeclaration constant in node.constants) {
+      _findIdentifier(constants, constant.name);
+    }
+    return super.visitEnumDeclaration(node);
+  }
+
+  @override
+  Object visitExportDirective(ExportDirective node) {
+    String uri = _getStringValue(node.uri);
+    if (uri != null) {
+      LibraryElement library = _enclosingUnit.library;
+      ExportElement exportElement = _findExport(
+          library.exports,
+          _enclosingUnit.context.sourceFactory
+              .resolveUri(_enclosingUnit.source, uri));
+      node.element = exportElement;
+    }
+    return super.visitExportDirective(node);
+  }
+
+  @override
+  Object visitFieldFormalParameter(FieldFormalParameter node) {
+    if (node.parent is! DefaultFormalParameter) {
+      SimpleIdentifier parameterName = node.identifier;
+      ParameterElement element = _getElementForParameter(node, parameterName);
+      ParameterElement outerParameter = _enclosingParameter;
+      try {
+        _enclosingParameter = element;
+        return super.visitFieldFormalParameter(node);
+      } finally {
+        _enclosingParameter = outerParameter;
+      }
+    } else {
+      return super.visitFieldFormalParameter(node);
+    }
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    ExecutableElement outerExecutable = _enclosingExecutable;
+    try {
+      SimpleIdentifier functionName = node.name;
+      sc.Token property = node.propertyKeyword;
+      if (property == null) {
+        if (_enclosingExecutable != null) {
+          _enclosingExecutable =
+              _findIdentifier(_enclosingExecutable.functions, functionName);
+        } else {
+          _enclosingExecutable =
+              _findIdentifier(_enclosingUnit.functions, functionName);
+        }
+      } else {
+        PropertyAccessorElement accessor =
+            _findIdentifier(_enclosingUnit.accessors, functionName);
+        if ((property as sc.KeywordToken).keyword == sc.Keyword.SET) {
+          accessor = accessor.variable.setter;
+          functionName.staticElement = accessor;
+        }
+        _enclosingExecutable = accessor;
+      }
+      node.functionExpression.element = _enclosingExecutable;
+      return super.visitFunctionDeclaration(node);
+    } finally {
+      _enclosingExecutable = outerExecutable;
+    }
+  }
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    if (node.parent is! FunctionDeclaration) {
+      FunctionElement element =
+          _findAtOffset(_enclosingExecutable.functions, node.beginToken.offset);
+      node.element = element;
+    }
+    ExecutableElement outerExecutable = _enclosingExecutable;
+    try {
+      _enclosingExecutable = node.element;
+      return super.visitFunctionExpression(node);
+    } finally {
+      _enclosingExecutable = outerExecutable;
+    }
+  }
+
+  @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    FunctionTypeAliasElement outerAlias = _enclosingAlias;
+    try {
+      SimpleIdentifier aliasName = node.name;
+      _enclosingAlias =
+          _findIdentifier(_enclosingUnit.functionTypeAliases, aliasName);
+      return super.visitFunctionTypeAlias(node);
+    } finally {
+      _enclosingAlias = outerAlias;
+    }
+  }
+
+  @override
+  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    if (node.parent is! DefaultFormalParameter) {
+      SimpleIdentifier parameterName = node.identifier;
+      ParameterElement element = _getElementForParameter(node, parameterName);
+      ParameterElement outerParameter = _enclosingParameter;
+      try {
+        _enclosingParameter = element;
+        return super.visitFunctionTypedFormalParameter(node);
+      } finally {
+        _enclosingParameter = outerParameter;
+      }
+    } else {
+      return super.visitFunctionTypedFormalParameter(node);
+    }
+  }
+
+  @override
+  Object visitImportDirective(ImportDirective node) {
+    String uri = _getStringValue(node.uri);
+    if (uri != null) {
+      LibraryElement library = _enclosingUnit.library;
+      ImportElement importElement = _findImport(
+          library.imports,
+          _enclosingUnit.context.sourceFactory
+              .resolveUri(_enclosingUnit.source, uri),
+          node.prefix);
+      node.element = importElement;
+    }
+    return super.visitImportDirective(node);
+  }
+
+  @override
+  Object visitLabeledStatement(LabeledStatement node) {
+    for (Label label in node.labels) {
+      SimpleIdentifier labelName = label.label;
+      _findIdentifier(_enclosingExecutable.labels, labelName);
+    }
+    return super.visitLabeledStatement(node);
+  }
+
+  @override
+  Object visitLibraryDirective(LibraryDirective node) {
+    node.element = _enclosingUnit.library;
+    return super.visitLibraryDirective(node);
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    ExecutableElement outerExecutable = _enclosingExecutable;
+    try {
+      sc.Token property = node.propertyKeyword;
+      SimpleIdentifier methodName = node.name;
+      String nameOfMethod = methodName.name;
+      if (property == null) {
+        _enclosingExecutable = _findWithNameAndOffset(
+            _enclosingClass.methods, nameOfMethod, methodName.offset);
+        methodName.staticElement = _enclosingExecutable;
+      } else {
+        PropertyAccessorElement accessor =
+            _findIdentifier(_enclosingClass.accessors, methodName);
+        if ((property as sc.KeywordToken).keyword == sc.Keyword.SET) {
+          accessor = accessor.variable.setter;
+          methodName.staticElement = accessor;
+        }
+        _enclosingExecutable = accessor;
+      }
+      return super.visitMethodDeclaration(node);
+    } finally {
+      _enclosingExecutable = outerExecutable;
+    }
+  }
+
+  @override
+  Object visitPartDirective(PartDirective node) {
+    String uri = _getStringValue(node.uri);
+    if (uri != null) {
+      Source partSource = _enclosingUnit.context.sourceFactory
+          .resolveUri(_enclosingUnit.source, uri);
+      node.element = _findPart(_enclosingUnit.library.parts, partSource);
+    }
+    return super.visitPartDirective(node);
+  }
+
+  @override
+  Object visitPartOfDirective(PartOfDirective node) {
+    node.element = _enclosingUnit.library;
+    return super.visitPartOfDirective(node);
+  }
+
+  @override
+  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+    if (node.parent is! DefaultFormalParameter) {
+      SimpleIdentifier parameterName = node.identifier;
+      ParameterElement element = _getElementForParameter(node, parameterName);
+      ParameterElement outerParameter = _enclosingParameter;
+      try {
+        _enclosingParameter = element;
+        return super.visitSimpleFormalParameter(node);
+      } finally {
+        _enclosingParameter = outerParameter;
+      }
+    } else {}
+    return super.visitSimpleFormalParameter(node);
+  }
+
+  @override
+  Object visitSwitchCase(SwitchCase node) {
+    for (Label label in node.labels) {
+      SimpleIdentifier labelName = label.label;
+      _findIdentifier(_enclosingExecutable.labels, labelName);
+    }
+    return super.visitSwitchCase(node);
+  }
+
+  @override
+  Object visitSwitchDefault(SwitchDefault node) {
+    for (Label label in node.labels) {
+      SimpleIdentifier labelName = label.label;
+      _findIdentifier(_enclosingExecutable.labels, labelName);
+    }
+    return super.visitSwitchDefault(node);
+  }
+
+  @override
+  Object visitTypeParameter(TypeParameter node) {
+    SimpleIdentifier parameterName = node.name;
+    if (_enclosingClass != null) {
+      _findIdentifier(_enclosingClass.typeParameters, parameterName);
+    } else if (_enclosingAlias != null) {
+      _findIdentifier(_enclosingAlias.typeParameters, parameterName);
+    }
+    return super.visitTypeParameter(node);
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    VariableElement element = null;
+    SimpleIdentifier variableName = node.name;
+    if (_enclosingExecutable != null) {
+      element =
+          _findIdentifier(_enclosingExecutable.localVariables, variableName);
+    }
+    if (element == null && _enclosingClass != null) {
+      element = _findIdentifier(_enclosingClass.fields, variableName);
+    }
+    if (element == null && _enclosingUnit != null) {
+      element = _findIdentifier(_enclosingUnit.topLevelVariables, variableName);
+    }
+    Expression initializer = node.initializer;
+    if (initializer != null) {
+      ExecutableElement outerExecutable = _enclosingExecutable;
+      try {
+        if (element == null) {
+          // TODO(brianwilkerson) Report this internal error.
+        } else {
+          _enclosingExecutable = element.initializer;
+        }
+        return super.visitVariableDeclaration(node);
+      } finally {
+        _enclosingExecutable = outerExecutable;
+      }
+    }
+    return super.visitVariableDeclaration(node);
+  }
+
+  /**
+   * Return the element in the given array of elements that was created for the declaration at the
+   * given offset. This method should only be used when there is no name
+   *
+   * @param elements the elements of the appropriate kind that exist in the current context
+   * @param offset the offset of the name of the element to be returned
+   * @return the element at the given offset
+   */
+  Element _findAtOffset(List<Element> elements, int offset) =>
+      _findWithNameAndOffset(elements, "", offset);
+
+  /**
+   * Return the export element from the given array whose library has the given source, or
+   * `null` if there is no such export.
+   *
+   * @param exports the export elements being searched
+   * @param source the source of the library associated with the export element to being searched
+   *          for
+   * @return the export element whose library has the given source
+   */
+  ExportElement _findExport(List<ExportElement> exports, Source source) {
+    for (ExportElement export in exports) {
+      if (export.exportedLibrary.source == source) {
+        return export;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the element in the given array of elements that was created for the declaration with the
+   * given name.
+   *
+   * @param elements the elements of the appropriate kind that exist in the current context
+   * @param identifier the name node in the declaration of the element to be returned
+   * @return the element created for the declaration with the given name
+   */
+  Element _findIdentifier(List<Element> elements, SimpleIdentifier identifier) {
+    Element element =
+        _findWithNameAndOffset(elements, identifier.name, identifier.offset);
+    identifier.staticElement = element;
+    return element;
+  }
+
+  /**
+   * Return the import element from the given array whose library has the given source and that has
+   * the given prefix, or `null` if there is no such import.
+   *
+   * @param imports the import elements being searched
+   * @param source the source of the library associated with the import element to being searched
+   *          for
+   * @param prefix the prefix with which the library was imported
+   * @return the import element whose library has the given source and prefix
+   */
+  ImportElement _findImport(
+      List<ImportElement> imports, Source source, SimpleIdentifier prefix) {
+    for (ImportElement element in imports) {
+      if (element.importedLibrary.source == source) {
+        PrefixElement prefixElement = element.prefix;
+        if (prefix == null) {
+          if (prefixElement == null) {
+            return element;
+          }
+        } else {
+          if (prefixElement != null &&
+              prefix.name == prefixElement.displayName) {
+            return element;
+          }
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the element for the part with the given source, or `null` if there is no element
+   * for the given source.
+   *
+   * @param parts the elements for the parts
+   * @param partSource the source for the part whose element is to be returned
+   * @return the element for the part with the given source
+   */
+  CompilationUnitElement _findPart(
+      List<CompilationUnitElement> parts, Source partSource) {
+    for (CompilationUnitElement part in parts) {
+      if (part.source == partSource) {
+        return part;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the element in the given array of elements that was created for the declaration with the
+   * given name at the given offset.
+   *
+   * @param elements the elements of the appropriate kind that exist in the current context
+   * @param name the name of the element to be returned
+   * @param offset the offset of the name of the element to be returned
+   * @return the element with the given name and offset
+   */
+  Element _findWithNameAndOffset(
+      List<Element> elements, String name, int offset) {
+    for (Element element in elements) {
+      if (element.nameOffset == offset && element.displayName == name) {
+        return element;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Search the most closely enclosing list of parameters for a parameter with the given name.
+   *
+   * @param node the node defining the parameter with the given name
+   * @param parameterName the name of the parameter being searched for
+   * @return the element representing the parameter with that name
+   */
+  ParameterElement _getElementForParameter(
+      FormalParameter node, SimpleIdentifier parameterName) {
+    List<ParameterElement> parameters = null;
+    if (_enclosingParameter != null) {
+      parameters = _enclosingParameter.parameters;
+    }
+    if (parameters == null && _enclosingExecutable != null) {
+      parameters = _enclosingExecutable.parameters;
+    }
+    if (parameters == null && _enclosingAlias != null) {
+      parameters = _enclosingAlias.parameters;
+    }
+    ParameterElement element =
+        parameters == null ? null : _findIdentifier(parameters, parameterName);
+    if (element == null) {
+      StringBuffer buffer = new StringBuffer();
+      buffer.writeln("Invalid state found in the Analysis Engine:");
+      buffer.writeln(
+          "DeclarationResolver.getElementForParameter() is visiting a parameter that does not appear to be in a method or function.");
+      buffer.writeln("Ancestors:");
+      AstNode parent = node.parent;
+      while (parent != null) {
+        buffer.writeln(parent.runtimeType.toString());
+        buffer.writeln("---------");
+        parent = parent.parent;
+      }
+      AnalysisEngine.instance.logger.logError(buffer.toString(),
+          new CaughtException(new AnalysisException(), null));
+    }
+    return element;
+  }
+
+  /**
+   * Return the value of the given string literal, or `null` if the string is not a constant
+   * string without any string interpolation.
+   *
+   * @param literal the string literal whose value is to be returned
+   * @return the value of the given string literal
+   */
+  String _getStringValue(StringLiteral literal) {
+    if (literal is StringInterpolation) {
+      return null;
+    }
+    return literal.stringValue;
+  }
+}
+
+/**
+ * Instances of the class `ElementBuilder` traverse an AST structure and build the element
+ * model representing the AST structure.
+ */
+class ElementBuilder extends RecursiveAstVisitor<Object> {
+  /**
+   * The element holder associated with the element that is currently being built.
+   */
+  ElementHolder _currentHolder;
+
+  /**
+   * A flag indicating whether a variable declaration is in the context of a field declaration.
+   */
+  bool _inFieldContext = false;
+
+  /**
+   * A flag indicating whether a variable declaration is within the body of a method or function.
+   */
+  bool _inFunction = false;
+
+  /**
+   * A flag indicating whether the class currently being visited can be used as a mixin.
+   */
+  bool _isValidMixin = false;
+
+  /**
+   * A collection holding the function types defined in a class that need to have their type
+   * arguments set to the types of the type parameters for the class, or `null` if we are not
+   * currently processing nodes within a class.
+   */
+  List<FunctionTypeImpl> _functionTypesToFix = null;
+
+  /**
+   * A table mapping field names to field elements for the fields defined in the current class, or
+   * `null` if we are not in the scope of a class.
+   */
+  HashMap<String, FieldElement> _fieldMap;
+
+  /**
+   * Initialize a newly created element builder to build the elements for a compilation unit.
+   *
+   * @param initialHolder the element holder associated with the compilation unit being built
+   */
+  ElementBuilder(ElementHolder initialHolder) {
+    _currentHolder = initialHolder;
+  }
+
+  @override
+  Object visitBlock(Block node) {
+    bool wasInField = _inFieldContext;
+    _inFieldContext = false;
+    try {
+      node.visitChildren(this);
+    } finally {
+      _inFieldContext = wasInField;
+    }
+    return null;
+  }
+
+  @override
+  Object visitCatchClause(CatchClause node) {
+    SimpleIdentifier exceptionParameter = node.exceptionParameter;
+    if (exceptionParameter != null) {
+      // exception
+      LocalVariableElementImpl exception =
+          new LocalVariableElementImpl.forNode(exceptionParameter);
+      if (node.exceptionType == null) {
+        exception.hasImplicitType = true;
+      }
+      _currentHolder.addLocalVariable(exception);
+      exceptionParameter.staticElement = exception;
+      // stack trace
+      SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
+      if (stackTraceParameter != null) {
+        LocalVariableElementImpl stackTrace =
+            new LocalVariableElementImpl.forNode(stackTraceParameter);
+        _currentHolder.addLocalVariable(stackTrace);
+        stackTraceParameter.staticElement = stackTrace;
+      }
+    }
+    return super.visitCatchClause(node);
+  }
+
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    ElementHolder holder = new ElementHolder();
+    _isValidMixin = true;
+    _functionTypesToFix = new List<FunctionTypeImpl>();
+    //
+    // Process field declarations before constructors and methods so that field
+    // formal parameters can be correctly resolved to their fields.
+    //
+    ElementHolder previousHolder = _currentHolder;
+    _currentHolder = holder;
+    try {
+      List<ClassMember> nonFields = new List<ClassMember>();
+      node.visitChildren(
+          new _ElementBuilder_visitClassDeclaration(this, nonFields));
+      _buildFieldMap(holder.fieldsWithoutFlushing);
+      int count = nonFields.length;
+      for (int i = 0; i < count; i++) {
+        nonFields[i].accept(this);
+      }
+    } finally {
+      _currentHolder = previousHolder;
+    }
+    SimpleIdentifier className = node.name;
+    ClassElementImpl element = new ClassElementImpl.forNode(className);
+    List<TypeParameterElement> typeParameters = holder.typeParameters;
+    List<DartType> typeArguments = _createTypeParameterTypes(typeParameters);
+    InterfaceTypeImpl interfaceType = new InterfaceTypeImpl(element);
+    interfaceType.typeArguments = typeArguments;
+    element.type = interfaceType;
+    List<ConstructorElement> constructors = holder.constructors;
+    if (constructors.length == 0) {
+      //
+      // Create the default constructor.
+      //
+      constructors = _createDefaultConstructors(interfaceType);
+    }
+    element.abstract = node.isAbstract;
+    element.accessors = holder.accessors;
+    element.constructors = constructors;
+    element.fields = holder.fields;
+    element.methods = holder.methods;
+    element.typeParameters = typeParameters;
+    element.validMixin = _isValidMixin;
+    int functionTypeCount = _functionTypesToFix.length;
+    for (int i = 0; i < functionTypeCount; i++) {
+      _functionTypesToFix[i].typeArguments = typeArguments;
+    }
+    _functionTypesToFix = null;
+    _currentHolder.addType(element);
+    className.staticElement = element;
+    _fieldMap = null;
+    holder.validate();
+    return null;
+  }
+
+  /**
+   * Implementation of this method should be synchronized with
+   * [visitClassDeclaration].
+   */
+  void visitClassDeclarationIncrementally(ClassDeclaration node) {
+    //
+    // Process field declarations before constructors and methods so that field
+    // formal parameters can be correctly resolved to their fields.
+    //
+    ClassElement classElement = node.element;
+    _buildFieldMap(classElement.fields);
+  }
+
+  @override
+  Object visitClassTypeAlias(ClassTypeAlias node) {
+    ElementHolder holder = new ElementHolder();
+    _functionTypesToFix = new List<FunctionTypeImpl>();
+    _visitChildren(holder, node);
+    SimpleIdentifier className = node.name;
+    ClassElementImpl element = new ClassElementImpl.forNode(className);
+    element.abstract = node.abstractKeyword != null;
+    element.mixinApplication = true;
+    List<TypeParameterElement> typeParameters = holder.typeParameters;
+    element.typeParameters = typeParameters;
+    List<DartType> typeArguments = _createTypeParameterTypes(typeParameters);
+    InterfaceTypeImpl interfaceType = new InterfaceTypeImpl(element);
+    interfaceType.typeArguments = typeArguments;
+    element.type = interfaceType;
+    // set default constructor
+    for (FunctionTypeImpl functionType in _functionTypesToFix) {
+      functionType.typeArguments = typeArguments;
+    }
+    _functionTypesToFix = null;
+    _currentHolder.addType(element);
+    className.staticElement = element;
+    holder.validate();
+    return null;
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    _isValidMixin = false;
+    ElementHolder holder = new ElementHolder();
+    bool wasInFunction = _inFunction;
+    _inFunction = true;
+    try {
+      _visitChildren(holder, node);
+    } finally {
+      _inFunction = wasInFunction;
+    }
+    FunctionBody body = node.body;
+    SimpleIdentifier constructorName = node.name;
+    ConstructorElementImpl element =
+        new ConstructorElementImpl.forNode(constructorName);
+    if (node.externalKeyword != null) {
+      element.external = true;
+    }
+    if (node.factoryKeyword != null) {
+      element.factory = true;
+    }
+    element.functions = holder.functions;
+    element.labels = holder.labels;
+    element.localVariables = holder.localVariables;
+    element.parameters = holder.parameters;
+    element.const2 = node.constKeyword != null;
+    if (body.isAsynchronous) {
+      element.asynchronous = true;
+    }
+    if (body.isGenerator) {
+      element.generator = true;
+    }
+    _currentHolder.addConstructor(element);
+    node.element = element;
+    if (constructorName == null) {
+      Identifier returnType = node.returnType;
+      if (returnType != null) {
+        element.nameOffset = returnType.offset;
+        element.nameEnd = returnType.end;
+      }
+    } else {
+      constructorName.staticElement = element;
+      element.periodOffset = node.period.offset;
+      element.nameEnd = constructorName.end;
+    }
+    holder.validate();
+    return null;
+  }
+
+  @override
+  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+    SimpleIdentifier variableName = node.identifier;
+    LocalVariableElementImpl element =
+        new LocalVariableElementImpl.forNode(variableName);
+    ForEachStatement statement = node.parent as ForEachStatement;
+    int declarationEnd = node.offset + node.length;
+    int statementEnd = statement.offset + statement.length;
+    element.setVisibleRange(declarationEnd, statementEnd - declarationEnd - 1);
+    element.const3 = node.isConst;
+    element.final2 = node.isFinal;
+    if (node.type == null) {
+      element.hasImplicitType = true;
+    }
+    _currentHolder.addLocalVariable(element);
+    variableName.staticElement = element;
+    return super.visitDeclaredIdentifier(node);
+  }
+
+  @override
+  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+    ElementHolder holder = new ElementHolder();
+    NormalFormalParameter normalParameter = node.parameter;
+    SimpleIdentifier parameterName = normalParameter.identifier;
+    ParameterElementImpl parameter;
+    if (normalParameter is FieldFormalParameter) {
+      parameter = new DefaultFieldFormalParameterElementImpl(parameterName);
+      FieldElement field =
+          _fieldMap == null ? null : _fieldMap[parameterName.name];
+      if (field != null) {
+        (parameter as DefaultFieldFormalParameterElementImpl).field = field;
+      }
+    } else {
+      parameter = new DefaultParameterElementImpl(parameterName);
+    }
+    parameter.const3 = node.isConst;
+    parameter.final2 = node.isFinal;
+    parameter.parameterKind = node.kind;
+    // set initializer, default value range
+    Expression defaultValue = node.defaultValue;
+    if (defaultValue != null) {
+      _visit(holder, defaultValue);
+      FunctionElementImpl initializer =
+          new FunctionElementImpl.forOffset(defaultValue.beginToken.offset);
+      initializer.functions = holder.functions;
+      initializer.labels = holder.labels;
+      initializer.localVariables = holder.localVariables;
+      initializer.parameters = holder.parameters;
+      initializer.synthetic = true;
+      parameter.initializer = initializer;
+      parameter.defaultValueCode = defaultValue.toSource();
+    }
+    // visible range
+    _setParameterVisibleRange(node, parameter);
+    if (normalParameter is SimpleFormalParameter &&
+        normalParameter.type == null) {
+      parameter.hasImplicitType = true;
+    }
+    _currentHolder.addParameter(parameter);
+    parameterName.staticElement = parameter;
+    normalParameter.accept(this);
+    holder.validate();
+    return null;
+  }
+
+  @override
+  Object visitEnumDeclaration(EnumDeclaration node) {
+    SimpleIdentifier enumName = node.name;
+    ClassElementImpl enumElement = new ClassElementImpl.forNode(enumName);
+    enumElement.enum2 = true;
+    InterfaceTypeImpl enumType = new InterfaceTypeImpl(enumElement);
+    enumElement.type = enumType;
+    // The equivalent code for enums in the spec shows a single constructor,
+    // but that constructor is not callable (since it is a compile-time error
+    // to subclass, mix-in, implement, or explicitly instantiate an enum).  So
+    // we represent this as having no constructors.
+    enumElement.constructors = ConstructorElement.EMPTY_LIST;
+    _currentHolder.addEnum(enumElement);
+    enumName.staticElement = enumElement;
+    return super.visitEnumDeclaration(node);
+  }
+
+  @override
+  Object visitFieldDeclaration(FieldDeclaration node) {
+    bool wasInField = _inFieldContext;
+    _inFieldContext = true;
+    try {
+      node.visitChildren(this);
+    } finally {
+      _inFieldContext = wasInField;
+    }
+    return null;
+  }
+
+  @override
+  Object visitFieldFormalParameter(FieldFormalParameter node) {
+    if (node.parent is! DefaultFormalParameter) {
+      SimpleIdentifier parameterName = node.identifier;
+      FieldElement field =
+          _fieldMap == null ? null : _fieldMap[parameterName.name];
+      FieldFormalParameterElementImpl parameter =
+          new FieldFormalParameterElementImpl(parameterName);
+      parameter.const3 = node.isConst;
+      parameter.final2 = node.isFinal;
+      parameter.parameterKind = node.kind;
+      if (field != null) {
+        parameter.field = field;
+      }
+      _currentHolder.addParameter(parameter);
+      parameterName.staticElement = parameter;
+    }
+    //
+    // The children of this parameter include any parameters defined on the type
+    // of this parameter.
+    //
+    ElementHolder holder = new ElementHolder();
+    _visitChildren(holder, node);
+    ParameterElementImpl element = node.element;
+    element.parameters = holder.parameters;
+    element.typeParameters = holder.typeParameters;
+    holder.validate();
+    return null;
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    FunctionExpression expression = node.functionExpression;
+    if (expression != null) {
+      ElementHolder holder = new ElementHolder();
+      bool wasInFunction = _inFunction;
+      _inFunction = true;
+      try {
+        _visitChildren(holder, node);
+      } finally {
+        _inFunction = wasInFunction;
+      }
+      FunctionBody body = expression.body;
+      sc.Token property = node.propertyKeyword;
+      if (property == null || _inFunction) {
+        SimpleIdentifier functionName = node.name;
+        FunctionElementImpl element =
+            new FunctionElementImpl.forNode(functionName);
+        if (node.externalKeyword != null) {
+          element.external = true;
+        }
+        element.functions = holder.functions;
+        element.labels = holder.labels;
+        element.localVariables = holder.localVariables;
+        element.parameters = holder.parameters;
+        element.typeParameters = holder.typeParameters;
+        if (body.isAsynchronous) {
+          element.asynchronous = true;
+        }
+        if (body.isGenerator) {
+          element.generator = true;
+        }
+        if (_inFunction) {
+          Block enclosingBlock = node.getAncestor((node) => node is Block);
+          if (enclosingBlock != null) {
+            int functionEnd = node.offset + node.length;
+            int blockEnd = enclosingBlock.offset + enclosingBlock.length;
+            element.setVisibleRange(functionEnd, blockEnd - functionEnd - 1);
+          }
+        }
+        if (node.returnType == null) {
+          element.hasImplicitReturnType = true;
+        }
+        _currentHolder.addFunction(element);
+        expression.element = element;
+        functionName.staticElement = element;
+      } else {
+        SimpleIdentifier propertyNameNode = node.name;
+        if (propertyNameNode == null) {
+          // TODO(brianwilkerson) Report this internal error.
+          return null;
+        }
+        String propertyName = propertyNameNode.name;
+        TopLevelVariableElementImpl variable = _currentHolder
+            .getTopLevelVariable(propertyName) as TopLevelVariableElementImpl;
+        if (variable == null) {
+          variable = new TopLevelVariableElementImpl(node.name.name, -1);
+          variable.final2 = true;
+          variable.synthetic = true;
+          _currentHolder.addTopLevelVariable(variable);
+        }
+        if (node.isGetter) {
+          PropertyAccessorElementImpl getter =
+              new PropertyAccessorElementImpl.forNode(propertyNameNode);
+          if (node.externalKeyword != null) {
+            getter.external = true;
+          }
+          getter.functions = holder.functions;
+          getter.labels = holder.labels;
+          getter.localVariables = holder.localVariables;
+          if (body.isAsynchronous) {
+            getter.asynchronous = true;
+          }
+          if (body.isGenerator) {
+            getter.generator = true;
+          }
+          getter.variable = variable;
+          getter.getter = true;
+          getter.static = true;
+          variable.getter = getter;
+          if (node.returnType == null) {
+            getter.hasImplicitReturnType = true;
+          }
+          _currentHolder.addAccessor(getter);
+          expression.element = getter;
+          propertyNameNode.staticElement = getter;
+        } else {
+          PropertyAccessorElementImpl setter =
+              new PropertyAccessorElementImpl.forNode(propertyNameNode);
+          if (node.externalKeyword != null) {
+            setter.external = true;
+          }
+          setter.functions = holder.functions;
+          setter.labels = holder.labels;
+          setter.localVariables = holder.localVariables;
+          setter.parameters = holder.parameters;
+          if (body.isAsynchronous) {
+            setter.asynchronous = true;
+          }
+          if (body.isGenerator) {
+            setter.generator = true;
+          }
+          setter.variable = variable;
+          setter.setter = true;
+          setter.static = true;
+          variable.setter = setter;
+          variable.final2 = false;
+          _currentHolder.addAccessor(setter);
+          expression.element = setter;
+          propertyNameNode.staticElement = setter;
+        }
+      }
+      holder.validate();
+    }
+    return null;
+  }
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    if (node.parent is FunctionDeclaration) {
+      // visitFunctionDeclaration has already created the element for the
+      // declaration.  We just need to visit children.
+      return super.visitFunctionExpression(node);
+    }
+    ElementHolder holder = new ElementHolder();
+    bool wasInFunction = _inFunction;
+    _inFunction = true;
+    try {
+      _visitChildren(holder, node);
+    } finally {
+      _inFunction = wasInFunction;
+    }
+    FunctionBody body = node.body;
+    FunctionElementImpl element =
+        new FunctionElementImpl.forOffset(node.beginToken.offset);
+    element.functions = holder.functions;
+    element.labels = holder.labels;
+    element.localVariables = holder.localVariables;
+    element.parameters = holder.parameters;
+    element.typeParameters = holder.typeParameters;
+    if (body.isAsynchronous) {
+      element.asynchronous = true;
+    }
+    if (body.isGenerator) {
+      element.generator = true;
+    }
+    if (_inFunction) {
+      Block enclosingBlock = node.getAncestor((node) => node is Block);
+      if (enclosingBlock != null) {
+        int functionEnd = node.offset + node.length;
+        int blockEnd = enclosingBlock.offset + enclosingBlock.length;
+        element.setVisibleRange(functionEnd, blockEnd - functionEnd - 1);
+      }
+    }
+    FunctionTypeImpl type = new FunctionTypeImpl(element);
+    if (_functionTypesToFix != null) {
+      _functionTypesToFix.add(type);
+    }
+    element.type = type;
+    element.hasImplicitReturnType = true;
+    _currentHolder.addFunction(element);
+    node.element = element;
+    holder.validate();
+    return null;
+  }
+
+  @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    ElementHolder holder = new ElementHolder();
+    _visitChildren(holder, node);
+    SimpleIdentifier aliasName = node.name;
+    List<ParameterElement> parameters = holder.parameters;
+    List<TypeParameterElement> typeParameters = holder.typeParameters;
+    FunctionTypeAliasElementImpl element =
+        new FunctionTypeAliasElementImpl.forNode(aliasName);
+    element.parameters = parameters;
+    element.typeParameters = typeParameters;
+    FunctionTypeImpl type = new FunctionTypeImpl.forTypedef(element);
+    type.typeArguments = _createTypeParameterTypes(typeParameters);
+    element.type = type;
+    _currentHolder.addTypeAlias(element);
+    aliasName.staticElement = element;
+    holder.validate();
+    return null;
+  }
+
+  @override
+  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    if (node.parent is! DefaultFormalParameter) {
+      SimpleIdentifier parameterName = node.identifier;
+      ParameterElementImpl parameter =
+          new ParameterElementImpl.forNode(parameterName);
+      parameter.parameterKind = node.kind;
+      _setParameterVisibleRange(node, parameter);
+      _currentHolder.addParameter(parameter);
+      parameterName.staticElement = parameter;
+    }
+    //
+    // The children of this parameter include any parameters defined on the type
+    //of this parameter.
+    //
+    ElementHolder holder = new ElementHolder();
+    _visitChildren(holder, node);
+    ParameterElementImpl element = node.element;
+    element.parameters = holder.parameters;
+    element.typeParameters = holder.typeParameters;
+    holder.validate();
+    return null;
+  }
+
+  @override
+  Object visitLabeledStatement(LabeledStatement node) {
+    bool onSwitchStatement = node.statement is SwitchStatement;
+    for (Label label in node.labels) {
+      SimpleIdentifier labelName = label.label;
+      LabelElementImpl element =
+          new LabelElementImpl(labelName, onSwitchStatement, false);
+      _currentHolder.addLabel(element);
+      labelName.staticElement = element;
+    }
+    return super.visitLabeledStatement(node);
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    try {
+      ElementHolder holder = new ElementHolder();
+      bool wasInFunction = _inFunction;
+      _inFunction = true;
+      try {
+        _visitChildren(holder, node);
+      } finally {
+        _inFunction = wasInFunction;
+      }
+      bool isStatic = node.isStatic;
+      sc.Token property = node.propertyKeyword;
+      FunctionBody body = node.body;
+      if (property == null) {
+        SimpleIdentifier methodName = node.name;
+        String nameOfMethod = methodName.name;
+        if (nameOfMethod == sc.TokenType.MINUS.lexeme &&
+            node.parameters.parameters.length == 0) {
+          nameOfMethod = "unary-";
+        }
+        MethodElementImpl element =
+            new MethodElementImpl(nameOfMethod, methodName.offset);
+        element.abstract = node.isAbstract;
+        if (node.externalKeyword != null) {
+          element.external = true;
+        }
+        element.functions = holder.functions;
+        element.labels = holder.labels;
+        element.localVariables = holder.localVariables;
+        element.parameters = holder.parameters;
+        element.static = isStatic;
+        element.typeParameters = holder.typeParameters;
+        if (body.isAsynchronous) {
+          element.asynchronous = true;
+        }
+        if (body.isGenerator) {
+          element.generator = true;
+        }
+        if (node.returnType == null) {
+          element.hasImplicitReturnType = true;
+        }
+        _currentHolder.addMethod(element);
+        methodName.staticElement = element;
+      } else {
+        SimpleIdentifier propertyNameNode = node.name;
+        String propertyName = propertyNameNode.name;
+        FieldElementImpl field =
+            _currentHolder.getField(propertyName) as FieldElementImpl;
+        if (field == null) {
+          field = new FieldElementImpl(node.name.name, -1);
+          field.final2 = true;
+          field.static = isStatic;
+          field.synthetic = true;
+          _currentHolder.addField(field);
+        }
+        if (node.isGetter) {
+          PropertyAccessorElementImpl getter =
+              new PropertyAccessorElementImpl.forNode(propertyNameNode);
+          if (node.externalKeyword != null) {
+            getter.external = true;
+          }
+          getter.functions = holder.functions;
+          getter.labels = holder.labels;
+          getter.localVariables = holder.localVariables;
+          if (body.isAsynchronous) {
+            getter.asynchronous = true;
+          }
+          if (body.isGenerator) {
+            getter.generator = true;
+          }
+          getter.variable = field;
+          getter.abstract = node.isAbstract;
+          getter.getter = true;
+          getter.static = isStatic;
+          field.getter = getter;
+          if (node.returnType == null) {
+            getter.hasImplicitReturnType = true;
+          }
+          _currentHolder.addAccessor(getter);
+          propertyNameNode.staticElement = getter;
+        } else {
+          PropertyAccessorElementImpl setter =
+              new PropertyAccessorElementImpl.forNode(propertyNameNode);
+          if (node.externalKeyword != null) {
+            setter.external = true;
+          }
+          setter.functions = holder.functions;
+          setter.labels = holder.labels;
+          setter.localVariables = holder.localVariables;
+          setter.parameters = holder.parameters;
+          if (body.isAsynchronous) {
+            setter.asynchronous = true;
+          }
+          if (body.isGenerator) {
+            setter.generator = true;
+          }
+          setter.variable = field;
+          setter.abstract = node.isAbstract;
+          setter.setter = true;
+          setter.static = isStatic;
+          field.setter = setter;
+          field.final2 = false;
+          _currentHolder.addAccessor(setter);
+          propertyNameNode.staticElement = setter;
+        }
+      }
+      holder.validate();
+    } catch (exception, stackTrace) {
+      if (node.name.staticElement == null) {
+        ClassDeclaration classNode =
+            node.getAncestor((node) => node is ClassDeclaration);
+        StringBuffer buffer = new StringBuffer();
+        buffer.write("The element for the method ");
+        buffer.write(node.name);
+        buffer.write(" in ");
+        buffer.write(classNode.name);
+        buffer.write(" was not set while trying to build the element model.");
+        AnalysisEngine.instance.logger.logError(
+            buffer.toString(), new CaughtException(exception, stackTrace));
+      } else {
+        String message =
+            "Exception caught in ElementBuilder.visitMethodDeclaration()";
+        AnalysisEngine.instance.logger
+            .logError(message, new CaughtException(exception, stackTrace));
+      }
+    } finally {
+      if (node.name.staticElement == null) {
+        ClassDeclaration classNode =
+            node.getAncestor((node) => node is ClassDeclaration);
+        StringBuffer buffer = new StringBuffer();
+        buffer.write("The element for the method ");
+        buffer.write(node.name);
+        buffer.write(" in ");
+        buffer.write(classNode.name);
+        buffer.write(" was not set while trying to resolve types.");
+        AnalysisEngine.instance.logger.logError(
+            buffer.toString(),
+            new CaughtException(
+                new AnalysisException(buffer.toString()), null));
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+    if (node.parent is! DefaultFormalParameter) {
+      SimpleIdentifier parameterName = node.identifier;
+      ParameterElementImpl parameter =
+          new ParameterElementImpl.forNode(parameterName);
+      parameter.const3 = node.isConst;
+      parameter.final2 = node.isFinal;
+      parameter.parameterKind = node.kind;
+      _setParameterVisibleRange(node, parameter);
+      if (node.type == null) {
+        parameter.hasImplicitType = true;
+      }
+      _currentHolder.addParameter(parameter);
+      parameterName.staticElement = parameter;
+    }
+    return super.visitSimpleFormalParameter(node);
+  }
+
+  @override
+  Object visitSuperExpression(SuperExpression node) {
+    _isValidMixin = false;
+    return super.visitSuperExpression(node);
+  }
+
+  @override
+  Object visitSwitchCase(SwitchCase node) {
+    for (Label label in node.labels) {
+      SimpleIdentifier labelName = label.label;
+      LabelElementImpl element = new LabelElementImpl(labelName, false, true);
+      _currentHolder.addLabel(element);
+      labelName.staticElement = element;
+    }
+    return super.visitSwitchCase(node);
+  }
+
+  @override
+  Object visitSwitchDefault(SwitchDefault node) {
+    for (Label label in node.labels) {
+      SimpleIdentifier labelName = label.label;
+      LabelElementImpl element = new LabelElementImpl(labelName, false, true);
+      _currentHolder.addLabel(element);
+      labelName.staticElement = element;
+    }
+    return super.visitSwitchDefault(node);
+  }
+
+  @override
+  Object visitTypeParameter(TypeParameter node) {
+    SimpleIdentifier parameterName = node.name;
+    TypeParameterElementImpl typeParameter =
+        new TypeParameterElementImpl.forNode(parameterName);
+    TypeParameterTypeImpl typeParameterType =
+        new TypeParameterTypeImpl(typeParameter);
+    typeParameter.type = typeParameterType;
+    _currentHolder.addTypeParameter(typeParameter);
+    parameterName.staticElement = typeParameter;
+    return super.visitTypeParameter(node);
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    bool isConst = node.isConst;
+    bool isFinal = node.isFinal;
+    bool hasInitializer = node.initializer != null;
+    VariableElementImpl element;
+    if (_inFieldContext) {
+      SimpleIdentifier fieldName = node.name;
+      FieldElementImpl field;
+      if ((isConst || isFinal) && hasInitializer) {
+        field = new ConstFieldElementImpl.forNode(fieldName);
+      } else {
+        field = new FieldElementImpl.forNode(fieldName);
+      }
+      element = field;
+      if ((node.parent as VariableDeclarationList).type == null) {
+        field.hasImplicitType = true;
+      }
+      _currentHolder.addField(field);
+      fieldName.staticElement = field;
+    } else if (_inFunction) {
+      SimpleIdentifier variableName = node.name;
+      LocalVariableElementImpl variable;
+      if (isConst && hasInitializer) {
+        variable = new ConstLocalVariableElementImpl.forNode(variableName);
+      } else {
+        variable = new LocalVariableElementImpl.forNode(variableName);
+      }
+      element = variable;
+      Block enclosingBlock = node.getAncestor((node) => node is Block);
+      // TODO(brianwilkerson) This isn't right for variables declared in a for
+      // loop.
+      variable.setVisibleRange(enclosingBlock.offset, enclosingBlock.length);
+      if ((node.parent as VariableDeclarationList).type == null) {
+        variable.hasImplicitType = true;
+      }
+      _currentHolder.addLocalVariable(variable);
+      variableName.staticElement = element;
+    } else {
+      SimpleIdentifier variableName = node.name;
+      TopLevelVariableElementImpl variable;
+      if (isConst && hasInitializer) {
+        variable = new ConstTopLevelVariableElementImpl(variableName);
+      } else {
+        variable = new TopLevelVariableElementImpl.forNode(variableName);
+      }
+      element = variable;
+      if ((node.parent as VariableDeclarationList).type == null) {
+        variable.hasImplicitType = true;
+      }
+      _currentHolder.addTopLevelVariable(variable);
+      variableName.staticElement = element;
+    }
+    element.const3 = isConst;
+    element.final2 = isFinal;
+    if (hasInitializer) {
+      ElementHolder holder = new ElementHolder();
+      bool wasInFieldContext = _inFieldContext;
+      _inFieldContext = false;
+      try {
+        _visit(holder, node.initializer);
+      } finally {
+        _inFieldContext = wasInFieldContext;
+      }
+      FunctionElementImpl initializer =
+          new FunctionElementImpl.forOffset(node.initializer.beginToken.offset);
+      initializer.functions = holder.functions;
+      initializer.labels = holder.labels;
+      initializer.localVariables = holder.localVariables;
+      initializer.synthetic = true;
+      element.initializer = initializer;
+      holder.validate();
+    }
+    if (element is PropertyInducingElementImpl) {
+      if (_inFieldContext) {
+        (element as FieldElementImpl).static =
+            (node.parent.parent as FieldDeclaration).isStatic;
+      }
+      PropertyAccessorElementImpl getter =
+          new PropertyAccessorElementImpl.forVariable(element);
+      getter.getter = true;
+      if (element.hasImplicitType) {
+        getter.hasImplicitReturnType = true;
+      }
+      _currentHolder.addAccessor(getter);
+      element.getter = getter;
+      if (!isConst && !isFinal) {
+        PropertyAccessorElementImpl setter =
+            new PropertyAccessorElementImpl.forVariable(element);
+        setter.setter = true;
+        ParameterElementImpl parameter =
+            new ParameterElementImpl("_${element.name}", element.nameOffset);
+        parameter.synthetic = true;
+        parameter.parameterKind = ParameterKind.REQUIRED;
+        setter.parameters = <ParameterElement>[parameter];
+        _currentHolder.addAccessor(setter);
+        element.setter = setter;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Build the table mapping field names to field elements for the fields defined in the current
+   * class.
+   *
+   * @param fields the field elements defined in the current class
+   */
+  void _buildFieldMap(List<FieldElement> fields) {
+    _fieldMap = new HashMap<String, FieldElement>();
+    int count = fields.length;
+    for (int i = 0; i < count; i++) {
+      FieldElement field = fields[i];
+      _fieldMap[field.name] = field;
+    }
+  }
+
+  /**
+   * Creates the [ConstructorElement]s array with the single default constructor element.
+   *
+   * @param interfaceType the interface type for which to create a default constructor
+   * @return the [ConstructorElement]s array with the single default constructor element
+   */
+  List<ConstructorElement> _createDefaultConstructors(
+      InterfaceTypeImpl interfaceType) {
+    ConstructorElementImpl constructor =
+        new ConstructorElementImpl.forNode(null);
+    constructor.synthetic = true;
+    constructor.returnType = interfaceType;
+    FunctionTypeImpl type = new FunctionTypeImpl(constructor);
+    _functionTypesToFix.add(type);
+    constructor.type = type;
+    return <ConstructorElement>[constructor];
+  }
+
+  /**
+   * Create the types associated with the given type parameters, setting the type of each type
+   * parameter, and return an array of types corresponding to the given parameters.
+   *
+   * @param typeParameters the type parameters for which types are to be created
+   * @return an array of types corresponding to the given parameters
+   */
+  List<DartType> _createTypeParameterTypes(
+      List<TypeParameterElement> typeParameters) {
+    int typeParameterCount = typeParameters.length;
+    List<DartType> typeArguments = new List<DartType>(typeParameterCount);
+    for (int i = 0; i < typeParameterCount; i++) {
+      TypeParameterElementImpl typeParameter =
+          typeParameters[i] as TypeParameterElementImpl;
+      TypeParameterTypeImpl typeParameterType =
+          new TypeParameterTypeImpl(typeParameter);
+      typeParameter.type = typeParameterType;
+      typeArguments[i] = typeParameterType;
+    }
+    return typeArguments;
+  }
+
+  /**
+   * Return the body of the function that contains the given parameter, or `null` if no
+   * function body could be found.
+   *
+   * @param node the parameter contained in the function whose body is to be returned
+   * @return the body of the function that contains the given parameter
+   */
+  FunctionBody _getFunctionBody(FormalParameter node) {
+    AstNode parent = node.parent;
+    while (parent != null) {
+      if (parent is ConstructorDeclaration) {
+        return parent.body;
+      } else if (parent is FunctionExpression) {
+        return parent.body;
+      } else if (parent is MethodDeclaration) {
+        return parent.body;
+      }
+      parent = parent.parent;
+    }
+    return null;
+  }
+
+  /**
+   * Sets the visible source range for formal parameter.
+   */
+  void _setParameterVisibleRange(
+      FormalParameter node, ParameterElementImpl element) {
+    FunctionBody body = _getFunctionBody(node);
+    if (body != null) {
+      element.setVisibleRange(body.offset, body.length);
+    }
+  }
+
+  /**
+   * Make the given holder be the current holder while visiting the given node.
+   *
+   * @param holder the holder that will gather elements that are built while visiting the children
+   * @param node the node to be visited
+   */
+  void _visit(ElementHolder holder, AstNode node) {
+    if (node != null) {
+      ElementHolder previousHolder = _currentHolder;
+      _currentHolder = holder;
+      try {
+        node.accept(this);
+      } finally {
+        _currentHolder = previousHolder;
+      }
+    }
+  }
+
+  /**
+   * Make the given holder be the current holder while visiting the children of the given node.
+   *
+   * @param holder the holder that will gather elements that are built while visiting the children
+   * @param node the node whose children are to be visited
+   */
+  void _visitChildren(ElementHolder holder, AstNode node) {
+    if (node != null) {
+      ElementHolder previousHolder = _currentHolder;
+      _currentHolder = holder;
+      try {
+        node.visitChildren(this);
+      } finally {
+        _currentHolder = previousHolder;
+      }
+    }
+  }
+}
+
+/**
+ * Instances of the class `ElementHolder` hold on to elements created while traversing an AST
+ * structure so that they can be accessed when creating their enclosing element.
+ */
+class ElementHolder {
+  List<PropertyAccessorElement> _accessors;
+
+  List<ConstructorElement> _constructors;
+
+  List<ClassElement> _enums;
+
+  List<FieldElement> _fields;
+
+  List<FunctionElement> _functions;
+
+  List<LabelElement> _labels;
+
+  List<LocalVariableElement> _localVariables;
+
+  List<MethodElement> _methods;
+
+  List<ParameterElement> _parameters;
+
+  List<TopLevelVariableElement> _topLevelVariables;
+
+  List<ClassElement> _types;
+
+  List<FunctionTypeAliasElement> _typeAliases;
+
+  List<TypeParameterElement> _typeParameters;
+
+  List<PropertyAccessorElement> get accessors {
+    if (_accessors == null) {
+      return PropertyAccessorElement.EMPTY_LIST;
+    }
+    List<PropertyAccessorElement> result = _accessors;
+    _accessors = null;
+    return result;
+  }
+
+  List<ConstructorElement> get constructors {
+    if (_constructors == null) {
+      return ConstructorElement.EMPTY_LIST;
+    }
+    List<ConstructorElement> result = _constructors;
+    _constructors = null;
+    return result;
+  }
+
+  List<ClassElement> get enums {
+    if (_enums == null) {
+      return ClassElement.EMPTY_LIST;
+    }
+    List<ClassElement> result = _enums;
+    _enums = null;
+    return result;
+  }
+
+  List<FieldElement> get fields {
+    if (_fields == null) {
+      return FieldElement.EMPTY_LIST;
+    }
+    List<FieldElement> result = _fields;
+    _fields = null;
+    return result;
+  }
+
+  List<FieldElement> get fieldsWithoutFlushing {
+    if (_fields == null) {
+      return FieldElement.EMPTY_LIST;
+    }
+    List<FieldElement> result = _fields;
+    return result;
+  }
+
+  List<FunctionElement> get functions {
+    if (_functions == null) {
+      return FunctionElement.EMPTY_LIST;
+    }
+    List<FunctionElement> result = _functions;
+    _functions = null;
+    return result;
+  }
+
+  List<LabelElement> get labels {
+    if (_labels == null) {
+      return LabelElement.EMPTY_LIST;
+    }
+    List<LabelElement> result = _labels;
+    _labels = null;
+    return result;
+  }
+
+  List<LocalVariableElement> get localVariables {
+    if (_localVariables == null) {
+      return LocalVariableElement.EMPTY_LIST;
+    }
+    List<LocalVariableElement> result = _localVariables;
+    _localVariables = null;
+    return result;
+  }
+
+  List<MethodElement> get methods {
+    if (_methods == null) {
+      return MethodElement.EMPTY_LIST;
+    }
+    List<MethodElement> result = _methods;
+    _methods = null;
+    return result;
+  }
+
+  List<ParameterElement> get parameters {
+    if (_parameters == null) {
+      return ParameterElement.EMPTY_LIST;
+    }
+    List<ParameterElement> result = _parameters;
+    _parameters = null;
+    return result;
+  }
+
+  List<TopLevelVariableElement> get topLevelVariables {
+    if (_topLevelVariables == null) {
+      return TopLevelVariableElement.EMPTY_LIST;
+    }
+    List<TopLevelVariableElement> result = _topLevelVariables;
+    _topLevelVariables = null;
+    return result;
+  }
+
+  List<FunctionTypeAliasElement> get typeAliases {
+    if (_typeAliases == null) {
+      return FunctionTypeAliasElement.EMPTY_LIST;
+    }
+    List<FunctionTypeAliasElement> result = _typeAliases;
+    _typeAliases = null;
+    return result;
+  }
+
+  List<TypeParameterElement> get typeParameters {
+    if (_typeParameters == null) {
+      return TypeParameterElement.EMPTY_LIST;
+    }
+    List<TypeParameterElement> result = _typeParameters;
+    _typeParameters = null;
+    return result;
+  }
+
+  List<ClassElement> get types {
+    if (_types == null) {
+      return ClassElement.EMPTY_LIST;
+    }
+    List<ClassElement> result = _types;
+    _types = null;
+    return result;
+  }
+
+  void addAccessor(PropertyAccessorElement element) {
+    if (_accessors == null) {
+      _accessors = new List<PropertyAccessorElement>();
+    }
+    _accessors.add(element);
+  }
+
+  void addConstructor(ConstructorElement element) {
+    if (_constructors == null) {
+      _constructors = new List<ConstructorElement>();
+    }
+    _constructors.add(element);
+  }
+
+  void addEnum(ClassElement element) {
+    if (_enums == null) {
+      _enums = new List<ClassElement>();
+    }
+    _enums.add(element);
+  }
+
+  void addField(FieldElement element) {
+    if (_fields == null) {
+      _fields = new List<FieldElement>();
+    }
+    _fields.add(element);
+  }
+
+  void addFunction(FunctionElement element) {
+    if (_functions == null) {
+      _functions = new List<FunctionElement>();
+    }
+    _functions.add(element);
+  }
+
+  void addLabel(LabelElement element) {
+    if (_labels == null) {
+      _labels = new List<LabelElement>();
+    }
+    _labels.add(element);
+  }
+
+  void addLocalVariable(LocalVariableElement element) {
+    if (_localVariables == null) {
+      _localVariables = new List<LocalVariableElement>();
+    }
+    _localVariables.add(element);
+  }
+
+  void addMethod(MethodElement element) {
+    if (_methods == null) {
+      _methods = new List<MethodElement>();
+    }
+    _methods.add(element);
+  }
+
+  void addParameter(ParameterElement element) {
+    if (_parameters == null) {
+      _parameters = new List<ParameterElement>();
+    }
+    _parameters.add(element);
+  }
+
+  void addTopLevelVariable(TopLevelVariableElement element) {
+    if (_topLevelVariables == null) {
+      _topLevelVariables = new List<TopLevelVariableElement>();
+    }
+    _topLevelVariables.add(element);
+  }
+
+  void addType(ClassElement element) {
+    if (_types == null) {
+      _types = new List<ClassElement>();
+    }
+    _types.add(element);
+  }
+
+  void addTypeAlias(FunctionTypeAliasElement element) {
+    if (_typeAliases == null) {
+      _typeAliases = new List<FunctionTypeAliasElement>();
+    }
+    _typeAliases.add(element);
+  }
+
+  void addTypeParameter(TypeParameterElement element) {
+    if (_typeParameters == null) {
+      _typeParameters = new List<TypeParameterElement>();
+    }
+    _typeParameters.add(element);
+  }
+
+  FieldElement getField(String fieldName) {
+    if (_fields == null) {
+      return null;
+    }
+    for (FieldElement field in _fields) {
+      if (field.name == fieldName) {
+        return field;
+      }
+    }
+    return null;
+  }
+
+  TopLevelVariableElement getTopLevelVariable(String variableName) {
+    if (_topLevelVariables == null) {
+      return null;
+    }
+    for (TopLevelVariableElement variable in _topLevelVariables) {
+      if (variable.name == variableName) {
+        return variable;
+      }
+    }
+    return null;
+  }
+
+  void validate() {
+    StringBuffer buffer = new StringBuffer();
+    if (_accessors != null) {
+      buffer.write(_accessors.length);
+      buffer.write(" accessors");
+    }
+    if (_constructors != null) {
+      if (buffer.length > 0) {
+        buffer.write("; ");
+      }
+      buffer.write(_constructors.length);
+      buffer.write(" constructors");
+    }
+    if (_fields != null) {
+      if (buffer.length > 0) {
+        buffer.write("; ");
+      }
+      buffer.write(_fields.length);
+      buffer.write(" fields");
+    }
+    if (_functions != null) {
+      if (buffer.length > 0) {
+        buffer.write("; ");
+      }
+      buffer.write(_functions.length);
+      buffer.write(" functions");
+    }
+    if (_labels != null) {
+      if (buffer.length > 0) {
+        buffer.write("; ");
+      }
+      buffer.write(_labels.length);
+      buffer.write(" labels");
+    }
+    if (_localVariables != null) {
+      if (buffer.length > 0) {
+        buffer.write("; ");
+      }
+      buffer.write(_localVariables.length);
+      buffer.write(" local variables");
+    }
+    if (_methods != null) {
+      if (buffer.length > 0) {
+        buffer.write("; ");
+      }
+      buffer.write(_methods.length);
+      buffer.write(" methods");
+    }
+    if (_parameters != null) {
+      if (buffer.length > 0) {
+        buffer.write("; ");
+      }
+      buffer.write(_parameters.length);
+      buffer.write(" parameters");
+    }
+    if (_topLevelVariables != null) {
+      if (buffer.length > 0) {
+        buffer.write("; ");
+      }
+      buffer.write(_topLevelVariables.length);
+      buffer.write(" top-level variables");
+    }
+    if (_types != null) {
+      if (buffer.length > 0) {
+        buffer.write("; ");
+      }
+      buffer.write(_types.length);
+      buffer.write(" types");
+    }
+    if (_typeAliases != null) {
+      if (buffer.length > 0) {
+        buffer.write("; ");
+      }
+      buffer.write(_typeAliases.length);
+      buffer.write(" type aliases");
+    }
+    if (_typeParameters != null) {
+      if (buffer.length > 0) {
+        buffer.write("; ");
+      }
+      buffer.write(_typeParameters.length);
+      buffer.write(" type parameters");
+    }
+    if (buffer.length > 0) {
+      AnalysisEngine.instance.logger
+          .logError("Failed to capture elements: $buffer");
+    }
+  }
+}
+
+/**
+ * Instances of the class `EnclosedScope` implement a scope that is lexically enclosed in
+ * another scope.
+ */
+class EnclosedScope extends Scope {
+  /**
+   * The scope in which this scope is lexically enclosed.
+   */
+  final Scope enclosingScope;
+
+  /**
+   * A table mapping names that will be defined in this scope, but right now are not initialized.
+   * According to the scoping rules these names are hidden, even if they were defined in an outer
+   * scope.
+   */
+  HashMap<String, Element> _hiddenElements = new HashMap<String, Element>();
+
+  /**
+   * A flag indicating whether there are any names defined in this scope.
+   */
+  bool _hasHiddenName = false;
+
+  /**
+   * Initialize a newly created scope enclosed within another scope.
+   *
+   * @param enclosingScope the scope in which this scope is lexically enclosed
+   */
+  EnclosedScope(this.enclosingScope);
+
+  @override
+  AnalysisErrorListener get errorListener => enclosingScope.errorListener;
+
+  /**
+   * Record that given element is declared in this scope, but hasn't been initialized yet, so it is
+   * error to use. If there is already an element with the given name defined in an outer scope,
+   * then it will become unavailable.
+   *
+   * @param element the element declared, but not initialized in this scope
+   */
+  void hide(Element element) {
+    if (element != null) {
+      String name = element.name;
+      if (name != null && !name.isEmpty) {
+        _hiddenElements[name] = element;
+        _hasHiddenName = true;
+      }
+    }
+  }
+
+  @override
+  Element internalLookup(
+      Identifier identifier, String name, LibraryElement referencingLibrary) {
+    Element element = localLookup(name, referencingLibrary);
+    if (element != null) {
+      return element;
+    }
+    // May be there is a hidden Element.
+    if (_hasHiddenName) {
+      Element hiddenElement = _hiddenElements[name];
+      if (hiddenElement != null) {
+        errorListener.onError(new AnalysisError(
+            getSource(identifier),
+            identifier.offset,
+            identifier.length,
+            CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, []));
+        return hiddenElement;
+      }
+    }
+    // Check enclosing scope.
+    return enclosingScope.internalLookup(identifier, name, referencingLibrary);
+  }
+}
+
+/**
+ * Instances of the class `EnumMemberBuilder` build the members in enum declarations.
+ */
+class EnumMemberBuilder extends RecursiveAstVisitor<Object> {
+  /**
+   * The type provider used to access the types needed to build an element model for enum
+   * declarations.
+   */
+  final TypeProvider _typeProvider;
+
+  /**
+   * Initialize a newly created enum member builder.
+   *
+   * @param typeProvider the type provider used to access the types needed to build an element model
+   *          for enum declarations
+   */
+  EnumMemberBuilder(this._typeProvider);
+
+  @override
+  Object visitEnumDeclaration(EnumDeclaration node) {
+    //
+    // Finish building the enum.
+    //
+    ClassElementImpl enumElement = node.name.staticElement as ClassElementImpl;
+    InterfaceType enumType = enumElement.type;
+    enumElement.supertype = _typeProvider.objectType;
+    //
+    // Populate the fields.
+    //
+    List<FieldElement> fields = new List<FieldElement>();
+    List<PropertyAccessorElement> getters = new List<PropertyAccessorElement>();
+    InterfaceType intType = _typeProvider.intType;
+    String indexFieldName = "index";
+    FieldElementImpl indexField = new FieldElementImpl(indexFieldName, -1);
+    indexField.final2 = true;
+    indexField.synthetic = true;
+    indexField.type = intType;
+    fields.add(indexField);
+    getters.add(_createGetter(indexField));
+    ConstFieldElementImpl valuesField = new ConstFieldElementImpl("values", -1);
+    valuesField.static = true;
+    valuesField.const3 = true;
+    valuesField.synthetic = true;
+    valuesField.type = _typeProvider.listType.substitute4(<DartType>[enumType]);
+    fields.add(valuesField);
+    getters.add(_createGetter(valuesField));
+    //
+    // Build the enum constants.
+    //
+    NodeList<EnumConstantDeclaration> constants = node.constants;
+    List<DartObjectImpl> constantValues = new List<DartObjectImpl>();
+    int constantCount = constants.length;
+    for (int i = 0; i < constantCount; i++) {
+      SimpleIdentifier constantName = constants[i].name;
+      FieldElementImpl constantField =
+          new ConstFieldElementImpl.forNode(constantName);
+      constantField.static = true;
+      constantField.const3 = true;
+      constantField.type = enumType;
+      //
+      // Create a value for the constant.
+      //
+      HashMap<String, DartObjectImpl> fieldMap =
+          new HashMap<String, DartObjectImpl>();
+      fieldMap[indexFieldName] = new DartObjectImpl(intType, new IntState(i));
+      DartObjectImpl value =
+          new DartObjectImpl(enumType, new GenericState(fieldMap));
+      constantValues.add(value);
+      constantField.evaluationResult = new EvaluationResultImpl(value);
+      fields.add(constantField);
+      getters.add(_createGetter(constantField));
+      constantName.staticElement = constantField;
+    }
+    //
+    // Build the value of the 'values' field.
+    //
+    valuesField.evaluationResult = new EvaluationResultImpl(
+        new DartObjectImpl(valuesField.type, new ListState(constantValues)));
+    //
+    // Finish building the enum.
+    //
+    enumElement.fields = fields;
+    enumElement.accessors = getters;
+    // Client code isn't allowed to invoke the constructor, so we do not model
+    // it.
+    return super.visitEnumDeclaration(node);
+  }
+
+  /**
+   * Create a getter that corresponds to the given field.
+   *
+   * @param field the field for which a getter is to be created
+   * @return the getter that was created
+   */
+  PropertyAccessorElement _createGetter(FieldElementImpl field) {
+    PropertyAccessorElementImpl getter =
+        new PropertyAccessorElementImpl.forVariable(field);
+    getter.getter = true;
+    getter.returnType = field.type;
+    getter.type = new FunctionTypeImpl(getter);
+    field.getter = getter;
+    return getter;
+  }
+}
+
+/**
+ * Instances of the class `ExitDetector` determine whether the visited AST node is guaranteed
+ * to terminate by executing a `return` statement, `throw` expression, `rethrow`
+ * expression, or simple infinite loop such as `while(true)`.
+ */
+class ExitDetector extends GeneralizingAstVisitor<bool> {
+  /**
+   * Set to `true` when a `break` is encountered, and reset to `false` when a
+   * `do`, `while`, `for` or `switch` block is entered.
+   */
+  bool _enclosingBlockContainsBreak = false;
+
+  @override
+  bool visitArgumentList(ArgumentList node) =>
+      _visitExpressions(node.arguments);
+
+  @override
+  bool visitAsExpression(AsExpression node) => _nodeExits(node.expression);
+
+  @override
+  bool visitAssertStatement(AssertStatement node) => _nodeExits(node.condition);
+
+  @override
+  bool visitAssignmentExpression(AssignmentExpression node) =>
+      _nodeExits(node.leftHandSide) || _nodeExits(node.rightHandSide);
+
+  @override
+  bool visitAwaitExpression(AwaitExpression node) =>
+      _nodeExits(node.expression);
+
+  @override
+  bool visitBinaryExpression(BinaryExpression node) {
+    Expression lhsExpression = node.leftOperand;
+    sc.TokenType operatorType = node.operator.type;
+    // If the operator is || and the left hand side is false literal, don't
+    // consider the RHS of the binary expression.
+    // TODO(jwren) Do we want to take constant expressions into account,
+    // evaluate if(false) {} differently than if(<condition>), when <condition>
+    // evaluates to a constant false value?
+    if (operatorType == sc.TokenType.BAR_BAR) {
+      if (lhsExpression is BooleanLiteral) {
+        BooleanLiteral booleanLiteral = lhsExpression;
+        if (!booleanLiteral.value) {
+          return false;
+        }
+      }
+    }
+    // If the operator is && and the left hand side is true literal, don't
+    // consider the RHS of the binary expression.
+    if (operatorType == sc.TokenType.AMPERSAND_AMPERSAND) {
+      if (lhsExpression is BooleanLiteral) {
+        BooleanLiteral booleanLiteral = lhsExpression;
+        if (booleanLiteral.value) {
+          return false;
+        }
+      }
+    }
+    Expression rhsExpression = node.rightOperand;
+    return _nodeExits(lhsExpression) || _nodeExits(rhsExpression);
+  }
+
+  @override
+  bool visitBlock(Block node) => _visitStatements(node.statements);
+
+  @override
+  bool visitBlockFunctionBody(BlockFunctionBody node) => _nodeExits(node.block);
+
+  @override
+  bool visitBreakStatement(BreakStatement node) {
+    _enclosingBlockContainsBreak = true;
+    return false;
+  }
+
+  @override
+  bool visitCascadeExpression(CascadeExpression node) =>
+      _nodeExits(node.target) || _visitExpressions(node.cascadeSections);
+
+  @override
+  bool visitConditionalExpression(ConditionalExpression node) {
+    Expression conditionExpression = node.condition;
+    Expression thenStatement = node.thenExpression;
+    Expression elseStatement = node.elseExpression;
+    // TODO(jwren) Do we want to take constant expressions into account,
+    // evaluate if(false) {} differently than if(<condition>), when <condition>
+    // evaluates to a constant false value?
+    if (_nodeExits(conditionExpression)) {
+      return true;
+    }
+    if (thenStatement == null || elseStatement == null) {
+      return false;
+    }
+    return thenStatement.accept(this) && elseStatement.accept(this);
+  }
+
+  @override
+  bool visitContinueStatement(ContinueStatement node) => false;
+
+  @override
+  bool visitDoStatement(DoStatement node) {
+    bool outerBreakValue = _enclosingBlockContainsBreak;
+    _enclosingBlockContainsBreak = false;
+    try {
+      Expression conditionExpression = node.condition;
+      if (_nodeExits(conditionExpression)) {
+        return true;
+      }
+      // TODO(jwren) Do we want to take all constant expressions into account?
+      if (conditionExpression is BooleanLiteral) {
+        BooleanLiteral booleanLiteral = conditionExpression;
+        // If do {} while (true), and the body doesn't return or the body
+        // doesn't have a break, then return true.
+        bool blockReturns = _nodeExits(node.body);
+        if (booleanLiteral.value &&
+            (blockReturns || !_enclosingBlockContainsBreak)) {
+          return true;
+        }
+      }
+      return false;
+    } finally {
+      _enclosingBlockContainsBreak = outerBreakValue;
+    }
+  }
+
+  @override
+  bool visitEmptyStatement(EmptyStatement node) => false;
+
+  @override
+  bool visitExpressionStatement(ExpressionStatement node) =>
+      _nodeExits(node.expression);
+
+  @override
+  bool visitForEachStatement(ForEachStatement node) {
+    bool outerBreakValue = _enclosingBlockContainsBreak;
+    _enclosingBlockContainsBreak = false;
+    try {
+      return _nodeExits(node.iterable);
+    } finally {
+      _enclosingBlockContainsBreak = outerBreakValue;
+    }
+  }
+
+  @override
+  bool visitForStatement(ForStatement node) {
+    bool outerBreakValue = _enclosingBlockContainsBreak;
+    _enclosingBlockContainsBreak = false;
+    try {
+      if (node.variables != null &&
+          _visitVariableDeclarations(node.variables.variables)) {
+        return true;
+      }
+      if (node.initialization != null && _nodeExits(node.initialization)) {
+        return true;
+      }
+      Expression conditionExpression = node.condition;
+      if (conditionExpression != null && _nodeExits(conditionExpression)) {
+        return true;
+      }
+      if (_visitExpressions(node.updaters)) {
+        return true;
+      }
+      // TODO(jwren) Do we want to take all constant expressions into account?
+      // If for(; true; ) (or for(;;)), and the body doesn't return or the body
+      // doesn't have a break, then return true.
+      bool implicitOrExplictTrue = conditionExpression == null ||
+          (conditionExpression is BooleanLiteral && conditionExpression.value);
+      if (implicitOrExplictTrue) {
+        bool blockReturns = _nodeExits(node.body);
+        if (blockReturns || !_enclosingBlockContainsBreak) {
+          return true;
+        }
+      }
+      return false;
+    } finally {
+      _enclosingBlockContainsBreak = outerBreakValue;
+    }
+  }
+
+  @override
+  bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) =>
+      false;
+
+  @override
+  bool visitFunctionExpression(FunctionExpression node) => false;
+
+  @override
+  bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    if (_nodeExits(node.function)) {
+      return true;
+    }
+    return node.argumentList.accept(this);
+  }
+
+  @override
+  bool visitIdentifier(Identifier node) => false;
+
+  @override
+  bool visitIfStatement(IfStatement node) {
+    Expression conditionExpression = node.condition;
+    Statement thenStatement = node.thenStatement;
+    Statement elseStatement = node.elseStatement;
+    if (_nodeExits(conditionExpression)) {
+      return true;
+    }
+    // TODO(jwren) Do we want to take all constant expressions into account?
+    if (conditionExpression is BooleanLiteral) {
+      BooleanLiteral booleanLiteral = conditionExpression;
+      if (booleanLiteral.value) {
+        // if(true) ...
+        return _nodeExits(thenStatement);
+      } else if (elseStatement != null) {
+        // if (false) ...
+        return _nodeExits(elseStatement);
+      }
+    }
+    if (thenStatement == null || elseStatement == null) {
+      return false;
+    }
+    return _nodeExits(thenStatement) && _nodeExits(elseStatement);
+  }
+
+  @override
+  bool visitIndexExpression(IndexExpression node) {
+    Expression target = node.realTarget;
+    if (_nodeExits(target)) {
+      return true;
+    }
+    if (_nodeExits(node.index)) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitInstanceCreationExpression(InstanceCreationExpression node) =>
+      _nodeExits(node.argumentList);
+
+  @override
+  bool visitIsExpression(IsExpression node) => node.expression.accept(this);
+
+  @override
+  bool visitLabel(Label node) => false;
+
+  @override
+  bool visitLabeledStatement(LabeledStatement node) =>
+      node.statement.accept(this);
+
+  @override
+  bool visitLiteral(Literal node) => false;
+
+  @override
+  bool visitMethodInvocation(MethodInvocation node) {
+    Expression target = node.realTarget;
+    if (target != null && target.accept(this)) {
+      return true;
+    }
+    return _nodeExits(node.argumentList);
+  }
+
+  @override
+  bool visitNamedExpression(NamedExpression node) =>
+      node.expression.accept(this);
+
+  @override
+  bool visitParenthesizedExpression(ParenthesizedExpression node) =>
+      node.expression.accept(this);
+
+  @override
+  bool visitPostfixExpression(PostfixExpression node) => false;
+
+  @override
+  bool visitPrefixExpression(PrefixExpression node) => false;
+
+  @override
+  bool visitPropertyAccess(PropertyAccess node) {
+    Expression target = node.realTarget;
+    if (target != null && target.accept(this)) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitRethrowExpression(RethrowExpression node) => true;
+
+  @override
+  bool visitReturnStatement(ReturnStatement node) => true;
+
+  @override
+  bool visitSuperExpression(SuperExpression node) => false;
+
+  @override
+  bool visitSwitchCase(SwitchCase node) => _visitStatements(node.statements);
+
+  @override
+  bool visitSwitchDefault(SwitchDefault node) =>
+      _visitStatements(node.statements);
+
+  @override
+  bool visitSwitchStatement(SwitchStatement node) {
+    bool outerBreakValue = _enclosingBlockContainsBreak;
+    _enclosingBlockContainsBreak = false;
+    try {
+      bool hasDefault = false;
+      List<SwitchMember> members = node.members;
+      for (int i = 0; i < members.length; i++) {
+        SwitchMember switchMember = members[i];
+        if (switchMember is SwitchDefault) {
+          hasDefault = true;
+          // If this is the last member and there are no statements, return
+          // false
+          if (switchMember.statements.isEmpty && i + 1 == members.length) {
+            return false;
+          }
+        }
+        // For switch members with no statements, don't visit the children,
+        // otherwise, return false if no return is found in the children
+        // statements.
+        if (!switchMember.statements.isEmpty && !switchMember.accept(this)) {
+          return false;
+        }
+      }
+      // All of the members exit, determine whether there are possible cases
+      // that are not caught by the members.
+      DartType type = node.expression == null ? null : node.expression.bestType;
+      if (type is InterfaceType) {
+        ClassElement element = type.element;
+        if (element != null && element.isEnum) {
+          // If some of the enum values are not covered, then a warning will
+          // have already been generated, so there's no point in generating a
+          // hint.
+          return true;
+        }
+      }
+      return hasDefault;
+    } finally {
+      _enclosingBlockContainsBreak = outerBreakValue;
+    }
+  }
+
+  @override
+  bool visitThisExpression(ThisExpression node) => false;
+
+  @override
+  bool visitThrowExpression(ThrowExpression node) => true;
+
+  @override
+  bool visitTryStatement(TryStatement node) {
+    if (_nodeExits(node.body)) {
+      return true;
+    }
+    Block finallyBlock = node.finallyBlock;
+    if (_nodeExits(finallyBlock)) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitTypeName(TypeName node) => false;
+
+  @override
+  bool visitVariableDeclaration(VariableDeclaration node) {
+    Expression initializer = node.initializer;
+    if (initializer != null) {
+      return initializer.accept(this);
+    }
+    return false;
+  }
+
+  @override
+  bool visitVariableDeclarationList(VariableDeclarationList node) =>
+      _visitVariableDeclarations(node.variables);
+
+  @override
+  bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    NodeList<VariableDeclaration> variables = node.variables.variables;
+    for (int i = 0; i < variables.length; i++) {
+      if (variables[i].accept(this)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  bool visitWhileStatement(WhileStatement node) {
+    bool outerBreakValue = _enclosingBlockContainsBreak;
+    _enclosingBlockContainsBreak = false;
+    try {
+      Expression conditionExpression = node.condition;
+      if (conditionExpression.accept(this)) {
+        return true;
+      }
+      // TODO(jwren) Do we want to take all constant expressions into account?
+      if (conditionExpression is BooleanLiteral) {
+        BooleanLiteral booleanLiteral = conditionExpression;
+        // If while(true), and the body doesn't return or the body doesn't have
+        // a break, then return true.
+        bool blockReturns = node.body.accept(this);
+        if (booleanLiteral.value &&
+            (blockReturns || !_enclosingBlockContainsBreak)) {
+          return true;
+        }
+      }
+      return false;
+    } finally {
+      _enclosingBlockContainsBreak = outerBreakValue;
+    }
+  }
+
+  /**
+   * Return `true` if the given node exits.
+   *
+   * @param node the node being tested
+   * @return `true` if the given node exits
+   */
+  bool _nodeExits(AstNode node) {
+    if (node == null) {
+      return false;
+    }
+    return node.accept(this);
+  }
+
+  bool _visitExpressions(NodeList<Expression> expressions) {
+    for (int i = expressions.length - 1; i >= 0; i--) {
+      if (expressions[i].accept(this)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  bool _visitStatements(NodeList<Statement> statements) {
+    for (int i = statements.length - 1; i >= 0; i--) {
+      if (statements[i].accept(this)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  bool _visitVariableDeclarations(
+      NodeList<VariableDeclaration> variableDeclarations) {
+    for (int i = variableDeclarations.length - 1; i >= 0; i--) {
+      if (variableDeclarations[i].accept(this)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given [node] exits.
+   */
+  static bool exits(AstNode node) {
+    return new ExitDetector()._nodeExits(node);
+  }
+}
+
+/**
+ * The scope defined by a function.
+ */
+class FunctionScope extends EnclosedScope {
+  /**
+   * The element representing the function that defines this scope.
+   */
+  final ExecutableElement _functionElement;
+
+  /**
+   * A flag indicating whether the parameters have already been defined, used to
+   * prevent the parameters from being defined multiple times.
+   */
+  bool _parametersDefined = false;
+
+  /**
+   * Initialize a newly created scope enclosed within the [enclosingScope] that
+   * represents the given [_functionElement].
+   */
+  FunctionScope(Scope enclosingScope, this._functionElement)
+      : super(new EnclosedScope(new EnclosedScope(enclosingScope))) {
+    if (_functionElement == null) {
+      throw new IllegalArgumentException("function element cannot be null");
+    }
+    _defineTypeParameters();
+  }
+
+  /**
+   * Define the parameters for the given function in the scope that encloses
+   * this function.
+   */
+  void defineParameters() {
+    if (_parametersDefined) {
+      return;
+    }
+    _parametersDefined = true;
+    Scope parameterScope = enclosingScope;
+    for (ParameterElement parameter in _functionElement.parameters) {
+      if (!parameter.isInitializingFormal) {
+        parameterScope.define(parameter);
+      }
+    }
+  }
+
+  /**
+   * Define the type parameters for the function.
+   */
+  void _defineTypeParameters() {
+    Scope typeParameterScope = enclosingScope.enclosingScope;
+    for (TypeParameterElement typeParameter
+        in _functionElement.typeParameters) {
+      typeParameterScope.define(typeParameter);
+    }
+  }
+}
+
+/**
+ * The scope defined by a function type alias.
+ */
+class FunctionTypeScope extends EnclosedScope {
+  final FunctionTypeAliasElement _typeElement;
+
+  bool _parametersDefined = false;
+
+  /**
+   * Initialize a newly created scope enclosed within the [enclosingScope] that
+   * represents the given [_typeElement].
+   */
+  FunctionTypeScope(Scope enclosingScope, this._typeElement)
+      : super(new EnclosedScope(enclosingScope)) {
+    _defineTypeParameters();
+  }
+
+  /**
+   * Define the parameters for the function type alias.
+   */
+  void defineParameters() {
+    if (_parametersDefined) {
+      return;
+    }
+    _parametersDefined = true;
+    for (ParameterElement parameter in _typeElement.parameters) {
+      define(parameter);
+    }
+  }
+
+  /**
+   * Define the type parameters for the function type alias.
+   */
+  void _defineTypeParameters() {
+    Scope typeParameterScope = enclosingScope;
+    for (TypeParameterElement typeParameter in _typeElement.typeParameters) {
+      typeParameterScope.define(typeParameter);
+    }
+  }
+}
+
+/**
+ * A visitor that visits ASTs and fills [UsedImportedElements].
+ */
+class GatherUsedImportedElementsVisitor extends RecursiveAstVisitor {
+  final LibraryElement library;
+  final UsedImportedElements usedElements = new UsedImportedElements();
+
+  GatherUsedImportedElementsVisitor(this.library);
+
+  @override
+  void visitExportDirective(ExportDirective node) {
+    _visitMetadata(node.metadata);
+  }
+
+  @override
+  void visitImportDirective(ImportDirective node) {
+    _visitMetadata(node.metadata);
+  }
+
+  @override
+  void visitLibraryDirective(LibraryDirective node) {
+    _visitMetadata(node.metadata);
+  }
+
+  @override
+  void visitPrefixedIdentifier(PrefixedIdentifier node) {
+    // If the prefixed identifier references some A.B, where A is a library
+    // prefix, then we can lookup the associated ImportDirective in
+    // prefixElementMap and remove it from the unusedImports list.
+    SimpleIdentifier prefixIdentifier = node.prefix;
+    Element element = prefixIdentifier.staticElement;
+    if (element is PrefixElement) {
+      usedElements.prefixes.add(element);
+      return;
+    }
+    // Otherwise, pass the prefixed identifier element and name onto
+    // visitIdentifier.
+    _visitIdentifier(element, prefixIdentifier.name);
+  }
+
+  @override
+  void visitSimpleIdentifier(SimpleIdentifier node) {
+    _visitIdentifier(node.staticElement, node.name);
+  }
+
+  void _visitIdentifier(Element element, String name) {
+    if (element == null) {
+      return;
+    }
+    // If the element is multiply defined then call this method recursively for
+    // each of the conflicting elements.
+    if (element is MultiplyDefinedElement) {
+      MultiplyDefinedElement multiplyDefinedElement = element;
+      for (Element elt in multiplyDefinedElement.conflictingElements) {
+        _visitIdentifier(elt, name);
+      }
+      return;
+    } else if (element is PrefixElement) {
+      usedElements.prefixes.add(element);
+      return;
+    } else if (element.enclosingElement is! CompilationUnitElement) {
+      // Identifiers that aren't a prefix element and whose enclosing element
+      // isn't a CompilationUnit are ignored- this covers the case the
+      // identifier is a relative-reference, a reference to an identifier not
+      // imported by this library.
+      return;
+    }
+    // Ignore if an unknown library.
+    LibraryElement containingLibrary = element.library;
+    if (containingLibrary == null) {
+      return;
+    }
+    // Ignore if a local element.
+    if (library == containingLibrary) {
+      return;
+    }
+    // Remember the element.
+    usedElements.elements.add(element);
+  }
+
+  /**
+   * Given some [NodeList] of [Annotation]s, ensure that the identifiers are visited by
+   * this visitor. Specifically, this covers the cases where AST nodes don't have their identifiers
+   * visited by this visitor, but still need their annotations visited.
+   *
+   * @param annotations the list of annotations to visit
+   */
+  void _visitMetadata(NodeList<Annotation> annotations) {
+    int count = annotations.length;
+    for (int i = 0; i < count; i++) {
+      annotations[i].accept(this);
+    }
+  }
+}
+
+/**
+ * An [AstVisitor] that fills [UsedLocalElements].
+ */
+class GatherUsedLocalElementsVisitor extends RecursiveAstVisitor {
+  final UsedLocalElements usedElements = new UsedLocalElements();
+
+  final LibraryElement _enclosingLibrary;
+  ClassElement _enclosingClass;
+  ExecutableElement _enclosingExec;
+
+  GatherUsedLocalElementsVisitor(this._enclosingLibrary);
+
+  @override
+  visitCatchClause(CatchClause node) {
+    SimpleIdentifier exceptionParameter = node.exceptionParameter;
+    SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
+    if (exceptionParameter != null) {
+      Element element = exceptionParameter.staticElement;
+      usedElements.addCatchException(element);
+      if (stackTraceParameter != null || node.onKeyword == null) {
+        usedElements.addElement(element);
+      }
+    }
+    if (stackTraceParameter != null) {
+      Element element = stackTraceParameter.staticElement;
+      usedElements.addCatchStackTrace(element);
+    }
+    super.visitCatchClause(node);
+  }
+
+  @override
+  visitClassDeclaration(ClassDeclaration node) {
+    ClassElement enclosingClassOld = _enclosingClass;
+    try {
+      _enclosingClass = node.element;
+      super.visitClassDeclaration(node);
+    } finally {
+      _enclosingClass = enclosingClassOld;
+    }
+  }
+
+  @override
+  visitFunctionDeclaration(FunctionDeclaration node) {
+    ExecutableElement enclosingExecOld = _enclosingExec;
+    try {
+      _enclosingExec = node.element;
+      super.visitFunctionDeclaration(node);
+    } finally {
+      _enclosingExec = enclosingExecOld;
+    }
+  }
+
+  @override
+  visitFunctionExpression(FunctionExpression node) {
+    if (node.parent is! FunctionDeclaration) {
+      usedElements.addElement(node.element);
+    }
+    super.visitFunctionExpression(node);
+  }
+
+  @override
+  visitMethodDeclaration(MethodDeclaration node) {
+    ExecutableElement enclosingExecOld = _enclosingExec;
+    try {
+      _enclosingExec = node.element;
+      super.visitMethodDeclaration(node);
+    } finally {
+      _enclosingExec = enclosingExecOld;
+    }
+  }
+
+  @override
+  visitSimpleIdentifier(SimpleIdentifier node) {
+    if (node.inDeclarationContext()) {
+      return;
+    }
+    Element element = node.staticElement;
+    bool isIdentifierRead = _isReadIdentifier(node);
+    if (element is LocalVariableElement) {
+      if (isIdentifierRead) {
+        usedElements.addElement(element);
+      }
+    } else {
+      _useIdentifierElement(node);
+      if (element == null ||
+          element.enclosingElement is ClassElement &&
+              !identical(element, _enclosingExec)) {
+        usedElements.members.add(node.name);
+        if (isIdentifierRead) {
+          usedElements.readMembers.add(node.name);
+        }
+      }
+    }
+  }
+
+  /**
+   * Marks an [Element] of [node] as used in the library.
+   */
+  void _useIdentifierElement(Identifier node) {
+    Element element = node.staticElement;
+    if (element == null) {
+      return;
+    }
+    // check if a local element
+    if (!identical(element.library, _enclosingLibrary)) {
+      return;
+    }
+    // ignore references to an element from itself
+    if (identical(element, _enclosingClass)) {
+      return;
+    }
+    if (identical(element, _enclosingExec)) {
+      return;
+    }
+    // ignore places where the element is not actually used
+    if (node.parent is TypeName) {
+      if (element is ClassElement) {
+        AstNode parent2 = node.parent.parent;
+        if (parent2 is IsExpression) {
+          return;
+        }
+        if (parent2 is VariableDeclarationList) {
+          return;
+        }
+      }
+    }
+    // OK
+    usedElements.addElement(element);
+  }
+
+  static bool _isReadIdentifier(SimpleIdentifier node) {
+    // not reading at all
+    if (!node.inGetterContext()) {
+      return false;
+    }
+    // check if useless reading
+    AstNode parent = node.parent;
+    if (parent.parent is ExpressionStatement &&
+        (parent is PrefixExpression ||
+            parent is PostfixExpression ||
+            parent is AssignmentExpression && parent.leftHandSide == node)) {
+      // v++;
+      // ++v;
+      // v += 2;
+      return false;
+    }
+    // OK
+    return true;
+  }
+}
+
+/**
+ * Instances of the class `HintGenerator` traverse a library's worth of dart code at a time to
+ * generate hints over the set of sources.
+ *
+ * See [HintCode].
+ */
+class HintGenerator {
+  final List<CompilationUnit> _compilationUnits;
+
+  final InternalAnalysisContext _context;
+
+  final AnalysisErrorListener _errorListener;
+
+  LibraryElement _library;
+
+  GatherUsedImportedElementsVisitor _usedImportedElementsVisitor;
+
+  bool _enableDart2JSHints = false;
+
+  /**
+   * The inheritance manager used to find overridden methods.
+   */
+  InheritanceManager _manager;
+
+  GatherUsedLocalElementsVisitor _usedLocalElementsVisitor;
+
+  HintGenerator(this._compilationUnits, this._context, this._errorListener) {
+    _library = _compilationUnits[0].element.library;
+    _usedImportedElementsVisitor =
+        new GatherUsedImportedElementsVisitor(_library);
+    _enableDart2JSHints = _context.analysisOptions.dart2jsHint;
+    _manager = new InheritanceManager(_compilationUnits[0].element.library);
+    _usedLocalElementsVisitor = new GatherUsedLocalElementsVisitor(_library);
+  }
+
+  void generateForLibrary() {
+    PerformanceStatistics.hints.makeCurrentWhile(() {
+      for (CompilationUnit unit in _compilationUnits) {
+        CompilationUnitElement element = unit.element;
+        if (element != null) {
+          _generateForCompilationUnit(unit, element.source);
+        }
+      }
+      CompilationUnit definingUnit = _compilationUnits[0];
+      ErrorReporter definingUnitErrorReporter =
+          new ErrorReporter(_errorListener, definingUnit.element.source);
+      {
+        ImportsVerifier importsVerifier = new ImportsVerifier();
+        importsVerifier.addImports(definingUnit);
+        importsVerifier
+            .removeUsedElements(_usedImportedElementsVisitor.usedElements);
+        importsVerifier.generateDuplicateImportHints(definingUnitErrorReporter);
+        importsVerifier.generateUnusedImportHints(definingUnitErrorReporter);
+      }
+      _library.accept(new UnusedLocalElementsVerifier(
+          _errorListener, _usedLocalElementsVisitor.usedElements));
+    });
+  }
+
+  void _generateForCompilationUnit(CompilationUnit unit, Source source) {
+    ErrorReporter errorReporter = new ErrorReporter(_errorListener, source);
+    unit.accept(_usedImportedElementsVisitor);
+    // dead code analysis
+    unit.accept(new DeadCodeVerifier(errorReporter));
+    unit.accept(_usedLocalElementsVisitor);
+    // dart2js analysis
+    if (_enableDart2JSHints) {
+      unit.accept(new Dart2JSVerifier(errorReporter));
+    }
+    // Dart best practices
+    unit.accept(
+        new BestPracticesVerifier(errorReporter, _context.typeProvider));
+    unit.accept(new OverrideVerifier(errorReporter, _manager));
+    // Find to-do comments
+    new ToDoFinder(errorReporter).findIn(unit);
+    // pub analysis
+    // TODO(danrubel/jwren) Commented out until bugs in the pub verifier are
+    // fixed
+    //    unit.accept(new PubVerifier(context, errorReporter));
+  }
+}
+
+/**
+ * Instances of the class {@code HtmlTagInfo} record information about the tags used in an HTML
+ * file.
+ */
+class HtmlTagInfo {
+  /**
+   * An array containing all of the tags used in the HTML file.
+   */
+  List<String> allTags;
+
+  /**
+   * A table mapping the id's defined in the HTML file to an array containing the names of tags with
+   * that identifier.
+   */
+  HashMap<String, String> idToTagMap;
+
+  /**
+   * A table mapping the classes defined in the HTML file to an array containing the names of tags
+   * with that class.
+   */
+  HashMap<String, List<String>> classToTagsMap;
+
+  /**
+   * Initialize a newly created information holder to hold the given information about the tags in
+   * an HTML file.
+   *
+   * @param allTags an array containing all of the tags used in the HTML file
+   * @param idToTagMap a table mapping the id's defined in the HTML file to an array containing the
+   *          names of tags with that identifier
+   * @param classToTagsMap a table mapping the classes defined in the HTML file to an array
+   *          containing the names of tags with that class
+   */
+  HtmlTagInfo(this.allTags, this.idToTagMap, this.classToTagsMap);
+
+  /**
+   * Return an array containing the tags that have the given class, or {@code null} if there are no
+   * such tags.
+   *
+   * @return an array containing the tags that have the given class
+   */
+  List<String> getTagsWithClass(String identifier) {
+    return classToTagsMap[identifier];
+  }
+
+  /**
+   * Return the tag that has the given identifier, or {@code null} if there is no such tag (the
+   * identifier is not defined).
+   *
+   * @return the tag that has the given identifier
+   */
+  String getTagWithId(String identifier) {
+    return idToTagMap[identifier];
+  }
+}
+
+/**
+ * Instances of the class {@code HtmlTagInfoBuilder} gather information about the tags used in one
+ * or more HTML structures.
+ */
+class HtmlTagInfoBuilder implements ht.XmlVisitor {
+  /**
+   * The name of the 'id' attribute.
+   */
+  static final String ID_ATTRIBUTE = "id";
+
+  /**
+   * The name of the 'class' attribute.
+   */
+  static final String ID_CLASS = "class";
+
+  /**
+   * A set containing all of the tag names used in the HTML.
+   */
+  HashSet<String> tagSet = new HashSet<String>();
+
+  /**
+   * A table mapping the id's that are defined to the tag name with that id.
+   */
+  HashMap<String, String> idMap = new HashMap<String, String>();
+
+  /**
+   * A table mapping the classes that are defined to a set of the tag names with that class.
+   */
+  HashMap<String, HashSet<String>> classMap =
+      new HashMap<String, HashSet<String>>();
+
+  /**
+   * Initialize a newly created HTML tag info builder.
+   */
+  HtmlTagInfoBuilder();
+
+  /**
+   * Create a tag information holder holding all of the information gathered about the tags in the
+   * HTML structures that were visited.
+   *
+   * @return the information gathered about the tags in the visited HTML structures
+   */
+  HtmlTagInfo getTagInfo() {
+    List<String> allTags = tagSet.toList();
+    HashMap<String, List<String>> classToTagsMap =
+        new HashMap<String, List<String>>();
+    classMap.forEach((String key, Set<String> tags) {
+      classToTagsMap[key] = tags.toList();
+    });
+    return new HtmlTagInfo(allTags, idMap, classToTagsMap);
+  }
+
+  @override
+  visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) {
+    visitXmlTagNode(node);
+  }
+
+  @override
+  visitHtmlUnit(ht.HtmlUnit node) {
+    node.visitChildren(this);
+  }
+
+  @override
+  visitXmlAttributeNode(ht.XmlAttributeNode node) {}
+
+  @override
+  visitXmlTagNode(ht.XmlTagNode node) {
+    node.visitChildren(this);
+    String tagName = node.tag;
+    tagSet.add(tagName);
+    for (ht.XmlAttributeNode attribute in node.attributes) {
+      String attributeName = attribute.name;
+      if (attributeName == ID_ATTRIBUTE) {
+        String attributeValue = attribute.text;
+        if (attributeValue != null) {
+          String tag = idMap[attributeValue];
+          if (tag == null) {
+            idMap[attributeValue] = tagName;
+          } else {
+//            reportError(HtmlWarningCode.MULTIPLY_DEFINED_ID, valueToken);
+          }
+        }
+      } else if (attributeName == ID_CLASS) {
+        String attributeValue = attribute.text;
+        if (attributeValue != null) {
+          HashSet<String> tagList = classMap[attributeValue];
+          if (tagList == null) {
+            tagList = new HashSet<String>();
+            classMap[attributeValue] = tagList;
+          } else {
+//            reportError(HtmlWarningCode.MULTIPLY_DEFINED_ID, valueToken);
+          }
+          tagList.add(tagName);
+        }
+      }
+    }
+  }
+
+//  /**
+//   * Report an error with the given error code at the given location. Use the given arguments to
+//   * compose the error message.
+//   *
+//   * @param errorCode the error code of the error to be reported
+//   * @param offset the offset of the first character to be highlighted
+//   * @param length the number of characters to be highlighted
+//   * @param arguments the arguments used to compose the error message
+//   */
+//  private void reportError(ErrorCode errorCode, Token token, Object... arguments) {
+//    errorListener.onError(new AnalysisError(
+//        htmlElement.getSource(),
+//        token.getOffset(),
+//        token.getLength(),
+//        errorCode,
+//        arguments));
+//  }
+//
+//  /**
+//   * Report an error with the given error code at the given location. Use the given arguments to
+//   * compose the error message.
+//   *
+//   * @param errorCode the error code of the error to be reported
+//   * @param offset the offset of the first character to be highlighted
+//   * @param length the number of characters to be highlighted
+//   * @param arguments the arguments used to compose the error message
+//   */
+//  private void reportError(ErrorCode errorCode, int offset, int length, Object... arguments) {
+//    errorListener.onError(new AnalysisError(
+//        htmlElement.getSource(),
+//        offset,
+//        length,
+//        errorCode,
+//        arguments));
+//  }
+}
+
+/**
+ * Instances of the class `HtmlUnitBuilder` build an element model for a single HTML unit.
+ */
+class HtmlUnitBuilder implements ht.XmlVisitor<Object> {
+  static String _SRC = "src";
+
+  /**
+   * The analysis context in which the element model will be built.
+   */
+  final InternalAnalysisContext _context;
+
+  /**
+   * The error listener to which errors will be reported.
+   */
+  RecordingErrorListener _errorListener;
+
+  /**
+   * The HTML element being built.
+   */
+  HtmlElementImpl _htmlElement;
+
+  /**
+   * The elements in the path from the HTML unit to the current tag node.
+   */
+  List<ht.XmlTagNode> _parentNodes;
+
+  /**
+   * The script elements being built.
+   */
+  List<HtmlScriptElement> _scripts;
+
+  /**
+   * A set of the libraries that were resolved while resolving the HTML unit.
+   */
+  Set<Library> _resolvedLibraries = new HashSet<Library>();
+
+  /**
+   * Initialize a newly created HTML unit builder.
+   *
+   * @param context the analysis context in which the element model will be built
+   */
+  HtmlUnitBuilder(this._context) {
+    this._errorListener = new RecordingErrorListener();
+  }
+
+  /**
+   * Return the listener to which analysis errors will be reported.
+   *
+   * @return the listener to which analysis errors will be reported
+   */
+  RecordingErrorListener get errorListener => _errorListener;
+
+  /**
+   * Return an array containing information about all of the libraries that were resolved.
+   *
+   * @return an array containing the libraries that were resolved
+   */
+  Set<Library> get resolvedLibraries => _resolvedLibraries;
+
+  /**
+   * Build the HTML element for the given source.
+   *
+   * @param source the source describing the compilation unit
+   * @param unit the AST structure representing the HTML
+   * @throws AnalysisException if the analysis could not be performed
+   */
+  HtmlElementImpl buildHtmlElement(Source source, ht.HtmlUnit unit) {
+    HtmlElementImpl result = new HtmlElementImpl(_context, source.shortName);
+    result.source = source;
+    _htmlElement = result;
+    unit.accept(this);
+    _htmlElement = null;
+    unit.element = result;
+    return result;
+  }
+
+  @override
+  Object visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) {
+    if (_parentNodes.contains(node)) {
+      return _reportCircularity(node);
+    }
+    _parentNodes.add(node);
+    try {
+      Source htmlSource = _htmlElement.source;
+      ht.XmlAttributeNode scriptAttribute = _getScriptSourcePath(node);
+      String scriptSourcePath =
+          scriptAttribute == null ? null : scriptAttribute.text;
+      if (node.attributeEnd.type == ht.TokenType.GT &&
+          scriptSourcePath == null) {
+        EmbeddedHtmlScriptElementImpl script =
+            new EmbeddedHtmlScriptElementImpl(node);
+        try {
+          LibraryResolver resolver = new LibraryResolver(_context);
+          LibraryElementImpl library =
+              resolver.resolveEmbeddedLibrary(htmlSource, node.script, true);
+          script.scriptLibrary = library;
+          _resolvedLibraries.addAll(resolver.resolvedLibraries);
+          _errorListener.addAll(resolver.errorListener);
+        } on AnalysisException catch (exception, stackTrace) {
+          //TODO (danrubel): Handle or forward the exception
+          AnalysisEngine.instance.logger.logError(
+              "Could not resolve script tag",
+              new CaughtException(exception, stackTrace));
+        }
+        node.scriptElement = script;
+        _scripts.add(script);
+      } else {
+        ExternalHtmlScriptElementImpl script =
+            new ExternalHtmlScriptElementImpl(node);
+        if (scriptSourcePath != null) {
+          try {
+            scriptSourcePath = Uri.encodeFull(scriptSourcePath);
+            // Force an exception to be thrown if the URI is invalid so that we
+            // can report the problem.
+            parseUriWithException(scriptSourcePath);
+            Source scriptSource =
+                _context.sourceFactory.resolveUri(htmlSource, scriptSourcePath);
+            script.scriptSource = scriptSource;
+            if (!_context.exists(scriptSource)) {
+              _reportValueError(HtmlWarningCode.URI_DOES_NOT_EXIST,
+                  scriptAttribute, [scriptSourcePath]);
+            }
+          } on URISyntaxException {
+            _reportValueError(HtmlWarningCode.INVALID_URI, scriptAttribute,
+                [scriptSourcePath]);
+          }
+        }
+        node.scriptElement = script;
+        _scripts.add(script);
+      }
+    } finally {
+      _parentNodes.remove(node);
+    }
+    return null;
+  }
+
+  @override
+  Object visitHtmlUnit(ht.HtmlUnit node) {
+    _parentNodes = new List<ht.XmlTagNode>();
+    _scripts = new List<HtmlScriptElement>();
+    try {
+      node.visitChildren(this);
+      _htmlElement.scripts = new List.from(_scripts);
+    } finally {
+      _scripts = null;
+      _parentNodes = null;
+    }
+    return null;
+  }
+
+  @override
+  Object visitXmlAttributeNode(ht.XmlAttributeNode node) => null;
+
+  @override
+  Object visitXmlTagNode(ht.XmlTagNode node) {
+    if (_parentNodes.contains(node)) {
+      return _reportCircularity(node);
+    }
+    _parentNodes.add(node);
+    try {
+      node.visitChildren(this);
+    } finally {
+      _parentNodes.remove(node);
+    }
+    return null;
+  }
+
+  /**
+   * Return the first source attribute for the given tag node, or `null` if it does not exist.
+   *
+   * @param node the node containing attributes
+   * @return the source attribute contained in the given tag
+   */
+  ht.XmlAttributeNode _getScriptSourcePath(ht.XmlTagNode node) {
+    for (ht.XmlAttributeNode attribute in node.attributes) {
+      if (attribute.name == _SRC) {
+        return attribute;
+      }
+    }
+    return null;
+  }
+
+  Object _reportCircularity(ht.XmlTagNode node) {
+    //
+    // This should not be possible, but we have an error report that suggests
+    // that it happened at least once. This code will guard against infinite
+    // recursion and might help us identify the cause of the issue.
+    //
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("Found circularity in XML nodes: ");
+    bool first = true;
+    for (ht.XmlTagNode pathNode in _parentNodes) {
+      if (first) {
+        first = false;
+      } else {
+        buffer.write(", ");
+      }
+      String tagName = pathNode.tag;
+      if (identical(pathNode, node)) {
+        buffer.write("*");
+        buffer.write(tagName);
+        buffer.write("*");
+      } else {
+        buffer.write(tagName);
+      }
+    }
+    AnalysisEngine.instance.logger.logError(buffer.toString());
+    return null;
+  }
+
+  /**
+   * Report an error with the given error code at the given location. Use the given arguments to
+   * compose the error message.
+   *
+   * @param errorCode the error code of the error to be reported
+   * @param offset the offset of the first character to be highlighted
+   * @param length the number of characters to be highlighted
+   * @param arguments the arguments used to compose the error message
+   */
+  void _reportErrorForOffset(
+      ErrorCode errorCode, int offset, int length, List<Object> arguments) {
+    _errorListener.onError(new AnalysisError(
+        _htmlElement.source, offset, length, errorCode, arguments));
+  }
+
+  /**
+   * Report an error with the given error code at the location of the value of the given attribute.
+   * Use the given arguments to compose the error message.
+   *
+   * @param errorCode the error code of the error to be reported
+   * @param offset the offset of the first character to be highlighted
+   * @param length the number of characters to be highlighted
+   * @param arguments the arguments used to compose the error message
+   */
+  void _reportValueError(ErrorCode errorCode, ht.XmlAttributeNode attribute,
+      List<Object> arguments) {
+    int offset = attribute.valueToken.offset + 1;
+    int length = attribute.valueToken.length - 2;
+    _reportErrorForOffset(errorCode, offset, length, arguments);
+  }
+}
+
+/**
+ * Instances of the class `ImplicitLabelScope` represent the scope statements
+ * that can be the target of unlabeled break and continue statements.
+ */
+class ImplicitLabelScope {
+  /**
+   * The implicit label scope associated with the top level of a function.
+   */
+  static const ImplicitLabelScope ROOT = const ImplicitLabelScope._(null, null);
+
+  /**
+   * The implicit label scope enclosing this implicit label scope.
+   */
+  final ImplicitLabelScope outerScope;
+
+  /**
+   * The statement that acts as a target for break and/or continue statements
+   * at this scoping level.
+   */
+  final Statement statement;
+
+  /**
+   * Private constructor.
+   */
+  const ImplicitLabelScope._(this.outerScope, this.statement);
+
+  /**
+   * Get the statement which should be the target of an unlabeled `break` or
+   * `continue` statement, or `null` if there is no appropriate target.
+   */
+  Statement getTarget(bool isContinue) {
+    if (outerScope == null) {
+      // This scope represents the toplevel of a function body, so it doesn't
+      // match either break or continue.
+      return null;
+    }
+    if (isContinue && statement is SwitchStatement) {
+      return outerScope.getTarget(isContinue);
+    }
+    return statement;
+  }
+
+  /**
+   * Initialize a newly created scope to represent a switch statement or loop
+   * nested within the current scope.  [statement] is the statement associated
+   * with the newly created scope.
+   */
+  ImplicitLabelScope nest(Statement statement) =>
+      new ImplicitLabelScope._(this, statement);
+}
+
+/**
+ * Instances of the class `ImportsVerifier` visit all of the referenced libraries in the
+ * source code verifying that all of the imports are used, otherwise a
+ * [HintCode.UNUSED_IMPORT] is generated with
+ * [generateUnusedImportHints].
+ *
+ * While this class does not yet have support for an "Organize Imports" action, this logic built up
+ * in this class could be used for such an action in the future.
+ */
+class ImportsVerifier /*extends RecursiveAstVisitor<Object>*/ {
+  /**
+   * A list of [ImportDirective]s that the current library imports, as identifiers are visited
+   * by this visitor and an import has been identified as being used by the library, the
+   * [ImportDirective] is removed from this list. After all the sources in the library have
+   * been evaluated, this list represents the set of unused imports.
+   *
+   * See [ImportsVerifier.generateUnusedImportErrors].
+   */
+  final List<ImportDirective> _unusedImports = <ImportDirective>[];
+
+  /**
+   * After the list of [unusedImports] has been computed, this list is a proper subset of the
+   * unused imports that are listed more than once.
+   */
+  final List<ImportDirective> _duplicateImports = <ImportDirective>[];
+
+  /**
+   * This is a map between the set of [LibraryElement]s that the current library imports, and
+   * a list of [ImportDirective]s that imports the library. In cases where the current library
+   * imports a library with a single directive (such as `import lib1.dart;`), the library
+   * element will map to a list of one [ImportDirective], which will then be removed from the
+   * [unusedImports] list. In cases where the current library imports a library with multiple
+   * directives (such as `import lib1.dart; import lib1.dart show C;`), the
+   * [LibraryElement] will be mapped to a list of the import directives, and the namespace
+   * will need to be used to compute the correct [ImportDirective] being used, see
+   * [namespaceMap].
+   */
+  final HashMap<LibraryElement, List<ImportDirective>> _libraryMap =
+      new HashMap<LibraryElement, List<ImportDirective>>();
+
+  /**
+   * In cases where there is more than one import directive per library element, this mapping is
+   * used to determine which of the multiple import directives are used by generating a
+   * [Namespace] for each of the imports to do lookups in the same way that they are done from
+   * the [ElementResolver].
+   */
+  final HashMap<ImportDirective, Namespace> _namespaceMap =
+      new HashMap<ImportDirective, Namespace>();
+
+  /**
+   * This is a map between prefix elements and the import directives from which they are derived. In
+   * cases where a type is referenced via a prefix element, the import directive can be marked as
+   * used (removed from the unusedImports) by looking at the resolved `lib` in `lib.X`,
+   * instead of looking at which library the `lib.X` resolves.
+   *
+   * TODO (jwren) Since multiple [ImportDirective]s can share the same [PrefixElement],
+   * it is possible to have an unreported unused import in situations where two imports use the same
+   * prefix and at least one import directive is used.
+   */
+  final HashMap<PrefixElement, List<ImportDirective>> _prefixElementMap =
+      new HashMap<PrefixElement, List<ImportDirective>>();
+
+  void addImports(CompilationUnit node) {
+    for (Directive directive in node.directives) {
+      if (directive is ImportDirective) {
+        ImportDirective importDirective = directive;
+        LibraryElement libraryElement = importDirective.uriElement;
+        if (libraryElement != null) {
+          _unusedImports.add(importDirective);
+          //
+          // Initialize prefixElementMap
+          //
+          if (importDirective.asKeyword != null) {
+            SimpleIdentifier prefixIdentifier = importDirective.prefix;
+            if (prefixIdentifier != null) {
+              Element element = prefixIdentifier.staticElement;
+              if (element is PrefixElement) {
+                PrefixElement prefixElementKey = element;
+                List<ImportDirective> list =
+                    _prefixElementMap[prefixElementKey];
+                if (list == null) {
+                  list = new List<ImportDirective>();
+                  _prefixElementMap[prefixElementKey] = list;
+                }
+                list.add(importDirective);
+              }
+              // TODO (jwren) Can the element ever not be a PrefixElement?
+            }
+          }
+          //
+          // Initialize libraryMap: libraryElement -> importDirective
+          //
+          _putIntoLibraryMap(libraryElement, importDirective);
+          //
+          // For this new addition to the libraryMap, also recursively add any
+          // exports from the libraryElement.
+          //
+          _addAdditionalLibrariesForExports(
+              libraryElement, importDirective, new List<LibraryElement>());
+        }
+      }
+    }
+    if (_unusedImports.length > 1) {
+      // order the list of unusedImports to find duplicates in faster than
+      // O(n^2) time
+      List<ImportDirective> importDirectiveArray =
+          new List<ImportDirective>.from(_unusedImports);
+      importDirectiveArray.sort(ImportDirective.COMPARATOR);
+      ImportDirective currentDirective = importDirectiveArray[0];
+      for (int i = 1; i < importDirectiveArray.length; i++) {
+        ImportDirective nextDirective = importDirectiveArray[i];
+        if (ImportDirective.COMPARATOR(currentDirective, nextDirective) == 0) {
+          // Add either the currentDirective or nextDirective depending on which
+          // comes second, this guarantees that the first of the duplicates
+          // won't be highlighted.
+          if (currentDirective.offset < nextDirective.offset) {
+            _duplicateImports.add(nextDirective);
+          } else {
+            _duplicateImports.add(currentDirective);
+          }
+        }
+        currentDirective = nextDirective;
+      }
+    }
+  }
+
+  /**
+   * Any time after the defining compilation unit has been visited by this visitor, this method can
+   * be called to report an [HintCode.DUPLICATE_IMPORT] hint for each of the import directives
+   * in the [duplicateImports] list.
+   *
+   * @param errorReporter the error reporter to report the set of [HintCode.DUPLICATE_IMPORT]
+   *          hints to
+   */
+  void generateDuplicateImportHints(ErrorReporter errorReporter) {
+    for (ImportDirective duplicateImport in _duplicateImports) {
+      errorReporter.reportErrorForNode(
+          HintCode.DUPLICATE_IMPORT, duplicateImport.uri);
+    }
+  }
+
+  /**
+   * After all of the compilation units have been visited by this visitor, this method can be called
+   * to report an [HintCode.UNUSED_IMPORT] hint for each of the import directives in the
+   * [unusedImports] list.
+   *
+   * @param errorReporter the error reporter to report the set of [HintCode.UNUSED_IMPORT]
+   *          hints to
+   */
+  void generateUnusedImportHints(ErrorReporter errorReporter) {
+    for (ImportDirective unusedImport in _unusedImports) {
+      // Check that the import isn't dart:core
+      ImportElement importElement = unusedImport.element;
+      if (importElement != null) {
+        LibraryElement libraryElement = importElement.importedLibrary;
+        if (libraryElement != null && libraryElement.isDartCore) {
+          continue;
+        }
+      }
+      errorReporter.reportErrorForNode(
+          HintCode.UNUSED_IMPORT, unusedImport.uri);
+    }
+  }
+
+  /**
+   * Remove elements from [_unusedImports] using the given [usedElements].
+   */
+  void removeUsedElements(UsedImportedElements usedElements) {
+    // Stop if all the imports are known to be used.
+    if (_unusedImports.isEmpty) {
+      return;
+    }
+    // Process import prefixes.
+    for (PrefixElement prefix in usedElements.prefixes) {
+      List<ImportDirective> importDirectives = _prefixElementMap[prefix];
+      if (importDirectives != null) {
+        for (ImportDirective importDirective in importDirectives) {
+          _unusedImports.remove(importDirective);
+        }
+      }
+    }
+    // Process top-level elements.
+    for (Element element in usedElements.elements) {
+      // Stop if all the imports are known to be used.
+      if (_unusedImports.isEmpty) {
+        return;
+      }
+      // Prepare import directives for this library.
+      LibraryElement library = element.library;
+      List<ImportDirective> importsLibrary = _libraryMap[library];
+      if (importsLibrary == null) {
+        continue;
+      }
+      // If there is only one import directive for this library, then it must be
+      // the directive that this element is imported with, remove it from the
+      // unusedImports list.
+      if (importsLibrary.length == 1) {
+        ImportDirective usedImportDirective = importsLibrary[0];
+        _unusedImports.remove(usedImportDirective);
+        continue;
+      }
+      // Otherwise, find import directives using namespaces.
+      String name = element.displayName;
+      for (ImportDirective importDirective in importsLibrary) {
+        Namespace namespace = _computeNamespace(importDirective);
+        if (namespace != null && namespace.get(name) != null) {
+          _unusedImports.remove(importDirective);
+        }
+      }
+    }
+  }
+
+  /**
+   * Recursively add any exported library elements into the [libraryMap].
+   */
+  void _addAdditionalLibrariesForExports(LibraryElement library,
+      ImportDirective importDirective, List<LibraryElement> exportPath) {
+    if (exportPath.contains(library)) {
+      return;
+    }
+    exportPath.add(library);
+    for (LibraryElement exportedLibraryElt in library.exportedLibraries) {
+      _putIntoLibraryMap(exportedLibraryElt, importDirective);
+      _addAdditionalLibrariesForExports(
+          exportedLibraryElt, importDirective, exportPath);
+    }
+  }
+
+  /**
+   * Lookup and return the [Namespace] from the [namespaceMap], if the map does not
+   * have the computed namespace, compute it and cache it in the map. If the import directive is not
+   * resolved or is not resolvable, `null` is returned.
+   *
+   * @param importDirective the import directive used to compute the returned namespace
+   * @return the computed or looked up [Namespace]
+   */
+  Namespace _computeNamespace(ImportDirective importDirective) {
+    Namespace namespace = _namespaceMap[importDirective];
+    if (namespace == null) {
+      // If the namespace isn't in the namespaceMap, then compute and put it in
+      // the map.
+      ImportElement importElement = importDirective.element;
+      if (importElement != null) {
+        NamespaceBuilder builder = new NamespaceBuilder();
+        namespace = builder.createImportNamespaceForDirective(importElement);
+        _namespaceMap[importDirective] = namespace;
+      }
+    }
+    return namespace;
+  }
+
+  /**
+   * The [libraryMap] is a mapping between a library elements and a list of import
+   * directives, but when adding these mappings into the [libraryMap], this method can be
+   * used to simply add the mapping between the library element an an import directive without
+   * needing to check to see if a list needs to be created.
+   */
+  void _putIntoLibraryMap(
+      LibraryElement libraryElement, ImportDirective importDirective) {
+    List<ImportDirective> importList = _libraryMap[libraryElement];
+    if (importList == null) {
+      importList = new List<ImportDirective>();
+      _libraryMap[libraryElement] = importList;
+    }
+    importList.add(importDirective);
+  }
+}
+
+/**
+ * Instances of the class `InheritanceManager` manage the knowledge of where class members
+ * (methods, getters & setters) are inherited from.
+ */
+class InheritanceManager {
+  /**
+   * The [LibraryElement] that is managed by this manager.
+   */
+  LibraryElement _library;
+
+  /**
+   * This is a mapping between each [ClassElement] and a map between the [String] member
+   * names and the associated [ExecutableElement] in the mixin and superclass chain.
+   */
+  HashMap<ClassElement, MemberMap> _classLookup;
+
+  /**
+   * This is a mapping between each [ClassElement] and a map between the [String] member
+   * names and the associated [ExecutableElement] in the interface set.
+   */
+  HashMap<ClassElement, MemberMap> _interfaceLookup;
+
+  /**
+   * A map between each visited [ClassElement] and the set of [AnalysisError]s found on
+   * the class element.
+   */
+  HashMap<ClassElement, HashSet<AnalysisError>> _errorsInClassElement =
+      new HashMap<ClassElement, HashSet<AnalysisError>>();
+
+  /**
+   * Initialize a newly created inheritance manager.
+   *
+   * @param library the library element context that the inheritance mappings are being generated
+   */
+  InheritanceManager(LibraryElement library) {
+    this._library = library;
+    _classLookup = new HashMap<ClassElement, MemberMap>();
+    _interfaceLookup = new HashMap<ClassElement, MemberMap>();
+  }
+
+  /**
+   * Set the new library element context.
+   *
+   * @param library the new library element
+   */
+  void set libraryElement(LibraryElement library) {
+    this._library = library;
+  }
+
+  /**
+   * Return the set of [AnalysisError]s found on the passed [ClassElement], or
+   * `null` if there are none.
+   *
+   * @param classElt the class element to query
+   * @return the set of [AnalysisError]s found on the passed [ClassElement], or
+   *         `null` if there are none
+   */
+  HashSet<AnalysisError> getErrors(ClassElement classElt) =>
+      _errorsInClassElement[classElt];
+
+  /**
+   * Get and return a mapping between the set of all string names of the members inherited from the
+   * passed [ClassElement] superclass hierarchy, and the associated [ExecutableElement].
+   *
+   * @param classElt the class element to query
+   * @return a mapping between the set of all members inherited from the passed [ClassElement]
+   *         superclass hierarchy, and the associated [ExecutableElement]
+   */
+  MemberMap getMapOfMembersInheritedFromClasses(ClassElement classElt) =>
+      _computeClassChainLookupMap(classElt, new HashSet<ClassElement>());
+
+  /**
+   * Get and return a mapping between the set of all string names of the members inherited from the
+   * passed [ClassElement] interface hierarchy, and the associated [ExecutableElement].
+   *
+   * @param classElt the class element to query
+   * @return a mapping between the set of all string names of the members inherited from the passed
+   *         [ClassElement] interface hierarchy, and the associated [ExecutableElement].
+   */
+  MemberMap getMapOfMembersInheritedFromInterfaces(ClassElement classElt) =>
+      _computeInterfaceLookupMap(classElt, new HashSet<ClassElement>());
+
+  /**
+   * Given some [ClassElement] and some member name, this returns the
+   * [ExecutableElement] that the class inherits from the mixins,
+   * superclasses or interfaces, that has the member name, if no member is inherited `null` is
+   * returned.
+   *
+   * @param classElt the class element to query
+   * @param memberName the name of the executable element to find and return
+   * @return the inherited executable element with the member name, or `null` if no such
+   *         member exists
+   */
+  ExecutableElement lookupInheritance(
+      ClassElement classElt, String memberName) {
+    if (memberName == null || memberName.isEmpty) {
+      return null;
+    }
+    ExecutableElement executable = _computeClassChainLookupMap(
+        classElt, new HashSet<ClassElement>()).get(memberName);
+    if (executable == null) {
+      return _computeInterfaceLookupMap(classElt, new HashSet<ClassElement>())
+          .get(memberName);
+    }
+    return executable;
+  }
+
+  /**
+   * Given some [ClassElement] and some member name, this returns the
+   * [ExecutableElement] that the class either declares itself, or
+   * inherits, that has the member name, if no member is inherited `null` is returned.
+   *
+   * @param classElt the class element to query
+   * @param memberName the name of the executable element to find and return
+   * @return the inherited executable element with the member name, or `null` if no such
+   *         member exists
+   */
+  ExecutableElement lookupMember(ClassElement classElt, String memberName) {
+    ExecutableElement element = _lookupMemberInClass(classElt, memberName);
+    if (element != null) {
+      return element;
+    }
+    return lookupInheritance(classElt, memberName);
+  }
+
+  /**
+   * Given some [InterfaceType] and some member name, this returns the
+   * [FunctionType] of the [ExecutableElement] that the
+   * class either declares itself, or inherits, that has the member name, if no member is inherited
+   * `null` is returned. The returned [FunctionType] has all type
+   * parameters substituted with corresponding type arguments from the given [InterfaceType].
+   *
+   * @param interfaceType the interface type to query
+   * @param memberName the name of the executable element to find and return
+   * @return the member's function type, or `null` if no such member exists
+   */
+  FunctionType lookupMemberType(
+      InterfaceType interfaceType, String memberName) {
+    ExecutableElement iteratorMember =
+        lookupMember(interfaceType.element, memberName);
+    if (iteratorMember == null) {
+      return null;
+    }
+    return substituteTypeArgumentsInMemberFromInheritance(
+        iteratorMember.type, memberName, interfaceType);
+  }
+
+  /**
+   * Determine the set of methods which is overridden by the given class member. If no member is
+   * inherited, an empty list is returned. If one of the inherited members is a
+   * [MultiplyInheritedExecutableElement], then it is expanded into its constituent inherited
+   * elements.
+   *
+   * @param classElt the class to query
+   * @param memberName the name of the class member to query
+   * @return a list of overridden methods
+   */
+  List<ExecutableElement> lookupOverrides(
+      ClassElement classElt, String memberName) {
+    List<ExecutableElement> result = new List<ExecutableElement>();
+    if (memberName == null || memberName.isEmpty) {
+      return result;
+    }
+    List<MemberMap> interfaceMaps =
+        _gatherInterfaceLookupMaps(classElt, new HashSet<ClassElement>());
+    if (interfaceMaps != null) {
+      for (MemberMap interfaceMap in interfaceMaps) {
+        ExecutableElement overriddenElement = interfaceMap.get(memberName);
+        if (overriddenElement != null) {
+          if (overriddenElement is MultiplyInheritedExecutableElement) {
+            MultiplyInheritedExecutableElement multiplyInheritedElement =
+                overriddenElement;
+            for (ExecutableElement element
+                in multiplyInheritedElement.inheritedElements) {
+              result.add(element);
+            }
+          } else {
+            result.add(overriddenElement);
+          }
+        }
+      }
+    }
+    return result;
+  }
+
+  /**
+   * This method takes some inherited [FunctionType], and resolves all the parameterized types
+   * in the function type, dependent on the class in which it is being overridden.
+   *
+   * @param baseFunctionType the function type that is being overridden
+   * @param memberName the name of the member, this is used to lookup the inheritance path of the
+   *          override
+   * @param definingType the type that is overriding the member
+   * @return the passed function type with any parameterized types substituted
+   */
+  FunctionType substituteTypeArgumentsInMemberFromInheritance(
+      FunctionType baseFunctionType,
+      String memberName,
+      InterfaceType definingType) {
+    // if the baseFunctionType is null, or does not have any parameters,
+    // return it.
+    if (baseFunctionType == null ||
+        baseFunctionType.typeArguments.length == 0) {
+      return baseFunctionType;
+    }
+    // First, generate the path from the defining type to the overridden member
+    Queue<InterfaceType> inheritancePath = new Queue<InterfaceType>();
+    _computeInheritancePath(inheritancePath, definingType, memberName);
+    if (inheritancePath == null || inheritancePath.isEmpty) {
+      // TODO(jwren) log analysis engine error
+      return baseFunctionType;
+    }
+    FunctionType functionTypeToReturn = baseFunctionType;
+    // loop backward through the list substituting as we go:
+    while (!inheritancePath.isEmpty) {
+      InterfaceType lastType = inheritancePath.removeLast();
+      List<DartType> parameterTypes = lastType.element.type.typeArguments;
+      List<DartType> argumentTypes = lastType.typeArguments;
+      functionTypeToReturn =
+          functionTypeToReturn.substitute2(argumentTypes, parameterTypes);
+    }
+    return functionTypeToReturn;
+  }
+
+  /**
+   * Compute and return a mapping between the set of all string names of the members inherited from
+   * the passed [ClassElement] superclass hierarchy, and the associated
+   * [ExecutableElement].
+   *
+   * @param classElt the class element to query
+   * @param visitedClasses a set of visited classes passed back into this method when it calls
+   *          itself recursively
+   * @return a mapping between the set of all string names of the members inherited from the passed
+   *         [ClassElement] superclass hierarchy, and the associated [ExecutableElement]
+   */
+  MemberMap _computeClassChainLookupMap(
+      ClassElement classElt, HashSet<ClassElement> visitedClasses) {
+    MemberMap resultMap = _classLookup[classElt];
+    if (resultMap != null) {
+      return resultMap;
+    } else {
+      resultMap = new MemberMap();
+    }
+    ClassElement superclassElt = null;
+    InterfaceType supertype = classElt.supertype;
+    if (supertype != null) {
+      superclassElt = supertype.element;
+    } else {
+      // classElt is Object
+      _classLookup[classElt] = resultMap;
+      return resultMap;
+    }
+    if (superclassElt != null) {
+      if (!visitedClasses.contains(superclassElt)) {
+        visitedClasses.add(superclassElt);
+        try {
+          resultMap = new MemberMap.from(
+              _computeClassChainLookupMap(superclassElt, visitedClasses));
+          //
+          // Substitute the super types down the hierarchy.
+          //
+          _substituteTypeParametersDownHierarchy(supertype, resultMap);
+          //
+          // Include the members from the superclass in the resultMap.
+          //
+          _recordMapWithClassMembers(resultMap, supertype, false);
+        } finally {
+          visitedClasses.remove(superclassElt);
+        }
+      } else {
+        // This case happens only when the superclass was previously visited and
+        // not in the lookup, meaning this is meant to shorten the compute for
+        // recursive cases.
+        _classLookup[superclassElt] = resultMap;
+        return resultMap;
+      }
+    }
+    //
+    // Include the members from the mixins in the resultMap.  If there are
+    // multiple mixins, visit them in the order listed so that methods in later
+    // mixins will overwrite identically-named methods in earlier mixins.
+    //
+    List<InterfaceType> mixins = classElt.mixins;
+    for (InterfaceType mixin in mixins) {
+      ClassElement mixinElement = mixin.element;
+      if (mixinElement != null) {
+        if (!visitedClasses.contains(mixinElement)) {
+          visitedClasses.add(mixinElement);
+          try {
+            MemberMap map = new MemberMap.from(
+                _computeClassChainLookupMap(mixinElement, visitedClasses));
+            //
+            // Substitute the super types down the hierarchy.
+            //
+            _substituteTypeParametersDownHierarchy(mixin, map);
+            //
+            // Include the members from the superclass in the resultMap.
+            //
+            _recordMapWithClassMembers(map, mixin, false);
+            //
+            // Add the members from map into result map.
+            //
+            for (int j = 0; j < map.size; j++) {
+              String key = map.getKey(j);
+              ExecutableElement value = map.getValue(j);
+              if (key != null) {
+                ClassElement definingClass = value
+                    .getAncestor((Element element) => element is ClassElement);
+                if (!definingClass.type.isObject) {
+                  ExecutableElement existingValue = resultMap.get(key);
+                  if (existingValue == null ||
+                      (existingValue != null && !_isAbstract(value))) {
+                    resultMap.put(key, value);
+                  }
+                }
+              }
+            }
+          } finally {
+            visitedClasses.remove(mixinElement);
+          }
+        } else {
+          // This case happens only when the superclass was previously visited
+          // and not in the lookup, meaning this is meant to shorten the compute
+          // for recursive cases.
+          _classLookup[mixinElement] = resultMap;
+          return resultMap;
+        }
+      }
+    }
+    _classLookup[classElt] = resultMap;
+    return resultMap;
+  }
+
+  /**
+   * Compute and return the inheritance path given the context of a type and a member that is
+   * overridden in the inheritance path (for which the type is in the path).
+   *
+   * @param chain the inheritance path that is built up as this method calls itself recursively,
+   *          when this method is called an empty [LinkedList] should be provided
+   * @param currentType the current type in the inheritance path
+   * @param memberName the name of the member that is being looked up the inheritance path
+   */
+  void _computeInheritancePath(Queue<InterfaceType> chain,
+      InterfaceType currentType, String memberName) {
+    // TODO (jwren) create a public version of this method which doesn't require
+    // the initial chain to be provided, then provided tests for this
+    // functionality in InheritanceManagerTest
+    chain.add(currentType);
+    ClassElement classElt = currentType.element;
+    InterfaceType supertype = classElt.supertype;
+    // Base case- reached Object
+    if (supertype == null) {
+      // Looked up the chain all the way to Object, return null.
+      // This should never happen.
+      return;
+    }
+    // If we are done, return the chain
+    // We are not done if this is the first recursive call on this method.
+    if (chain.length != 1) {
+      // We are done however if the member is in this classElt
+      if (_lookupMemberInClass(classElt, memberName) != null) {
+        return;
+      }
+    }
+    // Mixins- note that mixins call lookupMemberInClass, not lookupMember
+    List<InterfaceType> mixins = classElt.mixins;
+    for (int i = mixins.length - 1; i >= 0; i--) {
+      ClassElement mixinElement = mixins[i].element;
+      if (mixinElement != null) {
+        ExecutableElement elt = _lookupMemberInClass(mixinElement, memberName);
+        if (elt != null) {
+          // this is equivalent (but faster than) calling this method
+          // recursively
+          // (return computeInheritancePath(chain, mixins[i], memberName);)
+          chain.add(mixins[i]);
+          return;
+        }
+      }
+    }
+    // Superclass
+    ClassElement superclassElt = supertype.element;
+    if (lookupMember(superclassElt, memberName) != null) {
+      _computeInheritancePath(chain, supertype, memberName);
+      return;
+    }
+    // Interfaces
+    List<InterfaceType> interfaces = classElt.interfaces;
+    for (InterfaceType interfaceType in interfaces) {
+      ClassElement interfaceElement = interfaceType.element;
+      if (interfaceElement != null &&
+          lookupMember(interfaceElement, memberName) != null) {
+        _computeInheritancePath(chain, interfaceType, memberName);
+        return;
+      }
+    }
+  }
+
+  /**
+   * Compute and return a mapping between the set of all string names of the members inherited from
+   * the passed [ClassElement] interface hierarchy, and the associated
+   * [ExecutableElement].
+   *
+   * @param classElt the class element to query
+   * @param visitedInterfaces a set of visited classes passed back into this method when it calls
+   *          itself recursively
+   * @return a mapping between the set of all string names of the members inherited from the passed
+   *         [ClassElement] interface hierarchy, and the associated [ExecutableElement]
+   */
+  MemberMap _computeInterfaceLookupMap(
+      ClassElement classElt, HashSet<ClassElement> visitedInterfaces) {
+    MemberMap resultMap = _interfaceLookup[classElt];
+    if (resultMap != null) {
+      return resultMap;
+    }
+    List<MemberMap> lookupMaps =
+        _gatherInterfaceLookupMaps(classElt, visitedInterfaces);
+    if (lookupMaps == null) {
+      resultMap = new MemberMap();
+    } else {
+      HashMap<String, List<ExecutableElement>> unionMap =
+          _unionInterfaceLookupMaps(lookupMaps);
+      resultMap = _resolveInheritanceLookup(classElt, unionMap);
+    }
+    _interfaceLookup[classElt] = resultMap;
+    return resultMap;
+  }
+
+  /**
+   * Collect a list of interface lookup maps whose elements correspond to all of the classes
+   * directly above [classElt] in the class hierarchy (the direct superclass if any, all
+   * mixins, and all direct superinterfaces). Each item in the list is the interface lookup map
+   * returned by [computeInterfaceLookupMap] for the corresponding super, except with type
+   * parameters appropriately substituted.
+   *
+   * @param classElt the class element to query
+   * @param visitedInterfaces a set of visited classes passed back into this method when it calls
+   *          itself recursively
+   * @return `null` if there was a problem (such as a loop in the class hierarchy) or if there
+   *         are no classes above this one in the class hierarchy. Otherwise, a list of interface
+   *         lookup maps.
+   */
+  List<MemberMap> _gatherInterfaceLookupMaps(
+      ClassElement classElt, HashSet<ClassElement> visitedInterfaces) {
+    InterfaceType supertype = classElt.supertype;
+    ClassElement superclassElement =
+        supertype != null ? supertype.element : null;
+    List<InterfaceType> mixins = classElt.mixins;
+    List<InterfaceType> interfaces = classElt.interfaces;
+    // Recursively collect the list of mappings from all of the interface types
+    List<MemberMap> lookupMaps = new List<MemberMap>();
+    //
+    // Superclass element
+    //
+    if (superclassElement != null) {
+      if (!visitedInterfaces.contains(superclassElement)) {
+        try {
+          visitedInterfaces.add(superclassElement);
+          //
+          // Recursively compute the map for the super type.
+          //
+          MemberMap map =
+              _computeInterfaceLookupMap(superclassElement, visitedInterfaces);
+          map = new MemberMap.from(map);
+          //
+          // Substitute the super type down the hierarchy.
+          //
+          _substituteTypeParametersDownHierarchy(supertype, map);
+          //
+          // Add any members from the super type into the map as well.
+          //
+          _recordMapWithClassMembers(map, supertype, true);
+          lookupMaps.add(map);
+        } finally {
+          visitedInterfaces.remove(superclassElement);
+        }
+      } else {
+        return null;
+      }
+    }
+    //
+    // Mixin elements
+    //
+    for (int i = mixins.length - 1; i >= 0; i--) {
+      InterfaceType mixinType = mixins[i];
+      ClassElement mixinElement = mixinType.element;
+      if (mixinElement != null) {
+        if (!visitedInterfaces.contains(mixinElement)) {
+          try {
+            visitedInterfaces.add(mixinElement);
+            //
+            // Recursively compute the map for the mixin.
+            //
+            MemberMap map =
+                _computeInterfaceLookupMap(mixinElement, visitedInterfaces);
+            map = new MemberMap.from(map);
+            //
+            // Substitute the mixin type down the hierarchy.
+            //
+            _substituteTypeParametersDownHierarchy(mixinType, map);
+            //
+            // Add any members from the mixin type into the map as well.
+            //
+            _recordMapWithClassMembers(map, mixinType, true);
+            lookupMaps.add(map);
+          } finally {
+            visitedInterfaces.remove(mixinElement);
+          }
+        } else {
+          return null;
+        }
+      }
+    }
+    //
+    // Interface elements
+    //
+    for (InterfaceType interfaceType in interfaces) {
+      ClassElement interfaceElement = interfaceType.element;
+      if (interfaceElement != null) {
+        if (!visitedInterfaces.contains(interfaceElement)) {
+          try {
+            visitedInterfaces.add(interfaceElement);
+            //
+            // Recursively compute the map for the interfaces.
+            //
+            MemberMap map =
+                _computeInterfaceLookupMap(interfaceElement, visitedInterfaces);
+            map = new MemberMap.from(map);
+            //
+            // Substitute the supertypes down the hierarchy
+            //
+            _substituteTypeParametersDownHierarchy(interfaceType, map);
+            //
+            // And add any members from the interface into the map as well.
+            //
+            _recordMapWithClassMembers(map, interfaceType, true);
+            lookupMaps.add(map);
+          } finally {
+            visitedInterfaces.remove(interfaceElement);
+          }
+        } else {
+          return null;
+        }
+      }
+    }
+    if (lookupMaps.length == 0) {
+      return null;
+    }
+    return lookupMaps;
+  }
+
+  /**
+   * Given some [ClassElement], this method finds and returns the [ExecutableElement] of
+   * the passed name in the class element. Static members, members in super types and members not
+   * accessible from the current library are not considered.
+   *
+   * @param classElt the class element to query
+   * @param memberName the name of the member to lookup in the class
+   * @return the found [ExecutableElement], or `null` if no such member was found
+   */
+  ExecutableElement _lookupMemberInClass(
+      ClassElement classElt, String memberName) {
+    List<MethodElement> methods = classElt.methods;
+    for (MethodElement method in methods) {
+      if (memberName == method.name &&
+          method.isAccessibleIn(_library) &&
+          !method.isStatic) {
+        return method;
+      }
+    }
+    List<PropertyAccessorElement> accessors = classElt.accessors;
+    for (PropertyAccessorElement accessor in accessors) {
+      if (memberName == accessor.name &&
+          accessor.isAccessibleIn(_library) &&
+          !accessor.isStatic) {
+        return accessor;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Record the passed map with the set of all members (methods, getters and setters) in the type
+   * into the passed map.
+   *
+   * @param map some non-`null` map to put the methods and accessors from the passed
+   *          [ClassElement] into
+   * @param type the type that will be recorded into the passed map
+   * @param doIncludeAbstract `true` if abstract members will be put into the map
+   */
+  void _recordMapWithClassMembers(
+      MemberMap map, InterfaceType type, bool doIncludeAbstract) {
+    List<MethodElement> methods = type.methods;
+    for (MethodElement method in methods) {
+      if (method.isAccessibleIn(_library) &&
+          !method.isStatic &&
+          (doIncludeAbstract || !method.isAbstract)) {
+        map.put(method.name, method);
+      }
+    }
+    List<PropertyAccessorElement> accessors = type.accessors;
+    for (PropertyAccessorElement accessor in accessors) {
+      if (accessor.isAccessibleIn(_library) &&
+          !accessor.isStatic &&
+          (doIncludeAbstract || !accessor.isAbstract)) {
+        map.put(accessor.name, accessor);
+      }
+    }
+  }
+
+  /**
+   * This method is used to report errors on when they are found computing inheritance information.
+   * See [ErrorVerifier.checkForInconsistentMethodInheritance] to see where these generated
+   * error codes are reported back into the analysis engine.
+   *
+   * @param classElt the location of the source for which the exception occurred
+   * @param offset the offset of the location of the error
+   * @param length the length of the location of the error
+   * @param errorCode the error code to be associated with this error
+   * @param arguments the arguments used to build the error message
+   */
+  void _reportError(ClassElement classElt, int offset, int length,
+      ErrorCode errorCode, List<Object> arguments) {
+    HashSet<AnalysisError> errorSet = _errorsInClassElement[classElt];
+    if (errorSet == null) {
+      errorSet = new HashSet<AnalysisError>();
+      _errorsInClassElement[classElt] = errorSet;
+    }
+    errorSet.add(new AnalysisError(
+        classElt.source, offset, length, errorCode, arguments));
+  }
+
+  /**
+   * Given the set of methods defined by classes above [classElt] in the class hierarchy,
+   * apply the appropriate inheritance rules to determine those methods inherited by or overridden
+   * by [classElt]. Also report static warnings
+   * [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE] and
+   * [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD] if appropriate.
+   *
+   * @param classElt the class element to query.
+   * @param unionMap a mapping from method name to the set of unique (in terms of signature) methods
+   *          defined in superclasses of [classElt].
+   * @return the inheritance lookup map for [classElt].
+   */
+  MemberMap _resolveInheritanceLookup(ClassElement classElt,
+      HashMap<String, List<ExecutableElement>> unionMap) {
+    MemberMap resultMap = new MemberMap();
+    unionMap.forEach((String key, List<ExecutableElement> list) {
+      int numOfEltsWithMatchingNames = list.length;
+      if (numOfEltsWithMatchingNames == 1) {
+        //
+        // Example: class A inherits only 1 method named 'm'.
+        // Since it is the only such method, it is inherited.
+        // Another example: class A inherits 2 methods named 'm' from 2
+        // different interfaces, but they both have the same signature, so it is
+        // the method inherited.
+        //
+        resultMap.put(key, list[0]);
+      } else {
+        //
+        // Then numOfEltsWithMatchingNames > 1, check for the warning cases.
+        //
+        bool allMethods = true;
+        bool allSetters = true;
+        bool allGetters = true;
+        for (ExecutableElement executableElement in list) {
+          if (executableElement is PropertyAccessorElement) {
+            allMethods = false;
+            if (executableElement.isSetter) {
+              allGetters = false;
+            } else {
+              allSetters = false;
+            }
+          } else {
+            allGetters = false;
+            allSetters = false;
+          }
+        }
+        //
+        // If there isn't a mixture of methods with getters, then continue,
+        // otherwise create a warning.
+        //
+        if (allMethods || allGetters || allSetters) {
+          //
+          // Compute the element whose type is the subtype of all of the other
+          // types.
+          //
+          List<ExecutableElement> elements = new List.from(list);
+          List<FunctionType> executableElementTypes =
+              new List<FunctionType>(numOfEltsWithMatchingNames);
+          for (int i = 0; i < numOfEltsWithMatchingNames; i++) {
+            executableElementTypes[i] = elements[i].type;
+          }
+          List<int> subtypesOfAllOtherTypesIndexes = new List<int>();
+          for (int i = 0; i < numOfEltsWithMatchingNames; i++) {
+            FunctionType subtype = executableElementTypes[i];
+            if (subtype == null) {
+              continue;
+            }
+            bool subtypeOfAllTypes = true;
+            for (int j = 0;
+                j < numOfEltsWithMatchingNames && subtypeOfAllTypes;
+                j++) {
+              if (i != j) {
+                if (!subtype.isSubtypeOf(executableElementTypes[j])) {
+                  subtypeOfAllTypes = false;
+                  break;
+                }
+              }
+            }
+            if (subtypeOfAllTypes) {
+              subtypesOfAllOtherTypesIndexes.add(i);
+            }
+          }
+          //
+          // The following is split into three cases determined by the number of
+          // elements in subtypesOfAllOtherTypes
+          //
+          if (subtypesOfAllOtherTypesIndexes.length == 1) {
+            //
+            // Example: class A inherited only 2 method named 'm'.
+            // One has the function type '() -> dynamic' and one has the
+            // function type '([int]) -> dynamic'. Since the second method is a
+            // subtype of all the others, it is the inherited method.
+            // Tests: InheritanceManagerTest.
+            // test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_*
+            //
+            resultMap.put(key, elements[subtypesOfAllOtherTypesIndexes[0]]);
+          } else {
+            if (subtypesOfAllOtherTypesIndexes.isEmpty) {
+              //
+              // Determine if the current class has a method or accessor with
+              // the member name, if it does then then this class does not
+              // "inherit" from any of the supertypes. See issue 16134.
+              //
+              bool classHasMember = false;
+              if (allMethods) {
+                classHasMember = classElt.getMethod(key) != null;
+              } else {
+                List<PropertyAccessorElement> accessors = classElt.accessors;
+                for (int i = 0; i < accessors.length; i++) {
+                  if (accessors[i].name == key) {
+                    classHasMember = true;
+                  }
+                }
+              }
+              //
+              // Example: class A inherited only 2 method named 'm'.
+              // One has the function type '() -> int' and one has the function
+              // type '() -> String'. Since neither is a subtype of the other,
+              // we create a warning, and have this class inherit nothing.
+              //
+              if (!classHasMember) {
+                String firstTwoFuntionTypesStr =
+                    "${executableElementTypes[0]}, ${executableElementTypes[1]}";
+                _reportError(
+                    classElt,
+                    classElt.nameOffset,
+                    classElt.displayName.length,
+                    StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE,
+                    [key, firstTwoFuntionTypesStr]);
+              }
+            } else {
+              //
+              // Example: class A inherits 2 methods named 'm'.
+              // One has the function type '(int) -> dynamic' and one has the
+              // function type '(num) -> dynamic'. Since they are both a subtype
+              // of the other, a synthetic function '(dynamic) -> dynamic' is
+              // inherited.
+              // Tests: test_getMapOfMembersInheritedFromInterfaces_
+              // union_multipleSubtypes_*
+              //
+              List<ExecutableElement> elementArrayToMerge = new List<
+                  ExecutableElement>(subtypesOfAllOtherTypesIndexes.length);
+              for (int i = 0; i < elementArrayToMerge.length; i++) {
+                elementArrayToMerge[i] =
+                    elements[subtypesOfAllOtherTypesIndexes[i]];
+              }
+              ExecutableElement mergedExecutableElement =
+                  _computeMergedExecutableElement(elementArrayToMerge);
+              resultMap.put(key, mergedExecutableElement);
+            }
+          }
+        } else {
+          _reportError(
+              classElt,
+              classElt.nameOffset,
+              classElt.displayName.length,
+              StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD,
+              [key]);
+        }
+      }
+    });
+    return resultMap;
+  }
+
+  /**
+   * Loop through all of the members in some [MemberMap], performing type parameter
+   * substitutions using a passed supertype.
+   *
+   * @param superType the supertype to substitute into the members of the [MemberMap]
+   * @param map the MemberMap to perform the substitutions on
+   */
+  void _substituteTypeParametersDownHierarchy(
+      InterfaceType superType, MemberMap map) {
+    for (int i = 0; i < map.size; i++) {
+      ExecutableElement executableElement = map.getValue(i);
+      if (executableElement is MethodMember) {
+        executableElement =
+            MethodMember.from(executableElement as MethodMember, superType);
+        map.setValue(i, executableElement);
+      } else if (executableElement is PropertyAccessorMember) {
+        executableElement = PropertyAccessorMember.from(
+            executableElement as PropertyAccessorMember, superType);
+        map.setValue(i, executableElement);
+      }
+    }
+  }
+
+  /**
+   * Union all of the [lookupMaps] together into a single map, grouping the ExecutableElements
+   * into a list where none of the elements are equal where equality is determined by having equal
+   * function types. (We also take note too of the kind of the element: ()->int and () -> int may
+   * not be equal if one is a getter and the other is a method.)
+   *
+   * @param lookupMaps the maps to be unioned together.
+   * @return the resulting union map.
+   */
+  HashMap<String, List<ExecutableElement>> _unionInterfaceLookupMaps(
+      List<MemberMap> lookupMaps) {
+    HashMap<String, List<ExecutableElement>> unionMap =
+        new HashMap<String, List<ExecutableElement>>();
+    for (MemberMap lookupMap in lookupMaps) {
+      int lookupMapSize = lookupMap.size;
+      for (int i = 0; i < lookupMapSize; i++) {
+        // Get the string key, if null, break.
+        String key = lookupMap.getKey(i);
+        if (key == null) {
+          break;
+        }
+        // Get the list value out of the unionMap
+        List<ExecutableElement> list = unionMap[key];
+        // If we haven't created such a map for this key yet, do create it and
+        // put the list entry into the unionMap.
+        if (list == null) {
+          list = new List<ExecutableElement>();
+          unionMap[key] = list;
+        }
+        // Fetch the entry out of this lookupMap
+        ExecutableElement newExecutableElementEntry = lookupMap.getValue(i);
+        if (list.isEmpty) {
+          // If the list is empty, just the new value
+          list.add(newExecutableElementEntry);
+        } else {
+          // Otherwise, only add the newExecutableElementEntry if it isn't
+          // already in the list, this covers situation where a class inherits
+          // two methods (or two getters) that are identical.
+          bool alreadyInList = false;
+          bool isMethod1 = newExecutableElementEntry is MethodElement;
+          for (ExecutableElement executableElementInList in list) {
+            bool isMethod2 = executableElementInList is MethodElement;
+            if (isMethod1 == isMethod2 &&
+                executableElementInList.type ==
+                    newExecutableElementEntry.type) {
+              alreadyInList = true;
+              break;
+            }
+          }
+          if (!alreadyInList) {
+            list.add(newExecutableElementEntry);
+          }
+        }
+      }
+    }
+    return unionMap;
+  }
+
+  /**
+   * Given some array of [ExecutableElement]s, this method creates a synthetic element as
+   * described in 8.1.1:
+   *
+   * Let <i>numberOfPositionals</i>(<i>f</i>) denote the number of positional parameters of a
+   * function <i>f</i>, and let <i>numberOfRequiredParams</i>(<i>f</i>) denote the number of
+   * required parameters of a function <i>f</i>. Furthermore, let <i>s</i> denote the set of all
+   * named parameters of the <i>m<sub>1</sub>, &hellip;, m<sub>k</sub></i>. Then let
+   * * <i>h = max(numberOfPositionals(m<sub>i</sub>)),</i>
+   * * <i>r = min(numberOfRequiredParams(m<sub>i</sub>)), for all <i>i</i>, 1 <= i <= k.</i>
+   * Then <i>I</i> has a method named <i>n</i>, with <i>r</i> required parameters of type
+   * <b>dynamic</b>, <i>h</i> positional parameters of type <b>dynamic</b>, named parameters
+   * <i>s</i> of type <b>dynamic</b> and return type <b>dynamic</b>.
+   *
+   */
+  static ExecutableElement _computeMergedExecutableElement(
+      List<ExecutableElement> elementArrayToMerge) {
+    int h = _getNumOfPositionalParameters(elementArrayToMerge[0]);
+    int r = _getNumOfRequiredParameters(elementArrayToMerge[0]);
+    Set<String> namedParametersList = new HashSet<String>();
+    for (int i = 1; i < elementArrayToMerge.length; i++) {
+      ExecutableElement element = elementArrayToMerge[i];
+      int numOfPositionalParams = _getNumOfPositionalParameters(element);
+      if (h < numOfPositionalParams) {
+        h = numOfPositionalParams;
+      }
+      int numOfRequiredParams = _getNumOfRequiredParameters(element);
+      if (r > numOfRequiredParams) {
+        r = numOfRequiredParams;
+      }
+      namedParametersList.addAll(_getNamedParameterNames(element));
+    }
+    return _createSyntheticExecutableElement(
+        elementArrayToMerge,
+        elementArrayToMerge[0].displayName,
+        r,
+        h - r,
+        new List.from(namedParametersList));
+  }
+
+  /**
+   * Used by [computeMergedExecutableElement] to actually create the
+   * synthetic element.
+   *
+   * @param elementArrayToMerge the array used to create the synthetic element
+   * @param name the name of the method, getter or setter
+   * @param numOfRequiredParameters the number of required parameters
+   * @param numOfPositionalParameters the number of positional parameters
+   * @param namedParameters the list of [String]s that are the named parameters
+   * @return the created synthetic element
+   */
+  static ExecutableElement _createSyntheticExecutableElement(
+      List<ExecutableElement> elementArrayToMerge,
+      String name,
+      int numOfRequiredParameters,
+      int numOfPositionalParameters,
+      List<String> namedParameters) {
+    DynamicTypeImpl dynamicType = DynamicTypeImpl.instance;
+    SimpleIdentifier nameIdentifier = new SimpleIdentifier(
+        new sc.StringToken(sc.TokenType.IDENTIFIER, name, 0));
+    ExecutableElementImpl executable;
+    if (elementArrayToMerge[0] is MethodElement) {
+      MultiplyInheritedMethodElementImpl unionedMethod =
+          new MultiplyInheritedMethodElementImpl(nameIdentifier);
+      unionedMethod.inheritedElements = elementArrayToMerge;
+      executable = unionedMethod;
+    } else {
+      MultiplyInheritedPropertyAccessorElementImpl unionedPropertyAccessor =
+          new MultiplyInheritedPropertyAccessorElementImpl(nameIdentifier);
+      unionedPropertyAccessor.getter =
+          (elementArrayToMerge[0] as PropertyAccessorElement).isGetter;
+      unionedPropertyAccessor.setter =
+          (elementArrayToMerge[0] as PropertyAccessorElement).isSetter;
+      unionedPropertyAccessor.inheritedElements = elementArrayToMerge;
+      executable = unionedPropertyAccessor;
+    }
+    int numOfParameters = numOfRequiredParameters +
+        numOfPositionalParameters +
+        namedParameters.length;
+    List<ParameterElement> parameters =
+        new List<ParameterElement>(numOfParameters);
+    int i = 0;
+    for (int j = 0; j < numOfRequiredParameters; j++, i++) {
+      ParameterElementImpl parameter = new ParameterElementImpl("", 0);
+      parameter.type = dynamicType;
+      parameter.parameterKind = ParameterKind.REQUIRED;
+      parameters[i] = parameter;
+    }
+    for (int k = 0; k < numOfPositionalParameters; k++, i++) {
+      ParameterElementImpl parameter = new ParameterElementImpl("", 0);
+      parameter.type = dynamicType;
+      parameter.parameterKind = ParameterKind.POSITIONAL;
+      parameters[i] = parameter;
+    }
+    for (int m = 0; m < namedParameters.length; m++, i++) {
+      ParameterElementImpl parameter =
+          new ParameterElementImpl(namedParameters[m], 0);
+      parameter.type = dynamicType;
+      parameter.parameterKind = ParameterKind.NAMED;
+      parameters[i] = parameter;
+    }
+    executable.returnType = dynamicType;
+    executable.parameters = parameters;
+    FunctionTypeImpl methodType = new FunctionTypeImpl(executable);
+    executable.type = methodType;
+    return executable;
+  }
+
+  /**
+   * Given some [ExecutableElement], return the list of named parameters.
+   */
+  static List<String> _getNamedParameterNames(
+      ExecutableElement executableElement) {
+    List<String> namedParameterNames = new List<String>();
+    List<ParameterElement> parameters = executableElement.parameters;
+    for (int i = 0; i < parameters.length; i++) {
+      ParameterElement parameterElement = parameters[i];
+      if (parameterElement.parameterKind == ParameterKind.NAMED) {
+        namedParameterNames.add(parameterElement.name);
+      }
+    }
+    return namedParameterNames;
+  }
+
+  /**
+   * Given some [ExecutableElement] return the number of parameters of the specified kind.
+   */
+  static int _getNumOfParameters(
+      ExecutableElement executableElement, ParameterKind parameterKind) {
+    int parameterCount = 0;
+    List<ParameterElement> parameters = executableElement.parameters;
+    for (int i = 0; i < parameters.length; i++) {
+      ParameterElement parameterElement = parameters[i];
+      if (parameterElement.parameterKind == parameterKind) {
+        parameterCount++;
+      }
+    }
+    return parameterCount;
+  }
+
+  /**
+   * Given some [ExecutableElement] return the number of positional parameters.
+   *
+   * Note: by positional we mean [ParameterKind.REQUIRED] or [ParameterKind.POSITIONAL].
+   */
+  static int _getNumOfPositionalParameters(
+          ExecutableElement executableElement) =>
+      _getNumOfParameters(executableElement, ParameterKind.REQUIRED) +
+          _getNumOfParameters(executableElement, ParameterKind.POSITIONAL);
+
+  /**
+   * Given some [ExecutableElement] return the number of required parameters.
+   */
+  static int _getNumOfRequiredParameters(ExecutableElement executableElement) =>
+      _getNumOfParameters(executableElement, ParameterKind.REQUIRED);
+
+  /**
+   * Given some [ExecutableElement] returns `true` if it is an abstract member of a
+   * class.
+   *
+   * @param executableElement some [ExecutableElement] to evaluate
+   * @return `true` if the given element is an abstract member of a class
+   */
+  static bool _isAbstract(ExecutableElement executableElement) {
+    if (executableElement is MethodElement) {
+      return executableElement.isAbstract;
+    } else if (executableElement is PropertyAccessorElement) {
+      return executableElement.isAbstract;
+    }
+    return false;
+  }
+}
+
+/**
+ * This enum holds one of four states of a field initialization state through a constructor
+ * signature, not initialized, initialized in the field declaration, initialized in the field
+ * formal, and finally, initialized in the initializers list.
+ */
+class INIT_STATE extends Enum<INIT_STATE> {
+  static const INIT_STATE NOT_INIT = const INIT_STATE('NOT_INIT', 0);
+
+  static const INIT_STATE INIT_IN_DECLARATION =
+      const INIT_STATE('INIT_IN_DECLARATION', 1);
+
+  static const INIT_STATE INIT_IN_FIELD_FORMAL =
+      const INIT_STATE('INIT_IN_FIELD_FORMAL', 2);
+
+  static const INIT_STATE INIT_IN_INITIALIZERS =
+      const INIT_STATE('INIT_IN_INITIALIZERS', 3);
+
+  static const List<INIT_STATE> values = const [
+    NOT_INIT,
+    INIT_IN_DECLARATION,
+    INIT_IN_FIELD_FORMAL,
+    INIT_IN_INITIALIZERS
+  ];
+
+  const INIT_STATE(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
+ * Instances of the class `LabelScope` represent a scope in which a single label is defined.
+ */
+class LabelScope {
+  /**
+   * The label scope enclosing this label scope.
+   */
+  final LabelScope _outerScope;
+
+  /**
+   * The label defined in this scope.
+   */
+  final String _label;
+
+  /**
+   * The element to which the label resolves.
+   */
+  final LabelElement element;
+
+  /**
+   * The AST node to which the label resolves.
+   */
+  final AstNode node;
+
+  /**
+   * Initialize a newly created scope to represent the label [_label].
+   * [_outerScope] is the scope enclosing the new label scope.  [node] is the
+   * AST node the label resolves to.  [element] is the element the label
+   * resolves to.
+   */
+  LabelScope(this._outerScope, this._label, this.node, this.element);
+
+  /**
+   * Return the LabelScope which defines [targetLabel], or `null` if it is not
+   * defined in this scope.
+   */
+  LabelScope lookup(String targetLabel) {
+    if (_label == targetLabel) {
+      return this;
+    } else if (_outerScope != null) {
+      return _outerScope.lookup(targetLabel);
+    } else {
+      return null;
+    }
+  }
+}
+
+/**
+ * Instances of the class `Library` represent the data about a single library during the
+ * resolution of some (possibly different) library. They are not intended to be used except during
+ * the resolution process.
+ */
+class Library {
+  /**
+   * An empty list that can be used to initialize lists of libraries.
+   */
+  static const List<Library> _EMPTY_ARRAY = const <Library>[];
+
+  /**
+   * The prefix of a URI using the dart-ext scheme to reference a native code library.
+   */
+  static String _DART_EXT_SCHEME = "dart-ext:";
+
+  /**
+   * The analysis context in which this library is being analyzed.
+   */
+  final InternalAnalysisContext _analysisContext;
+
+  /**
+   * The inheritance manager which is used for this member lookups in this library.
+   */
+  InheritanceManager _inheritanceManager;
+
+  /**
+   * The listener to which analysis errors will be reported.
+   */
+  final AnalysisErrorListener errorListener;
+
+  /**
+   * The source specifying the defining compilation unit of this library.
+   */
+  final Source librarySource;
+
+  /**
+   * The library element representing this library.
+   */
+  LibraryElementImpl _libraryElement;
+
+  /**
+   * A list containing all of the libraries that are imported into this library.
+   */
+  List<Library> _importedLibraries = _EMPTY_ARRAY;
+
+  /**
+   * A table mapping URI-based directive to the actual URI value.
+   */
+  HashMap<UriBasedDirective, String> _directiveUris =
+      new HashMap<UriBasedDirective, String>();
+
+  /**
+   * A flag indicating whether this library explicitly imports core.
+   */
+  bool explicitlyImportsCore = false;
+
+  /**
+   * A list containing all of the libraries that are exported from this library.
+   */
+  List<Library> _exportedLibraries = _EMPTY_ARRAY;
+
+  /**
+   * A table mapping the sources for the compilation units in this library to their corresponding
+   * AST structures.
+   */
+  HashMap<Source, CompilationUnit> _astMap =
+      new HashMap<Source, CompilationUnit>();
+
+  /**
+   * The library scope used when resolving elements within this library's compilation units.
+   */
+  LibraryScope _libraryScope;
+
+  /**
+   * Initialize a newly created data holder that can maintain the data associated with a library.
+   *
+   * @param analysisContext the analysis context in which this library is being analyzed
+   * @param errorListener the listener to which analysis errors will be reported
+   * @param librarySource the source specifying the defining compilation unit of this library
+   */
+  Library(this._analysisContext, this.errorListener, this.librarySource) {
+    this._libraryElement =
+        _analysisContext.getLibraryElement(librarySource) as LibraryElementImpl;
+  }
+
+  /**
+   * Return an array of the [CompilationUnit]s that make up the library. The first unit is
+   * always the defining unit.
+   *
+   * @return an array of the [CompilationUnit]s that make up the library. The first unit is
+   *         always the defining unit
+   */
+  List<CompilationUnit> get compilationUnits {
+    List<CompilationUnit> unitArrayList = new List<CompilationUnit>();
+    unitArrayList.add(definingCompilationUnit);
+    for (Source source in _astMap.keys.toSet()) {
+      if (librarySource != source) {
+        unitArrayList.add(getAST(source));
+      }
+    }
+    return unitArrayList;
+  }
+
+  /**
+   * Return a collection containing the sources for the compilation units in this library, including
+   * the defining compilation unit.
+   *
+   * @return the sources for the compilation units in this library
+   */
+  Set<Source> get compilationUnitSources => _astMap.keys.toSet();
+
+  /**
+   * Return the AST structure associated with the defining compilation unit for this library.
+   *
+   * @return the AST structure associated with the defining compilation unit for this library
+   * @throws AnalysisException if an AST structure could not be created for the defining compilation
+   *           unit
+   */
+  CompilationUnit get definingCompilationUnit => getAST(librarySource);
+
+  /**
+   * Set the libraries that are exported by this library to be those in the given array.
+   *
+   * @param exportedLibraries the libraries that are exported by this library
+   */
+  void set exportedLibraries(List<Library> exportedLibraries) {
+    this._exportedLibraries = exportedLibraries;
+  }
+
+  /**
+   * Return an array containing the libraries that are exported from this library.
+   *
+   * @return an array containing the libraries that are exported from this library
+   */
+  List<Library> get exports => _exportedLibraries;
+
+  /**
+   * Set the libraries that are imported into this library to be those in the given array.
+   *
+   * @param importedLibraries the libraries that are imported into this library
+   */
+  void set importedLibraries(List<Library> importedLibraries) {
+    this._importedLibraries = importedLibraries;
+  }
+
+  /**
+   * Return an array containing the libraries that are imported into this library.
+   *
+   * @return an array containing the libraries that are imported into this library
+   */
+  List<Library> get imports => _importedLibraries;
+
+  /**
+   * Return an array containing the libraries that are either imported or exported from this
+   * library.
+   *
+   * @return the libraries that are either imported or exported from this library
+   */
+  List<Library> get importsAndExports {
+    HashSet<Library> libraries = new HashSet<Library>();
+    for (Library library in _importedLibraries) {
+      libraries.add(library);
+    }
+    for (Library library in _exportedLibraries) {
+      libraries.add(library);
+    }
+    return new List.from(libraries);
+  }
+
+  /**
+   * Return the inheritance manager for this library.
+   *
+   * @return the inheritance manager for this library
+   */
+  InheritanceManager get inheritanceManager {
+    if (_inheritanceManager == null) {
+      return _inheritanceManager = new InheritanceManager(_libraryElement);
+    }
+    return _inheritanceManager;
+  }
+
+  /**
+   * Return the library element representing this library, creating it if necessary.
+   *
+   * @return the library element representing this library
+   */
+  LibraryElementImpl get libraryElement {
+    if (_libraryElement == null) {
+      try {
+        _libraryElement = _analysisContext.computeLibraryElement(librarySource)
+            as LibraryElementImpl;
+      } on AnalysisException catch (exception, stackTrace) {
+        AnalysisEngine.instance.logger.logError(
+            "Could not compute library element for ${librarySource.fullName}",
+            new CaughtException(exception, stackTrace));
+      }
+    }
+    return _libraryElement;
+  }
+
+  /**
+   * Set the library element representing this library to the given library element.
+   *
+   * @param libraryElement the library element representing this library
+   */
+  void set libraryElement(LibraryElementImpl libraryElement) {
+    this._libraryElement = libraryElement;
+    if (_inheritanceManager != null) {
+      _inheritanceManager.libraryElement = libraryElement;
+    }
+  }
+
+  /**
+   * Return the library scope used when resolving elements within this library's compilation units.
+   *
+   * @return the library scope used when resolving elements within this library's compilation units
+   */
+  LibraryScope get libraryScope {
+    if (_libraryScope == null) {
+      _libraryScope = new LibraryScope(_libraryElement, errorListener);
+    }
+    return _libraryScope;
+  }
+
+  /**
+   * Return the AST structure associated with the given source.
+   *
+   * @param source the source representing the compilation unit whose AST is to be returned
+   * @return the AST structure associated with the given source
+   * @throws AnalysisException if an AST structure could not be created for the compilation unit
+   */
+  CompilationUnit getAST(Source source) {
+    CompilationUnit unit = _astMap[source];
+    if (unit == null) {
+      unit = _analysisContext.computeResolvableCompilationUnit(source);
+      _astMap[source] = unit;
+    }
+    return unit;
+  }
+
+  /**
+   * Return the result of resolving the URI of the given URI-based directive against the URI of the
+   * library, or `null` if the URI is not valid. If the URI is not valid, report the error.
+   *
+   * @param directive the directive which URI should be resolved
+   * @return the result of resolving the URI against the URI of the library
+   */
+  Source getSource(UriBasedDirective directive) {
+    StringLiteral uriLiteral = directive.uri;
+    if (uriLiteral is StringInterpolation) {
+      errorListener.onError(new AnalysisError(librarySource, uriLiteral.offset,
+          uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION));
+      return null;
+    }
+    String uriContent = uriLiteral.stringValue.trim();
+    _directiveUris[directive] = uriContent;
+    uriContent = Uri.encodeFull(uriContent);
+    if (directive is ImportDirective &&
+        uriContent.startsWith(_DART_EXT_SCHEME)) {
+      _libraryElement.hasExtUri = true;
+      return null;
+    }
+    try {
+      parseUriWithException(uriContent);
+      Source source =
+          _analysisContext.sourceFactory.resolveUri(librarySource, uriContent);
+      if (!_analysisContext.exists(source)) {
+        errorListener.onError(new AnalysisError(
+            librarySource,
+            uriLiteral.offset,
+            uriLiteral.length,
+            CompileTimeErrorCode.URI_DOES_NOT_EXIST,
+            [uriContent]));
+      }
+      return source;
+    } on URISyntaxException {
+      errorListener.onError(new AnalysisError(librarySource, uriLiteral.offset,
+          uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent]));
+    }
+    return null;
+  }
+
+  /**
+   * Returns the URI value of the given directive.
+   */
+  String getUri(UriBasedDirective directive) => _directiveUris[directive];
+
+  /**
+   * Set the AST structure associated with the defining compilation unit for this library to the
+   * given AST structure.
+   *
+   * @param unit the AST structure associated with the defining compilation unit for this library
+   */
+  void setDefiningCompilationUnit(CompilationUnit unit) {
+    _astMap[librarySource] = unit;
+  }
+
+  @override
+  String toString() => librarySource.shortName;
+}
+
+/**
+ * Instances of the class `LibraryElementBuilder` build an element model for a single library.
+ */
+class LibraryElementBuilder {
+  /**
+   * The analysis context in which the element model will be built.
+   */
+  final InternalAnalysisContext _analysisContext;
+
+  /**
+   * The listener to which errors will be reported.
+   */
+  final AnalysisErrorListener _errorListener;
+
+  /**
+   * Initialize a newly created library element builder.
+   *
+   * @param analysisContext the analysis context in which the element model will be built
+   * @param errorListener the listener to which errors will be reported
+   */
+  LibraryElementBuilder(this._analysisContext, this._errorListener);
+
+  /**
+   * Build the library element for the given library.
+   *
+   * @param library the library for which an element model is to be built
+   * @return the library element that was built
+   * @throws AnalysisException if the analysis could not be performed
+   */
+  LibraryElementImpl buildLibrary(Library library) {
+    CompilationUnitBuilder builder = new CompilationUnitBuilder();
+    Source librarySource = library.librarySource;
+    CompilationUnit definingCompilationUnit = library.definingCompilationUnit;
+    CompilationUnitElementImpl definingCompilationUnitElement = builder
+        .buildCompilationUnit(
+            librarySource, definingCompilationUnit, librarySource);
+    NodeList<Directive> directives = definingCompilationUnit.directives;
+    LibraryIdentifier libraryNameNode = null;
+    bool hasPartDirective = false;
+    FunctionElement entryPoint =
+        _findEntryPoint(definingCompilationUnitElement);
+    List<Directive> directivesToResolve = new List<Directive>();
+    List<CompilationUnitElementImpl> sourcedCompilationUnits =
+        new List<CompilationUnitElementImpl>();
+    for (Directive directive in directives) {
+      //
+      // We do not build the elements representing the import and export
+      // directives at this point. That is not done until we get to
+      // LibraryResolver.buildDirectiveModels() because we need the
+      // LibraryElements for the referenced libraries, which might not exist at
+      // this point (due to the possibility of circular references).
+      //
+      if (directive is LibraryDirective) {
+        if (libraryNameNode == null) {
+          libraryNameNode = directive.name;
+          directivesToResolve.add(directive);
+        }
+      } else if (directive is PartDirective) {
+        PartDirective partDirective = directive;
+        StringLiteral partUri = partDirective.uri;
+        Source partSource = partDirective.source;
+        if (_analysisContext.exists(partSource)) {
+          hasPartDirective = true;
+          CompilationUnit partUnit = library.getAST(partSource);
+          CompilationUnitElementImpl part =
+              builder.buildCompilationUnit(partSource, partUnit, librarySource);
+          part.uriOffset = partUri.offset;
+          part.uriEnd = partUri.end;
+          part.uri = partDirective.uriContent;
+          //
+          // Validate that the part contains a part-of directive with the same
+          // name as the library.
+          //
+          String partLibraryName =
+              _getPartLibraryName(partSource, partUnit, directivesToResolve);
+          if (partLibraryName == null) {
+            _errorListener.onError(new AnalysisError(
+                librarySource,
+                partUri.offset,
+                partUri.length,
+                CompileTimeErrorCode.PART_OF_NON_PART,
+                [partUri.toSource()]));
+          } else if (libraryNameNode == null) {
+            // TODO(brianwilkerson) Collect the names declared by the part.
+            // If they are all the same then we can use that name as the
+            // inferred name of the library and present it in a quick-fix.
+            // partLibraryNames.add(partLibraryName);
+          } else if (libraryNameNode.name != partLibraryName) {
+            _errorListener.onError(new AnalysisError(
+                librarySource,
+                partUri.offset,
+                partUri.length,
+                StaticWarningCode.PART_OF_DIFFERENT_LIBRARY,
+                [libraryNameNode.name, partLibraryName]));
+          }
+          if (entryPoint == null) {
+            entryPoint = _findEntryPoint(part);
+          }
+          directive.element = part;
+          sourcedCompilationUnits.add(part);
+        }
+      }
+    }
+    if (hasPartDirective && libraryNameNode == null) {
+      _errorListener.onError(new AnalysisError(librarySource, 0, 0,
+          ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART));
+    }
+    //
+    // Create and populate the library element.
+    //
+    LibraryElementImpl libraryElement = new LibraryElementImpl.forNode(
+        _analysisContext.getContextFor(librarySource), libraryNameNode);
+    libraryElement.definingCompilationUnit = definingCompilationUnitElement;
+    if (entryPoint != null) {
+      libraryElement.entryPoint = entryPoint;
+    }
+    int sourcedUnitCount = sourcedCompilationUnits.length;
+    libraryElement.parts = sourcedCompilationUnits;
+    for (Directive directive in directivesToResolve) {
+      directive.element = libraryElement;
+    }
+    library.libraryElement = libraryElement;
+    if (sourcedUnitCount > 0) {
+      _patchTopLevelAccessors(libraryElement);
+    }
+    return libraryElement;
+  }
+
+  /**
+   * Build the library element for the given library.  The resulting element is
+   * stored in the [ResolvableLibrary] structure.
+   *
+   * @param library the library for which an element model is to be built
+   * @throws AnalysisException if the analysis could not be performed
+   */
+  void buildLibrary2(ResolvableLibrary library) {
+    CompilationUnitBuilder builder = new CompilationUnitBuilder();
+    Source librarySource = library.librarySource;
+    CompilationUnit definingCompilationUnit = library.definingCompilationUnit;
+    CompilationUnitElementImpl definingCompilationUnitElement = builder
+        .buildCompilationUnit(
+            librarySource, definingCompilationUnit, librarySource);
+    NodeList<Directive> directives = definingCompilationUnit.directives;
+    LibraryIdentifier libraryNameNode = null;
+    bool hasPartDirective = false;
+    FunctionElement entryPoint =
+        _findEntryPoint(definingCompilationUnitElement);
+    List<Directive> directivesToResolve = new List<Directive>();
+    List<CompilationUnitElementImpl> sourcedCompilationUnits =
+        new List<CompilationUnitElementImpl>();
+    for (Directive directive in directives) {
+      //
+      // We do not build the elements representing the import and export
+      // directives at this point. That is not done until we get to
+      // LibraryResolver.buildDirectiveModels() because we need the
+      // LibraryElements for the referenced libraries, which might not exist at
+      // this point (due to the possibility of circular references).
+      //
+      if (directive is LibraryDirective) {
+        if (libraryNameNode == null) {
+          libraryNameNode = directive.name;
+          directivesToResolve.add(directive);
+        }
+      } else if (directive is PartDirective) {
+        PartDirective partDirective = directive;
+        StringLiteral partUri = partDirective.uri;
+        Source partSource = partDirective.source;
+        if (_analysisContext.exists(partSource)) {
+          hasPartDirective = true;
+          CompilationUnit partUnit = library.getAST(partSource);
+          if (partUnit != null) {
+            CompilationUnitElementImpl part = builder.buildCompilationUnit(
+                partSource, partUnit, librarySource);
+            part.uriOffset = partUri.offset;
+            part.uriEnd = partUri.end;
+            part.uri = partDirective.uriContent;
+            //
+            // Validate that the part contains a part-of directive with the same
+            // name as the library.
+            //
+            String partLibraryName =
+                _getPartLibraryName(partSource, partUnit, directivesToResolve);
+            if (partLibraryName == null) {
+              _errorListener.onError(new AnalysisError(
+                  librarySource,
+                  partUri.offset,
+                  partUri.length,
+                  CompileTimeErrorCode.PART_OF_NON_PART,
+                  [partUri.toSource()]));
+            } else if (libraryNameNode == null) {
+              // TODO(brianwilkerson) Collect the names declared by the part.
+              // If they are all the same then we can use that name as the
+              // inferred name of the library and present it in a quick-fix.
+              // partLibraryNames.add(partLibraryName);
+            } else if (libraryNameNode.name != partLibraryName) {
+              _errorListener.onError(new AnalysisError(
+                  librarySource,
+                  partUri.offset,
+                  partUri.length,
+                  StaticWarningCode.PART_OF_DIFFERENT_LIBRARY,
+                  [libraryNameNode.name, partLibraryName]));
+            }
+            if (entryPoint == null) {
+              entryPoint = _findEntryPoint(part);
+            }
+            directive.element = part;
+            sourcedCompilationUnits.add(part);
+          }
+        }
+      }
+    }
+    if (hasPartDirective && libraryNameNode == null) {
+      _errorListener.onError(new AnalysisError(librarySource, 0, 0,
+          ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART));
+    }
+    //
+    // Create and populate the library element.
+    //
+    LibraryElementImpl libraryElement = new LibraryElementImpl.forNode(
+        _analysisContext.getContextFor(librarySource), libraryNameNode);
+    libraryElement.definingCompilationUnit = definingCompilationUnitElement;
+    if (entryPoint != null) {
+      libraryElement.entryPoint = entryPoint;
+    }
+    int sourcedUnitCount = sourcedCompilationUnits.length;
+    libraryElement.parts = sourcedCompilationUnits;
+    for (Directive directive in directivesToResolve) {
+      directive.element = libraryElement;
+    }
+    library.libraryElement = libraryElement;
+    if (sourcedUnitCount > 0) {
+      _patchTopLevelAccessors(libraryElement);
+    }
+  }
+
+  /**
+   * Add all of the non-synthetic getters and setters defined in the given compilation unit that
+   * have no corresponding accessor to one of the given collections.
+   *
+   * @param getters the map to which getters are to be added
+   * @param setters the list to which setters are to be added
+   * @param unit the compilation unit defining the accessors that are potentially being added
+   */
+  void _collectAccessors(HashMap<String, PropertyAccessorElement> getters,
+      List<PropertyAccessorElement> setters, CompilationUnitElement unit) {
+    for (PropertyAccessorElement accessor in unit.accessors) {
+      if (accessor.isGetter) {
+        if (!accessor.isSynthetic && accessor.correspondingSetter == null) {
+          getters[accessor.displayName] = accessor;
+        }
+      } else {
+        if (!accessor.isSynthetic && accessor.correspondingGetter == null) {
+          setters.add(accessor);
+        }
+      }
+    }
+  }
+
+  /**
+   * Search the top-level functions defined in the given compilation unit for the entry point.
+   *
+   * @param element the compilation unit to be searched
+   * @return the entry point that was found, or `null` if the compilation unit does not define
+   *         an entry point
+   */
+  FunctionElement _findEntryPoint(CompilationUnitElementImpl element) {
+    for (FunctionElement function in element.functions) {
+      if (function.isEntryPoint) {
+        return function;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the name of the library that the given part is declared to be a part of, or `null`
+   * if the part does not contain a part-of directive.
+   *
+   * @param partSource the source representing the part
+   * @param partUnit the AST structure of the part
+   * @param directivesToResolve a list of directives that should be resolved to the library being
+   *          built
+   * @return the name of the library that the given part is declared to be a part of
+   */
+  String _getPartLibraryName(Source partSource, CompilationUnit partUnit,
+      List<Directive> directivesToResolve) {
+    for (Directive directive in partUnit.directives) {
+      if (directive is PartOfDirective) {
+        directivesToResolve.add(directive);
+        LibraryIdentifier libraryName = directive.libraryName;
+        if (libraryName != null) {
+          return libraryName.name;
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Look through all of the compilation units defined for the given library, looking for getters
+   * and setters that are defined in different compilation units but that have the same names. If
+   * any are found, make sure that they have the same variable element.
+   *
+   * @param libraryElement the library defining the compilation units to be processed
+   */
+  void _patchTopLevelAccessors(LibraryElementImpl libraryElement) {
+    HashMap<String, PropertyAccessorElement> getters =
+        new HashMap<String, PropertyAccessorElement>();
+    List<PropertyAccessorElement> setters = new List<PropertyAccessorElement>();
+    _collectAccessors(getters, setters, libraryElement.definingCompilationUnit);
+    for (CompilationUnitElement unit in libraryElement.parts) {
+      _collectAccessors(getters, setters, unit);
+    }
+    for (PropertyAccessorElement setter in setters) {
+      PropertyAccessorElement getter = getters[setter.displayName];
+      if (getter != null) {
+        PropertyInducingElementImpl variable =
+            getter.variable as PropertyInducingElementImpl;
+        variable.setter = setter;
+        (setter as PropertyAccessorElementImpl).variable = variable;
+      }
+    }
+  }
+}
+
+/**
+ * Instances of the class `LibraryImportScope` represent the scope containing all of the names
+ * available from imported libraries.
+ */
+class LibraryImportScope extends Scope {
+  /**
+   * The element representing the library in which this scope is enclosed.
+   */
+  final LibraryElement _definingLibrary;
+
+  /**
+   * The listener that is to be informed when an error is encountered.
+   */
+  final AnalysisErrorListener errorListener;
+
+  /**
+   * A list of the namespaces representing the names that are available in this scope from imported
+   * libraries.
+   */
+  List<Namespace> _importedNamespaces;
+
+  /**
+   * Initialize a newly created scope representing the names imported into the given library.
+   *
+   * @param definingLibrary the element representing the library that imports the names defined in
+   *          this scope
+   * @param errorListener the listener that is to be informed when an error is encountered
+   */
+  LibraryImportScope(this._definingLibrary, this.errorListener) {
+    _createImportedNamespaces();
+  }
+
+  @override
+  void define(Element element) {
+    if (!Scope.isPrivateName(element.displayName)) {
+      super.define(element);
+    }
+  }
+
+  @override
+  Source getSource(AstNode node) {
+    Source source = super.getSource(node);
+    if (source == null) {
+      source = _definingLibrary.definingCompilationUnit.source;
+    }
+    return source;
+  }
+
+  @override
+  Element internalLookup(
+      Identifier identifier, String name, LibraryElement referencingLibrary) {
+    Element foundElement = localLookup(name, referencingLibrary);
+    if (foundElement != null) {
+      return foundElement;
+    }
+    for (int i = 0; i < _importedNamespaces.length; i++) {
+      Namespace nameSpace = _importedNamespaces[i];
+      Element element = nameSpace.get(name);
+      if (element != null) {
+        if (foundElement == null) {
+          foundElement = element;
+        } else if (!identical(foundElement, element)) {
+          foundElement = MultiplyDefinedElementImpl.fromElements(
+              _definingLibrary.context, foundElement, element);
+        }
+      }
+    }
+    if (foundElement is MultiplyDefinedElementImpl) {
+      foundElement = _removeSdkElements(
+          identifier, name, foundElement as MultiplyDefinedElementImpl);
+    }
+    if (foundElement is MultiplyDefinedElementImpl) {
+      String foundEltName = foundElement.displayName;
+      List<Element> conflictingMembers = foundElement.conflictingElements;
+      int count = conflictingMembers.length;
+      List<String> libraryNames = new List<String>(count);
+      for (int i = 0; i < count; i++) {
+        libraryNames[i] = _getLibraryName(conflictingMembers[i]);
+      }
+      libraryNames.sort();
+      errorListener.onError(new AnalysisError(
+          getSource(identifier),
+          identifier.offset,
+          identifier.length,
+          StaticWarningCode.AMBIGUOUS_IMPORT, [
+        foundEltName,
+        StringUtilities.printListOfQuotedNames(libraryNames)
+      ]));
+      return foundElement;
+    }
+    if (foundElement != null) {
+      defineNameWithoutChecking(name, foundElement);
+    }
+    return foundElement;
+  }
+
+  /**
+   * Create all of the namespaces associated with the libraries imported into this library. The
+   * names are not added to this scope, but are stored for later reference.
+   *
+   * @param definingLibrary the element representing the library that imports the libraries for
+   *          which namespaces will be created
+   */
+  void _createImportedNamespaces() {
+    NamespaceBuilder builder = new NamespaceBuilder();
+    List<ImportElement> imports = _definingLibrary.imports;
+    int count = imports.length;
+    _importedNamespaces = new List<Namespace>(count);
+    for (int i = 0; i < count; i++) {
+      _importedNamespaces[i] =
+          builder.createImportNamespaceForDirective(imports[i]);
+    }
+  }
+
+  /**
+   * Returns the name of the library that defines given element.
+   *
+   * @param element the element to get library name
+   * @return the name of the library that defines given element
+   */
+  String _getLibraryName(Element element) {
+    if (element == null) {
+      return StringUtilities.EMPTY;
+    }
+    LibraryElement library = element.library;
+    if (library == null) {
+      return StringUtilities.EMPTY;
+    }
+    List<ImportElement> imports = _definingLibrary.imports;
+    int count = imports.length;
+    for (int i = 0; i < count; i++) {
+      if (identical(imports[i].importedLibrary, library)) {
+        return library.definingCompilationUnit.displayName;
+      }
+    }
+    List<String> indirectSources = new List<String>();
+    for (int i = 0; i < count; i++) {
+      LibraryElement importedLibrary = imports[i].importedLibrary;
+      if (importedLibrary != null) {
+        for (LibraryElement exportedLibrary
+            in importedLibrary.exportedLibraries) {
+          if (identical(exportedLibrary, library)) {
+            indirectSources
+                .add(importedLibrary.definingCompilationUnit.displayName);
+          }
+        }
+      }
+    }
+    int indirectCount = indirectSources.length;
+    StringBuffer buffer = new StringBuffer();
+    buffer.write(library.definingCompilationUnit.displayName);
+    if (indirectCount > 0) {
+      buffer.write(" (via ");
+      if (indirectCount > 1) {
+        indirectSources.sort();
+        buffer.write(StringUtilities.printListOfQuotedNames(indirectSources));
+      } else {
+        buffer.write(indirectSources[0]);
+      }
+      buffer.write(")");
+    }
+    return buffer.toString();
+  }
+
+  /**
+   * Given a collection of elements (captured by the [foundElement]) that the
+   * [identifier] (with the given [name]) resolved to, remove from the list all
+   * of the names defined in the SDK and return the element(s) that remain.
+   */
+  Element _removeSdkElements(Identifier identifier, String name,
+      MultiplyDefinedElementImpl foundElement) {
+    List<Element> conflictingElements = foundElement.conflictingElements;
+    List<Element> nonSdkElements = new List<Element>();
+    Element sdkElement = null;
+    for (Element member in conflictingElements) {
+      if (member.library.isInSdk) {
+        sdkElement = member;
+      } else {
+        nonSdkElements.add(member);
+      }
+    }
+    if (sdkElement != null && nonSdkElements.length > 0) {
+      String sdkLibName = _getLibraryName(sdkElement);
+      String otherLibName = _getLibraryName(nonSdkElements[0]);
+      errorListener.onError(new AnalysisError(
+          getSource(identifier),
+          identifier.offset,
+          identifier.length,
+          StaticWarningCode.CONFLICTING_DART_IMPORT,
+          [name, sdkLibName, otherLibName]));
+    }
+    if (nonSdkElements.length == conflictingElements.length) {
+      // None of the members were removed
+      return foundElement;
+    } else if (nonSdkElements.length == 1) {
+      // All but one member was removed
+      return nonSdkElements[0];
+    } else if (nonSdkElements.length == 0) {
+      // All members were removed
+      AnalysisEngine.instance.logger
+          .logInformation("Multiply defined SDK element: $foundElement");
+      return foundElement;
+    }
+    return new MultiplyDefinedElementImpl(
+        _definingLibrary.context, nonSdkElements);
+  }
+}
+
+/**
+ * Instances of the class `LibraryResolver` are used to resolve one or more mutually dependent
+ * libraries within a single context.
+ */
+class LibraryResolver {
+  /**
+   * The analysis context in which the libraries are being analyzed.
+   */
+  final InternalAnalysisContext analysisContext;
+
+  /**
+   * The listener to which analysis errors will be reported, this error listener is either
+   * references [recordingErrorListener], or it unions the passed
+   * [AnalysisErrorListener] with the [recordingErrorListener].
+   */
+  RecordingErrorListener _errorListener;
+
+  /**
+   * A source object representing the core library (dart:core).
+   */
+  Source _coreLibrarySource;
+
+  /**
+   * A Source object representing the async library (dart:async).
+   */
+  Source _asyncLibrarySource;
+
+  /**
+   * The object representing the core library.
+   */
+  Library _coreLibrary;
+
+  /**
+   * The object representing the async library.
+   */
+  Library _asyncLibrary;
+
+  /**
+   * The object used to access the types from the core library.
+   */
+  TypeProvider _typeProvider;
+
+  /**
+   * A table mapping library sources to the information being maintained for those libraries.
+   */
+  HashMap<Source, Library> _libraryMap = new HashMap<Source, Library>();
+
+  /**
+   * A collection containing the libraries that are being resolved together.
+   */
+  Set<Library> _librariesInCycles;
+
+  /**
+   * Initialize a newly created library resolver to resolve libraries within the given context.
+   *
+   * @param analysisContext the analysis context in which the library is being analyzed
+   */
+  LibraryResolver(this.analysisContext) {
+    this._errorListener = new RecordingErrorListener();
+    _coreLibrarySource =
+        analysisContext.sourceFactory.forUri(DartSdk.DART_CORE);
+    _asyncLibrarySource =
+        analysisContext.sourceFactory.forUri(DartSdk.DART_ASYNC);
+  }
+
+  /**
+   * Return the listener to which analysis errors will be reported.
+   *
+   * @return the listener to which analysis errors will be reported
+   */
+  RecordingErrorListener get errorListener => _errorListener;
+
+  /**
+   * Return an array containing information about all of the libraries that were resolved.
+   *
+   * @return an array containing the libraries that were resolved
+   */
+  Set<Library> get resolvedLibraries => _librariesInCycles;
+
+  /**
+   * The object used to access the types from the core library.
+   */
+  TypeProvider get typeProvider => _typeProvider;
+
+  /**
+   * Create an object to represent the information about the library defined by the compilation unit
+   * with the given source.
+   *
+   * @param librarySource the source of the library's defining compilation unit
+   * @return the library object that was created
+   * @throws AnalysisException if the library source is not valid
+   */
+  Library createLibrary(Source librarySource) {
+    Library library =
+        new Library(analysisContext, _errorListener, librarySource);
+    _libraryMap[librarySource] = library;
+    return library;
+  }
+
+  /**
+   * Resolve the library specified by the given source in the given context. The library is assumed
+   * to be embedded in the given source.
+   *
+   * @param librarySource the source specifying the defining compilation unit of the library to be
+   *          resolved
+   * @param unit the compilation unit representing the embedded library
+   * @param fullAnalysis `true` if a full analysis should be performed
+   * @return the element representing the resolved library
+   * @throws AnalysisException if the library could not be resolved for some reason
+   */
+  LibraryElement resolveEmbeddedLibrary(
+      Source librarySource, CompilationUnit unit, bool fullAnalysis) {
+    //
+    // Create the objects representing the library being resolved and the core
+    // library.
+    //
+    Library targetLibrary = _createLibraryWithUnit(librarySource, unit);
+    _coreLibrary = _libraryMap[_coreLibrarySource];
+    if (_coreLibrary == null) {
+      // This will only happen if the library being analyzed is the core
+      // library.
+      _coreLibrary = createLibrary(_coreLibrarySource);
+      if (_coreLibrary == null) {
+        LibraryResolver2.missingCoreLibrary(
+            analysisContext, _coreLibrarySource);
+      }
+    }
+    _asyncLibrary = _libraryMap[_asyncLibrarySource];
+    if (_asyncLibrary == null) {
+      // This will only happen if the library being analyzed is the async
+      // library.
+      _asyncLibrary = createLibrary(_asyncLibrarySource);
+      if (_asyncLibrary == null) {
+        LibraryResolver2.missingAsyncLibrary(
+            analysisContext, _asyncLibrarySource);
+      }
+    }
+    //
+    // Compute the set of libraries that need to be resolved together.
+    //
+    _computeEmbeddedLibraryDependencies(targetLibrary, unit);
+    _librariesInCycles = _computeLibrariesInCycles(targetLibrary);
+    //
+    // Build the element models representing the libraries being resolved.
+    // This is done in three steps:
+    //
+    // 1. Build the basic element models without making any connections
+    //    between elements other than the basic parent/child relationships.
+    //    This includes building the elements representing the libraries.
+    // 2. Build the elements for the import and export directives. This
+    //    requires that we have the elements built for the referenced
+    //    libraries, but because of the possibility of circular references
+    //    needs to happen after all of the library elements have been created.
+    // 3. Build the rest of the type model by connecting superclasses, mixins,
+    //    and interfaces. This requires that we be able to compute the names
+    //    visible in the libraries being resolved, which in turn requires that
+    //    we have resolved the import directives.
+    //
+    _buildElementModels();
+    LibraryElement coreElement = _coreLibrary.libraryElement;
+    if (coreElement == null) {
+      throw new AnalysisException("Could not resolve dart:core");
+    }
+    LibraryElement asyncElement = _asyncLibrary.libraryElement;
+    if (asyncElement == null) {
+      throw new AnalysisException("Could not resolve dart:async");
+    }
+    _buildDirectiveModels();
+    _typeProvider = new TypeProviderImpl(coreElement, asyncElement);
+    _buildTypeHierarchies();
+    //
+    // Perform resolution and type analysis.
+    //
+    // TODO(brianwilkerson) Decide whether we want to resolve all of the
+    // libraries or whether we want to only resolve the target library.
+    // The advantage to resolving everything is that we have already done part
+    // of the work so we'll avoid duplicated effort. The disadvantage of
+    // resolving everything is that we might do extra work that we don't
+    // really care about. Another possibility is to add a parameter to this
+    // method and punt the decision to the clients.
+    //
+    //if (analyzeAll) {
+    resolveReferencesAndTypes();
+    //} else {
+    //  resolveReferencesAndTypes(targetLibrary);
+    //}
+    _performConstantEvaluation();
+    return targetLibrary.libraryElement;
+  }
+
+  /**
+   * Resolve the library specified by the given source in the given context.
+   *
+   * Note that because Dart allows circular imports between libraries, it is possible that more than
+   * one library will need to be resolved. In such cases the error listener can receive errors from
+   * multiple libraries.
+   *
+   * @param librarySource the source specifying the defining compilation unit of the library to be
+   *          resolved
+   * @param fullAnalysis `true` if a full analysis should be performed
+   * @return the element representing the resolved library
+   * @throws AnalysisException if the library could not be resolved for some reason
+   */
+  LibraryElement resolveLibrary(Source librarySource, bool fullAnalysis) {
+    //
+    // Create the object representing the library being resolved and compute
+    // the dependency relationship.  Note that all libraries depend implicitly
+    // on core, and we inject an ersatz dependency on async, so once this is
+    // done the core and async library elements will have been created.
+    //
+    Library targetLibrary = createLibrary(librarySource);
+    _computeLibraryDependencies(targetLibrary);
+    _coreLibrary = _libraryMap[_coreLibrarySource];
+    _asyncLibrary = _libraryMap[_asyncLibrarySource];
+    //
+    // Compute the set of libraries that need to be resolved together.
+    //
+    _librariesInCycles = _computeLibrariesInCycles(targetLibrary);
+    //
+    // Build the element models representing the libraries being resolved.
+    // This is done in three steps:
+    //
+    // 1. Build the basic element models without making any connections
+    //    between elements other than the basic parent/child relationships.
+    //    This includes building the elements representing the libraries, but
+    //    excludes members defined in enums.
+    // 2. Build the elements for the import and export directives. This
+    //    requires that we have the elements built for the referenced
+    //    libraries, but because of the possibility of circular references
+    //    needs to happen after all of the library elements have been created.
+    // 3. Build the members in enum declarations.
+    // 4. Build the rest of the type model by connecting superclasses, mixins,
+    //    and interfaces. This requires that we be able to compute the names
+    //    visible in the libraries being resolved, which in turn requires that
+    //    we have resolved the import directives.
+    //
+    _buildElementModels();
+    LibraryElement coreElement = _coreLibrary.libraryElement;
+    if (coreElement == null) {
+      throw new AnalysisException("Could not resolve dart:core");
+    }
+    LibraryElement asyncElement = _asyncLibrary.libraryElement;
+    if (asyncElement == null) {
+      throw new AnalysisException("Could not resolve dart:async");
+    }
+    _buildDirectiveModels();
+    _typeProvider = new TypeProviderImpl(coreElement, asyncElement);
+    _buildEnumMembers();
+    _buildTypeHierarchies();
+    //
+    // Perform resolution and type analysis.
+    //
+    // TODO(brianwilkerson) Decide whether we want to resolve all of the
+    // libraries or whether we want to only resolve the target library. The
+    // advantage to resolving everything is that we have already done part of
+    // the work so we'll avoid duplicated effort. The disadvantage of
+    // resolving everything is that we might do extra work that we don't
+    // really care about. Another possibility is to add a parameter to this
+    // method and punt the decision to the clients.
+    //
+    //if (analyzeAll) {
+    resolveReferencesAndTypes();
+    //} else {
+    //  resolveReferencesAndTypes(targetLibrary);
+    //}
+    _performConstantEvaluation();
+    return targetLibrary.libraryElement;
+  }
+
+  /**
+   * Resolve the identifiers and perform type analysis in the libraries in the current cycle.
+   *
+   * @throws AnalysisException if any of the identifiers could not be resolved or if any of the
+   *           libraries could not have their types analyzed
+   */
+  void resolveReferencesAndTypes() {
+    for (Library library in _librariesInCycles) {
+      _resolveReferencesAndTypesInLibrary(library);
+    }
+  }
+
+  /**
+   * Add a dependency to the given map from the referencing library to the referenced library.
+   *
+   * @param dependencyMap the map to which the dependency is to be added
+   * @param referencingLibrary the library that references the referenced library
+   * @param referencedLibrary the library referenced by the referencing library
+   */
+  void _addDependencyToMap(HashMap<Library, List<Library>> dependencyMap,
+      Library referencingLibrary, Library referencedLibrary) {
+    List<Library> dependentLibraries = dependencyMap[referencedLibrary];
+    if (dependentLibraries == null) {
+      dependentLibraries = new List<Library>();
+      dependencyMap[referencedLibrary] = dependentLibraries;
+    }
+    dependentLibraries.add(referencingLibrary);
+  }
+
+  /**
+   * Given a library that is part of a cycle that includes the root library, add to the given set of
+   * libraries all of the libraries reachable from the root library that are also included in the
+   * cycle.
+   *
+   * @param library the library to be added to the collection of libraries in cycles
+   * @param librariesInCycle a collection of the libraries that are in the cycle
+   * @param dependencyMap a table mapping libraries to the collection of libraries from which those
+   *          libraries are referenced
+   */
+  void _addLibrariesInCycle(Library library, Set<Library> librariesInCycle,
+      HashMap<Library, List<Library>> dependencyMap) {
+    if (librariesInCycle.add(library)) {
+      List<Library> dependentLibraries = dependencyMap[library];
+      if (dependentLibraries != null) {
+        for (Library dependentLibrary in dependentLibraries) {
+          _addLibrariesInCycle(
+              dependentLibrary, librariesInCycle, dependencyMap);
+        }
+      }
+    }
+  }
+
+  /**
+   * Add the given library, and all libraries reachable from it that have not already been visited,
+   * to the given dependency map.
+   *
+   * @param library the library currently being added to the dependency map
+   * @param dependencyMap the dependency map being computed
+   * @param visitedLibraries the libraries that have already been visited, used to prevent infinite
+   *          recursion
+   */
+  void _addToDependencyMap(
+      Library library,
+      HashMap<Library, List<Library>> dependencyMap,
+      Set<Library> visitedLibraries) {
+    if (visitedLibraries.add(library)) {
+      bool asyncFound = false;
+      for (Library referencedLibrary in library.importsAndExports) {
+        _addDependencyToMap(dependencyMap, library, referencedLibrary);
+        _addToDependencyMap(referencedLibrary, dependencyMap, visitedLibraries);
+        if (identical(referencedLibrary, _asyncLibrary)) {
+          asyncFound = true;
+        }
+      }
+      if (!library.explicitlyImportsCore && !identical(library, _coreLibrary)) {
+        _addDependencyToMap(dependencyMap, library, _coreLibrary);
+      }
+      if (!asyncFound && !identical(library, _asyncLibrary)) {
+        _addDependencyToMap(dependencyMap, library, _asyncLibrary);
+        _addToDependencyMap(_asyncLibrary, dependencyMap, visitedLibraries);
+      }
+    }
+  }
+
+  /**
+   * Build the element model representing the combinators declared by the given directive.
+   *
+   * @param directive the directive that declares the combinators
+   * @return an array containing the import combinators that were built
+   */
+  List<NamespaceCombinator> _buildCombinators(NamespaceDirective directive) {
+    List<NamespaceCombinator> combinators = new List<NamespaceCombinator>();
+    for (Combinator combinator in directive.combinators) {
+      if (combinator is HideCombinator) {
+        HideElementCombinatorImpl hide = new HideElementCombinatorImpl();
+        hide.hiddenNames = _getIdentifiers(combinator.hiddenNames);
+        combinators.add(hide);
+      } else {
+        ShowElementCombinatorImpl show = new ShowElementCombinatorImpl();
+        show.offset = combinator.offset;
+        show.end = combinator.end;
+        show.shownNames =
+            _getIdentifiers((combinator as ShowCombinator).shownNames);
+        combinators.add(show);
+      }
+    }
+    return combinators;
+  }
+
+  /**
+   * Every library now has a corresponding [LibraryElement], so it is now possible to resolve
+   * the import and export directives.
+   *
+   * @throws AnalysisException if the defining compilation unit for any of the libraries could not
+   *           be accessed
+   */
+  void _buildDirectiveModels() {
+    for (Library library in _librariesInCycles) {
+      HashMap<String, PrefixElementImpl> nameToPrefixMap =
+          new HashMap<String, PrefixElementImpl>();
+      List<ImportElement> imports = new List<ImportElement>();
+      List<ExportElement> exports = new List<ExportElement>();
+      for (Directive directive in library.definingCompilationUnit.directives) {
+        if (directive is ImportDirective) {
+          ImportDirective importDirective = directive;
+          String uriContent = importDirective.uriContent;
+          if (DartUriResolver.isDartExtUri(uriContent)) {
+            library.libraryElement.hasExtUri = true;
+          }
+          Source importedSource = importDirective.source;
+          if (importedSource != null) {
+            // The imported source will be null if the URI in the import
+            // directive was invalid.
+            Library importedLibrary = _libraryMap[importedSource];
+            if (importedLibrary != null) {
+              ImportElementImpl importElement =
+                  new ImportElementImpl(directive.offset);
+              StringLiteral uriLiteral = importDirective.uri;
+              importElement.uriOffset = uriLiteral.offset;
+              importElement.uriEnd = uriLiteral.end;
+              importElement.uri = uriContent;
+              importElement.deferred = importDirective.deferredKeyword != null;
+              importElement.combinators = _buildCombinators(importDirective);
+              LibraryElement importedLibraryElement =
+                  importedLibrary.libraryElement;
+              if (importedLibraryElement != null) {
+                importElement.importedLibrary = importedLibraryElement;
+              }
+              SimpleIdentifier prefixNode = directive.prefix;
+              if (prefixNode != null) {
+                importElement.prefixOffset = prefixNode.offset;
+                String prefixName = prefixNode.name;
+                PrefixElementImpl prefix = nameToPrefixMap[prefixName];
+                if (prefix == null) {
+                  prefix = new PrefixElementImpl.forNode(prefixNode);
+                  nameToPrefixMap[prefixName] = prefix;
+                }
+                importElement.prefix = prefix;
+                prefixNode.staticElement = prefix;
+              }
+              directive.element = importElement;
+              imports.add(importElement);
+              if (analysisContext.computeKindOf(importedSource) !=
+                  SourceKind.LIBRARY) {
+                ErrorCode errorCode = (importElement.isDeferred
+                    ? StaticWarningCode.IMPORT_OF_NON_LIBRARY
+                    : CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY);
+                _errorListener.onError(new AnalysisError(
+                    library.librarySource,
+                    uriLiteral.offset,
+                    uriLiteral.length,
+                    errorCode,
+                    [uriLiteral.toSource()]));
+              }
+            }
+          }
+        } else if (directive is ExportDirective) {
+          ExportDirective exportDirective = directive;
+          Source exportedSource = exportDirective.source;
+          if (exportedSource != null) {
+            // The exported source will be null if the URI in the export
+            // directive was invalid.
+            Library exportedLibrary = _libraryMap[exportedSource];
+            if (exportedLibrary != null) {
+              ExportElementImpl exportElement =
+                  new ExportElementImpl(directive.offset);
+              StringLiteral uriLiteral = exportDirective.uri;
+              exportElement.uriOffset = uriLiteral.offset;
+              exportElement.uriEnd = uriLiteral.end;
+              exportElement.uri = exportDirective.uriContent;
+              exportElement.combinators = _buildCombinators(exportDirective);
+              LibraryElement exportedLibraryElement =
+                  exportedLibrary.libraryElement;
+              if (exportedLibraryElement != null) {
+                exportElement.exportedLibrary = exportedLibraryElement;
+              }
+              directive.element = exportElement;
+              exports.add(exportElement);
+              if (analysisContext.computeKindOf(exportedSource) !=
+                  SourceKind.LIBRARY) {
+                _errorListener.onError(new AnalysisError(
+                    library.librarySource,
+                    uriLiteral.offset,
+                    uriLiteral.length,
+                    CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY,
+                    [uriLiteral.toSource()]));
+              }
+            }
+          }
+        }
+      }
+      Source librarySource = library.librarySource;
+      if (!library.explicitlyImportsCore &&
+          _coreLibrarySource != librarySource) {
+        ImportElementImpl importElement = new ImportElementImpl(-1);
+        importElement.importedLibrary = _coreLibrary.libraryElement;
+        importElement.synthetic = true;
+        imports.add(importElement);
+      }
+      LibraryElementImpl libraryElement = library.libraryElement;
+      libraryElement.imports = imports;
+      libraryElement.exports = exports;
+      if (libraryElement.entryPoint == null) {
+        Namespace namespace = new NamespaceBuilder()
+            .createExportNamespaceForLibrary(libraryElement);
+        Element element = namespace.get(FunctionElement.MAIN_FUNCTION_NAME);
+        if (element is FunctionElement) {
+          libraryElement.entryPoint = element;
+        }
+      }
+    }
+  }
+
+  /**
+   * Build element models for all of the libraries in the current cycle.
+   *
+   * @throws AnalysisException if any of the element models cannot be built
+   */
+  void _buildElementModels() {
+    for (Library library in _librariesInCycles) {
+      LibraryElementBuilder builder =
+          new LibraryElementBuilder(analysisContext, errorListener);
+      LibraryElementImpl libraryElement = builder.buildLibrary(library);
+      library.libraryElement = libraryElement;
+    }
+  }
+
+  /**
+   * Build the members in enum declarations. This cannot be done while building the rest of the
+   * element model because it depends on being able to access core types, which cannot happen until
+   * the rest of the element model has been built (when resolving the core library).
+   *
+   * @throws AnalysisException if any of the enum members could not be built
+   */
+  void _buildEnumMembers() {
+    PerformanceStatistics.resolve.makeCurrentWhile(() {
+      for (Library library in _librariesInCycles) {
+        for (Source source in library.compilationUnitSources) {
+          EnumMemberBuilder builder = new EnumMemberBuilder(_typeProvider);
+          library.getAST(source).accept(builder);
+        }
+      }
+    });
+  }
+
+  /**
+   * Resolve the type hierarchy across all of the types declared in the libraries in the current
+   * cycle.
+   *
+   * @throws AnalysisException if any of the type hierarchies could not be resolved
+   */
+  void _buildTypeHierarchies() {
+    PerformanceStatistics.resolve.makeCurrentWhile(() {
+      for (Library library in _librariesInCycles) {
+        for (Source source in library.compilationUnitSources) {
+          TypeResolverVisitorFactory typeResolverVisitorFactory =
+              analysisContext.typeResolverVisitorFactory;
+          TypeResolverVisitor visitor = (typeResolverVisitorFactory == null)
+              ? new TypeResolverVisitor(library.libraryElement, source,
+                  _typeProvider, library.errorListener,
+                  nameScope: library.libraryScope)
+              : typeResolverVisitorFactory(library, source, _typeProvider);
+          library.getAST(source).accept(visitor);
+        }
+      }
+    });
+  }
+
+  /**
+   * Compute a dependency map of libraries reachable from the given library. A dependency map is a
+   * table that maps individual libraries to a list of the libraries that either import or export
+   * those libraries.
+   *
+   * This map is used to compute all of the libraries involved in a cycle that include the root
+   * library. Given that we only add libraries that are reachable from the root library, when we
+   * work backward we are guaranteed to only get libraries in the cycle.
+   *
+   * @param library the library currently being added to the dependency map
+   */
+  HashMap<Library, List<Library>> _computeDependencyMap(Library library) {
+    HashMap<Library, List<Library>> dependencyMap =
+        new HashMap<Library, List<Library>>();
+    _addToDependencyMap(library, dependencyMap, new HashSet<Library>());
+    return dependencyMap;
+  }
+
+  /**
+   * Recursively traverse the libraries reachable from the given library, creating instances of the
+   * class [Library] to represent them, and record the references in the library objects.
+   *
+   * @param library the library to be processed to find libraries that have not yet been traversed
+   * @throws AnalysisException if some portion of the library graph could not be traversed
+   */
+  void _computeEmbeddedLibraryDependencies(
+      Library library, CompilationUnit unit) {
+    Source librarySource = library.librarySource;
+    HashSet<Source> exportedSources = new HashSet<Source>();
+    HashSet<Source> importedSources = new HashSet<Source>();
+    for (Directive directive in unit.directives) {
+      if (directive is ExportDirective) {
+        Source exportSource = _resolveSource(librarySource, directive);
+        if (exportSource != null) {
+          exportedSources.add(exportSource);
+        }
+      } else if (directive is ImportDirective) {
+        Source importSource = _resolveSource(librarySource, directive);
+        if (importSource != null) {
+          importedSources.add(importSource);
+        }
+      }
+    }
+    _computeLibraryDependenciesFromDirectives(library,
+        new List.from(importedSources), new List.from(exportedSources));
+  }
+
+  /**
+   * Return a collection containing all of the libraries reachable from the given library that are
+   * contained in a cycle that includes the given library.
+   *
+   * @param library the library that must be included in any cycles whose members are to be returned
+   * @return all of the libraries referenced by the given library that have a circular reference
+   *         back to the given library
+   */
+  Set<Library> _computeLibrariesInCycles(Library library) {
+    HashMap<Library, List<Library>> dependencyMap =
+        _computeDependencyMap(library);
+    Set<Library> librariesInCycle = new HashSet<Library>();
+    _addLibrariesInCycle(library, librariesInCycle, dependencyMap);
+    return librariesInCycle;
+  }
+
+  /**
+   * Recursively traverse the libraries reachable from the given library, creating instances of the
+   * class [Library] to represent them, and record the references in the library objects.
+   *
+   * @param library the library to be processed to find libraries that have not yet been traversed
+   * @throws AnalysisException if some portion of the library graph could not be traversed
+   */
+  void _computeLibraryDependencies(Library library) {
+    Source librarySource = library.librarySource;
+    _computeLibraryDependenciesFromDirectives(
+        library,
+        analysisContext.computeImportedLibraries(librarySource),
+        analysisContext.computeExportedLibraries(librarySource));
+  }
+
+  /**
+   * Recursively traverse the libraries reachable from the given library, creating instances of the
+   * class [Library] to represent them, and record the references in the library objects.
+   *
+   * @param library the library to be processed to find libraries that have not yet been traversed
+   * @param importedSources an array containing the sources that are imported into the given library
+   * @param exportedSources an array containing the sources that are exported from the given library
+   * @throws AnalysisException if some portion of the library graph could not be traversed
+   */
+  void _computeLibraryDependenciesFromDirectives(Library library,
+      List<Source> importedSources, List<Source> exportedSources) {
+    List<Library> importedLibraries = new List<Library>();
+    bool explicitlyImportsCore = false;
+    bool importsAsync = false;
+    for (Source importedSource in importedSources) {
+      if (importedSource == _coreLibrarySource) {
+        explicitlyImportsCore = true;
+      }
+      if (importedSource == _asyncLibrarySource) {
+        importsAsync = true;
+      }
+      Library importedLibrary = _libraryMap[importedSource];
+      if (importedLibrary == null) {
+        importedLibrary = _createLibraryOrNull(importedSource);
+        if (importedLibrary != null) {
+          _computeLibraryDependencies(importedLibrary);
+        }
+      }
+      if (importedLibrary != null) {
+        importedLibraries.add(importedLibrary);
+      }
+    }
+    library.importedLibraries = importedLibraries;
+    List<Library> exportedLibraries = new List<Library>();
+    for (Source exportedSource in exportedSources) {
+      Library exportedLibrary = _libraryMap[exportedSource];
+      if (exportedLibrary == null) {
+        exportedLibrary = _createLibraryOrNull(exportedSource);
+        if (exportedLibrary != null) {
+          _computeLibraryDependencies(exportedLibrary);
+        }
+      }
+      if (exportedLibrary != null) {
+        exportedLibraries.add(exportedLibrary);
+      }
+    }
+    library.exportedLibraries = exportedLibraries;
+    library.explicitlyImportsCore = explicitlyImportsCore;
+    if (!explicitlyImportsCore && _coreLibrarySource != library.librarySource) {
+      Library importedLibrary = _libraryMap[_coreLibrarySource];
+      if (importedLibrary == null) {
+        importedLibrary = _createLibraryOrNull(_coreLibrarySource);
+        if (importedLibrary != null) {
+          _computeLibraryDependencies(importedLibrary);
+        }
+      }
+    }
+    if (!importsAsync && _asyncLibrarySource != library.librarySource) {
+      Library importedLibrary = _libraryMap[_asyncLibrarySource];
+      if (importedLibrary == null) {
+        importedLibrary = _createLibraryOrNull(_asyncLibrarySource);
+        if (importedLibrary != null) {
+          _computeLibraryDependencies(importedLibrary);
+        }
+      }
+    }
+  }
+
+  /**
+   * Create an object to represent the information about the library defined by the compilation unit
+   * with the given source. Return the library object that was created, or `null` if the
+   * source is not valid.
+   *
+   * @param librarySource the source of the library's defining compilation unit
+   * @return the library object that was created
+   */
+  Library _createLibraryOrNull(Source librarySource) {
+    if (!analysisContext.exists(librarySource)) {
+      return null;
+    }
+    Library library =
+        new Library(analysisContext, _errorListener, librarySource);
+    _libraryMap[librarySource] = library;
+    return library;
+  }
+
+  /**
+   * Create an object to represent the information about the library defined by the compilation unit
+   * with the given source.
+   *
+   * @param librarySource the source of the library's defining compilation unit
+   * @param unit the compilation unit that defines the library
+   * @return the library object that was created
+   * @throws AnalysisException if the library source is not valid
+   */
+  Library _createLibraryWithUnit(Source librarySource, CompilationUnit unit) {
+    Library library =
+        new Library(analysisContext, _errorListener, librarySource);
+    library.setDefiningCompilationUnit(unit);
+    _libraryMap[librarySource] = library;
+    return library;
+  }
+
+  /**
+   * Return an array containing the lexical identifiers associated with the nodes in the given list.
+   *
+   * @param names the AST nodes representing the identifiers
+   * @return the lexical identifiers associated with the nodes in the list
+   */
+  List<String> _getIdentifiers(NodeList<SimpleIdentifier> names) {
+    int count = names.length;
+    List<String> identifiers = new List<String>(count);
+    for (int i = 0; i < count; i++) {
+      identifiers[i] = names[i].name;
+    }
+    return identifiers;
+  }
+
+  /**
+   * Compute a value for all of the constants in the libraries being analyzed.
+   */
+  void _performConstantEvaluation() {
+    PerformanceStatistics.resolve.makeCurrentWhile(() {
+      ConstantValueComputer computer = new ConstantValueComputer(
+          analysisContext, _typeProvider, analysisContext.declaredVariables);
+      for (Library library in _librariesInCycles) {
+        for (Source source in library.compilationUnitSources) {
+          try {
+            CompilationUnit unit = library.getAST(source);
+            if (unit != null) {
+              computer.add(unit, source, library.librarySource);
+            }
+          } on AnalysisException catch (exception, stackTrace) {
+            AnalysisEngine.instance.logger.logError(
+                "Internal Error: Could not access AST for ${source.fullName} during constant evaluation",
+                new CaughtException(exception, stackTrace));
+          }
+        }
+      }
+      computer.computeValues();
+      // As a temporary workaround for issue 21572, run ConstantVerifier now.
+      // TODO(paulberry): remove this workaround once issue 21572 is fixed.
+      for (Library library in _librariesInCycles) {
+        for (Source source in library.compilationUnitSources) {
+          try {
+            CompilationUnit unit = library.getAST(source);
+            ErrorReporter errorReporter =
+                new ErrorReporter(_errorListener, source);
+            ConstantVerifier constantVerifier = new ConstantVerifier(
+                errorReporter,
+                library.libraryElement,
+                _typeProvider,
+                analysisContext.declaredVariables);
+            unit.accept(constantVerifier);
+          } on AnalysisException catch (exception, stackTrace) {
+            AnalysisEngine.instance.logger.logError(
+                "Internal Error: Could not access AST for ${source.fullName} "
+                "during constant verification",
+                new CaughtException(exception, stackTrace));
+          }
+        }
+      }
+    });
+  }
+
+  /**
+   * Resolve the identifiers and perform type analysis in the given library.
+   *
+   * @param library the library to be resolved
+   * @throws AnalysisException if any of the identifiers could not be resolved or if the types in
+   *           the library cannot be analyzed
+   */
+  void _resolveReferencesAndTypesInLibrary(Library library) {
+    PerformanceStatistics.resolve.makeCurrentWhile(() {
+      for (Source source in library.compilationUnitSources) {
+        CompilationUnit ast = library.getAST(source);
+        ast.accept(new VariableResolverVisitor(library.libraryElement, source,
+            _typeProvider, library.errorListener,
+            nameScope: library.libraryScope));
+        ResolverVisitorFactory visitorFactory =
+            analysisContext.resolverVisitorFactory;
+        ResolverVisitor visitor = visitorFactory != null
+            ? visitorFactory(library, source, _typeProvider)
+            : new ResolverVisitor(library.libraryElement, source, _typeProvider,
+                library.errorListener,
+                nameScope: library.libraryScope,
+                inheritanceManager: library.inheritanceManager);
+        ast.accept(visitor);
+      }
+    });
+  }
+
+  /**
+   * Return the result of resolving the URI of the given URI-based directive against the URI of the
+   * given library, or `null` if the URI is not valid.
+   *
+   * @param librarySource the source representing the library containing the directive
+   * @param directive the directive which URI should be resolved
+   * @return the result of resolving the URI against the URI of the library
+   */
+  Source _resolveSource(Source librarySource, UriBasedDirective directive) {
+    StringLiteral uriLiteral = directive.uri;
+    if (uriLiteral is StringInterpolation) {
+      return null;
+    }
+    String uriContent = uriLiteral.stringValue.trim();
+    if (uriContent == null || uriContent.isEmpty) {
+      return null;
+    }
+    uriContent = Uri.encodeFull(uriContent);
+    return analysisContext.sourceFactory.resolveUri(librarySource, uriContent);
+  }
+}
+
+/**
+ * Instances of the class `LibraryResolver` are used to resolve one or more mutually dependent
+ * libraries within a single context.
+ */
+class LibraryResolver2 {
+  /**
+   * The analysis context in which the libraries are being analyzed.
+   */
+  final InternalAnalysisContext analysisContext;
+
+  /**
+   * The listener to which analysis errors will be reported, this error listener is either
+   * references [recordingErrorListener], or it unions the passed
+   * [AnalysisErrorListener] with the [recordingErrorListener].
+   */
+  RecordingErrorListener _errorListener;
+
+  /**
+   * A source object representing the core library (dart:core).
+   */
+  Source _coreLibrarySource;
+
+  /**
+   * A source object representing the async library (dart:async).
+   */
+  Source _asyncLibrarySource;
+
+  /**
+   * The object representing the core library.
+   */
+  ResolvableLibrary _coreLibrary;
+
+  /**
+   * The object representing the async library.
+   */
+  ResolvableLibrary _asyncLibrary;
+
+  /**
+   * The object used to access the types from the core library.
+   */
+  TypeProvider _typeProvider;
+
+  /**
+   * A table mapping library sources to the information being maintained for those libraries.
+   */
+  HashMap<Source, ResolvableLibrary> _libraryMap =
+      new HashMap<Source, ResolvableLibrary>();
+
+  /**
+   * A collection containing the libraries that are being resolved together.
+   */
+  List<ResolvableLibrary> _librariesInCycle;
+
+  /**
+   * Initialize a newly created library resolver to resolve libraries within the given context.
+   *
+   * @param analysisContext the analysis context in which the library is being analyzed
+   */
+  LibraryResolver2(this.analysisContext) {
+    this._errorListener = new RecordingErrorListener();
+    _coreLibrarySource =
+        analysisContext.sourceFactory.forUri(DartSdk.DART_CORE);
+    _asyncLibrarySource =
+        analysisContext.sourceFactory.forUri(DartSdk.DART_ASYNC);
+  }
+
+  /**
+   * Return the listener to which analysis errors will be reported.
+   *
+   * @return the listener to which analysis errors will be reported
+   */
+  RecordingErrorListener get errorListener => _errorListener;
+
+  /**
+   * Return an array containing information about all of the libraries that were resolved.
+   *
+   * @return an array containing the libraries that were resolved
+   */
+  List<ResolvableLibrary> get resolvedLibraries => _librariesInCycle;
+
+  /**
+   * Resolve the library specified by the given source in the given context.
+   *
+   * Note that because Dart allows circular imports between libraries, it is possible that more than
+   * one library will need to be resolved. In such cases the error listener can receive errors from
+   * multiple libraries.
+   *
+   * @param librarySource the source specifying the defining compilation unit of the library to be
+   *          resolved
+   * @param fullAnalysis `true` if a full analysis should be performed
+   * @return the element representing the resolved library
+   * @throws AnalysisException if the library could not be resolved for some reason
+   */
+  LibraryElement resolveLibrary(
+      Source librarySource, List<ResolvableLibrary> librariesInCycle) {
+    //
+    // Build the map of libraries that are known.
+    //
+    this._librariesInCycle = librariesInCycle;
+    _libraryMap = _buildLibraryMap();
+    ResolvableLibrary targetLibrary = _libraryMap[librarySource];
+    _coreLibrary = _libraryMap[_coreLibrarySource];
+    _asyncLibrary = _libraryMap[_asyncLibrarySource];
+    //
+    // Build the element models representing the libraries being resolved.
+    // This is done in three steps:
+    //
+    // 1. Build the basic element models without making any connections
+    //    between elements other than the basic parent/child relationships.
+    //    This includes building the elements representing the libraries, but
+    //    excludes members defined in enums.
+    // 2. Build the elements for the import and export directives. This
+    //    requires that we have the elements built for the referenced
+    //    libraries, but because of the possibility of circular references
+    //    needs to happen after all of the library elements have been created.
+    // 3. Build the members in enum declarations.
+    // 4. Build the rest of the type model by connecting superclasses, mixins,
+    //    and interfaces. This requires that we be able to compute the names
+    //    visible in the libraries being resolved, which in turn requires that
+    //    we have resolved the import directives.
+    //
+    _buildElementModels();
+    LibraryElement coreElement = _coreLibrary.libraryElement;
+    if (coreElement == null) {
+      missingCoreLibrary(analysisContext, _coreLibrarySource);
+    }
+    LibraryElement asyncElement = _asyncLibrary.libraryElement;
+    if (asyncElement == null) {
+      missingAsyncLibrary(analysisContext, _asyncLibrarySource);
+    }
+    _buildDirectiveModels();
+    _typeProvider = new TypeProviderImpl(coreElement, asyncElement);
+    _buildEnumMembers();
+    _buildTypeHierarchies();
+    //
+    // Perform resolution and type analysis.
+    //
+    // TODO(brianwilkerson) Decide whether we want to resolve all of the
+    // libraries or whether we want to only resolve the target library. The
+    // advantage to resolving everything is that we have already done part of
+    // the work so we'll avoid duplicated effort. The disadvantage of
+    // resolving everything is that we might do extra work that we don't
+    // really care about. Another possibility is to add a parameter to this
+    // method and punt the decision to the clients.
+    //
+    //if (analyzeAll) {
+    _resolveReferencesAndTypes();
+    //} else {
+    //  resolveReferencesAndTypes(targetLibrary);
+    //}
+    _performConstantEvaluation();
+    return targetLibrary.libraryElement;
+  }
+
+  /**
+   * Build the element model representing the combinators declared by the given directive.
+   *
+   * @param directive the directive that declares the combinators
+   * @return an array containing the import combinators that were built
+   */
+  List<NamespaceCombinator> _buildCombinators(NamespaceDirective directive) {
+    List<NamespaceCombinator> combinators = new List<NamespaceCombinator>();
+    for (Combinator combinator in directive.combinators) {
+      if (combinator is HideCombinator) {
+        HideElementCombinatorImpl hide = new HideElementCombinatorImpl();
+        hide.hiddenNames = _getIdentifiers(combinator.hiddenNames);
+        combinators.add(hide);
+      } else {
+        ShowElementCombinatorImpl show = new ShowElementCombinatorImpl();
+        show.offset = combinator.offset;
+        show.end = combinator.end;
+        show.shownNames =
+            _getIdentifiers((combinator as ShowCombinator).shownNames);
+        combinators.add(show);
+      }
+    }
+    return combinators;
+  }
+
+  /**
+   * Every library now has a corresponding [LibraryElement], so it is now possible to resolve
+   * the import and export directives.
+   *
+   * @throws AnalysisException if the defining compilation unit for any of the libraries could not
+   *           be accessed
+   */
+  void _buildDirectiveModels() {
+    for (ResolvableLibrary library in _librariesInCycle) {
+      HashMap<String, PrefixElementImpl> nameToPrefixMap =
+          new HashMap<String, PrefixElementImpl>();
+      List<ImportElement> imports = new List<ImportElement>();
+      List<ExportElement> exports = new List<ExportElement>();
+      for (Directive directive in library.definingCompilationUnit.directives) {
+        if (directive is ImportDirective) {
+          ImportDirective importDirective = directive;
+          String uriContent = importDirective.uriContent;
+          if (DartUriResolver.isDartExtUri(uriContent)) {
+            library.libraryElement.hasExtUri = true;
+          }
+          Source importedSource = importDirective.source;
+          if (importedSource != null &&
+              analysisContext.exists(importedSource)) {
+            // The imported source will be null if the URI in the import
+            // directive was invalid.
+            ResolvableLibrary importedLibrary = _libraryMap[importedSource];
+            if (importedLibrary != null) {
+              ImportElementImpl importElement =
+                  new ImportElementImpl(directive.offset);
+              StringLiteral uriLiteral = importDirective.uri;
+              if (uriLiteral != null) {
+                importElement.uriOffset = uriLiteral.offset;
+                importElement.uriEnd = uriLiteral.end;
+              }
+              importElement.uri = uriContent;
+              importElement.deferred = importDirective.deferredKeyword != null;
+              importElement.combinators = _buildCombinators(importDirective);
+              LibraryElement importedLibraryElement =
+                  importedLibrary.libraryElement;
+              if (importedLibraryElement != null) {
+                importElement.importedLibrary = importedLibraryElement;
+              }
+              SimpleIdentifier prefixNode = directive.prefix;
+              if (prefixNode != null) {
+                importElement.prefixOffset = prefixNode.offset;
+                String prefixName = prefixNode.name;
+                PrefixElementImpl prefix = nameToPrefixMap[prefixName];
+                if (prefix == null) {
+                  prefix = new PrefixElementImpl.forNode(prefixNode);
+                  nameToPrefixMap[prefixName] = prefix;
+                }
+                importElement.prefix = prefix;
+                prefixNode.staticElement = prefix;
+              }
+              directive.element = importElement;
+              imports.add(importElement);
+              if (analysisContext.computeKindOf(importedSource) !=
+                  SourceKind.LIBRARY) {
+                ErrorCode errorCode = (importElement.isDeferred
+                    ? StaticWarningCode.IMPORT_OF_NON_LIBRARY
+                    : CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY);
+                _errorListener.onError(new AnalysisError(
+                    library.librarySource,
+                    uriLiteral.offset,
+                    uriLiteral.length,
+                    errorCode,
+                    [uriLiteral.toSource()]));
+              }
+            }
+          }
+        } else if (directive is ExportDirective) {
+          ExportDirective exportDirective = directive;
+          Source exportedSource = exportDirective.source;
+          if (exportedSource != null &&
+              analysisContext.exists(exportedSource)) {
+            // The exported source will be null if the URI in the export
+            // directive was invalid.
+            ResolvableLibrary exportedLibrary = _libraryMap[exportedSource];
+            if (exportedLibrary != null) {
+              ExportElementImpl exportElement =
+                  new ExportElementImpl(directive.offset);
+              StringLiteral uriLiteral = exportDirective.uri;
+              if (uriLiteral != null) {
+                exportElement.uriOffset = uriLiteral.offset;
+                exportElement.uriEnd = uriLiteral.end;
+              }
+              exportElement.uri = exportDirective.uriContent;
+              exportElement.combinators = _buildCombinators(exportDirective);
+              LibraryElement exportedLibraryElement =
+                  exportedLibrary.libraryElement;
+              if (exportedLibraryElement != null) {
+                exportElement.exportedLibrary = exportedLibraryElement;
+              }
+              directive.element = exportElement;
+              exports.add(exportElement);
+              if (analysisContext.computeKindOf(exportedSource) !=
+                  SourceKind.LIBRARY) {
+                _errorListener.onError(new AnalysisError(
+                    library.librarySource,
+                    uriLiteral.offset,
+                    uriLiteral.length,
+                    CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY,
+                    [uriLiteral.toSource()]));
+              }
+            }
+          }
+        }
+      }
+      Source librarySource = library.librarySource;
+      if (!library.explicitlyImportsCore &&
+          _coreLibrarySource != librarySource) {
+        ImportElementImpl importElement = new ImportElementImpl(-1);
+        importElement.importedLibrary = _coreLibrary.libraryElement;
+        importElement.synthetic = true;
+        imports.add(importElement);
+      }
+      LibraryElementImpl libraryElement = library.libraryElement;
+      libraryElement.imports = imports;
+      libraryElement.exports = exports;
+      if (libraryElement.entryPoint == null) {
+        Namespace namespace = new NamespaceBuilder()
+            .createExportNamespaceForLibrary(libraryElement);
+        Element element = namespace.get(FunctionElement.MAIN_FUNCTION_NAME);
+        if (element is FunctionElement) {
+          libraryElement.entryPoint = element;
+        }
+      }
+    }
+  }
+
+  /**
+   * Build element models for all of the libraries in the current cycle.
+   *
+   * @throws AnalysisException if any of the element models cannot be built
+   */
+  void _buildElementModels() {
+    for (ResolvableLibrary library in _librariesInCycle) {
+      LibraryElementBuilder builder =
+          new LibraryElementBuilder(analysisContext, errorListener);
+      builder.buildLibrary2(library);
+    }
+  }
+
+  /**
+   * Build the members in enum declarations. This cannot be done while building the rest of the
+   * element model because it depends on being able to access core types, which cannot happen until
+   * the rest of the element model has been built (when resolving the core library).
+   *
+   * @throws AnalysisException if any of the enum members could not be built
+   */
+  void _buildEnumMembers() {
+    PerformanceStatistics.resolve.makeCurrentWhile(() {
+      for (ResolvableLibrary library in _librariesInCycle) {
+        for (Source source in library.compilationUnitSources) {
+          EnumMemberBuilder builder = new EnumMemberBuilder(_typeProvider);
+          library.getAST(source).accept(builder);
+        }
+      }
+    });
+  }
+
+  HashMap<Source, ResolvableLibrary> _buildLibraryMap() {
+    HashMap<Source, ResolvableLibrary> libraryMap =
+        new HashMap<Source, ResolvableLibrary>();
+    int libraryCount = _librariesInCycle.length;
+    for (int i = 0; i < libraryCount; i++) {
+      ResolvableLibrary library = _librariesInCycle[i];
+      library.errorListener = _errorListener;
+      libraryMap[library.librarySource] = library;
+      List<ResolvableLibrary> dependencies = library.importsAndExports;
+      int dependencyCount = dependencies.length;
+      for (int j = 0; j < dependencyCount; j++) {
+        ResolvableLibrary dependency = dependencies[j];
+        //dependency.setErrorListener(errorListener);
+        libraryMap[dependency.librarySource] = dependency;
+      }
+    }
+    return libraryMap;
+  }
+
+  /**
+   * Resolve the type hierarchy across all of the types declared in the libraries in the current
+   * cycle.
+   *
+   * @throws AnalysisException if any of the type hierarchies could not be resolved
+   */
+  void _buildTypeHierarchies() {
+    PerformanceStatistics.resolve.makeCurrentWhile(() {
+      for (ResolvableLibrary library in _librariesInCycle) {
+        for (ResolvableCompilationUnit unit
+            in library.resolvableCompilationUnits) {
+          Source source = unit.source;
+          CompilationUnit ast = unit.compilationUnit;
+          TypeResolverVisitor visitor = new TypeResolverVisitor(
+              library.libraryElement,
+              source,
+              _typeProvider,
+              library.libraryScope.errorListener,
+              nameScope: library.libraryScope);
+          ast.accept(visitor);
+        }
+      }
+    });
+  }
+
+  /**
+   * Return an array containing the lexical identifiers associated with the nodes in the given list.
+   *
+   * @param names the AST nodes representing the identifiers
+   * @return the lexical identifiers associated with the nodes in the list
+   */
+  List<String> _getIdentifiers(NodeList<SimpleIdentifier> names) {
+    int count = names.length;
+    List<String> identifiers = new List<String>(count);
+    for (int i = 0; i < count; i++) {
+      identifiers[i] = names[i].name;
+    }
+    return identifiers;
+  }
+
+  /**
+   * Compute a value for all of the constants in the libraries being analyzed.
+   */
+  void _performConstantEvaluation() {
+    PerformanceStatistics.resolve.makeCurrentWhile(() {
+      ConstantValueComputer computer = new ConstantValueComputer(
+          analysisContext, _typeProvider, analysisContext.declaredVariables);
+      for (ResolvableLibrary library in _librariesInCycle) {
+        for (ResolvableCompilationUnit unit
+            in library.resolvableCompilationUnits) {
+          CompilationUnit ast = unit.compilationUnit;
+          if (ast != null) {
+            computer.add(ast, unit.source, library.librarySource);
+          }
+        }
+      }
+      computer.computeValues();
+      // As a temporary workaround for issue 21572, run ConstantVerifier now.
+      // TODO(paulberry): remove this workaround once issue 21572 is fixed.
+      for (ResolvableLibrary library in _librariesInCycle) {
+        for (ResolvableCompilationUnit unit
+            in library.resolvableCompilationUnits) {
+          CompilationUnit ast = unit.compilationUnit;
+          ErrorReporter errorReporter =
+              new ErrorReporter(_errorListener, unit.source);
+          ConstantVerifier constantVerifier = new ConstantVerifier(
+              errorReporter,
+              library.libraryElement,
+              _typeProvider,
+              analysisContext.declaredVariables);
+          ast.accept(constantVerifier);
+        }
+      }
+    });
+  }
+
+  /**
+   * Resolve the identifiers and perform type analysis in the libraries in the current cycle.
+   *
+   * @throws AnalysisException if any of the identifiers could not be resolved or if any of the
+   *           libraries could not have their types analyzed
+   */
+  void _resolveReferencesAndTypes() {
+    for (ResolvableLibrary library in _librariesInCycle) {
+      _resolveReferencesAndTypesInLibrary(library);
+    }
+  }
+
+  /**
+   * Resolve the identifiers and perform type analysis in the given library.
+   *
+   * @param library the library to be resolved
+   * @throws AnalysisException if any of the identifiers could not be resolved or if the types in
+   *           the library cannot be analyzed
+   */
+  void _resolveReferencesAndTypesInLibrary(ResolvableLibrary library) {
+    PerformanceStatistics.resolve.makeCurrentWhile(() {
+      for (ResolvableCompilationUnit unit
+          in library.resolvableCompilationUnits) {
+        Source source = unit.source;
+        CompilationUnit ast = unit.compilationUnit;
+        ast.accept(new VariableResolverVisitor(library.libraryElement, source,
+            _typeProvider, library.libraryScope.errorListener,
+            nameScope: library.libraryScope));
+        ResolverVisitor visitor = new ResolverVisitor(library.libraryElement,
+            source, _typeProvider, library._libraryScope.errorListener,
+            nameScope: library._libraryScope,
+            inheritanceManager: library.inheritanceManager);
+        ast.accept(visitor);
+      }
+    });
+  }
+
+  /**
+   * Report that the async library could not be resolved in the given
+   * [analysisContext] and throw an exception.  [asyncLibrarySource] is the source
+   * representing the async library.
+   */
+  static void missingAsyncLibrary(
+      AnalysisContext analysisContext, Source asyncLibrarySource) {
+    throw new AnalysisException("Could not resolve dart:async");
+  }
+
+  /**
+   * Report that the core library could not be resolved in the given analysis context and throw an
+   * exception.
+   *
+   * @param analysisContext the analysis context in which the failure occurred
+   * @param coreLibrarySource the source representing the core library
+   * @throws AnalysisException always
+   */
+  static void missingCoreLibrary(
+      AnalysisContext analysisContext, Source coreLibrarySource) {
+    throw new AnalysisException("Could not resolve dart:core");
+  }
+}
+
+/**
+ * Instances of the class `TypeAliasInfo` hold information about a [TypeAlias].
+ */
+class LibraryResolver2_TypeAliasInfo {
+  final ResolvableLibrary _library;
+
+  final Source _source;
+
+  final FunctionTypeAlias _typeAlias;
+
+  /**
+   * Initialize a newly created information holder with the given information.
+   *
+   * @param library the library containing the type alias
+   * @param source the source of the file containing the type alias
+   * @param typeAlias the type alias being remembered
+   */
+  LibraryResolver2_TypeAliasInfo(this._library, this._source, this._typeAlias);
+}
+
+/**
+ * Instances of the class `TypeAliasInfo` hold information about a [TypeAlias].
+ */
+class LibraryResolver_TypeAliasInfo {
+  final Library _library;
+
+  final Source _source;
+
+  final FunctionTypeAlias _typeAlias;
+
+  /**
+   * Initialize a newly created information holder with the given information.
+   *
+   * @param library the library containing the type alias
+   * @param source the source of the file containing the type alias
+   * @param typeAlias the type alias being remembered
+   */
+  LibraryResolver_TypeAliasInfo(this._library, this._source, this._typeAlias);
+}
+
+/**
+ * Instances of the class `LibraryScope` implement a scope containing all of the names defined
+ * in a given library.
+ */
+class LibraryScope extends EnclosedScope {
+  /**
+   * Initialize a newly created scope representing the names defined in the given library.
+   *
+   * @param definingLibrary the element representing the library represented by this scope
+   * @param errorListener the listener that is to be informed when an error is encountered
+   */
+  LibraryScope(
+      LibraryElement definingLibrary, AnalysisErrorListener errorListener)
+      : super(new LibraryImportScope(definingLibrary, errorListener)) {
+    _defineTopLevelNames(definingLibrary);
+  }
+
+  @override
+  AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
+    if (existing is PrefixElement) {
+      // TODO(scheglov) consider providing actual 'nameOffset' from the
+      // synthetic accessor
+      int offset = duplicate.nameOffset;
+      if (duplicate is PropertyAccessorElement) {
+        PropertyAccessorElement accessor = duplicate;
+        if (accessor.isSynthetic) {
+          offset = accessor.variable.nameOffset;
+        }
+      }
+      return new AnalysisError(
+          duplicate.source,
+          offset,
+          duplicate.displayName.length,
+          CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER,
+          [existing.displayName]);
+    }
+    return super.getErrorForDuplicate(existing, duplicate);
+  }
+
+  /**
+   * Add to this scope all of the public top-level names that are defined in the given compilation
+   * unit.
+   *
+   * @param compilationUnit the compilation unit defining the top-level names to be added to this
+   *          scope
+   */
+  void _defineLocalNames(CompilationUnitElement compilationUnit) {
+    for (PropertyAccessorElement element in compilationUnit.accessors) {
+      define(element);
+    }
+    for (ClassElement element in compilationUnit.enums) {
+      define(element);
+    }
+    for (FunctionElement element in compilationUnit.functions) {
+      define(element);
+    }
+    for (FunctionTypeAliasElement element
+        in compilationUnit.functionTypeAliases) {
+      define(element);
+    }
+    for (ClassElement element in compilationUnit.types) {
+      define(element);
+    }
+  }
+
+  /**
+   * Add to this scope all of the names that are explicitly defined in the given library.
+   *
+   * @param definingLibrary the element representing the library that defines the names in this
+   *          scope
+   */
+  void _defineTopLevelNames(LibraryElement definingLibrary) {
+    for (PrefixElement prefix in definingLibrary.prefixes) {
+      define(prefix);
+    }
+    _defineLocalNames(definingLibrary.definingCompilationUnit);
+    for (CompilationUnitElement compilationUnit in definingLibrary.parts) {
+      _defineLocalNames(compilationUnit);
+    }
+  }
+}
+
+/**
+ * This class is used to replace uses of `HashMap<String, ExecutableElement>`
+ * which are not as performant as this class.
+ */
+class MemberMap {
+  /**
+   * The current size of this map.
+   */
+  int _size = 0;
+
+  /**
+   * The array of keys.
+   */
+  List<String> _keys;
+
+  /**
+   * The array of ExecutableElement values.
+   */
+  List<ExecutableElement> _values;
+
+  /**
+   * Initialize a newly created member map to have the given [initialCapacity].
+   * The map will grow if needed.
+   */
+  MemberMap([int initialCapacity = 10]) {
+    _initArrays(initialCapacity);
+  }
+
+  /**
+   * This constructor takes an initial capacity of the map.
+   *
+   * @param initialCapacity the initial capacity
+   */
+  @deprecated // Use new MemberMap(initialCapacity)
+  MemberMap.con1(int initialCapacity) {
+    _initArrays(initialCapacity);
+  }
+
+  /**
+   * Copy constructor.
+   */
+  @deprecated // Use new MemberMap.from(memberMap)
+  MemberMap.con2(MemberMap memberMap) {
+    _initArrays(memberMap._size + 5);
+    for (int i = 0; i < memberMap._size; i++) {
+      _keys[i] = memberMap._keys[i];
+      _values[i] = memberMap._values[i];
+    }
+    _size = memberMap._size;
+  }
+
+  /**
+   * Initialize a newly created member map to contain the same members as the
+   * given [memberMap].
+   */
+  MemberMap.from(MemberMap memberMap) {
+    _initArrays(memberMap._size + 5);
+    for (int i = 0; i < memberMap._size; i++) {
+      _keys[i] = memberMap._keys[i];
+      _values[i] = memberMap._values[i];
+    }
+    _size = memberMap._size;
+  }
+
+  /**
+   * The size of the map.
+   *
+   * @return the size of the map.
+   */
+  int get size => _size;
+
+  /**
+   * Given some key, return the ExecutableElement value from the map, if the key does not exist in
+   * the map, `null` is returned.
+   *
+   * @param key some key to look up in the map
+   * @return the associated ExecutableElement value from the map, if the key does not exist in the
+   *         map, `null` is returned
+   */
+  ExecutableElement get(String key) {
+    for (int i = 0; i < _size; i++) {
+      if (_keys[i] != null && _keys[i] == key) {
+        return _values[i];
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Get and return the key at the specified location. If the key/value pair has been removed from
+   * the set, then `null` is returned.
+   *
+   * @param i some non-zero value less than size
+   * @return the key at the passed index
+   * @throw ArrayIndexOutOfBoundsException this exception is thrown if the passed index is less than
+   *        zero or greater than or equal to the capacity of the arrays
+   */
+  String getKey(int i) => _keys[i];
+
+  /**
+   * Get and return the ExecutableElement at the specified location. If the key/value pair has been
+   * removed from the set, then then `null` is returned.
+   *
+   * @param i some non-zero value less than size
+   * @return the key at the passed index
+   * @throw ArrayIndexOutOfBoundsException this exception is thrown if the passed index is less than
+   *        zero or greater than or equal to the capacity of the arrays
+   */
+  ExecutableElement getValue(int i) => _values[i];
+
+  /**
+   * Given some key/value pair, store the pair in the map. If the key exists already, then the new
+   * value overrides the old value.
+   *
+   * @param key the key to store in the map
+   * @param value the ExecutableElement value to store in the map
+   */
+  void put(String key, ExecutableElement value) {
+    // If we already have a value with this key, override the value
+    for (int i = 0; i < _size; i++) {
+      if (_keys[i] != null && _keys[i] == key) {
+        _values[i] = value;
+        return;
+      }
+    }
+    // If needed, double the size of our arrays and copy values over in both
+    // arrays
+    if (_size == _keys.length) {
+      int newArrayLength = _size * 2;
+      List<String> keys_new_array = new List<String>(newArrayLength);
+      List<ExecutableElement> values_new_array =
+          new List<ExecutableElement>(newArrayLength);
+      for (int i = 0; i < _size; i++) {
+        keys_new_array[i] = _keys[i];
+      }
+      for (int i = 0; i < _size; i++) {
+        values_new_array[i] = _values[i];
+      }
+      _keys = keys_new_array;
+      _values = values_new_array;
+    }
+    // Put new value at end of array
+    _keys[_size] = key;
+    _values[_size] = value;
+    _size++;
+  }
+
+  /**
+   * Given some [String] key, this method replaces the associated key and value pair with
+   * `null`. The size is not decremented with this call, instead it is expected that the users
+   * check for `null`.
+   *
+   * @param key the key of the key/value pair to remove from the map
+   */
+  void remove(String key) {
+    for (int i = 0; i < _size; i++) {
+      if (_keys[i] == key) {
+        _keys[i] = null;
+        _values[i] = null;
+        return;
+      }
+    }
+  }
+
+  /**
+   * Sets the ExecutableElement at the specified location.
+   *
+   * @param i some non-zero value less than size
+   * @param value the ExecutableElement value to store in the map
+   */
+  void setValue(int i, ExecutableElement value) {
+    _values[i] = value;
+  }
+
+  /**
+   * Initializes [keys] and [values].
+   */
+  void _initArrays(int initialCapacity) {
+    _keys = new List<String>(initialCapacity);
+    _values = new List<ExecutableElement>(initialCapacity);
+  }
+}
+
+/**
+ * Instances of the class `Namespace` implement a mapping of identifiers to the elements
+ * represented by those identifiers. Namespaces are the building blocks for scopes.
+ */
+class Namespace {
+  /**
+   * An empty namespace.
+   */
+  static Namespace EMPTY = new Namespace(new HashMap<String, Element>());
+
+  /**
+   * A table mapping names that are defined in this namespace to the element representing the thing
+   * declared with that name.
+   */
+  final HashMap<String, Element> _definedNames;
+
+  /**
+   * Initialize a newly created namespace to have the given defined names.
+   *
+   * @param definedNames the mapping from names that are defined in this namespace to the
+   *          corresponding elements
+   */
+  Namespace(this._definedNames);
+
+  /**
+   * Return a table containing the same mappings as those defined by this namespace.
+   *
+   * @return a table containing the same mappings as those defined by this namespace
+   */
+  Map<String, Element> get definedNames =>
+      new HashMap<String, Element>.from(_definedNames);
+
+  /**
+   * Return the element in this namespace that is available to the containing scope using the given
+   * name.
+   *
+   * @param name the name used to reference the
+   * @return the element represented by the given identifier
+   */
+  Element get(String name) => _definedNames[name];
+}
+
+/**
+ * Instances of the class `NamespaceBuilder` are used to build a `Namespace`. Namespace
+ * builders are thread-safe and re-usable.
+ */
+class NamespaceBuilder {
+  /**
+   * Create a namespace representing the export namespace of the given [ExportElement].
+   *
+   * @param element the export element whose export namespace is to be created
+   * @return the export namespace that was created
+   */
+  Namespace createExportNamespaceForDirective(ExportElement element) {
+    LibraryElement exportedLibrary = element.exportedLibrary;
+    if (exportedLibrary == null) {
+      //
+      // The exported library will be null if the URI does not reference a valid
+      // library.
+      //
+      return Namespace.EMPTY;
+    }
+    HashMap<String, Element> definedNames =
+        _createExportMapping(exportedLibrary, new HashSet<LibraryElement>());
+    definedNames = _applyCombinators(definedNames, element.combinators);
+    return new Namespace(definedNames);
+  }
+
+  /**
+   * Create a namespace representing the export namespace of the given library.
+   *
+   * @param library the library whose export namespace is to be created
+   * @return the export namespace that was created
+   */
+  Namespace createExportNamespaceForLibrary(LibraryElement library) =>
+      new Namespace(
+          _createExportMapping(library, new HashSet<LibraryElement>()));
+
+  /**
+   * Create a namespace representing the import namespace of the given library.
+   *
+   * @param library the library whose import namespace is to be created
+   * @return the import namespace that was created
+   */
+  Namespace createImportNamespaceForDirective(ImportElement element) {
+    LibraryElement importedLibrary = element.importedLibrary;
+    if (importedLibrary == null) {
+      //
+      // The imported library will be null if the URI does not reference a valid
+      // library.
+      //
+      return Namespace.EMPTY;
+    }
+    HashMap<String, Element> definedNames =
+        _createExportMapping(importedLibrary, new HashSet<LibraryElement>());
+    definedNames = _applyCombinators(definedNames, element.combinators);
+    definedNames = _applyPrefix(definedNames, element.prefix);
+    return new Namespace(definedNames);
+  }
+
+  /**
+   * Create a namespace representing the public namespace of the given library.
+   *
+   * @param library the library whose public namespace is to be created
+   * @return the public namespace that was created
+   */
+  Namespace createPublicNamespaceForLibrary(LibraryElement library) {
+    HashMap<String, Element> definedNames = new HashMap<String, Element>();
+    _addPublicNames(definedNames, library.definingCompilationUnit);
+    for (CompilationUnitElement compilationUnit in library.parts) {
+      _addPublicNames(definedNames, compilationUnit);
+    }
+    return new Namespace(definedNames);
+  }
+
+  /**
+   * Add all of the names in the given namespace to the given mapping table.
+   *
+   * @param definedNames the mapping table to which the names in the given namespace are to be added
+   * @param namespace the namespace containing the names to be added to this namespace
+   */
+  void _addAllFromNamespace(
+      Map<String, Element> definedNames, Namespace namespace) {
+    if (namespace != null) {
+      definedNames.addAll(namespace.definedNames);
+    }
+  }
+
+  /**
+   * Add the given element to the given mapping table if it has a publicly visible name.
+   *
+   * @param definedNames the mapping table to which the public name is to be added
+   * @param element the element to be added
+   */
+  void _addIfPublic(Map<String, Element> definedNames, Element element) {
+    String name = element.name;
+    if (name != null && !Scope.isPrivateName(name)) {
+      definedNames[name] = element;
+    }
+  }
+
+  /**
+   * Add to the given mapping table all of the public top-level names that are defined in the given
+   * compilation unit.
+   *
+   * @param definedNames the mapping table to which the public names are to be added
+   * @param compilationUnit the compilation unit defining the top-level names to be added to this
+   *          namespace
+   */
+  void _addPublicNames(Map<String, Element> definedNames,
+      CompilationUnitElement compilationUnit) {
+    for (PropertyAccessorElement element in compilationUnit.accessors) {
+      _addIfPublic(definedNames, element);
+    }
+    for (ClassElement element in compilationUnit.enums) {
+      _addIfPublic(definedNames, element);
+    }
+    for (FunctionElement element in compilationUnit.functions) {
+      _addIfPublic(definedNames, element);
+    }
+    for (FunctionTypeAliasElement element
+        in compilationUnit.functionTypeAliases) {
+      _addIfPublic(definedNames, element);
+    }
+    for (ClassElement element in compilationUnit.types) {
+      _addIfPublic(definedNames, element);
+    }
+  }
+
+  /**
+   * Apply the given combinators to all of the names in the given mapping table.
+   *
+   * @param definedNames the mapping table to which the namespace operations are to be applied
+   * @param combinators the combinators to be applied
+   */
+  HashMap<String, Element> _applyCombinators(
+      HashMap<String, Element> definedNames,
+      List<NamespaceCombinator> combinators) {
+    for (NamespaceCombinator combinator in combinators) {
+      if (combinator is HideElementCombinator) {
+        _hide(definedNames, combinator.hiddenNames);
+      } else if (combinator is ShowElementCombinator) {
+        definedNames = _show(definedNames, combinator.shownNames);
+      } else {
+        // Internal error.
+        AnalysisEngine.instance.logger
+            .logError("Unknown type of combinator: ${combinator.runtimeType}");
+      }
+    }
+    return definedNames;
+  }
+
+  /**
+   * Apply the given prefix to all of the names in the table of defined names.
+   *
+   * @param definedNames the names that were defined before this operation
+   * @param prefixElement the element defining the prefix to be added to the names
+   */
+  HashMap<String, Element> _applyPrefix(
+      HashMap<String, Element> definedNames, PrefixElement prefixElement) {
+    if (prefixElement != null) {
+      String prefix = prefixElement.name;
+      HashMap<String, Element> newNames = new HashMap<String, Element>();
+      definedNames.forEach((String name, Element element) {
+        newNames["$prefix.$name"] = element;
+      });
+      return newNames;
+    } else {
+      return definedNames;
+    }
+  }
+
+  /**
+   * Create a mapping table representing the export namespace of the given library.
+   *
+   * @param library the library whose public namespace is to be created
+   * @param visitedElements a set of libraries that do not need to be visited when processing the
+   *          export directives of the given library because all of the names defined by them will
+   *          be added by another library
+   * @return the mapping table that was created
+   */
+  HashMap<String, Element> _createExportMapping(
+      LibraryElement library, HashSet<LibraryElement> visitedElements) {
+    // Check if the export namespace has been already computed.
+    {
+      Namespace exportNamespace = library.exportNamespace;
+      if (exportNamespace != null) {
+        return exportNamespace.definedNames;
+      }
+    }
+    // TODO(scheglov) Remove this after switching to the new task model.
+    visitedElements.add(library);
+    try {
+      HashMap<String, Element> definedNames = new HashMap<String, Element>();
+      for (ExportElement element in library.exports) {
+        LibraryElement exportedLibrary = element.exportedLibrary;
+        if (exportedLibrary != null &&
+            !visitedElements.contains(exportedLibrary)) {
+          //
+          // The exported library will be null if the URI does not reference a
+          // valid library.
+          //
+          HashMap<String, Element> exportedNames =
+              _createExportMapping(exportedLibrary, visitedElements);
+          exportedNames = _applyCombinators(exportedNames, element.combinators);
+          definedNames.addAll(exportedNames);
+        }
+      }
+      _addAllFromNamespace(
+          definedNames,
+          (library.context as InternalAnalysisContext)
+              .getPublicNamespace(library));
+      return definedNames;
+    } finally {
+      visitedElements.remove(library);
+    }
+  }
+
+  /**
+   * Hide all of the given names by removing them from the given collection of defined names.
+   *
+   * @param definedNames the names that were defined before this operation
+   * @param hiddenNames the names to be hidden
+   */
+  void _hide(HashMap<String, Element> definedNames, List<String> hiddenNames) {
+    for (String name in hiddenNames) {
+      definedNames.remove(name);
+      definedNames.remove("$name=");
+    }
+  }
+
+  /**
+   * Show only the given names by removing all other names from the given collection of defined
+   * names.
+   *
+   * @param definedNames the names that were defined before this operation
+   * @param shownNames the names to be shown
+   */
+  HashMap<String, Element> _show(
+      HashMap<String, Element> definedNames, List<String> shownNames) {
+    HashMap<String, Element> newNames = new HashMap<String, Element>();
+    for (String name in shownNames) {
+      Element element = definedNames[name];
+      if (element != null) {
+        newNames[name] = element;
+      }
+      String setterName = "$name=";
+      element = definedNames[setterName];
+      if (element != null) {
+        newNames[setterName] = element;
+      }
+    }
+    return newNames;
+  }
+}
+
+/**
+ * Instances of the class `OverrideVerifier` visit all of the declarations in a compilation
+ * unit to verify that if they have an override annotation it is being used correctly.
+ */
+class OverrideVerifier extends RecursiveAstVisitor<Object> {
+  /**
+   * The error reporter used to report errors.
+   */
+  final ErrorReporter _errorReporter;
+
+  /**
+   * The inheritance manager used to find overridden methods.
+   */
+  final InheritanceManager _manager;
+
+  /**
+   * Initialize a newly created verifier to look for inappropriate uses of the override annotation.
+   *
+   * @param errorReporter the error reporter used to report errors
+   * @param manager the inheritance manager used to find overridden methods
+   */
+  OverrideVerifier(this._errorReporter, this._manager);
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    ExecutableElement element = node.element;
+    if (_isOverride(element)) {
+      if (_getOverriddenMember(element) == null) {
+        if (element is MethodElement) {
+          _errorReporter.reportErrorForNode(
+              HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD, node.name);
+        } else if (element is PropertyAccessorElement) {
+          if (element.isGetter) {
+            _errorReporter.reportErrorForNode(
+                HintCode.OVERRIDE_ON_NON_OVERRIDING_GETTER, node.name);
+          } else {
+            _errorReporter.reportErrorForNode(
+                HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER, node.name);
+          }
+        }
+      }
+    }
+    return super.visitMethodDeclaration(node);
+  }
+
+  /**
+   * Return the member that overrides the given member.
+   *
+   * @param member the member that overrides the returned member
+   * @return the member that overrides the given member
+   */
+  ExecutableElement _getOverriddenMember(ExecutableElement member) {
+    LibraryElement library = member.library;
+    if (library == null) {
+      return null;
+    }
+    ClassElement classElement =
+        member.getAncestor((element) => element is ClassElement);
+    if (classElement == null) {
+      return null;
+    }
+    return _manager.lookupInheritance(classElement, member.name);
+  }
+
+  /**
+   * Return `true` if the given element has an override annotation associated with it.
+   *
+   * @param element the element being tested
+   * @return `true` if the element has an override annotation associated with it
+   */
+  bool _isOverride(Element element) => element != null && element.isOverride;
+}
+
+/**
+ * Instances of the class `PubVerifier` traverse an AST structure looking for deviations from
+ * pub best practices.
+ */
+class PubVerifier extends RecursiveAstVisitor<Object> {
+//  static String _PUBSPEC_YAML = "pubspec.yaml";
+
+  /**
+   * The analysis context containing the sources to be analyzed
+   */
+  final AnalysisContext _context;
+
+  /**
+   * The error reporter by which errors will be reported.
+   */
+  final ErrorReporter _errorReporter;
+
+  PubVerifier(this._context, this._errorReporter);
+
+  @override
+  Object visitImportDirective(ImportDirective directive) {
+    return null;
+  }
+
+//  /**
+//   * This verifies that the passed file import directive is not contained in a source inside a
+//   * package "lib" directory hierarchy referencing a source outside that package "lib" directory
+//   * hierarchy.
+//   *
+//   * @param uriLiteral the import URL (not `null`)
+//   * @param path the file path being verified (not `null`)
+//   * @return `true` if and only if an error code is generated on the passed node
+//   * See [PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE].
+//   */
+//  bool
+//      _checkForFileImportInsideLibReferencesFileOutside(StringLiteral uriLiteral,
+//      String path) {
+//    Source source = _getSource(uriLiteral);
+//    String fullName = _getSourceFullName(source);
+//    if (fullName != null) {
+//      int pathIndex = 0;
+//      int fullNameIndex = fullName.length;
+//      while (pathIndex < path.length &&
+//          StringUtilities.startsWith3(path, pathIndex, 0x2E, 0x2E, 0x2F)) {
+//        fullNameIndex = JavaString.lastIndexOf(fullName, '/', fullNameIndex);
+//        if (fullNameIndex < 4) {
+//          return false;
+//        }
+//        // Check for "/lib" at a specified place in the fullName
+//        if (StringUtilities.startsWith4(
+//            fullName,
+//            fullNameIndex - 4,
+//            0x2F,
+//            0x6C,
+//            0x69,
+//            0x62)) {
+//          String relativePubspecPath =
+//              path.substring(0, pathIndex + 3) +
+//              _PUBSPEC_YAML;
+//          Source pubspecSource =
+//              _context.sourceFactory.resolveUri(source, relativePubspecPath);
+//          if (_context.exists(pubspecSource)) {
+//            // Files inside the lib directory hierarchy should not reference
+//            // files outside
+//            _errorReporter.reportErrorForNode(
+//                HintCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE,
+//                uriLiteral);
+//          }
+//          return true;
+//        }
+//        pathIndex += 3;
+//      }
+//    }
+//    return false;
+//  }
+
+//  /**
+//   * This verifies that the passed file import directive is not contained in a source outside a
+//   * package "lib" directory hierarchy referencing a source inside that package "lib" directory
+//   * hierarchy.
+//   *
+//   * @param uriLiteral the import URL (not `null`)
+//   * @param path the file path being verified (not `null`)
+//   * @return `true` if and only if an error code is generated on the passed node
+//   * See [PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE].
+//   */
+//  bool
+//      _checkForFileImportOutsideLibReferencesFileInside(StringLiteral uriLiteral,
+//      String path) {
+//    if (StringUtilities.startsWith4(path, 0, 0x6C, 0x69, 0x62, 0x2F)) {
+//      if (_checkForFileImportOutsideLibReferencesFileInsideAtIndex(
+//          uriLiteral,
+//          path,
+//          0)) {
+//        return true;
+//      }
+//    }
+//    int pathIndex =
+//        StringUtilities.indexOf5(path, 0, 0x2F, 0x6C, 0x69, 0x62, 0x2F);
+//    while (pathIndex != -1) {
+//      if (_checkForFileImportOutsideLibReferencesFileInsideAtIndex(
+//          uriLiteral,
+//          path,
+//          pathIndex + 1)) {
+//        return true;
+//      }
+//      pathIndex =
+//          StringUtilities.indexOf5(path, pathIndex + 4, 0x2F, 0x6C, 0x69, 0x62, 0x2F);
+//    }
+//    return false;
+//  }
+
+//  bool
+//      _checkForFileImportOutsideLibReferencesFileInsideAtIndex(StringLiteral uriLiteral,
+//      String path, int pathIndex) {
+//    Source source = _getSource(uriLiteral);
+//    String relativePubspecPath = path.substring(0, pathIndex) + _PUBSPEC_YAML;
+//    Source pubspecSource =
+//        _context.sourceFactory.resolveUri(source, relativePubspecPath);
+//    if (!_context.exists(pubspecSource)) {
+//      return false;
+//    }
+//    String fullName = _getSourceFullName(source);
+//    if (fullName != null) {
+//      if (StringUtilities.indexOf5(fullName, 0, 0x2F, 0x6C, 0x69, 0x62, 0x2F) <
+//          0) {
+//        // Files outside the lib directory hierarchy should not reference files
+//        // inside ... use package: url instead
+//        _errorReporter.reportErrorForNode(
+//            HintCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE,
+//            uriLiteral);
+//        return true;
+//      }
+//    }
+//    return false;
+//  }
+
+//  /**
+//   * This verifies that the passed package import directive does not contain ".."
+//   *
+//   * @param uriLiteral the import URL (not `null`)
+//   * @param path the path to be validated (not `null`)
+//   * @return `true` if and only if an error code is generated on the passed node
+//   * See [PubSuggestionCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT].
+//   */
+//  bool _checkForPackageImportContainsDotDot(StringLiteral uriLiteral,
+//      String path) {
+//    if (StringUtilities.startsWith3(path, 0, 0x2E, 0x2E, 0x2F) ||
+//        StringUtilities.indexOf4(path, 0, 0x2F, 0x2E, 0x2E, 0x2F) >= 0) {
+//      // Package import should not to contain ".."
+//      _errorReporter.reportErrorForNode(
+//          HintCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT,
+//          uriLiteral);
+//      return true;
+//    }
+//    return false;
+//  }
+
+//  /**
+//   * Answer the source associated with the compilation unit containing the given AST node.
+//   *
+//   * @param node the node (not `null`)
+//   * @return the source or `null` if it could not be determined
+//   */
+//  Source _getSource(AstNode node) {
+//    Source source = null;
+//    CompilationUnit unit = node.getAncestor((node) => node is CompilationUnit);
+//    if (unit != null) {
+//      CompilationUnitElement element = unit.element;
+//      if (element != null) {
+//        source = element.source;
+//      }
+//    }
+//    return source;
+//  }
+
+//  /**
+//   * Answer the full name of the given source. The returned value will have all
+//   * [File.separatorChar] replace by '/'.
+//   *
+//   * @param source the source
+//   * @return the full name or `null` if it could not be determined
+//   */
+//  String _getSourceFullName(Source source) {
+//    if (source != null) {
+//      String fullName = source.fullName;
+//      if (fullName != null) {
+//        return fullName.replaceAll(r'\', '/');
+//      }
+//    }
+//    return null;
+//  }
+}
+
+/**
+ * Kind of the redirecting constructor.
+ */
+class RedirectingConstructorKind extends Enum<RedirectingConstructorKind> {
+  static const RedirectingConstructorKind CONST =
+      const RedirectingConstructorKind('CONST', 0);
+
+  static const RedirectingConstructorKind NORMAL =
+      const RedirectingConstructorKind('NORMAL', 1);
+
+  static const List<RedirectingConstructorKind> values = const [CONST, NORMAL];
+
+  const RedirectingConstructorKind(String name, int ordinal)
+      : super(name, ordinal);
+}
+
+/**
+ * A `ResolvableLibrary` represents a single library during the resolution of
+ * some (possibly different) library. They are not intended to be used except
+ * during the resolution process.
+ */
+class ResolvableLibrary {
+  /**
+   * An empty array that can be used to initialize lists of libraries.
+   */
+  static List<ResolvableLibrary> _EMPTY_ARRAY = new List<ResolvableLibrary>(0);
+
+  /**
+   * The next artificial hash code.
+   */
+  static int _NEXT_HASH_CODE = 0;
+
+  /**
+   * The artifitial hash code for this object.
+   */
+  final int _hashCode = _nextHashCode();
+
+  /**
+   * The source specifying the defining compilation unit of this library.
+   */
+  final Source librarySource;
+
+  /**
+   * A list containing all of the libraries that are imported into this library.
+   */
+  List<ResolvableLibrary> _importedLibraries = _EMPTY_ARRAY;
+
+  /**
+   * A flag indicating whether this library explicitly imports core.
+   */
+  bool explicitlyImportsCore = false;
+
+  /**
+   * An array containing all of the libraries that are exported from this library.
+   */
+  List<ResolvableLibrary> _exportedLibraries = _EMPTY_ARRAY;
+
+  /**
+   * An array containing the compilation units that comprise this library. The
+   * defining compilation unit is always first.
+   */
+  List<ResolvableCompilationUnit> _compilationUnits;
+
+  /**
+   * The library element representing this library.
+   */
+  LibraryElementImpl _libraryElement;
+
+  /**
+   * The listener to which analysis errors will be reported.
+   */
+  AnalysisErrorListener _errorListener;
+
+  /**
+   * The inheritance manager which is used for member lookups in this library.
+   */
+  InheritanceManager _inheritanceManager;
+
+  /**
+   * The library scope used when resolving elements within this library's compilation units.
+   */
+  LibraryScope _libraryScope;
+
+  /**
+   * Initialize a newly created data holder that can maintain the data associated with a library.
+   *
+   * @param librarySource the source specifying the defining compilation unit of this library
+   * @param errorListener the listener to which analysis errors will be reported
+   */
+  ResolvableLibrary(this.librarySource);
+
+  /**
+   * Return an array of the [CompilationUnit]s that make up the library. The first unit is
+   * always the defining unit.
+   *
+   * @return an array of the [CompilationUnit]s that make up the library. The first unit is
+   *         always the defining unit
+   */
+  List<CompilationUnit> get compilationUnits {
+    int count = _compilationUnits.length;
+    List<CompilationUnit> units = new List<CompilationUnit>(count);
+    for (int i = 0; i < count; i++) {
+      units[i] = _compilationUnits[i].compilationUnit;
+    }
+    return units;
+  }
+
+  /**
+   * Return an array containing the sources for the compilation units in this library, including the
+   * defining compilation unit.
+   *
+   * @return the sources for the compilation units in this library
+   */
+  List<Source> get compilationUnitSources {
+    int count = _compilationUnits.length;
+    List<Source> sources = new List<Source>(count);
+    for (int i = 0; i < count; i++) {
+      sources[i] = _compilationUnits[i].source;
+    }
+    return sources;
+  }
+
+  /**
+   * Return the AST structure associated with the defining compilation unit for this library.
+   *
+   * @return the AST structure associated with the defining compilation unit for this library
+   * @throws AnalysisException if an AST structure could not be created for the defining compilation
+   *           unit
+   */
+  CompilationUnit get definingCompilationUnit =>
+      _compilationUnits[0].compilationUnit;
+
+  /**
+   * Set the listener to which analysis errors will be reported to be the given listener.
+   *
+   * @param errorListener the listener to which analysis errors will be reported
+   */
+  void set errorListener(AnalysisErrorListener errorListener) {
+    this._errorListener = errorListener;
+  }
+
+  /**
+   * Set the libraries that are exported by this library to be those in the given array.
+   *
+   * @param exportedLibraries the libraries that are exported by this library
+   */
+  void set exportedLibraries(List<ResolvableLibrary> exportedLibraries) {
+    this._exportedLibraries = exportedLibraries;
+  }
+
+  /**
+   * Return an array containing the libraries that are exported from this library.
+   *
+   * @return an array containing the libraries that are exported from this library
+   */
+  List<ResolvableLibrary> get exports => _exportedLibraries;
+
+  @override
+  int get hashCode => _hashCode;
+
+  /**
+   * Set the libraries that are imported into this library to be those in the given array.
+   *
+   * @param importedLibraries the libraries that are imported into this library
+   */
+  void set importedLibraries(List<ResolvableLibrary> importedLibraries) {
+    this._importedLibraries = importedLibraries;
+  }
+
+  /**
+   * Return an array containing the libraries that are imported into this library.
+   *
+   * @return an array containing the libraries that are imported into this library
+   */
+  List<ResolvableLibrary> get imports => _importedLibraries;
+
+  /**
+   * Return an array containing the libraries that are either imported or exported from this
+   * library.
+   *
+   * @return the libraries that are either imported or exported from this library
+   */
+  List<ResolvableLibrary> get importsAndExports {
+    HashSet<ResolvableLibrary> libraries = new HashSet<ResolvableLibrary>();
+    for (ResolvableLibrary library in _importedLibraries) {
+      libraries.add(library);
+    }
+    for (ResolvableLibrary library in _exportedLibraries) {
+      libraries.add(library);
+    }
+    return new List.from(libraries);
+  }
+
+  /**
+   * Return the inheritance manager for this library.
+   *
+   * @return the inheritance manager for this library
+   */
+  InheritanceManager get inheritanceManager {
+    if (_inheritanceManager == null) {
+      return _inheritanceManager = new InheritanceManager(_libraryElement);
+    }
+    return _inheritanceManager;
+  }
+
+  /**
+   * Return the library element representing this library, creating it if necessary.
+   *
+   * @return the library element representing this library
+   */
+  LibraryElementImpl get libraryElement => _libraryElement;
+
+  /**
+   * Set the library element representing this library to the given library element.
+   *
+   * @param libraryElement the library element representing this library
+   */
+  void set libraryElement(LibraryElementImpl libraryElement) {
+    this._libraryElement = libraryElement;
+    if (_inheritanceManager != null) {
+      _inheritanceManager.libraryElement = libraryElement;
+    }
+  }
+
+  /**
+   * Return the library scope used when resolving elements within this library's compilation units.
+   *
+   * @return the library scope used when resolving elements within this library's compilation units
+   */
+  LibraryScope get libraryScope {
+    if (_libraryScope == null) {
+      _libraryScope = new LibraryScope(_libraryElement, _errorListener);
+    }
+    return _libraryScope;
+  }
+
+  /**
+   * Return an array containing the compilation units that comprise this library. The defining
+   * compilation unit is always first.
+   *
+   * @return the compilation units that comprise this library
+   */
+  List<ResolvableCompilationUnit> get resolvableCompilationUnits =>
+      _compilationUnits;
+
+  /**
+   * Set the compilation unit in this library to the given compilation units. The defining
+   * compilation unit must be the first element of the array.
+   *
+   * @param units the compilation units in this library
+   */
+  void set resolvableCompilationUnits(List<ResolvableCompilationUnit> units) {
+    _compilationUnits = units;
+  }
+
+  /**
+   * Return the AST structure associated with the given source, or `null` if the source does
+   * not represent a compilation unit that is included in this library.
+   *
+   * @param source the source representing the compilation unit whose AST is to be returned
+   * @return the AST structure associated with the given source
+   * @throws AnalysisException if an AST structure could not be created for the compilation unit
+   */
+  CompilationUnit getAST(Source source) {
+    int count = _compilationUnits.length;
+    for (int i = 0; i < count; i++) {
+      if (_compilationUnits[i].source == source) {
+        return _compilationUnits[i].compilationUnit;
+      }
+    }
+    return null;
+  }
+
+  @override
+  String toString() => librarySource.shortName;
+
+  static int _nextHashCode() {
+    int next = (_NEXT_HASH_CODE + 1) & 0xFFFFFF;
+    _NEXT_HASH_CODE = next;
+    return next;
+  }
+}
+
+/**
+ * The enumeration `ResolverErrorCode` defines the error codes used for errors
+ * detected by the resolver. The convention for this class is for the name of
+ * the error code to indicate the problem that caused the error to be generated
+ * and for the error message to explain what is wrong and, when appropriate, how
+ * the problem can be corrected.
+ */
+class ResolverErrorCode extends ErrorCode {
+  static const ResolverErrorCode BREAK_LABEL_ON_SWITCH_MEMBER =
+      const ResolverErrorCode('BREAK_LABEL_ON_SWITCH_MEMBER',
+          "Break label resolves to case or default statement");
+
+  static const ResolverErrorCode CONTINUE_LABEL_ON_SWITCH =
+      const ResolverErrorCode('CONTINUE_LABEL_ON_SWITCH',
+          "A continue label resolves to switch, must be loop or switch member");
+
+  static const ResolverErrorCode MISSING_LIBRARY_DIRECTIVE_WITH_PART =
+      const ResolverErrorCode('MISSING_LIBRARY_DIRECTIVE_WITH_PART',
+          "Libraries that have parts must have a library directive");
+
+  /**
+   * Initialize a newly created error code to have the given [name]. The message
+   * associated with the error will be created from the given [message]
+   * template. The correction associated with the error will be created from the
+   * given [correction] template.
+   */
+  const ResolverErrorCode(String name, String message, [String correction])
+      : super(name, message, correction);
+
+  @override
+  ErrorSeverity get errorSeverity => type.severity;
+
+  @override
+  ErrorType get type => ErrorType.COMPILE_TIME_ERROR;
+}
+
+/**
+ * Instances of the class `ResolverVisitor` are used to resolve the nodes within a single
+ * compilation unit.
+ */
+class ResolverVisitor extends ScopedVisitor {
+  /**
+   * The manager for the inheritance mappings.
+   */
+  InheritanceManager _inheritanceManager;
+
+  /**
+   * The object used to resolve the element associated with the current node.
+   */
+  ElementResolver elementResolver;
+
+  /**
+   * The object used to compute the type associated with the current node.
+   */
+  StaticTypeAnalyzer typeAnalyzer;
+
+  /**
+   * The class element representing the class containing the current node,
+   * or `null` if the current node is not contained in a class.
+   */
+  ClassElement enclosingClass = null;
+
+  /**
+   * The class declaration representing the class containing the current node, or `null` if
+   * the current node is not contained in a class.
+   */
+  ClassDeclaration _enclosingClassDeclaration = null;
+
+  /**
+   * The function type alias representing the function type containing the current node, or
+   * `null` if the current node is not contained in a function type alias.
+   */
+  FunctionTypeAlias _enclosingFunctionTypeAlias = null;
+
+  /**
+   * The element representing the function containing the current node, or `null` if the
+   * current node is not contained in a function.
+   */
+  ExecutableElement _enclosingFunction = null;
+
+  /**
+   * The [Comment] before a [FunctionDeclaration] or a [MethodDeclaration] that
+   * cannot be resolved where we visited it, because it should be resolved in the scope of the body.
+   */
+  Comment _commentBeforeFunction = null;
+
+  /**
+   * The object keeping track of which elements have had their types overridden.
+   */
+  TypeOverrideManager _overrideManager = new TypeOverrideManager();
+
+  /**
+   * The object keeping track of which elements have had their types promoted.
+   */
+  TypePromotionManager _promoteManager = new TypePromotionManager();
+
+  /**
+   * A comment before a function should be resolved in the context of the
+   * function. But when we incrementally resolve a comment, we don't want to
+   * resolve the whole function.
+   *
+   * So, this flag is set to `true`, when just context of the function should
+   * be built and the comment resolved.
+   */
+  bool resolveOnlyCommentInFunctionBody = false;
+
+  /**
+   * Initialize a newly created visitor to resolve the nodes in an AST node.
+   *
+   * [definingLibrary] is the element for the library containing the node being
+   * visited.
+   * [source] is the source representing the compilation unit containing the
+   * node being visited.
+   * [typeProvider] the object used to access the types from the core library.
+   * [errorListener] the error listener that will be informed of any errors
+   * that are found during resolution.
+   * [nameScope] is the scope used to resolve identifiers in the node that will
+   * first be visited.  If `null` or unspecified, a new [LibraryScope] will be
+   * created based on [definingLibrary] and [typeProvider].
+   * [inheritanceManager] is used to perform inheritance lookups.  If `null` or
+   * unspecified, a new [InheritanceManager] will be created based on
+   * [definingLibrary].
+   * [typeAnalyzerFactory] is used to create the type analyzer.  If `null` or
+   * unspecified, a type analyzer of type [StaticTypeAnalyzer] will be created.
+   */
+  ResolverVisitor(LibraryElement definingLibrary, Source source,
+      TypeProvider typeProvider, AnalysisErrorListener errorListener,
+      {Scope nameScope,
+      InheritanceManager inheritanceManager,
+      StaticTypeAnalyzerFactory typeAnalyzerFactory})
+      : super(definingLibrary, source, typeProvider, errorListener,
+            nameScope: nameScope) {
+    if (inheritanceManager == null) {
+      this._inheritanceManager = new InheritanceManager(definingLibrary);
+    } else {
+      this._inheritanceManager = inheritanceManager;
+    }
+    this.elementResolver = new ElementResolver(this);
+    if (typeAnalyzerFactory == null) {
+      this.typeAnalyzer = new StaticTypeAnalyzer(this);
+    } else {
+      this.typeAnalyzer = typeAnalyzerFactory(this);
+    }
+  }
+
+  /**
+   * Initialize a newly created visitor to resolve the nodes in a compilation unit.
+   *
+   * @param library the library containing the compilation unit being resolved
+   * @param source the source representing the compilation unit being visited
+   * @param typeProvider the object used to access the types from the core library
+   *
+   * Deprecated.  Please use unnamed constructor instead.
+   */
+  @deprecated
+  ResolverVisitor.con1(
+      Library library, Source source, TypeProvider typeProvider,
+      {StaticTypeAnalyzerFactory typeAnalyzerFactory})
+      : this(
+            library.libraryElement, source, typeProvider, library.errorListener,
+            nameScope: library.libraryScope,
+            inheritanceManager: library.inheritanceManager,
+            typeAnalyzerFactory: typeAnalyzerFactory);
+
+  /**
+   * Return the element representing the function containing the current node, or `null` if
+   * the current node is not contained in a function.
+   *
+   * @return the element representing the function containing the current node
+   */
+  ExecutableElement get enclosingFunction => _enclosingFunction;
+
+  /**
+   * Return the object keeping track of which elements have had their types overridden.
+   *
+   * @return the object keeping track of which elements have had their types overridden
+   */
+  TypeOverrideManager get overrideManager => _overrideManager;
+
+  /**
+   * Return the object keeping track of which elements have had their types promoted.
+   *
+   * @return the object keeping track of which elements have had their types promoted
+   */
+  TypePromotionManager get promoteManager => _promoteManager;
+
+  /**
+   * Return the propagated element associated with the given expression whose type can be
+   * overridden, or `null` if there is no element whose type can be overridden.
+   *
+   * @param expression the expression with which the element is associated
+   * @return the element associated with the given expression
+   */
+  VariableElement getOverridablePropagatedElement(Expression expression) {
+    Element element = null;
+    if (expression is SimpleIdentifier) {
+      element = expression.propagatedElement;
+    } else if (expression is PrefixedIdentifier) {
+      element = expression.propagatedElement;
+    } else if (expression is PropertyAccess) {
+      element = expression.propertyName.propagatedElement;
+    }
+    if (element is VariableElement) {
+      return element;
+    }
+    return null;
+  }
+
+  /**
+   * Return the static element associated with the given expression whose type can be overridden, or
+   * `null` if there is no element whose type can be overridden.
+   *
+   * @param expression the expression with which the element is associated
+   * @return the element associated with the given expression
+   */
+  VariableElement getOverridableStaticElement(Expression expression) {
+    Element element = null;
+    if (expression is SimpleIdentifier) {
+      element = expression.staticElement;
+    } else if (expression is PrefixedIdentifier) {
+      element = expression.staticElement;
+    } else if (expression is PropertyAccess) {
+      element = expression.propertyName.staticElement;
+    }
+    if (element is VariableElement) {
+      return element;
+    }
+    return null;
+  }
+
+  /**
+   * Return the static element associated with the given expression whose type can be promoted, or
+   * `null` if there is no element whose type can be promoted.
+   *
+   * @param expression the expression with which the element is associated
+   * @return the element associated with the given expression
+   */
+  VariableElement getPromotionStaticElement(Expression expression) {
+    while (expression is ParenthesizedExpression) {
+      expression = (expression as ParenthesizedExpression).expression;
+    }
+    if (expression is! SimpleIdentifier) {
+      return null;
+    }
+    SimpleIdentifier identifier = expression as SimpleIdentifier;
+    Element element = identifier.staticElement;
+    if (element is! VariableElement) {
+      return null;
+    }
+    ElementKind kind = element.kind;
+    if (kind == ElementKind.LOCAL_VARIABLE) {
+      return element as VariableElement;
+    }
+    if (kind == ElementKind.PARAMETER) {
+      return element as VariableElement;
+    }
+    return null;
+  }
+
+  /**
+   * Prepares this [ResolverVisitor] to using it for incremental resolution.
+   */
+  void initForIncrementalResolution() {
+    _overrideManager.enterScope();
+  }
+
+  /**
+   * If it is appropriate to do so, override the current type of the static and propagated elements
+   * associated with the given expression with the given type. Generally speaking, it is appropriate
+   * if the given type is more specific than the current type.
+   *
+   * @param expression the expression used to access the static and propagated elements whose types
+   *          might be overridden
+   * @param potentialType the potential type of the elements
+   * @param allowPrecisionLoss see @{code overrideVariable} docs
+   */
+  void overrideExpression(Expression expression, DartType potentialType,
+      bool allowPrecisionLoss, bool setExpressionType) {
+    VariableElement element = getOverridableStaticElement(expression);
+    if (element != null) {
+      DartType newBestType =
+          overrideVariable(element, potentialType, allowPrecisionLoss);
+      if (setExpressionType) {
+        recordPropagatedTypeIfBetter(expression, newBestType);
+      }
+    }
+    element = getOverridablePropagatedElement(expression);
+    if (element != null) {
+      overrideVariable(element, potentialType, allowPrecisionLoss);
+    }
+  }
+
+  /**
+   * If it is appropriate to do so, override the current type of the given element with the given
+   * type.
+   *
+   * @param element the element whose type might be overridden
+   * @param potentialType the potential type of the element
+   * @param allowPrecisionLoss true if `potentialType` is allowed to be less precise than the
+   *          current best type
+   *
+   * Return a new better [DartType], or `null` if [potentialType] is not better
+   * than the current [element] type.
+   */
+  DartType overrideVariable(VariableElement element, DartType potentialType,
+      bool allowPrecisionLoss) {
+    if (potentialType == null || potentialType.isBottom) {
+      return null;
+    }
+    DartType currentType = _overrideManager.getBestType(element);
+
+    if (potentialType == currentType) {
+      return null;
+    }
+
+    // If we aren't allowing precision loss then the third and fourth conditions
+    // check that we aren't losing precision.
+    //
+    // Let [C] be the current type and [P] be the potential type.  When we
+    // aren't allowing precision loss -- which is the case for is-checks -- we
+    // check that [! (C << P)] or  [P << C]. The second check, that [P << C], is
+    // analogous to part of the Dart Language Spec rule for type promotion under
+    // is-checks (in the analogy [T] is [P] and [S] is [C]):
+    //
+    //   An is-expression of the form [v is T] shows that [v] has type [T] iff
+    //   [T] is more specific than the type [S] of the expression [v] and both
+    //   [T != dynamic] and [S != dynamic].
+    //
+    // It also covers an important case that is not applicable in the spec:
+    // for union types, we want an is-check to promote from an union type to
+    // (a subtype of) any of its members.
+    //
+    // The first check, that [! (C << P)], covers the case where [P] and [C] are
+    // unrelated types; This case is not addressed in the spec for static types.
+    if (currentType == null ||
+        allowPrecisionLoss ||
+        !currentType.isMoreSpecificThan(potentialType) ||
+        potentialType.isMoreSpecificThan(currentType)) {
+      // TODO(scheglov) type propagation for instance/top-level fields
+      // was disabled because it depends on the order or visiting.
+      // If both field and its client are in the same unit, and we visit
+      // the client before the field, then propagated type is not set yet.
+//      if (element is PropertyInducingElement) {
+//        PropertyInducingElement variable = element;
+//        if (!variable.isConst && !variable.isFinal) {
+//          return;
+//        }
+//        (variable as PropertyInducingElementImpl).propagatedType =
+//            potentialType;
+//      }
+      _overrideManager.setType(element, potentialType);
+      return potentialType;
+    }
+    return null;
+  }
+
+  /**
+   * A client is about to resolve a member in the given class declaration.
+   */
+  void prepareToResolveMembersInClass(ClassDeclaration node) {
+    _enclosingClassDeclaration = node;
+    enclosingClass = node.element;
+    typeAnalyzer.thisType = enclosingClass == null ? null : enclosingClass.type;
+  }
+
+  /**
+   * If the given [type] is valid, strongly more specific than the
+   * existing static type of the given [expression], record it as a propagated
+   * type of the given [expression]. Otherwise, reset it to `null`.
+   *
+   * If [hasOldPropagatedType] is `true` then the existing propagated type
+   * should also is checked.
+   */
+  void recordPropagatedTypeIfBetter(Expression expression, DartType type,
+      [bool hasOldPropagatedType = false]) {
+    // Ensure that propagated type invalid.
+    if (type == null || type.isDynamic || type.isBottom) {
+      if (!hasOldPropagatedType) {
+        expression.propagatedType = null;
+      }
+      return;
+    }
+    // Ensure that propagated type is more specific than the static type.
+    DartType staticType = expression.staticType;
+    if (type == staticType || !type.isMoreSpecificThan(staticType)) {
+      expression.propagatedType = null;
+      return;
+    }
+    // Ensure that the new propagated type is more specific than the old one.
+    if (hasOldPropagatedType) {
+      DartType oldPropagatedType = expression.propagatedType;
+      if (oldPropagatedType != null &&
+          !type.isMoreSpecificThan(oldPropagatedType)) {
+        return;
+      }
+    }
+    // OK
+    expression.propagatedType = type;
+  }
+
+  @override
+  Object visitAnnotation(Annotation node) {
+    AstNode parent = node.parent;
+    if (identical(parent, _enclosingClassDeclaration) ||
+        identical(parent, _enclosingFunctionTypeAlias)) {
+      return null;
+    }
+    return super.visitAnnotation(node);
+  }
+
+  @override
+  Object visitAsExpression(AsExpression node) {
+    super.visitAsExpression(node);
+    // Since an as-statement doesn't actually change the type, we don't
+    // let it affect the propagated type when it would result in a loss
+    // of precision.
+    overrideExpression(node.expression, node.type.type, false, false);
+    return null;
+  }
+
+  @override
+  Object visitAssertStatement(AssertStatement node) {
+    super.visitAssertStatement(node);
+    _propagateTrueState(node.condition);
+    return null;
+  }
+
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    sc.TokenType operatorType = node.operator.type;
+    Expression leftOperand = node.leftOperand;
+    Expression rightOperand = node.rightOperand;
+    if (operatorType == sc.TokenType.AMPERSAND_AMPERSAND) {
+      safelyVisit(leftOperand);
+      if (rightOperand != null) {
+        _overrideManager.enterScope();
+        try {
+          _promoteManager.enterScope();
+          try {
+            _propagateTrueState(leftOperand);
+            // Type promotion.
+            _promoteTypes(leftOperand);
+            _clearTypePromotionsIfPotentiallyMutatedIn(leftOperand);
+            _clearTypePromotionsIfPotentiallyMutatedIn(rightOperand);
+            _clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(
+                rightOperand);
+            // Visit right operand.
+            rightOperand.accept(this);
+          } finally {
+            _promoteManager.exitScope();
+          }
+        } finally {
+          _overrideManager.exitScope();
+        }
+      }
+    } else if (operatorType == sc.TokenType.BAR_BAR) {
+      safelyVisit(leftOperand);
+      if (rightOperand != null) {
+        _overrideManager.enterScope();
+        try {
+          _propagateFalseState(leftOperand);
+          rightOperand.accept(this);
+        } finally {
+          _overrideManager.exitScope();
+        }
+      }
+    } else {
+      safelyVisit(leftOperand);
+      safelyVisit(rightOperand);
+    }
+    node.accept(elementResolver);
+    node.accept(typeAnalyzer);
+    return null;
+  }
+
+  @override
+  Object visitBlockFunctionBody(BlockFunctionBody node) {
+    safelyVisit(_commentBeforeFunction);
+    _overrideManager.enterScope();
+    try {
+      super.visitBlockFunctionBody(node);
+    } finally {
+      _overrideManager.exitScope();
+    }
+    return null;
+  }
+
+  @override
+  Object visitBreakStatement(BreakStatement node) {
+    //
+    // We do not visit the label because it needs to be visited in the context
+    // of the statement.
+    //
+    node.accept(elementResolver);
+    node.accept(typeAnalyzer);
+    return null;
+  }
+
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    //
+    // Resolve the metadata in the library scope.
+    //
+    if (node.metadata != null) {
+      node.metadata.accept(this);
+    }
+    _enclosingClassDeclaration = node;
+    //
+    // Continue the class resolution.
+    //
+    ClassElement outerType = enclosingClass;
+    try {
+      enclosingClass = node.element;
+      typeAnalyzer.thisType =
+          enclosingClass == null ? null : enclosingClass.type;
+      super.visitClassDeclaration(node);
+      node.accept(elementResolver);
+      node.accept(typeAnalyzer);
+    } finally {
+      typeAnalyzer.thisType = outerType == null ? null : outerType.type;
+      enclosingClass = outerType;
+      _enclosingClassDeclaration = null;
+    }
+    return null;
+  }
+
+  /**
+   * Implementation of this method should be synchronized with
+   * [visitClassDeclaration].
+   */
+  visitClassDeclarationIncrementally(ClassDeclaration node) {
+    //
+    // Resolve the metadata in the library scope.
+    //
+    if (node.metadata != null) {
+      node.metadata.accept(this);
+    }
+    _enclosingClassDeclaration = node;
+    //
+    // Continue the class resolution.
+    //
+    enclosingClass = node.element;
+    typeAnalyzer.thisType = enclosingClass == null ? null : enclosingClass.type;
+    node.accept(elementResolver);
+    node.accept(typeAnalyzer);
+  }
+
+  @override
+  Object visitComment(Comment node) {
+    if (node.parent is FunctionDeclaration ||
+        node.parent is ConstructorDeclaration ||
+        node.parent is MethodDeclaration) {
+      if (!identical(node, _commentBeforeFunction)) {
+        _commentBeforeFunction = node;
+        return null;
+      }
+    }
+    super.visitComment(node);
+    _commentBeforeFunction = null;
+    return null;
+  }
+
+  @override
+  Object visitCommentReference(CommentReference node) {
+    //
+    // We do not visit the identifier because it needs to be visited in the
+    // context of the reference.
+    //
+    node.accept(elementResolver);
+    node.accept(typeAnalyzer);
+    return null;
+  }
+
+  @override
+  Object visitCompilationUnit(CompilationUnit node) {
+    //
+    // TODO(brianwilkerson) The goal of the code below is to visit the
+    // declarations in such an order that we can infer type information for
+    // top-level variables before we visit references to them. This is better
+    // than making no effort, but still doesn't completely satisfy that goal
+    // (consider for example "final var a = b; final var b = 0;"; we'll infer a
+    // type of 'int' for 'b', but not for 'a' because of the order of the
+    // visits). Ideally we would create a dependency graph, but that would
+    // require references to be resolved, which they are not.
+    //
+    _overrideManager.enterScope();
+    try {
+      NodeList<Directive> directives = node.directives;
+      int directiveCount = directives.length;
+      for (int i = 0; i < directiveCount; i++) {
+        directives[i].accept(this);
+      }
+      NodeList<CompilationUnitMember> declarations = node.declarations;
+      int declarationCount = declarations.length;
+      for (int i = 0; i < declarationCount; i++) {
+        CompilationUnitMember declaration = declarations[i];
+        if (declaration is! ClassDeclaration) {
+          declaration.accept(this);
+        }
+      }
+      for (int i = 0; i < declarationCount; i++) {
+        CompilationUnitMember declaration = declarations[i];
+        if (declaration is ClassDeclaration) {
+          declaration.accept(this);
+        }
+      }
+    } finally {
+      _overrideManager.exitScope();
+    }
+    node.accept(elementResolver);
+    node.accept(typeAnalyzer);
+    return null;
+  }
+
+  @override
+  Object visitConditionalExpression(ConditionalExpression node) {
+    Expression condition = node.condition;
+    safelyVisit(condition);
+    Expression thenExpression = node.thenExpression;
+    if (thenExpression != null) {
+      _overrideManager.enterScope();
+      try {
+        _promoteManager.enterScope();
+        try {
+          _propagateTrueState(condition);
+          // Type promotion.
+          _promoteTypes(condition);
+          _clearTypePromotionsIfPotentiallyMutatedIn(thenExpression);
+          _clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(
+              thenExpression);
+          // Visit "then" expression.
+          thenExpression.accept(this);
+        } finally {
+          _promoteManager.exitScope();
+        }
+      } finally {
+        _overrideManager.exitScope();
+      }
+    }
+    Expression elseExpression = node.elseExpression;
+    if (elseExpression != null) {
+      _overrideManager.enterScope();
+      try {
+        _propagateFalseState(condition);
+        elseExpression.accept(this);
+      } finally {
+        _overrideManager.exitScope();
+      }
+    }
+    node.accept(elementResolver);
+    node.accept(typeAnalyzer);
+    bool thenIsAbrupt = _isAbruptTerminationExpression(thenExpression);
+    bool elseIsAbrupt = _isAbruptTerminationExpression(elseExpression);
+    if (elseIsAbrupt && !thenIsAbrupt) {
+      _propagateTrueState(condition);
+      _propagateState(thenExpression);
+    } else if (thenIsAbrupt && !elseIsAbrupt) {
+      _propagateFalseState(condition);
+      _propagateState(elseExpression);
+    }
+    return null;
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    ExecutableElement outerFunction = _enclosingFunction;
+    try {
+      _enclosingFunction = node.element;
+      super.visitConstructorDeclaration(node);
+    } finally {
+      _enclosingFunction = outerFunction;
+    }
+    ConstructorElementImpl constructor = node.element;
+    constructor.constantInitializers =
+        new ConstantAstCloner().cloneNodeList(node.initializers);
+    return null;
+  }
+
+  @override
+  Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    //
+    // We visit the expression, but do not visit the field name because it needs
+    // to be visited in the context of the constructor field initializer node.
+    //
+    safelyVisit(node.expression);
+    node.accept(elementResolver);
+    node.accept(typeAnalyzer);
+    return null;
+  }
+
+  @override
+  Object visitConstructorName(ConstructorName node) {
+    //
+    // We do not visit either the type name, because it won't be visited anyway,
+    // or the name, because it needs to be visited in the context of the
+    // constructor name.
+    //
+    node.accept(elementResolver);
+    node.accept(typeAnalyzer);
+    return null;
+  }
+
+  @override
+  Object visitContinueStatement(ContinueStatement node) {
+    //
+    // We do not visit the label because it needs to be visited in the context
+    // of the statement.
+    //
+    node.accept(elementResolver);
+    node.accept(typeAnalyzer);
+    return null;
+  }
+
+  @override
+  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+    super.visitDefaultFormalParameter(node);
+    ParameterElement element = node.element;
+    if (element.initializer != null && node.defaultValue != null) {
+      (element.initializer as FunctionElementImpl).returnType =
+          node.defaultValue.staticType;
+    }
+    FormalParameterList parent = node.parent;
+    AstNode grandparent = parent.parent;
+    if (grandparent is ConstructorDeclaration &&
+        grandparent.constKeyword != null) {
+      // For const constructors, we need to clone the ASTs for default formal
+      // parameters, so that we can use them during constant evaluation.
+      ParameterElement element = node.element;
+      (element as ConstVariableElement).constantInitializer =
+          new ConstantAstCloner().cloneNode(node.defaultValue);
+    }
+    return null;
+  }
+
+  @override
+  Object visitDoStatement(DoStatement node) {
+    _overrideManager.enterScope();
+    try {
+      super.visitDoStatement(node);
+    } finally {
+      _overrideManager.exitScope();
+    }
+    // TODO(brianwilkerson) If the loop can only be exited because the condition
+    // is false, then propagateFalseState(node.getCondition());
+    return null;
+  }
+
+  @override
+  Object visitEmptyFunctionBody(EmptyFunctionBody node) {
+    safelyVisit(_commentBeforeFunction);
+    if (resolveOnlyCommentInFunctionBody) {
+      return null;
+    }
+    return super.visitEmptyFunctionBody(node);
+  }
+
+  @override
+  Object visitEnumDeclaration(EnumDeclaration node) {
+    //
+    // Resolve the metadata in the library scope
+    // and associate the annotations with the element.
+    //
+    if (node.metadata != null) {
+      node.metadata.accept(this);
+      ElementResolver.setMetadata(node.element, node);
+    }
+    //
+    // Continue the enum resolution.
+    //
+    ClassElement outerType = enclosingClass;
+    try {
+      enclosingClass = node.element;
+      typeAnalyzer.thisType =
+          enclosingClass == null ? null : enclosingClass.type;
+      super.visitEnumDeclaration(node);
+      node.accept(elementResolver);
+      node.accept(typeAnalyzer);
+    } finally {
+      typeAnalyzer.thisType = outerType == null ? null : outerType.type;
+      enclosingClass = outerType;
+      _enclosingClassDeclaration = null;
+    }
+    return null;
+  }
+
+  @override
+  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    safelyVisit(_commentBeforeFunction);
+    if (resolveOnlyCommentInFunctionBody) {
+      return null;
+    }
+    _overrideManager.enterScope();
+    try {
+      super.visitExpressionFunctionBody(node);
+    } finally {
+      _overrideManager.exitScope();
+    }
+    return null;
+  }
+
+  @override
+  Object visitFieldDeclaration(FieldDeclaration node) {
+    _overrideManager.enterScope();
+    try {
+      super.visitFieldDeclaration(node);
+    } finally {
+      Map<VariableElement, DartType> overrides =
+          _overrideManager.captureOverrides(node.fields);
+      _overrideManager.exitScope();
+      _overrideManager.applyOverrides(overrides);
+    }
+    return null;
+  }
+
+  @override
+  Object visitForEachStatement(ForEachStatement node) {
+    _overrideManager.enterScope();
+    try {
+      super.visitForEachStatement(node);
+    } finally {
+      _overrideManager.exitScope();
+    }
+    return null;
+  }
+
+  @override
+  void visitForEachStatementInScope(ForEachStatement node) {
+    //
+    // We visit the iterator before the loop variable because the loop variable
+    // cannot be in scope while visiting the iterator.
+    //
+    Expression iterable = node.iterable;
+    safelyVisit(iterable);
+    DeclaredIdentifier loopVariable = node.loopVariable;
+    SimpleIdentifier identifier = node.identifier;
+    safelyVisit(loopVariable);
+    safelyVisit(identifier);
+    Statement body = node.body;
+    if (body != null) {
+      _overrideManager.enterScope();
+      try {
+        if (loopVariable != null && iterable != null) {
+          LocalVariableElement loopElement = loopVariable.element;
+          if (loopElement != null) {
+            DartType propagatedType = null;
+            if (node.awaitKeyword == null) {
+              propagatedType = _getIteratorElementType(iterable);
+            } else {
+              propagatedType = _getStreamElementType(iterable);
+            }
+            if (propagatedType != null) {
+              overrideVariable(loopElement, propagatedType, true);
+              _recordPropagatedType(loopVariable.identifier, propagatedType);
+            }
+          }
+        } else if (identifier != null && iterable != null) {
+          Element identifierElement = identifier.staticElement;
+          if (identifierElement is VariableElement) {
+            DartType iteratorElementType = _getIteratorElementType(iterable);
+            overrideVariable(identifierElement, iteratorElementType, true);
+            _recordPropagatedType(identifier, iteratorElementType);
+          }
+        }
+        visitStatementInScope(body);
+      } finally {
+        _overrideManager.exitScope();
+      }
+    }
+    node.accept(elementResolver);
+    node.accept(typeAnalyzer);
+  }
+
+  @override
+  Object visitForStatement(ForStatement node) {
+    _overrideManager.enterScope();
+    try {
+      super.visitForStatement(node);
+    } finally {
+      _overrideManager.exitScope();
+    }
+    return null;
+  }
+
+  @override
+  void visitForStatementInScope(ForStatement node) {
+    safelyVisit(node.variables);
+    safelyVisit(node.initialization);
+    safelyVisit(node.condition);
+    _overrideManager.enterScope();
+    try {
+      _propagateTrueState(node.condition);
+      visitStatementInScope(node.body);
+      node.updaters.accept(this);
+    } finally {
+      _overrideManager.exitScope();
+    }
+    // TODO(brianwilkerson) If the loop can only be exited because the condition
+    // is false, then propagateFalseState(condition);
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    ExecutableElement outerFunction = _enclosingFunction;
+    try {
+      SimpleIdentifier functionName = node.name;
+      _enclosingFunction = functionName.staticElement as ExecutableElement;
+      super.visitFunctionDeclaration(node);
+    } finally {
+      _enclosingFunction = outerFunction;
+    }
+    return null;
+  }
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    ExecutableElement outerFunction = _enclosingFunction;
+    try {
+      _enclosingFunction = node.element;
+      _overrideManager.enterScope();
+      try {
+        super.visitFunctionExpression(node);
+      } finally {
+        _overrideManager.exitScope();
+      }
+    } finally {
+      _enclosingFunction = outerFunction;
+    }
+    return null;
+  }
+
+  @override
+  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    safelyVisit(node.function);
+    node.accept(elementResolver);
+    _inferFunctionExpressionsParametersTypes(node.argumentList);
+    safelyVisit(node.argumentList);
+    node.accept(typeAnalyzer);
+    return null;
+  }
+
+  @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    // Resolve the metadata in the library scope.
+    if (node.metadata != null) {
+      node.metadata.accept(this);
+    }
+    FunctionTypeAlias outerAlias = _enclosingFunctionTypeAlias;
+    _enclosingFunctionTypeAlias = node;
+    try {
+      super.visitFunctionTypeAlias(node);
+    } finally {
+      _enclosingFunctionTypeAlias = outerAlias;
+    }
+    return null;
+  }
+
+  @override
+  Object visitHideCombinator(HideCombinator node) => null;
+
+  @override
+  Object visitIfStatement(IfStatement node) {
+    Expression condition = node.condition;
+    safelyVisit(condition);
+    Map<VariableElement, DartType> thenOverrides =
+        new HashMap<VariableElement, DartType>();
+    Statement thenStatement = node.thenStatement;
+    if (thenStatement != null) {
+      _overrideManager.enterScope();
+      try {
+        _promoteManager.enterScope();
+        try {
+          _propagateTrueState(condition);
+          // Type promotion.
+          _promoteTypes(condition);
+          _clearTypePromotionsIfPotentiallyMutatedIn(thenStatement);
+          _clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(
+              thenStatement);
+          // Visit "then".
+          visitStatementInScope(thenStatement);
+        } finally {
+          _promoteManager.exitScope();
+        }
+      } finally {
+        thenOverrides = _overrideManager.captureLocalOverrides();
+        _overrideManager.exitScope();
+      }
+    }
+    Map<VariableElement, DartType> elseOverrides =
+        new HashMap<VariableElement, DartType>();
+    Statement elseStatement = node.elseStatement;
+    if (elseStatement != null) {
+      _overrideManager.enterScope();
+      try {
+        _propagateFalseState(condition);
+        visitStatementInScope(elseStatement);
+      } finally {
+        elseOverrides = _overrideManager.captureLocalOverrides();
+        _overrideManager.exitScope();
+      }
+    }
+    node.accept(elementResolver);
+    node.accept(typeAnalyzer);
+    // Join overrides.
+    bool thenIsAbrupt = _isAbruptTerminationStatement(thenStatement);
+    bool elseIsAbrupt = _isAbruptTerminationStatement(elseStatement);
+    if (elseIsAbrupt && !thenIsAbrupt) {
+      _propagateTrueState(condition);
+      _overrideManager.applyOverrides(thenOverrides);
+    } else if (thenIsAbrupt && !elseIsAbrupt) {
+      _propagateFalseState(condition);
+      _overrideManager.applyOverrides(elseOverrides);
+    } else if (!thenIsAbrupt && !elseIsAbrupt) {
+      List<Map<VariableElement, DartType>> perBranchOverrides =
+          new List<Map<VariableElement, DartType>>();
+      perBranchOverrides.add(thenOverrides);
+      perBranchOverrides.add(elseOverrides);
+      _overrideManager.mergeOverrides(perBranchOverrides);
+    }
+    return null;
+  }
+
+  @override
+  Object visitLabel(Label node) => null;
+
+  @override
+  Object visitLibraryIdentifier(LibraryIdentifier node) => null;
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    ExecutableElement outerFunction = _enclosingFunction;
+    try {
+      _enclosingFunction = node.element;
+      super.visitMethodDeclaration(node);
+    } finally {
+      _enclosingFunction = outerFunction;
+    }
+    return null;
+  }
+
+  @override
+  Object visitMethodInvocation(MethodInvocation node) {
+    //
+    // We visit the target and argument list, but do not visit the method name
+    // because it needs to be visited in the context of the invocation.
+    //
+    safelyVisit(node.target);
+    node.accept(elementResolver);
+    _inferFunctionExpressionsParametersTypes(node.argumentList);
+    safelyVisit(node.argumentList);
+    node.accept(typeAnalyzer);
+    return null;
+  }
+
+  @override
+  Object visitNode(AstNode node) {
+    node.visitChildren(this);
+    node.accept(elementResolver);
+    node.accept(typeAnalyzer);
+    return null;
+  }
+
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    //
+    // We visit the prefix, but do not visit the identifier because it needs to
+    // be visited in the context of the prefix.
+    //
+    safelyVisit(node.prefix);
+    node.accept(elementResolver);
+    node.accept(typeAnalyzer);
+    return null;
+  }
+
+  @override
+  Object visitPropertyAccess(PropertyAccess node) {
+    //
+    // We visit the target, but do not visit the property name because it needs
+    // to be visited in the context of the property access node.
+    //
+    safelyVisit(node.target);
+    node.accept(elementResolver);
+    node.accept(typeAnalyzer);
+    return null;
+  }
+
+  @override
+  Object visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    //
+    // We visit the argument list, but do not visit the optional identifier
+    // because it needs to be visited in the context of the constructor
+    // invocation.
+    //
+    safelyVisit(node.argumentList);
+    node.accept(elementResolver);
+    node.accept(typeAnalyzer);
+    return null;
+  }
+
+  @override
+  Object visitShowCombinator(ShowCombinator node) => null;
+
+  @override
+  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    //
+    // We visit the argument list, but do not visit the optional identifier
+    // because it needs to be visited in the context of the constructor
+    // invocation.
+    //
+    safelyVisit(node.argumentList);
+    node.accept(elementResolver);
+    node.accept(typeAnalyzer);
+    return null;
+  }
+
+  @override
+  Object visitSwitchCase(SwitchCase node) {
+    _overrideManager.enterScope();
+    try {
+      super.visitSwitchCase(node);
+    } finally {
+      _overrideManager.exitScope();
+    }
+    return null;
+  }
+
+  @override
+  Object visitSwitchDefault(SwitchDefault node) {
+    _overrideManager.enterScope();
+    try {
+      super.visitSwitchDefault(node);
+    } finally {
+      _overrideManager.exitScope();
+    }
+    return null;
+  }
+
+  @override
+  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    _overrideManager.enterScope();
+    try {
+      super.visitTopLevelVariableDeclaration(node);
+    } finally {
+      Map<VariableElement, DartType> overrides =
+          _overrideManager.captureOverrides(node.variables);
+      _overrideManager.exitScope();
+      _overrideManager.applyOverrides(overrides);
+    }
+    return null;
+  }
+
+  @override
+  Object visitTypeName(TypeName node) => null;
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    super.visitVariableDeclaration(node);
+    VariableElement element = node.element;
+    if (element.initializer != null && node.initializer != null) {
+      (element.initializer as FunctionElementImpl).returnType =
+          node.initializer.staticType;
+    }
+    // Note: in addition to cloning the initializers for const variables, we
+    // have to clone the initializers for non-static final fields (because if
+    // they occur in a class with a const constructor, they will be needed to
+    // evaluate the const constructor).
+    if ((element.isConst ||
+            (element is FieldElement &&
+                element.isFinal &&
+                !element.isStatic)) &&
+        node.initializer != null) {
+      (element as ConstVariableElement).constantInitializer =
+          new ConstantAstCloner().cloneNode(node.initializer);
+    }
+    return null;
+  }
+
+  @override
+  Object visitWhileStatement(WhileStatement node) {
+    // Note: since we don't call the base class, we have to maintain
+    // _implicitLabelScope ourselves.
+    ImplicitLabelScope outerImplicitScope = _implicitLabelScope;
+    try {
+      _implicitLabelScope = _implicitLabelScope.nest(node);
+      Expression condition = node.condition;
+      safelyVisit(condition);
+      Statement body = node.body;
+      if (body != null) {
+        _overrideManager.enterScope();
+        try {
+          _propagateTrueState(condition);
+          visitStatementInScope(body);
+        } finally {
+          _overrideManager.exitScope();
+        }
+      }
+    } finally {
+      _implicitLabelScope = outerImplicitScope;
+    }
+    // TODO(brianwilkerson) If the loop can only be exited because the condition
+    // is false, then propagateFalseState(condition);
+    node.accept(elementResolver);
+    node.accept(typeAnalyzer);
+    return null;
+  }
+
+  /**
+   * Checks each promoted variable in the current scope for compliance with the following
+   * specification statement:
+   *
+   * If the variable <i>v</i> is accessed by a closure in <i>s<sub>1</sub></i> then the variable
+   * <i>v</i> is not potentially mutated anywhere in the scope of <i>v</i>.
+   */
+  void _clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(
+      AstNode target) {
+    for (Element element in _promoteManager.promotedElements) {
+      if ((element as VariableElementImpl).isPotentiallyMutatedInScope) {
+        if (_isVariableAccessedInClosure(element, target)) {
+          _promoteManager.setType(element, null);
+        }
+      }
+    }
+  }
+
+  /**
+   * Checks each promoted variable in the current scope for compliance with the following
+   * specification statement:
+   *
+   * <i>v</i> is not potentially mutated in <i>s<sub>1</sub></i> or within a closure.
+   */
+  void _clearTypePromotionsIfPotentiallyMutatedIn(AstNode target) {
+    for (Element element in _promoteManager.promotedElements) {
+      if (_isVariablePotentiallyMutatedIn(element, target)) {
+        _promoteManager.setType(element, null);
+      }
+    }
+  }
+
+  /**
+   * The given expression is the expression used to compute the iterator for a
+   * for-each statement. Attempt to compute the type of objects that will be
+   * assigned to the loop variable and return that type. Return `null` if the
+   * type could not be determined. The [iteratorExpression] is the expression
+   * that will return the Iterable being iterated over.
+   */
+  DartType _getIteratorElementType(Expression iteratorExpression) {
+    DartType expressionType = iteratorExpression.bestType;
+    if (expressionType is InterfaceType) {
+      InterfaceType interfaceType = expressionType;
+      FunctionType iteratorFunction =
+          _inheritanceManager.lookupMemberType(interfaceType, "iterator");
+      if (iteratorFunction == null) {
+        // TODO(brianwilkerson) Should we report this error?
+        return null;
+      }
+      DartType iteratorType = iteratorFunction.returnType;
+      if (iteratorType is InterfaceType) {
+        InterfaceType iteratorInterfaceType = iteratorType;
+        FunctionType currentFunction = _inheritanceManager.lookupMemberType(
+            iteratorInterfaceType, "current");
+        if (currentFunction == null) {
+          // TODO(brianwilkerson) Should we report this error?
+          return null;
+        }
+        return currentFunction.returnType;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * The given expression is the expression used to compute the stream for an
+   * asyncronous for-each statement. Attempt to compute the type of objects that
+   * will be assigned to the loop variable and return that type. Return `null`
+   * if the type could not be determined. The [streamExpression] is the
+   * expression that will return the stream being iterated over.
+   */
+  DartType _getStreamElementType(Expression streamExpression) {
+    DartType streamType = streamExpression.bestType;
+    if (streamType is InterfaceType) {
+      FunctionType listenFunction =
+          _inheritanceManager.lookupMemberType(streamType, "listen");
+      if (listenFunction == null) {
+        return null;
+      }
+      List<ParameterElement> listenParameters = listenFunction.parameters;
+      if (listenParameters == null || listenParameters.length < 1) {
+        return null;
+      }
+      DartType onDataType = listenParameters[0].type;
+      if (onDataType is FunctionType) {
+        List<ParameterElement> onDataParameters = onDataType.parameters;
+        if (onDataParameters == null || onDataParameters.length < 1) {
+          return null;
+        }
+        DartType eventType = onDataParameters[0].type;
+        // TODO(paulberry): checking that typeParameters.isNotEmpty is a
+        // band-aid fix for dartbug.com/24191.  Figure out what the correct
+        // logic should be.
+        if (streamType.typeParameters.isNotEmpty &&
+            eventType.element == streamType.typeParameters[0]) {
+          return streamType.typeArguments[0];
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * If given "mayBeClosure" is [FunctionExpression] without explicit parameters types and its
+   * required type is [FunctionType], then infer parameters types from [FunctionType].
+   */
+  void _inferFunctionExpressionParametersTypes(
+      Expression mayBeClosure, DartType mayByFunctionType) {
+    // prepare closure
+    if (mayBeClosure is! FunctionExpression) {
+      return;
+    }
+    FunctionExpression closure = mayBeClosure as FunctionExpression;
+    // prepare expected closure type
+    if (mayByFunctionType is! FunctionType) {
+      return;
+    }
+    FunctionType expectedClosureType = mayByFunctionType as FunctionType;
+    // If the expectedClosureType is not more specific than the static type,
+    // return.
+    DartType staticClosureType =
+        closure.element != null ? closure.element.type : null;
+    if (staticClosureType != null &&
+        !expectedClosureType.isMoreSpecificThan(staticClosureType)) {
+      return;
+    }
+    // set propagated type for the closure
+    closure.propagatedType = expectedClosureType;
+    // set inferred types for parameters
+    NodeList<FormalParameter> parameters = closure.parameters.parameters;
+    List<ParameterElement> expectedParameters = expectedClosureType.parameters;
+    for (int i = 0;
+        i < parameters.length && i < expectedParameters.length;
+        i++) {
+      FormalParameter parameter = parameters[i];
+      ParameterElement element = parameter.element;
+      DartType currentType = _overrideManager.getBestType(element);
+      // may be override the type
+      DartType expectedType = expectedParameters[i].type;
+      if (currentType == null || expectedType.isMoreSpecificThan(currentType)) {
+        _overrideManager.setType(element, expectedType);
+      }
+    }
+  }
+
+  /**
+   * Try to infer types of parameters of the [FunctionExpression] arguments.
+   */
+  void _inferFunctionExpressionsParametersTypes(ArgumentList argumentList) {
+    for (Expression argument in argumentList.arguments) {
+      ParameterElement parameter = argument.propagatedParameterElement;
+      if (parameter == null) {
+        parameter = argument.staticParameterElement;
+      }
+      if (parameter != null) {
+        _inferFunctionExpressionParametersTypes(argument, parameter.type);
+      }
+    }
+  }
+
+  /**
+   * Return `true` if the given expression terminates abruptly (that is, if any expression
+   * following the given expression will not be reached).
+   *
+   * @param expression the expression being tested
+   * @return `true` if the given expression terminates abruptly
+   */
+  bool _isAbruptTerminationExpression(Expression expression) {
+    // TODO(brianwilkerson) This needs to be significantly improved. Ideally we
+    // would eventually turn this into a method on Expression that returns a
+    // termination indication (normal, abrupt with no exception, abrupt with an
+    // exception).
+    while (expression is ParenthesizedExpression) {
+      expression = (expression as ParenthesizedExpression).expression;
+    }
+    return expression is ThrowExpression || expression is RethrowExpression;
+  }
+
+  /**
+   * Return `true` if the given statement terminates abruptly (that is, if any statement
+   * following the given statement will not be reached).
+   *
+   * @param statement the statement being tested
+   * @return `true` if the given statement terminates abruptly
+   */
+  bool _isAbruptTerminationStatement(Statement statement) {
+    // TODO(brianwilkerson) This needs to be significantly improved. Ideally we
+    // would eventually turn this into a method on Statement that returns a
+    // termination indication (normal, abrupt with no exception, abrupt with an
+    // exception).
+    //
+    // collinsn: it is unsound to assume that [break] and [continue] are
+    // "abrupt". See: https://code.google.com/p/dart/issues/detail?id=19929#c4
+    // (tests are included in TypePropagationTest.java).
+    // In general, the difficulty is loopy control flow.
+    //
+    // In the presence of exceptions things become much more complicated, but
+    // while we only use this to propagate at [if]-statement join points,
+    // checking for [return] may work well enough in the common case.
+    if (statement is ReturnStatement) {
+      return true;
+    } else if (statement is ExpressionStatement) {
+      return _isAbruptTerminationExpression(statement.expression);
+    } else if (statement is Block) {
+      NodeList<Statement> statements = statement.statements;
+      int size = statements.length;
+      if (size == 0) {
+        return false;
+      }
+
+      // This last-statement-is-return heuristic is unsound for adversarial
+      // code, but probably works well in the common case:
+      //
+      //   var x = 123;
+      //   var c = true;
+      //   L: if (c) {
+      //     x = "hello";
+      //     c = false;
+      //     break L;
+      //     return;
+      //   }
+      //   print(x);
+      //
+      // Unsound to assume that [x = "hello";] never executed after the
+      // if-statement. Of course, a dead-code analysis could point out that
+      // [return] here is dead.
+      return _isAbruptTerminationStatement(statements[size - 1]);
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given variable is accessed within a closure in the given
+   * [AstNode] and also mutated somewhere in variable scope. This information is only
+   * available for local variables (including parameters).
+   *
+   * @param variable the variable to check
+   * @param target the [AstNode] to check within
+   * @return `true` if this variable is potentially mutated somewhere in the given ASTNode
+   */
+  bool _isVariableAccessedInClosure(Element variable, AstNode target) {
+    _ResolverVisitor_isVariableAccessedInClosure visitor =
+        new _ResolverVisitor_isVariableAccessedInClosure(variable);
+    target.accept(visitor);
+    return visitor.result;
+  }
+
+  /**
+   * Return `true` if the given variable is potentially mutated somewhere in the given
+   * [AstNode]. This information is only available for local variables (including parameters).
+   *
+   * @param variable the variable to check
+   * @param target the [AstNode] to check within
+   * @return `true` if this variable is potentially mutated somewhere in the given ASTNode
+   */
+  bool _isVariablePotentiallyMutatedIn(Element variable, AstNode target) {
+    _ResolverVisitor_isVariablePotentiallyMutatedIn visitor =
+        new _ResolverVisitor_isVariablePotentiallyMutatedIn(variable);
+    target.accept(visitor);
+    return visitor.result;
+  }
+
+  /**
+   * If it is appropriate to do so, promotes the current type of the static element associated with
+   * the given expression with the given type. Generally speaking, it is appropriate if the given
+   * type is more specific than the current type.
+   *
+   * @param expression the expression used to access the static element whose types might be
+   *          promoted
+   * @param potentialType the potential type of the elements
+   */
+  void _promote(Expression expression, DartType potentialType) {
+    VariableElement element = getPromotionStaticElement(expression);
+    if (element != null) {
+      // may be mutated somewhere in closure
+      if (element.isPotentiallyMutatedInClosure) {
+        return;
+      }
+      // prepare current variable type
+      DartType type = _promoteManager.getType(element);
+      if (type == null) {
+        type = expression.staticType;
+      }
+      // Declared type should not be "dynamic".
+      if (type == null || type.isDynamic) {
+        return;
+      }
+      // Promoted type should not be "dynamic".
+      if (potentialType == null || potentialType.isDynamic) {
+        return;
+      }
+      // Promoted type should be more specific than declared.
+      if (!potentialType.isMoreSpecificThan(type)) {
+        return;
+      }
+      // Do promote type of variable.
+      _promoteManager.setType(element, potentialType);
+    }
+  }
+
+  /**
+   * Promotes type information using given condition.
+   */
+  void _promoteTypes(Expression condition) {
+    if (condition is BinaryExpression) {
+      BinaryExpression binary = condition;
+      if (binary.operator.type == sc.TokenType.AMPERSAND_AMPERSAND) {
+        Expression left = binary.leftOperand;
+        Expression right = binary.rightOperand;
+        _promoteTypes(left);
+        _promoteTypes(right);
+        _clearTypePromotionsIfPotentiallyMutatedIn(right);
+      }
+    } else if (condition is IsExpression) {
+      IsExpression is2 = condition;
+      if (is2.notOperator == null) {
+        _promote(is2.expression, is2.type.type);
+      }
+    } else if (condition is ParenthesizedExpression) {
+      _promoteTypes(condition.expression);
+    }
+  }
+
+  /**
+   * Propagate any type information that results from knowing that the given condition will have
+   * been evaluated to 'false'.
+   *
+   * @param condition the condition that will have evaluated to 'false'
+   */
+  void _propagateFalseState(Expression condition) {
+    if (condition is BinaryExpression) {
+      BinaryExpression binary = condition;
+      if (binary.operator.type == sc.TokenType.BAR_BAR) {
+        _propagateFalseState(binary.leftOperand);
+        _propagateFalseState(binary.rightOperand);
+      }
+    } else if (condition is IsExpression) {
+      IsExpression is2 = condition;
+      if (is2.notOperator != null) {
+        // Since an is-statement doesn't actually change the type, we don't
+        // let it affect the propagated type when it would result in a loss
+        // of precision.
+        overrideExpression(is2.expression, is2.type.type, false, false);
+      }
+    } else if (condition is PrefixExpression) {
+      PrefixExpression prefix = condition;
+      if (prefix.operator.type == sc.TokenType.BANG) {
+        _propagateTrueState(prefix.operand);
+      }
+    } else if (condition is ParenthesizedExpression) {
+      _propagateFalseState(condition.expression);
+    }
+  }
+
+  /**
+   * Propagate any type information that results from knowing that the given expression will have
+   * been evaluated without altering the flow of execution.
+   *
+   * @param expression the expression that will have been evaluated
+   */
+  void _propagateState(Expression expression) {
+    // TODO(brianwilkerson) Implement this.
+  }
+
+  /**
+   * Propagate any type information that results from knowing that the given condition will have
+   * been evaluated to 'true'.
+   *
+   * @param condition the condition that will have evaluated to 'true'
+   */
+  void _propagateTrueState(Expression condition) {
+    if (condition is BinaryExpression) {
+      BinaryExpression binary = condition;
+      if (binary.operator.type == sc.TokenType.AMPERSAND_AMPERSAND) {
+        _propagateTrueState(binary.leftOperand);
+        _propagateTrueState(binary.rightOperand);
+      }
+    } else if (condition is IsExpression) {
+      IsExpression is2 = condition;
+      if (is2.notOperator == null) {
+        // Since an is-statement doesn't actually change the type, we don't
+        // let it affect the propagated type when it would result in a loss
+        // of precision.
+        overrideExpression(is2.expression, is2.type.type, false, false);
+      }
+    } else if (condition is PrefixExpression) {
+      PrefixExpression prefix = condition;
+      if (prefix.operator.type == sc.TokenType.BANG) {
+        _propagateFalseState(prefix.operand);
+      }
+    } else if (condition is ParenthesizedExpression) {
+      _propagateTrueState(condition.expression);
+    }
+  }
+
+  /**
+   * Record that the propagated type of the given node is the given type.
+   *
+   * @param expression the node whose type is to be recorded
+   * @param type the propagated type of the node
+   */
+  void _recordPropagatedType(Expression expression, DartType type) {
+    if (type != null && !type.isDynamic) {
+      expression.propagatedType = type;
+    }
+  }
+}
+
+/**
+ * The abstract class `Scope` defines the behavior common to name scopes used by the resolver
+ * to determine which names are visible at any given point in the code.
+ */
+abstract class Scope {
+  /**
+   * The prefix used to mark an identifier as being private to its library.
+   */
+  static int PRIVATE_NAME_PREFIX = 0x5F;
+
+  /**
+   * The suffix added to the declared name of a setter when looking up the setter. Used to
+   * disambiguate between a getter and a setter that have the same name.
+   */
+  static String SETTER_SUFFIX = "=";
+
+  /**
+   * The name used to look up the method used to implement the unary minus operator. Used to
+   * disambiguate between the unary and binary operators.
+   */
+  static String UNARY_MINUS = "unary-";
+
+  /**
+   * A table mapping names that are defined in this scope to the element representing the thing
+   * declared with that name.
+   */
+  HashMap<String, Element> _definedNames = new HashMap<String, Element>();
+
+  /**
+   * A flag indicating whether there are any names defined in this scope.
+   */
+  bool _hasName = false;
+
+  /**
+   * Return the scope in which this scope is lexically enclosed.
+   *
+   * @return the scope in which this scope is lexically enclosed
+   */
+  Scope get enclosingScope => null;
+
+  /**
+   * Return the listener that is to be informed when an error is encountered.
+   *
+   * @return the listener that is to be informed when an error is encountered
+   */
+  AnalysisErrorListener get errorListener;
+
+  /**
+   * Add the given element to this scope. If there is already an element with the given name defined
+   * in this scope, then an error will be generated and the original element will continue to be
+   * mapped to the name. If there is an element with the given name in an enclosing scope, then a
+   * warning will be generated but the given element will hide the inherited element.
+   *
+   * @param element the element to be added to this scope
+   */
+  void define(Element element) {
+    String name = _getName(element);
+    if (name != null && !name.isEmpty) {
+      if (_definedNames.containsKey(name)) {
+        errorListener
+            .onError(getErrorForDuplicate(_definedNames[name], element));
+      } else {
+        _definedNames[name] = element;
+        _hasName = true;
+      }
+    }
+  }
+
+  /**
+   * Add the given element to this scope without checking for duplication or hiding.
+   *
+   * @param name the name of the element to be added
+   * @param element the element to be added to this scope
+   */
+  void defineNameWithoutChecking(String name, Element element) {
+    _definedNames[name] = element;
+    _hasName = true;
+  }
+
+  /**
+   * Add the given element to this scope without checking for duplication or hiding.
+   *
+   * @param element the element to be added to this scope
+   */
+  void defineWithoutChecking(Element element) {
+    _definedNames[_getName(element)] = element;
+    _hasName = true;
+  }
+
+  /**
+   * Return the error code to be used when reporting that a name being defined locally conflicts
+   * with another element of the same name in the local scope.
+   *
+   * @param existing the first element to be declared with the conflicting name
+   * @param duplicate another element declared with the conflicting name
+   * @return the error code used to report duplicate names within a scope
+   */
+  AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
+    // TODO(brianwilkerson) Customize the error message based on the types of
+    // elements that share the same name.
+    // TODO(jwren) There are 4 error codes for duplicate, but only 1 is being
+    // generated.
+    Source source = duplicate.source;
+    return new AnalysisError(
+        source,
+        duplicate.nameOffset,
+        duplicate.displayName.length,
+        CompileTimeErrorCode.DUPLICATE_DEFINITION,
+        [existing.displayName]);
+  }
+
+  /**
+   * Return the source that contains the given identifier, or the source associated with this scope
+   * if the source containing the identifier could not be determined.
+   *
+   * @param identifier the identifier whose source is to be returned
+   * @return the source that contains the given identifier
+   */
+  Source getSource(AstNode node) {
+    CompilationUnit unit = node.getAncestor((node) => node is CompilationUnit);
+    if (unit != null) {
+      CompilationUnitElement unitElement = unit.element;
+      if (unitElement != null) {
+        return unitElement.source;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the element with which the given name is associated, or `null` if the name is not
+   * defined within this scope.
+   *
+   * @param identifier the identifier node to lookup element for, used to report correct kind of a
+   *          problem and associate problem with
+   * @param name the name associated with the element to be returned
+   * @param referencingLibrary the library that contains the reference to the name, used to
+   *          implement library-level privacy
+   * @return the element with which the given name is associated
+   */
+  Element internalLookup(
+      Identifier identifier, String name, LibraryElement referencingLibrary);
+
+  /**
+   * Return the element with which the given name is associated, or `null` if the name is not
+   * defined within this scope. This method only returns elements that are directly defined within
+   * this scope, not elements that are defined in an enclosing scope.
+   *
+   * @param name the name associated with the element to be returned
+   * @param referencingLibrary the library that contains the reference to the name, used to
+   *          implement library-level privacy
+   * @return the element with which the given name is associated
+   */
+  Element localLookup(String name, LibraryElement referencingLibrary) {
+    if (_hasName) {
+      return _definedNames[name];
+    }
+    return null;
+  }
+
+  /**
+   * Return the element with which the given identifier is associated, or `null` if the name
+   * is not defined within this scope.
+   *
+   * @param identifier the identifier associated with the element to be returned
+   * @param referencingLibrary the library that contains the reference to the name, used to
+   *          implement library-level privacy
+   * @return the element with which the given identifier is associated
+   */
+  Element lookup(Identifier identifier, LibraryElement referencingLibrary) =>
+      internalLookup(identifier, identifier.name, referencingLibrary);
+
+  /**
+   * Return the name that will be used to look up the given element.
+   *
+   * @param element the element whose look-up name is to be returned
+   * @return the name that will be used to look up the given element
+   */
+  String _getName(Element element) {
+    if (element is MethodElement) {
+      MethodElement method = element;
+      if (method.name == "-" && method.parameters.length == 0) {
+        return UNARY_MINUS;
+      }
+    }
+    return element.name;
+  }
+
+  /**
+   * Return `true` if the given name is a library-private name.
+   *
+   * @param name the name being tested
+   * @return `true` if the given name is a library-private name
+   */
+  static bool isPrivateName(String name) =>
+      name != null && StringUtilities.startsWithChar(name, PRIVATE_NAME_PREFIX);
+}
+
+/**
+ * The abstract class `ScopedVisitor` maintains name and label scopes as an AST structure is
+ * being visited.
+ */
+abstract class ScopedVisitor extends UnifyingAstVisitor<Object> {
+  /**
+   * The element for the library containing the compilation unit being visited.
+   */
+  final LibraryElement definingLibrary;
+
+  /**
+   * The source representing the compilation unit being visited.
+   */
+  final Source source;
+
+  /**
+   * The error listener that will be informed of any errors that are found during resolution.
+   */
+  final AnalysisErrorListener errorListener;
+
+  /**
+   * The scope used to resolve identifiers.
+   */
+  Scope nameScope;
+
+  /**
+   * The object used to access the types from the core library.
+   */
+  final TypeProvider typeProvider;
+
+  /**
+   * The scope used to resolve unlabeled `break` and `continue` statements.
+   */
+  ImplicitLabelScope _implicitLabelScope = ImplicitLabelScope.ROOT;
+
+  /**
+   * The scope used to resolve labels for `break` and `continue` statements, or
+   * `null` if no labels have been defined in the current context.
+   */
+  LabelScope labelScope;
+
+  /**
+   * The class containing the AST nodes being visited,
+   * or `null` if we are not in the scope of a class.
+   */
+  ClassElement enclosingClass;
+
+  /**
+   * Initialize a newly created visitor to resolve the nodes in a compilation
+   * unit.
+   *
+   * [definingLibrary] is the element for the library containing the
+   * compilation unit being visited.
+   * [source] is the source representing the compilation unit being visited.
+   * [typeProvider] is the object used to access the types from the core
+   * library.
+   * [errorListener] is the error listener that will be informed of any errors
+   * that are found during resolution.
+   * [nameScope] is the scope used to resolve identifiers in the node that will
+   * first be visited.  If `null` or unspecified, a new [LibraryScope] will be
+   * created based on [definingLibrary] and [typeProvider].
+   */
+  ScopedVisitor(
+      this.definingLibrary, this.source, this.typeProvider, this.errorListener,
+      {Scope nameScope}) {
+    if (nameScope == null) {
+      this.nameScope = new LibraryScope(definingLibrary, errorListener);
+    } else {
+      this.nameScope = nameScope;
+    }
+  }
+
+  /**
+   * Return the implicit label scope in which the current node is being
+   * resolved.
+   */
+  ImplicitLabelScope get implicitLabelScope => _implicitLabelScope;
+
+  /**
+   * Replaces the current [Scope] with the enclosing [Scope].
+   *
+   * @return the enclosing [Scope].
+   */
+  Scope popNameScope() {
+    nameScope = nameScope.enclosingScope;
+    return nameScope;
+  }
+
+  /**
+   * Pushes a new [Scope] into the visitor.
+   *
+   * @return the new [Scope].
+   */
+  Scope pushNameScope() {
+    Scope newScope = new EnclosedScope(nameScope);
+    nameScope = newScope;
+    return nameScope;
+  }
+
+  /**
+   * Report an error with the given error code and arguments.
+   *
+   * @param errorCode the error code of the error to be reported
+   * @param node the node specifying the location of the error
+   * @param arguments the arguments to the error, used to compose the error message
+   */
+  void reportErrorForNode(ErrorCode errorCode, AstNode node,
+      [List<Object> arguments]) {
+    errorListener.onError(new AnalysisError(
+        source, node.offset, node.length, errorCode, arguments));
+  }
+
+  /**
+   * Report an error with the given error code and arguments.
+   *
+   * @param errorCode the error code of the error to be reported
+   * @param offset the offset of the location of the error
+   * @param length the length of the location of the error
+   * @param arguments the arguments to the error, used to compose the error message
+   */
+  void reportErrorForOffset(ErrorCode errorCode, int offset, int length,
+      [List<Object> arguments]) {
+    errorListener.onError(
+        new AnalysisError(source, offset, length, errorCode, arguments));
+  }
+
+  /**
+   * Report an error with the given error code and arguments.
+   *
+   * @param errorCode the error code of the error to be reported
+   * @param token the token specifying the location of the error
+   * @param arguments the arguments to the error, used to compose the error message
+   */
+  void reportErrorForToken(ErrorCode errorCode, sc.Token token,
+      [List<Object> arguments]) {
+    errorListener.onError(new AnalysisError(
+        source, token.offset, token.length, errorCode, arguments));
+  }
+
+  /**
+   * Visit the given AST node if it is not null.
+   *
+   * @param node the node to be visited
+   */
+  void safelyVisit(AstNode node) {
+    if (node != null) {
+      node.accept(this);
+    }
+  }
+
+  @override
+  Object visitBlock(Block node) {
+    Scope outerScope = nameScope;
+    try {
+      EnclosedScope enclosedScope = new EnclosedScope(nameScope);
+      _hideNamesDefinedInBlock(enclosedScope, node);
+      nameScope = enclosedScope;
+      super.visitBlock(node);
+    } finally {
+      nameScope = outerScope;
+    }
+    return null;
+  }
+
+  @override
+  Object visitBlockFunctionBody(BlockFunctionBody node) {
+    ImplicitLabelScope implicitOuterScope = _implicitLabelScope;
+    try {
+      _implicitLabelScope = ImplicitLabelScope.ROOT;
+      super.visitBlockFunctionBody(node);
+    } finally {
+      _implicitLabelScope = implicitOuterScope;
+    }
+    return null;
+  }
+
+  @override
+  Object visitCatchClause(CatchClause node) {
+    SimpleIdentifier exception = node.exceptionParameter;
+    if (exception != null) {
+      Scope outerScope = nameScope;
+      try {
+        nameScope = new EnclosedScope(nameScope);
+        nameScope.define(exception.staticElement);
+        SimpleIdentifier stackTrace = node.stackTraceParameter;
+        if (stackTrace != null) {
+          nameScope.define(stackTrace.staticElement);
+        }
+        super.visitCatchClause(node);
+      } finally {
+        nameScope = outerScope;
+      }
+    } else {
+      super.visitCatchClause(node);
+    }
+    return null;
+  }
+
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    ClassElement classElement = node.element;
+    Scope outerScope = nameScope;
+    try {
+      if (classElement == null) {
+        AnalysisEngine.instance.logger.logInformation(
+            "Missing element for class declaration ${node.name.name} in ${definingLibrary.source.fullName}",
+            new CaughtException(new AnalysisException(), null));
+        super.visitClassDeclaration(node);
+      } else {
+        ClassElement outerClass = enclosingClass;
+        try {
+          enclosingClass = node.element;
+          nameScope = new TypeParameterScope(nameScope, classElement);
+          visitClassDeclarationInScope(node);
+          nameScope = new ClassScope(nameScope, classElement);
+          visitClassMembersInScope(node);
+        } finally {
+          enclosingClass = outerClass;
+        }
+      }
+    } finally {
+      nameScope = outerScope;
+    }
+    return null;
+  }
+
+  void visitClassDeclarationInScope(ClassDeclaration node) {
+    safelyVisit(node.name);
+    safelyVisit(node.typeParameters);
+    safelyVisit(node.extendsClause);
+    safelyVisit(node.withClause);
+    safelyVisit(node.implementsClause);
+    safelyVisit(node.nativeClause);
+  }
+
+  void visitClassMembersInScope(ClassDeclaration node) {
+    safelyVisit(node.documentationComment);
+    node.metadata.accept(this);
+    node.members.accept(this);
+  }
+
+  @override
+  Object visitClassTypeAlias(ClassTypeAlias node) {
+    Scope outerScope = nameScope;
+    try {
+      ClassElement element = node.element;
+      nameScope =
+          new ClassScope(new TypeParameterScope(nameScope, element), element);
+      super.visitClassTypeAlias(node);
+    } finally {
+      nameScope = outerScope;
+    }
+    return null;
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    ConstructorElement constructorElement = node.element;
+    Scope outerScope = nameScope;
+    try {
+      if (constructorElement == null) {
+        StringBuffer buffer = new StringBuffer();
+        buffer.write("Missing element for constructor ");
+        buffer.write(node.returnType.name);
+        if (node.name != null) {
+          buffer.write(".");
+          buffer.write(node.name.name);
+        }
+        buffer.write(" in ");
+        buffer.write(definingLibrary.source.fullName);
+        AnalysisEngine.instance.logger.logInformation(buffer.toString(),
+            new CaughtException(new AnalysisException(), null));
+      } else {
+        nameScope = new FunctionScope(nameScope, constructorElement);
+      }
+      super.visitConstructorDeclaration(node);
+    } finally {
+      nameScope = outerScope;
+    }
+    return null;
+  }
+
+  @override
+  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+    VariableElement element = node.element;
+    if (element != null) {
+      nameScope.define(element);
+    }
+    super.visitDeclaredIdentifier(node);
+    return null;
+  }
+
+  @override
+  Object visitDoStatement(DoStatement node) {
+    ImplicitLabelScope outerImplicitScope = _implicitLabelScope;
+    try {
+      _implicitLabelScope = _implicitLabelScope.nest(node);
+      visitStatementInScope(node.body);
+      safelyVisit(node.condition);
+    } finally {
+      _implicitLabelScope = outerImplicitScope;
+    }
+    return null;
+  }
+
+  @override
+  Object visitEnumDeclaration(EnumDeclaration node) {
+    ClassElement classElement = node.element;
+    Scope outerScope = nameScope;
+    try {
+      if (classElement == null) {
+        AnalysisEngine.instance.logger.logInformation(
+            "Missing element for enum declaration ${node.name.name} in ${definingLibrary.source.fullName}",
+            new CaughtException(new AnalysisException(), null));
+        super.visitEnumDeclaration(node);
+      } else {
+        ClassElement outerClass = enclosingClass;
+        try {
+          enclosingClass = node.element;
+          nameScope = new ClassScope(nameScope, classElement);
+          visitEnumMembersInScope(node);
+        } finally {
+          enclosingClass = outerClass;
+        }
+      }
+    } finally {
+      nameScope = outerScope;
+    }
+    return null;
+  }
+
+  void visitEnumMembersInScope(EnumDeclaration node) {
+    safelyVisit(node.documentationComment);
+    node.metadata.accept(this);
+    node.constants.accept(this);
+  }
+
+  @override
+  Object visitForEachStatement(ForEachStatement node) {
+    Scope outerNameScope = nameScope;
+    ImplicitLabelScope outerImplicitScope = _implicitLabelScope;
+    try {
+      nameScope = new EnclosedScope(nameScope);
+      _implicitLabelScope = _implicitLabelScope.nest(node);
+      visitForEachStatementInScope(node);
+    } finally {
+      nameScope = outerNameScope;
+      _implicitLabelScope = outerImplicitScope;
+    }
+    return null;
+  }
+
+  /**
+   * Visit the given statement after it's scope has been created. This replaces the normal call to
+   * the inherited visit method so that ResolverVisitor can intervene when type propagation is
+   * enabled.
+   *
+   * @param node the statement to be visited
+   */
+  void visitForEachStatementInScope(ForEachStatement node) {
+    //
+    // We visit the iterator before the loop variable because the loop variable
+    // cannot be in scope while visiting the iterator.
+    //
+    safelyVisit(node.identifier);
+    safelyVisit(node.iterable);
+    safelyVisit(node.loopVariable);
+    visitStatementInScope(node.body);
+  }
+
+  @override
+  Object visitFormalParameterList(FormalParameterList node) {
+    super.visitFormalParameterList(node);
+    // We finished resolving function signature, now include formal parameters
+    // scope.  Note: we must not do this if the parent is a
+    // FunctionTypedFormalParameter, because in that case we aren't finished
+    // resolving the full function signature, just a part of it.
+    if (nameScope is FunctionScope &&
+        node.parent is! FunctionTypedFormalParameter) {
+      (nameScope as FunctionScope).defineParameters();
+    }
+    if (nameScope is FunctionTypeScope) {
+      (nameScope as FunctionTypeScope).defineParameters();
+    }
+    return null;
+  }
+
+  @override
+  Object visitForStatement(ForStatement node) {
+    Scope outerNameScope = nameScope;
+    ImplicitLabelScope outerImplicitScope = _implicitLabelScope;
+    try {
+      nameScope = new EnclosedScope(nameScope);
+      _implicitLabelScope = _implicitLabelScope.nest(node);
+      visitForStatementInScope(node);
+    } finally {
+      nameScope = outerNameScope;
+      _implicitLabelScope = outerImplicitScope;
+    }
+    return null;
+  }
+
+  /**
+   * Visit the given statement after it's scope has been created. This replaces the normal call to
+   * the inherited visit method so that ResolverVisitor can intervene when type propagation is
+   * enabled.
+   *
+   * @param node the statement to be visited
+   */
+  void visitForStatementInScope(ForStatement node) {
+    safelyVisit(node.variables);
+    safelyVisit(node.initialization);
+    safelyVisit(node.condition);
+    node.updaters.accept(this);
+    visitStatementInScope(node.body);
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    ExecutableElement functionElement = node.element;
+    if (functionElement != null &&
+        functionElement.enclosingElement is! CompilationUnitElement) {
+      nameScope.define(functionElement);
+    }
+    Scope outerScope = nameScope;
+    try {
+      if (functionElement == null) {
+        AnalysisEngine.instance.logger.logInformation(
+            "Missing element for top-level function ${node.name.name} in ${definingLibrary.source.fullName}",
+            new CaughtException(new AnalysisException(), null));
+      } else {
+        nameScope = new FunctionScope(nameScope, functionElement);
+      }
+      super.visitFunctionDeclaration(node);
+    } finally {
+      nameScope = outerScope;
+    }
+    return null;
+  }
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    if (node.parent is FunctionDeclaration) {
+      // We have already created a function scope and don't need to do so again.
+      super.visitFunctionExpression(node);
+    } else {
+      Scope outerScope = nameScope;
+      try {
+        ExecutableElement functionElement = node.element;
+        if (functionElement == null) {
+          StringBuffer buffer = new StringBuffer();
+          buffer.write("Missing element for function ");
+          AstNode parent = node.parent;
+          while (parent != null) {
+            if (parent is Declaration) {
+              Element parentElement = parent.element;
+              buffer.write(parentElement == null
+                  ? "<unknown> "
+                  : "${parentElement.name} ");
+            }
+            parent = parent.parent;
+          }
+          buffer.write("in ");
+          buffer.write(definingLibrary.source.fullName);
+          AnalysisEngine.instance.logger.logInformation(buffer.toString(),
+              new CaughtException(new AnalysisException(), null));
+        } else {
+          nameScope = new FunctionScope(nameScope, functionElement);
+        }
+        super.visitFunctionExpression(node);
+      } finally {
+        nameScope = outerScope;
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    Scope outerScope = nameScope;
+    try {
+      nameScope = new FunctionTypeScope(nameScope, node.element);
+      super.visitFunctionTypeAlias(node);
+    } finally {
+      nameScope = outerScope;
+    }
+    return null;
+  }
+
+  @override
+  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    Scope outerScope = nameScope;
+    try {
+      ParameterElement parameterElement = node.element;
+      if (parameterElement == null) {
+        AnalysisEngine.instance.logger.logInformation(
+            "Missing element for function typed formal parameter ${node.identifier.name} in ${definingLibrary.source.fullName}",
+            new CaughtException(new AnalysisException(), null));
+      } else {
+        nameScope = new EnclosedScope(nameScope);
+        for (TypeParameterElement typeParameter
+            in parameterElement.typeParameters) {
+          nameScope.define(typeParameter);
+        }
+      }
+      super.visitFunctionTypedFormalParameter(node);
+    } finally {
+      nameScope = outerScope;
+    }
+    return null;
+  }
+
+  @override
+  Object visitIfStatement(IfStatement node) {
+    safelyVisit(node.condition);
+    visitStatementInScope(node.thenStatement);
+    visitStatementInScope(node.elseStatement);
+    return null;
+  }
+
+  @override
+  Object visitLabeledStatement(LabeledStatement node) {
+    LabelScope outerScope = _addScopesFor(node.labels, node.unlabeled);
+    try {
+      super.visitLabeledStatement(node);
+    } finally {
+      labelScope = outerScope;
+    }
+    return null;
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    Scope outerScope = nameScope;
+    try {
+      ExecutableElement methodElement = node.element;
+      if (methodElement == null) {
+        AnalysisEngine.instance.logger.logInformation(
+            "Missing element for method ${node.name.name} in ${definingLibrary.source.fullName}",
+            new CaughtException(new AnalysisException(), null));
+      } else {
+        nameScope = new FunctionScope(nameScope, methodElement);
+      }
+      super.visitMethodDeclaration(node);
+    } finally {
+      nameScope = outerScope;
+    }
+    return null;
+  }
+
+  /**
+   * Visit the given statement after it's scope has been created. This is used by ResolverVisitor to
+   * correctly visit the 'then' and 'else' statements of an 'if' statement.
+   *
+   * @param node the statement to be visited
+   */
+  void visitStatementInScope(Statement node) {
+    if (node is Block) {
+      // Don't create a scope around a block because the block will create it's
+      // own scope.
+      visitBlock(node);
+    } else if (node != null) {
+      Scope outerNameScope = nameScope;
+      try {
+        nameScope = new EnclosedScope(nameScope);
+        node.accept(this);
+      } finally {
+        nameScope = outerNameScope;
+      }
+    }
+  }
+
+  @override
+  Object visitSwitchCase(SwitchCase node) {
+    node.expression.accept(this);
+    Scope outerNameScope = nameScope;
+    try {
+      nameScope = new EnclosedScope(nameScope);
+      node.statements.accept(this);
+    } finally {
+      nameScope = outerNameScope;
+    }
+    return null;
+  }
+
+  @override
+  Object visitSwitchDefault(SwitchDefault node) {
+    Scope outerNameScope = nameScope;
+    try {
+      nameScope = new EnclosedScope(nameScope);
+      node.statements.accept(this);
+    } finally {
+      nameScope = outerNameScope;
+    }
+    return null;
+  }
+
+  @override
+  Object visitSwitchStatement(SwitchStatement node) {
+    LabelScope outerScope = labelScope;
+    ImplicitLabelScope outerImplicitScope = _implicitLabelScope;
+    try {
+      _implicitLabelScope = _implicitLabelScope.nest(node);
+      for (SwitchMember member in node.members) {
+        for (Label label in member.labels) {
+          SimpleIdentifier labelName = label.label;
+          LabelElement labelElement = labelName.staticElement as LabelElement;
+          labelScope =
+              new LabelScope(labelScope, labelName.name, member, labelElement);
+        }
+      }
+      super.visitSwitchStatement(node);
+    } finally {
+      labelScope = outerScope;
+      _implicitLabelScope = outerImplicitScope;
+    }
+    return null;
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    super.visitVariableDeclaration(node);
+    if (node.parent.parent is! TopLevelVariableDeclaration &&
+        node.parent.parent is! FieldDeclaration) {
+      VariableElement element = node.element;
+      if (element != null) {
+        nameScope.define(element);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitWhileStatement(WhileStatement node) {
+    safelyVisit(node.condition);
+    ImplicitLabelScope outerImplicitScope = _implicitLabelScope;
+    try {
+      _implicitLabelScope = _implicitLabelScope.nest(node);
+      visitStatementInScope(node.body);
+    } finally {
+      _implicitLabelScope = outerImplicitScope;
+    }
+    return null;
+  }
+
+  /**
+   * Add scopes for each of the given labels.
+   *
+   * @param labels the labels for which new scopes are to be added
+   * @return the scope that was in effect before the new scopes were added
+   */
+  LabelScope _addScopesFor(NodeList<Label> labels, AstNode node) {
+    LabelScope outerScope = labelScope;
+    for (Label label in labels) {
+      SimpleIdentifier labelNameNode = label.label;
+      String labelName = labelNameNode.name;
+      LabelElement labelElement = labelNameNode.staticElement as LabelElement;
+      labelScope = new LabelScope(labelScope, labelName, node, labelElement);
+    }
+    return outerScope;
+  }
+
+  /**
+   * Marks the local declarations of the given [Block] hidden in the enclosing scope.
+   * According to the scoping rules name is hidden if block defines it, but name is defined after
+   * its declaration statement.
+   */
+  void _hideNamesDefinedInBlock(EnclosedScope scope, Block block) {
+    NodeList<Statement> statements = block.statements;
+    int statementCount = statements.length;
+    for (int i = 0; i < statementCount; i++) {
+      Statement statement = statements[i];
+      if (statement is VariableDeclarationStatement) {
+        VariableDeclarationStatement vds = statement;
+        NodeList<VariableDeclaration> variables = vds.variables.variables;
+        int variableCount = variables.length;
+        for (int j = 0; j < variableCount; j++) {
+          scope.hide(variables[j].element);
+        }
+      } else if (statement is FunctionDeclarationStatement) {
+        FunctionDeclarationStatement fds = statement;
+        scope.hide(fds.functionDeclaration.element);
+      }
+    }
+  }
+}
+
+/**
+ * Instances of this class manage the knowledge of what the set of subtypes are for a given type.
+ */
+class SubtypeManager {
+  /**
+   * A map between [ClassElement]s and a set of [ClassElement]s that are subtypes of the
+   * key.
+   */
+  HashMap<ClassElement, HashSet<ClassElement>> _subtypeMap =
+      new HashMap<ClassElement, HashSet<ClassElement>>();
+
+  /**
+   * The set of all [LibraryElement]s that have been visited by the manager. This is used both
+   * to prevent infinite loops in the recursive methods, and also as a marker for the scope of the
+   * libraries visited by this manager.
+   */
+  HashSet<LibraryElement> _visitedLibraries = new HashSet<LibraryElement>();
+
+  /**
+   * Given some [ClassElement], return the set of all subtypes, and subtypes of subtypes.
+   *
+   * @param classElement the class to recursively return the set of subtypes of
+   */
+  HashSet<ClassElement> computeAllSubtypes(ClassElement classElement) {
+    // Ensure that we have generated the subtype map for the library
+    _computeSubtypesInLibrary(classElement.library);
+    // use the subtypeMap to compute the set of all subtypes and subtype's
+    // subtypes
+    HashSet<ClassElement> allSubtypes = new HashSet<ClassElement>();
+    _safelyComputeAllSubtypes(
+        classElement, new HashSet<ClassElement>(), allSubtypes);
+    return allSubtypes;
+  }
+
+  /**
+   * Given some [LibraryElement], visit all of the types in the library, the passed library,
+   * and any imported libraries, will be in the [visitedLibraries] set.
+   *
+   * @param libraryElement the library to visit, it it hasn't been visited already
+   */
+  void ensureLibraryVisited(LibraryElement libraryElement) {
+    _computeSubtypesInLibrary(libraryElement);
+  }
+
+  /**
+   * Given some [ClassElement], this method adds all of the pairs combinations of itself and
+   * all of its supertypes to the [subtypeMap] map.
+   *
+   * @param classElement the class element
+   */
+  void _computeSubtypesInClass(ClassElement classElement) {
+    InterfaceType supertypeType = classElement.supertype;
+    if (supertypeType != null) {
+      ClassElement supertypeElement = supertypeType.element;
+      if (supertypeElement != null) {
+        _putInSubtypeMap(supertypeElement, classElement);
+      }
+    }
+    List<InterfaceType> interfaceTypes = classElement.interfaces;
+    for (InterfaceType interfaceType in interfaceTypes) {
+      ClassElement interfaceElement = interfaceType.element;
+      if (interfaceElement != null) {
+        _putInSubtypeMap(interfaceElement, classElement);
+      }
+    }
+    List<InterfaceType> mixinTypes = classElement.mixins;
+    for (InterfaceType mixinType in mixinTypes) {
+      ClassElement mixinElement = mixinType.element;
+      if (mixinElement != null) {
+        _putInSubtypeMap(mixinElement, classElement);
+      }
+    }
+  }
+
+  /**
+   * Given some [CompilationUnitElement], this method calls
+   * [computeAllSubtypes] on all of the [ClassElement]s in the
+   * compilation unit.
+   *
+   * @param unitElement the compilation unit element
+   */
+  void _computeSubtypesInCompilationUnit(CompilationUnitElement unitElement) {
+    List<ClassElement> classElements = unitElement.types;
+    for (ClassElement classElement in classElements) {
+      _computeSubtypesInClass(classElement);
+    }
+  }
+
+  /**
+   * Given some [LibraryElement], this method calls
+   * [computeAllSubtypes] on all of the [ClassElement]s in the
+   * compilation unit, and itself for all imported and exported libraries. All visited libraries are
+   * added to the [visitedLibraries] set.
+   *
+   * @param libraryElement the library element
+   */
+  void _computeSubtypesInLibrary(LibraryElement libraryElement) {
+    if (libraryElement == null || _visitedLibraries.contains(libraryElement)) {
+      return;
+    }
+    _visitedLibraries.add(libraryElement);
+    _computeSubtypesInCompilationUnit(libraryElement.definingCompilationUnit);
+    List<CompilationUnitElement> parts = libraryElement.parts;
+    for (CompilationUnitElement part in parts) {
+      _computeSubtypesInCompilationUnit(part);
+    }
+    List<LibraryElement> imports = libraryElement.importedLibraries;
+    for (LibraryElement importElt in imports) {
+      _computeSubtypesInLibrary(importElt.library);
+    }
+    List<LibraryElement> exports = libraryElement.exportedLibraries;
+    for (LibraryElement exportElt in exports) {
+      _computeSubtypesInLibrary(exportElt.library);
+    }
+  }
+
+  /**
+   * Add some key/ value pair into the [subtypeMap] map.
+   *
+   * @param supertypeElement the key for the [subtypeMap] map
+   * @param subtypeElement the value for the [subtypeMap] map
+   */
+  void _putInSubtypeMap(
+      ClassElement supertypeElement, ClassElement subtypeElement) {
+    HashSet<ClassElement> subtypes = _subtypeMap[supertypeElement];
+    if (subtypes == null) {
+      subtypes = new HashSet<ClassElement>();
+      _subtypeMap[supertypeElement] = subtypes;
+    }
+    subtypes.add(subtypeElement);
+  }
+
+  /**
+   * Given some [ClassElement] and a [HashSet<ClassElement>], this method recursively
+   * adds all of the subtypes of the [ClassElement] to the passed array.
+   *
+   * @param classElement the type to compute the set of subtypes of
+   * @param visitedClasses the set of class elements that this method has already recursively seen
+   * @param allSubtypes the computed set of subtypes of the passed class element
+   */
+  void _safelyComputeAllSubtypes(ClassElement classElement,
+      HashSet<ClassElement> visitedClasses, HashSet<ClassElement> allSubtypes) {
+    if (!visitedClasses.add(classElement)) {
+      // if this class has already been called on this class element
+      return;
+    }
+    HashSet<ClassElement> subtypes = _subtypeMap[classElement];
+    if (subtypes == null) {
+      return;
+    }
+    for (ClassElement subtype in subtypes) {
+      _safelyComputeAllSubtypes(subtype, visitedClasses, allSubtypes);
+    }
+    allSubtypes.addAll(subtypes);
+  }
+}
+
+/**
+ * Instances of the class `ToDoFinder` find to-do comments in Dart code.
+ */
+class ToDoFinder {
+  /**
+   * The error reporter by which to-do comments will be reported.
+   */
+  final ErrorReporter _errorReporter;
+
+  /**
+   * Initialize a newly created to-do finder to report to-do comments to the given reporter.
+   *
+   * @param errorReporter the error reporter by which to-do comments will be reported
+   */
+  ToDoFinder(this._errorReporter);
+
+  /**
+   * Search the comments in the given compilation unit for to-do comments and report an error for
+   * each.
+   *
+   * @param unit the compilation unit containing the to-do comments
+   */
+  void findIn(CompilationUnit unit) {
+    _gatherTodoComments(unit.beginToken);
+  }
+
+  /**
+   * Search the comment tokens reachable from the given token and create errors for each to-do
+   * comment.
+   *
+   * @param token the head of the list of tokens being searched
+   */
+  void _gatherTodoComments(sc.Token token) {
+    while (token != null && token.type != sc.TokenType.EOF) {
+      sc.Token commentToken = token.precedingComments;
+      while (commentToken != null) {
+        if (commentToken.type == sc.TokenType.SINGLE_LINE_COMMENT ||
+            commentToken.type == sc.TokenType.MULTI_LINE_COMMENT) {
+          _scrapeTodoComment(commentToken);
+        }
+        commentToken = commentToken.next;
+      }
+      token = token.next;
+    }
+  }
+
+  /**
+   * Look for user defined tasks in comments and convert them into info level analysis issues.
+   *
+   * @param commentToken the comment token to analyze
+   */
+  void _scrapeTodoComment(sc.Token commentToken) {
+    JavaPatternMatcher matcher =
+        new JavaPatternMatcher(TodoCode.TODO_REGEX, commentToken.lexeme);
+    if (matcher.find()) {
+      int offset =
+          commentToken.offset + matcher.start() + matcher.group(1).length;
+      int length = matcher.group(2).length;
+      _errorReporter.reportErrorForOffset(
+          TodoCode.TODO, offset, length, [matcher.group(2)]);
+    }
+  }
+}
+
+/**
+ * Instances of the class `TypeOverrideManager` manage the ability to override the type of an
+ * element within a given context.
+ */
+class TypeOverrideManager {
+  /**
+   * The current override scope, or `null` if no scope has been entered.
+   */
+  TypeOverrideManager_TypeOverrideScope currentScope;
+
+  /**
+   * Apply a set of overrides that were previously captured.
+   *
+   * @param overrides the overrides to be applied
+   */
+  void applyOverrides(Map<VariableElement, DartType> overrides) {
+    if (currentScope == null) {
+      throw new IllegalStateException("Cannot apply overrides without a scope");
+    }
+    currentScope.applyOverrides(overrides);
+  }
+
+  /**
+   * Return a table mapping the elements whose type is overridden in the current scope to the
+   * overriding type.
+   *
+   * @return the overrides in the current scope
+   */
+  Map<VariableElement, DartType> captureLocalOverrides() {
+    if (currentScope == null) {
+      throw new IllegalStateException(
+          "Cannot capture local overrides without a scope");
+    }
+    return currentScope.captureLocalOverrides();
+  }
+
+  /**
+   * Return a map from the elements for the variables in the given list that have their types
+   * overridden to the overriding type.
+   *
+   * @param variableList the list of variables whose overriding types are to be captured
+   * @return a table mapping elements to their overriding types
+   */
+  Map<VariableElement, DartType> captureOverrides(
+      VariableDeclarationList variableList) {
+    if (currentScope == null) {
+      throw new IllegalStateException(
+          "Cannot capture overrides without a scope");
+    }
+    return currentScope.captureOverrides(variableList);
+  }
+
+  /**
+   * Enter a new override scope.
+   */
+  void enterScope() {
+    currentScope = new TypeOverrideManager_TypeOverrideScope(currentScope);
+  }
+
+  /**
+   * Exit the current override scope.
+   */
+  void exitScope() {
+    if (currentScope == null) {
+      throw new IllegalStateException("No scope to exit");
+    }
+    currentScope = currentScope._outerScope;
+  }
+
+  /**
+   * Return the best type information available for the given element. If the type of the element
+   * has been overridden, then return the overriding type. Otherwise, return the static type.
+   *
+   * @param element the element for which type information is to be returned
+   * @return the best type information available for the given element
+   */
+  DartType getBestType(VariableElement element) {
+    DartType bestType = getType(element);
+    return bestType == null ? element.type : bestType;
+  }
+
+  /**
+   * Return the overridden type of the given element, or `null` if the type of the element has
+   * not been overridden.
+   *
+   * @param element the element whose type might have been overridden
+   * @return the overridden type of the given element
+   */
+  DartType getType(Element element) {
+    if (currentScope == null) {
+      return null;
+    }
+    return currentScope.getType(element);
+  }
+
+  /**
+   * Update overrides assuming [perBranchOverrides] is the collection of
+   * per-branch overrides for *all* branches flowing into a join point.
+   *
+   * If a variable type in any of branches is not the same as its type before
+   * the branching, then its propagated type is reset to `null`.
+   */
+  void mergeOverrides(List<Map<VariableElement, DartType>> perBranchOverrides) {
+    for (Map<VariableElement, DartType> branch in perBranchOverrides) {
+      branch.forEach((VariableElement variable, DartType branchType) {
+        DartType currentType = currentScope.getType(variable);
+        if (currentType != branchType) {
+          currentScope.resetType(variable);
+        }
+      });
+    }
+  }
+
+  /**
+   * Set the overridden type of the given element to the given type
+   *
+   * @param element the element whose type might have been overridden
+   * @param type the overridden type of the given element
+   */
+  void setType(VariableElement element, DartType type) {
+    if (currentScope == null) {
+      throw new IllegalStateException("Cannot override without a scope");
+    }
+    currentScope.setType(element, type);
+  }
+}
+
+/**
+ * Instances of the class `TypeOverrideScope` represent a scope in which the types of
+ * elements can be overridden.
+ */
+class TypeOverrideManager_TypeOverrideScope {
+  /**
+   * The outer scope in which types might be overridden.
+   */
+  final TypeOverrideManager_TypeOverrideScope _outerScope;
+
+  /**
+   * A table mapping elements to the overridden type of that element.
+   */
+  Map<VariableElement, DartType> _overridenTypes =
+      new HashMap<VariableElement, DartType>();
+
+  /**
+   * Initialize a newly created scope to be an empty child of the given scope.
+   *
+   * @param outerScope the outer scope in which types might be overridden
+   */
+  TypeOverrideManager_TypeOverrideScope(this._outerScope);
+
+  /**
+   * Apply a set of overrides that were previously captured.
+   *
+   * @param overrides the overrides to be applied
+   */
+  void applyOverrides(Map<VariableElement, DartType> overrides) {
+    _overridenTypes.addAll(overrides);
+  }
+
+  /**
+   * Return a table mapping the elements whose type is overridden in the current scope to the
+   * overriding type.
+   *
+   * @return the overrides in the current scope
+   */
+  Map<VariableElement, DartType> captureLocalOverrides() => _overridenTypes;
+
+  /**
+   * Return a map from the elements for the variables in the given list that have their types
+   * overridden to the overriding type.
+   *
+   * @param variableList the list of variables whose overriding types are to be captured
+   * @return a table mapping elements to their overriding types
+   */
+  Map<VariableElement, DartType> captureOverrides(
+      VariableDeclarationList variableList) {
+    Map<VariableElement, DartType> overrides =
+        new HashMap<VariableElement, DartType>();
+    if (variableList.isConst || variableList.isFinal) {
+      for (VariableDeclaration variable in variableList.variables) {
+        VariableElement element = variable.element;
+        if (element != null) {
+          DartType type = _overridenTypes[element];
+          if (type != null) {
+            overrides[element] = type;
+          }
+        }
+      }
+    }
+    return overrides;
+  }
+
+  /**
+   * Return the overridden type of the given element, or `null` if the type of the element
+   * has not been overridden.
+   *
+   * @param element the element whose type might have been overridden
+   * @return the overridden type of the given element
+   */
+  DartType getType(Element element) {
+    if (element is PropertyAccessorElement) {
+      element = (element as PropertyAccessorElement).variable;
+    }
+    DartType type = _overridenTypes[element];
+    if (_overridenTypes.containsKey(element)) {
+      return type;
+    }
+    if (type != null) {
+      return type;
+    } else if (_outerScope != null) {
+      return _outerScope.getType(element);
+    }
+    return null;
+  }
+
+  /**
+   * Clears the overridden type of the given [element].
+   */
+  void resetType(VariableElement element) {
+    _overridenTypes[element] = null;
+  }
+
+  /**
+   * Set the overridden type of the given element to the given type
+   *
+   * @param element the element whose type might have been overridden
+   * @param type the overridden type of the given element
+   */
+  void setType(VariableElement element, DartType type) {
+    _overridenTypes[element] = type;
+  }
+}
+
+/**
+ * Instances of the class `TypeParameterScope` implement the scope defined by the type
+ * parameters in a class.
+ */
+class TypeParameterScope extends EnclosedScope {
+  /**
+   * Initialize a newly created scope enclosed within another scope.
+   *
+   * @param enclosingScope the scope in which this scope is lexically enclosed
+   * @param typeElement the element representing the type represented by this scope
+   */
+  TypeParameterScope(Scope enclosingScope, ClassElement typeElement)
+      : super(enclosingScope) {
+    if (typeElement == null) {
+      throw new IllegalArgumentException("class element cannot be null");
+    }
+    _defineTypeParameters(typeElement);
+  }
+
+  /**
+   * Define the type parameters for the class.
+   *
+   * @param typeElement the element representing the type represented by this scope
+   */
+  void _defineTypeParameters(ClassElement typeElement) {
+    for (TypeParameterElement typeParameter in typeElement.typeParameters) {
+      define(typeParameter);
+    }
+  }
+}
+
+/**
+ * Instances of the class `TypePromotionManager` manage the ability to promote types of local
+ * variables and formal parameters from their declared types based on control flow.
+ */
+class TypePromotionManager {
+  /**
+   * The current promotion scope, or `null` if no scope has been entered.
+   */
+  TypePromotionManager_TypePromoteScope currentScope;
+
+  /**
+   * Returns the elements with promoted types.
+   */
+  Iterable<Element> get promotedElements => currentScope.promotedElements;
+
+  /**
+   * Enter a new promotions scope.
+   */
+  void enterScope() {
+    currentScope = new TypePromotionManager_TypePromoteScope(currentScope);
+  }
+
+  /**
+   * Exit the current promotion scope.
+   */
+  void exitScope() {
+    if (currentScope == null) {
+      throw new IllegalStateException("No scope to exit");
+    }
+    currentScope = currentScope._outerScope;
+  }
+
+  /**
+   * Returns static type of the given variable - declared or promoted.
+   *
+   * @return the static type of the given variable - declared or promoted
+   */
+  DartType getStaticType(VariableElement variable) {
+    DartType staticType = getType(variable);
+    if (staticType == null) {
+      staticType = variable.type;
+    }
+    return staticType;
+  }
+
+  /**
+   * Return the promoted type of the given element, or `null` if the type of the element has
+   * not been promoted.
+   *
+   * @param element the element whose type might have been promoted
+   * @return the promoted type of the given element
+   */
+  DartType getType(Element element) {
+    if (currentScope == null) {
+      return null;
+    }
+    return currentScope.getType(element);
+  }
+
+  /**
+   * Set the promoted type of the given element to the given type.
+   *
+   * @param element the element whose type might have been promoted
+   * @param type the promoted type of the given element
+   */
+  void setType(Element element, DartType type) {
+    if (currentScope == null) {
+      throw new IllegalStateException("Cannot promote without a scope");
+    }
+    currentScope.setType(element, type);
+  }
+}
+
+/**
+ * Instances of the class `TypePromoteScope` represent a scope in which the types of
+ * elements can be promoted.
+ */
+class TypePromotionManager_TypePromoteScope {
+  /**
+   * The outer scope in which types might be promoter.
+   */
+  final TypePromotionManager_TypePromoteScope _outerScope;
+
+  /**
+   * A table mapping elements to the promoted type of that element.
+   */
+  HashMap<Element, DartType> _promotedTypes = new HashMap<Element, DartType>();
+
+  /**
+   * Initialize a newly created scope to be an empty child of the given scope.
+   *
+   * @param outerScope the outer scope in which types might be promoted
+   */
+  TypePromotionManager_TypePromoteScope(this._outerScope);
+
+  /**
+   * Returns the elements with promoted types.
+   */
+  Iterable<Element> get promotedElements => _promotedTypes.keys.toSet();
+
+  /**
+   * Return the promoted type of the given element, or `null` if the type of the element has
+   * not been promoted.
+   *
+   * @param element the element whose type might have been promoted
+   * @return the promoted type of the given element
+   */
+  DartType getType(Element element) {
+    DartType type = _promotedTypes[element];
+    if (type == null && element is PropertyAccessorElement) {
+      type = _promotedTypes[element.variable];
+    }
+    if (type != null) {
+      return type;
+    } else if (_outerScope != null) {
+      return _outerScope.getType(element);
+    }
+    return null;
+  }
+
+  /**
+   * Set the promoted type of the given element to the given type.
+   *
+   * @param element the element whose type might have been promoted
+   * @param type the promoted type of the given element
+   */
+  void setType(Element element, DartType type) {
+    _promotedTypes[element] = type;
+  }
+}
+
+/**
+ * The interface `TypeProvider` defines the behavior of objects that provide access to types
+ * defined by the language.
+ */
+abstract class TypeProvider {
+  /**
+   * Return the type representing the built-in type 'bool'.
+   */
+  InterfaceType get boolType;
+
+  /**
+   * Return the type representing the type 'bottom'.
+   */
+  DartType get bottomType;
+
+  /**
+   * Return the type representing the built-in type 'Deprecated'.
+   */
+  InterfaceType get deprecatedType;
+
+  /**
+   * Return the type representing the built-in type 'double'.
+   */
+  InterfaceType get doubleType;
+
+  /**
+   * Return the type representing the built-in type 'dynamic'.
+   */
+  DartType get dynamicType;
+
+  /**
+   * Return the type representing the built-in type 'Function'.
+   */
+  InterfaceType get functionType;
+
+  /**
+   * Return the type representing 'Future<dynamic>'.
+   */
+  InterfaceType get futureDynamicType;
+
+  /**
+   * Return the type representing 'Future<Null>'.
+   */
+  InterfaceType get futureNullType;
+
+  /**
+   * Return the type representing the built-in type 'Future'.
+   */
+  InterfaceType get futureType;
+
+  /**
+   * Return the type representing the built-in type 'int'.
+   */
+  InterfaceType get intType;
+
+  /**
+   * Return the type representing the type 'Iterable<dynamic>'.
+   */
+  InterfaceType get iterableDynamicType;
+
+  /**
+   * Return the type representing the built-in type 'Iterable'.
+   */
+  InterfaceType get iterableType;
+
+  /**
+   * Return the type representing the built-in type 'List'.
+   */
+  InterfaceType get listType;
+
+  /**
+   * Return the type representing the built-in type 'Map'.
+   */
+  InterfaceType get mapType;
+
+  /**
+   * Return a list containing all of the types that cannot be either extended or
+   * implemented.
+   */
+  List<InterfaceType> get nonSubtypableTypes;
+
+  /**
+   * Return a [DartObjectImpl] representing the `null` object.
+   */
+  DartObjectImpl get nullObject;
+
+  /**
+   * Return the type representing the built-in type 'Null'.
+   */
+  InterfaceType get nullType;
+
+  /**
+   * Return the type representing the built-in type 'num'.
+   */
+  InterfaceType get numType;
+
+  /**
+   * Return the type representing the built-in type 'Object'.
+   */
+  InterfaceType get objectType;
+
+  /**
+   * Return the type representing the built-in type 'StackTrace'.
+   */
+  InterfaceType get stackTraceType;
+
+  /**
+   * Return the type representing 'Stream<dynamic>'.
+   */
+  InterfaceType get streamDynamicType;
+
+  /**
+   * Return the type representing the built-in type 'Stream'.
+   */
+  InterfaceType get streamType;
+
+  /**
+   * Return the type representing the built-in type 'String'.
+   */
+  InterfaceType get stringType;
+
+  /**
+   * Return the type representing the built-in type 'Symbol'.
+   */
+  InterfaceType get symbolType;
+
+  /**
+   * Return the type representing the built-in type 'Type'.
+   */
+  InterfaceType get typeType;
+
+  /**
+   * Return the type representing typenames that can't be resolved.
+   */
+  DartType get undefinedType;
+}
+
+/**
+ * Instances of the class `TypeProviderImpl` provide access to types defined by the language
+ * by looking for those types in the element model for the core library.
+ */
+class TypeProviderImpl implements TypeProvider {
+  /**
+   * The type representing the built-in type 'bool'.
+   */
+  InterfaceType _boolType;
+
+  /**
+   * The type representing the type 'bottom'.
+   */
+  DartType _bottomType;
+
+  /**
+   * The type representing the built-in type 'double'.
+   */
+  InterfaceType _doubleType;
+
+  /**
+   * The type representing the built-in type 'Deprecated'.
+   */
+  InterfaceType _deprecatedType;
+
+  /**
+   * The type representing the built-in type 'dynamic'.
+   */
+  DartType _dynamicType;
+
+  /**
+   * The type representing the built-in type 'Function'.
+   */
+  InterfaceType _functionType;
+
+  /**
+   * The type representing 'Future<dynamic>'.
+   */
+  InterfaceType _futureDynamicType;
+
+  /**
+   * The type representing 'Future<Null>'.
+   */
+  InterfaceType _futureNullType;
+
+  /**
+   * The type representing the built-in type 'Future'.
+   */
+  InterfaceType _futureType;
+
+  /**
+   * The type representing the built-in type 'int'.
+   */
+  InterfaceType _intType;
+
+  /**
+   * The type representing 'Iterable<dynamic>'.
+   */
+  InterfaceType _iterableDynamicType;
+
+  /**
+   * The type representing the built-in type 'Iterable'.
+   */
+  InterfaceType _iterableType;
+
+  /**
+   * The type representing the built-in type 'List'.
+   */
+  InterfaceType _listType;
+
+  /**
+   * The type representing the built-in type 'Map'.
+   */
+  InterfaceType _mapType;
+
+  /**
+   * An shared object representing the value 'null'.
+   */
+  DartObjectImpl _nullObject;
+
+  /**
+   * The type representing the type 'Null'.
+   */
+  InterfaceType _nullType;
+
+  /**
+   * The type representing the built-in type 'num'.
+   */
+  InterfaceType _numType;
+
+  /**
+   * The type representing the built-in type 'Object'.
+   */
+  InterfaceType _objectType;
+
+  /**
+   * The type representing the built-in type 'StackTrace'.
+   */
+  InterfaceType _stackTraceType;
+
+  /**
+   * The type representing 'Stream<dynamic>'.
+   */
+  InterfaceType _streamDynamicType;
+
+  /**
+   * The type representing the built-in type 'Stream'.
+   */
+  InterfaceType _streamType;
+
+  /**
+   * The type representing the built-in type 'String'.
+   */
+  InterfaceType _stringType;
+
+  /**
+   * The type representing the built-in type 'Symbol'.
+   */
+  InterfaceType _symbolType;
+
+  /**
+   * The type representing the built-in type 'Type'.
+   */
+  InterfaceType _typeType;
+
+  /**
+   * The type representing typenames that can't be resolved.
+   */
+  DartType _undefinedType;
+
+  /**
+   * Initialize a newly created type provider to provide the types defined in
+   * the given [coreLibrary] and [asyncLibrary].
+   */
+  TypeProviderImpl(LibraryElement coreLibrary, LibraryElement asyncLibrary) {
+    Namespace coreNamespace =
+        new NamespaceBuilder().createPublicNamespaceForLibrary(coreLibrary);
+    Namespace asyncNamespace =
+        new NamespaceBuilder().createPublicNamespaceForLibrary(asyncLibrary);
+    _initializeFrom(coreNamespace, asyncNamespace);
+  }
+
+  /**
+   * Initialize a newly created type provider to provide the types defined in
+   * the given [Namespace]s.
+   */
+  TypeProviderImpl.forNamespaces(
+      Namespace coreNamespace, Namespace asyncNamespace) {
+    _initializeFrom(coreNamespace, asyncNamespace);
+  }
+
+  @override
+  InterfaceType get boolType => _boolType;
+
+  @override
+  DartType get bottomType => _bottomType;
+
+  @override
+  InterfaceType get deprecatedType => _deprecatedType;
+
+  @override
+  InterfaceType get doubleType => _doubleType;
+
+  @override
+  DartType get dynamicType => _dynamicType;
+
+  @override
+  InterfaceType get functionType => _functionType;
+
+  @override
+  InterfaceType get futureDynamicType => _futureDynamicType;
+
+  @override
+  InterfaceType get futureNullType => _futureNullType;
+
+  @override
+  InterfaceType get futureType => _futureType;
+
+  @override
+  InterfaceType get intType => _intType;
+
+  @override
+  InterfaceType get iterableDynamicType => _iterableDynamicType;
+
+  @override
+  InterfaceType get iterableType => _iterableType;
+
+  @override
+  InterfaceType get listType => _listType;
+
+  @override
+  InterfaceType get mapType => _mapType;
+
+  @override
+  List<InterfaceType> get nonSubtypableTypes => <InterfaceType>[
+        nullType,
+        numType,
+        intType,
+        doubleType,
+        boolType,
+        stringType
+      ];
+
+  @override
+  DartObjectImpl get nullObject {
+    if (_nullObject == null) {
+      _nullObject = new DartObjectImpl(nullType, NullState.NULL_STATE);
+    }
+    return _nullObject;
+  }
+
+  @override
+  InterfaceType get nullType => _nullType;
+
+  @override
+  InterfaceType get numType => _numType;
+
+  @override
+  InterfaceType get objectType => _objectType;
+
+  @override
+  InterfaceType get stackTraceType => _stackTraceType;
+
+  @override
+  InterfaceType get streamDynamicType => _streamDynamicType;
+
+  @override
+  InterfaceType get streamType => _streamType;
+
+  @override
+  InterfaceType get stringType => _stringType;
+
+  @override
+  InterfaceType get symbolType => _symbolType;
+
+  @override
+  InterfaceType get typeType => _typeType;
+
+  @override
+  DartType get undefinedType => _undefinedType;
+
+  /**
+   * Return the type with the given name from the given namespace, or `null` if there is no
+   * class with the given name.
+   *
+   * @param namespace the namespace in which to search for the given name
+   * @param typeName the name of the type being searched for
+   * @return the type that was found
+   */
+  InterfaceType _getType(Namespace namespace, String typeName) {
+    Element element = namespace.get(typeName);
+    if (element == null) {
+      AnalysisEngine.instance.logger
+          .logInformation("No definition of type $typeName");
+      return null;
+    }
+    return (element as ClassElement).type;
+  }
+
+  /**
+   * Initialize the types provided by this type provider from the given
+   * [Namespace]s.
+   */
+  void _initializeFrom(Namespace coreNamespace, Namespace asyncNamespace) {
+    _boolType = _getType(coreNamespace, "bool");
+    _bottomType = BottomTypeImpl.instance;
+    _deprecatedType = _getType(coreNamespace, "Deprecated");
+    _doubleType = _getType(coreNamespace, "double");
+    _dynamicType = DynamicTypeImpl.instance;
+    _functionType = _getType(coreNamespace, "Function");
+    _futureType = _getType(asyncNamespace, "Future");
+    _intType = _getType(coreNamespace, "int");
+    _iterableType = _getType(coreNamespace, "Iterable");
+    _listType = _getType(coreNamespace, "List");
+    _mapType = _getType(coreNamespace, "Map");
+    _nullType = _getType(coreNamespace, "Null");
+    _numType = _getType(coreNamespace, "num");
+    _objectType = _getType(coreNamespace, "Object");
+    _stackTraceType = _getType(coreNamespace, "StackTrace");
+    _streamType = _getType(asyncNamespace, "Stream");
+    _stringType = _getType(coreNamespace, "String");
+    _symbolType = _getType(coreNamespace, "Symbol");
+    _typeType = _getType(coreNamespace, "Type");
+    _undefinedType = UndefinedTypeImpl.instance;
+    _futureDynamicType = _futureType.substitute4(<DartType>[_dynamicType]);
+    _futureNullType = _futureType.substitute4(<DartType>[_nullType]);
+    _iterableDynamicType = _iterableType.substitute4(<DartType>[_dynamicType]);
+    _streamDynamicType = _streamType.substitute4(<DartType>[_dynamicType]);
+  }
+}
+
+/**
+ * Instances of the class `TypeResolverVisitor` are used to resolve the types associated with
+ * the elements in the element model. This includes the types of superclasses, mixins, interfaces,
+ * fields, methods, parameters, and local variables. As a side-effect, this also finishes building
+ * the type hierarchy.
+ */
+class TypeResolverVisitor extends ScopedVisitor {
+  /**
+   * The type representing the type 'dynamic'.
+   */
+  DartType _dynamicType;
+
+  /**
+   * The type representing typenames that can't be resolved.
+   */
+  DartType _undefinedType;
+
+  /**
+   * The flag specifying if currently visited class references 'super' expression.
+   */
+  bool _hasReferenceToSuper = false;
+
+  /**
+   * Initialize a newly created visitor to resolve the nodes in an AST node.
+   *
+   * [definingLibrary] is the element for the library containing the node being
+   * visited.
+   * [source] is the source representing the compilation unit containing the
+   * node being visited.
+   * [typeProvider] is the object used to access the types from the core
+   * library.
+   * [errorListener] is the error listener that will be informed of any errors
+   * that are found during resolution.
+   * [nameScope] is the scope used to resolve identifiers in the node that will
+   * first be visited.  If `null` or unspecified, a new [LibraryScope] will be
+   * created based on [definingLibrary] and [typeProvider].
+   */
+  TypeResolverVisitor(LibraryElement definingLibrary, Source source,
+      TypeProvider typeProvider, AnalysisErrorListener errorListener,
+      {Scope nameScope})
+      : super(definingLibrary, source, typeProvider, errorListener,
+            nameScope: nameScope) {
+    _dynamicType = typeProvider.dynamicType;
+    _undefinedType = typeProvider.undefinedType;
+  }
+
+  @override
+  Object visitAnnotation(Annotation node) {
+    //
+    // Visit annotations, if the annotation is @proxy, on a class, and "proxy"
+    // resolves to the proxy annotation in dart.core, then create create the
+    // ElementAnnotationImpl and set it as the metadata on the enclosing class.
+    //
+    // Element resolution is done in the ElementResolver, and this work will be
+    // done in the general case for all annotations in the ElementResolver.
+    // The reason we resolve this particular element early is so that
+    // ClassElement.isProxy() returns the correct information during all
+    // phases of the ElementResolver.
+    //
+    super.visitAnnotation(node);
+    Identifier identifier = node.name;
+    if (identifier.name.endsWith(ElementAnnotationImpl.PROXY_VARIABLE_NAME) &&
+        node.parent is ClassDeclaration) {
+      Element element = nameScope.lookup(identifier, definingLibrary);
+      if (element != null &&
+          element.library.isDartCore &&
+          element is PropertyAccessorElement) {
+        // This is the @proxy from dart.core
+        ClassDeclaration classDeclaration = node.parent as ClassDeclaration;
+        ElementAnnotationImpl elementAnnotation =
+            new ElementAnnotationImpl(element);
+        node.elementAnnotation = elementAnnotation;
+        (classDeclaration.element as ClassElementImpl).metadata =
+            <ElementAnnotationImpl>[elementAnnotation];
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitCatchClause(CatchClause node) {
+    super.visitCatchClause(node);
+    SimpleIdentifier exception = node.exceptionParameter;
+    if (exception != null) {
+      // If an 'on' clause is provided the type of the exception parameter is
+      // the type in the 'on' clause. Otherwise, the type of the exception
+      // parameter is 'Object'.
+      TypeName exceptionTypeName = node.exceptionType;
+      DartType exceptionType;
+      if (exceptionTypeName == null) {
+        exceptionType = typeProvider.dynamicType;
+      } else {
+        exceptionType = _getType(exceptionTypeName);
+      }
+      _recordType(exception, exceptionType);
+      Element element = exception.staticElement;
+      if (element is VariableElementImpl) {
+        element.type = exceptionType;
+      } else {
+        // TODO(brianwilkerson) Report the internal error
+      }
+    }
+    SimpleIdentifier stackTrace = node.stackTraceParameter;
+    if (stackTrace != null) {
+      _recordType(stackTrace, typeProvider.stackTraceType);
+      Element element = stackTrace.staticElement;
+      if (element is VariableElementImpl) {
+        element.type = typeProvider.stackTraceType;
+      } else {
+        // TODO(brianwilkerson) Report the internal error
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    _hasReferenceToSuper = false;
+    super.visitClassDeclaration(node);
+    ClassElementImpl classElement = _getClassElement(node.name);
+    if (classElement != null) {
+      classElement.hasReferenceToSuper = _hasReferenceToSuper;
+    }
+    return null;
+  }
+
+  @override
+  void visitClassDeclarationInScope(ClassDeclaration node) {
+    super.visitClassDeclarationInScope(node);
+    ExtendsClause extendsClause = node.extendsClause;
+    WithClause withClause = node.withClause;
+    ImplementsClause implementsClause = node.implementsClause;
+    ClassElementImpl classElement = _getClassElement(node.name);
+    InterfaceType superclassType = null;
+    if (extendsClause != null) {
+      ErrorCode errorCode = (withClause == null
+          ? CompileTimeErrorCode.EXTENDS_NON_CLASS
+          : CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS);
+      superclassType = _resolveType(extendsClause.superclass, errorCode,
+          CompileTimeErrorCode.EXTENDS_ENUM, errorCode);
+      if (!identical(superclassType, typeProvider.objectType)) {
+        classElement.validMixin = false;
+      }
+    }
+    if (classElement != null) {
+      if (superclassType == null) {
+        InterfaceType objectType = typeProvider.objectType;
+        if (!identical(classElement.type, objectType)) {
+          superclassType = objectType;
+        }
+      }
+      classElement.supertype = superclassType;
+    }
+    _resolve(classElement, withClause, implementsClause);
+    return null;
+  }
+
+  @override
+  void visitClassMembersInScope(ClassDeclaration node) {
+    //
+    // Process field declarations before constructors and methods so that the
+    // types of field formal parameters can be correctly resolved.
+    //
+    List<ClassMember> nonFields = new List<ClassMember>();
+    node.visitChildren(
+        new _TypeResolverVisitor_visitClassMembersInScope(this, nonFields));
+    int count = nonFields.length;
+    for (int i = 0; i < count; i++) {
+      nonFields[i].accept(this);
+    }
+  }
+
+  @override
+  Object visitClassTypeAlias(ClassTypeAlias node) {
+    super.visitClassTypeAlias(node);
+    ErrorCode errorCode = CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS;
+    InterfaceType superclassType = _resolveType(node.superclass, errorCode,
+        CompileTimeErrorCode.EXTENDS_ENUM, errorCode);
+    if (superclassType == null) {
+      superclassType = typeProvider.objectType;
+    }
+    ClassElementImpl classElement = _getClassElement(node.name);
+    if (classElement != null) {
+      classElement.supertype = superclassType;
+    }
+    _resolve(classElement, node.withClause, node.implementsClause);
+    return null;
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    super.visitConstructorDeclaration(node);
+    ExecutableElementImpl element = node.element as ExecutableElementImpl;
+    if (element == null) {
+      ClassDeclaration classNode =
+          node.getAncestor((node) => node is ClassDeclaration);
+      StringBuffer buffer = new StringBuffer();
+      buffer.write("The element for the constructor ");
+      buffer.write(node.name == null ? "<unnamed>" : node.name.name);
+      buffer.write(" in ");
+      if (classNode == null) {
+        buffer.write("<unknown class>");
+      } else {
+        buffer.write(classNode.name.name);
+      }
+      buffer.write(" in ");
+      buffer.write(source.fullName);
+      buffer.write(" was not set while trying to resolve types.");
+      AnalysisEngine.instance.logger.logError(buffer.toString(),
+          new CaughtException(new AnalysisException(), null));
+    } else {
+      ClassElement definingClass = element.enclosingElement as ClassElement;
+      element.returnType = definingClass.type;
+      FunctionTypeImpl type = new FunctionTypeImpl(element);
+      type.typeArguments = definingClass.type.typeArguments;
+      element.type = type;
+    }
+    return null;
+  }
+
+  @override
+  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+    super.visitDeclaredIdentifier(node);
+    DartType declaredType;
+    TypeName typeName = node.type;
+    if (typeName == null) {
+      declaredType = _dynamicType;
+    } else {
+      declaredType = _getType(typeName);
+    }
+    LocalVariableElementImpl element = node.element as LocalVariableElementImpl;
+    element.type = declaredType;
+    return null;
+  }
+
+  @override
+  Object visitFieldFormalParameter(FieldFormalParameter node) {
+    super.visitFieldFormalParameter(node);
+    Element element = node.identifier.staticElement;
+    if (element is ParameterElementImpl) {
+      ParameterElementImpl parameter = element;
+      FormalParameterList parameterList = node.parameters;
+      if (parameterList == null) {
+        DartType type;
+        TypeName typeName = node.type;
+        if (typeName == null) {
+          type = _dynamicType;
+          if (parameter is FieldFormalParameterElement) {
+            FieldElement fieldElement =
+                (parameter as FieldFormalParameterElement).field;
+            if (fieldElement != null) {
+              type = fieldElement.type;
+            }
+          }
+        } else {
+          type = _getType(typeName);
+        }
+        parameter.type = type;
+      } else {
+        _setFunctionTypedParameterType(parameter, node.type, node.parameters);
+      }
+    } else {
+      // TODO(brianwilkerson) Report this internal error
+    }
+    return null;
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    super.visitFunctionDeclaration(node);
+    ExecutableElementImpl element = node.element as ExecutableElementImpl;
+    if (element == null) {
+      StringBuffer buffer = new StringBuffer();
+      buffer.write("The element for the top-level function ");
+      buffer.write(node.name);
+      buffer.write(" in ");
+      buffer.write(source.fullName);
+      buffer.write(" was not set while trying to resolve types.");
+      AnalysisEngine.instance.logger.logError(buffer.toString(),
+          new CaughtException(new AnalysisException(), null));
+    }
+    element.returnType = _computeReturnType(node.returnType);
+    FunctionTypeImpl type = new FunctionTypeImpl(element);
+    ClassElement definingClass =
+        element.getAncestor((element) => element is ClassElement);
+    if (definingClass != null) {
+      type.typeArguments = definingClass.type.typeArguments;
+    }
+    element.type = type;
+    return null;
+  }
+
+  @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    FunctionTypeAliasElementImpl element =
+        node.element as FunctionTypeAliasElementImpl;
+    super.visitFunctionTypeAlias(node);
+    element.returnType = _computeReturnType(node.returnType);
+    return null;
+  }
+
+  @override
+  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    super.visitFunctionTypedFormalParameter(node);
+    Element element = node.identifier.staticElement;
+    if (element is ParameterElementImpl) {
+      _setFunctionTypedParameterType(element, node.returnType, node.parameters);
+    } else {
+      // TODO(brianwilkerson) Report this internal error
+    }
+    return null;
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    super.visitMethodDeclaration(node);
+    ExecutableElementImpl element = node.element as ExecutableElementImpl;
+    if (element == null) {
+      ClassDeclaration classNode =
+          node.getAncestor((node) => node is ClassDeclaration);
+      StringBuffer buffer = new StringBuffer();
+      buffer.write("The element for the method ");
+      buffer.write(node.name.name);
+      buffer.write(" in ");
+      if (classNode == null) {
+        buffer.write("<unknown class>");
+      } else {
+        buffer.write(classNode.name.name);
+      }
+      buffer.write(" in ");
+      buffer.write(source.fullName);
+      buffer.write(" was not set while trying to resolve types.");
+      AnalysisEngine.instance.logger.logError(buffer.toString(),
+          new CaughtException(new AnalysisException(), null));
+    }
+    element.returnType = _computeReturnType(node.returnType);
+    FunctionTypeImpl type = new FunctionTypeImpl(element);
+    ClassElement definingClass =
+        element.getAncestor((element) => element is ClassElement);
+    if (definingClass != null) {
+      type.typeArguments = definingClass.type.typeArguments;
+    }
+    element.type = type;
+    if (element is PropertyAccessorElement) {
+      PropertyAccessorElement accessor = element as PropertyAccessorElement;
+      PropertyInducingElementImpl variable =
+          accessor.variable as PropertyInducingElementImpl;
+      if (accessor.isGetter) {
+        variable.type = type.returnType;
+      } else if (variable.type == null) {
+        List<DartType> parameterTypes = type.normalParameterTypes;
+        if (parameterTypes != null && parameterTypes.length > 0) {
+          variable.type = parameterTypes[0];
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+    super.visitSimpleFormalParameter(node);
+    DartType declaredType;
+    TypeName typeName = node.type;
+    if (typeName == null) {
+      declaredType = _dynamicType;
+    } else {
+      declaredType = _getType(typeName);
+    }
+    Element element = node.identifier.staticElement;
+    if (element is ParameterElement) {
+      (element as ParameterElementImpl).type = declaredType;
+    } else {
+      // TODO(brianwilkerson) Report the internal error.
+    }
+    return null;
+  }
+
+  @override
+  Object visitSuperExpression(SuperExpression node) {
+    _hasReferenceToSuper = true;
+    return super.visitSuperExpression(node);
+  }
+
+  @override
+  Object visitTypeName(TypeName node) {
+    super.visitTypeName(node);
+    Identifier typeName = node.name;
+    TypeArgumentList argumentList = node.typeArguments;
+    Element element = nameScope.lookup(typeName, definingLibrary);
+    if (element == null) {
+      //
+      // Check to see whether the type name is either 'dynamic' or 'void',
+      // neither of which are in the name scope and hence will not be found by
+      // normal means.
+      //
+      if (typeName.name == _dynamicType.name) {
+        _setElement(typeName, _dynamicType.element);
+        if (argumentList != null) {
+          // TODO(brianwilkerson) Report this error
+//          reporter.reportError(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, node, dynamicType.getName(), 0, argumentList.getArguments().size());
+        }
+        typeName.staticType = _dynamicType;
+        node.type = _dynamicType;
+        return null;
+      }
+      VoidTypeImpl voidType = VoidTypeImpl.instance;
+      if (typeName.name == voidType.name) {
+        // There is no element for 'void'.
+        if (argumentList != null) {
+          // TODO(brianwilkerson) Report this error
+//          reporter.reportError(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, node, voidType.getName(), 0, argumentList.getArguments().size());
+        }
+        typeName.staticType = voidType;
+        node.type = voidType;
+        return null;
+      }
+      //
+      // If not, the look to see whether we might have created the wrong AST
+      // structure for a constructor name. If so, fix the AST structure and then
+      // proceed.
+      //
+      AstNode parent = node.parent;
+      if (typeName is PrefixedIdentifier &&
+          parent is ConstructorName &&
+          argumentList == null) {
+        ConstructorName name = parent;
+        if (name.name == null) {
+          PrefixedIdentifier prefixedIdentifier =
+              typeName as PrefixedIdentifier;
+          SimpleIdentifier prefix = prefixedIdentifier.prefix;
+          element = nameScope.lookup(prefix, definingLibrary);
+          if (element is PrefixElement) {
+            if (parent.parent is InstanceCreationExpression &&
+                (parent.parent as InstanceCreationExpression).isConst) {
+              // If, if this is a const expression, then generate a
+              // CompileTimeErrorCode.CONST_WITH_NON_TYPE error.
+              reportErrorForNode(
+                  CompileTimeErrorCode.CONST_WITH_NON_TYPE,
+                  prefixedIdentifier.identifier,
+                  [prefixedIdentifier.identifier.name]);
+            } else {
+              // Else, if this expression is a new expression, report a
+              // NEW_WITH_NON_TYPE warning.
+              reportErrorForNode(
+                  StaticWarningCode.NEW_WITH_NON_TYPE,
+                  prefixedIdentifier.identifier,
+                  [prefixedIdentifier.identifier.name]);
+            }
+            _setElement(prefix, element);
+            return null;
+          } else if (element != null) {
+            //
+            // Rewrite the constructor name. The parser, when it sees a
+            // constructor named "a.b", cannot tell whether "a" is a prefix and
+            // "b" is a class name, or whether "a" is a class name and "b" is a
+            // constructor name. It arbitrarily chooses the former, but in this
+            // case was wrong.
+            //
+            name.name = prefixedIdentifier.identifier;
+            name.period = prefixedIdentifier.period;
+            node.name = prefix;
+            typeName = prefix;
+          }
+        }
+      }
+    }
+    // check element
+    bool elementValid = element is! MultiplyDefinedElement;
+    if (elementValid &&
+        element is! ClassElement &&
+        _isTypeNameInInstanceCreationExpression(node)) {
+      SimpleIdentifier typeNameSimple = _getTypeSimpleIdentifier(typeName);
+      InstanceCreationExpression creation =
+          node.parent.parent as InstanceCreationExpression;
+      if (creation.isConst) {
+        if (element == null) {
+          reportErrorForNode(
+              CompileTimeErrorCode.UNDEFINED_CLASS, typeNameSimple, [typeName]);
+        } else {
+          reportErrorForNode(CompileTimeErrorCode.CONST_WITH_NON_TYPE,
+              typeNameSimple, [typeName]);
+        }
+        elementValid = false;
+      } else {
+        if (element != null) {
+          reportErrorForNode(
+              StaticWarningCode.NEW_WITH_NON_TYPE, typeNameSimple, [typeName]);
+          elementValid = false;
+        }
+      }
+    }
+    if (elementValid && element == null) {
+      // We couldn't resolve the type name.
+      // TODO(jwren) Consider moving the check for
+      // CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE from the
+      // ErrorVerifier, so that we don't have two errors on a built in
+      // identifier being used as a class name.
+      // See CompileTimeErrorCodeTest.test_builtInIdentifierAsType().
+      SimpleIdentifier typeNameSimple = _getTypeSimpleIdentifier(typeName);
+      RedirectingConstructorKind redirectingConstructorKind;
+      if (_isBuiltInIdentifier(node) && _isTypeAnnotation(node)) {
+        reportErrorForNode(CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE,
+            typeName, [typeName.name]);
+      } else if (typeNameSimple.name == "boolean") {
+        reportErrorForNode(
+            StaticWarningCode.UNDEFINED_CLASS_BOOLEAN, typeNameSimple, []);
+      } else if (_isTypeNameInCatchClause(node)) {
+        reportErrorForNode(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName,
+            [typeName.name]);
+      } else if (_isTypeNameInAsExpression(node)) {
+        reportErrorForNode(
+            StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name]);
+      } else if (_isTypeNameInIsExpression(node)) {
+        reportErrorForNode(StaticWarningCode.TYPE_TEST_WITH_UNDEFINED_NAME,
+            typeName, [typeName.name]);
+      } else if ((redirectingConstructorKind =
+              _getRedirectingConstructorKind(node)) !=
+          null) {
+        ErrorCode errorCode = (redirectingConstructorKind ==
+                RedirectingConstructorKind.CONST
+            ? CompileTimeErrorCode.REDIRECT_TO_NON_CLASS
+            : StaticWarningCode.REDIRECT_TO_NON_CLASS);
+        reportErrorForNode(errorCode, typeName, [typeName.name]);
+      } else if (_isTypeNameInTypeArgumentList(node)) {
+        reportErrorForNode(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT,
+            typeName, [typeName.name]);
+      } else {
+        reportErrorForNode(
+            StaticWarningCode.UNDEFINED_CLASS, typeName, [typeName.name]);
+      }
+      elementValid = false;
+    }
+    if (!elementValid) {
+      if (element is MultiplyDefinedElement) {
+        _setElement(typeName, element);
+      } else {
+        _setElement(typeName, _dynamicType.element);
+      }
+      typeName.staticType = _undefinedType;
+      node.type = _undefinedType;
+      return null;
+    }
+    DartType type = null;
+    if (element is ClassElement) {
+      _setElement(typeName, element);
+      type = element.type;
+    } else if (element is FunctionTypeAliasElement) {
+      _setElement(typeName, element);
+      type = element.type;
+    } else if (element is TypeParameterElement) {
+      _setElement(typeName, element);
+      type = element.type;
+      if (argumentList != null) {
+        // Type parameters cannot have type arguments.
+        // TODO(brianwilkerson) Report this error.
+        //      resolver.reportError(ResolverErrorCode.?, keyType);
+      }
+    } else if (element is MultiplyDefinedElement) {
+      List<Element> elements = element.conflictingElements;
+      type = _getTypeWhenMultiplyDefined(elements);
+      if (type != null) {
+        node.type = type;
+      }
+    } else {
+      // The name does not represent a type.
+      RedirectingConstructorKind redirectingConstructorKind;
+      if (_isTypeNameInCatchClause(node)) {
+        reportErrorForNode(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName,
+            [typeName.name]);
+      } else if (_isTypeNameInAsExpression(node)) {
+        reportErrorForNode(
+            StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name]);
+      } else if (_isTypeNameInIsExpression(node)) {
+        reportErrorForNode(StaticWarningCode.TYPE_TEST_WITH_NON_TYPE, typeName,
+            [typeName.name]);
+      } else if ((redirectingConstructorKind =
+              _getRedirectingConstructorKind(node)) !=
+          null) {
+        ErrorCode errorCode = (redirectingConstructorKind ==
+                RedirectingConstructorKind.CONST
+            ? CompileTimeErrorCode.REDIRECT_TO_NON_CLASS
+            : StaticWarningCode.REDIRECT_TO_NON_CLASS);
+        reportErrorForNode(errorCode, typeName, [typeName.name]);
+      } else if (_isTypeNameInTypeArgumentList(node)) {
+        reportErrorForNode(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT,
+            typeName, [typeName.name]);
+      } else {
+        AstNode parent = typeName.parent;
+        while (parent is TypeName) {
+          parent = parent.parent;
+        }
+        if (parent is ExtendsClause ||
+            parent is ImplementsClause ||
+            parent is WithClause ||
+            parent is ClassTypeAlias) {
+          // Ignored. The error will be reported elsewhere.
+        } else {
+          reportErrorForNode(
+              StaticWarningCode.NOT_A_TYPE, typeName, [typeName.name]);
+        }
+      }
+      _setElement(typeName, _dynamicType.element);
+      typeName.staticType = _dynamicType;
+      node.type = _dynamicType;
+      return null;
+    }
+    if (argumentList != null) {
+      NodeList<TypeName> arguments = argumentList.arguments;
+      int argumentCount = arguments.length;
+      List<DartType> parameters = _getTypeArguments(type);
+      int parameterCount = parameters.length;
+      List<DartType> typeArguments = new List<DartType>(parameterCount);
+      if (argumentCount == parameterCount) {
+        for (int i = 0; i < parameterCount; i++) {
+          TypeName argumentTypeName = arguments[i];
+          DartType argumentType = _getType(argumentTypeName);
+          if (argumentType == null) {
+            argumentType = _dynamicType;
+          }
+          typeArguments[i] = argumentType;
+        }
+      } else {
+        reportErrorForNode(_getInvalidTypeParametersErrorCode(node), node,
+            [typeName.name, parameterCount, argumentCount]);
+        for (int i = 0; i < parameterCount; i++) {
+          typeArguments[i] = _dynamicType;
+        }
+      }
+      if (type is InterfaceTypeImpl) {
+        InterfaceTypeImpl interfaceType = type as InterfaceTypeImpl;
+        type = interfaceType.substitute4(typeArguments);
+      } else if (type is FunctionTypeImpl) {
+        FunctionTypeImpl functionType = type as FunctionTypeImpl;
+        type = functionType.substitute3(typeArguments);
+      } else {
+        // TODO(brianwilkerson) Report this internal error.
+      }
+    } else {
+      //
+      // Check for the case where there are no type arguments given for a
+      // parameterized type.
+      //
+      List<DartType> parameters = _getTypeArguments(type);
+      int parameterCount = parameters.length;
+      if (parameterCount > 0) {
+        DynamicTypeImpl dynamicType = DynamicTypeImpl.instance;
+        List<DartType> arguments = new List<DartType>(parameterCount);
+        for (int i = 0; i < parameterCount; i++) {
+          arguments[i] = dynamicType;
+        }
+        type = type.substitute2(arguments, parameters);
+      }
+    }
+    typeName.staticType = type;
+    node.type = type;
+    return null;
+  }
+
+  @override
+  Object visitTypeParameter(TypeParameter node) {
+    super.visitTypeParameter(node);
+    TypeName bound = node.bound;
+    if (bound != null) {
+      TypeParameterElementImpl typeParameter =
+          node.name.staticElement as TypeParameterElementImpl;
+      if (typeParameter != null) {
+        typeParameter.bound = bound.type;
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    super.visitVariableDeclaration(node);
+    DartType declaredType;
+    TypeName typeName = (node.parent as VariableDeclarationList).type;
+    if (typeName == null) {
+      declaredType = _dynamicType;
+    } else {
+      declaredType = _getType(typeName);
+    }
+    Element element = node.name.staticElement;
+    if (element is VariableElement) {
+      (element as VariableElementImpl).type = declaredType;
+      if (element is PropertyInducingElement) {
+        PropertyInducingElement variableElement = element;
+        PropertyAccessorElementImpl getter =
+            variableElement.getter as PropertyAccessorElementImpl;
+        getter.returnType = declaredType;
+        FunctionTypeImpl getterType = new FunctionTypeImpl(getter);
+        ClassElement definingClass =
+            element.getAncestor((element) => element is ClassElement);
+        if (definingClass != null) {
+          getterType.typeArguments = definingClass.type.typeArguments;
+        }
+        getter.type = getterType;
+        PropertyAccessorElementImpl setter =
+            variableElement.setter as PropertyAccessorElementImpl;
+        if (setter != null) {
+          List<ParameterElement> parameters = setter.parameters;
+          if (parameters.length > 0) {
+            (parameters[0] as ParameterElementImpl).type = declaredType;
+          }
+          setter.returnType = VoidTypeImpl.instance;
+          FunctionTypeImpl setterType = new FunctionTypeImpl(setter);
+          if (definingClass != null) {
+            setterType.typeArguments = definingClass.type.typeArguments;
+          }
+          setter.type = setterType;
+        }
+      }
+    } else {
+      // TODO(brianwilkerson) Report the internal error.
+    }
+    return null;
+  }
+
+  /**
+   * Given a type name representing the return type of a function, compute the return type of the
+   * function.
+   *
+   * @param returnType the type name representing the return type of the function
+   * @return the return type that was computed
+   */
+  DartType _computeReturnType(TypeName returnType) {
+    if (returnType == null) {
+      return _dynamicType;
+    } else {
+      return returnType.type;
+    }
+  }
+
+  /**
+   * Return the class element that represents the class whose name was provided.
+   *
+   * @param identifier the name from the declaration of a class
+   * @return the class element that represents the class
+   */
+  ClassElementImpl _getClassElement(SimpleIdentifier identifier) {
+    // TODO(brianwilkerson) Seems like we should be using
+    // ClassDeclaration.getElement().
+    if (identifier == null) {
+      // TODO(brianwilkerson) Report this
+      // Internal error: We should never build a class declaration without a
+      // name.
+      return null;
+    }
+    Element element = identifier.staticElement;
+    if (element is! ClassElementImpl) {
+      // TODO(brianwilkerson) Report this
+      // Internal error: Failed to create an element for a class declaration.
+      return null;
+    }
+    return element as ClassElementImpl;
+  }
+
+  /**
+   * Return an array containing all of the elements associated with the parameters in the given
+   * list.
+   *
+   * @param parameterList the list of parameters whose elements are to be returned
+   * @return the elements associated with the parameters
+   */
+  List<ParameterElement> _getElements(FormalParameterList parameterList) {
+    List<ParameterElement> elements = new List<ParameterElement>();
+    for (FormalParameter parameter in parameterList.parameters) {
+      ParameterElement element =
+          parameter.identifier.staticElement as ParameterElement;
+      // TODO(brianwilkerson) Understand why the element would be null.
+      if (element != null) {
+        elements.add(element);
+      }
+    }
+    return elements;
+  }
+
+  /**
+   * The number of type arguments in the given type name does not match the number of parameters in
+   * the corresponding class element. Return the error code that should be used to report this
+   * error.
+   *
+   * @param node the type name with the wrong number of type arguments
+   * @return the error code that should be used to report that the wrong number of type arguments
+   *         were provided
+   */
+  ErrorCode _getInvalidTypeParametersErrorCode(TypeName node) {
+    AstNode parent = node.parent;
+    if (parent is ConstructorName) {
+      parent = parent.parent;
+      if (parent is InstanceCreationExpression) {
+        if (parent.isConst) {
+          return CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS;
+        } else {
+          return StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS;
+        }
+      }
+    }
+    return StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS;
+  }
+
+  /**
+   * Checks if the given type name is the target in a redirected constructor.
+   *
+   * @param typeName the type name to analyze
+   * @return some [RedirectingConstructorKind] if the given type name is used as the type in a
+   *         redirected constructor, or `null` otherwise
+   */
+  RedirectingConstructorKind _getRedirectingConstructorKind(TypeName typeName) {
+    AstNode parent = typeName.parent;
+    if (parent is ConstructorName) {
+      ConstructorName constructorName = parent as ConstructorName;
+      parent = constructorName.parent;
+      if (parent is ConstructorDeclaration) {
+        if (identical(parent.redirectedConstructor, constructorName)) {
+          if (parent.constKeyword != null) {
+            return RedirectingConstructorKind.CONST;
+          }
+          return RedirectingConstructorKind.NORMAL;
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the type represented by the given type name.
+   *
+   * @param typeName the type name representing the type to be returned
+   * @return the type represented by the type name
+   */
+  DartType _getType(TypeName typeName) {
+    DartType type = typeName.type;
+    if (type == null) {
+      return _undefinedType;
+    }
+    return type;
+  }
+
+  /**
+   * Return the type arguments associated with the given type.
+   *
+   * @param type the type whole type arguments are to be returned
+   * @return the type arguments associated with the given type
+   */
+  List<DartType> _getTypeArguments(DartType type) {
+    if (type is InterfaceType) {
+      return type.typeArguments;
+    } else if (type is FunctionType) {
+      return type.typeArguments;
+    }
+    return DartType.EMPTY_LIST;
+  }
+
+  /**
+   * Returns the simple identifier of the given (may be qualified) type name.
+   *
+   * @param typeName the (may be qualified) qualified type name
+   * @return the simple identifier of the given (may be qualified) type name.
+   */
+  SimpleIdentifier _getTypeSimpleIdentifier(Identifier typeName) {
+    if (typeName is SimpleIdentifier) {
+      return typeName;
+    } else {
+      return (typeName as PrefixedIdentifier).identifier;
+    }
+  }
+
+  /**
+   * Given the multiple elements to which a single name could potentially be resolved, return the
+   * single interface type that should be used, or `null` if there is no clear choice.
+   *
+   * @param elements the elements to which a single name could potentially be resolved
+   * @return the single interface type that should be used for the type name
+   */
+  InterfaceType _getTypeWhenMultiplyDefined(List<Element> elements) {
+    InterfaceType type = null;
+    for (Element element in elements) {
+      if (element is ClassElement) {
+        if (type != null) {
+          return null;
+        }
+        type = element.type;
+      }
+    }
+    return type;
+  }
+
+  /**
+   * Checks if the given type name is used as the type in an as expression.
+   *
+   * @param typeName the type name to analyzer
+   * @return `true` if the given type name is used as the type in an as expression
+   */
+  bool _isTypeNameInAsExpression(TypeName typeName) {
+    AstNode parent = typeName.parent;
+    if (parent is AsExpression) {
+      AsExpression asExpression = parent;
+      return identical(asExpression.type, typeName);
+    }
+    return false;
+  }
+
+  /**
+   * Checks if the given type name is used as the exception type in a catch clause.
+   *
+   * @param typeName the type name to analyzer
+   * @return `true` if the given type name is used as the exception type in a catch clause
+   */
+  bool _isTypeNameInCatchClause(TypeName typeName) {
+    AstNode parent = typeName.parent;
+    if (parent is CatchClause) {
+      CatchClause catchClause = parent;
+      return identical(catchClause.exceptionType, typeName);
+    }
+    return false;
+  }
+
+  /**
+   * Checks if the given type name is used as the type in an instance creation expression.
+   *
+   * @param typeName the type name to analyzer
+   * @return `true` if the given type name is used as the type in an instance creation
+   *         expression
+   */
+  bool _isTypeNameInInstanceCreationExpression(TypeName typeName) {
+    AstNode parent = typeName.parent;
+    if (parent is ConstructorName &&
+        parent.parent is InstanceCreationExpression) {
+      ConstructorName constructorName = parent;
+      return constructorName != null &&
+          identical(constructorName.type, typeName);
+    }
+    return false;
+  }
+
+  /**
+   * Checks if the given type name is used as the type in an is expression.
+   *
+   * @param typeName the type name to analyzer
+   * @return `true` if the given type name is used as the type in an is expression
+   */
+  bool _isTypeNameInIsExpression(TypeName typeName) {
+    AstNode parent = typeName.parent;
+    if (parent is IsExpression) {
+      IsExpression isExpression = parent;
+      return identical(isExpression.type, typeName);
+    }
+    return false;
+  }
+
+  /**
+   * Checks if the given type name used in a type argument list.
+   *
+   * @param typeName the type name to analyzer
+   * @return `true` if the given type name is in a type argument list
+   */
+  bool _isTypeNameInTypeArgumentList(TypeName typeName) =>
+      typeName.parent is TypeArgumentList;
+
+  /**
+   * Record that the static type of the given node is the given type.
+   *
+   * @param expression the node whose type is to be recorded
+   * @param type the static type of the node
+   */
+  Object _recordType(Expression expression, DartType type) {
+    if (type == null) {
+      expression.staticType = _dynamicType;
+    } else {
+      expression.staticType = type;
+    }
+    return null;
+  }
+
+  /**
+   * Resolve the types in the given with and implements clauses and associate those types with the
+   * given class element.
+   *
+   * @param classElement the class element with which the mixin and interface types are to be
+   *          associated
+   * @param withClause the with clause to be resolved
+   * @param implementsClause the implements clause to be resolved
+   */
+  void _resolve(ClassElementImpl classElement, WithClause withClause,
+      ImplementsClause implementsClause) {
+    if (withClause != null) {
+      List<InterfaceType> mixinTypes = _resolveTypes(
+          withClause.mixinTypes,
+          CompileTimeErrorCode.MIXIN_OF_NON_CLASS,
+          CompileTimeErrorCode.MIXIN_OF_ENUM,
+          CompileTimeErrorCode.MIXIN_OF_NON_CLASS);
+      if (classElement != null) {
+        classElement.mixins = mixinTypes;
+        classElement.withClauseRange =
+            new SourceRange(withClause.offset, withClause.length);
+      }
+    }
+    if (implementsClause != null) {
+      NodeList<TypeName> interfaces = implementsClause.interfaces;
+      List<InterfaceType> interfaceTypes = _resolveTypes(
+          interfaces,
+          CompileTimeErrorCode.IMPLEMENTS_NON_CLASS,
+          CompileTimeErrorCode.IMPLEMENTS_ENUM,
+          CompileTimeErrorCode.IMPLEMENTS_DYNAMIC);
+      if (classElement != null) {
+        classElement.interfaces = interfaceTypes;
+      }
+      // TODO(brianwilkerson) Move the following checks to ErrorVerifier.
+      int count = interfaces.length;
+      List<bool> detectedRepeatOnIndex = new List<bool>.filled(count, false);
+      for (int i = 0; i < detectedRepeatOnIndex.length; i++) {
+        detectedRepeatOnIndex[i] = false;
+      }
+      for (int i = 0; i < count; i++) {
+        TypeName typeName = interfaces[i];
+        if (!detectedRepeatOnIndex[i]) {
+          Element element = typeName.name.staticElement;
+          for (int j = i + 1; j < count; j++) {
+            TypeName typeName2 = interfaces[j];
+            Identifier identifier2 = typeName2.name;
+            String name2 = identifier2.name;
+            Element element2 = identifier2.staticElement;
+            if (element != null && element == element2) {
+              detectedRepeatOnIndex[j] = true;
+              reportErrorForNode(
+                  CompileTimeErrorCode.IMPLEMENTS_REPEATED, typeName2, [name2]);
+            }
+          }
+        }
+      }
+    }
+  }
+
+  /**
+   * Return the type specified by the given name.
+   *
+   * @param typeName the type name specifying the type to be returned
+   * @param nonTypeError the error to produce if the type name is defined to be something other than
+   *          a type
+   * @param enumTypeError the error to produce if the type name is defined to be an enum
+   * @param dynamicTypeError the error to produce if the type name is "dynamic"
+   * @return the type specified by the type name
+   */
+  InterfaceType _resolveType(TypeName typeName, ErrorCode nonTypeError,
+      ErrorCode enumTypeError, ErrorCode dynamicTypeError) {
+    DartType type = typeName.type;
+    if (type is InterfaceType) {
+      ClassElement element = type.element;
+      if (element != null && element.isEnum) {
+        reportErrorForNode(enumTypeError, typeName);
+        return null;
+      }
+      return type;
+    }
+    // If the type is not an InterfaceType, then visitTypeName() sets the type
+    // to be a DynamicTypeImpl
+    Identifier name = typeName.name;
+    if (name.name == sc.Keyword.DYNAMIC.syntax) {
+      reportErrorForNode(dynamicTypeError, name, [name.name]);
+    } else {
+      reportErrorForNode(nonTypeError, name, [name.name]);
+    }
+    return null;
+  }
+
+  /**
+   * Resolve the types in the given list of type names.
+   *
+   * @param typeNames the type names to be resolved
+   * @param nonTypeError the error to produce if the type name is defined to be something other than
+   *          a type
+   * @param enumTypeError the error to produce if the type name is defined to be an enum
+   * @param dynamicTypeError the error to produce if the type name is "dynamic"
+   * @return an array containing all of the types that were resolved.
+   */
+  List<InterfaceType> _resolveTypes(
+      NodeList<TypeName> typeNames,
+      ErrorCode nonTypeError,
+      ErrorCode enumTypeError,
+      ErrorCode dynamicTypeError) {
+    List<InterfaceType> types = new List<InterfaceType>();
+    for (TypeName typeName in typeNames) {
+      InterfaceType type =
+          _resolveType(typeName, nonTypeError, enumTypeError, dynamicTypeError);
+      if (type != null) {
+        types.add(type);
+      }
+    }
+    return types;
+  }
+
+  void _setElement(Identifier typeName, Element element) {
+    if (element != null) {
+      if (typeName is SimpleIdentifier) {
+        typeName.staticElement = element;
+      } else if (typeName is PrefixedIdentifier) {
+        PrefixedIdentifier identifier = typeName;
+        identifier.identifier.staticElement = element;
+        SimpleIdentifier prefix = identifier.prefix;
+        Element prefixElement = nameScope.lookup(prefix, definingLibrary);
+        if (prefixElement != null) {
+          prefix.staticElement = prefixElement;
+        }
+      }
+    }
+  }
+
+  /**
+   * Given a parameter element, create a function type based on the given return type and parameter
+   * list and associate the created type with the element.
+   *
+   * @param element the parameter element whose type is to be set
+   * @param returnType the (possibly `null`) return type of the function
+   * @param parameterList the list of parameters to the function
+   */
+  void _setFunctionTypedParameterType(ParameterElementImpl element,
+      TypeName returnType, FormalParameterList parameterList) {
+    List<ParameterElement> parameters = _getElements(parameterList);
+    FunctionTypeAliasElementImpl aliasElement =
+        new FunctionTypeAliasElementImpl.forNode(null);
+    aliasElement.synthetic = true;
+    aliasElement.shareParameters(parameters);
+    aliasElement.returnType = _computeReturnType(returnType);
+    // FunctionTypeAliasElementImpl assumes the enclosing element is a
+    // CompilationUnitElement (because non-synthetic function types can only be
+    // declared at top level), so to avoid breaking things, go find the
+    // compilation unit element.
+    aliasElement.enclosingElement =
+        element.getAncestor((element) => element is CompilationUnitElement);
+    FunctionTypeImpl type = new FunctionTypeImpl.forTypedef(aliasElement);
+    ClassElement definingClass =
+        element.getAncestor((element) => element is ClassElement);
+    if (definingClass != null) {
+      aliasElement.shareTypeParameters(definingClass.typeParameters);
+      type.typeArguments = definingClass.type.typeArguments;
+    } else {
+      FunctionTypeAliasElement alias =
+          element.getAncestor((element) => element is FunctionTypeAliasElement);
+      while (alias != null && alias.isSynthetic) {
+        alias =
+            alias.getAncestor((element) => element is FunctionTypeAliasElement);
+      }
+      if (alias != null) {
+        aliasElement.typeParameters = alias.typeParameters;
+        type.typeArguments = alias.type.typeArguments;
+      } else {
+        type.typeArguments = DartType.EMPTY_LIST;
+      }
+    }
+    element.type = type;
+  }
+
+  /**
+   * @return `true` if the name of the given [TypeName] is an built-in identifier.
+   */
+  static bool _isBuiltInIdentifier(TypeName node) {
+    sc.Token token = node.name.beginToken;
+    return token.type == sc.TokenType.KEYWORD;
+  }
+
+  /**
+   * @return `true` if given [TypeName] is used as a type annotation.
+   */
+  static bool _isTypeAnnotation(TypeName node) {
+    AstNode parent = node.parent;
+    if (parent is VariableDeclarationList) {
+      return identical(parent.type, node);
+    }
+    if (parent is FieldFormalParameter) {
+      return identical(parent.type, node);
+    }
+    if (parent is SimpleFormalParameter) {
+      return identical(parent.type, node);
+    }
+    return false;
+  }
+}
+
+/**
+ * The interface `TypeSystem` defines the behavior of an object representing
+ * the type system.  This provides a common location to put methods that act on
+ * types but may need access to more global data structures, and it paves the
+ * way for a possible future where we may wish to make the type system
+ * pluggable.
+ */
+abstract class TypeSystem {
+  /**
+   * Return the [TypeProvider] associated with this [TypeSystem].
+   */
+  TypeProvider get typeProvider;
+
+  /**
+   * Compute the least upper bound of two types.
+   */
+  DartType getLeastUpperBound(DartType type1, DartType type2);
+
+  /**
+   * Return `true` if the [leftType] is a subtype of the [rightType] (that is,
+   * if leftType <: rightType).
+   */
+  bool isSubtypeOf(DartType leftType, DartType rightType);
+}
+
+/**
+ * Implementation of [TypeSystem] using the rules in the Dart specification.
+ */
+class TypeSystemImpl implements TypeSystem {
+  @override
+  final TypeProvider typeProvider;
+
+  TypeSystemImpl(this.typeProvider);
+
+  @override
+  DartType getLeastUpperBound(DartType type1, DartType type2) {
+    // The least upper bound relation is reflexive.
+    if (identical(type1, type2)) {
+      return type1;
+    }
+    // The least upper bound of dynamic and any type T is dynamic.
+    if (type1.isDynamic) {
+      return type1;
+    }
+    if (type2.isDynamic) {
+      return type2;
+    }
+    // The least upper bound of void and any type T != dynamic is void.
+    if (type1.isVoid) {
+      return type1;
+    }
+    if (type2.isVoid) {
+      return type2;
+    }
+    // The least upper bound of bottom and any type T is T.
+    if (type1.isBottom) {
+      return type2;
+    }
+    if (type2.isBottom) {
+      return type1;
+    }
+    // Let U be a type variable with upper bound B.  The least upper bound of U
+    // and a type T is the least upper bound of B and T.
+    while (type1 is TypeParameterType) {
+      // TODO(paulberry): is this correct in the complex of F-bounded
+      // polymorphism?
+      DartType bound = (type1 as TypeParameterType).element.bound;
+      if (bound == null) {
+        bound = typeProvider.objectType;
+      }
+      type1 = bound;
+    }
+    while (type2 is TypeParameterType) {
+      // TODO(paulberry): is this correct in the context of F-bounded
+      // polymorphism?
+      DartType bound = (type2 as TypeParameterType).element.bound;
+      if (bound == null) {
+        bound = typeProvider.objectType;
+      }
+      type2 = bound;
+    }
+    // The least upper bound of a function type and an interface type T is the
+    // least upper bound of Function and T.
+    if (type1 is FunctionType && type2 is InterfaceType) {
+      type1 = typeProvider.functionType;
+    }
+    if (type2 is FunctionType && type1 is InterfaceType) {
+      type2 = typeProvider.functionType;
+    }
+
+    // At this point type1 and type2 should both either be interface types or
+    // function types.
+    if (type1 is InterfaceType && type2 is InterfaceType) {
+      InterfaceType result =
+          InterfaceTypeImpl.computeLeastUpperBound(type1, type2);
+      if (result == null) {
+        return typeProvider.dynamicType;
+      }
+      return result;
+    } else if (type1 is FunctionType && type2 is FunctionType) {
+      FunctionType result =
+          FunctionTypeImpl.computeLeastUpperBound(type1, type2);
+      if (result == null) {
+        return typeProvider.functionType;
+      }
+      return result;
+    } else {
+      // Should never happen.  As a defensive measure, return the dynamic type.
+      assert(false);
+      return typeProvider.dynamicType;
+    }
+  }
+
+  @override
+  bool isSubtypeOf(DartType leftType, DartType rightType) {
+    return leftType.isSubtypeOf(rightType);
+  }
+}
+
+/**
+ * Instances of the class [UnusedLocalElementsVerifier] traverse an element
+ * structure looking for cases of [HintCode.UNUSED_ELEMENT],
+ * [HintCode.UNUSED_FIELD], [HintCode.UNUSED_LOCAL_VARIABLE], etc.
+ */
+class UnusedLocalElementsVerifier extends RecursiveElementVisitor {
+  /**
+   * The error listener to which errors will be reported.
+   */
+  final AnalysisErrorListener _errorListener;
+
+  /**
+   * The elements know to be used.
+   */
+  final UsedLocalElements _usedElements;
+
+  /**
+   * Create a new instance of the [UnusedLocalElementsVerifier].
+   */
+  UnusedLocalElementsVerifier(this._errorListener, this._usedElements);
+
+  @override
+  visitClassElement(ClassElement element) {
+    if (!_isUsedElement(element)) {
+      _reportErrorForElement(HintCode.UNUSED_ELEMENT, element,
+          [element.kind.displayName, element.displayName]);
+    }
+    super.visitClassElement(element);
+  }
+
+  @override
+  visitFieldElement(FieldElement element) {
+    if (!_isReadMember(element)) {
+      _reportErrorForElement(
+          HintCode.UNUSED_FIELD, element, [element.displayName]);
+    }
+    super.visitFieldElement(element);
+  }
+
+  @override
+  visitFunctionElement(FunctionElement element) {
+    if (!_isUsedElement(element)) {
+      _reportErrorForElement(HintCode.UNUSED_ELEMENT, element,
+          [element.kind.displayName, element.displayName]);
+    }
+    super.visitFunctionElement(element);
+  }
+
+  @override
+  visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
+    if (!_isUsedElement(element)) {
+      _reportErrorForElement(HintCode.UNUSED_ELEMENT, element,
+          [element.kind.displayName, element.displayName]);
+    }
+    super.visitFunctionTypeAliasElement(element);
+  }
+
+  @override
+  visitLocalVariableElement(LocalVariableElement element) {
+    if (!_isUsedElement(element) && !_isNamedUnderscore(element)) {
+      HintCode errorCode;
+      if (_usedElements.isCatchException(element)) {
+        errorCode = HintCode.UNUSED_CATCH_CLAUSE;
+      } else if (_usedElements.isCatchStackTrace(element)) {
+        errorCode = HintCode.UNUSED_CATCH_STACK;
+      } else {
+        errorCode = HintCode.UNUSED_LOCAL_VARIABLE;
+      }
+      _reportErrorForElement(errorCode, element, [element.displayName]);
+    }
+  }
+
+  @override
+  visitMethodElement(MethodElement element) {
+    if (!_isUsedMember(element)) {
+      _reportErrorForElement(HintCode.UNUSED_ELEMENT, element,
+          [element.kind.displayName, element.displayName]);
+    }
+    super.visitMethodElement(element);
+  }
+
+  @override
+  visitPropertyAccessorElement(PropertyAccessorElement element) {
+    if (!_isUsedMember(element)) {
+      _reportErrorForElement(HintCode.UNUSED_ELEMENT, element,
+          [element.kind.displayName, element.displayName]);
+    }
+    super.visitPropertyAccessorElement(element);
+  }
+
+  bool _isNamedUnderscore(LocalVariableElement element) {
+    String name = element.name;
+    if (name != null) {
+      for (int index = name.length - 1; index >= 0; --index) {
+        if (name.codeUnitAt(index) != 0x5F) {
+          // 0x5F => '_'
+          return false;
+        }
+      }
+      return true;
+    }
+    return false;
+  }
+
+  bool _isReadMember(Element element) {
+    if (element.isPublic) {
+      return true;
+    }
+    if (element.isSynthetic) {
+      return true;
+    }
+    return _usedElements.readMembers.contains(element.displayName);
+  }
+
+  bool _isUsedElement(Element element) {
+    if (element.isSynthetic) {
+      return true;
+    }
+    if (element is LocalVariableElement ||
+        element is FunctionElement && !element.isStatic) {
+      // local variable or function
+    } else {
+      if (element.isPublic) {
+        return true;
+      }
+    }
+    return _usedElements.elements.contains(element);
+  }
+
+  bool _isUsedMember(Element element) {
+    if (element.isPublic) {
+      return true;
+    }
+    if (element.isSynthetic) {
+      return true;
+    }
+    if (_usedElements.members.contains(element.displayName)) {
+      return true;
+    }
+    return _usedElements.elements.contains(element);
+  }
+
+  void _reportErrorForElement(
+      ErrorCode errorCode, Element element, List<Object> arguments) {
+    if (element != null) {
+      _errorListener.onError(new AnalysisError(
+          element.source,
+          element.nameOffset,
+          element.displayName.length,
+          errorCode,
+          arguments));
+    }
+  }
+}
+
+/**
+ * A container with information about used imports prefixes and used imported
+ * elements.
+ */
+class UsedImportedElements {
+  /**
+   * The set of referenced [PrefixElement]s.
+   */
+  final Set<PrefixElement> prefixes = new HashSet<PrefixElement>();
+
+  /**
+   * The set of referenced top-level [Element]s.
+   */
+  final Set<Element> elements = new HashSet<Element>();
+}
+
+/**
+ * A container with sets of used [Element]s.
+ * All these elements are defined in a single compilation unit or a library.
+ */
+class UsedLocalElements {
+  /**
+   * Resolved, locally defined elements that are used or potentially can be
+   * used.
+   */
+  final HashSet<Element> elements = new HashSet<Element>();
+
+  /**
+   * [LocalVariableElement]s that represent exceptions in [CatchClause]s.
+   */
+  final HashSet<LocalVariableElement> catchExceptionElements =
+      new HashSet<LocalVariableElement>();
+
+  /**
+   * [LocalVariableElement]s that represent stack traces in [CatchClause]s.
+   */
+  final HashSet<LocalVariableElement> catchStackTraceElements =
+      new HashSet<LocalVariableElement>();
+
+  /**
+   * Names of resolved or unresolved class members that are referenced in the
+   * library.
+   */
+  final HashSet<String> members = new HashSet<String>();
+
+  /**
+   * Names of resolved or unresolved class members that are read in the
+   * library.
+   */
+  final HashSet<String> readMembers = new HashSet<String>();
+
+  UsedLocalElements();
+
+  factory UsedLocalElements.merge(List<UsedLocalElements> parts) {
+    UsedLocalElements result = new UsedLocalElements();
+    for (UsedLocalElements part in parts) {
+      result.elements.addAll(part.elements);
+      result.catchExceptionElements.addAll(part.catchExceptionElements);
+      result.catchStackTraceElements.addAll(part.catchStackTraceElements);
+      result.members.addAll(part.members);
+      result.readMembers.addAll(part.readMembers);
+    }
+    return result;
+  }
+
+  void addCatchException(LocalVariableElement element) {
+    if (element != null) {
+      catchExceptionElements.add(element);
+    }
+  }
+
+  void addCatchStackTrace(LocalVariableElement element) {
+    if (element != null) {
+      catchStackTraceElements.add(element);
+    }
+  }
+
+  void addElement(Element element) {
+    if (element != null) {
+      elements.add(element);
+    }
+  }
+
+  bool isCatchException(LocalVariableElement element) {
+    return catchExceptionElements.contains(element);
+  }
+
+  bool isCatchStackTrace(LocalVariableElement element) {
+    return catchStackTraceElements.contains(element);
+  }
+}
+
+/**
+ * Instances of the class `VariableResolverVisitor` are used to resolve
+ * [SimpleIdentifier]s to local variables and formal parameters.
+ */
+class VariableResolverVisitor extends ScopedVisitor {
+  /**
+   * The method or function that we are currently visiting, or `null` if we are not inside a
+   * method or function.
+   */
+  ExecutableElement _enclosingFunction;
+
+  /**
+   * Initialize a newly created visitor to resolve the nodes in an AST node.
+   *
+   * [definingLibrary] is the element for the library containing the node being
+   * visited.
+   * [source] is the source representing the compilation unit containing the
+   * node being visited
+   * [typeProvider] is the object used to access the types from the core
+   * library.
+   * [errorListener] is the error listener that will be informed of any errors
+   * that are found during resolution.
+   * [nameScope] is the scope used to resolve identifiers in the node that will
+   * first be visited.  If `null` or unspecified, a new [LibraryScope] will be
+   * created based on [definingLibrary] and [typeProvider].
+   */
+  VariableResolverVisitor(LibraryElement definingLibrary, Source source,
+      TypeProvider typeProvider, AnalysisErrorListener errorListener,
+      {Scope nameScope})
+      : super(definingLibrary, source, typeProvider, errorListener,
+            nameScope: nameScope);
+
+  /**
+   * Initialize a newly created visitor to resolve the nodes in a compilation unit.
+   *
+   * @param library the library containing the compilation unit being resolved
+   * @param source the source representing the compilation unit being visited
+   * @param typeProvider the object used to access the types from the core library
+   *
+   * Deprecated.  Please use unnamed constructor instead.
+   */
+  @deprecated
+  VariableResolverVisitor.con1(
+      Library library, Source source, TypeProvider typeProvider)
+      : this(
+            library.libraryElement, source, typeProvider, library.errorListener,
+            nameScope: library.libraryScope);
+
+  @override
+  Object visitExportDirective(ExportDirective node) => null;
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    ExecutableElement outerFunction = _enclosingFunction;
+    try {
+      _enclosingFunction = node.element;
+      return super.visitFunctionDeclaration(node);
+    } finally {
+      _enclosingFunction = outerFunction;
+    }
+  }
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    if (node.parent is! FunctionDeclaration) {
+      ExecutableElement outerFunction = _enclosingFunction;
+      try {
+        _enclosingFunction = node.element;
+        return super.visitFunctionExpression(node);
+      } finally {
+        _enclosingFunction = outerFunction;
+      }
+    } else {
+      return super.visitFunctionExpression(node);
+    }
+  }
+
+  @override
+  Object visitImportDirective(ImportDirective node) => null;
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    ExecutableElement outerFunction = _enclosingFunction;
+    try {
+      _enclosingFunction = node.element;
+      return super.visitMethodDeclaration(node);
+    } finally {
+      _enclosingFunction = outerFunction;
+    }
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    // Ignore if already resolved - declaration or type.
+    if (node.staticElement != null) {
+      return null;
+    }
+    // Ignore if qualified.
+    AstNode parent = node.parent;
+    if (parent is PrefixedIdentifier && identical(parent.identifier, node)) {
+      return null;
+    }
+    if (parent is PropertyAccess && identical(parent.propertyName, node)) {
+      return null;
+    }
+    if (parent is MethodInvocation &&
+        identical(parent.methodName, node) &&
+        parent.realTarget != null) {
+      return null;
+    }
+    if (parent is ConstructorName) {
+      return null;
+    }
+    if (parent is Label) {
+      return null;
+    }
+    // Prepare VariableElement.
+    Element element = nameScope.lookup(node, definingLibrary);
+    if (element is! VariableElement) {
+      return null;
+    }
+    // Must be local or parameter.
+    ElementKind kind = element.kind;
+    if (kind == ElementKind.LOCAL_VARIABLE) {
+      node.staticElement = element;
+      LocalVariableElementImpl variableImpl =
+          element as LocalVariableElementImpl;
+      if (node.inSetterContext()) {
+        variableImpl.markPotentiallyMutatedInScope();
+        if (element.enclosingElement != _enclosingFunction) {
+          variableImpl.markPotentiallyMutatedInClosure();
+        }
+      }
+    } else if (kind == ElementKind.PARAMETER) {
+      node.staticElement = element;
+      if (node.inSetterContext()) {
+        ParameterElementImpl parameterImpl = element as ParameterElementImpl;
+        parameterImpl.markPotentiallyMutatedInScope();
+        // If we are in some closure, check if it is not the same as where
+        // variable is declared.
+        if (_enclosingFunction != null &&
+            (element.enclosingElement != _enclosingFunction)) {
+          parameterImpl.markPotentiallyMutatedInClosure();
+        }
+      }
+    }
+    return null;
+  }
+}
+
+class _ConstantVerifier_validateInitializerExpression extends ConstantVisitor {
+  final ConstantVerifier verifier;
+
+  List<ParameterElement> parameterElements;
+
+  _ConstantVerifier_validateInitializerExpression(
+      TypeProvider typeProvider,
+      ErrorReporter errorReporter,
+      this.verifier,
+      this.parameterElements,
+      DeclaredVariables declaredVariables)
+      : super(new ConstantEvaluationEngine(typeProvider, declaredVariables),
+            errorReporter);
+
+  @override
+  DartObjectImpl visitSimpleIdentifier(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    for (ParameterElement parameterElement in parameterElements) {
+      if (identical(parameterElement, element) && parameterElement != null) {
+        DartType type = parameterElement.type;
+        if (type != null) {
+          if (type.isDynamic) {
+            return new DartObjectImpl(
+                verifier._typeProvider.objectType, DynamicState.DYNAMIC_STATE);
+          } else if (type.isSubtypeOf(verifier._boolType)) {
+            return new DartObjectImpl(
+                verifier._typeProvider.boolType, BoolState.UNKNOWN_VALUE);
+          } else if (type.isSubtypeOf(verifier._typeProvider.doubleType)) {
+            return new DartObjectImpl(
+                verifier._typeProvider.doubleType, DoubleState.UNKNOWN_VALUE);
+          } else if (type.isSubtypeOf(verifier._intType)) {
+            return new DartObjectImpl(
+                verifier._typeProvider.intType, IntState.UNKNOWN_VALUE);
+          } else if (type.isSubtypeOf(verifier._numType)) {
+            return new DartObjectImpl(
+                verifier._typeProvider.numType, NumState.UNKNOWN_VALUE);
+          } else if (type.isSubtypeOf(verifier._stringType)) {
+            return new DartObjectImpl(
+                verifier._typeProvider.stringType, StringState.UNKNOWN_VALUE);
+          }
+          //
+          // We don't test for other types of objects (such as List, Map,
+          // Function or Type) because there are no operations allowed on such
+          // types other than '==' and '!=', which means that we don't need to
+          // know the type when there is no specific data about the state of
+          // such objects.
+          //
+        }
+        return new DartObjectImpl(
+            type is InterfaceType ? type : verifier._typeProvider.objectType,
+            GenericState.UNKNOWN_VALUE);
+      }
+    }
+    return super.visitSimpleIdentifier(node);
+  }
+}
+
+class _ElementBuilder_visitClassDeclaration extends UnifyingAstVisitor<Object> {
+  final ElementBuilder builder;
+
+  List<ClassMember> nonFields;
+
+  _ElementBuilder_visitClassDeclaration(this.builder, this.nonFields) : super();
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    nonFields.add(node);
+    return null;
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    nonFields.add(node);
+    return null;
+  }
+
+  @override
+  Object visitNode(AstNode node) => node.accept(builder);
+}
+
+class _ResolverVisitor_isVariableAccessedInClosure
+    extends RecursiveAstVisitor<Object> {
+  final Element variable;
+
+  bool result = false;
+
+  bool _inClosure = false;
+
+  _ResolverVisitor_isVariableAccessedInClosure(this.variable);
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    bool inClosure = this._inClosure;
+    try {
+      this._inClosure = true;
+      return super.visitFunctionExpression(node);
+    } finally {
+      this._inClosure = inClosure;
+    }
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    if (result) {
+      return null;
+    }
+    if (_inClosure && identical(node.staticElement, variable)) {
+      result = true;
+    }
+    return null;
+  }
+}
+
+class _ResolverVisitor_isVariablePotentiallyMutatedIn
+    extends RecursiveAstVisitor<Object> {
+  final Element variable;
+
+  bool result = false;
+
+  _ResolverVisitor_isVariablePotentiallyMutatedIn(this.variable);
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    if (result) {
+      return null;
+    }
+    if (identical(node.staticElement, variable)) {
+      if (node.inSetterContext()) {
+        result = true;
+      }
+    }
+    return null;
+  }
+}
+
+class _TypeResolverVisitor_visitClassMembersInScope
+    extends UnifyingAstVisitor<Object> {
+  final TypeResolverVisitor TypeResolverVisitor_this;
+
+  List<ClassMember> nonFields;
+
+  _TypeResolverVisitor_visitClassMembersInScope(
+      this.TypeResolverVisitor_this, this.nonFields)
+      : super();
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    nonFields.add(node);
+    return null;
+  }
+
+  @override
+  Object visitExtendsClause(ExtendsClause node) => null;
+
+  @override
+  Object visitImplementsClause(ImplementsClause node) => null;
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    nonFields.add(node);
+    return null;
+  }
+
+  @override
+  Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this);
+
+  @override
+  Object visitWithClause(WithClause node) => null;
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/scanner.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/scanner.dart
new file mode 100644
index 0000000..0a9fa2a
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/scanner.dart
@@ -0,0 +1,2671 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.scanner;
+
+import 'dart:collection';
+
+import 'error.dart';
+import 'java_engine.dart';
+import 'source.dart';
+
+/**
+ * The opening half of a grouping pair of tokens. This is used for curly
+ * brackets ('{'), parentheses ('('), and square brackets ('[').
+ */
+class BeginToken extends Token {
+  /**
+   * The token that corresponds to this token.
+   */
+  Token endToken;
+
+  /**
+   * Initialize a newly created token to have the given [type] at the given
+   * [offset].
+   */
+  BeginToken(TokenType type, int offset) : super(type, offset) {
+    assert(type == TokenType.OPEN_CURLY_BRACKET ||
+        type == TokenType.OPEN_PAREN ||
+        type == TokenType.OPEN_SQUARE_BRACKET ||
+        type == TokenType.STRING_INTERPOLATION_EXPRESSION);
+  }
+
+  @override
+  Token copy() => new BeginToken(type, offset);
+}
+
+/**
+ * A begin token that is preceded by comments.
+ */
+class BeginTokenWithComment extends BeginToken {
+  /**
+   * The first comment in the list of comments that precede this token.
+   */
+  CommentToken _precedingComment;
+
+  /**
+   * Initialize a newly created token to have the given [type] at the given
+   * [offset] and to be preceded by the comments reachable from the given
+   * [comment].
+   */
+  BeginTokenWithComment(TokenType type, int offset, this._precedingComment)
+      : super(type, offset) {
+    _setCommentParent(_precedingComment);
+  }
+
+  CommentToken get precedingComments => _precedingComment;
+
+  void set precedingComments(CommentToken comment) {
+    _precedingComment = comment;
+    _setCommentParent(_precedingComment);
+  }
+
+  @override
+  void applyDelta(int delta) {
+    super.applyDelta(delta);
+    Token token = precedingComments;
+    while (token != null) {
+      token.applyDelta(delta);
+      token = token.next;
+    }
+  }
+
+  @override
+  Token copy() =>
+      new BeginTokenWithComment(type, offset, copyComments(precedingComments));
+}
+
+/**
+ * A [CharacterReader] that reads a range of characters from another character
+ * reader.
+ */
+class CharacterRangeReader extends CharacterReader {
+  /**
+   * The reader from which the characters are actually being read.
+   */
+  final CharacterReader baseReader;
+
+  /**
+   * The last character to be read.
+   */
+  final int endIndex;
+
+  /**
+   * Initialize a newly created reader to read the characters from the given
+   * [baseReader] between the [startIndex] inclusive to [endIndex] exclusive.
+   */
+  CharacterRangeReader(this.baseReader, int startIndex, this.endIndex) {
+    baseReader.offset = startIndex - 1;
+  }
+
+  @override
+  int get offset => baseReader.offset;
+
+  @override
+  void set offset(int offset) {
+    baseReader.offset = offset;
+  }
+
+  @override
+  int advance() {
+    if (baseReader.offset + 1 >= endIndex) {
+      return -1;
+    }
+    return baseReader.advance();
+  }
+
+  @override
+  String getString(int start, int endDelta) =>
+      baseReader.getString(start, endDelta);
+
+  @override
+  int peek() {
+    if (baseReader.offset + 1 >= endIndex) {
+      return -1;
+    }
+    return baseReader.peek();
+  }
+}
+
+/**
+ * An object used by the scanner to read the characters to be scanned.
+ */
+abstract class CharacterReader {
+  /**
+   * The current offset relative to the beginning of the source. Return the
+   * initial offset if the scanner has not yet scanned the source code, and one
+   * (1) past the end of the source code if the entire source code has been
+   * scanned.
+   */
+  int get offset;
+
+  /**
+   * Set the current offset relative to the beginning of the source to the given
+   * [offset]. The new offset must be between the initial offset and one (1)
+   * past the end of the source code.
+   */
+  void set offset(int offset);
+
+  /**
+   * Advance the current position and return the character at the new current
+   * position.
+   */
+  int advance();
+
+  /**
+   * Return the substring of the source code between the [start] offset and the
+   * modified current position. The current position is modified by adding the
+   * [endDelta], which is the number of characters after the current location to
+   * be included in the string, or the number of characters before the current
+   * location to be excluded if the offset is negative.
+   */
+  String getString(int start, int endDelta);
+
+  /**
+   * Return the character at the current position without changing the current
+   * position.
+   */
+  int peek();
+}
+
+/**
+ * A [CharacterReader] that reads characters from a character sequence.
+ */
+class CharSequenceReader implements CharacterReader {
+  /**
+   * The sequence from which characters will be read.
+   */
+  final String _sequence;
+
+  /**
+   * The number of characters in the string.
+   */
+  int _stringLength = 0;
+
+  /**
+   * The index, relative to the string, of the last character that was read.
+   */
+  int _charOffset = 0;
+
+  /**
+   * Initialize a newly created reader to read the characters in the given
+   * [_sequence].
+   */
+  CharSequenceReader(this._sequence) {
+    this._stringLength = _sequence.length;
+    this._charOffset = -1;
+  }
+
+  @override
+  int get offset => _charOffset;
+
+  @override
+  void set offset(int offset) {
+    _charOffset = offset;
+  }
+
+  @override
+  int advance() {
+    if (_charOffset + 1 >= _stringLength) {
+      return -1;
+    }
+    return _sequence.codeUnitAt(++_charOffset);
+  }
+
+  @override
+  String getString(int start, int endDelta) =>
+      _sequence.substring(start, _charOffset + 1 + endDelta).toString();
+
+  @override
+  int peek() {
+    if (_charOffset + 1 >= _stringLength) {
+      return -1;
+    }
+    return _sequence.codeUnitAt(_charOffset + 1);
+  }
+}
+
+/**
+ * A token representing a comment.
+ */
+class CommentToken extends StringToken {
+  /**
+   * The [Token] that contains this comment.
+   */
+  Token parent;
+
+  /**
+   * Initialize a newly created token to represent a token of the given [type]
+   * with the given [value] at the given [offset].
+   */
+  CommentToken(TokenType type, String value, int offset)
+      : super(type, value, offset);
+
+  @override
+  CommentToken copy() => new CommentToken(type, _value, offset);
+}
+
+/**
+ * A documentation comment token.
+ */
+class DocumentationCommentToken extends CommentToken {
+  /**
+   * The references embedded within the documentation comment.
+   * This list will be empty unless this is a documentation comment that has
+   * references embedded within it.
+   */
+  final List<Token> references = <Token>[];
+
+  /**
+   * Initialize a newly created token to represent a token of the given [type]
+   * with the given [value] at the given [offset].
+   */
+  DocumentationCommentToken(TokenType type, String value, int offset)
+      : super(type, value, offset);
+
+  @override
+  CommentToken copy() => new DocumentationCommentToken(type, _value, offset);
+}
+
+/**
+ * The keywords in the Dart programming language.
+ */
+class Keyword {
+  static const Keyword ASSERT = const Keyword('ASSERT', "assert");
+
+  static const Keyword BREAK = const Keyword('BREAK', "break");
+
+  static const Keyword CASE = const Keyword('CASE', "case");
+
+  static const Keyword CATCH = const Keyword('CATCH', "catch");
+
+  static const Keyword CLASS = const Keyword('CLASS', "class");
+
+  static const Keyword CONST = const Keyword('CONST', "const");
+
+  static const Keyword CONTINUE = const Keyword('CONTINUE', "continue");
+
+  static const Keyword DEFAULT = const Keyword('DEFAULT', "default");
+
+  static const Keyword DO = const Keyword('DO', "do");
+
+  static const Keyword ELSE = const Keyword('ELSE', "else");
+
+  static const Keyword ENUM = const Keyword('ENUM', "enum");
+
+  static const Keyword EXTENDS = const Keyword('EXTENDS', "extends");
+
+  static const Keyword FALSE = const Keyword('FALSE', "false");
+
+  static const Keyword FINAL = const Keyword('FINAL', "final");
+
+  static const Keyword FINALLY = const Keyword('FINALLY', "finally");
+
+  static const Keyword FOR = const Keyword('FOR', "for");
+
+  static const Keyword IF = const Keyword('IF', "if");
+
+  static const Keyword IN = const Keyword('IN', "in");
+
+  static const Keyword IS = const Keyword('IS', "is");
+
+  static const Keyword NEW = const Keyword('NEW', "new");
+
+  static const Keyword NULL = const Keyword('NULL', "null");
+
+  static const Keyword RETHROW = const Keyword('RETHROW', "rethrow");
+
+  static const Keyword RETURN = const Keyword('RETURN', "return");
+
+  static const Keyword SUPER = const Keyword('SUPER', "super");
+
+  static const Keyword SWITCH = const Keyword('SWITCH', "switch");
+
+  static const Keyword THIS = const Keyword('THIS', "this");
+
+  static const Keyword THROW = const Keyword('THROW', "throw");
+
+  static const Keyword TRUE = const Keyword('TRUE', "true");
+
+  static const Keyword TRY = const Keyword('TRY', "try");
+
+  static const Keyword VAR = const Keyword('VAR', "var");
+
+  static const Keyword VOID = const Keyword('VOID', "void");
+
+  static const Keyword WHILE = const Keyword('WHILE', "while");
+
+  static const Keyword WITH = const Keyword('WITH', "with");
+
+  static const Keyword ABSTRACT = const Keyword('ABSTRACT', "abstract", true);
+
+  static const Keyword AS = const Keyword('AS', "as", true);
+
+  static const Keyword DEFERRED = const Keyword('DEFERRED', "deferred", true);
+
+  static const Keyword DYNAMIC = const Keyword('DYNAMIC', "dynamic", true);
+
+  static const Keyword EXPORT = const Keyword('EXPORT', "export", true);
+
+  static const Keyword EXTERNAL = const Keyword('EXTERNAL', "external", true);
+
+  static const Keyword FACTORY = const Keyword('FACTORY', "factory", true);
+
+  static const Keyword GET = const Keyword('GET', "get", true);
+
+  static const Keyword IMPLEMENTS =
+      const Keyword('IMPLEMENTS', "implements", true);
+
+  static const Keyword IMPORT = const Keyword('IMPORT', "import", true);
+
+  static const Keyword LIBRARY = const Keyword('LIBRARY', "library", true);
+
+  static const Keyword OPERATOR = const Keyword('OPERATOR', "operator", true);
+
+  static const Keyword PART = const Keyword('PART', "part", true);
+
+  static const Keyword SET = const Keyword('SET', "set", true);
+
+  static const Keyword STATIC = const Keyword('STATIC', "static", true);
+
+  static const Keyword TYPEDEF = const Keyword('TYPEDEF', "typedef", true);
+
+  static const List<Keyword> values = const [
+    ASSERT,
+    BREAK,
+    CASE,
+    CATCH,
+    CLASS,
+    CONST,
+    CONTINUE,
+    DEFAULT,
+    DO,
+    ELSE,
+    ENUM,
+    EXTENDS,
+    FALSE,
+    FINAL,
+    FINALLY,
+    FOR,
+    IF,
+    IN,
+    IS,
+    NEW,
+    NULL,
+    RETHROW,
+    RETURN,
+    SUPER,
+    SWITCH,
+    THIS,
+    THROW,
+    TRUE,
+    TRY,
+    VAR,
+    VOID,
+    WHILE,
+    WITH,
+    ABSTRACT,
+    AS,
+    DEFERRED,
+    DYNAMIC,
+    EXPORT,
+    EXTERNAL,
+    FACTORY,
+    GET,
+    IMPLEMENTS,
+    IMPORT,
+    LIBRARY,
+    OPERATOR,
+    PART,
+    SET,
+    STATIC,
+    TYPEDEF
+  ];
+
+  /**
+   * A table mapping the lexemes of keywords to the corresponding keyword.
+   */
+  static final Map<String, Keyword> keywords = _createKeywordMap();
+
+  /**
+   * The name of the keyword type.
+   */
+  final String name;
+
+  /**
+   * The lexeme for the keyword.
+   */
+  final String syntax;
+
+  /**
+   * A flag indicating whether the keyword is a pseudo-keyword. Pseudo keywords
+   * can be used as identifiers.
+   */
+  final bool isPseudoKeyword;
+
+  /**
+   * Initialize a newly created keyword to have the given [name] and [syntax].
+   * The keyword is a pseudo-keyword if the [isPseudoKeyword] flag is `true`.
+   */
+  const Keyword(this.name, this.syntax, [this.isPseudoKeyword = false]);
+
+  @override
+  String toString() => name;
+
+  /**
+   * Create a table mapping the lexemes of keywords to the corresponding keyword
+   * and return the table that was created.
+   */
+  static Map<String, Keyword> _createKeywordMap() {
+    LinkedHashMap<String, Keyword> result =
+        new LinkedHashMap<String, Keyword>();
+    for (Keyword keyword in values) {
+      result[keyword.syntax] = keyword;
+    }
+    return result;
+  }
+}
+
+/**
+ * A state in a state machine used to scan keywords.
+ */
+class KeywordState {
+  /**
+   * An empty transition table used by leaf states.
+   */
+  static List<KeywordState> _EMPTY_TABLE = new List<KeywordState>(26);
+
+  /**
+   * The initial state in the state machine.
+   */
+  static final KeywordState KEYWORD_STATE = _createKeywordStateTable();
+
+  /**
+   * A table mapping characters to the states to which those characters will
+   * transition. (The index into the array is the offset from the character
+   * `'a'` to the transitioning character.)
+   */
+  final List<KeywordState> _table;
+
+  /**
+   * The keyword that is recognized by this state, or `null` if this state is
+   * not a terminal state.
+   */
+  Keyword _keyword;
+
+  /**
+   * Initialize a newly created state to have the given transitions and to
+   * recognize the keyword with the given [syntax].
+   */
+  KeywordState(this._table, String syntax) {
+    this._keyword = (syntax == null) ? null : Keyword.keywords[syntax];
+  }
+
+  /**
+   * Return the keyword that was recognized by this state, or `null` if this
+   * state does not recognized a keyword.
+   */
+  Keyword keyword() => _keyword;
+
+  /**
+   * Return the state that follows this state on a transition of the given
+   * [character], or `null` if there is no valid state reachable from this state
+   * with such a transition.
+   */
+  KeywordState next(int character) => _table[character - 0x61];
+
+  /**
+   * Create the next state in the state machine where we have already recognized
+   * the subset of strings in the given array of [strings] starting at the given
+   * [offset] and having the given [length]. All of these strings have a common
+   * prefix and the next character is at the given [start] index.
+   */
+  static KeywordState _computeKeywordStateTable(
+      int start, List<String> strings, int offset, int length) {
+    List<KeywordState> result = new List<KeywordState>(26);
+    assert(length != 0);
+    int chunk = 0x0;
+    int chunkStart = -1;
+    bool isLeaf = false;
+    for (int i = offset; i < offset + length; i++) {
+      if (strings[i].length == start) {
+        isLeaf = true;
+      }
+      if (strings[i].length > start) {
+        int c = strings[i].codeUnitAt(start);
+        if (chunk != c) {
+          if (chunkStart != -1) {
+            result[chunk - 0x61] = _computeKeywordStateTable(
+                start + 1, strings, chunkStart, i - chunkStart);
+          }
+          chunkStart = i;
+          chunk = c;
+        }
+      }
+    }
+    if (chunkStart != -1) {
+      assert(result[chunk - 0x61] == null);
+      result[chunk - 0x61] = _computeKeywordStateTable(
+          start + 1, strings, chunkStart, offset + length - chunkStart);
+    } else {
+      assert(length == 1);
+      return new KeywordState(_EMPTY_TABLE, strings[offset]);
+    }
+    if (isLeaf) {
+      return new KeywordState(result, strings[offset]);
+    } else {
+      return new KeywordState(result, null);
+    }
+  }
+
+  /**
+   * Create and return the initial state in the state machine.
+   */
+  static KeywordState _createKeywordStateTable() {
+    List<Keyword> values = Keyword.values;
+    List<String> strings = new List<String>(values.length);
+    for (int i = 0; i < values.length; i++) {
+      strings[i] = values[i].syntax;
+    }
+    strings.sort();
+    return _computeKeywordStateTable(0, strings, 0, strings.length);
+  }
+}
+
+/**
+ * A token representing a keyword in the language.
+ */
+class KeywordToken extends Token {
+  /**
+   * The keyword being represented by this token.
+   */
+  final Keyword keyword;
+
+  /**
+   * Initialize a newly created token to represent the given [keyword] at the
+   * given [offset].
+   */
+  KeywordToken(this.keyword, int offset) : super(TokenType.KEYWORD, offset);
+
+  @override
+  String get lexeme => keyword.syntax;
+
+  @override
+  Token copy() => new KeywordToken(keyword, offset);
+
+  @override
+  Keyword value() => keyword;
+}
+
+/**
+ * A keyword token that is preceded by comments.
+ */
+class KeywordTokenWithComment extends KeywordToken {
+  /**
+   * The first comment in the list of comments that precede this token.
+   */
+  CommentToken _precedingComment;
+
+  /**
+   * Initialize a newly created token to to represent the given [keyword] at the
+   * given [offset] and to be preceded by the comments reachable from the given
+   * [comment].
+   */
+  KeywordTokenWithComment(Keyword keyword, int offset, this._precedingComment)
+      : super(keyword, offset) {
+    _setCommentParent(_precedingComment);
+  }
+
+  CommentToken get precedingComments => _precedingComment;
+
+  void set precedingComments(CommentToken comment) {
+    _precedingComment = comment;
+    _setCommentParent(_precedingComment);
+  }
+
+  @override
+  void applyDelta(int delta) {
+    super.applyDelta(delta);
+    Token token = precedingComments;
+    while (token != null) {
+      token.applyDelta(delta);
+      token = token.next;
+    }
+  }
+
+  @override
+  Token copy() => new KeywordTokenWithComment(
+      keyword, offset, copyComments(precedingComments));
+}
+
+/**
+ * The class `Scanner` implements a scanner for Dart code.
+ *
+ * The lexical structure of Dart is ambiguous without knowledge of the context
+ * in which a token is being scanned. For example, without context we cannot
+ * determine whether source of the form "<<" should be scanned as a single
+ * left-shift operator or as two left angle brackets. This scanner does not have
+ * any context, so it always resolves such conflicts by scanning the longest
+ * possible token.
+ */
+class Scanner {
+  /**
+   * The source being scanned.
+   */
+  final Source source;
+
+  /**
+   * The reader used to access the characters in the source.
+   */
+  final CharacterReader _reader;
+
+  /**
+   * The error listener that will be informed of any errors that are found
+   * during the scan.
+   */
+  final AnalysisErrorListener _errorListener;
+
+  /**
+   * The flag specifying whether documentation comments should be parsed.
+   */
+  bool _preserveComments = true;
+
+  /**
+   * The token pointing to the head of the linked list of tokens.
+   */
+  Token _tokens;
+
+  /**
+   * The last token that was scanned.
+   */
+  Token _tail;
+
+  /**
+   * The first token in the list of comment tokens found since the last
+   * non-comment token.
+   */
+  Token _firstComment;
+
+  /**
+   * The last token in the list of comment tokens found since the last
+   * non-comment token.
+   */
+  Token _lastComment;
+
+  /**
+   * The index of the first character of the current token.
+   */
+  int _tokenStart = 0;
+
+  /**
+   * A list containing the offsets of the first character of each line in the
+   * source code.
+   */
+  List<int> _lineStarts = new List<int>();
+
+  /**
+   * A list, treated something like a stack, of tokens representing the
+   * beginning of a matched pair. It is used to pair the end tokens with the
+   * begin tokens.
+   */
+  List<BeginToken> _groupingStack = new List<BeginToken>();
+
+  /**
+   * The index of the last item in the [_groupingStack], or `-1` if the stack is
+   * empty.
+   */
+  int _stackEnd = -1;
+
+  /**
+   * A flag indicating whether any unmatched groups were found during the parse.
+   */
+  bool _hasUnmatchedGroups = false;
+
+  /**
+   * Initialize a newly created scanner to scan characters from the given
+   * [source]. The given character [_reader] will be used to read the characters
+   * in the source. The given [_errorListener] will be informed of any errors
+   * that are found.
+   */
+  Scanner(this.source, this._reader, this._errorListener) {
+    _tokens = new Token(TokenType.EOF, -1);
+    _tokens.setNext(_tokens);
+    _tail = _tokens;
+    _tokenStart = -1;
+    _lineStarts.add(0);
+  }
+
+  /**
+   * Return the first token in the token stream that was scanned.
+   */
+  Token get firstToken => _tokens.next;
+
+  /**
+   * Return `true` if any unmatched groups were found during the parse.
+   */
+  bool get hasUnmatchedGroups => _hasUnmatchedGroups;
+
+  /**
+   * Return an array containing the offsets of the first character of each line
+   * in the source code.
+   */
+  List<int> get lineStarts => _lineStarts;
+
+  /**
+   * Set whether documentation tokens should be preserved.
+   */
+  void set preserveComments(bool preserveComments) {
+    this._preserveComments = preserveComments;
+  }
+
+  /**
+   * Return the last token that was scanned.
+   */
+  Token get tail => _tail;
+
+  /**
+   * Append the given [token] to the end of the token stream being scanned. This
+   * method is intended to be used by subclasses that copy existing tokens and
+   * should not normally be used because it will fail to correctly associate any
+   * comments with the token being passed in.
+   */
+  void appendToken(Token token) {
+    _tail = _tail.setNext(token);
+  }
+
+  int bigSwitch(int next) {
+    _beginToken();
+    if (next == 0xD) {
+      // '\r'
+      next = _reader.advance();
+      if (next == 0xA) {
+        // '\n'
+        next = _reader.advance();
+      }
+      recordStartOfLine();
+      return next;
+    } else if (next == 0xA) {
+      // '\n'
+      next = _reader.advance();
+      recordStartOfLine();
+      return next;
+    } else if (next == 0x9 || next == 0x20) {
+      // '\t' || ' '
+      return _reader.advance();
+    }
+    if (next == 0x72) {
+      // 'r'
+      int peek = _reader.peek();
+      if (peek == 0x22 || peek == 0x27) {
+        // '"' || "'"
+        int start = _reader.offset;
+        return _tokenizeString(_reader.advance(), start, true);
+      }
+    }
+    if (0x61 <= next && next <= 0x7A) {
+      // 'a'-'z'
+      return _tokenizeKeywordOrIdentifier(next, true);
+    }
+    if ((0x41 <= next && next <= 0x5A) || next == 0x5F || next == 0x24) {
+      // 'A'-'Z' || '_' || '$'
+      return _tokenizeIdentifier(next, _reader.offset, true);
+    }
+    if (next == 0x3C) {
+      // '<'
+      return _tokenizeLessThan(next);
+    }
+    if (next == 0x3E) {
+      // '>'
+      return _tokenizeGreaterThan(next);
+    }
+    if (next == 0x3D) {
+      // '='
+      return _tokenizeEquals(next);
+    }
+    if (next == 0x21) {
+      // '!'
+      return _tokenizeExclamation(next);
+    }
+    if (next == 0x2B) {
+      // '+'
+      return _tokenizePlus(next);
+    }
+    if (next == 0x2D) {
+      // '-'
+      return _tokenizeMinus(next);
+    }
+    if (next == 0x2A) {
+      // '*'
+      return _tokenizeMultiply(next);
+    }
+    if (next == 0x25) {
+      // '%'
+      return _tokenizePercent(next);
+    }
+    if (next == 0x26) {
+      // '&'
+      return _tokenizeAmpersand(next);
+    }
+    if (next == 0x7C) {
+      // '|'
+      return _tokenizeBar(next);
+    }
+    if (next == 0x5E) {
+      // '^'
+      return _tokenizeCaret(next);
+    }
+    if (next == 0x5B) {
+      // '['
+      return _tokenizeOpenSquareBracket(next);
+    }
+    if (next == 0x7E) {
+      // '~'
+      return _tokenizeTilde(next);
+    }
+    if (next == 0x5C) {
+      // '\\'
+      _appendTokenOfType(TokenType.BACKSLASH);
+      return _reader.advance();
+    }
+    if (next == 0x23) {
+      // '#'
+      return _tokenizeTag(next);
+    }
+    if (next == 0x28) {
+      // '('
+      _appendBeginToken(TokenType.OPEN_PAREN);
+      return _reader.advance();
+    }
+    if (next == 0x29) {
+      // ')'
+      _appendEndToken(TokenType.CLOSE_PAREN, TokenType.OPEN_PAREN);
+      return _reader.advance();
+    }
+    if (next == 0x2C) {
+      // ','
+      _appendTokenOfType(TokenType.COMMA);
+      return _reader.advance();
+    }
+    if (next == 0x3A) {
+      // ':'
+      _appendTokenOfType(TokenType.COLON);
+      return _reader.advance();
+    }
+    if (next == 0x3B) {
+      // ';'
+      _appendTokenOfType(TokenType.SEMICOLON);
+      return _reader.advance();
+    }
+    if (next == 0x3F) {
+      // '?'
+      return _tokenizeQuestion();
+    }
+    if (next == 0x5D) {
+      // ']'
+      _appendEndToken(
+          TokenType.CLOSE_SQUARE_BRACKET, TokenType.OPEN_SQUARE_BRACKET);
+      return _reader.advance();
+    }
+    if (next == 0x60) {
+      // '`'
+      _appendTokenOfType(TokenType.BACKPING);
+      return _reader.advance();
+    }
+    if (next == 0x7B) {
+      // '{'
+      _appendBeginToken(TokenType.OPEN_CURLY_BRACKET);
+      return _reader.advance();
+    }
+    if (next == 0x7D) {
+      // '}'
+      _appendEndToken(
+          TokenType.CLOSE_CURLY_BRACKET, TokenType.OPEN_CURLY_BRACKET);
+      return _reader.advance();
+    }
+    if (next == 0x2F) {
+      // '/'
+      return _tokenizeSlashOrComment(next);
+    }
+    if (next == 0x40) {
+      // '@'
+      _appendTokenOfType(TokenType.AT);
+      return _reader.advance();
+    }
+    if (next == 0x22 || next == 0x27) {
+      // '"' || "'"
+      return _tokenizeString(next, _reader.offset, false);
+    }
+    if (next == 0x2E) {
+      // '.'
+      return _tokenizeDotOrNumber(next);
+    }
+    if (next == 0x30) {
+      // '0'
+      return _tokenizeHexOrNumber(next);
+    }
+    if (0x31 <= next && next <= 0x39) {
+      // '1'-'9'
+      return _tokenizeNumber(next);
+    }
+    if (next == -1) {
+      // EOF
+      return -1;
+    }
+    _reportError(ScannerErrorCode.ILLEGAL_CHARACTER, [next]);
+    return _reader.advance();
+  }
+
+  /**
+   * Record the fact that we are at the beginning of a new line in the source.
+   */
+  void recordStartOfLine() {
+    _lineStarts.add(_reader.offset);
+  }
+
+  /**
+   * Record that the source begins on the given [line] and [column] at the
+   * current offset as given by the reader. Both the line and the column are
+   * one-based indexes. The line starts for lines before the given line will not
+   * be correct.
+   *
+   * This method must be invoked at most one time and must be invoked before
+   * scanning begins. The values provided must be sensible. The results are
+   * undefined if these conditions are violated.
+   */
+  void setSourceStart(int line, int column) {
+    int offset = _reader.offset;
+    if (line < 1 || column < 1 || offset < 0 || (line + column - 2) >= offset) {
+      return;
+    }
+    for (int i = 2; i < line; i++) {
+      _lineStarts.add(1);
+    }
+    _lineStarts.add(offset - column + 1);
+  }
+
+  /**
+   * Scan the source code to produce a list of tokens representing the source,
+   * and return the first token in the list of tokens that were produced.
+   */
+  Token tokenize() {
+    int next = _reader.advance();
+    while (next != -1) {
+      next = bigSwitch(next);
+    }
+    _appendEofToken();
+    return firstToken;
+  }
+
+  void _appendBeginToken(TokenType type) {
+    BeginToken token;
+    if (_firstComment == null) {
+      token = new BeginToken(type, _tokenStart);
+    } else {
+      token = new BeginTokenWithComment(type, _tokenStart, _firstComment);
+      _firstComment = null;
+      _lastComment = null;
+    }
+    _tail = _tail.setNext(token);
+    _groupingStack.add(token);
+    _stackEnd++;
+  }
+
+  void _appendCommentToken(TokenType type, String value) {
+    // Ignore comment tokens if client specified that it doesn't need them.
+    if (!_preserveComments) {
+      return;
+    }
+    // OK, remember comment tokens.
+    CommentToken token;
+    if (_isDocumentationComment(value)) {
+      token = new DocumentationCommentToken(type, value, _tokenStart);
+    } else {
+      token = new CommentToken(type, value, _tokenStart);
+    }
+    if (_firstComment == null) {
+      _firstComment = token;
+      _lastComment = _firstComment;
+    } else {
+      _lastComment = _lastComment.setNext(token);
+    }
+  }
+
+  void _appendEndToken(TokenType type, TokenType beginType) {
+    Token token;
+    if (_firstComment == null) {
+      token = new Token(type, _tokenStart);
+    } else {
+      token = new TokenWithComment(type, _tokenStart, _firstComment);
+      _firstComment = null;
+      _lastComment = null;
+    }
+    _tail = _tail.setNext(token);
+    if (_stackEnd >= 0) {
+      BeginToken begin = _groupingStack[_stackEnd];
+      if (begin.type == beginType) {
+        begin.endToken = token;
+        _groupingStack.removeAt(_stackEnd--);
+      }
+    }
+  }
+
+  void _appendEofToken() {
+    Token eofToken;
+    if (_firstComment == null) {
+      eofToken = new Token(TokenType.EOF, _reader.offset + 1);
+    } else {
+      eofToken = new TokenWithComment(
+          TokenType.EOF, _reader.offset + 1, _firstComment);
+      _firstComment = null;
+      _lastComment = null;
+    }
+    // The EOF token points to itself so that there is always infinite
+    // look-ahead.
+    eofToken.setNext(eofToken);
+    _tail = _tail.setNext(eofToken);
+    if (_stackEnd >= 0) {
+      _hasUnmatchedGroups = true;
+      // TODO(brianwilkerson) Fix the ungrouped tokens?
+    }
+  }
+
+  void _appendKeywordToken(Keyword keyword) {
+    if (_firstComment == null) {
+      _tail = _tail.setNext(new KeywordToken(keyword, _tokenStart));
+    } else {
+      _tail = _tail.setNext(
+          new KeywordTokenWithComment(keyword, _tokenStart, _firstComment));
+      _firstComment = null;
+      _lastComment = null;
+    }
+  }
+
+  void _appendStringToken(TokenType type, String value) {
+    if (_firstComment == null) {
+      _tail = _tail.setNext(new StringToken(type, value, _tokenStart));
+    } else {
+      _tail = _tail.setNext(
+          new StringTokenWithComment(type, value, _tokenStart, _firstComment));
+      _firstComment = null;
+      _lastComment = null;
+    }
+  }
+
+  void _appendStringTokenWithOffset(TokenType type, String value, int offset) {
+    if (_firstComment == null) {
+      _tail = _tail.setNext(new StringToken(type, value, _tokenStart + offset));
+    } else {
+      _tail = _tail.setNext(new StringTokenWithComment(
+          type, value, _tokenStart + offset, _firstComment));
+      _firstComment = null;
+      _lastComment = null;
+    }
+  }
+
+  void _appendTokenOfType(TokenType type) {
+    if (_firstComment == null) {
+      _tail = _tail.setNext(new Token(type, _tokenStart));
+    } else {
+      _tail =
+          _tail.setNext(new TokenWithComment(type, _tokenStart, _firstComment));
+      _firstComment = null;
+      _lastComment = null;
+    }
+  }
+
+  void _appendTokenOfTypeWithOffset(TokenType type, int offset) {
+    if (_firstComment == null) {
+      _tail = _tail.setNext(new Token(type, offset));
+    } else {
+      _tail = _tail.setNext(new TokenWithComment(type, offset, _firstComment));
+      _firstComment = null;
+      _lastComment = null;
+    }
+  }
+
+  void _beginToken() {
+    _tokenStart = _reader.offset;
+  }
+
+  /**
+   * Return the beginning token corresponding to a closing brace that was found
+   * while scanning inside a string interpolation expression. Tokens that cannot
+   * be matched with the closing brace will be dropped from the stack.
+   */
+  BeginToken _findTokenMatchingClosingBraceInInterpolationExpression() {
+    while (_stackEnd >= 0) {
+      BeginToken begin = _groupingStack[_stackEnd];
+      if (begin.type == TokenType.OPEN_CURLY_BRACKET ||
+          begin.type == TokenType.STRING_INTERPOLATION_EXPRESSION) {
+        return begin;
+      }
+      _hasUnmatchedGroups = true;
+      _groupingStack.removeAt(_stackEnd--);
+    }
+    //
+    // We should never get to this point because we wouldn't be inside a string
+    // interpolation expression unless we had previously found the start of the
+    // expression.
+    //
+    return null;
+  }
+
+  /**
+   * Report an error at the current offset. The [errorCode] is the error code
+   * indicating the nature of the error. The [arguments] are any arguments
+   * needed to complete the error message
+   */
+  void _reportError(ScannerErrorCode errorCode, [List<Object> arguments]) {
+    _errorListener.onError(
+        new AnalysisError(source, _reader.offset, 1, errorCode, arguments));
+  }
+
+  int _select(int choice, TokenType yesType, TokenType noType) {
+    int next = _reader.advance();
+    if (next == choice) {
+      _appendTokenOfType(yesType);
+      return _reader.advance();
+    } else {
+      _appendTokenOfType(noType);
+      return next;
+    }
+  }
+
+  int _selectWithOffset(
+      int choice, TokenType yesType, TokenType noType, int offset) {
+    int next = _reader.advance();
+    if (next == choice) {
+      _appendTokenOfTypeWithOffset(yesType, offset);
+      return _reader.advance();
+    } else {
+      _appendTokenOfTypeWithOffset(noType, offset);
+      return next;
+    }
+  }
+
+  int _tokenizeAmpersand(int next) {
+    // && &= &
+    next = _reader.advance();
+    if (next == 0x26) {
+      _appendTokenOfType(TokenType.AMPERSAND_AMPERSAND);
+      return _reader.advance();
+    } else if (next == 0x3D) {
+      _appendTokenOfType(TokenType.AMPERSAND_EQ);
+      return _reader.advance();
+    } else {
+      _appendTokenOfType(TokenType.AMPERSAND);
+      return next;
+    }
+  }
+
+  int _tokenizeBar(int next) {
+    // | || |=
+    next = _reader.advance();
+    if (next == 0x7C) {
+      _appendTokenOfType(TokenType.BAR_BAR);
+      return _reader.advance();
+    } else if (next == 0x3D) {
+      _appendTokenOfType(TokenType.BAR_EQ);
+      return _reader.advance();
+    } else {
+      _appendTokenOfType(TokenType.BAR);
+      return next;
+    }
+  }
+
+  int _tokenizeCaret(int next) =>
+      _select(0x3D, TokenType.CARET_EQ, TokenType.CARET);
+
+  int _tokenizeDotOrNumber(int next) {
+    int start = _reader.offset;
+    next = _reader.advance();
+    if (0x30 <= next && next <= 0x39) {
+      return _tokenizeFractionPart(next, start);
+    } else if (0x2E == next) {
+      return _select(
+          0x2E, TokenType.PERIOD_PERIOD_PERIOD, TokenType.PERIOD_PERIOD);
+    } else {
+      _appendTokenOfType(TokenType.PERIOD);
+      return next;
+    }
+  }
+
+  int _tokenizeEquals(int next) {
+    // = == =>
+    next = _reader.advance();
+    if (next == 0x3D) {
+      _appendTokenOfType(TokenType.EQ_EQ);
+      return _reader.advance();
+    } else if (next == 0x3E) {
+      _appendTokenOfType(TokenType.FUNCTION);
+      return _reader.advance();
+    }
+    _appendTokenOfType(TokenType.EQ);
+    return next;
+  }
+
+  int _tokenizeExclamation(int next) {
+    // ! !=
+    next = _reader.advance();
+    if (next == 0x3D) {
+      _appendTokenOfType(TokenType.BANG_EQ);
+      return _reader.advance();
+    }
+    _appendTokenOfType(TokenType.BANG);
+    return next;
+  }
+
+  int _tokenizeExponent(int next) {
+    if (next == 0x2B || next == 0x2D) {
+      next = _reader.advance();
+    }
+    bool hasDigits = false;
+    while (true) {
+      if (0x30 <= next && next <= 0x39) {
+        hasDigits = true;
+      } else {
+        if (!hasDigits) {
+          _reportError(ScannerErrorCode.MISSING_DIGIT);
+        }
+        return next;
+      }
+      next = _reader.advance();
+    }
+  }
+
+  int _tokenizeFractionPart(int next, int start) {
+    bool done = false;
+    bool hasDigit = false;
+    LOOP: while (!done) {
+      if (0x30 <= next && next <= 0x39) {
+        hasDigit = true;
+      } else if (0x65 == next || 0x45 == next) {
+        hasDigit = true;
+        next = _tokenizeExponent(_reader.advance());
+        done = true;
+        continue LOOP;
+      } else {
+        done = true;
+        continue LOOP;
+      }
+      next = _reader.advance();
+    }
+    if (!hasDigit) {
+      _appendStringToken(TokenType.INT, _reader.getString(start, -2));
+      if (0x2E == next) {
+        return _selectWithOffset(0x2E, TokenType.PERIOD_PERIOD_PERIOD,
+            TokenType.PERIOD_PERIOD, _reader.offset - 1);
+      }
+      _appendTokenOfTypeWithOffset(TokenType.PERIOD, _reader.offset - 1);
+      return bigSwitch(next);
+    }
+    _appendStringToken(
+        TokenType.DOUBLE, _reader.getString(start, next < 0 ? 0 : -1));
+    return next;
+  }
+
+  int _tokenizeGreaterThan(int next) {
+    // > >= >> >>=
+    next = _reader.advance();
+    if (0x3D == next) {
+      _appendTokenOfType(TokenType.GT_EQ);
+      return _reader.advance();
+    } else if (0x3E == next) {
+      next = _reader.advance();
+      if (0x3D == next) {
+        _appendTokenOfType(TokenType.GT_GT_EQ);
+        return _reader.advance();
+      } else {
+        _appendTokenOfType(TokenType.GT_GT);
+        return next;
+      }
+    } else {
+      _appendTokenOfType(TokenType.GT);
+      return next;
+    }
+  }
+
+  int _tokenizeHex(int next) {
+    int start = _reader.offset - 1;
+    bool hasDigits = false;
+    while (true) {
+      next = _reader.advance();
+      if ((0x30 <= next && next <= 0x39) ||
+          (0x41 <= next && next <= 0x46) ||
+          (0x61 <= next && next <= 0x66)) {
+        hasDigits = true;
+      } else {
+        if (!hasDigits) {
+          _reportError(ScannerErrorCode.MISSING_HEX_DIGIT);
+        }
+        _appendStringToken(
+            TokenType.HEXADECIMAL, _reader.getString(start, next < 0 ? 0 : -1));
+        return next;
+      }
+    }
+  }
+
+  int _tokenizeHexOrNumber(int next) {
+    int x = _reader.peek();
+    if (x == 0x78 || x == 0x58) {
+      _reader.advance();
+      return _tokenizeHex(x);
+    }
+    return _tokenizeNumber(next);
+  }
+
+  int _tokenizeIdentifier(int next, int start, bool allowDollar) {
+    while ((0x61 <= next && next <= 0x7A) ||
+        (0x41 <= next && next <= 0x5A) ||
+        (0x30 <= next && next <= 0x39) ||
+        next == 0x5F ||
+        (next == 0x24 && allowDollar)) {
+      next = _reader.advance();
+    }
+    _appendStringToken(
+        TokenType.IDENTIFIER, _reader.getString(start, next < 0 ? 0 : -1));
+    return next;
+  }
+
+  int _tokenizeInterpolatedExpression(int next, int start) {
+    _appendBeginToken(TokenType.STRING_INTERPOLATION_EXPRESSION);
+    next = _reader.advance();
+    while (next != -1) {
+      if (next == 0x7D) {
+        BeginToken begin =
+            _findTokenMatchingClosingBraceInInterpolationExpression();
+        if (begin == null) {
+          _beginToken();
+          _appendTokenOfType(TokenType.CLOSE_CURLY_BRACKET);
+          next = _reader.advance();
+          _beginToken();
+          return next;
+        } else if (begin.type == TokenType.OPEN_CURLY_BRACKET) {
+          _beginToken();
+          _appendEndToken(
+              TokenType.CLOSE_CURLY_BRACKET, TokenType.OPEN_CURLY_BRACKET);
+          next = _reader.advance();
+          _beginToken();
+        } else if (begin.type == TokenType.STRING_INTERPOLATION_EXPRESSION) {
+          _beginToken();
+          _appendEndToken(TokenType.CLOSE_CURLY_BRACKET,
+              TokenType.STRING_INTERPOLATION_EXPRESSION);
+          next = _reader.advance();
+          _beginToken();
+          return next;
+        }
+      } else {
+        next = bigSwitch(next);
+      }
+    }
+    return next;
+  }
+
+  int _tokenizeInterpolatedIdentifier(int next, int start) {
+    _appendStringTokenWithOffset(
+        TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 0);
+    if ((0x41 <= next && next <= 0x5A) ||
+        (0x61 <= next && next <= 0x7A) ||
+        next == 0x5F) {
+      _beginToken();
+      next = _tokenizeKeywordOrIdentifier(next, false);
+    }
+    _beginToken();
+    return next;
+  }
+
+  int _tokenizeKeywordOrIdentifier(int next, bool allowDollar) {
+    KeywordState state = KeywordState.KEYWORD_STATE;
+    int start = _reader.offset;
+    while (state != null && 0x61 <= next && next <= 0x7A) {
+      state = state.next(next);
+      next = _reader.advance();
+    }
+    if (state == null || state.keyword() == null) {
+      return _tokenizeIdentifier(next, start, allowDollar);
+    }
+    if ((0x41 <= next && next <= 0x5A) ||
+        (0x30 <= next && next <= 0x39) ||
+        next == 0x5F ||
+        next == 0x24) {
+      return _tokenizeIdentifier(next, start, allowDollar);
+    } else if (next < 128) {
+      _appendKeywordToken(state.keyword());
+      return next;
+    } else {
+      return _tokenizeIdentifier(next, start, allowDollar);
+    }
+  }
+
+  int _tokenizeLessThan(int next) {
+    // < <= << <<=
+    next = _reader.advance();
+    if (0x3D == next) {
+      _appendTokenOfType(TokenType.LT_EQ);
+      return _reader.advance();
+    } else if (0x3C == next) {
+      return _select(0x3D, TokenType.LT_LT_EQ, TokenType.LT_LT);
+    } else {
+      _appendTokenOfType(TokenType.LT);
+      return next;
+    }
+  }
+
+  int _tokenizeMinus(int next) {
+    // - -- -=
+    next = _reader.advance();
+    if (next == 0x2D) {
+      _appendTokenOfType(TokenType.MINUS_MINUS);
+      return _reader.advance();
+    } else if (next == 0x3D) {
+      _appendTokenOfType(TokenType.MINUS_EQ);
+      return _reader.advance();
+    } else {
+      _appendTokenOfType(TokenType.MINUS);
+      return next;
+    }
+  }
+
+  int _tokenizeMultiLineComment(int next) {
+    int nesting = 1;
+    next = _reader.advance();
+    while (true) {
+      if (-1 == next) {
+        _reportError(ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT);
+        _appendCommentToken(
+            TokenType.MULTI_LINE_COMMENT, _reader.getString(_tokenStart, 0));
+        return next;
+      } else if (0x2A == next) {
+        next = _reader.advance();
+        if (0x2F == next) {
+          --nesting;
+          if (0 == nesting) {
+            _appendCommentToken(TokenType.MULTI_LINE_COMMENT,
+                _reader.getString(_tokenStart, 0));
+            return _reader.advance();
+          } else {
+            next = _reader.advance();
+          }
+        }
+      } else if (0x2F == next) {
+        next = _reader.advance();
+        if (0x2A == next) {
+          next = _reader.advance();
+          ++nesting;
+        }
+      } else if (next == 0xD) {
+        next = _reader.advance();
+        if (next == 0xA) {
+          next = _reader.advance();
+        }
+        recordStartOfLine();
+      } else if (next == 0xA) {
+        next = _reader.advance();
+        recordStartOfLine();
+      } else {
+        next = _reader.advance();
+      }
+    }
+  }
+
+  int _tokenizeMultiLineRawString(int quoteChar, int start) {
+    int next = _reader.advance();
+    outer: while (next != -1) {
+      while (next != quoteChar) {
+        if (next == -1) {
+          break outer;
+        } else if (next == 0xD) {
+          next = _reader.advance();
+          if (next == 0xA) {
+            next = _reader.advance();
+          }
+          recordStartOfLine();
+        } else if (next == 0xA) {
+          next = _reader.advance();
+          recordStartOfLine();
+        } else {
+          next = _reader.advance();
+        }
+      }
+      next = _reader.advance();
+      if (next == quoteChar) {
+        next = _reader.advance();
+        if (next == quoteChar) {
+          _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+          return _reader.advance();
+        }
+      }
+    }
+    _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL);
+    _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+    return _reader.advance();
+  }
+
+  int _tokenizeMultiLineString(int quoteChar, int start, bool raw) {
+    if (raw) {
+      return _tokenizeMultiLineRawString(quoteChar, start);
+    }
+    int next = _reader.advance();
+    while (next != -1) {
+      if (next == 0x24) {
+        _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
+        next = _tokenizeStringInterpolation(start);
+        _beginToken();
+        start = _reader.offset;
+        continue;
+      }
+      if (next == quoteChar) {
+        next = _reader.advance();
+        if (next == quoteChar) {
+          next = _reader.advance();
+          if (next == quoteChar) {
+            _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+            return _reader.advance();
+          }
+        }
+        continue;
+      }
+      if (next == 0x5C) {
+        next = _reader.advance();
+        if (next == -1) {
+          break;
+        }
+        if (next == 0xD) {
+          next = _reader.advance();
+          if (next == 0xA) {
+            next = _reader.advance();
+          }
+          recordStartOfLine();
+        } else if (next == 0xA) {
+          recordStartOfLine();
+          next = _reader.advance();
+        } else {
+          next = _reader.advance();
+        }
+      } else if (next == 0xD) {
+        next = _reader.advance();
+        if (next == 0xA) {
+          next = _reader.advance();
+        }
+        recordStartOfLine();
+      } else if (next == 0xA) {
+        recordStartOfLine();
+        next = _reader.advance();
+      } else {
+        next = _reader.advance();
+      }
+    }
+    _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL);
+    if (start == _reader.offset) {
+      _appendStringTokenWithOffset(TokenType.STRING, "", 1);
+    } else {
+      _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+    }
+    return _reader.advance();
+  }
+
+  int _tokenizeMultiply(int next) =>
+      _select(0x3D, TokenType.STAR_EQ, TokenType.STAR);
+
+  int _tokenizeNumber(int next) {
+    int start = _reader.offset;
+    while (true) {
+      next = _reader.advance();
+      if (0x30 <= next && next <= 0x39) {
+        continue;
+      } else if (next == 0x2E) {
+        return _tokenizeFractionPart(_reader.advance(), start);
+      } else if (next == 0x65 || next == 0x45) {
+        return _tokenizeFractionPart(next, start);
+      } else {
+        _appendStringToken(
+            TokenType.INT, _reader.getString(start, next < 0 ? 0 : -1));
+        return next;
+      }
+    }
+  }
+
+  int _tokenizeOpenSquareBracket(int next) {
+    // [ []  []=
+    next = _reader.advance();
+    if (next == 0x5D) {
+      return _select(0x3D, TokenType.INDEX_EQ, TokenType.INDEX);
+    } else {
+      _appendBeginToken(TokenType.OPEN_SQUARE_BRACKET);
+      return next;
+    }
+  }
+
+  int _tokenizePercent(int next) =>
+      _select(0x3D, TokenType.PERCENT_EQ, TokenType.PERCENT);
+
+  int _tokenizePlus(int next) {
+    // + ++ +=
+    next = _reader.advance();
+    if (0x2B == next) {
+      _appendTokenOfType(TokenType.PLUS_PLUS);
+      return _reader.advance();
+    } else if (0x3D == next) {
+      _appendTokenOfType(TokenType.PLUS_EQ);
+      return _reader.advance();
+    } else {
+      _appendTokenOfType(TokenType.PLUS);
+      return next;
+    }
+  }
+
+  int _tokenizeQuestion() {
+    // ? ?. ?? ??=
+    int next = _reader.advance();
+    if (next == 0x2E) {
+      // '.'
+      _appendTokenOfType(TokenType.QUESTION_PERIOD);
+      return _reader.advance();
+    } else if (next == 0x3F) {
+      // '?'
+      next = _reader.advance();
+      if (next == 0x3D) {
+        // '='
+        _appendTokenOfType(TokenType.QUESTION_QUESTION_EQ);
+        return _reader.advance();
+      } else {
+        _appendTokenOfType(TokenType.QUESTION_QUESTION);
+        return next;
+      }
+    } else {
+      _appendTokenOfType(TokenType.QUESTION);
+      return next;
+    }
+  }
+
+  int _tokenizeSingleLineComment(int next) {
+    while (true) {
+      next = _reader.advance();
+      if (-1 == next) {
+        _appendCommentToken(
+            TokenType.SINGLE_LINE_COMMENT, _reader.getString(_tokenStart, 0));
+        return next;
+      } else if (0xA == next || 0xD == next) {
+        _appendCommentToken(
+            TokenType.SINGLE_LINE_COMMENT, _reader.getString(_tokenStart, -1));
+        return next;
+      }
+    }
+  }
+
+  int _tokenizeSingleLineRawString(int next, int quoteChar, int start) {
+    next = _reader.advance();
+    while (next != -1) {
+      if (next == quoteChar) {
+        _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+        return _reader.advance();
+      } else if (next == 0xD || next == 0xA) {
+        _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL);
+        _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
+        return _reader.advance();
+      }
+      next = _reader.advance();
+    }
+    _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL);
+    _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+    return _reader.advance();
+  }
+
+  int _tokenizeSingleLineString(int next, int quoteChar, int start) {
+    while (next != quoteChar) {
+      if (next == 0x5C) {
+        next = _reader.advance();
+      } else if (next == 0x24) {
+        _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
+        next = _tokenizeStringInterpolation(start);
+        _beginToken();
+        start = _reader.offset;
+        continue;
+      }
+      if (next <= 0xD && (next == 0xA || next == 0xD || next == -1)) {
+        _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL);
+        if (start == _reader.offset) {
+          _appendStringTokenWithOffset(TokenType.STRING, "", 1);
+        } else if (next == -1) {
+          _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+        } else {
+          _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
+        }
+        return _reader.advance();
+      }
+      next = _reader.advance();
+    }
+    _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+    return _reader.advance();
+  }
+
+  int _tokenizeSlashOrComment(int next) {
+    next = _reader.advance();
+    if (0x2A == next) {
+      return _tokenizeMultiLineComment(next);
+    } else if (0x2F == next) {
+      return _tokenizeSingleLineComment(next);
+    } else if (0x3D == next) {
+      _appendTokenOfType(TokenType.SLASH_EQ);
+      return _reader.advance();
+    } else {
+      _appendTokenOfType(TokenType.SLASH);
+      return next;
+    }
+  }
+
+  int _tokenizeString(int next, int start, bool raw) {
+    int quoteChar = next;
+    next = _reader.advance();
+    if (quoteChar == next) {
+      next = _reader.advance();
+      if (quoteChar == next) {
+        // Multiline string.
+        return _tokenizeMultiLineString(quoteChar, start, raw);
+      } else {
+        // Empty string.
+        _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
+        return next;
+      }
+    }
+    if (raw) {
+      return _tokenizeSingleLineRawString(next, quoteChar, start);
+    } else {
+      return _tokenizeSingleLineString(next, quoteChar, start);
+    }
+  }
+
+  int _tokenizeStringInterpolation(int start) {
+    _beginToken();
+    int next = _reader.advance();
+    if (next == 0x7B) {
+      return _tokenizeInterpolatedExpression(next, start);
+    } else {
+      return _tokenizeInterpolatedIdentifier(next, start);
+    }
+  }
+
+  int _tokenizeTag(int next) {
+    // # or #!.*[\n\r]
+    if (_reader.offset == 0) {
+      if (_reader.peek() == 0x21) {
+        do {
+          next = _reader.advance();
+        } while (next != 0xA && next != 0xD && next > 0);
+        _appendStringToken(
+            TokenType.SCRIPT_TAG, _reader.getString(_tokenStart, 0));
+        return next;
+      }
+    }
+    _appendTokenOfType(TokenType.HASH);
+    return _reader.advance();
+  }
+
+  int _tokenizeTilde(int next) {
+    // ~ ~/ ~/=
+    next = _reader.advance();
+    if (next == 0x2F) {
+      return _select(0x3D, TokenType.TILDE_SLASH_EQ, TokenType.TILDE_SLASH);
+    } else {
+      _appendTokenOfType(TokenType.TILDE);
+      return next;
+    }
+  }
+
+  /**
+   * Checks if [value] is a single-line or multi-line comment.
+   */
+  static bool _isDocumentationComment(String value) {
+    return StringUtilities.startsWith3(value, 0, 0x2F, 0x2F, 0x2F) ||
+        StringUtilities.startsWith3(value, 0, 0x2F, 0x2A, 0x2A);
+  }
+}
+
+/**
+ * The error codes used for errors detected by the scanner.
+ */
+class ScannerErrorCode extends ErrorCode {
+  static const ScannerErrorCode ILLEGAL_CHARACTER =
+      const ScannerErrorCode('ILLEGAL_CHARACTER', "Illegal character {0}");
+
+  static const ScannerErrorCode MISSING_DIGIT =
+      const ScannerErrorCode('MISSING_DIGIT', "Decimal digit expected");
+
+  static const ScannerErrorCode MISSING_HEX_DIGIT =
+      const ScannerErrorCode('MISSING_HEX_DIGIT', "Hexidecimal digit expected");
+
+  static const ScannerErrorCode MISSING_QUOTE =
+      const ScannerErrorCode('MISSING_QUOTE', "Expected quote (' or \")");
+
+  static const ScannerErrorCode UNABLE_GET_CONTENT = const ScannerErrorCode(
+      'UNABLE_GET_CONTENT', "Unable to get content: {0}");
+
+  static const ScannerErrorCode UNTERMINATED_MULTI_LINE_COMMENT =
+      const ScannerErrorCode(
+          'UNTERMINATED_MULTI_LINE_COMMENT', "Unterminated multi-line comment");
+
+  static const ScannerErrorCode UNTERMINATED_STRING_LITERAL =
+      const ScannerErrorCode(
+          'UNTERMINATED_STRING_LITERAL', "Unterminated string literal");
+
+  /**
+   * Initialize a newly created error code to have the given [name]. The message
+   * associated with the error will be created from the given [message]
+   * template. The correction associated with the error will be created from the
+   * given [correction] template.
+   */
+  const ScannerErrorCode(String name, String message, [String correction])
+      : super(name, message, correction);
+
+  @override
+  ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;
+
+  @override
+  ErrorType get type => ErrorType.SYNTACTIC_ERROR;
+}
+
+/**
+ * A token whose value is independent of it's type.
+ */
+class StringToken extends Token {
+  /**
+   * The lexeme represented by this token.
+   */
+  String _value;
+
+  /**
+   * Initialize a newly created token to represent a token of the given [type]
+   * with the given [value] at the given [offset].
+   */
+  StringToken(TokenType type, String value, int offset) : super(type, offset) {
+    this._value = StringUtilities.intern(value);
+  }
+
+  @override
+  String get lexeme => _value;
+
+  @override
+  Token copy() => new StringToken(type, _value, offset);
+
+  @override
+  String value() => _value;
+}
+
+/**
+ * A string token that is preceded by comments.
+ */
+class StringTokenWithComment extends StringToken {
+  /**
+   * The first comment in the list of comments that precede this token.
+   */
+  CommentToken _precedingComment;
+
+  /**
+   * Initialize a newly created token to have the given [type] at the given
+   * [offset] and to be preceded by the comments reachable from the given
+   * [comment].
+   */
+  StringTokenWithComment(
+      TokenType type, String value, int offset, this._precedingComment)
+      : super(type, value, offset) {
+    _setCommentParent(_precedingComment);
+  }
+
+  CommentToken get precedingComments => _precedingComment;
+
+  void set precedingComments(CommentToken comment) {
+    _precedingComment = comment;
+    _setCommentParent(_precedingComment);
+  }
+
+  @override
+  void applyDelta(int delta) {
+    super.applyDelta(delta);
+    Token token = precedingComments;
+    while (token != null) {
+      token.applyDelta(delta);
+      token = token.next;
+    }
+  }
+
+  @override
+  Token copy() => new StringTokenWithComment(
+      type, lexeme, offset, copyComments(precedingComments));
+}
+
+/**
+ * A [CharacterReader] that reads characters from a character sequence, but adds
+ * a delta when reporting the current character offset so that the character
+ * sequence can be a subsequence from a larger sequence.
+ */
+class SubSequenceReader extends CharSequenceReader {
+  /**
+   * The offset from the beginning of the file to the beginning of the source
+   * being scanned.
+   */
+  final int _offsetDelta;
+
+  /**
+   * Initialize a newly created reader to read the characters in the given
+   * [sequence]. The [_offsetDelta] is the offset from the beginning of the file
+   * to the beginning of the source being scanned
+   */
+  SubSequenceReader(String sequence, this._offsetDelta) : super(sequence);
+
+  @override
+  int get offset => _offsetDelta + super.offset;
+
+  @override
+  void set offset(int offset) {
+    super.offset = offset - _offsetDelta;
+  }
+
+  @override
+  String getString(int start, int endDelta) =>
+      super.getString(start - _offsetDelta, endDelta);
+}
+
+/**
+ * A token whose value is independent of it's type.
+ */
+class SyntheticStringToken extends StringToken {
+  /**
+   * Initialize a newly created token to represent a token of the given [type]
+   * with the given [value] at the given [offset].
+   */
+  SyntheticStringToken(TokenType type, String value, int offset)
+      : super(type, value, offset);
+
+  @override
+  bool get isSynthetic => true;
+}
+
+/**
+ * A token that was scanned from the input. Each token knows which tokens
+ * precede and follow it, acting as a link in a doubly linked list of tokens.
+ */
+class Token {
+  /**
+   * The type of the token.
+   */
+  final TokenType type;
+
+  /**
+   * The offset from the beginning of the file to the first character in the
+   * token.
+   */
+  int offset = 0;
+
+  /**
+   * The previous token in the token stream.
+   */
+  Token previous;
+
+  /**
+   * The next token in the token stream.
+   */
+  Token _next;
+
+  /**
+   * Initialize a newly created token to have the given [type] and [offset].
+   */
+  Token(this.type, this.offset);
+
+  /**
+   * Return the offset from the beginning of the file to the character after the
+   * last character of the token.
+   */
+  int get end => offset + length;
+
+  /**
+   * Return `true` if this token represents an operator.
+   */
+  bool get isOperator => type.isOperator;
+
+  /**
+   * Return `true` if this token is a synthetic token. A synthetic token is a
+   * token that was introduced by the parser in order to recover from an error
+   * in the code.
+   */
+  bool get isSynthetic => length == 0;
+
+  /**
+   * Return `true` if this token represents an operator that can be defined by
+   * users.
+   */
+  bool get isUserDefinableOperator => type.isUserDefinableOperator;
+
+  /**
+   * Return the number of characters in the node's source range.
+   */
+  int get length => lexeme.length;
+
+  /**
+   * Return the lexeme that represents this token.
+   */
+  String get lexeme => type.lexeme;
+
+  /**
+   * Return the next token in the token stream.
+   */
+  Token get next => _next;
+
+  /**
+   * Return the first comment in the list of comments that precede this token,
+   * or `null` if there are no comments preceding this token. Additional
+   * comments can be reached by following the token stream using [next] until
+   * `null` is returned.
+   *
+   * For example, if the original contents were "/* one */ /* two */ id", then
+   * the first preceding comment token will have a lexeme of "/* one */" and
+   * the next comment token will have a lexeme of "/* two */".
+   */
+  CommentToken get precedingComments => null;
+
+  /**
+   * Apply (add) the given [delta] to this token's offset.
+   */
+  void applyDelta(int delta) {
+    offset += delta;
+  }
+
+  /**
+   * Return a newly created token that is a copy of this token but that is not a
+   * part of any token stream.
+   */
+  Token copy() => new Token(type, offset);
+
+  /**
+   * Copy a linked list of comment tokens identical to the given comment tokens.
+   */
+  Token copyComments(Token token) {
+    if (token == null) {
+      return null;
+    }
+    Token head = token.copy();
+    Token tail = head;
+    token = token.next;
+    while (token != null) {
+      tail = tail.setNext(token.copy());
+      token = token.next;
+    }
+    return head;
+  }
+
+  /**
+   * Return `true` if this token has any one of the given [types].
+   */
+  bool matchesAny(List<TokenType> types) {
+    for (TokenType type in types) {
+      if (this.type == type) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Set the next token in the token stream to the given [token]. This has the
+   * side-effect of setting this token to be the previous token for the given
+   * token. Return the token that was passed in.
+   */
+  Token setNext(Token token) {
+    _next = token;
+    token.previous = this;
+    return token;
+  }
+
+  /**
+   * Set the next token in the token stream to the given token without changing
+   * which token is the previous token for the given token. Return the token
+   * that was passed in.
+   */
+  Token setNextWithoutSettingPrevious(Token token) {
+    _next = token;
+    return token;
+  }
+
+  @override
+  String toString() => lexeme;
+
+  /**
+   * Return the value of this token. For keyword tokens, this is the keyword
+   * associated with the token, for other tokens it is the lexeme associated
+   * with the token.
+   */
+  Object value() => type.lexeme;
+
+  /**
+   * Sets the `parent` property to `this` for the given [comment] and all the
+   * next tokens.
+   */
+  void _setCommentParent(CommentToken comment) {
+    while (comment != null) {
+      comment.parent = this;
+      comment = comment.next;
+    }
+  }
+
+  /**
+   * Compare the given [tokens] to find the token that appears first in the
+   * source being parsed. That is, return the left-most of all of the tokens.
+   * The list must be non-`null`, but the elements of the list are allowed to be
+   * `null`. Return the token with the smallest offset, or `null` if the list is
+   * empty or if all of the elements of the list are `null`.
+   */
+  static Token lexicallyFirst(List<Token> tokens) {
+    Token first = null;
+    int offset = -1;
+    for (Token token in tokens) {
+      if (token != null && (offset < 0 || token.offset < offset)) {
+        first = token;
+        offset = token.offset;
+      }
+    }
+    return first;
+  }
+}
+
+/**
+ * The classes (or groups) of tokens with a similar use.
+ */
+class TokenClass {
+  /**
+   * A value used to indicate that the token type is not part of any specific
+   * class of token.
+   */
+  static const TokenClass NO_CLASS = const TokenClass('NO_CLASS');
+
+  /**
+   * A value used to indicate that the token type is an additive operator.
+   */
+  static const TokenClass ADDITIVE_OPERATOR =
+      const TokenClass('ADDITIVE_OPERATOR', 13);
+
+  /**
+   * A value used to indicate that the token type is an assignment operator.
+   */
+  static const TokenClass ASSIGNMENT_OPERATOR =
+      const TokenClass('ASSIGNMENT_OPERATOR', 1);
+
+  /**
+   * A value used to indicate that the token type is a bitwise-and operator.
+   */
+  static const TokenClass BITWISE_AND_OPERATOR =
+      const TokenClass('BITWISE_AND_OPERATOR', 11);
+
+  /**
+   * A value used to indicate that the token type is a bitwise-or operator.
+   */
+  static const TokenClass BITWISE_OR_OPERATOR =
+      const TokenClass('BITWISE_OR_OPERATOR', 9);
+
+  /**
+   * A value used to indicate that the token type is a bitwise-xor operator.
+   */
+  static const TokenClass BITWISE_XOR_OPERATOR =
+      const TokenClass('BITWISE_XOR_OPERATOR', 10);
+
+  /**
+   * A value used to indicate that the token type is a cascade operator.
+   */
+  static const TokenClass CASCADE_OPERATOR =
+      const TokenClass('CASCADE_OPERATOR', 2);
+
+  /**
+   * A value used to indicate that the token type is a conditional operator.
+   */
+  static const TokenClass CONDITIONAL_OPERATOR =
+      const TokenClass('CONDITIONAL_OPERATOR', 3);
+
+  /**
+   * A value used to indicate that the token type is an equality operator.
+   */
+  static const TokenClass EQUALITY_OPERATOR =
+      const TokenClass('EQUALITY_OPERATOR', 7);
+
+  /**
+   * A value used to indicate that the token type is an if-null operator.
+   */
+  static const TokenClass IF_NULL_OPERATOR =
+      const TokenClass('IF_NULL_OPERATOR', 4);
+
+  /**
+   * A value used to indicate that the token type is a logical-and operator.
+   */
+  static const TokenClass LOGICAL_AND_OPERATOR =
+      const TokenClass('LOGICAL_AND_OPERATOR', 6);
+
+  /**
+   * A value used to indicate that the token type is a logical-or operator.
+   */
+  static const TokenClass LOGICAL_OR_OPERATOR =
+      const TokenClass('LOGICAL_OR_OPERATOR', 5);
+
+  /**
+   * A value used to indicate that the token type is a multiplicative operator.
+   */
+  static const TokenClass MULTIPLICATIVE_OPERATOR =
+      const TokenClass('MULTIPLICATIVE_OPERATOR', 14);
+
+  /**
+   * A value used to indicate that the token type is a relational operator.
+   */
+  static const TokenClass RELATIONAL_OPERATOR =
+      const TokenClass('RELATIONAL_OPERATOR', 8);
+
+  /**
+   * A value used to indicate that the token type is a shift operator.
+   */
+  static const TokenClass SHIFT_OPERATOR =
+      const TokenClass('SHIFT_OPERATOR', 12);
+
+  /**
+   * A value used to indicate that the token type is a unary operator.
+   */
+  static const TokenClass UNARY_POSTFIX_OPERATOR =
+      const TokenClass('UNARY_POSTFIX_OPERATOR', 16);
+
+  /**
+   * A value used to indicate that the token type is a unary operator.
+   */
+  static const TokenClass UNARY_PREFIX_OPERATOR =
+      const TokenClass('UNARY_PREFIX_OPERATOR', 15);
+
+  /**
+   * The name of the token class.
+   */
+  final String name;
+
+  /**
+   * The precedence of tokens of this class, or `0` if the such tokens do not
+   * represent an operator.
+   */
+  final int precedence;
+
+  const TokenClass(this.name, [this.precedence = 0]);
+
+  @override
+  String toString() => name;
+}
+
+/**
+ * The types of tokens that can be returned by the scanner.
+ */
+class TokenType {
+  /**
+   * The type of the token that marks the end of the input.
+   */
+  static const TokenType EOF = const TokenType_EOF('EOF');
+
+  static const TokenType DOUBLE = const TokenType('DOUBLE');
+
+  static const TokenType HEXADECIMAL = const TokenType('HEXADECIMAL');
+
+  static const TokenType IDENTIFIER = const TokenType('IDENTIFIER');
+
+  static const TokenType INT = const TokenType('INT');
+
+  static const TokenType KEYWORD = const TokenType('KEYWORD');
+
+  static const TokenType MULTI_LINE_COMMENT =
+      const TokenType('MULTI_LINE_COMMENT');
+
+  static const TokenType SCRIPT_TAG = const TokenType('SCRIPT_TAG');
+
+  static const TokenType SINGLE_LINE_COMMENT =
+      const TokenType('SINGLE_LINE_COMMENT');
+
+  static const TokenType STRING = const TokenType('STRING');
+
+  static const TokenType AMPERSAND =
+      const TokenType('AMPERSAND', TokenClass.BITWISE_AND_OPERATOR, "&");
+
+  static const TokenType AMPERSAND_AMPERSAND = const TokenType(
+      'AMPERSAND_AMPERSAND', TokenClass.LOGICAL_AND_OPERATOR, "&&");
+
+  static const TokenType AMPERSAND_EQ =
+      const TokenType('AMPERSAND_EQ', TokenClass.ASSIGNMENT_OPERATOR, "&=");
+
+  static const TokenType AT = const TokenType('AT', TokenClass.NO_CLASS, "@");
+
+  static const TokenType BANG =
+      const TokenType('BANG', TokenClass.UNARY_PREFIX_OPERATOR, "!");
+
+  static const TokenType BANG_EQ =
+      const TokenType('BANG_EQ', TokenClass.EQUALITY_OPERATOR, "!=");
+
+  static const TokenType BAR =
+      const TokenType('BAR', TokenClass.BITWISE_OR_OPERATOR, "|");
+
+  static const TokenType BAR_BAR =
+      const TokenType('BAR_BAR', TokenClass.LOGICAL_OR_OPERATOR, "||");
+
+  static const TokenType BAR_EQ =
+      const TokenType('BAR_EQ', TokenClass.ASSIGNMENT_OPERATOR, "|=");
+
+  static const TokenType COLON =
+      const TokenType('COLON', TokenClass.NO_CLASS, ":");
+
+  static const TokenType COMMA =
+      const TokenType('COMMA', TokenClass.NO_CLASS, ",");
+
+  static const TokenType CARET =
+      const TokenType('CARET', TokenClass.BITWISE_XOR_OPERATOR, "^");
+
+  static const TokenType CARET_EQ =
+      const TokenType('CARET_EQ', TokenClass.ASSIGNMENT_OPERATOR, "^=");
+
+  static const TokenType CLOSE_CURLY_BRACKET =
+      const TokenType('CLOSE_CURLY_BRACKET', TokenClass.NO_CLASS, "}");
+
+  static const TokenType CLOSE_PAREN =
+      const TokenType('CLOSE_PAREN', TokenClass.NO_CLASS, ")");
+
+  static const TokenType CLOSE_SQUARE_BRACKET =
+      const TokenType('CLOSE_SQUARE_BRACKET', TokenClass.NO_CLASS, "]");
+
+  static const TokenType EQ =
+      const TokenType('EQ', TokenClass.ASSIGNMENT_OPERATOR, "=");
+
+  static const TokenType EQ_EQ =
+      const TokenType('EQ_EQ', TokenClass.EQUALITY_OPERATOR, "==");
+
+  static const TokenType FUNCTION =
+      const TokenType('FUNCTION', TokenClass.NO_CLASS, "=>");
+
+  static const TokenType GT =
+      const TokenType('GT', TokenClass.RELATIONAL_OPERATOR, ">");
+
+  static const TokenType GT_EQ =
+      const TokenType('GT_EQ', TokenClass.RELATIONAL_OPERATOR, ">=");
+
+  static const TokenType GT_GT =
+      const TokenType('GT_GT', TokenClass.SHIFT_OPERATOR, ">>");
+
+  static const TokenType GT_GT_EQ =
+      const TokenType('GT_GT_EQ', TokenClass.ASSIGNMENT_OPERATOR, ">>=");
+
+  static const TokenType HASH =
+      const TokenType('HASH', TokenClass.NO_CLASS, "#");
+
+  static const TokenType INDEX =
+      const TokenType('INDEX', TokenClass.UNARY_POSTFIX_OPERATOR, "[]");
+
+  static const TokenType INDEX_EQ =
+      const TokenType('INDEX_EQ', TokenClass.UNARY_POSTFIX_OPERATOR, "[]=");
+
+  static const TokenType IS =
+      const TokenType('IS', TokenClass.RELATIONAL_OPERATOR, "is");
+
+  static const TokenType LT =
+      const TokenType('LT', TokenClass.RELATIONAL_OPERATOR, "<");
+
+  static const TokenType LT_EQ =
+      const TokenType('LT_EQ', TokenClass.RELATIONAL_OPERATOR, "<=");
+
+  static const TokenType LT_LT =
+      const TokenType('LT_LT', TokenClass.SHIFT_OPERATOR, "<<");
+
+  static const TokenType LT_LT_EQ =
+      const TokenType('LT_LT_EQ', TokenClass.ASSIGNMENT_OPERATOR, "<<=");
+
+  static const TokenType MINUS =
+      const TokenType('MINUS', TokenClass.ADDITIVE_OPERATOR, "-");
+
+  static const TokenType MINUS_EQ =
+      const TokenType('MINUS_EQ', TokenClass.ASSIGNMENT_OPERATOR, "-=");
+
+  static const TokenType MINUS_MINUS =
+      const TokenType('MINUS_MINUS', TokenClass.UNARY_PREFIX_OPERATOR, "--");
+
+  static const TokenType OPEN_CURLY_BRACKET =
+      const TokenType('OPEN_CURLY_BRACKET', TokenClass.NO_CLASS, "{");
+
+  static const TokenType OPEN_PAREN =
+      const TokenType('OPEN_PAREN', TokenClass.UNARY_POSTFIX_OPERATOR, "(");
+
+  static const TokenType OPEN_SQUARE_BRACKET = const TokenType(
+      'OPEN_SQUARE_BRACKET', TokenClass.UNARY_POSTFIX_OPERATOR, "[");
+
+  static const TokenType PERCENT =
+      const TokenType('PERCENT', TokenClass.MULTIPLICATIVE_OPERATOR, "%");
+
+  static const TokenType PERCENT_EQ =
+      const TokenType('PERCENT_EQ', TokenClass.ASSIGNMENT_OPERATOR, "%=");
+
+  static const TokenType PERIOD =
+      const TokenType('PERIOD', TokenClass.UNARY_POSTFIX_OPERATOR, ".");
+
+  static const TokenType PERIOD_PERIOD =
+      const TokenType('PERIOD_PERIOD', TokenClass.CASCADE_OPERATOR, "..");
+
+  static const TokenType PLUS =
+      const TokenType('PLUS', TokenClass.ADDITIVE_OPERATOR, "+");
+
+  static const TokenType PLUS_EQ =
+      const TokenType('PLUS_EQ', TokenClass.ASSIGNMENT_OPERATOR, "+=");
+
+  static const TokenType PLUS_PLUS =
+      const TokenType('PLUS_PLUS', TokenClass.UNARY_PREFIX_OPERATOR, "++");
+
+  static const TokenType QUESTION =
+      const TokenType('QUESTION', TokenClass.CONDITIONAL_OPERATOR, "?");
+
+  static const TokenType QUESTION_PERIOD = const TokenType(
+      'QUESTION_PERIOD', TokenClass.UNARY_POSTFIX_OPERATOR, '?.');
+
+  static const TokenType QUESTION_QUESTION =
+      const TokenType('QUESTION_QUESTION', TokenClass.IF_NULL_OPERATOR, '??');
+
+  static const TokenType QUESTION_QUESTION_EQ = const TokenType(
+      'QUESTION_QUESTION_EQ', TokenClass.ASSIGNMENT_OPERATOR, '??=');
+
+  static const TokenType SEMICOLON =
+      const TokenType('SEMICOLON', TokenClass.NO_CLASS, ";");
+
+  static const TokenType SLASH =
+      const TokenType('SLASH', TokenClass.MULTIPLICATIVE_OPERATOR, "/");
+
+  static const TokenType SLASH_EQ =
+      const TokenType('SLASH_EQ', TokenClass.ASSIGNMENT_OPERATOR, "/=");
+
+  static const TokenType STAR =
+      const TokenType('STAR', TokenClass.MULTIPLICATIVE_OPERATOR, "*");
+
+  static const TokenType STAR_EQ =
+      const TokenType('STAR_EQ', TokenClass.ASSIGNMENT_OPERATOR, "*=");
+
+  static const TokenType STRING_INTERPOLATION_EXPRESSION = const TokenType(
+      'STRING_INTERPOLATION_EXPRESSION', TokenClass.NO_CLASS, "\${");
+
+  static const TokenType STRING_INTERPOLATION_IDENTIFIER = const TokenType(
+      'STRING_INTERPOLATION_IDENTIFIER', TokenClass.NO_CLASS, "\$");
+
+  static const TokenType TILDE =
+      const TokenType('TILDE', TokenClass.UNARY_PREFIX_OPERATOR, "~");
+
+  static const TokenType TILDE_SLASH =
+      const TokenType('TILDE_SLASH', TokenClass.MULTIPLICATIVE_OPERATOR, "~/");
+
+  static const TokenType TILDE_SLASH_EQ =
+      const TokenType('TILDE_SLASH_EQ', TokenClass.ASSIGNMENT_OPERATOR, "~/=");
+
+  static const TokenType BACKPING =
+      const TokenType('BACKPING', TokenClass.NO_CLASS, "`");
+
+  static const TokenType BACKSLASH =
+      const TokenType('BACKSLASH', TokenClass.NO_CLASS, "\\");
+
+  static const TokenType PERIOD_PERIOD_PERIOD =
+      const TokenType('PERIOD_PERIOD_PERIOD', TokenClass.NO_CLASS, "...");
+
+  /**
+   * The class of the token.
+   */
+  final TokenClass _tokenClass;
+
+  /**
+   * The name of the token type.
+   */
+  final String name;
+
+  /**
+   * The lexeme that defines this type of token, or `null` if there is more than
+   * one possible lexeme for this type of token.
+   */
+  final String lexeme;
+
+  const TokenType(this.name,
+      [this._tokenClass = TokenClass.NO_CLASS, this.lexeme = null]);
+
+  /**
+   * Return `true` if this type of token represents an additive operator.
+   */
+  bool get isAdditiveOperator => _tokenClass == TokenClass.ADDITIVE_OPERATOR;
+
+  /**
+   * Return `true` if this type of token represents an assignment operator.
+   */
+  bool get isAssignmentOperator =>
+      _tokenClass == TokenClass.ASSIGNMENT_OPERATOR;
+
+  /**
+   * Return `true` if this type of token represents an associative operator. An
+   * associative operator is an operator for which the following equality is
+   * true: `(a * b) * c == a * (b * c)`. In other words, if the result of
+   * applying the operator to multiple operands does not depend on the order in
+   * which those applications occur.
+   *
+   * Note: This method considers the logical-and and logical-or operators to be
+   * associative, even though the order in which the application of those
+   * operators can have an effect because evaluation of the right-hand operand
+   * is conditional.
+   */
+  bool get isAssociativeOperator => this == AMPERSAND ||
+      this == AMPERSAND_AMPERSAND ||
+      this == BAR ||
+      this == BAR_BAR ||
+      this == CARET ||
+      this == PLUS ||
+      this == STAR;
+
+  /**
+   * Return `true` if this type of token represents an equality operator.
+   */
+  bool get isEqualityOperator => _tokenClass == TokenClass.EQUALITY_OPERATOR;
+
+  /**
+   * Return `true` if this type of token represents an increment operator.
+   */
+  bool get isIncrementOperator =>
+      identical(lexeme, "++") || identical(lexeme, "--");
+
+  /**
+   * Return `true` if this type of token represents a multiplicative operator.
+   */
+  bool get isMultiplicativeOperator =>
+      _tokenClass == TokenClass.MULTIPLICATIVE_OPERATOR;
+
+  /**
+   * Return `true` if this token type represents an operator.
+   */
+  bool get isOperator => _tokenClass != TokenClass.NO_CLASS &&
+      this != OPEN_PAREN &&
+      this != OPEN_SQUARE_BRACKET &&
+      this != PERIOD;
+
+  /**
+   * Return `true` if this type of token represents a relational operator.
+   */
+  bool get isRelationalOperator =>
+      _tokenClass == TokenClass.RELATIONAL_OPERATOR;
+
+  /**
+   * Return `true` if this type of token represents a shift operator.
+   */
+  bool get isShiftOperator => _tokenClass == TokenClass.SHIFT_OPERATOR;
+
+  /**
+   * Return `true` if this type of token represents a unary postfix operator.
+   */
+  bool get isUnaryPostfixOperator =>
+      _tokenClass == TokenClass.UNARY_POSTFIX_OPERATOR;
+
+  /**
+   * Return `true` if this type of token represents a unary prefix operator.
+   */
+  bool get isUnaryPrefixOperator =>
+      _tokenClass == TokenClass.UNARY_PREFIX_OPERATOR;
+
+  /**
+   * Return `true` if this token type represents an operator that can be defined
+   * by users.
+   */
+  bool get isUserDefinableOperator => identical(lexeme, "==") ||
+      identical(lexeme, "~") ||
+      identical(lexeme, "[]") ||
+      identical(lexeme, "[]=") ||
+      identical(lexeme, "*") ||
+      identical(lexeme, "/") ||
+      identical(lexeme, "%") ||
+      identical(lexeme, "~/") ||
+      identical(lexeme, "+") ||
+      identical(lexeme, "-") ||
+      identical(lexeme, "<<") ||
+      identical(lexeme, ">>") ||
+      identical(lexeme, ">=") ||
+      identical(lexeme, ">") ||
+      identical(lexeme, "<=") ||
+      identical(lexeme, "<") ||
+      identical(lexeme, "&") ||
+      identical(lexeme, "^") ||
+      identical(lexeme, "|");
+
+  /**
+   * Return the precedence of the token, or `0` if the token does not represent
+   * an operator.
+   */
+  int get precedence => _tokenClass.precedence;
+
+  @override
+  String toString() => name;
+}
+
+class TokenType_EOF extends TokenType {
+  const TokenType_EOF(String name) : super(name, TokenClass.NO_CLASS, "");
+
+  @override
+  String toString() => "-eof-";
+}
+
+/**
+ * A normal token that is preceded by comments.
+ */
+class TokenWithComment extends Token {
+  /**
+   * The first comment in the list of comments that precede this token.
+   */
+  CommentToken _precedingComment;
+
+  /**
+   * Initialize a newly created token to have the given [type] at the given
+   * [offset] and to be preceded by the comments reachable from the given
+   * [comment].
+   */
+  TokenWithComment(TokenType type, int offset, this._precedingComment)
+      : super(type, offset) {
+    _setCommentParent(_precedingComment);
+  }
+
+  CommentToken get precedingComments => _precedingComment;
+
+  void set precedingComments(CommentToken comment) {
+    _precedingComment = comment;
+    _setCommentParent(_precedingComment);
+  }
+
+  @override
+  Token copy() => new TokenWithComment(type, offset, precedingComments);
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/sdk.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/sdk.dart
new file mode 100644
index 0000000..1bf502b
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/sdk.dart
@@ -0,0 +1,384 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.sdk;
+
+import 'dart:collection';
+
+import 'ast.dart';
+import 'engine.dart' show AnalysisContext;
+import 'source.dart' show ContentCache, Source, UriKind;
+
+/**
+ * A Dart SDK installed in a specified location.
+ */
+abstract class DartSdk {
+  /**
+   * The short name of the dart SDK 'async' library.
+   */
+  static final String DART_ASYNC = "dart:async";
+
+  /**
+   * The short name of the dart SDK 'core' library.
+   */
+  static final String DART_CORE = "dart:core";
+
+  /**
+   * The short name of the dart SDK 'html' library.
+   */
+  static final String DART_HTML = "dart:html";
+
+  /**
+   * The version number that is returned when the real version number could not
+   * be determined.
+   */
+  static final String DEFAULT_VERSION = "0";
+
+  /**
+   * Return the analysis context used for all of the sources in this [DartSdk].
+   */
+  AnalysisContext get context;
+
+  /**
+   * Return a list containing all of the libraries defined in this SDK.
+   */
+  List<SdkLibrary> get sdkLibraries;
+
+  /**
+   * Return the revision number of this SDK, or `"0"` if the revision number
+   * cannot be discovered.
+   */
+  String get sdkVersion;
+
+  /**
+   * Return a list containing the library URI's for the libraries defined in
+   * this SDK.
+   */
+  List<String> get uris;
+
+  /**
+   * Return a source representing the given 'file:' [uri] if the file is in this
+   * SDK, or `null` if the file is not in this SDK.
+   */
+  Source fromFileUri(Uri uri);
+
+  /**
+   * Return the library representing the library with the given 'dart:' [uri],
+   * or `null` if the given URI does not denote a library in this SDK.
+   */
+  SdkLibrary getSdkLibrary(String uri);
+
+  /**
+   * Return the source representing the library with the given 'dart:' [uri], or
+   * `null` if the given URI does not denote a library in this SDK.
+   */
+  Source mapDartUri(String uri);
+}
+
+/**
+ * A map from Dart library URI's to the [SdkLibraryImpl] representing that
+ * library.
+ */
+class LibraryMap {
+  /**
+   * A table mapping Dart library URI's to the library.
+   */
+  HashMap<String, SdkLibraryImpl> _libraryMap =
+      new HashMap<String, SdkLibraryImpl>();
+
+  /**
+   * Return a list containing all of the sdk libraries in this mapping.
+   */
+  List<SdkLibrary> get sdkLibraries => new List.from(_libraryMap.values);
+
+  /**
+   * Return a list containing the library URI's for which a mapping is available.
+   */
+  List<String> get uris => new List.from(_libraryMap.keys.toSet());
+
+  /**
+   * Return the library with the given 'dart:' [uri], or `null` if the URI does
+   * not map to a library.
+   */
+  SdkLibrary getLibrary(String uri) => _libraryMap[uri];
+
+  /**
+   * Set the library with the given 'dart:' [uri] to the given [library].
+   */
+  void setLibrary(String dartUri, SdkLibraryImpl library) {
+    _libraryMap[dartUri] = library;
+  }
+
+  /**
+   * Return the number of library URI's for which a mapping is available.
+   */
+  int size() => _libraryMap.length;
+}
+
+class SdkLibrariesReader_LibraryBuilder extends RecursiveAstVisitor<Object> {
+  /**
+   * The prefix added to the name of a library to form the URI used in code to
+   * reference the library.
+   */
+  static String _LIBRARY_PREFIX = "dart:";
+
+  /**
+   * The name of the optional parameter used to indicate whether the library is
+   * an implementation library.
+   */
+  static String _IMPLEMENTATION = "implementation";
+
+  /**
+   * The name of the optional parameter used to specify the path used when
+   * compiling for dart2js.
+   */
+  static String _DART2JS_PATH = "dart2jsPath";
+
+  /**
+   * The name of the optional parameter used to indicate whether the library is
+   * documented.
+   */
+  static String _DOCUMENTED = "documented";
+
+  /**
+   * The name of the optional parameter used to specify the category of the
+   * library.
+   */
+  static String _CATEGORY = "category";
+
+  /**
+   * The name of the optional parameter used to specify the platforms on which
+   * the library can be used.
+   */
+  static String _PLATFORMS = "platforms";
+
+  /**
+   * The value of the [PLATFORMS] parameter used to specify that the library can
+   * be used on the VM.
+   */
+  static String _VM_PLATFORM = "VM_PLATFORM";
+
+  /**
+   * A flag indicating whether the dart2js path should be used when it is
+   * available.
+   */
+  final bool _useDart2jsPaths;
+
+  /**
+   * The library map that is populated by visiting the AST structure parsed from
+   * the contents of the libraries file.
+   */
+  LibraryMap _librariesMap = new LibraryMap();
+
+  /**
+   * Initialize a newly created library builder to use the dart2js path if
+   * [_useDart2jsPaths] is `true`.
+   */
+  SdkLibrariesReader_LibraryBuilder(this._useDart2jsPaths);
+
+  /**
+   * Return the library map that was populated by visiting the AST structure
+   * parsed from the contents of the libraries file.
+   */
+  LibraryMap get librariesMap => _librariesMap;
+
+  @override
+  Object visitMapLiteralEntry(MapLiteralEntry node) {
+    String libraryName = null;
+    Expression key = node.key;
+    if (key is SimpleStringLiteral) {
+      libraryName = "$_LIBRARY_PREFIX${key.value}";
+    }
+    Expression value = node.value;
+    if (value is InstanceCreationExpression) {
+      SdkLibraryImpl library = new SdkLibraryImpl(libraryName);
+      List<Expression> arguments = value.argumentList.arguments;
+      for (Expression argument in arguments) {
+        if (argument is SimpleStringLiteral) {
+          library.path = argument.value;
+        } else if (argument is NamedExpression) {
+          String name = argument.name.label.name;
+          Expression expression = argument.expression;
+          if (name == _CATEGORY) {
+            library.category = (expression as SimpleStringLiteral).value;
+          } else if (name == _IMPLEMENTATION) {
+            library.implementation = (expression as BooleanLiteral).value;
+          } else if (name == _DOCUMENTED) {
+            library.documented = (expression as BooleanLiteral).value;
+          } else if (name == _PLATFORMS) {
+            if (expression is SimpleIdentifier) {
+              String identifier = expression.name;
+              if (identifier == _VM_PLATFORM) {
+                library.setVmLibrary();
+              } else {
+                library.setDart2JsLibrary();
+              }
+            }
+          } else if (_useDart2jsPaths && name == _DART2JS_PATH) {
+            if (expression is SimpleStringLiteral) {
+              library.path = expression.value;
+            }
+          }
+        }
+      }
+      _librariesMap.setLibrary(libraryName, library);
+    }
+    return null;
+  }
+}
+
+/**
+ * Represents a single library in the SDK
+ */
+abstract class SdkLibrary {
+  /**
+   * Return the name of the category containing the library.
+   */
+  String get category;
+
+  /**
+   * Return `true` if this library can be compiled to JavaScript by dart2js.
+   */
+  bool get isDart2JsLibrary;
+
+  /**
+   * Return `true` if the library is documented.
+   */
+  bool get isDocumented;
+
+  /**
+   * Return `true` if the library is an implementation library.
+   */
+  bool get isImplementation;
+
+  /**
+   * Return `true` if library is internal can be used only by other SDK libraries.
+   */
+  bool get isInternal;
+
+  /**
+   * Return `true` if this library can be used for both client and server.
+   */
+  bool get isShared;
+
+  /**
+   * Return `true` if this library can be run on the VM.
+   */
+  bool get isVmLibrary;
+
+  /**
+   * Return the path to the file defining the library. The path is relative to
+   * the `lib` directory within the SDK.
+   */
+  String get path;
+
+  /**
+   * Return the short name of the library. This is the URI of the library,
+   * including `dart:`.
+   */
+  String get shortName;
+}
+
+/**
+ * The information known about a single library within the SDK.
+ */
+class SdkLibraryImpl implements SdkLibrary {
+  /**
+   * The bit mask used to access the bit representing the flag indicating
+   * whether a library is intended to work on the dart2js platform.
+   */
+  static int DART2JS_PLATFORM = 1;
+
+  /**
+   * The bit mask used to access the bit representing the flag indicating
+   * whether a library is intended to work on the VM platform.
+   */
+  static int VM_PLATFORM = 2;
+
+  /**
+   * The short name of the library. This is the name used after 'dart:' in a
+   * URI.
+   */
+  final String shortName;
+
+  /**
+   * The path to the file defining the library. The path is relative to the
+   * 'lib' directory within the SDK.
+   */
+  String path = null;
+
+  /**
+   * The name of the category containing the library. Unless otherwise specified
+   * in the libraries file all libraries are assumed to be shared between server
+   * and client.
+   */
+  String category = "Shared";
+
+  /**
+   * A flag indicating whether the library is documented.
+   */
+  bool _documented = true;
+
+  /**
+   * A flag indicating whether the library is an implementation library.
+   */
+  bool _implementation = false;
+
+  /**
+   * An encoding of which platforms this library is intended to work on.
+   */
+  int _platforms = 0;
+
+  /**
+   * Initialize a newly created library to represent the library with the given
+   * [name].
+   */
+  SdkLibraryImpl(this.shortName);
+
+  /**
+   * Set whether the library is documented.
+   */
+  void set documented(bool documented) {
+    this._documented = documented;
+  }
+
+  /**
+   * Set whether the library is an implementation library.
+   */
+  void set implementation(bool implementation) {
+    this._implementation = implementation;
+  }
+
+  @override
+  bool get isDart2JsLibrary => (_platforms & DART2JS_PLATFORM) != 0;
+
+  @override
+  bool get isDocumented => _documented;
+
+  @override
+  bool get isImplementation => _implementation;
+
+  @override
+  bool get isInternal => "Internal" == category;
+
+  @override
+  bool get isShared => category == "Shared";
+
+  @override
+  bool get isVmLibrary => (_platforms & VM_PLATFORM) != 0;
+
+  /**
+   * Record that this library can be compiled to JavaScript by dart2js.
+   */
+  void setDart2JsLibrary() {
+    _platforms |= DART2JS_PLATFORM;
+  }
+
+  /**
+   * Record that this library can be run on the VM.
+   */
+  void setVmLibrary() {
+    _platforms |= VM_PLATFORM;
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/sdk_io.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/sdk_io.dart
new file mode 100644
index 0000000..b155b9a
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/sdk_io.dart
@@ -0,0 +1,610 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.sdk.io;
+
+import 'dart:io';
+
+import 'package:analyzer/src/context/context.dart' as newContext;
+import 'package:analyzer/src/generated/java_engine.dart';
+
+import 'ast.dart';
+import 'engine.dart';
+import 'error.dart';
+import 'java_core.dart';
+import 'java_engine_io.dart';
+import 'java_io.dart';
+import 'parser.dart';
+import 'scanner.dart';
+import 'sdk.dart';
+import 'source_io.dart';
+
+/**
+ * A Dart SDK installed in a specified directory. Typical Dart SDK layout is
+ * something like...
+ *
+ *     dart-sdk/
+ *        bin/
+ *           dart[.exe]  <-- VM
+ *        lib/
+ *           core/
+ *              core.dart
+ *              ... other core library files ...
+ *           ... other libraries ...
+ *        util/
+ *           ... Dart utilities ...
+ *     Chromium/   <-- Dartium typically exists in a sibling directory
+ */
+class DirectoryBasedDartSdk implements DartSdk {
+  /**
+   * The default SDK, or `null` if the default SDK either has not yet been
+   * created or cannot be created for some reason.
+   */
+  static DirectoryBasedDartSdk _DEFAULT_SDK;
+
+  /**
+   * The name of the directory within the SDK directory that contains
+   * executables.
+   */
+  static String _BIN_DIRECTORY_NAME = "bin";
+
+  /**
+   * The name of the directory on non-Mac that contains dartium.
+   */
+  static String _DARTIUM_DIRECTORY_NAME = "chromium";
+
+  /**
+   * The name of the dart2js executable on non-windows operating systems.
+   */
+  static String _DART2JS_EXECUTABLE_NAME = "dart2js";
+
+  /**
+   * The name of the file containing the dart2js executable on Windows.
+   */
+  static String _DART2JS_EXECUTABLE_NAME_WIN = "dart2js.bat";
+
+  /**
+   * The name of the file containing the Dartium executable on Linux.
+   */
+  static String _DARTIUM_EXECUTABLE_NAME_LINUX = "chrome";
+
+  /**
+   * The name of the file containing the Dartium executable on Macintosh.
+   */
+  static String _DARTIUM_EXECUTABLE_NAME_MAC =
+      "Chromium.app/Contents/MacOS/Chromium";
+
+  /**
+   * The name of the file containing the Dartium executable on Windows.
+   */
+  static String _DARTIUM_EXECUTABLE_NAME_WIN = "Chrome.exe";
+
+  /**
+   * The name of the [System] property whose value is the path to the default
+   * Dart SDK directory.
+   */
+  static String _DEFAULT_DIRECTORY_PROPERTY_NAME = "com.google.dart.sdk";
+
+  /**
+   * The name of the directory within the SDK directory that contains
+   * documentation for the libraries.
+   */
+  static String _DOCS_DIRECTORY_NAME = "docs";
+
+  /**
+   * The suffix added to the name of a library to derive the name of the file
+   * containing the documentation for that library.
+   */
+  static String _DOC_FILE_SUFFIX = "_api.json";
+
+  /**
+   * The name of the directory within the SDK directory that contains the
+   * sdk_library_metadata directory.
+   */
+  static String _INTERNAL_DIR = "_internal";
+
+  /**
+   * The name of the sdk_library_metadata directory that contains the package
+   * holding the libraries.dart file.
+   */
+  static String _SDK_LIBRARY_METADATA_DIR = "sdk_library_metadata";
+
+  /**
+   * The name of the directory within the sdk_library_metadata that contains
+   * libraries.dart.
+   */
+  static String _SDK_LIBRARY_METADATA_LIB_DIR = "lib";
+
+  /**
+   * The name of the directory within the SDK directory that contains the
+   * libraries.
+   */
+  static String _LIB_DIRECTORY_NAME = "lib";
+
+  /**
+   * The name of the libraries file.
+   */
+  static String _LIBRARIES_FILE = "libraries.dart";
+
+  /**
+   * The name of the pub executable on windows.
+   */
+  static String _PUB_EXECUTABLE_NAME_WIN = "pub.bat";
+
+  /**
+   * The name of the pub executable on non-windows operating systems.
+   */
+  static String _PUB_EXECUTABLE_NAME = "pub";
+
+  /**
+   * The name of the file within the SDK directory that contains the version
+   * number of the SDK.
+   */
+  static String _VERSION_FILE_NAME = "version";
+
+  /**
+   * The name of the file containing the VM executable on the Windows operating
+   * system.
+   */
+  static String _VM_EXECUTABLE_NAME_WIN = "dart.exe";
+
+  /**
+   * The name of the file containing the VM executable on non-Windows operating
+   * systems.
+   */
+  static String _VM_EXECUTABLE_NAME = "dart";
+
+  /**
+   * Return the default Dart SDK, or `null` if the directory containing the
+   * default SDK cannot be determined (or does not exist).
+   */
+  static DirectoryBasedDartSdk get defaultSdk {
+    if (_DEFAULT_SDK == null) {
+      JavaFile sdkDirectory = defaultSdkDirectory;
+      if (sdkDirectory == null) {
+        return null;
+      }
+      _DEFAULT_SDK = new DirectoryBasedDartSdk(sdkDirectory);
+    }
+    return _DEFAULT_SDK;
+  }
+
+  /**
+   * Return the default directory for the Dart SDK, or `null` if the directory
+   * cannot be determined (or does not exist). The default directory is provided
+   * by a system property named `com.google.dart.sdk`.
+   */
+  static JavaFile get defaultSdkDirectory {
+    String sdkProperty =
+        JavaSystemIO.getProperty(_DEFAULT_DIRECTORY_PROPERTY_NAME);
+    if (sdkProperty == null) {
+      return null;
+    }
+    JavaFile sdkDirectory = new JavaFile(sdkProperty);
+    if (!sdkDirectory.exists()) {
+      return null;
+    }
+    return sdkDirectory;
+  }
+
+  /**
+   * The [AnalysisContext] which is used for all of the sources in this sdk.
+   */
+  InternalAnalysisContext _analysisContext;
+
+  /**
+   * The directory containing the SDK.
+   */
+  JavaFile _sdkDirectory;
+
+  /**
+   * The revision number of this SDK, or `"0"` if the revision number cannot be
+   * discovered.
+   */
+  String _sdkVersion;
+
+  /**
+   * The file containing the dart2js executable.
+   */
+  JavaFile _dart2jsExecutable;
+
+  /**
+   * The file containing the Dartium executable.
+   */
+  JavaFile _dartiumExecutable;
+
+  /**
+   * The file containing the pub executable.
+   */
+  JavaFile _pubExecutable;
+
+  /**
+   * The file containing the VM executable.
+   */
+  JavaFile _vmExecutable;
+
+  /**
+   * A mapping from Dart library URI's to the library represented by that URI.
+   */
+  LibraryMap _libraryMap;
+
+  /**
+   * Initialize a newly created SDK to represent the Dart SDK installed in the
+   * [sdkDirectory]. The flag [useDart2jsPaths] is `true` if the dart2js path
+   * should be used when it is available
+   */
+  DirectoryBasedDartSdk(JavaFile sdkDirectory, [bool useDart2jsPaths = false]) {
+    this._sdkDirectory = sdkDirectory.getAbsoluteFile();
+    _libraryMap = initialLibraryMap(useDart2jsPaths);
+  }
+
+  @override
+  AnalysisContext get context {
+    if (_analysisContext == null) {
+      if (AnalysisEngine.instance.useTaskModel) {
+        _analysisContext = new newContext.SdkAnalysisContext();
+      } else {
+        _analysisContext = new SdkAnalysisContext();
+      }
+      SourceFactory factory = new SourceFactory([new DartUriResolver(this)]);
+      _analysisContext.sourceFactory = factory;
+      List<String> uris = this.uris;
+      ChangeSet changeSet = new ChangeSet();
+      for (String uri in uris) {
+        changeSet.addedSource(factory.forUri(uri));
+      }
+      _analysisContext.applyChanges(changeSet);
+    }
+    return _analysisContext;
+  }
+
+  /**
+   * Return the file containing the dart2js executable, or `null` if it does not
+   * exist.
+   */
+  JavaFile get dart2JsExecutable {
+    if (_dart2jsExecutable == null) {
+      _dart2jsExecutable = _verifyExecutable(new JavaFile.relative(
+          new JavaFile.relative(_sdkDirectory, _BIN_DIRECTORY_NAME),
+          OSUtilities.isWindows()
+              ? _DART2JS_EXECUTABLE_NAME_WIN
+              : _DART2JS_EXECUTABLE_NAME));
+    }
+    return _dart2jsExecutable;
+  }
+
+  /**
+   * Return the name of the file containing the Dartium executable.
+   */
+  String get dartiumBinaryName {
+    if (OSUtilities.isWindows()) {
+      return _DARTIUM_EXECUTABLE_NAME_WIN;
+    } else if (OSUtilities.isMac()) {
+      return _DARTIUM_EXECUTABLE_NAME_MAC;
+    } else {
+      return _DARTIUM_EXECUTABLE_NAME_LINUX;
+    }
+  }
+
+  /**
+   * Return the file containing the Dartium executable, or `null` if it does not
+   * exist.
+   */
+  JavaFile get dartiumExecutable {
+    if (_dartiumExecutable == null) {
+      _dartiumExecutable = _verifyExecutable(
+          new JavaFile.relative(dartiumWorkingDirectory, dartiumBinaryName));
+    }
+    return _dartiumExecutable;
+  }
+
+  /**
+   * Return the directory where dartium can be found (the directory that will be
+   * the working directory is Dartium is invoked without changing the default).
+   */
+  JavaFile get dartiumWorkingDirectory =>
+      getDartiumWorkingDirectory(_sdkDirectory.getParentFile());
+
+  /**
+   * Return the directory containing the SDK.
+   */
+  JavaFile get directory => _sdkDirectory;
+
+  /**
+   * Return the directory containing documentation for the SDK.
+   */
+  JavaFile get docDirectory =>
+      new JavaFile.relative(_sdkDirectory, _DOCS_DIRECTORY_NAME);
+
+  /**
+   * Return `true` if this SDK includes documentation.
+   */
+  bool get hasDocumentation => docDirectory.exists();
+
+  /**
+   * Return `true` if the Dartium binary is available.
+   */
+  bool get isDartiumInstalled => dartiumExecutable != null;
+
+  /**
+   * Return the directory within the SDK directory that contains the libraries.
+   */
+  JavaFile get libraryDirectory =>
+      new JavaFile.relative(_sdkDirectory, _LIB_DIRECTORY_NAME);
+
+  /**
+   * Return the file containing the Pub executable, or `null` if it does not exist.
+   */
+  JavaFile get pubExecutable {
+    if (_pubExecutable == null) {
+      _pubExecutable = _verifyExecutable(new JavaFile.relative(
+          new JavaFile.relative(_sdkDirectory, _BIN_DIRECTORY_NAME),
+          OSUtilities.isWindows()
+              ? _PUB_EXECUTABLE_NAME_WIN
+              : _PUB_EXECUTABLE_NAME));
+    }
+    return _pubExecutable;
+  }
+
+  @override
+  List<SdkLibrary> get sdkLibraries => _libraryMap.sdkLibraries;
+
+  /**
+   * Return the revision number of this SDK, or `"0"` if the revision number
+   * cannot be discovered.
+   */
+  @override
+  String get sdkVersion {
+    if (_sdkVersion == null) {
+      _sdkVersion = DartSdk.DEFAULT_VERSION;
+      JavaFile revisionFile =
+          new JavaFile.relative(_sdkDirectory, _VERSION_FILE_NAME);
+      try {
+        String revision = revisionFile.readAsStringSync();
+        if (revision != null) {
+          _sdkVersion = revision.trim();
+        }
+      } on FileSystemException {
+        // Fall through to return the default.
+      }
+    }
+    return _sdkVersion;
+  }
+
+  @override
+  List<String> get uris => _libraryMap.uris;
+
+  /**
+   * Return the name of the file containing the VM executable.
+   */
+  String get vmBinaryName {
+    if (OSUtilities.isWindows()) {
+      return _VM_EXECUTABLE_NAME_WIN;
+    } else {
+      return _VM_EXECUTABLE_NAME;
+    }
+  }
+
+  /**
+   * Return the file containing the VM executable, or `null` if it does not
+   * exist.
+   */
+  JavaFile get vmExecutable {
+    if (_vmExecutable == null) {
+      _vmExecutable = _verifyExecutable(new JavaFile.relative(
+          new JavaFile.relative(_sdkDirectory, _BIN_DIRECTORY_NAME),
+          vmBinaryName));
+    }
+    return _vmExecutable;
+  }
+
+  /**
+   * Determine the search order for trying to locate the [_LIBRARIES_FILE].
+   */
+  Iterable<JavaFile> get _libraryMapLocations sync* {
+    yield new JavaFile.relative(
+        new JavaFile.relative(
+            new JavaFile.relative(
+                new JavaFile.relative(libraryDirectory, _INTERNAL_DIR),
+                _SDK_LIBRARY_METADATA_DIR),
+            _SDK_LIBRARY_METADATA_LIB_DIR),
+        _LIBRARIES_FILE);
+    yield new JavaFile.relative(
+        new JavaFile.relative(libraryDirectory, _INTERNAL_DIR),
+        _LIBRARIES_FILE);
+  }
+
+  @override
+  Source fromFileUri(Uri uri) {
+    JavaFile file = new JavaFile.fromUri(uri);
+    String filePath = file.getAbsolutePath();
+    String libPath = libraryDirectory.getAbsolutePath();
+    if (!filePath.startsWith("$libPath${JavaFile.separator}")) {
+      return null;
+    }
+    filePath = filePath.substring(libPath.length + 1);
+    for (SdkLibrary library in _libraryMap.sdkLibraries) {
+      String libraryPath = library.path;
+      if (filePath.replaceAll('\\', '/') == libraryPath) {
+        String path = library.shortName;
+        try {
+          return new FileBasedSource(file, parseUriWithException(path));
+        } on URISyntaxException catch (exception, stackTrace) {
+          AnalysisEngine.instance.logger.logInformation(
+              "Failed to create URI: $path",
+              new CaughtException(exception, stackTrace));
+          return null;
+        }
+      }
+      libraryPath = new JavaFile(libraryPath).getParent();
+      if (filePath.startsWith("$libraryPath${JavaFile.separator}")) {
+        String path =
+            "${library.shortName}/${filePath.substring(libraryPath.length + 1)}";
+        try {
+          return new FileBasedSource(file, parseUriWithException(path));
+        } on URISyntaxException catch (exception, stackTrace) {
+          AnalysisEngine.instance.logger.logInformation(
+              "Failed to create URI: $path",
+              new CaughtException(exception, stackTrace));
+          return null;
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the directory where dartium can be found (the directory that will be
+   * the working directory if Dartium is invoked without changing the default),
+   * assuming that the Editor was installed in the [installDir].
+   */
+  JavaFile getDartiumWorkingDirectory(JavaFile installDir) =>
+      new JavaFile.relative(installDir, _DARTIUM_DIRECTORY_NAME);
+
+  /**
+   * Return the auxiliary documentation file for the library with the given
+   * [libraryName], or `null` if no such file exists.
+   */
+  JavaFile getDocFileFor(String libraryName) {
+    JavaFile dir = docDirectory;
+    if (!dir.exists()) {
+      return null;
+    }
+    JavaFile libDir = new JavaFile.relative(dir, libraryName);
+    JavaFile docFile =
+        new JavaFile.relative(libDir, "$libraryName$_DOC_FILE_SUFFIX");
+    if (docFile.exists()) {
+      return docFile;
+    }
+    return null;
+  }
+
+  @override
+  SdkLibrary getSdkLibrary(String dartUri) => _libraryMap.getLibrary(dartUri);
+
+  /**
+   * Read all of the configuration files to initialize the library maps. The
+   * flag [useDart2jsPaths] is `true` if the dart2js path should be used when it
+   * is available. Return the initialized library map.
+   */
+  LibraryMap initialLibraryMap(bool useDart2jsPaths) {
+    List<String> searchedPaths = <String>[];
+    var lastStackTrace = null;
+    var lastException = null;
+    for (JavaFile librariesFile in _libraryMapLocations) {
+      try {
+        String contents = librariesFile.readAsStringSync();
+        return new SdkLibrariesReader(useDart2jsPaths)
+            .readFromFile(librariesFile, contents);
+      } catch (exception, stackTrace) {
+        searchedPaths.add(librariesFile.getAbsolutePath());
+        lastException = exception;
+        lastStackTrace = stackTrace;
+      }
+    }
+    AnalysisEngine.instance.logger.logError(
+        "Could not initialize the library map from $searchedPaths",
+        new CaughtException(lastException, lastStackTrace));
+    return new LibraryMap();
+  }
+
+  @override
+  Source mapDartUri(String dartUri) {
+    String libraryName;
+    String relativePath;
+    int index = dartUri.indexOf('/');
+    if (index >= 0) {
+      libraryName = dartUri.substring(0, index);
+      relativePath = dartUri.substring(index + 1);
+    } else {
+      libraryName = dartUri;
+      relativePath = "";
+    }
+    SdkLibrary library = getSdkLibrary(libraryName);
+    if (library == null) {
+      return null;
+    }
+    try {
+      JavaFile file = new JavaFile.relative(libraryDirectory, library.path);
+      if (!relativePath.isEmpty) {
+        file = file.getParentFile();
+        file = new JavaFile.relative(file, relativePath);
+      }
+      return new FileBasedSource(file, parseUriWithException(dartUri));
+    } on URISyntaxException {
+      return null;
+    }
+  }
+
+  /**
+   * Return the given [file] if it exists and is executable, or `null` if it
+   * does not exist or is not executable.
+   */
+  JavaFile _verifyExecutable(JavaFile file) =>
+      file.isExecutable() ? file : null;
+}
+
+/**
+ * An object used to read and parse the libraries file
+ * (dart-sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart) for information
+ * about the libraries in an SDK. The library information is represented as a
+ * Dart file containing a single top-level variable whose value is a const map.
+ * The keys of the map are the names of libraries defined in the SDK and the
+ * values in the map are info objects defining the library. For example, a
+ * subset of a typical SDK might have a libraries file that looks like the
+ * following:
+ *
+ *     final Map<String, LibraryInfo> LIBRARIES = const <LibraryInfo> {
+ *       // Used by VM applications
+ *       "builtin" : const LibraryInfo(
+ *         "builtin/builtin_runtime.dart",
+ *         category: "Server",
+ *         platforms: VM_PLATFORM),
+ *
+ *       "compiler" : const LibraryInfo(
+ *         "compiler/compiler.dart",
+ *         category: "Tools",
+ *         platforms: 0),
+ *     };
+ */
+class SdkLibrariesReader {
+  /**
+   * A flag indicating whether the dart2js path should be used when it is
+   * available.
+   */
+  final bool _useDart2jsPaths;
+
+  /**
+   * Initialize a newly created library reader to use the dart2js path if
+   * [_useDart2jsPaths] is `true`.
+   */
+  SdkLibrariesReader(this._useDart2jsPaths);
+
+  /**
+   * Return the library map read from the given [file], given that the content
+   * of the file is already known to be [libraryFileContents].
+   */
+  LibraryMap readFromFile(JavaFile file, String libraryFileContents) =>
+      readFromSource(new FileBasedSource(file), libraryFileContents);
+
+  /**
+   * Return the library map read from the given [source], given that the content
+   * of the file is already known to be [libraryFileContents].
+   */
+  LibraryMap readFromSource(Source source, String libraryFileContents) {
+    BooleanErrorListener errorListener = new BooleanErrorListener();
+    Scanner scanner = new Scanner(
+        source, new CharSequenceReader(libraryFileContents), errorListener);
+    Parser parser = new Parser(source, errorListener);
+    CompilationUnit unit = parser.parseCompilationUnit(scanner.tokenize());
+    SdkLibrariesReader_LibraryBuilder libraryBuilder =
+        new SdkLibrariesReader_LibraryBuilder(_useDart2jsPaths);
+    // If any syntactic errors were found then don't try to visit the AST
+    // structure.
+    if (!errorListener.errorReported) {
+      unit.accept(libraryBuilder);
+    }
+    return libraryBuilder.librariesMap;
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/source.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/source.dart
new file mode 100644
index 0000000..e6d7a54
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/source.dart
@@ -0,0 +1,1082 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.source;
+
+import 'dart:collection';
+import "dart:math" as math;
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/source/package_map_resolver.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart' as utils;
+import 'package:analyzer/task/model.dart';
+import 'package:package_config/packages.dart';
+import 'package:path/path.dart' as pathos;
+
+import 'engine.dart';
+import 'java_core.dart';
+import 'java_engine.dart';
+import 'java_io.dart' show JavaFile;
+import 'sdk.dart' show DartSdk;
+import 'source_io.dart' show FileBasedSource;
+
+/**
+ * A function that is used to visit [ContentCache] entries.
+ */
+typedef void ContentCacheVisitor(String fullPath, int stamp, String contents);
+
+/**
+ * A cache used to override the default content of a [Source].
+ */
+class ContentCache {
+  /**
+   * A table mapping the full path of sources to the contents of those sources.
+   * This is used to override the default contents of a source.
+   */
+  HashMap<String, String> _contentMap = new HashMap<String, String>();
+
+  /**
+   * A table mapping the full path of sources to the modification stamps of
+   * those sources. This is used when the default contents of a source has been
+   * overridden.
+   */
+  HashMap<String, int> _stampMap = new HashMap<String, int>();
+
+  /**
+   * Visit all entries of this cache.
+   */
+  void accept(ContentCacheVisitor visitor) {
+    _contentMap.forEach((String fullPath, String contents) {
+      int stamp = _stampMap[fullPath];
+      visitor(fullPath, stamp, contents);
+    });
+  }
+
+  /**
+   * Return the contents of the given [source], or `null` if this cache does not
+   * override the contents of the source.
+   *
+   * <b>Note:</b> This method is not intended to be used except by
+   * [AnalysisContext.getContents].
+   */
+  String getContents(Source source) => _contentMap[source.fullName];
+
+  /**
+   * Return the modification stamp of the given [source], or `null` if this
+   * cache does not override the contents of the source.
+   *
+   * <b>Note:</b> This method is not intended to be used except by
+   * [AnalysisContext.getModificationStamp].
+   */
+  int getModificationStamp(Source source) => _stampMap[source.fullName];
+
+  /**
+   * Set the contents of the given [source] to the given [contents]. This has
+   * the effect of overriding the default contents of the source. If the
+   * contents are `null` the override is removed so that the default contents
+   * will be returned.
+   */
+  String setContents(Source source, String contents) {
+    String fullName = source.fullName;
+    if (contents == null) {
+      _stampMap.remove(fullName);
+      return _contentMap.remove(fullName);
+    } else {
+      int newStamp = JavaSystem.currentTimeMillis();
+      int oldStamp = _stampMap[fullName];
+      _stampMap[fullName] = newStamp;
+      // Occasionally, if this method is called in rapid succession, the
+      // timestamps are equal. Guard against this by artificially incrementing
+      // the new timestamp.
+      if (newStamp == oldStamp) {
+        _stampMap[fullName] = newStamp + 1;
+      }
+      String oldContent = _contentMap[fullName];
+      _contentMap[fullName] = contents;
+      return oldContent;
+    }
+  }
+}
+
+class CustomUriResolver extends UriResolver {
+  final Map<String, String> _urlMappings;
+
+  CustomUriResolver(this._urlMappings);
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    String mapping = _urlMappings[uri.toString()];
+    if (mapping == null) return null;
+
+    Uri fileUri = new Uri.file(mapping);
+    if (!fileUri.isAbsolute) return null;
+
+    JavaFile javaFile = new JavaFile.fromUri(fileUri);
+    return new FileBasedSource(javaFile, actualUri != null ? actualUri : uri);
+  }
+}
+
+/**
+ * Instances of the class `DartUriResolver` resolve `dart` URI's.
+ */
+class DartUriResolver extends UriResolver {
+  /**
+   * The name of the `dart` scheme.
+   */
+  static String DART_SCHEME = "dart";
+
+  /**
+   * The prefix of a URI using the dart-ext scheme to reference a native code library.
+   */
+  static String _DART_EXT_SCHEME = "dart-ext:";
+
+  /**
+   * The Dart SDK against which URI's are to be resolved.
+   */
+  final DartSdk _sdk;
+
+  /**
+   * Initialize a newly created resolver to resolve Dart URI's against the given platform within the
+   * given Dart SDK.
+   *
+   * @param sdk the Dart SDK against which URI's are to be resolved
+   */
+  DartUriResolver(this._sdk);
+
+  /**
+   * Return the [DartSdk] against which URIs are to be resolved.
+   *
+   * @return the [DartSdk] against which URIs are to be resolved.
+   */
+  DartSdk get dartSdk => _sdk;
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    if (!isDartUri(uri)) {
+      return null;
+    }
+    return _sdk.mapDartUri(uri.toString());
+  }
+
+  /**
+   * Return `true` if the given URI is a `dart-ext:` URI.
+   *
+   * @param uriContent the textual representation of the URI being tested
+   * @return `true` if the given URI is a `dart-ext:` URI
+   */
+  static bool isDartExtUri(String uriContent) =>
+      uriContent != null && uriContent.startsWith(_DART_EXT_SCHEME);
+
+  /**
+   * Return `true` if the given URI is a `dart:` URI.
+   *
+   * @param uri the URI being tested
+   * @return `true` if the given URI is a `dart:` URI
+   */
+  static bool isDartUri(Uri uri) => DART_SCHEME == uri.scheme;
+}
+
+/**
+ * Instances of the class `LineInfo` encapsulate information about line and column information
+ * within a source file.
+ */
+class LineInfo {
+  /**
+   * An array containing the offsets of the first character of each line in the source code.
+   */
+  final List<int> _lineStarts;
+
+  /**
+   * The zero-based [_lineStarts] index resulting from the last call to
+   * [getLocation].
+   */
+  int _previousLine = 0;
+
+  /**
+   * Initialize a newly created set of line information to represent the data encoded in the given
+   * array.
+   *
+   * @param lineStarts the offsets of the first character of each line in the source code
+   */
+  LineInfo(this._lineStarts) {
+    if (_lineStarts == null) {
+      throw new IllegalArgumentException("lineStarts must be non-null");
+    } else if (_lineStarts.length < 1) {
+      throw new IllegalArgumentException("lineStarts must be non-empty");
+    }
+  }
+
+  /**
+   * Return the location information for the character at the given offset.
+   *
+   * @param offset the offset of the character for which location information is to be returned
+   * @return the location information for the character at the given offset
+   */
+  LineInfo_Location getLocation(int offset) {
+    var min = 0;
+    var max = _lineStarts.length - 1;
+
+    // Subsequent calls to [getLocation] are often for offsets near each other.
+    // To take advantage of that, we cache the index of the line start we found
+    // when this was last called. If the current offset is on that line or
+    // later, we'll skip those early indices completely when searching.
+    if (offset >= _lineStarts[_previousLine]) {
+      min = _previousLine;
+
+      // Before kicking off a full binary search, do a quick check here to see
+      // if the new offset is on that exact line.
+      if (min == _lineStarts.length - 1 || offset < _lineStarts[min + 1]) {
+        return new LineInfo_Location(min + 1, offset - _lineStarts[min] + 1);
+      }
+    }
+
+    // Binary search to fine the line containing this offset.
+    while (min < max) {
+      var midpoint = (max - min + 1) ~/ 2 + min;
+
+      if (_lineStarts[midpoint] > offset) {
+        max = midpoint - 1;
+      } else {
+        min = midpoint;
+      }
+    }
+
+    _previousLine = min;
+
+    return new LineInfo_Location(min + 1, offset - _lineStarts[min] + 1);
+  }
+}
+
+/**
+ * Instances of the class `Location` represent the location of a character as a line and
+ * column pair.
+ */
+class LineInfo_Location {
+  /**
+   * The one-based index of the line containing the character.
+   */
+  final int lineNumber;
+
+  /**
+   * The one-based index of the column containing the character.
+   */
+  final int columnNumber;
+
+  /**
+   * Initialize a newly created location to represent the location of the character at the given
+   * line and column position.
+   *
+   * @param lineNumber the one-based index of the line containing the character
+   * @param columnNumber the one-based index of the column containing the character
+   */
+  LineInfo_Location(this.lineNumber, this.columnNumber);
+}
+
+/**
+ * Instances of interface `LocalSourcePredicate` are used to determine if the given
+ * [Source] is "local" in some sense, so can be updated.
+ */
+abstract class LocalSourcePredicate {
+  /**
+   * Instance of [LocalSourcePredicate] that always returns `false`.
+   */
+  static final LocalSourcePredicate FALSE = new LocalSourcePredicate_FALSE();
+
+  /**
+   * Instance of [LocalSourcePredicate] that always returns `true`.
+   */
+  static final LocalSourcePredicate TRUE = new LocalSourcePredicate_TRUE();
+
+  /**
+   * Instance of [LocalSourcePredicate] that returns `true` for all [Source]s
+   * except of SDK.
+   */
+  static final LocalSourcePredicate NOT_SDK =
+      new LocalSourcePredicate_NOT_SDK();
+
+  /**
+   * Determines if the given [Source] is local.
+   *
+   * @param source the [Source] to analyze
+   * @return `true` if the given [Source] is local
+   */
+  bool isLocal(Source source);
+}
+
+class LocalSourcePredicate_FALSE implements LocalSourcePredicate {
+  @override
+  bool isLocal(Source source) => false;
+}
+
+class LocalSourcePredicate_NOT_SDK implements LocalSourcePredicate {
+  @override
+  bool isLocal(Source source) => source.uriKind != UriKind.DART_URI;
+}
+
+class LocalSourcePredicate_TRUE implements LocalSourcePredicate {
+  @override
+  bool isLocal(Source source) => true;
+}
+
+/**
+ * An implementation of an non-existing [Source].
+ */
+class NonExistingSource extends Source {
+  @override
+  final String fullName;
+
+  @override
+  final Uri uri;
+
+  final UriKind uriKind;
+
+  NonExistingSource(this.fullName, this.uri, this.uriKind);
+
+  @override
+  TimestampedData<String> get contents {
+    throw new UnsupportedOperationException('$fullName does not exist.');
+  }
+
+  @override
+  String get encoding {
+    throw new UnsupportedOperationException('$fullName does not exist.');
+  }
+
+  @override
+  int get hashCode => fullName.hashCode;
+
+  @override
+  bool get isInSystemLibrary => false;
+
+  @override
+  int get modificationStamp => -1;
+
+  @override
+  String get shortName => pathos.basename(fullName);
+
+  @override
+  bool operator ==(Object other) {
+    if (other is NonExistingSource) {
+      return other.uriKind == uriKind && other.fullName == fullName;
+    }
+    return false;
+  }
+
+  @override
+  bool exists() => false;
+
+  @override
+  Uri resolveRelativeUri(Uri relativeUri) {
+    throw new UnsupportedOperationException('$fullName does not exist.');
+  }
+}
+
+/**
+ * The interface `Source` defines the behavior of objects representing source code that can be
+ * analyzed by the analysis engine.
+ *
+ * Implementations of this interface need to be aware of some assumptions made by the analysis
+ * engine concerning sources:
+ * * Sources are not required to be unique. That is, there can be multiple instances representing
+ * the same source.
+ * * Sources are long lived. That is, the engine is allowed to hold on to a source for an extended
+ * period of time and that source must continue to report accurate and up-to-date information.
+ * Because of these assumptions, most implementations will not maintain any state but will delegate
+ * to an authoritative system of record in order to implement this API. For example, a source that
+ * represents files on disk would typically query the file system to determine the state of the
+ * file.
+ *
+ * If the instances that implement this API are the system of record, then they will typically be
+ * unique. In that case, sources that are created that represent non-existent files must also be
+ * retained so that if those files are created at a later date the long-lived sources representing
+ * those files will know that they now exist.
+ */
+abstract class Source implements AnalysisTarget {
+  /**
+   * An empty list of sources.
+   */
+  @deprecated // Use Source.EMPTY_LIST
+  static const List<Source> EMPTY_ARRAY = EMPTY_LIST;
+
+  /**
+   * An empty list of sources.
+   */
+  static const List<Source> EMPTY_LIST = const <Source>[];
+
+  /**
+   * Get the contents and timestamp of this source.
+   *
+   * Clients should consider using the the method [AnalysisContext.getContents]
+   * because contexts can have local overrides of the content of a source that the source is not
+   * aware of.
+   *
+   * @return the contents and timestamp of the source
+   * @throws Exception if the contents of this source could not be accessed
+   */
+  TimestampedData<String> get contents;
+
+  /**
+   * Return an encoded representation of this source that can be used to create a source that is
+   * equal to this source.
+   *
+   * @return an encoded representation of this source
+   * See [SourceFactory.fromEncoding].
+   */
+  String get encoding;
+
+  /**
+   * Return the full (long) version of the name that can be displayed to the user to denote this
+   * source. For example, for a source representing a file this would typically be the absolute path
+   * of the file.
+   *
+   * @return a name that can be displayed to the user to denote this source
+   */
+  String get fullName;
+
+  /**
+   * Return a hash code for this source.
+   *
+   * @return a hash code for this source
+   * See [Object.hashCode].
+   */
+  @override
+  int get hashCode;
+
+  /**
+   * Return `true` if this source is in one of the system libraries.
+   *
+   * @return `true` if this is in a system library
+   */
+  bool get isInSystemLibrary;
+
+  /**
+   * Return the modification stamp for this source, or a negative value if the
+   * source does not exist. A modification stamp is a non-negative integer with
+   * the property that if the contents of the source have not been modified
+   * since the last time the modification stamp was accessed then the same value
+   * will be returned, but if the contents of the source have been modified one
+   * or more times (even if the net change is zero) the stamps will be different.
+   *
+   * Clients should consider using the the method
+   * [AnalysisContext.getModificationStamp] because contexts can have local
+   * overrides of the content of a source that the source is not aware of.
+   */
+  int get modificationStamp;
+
+  /**
+   * Return a short version of the name that can be displayed to the user to denote this source. For
+   * example, for a source representing a file this would typically be the name of the file.
+   *
+   * @return a name that can be displayed to the user to denote this source
+   */
+  String get shortName;
+
+  @override
+  Source get source => this;
+
+  /**
+   * Return the URI from which this source was originally derived.
+   *
+   * @return the URI from which this source was originally derived
+   */
+  Uri get uri;
+
+  /**
+   * Return the kind of URI from which this source was originally derived. If this source was
+   * created from an absolute URI, then the returned kind will reflect the scheme of the absolute
+   * URI. If it was created from a relative URI, then the returned kind will be the same as the kind
+   * of the source against which the relative URI was resolved.
+   *
+   * @return the kind of URI from which this source was originally derived
+   */
+  UriKind get uriKind;
+
+  /**
+   * Return `true` if the given object is a source that represents the same source code as
+   * this source.
+   *
+   * @param object the object to be compared with this object
+   * @return `true` if the given object is a source that represents the same source code as
+   *         this source
+   * See [Object.==].
+   */
+  @override
+  bool operator ==(Object object);
+
+  /**
+   * Return `true` if this source exists.
+   *
+   * Clients should consider using the the method [AnalysisContext.exists] because
+   * contexts can have local overrides of the content of a source that the source is not aware of
+   * and a source with local content is considered to exist even if there is no file on disk.
+   *
+   * @return `true` if this source exists
+   */
+  bool exists();
+
+  /**
+   * Resolve the relative URI against the URI associated with this source object.
+   *
+   * Note: This method is not intended for public use, it is only visible out of necessity. It is
+   * only intended to be invoked by a [SourceFactory]. Source factories will
+   * only invoke this method if the URI is relative, so implementations of this method are not
+   * required to, and generally do not, verify the argument. The result of invoking this method with
+   * an absolute URI is intentionally left unspecified.
+   *
+   * @param relativeUri the relative URI to be resolved against this source
+   * @return the URI to which given URI was resolved
+   * @throws AnalysisException if the relative URI could not be resolved
+   */
+  Uri resolveRelativeUri(Uri relativeUri);
+}
+
+/**
+ * The interface `ContentReceiver` defines the behavior of objects that can receive the
+ * content of a source.
+ */
+abstract class Source_ContentReceiver {
+  /**
+   * Accept the contents of a source.
+   *
+   * @param contents the contents of the source
+   * @param modificationTime the time at which the contents were last set
+   */
+  void accept(String contents, int modificationTime);
+}
+
+/**
+ * The interface `SourceContainer` is used by clients to define a collection of sources
+ *
+ * Source containers are not used within analysis engine, but can be used by clients to group
+ * sources for the purposes of accessing composite dependency information. For example, the Eclipse
+ * client uses source containers to represent Eclipse projects, which allows it to easily compute
+ * project-level dependencies.
+ */
+abstract class SourceContainer {
+  /**
+   * Determine if the specified source is part of the receiver's collection of sources.
+   *
+   * @param source the source in question
+   * @return `true` if the receiver contains the source, else `false`
+   */
+  bool contains(Source source);
+}
+
+/**
+ * Instances of the class `SourceFactory` resolve possibly relative URI's against an existing
+ * [Source].
+ */
+class SourceFactory {
+  /**
+   * The analysis context that this source factory is associated with.
+   */
+  AnalysisContext context;
+
+  /**
+   * URI processor used to find mappings for `package:` URIs found in a `.packages` config
+   * file.
+   */
+  final Packages _packages;
+
+  /**
+   * Resource provider used in working with package maps.
+   */
+  final ResourceProvider _resourceProvider;
+
+  /**
+   * The resolvers used to resolve absolute URI's.
+   */
+  final List<UriResolver> _resolvers;
+
+  /**
+   * The predicate to determine is [Source] is local.
+   */
+  LocalSourcePredicate _localSourcePredicate = LocalSourcePredicate.NOT_SDK;
+
+  /**
+   * Initialize a newly created source factory with the given absolute URI [resolvers] and
+   * optional [packages] resolution helper.
+   */
+  SourceFactory(this._resolvers,
+      [this._packages, ResourceProvider resourceProvider])
+      : _resourceProvider = resourceProvider != null
+          ? resourceProvider
+          : PhysicalResourceProvider.INSTANCE;
+
+  /**
+   * Return the [DartSdk] associated with this [SourceFactory], or `null` if there
+   * is no such SDK.
+   *
+   * @return the [DartSdk] associated with this [SourceFactory], or `null` if
+   *         there is no such SDK
+   */
+  DartSdk get dartSdk {
+    for (UriResolver resolver in _resolvers) {
+      if (resolver is DartUriResolver) {
+        DartUriResolver dartUriResolver = resolver;
+        return dartUriResolver.dartSdk;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Sets the [LocalSourcePredicate].
+   *
+   * @param localSourcePredicate the predicate to determine is [Source] is local
+   */
+  void set localSourcePredicate(LocalSourcePredicate localSourcePredicate) {
+    this._localSourcePredicate = localSourcePredicate;
+  }
+
+  /// A table mapping package names to paths of directories containing
+  /// the package (or [null] if there is no registered package URI resolver).
+  Map<String, List<Folder>> get packageMap {
+    // Start by looking in .packages.
+    if (_packages != null) {
+      Map<String, List<Folder>> packageMap = <String, List<Folder>>{};
+      _packages.asMap().forEach((String name, Uri uri) {
+        if (uri.scheme == 'file' || uri.scheme == '' /* unspecified */) {
+          packageMap[name] =
+              <Folder>[_resourceProvider.getFolder(uri.toFilePath())];
+        }
+      });
+      return packageMap;
+    }
+
+    // Default to the PackageMapUriResolver.
+    PackageMapUriResolver resolver = _resolvers.firstWhere(
+        (r) => r is PackageMapUriResolver, orElse: () => null);
+    return resolver != null ? resolver.packageMap : null;
+  }
+
+  /**
+   * Return a source object representing the given absolute URI, or `null` if the URI is not a
+   * valid URI or if it is not an absolute URI.
+   *
+   * @param absoluteUri the absolute URI to be resolved
+   * @return a source object representing the absolute URI
+   */
+  Source forUri(String absoluteUri) {
+    try {
+      Uri uri = parseUriWithException(absoluteUri);
+      if (uri.isAbsolute) {
+        return _internalResolveUri(null, uri);
+      }
+    } catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logError(
+          "Could not resolve URI: $absoluteUri",
+          new CaughtException(exception, stackTrace));
+    }
+    return null;
+  }
+
+  /**
+   * Return a source object representing the given absolute URI, or `null` if the URI is not
+   * an absolute URI.
+   *
+   * @param absoluteUri the absolute URI to be resolved
+   * @return a source object representing the absolute URI
+   */
+  Source forUri2(Uri absoluteUri) {
+    if (absoluteUri.isAbsolute) {
+      try {
+        return _internalResolveUri(null, absoluteUri);
+      } on AnalysisException catch (exception, stackTrace) {
+        AnalysisEngine.instance.logger.logError(
+            "Could not resolve URI: $absoluteUri",
+            new CaughtException(exception, stackTrace));
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return a source object that is equal to the source object used to obtain the given encoding.
+   *
+   * @param encoding the encoding of a source object
+   * @return a source object that is described by the given encoding
+   * @throws IllegalArgumentException if the argument is not a valid encoding
+   * See [Source.encoding].
+   */
+  Source fromEncoding(String encoding) {
+    Source source = forUri(encoding);
+    if (source == null) {
+      throw new IllegalArgumentException(
+          "Invalid source encoding: '$encoding'");
+    }
+    return source;
+  }
+
+  /**
+   * Determines if the given [Source] is local.
+   *
+   * @param source the [Source] to analyze
+   * @return `true` if the given [Source] is local
+   */
+  bool isLocalSource(Source source) => _localSourcePredicate.isLocal(source);
+
+  /**
+   * Return a source object representing the URI that results from resolving the given (possibly
+   * relative) contained URI against the URI associated with an existing source object, whether or
+   * not the resulting source exists, or `null` if either the contained URI is invalid or if
+   * it cannot be resolved against the source object's URI.
+   *
+   * @param containingSource the source containing the given URI
+   * @param containedUri the (possibly relative) URI to be resolved against the containing source
+   * @return the source representing the contained URI
+   */
+  Source resolveUri(Source containingSource, String containedUri) {
+    if (containedUri == null || containedUri.isEmpty) {
+      return null;
+    }
+    try {
+      // Force the creation of an escaped URI to deal with spaces, etc.
+      return _internalResolveUri(
+          containingSource, parseUriWithException(containedUri));
+    } catch (exception, stackTrace) {
+      String containingFullName =
+          containingSource != null ? containingSource.fullName : '<null>';
+      AnalysisEngine.instance.logger.logError(
+          "Could not resolve URI ($containedUri) relative to source ($containingFullName)",
+          new CaughtException(exception, stackTrace));
+      return null;
+    }
+  }
+
+  /**
+   * Return an absolute URI that represents the given source, or `null` if a valid URI cannot
+   * be computed.
+   *
+   * @param source the source to get URI for
+   * @return the absolute URI representing the given source
+   */
+  Uri restoreUri(Source source) {
+    // First see if a resolver can restore the URI.
+    for (UriResolver resolver in _resolvers) {
+      Uri uri = resolver.restoreAbsolute(source);
+      if (uri != null) {
+        // Now see if there's a package mapping.
+        Uri packageMappedUri = _getPackageMapping(uri);
+        if (packageMappedUri != null) {
+          return packageMappedUri;
+        }
+        // Fall back to the resolver's computed URI.
+        return uri;
+      }
+    }
+
+    return null;
+  }
+
+  Uri _getPackageMapping(Uri sourceUri) {
+    if (_packages == null) {
+      return null;
+    }
+    if (sourceUri.scheme != 'file') {
+      //TODO(pquitslund): verify this works for non-file URIs.
+      return null;
+    }
+
+    Uri packageUri;
+    _packages.asMap().forEach((String name, Uri uri) {
+      if (packageUri == null) {
+        if (utils.startsWith(sourceUri, uri)) {
+          packageUri = Uri.parse(
+              'package:$name/${sourceUri.path.substring(uri.path.length)}');
+        }
+      }
+    });
+    return packageUri;
+  }
+
+  /**
+   * Return a source object representing the URI that results from resolving the given (possibly
+   * relative) contained URI against the URI associated with an existing source object, or
+   * `null` if the URI could not be resolved.
+   *
+   * @param containingSource the source containing the given URI
+   * @param containedUri the (possibly relative) URI to be resolved against the containing source
+   * @return the source representing the contained URI
+   * @throws AnalysisException if either the contained URI is invalid or if it cannot be resolved
+   *           against the source object's URI
+   */
+  Source _internalResolveUri(Source containingSource, Uri containedUri) {
+    if (!containedUri.isAbsolute) {
+      if (containingSource == null) {
+        throw new AnalysisException(
+            "Cannot resolve a relative URI without a containing source: $containedUri");
+      }
+      containedUri = containingSource.resolveRelativeUri(containedUri);
+    }
+
+    Uri actualUri = containedUri;
+
+    // Check .packages and update target and actual URIs as appropriate.
+    if (_packages != null && containedUri.scheme == 'package') {
+      Uri packageUri =
+          _packages.resolve(containedUri, notFound: (Uri packageUri) => null);
+
+      if (packageUri != null) {
+        // Ensure scheme is set.
+        if (packageUri.scheme == '') {
+          packageUri = packageUri.replace(scheme: 'file');
+        }
+        containedUri = packageUri;
+      }
+    }
+
+    for (UriResolver resolver in _resolvers) {
+      Source result = resolver.resolveAbsolute(containedUri, actualUri);
+      if (result != null) {
+        return result;
+      }
+    }
+
+    return null;
+  }
+}
+
+/**
+ * The enumeration `SourceKind` defines the different kinds of sources that are known to the
+ * analysis engine.
+ */
+class SourceKind extends Enum<SourceKind> {
+  /**
+   * A source containing HTML. The HTML might or might not contain Dart scripts.
+   */
+  static const SourceKind HTML = const SourceKind('HTML', 0);
+
+  /**
+   * A Dart compilation unit that is not a part of another library. Libraries might or might not
+   * contain any directives, including a library directive.
+   */
+  static const SourceKind LIBRARY = const SourceKind('LIBRARY', 1);
+
+  /**
+   * A Dart compilation unit that is part of another library. Parts contain a part-of directive.
+   */
+  static const SourceKind PART = const SourceKind('PART', 2);
+
+  /**
+   * An unknown kind of source. Used both when it is not possible to identify the kind of a source
+   * and also when the kind of a source is not known without performing a computation and the client
+   * does not want to spend the time to identify the kind.
+   */
+  static const SourceKind UNKNOWN = const SourceKind('UNKNOWN', 3);
+
+  static const List<SourceKind> values = const [HTML, LIBRARY, PART, UNKNOWN];
+
+  const SourceKind(String name, int ordinal) : super(name, ordinal);
+}
+
+/**
+ * A source range defines an [Element]'s source coordinates relative to its [Source].
+ */
+class SourceRange {
+  /**
+   * An empty [SourceRange] with offset `0` and length `0`.
+   */
+  static SourceRange EMPTY = new SourceRange(0, 0);
+
+  /**
+   * The 0-based index of the first character of the source code for this element, relative to the
+   * source buffer in which this element is contained.
+   */
+  final int offset;
+
+  /**
+   * The number of characters of the source code for this element, relative to the source buffer in
+   * which this element is contained.
+   */
+  final int length;
+
+  /**
+   * Initialize a newly created source range using the given offset and the given length.
+   *
+   * @param offset the given offset
+   * @param length the given length
+   */
+  SourceRange(this.offset, this.length);
+
+  /**
+   * @return the 0-based index of the after-last character of the source code for this element,
+   *         relative to the source buffer in which this element is contained.
+   */
+  int get end => offset + length;
+
+  @override
+  int get hashCode => 31 * offset + length;
+
+  @override
+  bool operator ==(Object obj) {
+    if (obj is! SourceRange) {
+      return false;
+    }
+    SourceRange sourceRange = obj as SourceRange;
+    return sourceRange.offset == offset && sourceRange.length == length;
+  }
+
+  /**
+   * @return `true` if <code>x</code> is in [offset, offset + length) interval.
+   */
+  bool contains(int x) => offset <= x && x < offset + length;
+
+  /**
+   * @return `true` if <code>x</code> is in (offset, offset + length) interval.
+   */
+  bool containsExclusive(int x) => offset < x && x < offset + length;
+
+  /**
+   * @return `true` if <code>otherRange</code> covers this [SourceRange].
+   */
+  bool coveredBy(SourceRange otherRange) => otherRange.covers(this);
+
+  /**
+   * @return `true` if this [SourceRange] covers <code>otherRange</code>.
+   */
+  bool covers(SourceRange otherRange) =>
+      offset <= otherRange.offset && otherRange.end <= end;
+
+  /**
+   * @return `true` if this [SourceRange] ends in <code>otherRange</code>.
+   */
+  bool endsIn(SourceRange otherRange) {
+    int thisEnd = end;
+    return otherRange.contains(thisEnd);
+  }
+
+  /**
+   * @return the expanded instance of [SourceRange], which has the same center.
+   */
+  SourceRange getExpanded(int delta) =>
+      new SourceRange(offset - delta, delta + length + delta);
+
+  /**
+   * @return the instance of [SourceRange] with end moved on "delta".
+   */
+  SourceRange getMoveEnd(int delta) => new SourceRange(offset, length + delta);
+
+  /**
+   * @return the expanded translated of [SourceRange], with moved start and the same length.
+   */
+  SourceRange getTranslated(int delta) =>
+      new SourceRange(offset + delta, length);
+
+  /**
+   * @return the minimal [SourceRange] that cover this and the given [SourceRange]s.
+   */
+  SourceRange getUnion(SourceRange other) {
+    int newOffset = math.min(offset, other.offset);
+    int newEnd = math.max(offset + length, other.offset + other.length);
+    return new SourceRange(newOffset, newEnd - newOffset);
+  }
+
+  /**
+   * @return `true` if this [SourceRange] intersects with given.
+   */
+  bool intersects(SourceRange other) {
+    if (other == null) {
+      return false;
+    }
+    if (end <= other.offset) {
+      return false;
+    }
+    if (offset >= other.end) {
+      return false;
+    }
+    return true;
+  }
+
+  /**
+   * Return `true` if this [SourceRange] starts in the [otherRange].
+   */
+  bool startsIn(SourceRange otherRange) => otherRange.contains(offset);
+
+  @override
+  String toString() => '[offset=$offset, length=$length]';
+}
+
+/**
+ * The enumeration `UriKind` defines the different kinds of URI's that are known to the
+ * analysis engine. These are used to keep track of the kind of URI associated with a given source.
+ */
+class UriKind extends Enum<UriKind> {
+  /**
+   * A 'dart:' URI.
+   */
+  static const UriKind DART_URI = const UriKind('DART_URI', 0, 0x64);
+
+  /**
+   * A 'file:' URI.
+   */
+  static const UriKind FILE_URI = const UriKind('FILE_URI', 1, 0x66);
+
+  /**
+   * A 'package:' URI.
+   */
+  static const UriKind PACKAGE_URI = const UriKind('PACKAGE_URI', 2, 0x70);
+
+  static const List<UriKind> values = const [DART_URI, FILE_URI, PACKAGE_URI];
+
+  /**
+   * The single character encoding used to identify this kind of URI.
+   */
+  final int encoding;
+
+  /**
+   * Initialize a newly created URI kind to have the given encoding.
+   *
+   * @param encoding the single character encoding used to identify this kind of URI.
+   */
+  const UriKind(String name, int ordinal, this.encoding) : super(name, ordinal);
+
+  /**
+   * Return the URI kind represented by the given encoding, or `null` if there is no kind with
+   * the given encoding.
+   *
+   * @param encoding the single character encoding used to identify the URI kind to be returned
+   * @return the URI kind represented by the given encoding
+   */
+  static UriKind fromEncoding(int encoding) {
+    while (true) {
+      if (encoding == 0x64) {
+        return DART_URI;
+      } else if (encoding == 0x66) {
+        return FILE_URI;
+      } else if (encoding == 0x70) {
+        return PACKAGE_URI;
+      }
+      break;
+    }
+    return null;
+  }
+}
+
+/**
+ * The abstract class `UriResolver` defines the behavior of objects that are used to resolve
+ * URI's for a source factory. Subclasses of this class are expected to resolve a single scheme of
+ * absolute URI.
+ */
+abstract class UriResolver {
+  /**
+   * Resolve the given absolute URI. Return a [Source] representing the file to which
+   * it was resolved, whether or not the resulting source exists, or `null` if it could not be
+   * resolved because the URI is invalid.
+   *
+   * @param uri the URI to be resolved
+   * @param actualUri the actual uri for this source -- if `null`, the value of [uri] will be used
+   * @return a [Source] representing the file to which given URI was resolved
+   */
+  Source resolveAbsolute(Uri uri, [Uri actualUri]);
+
+  /**
+   * Return an absolute URI that represents the given [source], or `null` if a
+   * valid URI cannot be computed.
+   *
+   * The computation should be based solely on [source.fullName].
+   */
+  Uri restoreAbsolute(Source source) => null;
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/source_io.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/source_io.dart
new file mode 100644
index 0000000..76d3396
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/source_io.dart
@@ -0,0 +1,559 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.source.io;
+
+import 'dart:collection';
+
+import 'engine.dart';
+import 'java_core.dart';
+import 'java_engine.dart';
+import 'java_io.dart';
+import 'source.dart';
+
+export 'source.dart';
+
+/**
+ * Instances of the class [DirectoryBasedSourceContainer] represent a source container that
+ * contains all sources within a given directory.
+ */
+class DirectoryBasedSourceContainer implements SourceContainer {
+  /**
+   * The container's path (not `null`).
+   */
+  String _path;
+
+  /**
+   * Construct a container representing the specified directory and containing any sources whose
+   * [Source.fullName] starts with the directory's path. This is a convenience method,
+   * fully equivalent to [DirectoryBasedSourceContainer.con2].
+   *
+   * @param directory the directory (not `null`)
+   */
+  DirectoryBasedSourceContainer.con1(JavaFile directory)
+      : this.con2(directory.getPath());
+
+  /**
+   * Construct a container representing the specified path and containing any sources whose
+   * [Source.fullName] starts with the specified path.
+   *
+   * @param path the path (not `null` and not empty)
+   */
+  DirectoryBasedSourceContainer.con2(String path) {
+    this._path = _appendFileSeparator(path);
+  }
+
+  @override
+  int get hashCode => _path.hashCode;
+
+  /**
+   * Answer the receiver's path, used to determine if a source is contained in the receiver.
+   *
+   * @return the path (not `null`, not empty)
+   */
+  String get path => _path;
+
+  @override
+  bool operator ==(Object obj) =>
+      (obj is DirectoryBasedSourceContainer) && obj.path == path;
+
+  @override
+  bool contains(Source source) => source.fullName.startsWith(_path);
+
+  @override
+  String toString() => "SourceContainer[$_path]";
+
+  /**
+   * Append the system file separator to the given path unless the path already ends with a
+   * separator.
+   *
+   * @param path the path to which the file separator is to be added
+   * @return a path that ends with the system file separator
+   */
+  static String _appendFileSeparator(String path) {
+    if (path == null ||
+        path.length <= 0 ||
+        path.codeUnitAt(path.length - 1) == JavaFile.separatorChar) {
+      return path;
+    }
+    return "$path${JavaFile.separator}";
+  }
+}
+
+/**
+ * Instances of the class `FileBasedSource` implement a source that represents a file.
+ */
+class FileBasedSource extends Source {
+  /**
+   * A function that changes the way that files are read off of disk.
+   */
+  static Function fileReadMode = (String s) => s;
+
+  /**
+   * Map from encoded URI/filepath pair to a unique integer identifier.  This
+   * identifier is used for equality tests and hash codes.
+   *
+   * The URI and filepath are joined into a pair by separating them with an '@'
+   * character.
+   */
+  static final Map<String, int> _idTable = new HashMap<String, int>();
+
+  /**
+   * The URI from which this source was originally derived.
+   */
+  final Uri uri;
+
+  /**
+   * The unique ID associated with this [FileBasedSource].
+   */
+  final int id;
+
+  /**
+   * The file represented by this source.
+   */
+  final JavaFile file;
+
+  /**
+   * The cached absolute path of this source.
+   */
+  String _absolutePath;
+
+  /**
+   * The cached encoding for this source.
+   */
+  String _encoding;
+
+  /**
+   * Initialize a newly created source object to represent the given [file]. If
+   * a [uri] is given, then it will be used as the URI from which the source was
+   * derived, otherwise a `file:` URI will be created based on the [file].
+   */
+  FileBasedSource(JavaFile file, [Uri uri])
+      : this.uri = (uri == null ? file.toURI() : uri),
+        this.file = file,
+        id = _idTable.putIfAbsent(
+            '${uri == null ? file.toURI() : uri}@${file.getPath()}',
+            () => _idTable.length);
+
+  /**
+   * Initialize a newly created source object.
+   *
+   * @param file the file represented by this source
+   */
+  @deprecated // Use new FileBasedSource(file)
+  FileBasedSource.con1(JavaFile file) : this(file);
+
+  /**
+   * Initialize a newly created source object.
+   *
+   * @param file the file represented by this source
+   * @param uri the URI from which this source was originally derived
+   */
+  @deprecated // Use new FileBasedSource(file, uri)
+  FileBasedSource.con2(Uri uri, JavaFile file)
+      : uri = uri,
+        file = file,
+        id = _idTable.putIfAbsent(
+            '$uri@${file.getPath()}', () => _idTable.length);
+
+  @override
+  TimestampedData<String> get contents {
+    return PerformanceStatistics.io.makeCurrentWhile(() {
+      return contentsFromFile;
+    });
+  }
+
+  /**
+   * Get the contents and timestamp of the underlying file.
+   *
+   * Clients should consider using the the method [AnalysisContext.getContents]
+   * because contexts can have local overrides of the content of a source that the source is not
+   * aware of.
+   *
+   * @return the contents of the source paired with the modification stamp of the source
+   * @throws Exception if the contents of this source could not be accessed
+   * See [contents].
+   */
+  TimestampedData<String> get contentsFromFile {
+    return new TimestampedData<String>(
+        file.lastModified(), fileReadMode(file.readAsStringSync()));
+  }
+
+  @override
+  String get encoding {
+    if (_encoding == null) {
+      _encoding = uri.toString();
+    }
+    return _encoding;
+  }
+
+  @override
+  String get fullName {
+    if (_absolutePath == null) {
+      _absolutePath = file.getAbsolutePath();
+    }
+    return _absolutePath;
+  }
+
+  @override
+  int get hashCode => id;
+
+  @override
+  bool get isInSystemLibrary => uri.scheme == DartUriResolver.DART_SCHEME;
+
+  @override
+  int get modificationStamp => file.lastModified();
+
+  @override
+  String get shortName => file.getName();
+
+  @override
+  UriKind get uriKind {
+    String scheme = uri.scheme;
+    if (scheme == PackageUriResolver.PACKAGE_SCHEME) {
+      return UriKind.PACKAGE_URI;
+    } else if (scheme == DartUriResolver.DART_SCHEME) {
+      return UriKind.DART_URI;
+    } else if (scheme == FileUriResolver.FILE_SCHEME) {
+      return UriKind.FILE_URI;
+    }
+    return UriKind.FILE_URI;
+  }
+
+  @override
+  bool operator ==(Object object) =>
+      object is FileBasedSource && id == object.id;
+
+  @override
+  bool exists() => file.isFile();
+
+  @override
+  Uri resolveRelativeUri(Uri containedUri) {
+    try {
+      Uri baseUri = uri;
+      bool isOpaque = uri.isAbsolute && !uri.path.startsWith('/');
+      if (isOpaque) {
+        String scheme = uri.scheme;
+        String part = uri.path;
+        if (scheme == DartUriResolver.DART_SCHEME && part.indexOf('/') < 0) {
+          part = "$part/$part.dart";
+        }
+        baseUri = parseUriWithException("$scheme:/$part");
+      }
+      Uri result = baseUri.resolveUri(containedUri);
+      if (isOpaque) {
+        result = parseUriWithException(
+            "${result.scheme}:${result.path.substring(1)}");
+      }
+      return result;
+    } catch (exception, stackTrace) {
+      throw new AnalysisException(
+          "Could not resolve URI ($containedUri) relative to source ($uri)",
+          new CaughtException(exception, stackTrace));
+    }
+  }
+
+  @override
+  String toString() {
+    if (file == null) {
+      return "<unknown source>";
+    }
+    return file.getAbsolutePath();
+  }
+}
+
+/**
+ * Instances of the class `FileUriResolver` resolve `file` URI's.
+ */
+class FileUriResolver extends UriResolver {
+  /**
+   * The name of the `file` scheme.
+   */
+  static String FILE_SCHEME = "file";
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    if (!isFileUri(uri)) {
+      return null;
+    }
+    return new FileBasedSource(
+        new JavaFile.fromUri(uri), actualUri != null ? actualUri : uri);
+  }
+
+  @override
+  Uri restoreAbsolute(Source source) {
+    return new Uri.file(source.fullName);
+  }
+
+  /**
+   * Return `true` if the given URI is a `file` URI.
+   *
+   * @param uri the URI being tested
+   * @return `true` if the given URI is a `file` URI
+   */
+  static bool isFileUri(Uri uri) => uri.scheme == FILE_SCHEME;
+}
+
+/**
+ * Instances of interface `LocalSourcePredicate` are used to determine if the given
+ * [Source] is "local" in some sense, so can be updated.
+ */
+abstract class LocalSourcePredicate {
+  /**
+   * Instance of [LocalSourcePredicate] that always returns `false`.
+   */
+  static final LocalSourcePredicate FALSE = new LocalSourcePredicate_FALSE();
+
+  /**
+   * Instance of [LocalSourcePredicate] that always returns `true`.
+   */
+  static final LocalSourcePredicate TRUE = new LocalSourcePredicate_TRUE();
+
+  /**
+   * Instance of [LocalSourcePredicate] that returns `true` for all [Source]s
+   * except of SDK.
+   */
+  static final LocalSourcePredicate NOT_SDK =
+      new LocalSourcePredicate_NOT_SDK();
+
+  /**
+   * Determines if the given [Source] is local.
+   *
+   * @param source the [Source] to analyze
+   * @return `true` if the given [Source] is local
+   */
+  bool isLocal(Source source);
+}
+
+class LocalSourcePredicate_FALSE implements LocalSourcePredicate {
+  @override
+  bool isLocal(Source source) => false;
+}
+
+class LocalSourcePredicate_NOT_SDK implements LocalSourcePredicate {
+  @override
+  bool isLocal(Source source) => source.uriKind != UriKind.DART_URI;
+}
+
+class LocalSourcePredicate_TRUE implements LocalSourcePredicate {
+  @override
+  bool isLocal(Source source) => true;
+}
+
+/**
+ * Instances of the class `PackageUriResolver` resolve `package` URI's in the context of
+ * an application.
+ *
+ * For the purposes of sharing analysis, the path to each package under the "packages" directory
+ * should be canonicalized, but to preserve relative links within a package, the remainder of the
+ * path from the package directory to the leaf should not.
+ */
+class PackageUriResolver extends UriResolver {
+  /**
+   * The name of the `package` scheme.
+   */
+  static String PACKAGE_SCHEME = "package";
+
+  /**
+   * Log exceptions thrown with the message "Required key not available" only once.
+   */
+  static bool _CanLogRequiredKeyIoException = true;
+
+  /**
+   * The package directories that `package` URI's are assumed to be relative to.
+   */
+  final List<JavaFile> _packagesDirectories;
+
+  /**
+   * Initialize a newly created resolver to resolve `package` URI's relative to the given
+   * package directories.
+   *
+   * @param packagesDirectories the package directories that `package` URI's are assumed to be
+   *          relative to
+   */
+  PackageUriResolver(this._packagesDirectories) {
+    if (_packagesDirectories.length < 1) {
+      throw new IllegalArgumentException(
+          "At least one package directory must be provided");
+    }
+  }
+
+  /**
+   * If the list of package directories contains one element, return it.
+   * Otherwise raise an exception.  Intended for testing.
+   */
+  String get packagesDirectory_forTesting {
+    int length = _packagesDirectories.length;
+    if (length != 1) {
+      throw new Exception('Expected 1 package directory, found $length');
+    }
+    return _packagesDirectories[0].getPath();
+  }
+
+  /**
+   * Answer the canonical file for the specified package.
+   *
+   * @param packagesDirectory the "packages" directory (not `null`)
+   * @param pkgName the package name (not `null`, not empty)
+   * @param relPath the path relative to the package directory (not `null`, no leading slash,
+   *          but may be empty string)
+   * @return the file (not `null`)
+   */
+  JavaFile getCanonicalFile(
+      JavaFile packagesDirectory, String pkgName, String relPath) {
+    JavaFile pkgDir = new JavaFile.relative(packagesDirectory, pkgName);
+    try {
+      pkgDir = pkgDir.getCanonicalFile();
+    } on JavaIOException catch (exception, stackTrace) {
+      if (!exception.toString().contains("Required key not available")) {
+        AnalysisEngine.instance.logger.logError("Canonical failed: $pkgDir",
+            new CaughtException(exception, stackTrace));
+      } else if (_CanLogRequiredKeyIoException) {
+        _CanLogRequiredKeyIoException = false;
+        AnalysisEngine.instance.logger.logError("Canonical failed: $pkgDir",
+            new CaughtException(exception, stackTrace));
+      }
+    }
+    return new JavaFile.relative(pkgDir, relPath.replaceAll(
+        '/', new String.fromCharCode(JavaFile.separatorChar)));
+  }
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    if (!isPackageUri(uri)) {
+      return null;
+    }
+    String path = uri.path;
+    if (path == null) {
+      path = uri.path;
+      if (path == null) {
+        return null;
+      }
+    }
+    String pkgName;
+    String relPath;
+    int index = path.indexOf('/');
+    if (index == -1) {
+      // No slash
+      pkgName = path;
+      relPath = "";
+    } else if (index == 0) {
+      // Leading slash is invalid
+      return null;
+    } else {
+      // <pkgName>/<relPath>
+      pkgName = path.substring(0, index);
+      relPath = path.substring(index + 1);
+    }
+    for (JavaFile packagesDirectory in _packagesDirectories) {
+      JavaFile resolvedFile = new JavaFile.relative(packagesDirectory, path);
+      if (resolvedFile.exists()) {
+        JavaFile canonicalFile =
+            getCanonicalFile(packagesDirectory, pkgName, relPath);
+        if (_isSelfReference(packagesDirectory, canonicalFile)) {
+          uri = canonicalFile.toURI();
+        }
+        return new FileBasedSource(
+            canonicalFile, actualUri != null ? actualUri : uri);
+      }
+    }
+    return new FileBasedSource(
+        getCanonicalFile(_packagesDirectories[0], pkgName, relPath),
+        actualUri != null ? actualUri : uri);
+  }
+
+  @override
+  Uri restoreAbsolute(Source source) {
+    String sourcePath = source.fullName;
+    for (JavaFile packagesDirectory in _packagesDirectories) {
+      List<JavaFile> pkgFolders = packagesDirectory.listFiles();
+      if (pkgFolders != null) {
+        for (JavaFile pkgFolder in pkgFolders) {
+          try {
+            String pkgCanonicalPath = pkgFolder.getCanonicalPath();
+            if (sourcePath.startsWith(pkgCanonicalPath)) {
+              String relPath = sourcePath.substring(pkgCanonicalPath.length);
+              return parseUriWithException(
+                  "$PACKAGE_SCHEME:${pkgFolder.getName()}$relPath");
+            }
+          } catch (e) {}
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * @return `true` if "file" was found in "packagesDir", and it is part of the "lib" folder
+   *         of the application that contains in this "packagesDir".
+   */
+  bool _isSelfReference(JavaFile packagesDir, JavaFile file) {
+    JavaFile rootDir = packagesDir.getParentFile();
+    if (rootDir == null) {
+      return false;
+    }
+    String rootPath = rootDir.getAbsolutePath();
+    String filePath = file.getAbsolutePath();
+    return filePath.startsWith("$rootPath/lib");
+  }
+
+  /**
+   * Return `true` if the given URI is a `package` URI.
+   *
+   * @param uri the URI being tested
+   * @return `true` if the given URI is a `package` URI
+   */
+  static bool isPackageUri(Uri uri) => PACKAGE_SCHEME == uri.scheme;
+}
+
+/**
+ * Instances of the class `RelativeFileUriResolver` resolve `file` URI's.
+ */
+class RelativeFileUriResolver extends UriResolver {
+  /**
+   * The name of the `file` scheme.
+   */
+  static String FILE_SCHEME = "file";
+
+  /**
+   * The directories for the relatvie URI's
+   */
+  final List<JavaFile> _relativeDirectories;
+
+  /**
+   * The root directory for all the source trees
+   */
+  final JavaFile _rootDirectory;
+
+  /**
+   * Initialize a newly created resolver to resolve `file` URI's relative to the given root
+   * directory.
+   */
+  RelativeFileUriResolver(this._rootDirectory, this._relativeDirectories)
+      : super();
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    String rootPath = _rootDirectory.toURI().path;
+    String uriPath = uri.path;
+    if (uriPath != null && uriPath.startsWith(rootPath)) {
+      String filePath = uri.path.substring(rootPath.length);
+      for (JavaFile dir in _relativeDirectories) {
+        JavaFile file = new JavaFile.relative(dir, filePath);
+        if (file.exists()) {
+          return new FileBasedSource(file, actualUri != null ? actualUri : uri);
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return `true` if the given URI is a `file` URI.
+   *
+   * @param uri the URI being tested
+   * @return `true` if the given URI is a `file` URI
+   */
+  static bool isFileUri(Uri uri) => uri.scheme == FILE_SCHEME;
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/static_type_analyzer.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/static_type_analyzer.dart
new file mode 100644
index 0000000..720f8bb
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -0,0 +1,1988 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.resolver.static_type_analyzer;
+
+import 'dart:collection';
+
+import 'package:analyzer/src/generated/scanner.dart';
+
+import 'ast.dart';
+import 'element.dart';
+import 'java_engine.dart';
+import 'resolver.dart';
+import 'scanner.dart' as sc;
+
+/**
+ * Instances of the class `StaticTypeAnalyzer` perform two type-related tasks. First, they
+ * compute the static type of every expression. Second, they look for any static type errors or
+ * warnings that might need to be generated. The requirements for the type analyzer are:
+ * <ol>
+ * * Every element that refers to types should be fully populated.
+ * * Every node representing an expression should be resolved to the Type of the expression.
+ * </ol>
+ */
+class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
+  /**
+   * A table mapping HTML tag names to the names of the classes (in 'dart:html') that implement
+   * those tags.
+   */
+  static HashMap<String, String> _HTML_ELEMENT_TO_CLASS_MAP =
+      _createHtmlTagToClassMap();
+
+  /**
+   * The resolver driving the resolution and type analysis.
+   */
+  final ResolverVisitor _resolver;
+
+  /**
+   * The object providing access to the types defined by the language.
+   */
+  TypeProvider _typeProvider;
+
+  /**
+   * The type system in use for static type analysis.
+   */
+  TypeSystem _typeSystem;
+
+  /**
+   * The type representing the type 'dynamic'.
+   */
+  DartType _dynamicType;
+
+  /**
+   * The type representing the class containing the nodes being analyzed,
+   * or `null` if the nodes are not within a class.
+   */
+  InterfaceType thisType;
+
+  /**
+   * The object keeping track of which elements have had their types overridden.
+   */
+  TypeOverrideManager _overrideManager;
+
+  /**
+   * The object keeping track of which elements have had their types promoted.
+   */
+  TypePromotionManager _promoteManager;
+
+  /**
+   * A table mapping [ExecutableElement]s to their propagated return types.
+   */
+  HashMap<ExecutableElement, DartType> _propagatedReturnTypes =
+      new HashMap<ExecutableElement, DartType>();
+
+  /**
+   * Initialize a newly created type analyzer.
+   *
+   * @param resolver the resolver driving this participant
+   */
+  StaticTypeAnalyzer(this._resolver) {
+    _typeProvider = _resolver.typeProvider;
+    _dynamicType = _typeProvider.dynamicType;
+    _overrideManager = _resolver.overrideManager;
+    _promoteManager = _resolver.promoteManager;
+    _typeSystem = new TypeSystemImpl(_typeProvider);
+  }
+
+  /**
+   * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is
+   * `String`.</blockquote>
+   */
+  @override
+  Object visitAdjacentStrings(AdjacentStrings node) {
+    _recordStaticType(node, _typeProvider.stringType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.32: <blockquote>... the cast expression <i>e as T</i> ...
+   *
+   * It is a static warning if <i>T</i> does not denote a type available in the current lexical
+   * scope.
+   *
+   * The static type of a cast expression <i>e as T</i> is <i>T</i>.</blockquote>
+   */
+  @override
+  Object visitAsExpression(AsExpression node) {
+    _recordStaticType(node, _getType(node.type));
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.18: <blockquote>... an assignment <i>a</i> of the form <i>v
+   * = e</i> ...
+   *
+   * It is a static type warning if the static type of <i>e</i> may not be assigned to the static
+   * type of <i>v</i>.
+   *
+   * The static type of the expression <i>v = e</i> is the static type of <i>e</i>.
+   *
+   * ... an assignment of the form <i>C.v = e</i> ...
+   *
+   * It is a static type warning if the static type of <i>e</i> may not be assigned to the static
+   * type of <i>C.v</i>.
+   *
+   * The static type of the expression <i>C.v = e</i> is the static type of <i>e</i>.
+   *
+   * ... an assignment of the form <i>e<sub>1</sub>.v = e<sub>2</sub></i> ...
+   *
+   * Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type warning if
+   * <i>T</i> does not have an accessible instance setter named <i>v=</i>. It is a static type
+   * warning if the static type of <i>e<sub>2</sub></i> may not be assigned to <i>T</i>.
+   *
+   * The static type of the expression <i>e<sub>1</sub>.v = e<sub>2</sub></i> is the static type of
+   * <i>e<sub>2</sub></i>.
+   *
+   * ... an assignment of the form <i>e<sub>1</sub>[e<sub>2</sub>] = e<sub>3</sub></i> ...
+   *
+   * The static type of the expression <i>e<sub>1</sub>[e<sub>2</sub>] = e<sub>3</sub></i> is the
+   * static type of <i>e<sub>3</sub></i>.
+   *
+   * A compound assignment of the form <i>v op= e</i> is equivalent to <i>v = v op e</i>. A compound
+   * assignment of the form <i>C.v op= e</i> is equivalent to <i>C.v = C.v op e</i>. A compound
+   * assignment of the form <i>e<sub>1</sub>.v op= e<sub>2</sub></i> is equivalent to <i>((x) => x.v
+   * = x.v op e<sub>2</sub>)(e<sub>1</sub>)</i> where <i>x</i> is a variable that is not used in
+   * <i>e<sub>2</sub></i>. A compound assignment of the form <i>e<sub>1</sub>[e<sub>2</sub>] op=
+   * e<sub>3</sub></i> is equivalent to <i>((a, i) => a[i] = a[i] op e<sub>3</sub>)(e<sub>1</sub>,
+   * e<sub>2</sub>)</i> where <i>a</i> and <i>i</i> are a variables that are not used in
+   * <i>e<sub>3</sub></i>.</blockquote>
+   */
+  @override
+  Object visitAssignmentExpression(AssignmentExpression node) {
+    sc.TokenType operator = node.operator.type;
+    if (operator == sc.TokenType.EQ) {
+      Expression rightHandSide = node.rightHandSide;
+      DartType staticType = _getStaticType(rightHandSide);
+      _recordStaticType(node, staticType);
+      DartType overrideType = staticType;
+      DartType propagatedType = rightHandSide.propagatedType;
+      if (propagatedType != null) {
+        _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
+        overrideType = propagatedType;
+      }
+      _resolver.overrideExpression(node.leftHandSide, overrideType, true, true);
+    } else if (operator == sc.TokenType.QUESTION_QUESTION_EQ) {
+      // The static type of a compound assignment using ??= is the least upper
+      // bound of the static types of the LHS and RHS.
+      _analyzeLeastUpperBound(node, node.leftHandSide, node.rightHandSide);
+      return null;
+    } else {
+      ExecutableElement staticMethodElement = node.staticElement;
+      DartType staticType = _computeStaticReturnType(staticMethodElement);
+      _recordStaticType(node, staticType);
+      MethodElement propagatedMethodElement = node.propagatedElement;
+      if (!identical(propagatedMethodElement, staticMethodElement)) {
+        DartType propagatedType =
+            _computeStaticReturnType(propagatedMethodElement);
+        _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
+      }
+    }
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 16.29 (Await Expressions):
+   *
+   *   The static type of [the expression "await e"] is flatten(T) where T is
+   *   the static type of e.
+   */
+  @override
+  Object visitAwaitExpression(AwaitExpression node) {
+    DartType staticExpressionType = _getStaticType(node.expression);
+    if (staticExpressionType == null) {
+      // TODO(brianwilkerson) Determine whether this can still happen.
+      staticExpressionType = _dynamicType;
+    }
+    DartType staticType = flattenFutures(_typeProvider, staticExpressionType);
+    _recordStaticType(node, staticType);
+    DartType propagatedExpressionType = node.expression.propagatedType;
+    DartType propagatedType =
+        flattenFutures(_typeProvider, propagatedExpressionType);
+    _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.20: <blockquote>The static type of a logical boolean
+   * expression is `bool`.</blockquote>
+   *
+   * The Dart Language Specification, 12.21:<blockquote>A bitwise expression of the form
+   * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocation
+   * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. A bitwise expression of the form <i>super op
+   * e<sub>2</sub></i> is equivalent to the method invocation
+   * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
+   *
+   * The Dart Language Specification, 12.22: <blockquote>The static type of an equality expression
+   * is `bool`.</blockquote>
+   *
+   * The Dart Language Specification, 12.23: <blockquote>A relational expression of the form
+   * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocation
+   * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. A relational expression of the form <i>super op
+   * e<sub>2</sub></i> is equivalent to the method invocation
+   * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
+   *
+   * The Dart Language Specification, 12.24: <blockquote>A shift expression of the form
+   * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocation
+   * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. A shift expression of the form <i>super op
+   * e<sub>2</sub></i> is equivalent to the method invocation
+   * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
+   *
+   * The Dart Language Specification, 12.25: <blockquote>An additive expression of the form
+   * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocation
+   * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. An additive expression of the form <i>super op
+   * e<sub>2</sub></i> is equivalent to the method invocation
+   * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
+   *
+   * The Dart Language Specification, 12.26: <blockquote>A multiplicative expression of the form
+   * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocation
+   * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. A multiplicative expression of the form <i>super op
+   * e<sub>2</sub></i> is equivalent to the method invocation
+   * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
+   */
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    if (node.operator.type == TokenType.QUESTION_QUESTION) {
+      // Evaluation of an if-null expresion e of the form e1 ?? e2 is
+      // equivalent to the evaluation of the expression
+      // ((x) => x == null ? e2 : x)(e1).  The static type of e is the least
+      // upper bound of the static type of e1 and the static type of e2.
+      _analyzeLeastUpperBound(node, node.leftOperand, node.rightOperand);
+      return null;
+    }
+    ExecutableElement staticMethodElement = node.staticElement;
+    DartType staticType = _computeStaticReturnType(staticMethodElement);
+    staticType = _refineBinaryExpressionType(node, staticType, _getStaticType);
+    _recordStaticType(node, staticType);
+    MethodElement propagatedMethodElement = node.propagatedElement;
+    if (!identical(propagatedMethodElement, staticMethodElement)) {
+      DartType propagatedType =
+          _computeStaticReturnType(propagatedMethodElement);
+      propagatedType =
+          _refineBinaryExpressionType(node, propagatedType, _getBestType);
+      _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
+    }
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.4: <blockquote>The static type of a boolean literal is
+   * bool.</blockquote>
+   */
+  @override
+  Object visitBooleanLiteral(BooleanLiteral node) {
+    _recordStaticType(node, _typeProvider.boolType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.15.2: <blockquote>A cascaded method invocation expression
+   * of the form <i>e..suffix</i> is equivalent to the expression <i>(t) {t.suffix; return
+   * t;}(e)</i>.</blockquote>
+   */
+  @override
+  Object visitCascadeExpression(CascadeExpression node) {
+    _recordStaticType(node, _getStaticType(node.target));
+    _resolver.recordPropagatedTypeIfBetter(node, node.target.propagatedType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.19: <blockquote> ... a conditional expression <i>c</i> of
+   * the form <i>e<sub>1</sub> ? e<sub>2</sub> : e<sub>3</sub></i> ...
+   *
+   * It is a static type warning if the type of e<sub>1</sub> may not be assigned to `bool`.
+   *
+   * The static type of <i>c</i> is the least upper bound of the static type of <i>e<sub>2</sub></i>
+   * and the static type of <i>e<sub>3</sub></i>.</blockquote>
+   */
+  @override
+  Object visitConditionalExpression(ConditionalExpression node) {
+    _analyzeLeastUpperBound(node, node.thenExpression, node.elseExpression);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.3: <blockquote>The static type of a literal double is
+   * double.</blockquote>
+   */
+  @override
+  Object visitDoubleLiteral(DoubleLiteral node) {
+    _recordStaticType(node, _typeProvider.doubleType);
+    return null;
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    FunctionExpression function = node.functionExpression;
+    ExecutableElementImpl functionElement =
+        node.element as ExecutableElementImpl;
+    functionElement.returnType =
+        _computeStaticReturnTypeOfFunctionDeclaration(node);
+    _recordPropagatedTypeOfFunction(functionElement, function.body);
+    _recordStaticType(function, functionElement.type);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.9: <blockquote>The static type of a function literal of the
+   * form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;, T<sub>n</sub> a<sub>n</sub>, [T<sub>n+1</sub>
+   * x<sub>n+1</sub> = d1, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub> = dk]) => e</i> is
+   * <i>(T<sub>1</sub>, &hellip;, Tn, [T<sub>n+1</sub> x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub>
+   * x<sub>n+k</sub>]) &rarr; T<sub>0</sub></i>, where <i>T<sub>0</sub></i> is the static type of
+   * <i>e</i>. In any case where <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>, is not specified, it is
+   * considered to have been specified as dynamic.
+   *
+   * The static type of a function literal of the form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;,
+   * T<sub>n</sub> a<sub>n</sub>, {T<sub>n+1</sub> x<sub>n+1</sub> : d1, &hellip;, T<sub>n+k</sub>
+   * x<sub>n+k</sub> : dk}) => e</i> is <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {T<sub>n+1</sub>
+   * x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub>}) &rarr; T<sub>0</sub></i>, where
+   * <i>T<sub>0</sub></i> is the static type of <i>e</i>. In any case where <i>T<sub>i</sub>, 1
+   * &lt;= i &lt;= n</i>, is not specified, it is considered to have been specified as dynamic.
+   *
+   * The static type of a function literal of the form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;,
+   * T<sub>n</sub> a<sub>n</sub>, [T<sub>n+1</sub> x<sub>n+1</sub> = d1, &hellip;, T<sub>n+k</sub>
+   * x<sub>n+k</sub> = dk]) {s}</i> is <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, [T<sub>n+1</sub>
+   * x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub>]) &rarr; dynamic</i>. In any case
+   * where <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>, is not specified, it is considered to have been
+   * specified as dynamic.
+   *
+   * The static type of a function literal of the form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;,
+   * T<sub>n</sub> a<sub>n</sub>, {T<sub>n+1</sub> x<sub>n+1</sub> : d1, &hellip;, T<sub>n+k</sub>
+   * x<sub>n+k</sub> : dk}) {s}</i> is <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {T<sub>n+1</sub>
+   * x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub>}) &rarr; dynamic</i>. In any case
+   * where <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>, is not specified, it is considered to have been
+   * specified as dynamic.</blockquote>
+   */
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    if (node.parent is FunctionDeclaration) {
+      // The function type will be resolved and set when we visit the parent
+      // node.
+      return null;
+    }
+    ExecutableElementImpl functionElement =
+        node.element as ExecutableElementImpl;
+    functionElement.returnType =
+        _computeStaticReturnTypeOfFunctionExpression(node);
+    _recordPropagatedTypeOfFunction(functionElement, node.body);
+    _recordStaticType(node, node.element.type);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.14.4: <blockquote>A function expression invocation <i>i</i>
+   * has the form <i>e<sub>f</sub>(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
+   * a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>, where <i>e<sub>f</sub></i> is
+   * an expression.
+   *
+   * It is a static type warning if the static type <i>F</i> of <i>e<sub>f</sub></i> may not be
+   * assigned to a function type.
+   *
+   * If <i>F</i> is not a function type, the static type of <i>i</i> is dynamic. Otherwise the
+   * static type of <i>i</i> is the declared return type of <i>F</i>.</blockquote>
+   */
+  @override
+  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    DartType functionStaticType = _getStaticType(node.function);
+    DartType staticType;
+    if (functionStaticType is FunctionType) {
+      staticType = functionStaticType.returnType;
+    } else {
+      staticType = _dynamicType;
+    }
+    _recordStaticType(node, staticType);
+    DartType functionPropagatedType = node.function.propagatedType;
+    if (functionPropagatedType is FunctionType) {
+      DartType propagatedType = functionPropagatedType.returnType;
+      _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
+    }
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.29: <blockquote>An assignable expression of the form
+   * <i>e<sub>1</sub>[e<sub>2</sub>]</i> is evaluated as a method invocation of the operator method
+   * <i>[]</i> on <i>e<sub>1</sub></i> with argument <i>e<sub>2</sub></i>.</blockquote>
+   */
+  @override
+  Object visitIndexExpression(IndexExpression node) {
+    if (node.inSetterContext()) {
+      ExecutableElement staticMethodElement = node.staticElement;
+      DartType staticType = _computeArgumentType(staticMethodElement);
+      _recordStaticType(node, staticType);
+      MethodElement propagatedMethodElement = node.propagatedElement;
+      if (!identical(propagatedMethodElement, staticMethodElement)) {
+        DartType propagatedType = _computeArgumentType(propagatedMethodElement);
+        _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
+      }
+    } else {
+      ExecutableElement staticMethodElement = node.staticElement;
+      DartType staticType = _computeStaticReturnType(staticMethodElement);
+      _recordStaticType(node, staticType);
+      MethodElement propagatedMethodElement = node.propagatedElement;
+      if (!identical(propagatedMethodElement, staticMethodElement)) {
+        DartType propagatedType =
+            _computeStaticReturnType(propagatedMethodElement);
+        _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
+      }
+    }
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.11.1: <blockquote>The static type of a new expression of
+   * either the form <i>new T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> or the form <i>new
+   * T(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> is <i>T</i>.</blockquote>
+   *
+   * The Dart Language Specification, 12.11.2: <blockquote>The static type of a constant object
+   * expression of either the form <i>const T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> or the
+   * form <i>const T(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> is <i>T</i>. </blockquote>
+   */
+  @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    _recordStaticType(node, node.constructorName.type.type);
+    ConstructorElement element = node.staticElement;
+    if (element != null && "Element" == element.enclosingElement.name) {
+      LibraryElement library = element.library;
+      if (_isHtmlLibrary(library)) {
+        String constructorName = element.name;
+        if ("tag" == constructorName) {
+          DartType returnType = _getFirstArgumentAsTypeWithMap(
+              library, node.argumentList, _HTML_ELEMENT_TO_CLASS_MAP);
+          _resolver.recordPropagatedTypeIfBetter(node, returnType);
+        } else {
+          DartType returnType = _getElementNameAsType(
+              library, constructorName, _HTML_ELEMENT_TO_CLASS_MAP);
+          _resolver.recordPropagatedTypeIfBetter(node, returnType);
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.3: <blockquote>The static type of an integer literal is
+   * `int`.</blockquote>
+   */
+  @override
+  Object visitIntegerLiteral(IntegerLiteral node) {
+    _recordStaticType(node, _typeProvider.intType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.31: <blockquote>It is a static warning if <i>T</i> does not
+   * denote a type available in the current lexical scope.
+   *
+   * The static type of an is-expression is `bool`.</blockquote>
+   */
+  @override
+  Object visitIsExpression(IsExpression node) {
+    _recordStaticType(node, _typeProvider.boolType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.6: <blockquote>The static type of a list literal of the
+   * form <i><b>const</b> &lt;E&gt;[e<sub>1</sub>, &hellip;, e<sub>n</sub>]</i> or the form
+   * <i>&lt;E&gt;[e<sub>1</sub>, &hellip;, e<sub>n</sub>]</i> is `List&lt;E&gt;`. The static
+   * type a list literal of the form <i><b>const</b> [e<sub>1</sub>, &hellip;, e<sub>n</sub>]</i> or
+   * the form <i>[e<sub>1</sub>, &hellip;, e<sub>n</sub>]</i> is `List&lt;dynamic&gt;`
+   * .</blockquote>
+   */
+  @override
+  Object visitListLiteral(ListLiteral node) {
+    DartType staticType = _dynamicType;
+    TypeArgumentList typeArguments = node.typeArguments;
+    if (typeArguments != null) {
+      NodeList<TypeName> arguments = typeArguments.arguments;
+      if (arguments != null && arguments.length == 1) {
+        TypeName argumentTypeName = arguments[0];
+        DartType argumentType = _getType(argumentTypeName);
+        if (argumentType != null) {
+          staticType = argumentType;
+        }
+      }
+    }
+    _recordStaticType(
+        node, _typeProvider.listType.substitute4(<DartType>[staticType]));
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.7: <blockquote>The static type of a map literal of the form
+   * <i><b>const</b> &lt;K, V&gt; {k<sub>1</sub>:e<sub>1</sub>, &hellip;,
+   * k<sub>n</sub>:e<sub>n</sub>}</i> or the form <i>&lt;K, V&gt; {k<sub>1</sub>:e<sub>1</sub>,
+   * &hellip;, k<sub>n</sub>:e<sub>n</sub>}</i> is `Map&lt;K, V&gt;`. The static type a map
+   * literal of the form <i><b>const</b> {k<sub>1</sub>:e<sub>1</sub>, &hellip;,
+   * k<sub>n</sub>:e<sub>n</sub>}</i> or the form <i>{k<sub>1</sub>:e<sub>1</sub>, &hellip;,
+   * k<sub>n</sub>:e<sub>n</sub>}</i> is `Map&lt;dynamic, dynamic&gt;`.
+   *
+   * It is a compile-time error if the first type argument to a map literal is not
+   * <i>String</i>.</blockquote>
+   */
+  @override
+  Object visitMapLiteral(MapLiteral node) {
+    DartType staticKeyType = _dynamicType;
+    DartType staticValueType = _dynamicType;
+    TypeArgumentList typeArguments = node.typeArguments;
+    if (typeArguments != null) {
+      NodeList<TypeName> arguments = typeArguments.arguments;
+      if (arguments != null && arguments.length == 2) {
+        TypeName entryKeyTypeName = arguments[0];
+        DartType entryKeyType = _getType(entryKeyTypeName);
+        if (entryKeyType != null) {
+          staticKeyType = entryKeyType;
+        }
+        TypeName entryValueTypeName = arguments[1];
+        DartType entryValueType = _getType(entryValueTypeName);
+        if (entryValueType != null) {
+          staticValueType = entryValueType;
+        }
+      }
+    }
+    _recordStaticType(
+        node,
+        _typeProvider.mapType
+            .substitute4(<DartType>[staticKeyType, staticValueType]));
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.15.1: <blockquote>An ordinary method invocation <i>i</i>
+   * has the form <i>o.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>,
+   * &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>.
+   *
+   * Let <i>T</i> be the static type of <i>o</i>. It is a static type warning if <i>T</i> does not
+   * have an accessible instance member named <i>m</i>. If <i>T.m</i> exists, it is a static warning
+   * if the type <i>F</i> of <i>T.m</i> may not be assigned to a function type.
+   *
+   * If <i>T.m</i> does not exist, or if <i>F</i> is not a function type, the static type of
+   * <i>i</i> is dynamic. Otherwise the static type of <i>i</i> is the declared return type of
+   * <i>F</i>.</blockquote>
+   *
+   * The Dart Language Specification, 11.15.3: <blockquote>A static method invocation <i>i</i> has
+   * the form <i>C.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>,
+   * &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>.
+   *
+   * It is a static type warning if the type <i>F</i> of <i>C.m</i> may not be assigned to a
+   * function type.
+   *
+   * If <i>F</i> is not a function type, or if <i>C.m</i> does not exist, the static type of i is
+   * dynamic. Otherwise the static type of <i>i</i> is the declared return type of
+   * <i>F</i>.</blockquote>
+   *
+   * The Dart Language Specification, 11.15.4: <blockquote>A super method invocation <i>i</i> has
+   * the form <i>super.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>,
+   * &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>.
+   *
+   * It is a static type warning if <i>S</i> does not have an accessible instance member named m. If
+   * <i>S.m</i> exists, it is a static warning if the type <i>F</i> of <i>S.m</i> may not be
+   * assigned to a function type.
+   *
+   * If <i>S.m</i> does not exist, or if <i>F</i> is not a function type, the static type of
+   * <i>i</i> is dynamic. Otherwise the static type of <i>i</i> is the declared return type of
+   * <i>F</i>.</blockquote>
+   */
+  @override
+  Object visitMethodInvocation(MethodInvocation node) {
+    SimpleIdentifier methodNameNode = node.methodName;
+    Element staticMethodElement = methodNameNode.staticElement;
+    // Record types of the variable invoked as a function.
+    if (staticMethodElement is VariableElement) {
+      VariableElement variable = staticMethodElement;
+      DartType staticType = variable.type;
+      _recordStaticType(methodNameNode, staticType);
+      DartType propagatedType = _overrideManager.getType(variable);
+      _resolver.recordPropagatedTypeIfBetter(methodNameNode, propagatedType);
+    }
+    // Record static return type of the static element.
+    DartType staticStaticType = _computeStaticReturnType(staticMethodElement);
+    _recordStaticType(node, staticStaticType);
+    // Record propagated return type of the static element.
+    DartType staticPropagatedType =
+        _computePropagatedReturnType(staticMethodElement);
+    _resolver.recordPropagatedTypeIfBetter(node, staticPropagatedType);
+    // Check for special cases.
+    bool needPropagatedType = true;
+    String methodName = methodNameNode.name;
+    if (methodName == "then") {
+      Expression target = node.realTarget;
+      if (target != null) {
+        DartType targetType = target.bestType;
+        if (_isAsyncFutureType(targetType)) {
+          // Future.then(closure) return type is:
+          // 1) the returned Future type, if the closure returns a Future;
+          // 2) Future<valueType>, if the closure returns a value.
+          NodeList<Expression> arguments = node.argumentList.arguments;
+          if (arguments.length == 1) {
+            // TODO(brianwilkerson) Handle the case where both arguments are
+            // provided.
+            Expression closureArg = arguments[0];
+            if (closureArg is FunctionExpression) {
+              FunctionExpression closureExpr = closureArg;
+              DartType returnType =
+                  _computePropagatedReturnType(closureExpr.element);
+              if (returnType != null) {
+                // prepare the type of the returned Future
+                InterfaceTypeImpl newFutureType;
+                if (_isAsyncFutureType(returnType)) {
+                  newFutureType = returnType as InterfaceTypeImpl;
+                } else {
+                  InterfaceType futureType = targetType as InterfaceType;
+                  newFutureType = new InterfaceTypeImpl(futureType.element);
+                  newFutureType.typeArguments = <DartType>[returnType];
+                }
+                // set the 'then' invocation type
+                _recordPropagatedType(node, newFutureType);
+                needPropagatedType = false;
+                return null;
+              }
+            }
+          }
+        }
+      }
+    } else if (methodName == "\$dom_createEvent") {
+      Expression target = node.realTarget;
+      if (target != null) {
+        DartType targetType = target.bestType;
+        if (targetType is InterfaceType &&
+            (targetType.name == "HtmlDocument" ||
+                targetType.name == "Document")) {
+          LibraryElement library = targetType.element.library;
+          if (_isHtmlLibrary(library)) {
+            DartType returnType =
+                _getFirstArgumentAsType(library, node.argumentList);
+            if (returnType != null) {
+              _recordPropagatedType(node, returnType);
+              needPropagatedType = false;
+            }
+          }
+        }
+      }
+    } else if (methodName == "query") {
+      Expression target = node.realTarget;
+      if (target == null) {
+        Element methodElement = methodNameNode.bestElement;
+        if (methodElement != null) {
+          LibraryElement library = methodElement.library;
+          if (_isHtmlLibrary(library)) {
+            DartType returnType =
+                _getFirstArgumentAsQuery(library, node.argumentList);
+            if (returnType != null) {
+              _recordPropagatedType(node, returnType);
+              needPropagatedType = false;
+            }
+          }
+        }
+      } else {
+        DartType targetType = target.bestType;
+        if (targetType is InterfaceType &&
+            (targetType.name == "HtmlDocument" ||
+                targetType.name == "Document")) {
+          LibraryElement library = targetType.element.library;
+          if (_isHtmlLibrary(library)) {
+            DartType returnType =
+                _getFirstArgumentAsQuery(library, node.argumentList);
+            if (returnType != null) {
+              _recordPropagatedType(node, returnType);
+              needPropagatedType = false;
+            }
+          }
+        }
+      }
+    } else if (methodName == "\$dom_createElement") {
+      Expression target = node.realTarget;
+      if (target != null) {
+        DartType targetType = target.bestType;
+        if (targetType is InterfaceType &&
+            (targetType.name == "HtmlDocument" ||
+                targetType.name == "Document")) {
+          LibraryElement library = targetType.element.library;
+          if (_isHtmlLibrary(library)) {
+            DartType returnType =
+                _getFirstArgumentAsQuery(library, node.argumentList);
+            if (returnType != null) {
+              _recordPropagatedType(node, returnType);
+              needPropagatedType = false;
+            }
+          }
+        }
+      }
+    } else if (methodName == "JS") {
+      DartType returnType = _getFirstArgumentAsType(
+          _typeProvider.objectType.element.library, node.argumentList);
+      if (returnType != null) {
+        _recordPropagatedType(node, returnType);
+        needPropagatedType = false;
+      }
+    } else if (methodName == "getContext") {
+      Expression target = node.realTarget;
+      if (target != null) {
+        DartType targetType = target.bestType;
+        if (targetType is InterfaceType &&
+            (targetType.name == "CanvasElement")) {
+          NodeList<Expression> arguments = node.argumentList.arguments;
+          if (arguments.length == 1) {
+            Expression argument = arguments[0];
+            if (argument is StringLiteral) {
+              String value = argument.stringValue;
+              if ("2d" == value) {
+                PropertyAccessorElement getter =
+                    targetType.element.getGetter("context2D");
+                if (getter != null) {
+                  DartType returnType = getter.returnType;
+                  if (returnType != null) {
+                    _recordPropagatedType(node, returnType);
+                    needPropagatedType = false;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+    if (needPropagatedType) {
+      Element propagatedElement = methodNameNode.propagatedElement;
+      // HACK: special case for object methods ([toString]) on dynamic
+      // expressions. More special cases in [visitPrefixedIdentfier].
+      if (propagatedElement == null) {
+        propagatedElement =
+            _typeProvider.objectType.getMethod(methodNameNode.name);
+      }
+      if (!identical(propagatedElement, staticMethodElement)) {
+        // Record static return type of the propagated element.
+        DartType propagatedStaticType =
+            _computeStaticReturnType(propagatedElement);
+        _resolver.recordPropagatedTypeIfBetter(
+            node, propagatedStaticType, true);
+        // Record propagated return type of the propagated element.
+        DartType propagatedPropagatedType =
+            _computePropagatedReturnType(propagatedElement);
+        _resolver.recordPropagatedTypeIfBetter(
+            node, propagatedPropagatedType, true);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitNamedExpression(NamedExpression node) {
+    Expression expression = node.expression;
+    _recordStaticType(node, _getStaticType(expression));
+    _resolver.recordPropagatedTypeIfBetter(node, expression.propagatedType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.2: <blockquote>The static type of `null` is bottom.
+   * </blockquote>
+   */
+  @override
+  Object visitNullLiteral(NullLiteral node) {
+    _recordStaticType(node, _typeProvider.bottomType);
+    return null;
+  }
+
+  @override
+  Object visitParenthesizedExpression(ParenthesizedExpression node) {
+    Expression expression = node.expression;
+    _recordStaticType(node, _getStaticType(expression));
+    _resolver.recordPropagatedTypeIfBetter(node, expression.propagatedType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.28: <blockquote>A postfix expression of the form
+   * <i>v++</i>, where <i>v</i> is an identifier, is equivalent to <i>(){var r = v; v = r + 1;
+   * return r}()</i>.
+   *
+   * A postfix expression of the form <i>C.v++</i> is equivalent to <i>(){var r = C.v; C.v = r + 1;
+   * return r}()</i>.
+   *
+   * A postfix expression of the form <i>e1.v++</i> is equivalent to <i>(x){var r = x.v; x.v = r +
+   * 1; return r}(e1)</i>.
+   *
+   * A postfix expression of the form <i>e1[e2]++</i> is equivalent to <i>(a, i){var r = a[i]; a[i]
+   * = r + 1; return r}(e1, e2)</i>
+   *
+   * A postfix expression of the form <i>v--</i>, where <i>v</i> is an identifier, is equivalent to
+   * <i>(){var r = v; v = r - 1; return r}()</i>.
+   *
+   * A postfix expression of the form <i>C.v--</i> is equivalent to <i>(){var r = C.v; C.v = r - 1;
+   * return r}()</i>.
+   *
+   * A postfix expression of the form <i>e1.v--</i> is equivalent to <i>(x){var r = x.v; x.v = r -
+   * 1; return r}(e1)</i>.
+   *
+   * A postfix expression of the form <i>e1[e2]--</i> is equivalent to <i>(a, i){var r = a[i]; a[i]
+   * = r - 1; return r}(e1, e2)</i></blockquote>
+   */
+  @override
+  Object visitPostfixExpression(PostfixExpression node) {
+    Expression operand = node.operand;
+    DartType staticType = _getStaticType(operand);
+    sc.TokenType operator = node.operator.type;
+    if (operator == sc.TokenType.MINUS_MINUS ||
+        operator == sc.TokenType.PLUS_PLUS) {
+      DartType intType = _typeProvider.intType;
+      if (identical(_getStaticType(node.operand), intType)) {
+        staticType = intType;
+      }
+    }
+    _recordStaticType(node, staticType);
+    _resolver.recordPropagatedTypeIfBetter(node, operand.propagatedType);
+    return null;
+  }
+
+  /**
+   * See [visitSimpleIdentifier].
+   */
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    SimpleIdentifier prefixedIdentifier = node.identifier;
+    Element staticElement = prefixedIdentifier.staticElement;
+    DartType staticType = _dynamicType;
+    DartType propagatedType = null;
+    if (staticElement is ClassElement) {
+      if (_isNotTypeLiteral(node)) {
+        staticType = staticElement.type;
+      } else {
+        staticType = _typeProvider.typeType;
+      }
+    } else if (staticElement is FunctionTypeAliasElement) {
+      if (_isNotTypeLiteral(node)) {
+        staticType = staticElement.type;
+      } else {
+        staticType = _typeProvider.typeType;
+      }
+    } else if (staticElement is MethodElement) {
+      staticType = staticElement.type;
+    } else if (staticElement is PropertyAccessorElement) {
+      staticType = _getTypeOfProperty(staticElement, node.prefix.staticType);
+      propagatedType =
+          _getPropertyPropagatedType(staticElement, propagatedType);
+    } else if (staticElement is ExecutableElement) {
+      staticType = staticElement.type;
+    } else if (staticElement is TypeParameterElement) {
+      staticType = staticElement.type;
+    } else if (staticElement is VariableElement) {
+      staticType = staticElement.type;
+    }
+    _recordStaticType(prefixedIdentifier, staticType);
+    _recordStaticType(node, staticType);
+    Element propagatedElement = prefixedIdentifier.propagatedElement;
+    // HACK: special case for object getters ([hashCode] and [runtimeType]) on
+    // dynamic expressions. More special cases in [visitMethodInvocation].
+    if (propagatedElement == null) {
+      propagatedElement =
+          _typeProvider.objectType.getGetter(prefixedIdentifier.name);
+    }
+    if (propagatedElement is ClassElement) {
+      if (_isNotTypeLiteral(node)) {
+        propagatedType = propagatedElement.type;
+      } else {
+        propagatedType = _typeProvider.typeType;
+      }
+    } else if (propagatedElement is FunctionTypeAliasElement) {
+      propagatedType = propagatedElement.type;
+    } else if (propagatedElement is MethodElement) {
+      propagatedType = propagatedElement.type;
+    } else if (propagatedElement is PropertyAccessorElement) {
+      propagatedType =
+          _getTypeOfProperty(propagatedElement, node.prefix.staticType);
+      propagatedType =
+          _getPropertyPropagatedType(propagatedElement, propagatedType);
+    } else if (propagatedElement is ExecutableElement) {
+      propagatedType = propagatedElement.type;
+    } else if (propagatedElement is TypeParameterElement) {
+      propagatedType = propagatedElement.type;
+    } else if (propagatedElement is VariableElement) {
+      propagatedType = propagatedElement.type;
+    }
+    DartType overriddenType = _overrideManager.getType(propagatedElement);
+    if (propagatedType == null ||
+        (overriddenType != null &&
+            overriddenType.isMoreSpecificThan(propagatedType))) {
+      propagatedType = overriddenType;
+    }
+    _resolver.recordPropagatedTypeIfBetter(prefixedIdentifier, propagatedType);
+    _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.27: <blockquote>A unary expression <i>u</i> of the form
+   * <i>op e</i> is equivalent to a method invocation <i>expression e.op()</i>. An expression of the
+   * form <i>op super</i> is equivalent to the method invocation <i>super.op()<i>.</blockquote>
+   */
+  @override
+  Object visitPrefixExpression(PrefixExpression node) {
+    sc.TokenType operator = node.operator.type;
+    if (operator == sc.TokenType.BANG) {
+      _recordStaticType(node, _typeProvider.boolType);
+    } else {
+      // The other cases are equivalent to invoking a method.
+      ExecutableElement staticMethodElement = node.staticElement;
+      DartType staticType = _computeStaticReturnType(staticMethodElement);
+      if (operator == sc.TokenType.MINUS_MINUS ||
+          operator == sc.TokenType.PLUS_PLUS) {
+        DartType intType = _typeProvider.intType;
+        if (identical(_getStaticType(node.operand), intType)) {
+          staticType = intType;
+        }
+      }
+      _recordStaticType(node, staticType);
+      MethodElement propagatedMethodElement = node.propagatedElement;
+      if (!identical(propagatedMethodElement, staticMethodElement)) {
+        DartType propagatedType =
+            _computeStaticReturnType(propagatedMethodElement);
+        _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
+      }
+    }
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.13: <blockquote> Property extraction allows for a member of
+   * an object to be concisely extracted from the object. If <i>o</i> is an object, and if <i>m</i>
+   * is the name of a method member of <i>o</i>, then
+   * * <i>o.m</i> is defined to be equivalent to: <i>(r<sub>1</sub>, &hellip;, r<sub>n</sub>,
+   * {p<sub>1</sub> : d<sub>1</sub>, &hellip;, p<sub>k</sub> : d<sub>k</sub>}){return
+   * o.m(r<sub>1</sub>, &hellip;, r<sub>n</sub>, p<sub>1</sub>: p<sub>1</sub>, &hellip;,
+   * p<sub>k</sub>: p<sub>k</sub>);}</i> if <i>m</i> has required parameters <i>r<sub>1</sub>,
+   * &hellip;, r<sub>n</sub></i>, and named parameters <i>p<sub>1</sub> &hellip; p<sub>k</sub></i>
+   * with defaults <i>d<sub>1</sub>, &hellip;, d<sub>k</sub></i>.
+   * * <i>(r<sub>1</sub>, &hellip;, r<sub>n</sub>, [p<sub>1</sub> = d<sub>1</sub>, &hellip;,
+   * p<sub>k</sub> = d<sub>k</sub>]){return o.m(r<sub>1</sub>, &hellip;, r<sub>n</sub>,
+   * p<sub>1</sub>, &hellip;, p<sub>k</sub>);}</i> if <i>m</i> has required parameters
+   * <i>r<sub>1</sub>, &hellip;, r<sub>n</sub></i>, and optional positional parameters
+   * <i>p<sub>1</sub> &hellip; p<sub>k</sub></i> with defaults <i>d<sub>1</sub>, &hellip;,
+   * d<sub>k</sub></i>.
+   * Otherwise, if <i>m</i> is the name of a getter member of <i>o</i> (declared implicitly or
+   * explicitly) then <i>o.m</i> evaluates to the result of invoking the getter. </blockquote>
+   *
+   * The Dart Language Specification, 12.17: <blockquote> ... a getter invocation <i>i</i> of the
+   * form <i>e.m</i> ...
+   *
+   * Let <i>T</i> be the static type of <i>e</i>. It is a static type warning if <i>T</i> does not
+   * have a getter named <i>m</i>.
+   *
+   * The static type of <i>i</i> is the declared return type of <i>T.m</i>, if <i>T.m</i> exists;
+   * otherwise the static type of <i>i</i> is dynamic.
+   *
+   * ... a getter invocation <i>i</i> of the form <i>C.m</i> ...
+   *
+   * It is a static warning if there is no class <i>C</i> in the enclosing lexical scope of
+   * <i>i</i>, or if <i>C</i> does not declare, implicitly or explicitly, a getter named <i>m</i>.
+   *
+   * The static type of <i>i</i> is the declared return type of <i>C.m</i> if it exists or dynamic
+   * otherwise.
+   *
+   * ... a top-level getter invocation <i>i</i> of the form <i>m</i>, where <i>m</i> is an
+   * identifier ...
+   *
+   * The static type of <i>i</i> is the declared return type of <i>m</i>.</blockquote>
+   */
+  @override
+  Object visitPropertyAccess(PropertyAccess node) {
+    SimpleIdentifier propertyName = node.propertyName;
+    Element staticElement = propertyName.staticElement;
+    DartType staticType = _dynamicType;
+    if (staticElement is MethodElement) {
+      staticType = staticElement.type;
+    } else if (staticElement is PropertyAccessorElement) {
+      Expression realTarget = node.realTarget;
+      staticType = _getTypeOfProperty(staticElement,
+          realTarget != null ? _getStaticType(realTarget) : null);
+    } else {
+      // TODO(brianwilkerson) Report this internal error.
+    }
+    _recordStaticType(propertyName, staticType);
+    _recordStaticType(node, staticType);
+    Element propagatedElement = propertyName.propagatedElement;
+    DartType propagatedType = _overrideManager.getType(propagatedElement);
+    if (propagatedElement is MethodElement) {
+      propagatedType = propagatedElement.type;
+    } else if (propagatedElement is PropertyAccessorElement) {
+      Expression realTarget = node.realTarget;
+      propagatedType = _getTypeOfProperty(
+          propagatedElement, realTarget != null ? realTarget.bestType : null);
+    } else {
+      // TODO(brianwilkerson) Report this internal error.
+    }
+    _resolver.recordPropagatedTypeIfBetter(propertyName, propagatedType);
+    _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.9: <blockquote>The static type of a rethrow expression is
+   * bottom.</blockquote>
+   */
+  @override
+  Object visitRethrowExpression(RethrowExpression node) {
+    _recordStaticType(node, _typeProvider.bottomType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.30: <blockquote>Evaluation of an identifier expression
+   * <i>e</i> of the form <i>id</i> proceeds as follows:
+   *
+   * Let <i>d</i> be the innermost declaration in the enclosing lexical scope whose name is
+   * <i>id</i>. If no such declaration exists in the lexical scope, let <i>d</i> be the declaration
+   * of the inherited member named <i>id</i> if it exists.
+   * * If <i>d</i> is a class or type alias <i>T</i>, the value of <i>e</i> is the unique instance
+   * of class `Type` reifying <i>T</i>.
+   * * If <i>d</i> is a type parameter <i>T</i>, then the value of <i>e</i> is the value of the
+   * actual type argument corresponding to <i>T</i> that was passed to the generative constructor
+   * that created the current binding of this. We are assured that this is well defined, because if
+   * we were in a static member the reference to <i>T</i> would be a compile-time error.
+   * * If <i>d</i> is a library variable then:
+   * * If <i>d</i> is of one of the forms <i>var v = e<sub>i</sub>;</i>, <i>T v =
+   * e<sub>i</sub>;</i>, <i>final v = e<sub>i</sub>;</i>, <i>final T v = e<sub>i</sub>;</i>, and no
+   * value has yet been stored into <i>v</i> then the initializer expression <i>e<sub>i</sub></i> is
+   * evaluated. If, during the evaluation of <i>e<sub>i</sub></i>, the getter for <i>v</i> is
+   * referenced, a CyclicInitializationError is thrown. If the evaluation succeeded yielding an
+   * object <i>o</i>, let <i>r = o</i>, otherwise let <i>r = null</i>. In any case, <i>r</i> is
+   * stored into <i>v</i>. The value of <i>e</i> is <i>r</i>.
+   * * If <i>d</i> is of one of the forms <i>const v = e;</i> or <i>const T v = e;</i> the result
+   * of the getter is the value of the compile time constant <i>e</i>. Otherwise
+   * * <i>e</i> evaluates to the current binding of <i>id</i>.
+   * * If <i>d</i> is a local variable or formal parameter then <i>e</i> evaluates to the current
+   * binding of <i>id</i>.
+   * * If <i>d</i> is a static method, top level function or local function then <i>e</i>
+   * evaluates to the function defined by <i>d</i>.
+   * * If <i>d</i> is the declaration of a static variable or static getter declared in class
+   * <i>C</i>, then <i>e</i> is equivalent to the getter invocation <i>C.id</i>.
+   * * If <i>d</i> is the declaration of a top level getter, then <i>e</i> is equivalent to the
+   * getter invocation <i>id</i>.
+   * * Otherwise, if <i>e</i> occurs inside a top level or static function (be it function,
+   * method, getter, or setter) or variable initializer, evaluation of e causes a NoSuchMethodError
+   * to be thrown.
+   * * Otherwise <i>e</i> is equivalent to the property extraction <i>this.id</i>.
+   * </blockquote>
+   */
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    DartType staticType = _dynamicType;
+    if (element is ClassElement) {
+      if (_isNotTypeLiteral(node)) {
+        staticType = element.type;
+      } else {
+        staticType = _typeProvider.typeType;
+      }
+    } else if (element is FunctionTypeAliasElement) {
+      if (_isNotTypeLiteral(node)) {
+        staticType = element.type;
+      } else {
+        staticType = _typeProvider.typeType;
+      }
+    } else if (element is MethodElement) {
+      staticType = element.type;
+    } else if (element is PropertyAccessorElement) {
+      staticType = _getTypeOfProperty(element, null);
+    } else if (element is ExecutableElement) {
+      staticType = element.type;
+    } else if (element is TypeParameterElement) {
+      staticType = _typeProvider.typeType;
+    } else if (element is VariableElement) {
+      VariableElement variable = element;
+      staticType = _promoteManager.getStaticType(variable);
+    } else if (element is PrefixElement) {
+      return null;
+    } else if (element is DynamicElementImpl) {
+      staticType = _typeProvider.typeType;
+    } else {
+      staticType = _dynamicType;
+    }
+    _recordStaticType(node, staticType);
+    // TODO(brianwilkerson) I think we want to repeat the logic above using the
+    // propagated element to get another candidate for the propagated type.
+    DartType propagatedType = _getPropertyPropagatedType(element, null);
+    if (propagatedType == null) {
+      DartType overriddenType = _overrideManager.getType(element);
+      if (propagatedType == null ||
+          overriddenType != null &&
+              overriddenType.isMoreSpecificThan(propagatedType)) {
+        propagatedType = overriddenType;
+      }
+    }
+    _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is
+   * `String`.</blockquote>
+   */
+  @override
+  Object visitSimpleStringLiteral(SimpleStringLiteral node) {
+    _recordStaticType(node, _typeProvider.stringType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is
+   * `String`.</blockquote>
+   */
+  @override
+  Object visitStringInterpolation(StringInterpolation node) {
+    _recordStaticType(node, _typeProvider.stringType);
+    return null;
+  }
+
+  @override
+  Object visitSuperExpression(SuperExpression node) {
+    if (thisType == null) {
+      // TODO(brianwilkerson) Report this error if it hasn't already been
+      // reported.
+      _recordStaticType(node, _dynamicType);
+    } else {
+      _recordStaticType(node, thisType);
+    }
+    return null;
+  }
+
+  @override
+  Object visitSymbolLiteral(SymbolLiteral node) {
+    _recordStaticType(node, _typeProvider.symbolType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.10: <blockquote>The static type of `this` is the
+   * interface of the immediately enclosing class.</blockquote>
+   */
+  @override
+  Object visitThisExpression(ThisExpression node) {
+    if (thisType == null) {
+      // TODO(brianwilkerson) Report this error if it hasn't already been
+      // reported.
+      _recordStaticType(node, _dynamicType);
+    } else {
+      _recordStaticType(node, thisType);
+    }
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.8: <blockquote>The static type of a throw expression is
+   * bottom.</blockquote>
+   */
+  @override
+  Object visitThrowExpression(ThrowExpression node) {
+    _recordStaticType(node, _typeProvider.bottomType);
+    return null;
+  }
+
+  void _inferLocalVariableType(
+      VariableDeclaration node, Expression initializer) {
+    if (initializer != null &&
+        (node.parent as VariableDeclarationList).type == null &&
+        (node.element is LocalVariableElementImpl) &&
+        (initializer.staticType != null) &&
+        (!initializer.staticType.isBottom)) {
+      LocalVariableElementImpl element = node.element;
+      element.type = initializer.staticType;
+      node.name.staticType = initializer.staticType;
+    }
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    Expression initializer = node.initializer;
+    if (_resolver.definingLibrary.context.analysisOptions.strongMode) {
+      _inferLocalVariableType(node, initializer);
+    }
+    if (initializer != null) {
+      DartType rightType = initializer.bestType;
+      SimpleIdentifier name = node.name;
+      _resolver.recordPropagatedTypeIfBetter(name, rightType);
+      VariableElement element = name.staticElement as VariableElement;
+      if (element != null) {
+        _resolver.overrideVariable(element, rightType, true);
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Set the static (propagated) type of [node] to be the least upper bound
+   * of the static (propagated) types of subexpressions [expr1] and [expr2].
+   */
+  void _analyzeLeastUpperBound(
+      Expression node, Expression expr1, Expression expr2) {
+    DartType staticType1 = _getStaticType(expr1);
+    DartType staticType2 = _getStaticType(expr2);
+    if (staticType1 == null) {
+      // TODO(brianwilkerson) Determine whether this can still happen.
+      staticType1 = _dynamicType;
+    }
+    if (staticType2 == null) {
+      // TODO(brianwilkerson) Determine whether this can still happen.
+      staticType2 = _dynamicType;
+    }
+    DartType staticType =
+        _typeSystem.getLeastUpperBound(staticType1, staticType2);
+    if (staticType == null) {
+      staticType = _dynamicType;
+    }
+    _recordStaticType(node, staticType);
+    DartType propagatedType1 = expr1.propagatedType;
+    DartType propagatedType2 = expr2.propagatedType;
+    if (propagatedType1 != null || propagatedType2 != null) {
+      if (propagatedType1 == null) {
+        propagatedType1 = staticType1;
+      }
+      if (propagatedType2 == null) {
+        propagatedType2 = staticType2;
+      }
+      DartType propagatedType =
+          _typeSystem.getLeastUpperBound(propagatedType1, propagatedType2);
+      _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
+    }
+  }
+
+  /**
+   * Record that the static type of the given node is the type of the second argument to the method
+   * represented by the given element.
+   *
+   * @param element the element representing the method invoked by the given node
+   */
+  DartType _computeArgumentType(ExecutableElement element) {
+    if (element != null) {
+      List<ParameterElement> parameters = element.parameters;
+      if (parameters != null && parameters.length == 2) {
+        return parameters[1].type;
+      }
+    }
+    return _dynamicType;
+  }
+
+  /**
+   * Compute the propagated return type of the method or function represented by the given element.
+   *
+   * @param element the element representing the method or function invoked by the given node
+   * @return the propagated return type that was computed
+   */
+  DartType _computePropagatedReturnType(Element element) {
+    if (element is ExecutableElement) {
+      return _propagatedReturnTypes[element];
+    }
+    return null;
+  }
+
+  /**
+   * Given a function body, compute the propagated return type of the function. The propagated
+   * return type of functions with a block body is the least upper bound of all
+   * [ReturnStatement] expressions, with an expression body it is the type of the expression.
+   *
+   * @param body the boy of the function whose propagated return type is to be computed
+   * @return the propagated return type that was computed
+   */
+  DartType _computePropagatedReturnTypeOfFunction(FunctionBody body) {
+    if (body is ExpressionFunctionBody) {
+      ExpressionFunctionBody expressionBody = body;
+      return expressionBody.expression.bestType;
+    }
+    if (body is BlockFunctionBody) {
+      _StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction visitor =
+          new _StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction(
+              _typeSystem);
+      body.accept(visitor);
+      return visitor.result;
+    }
+    return null;
+  }
+
+  /**
+   * Compute the static return type of the method or function represented by the given element.
+   *
+   * @param element the element representing the method or function invoked by the given node
+   * @return the static return type that was computed
+   */
+  DartType _computeStaticReturnType(Element element) {
+    if (element is PropertyAccessorElement) {
+      //
+      // This is a function invocation expression disguised as something else.
+      // We are invoking a getter and then invoking the returned function.
+      //
+      FunctionType propertyType = element.type;
+      if (propertyType != null) {
+        DartType returnType = propertyType.returnType;
+        if (returnType.isDartCoreFunction) {
+          return _dynamicType;
+        } else if (returnType is InterfaceType) {
+          MethodElement callMethod = returnType.lookUpMethod(
+              FunctionElement.CALL_METHOD_NAME, _resolver.definingLibrary);
+          if (callMethod != null) {
+            return callMethod.type.returnType;
+          }
+        } else if (returnType is FunctionType) {
+          DartType innerReturnType = returnType.returnType;
+          if (innerReturnType != null) {
+            return innerReturnType;
+          }
+        }
+        if (returnType != null) {
+          return returnType;
+        }
+      }
+    } else if (element is ExecutableElement) {
+      FunctionType type = element.type;
+      if (type != null) {
+        // TODO(brianwilkerson) Figure out the conditions under which the type
+        // is null.
+        return type.returnType;
+      }
+    } else if (element is VariableElement) {
+      VariableElement variable = element;
+      DartType variableType = _promoteManager.getStaticType(variable);
+      if (variableType is FunctionType) {
+        return variableType.returnType;
+      }
+    }
+    return _dynamicType;
+  }
+
+  /**
+   * Given a function declaration, compute the return static type of the function. The return type
+   * of functions with a block body is `dynamicType`, with an expression body it is the type
+   * of the expression.
+   *
+   * @param node the function expression whose static return type is to be computed
+   * @return the static return type that was computed
+   */
+  DartType _computeStaticReturnTypeOfFunctionDeclaration(
+      FunctionDeclaration node) {
+    TypeName returnType = node.returnType;
+    if (returnType == null) {
+      return _dynamicType;
+    }
+    return returnType.type;
+  }
+
+  /**
+   * Given a function expression, compute the return type of the function. The return type of
+   * functions with a block body is `dynamicType`, with an expression body it is the type of
+   * the expression.
+   *
+   * @param node the function expression whose return type is to be computed
+   * @return the return type that was computed
+   */
+  DartType _computeStaticReturnTypeOfFunctionExpression(
+      FunctionExpression node) {
+    FunctionBody body = node.body;
+    if (body.isGenerator) {
+      if (body.isAsynchronous) {
+        return _typeProvider.streamDynamicType;
+      } else {
+        return _typeProvider.iterableDynamicType;
+      }
+    }
+    DartType type;
+    if (body is ExpressionFunctionBody) {
+      type = _getStaticType(body.expression);
+    } else {
+      type = _dynamicType;
+    }
+    if (body.isAsynchronous) {
+      return _typeProvider.futureType
+          .substitute4(<DartType>[flattenFutures(_typeProvider, type)]);
+    } else {
+      return type;
+    }
+  }
+
+  /**
+   * Return the best type of the given [expression].
+   */
+  DartType _getBestType(Expression expression) {
+    return expression.bestType;
+  }
+
+  /**
+   * If the given element name can be mapped to the name of a class defined within the given
+   * library, return the type specified by the argument.
+   *
+   * @param library the library in which the specified type would be defined
+   * @param elementName the name of the element for which a type is being sought
+   * @param nameMap an optional map used to map the element name to a type name
+   * @return the type specified by the first argument in the argument list
+   */
+  DartType _getElementNameAsType(LibraryElement library, String elementName,
+      HashMap<String, String> nameMap) {
+    if (elementName != null) {
+      if (nameMap != null) {
+        elementName = nameMap[elementName.toLowerCase()];
+      }
+      ClassElement returnType = library.getType(elementName);
+      if (returnType != null) {
+        return returnType.type;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * If the given argument list contains at least one argument, and if the argument is a simple
+   * string literal, then parse that argument as a query string and return the type specified by the
+   * argument.
+   *
+   * @param library the library in which the specified type would be defined
+   * @param argumentList the list of arguments from which a type is to be extracted
+   * @return the type specified by the first argument in the argument list
+   */
+  DartType _getFirstArgumentAsQuery(
+      LibraryElement library, ArgumentList argumentList) {
+    String argumentValue = _getFirstArgumentAsString(argumentList);
+    if (argumentValue != null) {
+      //
+      // If the query has spaces, full parsing is required because it might be:
+      //   E[text='warning text']
+      //
+      if (StringUtilities.indexOf1(argumentValue, 0, 0x20) >= 0) {
+        return null;
+      }
+      //
+      // Otherwise, try to extract the tag based on
+      // http://www.w3.org/TR/CSS2/selector.html.
+      //
+      String tag = argumentValue;
+      tag = StringUtilities.substringBeforeChar(tag, 0x3A);
+      tag = StringUtilities.substringBeforeChar(tag, 0x5B);
+      tag = StringUtilities.substringBeforeChar(tag, 0x2E);
+      tag = StringUtilities.substringBeforeChar(tag, 0x23);
+      tag = _HTML_ELEMENT_TO_CLASS_MAP[tag.toLowerCase()];
+      ClassElement returnType = library.getType(tag);
+      if (returnType != null) {
+        return returnType.type;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * If the given argument list contains at least one argument, and if the argument is a simple
+   * string literal, return the String value of the argument.
+   *
+   * @param argumentList the list of arguments from which a string value is to be extracted
+   * @return the string specified by the first argument in the argument list
+   */
+  String _getFirstArgumentAsString(ArgumentList argumentList) {
+    NodeList<Expression> arguments = argumentList.arguments;
+    if (arguments.length > 0) {
+      Expression argument = arguments[0];
+      if (argument is SimpleStringLiteral) {
+        return argument.value;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * If the given argument list contains at least one argument, and if the argument is a simple
+   * string literal, and if the value of the argument is the name of a class defined within the
+   * given library, return the type specified by the argument.
+   *
+   * @param library the library in which the specified type would be defined
+   * @param argumentList the list of arguments from which a type is to be extracted
+   * @return the type specified by the first argument in the argument list
+   */
+  DartType _getFirstArgumentAsType(
+          LibraryElement library, ArgumentList argumentList) =>
+      _getFirstArgumentAsTypeWithMap(library, argumentList, null);
+
+  /**
+   * If the given argument list contains at least one argument, and if the argument is a simple
+   * string literal, and if the value of the argument is the name of a class defined within the
+   * given library, return the type specified by the argument.
+   *
+   * @param library the library in which the specified type would be defined
+   * @param argumentList the list of arguments from which a type is to be extracted
+   * @param nameMap an optional map used to map the element name to a type name
+   * @return the type specified by the first argument in the argument list
+   */
+  DartType _getFirstArgumentAsTypeWithMap(LibraryElement library,
+          ArgumentList argumentList, HashMap<String, String> nameMap) =>
+      _getElementNameAsType(
+          library, _getFirstArgumentAsString(argumentList), nameMap);
+
+  /**
+   * Return the propagated type of the given [Element], or `null`.
+   */
+  DartType _getPropertyPropagatedType(Element element, DartType currentType) {
+    if (element is PropertyAccessorElement) {
+      PropertyAccessorElement accessor = element;
+      if (accessor.isGetter) {
+        PropertyInducingElement variable = accessor.variable;
+        DartType propagatedType = variable.propagatedType;
+        if (currentType == null ||
+            propagatedType != null &&
+                propagatedType.isMoreSpecificThan(currentType)) {
+          return propagatedType;
+        }
+      }
+    }
+    return currentType;
+  }
+
+  /**
+   * Return the static type of the given [expression].
+   */
+  DartType _getStaticType(Expression expression) {
+    DartType type = expression.staticType;
+    if (type == null) {
+      // TODO(brianwilkerson) Determine the conditions for which the static type
+      // is null.
+      return _dynamicType;
+    }
+    return type;
+  }
+
+  /**
+   * Return the type represented by the given type name.
+   *
+   * @param typeName the type name representing the type to be returned
+   * @return the type represented by the type name
+   */
+  DartType _getType(TypeName typeName) {
+    DartType type = typeName.type;
+    if (type == null) {
+      //TODO(brianwilkerson) Determine the conditions for which the type is
+      // null.
+      return _dynamicType;
+    }
+    return type;
+  }
+
+  /**
+   * Return the type that should be recorded for a node that resolved to the given accessor.
+   *
+   * @param accessor the accessor that the node resolved to
+   * @param context if the accessor element has context [by being the RHS of a
+   *          [PrefixedIdentifier] or [PropertyAccess]], and the return type of the
+   *          accessor is a parameter type, then the type of the LHS can be used to get more
+   *          specific type information
+   * @return the type that should be recorded for a node that resolved to the given accessor
+   */
+  DartType _getTypeOfProperty(
+      PropertyAccessorElement accessor, DartType context) {
+    FunctionType functionType = accessor.type;
+    if (functionType == null) {
+      // TODO(brianwilkerson) Report this internal error. This happens when we
+      // are analyzing a reference to a property before we have analyzed the
+      // declaration of the property or when the property does not have a
+      // defined type.
+      return _dynamicType;
+    }
+    if (accessor.isSetter) {
+      List<DartType> parameterTypes = functionType.normalParameterTypes;
+      if (parameterTypes != null && parameterTypes.length > 0) {
+        return parameterTypes[0];
+      }
+      PropertyAccessorElement getter = accessor.variable.getter;
+      if (getter != null) {
+        functionType = getter.type;
+        if (functionType != null) {
+          return functionType.returnType;
+        }
+      }
+      return _dynamicType;
+    }
+    DartType returnType = functionType.returnType;
+    if (returnType is TypeParameterType && context is InterfaceType) {
+      // if the return type is a TypeParameter, we try to use the context [that
+      // the function is being called on] to get a more accurate returnType type
+      InterfaceType interfaceTypeContext = context;
+      //      Type[] argumentTypes = interfaceTypeContext.getTypeArguments();
+      List<TypeParameterElement> typeParameterElements =
+          interfaceTypeContext.element != null
+              ? interfaceTypeContext.element.typeParameters
+              : null;
+      if (typeParameterElements != null) {
+        for (int i = 0; i < typeParameterElements.length; i++) {
+          TypeParameterElement typeParameterElement = typeParameterElements[i];
+          if (returnType.name == typeParameterElement.name) {
+            return interfaceTypeContext.typeArguments[i];
+          }
+        }
+        // TODO(jwren) troubleshoot why call to substitute doesn't work
+//        Type[] parameterTypes = TypeParameterTypeImpl.getTypes(parameterElements);
+//        return returnType.substitute(argumentTypes, parameterTypes);
+      }
+    }
+    return returnType;
+  }
+
+  /**
+   * Return `true` if the given [Type] is the `Future` form the 'dart:async'
+   * library.
+   */
+  bool _isAsyncFutureType(DartType type) => type is InterfaceType &&
+      type.name == "Future" &&
+      _isAsyncLibrary(type.element.library);
+
+  /**
+   * Return `true` if the given library is the 'dart:async' library.
+   *
+   * @param library the library being tested
+   * @return `true` if the library is 'dart:async'
+   */
+  bool _isAsyncLibrary(LibraryElement library) => library.name == "dart.async";
+
+  /**
+   * Return `true` if the given library is the 'dart:html' library.
+   *
+   * @param library the library being tested
+   * @return `true` if the library is 'dart:html'
+   */
+  bool _isHtmlLibrary(LibraryElement library) =>
+      library != null && "dart.dom.html" == library.name;
+
+  /**
+   * Return `true` if the given node is not a type literal.
+   *
+   * @param node the node being tested
+   * @return `true` if the given node is not a type literal
+   */
+  bool _isNotTypeLiteral(Identifier node) {
+    AstNode parent = node.parent;
+    return parent is TypeName ||
+        (parent is PrefixedIdentifier &&
+            (parent.parent is TypeName || identical(parent.prefix, node))) ||
+        (parent is PropertyAccess &&
+            identical(parent.target, node) &&
+            parent.operator.type == TokenType.PERIOD) ||
+        (parent is MethodInvocation &&
+            identical(node, parent.target) &&
+            parent.operator.type == TokenType.PERIOD);
+  }
+
+  /**
+   * Record that the propagated type of the given node is the given type.
+   *
+   * @param expression the node whose type is to be recorded
+   * @param type the propagated type of the node
+   */
+  void _recordPropagatedType(Expression expression, DartType type) {
+    if (type != null && !type.isDynamic && !type.isBottom) {
+      expression.propagatedType = type;
+    }
+  }
+
+  /**
+   * Given a function element and its body, compute and record the propagated return type of the
+   * function.
+   *
+   * @param functionElement the function element to record propagated return type for
+   * @param body the boy of the function whose propagated return type is to be computed
+   * @return the propagated return type that was computed, may be `null` if it is not more
+   *         specific than the static return type.
+   */
+  void _recordPropagatedTypeOfFunction(
+      ExecutableElement functionElement, FunctionBody body) {
+    DartType propagatedReturnType =
+        _computePropagatedReturnTypeOfFunction(body);
+    if (propagatedReturnType == null) {
+      return;
+    }
+    // Ignore 'bottom' type.
+    if (propagatedReturnType.isBottom) {
+      return;
+    }
+    // Record only if we inferred more specific type.
+    DartType staticReturnType = functionElement.returnType;
+    if (!propagatedReturnType.isMoreSpecificThan(staticReturnType)) {
+      return;
+    }
+    // OK, do record.
+    _propagatedReturnTypes[functionElement] = propagatedReturnType;
+  }
+
+  /**
+   * Record that the static type of the given node is the given type.
+   *
+   * @param expression the node whose type is to be recorded
+   * @param type the static type of the node
+   */
+  void _recordStaticType(Expression expression, DartType type) {
+    if (type == null) {
+      expression.staticType = _dynamicType;
+    } else {
+      expression.staticType = type;
+    }
+  }
+
+  /**
+   * Attempts to make a better guess for the type of the given binary
+   * [expression], given that resolution has so far produced the [currentType].
+   * The [typeAccessor] is used to access the corresponding type of the left
+   * and right operands.
+   */
+  DartType _refineBinaryExpressionType(
+      BinaryExpression expression, DartType currentType,
+      [DartType typeAccessor(Expression node)]) {
+    sc.TokenType operator = expression.operator.type;
+    // bool
+    if (operator == sc.TokenType.AMPERSAND_AMPERSAND ||
+        operator == sc.TokenType.BAR_BAR ||
+        operator == sc.TokenType.EQ_EQ ||
+        operator == sc.TokenType.BANG_EQ) {
+      return _typeProvider.boolType;
+    }
+    DartType intType = _typeProvider.intType;
+    if (typeAccessor(expression.leftOperand) == intType) {
+      // int op double
+      if (operator == sc.TokenType.MINUS ||
+          operator == sc.TokenType.PERCENT ||
+          operator == sc.TokenType.PLUS ||
+          operator == sc.TokenType.STAR) {
+        DartType doubleType = _typeProvider.doubleType;
+        if (typeAccessor(expression.rightOperand) == doubleType) {
+          return doubleType;
+        }
+      }
+      // int op int
+      if (operator == sc.TokenType.MINUS ||
+          operator == sc.TokenType.PERCENT ||
+          operator == sc.TokenType.PLUS ||
+          operator == sc.TokenType.STAR ||
+          operator == sc.TokenType.TILDE_SLASH) {
+        if (typeAccessor(expression.rightOperand) == intType) {
+          return intType;
+        }
+      }
+    }
+    // default
+    return currentType;
+  }
+
+  /**
+   * Implements the function "flatten" defined in the spec:
+   *
+   *   If T = Future<S> then flatten(T) = flatten(S).
+   *
+   *   Otherwise if T <: Future then let S be a type such that T << Future<S>
+   *   and for all R, if T << Future<R> then S << R.  Then flatten(T) = S.
+   *
+   *   In any other circumstance, flatten(T) = T.
+   */
+  static DartType flattenFutures(TypeProvider typeProvider, DartType type) {
+    if (type is InterfaceType) {
+      // Implement the case: "If T = Future<S> then flatten(T) = flatten(S)."
+      if (type.element == typeProvider.futureType.element &&
+          type.typeArguments.length > 0) {
+        return flattenFutures(typeProvider, type.typeArguments[0]);
+      }
+
+      // Implement the case: "Otherwise if T <: Future then let S be a type
+      // such that T << Future<S> and for all R, if T << Future<R> then S << R.
+      // Then flatten(T) = S."
+      //
+      // In other words, given the set of all types R such that T << Future<R>,
+      // let S be the most specific of those types, if any such S exists.
+      //
+      // Since we only care about the most specific type, it is sufficent to
+      // look at the types appearing as a parameter to Future in the type
+      // hierarchy of T.  We don't need to consider the supertypes of those
+      // types, since they are by definition less specific.
+      List<DartType> candidateTypes =
+          _searchTypeHierarchyForFutureParameters(typeProvider, type);
+      DartType flattenResult = _findMostSpecificType(candidateTypes);
+      if (flattenResult != null) {
+        return flattenResult;
+      }
+    }
+
+    // Implement the case: "In any other circumstance, flatten(T) = T."
+    return type;
+  }
+
+  /**
+   * Create a table mapping HTML tag names to the names of the classes (in 'dart:html') that
+   * implement those tags.
+   *
+   * @return the table that was created
+   */
+  static HashMap<String, String> _createHtmlTagToClassMap() {
+    HashMap<String, String> map = new HashMap<String, String>();
+    map["a"] = "AnchorElement";
+    map["area"] = "AreaElement";
+    map["br"] = "BRElement";
+    map["base"] = "BaseElement";
+    map["body"] = "BodyElement";
+    map["button"] = "ButtonElement";
+    map["canvas"] = "CanvasElement";
+    map["content"] = "ContentElement";
+    map["dl"] = "DListElement";
+    map["datalist"] = "DataListElement";
+    map["details"] = "DetailsElement";
+    map["div"] = "DivElement";
+    map["embed"] = "EmbedElement";
+    map["fieldset"] = "FieldSetElement";
+    map["form"] = "FormElement";
+    map["hr"] = "HRElement";
+    map["head"] = "HeadElement";
+    map["h1"] = "HeadingElement";
+    map["h2"] = "HeadingElement";
+    map["h3"] = "HeadingElement";
+    map["h4"] = "HeadingElement";
+    map["h5"] = "HeadingElement";
+    map["h6"] = "HeadingElement";
+    map["html"] = "HtmlElement";
+    map["iframe"] = "IFrameElement";
+    map["img"] = "ImageElement";
+    map["input"] = "InputElement";
+    map["keygen"] = "KeygenElement";
+    map["li"] = "LIElement";
+    map["label"] = "LabelElement";
+    map["legend"] = "LegendElement";
+    map["link"] = "LinkElement";
+    map["map"] = "MapElement";
+    map["menu"] = "MenuElement";
+    map["meter"] = "MeterElement";
+    map["ol"] = "OListElement";
+    map["object"] = "ObjectElement";
+    map["optgroup"] = "OptGroupElement";
+    map["output"] = "OutputElement";
+    map["p"] = "ParagraphElement";
+    map["param"] = "ParamElement";
+    map["pre"] = "PreElement";
+    map["progress"] = "ProgressElement";
+    map["script"] = "ScriptElement";
+    map["select"] = "SelectElement";
+    map["source"] = "SourceElement";
+    map["span"] = "SpanElement";
+    map["style"] = "StyleElement";
+    map["caption"] = "TableCaptionElement";
+    map["td"] = "TableCellElement";
+    map["col"] = "TableColElement";
+    map["table"] = "TableElement";
+    map["tr"] = "TableRowElement";
+    map["textarea"] = "TextAreaElement";
+    map["title"] = "TitleElement";
+    map["track"] = "TrackElement";
+    map["ul"] = "UListElement";
+    map["video"] = "VideoElement";
+    return map;
+  }
+
+  /**
+   * If there is a single type which is at least as specific as all of the
+   * types in [types], return it.  Otherwise return `null`.
+   */
+  static DartType _findMostSpecificType(List<DartType> types) {
+    // The << relation ("more specific than") is a partial ordering on types,
+    // so to find the most specific type of a set, we keep a bucket of the most
+    // specific types seen so far such that no type in the bucket is more
+    // specific than any other type in the bucket.
+    List<DartType> bucket = <DartType>[];
+
+    // Then we consider each type in turn.
+    for (DartType type in types) {
+      // If any existing type in the bucket is more specific than this type,
+      // then we can ignore this type.
+      if (bucket.any((DartType t) => t.isMoreSpecificThan(type))) {
+        continue;
+      }
+      // Otherwise, we need to add this type to the bucket and remove any types
+      // that are less specific than it.
+      bool added = false;
+      int i = 0;
+      while (i < bucket.length) {
+        if (type.isMoreSpecificThan(bucket[i])) {
+          if (added) {
+            if (i < bucket.length - 1) {
+              bucket[i] = bucket.removeLast();
+            } else {
+              bucket.removeLast();
+            }
+          } else {
+            bucket[i] = type;
+            i++;
+            added = true;
+          }
+        } else {
+          i++;
+        }
+      }
+      if (!added) {
+        bucket.add(type);
+      }
+    }
+
+    // Now that we are finished, if there is exactly one type left in the
+    // bucket, it is the most specific type.
+    if (bucket.length == 1) {
+      return bucket[0];
+    }
+
+    // Otherwise, there is no single type that is more specific than the
+    // others.
+    return null;
+  }
+
+  /**
+   * Given a seed type [type], search its class hierarchy for types of the form
+   * Future<R>, and return a list of the resulting R's.
+   */
+  static List<DartType> _searchTypeHierarchyForFutureParameters(
+      TypeProvider typeProvider, InterfaceType type) {
+    List<DartType> result = <DartType>[];
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+    void recurse(InterfaceType type) {
+      if (type.element == typeProvider.futureType.element &&
+          type.typeArguments.length > 0) {
+        result.add(type.typeArguments[0]);
+      }
+      if (visitedClasses.add(type.element)) {
+        if (type.superclass != null) {
+          recurse(type.superclass);
+        }
+        for (InterfaceType interface in type.interfaces) {
+          recurse(interface);
+        }
+        visitedClasses.remove(type.element);
+      }
+    }
+    recurse(type);
+    return result;
+  }
+}
+
+class _StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction
+    extends GeneralizingAstVisitor<Object> {
+  final TypeSystem typeSystem;
+  DartType result = null;
+
+  _StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction(this.typeSystem);
+
+  @override
+  Object visitExpression(Expression node) => null;
+
+  @override
+  Object visitReturnStatement(ReturnStatement node) {
+    // prepare this 'return' type
+    DartType type;
+    Expression expression = node.expression;
+    if (expression != null) {
+      type = expression.bestType;
+    } else {
+      type = BottomTypeImpl.instance;
+    }
+    // merge types
+    if (result == null) {
+      result = type;
+    } else {
+      result = typeSystem.getLeastUpperBound(result, type);
+    }
+    return null;
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/testing/ast_factory.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/testing/ast_factory.dart
new file mode 100644
index 0000000..86f1e04
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/testing/ast_factory.dart
@@ -0,0 +1,1255 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.testing.ast_factory;
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/testing/token_factory.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
+
+/**
+ * The class `AstFactory` defines utility methods that can be used to create AST nodes. The
+ * nodes that are created are complete in the sense that all of the tokens that would have been
+ * associated with the nodes by a parser are also created, but the token stream is not constructed.
+ * None of the nodes are resolved.
+ *
+ * The general pattern is for the name of the factory method to be the same as the name of the class
+ * of AST node being created. There are two notable exceptions. The first is for methods creating
+ * nodes that are part of a cascade expression. These methods are all prefixed with 'cascaded'. The
+ * second is places where a shorter name seemed unambiguous and easier to read, such as using
+ * 'identifier' rather than 'prefixedIdentifier', or 'integer' rather than 'integerLiteral'.
+ */
+class AstFactory {
+  static AdjacentStrings adjacentStrings(List<StringLiteral> strings) =>
+      new AdjacentStrings(strings);
+
+  static Annotation annotation(Identifier name) => new Annotation(
+      TokenFactory.tokenFromType(TokenType.AT), name, null, null, null);
+
+  static Annotation annotation2(Identifier name,
+          SimpleIdentifier constructorName, ArgumentList arguments) =>
+      new Annotation(
+          TokenFactory.tokenFromType(TokenType.AT),
+          name,
+          TokenFactory.tokenFromType(TokenType.PERIOD),
+          constructorName,
+          arguments);
+
+  static ArgumentList argumentList([List<Expression> arguments]) =>
+      new ArgumentList(TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+          arguments, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN));
+
+  static AsExpression asExpression(Expression expression, TypeName type) =>
+      new AsExpression(
+          expression, TokenFactory.tokenFromKeyword(Keyword.AS), type);
+
+  static AssertStatement assertStatement(Expression condition) =>
+      new AssertStatement(
+          TokenFactory.tokenFromKeyword(Keyword.ASSERT),
+          TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+          condition,
+          TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static AssignmentExpression assignmentExpression(Expression leftHandSide,
+          TokenType operator, Expression rightHandSide) =>
+      new AssignmentExpression(
+          leftHandSide, TokenFactory.tokenFromType(operator), rightHandSide);
+
+  static BlockFunctionBody asyncBlockFunctionBody(
+          [List<Statement> statements]) =>
+      new BlockFunctionBody(
+          TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, "async"),
+          null,
+          block(statements));
+
+  static ExpressionFunctionBody asyncExpressionFunctionBody(
+          Expression expression) =>
+      new ExpressionFunctionBody(
+          TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, "async"),
+          TokenFactory.tokenFromType(TokenType.FUNCTION),
+          expression,
+          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static BlockFunctionBody asyncGeneratorBlockFunctionBody(
+          [List<Statement> statements]) =>
+      new BlockFunctionBody(
+          TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, "async"),
+          TokenFactory.tokenFromType(TokenType.STAR),
+          block(statements));
+
+  static AwaitExpression awaitExpression(Expression expression) =>
+      new AwaitExpression(
+          TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, "await"),
+          expression);
+
+  static BinaryExpression binaryExpression(Expression leftOperand,
+          TokenType operator, Expression rightOperand) =>
+      new BinaryExpression(
+          leftOperand, TokenFactory.tokenFromType(operator), rightOperand);
+
+  static Block block([List<Statement> statements]) => new Block(
+      TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
+      statements,
+      TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
+
+  static BlockFunctionBody blockFunctionBody(Block block) =>
+      new BlockFunctionBody(null, null, block);
+
+  static BlockFunctionBody blockFunctionBody2([List<Statement> statements]) =>
+      new BlockFunctionBody(null, null, block(statements));
+
+  static BooleanLiteral booleanLiteral(bool value) => new BooleanLiteral(
+      value
+          ? TokenFactory.tokenFromKeyword(Keyword.TRUE)
+          : TokenFactory.tokenFromKeyword(Keyword.FALSE),
+      value);
+
+  static BreakStatement breakStatement() => new BreakStatement(
+      TokenFactory.tokenFromKeyword(Keyword.BREAK),
+      null,
+      TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static BreakStatement breakStatement2(String label) => new BreakStatement(
+      TokenFactory.tokenFromKeyword(Keyword.BREAK),
+      identifier3(label),
+      TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static IndexExpression cascadedIndexExpression(Expression index) =>
+      new IndexExpression.forCascade(
+          TokenFactory.tokenFromType(TokenType.PERIOD_PERIOD),
+          TokenFactory.tokenFromType(TokenType.OPEN_SQUARE_BRACKET),
+          index,
+          TokenFactory.tokenFromType(TokenType.CLOSE_SQUARE_BRACKET));
+
+  static MethodInvocation cascadedMethodInvocation(String methodName,
+          [List<Expression> arguments]) =>
+      new MethodInvocation(
+          null,
+          TokenFactory.tokenFromType(TokenType.PERIOD_PERIOD),
+          identifier3(methodName),
+          null,
+          argumentList(arguments));
+
+  static PropertyAccess cascadedPropertyAccess(String propertyName) =>
+      new PropertyAccess(
+          null,
+          TokenFactory.tokenFromType(TokenType.PERIOD_PERIOD),
+          identifier3(propertyName));
+
+  static CascadeExpression cascadeExpression(Expression target,
+          [List<Expression> cascadeSections]) =>
+      new CascadeExpression(target, cascadeSections);
+
+  static CatchClause catchClause(String exceptionParameter,
+          [List<Statement> statements]) =>
+      catchClause5(null, exceptionParameter, null, statements);
+
+  static CatchClause catchClause2(
+          String exceptionParameter, String stackTraceParameter,
+          [List<Statement> statements]) =>
+      catchClause5(null, exceptionParameter, stackTraceParameter, statements);
+
+  static CatchClause catchClause3(TypeName exceptionType,
+          [List<Statement> statements]) =>
+      catchClause5(exceptionType, null, null, statements);
+
+  static CatchClause catchClause4(
+          TypeName exceptionType, String exceptionParameter,
+          [List<Statement> statements]) =>
+      catchClause5(exceptionType, exceptionParameter, null, statements);
+
+  static CatchClause catchClause5(TypeName exceptionType,
+          String exceptionParameter, String stackTraceParameter,
+          [List<Statement> statements]) =>
+      new CatchClause(
+          exceptionType == null
+              ? null
+              : TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, "on"),
+          exceptionType,
+          exceptionParameter == null
+              ? null
+              : TokenFactory.tokenFromKeyword(Keyword.CATCH),
+          exceptionParameter == null
+              ? null
+              : TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+          exceptionParameter == null ? null : identifier3(exceptionParameter),
+          stackTraceParameter == null
+              ? null
+              : TokenFactory.tokenFromType(TokenType.COMMA),
+          stackTraceParameter == null ? null : identifier3(stackTraceParameter),
+          exceptionParameter == null
+              ? null
+              : TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+          block(statements));
+
+  static ClassDeclaration classDeclaration(
+          Keyword abstractKeyword,
+          String name,
+          TypeParameterList typeParameters,
+          ExtendsClause extendsClause,
+          WithClause withClause,
+          ImplementsClause implementsClause,
+          [List<ClassMember> members]) =>
+      new ClassDeclaration(
+          null,
+          null,
+          abstractKeyword == null
+              ? null
+              : TokenFactory.tokenFromKeyword(abstractKeyword),
+          TokenFactory.tokenFromKeyword(Keyword.CLASS),
+          identifier3(name),
+          typeParameters,
+          extendsClause,
+          withClause,
+          implementsClause,
+          TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
+          members,
+          TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
+
+  static ClassTypeAlias classTypeAlias(
+          String name,
+          TypeParameterList typeParameters,
+          Keyword abstractKeyword,
+          TypeName superclass,
+          WithClause withClause,
+          ImplementsClause implementsClause) =>
+      new ClassTypeAlias(
+          null,
+          null,
+          TokenFactory.tokenFromKeyword(Keyword.CLASS),
+          identifier3(name),
+          typeParameters,
+          TokenFactory.tokenFromType(TokenType.EQ),
+          abstractKeyword == null
+              ? null
+              : TokenFactory.tokenFromKeyword(abstractKeyword),
+          superclass,
+          withClause,
+          implementsClause,
+          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static CompilationUnit compilationUnit() =>
+      compilationUnit8(null, null, null);
+
+  static CompilationUnit compilationUnit2(
+          List<CompilationUnitMember> declarations) =>
+      compilationUnit8(null, null, declarations);
+
+  static CompilationUnit compilationUnit3(List<Directive> directives) =>
+      compilationUnit8(null, directives, null);
+
+  static CompilationUnit compilationUnit4(List<Directive> directives,
+          List<CompilationUnitMember> declarations) =>
+      compilationUnit8(null, directives, declarations);
+
+  static CompilationUnit compilationUnit5(String scriptTag) =>
+      compilationUnit8(scriptTag, null, null);
+
+  static CompilationUnit compilationUnit6(
+          String scriptTag, List<CompilationUnitMember> declarations) =>
+      compilationUnit8(scriptTag, null, declarations);
+
+  static CompilationUnit compilationUnit7(
+          String scriptTag, List<Directive> directives) =>
+      compilationUnit8(scriptTag, directives, null);
+
+  static CompilationUnit compilationUnit8(
+          String scriptTag,
+          List<Directive> directives,
+          List<CompilationUnitMember> declarations) =>
+      new CompilationUnit(
+          TokenFactory.tokenFromType(TokenType.EOF),
+          scriptTag == null ? null : AstFactory.scriptTag(scriptTag),
+          directives == null ? new List<Directive>() : directives,
+          declarations == null
+              ? new List<CompilationUnitMember>()
+              : declarations,
+          TokenFactory.tokenFromType(TokenType.EOF));
+
+  static ConditionalExpression conditionalExpression(Expression condition,
+          Expression thenExpression, Expression elseExpression) =>
+      new ConditionalExpression(
+          condition,
+          TokenFactory.tokenFromType(TokenType.QUESTION),
+          thenExpression,
+          TokenFactory.tokenFromType(TokenType.COLON),
+          elseExpression);
+
+  static ConstructorDeclaration constructorDeclaration(
+          Identifier returnType,
+          String name,
+          FormalParameterList parameters,
+          List<ConstructorInitializer> initializers) =>
+      new ConstructorDeclaration(
+          null,
+          null,
+          TokenFactory.tokenFromKeyword(Keyword.EXTERNAL),
+          null,
+          null,
+          returnType,
+          name == null ? null : TokenFactory.tokenFromType(TokenType.PERIOD),
+          name == null ? null : identifier3(name),
+          parameters,
+          initializers == null || initializers.isEmpty
+              ? null
+              : TokenFactory.tokenFromType(TokenType.PERIOD),
+          initializers == null
+              ? new List<ConstructorInitializer>()
+              : initializers,
+          null,
+          emptyFunctionBody());
+
+  static ConstructorDeclaration constructorDeclaration2(
+          Keyword constKeyword,
+          Keyword factoryKeyword,
+          Identifier returnType,
+          String name,
+          FormalParameterList parameters,
+          List<ConstructorInitializer> initializers,
+          FunctionBody body) =>
+      new ConstructorDeclaration(
+          null,
+          null,
+          null,
+          constKeyword == null
+              ? null
+              : TokenFactory.tokenFromKeyword(constKeyword),
+          factoryKeyword == null
+              ? null
+              : TokenFactory.tokenFromKeyword(factoryKeyword),
+          returnType,
+          name == null ? null : TokenFactory.tokenFromType(TokenType.PERIOD),
+          name == null ? null : identifier3(name),
+          parameters,
+          initializers == null || initializers.isEmpty
+              ? null
+              : TokenFactory.tokenFromType(TokenType.PERIOD),
+          initializers == null
+              ? new List<ConstructorInitializer>()
+              : initializers,
+          null,
+          body);
+
+  static ConstructorFieldInitializer constructorFieldInitializer(
+          bool prefixedWithThis, String fieldName, Expression expression) =>
+      new ConstructorFieldInitializer(
+          prefixedWithThis ? TokenFactory.tokenFromKeyword(Keyword.THIS) : null,
+          prefixedWithThis
+              ? TokenFactory.tokenFromType(TokenType.PERIOD)
+              : null,
+          identifier3(fieldName),
+          TokenFactory.tokenFromType(TokenType.EQ),
+          expression);
+
+  static ConstructorName constructorName(TypeName type, String name) =>
+      new ConstructorName(
+          type,
+          name == null ? null : TokenFactory.tokenFromType(TokenType.PERIOD),
+          name == null ? null : identifier3(name));
+
+  static ContinueStatement continueStatement([String label]) =>
+      new ContinueStatement(
+          TokenFactory.tokenFromKeyword(Keyword.CONTINUE),
+          label == null ? null : identifier3(label),
+          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static DeclaredIdentifier declaredIdentifier(
+          Keyword keyword, String identifier) =>
+      declaredIdentifier2(keyword, null, identifier);
+
+  static DeclaredIdentifier declaredIdentifier2(
+          Keyword keyword, TypeName type, String identifier) =>
+      new DeclaredIdentifier(
+          null,
+          null,
+          keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
+          type,
+          identifier3(identifier));
+
+  static DeclaredIdentifier declaredIdentifier3(String identifier) =>
+      declaredIdentifier2(Keyword.VAR, null, identifier);
+
+  static DeclaredIdentifier declaredIdentifier4(
+          TypeName type, String identifier) =>
+      declaredIdentifier2(null, type, identifier);
+
+  static DoStatement doStatement(Statement body, Expression condition) =>
+      new DoStatement(
+          TokenFactory.tokenFromKeyword(Keyword.DO),
+          body,
+          TokenFactory.tokenFromKeyword(Keyword.WHILE),
+          TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+          condition,
+          TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static DoubleLiteral doubleLiteral(double value) =>
+      new DoubleLiteral(TokenFactory.tokenFromString(value.toString()), value);
+
+  static EmptyFunctionBody emptyFunctionBody() =>
+      new EmptyFunctionBody(TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static EmptyStatement emptyStatement() =>
+      new EmptyStatement(TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static EnumDeclaration enumDeclaration(
+          SimpleIdentifier name, List<EnumConstantDeclaration> constants) =>
+      new EnumDeclaration(
+          null,
+          null,
+          TokenFactory.tokenFromKeyword(Keyword.ENUM),
+          name,
+          TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
+          constants,
+          TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
+
+  static EnumDeclaration enumDeclaration2(
+      String name, List<String> constantNames) {
+    int count = constantNames.length;
+    List<EnumConstantDeclaration> constants =
+        new List<EnumConstantDeclaration>(count);
+    for (int i = 0; i < count; i++) {
+      constants[i] = new EnumConstantDeclaration(
+          null, null, identifier3(constantNames[i]));
+    }
+    return enumDeclaration(identifier3(name), constants);
+  }
+
+  static ExportDirective exportDirective(List<Annotation> metadata, String uri,
+          [List<Combinator> combinators]) =>
+      new ExportDirective(
+          null,
+          metadata,
+          TokenFactory.tokenFromKeyword(Keyword.EXPORT),
+          string2(uri),
+          combinators,
+          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static ExportDirective exportDirective2(String uri,
+          [List<Combinator> combinators]) =>
+      exportDirective(null, uri, combinators);
+
+  static ExpressionFunctionBody expressionFunctionBody(Expression expression) =>
+      new ExpressionFunctionBody(
+          null,
+          TokenFactory.tokenFromType(TokenType.FUNCTION),
+          expression,
+          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static ExpressionStatement expressionStatement(Expression expression) =>
+      new ExpressionStatement(
+          expression, TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static ExtendsClause extendsClause(TypeName type) =>
+      new ExtendsClause(TokenFactory.tokenFromKeyword(Keyword.EXTENDS), type);
+
+  static FieldDeclaration fieldDeclaration(bool isStatic, Keyword keyword,
+          TypeName type, List<VariableDeclaration> variables) =>
+      new FieldDeclaration(
+          null,
+          null,
+          isStatic ? TokenFactory.tokenFromKeyword(Keyword.STATIC) : null,
+          variableDeclarationList(keyword, type, variables),
+          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static FieldDeclaration fieldDeclaration2(bool isStatic, Keyword keyword,
+          List<VariableDeclaration> variables) =>
+      fieldDeclaration(isStatic, keyword, null, variables);
+
+  static FieldFormalParameter fieldFormalParameter(
+          Keyword keyword, TypeName type, String identifier,
+          [FormalParameterList parameterList]) =>
+      new FieldFormalParameter(
+          null,
+          null,
+          keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
+          type,
+          TokenFactory.tokenFromKeyword(Keyword.THIS),
+          TokenFactory.tokenFromType(TokenType.PERIOD),
+          identifier3(identifier),
+          null,
+          parameterList);
+
+  static FieldFormalParameter fieldFormalParameter2(String identifier) =>
+      fieldFormalParameter(null, null, identifier);
+
+  static ForEachStatement forEachStatement(DeclaredIdentifier loopVariable,
+          Expression iterator, Statement body) =>
+      new ForEachStatement.withDeclaration(
+          null,
+          TokenFactory.tokenFromKeyword(Keyword.FOR),
+          TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+          loopVariable,
+          TokenFactory.tokenFromKeyword(Keyword.IN),
+          iterator,
+          TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+          body);
+
+  static ForEachStatement forEachStatement2(
+          SimpleIdentifier identifier, Expression iterator, Statement body) =>
+      new ForEachStatement.withReference(
+          null,
+          TokenFactory.tokenFromKeyword(Keyword.FOR),
+          TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+          identifier,
+          TokenFactory.tokenFromKeyword(Keyword.IN),
+          iterator,
+          TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+          body);
+
+  static FormalParameterList formalParameterList(
+          [List<FormalParameter> parameters]) =>
+      new FormalParameterList(
+          TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+          parameters,
+          null,
+          null,
+          TokenFactory.tokenFromType(TokenType.CLOSE_PAREN));
+
+  static ForStatement forStatement(Expression initialization,
+          Expression condition, List<Expression> updaters, Statement body) =>
+      new ForStatement(
+          TokenFactory.tokenFromKeyword(Keyword.FOR),
+          TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+          null,
+          initialization,
+          TokenFactory.tokenFromType(TokenType.SEMICOLON),
+          condition,
+          TokenFactory.tokenFromType(TokenType.SEMICOLON),
+          updaters,
+          TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+          body);
+
+  static ForStatement forStatement2(VariableDeclarationList variableList,
+          Expression condition, List<Expression> updaters, Statement body) =>
+      new ForStatement(
+          TokenFactory.tokenFromKeyword(Keyword.FOR),
+          TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+          variableList,
+          null,
+          TokenFactory.tokenFromType(TokenType.SEMICOLON),
+          condition,
+          TokenFactory.tokenFromType(TokenType.SEMICOLON),
+          updaters,
+          TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+          body);
+
+  static FunctionDeclaration functionDeclaration(TypeName type, Keyword keyword,
+          String name, FunctionExpression functionExpression) =>
+      new FunctionDeclaration(
+          null,
+          null,
+          null,
+          type,
+          keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
+          identifier3(name),
+          functionExpression);
+
+  static FunctionDeclarationStatement functionDeclarationStatement(
+          TypeName type,
+          Keyword keyword,
+          String name,
+          FunctionExpression functionExpression) =>
+      new FunctionDeclarationStatement(
+          functionDeclaration(type, keyword, name, functionExpression));
+
+  static FunctionExpression functionExpression() =>
+      new FunctionExpression(null, formalParameterList(), blockFunctionBody2());
+
+  static FunctionExpression functionExpression2(
+          FormalParameterList parameters, FunctionBody body) =>
+      new FunctionExpression(null, parameters, body);
+
+  static FunctionExpression functionExpression3(
+          TypeParameterList typeParameters,
+          FormalParameterList parameters,
+          FunctionBody body) =>
+      new FunctionExpression(typeParameters, parameters, body);
+
+  static FunctionExpressionInvocation functionExpressionInvocation(
+          Expression function,
+          [List<Expression> arguments]) =>
+      functionExpressionInvocation2(function, null, arguments);
+
+  static FunctionExpressionInvocation functionExpressionInvocation2(
+          Expression function,
+          [TypeArgumentList typeArguments,
+          List<Expression> arguments]) =>
+      new FunctionExpressionInvocation(
+          function, typeArguments, argumentList(arguments));
+
+  static FunctionTypedFormalParameter functionTypedFormalParameter(
+          TypeName returnType, String identifier,
+          [List<FormalParameter> parameters]) =>
+      new FunctionTypedFormalParameter(null, null, returnType,
+          identifier3(identifier), null, formalParameterList(parameters));
+
+  static HideCombinator hideCombinator(List<SimpleIdentifier> identifiers) =>
+      new HideCombinator(TokenFactory.tokenFromString("hide"), identifiers);
+
+  static HideCombinator hideCombinator2(List<String> identifiers) =>
+      new HideCombinator(
+          TokenFactory.tokenFromString("hide"), identifierList(identifiers));
+
+  static PrefixedIdentifier identifier(
+          SimpleIdentifier prefix, SimpleIdentifier identifier) =>
+      new PrefixedIdentifier(
+          prefix, TokenFactory.tokenFromType(TokenType.PERIOD), identifier);
+
+  static SimpleIdentifier identifier3(String lexeme) => new SimpleIdentifier(
+      TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, lexeme));
+
+  static PrefixedIdentifier identifier4(
+          String prefix, SimpleIdentifier identifier) =>
+      new PrefixedIdentifier(identifier3(prefix),
+          TokenFactory.tokenFromType(TokenType.PERIOD), identifier);
+
+  static PrefixedIdentifier identifier5(String prefix, String identifier) =>
+      new PrefixedIdentifier(
+          identifier3(prefix),
+          TokenFactory.tokenFromType(TokenType.PERIOD),
+          identifier3(identifier));
+
+  static List<SimpleIdentifier> identifierList(List<String> identifiers) {
+    if (identifiers == null) {
+      return null;
+    }
+    return identifiers
+        .map((String identifier) => identifier3(identifier))
+        .toList();
+  }
+
+  static IfStatement ifStatement(
+          Expression condition, Statement thenStatement) =>
+      ifStatement2(condition, thenStatement, null);
+
+  static IfStatement ifStatement2(Expression condition, Statement thenStatement,
+          Statement elseStatement) =>
+      new IfStatement(
+          TokenFactory.tokenFromKeyword(Keyword.IF),
+          TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+          condition,
+          TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+          thenStatement,
+          elseStatement == null
+              ? null
+              : TokenFactory.tokenFromKeyword(Keyword.ELSE),
+          elseStatement);
+
+  static ImplementsClause implementsClause(List<TypeName> types) =>
+      new ImplementsClause(
+          TokenFactory.tokenFromKeyword(Keyword.IMPLEMENTS), types);
+
+  static ImportDirective importDirective(
+          List<Annotation> metadata, String uri, bool isDeferred, String prefix,
+          [List<Combinator> combinators]) =>
+      new ImportDirective(
+          null,
+          metadata,
+          TokenFactory.tokenFromKeyword(Keyword.IMPORT),
+          string2(uri),
+          !isDeferred ? null : TokenFactory.tokenFromKeyword(Keyword.DEFERRED),
+          prefix == null ? null : TokenFactory.tokenFromKeyword(Keyword.AS),
+          prefix == null ? null : identifier3(prefix),
+          combinators,
+          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static ImportDirective importDirective2(
+          String uri, bool isDeferred, String prefix,
+          [List<Combinator> combinators]) =>
+      importDirective(null, uri, isDeferred, prefix, combinators);
+
+  static ImportDirective importDirective3(String uri, String prefix,
+          [List<Combinator> combinators]) =>
+      importDirective(null, uri, false, prefix, combinators);
+
+  static IndexExpression indexExpression(Expression array, Expression index) =>
+      new IndexExpression.forTarget(
+          array,
+          TokenFactory.tokenFromType(TokenType.OPEN_SQUARE_BRACKET),
+          index,
+          TokenFactory.tokenFromType(TokenType.CLOSE_SQUARE_BRACKET));
+
+  static InstanceCreationExpression instanceCreationExpression(
+          Keyword keyword, ConstructorName name,
+          [List<Expression> arguments]) =>
+      new InstanceCreationExpression(
+          keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
+          name,
+          argumentList(arguments));
+
+  static InstanceCreationExpression instanceCreationExpression2(
+          Keyword keyword, TypeName type,
+          [List<Expression> arguments]) =>
+      instanceCreationExpression3(keyword, type, null, arguments);
+
+  static InstanceCreationExpression instanceCreationExpression3(
+          Keyword keyword, TypeName type, String identifier,
+          [List<Expression> arguments]) =>
+      instanceCreationExpression(
+          keyword,
+          new ConstructorName(
+              type,
+              identifier == null
+                  ? null
+                  : TokenFactory.tokenFromType(TokenType.PERIOD),
+              identifier == null ? null : identifier3(identifier)),
+          arguments);
+
+  static IntegerLiteral integer(int value) => new IntegerLiteral(
+      TokenFactory.tokenFromTypeAndString(TokenType.INT, value.toString()),
+      value);
+
+  static InterpolationExpression interpolationExpression(
+          Expression expression) =>
+      new InterpolationExpression(
+          TokenFactory.tokenFromType(TokenType.STRING_INTERPOLATION_EXPRESSION),
+          expression,
+          TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
+
+  static InterpolationExpression interpolationExpression2(String identifier) =>
+      new InterpolationExpression(
+          TokenFactory.tokenFromType(TokenType.STRING_INTERPOLATION_IDENTIFIER),
+          identifier3(identifier),
+          null);
+
+  static InterpolationString interpolationString(
+          String contents, String value) =>
+      new InterpolationString(TokenFactory.tokenFromString(contents), value);
+
+  static IsExpression isExpression(
+          Expression expression, bool negated, TypeName type) =>
+      new IsExpression(expression, TokenFactory.tokenFromKeyword(Keyword.IS),
+          negated ? TokenFactory.tokenFromType(TokenType.BANG) : null, type);
+
+  static Label label(SimpleIdentifier label) =>
+      new Label(label, TokenFactory.tokenFromType(TokenType.COLON));
+
+  static Label label2(String label) => AstFactory.label(identifier3(label));
+
+  static LabeledStatement labeledStatement(
+          List<Label> labels, Statement statement) =>
+      new LabeledStatement(labels, statement);
+
+  static LibraryDirective libraryDirective(
+          List<Annotation> metadata, LibraryIdentifier libraryName) =>
+      new LibraryDirective(
+          null,
+          metadata,
+          TokenFactory.tokenFromKeyword(Keyword.LIBRARY),
+          libraryName,
+          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static LibraryDirective libraryDirective2(String libraryName) =>
+      libraryDirective(
+          new List<Annotation>(), libraryIdentifier2([libraryName]));
+
+  static LibraryIdentifier libraryIdentifier(
+          List<SimpleIdentifier> components) =>
+      new LibraryIdentifier(components);
+
+  static LibraryIdentifier libraryIdentifier2(List<String> components) {
+    return new LibraryIdentifier(identifierList(components));
+  }
+
+  static List list(List<Object> elements) {
+    return elements;
+  }
+
+  static ListLiteral listLiteral([List<Expression> elements]) =>
+      listLiteral2(null, null, elements);
+
+  static ListLiteral listLiteral2(
+          Keyword keyword, TypeArgumentList typeArguments,
+          [List<Expression> elements]) =>
+      new ListLiteral(
+          keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
+          typeArguments,
+          TokenFactory.tokenFromType(TokenType.OPEN_SQUARE_BRACKET),
+          elements,
+          TokenFactory.tokenFromType(TokenType.CLOSE_SQUARE_BRACKET));
+
+  static MapLiteral mapLiteral(Keyword keyword, TypeArgumentList typeArguments,
+          [List<MapLiteralEntry> entries]) =>
+      new MapLiteral(
+          keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
+          typeArguments,
+          TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
+          entries,
+          TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
+
+  static MapLiteral mapLiteral2([List<MapLiteralEntry> entries]) =>
+      mapLiteral(null, null, entries);
+
+  static MapLiteralEntry mapLiteralEntry(String key, Expression value) =>
+      new MapLiteralEntry(
+          string2(key), TokenFactory.tokenFromType(TokenType.COLON), value);
+
+  static MethodDeclaration methodDeclaration(
+          Keyword modifier,
+          TypeName returnType,
+          Keyword property,
+          Keyword operator,
+          SimpleIdentifier name,
+          FormalParameterList parameters) =>
+      new MethodDeclaration(
+          null,
+          null,
+          TokenFactory.tokenFromKeyword(Keyword.EXTERNAL),
+          modifier == null ? null : TokenFactory.tokenFromKeyword(modifier),
+          returnType,
+          property == null ? null : TokenFactory.tokenFromKeyword(property),
+          operator == null ? null : TokenFactory.tokenFromKeyword(operator),
+          name,
+          null,
+          parameters,
+          emptyFunctionBody());
+
+  static MethodDeclaration methodDeclaration2(
+          Keyword modifier,
+          TypeName returnType,
+          Keyword property,
+          Keyword operator,
+          SimpleIdentifier name,
+          FormalParameterList parameters,
+          FunctionBody body) =>
+      new MethodDeclaration(
+          null,
+          null,
+          null,
+          modifier == null ? null : TokenFactory.tokenFromKeyword(modifier),
+          returnType,
+          property == null ? null : TokenFactory.tokenFromKeyword(property),
+          operator == null ? null : TokenFactory.tokenFromKeyword(operator),
+          name,
+          null,
+          parameters,
+          body);
+
+  static MethodDeclaration methodDeclaration3(
+          Keyword modifier,
+          TypeName returnType,
+          Keyword property,
+          Keyword operator,
+          SimpleIdentifier name,
+          TypeParameterList typeParameters,
+          FormalParameterList parameters,
+          FunctionBody body) =>
+      new MethodDeclaration(
+          null,
+          null,
+          null,
+          modifier == null ? null : TokenFactory.tokenFromKeyword(modifier),
+          returnType,
+          property == null ? null : TokenFactory.tokenFromKeyword(property),
+          operator == null ? null : TokenFactory.tokenFromKeyword(operator),
+          name,
+          typeParameters,
+          parameters,
+          body);
+
+  static MethodInvocation methodInvocation(Expression target, String methodName,
+          [List<Expression> arguments,
+          TokenType operator = TokenType.PERIOD]) =>
+      new MethodInvocation(
+          target,
+          target == null ? null : TokenFactory.tokenFromType(operator),
+          identifier3(methodName),
+          null,
+          argumentList(arguments));
+
+  static MethodInvocation methodInvocation2(String methodName,
+          [List<Expression> arguments]) =>
+      methodInvocation(null, methodName, arguments);
+
+  static MethodInvocation methodInvocation3(
+          Expression target, String methodName, TypeArgumentList typeArguments,
+          [List<Expression> arguments,
+          TokenType operator = TokenType.PERIOD]) =>
+      new MethodInvocation(
+          target,
+          target == null ? null : TokenFactory.tokenFromType(operator),
+          identifier3(methodName),
+          typeArguments,
+          argumentList(arguments));
+
+  static NamedExpression namedExpression(Label label, Expression expression) =>
+      new NamedExpression(label, expression);
+
+  static NamedExpression namedExpression2(
+          String label, Expression expression) =>
+      namedExpression(label2(label), expression);
+
+  static DefaultFormalParameter namedFormalParameter(
+          NormalFormalParameter parameter, Expression expression) =>
+      new DefaultFormalParameter(
+          parameter,
+          ParameterKind.NAMED,
+          expression == null
+              ? null
+              : TokenFactory.tokenFromType(TokenType.COLON),
+          expression);
+
+  static NativeClause nativeClause(String nativeCode) => new NativeClause(
+      TokenFactory.tokenFromString("native"), string2(nativeCode));
+
+  static NativeFunctionBody nativeFunctionBody(String nativeMethodName) =>
+      new NativeFunctionBody(
+          TokenFactory.tokenFromString("native"),
+          string2(nativeMethodName),
+          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static NullLiteral nullLiteral() =>
+      new NullLiteral(TokenFactory.tokenFromKeyword(Keyword.NULL));
+
+  static ParenthesizedExpression parenthesizedExpression(
+          Expression expression) =>
+      new ParenthesizedExpression(
+          TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+          expression,
+          TokenFactory.tokenFromType(TokenType.CLOSE_PAREN));
+
+  static PartDirective partDirective(List<Annotation> metadata, String url) =>
+      new PartDirective(
+          null,
+          metadata,
+          TokenFactory.tokenFromKeyword(Keyword.PART),
+          string2(url),
+          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static PartDirective partDirective2(String url) =>
+      partDirective(new List<Annotation>(), url);
+
+  static PartOfDirective partOfDirective(LibraryIdentifier libraryName) =>
+      partOfDirective2(new List<Annotation>(), libraryName);
+
+  static PartOfDirective partOfDirective2(
+          List<Annotation> metadata, LibraryIdentifier libraryName) =>
+      new PartOfDirective(
+          null,
+          metadata,
+          TokenFactory.tokenFromKeyword(Keyword.PART),
+          TokenFactory.tokenFromString("of"),
+          libraryName,
+          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static DefaultFormalParameter positionalFormalParameter(
+          NormalFormalParameter parameter, Expression expression) =>
+      new DefaultFormalParameter(
+          parameter,
+          ParameterKind.POSITIONAL,
+          expression == null ? null : TokenFactory.tokenFromType(TokenType.EQ),
+          expression);
+
+  static PostfixExpression postfixExpression(
+          Expression expression, TokenType operator) =>
+      new PostfixExpression(expression, TokenFactory.tokenFromType(operator));
+
+  static PrefixExpression prefixExpression(
+          TokenType operator, Expression expression) =>
+      new PrefixExpression(TokenFactory.tokenFromType(operator), expression);
+
+  static PropertyAccess propertyAccess(
+          Expression target, SimpleIdentifier propertyName) =>
+      new PropertyAccess(
+          target, TokenFactory.tokenFromType(TokenType.PERIOD), propertyName);
+
+  static PropertyAccess propertyAccess2(Expression target, String propertyName,
+          [TokenType operator = TokenType.PERIOD]) =>
+      new PropertyAccess(target, TokenFactory.tokenFromType(operator),
+          identifier3(propertyName));
+
+  static RedirectingConstructorInvocation redirectingConstructorInvocation(
+          [List<Expression> arguments]) =>
+      redirectingConstructorInvocation2(null, arguments);
+
+  static RedirectingConstructorInvocation redirectingConstructorInvocation2(
+          String constructorName,
+          [List<Expression> arguments]) =>
+      new RedirectingConstructorInvocation(
+          TokenFactory.tokenFromKeyword(Keyword.THIS),
+          constructorName == null
+              ? null
+              : TokenFactory.tokenFromType(TokenType.PERIOD),
+          constructorName == null ? null : identifier3(constructorName),
+          argumentList(arguments));
+
+  static RethrowExpression rethrowExpression() =>
+      new RethrowExpression(TokenFactory.tokenFromKeyword(Keyword.RETHROW));
+
+  static ReturnStatement returnStatement() => returnStatement2(null);
+
+  static ReturnStatement returnStatement2(Expression expression) =>
+      new ReturnStatement(TokenFactory.tokenFromKeyword(Keyword.RETURN),
+          expression, TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static ScriptTag scriptTag(String scriptTag) =>
+      new ScriptTag(TokenFactory.tokenFromString(scriptTag));
+
+  static ShowCombinator showCombinator(List<SimpleIdentifier> identifiers) =>
+      new ShowCombinator(TokenFactory.tokenFromString("show"), identifiers);
+
+  static ShowCombinator showCombinator2(List<String> identifiers) =>
+      new ShowCombinator(
+          TokenFactory.tokenFromString("show"), identifierList(identifiers));
+
+  static SimpleFormalParameter simpleFormalParameter(
+          Keyword keyword, String parameterName) =>
+      simpleFormalParameter2(keyword, null, parameterName);
+
+  static SimpleFormalParameter simpleFormalParameter2(
+          Keyword keyword, TypeName type, String parameterName) =>
+      new SimpleFormalParameter(
+          null,
+          null,
+          keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
+          type,
+          identifier3(parameterName));
+
+  static SimpleFormalParameter simpleFormalParameter3(String parameterName) =>
+      simpleFormalParameter2(null, null, parameterName);
+
+  static SimpleFormalParameter simpleFormalParameter4(
+          TypeName type, String parameterName) =>
+      simpleFormalParameter2(null, type, parameterName);
+
+  static StringInterpolation string([List<InterpolationElement> elements]) =>
+      new StringInterpolation(elements);
+
+  static SimpleStringLiteral string2(String content) => new SimpleStringLiteral(
+      TokenFactory.tokenFromString("'$content'"), content);
+
+  static SuperConstructorInvocation superConstructorInvocation(
+          [List<Expression> arguments]) =>
+      superConstructorInvocation2(null, arguments);
+
+  static SuperConstructorInvocation superConstructorInvocation2(String name,
+          [List<Expression> arguments]) =>
+      new SuperConstructorInvocation(
+          TokenFactory.tokenFromKeyword(Keyword.SUPER),
+          name == null ? null : TokenFactory.tokenFromType(TokenType.PERIOD),
+          name == null ? null : identifier3(name),
+          argumentList(arguments));
+
+  static SuperExpression superExpression() =>
+      new SuperExpression(TokenFactory.tokenFromKeyword(Keyword.SUPER));
+
+  static SwitchCase switchCase(
+          Expression expression, List<Statement> statements) =>
+      switchCase2(new List<Label>(), expression, statements);
+
+  static SwitchCase switchCase2(List<Label> labels, Expression expression,
+          List<Statement> statements) =>
+      new SwitchCase(labels, TokenFactory.tokenFromKeyword(Keyword.CASE),
+          expression, TokenFactory.tokenFromType(TokenType.COLON), statements);
+
+  static SwitchDefault switchDefault(
+          List<Label> labels, List<Statement> statements) =>
+      new SwitchDefault(labels, TokenFactory.tokenFromKeyword(Keyword.DEFAULT),
+          TokenFactory.tokenFromType(TokenType.COLON), statements);
+
+  static SwitchDefault switchDefault2(List<Statement> statements) =>
+      switchDefault(new List<Label>(), statements);
+
+  static SwitchStatement switchStatement(
+          Expression expression, List<SwitchMember> members) =>
+      new SwitchStatement(
+          TokenFactory.tokenFromKeyword(Keyword.SWITCH),
+          TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+          expression,
+          TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+          TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
+          members,
+          TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
+
+  static SymbolLiteral symbolLiteral(List<String> components) {
+    List<Token> identifierList = new List<Token>();
+    for (String component in components) {
+      identifierList.add(
+          TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, component));
+    }
+    return new SymbolLiteral(
+        TokenFactory.tokenFromType(TokenType.HASH), identifierList);
+  }
+
+  static BlockFunctionBody syncBlockFunctionBody(
+          [List<Statement> statements]) =>
+      new BlockFunctionBody(
+          TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, "sync"),
+          null,
+          block(statements));
+
+  static BlockFunctionBody syncGeneratorBlockFunctionBody(
+          [List<Statement> statements]) =>
+      new BlockFunctionBody(
+          TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, "sync"),
+          TokenFactory.tokenFromType(TokenType.STAR),
+          block(statements));
+
+  static ThisExpression thisExpression() =>
+      new ThisExpression(TokenFactory.tokenFromKeyword(Keyword.THIS));
+
+  static ThrowExpression throwExpression() => throwExpression2(null);
+
+  static ThrowExpression throwExpression2(Expression expression) =>
+      new ThrowExpression(
+          TokenFactory.tokenFromKeyword(Keyword.THROW), expression);
+
+  static TopLevelVariableDeclaration topLevelVariableDeclaration(
+          Keyword keyword,
+          TypeName type,
+          List<VariableDeclaration> variables) =>
+      new TopLevelVariableDeclaration(
+          null,
+          null,
+          variableDeclarationList(keyword, type, variables),
+          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static TopLevelVariableDeclaration topLevelVariableDeclaration2(
+          Keyword keyword, List<VariableDeclaration> variables) =>
+      new TopLevelVariableDeclaration(
+          null,
+          null,
+          variableDeclarationList(keyword, null, variables),
+          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static TryStatement tryStatement(Block body, Block finallyClause) =>
+      tryStatement3(body, new List<CatchClause>(), finallyClause);
+
+  static TryStatement tryStatement2(
+          Block body, List<CatchClause> catchClauses) =>
+      tryStatement3(body, catchClauses, null);
+
+  static TryStatement tryStatement3(
+          Block body, List<CatchClause> catchClauses, Block finallyClause) =>
+      new TryStatement(
+          TokenFactory.tokenFromKeyword(Keyword.TRY),
+          body,
+          catchClauses,
+          finallyClause == null
+              ? null
+              : TokenFactory.tokenFromKeyword(Keyword.FINALLY),
+          finallyClause);
+
+  static FunctionTypeAlias typeAlias(TypeName returnType, String name,
+          TypeParameterList typeParameters, FormalParameterList parameters) =>
+      new FunctionTypeAlias(
+          null,
+          null,
+          TokenFactory.tokenFromKeyword(Keyword.TYPEDEF),
+          returnType,
+          identifier3(name),
+          typeParameters,
+          parameters,
+          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static TypeArgumentList typeArgumentList(List<TypeName> typeNames) {
+    if (typeNames == null || typeNames.length == 0) {
+      return null;
+    }
+    return new TypeArgumentList(TokenFactory.tokenFromType(TokenType.LT),
+        typeNames, TokenFactory.tokenFromType(TokenType.GT));
+  }
+
+  /**
+   * Create a type name whose name has been resolved to the given [element] and
+   * whose type has been resolved to the type of the given element.
+   *
+   * <b>Note:</b> This method does not correctly handle class elements that have
+   * type parameters.
+   */
+  static TypeName typeName(ClassElement element, [List<TypeName> arguments]) {
+    SimpleIdentifier name = identifier3(element.name);
+    name.staticElement = element;
+    TypeName typeName = typeName3(name, arguments);
+    typeName.type = element.type;
+    return typeName;
+  }
+
+  static TypeName typeName3(Identifier name, [List<TypeName> arguments]) =>
+      new TypeName(name, typeArgumentList(arguments));
+
+  static TypeName typeName4(String name, [List<TypeName> arguments]) =>
+      new TypeName(identifier3(name), typeArgumentList(arguments));
+
+  static TypeParameter typeParameter(String name) =>
+      new TypeParameter(null, null, identifier3(name), null, null);
+
+  static TypeParameter typeParameter2(String name, TypeName bound) =>
+      new TypeParameter(null, null, identifier3(name),
+          TokenFactory.tokenFromKeyword(Keyword.EXTENDS), bound);
+
+  static TypeParameterList typeParameterList([List<String> typeNames]) {
+    List<TypeParameter> typeParameters = null;
+    if (typeNames != null && !typeNames.isEmpty) {
+      typeParameters = new List<TypeParameter>();
+      for (String typeName in typeNames) {
+        typeParameters.add(typeParameter(typeName));
+      }
+    }
+    return new TypeParameterList(TokenFactory.tokenFromType(TokenType.LT),
+        typeParameters, TokenFactory.tokenFromType(TokenType.GT));
+  }
+
+  static VariableDeclaration variableDeclaration(String name) =>
+      new VariableDeclaration(identifier3(name), null, null);
+
+  static VariableDeclaration variableDeclaration2(
+          String name, Expression initializer) =>
+      new VariableDeclaration(identifier3(name),
+          TokenFactory.tokenFromType(TokenType.EQ), initializer);
+
+  static VariableDeclarationList variableDeclarationList(Keyword keyword,
+          TypeName type, List<VariableDeclaration> variables) =>
+      new VariableDeclarationList(
+          null,
+          null,
+          keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
+          type,
+          variables);
+
+  static VariableDeclarationList variableDeclarationList2(
+          Keyword keyword, List<VariableDeclaration> variables) =>
+      variableDeclarationList(keyword, null, variables);
+
+  static VariableDeclarationStatement variableDeclarationStatement(
+          Keyword keyword,
+          TypeName type,
+          List<VariableDeclaration> variables) =>
+      new VariableDeclarationStatement(
+          variableDeclarationList(keyword, type, variables),
+          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static VariableDeclarationStatement variableDeclarationStatement2(
+          Keyword keyword, List<VariableDeclaration> variables) =>
+      variableDeclarationStatement(keyword, null, variables);
+
+  static WhileStatement whileStatement(Expression condition, Statement body) =>
+      new WhileStatement(
+          TokenFactory.tokenFromKeyword(Keyword.WHILE),
+          TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+          condition,
+          TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+          body);
+
+  static WithClause withClause(List<TypeName> types) =>
+      new WithClause(TokenFactory.tokenFromKeyword(Keyword.WITH), types);
+
+  static YieldStatement yieldEachStatement(Expression expression) =>
+      new YieldStatement(
+          TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, "yield"),
+          TokenFactory.tokenFromType(TokenType.STAR),
+          expression,
+          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+
+  static YieldStatement yieldStatement(Expression expression) =>
+      new YieldStatement(
+          TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, "yield"),
+          null,
+          expression,
+          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/testing/element_factory.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/testing/element_factory.dart
new file mode 100644
index 0000000..58d7bae
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/testing/element_factory.dart
@@ -0,0 +1,579 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.testing.element_factory;
+
+import 'dart:collection';
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/constant.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/testing/ast_factory.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:path/path.dart';
+
+/**
+ * The class `ElementFactory` defines utility methods used to create elements for testing
+ * purposes. The elements that are created are complete in the sense that as much of the element
+ * model as can be created, given the provided information, has been created.
+ */
+class ElementFactory {
+  /**
+   * The element representing the class 'Object'.
+   */
+  static ClassElementImpl _objectElement;
+
+  static ClassElementImpl get object {
+    if (_objectElement == null) {
+      _objectElement = classElement("Object", null);
+    }
+    return _objectElement;
+  }
+
+  static InterfaceType get objectType => object.type;
+
+  static ClassElementImpl classElement(
+      String typeName, InterfaceType superclassType,
+      [List<String> parameterNames]) {
+    ClassElementImpl element = new ClassElementImpl(typeName, 0);
+    element.supertype = superclassType;
+    InterfaceTypeImpl type = new InterfaceTypeImpl(element);
+    element.type = type;
+    if (parameterNames != null) {
+      int count = parameterNames.length;
+      if (count > 0) {
+        List<TypeParameterElementImpl> typeParameters =
+            new List<TypeParameterElementImpl>(count);
+        List<TypeParameterTypeImpl> typeParameterTypes =
+            new List<TypeParameterTypeImpl>(count);
+        for (int i = 0; i < count; i++) {
+          TypeParameterElementImpl typeParameter =
+              typeParameterElement(parameterNames[i]);
+          typeParameters[i] = typeParameter;
+          typeParameterTypes[i] = new TypeParameterTypeImpl(typeParameter);
+          typeParameter.type = typeParameterTypes[i];
+        }
+        element.typeParameters = typeParameters;
+        type.typeArguments = typeParameterTypes;
+      }
+    }
+    return element;
+  }
+
+  static ClassElementImpl classElement2(String typeName,
+          [List<String> parameterNames]) =>
+      classElement(typeName, objectType, parameterNames);
+
+  static classTypeAlias(String typeName, InterfaceType superclassType,
+      [List<String> parameterNames]) {
+    ClassElementImpl element =
+        classElement(typeName, superclassType, parameterNames);
+    element.mixinApplication = true;
+    return element;
+  }
+
+  static ClassElementImpl classTypeAlias2(String typeName,
+          [List<String> parameterNames]) =>
+      classTypeAlias(typeName, objectType, parameterNames);
+
+  static CompilationUnitElementImpl compilationUnit(String fileName,
+      [Source librarySource]) {
+    Source source =
+        new NonExistingSource(fileName, toUri(fileName), UriKind.FILE_URI);
+    CompilationUnitElementImpl unit = new CompilationUnitElementImpl(fileName);
+    unit.source = source;
+    if (librarySource == null) {
+      librarySource = source;
+    }
+    unit.librarySource = librarySource;
+    return unit;
+  }
+
+  static ConstLocalVariableElementImpl constLocalVariableElement(String name) =>
+      new ConstLocalVariableElementImpl(name, 0);
+
+  static ConstructorElementImpl constructorElement(
+      ClassElement definingClass, String name, bool isConst,
+      [List<DartType> argumentTypes]) {
+    DartType type = definingClass.type;
+    ConstructorElementImpl constructor = name == null
+        ? new ConstructorElementImpl("", -1)
+        : new ConstructorElementImpl(name, 0);
+    constructor.const2 = isConst;
+    if (argumentTypes != null) {
+      int count = argumentTypes.length;
+      List<ParameterElement> parameters = new List<ParameterElement>(count);
+      for (int i = 0; i < count; i++) {
+        ParameterElementImpl parameter = new ParameterElementImpl("a$i", i);
+        parameter.type = argumentTypes[i];
+        parameter.parameterKind = ParameterKind.REQUIRED;
+        parameters[i] = parameter;
+      }
+      constructor.parameters = parameters;
+    } else {
+      constructor.parameters = <ParameterElement>[];
+    }
+    constructor.returnType = type;
+    FunctionTypeImpl constructorType = new FunctionTypeImpl(constructor);
+    constructor.type = constructorType;
+    return constructor;
+  }
+
+  static ConstructorElementImpl constructorElement2(
+          ClassElement definingClass, String name,
+          [List<DartType> argumentTypes]) =>
+      constructorElement(definingClass, name, false, argumentTypes);
+
+  static ClassElementImpl enumElement(
+      TypeProvider typeProvider, String enumName,
+      [List<String> constantNames]) {
+    //
+    // Build the enum.
+    //
+    ClassElementImpl enumElement = new ClassElementImpl(enumName, -1);
+    InterfaceTypeImpl enumType = new InterfaceTypeImpl(enumElement);
+    enumElement.type = enumType;
+    enumElement.supertype = objectType;
+    enumElement.enum2 = true;
+    //
+    // Populate the fields.
+    //
+    List<FieldElement> fields = new List<FieldElement>();
+    InterfaceType intType = typeProvider.intType;
+    InterfaceType stringType = typeProvider.stringType;
+    String indexFieldName = "index";
+    FieldElementImpl indexField = new FieldElementImpl(indexFieldName, -1);
+    indexField.final2 = true;
+    indexField.type = intType;
+    fields.add(indexField);
+    String nameFieldName = "_name";
+    FieldElementImpl nameField = new FieldElementImpl(nameFieldName, -1);
+    nameField.final2 = true;
+    nameField.type = stringType;
+    fields.add(nameField);
+    FieldElementImpl valuesField = new FieldElementImpl("values", -1);
+    valuesField.static = true;
+    valuesField.const3 = true;
+    valuesField.type = typeProvider.listType.substitute4(<DartType>[enumType]);
+    fields.add(valuesField);
+    //
+    // Build the enum constants.
+    //
+    if (constantNames != null) {
+      int constantCount = constantNames.length;
+      for (int i = 0; i < constantCount; i++) {
+        String constantName = constantNames[i];
+        FieldElementImpl constantElement =
+            new ConstFieldElementImpl(constantName, -1);
+        constantElement.static = true;
+        constantElement.const3 = true;
+        constantElement.type = enumType;
+        HashMap<String, DartObjectImpl> fieldMap =
+            new HashMap<String, DartObjectImpl>();
+        fieldMap[indexFieldName] = new DartObjectImpl(intType, new IntState(i));
+        fieldMap[nameFieldName] =
+            new DartObjectImpl(stringType, new StringState(constantName));
+        DartObjectImpl value =
+            new DartObjectImpl(enumType, new GenericState(fieldMap));
+        constantElement.evaluationResult = new EvaluationResultImpl(value);
+        fields.add(constantElement);
+      }
+    }
+    //
+    // Finish building the enum.
+    //
+    enumElement.fields = fields;
+    // Client code isn't allowed to invoke the constructor, so we do not model it.
+    return enumElement;
+  }
+
+  static ExportElementImpl exportFor(LibraryElement exportedLibrary,
+      [List<NamespaceCombinator> combinators =
+          NamespaceCombinator.EMPTY_LIST]) {
+    ExportElementImpl spec = new ExportElementImpl(-1);
+    spec.exportedLibrary = exportedLibrary;
+    spec.combinators = combinators;
+    return spec;
+  }
+
+  static FieldElementImpl fieldElement(
+      String name, bool isStatic, bool isFinal, bool isConst, DartType type) {
+    FieldElementImpl field = new FieldElementImpl(name, 0);
+    field.const3 = isConst;
+    field.final2 = isFinal;
+    field.static = isStatic;
+    field.type = type;
+    PropertyAccessorElementImpl getter =
+        new PropertyAccessorElementImpl.forVariable(field);
+    getter.getter = true;
+    getter.synthetic = true;
+    getter.variable = field;
+    getter.returnType = type;
+    field.getter = getter;
+    FunctionTypeImpl getterType = new FunctionTypeImpl(getter);
+    getter.type = getterType;
+    if (!isConst && !isFinal) {
+      PropertyAccessorElementImpl setter =
+          new PropertyAccessorElementImpl.forVariable(field);
+      setter.setter = true;
+      setter.synthetic = true;
+      setter.variable = field;
+      setter.parameters = <ParameterElement>[
+        requiredParameter2("_$name", type)
+      ];
+      setter.returnType = VoidTypeImpl.instance;
+      setter.type = new FunctionTypeImpl(setter);
+      field.setter = setter;
+    }
+    return field;
+  }
+
+  static FieldFormalParameterElementImpl fieldFormalParameter(
+          Identifier name) =>
+      new FieldFormalParameterElementImpl(name);
+
+  static FunctionElementImpl functionElement(String functionName) =>
+      functionElement4(functionName, null, null, null, null);
+
+  static FunctionElementImpl functionElement2(
+          String functionName, ClassElement returnElement) =>
+      functionElement3(functionName, returnElement, null, null);
+
+  static FunctionElementImpl functionElement3(
+      String functionName,
+      ClassElement returnElement,
+      List<TypeDefiningElement> normalParameters,
+      List<TypeDefiningElement> optionalParameters) {
+    // We don't create parameter elements because we don't have parameter names
+    FunctionElementImpl functionElement =
+        new FunctionElementImpl(functionName, 0);
+    FunctionTypeImpl functionType = new FunctionTypeImpl(functionElement);
+    functionElement.type = functionType;
+    // return type
+    if (returnElement == null) {
+      functionElement.returnType = VoidTypeImpl.instance;
+    } else {
+      functionElement.returnType = returnElement.type;
+    }
+    // parameters
+    int normalCount = normalParameters == null ? 0 : normalParameters.length;
+    int optionalCount =
+        optionalParameters == null ? 0 : optionalParameters.length;
+    int totalCount = normalCount + optionalCount;
+    List<ParameterElement> parameters = new List<ParameterElement>(totalCount);
+    for (int i = 0; i < totalCount; i++) {
+      ParameterElementImpl parameter = new ParameterElementImpl("a$i", i);
+      if (i < normalCount) {
+        parameter.type = normalParameters[i].type;
+        parameter.parameterKind = ParameterKind.REQUIRED;
+      } else {
+        parameter.type = optionalParameters[i - normalCount].type;
+        parameter.parameterKind = ParameterKind.POSITIONAL;
+      }
+      parameters[i] = parameter;
+    }
+    functionElement.parameters = parameters;
+    // done
+    return functionElement;
+  }
+
+  static FunctionElementImpl functionElement4(
+      String functionName,
+      ClassElement returnElement,
+      List<ClassElement> normalParameters,
+      List<String> names,
+      List<ClassElement> namedParameters) {
+    FunctionElementImpl functionElement =
+        new FunctionElementImpl(functionName, 0);
+    FunctionTypeImpl functionType = new FunctionTypeImpl(functionElement);
+    functionElement.type = functionType;
+    // parameters
+    int normalCount = normalParameters == null ? 0 : normalParameters.length;
+    int nameCount = names == null ? 0 : names.length;
+    int typeCount = namedParameters == null ? 0 : namedParameters.length;
+    if (names != null && nameCount != typeCount) {
+      throw new IllegalStateException(
+          "The passed String[] and ClassElement[] arrays had different lengths.");
+    }
+    int totalCount = normalCount + nameCount;
+    List<ParameterElement> parameters = new List<ParameterElement>(totalCount);
+    for (int i = 0; i < totalCount; i++) {
+      if (i < normalCount) {
+        ParameterElementImpl parameter = new ParameterElementImpl("a$i", i);
+        parameter.type = normalParameters[i].type;
+        parameter.parameterKind = ParameterKind.REQUIRED;
+        parameters[i] = parameter;
+      } else {
+        ParameterElementImpl parameter =
+            new ParameterElementImpl(names[i - normalCount], i);
+        parameter.type = namedParameters[i - normalCount].type;
+        parameter.parameterKind = ParameterKind.NAMED;
+        parameters[i] = parameter;
+      }
+    }
+    functionElement.parameters = parameters;
+    // return type
+    if (returnElement == null) {
+      functionElement.returnType = VoidTypeImpl.instance;
+    } else {
+      functionElement.returnType = returnElement.type;
+    }
+    return functionElement;
+  }
+
+  static FunctionElementImpl functionElement5(
+          String functionName, List<ClassElement> normalParameters) =>
+      functionElement3(functionName, null, normalParameters, null);
+
+  static FunctionElementImpl functionElement6(
+          String functionName,
+          List<ClassElement> normalParameters,
+          List<ClassElement> optionalParameters) =>
+      functionElement3(
+          functionName, null, normalParameters, optionalParameters);
+
+  static FunctionElementImpl functionElement7(
+          String functionName,
+          List<ClassElement> normalParameters,
+          List<String> names,
+          List<ClassElement> namedParameters) =>
+      functionElement4(
+          functionName, null, normalParameters, names, namedParameters);
+
+  static FunctionElementImpl functionElementWithParameters(String functionName,
+      DartType returnType, List<ParameterElement> parameters) {
+    FunctionElementImpl functionElement =
+        new FunctionElementImpl(functionName, 0);
+    functionElement.returnType =
+        returnType == null ? VoidTypeImpl.instance : returnType;
+    functionElement.parameters = parameters;
+    FunctionTypeImpl functionType = new FunctionTypeImpl(functionElement);
+    functionElement.type = functionType;
+    return functionElement;
+  }
+
+  static FunctionTypeAliasElementImpl functionTypeAliasElement(String name) {
+    FunctionTypeAliasElementImpl functionTypeAliasElement =
+        new FunctionTypeAliasElementImpl(name, -1);
+    functionTypeAliasElement.type =
+        new FunctionTypeImpl.forTypedef(functionTypeAliasElement);
+    return functionTypeAliasElement;
+  }
+
+  static PropertyAccessorElementImpl getterElement(
+      String name, bool isStatic, DartType type) {
+    FieldElementImpl field = new FieldElementImpl(name, -1);
+    field.static = isStatic;
+    field.synthetic = true;
+    field.type = type;
+    PropertyAccessorElementImpl getter =
+        new PropertyAccessorElementImpl.forVariable(field);
+    getter.getter = true;
+    getter.variable = field;
+    getter.returnType = type;
+    field.getter = getter;
+    FunctionTypeImpl getterType = new FunctionTypeImpl(getter);
+    getter.type = getterType;
+    return getter;
+  }
+
+  @deprecated
+  static HtmlElementImpl htmlUnit(AnalysisContext context, String fileName) {
+    Source source =
+        new NonExistingSource(fileName, toUri(fileName), UriKind.FILE_URI);
+    HtmlElementImpl unit = new HtmlElementImpl(context, fileName);
+    unit.source = source;
+    return unit;
+  }
+
+  static ImportElementImpl importFor(
+      LibraryElement importedLibrary, PrefixElement prefix,
+      [List<NamespaceCombinator> combinators =
+          NamespaceCombinator.EMPTY_LIST]) {
+    ImportElementImpl spec = new ImportElementImpl(0);
+    spec.importedLibrary = importedLibrary;
+    spec.prefix = prefix;
+    spec.combinators = combinators;
+    return spec;
+  }
+
+  static LibraryElementImpl library(
+      AnalysisContext context, String libraryName) {
+    String fileName = "/$libraryName.dart";
+    CompilationUnitElementImpl unit = compilationUnit(fileName);
+    LibraryElementImpl library =
+        new LibraryElementImpl(context, libraryName, 0);
+    library.definingCompilationUnit = unit;
+    return library;
+  }
+
+  static LocalVariableElementImpl localVariableElement(Identifier name) =>
+      new LocalVariableElementImpl.forNode(name);
+
+  static LocalVariableElementImpl localVariableElement2(String name) =>
+      new LocalVariableElementImpl(name, 0);
+
+  static MethodElementImpl methodElement(String methodName, DartType returnType,
+      [List<DartType> argumentTypes]) {
+    MethodElementImpl method = new MethodElementImpl(methodName, 0);
+    if (argumentTypes == null) {
+      method.parameters = ParameterElement.EMPTY_LIST;
+    } else {
+      int count = argumentTypes.length;
+      List<ParameterElement> parameters = new List<ParameterElement>(count);
+      for (int i = 0; i < count; i++) {
+        ParameterElementImpl parameter = new ParameterElementImpl("a$i", i);
+        parameter.type = argumentTypes[i];
+        parameter.parameterKind = ParameterKind.REQUIRED;
+        parameters[i] = parameter;
+      }
+      method.parameters = parameters;
+    }
+    method.returnType = returnType;
+    FunctionTypeImpl methodType = new FunctionTypeImpl(method);
+    method.type = methodType;
+    return method;
+  }
+
+  static MethodElementImpl methodElementWithParameters(
+      String methodName,
+      List<DartType> typeArguments,
+      DartType returnType,
+      List<ParameterElement> parameters) {
+    MethodElementImpl method = new MethodElementImpl(methodName, 0);
+    method.parameters = parameters;
+    method.returnType = returnType;
+    FunctionTypeImpl methodType = new FunctionTypeImpl(method);
+    methodType.typeArguments = typeArguments;
+    method.type = methodType;
+    return method;
+  }
+
+  static ParameterElementImpl namedParameter(String name) {
+    ParameterElementImpl parameter = new ParameterElementImpl(name, 0);
+    parameter.parameterKind = ParameterKind.NAMED;
+    return parameter;
+  }
+
+  static ParameterElementImpl namedParameter2(String name, DartType type) {
+    ParameterElementImpl parameter = new ParameterElementImpl(name, 0);
+    parameter.parameterKind = ParameterKind.NAMED;
+    parameter.type = type;
+    return parameter;
+  }
+
+  static ParameterElementImpl positionalParameter(String name) {
+    ParameterElementImpl parameter = new ParameterElementImpl(name, 0);
+    parameter.parameterKind = ParameterKind.POSITIONAL;
+    return parameter;
+  }
+
+  static ParameterElementImpl positionalParameter2(String name, DartType type) {
+    ParameterElementImpl parameter = new ParameterElementImpl(name, 0);
+    parameter.parameterKind = ParameterKind.POSITIONAL;
+    parameter.type = type;
+    return parameter;
+  }
+
+  static PrefixElementImpl prefix(String name) =>
+      new PrefixElementImpl(name, 0);
+
+  static ParameterElementImpl requiredParameter(String name) {
+    ParameterElementImpl parameter = new ParameterElementImpl(name, 0);
+    parameter.parameterKind = ParameterKind.REQUIRED;
+    return parameter;
+  }
+
+  static ParameterElementImpl requiredParameter2(String name, DartType type) {
+    ParameterElementImpl parameter = new ParameterElementImpl(name, 0);
+    parameter.parameterKind = ParameterKind.REQUIRED;
+    parameter.type = type;
+    return parameter;
+  }
+
+  static PropertyAccessorElementImpl setterElement(
+      String name, bool isStatic, DartType type) {
+    FieldElementImpl field = new FieldElementImpl(name, -1);
+    field.static = isStatic;
+    field.synthetic = true;
+    field.type = type;
+    PropertyAccessorElementImpl getter =
+        new PropertyAccessorElementImpl.forVariable(field);
+    getter.getter = true;
+    getter.variable = field;
+    getter.returnType = type;
+    field.getter = getter;
+    FunctionTypeImpl getterType = new FunctionTypeImpl(getter);
+    getter.type = getterType;
+    ParameterElementImpl parameter = requiredParameter2("a", type);
+    PropertyAccessorElementImpl setter =
+        new PropertyAccessorElementImpl.forVariable(field);
+    setter.setter = true;
+    setter.synthetic = true;
+    setter.variable = field;
+    setter.parameters = <ParameterElement>[parameter];
+    setter.returnType = VoidTypeImpl.instance;
+    setter.type = new FunctionTypeImpl(setter);
+    field.setter = setter;
+    return setter;
+  }
+
+  static TopLevelVariableElementImpl topLevelVariableElement(Identifier name) =>
+      new TopLevelVariableElementImpl.forNode(name);
+
+  static TopLevelVariableElementImpl topLevelVariableElement2(String name) =>
+      topLevelVariableElement3(name, false, false, null);
+
+  static TopLevelVariableElementImpl topLevelVariableElement3(
+      String name, bool isConst, bool isFinal, DartType type) {
+    TopLevelVariableElementImpl variable;
+    if (isConst) {
+      ConstTopLevelVariableElementImpl constant =
+          new ConstTopLevelVariableElementImpl(AstFactory.identifier3(name));
+      constant.constantInitializer = AstFactory.instanceCreationExpression2(
+          Keyword.CONST, AstFactory.typeName(type.element));
+      variable = constant;
+    } else {
+      variable = new TopLevelVariableElementImpl(name, -1);
+    }
+    variable.const3 = isConst;
+    variable.final2 = isFinal;
+    variable.synthetic = true;
+    PropertyAccessorElementImpl getter =
+        new PropertyAccessorElementImpl.forVariable(variable);
+    getter.getter = true;
+    getter.synthetic = true;
+    getter.variable = variable;
+    getter.returnType = type;
+    variable.getter = getter;
+    FunctionTypeImpl getterType = new FunctionTypeImpl(getter);
+    getter.type = getterType;
+    if (!isConst && !isFinal) {
+      PropertyAccessorElementImpl setter =
+          new PropertyAccessorElementImpl.forVariable(variable);
+      setter.setter = true;
+      setter.static = true;
+      setter.synthetic = true;
+      setter.variable = variable;
+      setter.parameters = <ParameterElement>[
+        requiredParameter2("_$name", type)
+      ];
+      setter.returnType = VoidTypeImpl.instance;
+      setter.type = new FunctionTypeImpl(setter);
+      variable.setter = setter;
+    }
+    return variable;
+  }
+
+  static TypeParameterElementImpl typeParameterElement(String name) {
+    TypeParameterElementImpl element = new TypeParameterElementImpl(name, 0);
+    element.type = new TypeParameterTypeImpl(element);
+    return element;
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/testing/html_factory.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/testing/html_factory.dart
new file mode 100644
index 0000000..a9ac412
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/testing/html_factory.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.testing.html_factory;
+
+import 'package:analyzer/src/generated/html.dart';
+
+/**
+ * Utility methods to create HTML nodes.
+ */
+@deprecated
+class HtmlFactory {
+  static XmlAttributeNode attribute(String name, String value) {
+    Token nameToken = stringToken(name);
+    Token equalsToken = new Token.con1(TokenType.EQ, 0);
+    Token valueToken = stringToken(value);
+    return new XmlAttributeNode(nameToken, equalsToken, valueToken);
+  }
+
+  static Token gtToken() {
+    return new Token.con1(TokenType.GT, 0);
+  }
+
+  static Token ltsToken() {
+    return new Token.con1(TokenType.LT_SLASH, 0);
+  }
+
+  static Token ltToken() {
+    return new Token.con1(TokenType.LT, 0);
+  }
+
+  static HtmlScriptTagNode scriptTag(
+      [List<XmlAttributeNode> attributes = XmlAttributeNode.EMPTY_LIST]) {
+    return new HtmlScriptTagNode(ltToken(), stringToken("script"), attributes,
+        sgtToken(), null, null, null, null);
+  }
+
+  static HtmlScriptTagNode scriptTagWithContent(String contents,
+      [List<XmlAttributeNode> attributes = XmlAttributeNode.EMPTY_LIST]) {
+    Token attributeEnd = gtToken();
+    Token contentToken = stringToken(contents);
+    attributeEnd.setNext(contentToken);
+    Token contentEnd = ltsToken();
+    contentToken.setNext(contentEnd);
+    return new HtmlScriptTagNode(ltToken(), stringToken("script"), attributes,
+        attributeEnd, null, contentEnd, stringToken("script"), gtToken());
+  }
+
+  static Token sgtToken() {
+    return new Token.con1(TokenType.SLASH_GT, 0);
+  }
+
+  static Token stringToken(String value) {
+    return new Token.con2(TokenType.STRING, 0, value);
+  }
+
+  static XmlTagNode tagNode(String name,
+      [List<XmlAttributeNode> attributes = XmlAttributeNode.EMPTY_LIST]) {
+    return new XmlTagNode(ltToken(), stringToken(name), attributes, sgtToken(),
+        null, null, null, null);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/testing/test_type_provider.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/testing/test_type_provider.dart
new file mode 100644
index 0000000..d0d9c00
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/testing/test_type_provider.dart
@@ -0,0 +1,628 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.testing.test_type_provider;
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/constant.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/testing/ast_factory.dart';
+import 'package:analyzer/src/generated/testing/element_factory.dart';
+
+/**
+ * A type provider that can be used by tests without creating the element model
+ * for the core library.
+ */
+class TestTypeProvider implements TypeProvider {
+  /**
+   * The type representing the built-in type 'bool'.
+   */
+  InterfaceType _boolType;
+
+  /**
+   * The type representing the type 'bottom'.
+   */
+  DartType _bottomType;
+
+  /**
+   * The type representing the built-in type 'double'.
+   */
+  InterfaceType _doubleType;
+
+  /**
+   * The type representing the built-in type 'deprecated'.
+   */
+  InterfaceType _deprecatedType;
+
+  /**
+   * The type representing the built-in type 'dynamic'.
+   */
+  DartType _dynamicType;
+
+  /**
+   * The type representing the built-in type 'Function'.
+   */
+  InterfaceType _functionType;
+
+  /**
+   * The type representing 'Future<dynamic>'
+   */
+  InterfaceType _futureDynamicType;
+
+  /**
+   * The type representing 'Future<Null>'
+   */
+  InterfaceType _futureNullType;
+
+  /**
+   * The type representing the built-in type 'Future'
+   */
+  InterfaceType _futureType;
+
+  /**
+   * The type representing the built-in type 'int'.
+   */
+  InterfaceType _intType;
+
+  /**
+   * The type representing 'Iterable<dynamic>'
+   */
+  InterfaceType _iterableDynamicType;
+
+  /**
+   * The type representing the built-in type 'Iterable'.
+   */
+  InterfaceType _iterableType;
+
+  /**
+   * The type representing the built-in type 'Iterator'.
+   */
+  InterfaceType _iteratorType;
+
+  /**
+   * The type representing the built-in type 'List'.
+   */
+  InterfaceType _listType;
+
+  /**
+   * The type representing the built-in type 'Map'.
+   */
+  InterfaceType _mapType;
+
+  /**
+   * An shared object representing the value 'null'.
+   */
+  DartObjectImpl _nullObject;
+
+  /**
+   * The type representing the built-in type 'Null'.
+   */
+  InterfaceType _nullType;
+
+  /**
+   * The type representing the built-in type 'num'.
+   */
+  InterfaceType _numType;
+
+  /**
+   * The type representing the built-in type 'Object'.
+   */
+  InterfaceType _objectType;
+
+  /**
+   * The type representing the built-in type 'StackTrace'.
+   */
+  InterfaceType _stackTraceType;
+
+  /**
+   * The type representing 'Stream<dynamic>'.
+   */
+  InterfaceType _streamDynamicType;
+
+  /**
+   * The type representing the built-in type 'Stream'.
+   */
+  InterfaceType _streamType;
+
+  /**
+   * The type representing the built-in type 'String'.
+   */
+  InterfaceType _stringType;
+
+  /**
+   * The type representing the built-in type 'Symbol'.
+   */
+  InterfaceType _symbolType;
+
+  /**
+   * The type representing the built-in type 'Type'.
+   */
+  InterfaceType _typeType;
+
+  /**
+   * The type representing typenames that can't be resolved.
+   */
+  DartType _undefinedType;
+
+  @override
+  InterfaceType get boolType {
+    if (_boolType == null) {
+      ClassElementImpl boolElement = ElementFactory.classElement2("bool");
+      _boolType = boolElement.type;
+      ConstructorElementImpl fromEnvironment = ElementFactory
+          .constructorElement(boolElement, "fromEnvironment", true);
+      fromEnvironment.parameters = <ParameterElement>[
+        ElementFactory.requiredParameter2("name", stringType),
+        ElementFactory.namedParameter2("defaultValue", _boolType)
+      ];
+      fromEnvironment.factory = true;
+      fromEnvironment.isCycleFree = true;
+      boolElement.constructors = <ConstructorElement>[fromEnvironment];
+    }
+    return _boolType;
+  }
+
+  @override
+  DartType get bottomType {
+    if (_bottomType == null) {
+      _bottomType = BottomTypeImpl.instance;
+    }
+    return _bottomType;
+  }
+
+  @override
+  InterfaceType get deprecatedType {
+    if (_deprecatedType == null) {
+      ClassElementImpl deprecatedElement =
+          ElementFactory.classElement2("Deprecated");
+      ConstructorElementImpl constructor = ElementFactory.constructorElement(
+          deprecatedElement, null, true, [stringType]);
+      constructor.constantInitializers = <ConstructorInitializer>[
+        AstFactory.constructorFieldInitializer(
+            true, 'expires', AstFactory.identifier3('expires'))
+      ];
+      deprecatedElement.constructors = <ConstructorElement>[constructor];
+      _deprecatedType = deprecatedElement.type;
+    }
+    return _deprecatedType;
+  }
+
+  @override
+  InterfaceType get doubleType {
+    if (_doubleType == null) {
+      _initializeNumericTypes();
+    }
+    return _doubleType;
+  }
+
+  @override
+  DartType get dynamicType {
+    if (_dynamicType == null) {
+      _dynamicType = DynamicTypeImpl.instance;
+    }
+    return _dynamicType;
+  }
+
+  @override
+  InterfaceType get functionType {
+    if (_functionType == null) {
+      _functionType = ElementFactory.classElement2("Function").type;
+    }
+    return _functionType;
+  }
+
+  @override
+  InterfaceType get futureDynamicType {
+    if (_futureDynamicType == null) {
+      _futureDynamicType = futureType.substitute4(<DartType>[dynamicType]);
+    }
+    return _futureDynamicType;
+  }
+
+  @override
+  InterfaceType get futureNullType {
+    if (_futureNullType == null) {
+      _futureNullType = futureType.substitute4(<DartType>[nullType]);
+    }
+    return _futureNullType;
+  }
+
+  @override
+  InterfaceType get futureType {
+    if (_futureType == null) {
+      _futureType = ElementFactory.classElement2("Future", ["T"]).type;
+    }
+    return _futureType;
+  }
+
+  @override
+  InterfaceType get intType {
+    if (_intType == null) {
+      _initializeNumericTypes();
+    }
+    return _intType;
+  }
+
+  @override
+  InterfaceType get iterableDynamicType {
+    if (_iterableDynamicType == null) {
+      _iterableDynamicType = iterableType.substitute4(<DartType>[dynamicType]);
+    }
+    return _iterableDynamicType;
+  }
+
+  @override
+  InterfaceType get iterableType {
+    if (_iterableType == null) {
+      ClassElementImpl iterableElement =
+          ElementFactory.classElement2("Iterable", ["E"]);
+      _iterableType = iterableElement.type;
+      DartType eType = iterableElement.typeParameters[0].type;
+      _setAccessors(iterableElement, <PropertyAccessorElement>[
+        ElementFactory.getterElement(
+            "iterator", false, iteratorType.substitute4(<DartType>[eType])),
+        ElementFactory.getterElement("last", false, eType)
+      ]);
+      iterableElement.constructors = ConstructorElement.EMPTY_LIST;
+      _propagateTypeArguments(iterableElement);
+    }
+    return _iterableType;
+  }
+
+  InterfaceType get iteratorType {
+    if (_iteratorType == null) {
+      ClassElementImpl iteratorElement =
+          ElementFactory.classElement2("Iterator", ["E"]);
+      _iteratorType = iteratorElement.type;
+      DartType eType = iteratorElement.typeParameters[0].type;
+      _setAccessors(iteratorElement, <PropertyAccessorElement>[
+        ElementFactory.getterElement("current", false, eType)
+      ]);
+      iteratorElement.constructors = ConstructorElement.EMPTY_LIST;
+      _propagateTypeArguments(iteratorElement);
+    }
+    return _iteratorType;
+  }
+
+  @override
+  InterfaceType get listType {
+    if (_listType == null) {
+      ClassElementImpl listElement =
+          ElementFactory.classElement2("List", ["E"]);
+      listElement.constructors = <ConstructorElement>[
+        ElementFactory.constructorElement2(listElement, null)
+      ];
+      _listType = listElement.type;
+      DartType eType = listElement.typeParameters[0].type;
+      InterfaceType iterableType =
+          this.iterableType.substitute4(<DartType>[eType]);
+      listElement.interfaces = <InterfaceType>[iterableType];
+      _setAccessors(listElement, <PropertyAccessorElement>[
+        ElementFactory.getterElement("length", false, intType)
+      ]);
+      listElement.methods = <MethodElement>[
+        ElementFactory.methodElement("[]", eType, [intType]),
+        ElementFactory.methodElement(
+            "[]=", VoidTypeImpl.instance, [intType, eType]),
+        ElementFactory.methodElement("add", VoidTypeImpl.instance, [eType])
+      ];
+      _propagateTypeArguments(listElement);
+    }
+    return _listType;
+  }
+
+  @override
+  InterfaceType get mapType {
+    if (_mapType == null) {
+      ClassElementImpl mapElement =
+          ElementFactory.classElement2("Map", ["K", "V"]);
+      _mapType = mapElement.type;
+      DartType kType = mapElement.typeParameters[0].type;
+      DartType vType = mapElement.typeParameters[1].type;
+      _setAccessors(mapElement, <PropertyAccessorElement>[
+        ElementFactory.getterElement("length", false, intType)
+      ]);
+      mapElement.methods = <MethodElement>[
+        ElementFactory.methodElement("[]", vType, [objectType]),
+        ElementFactory.methodElement(
+            "[]=", VoidTypeImpl.instance, [kType, vType])
+      ];
+      mapElement.constructors = ConstructorElement.EMPTY_LIST;
+      _propagateTypeArguments(mapElement);
+    }
+    return _mapType;
+  }
+
+  @override
+  List<InterfaceType> get nonSubtypableTypes => <InterfaceType>[
+    nullType,
+    numType,
+    intType,
+    doubleType,
+    boolType,
+    stringType
+  ];
+
+  @override
+  DartObjectImpl get nullObject {
+    if (_nullObject == null) {
+      _nullObject = new DartObjectImpl(nullType, NullState.NULL_STATE);
+    }
+    return _nullObject;
+  }
+
+  @override
+  InterfaceType get nullType {
+    if (_nullType == null) {
+      ClassElementImpl nullElement = ElementFactory.classElement2("Null");
+      nullElement.constructors = ConstructorElement.EMPTY_LIST;
+      _nullType = nullElement.type;
+    }
+    return _nullType;
+  }
+
+  @override
+  InterfaceType get numType {
+    if (_numType == null) {
+      _initializeNumericTypes();
+    }
+    return _numType;
+  }
+
+  @override
+  InterfaceType get objectType {
+    if (_objectType == null) {
+      ClassElementImpl objectElement = ElementFactory.object;
+      _objectType = objectElement.type;
+      ConstructorElementImpl constructor =
+          ElementFactory.constructorElement(objectElement, null, true);
+      constructor.constantInitializers = <ConstructorInitializer>[];
+      objectElement.constructors = <ConstructorElement>[constructor];
+      objectElement.methods = <MethodElement>[
+        ElementFactory.methodElement("toString", stringType),
+        ElementFactory.methodElement("==", boolType, [_objectType]),
+        ElementFactory.methodElement("noSuchMethod", dynamicType, [dynamicType])
+      ];
+      _setAccessors(objectElement, <PropertyAccessorElement>[
+        ElementFactory.getterElement("hashCode", false, intType),
+        ElementFactory.getterElement("runtimeType", false, typeType)
+      ]);
+    }
+    return _objectType;
+  }
+
+  @override
+  InterfaceType get stackTraceType {
+    if (_stackTraceType == null) {
+      _stackTraceType = ElementFactory.classElement2("StackTrace").type;
+    }
+    return _stackTraceType;
+  }
+
+  @override
+  InterfaceType get streamDynamicType {
+    if (_streamDynamicType == null) {
+      _streamDynamicType = streamType.substitute4(<DartType>[dynamicType]);
+    }
+    return _streamDynamicType;
+  }
+
+  @override
+  InterfaceType get streamType {
+    if (_streamType == null) {
+      _streamType = ElementFactory.classElement2("Stream", ["T"]).type;
+    }
+    return _streamType;
+  }
+
+  @override
+  InterfaceType get stringType {
+    if (_stringType == null) {
+      _stringType = ElementFactory.classElement2("String").type;
+      ClassElementImpl stringElement = _stringType.element as ClassElementImpl;
+      _setAccessors(stringElement, <PropertyAccessorElement>[
+        ElementFactory.getterElement("isEmpty", false, boolType),
+        ElementFactory.getterElement("length", false, intType),
+        ElementFactory.getterElement(
+            "codeUnits", false, listType.substitute4(<DartType>[intType]))
+      ]);
+      stringElement.methods = <MethodElement>[
+        ElementFactory.methodElement("+", _stringType, [_stringType]),
+        ElementFactory.methodElement("toLowerCase", _stringType),
+        ElementFactory.methodElement("toUpperCase", _stringType)
+      ];
+      ConstructorElementImpl fromEnvironment = ElementFactory
+          .constructorElement(stringElement, "fromEnvironment", true);
+      fromEnvironment.parameters = <ParameterElement>[
+        ElementFactory.requiredParameter2("name", stringType),
+        ElementFactory.namedParameter2("defaultValue", _stringType)
+      ];
+      fromEnvironment.factory = true;
+      fromEnvironment.isCycleFree = true;
+      stringElement.constructors = <ConstructorElement>[fromEnvironment];
+    }
+    return _stringType;
+  }
+
+  @override
+  InterfaceType get symbolType {
+    if (_symbolType == null) {
+      ClassElementImpl symbolClass = ElementFactory.classElement2("Symbol");
+      ConstructorElementImpl constructor = ElementFactory.constructorElement(
+          symbolClass, null, true, [stringType]);
+      constructor.factory = true;
+      constructor.isCycleFree = true;
+      symbolClass.constructors = <ConstructorElement>[constructor];
+      _symbolType = symbolClass.type;
+    }
+    return _symbolType;
+  }
+
+  @override
+  InterfaceType get typeType {
+    if (_typeType == null) {
+      _typeType = ElementFactory.classElement2("Type").type;
+    }
+    return _typeType;
+  }
+
+  @override
+  DartType get undefinedType {
+    if (_undefinedType == null) {
+      _undefinedType = UndefinedTypeImpl.instance;
+    }
+    return _undefinedType;
+  }
+
+  /**
+   * Initialize the numeric types. They are created as a group so that we can
+   * (a) create the right hierarchy and (b) add members to them.
+   */
+  void _initializeNumericTypes() {
+    //
+    // Create the type hierarchy.
+    //
+    ClassElementImpl numElement = ElementFactory.classElement2("num");
+    _numType = numElement.type;
+    ClassElementImpl intElement = ElementFactory.classElement("int", _numType);
+    _intType = intElement.type;
+    ClassElementImpl doubleElement =
+        ElementFactory.classElement("double", _numType);
+    _doubleType = doubleElement.type;
+    //
+    // Force the referenced types to be cached.
+    //
+    objectType;
+    boolType;
+    stringType;
+    //
+    // Add the methods.
+    //
+    numElement.methods = <MethodElement>[
+      ElementFactory.methodElement("+", _numType, [_numType]),
+      ElementFactory.methodElement("-", _numType, [_numType]),
+      ElementFactory.methodElement("*", _numType, [_numType]),
+      ElementFactory.methodElement("%", _numType, [_numType]),
+      ElementFactory.methodElement("/", _doubleType, [_numType]),
+      ElementFactory.methodElement("~/", _numType, [_numType]),
+      ElementFactory.methodElement("-", _numType),
+      ElementFactory.methodElement("remainder", _numType, [_numType]),
+      ElementFactory.methodElement("<", _boolType, [_numType]),
+      ElementFactory.methodElement("<=", _boolType, [_numType]),
+      ElementFactory.methodElement(">", _boolType, [_numType]),
+      ElementFactory.methodElement(">=", _boolType, [_numType]),
+      ElementFactory.methodElement("==", _boolType, [_objectType]),
+      ElementFactory.methodElement("isNaN", _boolType),
+      ElementFactory.methodElement("isNegative", _boolType),
+      ElementFactory.methodElement("isInfinite", _boolType),
+      ElementFactory.methodElement("abs", _numType),
+      ElementFactory.methodElement("floor", _numType),
+      ElementFactory.methodElement("ceil", _numType),
+      ElementFactory.methodElement("round", _numType),
+      ElementFactory.methodElement("truncate", _numType),
+      ElementFactory.methodElement("toInt", _intType),
+      ElementFactory.methodElement("toDouble", _doubleType),
+      ElementFactory.methodElement("toStringAsFixed", _stringType, [_intType]),
+      ElementFactory.methodElement(
+          "toStringAsExponential", _stringType, [_intType]),
+      ElementFactory.methodElement(
+          "toStringAsPrecision", _stringType, [_intType]),
+      ElementFactory.methodElement("toRadixString", _stringType, [_intType])
+    ];
+    intElement.methods = <MethodElement>[
+      ElementFactory.methodElement("&", _intType, [_intType]),
+      ElementFactory.methodElement("|", _intType, [_intType]),
+      ElementFactory.methodElement("^", _intType, [_intType]),
+      ElementFactory.methodElement("~", _intType),
+      ElementFactory.methodElement("<<", _intType, [_intType]),
+      ElementFactory.methodElement(">>", _intType, [_intType]),
+      ElementFactory.methodElement("-", _intType),
+      ElementFactory.methodElement("abs", _intType),
+      ElementFactory.methodElement("round", _intType),
+      ElementFactory.methodElement("floor", _intType),
+      ElementFactory.methodElement("ceil", _intType),
+      ElementFactory.methodElement("truncate", _intType),
+      ElementFactory.methodElement("toString", _stringType)
+    ];
+    ConstructorElementImpl fromEnvironment =
+        ElementFactory.constructorElement(intElement, "fromEnvironment", true);
+    fromEnvironment.parameters = <ParameterElement>[
+      ElementFactory.requiredParameter2("name", stringType),
+      ElementFactory.namedParameter2("defaultValue", _intType)
+    ];
+    fromEnvironment.factory = true;
+    fromEnvironment.isCycleFree = true;
+    numElement.constructors = ConstructorElement.EMPTY_LIST;
+    intElement.constructors = <ConstructorElement>[fromEnvironment];
+    doubleElement.constructors = ConstructorElement.EMPTY_LIST;
+    List<FieldElement> fields = <FieldElement>[
+      ElementFactory.fieldElement("NAN", true, false, true, _doubleType),
+      ElementFactory.fieldElement("INFINITY", true, false, true, _doubleType),
+      ElementFactory.fieldElement(
+          "NEGATIVE_INFINITY", true, false, true, _doubleType),
+      ElementFactory.fieldElement(
+          "MIN_POSITIVE", true, false, true, _doubleType),
+      ElementFactory.fieldElement("MAX_FINITE", true, false, true, _doubleType)
+    ];
+    doubleElement.fields = fields;
+    int fieldCount = fields.length;
+    List<PropertyAccessorElement> accessors =
+        new List<PropertyAccessorElement>(fieldCount);
+    for (int i = 0; i < fieldCount; i++) {
+      accessors[i] = fields[i].getter;
+    }
+    doubleElement.accessors = accessors;
+    doubleElement.methods = <MethodElement>[
+      ElementFactory.methodElement("remainder", _doubleType, [_numType]),
+      ElementFactory.methodElement("+", _doubleType, [_numType]),
+      ElementFactory.methodElement("-", _doubleType, [_numType]),
+      ElementFactory.methodElement("*", _doubleType, [_numType]),
+      ElementFactory.methodElement("%", _doubleType, [_numType]),
+      ElementFactory.methodElement("/", _doubleType, [_numType]),
+      ElementFactory.methodElement("~/", _doubleType, [_numType]),
+      ElementFactory.methodElement("-", _doubleType),
+      ElementFactory.methodElement("abs", _doubleType),
+      ElementFactory.methodElement("round", _doubleType),
+      ElementFactory.methodElement("floor", _doubleType),
+      ElementFactory.methodElement("ceil", _doubleType),
+      ElementFactory.methodElement("truncate", _doubleType),
+      ElementFactory.methodElement("toString", _stringType)
+    ];
+  }
+
+  /**
+   * Given a [classElement] representing a class with type parameters, propagate
+   * those type parameters to all of the accessors, methods and constructors
+   * defined for the class.
+   */
+  void _propagateTypeArguments(ClassElementImpl classElement) {
+    List<DartType> typeArguments =
+        TypeParameterTypeImpl.getTypes(classElement.typeParameters);
+    for (PropertyAccessorElement accessor in classElement.accessors) {
+      FunctionTypeImpl functionType = accessor.type as FunctionTypeImpl;
+      functionType.typeArguments = typeArguments;
+    }
+    for (MethodElement method in classElement.methods) {
+      FunctionTypeImpl functionType = method.type as FunctionTypeImpl;
+      functionType.typeArguments = typeArguments;
+    }
+    for (ConstructorElement constructor in classElement.constructors) {
+      FunctionTypeImpl functionType = constructor.type as FunctionTypeImpl;
+      functionType.typeArguments = typeArguments;
+    }
+  }
+
+  /**
+   * Set the accessors for the given class [element] to the given [accessors]
+   * and also set the fields to those that correspond to the accessors.
+   */
+  void _setAccessors(
+      ClassElementImpl element, List<PropertyAccessorElement> accessors) {
+    element.accessors = accessors;
+    element.fields = accessors
+        .map((PropertyAccessorElement accessor) => accessor.variable)
+        .toList();
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/testing/token_factory.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/testing/token_factory.dart
new file mode 100644
index 0000000..1b9a828
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/testing/token_factory.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.testing.token_factory;
+
+import 'package:analyzer/src/generated/scanner.dart';
+
+/**
+ * A set of utility methods that can be used to create tokens.
+ */
+class TokenFactory {
+  static Token tokenFromKeyword(Keyword keyword) =>
+      new KeywordToken(keyword, 0);
+
+  static Token tokenFromString(String lexeme) =>
+      new StringToken(TokenType.STRING, lexeme, 0);
+
+  static Token tokenFromType(TokenType type) => new Token(type, 0);
+
+  static Token tokenFromTypeAndString(TokenType type, String lexeme) =>
+      new StringToken(type, lexeme, 0);
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/utilities_collection.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/utilities_collection.dart
new file mode 100644
index 0000000..0d2afe8
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/utilities_collection.dart
@@ -0,0 +1,743 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.utilities.collection;
+
+import "dart:math" as math;
+import 'dart:collection';
+
+import 'java_core.dart';
+import 'scanner.dart' show Token;
+
+/**
+ * The class `BooleanArray` defines methods for operating on integers as if they were arrays
+ * of booleans. These arrays can be indexed by either integers or by enumeration constants.
+ */
+class BooleanArray {
+  /**
+   * Return the value of the element at the given index.
+   *
+   * @param array the array being accessed
+   * @param index the index of the element being accessed
+   * @return the value of the element at the given index
+   * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive
+   */
+  static bool get(int array, int index) {
+    _checkIndex(index);
+    return (array & (1 << index)) > 0;
+  }
+
+  /**
+   * Return the value of the element at the given index.
+   *
+   * @param array the array being accessed
+   * @param index the index of the element being accessed
+   * @return the value of the element at the given index
+   * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive
+   */
+  static bool getEnum(int array, Enum index) => get(array, index.ordinal);
+
+  /**
+   * Set the value of the element at the given index to the given value.
+   *
+   * @param array the array being modified
+   * @param index the index of the element being set
+   * @param value the value to be assigned to the element
+   * @return the updated value of the array
+   * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive
+   */
+  static int set(int array, int index, bool value) {
+    _checkIndex(index);
+    if (value) {
+      return array | (1 << index);
+    } else {
+      return array & ~(1 << index);
+    }
+  }
+
+  /**
+   * Set the value of the element at the given index to the given value.
+   *
+   * @param array the array being modified
+   * @param index the index of the element being set
+   * @param value the value to be assigned to the element
+   * @return the updated value of the array
+   * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive
+   */
+  static int setEnum(int array, Enum index, bool value) =>
+      set(array, index.ordinal, value);
+
+  /**
+   * Throw an exception if the index is not within the bounds allowed for an integer-encoded array
+   * of boolean values.
+   *
+   * @throws IndexOutOfBoundsException if the index is not between zero (0) and 31, inclusive
+   */
+  static void _checkIndex(int index) {
+    if (index < 0 || index > 30) {
+      throw new RangeError("Index not between 0 and 30: $index");
+    }
+  }
+}
+
+/**
+ * Instances of the class `DirectedGraph` implement a directed graph in which the nodes are
+ * arbitrary (client provided) objects and edges are represented implicitly. The graph will allow an
+ * edge from any node to any other node, including itself, but will not represent multiple edges
+ * between the same pair of nodes.
+ *
+ * @param N the type of the nodes in the graph
+ */
+class DirectedGraph<N> {
+  /**
+   * The table encoding the edges in the graph. An edge is represented by an entry mapping the head
+   * to a set of tails. Nodes that are not the head of any edge are represented by an entry mapping
+   * the node to an empty set of tails.
+   */
+  HashMap<N, HashSet<N>> _edges = new HashMap<N, HashSet<N>>();
+
+  /**
+   * Return `true` if this graph is empty.
+   *
+   * @return `true` if this graph is empty
+   */
+  bool get isEmpty => _edges.isEmpty;
+
+  /**
+   * Return the number of nodes in this graph.
+   *
+   * @return the number of nodes in this graph
+   */
+  int get nodeCount => _edges.length;
+
+  /**
+   * Return a set of all nodes in the graph.
+   */
+  Set<N> get nodes => _edges.keys.toSet();
+
+  /**
+   * Add an edge from the given head node to the given tail node. Both nodes will be a part of the
+   * graph after this method is invoked, whether or not they were before.
+   *
+   * @param head the node at the head of the edge
+   * @param tail the node at the tail of the edge
+   */
+  void addEdge(N head, N tail) {
+    //
+    // First, ensure that the tail is a node known to the graph.
+    //
+    if (_edges[tail] == null) {
+      _edges[tail] = new HashSet<N>();
+    }
+    //
+    // Then create the edge.
+    //
+    HashSet<N> tails = _edges[head];
+    if (tails == null) {
+      tails = new HashSet<N>();
+      _edges[head] = tails;
+    }
+    tails.add(tail);
+  }
+
+  /**
+   * Add the given node to the set of nodes in the graph.
+   *
+   * @param node the node to be added
+   */
+  void addNode(N node) {
+    HashSet<N> tails = _edges[node];
+    if (tails == null) {
+      _edges[node] = new HashSet<N>();
+    }
+  }
+
+  /**
+   * Run a topological sort of the graph. Since the graph may contain cycles, this results in a list
+   * of strongly connected components rather than a list of nodes. The nodes in each strongly
+   * connected components only have edges that point to nodes in the same component or earlier
+   * components.
+   */
+  List<List<N>> computeTopologicalSort() {
+    DirectedGraph_SccFinder<N> finder = new DirectedGraph_SccFinder<N>(this);
+    return finder.computeTopologicalSort();
+  }
+
+  /**
+   * Return true if the graph contains at least one path from `source` to `destination`.
+   */
+  bool containsPath(N source, N destination) {
+    HashSet<N> nodesVisited = new HashSet<N>();
+    return _containsPathInternal(source, destination, nodesVisited);
+  }
+
+  /**
+   * Return a list of nodes that form a cycle containing the given node. If the node is not part of
+   * this graph, then a list containing only the node itself will be returned.
+   *
+   * @return a list of nodes that form a cycle containing the given node
+   */
+  List<N> findCycleContaining(N node) {
+    if (node == null) {
+      throw new IllegalArgumentException();
+    }
+    DirectedGraph_SccFinder<N> finder = new DirectedGraph_SccFinder<N>(this);
+    return finder.componentContaining(node);
+  }
+
+  /**
+   * Return a set containing the tails of edges that have the given node as their head. The set will
+   * be empty if there are no such edges or if the node is not part of the graph. Clients must not
+   * modify the returned set.
+   *
+   * @param head the node at the head of all of the edges whose tails are to be returned
+   * @return a set containing the tails of edges that have the given node as their head
+   */
+  Set<N> getTails(N head) {
+    HashSet<N> tails = _edges[head];
+    if (tails == null) {
+      return new HashSet<N>();
+    }
+    return tails;
+  }
+
+  /**
+   * Remove all of the given nodes from this graph. As a consequence, any edges for which those
+   * nodes were either a head or a tail will also be removed.
+   *
+   * @param nodes the nodes to be removed
+   */
+  void removeAllNodes(List<N> nodes) {
+    for (N node in nodes) {
+      removeNode(node);
+    }
+  }
+
+  /**
+   * Remove the edge from the given head node to the given tail node. If there was no such edge then
+   * the graph will be unmodified: the number of edges will be the same and the set of nodes will be
+   * the same (neither node will either be added or removed).
+   *
+   * @param head the node at the head of the edge
+   * @param tail the node at the tail of the edge
+   * @return `true` if the graph was modified as a result of this operation
+   */
+  void removeEdge(N head, N tail) {
+    HashSet<N> tails = _edges[head];
+    if (tails != null) {
+      tails.remove(tail);
+    }
+  }
+
+  /**
+   * Remove the given node from this graph. As a consequence, any edges for which that node was
+   * either a head or a tail will also be removed.
+   *
+   * @param node the node to be removed
+   */
+  void removeNode(N node) {
+    _edges.remove(node);
+    for (HashSet<N> tails in _edges.values) {
+      tails.remove(node);
+    }
+  }
+
+  /**
+   * Find one node (referred to as a sink node) that has no outgoing edges (that is, for which there
+   * are no edges that have that node as the head of the edge) and remove it from this graph. Return
+   * the node that was removed, or `null` if there are no such nodes either because the graph
+   * is empty or because every node in the graph has at least one outgoing edge. As a consequence of
+   * removing the node from the graph any edges for which that node was a tail will also be removed.
+   *
+   * @return the sink node that was removed
+   */
+  N removeSink() {
+    N sink = _findSink();
+    if (sink == null) {
+      return null;
+    }
+    removeNode(sink);
+    return sink;
+  }
+
+  bool _containsPathInternal(N source, N destination, HashSet<N> nodesVisited) {
+    if (identical(source, destination)) {
+      return true;
+    }
+    HashSet<N> tails = _edges[source];
+    if (tails != null) {
+      nodesVisited.add(source);
+      for (N tail in tails) {
+        if (!nodesVisited.contains(tail)) {
+          if (_containsPathInternal(tail, destination, nodesVisited)) {
+            return true;
+          }
+        }
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Return one node that has no outgoing edges (that is, for which there are no edges that have
+   * that node as the head of the edge), or `null` if there are no such nodes.
+   *
+   * @return a sink node
+   */
+  N _findSink() {
+    for (N key in _edges.keys) {
+      if (_edges[key].isEmpty) return key;
+    }
+    return null;
+  }
+}
+
+/**
+ * Instances of the class `NodeInfo` are used by the [SccFinder] to maintain
+ * information about the nodes that have been examined.
+ *
+ * @param N the type of the nodes corresponding to the entries
+ */
+class DirectedGraph_NodeInfo<N> {
+  /**
+   * The depth of this node.
+   */
+  int index = 0;
+
+  /**
+   * The depth of the first node in a cycle.
+   */
+  int lowlink = 0;
+
+  /**
+   * A flag indicating whether the corresponding node is on the stack. Used to remove the need for
+   * searching a collection for the node each time the question needs to be asked.
+   */
+  bool onStack = false;
+
+  /**
+   * The component that contains the corresponding node.
+   */
+  List<N> component;
+
+  /**
+   * Initialize a newly created information holder to represent a node at the given depth.
+   *
+   * @param depth the depth of the node being represented
+   */
+  DirectedGraph_NodeInfo(int depth) {
+    index = depth;
+    lowlink = depth;
+    onStack = false;
+  }
+}
+
+/**
+ * Instances of the class `SccFinder` implement Tarjan's Algorithm for finding the strongly
+ * connected components in a graph.
+ */
+class DirectedGraph_SccFinder<N> {
+  /**
+   * The graph to work with.
+   */
+  final DirectedGraph<N> _graph;
+
+  /**
+   * The index used to uniquely identify the depth of nodes.
+   */
+  int _index = 0;
+
+  /**
+   * The stack of nodes that are being visited in order to identify components.
+   */
+  List<N> _stack = new List<N>();
+
+  /**
+   * A table mapping nodes to information about the nodes that is used by this algorithm.
+   */
+  HashMap<N, DirectedGraph_NodeInfo<N>> _nodeMap =
+      new HashMap<N, DirectedGraph_NodeInfo<N>>();
+
+  /**
+   * A list of all strongly connected components found, in topological sort order (each node in a
+   * strongly connected component only has edges that point to nodes in the same component or
+   * earlier components).
+   */
+  List<List<N>> _allComponents = new List<List<N>>();
+
+  /**
+   * Initialize a newly created finder.
+   */
+  DirectedGraph_SccFinder(this._graph) : super();
+
+  /**
+   * Return a list containing the nodes that are part of the strongly connected component that
+   * contains the given node.
+   *
+   * @param node the node used to identify the strongly connected component to be returned
+   * @return the nodes that are part of the strongly connected component that contains the given
+   *         node
+   */
+  List<N> componentContaining(N node) => _strongConnect(node).component;
+
+  /**
+   * Run Tarjan's algorithm and return the resulting list of strongly connected components. The
+   * list is in topological sort order (each node in a strongly connected component only has edges
+   * that point to nodes in the same component or earlier components).
+   */
+  List<List<N>> computeTopologicalSort() {
+    for (N node in _graph._edges.keys.toSet()) {
+      DirectedGraph_NodeInfo<N> nodeInfo = _nodeMap[node];
+      if (nodeInfo == null) {
+        _strongConnect(node);
+      }
+    }
+    return _allComponents;
+  }
+
+  /**
+   * Remove and return the top-most element from the stack.
+   *
+   * @return the element that was removed
+   */
+  N _pop() {
+    N node = _stack.removeAt(_stack.length - 1);
+    _nodeMap[node].onStack = false;
+    return node;
+  }
+
+  /**
+   * Add the given node to the stack.
+   *
+   * @param node the node to be added to the stack
+   */
+  void _push(N node) {
+    _nodeMap[node].onStack = true;
+    _stack.add(node);
+  }
+
+  /**
+   * Compute the strongly connected component that contains the given node as well as any
+   * components containing nodes that are reachable from the given component.
+   *
+   * @param v the node from which the search will begin
+   * @return the information about the given node
+   */
+  DirectedGraph_NodeInfo<N> _strongConnect(N v) {
+    //
+    // Set the depth index for v to the smallest unused index
+    //
+    DirectedGraph_NodeInfo<N> vInfo = new DirectedGraph_NodeInfo<N>(_index++);
+    _nodeMap[v] = vInfo;
+    _push(v);
+    //
+    // Consider successors of v
+    //
+    HashSet<N> tails = _graph._edges[v];
+    if (tails != null) {
+      for (N w in tails) {
+        DirectedGraph_NodeInfo<N> wInfo = _nodeMap[w];
+        if (wInfo == null) {
+          // Successor w has not yet been visited; recurse on it
+          wInfo = _strongConnect(w);
+          vInfo.lowlink = math.min(vInfo.lowlink, wInfo.lowlink);
+        } else if (wInfo.onStack) {
+          // Successor w is in stack S and hence in the current SCC
+          vInfo.lowlink = math.min(vInfo.lowlink, wInfo.index);
+        }
+      }
+    }
+    //
+    // If v is a root node, pop the stack and generate an SCC
+    //
+    if (vInfo.lowlink == vInfo.index) {
+      List<N> component = new List<N>();
+      N w;
+      do {
+        w = _pop();
+        component.add(w);
+        _nodeMap[w].component = component;
+      } while (!identical(w, v));
+      _allComponents.add(component);
+    }
+    return vInfo;
+  }
+}
+
+/**
+ * The class `ListUtilities` defines utility methods useful for working with [List
+ ].
+ */
+class ListUtilities {
+  /**
+   * Add all of the elements in the given array to the given list.
+   *
+   * @param list the list to which the elements are to be added
+   * @param elements the elements to be added to the list
+   */
+  static void addAll(List list, List<Object> elements) {
+    int count = elements.length;
+    for (int i = 0; i < count; i++) {
+      list.add(elements[i]);
+    }
+  }
+}
+
+/**
+ * The interface `MapIterator` defines the behavior of objects that iterate over the entries
+ * in a map.
+ *
+ * This interface defines the concept of a current entry and provides methods to access the key and
+ * value in the current entry. When an iterator is first created it will be positioned before the
+ * first entry and there is no current entry until [moveNext] is invoked. When all of the
+ * entries have been accessed there will also be no current entry.
+ *
+ * There is no guarantee made about the order in which the entries are accessible.
+ */
+abstract class MapIterator<K, V> {
+  /**
+   * Return the key associated with the current element.
+   *
+   * @return the key associated with the current element
+   * @throws NoSuchElementException if there is no current element
+   */
+  K get key;
+
+  /**
+   * Return the value associated with the current element.
+   *
+   * @return the value associated with the current element
+   * @throws NoSuchElementException if there is no current element
+   */
+  V get value;
+
+  /**
+   * Set the value associated with the current element to the given value.
+   *
+   * @param newValue the new value to be associated with the current element
+   * @throws NoSuchElementException if there is no current element
+   */
+  void set value(V newValue);
+
+  /**
+   * Advance to the next entry in the map. Return `true` if there is a current element that
+   * can be accessed after this method returns. It is safe to invoke this method even if the
+   * previous invocation returned `false`.
+   *
+   * @return `true` if there is a current element that can be accessed
+   */
+  bool moveNext();
+}
+
+/**
+ * Instances of the class `MultipleMapIterator` implement an iterator that can be used to
+ * sequentially access the entries in multiple maps.
+ */
+class MultipleMapIterator<K, V> implements MapIterator<K, V> {
+  /**
+   * The iterators used to access the entries.
+   */
+  List<MapIterator<K, V>> _iterators;
+
+  /**
+   * The index of the iterator currently being used to access the entries.
+   */
+  int _iteratorIndex = -1;
+
+  /**
+   * The current iterator, or `null` if there is no current iterator.
+   */
+  MapIterator<K, V> _currentIterator;
+
+  /**
+   * Initialize a newly created iterator to return the entries from the given maps.
+   *
+   * @param maps the maps containing the entries to be iterated
+   */
+  MultipleMapIterator(List<Map<K, V>> maps) {
+    int count = maps.length;
+    _iterators = new List<MapIterator<K, V>>(count);
+    for (int i = 0; i < count; i++) {
+      _iterators[i] = new SingleMapIterator<K, V>(maps[i]);
+    }
+  }
+
+  @override
+  K get key {
+    if (_currentIterator == null) {
+      throw new NoSuchElementException();
+    }
+    return _currentIterator.key;
+  }
+
+  @override
+  V get value {
+    if (_currentIterator == null) {
+      throw new NoSuchElementException();
+    }
+    return _currentIterator.value;
+  }
+
+  @override
+  void set value(V newValue) {
+    if (_currentIterator == null) {
+      throw new NoSuchElementException();
+    }
+    _currentIterator.value = newValue;
+  }
+
+  @override
+  bool moveNext() {
+    if (_iteratorIndex < 0) {
+      if (_iterators.length == 0) {
+        _currentIterator = null;
+        return false;
+      }
+      if (_advanceToNextIterator()) {
+        return true;
+      } else {
+        _currentIterator = null;
+        return false;
+      }
+    }
+    if (_currentIterator.moveNext()) {
+      return true;
+    } else if (_advanceToNextIterator()) {
+      return true;
+    } else {
+      _currentIterator = null;
+      return false;
+    }
+  }
+
+  /**
+   * Under the assumption that there are no more entries that can be returned using the current
+   * iterator, advance to the next iterator that has entries.
+   *
+   * @return `true` if there is a current iterator that has entries
+   */
+  bool _advanceToNextIterator() {
+    _iteratorIndex++;
+    while (_iteratorIndex < _iterators.length) {
+      MapIterator<K, V> iterator = _iterators[_iteratorIndex];
+      if (iterator.moveNext()) {
+        _currentIterator = iterator;
+        return true;
+      }
+      _iteratorIndex++;
+    }
+    return false;
+  }
+}
+
+/**
+ * Instances of the class `SingleMapIterator` implement an iterator that can be used to access
+ * the entries in a single map.
+ */
+class SingleMapIterator<K, V> implements MapIterator<K, V> {
+  /**
+   * The [Map] containing the entries to be iterated over.
+   */
+  final Map<K, V> _map;
+
+  /**
+   * The iterator used to access the entries.
+   */
+  Iterator<K> _keyIterator;
+
+  /**
+   * The current key, or `null` if there is no current key.
+   */
+  K _currentKey;
+
+  /**
+   * The current value.
+   */
+  V _currentValue;
+
+  /**
+   * Initialize a newly created iterator to return the entries from the given map.
+   *
+   * @param map the map containing the entries to be iterated over
+   */
+  SingleMapIterator(this._map) {
+    this._keyIterator = _map.keys.iterator;
+  }
+
+  @override
+  K get key {
+    if (_currentKey == null) {
+      throw new NoSuchElementException();
+    }
+    return _currentKey;
+  }
+
+  @override
+  V get value {
+    if (_currentKey == null) {
+      throw new NoSuchElementException();
+    }
+    if (_currentValue == null) {
+      _currentValue = _map[_currentKey];
+    }
+    return _currentValue;
+  }
+
+  @override
+  void set value(V newValue) {
+    if (_currentKey == null) {
+      throw new NoSuchElementException();
+    }
+    _currentValue = newValue;
+    _map[_currentKey] = newValue;
+  }
+
+  @override
+  bool moveNext() {
+    if (_keyIterator.moveNext()) {
+      _currentKey = _keyIterator.current;
+      _currentValue = null;
+      return true;
+    } else {
+      _currentKey = null;
+      return false;
+    }
+  }
+
+  /**
+   * Returns a new [SingleMapIterator] instance for the given [Map].
+   */
+  static SingleMapIterator forMap(Map map) => new SingleMapIterator(map);
+}
+
+/**
+ * Instances of the class `TokenMap` map one set of tokens to another set of tokens.
+ */
+class TokenMap {
+  /**
+   * A table mapping tokens to tokens. This should be replaced by a more performant implementation.
+   * One possibility is a pair of parallel arrays, with keys being sorted by their offset and a
+   * cursor indicating where to start searching.
+   */
+  HashMap<Token, Token> _map = new HashMap<Token, Token>();
+
+  /**
+   * Return the token that is mapped to the given token, or `null` if there is no token
+   * corresponding to the given token.
+   *
+   * @param key the token being mapped to another token
+   * @return the token that is mapped to the given token
+   */
+  Token get(Token key) => _map[key];
+
+  /**
+   * Map the key to the value.
+   *
+   * @param key the token being mapped to the value
+   * @param value the token to which the key will be mapped
+   */
+  void put(Token key, Token value) {
+    _map[key] = value;
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/utilities_dart.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/utilities_dart.dart
new file mode 100644
index 0000000..882d182
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/utilities_dart.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.utilities.dart;
+
+import 'java_core.dart';
+
+/**
+ * Check whether [uri1] starts with (or 'is prefixed by') [uri2] by checking
+ * path segments.
+ */
+bool startsWith(Uri uri1, Uri uri2) {
+  List<String> uri1Segments = uri1.pathSegments;
+  List<String> uri2Segments = uri2.pathSegments.toList();
+  // Punt if empty (https://github.com/dart-lang/sdk/issues/24126)
+  if (uri2Segments.isEmpty) {
+    return false;
+  }
+  // Trim trailing empty segments ('/foo/' => ['foo', ''])
+  if (uri2Segments.last == '') {
+    uri2Segments.removeLast();
+  }
+
+  if (uri2Segments.length > uri1Segments.length) {
+    return false;
+  }
+
+  for (int i = 0; i < uri2Segments.length; ++i) {
+    if (uri2Segments[i] != uri1Segments[i]) {
+      return false;
+    }
+  }
+  return true;
+}
+
+/**
+ * The enumeration `ParameterKind` defines the different kinds of parameters. There are two
+ * basic kinds of parameters: required and optional. Optional parameters are further divided into
+ * two kinds: positional optional and named optional.
+ */
+class ParameterKind extends Enum<ParameterKind> {
+  static const ParameterKind REQUIRED =
+      const ParameterKind('REQUIRED', 0, false);
+
+  static const ParameterKind POSITIONAL =
+      const ParameterKind('POSITIONAL', 1, true);
+
+  static const ParameterKind NAMED = const ParameterKind('NAMED', 2, true);
+
+  static const List<ParameterKind> values = const [REQUIRED, POSITIONAL, NAMED];
+
+  /**
+   * A flag indicating whether this is an optional parameter.
+   */
+  final bool isOptional;
+
+  /**
+   * Initialize a newly created kind with the given state.
+   *
+   * @param isOptional `true` if this is an optional parameter
+   */
+  const ParameterKind(String name, int ordinal, this.isOptional)
+      : super(name, ordinal);
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/utilities_general.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/utilities_general.dart
new file mode 100644
index 0000000..83bfaa1
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/utilities_general.dart
@@ -0,0 +1,154 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.utilities.general;
+
+import 'dart:profiler';
+
+/**
+ * Jenkins hash function, optimized for small integers.
+ * Borrowed from sdk/lib/math/jenkins_smi_hash.dart.
+ */
+class JenkinsSmiHash {
+  static int combine(int hash, int value) {
+    hash = 0x1fffffff & (hash + value);
+    hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
+    return hash ^ (hash >> 6);
+  }
+
+  static int finish(int hash) {
+    hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
+    hash = hash ^ (hash >> 11);
+    return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
+  }
+
+  static int hash2(a, b) => finish(combine(combine(0, a), b));
+
+  static int hash3(a, b, c) => finish(combine(combine(combine(0, a), b), c));
+
+  static int hash4(a, b, c, d) =>
+      finish(combine(combine(combine(combine(0, a), b), c), d));
+}
+
+/**
+ * Helper class for gathering performance statistics.  This class is modeled on
+ * the UserTag class in dart:profiler so that it can interoperate easily with
+ * it.
+ */
+abstract class PerformanceTag {
+  /**
+   * Return a list of all [PerformanceTag]s which have been created.
+   */
+  static List<PerformanceTag> get all => _PerformanceTagImpl.all.toList();
+
+  /**
+   * Return the current [PerformanceTag] for the isolate.
+   */
+  static PerformanceTag get current => _PerformanceTagImpl.current;
+
+  /**
+   * Return the [PerformanceTag] that is initially current.  This is intended
+   * to track time when the system is performing unknown operations.
+   */
+  static PerformanceTag get UNKNOWN => _PerformanceTagImpl.UNKNOWN;
+
+  /**
+   * Create a [PerformanceTag] having the given [label].  A [UserTag] will also
+   * be created, having the same [label], so that performance information can
+   * be queried using the observatory.
+   */
+  factory PerformanceTag(String label) = _PerformanceTagImpl;
+
+  /**
+   * Return the total number of milliseconds that this [PerformanceTag] has
+   * been the current [PerformanceTag] for the isolate.
+   *
+   * This call is safe even if this [PerformanceTag] is current.
+   */
+  int get elapsedMs;
+
+  /**
+   * Return the label for this [PerformanceTag].
+   */
+  String get label;
+
+  /**
+   * Make this the current tag for the isolate, and return the previous tag.
+   */
+  PerformanceTag makeCurrent();
+
+  /**
+   * Make this the current tag for the isolate, run [f], and restore the
+   * previous tag. Returns the result of invoking [f].
+   */
+  makeCurrentWhile(f());
+
+  /**
+   * Reset the total time tracked by all [PerformanceTag]s to zero.
+   */
+  static void reset() {
+    for (_PerformanceTagImpl tag in _PerformanceTagImpl.all) {
+      tag.stopwatch.reset();
+    }
+  }
+}
+
+class _PerformanceTagImpl implements PerformanceTag {
+  /**
+   * The current performance tag for the isolate.
+   */
+  static _PerformanceTagImpl current = UNKNOWN;
+
+  static final _PerformanceTagImpl UNKNOWN = new _PerformanceTagImpl('unknown');
+
+  /**
+   * A list of all performance tags that have been created so far.
+   */
+  static List<_PerformanceTagImpl> all = <_PerformanceTagImpl>[];
+
+  /**
+   * The [UserTag] associated with this [PerformanceTag].
+   */
+  final UserTag userTag;
+
+  /**
+   * Stopwatch tracking the amount of time this [PerformanceTag] has been the
+   * current tag for the isolate.
+   */
+  final Stopwatch stopwatch;
+
+  _PerformanceTagImpl(String label)
+      : userTag = new UserTag(label),
+        stopwatch = new Stopwatch() {
+    all.add(this);
+  }
+
+  @override
+  int get elapsedMs => stopwatch.elapsedMilliseconds;
+
+  @override
+  String get label => userTag.label;
+
+  @override
+  PerformanceTag makeCurrent() {
+    if (identical(this, current)) {
+      return current;
+    }
+    _PerformanceTagImpl previous = current;
+    previous.stopwatch.stop();
+    stopwatch.start();
+    current = this;
+    userTag.makeCurrent();
+    return previous;
+  }
+
+  makeCurrentWhile(f()) {
+    PerformanceTag prevTag = makeCurrent();
+    try {
+      return f();
+    } finally {
+      prevTag.makeCurrent();
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/generated/visitors.dart b/mojo/public/dart/third_party/analyzer/lib/src/generated/visitors.dart
new file mode 100644
index 0000000..defb317
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/generated/visitors.dart
@@ -0,0 +1,770 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.ast.visitors;
+
+import 'package:analyzer/src/generated/ast.dart';
+
+/// An [AstVisitor] that delegates calls to visit methods to all [delegates]
+/// before calling [visitChildren].
+class DelegatingAstVisitor<T> implements AstVisitor<T> {
+  Iterable<AstVisitor<T>> _delegates;
+  DelegatingAstVisitor(this._delegates);
+
+  @override
+  T visitAdjacentStrings(AdjacentStrings node) {
+    _delegates.forEach((delegate) => delegate.visitAdjacentStrings(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitAnnotation(Annotation node) {
+    _delegates.forEach((delegate) => delegate.visitAnnotation(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitArgumentList(ArgumentList node) {
+    _delegates.forEach((delegate) => delegate.visitArgumentList(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitAsExpression(AsExpression node) {
+    _delegates.forEach((delegate) => delegate.visitAsExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitAssertStatement(AssertStatement node) {
+    _delegates.forEach((delegate) => delegate.visitAssertStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitAssignmentExpression(AssignmentExpression node) {
+    _delegates.forEach((delegate) => delegate.visitAssignmentExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitAwaitExpression(AwaitExpression node) {
+    _delegates.forEach((delegate) => delegate.visitAwaitExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitBinaryExpression(BinaryExpression node) {
+    _delegates.forEach((delegate) => delegate.visitBinaryExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitBlock(Block node) {
+    _delegates.forEach((delegate) => delegate.visitBlock(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitBlockFunctionBody(BlockFunctionBody node) {
+    _delegates.forEach((delegate) => delegate.visitBlockFunctionBody(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitBooleanLiteral(BooleanLiteral node) {
+    _delegates.forEach((delegate) => delegate.visitBooleanLiteral(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitBreakStatement(BreakStatement node) {
+    _delegates.forEach((delegate) => delegate.visitBreakStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitCascadeExpression(CascadeExpression node) {
+    _delegates.forEach((delegate) => delegate.visitCascadeExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitCatchClause(CatchClause node) {
+    _delegates.forEach((delegate) => delegate.visitCatchClause(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitClassDeclaration(ClassDeclaration node) {
+    _delegates.forEach((delegate) => delegate.visitClassDeclaration(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitClassTypeAlias(ClassTypeAlias node) {
+    _delegates.forEach((delegate) => delegate.visitClassTypeAlias(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitComment(Comment node) {
+    _delegates.forEach((delegate) => delegate.visitComment(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitCommentReference(CommentReference node) {
+    _delegates.forEach((delegate) => delegate.visitCommentReference(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitCompilationUnit(CompilationUnit node) {
+    _delegates.forEach((delegate) => delegate.visitCompilationUnit(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitConditionalExpression(ConditionalExpression node) {
+    _delegates.forEach((delegate) => delegate.visitConditionalExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitConstructorDeclaration(ConstructorDeclaration node) {
+    _delegates
+        .forEach((delegate) => delegate.visitConstructorDeclaration(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    _delegates
+        .forEach((delegate) => delegate.visitConstructorFieldInitializer(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitConstructorName(ConstructorName node) {
+    _delegates.forEach((delegate) => delegate.visitConstructorName(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitContinueStatement(ContinueStatement node) {
+    _delegates.forEach((delegate) => delegate.visitContinueStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitDeclaredIdentifier(DeclaredIdentifier node) {
+    _delegates.forEach((delegate) => delegate.visitDeclaredIdentifier(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitDefaultFormalParameter(DefaultFormalParameter node) {
+    _delegates
+        .forEach((delegate) => delegate.visitDefaultFormalParameter(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitDoStatement(DoStatement node) {
+    _delegates.forEach((delegate) => delegate.visitDoStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitDoubleLiteral(DoubleLiteral node) {
+    _delegates.forEach((delegate) => delegate.visitDoubleLiteral(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitEmptyFunctionBody(EmptyFunctionBody node) {
+    _delegates.forEach((delegate) => delegate.visitEmptyFunctionBody(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitEmptyStatement(EmptyStatement node) {
+    _delegates.forEach((delegate) => delegate.visitEmptyStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    _delegates
+        .forEach((delegate) => delegate.visitEnumConstantDeclaration(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitEnumDeclaration(EnumDeclaration node) {
+    _delegates.forEach((delegate) => delegate.visitEnumDeclaration(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitExportDirective(ExportDirective node) {
+    _delegates.forEach((delegate) => delegate.visitExportDirective(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    _delegates
+        .forEach((delegate) => delegate.visitExpressionFunctionBody(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitExpressionStatement(ExpressionStatement node) {
+    _delegates.forEach((delegate) => delegate.visitExpressionStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitExtendsClause(ExtendsClause node) {
+    _delegates.forEach((delegate) => delegate.visitExtendsClause(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitFieldDeclaration(FieldDeclaration node) {
+    _delegates.forEach((delegate) => delegate.visitFieldDeclaration(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitFieldFormalParameter(FieldFormalParameter node) {
+    _delegates.forEach((delegate) => delegate.visitFieldFormalParameter(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitForEachStatement(ForEachStatement node) {
+    _delegates.forEach((delegate) => delegate.visitForEachStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitForStatement(ForStatement node) {
+    _delegates.forEach((delegate) => delegate.visitForStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitFormalParameterList(FormalParameterList node) {
+    _delegates.forEach((delegate) => delegate.visitFormalParameterList(node));
+    node.visitChildren(this);
+    return null;
+  }
+  @override
+  T visitFunctionDeclaration(FunctionDeclaration node) {
+    _delegates.forEach((delegate) => delegate.visitFunctionDeclaration(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitFunctionDeclarationStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitFunctionExpression(FunctionExpression node) {
+    _delegates.forEach((delegate) => delegate.visitFunctionExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitFunctionExpressionInvocation(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitFunctionTypeAlias(FunctionTypeAlias node) {
+    _delegates.forEach((delegate) => delegate.visitFunctionTypeAlias(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitFunctionTypedFormalParameter(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitHideCombinator(HideCombinator node) {
+    _delegates.forEach((delegate) => delegate.visitHideCombinator(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitIfStatement(IfStatement node) {
+    _delegates.forEach((delegate) => delegate.visitIfStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitImplementsClause(ImplementsClause node) {
+    _delegates.forEach((delegate) => delegate.visitImplementsClause(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitImportDirective(ImportDirective node) {
+    _delegates.forEach((delegate) => delegate.visitImportDirective(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitIndexExpression(IndexExpression node) {
+    _delegates.forEach((delegate) => delegate.visitIndexExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitInstanceCreationExpression(InstanceCreationExpression node) {
+    _delegates
+        .forEach((delegate) => delegate.visitInstanceCreationExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitIntegerLiteral(IntegerLiteral node) {
+    _delegates.forEach((delegate) => delegate.visitIntegerLiteral(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitInterpolationExpression(InterpolationExpression node) {
+    _delegates
+        .forEach((delegate) => delegate.visitInterpolationExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitInterpolationString(InterpolationString node) {
+    _delegates.forEach((delegate) => delegate.visitInterpolationString(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitIsExpression(IsExpression node) {
+    _delegates.forEach((delegate) => delegate.visitIsExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitLabel(Label node) {
+    _delegates.forEach((delegate) => delegate.visitLabel(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitLabeledStatement(LabeledStatement node) {
+    _delegates.forEach((delegate) => delegate.visitLabeledStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitLibraryDirective(LibraryDirective node) {
+    _delegates.forEach((delegate) => delegate.visitLibraryDirective(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitLibraryIdentifier(LibraryIdentifier node) {
+    _delegates.forEach((delegate) => delegate.visitLibraryIdentifier(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitListLiteral(ListLiteral node) {
+    _delegates.forEach((delegate) => delegate.visitListLiteral(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitMapLiteral(MapLiteral node) {
+    _delegates.forEach((delegate) => delegate.visitMapLiteral(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitMapLiteralEntry(MapLiteralEntry node) {
+    _delegates.forEach((delegate) => delegate.visitMapLiteralEntry(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitMethodDeclaration(MethodDeclaration node) {
+    _delegates.forEach((delegate) => delegate.visitMethodDeclaration(node));
+    node.visitChildren(this);
+    return null;
+  }
+  @override
+  T visitMethodInvocation(MethodInvocation node) {
+    _delegates.forEach((delegate) => delegate.visitMethodInvocation(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitNamedExpression(NamedExpression node) {
+    _delegates.forEach((delegate) => delegate.visitNamedExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitNativeClause(NativeClause node) {
+    _delegates.forEach((delegate) => delegate.visitNativeClause(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitNativeFunctionBody(NativeFunctionBody node) {
+    _delegates.forEach((delegate) => delegate.visitNativeFunctionBody(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitNullLiteral(NullLiteral node) {
+    _delegates.forEach((delegate) => delegate.visitNullLiteral(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitParenthesizedExpression(ParenthesizedExpression node) {
+    _delegates
+        .forEach((delegate) => delegate.visitParenthesizedExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitPartDirective(PartDirective node) {
+    _delegates.forEach((delegate) => delegate.visitPartDirective(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitPartOfDirective(PartOfDirective node) {
+    _delegates.forEach((delegate) => delegate.visitPartOfDirective(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitPostfixExpression(PostfixExpression node) {
+    _delegates.forEach((delegate) => delegate.visitPostfixExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitPrefixExpression(PrefixExpression node) {
+    _delegates.forEach((delegate) => delegate.visitPrefixExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+  @override
+  T visitPrefixedIdentifier(PrefixedIdentifier node) {
+    _delegates.forEach((delegate) => delegate.visitPrefixedIdentifier(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitPropertyAccess(PropertyAccess node) {
+    _delegates.forEach((delegate) => delegate.visitPropertyAccess(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitRedirectingConstructorInvocation(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitRethrowExpression(RethrowExpression node) {
+    _delegates.forEach((delegate) => delegate.visitRethrowExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitReturnStatement(ReturnStatement node) {
+    _delegates.forEach((delegate) => delegate.visitReturnStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitScriptTag(ScriptTag node) {
+    _delegates.forEach((delegate) => delegate.visitScriptTag(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitShowCombinator(ShowCombinator node) {
+    _delegates.forEach((delegate) => delegate.visitShowCombinator(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitSimpleFormalParameter(SimpleFormalParameter node) {
+    _delegates.forEach((delegate) => delegate.visitSimpleFormalParameter(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitSimpleIdentifier(SimpleIdentifier node) {
+    _delegates.forEach((delegate) => delegate.visitSimpleIdentifier(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitSimpleStringLiteral(SimpleStringLiteral node) {
+    _delegates.forEach((delegate) => delegate.visitSimpleStringLiteral(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitStringInterpolation(StringInterpolation node) {
+    _delegates.forEach((delegate) => delegate.visitStringInterpolation(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    _delegates
+        .forEach((delegate) => delegate.visitSuperConstructorInvocation(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitSuperExpression(SuperExpression node) {
+    _delegates.forEach((delegate) => delegate.visitSuperExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitSwitchCase(SwitchCase node) {
+    _delegates.forEach((delegate) => delegate.visitSwitchCase(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitSwitchDefault(SwitchDefault node) {
+    _delegates.forEach((delegate) => delegate.visitSwitchDefault(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitSwitchStatement(SwitchStatement node) {
+    _delegates.forEach((delegate) => delegate.visitSwitchStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitSymbolLiteral(SymbolLiteral node) {
+    _delegates.forEach((delegate) => delegate.visitSymbolLiteral(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitThisExpression(ThisExpression node) {
+    _delegates.forEach((delegate) => delegate.visitThisExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitThrowExpression(ThrowExpression node) {
+    _delegates.forEach((delegate) => delegate.visitThrowExpression(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    _delegates
+        .forEach((delegate) => delegate.visitTopLevelVariableDeclaration(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitTryStatement(TryStatement node) {
+    _delegates.forEach((delegate) => delegate.visitTryStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitTypeArgumentList(TypeArgumentList node) {
+    _delegates.forEach((delegate) => delegate.visitTypeArgumentList(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitTypeName(TypeName node) {
+    _delegates.forEach((delegate) => delegate.visitTypeName(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitTypeParameter(TypeParameter node) {
+    _delegates.forEach((delegate) => delegate.visitTypeParameter(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitTypeParameterList(TypeParameterList node) {
+    _delegates.forEach((delegate) => delegate.visitTypeParameterList(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitVariableDeclaration(VariableDeclaration node) {
+    _delegates.forEach((delegate) => delegate.visitVariableDeclaration(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitVariableDeclarationList(VariableDeclarationList node) {
+    _delegates
+        .forEach((delegate) => delegate.visitVariableDeclarationList(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    _delegates.forEach(
+        (delegate) => delegate.visitVariableDeclarationStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitWhileStatement(WhileStatement node) {
+    _delegates.forEach((delegate) => delegate.visitWhileStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitWithClause(WithClause node) {
+    _delegates.forEach((delegate) => delegate.visitWithClause(node));
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  T visitYieldStatement(YieldStatement node) {
+    _delegates.forEach((delegate) => delegate.visitYieldStatement(node));
+    node.visitChildren(this);
+    return null;
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/plugin/command_line_plugin.dart b/mojo/public/dart/third_party/analyzer/lib/src/plugin/command_line_plugin.dart
new file mode 100644
index 0000000..ffd43be
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/plugin/command_line_plugin.dart
@@ -0,0 +1,102 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.src.plugin.command_line_plugin;
+
+import 'package:analyzer/plugin/command_line.dart';
+import 'package:plugin/plugin.dart';
+
+/**
+ * A plugin that defines the extension points and extensions that are defined by
+ * command-line applications using the analysis engine.
+ */
+class CommandLinePlugin implements Plugin {
+  /**
+   * The simple identifier of the extension point that allows plugins to
+   * register new parser contributors.
+   */
+  static const String PARSER_CONTRIBUTOR_EXTENSION_POINT = 'parserContributor';
+
+  /**
+   * The simple identifier of the extension point that allows plugins to
+   * register new result processors.
+   */
+  static const String RESULT_PROCESSOR_EXTENSION_POINT = 'resultProcessor';
+
+  /**
+   * The unique identifier of this plugin.
+   */
+  static const String UNIQUE_IDENTIFIER = 'command_line.core';
+
+  /**
+   * The extension point that allows plugins to register new parser
+   * contributors.
+   */
+  ExtensionPoint parserContributorExtensionPoint;
+
+  /**
+   * The extension point that allows plugins to register new result processors.
+   */
+  ExtensionPoint resultProcessorExtensionPoint;
+
+  /**
+   * Initialize a newly created plugin.
+   */
+  CommandLinePlugin();
+
+  /**
+   * Return a list containing all of the parser contributors that were
+   * contributed.
+   */
+  List<ArgParserContributor> get parserContributors =>
+      parserContributorExtensionPoint.extensions;
+
+  /**
+   * Return a list containing all of the result processors that were
+   * contributed.
+   */
+  List<ArgResultsProcessor> get resultProcessors =>
+      resultProcessorExtensionPoint.extensions;
+
+  @override
+  String get uniqueIdentifier => UNIQUE_IDENTIFIER;
+
+  @override
+  void registerExtensionPoints(RegisterExtensionPoint registerExtensionPoint) {
+    parserContributorExtensionPoint = registerExtensionPoint(
+        PARSER_CONTRIBUTOR_EXTENSION_POINT,
+        _validateParserContributorExtension);
+    resultProcessorExtensionPoint = registerExtensionPoint(
+        RESULT_PROCESSOR_EXTENSION_POINT, _validateResultProcessorExtension);
+  }
+
+  @override
+  void registerExtensions(RegisterExtension registerExtension) {
+    // There are no default extensions.
+  }
+
+  /**
+   * Validate the given extension by throwing an [ExtensionError] if it is not a
+   * valid parser contributor.
+   */
+  void _validateParserContributorExtension(Object extension) {
+    if (extension is! ArgParserContributor) {
+      String id = parserContributorExtensionPoint.uniqueIdentifier;
+      throw new ExtensionError(
+          'Extensions to $id must be an ArgParserContributor');
+    }
+  }
+
+  /**
+   * Validate the given extension by throwing an [ExtensionError] if it is not a
+   * valid result processor.
+   */
+  void _validateResultProcessorExtension(Object extension) {
+    if (extension is! ArgResultsProcessor) {
+      String id = resultProcessorExtensionPoint.uniqueIdentifier;
+      throw new ExtensionError(
+          'Extensions to $id must be an ArgResultsProcessor');
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/plugin/engine_plugin.dart b/mojo/public/dart/third_party/analyzer/lib/src/plugin/engine_plugin.dart
new file mode 100644
index 0000000..30d67e3
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/plugin/engine_plugin.dart
@@ -0,0 +1,167 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.src.plugin.engine_plugin;
+
+import 'package:analyzer/plugin/task.dart';
+import 'package:analyzer/src/generated/engine.dart'
+    show InternalAnalysisContext;
+import 'package:analyzer/src/task/dart.dart';
+import 'package:analyzer/src/task/dart_work_manager.dart';
+import 'package:analyzer/src/task/general.dart';
+import 'package:analyzer/src/task/html.dart';
+import 'package:analyzer/src/task/html_work_manager.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:plugin/plugin.dart';
+
+/**
+ * A plugin that defines the extension points and extensions that are inherently
+ * defined by the analysis engine.
+ */
+class EnginePlugin implements Plugin {
+  /**
+   * The simple identifier of the extension point that allows plugins to
+   * register new analysis tasks with the analysis engine.
+   */
+  static const String TASK_EXTENSION_POINT = 'task';
+
+  /**
+   * The simple identifier of the extension point that allows plugins to
+   * register new work manager factories with the analysis engine.
+   */
+  static const String WORK_MANAGER_FACTORY_EXTENSION_POINT =
+      'workManagerFactory';
+
+  /**
+   * The unique identifier of this plugin.
+   */
+  static const String UNIQUE_IDENTIFIER = 'analysis_engine.core';
+
+  /**
+   * The extension point that allows plugins to register new analysis tasks with
+   * the analysis engine.
+   */
+  ExtensionPoint taskExtensionPoint;
+
+  /**
+   * The extension point that allows plugins to register new work manager
+   * factories with the analysis engine.
+   */
+  ExtensionPoint workManagerFactoryExtensionPoint;
+
+  /**
+   * Initialize a newly created plugin.
+   */
+  EnginePlugin();
+
+  /**
+   * Return a list containing all of the task descriptors that were contributed.
+   */
+  List<TaskDescriptor> get taskDescriptors => taskExtensionPoint.extensions;
+
+  @override
+  String get uniqueIdentifier => UNIQUE_IDENTIFIER;
+
+  /**
+   * Return a list containing all of the work manager factories that were
+   * contributed.
+   */
+  List<WorkManagerFactory> get workManagerFactories =>
+      workManagerFactoryExtensionPoint.extensions;
+
+  @override
+  void registerExtensionPoints(RegisterExtensionPoint registerExtensionPoint) {
+    taskExtensionPoint =
+        registerExtensionPoint(TASK_EXTENSION_POINT, _validateTaskExtension);
+    workManagerFactoryExtensionPoint = registerExtensionPoint(
+        WORK_MANAGER_FACTORY_EXTENSION_POINT,
+        _validateWorkManagerFactoryExtension);
+  }
+
+  @override
+  void registerExtensions(RegisterExtension registerExtension) {
+    _registerTaskExtensions(registerExtension);
+    _registerWorkManagerFactoryExtensions(registerExtension);
+  }
+
+  void _registerTaskExtensions(RegisterExtension registerExtension) {
+    String taskId = TASK_EXTENSION_POINT_ID;
+    //
+    // Register general tasks.
+    //
+    registerExtension(taskId, GetContentTask.DESCRIPTOR);
+    //
+    // Register Dart tasks.
+    //
+    registerExtension(taskId, BuildCompilationUnitElementTask.DESCRIPTOR);
+    registerExtension(taskId, BuildDirectiveElementsTask.DESCRIPTOR);
+    registerExtension(taskId, BuildEnumMemberElementsTask.DESCRIPTOR);
+    registerExtension(taskId, BuildExportNamespaceTask.DESCRIPTOR);
+    registerExtension(taskId, BuildLibraryElementTask.DESCRIPTOR);
+    registerExtension(taskId, BuildPublicNamespaceTask.DESCRIPTOR);
+    registerExtension(taskId, BuildSourceExportClosureTask.DESCRIPTOR);
+    registerExtension(taskId, BuildSourceImportExportClosureTask.DESCRIPTOR);
+    registerExtension(taskId, BuildTypeProviderTask.DESCRIPTOR);
+    registerExtension(taskId, ComputeConstantDependenciesTask.DESCRIPTOR);
+    registerExtension(taskId, ComputeConstantValueTask.DESCRIPTOR);
+    registerExtension(taskId, ComputeInferableStaticVariableDependenciesTask.DESCRIPTOR);
+    registerExtension(taskId, ContainingLibrariesTask.DESCRIPTOR);
+    registerExtension(taskId, DartErrorsTask.DESCRIPTOR);
+    registerExtension(taskId, EvaluateUnitConstantsTask.DESCRIPTOR);
+    registerExtension(taskId, GatherUsedImportedElementsTask.DESCRIPTOR);
+    registerExtension(taskId, GatherUsedLocalElementsTask.DESCRIPTOR);
+    registerExtension(taskId, GenerateHintsTask.DESCRIPTOR);
+    registerExtension(taskId, InferStaticVariableTypesInUnitTask.DESCRIPTOR);
+    registerExtension(taskId, InferStaticVariableTypeTask.DESCRIPTOR);
+    registerExtension(taskId, LibraryErrorsReadyTask.DESCRIPTOR);
+    registerExtension(taskId, LibraryUnitErrorsTask.DESCRIPTOR);
+    registerExtension(taskId, ParseDartTask.DESCRIPTOR);
+    registerExtension(taskId, PartiallyResolveUnitReferencesTask.DESCRIPTOR);
+    registerExtension(taskId, ResolveLibraryReferencesTask.DESCRIPTOR);
+    registerExtension(taskId, ResolveLibraryTypeNamesTask.DESCRIPTOR);
+    registerExtension(taskId, ResolveUnitReferencesTask.DESCRIPTOR);
+    registerExtension(taskId, ResolveUnitTypeNamesTask.DESCRIPTOR);
+    registerExtension(taskId, ResolveVariableReferencesTask.DESCRIPTOR);
+    registerExtension(taskId, ScanDartTask.DESCRIPTOR);
+    registerExtension(taskId, VerifyUnitTask.DESCRIPTOR);
+    //
+    // Register HTML tasks.
+    //
+    registerExtension(taskId, DartScriptsTask.DESCRIPTOR);
+    registerExtension(taskId, HtmlErrorsTask.DESCRIPTOR);
+    registerExtension(taskId, ParseHtmlTask.DESCRIPTOR);
+  }
+
+  void _registerWorkManagerFactoryExtensions(
+      RegisterExtension registerExtension) {
+    String taskId = WORK_MANAGER_EXTENSION_POINT_ID;
+    registerExtension(taskId,
+        (InternalAnalysisContext context) => new DartWorkManager(context));
+    registerExtension(taskId,
+        (InternalAnalysisContext context) => new HtmlWorkManager(context));
+  }
+
+  /**
+   * Validate the given extension by throwing an [ExtensionError] if it is not a
+   * valid domain.
+   */
+  void _validateTaskExtension(Object extension) {
+    if (extension is! TaskDescriptor) {
+      String id = taskExtensionPoint.uniqueIdentifier;
+      throw new ExtensionError('Extensions to $id must be a TaskDescriptor');
+    }
+  }
+
+  /**
+   * Validate the given extension by throwing an [ExtensionError] if it is not a
+   * valid domain.
+   */
+  void _validateWorkManagerFactoryExtension(Object extension) {
+    if (extension is! WorkManagerFactory) {
+      String id = taskExtensionPoint.uniqueIdentifier;
+      throw new ExtensionError(
+          'Extensions to $id must be a WorkManagerFactory');
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/plugin/options_plugin.dart b/mojo/public/dart/third_party/analyzer/lib/src/plugin/options_plugin.dart
new file mode 100644
index 0000000..1dea284
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/plugin/options_plugin.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.src.plugin.options;
+
+import 'package:analyzer/plugin/options.dart';
+import 'package:plugin/plugin.dart';
+
+/// A plugin that defines the extension points and extensions that are defined
+/// by applications that want to consume options defined in the analysis
+/// options file.
+class OptionsPlugin implements Plugin {
+
+  /// The simple identifier of the extension point that allows plugins to
+  /// register new options processors.
+  static const String OPTIONS_PROCESSOR_EXTENSION_POINT = 'optionsProcessor';
+
+  /// The unique identifier of this plugin.
+  static const String UNIQUE_IDENTIFIER = 'options.core';
+
+  /// The extension point that allows plugins to register new options processors.
+  ExtensionPoint optionsProcessorExtensionPoint;
+
+  /// All contributed options processors.
+  List<OptionsProcessor> get optionsProcessors =>
+      optionsProcessorExtensionPoint.extensions;
+
+  @override
+  String get uniqueIdentifier => UNIQUE_IDENTIFIER;
+
+  @override
+  void registerExtensionPoints(RegisterExtensionPoint registerExtensionPoint) {
+    optionsProcessorExtensionPoint = registerExtensionPoint(
+        OPTIONS_PROCESSOR_EXTENSION_POINT, _validateOptionsProcessorExtension);
+  }
+
+  @override
+  void registerExtensions(RegisterExtension registerExtension) {
+    // There are no default extensions.
+  }
+
+  /// Validate the given extension by throwing an [ExtensionError] if it is not a
+  /// valid options processor.
+  void _validateOptionsProcessorExtension(Object extension) {
+    if (extension is! OptionsProcessor) {
+      String id = optionsProcessorExtensionPoint.uniqueIdentifier;
+      throw new ExtensionError('Extensions to $id must be an OptionsProcessor');
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/services/lint.dart b/mojo/public/dart/third_party/analyzer/lib/src/services/lint.dart
new file mode 100644
index 0000000..9dd51a0
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/services/lint.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library lint;
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/visitors.dart';
+
+/// Implementers contribute lint warnings via the provided error [reporter].
+abstract class Linter {
+  /// Used to report lint warnings.
+  /// NOTE: this is set by the framework before visit begins.
+  ErrorReporter reporter;
+
+  /// Return a visitor to be passed to compilation units to perform lint
+  /// analysis.
+  /// Lint errors are reported via this [Linter]'s error [reporter].
+  AstVisitor getVisitor();
+}
+
+/// Traverses a library's worth of dart code at a time to generate lint warnings
+/// over the set of sources.
+///
+/// See [LintCode].
+class LintGenerator {
+
+  /// A global container for contributed linters.
+  static final List<Linter> LINTERS = <Linter>[];
+
+  final Iterable<CompilationUnit> _compilationUnits;
+  final AnalysisErrorListener _errorListener;
+  final Iterable<Linter> _linters;
+
+  LintGenerator(this._compilationUnits, this._errorListener,
+      [Iterable<Linter> linters])
+      : _linters = linters != null ? linters : LINTERS;
+
+  void generate() {
+    PerformanceStatistics.lint.makeCurrentWhile(() {
+      _compilationUnits.forEach((cu) {
+        if (cu.element != null) {
+          _generate(cu, cu.element.source);
+        }
+      });
+    });
+  }
+
+  void _generate(CompilationUnit unit, Source source) {
+    ErrorReporter errorReporter = new ErrorReporter(_errorListener, source);
+    _linters.forEach((l) => l.reporter = errorReporter);
+    Iterable<AstVisitor> visitors = _linters.map((l) => l.getVisitor());
+    unit.accept(new DelegatingAstVisitor(visitors.where((v) => v != null)));
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/string_source.dart b/mojo/public/dart/third_party/analyzer/lib/src/string_source.dart
new file mode 100644
index 0000000..5ffb332
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/string_source.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.string_source;
+
+import 'generated/engine.dart' show TimestampedData;
+import 'generated/source.dart';
+
+/// An implementation of [Source] that's based on an in-memory Dart string.
+class StringSource extends Source {
+  final String _contents;
+  final String fullName;
+  final int modificationStamp;
+
+  StringSource(this._contents, this.fullName)
+      : modificationStamp = new DateTime.now().millisecondsSinceEpoch;
+
+  TimestampedData<String> get contents =>
+      new TimestampedData(modificationStamp, _contents);
+
+  String get encoding =>
+      throw new UnsupportedError("StringSource doesn't support " "encoding.");
+
+  int get hashCode => _contents.hashCode ^ fullName.hashCode;
+
+  bool get isInSystemLibrary => false;
+
+  String get shortName => fullName;
+
+  @override
+  Uri get uri =>
+      throw new UnsupportedError("StringSource doesn't support uri.");
+
+  UriKind get uriKind =>
+      throw new UnsupportedError("StringSource doesn't support " "uriKind.");
+
+  bool operator ==(Object object) {
+    if (object is StringSource) {
+      StringSource ssObject = object;
+      return ssObject._contents == _contents && ssObject.fullName == fullName;
+    }
+    return false;
+  }
+
+  bool exists() => true;
+
+  Uri resolveRelativeUri(Uri relativeUri) => throw new UnsupportedError(
+      "StringSource doesn't support resolveRelative.");
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/task/dart.dart b/mojo/public/dart/third_party/analyzer/lib/src/task/dart.dart
new file mode 100644
index 0000000..2a0815c
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/task/dart.dart
@@ -0,0 +1,3959 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.src.task.dart;
+
+import 'dart:collection';
+
+import 'package:analyzer/src/context/cache.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/constant.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart'
+    hide AnalysisCache, AnalysisTask;
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/error_verifier.dart';
+import 'package:analyzer/src/generated/incremental_resolver.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/parser.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/task/driver.dart';
+import 'package:analyzer/src/task/general.dart';
+import 'package:analyzer/src/task/html.dart';
+import 'package:analyzer/src/task/inputs.dart';
+import 'package:analyzer/src/task/model.dart';
+import 'package:analyzer/src/task/strong_mode.dart';
+import 'package:analyzer/task/dart.dart';
+import 'package:analyzer/task/general.dart';
+import 'package:analyzer/task/model.dart';
+
+/**
+ * The [ResultCachingPolicy] for ASTs.
+ */
+const ResultCachingPolicy AST_CACHING_POLICY =
+    const SimpleResultCachingPolicy(8192, 8192);
+
+/**
+ * The [ResultCachingPolicy] for [Element]s.
+ */
+const ResultCachingPolicy ELEMENT_CACHING_POLICY =
+    const SimpleResultCachingPolicy(-1, -1);
+
+/**
+ * The [ResultCachingPolicy] for [TOKEN_STREAM].
+ */
+const ResultCachingPolicy TOKEN_STREAM_CACHING_POLICY =
+    const SimpleResultCachingPolicy(1, 1);
+
+/**
+ * The errors produced while resolving a library directives.
+ *
+ * The list will be empty if there were no errors, but will not be `null`.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ListResultDescriptor<AnalysisError> BUILD_DIRECTIVES_ERRORS =
+    new ListResultDescriptor<AnalysisError>(
+        'BUILD_DIRECTIVES_ERRORS', AnalysisError.NO_ERRORS);
+
+/**
+ * The errors produced while building a library element.
+ *
+ * The list will be empty if there were no errors, but will not be `null`.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ListResultDescriptor<AnalysisError> BUILD_LIBRARY_ERRORS =
+    new ListResultDescriptor<AnalysisError>(
+        'BUILD_LIBRARY_ERRORS', AnalysisError.NO_ERRORS);
+
+/**
+ * A list of the [ClassElement]s representing the classes defined in a
+ * compilation unit.
+ *
+ * The result is only available for [LibrarySpecificUnit]s, and only when strong
+ * mode is enabled.
+ */
+final ListResultDescriptor<ClassElement> CLASSES_IN_UNIT =
+    new ListResultDescriptor<ClassElement>('CLASSES_IN_UNIT', null);
+
+/**
+ * A list of the [ConstantEvaluationTarget]s defined in a unit.  This includes
+ * constants defined at top level, statically inside classes, and local to
+ * functions, as well as constant constructors, annotations, and default values
+ * of parameters to constant constructors.
+ */
+final ListResultDescriptor<
+        ConstantEvaluationTarget> COMPILATION_UNIT_CONSTANTS =
+    new ListResultDescriptor<ConstantEvaluationTarget>(
+        'COMPILATION_UNIT_CONSTANTS', null,
+        cachingPolicy: ELEMENT_CACHING_POLICY);
+
+/**
+ * The element model associated with a single compilation unit.
+ *
+ * The result is only available for [LibrarySpecificUnit]s.
+ */
+final ResultDescriptor<CompilationUnitElement> COMPILATION_UNIT_ELEMENT =
+    new ResultDescriptor<CompilationUnitElement>(
+        'COMPILATION_UNIT_ELEMENT', null,
+        cachingPolicy: ELEMENT_CACHING_POLICY);
+
+/**
+ * The list of [ConstantEvaluationTarget]s on which the target constant element
+ * depends.
+ *
+ * The result is only available for targets representing a
+ * [ConstantEvaluationTarget] (i.e. a constant variable declaration, a constant
+ * constructor, or a parameter element with a default value).
+ */
+final ListResultDescriptor<ConstantEvaluationTarget> CONSTANT_DEPENDENCIES =
+    new ListResultDescriptor<ConstantEvaluationTarget>(
+        'CONSTANT_DEPENDENCIES', const <ConstantEvaluationTarget>[]);
+
+/**
+ * A [ConstantEvaluationTarget] that has been successfully constant-evaluated.
+ *
+ * TODO(paulberry): is ELEMENT_CACHING_POLICY the correct caching policy?
+ */
+final ResultDescriptor<ConstantEvaluationTarget> CONSTANT_VALUE =
+    new ResultDescriptor<ConstantEvaluationTarget>('CONSTANT_VALUE', null,
+        cachingPolicy: ELEMENT_CACHING_POLICY);
+
+/**
+ * The sources representing the libraries that include a given source as a part.
+ *
+ * The result is only available for [Source]s representing a compilation unit.
+ */
+final ListResultDescriptor<Source> CONTAINING_LIBRARIES =
+    new ListResultDescriptor<Source>('CONTAINING_LIBRARIES', Source.EMPTY_LIST);
+
+/**
+ * The sources representing the export closure of a library.
+ * The [Source]s include only library sources, not their units.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ListResultDescriptor<Source> EXPORT_SOURCE_CLOSURE =
+    new ListResultDescriptor<Source>('EXPORT_SOURCE_CLOSURE', null);
+
+/**
+ * The errors produced while generating hints a compilation unit.
+ *
+ * The list will be empty if there were no errors, but will not be `null`.
+ *
+ * The result is only available for [LibrarySpecificUnit]s.
+ */
+final ListResultDescriptor<AnalysisError> HINTS =
+    new ListResultDescriptor<AnalysisError>(
+        'HINT_ERRORS', AnalysisError.NO_ERRORS);
+
+/**
+ * The sources representing the combined import/export closure of a library.
+ * The [Source]s include only library sources, not their units.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ListResultDescriptor<Source> IMPORT_EXPORT_SOURCE_CLOSURE =
+    new ListResultDescriptor<Source>('IMPORT_EXPORT_SOURCE_CLOSURE', null);
+
+/**
+ * A list of the [VariableElement]s whose type should be inferred that another
+ * inferable static variable (the target) depends on.
+ *
+ * The result is only available for [VariableElement]s, and only when strong
+ * mode is enabled.
+ */
+final ListResultDescriptor<
+        VariableElement> INFERABLE_STATIC_VARIABLE_DEPENDENCIES =
+    new ListResultDescriptor<VariableElement>(
+        'INFERABLE_STATIC_VARIABLE_DEPENDENCIES', null);
+
+/**
+ * A list of the [VariableElement]s defined in a unit whose type should be
+ * inferred. This includes variables defined at the library level as well as
+ * static members inside classes.
+ *
+ * The result is only available for [LibrarySpecificUnit]s, and only when strong
+ * mode is enabled.
+ */
+final ListResultDescriptor<VariableElement> INFERABLE_STATIC_VARIABLES_IN_UNIT =
+    new ListResultDescriptor<VariableElement>(
+        'INFERABLE_STATIC_VARIABLES_IN_UNIT', null);
+
+/**
+ * An inferrable static variable ([VariableElement]) whose type has been
+ * inferred.
+ */
+final ResultDescriptor<VariableElement> INFERRED_STATIC_VARIABLE =
+    new ResultDescriptor<VariableElement>('INFERRED_STATIC_VARIABLE', null,
+        cachingPolicy: ELEMENT_CACHING_POLICY);
+
+/**
+ * The partial [LibraryElement] associated with a library.
+ *
+ * The [LibraryElement] and its [CompilationUnitElement]s are attached to each
+ * other. Directives 'library', 'part' and 'part of' are resolved.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT1 =
+    new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT1', null,
+        cachingPolicy: ELEMENT_CACHING_POLICY);
+
+/**
+ * The partial [LibraryElement] associated with a library.
+ *
+ * In addition to [LIBRARY_ELEMENT1] [LibraryElement.imports] and
+ * [LibraryElement.exports] are set.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT2 =
+    new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT2', null,
+        cachingPolicy: ELEMENT_CACHING_POLICY);
+
+/**
+ * The partial [LibraryElement] associated with a library.
+ *
+ * In addition to [LIBRARY_ELEMENT2] the [LibraryElement.publicNamespace] is set.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT3 =
+    new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT3', null,
+        cachingPolicy: ELEMENT_CACHING_POLICY);
+
+/**
+ * The partial [LibraryElement] associated with a library.
+ *
+ * In addition to [LIBRARY_ELEMENT3] the [LibraryElement.entryPoint] is set,
+ * if the library does not declare one already and one of the exported
+ * libraries exports one.
+ *
+ * Also [LibraryElement.exportNamespace] is set.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT4 =
+    new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT4', null,
+        cachingPolicy: ELEMENT_CACHING_POLICY);
+
+/**
+ * The partial [LibraryElement] associated with a library.
+ *
+ * [LIBRARY_ELEMENT4] plus resolved types for every element.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT5 =
+    new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT5', null,
+        cachingPolicy: ELEMENT_CACHING_POLICY);
+
+/**
+ * The flag specifying whether all analysis errors are computed in a specific
+ * library.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ResultDescriptor<bool> LIBRARY_ERRORS_READY =
+    new ResultDescriptor<bool>('LIBRARY_ERRORS_READY', false);
+
+/**
+ * The analysis errors associated with a compilation unit in a specific library.
+ *
+ * The result is only available for [LibrarySpecificUnit]s.
+ */
+final ListResultDescriptor<AnalysisError> LIBRARY_UNIT_ERRORS =
+    new ListResultDescriptor<AnalysisError>(
+        'LIBRARY_UNIT_ERRORS', AnalysisError.NO_ERRORS);
+
+/**
+ * The errors produced while parsing a compilation unit.
+ *
+ * The list will be empty if there were no errors, but will not be `null`.
+ *
+ * The result is only available for [Source]s representing a compilation unit.
+ */
+final ListResultDescriptor<AnalysisError> PARSE_ERRORS =
+    new ListResultDescriptor<AnalysisError>(
+        'PARSE_ERRORS', AnalysisError.NO_ERRORS);
+
+/**
+ * The errors produced while resolving references outside of function bodies.
+ *
+ * The list will be empty if there were no errors, but will not be `null`.
+ *
+ * The result is only available for [LibrarySpecificUnit]s.
+ */
+final ListResultDescriptor<AnalysisError> PARTIALLY_RESOLVE_REFERENCES_ERRORS =
+    new ListResultDescriptor<AnalysisError>(
+        'PARTIALLY_RESOLVE_REFERENCES_ERRORS', AnalysisError.NO_ERRORS);
+
+/**
+ * The names (resolved and not) referenced by a unit.
+ *
+ * The result is only available for [Source]s representing a compilation unit.
+ */
+final ResultDescriptor<ReferencedNames> REFERENCED_NAMES =
+    new ResultDescriptor<ReferencedNames>('REFERENCED_NAMES', null);
+
+/**
+ * The errors produced while resolving references.
+ *
+ * The list will be empty if there were no errors, but will not be `null`.
+ *
+ * The result is only available for [LibrarySpecificUnit]s.
+ */
+final ListResultDescriptor<AnalysisError> RESOLVE_REFERENCES_ERRORS =
+    new ListResultDescriptor<AnalysisError>(
+        'RESOLVE_REFERENCES_ERRORS', AnalysisError.NO_ERRORS);
+
+/**
+ * The errors produced while resolving type names.
+ *
+ * The list will be empty if there were no errors, but will not be `null`.
+ *
+ * The result is only available for [LibrarySpecificUnit]s.
+ */
+final ListResultDescriptor<AnalysisError> RESOLVE_TYPE_NAMES_ERRORS =
+    new ListResultDescriptor<AnalysisError>(
+        'RESOLVE_TYPE_NAMES_ERRORS', AnalysisError.NO_ERRORS);
+
+/**
+ * The partially resolved [CompilationUnit] associated with a unit.
+ *
+ * All declarations bound to the element defined by the declaration.
+ *
+ * The result is only available for [LibrarySpecificUnit]s.
+ */
+final ResultDescriptor<CompilationUnit> RESOLVED_UNIT1 =
+    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT1', null,
+        cachingPolicy: AST_CACHING_POLICY);
+
+/**
+ * The partially resolved [CompilationUnit] associated with a unit.
+ *
+ * All the enum member elements are built.
+ *
+ * The result is only available for [LibrarySpecificUnit]s.
+ */
+final ResultDescriptor<CompilationUnit> RESOLVED_UNIT2 =
+    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT2', null,
+        cachingPolicy: AST_CACHING_POLICY);
+
+/**
+ * The partially resolved [CompilationUnit] associated with a unit.
+ *
+ * [RESOLVED_UNIT2] with resolved type names.
+ *
+ * The result is only available for [LibrarySpecificUnit]s.
+ */
+final ResultDescriptor<CompilationUnit> RESOLVED_UNIT3 =
+    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT3', null,
+        cachingPolicy: AST_CACHING_POLICY);
+
+/**
+ * The partially resolved [CompilationUnit] associated with a unit.
+ *
+ * [RESOLVED_UNIT3] plus resolved local variables and formal parameters.
+ *
+ * The result is only available for [LibrarySpecificUnit]s.
+ */
+final ResultDescriptor<CompilationUnit> RESOLVED_UNIT4 =
+    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT4', null,
+        cachingPolicy: AST_CACHING_POLICY);
+
+/**
+ * The resolved [CompilationUnit] associated with a compilation unit in which
+ * elements and types have been initially resolved outside of method bodies in
+ * addition to everything that is true of a [RESOLVED_UNIT4].
+ *
+ * The result is only available for [LibrarySpecificUnit]s.
+ */
+final ResultDescriptor<CompilationUnit> RESOLVED_UNIT5 =
+    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT5', null,
+        cachingPolicy: AST_CACHING_POLICY);
+
+/**
+ * The resolved [CompilationUnit] associated with a compilation unit in which
+ * the types of static variables have been inferred in addition to everything
+ * that is true of a [RESOLVED_UNIT5].
+ *
+ * The result is only available for [LibrarySpecificUnit]s.
+ */
+final ResultDescriptor<CompilationUnit> RESOLVED_UNIT6 =
+    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT6', null,
+        cachingPolicy: AST_CACHING_POLICY);
+
+/**
+ * The resolved [CompilationUnit] associated with a compilation unit in which
+ * the types of class members have been inferred in addition to everything that
+ * is true of a [RESOLVED_UNIT7].
+ *
+ * The result is only available for [LibrarySpecificUnit]s.
+ */
+final ResultDescriptor<CompilationUnit> RESOLVED_UNIT7 =
+    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT7', null,
+        cachingPolicy: AST_CACHING_POLICY);
+
+/**
+ * The resolved [CompilationUnit] associated with a compilation unit, with
+ * constants not yet resolved.
+ *
+ * The result is only available for [LibrarySpecificUnit]s.
+ */
+final ResultDescriptor<CompilationUnit> RESOLVED_UNIT8 =
+    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT8', null,
+        cachingPolicy: AST_CACHING_POLICY);
+
+/**
+ * The errors produced while scanning a compilation unit.
+ *
+ * The list will be empty if there were no errors, but will not be `null`.
+ *
+ * The result is only available for [Source]s representing a compilation unit.
+ */
+final ListResultDescriptor<AnalysisError> SCAN_ERRORS =
+    new ListResultDescriptor<AnalysisError>(
+        'SCAN_ERRORS', AnalysisError.NO_ERRORS);
+
+/**
+ * The [TypeProvider] of the [AnalysisContext].
+ */
+final ResultDescriptor<TypeProvider> TYPE_PROVIDER =
+    new ResultDescriptor<TypeProvider>('TYPE_PROVIDER', null);
+
+/**
+ * The [UsedImportedElements] of a [LibrarySpecificUnit].
+ */
+final ResultDescriptor<UsedImportedElements> USED_IMPORTED_ELEMENTS =
+    new ResultDescriptor<UsedImportedElements>('USED_IMPORTED_ELEMENTS', null,
+        cachingPolicy: ELEMENT_CACHING_POLICY);
+
+/**
+ * The [UsedLocalElements] of a [LibrarySpecificUnit].
+ */
+final ResultDescriptor<UsedLocalElements> USED_LOCAL_ELEMENTS =
+    new ResultDescriptor<UsedLocalElements>('USED_LOCAL_ELEMENTS', null,
+        cachingPolicy: ELEMENT_CACHING_POLICY);
+
+/**
+ * The errors produced while resolving variable references in a compilation unit.
+ *
+ * The list will be empty if there were no errors, but will not be `null`.
+ *
+ * The result is only available for [LibrarySpecificUnit]s.
+ */
+final ListResultDescriptor<AnalysisError> VARIABLE_REFERENCE_ERRORS =
+    new ListResultDescriptor<AnalysisError>(
+        'VARIABLE_REFERENCE_ERRORS', AnalysisError.NO_ERRORS);
+
+/**
+ * The errors produced while verifying a compilation unit.
+ *
+ * The list will be empty if there were no errors, but will not be `null`.
+ *
+ * The result is only available for [LibrarySpecificUnit]s.
+ */
+final ListResultDescriptor<AnalysisError> VERIFY_ERRORS =
+    new ListResultDescriptor<AnalysisError>(
+        'VERIFY_ERRORS', AnalysisError.NO_ERRORS);
+
+/**
+ * Return a list of errors containing the errors from the given [errors] list
+ * but with duplications removed.
+ */
+List<AnalysisError> removeDuplicateErrors(List<AnalysisError> errors) {
+  if (errors.isEmpty) {
+    return errors;
+  }
+  return errors.toSet().toList();
+}
+
+/**
+ * A task that builds a compilation unit element for a single compilation unit.
+ */
+class BuildCompilationUnitElementTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the input whose value is the AST for the compilation unit.
+   */
+  static const String PARSED_UNIT_INPUT_NAME = 'PARSED_UNIT_INPUT_NAME';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'BuildCompilationUnitElementTask',
+      createTask,
+      buildInputs, <ResultDescriptor>[
+    COMPILATION_UNIT_CONSTANTS,
+    COMPILATION_UNIT_ELEMENT,
+    RESOLVED_UNIT1
+  ]);
+
+  /**
+   * Initialize a newly created task to build a compilation unit element for
+   * the given [target] in the given [context].
+   */
+  BuildCompilationUnitElementTask(
+      InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    //
+    // Prepare inputs.
+    //
+    LibrarySpecificUnit librarySpecificUnit = target;
+    Source source = getRequiredSource();
+    CompilationUnit unit = getRequiredInput(PARSED_UNIT_INPUT_NAME);
+    //
+    // Build or reuse CompilationUnitElement.
+    //
+    unit = AstCloner.clone(unit);
+    AnalysisCache analysisCache =
+        (context as InternalAnalysisContext).analysisCache;
+    CompilationUnitElement element =
+        analysisCache.getValue(target, COMPILATION_UNIT_ELEMENT);
+    if (element == null) {
+      CompilationUnitBuilder builder = new CompilationUnitBuilder();
+      element = builder.buildCompilationUnit(
+          source, unit, librarySpecificUnit.library);
+    } else {
+      new DeclarationResolver().resolve(unit, element);
+    }
+    //
+    // Prepare constants.
+    //
+    ConstantFinder constantFinder =
+        new ConstantFinder(context, source, librarySpecificUnit.library);
+    unit.accept(constantFinder);
+    List<ConstantEvaluationTarget> constants = new List<
+        ConstantEvaluationTarget>.from(constantFinder.constantsToCompute);
+    //
+    // Record outputs.
+    //
+    outputs[COMPILATION_UNIT_CONSTANTS] = constants;
+    outputs[COMPILATION_UNIT_ELEMENT] = element;
+    outputs[RESOLVED_UNIT1] = unit;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the given
+   * [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    LibrarySpecificUnit unit = target;
+    return <String, TaskInput>{
+      PARSED_UNIT_INPUT_NAME: PARSED_UNIT.of(unit.unit)
+    };
+  }
+
+  /**
+   * Create a [BuildCompilationUnitElementTask] based on the given [target] in
+   * the given [context].
+   */
+  static BuildCompilationUnitElementTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new BuildCompilationUnitElementTask(context, target);
+  }
+}
+
+/**
+ * A task that builds imports and export directive elements for a library.
+ */
+class BuildDirectiveElementsTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the input whose value is the defining [LIBRARY_ELEMENT1].
+   */
+  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
+
+  /**
+   * The name of the input for [RESOLVED_UNIT1] of a library unit.
+   */
+  static const String UNIT_INPUT_NAME = 'UNIT_INPUT_NAME';
+
+  /**
+   * The input with a list of [LIBRARY_ELEMENT3]s of imported libraries.
+   */
+  static const String IMPORTS_LIBRARY_ELEMENT_INPUT_NAME =
+      'IMPORTS_LIBRARY_ELEMENT1_INPUT_NAME';
+
+  /**
+   * The input with a list of [LIBRARY_ELEMENT3]s of exported libraries.
+   */
+  static const String EXPORTS_LIBRARY_ELEMENT_INPUT_NAME =
+      'EXPORTS_LIBRARY_ELEMENT_INPUT_NAME';
+
+  /**
+   * The input with a list of [SOURCE_KIND]s of imported libraries.
+   */
+  static const String IMPORTS_SOURCE_KIND_INPUT_NAME =
+      'IMPORTS_SOURCE_KIND_INPUT_NAME';
+
+  /**
+   * The input with a list of [SOURCE_KIND]s of exported libraries.
+   */
+  static const String EXPORTS_SOURCE_KIND_INPUT_NAME =
+      'EXPORTS_SOURCE_KIND_INPUT_NAME';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'BuildDirectiveElementsTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[LIBRARY_ELEMENT2, BUILD_DIRECTIVES_ERRORS]);
+
+  BuildDirectiveElementsTask(
+      InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    List<AnalysisError> errors = <AnalysisError>[];
+    //
+    // Prepare inputs.
+    //
+    LibraryElementImpl libraryElement = getRequiredInput(LIBRARY_INPUT);
+    CompilationUnit libraryUnit = getRequiredInput(UNIT_INPUT_NAME);
+    Map<Source, LibraryElement> importLibraryMap =
+        getRequiredInput(IMPORTS_LIBRARY_ELEMENT_INPUT_NAME);
+    Map<Source, LibraryElement> exportLibraryMap =
+        getRequiredInput(EXPORTS_LIBRARY_ELEMENT_INPUT_NAME);
+    Map<Source, SourceKind> importSourceKindMap =
+        getRequiredInput(IMPORTS_SOURCE_KIND_INPUT_NAME);
+    Map<Source, SourceKind> exportSourceKindMap =
+        getRequiredInput(EXPORTS_SOURCE_KIND_INPUT_NAME);
+    Source librarySource = libraryElement.source;
+    //
+    // Resolve directives.
+    //
+    HashMap<String, PrefixElementImpl> nameToPrefixMap =
+        new HashMap<String, PrefixElementImpl>();
+    List<ImportElement> imports = <ImportElement>[];
+    List<ExportElement> exports = <ExportElement>[];
+    bool explicitlyImportsCore = false;
+    for (Directive directive in libraryUnit.directives) {
+      if (directive is ImportDirective) {
+        ImportDirective importDirective = directive;
+        String uriContent = importDirective.uriContent;
+        if (DartUriResolver.isDartExtUri(uriContent)) {
+          libraryElement.hasExtUri = true;
+        }
+        Source importedSource = importDirective.source;
+        if (importedSource != null && context.exists(importedSource)) {
+          // The imported source will be null if the URI in the import
+          // directive was invalid.
+          LibraryElement importedLibrary = importLibraryMap[importedSource];
+          if (importedLibrary != null) {
+            if (importedLibrary.isDartCore) {
+              explicitlyImportsCore = true;
+            }
+            ImportElementImpl importElement =
+                new ImportElementImpl(directive.offset);
+            StringLiteral uriLiteral = importDirective.uri;
+            if (uriLiteral != null) {
+              importElement.uriOffset = uriLiteral.offset;
+              importElement.uriEnd = uriLiteral.end;
+            }
+            importElement.uri = uriContent;
+            importElement.deferred = importDirective.deferredKeyword != null;
+            importElement.combinators = _buildCombinators(importDirective);
+            importElement.importedLibrary = importedLibrary;
+            SimpleIdentifier prefixNode = directive.prefix;
+            if (prefixNode != null) {
+              importElement.prefixOffset = prefixNode.offset;
+              String prefixName = prefixNode.name;
+              PrefixElementImpl prefix = nameToPrefixMap[prefixName];
+              if (prefix == null) {
+                prefix = new PrefixElementImpl.forNode(prefixNode);
+                nameToPrefixMap[prefixName] = prefix;
+              }
+              importElement.prefix = prefix;
+              prefixNode.staticElement = prefix;
+            }
+            directive.element = importElement;
+            imports.add(importElement);
+            if (importSourceKindMap[importedSource] != SourceKind.LIBRARY) {
+              ErrorCode errorCode = (importElement.isDeferred
+                  ? StaticWarningCode.IMPORT_OF_NON_LIBRARY
+                  : CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY);
+              errors.add(new AnalysisError(importedSource, uriLiteral.offset,
+                  uriLiteral.length, errorCode, [uriLiteral.toSource()]));
+            }
+          }
+        }
+      } else if (directive is ExportDirective) {
+        ExportDirective exportDirective = directive;
+        Source exportedSource = exportDirective.source;
+        if (exportedSource != null && context.exists(exportedSource)) {
+          // The exported source will be null if the URI in the export
+          // directive was invalid.
+          LibraryElement exportedLibrary = exportLibraryMap[exportedSource];
+          if (exportedLibrary != null) {
+            ExportElementImpl exportElement =
+                new ExportElementImpl(directive.offset);
+            StringLiteral uriLiteral = exportDirective.uri;
+            if (uriLiteral != null) {
+              exportElement.uriOffset = uriLiteral.offset;
+              exportElement.uriEnd = uriLiteral.end;
+            }
+            exportElement.uri = exportDirective.uriContent;
+            exportElement.combinators = _buildCombinators(exportDirective);
+            exportElement.exportedLibrary = exportedLibrary;
+            directive.element = exportElement;
+            exports.add(exportElement);
+            if (exportSourceKindMap[exportedSource] != SourceKind.LIBRARY) {
+              errors.add(new AnalysisError(
+                  exportedSource,
+                  uriLiteral.offset,
+                  uriLiteral.length,
+                  CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY,
+                  [uriLiteral.toSource()]));
+            }
+          }
+        }
+      }
+    }
+    //
+    // Ensure "dart:core" import.
+    //
+    Source coreLibrarySource = context.sourceFactory.forUri(DartSdk.DART_CORE);
+    if (!explicitlyImportsCore && coreLibrarySource != librarySource) {
+      ImportElementImpl importElement = new ImportElementImpl(-1);
+      importElement.importedLibrary = importLibraryMap[coreLibrarySource];
+      importElement.synthetic = true;
+      imports.add(importElement);
+    }
+    //
+    // Populate the library element.
+    //
+    libraryElement.imports = imports;
+    libraryElement.exports = exports;
+    //
+    // Record outputs.
+    //
+    outputs[LIBRARY_ELEMENT2] = libraryElement;
+    outputs[BUILD_DIRECTIVES_ERRORS] = errors;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given library [libSource].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    Source source = target;
+    return <String, TaskInput>{
+      LIBRARY_INPUT: LIBRARY_ELEMENT1.of(source),
+      UNIT_INPUT_NAME:
+          RESOLVED_UNIT1.of(new LibrarySpecificUnit(source, source)),
+      IMPORTS_LIBRARY_ELEMENT_INPUT_NAME:
+          IMPORTED_LIBRARIES.of(source).toMapOf(LIBRARY_ELEMENT1),
+      EXPORTS_LIBRARY_ELEMENT_INPUT_NAME:
+          EXPORTED_LIBRARIES.of(source).toMapOf(LIBRARY_ELEMENT1),
+      IMPORTS_SOURCE_KIND_INPUT_NAME:
+          IMPORTED_LIBRARIES.of(source).toMapOf(SOURCE_KIND),
+      EXPORTS_SOURCE_KIND_INPUT_NAME:
+          EXPORTED_LIBRARIES.of(source).toMapOf(SOURCE_KIND)
+    };
+  }
+
+  /**
+   * Create a [BuildDirectiveElementsTask] based on the given [target] in
+   * the given [context].
+   */
+  static BuildDirectiveElementsTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new BuildDirectiveElementsTask(context, target);
+  }
+
+  /**
+   * Build the element model representing the combinators declared by
+   * the given [directive].
+   */
+  static List<NamespaceCombinator> _buildCombinators(
+      NamespaceDirective directive) {
+    List<NamespaceCombinator> combinators = <NamespaceCombinator>[];
+    for (Combinator combinator in directive.combinators) {
+      if (combinator is ShowCombinator) {
+        ShowElementCombinatorImpl show = new ShowElementCombinatorImpl();
+        show.offset = combinator.offset;
+        show.end = combinator.end;
+        show.shownNames = _getIdentifiers(combinator.shownNames);
+        combinators.add(show);
+      } else if (combinator is HideCombinator) {
+        HideElementCombinatorImpl hide = new HideElementCombinatorImpl();
+        hide.hiddenNames = _getIdentifiers(combinator.hiddenNames);
+        combinators.add(hide);
+      }
+    }
+    return combinators;
+  }
+
+  /**
+   * Return the lexical identifiers associated with the given [identifiers].
+   */
+  static List<String> _getIdentifiers(NodeList<SimpleIdentifier> identifiers) {
+    return identifiers.map((identifier) => identifier.name).toList();
+  }
+}
+
+/**
+ * A task that builds the elements representing the members of enum
+ * declarations.
+ */
+class BuildEnumMemberElementsTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the [TYPE_PROVIDER] input.
+   */
+  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
+
+  /**
+   * The name of the [RESOLVED_UNIT1] input.
+   */
+  static const String UNIT_INPUT = 'UNIT_INPUT';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'BuildEnumMemberElementsTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[RESOLVED_UNIT2]);
+
+  BuildEnumMemberElementsTask(
+      InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    //
+    // Prepare inputs.
+    //
+    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
+    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
+    //
+    // Record outputs.
+    //
+    EnumMemberBuilder builder = new EnumMemberBuilder(typeProvider);
+    unit.accept(builder);
+    outputs[RESOLVED_UNIT2] = unit;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    LibrarySpecificUnit unit = target;
+    return <String, TaskInput>{
+      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request),
+      UNIT_INPUT: RESOLVED_UNIT1.of(unit)
+    };
+  }
+
+  /**
+   * Create a [BuildEnumMemberElementsTask] based on the given [target] in
+   * the given [context].
+   */
+  static BuildEnumMemberElementsTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new BuildEnumMemberElementsTask(context, target);
+  }
+}
+
+/**
+ * A task that builds [EXPORT_NAMESPACE] and [LIBRARY_ELEMENT4] for a library.
+ */
+class BuildExportNamespaceTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the input for [LIBRARY_ELEMENT3] of a library.
+   */
+  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'BuildExportNamespaceTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[LIBRARY_ELEMENT4]);
+
+  BuildExportNamespaceTask(
+      InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    LibraryElementImpl library = getRequiredInput(LIBRARY_INPUT);
+    //
+    // Compute export namespace.
+    //
+    ExportNamespaceBuilder builder = new ExportNamespaceBuilder();
+    Namespace namespace = builder.build(library);
+    library.exportNamespace = namespace;
+    //
+    // Update entry point.
+    //
+    if (library.entryPoint == null) {
+      Iterable<Element> exportedElements = namespace.definedNames.values;
+      library.entryPoint = exportedElements.firstWhere(
+          (element) => element is FunctionElement && element.isEntryPoint,
+          orElse: () => null);
+    }
+    //
+    // Record outputs.
+    //
+    outputs[LIBRARY_ELEMENT4] = library;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given library [libSource].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    Source source = target;
+    return <String, TaskInput>{
+      LIBRARY_INPUT: LIBRARY_ELEMENT3.of(source),
+      'exportsLibraryPublicNamespace':
+          EXPORT_SOURCE_CLOSURE.of(source).toMapOf(LIBRARY_ELEMENT3)
+    };
+  }
+
+  /**
+   * Create a [BuildExportNamespaceTask] based on the given [target] in
+   * the given [context].
+   */
+  static BuildExportNamespaceTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new BuildExportNamespaceTask(context, target);
+  }
+}
+
+/**
+ * A task that builds a library element for a Dart library.
+ */
+class BuildLibraryElementTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the input whose value is the defining [RESOLVED_UNIT1].
+   */
+  static const String DEFINING_UNIT_INPUT = 'DEFINING_UNIT_INPUT';
+
+  /**
+   * The name of the input whose value is a list of built [RESOLVED_UNIT1]s
+   * of the parts sourced by a library.
+   */
+  static const String PARTS_UNIT_INPUT = 'PARTS_UNIT_INPUT';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'BuildLibraryElementTask', createTask, buildInputs, <ResultDescriptor>[
+    BUILD_LIBRARY_ERRORS,
+    LIBRARY_ELEMENT1,
+    IS_LAUNCHABLE
+  ]);
+
+  /**
+   * The constant used as an unknown common library name in parts.
+   */
+  static const String _UNKNOWN_LIBRARY_NAME = 'unknown-library-name';
+
+  /**
+   * Initialize a newly created task to build a library element for the given
+   * [target] in the given [context].
+   */
+  BuildLibraryElementTask(
+      InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    List<AnalysisError> errors = <AnalysisError>[];
+    //
+    // Prepare inputs.
+    //
+    Source librarySource = getRequiredSource();
+    CompilationUnit definingCompilationUnit =
+        getRequiredInput(DEFINING_UNIT_INPUT);
+    List<CompilationUnit> partUnits = getRequiredInput(PARTS_UNIT_INPUT);
+    //
+    // Process inputs.
+    //
+    CompilationUnitElementImpl definingCompilationUnitElement =
+        definingCompilationUnit.element;
+    Map<Source, CompilationUnit> partUnitMap =
+        new HashMap<Source, CompilationUnit>();
+    for (CompilationUnit partUnit in partUnits) {
+      Source partSource = partUnit.element.source;
+      partUnitMap[partSource] = partUnit;
+    }
+    //
+    // Update "part" directives.
+    //
+    LibraryIdentifier libraryNameNode = null;
+    String partsLibraryName = _UNKNOWN_LIBRARY_NAME;
+    bool hasPartDirective = false;
+    FunctionElement entryPoint =
+        _findEntryPoint(definingCompilationUnitElement);
+    List<Directive> directivesToResolve = <Directive>[];
+    List<CompilationUnitElementImpl> sourcedCompilationUnits =
+        <CompilationUnitElementImpl>[];
+    for (Directive directive in definingCompilationUnit.directives) {
+      if (directive is LibraryDirective) {
+        if (libraryNameNode == null) {
+          libraryNameNode = directive.name;
+          directivesToResolve.add(directive);
+        }
+      } else if (directive is PartDirective) {
+        PartDirective partDirective = directive;
+        StringLiteral partUri = partDirective.uri;
+        Source partSource = partDirective.source;
+        hasPartDirective = true;
+        CompilationUnit partUnit = partUnitMap[partSource];
+        if (partUnit != null) {
+          CompilationUnitElementImpl partElement = partUnit.element;
+          partElement.uriOffset = partUri.offset;
+          partElement.uriEnd = partUri.end;
+          partElement.uri = partDirective.uriContent;
+          //
+          // Validate that the part contains a part-of directive with the same
+          // name as the library.
+          //
+          if (context.exists(partSource)) {
+            String partLibraryName =
+                _getPartLibraryName(partSource, partUnit, directivesToResolve);
+            if (partLibraryName == null) {
+              errors.add(new AnalysisError(
+                  librarySource,
+                  partUri.offset,
+                  partUri.length,
+                  CompileTimeErrorCode.PART_OF_NON_PART,
+                  [partUri.toSource()]));
+            } else if (libraryNameNode == null) {
+              if (partsLibraryName == _UNKNOWN_LIBRARY_NAME) {
+                partsLibraryName = partLibraryName;
+              } else if (partsLibraryName != partLibraryName) {
+                partsLibraryName = null;
+              }
+            } else if (libraryNameNode.name != partLibraryName) {
+              errors.add(new AnalysisError(
+                  librarySource,
+                  partUri.offset,
+                  partUri.length,
+                  StaticWarningCode.PART_OF_DIFFERENT_LIBRARY,
+                  [libraryNameNode.name, partLibraryName]));
+            }
+          }
+          if (entryPoint == null) {
+            entryPoint = _findEntryPoint(partElement);
+          }
+          directive.element = partElement;
+          sourcedCompilationUnits.add(partElement);
+        }
+      }
+    }
+    if (hasPartDirective && libraryNameNode == null) {
+      AnalysisError error;
+      if (partsLibraryName != _UNKNOWN_LIBRARY_NAME &&
+          partsLibraryName != null) {
+        error = new AnalysisErrorWithProperties(librarySource, 0, 0,
+            ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART)
+          ..setProperty(ErrorProperty.PARTS_LIBRARY_NAME, partsLibraryName);
+      } else {
+        error = new AnalysisError(librarySource, 0, 0,
+            ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART);
+      }
+      errors.add(error);
+    }
+    //
+    // Create and populate the library element.
+    //
+    AnalysisContext owningContext = context;
+    if (context is InternalAnalysisContext) {
+      InternalAnalysisContext internalContext = context;
+      owningContext = internalContext.getContextFor(librarySource);
+    }
+    LibraryElementImpl libraryElement =
+        new LibraryElementImpl.forNode(owningContext, libraryNameNode);
+    libraryElement.definingCompilationUnit = definingCompilationUnitElement;
+    libraryElement.entryPoint = entryPoint;
+    libraryElement.parts = sourcedCompilationUnits;
+    for (Directive directive in directivesToResolve) {
+      directive.element = libraryElement;
+    }
+    if (sourcedCompilationUnits.isNotEmpty) {
+      _patchTopLevelAccessors(libraryElement);
+    }
+    //
+    // Record outputs.
+    //
+    outputs[BUILD_LIBRARY_ERRORS] = errors;
+    outputs[LIBRARY_ELEMENT1] = libraryElement;
+    outputs[IS_LAUNCHABLE] = entryPoint != null;
+  }
+
+  /**
+   * Add all of the non-synthetic [getters] and [setters] defined in the given
+   * [unit] that have no corresponding accessor to one of the given collections.
+   */
+  void _collectAccessors(Map<String, PropertyAccessorElement> getters,
+      List<PropertyAccessorElement> setters, CompilationUnitElement unit) {
+    for (PropertyAccessorElement accessor in unit.accessors) {
+      if (accessor.isGetter) {
+        if (!accessor.isSynthetic && accessor.correspondingSetter == null) {
+          getters[accessor.displayName] = accessor;
+        }
+      } else {
+        if (!accessor.isSynthetic && accessor.correspondingGetter == null) {
+          setters.add(accessor);
+        }
+      }
+    }
+  }
+
+  /**
+   * Return the top-level [FunctionElement] entry point, or `null` if the given
+   * [element] does not define an entry point.
+   */
+  FunctionElement _findEntryPoint(CompilationUnitElementImpl element) {
+    for (FunctionElement function in element.functions) {
+      if (function.isEntryPoint) {
+        return function;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the name of the library that the given part is declared to be a
+   * part of, or `null` if the part does not contain a part-of directive.
+   */
+  String _getPartLibraryName(Source partSource, CompilationUnit partUnit,
+      List<Directive> directivesToResolve) {
+    for (Directive directive in partUnit.directives) {
+      if (directive is PartOfDirective) {
+        directivesToResolve.add(directive);
+        LibraryIdentifier libraryName = directive.libraryName;
+        if (libraryName != null) {
+          return libraryName.name;
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Look through all of the compilation units defined for the given [library],
+   * looking for getters and setters that are defined in different compilation
+   * units but that have the same names. If any are found, make sure that they
+   * have the same variable element.
+   */
+  void _patchTopLevelAccessors(LibraryElementImpl library) {
+    HashMap<String, PropertyAccessorElement> getters =
+        new HashMap<String, PropertyAccessorElement>();
+    List<PropertyAccessorElement> setters = <PropertyAccessorElement>[];
+    _collectAccessors(getters, setters, library.definingCompilationUnit);
+    for (CompilationUnitElement unit in library.parts) {
+      _collectAccessors(getters, setters, unit);
+    }
+    for (PropertyAccessorElement setter in setters) {
+      PropertyAccessorElement getter = getters[setter.displayName];
+      if (getter != null) {
+        TopLevelVariableElementImpl variable = getter.variable;
+        TopLevelVariableElementImpl setterVariable = setter.variable;
+        CompilationUnitElementImpl setterUnit = setterVariable.enclosingElement;
+        setterUnit.replaceTopLevelVariable(setterVariable, variable);
+        variable.setter = setter;
+        (setter as PropertyAccessorElementImpl).variable = variable;
+      }
+    }
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the given
+   * [libSource].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    Source source = target;
+    return <String, TaskInput>{
+      DEFINING_UNIT_INPUT:
+          RESOLVED_UNIT1.of(new LibrarySpecificUnit(source, source)),
+      PARTS_UNIT_INPUT: INCLUDED_PARTS.of(source).toList((Source unit) {
+        return RESOLVED_UNIT1.of(new LibrarySpecificUnit(source, unit));
+      })
+    };
+  }
+
+  /**
+   * Create a [BuildLibraryElementTask] based on the given [target] in the
+   * given [context].
+   */
+  static BuildLibraryElementTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new BuildLibraryElementTask(context, target);
+  }
+}
+
+/**
+ * A task that builds [PUBLIC_NAMESPACE] for a library.
+ */
+class BuildPublicNamespaceTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the input for [LIBRARY_ELEMENT2] of a library.
+   */
+  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'BuildPublicNamespaceTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[LIBRARY_ELEMENT3]);
+
+  BuildPublicNamespaceTask(
+      InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    LibraryElementImpl library = getRequiredInput(LIBRARY_INPUT);
+    library.publicNamespace = new PublicNamespaceBuilder().build(library);
+    outputs[LIBRARY_ELEMENT3] = library;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given library [libSource].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    Source source = target;
+    return <String, TaskInput>{LIBRARY_INPUT: LIBRARY_ELEMENT2.of(source)};
+  }
+
+  /**
+   * Create a [BuildPublicNamespaceTask] based on the given [target] in
+   * the given [context].
+   */
+  static BuildPublicNamespaceTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new BuildPublicNamespaceTask(context, target);
+  }
+}
+
+/**
+ * A task that builds [EXPORT_SOURCE_CLOSURE] of a library.
+ */
+class BuildSourceExportClosureTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the export closure.
+   */
+  static const String EXPORT_INPUT = 'EXPORT_INPUT';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'BuildSourceExportClosureTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[EXPORT_SOURCE_CLOSURE]);
+
+  BuildSourceExportClosureTask(
+      InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    List<Source> exportClosure = getRequiredInput(EXPORT_INPUT);
+    //
+    // Record output.
+    //
+    outputs[EXPORT_SOURCE_CLOSURE] = exportClosure;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given library [libSource].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    Source source = target;
+    return <String, TaskInput>{
+      EXPORT_INPUT: new _ExportSourceClosureTaskInput(source, LIBRARY_ELEMENT2)
+    };
+  }
+
+  /**
+   * Create a [BuildSourceExportClosureTask] based on the given [target] in
+   * the given [context].
+   */
+  static BuildSourceExportClosureTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new BuildSourceExportClosureTask(context, target);
+  }
+}
+
+/**
+ * A task that builds [IMPORT_EXPORT_SOURCE_CLOSURE] of a library, and also
+ * sets [IS_CLIENT].
+ */
+class BuildSourceImportExportClosureTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the import/export closure.
+   */
+  static const String IMPORT_EXPORT_INPUT = 'IMPORT_EXPORT_INPUT';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'BuildSourceImportExportClosureTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[IMPORT_EXPORT_SOURCE_CLOSURE, IS_CLIENT]);
+
+  BuildSourceImportExportClosureTask(
+      InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    List<Source> importExportClosure = getRequiredInput(IMPORT_EXPORT_INPUT);
+    Source htmlSource = context.sourceFactory.forUri(DartSdk.DART_HTML);
+    //
+    // Record outputs.
+    //
+    outputs[IMPORT_EXPORT_SOURCE_CLOSURE] = importExportClosure;
+    outputs[IS_CLIENT] = importExportClosure.contains(htmlSource);
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given library [libSource].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    Source source = target;
+    return <String, TaskInput>{
+      IMPORT_EXPORT_INPUT:
+          new _ImportExportSourceClosureTaskInput(source, LIBRARY_ELEMENT2)
+    };
+  }
+
+  /**
+   * Create a [BuildSourceImportExportClosureTask] based on the given [target]
+   * in the given [context].
+   */
+  static BuildSourceImportExportClosureTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new BuildSourceImportExportClosureTask(context, target);
+  }
+}
+
+/**
+ * A task that builds [TYPE_PROVIDER] for a context.
+ */
+class BuildTypeProviderTask extends SourceBasedAnalysisTask {
+  /**
+   * The [PUBLIC_NAMESPACE] input of the `dart:core` library.
+   */
+  static const String CORE_INPUT = 'CORE_INPUT';
+
+  /**
+   * The [PUBLIC_NAMESPACE] input of the `dart:async` library.
+   */
+  static const String ASYNC_INPUT = 'ASYNC_INPUT';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'BuildTypeProviderTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[TYPE_PROVIDER]);
+
+  BuildTypeProviderTask(
+      InternalAnalysisContext context, AnalysisContextTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    LibraryElement coreLibrary = getRequiredInput(CORE_INPUT);
+    LibraryElement asyncLibrary = getRequiredInput(ASYNC_INPUT);
+    Namespace coreNamespace = coreLibrary.publicNamespace;
+    Namespace asyncNamespace = asyncLibrary.publicNamespace;
+    //
+    // Record outputs.
+    //
+    TypeProvider typeProvider =
+        new TypeProviderImpl.forNamespaces(coreNamespace, asyncNamespace);
+    (context as InternalAnalysisContext).typeProvider = typeProvider;
+    outputs[TYPE_PROVIDER] = typeProvider;
+  }
+
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    AnalysisContextTarget contextTarget = target;
+    SourceFactory sourceFactory = contextTarget.context.sourceFactory;
+    Source coreSource = sourceFactory.forUri(DartSdk.DART_CORE);
+    Source asyncSource = sourceFactory.forUri(DartSdk.DART_ASYNC);
+    return <String, TaskInput>{
+      CORE_INPUT: LIBRARY_ELEMENT3.of(coreSource),
+      ASYNC_INPUT: LIBRARY_ELEMENT3.of(asyncSource)
+    };
+  }
+
+  /**
+   * Create a [BuildTypeProviderTask] based on the given [context].
+   */
+  static BuildTypeProviderTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new BuildTypeProviderTask(context, target);
+  }
+}
+
+/**
+ * A task that computes [CONSTANT_DEPENDENCIES] for a constant.
+ */
+class ComputeConstantDependenciesTask extends ConstantEvaluationAnalysisTask {
+  /**
+   * The name of the [RESOLVED_UNIT8] input.
+   */
+  static const String UNIT_INPUT = 'UNIT_INPUT';
+
+  /**
+   * The name of the [TYPE_PROVIDER] input.
+   */
+  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
+
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'ComputeConstantDependenciesTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[CONSTANT_DEPENDENCIES]);
+
+  ComputeConstantDependenciesTask(
+      InternalAnalysisContext context, ConstantEvaluationTarget constant)
+      : super(context, constant);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    //
+    // Prepare inputs.
+    //
+    // Note: UNIT_INPUT is not needed.  It is merely a bookkeeping dependency
+    // to ensure that resolution has occurred before we attempt to determine
+    // constant dependencies.
+    //
+    ConstantEvaluationTarget constant = target;
+    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
+    //
+    // Compute dependencies.
+    //
+    List<ConstantEvaluationTarget> dependencies = <ConstantEvaluationTarget>[];
+    new ConstantEvaluationEngine(typeProvider, context.declaredVariables)
+        .computeDependencies(constant, dependencies.add);
+    //
+    // Record outputs.
+    //
+    outputs[CONSTANT_DEPENDENCIES] = dependencies;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    if (target is Element) {
+      CompilationUnitElementImpl unit = target
+          .getAncestor((Element element) => element is CompilationUnitElement);
+      return <String, TaskInput>{
+        UNIT_INPUT: RESOLVED_UNIT8
+            .of(new LibrarySpecificUnit(unit.librarySource, target.source)),
+        TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
+      };
+    } else if (target is ConstantEvaluationTarget_Annotation) {
+      return <String, TaskInput>{
+        UNIT_INPUT: RESOLVED_UNIT8
+            .of(new LibrarySpecificUnit(target.librarySource, target.source)),
+        TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
+      };
+    }
+    throw new AnalysisException(
+        'Cannot build inputs for a ${target.runtimeType}');
+  }
+
+  /**
+   * Create a [ComputeConstantDependenciesTask] based on the given [target] in
+   * the given [context].
+   */
+  static ComputeConstantDependenciesTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new ComputeConstantDependenciesTask(context, target);
+  }
+}
+
+/**
+ * A task that computes the value of a constant ([CONSTANT_VALUE]) and
+ * stores it in the element model.
+ */
+class ComputeConstantValueTask extends ConstantEvaluationAnalysisTask {
+  /**
+   * The name of the input which ensures that dependent constants are evaluated
+   * before the target.
+   */
+  static const String DEPENDENCIES_INPUT = 'DEPENDENCIES_INPUT';
+
+  /**
+   * The name of the [TYPE_PROVIDER] input.
+   */
+  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
+
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'ComputeConstantValueTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[CONSTANT_VALUE]);
+
+  ComputeConstantValueTask(
+      InternalAnalysisContext context, ConstantEvaluationTarget constant)
+      : super(context, constant);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  bool get handlesDependencyCycles => true;
+
+  @override
+  void internalPerform() {
+    //
+    // Prepare inputs.
+    //
+    // Note: DEPENDENCIES_INPUT is not needed.  It is merely a bookkeeping
+    // dependency to ensure that the constants that this constant depends on
+    // are computed first.
+    ConstantEvaluationTarget constant = target;
+    AnalysisContext context = constant.context;
+    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
+    //
+    // Compute the value of the constant, or report an error if there was a
+    // cycle.
+    //
+    ConstantEvaluationEngine constantEvaluationEngine =
+        new ConstantEvaluationEngine(typeProvider, context.declaredVariables);
+    if (dependencyCycle == null) {
+      constantEvaluationEngine.computeConstantValue(constant);
+    } else {
+      List<ConstantEvaluationTarget> constantsInCycle =
+          <ConstantEvaluationTarget>[];
+      for (WorkItem workItem in dependencyCycle) {
+        if (workItem.descriptor == DESCRIPTOR) {
+          constantsInCycle.add(workItem.target);
+        }
+      }
+      assert(constantsInCycle.isNotEmpty);
+      constantEvaluationEngine.generateCycleError(constantsInCycle, constant);
+    }
+    //
+    // Record outputs.
+    //
+    outputs[CONSTANT_VALUE] = constant;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the given
+   * [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    ConstantEvaluationTarget evaluationTarget = target;
+    return <String, TaskInput>{
+      DEPENDENCIES_INPUT:
+          CONSTANT_DEPENDENCIES.of(evaluationTarget).toListOf(CONSTANT_VALUE),
+      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
+    };
+  }
+
+  /**
+   * Create a [ComputeConstantValueTask] based on the given [target] in the
+   * given [context].
+   */
+  static ComputeConstantValueTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new ComputeConstantValueTask(context, target);
+  }
+}
+
+/**
+ * A task that computes the [INFERABLE_STATIC_VARIABLE_DEPENDENCIES] for a
+ * static variable whose type should be inferred.
+ */
+class ComputeInferableStaticVariableDependenciesTask
+    extends ConstantEvaluationAnalysisTask {
+  /**
+   * The name of the [RESOLVED_UNIT5] input.
+   */
+  static const String UNIT_INPUT = 'UNIT_INPUT';
+
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'ComputeInferableStaticVariableDependenciesTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[INFERABLE_STATIC_VARIABLE_DEPENDENCIES]);
+
+  ComputeInferableStaticVariableDependenciesTask(
+      InternalAnalysisContext context, VariableElement variable)
+      : super(context, variable);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    //
+    // Prepare inputs.
+    //
+    VariableElement variable = target;
+    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
+    //
+    // Compute dependencies.
+    //
+    NodeLocator locator = new NodeLocator(variable.nameOffset);
+    AstNode node = locator.searchWithin(unit);
+    VariableDeclaration declaration =
+        node.getAncestor((AstNode ancestor) => ancestor is VariableDeclaration);
+    if (declaration == null || declaration.name != node) {
+      throw new AnalysisException(
+          "NodeLocator failed to find a variable's declaration");
+    }
+    VariableGatherer gatherer = new VariableGatherer(_isInferableStatic);
+    declaration.initializer.accept(gatherer);
+    //
+    // Record outputs.
+    //
+    outputs[INFERABLE_STATIC_VARIABLE_DEPENDENCIES] = gatherer.results.toList();
+  }
+
+  /**
+   * Return `true` if the given [variable] is a static variable whose type
+   * should be inferred.
+   */
+  bool _isInferableStatic(VariableElement variable) => variable.isStatic &&
+      variable.hasImplicitType &&
+      variable.initializer != null;
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    if (target is VariableElement) {
+      CompilationUnitElementImpl unit = target
+          .getAncestor((Element element) => element is CompilationUnitElement);
+      return <String, TaskInput>{
+        UNIT_INPUT: RESOLVED_UNIT5
+            .of(new LibrarySpecificUnit(unit.librarySource, unit.source))
+      };
+    }
+    throw new AnalysisException(
+        'Cannot build inputs for a ${target.runtimeType}');
+  }
+
+  /**
+   * Create a [ComputeInferableStaticVariableDependenciesTask] based on the
+   * given [target] in the given [context].
+   */
+  static ComputeInferableStaticVariableDependenciesTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new ComputeInferableStaticVariableDependenciesTask(context, target);
+  }
+}
+
+/**
+ * A base class for analysis tasks whose target is expected to be a
+ * [ConstantEvaluationTarget].
+ */
+abstract class ConstantEvaluationAnalysisTask extends AnalysisTask {
+  /**
+   * Initialize a newly created task to perform analysis within the given
+   * [context] in order to produce results for the given [constant].
+   */
+  ConstantEvaluationAnalysisTask(
+      AnalysisContext context, ConstantEvaluationTarget constant)
+      : super(context, constant);
+
+  @override
+  String get description {
+    Source source = target.source;
+    String sourceName = source == null ? '<unknown source>' : source.fullName;
+    return '${descriptor.name} for element $target in source $sourceName';
+  }
+}
+
+/**
+ * Interface for [AnalysisTarget]s for which constant evaluation can be
+ * performed.
+ */
+abstract class ConstantEvaluationTarget extends AnalysisTarget {
+  /**
+   * Return the [AnalysisContext] which should be used to evaluate this
+   * constant.
+   */
+  AnalysisContext get context;
+}
+
+/**
+ * A task that computes a list of the libraries containing the target source.
+ */
+class ContainingLibrariesTask extends SourceBasedAnalysisTask {
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'ContainingLibrariesTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[CONTAINING_LIBRARIES]);
+
+  ContainingLibrariesTask(
+      InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    // TODO(brianwilkerson) This value can change as new libraries are analyzed
+    // so we need some way of making sure that this result is removed from the
+    // cache appropriately.
+    Source source = getRequiredSource();
+    outputs[CONTAINING_LIBRARIES] = context.getLibrariesContaining(source);
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    return <String, TaskInput>{};
+  }
+
+  /**
+   * Create a [ContainingLibrariesTask] based on the given [target] in the given
+   * [context].
+   */
+  static ContainingLibrariesTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new ContainingLibrariesTask(context, target);
+  }
+}
+
+/**
+ * The description for a change in a Dart source.
+ */
+class DartDelta extends Delta {
+  bool hasDirectiveChange = false;
+
+  final Set<String> addedNames = new Set<String>();
+  final Set<String> changedNames = new Set<String>();
+  final Set<String> removedNames = new Set<String>();
+
+  final Set<Source> invalidatedSources = new Set<Source>();
+
+  DartDelta(Source source) : super(source) {
+    invalidatedSources.add(source);
+  }
+
+  void elementAdded(Element element) {
+    addedNames.add(element.name);
+  }
+
+  void elementChanged(Element element) {
+    changedNames.add(element.name);
+  }
+
+  void elementRemoved(Element element) {
+    removedNames.add(element.name);
+  }
+
+  bool isNameAffected(String name) {
+    return addedNames.contains(name) ||
+        changedNames.contains(name) ||
+        removedNames.contains(name);
+  }
+
+  bool nameChanged(String name) {
+    return changedNames.add(name);
+  }
+
+  @override
+  DeltaResult validate(InternalAnalysisContext context, AnalysisTarget target,
+      ResultDescriptor descriptor) {
+    if (hasDirectiveChange) {
+      return DeltaResult.INVALIDATE;
+    }
+    // Prepare target source.
+    Source targetSource = null;
+    if (target is Source) {
+      targetSource = target;
+    }
+    if (target is LibrarySpecificUnit) {
+      targetSource = target.library;
+    }
+    if (target is Element) {
+      targetSource = target.source;
+    }
+    // Keep results that are updated incrementally.
+    // If we want to analyze only some references to the source being changed,
+    // we need to keep the same instances of CompilationUnitElement and
+    // LibraryElement.
+    if (targetSource == source) {
+      if (ParseDartTask.DESCRIPTOR.results.contains(descriptor)) {
+        return DeltaResult.KEEP_CONTINUE;
+      }
+      if (BuildCompilationUnitElementTask.DESCRIPTOR.results
+          .contains(descriptor)) {
+        return DeltaResult.KEEP_CONTINUE;
+      }
+      if (BuildLibraryElementTask.DESCRIPTOR.results.contains(descriptor)) {
+        return DeltaResult.KEEP_CONTINUE;
+      }
+      return DeltaResult.INVALIDATE;
+    }
+    // Use the target library dependency information to decide whether
+    // the delta affects the library.
+    if (targetSource != null) {
+      List<Source> librarySources =
+          context.getLibrariesContaining(targetSource);
+      for (Source librarySource in librarySources) {
+        AnalysisCache cache = context.analysisCache;
+        ReferencedNames referencedNames =
+            cache.getValue(librarySource, REFERENCED_NAMES);
+        if (referencedNames == null) {
+          return DeltaResult.INVALIDATE;
+        }
+        referencedNames.addChangedElements(this);
+        if (referencedNames.isAffectedBy(this)) {
+          return DeltaResult.INVALIDATE;
+        }
+      }
+      return DeltaResult.STOP;
+    }
+    // We don't know what to do with the given target, invalidate it.
+    return DeltaResult.INVALIDATE;
+  }
+}
+
+/**
+ * A task that merges all of the errors for a single source into a single list
+ * of errors.
+ */
+class DartErrorsTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the [BUILD_DIRECTIVES_ERRORS] input.
+   */
+  static const String BUILD_DIRECTIVES_ERRORS_INPUT = 'BUILD_DIRECTIVES_ERRORS';
+
+  /**
+   * The name of the [BUILD_LIBRARY_ERRORS] input.
+   */
+  static const String BUILD_LIBRARY_ERRORS_INPUT = 'BUILD_LIBRARY_ERRORS';
+
+  /**
+   * The name of the [LIBRARY_UNIT_ERRORS] input.
+   */
+  static const String LIBRARY_UNIT_ERRORS_INPUT = 'LIBRARY_UNIT_ERRORS';
+
+  /**
+   * The name of the [PARSE_ERRORS] input.
+   */
+  static const String PARSE_ERRORS_INPUT = 'PARSE_ERRORS';
+
+  /**
+   * The name of the [SCAN_ERRORS] input.
+   */
+  static const String SCAN_ERRORS_INPUT = 'SCAN_ERRORS';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor('DartErrorsTask',
+      createTask, buildInputs, <ResultDescriptor>[DART_ERRORS]);
+
+  DartErrorsTask(InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    //
+    // Prepare inputs.
+    //
+    List<List<AnalysisError>> errorLists = <List<AnalysisError>>[];
+    errorLists.add(getRequiredInput(BUILD_DIRECTIVES_ERRORS_INPUT));
+    errorLists.add(getRequiredInput(BUILD_LIBRARY_ERRORS_INPUT));
+    errorLists.add(getRequiredInput(PARSE_ERRORS_INPUT));
+    errorLists.add(getRequiredInput(SCAN_ERRORS_INPUT));
+    Map<Source, List<AnalysisError>> unitErrors =
+        getRequiredInput(LIBRARY_UNIT_ERRORS_INPUT);
+    for (List<AnalysisError> errors in unitErrors.values) {
+      errorLists.add(errors);
+    }
+    //
+    // Record outputs.
+    //
+    outputs[DART_ERRORS] = AnalysisError.mergeLists(errorLists);
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    Source source = target;
+    return <String, TaskInput>{
+      BUILD_DIRECTIVES_ERRORS_INPUT: BUILD_DIRECTIVES_ERRORS.of(source),
+      BUILD_LIBRARY_ERRORS_INPUT: BUILD_LIBRARY_ERRORS.of(source),
+      PARSE_ERRORS_INPUT: PARSE_ERRORS.of(source),
+      SCAN_ERRORS_INPUT: SCAN_ERRORS.of(source),
+      LIBRARY_UNIT_ERRORS_INPUT:
+          CONTAINING_LIBRARIES.of(source).toMap((Source library) {
+        LibrarySpecificUnit unit = new LibrarySpecificUnit(library, source);
+        return LIBRARY_UNIT_ERRORS.of(unit);
+      })
+    };
+  }
+
+  /**
+   * Create a [DartErrorsTask] based on the given [target] in the given
+   * [context].
+   */
+  static DartErrorsTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new DartErrorsTask(context, target);
+  }
+}
+
+/**
+ * A task that builds [RESOLVED_UNIT] for a unit.
+ */
+class EvaluateUnitConstantsTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the [RESOLVED_UNIT8] input.
+   */
+  static const String UNIT_INPUT = 'UNIT_INPUT';
+
+  /**
+   * The name of the [CONSTANT_VALUE] input.
+   */
+  static const String CONSTANT_VALUES = 'CONSTANT_VALUES';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'EvaluateUnitConstantsTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[RESOLVED_UNIT]);
+
+  EvaluateUnitConstantsTask(AnalysisContext context, LibrarySpecificUnit target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    // No actual work needs to be performed; the task manager will ensure that
+    // all constants are evaluated before this method is called.
+    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
+    outputs[RESOLVED_UNIT] = unit;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    LibrarySpecificUnit unit = target;
+    return <String, TaskInput>{
+      'libraryElement': LIBRARY_ELEMENT.of(unit.library),
+      UNIT_INPUT: RESOLVED_UNIT8.of(unit),
+      CONSTANT_VALUES:
+          COMPILATION_UNIT_CONSTANTS.of(unit).toListOf(CONSTANT_VALUE)
+    };
+  }
+
+  /**
+   * Create an [EvaluateUnitConstantsTask] based on the given [target] in
+   * the given [context].
+   */
+  static EvaluateUnitConstantsTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new EvaluateUnitConstantsTask(context, target);
+  }
+}
+
+/**
+ * The helper for building the export [Namespace] of a [LibraryElement].
+ */
+class ExportNamespaceBuilder {
+  /**
+   * Build the export [Namespace] of the given [LibraryElement].
+   */
+  Namespace build(LibraryElement library) {
+    return new Namespace(
+        _createExportMapping(library, new HashSet<LibraryElement>()));
+  }
+
+  /**
+   * Create a mapping table representing the export namespace of the given
+   * [library].
+   *
+   * The given [visitedElements] a set of libraries that do not need to be
+   * visited when processing the export directives of the given library because
+   * all of the names defined by them will be added by another library.
+   */
+  HashMap<String, Element> _createExportMapping(
+      LibraryElement library, HashSet<LibraryElement> visitedElements) {
+    visitedElements.add(library);
+    try {
+      HashMap<String, Element> definedNames = new HashMap<String, Element>();
+      // Add names of the export directives.
+      for (ExportElement element in library.exports) {
+        LibraryElement exportedLibrary = element.exportedLibrary;
+        if (exportedLibrary != null &&
+            !visitedElements.contains(exportedLibrary)) {
+          //
+          // The exported library will be null if the URI does not reference a
+          // valid library.
+          //
+          HashMap<String, Element> exportedNames =
+              _createExportMapping(exportedLibrary, visitedElements);
+          exportedNames = _applyCombinators(exportedNames, element.combinators);
+          definedNames.addAll(exportedNames);
+        }
+      }
+      // Add names of the public namespace.
+      {
+        Namespace publicNamespace = library.publicNamespace;
+        if (publicNamespace != null) {
+          definedNames.addAll(publicNamespace.definedNames);
+        }
+      }
+      return definedNames;
+    } finally {
+      visitedElements.remove(library);
+    }
+  }
+
+  /**
+   * Apply the given [combinators] to all of the names in [definedNames].
+   */
+  static HashMap<String, Element> _applyCombinators(
+      HashMap<String, Element> definedNames,
+      List<NamespaceCombinator> combinators) {
+    for (NamespaceCombinator combinator in combinators) {
+      if (combinator is HideElementCombinator) {
+        _hide(definedNames, combinator.hiddenNames);
+      } else if (combinator is ShowElementCombinator) {
+        definedNames = _show(definedNames, combinator.shownNames);
+      }
+    }
+    return definedNames;
+  }
+
+  /**
+   * Hide all of the [hiddenNames] by removing them from the given
+   * [definedNames].
+   */
+  static void _hide(
+      HashMap<String, Element> definedNames, List<String> hiddenNames) {
+    for (String name in hiddenNames) {
+      definedNames.remove(name);
+      definedNames.remove('$name=');
+    }
+  }
+
+  /**
+   * Show only the given [shownNames] by removing all other names from the given
+   * [definedNames].
+   */
+  static HashMap<String, Element> _show(
+      HashMap<String, Element> definedNames, List<String> shownNames) {
+    HashMap<String, Element> newNames = new HashMap<String, Element>();
+    for (String name in shownNames) {
+      Element element = definedNames[name];
+      if (element != null) {
+        newNames[name] = element;
+      }
+      String setterName = '$name=';
+      element = definedNames[setterName];
+      if (element != null) {
+        newNames[setterName] = element;
+      }
+    }
+    return newNames;
+  }
+}
+
+/**
+ * A task that builds [USED_IMPORTED_ELEMENTS] for a unit.
+ */
+class GatherUsedImportedElementsTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the [RESOLVED_UNIT8] input.
+   */
+  static const String UNIT_INPUT = 'UNIT_INPUT';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'GatherUsedImportedElementsTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[USED_IMPORTED_ELEMENTS]);
+
+  GatherUsedImportedElementsTask(
+      InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
+    CompilationUnitElement unitElement = unit.element;
+    LibraryElement libraryElement = unitElement.library;
+    //
+    // Prepare used imported elements.
+    //
+    GatherUsedImportedElementsVisitor visitor =
+        new GatherUsedImportedElementsVisitor(libraryElement);
+    unit.accept(visitor);
+    //
+    // Record outputs.
+    //
+    outputs[USED_IMPORTED_ELEMENTS] = visitor.usedElements;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    LibrarySpecificUnit unit = target;
+    return <String, TaskInput>{UNIT_INPUT: RESOLVED_UNIT8.of(unit)};
+  }
+
+  /**
+   * Create a [GatherUsedImportedElementsTask] based on the given [target] in
+   * the given [context].
+   */
+  static GatherUsedImportedElementsTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new GatherUsedImportedElementsTask(context, target);
+  }
+}
+
+/**
+ * A task that builds [USED_LOCAL_ELEMENTS] for a unit.
+ */
+class GatherUsedLocalElementsTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the [RESOLVED_UNIT8] input.
+   */
+  static const String UNIT_INPUT = 'UNIT_INPUT';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'GatherUsedLocalElementsTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[USED_LOCAL_ELEMENTS]);
+
+  GatherUsedLocalElementsTask(
+      InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
+    CompilationUnitElement unitElement = unit.element;
+    LibraryElement libraryElement = unitElement.library;
+    //
+    // Prepare used local elements.
+    //
+    GatherUsedLocalElementsVisitor visitor =
+        new GatherUsedLocalElementsVisitor(libraryElement);
+    unit.accept(visitor);
+    //
+    // Record outputs.
+    //
+    outputs[USED_LOCAL_ELEMENTS] = visitor.usedElements;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    LibrarySpecificUnit unit = target;
+    return <String, TaskInput>{UNIT_INPUT: RESOLVED_UNIT8.of(unit)};
+  }
+
+  /**
+   * Create a [GatherUsedLocalElementsTask] based on the given [target] in
+   * the given [context].
+   */
+  static GatherUsedLocalElementsTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new GatherUsedLocalElementsTask(context, target);
+  }
+}
+
+/**
+ * A task that generates [HINTS] for a unit.
+ */
+class GenerateHintsTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the [RESOLVED_UNIT8] input.
+   */
+  static const String RESOLVED_UNIT_INPUT = 'RESOLVED_UNIT';
+
+  /**
+   * The name of a list of [USED_LOCAL_ELEMENTS] for each library unit input.
+   */
+  static const String USED_LOCAL_ELEMENTS_INPUT = 'USED_LOCAL_ELEMENTS';
+
+  /**
+   * The name of a list of [USED_IMPORTED_ELEMENTS] for each library unit input.
+   */
+  static const String USED_IMPORTED_ELEMENTS_INPUT = 'USED_IMPORTED_ELEMENTS';
+
+  /**
+   * The name of the [TYPE_PROVIDER] input.
+   */
+  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'GenerateHintsTask', createTask, buildInputs, <ResultDescriptor>[HINTS]);
+
+  GenerateHintsTask(InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    AnalysisOptions analysisOptions = context.analysisOptions;
+    if (!analysisOptions.hint) {
+      outputs[HINTS] = AnalysisError.NO_ERRORS;
+      return;
+    }
+    //
+    // Prepare collectors.
+    //
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    Source source = getRequiredSource();
+    ErrorReporter errorReporter = new ErrorReporter(errorListener, source);
+    //
+    // Prepare inputs.
+    //
+    CompilationUnit unit = getRequiredInput(RESOLVED_UNIT_INPUT);
+    List<UsedImportedElements> usedImportedElementsList =
+        getRequiredInput(USED_IMPORTED_ELEMENTS_INPUT);
+    List<UsedLocalElements> usedLocalElementsList =
+        getRequiredInput(USED_LOCAL_ELEMENTS_INPUT);
+    CompilationUnitElement unitElement = unit.element;
+    LibraryElement libraryElement = unitElement.library;
+    //
+    // Generate errors.
+    //
+    unit.accept(new DeadCodeVerifier(errorReporter));
+    // Verify imports.
+    {
+      ImportsVerifier verifier = new ImportsVerifier();
+      verifier.addImports(unit);
+      usedImportedElementsList.forEach(verifier.removeUsedElements);
+      verifier.generateDuplicateImportHints(errorReporter);
+      verifier.generateUnusedImportHints(errorReporter);
+    }
+    // Unused local elements.
+    {
+      UsedLocalElements usedElements =
+          new UsedLocalElements.merge(usedLocalElementsList);
+      UnusedLocalElementsVerifier visitor =
+          new UnusedLocalElementsVerifier(errorListener, usedElements);
+      unitElement.accept(visitor);
+    }
+    // Dart2js analysis.
+    if (analysisOptions.dart2jsHint) {
+      unit.accept(new Dart2JSVerifier(errorReporter));
+    }
+    // Dart best practices.
+    InheritanceManager inheritanceManager =
+        new InheritanceManager(libraryElement);
+    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
+    unit.accept(new BestPracticesVerifier(errorReporter, typeProvider));
+    unit.accept(new OverrideVerifier(errorReporter, inheritanceManager));
+    // Find to-do comments.
+    new ToDoFinder(errorReporter).findIn(unit);
+    //
+    // Record outputs.
+    //
+    outputs[HINTS] = errorListener.errors;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    LibrarySpecificUnit unit = target;
+    Source libSource = unit.library;
+    return <String, TaskInput>{
+      RESOLVED_UNIT_INPUT: RESOLVED_UNIT.of(unit),
+      USED_LOCAL_ELEMENTS_INPUT: UNITS.of(libSource).toList((unit) {
+        LibrarySpecificUnit target = new LibrarySpecificUnit(libSource, unit);
+        return USED_LOCAL_ELEMENTS.of(target);
+      }),
+      USED_IMPORTED_ELEMENTS_INPUT: UNITS.of(libSource).toList((unit) {
+        LibrarySpecificUnit target = new LibrarySpecificUnit(libSource, unit);
+        return USED_IMPORTED_ELEMENTS.of(target);
+      }),
+      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
+    };
+  }
+
+  /**
+   * Create a [GenerateHintsTask] based on the given [target] in
+   * the given [context].
+   */
+  static GenerateHintsTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new GenerateHintsTask(context, target);
+  }
+}
+
+/**
+ * An abstract class that defines utility methods that are useful for tasks
+ * operating on static variables.
+ */
+abstract class InferStaticVariableTask extends ConstantEvaluationAnalysisTask {
+  InferStaticVariableTask(
+      InternalAnalysisContext context, VariableElement variable)
+      : super(context, variable);
+
+  /**
+   * Return the declaration of the target within the given compilation [unit].
+   * Throw an exception if the declaration cannot be found.
+   */
+  VariableDeclaration getDeclaration(CompilationUnit unit) {
+    VariableElement variable = target;
+    NodeLocator locator = new NodeLocator(variable.nameOffset);
+    AstNode node = locator.searchWithin(unit);
+    VariableDeclaration declaration =
+        node.getAncestor((AstNode ancestor) => ancestor is VariableDeclaration);
+    if (declaration == null || declaration.name != node) {
+      throw new AnalysisException(
+          "Failed to find the declaration of the variable ${variable.displayName} in ${variable.source}");
+    }
+    return declaration;
+  }
+}
+
+/**
+ * A task that ensures that all of the inferrable static variables in a
+ * compilation unit have had their type inferred.
+ */
+class InferStaticVariableTypesInUnitTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the input whose value is the [RESOLVED_UNIT5] for the
+   * compilation unit.
+   */
+  static const String UNIT_INPUT = 'UNIT_INPUT';
+
+  /**
+   * The name of the input whose value is a list of the inferrable static
+   * variables whose types have been computed.
+   */
+  static const String INFERRED_VARIABLES_INPUT = 'INFERRED_VARIABLES_INPUT';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'InferStaticVariableTypesInUnitTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[RESOLVED_UNIT6]);
+
+  /**
+   * Initialize a newly created task to build a library element for the given
+   * [unit] in the given [context].
+   */
+  InferStaticVariableTypesInUnitTask(
+      InternalAnalysisContext context, LibrarySpecificUnit unit)
+      : super(context, unit);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    //
+    // Prepare inputs.
+    //
+    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
+    //
+    // Record outputs. There is no additional work to be done at this time
+    // because the work has implicitly been done by virtue of the task model
+    // preparing all of the inputs.
+    //
+    outputs[RESOLVED_UNIT6] = unit;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the given
+   * [libSource].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    LibrarySpecificUnit unit = target;
+    return <String, TaskInput>{
+      INFERRED_VARIABLES_INPUT: INFERABLE_STATIC_VARIABLES_IN_UNIT
+          .of(unit)
+          .toListOf(INFERRED_STATIC_VARIABLE),
+      UNIT_INPUT: RESOLVED_UNIT5.of(unit)
+    };
+  }
+
+  /**
+   * Create a [InferStaticVariableTypesInUnitTask] based on the given [target] in the
+   * given [context].
+   */
+  static InferStaticVariableTypesInUnitTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new InferStaticVariableTypesInUnitTask(context, target);
+  }
+}
+
+/**
+ * A task that computes the type of an inferrable static variable and
+ * stores it in the element model.
+ */
+class InferStaticVariableTypeTask extends InferStaticVariableTask {
+  /**
+   * The name of the input which ensures that dependent values have their type
+   * inferred before the target.
+   */
+  static const String DEPENDENCIES_INPUT = 'DEPENDENCIES_INPUT';
+
+  /**
+   * The name of the [TYPE_PROVIDER] input.
+   */
+  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
+
+  /**
+   * The name of the [RESOLVED_UNIT5] input.
+   */
+  static const String UNIT_INPUT = 'UNIT_INPUT';
+
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'InferStaticVariableTypeTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[INFERRED_STATIC_VARIABLE]);
+
+  InferStaticVariableTypeTask(
+      InternalAnalysisContext context, VariableElement variable)
+      : super(context, variable);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  bool get handlesDependencyCycles => true;
+
+  @override
+  void internalPerform() {
+    //
+    // Prepare inputs.
+    //
+    // Note: DEPENDENCIES_INPUT is not needed.  It is merely a bookkeeping
+    // dependency to ensure that the variables that this variable references
+    // have types inferred before inferring the type of this variable.
+    //
+    VariableElementImpl variable = target;
+    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
+    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
+    //
+    // Re-resolve the variable's initializer so that the inferred types of other
+    // variables will be propagated.
+    //
+    NodeLocator locator = new NodeLocator(variable.nameOffset);
+    AstNode node = locator.searchWithin(unit);
+    VariableDeclaration declaration =
+        node.getAncestor((AstNode ancestor) => ancestor is VariableDeclaration);
+    if (declaration == null || declaration.name != node) {
+      throw new AnalysisException(
+          "NodeLocator failed to find a variable's declaration");
+    }
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    Expression initializer = declaration.initializer;
+    ResolutionContext resolutionContext =
+        ResolutionContextBuilder.contextFor(initializer, errorListener);
+    ResolverVisitor visitor = new ResolverVisitor(
+        variable.library, variable.source, typeProvider, errorListener,
+        nameScope: resolutionContext.scope);
+    if (resolutionContext.enclosingClassDeclaration != null) {
+      visitor.prepareToResolveMembersInClass(
+          resolutionContext.enclosingClassDeclaration);
+    }
+    visitor.initForIncrementalResolution();
+    initializer.accept(visitor);
+    //
+    // Record the type of the variable.
+    //
+    DartType newType = initializer.staticType;
+    variable.type = newType;
+    (variable.initializer as ExecutableElementImpl).returnType = newType;
+    if (variable is PropertyInducingElementImpl) {
+      setReturnType(variable.getter, newType);
+      setParameterType(variable.setter, newType);
+    }
+    //
+    // Record outputs.
+    //
+    outputs[INFERRED_STATIC_VARIABLE] = variable;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the given
+   * [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    VariableElement variable = target;
+    LibrarySpecificUnit unit =
+        new LibrarySpecificUnit(variable.library.source, variable.source);
+    return <String, TaskInput>{
+      DEPENDENCIES_INPUT: INFERABLE_STATIC_VARIABLE_DEPENDENCIES
+          .of(variable)
+          .toListOf(INFERRED_STATIC_VARIABLE),
+      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request),
+      UNIT_INPUT: RESOLVED_UNIT5.of(unit)
+    };
+  }
+
+  /**
+   * Create a [InferStaticVariableTypeTask] based on the given [target] in the
+   * given [context].
+   */
+  static InferStaticVariableTypeTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new InferStaticVariableTypeTask(context, target);
+  }
+}
+
+/**
+ * A task computes all of the errors of all of the units for a single
+ * library source and sets the [LIBRARY_ERRORS_READY] flag.
+ */
+class LibraryErrorsReadyTask extends SourceBasedAnalysisTask {
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'LibraryErrorsReadyTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[LIBRARY_ERRORS_READY]);
+
+  LibraryErrorsReadyTask(InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    outputs[LIBRARY_ERRORS_READY] = true;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given [library].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    Source source = target;
+    return <String, TaskInput>{
+      'allErrors': UNITS.of(source).toListOf(DART_ERRORS)
+    };
+  }
+
+  /**
+   * Create a [LibraryErrorsReadyTask] based on the given [target] in the given
+   * [context].
+   */
+  static LibraryErrorsReadyTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new LibraryErrorsReadyTask(context, target);
+  }
+}
+
+/**
+ * A task that merges all of the errors for a single source into a single list
+ * of errors.
+ */
+class LibraryUnitErrorsTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the [HINTS] input.
+   */
+  static const String HINTS_INPUT = 'HINTS';
+
+  /**
+   * The name of the [RESOLVE_REFERENCES_ERRORS] input.
+   */
+  static const String RESOLVE_REFERENCES_ERRORS_INPUT =
+      'RESOLVE_REFERENCES_ERRORS';
+
+  /**
+   * The name of the [RESOLVE_TYPE_NAMES_ERRORS] input.
+   */
+  static const String RESOLVE_TYPE_NAMES_ERRORS_INPUT =
+      'RESOLVE_TYPE_NAMES_ERRORS';
+
+  /**
+   * The name of the [VARIABLE_REFERENCE_ERRORS] input.
+   */
+  static const String VARIABLE_REFERENCE_ERRORS_INPUT =
+      'VARIABLE_REFERENCE_ERRORS';
+
+  /**
+   * The name of the [VERIFY_ERRORS] input.
+   */
+  static const String VERIFY_ERRORS_INPUT = 'VERIFY_ERRORS';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'LibraryUnitErrorsTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[LIBRARY_UNIT_ERRORS]);
+
+  LibraryUnitErrorsTask(InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    //
+    // Prepare inputs.
+    //
+    List<List<AnalysisError>> errorLists = <List<AnalysisError>>[];
+    errorLists.add(getRequiredInput(HINTS_INPUT));
+    errorLists.add(getRequiredInput(RESOLVE_REFERENCES_ERRORS_INPUT));
+    errorLists.add(getRequiredInput(RESOLVE_TYPE_NAMES_ERRORS_INPUT));
+    errorLists.add(getRequiredInput(VARIABLE_REFERENCE_ERRORS_INPUT));
+    errorLists.add(getRequiredInput(VERIFY_ERRORS_INPUT));
+    //
+    // Record outputs.
+    //
+    outputs[LIBRARY_UNIT_ERRORS] = AnalysisError.mergeLists(errorLists);
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given [unit].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    LibrarySpecificUnit unit = target;
+    return <String, TaskInput>{
+      HINTS_INPUT: HINTS.of(unit),
+      RESOLVE_REFERENCES_ERRORS_INPUT: RESOLVE_REFERENCES_ERRORS.of(unit),
+      RESOLVE_TYPE_NAMES_ERRORS_INPUT: RESOLVE_TYPE_NAMES_ERRORS.of(unit),
+      VARIABLE_REFERENCE_ERRORS_INPUT: VARIABLE_REFERENCE_ERRORS.of(unit),
+      VERIFY_ERRORS_INPUT: VERIFY_ERRORS.of(unit)
+    };
+  }
+
+  /**
+   * Create a [LibraryUnitErrorsTask] based on the given [target] in the given
+   * [context].
+   */
+  static LibraryUnitErrorsTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new LibraryUnitErrorsTask(context, target);
+  }
+}
+
+/**
+ * A task that parses the content of a Dart file, producing an AST structure.
+ */
+class ParseDartTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the input whose value is the line information produced for the
+   * file.
+   */
+  static const String LINE_INFO_INPUT_NAME = 'LINE_INFO_INPUT_NAME';
+
+  /**
+   * The name of the input whose value is the modification time of the file.
+   */
+  static const String MODIFICATION_TIME_INPUT_NAME =
+      'MODIFICATION_TIME_INPUT_NAME';
+
+  /**
+   * The name of the input whose value is the token stream produced for the file.
+   */
+  static const String TOKEN_STREAM_INPUT_NAME = 'TOKEN_STREAM_INPUT_NAME';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'ParseDartTask', createTask, buildInputs, <ResultDescriptor>[
+    EXPLICITLY_IMPORTED_LIBRARIES,
+    EXPORTED_LIBRARIES,
+    IMPORTED_LIBRARIES,
+    INCLUDED_PARTS,
+    PARSE_ERRORS,
+    PARSED_UNIT,
+    SOURCE_KIND,
+    UNITS
+  ]);
+
+  /**
+   * Initialize a newly created task to parse the content of the Dart file
+   * associated with the given [target] in the given [context].
+   */
+  ParseDartTask(InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    Source source = getRequiredSource();
+    LineInfo lineInfo = getRequiredInput(LINE_INFO_INPUT_NAME);
+    int modificationTime = getRequiredInput(MODIFICATION_TIME_INPUT_NAME);
+    Token tokenStream = getRequiredInput(TOKEN_STREAM_INPUT_NAME);
+
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    Parser parser = new Parser(source, errorListener);
+    AnalysisOptions options = context.analysisOptions;
+    parser.parseFunctionBodies = options.analyzeFunctionBodiesPredicate(source);
+    parser.parseGenericMethods = options.enableGenericMethods;
+    CompilationUnit unit = parser.parseCompilationUnit(tokenStream);
+    unit.lineInfo = lineInfo;
+
+    bool hasNonPartOfDirective = false;
+    bool hasPartOfDirective = false;
+    HashSet<Source> explicitlyImportedSourceSet = new HashSet<Source>();
+    HashSet<Source> exportedSourceSet = new HashSet<Source>();
+    HashSet<Source> includedSourceSet = new HashSet<Source>();
+    for (Directive directive in unit.directives) {
+      if (directive is PartOfDirective) {
+        hasPartOfDirective = true;
+      } else {
+        hasNonPartOfDirective = true;
+        if (directive is UriBasedDirective) {
+          Source referencedSource =
+              resolveDirective(context, source, directive, errorListener);
+          if (referencedSource != null) {
+            if (directive is ExportDirective) {
+              exportedSourceSet.add(referencedSource);
+            } else if (directive is ImportDirective) {
+              explicitlyImportedSourceSet.add(referencedSource);
+            } else if (directive is PartDirective) {
+              includedSourceSet.add(referencedSource);
+            } else {
+              throw new AnalysisException(
+                  '$runtimeType failed to handle a ${directive.runtimeType}');
+            }
+          }
+        }
+      }
+    }
+    //
+    // Always include "dart:core" source.
+    //
+    HashSet<Source> importedSourceSet =
+        new HashSet.from(explicitlyImportedSourceSet);
+    Source coreLibrarySource = context.sourceFactory.forUri(DartSdk.DART_CORE);
+    importedSourceSet.add(coreLibrarySource);
+    //
+    // Compute kind.
+    //
+    SourceKind sourceKind = SourceKind.LIBRARY;
+    if (modificationTime == -1) {
+      sourceKind = SourceKind.UNKNOWN;
+    } else if (hasPartOfDirective && !hasNonPartOfDirective) {
+      sourceKind = SourceKind.PART;
+    }
+    //
+    // Record outputs.
+    //
+    List<Source> explicitlyImportedSources =
+        explicitlyImportedSourceSet.toList();
+    List<Source> exportedSources = exportedSourceSet.toList();
+    List<Source> importedSources = importedSourceSet.toList();
+    List<Source> includedSources = includedSourceSet.toList();
+    List<AnalysisError> parseErrors =
+        removeDuplicateErrors(errorListener.errors);
+    List<Source> unitSources = <Source>[source]..addAll(includedSourceSet);
+    outputs[EXPLICITLY_IMPORTED_LIBRARIES] = explicitlyImportedSources;
+    outputs[EXPORTED_LIBRARIES] = exportedSources;
+    outputs[IMPORTED_LIBRARIES] = importedSources;
+    outputs[INCLUDED_PARTS] = includedSources;
+    outputs[PARSE_ERRORS] = parseErrors;
+    outputs[PARSED_UNIT] = unit;
+    outputs[SOURCE_KIND] = sourceKind;
+    outputs[UNITS] = unitSources;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the given
+   * [source].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    return <String, TaskInput>{
+      LINE_INFO_INPUT_NAME: LINE_INFO.of(target),
+      MODIFICATION_TIME_INPUT_NAME: MODIFICATION_TIME.of(target),
+      TOKEN_STREAM_INPUT_NAME: TOKEN_STREAM.of(target)
+    };
+  }
+
+  /**
+   * Create a [ParseDartTask] based on the given [target] in the given
+   * [context].
+   */
+  static ParseDartTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new ParseDartTask(context, target);
+  }
+
+  /**
+   * Return the result of resolving the URI of the given URI-based [directive]
+   * against the URI of the given library, or `null` if the URI is not valid.
+   *
+   * Resolution is to be performed in the given [context]. Errors should be
+   * reported to the [errorListener].
+   */
+  static Source resolveDirective(AnalysisContext context, Source librarySource,
+      UriBasedDirective directive, AnalysisErrorListener errorListener) {
+    StringLiteral uriLiteral = directive.uri;
+    String uriContent = uriLiteral.stringValue;
+    if (uriContent != null) {
+      uriContent = uriContent.trim();
+      directive.uriContent = uriContent;
+    }
+    UriValidationCode code = directive.validate();
+    if (code == null) {
+      String encodedUriContent = Uri.encodeFull(uriContent);
+      Source source =
+          context.sourceFactory.resolveUri(librarySource, encodedUriContent);
+      directive.source = source;
+      return source;
+    }
+    if (code == UriValidationCode.URI_WITH_DART_EXT_SCHEME) {
+      return null;
+    }
+    if (code == UriValidationCode.URI_WITH_INTERPOLATION) {
+      errorListener.onError(new AnalysisError(librarySource, uriLiteral.offset,
+          uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION));
+      return null;
+    }
+    if (code == UriValidationCode.INVALID_URI) {
+      errorListener.onError(new AnalysisError(librarySource, uriLiteral.offset,
+          uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent]));
+      return null;
+    }
+    throw new AnalysisException('Failed to handle validation code: $code');
+  }
+}
+
+/**
+ * A task that builds [RESOLVED_UNIT5] for a unit.
+ */
+class PartiallyResolveUnitReferencesTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the [LIBRARY_ELEMENT5] input.
+   */
+  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
+
+  /**
+   * The name of the [RESOLVED_UNIT4] input.
+   */
+  static const String UNIT_INPUT = 'UNIT_INPUT';
+
+  /**
+   * The name of the [TYPE_PROVIDER] input.
+   */
+  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'PartiallyResolveUnitReferencesTask',
+      createTask,
+      buildInputs, <ResultDescriptor>[
+    CLASSES_IN_UNIT,
+    INFERABLE_STATIC_VARIABLES_IN_UNIT,
+    PARTIALLY_RESOLVE_REFERENCES_ERRORS,
+    RESOLVED_UNIT5
+  ]);
+
+  PartiallyResolveUnitReferencesTask(
+      InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    //
+    // Prepare inputs.
+    //
+    LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT);
+    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
+    CompilationUnitElement unitElement = unit.element;
+    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
+    //
+    // Resolve references.
+    //
+    InheritanceManager inheritanceManager =
+        new InheritanceManager(libraryElement);
+    // TODO(brianwilkerson) Improve performance by not resolving anything inside
+    // function bodies. Function bodies will be resolved later so this is wasted
+    // effort.
+    AstVisitor visitor = new ResolverVisitor(
+        libraryElement, unitElement.source, typeProvider, errorListener,
+        inheritanceManager: inheritanceManager);
+    unit.accept(visitor);
+    //
+    // Prepare targets for inference.
+    //
+    List<VariableElement> staticVariables = <VariableElement>[];
+    List<ClassElement> classes = <ClassElement>[];
+    if (context.analysisOptions.strongMode) {
+      InferrenceFinder inferrenceFinder = new InferrenceFinder();
+      unit.accept(inferrenceFinder);
+      staticVariables = inferrenceFinder.staticVariables;
+      classes = inferrenceFinder.classes;
+    }
+    //
+    // Record outputs.
+    //
+    outputs[CLASSES_IN_UNIT] = classes;
+    outputs[INFERABLE_STATIC_VARIABLES_IN_UNIT] = staticVariables;
+    outputs[PARTIALLY_RESOLVE_REFERENCES_ERRORS] =
+        removeDuplicateErrors(errorListener.errors);
+    outputs[RESOLVED_UNIT5] = unit;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    LibrarySpecificUnit unit = target;
+    return <String, TaskInput>{
+      'fullyBuiltLibraryElements': IMPORT_EXPORT_SOURCE_CLOSURE
+          .of(unit.library)
+          .toListOf(LIBRARY_ELEMENT5),
+      LIBRARY_INPUT: LIBRARY_ELEMENT5.of(unit.library),
+      UNIT_INPUT: RESOLVED_UNIT4.of(unit),
+      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
+    };
+  }
+
+  /**
+   * Create a [PartiallyResolveUnitReferencesTask] based on the given [target]
+   * in the given [context].
+   */
+  static PartiallyResolveUnitReferencesTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new PartiallyResolveUnitReferencesTask(context, target);
+  }
+}
+
+/**
+ * The helper for building the public [Namespace] of a [LibraryElement].
+ */
+class PublicNamespaceBuilder {
+  final HashMap<String, Element> definedNames = new HashMap<String, Element>();
+
+  /**
+   * Build a public [Namespace] of the given [library].
+   */
+  Namespace build(LibraryElement library) {
+    definedNames.clear();
+    _addPublicNames(library.definingCompilationUnit);
+    library.parts.forEach(_addPublicNames);
+    return new Namespace(definedNames);
+  }
+
+  /**
+   * Add the given [element] if it has a publicly visible name.
+   */
+  void _addIfPublic(Element element) {
+    String name = element.name;
+    if (name != null && !Scope.isPrivateName(name)) {
+      definedNames[name] = element;
+    }
+  }
+
+  /**
+   * Add all of the public top-level names that are defined in the given
+   * [compilationUnit].
+   */
+  void _addPublicNames(CompilationUnitElement compilationUnit) {
+    compilationUnit.accessors.forEach(_addIfPublic);
+    compilationUnit.enums.forEach(_addIfPublic);
+    compilationUnit.functions.forEach(_addIfPublic);
+    compilationUnit.functionTypeAliases.forEach(_addIfPublic);
+    compilationUnit.types.forEach(_addIfPublic);
+  }
+}
+
+/**
+ * Information about a library - which names it uses, which names it defines
+ * with their externally visible dependencies.
+ */
+class ReferencedNames {
+  final Set<String> names = new Set<String>();
+  final Map<String, Set<String>> userToDependsOn = <String, Set<String>>{};
+
+  /**
+   * Updates [delta] by adding names that are changed in this library.
+   */
+  void addChangedElements(DartDelta delta) {
+    bool hasProgress = true;
+    while (hasProgress) {
+      hasProgress = false;
+      userToDependsOn.forEach((user, dependencies) {
+        for (String dependency in dependencies) {
+          if (delta.isNameAffected(dependency)) {
+            if (delta.nameChanged(user)) {
+              hasProgress = true;
+            }
+          }
+        }
+      });
+    }
+  }
+
+  /**
+   * Returns `true` if the library described by this object is affected by
+   * the given [delta].
+   */
+  bool isAffectedBy(DartDelta delta) {
+    for (String name in names) {
+      if (delta.isNameAffected(name)) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+/**
+ * A builder for creating [ReferencedNames].
+ *
+ * TODO(scheglov) Record dependencies for all other top-level declarations.
+ */
+class ReferencedNamesBuilder extends RecursiveAstVisitor {
+  final ReferencedNames names;
+  int bodyLevel = 0;
+  Set<String> dependsOn;
+
+  ReferencedNamesBuilder(this.names);
+
+  ReferencedNames build(CompilationUnit unit) {
+    unit.accept(this);
+    return names;
+  }
+
+  @override
+  visitBlockFunctionBody(BlockFunctionBody node) {
+    try {
+      bodyLevel++;
+      super.visitBlockFunctionBody(node);
+    } finally {
+      bodyLevel--;
+    }
+  }
+
+  @override
+  visitClassDeclaration(ClassDeclaration node) {
+    dependsOn = new Set<String>();
+    super.visitClassDeclaration(node);
+    names.userToDependsOn[node.name.name] = dependsOn;
+    dependsOn = null;
+  }
+
+  @override
+  visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    try {
+      bodyLevel++;
+      super.visitExpressionFunctionBody(node);
+    } finally {
+      bodyLevel--;
+    }
+  }
+
+  @override
+  visitSimpleIdentifier(SimpleIdentifier node) {
+    if (!node.inDeclarationContext()) {
+      String name = node.name;
+      names.names.add(name);
+      if (dependsOn != null && bodyLevel == 0) {
+        dependsOn.add(name);
+      }
+    }
+  }
+}
+
+/**
+ * A task that finishes resolution by requesting [RESOLVED_UNIT_NO_CONSTANTS] for every
+ * unit in the libraries closure and produces [LIBRARY_ELEMENT].
+ */
+class ResolveLibraryReferencesTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the [LIBRARY_ELEMENT5] input.
+   */
+  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
+
+  /**
+   * The name of the list of [RESOLVED_UNIT8] input.
+   */
+  static const String UNITS_INPUT = 'UNITS_INPUT';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'ResolveLibraryReferencesTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[LIBRARY_ELEMENT, REFERENCED_NAMES]);
+
+  ResolveLibraryReferencesTask(
+      InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    //
+    // Prepare inputs.
+    //
+    LibraryElement library = getRequiredInput(LIBRARY_INPUT);
+    List<CompilationUnit> units = getRequiredInput(UNITS_INPUT);
+    // Compute referenced names.
+    ReferencedNames referencedNames = new ReferencedNames();
+    for (CompilationUnit unit in units) {
+      new ReferencedNamesBuilder(referencedNames).build(unit);
+    }
+    //
+    // Record outputs.
+    //
+    outputs[LIBRARY_ELEMENT] = library;
+    outputs[REFERENCED_NAMES] = referencedNames;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    Source source = target;
+    return <String, TaskInput>{
+      LIBRARY_INPUT: LIBRARY_ELEMENT5.of(source),
+      UNITS_INPUT: UNITS.of(source).toList((Source unit) =>
+          RESOLVED_UNIT8.of(new LibrarySpecificUnit(source, unit))),
+      'resolvedUnits': IMPORT_EXPORT_SOURCE_CLOSURE
+          .of(source)
+          .toMapOf(UNITS)
+          .toFlattenList((Source library, Source unit) =>
+              RESOLVED_UNIT8.of(new LibrarySpecificUnit(library, unit))),
+    };
+  }
+
+  /**
+   * Create a [ResolveLibraryReferencesTask] based on the given [target] in
+   * the given [context].
+   */
+  static ResolveLibraryReferencesTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new ResolveLibraryReferencesTask(context, target);
+  }
+}
+
+/**
+ * An artifitial task that does nothing except to force type names resolution
+ * for the defining and part units of a library.
+ */
+class ResolveLibraryTypeNamesTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the [LIBRARY_ELEMENT4] input.
+   */
+  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'ResolveLibraryTypeNamesTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[LIBRARY_ELEMENT5]);
+
+  ResolveLibraryTypeNamesTask(
+      InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    LibraryElement library = getRequiredInput(LIBRARY_INPUT);
+    outputs[LIBRARY_ELEMENT5] = library;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    Source source = target;
+    return <String, TaskInput>{
+      'resolvedUnit': UNITS.of(source).toList((Source unit) =>
+          RESOLVED_UNIT3.of(new LibrarySpecificUnit(source, unit))),
+      LIBRARY_INPUT: LIBRARY_ELEMENT4.of(source)
+    };
+  }
+
+  /**
+   * Create a [ResolveLibraryTypeNamesTask] based on the given [target] in
+   * the given [context].
+   */
+  static ResolveLibraryTypeNamesTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new ResolveLibraryTypeNamesTask(context, target);
+  }
+}
+
+/**
+ * A task that builds [RESOLVED_UNIT8] for a unit.
+ */
+class ResolveUnitReferencesTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the [LIBRARY_ELEMENT5] input.
+   */
+  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
+
+  /**
+   * The name of the [RESOLVED_UNIT4] input.
+   */
+  static const String UNIT_INPUT = 'UNIT_INPUT';
+
+  /**
+   * The name of the [TYPE_PROVIDER] input.
+   */
+  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'ResolveUnitReferencesTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[RESOLVE_REFERENCES_ERRORS, RESOLVED_UNIT8]);
+
+  ResolveUnitReferencesTask(
+      InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    //
+    // Prepare inputs.
+    //
+    LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT);
+    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
+    CompilationUnitElement unitElement = unit.element;
+    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
+    //
+    // Resolve references.
+    //
+    InheritanceManager inheritanceManager =
+        new InheritanceManager(libraryElement);
+    AstVisitor visitor = new ResolverVisitor(
+        libraryElement, unitElement.source, typeProvider, errorListener,
+        inheritanceManager: inheritanceManager);
+    unit.accept(visitor);
+    //
+    // Record outputs.
+    //
+    outputs[RESOLVE_REFERENCES_ERRORS] =
+        removeDuplicateErrors(errorListener.errors);
+    outputs[RESOLVED_UNIT8] = unit;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    LibrarySpecificUnit unit = target;
+    return <String, TaskInput>{
+      'fullyBuiltLibraryElements': IMPORT_EXPORT_SOURCE_CLOSURE
+          .of(unit.library)
+          .toListOf(LIBRARY_ELEMENT5),
+      LIBRARY_INPUT: LIBRARY_ELEMENT5.of(unit.library),
+      UNIT_INPUT: RESOLVED_UNIT4.of(unit),
+      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
+    };
+  }
+
+  /**
+   * Create a [ResolveUnitReferencesTask] based on the given [target] in
+   * the given [context].
+   */
+  static ResolveUnitReferencesTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new ResolveUnitReferencesTask(context, target);
+  }
+}
+
+/**
+ * A task that builds [RESOLVED_UNIT3] for a unit.
+ */
+class ResolveUnitTypeNamesTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the input whose value is the defining [LIBRARY_ELEMENT4].
+   */
+  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
+
+  /**
+   * The name of the [RESOLVED_UNIT2] input.
+   */
+  static const String UNIT_INPUT = 'UNIT_INPUT';
+
+  /**
+   * The name of the [TYPE_PROVIDER] input.
+   */
+  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'ResolveUnitTypeNamesTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[RESOLVE_TYPE_NAMES_ERRORS, RESOLVED_UNIT3]);
+
+  ResolveUnitTypeNamesTask(
+      InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    //
+    // Prepare inputs.
+    //
+    LibraryElement library = getRequiredInput(LIBRARY_INPUT);
+    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
+    CompilationUnitElement unitElement = unit.element;
+    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
+    //
+    // Resolve TypeName nodes.
+    //
+    TypeResolverVisitor visitor = new TypeResolverVisitor(
+        library, unitElement.source, typeProvider, errorListener);
+    unit.accept(visitor);
+    //
+    // Record outputs.
+    //
+    outputs[RESOLVE_TYPE_NAMES_ERRORS] =
+        removeDuplicateErrors(errorListener.errors);
+    outputs[RESOLVED_UNIT3] = unit;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    LibrarySpecificUnit unit = target;
+    return <String, TaskInput>{
+      'importsExportNamespace':
+          IMPORTED_LIBRARIES.of(unit.library).toMapOf(LIBRARY_ELEMENT4),
+      LIBRARY_INPUT: LIBRARY_ELEMENT4.of(unit.library),
+      UNIT_INPUT: RESOLVED_UNIT2.of(unit),
+      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
+    };
+  }
+
+  /**
+   * Create a [ResolveUnitTypeNamesTask] based on the given [target] in
+   * the given [context].
+   */
+  static ResolveUnitTypeNamesTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new ResolveUnitTypeNamesTask(context, target);
+  }
+}
+
+/**
+ * A task that builds [RESOLVED_UNIT4] for a unit.
+ */
+class ResolveVariableReferencesTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the [LIBRARY_ELEMENT1] input.
+   */
+  static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
+
+  /**
+   * The name of the [RESOLVED_UNIT3] input.
+   */
+  static const String UNIT_INPUT = 'UNIT_INPUT';
+
+  /**
+   * The name of the [TYPE_PROVIDER] input.
+   */
+  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'ResolveVariableReferencesTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[RESOLVED_UNIT4, VARIABLE_REFERENCE_ERRORS]);
+
+  ResolveVariableReferencesTask(
+      InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    //
+    // Prepare inputs.
+    //
+    LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT);
+    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
+    CompilationUnitElement unitElement = unit.element;
+    //
+    // Resolve local variables.
+    //
+    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
+    Scope nameScope = new LibraryScope(libraryElement, errorListener);
+    AstVisitor visitor = new VariableResolverVisitor(
+        libraryElement, unitElement.source, typeProvider, errorListener,
+        nameScope: nameScope);
+    unit.accept(visitor);
+    //
+    // Record outputs.
+    //
+    outputs[RESOLVED_UNIT4] = unit;
+    outputs[VARIABLE_REFERENCE_ERRORS] =
+        removeDuplicateErrors(errorListener.errors);
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    LibrarySpecificUnit unit = target;
+    return <String, TaskInput>{
+      LIBRARY_INPUT: LIBRARY_ELEMENT1.of(unit.library),
+      UNIT_INPUT: RESOLVED_UNIT1.of(unit),
+      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
+    };
+  }
+
+  /**
+   * Create a [ResolveVariableReferencesTask] based on the given [target] in
+   * the given [context].
+   */
+  static ResolveVariableReferencesTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new ResolveVariableReferencesTask(context, target);
+  }
+}
+
+/**
+ * A task that scans the content of a file, producing a set of Dart tokens.
+ */
+class ScanDartTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the input whose value is the content of the file.
+   */
+  static const String CONTENT_INPUT_NAME = 'CONTENT_INPUT_NAME';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
+      'ScanDartTask',
+      createTask,
+      buildInputs,
+      <ResultDescriptor>[LINE_INFO, SCAN_ERRORS, TOKEN_STREAM]);
+
+  /**
+   * Initialize a newly created task to access the content of the source
+   * associated with the given [target] in the given [context].
+   */
+  ScanDartTask(InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    Source source = getRequiredSource();
+
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    if (context.getModificationStamp(target.source) < 0) {
+      String message = 'Content could not be read';
+      if (context is InternalAnalysisContext) {
+        CacheEntry entry =
+            (context as InternalAnalysisContext).getCacheEntry(target);
+        CaughtException exception = entry.exception;
+        if (exception != null) {
+          message = exception.toString();
+        }
+      }
+      errorListener.onError(new AnalysisError(
+          source, 0, 0, ScannerErrorCode.UNABLE_GET_CONTENT, [message]));
+    }
+    if (target is DartScript) {
+      DartScript script = target;
+      List<ScriptFragment> fragments = script.fragments;
+      if (fragments.length < 1) {
+        throw new AnalysisException('Cannot scan scripts with no fragments');
+      } else if (fragments.length > 1) {
+        throw new AnalysisException(
+            'Cannot scan scripts with multiple fragments');
+      }
+      ScriptFragment fragment = fragments[0];
+
+      Scanner scanner = new Scanner(
+          source,
+          new SubSequenceReader(fragment.content, fragment.offset),
+          errorListener);
+      scanner.setSourceStart(fragment.line, fragment.column);
+      scanner.preserveComments = context.analysisOptions.preserveComments;
+
+      outputs[TOKEN_STREAM] = scanner.tokenize();
+      outputs[LINE_INFO] = new LineInfo(scanner.lineStarts);
+      outputs[SCAN_ERRORS] = removeDuplicateErrors(errorListener.errors);
+    } else if (target is Source) {
+      String content = getRequiredInput(CONTENT_INPUT_NAME);
+
+      Scanner scanner =
+          new Scanner(source, new CharSequenceReader(content), errorListener);
+      scanner.preserveComments = context.analysisOptions.preserveComments;
+
+      outputs[TOKEN_STREAM] = scanner.tokenize();
+      outputs[LINE_INFO] = new LineInfo(scanner.lineStarts);
+      outputs[SCAN_ERRORS] = removeDuplicateErrors(errorListener.errors);
+    } else {
+      throw new AnalysisException(
+          'Cannot scan Dart code from a ${target.runtimeType}');
+    }
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the given
+   * [source].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    if (target is Source) {
+      return <String, TaskInput>{CONTENT_INPUT_NAME: CONTENT.of(target)};
+    } else if (target is DartScript) {
+      // This task does not use the following input; it is included only to add
+      // a dependency between this value and the containing source so that when
+      // the containing source is modified these results will be invalidated.
+      return <String, TaskInput>{'-': DART_SCRIPTS.of(target.source)};
+    }
+    throw new AnalysisException(
+        'Cannot build inputs for a ${target.runtimeType}');
+  }
+
+  /**
+   * Create a [ScanDartTask] based on the given [target] in the given [context].
+   */
+  static ScanDartTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new ScanDartTask(context, target);
+  }
+}
+
+/**
+ * A task that builds [VERIFY_ERRORS] for a unit.
+ */
+class VerifyUnitTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the [RESOLVED_UNIT] input.
+   */
+  static const String UNIT_INPUT = 'UNIT_INPUT';
+
+  /**
+   * The name of the [TYPE_PROVIDER] input.
+   */
+  static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor('VerifyUnitTask',
+      createTask, buildInputs, <ResultDescriptor>[VERIFY_ERRORS]);
+
+  /**
+   * The [ErrorReporter] to report errors to.
+   */
+  ErrorReporter errorReporter;
+
+  VerifyUnitTask(InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+    Source source = getRequiredSource();
+    errorReporter = new ErrorReporter(errorListener, source);
+    //
+    // Prepare inputs.
+    //
+    TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
+    CompilationUnit unit = getRequiredInput(UNIT_INPUT);
+    CompilationUnitElement unitElement = unit.element;
+    LibraryElement libraryElement = unitElement.library;
+    //
+    // Validate the directives.
+    //
+    validateDirectives(unit);
+    //
+    // Use the ConstantVerifier to compute errors.
+    //
+    ConstantVerifier constantVerifier = new ConstantVerifier(
+        errorReporter, libraryElement, typeProvider, context.declaredVariables);
+    unit.accept(constantVerifier);
+    //
+    // Use the ErrorVerifier to compute errors.
+    //
+    ErrorVerifier errorVerifier = new ErrorVerifier(
+        errorReporter,
+        libraryElement,
+        typeProvider,
+        new InheritanceManager(libraryElement),
+        context.analysisOptions.enableSuperMixins);
+    unit.accept(errorVerifier);
+    //
+    // Record outputs.
+    //
+    outputs[VERIFY_ERRORS] = removeDuplicateErrors(errorListener.errors);
+  }
+
+  /**
+   * Check each directive in the given [unit] to see if the referenced source
+   * exists and report an error if it does not.
+   */
+  void validateDirectives(CompilationUnit unit) {
+    for (Directive directive in unit.directives) {
+      if (directive is UriBasedDirective) {
+        validateReferencedSource(directive);
+      }
+    }
+  }
+
+  /**
+   * Check the given [directive] to see if the referenced source exists and
+   * report an error if it does not.
+   */
+  void validateReferencedSource(UriBasedDirective directive) {
+    Source source = directive.source;
+    if (source != null) {
+      if (context.exists(source)) {
+        return;
+      }
+    } else {
+      // Don't report errors already reported by ParseDartTask.resolveDirective
+      if (directive.validate() != null) {
+        return;
+      }
+    }
+    StringLiteral uriLiteral = directive.uri;
+    errorReporter.reportErrorForNode(CompileTimeErrorCode.URI_DOES_NOT_EXIST,
+        uriLiteral, [directive.uriContent]);
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    LibrarySpecificUnit unit = target;
+    return <String, TaskInput>{
+      'resolvedUnits': IMPORT_EXPORT_SOURCE_CLOSURE
+          .of(unit.library)
+          .toMapOf(UNITS)
+          .toFlattenList((Source library, Source unit) =>
+              RESOLVED_UNIT.of(new LibrarySpecificUnit(library, unit))),
+      UNIT_INPUT: RESOLVED_UNIT.of(unit),
+      TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
+    };
+  }
+
+  /**
+   * Create a [VerifyUnitTask] based on the given [target] in
+   * the given [context].
+   */
+  static VerifyUnitTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new VerifyUnitTask(context, target);
+  }
+}
+
+/**
+ * A [TaskInput] whose value is a list of library sources exported directly
+ * or indirectly by the target [Source].
+ *
+ * [resultDescriptor] is the type of result which should be produced for each
+ * target [Source].
+ */
+class _ExportSourceClosureTaskInput extends TaskInputImpl<List<Source>> {
+  final Source target;
+  final ResultDescriptor resultDescriptor;
+
+  _ExportSourceClosureTaskInput(this.target, this.resultDescriptor);
+
+  @override
+  TaskInputBuilder<List<Source>> createBuilder() =>
+      new _SourceClosureTaskInputBuilder(
+          target, _SourceClosureKind.EXPORT, resultDescriptor);
+}
+
+/**
+ * A [TaskInput] whose value is a list of library sources imported or exported,
+ * directly or indirectly by the target [Source].
+ *
+ * [resultDescriptor] is the type of result which should be produced for each
+ * target [Source].
+ */
+class _ImportExportSourceClosureTaskInput extends TaskInputImpl<List<Source>> {
+  final Source target;
+  final ResultDescriptor resultDescriptor;
+
+  _ImportExportSourceClosureTaskInput(this.target, this.resultDescriptor);
+
+  @override
+  TaskInputBuilder<List<Source>> createBuilder() =>
+      new _SourceClosureTaskInputBuilder(
+          target, _SourceClosureKind.IMPORT_EXPORT, resultDescriptor);
+}
+
+/**
+ * A [TaskInput] whose value is a list of library sources imported directly
+ * or indirectly by the target [Source].
+ *
+ * [resultDescriptor] is the type of result which should be produced for each
+ * target [Source].
+ */
+class _ImportSourceClosureTaskInput extends TaskInputImpl<List<Source>> {
+  final Source target;
+  final ResultDescriptor resultDescriptor;
+
+  _ImportSourceClosureTaskInput(this.target, this.resultDescriptor);
+
+  @override
+  TaskInputBuilder<List<Source>> createBuilder() =>
+      new _SourceClosureTaskInputBuilder(
+          target, _SourceClosureKind.IMPORT, resultDescriptor);
+}
+
+/**
+ * The kind of the source closure to build.
+ */
+enum _SourceClosureKind { IMPORT, EXPORT, IMPORT_EXPORT }
+
+/**
+ * A [TaskInputBuilder] to build values for [_ImportSourceClosureTaskInput].
+ */
+class _SourceClosureTaskInputBuilder implements TaskInputBuilder<List<Source>> {
+  final _SourceClosureKind kind;
+  final Set<LibraryElement> _libraries = new HashSet<LibraryElement>();
+  final List<Source> _newSources = <Source>[];
+
+  @override
+  final ResultDescriptor currentResult;
+
+  Source currentTarget;
+
+  _SourceClosureTaskInputBuilder(
+      Source librarySource, this.kind, this.currentResult) {
+    _newSources.add(librarySource);
+  }
+
+  @override
+  void set currentValue(Object value) {
+    LibraryElement library = value;
+    if (_libraries.add(library)) {
+      if (kind == _SourceClosureKind.IMPORT ||
+          kind == _SourceClosureKind.IMPORT_EXPORT) {
+        for (ImportElement importElement in library.imports) {
+          Source importedSource = importElement.importedLibrary.source;
+          _newSources.add(importedSource);
+        }
+      }
+      if (kind == _SourceClosureKind.EXPORT ||
+          kind == _SourceClosureKind.IMPORT_EXPORT) {
+        for (ExportElement exportElement in library.exports) {
+          Source exportedSource = exportElement.exportedLibrary.source;
+          _newSources.add(exportedSource);
+        }
+      }
+    }
+  }
+
+  @override
+  List<Source> get inputValue {
+    return _libraries.map((LibraryElement library) => library.source).toList();
+  }
+
+  @override
+  void currentValueNotAvailable() {
+    // Nothing needs to be done.  moveNext() will simply go on to the next new
+    // source.
+  }
+
+  @override
+  bool moveNext() {
+    if (_newSources.isEmpty) {
+      return false;
+    }
+    currentTarget = _newSources.removeLast();
+    return true;
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/task/dart_work_manager.dart b/mojo/public/dart/third_party/analyzer/lib/src/task/dart_work_manager.dart
new file mode 100644
index 0000000..f813fe9
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/task/dart_work_manager.dart
@@ -0,0 +1,441 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.src.task.dart_work_manager;
+
+import 'dart:collection';
+
+import 'package:analyzer/src/context/cache.dart';
+import 'package:analyzer/src/generated/engine.dart'
+    show
+        AnalysisEngine,
+        AnalysisErrorInfo,
+        AnalysisErrorInfoImpl,
+        AnalysisOptions,
+        CacheState,
+        InternalAnalysisContext;
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/utilities_collection.dart';
+import 'package:analyzer/src/task/dart.dart';
+import 'package:analyzer/src/task/driver.dart';
+import 'package:analyzer/task/dart.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:analyzer/src/task/html.dart';
+
+/**
+ * The manager for Dart specific analysis.
+ */
+class DartWorkManager implements WorkManager {
+  /**
+   * The list of errors that are reported for raw Dart [Source]s.
+   */
+  static final List<ResultDescriptor> _SOURCE_ERRORS = <ResultDescriptor>[
+    BUILD_DIRECTIVES_ERRORS,
+    BUILD_LIBRARY_ERRORS,
+    PARSE_ERRORS,
+    SCAN_ERRORS
+  ];
+
+  /**
+   * The list of errors that are reported for raw Dart [LibrarySpecificUnit]s.
+   */
+  static final List<ResultDescriptor> _UNIT_ERRORS = <ResultDescriptor>[
+    HINTS,
+    RESOLVE_REFERENCES_ERRORS,
+    RESOLVE_TYPE_NAMES_ERRORS,
+    VARIABLE_REFERENCE_ERRORS,
+    VERIFY_ERRORS
+  ];
+
+  final InternalAnalysisContext context;
+
+  /**
+   * The [TargetedResult]s that should be computed with priority.
+   */
+  final LinkedHashSet<TargetedResult> priorityResultQueue =
+      new LinkedHashSet<TargetedResult>();
+
+  /**
+   * The sources whose kind we don't know yet.
+   */
+  final LinkedHashSet<Source> unknownSourceQueue = new LinkedHashSet<Source>();
+
+  /**
+   * The queue of library sources to process.
+   */
+  final LinkedHashSet<Source> librarySourceQueue = new LinkedHashSet<Source>();
+
+  /**
+   * A table mapping library sources to the part sources they include.
+   */
+  final HashMap<Source, List<Source>> libraryPartsMap =
+      new HashMap<Source, List<Source>>();
+
+  /**
+   * A table mapping part sources to the library sources that include them.
+   */
+  final HashMap<Source, List<Source>> partLibrariesMap =
+      new HashMap<Source, List<Source>>();
+
+  /**
+   * Initialize a newly created manager.
+   */
+  DartWorkManager(this.context) {
+    analysisCache.onResultInvalidated.listen((InvalidatedResult event) {
+      if (event.descriptor == LIBRARY_ERRORS_READY) {
+        CacheEntry entry = event.entry;
+        if (entry.getValue(SOURCE_KIND) == SourceKind.LIBRARY) {
+          librarySourceQueue.add(entry.target);
+        }
+      }
+    });
+  }
+
+  /**
+   * Returns the correctly typed result of `context.analysisCache`.
+   */
+  AnalysisCache get analysisCache => context.analysisCache;
+
+  /**
+   * The partition that contains analysis results that are not shared with other
+   * contexts.
+   */
+  CachePartition get privateAnalysisCachePartition =>
+      context.privateAnalysisCachePartition;
+
+  /**
+   * Specifies that the client want the given [result] of the given [target]
+   * to be computed with priority.
+   */
+  void addPriorityResult(AnalysisTarget target, ResultDescriptor result) {
+    priorityResultQueue.add(new TargetedResult(target, result));
+  }
+
+  @override
+  void applyChange(List<Source> addedSources, List<Source> changedSources,
+      List<Source> removedSources) {
+    addedSources = addedSources.where(_isDartSource).toList();
+    changedSources = changedSources.where(_isDartSource).toList();
+    removedSources = removedSources.where(_isDartSource).toList();
+    // unknown queue
+    unknownSourceQueue.addAll(addedSources);
+    unknownSourceQueue.addAll(changedSources);
+    unknownSourceQueue.removeAll(removedSources);
+    // library queue
+    librarySourceQueue.removeAll(changedSources);
+    librarySourceQueue.removeAll(removedSources);
+    // parts in libraries
+    for (Source changedSource in changedSources) {
+      _onLibrarySourceChangedOrRemoved(changedSource);
+    }
+    for (Source removedSource in removedSources) {
+      partLibrariesMap.remove(removedSource);
+      _onLibrarySourceChangedOrRemoved(removedSource);
+    }
+  }
+
+  @override
+  void applyPriorityTargets(List<AnalysisTarget> targets) {
+    // Unschedule the old targets.
+    List<TargetedResult> resultsToUnschedule = <TargetedResult>[];
+    for (TargetedResult result in priorityResultQueue) {
+      if (result.result == LIBRARY_ERRORS_READY) {
+        resultsToUnschedule.add(result);
+      }
+    }
+    priorityResultQueue.removeAll(resultsToUnschedule);
+    // Schedule new targets.
+    for (AnalysisTarget target in targets) {
+      if (_isDartSource(target)) {
+        SourceKind sourceKind = analysisCache.getValue(target, SOURCE_KIND);
+        if (sourceKind == SourceKind.UNKNOWN) {
+          addPriorityResult(target, SOURCE_KIND);
+        } else if (sourceKind == SourceKind.LIBRARY) {
+          _schedulePriorityLibrarySourceAnalysis(target);
+        } else if (sourceKind == SourceKind.PART) {
+          List<Source> libraries = context.getLibrariesContaining(target);
+          for (Source library in libraries) {
+            addPriorityResult(library, LIBRARY_ERRORS_READY);
+          }
+        }
+      }
+    }
+  }
+
+  @override
+  List<AnalysisError> getErrors(Source source) {
+    if (!_isDartSource(source) && source is! DartScript) {
+      return AnalysisError.NO_ERRORS;
+    }
+    // If analysis is finished, use all the errors.
+    if (analysisCache.getState(source, DART_ERRORS) == CacheState.VALID) {
+      return analysisCache.getValue(source, DART_ERRORS);
+    }
+    // If analysis is in progress, combine all known partial results.
+    List<AnalysisError> errors = <AnalysisError>[];
+    for (ResultDescriptor descriptor in _SOURCE_ERRORS) {
+      errors.addAll(analysisCache.getValue(source, descriptor));
+    }
+    for (Source library in context.getLibrariesContaining(source)) {
+      LibrarySpecificUnit unit = new LibrarySpecificUnit(library, source);
+      for (ResultDescriptor descriptor in _UNIT_ERRORS) {
+        errors.addAll(analysisCache.getValue(unit, descriptor));
+      }
+    }
+    return errors;
+  }
+
+  /**
+   * Returns libraries containing the given [part].
+   * Maybe empty, but not null.
+   */
+  List<Source> getLibrariesContainingPart(Source part) {
+    List<Source> libraries = partLibrariesMap[part];
+    return libraries != null ? libraries : Source.EMPTY_LIST;
+  }
+
+  @override
+  TargetedResult getNextResult() {
+    // Try to find a priority result to compute.
+    while (priorityResultQueue.isNotEmpty) {
+      TargetedResult result = priorityResultQueue.first;
+      if (!_needsComputing(result.target, result.result)) {
+        priorityResultQueue.remove(result);
+        continue;
+      }
+      return result;
+    }
+    // Try to find a new library to analyze.
+    while (librarySourceQueue.isNotEmpty) {
+      Source librarySource = librarySourceQueue.first;
+      // Maybe done with this library.
+      if (!_needsComputing(librarySource, LIBRARY_ERRORS_READY)) {
+        librarySourceQueue.remove(librarySource);
+        continue;
+      }
+      // Analyze this library.
+      return new TargetedResult(librarySource, LIBRARY_ERRORS_READY);
+    }
+    // No libraries in the queue, check whether there are sources to organize.
+    while (unknownSourceQueue.isNotEmpty) {
+      Source source = unknownSourceQueue.first;
+      // Maybe done with this source.
+      if (!_needsComputing(source, SOURCE_KIND)) {
+        unknownSourceQueue.remove(source);
+        continue;
+      }
+      // Compute the kind of this source.
+      return new TargetedResult(source, SOURCE_KIND);
+    }
+    // TODO(scheglov) Report errors for parts that remained in the queue after
+    // all libraries had been processed.
+    // No results to compute.
+    return null;
+  }
+
+  @override
+  WorkOrderPriority getNextResultPriority() {
+    if (priorityResultQueue.isNotEmpty) {
+      return WorkOrderPriority.PRIORITY;
+    }
+    if (unknownSourceQueue.isNotEmpty || librarySourceQueue.isNotEmpty) {
+      return WorkOrderPriority.NORMAL;
+    }
+    return WorkOrderPriority.NONE;
+  }
+
+  /**
+   * Notifies the manager about analysis options changes.
+   */
+  void onAnalysisOptionsChanged() {
+    _invalidateAllLocalResolutionInformation(false);
+  }
+
+  /**
+   * Notifies the manager about [SourceFactory] changes.
+   */
+  void onSourceFactoryChanged() {
+    _invalidateAllLocalResolutionInformation(true);
+  }
+
+  @override
+  void resultsComputed(
+      AnalysisTarget target, Map<ResultDescriptor, dynamic> outputs) {
+    // Organize sources.
+    if (_isDartSource(target)) {
+      Source source = target;
+      SourceKind kind = outputs[SOURCE_KIND];
+      if (kind != null) {
+        unknownSourceQueue.remove(source);
+        if (kind == SourceKind.LIBRARY) {
+          if (context.prioritySources.contains(source)) {
+            _schedulePriorityLibrarySourceAnalysis(source);
+          } else {
+            bool needErrors = _shouldErrorsBeComputed(source);
+            if (needErrors) {
+              librarySourceQueue.add(target);
+            }
+          }
+        }
+      }
+    }
+    // Update parts in libraries.
+    if (_isDartSource(target)) {
+      Source library = target;
+      List<Source> includedParts = outputs[INCLUDED_PARTS];
+      if (includedParts != null) {
+        libraryPartsMap[library] = includedParts;
+        for (Source part in includedParts) {
+          List<Source> libraries =
+              partLibrariesMap.putIfAbsent(part, () => <Source>[]);
+          if (!libraries.contains(library)) {
+            libraries.add(library);
+            _invalidateContainingLibraries(part);
+          }
+        }
+      }
+    }
+    // Update notice.
+    if (_isDartSource(target)) {
+      bool shouldSetErrors = false;
+      outputs.forEach((ResultDescriptor descriptor, value) {
+        if (descriptor == PARSED_UNIT && value != null) {
+          context.getNotice(target).parsedDartUnit = value;
+          shouldSetErrors = true;
+        }
+        if (descriptor == DART_ERRORS) {
+          shouldSetErrors = true;
+        }
+      });
+      if (shouldSetErrors) {
+        AnalysisErrorInfo info = context.getErrors(target);
+        context.getNotice(target).setErrors(info.errors, info.lineInfo);
+      }
+    }
+    if (target is LibrarySpecificUnit) {
+      Source source = target.source;
+      bool shouldSetErrors = false;
+      outputs.forEach((ResultDescriptor descriptor, value) {
+        if (descriptor == RESOLVED_UNIT && value != null) {
+          context.getNotice(source).resolvedDartUnit = value;
+          shouldSetErrors = true;
+        }
+      });
+      if (shouldSetErrors) {
+        AnalysisErrorInfo info = context.getErrors(source);
+        context.getNotice(source).setErrors(info.errors, info.lineInfo);
+      }
+    }
+  }
+
+  void unitIncrementallyResolved(Source librarySource, Source unitSource) {
+    librarySourceQueue.add(librarySource);
+  }
+
+  /**
+   * Invalidate all of the resolution results computed by this context. The flag
+   * [invalidateUris] should be `true` if the cached results of converting URIs
+   * to source files should also be invalidated.
+   */
+  void _invalidateAllLocalResolutionInformation(bool invalidateUris) {
+    CachePartition partition = privateAnalysisCachePartition;
+    // Prepare targets and values to invalidate.
+    List<Source> dartSources = <Source>[];
+    List<LibrarySpecificUnit> unitTargets = <LibrarySpecificUnit>[];
+    MapIterator<AnalysisTarget, CacheEntry> iterator = partition.iterator();
+    while (iterator.moveNext()) {
+      AnalysisTarget target = iterator.key;
+      // Optionally gather Dart sources to invalidate URIs resolution.
+      if (invalidateUris && _isDartSource(target)) {
+        dartSources.add(target);
+      }
+      // LibrarySpecificUnit(s) are roots of Dart resolution.
+      // When one is invalidated, invalidation is propagated to all resolution.
+      if (target is LibrarySpecificUnit) {
+        unitTargets.add(target);
+        Source library = target.library;
+        if (context.exists(library)) {
+          librarySourceQueue.add(library);
+        }
+      }
+    }
+    // Invalidate targets and values.
+    unitTargets.forEach(partition.remove);
+    for (Source dartSource in dartSources) {
+      CacheEntry entry = partition.get(dartSource);
+      if (dartSource != null) {
+        // TODO(scheglov) we invalidate too much.
+        // Would be nice to invalidate just URLs resolution.
+        entry.setState(PARSED_UNIT, CacheState.INVALID);
+        entry.setState(IMPORTED_LIBRARIES, CacheState.INVALID);
+        entry.setState(EXPLICITLY_IMPORTED_LIBRARIES, CacheState.INVALID);
+        entry.setState(EXPORTED_LIBRARIES, CacheState.INVALID);
+        entry.setState(INCLUDED_PARTS, CacheState.INVALID);
+      }
+    }
+  }
+
+  /**
+   * Invalidate  [CONTAINING_LIBRARIES] for the given [source].
+   * [CONTAINING_LIBRARIES] does not have dependencies, so we manage it here.
+   * The [source] may be a part, or a library whose contents is updated so
+   * will be a part.
+   */
+  void _invalidateContainingLibraries(Source source) {
+    CacheEntry entry = analysisCache.get(source);
+    if (entry != null) {
+      entry.setState(CONTAINING_LIBRARIES, CacheState.INVALID);
+    }
+  }
+
+  /**
+   * Returns `true` if the given [result] of the given [target] needs
+   * computing, i.e. it is not in the valid and not in the error state.
+   */
+  bool _needsComputing(AnalysisTarget target, ResultDescriptor result) {
+    CacheState state = analysisCache.getState(target, result);
+    return state != CacheState.VALID && state != CacheState.ERROR;
+  }
+
+  /**
+   * The given [library] source was changed or removed.
+   * Update [libraryPartsMap] and [partLibrariesMap].
+   */
+  void _onLibrarySourceChangedOrRemoved(Source library) {
+    List<Source> parts = libraryPartsMap.remove(library);
+    if (parts != null) {
+      for (Source part in parts) {
+        List<Source> libraries = partLibrariesMap[part];
+        if (libraries != null) {
+          libraries.remove(library);
+          _invalidateContainingLibraries(part);
+        }
+      }
+    }
+    _invalidateContainingLibraries(library);
+  }
+
+  /**
+   * Schedule computing [RESOLVED_UNIT] for the given [librarySource].
+   * If errors should be computed, then schedule [LIBRARY_ERRORS_READY] instead,
+   * it also computes [RESOLVED_UNIT] in process.
+   */
+  void _schedulePriorityLibrarySourceAnalysis(Source librarySource) {
+    bool needErrors = _shouldErrorsBeComputed(librarySource);
+    if (needErrors) {
+      addPriorityResult(librarySource, LIBRARY_ERRORS_READY);
+    } else {
+      var target = new LibrarySpecificUnit(librarySource, librarySource);
+      addPriorityResult(target, RESOLVED_UNIT);
+    }
+  }
+
+  bool _shouldErrorsBeComputed(Source source) =>
+      context.shouldErrorsBeAnalyzed(source, null);
+
+  static bool _isDartSource(AnalysisTarget target) {
+    return target is Source && AnalysisEngine.isDartFileName(target.fullName);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/task/driver.dart b/mojo/public/dart/third_party/analyzer/lib/src/task/driver.dart
new file mode 100644
index 0000000..e4210d5
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/task/driver.dart
@@ -0,0 +1,760 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.src.task.driver;
+
+import 'dart:async';
+import 'dart:collection';
+
+import 'package:analyzer/src/context/cache.dart';
+import 'package:analyzer/src/generated/engine.dart'
+    hide AnalysisTask, AnalysisContextImpl, WorkManager;
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/utilities_general.dart';
+import 'package:analyzer/src/task/inputs.dart';
+import 'package:analyzer/src/task/manager.dart';
+import 'package:analyzer/task/model.dart';
+
+final PerformanceTag workOrderMoveNextPerfTag =
+    new PerformanceTag('WorkOrder.moveNext');
+
+/**
+ * An object that is used to cause analysis to be performed until all of the
+ * required analysis information has been computed.
+ */
+class AnalysisDriver {
+  /**
+   * The task manager used to figure out how to compute analysis results.
+   */
+  final TaskManager taskManager;
+
+  /**
+   * The list of [WorkManager] used to figure out which analysis results to
+   * compute.
+   */
+  final List<WorkManager> workManagers;
+
+  /**
+   * The context in which analysis is to be performed.
+   */
+  final InternalAnalysisContext context;
+
+  /**
+   * The map of [ComputedResult] controllers.
+   */
+  final Map<ResultDescriptor,
+          StreamController<ComputedResult>> resultComputedControllers =
+      <ResultDescriptor, StreamController<ComputedResult>>{};
+
+  /**
+   * The work order that was previously computed but that has not yet been
+   * completed.
+   */
+  WorkOrder currentWorkOrder;
+
+  /**
+   * Indicates whether any tasks are currently being performed (or building
+   * their inputs).  In debug builds, we use this to ensure that tasks don't
+   * try to make use of the task manager in reentrant fashion.
+   */
+  bool isTaskRunning = false;
+
+  /**
+   * The controller that is notified when a task is started.
+   */
+  StreamController<AnalysisTask> _onTaskStartedController;
+
+  /**
+   * The controller that is notified when a task is complete.
+   */
+  StreamController<AnalysisTask> _onTaskCompletedController;
+
+  /**
+   * Initialize a newly created driver to use the tasks know to the given
+   * [taskManager] to perform analysis in the given [context].
+   */
+  AnalysisDriver(this.taskManager, this.workManagers, this.context) {
+    _onTaskStartedController = new StreamController.broadcast();
+    _onTaskCompletedController = new StreamController.broadcast();
+  }
+
+  /**
+   * The stream that is notified when a task is complete.
+   */
+  Stream<AnalysisTask> get onTaskCompleted => _onTaskCompletedController.stream;
+
+  /**
+   * The stream that is notified when a task is started.
+   */
+  Stream<AnalysisTask> get onTaskStarted => _onTaskStartedController.stream;
+
+  /**
+   * Perform work until the given [result] has been computed for the given
+   * [target]. Return the last [AnalysisTask] that was performed.
+   */
+  AnalysisTask computeResult(AnalysisTarget target, ResultDescriptor result) {
+    assert(!isTaskRunning);
+    try {
+      isTaskRunning = true;
+      AnalysisTask task;
+      WorkOrder workOrder = createWorkOrderForResult(target, result);
+      if (workOrder != null) {
+        while (workOrder.moveNext()) {
+          task = performWorkItem(workOrder.current);
+        }
+      }
+      return task;
+    } finally {
+      isTaskRunning = false;
+    }
+  }
+
+  /**
+   * Return the work order describing the work that should be getting worked on,
+   * or `null` if there is currently no work to be done.
+   */
+  WorkOrder createNextWorkOrder() {
+    while (true) {
+      // Find the WorkManager with the highest priority.
+      WorkOrderPriority highestPriority = null;
+      WorkManager highestManager = null;
+      for (WorkManager manager in workManagers) {
+        WorkOrderPriority priority = manager.getNextResultPriority();
+        if (highestPriority == null || highestPriority.index > priority.index) {
+          highestPriority = priority;
+          highestManager = manager;
+        }
+      }
+      // Nothing to do.
+      if (highestPriority == WorkOrderPriority.NONE) {
+        return null;
+      }
+      // Create a new WorkOrder.
+      TargetedResult request = highestManager.getNextResult();
+//      print('request: $request');
+      if (request != null) {
+        WorkOrder workOrder =
+            createWorkOrderForResult(request.target, request.result);
+        if (workOrder != null) {
+          return workOrder;
+        }
+      }
+    }
+  }
+
+  /**
+   * Create a work order that will produce the given [result] for the given
+   * [target]. Return the work order that was created, or `null` if the result
+   * has already been computed.
+   */
+  WorkOrder createWorkOrderForResult(
+      AnalysisTarget target, ResultDescriptor result) {
+    CacheEntry entry = context.getCacheEntry(target);
+    CacheState state = entry.getState(result);
+    if (state == CacheState.VALID ||
+        state == CacheState.ERROR ||
+        state == CacheState.IN_PROCESS) {
+      return null;
+    }
+    TaskDescriptor taskDescriptor = taskManager.findTask(target, result);
+    try {
+      WorkItem workItem = new WorkItem(context, target, taskDescriptor, result);
+      return new WorkOrder(taskManager, workItem);
+    } catch (exception, stackTrace) {
+      throw new AnalysisException(
+          'Could not create work order (target = $target; taskDescriptor = $taskDescriptor; result = $result)',
+          new CaughtException(exception, stackTrace));
+    }
+  }
+
+  /**
+   * Create a work order that will produce the required analysis results for
+   * the given [target]. If [isPriority] is true, then the target is a priority
+   * target. Return the work order that was created, or `null` if there is no
+   * further work that needs to be done for the given target.
+   */
+  WorkOrder createWorkOrderForTarget(AnalysisTarget target, bool isPriority) {
+    for (ResultDescriptor result in taskManager.generalResults) {
+      WorkOrder workOrder = createWorkOrderForResult(target, result);
+      if (workOrder != null) {
+        return workOrder;
+      }
+    }
+    if (isPriority) {
+      for (ResultDescriptor result in taskManager.priorityResults) {
+        WorkOrder workOrder = createWorkOrderForResult(target, result);
+        if (workOrder != null) {
+          return workOrder;
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the stream that is notified when a new value for the given
+   * [descriptor] is computed.
+   */
+  Stream<ComputedResult> onResultComputed(ResultDescriptor descriptor) {
+    return resultComputedControllers
+        .putIfAbsent(descriptor,
+            () => new StreamController<ComputedResult>.broadcast(sync: true))
+        .stream;
+  }
+
+  /**
+   * Perform the next analysis task, and return `true` if there is more work to
+   * be done in order to compute all of the required analysis information.
+   */
+  bool performAnalysisTask() {
+    //
+    // TODO(brianwilkerson) This implementaiton does not allow us to prioritize
+    // work across contexts. What we need is a way for an external client to ask
+    // to have all priority files analyzed for each context, then ask for normal
+    // files to be analyzed. There are a couple of ways to do this.
+    //
+    // First, we could add a "bool priorityOnly" parameter to this method and
+    // return null here when it is true.
+    //
+    // Second, we could add a concept of a priority order and (externally) run
+    // through the priorities from highest to lowest. That would be a nice
+    // generalization of the previous idea, but it isn't clear that we need the
+    // generality.
+    //
+    // Third, we could move performAnalysisTask and createNextWorkOrder to an
+    // object that knows about all sources in all contexts, so that instead of
+    // the client choosing a context and telling it do to some work, the client
+    // simply says "do some work", and the engine chooses the best thing to do
+    // next regardless of what context it's in.
+    //
+    assert(!isTaskRunning);
+    try {
+      isTaskRunning = true;
+      if (currentWorkOrder == null) {
+        currentWorkOrder = createNextWorkOrder();
+      } else if (currentWorkOrder.moveNext()) {
+        performWorkItem(currentWorkOrder.current);
+      } else {
+        currentWorkOrder = createNextWorkOrder();
+      }
+      return currentWorkOrder != null;
+    } finally {
+      isTaskRunning = false;
+    }
+  }
+
+  /**
+   * Perform the given work item.
+   * Return the performed [AnalysisTask].
+   */
+  AnalysisTask performWorkItem(WorkItem item) {
+    if (item.exception != null) {
+      // Mark all of the results that the task would have computed as being in
+      // ERROR with the exception recorded on the work item.
+      CacheEntry targetEntry = context.getCacheEntry(item.target);
+      targetEntry.setErrorState(item.exception, item.descriptor.results);
+      return null;
+    }
+    // Otherwise, perform the task.
+    AnalysisTask task = item.buildTask();
+    _onTaskStartedController.add(task);
+    task.perform();
+    AnalysisTarget target = task.target;
+    CacheEntry entry = context.getCacheEntry(target);
+    if (task.caughtException == null) {
+      List<TargetedResult> dependedOn = item.inputTargetedResults.toList();
+      Map<ResultDescriptor, dynamic> outputs = task.outputs;
+      for (ResultDescriptor result in task.descriptor.results) {
+        // TODO(brianwilkerson) We could check here that a value was produced
+        // and throw an exception if not (unless we want to allow null values).
+        entry.setValue(result, outputs[result], dependedOn);
+      }
+      outputs.forEach((ResultDescriptor descriptor, value) {
+        StreamController<ComputedResult> controller =
+            resultComputedControllers[descriptor];
+        if (controller != null) {
+          ComputedResult event =
+              new ComputedResult(context, descriptor, target, value);
+          controller.add(event);
+        }
+      });
+      for (WorkManager manager in workManagers) {
+        manager.resultsComputed(target, outputs);
+      }
+    } else {
+      entry.setErrorState(task.caughtException, item.descriptor.results);
+    }
+    _onTaskCompletedController.add(task);
+    return task;
+  }
+
+  /**
+   * Reset the state of the driver in response to a change in the state of one
+   * or more analysis targets. This will cause any analysis that was currently
+   * in process to be stopped and for analysis to resume based on the new state.
+   */
+  void reset() {
+    currentWorkOrder = null;
+  }
+}
+
+/**
+ * Generic dependency walker suitable for use in the analysis task driver.
+ * This class implements a variant of the path-based strong component algorithm
+ * (described here: http://www.cs.colorado.edu/~hal/Papers/DFS/ipl.ps.gz), with
+ * the following differences:
+ *
+ * - The algorithm is non-recursive so that it can be used in a coroutine
+ *   fashion (each call to [getNextStronglyConnectedComponent] computes a
+ *   single strongly connected component and then waits to be called again)
+ *
+ * - Instead of keeping a temporary array which maps nodes to their locations
+ *   in the [path] array, we simply search the array when necessary.  This
+ *   allows us to begin finding strongly connected components without having to
+ *   know the size of the whole graph.
+ *
+ * - This algorithm does not compute all strongly connected components; only
+ *   those reachable from the starting point which are as yet unevaluated.
+ *
+ * The algorithm, in essence, is to traverse the dependency graph in
+ * depth-first fashion from a starting node.  If the path from the starting
+ * node ever encounters the same node twice, then a cycle has been found, and
+ * all the nodes comprising the cycle are (conceptually) contracted into a
+ * single node.  The algorithm yields possibly-collapsed nodes in proper
+ * topological sort order (all the dependencies of a node are yielded before,
+ * or in the same contracted component as, the node itself).
+ */
+abstract class CycleAwareDependencyWalker<Node> {
+  /**
+   * The path through the dependency graph that is currently being considered,
+   * with un-collapsed nodes.
+   */
+  final List<Node> _path;
+
+  /**
+   * For each node in [_path], a list of the unevaluated nodes which it is
+   * already known to depend on.
+   */
+  final List<List<Node>> _provisionalDependencies;
+
+  /**
+   * Indices into [_path] of the nodes which begin a new strongly connected
+   * component, in order.  The first index in [_contractedPath] is always 0.
+   *
+   * For all i < contractedPath.length - 1, at least one node in the strongly
+   * connected component represented by [contractedPath[i]] depends directly
+   * on at least one node in the strongly connected component represented by
+   * [contractedPath[i+1]].
+   */
+  final List<int> _contractedPath;
+
+  /**
+   * Index into [_path] of the nodes which we are currently in the process of
+   * querying for their dependencies.
+   *
+   * [currentIndices.last] always refers to a member of the last strongly
+   * connected component indicated by [_contractedPath].
+   */
+  final List<int> _currentIndices;
+
+  /**
+   * Begin walking dependencies starting at [startingNode].
+   */
+  CycleAwareDependencyWalker(Node startingNode)
+      : _path = <Node>[startingNode],
+        _provisionalDependencies = <List<Node>>[<Node>[]],
+        _contractedPath = <int>[0],
+        _currentIndices = <int>[0];
+
+  /**
+   * Determine the next unevaluated input for [node], skipping any inputs in
+   * [skipInputs], and return it.  If [node] has no further inputs, return
+   * `null`.
+   */
+  Node getNextInput(Node node, List<Node> skipInputs);
+
+  /**
+   * Determine the next strongly connected component in the graph, and return
+   * it.  The client is expected to evaluate this component before calling
+   * [getNextStronglyConnectedComponent] again.
+   */
+  StronglyConnectedComponent<Node> getNextStronglyConnectedComponent() {
+    while (_currentIndices.isNotEmpty) {
+      Node nextUnevaluatedInput = getNextInput(_path[_currentIndices.last],
+          _provisionalDependencies[_currentIndices.last]);
+      assert(!_provisionalDependencies[_currentIndices.last]
+          .contains(nextUnevaluatedInput));
+      if (nextUnevaluatedInput != null) {
+        // TODO(paulberry): the call to _path.indexOf makes the algorithm
+        // O(n^2) in the depth of the dependency graph.  If this becomes a
+        // problem, consider maintaining a map from node to index.
+        int previousIndex = _path.indexOf(nextUnevaluatedInput);
+        if (previousIndex != -1) {
+          // Update contractedPath to indicate that all nodes in the path
+          // between previousIndex and currentIndex are part of the same
+          // strongly connected component.
+          while (_contractedPath.last > previousIndex) {
+            _contractedPath.removeLast();
+          }
+          // Store nextUnevaluatedInput as a provisional dependency so that we
+          // can move on to computing other dependencies.
+          _provisionalDependencies[_currentIndices.last]
+              .add(nextUnevaluatedInput);
+          // And loop to move on to the node's next input.
+          continue;
+        } else {
+          // This is a brand new input and there's no reason (yet) to believe
+          // that it is in the same strongly connected component as any other
+          // node, so push it onto the end of the path.
+          int newIndex = _path.length;
+          _path.add(nextUnevaluatedInput);
+          _provisionalDependencies.add(<Node>[]);
+          _contractedPath.add(newIndex);
+          _currentIndices.add(newIndex);
+          // And loop to move on to the new node's inputs.
+          continue;
+        }
+      } else {
+        // The node has no more inputs.  Figure out if there are any more nodes
+        // in the current strongly connected component that need to have their
+        // indices examined.
+        _currentIndices.removeLast();
+        if (_currentIndices.isEmpty ||
+            _currentIndices.last < _contractedPath.last) {
+          // No more nodes in the current strongly connected component need to
+          // have their indices examined.  We can now yield this component to
+          // the caller.
+          List<Node> nodes = _path.sublist(_contractedPath.last);
+          bool containsCycle = nodes.length > 1;
+          if (!containsCycle) {
+            if (_provisionalDependencies.last.isNotEmpty) {
+              containsCycle = true;
+            }
+          }
+          _path.length = _contractedPath.last;
+          _provisionalDependencies.length = _contractedPath.last;
+          _contractedPath.removeLast();
+          return new StronglyConnectedComponent<Node>(nodes, containsCycle);
+        } else {
+          // At least one node in the current strongly connected component
+          // still needs to have its inputs examined.  So loop and allow the
+          // inputs to be examined.
+          continue;
+        }
+      }
+    }
+    // No further strongly connected components found.
+    return null;
+  }
+}
+
+/**
+ * A place to define the behaviors that need to be added to
+ * [InternalAnalysisContext].
+ */
+abstract class ExtendedAnalysisContext implements InternalAnalysisContext {
+  List<AnalysisTarget> get explicitTargets;
+  List<AnalysisTarget> get priorityTargets;
+  void set typeProvider(TypeProvider typeProvider);
+  CacheEntry getCacheEntry(AnalysisTarget target);
+}
+
+/**
+ * An exception indicating that an attempt was made to perform a task on a
+ * target while gathering the inputs to perform the same task for the same
+ * target.
+ */
+class InfiniteTaskLoopException extends AnalysisException {
+  /**
+   * If a dependency cycle was found while computing the inputs for the task,
+   * the set of [WorkItem]s contained in the cycle (if there are overlapping
+   * cycles, this is the set of all [WorkItem]s in the entire strongly
+   * connected component).  Otherwise, `null`.
+   */
+  final List<WorkItem> dependencyCycle;
+
+  /**
+   * Initialize a newly created exception to represent a failed attempt to
+   * perform the given [task] due to the given [dependencyCycle].
+   */
+  InfiniteTaskLoopException(AnalysisTask task, this.dependencyCycle)
+      : super(
+            'Infinite loop while performing task ${task.descriptor.name} for ${task.target}');
+}
+
+/**
+ * Object used by CycleAwareDependencyWalker to report a single strongly
+ * connected component of nodes.
+ */
+class StronglyConnectedComponent<Node> {
+  /**
+   * The nodes contained in the strongly connected component.
+   */
+  final List<Node> nodes;
+
+  /**
+   * Indicates whether the strongly component contains any cycles.  Note that
+   * if [nodes] has multiple elements, this will always be `true`.  However, if
+   * [nodes] has exactly one element, this may be either `true` or `false`
+   * depending on whether the node has a dependency on itself.
+   */
+  final bool containsCycle;
+
+  StronglyConnectedComponent(this.nodes, this.containsCycle);
+}
+
+/**
+ * A description of a single anaysis task that can be performed to advance
+ * analysis.
+ */
+class WorkItem {
+  /**
+   * The context in which the task will be performed.
+   */
+  final InternalAnalysisContext context;
+
+  /**
+   * The target for which a task is to be performed.
+   */
+  final AnalysisTarget target;
+
+  /**
+   * A description of the task to be performed.
+   */
+  final TaskDescriptor descriptor;
+
+  /**
+   * The [ResultDescriptor] which was led to this work item being spawned.
+   */
+  final ResultDescriptor spawningResult;
+
+  /**
+   * An iterator used to iterate over the descriptors of the inputs to the task,
+   * or `null` if all of the inputs have been collected and the task can be
+   * created.
+   */
+  TaskInputBuilder builder;
+
+  /**
+   * The [TargetedResult]s outputs of this task depends on.
+   */
+  final HashSet<TargetedResult> inputTargetedResults =
+      new HashSet<TargetedResult>();
+
+  /**
+   * The inputs to the task that have been computed.
+   */
+  Map<String, dynamic> inputs;
+
+  /**
+   * The exception that was found while trying to populate the inputs. If this
+   * field is non-`null`, then the task cannot be performed and all of the
+   * results that this task would have computed need to be marked as being in
+   * ERROR with this exception.
+   */
+  CaughtException exception = null;
+
+  /**
+   * If a dependency cycle was found while computing the inputs for the task,
+   * the set of [WorkItem]s contained in the cycle (if there are overlapping
+   * cycles, this is the set of all [WorkItem]s in the entire strongly
+   * connected component).  Otherwise, `null`.
+   */
+  List<WorkItem> dependencyCycle;
+
+  /**
+   * Initialize a newly created work item to compute the inputs for the task
+   * described by the given descriptor.
+   */
+  WorkItem(this.context, this.target, this.descriptor, this.spawningResult) {
+    AnalysisTarget actualTarget =
+        identical(target, AnalysisContextTarget.request)
+            ? new AnalysisContextTarget(context)
+            : target;
+    Map<String, TaskInput> inputDescriptors =
+        descriptor.createTaskInputs(actualTarget);
+    builder = new TopLevelTaskInputBuilder(inputDescriptors);
+    if (!builder.moveNext()) {
+      builder = null;
+    }
+    inputs = new HashMap<String, dynamic>();
+  }
+
+  @override
+  int get hashCode =>
+      JenkinsSmiHash.hash2(descriptor.hashCode, target.hashCode);
+
+  @override
+  bool operator ==(other) {
+    if (other is WorkItem) {
+      return this.descriptor == other.descriptor && this.target == other.target;
+    } else {
+      return false;
+    }
+  }
+
+  /**
+   * Build the task represented by this work item.
+   */
+  AnalysisTask buildTask() {
+    if (builder != null) {
+      throw new StateError("some inputs have not been computed");
+    }
+    AnalysisTask task = descriptor.createTask(context, target, inputs);
+    task.dependencyCycle = dependencyCycle;
+    return task;
+  }
+
+  /**
+   * Gather all of the inputs needed to perform the task.
+   *
+   * If at least one of the inputs have not yet been computed, return a work
+   * item that can be used to generate that input to indicate that the caller
+   * should perform the returned item's task before returning to gathering
+   * inputs for this item's task.
+   *
+   * If all of the inputs have been gathered, return `null` to indicate that the
+   * client should build and perform the task. A value of `null` will also be
+   * returned if some of the inputs cannot be computed and the task cannot be
+   * performed. Callers can differentiate between these cases by checking the
+   * [exception] field. If the field is `null`, then the task can be performed;
+   * if the field is non-`null` then the task cannot be performed and all of the
+   * tasks' results should be marked as being in ERROR.
+   */
+  WorkItem gatherInputs(TaskManager taskManager, List<WorkItem> skipInputs) {
+    while (builder != null) {
+      AnalysisTarget inputTarget = builder.currentTarget;
+      ResultDescriptor inputResult = builder.currentResult;
+      inputTargetedResults.add(new TargetedResult(inputTarget, inputResult));
+      CacheEntry inputEntry = context.getCacheEntry(inputTarget);
+      CacheState inputState = inputEntry.getState(inputResult);
+      if (skipInputs.any((WorkItem item) =>
+          item.target == inputTarget && item.spawningResult == inputResult)) {
+        // This input is being skipped due to a circular dependency.  Tell the
+        // builder that it's not available so we can move on to other inputs.
+        builder.currentValueNotAvailable();
+      } else if (inputState == CacheState.ERROR) {
+        exception = inputEntry.exception;
+        return null;
+      } else if (inputState == CacheState.IN_PROCESS) {
+        //
+        // TODO(brianwilkerson) Implement this case.
+        //
+        // One possibility would be to return a WorkItem that would perform a
+        // no-op task in order to cause us to come back to this work item on the
+        // next iteration. It would be more efficient, in general, to push this
+        // input onto a waiting list and proceed to the next input so that work
+        // could proceed, but given that the only result that can currently be
+        // IN_PROCESS is CONTENT, I don't know that it's worth the extra effort
+        // to implement the general solution at this point.
+        //
+        throw new UnimplementedError();
+      } else if (inputState != CacheState.VALID) {
+        try {
+          TaskDescriptor descriptor =
+              taskManager.findTask(inputTarget, inputResult);
+          return new WorkItem(context, inputTarget, descriptor, inputResult);
+        } on AnalysisException catch (exception, stackTrace) {
+          this.exception = new CaughtException(exception, stackTrace);
+          return null;
+        }
+      } else {
+        builder.currentValue = inputEntry.getValue(inputResult);
+      }
+      if (!builder.moveNext()) {
+        inputs = builder.inputValue;
+        builder = null;
+      }
+    }
+    return null;
+  }
+
+  @override
+  String toString() => 'Run $descriptor on $target';
+}
+
+/**
+ * A description of the work to be done to compute a desired analysis result.
+ * The class implements a lazy depth-first traversal of the work item's input.
+ */
+class WorkOrder implements Iterator<WorkItem> {
+  /**
+   * The dependency walker which is being used to determine what work to do
+   * next.
+   */
+  final _WorkOrderDependencyWalker _dependencyWalker;
+
+  /**
+   * The strongly connected component most recently returned by
+   * [_dependencyWalker], minus any [WorkItem]s that the iterator has already
+   * moved past.
+   *
+   * Null if the [_dependencyWalker] hasn't been used yet.
+   */
+  List<WorkItem> currentItems;
+
+  /**
+   * Initialize a newly created work order to compute the result described by
+   * the given work item.
+   */
+  WorkOrder(TaskManager taskManager, WorkItem item)
+      : _dependencyWalker = new _WorkOrderDependencyWalker(taskManager, item);
+
+  @override
+  WorkItem get current {
+    if (currentItems == null) {
+      return null;
+    } else {
+      return currentItems.last;
+    }
+  }
+
+  @override
+  bool moveNext() {
+    return workOrderMoveNextPerfTag.makeCurrentWhile(() {
+      if (currentItems != null && currentItems.length > 1) {
+        // Yield more items.
+        currentItems.removeLast();
+        return true;
+      } else {
+        // Get a new strongly connected component.
+        StronglyConnectedComponent<WorkItem> nextStronglyConnectedComponent =
+            _dependencyWalker.getNextStronglyConnectedComponent();
+        if (nextStronglyConnectedComponent == null) {
+          currentItems = null;
+          return false;
+        }
+        currentItems = nextStronglyConnectedComponent.nodes;
+        if (nextStronglyConnectedComponent.containsCycle) {
+          // A cycle has been found.
+          for (WorkItem item in currentItems) {
+            item.dependencyCycle = currentItems.toList();
+          }
+        } else {
+          assert(currentItems.length == 1);
+        }
+        return true;
+      }
+    });
+  }
+}
+
+/**
+ * Specilaization of [CycleAwareDependencyWalker] for use by [WorkOrder].
+ */
+class _WorkOrderDependencyWalker extends CycleAwareDependencyWalker<WorkItem> {
+  /**
+   * The task manager used to build work items.
+   */
+  final TaskManager taskManager;
+
+  _WorkOrderDependencyWalker(this.taskManager, WorkItem startingNode)
+      : super(startingNode);
+
+  @override
+  WorkItem getNextInput(WorkItem node, List<WorkItem> skipInputs) {
+    return node.gatherInputs(taskManager, skipInputs);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/task/general.dart b/mojo/public/dart/third_party/analyzer/lib/src/task/general.dart
new file mode 100644
index 0000000..72f80fd
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/task/general.dart
@@ -0,0 +1,81 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.src.task.general;
+
+import 'package:analyzer/src/generated/engine.dart' hide AnalysisTask;
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/task/general.dart';
+import 'package:analyzer/task/model.dart';
+
+/**
+ * A task that gets the contents of the source associated with an analysis
+ * target.
+ */
+class GetContentTask extends SourceBasedAnalysisTask {
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor('GetContentTask',
+      createTask, buildInputs, <ResultDescriptor>[CONTENT, MODIFICATION_TIME]);
+
+  /**
+   * Initialize a newly created task to access the content of the source
+   * associated with the given [target] in the given [context].
+   */
+  GetContentTask(AnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  internalPerform() {
+    Source source = getRequiredSource();
+    try {
+      TimestampedData<String> data = context.getContents(source);
+      outputs[CONTENT] = data.data;
+      outputs[MODIFICATION_TIME] = data.modificationTime;
+    } catch (exception) {
+      outputs[CONTENT] = '';
+      outputs[MODIFICATION_TIME] = -1;
+    }
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the given [target].
+   */
+  static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
+    return <String, TaskInput>{};
+  }
+
+  /**
+   * Create a [GetContentTask] based on the given [target] in the given
+   * [context].
+   */
+  static GetContentTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new GetContentTask(context, target);
+  }
+}
+
+/**
+ * A base class for analysis tasks whose target is expected to be a source.
+ */
+abstract class SourceBasedAnalysisTask extends AnalysisTask {
+  /**
+   * Initialize a newly created task to perform analysis within the given
+   * [context] in order to produce results for the given [target].
+   */
+  SourceBasedAnalysisTask(AnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  String get description {
+    Source source = target.source;
+    String sourceName = source == null ? '<unknown source>' : source.fullName;
+    return '${descriptor.name} for source $sourceName';
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/task/html.dart b/mojo/public/dart/third_party/analyzer/lib/src/task/html.dart
new file mode 100644
index 0000000..0722ed4
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/task/html.dart
@@ -0,0 +1,370 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.src.task.html;
+
+import 'dart:collection';
+
+import 'package:analyzer/src/generated/engine.dart' hide AnalysisTask;
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/task/dart.dart';
+import 'package:analyzer/src/task/general.dart';
+import 'package:analyzer/task/dart.dart';
+import 'package:analyzer/task/general.dart';
+import 'package:analyzer/task/html.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:html/dom.dart';
+import 'package:html/parser.dart';
+import 'package:source_span/source_span.dart';
+import 'package:analyzer/src/context/cache.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+
+/**
+ * The Dart scripts that are embedded in an HTML file.
+ */
+final ListResultDescriptor<DartScript> DART_SCRIPTS =
+    new ListResultDescriptor<DartScript>('DART_SCRIPTS', DartScript.EMPTY_LIST);
+
+/**
+ * The errors found while parsing an HTML file.
+ */
+final ListResultDescriptor<AnalysisError> HTML_DOCUMENT_ERRORS =
+    new ListResultDescriptor<AnalysisError>(
+        'HTML_DOCUMENT_ERRORS', AnalysisError.NO_ERRORS);
+
+/**
+ * A Dart script that is embedded in an HTML file.
+ */
+class DartScript implements Source {
+  /**
+   * An empty list of scripts.
+   */
+  static final List<DartScript> EMPTY_LIST = <DartScript>[];
+
+  /**
+   * The source containing this script.
+   */
+  final Source source;
+
+  /**
+   * The fragments that comprise this content of the script.
+   */
+  final List<ScriptFragment> fragments;
+
+  /**
+   * Initialize a newly created script in the given [source] that is composed of
+   * given [fragments].
+   */
+  DartScript(this.source, this.fragments);
+
+  @override
+  TimestampedData<String> get contents =>
+      new TimestampedData(modificationStamp, fragments[0].content);
+
+  @override
+  String get encoding => source.encoding;
+
+  @override
+  String get fullName => source.fullName;
+
+  @override
+  bool get isInSystemLibrary => source.isInSystemLibrary;
+
+  @override
+  int get modificationStamp => source.modificationStamp;
+
+  @override
+  String get shortName => source.shortName;
+
+  @override
+  Uri get uri => throw new StateError('uri not supported for scripts');
+
+  @override
+  UriKind get uriKind =>
+      throw new StateError('uriKind not supported for scripts');
+
+  @override
+  bool exists() => source.exists();
+
+  @override
+  Uri resolveRelativeUri(Uri relativeUri) =>
+      throw new StateError('resolveRelativeUri not supported for scripts');
+}
+
+/**
+ * A task that looks for Dart scripts in an HTML file and computes both the Dart
+ * libraries that are referenced by those scripts and the embedded Dart scripts.
+ */
+class DartScriptsTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the [HTML_DOCUMENT] input.
+   */
+  static const String DOCUMENT_INPUT = 'DOCUMENT';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor('DartScriptsTask',
+      createTask, buildInputs, <ResultDescriptor>[
+    DART_SCRIPTS,
+    REFERENCED_LIBRARIES
+  ]);
+
+  DartScriptsTask(InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    //
+    // Prepare inputs.
+    //
+    Source source = target.source;
+    Document document = getRequiredInput(DOCUMENT_INPUT);
+    //
+    // Process the script tags.
+    //
+    List<Source> libraries = <Source>[];
+    List<DartScript> inlineScripts = <DartScript>[];
+    List<Element> scripts = document.getElementsByTagName('script');
+    for (Element script in scripts) {
+      LinkedHashMap<dynamic, String> attributes = script.attributes;
+      if (attributes['type'] == 'application/dart') {
+        String src = attributes['src'];
+        if (src == null) {
+          if (script.hasContent()) {
+            List<ScriptFragment> fragments = <ScriptFragment>[];
+            for (Node node in script.nodes) {
+              if (node.nodeType == Node.TEXT_NODE) {
+                FileLocation start = node.sourceSpan.start;
+                fragments.add(new ScriptFragment(start.offset, start.line,
+                    start.column, (node as Text).data));
+              }
+            }
+            inlineScripts.add(new DartScript(source, fragments));
+          }
+        } else if (AnalysisEngine.isDartFileName(src)) {
+          Source source = context.sourceFactory.resolveUri(target.source, src);
+          if (source != null) {
+            libraries.add(source);
+          }
+        }
+      }
+    }
+    //
+    // Record outputs.
+    //
+    outputs[REFERENCED_LIBRARIES] =
+        libraries.isEmpty ? Source.EMPTY_LIST : libraries;
+    outputs[DART_SCRIPTS] =
+        inlineScripts.isEmpty ? DartScript.EMPTY_LIST : inlineScripts;
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given [target].
+   */
+  static Map<String, TaskInput> buildInputs(Source target) {
+    return <String, TaskInput>{DOCUMENT_INPUT: HTML_DOCUMENT.of(target)};
+  }
+
+  /**
+   * Create a [DartScriptsTask] based on the given [target] in the given
+   * [context].
+   */
+  static DartScriptsTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new DartScriptsTask(context, target);
+  }
+}
+
+/**
+ * A task that merges all of the errors for a single source into a single list
+ * of errors.
+ */
+class HtmlErrorsTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the input that is a list of errors from each of the embedded
+   * Dart scripts.
+   */
+  static const String DART_ERRORS_INPUT = 'DART_ERRORS';
+
+  /**
+   * The name of the [HTML_DOCUMENT_ERRORS] input.
+   */
+  static const String DOCUMENT_ERRORS_INPUT = 'DOCUMENT_ERRORS';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor('HtmlErrorsTask',
+      createTask, buildInputs, <ResultDescriptor>[HTML_ERRORS]);
+
+  HtmlErrorsTask(InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    //
+    // Prepare inputs.
+    //
+    List<List<AnalysisError>> dartErrors = getRequiredInput(DART_ERRORS_INPUT);
+    List<AnalysisError> documentErrors =
+        getRequiredInput(DOCUMENT_ERRORS_INPUT);
+    //
+    // Compute the error list.
+    //
+    List<AnalysisError> errors = <AnalysisError>[];
+    errors.addAll(documentErrors);
+    for (List<AnalysisError> scriptErrors in dartErrors) {
+      errors.addAll(scriptErrors);
+    }
+    //
+    // Record outputs.
+    //
+    outputs[HTML_ERRORS] = removeDuplicateErrors(errors);
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the
+   * given [target].
+   */
+  static Map<String, TaskInput> buildInputs(Source target) {
+    return <String, TaskInput>{
+      DOCUMENT_ERRORS_INPUT: HTML_DOCUMENT_ERRORS.of(target),
+      DART_ERRORS_INPUT: DART_SCRIPTS.of(target).toListOf(DART_ERRORS)
+    };
+  }
+
+  /**
+   * Create an [HtmlErrorsTask] based on the given [target] in the given
+   * [context].
+   */
+  static HtmlErrorsTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new HtmlErrorsTask(context, target);
+  }
+}
+
+/**
+ * A task that scans the content of a file, producing a set of Dart tokens.
+ */
+class ParseHtmlTask extends SourceBasedAnalysisTask {
+  /**
+   * The name of the input whose value is the content of the file.
+   */
+  static const String CONTENT_INPUT_NAME = 'CONTENT_INPUT_NAME';
+
+  /**
+   * The task descriptor describing this kind of task.
+   */
+  static final TaskDescriptor DESCRIPTOR = new TaskDescriptor('ParseHtmlTask',
+      createTask, buildInputs, <ResultDescriptor>[
+    HTML_DOCUMENT,
+    HTML_DOCUMENT_ERRORS
+  ]);
+
+  /**
+   * Initialize a newly created task to access the content of the source
+   * associated with the given [target] in the given [context].
+   */
+  ParseHtmlTask(InternalAnalysisContext context, AnalysisTarget target)
+      : super(context, target);
+
+  @override
+  TaskDescriptor get descriptor => DESCRIPTOR;
+
+  @override
+  void internalPerform() {
+    String content = getRequiredInput(CONTENT_INPUT_NAME);
+
+    if (context.getModificationStamp(target.source) < 0) {
+      String message = 'Content could not be read';
+      if (context is InternalAnalysisContext) {
+        CacheEntry entry = (context as InternalAnalysisContext).getCacheEntry(target);
+        CaughtException exception = entry.exception;
+        if (exception != null) {
+          message = exception.toString();
+        }
+      }
+
+      outputs[HTML_DOCUMENT] = new Document();
+      outputs[HTML_DOCUMENT_ERRORS] = <AnalysisError>[new AnalysisError(
+          target.source, 0, 0, ScannerErrorCode.UNABLE_GET_CONTENT, [message])];
+    } else {
+      HtmlParser parser = new HtmlParser(content, generateSpans: true);
+      parser.compatMode = 'quirks';
+      Document document = parser.parse();
+      List<ParseError> parseErrors = parser.errors;
+      List<AnalysisError> errors = <AnalysisError>[];
+      for (ParseError parseError in parseErrors) {
+        SourceSpan span = parseError.span;
+        errors.add(new AnalysisError(target.source, span.start.offset,
+            span.length, HtmlErrorCode.PARSE_ERROR, [parseError.message]));
+      }
+
+      outputs[HTML_DOCUMENT] = document;
+      outputs[HTML_DOCUMENT_ERRORS] = errors;
+    }
+  }
+
+  /**
+   * Return a map from the names of the inputs of this kind of task to the task
+   * input descriptors describing those inputs for a task with the given
+   * [source].
+   */
+  static Map<String, TaskInput> buildInputs(Source source) {
+    return <String, TaskInput>{CONTENT_INPUT_NAME: CONTENT.of(source)};
+  }
+
+  /**
+   * Create a [ParseHtmlTask] based on the given [target] in the given [context].
+   */
+  static ParseHtmlTask createTask(
+      AnalysisContext context, AnalysisTarget target) {
+    return new ParseHtmlTask(context, target);
+  }
+}
+
+/**
+ * A fragment of a [DartScript].
+ */
+class ScriptFragment {
+  /**
+   * The offset of the first character of the fragment, relative to the start of
+   * the containing source.
+   */
+  final int offset;
+
+  /**
+   * The line number of the line containing the first character of the fragment.
+   */
+  final int line;
+
+  /**
+   * The column number of the line containing the first character of the
+   * fragment.
+   */
+  final int column;
+
+  /**
+   * The content of the fragment.
+   */
+  final String content;
+
+  /**
+   * Initialize a newly created script fragment to have the given [offset] and
+   * [content].
+   */
+  ScriptFragment(this.offset, this.line, this.column, this.content);
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/task/html_work_manager.dart b/mojo/public/dart/third_party/analyzer/lib/src/task/html_work_manager.dart
new file mode 100644
index 0000000..faedfb2
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/task/html_work_manager.dart
@@ -0,0 +1,261 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.src.task.html_work_manager;
+
+import 'dart:collection';
+
+import 'package:analyzer/src/context/cache.dart';
+import 'package:analyzer/src/generated/engine.dart'
+    show
+        AnalysisEngine,
+        AnalysisErrorInfo,
+        AnalysisErrorInfoImpl,
+        AnalysisOptions,
+        CacheState,
+        InternalAnalysisContext;
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/utilities_collection.dart';
+import 'package:analyzer/src/task/driver.dart';
+import 'package:analyzer/src/task/html.dart';
+import 'package:analyzer/task/html.dart';
+import 'package:analyzer/task/model.dart';
+
+/**
+ * The manager for HTML specific analysis.
+ */
+class HtmlWorkManager implements WorkManager {
+  /**
+   * The context for which work is being managed.
+   */
+  final InternalAnalysisContext context;
+
+  /**
+   * The [TargetedResult]s that should be computed with priority.
+   */
+  final LinkedHashSet<TargetedResult> priorityResultQueue =
+      new LinkedHashSet<TargetedResult>();
+
+  /**
+   * The HTML sources.
+   */
+  final LinkedHashSet<Source> sourceQueue = new LinkedHashSet<Source>();
+
+  /**
+   * Initialize a newly created manager.
+   */
+  HtmlWorkManager(this.context) {
+    analysisCache.onResultInvalidated.listen(onResultInvalidated);
+  }
+
+  /**
+   * Returns the correctly typed result of `context.analysisCache`.
+   */
+  AnalysisCache get analysisCache => context.analysisCache;
+
+  /**
+   * The partition that contains analysis results that are not shared with other
+   * contexts.
+   */
+  CachePartition get privateAnalysisCachePartition =>
+      context.privateAnalysisCachePartition;
+
+  /**
+   * Specifies that the client want the given [result] of the given [target]
+   * to be computed with priority.
+   */
+  void addPriorityResult(AnalysisTarget target, ResultDescriptor result) {
+    priorityResultQueue.add(new TargetedResult(target, result));
+  }
+
+  @override
+  void applyChange(List<Source> addedSources, List<Source> changedSources,
+      List<Source> removedSources) {
+    addedSources = addedSources.where(_isHtmlSource).toList();
+    changedSources = changedSources.where(_isHtmlSource).toList();
+    removedSources = removedSources.where(_isHtmlSource).toList();
+    // source queue
+    sourceQueue.addAll(addedSources);
+    sourceQueue.addAll(changedSources);
+    sourceQueue.removeAll(removedSources);
+  }
+
+  @override
+  void applyPriorityTargets(List<AnalysisTarget> targets) {
+    // Unschedule the old targets.
+    List<TargetedResult> resultsToUnschedule = <TargetedResult>[];
+    for (TargetedResult result in priorityResultQueue) {
+      if (result.result == HTML_ERRORS) {
+        resultsToUnschedule.add(result);
+      }
+    }
+    priorityResultQueue.removeAll(resultsToUnschedule);
+    // Schedule new targets.
+    for (AnalysisTarget target in targets) {
+      if (_isHtmlSource(target)) {
+        addPriorityResult(target, HTML_ERRORS);
+      }
+    }
+  }
+
+  @override
+  List<AnalysisError> getErrors(Source source) {
+    if (!_isHtmlSource(source)) {
+      return AnalysisError.NO_ERRORS;
+    }
+    // If analysis is finished, use all the errors.
+    if (analysisCache.getState(source, HTML_ERRORS) == CacheState.VALID) {
+      return analysisCache.getValue(source, HTML_ERRORS);
+    }
+    // If analysis is in progress, combine all known partial results.
+    List<AnalysisError> errors = <AnalysisError>[];
+    errors.addAll(analysisCache.getValue(source, HTML_DOCUMENT_ERRORS));
+    List<DartScript> scripts = analysisCache.getValue(source, DART_SCRIPTS);
+    for (DartScript script in scripts) {
+      errors.addAll(context.getErrors(script).errors);
+    }
+    return errors;
+  }
+
+  @override
+  TargetedResult getNextResult() {
+    // Try to find a priority result to compute.
+    while (priorityResultQueue.isNotEmpty) {
+      TargetedResult result = priorityResultQueue.first;
+      if (!_needsComputing(result.target, result.result)) {
+        priorityResultQueue.remove(result);
+        continue;
+      }
+      return result;
+    }
+    // Try to find a new HTML file to analyze.
+    while (sourceQueue.isNotEmpty) {
+      Source htmlSource = sourceQueue.first;
+      // Maybe done with this library.
+      if (!_needsComputing(htmlSource, HTML_ERRORS)) {
+        sourceQueue.remove(htmlSource);
+        continue;
+      }
+      // Analyze this library.
+      return new TargetedResult(htmlSource, HTML_ERRORS);
+    }
+    // No results to compute.
+    return null;
+  }
+
+  @override
+  WorkOrderPriority getNextResultPriority() {
+    if (priorityResultQueue.isNotEmpty) {
+      return WorkOrderPriority.PRIORITY;
+    }
+    if (sourceQueue.isNotEmpty) {
+      return WorkOrderPriority.NORMAL;
+    }
+    return WorkOrderPriority.NONE;
+  }
+
+  /**
+   * Notifies the manager about analysis options changes.
+   */
+  void onAnalysisOptionsChanged() {
+    _invalidateAllLocalResolutionInformation(false);
+  }
+
+  /**
+   * Notifies the manager that a result has been invalidated.
+   */
+  onResultInvalidated(InvalidatedResult event) {
+    ResultDescriptor descriptor = event.descriptor;
+    if (descriptor == HTML_ERRORS) {
+      sourceQueue.add(event.entry.target);
+    } else if (descriptor == DART_SCRIPTS) {
+      // TODO(brianwilkerson) Remove the scripts from the DartWorkManager's
+      // queues.
+    }
+  }
+
+  /**
+   * Notifies the manager about [SourceFactory] changes.
+   */
+  void onSourceFactoryChanged() {
+    _invalidateAllLocalResolutionInformation(true);
+  }
+
+  @override
+  void resultsComputed(
+      AnalysisTarget target, Map<ResultDescriptor, dynamic> outputs) {
+    // Update notice.
+    if (_isHtmlSource(target)) {
+      bool shouldSetErrors = false;
+      outputs.forEach((ResultDescriptor descriptor, value) {
+        if (descriptor == HTML_ERRORS) {
+          shouldSetErrors = true;
+        } else if (descriptor == DART_SCRIPTS) {
+          // List<DartScript> scripts = value;
+          if (priorityResultQueue.contains(target)) {
+            // TODO(brianwilkerson) Add the scripts to the DartWorkManager's
+            // priority queue.
+          } else {
+            // TODO(brianwilkerson) Add the scripts to the DartWorkManager's
+            // library queue.
+          }
+        }
+      });
+      if (shouldSetErrors) {
+        AnalysisErrorInfo info = context.getErrors(target);
+        context.getNotice(target).setErrors(info.errors, info.lineInfo);
+      }
+    }
+  }
+
+  /**
+   * Invalidate all of the resolution results computed by this context. The flag
+   * [invalidateUris] should be `true` if the cached results of converting URIs
+   * to source files should also be invalidated.
+   */
+  void _invalidateAllLocalResolutionInformation(bool invalidateUris) {
+    CachePartition partition = privateAnalysisCachePartition;
+    // Prepare targets and values to invalidate.
+    List<Source> htmlSources = <Source>[];
+    List<DartScript> scriptTargets = <DartScript>[];
+    MapIterator<AnalysisTarget, CacheEntry> iterator = partition.iterator();
+    while (iterator.moveNext()) {
+      AnalysisTarget target = iterator.key;
+      if (_isHtmlSource(target)) {
+        htmlSources.add(target);
+      }
+      if (target is DartScript) {
+        scriptTargets.add(target);
+      }
+    }
+    // Invalidate targets and values.
+    scriptTargets.forEach(partition.remove);
+    for (Source htmlSource in htmlSources) {
+      CacheEntry entry = partition.get(htmlSource);
+      if (htmlSource != null) {
+        entry.setState(HTML_ERRORS, CacheState.INVALID);
+        if (invalidateUris) {
+          entry.setState(REFERENCED_LIBRARIES, CacheState.INVALID);
+        }
+      }
+    }
+  }
+
+  /**
+   * Returns `true` if the given [result] of the given [target] needs
+   * computing, i.e. it is not in the valid and not in the error state.
+   */
+  bool _needsComputing(AnalysisTarget target, ResultDescriptor result) {
+    CacheState state = analysisCache.getState(target, result);
+    return state != CacheState.VALID && state != CacheState.ERROR;
+  }
+
+  /**
+   * Return `true` if the given target is an HTML source.
+   */
+  static bool _isHtmlSource(AnalysisTarget target) {
+    return target is Source && AnalysisEngine.isHtmlFileName(target.fullName);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/task/incremental_element_builder.dart b/mojo/public/dart/third_party/analyzer/lib/src/task/incremental_element_builder.dart
new file mode 100644
index 0000000..bc562a7
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/task/incremental_element_builder.dart
@@ -0,0 +1,366 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.src.task.incremental_element_builder;
+
+import 'dart:collection';
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+/**
+ * The change of a single [CompilationUnitElement].
+ */
+class CompilationUnitElementDelta {
+  /**
+   * One or more directives were added/removed.
+   */
+  bool hasDirectiveChange = false;
+
+  /**
+   * The list of added top-level element.
+   */
+  final List<Element> addedDeclarations = <Element>[];
+
+  /**
+   * The list of removed top-level elements.
+   */
+  final List<Element> removedDeclarations = <Element>[];
+}
+
+/**
+ * Incrementally updates the existing [unitElement] and builds elements for
+ * the [newUnit].
+ */
+class IncrementalCompilationUnitElementBuilder {
+  final Source unitSource;
+  final Source librarySource;
+  final CompilationUnit oldUnit;
+  final CompilationUnitElementImpl unitElement;
+  final CompilationUnit newUnit;
+  final ElementHolder holder = new ElementHolder();
+
+  /**
+   * The change between element models of [oldUnit] and [newUnit].
+   */
+  final CompilationUnitElementDelta unitDelta =
+      new CompilationUnitElementDelta();
+
+  factory IncrementalCompilationUnitElementBuilder(
+      CompilationUnit oldUnit, CompilationUnit newUnit) {
+    CompilationUnitElementImpl unitElement = oldUnit.element;
+    return new IncrementalCompilationUnitElementBuilder._(unitElement.source,
+        unitElement.librarySource, oldUnit, newUnit, unitElement);
+  }
+
+  IncrementalCompilationUnitElementBuilder._(this.unitSource,
+      this.librarySource, this.oldUnit, this.newUnit, this.unitElement);
+
+  /**
+   * Updates [oldUnit] to have the same directives and declarations, in the
+   * same order as in [newUnit]. Existing resolution is kept where possible.
+   *
+   * Updates [unitElement] by adding/removing elements as needed.
+   *
+   * Fills [unitDelta] with added/remove elements.
+   */
+  void build() {
+    new CompilationUnitBuilder().buildCompilationUnit(
+        unitSource, newUnit, librarySource);
+    _processDirectives();
+    _processUnitMembers();
+    newUnit.element = unitElement;
+    _replaceUnitContents(oldUnit, newUnit);
+  }
+
+  void _addElementToHolder(Element element) {
+    if (element is PropertyAccessorElement) {
+      holder.addAccessor(element);
+    } else if (element is ClassElement) {
+      if (element.isEnum) {
+        holder.addEnum(element);
+      } else {
+        holder.addType(element);
+      }
+    } else if (element is FunctionElement) {
+      holder.addFunction(element);
+    } else if (element is FunctionTypeAliasElement) {
+      holder.addTypeAlias(element);
+    } else if (element is TopLevelVariableElement) {
+      holder.addTopLevelVariable(element);
+    }
+  }
+
+  void _processDirectives() {
+    Map<String, Directive> oldDirectiveMap = new HashMap<String, Directive>();
+    for (Directive oldDirective in oldUnit.directives) {
+      String code = TokenUtils.getFullCode(oldDirective);
+      oldDirectiveMap[code] = oldDirective;
+    }
+    // Replace new nodes with the identical old nodes.
+    Set<Directive> removedDirectives = oldUnit.directives.toSet();
+    for (Directive newDirective in newUnit.directives) {
+      String code = TokenUtils.getFullCode(newDirective);
+      // Prepare an old directive.
+      Directive oldDirective = oldDirectiveMap[code];
+      if (oldDirective == null) {
+        unitDelta.hasDirectiveChange = true;
+        continue;
+      }
+      // URI's must be resolved to the same sources.
+      if (newDirective is UriBasedDirective &&
+          oldDirective is UriBasedDirective) {
+        if (oldDirective.source != newDirective.source) {
+          continue;
+        }
+      }
+      // Do replacement.
+      _replaceNode(newDirective, oldDirective);
+      removedDirectives.remove(oldDirective);
+    }
+    // If there are any directives left, then these directives were removed.
+    if (removedDirectives.isNotEmpty) {
+      unitDelta.hasDirectiveChange = true;
+    }
+  }
+
+  void _processUnitMembers() {
+    Map<String, CompilationUnitMember> oldNodeMap =
+        new HashMap<String, CompilationUnitMember>();
+    for (CompilationUnitMember oldNode in oldUnit.declarations) {
+      String code = TokenUtils.getFullCode(oldNode);
+      oldNodeMap[code] = oldNode;
+    }
+    // Prepare all old top-level elements.
+    Set<Element> removedElements = new Set<Element>();
+    removedElements.addAll(unitElement.accessors);
+    removedElements.addAll(unitElement.enums);
+    removedElements.addAll(unitElement.functions);
+    removedElements.addAll(unitElement.functionTypeAliases);
+    removedElements.addAll(unitElement.types);
+    removedElements.addAll(unitElement.topLevelVariables);
+    // Replace new nodes with the identical old nodes.
+    for (CompilationUnitMember newNode in newUnit.declarations) {
+      String code = TokenUtils.getFullCode(newNode);
+      // Prepare an old node.
+      CompilationUnitMember oldNode = oldNodeMap[code];
+      if (oldNode == null) {
+        List<Element> elements = _getElements(newNode);
+        elements.forEach(_addElementToHolder);
+        elements.forEach(unitDelta.addedDeclarations.add);
+        continue;
+      }
+      // Do replacement.
+      _replaceNode(newNode, oldNode);
+      List<Element> elements = _getElements(oldNode);
+      elements.forEach(_addElementToHolder);
+      elements.forEach(removedElements.remove);
+    }
+    unitDelta.removedDeclarations.addAll(removedElements);
+    // Update CompilationUnitElement.
+    unitElement.accessors = holder.accessors;
+    unitElement.enums = holder.enums;
+    unitElement.functions = holder.functions;
+    unitElement.typeAliases = holder.typeAliases;
+    unitElement.types = holder.types;
+    unitElement.topLevelVariables = holder.topLevelVariables;
+    holder.validate();
+  }
+
+  /**
+   * Replaces [newNode] with [oldNode], updates tokens and elements.
+   * The nodes must have the same tokens, but offsets may be different.
+   */
+  void _replaceNode(AstNode newNode, AstNode oldNode) {
+    // Replace node.
+    NodeReplacer.replace(newNode, oldNode);
+    // Replace tokens.
+    {
+      Token oldBeginToken = TokenUtils.getBeginTokenNotComment(newNode);
+      Token newBeginToken = TokenUtils.getBeginTokenNotComment(oldNode);
+      oldBeginToken.previous.setNext(newBeginToken);
+      oldNode.endToken.setNext(newNode.endToken.next);
+    }
+    // Change tokens offsets.
+    Map<int, int> offsetMap = new HashMap<int, int>();
+    TokenUtils.copyTokenOffsets(offsetMap, oldNode.beginToken,
+        newNode.beginToken, oldNode.endToken, newNode.endToken, true);
+    // Change elements offsets.
+    {
+      var visitor = new _UpdateElementOffsetsVisitor(offsetMap);
+      List<Element> elements = _getElements(oldNode);
+      for (Element element in elements) {
+        element.accept(visitor);
+      }
+    }
+  }
+
+  /**
+   * Returns [Element]s that are declared directly by the given [node].
+   * This does not include any child elements - parameters, local variables.
+   *
+   * Usually just one [Element] is returned, but [VariableDeclarationList]
+   * nodes may declare more than one.
+   */
+  static List<Element> _getElements(AstNode node) {
+    List<Element> elements = <Element>[];
+    if (node is TopLevelVariableDeclaration) {
+      VariableDeclarationList variableList = node.variables;
+      if (variableList != null) {
+        for (VariableDeclaration variable in variableList.variables) {
+          TopLevelVariableElement element = variable.element;
+          elements.add(element);
+          if (element.getter != null) {
+            elements.add(element.getter);
+          }
+          if (element.setter != null) {
+            elements.add(element.setter);
+          }
+        }
+      }
+    } else if (node is PartDirective || node is PartOfDirective) {
+    } else if (node is Directive && node.element != null) {
+      elements.add(node.element);
+    } else if (node is Declaration && node.element != null) {
+      Element element = node.element;
+      elements.add(element);
+      if (element is PropertyAccessorElement) {
+        elements.add(element.variable);
+      }
+    }
+    return elements;
+  }
+
+  /**
+   * Replaces contents of the [to] unit with the contenxts of the [from] unit.
+   */
+  static void _replaceUnitContents(CompilationUnit to, CompilationUnit from) {
+    to.directives.clear();
+    to.declarations.clear();
+    to.beginToken = from.beginToken;
+    to.scriptTag = from.scriptTag;
+    to.directives.addAll(from.directives);
+    to.declarations.addAll(from.declarations);
+    to.element = to.element;
+    to.lineInfo = from.lineInfo;
+  }
+}
+
+/**
+ * Utilities for [Token] manipulations.
+ */
+class TokenUtils {
+  static const String _SEPARATOR = "\uFFFF";
+
+  /**
+   * Copy offsets from [newToken]s to [oldToken]s.
+   */
+  static void copyTokenOffsets(Map<int, int> offsetMap, Token oldToken,
+      Token newToken, Token oldEndToken, Token newEndToken,
+      [bool goUpComment = false]) {
+    if (oldToken is CommentToken && newToken is CommentToken) {
+      if (goUpComment) {
+        copyTokenOffsets(offsetMap, (oldToken as CommentToken).parent,
+            (newToken as CommentToken).parent, oldEndToken, newEndToken);
+      }
+      while (oldToken != null) {
+        offsetMap[oldToken.offset] = newToken.offset;
+        oldToken.offset = newToken.offset;
+        oldToken = oldToken.next;
+        newToken = newToken.next;
+      }
+      assert(oldToken == null);
+      assert(newToken == null);
+      return;
+    }
+    while (true) {
+      if (oldToken.precedingComments != null) {
+        assert(newToken.precedingComments != null);
+        copyTokenOffsets(offsetMap, oldToken.precedingComments,
+            newToken.precedingComments, oldEndToken, newEndToken);
+      }
+      offsetMap[oldToken.offset] = newToken.offset;
+      oldToken.offset = newToken.offset;
+      if (oldToken == oldEndToken) {
+        assert(newToken == newEndToken);
+        break;
+      }
+      oldToken = oldToken.next;
+      newToken = newToken.next;
+    }
+  }
+
+  static Token getBeginTokenNotComment(AstNode node) {
+    Token oldBeginToken = node.beginToken;
+    if (oldBeginToken is CommentToken) {
+      oldBeginToken = (oldBeginToken as CommentToken).parent;
+    }
+    return oldBeginToken;
+  }
+
+  /**
+   * Return the token string of all the [node] tokens.
+   */
+  static String getFullCode(AstNode node) {
+    List<Token> tokens = getTokens(node);
+    return joinTokens(tokens);
+  }
+
+  /**
+   * Returns all tokends (including comments) of the given [node].
+   */
+  static List<Token> getTokens(AstNode node) {
+    List<Token> tokens = <Token>[];
+    Token token = getBeginTokenNotComment(node);
+    Token endToken = node.endToken;
+    while (true) {
+      // append comment tokens
+      for (Token commentToken = token.precedingComments;
+          commentToken != null;
+          commentToken = commentToken.next) {
+        tokens.add(commentToken);
+      }
+      // append token
+      tokens.add(token);
+      // next token
+      if (token == endToken) {
+        break;
+      }
+      token = token.next;
+    }
+    return tokens;
+  }
+
+  static String joinTokens(List<Token> tokens) {
+    return tokens.map((token) => token.lexeme).join(_SEPARATOR);
+  }
+}
+
+/**
+ * Updates name offsets of [Element]s according to the [map].
+ */
+class _UpdateElementOffsetsVisitor extends GeneralizingElementVisitor {
+  final Map<int, int> map;
+
+  _UpdateElementOffsetsVisitor(this.map);
+
+  void visitElement(Element element) {
+    if (element is CompilationUnitElement) {
+      return;
+    }
+    if (element.isSynthetic) {
+      return;
+    }
+    int oldOffset = element.nameOffset;
+    int newOffset = map[oldOffset];
+    assert(newOffset != null);
+    (element as ElementImpl).nameOffset = newOffset;
+    if (element is! LibraryElement) {
+      super.visitElement(element);
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/task/inputs.dart b/mojo/public/dart/third_party/analyzer/lib/src/task/inputs.dart
new file mode 100644
index 0000000..308b06a
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/task/inputs.dart
@@ -0,0 +1,840 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.src.task.inputs;
+
+import 'dart:collection';
+
+import 'package:analyzer/task/model.dart';
+
+/**
+ * A function that converts an object of the type [B] into a [TaskInput].
+ * This is used, for example, by a [ListToListTaskInput] to create task inputs
+ * for each value in a list of values.
+ */
+typedef TaskInput<E> GenerateTaskInputs<B, E>(B object);
+
+/**
+ * A function that maps one [value] to another value.
+ */
+typedef R Mapper<P, R>(P value);
+
+/**
+ * An input to an [AnalysisTask] that is computed by accessing a single result
+ * defined on a single target.
+ */
+class ListTaskInputImpl<E> extends SimpleTaskInput<List<E>>
+    with ListTaskInputMixin<E> implements ListTaskInput<E> {
+  /**
+   * Initialize a newly created task input that computes the input by accessing
+   * the given [result] associated with the given [target].
+   */
+  ListTaskInputImpl(AnalysisTarget target, ResultDescriptor<List<E>> result)
+      : super(target, result);
+}
+
+/**
+ * A mixin-ready implementation of [ListTaskInput].
+ */
+abstract class ListTaskInputMixin<E> implements ListTaskInput<E> {
+  ListTaskInput /*<V>*/ toList(UnaryFunction<E, dynamic /*<V>*/ > mapper) {
+    return new ListToListTaskInput<E, dynamic /*V*/ >(this, mapper);
+  }
+
+  ListTaskInput /*<V>*/ toListOf(ResultDescriptor /*<V>*/ valueResult) {
+    return (this as ListTaskInputImpl<AnalysisTarget>).toList(valueResult.of);
+  }
+
+  MapTaskInput<E, dynamic /*V*/ > toMap(
+      UnaryFunction<E, dynamic /*<V>*/ > mapper) {
+    return new ListToMapTaskInput<E, dynamic /*V*/ >(this, mapper);
+  }
+
+  MapTaskInput<AnalysisTarget, dynamic /*V*/ > toMapOf(
+      ResultDescriptor /*<V>*/ valueResult) {
+    return (this as ListTaskInputImpl<AnalysisTarget>).toMap(valueResult.of);
+  }
+}
+
+/**
+ * An input to an [AnalysisTask] that is computed by the following steps. First
+ * another (base) task input is used to compute a [List]-valued result. An input
+ * generator function is then used to map each element of that list to a task
+ * input. Finally, each of the task inputs are used to access analysis results,
+ * and the list of the analysis results is used as the input to the task.
+ */
+class ListToListTaskInput<B, E>
+    extends _ListToCollectionTaskInput<B, E, List<E>>
+    with ListTaskInputMixin<E> {
+  /**
+   * Initialize a result accessor to use the given [baseAccessor] to access a
+   * list of values that can be passed to the given [generateTaskInputs] to
+   * generate a list of task inputs that can be used to access the elements of
+   * the input being accessed.
+   */
+  ListToListTaskInput(TaskInput<List<B>> baseAccessor,
+      GenerateTaskInputs<B, E> generateTaskInputs)
+      : super(baseAccessor, generateTaskInputs);
+
+  @override
+  TaskInputBuilder<List<E>> createBuilder() =>
+      new ListToListTaskInputBuilder<B, E>(this);
+}
+
+/**
+ * A [TaskInputBuilder] used to build an input based on a [ListToListTaskInput].
+ */
+class ListToListTaskInputBuilder<B, E>
+    extends _ListToCollectionTaskInputBuilder<B, E, List<E>> {
+  /**
+   * The list of values being built.
+   */
+  List<E> _resultValue;
+
+  /**
+   * Initialize a newly created task input builder that computes the result
+   * specified by the given [input].
+   */
+  ListToListTaskInputBuilder(ListToListTaskInput<B, E> input) : super(input);
+
+  @override
+  void _addResultElement(B baseElement, E resultElement) {
+    _resultValue.add(resultElement);
+  }
+
+  @override
+  void _initResultValue() {
+    _resultValue = <E>[];
+  }
+}
+
+/**
+ * An input to an [AnalysisTask] that is computed by the following steps. First
+ * another (base) task input is used to compute a [List]-valued result. An input
+ * generator function is then used to map each element of that list to a task
+ * input. Finally, each of the task inputs are used to access analysis results,
+ * and the map of the base elements to the analysis results is used as the
+ * input to the task.
+ */
+class ListToMapTaskInput<B, E>
+    extends _ListToCollectionTaskInput<B, E, Map<B, E>>
+    with MapTaskInputMixin<B, E> {
+  /**
+   * Initialize a result accessor to use the given [baseAccessor] to access a
+   * list of values that can be passed to the given [generateTaskInputs] to
+   * generate a list of task inputs that can be used to access the elements of
+   * the input being accessed.
+   */
+  ListToMapTaskInput(TaskInput<List<B>> baseAccessor,
+      GenerateTaskInputs<B, E> generateTaskInputs)
+      : super(baseAccessor, generateTaskInputs);
+
+  @override
+  TaskInputBuilder<Map<B, E>> createBuilder() =>
+      new ListToMapTaskInputBuilder<B, E>(this);
+}
+
+/**
+ * A [TaskInputBuilder] used to build an input based on a [ListToMapTaskInput].
+ */
+class ListToMapTaskInputBuilder<B, E>
+    extends _ListToCollectionTaskInputBuilder<B, E, Map<B, E>> {
+  /**
+   * The map being built.
+   */
+  Map<B, E> _resultValue;
+
+  /**
+   * Initialize a newly created task input builder that computes the result
+   * specified by the given [input].
+   */
+  ListToMapTaskInputBuilder(ListToMapTaskInput<B, E> input) : super(input);
+
+  @override
+  void _addResultElement(B baseElement, E resultElement) {
+    _resultValue[baseElement] = resultElement;
+  }
+
+  @override
+  void _initResultValue() {
+    _resultValue = new HashMap<B, E>();
+  }
+}
+
+/**
+ * A mixin-ready implementation of [MapTaskInput].
+ */
+abstract class MapTaskInputMixin<K, V> implements MapTaskInput<K, V> {
+  TaskInput<List /*<E>*/ > toFlattenList(
+      BinaryFunction<K, dynamic /*element of V*/, dynamic /*<E>*/ > mapper) {
+    return new MapToFlattenListTaskInput<K, dynamic /*element of V*/, dynamic /*E*/ >(
+        this as MapTaskInput<K, List /*<element of V>*/ >, mapper);
+  }
+}
+
+/**
+ * A [TaskInput] that is computed by the following steps.
+ *
+ * First the [base] task input is used to compute a [Map]-valued result.
+ * The values of the [Map] must be [List]s.
+ *
+ * The given [mapper] is used to transform each key / value pair of the [Map]
+ * into task inputs.
+ *
+ * Finally, each of the task inputs are used to access analysis results,
+ * and the list of the results is used as the input.
+ */
+class MapToFlattenListTaskInput<K, V, E> extends TaskInputImpl<List<E>> {
+  final MapTaskInput<K, List<V>> base;
+  final BinaryFunction<K, V, E> mapper;
+
+  MapToFlattenListTaskInput(this.base, this.mapper);
+
+  @override
+  TaskInputBuilder<List<E>> createBuilder() {
+    return new MapToFlattenListTaskInputBuilder<K, V, E>(base, mapper);
+  }
+}
+
+/**
+ * The [TaskInputBuilder] for [MapToFlattenListTaskInput].
+ */
+class MapToFlattenListTaskInputBuilder<K, V, E>
+    implements TaskInputBuilder<List<E>> {
+  final MapTaskInput<K, List<V>> base;
+  final BinaryFunction<K, V, E> mapper;
+
+  TaskInputBuilder currentBuilder;
+  Map<K, List<V>> baseMap;
+  Iterator<K> keyIterator;
+  Iterator<V> valueIterator;
+
+  final List<E> inputValue = <E>[];
+
+  MapToFlattenListTaskInputBuilder(this.base, this.mapper) {
+    currentBuilder = base.createBuilder();
+  }
+
+  @override
+  ResultDescriptor get currentResult {
+    if (currentBuilder == null) {
+      return null;
+    }
+    return currentBuilder.currentResult;
+  }
+
+  AnalysisTarget get currentTarget {
+    if (currentBuilder == null) {
+      return null;
+    }
+    return currentBuilder.currentTarget;
+  }
+
+  @override
+  void set currentValue(Object value) {
+    if (currentBuilder == null) {
+      throw new StateError(
+          'Cannot set the result value when there is no current result');
+    }
+    currentBuilder.currentValue = value;
+  }
+
+  @override
+  void currentValueNotAvailable() {
+    if (currentBuilder == null) {
+      throw new StateError(
+          'Cannot set the result value when there is no current result');
+    }
+    currentBuilder.currentValueNotAvailable();
+  }
+
+  @override
+  bool moveNext() {
+    // Prepare base Map.
+    if (baseMap == null) {
+      if (currentBuilder.moveNext()) {
+        return true;
+      }
+      baseMap = currentBuilder.inputValue;
+      if (baseMap == null) {
+        // No base map could be computed due to a circular dependency.  Use an
+        // empty map so that no further results will be computed.
+        baseMap = {};
+      }
+      keyIterator = baseMap.keys.iterator;
+      // Done with this builder.
+      currentBuilder = null;
+    }
+    // Prepare the next result value.
+    if (currentBuilder != null) {
+      if (currentBuilder.moveNext()) {
+        return true;
+      }
+      // Add the result value for the current Map key/value.
+      E resultValue = currentBuilder.inputValue;
+      if (resultValue != null) {
+        inputValue.add(resultValue);
+      }
+      // Done with this builder.
+      currentBuilder = null;
+    }
+    // Move to the next Map value.
+    if (valueIterator != null && valueIterator.moveNext()) {
+      K key = keyIterator.current;
+      V value = valueIterator.current;
+      currentBuilder = mapper(key, value).createBuilder();
+      return moveNext();
+    }
+    // Move to the next Map key.
+    if (keyIterator.moveNext()) {
+      K key = keyIterator.current;
+      valueIterator = baseMap[key].iterator;
+      return moveNext();
+    }
+    // No more Map values/keys to transform.
+    return false;
+  }
+}
+
+/**
+ * An input to an [AnalysisTask] that is computed by mapping the value of
+ * another task input to a list of values.
+ */
+class ObjectToListTaskInput<E> extends TaskInputImpl<List<E>> with ListTaskInputMixin<E>
+    implements ListTaskInput<E> {
+  /**
+   * The input used to compute the value to be mapped.
+   */
+  final TaskInput baseInput;
+
+  /**
+   * The function used to map the value of the base input to the list of values.
+   */
+  final Mapper<Object, List<E>> mapper;
+
+  /**
+   * Initialize a newly created task input that computes the input by accessing
+   * the given [result] associated with the given [target].
+   */
+  ObjectToListTaskInput(this.baseInput, this.mapper);
+
+  @override
+  TaskInputBuilder<List<E>> createBuilder() =>
+      new ObjectToListTaskInputBuilder<E>(this);
+
+  @override
+  ListTaskInput /*<V>*/ toListOf(ResultDescriptor /*<V>*/ valueResult) {
+    return new ListToListTaskInput<E, dynamic /*V*/ >(
+        this, valueResult.of as dynamic);
+  }
+
+  @override
+  MapTaskInput<AnalysisTarget, dynamic /*V*/ > toMapOf(
+      ResultDescriptor /*<V>*/ valueResult) {
+    return new ListToMapTaskInput<AnalysisTarget, dynamic /*V*/ >(
+        this as dynamic, valueResult.of);
+  }
+}
+
+/**
+ * A [TaskInputBuilder] used to build an input based on a [SimpleTaskInput].
+ */
+class ObjectToListTaskInputBuilder<E> implements TaskInputBuilder<List<E>> {
+  /**
+   * The input being built.
+   */
+  final ObjectToListTaskInput<E> input;
+
+  /**
+   * The builder created by the input.
+   */
+  TaskInputBuilder builder;
+
+  /**
+   * The value of the input being built, or `null` if the value hasn't been set
+   * yet or if no result is available ([currentValueNotAvailable] was called).
+   */
+  List<E> _inputValue = null;
+
+  /**
+   * Initialize a newly created task input builder that computes the result
+   * specified by the given [input].
+   */
+  ObjectToListTaskInputBuilder(this.input) {
+    builder = input.baseInput.createBuilder();
+  }
+
+  @override
+  ResultDescriptor get currentResult {
+    if (builder == null) {
+      return null;
+    }
+    return builder.currentResult;
+  }
+
+  @override
+  AnalysisTarget get currentTarget {
+    if (builder == null) {
+      return null;
+    }
+    return builder.currentTarget;
+  }
+
+  @override
+  void set currentValue(Object value) {
+    if (builder == null) {
+      throw new StateError(
+          'Cannot set the result value when there is no current result');
+    }
+    builder.currentValue = value;
+  }
+
+  @override
+  List<E> get inputValue {
+    if (builder != null) {
+      throw new StateError('Result value has not been created');
+    }
+    return _inputValue;
+  }
+
+  @override
+  void currentValueNotAvailable() {
+    if (builder == null) {
+      throw new StateError(
+          'Cannot set the result value when there is no current result');
+    }
+    builder.currentValueNotAvailable();
+  }
+
+  @override
+  bool moveNext() {
+    if (builder == null) {
+      return false;
+    } else if (builder.moveNext()) {
+      return true;
+    } else {
+      // This might not be the right semantics. If the value could not be
+      // computed then we pass the resulting `null` in to the mapper function.
+      // Unfortunately, we cannot tell the difference between a `null` that's
+      // there because no value could be computed and a `null` that's there
+      // because that's what *was* computed.
+      _inputValue = input.mapper(builder.inputValue);
+      builder = null;
+      return false;
+    }
+  }
+}
+
+/**
+ * An input to an [AnalysisTask] that is computed by accessing a single result
+ * defined on a single target.
+ */
+class SimpleTaskInput<V> extends TaskInputImpl<V> {
+  /**
+   * The target on which the result is defined.
+   */
+  final AnalysisTarget target;
+
+  /**
+   * The result to be accessed.
+   */
+  final ResultDescriptor<V> result;
+
+  /**
+   * Initialize a newly created task input that computes the input by accessing
+   * the given [result] associated with the given [target].
+   */
+  SimpleTaskInput(this.target, this.result);
+
+  @override
+  TaskInputBuilder<V> createBuilder() => new SimpleTaskInputBuilder<V>(this);
+}
+
+/**
+ * A [TaskInputBuilder] used to build an input based on a [SimpleTaskInput].
+ */
+class SimpleTaskInputBuilder<V> implements TaskInputBuilder<V> {
+  /**
+   * The state value indicating that the builder is positioned before the single
+   * result.
+   */
+  static const _BEFORE = -1;
+
+  /**
+   * The state value indicating that the builder is positioned at the single
+   * result.
+   */
+  static const _AT = 0;
+
+  /**
+   * The state value indicating that the builder is positioned after the single
+   * result.
+   */
+  static const _AFTER = 1;
+
+  /**
+   * The input being built.
+   */
+  final SimpleTaskInput<V> input;
+
+  /**
+   * The value of the input being built.  `null` if the value hasn't been set
+   * yet, or if no result is available ([currentValueNotAvailable] was called).
+   */
+  V _resultValue = null;
+
+  /**
+   * The state of the builder.
+   */
+  int _state = _BEFORE;
+
+  /**
+   * A flag indicating whether the result value was explicitly set.
+   */
+  bool _resultSet = false;
+
+  /**
+   * Initialize a newly created task input builder that computes the result
+   * specified by the given [input].
+   */
+  SimpleTaskInputBuilder(this.input);
+
+  @override
+  ResultDescriptor get currentResult => _state == _AT ? input.result : null;
+
+  @override
+  AnalysisTarget get currentTarget => _state == _AT ? input.target : null;
+
+  @override
+  void set currentValue(Object value) {
+    if (_state != _AT) {
+      throw new StateError(
+          'Cannot set the result value when there is no current result');
+    }
+    _resultValue = value as V;
+    _resultSet = true;
+  }
+
+  @override
+  V get inputValue {
+    if (_state != _AFTER) {
+      throw new StateError('Result value has not been created');
+    }
+    return _resultValue;
+  }
+
+  @override
+  void currentValueNotAvailable() {
+    if (_state != _AT) {
+      throw new StateError(
+          'Cannot set the result value when there is no current result');
+    }
+    _resultValue = null;
+    _resultSet = true;
+  }
+
+  @override
+  bool moveNext() {
+    if (_state == _BEFORE) {
+      _state = _AT;
+      return true;
+    } else {
+      if (!_resultSet) {
+        throw new StateError(
+            'The value of the current result must be set before moving to the next result.');
+      }
+      _state = _AFTER;
+      return false;
+    }
+  }
+}
+
+abstract class TaskInputImpl<V> implements TaskInput<V> {
+  @override
+  ListTaskInput /*<E>*/ mappedToList(List /*<E>*/ mapper(V value)) {
+    return new ObjectToListTaskInput(this, mapper);
+  }
+}
+
+/**
+ * A [TaskInputBuilder] used to build an input based on one or more other task
+ * inputs. The task inputs to be built are specified by a table mapping the name
+ * of the input to the task used to access the input's value.
+ */
+class TopLevelTaskInputBuilder
+    implements TaskInputBuilder<Map<String, Object>> {
+  /**
+   * The descriptors describing the inputs to be built.
+   */
+  final Map<String, TaskInput> inputDescriptors;
+
+  /**
+   * The names of the inputs. There are the keys from the [inputDescriptors] in
+   * an indexable form.
+   */
+  List<String> inputNames;
+
+  /**
+   * The index of the input name associated with the current result and target.
+   */
+  int nameIndex = -1;
+
+  /**
+   * The builder used to build the current result.
+   */
+  TaskInputBuilder currentBuilder;
+
+  /**
+   * The inputs that are being or have been built. The map will be incomplete
+   * unless the method [moveNext] returns `false`.
+   */
+  final Map<String, Object> inputs = new HashMap<String, Object>();
+
+  /**
+   * Initialize a newly created task input builder to build the inputs described
+   * by the given [inputDescriptors].
+   */
+  TopLevelTaskInputBuilder(this.inputDescriptors) {
+    inputNames = inputDescriptors.keys.toList();
+  }
+
+  @override
+  ResultDescriptor get currentResult {
+    if (currentBuilder == null) {
+      return null;
+    }
+    return currentBuilder.currentResult;
+  }
+
+  @override
+  AnalysisTarget get currentTarget {
+    if (currentBuilder == null) {
+      return null;
+    }
+    return currentBuilder.currentTarget;
+  }
+
+  @override
+  void set currentValue(Object value) {
+    if (currentBuilder == null) {
+      throw new StateError(
+          'Cannot set the result value when there is no current result');
+    }
+    currentBuilder.currentValue = value;
+  }
+
+  @override
+  Map<String, Object> get inputValue {
+    if (nameIndex < inputNames.length) {
+      throw new StateError('Result value has not been created');
+    }
+    return inputs;
+  }
+
+  /**
+   * Assuming that there is a current input, return its name.
+   */
+  String get _currentName => inputNames[nameIndex];
+
+  @override
+  void currentValueNotAvailable() {
+    if (currentBuilder == null) {
+      throw new StateError(
+          'Cannot set the result value when there is no current result');
+    }
+    currentBuilder.currentValueNotAvailable();
+  }
+
+  @override
+  bool moveNext() {
+    if (nameIndex >= inputNames.length) {
+      // We have already computed all of the results, so just return false.
+      return false;
+    }
+    if (nameIndex < 0) {
+      // This is the first time moveNext has been invoked, so we just determine
+      // whether there are any results to be computed.
+      nameIndex = 0;
+    } else {
+      if (currentBuilder.moveNext()) {
+        // We are still working on building the value associated with the
+        // current name.
+        return true;
+      }
+      if (currentBuilder.inputValue != null) {
+        inputs[_currentName] = currentBuilder.inputValue;
+      }
+      nameIndex++;
+    }
+    if (nameIndex >= inputNames.length) {
+      // There is no next value, so we're done.
+      return false;
+    }
+    currentBuilder = inputDescriptors[_currentName].createBuilder();
+    // NOTE: This assumes that every builder will require at least one result
+    // value to be created. If that assumption is every broken, this method will
+    // need to be changed to advance until we find a builder that does require
+    // a result to be computed (or run out of builders).
+    return currentBuilder.moveNext();
+  }
+}
+
+/**
+ * An input to an [AnalysisTask] that is computed by the following steps. First
+ * another (base) task input is used to compute a [List]-valued result. An input
+ * generator function is then used to map each element of that list to a task
+ * input. Finally, each of the task inputs are used to access analysis results,
+ * and a collection of the analysis results is used as the input to the task.
+ */
+abstract class _ListToCollectionTaskInput<B, E, C> extends TaskInputImpl<C> {
+  /**
+   * The accessor used to access the list of elements being mapped.
+   */
+  final TaskInput<List<B>> baseAccessor;
+
+  /**
+   * The function used to convert an element in the list returned by the
+   * [baseAccessor] to a task input.
+   */
+  final GenerateTaskInputs<B, E> generateTaskInputs;
+
+  /**
+   * Initialize a result accessor to use the given [baseAccessor] to access a
+   * list of values that can be passed to the given [generateTaskInputs] to
+   * generate a list of task inputs that can be used to access the elements of
+   * the input being accessed.
+   */
+  _ListToCollectionTaskInput(this.baseAccessor, this.generateTaskInputs);
+}
+
+/**
+ * A [TaskInputBuilder] used to build an [_ListToCollectionTaskInput].
+ */
+abstract class _ListToCollectionTaskInputBuilder<B, E, C>
+    implements TaskInputBuilder<C> {
+  /**
+   * The input being built.
+   */
+  final _ListToCollectionTaskInput<B, E, C> input;
+
+  /**
+   * The builder used to build the current result.
+   */
+  TaskInputBuilder currentBuilder;
+
+  /**
+   * The list of values computed by the [input]'s base accessor.
+   */
+  List<B> _baseList = null;
+
+  /**
+   * The index in the [_baseList] of the value for which a value is currently
+   * being built.
+   */
+  int _baseListIndex = -1;
+
+  /**
+   * The element of the [_baseList] for which a value is currently being built.
+   */
+  B _baseListElement;
+
+  /**
+   * Initialize a newly created task input builder that computes the result
+   * specified by the given [input].
+   */
+  _ListToCollectionTaskInputBuilder(this.input);
+
+  @override
+  ResultDescriptor get currentResult {
+    if (currentBuilder == null) {
+      return null;
+    }
+    return currentBuilder.currentResult;
+  }
+
+  @override
+  AnalysisTarget get currentTarget {
+    if (currentBuilder == null) {
+      return null;
+    }
+    return currentBuilder.currentTarget;
+  }
+
+  @override
+  void set currentValue(Object value) {
+    if (currentBuilder == null) {
+      throw new StateError(
+          'Cannot set the result value when there is no current result');
+    }
+    currentBuilder.currentValue = value;
+  }
+
+  @override
+  C get inputValue {
+    if (currentBuilder != null || _resultValue == null) {
+      throw new StateError('Result value has not been created');
+    }
+    return _resultValue;
+  }
+
+  /**
+   * The list of values being built.
+   */
+  C get _resultValue;
+
+  @override
+  void currentValueNotAvailable() {
+    if (currentBuilder == null) {
+      throw new StateError(
+          'Cannot set the result value when there is no current result');
+    }
+    currentBuilder.currentValueNotAvailable();
+  }
+
+  @override
+  bool moveNext() {
+    if (currentBuilder == null) {
+      if (_resultValue == null) {
+        // This is the first time moveNext has been invoked, so start by
+        // computing the list of values from which the results will be derived.
+        currentBuilder = input.baseAccessor.createBuilder();
+        return currentBuilder.moveNext();
+      } else {
+        // We have already computed all of the results, so just return false.
+        return false;
+      }
+    }
+    if (currentBuilder.moveNext()) {
+      return true;
+    }
+    if (_resultValue == null) {
+      // We have finished computing the list of values from which the results
+      // will be derived.
+      _baseList = currentBuilder.inputValue;
+      if (_baseList == null) {
+        // No base list could be computed due to a circular dependency.  Use an
+        // empty list so that no further results will be computed.
+        _baseList = [];
+      }
+      _baseListIndex = 0;
+      _initResultValue();
+    } else {
+      // We have finished computing one of the elements in the result list.
+      if (currentBuilder.inputValue != null) {
+        _addResultElement(_baseListElement, currentBuilder.inputValue);
+      }
+      _baseListIndex++;
+    }
+    if (_baseListIndex >= _baseList.length) {
+      currentBuilder = null;
+      return false;
+    }
+    _baseListElement = _baseList[_baseListIndex];
+    currentBuilder = input.generateTaskInputs(_baseListElement).createBuilder();
+    return currentBuilder.moveNext();
+  }
+
+  void _addResultElement(B baseElement, E resultElement);
+  void _initResultValue();
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/task/manager.dart b/mojo/public/dart/third_party/analyzer/lib/src/task/manager.dart
new file mode 100644
index 0000000..eebc084
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/task/manager.dart
@@ -0,0 +1,114 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.src.task.manager;
+
+import 'dart:collection';
+
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/task/model.dart';
+
+/**
+ * An object that manages the information about the tasks that have been
+ * defined.
+ */
+class TaskManager {
+  /**
+   * A table mapping [ResultDescriptor]s to a list of [TaskDescriptor]s
+   * for the tasks that can be used to compute the result.
+   */
+  Map<ResultDescriptor, List<TaskDescriptor>> taskMap =
+      new HashMap<ResultDescriptor, List<TaskDescriptor>>();
+
+  /**
+   * A list of the results that are to be computed for all sources within an
+   * analysis root.
+   */
+  Set<ResultDescriptor> generalResults = new Set<ResultDescriptor>();
+
+  /**
+   * A list of the results that are to be computed for priority sources.
+   */
+  Set<ResultDescriptor> priorityResults = new Set<ResultDescriptor>();
+
+  /**
+   * Add the given [result] to the list of results that are to be computed for
+   * all sources within an analysis root.
+   */
+  void addGeneralResult(ResultDescriptor result) {
+    generalResults.add(result);
+  }
+
+  /**
+   * Add the given [result] to the list of results that are to be computed for
+   * priority sources.
+   */
+  void addPriorityResult(ResultDescriptor result) {
+    priorityResults.add(result);
+  }
+
+  /**
+   * Add the given [descriptor] to the list of analysis task descriptors that
+   * can be used to compute analysis results.
+   */
+  void addTaskDescriptor(TaskDescriptor descriptor) {
+    descriptor.results.forEach((ResultDescriptor result) {
+      //
+      // Add the result to the task map.
+      //
+      List<TaskDescriptor> descriptors = taskMap[result];
+      if (descriptors == null) {
+        descriptors = <TaskDescriptor>[];
+        taskMap[result] = descriptors;
+      }
+      descriptors.add(descriptor);
+    });
+  }
+
+  /**
+   * Add the task descriptors in the given list of [descriptors] to the list of
+   * analysis task descriptors that can be used to compute analysis results.
+   */
+  void addTaskDescriptors(List<TaskDescriptor> descriptors) {
+    descriptors.forEach(addTaskDescriptor);
+  }
+
+  /**
+   * Find a task that will compute the given [result] for the given [target].
+   */
+  TaskDescriptor findTask(AnalysisTarget target, ResultDescriptor result) {
+    List<TaskDescriptor> descriptors = taskMap[result];
+    if (descriptors == null) {
+      throw new AnalysisException(
+          'No tasks registered to compute $result for $target');
+    }
+    return _findBestTask(descriptors);
+  }
+
+  /**
+   * Remove the given [result] from the list of results that are to be computed
+   * for all sources within an analysis root.
+   */
+  void removeGeneralResult(ResultDescriptor result) {
+    generalResults.remove(result);
+  }
+
+  /**
+   * Remove the given [result] from the list of results that are to be computed
+   * for priority sources.
+   */
+  void removePriorityResult(ResultDescriptor result) {
+    priorityResults.remove(result);
+  }
+
+  /**
+   * Given a list of task [descriptors] that can be used to compute some
+   * unspecified result, return the descriptor that will compute the result with
+   * the least amount of work.
+   */
+  TaskDescriptor _findBestTask(List<TaskDescriptor> descriptors) {
+    // TODO(brianwilkerson) Improve this implementation.
+    return descriptors[0];
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/task/model.dart b/mojo/public/dart/third_party/analyzer/lib/src/task/model.dart
new file mode 100644
index 0000000..9ef568e
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/task/model.dart
@@ -0,0 +1,143 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.src.task.model;
+
+import 'package:analyzer/src/generated/engine.dart' hide AnalysisTask;
+import 'package:analyzer/src/task/inputs.dart';
+import 'package:analyzer/task/model.dart';
+
+/**
+ * The default [ResultCachingPolicy], results are never flushed.
+ */
+const ResultCachingPolicy DEFAULT_CACHING_POLICY =
+    const SimpleResultCachingPolicy(-1, -1);
+
+/**
+ * A concrete implementation of a [ListResultDescriptor].
+ */
+class ListResultDescriptorImpl<E> extends ResultDescriptorImpl<List<E>>
+    implements ListResultDescriptor<E> {
+  /**
+   * Initialize a newly created analysis result to have the given [name] and
+   * [defaultValue]. If a [cachingPolicy] is provided, it will control how long
+   * values associated with this result will remain in the cache.
+   */
+  ListResultDescriptorImpl(String name, List<E> defaultValue,
+      {ResultCachingPolicy<List<E>> cachingPolicy: DEFAULT_CACHING_POLICY})
+      : super(name, defaultValue, cachingPolicy: cachingPolicy);
+
+  @override
+  ListTaskInput<E> of(AnalysisTarget target) =>
+      new ListTaskInputImpl<E>(target, this);
+}
+
+/**
+ * A concrete implementation of a [ResultDescriptor].
+ */
+class ResultDescriptorImpl<V> implements ResultDescriptor<V> {
+  static int _NEXT_HASH = 0;
+
+  @override
+  final hashCode = _NEXT_HASH++;
+
+  /**
+   * The name of the result, used for debugging.
+   */
+  final String name;
+
+  /**
+   * Return the default value for results described by this descriptor.
+   */
+  final V defaultValue;
+
+  /**
+   * The caching policy for results described by this descriptor.
+   */
+  final ResultCachingPolicy<V> cachingPolicy;
+
+  /**
+   * Initialize a newly created analysis result to have the given [name] and
+   * [defaultValue]. If a [cachingPolicy] is provided, it will control how long
+   * values associated with this result will remain in the cache.
+   */
+  ResultDescriptorImpl(this.name, this.defaultValue,
+      {this.cachingPolicy: DEFAULT_CACHING_POLICY});
+
+  @override
+  bool operator ==(Object other) {
+    return other is ResultDescriptorImpl && other.hashCode == hashCode;
+  }
+
+  @override
+  TaskInput<V> of(AnalysisTarget target) =>
+      new SimpleTaskInput<V>(target, this);
+
+  @override
+  String toString() => name;
+}
+
+/**
+ * A simple [ResultCachingPolicy] implementation that consider all the objects
+ * to be of the size `1`.
+ */
+class SimpleResultCachingPolicy<T> implements ResultCachingPolicy<T> {
+  @override
+  final int maxActiveSize;
+
+  @override
+  final int maxIdleSize;
+
+  const SimpleResultCachingPolicy(this.maxActiveSize, this.maxIdleSize);
+
+  @override
+  int measure(T object) => 1;
+}
+
+/**
+ * A concrete implementation of a [TaskDescriptor].
+ */
+class TaskDescriptorImpl implements TaskDescriptor {
+  /**
+   * The name of the described task, used for debugging.
+   */
+  final String name;
+
+  /**
+   * The function used to build the analysis task.
+   */
+  final BuildTask buildTask;
+
+  /**
+   * The function used to build the inputs to the task.
+   */
+  @override
+  final CreateTaskInputs createTaskInputs;
+
+  /**
+   * A list of the analysis results that will be computed by the described task.
+   */
+  @override
+  final List<ResultDescriptor> results;
+
+  /**
+   * Initialize a newly created task descriptor to have the given [name] and to
+   * describe a task that takes the inputs built using the given [createTaskInputs],
+   * and produces the given [results]. The [buildTask] will be used to create
+   * the instance of [AnalysisTask] thusly described.
+   */
+  TaskDescriptorImpl(
+      this.name, this.buildTask, this.createTaskInputs, this.results);
+
+  @override
+  AnalysisTask createTask(AnalysisContext context, AnalysisTarget target,
+      Map<String, dynamic> inputs) {
+    AnalysisTask task = buildTask(context, target);
+    task.inputs = inputs;
+    return task;
+  }
+
+  @override
+  String toString() => name;
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/task/strong_mode.dart b/mojo/public/dart/third_party/analyzer/lib/src/task/strong_mode.dart
new file mode 100644
index 0000000..3d13146
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/task/strong_mode.dart
@@ -0,0 +1,557 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.src.task.strong_mode;
+
+import 'dart:collection';
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
+
+/**
+ * Set the type of the sole parameter of the given [element] to the given [type].
+ */
+void setParameterType(PropertyAccessorElement element, DartType type) {
+  if (element is PropertyAccessorElementImpl) {
+    ParameterElement parameter = _getParameter(element);
+    if (parameter is ParameterElementImpl) {
+      //
+      // Update the type of the parameter.
+      //
+      parameter.type = type;
+      //
+      // Update the type of the setter to reflect the new parameter type.
+      //
+      FunctionType functionType = element.type;
+      if (functionType is FunctionTypeImpl) {
+        element.type =
+            new FunctionTypeImpl(element, functionType.prunedTypedefs);
+      } else {
+        assert(false);
+      }
+    } else {
+      assert(false);
+    }
+  } else {
+    throw new StateError('element is an instance of ${element.runtimeType}');
+    assert(false);
+  }
+}
+
+/**
+ * Set the return type of the given [element] to the given [type].
+ */
+void setReturnType(ExecutableElement element, DartType type) {
+  if (element is ExecutableElementImpl) {
+    //
+    // Update the return type of the element, which is stored in two places:
+    // directly in the element and indirectly in the type of the element.
+    //
+    element.returnType = type;
+    FunctionType functionType = element.type;
+    if (functionType is FunctionTypeImpl) {
+      element.type = new FunctionTypeImpl(element, functionType.prunedTypedefs);
+    } else {
+      assert(false);
+    }
+  } else {
+    assert(false);
+  }
+}
+
+/**
+ * Return the element for the single parameter of the given [setter], or `null`
+ * if the executable element is not a setter or does not have a single
+ * parameter.
+ */
+ParameterElement _getParameter(ExecutableElement setter) {
+  if (setter is PropertyAccessorElement && setter.isSetter) {
+    List<ParameterElement> parameters = setter.parameters;
+    if (parameters.length == 1) {
+      return parameters[0];
+    }
+  }
+  return null;
+}
+
+/**
+ * A function that returns `true` if the given [variable] passes the filter.
+ */
+typedef bool VariableFilter(VariableElement element);
+
+/**
+ * An object used to find static variables whose types should be inferred and
+ * classes whose members should have types inferred. Clients are expected to
+ * visit a [CompilationUnit].
+ */
+class InferrenceFinder extends SimpleAstVisitor {
+  /**
+   * The static variables that should have types inferred for them.
+   */
+  final List<VariableElement> staticVariables = <VariableElement>[];
+
+  /**
+   * The classes defined in the unit.
+   *
+   * TODO(brianwilkerson) We don't currently remove classes whose members do not
+   * need to be processed, but we potentially could.
+   */
+  final List<ClassElement> classes = <ClassElement>[];
+
+  /**
+   * Initialize a newly created finder.
+   */
+  InferrenceFinder();
+
+  @override
+  void visitClassDeclaration(ClassDeclaration node) {
+    classes.add(node.element);
+    for (ClassMember member in node.members) {
+      member.accept(this);
+    }
+  }
+
+  @override
+  void visitClassTypeAlias(ClassTypeAlias node) {
+    classes.add(node.element);
+  }
+
+  @override
+  void visitCompilationUnit(CompilationUnit node) {
+    for (CompilationUnitMember declaration in node.declarations) {
+      declaration.accept(this);
+    }
+  }
+
+  @override
+  void visitFieldDeclaration(FieldDeclaration node) {
+    if (node.isStatic && node.fields.type == null) {
+      _addVariables(node.fields.variables);
+    }
+  }
+
+  @override
+  void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    if (node.variables.type == null) {
+      _addVariables(node.variables.variables);
+    }
+  }
+
+  /**
+   * Add all of the [variables] with initializers to the list of variables whose
+   * type can be inferred. Technically, we only infer the types of variables
+   * that do not have a static type, but all variables with initializers
+   * potentially need to be re-resolved after inference because they might
+   * refer to fields whose type was inferred.
+   */
+  void _addVariables(NodeList<VariableDeclaration> variables) {
+    for (VariableDeclaration variable in variables) {
+      if (variable.initializer != null) {
+        VariableElement element = variable.element;
+        if (element.hasImplicitType) {
+          staticVariables.add(element);
+        }
+      }
+    }
+  }
+}
+
+/**
+ * An object used to infer the type of instance fields and the return types of
+ * instance methods within a single compilation unit.
+ */
+class InstanceMemberInferrer {
+  /**
+   * The type provider used to look up types.
+   */
+  final TypeProvider typeProvider;
+
+  /**
+   * The type system used to compute the least upper bound of types.
+   */
+  TypeSystem typeSystem;
+
+  /**
+   * The inheritance manager used to find overridden method.
+   */
+  InheritanceManager inheritanceManager;
+
+  /**
+   * The classes that have been visited while attempting to infer the types of
+   * instance members of some base class.
+   */
+  HashSet<ClassElementImpl> elementsBeingInferred =
+      new HashSet<ClassElementImpl>();
+
+  /**
+   * Initialize a newly create inferrer.
+   */
+  InstanceMemberInferrer(this.typeProvider) {
+    typeSystem = new TypeSystemImpl(typeProvider);
+  }
+
+  /**
+   * Infer type information for all of the instance members in the given
+   * compilation [unit].
+   */
+  void inferCompilationUnit(CompilationUnitElement unit) {
+    inheritanceManager = new InheritanceManager(unit.library);
+    unit.types.forEach((ClassElement classElement) {
+      try {
+        _inferClass(classElement);
+      } on _CycleException {
+        // This is a short circuit return to prevent types that inherit from
+        // types containing a circular reference from being inferred.
+      }
+    });
+  }
+
+  /**
+   * Compute the best type for the [parameter] at the given [index] that must be
+   * compatible with the types of the corresponding parameters of the given
+   * [overriddenMethods].
+   *
+   * At the moment, this method will only return a type other than 'dynamic' if
+   * the types of all of the parameters are the same. In the future we might
+   * want to be smarter about it, such as by returning the least upper bound of
+   * the parameter types.
+   */
+  DartType _computeParameterType(ParameterElement parameter, int index,
+      List<ExecutableElement> overriddenMethods) {
+    DartType parameterType = null;
+    int length = overriddenMethods.length;
+    for (int i = 0; i < length; i++) {
+      DartType type = _getTypeOfCorrespondingParameter(
+          parameter, index, overriddenMethods[i]);
+      if (parameterType == null) {
+        parameterType = type;
+      } else if (parameterType != type) {
+        return typeProvider.dynamicType;
+      }
+    }
+    return parameterType == null ? typeProvider.dynamicType : parameterType;
+  }
+
+  /**
+   * Compute the best return type for a method that must be compatible with the
+   * return types of each of the given [overriddenMethods].
+   *
+   * At the moment, this method will only return a type other than 'dynamic' if
+   * the return types of all of the methods are the same. In the future we might
+   * want to be smarter about it.
+   */
+  DartType _computeReturnType(List<ExecutableElement> overriddenMethods) {
+    DartType returnType = null;
+    int length = overriddenMethods.length;
+    for (int i = 0; i < length; i++) {
+      DartType type = _getReturnType(overriddenMethods[i]);
+      if (returnType == null) {
+        returnType = type;
+      } else if (returnType != type) {
+        return typeProvider.dynamicType;
+      }
+    }
+    return returnType == null ? typeProvider.dynamicType : returnType;
+  }
+
+  DartType _getReturnType(ExecutableElement element) {
+    DartType returnType = element.returnType;
+    if (returnType == null) {
+      return typeProvider.dynamicType;
+    }
+    return returnType;
+  }
+
+  /**
+   * Given a [method], return the type of the parameter in the method that
+   * corresponds to the given [parameter]. If the parameter is positional, then
+   * it appears at the given [index] in its enclosing element's list of
+   * parameters.
+   */
+  DartType _getTypeOfCorrespondingParameter(
+      ParameterElement parameter, int index, ExecutableElement method) {
+    //
+    // Find the corresponding parameter.
+    //
+    List<ParameterElement> methodParameters = method.parameters;
+    ParameterElement matchingParameter = null;
+    if (parameter.parameterKind == ParameterKind.NAMED) {
+      //
+      // If we're looking for a named parameter, only a named parameter with
+      // the same name will be matched.
+      //
+      matchingParameter = methodParameters.lastWhere(
+          (ParameterElement methodParameter) =>
+              methodParameter.parameterKind == ParameterKind.NAMED &&
+                  methodParameter.name == parameter.name,
+          orElse: () => null);
+    } else {
+      //
+      // If we're looking for a positional parameter we ignore the difference
+      // between required and optional parameters.
+      //
+      if (index < methodParameters.length) {
+        matchingParameter = methodParameters[index];
+        if (matchingParameter.parameterKind == ParameterKind.NAMED) {
+          matchingParameter = null;
+        }
+      }
+    }
+    //
+    // Then return the type of the parameter.
+    //
+    return matchingParameter == null
+        ? typeProvider.dynamicType
+        : matchingParameter.type;
+  }
+
+  /**
+   * If the given [accessorElement] represents a non-synthetic instance getter
+   * for which no return type was provided, infer the return type of the getter.
+   */
+  void _inferAccessor(PropertyAccessorElement accessorElement) {
+    if (!accessorElement.isSynthetic &&
+        accessorElement.isGetter &&
+        !accessorElement.isStatic &&
+        accessorElement.hasImplicitReturnType) {
+      List<ExecutableElement> overriddenGetters = inheritanceManager
+          .lookupOverrides(
+              accessorElement.enclosingElement, accessorElement.name);
+      if (overriddenGetters.isNotEmpty && _onlyGetters(overriddenGetters)) {
+        DartType newType = _computeReturnType(overriddenGetters);
+        List<ExecutableElement> overriddenSetters = inheritanceManager
+            .lookupOverrides(
+                accessorElement.enclosingElement, accessorElement.name + '=');
+        PropertyAccessorElement setter = (accessorElement.enclosingElement
+            as ClassElement).getSetter(accessorElement.name);
+        if (setter != null) {
+          overriddenSetters.add(setter);
+        }
+        if (!_isCompatible(newType, overriddenSetters)) {
+          newType = typeProvider.dynamicType;
+        }
+        setReturnType(accessorElement, newType);
+        (accessorElement.variable as FieldElementImpl).type = newType;
+      }
+    }
+  }
+
+  /**
+   * Infer type information for all of the instance members in the given
+   * [classElement].
+   */
+  void _inferClass(ClassElement classElement) {
+    if (classElement is ClassElementImpl) {
+      if (classElement.hasBeenInferred) {
+        return;
+      }
+      if (!elementsBeingInferred.add(classElement)) {
+        // We have found a circularity in the class hierarchy. For now we just
+        // stop trying to infer any type information for any classes that
+        // inherit from any class in the cycle. We could potentially limit the
+        // algorithm to only not inferring types in the classes in the cycle,
+        // but it isn't clear that the results would be significantly better.
+        throw new _CycleException();
+      }
+      try {
+        //
+        // Ensure that all of instance members in the supertypes have had types
+        // inferred for them.
+        //
+        _inferType(classElement.supertype);
+        classElement.mixins.forEach(_inferType);
+        classElement.interfaces.forEach(_inferType);
+        //
+        // Then infer the types for the members.
+        //
+        classElement.fields.forEach(_inferField);
+        classElement.accessors.forEach(_inferAccessor);
+        classElement.methods.forEach(_inferMethod);
+        classElement.hasBeenInferred = true;
+      } finally {
+        elementsBeingInferred.remove(classElement);
+      }
+    }
+  }
+
+  /**
+   * If the given [fieldElement] represents a non-synthetic instance field for
+   * which no type was provided, infer the type of the field.
+   */
+  void _inferField(FieldElement fieldElement) {
+    if (!fieldElement.isSynthetic &&
+        !fieldElement.isStatic &&
+        fieldElement.hasImplicitType) {
+      //
+      // First look for overridden getters with the same name as the field.
+      //
+      List<ExecutableElement> overriddenGetters = inheritanceManager
+          .lookupOverrides(fieldElement.enclosingElement, fieldElement.name);
+      DartType newType = null;
+      if (overriddenGetters.isNotEmpty && _onlyGetters(overriddenGetters)) {
+        newType = _computeReturnType(overriddenGetters);
+        List<ExecutableElement> overriddenSetters = inheritanceManager
+            .lookupOverrides(
+                fieldElement.enclosingElement, fieldElement.name + '=');
+        if (!_isCompatible(newType, overriddenSetters)) {
+          newType = null;
+        }
+      }
+      //
+      // Then, if none was found, infer the type from the initialization
+      // expression.
+      //
+      if (newType == null) {
+        if (fieldElement.initializer != null &&
+            (fieldElement.isFinal || overriddenGetters.isEmpty)) {
+          newType = fieldElement.initializer.returnType;
+        }
+      }
+      if (newType == null || newType.isBottom) {
+        newType = typeProvider.dynamicType;
+      }
+      (fieldElement as FieldElementImpl).type = newType;
+      setReturnType(fieldElement.getter, newType);
+      if (!fieldElement.isFinal && !fieldElement.isConst) {
+         setParameterType(fieldElement.setter, newType);
+      }
+    }
+  }
+
+  /**
+   * If the given [methodElement] represents a non-synthetic instance method
+   * for which no return type was provided, infer the return type of the method.
+   */
+  void _inferMethod(MethodElement methodElement) {
+    if (methodElement.isSynthetic || methodElement.isStatic) {
+      return;
+    }
+    List<ExecutableElement> overriddenMethods = null;
+    //
+    // Infer the return type.
+    //
+    if (methodElement.hasImplicitReturnType) {
+      overriddenMethods = inheritanceManager.lookupOverrides(
+          methodElement.enclosingElement, methodElement.name);
+      if (overriddenMethods.isEmpty || !_onlyMethods(overriddenMethods)) {
+        return;
+      }
+      MethodElementImpl element = methodElement as MethodElementImpl;
+      setReturnType(element, _computeReturnType(overriddenMethods));
+    }
+    //
+    // Infer the parameter types.
+    //
+    List<ParameterElement> parameters = methodElement.parameters;
+    int length = parameters.length;
+    for (int i = 0; i < length; ++i) {
+      ParameterElement parameter = parameters[i];
+      if (parameter is ParameterElementImpl && parameter.hasImplicitType) {
+        if (overriddenMethods == null) {
+          overriddenMethods = inheritanceManager.lookupOverrides(
+              methodElement.enclosingElement, methodElement.name);
+        }
+        if (overriddenMethods.isEmpty || !_onlyMethods(overriddenMethods)) {
+          return;
+        }
+        parameter.type = _computeParameterType(parameter, i, overriddenMethods);
+      }
+    }
+  }
+
+  /**
+   * Infer type information for all of the instance members in the given
+   * interface [type].
+   */
+  void _inferType(InterfaceType type) {
+    if (type != null) {
+      ClassElement element = type.element;
+      if (element != null) {
+        _inferClass(element);
+      }
+    }
+  }
+
+  /**
+   * Return `true` if the given [type] is compatible with the argument types of
+   * all of the given [setters].
+   */
+  bool _isCompatible(DartType type, List<ExecutableElement> setters) {
+    for (ExecutableElement setter in setters) {
+      ParameterElement parameter = _getParameter(setter);
+      if (parameter != null && !typeSystem.isSubtypeOf(parameter.type, type)) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Return `true` if the list of [elements] contains only getters.
+   */
+  bool _onlyGetters(List<ExecutableElement> elements) {
+    for (ExecutableElement element in elements) {
+      if (!(element is PropertyAccessorElement && element.isGetter)) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Return `true` if the list of [elements] contains only methods.
+   */
+  bool _onlyMethods(List<ExecutableElement> elements) {
+    for (ExecutableElement element in elements) {
+      if (element is! MethodElement) {
+        return false;
+      }
+    }
+    return true;
+  }
+}
+
+/**
+ * A visitor that will gather all of the variables referenced within a given
+ * AST structure. The collection can be restricted to contain only those
+ * variables that pass a specified filter.
+ */
+class VariableGatherer extends RecursiveAstVisitor {
+  /**
+   * The filter used to limit which variables are gathered, or `null` if no
+   * filtering is to be performed.
+   */
+  final VariableFilter filter;
+
+  /**
+   * The variables that were found.
+   */
+  final Set<VariableElement> results = new HashSet<VariableElement>();
+
+  /**
+   * Initialize a newly created gatherer to gather all of the variables that
+   * pass the given [filter] (or all variables if no filter is provided).
+   */
+  VariableGatherer([this.filter = null]);
+
+  @override
+  void visitSimpleIdentifier(SimpleIdentifier node) {
+    if (!node.inDeclarationContext()) {
+      Element element = node.staticElement;
+      if (element is PropertyAccessorElement && element.isSynthetic) {
+        element = (element as PropertyAccessorElement).variable;
+      }
+      if (element is VariableElement && (filter == null || filter(element))) {
+        results.add(element);
+      }
+    }
+  }
+}
+
+/**
+ * A class of exception that is not used anywhere else.
+ */
+class _CycleException implements Exception {}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/util/asserts.dart b/mojo/public/dart/third_party/analyzer/lib/src/util/asserts.dart
new file mode 100644
index 0000000..a53e7e6
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/util/asserts.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.utilities.asserts;
+
+/**
+ * Ensures that the given [value] is not null.
+ * Otherwise throws an [ArgumentError].
+ * An optional [description] is used in the error message.
+ */
+void notNull(Object value, [String description]) {
+  if (value == null) {
+    if (description == null) {
+      throw new ArgumentError('Must not be null');
+    } else {
+      throw new ArgumentError('Must not be null: $description');
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/util/lru_map.dart b/mojo/public/dart/third_party/analyzer/lib/src/util/lru_map.dart
new file mode 100644
index 0000000..38ef8ff
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/util/lru_map.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.utilities.lru_cache;
+
+import 'dart:collection';
+
+/**
+ * This handler is notified when an item is evicted from the cache.
+ */
+typedef EvictionHandler<K, V>(K key, V value);
+
+/**
+ * A hash-table based cache implementation.
+ *
+ * When it reaches the specified number of items, the item that has not been
+ * accessed (both get and put) recently is evicted.
+ */
+class LRUMap<K, V> {
+  final LinkedHashMap<K, V> _map = new LinkedHashMap<K, V>();
+  final int _maxSize;
+  final EvictionHandler _handler;
+
+  LRUMap(this._maxSize, [this._handler]);
+
+  /**
+   * Returns the value for the given [key] or null if [key] is not
+   * in the cache.
+   */
+  V get(K key) {
+    V value = _map.remove(key);
+    if (value != null) {
+      _map[key] = value;
+    }
+    return value;
+  }
+
+  /**
+   * Associates the [key] with the given [value].
+   *
+   * If the cache is full, an item that has not been accessed recently is
+   * evicted.
+   */
+  void put(K key, V value) {
+    _map.remove(key);
+    _map[key] = value;
+    if (_map.length > _maxSize) {
+      K evictedKey = _map.keys.first;
+      V evictedValue = _map.remove(evictedKey);
+      if (_handler != null) {
+        _handler(evictedKey, evictedValue);
+      }
+    }
+  }
+
+  /**
+   * Removes the association for the given [key].
+   */
+  void remove(K key) {
+    _map.remove(key);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/src/util/utilities_timing.dart b/mojo/public/dart/third_party/analyzer/lib/src/util/utilities_timing.dart
new file mode 100644
index 0000000..7b8e122
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/src/util/utilities_timing.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.utilities.timing;
+
+/**
+ * A `CountedStopwatch` is a [Stopwatch] that counts the number of times the
+ * stop method has been invoked.
+ */
+class CountedStopwatch extends Stopwatch {
+  /**
+   * The number of times the [stop] method has been invoked.
+   */
+  int stopCount = 0;
+
+  /**
+   * Initialize a newly created stopwatch.
+   */
+  CountedStopwatch();
+
+  /**
+   * The average number of millisecond that were recorded each time the [start]
+   * and [stop] methods were invoked.
+   */
+  int get averageMilliseconds => elapsedMilliseconds ~/ stopCount;
+
+  @override
+  void reset() {
+    super.reset();
+    stopCount = 0;
+  }
+
+  @override
+  void stop() {
+    super.stop();
+    stopCount++;
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/task/dart.dart b/mojo/public/dart/third_party/analyzer/lib/task/dart.dart
new file mode 100644
index 0000000..a0e309e
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/task/dart.dart
@@ -0,0 +1,186 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.task.dart;
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/utilities_general.dart';
+import 'package:analyzer/src/task/dart.dart';
+import 'package:analyzer/task/model.dart';
+
+/**
+ * The analysis errors associated with a [Source] representing a compilation
+ * unit.
+ */
+final ListResultDescriptor<AnalysisError> DART_ERRORS =
+    new ListResultDescriptor<AnalysisError>(
+        'DART_ERRORS', AnalysisError.NO_ERRORS);
+
+/**
+ * The sources of the libraries that are explicitly imported into a library.
+ *
+ * The list will be empty if there are no explicit imports, but will not be
+ * `null`.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ListResultDescriptor<Source> EXPLICITLY_IMPORTED_LIBRARIES =
+    new ListResultDescriptor<Source>(
+        'EXPLICITLY_IMPORTED_LIBRARIES', Source.EMPTY_LIST);
+
+/**
+ * The sources of the libraries that are exported from a library.
+ *
+ * The list will be empty if there are no exported libraries, but will not be
+ * `null`.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ListResultDescriptor<Source> EXPORTED_LIBRARIES =
+    new ListResultDescriptor<Source>('EXPORTED_LIBRARIES', Source.EMPTY_LIST);
+
+/**
+ * The sources of the libraries that are implicitly or explicitly imported into
+ * a library.
+ *
+ * The list will minimally contain the source for `dart:core` because it is
+ * implicitly imported into every library, and therefore will never be `null`.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ListResultDescriptor<Source> IMPORTED_LIBRARIES =
+    new ListResultDescriptor<Source>('IMPORTED_LIBRARIES', Source.EMPTY_LIST);
+
+/**
+ * The sources of the parts that are included in a library.
+ *
+ * The list will be empty if there are no parts, but will not be `null`. The
+ * list does *not* include the source for the defining compilation unit.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ListResultDescriptor<Source> INCLUDED_PARTS =
+    new ListResultDescriptor<Source>('INCLUDED_PARTS', Source.EMPTY_LIST);
+
+/**
+ * A flag specifying whether a library is dependent on code that is only
+ * available in a client.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ResultDescriptor<bool> IS_CLIENT =
+    new ResultDescriptor<bool>('IS_CLIENT', false);
+
+/**
+ * A flag specifying whether a library is launchable.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ResultDescriptor<bool> IS_LAUNCHABLE =
+    new ResultDescriptor<bool>('IS_LAUNCHABLE', false);
+
+/**
+ * The fully built [LibraryElement] associated with a library.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT =
+    new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT', null);
+
+/**
+ * The compilation unit AST produced while parsing a compilation unit.
+ *
+ * The AST structure will not have resolution information associated with it.
+ *
+ * The result is only available for [Source]s representing a compilation unit.
+ */
+final ResultDescriptor<CompilationUnit> PARSED_UNIT =
+    new ResultDescriptor<CompilationUnit>('PARSED_UNIT', null,
+        cachingPolicy: AST_CACHING_POLICY);
+
+/**
+ * The resolved [CompilationUnit] associated with a compilation unit, with
+ * constants resolved.
+ *
+ * The result is only available for [LibrarySpecificUnit]s.
+ */
+final ResultDescriptor<CompilationUnit> RESOLVED_UNIT =
+    new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT', null,
+        cachingPolicy: AST_CACHING_POLICY);
+
+/**
+ * The kind of a [Source].
+ */
+final ResultDescriptor<SourceKind> SOURCE_KIND =
+    new ResultDescriptor<SourceKind>('SOURCE_KIND', SourceKind.UNKNOWN);
+
+/**
+ * The token stream produced while scanning a compilation unit.
+ *
+ * The value is the first token in the file, or the special end-of-file marker
+ * at the end of the stream if the file does not contain any tokens.
+ *
+ * The result is only available for [Source]s representing a compilation unit.
+ */
+final ResultDescriptor<Token> TOKEN_STREAM = new ResultDescriptor<Token>(
+    'TOKEN_STREAM', null, cachingPolicy: TOKEN_STREAM_CACHING_POLICY);
+
+/**
+ * The sources of the Dart files that a library consists of.
+ *
+ * The list will include the source of the defining unit and [INCLUDED_PARTS].
+ * So, it is never empty or `null`.
+ *
+ * The result is only available for [Source]s representing a library.
+ */
+final ListResultDescriptor<Source> UNITS =
+    new ListResultDescriptor<Source>('UNITS', Source.EMPTY_LIST);
+
+/**
+ * A specific compilation unit in a specific library.
+ *
+ * This kind of target is associated with information about a compilation unit
+ * that differs based on the library that the unit is a part of. For example,
+ * the result of resolving a compilation unit depends on the imports, which can
+ * change if a single part is included in more than one library.
+ */
+class LibrarySpecificUnit implements AnalysisTarget {
+  /**
+   * The defining compilation unit of the library in which the [unit]
+   * is analyzed.
+   */
+  final Source library;
+
+  /**
+   * The compilation unit which belongs to the [library].
+   */
+  final Source unit;
+
+  /**
+   * Initialize a newly created target for the [unit] in the [library].
+   */
+  LibrarySpecificUnit(this.library, this.unit);
+
+  @override
+  int get hashCode {
+    return JenkinsSmiHash.combine(library.hashCode, unit.hashCode);
+  }
+
+  @override
+  Source get source => unit;
+
+  @override
+  bool operator ==(other) {
+    return other is LibrarySpecificUnit &&
+        other.library == library &&
+        other.unit == unit;
+  }
+
+  @override
+  String toString() => '$unit in $library';
+}
diff --git a/mojo/public/dart/third_party/analyzer/lib/task/general.dart b/mojo/public/dart/third_party/analyzer/lib/task/general.dart
new file mode 100644
index 0000000..c40ff4c
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/task/general.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.task.general;
+
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/task/model.dart';
+
+/**
+ * The content of a [Source].
+ */
+final ResultDescriptor<String> CONTENT =
+    new ResultDescriptor<String>('CONTENT', null);
+
+/**
+ * The line information for a [Source].
+ */
+final ResultDescriptor<LineInfo> LINE_INFO =
+    new ResultDescriptor<LineInfo>('LINE_INFO', null);
+
+/**
+ * The modification time of a [Source].
+ */
+final ResultDescriptor<int> MODIFICATION_TIME =
+    new ResultDescriptor<int>('MODIFICATION_TIME', -1);
diff --git a/mojo/public/dart/third_party/analyzer/lib/task/html.dart b/mojo/public/dart/third_party/analyzer/lib/task/html.dart
new file mode 100644
index 0000000..abfbdf7
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/task/html.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.task.html;
+
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:html/dom.dart';
+
+/**
+ * The result of parsing an HTML file.
+ */
+final ResultDescriptor<Document> HTML_DOCUMENT =
+    new ResultDescriptor<Document>('HTML_DOCUMENT', null);
+
+/**
+ * The analysis errors associated with a [Source] representing an HTML file.
+ */
+final ListResultDescriptor<AnalysisError> HTML_ERRORS =
+    new ListResultDescriptor<AnalysisError>(
+        'HTML_ERRORS', AnalysisError.NO_ERRORS);
+
+/**
+ * The sources of the Dart libraries referenced by an HTML file.
+ */
+final ListResultDescriptor<Source> REFERENCED_LIBRARIES =
+    new ListResultDescriptor<Source>('REFERENCED_LIBRARIES', Source.EMPTY_LIST);
diff --git a/mojo/public/dart/third_party/analyzer/lib/task/model.dart b/mojo/public/dart/third_party/analyzer/lib/task/model.dart
new file mode 100644
index 0000000..9375576
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/lib/task/model.dart
@@ -0,0 +1,647 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.task.model;
+
+import 'dart:collection';
+
+import 'package:analyzer/src/generated/engine.dart' hide AnalysisTask;
+import 'package:analyzer/src/generated/error.dart' show AnalysisError;
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/utilities_general.dart';
+import 'package:analyzer/src/task/driver.dart';
+import 'package:analyzer/src/task/model.dart';
+
+/**
+ * A function that converts the given [key] and [value] into a [TaskInput].
+ */
+typedef TaskInput<E> BinaryFunction<K, V, E>(K key, V value);
+
+/**
+ * A function that takes an analysis [context] and an analysis [target] and
+ * returns an analysis task. Such functions are passed to a [TaskDescriptor] to
+ * be used to create the described task.
+ */
+typedef AnalysisTask BuildTask(AnalysisContext context, AnalysisTarget target);
+
+/**
+ * A function that takes the target for which a task will produce results and
+ * returns a map from input names to descriptions of the analysis results needed
+ * by the task in order for the task to be performed. Such functions are passed
+ * to a [TaskDescriptor] to be used to determine the inputs needed by the task.
+ */
+typedef Map<String, TaskInput> CreateTaskInputs(AnalysisTarget target);
+
+/**
+ * A function that converts an object of the type [B] into a [TaskInput].
+ * This is used, for example, by a [ListTaskInput] to create task inputs
+ * for each value in a list of values.
+ */
+typedef TaskInput<E> UnaryFunction<B, E>(B object);
+
+/**
+ * An [AnalysisTarget] wrapper for an [AnalysisContext].
+ */
+class AnalysisContextTarget implements AnalysisTarget {
+  static final AnalysisContextTarget request = new AnalysisContextTarget(null);
+
+  final AnalysisContext context;
+
+  AnalysisContextTarget(this.context);
+
+  @override
+  Source get source => null;
+}
+
+/**
+ * An object with which an analysis result can be associated.
+ *
+ * Clients are allowed to subtype this class when creating new kinds of targets.
+ * Instances of this type are used in hashed data structures, so subtypes are
+ * required to correctly implement [==] and [hashCode].
+ */
+abstract class AnalysisTarget {
+  /**
+   * Return the source associated with this target, or `null` if this target is
+   * not associated with a source.
+   */
+  Source get source;
+}
+
+/**
+ * An object used to compute one or more analysis results associated with a
+ * single target.
+ *
+ * Clients are expected to extend this class when creating new tasks.
+ */
+abstract class AnalysisTask {
+  /**
+   * A table mapping the types of analysis tasks to the number of times each
+   * kind of task has been performed.
+   */
+  static final Map<Type, int> countMap = new HashMap<Type, int>();
+
+  /**
+   * A table mapping the types of analysis tasks to stopwatches used to compute
+   * how much time was spent executing each kind of task.
+   */
+  static final Map<Type, Stopwatch> stopwatchMap =
+      new HashMap<Type, Stopwatch>();
+
+  /**
+   * The context in which the task is to be performed.
+   */
+  final AnalysisContext context;
+
+  /**
+   * The target for which result values are being produced.
+   */
+  final AnalysisTarget target;
+
+  /**
+   * A table mapping input names to input values.
+   */
+  Map<String, dynamic> inputs;
+
+  /**
+   * A table mapping result descriptors whose values are produced by this task
+   * to the values that were produced.
+   */
+  Map<ResultDescriptor, dynamic> outputs =
+      new HashMap<ResultDescriptor, dynamic>();
+
+  /**
+   * The exception that was thrown while performing this task, or `null` if the
+   * task completed successfully.
+   */
+  CaughtException caughtException;
+
+  /**
+   * If a dependency cycle was found while computing the inputs for the task,
+   * the set of [WorkItem]s contained in the cycle (if there are overlapping
+   * cycles, this is the set of all [WorkItem]s in the entire strongly
+   * connected component).  Otherwise, `null`.
+   */
+  List<WorkItem> dependencyCycle;
+
+  /**
+   * Initialize a newly created task to perform analysis within the given
+   * [context] in order to produce results for the given [target].
+   */
+  AnalysisTask(this.context, this.target);
+
+  /**
+   * Return a textual description of this task.
+   */
+  String get description;
+
+  /**
+   * Return the descriptor that describes this task.
+   */
+  TaskDescriptor get descriptor;
+
+  /**
+   * Indicates whether the task is capable of handling dependency cycles.  A
+   * task that overrides this getter to return `true` must be prepared for the
+   * possibility that it will be invoked with a non-`null` value of
+   * [dependencyCycle], and with not all of its inputs computed.
+   */
+  bool get handlesDependencyCycles => false;
+
+  /**
+   * Return the value of the input with the given [name]. Throw an exception if
+   * the input value is not defined.
+   */
+  Object getRequiredInput(String name) {
+    if (inputs == null || !inputs.containsKey(name)) {
+      throw new AnalysisException("Could not $description: missing $name");
+    }
+    return inputs[name];
+  }
+
+  /**
+   * Return the source associated with the target. Throw an exception if
+   * the target is not associated with a source.
+   */
+  Source getRequiredSource() {
+    Source source = target.source;
+    if (source == null) {
+      throw new AnalysisException("Could not $description: missing source");
+    }
+    return source;
+  }
+
+  /**
+   * Perform this analysis task, protected by an exception handler.
+   *
+   * This method should throw an [AnalysisException] if an exception occurs
+   * while performing the task. If other kinds of exceptions are thrown they
+   * will be wrapped in an [AnalysisException].
+   *
+   * If no exception is thrown, this method must fully populate the [outputs]
+   * map (have a key/value pair for each result that this task is expected to
+   * produce).
+   */
+  void internalPerform();
+
+  /**
+   * Perform this analysis task. When this method returns, either the [outputs]
+   * map should be fully populated (have a key/value pair for each result that
+   * this task is expected to produce) or the [caughtException] should be set.
+   *
+   * Clients should not override this method.
+   */
+  void perform() {
+    try {
+      _safelyPerform();
+    } on AnalysisException catch (exception, stackTrace) {
+      caughtException = new CaughtException(exception, stackTrace);
+      AnalysisEngine.instance.logger.logInformation(
+          "Task failed: ${description}", caughtException);
+    }
+  }
+
+  @override
+  String toString() => description;
+
+  /**
+   * Perform this analysis task, ensuring that all exceptions are wrapped in an
+   * [AnalysisException].
+   *
+   * Clients should not override this method.
+   */
+  void _safelyPerform() {
+    try {
+      //
+      // Report that this task is being performed.
+      //
+      String contextName = context.name;
+      if (contextName == null) {
+        contextName = 'unnamed';
+      }
+      AnalysisEngine.instance.instrumentationService.logAnalysisTask(
+          contextName, this);
+      //
+      // Gather statistics on the performance of the task.
+      //
+      int count = countMap[runtimeType];
+      countMap[runtimeType] = count == null ? 1 : count + 1;
+      Stopwatch stopwatch = stopwatchMap[runtimeType];
+      if (stopwatch == null) {
+        stopwatch = new Stopwatch();
+        stopwatchMap[runtimeType] = stopwatch;
+      }
+      stopwatch.start();
+      //
+      // Actually perform the task.
+      //
+      try {
+        if (dependencyCycle != null && !handlesDependencyCycles) {
+          throw new InfiniteTaskLoopException(this, dependencyCycle);
+        }
+        internalPerform();
+      } finally {
+        stopwatch.stop();
+      }
+    } on AnalysisException {
+      rethrow;
+    } catch (exception, stackTrace) {
+      throw new AnalysisException(
+          'Unexpected exception while performing $description',
+          new CaughtException(exception, stackTrace));
+    }
+  }
+}
+
+/**
+ * A description of a [List]-based analysis result that can be computed by an
+ * [AnalysisTask].
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class ListResultDescriptor<E> implements ResultDescriptor<List<E>> {
+  /**
+   * Initialize a newly created analysis result to have the given [name] and
+   * [defaultValue]. If a [cachingPolicy] is provided, it will control how long
+   * values associated with this result will remain in the cache.
+   */
+  factory ListResultDescriptor(String name, List<E> defaultValue,
+      {ResultCachingPolicy<List<E>> cachingPolicy}) = ListResultDescriptorImpl<E>;
+
+  @override
+  ListTaskInput<E> of(AnalysisTarget target);
+}
+
+/**
+ * A description of an input to an [AnalysisTask] that can be used to compute
+ * that input.
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class ListTaskInput<E> extends TaskInput<List<E>> {
+  /**
+   * Return a task input that can be used to compute a list whose elements are
+   * the result of passing the elements of this input to the [mapper] function.
+   */
+  ListTaskInput /*<V>*/ toList(UnaryFunction<E, dynamic /*<V>*/ > mapper);
+
+  /**
+   * Return a task input that can be used to compute a list whose elements are
+   * [valueResult]'s associated with those elements.
+   */
+  ListTaskInput /*<V>*/ toListOf(ResultDescriptor /*<V>*/ valueResult);
+
+  /**
+   * Return a task input that can be used to compute a map whose keys are the
+   * elements of this input and whose values are the result of passing the
+   * corresponding key to the [mapper] function.
+   */
+  MapTaskInput<E, dynamic /*V*/ > toMap(
+      UnaryFunction<E, dynamic /*<V>*/ > mapper);
+
+  /**
+   * Return a task input that can be used to compute a map whose keys are the
+   * elements of this input and whose values are the [valueResult]'s associated
+   * with those elements.
+   */
+  MapTaskInput<AnalysisTarget, dynamic /*V*/ > toMapOf(
+      ResultDescriptor /*<V>*/ valueResult);
+}
+
+/**
+ * A description of an input with a [Map] based values.
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class MapTaskInput<K, V> extends TaskInput<Map<K, V>> {
+  /**
+   * [V] must be a [List].
+   * Return a task input that can be used to compute a list whose elements are
+   * the result of passing keys [K] and the corresponding elements of [V] to
+   * the [mapper] function.
+   */
+  TaskInput<List /*<E>*/ > toFlattenList(
+      BinaryFunction<K, dynamic /*element of V*/, dynamic /*<E>*/ > mapper);
+}
+
+/**
+ * A policy object that can compute sizes of results and provide the maximum
+ * active and idle sizes that can be kept in the cache.
+ *
+ * All the [ResultDescriptor]s with the same [ResultCachingPolicy] instance
+ * share the same total size in a cache.
+ */
+abstract class ResultCachingPolicy<T> {
+  /**
+   * Return the maximum total size of results that can be kept in the cache
+   * while analysis is in progress.
+   */
+  int get maxActiveSize;
+
+  /**
+   * Return the maximum total size of results that can be kept in the cache
+   * while analysis is idle.
+   */
+  int get maxIdleSize;
+
+  /**
+   * Return the size of the given [object].
+   */
+  int measure(T object);
+}
+
+/**
+ * A description of an analysis result that can be computed by an [AnalysisTask].
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class ResultDescriptor<V> {
+  /**
+   * Initialize a newly created analysis result to have the given [name] and
+   * [defaultValue].
+   *
+   * The given [cachingPolicy] is used to limit the total size of results
+   * described by this descriptor. If no policy is specified, the results are
+   * never evicted from the cache, and removed only when they are invalidated.
+   */
+  factory ResultDescriptor(String name, V defaultValue,
+      {ResultCachingPolicy<V> cachingPolicy}) = ResultDescriptorImpl;
+
+  /**
+   * Return the caching policy for results described by this descriptor.
+   */
+  ResultCachingPolicy<V> get cachingPolicy;
+
+  /**
+   * Return the default value for results described by this descriptor.
+   */
+  V get defaultValue;
+
+  /**
+   * Return the name of this descriptor.
+   */
+  String get name;
+
+  /**
+   * Return a task input that can be used to compute this result for the given
+   * [target].
+   */
+  TaskInput<V> of(AnalysisTarget target);
+}
+
+/**
+ * A specification of the given [result] for the given [target].
+ *
+ * Clients are not expected to subtype this class.
+ */
+class TargetedResult {
+  /**
+   * An empty list of results.
+   */
+  static final List<TargetedResult> EMPTY_LIST = const <TargetedResult>[];
+
+  /**
+   * The target with which the result is associated.
+   */
+  final AnalysisTarget target;
+
+  /**
+   * The result associated with the target.
+   */
+  final ResultDescriptor result;
+
+  /**
+   * Initialize a new targeted result.
+   */
+  TargetedResult(this.target, this.result);
+
+  @override
+  int get hashCode {
+    return JenkinsSmiHash.combine(target.hashCode, result.hashCode);
+  }
+
+  @override
+  bool operator ==(other) {
+    return other is TargetedResult &&
+        other.target == target &&
+        other.result == result;
+  }
+
+  @override
+  String toString() => '$result for $target';
+}
+
+/**
+ * A description of an [AnalysisTask].
+ */
+abstract class TaskDescriptor {
+  /**
+   * Initialize a newly created task descriptor to have the given [name] and to
+   * describe a task that takes the inputs built using the given [inputBuilder],
+   * and produces the given [results]. The [buildTask] will be used to create
+   * the instance of [AnalysisTask] thusly described.
+   */
+  factory TaskDescriptor(String name, BuildTask buildTask,
+      CreateTaskInputs inputBuilder,
+      List<ResultDescriptor> results) = TaskDescriptorImpl;
+
+  /**
+   * Return the builder used to build the inputs to the task.
+   */
+  CreateTaskInputs get createTaskInputs;
+
+  /**
+   * Return the name of the task being described.
+   */
+  String get name;
+
+  /**
+   * Return a list of the analysis results that will be computed by this task.
+   */
+  List<ResultDescriptor> get results;
+
+  /**
+   * Create and return a task that is described by this descriptor that can be
+   * used to compute results based on the given [inputs].
+   */
+  AnalysisTask createTask(AnalysisContext context, AnalysisTarget target,
+      Map<String, dynamic> inputs);
+}
+
+/**
+ * A description of an input to an [AnalysisTask] that can be used to compute
+ * that input.
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class TaskInput<V> {
+  /**
+   * Create and return a builder that can be used to build this task input.
+   */
+  TaskInputBuilder<V> createBuilder();
+
+  /**
+   * Return a task input that can be used to compute a list whose elements are
+   * the result of passing the result of this input to the [mapper] function.
+   */
+  ListTaskInput /*<E>*/ mappedToList(List /*<E>*/ mapper(V value));
+}
+
+/**
+ * An object used to build the value associated with a single [TaskInput].
+ *
+ * All builders work by requesting one or more results (each result being
+ * associated with a target). The interaction pattern is modeled after the class
+ * [Iterator], in which the method [moveNext] is invoked to move from one result
+ * request to the next. The getters [currentResult] and [currentTarget] are used
+ * to get the result and target of the current request. The value of the result
+ * must be supplied using the [currentValue] setter before [moveNext] can be
+ * invoked to move to the next request. When [moveNext] returns `false`,
+ * indicating that there are no more requests, the method [inputValue] can be
+ * used to access the value of the input that was built.
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class TaskInputBuilder<V> {
+  /**
+   * Return the result that needs to be computed, or `null` if [moveNext] has
+   * not been invoked or if the last invocation of [moveNext] returned `false`.
+   */
+  ResultDescriptor get currentResult;
+
+  /**
+   * Return the target for which the result needs to be computed, or `null` if
+   * [moveNext] has not been invoked or if the last invocation of [moveNext]
+   * returned `false`.
+   */
+  AnalysisTarget get currentTarget;
+
+  /**
+   * Set the [value] that was computed for the current result.
+   *
+   * Throws a [StateError] if [moveNext] has not been invoked or if the last
+   * invocation of [moveNext] returned `false`.
+   */
+  void set currentValue(Object value);
+
+  /**
+   * Return the [value] that was computed by this builder.
+   *
+   * Throws a [StateError] if [moveNext] has not been invoked or if the last
+   * invocation of [moveNext] returned `true`.
+   *
+   * Returns `null` if no value could be computed due to a circular dependency.
+   */
+  V get inputValue;
+
+  /**
+   * Record that no value is available for the current result, due to a
+   * circular dependency.
+   *
+   * Throws a [StateError] if [moveNext] has not been invoked or if the last
+   * invocation of [moveNext] returned `false`.
+   */
+  void currentValueNotAvailable();
+
+  /**
+   * Move to the next result that needs to be computed in order to build the
+   * inputs for a task. Return `true` if there is another result that needs to
+   * be computed, or `false` if the inputs have been computed.
+   *
+   * It is safe to invoke [moveNext] after it has returned `false`. In this case
+   * [moveNext] has no effect and will again return `false`.
+   *
+   * Throws a [StateError] if the value of the current result has not been
+   * provided using [currentValue].
+   */
+  bool moveNext();
+}
+
+/**
+ * [WorkManager]s are used to drive analysis.
+ *
+ * They know specific of the targets and results they care about,
+ * so they can request analysis results in optimal order.
+ */
+abstract class WorkManager {
+  /**
+   * Notifies the manager about changes in the explicit source list.
+   */
+  void applyChange(List<Source> addedSources, List<Source> changedSources,
+      List<Source> removedSources);
+
+  /**
+   * Notifies the managers that the given set of priority [targets] was set.
+   */
+  void applyPriorityTargets(List<AnalysisTarget> targets);
+
+  /**
+   * Return a list of all of the errors associated with the given [source].
+   * The list of errors will be empty if the source is not known to the context
+   * or if there are no errors in the source. The errors contained in the list
+   * can be incomplete.
+   */
+  List<AnalysisError> getErrors(Source source);
+
+  /**
+   * Return the next [TargetedResult] that this work manager wants to be
+   * computed, or `null` if this manager doesn't need any new results.
+   */
+  TargetedResult getNextResult();
+
+  /**
+   * Return the priority if the next work order this work manager want to be
+   * computed. The [AnalysisDriver] will perform the work order with
+   * the highest priority.
+   *
+   * Even if the returned value is [WorkOrderPriority.NONE], it still does not
+   * guarantee that [getNextResult] will return not `null`.
+   */
+  WorkOrderPriority getNextResultPriority();
+
+  /**
+   * Notifies the manager about analysis options changes.
+   */
+  void onAnalysisOptionsChanged();
+
+  /**
+   * Notifies the manager about [SourceFactory] changes.
+   */
+  void onSourceFactoryChanged();
+
+  /**
+   * Notifies the manager that the given [outputs] were produced for
+   * the given [target].
+   */
+  void resultsComputed(
+      AnalysisTarget target, Map<ResultDescriptor, dynamic> outputs);
+}
+
+/**
+ * The priorities of work orders returned by [WorkManager]s.
+ *
+ * New priorities may be added with time, clients need to tolerate this.
+ */
+enum WorkOrderPriority {
+  /**
+   * Responding to an user's action.
+   */
+  INTERACTIVE,
+
+  /**
+   * Computing information for priority sources.
+   */
+  PRIORITY,
+
+  /**
+   * A work should be done, but without any special urgency.
+   */
+  NORMAL,
+
+  /**
+   * Nothing to do.
+   */
+  NONE
+}
diff --git a/mojo/public/dart/third_party/analyzer/pubspec.yaml b/mojo/public/dart/third_party/analyzer/pubspec.yaml
new file mode 100644
index 0000000..27dd8fe
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/pubspec.yaml
@@ -0,0 +1,19 @@
+name: analyzer
+version: 0.26.1+3
+author: Dart Team <misc@dartlang.org>
+description: Static analyzer for Dart.
+homepage: http://www.dartlang.org
+environment:
+  sdk: '>=1.11.0 <2.0.0'
+dependencies:
+  args: '>=0.12.1 <0.14.0'
+  glob: ^1.0.3
+  html: ^0.12.0
+  package_config: ^0.1.1
+  path: '>=0.9.0 <2.0.0'
+  plugin: ^0.1.0
+  watcher: '>=0.9.6 <0.10.0'
+  yaml: ^2.1.2
+dev_dependencies:
+  typed_mock: '>=0.0.4 <1.0.0'
+  unittest: '>=0.9.0 <0.12.0'
diff --git a/mojo/public/dart/third_party/analyzer/test/cancelable_future_test.dart b/mojo/public/dart/third_party/analyzer/test/cancelable_future_test.dart
new file mode 100644
index 0000000..b28c0f9
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/cancelable_future_test.dart
@@ -0,0 +1,411 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.cancelable_future;
+
+import 'dart:async';
+
+import 'package:analyzer/src/cancelable_future.dart';
+import 'package:unittest/unittest.dart';
+import 'package:watcher/src/utils.dart';
+
+import 'reflective_tests.dart';
+import 'utils.dart';
+
+void main() {
+  initializeTestEnvironment();
+  runReflectiveTests(CancelableCompleterTests);
+  runReflectiveTests(CancelableFutureTests);
+}
+
+@reflectiveTest
+class CancelableCompleterTests {
+  CancelableCompleter<Object> completer;
+  int cancelCount = 0;
+
+  void setUp() {
+    completer = new CancelableCompleter<Object>(() {
+      cancelCount++;
+    });
+  }
+
+  Future test_cancel_after_cancel() {
+    // It is permissible to cancel multiple times, but only the first
+    // cancellation has any effect.
+    expect(cancelCount, 0);
+    completer.future.cancel();
+    expect(cancelCount, 1);
+    completer.future.cancel();
+    expect(cancelCount, 1);
+    // Make sure the future still completes with error.
+    return completer.future.then((_) {
+      fail('Expected error completion');
+    }, onError: (error) {
+      expect(error, new isInstanceOf<FutureCanceledError>());
+      // And make sure nothing else happens.
+    }).then((_) => pumpEventQueue()).then((_) {
+      expect(completer.isCompleted, isFalse);
+      expect(cancelCount, 1);
+    });
+  }
+
+  Future test_cancel_after_chaining() {
+    bool callbackInvoked = false;
+    completer.future.then((_) {
+      fail('Expected error completion');
+    }, onError: (error) {
+      expect(callbackInvoked, isFalse);
+      expect(error, new isInstanceOf<FutureCanceledError>());
+      callbackInvoked = true;
+    });
+    expect(cancelCount, 0);
+    completer.future.cancel();
+    // The cancel callback should have been invoked immediately.
+    expect(cancelCount, 1);
+    // But the completer should remain in the "not completed" state.
+    expect(completer.isCompleted, isFalse);
+    // The callback should be deferred to a microtask.
+    expect(callbackInvoked, isFalse);
+    return pumpEventQueue().then((_) {
+      expect(callbackInvoked, isTrue);
+      expect(completer.isCompleted, isFalse);
+      expect(cancelCount, 1);
+    });
+  }
+
+  Future test_cancel_after_complete() {
+    Object obj = new Object();
+    completer.complete(obj);
+    completer.future.cancel();
+    // The cancel callback should not have been invoked, because it was too
+    // late to cancel.
+    expect(cancelCount, 0);
+    // Make sure the future still completes with the object.
+    return completer.future.then((result) {
+      expect(result, same(obj));
+      // And make sure nothing else happens.
+    }).then((_) => pumpEventQueue()).then((_) {
+      expect(completer.isCompleted, isTrue);
+      expect(cancelCount, 0);
+    });
+  }
+
+  Future test_cancel_before_chaining() {
+    completer.future.cancel();
+    // The cancel callback should have been invoked immediately.
+    expect(cancelCount, 1);
+    // But the completer should remain in the "not completed" state.
+    expect(completer.isCompleted, isFalse);
+    bool callbackInvoked = false;
+    completer.future.then((_) {
+      fail('Expected error completion');
+    }, onError: (error) {
+      expect(callbackInvoked, isFalse);
+      expect(error, new isInstanceOf<FutureCanceledError>());
+      callbackInvoked = true;
+    });
+    // The callback should be deferred to a microtask.
+    expect(callbackInvoked, isFalse);
+    expect(completer.isCompleted, isFalse);
+    return pumpEventQueue().then((_) {
+      expect(callbackInvoked, isTrue);
+      expect(completer.isCompleted, isFalse);
+      expect(cancelCount, 1);
+    });
+  }
+
+  Future test_complete_after_cancel() {
+    completer.future.cancel();
+    // The cancel callback should have been invoked immediately.
+    expect(cancelCount, 1);
+    // Completing should have no effect other than to set the isCompleted
+    // flag.
+    expect(completer.isCompleted, isFalse);
+    Object obj = new Object();
+    completer.complete(obj);
+    expect(completer.isCompleted, isTrue);
+    // Make sure the future still completer with error.
+    return completer.future.then((_) {
+      fail('Expected error completion');
+    }, onError: (error) {
+      expect(error, new isInstanceOf<FutureCanceledError>());
+      // And make sure nothing else happens.
+    }).then((_) => pumpEventQueue()).then((_) {
+      expect(completer.isCompleted, isTrue);
+      expect(cancelCount, 1);
+    });
+  }
+
+  Future test_complete_after_chaining() {
+    Object obj = new Object();
+    bool callbackInvoked = false;
+    completer.future.then((result) {
+      expect(callbackInvoked, isFalse);
+      expect(result, same(obj));
+      callbackInvoked = true;
+    }, onError: (error) {
+      fail('Expected successful completion');
+    });
+    expect(completer.isCompleted, isFalse);
+    // Running the event loop should have no effect since the completer hasn't
+    // been completed yet.
+    return pumpEventQueue().then((_) {
+      completer.complete(obj);
+      expect(completer.isCompleted, isTrue);
+      // The callback should be deferred to a microtask.
+      expect(callbackInvoked, isFalse);
+    }).then((_) => pumpEventQueue()).then((_) {
+      expect(callbackInvoked, isTrue);
+      expect(completer.isCompleted, isTrue);
+      expect(cancelCount, 0);
+    });
+  }
+
+  void test_complete_after_complete() {
+    // As with an ordinary Completer, calling complete() (or completeError)
+    // after calling complete() should throw an exception.
+    completer.complete();
+    expect(() {
+      completer.complete();
+    }, throws);
+    expect(() {
+      completer.completeError(new Object());
+    }, throws);
+  }
+
+  void test_complete_after_completeError() {
+    // As with an ordinary Completer, calling complete() (or completeError)
+    // after calling completeError() should throw an exception.
+    completer.completeError(new Object());
+    expect(() {
+      completer.complete();
+    }, throws);
+    expect(() {
+      completer.completeError(new Object());
+    }, throws);
+    // Now absorb the error that's in the completer's future.
+    completer.future.catchError((_) => null);
+  }
+
+  Future test_complete_before_chaining() {
+    Object obj = new Object();
+    completer.complete(obj);
+    expect(completer.isCompleted, isTrue);
+    bool callbackInvoked = false;
+    completer.future.then((result) {
+      expect(callbackInvoked, isFalse);
+      expect(result, same(obj));
+      callbackInvoked = true;
+    }, onError: (error) {
+      fail('Expected successful completion');
+    });
+    // The callback should be deferred to a microtask.
+    expect(callbackInvoked, isFalse);
+    expect(completer.isCompleted, isTrue);
+    return pumpEventQueue().then((_) {
+      expect(callbackInvoked, isTrue);
+      expect(completer.isCompleted, isTrue);
+      expect(cancelCount, 0);
+    });
+  }
+
+  Future test_completeError_after_cancel() {
+    completer.future.cancel();
+    // The cancel callback should have been invoked immediately.
+    expect(cancelCount, 1);
+    // Completing should have no effect other than to set the isCompleted
+    // flag.
+    expect(completer.isCompleted, isFalse);
+    Object obj = new Object();
+    completer.completeError(obj);
+    expect(completer.isCompleted, isTrue);
+    // Make sure the future still completes with error.
+    return completer.future.then((_) {
+      fail('Expected error completion');
+    }, onError: (error) {
+      expect(error, new isInstanceOf<FutureCanceledError>());
+      // And make sure nothing else happens.
+    }).then((_) => pumpEventQueue()).then((_) {
+      expect(completer.isCompleted, isTrue);
+      expect(cancelCount, 1);
+    });
+  }
+
+  Future test_completeError_after_chaining() {
+    Object obj = new Object();
+    bool callbackInvoked = false;
+    completer.future.then((_) {
+      fail('Expected error completion');
+    }, onError: (error) {
+      expect(callbackInvoked, isFalse);
+      expect(error, same(obj));
+      callbackInvoked = true;
+    });
+    expect(completer.isCompleted, isFalse);
+    // Running the event loop should have no effect since the completer hasn't
+    // been completed yet.
+    return pumpEventQueue().then((_) {
+      completer.completeError(obj);
+      expect(completer.isCompleted, isTrue);
+      // The callback should be deferred to a microtask.
+      expect(callbackInvoked, isFalse);
+    }).then((_) => pumpEventQueue()).then((_) {
+      expect(callbackInvoked, isTrue);
+      expect(completer.isCompleted, isTrue);
+      expect(cancelCount, 0);
+    });
+  }
+
+  Future test_completeError_before_chaining() {
+    Object obj = new Object();
+    completer.completeError(obj);
+    expect(completer.isCompleted, isTrue);
+    bool callbackInvoked = false;
+    completer.future.then((_) {
+      fail('Expected error completion');
+    }, onError: (error) {
+      expect(callbackInvoked, isFalse);
+      expect(error, same(obj));
+      callbackInvoked = true;
+    });
+    // The callback should be deferred to a microtask.
+    expect(callbackInvoked, isFalse);
+    expect(completer.isCompleted, isTrue);
+    return pumpEventQueue().then((_) {
+      expect(callbackInvoked, isTrue);
+      expect(completer.isCompleted, isTrue);
+      expect(cancelCount, 0);
+    });
+  }
+
+  void test_initialState() {
+    expect(completer.isCompleted, isFalse);
+    expect(cancelCount, 0);
+  }
+}
+
+@reflectiveTest
+class CancelableFutureTests {
+  Future test_defaultConstructor_returnFuture() {
+    Object obj = new Object();
+    bool callbackInvoked = false;
+    new CancelableFuture(() => new Future(() => obj)).then((result) {
+      expect(callbackInvoked, isFalse);
+      expect(result, same(obj));
+      callbackInvoked = true;
+    }, onError: (error) {
+      fail('Expected successful completion');
+    });
+    expect(callbackInvoked, isFalse);
+    return pumpEventQueue().then((_) {
+      expect(callbackInvoked, isTrue);
+    });
+  }
+
+  Future test_defaultConstructor_returnValue() {
+    Object obj = new Object();
+    bool callbackInvoked = false;
+    new CancelableFuture(() => obj).then((result) {
+      expect(callbackInvoked, isFalse);
+      expect(result, same(obj));
+      callbackInvoked = true;
+    }, onError: (error) {
+      fail('Expected successful completion');
+    });
+    expect(callbackInvoked, isFalse);
+    return pumpEventQueue().then((_) {
+      expect(callbackInvoked, isTrue);
+    });
+  }
+
+  Future test_defaultConstructor_throwException() {
+    Object obj = new Object();
+    bool callbackInvoked = false;
+    new CancelableFuture(() {
+      throw obj;
+    }).then((result) {
+      fail('Expected error completion');
+    }, onError: (error) {
+      expect(callbackInvoked, isFalse);
+      expect(error, same(obj));
+      callbackInvoked = true;
+    });
+    expect(callbackInvoked, isFalse);
+    return pumpEventQueue().then((_) {
+      expect(callbackInvoked, isTrue);
+    });
+  }
+
+  Future test_delayed_noCallback() {
+    DateTime start = new DateTime.now();
+    return new CancelableFuture.delayed(new Duration(seconds: 1))
+        .then((result) {
+      DateTime end = new DateTime.now();
+      expect(result, isNull);
+      expect(end.difference(start).inMilliseconds > 900, isTrue);
+    });
+  }
+
+  Future test_delayed_withCallback() {
+    Object obj = new Object();
+    DateTime start = new DateTime.now();
+    return new CancelableFuture.delayed(new Duration(seconds: 1), () {
+      DateTime end = new DateTime.now();
+      expect(end.difference(start).inMilliseconds > 900, isTrue);
+      return obj;
+    }).then((result) {
+      expect(result, same(obj));
+    });
+  }
+
+  Future test_error() {
+    Object obj = new Object();
+    return new CancelableFuture.error(obj).then((result) {
+      fail('Expected error completion');
+    }, onError: (error) {
+      expect(error, same(obj));
+    });
+  }
+
+  Future test_microtask() {
+    Object obj = new Object();
+    bool callbackInvoked = false;
+    new CancelableFuture.microtask(() => obj).then((result) {
+      expect(callbackInvoked, isFalse);
+      expect(result, same(obj));
+      callbackInvoked = true;
+    }, onError: (error) {
+      fail('Expected successful completion');
+    });
+    expect(callbackInvoked, isFalse);
+    return pumpEventQueue().then((_) {
+      expect(callbackInvoked, isTrue);
+    });
+  }
+
+  Future test_sync() {
+    Object obj = new Object();
+    bool callbackInvoked = false;
+    new CancelableFuture.sync(() => obj).then((result) {
+      expect(callbackInvoked, isFalse);
+      expect(result, same(obj));
+      callbackInvoked = true;
+    }, onError: (error) {
+      fail('Expected successful completion');
+    });
+    expect(callbackInvoked, isFalse);
+    return pumpEventQueue().then((_) {
+      expect(callbackInvoked, isTrue);
+    });
+  }
+
+  Future test_value() {
+    Object obj = new Object();
+    return new CancelableFuture.value(obj).then((result) {
+      expect(result, same(obj));
+    }, onError: (error) {
+      fail('Expected successful completion');
+    });
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/enum_test.dart b/mojo/public/dart/third_party/analyzer/test/enum_test.dart
new file mode 100644
index 0000000..706737f
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/enum_test.dart
@@ -0,0 +1,240 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.enums;
+
+import 'dart:mirrors';
+
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/html.dart' as html;
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:unittest/unittest.dart';
+
+import 'generated/ast_test.dart';
+import 'reflective_tests.dart';
+import 'utils.dart';
+
+void main() {
+  initializeTestEnvironment();
+  runReflectiveTests(EnumTest);
+}
+
+@reflectiveTest
+class EnumTest {
+  void test_AnalysisLevel() {
+    new EnumTester<AnalysisLevel>()
+      ..check_getters()
+      ..check_explicit_values();
+  }
+
+  void test_AssignmentKind() {
+    new EnumTester<AssignmentKind>()
+      ..check_getters()
+      ..check_explicit_values();
+  }
+
+  void test_CacheState() {
+    new EnumTester<CacheState>()
+      ..check_getters()
+      ..check_explicit_values();
+  }
+
+  void test_ElementKind() {
+    new EnumTester<ElementKind>()
+      ..check_getters()
+      ..check_explicit_values();
+  }
+
+  void test_ErrorProperty() {
+    new EnumTester<ErrorProperty>()
+      ..check_getters()
+      ..check_explicit_values();
+  }
+
+  void test_ErrorSeverity() {
+    new EnumTester<ErrorSeverity>()
+      ..check_getters()
+      ..check_explicit_values();
+  }
+
+  void test_ErrorType() {
+    new EnumTester<ErrorType>()
+      ..check_getters()
+      ..check_explicit_values();
+  }
+
+  void test_html_TokenType() {
+    new EnumTester<html.TokenType>()
+      ..check_getters()
+      ..check_explicit_values();
+  }
+
+  void test_INIT_STATE() {
+    new EnumTester<INIT_STATE>()
+      ..check_getters()
+      ..check_explicit_values();
+  }
+
+  void test_Modifier() {
+    new EnumTester<Modifier>()
+      ..check_getters()
+      ..check_explicit_values();
+  }
+
+  void test_ParameterKind() {
+    new EnumTester<ParameterKind>()
+      ..check_getters()
+      ..check_explicit_values();
+  }
+
+  void test_RedirectingConstructorKind() {
+    new EnumTester<RedirectingConstructorKind>()
+      ..check_getters()
+      ..check_explicit_values();
+  }
+
+  void test_RetentionPriority() {
+    new EnumTester<RetentionPriority>()
+      ..check_getters()
+      ..check_explicit_values();
+  }
+
+  void test_SourceKind() {
+    new EnumTester<SourceKind>()
+      ..check_getters()
+      ..check_explicit_values();
+  }
+
+  void test_SourcePriority() {
+    new EnumTester<SourcePriority>()
+      ..check_getters()
+      ..check_explicit_values();
+  }
+
+  void test_UriKind() {
+    new EnumTester<UriKind>()
+      ..check_getters()
+      ..check_explicit_values();
+  }
+
+  void test_WrapperKind() {
+    new EnumTester<WrapperKind>()
+      ..check_getters()
+      ..check_explicit_values();
+  }
+}
+
+/**
+ * Helper class for testing invariants of enumerated types.
+ */
+class EnumTester<C extends Enum> {
+  /**
+   * Set of getter names which should be ignored when looking for getters
+   * representing enum values.
+   */
+  Set<String> _ignoreGetters = new Set<String>();
+
+  EnumTester({List<String> ignoreGetters}) {
+    // Always ignore a getter called "values".
+    _ignoreGetters.add('values');
+
+    if (ignoreGetters != null) {
+      for (String getterName in ignoreGetters) {
+        _ignoreGetters.add(getterName);
+      }
+    }
+  }
+
+  /**
+   * Get a map from getter name to the value returned by the getter, for all
+   * static getters in [C] whose name isn't in [_ignoreGetters].
+   */
+  Map<String, C> get _getters {
+    Map<String, C> result = <String, C>{};
+    ClassMirror reflectedClass = reflectClass(C);
+    reflectedClass.staticMembers.forEach((Symbol symbol, MethodMirror method) {
+      if (!method.isGetter) {
+        return;
+      }
+      String name = MirrorSystem.getName(symbol);
+      if (_ignoreGetters.contains(name)) {
+        return;
+      }
+      C value = reflectedClass.getField(symbol).reflectee;
+      result[name] = value;
+    });
+    return result;
+  }
+
+  /**
+   * Check invariants on the list of enum values accessible via the static
+   * getter "values".
+   */
+  void check_explicit_values() {
+    ClassMirror reflectedClass = reflectClass(C);
+    List<C> values = reflectedClass.getField(#values).reflectee;
+    Map<C, int> reverseMap = <C, int>{};
+
+    // Check that "values" is a list of values of type C, with no duplicates.
+    expect(values, isList);
+    for (int i = 0; i < values.length; i++) {
+      C value = values[i];
+      expect(value, new isInstanceOf<C>(), reason: 'values[$i]');
+      if (reverseMap.containsKey(value)) {
+        fail('values[$i] and values[${reverseMap[value]}] both equal $value');
+      }
+      reverseMap[value] = i;
+    }
+
+    // Check that the set of values in the "values" list matches the set of
+    // values accessible via static fields.
+    expect(reverseMap.keys.toSet(), equals(_getters.values.toSet()));
+
+    // Make sure the order of the list matches the ordinal numbers.
+    for (int i = 0; i < values.length; i++) {
+      expect(values[i].ordinal, equals(i), reason: 'values[$i].ordinal');
+    }
+  }
+
+  /**
+   * Check invariants on the set of enum values accessible via the static
+   * getters defined in the class [C] (with the exception of a getter called
+   * "values").
+   */
+  void check_getters() {
+    Map<int, String> ordinals = <int, String>{};
+    int numValues = 0;
+
+    _getters.forEach((String name, C value) {
+      String reason = 'getter: $name';
+      ++numValues;
+
+      // Check the type of the value
+      expect(value, new isInstanceOf<C>(), reason: reason);
+
+      // Check that the name of the getter matches the name stored in the enum.
+      expect(value.name, equals(name), reason: reason);
+
+      // Check that there are no duplicate ordinals.
+      if (ordinals.containsKey(value.ordinal)) {
+        fail(
+            'Getters $name and ${ordinals[value.ordinal]} have ordinal value ${value.ordinal}');
+      }
+      ordinals[value.ordinal] = name;
+    });
+
+    // Check that the set of ordinals runs from 0 to N-1, where N is the number
+    // of enumerated values.
+    Set<int> expectedOrdinals = new Set<int>();
+    for (int i = 0; i < numValues; i++) {
+      expectedOrdinals.add(i);
+    }
+    expect(ordinals.keys.toSet(), equals(expectedOrdinals));
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/file_system/memory_file_system_test.dart b/mojo/public/dart/third_party/analyzer/test/file_system/memory_file_system_test.dart
new file mode 100644
index 0000000..3d239ae
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/file_system/memory_file_system_test.dart
@@ -0,0 +1,563 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.memory_file_system;
+
+import 'dart:async';
+import 'dart:core' hide Resource;
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/generated/engine.dart' show TimestampedData;
+import 'package:analyzer/src/generated/source.dart';
+import 'package:path/path.dart';
+import 'package:unittest/unittest.dart';
+import 'package:watcher/watcher.dart';
+
+import '../reflective_tests.dart';
+import '../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(FileSystemExceptionTest);
+  runReflectiveTests(FileTest);
+  runReflectiveTests(FolderTest);
+  runReflectiveTests(MemoryFileSourceExistingTest);
+  runReflectiveTests(MemoryFileSourceNotExistingTest);
+  runReflectiveTests(MemoryResourceProviderTest);
+}
+
+var _isFile = new isInstanceOf<File>();
+var _isFileSystemException = new isInstanceOf<FileSystemException>();
+var _isFolder = new isInstanceOf<Folder>();
+
+@reflectiveTest
+class FileSystemExceptionTest {
+  void test_constructor() {
+    var exception = new FileSystemException('/my/path', 'my message');
+    expect(exception.path, '/my/path');
+    expect(exception.message, 'my message');
+    expect(exception.toString(),
+        'FileSystemException(path=/my/path; message=my message)');
+  }
+}
+
+@reflectiveTest
+class FileTest {
+  MemoryResourceProvider provider = new MemoryResourceProvider();
+
+  void test_equals_beforeAndAfterCreate() {
+    String path = '/file.txt';
+    File file1 = provider.getResource(path);
+    provider.newFile(path, 'contents');
+    File file2 = provider.getResource(path);
+    expect(file1 == file2, isTrue);
+  }
+
+  void test_equals_false() {
+    File fileA = provider.getResource('/fileA.txt');
+    File fileB = provider.getResource('/fileB.txt');
+    expect(fileA == new Object(), isFalse);
+    expect(fileA == fileB, isFalse);
+  }
+
+  void test_equals_true() {
+    File file = provider.getResource('/file.txt');
+    expect(file == file, isTrue);
+  }
+
+  void test_exists_false() {
+    File file = provider.getResource('/file.txt');
+    expect(file, isNotNull);
+    expect(file.exists, isFalse);
+  }
+
+  void test_exists_true() {
+    provider.newFile('/foo/file.txt', 'qwerty');
+    File file = provider.getResource('/foo/file.txt');
+    expect(file, isNotNull);
+    expect(file.exists, isTrue);
+  }
+
+  void test_fullName() {
+    File file = provider.getResource('/foo/bar/file.txt');
+    expect(file.path, '/foo/bar/file.txt');
+  }
+
+  void test_hashCode() {
+    String path = '/foo/bar/file.txt';
+    File file1 = provider.getResource(path);
+    provider.newFile(path, 'contents');
+    File file2 = provider.getResource(path);
+    expect(file1.hashCode, equals(file2.hashCode));
+  }
+
+  void test_isOrContains() {
+    String path = '/foo/bar/file.txt';
+    File file = provider.getResource(path);
+    expect(file.isOrContains(path), isTrue);
+    expect(file.isOrContains('/foo/bar'), isFalse);
+  }
+
+  void test_modificationStamp_doesNotExist() {
+    String path = '/foo/bar/file.txt';
+    File file = provider.newFile(path, 'qwerty');
+    provider.deleteFile(path);
+    expect(() {
+      file.modificationStamp;
+    }, throwsA(_isFileSystemException));
+  }
+
+  void test_modificationStamp_exists() {
+    String path = '/foo/bar/file.txt';
+    File file = provider.newFile(path, 'qwerty');
+    expect(file.modificationStamp, isNonNegative);
+  }
+
+  void test_parent() {
+    provider.newFile('/foo/bar/file.txt', 'content');
+    File file = provider.getResource('/foo/bar/file.txt');
+    Resource parent = file.parent;
+    expect(parent, new isInstanceOf<Folder>());
+    expect(parent.path, equals('/foo/bar'));
+  }
+
+  void test_readAsStringSync_doesNotExist() {
+    File file = provider.getResource('/test.txt');
+    expect(() {
+      file.readAsStringSync();
+    }, throwsA(_isFileSystemException));
+  }
+
+  void test_readAsStringSync_exists() {
+    File file = provider.newFile('/file.txt', 'abc');
+    expect(file.readAsStringSync(), 'abc');
+  }
+
+  void test_shortName() {
+    File file = provider.getResource('/foo/bar/file.txt');
+    expect(file.shortName, 'file.txt');
+  }
+
+  void test_toString() {
+    File file = provider.getResource('/foo/bar/file.txt');
+    expect(file.toString(), '/foo/bar/file.txt');
+  }
+}
+
+@reflectiveTest
+class FolderTest {
+  static const String path = '/foo/bar';
+
+  MemoryResourceProvider provider = new MemoryResourceProvider();
+  Folder folder;
+
+  void setUp() {
+    folder = provider.newFolder(path);
+  }
+
+  void test_canonicalizePath() {
+    expect(folder.canonicalizePath('baz'), equals('/foo/bar/baz'));
+    expect(folder.canonicalizePath('/baz'), equals('/baz'));
+    expect(folder.canonicalizePath('../baz'), equals('/foo/baz'));
+    expect(folder.canonicalizePath('/a/b/../c'), equals('/a/c'));
+    expect(folder.canonicalizePath('./baz'), equals('/foo/bar/baz'));
+    expect(folder.canonicalizePath('/a/b/./c'), equals('/a/b/c'));
+  }
+
+  void test_contains() {
+    expect(folder.contains('/foo/bar/aaa.txt'), isTrue);
+    expect(folder.contains('/foo/bar/aaa/bbb.txt'), isTrue);
+    expect(folder.contains('/baz.txt'), isFalse);
+    expect(folder.contains('/foo/bar'), isFalse);
+  }
+
+  void test_equal_false() {
+    String path2 = '/foo/baz';
+    Folder folder2 = provider.newFolder(path2);
+    expect(folder == folder2, isFalse);
+  }
+
+  void test_equal_true() {
+    Folder folder2 = provider.getResource(path);
+    expect(folder == folder2, isTrue);
+  }
+
+  void test_getChild_doesNotExist() {
+    File file = folder.getChild('file.txt');
+    expect(file, isNotNull);
+    expect(file.exists, isFalse);
+  }
+
+  void test_getChild_file() {
+    provider.newFile('/foo/bar/file.txt', 'content');
+    File child = folder.getChild('file.txt');
+    expect(child, isNotNull);
+    expect(child.exists, isTrue);
+  }
+
+  void test_getChild_folder() {
+    provider.newFolder('/foo/bar/baz');
+    Folder child = folder.getChild('baz');
+    expect(child, isNotNull);
+    expect(child.exists, isTrue);
+  }
+
+  void test_getChildAssumingFolder_doesNotExist() {
+    Folder child = folder.getChildAssumingFolder('foldername');
+    expect(child, isNotNull);
+    expect(child.exists, isFalse);
+  }
+
+  void test_getChildAssumingFolder_file() {
+    provider.newFile('/foo/bar/foldername', 'content');
+    Folder child = folder.getChildAssumingFolder('foldername');
+    expect(child, isNotNull);
+    expect(child.exists, isFalse);
+  }
+
+  void test_getChildAssumingFolder_folder() {
+    provider.newFolder('/foo/bar/foldername');
+    Folder child = folder.getChildAssumingFolder('foldername');
+    expect(child, isNotNull);
+    expect(child.exists, isTrue);
+  }
+
+  void test_getChildren_doesNotExist() {
+    folder = folder.getChildAssumingFolder('no-such-folder');
+    expect(() {
+      folder.getChildren();
+    }, throwsA(_isFileSystemException));
+  }
+
+  void test_getChildren_exists() {
+    provider.newFile('/foo/bar/a.txt', 'aaa');
+    provider.newFolder('/foo/bar/bFolder');
+    provider.newFile('/foo/bar/c.txt', 'ccc');
+    // prepare 3 children
+    List<Resource> children = folder.getChildren();
+    expect(children, hasLength(3));
+    children.sort((a, b) => a.shortName.compareTo(b.shortName));
+    // check that each child exists
+    children.forEach((child) {
+      expect(child.exists, true);
+    });
+    // check names
+    expect(children[0].shortName, 'a.txt');
+    expect(children[1].shortName, 'bFolder');
+    expect(children[2].shortName, 'c.txt');
+    // check types
+    expect(children[0], _isFile);
+    expect(children[1], _isFolder);
+    expect(children[2], _isFile);
+  }
+
+  void test_hashCode() {
+    Folder folder2 = provider.getResource(path);
+    expect(folder.hashCode, folder2.hashCode);
+  }
+
+  void test_isOrContains() {
+    expect(folder.isOrContains('/foo/bar'), isTrue);
+    expect(folder.isOrContains('/foo/bar/aaa.txt'), isTrue);
+    expect(folder.isOrContains('/foo/bar/aaa/bbb.txt'), isTrue);
+    expect(folder.isOrContains('/baz.txt'), isFalse);
+  }
+
+  void test_parent() {
+    Resource parent1 = folder.parent;
+    expect(parent1, new isInstanceOf<Folder>());
+    expect(parent1.path, equals('/foo'));
+    Resource parent2 = parent1.parent;
+    expect(parent2, new isInstanceOf<Folder>());
+    expect(parent2.path, equals('/'));
+    expect(parent2.parent, isNull);
+  }
+}
+
+@reflectiveTest
+class MemoryFileSourceExistingTest {
+  MemoryResourceProvider provider = new MemoryResourceProvider();
+  Source source;
+
+  setUp() {
+    File file = provider.newFile('/foo/test.dart', 'library test;');
+    source = file.createSource();
+  }
+
+  void test_contents() {
+    TimestampedData<String> contents = source.contents;
+    expect(contents.data, 'library test;');
+  }
+
+  void test_encoding() {
+    expect(source.encoding, 'file:///foo/test.dart');
+  }
+
+  void test_equals_false_differentFile() {
+    File fileA = provider.newFile('/foo/a.dart', '');
+    File fileB = provider.newFile('/foo/b.dart', '');
+    Source sourceA = fileA.createSource();
+    Source sourceB = fileB.createSource();
+    expect(sourceA == sourceB, isFalse);
+  }
+
+  void test_equals_false_notMemorySource() {
+    File file = provider.newFile('/foo/test.dart', '');
+    Source source = file.createSource();
+    expect(source == new Object(), isFalse);
+  }
+
+  void test_equals_true_sameFile() {
+    File file = provider.newFile('/foo/test.dart', '');
+    Source sourceA = file.createSource();
+    Source sourceB = file.createSource();
+    expect(sourceA == sourceB, isTrue);
+  }
+
+  void test_equals_true_self() {
+    File file = provider.newFile('/foo/test.dart', '');
+    Source source = file.createSource();
+    expect(source == source, isTrue);
+  }
+
+  void test_exists() {
+    expect(source.exists(), isTrue);
+  }
+
+  void test_fullName() {
+    expect(source.fullName, '/foo/test.dart');
+  }
+
+  void test_hashCode() {
+    source.hashCode;
+  }
+
+  void test_resolveRelative() {
+    Uri relative = source.resolveRelativeUri(new Uri.file('bar/baz.dart'));
+    expect(relative.path, '/foo/bar/baz.dart');
+  }
+
+  void test_shortName() {
+    expect(source.shortName, 'test.dart');
+  }
+}
+
+@reflectiveTest
+class MemoryFileSourceNotExistingTest {
+  MemoryResourceProvider provider = new MemoryResourceProvider();
+  Source source;
+
+  setUp() {
+    File file = provider.getResource('/foo/test.dart');
+    source = file.createSource();
+  }
+
+  void test_contents() {
+    expect(() {
+      source.contents;
+    }, throwsA(_isFileSystemException));
+  }
+
+  void test_encoding() {
+    expect(source.encoding, 'file:///foo/test.dart');
+  }
+
+  void test_exists() {
+    expect(source.exists(), isFalse);
+  }
+
+  void test_fullName() {
+    expect(source.fullName, '/foo/test.dart');
+  }
+
+  void test_modificationStamp() {
+    expect(source.modificationStamp, -1);
+  }
+
+  void test_resolveRelative() {
+    Uri relative = source.resolveRelativeUri(new Uri.file('bar/baz.dart'));
+    expect(relative.path, '/foo/bar/baz.dart');
+  }
+
+  void test_shortName() {
+    expect(source.shortName, 'test.dart');
+  }
+}
+
+@reflectiveTest
+class MemoryResourceProviderTest {
+  MemoryResourceProvider provider = new MemoryResourceProvider();
+
+  void test_deleteFile_folder() {
+    String path = '/my/file';
+    provider.newFolder(path);
+    expect(() {
+      provider.deleteFile(path);
+    }, throwsA(new isInstanceOf<ArgumentError>()));
+    expect(provider.getResource(path), new isInstanceOf<Folder>());
+  }
+
+  void test_deleteFile_notExistent() {
+    String path = '/my/file';
+    expect(() {
+      provider.deleteFile(path);
+    }, throwsA(new isInstanceOf<ArgumentError>()));
+    Resource file = provider.getResource(path);
+    expect(file, isNotNull);
+    expect(file.exists, isFalse);
+  }
+
+  void test_deleteFile_success() {
+    String path = '/my/file';
+    provider.newFile(path, 'contents');
+    Resource file = provider.getResource(path);
+    expect(file, new isInstanceOf<File>());
+    expect(file.exists, isTrue);
+    provider.deleteFile(path);
+    expect(file.exists, isFalse);
+  }
+
+  void test_getStateLocation_uniqueness() {
+    String idOne = 'one';
+    Folder folderOne = provider.getStateLocation(idOne);
+    expect(folderOne, isNotNull);
+    String idTwo = 'two';
+    Folder folderTwo = provider.getStateLocation(idTwo);
+    expect(folderTwo, isNotNull);
+    expect(folderTwo, isNot(equals(folderOne)));
+    expect(provider.getStateLocation(idOne), equals(folderOne));
+  }
+
+  void test_modifyFile_isFolder() {
+    String path = '/my/file';
+    provider.newFolder(path);
+    expect(() {
+      provider.modifyFile(path, 'contents');
+    }, throwsA(new isInstanceOf<ArgumentError>()));
+    expect(provider.getResource(path), new isInstanceOf<Folder>());
+  }
+
+  void test_modifyFile_notExistent() {
+    String path = '/my/file';
+    expect(() {
+      provider.modifyFile(path, 'contents');
+    }, throwsA(new isInstanceOf<ArgumentError>()));
+    Resource file = provider.getResource(path);
+    expect(file, isNotNull);
+    expect(file.exists, isFalse);
+  }
+
+  void test_modifyFile_success() {
+    String path = '/my/file';
+    provider.newFile(path, 'contents 1');
+    Resource file = provider.getResource(path);
+    expect(file, new isInstanceOf<File>());
+    Source source = (file as File).createSource();
+    expect(source.contents.data, equals('contents 1'));
+    provider.modifyFile(path, 'contents 2');
+    expect(source.contents.data, equals('contents 2'));
+  }
+
+  void test_newFolder_aleadyExists_asFile() {
+    provider.newFile('/my/file', 'qwerty');
+    expect(() {
+      provider.newFolder('/my/file');
+    }, throwsA(new isInstanceOf<ArgumentError>()));
+  }
+
+  void test_newFolder_aleadyExists_asFolder() {
+    Folder folder = provider.newFolder('/my/folder');
+    Folder newFolder = provider.newFolder('/my/folder');
+    expect(newFolder, folder);
+  }
+
+  void test_newFolder_emptyPath() {
+    expect(() {
+      provider.newFolder('');
+    }, throwsA(new isInstanceOf<ArgumentError>()));
+  }
+
+  void test_newFolder_notAbsolute() {
+    expect(() {
+      provider.newFolder('not/absolute');
+    }, throwsA(new isInstanceOf<ArgumentError>()));
+  }
+
+  test_watch_createFile() {
+    String rootPath = '/my/path';
+    provider.newFolder(rootPath);
+    return _watchingFolder(rootPath, (changesReceived) {
+      expect(changesReceived, hasLength(0));
+      String path = posix.join(rootPath, 'foo');
+      provider.newFile(path, 'contents');
+      return _delayed(() {
+        expect(changesReceived, hasLength(1));
+        expect(changesReceived[0].type, equals(ChangeType.ADD));
+        expect(changesReceived[0].path, equals(path));
+      });
+    });
+  }
+
+  test_watch_deleteFile() {
+    String rootPath = '/my/path';
+    provider.newFolder(rootPath);
+    String path = posix.join(rootPath, 'foo');
+    provider.newFile(path, 'contents 1');
+    return _watchingFolder(rootPath, (changesReceived) {
+      expect(changesReceived, hasLength(0));
+      provider.deleteFile(path);
+      return _delayed(() {
+        expect(changesReceived, hasLength(1));
+        expect(changesReceived[0].type, equals(ChangeType.REMOVE));
+        expect(changesReceived[0].path, equals(path));
+      });
+    });
+  }
+
+  test_watch_modifyFile() {
+    String rootPath = '/my/path';
+    provider.newFolder(rootPath);
+    String path = posix.join(rootPath, 'foo');
+    provider.newFile(path, 'contents 1');
+    return _watchingFolder(rootPath, (changesReceived) {
+      expect(changesReceived, hasLength(0));
+      provider.modifyFile(path, 'contents 2');
+      return _delayed(() {
+        expect(changesReceived, hasLength(1));
+        expect(changesReceived[0].type, equals(ChangeType.MODIFY));
+        expect(changesReceived[0].path, equals(path));
+      });
+    });
+  }
+
+  test_watch_modifyFile_inSubDir() {
+    String rootPath = '/my/path';
+    provider.newFolder(rootPath);
+    String subdirPath = posix.join(rootPath, 'foo');
+    provider.newFolder(subdirPath);
+    String path = posix.join(rootPath, 'bar');
+    provider.newFile(path, 'contents 1');
+    return _watchingFolder(rootPath, (changesReceived) {
+      expect(changesReceived, hasLength(0));
+      provider.modifyFile(path, 'contents 2');
+      return _delayed(() {
+        expect(changesReceived, hasLength(1));
+        expect(changesReceived[0].type, equals(ChangeType.MODIFY));
+        expect(changesReceived[0].path, equals(path));
+      });
+    });
+  }
+
+  Future _delayed(computation()) {
+    return new Future.delayed(Duration.ZERO, computation);
+  }
+
+  _watchingFolder(String path, test(List<WatchEvent> changesReceived)) {
+    Folder folder = provider.getResource(path);
+    var changesReceived = <WatchEvent>[];
+    folder.changes.listen(changesReceived.add);
+    return test(changesReceived);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/file_system/physical_resource_provider_test.dart b/mojo/public/dart/third_party/analyzer/test/file_system/physical_resource_provider_test.dart
new file mode 100644
index 0000000..87d976a
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/file_system/physical_resource_provider_test.dart
@@ -0,0 +1,452 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.physical_file_system;
+
+import 'dart:async';
+import 'dart:core' hide Resource;
+import 'dart:io' as io;
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:path/path.dart';
+import 'package:unittest/unittest.dart';
+import 'package:watcher/watcher.dart';
+
+import '../reflective_tests.dart';
+import '../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(PhysicalResourceProviderTest);
+  runReflectiveTests(FileTest);
+  runReflectiveTests(FolderTest);
+}
+
+var _isFile = new isInstanceOf<File>();
+var _isFileSystemException = new isInstanceOf<FileSystemException>();
+var _isFolder = new isInstanceOf<Folder>();
+
+@reflectiveTest
+class FileTest extends _BaseTest {
+  String path;
+  File file;
+
+  setUp() {
+    super.setUp();
+    path = join(tempPath, 'file.txt');
+    file = PhysicalResourceProvider.INSTANCE.getResource(path);
+  }
+
+  void test_createSource() {
+    new io.File(path).writeAsStringSync('contents');
+    Source source = file.createSource();
+    expect(source.uriKind, UriKind.FILE_URI);
+    expect(source.exists(), isTrue);
+    expect(source.contents.data, 'contents');
+  }
+
+  void test_equals_differentPaths() {
+    String path2 = join(tempPath, 'file2.txt');
+    File file2 = PhysicalResourceProvider.INSTANCE.getResource(path2);
+    expect(file == file2, isFalse);
+  }
+
+  void test_equals_samePath() {
+    new io.File(path).writeAsStringSync('contents');
+    File file2 = PhysicalResourceProvider.INSTANCE.getResource(path);
+    expect(file == file2, isTrue);
+  }
+
+  void test_exists_false() {
+    expect(file.exists, isFalse);
+  }
+
+  void test_exists_true() {
+    new io.File(path).writeAsStringSync('contents');
+    expect(file.exists, isTrue);
+  }
+
+  void test_fullName() {
+    expect(file.path, path);
+  }
+
+  void test_hashCode() {
+    new io.File(path).writeAsStringSync('contents');
+    File file2 = PhysicalResourceProvider.INSTANCE.getResource(path);
+    expect(file.hashCode, equals(file2.hashCode));
+  }
+
+  void test_isOrContains() {
+    File file = PhysicalResourceProvider.INSTANCE.getResource(path);
+    expect(file.isOrContains(path), isTrue);
+    expect(file.isOrContains('foo'), isFalse);
+  }
+
+  void test_modificationStamp_doesNotExist() {
+    File file = PhysicalResourceProvider.INSTANCE.getResource(path);
+    expect(() {
+      file.modificationStamp;
+    }, throwsA(_isFileSystemException));
+  }
+
+  void test_modificationStamp_exists() {
+    new io.File(path).writeAsStringSync('contents');
+    File file = PhysicalResourceProvider.INSTANCE.getResource(path);
+    expect(file.modificationStamp, isNonNegative);
+  }
+
+  void test_parent() {
+    Resource parent = file.parent;
+    expect(parent, new isInstanceOf<Folder>());
+    expect(parent.path, equals(tempPath));
+  }
+
+  void test_readAsStringSync_doesNotExist() {
+    File file = PhysicalResourceProvider.INSTANCE.getResource(path);
+    expect(() {
+      file.readAsStringSync();
+    }, throwsA(_isFileSystemException));
+  }
+
+  void test_readAsStringSync_exists() {
+    new io.File(path).writeAsStringSync('abc');
+    File file = PhysicalResourceProvider.INSTANCE.getResource(path);
+    expect(file.readAsStringSync(), 'abc');
+  }
+
+  void test_shortName() {
+    expect(file.shortName, 'file.txt');
+  }
+
+  void test_toString() {
+    expect(file.toString(), path);
+  }
+}
+
+@reflectiveTest
+class FolderTest extends _BaseTest {
+  String path;
+  Folder folder;
+
+  setUp() {
+    super.setUp();
+    path = join(tempPath, 'folder');
+    new io.Directory(path).createSync();
+    folder = PhysicalResourceProvider.INSTANCE.getResource(path);
+  }
+
+  void test_canonicalizePath() {
+    String path2 = join(tempPath, 'folder2');
+    String path3 = join(tempPath, 'folder3');
+    expect(folder.canonicalizePath('baz'), equals(join(path, 'baz')));
+    expect(folder.canonicalizePath(path2), equals(path2));
+    expect(folder.canonicalizePath(join('..', 'folder2')), equals(path2));
+    expect(
+        folder.canonicalizePath(join(path2, '..', 'folder3')), equals(path3));
+    expect(
+        folder.canonicalizePath(join('.', 'baz')), equals(join(path, 'baz')));
+    expect(folder.canonicalizePath(join(path2, '.', 'baz')),
+        equals(join(path2, 'baz')));
+  }
+
+  void test_contains() {
+    expect(folder.contains(join(path, 'aaa.txt')), isTrue);
+    expect(folder.contains(join(path, 'aaa', 'bbb.txt')), isTrue);
+    expect(folder.contains(join(tempPath, 'baz.txt')), isFalse);
+    expect(folder.contains(path), isFalse);
+  }
+
+  void test_equals_differentPaths() {
+    String path2 = join(tempPath, 'folder2');
+    new io.Directory(path2).createSync();
+    Folder folder2 = PhysicalResourceProvider.INSTANCE.getResource(path2);
+    expect(folder == folder2, isFalse);
+  }
+
+  void test_equals_samePath() {
+    Folder folder2 = PhysicalResourceProvider.INSTANCE.getResource(path);
+    expect(folder == folder2, isTrue);
+  }
+
+  void test_getChild_doesNotExist() {
+    var child = folder.getChild('no-such-resource');
+    expect(child, isNotNull);
+    expect(child.exists, isFalse);
+  }
+
+  void test_getChild_file() {
+    new io.File(join(path, 'myFile')).createSync();
+    var child = folder.getChild('myFile');
+    expect(child, _isFile);
+    expect(child.exists, isTrue);
+  }
+
+  void test_getChild_folder() {
+    new io.Directory(join(path, 'myFolder')).createSync();
+    var child = folder.getChild('myFolder');
+    expect(child, _isFolder);
+    expect(child.exists, isTrue);
+  }
+
+  void test_getChildAssumingFolder_doesNotExist() {
+    Folder child = folder.getChildAssumingFolder('no-such-resource');
+    expect(child, isNotNull);
+    expect(child.exists, isFalse);
+  }
+
+  void test_getChildAssumingFolder_file() {
+    new io.File(join(path, 'myFile')).createSync();
+    Folder child = folder.getChildAssumingFolder('myFile');
+    expect(child, isNotNull);
+    expect(child.exists, isFalse);
+  }
+
+  void test_getChildAssumingFolder_folder() {
+    new io.Directory(join(path, 'myFolder')).createSync();
+    Folder child = folder.getChildAssumingFolder('myFolder');
+    expect(child, isNotNull);
+    expect(child.exists, isTrue);
+  }
+
+  void test_getChildren_doesNotExist() {
+    folder = folder.getChildAssumingFolder('no-such-folder');
+    expect(() {
+      folder.getChildren();
+    }, throwsA(_isFileSystemException));
+  }
+
+  void test_getChildren_exists() {
+    // create 2 files and 1 folder
+    new io.File(join(path, 'a.txt')).createSync();
+    new io.Directory(join(path, 'bFolder')).createSync();
+    new io.File(join(path, 'c.txt')).createSync();
+    // prepare 3 children
+    List<Resource> children = folder.getChildren();
+    expect(children, hasLength(3));
+    children.sort((a, b) => a.shortName.compareTo(b.shortName));
+    // check that each child exists
+    children.forEach((child) {
+      expect(child.exists, true);
+    });
+    // check names
+    expect(children[0].shortName, 'a.txt');
+    expect(children[1].shortName, 'bFolder');
+    expect(children[2].shortName, 'c.txt');
+    // check types
+    expect(children[0], _isFile);
+    expect(children[1], _isFolder);
+    expect(children[2], _isFile);
+  }
+
+  void test_hashCode() {
+    Folder folder2 = PhysicalResourceProvider.INSTANCE.getResource(path);
+    expect(folder.hashCode, equals(folder2.hashCode));
+  }
+
+  void test_isOrContains() {
+    expect(folder.isOrContains(path), isTrue);
+    expect(folder.isOrContains(join(path, 'aaa.txt')), isTrue);
+    expect(folder.isOrContains(join(path, 'aaa', 'bbb.txt')), isTrue);
+    expect(folder.isOrContains(join(tempPath, 'baz.txt')), isFalse);
+  }
+
+  void test_parent() {
+    Resource parent = folder.parent;
+    expect(parent, new isInstanceOf<Folder>());
+    expect(parent.path, equals(tempPath));
+
+    // Since the OS is in control of where tempPath is, we don't know how
+    // far it should be from the root.  So just verify that each call to
+    // parent results in a a folder with a shorter path, and that we
+    // reach the root eventually.
+    while (true) {
+      Resource grandParent = parent.parent;
+      if (grandParent == null) {
+        break;
+      }
+      expect(grandParent, new isInstanceOf<Folder>());
+      expect(grandParent.path.length, lessThan(parent.path.length));
+      parent = grandParent;
+    }
+  }
+}
+
+@reflectiveTest
+class PhysicalResourceProviderTest extends _BaseTest {
+  void test_getStateLocation_uniqueness() {
+    PhysicalResourceProvider provider = PhysicalResourceProvider.INSTANCE;
+    String idOne = 'one';
+    Folder folderOne = provider.getStateLocation(idOne);
+    expect(folderOne, isNotNull);
+    String idTwo = 'two';
+    Folder folderTwo = provider.getStateLocation(idTwo);
+    expect(folderTwo, isNotNull);
+    expect(folderTwo, isNot(equals(folderOne)));
+    expect(provider.getStateLocation(idOne), equals(folderOne));
+  }
+
+  test_watchFile_delete() {
+    var path = join(tempPath, 'foo');
+    var file = new io.File(path);
+    file.writeAsStringSync('contents 1');
+    return _watchingFile(path, (changesReceived) {
+      expect(changesReceived, hasLength(0));
+      file.deleteSync();
+      return _delayed(() {
+        expect(changesReceived, hasLength(1));
+        if (io.Platform.isWindows) {
+          // See https://github.com/dart-lang/sdk/issues/23762
+          // Not sure why this breaks under Windows, but testing to see whether
+          // we are running Windows causes the type to change. For now we print
+          // the type out of curriosity.
+          print(
+              'PhysicalResourceProviderTest:test_watchFile_delete received an event with type = ${changesReceived[0].type}');
+        } else {
+          expect(changesReceived[0].type, equals(ChangeType.REMOVE));
+        }
+        expect(changesReceived[0].path, equals(path));
+      });
+    });
+  }
+
+  test_watchFile_modify() {
+    var path = join(tempPath, 'foo');
+    var file = new io.File(path);
+    file.writeAsStringSync('contents 1');
+    return _watchingFile(path, (changesReceived) {
+      expect(changesReceived, hasLength(0));
+      file.writeAsStringSync('contents 2');
+      return _delayed(() {
+        expect(changesReceived, hasLength(1));
+        expect(changesReceived[0].type, equals(ChangeType.MODIFY));
+        expect(changesReceived[0].path, equals(path));
+      });
+    });
+  }
+
+  test_watchFolder_createFile() {
+    return _watchingFolder(tempPath, (changesReceived) {
+      expect(changesReceived, hasLength(0));
+      var path = join(tempPath, 'foo');
+      new io.File(path).writeAsStringSync('contents');
+      return _delayed(() {
+        // There should be an "add" event indicating that the file was added.
+        // Depending on how long it took to write the contents, it may be
+        // followed by "modify" events.
+        expect(changesReceived, isNotEmpty);
+        expect(changesReceived[0].type, equals(ChangeType.ADD));
+        expect(changesReceived[0].path, equals(path));
+        for (int i = 1; i < changesReceived.length; i++) {
+          expect(changesReceived[i].type, equals(ChangeType.MODIFY));
+          expect(changesReceived[i].path, equals(path));
+        }
+      });
+    });
+  }
+
+  test_watchFolder_deleteFile() {
+    var path = join(tempPath, 'foo');
+    var file = new io.File(path);
+    file.writeAsStringSync('contents 1');
+    return _watchingFolder(tempPath, (changesReceived) {
+      expect(changesReceived, hasLength(0));
+      file.deleteSync();
+      return _delayed(() {
+        expect(changesReceived, hasLength(1));
+        expect(changesReceived[0].type, equals(ChangeType.REMOVE));
+        expect(changesReceived[0].path, equals(path));
+      });
+    });
+  }
+
+  test_watchFolder_modifyFile() {
+    var path = join(tempPath, 'foo');
+    var file = new io.File(path);
+    file.writeAsStringSync('contents 1');
+    return _watchingFolder(tempPath, (changesReceived) {
+      expect(changesReceived, hasLength(0));
+      file.writeAsStringSync('contents 2');
+      return _delayed(() {
+        expect(changesReceived, hasLength(1));
+        expect(changesReceived[0].type, equals(ChangeType.MODIFY));
+        expect(changesReceived[0].path, equals(path));
+      });
+    });
+  }
+
+  test_watchFolder_modifyFile_inSubDir() {
+    var subdirPath = join(tempPath, 'foo');
+    new io.Directory(subdirPath).createSync();
+    var path = join(tempPath, 'bar');
+    var file = new io.File(path);
+    file.writeAsStringSync('contents 1');
+    return _watchingFolder(tempPath, (changesReceived) {
+      expect(changesReceived, hasLength(0));
+      file.writeAsStringSync('contents 2');
+      return _delayed(() {
+        expect(changesReceived, hasLength(1));
+        expect(changesReceived[0].type, equals(ChangeType.MODIFY));
+        expect(changesReceived[0].path, equals(path));
+      });
+    });
+  }
+
+  Future _delayed(computation()) {
+    // Give the tests 1 second to detect the changes. While it may only
+    // take up to a few hundred ms, a whole second gives a good margin
+    // for when running tests.
+    return new Future.delayed(new Duration(seconds: 1), computation);
+  }
+
+  _watchingFile(String path, test(List<WatchEvent> changesReceived)) {
+    // Delay before we start watching the file.  This is necessary
+    // because on MacOS, file modifications that occur just before we
+    // start watching are sometimes misclassified as happening just after
+    // we start watching.
+    return _delayed(() {
+      File file = PhysicalResourceProvider.INSTANCE.getResource(path);
+      var changesReceived = <WatchEvent>[];
+      var subscription = file.changes.listen(changesReceived.add);
+      // Delay running the rest of the test to allow file.changes propogate.
+      return _delayed(() => test(changesReceived)).whenComplete(() {
+        subscription.cancel();
+      });
+    });
+  }
+
+  _watchingFolder(String path, test(List<WatchEvent> changesReceived)) {
+    // Delay before we start watching the folder.  This is necessary
+    // because on MacOS, file modifications that occur just before we
+    // start watching are sometimes misclassified as happening just after
+    // we start watching.
+    return _delayed(() {
+      Folder folder = PhysicalResourceProvider.INSTANCE.getResource(path);
+      var changesReceived = <WatchEvent>[];
+      var subscription = folder.changes.listen(changesReceived.add);
+      // Delay running the rest of the test to allow folder.changes to
+      // take a snapshot of the current directory state.  Otherwise it
+      // won't be able to reliably distinguish new files from modified
+      // ones.
+      return _delayed(() => test(changesReceived)).whenComplete(() {
+        subscription.cancel();
+      });
+    });
+  }
+}
+
+class _BaseTest {
+  io.Directory tempDirectory;
+  String tempPath;
+
+  setUp() {
+    tempDirectory = io.Directory.systemTemp.createTempSync('test_resource');
+    tempPath = tempDirectory.absolute.path;
+  }
+
+  tearDown() {
+    tempDirectory.deleteSync(recursive: true);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/file_system/resource_uri_resolver_test.dart b/mojo/public/dart/third_party/analyzer/test/file_system/resource_uri_resolver_test.dart
new file mode 100644
index 0000000..8d91d24
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/file_system/resource_uri_resolver_test.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.resource_uri_resolver;
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+import '../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(ResourceUriResolverTest);
+}
+
+@reflectiveTest
+class ResourceUriResolverTest {
+  MemoryResourceProvider provider;
+  ResourceUriResolver resolver;
+
+  void setUp() {
+    provider = new MemoryResourceProvider();
+    resolver = new ResourceUriResolver(provider);
+    provider.newFile('/test.dart', '');
+    provider.newFolder('/folder');
+  }
+
+  void test_resolveAbsolute_file() {
+    var uri = new Uri(scheme: 'file', path: '/test.dart');
+    Source source = resolver.resolveAbsolute(uri);
+    expect(source, isNotNull);
+    expect(source.exists(), isTrue);
+    expect(source.fullName, '/test.dart');
+  }
+
+  void test_resolveAbsolute_folder() {
+    var uri = new Uri(scheme: 'file', path: '/folder');
+    Source source = resolver.resolveAbsolute(uri);
+    expect(source, isNull);
+  }
+
+  void test_resolveAbsolute_notFile() {
+    var uri = new Uri(scheme: 'https', path: '127.0.0.1/test.dart');
+    Source source = resolver.resolveAbsolute(uri);
+    expect(source, isNull);
+  }
+
+  void test_restoreAbsolute() {
+    var uri = new Uri(scheme: 'file', path: '/test.dart');
+    Source source = resolver.resolveAbsolute(uri);
+    expect(source, isNotNull);
+    expect(resolver.restoreAbsolute(source), uri);
+    expect(
+        resolver.restoreAbsolute(
+            new NonExistingSource(source.fullName, null, null)),
+        uri);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/file_system/test_all.dart b/mojo/public/dart/third_party/analyzer/test/file_system/test_all.dart
new file mode 100644
index 0000000..303df09
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/file_system/test_all.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.file_system;
+
+import 'package:unittest/unittest.dart';
+
+import '../utils.dart';
+import 'memory_file_system_test.dart' as memory_file_system_test;
+import 'physical_resource_provider_test.dart'
+    as physical_resource_provider_test;
+import 'resource_uri_resolver_test.dart' as resource_uri_resolver_test;
+
+/// Utility for manually running all tests.
+main() {
+  initializeTestEnvironment();
+  group('file_system', () {
+    memory_file_system_test.main();
+    physical_resource_provider_test.main();
+    resource_uri_resolver_test.main();
+  });
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/all_the_rest_test.dart b/mojo/public/dart/third_party/analyzer/test/generated/all_the_rest_test.dart
new file mode 100644
index 0000000..ec4b9c0
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/generated/all_the_rest_test.dart
@@ -0,0 +1,9227 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.all_the_rest_test;
+
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/src/generated/ast.dart' hide ConstantEvaluator;
+import 'package:analyzer/src/generated/constant.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/html.dart' as ht;
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/java_engine_io.dart';
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/sdk_io.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/testing/ast_factory.dart';
+import 'package:analyzer/src/generated/testing/element_factory.dart';
+import 'package:analyzer/src/generated/testing/html_factory.dart';
+import 'package:analyzer/src/generated/testing/test_type_provider.dart';
+import 'package:analyzer/src/generated/testing/token_factory.dart';
+import 'package:analyzer/src/generated/utilities_collection.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:analyzer/src/task/dart.dart';
+import 'package:path/path.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+import '../utils.dart';
+import 'engine_test.dart';
+import 'parser_test.dart';
+import 'resolver_test.dart';
+import 'test_support.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(ConstantEvaluatorTest);
+  runReflectiveTests(ConstantFinderTest);
+  runReflectiveTests(ConstantValueComputerTest);
+  runReflectiveTests(ConstantVisitorTest);
+  runReflectiveTests(ContentCacheTest);
+  runReflectiveTests(CustomUriResolverTest);
+  runReflectiveTests(DartObjectImplTest);
+  runReflectiveTests(DartUriResolverTest);
+  runReflectiveTests(DeclaredVariablesTest);
+  runReflectiveTests(DirectoryBasedDartSdkTest);
+  runReflectiveTests(DirectoryBasedSourceContainerTest);
+  runReflectiveTests(ElementBuilderTest);
+  runReflectiveTests(ElementLocatorTest);
+  runReflectiveTests(EnumMemberBuilderTest);
+  runReflectiveTests(ErrorReporterTest);
+  runReflectiveTests(ErrorSeverityTest);
+  runReflectiveTests(ExitDetectorTest);
+  runReflectiveTests(ExitDetectorTest2);
+  runReflectiveTests(FileBasedSourceTest);
+  runReflectiveTests(FileUriResolverTest);
+  if (!AnalysisEngine.instance.useTaskModel) {
+    runReflectiveTests(HtmlParserTest);
+    runReflectiveTests(HtmlTagInfoBuilderTest);
+    runReflectiveTests(HtmlUnitBuilderTest);
+    runReflectiveTests(HtmlWarningCodeTest);
+  }
+  runReflectiveTests(ReferenceFinderTest);
+  runReflectiveTests(SDKLibrariesReaderTest);
+  runReflectiveTests(ToSourceVisitorTest);
+  runReflectiveTests(UriKindTest);
+  runReflectiveTests(StringScannerTest);
+}
+
+abstract class AbstractScannerTest {
+  ht.AbstractScanner newScanner(String input);
+
+  void test_tokenize_attribute() {
+    _tokenize("<html bob=\"one two\">", <Object>[
+      ht.TokenType.LT,
+      "html",
+      "bob",
+      ht.TokenType.EQ,
+      "\"one two\"",
+      ht.TokenType.GT
+    ]);
+  }
+
+  void test_tokenize_comment() {
+    _tokenize("<!-- foo -->", <Object>["<!-- foo -->"]);
+  }
+
+  void test_tokenize_comment_incomplete() {
+    _tokenize("<!-- foo", <Object>["<!-- foo"]);
+  }
+
+  void test_tokenize_comment_with_gt() {
+    _tokenize("<!-- foo > -> -->", <Object>["<!-- foo > -> -->"]);
+  }
+
+  void test_tokenize_declaration() {
+    _tokenize("<! foo ><html>",
+        <Object>["<! foo >", ht.TokenType.LT, "html", ht.TokenType.GT]);
+  }
+
+  void test_tokenize_declaration_malformed() {
+    _tokenize("<! foo /><html>",
+        <Object>["<! foo />", ht.TokenType.LT, "html", ht.TokenType.GT]);
+  }
+
+  void test_tokenize_directive_incomplete() {
+    _tokenize2("<? \nfoo", <Object>["<? \nfoo"], <int>[0, 4]);
+  }
+
+  void test_tokenize_directive_xml() {
+    _tokenize("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>",
+        <Object>["<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"]);
+  }
+
+  void test_tokenize_directives_incomplete_with_newline() {
+    _tokenize2("<! \nfoo", <Object>["<! \nfoo"], <int>[0, 4]);
+  }
+
+  void test_tokenize_empty() {
+    _tokenize("", <Object>[]);
+  }
+
+  void test_tokenize_lt() {
+    _tokenize("<", <Object>[ht.TokenType.LT]);
+  }
+
+  void test_tokenize_script_embedded_tags() {
+    _tokenize("<script> <p></p></script>", <Object>[
+      ht.TokenType.LT,
+      "script",
+      ht.TokenType.GT,
+      " <p></p>",
+      ht.TokenType.LT_SLASH,
+      "script",
+      ht.TokenType.GT
+    ]);
+  }
+
+  void test_tokenize_script_embedded_tags2() {
+    _tokenize("<script> <p></p><</script>", <Object>[
+      ht.TokenType.LT,
+      "script",
+      ht.TokenType.GT,
+      " <p></p><",
+      ht.TokenType.LT_SLASH,
+      "script",
+      ht.TokenType.GT
+    ]);
+  }
+
+  void test_tokenize_script_embedded_tags3() {
+    _tokenize("<script> <p></p></</script>", <Object>[
+      ht.TokenType.LT,
+      "script",
+      ht.TokenType.GT,
+      " <p></p></",
+      ht.TokenType.LT_SLASH,
+      "script",
+      ht.TokenType.GT
+    ]);
+  }
+
+  void test_tokenize_script_partial() {
+    _tokenize("<script> <p> ",
+        <Object>[ht.TokenType.LT, "script", ht.TokenType.GT, " <p> "]);
+  }
+
+  void test_tokenize_script_partial2() {
+    _tokenize("<script> <p> <",
+        <Object>[ht.TokenType.LT, "script", ht.TokenType.GT, " <p> <"]);
+  }
+
+  void test_tokenize_script_partial3() {
+    _tokenize("<script> <p> </",
+        <Object>[ht.TokenType.LT, "script", ht.TokenType.GT, " <p> </"]);
+  }
+
+  void test_tokenize_script_ref() {
+    _tokenize("<script source='some.dart'/> <p>", <Object>[
+      ht.TokenType.LT,
+      "script",
+      "source",
+      ht.TokenType.EQ,
+      "'some.dart'",
+      ht.TokenType.SLASH_GT,
+      " ",
+      ht.TokenType.LT,
+      "p",
+      ht.TokenType.GT
+    ]);
+  }
+
+  void test_tokenize_script_with_newline() {
+    _tokenize2("<script> <p>\n </script>", <Object>[
+      ht.TokenType.LT,
+      "script",
+      ht.TokenType.GT,
+      " <p>\n ",
+      ht.TokenType.LT_SLASH,
+      "script",
+      ht.TokenType.GT
+    ], <int>[
+      0,
+      13
+    ]);
+  }
+
+  void test_tokenize_spaces_and_newlines() {
+    ht.Token token = _tokenize2(
+        " < html \n bob = 'joe\n' >\n <\np > one \r\n two <!-- \rfoo --> </ p > </ html > ",
+        <Object>[
+      " ",
+      ht.TokenType.LT,
+      "html",
+      "bob",
+      ht.TokenType.EQ,
+      "'joe\n'",
+      ht.TokenType.GT,
+      "\n ",
+      ht.TokenType.LT,
+      "p",
+      ht.TokenType.GT,
+      " one \r\n two ",
+      "<!-- \rfoo -->",
+      " ",
+      ht.TokenType.LT_SLASH,
+      "p",
+      ht.TokenType.GT,
+      " ",
+      ht.TokenType.LT_SLASH,
+      "html",
+      ht.TokenType.GT,
+      " "
+    ],
+        <int>[
+      0,
+      9,
+      21,
+      25,
+      28,
+      38,
+      49
+    ]);
+    token = token.next;
+    expect(token.offset, 1);
+    token = token.next;
+    expect(token.offset, 3);
+    token = token.next;
+    expect(token.offset, 10);
+  }
+
+  void test_tokenize_string() {
+    _tokenize("<p bob=\"foo\">", <Object>[
+      ht.TokenType.LT,
+      "p",
+      "bob",
+      ht.TokenType.EQ,
+      "\"foo\"",
+      ht.TokenType.GT
+    ]);
+  }
+
+  void test_tokenize_string_partial() {
+    _tokenize("<p bob=\"foo",
+        <Object>[ht.TokenType.LT, "p", "bob", ht.TokenType.EQ, "\"foo"]);
+  }
+
+  void test_tokenize_string_single_quote() {
+    _tokenize("<p bob='foo'>", <Object>[
+      ht.TokenType.LT,
+      "p",
+      "bob",
+      ht.TokenType.EQ,
+      "'foo'",
+      ht.TokenType.GT
+    ]);
+  }
+
+  void test_tokenize_string_single_quote_partial() {
+    _tokenize("<p bob='foo",
+        <Object>[ht.TokenType.LT, "p", "bob", ht.TokenType.EQ, "'foo"]);
+  }
+
+  void test_tokenize_tag_begin_end() {
+    _tokenize("<html></html>", <Object>[
+      ht.TokenType.LT,
+      "html",
+      ht.TokenType.GT,
+      ht.TokenType.LT_SLASH,
+      "html",
+      ht.TokenType.GT
+    ]);
+  }
+
+  void test_tokenize_tag_begin_only() {
+    ht.Token token =
+        _tokenize("<html>", <Object>[ht.TokenType.LT, "html", ht.TokenType.GT]);
+    token = token.next;
+    expect(token.offset, 1);
+  }
+
+  void test_tokenize_tag_incomplete_with_special_characters() {
+    _tokenize("<br-a_b", <Object>[ht.TokenType.LT, "br-a_b"]);
+  }
+
+  void test_tokenize_tag_self_contained() {
+    _tokenize("<br/>", <Object>[ht.TokenType.LT, "br", ht.TokenType.SLASH_GT]);
+  }
+
+  void test_tokenize_tags_wellformed() {
+    _tokenize("<html><p>one two</p></html>", <Object>[
+      ht.TokenType.LT,
+      "html",
+      ht.TokenType.GT,
+      ht.TokenType.LT,
+      "p",
+      ht.TokenType.GT,
+      "one two",
+      ht.TokenType.LT_SLASH,
+      "p",
+      ht.TokenType.GT,
+      ht.TokenType.LT_SLASH,
+      "html",
+      ht.TokenType.GT
+    ]);
+  }
+
+  /**
+   * Given an object representing an expected token, answer the expected token type.
+   *
+   * @param count the token count for error reporting
+   * @param expected the object representing an expected token
+   * @return the expected token type
+   */
+  ht.TokenType _getExpectedTokenType(int count, Object expected) {
+    if (expected is ht.TokenType) {
+      return expected;
+    }
+    if (expected is String) {
+      String lexeme = expected;
+      if (lexeme.startsWith("\"") || lexeme.startsWith("'")) {
+        return ht.TokenType.STRING;
+      }
+      if (lexeme.startsWith("<!--")) {
+        return ht.TokenType.COMMENT;
+      }
+      if (lexeme.startsWith("<!")) {
+        return ht.TokenType.DECLARATION;
+      }
+      if (lexeme.startsWith("<?")) {
+        return ht.TokenType.DIRECTIVE;
+      }
+      if (_isTag(lexeme)) {
+        return ht.TokenType.TAG;
+      }
+      return ht.TokenType.TEXT;
+    }
+    fail(
+        "Unknown expected token $count: ${expected != null ? expected.runtimeType : "null"}");
+    return null;
+  }
+
+  bool _isTag(String lexeme) {
+    if (lexeme.length == 0 || !Character.isLetter(lexeme.codeUnitAt(0))) {
+      return false;
+    }
+    for (int index = 1; index < lexeme.length; index++) {
+      int ch = lexeme.codeUnitAt(index);
+      if (!Character.isLetterOrDigit(ch) && ch != 0x2D && ch != 0x5F) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  ht.Token _tokenize(String input, List<Object> expectedTokens) =>
+      _tokenize2(input, expectedTokens, <int>[0]);
+  ht.Token _tokenize2(
+      String input, List<Object> expectedTokens, List<int> expectedLineStarts) {
+    ht.AbstractScanner scanner = newScanner(input);
+    scanner.passThroughElements = <String>["script"];
+    int count = 0;
+    ht.Token firstToken = scanner.tokenize();
+    ht.Token token = firstToken;
+    ht.Token previousToken = token.previous;
+    expect(previousToken.type == ht.TokenType.EOF, isTrue);
+    expect(previousToken.previous, same(previousToken));
+    expect(previousToken.offset, -1);
+    expect(previousToken.next, same(token));
+    expect(token.offset, 0);
+    while (token.type != ht.TokenType.EOF) {
+      if (count == expectedTokens.length) {
+        fail("too many parsed tokens");
+      }
+      Object expected = expectedTokens[count];
+      ht.TokenType expectedTokenType = _getExpectedTokenType(count, expected);
+      expect(token.type, same(expectedTokenType), reason: "token $count");
+      if (expectedTokenType.lexeme != null) {
+        expect(token.lexeme, expectedTokenType.lexeme, reason: "token $count");
+      } else {
+        expect(token.lexeme, expected, reason: "token $count");
+      }
+      count++;
+      previousToken = token;
+      token = token.next;
+      expect(token.previous, same(previousToken));
+    }
+    expect(token.next, same(token));
+    expect(token.offset, input.length);
+    if (count != expectedTokens.length) {
+      expect(false, isTrue, reason: "not enough parsed tokens");
+    }
+    List<int> lineStarts = scanner.lineStarts;
+    bool success = expectedLineStarts.length == lineStarts.length;
+    if (success) {
+      for (int i = 0; i < lineStarts.length; i++) {
+        if (expectedLineStarts[i] != lineStarts[i]) {
+          success = false;
+          break;
+        }
+      }
+    }
+    if (!success) {
+      StringBuffer buffer = new StringBuffer();
+      buffer.write("Expected line starts ");
+      for (int start in expectedLineStarts) {
+        buffer.write(start);
+        buffer.write(", ");
+      }
+      buffer.write(" but found ");
+      for (int start in lineStarts) {
+        buffer.write(start);
+        buffer.write(", ");
+      }
+      fail(buffer.toString());
+    }
+    return firstToken;
+  }
+}
+
+/**
+ * Implementation of [ConstantEvaluationValidator] used during unit tests;
+ * verifies that any nodes referenced during constant evaluation are present in
+ * the dependency graph.
+ */
+class ConstantEvaluationValidator_ForTest
+    implements ConstantEvaluationValidator {
+  ConstantValueComputer computer;
+
+  ConstantEvaluationTarget _nodeBeingEvaluated;
+
+  @override
+  void beforeComputeValue(ConstantEvaluationTarget constant) {
+    _nodeBeingEvaluated = constant;
+  }
+
+  @override
+  void beforeGetConstantInitializers(ConstructorElement constructor) {
+    // Make sure we properly recorded the dependency.
+    expect(
+        computer.referenceGraph.containsPath(_nodeBeingEvaluated, constructor),
+        isTrue);
+  }
+
+  @override
+  void beforeGetEvaluationResult(ConstantEvaluationTarget constant) {
+    // Make sure we properly recorded the dependency.
+    expect(computer.referenceGraph.containsPath(_nodeBeingEvaluated, constant),
+        isTrue);
+  }
+
+  @override
+  void beforeGetFieldEvaluationResult(FieldElementImpl field) {
+    // Make sure we properly recorded the dependency.
+    expect(computer.referenceGraph.containsPath(_nodeBeingEvaluated, field),
+        isTrue);
+  }
+
+  @override
+  void beforeGetParameterDefault(ParameterElement parameter) {
+    // Make sure we properly recorded the dependency.
+    expect(computer.referenceGraph.containsPath(_nodeBeingEvaluated, parameter),
+        isTrue);
+  }
+}
+
+@reflectiveTest
+class ConstantEvaluatorTest extends ResolverTestCase {
+  void fail_constructor() {
+    EvaluationResult result = _getExpressionValue("?");
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value, null);
+  }
+
+  void fail_identifier_class() {
+    EvaluationResult result = _getExpressionValue("?");
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value, null);
+  }
+
+  void fail_identifier_function() {
+    EvaluationResult result = _getExpressionValue("?");
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value, null);
+  }
+
+  void fail_identifier_static() {
+    EvaluationResult result = _getExpressionValue("?");
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value, null);
+  }
+
+  void fail_identifier_staticMethod() {
+    EvaluationResult result = _getExpressionValue("?");
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value, null);
+  }
+
+  void fail_identifier_topLevel() {
+    EvaluationResult result = _getExpressionValue("?");
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value, null);
+  }
+
+  void fail_identifier_typeParameter() {
+    EvaluationResult result = _getExpressionValue("?");
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value, null);
+  }
+
+  void fail_prefixedIdentifier_invalid() {
+    EvaluationResult result = _getExpressionValue("?");
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value, null);
+  }
+
+  void fail_prefixedIdentifier_valid() {
+    EvaluationResult result = _getExpressionValue("?");
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value, null);
+  }
+
+  void fail_propertyAccess_invalid() {
+    EvaluationResult result = _getExpressionValue("?");
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value, null);
+  }
+
+  void fail_propertyAccess_valid() {
+    EvaluationResult result = _getExpressionValue("?");
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value, null);
+  }
+
+  void fail_simpleIdentifier_invalid() {
+    EvaluationResult result = _getExpressionValue("?");
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value, null);
+  }
+
+  void fail_simpleIdentifier_valid() {
+    EvaluationResult result = _getExpressionValue("?");
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value, null);
+  }
+
+  void test_bitAnd_int_int() {
+    _assertValue3(74 & 42, "74 & 42");
+  }
+
+  void test_bitNot() {
+    _assertValue3(~42, "~42");
+  }
+
+  void test_bitOr_int_int() {
+    _assertValue3(74 | 42, "74 | 42");
+  }
+
+  void test_bitXor_int_int() {
+    _assertValue3(74 ^ 42, "74 ^ 42");
+  }
+
+  void test_divide_double_double() {
+    _assertValue2(3.2 / 2.3, "3.2 / 2.3");
+  }
+
+  void test_divide_double_double_byZero() {
+    EvaluationResult result = _getExpressionValue("3.2 / 0.0");
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value.type.name, "double");
+    expect(value.doubleValue.isInfinite, isTrue);
+  }
+
+  void test_divide_int_int() {
+    _assertValue2(1.5, "3 / 2");
+  }
+
+  void test_divide_int_int_byZero() {
+    EvaluationResult result = _getExpressionValue("3 / 0");
+    expect(result.isValid, isTrue);
+  }
+
+  void test_equal_boolean_boolean() {
+    _assertValue(false, "true == false");
+  }
+
+  void test_equal_int_int() {
+    _assertValue(false, "2 == 3");
+  }
+
+  void test_equal_invalidLeft() {
+    EvaluationResult result = _getExpressionValue("a == 3");
+    expect(result.isValid, isFalse);
+  }
+
+  void test_equal_invalidRight() {
+    EvaluationResult result = _getExpressionValue("2 == a");
+    expect(result.isValid, isFalse);
+  }
+
+  void test_equal_string_string() {
+    _assertValue(false, "'a' == 'b'");
+  }
+
+  void test_greaterThan_int_int() {
+    _assertValue(false, "2 > 3");
+  }
+
+  void test_greaterThanOrEqual_int_int() {
+    _assertValue(false, "2 >= 3");
+  }
+
+  void test_leftShift_int_int() {
+    _assertValue3(64, "16 << 2");
+  }
+
+  void test_lessThan_int_int() {
+    _assertValue(true, "2 < 3");
+  }
+
+  void test_lessThanOrEqual_int_int() {
+    _assertValue(true, "2 <= 3");
+  }
+
+  void test_literal_boolean_false() {
+    _assertValue(false, "false");
+  }
+
+  void test_literal_boolean_true() {
+    _assertValue(true, "true");
+  }
+
+  void test_literal_list() {
+    EvaluationResult result = _getExpressionValue("const ['a', 'b', 'c']");
+    expect(result.isValid, isTrue);
+  }
+
+  void test_literal_map() {
+    EvaluationResult result =
+        _getExpressionValue("const {'a' : 'm', 'b' : 'n', 'c' : 'o'}");
+    expect(result.isValid, isTrue);
+  }
+
+  void test_literal_null() {
+    EvaluationResult result = _getExpressionValue("null");
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value.isNull, isTrue);
+  }
+
+  void test_literal_number_double() {
+    _assertValue2(3.45, "3.45");
+  }
+
+  void test_literal_number_integer() {
+    _assertValue3(42, "42");
+  }
+
+  void test_literal_string_adjacent() {
+    _assertValue4("abcdef", "'abc' 'def'");
+  }
+
+  void test_literal_string_interpolation_invalid() {
+    EvaluationResult result = _getExpressionValue("'a\${f()}c'");
+    expect(result.isValid, isFalse);
+  }
+
+  void test_literal_string_interpolation_valid() {
+    _assertValue4("a3c", "'a\${3}c'");
+  }
+
+  void test_literal_string_simple() {
+    _assertValue4("abc", "'abc'");
+  }
+
+  void test_logicalAnd() {
+    _assertValue(false, "true && false");
+  }
+
+  void test_logicalNot() {
+    _assertValue(false, "!true");
+  }
+
+  void test_logicalOr() {
+    _assertValue(true, "true || false");
+  }
+
+  void test_minus_double_double() {
+    _assertValue2(3.2 - 2.3, "3.2 - 2.3");
+  }
+
+  void test_minus_int_int() {
+    _assertValue3(1, "3 - 2");
+  }
+
+  void test_negated_boolean() {
+    EvaluationResult result = _getExpressionValue("-true");
+    expect(result.isValid, isFalse);
+  }
+
+  void test_negated_double() {
+    _assertValue2(-42.3, "-42.3");
+  }
+
+  void test_negated_integer() {
+    _assertValue3(-42, "-42");
+  }
+
+  void test_notEqual_boolean_boolean() {
+    _assertValue(true, "true != false");
+  }
+
+  void test_notEqual_int_int() {
+    _assertValue(true, "2 != 3");
+  }
+
+  void test_notEqual_invalidLeft() {
+    EvaluationResult result = _getExpressionValue("a != 3");
+    expect(result.isValid, isFalse);
+  }
+
+  void test_notEqual_invalidRight() {
+    EvaluationResult result = _getExpressionValue("2 != a");
+    expect(result.isValid, isFalse);
+  }
+
+  void test_notEqual_string_string() {
+    _assertValue(true, "'a' != 'b'");
+  }
+
+  void test_parenthesizedExpression() {
+    _assertValue4("a", "('a')");
+  }
+
+  void test_plus_double_double() {
+    _assertValue2(2.3 + 3.2, "2.3 + 3.2");
+  }
+
+  void test_plus_int_int() {
+    _assertValue3(5, "2 + 3");
+  }
+
+  void test_plus_string_string() {
+    _assertValue4("ab", "'a' + 'b'");
+  }
+
+  void test_remainder_double_double() {
+    _assertValue2(3.2 % 2.3, "3.2 % 2.3");
+  }
+
+  void test_remainder_int_int() {
+    _assertValue3(2, "8 % 3");
+  }
+
+  void test_rightShift() {
+    _assertValue3(16, "64 >> 2");
+  }
+
+  void test_stringLength_complex() {
+    _assertValue3(6, "('qwe' + 'rty').length");
+  }
+
+  void test_stringLength_simple() {
+    _assertValue3(6, "'Dvorak'.length");
+  }
+
+  void test_times_double_double() {
+    _assertValue2(2.3 * 3.2, "2.3 * 3.2");
+  }
+
+  void test_times_int_int() {
+    _assertValue3(6, "2 * 3");
+  }
+
+  void test_truncatingDivide_double_double() {
+    _assertValue3(1, "3.2 ~/ 2.3");
+  }
+
+  void test_truncatingDivide_int_int() {
+    _assertValue3(3, "10 ~/ 3");
+  }
+
+  void _assertValue(bool expectedValue, String contents) {
+    EvaluationResult result = _getExpressionValue(contents);
+    DartObject value = result.value;
+    expect(value.type.name, "bool");
+    expect(value.boolValue, expectedValue);
+  }
+
+  void _assertValue2(double expectedValue, String contents) {
+    EvaluationResult result = _getExpressionValue(contents);
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value.type.name, "double");
+    expect(value.doubleValue, expectedValue);
+  }
+
+  void _assertValue3(int expectedValue, String contents) {
+    EvaluationResult result = _getExpressionValue(contents);
+    expect(result.isValid, isTrue);
+    DartObject value = result.value;
+    expect(value.type.name, "int");
+    expect(value.intValue, expectedValue);
+  }
+
+  void _assertValue4(String expectedValue, String contents) {
+    EvaluationResult result = _getExpressionValue(contents);
+    DartObject value = result.value;
+    expect(value, isNotNull);
+    ParameterizedType type = value.type;
+    expect(type, isNotNull);
+    expect(type.name, "String");
+    expect(value.stringValue, expectedValue);
+  }
+
+  EvaluationResult _getExpressionValue(String contents) {
+    Source source = addSource("var x = $contents;");
+    LibraryElement library = resolve2(source);
+    CompilationUnit unit =
+        analysisContext.resolveCompilationUnit(source, library);
+    expect(unit, isNotNull);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    expect(declarations, hasLength(1));
+    CompilationUnitMember declaration = declarations[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration,
+        TopLevelVariableDeclaration, declaration);
+    NodeList<VariableDeclaration> variables =
+        (declaration as TopLevelVariableDeclaration).variables.variables;
+    expect(variables, hasLength(1));
+    ConstantEvaluator evaluator =
+        new ConstantEvaluator(source, analysisContext.typeProvider);
+    return evaluator.evaluate(variables[0].initializer);
+  }
+}
+
+@reflectiveTest
+class ConstantFinderTest extends EngineTestCase {
+  AstNode _node;
+  TypeProvider _typeProvider;
+  AnalysisContext _context;
+  Source _source;
+
+  void setUp() {
+    super.setUp();
+    _typeProvider = new TestTypeProvider();
+    _context = new TestAnalysisContext();
+    _source = new TestSource();
+  }
+
+  /**
+   * Test an annotation that consists solely of an identifier (and hence
+   * represents a reference to a compile-time constant variable).
+   */
+  void test_visitAnnotation_constantVariable() {
+    _node = AstFactory.annotation(AstFactory.identifier3('x'));
+    expect(_findAnnotations(), contains(_node));
+  }
+
+  /**
+   * Test an annotation that represents the invocation of a constant
+   * constructor.
+   */
+  void test_visitAnnotation_invocation() {
+    _node = AstFactory.annotation2(
+        AstFactory.identifier3('A'), null, AstFactory.argumentList());
+    expect(_findAnnotations(), contains(_node));
+  }
+
+  void test_visitConstructorDeclaration_const() {
+    ConstructorElement element = _setupConstructorDeclaration("A", true);
+    expect(_findConstants(), contains(element));
+  }
+
+  void test_visitConstructorDeclaration_nonConst() {
+    _setupConstructorDeclaration("A", false);
+    expect(_findConstants(), isEmpty);
+  }
+
+  void test_visitVariableDeclaration_const() {
+    VariableElement element = _setupVariableDeclaration("v", true, true);
+    expect(_findConstants(), contains(element));
+  }
+
+  void test_visitVariableDeclaration_final_inClass() {
+    _setupFieldDeclaration('C', 'f', Keyword.FINAL);
+    expect(_findConstants(), isEmpty);
+  }
+
+  void test_visitVariableDeclaration_final_inClassWithConstConstructor() {
+    VariableDeclaration field = _setupFieldDeclaration('C', 'f', Keyword.FINAL,
+        hasConstConstructor: true);
+    expect(_findConstants(), contains(field.element));
+  }
+
+  void test_visitVariableDeclaration_final_outsideClass() {
+    _setupVariableDeclaration('v', false, true, isFinal: true);
+    expect(_findConstants(), isEmpty);
+  }
+
+  void test_visitVariableDeclaration_noInitializer() {
+    _setupVariableDeclaration("v", true, false);
+    expect(_findConstants(), isEmpty);
+  }
+
+  void test_visitVariableDeclaration_nonConst() {
+    _setupVariableDeclaration("v", false, true);
+    expect(_findConstants(), isEmpty);
+  }
+
+  void test_visitVariableDeclaration_static_const_inClass() {
+    VariableDeclaration field =
+        _setupFieldDeclaration('C', 'f', Keyword.CONST, isStatic: true);
+    expect(_findConstants(), contains(field.element));
+  }
+
+  void test_visitVariableDeclaration_static_const_inClassWithConstConstructor() {
+    VariableDeclaration field = _setupFieldDeclaration('C', 'f', Keyword.CONST,
+        isStatic: true, hasConstConstructor: true);
+    expect(_findConstants(), contains(field.element));
+  }
+
+  void test_visitVariableDeclaration_static_final_inClassWithConstConstructor() {
+    VariableDeclaration field = _setupFieldDeclaration('C', 'f', Keyword.FINAL,
+        isStatic: true, hasConstConstructor: true);
+    expect(_findConstants(), isNot(contains(field.element)));
+  }
+
+  void test_visitVariableDeclaration_uninitialized_final_inClassWithConstConstructor() {
+    VariableDeclaration field = _setupFieldDeclaration('C', 'f', Keyword.FINAL,
+        isInitialized: false, hasConstConstructor: true);
+    expect(_findConstants(), isNot(contains(field.element)));
+  }
+
+  void test_visitVariableDeclaration_uninitialized_static_const_inClass() {
+    _setupFieldDeclaration('C', 'f', Keyword.CONST,
+        isStatic: true, isInitialized: false);
+    expect(_findConstants(), isEmpty);
+  }
+
+  List<Annotation> _findAnnotations() {
+    Set<Annotation> annotations = new Set<Annotation>();
+    for (ConstantEvaluationTarget target in _findConstants()) {
+      if (target is ConstantEvaluationTarget_Annotation) {
+        expect(target.context, same(_context));
+        expect(target.source, same(_source));
+        annotations.add(target.annotation);
+      }
+    }
+    return new List<Annotation>.from(annotations);
+  }
+
+  Set<ConstantEvaluationTarget> _findConstants() {
+    ConstantFinder finder = new ConstantFinder(_context, _source, _source);
+    _node.accept(finder);
+    Set<ConstantEvaluationTarget> constants = finder.constantsToCompute;
+    expect(constants, isNotNull);
+    return constants;
+  }
+
+  ConstructorElement _setupConstructorDeclaration(String name, bool isConst) {
+    Keyword constKeyword = isConst ? Keyword.CONST : null;
+    ConstructorDeclaration constructorDeclaration = AstFactory
+        .constructorDeclaration2(
+            constKeyword,
+            null,
+            null,
+            name,
+            AstFactory.formalParameterList(),
+            null,
+            AstFactory.blockFunctionBody2());
+    ClassElement classElement = ElementFactory.classElement2(name);
+    ConstructorElement element =
+        ElementFactory.constructorElement(classElement, name, isConst);
+    constructorDeclaration.element = element;
+    _node = constructorDeclaration;
+    return element;
+  }
+
+  VariableDeclaration _setupFieldDeclaration(
+      String className, String fieldName, Keyword keyword,
+      {bool isInitialized: true,
+      bool isStatic: false,
+      bool hasConstConstructor: false}) {
+    VariableDeclaration variableDeclaration = isInitialized
+        ? AstFactory.variableDeclaration2(fieldName, AstFactory.integer(0))
+        : AstFactory.variableDeclaration(fieldName);
+    VariableElement fieldElement = ElementFactory.fieldElement(
+        fieldName,
+        isStatic,
+        keyword == Keyword.FINAL,
+        keyword == Keyword.CONST,
+        _typeProvider.intType);
+    variableDeclaration.name.staticElement = fieldElement;
+    FieldDeclaration fieldDeclaration = AstFactory.fieldDeclaration2(
+        isStatic, keyword, <VariableDeclaration>[variableDeclaration]);
+    ClassDeclaration classDeclaration =
+        AstFactory.classDeclaration(null, className, null, null, null, null);
+    classDeclaration.members.add(fieldDeclaration);
+    _node = classDeclaration;
+    ClassElementImpl classElement = ElementFactory.classElement2(className);
+    classElement.fields = <FieldElement>[fieldElement];
+    classDeclaration.name.staticElement = classElement;
+    if (hasConstConstructor) {
+      ConstructorDeclaration constructorDeclaration = AstFactory
+          .constructorDeclaration2(
+              Keyword.CONST,
+              null,
+              AstFactory.identifier3(className),
+              null,
+              AstFactory.formalParameterList(),
+              null,
+              AstFactory.blockFunctionBody2());
+      classDeclaration.members.add(constructorDeclaration);
+      ConstructorElement constructorElement =
+          ElementFactory.constructorElement(classElement, '', true);
+      constructorDeclaration.element = constructorElement;
+      classElement.constructors = <ConstructorElement>[constructorElement];
+    } else {
+      classElement.constructors = ConstructorElement.EMPTY_LIST;
+    }
+    return variableDeclaration;
+  }
+
+  VariableElement _setupVariableDeclaration(
+      String name, bool isConst, bool isInitialized,
+      {isFinal: false}) {
+    VariableDeclaration variableDeclaration = isInitialized
+        ? AstFactory.variableDeclaration2(name, AstFactory.integer(0))
+        : AstFactory.variableDeclaration(name);
+    SimpleIdentifier identifier = variableDeclaration.name;
+    VariableElement element = ElementFactory.localVariableElement(identifier);
+    identifier.staticElement = element;
+    Keyword keyword = isConst ? Keyword.CONST : isFinal ? Keyword.FINAL : null;
+    AstFactory.variableDeclarationList2(keyword, [variableDeclaration]);
+    _node = variableDeclaration;
+    return element;
+  }
+}
+
+@reflectiveTest
+class ConstantValueComputerTest extends ResolverTestCase {
+  void test_annotation_constConstructor() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+class A {
+  final int i;
+  const A(this.i);
+}
+
+class C {
+  @A(5)
+  f() {}
+}
+''');
+    EvaluationResultImpl result =
+        _evaluateAnnotation(compilationUnit, "C", "f");
+    Map<String, DartObjectImpl> annotationFields = _assertType(result, 'A');
+    _assertIntField(annotationFields, 'i', 5);
+  }
+
+  void test_annotation_constConstructor_named() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+class A {
+  final int i;
+  const A.named(this.i);
+}
+
+class C {
+  @A.named(5)
+  f() {}
+}
+''');
+    EvaluationResultImpl result =
+        _evaluateAnnotation(compilationUnit, "C", "f");
+    Map<String, DartObjectImpl> annotationFields = _assertType(result, 'A');
+    _assertIntField(annotationFields, 'i', 5);
+  }
+
+  void test_annotation_constConstructor_noArgs() {
+    // Failing to pass arguments to an annotation which is a constant
+    // constructor is illegal, but shouldn't crash analysis.
+    CompilationUnit compilationUnit = resolveSource(r'''
+class A {
+  final int i;
+  const A(this.i);
+}
+
+class C {
+  @A
+  f() {}
+}
+''');
+    _evaluateAnnotation(compilationUnit, "C", "f");
+  }
+
+  void test_annotation_constConstructor_noArgs_named() {
+    // Failing to pass arguments to an annotation which is a constant
+    // constructor is illegal, but shouldn't crash analysis.
+    CompilationUnit compilationUnit = resolveSource(r'''
+class A {
+  final int i;
+  const A.named(this.i);
+}
+
+class C {
+  @A.named
+  f() {}
+}
+''');
+    _evaluateAnnotation(compilationUnit, "C", "f");
+  }
+
+  void test_annotation_nonConstConstructor() {
+    // Calling a non-const constructor from an annotation that is illegal, but
+    // shouldn't crash analysis.
+    CompilationUnit compilationUnit = resolveSource(r'''
+class A {
+  final int i;
+  A(this.i);
+}
+
+class C {
+  @A(5)
+  f() {}
+}
+''');
+    _evaluateAnnotation(compilationUnit, "C", "f");
+  }
+
+  void test_annotation_staticConst() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+class C {
+  static const int i = 5;
+
+  @i
+  f() {}
+}
+''');
+    EvaluationResultImpl result =
+        _evaluateAnnotation(compilationUnit, "C", "f");
+    expect(_assertValidInt(result), 5);
+  }
+
+  void test_annotation_staticConst_args() {
+    // Applying arguments to an annotation that is a static const is
+    // illegal, but shouldn't crash analysis.
+    CompilationUnit compilationUnit = resolveSource(r'''
+class C {
+  static const int i = 5;
+
+  @i(1)
+  f() {}
+}
+''');
+    _evaluateAnnotation(compilationUnit, "C", "f");
+  }
+
+  void test_annotation_staticConst_otherClass() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+class A {
+  static const int i = 5;
+}
+
+class C {
+  @A.i
+  f() {}
+}
+''');
+    EvaluationResultImpl result =
+        _evaluateAnnotation(compilationUnit, "C", "f");
+    expect(_assertValidInt(result), 5);
+  }
+
+  void test_annotation_staticConst_otherClass_args() {
+    // Applying arguments to an annotation that is a static const is
+    // illegal, but shouldn't crash analysis.
+    CompilationUnit compilationUnit = resolveSource(r'''
+class A {
+  static const int i = 5;
+}
+
+class C {
+  @A.i(1)
+  f() {}
+}
+''');
+    _evaluateAnnotation(compilationUnit, "C", "f");
+  }
+
+  void test_annotation_toplevelVariable() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+const int i = 5;
+class C {
+  @i
+  f() {}
+}
+''');
+    EvaluationResultImpl result =
+        _evaluateAnnotation(compilationUnit, "C", "f");
+    expect(_assertValidInt(result), 5);
+  }
+
+  void test_annotation_toplevelVariable_args() {
+    // Applying arguments to an annotation that is a toplevel variable is
+    // illegal, but shouldn't crash analysis.
+    CompilationUnit compilationUnit = resolveSource(r'''
+const int i = 5;
+class C {
+  @i(1)
+  f() {}
+}
+''');
+    _evaluateAnnotation(compilationUnit, "C", "f");
+  }
+
+  void test_computeValues_cycle() {
+    TestLogger logger = new TestLogger();
+    AnalysisEngine.instance.logger = logger;
+    Source librarySource = addSource(r'''
+const int a = c;
+const int b = a;
+const int c = b;''');
+    LibraryElement libraryElement = resolve2(librarySource);
+    CompilationUnit unit =
+        analysisContext.resolveCompilationUnit(librarySource, libraryElement);
+    analysisContext.computeErrors(librarySource);
+    expect(unit, isNotNull);
+    ConstantValueComputer computer = _makeConstantValueComputer();
+    computer.add(unit, librarySource, librarySource);
+    computer.computeValues();
+    NodeList<CompilationUnitMember> members = unit.declarations;
+    expect(members, hasLength(3));
+    _validate(false, (members[0] as TopLevelVariableDeclaration).variables);
+    _validate(false, (members[1] as TopLevelVariableDeclaration).variables);
+    _validate(false, (members[2] as TopLevelVariableDeclaration).variables);
+  }
+
+  void test_computeValues_dependentVariables() {
+    Source librarySource = addSource(r'''
+const int b = a;
+const int a = 0;''');
+    LibraryElement libraryElement = resolve2(librarySource);
+    CompilationUnit unit =
+        analysisContext.resolveCompilationUnit(librarySource, libraryElement);
+    expect(unit, isNotNull);
+    ConstantValueComputer computer = _makeConstantValueComputer();
+    computer.add(unit, librarySource, librarySource);
+    computer.computeValues();
+    NodeList<CompilationUnitMember> members = unit.declarations;
+    expect(members, hasLength(2));
+    _validate(true, (members[0] as TopLevelVariableDeclaration).variables);
+    _validate(true, (members[1] as TopLevelVariableDeclaration).variables);
+  }
+
+  void test_computeValues_empty() {
+    ConstantValueComputer computer = _makeConstantValueComputer();
+    computer.computeValues();
+  }
+
+  void test_computeValues_multipleSources() {
+    Source librarySource = addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+part 'part.dart';
+const int c = b;
+const int a = 0;''');
+    Source partSource = addNamedSource(
+        "/part.dart",
+        r'''
+part of lib;
+const int b = a;
+const int d = c;''');
+    LibraryElement libraryElement = resolve2(librarySource);
+    CompilationUnit libraryUnit =
+        analysisContext.resolveCompilationUnit(librarySource, libraryElement);
+    expect(libraryUnit, isNotNull);
+    CompilationUnit partUnit =
+        analysisContext.resolveCompilationUnit(partSource, libraryElement);
+    expect(partUnit, isNotNull);
+    ConstantValueComputer computer = _makeConstantValueComputer();
+    computer.add(libraryUnit, librarySource, librarySource);
+    computer.add(partUnit, partSource, librarySource);
+    computer.computeValues();
+    NodeList<CompilationUnitMember> libraryMembers = libraryUnit.declarations;
+    expect(libraryMembers, hasLength(2));
+    _validate(
+        true, (libraryMembers[0] as TopLevelVariableDeclaration).variables);
+    _validate(
+        true, (libraryMembers[1] as TopLevelVariableDeclaration).variables);
+    NodeList<CompilationUnitMember> partMembers = libraryUnit.declarations;
+    expect(partMembers, hasLength(2));
+    _validate(true, (partMembers[0] as TopLevelVariableDeclaration).variables);
+    _validate(true, (partMembers[1] as TopLevelVariableDeclaration).variables);
+  }
+
+  void test_computeValues_singleVariable() {
+    Source librarySource = addSource("const int a = 0;");
+    LibraryElement libraryElement = resolve2(librarySource);
+    CompilationUnit unit =
+        analysisContext.resolveCompilationUnit(librarySource, libraryElement);
+    expect(unit, isNotNull);
+    ConstantValueComputer computer = _makeConstantValueComputer();
+    computer.add(unit, librarySource, librarySource);
+    computer.computeValues();
+    NodeList<CompilationUnitMember> members = unit.declarations;
+    expect(members, hasLength(1));
+    _validate(true, (members[0] as TopLevelVariableDeclaration).variables);
+  }
+
+  void test_computeValues_value_depends_on_enum() {
+    Source librarySource = addSource('''
+enum E { id0, id1 }
+const E e = E.id0;
+''');
+    LibraryElement libraryElement = resolve2(librarySource);
+    CompilationUnit unit =
+        analysisContext.resolveCompilationUnit(librarySource, libraryElement);
+    expect(unit, isNotNull);
+    ConstantValueComputer computer = _makeConstantValueComputer();
+    computer.add(unit, librarySource, librarySource);
+    computer.computeValues();
+    TopLevelVariableDeclaration declaration = unit.declarations
+        .firstWhere((member) => member is TopLevelVariableDeclaration);
+    _validate(true, declaration.variables);
+  }
+
+  void test_dependencyOnConstructor() {
+    // x depends on "const A()"
+    _assertProperDependencies(r'''
+class A {
+  const A();
+}
+const x = const A();''');
+  }
+
+  void test_dependencyOnConstructorArgument() {
+    // "const A(x)" depends on x
+    _assertProperDependencies(r'''
+class A {
+  const A(this.next);
+  final A next;
+}
+const A x = const A(null);
+const A y = const A(x);''');
+  }
+
+  void test_dependencyOnConstructorArgument_unresolvedConstructor() {
+    // "const A.a(x)" depends on x even if the constructor A.a can't be found.
+    _assertProperDependencies(
+        r'''
+class A {
+}
+const int x = 1;
+const A y = const A.a(x);''',
+        [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR]);
+  }
+
+  void test_dependencyOnConstructorInitializer() {
+    // "const A()" depends on x
+    _assertProperDependencies(r'''
+const int x = 1;
+class A {
+  const A() : v = x;
+  final int v;
+}''');
+  }
+
+  void test_dependencyOnExplicitSuperConstructor() {
+    // b depends on B() depends on A()
+    _assertProperDependencies(r'''
+class A {
+  const A(this.x);
+  final int x;
+}
+class B extends A {
+  const B() : super(5);
+}
+const B b = const B();''');
+  }
+
+  void test_dependencyOnExplicitSuperConstructorParameters() {
+    // b depends on B() depends on i
+    _assertProperDependencies(r'''
+class A {
+  const A(this.x);
+  final int x;
+}
+class B extends A {
+  const B() : super(i);
+}
+const B b = const B();
+const int i = 5;''');
+  }
+
+  void test_dependencyOnFactoryRedirect() {
+    // a depends on A.foo() depends on A.bar()
+    _assertProperDependencies(r'''
+const A a = const A.foo();
+class A {
+  factory const A.foo() = A.bar;
+  const A.bar();
+}''');
+  }
+
+  void test_dependencyOnFactoryRedirectWithTypeParams() {
+    _assertProperDependencies(r'''
+class A {
+  const factory A(var a) = B<int>;
+}
+
+class B<T> implements A {
+  final T x;
+  const B(this.x);
+}
+
+const A a = const A(10);''');
+  }
+
+  void test_dependencyOnImplicitSuperConstructor() {
+    // b depends on B() depends on A()
+    _assertProperDependencies(r'''
+class A {
+  const A() : x = 5;
+  final int x;
+}
+class B extends A {
+  const B();
+}
+const B b = const B();''');
+  }
+
+  void test_dependencyOnInitializedFinal() {
+    // a depends on A() depends on A.x
+    _assertProperDependencies('''
+class A {
+  const A();
+  final int x = 1;
+}
+const A a = const A();
+''');
+  }
+
+  void test_dependencyOnInitializedNonStaticConst() {
+    // Even though non-static consts are not allowed by the language, we need
+    // to handle them for error recovery purposes.
+    // a depends on A() depends on A.x
+    _assertProperDependencies(
+        '''
+class A {
+  const A();
+  const int x = 1;
+}
+const A a = const A();
+''',
+        [CompileTimeErrorCode.CONST_INSTANCE_FIELD]);
+  }
+
+  void test_dependencyOnNonFactoryRedirect() {
+    // a depends on A.foo() depends on A.bar()
+    _assertProperDependencies(r'''
+const A a = const A.foo();
+class A {
+  const A.foo() : this.bar();
+  const A.bar();
+}''');
+  }
+
+  void test_dependencyOnNonFactoryRedirect_arg() {
+    // a depends on A.foo() depends on b
+    _assertProperDependencies(r'''
+const A a = const A.foo();
+const int b = 1;
+class A {
+  const A.foo() : this.bar(b);
+  const A.bar(x) : y = x;
+  final int y;
+}''');
+  }
+
+  void test_dependencyOnNonFactoryRedirect_defaultValue() {
+    // a depends on A.foo() depends on A.bar() depends on b
+    _assertProperDependencies(r'''
+const A a = const A.foo();
+const int b = 1;
+class A {
+  const A.foo() : this.bar();
+  const A.bar([x = b]) : y = x;
+  final int y;
+}''');
+  }
+
+  void test_dependencyOnNonFactoryRedirect_toMissing() {
+    // a depends on A.foo() which depends on nothing, since A.bar() is
+    // missing.
+    _assertProperDependencies(
+        r'''
+const A a = const A.foo();
+class A {
+  const A.foo() : this.bar();
+}''',
+        [CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR]);
+  }
+
+  void test_dependencyOnNonFactoryRedirect_toNonConst() {
+    // a depends on A.foo() which depends on nothing, since A.bar() is
+    // non-const.
+    _assertProperDependencies(r'''
+const A a = const A.foo();
+class A {
+  const A.foo() : this.bar();
+  A.bar();
+}''');
+  }
+
+  void test_dependencyOnNonFactoryRedirect_unnamed() {
+    // a depends on A.foo() depends on A()
+    _assertProperDependencies(r'''
+const A a = const A.foo();
+class A {
+  const A.foo() : this();
+  const A();
+}''');
+  }
+
+  void test_dependencyOnOptionalParameterDefault() {
+    // a depends on A() depends on B()
+    _assertProperDependencies(r'''
+class A {
+  const A([x = const B()]) : b = x;
+  final B b;
+}
+class B {
+  const B();
+}
+const A a = const A();''');
+  }
+
+  void test_dependencyOnVariable() {
+    // x depends on y
+    _assertProperDependencies(r'''
+const x = y + 1;
+const y = 2;''');
+  }
+
+  void test_final_initialized_at_declaration() {
+    CompilationUnit compilationUnit = resolveSource('''
+class A {
+  final int i = 123;
+  const A();
+}
+
+const A a = const A();
+''');
+    EvaluationResultImpl result =
+        _evaluateTopLevelVariable(compilationUnit, 'a');
+    Map<String, DartObjectImpl> fields = _assertType(result, "A");
+    expect(fields, hasLength(1));
+    _assertIntField(fields, "i", 123);
+  }
+
+  void test_fromEnvironment_bool_default_false() {
+    expect(_assertValidBool(_check_fromEnvironment_bool(null, "false")), false);
+  }
+
+  void test_fromEnvironment_bool_default_overridden() {
+    expect(
+        _assertValidBool(_check_fromEnvironment_bool("false", "true")), false);
+  }
+
+  void test_fromEnvironment_bool_default_parseError() {
+    expect(_assertValidBool(_check_fromEnvironment_bool("parseError", "true")),
+        true);
+  }
+
+  void test_fromEnvironment_bool_default_true() {
+    expect(_assertValidBool(_check_fromEnvironment_bool(null, "true")), true);
+  }
+
+  void test_fromEnvironment_bool_false() {
+    expect(_assertValidBool(_check_fromEnvironment_bool("false", null)), false);
+  }
+
+  void test_fromEnvironment_bool_parseError() {
+    expect(_assertValidBool(_check_fromEnvironment_bool("parseError", null)),
+        false);
+  }
+
+  void test_fromEnvironment_bool_true() {
+    expect(_assertValidBool(_check_fromEnvironment_bool("true", null)), true);
+  }
+
+  void test_fromEnvironment_bool_undeclared() {
+    _assertValidUnknown(_check_fromEnvironment_bool(null, null));
+  }
+
+  void test_fromEnvironment_int_default_overridden() {
+    expect(_assertValidInt(_check_fromEnvironment_int("234", "123")), 234);
+  }
+
+  void test_fromEnvironment_int_default_parseError() {
+    expect(
+        _assertValidInt(_check_fromEnvironment_int("parseError", "123")), 123);
+  }
+
+  void test_fromEnvironment_int_default_undeclared() {
+    expect(_assertValidInt(_check_fromEnvironment_int(null, "123")), 123);
+  }
+
+  void test_fromEnvironment_int_ok() {
+    expect(_assertValidInt(_check_fromEnvironment_int("234", null)), 234);
+  }
+
+  void test_fromEnvironment_int_parseError() {
+    _assertValidNull(_check_fromEnvironment_int("parseError", null));
+  }
+
+  void test_fromEnvironment_int_parseError_nullDefault() {
+    _assertValidNull(_check_fromEnvironment_int("parseError", "null"));
+  }
+
+  void test_fromEnvironment_int_undeclared() {
+    _assertValidUnknown(_check_fromEnvironment_int(null, null));
+  }
+
+  void test_fromEnvironment_int_undeclared_nullDefault() {
+    _assertValidNull(_check_fromEnvironment_int(null, "null"));
+  }
+
+  void test_fromEnvironment_string_default_overridden() {
+    expect(_assertValidString(_check_fromEnvironment_string("abc", "'def'")),
+        "abc");
+  }
+
+  void test_fromEnvironment_string_default_undeclared() {
+    expect(_assertValidString(_check_fromEnvironment_string(null, "'def'")),
+        "def");
+  }
+
+  void test_fromEnvironment_string_empty() {
+    expect(_assertValidString(_check_fromEnvironment_string("", null)), "");
+  }
+
+  void test_fromEnvironment_string_ok() {
+    expect(
+        _assertValidString(_check_fromEnvironment_string("abc", null)), "abc");
+  }
+
+  void test_fromEnvironment_string_undeclared() {
+    _assertValidUnknown(_check_fromEnvironment_string(null, null));
+  }
+
+  void test_fromEnvironment_string_undeclared_nullDefault() {
+    _assertValidNull(_check_fromEnvironment_string(null, "null"));
+  }
+
+  void test_instanceCreationExpression_computedField() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A(4, 5);
+class A {
+  const A(int i, int j) : k = 2 * i + j;
+  final int k;
+}''');
+    EvaluationResultImpl result =
+        _evaluateTopLevelVariable(compilationUnit, "foo");
+    Map<String, DartObjectImpl> fields = _assertType(result, "A");
+    expect(fields, hasLength(1));
+    _assertIntField(fields, "k", 13);
+  }
+
+  void test_instanceCreationExpression_computedField_namedOptionalWithDefault() {
+    _checkInstanceCreationOptionalParams(false, true, true);
+  }
+
+  void test_instanceCreationExpression_computedField_namedOptionalWithoutDefault() {
+    _checkInstanceCreationOptionalParams(false, true, false);
+  }
+
+  void test_instanceCreationExpression_computedField_unnamedOptionalWithDefault() {
+    _checkInstanceCreationOptionalParams(false, false, true);
+  }
+
+  void test_instanceCreationExpression_computedField_unnamedOptionalWithoutDefault() {
+    _checkInstanceCreationOptionalParams(false, false, false);
+  }
+
+  void test_instanceCreationExpression_computedField_usesConstConstructor() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A(3);
+class A {
+  const A(int i) : b = const B(4);
+  final int b;
+}
+class B {
+  const B(this.k);
+  final int k;
+}''');
+    EvaluationResultImpl result =
+        _evaluateTopLevelVariable(compilationUnit, "foo");
+    Map<String, DartObjectImpl> fieldsOfA = _assertType(result, "A");
+    expect(fieldsOfA, hasLength(1));
+    Map<String, DartObjectImpl> fieldsOfB =
+        _assertFieldType(fieldsOfA, "b", "B");
+    expect(fieldsOfB, hasLength(1));
+    _assertIntField(fieldsOfB, "k", 4);
+  }
+
+  void test_instanceCreationExpression_computedField_usesStaticConst() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A(3);
+class A {
+  const A(int i) : k = i + B.bar;
+  final int k;
+}
+class B {
+  static const bar = 4;
+}''');
+    EvaluationResultImpl result =
+        _evaluateTopLevelVariable(compilationUnit, "foo");
+    Map<String, DartObjectImpl> fields = _assertType(result, "A");
+    expect(fields, hasLength(1));
+    _assertIntField(fields, "k", 7);
+  }
+
+  void test_instanceCreationExpression_computedField_usesToplevelConst() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A(3);
+const bar = 4;
+class A {
+  const A(int i) : k = i + bar;
+  final int k;
+}''');
+    EvaluationResultImpl result =
+        _evaluateTopLevelVariable(compilationUnit, "foo");
+    Map<String, DartObjectImpl> fields = _assertType(result, "A");
+    expect(fields, hasLength(1));
+    _assertIntField(fields, "k", 7);
+  }
+
+  void test_instanceCreationExpression_explicitSuper() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const B(4, 5);
+class A {
+  const A(this.x);
+  final int x;
+}
+class B extends A {
+  const B(int x, this.y) : super(x * 2);
+  final int y;
+}''');
+    EvaluationResultImpl result =
+        _evaluateTopLevelVariable(compilationUnit, "foo");
+    Map<String, DartObjectImpl> fields = _assertType(result, "B");
+    expect(fields, hasLength(2));
+    _assertIntField(fields, "y", 5);
+    Map<String, DartObjectImpl> superclassFields =
+        _assertFieldType(fields, GenericState.SUPERCLASS_FIELD, "A");
+    expect(superclassFields, hasLength(1));
+    _assertIntField(superclassFields, "x", 8);
+  }
+
+  void test_instanceCreationExpression_fieldFormalParameter() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A(42);
+class A {
+  int x;
+  const A(this.x)
+}''');
+    EvaluationResultImpl result =
+        _evaluateTopLevelVariable(compilationUnit, "foo");
+    Map<String, DartObjectImpl> fields = _assertType(result, "A");
+    expect(fields, hasLength(1));
+    _assertIntField(fields, "x", 42);
+  }
+
+  void test_instanceCreationExpression_fieldFormalParameter_namedOptionalWithDefault() {
+    _checkInstanceCreationOptionalParams(true, true, true);
+  }
+
+  void test_instanceCreationExpression_fieldFormalParameter_namedOptionalWithoutDefault() {
+    _checkInstanceCreationOptionalParams(true, true, false);
+  }
+
+  void test_instanceCreationExpression_fieldFormalParameter_unnamedOptionalWithDefault() {
+    _checkInstanceCreationOptionalParams(true, false, true);
+  }
+
+  void test_instanceCreationExpression_fieldFormalParameter_unnamedOptionalWithoutDefault() {
+    _checkInstanceCreationOptionalParams(true, false, false);
+  }
+
+  void test_instanceCreationExpression_implicitSuper() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const B(4);
+class A {
+  const A() : x = 3;
+  final int x;
+}
+class B extends A {
+  const B(this.y);
+  final int y;
+}''');
+    EvaluationResultImpl result =
+        _evaluateTopLevelVariable(compilationUnit, "foo");
+    Map<String, DartObjectImpl> fields = _assertType(result, "B");
+    expect(fields, hasLength(2));
+    _assertIntField(fields, "y", 4);
+    Map<String, DartObjectImpl> superclassFields =
+        _assertFieldType(fields, GenericState.SUPERCLASS_FIELD, "A");
+    expect(superclassFields, hasLength(1));
+    _assertIntField(superclassFields, "x", 3);
+  }
+
+  void test_instanceCreationExpression_nonFactoryRedirect() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A.a1();
+class A {
+  const A.a1() : this.a2();
+  const A.a2() : x = 5;
+  final int x;
+}''');
+    Map<String, DartObjectImpl> aFields =
+        _assertType(_evaluateTopLevelVariable(compilationUnit, "foo"), "A");
+    _assertIntField(aFields, 'x', 5);
+  }
+
+  void test_instanceCreationExpression_nonFactoryRedirect_arg() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A.a1(1);
+class A {
+  const A.a1(x) : this.a2(x + 100);
+  const A.a2(x) : y = x + 10;
+  final int y;
+}''');
+    Map<String, DartObjectImpl> aFields =
+        _assertType(_evaluateTopLevelVariable(compilationUnit, "foo"), "A");
+    _assertIntField(aFields, 'y', 111);
+  }
+
+  void test_instanceCreationExpression_nonFactoryRedirect_cycle() {
+    // It is an error to have a cycle in non-factory redirects; however, we
+    // need to make sure that even if the error occurs, attempting to evaluate
+    // the constant will terminate.
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A();
+class A {
+  const A() : this.b();
+  const A.b() : this();
+}''');
+    _assertValidUnknown(_evaluateTopLevelVariable(compilationUnit, "foo"));
+  }
+
+  void test_instanceCreationExpression_nonFactoryRedirect_defaultArg() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A.a1();
+class A {
+  const A.a1() : this.a2();
+  const A.a2([x = 100]) : y = x + 10;
+  final int y;
+}''');
+    Map<String, DartObjectImpl> aFields =
+        _assertType(_evaluateTopLevelVariable(compilationUnit, "foo"), "A");
+    _assertIntField(aFields, 'y', 110);
+  }
+
+  void test_instanceCreationExpression_nonFactoryRedirect_toMissing() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A.a1();
+class A {
+  const A.a1() : this.a2();
+}''');
+    // We don't care what value foo evaluates to (since there is a compile
+    // error), but we shouldn't crash, and we should figure
+    // out that it evaluates to an instance of class A.
+    _assertType(_evaluateTopLevelVariable(compilationUnit, "foo"), "A");
+  }
+
+  void test_instanceCreationExpression_nonFactoryRedirect_toNonConst() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A.a1();
+class A {
+  const A.a1() : this.a2();
+  A.a2();
+}''');
+    // We don't care what value foo evaluates to (since there is a compile
+    // error), but we shouldn't crash, and we should figure
+    // out that it evaluates to an instance of class A.
+    _assertType(_evaluateTopLevelVariable(compilationUnit, "foo"), "A");
+  }
+
+  void test_instanceCreationExpression_nonFactoryRedirect_unnamed() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A.a1();
+class A {
+  const A.a1() : this();
+  const A() : x = 5;
+  final int x;
+}''');
+    Map<String, DartObjectImpl> aFields =
+        _assertType(_evaluateTopLevelVariable(compilationUnit, "foo"), "A");
+    _assertIntField(aFields, 'x', 5);
+  }
+
+  void test_instanceCreationExpression_redirect() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A();
+class A {
+  const factory A() = B;
+}
+class B implements A {
+  const B();
+}''');
+    _assertType(_evaluateTopLevelVariable(compilationUnit, "foo"), "B");
+  }
+
+  void test_instanceCreationExpression_redirect_cycle() {
+    // It is an error to have a cycle in factory redirects; however, we need
+    // to make sure that even if the error occurs, attempting to evaluate the
+    // constant will terminate.
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A();
+class A {
+  const factory A() = A.b;
+  const factory A.b() = A;
+}''');
+    _assertValidUnknown(_evaluateTopLevelVariable(compilationUnit, "foo"));
+  }
+
+  void test_instanceCreationExpression_redirect_extern() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A();
+class A {
+  external const factory A();
+}''');
+    _assertValidUnknown(_evaluateTopLevelVariable(compilationUnit, "foo"));
+  }
+
+  void test_instanceCreationExpression_redirect_nonConst() {
+    // It is an error for a const factory constructor redirect to a non-const
+    // constructor; however, we need to make sure that even if the error
+    // attempting to evaluate the constant won't cause a crash.
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A();
+class A {
+  const factory A() = A.b;
+  A.b();
+}''');
+    _assertValidUnknown(_evaluateTopLevelVariable(compilationUnit, "foo"));
+  }
+
+  void test_instanceCreationExpression_redirectWithTypeParams() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+class A {
+  const factory A(var a) = B<int>;
+}
+
+class B<T> implements A {
+  final T x;
+  const B(this.x);
+}
+
+const A a = const A(10);''');
+    EvaluationResultImpl result =
+        _evaluateTopLevelVariable(compilationUnit, "a");
+    Map<String, DartObjectImpl> fields = _assertType(result, "B<int>");
+    expect(fields, hasLength(1));
+    _assertIntField(fields, "x", 10);
+  }
+
+  void test_instanceCreationExpression_redirectWithTypeSubstitution() {
+    // To evaluate the redirection of A<int>,
+    // A's template argument (T=int) must be substituted
+    // into B's template argument (B<U> where U=T) to get B<int>.
+    CompilationUnit compilationUnit = resolveSource(r'''
+class A<T> {
+  const factory A(var a) = B<T>;
+}
+
+class B<U> implements A {
+  final U x;
+  const B(this.x);
+}
+
+const A<int> a = const A<int>(10);''');
+    EvaluationResultImpl result =
+        _evaluateTopLevelVariable(compilationUnit, "a");
+    Map<String, DartObjectImpl> fields = _assertType(result, "B<int>");
+    expect(fields, hasLength(1));
+    _assertIntField(fields, "x", 10);
+  }
+
+  void test_instanceCreationExpression_symbol() {
+    CompilationUnit compilationUnit =
+        resolveSource("const foo = const Symbol('a');");
+    EvaluationResultImpl evaluationResult =
+        _evaluateTopLevelVariable(compilationUnit, "foo");
+    expect(evaluationResult.value, isNotNull);
+    DartObjectImpl value = evaluationResult.value;
+    expect(value.type, typeProvider.symbolType);
+    expect(value.value, "a");
+  }
+
+  void test_instanceCreationExpression_withSupertypeParams_explicit() {
+    _checkInstanceCreation_withSupertypeParams(true);
+  }
+
+  void test_instanceCreationExpression_withSupertypeParams_implicit() {
+    _checkInstanceCreation_withSupertypeParams(false);
+  }
+
+  void test_instanceCreationExpression_withTypeParams() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+class C<E> {
+  const C();
+}
+const c_int = const C<int>();
+const c_num = const C<num>();''');
+    EvaluationResultImpl c_int =
+        _evaluateTopLevelVariable(compilationUnit, "c_int");
+    _assertType(c_int, "C<int>");
+    DartObjectImpl c_int_value = c_int.value;
+    EvaluationResultImpl c_num =
+        _evaluateTopLevelVariable(compilationUnit, "c_num");
+    _assertType(c_num, "C<num>");
+    DartObjectImpl c_num_value = c_num.value;
+    expect(c_int_value == c_num_value, isFalse);
+  }
+
+  void test_isValidSymbol() {
+    expect(ConstantEvaluationEngine.isValidPublicSymbol(""), isTrue);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo"), isTrue);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo.bar"), isTrue);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo\$"), isTrue);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo\$bar"), isTrue);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("iff"), isTrue);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("gif"), isTrue);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("if\$"), isTrue);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("\$if"), isTrue);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo="), isTrue);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo.bar="), isTrue);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo.+"), isTrue);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("void"), isTrue);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("_foo"), isFalse);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("_foo.bar"), isFalse);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo._bar"), isFalse);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("if"), isFalse);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("if.foo"), isFalse);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo.if"), isFalse);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo=.bar"), isFalse);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo."), isFalse);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("+.foo"), isFalse);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("void.foo"), isFalse);
+    expect(ConstantEvaluationEngine.isValidPublicSymbol("foo.void"), isFalse);
+  }
+
+  void test_length_of_improperly_typed_string_expression() {
+    // Since type annotations are ignored in unchecked mode, the improper
+    // types on s1 and s2 shouldn't prevent us from evaluating i to
+    // 'alpha'.length.
+    CompilationUnit compilationUnit = resolveSource('''
+const int s1 = 'alpha';
+const int s2 = 'beta';
+const int i = (true ? s1 : s2).length;
+''');
+    ConstTopLevelVariableElementImpl element =
+        findTopLevelDeclaration(compilationUnit, 'i').element;
+    EvaluationResultImpl result = element.evaluationResult;
+    expect(_assertValidInt(result), 5);
+  }
+
+  void test_length_of_improperly_typed_string_identifier() {
+    // Since type annotations are ignored in unchecked mode, the improper type
+    // on s shouldn't prevent us from evaluating i to 'alpha'.length.
+    CompilationUnit compilationUnit = resolveSource('''
+const int s = 'alpha';
+const int i = s.length;
+''');
+    ConstTopLevelVariableElementImpl element =
+        findTopLevelDeclaration(compilationUnit, 'i').element;
+    EvaluationResultImpl result = element.evaluationResult;
+    expect(_assertValidInt(result), 5);
+  }
+
+  void test_non_static_const_initialized_at_declaration() {
+    // Even though non-static consts are not allowed by the language, we need
+    // to handle them for error recovery purposes.
+    CompilationUnit compilationUnit = resolveSource('''
+class A {
+  const int i = 123;
+  const A();
+}
+
+const A a = const A();
+''');
+    EvaluationResultImpl result =
+        _evaluateTopLevelVariable(compilationUnit, 'a');
+    Map<String, DartObjectImpl> fields = _assertType(result, "A");
+    expect(fields, hasLength(1));
+    _assertIntField(fields, "i", 123);
+  }
+
+  void test_symbolLiteral_void() {
+    CompilationUnit compilationUnit =
+        resolveSource("const voidSymbol = #void;");
+    VariableDeclaration voidSymbol =
+        findTopLevelDeclaration(compilationUnit, "voidSymbol");
+    EvaluationResultImpl voidSymbolResult =
+        (voidSymbol.element as VariableElementImpl).evaluationResult;
+    DartObjectImpl value = voidSymbolResult.value;
+    expect(value.type, typeProvider.symbolType);
+    expect(value.value, "void");
+  }
+
+  Map<String, DartObjectImpl> _assertFieldType(
+      Map<String, DartObjectImpl> fields,
+      String fieldName,
+      String expectedType) {
+    DartObjectImpl field = fields[fieldName];
+    expect(field.type.displayName, expectedType);
+    return field.fields;
+  }
+
+  void _assertIntField(
+      Map<String, DartObjectImpl> fields, String fieldName, int expectedValue) {
+    DartObjectImpl field = fields[fieldName];
+    expect(field.type.name, "int");
+    expect(field.intValue, expectedValue);
+  }
+
+  void _assertNullField(Map<String, DartObjectImpl> fields, String fieldName) {
+    DartObjectImpl field = fields[fieldName];
+    expect(field.isNull, isTrue);
+  }
+
+  void _assertProperDependencies(String sourceText,
+      [List<ErrorCode> expectedErrorCodes = ErrorCode.EMPTY_LIST]) {
+    Source source = addSource(sourceText);
+    LibraryElement element = resolve2(source);
+    CompilationUnit unit =
+        analysisContext.resolveCompilationUnit(source, element);
+    expect(unit, isNotNull);
+    ConstantValueComputer computer = _makeConstantValueComputer();
+    computer.add(unit, source, source);
+    computer.computeValues();
+    assertErrors(source, expectedErrorCodes);
+  }
+
+  Map<String, DartObjectImpl> _assertType(
+      EvaluationResultImpl result, String typeName) {
+    expect(result.value, isNotNull);
+    DartObjectImpl value = result.value;
+    expect(value.type.displayName, typeName);
+    return value.fields;
+  }
+
+  bool _assertValidBool(EvaluationResultImpl result) {
+    expect(result.value, isNotNull);
+    DartObjectImpl value = result.value;
+    expect(value.type, typeProvider.boolType);
+    bool boolValue = value.boolValue;
+    expect(boolValue, isNotNull);
+    return boolValue;
+  }
+
+  int _assertValidInt(EvaluationResultImpl result) {
+    expect(result.value, isNotNull);
+    DartObjectImpl value = result.value;
+    expect(value.type, typeProvider.intType);
+    return value.intValue;
+  }
+
+  void _assertValidNull(EvaluationResultImpl result) {
+    expect(result.value, isNotNull);
+    DartObjectImpl value = result.value;
+    expect(value.type, typeProvider.nullType);
+  }
+
+  String _assertValidString(EvaluationResultImpl result) {
+    expect(result.value, isNotNull);
+    DartObjectImpl value = result.value;
+    expect(value.type, typeProvider.stringType);
+    return value.stringValue;
+  }
+
+  void _assertValidUnknown(EvaluationResultImpl result) {
+    expect(result.value, isNotNull);
+    DartObjectImpl value = result.value;
+    expect(value.isUnknown, isTrue);
+  }
+
+  EvaluationResultImpl _check_fromEnvironment_bool(
+      String valueInEnvironment, String defaultExpr) {
+    String envVarName = "x";
+    String varName = "foo";
+    if (valueInEnvironment != null) {
+      analysisContext2.declaredVariables.define(envVarName, valueInEnvironment);
+    }
+    String defaultArg =
+        defaultExpr == null ? "" : ", defaultValue: $defaultExpr";
+    CompilationUnit compilationUnit = resolveSource(
+        "const $varName = const bool.fromEnvironment('$envVarName'$defaultArg);");
+    return _evaluateTopLevelVariable(compilationUnit, varName);
+  }
+
+  EvaluationResultImpl _check_fromEnvironment_int(
+      String valueInEnvironment, String defaultExpr) {
+    String envVarName = "x";
+    String varName = "foo";
+    if (valueInEnvironment != null) {
+      analysisContext2.declaredVariables.define(envVarName, valueInEnvironment);
+    }
+    String defaultArg =
+        defaultExpr == null ? "" : ", defaultValue: $defaultExpr";
+    CompilationUnit compilationUnit = resolveSource(
+        "const $varName = const int.fromEnvironment('$envVarName'$defaultArg);");
+    return _evaluateTopLevelVariable(compilationUnit, varName);
+  }
+
+  EvaluationResultImpl _check_fromEnvironment_string(
+      String valueInEnvironment, String defaultExpr) {
+    String envVarName = "x";
+    String varName = "foo";
+    if (valueInEnvironment != null) {
+      analysisContext2.declaredVariables.define(envVarName, valueInEnvironment);
+    }
+    String defaultArg =
+        defaultExpr == null ? "" : ", defaultValue: $defaultExpr";
+    CompilationUnit compilationUnit = resolveSource(
+        "const $varName = const String.fromEnvironment('$envVarName'$defaultArg);");
+    return _evaluateTopLevelVariable(compilationUnit, varName);
+  }
+
+  void _checkInstanceCreation_withSupertypeParams(bool isExplicit) {
+    String superCall = isExplicit ? " : super()" : "";
+    CompilationUnit compilationUnit = resolveSource("""
+class A<T> {
+  const A();
+}
+class B<T, U> extends A<T> {
+  const B()$superCall;
+}
+class C<T, U> extends A<U> {
+  const C()$superCall;
+}
+const b_int_num = const B<int, num>();
+const c_int_num = const C<int, num>();""");
+    EvaluationResultImpl b_int_num =
+        _evaluateTopLevelVariable(compilationUnit, "b_int_num");
+    Map<String, DartObjectImpl> b_int_num_fields =
+        _assertType(b_int_num, "B<int, num>");
+    _assertFieldType(b_int_num_fields, GenericState.SUPERCLASS_FIELD, "A<int>");
+    EvaluationResultImpl c_int_num =
+        _evaluateTopLevelVariable(compilationUnit, "c_int_num");
+    Map<String, DartObjectImpl> c_int_num_fields =
+        _assertType(c_int_num, "C<int, num>");
+    _assertFieldType(c_int_num_fields, GenericState.SUPERCLASS_FIELD, "A<num>");
+  }
+
+  void _checkInstanceCreationOptionalParams(
+      bool isFieldFormal, bool isNamed, bool hasDefault) {
+    String fieldName = "j";
+    String paramName = isFieldFormal ? fieldName : "i";
+    String formalParam =
+        "${isFieldFormal ? "this." : "int "}$paramName${hasDefault ? " = 3" : ""}";
+    CompilationUnit compilationUnit = resolveSource("""
+const x = const A();
+const y = const A(${isNamed ? '$paramName: ' : ''}10);
+class A {
+  const A(${isNamed ? "{$formalParam}" : "[$formalParam]"})${isFieldFormal ? "" : " : $fieldName = $paramName"};
+  final int $fieldName;
+}""");
+    EvaluationResultImpl x = _evaluateTopLevelVariable(compilationUnit, "x");
+    Map<String, DartObjectImpl> fieldsOfX = _assertType(x, "A");
+    expect(fieldsOfX, hasLength(1));
+    if (hasDefault) {
+      _assertIntField(fieldsOfX, fieldName, 3);
+    } else {
+      _assertNullField(fieldsOfX, fieldName);
+    }
+    EvaluationResultImpl y = _evaluateTopLevelVariable(compilationUnit, "y");
+    Map<String, DartObjectImpl> fieldsOfY = _assertType(y, "A");
+    expect(fieldsOfY, hasLength(1));
+    _assertIntField(fieldsOfY, fieldName, 10);
+  }
+
+  /**
+   * Search [compilationUnit] for a class named [className], containing a
+   * method [methodName], with exactly one annotation.  Return the constant
+   * value of the annotation.
+   */
+  EvaluationResultImpl _evaluateAnnotation(
+      CompilationUnit compilationUnit, String className, String memberName) {
+    for (CompilationUnitMember member in compilationUnit.declarations) {
+      if (member is ClassDeclaration && member.name.name == className) {
+        for (ClassMember classMember in member.members) {
+          if (classMember is MethodDeclaration &&
+              classMember.name.name == memberName) {
+            expect(classMember.metadata, hasLength(1));
+            ElementAnnotationImpl elementAnnotation =
+                classMember.metadata[0].elementAnnotation;
+            return elementAnnotation.evaluationResult;
+          }
+        }
+      }
+    }
+    fail('Class member not found');
+    return null;
+  }
+
+  EvaluationResultImpl _evaluateTopLevelVariable(
+      CompilationUnit compilationUnit, String name) {
+    VariableDeclaration varDecl =
+        findTopLevelDeclaration(compilationUnit, name);
+    ConstTopLevelVariableElementImpl varElement = varDecl.element;
+    return varElement.evaluationResult;
+  }
+
+  ConstantValueComputer _makeConstantValueComputer() {
+    ConstantEvaluationValidator_ForTest validator =
+        new ConstantEvaluationValidator_ForTest();
+    validator.computer = new ConstantValueComputer(
+        analysisContext2,
+        analysisContext2.typeProvider,
+        analysisContext2.declaredVariables,
+        validator);
+    return validator.computer;
+  }
+
+  void _validate(bool shouldBeValid, VariableDeclarationList declarationList) {
+    for (VariableDeclaration declaration in declarationList.variables) {
+      VariableElementImpl element = declaration.element as VariableElementImpl;
+      expect(element, isNotNull);
+      EvaluationResultImpl result = element.evaluationResult;
+      if (shouldBeValid) {
+        expect(result.value, isNotNull);
+      } else {
+        expect(result.value, isNull);
+      }
+    }
+  }
+}
+
+@reflectiveTest
+class ConstantVisitorTest extends ResolverTestCase {
+  void test_visitConditionalExpression_false() {
+    Expression thenExpression = AstFactory.integer(1);
+    Expression elseExpression = AstFactory.integer(0);
+    ConditionalExpression expression = AstFactory.conditionalExpression(
+        AstFactory.booleanLiteral(false), thenExpression, elseExpression);
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    ErrorReporter errorReporter =
+        new ErrorReporter(errorListener, _dummySource());
+    _assertValue(
+        0,
+        expression.accept(new ConstantVisitor(
+            new ConstantEvaluationEngine(
+                new TestTypeProvider(), new DeclaredVariables()),
+            errorReporter)));
+    errorListener.assertNoErrors();
+  }
+
+  void test_visitConditionalExpression_nonBooleanCondition() {
+    Expression thenExpression = AstFactory.integer(1);
+    Expression elseExpression = AstFactory.integer(0);
+    NullLiteral conditionExpression = AstFactory.nullLiteral();
+    ConditionalExpression expression = AstFactory.conditionalExpression(
+        conditionExpression, thenExpression, elseExpression);
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    ErrorReporter errorReporter =
+        new ErrorReporter(errorListener, _dummySource());
+    DartObjectImpl result = expression.accept(new ConstantVisitor(
+        new ConstantEvaluationEngine(
+            new TestTypeProvider(), new DeclaredVariables()),
+        errorReporter));
+    expect(result, isNull);
+    errorListener
+        .assertErrorsWithCodes([CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL]);
+  }
+
+  void test_visitConditionalExpression_nonConstantElse() {
+    Expression thenExpression = AstFactory.integer(1);
+    Expression elseExpression = AstFactory.identifier3("x");
+    ConditionalExpression expression = AstFactory.conditionalExpression(
+        AstFactory.booleanLiteral(true), thenExpression, elseExpression);
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    ErrorReporter errorReporter =
+        new ErrorReporter(errorListener, _dummySource());
+    DartObjectImpl result = expression.accept(new ConstantVisitor(
+        new ConstantEvaluationEngine(
+            new TestTypeProvider(), new DeclaredVariables()),
+        errorReporter));
+    expect(result, isNull);
+    errorListener
+        .assertErrorsWithCodes([CompileTimeErrorCode.INVALID_CONSTANT]);
+  }
+
+  void test_visitConditionalExpression_nonConstantThen() {
+    Expression thenExpression = AstFactory.identifier3("x");
+    Expression elseExpression = AstFactory.integer(0);
+    ConditionalExpression expression = AstFactory.conditionalExpression(
+        AstFactory.booleanLiteral(true), thenExpression, elseExpression);
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    ErrorReporter errorReporter =
+        new ErrorReporter(errorListener, _dummySource());
+    DartObjectImpl result = expression.accept(new ConstantVisitor(
+        new ConstantEvaluationEngine(
+            new TestTypeProvider(), new DeclaredVariables()),
+        errorReporter));
+    expect(result, isNull);
+    errorListener
+        .assertErrorsWithCodes([CompileTimeErrorCode.INVALID_CONSTANT]);
+  }
+
+  void test_visitConditionalExpression_true() {
+    Expression thenExpression = AstFactory.integer(1);
+    Expression elseExpression = AstFactory.integer(0);
+    ConditionalExpression expression = AstFactory.conditionalExpression(
+        AstFactory.booleanLiteral(true), thenExpression, elseExpression);
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    ErrorReporter errorReporter =
+        new ErrorReporter(errorListener, _dummySource());
+    _assertValue(
+        1,
+        expression.accept(new ConstantVisitor(
+            new ConstantEvaluationEngine(
+                new TestTypeProvider(), new DeclaredVariables()),
+            errorReporter)));
+    errorListener.assertNoErrors();
+  }
+
+  void test_visitSimpleIdentifier_className() {
+    CompilationUnit compilationUnit = resolveSource('''
+const a = C;
+class C {}
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'a', null);
+    expect(result.type, typeProvider.typeType);
+    ClassElement element = result.value;
+    expect(element.name, 'C');
+  }
+
+  void test_visitSimpleIdentifier_dynamic() {
+    CompilationUnit compilationUnit = resolveSource('''
+const a = dynamic;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'a', null);
+    expect(result.type, typeProvider.typeType);
+    expect(result.value, typeProvider.dynamicType.element);
+  }
+
+  void test_visitSimpleIdentifier_inEnvironment() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+const a = b;
+const b = 3;''');
+    Map<String, DartObjectImpl> environment = new Map<String, DartObjectImpl>();
+    DartObjectImpl six =
+        new DartObjectImpl(typeProvider.intType, new IntState(6));
+    environment["b"] = six;
+    _assertValue(6, _evaluateConstant(compilationUnit, "a", environment));
+  }
+
+  void test_visitSimpleIdentifier_notInEnvironment() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+const a = b;
+const b = 3;''');
+    Map<String, DartObjectImpl> environment = new Map<String, DartObjectImpl>();
+    DartObjectImpl six =
+        new DartObjectImpl(typeProvider.intType, new IntState(6));
+    environment["c"] = six;
+    _assertValue(3, _evaluateConstant(compilationUnit, "a", environment));
+  }
+
+  void test_visitSimpleIdentifier_withoutEnvironment() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+const a = b;
+const b = 3;''');
+    _assertValue(3, _evaluateConstant(compilationUnit, "a", null));
+  }
+
+  void _assertValue(int expectedValue, DartObjectImpl result) {
+    expect(result, isNotNull);
+    expect(result.type.name, "int");
+    expect(result.intValue, expectedValue);
+  }
+
+  NonExistingSource _dummySource() {
+    String path = '/test.dart';
+    return new NonExistingSource(path, toUri(path), UriKind.FILE_URI);
+  }
+
+  DartObjectImpl _evaluateConstant(CompilationUnit compilationUnit, String name,
+      Map<String, DartObjectImpl> lexicalEnvironment) {
+    Source source = compilationUnit.element.source;
+    Expression expression =
+        findTopLevelConstantExpression(compilationUnit, name);
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    ErrorReporter errorReporter = new ErrorReporter(errorListener, source);
+    DartObjectImpl result = expression.accept(new ConstantVisitor(
+        new ConstantEvaluationEngine(typeProvider, new DeclaredVariables()),
+        errorReporter,
+        lexicalEnvironment: lexicalEnvironment));
+    errorListener.assertNoErrors();
+    return result;
+  }
+}
+
+@reflectiveTest
+class ContentCacheTest {
+  void test_setContents() {
+    Source source = new TestSource();
+    ContentCache cache = new ContentCache();
+    expect(cache.getContents(source), isNull);
+    expect(cache.getModificationStamp(source), isNull);
+    String contents = "library lib;";
+    expect(cache.setContents(source, contents), isNull);
+    expect(cache.getContents(source), contents);
+    expect(cache.getModificationStamp(source), isNotNull);
+    expect(cache.setContents(source, contents), contents);
+    expect(cache.setContents(source, null), contents);
+    expect(cache.getContents(source), isNull);
+    expect(cache.getModificationStamp(source), isNull);
+    expect(cache.setContents(source, null), isNull);
+  }
+}
+
+@reflectiveTest
+class CustomUriResolverTest {
+  void test_creation() {
+    expect(new CustomUriResolver({}), isNotNull);
+  }
+
+  void test_resolve_unknown_uri() {
+    UriResolver resolver =
+        new CustomUriResolver({'custom:library': '/path/to/library.dart',});
+    Source result =
+        resolver.resolveAbsolute(parseUriWithException("custom:non_library"));
+    expect(result, isNull);
+  }
+
+  void test_resolve_uri() {
+    String path =
+        FileUtilities2.createFile("/path/to/library.dart").getAbsolutePath();
+    UriResolver resolver = new CustomUriResolver({'custom:library': path,});
+    Source result =
+        resolver.resolveAbsolute(parseUriWithException("custom:library"));
+    expect(result, isNotNull);
+    expect(result.fullName, path);
+  }
+}
+
+@reflectiveTest
+class DartObjectImplTest extends EngineTestCase {
+  TypeProvider _typeProvider = new TestTypeProvider();
+
+  void test_add_knownDouble_knownDouble() {
+    _assertAdd(_doubleValue(3.0), _doubleValue(1.0), _doubleValue(2.0));
+  }
+
+  void test_add_knownDouble_knownInt() {
+    _assertAdd(_doubleValue(3.0), _doubleValue(1.0), _intValue(2));
+  }
+
+  void test_add_knownDouble_unknownDouble() {
+    _assertAdd(_doubleValue(null), _doubleValue(1.0), _doubleValue(null));
+  }
+
+  void test_add_knownDouble_unknownInt() {
+    _assertAdd(_doubleValue(null), _doubleValue(1.0), _intValue(null));
+  }
+
+  void test_add_knownInt_knownInt() {
+    _assertAdd(_intValue(3), _intValue(1), _intValue(2));
+  }
+
+  void test_add_knownInt_knownString() {
+    _assertAdd(null, _intValue(1), _stringValue("2"));
+  }
+
+  void test_add_knownInt_unknownDouble() {
+    _assertAdd(_doubleValue(null), _intValue(1), _doubleValue(null));
+  }
+
+  void test_add_knownInt_unknownInt() {
+    _assertAdd(_intValue(null), _intValue(1), _intValue(null));
+  }
+
+  void test_add_knownString_knownInt() {
+    _assertAdd(null, _stringValue("1"), _intValue(2));
+  }
+
+  void test_add_knownString_knownString() {
+    _assertAdd(_stringValue("ab"), _stringValue("a"), _stringValue("b"));
+  }
+
+  void test_add_knownString_unknownString() {
+    _assertAdd(_stringValue(null), _stringValue("a"), _stringValue(null));
+  }
+
+  void test_add_unknownDouble_knownDouble() {
+    _assertAdd(_doubleValue(null), _doubleValue(null), _doubleValue(2.0));
+  }
+
+  void test_add_unknownDouble_knownInt() {
+    _assertAdd(_doubleValue(null), _doubleValue(null), _intValue(2));
+  }
+
+  void test_add_unknownInt_knownDouble() {
+    _assertAdd(_doubleValue(null), _intValue(null), _doubleValue(2.0));
+  }
+
+  void test_add_unknownInt_knownInt() {
+    _assertAdd(_intValue(null), _intValue(null), _intValue(2));
+  }
+
+  void test_add_unknownString_knownString() {
+    _assertAdd(_stringValue(null), _stringValue(null), _stringValue("b"));
+  }
+
+  void test_add_unknownString_unknownString() {
+    _assertAdd(_stringValue(null), _stringValue(null), _stringValue(null));
+  }
+
+  void test_bitAnd_knownInt_knownInt() {
+    _assertBitAnd(_intValue(2), _intValue(6), _intValue(3));
+  }
+
+  void test_bitAnd_knownInt_knownString() {
+    _assertBitAnd(null, _intValue(6), _stringValue("3"));
+  }
+
+  void test_bitAnd_knownInt_unknownInt() {
+    _assertBitAnd(_intValue(null), _intValue(6), _intValue(null));
+  }
+
+  void test_bitAnd_knownString_knownInt() {
+    _assertBitAnd(null, _stringValue("6"), _intValue(3));
+  }
+
+  void test_bitAnd_unknownInt_knownInt() {
+    _assertBitAnd(_intValue(null), _intValue(null), _intValue(3));
+  }
+
+  void test_bitAnd_unknownInt_unknownInt() {
+    _assertBitAnd(_intValue(null), _intValue(null), _intValue(null));
+  }
+
+  void test_bitNot_knownInt() {
+    _assertBitNot(_intValue(-4), _intValue(3));
+  }
+
+  void test_bitNot_knownString() {
+    _assertBitNot(null, _stringValue("6"));
+  }
+
+  void test_bitNot_unknownInt() {
+    _assertBitNot(_intValue(null), _intValue(null));
+  }
+
+  void test_bitOr_knownInt_knownInt() {
+    _assertBitOr(_intValue(7), _intValue(6), _intValue(3));
+  }
+
+  void test_bitOr_knownInt_knownString() {
+    _assertBitOr(null, _intValue(6), _stringValue("3"));
+  }
+
+  void test_bitOr_knownInt_unknownInt() {
+    _assertBitOr(_intValue(null), _intValue(6), _intValue(null));
+  }
+
+  void test_bitOr_knownString_knownInt() {
+    _assertBitOr(null, _stringValue("6"), _intValue(3));
+  }
+
+  void test_bitOr_unknownInt_knownInt() {
+    _assertBitOr(_intValue(null), _intValue(null), _intValue(3));
+  }
+
+  void test_bitOr_unknownInt_unknownInt() {
+    _assertBitOr(_intValue(null), _intValue(null), _intValue(null));
+  }
+
+  void test_bitXor_knownInt_knownInt() {
+    _assertBitXor(_intValue(5), _intValue(6), _intValue(3));
+  }
+
+  void test_bitXor_knownInt_knownString() {
+    _assertBitXor(null, _intValue(6), _stringValue("3"));
+  }
+
+  void test_bitXor_knownInt_unknownInt() {
+    _assertBitXor(_intValue(null), _intValue(6), _intValue(null));
+  }
+
+  void test_bitXor_knownString_knownInt() {
+    _assertBitXor(null, _stringValue("6"), _intValue(3));
+  }
+
+  void test_bitXor_unknownInt_knownInt() {
+    _assertBitXor(_intValue(null), _intValue(null), _intValue(3));
+  }
+
+  void test_bitXor_unknownInt_unknownInt() {
+    _assertBitXor(_intValue(null), _intValue(null), _intValue(null));
+  }
+
+  void test_concatenate_knownInt_knownString() {
+    _assertConcatenate(null, _intValue(2), _stringValue("def"));
+  }
+
+  void test_concatenate_knownString_knownInt() {
+    _assertConcatenate(null, _stringValue("abc"), _intValue(3));
+  }
+
+  void test_concatenate_knownString_knownString() {
+    _assertConcatenate(
+        _stringValue("abcdef"), _stringValue("abc"), _stringValue("def"));
+  }
+
+  void test_concatenate_knownString_unknownString() {
+    _assertConcatenate(
+        _stringValue(null), _stringValue("abc"), _stringValue(null));
+  }
+
+  void test_concatenate_unknownString_knownString() {
+    _assertConcatenate(
+        _stringValue(null), _stringValue(null), _stringValue("def"));
+  }
+
+  void test_divide_knownDouble_knownDouble() {
+    _assertDivide(_doubleValue(3.0), _doubleValue(6.0), _doubleValue(2.0));
+  }
+
+  void test_divide_knownDouble_knownInt() {
+    _assertDivide(_doubleValue(3.0), _doubleValue(6.0), _intValue(2));
+  }
+
+  void test_divide_knownDouble_unknownDouble() {
+    _assertDivide(_doubleValue(null), _doubleValue(6.0), _doubleValue(null));
+  }
+
+  void test_divide_knownDouble_unknownInt() {
+    _assertDivide(_doubleValue(null), _doubleValue(6.0), _intValue(null));
+  }
+
+  void test_divide_knownInt_knownInt() {
+    _assertDivide(_doubleValue(3.0), _intValue(6), _intValue(2));
+  }
+
+  void test_divide_knownInt_knownString() {
+    _assertDivide(null, _intValue(6), _stringValue("2"));
+  }
+
+  void test_divide_knownInt_unknownDouble() {
+    _assertDivide(_doubleValue(null), _intValue(6), _doubleValue(null));
+  }
+
+  void test_divide_knownInt_unknownInt() {
+    _assertDivide(_doubleValue(null), _intValue(6), _intValue(null));
+  }
+
+  void test_divide_knownString_knownInt() {
+    _assertDivide(null, _stringValue("6"), _intValue(2));
+  }
+
+  void test_divide_unknownDouble_knownDouble() {
+    _assertDivide(_doubleValue(null), _doubleValue(null), _doubleValue(2.0));
+  }
+
+  void test_divide_unknownDouble_knownInt() {
+    _assertDivide(_doubleValue(null), _doubleValue(null), _intValue(2));
+  }
+
+  void test_divide_unknownInt_knownDouble() {
+    _assertDivide(_doubleValue(null), _intValue(null), _doubleValue(2.0));
+  }
+
+  void test_divide_unknownInt_knownInt() {
+    _assertDivide(_doubleValue(null), _intValue(null), _intValue(2));
+  }
+
+  void test_equalEqual_bool_false() {
+    _assertEqualEqual(_boolValue(false), _boolValue(false), _boolValue(true));
+  }
+
+  void test_equalEqual_bool_true() {
+    _assertEqualEqual(_boolValue(true), _boolValue(true), _boolValue(true));
+  }
+
+  void test_equalEqual_bool_unknown() {
+    _assertEqualEqual(_boolValue(null), _boolValue(null), _boolValue(false));
+  }
+
+  void test_equalEqual_double_false() {
+    _assertEqualEqual(_boolValue(false), _doubleValue(2.0), _doubleValue(4.0));
+  }
+
+  void test_equalEqual_double_true() {
+    _assertEqualEqual(_boolValue(true), _doubleValue(2.0), _doubleValue(2.0));
+  }
+
+  void test_equalEqual_double_unknown() {
+    _assertEqualEqual(_boolValue(null), _doubleValue(1.0), _doubleValue(null));
+  }
+
+  void test_equalEqual_int_false() {
+    _assertEqualEqual(_boolValue(false), _intValue(-5), _intValue(5));
+  }
+
+  void test_equalEqual_int_true() {
+    _assertEqualEqual(_boolValue(true), _intValue(5), _intValue(5));
+  }
+
+  void test_equalEqual_int_unknown() {
+    _assertEqualEqual(_boolValue(null), _intValue(null), _intValue(3));
+  }
+
+  void test_equalEqual_list_empty() {
+    _assertEqualEqual(null, _listValue(), _listValue());
+  }
+
+  void test_equalEqual_list_false() {
+    _assertEqualEqual(null, _listValue(), _listValue());
+  }
+
+  void test_equalEqual_map_empty() {
+    _assertEqualEqual(null, _mapValue(), _mapValue());
+  }
+
+  void test_equalEqual_map_false() {
+    _assertEqualEqual(null, _mapValue(), _mapValue());
+  }
+
+  void test_equalEqual_null() {
+    _assertEqualEqual(_boolValue(true), _nullValue(), _nullValue());
+  }
+
+  void test_equalEqual_string_false() {
+    _assertEqualEqual(
+        _boolValue(false), _stringValue("abc"), _stringValue("def"));
+  }
+
+  void test_equalEqual_string_true() {
+    _assertEqualEqual(
+        _boolValue(true), _stringValue("abc"), _stringValue("abc"));
+  }
+
+  void test_equalEqual_string_unknown() {
+    _assertEqualEqual(
+        _boolValue(null), _stringValue(null), _stringValue("def"));
+  }
+
+  void test_equals_list_false_differentSizes() {
+    expect(
+        _listValue([_boolValue(true)]) ==
+            _listValue([_boolValue(true), _boolValue(false)]),
+        isFalse);
+  }
+
+  void test_equals_list_false_sameSize() {
+    expect(_listValue([_boolValue(true)]) == _listValue([_boolValue(false)]),
+        isFalse);
+  }
+
+  void test_equals_list_true_empty() {
+    expect(_listValue(), _listValue());
+  }
+
+  void test_equals_list_true_nonEmpty() {
+    expect(_listValue([_boolValue(true)]), _listValue([_boolValue(true)]));
+  }
+
+  void test_equals_map_true_empty() {
+    expect(_mapValue(), _mapValue());
+  }
+
+  void test_equals_symbol_false() {
+    expect(_symbolValue("a") == _symbolValue("b"), isFalse);
+  }
+
+  void test_equals_symbol_true() {
+    expect(_symbolValue("a"), _symbolValue("a"));
+  }
+
+  void test_getValue_bool_false() {
+    expect(_boolValue(false).value, false);
+  }
+
+  void test_getValue_bool_true() {
+    expect(_boolValue(true).value, true);
+  }
+
+  void test_getValue_bool_unknown() {
+    expect(_boolValue(null).value, isNull);
+  }
+
+  void test_getValue_double_known() {
+    double value = 2.3;
+    expect(_doubleValue(value).value, value);
+  }
+
+  void test_getValue_double_unknown() {
+    expect(_doubleValue(null).value, isNull);
+  }
+
+  void test_getValue_int_known() {
+    int value = 23;
+    expect(_intValue(value).value, value);
+  }
+
+  void test_getValue_int_unknown() {
+    expect(_intValue(null).value, isNull);
+  }
+
+  void test_getValue_list_empty() {
+    Object result = _listValue().value;
+    _assertInstanceOfObjectArray(result);
+    List<Object> array = result as List<Object>;
+    expect(array, hasLength(0));
+  }
+
+  void test_getValue_list_valid() {
+    Object result = _listValue([_intValue(23)]).value;
+    _assertInstanceOfObjectArray(result);
+    List<Object> array = result as List<Object>;
+    expect(array, hasLength(1));
+  }
+
+  void test_getValue_map_empty() {
+    Object result = _mapValue().value;
+    EngineTestCase.assertInstanceOf((obj) => obj is Map, Map, result);
+    Map map = result as Map;
+    expect(map, hasLength(0));
+  }
+
+  void test_getValue_map_valid() {
+    Object result =
+        _mapValue([_stringValue("key"), _stringValue("value")]).value;
+    EngineTestCase.assertInstanceOf((obj) => obj is Map, Map, result);
+    Map map = result as Map;
+    expect(map, hasLength(1));
+  }
+
+  void test_getValue_null() {
+    expect(_nullValue().value, isNull);
+  }
+
+  void test_getValue_string_known() {
+    String value = "twenty-three";
+    expect(_stringValue(value).value, value);
+  }
+
+  void test_getValue_string_unknown() {
+    expect(_stringValue(null).value, isNull);
+  }
+
+  void test_greaterThan_knownDouble_knownDouble_false() {
+    _assertGreaterThan(_boolValue(false), _doubleValue(1.0), _doubleValue(2.0));
+  }
+
+  void test_greaterThan_knownDouble_knownDouble_true() {
+    _assertGreaterThan(_boolValue(true), _doubleValue(2.0), _doubleValue(1.0));
+  }
+
+  void test_greaterThan_knownDouble_knownInt_false() {
+    _assertGreaterThan(_boolValue(false), _doubleValue(1.0), _intValue(2));
+  }
+
+  void test_greaterThan_knownDouble_knownInt_true() {
+    _assertGreaterThan(_boolValue(true), _doubleValue(2.0), _intValue(1));
+  }
+
+  void test_greaterThan_knownDouble_unknownDouble() {
+    _assertGreaterThan(_boolValue(null), _doubleValue(1.0), _doubleValue(null));
+  }
+
+  void test_greaterThan_knownDouble_unknownInt() {
+    _assertGreaterThan(_boolValue(null), _doubleValue(1.0), _intValue(null));
+  }
+
+  void test_greaterThan_knownInt_knownInt_false() {
+    _assertGreaterThan(_boolValue(false), _intValue(1), _intValue(2));
+  }
+
+  void test_greaterThan_knownInt_knownInt_true() {
+    _assertGreaterThan(_boolValue(true), _intValue(2), _intValue(1));
+  }
+
+  void test_greaterThan_knownInt_knownString() {
+    _assertGreaterThan(null, _intValue(1), _stringValue("2"));
+  }
+
+  void test_greaterThan_knownInt_unknownDouble() {
+    _assertGreaterThan(_boolValue(null), _intValue(1), _doubleValue(null));
+  }
+
+  void test_greaterThan_knownInt_unknownInt() {
+    _assertGreaterThan(_boolValue(null), _intValue(1), _intValue(null));
+  }
+
+  void test_greaterThan_knownString_knownInt() {
+    _assertGreaterThan(null, _stringValue("1"), _intValue(2));
+  }
+
+  void test_greaterThan_unknownDouble_knownDouble() {
+    _assertGreaterThan(_boolValue(null), _doubleValue(null), _doubleValue(2.0));
+  }
+
+  void test_greaterThan_unknownDouble_knownInt() {
+    _assertGreaterThan(_boolValue(null), _doubleValue(null), _intValue(2));
+  }
+
+  void test_greaterThan_unknownInt_knownDouble() {
+    _assertGreaterThan(_boolValue(null), _intValue(null), _doubleValue(2.0));
+  }
+
+  void test_greaterThan_unknownInt_knownInt() {
+    _assertGreaterThan(_boolValue(null), _intValue(null), _intValue(2));
+  }
+
+  void test_greaterThanOrEqual_knownDouble_knownDouble_false() {
+    _assertGreaterThanOrEqual(
+        _boolValue(false), _doubleValue(1.0), _doubleValue(2.0));
+  }
+
+  void test_greaterThanOrEqual_knownDouble_knownDouble_true() {
+    _assertGreaterThanOrEqual(
+        _boolValue(true), _doubleValue(2.0), _doubleValue(1.0));
+  }
+
+  void test_greaterThanOrEqual_knownDouble_knownInt_false() {
+    _assertGreaterThanOrEqual(
+        _boolValue(false), _doubleValue(1.0), _intValue(2));
+  }
+
+  void test_greaterThanOrEqual_knownDouble_knownInt_true() {
+    _assertGreaterThanOrEqual(
+        _boolValue(true), _doubleValue(2.0), _intValue(1));
+  }
+
+  void test_greaterThanOrEqual_knownDouble_unknownDouble() {
+    _assertGreaterThanOrEqual(
+        _boolValue(null), _doubleValue(1.0), _doubleValue(null));
+  }
+
+  void test_greaterThanOrEqual_knownDouble_unknownInt() {
+    _assertGreaterThanOrEqual(
+        _boolValue(null), _doubleValue(1.0), _intValue(null));
+  }
+
+  void test_greaterThanOrEqual_knownInt_knownInt_false() {
+    _assertGreaterThanOrEqual(_boolValue(false), _intValue(1), _intValue(2));
+  }
+
+  void test_greaterThanOrEqual_knownInt_knownInt_true() {
+    _assertGreaterThanOrEqual(_boolValue(true), _intValue(2), _intValue(2));
+  }
+
+  void test_greaterThanOrEqual_knownInt_knownString() {
+    _assertGreaterThanOrEqual(null, _intValue(1), _stringValue("2"));
+  }
+
+  void test_greaterThanOrEqual_knownInt_unknownDouble() {
+    _assertGreaterThanOrEqual(
+        _boolValue(null), _intValue(1), _doubleValue(null));
+  }
+
+  void test_greaterThanOrEqual_knownInt_unknownInt() {
+    _assertGreaterThanOrEqual(_boolValue(null), _intValue(1), _intValue(null));
+  }
+
+  void test_greaterThanOrEqual_knownString_knownInt() {
+    _assertGreaterThanOrEqual(null, _stringValue("1"), _intValue(2));
+  }
+
+  void test_greaterThanOrEqual_unknownDouble_knownDouble() {
+    _assertGreaterThanOrEqual(
+        _boolValue(null), _doubleValue(null), _doubleValue(2.0));
+  }
+
+  void test_greaterThanOrEqual_unknownDouble_knownInt() {
+    _assertGreaterThanOrEqual(
+        _boolValue(null), _doubleValue(null), _intValue(2));
+  }
+
+  void test_greaterThanOrEqual_unknownInt_knownDouble() {
+    _assertGreaterThanOrEqual(
+        _boolValue(null), _intValue(null), _doubleValue(2.0));
+  }
+
+  void test_greaterThanOrEqual_unknownInt_knownInt() {
+    _assertGreaterThanOrEqual(_boolValue(null), _intValue(null), _intValue(2));
+  }
+
+  void test_hasExactValue_bool_false() {
+    expect(_boolValue(false).hasExactValue, isTrue);
+  }
+
+  void test_hasExactValue_bool_true() {
+    expect(_boolValue(true).hasExactValue, isTrue);
+  }
+
+  void test_hasExactValue_bool_unknown() {
+    expect(_boolValue(null).hasExactValue, isTrue);
+  }
+
+  void test_hasExactValue_double_known() {
+    expect(_doubleValue(2.3).hasExactValue, isTrue);
+  }
+
+  void test_hasExactValue_double_unknown() {
+    expect(_doubleValue(null).hasExactValue, isTrue);
+  }
+
+  void test_hasExactValue_dynamic() {
+    expect(_dynamicValue().hasExactValue, isFalse);
+  }
+
+  void test_hasExactValue_int_known() {
+    expect(_intValue(23).hasExactValue, isTrue);
+  }
+
+  void test_hasExactValue_int_unknown() {
+    expect(_intValue(null).hasExactValue, isTrue);
+  }
+
+  void test_hasExactValue_list_empty() {
+    expect(_listValue().hasExactValue, isTrue);
+  }
+
+  void test_hasExactValue_list_invalid() {
+    expect(_dynamicValue().hasExactValue, isFalse);
+  }
+
+  void test_hasExactValue_list_valid() {
+    expect(_listValue([_intValue(23)]).hasExactValue, isTrue);
+  }
+
+  void test_hasExactValue_map_empty() {
+    expect(_mapValue().hasExactValue, isTrue);
+  }
+
+  void test_hasExactValue_map_invalidKey() {
+    expect(_mapValue([_dynamicValue(), _stringValue("value")]).hasExactValue,
+        isFalse);
+  }
+
+  void test_hasExactValue_map_invalidValue() {
+    expect(_mapValue([_stringValue("key"), _dynamicValue()]).hasExactValue,
+        isFalse);
+  }
+
+  void test_hasExactValue_map_valid() {
+    expect(
+        _mapValue([_stringValue("key"), _stringValue("value")]).hasExactValue,
+        isTrue);
+  }
+
+  void test_hasExactValue_null() {
+    expect(_nullValue().hasExactValue, isTrue);
+  }
+
+  void test_hasExactValue_num() {
+    expect(_numValue().hasExactValue, isFalse);
+  }
+
+  void test_hasExactValue_string_known() {
+    expect(_stringValue("twenty-three").hasExactValue, isTrue);
+  }
+
+  void test_hasExactValue_string_unknown() {
+    expect(_stringValue(null).hasExactValue, isTrue);
+  }
+
+  void test_identical_bool_false() {
+    _assertIdentical(_boolValue(false), _boolValue(false), _boolValue(true));
+  }
+
+  void test_identical_bool_true() {
+    _assertIdentical(_boolValue(true), _boolValue(true), _boolValue(true));
+  }
+
+  void test_identical_bool_unknown() {
+    _assertIdentical(_boolValue(null), _boolValue(null), _boolValue(false));
+  }
+
+  void test_identical_double_false() {
+    _assertIdentical(_boolValue(false), _doubleValue(2.0), _doubleValue(4.0));
+  }
+
+  void test_identical_double_true() {
+    _assertIdentical(_boolValue(true), _doubleValue(2.0), _doubleValue(2.0));
+  }
+
+  void test_identical_double_unknown() {
+    _assertIdentical(_boolValue(null), _doubleValue(1.0), _doubleValue(null));
+  }
+
+  void test_identical_int_false() {
+    _assertIdentical(_boolValue(false), _intValue(-5), _intValue(5));
+  }
+
+  void test_identical_int_true() {
+    _assertIdentical(_boolValue(true), _intValue(5), _intValue(5));
+  }
+
+  void test_identical_int_unknown() {
+    _assertIdentical(_boolValue(null), _intValue(null), _intValue(3));
+  }
+
+  void test_identical_list_empty() {
+    _assertIdentical(_boolValue(true), _listValue(), _listValue());
+  }
+
+  void test_identical_list_false() {
+    _assertIdentical(
+        _boolValue(false), _listValue(), _listValue([_intValue(3)]));
+  }
+
+  void test_identical_map_empty() {
+    _assertIdentical(_boolValue(true), _mapValue(), _mapValue());
+  }
+
+  void test_identical_map_false() {
+    _assertIdentical(_boolValue(false), _mapValue(),
+        _mapValue([_intValue(1), _intValue(2)]));
+  }
+
+  void test_identical_null() {
+    _assertIdentical(_boolValue(true), _nullValue(), _nullValue());
+  }
+
+  void test_identical_string_false() {
+    _assertIdentical(
+        _boolValue(false), _stringValue("abc"), _stringValue("def"));
+  }
+
+  void test_identical_string_true() {
+    _assertIdentical(
+        _boolValue(true), _stringValue("abc"), _stringValue("abc"));
+  }
+
+  void test_identical_string_unknown() {
+    _assertIdentical(_boolValue(null), _stringValue(null), _stringValue("def"));
+  }
+
+  void test_integerDivide_knownDouble_knownDouble() {
+    _assertIntegerDivide(_intValue(3), _doubleValue(6.0), _doubleValue(2.0));
+  }
+
+  void test_integerDivide_knownDouble_knownInt() {
+    _assertIntegerDivide(_intValue(3), _doubleValue(6.0), _intValue(2));
+  }
+
+  void test_integerDivide_knownDouble_unknownDouble() {
+    _assertIntegerDivide(
+        _intValue(null), _doubleValue(6.0), _doubleValue(null));
+  }
+
+  void test_integerDivide_knownDouble_unknownInt() {
+    _assertIntegerDivide(_intValue(null), _doubleValue(6.0), _intValue(null));
+  }
+
+  void test_integerDivide_knownInt_knownInt() {
+    _assertIntegerDivide(_intValue(3), _intValue(6), _intValue(2));
+  }
+
+  void test_integerDivide_knownInt_knownString() {
+    _assertIntegerDivide(null, _intValue(6), _stringValue("2"));
+  }
+
+  void test_integerDivide_knownInt_unknownDouble() {
+    _assertIntegerDivide(_intValue(null), _intValue(6), _doubleValue(null));
+  }
+
+  void test_integerDivide_knownInt_unknownInt() {
+    _assertIntegerDivide(_intValue(null), _intValue(6), _intValue(null));
+  }
+
+  void test_integerDivide_knownString_knownInt() {
+    _assertIntegerDivide(null, _stringValue("6"), _intValue(2));
+  }
+
+  void test_integerDivide_unknownDouble_knownDouble() {
+    _assertIntegerDivide(
+        _intValue(null), _doubleValue(null), _doubleValue(2.0));
+  }
+
+  void test_integerDivide_unknownDouble_knownInt() {
+    _assertIntegerDivide(_intValue(null), _doubleValue(null), _intValue(2));
+  }
+
+  void test_integerDivide_unknownInt_knownDouble() {
+    _assertIntegerDivide(_intValue(null), _intValue(null), _doubleValue(2.0));
+  }
+
+  void test_integerDivide_unknownInt_knownInt() {
+    _assertIntegerDivide(_intValue(null), _intValue(null), _intValue(2));
+  }
+
+  void test_isBoolNumStringOrNull_bool_false() {
+    expect(_boolValue(false).isBoolNumStringOrNull, isTrue);
+  }
+
+  void test_isBoolNumStringOrNull_bool_true() {
+    expect(_boolValue(true).isBoolNumStringOrNull, isTrue);
+  }
+
+  void test_isBoolNumStringOrNull_bool_unknown() {
+    expect(_boolValue(null).isBoolNumStringOrNull, isTrue);
+  }
+
+  void test_isBoolNumStringOrNull_double_known() {
+    expect(_doubleValue(2.3).isBoolNumStringOrNull, isTrue);
+  }
+
+  void test_isBoolNumStringOrNull_double_unknown() {
+    expect(_doubleValue(null).isBoolNumStringOrNull, isTrue);
+  }
+
+  void test_isBoolNumStringOrNull_dynamic() {
+    expect(_dynamicValue().isBoolNumStringOrNull, isTrue);
+  }
+
+  void test_isBoolNumStringOrNull_int_known() {
+    expect(_intValue(23).isBoolNumStringOrNull, isTrue);
+  }
+
+  void test_isBoolNumStringOrNull_int_unknown() {
+    expect(_intValue(null).isBoolNumStringOrNull, isTrue);
+  }
+
+  void test_isBoolNumStringOrNull_list() {
+    expect(_listValue().isBoolNumStringOrNull, isFalse);
+  }
+
+  void test_isBoolNumStringOrNull_null() {
+    expect(_nullValue().isBoolNumStringOrNull, isTrue);
+  }
+
+  void test_isBoolNumStringOrNull_num() {
+    expect(_numValue().isBoolNumStringOrNull, isTrue);
+  }
+
+  void test_isBoolNumStringOrNull_string_known() {
+    expect(_stringValue("twenty-three").isBoolNumStringOrNull, isTrue);
+  }
+
+  void test_isBoolNumStringOrNull_string_unknown() {
+    expect(_stringValue(null).isBoolNumStringOrNull, isTrue);
+  }
+
+  void test_lessThan_knownDouble_knownDouble_false() {
+    _assertLessThan(_boolValue(false), _doubleValue(2.0), _doubleValue(1.0));
+  }
+
+  void test_lessThan_knownDouble_knownDouble_true() {
+    _assertLessThan(_boolValue(true), _doubleValue(1.0), _doubleValue(2.0));
+  }
+
+  void test_lessThan_knownDouble_knownInt_false() {
+    _assertLessThan(_boolValue(false), _doubleValue(2.0), _intValue(1));
+  }
+
+  void test_lessThan_knownDouble_knownInt_true() {
+    _assertLessThan(_boolValue(true), _doubleValue(1.0), _intValue(2));
+  }
+
+  void test_lessThan_knownDouble_unknownDouble() {
+    _assertLessThan(_boolValue(null), _doubleValue(1.0), _doubleValue(null));
+  }
+
+  void test_lessThan_knownDouble_unknownInt() {
+    _assertLessThan(_boolValue(null), _doubleValue(1.0), _intValue(null));
+  }
+
+  void test_lessThan_knownInt_knownInt_false() {
+    _assertLessThan(_boolValue(false), _intValue(2), _intValue(1));
+  }
+
+  void test_lessThan_knownInt_knownInt_true() {
+    _assertLessThan(_boolValue(true), _intValue(1), _intValue(2));
+  }
+
+  void test_lessThan_knownInt_knownString() {
+    _assertLessThan(null, _intValue(1), _stringValue("2"));
+  }
+
+  void test_lessThan_knownInt_unknownDouble() {
+    _assertLessThan(_boolValue(null), _intValue(1), _doubleValue(null));
+  }
+
+  void test_lessThan_knownInt_unknownInt() {
+    _assertLessThan(_boolValue(null), _intValue(1), _intValue(null));
+  }
+
+  void test_lessThan_knownString_knownInt() {
+    _assertLessThan(null, _stringValue("1"), _intValue(2));
+  }
+
+  void test_lessThan_unknownDouble_knownDouble() {
+    _assertLessThan(_boolValue(null), _doubleValue(null), _doubleValue(2.0));
+  }
+
+  void test_lessThan_unknownDouble_knownInt() {
+    _assertLessThan(_boolValue(null), _doubleValue(null), _intValue(2));
+  }
+
+  void test_lessThan_unknownInt_knownDouble() {
+    _assertLessThan(_boolValue(null), _intValue(null), _doubleValue(2.0));
+  }
+
+  void test_lessThan_unknownInt_knownInt() {
+    _assertLessThan(_boolValue(null), _intValue(null), _intValue(2));
+  }
+
+  void test_lessThanOrEqual_knownDouble_knownDouble_false() {
+    _assertLessThanOrEqual(
+        _boolValue(false), _doubleValue(2.0), _doubleValue(1.0));
+  }
+
+  void test_lessThanOrEqual_knownDouble_knownDouble_true() {
+    _assertLessThanOrEqual(
+        _boolValue(true), _doubleValue(1.0), _doubleValue(2.0));
+  }
+
+  void test_lessThanOrEqual_knownDouble_knownInt_false() {
+    _assertLessThanOrEqual(_boolValue(false), _doubleValue(2.0), _intValue(1));
+  }
+
+  void test_lessThanOrEqual_knownDouble_knownInt_true() {
+    _assertLessThanOrEqual(_boolValue(true), _doubleValue(1.0), _intValue(2));
+  }
+
+  void test_lessThanOrEqual_knownDouble_unknownDouble() {
+    _assertLessThanOrEqual(
+        _boolValue(null), _doubleValue(1.0), _doubleValue(null));
+  }
+
+  void test_lessThanOrEqual_knownDouble_unknownInt() {
+    _assertLessThanOrEqual(
+        _boolValue(null), _doubleValue(1.0), _intValue(null));
+  }
+
+  void test_lessThanOrEqual_knownInt_knownInt_false() {
+    _assertLessThanOrEqual(_boolValue(false), _intValue(2), _intValue(1));
+  }
+
+  void test_lessThanOrEqual_knownInt_knownInt_true() {
+    _assertLessThanOrEqual(_boolValue(true), _intValue(1), _intValue(2));
+  }
+
+  void test_lessThanOrEqual_knownInt_knownString() {
+    _assertLessThanOrEqual(null, _intValue(1), _stringValue("2"));
+  }
+
+  void test_lessThanOrEqual_knownInt_unknownDouble() {
+    _assertLessThanOrEqual(_boolValue(null), _intValue(1), _doubleValue(null));
+  }
+
+  void test_lessThanOrEqual_knownInt_unknownInt() {
+    _assertLessThanOrEqual(_boolValue(null), _intValue(1), _intValue(null));
+  }
+
+  void test_lessThanOrEqual_knownString_knownInt() {
+    _assertLessThanOrEqual(null, _stringValue("1"), _intValue(2));
+  }
+
+  void test_lessThanOrEqual_unknownDouble_knownDouble() {
+    _assertLessThanOrEqual(
+        _boolValue(null), _doubleValue(null), _doubleValue(2.0));
+  }
+
+  void test_lessThanOrEqual_unknownDouble_knownInt() {
+    _assertLessThanOrEqual(_boolValue(null), _doubleValue(null), _intValue(2));
+  }
+
+  void test_lessThanOrEqual_unknownInt_knownDouble() {
+    _assertLessThanOrEqual(
+        _boolValue(null), _intValue(null), _doubleValue(2.0));
+  }
+
+  void test_lessThanOrEqual_unknownInt_knownInt() {
+    _assertLessThanOrEqual(_boolValue(null), _intValue(null), _intValue(2));
+  }
+
+  void test_logicalAnd_false_false() {
+    _assertLogicalAnd(_boolValue(false), _boolValue(false), _boolValue(false));
+  }
+
+  void test_logicalAnd_false_null() {
+    try {
+      _assertLogicalAnd(_boolValue(false), _boolValue(false), _nullValue());
+      fail("Expected EvaluationException");
+    } on EvaluationException {}
+  }
+
+  void test_logicalAnd_false_string() {
+    try {
+      _assertLogicalAnd(
+          _boolValue(false), _boolValue(false), _stringValue("false"));
+      fail("Expected EvaluationException");
+    } on EvaluationException {}
+  }
+
+  void test_logicalAnd_false_true() {
+    _assertLogicalAnd(_boolValue(false), _boolValue(false), _boolValue(true));
+  }
+
+  void test_logicalAnd_null_false() {
+    try {
+      _assertLogicalAnd(_boolValue(false), _nullValue(), _boolValue(false));
+      fail("Expected EvaluationException");
+    } on EvaluationException {}
+  }
+
+  void test_logicalAnd_null_true() {
+    try {
+      _assertLogicalAnd(_boolValue(false), _nullValue(), _boolValue(true));
+      fail("Expected EvaluationException");
+    } on EvaluationException {}
+  }
+
+  void test_logicalAnd_string_false() {
+    try {
+      _assertLogicalAnd(
+          _boolValue(false), _stringValue("true"), _boolValue(false));
+      fail("Expected EvaluationException");
+    } on EvaluationException {}
+  }
+
+  void test_logicalAnd_string_true() {
+    try {
+      _assertLogicalAnd(
+          _boolValue(false), _stringValue("false"), _boolValue(true));
+      fail("Expected EvaluationException");
+    } on EvaluationException {}
+  }
+
+  void test_logicalAnd_true_false() {
+    _assertLogicalAnd(_boolValue(false), _boolValue(true), _boolValue(false));
+  }
+
+  void test_logicalAnd_true_null() {
+    _assertLogicalAnd(null, _boolValue(true), _nullValue());
+  }
+
+  void test_logicalAnd_true_string() {
+    try {
+      _assertLogicalAnd(
+          _boolValue(false), _boolValue(true), _stringValue("true"));
+      fail("Expected EvaluationException");
+    } on EvaluationException {}
+  }
+
+  void test_logicalAnd_true_true() {
+    _assertLogicalAnd(_boolValue(true), _boolValue(true), _boolValue(true));
+  }
+
+  void test_logicalNot_false() {
+    _assertLogicalNot(_boolValue(true), _boolValue(false));
+  }
+
+  void test_logicalNot_null() {
+    _assertLogicalNot(null, _nullValue());
+  }
+
+  void test_logicalNot_string() {
+    try {
+      _assertLogicalNot(_boolValue(true), _stringValue(null));
+      fail("Expected EvaluationException");
+    } on EvaluationException {}
+  }
+
+  void test_logicalNot_true() {
+    _assertLogicalNot(_boolValue(false), _boolValue(true));
+  }
+
+  void test_logicalNot_unknown() {
+    _assertLogicalNot(_boolValue(null), _boolValue(null));
+  }
+
+  void test_logicalOr_false_false() {
+    _assertLogicalOr(_boolValue(false), _boolValue(false), _boolValue(false));
+  }
+
+  void test_logicalOr_false_null() {
+    _assertLogicalOr(null, _boolValue(false), _nullValue());
+  }
+
+  void test_logicalOr_false_string() {
+    try {
+      _assertLogicalOr(
+          _boolValue(false), _boolValue(false), _stringValue("false"));
+      fail("Expected EvaluationException");
+    } on EvaluationException {}
+  }
+
+  void test_logicalOr_false_true() {
+    _assertLogicalOr(_boolValue(true), _boolValue(false), _boolValue(true));
+  }
+
+  void test_logicalOr_null_false() {
+    try {
+      _assertLogicalOr(_boolValue(false), _nullValue(), _boolValue(false));
+      fail("Expected EvaluationException");
+    } on EvaluationException {}
+  }
+
+  void test_logicalOr_null_true() {
+    try {
+      _assertLogicalOr(_boolValue(true), _nullValue(), _boolValue(true));
+      fail("Expected EvaluationException");
+    } on EvaluationException {}
+  }
+
+  void test_logicalOr_string_false() {
+    try {
+      _assertLogicalOr(
+          _boolValue(false), _stringValue("true"), _boolValue(false));
+      fail("Expected EvaluationException");
+    } on EvaluationException {}
+  }
+
+  void test_logicalOr_string_true() {
+    try {
+      _assertLogicalOr(
+          _boolValue(true), _stringValue("false"), _boolValue(true));
+      fail("Expected EvaluationException");
+    } on EvaluationException {}
+  }
+
+  void test_logicalOr_true_false() {
+    _assertLogicalOr(_boolValue(true), _boolValue(true), _boolValue(false));
+  }
+
+  void test_logicalOr_true_null() {
+    try {
+      _assertLogicalOr(_boolValue(true), _boolValue(true), _nullValue());
+      fail("Expected EvaluationException");
+    } on EvaluationException {}
+  }
+
+  void test_logicalOr_true_string() {
+    try {
+      _assertLogicalOr(
+          _boolValue(true), _boolValue(true), _stringValue("true"));
+      fail("Expected EvaluationException");
+    } on EvaluationException {}
+  }
+
+  void test_logicalOr_true_true() {
+    _assertLogicalOr(_boolValue(true), _boolValue(true), _boolValue(true));
+  }
+
+  void test_minus_knownDouble_knownDouble() {
+    _assertMinus(_doubleValue(1.0), _doubleValue(4.0), _doubleValue(3.0));
+  }
+
+  void test_minus_knownDouble_knownInt() {
+    _assertMinus(_doubleValue(1.0), _doubleValue(4.0), _intValue(3));
+  }
+
+  void test_minus_knownDouble_unknownDouble() {
+    _assertMinus(_doubleValue(null), _doubleValue(4.0), _doubleValue(null));
+  }
+
+  void test_minus_knownDouble_unknownInt() {
+    _assertMinus(_doubleValue(null), _doubleValue(4.0), _intValue(null));
+  }
+
+  void test_minus_knownInt_knownInt() {
+    _assertMinus(_intValue(1), _intValue(4), _intValue(3));
+  }
+
+  void test_minus_knownInt_knownString() {
+    _assertMinus(null, _intValue(4), _stringValue("3"));
+  }
+
+  void test_minus_knownInt_unknownDouble() {
+    _assertMinus(_doubleValue(null), _intValue(4), _doubleValue(null));
+  }
+
+  void test_minus_knownInt_unknownInt() {
+    _assertMinus(_intValue(null), _intValue(4), _intValue(null));
+  }
+
+  void test_minus_knownString_knownInt() {
+    _assertMinus(null, _stringValue("4"), _intValue(3));
+  }
+
+  void test_minus_unknownDouble_knownDouble() {
+    _assertMinus(_doubleValue(null), _doubleValue(null), _doubleValue(3.0));
+  }
+
+  void test_minus_unknownDouble_knownInt() {
+    _assertMinus(_doubleValue(null), _doubleValue(null), _intValue(3));
+  }
+
+  void test_minus_unknownInt_knownDouble() {
+    _assertMinus(_doubleValue(null), _intValue(null), _doubleValue(3.0));
+  }
+
+  void test_minus_unknownInt_knownInt() {
+    _assertMinus(_intValue(null), _intValue(null), _intValue(3));
+  }
+
+  void test_negated_double_known() {
+    _assertNegated(_doubleValue(2.0), _doubleValue(-2.0));
+  }
+
+  void test_negated_double_unknown() {
+    _assertNegated(_doubleValue(null), _doubleValue(null));
+  }
+
+  void test_negated_int_known() {
+    _assertNegated(_intValue(-3), _intValue(3));
+  }
+
+  void test_negated_int_unknown() {
+    _assertNegated(_intValue(null), _intValue(null));
+  }
+
+  void test_negated_string() {
+    _assertNegated(null, _stringValue(null));
+  }
+
+  void test_notEqual_bool_false() {
+    _assertNotEqual(_boolValue(false), _boolValue(true), _boolValue(true));
+  }
+
+  void test_notEqual_bool_true() {
+    _assertNotEqual(_boolValue(true), _boolValue(false), _boolValue(true));
+  }
+
+  void test_notEqual_bool_unknown() {
+    _assertNotEqual(_boolValue(null), _boolValue(null), _boolValue(false));
+  }
+
+  void test_notEqual_double_false() {
+    _assertNotEqual(_boolValue(false), _doubleValue(2.0), _doubleValue(2.0));
+  }
+
+  void test_notEqual_double_true() {
+    _assertNotEqual(_boolValue(true), _doubleValue(2.0), _doubleValue(4.0));
+  }
+
+  void test_notEqual_double_unknown() {
+    _assertNotEqual(_boolValue(null), _doubleValue(1.0), _doubleValue(null));
+  }
+
+  void test_notEqual_int_false() {
+    _assertNotEqual(_boolValue(false), _intValue(5), _intValue(5));
+  }
+
+  void test_notEqual_int_true() {
+    _assertNotEqual(_boolValue(true), _intValue(-5), _intValue(5));
+  }
+
+  void test_notEqual_int_unknown() {
+    _assertNotEqual(_boolValue(null), _intValue(null), _intValue(3));
+  }
+
+  void test_notEqual_null() {
+    _assertNotEqual(_boolValue(false), _nullValue(), _nullValue());
+  }
+
+  void test_notEqual_string_false() {
+    _assertNotEqual(
+        _boolValue(false), _stringValue("abc"), _stringValue("abc"));
+  }
+
+  void test_notEqual_string_true() {
+    _assertNotEqual(_boolValue(true), _stringValue("abc"), _stringValue("def"));
+  }
+
+  void test_notEqual_string_unknown() {
+    _assertNotEqual(_boolValue(null), _stringValue(null), _stringValue("def"));
+  }
+
+  void test_performToString_bool_false() {
+    _assertPerformToString(_stringValue("false"), _boolValue(false));
+  }
+
+  void test_performToString_bool_true() {
+    _assertPerformToString(_stringValue("true"), _boolValue(true));
+  }
+
+  void test_performToString_bool_unknown() {
+    _assertPerformToString(_stringValue(null), _boolValue(null));
+  }
+
+  void test_performToString_double_known() {
+    _assertPerformToString(_stringValue("2.0"), _doubleValue(2.0));
+  }
+
+  void test_performToString_double_unknown() {
+    _assertPerformToString(_stringValue(null), _doubleValue(null));
+  }
+
+  void test_performToString_int_known() {
+    _assertPerformToString(_stringValue("5"), _intValue(5));
+  }
+
+  void test_performToString_int_unknown() {
+    _assertPerformToString(_stringValue(null), _intValue(null));
+  }
+
+  void test_performToString_null() {
+    _assertPerformToString(_stringValue("null"), _nullValue());
+  }
+
+  void test_performToString_string_known() {
+    _assertPerformToString(_stringValue("abc"), _stringValue("abc"));
+  }
+
+  void test_performToString_string_unknown() {
+    _assertPerformToString(_stringValue(null), _stringValue(null));
+  }
+
+  void test_remainder_knownDouble_knownDouble() {
+    _assertRemainder(_doubleValue(1.0), _doubleValue(7.0), _doubleValue(2.0));
+  }
+
+  void test_remainder_knownDouble_knownInt() {
+    _assertRemainder(_doubleValue(1.0), _doubleValue(7.0), _intValue(2));
+  }
+
+  void test_remainder_knownDouble_unknownDouble() {
+    _assertRemainder(_doubleValue(null), _doubleValue(7.0), _doubleValue(null));
+  }
+
+  void test_remainder_knownDouble_unknownInt() {
+    _assertRemainder(_doubleValue(null), _doubleValue(6.0), _intValue(null));
+  }
+
+  void test_remainder_knownInt_knownInt() {
+    _assertRemainder(_intValue(1), _intValue(7), _intValue(2));
+  }
+
+  void test_remainder_knownInt_knownString() {
+    _assertRemainder(null, _intValue(7), _stringValue("2"));
+  }
+
+  void test_remainder_knownInt_unknownDouble() {
+    _assertRemainder(_doubleValue(null), _intValue(7), _doubleValue(null));
+  }
+
+  void test_remainder_knownInt_unknownInt() {
+    _assertRemainder(_intValue(null), _intValue(7), _intValue(null));
+  }
+
+  void test_remainder_knownString_knownInt() {
+    _assertRemainder(null, _stringValue("7"), _intValue(2));
+  }
+
+  void test_remainder_unknownDouble_knownDouble() {
+    _assertRemainder(_doubleValue(null), _doubleValue(null), _doubleValue(2.0));
+  }
+
+  void test_remainder_unknownDouble_knownInt() {
+    _assertRemainder(_doubleValue(null), _doubleValue(null), _intValue(2));
+  }
+
+  void test_remainder_unknownInt_knownDouble() {
+    _assertRemainder(_doubleValue(null), _intValue(null), _doubleValue(2.0));
+  }
+
+  void test_remainder_unknownInt_knownInt() {
+    _assertRemainder(_intValue(null), _intValue(null), _intValue(2));
+  }
+
+  void test_shiftLeft_knownInt_knownInt() {
+    _assertShiftLeft(_intValue(48), _intValue(6), _intValue(3));
+  }
+
+  void test_shiftLeft_knownInt_knownString() {
+    _assertShiftLeft(null, _intValue(6), _stringValue(null));
+  }
+
+  void test_shiftLeft_knownInt_tooLarge() {
+    _assertShiftLeft(
+        _intValue(null),
+        _intValue(6),
+        new DartObjectImpl(
+            _typeProvider.intType, new IntState(LONG_MAX_VALUE)));
+  }
+
+  void test_shiftLeft_knownInt_unknownInt() {
+    _assertShiftLeft(_intValue(null), _intValue(6), _intValue(null));
+  }
+
+  void test_shiftLeft_knownString_knownInt() {
+    _assertShiftLeft(null, _stringValue(null), _intValue(3));
+  }
+
+  void test_shiftLeft_unknownInt_knownInt() {
+    _assertShiftLeft(_intValue(null), _intValue(null), _intValue(3));
+  }
+
+  void test_shiftLeft_unknownInt_unknownInt() {
+    _assertShiftLeft(_intValue(null), _intValue(null), _intValue(null));
+  }
+
+  void test_shiftRight_knownInt_knownInt() {
+    _assertShiftRight(_intValue(6), _intValue(48), _intValue(3));
+  }
+
+  void test_shiftRight_knownInt_knownString() {
+    _assertShiftRight(null, _intValue(48), _stringValue(null));
+  }
+
+  void test_shiftRight_knownInt_tooLarge() {
+    _assertShiftRight(
+        _intValue(null),
+        _intValue(48),
+        new DartObjectImpl(
+            _typeProvider.intType, new IntState(LONG_MAX_VALUE)));
+  }
+
+  void test_shiftRight_knownInt_unknownInt() {
+    _assertShiftRight(_intValue(null), _intValue(48), _intValue(null));
+  }
+
+  void test_shiftRight_knownString_knownInt() {
+    _assertShiftRight(null, _stringValue(null), _intValue(3));
+  }
+
+  void test_shiftRight_unknownInt_knownInt() {
+    _assertShiftRight(_intValue(null), _intValue(null), _intValue(3));
+  }
+
+  void test_shiftRight_unknownInt_unknownInt() {
+    _assertShiftRight(_intValue(null), _intValue(null), _intValue(null));
+  }
+
+  void test_stringLength_int() {
+    try {
+      _assertStringLength(_intValue(null), _intValue(0));
+      fail("Expected EvaluationException");
+    } on EvaluationException {}
+  }
+
+  void test_stringLength_knownString() {
+    _assertStringLength(_intValue(3), _stringValue("abc"));
+  }
+
+  void test_stringLength_unknownString() {
+    _assertStringLength(_intValue(null), _stringValue(null));
+  }
+
+  void test_times_knownDouble_knownDouble() {
+    _assertTimes(_doubleValue(6.0), _doubleValue(2.0), _doubleValue(3.0));
+  }
+
+  void test_times_knownDouble_knownInt() {
+    _assertTimes(_doubleValue(6.0), _doubleValue(2.0), _intValue(3));
+  }
+
+  void test_times_knownDouble_unknownDouble() {
+    _assertTimes(_doubleValue(null), _doubleValue(2.0), _doubleValue(null));
+  }
+
+  void test_times_knownDouble_unknownInt() {
+    _assertTimes(_doubleValue(null), _doubleValue(2.0), _intValue(null));
+  }
+
+  void test_times_knownInt_knownInt() {
+    _assertTimes(_intValue(6), _intValue(2), _intValue(3));
+  }
+
+  void test_times_knownInt_knownString() {
+    _assertTimes(null, _intValue(2), _stringValue("3"));
+  }
+
+  void test_times_knownInt_unknownDouble() {
+    _assertTimes(_doubleValue(null), _intValue(2), _doubleValue(null));
+  }
+
+  void test_times_knownInt_unknownInt() {
+    _assertTimes(_intValue(null), _intValue(2), _intValue(null));
+  }
+
+  void test_times_knownString_knownInt() {
+    _assertTimes(null, _stringValue("2"), _intValue(3));
+  }
+
+  void test_times_unknownDouble_knownDouble() {
+    _assertTimes(_doubleValue(null), _doubleValue(null), _doubleValue(3.0));
+  }
+
+  void test_times_unknownDouble_knownInt() {
+    _assertTimes(_doubleValue(null), _doubleValue(null), _intValue(3));
+  }
+
+  void test_times_unknownInt_knownDouble() {
+    _assertTimes(_doubleValue(null), _intValue(null), _doubleValue(3.0));
+  }
+
+  void test_times_unknownInt_knownInt() {
+    _assertTimes(_intValue(null), _intValue(null), _intValue(3));
+  }
+
+  /**
+   * Assert that the result of adding the left and right operands is the expected value, or that the
+   * operation throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertAdd(DartObjectImpl expected, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (expected == null) {
+      try {
+        leftOperand.add(_typeProvider, rightOperand);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result = leftOperand.add(_typeProvider, rightOperand);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of bit-anding the left and right operands is the expected value, or that
+   * the operation throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertBitAnd(DartObjectImpl expected, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (expected == null) {
+      try {
+        leftOperand.bitAnd(_typeProvider, rightOperand);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result = leftOperand.bitAnd(_typeProvider, rightOperand);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the bit-not of the operand is the expected value, or that the operation throws an
+   * exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param operand the operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertBitNot(DartObjectImpl expected, DartObjectImpl operand) {
+    if (expected == null) {
+      try {
+        operand.bitNot(_typeProvider);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result = operand.bitNot(_typeProvider);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of bit-oring the left and right operands is the expected value, or that
+   * the operation throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertBitOr(DartObjectImpl expected, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (expected == null) {
+      try {
+        leftOperand.bitOr(_typeProvider, rightOperand);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result = leftOperand.bitOr(_typeProvider, rightOperand);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of bit-xoring the left and right operands is the expected value, or that
+   * the operation throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertBitXor(DartObjectImpl expected, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (expected == null) {
+      try {
+        leftOperand.bitXor(_typeProvider, rightOperand);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result = leftOperand.bitXor(_typeProvider, rightOperand);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of concatenating the left and right operands is the expected value, or
+   * that the operation throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertConcatenate(DartObjectImpl expected, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (expected == null) {
+      try {
+        leftOperand.concatenate(_typeProvider, rightOperand);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result =
+          leftOperand.concatenate(_typeProvider, rightOperand);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of dividing the left and right operands is the expected value, or that
+   * the operation throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertDivide(DartObjectImpl expected, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (expected == null) {
+      try {
+        leftOperand.divide(_typeProvider, rightOperand);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result = leftOperand.divide(_typeProvider, rightOperand);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of comparing the left and right operands for equality is the expected
+   * value, or that the operation throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertEqualEqual(DartObjectImpl expected, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (expected == null) {
+      try {
+        leftOperand.equalEqual(_typeProvider, rightOperand);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result =
+          leftOperand.equalEqual(_typeProvider, rightOperand);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of comparing the left and right operands is the expected value, or that
+   * the operation throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertGreaterThan(DartObjectImpl expected, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (expected == null) {
+      try {
+        leftOperand.greaterThan(_typeProvider, rightOperand);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result =
+          leftOperand.greaterThan(_typeProvider, rightOperand);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of comparing the left and right operands is the expected value, or that
+   * the operation throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertGreaterThanOrEqual(DartObjectImpl expected,
+      DartObjectImpl leftOperand, DartObjectImpl rightOperand) {
+    if (expected == null) {
+      try {
+        leftOperand.greaterThanOrEqual(_typeProvider, rightOperand);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result =
+          leftOperand.greaterThanOrEqual(_typeProvider, rightOperand);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of comparing the left and right operands using
+   * identical() is the expected value.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   */
+  void _assertIdentical(DartObjectImpl expected, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    DartObjectImpl result =
+        leftOperand.isIdentical(_typeProvider, rightOperand);
+    expect(result, isNotNull);
+    expect(result, expected);
+  }
+
+  void _assertInstanceOfObjectArray(Object result) {
+    // TODO(scheglov) implement
+  }
+
+  /**
+   * Assert that the result of dividing the left and right operands as integers is the expected
+   * value, or that the operation throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertIntegerDivide(DartObjectImpl expected, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (expected == null) {
+      try {
+        leftOperand.integerDivide(_typeProvider, rightOperand);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result =
+          leftOperand.integerDivide(_typeProvider, rightOperand);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of comparing the left and right operands is the expected value, or that
+   * the operation throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertLessThan(DartObjectImpl expected, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (expected == null) {
+      try {
+        leftOperand.lessThan(_typeProvider, rightOperand);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result = leftOperand.lessThan(_typeProvider, rightOperand);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of comparing the left and right operands is the expected value, or that
+   * the operation throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertLessThanOrEqual(DartObjectImpl expected,
+      DartObjectImpl leftOperand, DartObjectImpl rightOperand) {
+    if (expected == null) {
+      try {
+        leftOperand.lessThanOrEqual(_typeProvider, rightOperand);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result =
+          leftOperand.lessThanOrEqual(_typeProvider, rightOperand);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of logical-anding the left and right operands is the expected value, or
+   * that the operation throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertLogicalAnd(DartObjectImpl expected, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (expected == null) {
+      try {
+        leftOperand.logicalAnd(_typeProvider, rightOperand);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result =
+          leftOperand.logicalAnd(_typeProvider, rightOperand);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the logical-not of the operand is the expected value, or that the operation throws
+   * an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param operand the operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertLogicalNot(DartObjectImpl expected, DartObjectImpl operand) {
+    if (expected == null) {
+      try {
+        operand.logicalNot(_typeProvider);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result = operand.logicalNot(_typeProvider);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of logical-oring the left and right operands is the expected value, or
+   * that the operation throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertLogicalOr(DartObjectImpl expected, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (expected == null) {
+      try {
+        leftOperand.logicalOr(_typeProvider, rightOperand);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result =
+          leftOperand.logicalOr(_typeProvider, rightOperand);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of subtracting the left and right operands is the expected value, or
+   * that the operation throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertMinus(DartObjectImpl expected, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (expected == null) {
+      try {
+        leftOperand.minus(_typeProvider, rightOperand);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result = leftOperand.minus(_typeProvider, rightOperand);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the negation of the operand is the expected value, or that the operation throws an
+   * exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param operand the operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertNegated(DartObjectImpl expected, DartObjectImpl operand) {
+    if (expected == null) {
+      try {
+        operand.negated(_typeProvider);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result = operand.negated(_typeProvider);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of comparing the left and right operands for inequality is the expected
+   * value, or that the operation throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertNotEqual(DartObjectImpl expected, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (expected == null) {
+      try {
+        leftOperand.notEqual(_typeProvider, rightOperand);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result = leftOperand.notEqual(_typeProvider, rightOperand);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that converting the operand to a string is the expected value, or that the operation
+   * throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param operand the operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertPerformToString(DartObjectImpl expected, DartObjectImpl operand) {
+    if (expected == null) {
+      try {
+        operand.performToString(_typeProvider);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result = operand.performToString(_typeProvider);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of taking the remainder of the left and right operands is the expected
+   * value, or that the operation throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertRemainder(DartObjectImpl expected, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (expected == null) {
+      try {
+        leftOperand.remainder(_typeProvider, rightOperand);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result =
+          leftOperand.remainder(_typeProvider, rightOperand);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of multiplying the left and right operands is the expected value, or
+   * that the operation throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertShiftLeft(DartObjectImpl expected, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (expected == null) {
+      try {
+        leftOperand.shiftLeft(_typeProvider, rightOperand);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result =
+          leftOperand.shiftLeft(_typeProvider, rightOperand);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of multiplying the left and right operands is the expected value, or
+   * that the operation throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertShiftRight(DartObjectImpl expected, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (expected == null) {
+      try {
+        leftOperand.shiftRight(_typeProvider, rightOperand);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result =
+          leftOperand.shiftRight(_typeProvider, rightOperand);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the length of the operand is the expected value, or that the operation throws an
+   * exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param operand the operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertStringLength(DartObjectImpl expected, DartObjectImpl operand) {
+    if (expected == null) {
+      try {
+        operand.stringLength(_typeProvider);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result = operand.stringLength(_typeProvider);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of multiplying the left and right operands is the expected value, or
+   * that the operation throws an exception if the expected value is `null`.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   * @throws EvaluationException if the result is an exception when it should not be
+   */
+  void _assertTimes(DartObjectImpl expected, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    if (expected == null) {
+      try {
+        leftOperand.times(_typeProvider, rightOperand);
+        fail("Expected an EvaluationException");
+      } on EvaluationException {}
+    } else {
+      DartObjectImpl result = leftOperand.times(_typeProvider, rightOperand);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  DartObjectImpl _boolValue(bool value) {
+    if (value == null) {
+      return new DartObjectImpl(
+          _typeProvider.boolType, BoolState.UNKNOWN_VALUE);
+    } else if (identical(value, false)) {
+      return new DartObjectImpl(_typeProvider.boolType, BoolState.FALSE_STATE);
+    } else if (identical(value, true)) {
+      return new DartObjectImpl(_typeProvider.boolType, BoolState.TRUE_STATE);
+    }
+    fail("Invalid boolean value used in test");
+    return null;
+  }
+
+  DartObjectImpl _doubleValue(double value) {
+    if (value == null) {
+      return new DartObjectImpl(
+          _typeProvider.doubleType, DoubleState.UNKNOWN_VALUE);
+    } else {
+      return new DartObjectImpl(
+          _typeProvider.doubleType, new DoubleState(value));
+    }
+  }
+
+  DartObjectImpl _dynamicValue() {
+    return new DartObjectImpl(
+        _typeProvider.nullType, DynamicState.DYNAMIC_STATE);
+  }
+
+  DartObjectImpl _intValue(int value) {
+    if (value == null) {
+      return new DartObjectImpl(_typeProvider.intType, IntState.UNKNOWN_VALUE);
+    } else {
+      return new DartObjectImpl(_typeProvider.intType, new IntState(value));
+    }
+  }
+
+  DartObjectImpl _listValue(
+      [List<DartObjectImpl> elements = DartObjectImpl.EMPTY_LIST]) {
+    return new DartObjectImpl(_typeProvider.listType, new ListState(elements));
+  }
+
+  DartObjectImpl _mapValue(
+      [List<DartObjectImpl> keyElementPairs = DartObjectImpl.EMPTY_LIST]) {
+    Map<DartObjectImpl, DartObjectImpl> map =
+        new Map<DartObjectImpl, DartObjectImpl>();
+    int count = keyElementPairs.length;
+    for (int i = 0; i < count;) {
+      map[keyElementPairs[i++]] = keyElementPairs[i++];
+    }
+    return new DartObjectImpl(_typeProvider.mapType, new MapState(map));
+  }
+
+  DartObjectImpl _nullValue() {
+    return new DartObjectImpl(_typeProvider.nullType, NullState.NULL_STATE);
+  }
+
+  DartObjectImpl _numValue() {
+    return new DartObjectImpl(_typeProvider.nullType, NumState.UNKNOWN_VALUE);
+  }
+
+  DartObjectImpl _stringValue(String value) {
+    if (value == null) {
+      return new DartObjectImpl(
+          _typeProvider.stringType, StringState.UNKNOWN_VALUE);
+    } else {
+      return new DartObjectImpl(
+          _typeProvider.stringType, new StringState(value));
+    }
+  }
+
+  DartObjectImpl _symbolValue(String value) {
+    return new DartObjectImpl(_typeProvider.symbolType, new SymbolState(value));
+  }
+}
+
+@reflectiveTest
+class DartUriResolverTest {
+  void test_creation() {
+    JavaFile sdkDirectory = DirectoryBasedDartSdk.defaultSdkDirectory;
+    expect(sdkDirectory, isNotNull);
+    DartSdk sdk = new DirectoryBasedDartSdk(sdkDirectory);
+    expect(new DartUriResolver(sdk), isNotNull);
+  }
+
+  void test_isDartUri_null_scheme() {
+    Uri uri = parseUriWithException("foo.dart");
+    expect('', uri.scheme);
+    expect(DartUriResolver.isDartUri(uri), isFalse);
+  }
+
+  void test_resolve_dart() {
+    JavaFile sdkDirectory = DirectoryBasedDartSdk.defaultSdkDirectory;
+    expect(sdkDirectory, isNotNull);
+    DartSdk sdk = new DirectoryBasedDartSdk(sdkDirectory);
+    UriResolver resolver = new DartUriResolver(sdk);
+    Source result =
+        resolver.resolveAbsolute(parseUriWithException("dart:core"));
+    expect(result, isNotNull);
+  }
+
+  void test_resolve_dart_nonExistingLibrary() {
+    JavaFile sdkDirectory = DirectoryBasedDartSdk.defaultSdkDirectory;
+    expect(sdkDirectory, isNotNull);
+    DartSdk sdk = new DirectoryBasedDartSdk(sdkDirectory);
+    UriResolver resolver = new DartUriResolver(sdk);
+    Source result = resolver.resolveAbsolute(parseUriWithException("dart:cor"));
+    expect(result, isNull);
+  }
+
+  void test_resolve_nonDart() {
+    JavaFile sdkDirectory = DirectoryBasedDartSdk.defaultSdkDirectory;
+    expect(sdkDirectory, isNotNull);
+    DartSdk sdk = new DirectoryBasedDartSdk(sdkDirectory);
+    UriResolver resolver = new DartUriResolver(sdk);
+    Source result = resolver
+        .resolveAbsolute(parseUriWithException("package:some/file.dart"));
+    expect(result, isNull);
+  }
+}
+
+@reflectiveTest
+class DeclaredVariablesTest extends EngineTestCase {
+  void test_getBool_false() {
+    TestTypeProvider typeProvider = new TestTypeProvider();
+    String variableName = "var";
+    DeclaredVariables variables = new DeclaredVariables();
+    variables.define(variableName, "false");
+    DartObject object = variables.getBool(typeProvider, variableName);
+    expect(object, isNotNull);
+    expect(object.boolValue, false);
+  }
+
+  void test_getBool_invalid() {
+    TestTypeProvider typeProvider = new TestTypeProvider();
+    String variableName = "var";
+    DeclaredVariables variables = new DeclaredVariables();
+    variables.define(variableName, "not true");
+    _assertNullDartObject(
+        typeProvider, variables.getBool(typeProvider, variableName));
+  }
+
+  void test_getBool_true() {
+    TestTypeProvider typeProvider = new TestTypeProvider();
+    String variableName = "var";
+    DeclaredVariables variables = new DeclaredVariables();
+    variables.define(variableName, "true");
+    DartObject object = variables.getBool(typeProvider, variableName);
+    expect(object, isNotNull);
+    expect(object.boolValue, true);
+  }
+
+  void test_getBool_undefined() {
+    TestTypeProvider typeProvider = new TestTypeProvider();
+    String variableName = "var";
+    DeclaredVariables variables = new DeclaredVariables();
+    _assertUnknownDartObject(
+        typeProvider.boolType, variables.getBool(typeProvider, variableName));
+  }
+
+  void test_getInt_invalid() {
+    TestTypeProvider typeProvider = new TestTypeProvider();
+    String variableName = "var";
+    DeclaredVariables variables = new DeclaredVariables();
+    variables.define(variableName, "four score and seven years");
+    _assertNullDartObject(
+        typeProvider, variables.getInt(typeProvider, variableName));
+  }
+
+  void test_getInt_undefined() {
+    TestTypeProvider typeProvider = new TestTypeProvider();
+    String variableName = "var";
+    DeclaredVariables variables = new DeclaredVariables();
+    _assertUnknownDartObject(
+        typeProvider.intType, variables.getInt(typeProvider, variableName));
+  }
+
+  void test_getInt_valid() {
+    TestTypeProvider typeProvider = new TestTypeProvider();
+    String variableName = "var";
+    DeclaredVariables variables = new DeclaredVariables();
+    variables.define(variableName, "23");
+    DartObject object = variables.getInt(typeProvider, variableName);
+    expect(object, isNotNull);
+    expect(object.intValue, 23);
+  }
+
+  void test_getString_defined() {
+    TestTypeProvider typeProvider = new TestTypeProvider();
+    String variableName = "var";
+    String value = "value";
+    DeclaredVariables variables = new DeclaredVariables();
+    variables.define(variableName, value);
+    DartObject object = variables.getString(typeProvider, variableName);
+    expect(object, isNotNull);
+    expect(object.stringValue, value);
+  }
+
+  void test_getString_undefined() {
+    TestTypeProvider typeProvider = new TestTypeProvider();
+    String variableName = "var";
+    DeclaredVariables variables = new DeclaredVariables();
+    _assertUnknownDartObject(typeProvider.stringType,
+        variables.getString(typeProvider, variableName));
+  }
+
+  void _assertNullDartObject(TestTypeProvider typeProvider, DartObject result) {
+    expect(result.type, typeProvider.nullType);
+  }
+
+  void _assertUnknownDartObject(
+      ParameterizedType expectedType, DartObject result) {
+    expect((result as DartObjectImpl).isUnknown, isTrue);
+    expect(result.type, expectedType);
+  }
+}
+
+@reflectiveTest
+class DirectoryBasedDartSdkTest {
+  void fail_getDocFileFor() {
+    DirectoryBasedDartSdk sdk = _createDartSdk();
+    JavaFile docFile = sdk.getDocFileFor("html");
+    expect(docFile, isNotNull);
+  }
+
+  void test_creation() {
+    DirectoryBasedDartSdk sdk = _createDartSdk();
+    expect(sdk, isNotNull);
+  }
+
+  void test_fromFile_invalid() {
+    DirectoryBasedDartSdk sdk = _createDartSdk();
+    expect(
+        sdk.fromFileUri(new JavaFile("/not/in/the/sdk.dart").toURI()), isNull);
+  }
+
+  void test_fromFile_library() {
+    DirectoryBasedDartSdk sdk = _createDartSdk();
+    Source source = sdk.fromFileUri(new JavaFile.relative(
+            new JavaFile.relative(sdk.libraryDirectory, "core"), "core.dart")
+        .toURI());
+    expect(source, isNotNull);
+    expect(source.isInSystemLibrary, isTrue);
+    expect(source.uri.toString(), "dart:core");
+  }
+
+  void test_fromFile_part() {
+    DirectoryBasedDartSdk sdk = _createDartSdk();
+    Source source = sdk.fromFileUri(new JavaFile.relative(
+            new JavaFile.relative(sdk.libraryDirectory, "core"), "num.dart")
+        .toURI());
+    expect(source, isNotNull);
+    expect(source.isInSystemLibrary, isTrue);
+    expect(source.uri.toString(), "dart:core/num.dart");
+  }
+
+  void test_getDart2JsExecutable() {
+    DirectoryBasedDartSdk sdk = _createDartSdk();
+    JavaFile executable = sdk.dart2JsExecutable;
+    expect(executable, isNotNull);
+    expect(executable.exists(), isTrue);
+    expect(executable.isExecutable(), isTrue);
+  }
+
+  void test_getDirectory() {
+    DirectoryBasedDartSdk sdk = _createDartSdk();
+    JavaFile directory = sdk.directory;
+    expect(directory, isNotNull);
+    expect(directory.exists(), isTrue);
+  }
+
+  void test_getDocDirectory() {
+    DirectoryBasedDartSdk sdk = _createDartSdk();
+    JavaFile directory = sdk.docDirectory;
+    expect(directory, isNotNull);
+  }
+
+  void test_getLibraryDirectory() {
+    DirectoryBasedDartSdk sdk = _createDartSdk();
+    JavaFile directory = sdk.libraryDirectory;
+    expect(directory, isNotNull);
+    expect(directory.exists(), isTrue);
+  }
+
+  void test_getPubExecutable() {
+    DirectoryBasedDartSdk sdk = _createDartSdk();
+    JavaFile executable = sdk.pubExecutable;
+    expect(executable, isNotNull);
+    expect(executable.exists(), isTrue);
+    expect(executable.isExecutable(), isTrue);
+  }
+
+  void test_getSdkVersion() {
+    DirectoryBasedDartSdk sdk = _createDartSdk();
+    String version = sdk.sdkVersion;
+    expect(version, isNotNull);
+    expect(version.length > 0, isTrue);
+  }
+
+  void test_getVmExecutable() {
+    DirectoryBasedDartSdk sdk = _createDartSdk();
+    JavaFile executable = sdk.vmExecutable;
+    expect(executable, isNotNull);
+    expect(executable.exists(), isTrue);
+    expect(executable.isExecutable(), isTrue);
+  }
+
+  DirectoryBasedDartSdk _createDartSdk() {
+    JavaFile sdkDirectory = DirectoryBasedDartSdk.defaultSdkDirectory;
+    expect(sdkDirectory, isNotNull,
+        reason:
+            "No SDK configured; set the property 'com.google.dart.sdk' on the command line");
+    return new DirectoryBasedDartSdk(sdkDirectory);
+  }
+}
+
+@reflectiveTest
+class DirectoryBasedSourceContainerTest {
+  void test_contains() {
+    JavaFile dir = FileUtilities2.createFile("/does/not/exist");
+    JavaFile file1 = FileUtilities2.createFile("/does/not/exist/some.dart");
+    JavaFile file2 =
+        FileUtilities2.createFile("/does/not/exist/folder/some2.dart");
+    JavaFile file3 = FileUtilities2.createFile("/does/not/exist3/some3.dart");
+    FileBasedSource source1 = new FileBasedSource(file1);
+    FileBasedSource source2 = new FileBasedSource(file2);
+    FileBasedSource source3 = new FileBasedSource(file3);
+    DirectoryBasedSourceContainer container =
+        new DirectoryBasedSourceContainer.con1(dir);
+    expect(container.contains(source1), isTrue);
+    expect(container.contains(source2), isTrue);
+    expect(container.contains(source3), isFalse);
+  }
+}
+
+@reflectiveTest
+class ElementBuilderTest extends EngineTestCase {
+  void test_visitCatchClause() {
+    // } catch (e, s) {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String exceptionParameterName = "e";
+    String stackParameterName = "s";
+    CatchClause clause =
+        AstFactory.catchClause2(exceptionParameterName, stackParameterName);
+    clause.accept(builder);
+
+    List<LocalVariableElement> variables = holder.localVariables;
+    expect(variables, hasLength(2));
+    VariableElement exceptionVariable = variables[0];
+    expect(exceptionVariable, isNotNull);
+    expect(exceptionVariable.name, exceptionParameterName);
+    expect(exceptionVariable.hasImplicitType, isTrue);
+    expect(exceptionVariable.isSynthetic, isFalse);
+    expect(exceptionVariable.isConst, isFalse);
+    expect(exceptionVariable.isFinal, isFalse);
+    expect(exceptionVariable.initializer, isNull);
+    VariableElement stackVariable = variables[1];
+    expect(stackVariable, isNotNull);
+    expect(stackVariable.name, stackParameterName);
+    expect(stackVariable.isSynthetic, isFalse);
+    expect(stackVariable.isConst, isFalse);
+    expect(stackVariable.isFinal, isFalse);
+    expect(stackVariable.initializer, isNull);
+  }
+
+  void test_visitCatchClause_withType() {
+    // } on E catch (e) {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String exceptionParameterName = "e";
+    CatchClause clause = AstFactory.catchClause4(
+        AstFactory.typeName4('E'), exceptionParameterName);
+    clause.accept(builder);
+
+    List<LocalVariableElement> variables = holder.localVariables;
+    expect(variables, hasLength(1));
+    VariableElement exceptionVariable = variables[0];
+    expect(exceptionVariable, isNotNull);
+    expect(exceptionVariable.name, exceptionParameterName);
+    expect(exceptionVariable.hasImplicitType, isFalse);
+  }
+
+  void test_visitClassDeclaration_abstract() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String className = "C";
+    ClassDeclaration classDeclaration = AstFactory.classDeclaration(
+        Keyword.ABSTRACT, className, null, null, null, null);
+    classDeclaration.accept(builder);
+    List<ClassElement> types = holder.types;
+    expect(types, hasLength(1));
+    ClassElement type = types[0];
+    expect(type, isNotNull);
+    expect(type.name, className);
+    List<TypeParameterElement> typeParameters = type.typeParameters;
+    expect(typeParameters, hasLength(0));
+    expect(type.isAbstract, isTrue);
+    expect(type.isMixinApplication, isFalse);
+    expect(type.isSynthetic, isFalse);
+  }
+
+  void test_visitClassDeclaration_minimal() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String className = "C";
+    ClassDeclaration classDeclaration =
+        AstFactory.classDeclaration(null, className, null, null, null, null);
+    classDeclaration.accept(builder);
+    List<ClassElement> types = holder.types;
+    expect(types, hasLength(1));
+    ClassElement type = types[0];
+    expect(type, isNotNull);
+    expect(type.name, className);
+    List<TypeParameterElement> typeParameters = type.typeParameters;
+    expect(typeParameters, hasLength(0));
+    expect(type.isAbstract, isFalse);
+    expect(type.isMixinApplication, isFalse);
+    expect(type.isSynthetic, isFalse);
+  }
+
+  void test_visitClassDeclaration_parameterized() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String className = "C";
+    String firstVariableName = "E";
+    String secondVariableName = "F";
+    ClassDeclaration classDeclaration = AstFactory.classDeclaration(
+        null,
+        className,
+        AstFactory.typeParameterList([firstVariableName, secondVariableName]),
+        null,
+        null,
+        null);
+    classDeclaration.accept(builder);
+    List<ClassElement> types = holder.types;
+    expect(types, hasLength(1));
+    ClassElement type = types[0];
+    expect(type, isNotNull);
+    expect(type.name, className);
+    List<TypeParameterElement> typeParameters = type.typeParameters;
+    expect(typeParameters, hasLength(2));
+    expect(typeParameters[0].name, firstVariableName);
+    expect(typeParameters[1].name, secondVariableName);
+    expect(type.isAbstract, isFalse);
+    expect(type.isMixinApplication, isFalse);
+    expect(type.isSynthetic, isFalse);
+  }
+
+  void test_visitClassDeclaration_withMembers() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String className = "C";
+    String typeParameterName = "E";
+    String fieldName = "f";
+    String methodName = "m";
+    ClassDeclaration classDeclaration = AstFactory.classDeclaration(
+        null,
+        className,
+        AstFactory.typeParameterList([typeParameterName]),
+        null,
+        null,
+        null, [
+      AstFactory.fieldDeclaration2(
+          false, null, [AstFactory.variableDeclaration(fieldName)]),
+      AstFactory.methodDeclaration2(
+          null,
+          null,
+          null,
+          null,
+          AstFactory.identifier3(methodName),
+          AstFactory.formalParameterList(),
+          AstFactory.blockFunctionBody2())
+    ]);
+    classDeclaration.accept(builder);
+    List<ClassElement> types = holder.types;
+    expect(types, hasLength(1));
+    ClassElement type = types[0];
+    expect(type, isNotNull);
+    expect(type.name, className);
+    expect(type.isAbstract, isFalse);
+    expect(type.isMixinApplication, isFalse);
+    expect(type.isSynthetic, isFalse);
+    List<TypeParameterElement> typeParameters = type.typeParameters;
+    expect(typeParameters, hasLength(1));
+    TypeParameterElement typeParameter = typeParameters[0];
+    expect(typeParameter, isNotNull);
+    expect(typeParameter.name, typeParameterName);
+    List<FieldElement> fields = type.fields;
+    expect(fields, hasLength(1));
+    FieldElement field = fields[0];
+    expect(field, isNotNull);
+    expect(field.name, fieldName);
+    List<MethodElement> methods = type.methods;
+    expect(methods, hasLength(1));
+    MethodElement method = methods[0];
+    expect(method, isNotNull);
+    expect(method.name, methodName);
+  }
+
+  void test_visitClassTypeAlias() {
+    // class B {}
+    // class M {}
+    // class C = B with M
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    ClassElementImpl classB = ElementFactory.classElement2('B', []);
+    ConstructorElementImpl constructorB =
+        ElementFactory.constructorElement2(classB, '', []);
+    constructorB.setModifier(Modifier.SYNTHETIC, true);
+    classB.constructors = [constructorB];
+    ClassElement classM = ElementFactory.classElement2('M', []);
+    WithClause withClause =
+        AstFactory.withClause([AstFactory.typeName(classM, [])]);
+    ClassTypeAlias alias = AstFactory.classTypeAlias(
+        'C', null, null, AstFactory.typeName(classB, []), withClause, null);
+    alias.accept(builder);
+    List<ClassElement> types = holder.types;
+    expect(types, hasLength(1));
+    ClassElement type = types[0];
+    expect(alias.element, same(type));
+    expect(type.name, equals('C'));
+    expect(type.isAbstract, isFalse);
+    expect(type.isMixinApplication, isTrue);
+    expect(type.isSynthetic, isFalse);
+    expect(type.typeParameters, isEmpty);
+    expect(type.fields, isEmpty);
+    expect(type.methods, isEmpty);
+  }
+
+  void test_visitClassTypeAlias_abstract() {
+    // class B {}
+    // class M {}
+    // abstract class C = B with M
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    ClassElementImpl classB = ElementFactory.classElement2('B', []);
+    ConstructorElementImpl constructorB =
+        ElementFactory.constructorElement2(classB, '', []);
+    constructorB.setModifier(Modifier.SYNTHETIC, true);
+    classB.constructors = [constructorB];
+    ClassElement classM = ElementFactory.classElement2('M', []);
+    WithClause withClause =
+        AstFactory.withClause([AstFactory.typeName(classM, [])]);
+    ClassTypeAlias classCAst = AstFactory.classTypeAlias('C', null,
+        Keyword.ABSTRACT, AstFactory.typeName(classB, []), withClause, null);
+    classCAst.accept(builder);
+    List<ClassElement> types = holder.types;
+    expect(types, hasLength(1));
+    ClassElement type = types[0];
+    expect(type.isAbstract, isTrue);
+    expect(type.isMixinApplication, isTrue);
+  }
+
+  void test_visitClassTypeAlias_typeParams() {
+    // class B {}
+    // class M {}
+    // class C<T> = B with M
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    ClassElementImpl classB = ElementFactory.classElement2('B', []);
+    ConstructorElementImpl constructorB =
+        ElementFactory.constructorElement2(classB, '', []);
+    constructorB.setModifier(Modifier.SYNTHETIC, true);
+    classB.constructors = [constructorB];
+    ClassElementImpl classM = ElementFactory.classElement2('M', []);
+    WithClause withClause =
+        AstFactory.withClause([AstFactory.typeName(classM, [])]);
+    ClassTypeAlias classCAst = AstFactory.classTypeAlias(
+        'C',
+        AstFactory.typeParameterList(['T']),
+        null,
+        AstFactory.typeName(classB, []),
+        withClause,
+        null);
+    classCAst.accept(builder);
+    List<ClassElement> types = holder.types;
+    expect(types, hasLength(1));
+    ClassElement type = types[0];
+    expect(type.typeParameters, hasLength(1));
+    expect(type.typeParameters[0].name, equals('T'));
+  }
+
+  void test_visitConstructorDeclaration_external() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String className = "A";
+    ConstructorDeclaration constructorDeclaration = AstFactory
+        .constructorDeclaration2(
+            null,
+            null,
+            AstFactory.identifier3(className),
+            null,
+            AstFactory.formalParameterList(),
+            null,
+            AstFactory.blockFunctionBody2());
+    constructorDeclaration.externalKeyword =
+        TokenFactory.tokenFromKeyword(Keyword.EXTERNAL);
+    constructorDeclaration.accept(builder);
+    List<ConstructorElement> constructors = holder.constructors;
+    expect(constructors, hasLength(1));
+    ConstructorElement constructor = constructors[0];
+    expect(constructor, isNotNull);
+    expect(constructor.isExternal, isTrue);
+    expect(constructor.isFactory, isFalse);
+    expect(constructor.name, "");
+    expect(constructor.functions, hasLength(0));
+    expect(constructor.labels, hasLength(0));
+    expect(constructor.localVariables, hasLength(0));
+    expect(constructor.parameters, hasLength(0));
+  }
+
+  void test_visitConstructorDeclaration_factory() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String className = "A";
+    ConstructorDeclaration constructorDeclaration = AstFactory
+        .constructorDeclaration2(
+            null,
+            Keyword.FACTORY,
+            AstFactory.identifier3(className),
+            null,
+            AstFactory.formalParameterList(),
+            null,
+            AstFactory.blockFunctionBody2());
+    constructorDeclaration.accept(builder);
+    List<ConstructorElement> constructors = holder.constructors;
+    expect(constructors, hasLength(1));
+    ConstructorElement constructor = constructors[0];
+    expect(constructor, isNotNull);
+    expect(constructor.isExternal, isFalse);
+    expect(constructor.isFactory, isTrue);
+    expect(constructor.name, "");
+    expect(constructor.functions, hasLength(0));
+    expect(constructor.labels, hasLength(0));
+    expect(constructor.localVariables, hasLength(0));
+    expect(constructor.parameters, hasLength(0));
+  }
+
+  void test_visitConstructorDeclaration_minimal() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String className = "A";
+    ConstructorDeclaration constructorDeclaration = AstFactory
+        .constructorDeclaration2(
+            null,
+            null,
+            AstFactory.identifier3(className),
+            null,
+            AstFactory.formalParameterList(),
+            null,
+            AstFactory.blockFunctionBody2());
+    constructorDeclaration.accept(builder);
+    List<ConstructorElement> constructors = holder.constructors;
+    expect(constructors, hasLength(1));
+    ConstructorElement constructor = constructors[0];
+    expect(constructor, isNotNull);
+    expect(constructor.isExternal, isFalse);
+    expect(constructor.isFactory, isFalse);
+    expect(constructor.name, "");
+    expect(constructor.functions, hasLength(0));
+    expect(constructor.labels, hasLength(0));
+    expect(constructor.localVariables, hasLength(0));
+    expect(constructor.parameters, hasLength(0));
+  }
+
+  void test_visitConstructorDeclaration_named() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String className = "A";
+    String constructorName = "c";
+    ConstructorDeclaration constructorDeclaration = AstFactory
+        .constructorDeclaration2(
+            null,
+            null,
+            AstFactory.identifier3(className),
+            constructorName,
+            AstFactory.formalParameterList(),
+            null,
+            AstFactory.blockFunctionBody2());
+    constructorDeclaration.accept(builder);
+    List<ConstructorElement> constructors = holder.constructors;
+    expect(constructors, hasLength(1));
+    ConstructorElement constructor = constructors[0];
+    expect(constructor, isNotNull);
+    expect(constructor.isExternal, isFalse);
+    expect(constructor.isFactory, isFalse);
+    expect(constructor.name, constructorName);
+    expect(constructor.functions, hasLength(0));
+    expect(constructor.labels, hasLength(0));
+    expect(constructor.localVariables, hasLength(0));
+    expect(constructor.parameters, hasLength(0));
+    expect(constructorDeclaration.name.staticElement, same(constructor));
+    expect(constructorDeclaration.element, same(constructor));
+  }
+
+  void test_visitConstructorDeclaration_unnamed() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String className = "A";
+    ConstructorDeclaration constructorDeclaration = AstFactory
+        .constructorDeclaration2(
+            null,
+            null,
+            AstFactory.identifier3(className),
+            null,
+            AstFactory.formalParameterList(),
+            null,
+            AstFactory.blockFunctionBody2());
+    constructorDeclaration.accept(builder);
+    List<ConstructorElement> constructors = holder.constructors;
+    expect(constructors, hasLength(1));
+    ConstructorElement constructor = constructors[0];
+    expect(constructor, isNotNull);
+    expect(constructor.isExternal, isFalse);
+    expect(constructor.isFactory, isFalse);
+    expect(constructor.name, "");
+    expect(constructor.functions, hasLength(0));
+    expect(constructor.labels, hasLength(0));
+    expect(constructor.localVariables, hasLength(0));
+    expect(constructor.parameters, hasLength(0));
+    expect(constructorDeclaration.element, same(constructor));
+  }
+
+  void test_visitDeclaredIdentifier_noType() {
+    // var i
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    var variableName = 'i';
+    DeclaredIdentifier identifier =
+        AstFactory.declaredIdentifier3(variableName);
+    AstFactory.forEachStatement(
+        identifier, AstFactory.nullLiteral(), AstFactory.emptyStatement());
+    identifier.accept(builder);
+
+    List<LocalVariableElement> variables = holder.localVariables;
+    expect(variables, hasLength(1));
+    LocalVariableElement variable = variables[0];
+    expect(variable, isNotNull);
+    expect(variable.hasImplicitType, isTrue);
+    expect(variable.isConst, isFalse);
+    expect(variable.isDeprecated, isFalse);
+    expect(variable.isFinal, isFalse);
+    expect(variable.isOverride, isFalse);
+    expect(variable.isPrivate, isFalse);
+    expect(variable.isPublic, isTrue);
+    expect(variable.isSynthetic, isFalse);
+    expect(variable.name, variableName);
+  }
+
+  void test_visitDeclaredIdentifier_type() {
+    // E i
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    var variableName = 'i';
+    DeclaredIdentifier identifier =
+        AstFactory.declaredIdentifier4(AstFactory.typeName4('E'), variableName);
+    AstFactory.forEachStatement(
+        identifier, AstFactory.nullLiteral(), AstFactory.emptyStatement());
+    identifier.accept(builder);
+
+    List<LocalVariableElement> variables = holder.localVariables;
+    expect(variables, hasLength(1));
+    LocalVariableElement variable = variables[0];
+    expect(variable, isNotNull);
+    expect(variable.hasImplicitType, isFalse);
+    expect(variable.isConst, isFalse);
+    expect(variable.isDeprecated, isFalse);
+    expect(variable.isFinal, isFalse);
+    expect(variable.isOverride, isFalse);
+    expect(variable.isPrivate, isFalse);
+    expect(variable.isPublic, isTrue);
+    expect(variable.isSynthetic, isFalse);
+    expect(variable.name, variableName);
+  }
+
+  void test_visitDefaultFormalParameter_noType() {
+    // p = 0
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String parameterName = 'p';
+    DefaultFormalParameter formalParameter = AstFactory
+        .positionalFormalParameter(
+            AstFactory.simpleFormalParameter3(parameterName),
+            AstFactory.integer(0));
+    formalParameter.accept(builder);
+
+    List<ParameterElement> parameters = holder.parameters;
+    expect(parameters, hasLength(1));
+    ParameterElement parameter = parameters[0];
+    expect(parameter.hasImplicitType, isTrue);
+    expect(parameter.isConst, isFalse);
+    expect(parameter.isDeprecated, isFalse);
+    expect(parameter.isFinal, isFalse);
+    expect(parameter.isInitializingFormal, isFalse);
+    expect(parameter.isOverride, isFalse);
+    expect(parameter.isPrivate, isFalse);
+    expect(parameter.isPublic, isTrue);
+    expect(parameter.isSynthetic, isFalse);
+    expect(parameter.name, parameterName);
+  }
+
+  void test_visitDefaultFormalParameter_type() {
+    // E p = 0
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String parameterName = 'p';
+    DefaultFormalParameter formalParameter = AstFactory.namedFormalParameter(
+        AstFactory.simpleFormalParameter4(
+            AstFactory.typeName4('E'), parameterName),
+        AstFactory.integer(0));
+    formalParameter.accept(builder);
+
+    List<ParameterElement> parameters = holder.parameters;
+    expect(parameters, hasLength(1));
+    ParameterElement parameter = parameters[0];
+    expect(parameter.hasImplicitType, isFalse);
+    expect(parameter.isConst, isFalse);
+    expect(parameter.isDeprecated, isFalse);
+    expect(parameter.isFinal, isFalse);
+    expect(parameter.isInitializingFormal, isFalse);
+    expect(parameter.isOverride, isFalse);
+    expect(parameter.isPrivate, isFalse);
+    expect(parameter.isPublic, isTrue);
+    expect(parameter.isSynthetic, isFalse);
+    expect(parameter.name, parameterName);
+  }
+
+  void test_visitEnumDeclaration() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String enumName = "E";
+    EnumDeclaration enumDeclaration =
+        AstFactory.enumDeclaration2(enumName, ["ONE"]);
+    enumDeclaration.accept(builder);
+    List<ClassElement> enums = holder.enums;
+    expect(enums, hasLength(1));
+    ClassElement enumElement = enums[0];
+    expect(enumElement, isNotNull);
+    expect(enumElement.name, enumName);
+  }
+
+  void test_visitFieldDeclaration() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String firstFieldName = "x";
+    String secondFieldName = "y";
+    FieldDeclaration fieldDeclaration =
+        AstFactory.fieldDeclaration2(false, null, [
+      AstFactory.variableDeclaration(firstFieldName),
+      AstFactory.variableDeclaration(secondFieldName)
+    ]);
+    fieldDeclaration.accept(builder);
+    List<FieldElement> fields = holder.fields;
+    expect(fields, hasLength(2));
+    FieldElement firstField = fields[0];
+    expect(firstField, isNotNull);
+    expect(firstField.name, firstFieldName);
+    expect(firstField.initializer, isNull);
+    expect(firstField.isConst, isFalse);
+    expect(firstField.isFinal, isFalse);
+    expect(firstField.isSynthetic, isFalse);
+    FieldElement secondField = fields[1];
+    expect(secondField, isNotNull);
+    expect(secondField.name, secondFieldName);
+    expect(secondField.initializer, isNull);
+    expect(secondField.isConst, isFalse);
+    expect(secondField.isFinal, isFalse);
+    expect(secondField.isSynthetic, isFalse);
+  }
+
+  void test_visitFieldFormalParameter() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String parameterName = "p";
+    FieldFormalParameter formalParameter =
+        AstFactory.fieldFormalParameter(null, null, parameterName);
+    formalParameter.accept(builder);
+    List<ParameterElement> parameters = holder.parameters;
+    expect(parameters, hasLength(1));
+    ParameterElement parameter = parameters[0];
+    expect(parameter, isNotNull);
+    expect(parameter.name, parameterName);
+    expect(parameter.initializer, isNull);
+    expect(parameter.isConst, isFalse);
+    expect(parameter.isFinal, isFalse);
+    expect(parameter.isSynthetic, isFalse);
+    expect(parameter.parameterKind, ParameterKind.REQUIRED);
+    expect(parameter.parameters, hasLength(0));
+  }
+
+  void test_visitFieldFormalParameter_funtionTyped() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String parameterName = "p";
+    FieldFormalParameter formalParameter = AstFactory.fieldFormalParameter(
+        null,
+        null,
+        parameterName,
+        AstFactory
+            .formalParameterList([AstFactory.simpleFormalParameter3("a")]));
+    formalParameter.accept(builder);
+    List<ParameterElement> parameters = holder.parameters;
+    expect(parameters, hasLength(1));
+    ParameterElement parameter = parameters[0];
+    expect(parameter, isNotNull);
+    expect(parameter.name, parameterName);
+    expect(parameter.initializer, isNull);
+    expect(parameter.isConst, isFalse);
+    expect(parameter.isFinal, isFalse);
+    expect(parameter.isSynthetic, isFalse);
+    expect(parameter.parameterKind, ParameterKind.REQUIRED);
+    expect(parameter.parameters, hasLength(1));
+  }
+
+  void test_visitFormalParameterList() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String firstParameterName = "a";
+    String secondParameterName = "b";
+    FormalParameterList parameterList = AstFactory.formalParameterList([
+      AstFactory.simpleFormalParameter3(firstParameterName),
+      AstFactory.simpleFormalParameter3(secondParameterName)
+    ]);
+    parameterList.accept(builder);
+    List<ParameterElement> parameters = holder.parameters;
+    expect(parameters, hasLength(2));
+    expect(parameters[0].name, firstParameterName);
+    expect(parameters[1].name, secondParameterName);
+  }
+
+  void test_visitFunctionDeclaration_external() {
+    // external f();
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String functionName = "f";
+    FunctionDeclaration declaration = AstFactory.functionDeclaration(
+        null,
+        null,
+        functionName,
+        AstFactory.functionExpression2(
+            AstFactory.formalParameterList(), AstFactory.emptyFunctionBody()));
+    declaration.externalKeyword =
+        TokenFactory.tokenFromKeyword(Keyword.EXTERNAL);
+    declaration.accept(builder);
+
+    List<FunctionElement> functions = holder.functions;
+    expect(functions, hasLength(1));
+    FunctionElement function = functions[0];
+    expect(function, isNotNull);
+    expect(function.name, functionName);
+    expect(declaration.element, same(function));
+    expect(declaration.functionExpression.element, same(function));
+    expect(function.hasImplicitReturnType, isTrue);
+    expect(function.isExternal, isTrue);
+    expect(function.isSynthetic, isFalse);
+    expect(function.typeParameters, hasLength(0));
+  }
+
+  void test_visitFunctionDeclaration_getter() {
+    // get f() {}
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String functionName = "f";
+    FunctionDeclaration declaration = AstFactory.functionDeclaration(
+        null,
+        Keyword.GET,
+        functionName,
+        AstFactory.functionExpression2(
+            AstFactory.formalParameterList(), AstFactory.blockFunctionBody2()));
+    declaration.accept(builder);
+
+    List<PropertyAccessorElement> accessors = holder.accessors;
+    expect(accessors, hasLength(1));
+    PropertyAccessorElement accessor = accessors[0];
+    expect(accessor, isNotNull);
+    expect(accessor.name, functionName);
+    expect(declaration.element, same(accessor));
+    expect(declaration.functionExpression.element, same(accessor));
+    expect(accessor.hasImplicitReturnType, isTrue);
+    expect(accessor.isGetter, isTrue);
+    expect(accessor.isExternal, isFalse);
+    expect(accessor.isSetter, isFalse);
+    expect(accessor.isSynthetic, isFalse);
+    expect(accessor.typeParameters, hasLength(0));
+    PropertyInducingElement variable = accessor.variable;
+    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableElement,
+        TopLevelVariableElement, variable);
+    expect(variable.isSynthetic, isTrue);
+  }
+
+  void test_visitFunctionDeclaration_plain() {
+    // T f() {}
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String functionName = "f";
+    FunctionDeclaration declaration = AstFactory.functionDeclaration(
+        AstFactory.typeName4('T'),
+        null,
+        functionName,
+        AstFactory.functionExpression2(
+            AstFactory.formalParameterList(), AstFactory.blockFunctionBody2()));
+    declaration.accept(builder);
+
+    List<FunctionElement> functions = holder.functions;
+    expect(functions, hasLength(1));
+    FunctionElement function = functions[0];
+    expect(function, isNotNull);
+    expect(function.hasImplicitReturnType, isFalse);
+    expect(function.name, functionName);
+    expect(declaration.element, same(function));
+    expect(declaration.functionExpression.element, same(function));
+    expect(function.isExternal, isFalse);
+    expect(function.isSynthetic, isFalse);
+    expect(function.typeParameters, hasLength(0));
+  }
+
+  void test_visitFunctionDeclaration_setter() {
+    // set f() {}
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String functionName = "f";
+    FunctionDeclaration declaration = AstFactory.functionDeclaration(
+        null,
+        Keyword.SET,
+        functionName,
+        AstFactory.functionExpression2(
+            AstFactory.formalParameterList(), AstFactory.blockFunctionBody2()));
+    declaration.accept(builder);
+
+    List<PropertyAccessorElement> accessors = holder.accessors;
+    expect(accessors, hasLength(1));
+    PropertyAccessorElement accessor = accessors[0];
+    expect(accessor, isNotNull);
+    expect(accessor.hasImplicitReturnType, isFalse);
+    expect(accessor.name, "$functionName=");
+    expect(declaration.element, same(accessor));
+    expect(declaration.functionExpression.element, same(accessor));
+    expect(accessor.isGetter, isFalse);
+    expect(accessor.isExternal, isFalse);
+    expect(accessor.isSetter, isTrue);
+    expect(accessor.isSynthetic, isFalse);
+    expect(accessor.typeParameters, hasLength(0));
+    PropertyInducingElement variable = accessor.variable;
+    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableElement,
+        TopLevelVariableElement, variable);
+    expect(variable.isSynthetic, isTrue);
+  }
+
+  void test_visitFunctionDeclaration_typeParameters() {
+    // f<E>() {}
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String functionName = 'f';
+    String typeParameterName = 'E';
+    FunctionExpression expression = AstFactory.functionExpression3(
+        AstFactory.typeParameterList([typeParameterName]),
+        AstFactory.formalParameterList(),
+        AstFactory.blockFunctionBody2());
+    FunctionDeclaration declaration =
+        AstFactory.functionDeclaration(null, null, functionName, expression);
+    declaration.accept(builder);
+
+    List<FunctionElement> functions = holder.functions;
+    expect(functions, hasLength(1));
+    FunctionElement function = functions[0];
+    expect(function, isNotNull);
+    expect(function.hasImplicitReturnType, isTrue);
+    expect(function.name, functionName);
+    expect(function.isExternal, isFalse);
+    expect(function.isSynthetic, isFalse);
+    expect(declaration.element, same(function));
+    expect(expression.element, same(function));
+    List<TypeParameterElement> typeParameters = function.typeParameters;
+    expect(typeParameters, hasLength(1));
+    TypeParameterElement typeParameter = typeParameters[0];
+    expect(typeParameter, isNotNull);
+    expect(typeParameter.name, typeParameterName);
+  }
+
+  void test_visitFunctionExpression() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    FunctionExpression expression = AstFactory.functionExpression2(
+        AstFactory.formalParameterList(), AstFactory.blockFunctionBody2());
+    expression.accept(builder);
+    List<FunctionElement> functions = holder.functions;
+    expect(functions, hasLength(1));
+    FunctionElement function = functions[0];
+    expect(function, isNotNull);
+    expect(expression.element, same(function));
+    expect(function.hasImplicitReturnType, isTrue);
+    expect(function.isSynthetic, isFalse);
+    expect(function.typeParameters, hasLength(0));
+  }
+
+  void test_visitFunctionTypeAlias() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String aliasName = "F";
+    String parameterName = "E";
+    FunctionTypeAlias aliasNode = AstFactory.typeAlias(
+        null, aliasName, AstFactory.typeParameterList([parameterName]), null);
+    aliasNode.accept(builder);
+    List<FunctionTypeAliasElement> aliases = holder.typeAliases;
+    expect(aliases, hasLength(1));
+    FunctionTypeAliasElement alias = aliases[0];
+    expect(alias, isNotNull);
+    expect(alias.name, aliasName);
+    expect(alias.parameters, hasLength(0));
+    List<TypeParameterElement> typeParameters = alias.typeParameters;
+    expect(typeParameters, hasLength(1));
+    TypeParameterElement typeParameter = typeParameters[0];
+    expect(typeParameter, isNotNull);
+    expect(typeParameter.name, parameterName);
+  }
+
+  void test_visitFunctionTypedFormalParameter() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String parameterName = "p";
+    FunctionTypedFormalParameter formalParameter =
+        AstFactory.functionTypedFormalParameter(null, parameterName);
+    _useParameterInMethod(formalParameter, 100, 110);
+    formalParameter.accept(builder);
+    List<ParameterElement> parameters = holder.parameters;
+    expect(parameters, hasLength(1));
+    ParameterElement parameter = parameters[0];
+    expect(parameter, isNotNull);
+    expect(parameter.name, parameterName);
+    expect(parameter.initializer, isNull);
+    expect(parameter.isConst, isFalse);
+    expect(parameter.isFinal, isFalse);
+    expect(parameter.isSynthetic, isFalse);
+    expect(parameter.parameterKind, ParameterKind.REQUIRED);
+    SourceRange visibleRange = parameter.visibleRange;
+    expect(100, visibleRange.offset);
+    expect(110, visibleRange.end);
+  }
+
+  void test_visitFunctionTypedFormalParameter_withTypeParameters() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String parameterName = "p";
+    FunctionTypedFormalParameter formalParameter =
+        AstFactory.functionTypedFormalParameter(null, parameterName);
+    formalParameter.typeParameters = AstFactory.typeParameterList(['F']);
+    _useParameterInMethod(formalParameter, 100, 110);
+    formalParameter.accept(builder);
+    List<ParameterElement> parameters = holder.parameters;
+    expect(parameters, hasLength(1));
+    ParameterElement parameter = parameters[0];
+    expect(parameter, isNotNull);
+    expect(parameter.name, parameterName);
+    expect(parameter.initializer, isNull);
+    expect(parameter.isConst, isFalse);
+    expect(parameter.isFinal, isFalse);
+    expect(parameter.isSynthetic, isFalse);
+    expect(parameter.parameterKind, ParameterKind.REQUIRED);
+    expect(parameter.typeParameters, hasLength(1));
+    SourceRange visibleRange = parameter.visibleRange;
+    expect(100, visibleRange.offset);
+    expect(110, visibleRange.end);
+  }
+
+  void test_visitLabeledStatement() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String labelName = "l";
+    LabeledStatement statement = AstFactory.labeledStatement(
+        [AstFactory.label2(labelName)], AstFactory.breakStatement());
+    statement.accept(builder);
+    List<LabelElement> labels = holder.labels;
+    expect(labels, hasLength(1));
+    LabelElement label = labels[0];
+    expect(label, isNotNull);
+    expect(label.name, labelName);
+    expect(label.isSynthetic, isFalse);
+  }
+
+  void test_visitMethodDeclaration_abstract() {
+    // m();
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String methodName = "m";
+    MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2(
+        null,
+        null,
+        null,
+        null,
+        AstFactory.identifier3(methodName),
+        AstFactory.formalParameterList(),
+        AstFactory.emptyFunctionBody());
+    methodDeclaration.accept(builder);
+
+    List<MethodElement> methods = holder.methods;
+    expect(methods, hasLength(1));
+    MethodElement method = methods[0];
+    expect(method, isNotNull);
+    expect(method.hasImplicitReturnType, isTrue);
+    expect(method.name, methodName);
+    expect(method.functions, hasLength(0));
+    expect(method.labels, hasLength(0));
+    expect(method.localVariables, hasLength(0));
+    expect(method.parameters, hasLength(0));
+    expect(method.typeParameters, hasLength(0));
+    expect(method.isAbstract, isTrue);
+    expect(method.isExternal, isFalse);
+    expect(method.isStatic, isFalse);
+    expect(method.isSynthetic, isFalse);
+  }
+
+  void test_visitMethodDeclaration_external() {
+    // external m();
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String methodName = "m";
+    MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2(
+        null,
+        null,
+        null,
+        null,
+        AstFactory.identifier3(methodName),
+        AstFactory.formalParameterList(),
+        AstFactory.emptyFunctionBody());
+    methodDeclaration.externalKeyword =
+        TokenFactory.tokenFromKeyword(Keyword.EXTERNAL);
+    methodDeclaration.accept(builder);
+
+    List<MethodElement> methods = holder.methods;
+    expect(methods, hasLength(1));
+    MethodElement method = methods[0];
+    expect(method, isNotNull);
+    expect(method.hasImplicitReturnType, isTrue);
+    expect(method.name, methodName);
+    expect(method.functions, hasLength(0));
+    expect(method.labels, hasLength(0));
+    expect(method.localVariables, hasLength(0));
+    expect(method.parameters, hasLength(0));
+    expect(method.typeParameters, hasLength(0));
+    expect(method.isAbstract, isFalse);
+    expect(method.isExternal, isTrue);
+    expect(method.isStatic, isFalse);
+    expect(method.isSynthetic, isFalse);
+  }
+
+  void test_visitMethodDeclaration_getter() {
+    // get m() {}
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String methodName = "m";
+    MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2(
+        null,
+        null,
+        Keyword.GET,
+        null,
+        AstFactory.identifier3(methodName),
+        AstFactory.formalParameterList(),
+        AstFactory.blockFunctionBody2());
+    methodDeclaration.accept(builder);
+
+    List<FieldElement> fields = holder.fields;
+    expect(fields, hasLength(1));
+    FieldElement field = fields[0];
+    expect(field, isNotNull);
+    expect(field.name, methodName);
+    expect(field.isSynthetic, isTrue);
+    expect(field.setter, isNull);
+    PropertyAccessorElement getter = field.getter;
+    expect(getter, isNotNull);
+    expect(getter.hasImplicitReturnType, isTrue);
+    expect(getter.isAbstract, isFalse);
+    expect(getter.isExternal, isFalse);
+    expect(getter.isGetter, isTrue);
+    expect(getter.isSynthetic, isFalse);
+    expect(getter.name, methodName);
+    expect(getter.variable, field);
+    expect(getter.functions, hasLength(0));
+    expect(getter.labels, hasLength(0));
+    expect(getter.localVariables, hasLength(0));
+    expect(getter.parameters, hasLength(0));
+  }
+
+  void test_visitMethodDeclaration_getter_abstract() {
+    // get m();
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String methodName = "m";
+    MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2(
+        null,
+        null,
+        Keyword.GET,
+        null,
+        AstFactory.identifier3(methodName),
+        AstFactory.formalParameterList(),
+        AstFactory.emptyFunctionBody());
+    methodDeclaration.accept(builder);
+
+    List<FieldElement> fields = holder.fields;
+    expect(fields, hasLength(1));
+    FieldElement field = fields[0];
+    expect(field, isNotNull);
+    expect(field.name, methodName);
+    expect(field.isSynthetic, isTrue);
+    expect(field.setter, isNull);
+    PropertyAccessorElement getter = field.getter;
+    expect(getter, isNotNull);
+    expect(getter.hasImplicitReturnType, isTrue);
+    expect(getter.isAbstract, isTrue);
+    expect(getter.isExternal, isFalse);
+    expect(getter.isGetter, isTrue);
+    expect(getter.isSynthetic, isFalse);
+    expect(getter.name, methodName);
+    expect(getter.variable, field);
+    expect(getter.functions, hasLength(0));
+    expect(getter.labels, hasLength(0));
+    expect(getter.localVariables, hasLength(0));
+    expect(getter.parameters, hasLength(0));
+  }
+
+  void test_visitMethodDeclaration_getter_external() {
+    // external get m();
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String methodName = "m";
+    MethodDeclaration methodDeclaration = AstFactory.methodDeclaration(
+        null,
+        null,
+        Keyword.GET,
+        null,
+        AstFactory.identifier3(methodName),
+        AstFactory.formalParameterList());
+    methodDeclaration.externalKeyword =
+        TokenFactory.tokenFromKeyword(Keyword.EXTERNAL);
+    methodDeclaration.accept(builder);
+
+    List<FieldElement> fields = holder.fields;
+    expect(fields, hasLength(1));
+    FieldElement field = fields[0];
+    expect(field, isNotNull);
+    expect(field.name, methodName);
+    expect(field.isSynthetic, isTrue);
+    expect(field.setter, isNull);
+    PropertyAccessorElement getter = field.getter;
+    expect(getter, isNotNull);
+    expect(getter.hasImplicitReturnType, isTrue);
+    expect(getter.isAbstract, isFalse);
+    expect(getter.isExternal, isTrue);
+    expect(getter.isGetter, isTrue);
+    expect(getter.isSynthetic, isFalse);
+    expect(getter.name, methodName);
+    expect(getter.variable, field);
+    expect(getter.functions, hasLength(0));
+    expect(getter.labels, hasLength(0));
+    expect(getter.localVariables, hasLength(0));
+    expect(getter.parameters, hasLength(0));
+  }
+
+  void test_visitMethodDeclaration_minimal() {
+    // T m() {}
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String methodName = "m";
+    MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2(
+        null,
+        AstFactory.typeName4('T'),
+        null,
+        null,
+        AstFactory.identifier3(methodName),
+        AstFactory.formalParameterList(),
+        AstFactory.blockFunctionBody2());
+    methodDeclaration.accept(builder);
+    List<MethodElement> methods = holder.methods;
+    expect(methods, hasLength(1));
+    MethodElement method = methods[0];
+    expect(method, isNotNull);
+    expect(method.hasImplicitReturnType, isFalse);
+    expect(method.name, methodName);
+    expect(method.functions, hasLength(0));
+    expect(method.labels, hasLength(0));
+    expect(method.localVariables, hasLength(0));
+    expect(method.parameters, hasLength(0));
+    expect(method.typeParameters, hasLength(0));
+    expect(method.isAbstract, isFalse);
+    expect(method.isExternal, isFalse);
+    expect(method.isStatic, isFalse);
+    expect(method.isSynthetic, isFalse);
+  }
+
+  void test_visitMethodDeclaration_operator() {
+    // operator +(addend) {}
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String methodName = "+";
+    MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2(
+        null,
+        null,
+        null,
+        Keyword.OPERATOR,
+        AstFactory.identifier3(methodName),
+        AstFactory
+            .formalParameterList([AstFactory.simpleFormalParameter3("addend")]),
+        AstFactory.blockFunctionBody2());
+    methodDeclaration.accept(builder);
+
+    List<MethodElement> methods = holder.methods;
+    expect(methods, hasLength(1));
+    MethodElement method = methods[0];
+    expect(method, isNotNull);
+    expect(method.hasImplicitReturnType, isTrue);
+    expect(method.name, methodName);
+    expect(method.functions, hasLength(0));
+    expect(method.labels, hasLength(0));
+    expect(method.localVariables, hasLength(0));
+    expect(method.parameters, hasLength(1));
+    expect(method.typeParameters, hasLength(0));
+    expect(method.isAbstract, isFalse);
+    expect(method.isExternal, isFalse);
+    expect(method.isStatic, isFalse);
+    expect(method.isSynthetic, isFalse);
+  }
+
+  void test_visitMethodDeclaration_setter() {
+    // set m() {}
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String methodName = "m";
+    MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2(
+        null,
+        null,
+        Keyword.SET,
+        null,
+        AstFactory.identifier3(methodName),
+        AstFactory.formalParameterList(),
+        AstFactory.blockFunctionBody2());
+    methodDeclaration.accept(builder);
+
+    List<FieldElement> fields = holder.fields;
+    expect(fields, hasLength(1));
+    FieldElement field = fields[0];
+    expect(field, isNotNull);
+    expect(field.name, methodName);
+    expect(field.isSynthetic, isTrue);
+    expect(field.getter, isNull);
+    PropertyAccessorElement setter = field.setter;
+    expect(setter, isNotNull);
+    expect(setter.hasImplicitReturnType, isFalse);
+    expect(setter.isAbstract, isFalse);
+    expect(setter.isExternal, isFalse);
+    expect(setter.isSetter, isTrue);
+    expect(setter.isSynthetic, isFalse);
+    expect(setter.name, "$methodName=");
+    expect(setter.displayName, methodName);
+    expect(setter.variable, field);
+    expect(setter.functions, hasLength(0));
+    expect(setter.labels, hasLength(0));
+    expect(setter.localVariables, hasLength(0));
+    expect(setter.parameters, hasLength(0));
+  }
+
+  void test_visitMethodDeclaration_setter_abstract() {
+    // set m();
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String methodName = "m";
+    MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2(
+        null,
+        null,
+        Keyword.SET,
+        null,
+        AstFactory.identifier3(methodName),
+        AstFactory.formalParameterList(),
+        AstFactory.emptyFunctionBody());
+    methodDeclaration.accept(builder);
+
+    List<FieldElement> fields = holder.fields;
+    expect(fields, hasLength(1));
+    FieldElement field = fields[0];
+    expect(field, isNotNull);
+    expect(field.name, methodName);
+    expect(field.isSynthetic, isTrue);
+    expect(field.getter, isNull);
+    PropertyAccessorElement setter = field.setter;
+    expect(setter, isNotNull);
+    expect(setter.hasImplicitReturnType, isFalse);
+    expect(setter.isAbstract, isTrue);
+    expect(setter.isExternal, isFalse);
+    expect(setter.isSetter, isTrue);
+    expect(setter.isSynthetic, isFalse);
+    expect(setter.name, "$methodName=");
+    expect(setter.displayName, methodName);
+    expect(setter.variable, field);
+    expect(setter.functions, hasLength(0));
+    expect(setter.labels, hasLength(0));
+    expect(setter.localVariables, hasLength(0));
+    expect(setter.parameters, hasLength(0));
+  }
+
+  void test_visitMethodDeclaration_setter_external() {
+    // external m();
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String methodName = "m";
+    MethodDeclaration methodDeclaration = AstFactory.methodDeclaration(
+        null,
+        null,
+        Keyword.SET,
+        null,
+        AstFactory.identifier3(methodName),
+        AstFactory.formalParameterList());
+    methodDeclaration.externalKeyword =
+        TokenFactory.tokenFromKeyword(Keyword.EXTERNAL);
+    methodDeclaration.accept(builder);
+
+    List<FieldElement> fields = holder.fields;
+    expect(fields, hasLength(1));
+    FieldElement field = fields[0];
+    expect(field, isNotNull);
+    expect(field.name, methodName);
+    expect(field.isSynthetic, isTrue);
+    expect(field.getter, isNull);
+    PropertyAccessorElement setter = field.setter;
+    expect(setter, isNotNull);
+    expect(setter.hasImplicitReturnType, isFalse);
+    expect(setter.isAbstract, isFalse);
+    expect(setter.isExternal, isTrue);
+    expect(setter.isSetter, isTrue);
+    expect(setter.isSynthetic, isFalse);
+    expect(setter.name, "$methodName=");
+    expect(setter.displayName, methodName);
+    expect(setter.variable, field);
+    expect(setter.functions, hasLength(0));
+    expect(setter.labels, hasLength(0));
+    expect(setter.localVariables, hasLength(0));
+    expect(setter.parameters, hasLength(0));
+  }
+
+  void test_visitMethodDeclaration_static() {
+    // static m() {}
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String methodName = "m";
+    MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2(
+        Keyword.STATIC,
+        null,
+        null,
+        null,
+        AstFactory.identifier3(methodName),
+        AstFactory.formalParameterList(),
+        AstFactory.blockFunctionBody2());
+    methodDeclaration.accept(builder);
+    List<MethodElement> methods = holder.methods;
+    expect(methods, hasLength(1));
+    MethodElement method = methods[0];
+    expect(method, isNotNull);
+    expect(method.hasImplicitReturnType, isTrue);
+    expect(method.name, methodName);
+    expect(method.functions, hasLength(0));
+    expect(method.labels, hasLength(0));
+    expect(method.localVariables, hasLength(0));
+    expect(method.parameters, hasLength(0));
+    expect(method.typeParameters, hasLength(0));
+    expect(method.isAbstract, isFalse);
+    expect(method.isExternal, isFalse);
+    expect(method.isStatic, isTrue);
+    expect(method.isSynthetic, isFalse);
+  }
+
+  void test_visitMethodDeclaration_typeParameters() {
+    // m<E>() {}
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String methodName = "m";
+    MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2(
+        null,
+        null,
+        null,
+        null,
+        AstFactory.identifier3(methodName),
+        AstFactory.formalParameterList(),
+        AstFactory.blockFunctionBody2());
+    methodDeclaration.typeParameters = AstFactory.typeParameterList(['E']);
+    methodDeclaration.accept(builder);
+
+    List<MethodElement> methods = holder.methods;
+    expect(methods, hasLength(1));
+    MethodElement method = methods[0];
+    expect(method, isNotNull);
+    expect(method.hasImplicitReturnType, isTrue);
+    expect(method.name, methodName);
+    expect(method.functions, hasLength(0));
+    expect(method.labels, hasLength(0));
+    expect(method.localVariables, hasLength(0));
+    expect(method.parameters, hasLength(0));
+    expect(method.typeParameters, hasLength(1));
+    expect(method.isAbstract, isFalse);
+    expect(method.isExternal, isFalse);
+    expect(method.isStatic, isFalse);
+    expect(method.isSynthetic, isFalse);
+  }
+
+  void test_visitMethodDeclaration_withMembers() {
+    // m(p) { var v; try { l: return; } catch (e) {} }
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String methodName = "m";
+    String parameterName = "p";
+    String localVariableName = "v";
+    String labelName = "l";
+    String exceptionParameterName = "e";
+    MethodDeclaration methodDeclaration = AstFactory.methodDeclaration2(
+        null,
+        null,
+        null,
+        null,
+        AstFactory.identifier3(methodName),
+        AstFactory.formalParameterList(
+            [AstFactory.simpleFormalParameter3(parameterName)]),
+        AstFactory.blockFunctionBody2([
+          AstFactory.variableDeclarationStatement2(
+              Keyword.VAR, [AstFactory.variableDeclaration(localVariableName)]),
+          AstFactory.tryStatement2(
+              AstFactory.block([
+                AstFactory.labeledStatement([AstFactory.label2(labelName)],
+                    AstFactory.returnStatement())
+              ]),
+              [AstFactory.catchClause(exceptionParameterName)])
+        ]));
+    methodDeclaration.accept(builder);
+
+    List<MethodElement> methods = holder.methods;
+    expect(methods, hasLength(1));
+    MethodElement method = methods[0];
+    expect(method, isNotNull);
+    expect(method.hasImplicitReturnType, isTrue);
+    expect(method.name, methodName);
+    expect(method.typeParameters, hasLength(0));
+    expect(method.isAbstract, isFalse);
+    expect(method.isExternal, isFalse);
+    expect(method.isStatic, isFalse);
+    expect(method.isSynthetic, isFalse);
+    List<VariableElement> parameters = method.parameters;
+    expect(parameters, hasLength(1));
+    VariableElement parameter = parameters[0];
+    expect(parameter, isNotNull);
+    expect(parameter.name, parameterName);
+    List<VariableElement> localVariables = method.localVariables;
+    expect(localVariables, hasLength(2));
+    VariableElement firstVariable = localVariables[0];
+    VariableElement secondVariable = localVariables[1];
+    expect(firstVariable, isNotNull);
+    expect(secondVariable, isNotNull);
+    expect(
+        (firstVariable.name == localVariableName &&
+                secondVariable.name == exceptionParameterName) ||
+            (firstVariable.name == exceptionParameterName &&
+                secondVariable.name == localVariableName),
+        isTrue);
+    List<LabelElement> labels = method.labels;
+    expect(labels, hasLength(1));
+    LabelElement label = labels[0];
+    expect(label, isNotNull);
+    expect(label.name, labelName);
+  }
+
+  void test_visitNamedFormalParameter() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String parameterName = "p";
+    DefaultFormalParameter formalParameter = AstFactory.namedFormalParameter(
+        AstFactory.simpleFormalParameter3(parameterName),
+        AstFactory.identifier3("42"));
+    _useParameterInMethod(formalParameter, 100, 110);
+    formalParameter.accept(builder);
+    List<ParameterElement> parameters = holder.parameters;
+    expect(parameters, hasLength(1));
+    ParameterElement parameter = parameters[0];
+    expect(parameter, isNotNull);
+    expect(parameter.name, parameterName);
+    expect(parameter.isConst, isFalse);
+    expect(parameter.isFinal, isFalse);
+    expect(parameter.isSynthetic, isFalse);
+    expect(parameter.parameterKind, ParameterKind.NAMED);
+    {
+      SourceRange visibleRange = parameter.visibleRange;
+      expect(100, visibleRange.offset);
+      expect(110, visibleRange.end);
+    }
+    expect(parameter.defaultValueCode, "42");
+    FunctionElement initializer = parameter.initializer;
+    expect(initializer, isNotNull);
+    expect(initializer.isSynthetic, isTrue);
+  }
+
+  void test_visitSimpleFormalParameter_noType() {
+    // p
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String parameterName = "p";
+    SimpleFormalParameter formalParameter =
+        AstFactory.simpleFormalParameter3(parameterName);
+    _useParameterInMethod(formalParameter, 100, 110);
+    formalParameter.accept(builder);
+    List<ParameterElement> parameters = holder.parameters;
+    expect(parameters, hasLength(1));
+    ParameterElement parameter = parameters[0];
+    expect(parameter, isNotNull);
+    expect(parameter.hasImplicitType, isTrue);
+    expect(parameter.initializer, isNull);
+    expect(parameter.isConst, isFalse);
+    expect(parameter.isFinal, isFalse);
+    expect(parameter.isSynthetic, isFalse);
+    expect(parameter.name, parameterName);
+    expect(parameter.parameterKind, ParameterKind.REQUIRED);
+    {
+      SourceRange visibleRange = parameter.visibleRange;
+      expect(100, visibleRange.offset);
+      expect(110, visibleRange.end);
+    }
+  }
+
+  void test_visitSimpleFormalParameter_type() {
+    // T p
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String parameterName = "p";
+    SimpleFormalParameter formalParameter = AstFactory.simpleFormalParameter4(
+        AstFactory.typeName4('T'), parameterName);
+    _useParameterInMethod(formalParameter, 100, 110);
+    formalParameter.accept(builder);
+    List<ParameterElement> parameters = holder.parameters;
+    expect(parameters, hasLength(1));
+    ParameterElement parameter = parameters[0];
+    expect(parameter, isNotNull);
+    expect(parameter.hasImplicitType, isFalse);
+    expect(parameter.initializer, isNull);
+    expect(parameter.isConst, isFalse);
+    expect(parameter.isFinal, isFalse);
+    expect(parameter.isSynthetic, isFalse);
+    expect(parameter.name, parameterName);
+    expect(parameter.parameterKind, ParameterKind.REQUIRED);
+    {
+      SourceRange visibleRange = parameter.visibleRange;
+      expect(100, visibleRange.offset);
+      expect(110, visibleRange.end);
+    }
+  }
+
+  void test_visitTypeAlias_minimal() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String aliasName = "F";
+    TypeAlias typeAlias = AstFactory.typeAlias(null, aliasName, null, null);
+    typeAlias.accept(builder);
+    List<FunctionTypeAliasElement> aliases = holder.typeAliases;
+    expect(aliases, hasLength(1));
+    FunctionTypeAliasElement alias = aliases[0];
+    expect(alias, isNotNull);
+    expect(alias.name, aliasName);
+    expect(alias.type, isNotNull);
+    expect(alias.isSynthetic, isFalse);
+  }
+
+  void test_visitTypeAlias_withFormalParameters() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String aliasName = "F";
+    String firstParameterName = "x";
+    String secondParameterName = "y";
+    TypeAlias typeAlias = AstFactory.typeAlias(
+        null,
+        aliasName,
+        AstFactory.typeParameterList(),
+        AstFactory.formalParameterList([
+          AstFactory.simpleFormalParameter3(firstParameterName),
+          AstFactory.simpleFormalParameter3(secondParameterName)
+        ]));
+    typeAlias.accept(builder);
+    List<FunctionTypeAliasElement> aliases = holder.typeAliases;
+    expect(aliases, hasLength(1));
+    FunctionTypeAliasElement alias = aliases[0];
+    expect(alias, isNotNull);
+    expect(alias.name, aliasName);
+    expect(alias.type, isNotNull);
+    expect(alias.isSynthetic, isFalse);
+    List<VariableElement> parameters = alias.parameters;
+    expect(parameters, hasLength(2));
+    expect(parameters[0].name, firstParameterName);
+    expect(parameters[1].name, secondParameterName);
+    List<TypeParameterElement> typeParameters = alias.typeParameters;
+    expect(typeParameters, isNotNull);
+    expect(typeParameters, hasLength(0));
+  }
+
+  void test_visitTypeAlias_withTypeParameters() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String aliasName = "F";
+    String firstTypeParameterName = "A";
+    String secondTypeParameterName = "B";
+    TypeAlias typeAlias = AstFactory.typeAlias(
+        null,
+        aliasName,
+        AstFactory.typeParameterList(
+            [firstTypeParameterName, secondTypeParameterName]),
+        AstFactory.formalParameterList());
+    typeAlias.accept(builder);
+    List<FunctionTypeAliasElement> aliases = holder.typeAliases;
+    expect(aliases, hasLength(1));
+    FunctionTypeAliasElement alias = aliases[0];
+    expect(alias, isNotNull);
+    expect(alias.name, aliasName);
+    expect(alias.type, isNotNull);
+    expect(alias.isSynthetic, isFalse);
+    List<VariableElement> parameters = alias.parameters;
+    expect(parameters, isNotNull);
+    expect(parameters, hasLength(0));
+    List<TypeParameterElement> typeParameters = alias.typeParameters;
+    expect(typeParameters, hasLength(2));
+    expect(typeParameters[0].name, firstTypeParameterName);
+    expect(typeParameters[1].name, secondTypeParameterName);
+  }
+
+  void test_visitTypeParameter() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String parameterName = "E";
+    TypeParameter typeParameter = AstFactory.typeParameter(parameterName);
+    typeParameter.accept(builder);
+    List<TypeParameterElement> typeParameters = holder.typeParameters;
+    expect(typeParameters, hasLength(1));
+    TypeParameterElement typeParameterElement = typeParameters[0];
+    expect(typeParameterElement, isNotNull);
+    expect(typeParameterElement.name, parameterName);
+    expect(typeParameterElement.bound, isNull);
+    expect(typeParameterElement.isSynthetic, isFalse);
+  }
+
+  void test_visitVariableDeclaration_inConstructor() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    //
+    // C() {var v;}
+    //
+    String variableName = "v";
+    VariableDeclaration variable =
+        AstFactory.variableDeclaration2(variableName, null);
+    Statement statement =
+        AstFactory.variableDeclarationStatement2(null, [variable]);
+    ConstructorDeclaration constructor = AstFactory.constructorDeclaration2(
+        null,
+        null,
+        AstFactory.identifier3("C"),
+        "C",
+        AstFactory.formalParameterList(),
+        null,
+        AstFactory.blockFunctionBody2([statement]));
+    constructor.accept(builder);
+
+    List<ConstructorElement> constructors = holder.constructors;
+    expect(constructors, hasLength(1));
+    List<LocalVariableElement> variableElements =
+        constructors[0].localVariables;
+    expect(variableElements, hasLength(1));
+    LocalVariableElement variableElement = variableElements[0];
+    expect(variableElement.hasImplicitType, isTrue);
+    expect(variableElement.name, variableName);
+  }
+
+  void test_visitVariableDeclaration_inMethod() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    //
+    // m() {T v;}
+    //
+    String variableName = "v";
+    VariableDeclaration variable =
+        AstFactory.variableDeclaration2(variableName, null);
+    Statement statement = AstFactory.variableDeclarationStatement(
+        null, AstFactory.typeName4('T'), [variable]);
+    MethodDeclaration method = AstFactory.methodDeclaration2(
+        null,
+        null,
+        null,
+        null,
+        AstFactory.identifier3("m"),
+        AstFactory.formalParameterList(),
+        AstFactory.blockFunctionBody2([statement]));
+    method.accept(builder);
+
+    List<MethodElement> methods = holder.methods;
+    expect(methods, hasLength(1));
+    List<LocalVariableElement> variableElements = methods[0].localVariables;
+    expect(variableElements, hasLength(1));
+    LocalVariableElement variableElement = variableElements[0];
+    expect(variableElement.hasImplicitType, isFalse);
+    expect(variableElement.name, variableName);
+  }
+
+  void test_visitVariableDeclaration_localNestedInFunction() {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    //
+    // var f = () {var v;};
+    //
+    String variableName = "v";
+    VariableDeclaration variable =
+        AstFactory.variableDeclaration2(variableName, null);
+    Statement statement =
+        AstFactory.variableDeclarationStatement2(null, [variable]);
+    Expression initializer = AstFactory.functionExpression2(
+        AstFactory.formalParameterList(),
+        AstFactory.blockFunctionBody2([statement]));
+    String fieldName = "f";
+    VariableDeclaration field =
+        AstFactory.variableDeclaration2(fieldName, initializer);
+    FieldDeclaration fieldDeclaration =
+        AstFactory.fieldDeclaration2(false, null, [field]);
+    fieldDeclaration.accept(builder);
+
+    List<FieldElement> variables = holder.fields;
+    expect(variables, hasLength(1));
+    FieldElement fieldElement = variables[0];
+    expect(fieldElement, isNotNull);
+    FunctionElement initializerElement = fieldElement.initializer;
+    expect(initializerElement, isNotNull);
+    List<FunctionElement> functionElements = initializerElement.functions;
+    expect(functionElements, hasLength(1));
+    List<LocalVariableElement> variableElements =
+        functionElements[0].localVariables;
+    expect(variableElements, hasLength(1));
+    LocalVariableElement variableElement = variableElements[0];
+    expect(variableElement.hasImplicitType, isTrue);
+    expect(variableElement.isConst, isFalse);
+    expect(variableElement.isFinal, isFalse);
+    expect(variableElement.isSynthetic, isFalse);
+    expect(variableElement.name, variableName);
+  }
+
+  void test_visitVariableDeclaration_noInitializer() {
+    // var v;
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String variableName = "v";
+    VariableDeclaration variableDeclaration =
+        AstFactory.variableDeclaration2(variableName, null);
+    AstFactory.variableDeclarationList2(null, [variableDeclaration]);
+    variableDeclaration.accept(builder);
+
+    List<TopLevelVariableElement> variables = holder.topLevelVariables;
+    expect(variables, hasLength(1));
+    TopLevelVariableElement variable = variables[0];
+    expect(variable, isNotNull);
+    expect(variable.hasImplicitType, isTrue);
+    expect(variable.initializer, isNull);
+    expect(variable.name, variableName);
+    expect(variable.isConst, isFalse);
+    expect(variable.isFinal, isFalse);
+    expect(variable.isSynthetic, isFalse);
+    expect(variable.getter, isNotNull);
+    expect(variable.setter, isNotNull);
+  }
+
+  void test_visitVariableDeclaration_top_const_hasInitializer() {
+    // const v = 42;
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String variableName = "v";
+    VariableDeclaration variableDeclaration =
+        AstFactory.variableDeclaration2(variableName, AstFactory.integer(42));
+    AstFactory.variableDeclarationList2(Keyword.CONST, [variableDeclaration]);
+    variableDeclaration.accept(builder);
+
+    List<TopLevelVariableElement> variables = holder.topLevelVariables;
+    expect(variables, hasLength(1));
+    TopLevelVariableElement variable = variables[0];
+    expect(variable, new isInstanceOf<ConstTopLevelVariableElementImpl>());
+    expect(variable.initializer, isNotNull);
+    expect(variable.name, variableName);
+    expect(variable.hasImplicitType, isTrue);
+    expect(variable.isConst, isTrue);
+    expect(variable.isFinal, isFalse);
+    expect(variable.isSynthetic, isFalse);
+    expect(variable.getter, isNotNull);
+    expect(variable.setter, isNull);
+  }
+
+  void test_visitVariableDeclaration_top_final() {
+    // final v;
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder builder = new ElementBuilder(holder);
+    String variableName = "v";
+    VariableDeclaration variableDeclaration =
+        AstFactory.variableDeclaration2(variableName, null);
+    AstFactory.variableDeclarationList2(Keyword.FINAL, [variableDeclaration]);
+    variableDeclaration.accept(builder);
+    List<TopLevelVariableElement> variables = holder.topLevelVariables;
+    expect(variables, hasLength(1));
+    TopLevelVariableElement variable = variables[0];
+    expect(variable, isNotNull);
+    expect(variable.hasImplicitType, isTrue);
+    expect(variable.initializer, isNull);
+    expect(variable.name, variableName);
+    expect(variable.isConst, isFalse);
+    expect(variable.isFinal, isTrue);
+    expect(variable.isSynthetic, isFalse);
+    expect(variable.getter, isNotNull);
+    expect(variable.setter, isNull);
+  }
+
+  void _useParameterInMethod(
+      FormalParameter formalParameter, int blockOffset, int blockEnd) {
+    Block block = AstFactory.block();
+    block.leftBracket.offset = blockOffset;
+    block.rightBracket.offset = blockEnd - 1;
+    BlockFunctionBody body = AstFactory.blockFunctionBody(block);
+    AstFactory.methodDeclaration2(
+        null,
+        null,
+        null,
+        null,
+        AstFactory.identifier3("main"),
+        AstFactory.formalParameterList([formalParameter]),
+        body);
+  }
+}
+
+@reflectiveTest
+class ElementLocatorTest extends ResolverTestCase {
+  void fail_locate_ExportDirective() {
+    AstNode id = _findNodeIn("export", "export 'dart:core';");
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ImportElement, ImportElement, element);
+  }
+
+  void fail_locate_Identifier_libraryDirective() {
+    AstNode id = _findNodeIn("foo", "library foo.bar;");
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is LibraryElement, LibraryElement, element);
+  }
+
+  void fail_locate_Identifier_partOfDirective() {
+    // Can't resolve the library element without the library declaration.
+    //    AstNode id = findNodeIn("foo", "part of foo.bar;");
+    //    Element element = ElementLocator.locate(id);
+    //    assertInstanceOf(LibraryElement.class, element);
+    fail("Test this case");
+  }
+
+  @override
+  void reset() {
+    AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
+    analysisOptions.hint = false;
+    resetWithOptions(analysisOptions);
+  }
+
+  void test_locate_AssignmentExpression() {
+    AstNode id = _findNodeIn(
+        "+=",
+        r'''
+int x = 0;
+void main() {
+  x += 1;
+}''');
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodElement, MethodElement, element);
+  }
+
+  void test_locate_BinaryExpression() {
+    AstNode id = _findNodeIn("+", "var x = 3 + 4;");
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodElement, MethodElement, element);
+  }
+
+  void test_locate_ClassDeclaration() {
+    AstNode id = _findNodeIn("class", "class A { }");
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ClassElement, ClassElement, element);
+  }
+
+  void test_locate_CompilationUnit() {
+    CompilationUnit cu = _resolveContents("// only comment");
+    expect(cu.element, isNotNull);
+    Element element = ElementLocator.locate(cu);
+    expect(element, same(cu.element));
+  }
+
+  void test_locate_ConstructorDeclaration() {
+    AstNode id = _findNodeIndexedIn(
+        "bar",
+        0,
+        r'''
+class A {
+  A.bar() {}
+}''');
+    ConstructorDeclaration declaration =
+        id.getAncestor((node) => node is ConstructorDeclaration);
+    Element element = ElementLocator.locate(declaration);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ConstructorElement, ConstructorElement, element);
+  }
+
+  void test_locate_FunctionDeclaration() {
+    AstNode id = _findNodeIn("f", "int f() => 3;");
+    FunctionDeclaration declaration =
+        id.getAncestor((node) => node is FunctionDeclaration);
+    Element element = ElementLocator.locate(declaration);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is FunctionElement, FunctionElement, element);
+  }
+
+  void test_locate_Identifier_annotationClass_namedConstructor_forSimpleFormalParameter() {
+    AstNode id = _findNodeIndexedIn(
+        "Class",
+        2,
+        r'''
+class Class {
+  const Class.name();
+}
+void main(@Class.name() parameter) {
+}''');
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ClassElement, ClassElement, element);
+  }
+
+  void test_locate_Identifier_annotationClass_unnamedConstructor_forSimpleFormalParameter() {
+    AstNode id = _findNodeIndexedIn(
+        "Class",
+        2,
+        r'''
+class Class {
+  const Class();
+}
+void main(@Class() parameter) {
+}''');
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ConstructorElement, ConstructorElement, element);
+  }
+
+  void test_locate_Identifier_className() {
+    AstNode id = _findNodeIn("A", "class A { }");
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ClassElement, ClassElement, element);
+  }
+
+  void test_locate_Identifier_constructor_named() {
+    AstNode id = _findNodeIndexedIn(
+        "bar",
+        0,
+        r'''
+class A {
+  A.bar() {}
+}''');
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ConstructorElement, ConstructorElement, element);
+  }
+
+  void test_locate_Identifier_constructor_unnamed() {
+    AstNode id = _findNodeIndexedIn(
+        "A",
+        1,
+        r'''
+class A {
+  A() {}
+}''');
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ConstructorElement, ConstructorElement, element);
+  }
+
+  void test_locate_Identifier_fieldName() {
+    AstNode id = _findNodeIn("x", "class A { var x; }");
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is FieldElement, FieldElement, element);
+  }
+
+  void test_locate_Identifier_propertAccess() {
+    AstNode id = _findNodeIn(
+        "length",
+        r'''
+void main() {
+ int x = 'foo'.length;
+}''');
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf((obj) => obj is PropertyAccessorElement,
+        PropertyAccessorElement, element);
+  }
+
+  void test_locate_ImportDirective() {
+    AstNode id = _findNodeIn("import", "import 'dart:core';");
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ImportElement, ImportElement, element);
+  }
+
+  void test_locate_IndexExpression() {
+    AstNode id = _findNodeIndexedIn(
+        "\\[",
+        1,
+        r'''
+void main() {
+  List x = [1, 2];
+  var y = x[0];
+}''');
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodElement, MethodElement, element);
+  }
+
+  void test_locate_InstanceCreationExpression() {
+    AstNode node = _findNodeIndexedIn(
+        "A(",
+        0,
+        r'''
+class A {}
+void main() {
+ new A();
+}''');
+    Element element = ElementLocator.locate(node);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ConstructorElement, ConstructorElement, element);
+  }
+
+  void test_locate_InstanceCreationExpression_type_prefixedIdentifier() {
+    // prepare: new pref.A()
+    SimpleIdentifier identifier = AstFactory.identifier3("A");
+    PrefixedIdentifier prefixedIdentifier =
+        AstFactory.identifier4("pref", identifier);
+    InstanceCreationExpression creation = AstFactory
+        .instanceCreationExpression2(
+            Keyword.NEW, AstFactory.typeName3(prefixedIdentifier));
+    // set ClassElement
+    ClassElement classElement = ElementFactory.classElement2("A");
+    identifier.staticElement = classElement;
+    // set ConstructorElement
+    ConstructorElement constructorElement =
+        ElementFactory.constructorElement2(classElement, null);
+    creation.constructorName.staticElement = constructorElement;
+    // verify that "A" is resolved to ConstructorElement
+    Element element = ElementLocator.locate(identifier);
+    expect(element, same(classElement));
+  }
+
+  void test_locate_InstanceCreationExpression_type_simpleIdentifier() {
+    // prepare: new A()
+    SimpleIdentifier identifier = AstFactory.identifier3("A");
+    InstanceCreationExpression creation = AstFactory
+        .instanceCreationExpression2(
+            Keyword.NEW, AstFactory.typeName3(identifier));
+    // set ClassElement
+    ClassElement classElement = ElementFactory.classElement2("A");
+    identifier.staticElement = classElement;
+    // set ConstructorElement
+    ConstructorElement constructorElement =
+        ElementFactory.constructorElement2(classElement, null);
+    creation.constructorName.staticElement = constructorElement;
+    // verify that "A" is resolved to ConstructorElement
+    Element element = ElementLocator.locate(identifier);
+    expect(element, same(classElement));
+  }
+
+  void test_locate_LibraryDirective() {
+    AstNode id = _findNodeIn("library", "library foo;");
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is LibraryElement, LibraryElement, element);
+  }
+
+  void test_locate_MethodDeclaration() {
+    AstNode id = _findNodeIn(
+        "m",
+        r'''
+class A {
+  void m() {}
+}''');
+    MethodDeclaration declaration =
+        id.getAncestor((node) => node is MethodDeclaration);
+    Element element = ElementLocator.locate(declaration);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodElement, MethodElement, element);
+  }
+
+  void test_locate_MethodInvocation_method() {
+    AstNode id = _findNodeIndexedIn(
+        "bar",
+        1,
+        r'''
+class A {
+  int bar() => 42;
+}
+void main() {
+ var f = new A().bar();
+}''');
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodElement, MethodElement, element);
+  }
+
+  void test_locate_MethodInvocation_topLevel() {
+    String code = r'''
+foo(x) {}
+void main() {
+ foo(0);
+}''';
+    CompilationUnit cu = _resolveContents(code);
+    int offset = code.indexOf('foo(0)');
+    AstNode node = new NodeLocator(offset).searchWithin(cu);
+    MethodInvocation invocation =
+        node.getAncestor((n) => n is MethodInvocation);
+    Element element = ElementLocator.locate(invocation);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is FunctionElement, FunctionElement, element);
+  }
+
+  void test_locate_PostfixExpression() {
+    AstNode id = _findNodeIn("++", "int addOne(int x) => x++;");
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodElement, MethodElement, element);
+  }
+
+  void test_locate_PrefixedIdentifier() {
+    AstNode id = _findNodeIn(
+        "int",
+        r'''
+import 'dart:core' as core;
+core.int value;''');
+    PrefixedIdentifier identifier =
+        id.getAncestor((node) => node is PrefixedIdentifier);
+    Element element = ElementLocator.locate(identifier);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ClassElement, ClassElement, element);
+  }
+
+  void test_locate_PrefixExpression() {
+    AstNode id = _findNodeIn("++", "int addOne(int x) => ++x;");
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodElement, MethodElement, element);
+  }
+
+  void test_locate_StringLiteral_exportUri() {
+    addNamedSource("/foo.dart", "library foo;");
+    AstNode id = _findNodeIn("'foo.dart'", "export 'foo.dart';");
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is LibraryElement, LibraryElement, element);
+  }
+
+  void test_locate_StringLiteral_expression() {
+    AstNode id = _findNodeIn("abc", "var x = 'abc';");
+    Element element = ElementLocator.locate(id);
+    expect(element, isNull);
+  }
+
+  void test_locate_StringLiteral_importUri() {
+    addNamedSource("/foo.dart", "library foo; class A {}");
+    AstNode id =
+        _findNodeIn("'foo.dart'", "import 'foo.dart'; class B extends A {}");
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is LibraryElement, LibraryElement, element);
+  }
+
+  void test_locate_StringLiteral_partUri() {
+    addNamedSource("/foo.dart", "part of app;");
+    AstNode id = _findNodeIn("'foo.dart'", "library app; part 'foo.dart';");
+    Element element = ElementLocator.locate(id);
+    EngineTestCase.assertInstanceOf((obj) => obj is CompilationUnitElement,
+        CompilationUnitElement, element);
+  }
+
+  void test_locate_VariableDeclaration() {
+    AstNode id = _findNodeIn("x", "var x = 'abc';");
+    VariableDeclaration declaration =
+        id.getAncestor((node) => node is VariableDeclaration);
+    Element element = ElementLocator.locate(declaration);
+    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableElement,
+        TopLevelVariableElement, element);
+  }
+
+  void test_locateWithOffset_BinaryExpression() {
+    AstNode id = _findNodeIn("+", "var x = 3 + 4;");
+    Element element = ElementLocator.locateWithOffset(id, 0);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodElement, MethodElement, element);
+  }
+
+  void test_locateWithOffset_StringLiteral() {
+    AstNode id = _findNodeIn("abc", "var x = 'abc';");
+    Element element = ElementLocator.locateWithOffset(id, 1);
+    expect(element, isNull);
+  }
+
+  /**
+   * Find the first AST node matching a pattern in the resolved AST for the given source.
+   *
+   * [nodePattern] the (unique) pattern used to identify the node of interest.
+   * [code] the code to resolve.
+   * Returns the matched node in the resolved AST for the given source lines.
+   */
+  AstNode _findNodeIn(String nodePattern, String code) {
+    return _findNodeIndexedIn(nodePattern, 0, code);
+  }
+
+  /**
+   * Find the AST node matching the given indexed occurrence of a pattern in the resolved AST for
+   * the given source.
+   *
+   * [nodePattern] the pattern used to identify the node of interest.
+   * [index] the index of the pattern match of interest.
+   * [code] the code to resolve.
+   * Returns the matched node in the resolved AST for the given source lines
+   */
+  AstNode _findNodeIndexedIn(String nodePattern, int index, String code) {
+    CompilationUnit cu = _resolveContents(code);
+    int start = _getOffsetOfMatch(code, nodePattern, index);
+    int end = start + nodePattern.length;
+    return new NodeLocator(start, end).searchWithin(cu);
+  }
+
+  int _getOffsetOfMatch(String contents, String pattern, int matchIndex) {
+    if (matchIndex == 0) {
+      return contents.indexOf(pattern);
+    }
+    JavaPatternMatcher matcher =
+        new JavaPatternMatcher(new RegExp(pattern), contents);
+    int count = 0;
+    while (matcher.find()) {
+      if (count == matchIndex) {
+        return matcher.start();
+      }
+      ++count;
+    }
+    return -1;
+  }
+
+  /**
+   * Parse, resolve and verify the given source lines to produce a fully
+   * resolved AST.
+   *
+   * [code] the code to resolve.
+   *
+   * Returns the result of resolving the AST structure representing the content
+   * of the source.
+   *
+   * Throws if source cannot be verified.
+   */
+  CompilationUnit _resolveContents(String code) {
+    Source source = addSource(code);
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    return analysisContext.resolveCompilationUnit(source, library);
+  }
+}
+
+@reflectiveTest
+class EnumMemberBuilderTest extends EngineTestCase {
+  void test_visitEnumDeclaration_multiple() {
+    String firstName = "ONE";
+    String secondName = "TWO";
+    String thirdName = "THREE";
+    EnumDeclaration enumDeclaration =
+        AstFactory.enumDeclaration2("E", [firstName, secondName, thirdName]);
+
+    ClassElement enumElement = _buildElement(enumDeclaration);
+    List<FieldElement> fields = enumElement.fields;
+    expect(fields, hasLength(5));
+
+    FieldElement constant = fields[2];
+    expect(constant, isNotNull);
+    expect(constant.name, firstName);
+    expect(constant.isStatic, isTrue);
+    expect((constant as FieldElementImpl).evaluationResult, isNotNull);
+    _assertGetter(constant);
+
+    constant = fields[3];
+    expect(constant, isNotNull);
+    expect(constant.name, secondName);
+    expect(constant.isStatic, isTrue);
+    expect((constant as FieldElementImpl).evaluationResult, isNotNull);
+    _assertGetter(constant);
+
+    constant = fields[4];
+    expect(constant, isNotNull);
+    expect(constant.name, thirdName);
+    expect(constant.isStatic, isTrue);
+    expect((constant as FieldElementImpl).evaluationResult, isNotNull);
+    _assertGetter(constant);
+  }
+
+  void test_visitEnumDeclaration_single() {
+    String firstName = "ONE";
+    EnumDeclaration enumDeclaration =
+        AstFactory.enumDeclaration2("E", [firstName]);
+
+    ClassElement enumElement = _buildElement(enumDeclaration);
+    List<FieldElement> fields = enumElement.fields;
+    expect(fields, hasLength(3));
+
+    FieldElement field = fields[0];
+    expect(field, isNotNull);
+    expect(field.name, "index");
+    expect(field.isStatic, isFalse);
+    expect(field.isSynthetic, isTrue);
+    _assertGetter(field);
+
+    field = fields[1];
+    expect(field, isNotNull);
+    expect(field.name, "values");
+    expect(field.isStatic, isTrue);
+    expect(field.isSynthetic, isTrue);
+    expect((field as FieldElementImpl).evaluationResult, isNotNull);
+    _assertGetter(field);
+
+    FieldElement constant = fields[2];
+    expect(constant, isNotNull);
+    expect(constant.name, firstName);
+    expect(constant.isStatic, isTrue);
+    expect((constant as FieldElementImpl).evaluationResult, isNotNull);
+    _assertGetter(constant);
+  }
+
+  void _assertGetter(FieldElement field) {
+    PropertyAccessorElement getter = field.getter;
+    expect(getter, isNotNull);
+    expect(getter.variable, same(field));
+    expect(getter.type, isNotNull);
+  }
+
+  ClassElement _buildElement(EnumDeclaration enumDeclaration) {
+    ElementHolder holder = new ElementHolder();
+    ElementBuilder elementBuilder = new ElementBuilder(holder);
+    enumDeclaration.accept(elementBuilder);
+    EnumMemberBuilder memberBuilder =
+        new EnumMemberBuilder(new TestTypeProvider());
+    enumDeclaration.accept(memberBuilder);
+    List<ClassElement> enums = holder.enums;
+    expect(enums, hasLength(1));
+    return enums[0];
+  }
+}
+
+@reflectiveTest
+class ErrorReporterTest extends EngineTestCase {
+  /**
+   * Create a type with the given name in a compilation unit with the given name.
+   *
+   * @param fileName the name of the compilation unit containing the class
+   * @param typeName the name of the type to be created
+   * @return the type that was created
+   */
+  InterfaceType createType(String fileName, String typeName) {
+    CompilationUnitElementImpl unit = ElementFactory.compilationUnit(fileName);
+    ClassElementImpl element = ElementFactory.classElement2(typeName);
+    unit.types = <ClassElement>[element];
+    return element.type;
+  }
+
+  void test_creation() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    TestSource source = new TestSource();
+    expect(new ErrorReporter(listener, source), isNotNull);
+  }
+
+  void test_reportErrorForElement_named() {
+    DartType type = createType("/test1.dart", "A");
+    ClassElement element = type.element;
+    GatheringErrorListener listener = new GatheringErrorListener();
+    ErrorReporter reporter = new ErrorReporter(listener, element.source);
+    reporter.reportErrorForElement(
+        StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER,
+        element,
+        ['A']);
+    AnalysisError error = listener.errors[0];
+    expect(error.offset, element.nameOffset);
+  }
+
+  void test_reportErrorForElement_unnamed() {
+    ImportElementImpl element =
+        ElementFactory.importFor(ElementFactory.library(null, ''), null);
+    GatheringErrorListener listener = new GatheringErrorListener();
+    ErrorReporter reporter = new ErrorReporter(
+        listener,
+        new NonExistingSource(
+            '/test.dart', toUri('/test.dart'), UriKind.FILE_URI));
+    reporter.reportErrorForElement(
+        StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER,
+        element,
+        ['A']);
+    AnalysisError error = listener.errors[0];
+    expect(error.offset, element.nameOffset);
+  }
+
+  void test_reportTypeErrorForNode_differentNames() {
+    DartType firstType = createType("/test1.dart", "A");
+    DartType secondType = createType("/test2.dart", "B");
+    GatheringErrorListener listener = new GatheringErrorListener();
+    ErrorReporter reporter =
+        new ErrorReporter(listener, firstType.element.source);
+    reporter.reportTypeErrorForNode(
+        StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
+        AstFactory.identifier3("x"),
+        [firstType, secondType]);
+    AnalysisError error = listener.errors[0];
+    expect(error.message.indexOf("(") < 0, isTrue);
+  }
+
+  void test_reportTypeErrorForNode_sameName() {
+    String typeName = "A";
+    DartType firstType = createType("/test1.dart", typeName);
+    DartType secondType = createType("/test2.dart", typeName);
+    GatheringErrorListener listener = new GatheringErrorListener();
+    ErrorReporter reporter =
+        new ErrorReporter(listener, firstType.element.source);
+    reporter.reportTypeErrorForNode(
+        StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
+        AstFactory.identifier3("x"),
+        [firstType, secondType]);
+    AnalysisError error = listener.errors[0];
+    expect(error.message.indexOf("(") >= 0, isTrue);
+  }
+}
+
+@reflectiveTest
+class ErrorSeverityTest extends EngineTestCase {
+  void test_max_error_error() {
+    expect(ErrorSeverity.ERROR.max(ErrorSeverity.ERROR),
+        same(ErrorSeverity.ERROR));
+  }
+
+  void test_max_error_none() {
+    expect(
+        ErrorSeverity.ERROR.max(ErrorSeverity.NONE), same(ErrorSeverity.ERROR));
+  }
+
+  void test_max_error_warning() {
+    expect(ErrorSeverity.ERROR.max(ErrorSeverity.WARNING),
+        same(ErrorSeverity.ERROR));
+  }
+
+  void test_max_none_error() {
+    expect(
+        ErrorSeverity.NONE.max(ErrorSeverity.ERROR), same(ErrorSeverity.ERROR));
+  }
+
+  void test_max_none_none() {
+    expect(
+        ErrorSeverity.NONE.max(ErrorSeverity.NONE), same(ErrorSeverity.NONE));
+  }
+
+  void test_max_none_warning() {
+    expect(ErrorSeverity.NONE.max(ErrorSeverity.WARNING),
+        same(ErrorSeverity.WARNING));
+  }
+
+  void test_max_warning_error() {
+    expect(ErrorSeverity.WARNING.max(ErrorSeverity.ERROR),
+        same(ErrorSeverity.ERROR));
+  }
+
+  void test_max_warning_none() {
+    expect(ErrorSeverity.WARNING.max(ErrorSeverity.NONE),
+        same(ErrorSeverity.WARNING));
+  }
+
+  void test_max_warning_warning() {
+    expect(ErrorSeverity.WARNING.max(ErrorSeverity.WARNING),
+        same(ErrorSeverity.WARNING));
+  }
+}
+
+/**
+ * Tests for the [ExitDetector] that do not require that the AST be resolved.
+ *
+ * See [ExitDetectorTest2] for tests that require the AST to be resolved.
+ */
+@reflectiveTest
+class ExitDetectorTest extends ParserTestCase {
+  void fail_doStatement_continue_with_label() {
+    _assertFalse("{ x: do { continue x; } while(true); }");
+  }
+
+  void fail_whileStatement_continue_with_label() {
+    _assertFalse("{ x: while (true) { continue x; } }");
+  }
+
+  void fail_whileStatement_doStatement_scopeRequired() {
+    _assertTrue("{ while (true) { x: do { continue x; } while(true); }");
+  }
+
+  void test_asExpression() {
+    _assertFalse("a as Object;");
+  }
+
+  void test_asExpression_throw() {
+    _assertTrue("throw '' as Object;");
+  }
+
+  void test_assertStatement() {
+    _assertFalse("assert(a);");
+  }
+
+  void test_assertStatement_throw() {
+    _assertTrue("assert((throw 0));");
+  }
+
+  void test_assignmentExpression() {
+    _assertFalse("v = 1;");
+  }
+
+  void test_assignmentExpression_lhs_throw() {
+    _assertTrue("a[throw ''] = 0;");
+  }
+
+  void test_assignmentExpression_rhs_throw() {
+    _assertTrue("v = throw '';");
+  }
+
+  void test_await_false() {
+    _assertFalse("await x;");
+  }
+
+  void test_await_throw_true() {
+    _assertTrue("bool b = await (throw '' || true);");
+  }
+
+  void test_binaryExpression_and() {
+    _assertFalse("a && b;");
+  }
+
+  void test_binaryExpression_and_lhs() {
+    _assertTrue("throw '' && b;");
+  }
+
+  void test_binaryExpression_and_rhs() {
+    _assertTrue("a && (throw '');");
+  }
+
+  void test_binaryExpression_and_rhs2() {
+    _assertTrue("false && (throw '');");
+  }
+
+  void test_binaryExpression_and_rhs3() {
+    _assertFalse("true && (throw '');");
+  }
+
+  void test_binaryExpression_or() {
+    _assertFalse("a || b;");
+  }
+
+  void test_binaryExpression_or_lhs() {
+    _assertTrue("throw '' || b;");
+  }
+
+  void test_binaryExpression_or_rhs() {
+    _assertTrue("a || (throw '');");
+  }
+
+  void test_binaryExpression_or_rhs2() {
+    _assertTrue("true || (throw '');");
+  }
+
+  void test_binaryExpression_or_rhs3() {
+    _assertFalse("false || (throw '');");
+  }
+
+  void test_block_empty() {
+    _assertFalse("{}");
+  }
+
+  void test_block_noReturn() {
+    _assertFalse("{ int i = 0; }");
+  }
+
+  void test_block_return() {
+    _assertTrue("{ return 0; }");
+  }
+
+  void test_block_returnNotLast() {
+    _assertTrue("{ return 0; throw 'a'; }");
+  }
+
+  void test_block_throwNotLast() {
+    _assertTrue("{ throw 0; x = null; }");
+  }
+
+  void test_cascadeExpression_argument() {
+    _assertTrue("a..b(throw '');");
+  }
+
+  void test_cascadeExpression_index() {
+    _assertTrue("a..[throw ''];");
+  }
+
+  void test_cascadeExpression_target() {
+    _assertTrue("throw ''..b();");
+  }
+
+  void test_conditional_ifElse_bothThrows() {
+    _assertTrue("c ? throw '' : throw '';");
+  }
+
+  void test_conditional_ifElse_elseThrows() {
+    _assertFalse("c ? i : throw '';");
+  }
+
+  void test_conditional_ifElse_noThrow() {
+    _assertFalse("c ? i : j;");
+  }
+
+  void test_conditional_ifElse_thenThrow() {
+    _assertFalse("c ? throw '' : j;");
+  }
+
+  void test_creation() {
+    expect(new ExitDetector(), isNotNull);
+  }
+
+  void test_doStatement_throwCondition() {
+    _assertTrue("{ do {} while (throw ''); }");
+  }
+
+  void test_doStatement_true_break() {
+    _assertFalse("{ do { break; } while (true); }");
+  }
+
+  void test_doStatement_true_continue() {
+    _assertTrue("{ do { continue; } while (true); }");
+  }
+
+  void test_doStatement_true_if_return() {
+    _assertTrue("{ do { if (true) {return null;} } while (true); }");
+  }
+
+  void test_doStatement_true_noBreak() {
+    _assertTrue("{ do {} while (true); }");
+  }
+
+  void test_doStatement_true_return() {
+    _assertTrue("{ do { return null; } while (true);  }");
+  }
+
+  void test_emptyStatement() {
+    _assertFalse(";");
+  }
+
+  void test_forEachStatement() {
+    _assertFalse("for (element in list) {}");
+  }
+
+  void test_forEachStatement_throw() {
+    _assertTrue("for (element in throw '') {}");
+  }
+
+  void test_forStatement_condition() {
+    _assertTrue("for (; throw 0;) {}");
+  }
+
+  void test_forStatement_implicitTrue() {
+    _assertTrue("for (;;) {}");
+  }
+
+  void test_forStatement_implicitTrue_break() {
+    _assertFalse("for (;;) { break; }");
+  }
+
+  void test_forStatement_initialization() {
+    _assertTrue("for (i = throw 0;;) {}");
+  }
+
+  void test_forStatement_true() {
+    _assertTrue("for (; true; ) {}");
+  }
+
+  void test_forStatement_true_break() {
+    _assertFalse("{ for (; true; ) { break; } }");
+  }
+
+  void test_forStatement_true_continue() {
+    _assertTrue("{ for (; true; ) { continue; } }");
+  }
+
+  void test_forStatement_true_if_return() {
+    _assertTrue("{ for (; true; ) { if (true) {return null;} } }");
+  }
+
+  void test_forStatement_true_noBreak() {
+    _assertTrue("{ for (; true; ) {} }");
+  }
+
+  void test_forStatement_updaters() {
+    _assertTrue("for (;; i++, throw 0) {}");
+  }
+
+  void test_forStatement_variableDeclaration() {
+    _assertTrue("for (int i = throw 0;;) {}");
+  }
+
+  void test_functionExpression() {
+    _assertFalse("(){};");
+  }
+
+  void test_functionExpression_bodyThrows() {
+    _assertFalse("(int i) => throw '';");
+  }
+
+  void test_functionExpressionInvocation() {
+    _assertFalse("f(g);");
+  }
+
+  void test_functionExpressionInvocation_argumentThrows() {
+    _assertTrue("f(throw '');");
+  }
+
+  void test_functionExpressionInvocation_targetThrows() {
+    _assertTrue("throw ''(g);");
+  }
+
+  void test_identifier_prefixedIdentifier() {
+    _assertFalse("a.b;");
+  }
+
+  void test_identifier_simpleIdentifier() {
+    _assertFalse("a;");
+  }
+
+  void test_if_false_else_return() {
+    _assertTrue("if (false) {} else { return 0; }");
+  }
+
+  void test_if_false_noReturn() {
+    _assertFalse("if (false) {}");
+  }
+
+  void test_if_false_return() {
+    _assertFalse("if (false) { return 0; }");
+  }
+
+  void test_if_noReturn() {
+    _assertFalse("if (c) i++;");
+  }
+
+  void test_if_return() {
+    _assertFalse("if (c) return 0;");
+  }
+
+  void test_if_true_noReturn() {
+    _assertFalse("if (true) {}");
+  }
+
+  void test_if_true_return() {
+    _assertTrue("if (true) { return 0; }");
+  }
+
+  void test_ifElse_bothReturn() {
+    _assertTrue("if (c) return 0; else return 1;");
+  }
+
+  void test_ifElse_elseReturn() {
+    _assertFalse("if (c) i++; else return 1;");
+  }
+
+  void test_ifElse_noReturn() {
+    _assertFalse("if (c) i++; else j++;");
+  }
+
+  void test_ifElse_thenReturn() {
+    _assertFalse("if (c) return 0; else j++;");
+  }
+
+  void test_indexExpression() {
+    _assertFalse("a[b];");
+  }
+
+  void test_indexExpression_index() {
+    _assertTrue("a[throw ''];");
+  }
+
+  void test_indexExpression_target() {
+    _assertTrue("throw ''[b];");
+  }
+
+  void test_instanceCreationExpression() {
+    _assertFalse("new A(b);");
+  }
+
+  void test_instanceCreationExpression_argumentThrows() {
+    _assertTrue("new A(throw '');");
+  }
+
+  void test_isExpression() {
+    _assertFalse("A is B;");
+  }
+
+  void test_isExpression_throws() {
+    _assertTrue("throw '' is B;");
+  }
+
+  void test_labeledStatement() {
+    _assertFalse("label: a;");
+  }
+
+  void test_labeledStatement_throws() {
+    _assertTrue("label: throw '';");
+  }
+
+  void test_literal_boolean() {
+    _assertFalse("true;");
+  }
+
+  void test_literal_double() {
+    _assertFalse("1.1;");
+  }
+
+  void test_literal_integer() {
+    _assertFalse("1;");
+  }
+
+  void test_literal_null() {
+    _assertFalse("null;");
+  }
+
+  void test_literal_String() {
+    _assertFalse("'str';");
+  }
+
+  void test_methodInvocation() {
+    _assertFalse("a.b(c);");
+  }
+
+  void test_methodInvocation_argument() {
+    _assertTrue("a.b(throw '');");
+  }
+
+  void test_methodInvocation_target() {
+    _assertTrue("throw ''.b(c);");
+  }
+
+  void test_parenthesizedExpression() {
+    _assertFalse("(a);");
+  }
+
+  void test_parenthesizedExpression_throw() {
+    _assertTrue("(throw '');");
+  }
+
+  void test_propertyAccess() {
+    _assertFalse("new Object().a;");
+  }
+
+  void test_propertyAccess_throws() {
+    _assertTrue("(throw '').a;");
+  }
+
+  void test_rethrow() {
+    _assertTrue("rethrow;");
+  }
+
+  void test_return() {
+    _assertTrue("return 0;");
+  }
+
+  void test_superExpression() {
+    _assertFalse("super.a;");
+  }
+
+  void test_switch_allReturn() {
+    _assertTrue("switch (i) { case 0: return 0; default: return 1; }");
+  }
+
+  void test_switch_defaultWithNoStatements() {
+    _assertFalse("switch (i) { case 0: return 0; default: }");
+  }
+
+  void test_switch_fallThroughToNotReturn() {
+    _assertFalse("switch (i) { case 0: case 1: break; default: return 1; }");
+  }
+
+  void test_switch_fallThroughToReturn() {
+    _assertTrue("switch (i) { case 0: case 1: return 0; default: return 1; }");
+  }
+
+  void test_switch_noDefault() {
+    _assertFalse("switch (i) { case 0: return 0; }");
+  }
+
+  void test_switch_nonReturn() {
+    _assertFalse("switch (i) { case 0: i++; default: return 1; }");
+  }
+
+  void test_thisExpression() {
+    _assertFalse("this.a;");
+  }
+
+  void test_throwExpression() {
+    _assertTrue("throw new Object();");
+  }
+
+  void test_tryStatement_noReturn() {
+    _assertFalse("try {} catch (e, s) {} finally {}");
+  }
+
+  void test_tryStatement_return_catch() {
+    _assertFalse("try {} catch (e, s) { return 1; } finally {}");
+  }
+
+  void test_tryStatement_return_finally() {
+    _assertTrue("try {} catch (e, s) {} finally { return 1; }");
+  }
+
+  void test_tryStatement_return_try() {
+    _assertTrue("try { return 1; } catch (e, s) {} finally {}");
+  }
+
+  void test_variableDeclarationStatement_noInitializer() {
+    _assertFalse("int i;");
+  }
+
+  void test_variableDeclarationStatement_noThrow() {
+    _assertFalse("int i = 0;");
+  }
+
+  void test_variableDeclarationStatement_throw() {
+    _assertTrue("int i = throw new Object();");
+  }
+
+  void test_whileStatement_false_nonReturn() {
+    _assertFalse("{ while (false) {} }");
+  }
+
+  void test_whileStatement_throwCondition() {
+    _assertTrue("{ while (throw '') {} }");
+  }
+
+  void test_whileStatement_true_break() {
+    _assertFalse("{ while (true) { break; } }");
+  }
+
+  void test_whileStatement_true_continue() {
+    _assertTrue("{ while (true) { continue; } }");
+  }
+
+  void test_whileStatement_true_if_return() {
+    _assertTrue("{ while (true) { if (true) {return null;} } }");
+  }
+
+  void test_whileStatement_true_noBreak() {
+    _assertTrue("{ while (true) {} }");
+  }
+
+  void test_whileStatement_true_return() {
+    _assertTrue("{ while (true) { return null; } }");
+  }
+
+  void test_whileStatement_true_throw() {
+    _assertTrue("{ while (true) { throw ''; } }");
+  }
+
+  void _assertFalse(String source) {
+    _assertHasReturn(false, source);
+  }
+
+  void _assertHasReturn(bool expectedResult, String source) {
+    Statement statement = ParserTestCase.parseStatement(source);
+    expect(ExitDetector.exits(statement), expectedResult);
+  }
+
+  void _assertTrue(String source) {
+    _assertHasReturn(true, source);
+  }
+}
+
+/**
+ * Tests for the [ExitDetector] that require that the AST be resolved.
+ *
+ * See [ExitDetectorTest] for tests that do not require the AST to be resolved.
+ */
+@reflectiveTest
+class ExitDetectorTest2 extends ResolverTestCase {
+  void test_switch_withEnum_false_noDefault() {
+    Source source = addSource(r'''
+enum E { A, B }
+String f(E e) {
+  var x;
+  switch (e) {
+    case A:
+      x = 'A';
+    case B:
+      x = 'B';
+  }
+  return x;
+}
+''');
+    LibraryElement element = resolve2(source);
+    CompilationUnit unit = resolveCompilationUnit(source, element);
+    FunctionDeclaration function = unit.declarations.last;
+    BlockFunctionBody body = function.functionExpression.body;
+    Statement statement = body.block.statements[1];
+    expect(ExitDetector.exits(statement), false);
+  }
+
+  void test_switch_withEnum_false_withDefault() {
+    Source source = addSource(r'''
+enum E { A, B }
+String f(E e) {
+  var x;
+  switch (e) {
+    case A:
+      x = 'A';
+    default:
+      x = '?';
+  }
+  return x;
+}
+''');
+    LibraryElement element = resolve2(source);
+    CompilationUnit unit = resolveCompilationUnit(source, element);
+    FunctionDeclaration function = unit.declarations.last;
+    BlockFunctionBody body = function.functionExpression.body;
+    Statement statement = body.block.statements[1];
+    expect(ExitDetector.exits(statement), false);
+  }
+
+  void test_switch_withEnum_true_noDefault() {
+    Source source = addSource(r'''
+enum E { A, B }
+String f(E e) {
+  switch (e) {
+    case A:
+      return 'A';
+    case B:
+      return 'B';
+  }
+}
+''');
+    LibraryElement element = resolve2(source);
+    CompilationUnit unit = resolveCompilationUnit(source, element);
+    FunctionDeclaration function = unit.declarations.last;
+    BlockFunctionBody body = function.functionExpression.body;
+    Statement statement = body.block.statements[0];
+    expect(ExitDetector.exits(statement), true);
+  }
+
+  void test_switch_withEnum_true_withDefault() {
+    Source source = addSource(r'''
+enum E { A, B }
+String f(E e) {
+  switch (e) {
+    case A:
+      return 'A';
+    default:
+      return '?';
+  }
+}
+''');
+    LibraryElement element = resolve2(source);
+    CompilationUnit unit = resolveCompilationUnit(source, element);
+    FunctionDeclaration function = unit.declarations.last;
+    BlockFunctionBody body = function.functionExpression.body;
+    Statement statement = body.block.statements[0];
+    expect(ExitDetector.exits(statement), true);
+  }
+}
+
+@reflectiveTest
+class FileBasedSourceTest {
+  void test_equals_false_differentFiles() {
+    JavaFile file1 = FileUtilities2.createFile("/does/not/exist1.dart");
+    JavaFile file2 = FileUtilities2.createFile("/does/not/exist2.dart");
+    FileBasedSource source1 = new FileBasedSource(file1);
+    FileBasedSource source2 = new FileBasedSource(file2);
+    expect(source1 == source2, isFalse);
+  }
+
+  void test_equals_false_null() {
+    JavaFile file = FileUtilities2.createFile("/does/not/exist1.dart");
+    FileBasedSource source1 = new FileBasedSource(file);
+    expect(source1 == null, isFalse);
+  }
+
+  void test_equals_true() {
+    JavaFile file1 = FileUtilities2.createFile("/does/not/exist.dart");
+    JavaFile file2 = FileUtilities2.createFile("/does/not/exist.dart");
+    FileBasedSource source1 = new FileBasedSource(file1);
+    FileBasedSource source2 = new FileBasedSource(file2);
+    expect(source1 == source2, isTrue);
+  }
+
+  void test_fileReadMode() {
+    expect(FileBasedSource.fileReadMode('a'), 'a');
+    expect(FileBasedSource.fileReadMode('a\n'), 'a\n');
+    expect(FileBasedSource.fileReadMode('ab'), 'ab');
+    expect(FileBasedSource.fileReadMode('abc'), 'abc');
+    expect(FileBasedSource.fileReadMode('a\nb'), 'a\nb');
+    expect(FileBasedSource.fileReadMode('a\rb'), 'a\rb');
+    expect(FileBasedSource.fileReadMode('a\r\nb'), 'a\r\nb');
+  }
+
+  void test_fileReadMode_changed() {
+    FileBasedSource.fileReadMode = (String s) => s + 'xyz';
+    expect(FileBasedSource.fileReadMode('a'), 'axyz');
+    expect(FileBasedSource.fileReadMode('a\n'), 'a\nxyz');
+    expect(FileBasedSource.fileReadMode('ab'), 'abxyz');
+    expect(FileBasedSource.fileReadMode('abc'), 'abcxyz');
+    FileBasedSource.fileReadMode = (String s) => s;
+  }
+
+  void test_fileReadMode_normalize_eol_always() {
+    FileBasedSource.fileReadMode =
+        PhysicalResourceProvider.NORMALIZE_EOL_ALWAYS;
+    expect(FileBasedSource.fileReadMode('a'), 'a');
+
+    // '\n' -> '\n' as first, last and only character
+    expect(FileBasedSource.fileReadMode('\n'), '\n');
+    expect(FileBasedSource.fileReadMode('a\n'), 'a\n');
+    expect(FileBasedSource.fileReadMode('\na'), '\na');
+
+    // '\r\n' -> '\n' as first, last and only character
+    expect(FileBasedSource.fileReadMode('\r\n'), '\n');
+    expect(FileBasedSource.fileReadMode('a\r\n'), 'a\n');
+    expect(FileBasedSource.fileReadMode('\r\na'), '\na');
+
+    // '\r' -> '\n' as first, last and only character
+    expect(FileBasedSource.fileReadMode('\r'), '\n');
+    expect(FileBasedSource.fileReadMode('a\r'), 'a\n');
+    expect(FileBasedSource.fileReadMode('\ra'), '\na');
+
+    FileBasedSource.fileReadMode = (String s) => s;
+  }
+
+  void test_getEncoding() {
+    SourceFactory factory = new SourceFactory([new FileUriResolver()]);
+    String fullPath = "/does/not/exist.dart";
+    JavaFile file = FileUtilities2.createFile(fullPath);
+    FileBasedSource source = new FileBasedSource(file);
+    expect(factory.fromEncoding(source.encoding), source);
+  }
+
+  void test_getFullName() {
+    String fullPath = "/does/not/exist.dart";
+    JavaFile file = FileUtilities2.createFile(fullPath);
+    FileBasedSource source = new FileBasedSource(file);
+    expect(source.fullName, file.getAbsolutePath());
+  }
+
+  void test_getShortName() {
+    JavaFile file = FileUtilities2.createFile("/does/not/exist.dart");
+    FileBasedSource source = new FileBasedSource(file);
+    expect(source.shortName, "exist.dart");
+  }
+
+  void test_hashCode() {
+    JavaFile file1 = FileUtilities2.createFile("/does/not/exist.dart");
+    JavaFile file2 = FileUtilities2.createFile("/does/not/exist.dart");
+    FileBasedSource source1 = new FileBasedSource(file1);
+    FileBasedSource source2 = new FileBasedSource(file2);
+    expect(source2.hashCode, source1.hashCode);
+  }
+
+  void test_isInSystemLibrary_contagious() {
+    JavaFile sdkDirectory = DirectoryBasedDartSdk.defaultSdkDirectory;
+    expect(sdkDirectory, isNotNull);
+    DartSdk sdk = new DirectoryBasedDartSdk(sdkDirectory);
+    UriResolver resolver = new DartUriResolver(sdk);
+    SourceFactory factory = new SourceFactory([resolver]);
+    // resolve dart:core
+    Source result =
+        resolver.resolveAbsolute(parseUriWithException("dart:core"));
+    expect(result, isNotNull);
+    expect(result.isInSystemLibrary, isTrue);
+    // system libraries reference only other system libraries
+    Source partSource = factory.resolveUri(result, "num.dart");
+    expect(partSource, isNotNull);
+    expect(partSource.isInSystemLibrary, isTrue);
+  }
+
+  void test_isInSystemLibrary_false() {
+    JavaFile file = FileUtilities2.createFile("/does/not/exist.dart");
+    FileBasedSource source = new FileBasedSource(file);
+    expect(source, isNotNull);
+    expect(source.fullName, file.getAbsolutePath());
+    expect(source.isInSystemLibrary, isFalse);
+  }
+
+  void test_issue14500() {
+    // see https://code.google.com/p/dart/issues/detail?id=14500
+    FileBasedSource source = new FileBasedSource(
+        FileUtilities2.createFile("/some/packages/foo:bar.dart"));
+    expect(source, isNotNull);
+    expect(source.exists(), isFalse);
+  }
+
+  void test_resolveRelative_dart_fileName() {
+    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
+    FileBasedSource source =
+        new FileBasedSource(file, parseUriWithException("dart:test"));
+    expect(source, isNotNull);
+    Uri relative = source.resolveRelativeUri(parseUriWithException("lib.dart"));
+    expect(relative, isNotNull);
+    expect(relative.toString(), "dart:test/lib.dart");
+  }
+
+  void test_resolveRelative_dart_filePath() {
+    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
+    FileBasedSource source =
+        new FileBasedSource(file, parseUriWithException("dart:test"));
+    expect(source, isNotNull);
+    Uri relative =
+        source.resolveRelativeUri(parseUriWithException("c/lib.dart"));
+    expect(relative, isNotNull);
+    expect(relative.toString(), "dart:test/c/lib.dart");
+  }
+
+  void test_resolveRelative_dart_filePathWithParent() {
+    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
+    FileBasedSource source = new FileBasedSource(
+        file, parseUriWithException("dart:test/b/test.dart"));
+    expect(source, isNotNull);
+    Uri relative =
+        source.resolveRelativeUri(parseUriWithException("../c/lib.dart"));
+    expect(relative, isNotNull);
+    expect(relative.toString(), "dart:test/c/lib.dart");
+  }
+
+  void test_resolveRelative_file_fileName() {
+    if (OSUtilities.isWindows()) {
+      // On Windows, the URI that is produced includes a drive letter,
+      // which I believe is not consistent across all machines that might run
+      // this test.
+      return;
+    }
+    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
+    FileBasedSource source = new FileBasedSource(file);
+    expect(source, isNotNull);
+    Uri relative = source.resolveRelativeUri(parseUriWithException("lib.dart"));
+    expect(relative, isNotNull);
+    expect(relative.toString(), "file:///a/b/lib.dart");
+  }
+
+  void test_resolveRelative_file_filePath() {
+    if (OSUtilities.isWindows()) {
+      // On Windows, the URI that is produced includes a drive letter,
+      // which I believe is not consistent across all machines that might run
+      // this test.
+      return;
+    }
+    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
+    FileBasedSource source = new FileBasedSource(file);
+    expect(source, isNotNull);
+    Uri relative =
+        source.resolveRelativeUri(parseUriWithException("c/lib.dart"));
+    expect(relative, isNotNull);
+    expect(relative.toString(), "file:///a/b/c/lib.dart");
+  }
+
+  void test_resolveRelative_file_filePathWithParent() {
+    if (OSUtilities.isWindows()) {
+      // On Windows, the URI that is produced includes a drive letter, which I
+      // believe is not consistent across all machines that might run this test.
+      return;
+    }
+    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
+    FileBasedSource source = new FileBasedSource(file);
+    expect(source, isNotNull);
+    Uri relative =
+        source.resolveRelativeUri(parseUriWithException("../c/lib.dart"));
+    expect(relative, isNotNull);
+    expect(relative.toString(), "file:///a/c/lib.dart");
+  }
+
+  void test_resolveRelative_package_fileName() {
+    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
+    FileBasedSource source =
+        new FileBasedSource(file, parseUriWithException("package:b/test.dart"));
+    expect(source, isNotNull);
+    Uri relative = source.resolveRelativeUri(parseUriWithException("lib.dart"));
+    expect(relative, isNotNull);
+    expect(relative.toString(), "package:b/lib.dart");
+  }
+
+  void test_resolveRelative_package_fileNameWithoutPackageName() {
+    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
+    FileBasedSource source =
+        new FileBasedSource(file, parseUriWithException("package:test.dart"));
+    expect(source, isNotNull);
+    Uri relative = source.resolveRelativeUri(parseUriWithException("lib.dart"));
+    expect(relative, isNotNull);
+    expect(relative.toString(), "package:lib.dart");
+  }
+
+  void test_resolveRelative_package_filePath() {
+    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
+    FileBasedSource source =
+        new FileBasedSource(file, parseUriWithException("package:b/test.dart"));
+    expect(source, isNotNull);
+    Uri relative =
+        source.resolveRelativeUri(parseUriWithException("c/lib.dart"));
+    expect(relative, isNotNull);
+    expect(relative.toString(), "package:b/c/lib.dart");
+  }
+
+  void test_resolveRelative_package_filePathWithParent() {
+    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
+    FileBasedSource source = new FileBasedSource(
+        file, parseUriWithException("package:a/b/test.dart"));
+    expect(source, isNotNull);
+    Uri relative =
+        source.resolveRelativeUri(parseUriWithException("../c/lib.dart"));
+    expect(relative, isNotNull);
+    expect(relative.toString(), "package:a/c/lib.dart");
+  }
+
+  void test_system() {
+    JavaFile file = FileUtilities2.createFile("/does/not/exist.dart");
+    FileBasedSource source =
+        new FileBasedSource(file, parseUriWithException("dart:core"));
+    expect(source, isNotNull);
+    expect(source.fullName, file.getAbsolutePath());
+    expect(source.isInSystemLibrary, isTrue);
+  }
+}
+
+@reflectiveTest
+class FileUriResolverTest {
+  void test_creation() {
+    expect(new FileUriResolver(), isNotNull);
+  }
+
+  void test_resolve_file() {
+    UriResolver resolver = new FileUriResolver();
+    Source result = resolver
+        .resolveAbsolute(parseUriWithException("file:/does/not/exist.dart"));
+    expect(result, isNotNull);
+    expect(result.fullName,
+        FileUtilities2.createFile("/does/not/exist.dart").getAbsolutePath());
+  }
+
+  void test_resolve_nonFile() {
+    UriResolver resolver = new FileUriResolver();
+    Source result =
+        resolver.resolveAbsolute(parseUriWithException("dart:core"));
+    expect(result, isNull);
+  }
+
+  void test_restore() {
+    UriResolver resolver = new FileUriResolver();
+    Uri uri = parseUriWithException('file:///foo/bar.dart');
+    Source source = resolver.resolveAbsolute(uri);
+    expect(source, isNotNull);
+    expect(resolver.restoreAbsolute(source), uri);
+    expect(
+        resolver.restoreAbsolute(
+            new NonExistingSource(source.fullName, null, null)),
+        uri);
+  }
+}
+
+@reflectiveTest
+class HtmlParserTest extends EngineTestCase {
+  /**
+   * The name of the 'script' tag in an HTML file.
+   */
+  static String _TAG_SCRIPT = "script";
+  void fail_parse_scriptWithComment() {
+    String scriptBody = r'''
+      /**
+       *     <editable-label bind-value="dartAsignableValue">
+       *     </editable-label>
+       */
+      class Foo {}''';
+    ht.HtmlUnit htmlUnit = parse("""
+<html>
+  <body>
+    <script type='application/dart'>
+$scriptBody
+    </script>
+  </body>
+</html>""");
+    _validate(htmlUnit, [
+      _t4("html", [
+        _t4("body", [
+          _t("script", _a(["type", "'application/dart'"]), scriptBody)
+        ])
+      ])
+    ]);
+  }
+
+  ht.HtmlUnit parse(String contents) {
+//    TestSource source =
+//        new TestSource.con1(FileUtilities2.createFile("/test.dart"), contents);
+    ht.AbstractScanner scanner = new ht.StringScanner(null, contents);
+    scanner.passThroughElements = <String>[_TAG_SCRIPT];
+    ht.Token token = scanner.tokenize();
+    LineInfo lineInfo = new LineInfo(scanner.lineStarts);
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    ht.HtmlUnit unit =
+        new ht.HtmlParser(null, errorListener, options).parse(token, lineInfo);
+    errorListener.assertNoErrors();
+    return unit;
+  }
+
+  void test_parse_attribute() {
+    ht.HtmlUnit htmlUnit = parse("<html><body foo=\"sdfsdf\"></body></html>");
+    _validate(htmlUnit, [
+      _t4("html", [
+        _t("body", _a(["foo", "\"sdfsdf\""]), "")
+      ])
+    ]);
+    ht.XmlTagNode htmlNode = htmlUnit.tagNodes[0];
+    ht.XmlTagNode bodyNode = htmlNode.tagNodes[0];
+    expect(bodyNode.attributes[0].text, "sdfsdf");
+  }
+
+  void test_parse_attribute_EOF() {
+    ht.HtmlUnit htmlUnit = parse("<html><body foo=\"sdfsdf\"");
+    _validate(htmlUnit, [
+      _t4("html", [
+        _t("body", _a(["foo", "\"sdfsdf\""]), "")
+      ])
+    ]);
+  }
+
+  void test_parse_attribute_EOF_missing_quote() {
+    ht.HtmlUnit htmlUnit = parse("<html><body foo=\"sdfsd");
+    _validate(htmlUnit, [
+      _t4("html", [
+        _t("body", _a(["foo", "\"sdfsd"]), "")
+      ])
+    ]);
+    ht.XmlTagNode htmlNode = htmlUnit.tagNodes[0];
+    ht.XmlTagNode bodyNode = htmlNode.tagNodes[0];
+    expect(bodyNode.attributes[0].text, "sdfsd");
+  }
+
+  void test_parse_attribute_extra_quote() {
+    ht.HtmlUnit htmlUnit = parse("<html><body foo=\"sdfsdf\"\"></body></html>");
+    _validate(htmlUnit, [
+      _t4("html", [
+        _t("body", _a(["foo", "\"sdfsdf\""]), "")
+      ])
+    ]);
+  }
+
+  void test_parse_attribute_single_quote() {
+    ht.HtmlUnit htmlUnit = parse("<html><body foo='sdfsdf'></body></html>");
+    _validate(htmlUnit, [
+      _t4("html", [
+        _t("body", _a(["foo", "'sdfsdf'"]), "")
+      ])
+    ]);
+    ht.XmlTagNode htmlNode = htmlUnit.tagNodes[0];
+    ht.XmlTagNode bodyNode = htmlNode.tagNodes[0];
+    expect(bodyNode.attributes[0].text, "sdfsdf");
+  }
+
+  void test_parse_comment_embedded() {
+    ht.HtmlUnit htmlUnit = parse("<html <!-- comment -->></html>");
+    _validate(htmlUnit, [_t3("html", "")]);
+  }
+
+  void test_parse_comment_first() {
+    ht.HtmlUnit htmlUnit = parse("<!-- comment --><html></html>");
+    _validate(htmlUnit, [_t3("html", "")]);
+  }
+
+  void test_parse_comment_in_content() {
+    ht.HtmlUnit htmlUnit = parse("<html><!-- comment --></html>");
+    _validate(htmlUnit, [_t3("html", "<!-- comment -->")]);
+  }
+
+  void test_parse_content() {
+    ht.HtmlUnit htmlUnit = parse("<html>\n<p a=\"b\">blat \n </p>\n</html>");
+    // ht.XmlTagNode.getContent() does not include whitespace
+    // between '<' and '>' at this time
+    _validate(htmlUnit, [
+      _t3("html", "\n<pa=\"b\">blat \n </p>\n", [
+        _t("p", _a(["a", "\"b\""]), "blat \n ")
+      ])
+    ]);
+  }
+
+  void test_parse_content_none() {
+    ht.HtmlUnit htmlUnit = parse("<html><p/>blat<p/></html>");
+    _validate(htmlUnit, [
+      _t3("html", "<p/>blat<p/>", [_t3("p", ""), _t3("p", "")])
+    ]);
+  }
+
+  void test_parse_declaration() {
+    ht.HtmlUnit htmlUnit = parse("<!DOCTYPE html>\n\n<html><p></p></html>");
+    _validate(htmlUnit, [
+      _t4("html", [_t3("p", "")])
+    ]);
+  }
+
+  void test_parse_directive() {
+    ht.HtmlUnit htmlUnit = parse("<?xml ?>\n\n<html><p></p></html>");
+    _validate(htmlUnit, [
+      _t4("html", [_t3("p", "")])
+    ]);
+  }
+
+  void test_parse_getAttribute() {
+    ht.HtmlUnit htmlUnit = parse("<html><body foo=\"sdfsdf\"></body></html>");
+    ht.XmlTagNode htmlNode = htmlUnit.tagNodes[0];
+    ht.XmlTagNode bodyNode = htmlNode.tagNodes[0];
+    expect(bodyNode.getAttribute("foo").text, "sdfsdf");
+    expect(bodyNode.getAttribute("bar"), null);
+    expect(bodyNode.getAttribute(null), null);
+  }
+
+  void test_parse_getAttributeText() {
+    ht.HtmlUnit htmlUnit = parse("<html><body foo=\"sdfsdf\"></body></html>");
+    ht.XmlTagNode htmlNode = htmlUnit.tagNodes[0];
+    ht.XmlTagNode bodyNode = htmlNode.tagNodes[0];
+    expect(bodyNode.getAttributeText("foo"), "sdfsdf");
+    expect(bodyNode.getAttributeText("bar"), null);
+    expect(bodyNode.getAttributeText(null), null);
+  }
+
+  void test_parse_headers() {
+    String code = r'''
+<html>
+  <body>
+    <h2>000</h2>
+    <div>
+      111
+    </div>
+  </body>
+</html>''';
+    ht.HtmlUnit htmlUnit = parse(code);
+    _validate(htmlUnit, [
+      _t4("html", [
+        _t4("body", [_t3("h2", "000"), _t4("div")])
+      ])
+    ]);
+  }
+
+  void test_parse_script() {
+    ht.HtmlUnit htmlUnit =
+        parse("<html><script >here is <p> some</script></html>");
+    _validate(htmlUnit, [
+      _t4("html", [_t3("script", "here is <p> some")])
+    ]);
+  }
+
+  void test_parse_self_closing() {
+    ht.HtmlUnit htmlUnit = parse("<html>foo<br>bar</html>");
+    _validate(htmlUnit, [
+      _t3("html", "foo<br>bar", [_t3("br", "")])
+    ]);
+  }
+
+  void test_parse_self_closing_declaration() {
+    ht.HtmlUnit htmlUnit = parse("<!DOCTYPE html><html>foo</html>");
+    _validate(htmlUnit, [_t3("html", "foo")]);
+  }
+
+  XmlValidator_Attributes _a(List<String> keyValuePairs) =>
+      new XmlValidator_Attributes(keyValuePairs);
+  XmlValidator_Tag _t(
+          String tag, XmlValidator_Attributes attributes, String content,
+          [List<XmlValidator_Tag> children = XmlValidator_Tag.EMPTY_LIST]) =>
+      new XmlValidator_Tag(tag, attributes, content, children);
+  XmlValidator_Tag _t3(String tag, String content,
+          [List<XmlValidator_Tag> children = XmlValidator_Tag.EMPTY_LIST]) =>
+      new XmlValidator_Tag(
+          tag, new XmlValidator_Attributes(), content, children);
+  XmlValidator_Tag _t4(String tag,
+          [List<XmlValidator_Tag> children = XmlValidator_Tag.EMPTY_LIST]) =>
+      new XmlValidator_Tag(tag, new XmlValidator_Attributes(), null, children);
+  void _validate(ht.HtmlUnit htmlUnit, List<XmlValidator_Tag> expectedTags) {
+    XmlValidator validator = new XmlValidator();
+    validator.expectTags(expectedTags);
+    htmlUnit.accept(validator);
+    validator.assertValid();
+  }
+}
+
+@reflectiveTest
+class HtmlTagInfoBuilderTest extends HtmlParserTest {
+  void test_builder() {
+    HtmlTagInfoBuilder builder = new HtmlTagInfoBuilder();
+    ht.HtmlUnit unit = parse(r'''
+<html>
+  <body>
+    <div id="x"></div>
+    <p class='c'></p>
+    <div class='c'></div>
+  </body>
+</html>''');
+    unit.accept(builder);
+    HtmlTagInfo info = builder.getTagInfo();
+    expect(info, isNotNull);
+    List<String> allTags = info.allTags;
+    expect(allTags, hasLength(4));
+    expect(info.getTagWithId("x"), "div");
+    List<String> tagsWithClass = info.getTagsWithClass("c");
+    expect(tagsWithClass, hasLength(2));
+  }
+}
+
+@reflectiveTest
+class HtmlUnitBuilderTest extends EngineTestCase {
+  InternalAnalysisContext _context;
+  @override
+  void setUp() {
+    _context = AnalysisContextFactory.contextWithCore();
+  }
+
+  @override
+  void tearDown() {
+    _context = null;
+    super.tearDown();
+  }
+
+  void test_embedded_script() {
+    HtmlElementImpl element = _build(r'''
+<html>
+<script type="application/dart">foo=2;</script>
+</html>''');
+    _validate(element, [
+      _s(_l([_v("foo")]))
+    ]);
+  }
+
+  void test_embedded_script_no_content() {
+    HtmlElementImpl element = _build(r'''
+<html>
+<script type="application/dart"></script>
+</html>''');
+    _validate(element, [_s(_l())]);
+  }
+
+  void test_external_script() {
+    HtmlElementImpl element = _build(r'''
+<html>
+<script type="application/dart" src="other.dart"/>
+</html>''');
+    _validate(element, [_s2("other.dart")]);
+  }
+
+  void test_external_script_no_source() {
+    HtmlElementImpl element = _build(r'''
+<html>
+<script type="application/dart"/>
+</html>''');
+    _validate(element, [_s2(null)]);
+  }
+
+  void test_external_script_with_content() {
+    HtmlElementImpl element = _build(r'''
+<html>
+<script type="application/dart" src="other.dart">blat=2;</script>
+</html>''');
+    _validate(element, [_s2("other.dart")]);
+  }
+
+  void test_no_scripts() {
+    HtmlElementImpl element = _build(r'''
+<!DOCTYPE html>
+<html><p></p></html>''');
+    _validate(element, []);
+  }
+
+  void test_two_dart_scripts() {
+    HtmlElementImpl element = _build(r'''
+<html>
+<script type="application/dart">bar=2;</script>
+<script type="application/dart" src="other.dart"/>
+<script src="dart.js"/>
+</html>''');
+    _validate(element, [
+      _s(_l([_v("bar")])),
+      _s2("other.dart")
+    ]);
+  }
+
+  HtmlElementImpl _build(String contents) {
+    TestSource source = new TestSource(
+        FileUtilities2.createFile("/test.html").getAbsolutePath(), contents);
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(source);
+    _context.applyChanges(changeSet);
+    HtmlUnitBuilder builder = new HtmlUnitBuilder(_context);
+    return builder.buildHtmlElement(source, _context.parseHtmlUnit(source));
+  }
+
+  HtmlUnitBuilderTest_ExpectedLibrary _l(
+          [List<HtmlUnitBuilderTest_ExpectedVariable> expectedVariables =
+              HtmlUnitBuilderTest_ExpectedVariable.EMPTY_LIST]) =>
+      new HtmlUnitBuilderTest_ExpectedLibrary(this, expectedVariables);
+  _ExpectedScript _s(HtmlUnitBuilderTest_ExpectedLibrary expectedLibrary) =>
+      new _ExpectedScript.con1(expectedLibrary);
+  _ExpectedScript _s2(String scriptSourcePath) =>
+      new _ExpectedScript.con2(scriptSourcePath);
+  HtmlUnitBuilderTest_ExpectedVariable _v(String varName) =>
+      new HtmlUnitBuilderTest_ExpectedVariable(varName);
+  void _validate(
+      HtmlElementImpl element, List<_ExpectedScript> expectedScripts) {
+    expect(element.context, same(_context));
+    List<HtmlScriptElement> scripts = element.scripts;
+    expect(scripts, isNotNull);
+    expect(scripts, hasLength(expectedScripts.length));
+    for (int scriptIndex = 0; scriptIndex < scripts.length; scriptIndex++) {
+      expectedScripts[scriptIndex]._validate(scriptIndex, scripts[scriptIndex]);
+    }
+  }
+}
+
+class HtmlUnitBuilderTest_ExpectedLibrary {
+  final HtmlUnitBuilderTest HtmlUnitBuilderTest_this;
+  final List<HtmlUnitBuilderTest_ExpectedVariable> _expectedVariables;
+  HtmlUnitBuilderTest_ExpectedLibrary(this.HtmlUnitBuilderTest_this,
+      [this._expectedVariables =
+          HtmlUnitBuilderTest_ExpectedVariable.EMPTY_LIST]);
+  void _validate(int scriptIndex, EmbeddedHtmlScriptElementImpl script) {
+    LibraryElement library = script.scriptLibrary;
+    expect(library, isNotNull, reason: "script $scriptIndex");
+    expect(script.context, same(HtmlUnitBuilderTest_this._context),
+        reason: "script $scriptIndex");
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    expect(unit, isNotNull, reason: "script $scriptIndex");
+    List<TopLevelVariableElement> variables = unit.topLevelVariables;
+    expect(variables, hasLength(_expectedVariables.length));
+    for (int index = 0; index < variables.length; index++) {
+      _expectedVariables[index].validate(scriptIndex, variables[index]);
+    }
+    expect(library.enclosingElement, same(script),
+        reason: "script $scriptIndex");
+  }
+}
+
+class HtmlUnitBuilderTest_ExpectedVariable {
+  static const List<HtmlUnitBuilderTest_ExpectedVariable> EMPTY_LIST =
+      const <HtmlUnitBuilderTest_ExpectedVariable>[];
+  final String _expectedName;
+  HtmlUnitBuilderTest_ExpectedVariable(this._expectedName);
+  void validate(int scriptIndex, TopLevelVariableElement variable) {
+    expect(variable, isNotNull, reason: "script $scriptIndex");
+    expect(variable.name, _expectedName, reason: "script $scriptIndex");
+  }
+}
+
+/**
+ * Instances of the class `HtmlWarningCodeTest` test the generation of HTML warning codes.
+ */
+@reflectiveTest
+class HtmlWarningCodeTest extends EngineTestCase {
+  /**
+   * The analysis context used to resolve the HTML files.
+   */
+  InternalAnalysisContext _context;
+
+  /**
+   * The contents of the 'test.html' file.
+   */
+  String _contents;
+
+  /**
+   * The list of reported errors.
+   */
+  List<AnalysisError> _errors;
+  @override
+  void setUp() {
+    _context = AnalysisContextFactory.contextWithCore();
+  }
+
+  @override
+  void tearDown() {
+    _context = null;
+    _contents = null;
+    _errors = null;
+    super.tearDown();
+  }
+
+  void test_invalidUri() {
+    _verify(
+        r'''
+<html>
+<script type='application/dart' src='ht:'/>
+</html>''',
+        [HtmlWarningCode.INVALID_URI]);
+    _assertErrorLocation2(_errors[0], "ht:");
+  }
+
+  void test_uriDoesNotExist() {
+    _verify(
+        r'''
+<html>
+<script type='application/dart' src='other.dart'/>
+</html>''',
+        [HtmlWarningCode.URI_DOES_NOT_EXIST]);
+    _assertErrorLocation2(_errors[0], "other.dart");
+  }
+
+  void _assertErrorLocation(
+      AnalysisError error, int expectedOffset, int expectedLength) {
+    expect(error.offset, expectedOffset, reason: error.toString());
+    expect(error.length, expectedLength, reason: error.toString());
+  }
+
+  void _assertErrorLocation2(AnalysisError error, String expectedString) {
+    _assertErrorLocation(
+        error, _contents.indexOf(expectedString), expectedString.length);
+  }
+
+  void _verify(String contents, List<ErrorCode> expectedErrorCodes) {
+    this._contents = contents;
+    TestSource source = new TestSource(
+        FileUtilities2.createFile("/test.html").getAbsolutePath(), contents);
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(source);
+    _context.applyChanges(changeSet);
+    HtmlUnitBuilder builder = new HtmlUnitBuilder(_context);
+    builder.buildHtmlElement(source, _context.parseHtmlUnit(source));
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    errorListener.addAll2(builder.errorListener);
+    errorListener.assertErrorsWithCodes(expectedErrorCodes);
+    _errors = errorListener.errors;
+  }
+}
+
+/**
+ * Instances of the class `MockDartSdk` implement a [DartSdk].
+ */
+class MockDartSdk implements DartSdk {
+  @override
+  AnalysisContext get context => null;
+
+  @override
+  List<SdkLibrary> get sdkLibraries => null;
+
+  @override
+  String get sdkVersion => null;
+
+  @override
+  List<String> get uris => null;
+
+  @override
+  Source fromFileUri(Uri uri) => null;
+
+  @override
+  SdkLibrary getSdkLibrary(String dartUri) => null;
+
+  @override
+  Source mapDartUri(String dartUri) => null;
+}
+
+@reflectiveTest
+class ReferenceFinderTest extends EngineTestCase {
+  DirectedGraph<ConstantEvaluationTarget> _referenceGraph;
+  VariableElement _head;
+  Element _tail;
+  @override
+  void setUp() {
+    _referenceGraph = new DirectedGraph<ConstantEvaluationTarget>();
+    _head = ElementFactory.topLevelVariableElement2("v1");
+  }
+
+  void test_visitSimpleIdentifier_const() {
+    _visitNode(_makeTailVariable("v2", true));
+    _assertOneArc(_tail);
+  }
+
+  void test_visitSimpleIdentifier_nonConst() {
+    _visitNode(_makeTailVariable("v2", false));
+    _assertOneArc(_tail);
+  }
+
+  void test_visitSuperConstructorInvocation_const() {
+    _visitNode(_makeTailSuperConstructorInvocation("A", true));
+    _assertOneArc(_tail);
+  }
+
+  void test_visitSuperConstructorInvocation_nonConst() {
+    _visitNode(_makeTailSuperConstructorInvocation("A", false));
+    _assertOneArc(_tail);
+  }
+
+  void test_visitSuperConstructorInvocation_unresolved() {
+    SuperConstructorInvocation superConstructorInvocation =
+        AstFactory.superConstructorInvocation();
+    _visitNode(superConstructorInvocation);
+    _assertNoArcs();
+  }
+
+  void _assertNoArcs() {
+    Set<ConstantEvaluationTarget> tails = _referenceGraph.getTails(_head);
+    expect(tails, hasLength(0));
+  }
+
+  void _assertOneArc(Element tail) {
+    Set<ConstantEvaluationTarget> tails = _referenceGraph.getTails(_head);
+    expect(tails, hasLength(1));
+    expect(tails.first, same(tail));
+  }
+
+  ReferenceFinder _createReferenceFinder(ConstantEvaluationTarget source) =>
+      new ReferenceFinder((ConstantEvaluationTarget dependency) {
+        _referenceGraph.addEdge(source, dependency);
+      });
+  SuperConstructorInvocation _makeTailSuperConstructorInvocation(
+      String name, bool isConst) {
+    List<ConstructorInitializer> initializers =
+        new List<ConstructorInitializer>();
+    ConstructorDeclaration constructorDeclaration = AstFactory
+        .constructorDeclaration(AstFactory.identifier3(name), null,
+            AstFactory.formalParameterList(), initializers);
+    if (isConst) {
+      constructorDeclaration.constKeyword = new KeywordToken(Keyword.CONST, 0);
+    }
+    ClassElementImpl classElement = ElementFactory.classElement2(name);
+    SuperConstructorInvocation superConstructorInvocation =
+        AstFactory.superConstructorInvocation();
+    ConstructorElementImpl constructorElement =
+        ElementFactory.constructorElement(classElement, name, isConst);
+    _tail = constructorElement;
+    superConstructorInvocation.staticElement = constructorElement;
+    return superConstructorInvocation;
+  }
+
+  SimpleIdentifier _makeTailVariable(String name, bool isConst) {
+    VariableDeclaration variableDeclaration =
+        AstFactory.variableDeclaration(name);
+    ConstLocalVariableElementImpl variableElement =
+        ElementFactory.constLocalVariableElement(name);
+    _tail = variableElement;
+    variableElement.const3 = isConst;
+    AstFactory.variableDeclarationList2(
+        isConst ? Keyword.CONST : Keyword.VAR, [variableDeclaration]);
+    SimpleIdentifier identifier = AstFactory.identifier3(name);
+    identifier.staticElement = variableElement;
+    return identifier;
+  }
+
+  void _visitNode(AstNode node) {
+    node.accept(_createReferenceFinder(_head));
+  }
+}
+
+@reflectiveTest
+class SDKLibrariesReaderTest extends EngineTestCase {
+  void test_readFrom_dart2js() {
+    LibraryMap libraryMap = new SdkLibrariesReader(true).readFromFile(
+        FileUtilities2.createFile("/libs.dart"),
+        r'''
+final Map<String, LibraryInfo> LIBRARIES = const <String, LibraryInfo> {
+  'first' : const LibraryInfo(
+    'first/first.dart',
+    category: 'First',
+    documented: true,
+    platforms: VM_PLATFORM,
+    dart2jsPath: 'first/first_dart2js.dart'),
+};''');
+    expect(libraryMap, isNotNull);
+    expect(libraryMap.size(), 1);
+    SdkLibrary first = libraryMap.getLibrary("dart:first");
+    expect(first, isNotNull);
+    expect(first.category, "First");
+    expect(first.path, "first/first_dart2js.dart");
+    expect(first.shortName, "dart:first");
+    expect(first.isDart2JsLibrary, false);
+    expect(first.isDocumented, true);
+    expect(first.isImplementation, false);
+    expect(first.isVmLibrary, true);
+  }
+
+  void test_readFrom_empty() {
+    LibraryMap libraryMap = new SdkLibrariesReader(false)
+        .readFromFile(FileUtilities2.createFile("/libs.dart"), "");
+    expect(libraryMap, isNotNull);
+    expect(libraryMap.size(), 0);
+  }
+
+  void test_readFrom_normal() {
+    LibraryMap libraryMap = new SdkLibrariesReader(false).readFromFile(
+        FileUtilities2.createFile("/libs.dart"),
+        r'''
+final Map<String, LibraryInfo> LIBRARIES = const <String, LibraryInfo> {
+  'first' : const LibraryInfo(
+    'first/first.dart',
+    category: 'First',
+    documented: true,
+    platforms: VM_PLATFORM),
+
+  'second' : const LibraryInfo(
+    'second/second.dart',
+    category: 'Second',
+    documented: false,
+    implementation: true,
+    platforms: 0),
+};''');
+    expect(libraryMap, isNotNull);
+    expect(libraryMap.size(), 2);
+    SdkLibrary first = libraryMap.getLibrary("dart:first");
+    expect(first, isNotNull);
+    expect(first.category, "First");
+    expect(first.path, "first/first.dart");
+    expect(first.shortName, "dart:first");
+    expect(first.isDart2JsLibrary, false);
+    expect(first.isDocumented, true);
+    expect(first.isImplementation, false);
+    expect(first.isVmLibrary, true);
+    SdkLibrary second = libraryMap.getLibrary("dart:second");
+    expect(second, isNotNull);
+    expect(second.category, "Second");
+    expect(second.path, "second/second.dart");
+    expect(second.shortName, "dart:second");
+    expect(second.isDart2JsLibrary, false);
+    expect(second.isDocumented, false);
+    expect(second.isImplementation, true);
+    expect(second.isVmLibrary, false);
+  }
+}
+
+@reflectiveTest
+class StringScannerTest extends AbstractScannerTest {
+  @override
+  ht.AbstractScanner newScanner(String input) {
+    return new ht.StringScanner(null, input);
+  }
+}
+
+/**
+ * Instances of the class `ToSourceVisitorTest`
+ */
+@reflectiveTest
+class ToSourceVisitorTest extends EngineTestCase {
+  void fail_visitHtmlScriptTagNode_attributes_content() {
+    _assertSource(
+        "<script type='application/dart'>f() {}</script>",
+        HtmlFactory.scriptTagWithContent(
+            "f() {}", [HtmlFactory.attribute("type", "'application/dart'")]));
+  }
+
+  void fail_visitHtmlScriptTagNode_noAttributes_content() {
+    _assertSource(
+        "<script>f() {}</script>", HtmlFactory.scriptTagWithContent("f() {}"));
+  }
+
+  void test_visitHtmlScriptTagNode_attributes_noContent() {
+    _assertSource(
+        "<script type='application/dart'/>",
+        HtmlFactory
+            .scriptTag([HtmlFactory.attribute("type", "'application/dart'")]));
+  }
+
+  void test_visitHtmlScriptTagNode_noAttributes_noContent() {
+    _assertSource("<script/>", HtmlFactory.scriptTag());
+  }
+
+  void test_visitHtmlUnit_empty() {
+    _assertSource("", new ht.HtmlUnit(null, new List<ht.XmlTagNode>(), null));
+  }
+
+  void test_visitHtmlUnit_nonEmpty() {
+    _assertSource(
+        "<html/>", new ht.HtmlUnit(null, [HtmlFactory.tagNode("html")], null));
+  }
+
+  void test_visitXmlAttributeNode() {
+    _assertSource("x=y", HtmlFactory.attribute("x", "y"));
+  }
+
+  /**
+   * Assert that a `ToSourceVisitor` will produce the expected source when visiting the given
+   * node.
+   *
+   * @param expectedSource the source string that the visitor is expected to produce
+   * @param node the AST node being visited to produce the actual source
+   */
+  void _assertSource(String expectedSource, ht.XmlNode node) {
+    PrintStringWriter writer = new PrintStringWriter();
+    node.accept(new ht.ToSourceVisitor(writer));
+    expect(writer.toString(), expectedSource);
+  }
+}
+
+@reflectiveTest
+class UriKindTest {
+  void test_fromEncoding() {
+    expect(UriKind.fromEncoding(0x64), same(UriKind.DART_URI));
+    expect(UriKind.fromEncoding(0x66), same(UriKind.FILE_URI));
+    expect(UriKind.fromEncoding(0x70), same(UriKind.PACKAGE_URI));
+    expect(UriKind.fromEncoding(0x58), same(null));
+  }
+
+  void test_getEncoding() {
+    expect(UriKind.DART_URI.encoding, 0x64);
+    expect(UriKind.FILE_URI.encoding, 0x66);
+    expect(UriKind.PACKAGE_URI.encoding, 0x70);
+  }
+}
+
+/**
+ * Instances of `XmlValidator` traverse an [XmlNode] structure and validate the node
+ * hierarchy.
+ */
+class XmlValidator extends ht.RecursiveXmlVisitor<Object> {
+  /**
+   * A list containing the errors found while traversing the AST structure.
+   */
+  List<String> _errors = new List<String>();
+  /**
+   * The tags to expect when visiting or `null` if tags should not be checked.
+   */
+  List<XmlValidator_Tag> _expectedTagsInOrderVisited;
+  /**
+   * The current index into the [expectedTagsInOrderVisited] array.
+   */
+  int _expectedTagsIndex = 0;
+  /**
+   * The key/value pairs to expect when visiting or `null` if attributes should not be
+   * checked.
+   */
+  List<String> _expectedAttributeKeyValuePairs;
+  /**
+   * The current index into the [expectedAttributeKeyValuePairs].
+   */
+  int _expectedAttributeIndex = 0;
+  /**
+   * Assert that no errors were found while traversing any of the AST structures that have been
+   * visited.
+   */
+  void assertValid() {
+    while (_expectedTagsIndex < _expectedTagsInOrderVisited.length) {
+      String expectedTag =
+          _expectedTagsInOrderVisited[_expectedTagsIndex++]._tag;
+      _errors.add("Expected to visit node with tag: $expectedTag");
+    }
+    if (!_errors.isEmpty) {
+      StringBuffer buffer = new StringBuffer();
+      buffer.write("Invalid XML structure:");
+      for (String message in _errors) {
+        buffer.writeln();
+        buffer.write("   ");
+        buffer.write(message);
+      }
+      fail(buffer.toString());
+    }
+  }
+
+  /**
+   * Set the tags to be expected when visiting
+   *
+   * @param expectedTags the expected tags
+   */
+  void expectTags(List<XmlValidator_Tag> expectedTags) {
+    // Flatten the hierarchy into expected order in which the tags are visited
+    List<XmlValidator_Tag> expected = new List<XmlValidator_Tag>();
+    _expectTags(expected, expectedTags);
+    this._expectedTagsInOrderVisited = expected;
+  }
+
+  @override
+  Object visitHtmlUnit(ht.HtmlUnit node) {
+    if (node.parent != null) {
+      _errors.add("HtmlUnit should not have a parent");
+    }
+    if (node.endToken.type != ht.TokenType.EOF) {
+      _errors.add("HtmlUnit end token should be of type EOF");
+    }
+    _validateNode(node);
+    return super.visitHtmlUnit(node);
+  }
+
+  @override
+  Object visitXmlAttributeNode(ht.XmlAttributeNode actual) {
+    if (actual.parent is! ht.XmlTagNode) {
+      _errors.add(
+          "Expected ${actual.runtimeType} to have parent of type XmlTagNode");
+    }
+    String actualName = actual.name;
+    String actualValue = actual.valueToken.lexeme;
+    if (_expectedAttributeIndex < _expectedAttributeKeyValuePairs.length) {
+      String expectedName =
+          _expectedAttributeKeyValuePairs[_expectedAttributeIndex];
+      if (expectedName != actualName) {
+        _errors.add(
+            "Expected ${_expectedTagsIndex - 1} tag: ${_expectedTagsInOrderVisited[_expectedTagsIndex - 1]._tag} attribute ${_expectedAttributeIndex ~/ 2} to have name: $expectedName but found: $actualName");
+      }
+      String expectedValue =
+          _expectedAttributeKeyValuePairs[_expectedAttributeIndex + 1];
+      if (expectedValue != actualValue) {
+        _errors.add(
+            "Expected ${_expectedTagsIndex - 1} tag: ${_expectedTagsInOrderVisited[_expectedTagsIndex - 1]._tag} attribute ${_expectedAttributeIndex ~/ 2} to have value: $expectedValue but found: $actualValue");
+      }
+    } else {
+      _errors.add(
+          "Unexpected ${_expectedTagsIndex - 1} tag: ${_expectedTagsInOrderVisited[_expectedTagsIndex - 1]._tag} attribute ${_expectedAttributeIndex ~/ 2} name: $actualName value: $actualValue");
+    }
+    _expectedAttributeIndex += 2;
+    _validateNode(actual);
+    return super.visitXmlAttributeNode(actual);
+  }
+
+  @override
+  Object visitXmlTagNode(ht.XmlTagNode actual) {
+    if (!(actual.parent is ht.HtmlUnit || actual.parent is ht.XmlTagNode)) {
+      _errors.add(
+          "Expected ${actual.runtimeType} to have parent of type HtmlUnit or XmlTagNode");
+    }
+    if (_expectedTagsInOrderVisited != null) {
+      String actualTag = actual.tag;
+      if (_expectedTagsIndex < _expectedTagsInOrderVisited.length) {
+        XmlValidator_Tag expected =
+            _expectedTagsInOrderVisited[_expectedTagsIndex];
+        if (expected._tag != actualTag) {
+          _errors.add(
+              "Expected $_expectedTagsIndex tag: ${expected._tag} but found: $actualTag");
+        }
+        _expectedAttributeKeyValuePairs = expected._attributes._keyValuePairs;
+        int expectedAttributeCount =
+            _expectedAttributeKeyValuePairs.length ~/ 2;
+        int actualAttributeCount = actual.attributes.length;
+        if (expectedAttributeCount != actualAttributeCount) {
+          _errors.add(
+              "Expected $_expectedTagsIndex tag: ${expected._tag} to have $expectedAttributeCount attributes but found $actualAttributeCount");
+        }
+        _expectedAttributeIndex = 0;
+        _expectedTagsIndex++;
+        expect(actual.attributeEnd, isNotNull);
+        expect(actual.contentEnd, isNotNull);
+        int count = 0;
+        ht.Token token = actual.attributeEnd.next;
+        ht.Token lastToken = actual.contentEnd;
+        while (!identical(token, lastToken)) {
+          token = token.next;
+          if (++count > 1000) {
+            fail(
+                "Expected $_expectedTagsIndex tag: ${expected._tag} to have a sequence of tokens from getAttributeEnd() to getContentEnd()");
+            break;
+          }
+        }
+        if (actual.attributeEnd.type == ht.TokenType.GT) {
+          if (ht.HtmlParser.SELF_CLOSING.contains(actual.tag)) {
+            expect(actual.closingTag, isNull);
+          } else {
+            expect(actual.closingTag, isNotNull);
+          }
+        } else if (actual.attributeEnd.type == ht.TokenType.SLASH_GT) {
+          expect(actual.closingTag, isNull);
+        } else {
+          fail("Unexpected attribute end token: ${actual.attributeEnd.lexeme}");
+        }
+        if (expected._content != null && expected._content != actual.content) {
+          _errors.add(
+              "Expected $_expectedTagsIndex tag: ${expected._tag} to have content '${expected._content}' but found '${actual.content}'");
+        }
+        if (expected._children.length != actual.tagNodes.length) {
+          _errors.add(
+              "Expected $_expectedTagsIndex tag: ${expected._tag} to have ${expected._children.length} children but found ${actual.tagNodes.length}");
+        } else {
+          for (int index = 0; index < expected._children.length; index++) {
+            String expectedChildTag = expected._children[index]._tag;
+            String actualChildTag = actual.tagNodes[index].tag;
+            if (expectedChildTag != actualChildTag) {
+              _errors.add(
+                  "Expected $_expectedTagsIndex tag: ${expected._tag} child $index to have tag: $expectedChildTag but found: $actualChildTag");
+            }
+          }
+        }
+      } else {
+        _errors.add("Visited unexpected tag: $actualTag");
+      }
+    }
+    _validateNode(actual);
+    return super.visitXmlTagNode(actual);
+  }
+
+  /**
+   * Append the specified tags to the array in depth first order
+   *
+   * @param expected the array to which the tags are added (not `null`)
+   * @param expectedTags the expected tags to be added (not `null`, contains no `null`s)
+   */
+  void _expectTags(
+      List<XmlValidator_Tag> expected, List<XmlValidator_Tag> expectedTags) {
+    for (XmlValidator_Tag tag in expectedTags) {
+      expected.add(tag);
+      _expectTags(expected, tag._children);
+    }
+  }
+
+  void _validateNode(ht.XmlNode node) {
+    if (node.beginToken == null) {
+      _errors.add("No begin token for ${node.runtimeType}");
+    }
+    if (node.endToken == null) {
+      _errors.add("No end token for ${node.runtimeType}");
+    }
+    int nodeStart = node.offset;
+    int nodeLength = node.length;
+    if (nodeStart < 0 || nodeLength < 0) {
+      _errors.add("No source info for ${node.runtimeType}");
+    }
+    ht.XmlNode parent = node.parent;
+    if (parent != null) {
+      int nodeEnd = nodeStart + nodeLength;
+      int parentStart = parent.offset;
+      int parentEnd = parentStart + parent.length;
+      if (nodeStart < parentStart) {
+        _errors.add(
+            "Invalid source start ($nodeStart) for ${node.runtimeType} inside ${parent.runtimeType} ($parentStart)");
+      }
+      if (nodeEnd > parentEnd) {
+        _errors.add(
+            "Invalid source end ($nodeEnd) for ${node.runtimeType} inside ${parent.runtimeType} ($parentStart)");
+      }
+    }
+  }
+}
+
+class XmlValidator_Attributes {
+  final List<String> _keyValuePairs;
+  XmlValidator_Attributes([this._keyValuePairs = StringUtilities.EMPTY_ARRAY]);
+}
+
+class XmlValidator_Tag {
+  static const List<XmlValidator_Tag> EMPTY_LIST = const <XmlValidator_Tag>[];
+  final String _tag;
+  final XmlValidator_Attributes _attributes;
+  final String _content;
+  final List<XmlValidator_Tag> _children;
+  XmlValidator_Tag(this._tag, this._attributes, this._content,
+      [this._children = EMPTY_LIST]);
+}
+
+class _ExpectedScript {
+  String _expectedExternalScriptName;
+  HtmlUnitBuilderTest_ExpectedLibrary _expectedLibrary;
+  _ExpectedScript.con1(HtmlUnitBuilderTest_ExpectedLibrary expectedLibrary) {
+    this._expectedExternalScriptName = null;
+    this._expectedLibrary = expectedLibrary;
+  }
+  _ExpectedScript.con2(String expectedExternalScriptPath) {
+    this._expectedExternalScriptName = expectedExternalScriptPath;
+    this._expectedLibrary = null;
+  }
+  void _validate(int scriptIndex, HtmlScriptElement script) {
+    if (_expectedLibrary != null) {
+      _validateEmbedded(scriptIndex, script);
+    } else {
+      _validateExternal(scriptIndex, script);
+    }
+  }
+
+  void _validateEmbedded(int scriptIndex, HtmlScriptElement script) {
+    if (script is! EmbeddedHtmlScriptElementImpl) {
+      fail(
+          "Expected script $scriptIndex to be embedded, but found ${script != null ? script.runtimeType : "null"}");
+    }
+    EmbeddedHtmlScriptElementImpl embeddedScript =
+        script as EmbeddedHtmlScriptElementImpl;
+    _expectedLibrary._validate(scriptIndex, embeddedScript);
+  }
+
+  void _validateExternal(int scriptIndex, HtmlScriptElement script) {
+    if (script is! ExternalHtmlScriptElementImpl) {
+      fail(
+          "Expected script $scriptIndex to be external with src=$_expectedExternalScriptName but found ${script != null ? script.runtimeType : "null"}");
+    }
+    ExternalHtmlScriptElementImpl externalScript =
+        script as ExternalHtmlScriptElementImpl;
+    Source scriptSource = externalScript.scriptSource;
+    if (_expectedExternalScriptName == null) {
+      expect(scriptSource, isNull, reason: "script $scriptIndex");
+    } else {
+      expect(scriptSource, isNotNull, reason: "script $scriptIndex");
+      String actualExternalScriptName = scriptSource.shortName;
+      expect(actualExternalScriptName, _expectedExternalScriptName,
+          reason: "script $scriptIndex");
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/ast_test.dart b/mojo/public/dart/third_party/analyzer/test/generated/ast_test.dart
new file mode 100644
index 0000000..4f8142a
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/generated/ast_test.dart
@@ -0,0 +1,3903 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.ast_test;
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/java_engine.dart' show Predicate;
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/testing/ast_factory.dart';
+import 'package:analyzer/src/generated/testing/token_factory.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+import '../utils.dart';
+import 'parser_test.dart' show ParserTestCase;
+import 'test_support.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(BreadthFirstVisitorTest);
+  runReflectiveTests(ClassDeclarationTest);
+  runReflectiveTests(ClassTypeAliasTest);
+  runReflectiveTests(ConstantEvaluatorTest);
+  runReflectiveTests(ConstructorDeclarationTest);
+  runReflectiveTests(FieldFormalParameterTest);
+  runReflectiveTests(IndexExpressionTest);
+  runReflectiveTests(NodeListTest);
+  runReflectiveTests(NodeLocatorTest);
+  runReflectiveTests(SimpleIdentifierTest);
+  runReflectiveTests(SimpleStringLiteralTest);
+  runReflectiveTests(StringInterpolationTest);
+  runReflectiveTests(ToSourceVisitorTest);
+  runReflectiveTests(VariableDeclarationTest);
+}
+
+class AssignmentKind extends Enum<AssignmentKind> {
+  static const AssignmentKind BINARY = const AssignmentKind('BINARY', 0);
+
+  static const AssignmentKind COMPOUND_LEFT =
+      const AssignmentKind('COMPOUND_LEFT', 1);
+
+  static const AssignmentKind COMPOUND_RIGHT =
+      const AssignmentKind('COMPOUND_RIGHT', 2);
+
+  static const AssignmentKind POSTFIX_INC =
+      const AssignmentKind('POSTFIX_INC', 3);
+
+  static const AssignmentKind PREFIX_DEC =
+      const AssignmentKind('PREFIX_DEC', 4);
+
+  static const AssignmentKind PREFIX_INC =
+      const AssignmentKind('PREFIX_INC', 5);
+
+  static const AssignmentKind PREFIX_NOT =
+      const AssignmentKind('PREFIX_NOT', 6);
+
+  static const AssignmentKind SIMPLE_LEFT =
+      const AssignmentKind('SIMPLE_LEFT', 7);
+
+  static const AssignmentKind SIMPLE_RIGHT =
+      const AssignmentKind('SIMPLE_RIGHT', 8);
+
+  static const AssignmentKind NONE = const AssignmentKind('NONE', 9);
+
+  static const List<AssignmentKind> values = const [
+    BINARY,
+    COMPOUND_LEFT,
+    COMPOUND_RIGHT,
+    POSTFIX_INC,
+    PREFIX_DEC,
+    PREFIX_INC,
+    PREFIX_NOT,
+    SIMPLE_LEFT,
+    SIMPLE_RIGHT,
+    NONE
+  ];
+
+  const AssignmentKind(String name, int ordinal) : super(name, ordinal);
+}
+
+class BreadthFirstVisitor_BreadthFirstVisitorTest_testIt
+    extends BreadthFirstVisitor<Object> {
+  List<AstNode> nodes;
+
+  BreadthFirstVisitor_BreadthFirstVisitorTest_testIt(this.nodes) : super();
+
+  @override
+  Object visitNode(AstNode node) {
+    nodes.add(node);
+    return super.visitNode(node);
+  }
+}
+
+@reflectiveTest
+class BreadthFirstVisitorTest extends ParserTestCase {
+  void test_it() {
+    String source = r'''
+class A {
+  bool get g => true;
+}
+class B {
+  int f() {
+    num q() {
+      return 3;
+    }
+  return q() + 4;
+  }
+}
+A f(var p) {
+  if ((p as A).g) {
+    return p;
+  } else {
+    return null;
+  }
+}''';
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(source);
+    List<AstNode> nodes = new List<AstNode>();
+    BreadthFirstVisitor<Object> visitor =
+        new BreadthFirstVisitor_BreadthFirstVisitorTest_testIt(nodes);
+    visitor.visitAllNodes(unit);
+    expect(nodes, hasLength(59));
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is CompilationUnit, CompilationUnit, nodes[0]);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ClassDeclaration, ClassDeclaration, nodes[2]);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is FunctionDeclaration, FunctionDeclaration, nodes[3]);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is FunctionDeclarationStatement,
+        FunctionDeclarationStatement,
+        nodes[27]);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is IntegerLiteral, IntegerLiteral, nodes[58]);
+    //3
+  }
+}
+
+@reflectiveTest
+class ClassDeclarationTest extends ParserTestCase {
+  void test_getConstructor() {
+    List<ConstructorInitializer> initializers =
+        new List<ConstructorInitializer>();
+    ConstructorDeclaration defaultConstructor = AstFactory
+        .constructorDeclaration(AstFactory.identifier3("Test"), null,
+            AstFactory.formalParameterList(), initializers);
+    ConstructorDeclaration aConstructor = AstFactory.constructorDeclaration(
+        AstFactory.identifier3("Test"),
+        "a",
+        AstFactory.formalParameterList(),
+        initializers);
+    ConstructorDeclaration bConstructor = AstFactory.constructorDeclaration(
+        AstFactory.identifier3("Test"),
+        "b",
+        AstFactory.formalParameterList(),
+        initializers);
+    ClassDeclaration clazz = AstFactory.classDeclaration(null, "Test", null,
+        null, null, null, [defaultConstructor, aConstructor, bConstructor]);
+    expect(clazz.getConstructor(null), same(defaultConstructor));
+    expect(clazz.getConstructor("a"), same(aConstructor));
+    expect(clazz.getConstructor("b"), same(bConstructor));
+    expect(clazz.getConstructor("noSuchConstructor"), same(null));
+  }
+
+  void test_getField() {
+    VariableDeclaration aVar = AstFactory.variableDeclaration("a");
+    VariableDeclaration bVar = AstFactory.variableDeclaration("b");
+    VariableDeclaration cVar = AstFactory.variableDeclaration("c");
+    ClassDeclaration clazz =
+        AstFactory.classDeclaration(null, "Test", null, null, null, null, [
+      AstFactory.fieldDeclaration2(false, null, [aVar]),
+      AstFactory.fieldDeclaration2(false, null, [bVar, cVar])
+    ]);
+    expect(clazz.getField("a"), same(aVar));
+    expect(clazz.getField("b"), same(bVar));
+    expect(clazz.getField("c"), same(cVar));
+    expect(clazz.getField("noSuchField"), same(null));
+  }
+
+  void test_getMethod() {
+    MethodDeclaration aMethod = AstFactory.methodDeclaration(null, null, null,
+        null, AstFactory.identifier3("a"), AstFactory.formalParameterList());
+    MethodDeclaration bMethod = AstFactory.methodDeclaration(null, null, null,
+        null, AstFactory.identifier3("b"), AstFactory.formalParameterList());
+    ClassDeclaration clazz = AstFactory.classDeclaration(
+        null, "Test", null, null, null, null, [aMethod, bMethod]);
+    expect(clazz.getMethod("a"), same(aMethod));
+    expect(clazz.getMethod("b"), same(bMethod));
+    expect(clazz.getMethod("noSuchMethod"), same(null));
+  }
+
+  void test_isAbstract() {
+    expect(
+        AstFactory
+            .classDeclaration(null, "A", null, null, null, null)
+            .isAbstract,
+        isFalse);
+    expect(
+        AstFactory
+            .classDeclaration(Keyword.ABSTRACT, "B", null, null, null, null)
+            .isAbstract,
+        isTrue);
+  }
+}
+
+@reflectiveTest
+class ClassTypeAliasTest extends ParserTestCase {
+  void test_isAbstract() {
+    expect(
+        AstFactory.classTypeAlias("A", null, null, null, null, null).isAbstract,
+        isFalse);
+    expect(
+        AstFactory
+            .classTypeAlias("B", null, Keyword.ABSTRACT, null, null, null)
+            .isAbstract,
+        isTrue);
+  }
+}
+
+@reflectiveTest
+class ConstantEvaluatorTest extends ParserTestCase {
+  void fail_constructor() {
+    Object value = _getConstantValue("?");
+    expect(value, null);
+  }
+
+  void fail_identifier_class() {
+    Object value = _getConstantValue("?");
+    expect(value, null);
+  }
+
+  void fail_identifier_function() {
+    Object value = _getConstantValue("?");
+    expect(value, null);
+  }
+
+  void fail_identifier_static() {
+    Object value = _getConstantValue("?");
+    expect(value, null);
+  }
+
+  void fail_identifier_staticMethod() {
+    Object value = _getConstantValue("?");
+    expect(value, null);
+  }
+
+  void fail_identifier_topLevel() {
+    Object value = _getConstantValue("?");
+    expect(value, null);
+  }
+
+  void fail_identifier_typeParameter() {
+    Object value = _getConstantValue("?");
+    expect(value, null);
+  }
+
+  void test_binary_bitAnd() {
+    Object value = _getConstantValue("74 & 42");
+    EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
+    expect(value as int, 74 & 42);
+  }
+
+  void test_binary_bitOr() {
+    Object value = _getConstantValue("74 | 42");
+    EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
+    expect(value as int, 74 | 42);
+  }
+
+  void test_binary_bitXor() {
+    Object value = _getConstantValue("74 ^ 42");
+    EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
+    expect(value as int, 74 ^ 42);
+  }
+
+  void test_binary_divide_double() {
+    Object value = _getConstantValue("3.2 / 2.3");
+    expect(value, 3.2 / 2.3);
+  }
+
+  void test_binary_divide_integer() {
+    Object value = _getConstantValue("3 / 2");
+    expect(value, 1.5);
+  }
+
+  void test_binary_equal_boolean() {
+    Object value = _getConstantValue("true == false");
+    expect(value, false);
+  }
+
+  void test_binary_equal_integer() {
+    Object value = _getConstantValue("2 == 3");
+    expect(value, false);
+  }
+
+  void test_binary_equal_invalidLeft() {
+    Object value = _getConstantValue("a == 3");
+    expect(value, ConstantEvaluator.NOT_A_CONSTANT);
+  }
+
+  void test_binary_equal_invalidRight() {
+    Object value = _getConstantValue("2 == a");
+    expect(value, ConstantEvaluator.NOT_A_CONSTANT);
+  }
+
+  void test_binary_equal_string() {
+    Object value = _getConstantValue("'a' == 'b'");
+    expect(value, false);
+  }
+
+  void test_binary_greaterThan() {
+    Object value = _getConstantValue("2 > 3");
+    expect(value, false);
+  }
+
+  void test_binary_greaterThanOrEqual() {
+    Object value = _getConstantValue("2 >= 3");
+    expect(value, false);
+  }
+
+  void test_binary_leftShift() {
+    Object value = _getConstantValue("16 << 2");
+    EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
+    expect(value as int, 64);
+  }
+
+  void test_binary_lessThan() {
+    Object value = _getConstantValue("2 < 3");
+    expect(value, true);
+  }
+
+  void test_binary_lessThanOrEqual() {
+    Object value = _getConstantValue("2 <= 3");
+    expect(value, true);
+  }
+
+  void test_binary_logicalAnd() {
+    Object value = _getConstantValue("true && false");
+    expect(value, false);
+  }
+
+  void test_binary_logicalOr() {
+    Object value = _getConstantValue("true || false");
+    expect(value, true);
+  }
+
+  void test_binary_minus_double() {
+    Object value = _getConstantValue("3.2 - 2.3");
+    expect(value, 3.2 - 2.3);
+  }
+
+  void test_binary_minus_integer() {
+    Object value = _getConstantValue("3 - 2");
+    expect(value, 1);
+  }
+
+  void test_binary_notEqual_boolean() {
+    Object value = _getConstantValue("true != false");
+    expect(value, true);
+  }
+
+  void test_binary_notEqual_integer() {
+    Object value = _getConstantValue("2 != 3");
+    expect(value, true);
+  }
+
+  void test_binary_notEqual_invalidLeft() {
+    Object value = _getConstantValue("a != 3");
+    expect(value, ConstantEvaluator.NOT_A_CONSTANT);
+  }
+
+  void test_binary_notEqual_invalidRight() {
+    Object value = _getConstantValue("2 != a");
+    expect(value, ConstantEvaluator.NOT_A_CONSTANT);
+  }
+
+  void test_binary_notEqual_string() {
+    Object value = _getConstantValue("'a' != 'b'");
+    expect(value, true);
+  }
+
+  void test_binary_plus_double() {
+    Object value = _getConstantValue("2.3 + 3.2");
+    expect(value, 2.3 + 3.2);
+  }
+
+  void test_binary_plus_integer() {
+    Object value = _getConstantValue("2 + 3");
+    expect(value, 5);
+  }
+
+  void test_binary_remainder_double() {
+    Object value = _getConstantValue("3.2 % 2.3");
+    expect(value, 3.2 % 2.3);
+  }
+
+  void test_binary_remainder_integer() {
+    Object value = _getConstantValue("8 % 3");
+    expect(value, 2);
+  }
+
+  void test_binary_rightShift() {
+    Object value = _getConstantValue("64 >> 2");
+    EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
+    expect(value as int, 16);
+  }
+
+  void test_binary_times_double() {
+    Object value = _getConstantValue("2.3 * 3.2");
+    expect(value, 2.3 * 3.2);
+  }
+
+  void test_binary_times_integer() {
+    Object value = _getConstantValue("2 * 3");
+    expect(value, 6);
+  }
+
+  void test_binary_truncatingDivide_double() {
+    Object value = _getConstantValue("3.2 ~/ 2.3");
+    EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
+    expect(value as int, 1);
+  }
+
+  void test_binary_truncatingDivide_integer() {
+    Object value = _getConstantValue("10 ~/ 3");
+    EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
+    expect(value as int, 3);
+  }
+
+  void test_literal_boolean_false() {
+    Object value = _getConstantValue("false");
+    expect(value, false);
+  }
+
+  void test_literal_boolean_true() {
+    Object value = _getConstantValue("true");
+    expect(value, true);
+  }
+
+  void test_literal_list() {
+    Object value = _getConstantValue("['a', 'b', 'c']");
+    EngineTestCase.assertInstanceOf((obj) => obj is List, List, value);
+    List list = value as List;
+    expect(list.length, 3);
+    expect(list[0], "a");
+    expect(list[1], "b");
+    expect(list[2], "c");
+  }
+
+  void test_literal_map() {
+    Object value = _getConstantValue("{'a' : 'm', 'b' : 'n', 'c' : 'o'}");
+    EngineTestCase.assertInstanceOf((obj) => obj is Map, Map, value);
+    Map map = value as Map;
+    expect(map.length, 3);
+    expect(map["a"], "m");
+    expect(map["b"], "n");
+    expect(map["c"], "o");
+  }
+
+  void test_literal_null() {
+    Object value = _getConstantValue("null");
+    expect(value, null);
+  }
+
+  void test_literal_number_double() {
+    Object value = _getConstantValue("3.45");
+    expect(value, 3.45);
+  }
+
+  void test_literal_number_integer() {
+    Object value = _getConstantValue("42");
+    expect(value, 42);
+  }
+
+  void test_literal_string_adjacent() {
+    Object value = _getConstantValue("'abc' 'def'");
+    expect(value, "abcdef");
+  }
+
+  void test_literal_string_interpolation_invalid() {
+    Object value = _getConstantValue("'a\${f()}c'");
+    expect(value, ConstantEvaluator.NOT_A_CONSTANT);
+  }
+
+  void test_literal_string_interpolation_valid() {
+    Object value = _getConstantValue("'a\${3}c'");
+    expect(value, "a3c");
+  }
+
+  void test_literal_string_simple() {
+    Object value = _getConstantValue("'abc'");
+    expect(value, "abc");
+  }
+
+  void test_parenthesizedExpression() {
+    Object value = _getConstantValue("('a')");
+    expect(value, "a");
+  }
+
+  void test_unary_bitNot() {
+    Object value = _getConstantValue("~42");
+    EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
+    expect(value as int, ~42);
+  }
+
+  void test_unary_logicalNot() {
+    Object value = _getConstantValue("!true");
+    expect(value, false);
+  }
+
+  void test_unary_negated_double() {
+    Object value = _getConstantValue("-42.3");
+    expect(value, -42.3);
+  }
+
+  void test_unary_negated_integer() {
+    Object value = _getConstantValue("-42");
+    expect(value, -42);
+  }
+
+  Object _getConstantValue(String source) =>
+      parseExpression(source).accept(new ConstantEvaluator());
+}
+
+@reflectiveTest
+class ConstructorDeclarationTest extends EngineTestCase {
+  void test_firstTokenAfterCommentAndMetadata_all_inverted() {
+    Token externalKeyword = TokenFactory.tokenFromKeyword(Keyword.EXTERNAL);
+    externalKeyword.offset = 14;
+    ConstructorDeclaration declaration = AstFactory.constructorDeclaration2(
+        Keyword.CONST,
+        Keyword.FACTORY,
+        AstFactory.identifier3('int'),
+        null,
+        null,
+        null,
+        null);
+    declaration.externalKeyword = externalKeyword;
+    declaration.constKeyword.offset = 8;
+    Token factoryKeyword = declaration.factoryKeyword;
+    factoryKeyword.offset = 0;
+    expect(declaration.firstTokenAfterCommentAndMetadata, factoryKeyword);
+  }
+
+  void test_firstTokenAfterCommentAndMetadata_all_normal() {
+    Token token = TokenFactory.tokenFromKeyword(Keyword.EXTERNAL);
+    token.offset = 0;
+    ConstructorDeclaration declaration = AstFactory.constructorDeclaration2(
+        Keyword.CONST,
+        Keyword.FACTORY,
+        AstFactory.identifier3('int'),
+        null,
+        null,
+        null,
+        null);
+    declaration.externalKeyword = token;
+    declaration.constKeyword.offset = 9;
+    declaration.factoryKeyword.offset = 15;
+    expect(declaration.firstTokenAfterCommentAndMetadata, token);
+  }
+
+  void test_firstTokenAfterCommentAndMetadata_constOnly() {
+    ConstructorDeclaration declaration = AstFactory.constructorDeclaration2(
+        Keyword.CONST,
+        null,
+        AstFactory.identifier3('int'),
+        null,
+        null,
+        null,
+        null);
+    expect(declaration.firstTokenAfterCommentAndMetadata,
+        declaration.constKeyword);
+  }
+
+  void test_firstTokenAfterCommentAndMetadata_externalOnly() {
+    Token externalKeyword = TokenFactory.tokenFromKeyword(Keyword.EXTERNAL);
+    ConstructorDeclaration declaration = AstFactory.constructorDeclaration2(
+        null, null, AstFactory.identifier3('int'), null, null, null, null);
+    declaration.externalKeyword = externalKeyword;
+    expect(declaration.firstTokenAfterCommentAndMetadata, externalKeyword);
+  }
+
+  void test_firstTokenAfterCommentAndMetadata_factoryOnly() {
+    ConstructorDeclaration declaration = AstFactory.constructorDeclaration2(
+        null,
+        Keyword.FACTORY,
+        AstFactory.identifier3('int'),
+        null,
+        null,
+        null,
+        null);
+    expect(declaration.firstTokenAfterCommentAndMetadata,
+        declaration.factoryKeyword);
+  }
+}
+
+@reflectiveTest
+class FieldFormalParameterTest extends EngineTestCase {
+  void test_endToken_noParameters() {
+    FieldFormalParameter parameter = AstFactory.fieldFormalParameter2('field');
+    expect(parameter.endToken, parameter.identifier.endToken);
+  }
+
+  void test_endToken_parameters() {
+    FieldFormalParameter parameter = AstFactory.fieldFormalParameter(
+        null, null, 'field', AstFactory.formalParameterList([]));
+    expect(parameter.endToken, parameter.parameters.endToken);
+  }
+}
+
+@reflectiveTest
+class IndexExpressionTest extends EngineTestCase {
+  void test_inGetterContext_assignment_compound_left() {
+    IndexExpression expression = AstFactory.indexExpression(
+        AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    // a[b] += c
+    AstFactory.assignmentExpression(
+        expression, TokenType.PLUS_EQ, AstFactory.identifier3("c"));
+    expect(expression.inGetterContext(), isTrue);
+  }
+
+  void test_inGetterContext_assignment_simple_left() {
+    IndexExpression expression = AstFactory.indexExpression(
+        AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    // a[b] = c
+    AstFactory.assignmentExpression(
+        expression, TokenType.EQ, AstFactory.identifier3("c"));
+    expect(expression.inGetterContext(), isFalse);
+  }
+
+  void test_inGetterContext_nonAssignment() {
+    IndexExpression expression = AstFactory.indexExpression(
+        AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    // a[b] + c
+    AstFactory.binaryExpression(
+        expression, TokenType.PLUS, AstFactory.identifier3("c"));
+    expect(expression.inGetterContext(), isTrue);
+  }
+
+  void test_inSetterContext_assignment_compound_left() {
+    IndexExpression expression = AstFactory.indexExpression(
+        AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    // a[b] += c
+    AstFactory.assignmentExpression(
+        expression, TokenType.PLUS_EQ, AstFactory.identifier3("c"));
+    expect(expression.inSetterContext(), isTrue);
+  }
+
+  void test_inSetterContext_assignment_compound_right() {
+    IndexExpression expression = AstFactory.indexExpression(
+        AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    // c += a[b]
+    AstFactory.assignmentExpression(
+        AstFactory.identifier3("c"), TokenType.PLUS_EQ, expression);
+    expect(expression.inSetterContext(), isFalse);
+  }
+
+  void test_inSetterContext_assignment_simple_left() {
+    IndexExpression expression = AstFactory.indexExpression(
+        AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    // a[b] = c
+    AstFactory.assignmentExpression(
+        expression, TokenType.EQ, AstFactory.identifier3("c"));
+    expect(expression.inSetterContext(), isTrue);
+  }
+
+  void test_inSetterContext_assignment_simple_right() {
+    IndexExpression expression = AstFactory.indexExpression(
+        AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    // c = a[b]
+    AstFactory.assignmentExpression(
+        AstFactory.identifier3("c"), TokenType.EQ, expression);
+    expect(expression.inSetterContext(), isFalse);
+  }
+
+  void test_inSetterContext_nonAssignment() {
+    IndexExpression expression = AstFactory.indexExpression(
+        AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    AstFactory.binaryExpression(
+        expression, TokenType.PLUS, AstFactory.identifier3("c"));
+    // a[b] + cc
+    expect(expression.inSetterContext(), isFalse);
+  }
+
+  void test_inSetterContext_postfix() {
+    IndexExpression expression = AstFactory.indexExpression(
+        AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    AstFactory.postfixExpression(expression, TokenType.PLUS_PLUS);
+    // a[b]++
+    expect(expression.inSetterContext(), isTrue);
+  }
+
+  void test_inSetterContext_prefix_bang() {
+    IndexExpression expression = AstFactory.indexExpression(
+        AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    // !a[b]
+    AstFactory.prefixExpression(TokenType.BANG, expression);
+    expect(expression.inSetterContext(), isFalse);
+  }
+
+  void test_inSetterContext_prefix_minusMinus() {
+    IndexExpression expression = AstFactory.indexExpression(
+        AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    // --a[b]
+    AstFactory.prefixExpression(TokenType.MINUS_MINUS, expression);
+    expect(expression.inSetterContext(), isTrue);
+  }
+
+  void test_inSetterContext_prefix_plusPlus() {
+    IndexExpression expression = AstFactory.indexExpression(
+        AstFactory.identifier3("a"), AstFactory.identifier3("b"));
+    // ++a[b]
+    AstFactory.prefixExpression(TokenType.PLUS_PLUS, expression);
+    expect(expression.inSetterContext(), isTrue);
+  }
+}
+
+@reflectiveTest
+class NodeListTest extends EngineTestCase {
+  void test_add() {
+    AstNode parent = AstFactory.argumentList();
+    AstNode firstNode = AstFactory.booleanLiteral(true);
+    AstNode secondNode = AstFactory.booleanLiteral(false);
+    NodeList<AstNode> list = new NodeList<AstNode>(parent);
+    list.insert(0, secondNode);
+    list.insert(0, firstNode);
+    expect(list, hasLength(2));
+    expect(list[0], same(firstNode));
+    expect(list[1], same(secondNode));
+    expect(firstNode.parent, same(parent));
+    expect(secondNode.parent, same(parent));
+    AstNode thirdNode = AstFactory.booleanLiteral(false);
+    list.insert(1, thirdNode);
+    expect(list, hasLength(3));
+    expect(list[0], same(firstNode));
+    expect(list[1], same(thirdNode));
+    expect(list[2], same(secondNode));
+    expect(firstNode.parent, same(parent));
+    expect(secondNode.parent, same(parent));
+    expect(thirdNode.parent, same(parent));
+  }
+
+  void test_add_negative() {
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList());
+    try {
+      list.insert(-1, AstFactory.booleanLiteral(true));
+      fail("Expected IndexOutOfBoundsException");
+    } on RangeError {
+      // Expected
+    }
+  }
+
+  void test_add_tooBig() {
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList());
+    try {
+      list.insert(1, AstFactory.booleanLiteral(true));
+      fail("Expected IndexOutOfBoundsException");
+    } on RangeError {
+      // Expected
+    }
+  }
+
+  void test_addAll() {
+    AstNode parent = AstFactory.argumentList();
+    List<AstNode> firstNodes = new List<AstNode>();
+    AstNode firstNode = AstFactory.booleanLiteral(true);
+    AstNode secondNode = AstFactory.booleanLiteral(false);
+    firstNodes.add(firstNode);
+    firstNodes.add(secondNode);
+    NodeList<AstNode> list = new NodeList<AstNode>(parent);
+    list.addAll(firstNodes);
+    expect(list, hasLength(2));
+    expect(list[0], same(firstNode));
+    expect(list[1], same(secondNode));
+    expect(firstNode.parent, same(parent));
+    expect(secondNode.parent, same(parent));
+    List<AstNode> secondNodes = new List<AstNode>();
+    AstNode thirdNode = AstFactory.booleanLiteral(true);
+    AstNode fourthNode = AstFactory.booleanLiteral(false);
+    secondNodes.add(thirdNode);
+    secondNodes.add(fourthNode);
+    list.addAll(secondNodes);
+    expect(list, hasLength(4));
+    expect(list[0], same(firstNode));
+    expect(list[1], same(secondNode));
+    expect(list[2], same(thirdNode));
+    expect(list[3], same(fourthNode));
+    expect(firstNode.parent, same(parent));
+    expect(secondNode.parent, same(parent));
+    expect(thirdNode.parent, same(parent));
+    expect(fourthNode.parent, same(parent));
+  }
+
+  void test_creation() {
+    AstNode owner = AstFactory.argumentList();
+    NodeList<AstNode> list = new NodeList<AstNode>(owner);
+    expect(list, isNotNull);
+    expect(list, hasLength(0));
+    expect(list.owner, same(owner));
+  }
+
+  void test_get_negative() {
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList());
+    try {
+      list[-1];
+      fail("Expected IndexOutOfBoundsException");
+    } on RangeError {
+      // Expected
+    }
+  }
+
+  void test_get_tooBig() {
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList());
+    try {
+      list[1];
+      fail("Expected IndexOutOfBoundsException");
+    } on RangeError {
+      // Expected
+    }
+  }
+
+  void test_getBeginToken_empty() {
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList());
+    expect(list.beginToken, isNull);
+  }
+
+  void test_getBeginToken_nonEmpty() {
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList());
+    AstNode node =
+        AstFactory.parenthesizedExpression(AstFactory.booleanLiteral(true));
+    list.add(node);
+    expect(list.beginToken, same(node.beginToken));
+  }
+
+  void test_getEndToken_empty() {
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList());
+    expect(list.endToken, isNull);
+  }
+
+  void test_getEndToken_nonEmpty() {
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList());
+    AstNode node =
+        AstFactory.parenthesizedExpression(AstFactory.booleanLiteral(true));
+    list.add(node);
+    expect(list.endToken, same(node.endToken));
+  }
+
+  void test_indexOf() {
+    List<AstNode> nodes = new List<AstNode>();
+    AstNode firstNode = AstFactory.booleanLiteral(true);
+    AstNode secondNode = AstFactory.booleanLiteral(false);
+    AstNode thirdNode = AstFactory.booleanLiteral(true);
+    AstNode fourthNode = AstFactory.booleanLiteral(false);
+    nodes.add(firstNode);
+    nodes.add(secondNode);
+    nodes.add(thirdNode);
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList());
+    list.addAll(nodes);
+    expect(list, hasLength(3));
+    expect(list.indexOf(firstNode), 0);
+    expect(list.indexOf(secondNode), 1);
+    expect(list.indexOf(thirdNode), 2);
+    expect(list.indexOf(fourthNode), -1);
+    expect(list.indexOf(null), -1);
+  }
+
+  void test_remove() {
+    List<AstNode> nodes = new List<AstNode>();
+    AstNode firstNode = AstFactory.booleanLiteral(true);
+    AstNode secondNode = AstFactory.booleanLiteral(false);
+    AstNode thirdNode = AstFactory.booleanLiteral(true);
+    nodes.add(firstNode);
+    nodes.add(secondNode);
+    nodes.add(thirdNode);
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList());
+    list.addAll(nodes);
+    expect(list, hasLength(3));
+    expect(list.removeAt(1), same(secondNode));
+    expect(list, hasLength(2));
+    expect(list[0], same(firstNode));
+    expect(list[1], same(thirdNode));
+  }
+
+  void test_remove_negative() {
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList());
+    try {
+      list.removeAt(-1);
+      fail("Expected IndexOutOfBoundsException");
+    } on RangeError {
+      // Expected
+    }
+  }
+
+  void test_remove_tooBig() {
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList());
+    try {
+      list.removeAt(1);
+      fail("Expected IndexOutOfBoundsException");
+    } on RangeError {
+      // Expected
+    }
+  }
+
+  void test_set() {
+    List<AstNode> nodes = new List<AstNode>();
+    AstNode firstNode = AstFactory.booleanLiteral(true);
+    AstNode secondNode = AstFactory.booleanLiteral(false);
+    AstNode thirdNode = AstFactory.booleanLiteral(true);
+    nodes.add(firstNode);
+    nodes.add(secondNode);
+    nodes.add(thirdNode);
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList());
+    list.addAll(nodes);
+    expect(list, hasLength(3));
+    AstNode fourthNode = AstFactory.integer(0);
+    expect(javaListSet(list, 1, fourthNode), same(secondNode));
+    expect(list, hasLength(3));
+    expect(list[0], same(firstNode));
+    expect(list[1], same(fourthNode));
+    expect(list[2], same(thirdNode));
+  }
+
+  void test_set_negative() {
+    AstNode node = AstFactory.booleanLiteral(true);
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList());
+    try {
+      javaListSet(list, -1, node);
+      fail("Expected IndexOutOfBoundsException");
+    } on RangeError {
+      // Expected
+    }
+  }
+
+  void test_set_tooBig() {
+    AstNode node = AstFactory.booleanLiteral(true);
+    NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList());
+    try {
+      javaListSet(list, 1, node);
+      fail("Expected IndexOutOfBoundsException");
+    } on RangeError {
+      // Expected
+    }
+  }
+}
+
+@reflectiveTest
+class NodeLocatorTest extends ParserTestCase {
+  void test_range() {
+    CompilationUnit unit =
+        ParserTestCase.parseCompilationUnit("library myLib;");
+    _assertLocate(
+        unit, 4, 10, (node) => node is LibraryDirective, LibraryDirective);
+  }
+
+  void test_searchWithin_null() {
+    NodeLocator locator = new NodeLocator(0, 0);
+    expect(locator.searchWithin(null), isNull);
+  }
+
+  void test_searchWithin_offset() {
+    CompilationUnit unit =
+        ParserTestCase.parseCompilationUnit("library myLib;");
+    _assertLocate(
+        unit, 10, 10, (node) => node is SimpleIdentifier, SimpleIdentifier);
+  }
+
+  void test_searchWithin_offsetAfterNode() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(r'''
+class A {}
+class B {}''');
+    NodeLocator locator = new NodeLocator(1024, 1024);
+    AstNode node = locator.searchWithin(unit.declarations[0]);
+    expect(node, isNull);
+  }
+
+  void test_searchWithin_offsetBeforeNode() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(r'''
+class A {}
+class B {}''');
+    NodeLocator locator = new NodeLocator(0, 0);
+    AstNode node = locator.searchWithin(unit.declarations[1]);
+    expect(node, isNull);
+  }
+
+  void _assertLocate(CompilationUnit unit, int start, int end,
+      Predicate<AstNode> predicate, Type expectedClass) {
+    NodeLocator locator = new NodeLocator(start, end);
+    AstNode node = locator.searchWithin(unit);
+    expect(node, isNotNull);
+    expect(locator.foundNode, same(node));
+    expect(node.offset <= start, isTrue, reason: "Node starts after range");
+    expect(node.offset + node.length > end, isTrue,
+        reason: "Node ends before range");
+    EngineTestCase.assertInstanceOf(predicate, expectedClass, node);
+  }
+}
+
+@reflectiveTest
+class SimpleIdentifierTest extends ParserTestCase {
+  void test_inDeclarationContext_catch_exception() {
+    SimpleIdentifier identifier =
+        AstFactory.catchClause("e").exceptionParameter;
+    expect(identifier.inDeclarationContext(), isTrue);
+  }
+
+  void test_inDeclarationContext_catch_stack() {
+    SimpleIdentifier identifier =
+        AstFactory.catchClause2("e", "s").stackTraceParameter;
+    expect(identifier.inDeclarationContext(), isTrue);
+  }
+
+  void test_inDeclarationContext_classDeclaration() {
+    SimpleIdentifier identifier =
+        AstFactory.classDeclaration(null, "C", null, null, null, null).name;
+    expect(identifier.inDeclarationContext(), isTrue);
+  }
+
+  void test_inDeclarationContext_classTypeAlias() {
+    SimpleIdentifier identifier =
+        AstFactory.classTypeAlias("C", null, null, null, null, null).name;
+    expect(identifier.inDeclarationContext(), isTrue);
+  }
+
+  void test_inDeclarationContext_constructorDeclaration() {
+    SimpleIdentifier identifier = AstFactory
+        .constructorDeclaration(AstFactory.identifier3("C"), "c", null, null)
+        .name;
+    expect(identifier.inDeclarationContext(), isTrue);
+  }
+
+  void test_inDeclarationContext_declaredIdentifier() {
+    DeclaredIdentifier declaredIdentifier = AstFactory.declaredIdentifier3("v");
+    SimpleIdentifier identifier = declaredIdentifier.identifier;
+    expect(identifier.inDeclarationContext(), isTrue);
+  }
+
+  void test_inDeclarationContext_enumConstantDeclaration() {
+    EnumDeclaration enumDeclaration =
+        AstFactory.enumDeclaration2('MyEnum', ['CONST']);
+    SimpleIdentifier identifier = enumDeclaration.constants[0].name;
+    expect(identifier.inDeclarationContext(), isTrue);
+  }
+
+  void test_inDeclarationContext_enumDeclaration() {
+    EnumDeclaration enumDeclaration =
+        AstFactory.enumDeclaration2('MyEnum', ['A', 'B', 'C']);
+    SimpleIdentifier identifier = enumDeclaration.name;
+    expect(identifier.inDeclarationContext(), isTrue);
+  }
+
+  void test_inDeclarationContext_fieldFormalParameter() {
+    SimpleIdentifier identifier =
+        AstFactory.fieldFormalParameter2("p").identifier;
+    expect(identifier.inDeclarationContext(), isFalse);
+  }
+
+  void test_inDeclarationContext_functionDeclaration() {
+    SimpleIdentifier identifier =
+        AstFactory.functionDeclaration(null, null, "f", null).name;
+    expect(identifier.inDeclarationContext(), isTrue);
+  }
+
+  void test_inDeclarationContext_functionTypeAlias() {
+    SimpleIdentifier identifier =
+        AstFactory.typeAlias(null, "F", null, null).name;
+    expect(identifier.inDeclarationContext(), isTrue);
+  }
+
+  void test_inDeclarationContext_label_false() {
+    SimpleIdentifier identifier =
+        AstFactory.namedExpression2("l", AstFactory.integer(0)).name.label;
+    expect(identifier.inDeclarationContext(), isFalse);
+  }
+
+  void test_inDeclarationContext_label_true() {
+    Label label = AstFactory.label2("l");
+    SimpleIdentifier identifier = label.label;
+    AstFactory.labeledStatement([label], AstFactory.emptyStatement());
+    expect(identifier.inDeclarationContext(), isTrue);
+  }
+
+  void test_inDeclarationContext_methodDeclaration() {
+    SimpleIdentifier identifier = AstFactory.identifier3("m");
+    AstFactory.methodDeclaration2(
+        null, null, null, null, identifier, null, null);
+    expect(identifier.inDeclarationContext(), isTrue);
+  }
+
+  void test_inDeclarationContext_prefix() {
+    SimpleIdentifier identifier =
+        AstFactory.importDirective3("uri", "pref").prefix;
+    expect(identifier.inDeclarationContext(), isTrue);
+  }
+
+  void test_inDeclarationContext_simpleFormalParameter() {
+    SimpleIdentifier identifier =
+        AstFactory.simpleFormalParameter3("p").identifier;
+    expect(identifier.inDeclarationContext(), isTrue);
+  }
+
+  void test_inDeclarationContext_typeParameter_bound() {
+    TypeName bound = AstFactory.typeName4("A");
+    SimpleIdentifier identifier = bound.name as SimpleIdentifier;
+    AstFactory.typeParameter2("E", bound);
+    expect(identifier.inDeclarationContext(), isFalse);
+  }
+
+  void test_inDeclarationContext_typeParameter_name() {
+    SimpleIdentifier identifier = AstFactory.typeParameter("E").name;
+    expect(identifier.inDeclarationContext(), isTrue);
+  }
+
+  void test_inDeclarationContext_variableDeclaration() {
+    SimpleIdentifier identifier = AstFactory.variableDeclaration("v").name;
+    expect(identifier.inDeclarationContext(), isTrue);
+  }
+
+  void test_inGetterContext() {
+    for (WrapperKind wrapper in WrapperKind.values) {
+      for (AssignmentKind assignment in AssignmentKind.values) {
+        SimpleIdentifier identifier = _createIdentifier(wrapper, assignment);
+        if (assignment == AssignmentKind.SIMPLE_LEFT &&
+            wrapper != WrapperKind.PREFIXED_LEFT &&
+            wrapper != WrapperKind.PROPERTY_LEFT) {
+          if (identifier.inGetterContext()) {
+            fail("Expected ${_topMostNode(identifier).toSource()} to be false");
+          }
+        } else {
+          if (!identifier.inGetterContext()) {
+            fail("Expected ${_topMostNode(identifier).toSource()} to be true");
+          }
+        }
+      }
+    }
+  }
+
+  void test_inGetterContext_forEachLoop() {
+    SimpleIdentifier identifier = AstFactory.identifier3("a");
+    Expression iterator = AstFactory.listLiteral();
+    Statement body = AstFactory.block();
+    AstFactory.forEachStatement2(identifier, iterator, body);
+    expect(identifier.inGetterContext(), isFalse);
+  }
+
+  void test_inReferenceContext() {
+    SimpleIdentifier identifier = AstFactory.identifier3("id");
+    AstFactory.namedExpression(
+        AstFactory.label(identifier), AstFactory.identifier3("_"));
+    expect(identifier.inGetterContext(), isFalse);
+    expect(identifier.inSetterContext(), isFalse);
+  }
+
+  void test_inSetterContext() {
+    for (WrapperKind wrapper in WrapperKind.values) {
+      for (AssignmentKind assignment in AssignmentKind.values) {
+        SimpleIdentifier identifier = _createIdentifier(wrapper, assignment);
+        if (wrapper == WrapperKind.PREFIXED_LEFT ||
+            wrapper == WrapperKind.PROPERTY_LEFT ||
+            assignment == AssignmentKind.BINARY ||
+            assignment == AssignmentKind.COMPOUND_RIGHT ||
+            assignment == AssignmentKind.PREFIX_NOT ||
+            assignment == AssignmentKind.SIMPLE_RIGHT ||
+            assignment == AssignmentKind.NONE) {
+          if (identifier.inSetterContext()) {
+            fail("Expected ${_topMostNode(identifier).toSource()} to be false");
+          }
+        } else {
+          if (!identifier.inSetterContext()) {
+            fail("Expected ${_topMostNode(identifier).toSource()} to be true");
+          }
+        }
+      }
+    }
+  }
+
+  void test_inSetterContext_forEachLoop() {
+    SimpleIdentifier identifier = AstFactory.identifier3("a");
+    Expression iterator = AstFactory.listLiteral();
+    Statement body = AstFactory.block();
+    AstFactory.forEachStatement2(identifier, iterator, body);
+    expect(identifier.inSetterContext(), isTrue);
+  }
+
+  void test_isQualified_inMethodInvocation_noTarget() {
+    MethodInvocation invocation =
+        AstFactory.methodInvocation2("test", [AstFactory.identifier3("arg0")]);
+    SimpleIdentifier identifier = invocation.methodName;
+    expect(identifier.isQualified, isFalse);
+  }
+
+  void test_isQualified_inMethodInvocation_withTarget() {
+    MethodInvocation invocation = AstFactory.methodInvocation(
+        AstFactory.identifier3("target"),
+        "test",
+        [AstFactory.identifier3("arg0")]);
+    SimpleIdentifier identifier = invocation.methodName;
+    expect(identifier.isQualified, isTrue);
+  }
+
+  void test_isQualified_inPrefixedIdentifier_name() {
+    SimpleIdentifier identifier = AstFactory.identifier3("test");
+    AstFactory.identifier4("prefix", identifier);
+    expect(identifier.isQualified, isTrue);
+  }
+
+  void test_isQualified_inPrefixedIdentifier_prefix() {
+    SimpleIdentifier identifier = AstFactory.identifier3("test");
+    AstFactory.identifier(identifier, AstFactory.identifier3("name"));
+    expect(identifier.isQualified, isFalse);
+  }
+
+  void test_isQualified_inPropertyAccess_name() {
+    SimpleIdentifier identifier = AstFactory.identifier3("test");
+    AstFactory.propertyAccess(AstFactory.identifier3("target"), identifier);
+    expect(identifier.isQualified, isTrue);
+  }
+
+  void test_isQualified_inPropertyAccess_target() {
+    SimpleIdentifier identifier = AstFactory.identifier3("test");
+    AstFactory.propertyAccess(identifier, AstFactory.identifier3("name"));
+    expect(identifier.isQualified, isFalse);
+  }
+
+  void test_isQualified_inReturnStatement() {
+    SimpleIdentifier identifier = AstFactory.identifier3("test");
+    AstFactory.returnStatement2(identifier);
+    expect(identifier.isQualified, isFalse);
+  }
+
+  SimpleIdentifier _createIdentifier(
+      WrapperKind wrapper, AssignmentKind assignment) {
+    SimpleIdentifier identifier = AstFactory.identifier3("a");
+    Expression expression = identifier;
+    while (true) {
+      if (wrapper == WrapperKind.PREFIXED_LEFT) {
+        expression =
+            AstFactory.identifier(identifier, AstFactory.identifier3("_"));
+      } else if (wrapper == WrapperKind.PREFIXED_RIGHT) {
+        expression =
+            AstFactory.identifier(AstFactory.identifier3("_"), identifier);
+      } else if (wrapper == WrapperKind.PROPERTY_LEFT) {
+        expression = AstFactory.propertyAccess2(expression, "_");
+      } else if (wrapper == WrapperKind.PROPERTY_RIGHT) {
+        expression =
+            AstFactory.propertyAccess(AstFactory.identifier3("_"), identifier);
+      } else if (wrapper == WrapperKind.NONE) {}
+      break;
+    }
+    while (true) {
+      if (assignment == AssignmentKind.BINARY) {
+        AstFactory.binaryExpression(
+            expression, TokenType.PLUS, AstFactory.identifier3("_"));
+      } else if (assignment == AssignmentKind.COMPOUND_LEFT) {
+        AstFactory.assignmentExpression(
+            expression, TokenType.PLUS_EQ, AstFactory.identifier3("_"));
+      } else if (assignment == AssignmentKind.COMPOUND_RIGHT) {
+        AstFactory.assignmentExpression(
+            AstFactory.identifier3("_"), TokenType.PLUS_EQ, expression);
+      } else if (assignment == AssignmentKind.POSTFIX_INC) {
+        AstFactory.postfixExpression(expression, TokenType.PLUS_PLUS);
+      } else if (assignment == AssignmentKind.PREFIX_DEC) {
+        AstFactory.prefixExpression(TokenType.MINUS_MINUS, expression);
+      } else if (assignment == AssignmentKind.PREFIX_INC) {
+        AstFactory.prefixExpression(TokenType.PLUS_PLUS, expression);
+      } else if (assignment == AssignmentKind.PREFIX_NOT) {
+        AstFactory.prefixExpression(TokenType.BANG, expression);
+      } else if (assignment == AssignmentKind.SIMPLE_LEFT) {
+        AstFactory.assignmentExpression(
+            expression, TokenType.EQ, AstFactory.identifier3("_"));
+      } else if (assignment == AssignmentKind.SIMPLE_RIGHT) {
+        AstFactory.assignmentExpression(
+            AstFactory.identifier3("_"), TokenType.EQ, expression);
+      } else if (assignment == AssignmentKind.NONE) {}
+      break;
+    }
+    return identifier;
+  }
+
+  /**
+   * Return the top-most node in the AST structure containing the given identifier.
+   *
+   * @param identifier the identifier in the AST structure being traversed
+   * @return the root of the AST structure containing the identifier
+   */
+  AstNode _topMostNode(SimpleIdentifier identifier) {
+    AstNode child = identifier;
+    AstNode parent = identifier.parent;
+    while (parent != null) {
+      child = parent;
+      parent = parent.parent;
+    }
+    return child;
+  }
+}
+
+@reflectiveTest
+class SimpleStringLiteralTest extends ParserTestCase {
+  void test_contentsEnd() {
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("'X'"), "X")
+            .contentsEnd,
+        2);
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString('"X"'), "X")
+            .contentsEnd,
+        2);
+
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString('"""X"""'), "X")
+            .contentsEnd,
+        4);
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("'''X'''"), "X")
+            .contentsEnd,
+        4);
+    expect(
+        new SimpleStringLiteral(
+            TokenFactory.tokenFromString("'''  \nX'''"), "X").contentsEnd,
+        7);
+
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("r'X'"), "X")
+            .contentsEnd,
+        3);
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString('r"X"'), "X")
+            .contentsEnd,
+        3);
+
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString('r"""X"""'), "X")
+            .contentsEnd,
+        5);
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("r'''X'''"), "X")
+            .contentsEnd,
+        5);
+    expect(
+        new SimpleStringLiteral(
+            TokenFactory.tokenFromString("r'''  \nX'''"), "X").contentsEnd,
+        8);
+  }
+
+  void test_contentsOffset() {
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("'X'"), "X")
+            .contentsOffset,
+        1);
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("\"X\""), "X")
+            .contentsOffset,
+        1);
+    expect(
+        new SimpleStringLiteral(
+            TokenFactory.tokenFromString("\"\"\"X\"\"\""), "X").contentsOffset,
+        3);
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("'''X'''"), "X")
+            .contentsOffset,
+        3);
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("r'X'"), "X")
+            .contentsOffset,
+        2);
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("r\"X\""), "X")
+            .contentsOffset,
+        2);
+    expect(
+        new SimpleStringLiteral(
+            TokenFactory.tokenFromString("r\"\"\"X\"\"\""), "X").contentsOffset,
+        4);
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("r'''X'''"), "X")
+            .contentsOffset,
+        4);
+    // leading whitespace
+    expect(
+        new SimpleStringLiteral(
+            TokenFactory.tokenFromString("''' \ \nX''"), "X").contentsOffset,
+        6);
+    expect(
+        new SimpleStringLiteral(
+            TokenFactory.tokenFromString('r""" \ \nX"""'), "X").contentsOffset,
+        7);
+  }
+
+  void test_isMultiline() {
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("'X'"), "X")
+            .isMultiline,
+        isFalse);
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("r'X'"), "X")
+            .isMultiline,
+        isFalse);
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("\"X\""), "X")
+            .isMultiline,
+        isFalse);
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("r\"X\""), "X")
+            .isMultiline,
+        isFalse);
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("'''X'''"), "X")
+            .isMultiline,
+        isTrue);
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("r'''X'''"), "X")
+            .isMultiline,
+        isTrue);
+    expect(
+        new SimpleStringLiteral(
+            TokenFactory.tokenFromString("\"\"\"X\"\"\""), "X").isMultiline,
+        isTrue);
+    expect(
+        new SimpleStringLiteral(
+            TokenFactory.tokenFromString("r\"\"\"X\"\"\""), "X").isMultiline,
+        isTrue);
+  }
+
+  void test_isRaw() {
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("'X'"), "X").isRaw,
+        isFalse);
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("\"X\""), "X")
+            .isRaw,
+        isFalse);
+    expect(
+        new SimpleStringLiteral(
+            TokenFactory.tokenFromString("\"\"\"X\"\"\""), "X").isRaw,
+        isFalse);
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("'''X'''"), "X")
+            .isRaw,
+        isFalse);
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("r'X'"), "X")
+            .isRaw,
+        isTrue);
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("r\"X\""), "X")
+            .isRaw,
+        isTrue);
+    expect(
+        new SimpleStringLiteral(
+            TokenFactory.tokenFromString("r\"\"\"X\"\"\""), "X").isRaw,
+        isTrue);
+    expect(
+        new SimpleStringLiteral(TokenFactory.tokenFromString("r'''X'''"), "X")
+            .isRaw,
+        isTrue);
+  }
+
+  void test_isSingleQuoted() {
+    // '
+    {
+      var token = TokenFactory.tokenFromString("'X'");
+      var node = new SimpleStringLiteral(token, null);
+      expect(node.isSingleQuoted, isTrue);
+    }
+    // '''
+    {
+      var token = TokenFactory.tokenFromString("'''X'''");
+      var node = new SimpleStringLiteral(token, null);
+      expect(node.isSingleQuoted, isTrue);
+    }
+    // "
+    {
+      var token = TokenFactory.tokenFromString('"X"');
+      var node = new SimpleStringLiteral(token, null);
+      expect(node.isSingleQuoted, isFalse);
+    }
+    // """
+    {
+      var token = TokenFactory.tokenFromString('"""X"""');
+      var node = new SimpleStringLiteral(token, null);
+      expect(node.isSingleQuoted, isFalse);
+    }
+  }
+
+  void test_isSingleQuoted_raw() {
+    // r'
+    {
+      var token = TokenFactory.tokenFromString("r'X'");
+      var node = new SimpleStringLiteral(token, null);
+      expect(node.isSingleQuoted, isTrue);
+    }
+    // r'''
+    {
+      var token = TokenFactory.tokenFromString("r'''X'''");
+      var node = new SimpleStringLiteral(token, null);
+      expect(node.isSingleQuoted, isTrue);
+    }
+    // r"
+    {
+      var token = TokenFactory.tokenFromString('r"X"');
+      var node = new SimpleStringLiteral(token, null);
+      expect(node.isSingleQuoted, isFalse);
+    }
+    // r"""
+    {
+      var token = TokenFactory.tokenFromString('r"""X"""');
+      var node = new SimpleStringLiteral(token, null);
+      expect(node.isSingleQuoted, isFalse);
+    }
+  }
+
+  void test_simple() {
+    Token token = TokenFactory.tokenFromString("'value'");
+    SimpleStringLiteral stringLiteral = new SimpleStringLiteral(token, "value");
+    expect(stringLiteral.literal, same(token));
+    expect(stringLiteral.beginToken, same(token));
+    expect(stringLiteral.endToken, same(token));
+    expect(stringLiteral.value, "value");
+  }
+}
+
+@reflectiveTest
+class StringInterpolationTest extends ParserTestCase {
+  void test_contentsOffsetEnd() {
+    AstFactory.interpolationExpression(AstFactory.identifier3('bb'));
+    // 'a${bb}ccc'
+    {
+      var ae = AstFactory.interpolationString("'a", "a");
+      var cToken = new StringToken(TokenType.STRING, "ccc'", 10);
+      var cElement = new InterpolationString(cToken, 'ccc');
+      StringInterpolation node = AstFactory.string([ae, ae, cElement]);
+      expect(node.contentsOffset, 1);
+      expect(node.contentsEnd, 10 + 4 - 1);
+    }
+    // '''a${bb}ccc'''
+    {
+      var ae = AstFactory.interpolationString("'''a", "a");
+      var cToken = new StringToken(TokenType.STRING, "ccc'''", 10);
+      var cElement = new InterpolationString(cToken, 'ccc');
+      StringInterpolation node = AstFactory.string([ae, ae, cElement]);
+      expect(node.contentsOffset, 3);
+      expect(node.contentsEnd, 10 + 4 - 1);
+    }
+    // """a${bb}ccc"""
+    {
+      var ae = AstFactory.interpolationString('"""a', "a");
+      var cToken = new StringToken(TokenType.STRING, 'ccc"""', 10);
+      var cElement = new InterpolationString(cToken, 'ccc');
+      StringInterpolation node = AstFactory.string([ae, ae, cElement]);
+      expect(node.contentsOffset, 3);
+      expect(node.contentsEnd, 10 + 4 - 1);
+    }
+    // r'a${bb}ccc'
+    {
+      var ae = AstFactory.interpolationString("r'a", "a");
+      var cToken = new StringToken(TokenType.STRING, "ccc'", 10);
+      var cElement = new InterpolationString(cToken, 'ccc');
+      StringInterpolation node = AstFactory.string([ae, ae, cElement]);
+      expect(node.contentsOffset, 2);
+      expect(node.contentsEnd, 10 + 4 - 1);
+    }
+    // r'''a${bb}ccc'''
+    {
+      var ae = AstFactory.interpolationString("r'''a", "a");
+      var cToken = new StringToken(TokenType.STRING, "ccc'''", 10);
+      var cElement = new InterpolationString(cToken, 'ccc');
+      StringInterpolation node = AstFactory.string([ae, ae, cElement]);
+      expect(node.contentsOffset, 4);
+      expect(node.contentsEnd, 10 + 4 - 1);
+    }
+    // r"""a${bb}ccc"""
+    {
+      var ae = AstFactory.interpolationString('r"""a', "a");
+      var cToken = new StringToken(TokenType.STRING, 'ccc"""', 10);
+      var cElement = new InterpolationString(cToken, 'ccc');
+      StringInterpolation node = AstFactory.string([ae, ae, cElement]);
+      expect(node.contentsOffset, 4);
+      expect(node.contentsEnd, 10 + 4 - 1);
+    }
+  }
+
+  void test_isMultiline() {
+    var b = AstFactory.interpolationExpression(AstFactory.identifier3('bb'));
+    // '
+    {
+      var a = AstFactory.interpolationString("'a", "a");
+      var c = AstFactory.interpolationString("ccc'", "ccc");
+      StringInterpolation node = AstFactory.string([a, b, c]);
+      expect(node.isMultiline, isFalse);
+    }
+    // '''
+    {
+      var a = AstFactory.interpolationString("'''a", "a");
+      var c = AstFactory.interpolationString("ccc'''", "ccc");
+      StringInterpolation node = AstFactory.string([a, b, c]);
+      expect(node.isMultiline, isTrue);
+    }
+    // "
+    {
+      var a = AstFactory.interpolationString('"a', "a");
+      var c = AstFactory.interpolationString('ccc"', "ccc");
+      StringInterpolation node = AstFactory.string([a, b, c]);
+      expect(node.isMultiline, isFalse);
+    }
+    // """
+    {
+      var a = AstFactory.interpolationString('"""a', "a");
+      var c = AstFactory.interpolationString('ccc"""', "ccc");
+      StringInterpolation node = AstFactory.string([a, b, c]);
+      expect(node.isMultiline, isTrue);
+    }
+  }
+
+  void test_isRaw() {
+    StringInterpolation node = AstFactory.string();
+    expect(node.isRaw, isFalse);
+  }
+
+  void test_isSingleQuoted() {
+    var b = AstFactory.interpolationExpression(AstFactory.identifier3('bb'));
+    // "
+    {
+      var a = AstFactory.interpolationString('"a', "a");
+      var c = AstFactory.interpolationString('ccc"', "ccc");
+      StringInterpolation node = AstFactory.string([a, b, c]);
+      expect(node.isSingleQuoted, isFalse);
+    }
+    // """
+    {
+      var a = AstFactory.interpolationString('"""a', "a");
+      var c = AstFactory.interpolationString('ccc"""', "ccc");
+      StringInterpolation node = AstFactory.string([a, b, c]);
+      expect(node.isSingleQuoted, isFalse);
+    }
+    // '
+    {
+      var a = AstFactory.interpolationString("'a", "a");
+      var c = AstFactory.interpolationString("ccc'", "ccc");
+      StringInterpolation node = AstFactory.string([a, b, c]);
+      expect(node.isSingleQuoted, isTrue);
+    }
+    // '''
+    {
+      var a = AstFactory.interpolationString("'''a", "a");
+      var c = AstFactory.interpolationString("ccc'''", "ccc");
+      StringInterpolation node = AstFactory.string([a, b, c]);
+      expect(node.isSingleQuoted, isTrue);
+    }
+  }
+}
+
+@reflectiveTest
+class ToSourceVisitorTest extends EngineTestCase {
+  void test_visitAdjacentStrings() {
+    _assertSource(
+        "'a' 'b'",
+        AstFactory.adjacentStrings(
+            [AstFactory.string2("a"), AstFactory.string2("b")]));
+  }
+
+  void test_visitAnnotation_constant() {
+    _assertSource("@A", AstFactory.annotation(AstFactory.identifier3("A")));
+  }
+
+  void test_visitAnnotation_constructor() {
+    _assertSource(
+        "@A.c()",
+        AstFactory.annotation2(AstFactory.identifier3("A"),
+            AstFactory.identifier3("c"), AstFactory.argumentList()));
+  }
+
+  void test_visitArgumentList() {
+    _assertSource(
+        "(a, b)",
+        AstFactory.argumentList(
+            [AstFactory.identifier3("a"), AstFactory.identifier3("b")]));
+  }
+
+  void test_visitAsExpression() {
+    _assertSource(
+        "e as T",
+        AstFactory.asExpression(
+            AstFactory.identifier3("e"), AstFactory.typeName4("T")));
+  }
+
+  void test_visitAssertStatement() {
+    _assertSource(
+        "assert (a);", AstFactory.assertStatement(AstFactory.identifier3("a")));
+  }
+
+  void test_visitAssignmentExpression() {
+    _assertSource(
+        "a = b",
+        AstFactory.assignmentExpression(AstFactory.identifier3("a"),
+            TokenType.EQ, AstFactory.identifier3("b")));
+  }
+
+  void test_visitAwaitExpression() {
+    _assertSource(
+        "await e;", AstFactory.awaitExpression(AstFactory.identifier3("e")));
+  }
+
+  void test_visitBinaryExpression() {
+    _assertSource(
+        "a + b",
+        AstFactory.binaryExpression(AstFactory.identifier3("a"), TokenType.PLUS,
+            AstFactory.identifier3("b")));
+  }
+
+  void test_visitBlock_empty() {
+    _assertSource("{}", AstFactory.block());
+  }
+
+  void test_visitBlock_nonEmpty() {
+    _assertSource(
+        "{break; break;}",
+        AstFactory
+            .block([AstFactory.breakStatement(), AstFactory.breakStatement()]));
+  }
+
+  void test_visitBlockFunctionBody_async() {
+    _assertSource("async {}", AstFactory.asyncBlockFunctionBody());
+  }
+
+  void test_visitBlockFunctionBody_async_star() {
+    _assertSource("async* {}", AstFactory.asyncGeneratorBlockFunctionBody());
+  }
+
+  void test_visitBlockFunctionBody_simple() {
+    _assertSource("{}", AstFactory.blockFunctionBody2());
+  }
+
+  void test_visitBlockFunctionBody_sync() {
+    _assertSource("sync {}", AstFactory.syncBlockFunctionBody());
+  }
+
+  void test_visitBlockFunctionBody_sync_star() {
+    _assertSource("sync* {}", AstFactory.syncGeneratorBlockFunctionBody());
+  }
+
+  void test_visitBooleanLiteral_false() {
+    _assertSource("false", AstFactory.booleanLiteral(false));
+  }
+
+  void test_visitBooleanLiteral_true() {
+    _assertSource("true", AstFactory.booleanLiteral(true));
+  }
+
+  void test_visitBreakStatement_label() {
+    _assertSource("break l;", AstFactory.breakStatement2("l"));
+  }
+
+  void test_visitBreakStatement_noLabel() {
+    _assertSource("break;", AstFactory.breakStatement());
+  }
+
+  void test_visitCascadeExpression_field() {
+    _assertSource(
+        "a..b..c",
+        AstFactory.cascadeExpression(AstFactory.identifier3("a"), [
+          AstFactory.cascadedPropertyAccess("b"),
+          AstFactory.cascadedPropertyAccess("c")
+        ]));
+  }
+
+  void test_visitCascadeExpression_index() {
+    _assertSource(
+        "a..[0]..[1]",
+        AstFactory.cascadeExpression(AstFactory.identifier3("a"), [
+          AstFactory.cascadedIndexExpression(AstFactory.integer(0)),
+          AstFactory.cascadedIndexExpression(AstFactory.integer(1))
+        ]));
+  }
+
+  void test_visitCascadeExpression_method() {
+    _assertSource(
+        "a..b()..c()",
+        AstFactory.cascadeExpression(AstFactory.identifier3("a"), [
+          AstFactory.cascadedMethodInvocation("b"),
+          AstFactory.cascadedMethodInvocation("c")
+        ]));
+  }
+
+  void test_visitCatchClause_catch_noStack() {
+    _assertSource("catch (e) {}", AstFactory.catchClause("e"));
+  }
+
+  void test_visitCatchClause_catch_stack() {
+    _assertSource("catch (e, s) {}", AstFactory.catchClause2("e", "s"));
+  }
+
+  void test_visitCatchClause_on() {
+    _assertSource(
+        "on E {}", AstFactory.catchClause3(AstFactory.typeName4("E")));
+  }
+
+  void test_visitCatchClause_on_catch() {
+    _assertSource("on E catch (e) {}",
+        AstFactory.catchClause4(AstFactory.typeName4("E"), "e"));
+  }
+
+  void test_visitClassDeclaration_abstract() {
+    _assertSource(
+        "abstract class C {}",
+        AstFactory.classDeclaration(
+            Keyword.ABSTRACT, "C", null, null, null, null));
+  }
+
+  void test_visitClassDeclaration_empty() {
+    _assertSource("class C {}",
+        AstFactory.classDeclaration(null, "C", null, null, null, null));
+  }
+
+  void test_visitClassDeclaration_extends() {
+    _assertSource(
+        "class C extends A {}",
+        AstFactory.classDeclaration(null, "C", null,
+            AstFactory.extendsClause(AstFactory.typeName4("A")), null, null));
+  }
+
+  void test_visitClassDeclaration_extends_implements() {
+    _assertSource(
+        "class C extends A implements B {}",
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            null,
+            AstFactory.extendsClause(AstFactory.typeName4("A")),
+            null,
+            AstFactory.implementsClause([AstFactory.typeName4("B")])));
+  }
+
+  void test_visitClassDeclaration_extends_with() {
+    _assertSource(
+        "class C extends A with M {}",
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            null,
+            AstFactory.extendsClause(AstFactory.typeName4("A")),
+            AstFactory.withClause([AstFactory.typeName4("M")]),
+            null));
+  }
+
+  void test_visitClassDeclaration_extends_with_implements() {
+    _assertSource(
+        "class C extends A with M implements B {}",
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            null,
+            AstFactory.extendsClause(AstFactory.typeName4("A")),
+            AstFactory.withClause([AstFactory.typeName4("M")]),
+            AstFactory.implementsClause([AstFactory.typeName4("B")])));
+  }
+
+  void test_visitClassDeclaration_implements() {
+    _assertSource(
+        "class C implements B {}",
+        AstFactory.classDeclaration(null, "C", null, null, null,
+            AstFactory.implementsClause([AstFactory.typeName4("B")])));
+  }
+
+  void test_visitClassDeclaration_multipleMember() {
+    _assertSource(
+        "class C {var a; var b;}",
+        AstFactory.classDeclaration(null, "C", null, null, null, null, [
+          AstFactory.fieldDeclaration2(
+              false, Keyword.VAR, [AstFactory.variableDeclaration("a")]),
+          AstFactory.fieldDeclaration2(
+              false, Keyword.VAR, [AstFactory.variableDeclaration("b")])
+        ]));
+  }
+
+  void test_visitClassDeclaration_parameters() {
+    _assertSource(
+        "class C<E> {}",
+        AstFactory.classDeclaration(
+            null, "C", AstFactory.typeParameterList(["E"]), null, null, null));
+  }
+
+  void test_visitClassDeclaration_parameters_extends() {
+    _assertSource(
+        "class C<E> extends A {}",
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            AstFactory.typeParameterList(["E"]),
+            AstFactory.extendsClause(AstFactory.typeName4("A")),
+            null,
+            null));
+  }
+
+  void test_visitClassDeclaration_parameters_extends_implements() {
+    _assertSource(
+        "class C<E> extends A implements B {}",
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            AstFactory.typeParameterList(["E"]),
+            AstFactory.extendsClause(AstFactory.typeName4("A")),
+            null,
+            AstFactory.implementsClause([AstFactory.typeName4("B")])));
+  }
+
+  void test_visitClassDeclaration_parameters_extends_with() {
+    _assertSource(
+        "class C<E> extends A with M {}",
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            AstFactory.typeParameterList(["E"]),
+            AstFactory.extendsClause(AstFactory.typeName4("A")),
+            AstFactory.withClause([AstFactory.typeName4("M")]),
+            null));
+  }
+
+  void test_visitClassDeclaration_parameters_extends_with_implements() {
+    _assertSource(
+        "class C<E> extends A with M implements B {}",
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            AstFactory.typeParameterList(["E"]),
+            AstFactory.extendsClause(AstFactory.typeName4("A")),
+            AstFactory.withClause([AstFactory.typeName4("M")]),
+            AstFactory.implementsClause([AstFactory.typeName4("B")])));
+  }
+
+  void test_visitClassDeclaration_parameters_implements() {
+    _assertSource(
+        "class C<E> implements B {}",
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            AstFactory.typeParameterList(["E"]),
+            null,
+            null,
+            AstFactory.implementsClause([AstFactory.typeName4("B")])));
+  }
+
+  void test_visitClassDeclaration_singleMember() {
+    _assertSource(
+        "class C {var a;}",
+        AstFactory.classDeclaration(null, "C", null, null, null, null, [
+          AstFactory.fieldDeclaration2(
+              false, Keyword.VAR, [AstFactory.variableDeclaration("a")])
+        ]));
+  }
+
+  void test_visitClassDeclaration_withMetadata() {
+    ClassDeclaration declaration =
+        AstFactory.classDeclaration(null, "C", null, null, null, null);
+    declaration.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertSource("@deprecated class C {}", declaration);
+  }
+
+  void test_visitClassTypeAlias_abstract() {
+    _assertSource(
+        "abstract class C = S with M1;",
+        AstFactory.classTypeAlias(
+            "C",
+            null,
+            Keyword.ABSTRACT,
+            AstFactory.typeName4("S"),
+            AstFactory.withClause([AstFactory.typeName4("M1")]),
+            null));
+  }
+
+  void test_visitClassTypeAlias_abstract_implements() {
+    _assertSource(
+        "abstract class C = S with M1 implements I;",
+        AstFactory.classTypeAlias(
+            "C",
+            null,
+            Keyword.ABSTRACT,
+            AstFactory.typeName4("S"),
+            AstFactory.withClause([AstFactory.typeName4("M1")]),
+            AstFactory.implementsClause([AstFactory.typeName4("I")])));
+  }
+
+  void test_visitClassTypeAlias_generic() {
+    _assertSource(
+        "class C<E> = S<E> with M1<E>;",
+        AstFactory.classTypeAlias(
+            "C",
+            AstFactory.typeParameterList(["E"]),
+            null,
+            AstFactory.typeName4("S", [AstFactory.typeName4("E")]),
+            AstFactory.withClause([
+              AstFactory.typeName4("M1", [AstFactory.typeName4("E")])
+            ]),
+            null));
+  }
+
+  void test_visitClassTypeAlias_implements() {
+    _assertSource(
+        "class C = S with M1 implements I;",
+        AstFactory.classTypeAlias(
+            "C",
+            null,
+            null,
+            AstFactory.typeName4("S"),
+            AstFactory.withClause([AstFactory.typeName4("M1")]),
+            AstFactory.implementsClause([AstFactory.typeName4("I")])));
+  }
+
+  void test_visitClassTypeAlias_minimal() {
+    _assertSource(
+        "class C = S with M1;",
+        AstFactory.classTypeAlias("C", null, null, AstFactory.typeName4("S"),
+            AstFactory.withClause([AstFactory.typeName4("M1")]), null));
+  }
+
+  void test_visitClassTypeAlias_parameters_abstract() {
+    _assertSource(
+        "abstract class C<E> = S with M1;",
+        AstFactory.classTypeAlias(
+            "C",
+            AstFactory.typeParameterList(["E"]),
+            Keyword.ABSTRACT,
+            AstFactory.typeName4("S"),
+            AstFactory.withClause([AstFactory.typeName4("M1")]),
+            null));
+  }
+
+  void test_visitClassTypeAlias_parameters_abstract_implements() {
+    _assertSource(
+        "abstract class C<E> = S with M1 implements I;",
+        AstFactory.classTypeAlias(
+            "C",
+            AstFactory.typeParameterList(["E"]),
+            Keyword.ABSTRACT,
+            AstFactory.typeName4("S"),
+            AstFactory.withClause([AstFactory.typeName4("M1")]),
+            AstFactory.implementsClause([AstFactory.typeName4("I")])));
+  }
+
+  void test_visitClassTypeAlias_parameters_implements() {
+    _assertSource(
+        "class C<E> = S with M1 implements I;",
+        AstFactory.classTypeAlias(
+            "C",
+            AstFactory.typeParameterList(["E"]),
+            null,
+            AstFactory.typeName4("S"),
+            AstFactory.withClause([AstFactory.typeName4("M1")]),
+            AstFactory.implementsClause([AstFactory.typeName4("I")])));
+  }
+
+  void test_visitClassTypeAlias_withMetadata() {
+    ClassTypeAlias declaration = AstFactory.classTypeAlias(
+        "C",
+        null,
+        null,
+        AstFactory.typeName4("S"),
+        AstFactory.withClause([AstFactory.typeName4("M1")]),
+        null);
+    declaration.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertSource("@deprecated class C = S with M1;", declaration);
+  }
+
+  void test_visitComment() {
+    _assertSource(
+        "",
+        Comment.createBlockComment(
+            <Token>[TokenFactory.tokenFromString("/* comment */")]));
+  }
+
+  void test_visitCommentReference() {
+    _assertSource("", new CommentReference(null, AstFactory.identifier3("a")));
+  }
+
+  void test_visitCompilationUnit_declaration() {
+    _assertSource(
+        "var a;",
+        AstFactory.compilationUnit2([
+          AstFactory.topLevelVariableDeclaration2(
+              Keyword.VAR, [AstFactory.variableDeclaration("a")])
+        ]));
+  }
+
+  void test_visitCompilationUnit_directive() {
+    _assertSource("library l;",
+        AstFactory.compilationUnit3([AstFactory.libraryDirective2("l")]));
+  }
+
+  void test_visitCompilationUnit_directive_declaration() {
+    _assertSource(
+        "library l; var a;",
+        AstFactory.compilationUnit4([
+          AstFactory.libraryDirective2("l")
+        ], [
+          AstFactory.topLevelVariableDeclaration2(
+              Keyword.VAR, [AstFactory.variableDeclaration("a")])
+        ]));
+  }
+
+  void test_visitCompilationUnit_empty() {
+    _assertSource("", AstFactory.compilationUnit());
+  }
+
+  void test_visitCompilationUnit_script() {
+    _assertSource(
+        "!#/bin/dartvm", AstFactory.compilationUnit5("!#/bin/dartvm"));
+  }
+
+  void test_visitCompilationUnit_script_declaration() {
+    _assertSource(
+        "!#/bin/dartvm var a;",
+        AstFactory.compilationUnit6("!#/bin/dartvm", [
+          AstFactory.topLevelVariableDeclaration2(
+              Keyword.VAR, [AstFactory.variableDeclaration("a")])
+        ]));
+  }
+
+  void test_visitCompilationUnit_script_directive() {
+    _assertSource(
+        "!#/bin/dartvm library l;",
+        AstFactory.compilationUnit7(
+            "!#/bin/dartvm", [AstFactory.libraryDirective2("l")]));
+  }
+
+  void test_visitCompilationUnit_script_directives_declarations() {
+    _assertSource(
+        "!#/bin/dartvm library l; var a;",
+        AstFactory.compilationUnit8("!#/bin/dartvm", [
+          AstFactory.libraryDirective2("l")
+        ], [
+          AstFactory.topLevelVariableDeclaration2(
+              Keyword.VAR, [AstFactory.variableDeclaration("a")])
+        ]));
+  }
+
+  void test_visitConditionalExpression() {
+    _assertSource(
+        "a ? b : c",
+        AstFactory.conditionalExpression(AstFactory.identifier3("a"),
+            AstFactory.identifier3("b"), AstFactory.identifier3("c")));
+  }
+
+  void test_visitConstructorDeclaration_const() {
+    _assertSource(
+        "const C() {}",
+        AstFactory.constructorDeclaration2(
+            Keyword.CONST,
+            null,
+            AstFactory.identifier3("C"),
+            null,
+            AstFactory.formalParameterList(),
+            null,
+            AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitConstructorDeclaration_external() {
+    _assertSource(
+        "external C();",
+        AstFactory.constructorDeclaration(AstFactory.identifier3("C"), null,
+            AstFactory.formalParameterList(), null));
+  }
+
+  void test_visitConstructorDeclaration_minimal() {
+    _assertSource(
+        "C() {}",
+        AstFactory.constructorDeclaration2(
+            null,
+            null,
+            AstFactory.identifier3("C"),
+            null,
+            AstFactory.formalParameterList(),
+            null,
+            AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitConstructorDeclaration_multipleInitializers() {
+    _assertSource(
+        "C() : a = b, c = d {}",
+        AstFactory.constructorDeclaration2(
+            null,
+            null,
+            AstFactory.identifier3("C"),
+            null,
+            AstFactory.formalParameterList(),
+            [
+              AstFactory.constructorFieldInitializer(
+                  false, "a", AstFactory.identifier3("b")),
+              AstFactory.constructorFieldInitializer(
+                  false, "c", AstFactory.identifier3("d"))
+            ],
+            AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitConstructorDeclaration_multipleParameters() {
+    _assertSource(
+        "C(var a, var b) {}",
+        AstFactory.constructorDeclaration2(
+            null,
+            null,
+            AstFactory.identifier3("C"),
+            null,
+            AstFactory.formalParameterList([
+              AstFactory.simpleFormalParameter(Keyword.VAR, "a"),
+              AstFactory.simpleFormalParameter(Keyword.VAR, "b")
+            ]),
+            null,
+            AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitConstructorDeclaration_named() {
+    _assertSource(
+        "C.m() {}",
+        AstFactory.constructorDeclaration2(
+            null,
+            null,
+            AstFactory.identifier3("C"),
+            "m",
+            AstFactory.formalParameterList(),
+            null,
+            AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitConstructorDeclaration_singleInitializer() {
+    _assertSource(
+        "C() : a = b {}",
+        AstFactory.constructorDeclaration2(
+            null,
+            null,
+            AstFactory.identifier3("C"),
+            null,
+            AstFactory.formalParameterList(),
+            [
+              AstFactory.constructorFieldInitializer(
+                  false, "a", AstFactory.identifier3("b"))
+            ],
+            AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitConstructorDeclaration_withMetadata() {
+    ConstructorDeclaration declaration = AstFactory.constructorDeclaration2(
+        null,
+        null,
+        AstFactory.identifier3("C"),
+        null,
+        AstFactory.formalParameterList(),
+        null,
+        AstFactory.blockFunctionBody2());
+    declaration.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertSource("@deprecated C() {}", declaration);
+  }
+
+  void test_visitConstructorFieldInitializer_withoutThis() {
+    _assertSource(
+        "a = b",
+        AstFactory.constructorFieldInitializer(
+            false, "a", AstFactory.identifier3("b")));
+  }
+
+  void test_visitConstructorFieldInitializer_withThis() {
+    _assertSource(
+        "this.a = b",
+        AstFactory.constructorFieldInitializer(
+            true, "a", AstFactory.identifier3("b")));
+  }
+
+  void test_visitConstructorName_named_prefix() {
+    _assertSource("p.C.n",
+        AstFactory.constructorName(AstFactory.typeName4("p.C.n"), null));
+  }
+
+  void test_visitConstructorName_unnamed_noPrefix() {
+    _assertSource(
+        "C", AstFactory.constructorName(AstFactory.typeName4("C"), null));
+  }
+
+  void test_visitConstructorName_unnamed_prefix() {
+    _assertSource(
+        "p.C",
+        AstFactory.constructorName(
+            AstFactory.typeName3(AstFactory.identifier5("p", "C")), null));
+  }
+
+  void test_visitContinueStatement_label() {
+    _assertSource("continue l;", AstFactory.continueStatement("l"));
+  }
+
+  void test_visitContinueStatement_noLabel() {
+    _assertSource("continue;", AstFactory.continueStatement());
+  }
+
+  void test_visitDefaultFormalParameter_named_noValue() {
+    _assertSource(
+        "p",
+        AstFactory.namedFormalParameter(
+            AstFactory.simpleFormalParameter3("p"), null));
+  }
+
+  void test_visitDefaultFormalParameter_named_value() {
+    _assertSource(
+        "p : 0",
+        AstFactory.namedFormalParameter(
+            AstFactory.simpleFormalParameter3("p"), AstFactory.integer(0)));
+  }
+
+  void test_visitDefaultFormalParameter_positional_noValue() {
+    _assertSource(
+        "p",
+        AstFactory.positionalFormalParameter(
+            AstFactory.simpleFormalParameter3("p"), null));
+  }
+
+  void test_visitDefaultFormalParameter_positional_value() {
+    _assertSource(
+        "p = 0",
+        AstFactory.positionalFormalParameter(
+            AstFactory.simpleFormalParameter3("p"), AstFactory.integer(0)));
+  }
+
+  void test_visitDoStatement() {
+    _assertSource(
+        "do {} while (c);",
+        AstFactory.doStatement(
+            AstFactory.block(), AstFactory.identifier3("c")));
+  }
+
+  void test_visitDoubleLiteral() {
+    _assertSource("4.2", AstFactory.doubleLiteral(4.2));
+  }
+
+  void test_visitEmptyFunctionBody() {
+    _assertSource(";", AstFactory.emptyFunctionBody());
+  }
+
+  void test_visitEmptyStatement() {
+    _assertSource(";", AstFactory.emptyStatement());
+  }
+
+  void test_visitEnumDeclaration_multiple() {
+    _assertSource(
+        "enum E {ONE, TWO}", AstFactory.enumDeclaration2("E", ["ONE", "TWO"]));
+  }
+
+  void test_visitEnumDeclaration_single() {
+    _assertSource("enum E {ONE}", AstFactory.enumDeclaration2("E", ["ONE"]));
+  }
+
+  void test_visitExportDirective_combinator() {
+    _assertSource(
+        "export 'a.dart' show A;",
+        AstFactory.exportDirective2("a.dart", [
+          AstFactory.showCombinator([AstFactory.identifier3("A")])
+        ]));
+  }
+
+  void test_visitExportDirective_combinators() {
+    _assertSource(
+        "export 'a.dart' show A hide B;",
+        AstFactory.exportDirective2("a.dart", [
+          AstFactory.showCombinator([AstFactory.identifier3("A")]),
+          AstFactory.hideCombinator([AstFactory.identifier3("B")])
+        ]));
+  }
+
+  void test_visitExportDirective_minimal() {
+    _assertSource("export 'a.dart';", AstFactory.exportDirective2("a.dart"));
+  }
+
+  void test_visitExportDirective_withMetadata() {
+    ExportDirective directive = AstFactory.exportDirective2("a.dart");
+    directive.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertSource("@deprecated export 'a.dart';", directive);
+  }
+
+  void test_visitExpressionFunctionBody_async() {
+    _assertSource("async => a;",
+        AstFactory.asyncExpressionFunctionBody(AstFactory.identifier3("a")));
+  }
+
+  void test_visitExpressionFunctionBody_simple() {
+    _assertSource("=> a;",
+        AstFactory.expressionFunctionBody(AstFactory.identifier3("a")));
+  }
+
+  void test_visitExpressionStatement() {
+    _assertSource(
+        "a;", AstFactory.expressionStatement(AstFactory.identifier3("a")));
+  }
+
+  void test_visitExtendsClause() {
+    _assertSource(
+        "extends C", AstFactory.extendsClause(AstFactory.typeName4("C")));
+  }
+
+  void test_visitFieldDeclaration_instance() {
+    _assertSource(
+        "var a;",
+        AstFactory.fieldDeclaration2(
+            false, Keyword.VAR, [AstFactory.variableDeclaration("a")]));
+  }
+
+  void test_visitFieldDeclaration_static() {
+    _assertSource(
+        "static var a;",
+        AstFactory.fieldDeclaration2(
+            true, Keyword.VAR, [AstFactory.variableDeclaration("a")]));
+  }
+
+  void test_visitFieldDeclaration_withMetadata() {
+    FieldDeclaration declaration = AstFactory.fieldDeclaration2(
+        false, Keyword.VAR, [AstFactory.variableDeclaration("a")]);
+    declaration.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertSource("@deprecated var a;", declaration);
+  }
+
+  void test_visitFieldFormalParameter_functionTyped() {
+    _assertSource(
+        "A this.a(b)",
+        AstFactory.fieldFormalParameter(
+            null,
+            AstFactory.typeName4("A"),
+            "a",
+            AstFactory.formalParameterList(
+                [AstFactory.simpleFormalParameter3("b")])));
+  }
+
+  void test_visitFieldFormalParameter_functionTyped_typeParameters() {
+    _assertSource(
+        "A this.a<E, F>(b)",
+        new FieldFormalParameter(
+            null,
+            null,
+            null,
+            AstFactory.typeName4('A'),
+            TokenFactory.tokenFromKeyword(Keyword.THIS),
+            TokenFactory.tokenFromType(TokenType.PERIOD),
+            AstFactory.identifier3('a'),
+            AstFactory.typeParameterList(['E', 'F']),
+            AstFactory.formalParameterList(
+                [AstFactory.simpleFormalParameter3("b")])));
+  }
+
+  void test_visitFieldFormalParameter_keyword() {
+    _assertSource(
+        "var this.a", AstFactory.fieldFormalParameter(Keyword.VAR, null, "a"));
+  }
+
+  void test_visitFieldFormalParameter_keywordAndType() {
+    _assertSource(
+        "final A this.a",
+        AstFactory.fieldFormalParameter(
+            Keyword.FINAL, AstFactory.typeName4("A"), "a"));
+  }
+
+  void test_visitFieldFormalParameter_type() {
+    _assertSource("A this.a",
+        AstFactory.fieldFormalParameter(null, AstFactory.typeName4("A"), "a"));
+  }
+
+  void test_visitForEachStatement_declared() {
+    _assertSource(
+        "for (var a in b) {}",
+        AstFactory.forEachStatement(AstFactory.declaredIdentifier3("a"),
+            AstFactory.identifier3("b"), AstFactory.block()));
+  }
+
+  void test_visitForEachStatement_variable() {
+    _assertSource(
+        "for (a in b) {}",
+        new ForEachStatement.withReference(
+            null,
+            TokenFactory.tokenFromKeyword(Keyword.FOR),
+            TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+            AstFactory.identifier3("a"),
+            TokenFactory.tokenFromKeyword(Keyword.IN),
+            AstFactory.identifier3("b"),
+            TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+            AstFactory.block()));
+  }
+
+  void test_visitForEachStatement_variable_await() {
+    _assertSource(
+        "await for (a in b) {}",
+        new ForEachStatement.withReference(
+            TokenFactory.tokenFromString("await"),
+            TokenFactory.tokenFromKeyword(Keyword.FOR),
+            TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+            AstFactory.identifier3("a"),
+            TokenFactory.tokenFromKeyword(Keyword.IN),
+            AstFactory.identifier3("b"),
+            TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+            AstFactory.block()));
+  }
+
+  void test_visitFormalParameterList_empty() {
+    _assertSource("()", AstFactory.formalParameterList());
+  }
+
+  void test_visitFormalParameterList_n() {
+    _assertSource(
+        "({a : 0})",
+        AstFactory.formalParameterList([
+          AstFactory.namedFormalParameter(
+              AstFactory.simpleFormalParameter3("a"), AstFactory.integer(0))
+        ]));
+  }
+
+  void test_visitFormalParameterList_nn() {
+    _assertSource(
+        "({a : 0, b : 1})",
+        AstFactory.formalParameterList([
+          AstFactory.namedFormalParameter(
+              AstFactory.simpleFormalParameter3("a"), AstFactory.integer(0)),
+          AstFactory.namedFormalParameter(
+              AstFactory.simpleFormalParameter3("b"), AstFactory.integer(1))
+        ]));
+  }
+
+  void test_visitFormalParameterList_p() {
+    _assertSource(
+        "([a = 0])",
+        AstFactory.formalParameterList([
+          AstFactory.positionalFormalParameter(
+              AstFactory.simpleFormalParameter3("a"), AstFactory.integer(0))
+        ]));
+  }
+
+  void test_visitFormalParameterList_pp() {
+    _assertSource(
+        "([a = 0, b = 1])",
+        AstFactory.formalParameterList([
+          AstFactory.positionalFormalParameter(
+              AstFactory.simpleFormalParameter3("a"), AstFactory.integer(0)),
+          AstFactory.positionalFormalParameter(
+              AstFactory.simpleFormalParameter3("b"), AstFactory.integer(1))
+        ]));
+  }
+
+  void test_visitFormalParameterList_r() {
+    _assertSource(
+        "(a)",
+        AstFactory
+            .formalParameterList([AstFactory.simpleFormalParameter3("a")]));
+  }
+
+  void test_visitFormalParameterList_rn() {
+    _assertSource(
+        "(a, {b : 1})",
+        AstFactory.formalParameterList([
+          AstFactory.simpleFormalParameter3("a"),
+          AstFactory.namedFormalParameter(
+              AstFactory.simpleFormalParameter3("b"), AstFactory.integer(1))
+        ]));
+  }
+
+  void test_visitFormalParameterList_rnn() {
+    _assertSource(
+        "(a, {b : 1, c : 2})",
+        AstFactory.formalParameterList([
+          AstFactory.simpleFormalParameter3("a"),
+          AstFactory.namedFormalParameter(
+              AstFactory.simpleFormalParameter3("b"), AstFactory.integer(1)),
+          AstFactory.namedFormalParameter(
+              AstFactory.simpleFormalParameter3("c"), AstFactory.integer(2))
+        ]));
+  }
+
+  void test_visitFormalParameterList_rp() {
+    _assertSource(
+        "(a, [b = 1])",
+        AstFactory.formalParameterList([
+          AstFactory.simpleFormalParameter3("a"),
+          AstFactory.positionalFormalParameter(
+              AstFactory.simpleFormalParameter3("b"), AstFactory.integer(1))
+        ]));
+  }
+
+  void test_visitFormalParameterList_rpp() {
+    _assertSource(
+        "(a, [b = 1, c = 2])",
+        AstFactory.formalParameterList([
+          AstFactory.simpleFormalParameter3("a"),
+          AstFactory.positionalFormalParameter(
+              AstFactory.simpleFormalParameter3("b"), AstFactory.integer(1)),
+          AstFactory.positionalFormalParameter(
+              AstFactory.simpleFormalParameter3("c"), AstFactory.integer(2))
+        ]));
+  }
+
+  void test_visitFormalParameterList_rr() {
+    _assertSource(
+        "(a, b)",
+        AstFactory.formalParameterList([
+          AstFactory.simpleFormalParameter3("a"),
+          AstFactory.simpleFormalParameter3("b")
+        ]));
+  }
+
+  void test_visitFormalParameterList_rrn() {
+    _assertSource(
+        "(a, b, {c : 3})",
+        AstFactory.formalParameterList([
+          AstFactory.simpleFormalParameter3("a"),
+          AstFactory.simpleFormalParameter3("b"),
+          AstFactory.namedFormalParameter(
+              AstFactory.simpleFormalParameter3("c"), AstFactory.integer(3))
+        ]));
+  }
+
+  void test_visitFormalParameterList_rrnn() {
+    _assertSource(
+        "(a, b, {c : 3, d : 4})",
+        AstFactory.formalParameterList([
+          AstFactory.simpleFormalParameter3("a"),
+          AstFactory.simpleFormalParameter3("b"),
+          AstFactory.namedFormalParameter(
+              AstFactory.simpleFormalParameter3("c"), AstFactory.integer(3)),
+          AstFactory.namedFormalParameter(
+              AstFactory.simpleFormalParameter3("d"), AstFactory.integer(4))
+        ]));
+  }
+
+  void test_visitFormalParameterList_rrp() {
+    _assertSource(
+        "(a, b, [c = 3])",
+        AstFactory.formalParameterList([
+          AstFactory.simpleFormalParameter3("a"),
+          AstFactory.simpleFormalParameter3("b"),
+          AstFactory.positionalFormalParameter(
+              AstFactory.simpleFormalParameter3("c"), AstFactory.integer(3))
+        ]));
+  }
+
+  void test_visitFormalParameterList_rrpp() {
+    _assertSource(
+        "(a, b, [c = 3, d = 4])",
+        AstFactory.formalParameterList([
+          AstFactory.simpleFormalParameter3("a"),
+          AstFactory.simpleFormalParameter3("b"),
+          AstFactory.positionalFormalParameter(
+              AstFactory.simpleFormalParameter3("c"), AstFactory.integer(3)),
+          AstFactory.positionalFormalParameter(
+              AstFactory.simpleFormalParameter3("d"), AstFactory.integer(4))
+        ]));
+  }
+
+  void test_visitForStatement_c() {
+    _assertSource(
+        "for (; c;) {}",
+        AstFactory.forStatement(
+            null, AstFactory.identifier3("c"), null, AstFactory.block()));
+  }
+
+  void test_visitForStatement_cu() {
+    _assertSource(
+        "for (; c; u) {}",
+        AstFactory.forStatement(null, AstFactory.identifier3("c"),
+            [AstFactory.identifier3("u")], AstFactory.block()));
+  }
+
+  void test_visitForStatement_e() {
+    _assertSource(
+        "for (e;;) {}",
+        AstFactory.forStatement(
+            AstFactory.identifier3("e"), null, null, AstFactory.block()));
+  }
+
+  void test_visitForStatement_ec() {
+    _assertSource(
+        "for (e; c;) {}",
+        AstFactory.forStatement(AstFactory.identifier3("e"),
+            AstFactory.identifier3("c"), null, AstFactory.block()));
+  }
+
+  void test_visitForStatement_ecu() {
+    _assertSource(
+        "for (e; c; u) {}",
+        AstFactory.forStatement(
+            AstFactory.identifier3("e"),
+            AstFactory.identifier3("c"),
+            [AstFactory.identifier3("u")],
+            AstFactory.block()));
+  }
+
+  void test_visitForStatement_eu() {
+    _assertSource(
+        "for (e;; u) {}",
+        AstFactory.forStatement(AstFactory.identifier3("e"), null,
+            [AstFactory.identifier3("u")], AstFactory.block()));
+  }
+
+  void test_visitForStatement_i() {
+    _assertSource(
+        "for (var i;;) {}",
+        AstFactory.forStatement2(
+            AstFactory.variableDeclarationList2(
+                Keyword.VAR, [AstFactory.variableDeclaration("i")]),
+            null,
+            null,
+            AstFactory.block()));
+  }
+
+  void test_visitForStatement_ic() {
+    _assertSource(
+        "for (var i; c;) {}",
+        AstFactory.forStatement2(
+            AstFactory.variableDeclarationList2(
+                Keyword.VAR, [AstFactory.variableDeclaration("i")]),
+            AstFactory.identifier3("c"),
+            null,
+            AstFactory.block()));
+  }
+
+  void test_visitForStatement_icu() {
+    _assertSource(
+        "for (var i; c; u) {}",
+        AstFactory.forStatement2(
+            AstFactory.variableDeclarationList2(
+                Keyword.VAR, [AstFactory.variableDeclaration("i")]),
+            AstFactory.identifier3("c"),
+            [AstFactory.identifier3("u")],
+            AstFactory.block()));
+  }
+
+  void test_visitForStatement_iu() {
+    _assertSource(
+        "for (var i;; u) {}",
+        AstFactory.forStatement2(
+            AstFactory.variableDeclarationList2(
+                Keyword.VAR, [AstFactory.variableDeclaration("i")]),
+            null,
+            [AstFactory.identifier3("u")],
+            AstFactory.block()));
+  }
+
+  void test_visitForStatement_u() {
+    _assertSource(
+        "for (;; u) {}",
+        AstFactory.forStatement(
+            null, null, [AstFactory.identifier3("u")], AstFactory.block()));
+  }
+
+  void test_visitFunctionDeclaration_external() {
+    FunctionDeclaration functionDeclaration = AstFactory.functionDeclaration(
+        null,
+        null,
+        "f",
+        AstFactory.functionExpression2(
+            AstFactory.formalParameterList(), AstFactory.emptyFunctionBody()));
+    functionDeclaration.externalKeyword =
+        TokenFactory.tokenFromKeyword(Keyword.EXTERNAL);
+    _assertSource("external f();", functionDeclaration);
+  }
+
+  void test_visitFunctionDeclaration_getter() {
+    _assertSource(
+        "get f() {}",
+        AstFactory.functionDeclaration(
+            null, Keyword.GET, "f", AstFactory.functionExpression()));
+  }
+
+  void test_visitFunctionDeclaration_local_blockBody() {
+    FunctionDeclaration f = AstFactory.functionDeclaration(
+        null, null, "f", AstFactory.functionExpression());
+    FunctionDeclarationStatement fStatement =
+        new FunctionDeclarationStatement(f);
+    _assertSource(
+        "main() {f() {} 42;}",
+        AstFactory.functionDeclaration(
+            null,
+            null,
+            "main",
+            AstFactory.functionExpression2(
+                AstFactory.formalParameterList(),
+                AstFactory.blockFunctionBody2([
+                  fStatement,
+                  AstFactory.expressionStatement(AstFactory.integer(42))
+                ]))));
+  }
+
+  void test_visitFunctionDeclaration_local_expressionBody() {
+    FunctionDeclaration f = AstFactory.functionDeclaration(
+        null,
+        null,
+        "f",
+        AstFactory.functionExpression2(AstFactory.formalParameterList(),
+            AstFactory.expressionFunctionBody(AstFactory.integer(1))));
+    FunctionDeclarationStatement fStatement =
+        new FunctionDeclarationStatement(f);
+    _assertSource(
+        "main() {f() => 1; 2;}",
+        AstFactory.functionDeclaration(
+            null,
+            null,
+            "main",
+            AstFactory.functionExpression2(
+                AstFactory.formalParameterList(),
+                AstFactory.blockFunctionBody2([
+                  fStatement,
+                  AstFactory.expressionStatement(AstFactory.integer(2))
+                ]))));
+  }
+
+  void test_visitFunctionDeclaration_normal() {
+    _assertSource(
+        "f() {}",
+        AstFactory.functionDeclaration(
+            null, null, "f", AstFactory.functionExpression()));
+  }
+
+  void test_visitFunctionDeclaration_setter() {
+    _assertSource(
+        "set f() {}",
+        AstFactory.functionDeclaration(
+            null, Keyword.SET, "f", AstFactory.functionExpression()));
+  }
+
+  void test_visitFunctionDeclaration_typeParameters() {
+    _assertSource(
+        "f<E>() {}",
+        AstFactory.functionDeclaration(
+            null,
+            null,
+            "f",
+            AstFactory.functionExpression3(
+                AstFactory.typeParameterList(['E']),
+                AstFactory.formalParameterList(),
+                AstFactory.blockFunctionBody2())));
+  }
+
+  void test_visitFunctionDeclaration_withMetadata() {
+    FunctionDeclaration declaration = AstFactory.functionDeclaration(
+        null, null, "f", AstFactory.functionExpression());
+    declaration.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertSource("@deprecated f() {}", declaration);
+  }
+
+  void test_visitFunctionDeclarationStatement() {
+    _assertSource(
+        "f() {}",
+        AstFactory.functionDeclarationStatement(
+            null, null, "f", AstFactory.functionExpression()));
+  }
+
+  void test_visitFunctionExpression() {
+    _assertSource("() {}", AstFactory.functionExpression());
+  }
+
+  void test_visitFunctionExpression_typeParameters() {
+    _assertSource(
+        "<E>() {}",
+        AstFactory.functionExpression3(AstFactory.typeParameterList(['E']),
+            AstFactory.formalParameterList(), AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitFunctionExpressionInvocation_minimal() {
+    _assertSource("f()",
+        AstFactory.functionExpressionInvocation(AstFactory.identifier3("f")));
+  }
+
+  void test_visitFunctionExpressionInvocation_typeArguments() {
+    _assertSource(
+        "f<A>()",
+        AstFactory.functionExpressionInvocation2(AstFactory.identifier3("f"),
+            AstFactory.typeArgumentList([AstFactory.typeName4('A')])));
+  }
+
+  void test_visitFunctionTypeAlias_generic() {
+    _assertSource(
+        "typedef A F<B>();",
+        AstFactory.typeAlias(
+            AstFactory.typeName4("A"),
+            "F",
+            AstFactory.typeParameterList(["B"]),
+            AstFactory.formalParameterList()));
+  }
+
+  void test_visitFunctionTypeAlias_nonGeneric() {
+    _assertSource(
+        "typedef A F();",
+        AstFactory.typeAlias(AstFactory.typeName4("A"), "F", null,
+            AstFactory.formalParameterList()));
+  }
+
+  void test_visitFunctionTypeAlias_withMetadata() {
+    FunctionTypeAlias declaration = AstFactory.typeAlias(
+        AstFactory.typeName4("A"), "F", null, AstFactory.formalParameterList());
+    declaration.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertSource("@deprecated typedef A F();", declaration);
+  }
+
+  void test_visitFunctionTypedFormalParameter_noType() {
+    _assertSource("f()", AstFactory.functionTypedFormalParameter(null, "f"));
+  }
+
+  void test_visitFunctionTypedFormalParameter_type() {
+    _assertSource(
+        "T f()",
+        AstFactory.functionTypedFormalParameter(
+            AstFactory.typeName4("T"), "f"));
+  }
+
+  void test_visitFunctionTypedFormalParameter_typeParameters() {
+    _assertSource(
+        "T f<E>()",
+        new FunctionTypedFormalParameter(
+            null,
+            null,
+            AstFactory.typeName4("T"),
+            AstFactory.identifier3('f'),
+            AstFactory.typeParameterList(['E']),
+            AstFactory.formalParameterList([])));
+  }
+
+  void test_visitIfStatement_withElse() {
+    _assertSource(
+        "if (c) {} else {}",
+        AstFactory.ifStatement2(AstFactory.identifier3("c"), AstFactory.block(),
+            AstFactory.block()));
+  }
+
+  void test_visitIfStatement_withoutElse() {
+    _assertSource(
+        "if (c) {}",
+        AstFactory.ifStatement(
+            AstFactory.identifier3("c"), AstFactory.block()));
+  }
+
+  void test_visitImplementsClause_multiple() {
+    _assertSource(
+        "implements A, B",
+        AstFactory.implementsClause(
+            [AstFactory.typeName4("A"), AstFactory.typeName4("B")]));
+  }
+
+  void test_visitImplementsClause_single() {
+    _assertSource("implements A",
+        AstFactory.implementsClause([AstFactory.typeName4("A")]));
+  }
+
+  void test_visitImportDirective_combinator() {
+    _assertSource(
+        "import 'a.dart' show A;",
+        AstFactory.importDirective3("a.dart", null, [
+          AstFactory.showCombinator([AstFactory.identifier3("A")])
+        ]));
+  }
+
+  void test_visitImportDirective_combinators() {
+    _assertSource(
+        "import 'a.dart' show A hide B;",
+        AstFactory.importDirective3("a.dart", null, [
+          AstFactory.showCombinator([AstFactory.identifier3("A")]),
+          AstFactory.hideCombinator([AstFactory.identifier3("B")])
+        ]));
+  }
+
+  void test_visitImportDirective_deferred() {
+    _assertSource("import 'a.dart' deferred as p;",
+        AstFactory.importDirective2("a.dart", true, "p"));
+  }
+
+  void test_visitImportDirective_minimal() {
+    _assertSource(
+        "import 'a.dart';", AstFactory.importDirective3("a.dart", null));
+  }
+
+  void test_visitImportDirective_prefix() {
+    _assertSource(
+        "import 'a.dart' as p;", AstFactory.importDirective3("a.dart", "p"));
+  }
+
+  void test_visitImportDirective_prefix_combinator() {
+    _assertSource(
+        "import 'a.dart' as p show A;",
+        AstFactory.importDirective3("a.dart", "p", [
+          AstFactory.showCombinator([AstFactory.identifier3("A")])
+        ]));
+  }
+
+  void test_visitImportDirective_prefix_combinators() {
+    _assertSource(
+        "import 'a.dart' as p show A hide B;",
+        AstFactory.importDirective3("a.dart", "p", [
+          AstFactory.showCombinator([AstFactory.identifier3("A")]),
+          AstFactory.hideCombinator([AstFactory.identifier3("B")])
+        ]));
+  }
+
+  void test_visitImportDirective_withMetadata() {
+    ImportDirective directive = AstFactory.importDirective3("a.dart", null);
+    directive.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertSource("@deprecated import 'a.dart';", directive);
+  }
+
+  void test_visitImportHideCombinator_multiple() {
+    _assertSource(
+        "hide a, b",
+        AstFactory.hideCombinator(
+            [AstFactory.identifier3("a"), AstFactory.identifier3("b")]));
+  }
+
+  void test_visitImportHideCombinator_single() {
+    _assertSource(
+        "hide a", AstFactory.hideCombinator([AstFactory.identifier3("a")]));
+  }
+
+  void test_visitImportShowCombinator_multiple() {
+    _assertSource(
+        "show a, b",
+        AstFactory.showCombinator(
+            [AstFactory.identifier3("a"), AstFactory.identifier3("b")]));
+  }
+
+  void test_visitImportShowCombinator_single() {
+    _assertSource(
+        "show a", AstFactory.showCombinator([AstFactory.identifier3("a")]));
+  }
+
+  void test_visitIndexExpression() {
+    _assertSource(
+        "a[i]",
+        AstFactory.indexExpression(
+            AstFactory.identifier3("a"), AstFactory.identifier3("i")));
+  }
+
+  void test_visitInstanceCreationExpression_const() {
+    _assertSource(
+        "const C()",
+        AstFactory.instanceCreationExpression2(
+            Keyword.CONST, AstFactory.typeName4("C")));
+  }
+
+  void test_visitInstanceCreationExpression_named() {
+    _assertSource(
+        "new C.c()",
+        AstFactory.instanceCreationExpression3(
+            Keyword.NEW, AstFactory.typeName4("C"), "c"));
+  }
+
+  void test_visitInstanceCreationExpression_unnamed() {
+    _assertSource(
+        "new C()",
+        AstFactory.instanceCreationExpression2(
+            Keyword.NEW, AstFactory.typeName4("C")));
+  }
+
+  void test_visitIntegerLiteral() {
+    _assertSource("42", AstFactory.integer(42));
+  }
+
+  void test_visitInterpolationExpression_expression() {
+    _assertSource("\${a}",
+        AstFactory.interpolationExpression(AstFactory.identifier3("a")));
+  }
+
+  void test_visitInterpolationExpression_identifier() {
+    _assertSource("\$a", AstFactory.interpolationExpression2("a"));
+  }
+
+  void test_visitInterpolationString() {
+    _assertSource("'x", AstFactory.interpolationString("'x", "x"));
+  }
+
+  void test_visitIsExpression_negated() {
+    _assertSource(
+        "a is! C",
+        AstFactory.isExpression(
+            AstFactory.identifier3("a"), true, AstFactory.typeName4("C")));
+  }
+
+  void test_visitIsExpression_normal() {
+    _assertSource(
+        "a is C",
+        AstFactory.isExpression(
+            AstFactory.identifier3("a"), false, AstFactory.typeName4("C")));
+  }
+
+  void test_visitLabel() {
+    _assertSource("a:", AstFactory.label2("a"));
+  }
+
+  void test_visitLabeledStatement_multiple() {
+    _assertSource(
+        "a: b: return;",
+        AstFactory.labeledStatement(
+            [AstFactory.label2("a"), AstFactory.label2("b")],
+            AstFactory.returnStatement()));
+  }
+
+  void test_visitLabeledStatement_single() {
+    _assertSource(
+        "a: return;",
+        AstFactory.labeledStatement(
+            [AstFactory.label2("a")], AstFactory.returnStatement()));
+  }
+
+  void test_visitLibraryDirective() {
+    _assertSource("library l;", AstFactory.libraryDirective2("l"));
+  }
+
+  void test_visitLibraryDirective_withMetadata() {
+    LibraryDirective directive = AstFactory.libraryDirective2("l");
+    directive.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertSource("@deprecated library l;", directive);
+  }
+
+  void test_visitLibraryIdentifier_multiple() {
+    _assertSource(
+        "a.b.c",
+        AstFactory.libraryIdentifier([
+          AstFactory.identifier3("a"),
+          AstFactory.identifier3("b"),
+          AstFactory.identifier3("c")
+        ]));
+  }
+
+  void test_visitLibraryIdentifier_single() {
+    _assertSource(
+        "a", AstFactory.libraryIdentifier([AstFactory.identifier3("a")]));
+  }
+
+  void test_visitListLiteral_const() {
+    _assertSource("const []", AstFactory.listLiteral2(Keyword.CONST, null));
+  }
+
+  void test_visitListLiteral_empty() {
+    _assertSource("[]", AstFactory.listLiteral());
+  }
+
+  void test_visitListLiteral_nonEmpty() {
+    _assertSource(
+        "[a, b, c]",
+        AstFactory.listLiteral([
+          AstFactory.identifier3("a"),
+          AstFactory.identifier3("b"),
+          AstFactory.identifier3("c")
+        ]));
+  }
+
+  void test_visitMapLiteral_const() {
+    _assertSource("const {}", AstFactory.mapLiteral(Keyword.CONST, null));
+  }
+
+  void test_visitMapLiteral_empty() {
+    _assertSource("{}", AstFactory.mapLiteral2());
+  }
+
+  void test_visitMapLiteral_nonEmpty() {
+    _assertSource(
+        "{'a' : a, 'b' : b, 'c' : c}",
+        AstFactory.mapLiteral2([
+          AstFactory.mapLiteralEntry("a", AstFactory.identifier3("a")),
+          AstFactory.mapLiteralEntry("b", AstFactory.identifier3("b")),
+          AstFactory.mapLiteralEntry("c", AstFactory.identifier3("c"))
+        ]));
+  }
+
+  void test_visitMapLiteralEntry() {
+    _assertSource("'a' : b",
+        AstFactory.mapLiteralEntry("a", AstFactory.identifier3("b")));
+  }
+
+  void test_visitMethodDeclaration_external() {
+    _assertSource(
+        "external m();",
+        AstFactory.methodDeclaration(null, null, null, null,
+            AstFactory.identifier3("m"), AstFactory.formalParameterList()));
+  }
+
+  void test_visitMethodDeclaration_external_returnType() {
+    _assertSource(
+        "external T m();",
+        AstFactory.methodDeclaration(
+            null,
+            AstFactory.typeName4("T"),
+            null,
+            null,
+            AstFactory.identifier3("m"),
+            AstFactory.formalParameterList()));
+  }
+
+  void test_visitMethodDeclaration_getter() {
+    _assertSource(
+        "get m {}",
+        AstFactory.methodDeclaration2(
+            null,
+            null,
+            Keyword.GET,
+            null,
+            AstFactory.identifier3("m"),
+            null,
+            AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_getter_returnType() {
+    _assertSource(
+        "T get m {}",
+        AstFactory.methodDeclaration2(
+            null,
+            AstFactory.typeName4("T"),
+            Keyword.GET,
+            null,
+            AstFactory.identifier3("m"),
+            null,
+            AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_getter_seturnType() {
+    _assertSource(
+        "T set m(var v) {}",
+        AstFactory.methodDeclaration2(
+            null,
+            AstFactory.typeName4("T"),
+            Keyword.SET,
+            null,
+            AstFactory.identifier3("m"),
+            AstFactory.formalParameterList(
+                [AstFactory.simpleFormalParameter(Keyword.VAR, "v")]),
+            AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_minimal() {
+    _assertSource(
+        "m() {}",
+        AstFactory.methodDeclaration2(
+            null,
+            null,
+            null,
+            null,
+            AstFactory.identifier3("m"),
+            AstFactory.formalParameterList(),
+            AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_multipleParameters() {
+    _assertSource(
+        "m(var a, var b) {}",
+        AstFactory.methodDeclaration2(
+            null,
+            null,
+            null,
+            null,
+            AstFactory.identifier3("m"),
+            AstFactory.formalParameterList([
+              AstFactory.simpleFormalParameter(Keyword.VAR, "a"),
+              AstFactory.simpleFormalParameter(Keyword.VAR, "b")
+            ]),
+            AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_operator() {
+    _assertSource(
+        "operator +() {}",
+        AstFactory.methodDeclaration2(
+            null,
+            null,
+            null,
+            Keyword.OPERATOR,
+            AstFactory.identifier3("+"),
+            AstFactory.formalParameterList(),
+            AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_operator_returnType() {
+    _assertSource(
+        "T operator +() {}",
+        AstFactory.methodDeclaration2(
+            null,
+            AstFactory.typeName4("T"),
+            null,
+            Keyword.OPERATOR,
+            AstFactory.identifier3("+"),
+            AstFactory.formalParameterList(),
+            AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_returnType() {
+    _assertSource(
+        "T m() {}",
+        AstFactory.methodDeclaration2(
+            null,
+            AstFactory.typeName4("T"),
+            null,
+            null,
+            AstFactory.identifier3("m"),
+            AstFactory.formalParameterList(),
+            AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_setter() {
+    _assertSource(
+        "set m(var v) {}",
+        AstFactory.methodDeclaration2(
+            null,
+            null,
+            Keyword.SET,
+            null,
+            AstFactory.identifier3("m"),
+            AstFactory.formalParameterList(
+                [AstFactory.simpleFormalParameter(Keyword.VAR, "v")]),
+            AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_static() {
+    _assertSource(
+        "static m() {}",
+        AstFactory.methodDeclaration2(
+            Keyword.STATIC,
+            null,
+            null,
+            null,
+            AstFactory.identifier3("m"),
+            AstFactory.formalParameterList(),
+            AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_static_returnType() {
+    _assertSource(
+        "static T m() {}",
+        AstFactory.methodDeclaration2(
+            Keyword.STATIC,
+            AstFactory.typeName4("T"),
+            null,
+            null,
+            AstFactory.identifier3("m"),
+            AstFactory.formalParameterList(),
+            AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_typeParameters() {
+    _assertSource(
+        "m<E>() {}",
+        AstFactory.methodDeclaration3(
+            null,
+            null,
+            null,
+            null,
+            AstFactory.identifier3("m"),
+            AstFactory.typeParameterList(['E']),
+            AstFactory.formalParameterList(),
+            AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_withMetadata() {
+    MethodDeclaration declaration = AstFactory.methodDeclaration2(
+        null,
+        null,
+        null,
+        null,
+        AstFactory.identifier3("m"),
+        AstFactory.formalParameterList(),
+        AstFactory.blockFunctionBody2());
+    declaration.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertSource("@deprecated m() {}", declaration);
+  }
+
+  void test_visitMethodInvocation_conditional() {
+    _assertSource(
+        "t?.m()",
+        AstFactory.methodInvocation(
+            AstFactory.identifier3("t"), "m", null, TokenType.QUESTION_PERIOD));
+  }
+
+  void test_visitMethodInvocation_noTarget() {
+    _assertSource("m()", AstFactory.methodInvocation2("m"));
+  }
+
+  void test_visitMethodInvocation_target() {
+    _assertSource(
+        "t.m()", AstFactory.methodInvocation(AstFactory.identifier3("t"), "m"));
+  }
+
+  void test_visitMethodInvocation_typeArguments() {
+    _assertSource(
+        "m<A>()",
+        AstFactory.methodInvocation3(null, "m",
+            AstFactory.typeArgumentList([AstFactory.typeName4('A')])));
+  }
+
+  void test_visitNamedExpression() {
+    _assertSource(
+        "a: b", AstFactory.namedExpression2("a", AstFactory.identifier3("b")));
+  }
+
+  void test_visitNamedFormalParameter() {
+    _assertSource(
+        "var a : 0",
+        AstFactory.namedFormalParameter(
+            AstFactory.simpleFormalParameter(Keyword.VAR, "a"),
+            AstFactory.integer(0)));
+  }
+
+  void test_visitNativeClause() {
+    _assertSource("native 'code'", AstFactory.nativeClause("code"));
+  }
+
+  void test_visitNativeFunctionBody() {
+    _assertSource("native 'str';", AstFactory.nativeFunctionBody("str"));
+  }
+
+  void test_visitNullLiteral() {
+    _assertSource("null", AstFactory.nullLiteral());
+  }
+
+  void test_visitParenthesizedExpression() {
+    _assertSource(
+        "(a)", AstFactory.parenthesizedExpression(AstFactory.identifier3("a")));
+  }
+
+  void test_visitPartDirective() {
+    _assertSource("part 'a.dart';", AstFactory.partDirective2("a.dart"));
+  }
+
+  void test_visitPartDirective_withMetadata() {
+    PartDirective directive = AstFactory.partDirective2("a.dart");
+    directive.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertSource("@deprecated part 'a.dart';", directive);
+  }
+
+  void test_visitPartOfDirective() {
+    _assertSource("part of l;",
+        AstFactory.partOfDirective(AstFactory.libraryIdentifier2(["l"])));
+  }
+
+  void test_visitPartOfDirective_withMetadata() {
+    PartOfDirective directive =
+        AstFactory.partOfDirective(AstFactory.libraryIdentifier2(["l"]));
+    directive.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertSource("@deprecated part of l;", directive);
+  }
+
+  void test_visitPositionalFormalParameter() {
+    _assertSource(
+        "var a = 0",
+        AstFactory.positionalFormalParameter(
+            AstFactory.simpleFormalParameter(Keyword.VAR, "a"),
+            AstFactory.integer(0)));
+  }
+
+  void test_visitPostfixExpression() {
+    _assertSource(
+        "a++",
+        AstFactory.postfixExpression(
+            AstFactory.identifier3("a"), TokenType.PLUS_PLUS));
+  }
+
+  void test_visitPrefixedIdentifier() {
+    _assertSource("a.b", AstFactory.identifier5("a", "b"));
+  }
+
+  void test_visitPrefixExpression() {
+    _assertSource(
+        "-a",
+        AstFactory.prefixExpression(
+            TokenType.MINUS, AstFactory.identifier3("a")));
+  }
+
+  void test_visitPropertyAccess() {
+    _assertSource(
+        "a.b", AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b"));
+  }
+
+  void test_visitPropertyAccess_conditional() {
+    _assertSource(
+        "a?.b",
+        AstFactory.propertyAccess2(
+            AstFactory.identifier3("a"), "b", TokenType.QUESTION_PERIOD));
+  }
+
+  void test_visitRedirectingConstructorInvocation_named() {
+    _assertSource(
+        "this.c()", AstFactory.redirectingConstructorInvocation2("c"));
+  }
+
+  void test_visitRedirectingConstructorInvocation_unnamed() {
+    _assertSource("this()", AstFactory.redirectingConstructorInvocation());
+  }
+
+  void test_visitRethrowExpression() {
+    _assertSource("rethrow", AstFactory.rethrowExpression());
+  }
+
+  void test_visitReturnStatement_expression() {
+    _assertSource(
+        "return a;", AstFactory.returnStatement2(AstFactory.identifier3("a")));
+  }
+
+  void test_visitReturnStatement_noExpression() {
+    _assertSource("return;", AstFactory.returnStatement());
+  }
+
+  void test_visitScriptTag() {
+    String scriptTag = "!#/bin/dart.exe";
+    _assertSource(scriptTag, AstFactory.scriptTag(scriptTag));
+  }
+
+  void test_visitSimpleFormalParameter_keyword() {
+    _assertSource("var a", AstFactory.simpleFormalParameter(Keyword.VAR, "a"));
+  }
+
+  void test_visitSimpleFormalParameter_keyword_type() {
+    _assertSource(
+        "final A a",
+        AstFactory.simpleFormalParameter2(
+            Keyword.FINAL, AstFactory.typeName4("A"), "a"));
+  }
+
+  void test_visitSimpleFormalParameter_type() {
+    _assertSource("A a",
+        AstFactory.simpleFormalParameter4(AstFactory.typeName4("A"), "a"));
+  }
+
+  void test_visitSimpleIdentifier() {
+    _assertSource("a", AstFactory.identifier3("a"));
+  }
+
+  void test_visitSimpleStringLiteral() {
+    _assertSource("'a'", AstFactory.string2("a"));
+  }
+
+  void test_visitStringInterpolation() {
+    _assertSource(
+        "'a\${e}b'",
+        AstFactory.string([
+          AstFactory.interpolationString("'a", "a"),
+          AstFactory.interpolationExpression(AstFactory.identifier3("e")),
+          AstFactory.interpolationString("b'", "b")
+        ]));
+  }
+
+  void test_visitSuperConstructorInvocation() {
+    _assertSource("super()", AstFactory.superConstructorInvocation());
+  }
+
+  void test_visitSuperConstructorInvocation_named() {
+    _assertSource("super.c()", AstFactory.superConstructorInvocation2("c"));
+  }
+
+  void test_visitSuperExpression() {
+    _assertSource("super", AstFactory.superExpression());
+  }
+
+  void test_visitSwitchCase_multipleLabels() {
+    _assertSource(
+        "l1: l2: case a: {}",
+        AstFactory.switchCase2(
+            [AstFactory.label2("l1"), AstFactory.label2("l2")],
+            AstFactory.identifier3("a"),
+            [AstFactory.block()]));
+  }
+
+  void test_visitSwitchCase_multipleStatements() {
+    _assertSource(
+        "case a: {} {}",
+        AstFactory.switchCase(AstFactory.identifier3("a"),
+            [AstFactory.block(), AstFactory.block()]));
+  }
+
+  void test_visitSwitchCase_noLabels() {
+    _assertSource(
+        "case a: {}",
+        AstFactory.switchCase(
+            AstFactory.identifier3("a"), [AstFactory.block()]));
+  }
+
+  void test_visitSwitchCase_singleLabel() {
+    _assertSource(
+        "l1: case a: {}",
+        AstFactory.switchCase2([AstFactory.label2("l1")],
+            AstFactory.identifier3("a"), [AstFactory.block()]));
+  }
+
+  void test_visitSwitchDefault_multipleLabels() {
+    _assertSource(
+        "l1: l2: default: {}",
+        AstFactory.switchDefault(
+            [AstFactory.label2("l1"), AstFactory.label2("l2")],
+            [AstFactory.block()]));
+  }
+
+  void test_visitSwitchDefault_multipleStatements() {
+    _assertSource("default: {} {}",
+        AstFactory.switchDefault2([AstFactory.block(), AstFactory.block()]));
+  }
+
+  void test_visitSwitchDefault_noLabels() {
+    _assertSource(
+        "default: {}", AstFactory.switchDefault2([AstFactory.block()]));
+  }
+
+  void test_visitSwitchDefault_singleLabel() {
+    _assertSource(
+        "l1: default: {}",
+        AstFactory.switchDefault(
+            [AstFactory.label2("l1")], [AstFactory.block()]));
+  }
+
+  void test_visitSwitchStatement() {
+    _assertSource(
+        "switch (a) {case 'b': {} default: {}}",
+        AstFactory.switchStatement(AstFactory.identifier3("a"), [
+          AstFactory.switchCase(AstFactory.string2("b"), [AstFactory.block()]),
+          AstFactory.switchDefault2([AstFactory.block()])
+        ]));
+  }
+
+  void test_visitSymbolLiteral_multiple() {
+    _assertSource("#a.b.c", AstFactory.symbolLiteral(["a", "b", "c"]));
+  }
+
+  void test_visitSymbolLiteral_single() {
+    _assertSource("#a", AstFactory.symbolLiteral(["a"]));
+  }
+
+  void test_visitThisExpression() {
+    _assertSource("this", AstFactory.thisExpression());
+  }
+
+  void test_visitThrowStatement() {
+    _assertSource(
+        "throw e", AstFactory.throwExpression2(AstFactory.identifier3("e")));
+  }
+
+  void test_visitTopLevelVariableDeclaration_multiple() {
+    _assertSource(
+        "var a;",
+        AstFactory.topLevelVariableDeclaration2(
+            Keyword.VAR, [AstFactory.variableDeclaration("a")]));
+  }
+
+  void test_visitTopLevelVariableDeclaration_single() {
+    _assertSource(
+        "var a, b;",
+        AstFactory.topLevelVariableDeclaration2(Keyword.VAR, [
+          AstFactory.variableDeclaration("a"),
+          AstFactory.variableDeclaration("b")
+        ]));
+  }
+
+  void test_visitTryStatement_catch() {
+    _assertSource(
+        "try {} on E {}",
+        AstFactory.tryStatement2(AstFactory.block(),
+            [AstFactory.catchClause3(AstFactory.typeName4("E"))]));
+  }
+
+  void test_visitTryStatement_catches() {
+    _assertSource(
+        "try {} on E {} on F {}",
+        AstFactory.tryStatement2(AstFactory.block(), [
+          AstFactory.catchClause3(AstFactory.typeName4("E")),
+          AstFactory.catchClause3(AstFactory.typeName4("F"))
+        ]));
+  }
+
+  void test_visitTryStatement_catchFinally() {
+    _assertSource(
+        "try {} on E {} finally {}",
+        AstFactory.tryStatement3(
+            AstFactory.block(),
+            [AstFactory.catchClause3(AstFactory.typeName4("E"))],
+            AstFactory.block()));
+  }
+
+  void test_visitTryStatement_finally() {
+    _assertSource("try {} finally {}",
+        AstFactory.tryStatement(AstFactory.block(), AstFactory.block()));
+  }
+
+  void test_visitTypeArgumentList_multiple() {
+    _assertSource(
+        "<E, F>",
+        AstFactory.typeArgumentList(
+            [AstFactory.typeName4("E"), AstFactory.typeName4("F")]));
+  }
+
+  void test_visitTypeArgumentList_single() {
+    _assertSource(
+        "<E>", AstFactory.typeArgumentList([AstFactory.typeName4("E")]));
+  }
+
+  void test_visitTypeName_multipleArgs() {
+    _assertSource(
+        "C<D, E>",
+        AstFactory.typeName4(
+            "C", [AstFactory.typeName4("D"), AstFactory.typeName4("E")]));
+  }
+
+  void test_visitTypeName_nestedArg() {
+    _assertSource(
+        "C<D<E>>",
+        AstFactory.typeName4("C", [
+          AstFactory.typeName4("D", [AstFactory.typeName4("E")])
+        ]));
+  }
+
+  void test_visitTypeName_noArgs() {
+    _assertSource("C", AstFactory.typeName4("C"));
+  }
+
+  void test_visitTypeName_singleArg() {
+    _assertSource(
+        "C<D>", AstFactory.typeName4("C", [AstFactory.typeName4("D")]));
+  }
+
+  void test_visitTypeParameter_withExtends() {
+    _assertSource("E extends C",
+        AstFactory.typeParameter2("E", AstFactory.typeName4("C")));
+  }
+
+  void test_visitTypeParameter_withMetadata() {
+    TypeParameter parameter = AstFactory.typeParameter("E");
+    parameter.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertSource("@deprecated E", parameter);
+  }
+
+  void test_visitTypeParameter_withoutExtends() {
+    _assertSource("E", AstFactory.typeParameter("E"));
+  }
+
+  void test_visitTypeParameterList_multiple() {
+    _assertSource("<E, F>", AstFactory.typeParameterList(["E", "F"]));
+  }
+
+  void test_visitTypeParameterList_single() {
+    _assertSource("<E>", AstFactory.typeParameterList(["E"]));
+  }
+
+  void test_visitVariableDeclaration_initialized() {
+    _assertSource("a = b",
+        AstFactory.variableDeclaration2("a", AstFactory.identifier3("b")));
+  }
+
+  void test_visitVariableDeclaration_uninitialized() {
+    _assertSource("a", AstFactory.variableDeclaration("a"));
+  }
+
+  void test_visitVariableDeclaration_withMetadata() {
+    VariableDeclaration declaration = AstFactory.variableDeclaration("a");
+    declaration.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertSource("@deprecated a", declaration);
+  }
+
+  void test_visitVariableDeclarationList_const_type() {
+    _assertSource(
+        "const C a, b",
+        AstFactory.variableDeclarationList(
+            Keyword.CONST, AstFactory.typeName4("C"), [
+          AstFactory.variableDeclaration("a"),
+          AstFactory.variableDeclaration("b")
+        ]));
+  }
+
+  void test_visitVariableDeclarationList_final_noType() {
+    _assertSource(
+        "final a, b",
+        AstFactory.variableDeclarationList2(Keyword.FINAL, [
+          AstFactory.variableDeclaration("a"),
+          AstFactory.variableDeclaration("b")
+        ]));
+  }
+
+  void test_visitVariableDeclarationList_final_withMetadata() {
+    VariableDeclarationList declarationList = AstFactory
+        .variableDeclarationList2(Keyword.FINAL, [
+      AstFactory.variableDeclaration("a"),
+      AstFactory.variableDeclaration("b")
+    ]);
+    declarationList.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertSource("@deprecated final a, b", declarationList);
+  }
+
+  void test_visitVariableDeclarationList_type() {
+    _assertSource(
+        "C a, b",
+        AstFactory.variableDeclarationList(null, AstFactory.typeName4("C"), [
+          AstFactory.variableDeclaration("a"),
+          AstFactory.variableDeclaration("b")
+        ]));
+  }
+
+  void test_visitVariableDeclarationList_var() {
+    _assertSource(
+        "var a, b",
+        AstFactory.variableDeclarationList2(Keyword.VAR, [
+          AstFactory.variableDeclaration("a"),
+          AstFactory.variableDeclaration("b")
+        ]));
+  }
+
+  void test_visitVariableDeclarationStatement() {
+    _assertSource(
+        "C c;",
+        AstFactory.variableDeclarationStatement(null, AstFactory.typeName4("C"),
+            [AstFactory.variableDeclaration("c")]));
+  }
+
+  void test_visitWhileStatement() {
+    _assertSource(
+        "while (c) {}",
+        AstFactory.whileStatement(
+            AstFactory.identifier3("c"), AstFactory.block()));
+  }
+
+  void test_visitWithClause_multiple() {
+    _assertSource(
+        "with A, B, C",
+        AstFactory.withClause([
+          AstFactory.typeName4("A"),
+          AstFactory.typeName4("B"),
+          AstFactory.typeName4("C")
+        ]));
+  }
+
+  void test_visitWithClause_single() {
+    _assertSource("with A", AstFactory.withClause([AstFactory.typeName4("A")]));
+  }
+
+  void test_visitYieldStatement() {
+    _assertSource(
+        "yield e;", AstFactory.yieldStatement(AstFactory.identifier3("e")));
+  }
+
+  void test_visitYieldStatement_each() {
+    _assertSource("yield* e;",
+        AstFactory.yieldEachStatement(AstFactory.identifier3("e")));
+  }
+
+  /**
+   * Assert that a `ToSourceVisitor` will produce the expected source when visiting the given
+   * node.
+   *
+   * @param expectedSource the source string that the visitor is expected to produce
+   * @param node the AST node being visited to produce the actual source
+   * @throws AFE if the visitor does not produce the expected source for the given node
+   */
+  void _assertSource(String expectedSource, AstNode node) {
+    PrintStringWriter writer = new PrintStringWriter();
+    node.accept(new ToSourceVisitor(writer));
+    expect(writer.toString(), expectedSource);
+  }
+}
+
+@reflectiveTest
+class VariableDeclarationTest extends ParserTestCase {
+  void test_getDocumentationComment_onGrandParent() {
+    VariableDeclaration varDecl = AstFactory.variableDeclaration("a");
+    TopLevelVariableDeclaration decl =
+        AstFactory.topLevelVariableDeclaration2(Keyword.VAR, [varDecl]);
+    Comment comment = Comment.createDocumentationComment(new List<Token>(0));
+    expect(varDecl.documentationComment, isNull);
+    decl.documentationComment = comment;
+    expect(varDecl.documentationComment, isNotNull);
+    expect(decl.documentationComment, isNotNull);
+  }
+
+  void test_getDocumentationComment_onNode() {
+    VariableDeclaration decl = AstFactory.variableDeclaration("a");
+    Comment comment = Comment.createDocumentationComment(new List<Token>(0));
+    decl.documentationComment = comment;
+    expect(decl.documentationComment, isNotNull);
+  }
+}
+
+class WrapperKind extends Enum<WrapperKind> {
+  static const WrapperKind PREFIXED_LEFT =
+      const WrapperKind('PREFIXED_LEFT', 0);
+
+  static const WrapperKind PREFIXED_RIGHT =
+      const WrapperKind('PREFIXED_RIGHT', 1);
+
+  static const WrapperKind PROPERTY_LEFT =
+      const WrapperKind('PROPERTY_LEFT', 2);
+
+  static const WrapperKind PROPERTY_RIGHT =
+      const WrapperKind('PROPERTY_RIGHT', 3);
+
+  static const WrapperKind NONE = const WrapperKind('NONE', 4);
+
+  static const List<WrapperKind> values = const [
+    PREFIXED_LEFT,
+    PREFIXED_RIGHT,
+    PROPERTY_LEFT,
+    PROPERTY_RIGHT,
+    NONE
+  ];
+
+  const WrapperKind(String name, int ordinal) : super(name, ordinal);
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/compile_time_error_code_test.dart b/mojo/public/dart/third_party/analyzer/test/generated/compile_time_error_code_test.dart
new file mode 100644
index 0000000..2028e70
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/generated/compile_time_error_code_test.dart
@@ -0,0 +1,6188 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.compile_time_error_code_test;
+
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
+import 'package:analyzer/src/generated/source_io.dart';
+
+import '../reflective_tests.dart';
+import '../utils.dart';
+import 'resolver_test.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(CompileTimeErrorCodeTest);
+}
+
+@reflectiveTest
+class CompileTimeErrorCodeTest extends ResolverTestCase {
+  void fail_awaitInWrongContext_sync() {
+    // This test requires better error recovery than we currently have. In
+    // particular, we need to be able to distinguish between an await expression
+    // in the wrong context, and the use of 'await' as an identifier.
+    Source source = addSource(r'''
+f(x) {
+  return await x;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT]);
+    verify([source]);
+  }
+
+  void fail_awaitInWrongContext_syncStar() {
+    // This test requires better error recovery than we currently have. In
+    // particular, we need to be able to distinguish between an await expression
+    // in the wrong context, and the use of 'await' as an identifier.
+    Source source = addSource(r'''
+f(x) sync* {
+  yield await x;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT]);
+    verify([source]);
+  }
+
+  void fail_compileTimeConstantRaisesException() {
+    Source source = addSource(r'''
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.COMPILE_TIME_CONSTANT_RAISES_EXCEPTION]);
+    verify([source]);
+  }
+
+  void fail_constEvalThrowsException() {
+    Source source = addSource(r'''
+class C {
+  const C();
+}
+f() { return const C(); }''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION]);
+    verify([source]);
+  }
+
+  void fail_invalidIdentifierInAsync_async() {
+    // TODO(brianwilkerson) Report this error.
+    Source source = addSource(r'''
+class A {
+  m() async {
+    int async;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_IDENTIFIER_IN_ASYNC]);
+    verify([source]);
+  }
+
+  void fail_invalidIdentifierInAsync_await() {
+    // TODO(brianwilkerson) Report this error.
+    Source source = addSource(r'''
+class A {
+  m() async {
+    int await;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_IDENTIFIER_IN_ASYNC]);
+    verify([source]);
+  }
+
+  void fail_invalidIdentifierInAsync_yield() {
+    // TODO(brianwilkerson) Report this error.
+    Source source = addSource(r'''
+class A {
+  m() async {
+    int yield;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_IDENTIFIER_IN_ASYNC]);
+    verify([source]);
+  }
+
+  void fail_mixinDeclaresConstructor() {
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+class B extends Object mixin A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void fail_mixinOfNonClass() {
+    // TODO(brianwilkerson) Compare with MIXIN_WITH_NON_CLASS_SUPERCLASS.
+    Source source = addSource(r'''
+var A;
+class B extends Object mixin A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
+    verify([source]);
+  }
+
+  void fail_objectCannotExtendAnotherClass() {
+    Source source = addSource(r'''
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.OBJECT_CANNOT_EXTEND_ANOTHER_CLASS]);
+    verify([source]);
+  }
+
+  void fail_superInitializerInObject() {
+    Source source = addSource(r'''
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_INITIALIZER_IN_OBJECT]);
+    verify([source]);
+  }
+
+  void fail_yieldEachInNonGenerator_async() {
+    // TODO(brianwilkerson) We are currently parsing the yield statement as a
+    // binary expression.
+    Source source = addSource(r'''
+f() async {
+  yield* 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.YIELD_EACH_IN_NON_GENERATOR]);
+    verify([source]);
+  }
+
+  void fail_yieldEachInNonGenerator_sync() {
+    // TODO(brianwilkerson) We are currently parsing the yield statement as a
+    // binary expression.
+    Source source = addSource(r'''
+f() {
+  yield* 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.YIELD_IN_NON_GENERATOR]);
+    verify([source]);
+  }
+
+  void fail_yieldInNonGenerator_async() {
+    // TODO(brianwilkerson) We are currently trying to parse the yield statement
+    // as a binary expression.
+    Source source = addSource(r'''
+f() async {
+  yield 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.YIELD_IN_NON_GENERATOR]);
+    verify([source]);
+  }
+
+  void fail_yieldInNonGenerator_sync() {
+    // TODO(brianwilkerson) We are currently trying to parse the yield statement
+    // as a binary expression.
+    Source source = addSource(r'''
+f() {
+  yield 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.YIELD_EACH_IN_NON_GENERATOR]);
+    verify([source]);
+  }
+
+  void test_accessPrivateEnumField() {
+    Source source = addSource(r'''
+enum E { ONE }
+String name(E e) {
+  return e._name;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.ACCESS_PRIVATE_ENUM_FIELD]);
+    // Cannot verify because "_name" cannot be resolved.
+  }
+
+  void test_ambiguousExport() {
+    Source source = addSource(r'''
+library L;
+export 'lib1.dart';
+export 'lib2.dart';''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class N {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+class N {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.AMBIGUOUS_EXPORT]);
+    verify([source]);
+  }
+
+  void test_async_used_as_identifier_in_annotation() {
+    Source source = addSource('''
+const int async = 0;
+f() async {
+  g(@async x) {}
+  g(0);
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_async_used_as_identifier_in_argument_label() {
+    Source source = addSource('''
+@proxy
+class C {}
+f() async {
+  new C().g(async: 0);
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    // Note: we don't call verify([source]) because verify() doesn't understand
+    // about @proxy.
+  }
+
+  void test_async_used_as_identifier_in_async_method() {
+    Source source = addSource('''
+f() async {
+  var async = 1;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_async_used_as_identifier_in_async_star_method() {
+    Source source = addSource('''
+f() async* {
+  var async = 1;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_async_used_as_identifier_in_break_statement() {
+    Source source = addSource('''
+f() async {
+  while (true) {
+    break async;
+  }
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER,
+      CompileTimeErrorCode.LABEL_UNDEFINED
+    ]);
+    // Note: we don't call verify([source]) because the reference to the
+    // "async" label is unresolved.
+  }
+
+  void test_async_used_as_identifier_in_cascaded_invocation() {
+    Source source = addSource('''
+class C {
+  int async() => 1;
+}
+f() async {
+  return new C()..async();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_async_used_as_identifier_in_cascaded_setter_invocation() {
+    Source source = addSource('''
+class C {
+  void set async(int i) {}
+}
+f() async {
+  return new C()..async = 1;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_async_used_as_identifier_in_catch_exception_argument() {
+    Source source = addSource('''
+g() {}
+f() async {
+  try {
+    g();
+  } catch (async) { }
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_async_used_as_identifier_in_catch_stacktrace_argument() {
+    Source source = addSource('''
+g() {}
+f() async {
+  try {
+    g();
+  } catch (e, async) { }
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_async_used_as_identifier_in_continue_statement() {
+    Source source = addSource('''
+f() async {
+  while (true) {
+    continue async;
+  }
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER,
+      CompileTimeErrorCode.LABEL_UNDEFINED
+    ]);
+    // Note: we don't call verify([source]) because the reference to the
+    // "async" label is unresolved.
+  }
+
+  void test_async_used_as_identifier_in_for_statement() {
+    Source source = addSource('''
+var async;
+f() async {
+  for (async in []) {}
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_async_used_as_identifier_in_formal_parameter_name() {
+    Source source = addSource('''
+f() async {
+  g(int async) {}
+  g(0);
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_async_used_as_identifier_in_getter_name() {
+    Source source = addSource('''
+class C {
+  int get async => 1;
+}
+f() async {
+  return new C().async;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_async_used_as_identifier_in_invocation() {
+    Source source = addSource('''
+class C {
+  int async() => 1;
+}
+f() async {
+  return new C().async();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_async_used_as_identifier_in_local_function_name() {
+    Source source = addSource('''
+f() async {
+  int async() => null;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_async_used_as_identifier_in_prefix() {
+    Source source = addSource('''
+import 'dart:async' as async;
+f() async {
+  return new async.Future.value(0);
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_async_used_as_identifier_in_setter_name() {
+    Source source = addSource('''
+class C {
+  void set async(int i) {}
+}
+f() async {
+  new C().async = 1;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_async_used_as_identifier_in_statement_label() {
+    Source source = addSource('''
+f() async {
+  async: g();
+}
+g() {}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_async_used_as_identifier_in_string_interpolation() {
+    Source source = addSource(r'''
+int async = 1;
+f() async {
+  return "$async";
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_async_used_as_identifier_in_suffix() {
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+int async;
+''');
+    Source source = addSource('''
+import 'lib1.dart' as l;
+f() async {
+  return l.async;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_async_used_as_identifier_in_switch_label() {
+    Source source = addSource('''
+f() async {
+  switch (0) {
+    async: case 0: break;
+  }
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_async_used_as_identifier_in_sync_star_method() {
+    Source source = addSource('''
+f() sync* {
+  var async = 1;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_asyncForInWrongContext() {
+    Source source = addSource(r'''
+f(list) {
+  await for (var e in list) {
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.ASYNC_FOR_IN_WRONG_CONTEXT]);
+    verify([source]);
+  }
+
+  void test_await_used_as_identifier_in_async_method() {
+    Source source = addSource('''
+f() async {
+  var await = 1;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_await_used_as_identifier_in_async_star_method() {
+    Source source = addSource('''
+f() async* {
+  var await = 1;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_await_used_as_identifier_in_sync_star_method() {
+    Source source = addSource('''
+f() sync* {
+  var await = 1;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_bug_23176() {
+    Source source = addSource('''
+class A {
+  const A([x]);
+}
+class B {
+  dynamic @A(const A()) x;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      ParserErrorCode.EXPECTED_CLASS_MEMBER,
+      ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE
+    ]);
+    verify([source]);
+  }
+
+  void test_builtInIdentifierAsMixinName_classTypeAlias() {
+    Source source = addSource(r'''
+class A {}
+class B {}
+class as = A with B;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]);
+    verify([source]);
+  }
+
+  void test_builtInIdentifierAsType_formalParameter_field() {
+    Source source = addSource(r'''
+class A {
+  var x;
+  A(static this.x);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
+    verify([source]);
+  }
+
+  void test_builtInIdentifierAsType_formalParameter_simple() {
+    Source source = addSource(r'''
+f(static x) {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
+    verify([source]);
+  }
+
+  void test_builtInIdentifierAsType_variableDeclaration() {
+    Source source = addSource(r'''
+f() {
+  typedef x;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
+    verify([source]);
+  }
+
+  void test_builtInIdentifierAsTypedefName_functionTypeAlias() {
+    Source source = addSource("typedef bool as();");
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]);
+    verify([source]);
+  }
+
+  void test_builtInIdentifierAsTypeName() {
+    Source source = addSource("class as {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME]);
+    verify([source]);
+  }
+
+  void test_builtInIdentifierAsTypeParameterName() {
+    Source source = addSource("class A<as> {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME]);
+    verify([source]);
+  }
+
+  void test_caseExpressionTypeImplementsEquals() {
+    Source source = addSource(r'''
+class IntWrapper {
+  final int value;
+  const IntWrapper(this.value);
+  bool operator ==(IntWrapper x) {
+    return value == x.value;
+  }
+  get hashCode => value;
+}
+
+f(var a) {
+  switch(a) {
+    case(const IntWrapper(1)) : return 1;
+    default: return 0;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
+    verify([source]);
+  }
+
+  void test_conflictingConstructorNameAndMember_field() {
+    Source source = addSource(r'''
+class A {
+  int x;
+  A.x() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD]);
+    verify([source]);
+  }
+
+  void test_conflictingConstructorNameAndMember_method() {
+    Source source = addSource(r'''
+class A {
+  const A.x();
+  void x() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD]);
+    verify([source]);
+  }
+
+  void test_conflictingGetterAndMethod_field_method() {
+    Source source = addSource(r'''
+class A {
+  final int m = 0;
+}
+class B extends A {
+  m() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD]);
+    verify([source]);
+  }
+
+  void test_conflictingGetterAndMethod_getter_method() {
+    Source source = addSource(r'''
+class A {
+  get m => 0;
+}
+class B extends A {
+  m() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD]);
+    verify([source]);
+  }
+
+  void test_conflictingGetterAndMethod_method_field() {
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+class B extends A {
+  int m;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER]);
+    verify([source]);
+  }
+
+  void test_conflictingGetterAndMethod_method_getter() {
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+class B extends A {
+  get m => 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER]);
+    verify([source]);
+  }
+
+  void test_conflictingTypeVariableAndClass() {
+    Source source = addSource(r'''
+class T<T> {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS]);
+    verify([source]);
+  }
+
+  void test_conflictingTypeVariableAndMember_field() {
+    Source source = addSource(r'''
+class A<T> {
+  var T;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
+    verify([source]);
+  }
+
+  void test_conflictingTypeVariableAndMember_getter() {
+    Source source = addSource(r'''
+class A<T> {
+  get T => null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
+    verify([source]);
+  }
+
+  void test_conflictingTypeVariableAndMember_method() {
+    Source source = addSource(r'''
+class A<T> {
+  T() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
+    verify([source]);
+  }
+
+  void test_conflictingTypeVariableAndMember_method_static() {
+    Source source = addSource(r'''
+class A<T> {
+  static T() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
+    verify([source]);
+  }
+
+  void test_conflictingTypeVariableAndMember_setter() {
+    Source source = addSource(r'''
+class A<T> {
+  set T(x) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
+    verify([source]);
+  }
+
+  void test_consistentCaseExpressionTypes_dynamic() {
+    // Even though A.S and S have a static type of "dynamic", we should see
+    // that they match 'abc', because they are constant strings.
+    Source source = addSource(r'''
+class A {
+  static const S = 'A.S';
+}
+
+const S = 'S';
+
+foo(var p) {
+  switch (p) {
+    case S:
+      break;
+    case A.S:
+      break;
+    case 'abc':
+      break;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constConstructorWithFieldInitializedByNonConst() {
+    Source source = addSource(r'''
+class A {
+  final int i = f();
+  const A();
+}
+int f() {
+  return 3;
+}''');
+    computeLibrarySourceErrors(source);
+    // TODO(paulberry): the error CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE is
+    // redundant and ought to be suppressed.
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST,
+      CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+    ]);
+    verify([source]);
+  }
+
+  void test_constConstructorWithFieldInitializedByNonConst_static() {
+    Source source = addSource(r'''
+class A {
+  static final int i = f();
+  const A();
+}
+int f() {
+  return 3;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constConstructorWithMixin() {
+    Source source = addSource(r'''
+class M {
+}
+class A extends Object with M {
+  const A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN]);
+    verify([source]);
+  }
+
+  void test_constConstructorWithNonConstSuper_explicit() {
+    Source source = addSource(r'''
+class A {
+  A();
+}
+class B extends A {
+  const B(): super();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER]);
+    verify([source]);
+  }
+
+  void test_constConstructorWithNonConstSuper_implicit() {
+    Source source = addSource(r'''
+class A {
+  A();
+}
+class B extends A {
+  const B();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER]);
+    verify([source]);
+  }
+
+  void test_constConstructorWithNonFinalField_mixin() {
+    Source source = addSource(r'''
+class A {
+  var a;
+}
+class B extends Object with A {
+  const B();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN,
+      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD
+    ]);
+    verify([source]);
+  }
+
+  void test_constConstructorWithNonFinalField_super() {
+    Source source = addSource(r'''
+class A {
+  var a;
+}
+class B extends A {
+  const B();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
+      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER
+    ]);
+    verify([source]);
+  }
+
+  void test_constConstructorWithNonFinalField_this() {
+    Source source = addSource(r'''
+class A {
+  int x;
+  const A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD]);
+    verify([source]);
+  }
+
+  void test_constDeferredClass() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {
+  const A();
+}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+main() {
+  const a.A();
+}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.CONST_DEFERRED_CLASS
+    ]);
+  }
+
+  void test_constDeferredClass_namedConstructor() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {
+  const A.b();
+}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+main() {
+  const a.A.b();
+}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.CONST_DEFERRED_CLASS
+    ]);
+  }
+
+  void test_constEval_newInstance_constConstructor() {
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+const a = new A();''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
+    verify([source]);
+  }
+
+  void test_constEval_newInstance_externalFactoryConstConstructor() {
+    // We can't evaluate "const A()" because its constructor is external.  But
+    // the code is correct--we shouldn't report an error.
+    Source source = addSource(r'''
+class A {
+  external factory const A();
+}
+const x = const A();''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constEval_propertyExtraction_targetNotConst() {
+    Source source = addSource(r'''
+class A {
+  const A();
+  m() {}
+}
+final a = const A();
+const C = a.m;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
+    verify([source]);
+  }
+
+  void test_constEvalThrowsException_binaryMinus_null() {
+    _check_constEvalThrowsException_binary_null("null - 5", false);
+    _check_constEvalThrowsException_binary_null("5 - null", true);
+  }
+
+  void test_constEvalThrowsException_binaryPlus_null() {
+    _check_constEvalThrowsException_binary_null("null + 5", false);
+    _check_constEvalThrowsException_binary_null("5 + null", true);
+  }
+
+  void test_constEvalThrowsException_divisionByZero() {
+    Source source = addSource("const C = 1 ~/ 0;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE]);
+    verify([source]);
+  }
+
+  void test_constEvalThrowsException_finalAlreadySet_initializer() {
+    // If a final variable has an initializer at the site of its declaration,
+    // and at the site of the constructor, then invoking that constructor would
+    // produce a runtime error; hence invoking that constructor via the "const"
+    // keyword results in a compile-time error.
+    Source source = addSource('''
+class C {
+  final x = 1;
+  const C() : x = 2;
+}
+var x = const C();
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
+      StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION
+    ]);
+    verify([source]);
+  }
+
+  void test_constEvalThrowsException_finalAlreadySet_initializing_formal() {
+    // If a final variable has an initializer at the site of its declaration,
+    // and it is initialized using an initializing formal at the site of the
+    // constructor, then invoking that constructor would produce a runtime
+    // error; hence invoking that constructor via the "const" keyword results
+    // in a compile-time error.
+    Source source = addSource('''
+class C {
+  final x = 1;
+  const C(this.x);
+}
+var x = const C(2);
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
+      StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR
+    ]);
+    verify([source]);
+  }
+
+  void test_constEvalThrowsException_unaryBitNot_null() {
+    Source source = addSource("const C = ~null;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+    // no verify(), '~null' is not resolved
+  }
+
+  void test_constEvalThrowsException_unaryNegated_null() {
+    Source source = addSource("const C = -null;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+    // no verify(), '-null' is not resolved
+  }
+
+  void test_constEvalThrowsException_unaryNot_null() {
+    Source source = addSource("const C = !null;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+    verify([source]);
+  }
+
+  void test_constEvalTypeBool_binary() {
+    _check_constEvalTypeBool_withParameter_binary("p && ''");
+    _check_constEvalTypeBool_withParameter_binary("p || ''");
+  }
+
+  void test_constEvalTypeBool_binary_leftTrue() {
+    Source source = addSource("const C = (true || 0);");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL,
+      StaticTypeWarningCode.NON_BOOL_OPERAND,
+      HintCode.DEAD_CODE
+    ]);
+    verify([source]);
+  }
+
+  void test_constEvalTypeBoolNumString_equal() {
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+class B {
+  final a;
+  const B(num p) : a = p == const A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING]);
+    verify([source]);
+  }
+
+  void test_constEvalTypeBoolNumString_notEqual() {
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+class B {
+  final a;
+  const B(String p) : a = p != const A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING]);
+    verify([source]);
+  }
+
+  void test_constEvalTypeInt_binary() {
+    _check_constEvalTypeInt_withParameter_binary("p ^ ''");
+    _check_constEvalTypeInt_withParameter_binary("p & ''");
+    _check_constEvalTypeInt_withParameter_binary("p | ''");
+    _check_constEvalTypeInt_withParameter_binary("p >> ''");
+    _check_constEvalTypeInt_withParameter_binary("p << ''");
+  }
+
+  void test_constEvalTypeNum_binary() {
+    _check_constEvalTypeNum_withParameter_binary("p + ''");
+    _check_constEvalTypeNum_withParameter_binary("p - ''");
+    _check_constEvalTypeNum_withParameter_binary("p * ''");
+    _check_constEvalTypeNum_withParameter_binary("p / ''");
+    _check_constEvalTypeNum_withParameter_binary("p ~/ ''");
+    _check_constEvalTypeNum_withParameter_binary("p > ''");
+    _check_constEvalTypeNum_withParameter_binary("p < ''");
+    _check_constEvalTypeNum_withParameter_binary("p >= ''");
+    _check_constEvalTypeNum_withParameter_binary("p <= ''");
+    _check_constEvalTypeNum_withParameter_binary("p % ''");
+  }
+
+  void test_constFormalParameter_fieldFormalParameter() {
+    Source source = addSource(r'''
+class A {
+  var x;
+  A(const this.x) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_FORMAL_PARAMETER]);
+    verify([source]);
+  }
+
+  void test_constFormalParameter_simpleFormalParameter() {
+    Source source = addSource("f(const x) {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_FORMAL_PARAMETER]);
+    verify([source]);
+  }
+
+  void test_constInitializedWithNonConstValue() {
+    Source source = addSource(r'''
+f(p) {
+  const C = p;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
+    verify([source]);
+  }
+
+  void test_constInitializedWithNonConstValue_missingConstInListLiteral() {
+    Source source = addSource("const List L = [0];");
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
+    verify([source]);
+  }
+
+  void test_constInitializedWithNonConstValue_missingConstInMapLiteral() {
+    Source source = addSource("const Map M = {'a' : 0};");
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
+    verify([source]);
+  }
+
+  void test_constInitializedWithNonConstValueFromDeferredClass() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+const V = 1;''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+const B = a.V;'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+
+  void test_constInitializedWithNonConstValueFromDeferredClass_nested() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+const V = 1;''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+const B = a.V + 1;'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+
+  void test_constInstanceField() {
+    Source source = addSource(r'''
+class C {
+  const int f = 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_INSTANCE_FIELD]);
+    verify([source]);
+  }
+
+  void test_constMapKeyTypeImplementsEquals_direct() {
+    Source source = addSource(r'''
+class A {
+  const A();
+  operator ==(other) => false;
+}
+main() {
+  const {const A() : 0};
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
+    verify([source]);
+  }
+
+  void test_constMapKeyTypeImplementsEquals_dynamic() {
+    // Note: static type of B.a is "dynamic", but actual type of the const
+    // object is A.  We need to make sure we examine the actual type when
+    // deciding whether there is a problem with operator==.
+    Source source = addSource(r'''
+class A {
+  const A();
+  operator ==(other) => false;
+}
+class B {
+  static const a = const A();
+}
+main() {
+  const {B.a : 0};
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
+    verify([source]);
+  }
+
+  void test_constMapKeyTypeImplementsEquals_factory() {
+    Source source = addSource(r'''
+class A { const factory A() = B; }
+
+class B implements A {
+  const B();
+
+  operator ==(o) => true;
+}
+
+main() {
+  var m = const { const A(): 42 };
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
+    verify([source]);
+  }
+
+  void test_constMapKeyTypeImplementsEquals_super() {
+    Source source = addSource(r'''
+class A {
+  const A();
+  operator ==(other) => false;
+}
+class B extends A {
+  const B();
+}
+main() {
+  const {const B() : 0};
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
+    verify([source]);
+  }
+
+  void test_constWithInvalidTypeParameters() {
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+f() { return const A<A>(); }''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS]);
+    verify([source]);
+  }
+
+  void test_constWithInvalidTypeParameters_tooFew() {
+    Source source = addSource(r'''
+class A {}
+class C<K, V> {
+  const C();
+}
+f(p) {
+  return const C<A>();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS]);
+    verify([source]);
+  }
+
+  void test_constWithInvalidTypeParameters_tooMany() {
+    Source source = addSource(r'''
+class A {}
+class C<E> {
+  const C();
+}
+f(p) {
+  return const C<A, A>();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS]);
+    verify([source]);
+  }
+
+  void test_constWithNonConst() {
+    Source source = addSource(r'''
+class T {
+  T(a, b, {c, d}) {}
+}
+f() { return const T(0, 1, c: 2, d: 3); }''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_NON_CONST]);
+    verify([source]);
+  }
+
+  void test_constWithNonConstantArgument_annotation() {
+    Source source = addSource(r'''
+class A {
+  const A(int p);
+}
+var v = 42;
+@A(v)
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT]);
+    verify([source]);
+  }
+
+  void test_constWithNonConstantArgument_instanceCreation() {
+    Source source = addSource(r'''
+class A {
+  const A(a);
+}
+f(p) { return const A(p); }''');
+    computeLibrarySourceErrors(source);
+    // TODO(paulberry): the error INVALID_CONSTAT is redundant and ought to be
+    // suppressed.
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT,
+      CompileTimeErrorCode.INVALID_CONSTANT
+    ]);
+    verify([source]);
+  }
+
+  void test_constWithNonType() {
+    Source source = addSource(r'''
+int A;
+f() {
+  return const A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_WITH_NON_TYPE]);
+    verify([source]);
+  }
+
+  void test_constWithNonType_fromLibrary() {
+    Source source1 = addNamedSource("/lib.dart", "");
+    Source source2 = addNamedSource(
+        "/lib2.dart",
+        r'''
+import 'lib.dart' as lib;
+void f() {
+  const lib.A();
+}''');
+    computeLibrarySourceErrors(source1);
+    computeLibrarySourceErrors(source2);
+    assertErrors(source2, [CompileTimeErrorCode.CONST_WITH_NON_TYPE]);
+    verify([source1]);
+  }
+
+  void test_constWithTypeParameters_direct() {
+    Source source = addSource(r'''
+class A<T> {
+  static const V = const A<T>();
+  const A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS,
+      StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC
+    ]);
+    verify([source]);
+  }
+
+  void test_constWithTypeParameters_indirect() {
+    Source source = addSource(r'''
+class A<T> {
+  static const V = const A<List<T>>();
+  const A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS,
+      StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC
+    ]);
+    verify([source]);
+  }
+
+  void test_constWithUndefinedConstructor() {
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+f() {
+  return const A.noSuchConstructor();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR]);
+    // no verify(), 'noSuchConstructor' is not resolved
+  }
+
+  void test_constWithUndefinedConstructorDefault() {
+    Source source = addSource(r'''
+class A {
+  const A.name();
+}
+f() {
+  return const A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT]);
+    verify([source]);
+  }
+
+  void test_defaultValueInFunctionTypeAlias() {
+    Source source = addSource("typedef F([x = 0]);");
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS]);
+    verify([source]);
+  }
+
+  void test_defaultValueInFunctionTypedParameter_named() {
+    Source source = addSource("f(g({p: null})) {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER]);
+    verify([source]);
+  }
+
+  void test_defaultValueInFunctionTypedParameter_optional() {
+    Source source = addSource("f(g([p = null])) {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER]);
+    verify([source]);
+  }
+
+  void test_defaultValueInRedirectingFactoryConstructor() {
+    Source source = addSource(r'''
+class A {
+  factory A([int x = 0]) = B;
+}
+
+class B implements A {
+  B([int x = 1]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR
+    ]);
+    verify([source]);
+  }
+
+  void test_duplicateConstructorName_named() {
+    Source source = addSource(r'''
+class A {
+  A.a() {}
+  A.a() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME,
+      CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME
+    ]);
+    verify([source]);
+  }
+
+  void test_duplicateConstructorName_unnamed() {
+    Source source = addSource(r'''
+class A {
+  A() {}
+  A() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT,
+      CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT
+    ]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_acrossLibraries() {
+    Source librarySource = addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+
+part 'a.dart';
+part 'b.dart';''');
+    Source sourceA = addNamedSource(
+        "/a.dart",
+        r'''
+part of lib;
+
+class A {}''');
+    Source sourceB = addNamedSource(
+        "/b.dart",
+        r'''
+part of lib;
+
+class A {}''');
+    computeLibrarySourceErrors(librarySource);
+    assertErrors(sourceB, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([librarySource, sourceA, sourceB]);
+  }
+
+  void test_duplicateDefinition_catch() {
+    Source source = addSource(r'''
+main() {
+  try {} catch (e, e) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_classMembers_fields() {
+    Source source = addSource(r'''
+class A {
+  int a;
+  int a;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_classMembers_fields_oneStatic() {
+    Source source = addSource(r'''
+class A {
+  int x;
+  static int x;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_classMembers_methods() {
+    Source source = addSource(r'''
+class A {
+  m() {}
+  m() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_locals_inCase() {
+    Source source = addSource(r'''
+main() {
+  switch(1) {
+    case 1:
+      var a;
+      var a;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_locals_inFunctionBlock() {
+    Source source = addSource(r'''
+main() {
+  int m = 0;
+  m(a) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_locals_inIf() {
+    Source source = addSource(r'''
+main(int p) {
+  if (p != 0) {
+    var a;
+    var a;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_locals_inMethodBlock() {
+    Source source = addSource(r'''
+class A {
+  m() {
+    int a;
+    int a;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_parameters_inFunctionTypeAlias() {
+    Source source = addSource(r'''
+typedef F(int a, double a);
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_parameters_inLocalFunction() {
+    Source source = addSource(r'''
+main() {
+  f(int a, double a) {
+  };
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_parameters_inMethod() {
+    Source source = addSource(r'''
+class A {
+  m(int a, double a) {
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_parameters_inTopLevelFunction() {
+    Source source = addSource(r'''
+f(int a, double a) {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_typeParameters() {
+    Source source = addSource(r'''
+class A<T, T> {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinitionInheritance_instanceGetter_staticGetter() {
+    Source source = addSource(r'''
+class A {
+  int get x => 0;
+}
+class B extends A {
+  static int get x => 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinitionInheritance_instanceGetterAbstract_staticGetter() {
+    Source source = addSource(r'''
+abstract class A {
+  int get x;
+}
+class B extends A {
+  static int get x => 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinitionInheritance_instanceMethod_staticMethod() {
+    Source source = addSource(r'''
+class A {
+  x() {}
+}
+class B extends A {
+  static x() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinitionInheritance_instanceMethodAbstract_staticMethod() {
+    Source source = addSource(r'''
+abstract class A {
+  x();
+}
+abstract class B extends A {
+  static x() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinitionInheritance_instanceSetter_staticSetter() {
+    Source source = addSource(r'''
+class A {
+  set x(value) {}
+}
+class B extends A {
+  static set x(value) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_duplicateDefinitionInheritance_instanceSetterAbstract_staticSetter() {
+    Source source = addSource(r'''
+abstract class A {
+  set x(value);
+}
+class B extends A {
+  static set x(value) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_duplicateNamedArgument() {
+    Source source = addSource(r'''
+f({a, b}) {}
+main() {
+  f(a: 1, a: 2);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT]);
+    verify([source]);
+  }
+
+  void test_exportInternalLibrary() {
+    Source source = addSource("export 'dart:_interceptors';");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_exportOfNonLibrary() {
+    Source source = addSource(r'''
+library L;
+export 'lib1.dart';''');
+    addNamedSource("/lib1.dart", "part of lib;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_extendsDeferredClass() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+class B extends a.A {}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS
+    ]);
+  }
+
+  void test_extendsDeferredClass_classTypeAlias() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+class M {}
+class C = a.A with M;'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS
+    ]);
+  }
+
+  void test_extendsDisallowedClass_class_bool() {
+    Source source = addSource("class A extends bool {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+      CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+    ]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_class_double() {
+    Source source = addSource("class A extends double {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+      CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+    ]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_class_int() {
+    Source source = addSource("class A extends int {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+      CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+    ]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_class_Null() {
+    Source source = addSource("class A extends Null {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+      CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+    ]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_class_num() {
+    Source source = addSource("class A extends num {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+      CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+    ]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_class_String() {
+    Source source = addSource("class A extends String {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
+      CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+    ]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_classTypeAlias_bool() {
+    Source source = addSource(r'''
+class M {}
+class C = bool with M;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_classTypeAlias_double() {
+    Source source = addSource(r'''
+class M {}
+class C = double with M;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_classTypeAlias_int() {
+    Source source = addSource(r'''
+class M {}
+class C = int with M;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_classTypeAlias_Null() {
+    Source source = addSource(r'''
+class M {}
+class C = Null with M;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_classTypeAlias_num() {
+    Source source = addSource(r'''
+class M {}
+class C = num with M;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_extendsDisallowedClass_classTypeAlias_String() {
+    Source source = addSource(r'''
+class M {}
+class C = String with M;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_extendsEnum() {
+    Source source = addSource(r'''
+enum E { ONE }
+class A extends E {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_ENUM]);
+    verify([source]);
+  }
+
+  void test_extendsNonClass_class() {
+    Source source = addSource(r'''
+int A;
+class B extends A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_NON_CLASS]);
+    verify([source]);
+  }
+
+  void test_extendsNonClass_dynamic() {
+    Source source = addSource("class B extends dynamic {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_NON_CLASS]);
+    verify([source]);
+  }
+
+  void test_extraPositionalArguments_const() {
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+main() {
+  const A(0);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_extraPositionalArguments_const_super() {
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+class B extends A {
+  const B() : super(0);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_fieldInitializedByMultipleInitializers() {
+    Source source = addSource(r'''
+class A {
+  int x;
+  A() : x = 0, x = 1 {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
+    verify([source]);
+  }
+
+  void test_fieldInitializedByMultipleInitializers_multipleInits() {
+    Source source = addSource(r'''
+class A {
+  int x;
+  A() : x = 0, x = 1, x = 2 {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
+      CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS
+    ]);
+    verify([source]);
+  }
+
+  void test_fieldInitializedByMultipleInitializers_multipleNames() {
+    Source source = addSource(r'''
+class A {
+  int x;
+  int y;
+  A() : x = 0, x = 1, y = 0, y = 1 {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
+      CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS
+    ]);
+    verify([source]);
+  }
+
+  void test_fieldInitializedInParameterAndInitializer() {
+    Source source = addSource(r'''
+class A {
+  int x;
+  A(this.x) : x = 1 {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_fieldInitializerFactoryConstructor() {
+    Source source = addSource(r'''
+class A {
+  int x;
+  factory A(this.x) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_fieldInitializerOutsideConstructor() {
+    // TODO(brianwilkerson) Fix the duplicate error messages.
+    Source source = addSource(r'''
+class A {
+  int x;
+  m(this.x) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
+      CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR
+    ]);
+    verify([source]);
+  }
+
+  void test_fieldInitializerOutsideConstructor_defaultParameter() {
+    Source source = addSource(r'''
+class A {
+  int x;
+  m([this.x]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_fieldInitializerRedirectingConstructor_afterRedirection() {
+    Source source = addSource(r'''
+class A {
+  int x;
+  A.named() {}
+  A() : this.named(), x = 42;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_fieldInitializerRedirectingConstructor_beforeRedirection() {
+    Source source = addSource(r'''
+class A {
+  int x;
+  A.named() {}
+  A() : x = 42, this.named();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_fieldInitializingFormalRedirectingConstructor() {
+    Source source = addSource(r'''
+class A {
+  int x;
+  A.named() {}
+  A(this.x) : this.named();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_finalInitializedMultipleTimes_initializers() {
+    Source source = addSource(r'''
+class A {
+  final x;
+  A() : x = 0, x = 0 {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
+    verify([source]);
+  }
+
+  /**
+   * This test doesn't test the FINAL_INITIALIZED_MULTIPLE_TIMES code, but tests the
+   * FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER code instead. It is provided here to show
+   * coverage over all of the permutations of initializers in constructor declarations.
+   *
+   * Note: FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER covers a subset of
+   * FINAL_INITIALIZED_MULTIPLE_TIMES, since it more specific, we use it instead of the broader code
+   */
+  void test_finalInitializedMultipleTimes_initializingFormal_initializer() {
+    Source source = addSource(r'''
+class A {
+  final x;
+  A(this.x) : x = 0 {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_finalInitializedMultipleTimes_initializingFormals() {
+    Source source = addSource(r'''
+class A {
+  final x;
+  A(this.x, this.x) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES]);
+    verify([source]);
+  }
+
+  void test_finalNotInitialized_instanceField_const_static() {
+    Source source = addSource(r'''
+class A {
+  static const F;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_NOT_INITIALIZED]);
+    verify([source]);
+  }
+
+  void test_finalNotInitialized_library_const() {
+    Source source = addSource("const F;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_NOT_INITIALIZED]);
+    verify([source]);
+  }
+
+  void test_finalNotInitialized_local_const() {
+    Source source = addSource(r'''
+f() {
+  const int x;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_NOT_INITIALIZED]);
+    verify([source]);
+  }
+
+  void test_fromEnvironment_bool_badArgs() {
+    Source source = addSource(r'''
+var b1 = const bool.fromEnvironment(1);
+var b2 = const bool.fromEnvironment('x', defaultValue: 1);''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
+      StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
+      CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
+      StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    ]);
+    verify([source]);
+  }
+
+  void test_fromEnvironment_bool_badDefault_whenDefined() {
+    // The type of the defaultValue needs to be correct even when the default
+    // value isn't used (because the variable is defined in the environment).
+    analysisContext2.declaredVariables.define("x", "true");
+    Source source =
+        addSource("var b = const bool.fromEnvironment('x', defaultValue: 1);");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
+      StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    ]);
+    verify([source]);
+  }
+
+  void test_getterAndMethodWithSameName() {
+    Source source = addSource(r'''
+class A {
+  x(y) {}
+  get x => 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME]);
+    verify([source]);
+  }
+
+  void test_implementsDeferredClass() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+class B implements a.A {}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS
+    ]);
+  }
+
+  void test_implementsDeferredClass_classTypeAlias() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+class B {}
+class M {}
+class C = B with M implements a.A;'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS
+    ]);
+  }
+
+  void test_implementsDisallowedClass_class_bool() {
+    Source source = addSource("class A implements bool {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_class_double() {
+    Source source = addSource("class A implements double {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_class_int() {
+    Source source = addSource("class A implements int {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_class_Null() {
+    Source source = addSource("class A implements Null {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_class_num() {
+    Source source = addSource("class A implements num {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_class_String() {
+    Source source = addSource("class A implements String {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_class_String_num() {
+    Source source = addSource("class A implements String, num {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
+      CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
+    ]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_classTypeAlias_bool() {
+    Source source = addSource(r'''
+class A {}
+class M {}
+class C = A with M implements bool;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_classTypeAlias_double() {
+    Source source = addSource(r'''
+class A {}
+class M {}
+class C = A with M implements double;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_classTypeAlias_int() {
+    Source source = addSource(r'''
+class A {}
+class M {}
+class C = A with M implements int;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_classTypeAlias_Null() {
+    Source source = addSource(r'''
+class A {}
+class M {}
+class C = A with M implements Null;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_classTypeAlias_num() {
+    Source source = addSource(r'''
+class A {}
+class M {}
+class C = A with M implements num;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_classTypeAlias_String() {
+    Source source = addSource(r'''
+class A {}
+class M {}
+class C = A with M implements String;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsDisallowedClass_classTypeAlias_String_num() {
+    Source source = addSource(r'''
+class A {}
+class M {}
+class C = A with M implements String, num;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
+      CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS
+    ]);
+    verify([source]);
+  }
+
+  void test_implementsDynamic() {
+    Source source = addSource("class A implements dynamic {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DYNAMIC]);
+    verify([source]);
+  }
+
+  void test_implementsEnum() {
+    Source source = addSource(r'''
+enum E { ONE }
+class A implements E {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_ENUM]);
+    verify([source]);
+  }
+
+  void test_implementsNonClass_class() {
+    Source source = addSource(r'''
+int A;
+class B implements A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_NON_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsNonClass_typeAlias() {
+    Source source = addSource(r'''
+class A {}
+class M {}
+int B;
+class C = A with M implements B;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_NON_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsRepeated() {
+    Source source = addSource(r'''
+class A {}
+class B implements A, A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_REPEATED]);
+    verify([source]);
+  }
+
+  void test_implementsRepeated_3times() {
+    Source source = addSource(r'''
+class A {} class C{}
+class B implements A, A, A, A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.IMPLEMENTS_REPEATED,
+      CompileTimeErrorCode.IMPLEMENTS_REPEATED,
+      CompileTimeErrorCode.IMPLEMENTS_REPEATED
+    ]);
+    verify([source]);
+  }
+
+  void test_implementsSuperClass() {
+    Source source = addSource(r'''
+class A {}
+class B extends A implements A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS]);
+    verify([source]);
+  }
+
+  void test_implementsSuperClass_Object() {
+    Source source = addSource("class A implements Object {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS]);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_field() {
+    Source source = addSource(r'''
+class A {
+  var v;
+  A() : v = f;
+  var f;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_field2() {
+    Source source = addSource(r'''
+class A {
+  final x = 0;
+  final y = x;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_invocation() {
+    Source source = addSource(r'''
+class A {
+  var v;
+  A() : v = f();
+  f() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_invocationInStatic() {
+    Source source = addSource(r'''
+class A {
+  static var F = m();
+  m() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_redirectingConstructorInvocation() {
+    Source source = addSource(r'''
+class A {
+  A(p) {}
+  A.named() : this(f);
+  var f;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_superConstructorInvocation() {
+    Source source = addSource(r'''
+class A {
+  A(p) {}
+}
+class B extends A {
+  B() : super(f);
+  var f;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_importInternalLibrary() {
+    Source source = addSource("import 'dart:_interceptors';");
+    computeLibrarySourceErrors(source);
+    // Note, in these error cases we may generate an UNUSED_IMPORT hint, while
+    // we could prevent the hint from being generated by testing the import
+    // directive for the error, this is such a minor corner case that we don't
+    // think we should add the additional computation time to figure out such
+    // cases.
+    assertErrors(source,
+        [CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY, HintCode.UNUSED_IMPORT]);
+    verify([source]);
+  }
+
+  void test_importInternalLibrary_js_helper() {
+    Source source = addSource("import 'dart:_js_helper';");
+    computeLibrarySourceErrors(source);
+    // Note, in these error cases we may generate an UNUSED_IMPORT hint, while
+    // we could prevent the hint from being generated by testing the import
+    // directive for the error, this is such a minor corner case that we don't
+    // think we should add the additional computation time to figure out such
+    // cases.
+    assertErrors(source,
+        [CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY, HintCode.UNUSED_IMPORT]);
+    verify([source]);
+  }
+
+  void test_importOfNonLibrary() {
+    Source source = addSource(r'''
+library lib;
+import 'part.dart';
+A a;''');
+    addNamedSource(
+        "/part.dart",
+        r'''
+part of lib;
+class A{}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_inconsistentCaseExpressionTypes() {
+    Source source = addSource(r'''
+f(var p) {
+  switch (p) {
+    case 1:
+      break;
+    case 'a':
+      break;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES]);
+    verify([source]);
+  }
+
+  void test_inconsistentCaseExpressionTypes_dynamic() {
+    // Even though A.S and S have a static type of "dynamic", we should see
+    // that they fail to match 3, because they are constant strings.
+    Source source = addSource(r'''
+class A {
+  static const S = 'A.S';
+}
+
+const S = 'S';
+
+foo(var p) {
+  switch (p) {
+    case 3:
+      break;
+    case S:
+      break;
+    case A.S:
+      break;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES,
+      CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES
+    ]);
+    verify([source]);
+  }
+
+  void test_inconsistentCaseExpressionTypes_repeated() {
+    Source source = addSource(r'''
+f(var p) {
+  switch (p) {
+    case 1:
+      break;
+    case 'a':
+      break;
+    case 'b':
+      break;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES,
+      CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES
+    ]);
+    verify([source]);
+  }
+
+  void test_initializerForNonExistent_const() {
+    // Check that the absence of a matching field doesn't cause a
+    // crash during constant evaluation.
+    Source source = addSource(r'''
+class A {
+  const A() : x = 'foo';
+}
+A a = const A();''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD]);
+  }
+
+  void test_initializerForNonExistent_initializer() {
+    Source source = addSource(r'''
+class A {
+  A() : x = 0 {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD]);
+  }
+
+  void test_initializerForStaticField() {
+    Source source = addSource(r'''
+class A {
+  static int x;
+  A() : x = 0 {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD]);
+    verify([source]);
+  }
+
+  void test_initializingFormalForNonExistentField() {
+    Source source = addSource(r'''
+class A {
+  A(this.x) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD]);
+    verify([source]);
+  }
+
+  void test_initializingFormalForNonExistentField_notInEnclosingClass() {
+    Source source = addSource(r'''
+class A {
+int x;
+}
+class B extends A {
+  B(this.x) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD]);
+    verify([source]);
+  }
+
+  void test_initializingFormalForNonExistentField_optional() {
+    Source source = addSource(r'''
+class A {
+  A([this.x]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD]);
+    verify([source]);
+  }
+
+  void test_initializingFormalForNonExistentField_synthetic() {
+    Source source = addSource(r'''
+class A {
+  int get x => 1;
+  A(this.x) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD]);
+    verify([source]);
+  }
+
+  void test_initializingFormalForStaticField() {
+    Source source = addSource(r'''
+class A {
+  static int x;
+  A([this.x]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD]);
+    verify([source]);
+  }
+
+  void test_instanceMemberAccessFromFactory_named() {
+    Source source = addSource(r'''
+class A {
+  m() {}
+  A();
+  factory A.make() {
+    m();
+    return new A();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY]);
+    verify([source]);
+  }
+
+  void test_instanceMemberAccessFromFactory_unnamed() {
+    Source source = addSource(r'''
+class A {
+  m() {}
+  A._();
+  factory A() {
+    m();
+    return new A._();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY]);
+    verify([source]);
+  }
+
+  void test_instanceMemberAccessFromStatic_field() {
+    Source source = addSource(r'''
+class A {
+  int f;
+  static foo() {
+    f;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC]);
+    verify([source]);
+  }
+
+  void test_instanceMemberAccessFromStatic_getter() {
+    Source source = addSource(r'''
+class A {
+  get g => null;
+  static foo() {
+    g;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC]);
+    verify([source]);
+  }
+
+  void test_instanceMemberAccessFromStatic_method() {
+    Source source = addSource(r'''
+class A {
+  m() {}
+  static foo() {
+    m();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC]);
+    verify([source]);
+  }
+
+  void test_instantiateEnum_const() {
+    Source source = addSource(r'''
+enum E { ONE }
+E e(String name) {
+  return const E();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INSTANTIATE_ENUM]);
+    verify([source]);
+  }
+
+  void test_instantiateEnum_new() {
+    Source source = addSource(r'''
+enum E { ONE }
+E e(String name) {
+  return new E();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INSTANTIATE_ENUM]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_getter() {
+    Source source = addSource(r'''
+get V => 0;
+@V
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_importWithPrefix_getter() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+get V => 0;''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+@p.V
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_importWithPrefix_notConstantVariable() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+final V = 0;''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+@p.V
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_importWithPrefix_notVariableOrConstructorInvocation() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+typedef V();''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+@p.V
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_notConstantVariable() {
+    Source source = addSource(r'''
+final V = 0;
+@V
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_notVariableOrConstructorInvocation() {
+    Source source = addSource(r'''
+typedef V();
+@V
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_staticMethodReference() {
+    Source source = addSource(r'''
+class A {
+  static f() {}
+}
+@A.f
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_unresolved_identifier() {
+    Source source = addSource(r'''
+@unresolved
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+  }
+
+  void test_invalidAnnotation_unresolved_invocation() {
+    Source source = addSource(r'''
+@Unresolved()
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+  }
+
+  void test_invalidAnnotation_unresolved_prefixedIdentifier() {
+    Source source = addSource(r'''
+import 'dart:math' as p;
+@p.unresolved
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+  }
+
+  void test_invalidAnnotation_useLibraryScope() {
+    Source source = addSource(r'''
+@foo
+class A {
+  static const foo = null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
+  }
+
+  void test_invalidAnnotationFromDeferredLibrary() {
+    // See test_invalidAnnotation_notConstantVariable
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class V { const V(); }
+const v = const V();''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+@a.v main () {}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+
+  void test_invalidAnnotationFromDeferredLibrary_constructor() {
+    // See test_invalidAnnotation_notConstantVariable
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class C { const C(); }''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+@a.C() main () {}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+
+  void test_invalidAnnotationFromDeferredLibrary_namedConstructor() {
+    // See test_invalidAnnotation_notConstantVariable
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class C { const C.name(); }''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+@a.C.name() main () {}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+
+  void test_invalidConstructorName_notEnclosingClassName_defined() {
+    Source source = addSource(r'''
+class A {
+  B() : super();
+}
+class B {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME]);
+    // no verify() call, "B" is not resolved
+  }
+
+  void test_invalidConstructorName_notEnclosingClassName_undefined() {
+    Source source = addSource(r'''
+class A {
+  B() : super();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME]);
+    // no verify() call, "B" is not resolved
+  }
+
+  void test_invalidFactoryNameNotAClass_notClassName() {
+    Source source = addSource(r'''
+int B;
+class A {
+  factory B() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS]);
+    verify([source]);
+  }
+
+  void test_invalidFactoryNameNotAClass_notEnclosingClassName() {
+    Source source = addSource(r'''
+class A {
+  factory B() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS]);
+    // no verify() call, "B" is not resolved
+  }
+
+  void test_invalidModifierOnConstructor_async() {
+    Source source = addSource(r'''
+class A {
+  A() async {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_invalidModifierOnConstructor_asyncStar() {
+    Source source = addSource(r'''
+class A {
+  A() async* {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_invalidModifierOnConstructor_syncStar() {
+    Source source = addSource(r'''
+class A {
+  A() sync* {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_invalidModifierOnSetter_member_async() {
+    Source source = addSource(r'''
+class A {
+  set x(v) async {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER]);
+    verify([source]);
+  }
+
+  void test_invalidModifierOnSetter_member_asyncStar() {
+    Source source = addSource(r'''
+class A {
+  set x(v) async* {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER]);
+    verify([source]);
+  }
+
+  void test_invalidModifierOnSetter_member_syncStar() {
+    Source source = addSource(r'''
+class A {
+  set x(v) sync* {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER]);
+    verify([source]);
+  }
+
+  void test_invalidModifierOnSetter_topLevel_async() {
+    Source source = addSource("set x(v) async {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER]);
+    verify([source]);
+  }
+
+  void test_invalidModifierOnSetter_topLevel_asyncStar() {
+    Source source = addSource("set x(v) async* {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER]);
+    verify([source]);
+  }
+
+  void test_invalidModifierOnSetter_topLevel_syncStar() {
+    Source source = addSource("set x(v) sync* {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER]);
+    verify([source]);
+  }
+
+  void test_invalidReferenceToThis_factoryConstructor() {
+    Source source = addSource(r'''
+class A {
+  factory A() { return this; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+
+  void test_invalidReferenceToThis_instanceVariableInitializer_inConstructor() {
+    Source source = addSource(r'''
+class A {
+  var f;
+  A() : f = this;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+
+  void test_invalidReferenceToThis_instanceVariableInitializer_inDeclaration() {
+    Source source = addSource(r'''
+class A {
+  var f = this;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+
+  void test_invalidReferenceToThis_staticMethod() {
+    Source source = addSource(r'''
+class A {
+  static m() { return this; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+
+  void test_invalidReferenceToThis_staticVariableInitializer() {
+    Source source = addSource(r'''
+class A {
+  static A f = this;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+
+  void test_invalidReferenceToThis_superInitializer() {
+    Source source = addSource(r'''
+class A {
+  A(var x) {}
+}
+class B extends A {
+  B() : super(this);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+
+  void test_invalidReferenceToThis_topLevelFunction() {
+    Source source = addSource("f() { return this; }");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+
+  void test_invalidReferenceToThis_variableInitializer() {
+    Source source = addSource("int x = this;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
+    verify([source]);
+  }
+
+  void test_invalidTypeArgumentInConstList() {
+    Source source = addSource(r'''
+class A<E> {
+  m() {
+    return const <E>[];
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST]);
+    verify([source]);
+  }
+
+  void test_invalidTypeArgumentInConstMap() {
+    Source source = addSource(r'''
+class A<E> {
+  m() {
+    return const <String, E>{};
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP]);
+    verify([source]);
+  }
+
+  void test_invalidUri_export() {
+    Source source = addSource("export 'ht:';");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_URI]);
+  }
+
+  void test_invalidUri_import() {
+    Source source = addSource("import 'ht:';");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_URI]);
+  }
+
+  void test_invalidUri_part() {
+    Source source = addSource(r'''
+library lib;
+part 'ht:';''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.INVALID_URI]);
+  }
+
+  void test_isInConstInstanceCreation_restored() {
+    // If ErrorVerifier._isInConstInstanceCreation is not properly restored on
+    // exit from visitInstanceCreationExpression, the error at (1) will be
+    // treated as a warning rather than an error.
+    Source source = addSource(r'''
+class Foo<T extends num> {
+  const Foo(x, y);
+}
+const x = const Foo<int>(const Foo<int>(0, 1),
+    const <Foo<String>>[]); // (1)
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_isInInstanceVariableInitializer_restored() {
+    // If ErrorVerifier._isInInstanceVariableInitializer is not properly
+    // restored on exit from visitVariableDeclaration, the error at (1)
+    // won't be detected.
+    Source source = addSource(r'''
+class Foo {
+  var bar;
+  Map foo = {
+    'bar': () {
+        var _bar;
+    },
+    'bop': _foo // (1)
+  };
+  _foo() {
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_labelInOuterScope() {
+    Source source = addSource(r'''
+class A {
+  void m(int i) {
+    l: while (i > 0) {
+      void f() {
+        break l;
+      };
+    }
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE]);
+    // We cannot verify resolution with unresolvable labels
+  }
+
+  void test_labelUndefined_break() {
+    Source source = addSource(r'''
+f() {
+  x: while (true) {
+    break y;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.LABEL_UNDEFINED]);
+    // We cannot verify resolution with undefined labels
+  }
+
+  void test_labelUndefined_continue() {
+    Source source = addSource(r'''
+f() {
+  x: while (true) {
+    continue y;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.LABEL_UNDEFINED]);
+    // We cannot verify resolution with undefined labels
+  }
+
+  void test_length_of_erroneous_constant() {
+    // Attempting to compute the length of constant that couldn't be evaluated
+    // (due to an error) should not crash the analyzer (see dartbug.com/23383)
+    Source source = addSource("const int i = (1 ? 'alpha' : 'beta').length;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE,
+      CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL,
+      StaticTypeWarningCode.NON_BOOL_CONDITION
+    ]);
+    verify([source]);
+  }
+
+  void test_memberWithClassName_field() {
+    Source source = addSource(r'''
+class A {
+  int A = 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+    verify([source]);
+  }
+
+  void test_memberWithClassName_field2() {
+    Source source = addSource(r'''
+class A {
+  int z, A, b = 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+    verify([source]);
+  }
+
+  void test_memberWithClassName_getter() {
+    Source source = addSource(r'''
+class A {
+  get A => 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
+    verify([source]);
+  }
+
+  void test_memberWithClassName_method() {
+    // no test because indistinguishable from constructor
+  }
+
+  void test_methodAndGetterWithSameName() {
+    Source source = addSource(r'''
+class A {
+  get x => 0;
+  x(y) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.METHOD_AND_GETTER_WITH_SAME_NAME]);
+    verify([source]);
+  }
+
+  void test_missingEnumConstantInSwitch() {
+    Source source = addSource(r'''
+enum E { ONE, TWO, THREE, FOUR }
+bool odd(E e) {
+  switch (e) {
+    case E.ONE:
+    case E.THREE: return true;
+  }
+  return false;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.MISSING_ENUM_CONSTANT_IN_SWITCH,
+      CompileTimeErrorCode.MISSING_ENUM_CONSTANT_IN_SWITCH
+    ]);
+    verify([source]);
+  }
+
+  void test_mixinDeclaresConstructor_classDeclaration() {
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+class B extends Object with A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_mixinDeclaresConstructor_typeAlias() {
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+class B = Object with A;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_mixinDeferredClass() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+class B extends Object with a.A {}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.MIXIN_DEFERRED_CLASS
+    ]);
+  }
+
+  void test_mixinDeferredClass_classTypeAlias() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+class B {}
+class C = B with a.A;'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.MIXIN_DEFERRED_CLASS
+    ]);
+  }
+
+  void test_mixinHasNoConstructors_mixinApp() {
+    Source source = addSource(r'''
+class B {
+  B({x});
+}
+class M {}
+class C = B with M;
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS]);
+    verify([source]);
+  }
+
+  void test_mixinHasNoConstructors_mixinClass() {
+    Source source = addSource(r'''
+class B {
+  B({x});
+}
+class M {}
+class C extends B with M {}
+''');
+    // Note: the implicit call from C's default constructor to B() should not
+    // generate a further error (despite the fact that it's not forwarded),
+    // since CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS does a better job
+    // of explaining the probem to the user.
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS]);
+    verify([source]);
+  }
+
+  void test_mixinHasNoConstructors_mixinClass_explicitSuperCall() {
+    Source source = addSource(r'''
+class B {
+  B({x});
+}
+class M {}
+class C extends B with M {
+  C() : super();
+}
+''');
+    // Note: the explicit call from C() to B() should not generate a further
+    // error (despite the fact that it's not forwarded), since
+    // CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS does a better job of
+    // explaining the error to the user.
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS]);
+    verify([source]);
+  }
+
+  void test_mixinHasNoConstructors_mixinClass_implicitSuperCall() {
+    Source source = addSource(r'''
+class B {
+  B({x});
+}
+class M {}
+class C extends B with M {
+  C();
+}
+''');
+    // Note: the implicit call from C() to B() should not generate a further
+    // error (despite the fact that it's not forwarded), since
+    // CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS does a better job of
+    // explaining the error to the user.
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS]);
+    verify([source]);
+  }
+
+  void test_mixinHasNoConstructors_mixinClass_namedSuperCall() {
+    Source source = addSource(r'''
+class B {
+  B.named({x});
+}
+class M {}
+class C extends B with M {
+  C() : super.named();
+}
+''');
+    // Note: the explicit call from C() to B.named() should not generate a
+    // further error (despite the fact that it's not forwarded), since
+    // CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS does a better job of
+    // explaining the error to the user.
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS]);
+    verify([source]);
+  }
+
+  void test_mixinInheritsFromNotObject_classDeclaration_extends() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+class C extends Object with B {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
+    verify([source]);
+  }
+
+  void test_mixinInheritsFromNotObject_classDeclaration_with() {
+    Source source = addSource(r'''
+class A {}
+class B extends Object with A {}
+class C extends Object with B {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
+    verify([source]);
+  }
+
+  void test_mixinInheritsFromNotObject_typeAlias_extends() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+class C = Object with B;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
+    verify([source]);
+  }
+
+  void test_mixinInheritsFromNotObject_typeAlias_with() {
+    Source source = addSource(r'''
+class A {}
+class B extends Object with A {}
+class C = Object with B;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_class_bool() {
+    Source source = addSource("class A extends Object with bool {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_class_double() {
+    Source source = addSource("class A extends Object with double {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_class_int() {
+    Source source = addSource("class A extends Object with int {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_class_Null() {
+    Source source = addSource("class A extends Object with Null {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_class_num() {
+    Source source = addSource("class A extends Object with num {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_class_String() {
+    Source source = addSource("class A extends Object with String {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_classTypeAlias_bool() {
+    Source source = addSource(r'''
+class A {}
+class C = A with bool;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_classTypeAlias_double() {
+    Source source = addSource(r'''
+class A {}
+class C = A with double;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_classTypeAlias_int() {
+    Source source = addSource(r'''
+class A {}
+class C = A with int;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_classTypeAlias_Null() {
+    Source source = addSource(r'''
+class A {}
+class C = A with Null;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_classTypeAlias_num() {
+    Source source = addSource(r'''
+class A {}
+class C = A with num;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_classTypeAlias_String() {
+    Source source = addSource(r'''
+class A {}
+class C = A with String;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfDisallowedClass_classTypeAlias_String_num() {
+    Source source = addSource(r'''
+class A {}
+class C = A with String, num;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS,
+      CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS
+    ]);
+    verify([source]);
+  }
+
+  void test_mixinOfEnum() {
+    Source source = addSource(r'''
+enum E { ONE }
+class A extends Object with E {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_ENUM]);
+    verify([source]);
+  }
+
+  void test_mixinOfNonClass_class() {
+    Source source = addSource(r'''
+int A;
+class B extends Object with A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinOfNonClass_typeAlias() {
+    Source source = addSource(r'''
+class A {}
+int B;
+class C = A with B;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
+    verify([source]);
+  }
+
+  void test_mixinReferencesSuper() {
+    Source source = addSource(r'''
+class A {
+  toString() => super.toString();
+}
+class B extends Object with A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_REFERENCES_SUPER]);
+    verify([source]);
+  }
+
+  void test_mixinWithNonClassSuperclass_class() {
+    Source source = addSource(r'''
+int A;
+class B {}
+class C extends A with B {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS]);
+    verify([source]);
+  }
+
+  void test_mixinWithNonClassSuperclass_typeAlias() {
+    Source source = addSource(r'''
+int A;
+class B {}
+class C = A with B;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS]);
+    verify([source]);
+  }
+
+  void test_multipleRedirectingConstructorInvocations() {
+    Source source = addSource(r'''
+class A {
+  A() : this.a(), this.b();
+  A.a() {}
+  A.b() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS]);
+    verify([source]);
+  }
+
+  void test_multipleSuperInitializers() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  B() : super(), super() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS]);
+    verify([source]);
+  }
+
+  void test_nativeClauseInNonSDKCode() {
+    // TODO(jwren) Move this test somewhere else: This test verifies a parser
+    // error code is generated through the ErrorVerifier, it is not a
+    // CompileTimeErrorCode.
+    Source source = addSource("class A native 'string' {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE]);
+    verify([source]);
+  }
+
+  void test_nativeFunctionBodyInNonSDKCode_function() {
+    // TODO(jwren) Move this test somewhere else: This test verifies a parser
+    // error code is generated through the ErrorVerifier, it is not a
+    // CompileTimeErrorCode.
+    Source source = addSource("int m(a) native 'string';");
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE]);
+    verify([source]);
+  }
+
+  void test_nativeFunctionBodyInNonSDKCode_method() {
+    // TODO(jwren) Move this test somewhere else: This test verifies a parser
+    // error code is generated through the ErrorVerifier, it is not a
+    // CompileTimeErrorCode.
+    Source source = addSource(r'''
+class A{
+  static int m(a) native 'string';
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE]);
+    verify([source]);
+  }
+
+  void test_noAnnotationConstructorArguments() {
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+@A
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_noDefaultSuperConstructorExplicit() {
+    Source source = addSource(r'''
+class A {
+  A(p);
+}
+class B extends A {
+  B() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT]);
+    verify([source]);
+  }
+
+  void test_noDefaultSuperConstructorExplicit_MixinAppWithDirectSuperCall() {
+    Source source = addSource(r'''
+class M {}
+class B {
+  B({x});
+  B.named(); // To avoid MIXIN_HAS_NO_CONSTRUCTORS
+}
+class Mixed = B with M;
+class C extends Mixed {
+  C(x) : super();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
+    verify([source]);
+  }
+
+  void test_noDefaultSuperConstructorExplicit_mixinAppWithNamedParam() {
+    Source source = addSource(r'''
+class M {}
+class B {
+  B({x});
+  B.named(); // To avoid MIXIN_HAS_NO_CONSTRUCTORS
+}
+class Mixed = B with M;
+class C extends Mixed {
+  C();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
+    verify([source]);
+  }
+
+  void test_noDefaultSuperConstructorExplicit_MixinAppWithNamedSuperCall() {
+    Source source = addSource(r'''
+class M {}
+class B {
+  B.named({x});
+  B.named2(); // To avoid MIXIN_HAS_NO_CONSTRUCTORS
+}
+class Mixed = B with M;
+class C extends Mixed {
+  C(x) : super.named();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER]);
+    // Don't verify since call to super.named() can't be resolved.
+  }
+
+  void test_noDefaultSuperConstructorExplicit_mixinAppWithOptionalParam() {
+    Source source = addSource(r'''
+class M {}
+class B {
+  B([x]);
+  B.named(); // To avoid MIXIN_HAS_NO_CONSTRUCTORS
+}
+class Mixed = B with M;
+class C extends Mixed {
+  C();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
+    verify([source]);
+  }
+
+  void test_noDefaultSuperConstructorExplicit_MixinWithDirectSuperCall() {
+    Source source = addSource(r'''
+class M {}
+class B {
+  B({x});
+  B.other();
+}
+class C extends B with M {
+  C(x) : super();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
+    verify([source]);
+  }
+
+  void test_noDefaultSuperConstructorExplicit_mixinWithNamedParam() {
+    Source source = addSource(r'''
+class M {}
+class B {
+  B({x});
+  B.named();
+}
+class C extends B with M {
+  C();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT]);
+    verify([source]);
+  }
+
+  void test_noDefaultSuperConstructorExplicit_MixinWithNamedSuperCall() {
+    Source source = addSource(r'''
+class M {}
+class B {
+  B.named({x});
+  B.other();
+}
+class C extends B with M {
+  C(x) : super.named();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER]);
+    // Don't verify since call to super.named() can't be resolved.
+  }
+
+  void test_noDefaultSuperConstructorExplicit_mixinWithOptionalParam() {
+    Source source = addSource(r'''
+class M {}
+class B {
+  B([x]);
+  B.other();
+}
+class C extends B with M {
+  C();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT]);
+    verify([source]);
+  }
+
+  void test_noDefaultSuperConstructorImplicit_mixinAppWithNamedParam() {
+    Source source = addSource(r'''
+class M {}
+class B {
+  B({x});
+  B.named(); // To avoid MIXIN_HAS_NO_CONSTRUCTORS
+}
+class Mixed = B with M;
+class C extends Mixed {}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    verify([source]);
+  }
+
+  void test_noDefaultSuperConstructorImplicit_mixinAppWithOptionalParam() {
+    Source source = addSource(r'''
+class M {}
+class B {
+  B([x]);
+  B.named(); // To avoid MIXIN_HAS_NO_CONSTRUCTORS
+}
+class Mixed = B with M;
+class C extends Mixed {}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    verify([source]);
+  }
+
+  void test_noDefaultSuperConstructorImplicit_mixinWithNamedParam() {
+    Source source = addSource(r'''
+class M {}
+class B {
+  B({x});
+  B.other();
+}
+class C extends B with M {}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    verify([source]);
+  }
+
+  void test_noDefaultSuperConstructorImplicit_mixinWithOptionalParam() {
+    Source source = addSource(r'''
+class M {}
+class B {
+  B([x]);
+  B.other();
+}
+class C extends B with M {}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    verify([source]);
+  }
+
+  void test_noDefaultSuperConstructorImplicit_superHasParameters() {
+    Source source = addSource(r'''
+class A {
+  A(p);
+}
+class B extends A {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    verify([source]);
+  }
+
+  void test_noDefaultSuperConstructorImplicit_superOnlyNamed() {
+    Source source = addSource(r'''
+class A { A.named() {} }
+class B extends A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
+    verify([source]);
+  }
+
+  void test_nonConstantAnnotationConstructor_named() {
+    Source source = addSource(r'''
+class A {
+  A.fromInt() {}
+}
+@A.fromInt()
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_nonConstantAnnotationConstructor_unnamed() {
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+@A()
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValue_function_named() {
+    Source source = addSource(r'''
+int y;
+f({x : y}) {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValue_function_positional() {
+    Source source = addSource(r'''
+int y;
+f([x = y]) {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValue_inConstructor_named() {
+    Source source = addSource(r'''
+class A {
+  int y;
+  A({x : y}) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValue_inConstructor_positional() {
+    Source source = addSource(r'''
+class A {
+  int y;
+  A([x = y]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValue_method_named() {
+    Source source = addSource(r'''
+class A {
+  int y;
+  m({x : y}) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValue_method_positional() {
+    Source source = addSource(r'''
+class A {
+  int y;
+  m([x = y]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValueFromDeferredLibrary() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+const V = 1;''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+f({x : a.V}) {}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+
+  void test_nonConstantDefaultValueFromDeferredLibrary_nested() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+const V = 1;''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+f({x : a.V + 1}) {}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+
+  void test_nonConstCaseExpression() {
+    Source source = addSource(r'''
+f(int p, int q) {
+  switch (p) {
+    case 3 + q:
+      break;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION]);
+    verify([source]);
+  }
+
+  void test_nonConstCaseExpressionFromDeferredLibrary() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+const int c = 1;''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+main (int p) {
+  switch (p) {
+    case a.c:
+      break;
+  }
+}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+
+  void test_nonConstCaseExpressionFromDeferredLibrary_nested() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+const int c = 1;''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+main (int p) {
+  switch (p) {
+    case a.c + 1:
+      break;
+  }
+}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+
+  void test_nonConstListElement() {
+    Source source = addSource(r'''
+f(a) {
+  return const [a];
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
+    verify([source]);
+  }
+
+  void test_nonConstListElementFromDeferredLibrary() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+const int c = 1;''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+f() {
+  return const [a.c];
+}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+
+  void test_nonConstListElementFromDeferredLibrary_nested() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+const int c = 1;''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+f() {
+  return const [a.c + 1];
+}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+
+  void test_nonConstMapAsExpressionStatement_begin() {
+    Source source = addSource(r'''
+f() {
+  {'a' : 0, 'b' : 1}.length;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
+    verify([source]);
+  }
+
+  void test_nonConstMapAsExpressionStatement_only() {
+    Source source = addSource(r'''
+f() {
+  {'a' : 0, 'b' : 1};
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
+    verify([source]);
+  }
+
+  void test_nonConstMapKey() {
+    Source source = addSource(r'''
+f(a) {
+  return const {a : 0};
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]);
+    verify([source]);
+  }
+
+  void test_nonConstMapKeyFromDeferredLibrary() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+const int c = 1;''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+f() {
+  return const {a.c : 0};
+}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+
+  void test_nonConstMapKeyFromDeferredLibrary_nested() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+const int c = 1;''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+f() {
+  return const {a.c + 1 : 0};
+}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+
+  void test_nonConstMapValue() {
+    Source source = addSource(r'''
+f(a) {
+  return const {'a' : a};
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]);
+    verify([source]);
+  }
+
+  void test_nonConstMapValueFromDeferredLibrary() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+const int c = 1;''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+f() {
+  return const {'a' : a.c};
+}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+
+  void test_nonConstMapValueFromDeferredLibrary_nested() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+const int c = 1;''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+f() {
+  return const {'a' : a.c + 1};
+}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+
+  void test_nonConstValueInInitializer_binary_notBool_left() {
+    Source source = addSource(r'''
+class A {
+  final bool a;
+  const A(String p) : a = p && true;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL,
+      StaticTypeWarningCode.NON_BOOL_OPERAND
+    ]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_binary_notBool_right() {
+    Source source = addSource(r'''
+class A {
+  final bool a;
+  const A(String p) : a = true && p;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL,
+      StaticTypeWarningCode.NON_BOOL_OPERAND
+    ]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_binary_notInt() {
+    Source source = addSource(r'''
+class A {
+  final int a;
+  const A(String p) : a = 5 & p;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_EVAL_TYPE_INT,
+      StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    ]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_binary_notNum() {
+    Source source = addSource(r'''
+class A {
+  final int a;
+  const A(String p) : a = 5 + p;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_EVAL_TYPE_NUM,
+      StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    ]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_field() {
+    Source source = addSource(r'''
+class A {
+  static int C;
+  final int a;
+  const A() : a = C;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_instanceCreation() {
+    Source source = addSource(r'''
+class A {
+  A();
+}
+class B {
+  const B() : a = new A();
+  final a;
+}
+var b = const B();''');
+    computeLibrarySourceErrors(source);
+    // TODO(paulberry): the error INVALID_CONSTAT is redundant and ought to be
+    // suppressed.
+    assertErrors(source, [
+      CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER,
+      CompileTimeErrorCode.INVALID_CONSTANT
+    ]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_redirecting() {
+    Source source = addSource(r'''
+class A {
+  static var C;
+  const A.named(p);
+  const A() : this.named(C);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_super() {
+    Source source = addSource(r'''
+class A {
+  const A(p);
+}
+class B extends A {
+  static var C;
+  const B() : super(C);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializerFromDeferredLibrary_field() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+const int c = 1;''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+class A {
+  final int x;
+  const A() : x = a.c;
+}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+
+  void test_nonConstValueInInitializerFromDeferredLibrary_field_nested() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+const int c = 1;''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+class A {
+  final int x;
+  const A() : x = a.c + 1;
+}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+
+  void test_nonConstValueInInitializerFromDeferredLibrary_redirecting() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+const int c = 1;''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+class A {
+  const A.named(p);
+  const A() : this.named(a.c);
+}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+
+  void test_nonConstValueInInitializerFromDeferredLibrary_super() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+const int c = 1;''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+class A {
+  const A(p);
+}
+class B extends A {
+  const B() : super(a.c);
+}'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+
+  void test_nonGenerativeConstructor_explicit() {
+    Source source = addSource(r'''
+class A {
+  factory A.named() {}
+}
+class B extends A {
+  B() : super.named();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_nonGenerativeConstructor_implicit() {
+    Source source = addSource(r'''
+class A {
+  factory A() {}
+}
+class B extends A {
+  B();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_nonGenerativeConstructor_implicit2() {
+    Source source = addSource(r'''
+class A {
+  factory A() {}
+}
+class B extends A {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_notEnoughRequiredArguments_const() {
+    Source source = addSource(r'''
+class A {
+  const A(int p);
+}
+main() {
+  const A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_notEnoughRequiredArguments_const_super() {
+    Source source = addSource(r'''
+class A {
+  const A(int p);
+}
+class B extends A {
+  const B() : super();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_optionalParameterInOperator_named() {
+    Source source = addSource(r'''
+class A {
+  operator +({p}) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR]);
+    verify([source]);
+  }
+
+  void test_optionalParameterInOperator_positional() {
+    Source source = addSource(r'''
+class A {
+  operator +([p]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR]);
+    verify([source]);
+  }
+
+  void test_partOfNonPart() {
+    Source source = addSource(r'''
+library l1;
+part 'l2.dart';''');
+    addNamedSource("/l2.dart", "library l2;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.PART_OF_NON_PART]);
+    verify([source]);
+  }
+
+  void test_partOfNonPart_self() {
+    Source source = addSource(r'''
+library lib;
+part 'test.dart';''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.PART_OF_NON_PART]);
+    verify([source]);
+  }
+
+  void test_prefix_assignment_compound_in_method() {
+    addNamedSource('/lib.dart', 'library lib;');
+    Source source = addSource('''
+import 'lib.dart' as p;
+class C {
+  f() {
+    p += 1;
+  }
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT]);
+    verify([source]);
+  }
+
+  void test_prefix_assignment_compound_not_in_method() {
+    addNamedSource('/lib.dart', 'library lib;');
+    Source source = addSource('''
+import 'lib.dart' as p;
+f() {
+  p += 1;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT]);
+    verify([source]);
+  }
+
+  void test_prefix_assignment_in_method() {
+    addNamedSource('/lib.dart', 'library lib;');
+    Source source = addSource('''
+import 'lib.dart' as p;
+class C {
+  f() {
+    p = 1;
+  }
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT]);
+    verify([source]);
+  }
+
+  void test_prefix_assignment_not_in_method() {
+    addNamedSource('/lib.dart', 'library lib;');
+    Source source = addSource('''
+import 'lib.dart' as p;
+f() {
+  p = 1;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT]);
+    verify([source]);
+  }
+
+  void test_prefix_conditionalPropertyAccess_call() {
+    addNamedSource(
+        '/lib.dart',
+        '''
+library lib;
+g() {}
+''');
+    Source source = addSource('''
+import 'lib.dart' as p;
+f() {
+  p?.g();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT]);
+    verify([source]);
+  }
+
+  void test_prefix_conditionalPropertyAccess_call_loadLibrary() {
+    addNamedSource(
+        '/lib.dart',
+        '''
+library lib;
+''');
+    Source source = addSource('''
+import 'lib.dart' deferred as p;
+f() {
+  p?.loadLibrary();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT]);
+    verify([source]);
+  }
+
+  void test_prefix_conditionalPropertyAccess_get() {
+    addNamedSource(
+        '/lib.dart',
+        '''
+library lib;
+var x;
+''');
+    Source source = addSource('''
+import 'lib.dart' as p;
+f() {
+  return p?.x;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT]);
+    verify([source]);
+  }
+
+  void test_prefix_conditionalPropertyAccess_get_loadLibrary() {
+    addNamedSource(
+        '/lib.dart',
+        '''
+library lib;
+''');
+    Source source = addSource('''
+import 'lib.dart' deferred as p;
+f() {
+  return p?.loadLibrary;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT]);
+    verify([source]);
+  }
+
+  void test_prefix_conditionalPropertyAccess_set() {
+    addNamedSource(
+        '/lib.dart',
+        '''
+library lib;
+var x;
+''');
+    Source source = addSource('''
+import 'lib.dart' as p;
+f() {
+  p?.x = null;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT]);
+    verify([source]);
+  }
+
+  void test_prefix_conditionalPropertyAccess_set_loadLibrary() {
+    addNamedSource(
+        '/lib.dart',
+        '''
+library lib;
+''');
+    Source source = addSource('''
+import 'lib.dart' deferred as p;
+f() {
+  p?.loadLibrary = null;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT]);
+    verify([source]);
+  }
+
+  void test_prefix_unqualified_invocation_in_method() {
+    addNamedSource('/lib.dart', 'librarylib;');
+    Source source = addSource('''
+import 'lib.dart' as p;
+class C {
+  f() {
+    p();
+  }
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT]);
+    verify([source]);
+  }
+
+  void test_prefix_unqualified_invocation_not_in_method() {
+    addNamedSource('/lib.dart', 'librarylib;');
+    Source source = addSource('''
+import 'lib.dart' as p;
+f() {
+  p();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT]);
+    verify([source]);
+  }
+
+  void test_prefixCollidesWithTopLevelMembers_functionTypeAlias() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+class A{}''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+typedef p();
+p.A a;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
+    verify([source]);
+  }
+
+  void test_prefixCollidesWithTopLevelMembers_topLevelFunction() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+class A{}''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+p() {}
+p.A a;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
+    verify([source]);
+  }
+
+  void test_prefixCollidesWithTopLevelMembers_topLevelVariable() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+class A{}''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+var p = null;
+p.A a;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
+    verify([source]);
+  }
+
+  void test_prefixCollidesWithTopLevelMembers_type() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+class A{}''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+class p {}
+p.A a;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
+    verify([source]);
+  }
+
+  void test_prefixNotFollowedByDot() {
+    addNamedSource('/lib.dart', 'library lib;');
+    Source source = addSource('''
+import 'lib.dart' as p;
+f() {
+  return p;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT]);
+    verify([source]);
+  }
+
+  void test_prefixNotFollowedByDot_compoundAssignment() {
+    addNamedSource('/lib.dart', 'library lib;');
+    Source source = addSource('''
+import 'lib.dart' as p;
+f() {
+  p += 1;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT]);
+    verify([source]);
+  }
+
+  void test_prefixNotFollowedByDot_conditionalMethodInvocation() {
+    addNamedSource(
+        '/lib.dart',
+        '''
+library lib;
+g() {}
+''');
+    Source source = addSource('''
+import 'lib.dart' as p;
+f() {
+  p?.g();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT]);
+    verify([source]);
+  }
+
+  void test_privateOptionalParameter() {
+    Source source = addSource("f({var _p}) {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER]);
+    verify([source]);
+  }
+
+  void test_privateOptionalParameter_fieldFormal() {
+    Source source = addSource(r'''
+class A {
+  var _p;
+  A({this._p: 0});
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER]);
+    verify([source]);
+  }
+
+  void test_privateOptionalParameter_withDefaultValue() {
+    Source source = addSource("f({_p : 0}) {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER]);
+    verify([source]);
+  }
+
+  void test_recursiveCompileTimeConstant() {
+    Source source = addSource(r'''
+class A {
+  const A();
+  final m = const A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT]);
+    verify([source]);
+  }
+
+  void test_recursiveCompileTimeConstant_cycle() {
+    Source source = addSource(r'''
+const x = y + 1;
+const y = x + 1;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT,
+      CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT
+    ]);
+    verify([source]);
+  }
+
+  void test_recursiveCompileTimeConstant_initializer_after_toplevel_var() {
+    Source source = addSource('''
+const y = const C();
+class C {
+  const C() : x = y;
+  final x;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT]);
+    verify([source]);
+  }
+
+  void test_recursiveCompileTimeConstant_singleVariable() {
+    Source source = addSource(r'''
+const x = x;
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT]);
+    verify([source]);
+  }
+
+  void test_recursiveConstructorRedirect() {
+    Source source = addSource(r'''
+class A {
+  A.a() : this.b();
+  A.b() : this.a();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT,
+      CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT
+    ]);
+    verify([source]);
+  }
+
+  void test_recursiveConstructorRedirect_directSelfReference() {
+    Source source = addSource(r'''
+class A {
+  A() : this();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT]);
+    verify([source]);
+  }
+
+  void test_recursiveFactoryRedirect() {
+    Source source = addSource(r'''
+class A implements B {
+  factory A() = C;
+}
+class B implements C {
+  factory B() = A;
+}
+class C implements A {
+  factory C() = B;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+      CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+      CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE
+    ]);
+    verify([source]);
+  }
+
+  void test_recursiveFactoryRedirect_directSelfReference() {
+    Source source = addSource(r'''
+class A {
+  factory A() = A;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT]);
+    verify([source]);
+  }
+
+  void test_recursiveFactoryRedirect_diverging() {
+    // Analysis should terminate even though the redirections don't reach a
+    // fixed point.  (C<int> redirects to C<C<int>>, then to C<C<C<int>>>, and
+    // so on).
+    Source source = addSource('''
+class C<T> {
+  const factory C() = C<C<T>>;
+}
+main() {
+  const C<int>();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT]);
+    verify([source]);
+  }
+
+  void test_recursiveFactoryRedirect_generic() {
+    Source source = addSource(r'''
+class A<T> implements B<T> {
+  factory A() = C;
+}
+class B<T> implements C<T> {
+  factory B() = A;
+}
+class C<T> implements A<T> {
+  factory C() = B;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+      CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+      CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE
+    ]);
+    verify([source]);
+  }
+
+  void test_recursiveFactoryRedirect_named() {
+    Source source = addSource(r'''
+class A implements B {
+  factory A.nameA() = C.nameC;
+}
+class B implements C {
+  factory B.nameB() = A.nameA;
+}
+class C implements A {
+  factory C.nameC() = B.nameB;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+      CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+      CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE
+    ]);
+    verify([source]);
+  }
+
+  /**
+   * "A" references "C" which has cycle with "B". But we should not report problem for "A" - it is
+   * not the part of a cycle.
+   */
+  void test_recursiveFactoryRedirect_outsideCycle() {
+    Source source = addSource(r'''
+class A {
+  factory A() = C;
+}
+class B implements C {
+  factory B() = C;
+}
+class C implements A, B {
+  factory C() = B;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+      CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE
+    ]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritance_extends() {
+    Source source = addSource(r'''
+class A extends B {}
+class B extends A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE
+    ]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritance_extends_implements() {
+    Source source = addSource(r'''
+class A extends B {}
+class B implements A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE
+    ]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritance_implements() {
+    Source source = addSource(r'''
+class A implements B {}
+class B implements A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE
+    ]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritance_mixin() {
+    Source source = addSource(r'''
+class M1 = Object with M2;
+class M2 = Object with M1;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE
+    ]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritance_mixin_superclass() {
+    // Make sure we don't get CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS in
+    // addition--that would just be confusing.
+    Source source = addSource('''
+class C = D with M;
+class D = C with M;
+class M {}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE
+    ]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritance_tail() {
+    Source source = addSource(r'''
+abstract class A implements A {}
+class B implements A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS
+    ]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritance_tail2() {
+    Source source = addSource(r'''
+abstract class A implements B {}
+abstract class B implements A {}
+class C implements A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE
+    ]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritance_tail3() {
+    Source source = addSource(r'''
+abstract class A implements B {}
+abstract class B implements C {}
+abstract class C implements A {}
+class D implements A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE
+    ]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritanceBaseCaseExtends() {
+    Source source = addSource("class A extends A {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS
+    ]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritanceBaseCaseImplements() {
+    Source source = addSource("class A implements A {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS
+    ]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritanceBaseCaseImplements_typeAlias() {
+    Source source = addSource(r'''
+class A {}
+class M {}
+class B = A with M implements B;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS
+    ]);
+    verify([source]);
+  }
+
+  void test_recursiveInterfaceInheritanceBaseCaseWith() {
+    Source source = addSource("class M = Object with M;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH]);
+    verify([source]);
+  }
+
+  void test_redirectGenerativeToMissingConstructor() {
+    Source source = addSource(r'''
+class A {
+  A() : this.noSuchConstructor();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR]);
+  }
+
+  void test_redirectGenerativeToNonGenerativeConstructor() {
+    Source source = addSource(r'''
+class A {
+  A() : this.x();
+  factory A.x() => null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR
+    ]);
+    verify([source]);
+  }
+
+  void test_redirectToMissingConstructor_named() {
+    Source source = addSource(r'''
+class A implements B{
+  A() {}
+}
+class B {
+  const factory B() = A.name;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR]);
+  }
+
+  void test_redirectToMissingConstructor_unnamed() {
+    Source source = addSource(r'''
+class A implements B{
+  A.name() {}
+}
+class B {
+  const factory B() = A;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR]);
+  }
+
+  void test_redirectToNonClass_notAType() {
+    Source source = addSource(r'''
+int A;
+class B {
+  const factory B() = A;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_NON_CLASS]);
+    verify([source]);
+  }
+
+  void test_redirectToNonClass_undefinedIdentifier() {
+    Source source = addSource(r'''
+class B {
+  const factory B() = A;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_NON_CLASS]);
+    verify([source]);
+  }
+
+  void test_redirectToNonConstConstructor() {
+    Source source = addSource(r'''
+class A {
+  A.a() {}
+  const factory A.b() = A.a;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_referencedBeforeDeclaration_hideInBlock_function() {
+    Source source = addSource(r'''
+var v = 1;
+main() {
+  print(v);
+  v() {}
+}
+print(x) {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
+  }
+
+  void test_referencedBeforeDeclaration_hideInBlock_local() {
+    Source source = addSource(r'''
+var v = 1;
+main() {
+  print(v);
+  var v = 2;
+}
+print(x) {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
+  }
+
+  void test_referencedBeforeDeclaration_hideInBlock_subBlock() {
+    Source source = addSource(r'''
+var v = 1;
+main() {
+  {
+    print(v);
+  }
+  var v = 2;
+}
+print(x) {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
+  }
+
+  void test_referencedBeforeDeclaration_inInitializer_closure() {
+    Source source = addSource(r'''
+main() {
+  var v = () => v;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
+  }
+
+  void test_referencedBeforeDeclaration_inInitializer_directly() {
+    Source source = addSource(r'''
+main() {
+  var v = v;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
+  }
+
+  void test_rethrowOutsideCatch() {
+    Source source = addSource(r'''
+f() {
+  rethrow;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH]);
+    verify([source]);
+  }
+
+  void test_returnInGenerativeConstructor() {
+    Source source = addSource(r'''
+class A {
+  A() { return 0; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_returnInGenerativeConstructor_expressionFunctionBody() {
+    Source source = addSource(r'''
+class A {
+  A() => null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_returnInGenerator_asyncStar() {
+    Source source = addSource(r'''
+f() async* {
+  return 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.RETURN_IN_GENERATOR]);
+    verify([source]);
+  }
+
+  void test_returnInGenerator_syncStar() {
+    Source source = addSource(r'''
+f() sync* {
+  return 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.RETURN_IN_GENERATOR]);
+    verify([source]);
+  }
+
+  void test_sharedDeferredPrefix() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+f1() {}''',
+      r'''
+library lib2;
+f2() {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as lib;
+import 'lib2.dart' as lib;
+main() { lib.f1(); lib.f2(); }'''
+    ], <ErrorCode>[
+      CompileTimeErrorCode.SHARED_DEFERRED_PREFIX
+    ]);
+  }
+
+  void test_superInInvalidContext_binaryExpression() {
+    Source source = addSource("var v = super + 0;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+    // no verify(), 'super.v' is not resolved
+  }
+
+  void test_superInInvalidContext_constructorFieldInitializer() {
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+class B extends A {
+  var f;
+  B() : f = super.m();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+    // no verify(), 'super.m' is not resolved
+  }
+
+  void test_superInInvalidContext_factoryConstructor() {
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+class B extends A {
+  factory B() {
+    super.m();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+    // no verify(), 'super.m' is not resolved
+  }
+
+  void test_superInInvalidContext_instanceVariableInitializer() {
+    Source source = addSource(r'''
+class A {
+  var a;
+}
+class B extends A {
+ var b = super.a;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+    // no verify(), 'super.a' is not resolved
+  }
+
+  void test_superInInvalidContext_staticMethod() {
+    Source source = addSource(r'''
+class A {
+  static m() {}
+}
+class B extends A {
+  static n() { return super.m(); }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+    // no verify(), 'super.m' is not resolved
+  }
+
+  void test_superInInvalidContext_staticVariableInitializer() {
+    Source source = addSource(r'''
+class A {
+  static int a = 0;
+}
+class B extends A {
+  static int b = super.a;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+    // no verify(), 'super.a' is not resolved
+  }
+
+  void test_superInInvalidContext_topLevelFunction() {
+    Source source = addSource(r'''
+f() {
+  super.f();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+    // no verify(), 'super.f' is not resolved
+  }
+
+  void test_superInInvalidContext_topLevelVariableInitializer() {
+    Source source = addSource("var v = super.y;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
+    // no verify(), 'super.y' is not resolved
+  }
+
+  void test_superInRedirectingConstructor_redirectionSuper() {
+    Source source = addSource(r'''
+class A {}
+class B {
+  B() : this.name(), super();
+  B.name() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_superInRedirectingConstructor_superRedirection() {
+    Source source = addSource(r'''
+class A {}
+class B {
+  B() : super(), this.name();
+  B.name() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_symbol_constructor_badArgs() {
+    Source source = addSource(r'''
+var s1 = const Symbol('3');
+var s2 = const Symbol(3);
+var s3 = const Symbol();
+var s4 = const Symbol('x', 'y');
+var s5 = const Symbol('x', foo: 'x');''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
+      CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
+      StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
+      CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS,
+      CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS,
+      CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER
+    ]);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotReferenceItself_11987() {
+    Source source = addSource(r'''
+typedef void F(List<G> l);
+typedef void G(List<F> l);
+main() {
+  F foo(G g) => g;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
+      CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF
+    ]);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotReferenceItself_19459() {
+    // A complex example involving multiple classes.  This is legal, since
+    // typedef F references itself only via a class.
+    Source source = addSource(r'''
+class A<B, C> {}
+abstract class D {
+  f(E e);
+}
+abstract class E extends A<dynamic, F> {}
+typedef D F();
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotReferenceItself_parameterType_named() {
+    Source source = addSource("typedef A({A a});");
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotReferenceItself_parameterType_positional() {
+    Source source = addSource("typedef A([A a]);");
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotReferenceItself_parameterType_required() {
+    Source source = addSource("typedef A(A a);");
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotReferenceItself_parameterType_typeArgument() {
+    Source source = addSource("typedef A(List<A> a);");
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotReferenceItself_returnClass_withTypeAlias() {
+    // A typedef is allowed to indirectly reference itself via a class.
+    Source source = addSource(r'''
+typedef C A();
+typedef A B();
+class C {
+  B a;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotReferenceItself_returnType() {
+    Source source = addSource("typedef A A();");
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotReferenceItself_returnType_indirect() {
+    Source source = addSource(r'''
+typedef B A();
+typedef A B();''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
+      CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF
+    ]);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotReferenceItself_typeVariableBounds() {
+    Source source = addSource("typedef A<T extends A>();");
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_const() {
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {
+  const G();
+}
+f() { return const G<B>(); }''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_undefinedClass_const() {
+    Source source = addSource(r'''
+f() {
+  return const A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.UNDEFINED_CLASS]);
+    verify([source]);
+  }
+
+  void test_undefinedConstructorInInitializer_explicit_named() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  B() : super.named();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER]);
+    // no verify(), "super.named()" is not resolved
+  }
+
+  void test_undefinedConstructorInInitializer_explicit_unnamed() {
+    Source source = addSource(r'''
+class A {
+  A.named() {}
+}
+class B extends A {
+  B() : super();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
+    verify([source]);
+  }
+
+  void test_undefinedConstructorInInitializer_implicit() {
+    Source source = addSource(r'''
+class A {
+  A.named() {}
+}
+class B extends A {
+  B();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
+    verify([source]);
+  }
+
+  void test_undefinedNamedParameter() {
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+main() {
+  const A(p: 0);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER]);
+    // no verify(), 'p' is not resolved
+  }
+
+  void test_uriDoesNotExist_export() {
+    Source source = addSource("export 'unknown.dart';");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
+  }
+
+  void test_uriDoesNotExist_import() {
+    Source source = addSource("import 'unknown.dart';");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
+  }
+
+  void test_uriDoesNotExist_part() {
+    Source source = addSource(r'''
+library lib;
+part 'unknown.dart';''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
+  }
+
+  void test_uriWithInterpolation_constant() {
+    Source source = addSource("import 'stuff_\$platform.dart';");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.URI_WITH_INTERPOLATION,
+      StaticWarningCode.UNDEFINED_IDENTIFIER
+    ]);
+    // We cannot verify resolution with an unresolvable
+    // URI: 'stuff_$platform.dart'
+  }
+
+  void test_uriWithInterpolation_nonConstant() {
+    Source source = addSource(r'''
+library lib;
+part '${'a'}.dart';''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.URI_WITH_INTERPOLATION]);
+    // We cannot verify resolution with an unresolvable URI: '${'a'}.dart'
+  }
+
+  void test_wrongNumberOfParametersForOperator1() {
+    _check_wrongNumberOfParametersForOperator1("<");
+    _check_wrongNumberOfParametersForOperator1(">");
+    _check_wrongNumberOfParametersForOperator1("<=");
+    _check_wrongNumberOfParametersForOperator1(">=");
+    _check_wrongNumberOfParametersForOperator1("+");
+    _check_wrongNumberOfParametersForOperator1("/");
+    _check_wrongNumberOfParametersForOperator1("~/");
+    _check_wrongNumberOfParametersForOperator1("*");
+    _check_wrongNumberOfParametersForOperator1("%");
+    _check_wrongNumberOfParametersForOperator1("|");
+    _check_wrongNumberOfParametersForOperator1("^");
+    _check_wrongNumberOfParametersForOperator1("&");
+    _check_wrongNumberOfParametersForOperator1("<<");
+    _check_wrongNumberOfParametersForOperator1(">>");
+    _check_wrongNumberOfParametersForOperator1("[]");
+  }
+
+  void test_wrongNumberOfParametersForOperator_minus() {
+    Source source = addSource(r'''
+class A {
+  operator -(a, b) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS]);
+    verify([source]);
+    reset();
+  }
+
+  void test_wrongNumberOfParametersForOperator_tilde() {
+    _check_wrongNumberOfParametersForOperator("~", "a");
+    _check_wrongNumberOfParametersForOperator("~", "a, b");
+  }
+
+  void test_wrongNumberOfParametersForSetter_function_named() {
+    Source source = addSource("set x({p}) {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
+    verify([source]);
+  }
+
+  void test_wrongNumberOfParametersForSetter_function_optional() {
+    Source source = addSource("set x([p]) {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
+    verify([source]);
+  }
+
+  void test_wrongNumberOfParametersForSetter_function_tooFew() {
+    Source source = addSource("set x() {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
+    verify([source]);
+  }
+
+  void test_wrongNumberOfParametersForSetter_function_tooMany() {
+    Source source = addSource("set x(a, b) {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
+    verify([source]);
+  }
+
+  void test_wrongNumberOfParametersForSetter_method_named() {
+    Source source = addSource(r'''
+class A {
+  set x({p}) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
+    verify([source]);
+  }
+
+  void test_wrongNumberOfParametersForSetter_method_optional() {
+    Source source = addSource(r'''
+class A {
+  set x([p]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
+    verify([source]);
+  }
+
+  void test_wrongNumberOfParametersForSetter_method_tooFew() {
+    Source source = addSource(r'''
+class A {
+  set x() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
+    verify([source]);
+  }
+
+  void test_wrongNumberOfParametersForSetter_method_tooMany() {
+    Source source = addSource(r'''
+class A {
+  set x(a, b) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
+    verify([source]);
+  }
+
+  void test_yield_used_as_identifier_in_async_method() {
+    Source source = addSource('''
+f() async {
+  var yield = 1;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_yield_used_as_identifier_in_async_star_method() {
+    Source source = addSource('''
+f() async* {
+  var yield = 1;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void test_yield_used_as_identifier_in_sync_star_method() {
+    Source source = addSource('''
+f() sync* {
+  var yield = 1;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER]);
+    verify([source]);
+  }
+
+  void _check_constEvalThrowsException_binary_null(String expr, bool resolved) {
+    Source source = addSource("const C = $expr;");
+    computeLibrarySourceErrors(source);
+    if (resolved) {
+      assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+      verify([source]);
+    } else {
+      assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+      // no verify(), 'null x' is not resolved
+    }
+    reset();
+  }
+
+  void _check_constEvalTypeBool_withParameter_binary(String expr) {
+    Source source = addSource('''
+class A {
+  final a;
+  const A(bool p) : a = $expr;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL,
+      StaticTypeWarningCode.NON_BOOL_OPERAND
+    ]);
+    verify([source]);
+    reset();
+  }
+
+  void _check_constEvalTypeInt_withParameter_binary(String expr) {
+    Source source = addSource('''
+class A {
+  final a;
+  const A(int p) : a = $expr;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_EVAL_TYPE_INT,
+      StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    ]);
+    verify([source]);
+    reset();
+  }
+
+  void _check_constEvalTypeNum_withParameter_binary(String expr) {
+    Source source = addSource('''
+class A {
+  final a;
+  const A(num p) : a = $expr;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_EVAL_TYPE_NUM,
+      StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    ]);
+    verify([source]);
+    reset();
+  }
+
+  void _check_wrongNumberOfParametersForOperator(
+      String name, String parameters) {
+    Source source = addSource('''
+class A {
+  operator $name($parameters) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR]);
+    verify([source]);
+    reset();
+  }
+
+  void _check_wrongNumberOfParametersForOperator1(String name) {
+    _check_wrongNumberOfParametersForOperator(name, "");
+    _check_wrongNumberOfParametersForOperator(name, "a, b");
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/element_test.dart b/mojo/public/dart/third_party/analyzer/test/generated/element_test.dart
new file mode 100644
index 0000000..14485e2
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/generated/element_test.dart
@@ -0,0 +1,4285 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.element_test;
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart'
+    show AnalysisContext, AnalysisOptionsImpl;
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/testing/ast_factory.dart';
+import 'package:analyzer/src/generated/testing/element_factory.dart';
+import 'package:analyzer/src/generated/testing/test_type_provider.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+import '../utils.dart';
+import 'resolver_test.dart' show TestTypeProvider, AnalysisContextHelper;
+import 'test_support.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(ElementKindTest);
+  runReflectiveTests(FieldElementImplTest);
+  runReflectiveTests(FunctionTypeImplTest);
+  runReflectiveTests(InterfaceTypeImplTest);
+  runReflectiveTests(TypeParameterTypeImplTest);
+  runReflectiveTests(VoidTypeImplTest);
+  runReflectiveTests(ClassElementImplTest);
+  runReflectiveTests(CompilationUnitElementImplTest);
+  runReflectiveTests(ElementLocationImplTest);
+  runReflectiveTests(ElementImplTest);
+  runReflectiveTests(HtmlElementImplTest);
+  runReflectiveTests(LibraryElementImplTest);
+  runReflectiveTests(MethodElementImplTest);
+  runReflectiveTests(MultiplyDefinedElementImplTest);
+  runReflectiveTests(ParameterElementImplTest);
+}
+
+@reflectiveTest
+class ClassElementImplTest extends EngineTestCase {
+  void test_computeNode_ClassDeclaration() {
+    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
+    AnalysisContext context = contextHelper.context;
+    Source source = contextHelper.addSource(
+        "/test.dart",
+        r'''
+class A {}
+@deprecated class B {}
+enum C {C1, C2, C3}
+@deprecated enum D {D1, D2, D3}''');
+    // prepare CompilationUnitElement
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
+    // A
+    {
+      ClassElement elementA = unitElement.getType("A");
+      expect(elementA.isDeprecated, isFalse);
+      expect(elementA.isEnum, isFalse);
+      ClassDeclaration nodeA = elementA.computeNode();
+      expect(nodeA, isNotNull);
+      expect(nodeA.name.name, "A");
+      expect(nodeA.element, same(elementA));
+    }
+    // B
+    {
+      ClassElement elementB = unitElement.getType("B");
+      expect(elementB.isDeprecated, isTrue);
+      expect(elementB.isEnum, isFalse);
+      ClassDeclaration nodeB = elementB.computeNode();
+      expect(nodeB, isNotNull);
+      expect(nodeB.name.name, "B");
+      expect(nodeB.element, same(elementB));
+    }
+    // C
+    {
+      ClassElement elementC = unitElement.getEnum("C");
+      expect(elementC.isDeprecated, isFalse);
+      expect(elementC.isEnum, isTrue);
+      EnumDeclaration nodeC = elementC.computeNode();
+      expect(nodeC, isNotNull);
+      expect(nodeC.name.name, "C");
+      expect(nodeC.element, same(elementC));
+    }
+    // D
+    {
+      ClassElement elementD = unitElement.getEnum("D");
+      expect(elementD.isDeprecated, isTrue);
+      expect(elementD.isEnum, isTrue);
+      EnumDeclaration nodeC = elementD.computeNode();
+      expect(nodeC, isNotNull);
+      expect(nodeC.name.name, "D");
+      expect(nodeC.element, same(elementD));
+    }
+  }
+
+  void test_computeNode_ClassTypeAlias() {
+    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
+    AnalysisContext context = contextHelper.context;
+    Source source = contextHelper.addSource(
+        "/test.dart",
+        r'''
+abstract class A<K, V> = Object with MapMixin<K, V>;
+''');
+    // prepare CompilationUnitElement
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
+    // A
+    {
+      ClassElement elementA = unitElement.getType("A");
+      ClassTypeAlias nodeA = elementA.computeNode();
+      expect(nodeA, isNotNull);
+      expect(nodeA.name.name, "A");
+      expect(nodeA.element, same(elementA));
+    }
+  }
+
+  void test_getAllSupertypes_interface() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl elementC = ElementFactory.classElement2("C");
+    InterfaceType typeObject = classA.supertype;
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = elementC.type;
+    elementC.interfaces = <InterfaceType>[typeB];
+    List<InterfaceType> supers = elementC.allSupertypes;
+    List<InterfaceType> types = new List<InterfaceType>();
+    types.addAll(supers);
+    expect(types.contains(typeA), isTrue);
+    expect(types.contains(typeB), isTrue);
+    expect(types.contains(typeObject), isTrue);
+    expect(types.contains(typeC), isFalse);
+  }
+
+  void test_getAllSupertypes_mixins() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    InterfaceType typeObject = classA.supertype;
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    classC.mixins = <InterfaceType>[typeB];
+    List<InterfaceType> supers = classC.allSupertypes;
+    List<InterfaceType> types = new List<InterfaceType>();
+    types.addAll(supers);
+    expect(types.contains(typeA), isFalse);
+    expect(types.contains(typeB), isTrue);
+    expect(types.contains(typeObject), isTrue);
+    expect(types.contains(typeC), isFalse);
+  }
+
+  void test_getAllSupertypes_recursive() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    classA.supertype = classB.type;
+    List<InterfaceType> supers = classB.allSupertypes;
+    expect(supers, hasLength(1));
+  }
+
+  void test_getField() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String fieldName = "f";
+    FieldElementImpl field =
+        ElementFactory.fieldElement(fieldName, false, false, false, null);
+    classA.fields = <FieldElement>[field];
+    expect(classA.getField(fieldName), same(field));
+    expect(field.isEnumConstant, false);
+    // no such field
+    expect(classA.getField("noSuchField"), same(null));
+  }
+
+  void test_getMethod_declared() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement method = ElementFactory.methodElement(methodName, null);
+    classA.methods = <MethodElement>[method];
+    expect(classA.getMethod(methodName), same(method));
+  }
+
+  void test_getMethod_undeclared() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement method = ElementFactory.methodElement(methodName, null);
+    classA.methods = <MethodElement>[method];
+    expect(classA.getMethod("${methodName}x"), isNull);
+  }
+
+  void test_hasNonFinalField_false_const() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.fields = <FieldElement>[
+      ElementFactory.fieldElement("f", false, false, true, classA.type)
+    ];
+    expect(classA.hasNonFinalField, isFalse);
+  }
+
+  void test_hasNonFinalField_false_final() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.fields = <FieldElement>[
+      ElementFactory.fieldElement("f", false, true, false, classA.type)
+    ];
+    expect(classA.hasNonFinalField, isFalse);
+  }
+
+  void test_hasNonFinalField_false_recursive() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    classA.supertype = classB.type;
+    expect(classA.hasNonFinalField, isFalse);
+  }
+
+  void test_hasNonFinalField_true_immediate() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.fields = <FieldElement>[
+      ElementFactory.fieldElement("f", false, false, false, classA.type)
+    ];
+    expect(classA.hasNonFinalField, isTrue);
+  }
+
+  void test_hasNonFinalField_true_inherited() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    classA.fields = <FieldElement>[
+      ElementFactory.fieldElement("f", false, false, false, classA.type)
+    ];
+    expect(classB.hasNonFinalField, isTrue);
+  }
+
+  void test_hasStaticMember_false_empty() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    // no members
+    expect(classA.hasStaticMember, isFalse);
+  }
+
+  void test_hasStaticMember_false_instanceMethod() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    MethodElement method = ElementFactory.methodElement("foo", null);
+    classA.methods = <MethodElement>[method];
+    expect(classA.hasStaticMember, isFalse);
+  }
+
+  void test_hasStaticMember_instanceGetter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    PropertyAccessorElement getter =
+        ElementFactory.getterElement("foo", false, null);
+    classA.accessors = <PropertyAccessorElement>[getter];
+    expect(classA.hasStaticMember, isFalse);
+  }
+
+  void test_hasStaticMember_true_getter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    PropertyAccessorElementImpl getter =
+        ElementFactory.getterElement("foo", false, null);
+    classA.accessors = <PropertyAccessorElement>[getter];
+    // "foo" is static
+    getter.static = true;
+    expect(classA.hasStaticMember, isTrue);
+  }
+
+  void test_hasStaticMember_true_method() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    MethodElementImpl method = ElementFactory.methodElement("foo", null);
+    classA.methods = <MethodElement>[method];
+    // "foo" is static
+    method.static = true;
+    expect(classA.hasStaticMember, isTrue);
+  }
+
+  void test_hasStaticMember_true_setter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    PropertyAccessorElementImpl setter =
+        ElementFactory.setterElement("foo", false, null);
+    classA.accessors = <PropertyAccessorElement>[setter];
+    // "foo" is static
+    setter.static = true;
+    expect(classA.hasStaticMember, isTrue);
+  }
+
+  void test_isEnum() {
+    String firstConst = "A";
+    String secondConst = "B";
+    ClassElementImpl enumE = ElementFactory.enumElement(
+        new TestTypeProvider(), "E", [firstConst, secondConst]);
+
+    // E is an enum
+    expect(enumE.isEnum, true);
+
+    // A and B are static members
+    expect(enumE.getField(firstConst).isEnumConstant, true);
+    expect(enumE.getField(secondConst).isEnumConstant, true);
+  }
+
+  void test_lookUpConcreteMethod_declared() {
+    // class A {
+    //   m() {}
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement method = ElementFactory.methodElement(methodName, null);
+    classA.methods = <MethodElement>[method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA];
+    expect(classA.lookUpConcreteMethod(methodName, library), same(method));
+  }
+
+  void test_lookUpConcreteMethod_declaredAbstract() {
+    // class A {
+    //   m();
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElementImpl method = ElementFactory.methodElement(methodName, null);
+    method.abstract = true;
+    classA.methods = <MethodElement>[method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA];
+    expect(classA.lookUpConcreteMethod(methodName, library), isNull);
+  }
+
+  void test_lookUpConcreteMethod_declaredAbstractAndInherited() {
+    // class A {
+    //   m() {}
+    // }
+    // class B extends A {
+    //   m();
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement inheritedMethod =
+        ElementFactory.methodElement(methodName, null);
+    classA.methods = <MethodElement>[inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    MethodElementImpl method = ElementFactory.methodElement(methodName, null);
+    method.abstract = true;
+    classB.methods = <MethodElement>[method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB];
+    expect(classB.lookUpConcreteMethod(methodName, library),
+        same(inheritedMethod));
+  }
+
+  void test_lookUpConcreteMethod_declaredAndInherited() {
+    // class A {
+    //   m() {}
+    // }
+    // class B extends A {
+    //   m() {}
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement inheritedMethod =
+        ElementFactory.methodElement(methodName, null);
+    classA.methods = <MethodElement>[inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    MethodElement method = ElementFactory.methodElement(methodName, null);
+    classB.methods = <MethodElement>[method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB];
+    expect(classB.lookUpConcreteMethod(methodName, library), same(method));
+  }
+
+  void test_lookUpConcreteMethod_declaredAndInheritedAbstract() {
+    // abstract class A {
+    //   m();
+    // }
+    // class B extends A {
+    //   m() {}
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.abstract = true;
+    String methodName = "m";
+    MethodElementImpl inheritedMethod =
+        ElementFactory.methodElement(methodName, null);
+    inheritedMethod.abstract = true;
+    classA.methods = <MethodElement>[inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    MethodElement method = ElementFactory.methodElement(methodName, null);
+    classB.methods = <MethodElement>[method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB];
+    expect(classB.lookUpConcreteMethod(methodName, library), same(method));
+  }
+
+  void test_lookUpConcreteMethod_inherited() {
+    // class A {
+    //   m() {}
+    // }
+    // class B extends A {
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement inheritedMethod =
+        ElementFactory.methodElement(methodName, null);
+    classA.methods = <MethodElement>[inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB];
+    expect(classB.lookUpConcreteMethod(methodName, library),
+        same(inheritedMethod));
+  }
+
+  void test_lookUpConcreteMethod_undeclared() {
+    // class A {
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA];
+    expect(classA.lookUpConcreteMethod("m", library), isNull);
+  }
+
+  void test_lookUpGetter_declared() {
+    // class A {
+    //   get g {}
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "g";
+    PropertyAccessorElement getter =
+        ElementFactory.getterElement(getterName, false, null);
+    classA.accessors = <PropertyAccessorElement>[getter];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA];
+    expect(classA.lookUpGetter(getterName, library), same(getter));
+  }
+
+  void test_lookUpGetter_inherited() {
+    // class A {
+    //   get g {}
+    // }
+    // class B extends A {
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "g";
+    PropertyAccessorElement getter =
+        ElementFactory.getterElement(getterName, false, null);
+    classA.accessors = <PropertyAccessorElement>[getter];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB];
+    expect(classB.lookUpGetter(getterName, library), same(getter));
+  }
+
+  void test_lookUpGetter_undeclared() {
+    // class A {
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA];
+    expect(classA.lookUpGetter("g", library), isNull);
+  }
+
+  void test_lookUpGetter_undeclared_recursive() {
+    // class A extends B {
+    // }
+    // class B extends A {
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    classA.supertype = classB.type;
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB];
+    expect(classA.lookUpGetter("g", library), isNull);
+  }
+
+  void test_lookUpInheritedConcreteGetter_declared() {
+    // class A {
+    //   get g {}
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "g";
+    PropertyAccessorElement getter =
+        ElementFactory.getterElement(getterName, false, null);
+    classA.accessors = <PropertyAccessorElement>[getter];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA];
+    expect(classA.lookUpInheritedConcreteGetter(getterName, library), isNull);
+  }
+
+  void test_lookUpInheritedConcreteGetter_inherited() {
+    // class A {
+    //   get g {}
+    // }
+    // class B extends A {
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "g";
+    PropertyAccessorElement inheritedGetter =
+        ElementFactory.getterElement(getterName, false, null);
+    classA.accessors = <PropertyAccessorElement>[inheritedGetter];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB];
+    expect(classB.lookUpInheritedConcreteGetter(getterName, library),
+        same(inheritedGetter));
+  }
+
+  void test_lookUpInheritedConcreteGetter_undeclared() {
+    // class A {
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA];
+    expect(classA.lookUpInheritedConcreteGetter("g", library), isNull);
+  }
+
+  void test_lookUpInheritedConcreteGetter_undeclared_recursive() {
+    // class A extends B {
+    // }
+    // class B extends A {
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    classA.supertype = classB.type;
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB];
+    expect(classA.lookUpInheritedConcreteGetter("g", library), isNull);
+  }
+
+  void test_lookUpInheritedConcreteMethod_declared() {
+    // class A {
+    //   m() {}
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement method = ElementFactory.methodElement(methodName, null);
+    classA.methods = <MethodElement>[method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA];
+    expect(classA.lookUpInheritedConcreteMethod(methodName, library), isNull);
+  }
+
+  void test_lookUpInheritedConcreteMethod_declaredAbstractAndInherited() {
+    // class A {
+    //   m() {}
+    // }
+    // class B extends A {
+    //   m();
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement inheritedMethod =
+        ElementFactory.methodElement(methodName, null);
+    classA.methods = <MethodElement>[inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    MethodElementImpl method = ElementFactory.methodElement(methodName, null);
+    method.abstract = true;
+    classB.methods = <MethodElement>[method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB];
+    expect(classB.lookUpInheritedConcreteMethod(methodName, library),
+        same(inheritedMethod));
+  }
+
+  void test_lookUpInheritedConcreteMethod_declaredAndInherited() {
+    // class A {
+    //   m() {}
+    // }
+    // class B extends A {
+    //   m() {}
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement inheritedMethod =
+        ElementFactory.methodElement(methodName, null);
+    classA.methods = <MethodElement>[inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    MethodElement method = ElementFactory.methodElement(methodName, null);
+    classB.methods = <MethodElement>[method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB];
+    expect(classB.lookUpInheritedConcreteMethod(methodName, library),
+        same(inheritedMethod));
+  }
+
+  void test_lookUpInheritedConcreteMethod_declaredAndInheritedAbstract() {
+    // abstract class A {
+    //   m();
+    // }
+    // class B extends A {
+    //   m() {}
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.abstract = true;
+    String methodName = "m";
+    MethodElementImpl inheritedMethod =
+        ElementFactory.methodElement(methodName, null);
+    inheritedMethod.abstract = true;
+    classA.methods = <MethodElement>[inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    MethodElement method = ElementFactory.methodElement(methodName, null);
+    classB.methods = <MethodElement>[method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB];
+    expect(classB.lookUpInheritedConcreteMethod(methodName, library), isNull);
+  }
+
+  void test_lookUpInheritedConcreteMethod_declaredAndInheritedWithAbstractBetween() {
+    // class A {
+    //   m() {}
+    // }
+    // class B extends A {
+    //   m();
+    // }
+    // class C extends B {
+    //   m() {}
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement inheritedMethod =
+        ElementFactory.methodElement(methodName, null);
+    classA.methods = <MethodElement>[inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    MethodElementImpl abstractMethod =
+        ElementFactory.methodElement(methodName, null);
+    abstractMethod.abstract = true;
+    classB.methods = <MethodElement>[abstractMethod];
+    ClassElementImpl classC = ElementFactory.classElement("C", classB.type);
+    MethodElementImpl method = ElementFactory.methodElement(methodName, null);
+    classC.methods = <MethodElement>[method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB, classC];
+    expect(classC.lookUpInheritedConcreteMethod(methodName, library),
+        same(inheritedMethod));
+  }
+
+  void test_lookUpInheritedConcreteMethod_inherited() {
+    // class A {
+    //   m() {}
+    // }
+    // class B extends A {
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement inheritedMethod =
+        ElementFactory.methodElement(methodName, null);
+    classA.methods = <MethodElement>[inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB];
+    expect(classB.lookUpInheritedConcreteMethod(methodName, library),
+        same(inheritedMethod));
+  }
+
+  void test_lookUpInheritedConcreteMethod_undeclared() {
+    // class A {
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA];
+    expect(classA.lookUpInheritedConcreteMethod("m", library), isNull);
+  }
+
+  void test_lookUpInheritedConcreteSetter_declared() {
+    // class A {
+    //   set g(x) {}
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String setterName = "s";
+    PropertyAccessorElement setter =
+        ElementFactory.setterElement(setterName, false, null);
+    classA.accessors = <PropertyAccessorElement>[setter];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA];
+    expect(classA.lookUpInheritedConcreteSetter(setterName, library), isNull);
+  }
+
+  void test_lookUpInheritedConcreteSetter_inherited() {
+    // class A {
+    //   set g(x) {}
+    // }
+    // class B extends A {
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String setterName = "s";
+    PropertyAccessorElement setter =
+        ElementFactory.setterElement(setterName, false, null);
+    classA.accessors = <PropertyAccessorElement>[setter];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB];
+    expect(classB.lookUpInheritedConcreteSetter(setterName, library),
+        same(setter));
+  }
+
+  void test_lookUpInheritedConcreteSetter_undeclared() {
+    // class A {
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA];
+    expect(classA.lookUpInheritedConcreteSetter("s", library), isNull);
+  }
+
+  void test_lookUpInheritedConcreteSetter_undeclared_recursive() {
+    // class A extends B {
+    // }
+    // class B extends A {
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    classA.supertype = classB.type;
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB];
+    expect(classA.lookUpInheritedConcreteSetter("s", library), isNull);
+  }
+
+  void test_lookUpInheritedMethod_declared() {
+    // class A {
+    //   m() {}
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement method = ElementFactory.methodElement(methodName, null);
+    classA.methods = <MethodElement>[method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA];
+    expect(classA.lookUpInheritedMethod(methodName, library), isNull);
+  }
+
+  void test_lookUpInheritedMethod_declaredAndInherited() {
+    // class A {
+    //   m() {}
+    // }
+    // class B extends A {
+    //   m() {}
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement inheritedMethod =
+        ElementFactory.methodElement(methodName, null);
+    classA.methods = <MethodElement>[inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    MethodElement method = ElementFactory.methodElement(methodName, null);
+    classB.methods = <MethodElement>[method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB];
+    expect(classB.lookUpInheritedMethod(methodName, library),
+        same(inheritedMethod));
+  }
+
+  void test_lookUpInheritedMethod_inherited() {
+    // class A {
+    //   m() {}
+    // }
+    // class B extends A {
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement inheritedMethod =
+        ElementFactory.methodElement(methodName, null);
+    classA.methods = <MethodElement>[inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB];
+    expect(classB.lookUpInheritedMethod(methodName, library),
+        same(inheritedMethod));
+  }
+
+  void test_lookUpInheritedMethod_undeclared() {
+    // class A {
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA];
+    expect(classA.lookUpInheritedMethod("m", library), isNull);
+  }
+
+  void test_lookUpMethod_declared() {
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement method = ElementFactory.methodElement(methodName, null);
+    classA.methods = <MethodElement>[method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA];
+    expect(classA.lookUpMethod(methodName, library), same(method));
+  }
+
+  void test_lookUpMethod_inherited() {
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement method = ElementFactory.methodElement(methodName, null);
+    classA.methods = <MethodElement>[method];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB];
+    expect(classB.lookUpMethod(methodName, library), same(method));
+  }
+
+  void test_lookUpMethod_undeclared() {
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA];
+    expect(classA.lookUpMethod("m", library), isNull);
+  }
+
+  void test_lookUpMethod_undeclared_recursive() {
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    classA.supertype = classB.type;
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB];
+    expect(classA.lookUpMethod("m", library), isNull);
+  }
+
+  void test_lookUpSetter_declared() {
+    // class A {
+    //   set g(x) {}
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String setterName = "s";
+    PropertyAccessorElement setter =
+        ElementFactory.setterElement(setterName, false, null);
+    classA.accessors = <PropertyAccessorElement>[setter];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA];
+    expect(classA.lookUpSetter(setterName, library), same(setter));
+  }
+
+  void test_lookUpSetter_inherited() {
+    // class A {
+    //   set g(x) {}
+    // }
+    // class B extends A {
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String setterName = "s";
+    PropertyAccessorElement setter =
+        ElementFactory.setterElement(setterName, false, null);
+    classA.accessors = <PropertyAccessorElement>[setter];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB];
+    expect(classB.lookUpSetter(setterName, library), same(setter));
+  }
+
+  void test_lookUpSetter_undeclared() {
+    // class A {
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA];
+    expect(classA.lookUpSetter("s", library), isNull);
+  }
+
+  void test_lookUpSetter_undeclared_recursive() {
+    // class A extends B {
+    // }
+    // class B extends A {
+    // }
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    classA.supertype = classB.type;
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classA, classB];
+    expect(classA.lookUpSetter("s", library), isNull);
+  }
+}
+
+@reflectiveTest
+class CompilationUnitElementImplTest extends EngineTestCase {
+  void test_getElementAt() {
+    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
+    AnalysisContext context = contextHelper.context;
+    String code = r'''
+class A {
+  int field;
+}
+main() {
+  int localVar = 42;
+}
+''';
+    Source libSource = contextHelper.addSource("/my_lib.dart", code);
+    // prepare library/unit elements
+    LibraryElement libraryElement = context.computeLibraryElement(libSource);
+    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
+    // A
+    ClassElement elementA;
+    {
+      int offset = code.indexOf('A {');
+      elementA = unitElement.getElementAt(offset);
+      expect(elementA, isNotNull);
+      expect(elementA.enclosingElement, unitElement);
+      expect(elementA.name, 'A');
+    }
+    // A.field
+    {
+      int offset = code.indexOf('field;');
+      FieldElement element = unitElement.getElementAt(offset);
+      expect(element, isNotNull);
+      expect(element.enclosingElement, elementA);
+      expect(element.name, 'field');
+    }
+    // main
+    FunctionElement mainElement;
+    {
+      int offset = code.indexOf('main() {');
+      mainElement = unitElement.getElementAt(offset);
+      expect(mainElement, isNotNull);
+      expect(mainElement.enclosingElement, unitElement);
+      expect(mainElement.name, 'main');
+    }
+    // main.localVar
+    {
+      int offset = code.indexOf('localVar');
+      LocalVariableElement element = unitElement.getElementAt(offset);
+      expect(element, isNotNull);
+      expect(element.enclosingElement, mainElement);
+      expect(element.name, 'localVar');
+    }
+    // null
+    expect(unitElement.getElementAt(1000), isNull);
+  }
+
+  void test_getElementAt_multipleUnitsInLibrary() {
+    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
+    AnalysisContext context = contextHelper.context;
+    Source libSource = contextHelper.addSource(
+        "/my_lib.dart",
+        r'''
+library my_lib;
+part 'unit_a.dart';
+part 'unit_b.dart';
+''');
+    Source unitSourceA =
+        contextHelper.addSource("/unit_a.dart", 'part of my_lib;class A {}');
+    Source unitSourceB =
+        contextHelper.addSource("/unit_b.dart", 'part of my_lib;class B {}');
+    int offset = 'part of my_lib;class A {}'.indexOf('A {}');
+    // prepare library/unit elements
+    context.computeLibraryElement(libSource);
+    CompilationUnitElement unitElementA =
+        context.getCompilationUnitElement(unitSourceA, libSource);
+    CompilationUnitElement unitElementB =
+        context.getCompilationUnitElement(unitSourceB, libSource);
+    // A
+    {
+      ClassElement element = unitElementA.getElementAt(offset);
+      expect(element, isNotNull);
+      expect(element.enclosingElement, unitElementA);
+      expect(element.name, 'A');
+    }
+    // B
+    {
+      ClassElement element = unitElementB.getElementAt(offset);
+      expect(element, isNotNull);
+      expect(element.enclosingElement, unitElementB);
+      expect(element.name, 'B');
+    }
+  }
+
+  void test_getEnum_declared() {
+    TestTypeProvider typeProvider = new TestTypeProvider();
+    CompilationUnitElementImpl unit =
+        ElementFactory.compilationUnit("/lib.dart");
+    String enumName = "E";
+    ClassElement enumElement =
+        ElementFactory.enumElement(typeProvider, enumName);
+    unit.enums = <ClassElement>[enumElement];
+    expect(unit.getEnum(enumName), same(enumElement));
+  }
+
+  void test_getEnum_undeclared() {
+    TestTypeProvider typeProvider = new TestTypeProvider();
+    CompilationUnitElementImpl unit =
+        ElementFactory.compilationUnit("/lib.dart");
+    String enumName = "E";
+    ClassElement enumElement =
+        ElementFactory.enumElement(typeProvider, enumName);
+    unit.enums = <ClassElement>[enumElement];
+    expect(unit.getEnum("${enumName}x"), isNull);
+  }
+
+  void test_getType_declared() {
+    CompilationUnitElementImpl unit =
+        ElementFactory.compilationUnit("/lib.dart");
+    String className = "C";
+    ClassElement classElement = ElementFactory.classElement2(className);
+    unit.types = <ClassElement>[classElement];
+    expect(unit.getType(className), same(classElement));
+  }
+
+  void test_getType_undeclared() {
+    CompilationUnitElementImpl unit =
+        ElementFactory.compilationUnit("/lib.dart");
+    String className = "C";
+    ClassElement classElement = ElementFactory.classElement2(className);
+    unit.types = <ClassElement>[classElement];
+    expect(unit.getType("${className}x"), isNull);
+  }
+}
+
+@reflectiveTest
+class ElementImplTest extends EngineTestCase {
+  void test_equals() {
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classElement = ElementFactory.classElement2("C");
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classElement];
+    FieldElement field = ElementFactory.fieldElement(
+        "next", false, false, false, classElement.type);
+    classElement.fields = <FieldElement>[field];
+    expect(field == field, isTrue);
+    expect(field == field.getter, isFalse);
+    expect(field == field.setter, isFalse);
+    expect(field.getter == field.setter, isFalse);
+  }
+
+  void test_isAccessibleIn_private_differentLibrary() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library1 = ElementFactory.library(context, "lib1");
+    ClassElement classElement = ElementFactory.classElement2("_C");
+    (library1.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classElement];
+    LibraryElementImpl library2 = ElementFactory.library(context, "lib2");
+    expect(classElement.isAccessibleIn(library2), isFalse);
+  }
+
+  void test_isAccessibleIn_private_sameLibrary() {
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElement classElement = ElementFactory.classElement2("_C");
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classElement];
+    expect(classElement.isAccessibleIn(library), isTrue);
+  }
+
+  void test_isAccessibleIn_public_differentLibrary() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library1 = ElementFactory.library(context, "lib1");
+    ClassElement classElement = ElementFactory.classElement2("C");
+    (library1.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classElement];
+    LibraryElementImpl library2 = ElementFactory.library(context, "lib2");
+    expect(classElement.isAccessibleIn(library2), isTrue);
+  }
+
+  void test_isAccessibleIn_public_sameLibrary() {
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElement classElement = ElementFactory.classElement2("C");
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types =
+        <ClassElement>[classElement];
+    expect(classElement.isAccessibleIn(library), isTrue);
+  }
+
+  void test_isPrivate_false() {
+    Element element = ElementFactory.classElement2("C");
+    expect(element.isPrivate, isFalse);
+  }
+
+  void test_isPrivate_null() {
+    Element element = ElementFactory.classElement2(null);
+    expect(element.isPrivate, isTrue);
+  }
+
+  void test_isPrivate_true() {
+    Element element = ElementFactory.classElement2("_C");
+    expect(element.isPrivate, isTrue);
+  }
+
+  void test_isPublic_false() {
+    Element element = ElementFactory.classElement2("_C");
+    expect(element.isPublic, isFalse);
+  }
+
+  void test_isPublic_null() {
+    Element element = ElementFactory.classElement2(null);
+    expect(element.isPublic, isFalse);
+  }
+
+  void test_isPublic_true() {
+    Element element = ElementFactory.classElement2("C");
+    expect(element.isPublic, isTrue);
+  }
+
+  void test_SORT_BY_OFFSET() {
+    ClassElementImpl classElementA = ElementFactory.classElement2("A");
+    classElementA.nameOffset = 1;
+    ClassElementImpl classElementB = ElementFactory.classElement2("B");
+    classElementB.nameOffset = 2;
+    expect(Element.SORT_BY_OFFSET(classElementA, classElementA), 0);
+    expect(Element.SORT_BY_OFFSET(classElementA, classElementB) < 0, isTrue);
+    expect(Element.SORT_BY_OFFSET(classElementB, classElementA) > 0, isTrue);
+  }
+}
+
+@reflectiveTest
+class ElementKindTest extends EngineTestCase {
+  void test_of_nonNull() {
+    expect(ElementKind.of(ElementFactory.classElement2("A")),
+        same(ElementKind.CLASS));
+  }
+
+  void test_of_null() {
+    expect(ElementKind.of(null), same(ElementKind.ERROR));
+  }
+}
+
+@reflectiveTest
+class ElementLocationImplTest extends EngineTestCase {
+  void test_create_encoding() {
+    String encoding = "a;b;c";
+    ElementLocationImpl location = new ElementLocationImpl.con2(encoding);
+    expect(location.encoding, encoding);
+  }
+
+  /**
+   * For example unnamed constructor.
+   */
+  void test_create_encoding_emptyLast() {
+    String encoding = "a;b;c;";
+    ElementLocationImpl location = new ElementLocationImpl.con2(encoding);
+    expect(location.encoding, encoding);
+  }
+
+  void test_equals_equal() {
+    String encoding = "a;b;c";
+    ElementLocationImpl first = new ElementLocationImpl.con2(encoding);
+    ElementLocationImpl second = new ElementLocationImpl.con2(encoding);
+    expect(first == second, isTrue);
+  }
+
+  void test_equals_notEqual_differentLengths() {
+    ElementLocationImpl first = new ElementLocationImpl.con2("a;b;c");
+    ElementLocationImpl second = new ElementLocationImpl.con2("a;b;c;d");
+    expect(first == second, isFalse);
+  }
+
+  void test_equals_notEqual_notLocation() {
+    ElementLocationImpl first = new ElementLocationImpl.con2("a;b;c");
+    expect(first == "a;b;d", isFalse);
+  }
+
+  void test_equals_notEqual_sameLengths() {
+    ElementLocationImpl first = new ElementLocationImpl.con2("a;b;c");
+    ElementLocationImpl second = new ElementLocationImpl.con2("a;b;d");
+    expect(first == second, isFalse);
+  }
+
+  void test_getComponents() {
+    String encoding = "a;b;c";
+    ElementLocationImpl location = new ElementLocationImpl.con2(encoding);
+    List<String> components = location.components;
+    expect(components, hasLength(3));
+    expect(components[0], "a");
+    expect(components[1], "b");
+    expect(components[2], "c");
+  }
+
+  void test_getEncoding() {
+    String encoding = "a;b;c;;d";
+    ElementLocationImpl location = new ElementLocationImpl.con2(encoding);
+    expect(location.encoding, encoding);
+  }
+
+  void test_hashCode_equal() {
+    String encoding = "a;b;c";
+    ElementLocationImpl first = new ElementLocationImpl.con2(encoding);
+    ElementLocationImpl second = new ElementLocationImpl.con2(encoding);
+    expect(first.hashCode == second.hashCode, isTrue);
+  }
+}
+
+@reflectiveTest
+class FieldElementImplTest extends EngineTestCase {
+  void test_computeNode() {
+    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
+    AnalysisContext context = contextHelper.context;
+    Source source = contextHelper.addSource(
+        "/test.dart",
+        r'''
+class A {
+  int a;
+}
+enum B {B1, B2, B3}''');
+    // prepare CompilationUnitElement
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
+    // A
+    {
+      FieldElement elementA = unitElement.getType("A").getField('a');
+      VariableDeclaration nodeA = elementA.computeNode();
+      expect(nodeA, isNotNull);
+      expect(nodeA.name.name, "a");
+      expect(nodeA.element, same(elementA));
+    }
+    // B
+    {
+      FieldElement elementB = unitElement.getEnum("B").getField('B2');
+      EnumConstantDeclaration nodeB = elementB.computeNode();
+      expect(nodeB, isNotNull);
+      expect(nodeB.name.name, "B2");
+      expect(nodeB.element, same(elementB));
+    }
+  }
+}
+
+@reflectiveTest
+class FunctionTypeImplTest extends EngineTestCase {
+  void test_creation() {
+    expect(
+        new FunctionTypeImpl(
+            new FunctionElementImpl.forNode(AstFactory.identifier3("f"))),
+        isNotNull);
+  }
+
+  void test_equality_recursive() {
+    FunctionTypeAliasElementImpl s =
+        ElementFactory.functionTypeAliasElement('s');
+    FunctionTypeAliasElementImpl t =
+        ElementFactory.functionTypeAliasElement('t');
+    FunctionTypeAliasElementImpl u =
+        ElementFactory.functionTypeAliasElement('u');
+    FunctionTypeAliasElementImpl v =
+        ElementFactory.functionTypeAliasElement('v');
+    s.returnType = t.type;
+    t.returnType = s.type;
+    u.returnType = v.type;
+    v.returnType = u.type;
+    // We don't care whether the types compare equal or not.  We just need the
+    // computation to terminate.
+    expect(s.type == u.type, new isInstanceOf<bool>());
+  }
+
+  void test_getElement() {
+    FunctionElementImpl typeElement =
+        new FunctionElementImpl.forNode(AstFactory.identifier3("f"));
+    FunctionTypeImpl type = new FunctionTypeImpl(typeElement);
+    expect(type.element, typeElement);
+  }
+
+  void test_getNamedParameterTypes() {
+    FunctionTypeImpl type = new FunctionTypeImpl(
+        new FunctionElementImpl.forNode(AstFactory.identifier3("f")));
+    Map<String, DartType> types = type.namedParameterTypes;
+    expect(types, hasLength(0));
+  }
+
+  void test_getNormalParameterTypes() {
+    FunctionTypeImpl type = new FunctionTypeImpl(
+        new FunctionElementImpl.forNode(AstFactory.identifier3("f")));
+    List<DartType> types = type.normalParameterTypes;
+    expect(types, hasLength(0));
+  }
+
+  void test_getReturnType() {
+    DartType expectedReturnType = VoidTypeImpl.instance;
+    FunctionElementImpl functionElement =
+        new FunctionElementImpl.forNode(AstFactory.identifier3("f"));
+    functionElement.returnType = expectedReturnType;
+    FunctionTypeImpl type = new FunctionTypeImpl(functionElement);
+    DartType returnType = type.returnType;
+    expect(returnType, expectedReturnType);
+  }
+
+  void test_getTypeArguments() {
+    FunctionTypeImpl type = new FunctionTypeImpl(
+        new FunctionElementImpl.forNode(AstFactory.identifier3("f")));
+    List<DartType> types = type.typeArguments;
+    expect(types, hasLength(0));
+  }
+
+  void test_hashCode_element() {
+    FunctionTypeImpl type = new FunctionTypeImpl(
+        new FunctionElementImpl.forNode(AstFactory.identifier3("f")));
+    type.hashCode;
+  }
+
+  void test_hashCode_noElement() {
+    FunctionTypeImpl type = new FunctionTypeImpl(null);
+    type.hashCode;
+  }
+
+  void test_hashCode_recursive() {
+    FunctionTypeAliasElementImpl s =
+        ElementFactory.functionTypeAliasElement('s');
+    FunctionTypeAliasElementImpl t =
+        ElementFactory.functionTypeAliasElement('t');
+    s.returnType = t.type;
+    t.returnType = s.type;
+    // We don't care what the hash code is.  We just need its computation to
+    // terminate.
+    expect(t.type.hashCode, new isInstanceOf<int>());
+  }
+
+  void test_isAssignableTo_normalAndPositionalArgs() {
+    // ([a]) -> void <: (a) -> void
+    ClassElement a = ElementFactory.classElement2("A");
+    FunctionType t =
+        ElementFactory.functionElement6("t", null, <ClassElement>[a]).type;
+    FunctionType s =
+        ElementFactory.functionElement5("s", <ClassElement>[a]).type;
+    expect(t.isSubtypeOf(s), isTrue);
+    expect(s.isSubtypeOf(t), isFalse);
+    // assignable iff subtype
+    expect(t.isAssignableTo(s), isTrue);
+    expect(s.isAssignableTo(t), isFalse);
+  }
+
+  void test_isSubtypeOf_baseCase_classFunction() {
+    // () -> void <: Function
+    ClassElementImpl functionElement = ElementFactory.classElement2("Function");
+    InterfaceTypeImpl functionType =
+        new _FunctionTypeImplTest_isSubtypeOf_baseCase_classFunction(
+            functionElement);
+    FunctionType f = ElementFactory.functionElement("f").type;
+    expect(f.isSubtypeOf(functionType), isTrue);
+  }
+
+  void test_isSubtypeOf_baseCase_notFunctionType() {
+    // class C
+    // ! () -> void <: C
+    FunctionType f = ElementFactory.functionElement("f").type;
+    InterfaceType t = ElementFactory.classElement2("C").type;
+    expect(f.isSubtypeOf(t), isFalse);
+  }
+
+  void test_isSubtypeOf_baseCase_null() {
+    // ! () -> void <: null
+    FunctionType f = ElementFactory.functionElement("f").type;
+    expect(f.isSubtypeOf(null), isFalse);
+  }
+
+  void test_isSubtypeOf_baseCase_self() {
+    // () -> void <: () -> void
+    FunctionType f = ElementFactory.functionElement("f").type;
+    expect(f.isSubtypeOf(f), isTrue);
+  }
+
+  void test_isSubtypeOf_namedParameters_isAssignable() {
+    // B extends A
+    // ({name: A}) -> void <: ({name: B}) -> void
+    // ({name: B}) -> void <: ({name: A}) -> void
+    ClassElement a = ElementFactory.classElement2("A");
+    ClassElement b = ElementFactory.classElement("B", a.type);
+    FunctionType t = ElementFactory.functionElement4(
+        "t", null, null, <String>["name"], <ClassElement>[a]).type;
+    FunctionType s = ElementFactory.functionElement4(
+        "s", null, null, <String>["name"], <ClassElement>[b]).type;
+    expect(t.isSubtypeOf(s), isTrue);
+    expect(s.isSubtypeOf(t), isTrue);
+  }
+
+  void test_isSubtypeOf_namedParameters_isNotAssignable() {
+    // ! ({name: A}) -> void <: ({name: B}) -> void
+    FunctionType t = ElementFactory.functionElement4(
+        "t",
+        null,
+        null,
+        <String>["name"],
+        <ClassElement>[ElementFactory.classElement2("A")]).type;
+    FunctionType s = ElementFactory.functionElement4(
+        "s",
+        null,
+        null,
+        <String>["name"],
+        <ClassElement>[ElementFactory.classElement2("B")]).type;
+    expect(t.isSubtypeOf(s), isFalse);
+  }
+
+  void test_isSubtypeOf_namedParameters_namesDifferent() {
+    // B extends A
+    // void t({A name}) {}
+    // void s({A diff}) {}
+    // ! t <: s
+    // ! s <: t
+    ClassElement a = ElementFactory.classElement2("A");
+    ClassElement b = ElementFactory.classElement("B", a.type);
+    FunctionType t = ElementFactory.functionElement4(
+        "t", null, null, <String>["name"], <ClassElement>[a]).type;
+    FunctionType s = ElementFactory.functionElement4(
+        "s", null, null, <String>["diff"], <ClassElement>[b]).type;
+    expect(t.isSubtypeOf(s), isFalse);
+    expect(s.isSubtypeOf(t), isFalse);
+  }
+
+  void test_isSubtypeOf_namedParameters_orderOfParams() {
+    // B extends A
+    // ({A: A, B: B}) -> void <: ({B: B, A: A}) -> void
+    ClassElement a = ElementFactory.classElement2("A");
+    ClassElement b = ElementFactory.classElement("B", a.type);
+    FunctionType t = ElementFactory.functionElement4(
+        "t", null, null, <String>["A", "B"], <ClassElement>[a, b]).type;
+    FunctionType s = ElementFactory.functionElement4(
+        "s", null, null, <String>["B", "A"], <ClassElement>[b, a]).type;
+    expect(t.isSubtypeOf(s), isTrue);
+  }
+
+  void test_isSubtypeOf_namedParameters_orderOfParams2() {
+    // B extends A
+    // ! ({B: B}) -> void <: ({B: B, A: A}) -> void
+    ClassElement a = ElementFactory.classElement2("A");
+    ClassElement b = ElementFactory.classElement("B", a.type);
+    FunctionType t = ElementFactory.functionElement4(
+        "t", null, null, <String>["B"], <ClassElement>[b]).type;
+    FunctionType s = ElementFactory.functionElement4(
+        "s", null, null, <String>["B", "A"], <ClassElement>[b, a]).type;
+    expect(t.isSubtypeOf(s), isFalse);
+  }
+
+  void test_isSubtypeOf_namedParameters_orderOfParams3() {
+    // B extends A
+    // ({A: A, B: B}) -> void <: ({A: A}) -> void
+    ClassElement a = ElementFactory.classElement2("A");
+    ClassElement b = ElementFactory.classElement("B", a.type);
+    FunctionType t = ElementFactory.functionElement4(
+        "t", null, null, <String>["A", "B"], <ClassElement>[a, b]).type;
+    FunctionType s = ElementFactory.functionElement4(
+        "s", null, null, <String>["B"], <ClassElement>[b]).type;
+    expect(t.isSubtypeOf(s), isTrue);
+  }
+
+  void test_isSubtypeOf_namedParameters_sHasMoreParams() {
+    // B extends A
+    // ! ({name: A}) -> void <: ({name: B, name2: B}) -> void
+    ClassElement a = ElementFactory.classElement2("A");
+    ClassElement b = ElementFactory.classElement("B", a.type);
+    FunctionType t = ElementFactory.functionElement4(
+        "t", null, null, <String>["name"], <ClassElement>[a]).type;
+    FunctionType s = ElementFactory.functionElement4(
+        "s", null, null, <String>["name", "name2"], <ClassElement>[b, b]).type;
+    expect(t.isSubtypeOf(s), isFalse);
+  }
+
+  void test_isSubtypeOf_namedParameters_tHasMoreParams() {
+    // B extends A
+    // ({name: A, name2: A}) -> void <: ({name: B}) -> void
+    ClassElement a = ElementFactory.classElement2("A");
+    ClassElement b = ElementFactory.classElement("B", a.type);
+    FunctionType t = ElementFactory.functionElement4(
+        "t", null, null, <String>["name", "name2"], <ClassElement>[a, a]).type;
+    FunctionType s = ElementFactory.functionElement4(
+        "s", null, null, <String>["name"], <ClassElement>[b]).type;
+    expect(t.isSubtypeOf(s), isTrue);
+  }
+
+  void test_isSubtypeOf_normalAndPositionalArgs_1() {
+    // ([a]) -> void <: (a) -> void
+    ClassElement a = ElementFactory.classElement2("A");
+    FunctionType t =
+        ElementFactory.functionElement6("t", null, <ClassElement>[a]).type;
+    FunctionType s =
+        ElementFactory.functionElement5("s", <ClassElement>[a]).type;
+    expect(t.isSubtypeOf(s), isTrue);
+    expect(s.isSubtypeOf(t), isFalse);
+  }
+
+  void test_isSubtypeOf_normalAndPositionalArgs_2() {
+    // (a, [a]) -> void <: (a) -> void
+    ClassElement a = ElementFactory.classElement2("A");
+    FunctionType t = ElementFactory
+        .functionElement6("t", <ClassElement>[a], <ClassElement>[a]).type;
+    FunctionType s =
+        ElementFactory.functionElement5("s", <ClassElement>[a]).type;
+    expect(t.isSubtypeOf(s), isTrue);
+    expect(s.isSubtypeOf(t), isFalse);
+  }
+
+  void test_isSubtypeOf_normalAndPositionalArgs_3() {
+    // ([a]) -> void <: () -> void
+    ClassElement a = ElementFactory.classElement2("A");
+    FunctionType t =
+        ElementFactory.functionElement6("t", null, <ClassElement>[a]).type;
+    FunctionType s = ElementFactory.functionElement("s").type;
+    expect(t.isSubtypeOf(s), isTrue);
+    expect(s.isSubtypeOf(t), isFalse);
+  }
+
+  void test_isSubtypeOf_normalAndPositionalArgs_4() {
+    // (a, b, [c, d, e]) -> void <: (a, b, c, [d]) -> void
+    ClassElement a = ElementFactory.classElement2("A");
+    ClassElement b = ElementFactory.classElement2("B");
+    ClassElement c = ElementFactory.classElement2("C");
+    ClassElement d = ElementFactory.classElement2("D");
+    ClassElement e = ElementFactory.classElement2("E");
+    FunctionType t = ElementFactory.functionElement6(
+        "t", <ClassElement>[a, b], <ClassElement>[c, d, e]).type;
+    FunctionType s = ElementFactory
+        .functionElement6("s", <ClassElement>[a, b, c], <ClassElement>[d]).type;
+    expect(t.isSubtypeOf(s), isTrue);
+    expect(s.isSubtypeOf(t), isFalse);
+  }
+
+  void test_isSubtypeOf_normalParameters_isAssignable() {
+    // B extends A
+    // (a) -> void <: (b) -> void
+    // (b) -> void <: (a) -> void
+    ClassElement a = ElementFactory.classElement2("A");
+    ClassElement b = ElementFactory.classElement("B", a.type);
+    FunctionType t =
+        ElementFactory.functionElement5("t", <ClassElement>[a]).type;
+    FunctionType s =
+        ElementFactory.functionElement5("s", <ClassElement>[b]).type;
+    expect(t.isSubtypeOf(s), isTrue);
+    expect(s.isSubtypeOf(t), isTrue);
+  }
+
+  void test_isSubtypeOf_normalParameters_isNotAssignable() {
+    // ! (a) -> void <: (b) -> void
+    FunctionType t = ElementFactory.functionElement5(
+        "t", <ClassElement>[ElementFactory.classElement2("A")]).type;
+    FunctionType s = ElementFactory.functionElement5(
+        "s", <ClassElement>[ElementFactory.classElement2("B")]).type;
+    expect(t.isSubtypeOf(s), isFalse);
+  }
+
+  void test_isSubtypeOf_normalParameters_sHasMoreParams() {
+    // B extends A
+    // ! (a) -> void <: (b, b) -> void
+    ClassElement a = ElementFactory.classElement2("A");
+    ClassElement b = ElementFactory.classElement("B", a.type);
+    FunctionType t =
+        ElementFactory.functionElement5("t", <ClassElement>[a]).type;
+    FunctionType s =
+        ElementFactory.functionElement5("s", <ClassElement>[b, b]).type;
+    expect(t.isSubtypeOf(s), isFalse);
+  }
+
+  void test_isSubtypeOf_normalParameters_tHasMoreParams() {
+    // B extends A
+    // ! (a, a) -> void <: (a) -> void
+    ClassElement a = ElementFactory.classElement2("A");
+    ClassElement b = ElementFactory.classElement("B", a.type);
+    FunctionType t =
+        ElementFactory.functionElement5("t", <ClassElement>[a, a]).type;
+    FunctionType s =
+        ElementFactory.functionElement5("s", <ClassElement>[b]).type;
+    // note, this is a different assertion from the other "tHasMoreParams"
+    // tests, this is intentional as it is a difference of the "normal
+    // parameters"
+    expect(t.isSubtypeOf(s), isFalse);
+  }
+
+  void test_isSubtypeOf_Object() {
+    // () -> void <: Object
+    FunctionType f = ElementFactory.functionElement("f").type;
+    InterfaceType t = ElementFactory.object.type;
+    expect(f.isSubtypeOf(t), isTrue);
+  }
+
+  void test_isSubtypeOf_positionalParameters_isAssignable() {
+    // B extends A
+    // ([a]) -> void <: ([b]) -> void
+    // ([b]) -> void <: ([a]) -> void
+    ClassElement a = ElementFactory.classElement2("A");
+    ClassElement b = ElementFactory.classElement("B", a.type);
+    FunctionType t =
+        ElementFactory.functionElement6("t", null, <ClassElement>[a]).type;
+    FunctionType s =
+        ElementFactory.functionElement6("s", null, <ClassElement>[b]).type;
+    expect(t.isSubtypeOf(s), isTrue);
+    expect(s.isSubtypeOf(t), isTrue);
+  }
+
+  void test_isSubtypeOf_positionalParameters_isNotAssignable() {
+    // ! ([a]) -> void <: ([b]) -> void
+    FunctionType t = ElementFactory.functionElement6(
+        "t", null, <ClassElement>[ElementFactory.classElement2("A")]).type;
+    FunctionType s = ElementFactory.functionElement6(
+        "s", null, <ClassElement>[ElementFactory.classElement2("B")]).type;
+    expect(t.isSubtypeOf(s), isFalse);
+  }
+
+  void test_isSubtypeOf_positionalParameters_sHasMoreParams() {
+    // B extends A
+    // ! ([a]) -> void <: ([b, b]) -> void
+    ClassElement a = ElementFactory.classElement2("A");
+    ClassElement b = ElementFactory.classElement("B", a.type);
+    FunctionType t =
+        ElementFactory.functionElement6("t", null, <ClassElement>[a]).type;
+    FunctionType s =
+        ElementFactory.functionElement6("s", null, <ClassElement>[b, b]).type;
+    expect(t.isSubtypeOf(s), isFalse);
+  }
+
+  void test_isSubtypeOf_positionalParameters_tHasMoreParams() {
+    // B extends A
+    // ([a, a]) -> void <: ([b]) -> void
+    ClassElement a = ElementFactory.classElement2("A");
+    ClassElement b = ElementFactory.classElement("B", a.type);
+    FunctionType t =
+        ElementFactory.functionElement6("t", null, <ClassElement>[a, a]).type;
+    FunctionType s =
+        ElementFactory.functionElement6("s", null, <ClassElement>[b]).type;
+    expect(t.isSubtypeOf(s), isTrue);
+  }
+
+  void test_isSubtypeOf_returnType_sIsVoid() {
+    // () -> void <: void
+    FunctionType t = ElementFactory.functionElement("t").type;
+    FunctionType s = ElementFactory.functionElement("s").type;
+    // function s has the implicit return type of void, we assert it here
+    expect(VoidTypeImpl.instance == s.returnType, isTrue);
+    expect(t.isSubtypeOf(s), isTrue);
+  }
+
+  void test_isSubtypeOf_returnType_tAssignableToS() {
+    // B extends A
+    // () -> A <: () -> B
+    // () -> B <: () -> A
+    ClassElement a = ElementFactory.classElement2("A");
+    ClassElement b = ElementFactory.classElement("B", a.type);
+    FunctionType t = ElementFactory.functionElement2("t", a).type;
+    FunctionType s = ElementFactory.functionElement2("s", b).type;
+    expect(t.isSubtypeOf(s), isTrue);
+    expect(s.isSubtypeOf(t), isTrue);
+  }
+
+  void test_isSubtypeOf_returnType_tNotAssignableToS() {
+    // ! () -> A <: () -> B
+    FunctionType t = ElementFactory
+        .functionElement2("t", ElementFactory.classElement2("A"))
+        .type;
+    FunctionType s = ElementFactory
+        .functionElement2("s", ElementFactory.classElement2("B"))
+        .type;
+    expect(t.isSubtypeOf(s), isFalse);
+  }
+
+  void test_isSubtypeOf_typeParameters_matchesBounds() {
+    TestTypeProvider provider = new TestTypeProvider();
+    InterfaceType boolType = provider.boolType;
+    InterfaceType stringType = provider.stringType;
+    TypeParameterElementImpl parameterB =
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("B"));
+    parameterB.bound = boolType;
+    TypeParameterTypeImpl typeB = new TypeParameterTypeImpl(parameterB);
+    TypeParameterElementImpl parameterS =
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("S"));
+    parameterS.bound = stringType;
+    TypeParameterTypeImpl typeS = new TypeParameterTypeImpl(parameterS);
+    FunctionElementImpl functionAliasElement =
+        new FunctionElementImpl.forNode(AstFactory.identifier3("func"));
+    functionAliasElement.parameters = <ParameterElement>[
+      ElementFactory.requiredParameter2("a", typeB),
+      ElementFactory.positionalParameter2("b", typeS)
+    ];
+    functionAliasElement.returnType = stringType;
+    FunctionTypeImpl functionAliasType =
+        new FunctionTypeImpl(functionAliasElement);
+    functionAliasElement.type = functionAliasType;
+    FunctionElementImpl functionElement =
+        new FunctionElementImpl.forNode(AstFactory.identifier3("f"));
+    functionElement.parameters = <ParameterElement>[
+      ElementFactory.requiredParameter2("c", boolType),
+      ElementFactory.positionalParameter2("d", stringType)
+    ];
+    functionElement.returnType = provider.dynamicType;
+    FunctionTypeImpl functionType = new FunctionTypeImpl(functionElement);
+    functionElement.type = functionType;
+    expect(functionType.isAssignableTo(functionAliasType), isTrue);
+  }
+
+  void test_isSubtypeOf_wrongFunctionType_normal_named() {
+    // ! (a) -> void <: ({name: A}) -> void
+    // ! ({name: A}) -> void <: (a) -> void
+    ClassElement a = ElementFactory.classElement2("A");
+    FunctionType t =
+        ElementFactory.functionElement5("t", <ClassElement>[a]).type;
+    FunctionType s = ElementFactory
+        .functionElement7("s", null, <String>["name"], <ClassElement>[a]).type;
+    expect(t.isSubtypeOf(s), isFalse);
+    expect(s.isSubtypeOf(t), isFalse);
+  }
+
+  void test_isSubtypeOf_wrongFunctionType_optional_named() {
+    // ! ([a]) -> void <: ({name: A}) -> void
+    // ! ({name: A}) -> void <: ([a]) -> void
+    ClassElement a = ElementFactory.classElement2("A");
+    FunctionType t =
+        ElementFactory.functionElement6("t", null, <ClassElement>[a]).type;
+    FunctionType s = ElementFactory
+        .functionElement7("s", null, <String>["name"], <ClassElement>[a]).type;
+    expect(t.isSubtypeOf(s), isFalse);
+    expect(s.isSubtypeOf(t), isFalse);
+  }
+
+  void test_namedParameterTypes_pruned_no_type_arguments() {
+    FunctionTypeAliasElementImpl f =
+        ElementFactory.functionTypeAliasElement('f');
+    FunctionTypeAliasElementImpl g =
+        ElementFactory.functionTypeAliasElement('g');
+    f.parameters = [ElementFactory.namedParameter2('x', g.type)];
+    FunctionTypeImpl paramType = f.type.namedParameterTypes['x'];
+    expect(paramType.prunedTypedefs, hasLength(1));
+    expect(paramType.prunedTypedefs[0], same(f));
+  }
+
+  void test_namedParameterTypes_pruned_with_type_arguments() {
+    FunctionTypeAliasElementImpl f =
+        ElementFactory.functionTypeAliasElement('f');
+    FunctionTypeAliasElementImpl g =
+        ElementFactory.functionTypeAliasElement('g');
+    f.typeParameters = [ElementFactory.typeParameterElement('T')];
+    f.parameters = [ElementFactory.namedParameter2('x', g.type)];
+    FunctionTypeImpl paramType = f.type.namedParameterTypes['x'];
+    expect(paramType.prunedTypedefs, hasLength(1));
+    expect(paramType.prunedTypedefs[0], same(f));
+  }
+
+  void test_newPrune_no_previous_prune() {
+    FunctionTypeAliasElementImpl f =
+        ElementFactory.functionTypeAliasElement('f');
+    FunctionTypeImpl type = f.type;
+    List<FunctionTypeAliasElement> pruneList = type.newPrune;
+    expect(pruneList, hasLength(1));
+    expect(pruneList[0], same(f));
+  }
+
+  void test_newPrune_non_typedef() {
+    // No pruning needs to be done for function types that aren't associated
+    // with typedefs because those types can't be directly referred to by the
+    // user (and hence can't participate in circularities).
+    FunctionElementImpl f = ElementFactory.functionElement('f');
+    FunctionTypeImpl type = f.type;
+    expect(type.newPrune, isNull);
+  }
+
+  void test_newPrune_synthetic_typedef() {
+    // No pruning needs to be done for function types that are associated with
+    // synthetic typedefs because those types are only created for
+    // function-typed formal parameters, which can't be directly referred to by
+    // the user (and hence can't participate in circularities).
+    FunctionTypeAliasElementImpl f =
+        ElementFactory.functionTypeAliasElement('f');
+    f.synthetic = true;
+    FunctionTypeImpl type = f.type;
+    expect(type.newPrune, isNull);
+  }
+
+  void test_newPrune_with_previous_prune() {
+    FunctionTypeAliasElementImpl f =
+        ElementFactory.functionTypeAliasElement('f');
+    FunctionTypeAliasElementImpl g =
+        ElementFactory.functionTypeAliasElement('g');
+    FunctionTypeImpl type = f.type;
+    FunctionTypeImpl prunedType = type.pruned([g]);
+    List<FunctionTypeAliasElement> pruneList = prunedType.newPrune;
+    expect(pruneList, hasLength(2));
+    expect(pruneList, contains(f));
+    expect(pruneList, contains(g));
+  }
+
+  void test_normalParameterTypes_pruned_no_type_arguments() {
+    FunctionTypeAliasElementImpl f =
+        ElementFactory.functionTypeAliasElement('f');
+    FunctionTypeAliasElementImpl g =
+        ElementFactory.functionTypeAliasElement('g');
+    f.parameters = [ElementFactory.requiredParameter2('x', g.type)];
+    FunctionTypeImpl paramType = f.type.normalParameterTypes[0];
+    expect(paramType.prunedTypedefs, hasLength(1));
+    expect(paramType.prunedTypedefs[0], same(f));
+  }
+
+  void test_normalParameterTypes_pruned_with_type_arguments() {
+    FunctionTypeAliasElementImpl f =
+        ElementFactory.functionTypeAliasElement('f');
+    FunctionTypeAliasElementImpl g =
+        ElementFactory.functionTypeAliasElement('g');
+    f.typeParameters = [ElementFactory.typeParameterElement('T')];
+    f.parameters = [ElementFactory.requiredParameter2('x', g.type)];
+    FunctionTypeImpl paramType = f.type.normalParameterTypes[0];
+    expect(paramType.prunedTypedefs, hasLength(1));
+    expect(paramType.prunedTypedefs[0], same(f));
+  }
+
+  void test_optionalParameterTypes_pruned_no_type_arguments() {
+    FunctionTypeAliasElementImpl f =
+        ElementFactory.functionTypeAliasElement('f');
+    FunctionTypeAliasElementImpl g =
+        ElementFactory.functionTypeAliasElement('g');
+    f.parameters = [ElementFactory.positionalParameter2('x', g.type)];
+    FunctionTypeImpl paramType = f.type.optionalParameterTypes[0];
+    expect(paramType.prunedTypedefs, hasLength(1));
+    expect(paramType.prunedTypedefs[0], same(f));
+  }
+
+  void test_optionalParameterTypes_pruned_with_type_arguments() {
+    FunctionTypeAliasElementImpl f =
+        ElementFactory.functionTypeAliasElement('f');
+    FunctionTypeAliasElementImpl g =
+        ElementFactory.functionTypeAliasElement('g');
+    f.typeParameters = [ElementFactory.typeParameterElement('T')];
+    f.parameters = [ElementFactory.positionalParameter2('x', g.type)];
+    FunctionTypeImpl paramType = f.type.optionalParameterTypes[0];
+    expect(paramType.prunedTypedefs, hasLength(1));
+    expect(paramType.prunedTypedefs[0], same(f));
+  }
+
+  void test_returnType_pruned_no_type_arguments() {
+    FunctionTypeAliasElementImpl f =
+        ElementFactory.functionTypeAliasElement('f');
+    FunctionTypeAliasElementImpl g =
+        ElementFactory.functionTypeAliasElement('g');
+    f.returnType = g.type;
+    FunctionTypeImpl paramType = f.type.returnType;
+    expect(paramType.prunedTypedefs, hasLength(1));
+    expect(paramType.prunedTypedefs[0], same(f));
+  }
+
+  void test_returnType_pruned_with_type_arguments() {
+    FunctionTypeAliasElementImpl f =
+        ElementFactory.functionTypeAliasElement('f');
+    FunctionTypeAliasElementImpl g =
+        ElementFactory.functionTypeAliasElement('g');
+    f.typeParameters = [ElementFactory.typeParameterElement('T')];
+    f.returnType = g.type;
+    FunctionTypeImpl paramType = f.type.returnType;
+    expect(paramType.prunedTypedefs, hasLength(1));
+    expect(paramType.prunedTypedefs[0], same(f));
+  }
+
+  void test_setTypeArguments() {
+    ClassElementImpl enclosingClass = ElementFactory.classElement2("C", ["E"]);
+    MethodElementImpl methodElement =
+        new MethodElementImpl.forNode(AstFactory.identifier3("m"));
+    enclosingClass.methods = <MethodElement>[methodElement];
+    FunctionTypeImpl type = new FunctionTypeImpl(methodElement);
+    DartType expectedType = enclosingClass.typeParameters[0].type;
+    type.typeArguments = <DartType>[expectedType];
+    List<DartType> arguments = type.typeArguments;
+    expect(arguments, hasLength(1));
+    expect(arguments[0], expectedType);
+  }
+
+  void test_substitute2_equal() {
+    ClassElementImpl definingClass = ElementFactory.classElement2("C", ["E"]);
+    TypeParameterType parameterType = definingClass.typeParameters[0].type;
+    MethodElementImpl functionElement =
+        new MethodElementImpl.forNode(AstFactory.identifier3("m"));
+    String namedParameterName = "c";
+    functionElement.parameters = <ParameterElement>[
+      ElementFactory.requiredParameter2("a", parameterType),
+      ElementFactory.positionalParameter2("b", parameterType),
+      ElementFactory.namedParameter2(namedParameterName, parameterType)
+    ];
+    functionElement.returnType = parameterType;
+    definingClass.methods = <MethodElement>[functionElement];
+    FunctionTypeImpl functionType = new FunctionTypeImpl(functionElement);
+    functionType.typeArguments = <DartType>[parameterType];
+    InterfaceTypeImpl argumentType = new InterfaceTypeImpl(
+        new ClassElementImpl.forNode(AstFactory.identifier3("D")));
+    FunctionType result = functionType.substitute2(
+        <DartType>[argumentType], <DartType>[parameterType]);
+    expect(result.returnType, argumentType);
+    List<DartType> normalParameters = result.normalParameterTypes;
+    expect(normalParameters, hasLength(1));
+    expect(normalParameters[0], argumentType);
+    List<DartType> optionalParameters = result.optionalParameterTypes;
+    expect(optionalParameters, hasLength(1));
+    expect(optionalParameters[0], argumentType);
+    Map<String, DartType> namedParameters = result.namedParameterTypes;
+    expect(namedParameters, hasLength(1));
+    expect(namedParameters[namedParameterName], argumentType);
+  }
+
+  void test_substitute2_notEqual() {
+    DartType returnType = new InterfaceTypeImpl(
+        new ClassElementImpl.forNode(AstFactory.identifier3("R")));
+    DartType normalParameterType = new InterfaceTypeImpl(
+        new ClassElementImpl.forNode(AstFactory.identifier3("A")));
+    DartType optionalParameterType = new InterfaceTypeImpl(
+        new ClassElementImpl.forNode(AstFactory.identifier3("B")));
+    DartType namedParameterType = new InterfaceTypeImpl(
+        new ClassElementImpl.forNode(AstFactory.identifier3("C")));
+    FunctionElementImpl functionElement =
+        new FunctionElementImpl.forNode(AstFactory.identifier3("f"));
+    String namedParameterName = "c";
+    functionElement.parameters = <ParameterElement>[
+      ElementFactory.requiredParameter2("a", normalParameterType),
+      ElementFactory.positionalParameter2("b", optionalParameterType),
+      ElementFactory.namedParameter2(namedParameterName, namedParameterType)
+    ];
+    functionElement.returnType = returnType;
+    FunctionTypeImpl functionType = new FunctionTypeImpl(functionElement);
+    InterfaceTypeImpl argumentType = new InterfaceTypeImpl(
+        new ClassElementImpl.forNode(AstFactory.identifier3("D")));
+    TypeParameterTypeImpl parameterType = new TypeParameterTypeImpl(
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("E")));
+    FunctionType result = functionType.substitute2(
+        <DartType>[argumentType], <DartType>[parameterType]);
+    expect(result.returnType, returnType);
+    List<DartType> normalParameters = result.normalParameterTypes;
+    expect(normalParameters, hasLength(1));
+    expect(normalParameters[0], normalParameterType);
+    List<DartType> optionalParameters = result.optionalParameterTypes;
+    expect(optionalParameters, hasLength(1));
+    expect(optionalParameters[0], optionalParameterType);
+    Map<String, DartType> namedParameters = result.namedParameterTypes;
+    expect(namedParameters, hasLength(1));
+    expect(namedParameters[namedParameterName], namedParameterType);
+  }
+
+  void test_toString_recursive() {
+    FunctionTypeAliasElementImpl t =
+        ElementFactory.functionTypeAliasElement("t");
+    FunctionTypeAliasElementImpl s =
+        ElementFactory.functionTypeAliasElement("s");
+    t.returnType = s.type;
+    s.returnType = t.type;
+    expect(t.type.toString(), '() \u2192 () \u2192 ...');
+  }
+
+  void test_toString_recursive_via_interface_type() {
+    FunctionTypeAliasElementImpl f =
+        ElementFactory.functionTypeAliasElement('f');
+    ClassElementImpl c = ElementFactory.classElement2('C', ['T']);
+    f.returnType = c.type.substitute4([f.type]);
+    expect(f.type.toString(), '() \u2192 C<...>');
+  }
+}
+
+@reflectiveTest
+class HtmlElementImplTest extends EngineTestCase {
+  void test_equals_differentSource() {
+    AnalysisContext context = createAnalysisContext();
+    HtmlElementImpl elementA = ElementFactory.htmlUnit(context, "indexA.html");
+    HtmlElementImpl elementB = ElementFactory.htmlUnit(context, "indexB.html");
+    expect(elementA == elementB, isFalse);
+  }
+
+  void test_equals_null() {
+    AnalysisContext context = createAnalysisContext();
+    HtmlElementImpl element = ElementFactory.htmlUnit(context, "index.html");
+    expect(element == null, isFalse);
+  }
+
+  void test_equals_sameSource() {
+    AnalysisContext context = createAnalysisContext();
+    HtmlElementImpl elementA = ElementFactory.htmlUnit(context, "index.html");
+    HtmlElementImpl elementB = ElementFactory.htmlUnit(context, "index.html");
+    expect(elementA == elementB, isTrue);
+  }
+
+  void test_equals_self() {
+    AnalysisContext context = createAnalysisContext();
+    HtmlElementImpl element = ElementFactory.htmlUnit(context, "index.html");
+    expect(element == element, isTrue);
+  }
+}
+
+@reflectiveTest
+class InterfaceTypeImplTest extends EngineTestCase {
+  /**
+   * The type provider used to access the types.
+   */
+  TestTypeProvider _typeProvider;
+
+  @override
+  void setUp() {
+    _typeProvider = new TestTypeProvider();
+  }
+
+  void test_computeLongestInheritancePathToObject_multipleInterfacePaths() {
+    //
+    //   Object
+    //     |
+    //     A
+    //    / \
+    //   B   C
+    //   |   |
+    //   |   D
+    //    \ /
+    //     E
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    ClassElementImpl classD = ElementFactory.classElement2("D");
+    ClassElementImpl classE = ElementFactory.classElement2("E");
+    classB.interfaces = <InterfaceType>[classA.type];
+    classC.interfaces = <InterfaceType>[classA.type];
+    classD.interfaces = <InterfaceType>[classC.type];
+    classE.interfaces = <InterfaceType>[classB.type, classD.type];
+    // assertion: even though the longest path to Object for typeB is 2, and
+    // typeE implements typeB, the longest path for typeE is 4 since it also
+    // implements typeD
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classB.type),
+        2);
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classE.type),
+        4);
+  }
+
+  void test_computeLongestInheritancePathToObject_multipleSuperclassPaths() {
+    //
+    //   Object
+    //     |
+    //     A
+    //    / \
+    //   B   C
+    //   |   |
+    //   |   D
+    //    \ /
+    //     E
+    //
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    ClassElement classC = ElementFactory.classElement("C", classA.type);
+    ClassElement classD = ElementFactory.classElement("D", classC.type);
+    ClassElementImpl classE = ElementFactory.classElement("E", classB.type);
+    classE.interfaces = <InterfaceType>[classD.type];
+    // assertion: even though the longest path to Object for typeB is 2, and
+    // typeE extends typeB, the longest path for typeE is 4 since it also
+    // implements typeD
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classB.type),
+        2);
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classE.type),
+        4);
+  }
+
+  void test_computeLongestInheritancePathToObject_object() {
+    //
+    //   Object
+    //     |
+    //     A
+    //
+    ClassElement classA = ElementFactory.classElement2("A");
+    InterfaceType object = classA.supertype;
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(object), 0);
+  }
+
+  void test_computeLongestInheritancePathToObject_recursion() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    classA.supertype = classB.type;
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classA.type),
+        2);
+  }
+
+  void test_computeLongestInheritancePathToObject_singleInterfacePath() {
+    //
+    //   Object
+    //     |
+    //     A
+    //     |
+    //     B
+    //     |
+    //     C
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    classB.interfaces = <InterfaceType>[classA.type];
+    classC.interfaces = <InterfaceType>[classB.type];
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classA.type),
+        1);
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classB.type),
+        2);
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classC.type),
+        3);
+  }
+
+  void test_computeLongestInheritancePathToObject_singleSuperclassPath() {
+    //
+    //   Object
+    //     |
+    //     A
+    //     |
+    //     B
+    //     |
+    //     C
+    //
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    ClassElement classC = ElementFactory.classElement("C", classB.type);
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classA.type),
+        1);
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classB.type),
+        2);
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classC.type),
+        3);
+  }
+
+  void test_computeSuperinterfaceSet_genericInterfacePath() {
+    //
+    //  A
+    //  | implements
+    //  B<T>
+    //  | implements
+    //  C<T>
+    //
+    //  D
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B", ["T"]);
+    ClassElementImpl classC = ElementFactory.classElement2("C", ["T"]);
+    ClassElement classD = ElementFactory.classElement2("D");
+    InterfaceType typeA = classA.type;
+    classB.interfaces = <InterfaceType>[typeA];
+    InterfaceTypeImpl typeBT = new InterfaceTypeImpl(classB);
+    DartType typeT = classC.type.typeArguments[0];
+    typeBT.typeArguments = <DartType>[typeT];
+    classC.interfaces = <InterfaceType>[typeBT];
+    // A
+    Set<InterfaceType> superinterfacesOfA =
+        InterfaceTypeImpl.computeSuperinterfaceSet(typeA);
+    expect(superinterfacesOfA, hasLength(1));
+    InterfaceType typeObject = ElementFactory.object.type;
+    expect(superinterfacesOfA.contains(typeObject), isTrue);
+    // B<D>
+    InterfaceTypeImpl typeBD = new InterfaceTypeImpl(classB);
+    typeBD.typeArguments = <DartType>[classD.type];
+    Set<InterfaceType> superinterfacesOfBD =
+        InterfaceTypeImpl.computeSuperinterfaceSet(typeBD);
+    expect(superinterfacesOfBD, hasLength(2));
+    expect(superinterfacesOfBD.contains(typeObject), isTrue);
+    expect(superinterfacesOfBD.contains(typeA), isTrue);
+    // C<D>
+    InterfaceTypeImpl typeCD = new InterfaceTypeImpl(classC);
+    typeCD.typeArguments = <DartType>[classD.type];
+    Set<InterfaceType> superinterfacesOfCD =
+        InterfaceTypeImpl.computeSuperinterfaceSet(typeCD);
+    expect(superinterfacesOfCD, hasLength(3));
+    expect(superinterfacesOfCD.contains(typeObject), isTrue);
+    expect(superinterfacesOfCD.contains(typeA), isTrue);
+    expect(superinterfacesOfCD.contains(typeBD), isTrue);
+  }
+
+  void test_computeSuperinterfaceSet_genericSuperclassPath() {
+    //
+    //  A
+    //  |
+    //  B<T>
+    //  |
+    //  C<T>
+    //
+    //  D
+    //
+    ClassElement classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    ClassElement classB = ElementFactory.classElement("B", typeA, ["T"]);
+    ClassElementImpl classC = ElementFactory.classElement2("C", ["T"]);
+    InterfaceTypeImpl typeBT = new InterfaceTypeImpl(classB);
+    DartType typeT = classC.type.typeArguments[0];
+    typeBT.typeArguments = <DartType>[typeT];
+    classC.supertype = typeBT;
+    ClassElement classD = ElementFactory.classElement2("D");
+    // A
+    Set<InterfaceType> superinterfacesOfA =
+        InterfaceTypeImpl.computeSuperinterfaceSet(typeA);
+    expect(superinterfacesOfA, hasLength(1));
+    InterfaceType typeObject = ElementFactory.object.type;
+    expect(superinterfacesOfA.contains(typeObject), isTrue);
+    // B<D>
+    InterfaceTypeImpl typeBD = new InterfaceTypeImpl(classB);
+    typeBD.typeArguments = <DartType>[classD.type];
+    Set<InterfaceType> superinterfacesOfBD =
+        InterfaceTypeImpl.computeSuperinterfaceSet(typeBD);
+    expect(superinterfacesOfBD, hasLength(2));
+    expect(superinterfacesOfBD.contains(typeObject), isTrue);
+    expect(superinterfacesOfBD.contains(typeA), isTrue);
+    // C<D>
+    InterfaceTypeImpl typeCD = new InterfaceTypeImpl(classC);
+    typeCD.typeArguments = <DartType>[classD.type];
+    Set<InterfaceType> superinterfacesOfCD =
+        InterfaceTypeImpl.computeSuperinterfaceSet(typeCD);
+    expect(superinterfacesOfCD, hasLength(3));
+    expect(superinterfacesOfCD.contains(typeObject), isTrue);
+    expect(superinterfacesOfCD.contains(typeA), isTrue);
+    expect(superinterfacesOfCD.contains(typeBD), isTrue);
+  }
+
+  void test_computeSuperinterfaceSet_multipleInterfacePaths() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    ClassElementImpl classD = ElementFactory.classElement2("D");
+    ClassElementImpl classE = ElementFactory.classElement2("E");
+    classB.interfaces = <InterfaceType>[classA.type];
+    classC.interfaces = <InterfaceType>[classA.type];
+    classD.interfaces = <InterfaceType>[classC.type];
+    classE.interfaces = <InterfaceType>[classB.type, classD.type];
+    // D
+    Set<InterfaceType> superinterfacesOfD =
+        InterfaceTypeImpl.computeSuperinterfaceSet(classD.type);
+    expect(superinterfacesOfD, hasLength(3));
+    expect(superinterfacesOfD.contains(ElementFactory.object.type), isTrue);
+    expect(superinterfacesOfD.contains(classA.type), isTrue);
+    expect(superinterfacesOfD.contains(classC.type), isTrue);
+    // E
+    Set<InterfaceType> superinterfacesOfE =
+        InterfaceTypeImpl.computeSuperinterfaceSet(classE.type);
+    expect(superinterfacesOfE, hasLength(5));
+    expect(superinterfacesOfE.contains(ElementFactory.object.type), isTrue);
+    expect(superinterfacesOfE.contains(classA.type), isTrue);
+    expect(superinterfacesOfE.contains(classB.type), isTrue);
+    expect(superinterfacesOfE.contains(classC.type), isTrue);
+    expect(superinterfacesOfE.contains(classD.type), isTrue);
+  }
+
+  void test_computeSuperinterfaceSet_multipleSuperclassPaths() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    ClassElement classC = ElementFactory.classElement("C", classA.type);
+    ClassElement classD = ElementFactory.classElement("D", classC.type);
+    ClassElementImpl classE = ElementFactory.classElement("E", classB.type);
+    classE.interfaces = <InterfaceType>[classD.type];
+    // D
+    Set<InterfaceType> superinterfacesOfD =
+        InterfaceTypeImpl.computeSuperinterfaceSet(classD.type);
+    expect(superinterfacesOfD, hasLength(3));
+    expect(superinterfacesOfD.contains(ElementFactory.object.type), isTrue);
+    expect(superinterfacesOfD.contains(classA.type), isTrue);
+    expect(superinterfacesOfD.contains(classC.type), isTrue);
+    // E
+    Set<InterfaceType> superinterfacesOfE =
+        InterfaceTypeImpl.computeSuperinterfaceSet(classE.type);
+    expect(superinterfacesOfE, hasLength(5));
+    expect(superinterfacesOfE.contains(ElementFactory.object.type), isTrue);
+    expect(superinterfacesOfE.contains(classA.type), isTrue);
+    expect(superinterfacesOfE.contains(classB.type), isTrue);
+    expect(superinterfacesOfE.contains(classC.type), isTrue);
+    expect(superinterfacesOfE.contains(classD.type), isTrue);
+  }
+
+  void test_computeSuperinterfaceSet_recursion() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    classA.supertype = classB.type;
+    Set<InterfaceType> superinterfacesOfB =
+        InterfaceTypeImpl.computeSuperinterfaceSet(classB.type);
+    expect(superinterfacesOfB, hasLength(2));
+  }
+
+  void test_computeSuperinterfaceSet_singleInterfacePath() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    classB.interfaces = <InterfaceType>[classA.type];
+    classC.interfaces = <InterfaceType>[classB.type];
+    // A
+    Set<InterfaceType> superinterfacesOfA =
+        InterfaceTypeImpl.computeSuperinterfaceSet(classA.type);
+    expect(superinterfacesOfA, hasLength(1));
+    expect(superinterfacesOfA.contains(ElementFactory.object.type), isTrue);
+    // B
+    Set<InterfaceType> superinterfacesOfB =
+        InterfaceTypeImpl.computeSuperinterfaceSet(classB.type);
+    expect(superinterfacesOfB, hasLength(2));
+    expect(superinterfacesOfB.contains(ElementFactory.object.type), isTrue);
+    expect(superinterfacesOfB.contains(classA.type), isTrue);
+    // C
+    Set<InterfaceType> superinterfacesOfC =
+        InterfaceTypeImpl.computeSuperinterfaceSet(classC.type);
+    expect(superinterfacesOfC, hasLength(3));
+    expect(superinterfacesOfC.contains(ElementFactory.object.type), isTrue);
+    expect(superinterfacesOfC.contains(classA.type), isTrue);
+    expect(superinterfacesOfC.contains(classB.type), isTrue);
+  }
+
+  void test_computeSuperinterfaceSet_singleSuperclassPath() {
+    //
+    //  A
+    //  |
+    //  B
+    //  |
+    //  C
+    //
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    ClassElement classC = ElementFactory.classElement("C", classB.type);
+    // A
+    Set<InterfaceType> superinterfacesOfA =
+        InterfaceTypeImpl.computeSuperinterfaceSet(classA.type);
+    expect(superinterfacesOfA, hasLength(1));
+    expect(superinterfacesOfA.contains(ElementFactory.object.type), isTrue);
+    // B
+    Set<InterfaceType> superinterfacesOfB =
+        InterfaceTypeImpl.computeSuperinterfaceSet(classB.type);
+    expect(superinterfacesOfB, hasLength(2));
+    expect(superinterfacesOfB.contains(ElementFactory.object.type), isTrue);
+    expect(superinterfacesOfB.contains(classA.type), isTrue);
+    // C
+    Set<InterfaceType> superinterfacesOfC =
+        InterfaceTypeImpl.computeSuperinterfaceSet(classC.type);
+    expect(superinterfacesOfC, hasLength(3));
+    expect(superinterfacesOfC.contains(ElementFactory.object.type), isTrue);
+    expect(superinterfacesOfC.contains(classA.type), isTrue);
+    expect(superinterfacesOfC.contains(classB.type), isTrue);
+  }
+
+  void test_creation() {
+    expect(new InterfaceTypeImpl(ElementFactory.classElement2("A")), isNotNull);
+  }
+
+  void test_getAccessors() {
+    ClassElementImpl typeElement = ElementFactory.classElement2("A");
+    PropertyAccessorElement getterG =
+        ElementFactory.getterElement("g", false, null);
+    PropertyAccessorElement getterH =
+        ElementFactory.getterElement("h", false, null);
+    typeElement.accessors = <PropertyAccessorElement>[getterG, getterH];
+    InterfaceTypeImpl type = new InterfaceTypeImpl(typeElement);
+    expect(type.accessors.length, 2);
+  }
+
+  void test_getAccessors_empty() {
+    ClassElementImpl typeElement = ElementFactory.classElement2("A");
+    InterfaceTypeImpl type = new InterfaceTypeImpl(typeElement);
+    expect(type.accessors.length, 0);
+  }
+
+  void test_getConstructors() {
+    ClassElementImpl typeElement = ElementFactory.classElement2("A");
+    ConstructorElementImpl constructorOne =
+        ElementFactory.constructorElement(typeElement, 'one', false);
+    ConstructorElementImpl constructorTwo =
+        ElementFactory.constructorElement(typeElement, 'two', false);
+    typeElement.constructors = <ConstructorElement>[
+      constructorOne,
+      constructorTwo
+    ];
+    InterfaceTypeImpl type = new InterfaceTypeImpl(typeElement);
+    expect(type.constructors, hasLength(2));
+  }
+
+  void test_getConstructors_empty() {
+    ClassElementImpl typeElement = ElementFactory.classElement2("A");
+    typeElement.constructors = ConstructorElement.EMPTY_LIST;
+    InterfaceTypeImpl type = new InterfaceTypeImpl(typeElement);
+    expect(type.constructors, isEmpty);
+  }
+
+  void test_getElement() {
+    ClassElementImpl typeElement = ElementFactory.classElement2("A");
+    InterfaceTypeImpl type = new InterfaceTypeImpl(typeElement);
+    expect(type.element, typeElement);
+  }
+
+  void test_getGetter_implemented() {
+    //
+    // class A { g {} }
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "g";
+    PropertyAccessorElement getterG =
+        ElementFactory.getterElement(getterName, false, null);
+    classA.accessors = <PropertyAccessorElement>[getterG];
+    InterfaceType typeA = classA.type;
+    expect(typeA.getGetter(getterName), same(getterG));
+  }
+
+  void test_getGetter_parameterized() {
+    //
+    // class A<E> { E get g {} }
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A", ["E"]);
+    DartType typeE = classA.type.typeArguments[0];
+    String getterName = "g";
+    PropertyAccessorElement getterG =
+        ElementFactory.getterElement(getterName, false, typeE);
+    classA.accessors = <PropertyAccessorElement>[getterG];
+    (getterG.type as FunctionTypeImpl).typeArguments =
+        classA.type.typeArguments;
+    //
+    // A<I>
+    //
+    InterfaceType typeI = ElementFactory.classElement2("I").type;
+    InterfaceTypeImpl typeAI = new InterfaceTypeImpl(classA);
+    typeAI.typeArguments = <DartType>[typeI];
+    PropertyAccessorElement getter = typeAI.getGetter(getterName);
+    expect(getter, isNotNull);
+    FunctionType getterType = getter.type;
+    expect(getterType.returnType, same(typeI));
+  }
+
+  void test_getGetter_unimplemented() {
+    //
+    // class A {}
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    expect(typeA.getGetter("g"), isNull);
+  }
+
+  void test_getInterfaces_nonParameterized() {
+    //
+    // class C implements A, B
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    InterfaceType typeB = classB.type;
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    classC.interfaces = <InterfaceType>[typeA, typeB];
+    List<InterfaceType> interfaces = classC.type.interfaces;
+    expect(interfaces, hasLength(2));
+    if (identical(interfaces[0], typeA)) {
+      expect(interfaces[1], same(typeB));
+    } else {
+      expect(interfaces[0], same(typeB));
+      expect(interfaces[1], same(typeA));
+    }
+  }
+
+  void test_getInterfaces_parameterized() {
+    //
+    // class A<E>
+    // class B<F> implements A<F>
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A", ["E"]);
+    ClassElementImpl classB = ElementFactory.classElement2("B", ["F"]);
+    InterfaceType typeB = classB.type;
+    InterfaceTypeImpl typeAF = new InterfaceTypeImpl(classA);
+    typeAF.typeArguments = <DartType>[typeB.typeArguments[0]];
+    classB.interfaces = <InterfaceType>[typeAF];
+    //
+    // B<I>
+    //
+    InterfaceType typeI = ElementFactory.classElement2("I").type;
+    InterfaceTypeImpl typeBI = new InterfaceTypeImpl(classB);
+    typeBI.typeArguments = <DartType>[typeI];
+    List<InterfaceType> interfaces = typeBI.interfaces;
+    expect(interfaces, hasLength(1));
+    InterfaceType result = interfaces[0];
+    expect(result.element, same(classA));
+    expect(result.typeArguments[0], same(typeI));
+  }
+
+  void test_getLeastUpperBound_directInterfaceCase() {
+    //
+    // class A
+    // class B implements A
+    // class C implements B
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    classB.interfaces = <InterfaceType>[typeA];
+    classC.interfaces = <InterfaceType>[typeB];
+    expect(typeB.getLeastUpperBound(typeC), typeB);
+    expect(typeC.getLeastUpperBound(typeB), typeB);
+  }
+
+  void test_getLeastUpperBound_directSubclassCase() {
+    //
+    // class A
+    // class B extends A
+    // class C extends B
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classB.type);
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    expect(typeB.getLeastUpperBound(typeC), typeB);
+    expect(typeC.getLeastUpperBound(typeB), typeB);
+  }
+
+  void test_getLeastUpperBound_functionType() {
+    DartType interfaceType = ElementFactory.classElement2("A").type;
+    FunctionTypeImpl functionType = new FunctionTypeImpl(
+        new FunctionElementImpl.forNode(AstFactory.identifier3("f")));
+    expect(interfaceType.getLeastUpperBound(functionType), isNull);
+  }
+
+  void test_getLeastUpperBound_mixinCase() {
+    //
+    // class A
+    // class B extends A
+    // class C extends A
+    // class D extends B with M, N, O, P
+    //
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    ClassElement classC = ElementFactory.classElement("C", classA.type);
+    ClassElementImpl classD = ElementFactory.classElement("D", classB.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeC = classC.type;
+    InterfaceType typeD = classD.type;
+    classD.mixins = <InterfaceType>[
+      ElementFactory.classElement2("M").type,
+      ElementFactory.classElement2("N").type,
+      ElementFactory.classElement2("O").type,
+      ElementFactory.classElement2("P").type
+    ];
+    expect(typeD.getLeastUpperBound(typeC), typeA);
+    expect(typeC.getLeastUpperBound(typeD), typeA);
+  }
+
+  void test_getLeastUpperBound_null() {
+    DartType interfaceType = ElementFactory.classElement2("A").type;
+    expect(interfaceType.getLeastUpperBound(null), isNull);
+  }
+
+  void test_getLeastUpperBound_object() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    DartType typeObject = typeA.element.supertype;
+    // assert that object does not have a super type
+    expect((typeObject.element as ClassElement).supertype, isNull);
+    // assert that both A and B have the same super type of Object
+    expect(typeB.element.supertype, typeObject);
+    // finally, assert that the only least upper bound of A and B is Object
+    expect(typeA.getLeastUpperBound(typeB), typeObject);
+  }
+
+  void test_getLeastUpperBound_self() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    expect(typeA.getLeastUpperBound(typeA), typeA);
+  }
+
+  void test_getLeastUpperBound_sharedSuperclass1() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classA.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    expect(typeB.getLeastUpperBound(typeC), typeA);
+    expect(typeC.getLeastUpperBound(typeB), typeA);
+  }
+
+  void test_getLeastUpperBound_sharedSuperclass2() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classA.type);
+    ClassElementImpl classD = ElementFactory.classElement("D", classC.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeD = classD.type;
+    expect(typeB.getLeastUpperBound(typeD), typeA);
+    expect(typeD.getLeastUpperBound(typeB), typeA);
+  }
+
+  void test_getLeastUpperBound_sharedSuperclass3() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classB.type);
+    ClassElementImpl classD = ElementFactory.classElement("D", classB.type);
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    InterfaceType typeD = classD.type;
+    expect(typeC.getLeastUpperBound(typeD), typeB);
+    expect(typeD.getLeastUpperBound(typeC), typeB);
+  }
+
+  void test_getLeastUpperBound_sharedSuperclass4() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classA2 = ElementFactory.classElement2("A2");
+    ClassElement classA3 = ElementFactory.classElement2("A3");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classA.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeA2 = classA2.type;
+    InterfaceType typeA3 = classA3.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    classB.interfaces = <InterfaceType>[typeA2];
+    classC.interfaces = <InterfaceType>[typeA3];
+    expect(typeB.getLeastUpperBound(typeC), typeA);
+    expect(typeC.getLeastUpperBound(typeB), typeA);
+  }
+
+  void test_getLeastUpperBound_sharedSuperinterface1() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    classB.interfaces = <InterfaceType>[typeA];
+    classC.interfaces = <InterfaceType>[typeA];
+    expect(typeB.getLeastUpperBound(typeC), typeA);
+    expect(typeC.getLeastUpperBound(typeB), typeA);
+  }
+
+  void test_getLeastUpperBound_sharedSuperinterface2() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    ClassElementImpl classD = ElementFactory.classElement2("D");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    InterfaceType typeD = classD.type;
+    classB.interfaces = <InterfaceType>[typeA];
+    classC.interfaces = <InterfaceType>[typeA];
+    classD.interfaces = <InterfaceType>[typeC];
+    expect(typeB.getLeastUpperBound(typeD), typeA);
+    expect(typeD.getLeastUpperBound(typeB), typeA);
+  }
+
+  void test_getLeastUpperBound_sharedSuperinterface3() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    ClassElementImpl classD = ElementFactory.classElement2("D");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    InterfaceType typeD = classD.type;
+    classB.interfaces = <InterfaceType>[typeA];
+    classC.interfaces = <InterfaceType>[typeB];
+    classD.interfaces = <InterfaceType>[typeB];
+    expect(typeC.getLeastUpperBound(typeD), typeB);
+    expect(typeD.getLeastUpperBound(typeC), typeB);
+  }
+
+  void test_getLeastUpperBound_sharedSuperinterface4() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classA2 = ElementFactory.classElement2("A2");
+    ClassElement classA3 = ElementFactory.classElement2("A3");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeA2 = classA2.type;
+    InterfaceType typeA3 = classA3.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    classB.interfaces = <InterfaceType>[typeA, typeA2];
+    classC.interfaces = <InterfaceType>[typeA, typeA3];
+    expect(typeB.getLeastUpperBound(typeC), typeA);
+    expect(typeC.getLeastUpperBound(typeB), typeA);
+  }
+
+  void test_getLeastUpperBound_twoComparables() {
+    InterfaceType string = _typeProvider.stringType;
+    InterfaceType num = _typeProvider.numType;
+    expect(string.getLeastUpperBound(num), _typeProvider.objectType);
+  }
+
+  void test_getLeastUpperBound_typeParameters_different() {
+    //
+    // class List<int>
+    // class List<double>
+    //
+    InterfaceType listType = _typeProvider.listType;
+    InterfaceType intType = _typeProvider.intType;
+    InterfaceType doubleType = _typeProvider.doubleType;
+    InterfaceType listOfIntType = listType.substitute4(<DartType>[intType]);
+    InterfaceType listOfDoubleType =
+        listType.substitute4(<DartType>[doubleType]);
+    expect(listOfIntType.getLeastUpperBound(listOfDoubleType),
+        _typeProvider.objectType);
+  }
+
+  void test_getLeastUpperBound_typeParameters_same() {
+    //
+    // List<int>
+    // List<int>
+    //
+    InterfaceType listType = _typeProvider.listType;
+    InterfaceType intType = _typeProvider.intType;
+    InterfaceType listOfIntType = listType.substitute4(<DartType>[intType]);
+    expect(listOfIntType.getLeastUpperBound(listOfIntType), listOfIntType);
+  }
+
+  void test_getMethod_implemented() {
+    //
+    // class A { m() {} }
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElementImpl methodM = ElementFactory.methodElement(methodName, null);
+    classA.methods = <MethodElement>[methodM];
+    InterfaceType typeA = classA.type;
+    expect(typeA.getMethod(methodName), same(methodM));
+  }
+
+  void test_getMethod_parameterized() {
+    //
+    // class A<E> { E m(E p) {} }
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A", ["E"]);
+    DartType typeE = classA.type.typeArguments[0];
+    String methodName = "m";
+    MethodElementImpl methodM =
+        ElementFactory.methodElement(methodName, typeE, [typeE]);
+    classA.methods = <MethodElement>[methodM];
+    (methodM.type as FunctionTypeImpl).typeArguments =
+        classA.type.typeArguments;
+    //
+    // A<I>
+    //
+    InterfaceType typeI = ElementFactory.classElement2("I").type;
+    InterfaceTypeImpl typeAI = new InterfaceTypeImpl(classA);
+    typeAI.typeArguments = <DartType>[typeI];
+    MethodElement method = typeAI.getMethod(methodName);
+    expect(method, isNotNull);
+    FunctionType methodType = method.type;
+    expect(methodType.returnType, same(typeI));
+    List<DartType> parameterTypes = methodType.normalParameterTypes;
+    expect(parameterTypes, hasLength(1));
+    expect(parameterTypes[0], same(typeI));
+  }
+
+  void test_getMethod_unimplemented() {
+    //
+    // class A {}
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    expect(typeA.getMethod("m"), isNull);
+  }
+
+  void test_getMethods() {
+    ClassElementImpl typeElement = ElementFactory.classElement2("A");
+    MethodElementImpl methodOne = ElementFactory.methodElement("one", null);
+    MethodElementImpl methodTwo = ElementFactory.methodElement("two", null);
+    typeElement.methods = <MethodElement>[methodOne, methodTwo];
+    InterfaceTypeImpl type = new InterfaceTypeImpl(typeElement);
+    expect(type.methods.length, 2);
+  }
+
+  void test_getMethods_empty() {
+    ClassElementImpl typeElement = ElementFactory.classElement2("A");
+    InterfaceTypeImpl type = new InterfaceTypeImpl(typeElement);
+    expect(type.methods.length, 0);
+  }
+
+  void test_getMixins_nonParameterized() {
+    //
+    // class C extends Object with A, B
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    InterfaceType typeB = classB.type;
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    classC.mixins = <InterfaceType>[typeA, typeB];
+    List<InterfaceType> interfaces = classC.type.mixins;
+    expect(interfaces, hasLength(2));
+    if (identical(interfaces[0], typeA)) {
+      expect(interfaces[1], same(typeB));
+    } else {
+      expect(interfaces[0], same(typeB));
+      expect(interfaces[1], same(typeA));
+    }
+  }
+
+  void test_getMixins_parameterized() {
+    //
+    // class A<E>
+    // class B<F> extends Object with A<F>
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A", ["E"]);
+    ClassElementImpl classB = ElementFactory.classElement2("B", ["F"]);
+    InterfaceType typeB = classB.type;
+    InterfaceTypeImpl typeAF = new InterfaceTypeImpl(classA);
+    typeAF.typeArguments = <DartType>[typeB.typeArguments[0]];
+    classB.mixins = <InterfaceType>[typeAF];
+    //
+    // B<I>
+    //
+    InterfaceType typeI = ElementFactory.classElement2("I").type;
+    InterfaceTypeImpl typeBI = new InterfaceTypeImpl(classB);
+    typeBI.typeArguments = <DartType>[typeI];
+    List<InterfaceType> interfaces = typeBI.mixins;
+    expect(interfaces, hasLength(1));
+    InterfaceType result = interfaces[0];
+    expect(result.element, same(classA));
+    expect(result.typeArguments[0], same(typeI));
+  }
+
+  void test_getSetter_implemented() {
+    //
+    // class A { s() {} }
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String setterName = "s";
+    PropertyAccessorElement setterS =
+        ElementFactory.setterElement(setterName, false, null);
+    classA.accessors = <PropertyAccessorElement>[setterS];
+    InterfaceType typeA = classA.type;
+    expect(typeA.getSetter(setterName), same(setterS));
+  }
+
+  void test_getSetter_parameterized() {
+    //
+    // class A<E> { set s(E p) {} }
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A", ["E"]);
+    DartType typeE = classA.type.typeArguments[0];
+    String setterName = "s";
+    PropertyAccessorElement setterS =
+        ElementFactory.setterElement(setterName, false, typeE);
+    classA.accessors = <PropertyAccessorElement>[setterS];
+    (setterS.type as FunctionTypeImpl).typeArguments =
+        classA.type.typeArguments;
+    //
+    // A<I>
+    //
+    InterfaceType typeI = ElementFactory.classElement2("I").type;
+    InterfaceTypeImpl typeAI = new InterfaceTypeImpl(classA);
+    typeAI.typeArguments = <DartType>[typeI];
+    PropertyAccessorElement setter = typeAI.getSetter(setterName);
+    expect(setter, isNotNull);
+    FunctionType setterType = setter.type;
+    List<DartType> parameterTypes = setterType.normalParameterTypes;
+    expect(parameterTypes, hasLength(1));
+    expect(parameterTypes[0], same(typeI));
+  }
+
+  void test_getSetter_unimplemented() {
+    //
+    // class A {}
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    expect(typeA.getSetter("s"), isNull);
+  }
+
+  void test_getSuperclass_nonParameterized() {
+    //
+    // class B extends A
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    ClassElementImpl classB = ElementFactory.classElement("B", typeA);
+    InterfaceType typeB = classB.type;
+    expect(typeB.superclass, same(typeA));
+  }
+
+  void test_getSuperclass_parameterized() {
+    //
+    // class A<E>
+    // class B<F> extends A<F>
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A", ["E"]);
+    ClassElementImpl classB = ElementFactory.classElement2("B", ["F"]);
+    InterfaceType typeB = classB.type;
+    InterfaceTypeImpl typeAF = new InterfaceTypeImpl(classA);
+    typeAF.typeArguments = <DartType>[typeB.typeArguments[0]];
+    classB.supertype = typeAF;
+    //
+    // B<I>
+    //
+    InterfaceType typeI = ElementFactory.classElement2("I").type;
+    InterfaceTypeImpl typeBI = new InterfaceTypeImpl(classB);
+    typeBI.typeArguments = <DartType>[typeI];
+    InterfaceType superclass = typeBI.superclass;
+    expect(superclass.element, same(classA));
+    expect(superclass.typeArguments[0], same(typeI));
+  }
+
+  void test_getTypeArguments_empty() {
+    InterfaceType type = ElementFactory.classElement2("A").type;
+    expect(type.typeArguments, hasLength(0));
+  }
+
+  void test_hashCode() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    expect(0 == typeA.hashCode, isFalse);
+  }
+
+  void test_isAssignableTo_typeVariables() {
+    //
+    // class A<E> {}
+    // class B<F, G> {
+    //   A<F> af;
+    //   f (A<G> ag) {
+    //     af = ag;
+    //   }
+    // }
+    //
+    ClassElement classA = ElementFactory.classElement2("A", ["E"]);
+    ClassElement classB = ElementFactory.classElement2("B", ["F", "G"]);
+    InterfaceTypeImpl typeAF = new InterfaceTypeImpl(classA);
+    typeAF.typeArguments = <DartType>[classB.typeParameters[0].type];
+    InterfaceTypeImpl typeAG = new InterfaceTypeImpl(classA);
+    typeAG.typeArguments = <DartType>[classB.typeParameters[1].type];
+    expect(typeAG.isAssignableTo(typeAF), isFalse);
+  }
+
+  void test_isAssignableTo_void() {
+    InterfaceTypeImpl intType = _typeProvider.intType;
+    expect(VoidTypeImpl.instance.isAssignableTo(intType), isFalse);
+  }
+
+  void test_isDirectSupertypeOf_extends() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    expect(typeA.isDirectSupertypeOf(typeB), isTrue);
+  }
+
+  void test_isDirectSupertypeOf_false() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement2("B");
+    ClassElement classC = ElementFactory.classElement("C", classB.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeC = classC.type;
+    expect(typeA.isDirectSupertypeOf(typeC), isFalse);
+  }
+
+  void test_isDirectSupertypeOf_implements() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    classB.interfaces = <InterfaceType>[typeA];
+    expect(typeA.isDirectSupertypeOf(typeB), isTrue);
+  }
+
+  void test_isDirectSupertypeOf_with() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    classB.mixins = <InterfaceType>[typeA];
+    expect(typeA.isDirectSupertypeOf(typeB), isTrue);
+  }
+
+  void test_isMoreSpecificThan_bottom() {
+    DartType type = ElementFactory.classElement2("A").type;
+    expect(BottomTypeImpl.instance.isMoreSpecificThan(type), isTrue);
+  }
+
+  void test_isMoreSpecificThan_covariance() {
+    ClassElement classA = ElementFactory.classElement2("A", ["E"]);
+    ClassElement classI = ElementFactory.classElement2("I");
+    ClassElement classJ = ElementFactory.classElement("J", classI.type);
+    InterfaceTypeImpl typeAI = new InterfaceTypeImpl(classA);
+    InterfaceTypeImpl typeAJ = new InterfaceTypeImpl(classA);
+    typeAI.typeArguments = <DartType>[classI.type];
+    typeAJ.typeArguments = <DartType>[classJ.type];
+    expect(typeAJ.isMoreSpecificThan(typeAI), isTrue);
+    expect(typeAI.isMoreSpecificThan(typeAJ), isFalse);
+  }
+
+  void test_isMoreSpecificThan_directSupertype() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    expect(typeB.isMoreSpecificThan(typeA), isTrue);
+    // the opposite test tests a different branch in isMoreSpecificThan()
+    expect(typeA.isMoreSpecificThan(typeB), isFalse);
+  }
+
+  void test_isMoreSpecificThan_dynamic() {
+    InterfaceType type = ElementFactory.classElement2("A").type;
+    expect(type.isMoreSpecificThan(DynamicTypeImpl.instance), isTrue);
+  }
+
+  void test_isMoreSpecificThan_generic() {
+    ClassElement classA = ElementFactory.classElement2("A", ["E"]);
+    ClassElement classB = ElementFactory.classElement2("B");
+    DartType dynamicType = DynamicTypeImpl.instance;
+    InterfaceType typeAOfDynamic =
+        classA.type.substitute4(<DartType>[dynamicType]);
+    InterfaceType typeAOfB = classA.type.substitute4(<DartType>[classB.type]);
+    expect(typeAOfDynamic.isMoreSpecificThan(typeAOfB), isFalse);
+    expect(typeAOfB.isMoreSpecificThan(typeAOfDynamic), isTrue);
+  }
+
+  void test_isMoreSpecificThan_self() {
+    InterfaceType type = ElementFactory.classElement2("A").type;
+    expect(type.isMoreSpecificThan(type), isTrue);
+  }
+
+  void test_isMoreSpecificThan_transitive_interface() {
+    //
+    //  class A {}
+    //  class B extends A {}
+    //  class C implements B {}
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    classC.interfaces = <InterfaceType>[classB.type];
+    InterfaceType typeA = classA.type;
+    InterfaceType typeC = classC.type;
+    expect(typeC.isMoreSpecificThan(typeA), isTrue);
+  }
+
+  void test_isMoreSpecificThan_transitive_mixin() {
+    //
+    //  class A {}
+    //  class B extends A {}
+    //  class C with B {}
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    classC.mixins = <InterfaceType>[classB.type];
+    InterfaceType typeA = classA.type;
+    InterfaceType typeC = classC.type;
+    expect(typeC.isMoreSpecificThan(typeA), isTrue);
+  }
+
+  void test_isMoreSpecificThan_transitive_recursive() {
+    //
+    //  class A extends B {}
+    //  class B extends A {}
+    //  class C {}
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeC = classC.type;
+    classA.supertype = classB.type;
+    expect(typeA.isMoreSpecificThan(typeC), isFalse);
+  }
+
+  void test_isMoreSpecificThan_transitive_superclass() {
+    //
+    //  class A {}
+    //  class B extends A {}
+    //  class C extends B {}
+    //
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    ClassElement classC = ElementFactory.classElement("C", classB.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeC = classC.type;
+    expect(typeC.isMoreSpecificThan(typeA), isTrue);
+  }
+
+  void test_isMoreSpecificThan_typeParameterType() {
+    //
+    // class A<E> {}
+    //
+    ClassElement classA = ElementFactory.classElement2("A", ["E"]);
+    InterfaceType typeA = classA.type;
+    TypeParameterType parameterType = classA.typeParameters[0].type;
+    DartType objectType = _typeProvider.objectType;
+    expect(parameterType.isMoreSpecificThan(objectType), isTrue);
+    expect(parameterType.isMoreSpecificThan(typeA), isFalse);
+  }
+
+  void test_isMoreSpecificThan_typeParameterType_withBound() {
+    //
+    // class A {}
+    // class B<E extends A> {}
+    //
+    ClassElement classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    TypeParameterElementImpl parameterEA =
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("E"));
+    TypeParameterType parameterAEType = new TypeParameterTypeImpl(parameterEA);
+    parameterEA.bound = typeA;
+    parameterEA.type = parameterAEType;
+    classB.typeParameters = <TypeParameterElementImpl>[parameterEA];
+    expect(parameterAEType.isMoreSpecificThan(typeA), isTrue);
+  }
+
+  void test_isSubtypeOf_directSubtype() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    expect(typeB.isSubtypeOf(typeA), isTrue);
+    expect(typeA.isSubtypeOf(typeB), isFalse);
+  }
+
+  void test_isSubtypeOf_dynamic() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    DartType dynamicType = DynamicTypeImpl.instance;
+    expect(dynamicType.isSubtypeOf(typeA), isTrue);
+    expect(typeA.isSubtypeOf(dynamicType), isTrue);
+  }
+
+  void test_isSubtypeOf_function() {
+    //
+    // void f(String s) {}
+    // class A {
+    //   void call(String s) {}
+    // }
+    //
+    InterfaceType stringType = _typeProvider.stringType;
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.methods = <MethodElement>[
+      ElementFactory.methodElement("call", VoidTypeImpl.instance, [stringType])
+    ];
+    FunctionType functionType = ElementFactory
+        .functionElement5("f", <ClassElement>[stringType.element]).type;
+    expect(classA.type.isSubtypeOf(functionType), isTrue);
+  }
+
+  void test_isSubtypeOf_generic() {
+    ClassElement classA = ElementFactory.classElement2("A", ["E"]);
+    ClassElement classB = ElementFactory.classElement2("B");
+    DartType dynamicType = DynamicTypeImpl.instance;
+    InterfaceType typeAOfDynamic =
+        classA.type.substitute4(<DartType>[dynamicType]);
+    InterfaceType typeAOfB = classA.type.substitute4(<DartType>[classB.type]);
+    expect(typeAOfDynamic.isSubtypeOf(typeAOfB), isTrue);
+    expect(typeAOfB.isSubtypeOf(typeAOfDynamic), isTrue);
+  }
+
+  void test_isSubtypeOf_interface() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    InterfaceType typeObject = classA.supertype;
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    classC.interfaces = <InterfaceType>[typeB];
+    expect(typeC.isSubtypeOf(typeB), isTrue);
+    expect(typeC.isSubtypeOf(typeObject), isTrue);
+    expect(typeC.isSubtypeOf(typeA), isTrue);
+    expect(typeA.isSubtypeOf(typeC), isFalse);
+  }
+
+  void test_isSubtypeOf_mixins() {
+    //
+    // class A {}
+    // class B extends A {}
+    // class C with B {}
+    //
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    InterfaceType typeObject = classA.supertype;
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    classC.mixins = <InterfaceType>[typeB];
+    expect(typeC.isSubtypeOf(typeB), isTrue);
+    expect(typeC.isSubtypeOf(typeObject), isTrue);
+    expect(typeC.isSubtypeOf(typeA), isTrue);
+    expect(typeA.isSubtypeOf(typeC), isFalse);
+  }
+
+  void test_isSubtypeOf_object() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeObject = classA.supertype;
+    expect(typeA.isSubtypeOf(typeObject), isTrue);
+    expect(typeObject.isSubtypeOf(typeA), isFalse);
+  }
+
+  void test_isSubtypeOf_self() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    expect(typeA.isSubtypeOf(typeA), isTrue);
+  }
+
+  void test_isSubtypeOf_transitive_recursive() {
+    //
+    //  class A extends B {}
+    //  class B extends A {}
+    //  class C {}
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeC = classC.type;
+    classA.supertype = classB.type;
+    expect(typeA.isSubtypeOf(typeC), isFalse);
+  }
+
+  void test_isSubtypeOf_transitive_superclass() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    ClassElement classC = ElementFactory.classElement("C", classB.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeC = classC.type;
+    expect(typeC.isSubtypeOf(typeA), isTrue);
+    expect(typeA.isSubtypeOf(typeC), isFalse);
+  }
+
+  void test_isSubtypeOf_typeArguments() {
+    DartType dynamicType = DynamicTypeImpl.instance;
+    ClassElement classA = ElementFactory.classElement2("A", ["E"]);
+    ClassElement classI = ElementFactory.classElement2("I");
+    ClassElement classJ = ElementFactory.classElement("J", classI.type);
+    ClassElement classK = ElementFactory.classElement2("K");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeA_dynamic = typeA.substitute4(<DartType>[dynamicType]);
+    InterfaceTypeImpl typeAI = new InterfaceTypeImpl(classA);
+    InterfaceTypeImpl typeAJ = new InterfaceTypeImpl(classA);
+    InterfaceTypeImpl typeAK = new InterfaceTypeImpl(classA);
+    typeAI.typeArguments = <DartType>[classI.type];
+    typeAJ.typeArguments = <DartType>[classJ.type];
+    typeAK.typeArguments = <DartType>[classK.type];
+    // A<J> <: A<I> since J <: I
+    expect(typeAJ.isSubtypeOf(typeAI), isTrue);
+    expect(typeAI.isSubtypeOf(typeAJ), isFalse);
+    // A<I> <: A<I> since I <: I
+    expect(typeAI.isSubtypeOf(typeAI), isTrue);
+    // A <: A<I> and A <: A<J>
+    expect(typeA_dynamic.isSubtypeOf(typeAI), isTrue);
+    expect(typeA_dynamic.isSubtypeOf(typeAJ), isTrue);
+    // A<I> <: A and A<J> <: A
+    expect(typeAI.isSubtypeOf(typeA_dynamic), isTrue);
+    expect(typeAJ.isSubtypeOf(typeA_dynamic), isTrue);
+    // A<I> !<: A<K> and A<K> !<: A<I>
+    expect(typeAI.isSubtypeOf(typeAK), isFalse);
+    expect(typeAK.isSubtypeOf(typeAI), isFalse);
+  }
+
+  void test_isSubtypeOf_typeParameter() {
+    //
+    // class A<E> {}
+    //
+    ClassElement classA = ElementFactory.classElement2("A", ["E"]);
+    InterfaceType typeA = classA.type;
+    TypeParameterType parameterType = classA.typeParameters[0].type;
+    expect(typeA.isSubtypeOf(parameterType), isFalse);
+  }
+
+  void test_isSupertypeOf_directSupertype() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    expect(typeB.isSupertypeOf(typeA), isFalse);
+    expect(typeA.isSupertypeOf(typeB), isTrue);
+  }
+
+  void test_isSupertypeOf_dynamic() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    DartType dynamicType = DynamicTypeImpl.instance;
+    expect(dynamicType.isSupertypeOf(typeA), isTrue);
+    expect(typeA.isSupertypeOf(dynamicType), isTrue);
+  }
+
+  void test_isSupertypeOf_indirectSupertype() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    ClassElement classC = ElementFactory.classElement("C", classB.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeC = classC.type;
+    expect(typeC.isSupertypeOf(typeA), isFalse);
+    expect(typeA.isSupertypeOf(typeC), isTrue);
+  }
+
+  void test_isSupertypeOf_interface() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    InterfaceType typeObject = classA.supertype;
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    classC.interfaces = <InterfaceType>[typeB];
+    expect(typeB.isSupertypeOf(typeC), isTrue);
+    expect(typeObject.isSupertypeOf(typeC), isTrue);
+    expect(typeA.isSupertypeOf(typeC), isTrue);
+    expect(typeC.isSupertypeOf(typeA), isFalse);
+  }
+
+  void test_isSupertypeOf_mixins() {
+    //
+    // class A {}
+    // class B extends A {}
+    // class C with B {}
+    //
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    InterfaceType typeObject = classA.supertype;
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    classC.mixins = <InterfaceType>[typeB];
+    expect(typeB.isSupertypeOf(typeC), isTrue);
+    expect(typeObject.isSupertypeOf(typeC), isTrue);
+    expect(typeA.isSupertypeOf(typeC), isTrue);
+    expect(typeC.isSupertypeOf(typeA), isFalse);
+  }
+
+  void test_isSupertypeOf_object() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeObject = classA.supertype;
+    expect(typeA.isSupertypeOf(typeObject), isFalse);
+    expect(typeObject.isSupertypeOf(typeA), isTrue);
+  }
+
+  void test_isSupertypeOf_self() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    expect(typeA.isSupertypeOf(typeA), isTrue);
+  }
+
+  void test_lookUpGetter_implemented() {
+    //
+    // class A { g {} }
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "g";
+    PropertyAccessorElement getterG =
+        ElementFactory.getterElement(getterName, false, null);
+    classA.accessors = <PropertyAccessorElement>[getterG];
+    InterfaceType typeA = classA.type;
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    (unit as CompilationUnitElementImpl).types = <ClassElement>[classA];
+    expect(typeA.lookUpGetter(getterName, library), same(getterG));
+  }
+
+  void test_lookUpGetter_inherited() {
+    //
+    // class A { g {} }
+    // class B extends A {}
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "g";
+    PropertyAccessorElement getterG =
+        ElementFactory.getterElement(getterName, false, null);
+    classA.accessors = <PropertyAccessorElement>[getterG];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    InterfaceType typeB = classB.type;
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    (unit as CompilationUnitElementImpl).types = <ClassElement>[classA, classB];
+    expect(typeB.lookUpGetter(getterName, library), same(getterG));
+  }
+
+  void test_lookUpGetter_mixin_shadowing() {
+    //
+    // class B {}
+    // class M1 { get g {} }
+    // class M2 { get g {} }
+    // class C extends B with M1, M2 {}
+    //
+    TestTypeProvider typeProvider = new TestTypeProvider();
+    String getterName = 'g';
+    ClassElementImpl classB = ElementFactory.classElement2('B');
+    ClassElementImpl classM1 = ElementFactory.classElement2('M1');
+    PropertyAccessorElementImpl getterM1g = ElementFactory.getterElement(
+        getterName, false, typeProvider.dynamicType);
+    classM1.accessors = <PropertyAccessorElement>[getterM1g];
+    ClassElementImpl classM2 = ElementFactory.classElement2('M2');
+    PropertyAccessorElementImpl getterM2g = ElementFactory.getterElement(
+        getterName, false, typeProvider.dynamicType);
+    classM2.accessors = <PropertyAccessorElement>[getterM2g];
+    ClassElementImpl classC = ElementFactory.classElement('C', classB.type);
+    classC.mixins = <InterfaceType>[classM1.type, classM2.type];
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    CompilationUnitElementImpl unit = library.definingCompilationUnit;
+    unit.types = <ClassElement>[classB, classM1, classM2, classC];
+    expect(classC.type.lookUpGetter(getterName, library), getterM2g);
+  }
+
+  void test_lookUpGetter_recursive() {
+    //
+    // class A extends B {}
+    // class B extends A {}
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    ClassElementImpl classB = ElementFactory.classElement("B", typeA);
+    classA.supertype = classB.type;
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    (unit as CompilationUnitElementImpl).types = <ClassElement>[classA, classB];
+    expect(typeA.lookUpGetter("g", library), isNull);
+  }
+
+  void test_lookUpGetter_unimplemented() {
+    //
+    // class A {}
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    (unit as CompilationUnitElementImpl).types = <ClassElement>[classA];
+    expect(typeA.lookUpGetter("g", library), isNull);
+  }
+
+  void test_lookUpMethod_implemented() {
+    //
+    // class A { m() {} }
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElementImpl methodM = ElementFactory.methodElement(methodName, null);
+    classA.methods = <MethodElement>[methodM];
+    InterfaceType typeA = classA.type;
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    (unit as CompilationUnitElementImpl).types = <ClassElement>[classA];
+    expect(typeA.lookUpMethod(methodName, library), same(methodM));
+  }
+
+  void test_lookUpMethod_inherited() {
+    //
+    // class A { m() {} }
+    // class B extends A {}
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElementImpl methodM = ElementFactory.methodElement(methodName, null);
+    classA.methods = <MethodElement>[methodM];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    InterfaceType typeB = classB.type;
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    (unit as CompilationUnitElementImpl).types = <ClassElement>[classA, classB];
+    expect(typeB.lookUpMethod(methodName, library), same(methodM));
+  }
+
+  void test_lookUpMethod_mixin_shadowing() {
+    //
+    // class B {}
+    // class M1 { m() {} }
+    // class M2 { m() {} }
+    // class C extends B with M1, M2 {}
+    //
+    String methodName = 'm';
+    ClassElementImpl classB = ElementFactory.classElement2('B');
+    ClassElementImpl classM1 = ElementFactory.classElement2('M1');
+    MethodElementImpl methodM1m =
+        ElementFactory.methodElement(methodName, null);
+    classM1.methods = <MethodElement>[methodM1m];
+    ClassElementImpl classM2 = ElementFactory.classElement2('M2');
+    MethodElementImpl methodM2m =
+        ElementFactory.methodElement(methodName, null);
+    classM2.methods = <MethodElement>[methodM2m];
+    ClassElementImpl classC = ElementFactory.classElement('C', classB.type);
+    classC.mixins = <InterfaceType>[classM1.type, classM2.type];
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    CompilationUnitElementImpl unit = library.definingCompilationUnit;
+    unit.types = <ClassElement>[classB, classM1, classM2, classC];
+    expect(classC.type.lookUpMethod(methodName, library), methodM2m);
+  }
+
+  void test_lookUpMethod_parameterized() {
+    //
+    // class A<E> { E m(E p) {} }
+    // class B<F> extends A<F> {}
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A", ["E"]);
+    DartType typeE = classA.type.typeArguments[0];
+    String methodName = "m";
+    MethodElementImpl methodM =
+        ElementFactory.methodElement(methodName, typeE, [typeE]);
+    classA.methods = <MethodElement>[methodM];
+    (methodM.type as FunctionTypeImpl).typeArguments =
+        classA.type.typeArguments;
+    ClassElementImpl classB = ElementFactory.classElement2("B", ["F"]);
+    InterfaceType typeB = classB.type;
+    InterfaceTypeImpl typeAF = new InterfaceTypeImpl(classA);
+    typeAF.typeArguments = <DartType>[typeB.typeArguments[0]];
+    classB.supertype = typeAF;
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    (unit as CompilationUnitElementImpl).types = <ClassElement>[classA];
+    //
+    // B<I>
+    //
+    InterfaceType typeI = ElementFactory.classElement2("I").type;
+    InterfaceTypeImpl typeBI = new InterfaceTypeImpl(classB);
+    typeBI.typeArguments = <DartType>[typeI];
+    MethodElement method = typeBI.lookUpMethod(methodName, library);
+    expect(method, isNotNull);
+    FunctionType methodType = method.type;
+    expect(methodType.returnType, same(typeI));
+    List<DartType> parameterTypes = methodType.normalParameterTypes;
+    expect(parameterTypes, hasLength(1));
+    expect(parameterTypes[0], same(typeI));
+  }
+
+  void test_lookUpMethod_recursive() {
+    //
+    // class A extends B {}
+    // class B extends A {}
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    ClassElementImpl classB = ElementFactory.classElement("B", typeA);
+    classA.supertype = classB.type;
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    (unit as CompilationUnitElementImpl).types = <ClassElement>[classA, classB];
+    expect(typeA.lookUpMethod("m", library), isNull);
+  }
+
+  void test_lookUpMethod_unimplemented() {
+    //
+    // class A {}
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    (unit as CompilationUnitElementImpl).types = <ClassElement>[classA];
+    expect(typeA.lookUpMethod("m", library), isNull);
+  }
+
+  void test_lookUpSetter_implemented() {
+    //
+    // class A { s(x) {} }
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String setterName = "s";
+    PropertyAccessorElement setterS =
+        ElementFactory.setterElement(setterName, false, null);
+    classA.accessors = <PropertyAccessorElement>[setterS];
+    InterfaceType typeA = classA.type;
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    (unit as CompilationUnitElementImpl).types = <ClassElement>[classA];
+    expect(typeA.lookUpSetter(setterName, library), same(setterS));
+  }
+
+  void test_lookUpSetter_inherited() {
+    //
+    // class A { s(x) {} }
+    // class B extends A {}
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String setterName = "g";
+    PropertyAccessorElement setterS =
+        ElementFactory.setterElement(setterName, false, null);
+    classA.accessors = <PropertyAccessorElement>[setterS];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    InterfaceType typeB = classB.type;
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    (unit as CompilationUnitElementImpl).types = <ClassElement>[classA, classB];
+    expect(typeB.lookUpSetter(setterName, library), same(setterS));
+  }
+
+  void test_lookUpSetter_mixin_shadowing() {
+    //
+    // class B {}
+    // class M1 { set s() {} }
+    // class M2 { set s() {} }
+    // class C extends B with M1, M2 {}
+    //
+    TestTypeProvider typeProvider = new TestTypeProvider();
+    String setterName = 's';
+    ClassElementImpl classB = ElementFactory.classElement2('B');
+    ClassElementImpl classM1 = ElementFactory.classElement2('M1');
+    PropertyAccessorElementImpl setterM1g = ElementFactory.setterElement(
+        setterName, false, typeProvider.dynamicType);
+    classM1.accessors = <PropertyAccessorElement>[setterM1g];
+    ClassElementImpl classM2 = ElementFactory.classElement2('M2');
+    PropertyAccessorElementImpl setterM2g = ElementFactory.getterElement(
+        setterName, false, typeProvider.dynamicType);
+    classM2.accessors = <PropertyAccessorElement>[setterM2g];
+    ClassElementImpl classC = ElementFactory.classElement('C', classB.type);
+    classC.mixins = <InterfaceType>[classM1.type, classM2.type];
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    CompilationUnitElementImpl unit = library.definingCompilationUnit;
+    unit.types = <ClassElement>[classB, classM1, classM2, classC];
+    expect(classC.type.lookUpGetter(setterName, library), setterM2g);
+  }
+
+  void test_lookUpSetter_recursive() {
+    //
+    // class A extends B {}
+    // class B extends A {}
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    ClassElementImpl classB = ElementFactory.classElement("B", typeA);
+    classA.supertype = classB.type;
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    (unit as CompilationUnitElementImpl).types = <ClassElement>[classA, classB];
+    expect(typeA.lookUpSetter("s", library), isNull);
+  }
+
+  void test_lookUpSetter_unimplemented() {
+    //
+    // class A {}
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    LibraryElementImpl library =
+        ElementFactory.library(createAnalysisContext(), "lib");
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    (unit as CompilationUnitElementImpl).types = <ClassElement>[classA];
+    expect(typeA.lookUpSetter("s", library), isNull);
+  }
+
+  void test_setTypeArguments() {
+    InterfaceTypeImpl type =
+        ElementFactory.classElement2("A").type as InterfaceTypeImpl;
+    List<DartType> typeArguments = <DartType>[
+      ElementFactory.classElement2("B").type,
+      ElementFactory.classElement2("C").type
+    ];
+    type.typeArguments = typeArguments;
+    expect(type.typeArguments, typeArguments);
+  }
+
+  void test_substitute_equal() {
+    ClassElement classAE = ElementFactory.classElement2("A", ["E"]);
+    InterfaceType typeAE = classAE.type;
+    InterfaceType argumentType = ElementFactory.classElement2("B").type;
+    List<DartType> args = [argumentType];
+    List<DartType> params = [classAE.typeParameters[0].type];
+    InterfaceType typeAESubbed = typeAE.substitute2(args, params);
+    expect(typeAESubbed.element, classAE);
+    List<DartType> resultArguments = typeAESubbed.typeArguments;
+    expect(resultArguments, hasLength(1));
+    expect(resultArguments[0], argumentType);
+  }
+
+  void test_substitute_exception() {
+    try {
+      ClassElementImpl classA = ElementFactory.classElement2("A");
+      InterfaceTypeImpl type = new InterfaceTypeImpl(classA);
+      InterfaceType argumentType = ElementFactory.classElement2("B").type;
+      type.substitute2(<DartType>[argumentType], <DartType>[]);
+      fail(
+          "Expected to encounter exception, argument and parameter type array lengths not equal.");
+    } catch (e) {
+      // Expected result
+    }
+  }
+
+  void test_substitute_notEqual() {
+    // The [test_substitute_equals] above has a slightly higher level
+    // implementation.
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    TypeParameterElementImpl parameterElement =
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("E"));
+    InterfaceTypeImpl type = new InterfaceTypeImpl(classA);
+    TypeParameterTypeImpl parameter =
+        new TypeParameterTypeImpl(parameterElement);
+    type.typeArguments = <DartType>[parameter];
+    InterfaceType argumentType = ElementFactory.classElement2("B").type;
+    TypeParameterTypeImpl parameterType = new TypeParameterTypeImpl(
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("F")));
+    InterfaceType result =
+        type.substitute2(<DartType>[argumentType], <DartType>[parameterType]);
+    expect(result.element, classA);
+    List<DartType> resultArguments = result.typeArguments;
+    expect(resultArguments, hasLength(1));
+    expect(resultArguments[0], parameter);
+  }
+}
+
+@reflectiveTest
+class LibraryElementImplTest extends EngineTestCase {
+  void test_creation() {
+    expect(
+        new LibraryElementImpl.forNode(
+            createAnalysisContext(), AstFactory.libraryIdentifier2(["l"])),
+        isNotNull);
+  }
+
+  void test_getImportedLibraries() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library1 = ElementFactory.library(context, "l1");
+    LibraryElementImpl library2 = ElementFactory.library(context, "l2");
+    LibraryElementImpl library3 = ElementFactory.library(context, "l3");
+    LibraryElementImpl library4 = ElementFactory.library(context, "l4");
+    PrefixElement prefixA =
+        new PrefixElementImpl.forNode(AstFactory.identifier3("a"));
+    PrefixElement prefixB =
+        new PrefixElementImpl.forNode(AstFactory.identifier3("b"));
+    List<ImportElementImpl> imports = [
+      ElementFactory.importFor(library2, null),
+      ElementFactory.importFor(library2, prefixB),
+      ElementFactory.importFor(library3, null),
+      ElementFactory.importFor(library3, prefixA),
+      ElementFactory.importFor(library3, prefixB),
+      ElementFactory.importFor(library4, prefixA)
+    ];
+    library1.imports = imports;
+    List<LibraryElement> libraries = library1.importedLibraries;
+    expect(libraries,
+        unorderedEquals(<LibraryElement>[library2, library3, library4]));
+  }
+
+  void test_getPrefixes() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library = ElementFactory.library(context, "l1");
+    PrefixElement prefixA =
+        new PrefixElementImpl.forNode(AstFactory.identifier3("a"));
+    PrefixElement prefixB =
+        new PrefixElementImpl.forNode(AstFactory.identifier3("b"));
+    List<ImportElementImpl> imports = [
+      ElementFactory.importFor(ElementFactory.library(context, "l2"), null),
+      ElementFactory.importFor(ElementFactory.library(context, "l3"), null),
+      ElementFactory.importFor(ElementFactory.library(context, "l4"), prefixA),
+      ElementFactory.importFor(ElementFactory.library(context, "l5"), prefixA),
+      ElementFactory.importFor(ElementFactory.library(context, "l6"), prefixB)
+    ];
+    library.imports = imports;
+    List<PrefixElement> prefixes = library.prefixes;
+    expect(prefixes, hasLength(2));
+    if (identical(prefixA, prefixes[0])) {
+      expect(prefixes[1], same(prefixB));
+    } else {
+      expect(prefixes[0], same(prefixB));
+      expect(prefixes[1], same(prefixA));
+    }
+  }
+
+  void test_getUnits() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library = ElementFactory.library(context, "test");
+    CompilationUnitElement unitLib = library.definingCompilationUnit;
+    CompilationUnitElementImpl unitA =
+        ElementFactory.compilationUnit("unit_a.dart", unitLib.source);
+    CompilationUnitElementImpl unitB =
+        ElementFactory.compilationUnit("unit_b.dart", unitLib.source);
+    library.parts = <CompilationUnitElement>[unitA, unitB];
+    expect(library.units,
+        unorderedEquals(<CompilationUnitElement>[unitLib, unitA, unitB]));
+  }
+
+  void test_getVisibleLibraries_cycle() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library = ElementFactory.library(context, "app");
+    LibraryElementImpl libraryA = ElementFactory.library(context, "A");
+    libraryA.imports = <ImportElementImpl>[
+      ElementFactory.importFor(library, null)
+    ];
+    library.imports = <ImportElementImpl>[
+      ElementFactory.importFor(libraryA, null)
+    ];
+    List<LibraryElement> libraries = library.visibleLibraries;
+    expect(libraries, unorderedEquals(<LibraryElement>[library, libraryA]));
+  }
+
+  void test_getVisibleLibraries_directExports() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library = ElementFactory.library(context, "app");
+    LibraryElementImpl libraryA = ElementFactory.library(context, "A");
+    library.exports = <ExportElementImpl>[ElementFactory.exportFor(libraryA)];
+    List<LibraryElement> libraries = library.visibleLibraries;
+    expect(libraries, unorderedEquals(<LibraryElement>[library]));
+  }
+
+  void test_getVisibleLibraries_directImports() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library = ElementFactory.library(context, "app");
+    LibraryElementImpl libraryA = ElementFactory.library(context, "A");
+    library.imports = <ImportElementImpl>[
+      ElementFactory.importFor(libraryA, null)
+    ];
+    List<LibraryElement> libraries = library.visibleLibraries;
+    expect(libraries, unorderedEquals(<LibraryElement>[library, libraryA]));
+  }
+
+  void test_getVisibleLibraries_indirectExports() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library = ElementFactory.library(context, "app");
+    LibraryElementImpl libraryA = ElementFactory.library(context, "A");
+    LibraryElementImpl libraryAA = ElementFactory.library(context, "AA");
+    libraryA.exports = <ExportElementImpl>[ElementFactory.exportFor(libraryAA)];
+    library.imports = <ImportElementImpl>[
+      ElementFactory.importFor(libraryA, null)
+    ];
+    List<LibraryElement> libraries = library.visibleLibraries;
+    expect(libraries,
+        unorderedEquals(<LibraryElement>[library, libraryA, libraryAA]));
+  }
+
+  void test_getVisibleLibraries_indirectImports() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library = ElementFactory.library(context, "app");
+    LibraryElementImpl libraryA = ElementFactory.library(context, "A");
+    LibraryElementImpl libraryAA = ElementFactory.library(context, "AA");
+    LibraryElementImpl libraryB = ElementFactory.library(context, "B");
+    libraryA.imports = <ImportElementImpl>[
+      ElementFactory.importFor(libraryAA, null)
+    ];
+    library.imports = <ImportElementImpl>[
+      ElementFactory.importFor(libraryA, null),
+      ElementFactory.importFor(libraryB, null)
+    ];
+    List<LibraryElement> libraries = library.visibleLibraries;
+    expect(
+        libraries,
+        unorderedEquals(
+            <LibraryElement>[library, libraryA, libraryAA, libraryB]));
+  }
+
+  void test_getVisibleLibraries_noImports() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library = ElementFactory.library(context, "app");
+    expect(
+        library.visibleLibraries, unorderedEquals(<LibraryElement>[library]));
+  }
+
+  void test_isUpToDate() {
+    AnalysisContext context = createAnalysisContext();
+    context.sourceFactory = new SourceFactory([]);
+    LibraryElement library = ElementFactory.library(context, "foo");
+    context.setContents(library.definingCompilationUnit.source, "sdfsdff");
+    // Assert that we are not up to date if the target has an old time stamp.
+    expect(library.isUpToDate(0), isFalse);
+    // Assert that we are up to date with a target modification time in the
+    // future.
+    expect(library.isUpToDate(JavaSystem.currentTimeMillis() + 1000), isTrue);
+  }
+
+  void test_setImports() {
+    AnalysisContext context = createAnalysisContext();
+    LibraryElementImpl library = new LibraryElementImpl.forNode(
+        context, AstFactory.libraryIdentifier2(["l1"]));
+    List<ImportElementImpl> expectedImports = [
+      ElementFactory.importFor(ElementFactory.library(context, "l2"), null),
+      ElementFactory.importFor(ElementFactory.library(context, "l3"), null)
+    ];
+    library.imports = expectedImports;
+    List<ImportElement> actualImports = library.imports;
+    expect(actualImports, hasLength(expectedImports.length));
+    for (int i = 0; i < actualImports.length; i++) {
+      expect(actualImports[i], same(expectedImports[i]));
+    }
+  }
+}
+
+@reflectiveTest
+class MethodElementImplTest extends EngineTestCase {
+  void test_computeNode() {
+    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
+    AnalysisContext context = contextHelper.context;
+    Source source = contextHelper.addSource(
+        "/test.dart",
+        r'''
+abstract class A {
+  String m1() => null;
+  m2();
+}
+''');
+    // prepare CompilationUnitElement
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
+    // m1
+    {
+      MethodElement m1Element = unitElement.getType("A").getMethod('m1');
+      MethodDeclaration m1Node = m1Element.computeNode();
+      expect(m1Node, isNotNull);
+      expect(m1Node.name.name, "m1");
+      expect(m1Node.element, same(m1Element));
+    }
+    // m2
+    {
+      MethodElement m2Element = unitElement.getType("A").getMethod('m2');
+      MethodDeclaration m2Node = m2Element.computeNode();
+      expect(m2Node, isNotNull);
+      expect(m2Node.name.name, "m2");
+      expect(m2Node.element, same(m2Element));
+    }
+  }
+
+  void test_computeNode_withoutFunctionBody() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.analyzeFunctionBodies = false;
+    AnalysisContextHelper contextHelper = new AnalysisContextHelper(options);
+    AnalysisContext context = contextHelper.context;
+    Source source = contextHelper.addSource(
+        "/test.dart",
+        r'''
+abstract class A {
+  String m1() => null;
+  m2();
+}
+''');
+    // prepare CompilationUnitElement
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
+    // m1
+    {
+      MethodElement m1Element = unitElement.getType("A").getMethod('m1');
+      MethodDeclaration m1Node = m1Element.computeNode();
+      expect(m1Node, isNotNull);
+      expect(m1Node.name.name, "m1");
+      expect(m1Node.element, same(m1Element));
+    }
+    // m2
+    {
+      MethodElement m2Element = unitElement.getType("A").getMethod('m2');
+      MethodDeclaration m2Node = m2Element.computeNode();
+      expect(m2Node, isNotNull);
+      expect(m2Node.name.name, "m2");
+      expect(m2Node.element, same(m2Element));
+    }
+  }
+}
+
+@reflectiveTest
+class MultiplyDefinedElementImplTest extends EngineTestCase {
+  void test_fromElements_conflicting() {
+    Element firstElement = ElementFactory.localVariableElement2("xx");
+    Element secondElement = ElementFactory.localVariableElement2("yy");
+    Element result = MultiplyDefinedElementImpl.fromElements(
+        null, firstElement, secondElement);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is MultiplyDefinedElement, MultiplyDefinedElement, result);
+    List<Element> elements =
+        (result as MultiplyDefinedElement).conflictingElements;
+    expect(elements, hasLength(2));
+    for (int i = 0; i < elements.length; i++) {
+      EngineTestCase.assertInstanceOf((obj) => obj is LocalVariableElement,
+          LocalVariableElement, elements[i]);
+    }
+  }
+
+  void test_fromElements_multiple() {
+    Element firstElement = ElementFactory.localVariableElement2("xx");
+    Element secondElement = ElementFactory.localVariableElement2("yy");
+    Element thirdElement = ElementFactory.localVariableElement2("zz");
+    Element result = MultiplyDefinedElementImpl.fromElements(
+        null,
+        MultiplyDefinedElementImpl.fromElements(
+            null, firstElement, secondElement),
+        thirdElement);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is MultiplyDefinedElement, MultiplyDefinedElement, result);
+    List<Element> elements =
+        (result as MultiplyDefinedElement).conflictingElements;
+    expect(elements, hasLength(3));
+    for (int i = 0; i < elements.length; i++) {
+      EngineTestCase.assertInstanceOf((obj) => obj is LocalVariableElement,
+          LocalVariableElement, elements[i]);
+    }
+  }
+
+  void test_fromElements_nonConflicting() {
+    Element element = ElementFactory.localVariableElement2("xx");
+    expect(MultiplyDefinedElementImpl.fromElements(null, element, element),
+        same(element));
+  }
+}
+
+@reflectiveTest
+class ParameterElementImplTest extends EngineTestCase {
+  void test_computeNode_DefaultFormalParameter() {
+    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
+    AnalysisContext context = contextHelper.context;
+    Source source = contextHelper.addSource(
+        "/test.dart",
+        r'''
+main([int p = 42]) {
+}''');
+    // prepare CompilationUnitElement
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
+    // p
+    {
+      ParameterElement element = unitElement.functions[0].parameters[0];
+      DefaultFormalParameter node = element.computeNode();
+      expect(node, isNotNull);
+      expect(node.identifier.name, 'p');
+      expect(node.element, same(element));
+    }
+  }
+
+  void test_computeNode_FieldFormalParameter() {
+    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
+    AnalysisContext context = contextHelper.context;
+    Source source = contextHelper.addSource(
+        "/test.dart",
+        r'''
+class A {
+  int p;
+  A(this.p) {
+  }
+}''');
+    // prepare CompilationUnitElement
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
+    // p
+    {
+      ClassElement classA = unitElement.types[0];
+      ConstructorElement constructorA = classA.constructors[0];
+      FieldFormalParameterElement element = constructorA.parameters[0];
+      FieldFormalParameter node = element.computeNode();
+      expect(node, isNotNull);
+      expect(node.identifier.name, 'p');
+      expect(node.element, same(element));
+    }
+  }
+
+  void test_computeNode_FunctionTypedFormalParameter() {
+    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
+    AnalysisContext context = contextHelper.context;
+    Source source = contextHelper.addSource(
+        "/test.dart",
+        r'''
+main(p(int a, int b)) {
+}''');
+    // prepare CompilationUnitElement
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
+    // p
+    {
+      ParameterElement element = unitElement.functions[0].parameters[0];
+      FunctionTypedFormalParameter node = element.computeNode();
+      expect(node, isNotNull);
+      expect(node.identifier.name, 'p');
+      expect(node.element, same(element));
+    }
+  }
+
+  void test_computeNode_SimpleFormalParameter() {
+    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
+    AnalysisContext context = contextHelper.context;
+    Source source = contextHelper.addSource(
+        "/test.dart",
+        r'''
+main(int p) {
+}''');
+    // prepare CompilationUnitElement
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+    CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
+    // p
+    {
+      ParameterElement element = unitElement.functions[0].parameters[0];
+      SimpleFormalParameter node = element.computeNode();
+      expect(node, isNotNull);
+      expect(node.identifier.name, 'p');
+      expect(node.element, same(element));
+    }
+  }
+}
+
+@reflectiveTest
+class TypeParameterTypeImplTest extends EngineTestCase {
+  void test_creation() {
+    expect(
+        new TypeParameterTypeImpl(
+            new TypeParameterElementImpl.forNode(AstFactory.identifier3("E"))),
+        isNotNull);
+  }
+
+  void test_getElement() {
+    TypeParameterElementImpl element =
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("E"));
+    TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
+    expect(type.element, element);
+  }
+
+  void test_isMoreSpecificThan_typeArguments_dynamic() {
+    TypeParameterElementImpl element =
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("E"));
+    TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
+    // E << dynamic
+    expect(type.isMoreSpecificThan(DynamicTypeImpl.instance), isTrue);
+  }
+
+  void test_isMoreSpecificThan_typeArguments_object() {
+    TypeParameterElementImpl element =
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("E"));
+    TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
+    // E << Object
+    expect(type.isMoreSpecificThan(ElementFactory.object.type), isTrue);
+  }
+
+  void test_isMoreSpecificThan_typeArguments_resursive() {
+    ClassElementImpl classS = ElementFactory.classElement2("A");
+    TypeParameterElementImpl typeParameterU =
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("U"));
+    TypeParameterTypeImpl typeParameterTypeU =
+        new TypeParameterTypeImpl(typeParameterU);
+    TypeParameterElementImpl typeParameterT =
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("T"));
+    TypeParameterTypeImpl typeParameterTypeT =
+        new TypeParameterTypeImpl(typeParameterT);
+    typeParameterT.bound = typeParameterTypeU;
+    typeParameterU.bound = typeParameterTypeU;
+    // <T extends U> and <U extends T>
+    // T << S
+    expect(typeParameterTypeT.isMoreSpecificThan(classS.type), isFalse);
+  }
+
+  void test_isMoreSpecificThan_typeArguments_self() {
+    TypeParameterElementImpl element =
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("E"));
+    TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
+    // E << E
+    expect(type.isMoreSpecificThan(type), isTrue);
+  }
+
+  void test_isMoreSpecificThan_typeArguments_transitivity_interfaceTypes() {
+    //  class A {}
+    //  class B extends A {}
+    //
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    TypeParameterElementImpl typeParameterT =
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("T"));
+    typeParameterT.bound = typeB;
+    TypeParameterTypeImpl typeParameterTypeT =
+        new TypeParameterTypeImpl(typeParameterT);
+    // <T extends B>
+    // T << A
+    expect(typeParameterTypeT.isMoreSpecificThan(typeA), isTrue);
+  }
+
+  void test_isMoreSpecificThan_typeArguments_transitivity_typeParameters() {
+    ClassElementImpl classS = ElementFactory.classElement2("A");
+    TypeParameterElementImpl typeParameterU =
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("U"));
+    typeParameterU.bound = classS.type;
+    TypeParameterTypeImpl typeParameterTypeU =
+        new TypeParameterTypeImpl(typeParameterU);
+    TypeParameterElementImpl typeParameterT =
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("T"));
+    typeParameterT.bound = typeParameterTypeU;
+    TypeParameterTypeImpl typeParameterTypeT =
+        new TypeParameterTypeImpl(typeParameterT);
+    // <T extends U> and <U extends S>
+    // T << S
+    expect(typeParameterTypeT.isMoreSpecificThan(classS.type), isTrue);
+  }
+
+  void test_isMoreSpecificThan_typeArguments_upperBound() {
+    ClassElementImpl classS = ElementFactory.classElement2("A");
+    TypeParameterElementImpl typeParameterT =
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("T"));
+    typeParameterT.bound = classS.type;
+    TypeParameterTypeImpl typeParameterTypeT =
+        new TypeParameterTypeImpl(typeParameterT);
+    // <T extends S>
+    // T << S
+    expect(typeParameterTypeT.isMoreSpecificThan(classS.type), isTrue);
+  }
+
+  void test_substitute_equal() {
+    TypeParameterElementImpl element =
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("E"));
+    TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
+    InterfaceTypeImpl argument = new InterfaceTypeImpl(
+        new ClassElementImpl.forNode(AstFactory.identifier3("A")));
+    TypeParameterTypeImpl parameter = new TypeParameterTypeImpl(element);
+    expect(type.substitute2(<DartType>[argument], <DartType>[parameter]),
+        same(argument));
+  }
+
+  void test_substitute_notEqual() {
+    TypeParameterTypeImpl type = new TypeParameterTypeImpl(
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("E")));
+    InterfaceTypeImpl argument = new InterfaceTypeImpl(
+        new ClassElementImpl.forNode(AstFactory.identifier3("A")));
+    TypeParameterTypeImpl parameter = new TypeParameterTypeImpl(
+        new TypeParameterElementImpl.forNode(AstFactory.identifier3("F")));
+    expect(type.substitute2(<DartType>[argument], <DartType>[parameter]),
+        same(type));
+  }
+}
+
+@reflectiveTest
+class VoidTypeImplTest extends EngineTestCase {
+  /**
+   * Reference {code VoidTypeImpl.getInstance()}.
+   */
+  DartType _voidType = VoidTypeImpl.instance;
+
+  void test_isMoreSpecificThan_void_A() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    expect(_voidType.isMoreSpecificThan(classA.type), isFalse);
+  }
+
+  void test_isMoreSpecificThan_void_dynamic() {
+    expect(_voidType.isMoreSpecificThan(DynamicTypeImpl.instance), isTrue);
+  }
+
+  void test_isMoreSpecificThan_void_void() {
+    expect(_voidType.isMoreSpecificThan(_voidType), isTrue);
+  }
+
+  void test_isSubtypeOf_void_A() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    expect(_voidType.isSubtypeOf(classA.type), isFalse);
+  }
+
+  void test_isSubtypeOf_void_dynamic() {
+    expect(_voidType.isSubtypeOf(DynamicTypeImpl.instance), isTrue);
+  }
+
+  void test_isSubtypeOf_void_void() {
+    expect(_voidType.isSubtypeOf(_voidType), isTrue);
+  }
+
+  void test_isVoid() {
+    expect(_voidType.isVoid, isTrue);
+  }
+}
+
+class _FunctionTypeImplTest_isSubtypeOf_baseCase_classFunction
+    extends InterfaceTypeImpl {
+  _FunctionTypeImplTest_isSubtypeOf_baseCase_classFunction(ClassElement arg0)
+      : super(arg0);
+
+  @override
+  bool get isDartCoreFunction => true;
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/engine_test.dart b/mojo/public/dart/third_party/analyzer/test/generated/engine_test.dart
new file mode 100644
index 0000000..e4746a4
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/generated/engine_test.dart
@@ -0,0 +1,7015 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.engine_test;
+
+import 'dart:async';
+import 'dart:collection';
+
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/cancelable_future.dart';
+import 'package:analyzer/src/context/cache.dart' show CacheEntry;
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/constant.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/html.dart' as ht;
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/java_engine_io.dart';
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/parser.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/sdk_io.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/testing/ast_factory.dart';
+import 'package:analyzer/src/generated/testing/element_factory.dart';
+import 'package:analyzer/src/generated/utilities_collection.dart';
+import 'package:analyzer/src/services/lint.dart';
+import 'package:analyzer/src/string_source.dart';
+import 'package:analyzer/task/model.dart' hide AnalysisTask, WorkManager;
+import 'package:html/dom.dart' show Document;
+import 'package:path/path.dart' as pathos;
+import 'package:typed_mock/typed_mock.dart';
+import 'package:unittest/unittest.dart';
+import 'package:watcher/src/utils.dart';
+
+import '../reflective_tests.dart';
+import '../utils.dart';
+import 'all_the_rest_test.dart';
+import 'resolver_test.dart';
+import 'test_support.dart';
+
+main() {
+  initializeTestEnvironment();
+  // Tests for the classes used in both old and new analysis implementations.
+  runReflectiveTests(SourcesChangedEventTest);
+  // Tests for the classes used in the old analysis implementation.
+  if (!AnalysisEngine.instance.useTaskModel) {
+    runReflectiveTests(AnalysisCacheTest);
+    runReflectiveTests(AnalysisContextImplTest);
+    runReflectiveTests(AnalysisTaskTest);
+    runReflectiveTests(AnalysisOptionsImplTest);
+    runReflectiveTests(DartEntryTest);
+    runReflectiveTests(GenerateDartErrorsTaskTest);
+    runReflectiveTests(GenerateDartHintsTaskTest);
+    runReflectiveTests(GenerateDartLintsTaskTest);
+    runReflectiveTests(GetContentTaskTest);
+    runReflectiveTests(HtmlEntryTest);
+    runReflectiveTests(IncrementalAnalysisCacheTest);
+    runReflectiveTests(IncrementalAnalysisTaskTest);
+    runReflectiveTests(LintGeneratorTest);
+    runReflectiveTests(ParseDartTaskTest);
+    runReflectiveTests(ParseHtmlTaskTest);
+    runReflectiveTests(PartitionManagerTest);
+    runReflectiveTests(ResolveDartLibraryTaskTest);
+    runReflectiveTests(ResolveDartUnitTaskTest);
+    runReflectiveTests(ResolveHtmlTaskTest);
+    runReflectiveTests(ScanDartTaskTest);
+    runReflectiveTests(SdkCachePartitionTest);
+    runReflectiveTests(UniversalCachePartitionTest);
+    runReflectiveTests(WorkManagerTest);
+  }
+}
+
+@reflectiveTest
+class AnalysisCacheTest extends EngineTestCase {
+  void test_creation() {
+    expect(new AnalysisCache(new List<CachePartition>(0)), isNotNull);
+  }
+
+  void test_get() {
+    AnalysisCache cache = new AnalysisCache(new List<CachePartition>(0));
+    TestSource source = new TestSource();
+    expect(cache.get(source), isNull);
+  }
+
+  void test_iterator() {
+    CachePartition partition =
+        new UniversalCachePartition(null, 8, new DefaultRetentionPolicy());
+    AnalysisCache cache = new AnalysisCache(<CachePartition>[partition]);
+    TestSource source = new TestSource();
+    DartEntry entry = new DartEntry();
+    cache.put(source, entry);
+    MapIterator<Source, SourceEntry> iterator = cache.iterator();
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.key, same(source));
+    expect(iterator.value, same(entry));
+    expect(iterator.moveNext(), isFalse);
+  }
+
+  /**
+   * Verify that if multiple Source objects refer to the same file via
+   * different URIs, they are treated as separate entries in the cache.
+   */
+  void test_lookup_distinguishes_uris() {
+    CachePartition partition =
+        new UniversalCachePartition(null, 8, new DefaultRetentionPolicy());
+    AnalysisCache cache = new AnalysisCache(<CachePartition>[partition]);
+    JavaFile file = new JavaFile('baz.dart');
+    Source source1 = new FileBasedSource(file);
+    Source source2 =
+        new FileBasedSource(file, Uri.parse('package:foo/baz.dart'));
+    Source source3 =
+        new FileBasedSource(file, Uri.parse('package:bar/baz.dart'));
+    DartEntry entry1 = new DartEntry();
+    DartEntry entry2 = new DartEntry();
+    DartEntry entry3 = new DartEntry();
+    cache.put(source1, entry1);
+    cache.put(source2, entry2);
+    cache.put(source3, entry3);
+    expect(cache.get(source1), same(entry1));
+    expect(cache.get(source2), same(entry2));
+    expect(cache.get(source3), same(entry3));
+  }
+
+  void test_put_noFlush() {
+    CachePartition partition =
+        new UniversalCachePartition(null, 8, new DefaultRetentionPolicy());
+    AnalysisCache cache = new AnalysisCache(<CachePartition>[partition]);
+    TestSource source = new TestSource();
+    DartEntry entry = new DartEntry();
+    cache.put(source, entry);
+    expect(cache.get(source), same(entry));
+  }
+
+  void test_setMaxCacheSize() {
+    CachePartition partition = new UniversalCachePartition(
+        null, 8, new _AnalysisCacheTest_test_setMaxCacheSize());
+    AnalysisCache cache = new AnalysisCache(<CachePartition>[partition]);
+    int size = 6;
+    for (int i = 0; i < size; i++) {
+      Source source = new TestSource("/test$i.dart");
+      DartEntry entry = new DartEntry();
+      entry.setValue(DartEntry.PARSED_UNIT, null);
+      cache.put(source, entry);
+      cache.accessedAst(source);
+    }
+    _assertNonFlushedCount(size, cache);
+    int newSize = size - 2;
+    partition.maxCacheSize = newSize;
+    _assertNonFlushedCount(newSize, cache);
+  }
+
+  void test_size() {
+    CachePartition partition =
+        new UniversalCachePartition(null, 8, new DefaultRetentionPolicy());
+    AnalysisCache cache = new AnalysisCache(<CachePartition>[partition]);
+    int size = 4;
+    for (int i = 0; i < size; i++) {
+      Source source = new TestSource("/test$i.dart");
+      cache.put(source, new DartEntry());
+      cache.accessedAst(source);
+    }
+    expect(cache.size(), size);
+  }
+
+  void _assertNonFlushedCount(int expectedCount, AnalysisCache cache) {
+    int nonFlushedCount = 0;
+    MapIterator<Source, SourceEntry> iterator = cache.iterator();
+    while (iterator.moveNext()) {
+      if (iterator.value.getState(DartEntry.PARSED_UNIT) !=
+          CacheState.FLUSHED) {
+        nonFlushedCount++;
+      }
+    }
+    expect(nonFlushedCount, expectedCount);
+  }
+}
+
+@reflectiveTest
+class AnalysisContextImplTest extends EngineTestCase {
+  /**
+   * An analysis context whose source factory is [sourceFactory].
+   */
+  AnalysisContextImpl _context;
+
+  /**
+   * The source factory associated with the analysis [context].
+   */
+  SourceFactory _sourceFactory;
+
+  void fail_performAnalysisTask_importedLibraryDelete_html() {
+    Source htmlSource = _addSource(
+        "/page.html",
+        r'''
+<html><body><script type="application/dart">
+  import 'libB.dart';
+  main() {print('hello dart');}
+</script></body></html>''');
+    Source libBSource = _addSource("/libB.dart", "library libB;");
+    _analyzeAll_assertFinished();
+    expect(_context.getResolvedHtmlUnit(htmlSource), isNotNull,
+        reason: "htmlUnit resolved 1");
+    expect(
+        _context.getResolvedCompilationUnit2(libBSource, libBSource), isNotNull,
+        reason: "libB resolved 1");
+    expect(!_hasAnalysisErrorWithErrorSeverity(_context.getErrors(htmlSource)),
+        isTrue,
+        reason: "htmlSource doesn't have errors");
+    // remove libB.dart content and analyze
+    _context.setContents(libBSource, null);
+    _analyzeAll_assertFinished();
+    expect(_context.getResolvedHtmlUnit(htmlSource), isNotNull,
+        reason: "htmlUnit resolved 1");
+    AnalysisErrorInfo errors = _context.getErrors(htmlSource);
+    expect(_hasAnalysisErrorWithErrorSeverity(errors), isTrue,
+        reason: "htmlSource has an error");
+  }
+
+  void fail_recordLibraryElements() {
+    fail("Implement this");
+  }
+
+  @override
+  void setUp() {
+    _context = new AnalysisContextImpl();
+    _sourceFactory = new SourceFactory([
+      new DartUriResolver(DirectoryBasedDartSdk.defaultSdk),
+      new FileUriResolver()
+    ]);
+    _context.sourceFactory = _sourceFactory;
+    AnalysisOptionsImpl options =
+        new AnalysisOptionsImpl.from(_context.analysisOptions);
+    options.cacheSize = 256;
+    _context.analysisOptions = options;
+  }
+
+  @override
+  void tearDown() {
+    _context = null;
+    _sourceFactory = null;
+    super.tearDown();
+  }
+
+  Future test_applyChanges_add() {
+    SourcesChangedListener listener = new SourcesChangedListener();
+    _context.onSourcesChanged.listen(listener.onData);
+    expect(_context.sourcesNeedingProcessing.isEmpty, isTrue);
+    Source source =
+        new FileBasedSource(FileUtilities2.createFile("/test.dart"));
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(source);
+    _context.applyChanges(changeSet);
+    expect(_context.sourcesNeedingProcessing.contains(source), isTrue);
+    return pumpEventQueue().then((_) {
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertNoMoreEvents();
+    });
+  }
+
+  Future test_applyChanges_change() {
+    SourcesChangedListener listener = new SourcesChangedListener();
+    _context.onSourcesChanged.listen(listener.onData);
+    expect(_context.sourcesNeedingProcessing.isEmpty, isTrue);
+    Source source =
+        new FileBasedSource(FileUtilities2.createFile("/test.dart"));
+    ChangeSet changeSet1 = new ChangeSet();
+    changeSet1.addedSource(source);
+    _context.applyChanges(changeSet1);
+    expect(_context.sourcesNeedingProcessing.contains(source), isTrue);
+    Source source2 =
+        new FileBasedSource(FileUtilities2.createFile("/test2.dart"));
+    ChangeSet changeSet2 = new ChangeSet();
+    changeSet2.addedSource(source2);
+    changeSet2.changedSource(source);
+    _context.applyChanges(changeSet2);
+    return pumpEventQueue().then((_) {
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(wereSourcesAdded: true, changedSources: [source]);
+      listener.assertNoMoreEvents();
+    });
+  }
+
+  Future test_applyChanges_change_content() {
+    SourcesChangedListener listener = new SourcesChangedListener();
+    _context.onSourcesChanged.listen(listener.onData);
+    expect(_context.sourcesNeedingProcessing.isEmpty, isTrue);
+    Source source =
+        new FileBasedSource(FileUtilities2.createFile("/test.dart"));
+    ChangeSet changeSet1 = new ChangeSet();
+    changeSet1.addedSource(source);
+    _context.applyChanges(changeSet1);
+    expect(_context.sourcesNeedingProcessing.contains(source), isTrue);
+    Source source2 =
+        new FileBasedSource(FileUtilities2.createFile("/test2.dart"));
+    ChangeSet changeSet2 = new ChangeSet();
+    changeSet2.addedSource(source2);
+    changeSet2.changedContent(source, 'library test;');
+    _context.applyChanges(changeSet2);
+    return pumpEventQueue().then((_) {
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(wereSourcesAdded: true, changedSources: [source]);
+      listener.assertNoMoreEvents();
+    });
+  }
+
+  void test_applyChanges_change_flush_element() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source librarySource = _addSource(
+        "/lib.dart",
+        r'''
+library lib;
+int a = 0;''');
+    expect(_context.computeLibraryElement(librarySource), isNotNull);
+    _context.setContents(
+        librarySource,
+        r'''
+library lib;
+int aa = 0;''');
+    expect(_context.getLibraryElement(librarySource), isNull);
+  }
+
+  Future test_applyChanges_change_multiple() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    SourcesChangedListener listener = new SourcesChangedListener();
+    _context.onSourcesChanged.listen(listener.onData);
+    _sourceFactory = _context.sourceFactory;
+    String libraryContents1 = r'''
+library lib;
+part 'part.dart';
+int a = 0;''';
+    Source librarySource = _addSource("/lib.dart", libraryContents1);
+    String partContents1 = r'''
+part of lib;
+int b = a;''';
+    Source partSource = _addSource("/part.dart", partContents1);
+    _context.computeLibraryElement(librarySource);
+    String libraryContents2 = r'''
+library lib;
+part 'part.dart';
+int aa = 0;''';
+    _context.setContents(librarySource, libraryContents2);
+    String partContents2 = r'''
+part of lib;
+int b = aa;''';
+    _context.setContents(partSource, partContents2);
+    _context.computeLibraryElement(librarySource);
+    CompilationUnit libraryUnit =
+        _context.resolveCompilationUnit2(librarySource, librarySource);
+    CompilationUnit partUnit =
+        _context.resolveCompilationUnit2(partSource, librarySource);
+    TopLevelVariableDeclaration declaration =
+        libraryUnit.declarations[0] as TopLevelVariableDeclaration;
+    Element declarationElement = declaration.variables.variables[0].element;
+    TopLevelVariableDeclaration use =
+        partUnit.declarations[0] as TopLevelVariableDeclaration;
+    Element useElement = (use.variables.variables[0].initializer
+        as SimpleIdentifier).staticElement;
+    expect((useElement as PropertyAccessorElement).variable,
+        same(declarationElement));
+    return pumpEventQueue().then((_) {
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(changedSources: [librarySource]);
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(changedSources: [partSource]);
+      listener.assertEvent(changedSources: [librarySource]);
+      listener.assertEvent(changedSources: [partSource]);
+      listener.assertNoMoreEvents();
+    });
+  }
+
+  Future test_applyChanges_change_range() {
+    SourcesChangedListener listener = new SourcesChangedListener();
+    _context.onSourcesChanged.listen(listener.onData);
+    expect(_context.sourcesNeedingProcessing.isEmpty, isTrue);
+    Source source =
+        new FileBasedSource(FileUtilities2.createFile("/test.dart"));
+    ChangeSet changeSet1 = new ChangeSet();
+    changeSet1.addedSource(source);
+    _context.applyChanges(changeSet1);
+    expect(_context.sourcesNeedingProcessing.contains(source), isTrue);
+    Source source2 =
+        new FileBasedSource(FileUtilities2.createFile("/test2.dart"));
+    ChangeSet changeSet2 = new ChangeSet();
+    changeSet2.addedSource(source2);
+    changeSet2.changedRange(source, 'library test;', 0, 0, 13);
+    _context.applyChanges(changeSet2);
+    return pumpEventQueue().then((_) {
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(wereSourcesAdded: true, changedSources: [source]);
+      listener.assertNoMoreEvents();
+    });
+  }
+
+  void test_applyChanges_empty() {
+    _context.applyChanges(new ChangeSet());
+    expect(_context.performAnalysisTask().changeNotices, isNull);
+  }
+
+  void test_applyChanges_overriddenSource() {
+    // Note: addSource adds the source to the contentCache.
+    Source source = _addSource("/test.dart", "library test;");
+    _context.computeErrors(source);
+    while (!_context.sourcesNeedingProcessing.isEmpty) {
+      _context.performAnalysisTask();
+    }
+    // Adding the source as a changedSource should have no effect since
+    // it is already overridden in the content cache.
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.changedSource(source);
+    _context.applyChanges(changeSet);
+    expect(_context.sourcesNeedingProcessing, hasLength(0));
+  }
+
+  Future test_applyChanges_remove() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    SourcesChangedListener listener = new SourcesChangedListener();
+    _context.onSourcesChanged.listen(listener.onData);
+    _sourceFactory = _context.sourceFactory;
+    String libAContents = r'''
+library libA;
+import 'libB.dart';''';
+    Source libA = _addSource("/libA.dart", libAContents);
+    String libBContents = "library libB;";
+    Source libB = _addSource("/libB.dart", libBContents);
+    LibraryElement libAElement = _context.computeLibraryElement(libA);
+    List<LibraryElement> importedLibraries = libAElement.importedLibraries;
+    expect(importedLibraries, hasLength(2));
+    _context.computeErrors(libA);
+    _context.computeErrors(libB);
+    expect(_context.sourcesNeedingProcessing, hasLength(0));
+    _context.setContents(libB, null);
+    _removeSource(libB);
+    List<Source> sources = _context.sourcesNeedingProcessing;
+    expect(sources, hasLength(1));
+    expect(sources[0], same(libA));
+    libAElement = _context.computeLibraryElement(libA);
+    importedLibraries = libAElement.importedLibraries;
+    expect(importedLibraries, hasLength(1));
+    return pumpEventQueue().then((_) {
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(changedSources: [libA]);
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(changedSources: [libB]);
+      listener.assertEvent(changedSources: [libB]);
+      listener.assertEvent(wereSourcesRemovedOrDeleted: true);
+      listener.assertNoMoreEvents();
+    });
+  }
+
+  /**
+   * IDEA uses the following scenario:
+   * 1. Add overlay.
+   * 2. Change overlay.
+   * 3. If the contents of the document buffer is the same as the contents
+   *    of the file, remove overlay.
+   * So, we need to try to use incremental resolution for removing overlays too.
+   */
+  void test_applyChanges_remove_incremental() {
+    MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
+    Source source = resourceProvider
+        .newFile(
+            '/test.dart',
+            r'''
+main() {
+  print(1);
+}
+''')
+        .createSource();
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _context.analysisOptions = new AnalysisOptionsImpl()..incremental = true;
+    _context.applyChanges(new ChangeSet()..addedSource(source));
+    // remember compilation unit
+    _analyzeAll_assertFinished();
+    CompilationUnit unit = _context.getResolvedCompilationUnit2(source, source);
+    // add overlay
+    _context.setContents(
+        source,
+        r'''
+main() {
+  print(12);
+}
+''');
+    _analyzeAll_assertFinished();
+    expect(_context.getResolvedCompilationUnit2(source, source), unit);
+    // remove overlay
+    _context.setContents(source, null);
+    _context.validateCacheConsistency();
+    _analyzeAll_assertFinished();
+    expect(_context.getResolvedCompilationUnit2(source, source), unit);
+  }
+
+  Future test_applyChanges_removeContainer() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    SourcesChangedListener listener = new SourcesChangedListener();
+    _context.onSourcesChanged.listen(listener.onData);
+    _sourceFactory = _context.sourceFactory;
+    String libAContents = r'''
+library libA;
+import 'libB.dart';''';
+    Source libA = _addSource("/libA.dart", libAContents);
+    String libBContents = "library libB;";
+    Source libB = _addSource("/libB.dart", libBContents);
+    _context.computeLibraryElement(libA);
+    _context.computeErrors(libA);
+    _context.computeErrors(libB);
+    expect(_context.sourcesNeedingProcessing, hasLength(0));
+    ChangeSet changeSet = new ChangeSet();
+    SourceContainer removedContainer =
+        new _AnalysisContextImplTest_test_applyChanges_removeContainer(libB);
+    changeSet.removedContainer(removedContainer);
+    _context.applyChanges(changeSet);
+    List<Source> sources = _context.sourcesNeedingProcessing;
+    expect(sources, hasLength(1));
+    expect(sources[0], same(libA));
+    return pumpEventQueue().then((_) {
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(changedSources: [libA]);
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(changedSources: [libB]);
+      listener.assertEvent(wereSourcesRemovedOrDeleted: true);
+      listener.assertNoMoreEvents();
+    });
+  }
+
+  void test_computeDocumentationComment_block() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    String comment = "/** Comment */";
+    Source source = _addSource(
+        "/test.dart",
+        """
+$comment
+class A {}""");
+    LibraryElement libraryElement = _context.computeLibraryElement(source);
+    expect(libraryElement, isNotNull);
+    ClassElement classElement = libraryElement.definingCompilationUnit.types[0];
+    expect(libraryElement, isNotNull);
+    expect(_context.computeDocumentationComment(classElement), comment);
+  }
+
+  void test_computeDocumentationComment_none() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source source = _addSource("/test.dart", "class A {}");
+    LibraryElement libraryElement = _context.computeLibraryElement(source);
+    expect(libraryElement, isNotNull);
+    ClassElement classElement = libraryElement.definingCompilationUnit.types[0];
+    expect(libraryElement, isNotNull);
+    expect(_context.computeDocumentationComment(classElement), isNull);
+  }
+
+  void test_computeDocumentationComment_null() {
+    expect(_context.computeDocumentationComment(null), isNull);
+  }
+
+  void test_computeDocumentationComment_singleLine_multiple_EOL_n() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    String comment = "/// line 1\n/// line 2\n/// line 3\n";
+    Source source = _addSource("/test.dart", "${comment}class A {}");
+    LibraryElement libraryElement = _context.computeLibraryElement(source);
+    expect(libraryElement, isNotNull);
+    ClassElement classElement = libraryElement.definingCompilationUnit.types[0];
+    expect(libraryElement, isNotNull);
+    String actual = _context.computeDocumentationComment(classElement);
+    expect(actual, "/// line 1\n/// line 2\n/// line 3");
+  }
+
+  void test_computeDocumentationComment_singleLine_multiple_EOL_rn() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    String comment = "/// line 1\r\n/// line 2\r\n/// line 3\r\n";
+    Source source = _addSource("/test.dart", "${comment}class A {}");
+    LibraryElement libraryElement = _context.computeLibraryElement(source);
+    expect(libraryElement, isNotNull);
+    ClassElement classElement = libraryElement.definingCompilationUnit.types[0];
+    expect(libraryElement, isNotNull);
+    String actual = _context.computeDocumentationComment(classElement);
+    expect(actual, "/// line 1\n/// line 2\n/// line 3");
+  }
+
+  void test_computeErrors_dart_none() {
+    Source source = _addSource("/lib.dart", "library lib;");
+    List<AnalysisError> errors = _context.computeErrors(source);
+    expect(errors, hasLength(0));
+  }
+
+  void test_computeErrors_dart_part() {
+    Source librarySource =
+        _addSource("/lib.dart", "library lib; part 'part.dart';");
+    Source partSource = _addSource("/part.dart", "part of 'lib';");
+    _context.parseCompilationUnit(librarySource);
+    List<AnalysisError> errors = _context.computeErrors(partSource);
+    expect(errors, isNotNull);
+    expect(errors.length > 0, isTrue);
+  }
+
+  void test_computeErrors_dart_some() {
+    Source source = _addSource("/lib.dart", "library 'lib';");
+    List<AnalysisError> errors = _context.computeErrors(source);
+    expect(errors, isNotNull);
+    expect(errors.length > 0, isTrue);
+  }
+
+  void test_computeErrors_html_none() {
+    Source source = _addSource("/test.html", "<html></html>");
+    List<AnalysisError> errors = _context.computeErrors(source);
+    expect(errors, hasLength(0));
+  }
+
+  void test_computeExportedLibraries_none() {
+    Source source = _addSource("/test.dart", "library test;");
+    expect(_context.computeExportedLibraries(source), hasLength(0));
+  }
+
+  void test_computeExportedLibraries_some() {
+    //    addSource("/lib1.dart", "library lib1;");
+    //    addSource("/lib2.dart", "library lib2;");
+    Source source = _addSource(
+        "/test.dart", "library test; export 'lib1.dart'; export 'lib2.dart';");
+    expect(_context.computeExportedLibraries(source), hasLength(2));
+  }
+
+  void test_computeHtmlElement_nonHtml() {
+    Source source = _addSource("/test.dart", "library test;");
+    expect(_context.computeHtmlElement(source), isNull);
+  }
+
+  void test_computeHtmlElement_valid() {
+    Source source = _addSource("/test.html", "<html></html>");
+    HtmlElement element = _context.computeHtmlElement(source);
+    expect(element, isNotNull);
+    expect(_context.computeHtmlElement(source), same(element));
+  }
+
+  void test_computeImportedLibraries_none() {
+    Source source = _addSource("/test.dart", "library test;");
+    expect(_context.computeImportedLibraries(source), hasLength(0));
+  }
+
+  void test_computeImportedLibraries_some() {
+    //    addSource("/lib1.dart", "library lib1;");
+    //    addSource("/lib2.dart", "library lib2;");
+    Source source = _addSource(
+        "/test.dart", "library test; import 'lib1.dart'; import 'lib2.dart';");
+    expect(_context.computeImportedLibraries(source), hasLength(2));
+  }
+
+  void test_computeKindOf_html() {
+    Source source = _addSource("/test.html", "");
+    expect(_context.computeKindOf(source), same(SourceKind.HTML));
+  }
+
+  void test_computeKindOf_library() {
+    Source source = _addSource("/test.dart", "library lib;");
+    expect(_context.computeKindOf(source), same(SourceKind.LIBRARY));
+  }
+
+  void test_computeKindOf_libraryAndPart() {
+    Source source = _addSource("/test.dart", "library lib; part of lib;");
+    expect(_context.computeKindOf(source), same(SourceKind.LIBRARY));
+  }
+
+  void test_computeKindOf_part() {
+    Source source = _addSource("/test.dart", "part of lib;");
+    expect(_context.computeKindOf(source), same(SourceKind.PART));
+  }
+
+  void test_computeLibraryElement() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source source = _addSource("/test.dart", "library lib;");
+    LibraryElement element = _context.computeLibraryElement(source);
+    expect(element, isNotNull);
+  }
+
+  void test_computeLineInfo_dart() {
+    Source source = _addSource(
+        "/test.dart",
+        r'''
+library lib;
+
+main() {}''');
+    LineInfo info = _context.computeLineInfo(source);
+    expect(info, isNotNull);
+  }
+
+  void test_computeLineInfo_html() {
+    Source source = _addSource(
+        "/test.html",
+        r'''
+<html>
+  <body>
+    <h1>A</h1>
+  </body>
+</html>''');
+    LineInfo info = _context.computeLineInfo(source);
+    expect(info, isNotNull);
+  }
+
+  void test_computeResolvableCompilationUnit_dart_exception() {
+    TestSource source = _addSourceWithException("/test.dart");
+    try {
+      _context.computeResolvableCompilationUnit(source);
+      fail("Expected AnalysisException");
+    } on AnalysisException {
+      // Expected
+    }
+  }
+
+  void test_computeResolvableCompilationUnit_html_exception() {
+    Source source = _addSource("/lib.html", "<html></html>");
+    try {
+      _context.computeResolvableCompilationUnit(source);
+      fail("Expected AnalysisException");
+    } on AnalysisException {
+      // Expected
+    }
+  }
+
+  void test_computeResolvableCompilationUnit_valid() {
+    Source source = _addSource("/lib.dart", "library lib;");
+    CompilationUnit parsedUnit = _context.parseCompilationUnit(source);
+    expect(parsedUnit, isNotNull);
+    CompilationUnit resolvedUnit =
+        _context.computeResolvableCompilationUnit(source);
+    expect(resolvedUnit, isNotNull);
+    expect(resolvedUnit, same(parsedUnit));
+  }
+
+  Future test_computeResolvedCompilationUnitAsync() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source source = _addSource("/lib.dart", "library lib;");
+    // Complete all pending analysis tasks and flush the AST so that it won't
+    // be available immediately.
+    _performPendingAnalysisTasks();
+    DartEntry dartEntry = _context.getReadableSourceEntryOrNull(source);
+    dartEntry.flushAstStructures();
+    bool completed = false;
+    _context
+        .computeResolvedCompilationUnitAsync(source, source)
+        .then((CompilationUnit unit) {
+      expect(unit, isNotNull);
+      completed = true;
+    });
+    return pumpEventQueue().then((_) {
+      expect(completed, isFalse);
+      _performPendingAnalysisTasks();
+    }).then((_) => pumpEventQueue()).then((_) {
+      expect(completed, isTrue);
+    });
+  }
+
+  Future test_computeResolvedCompilationUnitAsync_afterDispose() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source source = _addSource("/lib.dart", "library lib;");
+    // Complete all pending analysis tasks and flush the AST so that it won't
+    // be available immediately.
+    _performPendingAnalysisTasks();
+    DartEntry dartEntry = _context.getReadableSourceEntryOrNull(source);
+    dartEntry.flushAstStructures();
+    // Dispose of the context.
+    _context.dispose();
+    // Any attempt to start an asynchronous computation should return a future
+    // which completes with error.
+    CancelableFuture<CompilationUnit> future =
+        _context.computeResolvedCompilationUnitAsync(source, source);
+    bool completed = false;
+    future.then((CompilationUnit unit) {
+      fail('Future should have completed with error');
+    }, onError: (error) {
+      expect(error, new isInstanceOf<AnalysisNotScheduledError>());
+      completed = true;
+    });
+    return pumpEventQueue().then((_) {
+      expect(completed, isTrue);
+    });
+  }
+
+  Future test_computeResolvedCompilationUnitAsync_cancel() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source source = _addSource("/lib.dart", "library lib;");
+    // Complete all pending analysis tasks and flush the AST so that it won't
+    // be available immediately.
+    _performPendingAnalysisTasks();
+    DartEntry dartEntry = _context.getReadableSourceEntryOrNull(source);
+    dartEntry.flushAstStructures();
+    CancelableFuture<CompilationUnit> future =
+        _context.computeResolvedCompilationUnitAsync(source, source);
+    bool completed = false;
+    future.then((CompilationUnit unit) {
+      fail('Future should have been canceled');
+    }, onError: (error) {
+      expect(error, new isInstanceOf<FutureCanceledError>());
+      completed = true;
+    });
+    expect(completed, isFalse);
+    expect(_context.pendingFutureSources_forTesting, isNotEmpty);
+    future.cancel();
+    expect(_context.pendingFutureSources_forTesting, isEmpty);
+    return pumpEventQueue().then((_) {
+      expect(completed, isTrue);
+      expect(_context.pendingFutureSources_forTesting, isEmpty);
+    });
+  }
+
+  Future test_computeResolvedCompilationUnitAsync_dispose() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source source = _addSource("/lib.dart", "library lib;");
+    // Complete all pending analysis tasks and flush the AST so that it won't
+    // be available immediately.
+    _performPendingAnalysisTasks();
+    DartEntry dartEntry = _context.getReadableSourceEntryOrNull(source);
+    dartEntry.flushAstStructures();
+    CancelableFuture<CompilationUnit> future =
+        _context.computeResolvedCompilationUnitAsync(source, source);
+    bool completed = false;
+    future.then((CompilationUnit unit) {
+      fail('Future should have completed with error');
+    }, onError: (error) {
+      expect(error, new isInstanceOf<AnalysisNotScheduledError>());
+      completed = true;
+    });
+    expect(completed, isFalse);
+    expect(_context.pendingFutureSources_forTesting, isNotEmpty);
+    // Disposing of the context should cause all pending futures to complete
+    // with AnalysisNotScheduled, so that no clients are left hanging.
+    _context.dispose();
+    expect(_context.pendingFutureSources_forTesting, isEmpty);
+    return pumpEventQueue().then((_) {
+      expect(completed, isTrue);
+      expect(_context.pendingFutureSources_forTesting, isEmpty);
+    });
+  }
+
+  Future test_computeResolvedCompilationUnitAsync_unrelatedLibrary() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source librarySource = _addSource("/lib.dart", "library lib;");
+    Source partSource = _addSource("/part.dart", "part of foo;");
+    bool completed = false;
+    _context
+        .computeResolvedCompilationUnitAsync(partSource, librarySource)
+        .then((_) {
+      fail('Expected resolution to fail');
+    }, onError: (e) {
+      expect(e, new isInstanceOf<AnalysisNotScheduledError>());
+      completed = true;
+    });
+    return pumpEventQueue().then((_) {
+      expect(completed, isFalse);
+      _performPendingAnalysisTasks();
+    }).then((_) => pumpEventQueue()).then((_) {
+      expect(completed, isTrue);
+    });
+  }
+
+  void test_dispose() {
+    expect(_context.isDisposed, isFalse);
+    _context.dispose();
+    expect(_context.isDisposed, isTrue);
+  }
+
+  void test_exists_false() {
+    TestSource source = new TestSource();
+    source.exists2 = false;
+    expect(_context.exists(source), isFalse);
+  }
+
+  void test_exists_null() {
+    expect(_context.exists(null), isFalse);
+  }
+
+  void test_exists_overridden() {
+    Source source = new TestSource();
+    _context.setContents(source, "");
+    expect(_context.exists(source), isTrue);
+  }
+
+  void test_exists_true() {
+    expect(_context.exists(new AnalysisContextImplTest_Source_exists_true()),
+        isTrue);
+  }
+
+  void test_getAnalysisOptions() {
+    expect(_context.analysisOptions, isNotNull);
+  }
+
+  void test_getContents_fromSource() {
+    String content = "library lib;";
+    TimestampedData<String> contents =
+        _context.getContents(new TestSource('/test.dart', content));
+    expect(contents.data.toString(), content);
+  }
+
+  void test_getContents_overridden() {
+    String content = "library lib;";
+    Source source = new TestSource();
+    _context.setContents(source, content);
+    TimestampedData<String> contents = _context.getContents(source);
+    expect(contents.data.toString(), content);
+  }
+
+  void test_getContents_unoverridden() {
+    String content = "library lib;";
+    Source source = new TestSource('/test.dart', content);
+    _context.setContents(source, "part of lib;");
+    _context.setContents(source, null);
+    TimestampedData<String> contents = _context.getContents(source);
+    expect(contents.data.toString(), content);
+  }
+
+  void test_getDeclaredVariables() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    expect(_context.declaredVariables, isNotNull);
+  }
+
+  void test_getElement() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    LibraryElement core =
+        _context.computeLibraryElement(_sourceFactory.forUri("dart:core"));
+    expect(core, isNotNull);
+    ClassElement classObject =
+        _findClass(core.definingCompilationUnit, "Object");
+    expect(classObject, isNotNull);
+    ElementLocation location = classObject.location;
+    Element element = _context.getElement(location);
+    expect(element, same(classObject));
+  }
+
+  void test_getElement_constructor_named() {
+    Source source = _addSource(
+        "/lib.dart",
+        r'''
+class A {
+  A.named() {}
+}''');
+    _analyzeAll_assertFinished();
+    LibraryElement library = _context.computeLibraryElement(source);
+    ClassElement classA = _findClass(library.definingCompilationUnit, "A");
+    ConstructorElement constructor = classA.constructors[0];
+    ElementLocation location = constructor.location;
+    Element element = _context.getElement(location);
+    expect(element, same(constructor));
+  }
+
+  void test_getElement_constructor_unnamed() {
+    Source source = _addSource(
+        "/lib.dart",
+        r'''
+class A {
+  A() {}
+}''');
+    _analyzeAll_assertFinished();
+    LibraryElement library = _context.computeLibraryElement(source);
+    ClassElement classA = _findClass(library.definingCompilationUnit, "A");
+    ConstructorElement constructor = classA.constructors[0];
+    ElementLocation location = constructor.location;
+    Element element = _context.getElement(location);
+    expect(element, same(constructor));
+  }
+
+  void test_getElement_enum() {
+    Source source = _addSource('/test.dart', 'enum MyEnum {A, B, C}');
+    _analyzeAll_assertFinished();
+    LibraryElement library = _context.computeLibraryElement(source);
+    ClassElement myEnum = library.definingCompilationUnit.getEnum('MyEnum');
+    ElementLocation location = myEnum.location;
+    Element element = _context.getElement(location);
+    expect(element, same(myEnum));
+  }
+
+  void test_getErrors_dart_none() {
+    Source source = _addSource("/lib.dart", "library lib;");
+    List<AnalysisError> errors = _context.getErrors(source).errors;
+    expect(errors, hasLength(0));
+    _context.computeErrors(source);
+    errors = _context.getErrors(source).errors;
+    expect(errors, hasLength(0));
+  }
+
+  void test_getErrors_dart_some() {
+    Source source = _addSource("/lib.dart", "library 'lib';");
+    List<AnalysisError> errors = _context.getErrors(source).errors;
+    expect(errors, hasLength(0));
+    _context.computeErrors(source);
+    errors = _context.getErrors(source).errors;
+    expect(errors, hasLength(1));
+  }
+
+  void test_getErrors_html_none() {
+    Source source = _addSource("/test.html", "<html></html>");
+    List<AnalysisError> errors = _context.getErrors(source).errors;
+    expect(errors, hasLength(0));
+    _context.computeErrors(source);
+    errors = _context.getErrors(source).errors;
+    expect(errors, hasLength(0));
+  }
+
+  void test_getErrors_html_some() {
+    Source source = _addSource(
+        "/test.html",
+        r'''
+<html><head>
+<script type='application/dart' src='test.dart'/>
+</head></html>''');
+    List<AnalysisError> errors = _context.getErrors(source).errors;
+    expect(errors, hasLength(0));
+    _context.computeErrors(source);
+    errors = _context.getErrors(source).errors;
+    expect(errors, hasLength(1));
+  }
+
+  void test_getHtmlElement_dart() {
+    Source source = _addSource("/test.dart", "");
+    expect(_context.getHtmlElement(source), isNull);
+    expect(_context.computeHtmlElement(source), isNull);
+    expect(_context.getHtmlElement(source), isNull);
+  }
+
+  void test_getHtmlElement_html() {
+    Source source = _addSource("/test.html", "<html></html>");
+    HtmlElement element = _context.getHtmlElement(source);
+    expect(element, isNull);
+    _context.computeHtmlElement(source);
+    element = _context.getHtmlElement(source);
+    expect(element, isNotNull);
+  }
+
+  void test_getHtmlFilesReferencing_html() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source htmlSource = _addSource(
+        "/test.html",
+        r'''
+<html><head>
+<script type='application/dart' src='test.dart'/>
+<script type='application/dart' src='test.js'/>
+</head></html>''');
+    Source librarySource = _addSource("/test.dart", "library lib;");
+    Source secondHtmlSource = _addSource("/test.html", "<html></html>");
+    _context.computeLibraryElement(librarySource);
+    List<Source> result = _context.getHtmlFilesReferencing(secondHtmlSource);
+    expect(result, hasLength(0));
+    _context.parseHtmlUnit(htmlSource);
+    result = _context.getHtmlFilesReferencing(secondHtmlSource);
+    expect(result, hasLength(0));
+  }
+
+  void test_getHtmlFilesReferencing_library() {
+    Source htmlSource = _addSource(
+        "/test.html",
+        r'''
+<html><head>
+<script type='application/dart' src='test.dart'/>
+<script type='application/dart' src='test.js'/>
+</head></html>''');
+    Source librarySource = _addSource("/test.dart", "library lib;");
+    List<Source> result = _context.getHtmlFilesReferencing(librarySource);
+    expect(result, hasLength(0));
+    _context.parseHtmlUnit(htmlSource);
+    result = _context.getHtmlFilesReferencing(librarySource);
+    expect(result, hasLength(1));
+    expect(result[0], htmlSource);
+  }
+
+  void test_getHtmlFilesReferencing_part() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source htmlSource = _addSource(
+        "/test.html",
+        r'''
+<html><head>
+<script type='application/dart' src='test.dart'/>
+<script type='application/dart' src='test.js'/>
+</head></html>''');
+    Source librarySource =
+        _addSource("/test.dart", "library lib; part 'part.dart';");
+    Source partSource = _addSource("/part.dart", "part of lib;");
+    _context.computeLibraryElement(librarySource);
+    List<Source> result = _context.getHtmlFilesReferencing(partSource);
+    expect(result, hasLength(0));
+    _context.parseHtmlUnit(htmlSource);
+    result = _context.getHtmlFilesReferencing(partSource);
+    expect(result, hasLength(1));
+    expect(result[0], htmlSource);
+  }
+
+  void test_getHtmlSources() {
+    List<Source> sources = _context.htmlSources;
+    expect(sources, hasLength(0));
+    Source source = _addSource("/test.html", "");
+    _context.computeKindOf(source);
+    sources = _context.htmlSources;
+    expect(sources, hasLength(1));
+    expect(sources[0], source);
+  }
+
+  void test_getKindOf_html() {
+    Source source = _addSource("/test.html", "");
+    expect(_context.getKindOf(source), same(SourceKind.HTML));
+  }
+
+  void test_getKindOf_library() {
+    Source source = _addSource("/test.dart", "library lib;");
+    expect(_context.getKindOf(source), same(SourceKind.UNKNOWN));
+    _context.computeKindOf(source);
+    expect(_context.getKindOf(source), same(SourceKind.LIBRARY));
+  }
+
+  void test_getKindOf_part() {
+    Source source = _addSource("/test.dart", "part of lib;");
+    expect(_context.getKindOf(source), same(SourceKind.UNKNOWN));
+    _context.computeKindOf(source);
+    expect(_context.getKindOf(source), same(SourceKind.PART));
+  }
+
+  void test_getKindOf_unknown() {
+    Source source = _addSource("/test.css", "");
+    expect(_context.getKindOf(source), same(SourceKind.UNKNOWN));
+  }
+
+  void test_getLaunchableClientLibrarySources() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    List<Source> sources = _context.launchableClientLibrarySources;
+    expect(sources, hasLength(0));
+    Source source = _addSource(
+        "/test.dart",
+        r'''
+import 'dart:html';
+main() {}''');
+    _context.computeLibraryElement(source);
+    sources = _context.launchableClientLibrarySources;
+    expect(sources, hasLength(1));
+  }
+
+  void test_getLaunchableServerLibrarySources() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    List<Source> sources = _context.launchableServerLibrarySources;
+    expect(sources, hasLength(0));
+    Source source = _addSource("/test.dart", "main() {}");
+    _context.computeLibraryElement(source);
+    sources = _context.launchableServerLibrarySources;
+    expect(sources, hasLength(1));
+  }
+
+  void test_getLibrariesContaining() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source librarySource = _addSource(
+        "/lib.dart",
+        r'''
+library lib;
+part 'part.dart';''');
+    Source partSource = _addSource("/part.dart", "part of lib;");
+    _context.computeLibraryElement(librarySource);
+    List<Source> result = _context.getLibrariesContaining(librarySource);
+    expect(result, hasLength(1));
+    expect(result[0], librarySource);
+    result = _context.getLibrariesContaining(partSource);
+    expect(result, hasLength(1));
+    expect(result[0], librarySource);
+  }
+
+  void test_getLibrariesDependingOn() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source libASource = _addSource("/libA.dart", "library libA;");
+    _addSource("/libB.dart", "library libB;");
+    Source lib1Source = _addSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+import 'libA.dart';
+export 'libB.dart';''');
+    Source lib2Source = _addSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+import 'libB.dart';
+export 'libA.dart';''');
+    _context.computeLibraryElement(lib1Source);
+    _context.computeLibraryElement(lib2Source);
+    List<Source> result = _context.getLibrariesDependingOn(libASource);
+    expect(result, unorderedEquals([lib1Source, lib2Source]));
+  }
+
+  void test_getLibrariesReferencedFromHtml() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source htmlSource = _addSource(
+        "/test.html",
+        r'''
+<html><head>
+<script type='application/dart' src='test.dart'/>
+<script type='application/dart' src='test.js'/>
+</head></html>''');
+    Source librarySource = _addSource("/test.dart", "library lib;");
+    _context.computeLibraryElement(librarySource);
+    _context.parseHtmlUnit(htmlSource);
+    List<Source> result = _context.getLibrariesReferencedFromHtml(htmlSource);
+    expect(result, hasLength(1));
+    expect(result[0], librarySource);
+  }
+
+  void test_getLibrariesReferencedFromHtml_no() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source htmlSource = _addSource(
+        "/test.html",
+        r'''
+<html><head>
+<script type='application/dart' src='test.js'/>
+</head></html>''');
+    _addSource("/test.dart", "library lib;");
+    _context.parseHtmlUnit(htmlSource);
+    List<Source> result = _context.getLibrariesReferencedFromHtml(htmlSource);
+    expect(result, hasLength(0));
+  }
+
+  void test_getLibraryElement() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source source = _addSource("/test.dart", "library lib;");
+    LibraryElement element = _context.getLibraryElement(source);
+    expect(element, isNull);
+    _context.computeLibraryElement(source);
+    element = _context.getLibraryElement(source);
+    expect(element, isNotNull);
+  }
+
+  void test_getLibrarySources() {
+    List<Source> sources = _context.librarySources;
+    int originalLength = sources.length;
+    Source source = _addSource("/test.dart", "library lib;");
+    _context.computeKindOf(source);
+    sources = _context.librarySources;
+    expect(sources, hasLength(originalLength + 1));
+    for (Source returnedSource in sources) {
+      if (returnedSource == source) {
+        return;
+      }
+    }
+    fail("The added source was not in the list of library sources");
+  }
+
+  void test_getLineInfo() {
+    Source source = _addSource(
+        "/test.dart",
+        r'''
+library lib;
+
+main() {}''');
+    LineInfo info = _context.getLineInfo(source);
+    expect(info, isNull);
+    _context.parseCompilationUnit(source);
+    info = _context.getLineInfo(source);
+    expect(info, isNotNull);
+  }
+
+  void test_getModificationStamp_fromSource() {
+    int stamp = 42;
+    expect(
+        _context.getModificationStamp(
+            new AnalysisContextImplTest_Source_getModificationStamp_fromSource(
+                stamp)),
+        stamp);
+  }
+
+  void test_getModificationStamp_overridden() {
+    int stamp = 42;
+    Source source =
+        new AnalysisContextImplTest_Source_getModificationStamp_overridden(
+            stamp);
+    _context.setContents(source, "");
+    expect(stamp != _context.getModificationStamp(source), isTrue);
+  }
+
+  void test_getPublicNamespace_element() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source source = _addSource("/test.dart", "class A {}");
+    LibraryElement library = _context.computeLibraryElement(source);
+    Namespace namespace = _context.getPublicNamespace(library);
+    expect(namespace, isNotNull);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ClassElement, ClassElement, namespace.get("A"));
+  }
+
+  void test_getResolvedCompilationUnit_library() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source source = _addSource("/lib.dart", "library libb;");
+    LibraryElement library = _context.computeLibraryElement(source);
+    expect(_context.getResolvedCompilationUnit(source, library), isNotNull);
+    _context.setContents(source, "library lib;");
+    expect(_context.getResolvedCompilationUnit(source, library), isNull);
+  }
+
+  void test_getResolvedCompilationUnit_library_null() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source source = _addSource("/lib.dart", "library lib;");
+    expect(_context.getResolvedCompilationUnit(source, null), isNull);
+  }
+
+  void test_getResolvedCompilationUnit_source_dart() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source source = _addSource("/lib.dart", "library lib;");
+    expect(_context.getResolvedCompilationUnit2(source, source), isNull);
+    _context.resolveCompilationUnit2(source, source);
+    expect(_context.getResolvedCompilationUnit2(source, source), isNotNull);
+  }
+
+  void test_getResolvedCompilationUnit_source_html() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source source = _addSource("/test.html", "<html></html>");
+    expect(_context.getResolvedCompilationUnit2(source, source), isNull);
+    expect(_context.resolveCompilationUnit2(source, source), isNull);
+    expect(_context.getResolvedCompilationUnit2(source, source), isNull);
+  }
+
+  void test_getResolvedHtmlUnit() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source source = _addSource("/test.html", "<html></html>");
+    expect(_context.getResolvedHtmlUnit(source), isNull);
+    _context.resolveHtmlUnit(source);
+    expect(_context.getResolvedHtmlUnit(source), isNotNull);
+  }
+
+  void test_getSourceFactory() {
+    expect(_context.sourceFactory, same(_sourceFactory));
+  }
+
+  void test_getSourcesWithFullName() {
+    String filePath = '/foo/lib/file.dart';
+    List<Source> expected = <Source>[];
+    ChangeSet changeSet = new ChangeSet();
+
+    TestSourceWithUri source1 =
+        new TestSourceWithUri(filePath, Uri.parse('file://$filePath'));
+    expected.add(source1);
+    changeSet.addedSource(source1);
+
+    TestSourceWithUri source2 =
+        new TestSourceWithUri(filePath, Uri.parse('package:foo/file.dart'));
+    expected.add(source2);
+    changeSet.addedSource(source2);
+
+    _context.applyChanges(changeSet);
+    expect(
+        _context.getSourcesWithFullName(filePath), unorderedEquals(expected));
+  }
+
+  void test_getStatistics() {
+    AnalysisContextStatistics statistics = _context.statistics;
+    expect(statistics, isNotNull);
+    // The following lines are fragile.
+    // The values depend on the number of libraries in the SDK.
+//    assertLength(0, statistics.getCacheRows());
+//    assertLength(0, statistics.getExceptions());
+//    assertLength(0, statistics.getSources());
+  }
+
+  Future test_implicitAnalysisEvents_added() async {
+    AnalyzedSourcesListener listener = new AnalyzedSourcesListener();
+    _context.implicitAnalysisEvents.listen(listener.onData);
+    //
+    // Create a file that references an file that is not explicitly being
+    // analyzed and fully analyze it. Ensure that the listener is told about
+    // the implicitly analyzed file.
+    //
+    Source sourceA = _addSource('/a.dart', "library a; import 'b.dart';");
+    Source sourceB = _createSource('/b.dart', "library b;");
+    _context.computeErrors(sourceA);
+    await pumpEventQueue();
+    listener.expectAnalyzed(sourceB);
+  }
+
+  void test_isClientLibrary_dart() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source source = _addSource(
+        "/test.dart",
+        r'''
+import 'dart:html';
+
+main() {}''');
+    expect(_context.isClientLibrary(source), isFalse);
+    expect(_context.isServerLibrary(source), isFalse);
+    _context.computeLibraryElement(source);
+    expect(_context.isClientLibrary(source), isTrue);
+    expect(_context.isServerLibrary(source), isFalse);
+  }
+
+  void test_isClientLibrary_html() {
+    Source source = _addSource("/test.html", "<html></html>");
+    expect(_context.isClientLibrary(source), isFalse);
+  }
+
+  void test_isServerLibrary_dart() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source source = _addSource(
+        "/test.dart",
+        r'''
+library lib;
+
+main() {}''');
+    expect(_context.isClientLibrary(source), isFalse);
+    expect(_context.isServerLibrary(source), isFalse);
+    _context.computeLibraryElement(source);
+    expect(_context.isClientLibrary(source), isFalse);
+    expect(_context.isServerLibrary(source), isTrue);
+  }
+
+  void test_isServerLibrary_html() {
+    Source source = _addSource("/test.html", "<html></html>");
+    expect(_context.isServerLibrary(source), isFalse);
+  }
+
+  void test_parseCompilationUnit_errors() {
+    Source source = _addSource("/lib.dart", "library {");
+    CompilationUnit compilationUnit = _context.parseCompilationUnit(source);
+    expect(compilationUnit, isNotNull);
+    List<AnalysisError> errors = _context.getErrors(source).errors;
+    expect(errors, isNotNull);
+    expect(errors.length > 0, isTrue);
+  }
+
+  void test_parseCompilationUnit_exception() {
+    Source source = _addSourceWithException("/test.dart");
+    try {
+      _context.parseCompilationUnit(source);
+      fail("Expected AnalysisException");
+    } on AnalysisException {
+      // Expected
+    }
+  }
+
+  void test_parseCompilationUnit_html() {
+    Source source = _addSource("/test.html", "<html></html>");
+    expect(_context.parseCompilationUnit(source), isNull);
+  }
+
+  void test_parseCompilationUnit_noErrors() {
+    Source source = _addSource("/lib.dart", "library lib;");
+    CompilationUnit compilationUnit = _context.parseCompilationUnit(source);
+    expect(compilationUnit, isNotNull);
+    expect(_context.getErrors(source).errors, hasLength(0));
+  }
+
+  void test_parseCompilationUnit_nonExistentSource() {
+    Source source =
+        new FileBasedSource(FileUtilities2.createFile("/test.dart"));
+    try {
+      _context.parseCompilationUnit(source);
+      fail("Expected AnalysisException because file does not exist");
+    } on AnalysisException {
+      // Expected result
+    }
+  }
+
+  void test_parseHtmlUnit_noErrors() {
+    Source source = _addSource("/lib.html", "<html></html>");
+    ht.HtmlUnit unit = _context.parseHtmlUnit(source);
+    expect(unit, isNotNull);
+  }
+
+  void test_parseHtmlUnit_resolveDirectives() {
+    Source libSource = _addSource(
+        "/lib.dart",
+        r'''
+library lib;
+class ClassA {}''');
+    Source source = _addSource(
+        "/lib.html",
+        r'''
+<html>
+<head>
+  <script type='application/dart'>
+    import 'lib.dart';
+    ClassA v = null;
+  </script>
+</head>
+<body>
+</body>
+</html>''');
+    ht.HtmlUnit unit = _context.parseHtmlUnit(source);
+    // import directive should be resolved
+    ht.XmlTagNode htmlNode = unit.tagNodes[0];
+    ht.XmlTagNode headNode = htmlNode.tagNodes[0];
+    ht.HtmlScriptTagNode scriptNode = headNode.tagNodes[0];
+    CompilationUnit script = scriptNode.script;
+    ImportDirective importNode = script.directives[0] as ImportDirective;
+    expect(importNode.uriContent, isNotNull);
+    expect(importNode.source, libSource);
+  }
+
+  void test_performAnalysisTask_addPart() {
+    Source libSource = _addSource(
+        "/lib.dart",
+        r'''
+library lib;
+part 'part.dart';''');
+    // run all tasks without part
+    _analyzeAll_assertFinished();
+    // add part and run all tasks
+    Source partSource = _addSource(
+        "/part.dart",
+        r'''
+part of lib;
+''');
+    _analyzeAll_assertFinished();
+    // "libSource" should be here
+    List<Source> librariesWithPart =
+        _context.getLibrariesContaining(partSource);
+    expect(librariesWithPart, unorderedEquals([libSource]));
+  }
+
+  void test_performAnalysisTask_changeLibraryContents() {
+    Source libSource =
+        _addSource("/test.dart", "library lib; part 'test-part.dart';");
+    Source partSource = _addSource("/test-part.dart", "part of lib;");
+    _analyzeAll_assertFinished();
+    expect(
+        _context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library resolved 1");
+    expect(
+        _context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
+        reason: "part resolved 1");
+    // update and analyze #1
+    _context.setContents(libSource, "library lib;");
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNull,
+        reason: "library changed 2");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNull,
+        reason: "part changed 2");
+    _analyzeAll_assertFinished();
+    expect(
+        _context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library resolved 2");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNull,
+        reason: "part resolved 2");
+    // update and analyze #2
+    _context.setContents(libSource, "library lib; part 'test-part.dart';");
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNull,
+        reason: "library changed 3");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNull,
+        reason: "part changed 3");
+    _analyzeAll_assertFinished();
+    expect(
+        _context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library resolved 2");
+    expect(
+        _context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
+        reason: "part resolved 3");
+  }
+
+  void test_performAnalysisTask_changeLibraryThenPartContents() {
+    Source libSource =
+        _addSource("/test.dart", "library lib; part 'test-part.dart';");
+    Source partSource = _addSource("/test-part.dart", "part of lib;");
+    _analyzeAll_assertFinished();
+    expect(
+        _context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library resolved 1");
+    expect(
+        _context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
+        reason: "part resolved 1");
+    // update and analyze #1
+    _context.setContents(libSource, "library lib;");
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNull,
+        reason: "library changed 2");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNull,
+        reason: "part changed 2");
+    _analyzeAll_assertFinished();
+    expect(
+        _context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library resolved 2");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNull,
+        reason: "part resolved 2");
+    // update and analyze #2
+    _context.setContents(partSource, "part of lib; // 1");
+    // Assert that changing the part's content does not effect the library
+    // now that it is no longer part of that library
+    expect(
+        _context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library changed 3");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNull,
+        reason: "part changed 3");
+    _analyzeAll_assertFinished();
+    expect(
+        _context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library resolved 3");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNull,
+        reason: "part resolved 3");
+  }
+
+  void test_performAnalysisTask_changePartContents_makeItAPart() {
+    Source libSource = _addSource(
+        "/lib.dart",
+        r'''
+library lib;
+part 'part.dart';
+void f(x) {}''');
+    Source partSource = _addSource("/part.dart", "void g() { f(null); }");
+    _analyzeAll_assertFinished();
+    expect(
+        _context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library resolved 1");
+    expect(
+        _context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
+        reason: "part resolved 1");
+    // update and analyze
+    _context.setContents(
+        partSource,
+        r'''
+part of lib;
+void g() { f(null); }''');
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNull,
+        reason: "library changed 2");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNull,
+        reason: "part changed 2");
+    _analyzeAll_assertFinished();
+    expect(
+        _context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library resolved 2");
+    expect(
+        _context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
+        reason: "part resolved 2");
+    expect(_context.getErrors(libSource).errors, hasLength(0));
+    expect(_context.getErrors(partSource).errors, hasLength(0));
+  }
+
+  /**
+   * https://code.google.com/p/dart/issues/detail?id=12424
+   */
+  void test_performAnalysisTask_changePartContents_makeItNotPart() {
+    Source libSource = _addSource(
+        "/lib.dart",
+        r'''
+library lib;
+part 'part.dart';
+void f(x) {}''');
+    Source partSource = _addSource(
+        "/part.dart",
+        r'''
+part of lib;
+void g() { f(null); }''');
+    _analyzeAll_assertFinished();
+    expect(_context.getErrors(libSource).errors, hasLength(0));
+    expect(_context.getErrors(partSource).errors, hasLength(0));
+    // Remove 'part' directive, which should make "f(null)" an error.
+    _context.setContents(
+        partSource,
+        r'''
+//part of lib;
+void g() { f(null); }''');
+    _analyzeAll_assertFinished();
+    expect(_context.getErrors(libSource).errors.length != 0, isTrue);
+  }
+
+  void test_performAnalysisTask_changePartContents_noSemanticChanges() {
+    Source libSource =
+        _addSource("/test.dart", "library lib; part 'test-part.dart';");
+    Source partSource = _addSource("/test-part.dart", "part of lib;");
+    _analyzeAll_assertFinished();
+    expect(
+        _context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library resolved 1");
+    expect(
+        _context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
+        reason: "part resolved 1");
+    // update and analyze #1
+    _context.setContents(partSource, "part of lib; // 1");
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNull,
+        reason: "library changed 2");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNull,
+        reason: "part changed 2");
+    _analyzeAll_assertFinished();
+    expect(
+        _context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library resolved 2");
+    expect(
+        _context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
+        reason: "part resolved 2");
+    // update and analyze #2
+    _context.setContents(partSource, "part of lib; // 12");
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNull,
+        reason: "library changed 3");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNull,
+        reason: "part changed 3");
+    _analyzeAll_assertFinished();
+    expect(
+        _context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library resolved 3");
+    expect(
+        _context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
+        reason: "part resolved 3");
+  }
+
+  void test_performAnalysisTask_getContentException_dart() {
+    // add source that throw an exception on "get content"
+    Source source = new _Source_getContent_throwException('test.dart');
+    {
+      ChangeSet changeSet = new ChangeSet();
+      changeSet.addedSource(source);
+      _context.applyChanges(changeSet);
+    }
+    // prepare errors
+    _analyzeAll_assertFinished();
+    List<AnalysisError> errors = _context.getErrors(source).errors;
+    // validate errors
+    expect(errors, hasLength(1));
+    AnalysisError error = errors[0];
+    expect(error.source, same(source));
+    expect(error.errorCode, ScannerErrorCode.UNABLE_GET_CONTENT);
+  }
+
+  void test_performAnalysisTask_getContentException_html() {
+    // add source that throw an exception on "get content"
+    Source source = new _Source_getContent_throwException('test.html');
+    {
+      ChangeSet changeSet = new ChangeSet();
+      changeSet.addedSource(source);
+      _context.applyChanges(changeSet);
+    }
+    // prepare errors
+    _analyzeAll_assertFinished();
+    List<AnalysisError> errors = _context.getErrors(source).errors;
+    // validate errors
+    expect(errors, hasLength(1));
+    AnalysisError error = errors[0];
+    expect(error.source, same(source));
+    expect(error.errorCode, ScannerErrorCode.UNABLE_GET_CONTENT);
+  }
+
+  void test_performAnalysisTask_importedLibraryAdd() {
+    Source libASource =
+        _addSource("/libA.dart", "library libA; import 'libB.dart';");
+    _analyzeAll_assertFinished();
+    expect(
+        _context.getResolvedCompilationUnit2(libASource, libASource), isNotNull,
+        reason: "libA resolved 1");
+    expect(_hasAnalysisErrorWithErrorSeverity(_context.getErrors(libASource)),
+        isTrue,
+        reason: "libA has an error");
+    // add libB.dart and analyze
+    Source libBSource = _addSource("/libB.dart", "library libB;");
+    _analyzeAll_assertFinished();
+    expect(
+        _context.getResolvedCompilationUnit2(libASource, libASource), isNotNull,
+        reason: "libA resolved 2");
+    expect(
+        _context.getResolvedCompilationUnit2(libBSource, libBSource), isNotNull,
+        reason: "libB resolved 2");
+    expect(!_hasAnalysisErrorWithErrorSeverity(_context.getErrors(libASource)),
+        isTrue,
+        reason: "libA doesn't have errors");
+  }
+
+  void test_performAnalysisTask_importedLibraryAdd_html() {
+    Source htmlSource = _addSource(
+        "/page.html",
+        r'''
+<html><body><script type="application/dart">
+  import '/libB.dart';
+  main() {print('hello dart');}
+</script></body></html>''');
+    _analyzeAll_assertFinished();
+    expect(_context.getResolvedHtmlUnit(htmlSource), isNotNull,
+        reason: "htmlUnit resolved 1");
+    expect(_hasAnalysisErrorWithErrorSeverity(_context.getErrors(htmlSource)),
+        isTrue,
+        reason: "htmlSource has an error");
+    // add libB.dart and analyze
+    Source libBSource = _addSource("/libB.dart", "library libB;");
+    _analyzeAll_assertFinished();
+    expect(_context.getResolvedHtmlUnit(htmlSource), isNotNull,
+        reason: "htmlUnit resolved 1");
+    expect(
+        _context.getResolvedCompilationUnit2(libBSource, libBSource), isNotNull,
+        reason: "libB resolved 2");
+    // TODO (danrubel) commented out to fix red bots
+//    AnalysisErrorInfo errors = _context.getErrors(htmlSource);
+//    expect(
+//        !_hasAnalysisErrorWithErrorSeverity(errors),
+//        isTrue,
+//        reason: "htmlSource doesn't have errors");
+  }
+
+  void test_performAnalysisTask_importedLibraryDelete() {
+    Source libASource =
+        _addSource("/libA.dart", "library libA; import 'libB.dart';");
+    Source libBSource = _addSource("/libB.dart", "library libB;");
+    _analyzeAll_assertFinished();
+    expect(
+        _context.getResolvedCompilationUnit2(libASource, libASource), isNotNull,
+        reason: "libA resolved 1");
+    expect(
+        _context.getResolvedCompilationUnit2(libBSource, libBSource), isNotNull,
+        reason: "libB resolved 1");
+    expect(!_hasAnalysisErrorWithErrorSeverity(_context.getErrors(libASource)),
+        isTrue,
+        reason: "libA doesn't have errors");
+    // remove libB.dart content and analyze
+    _context.setContents(libBSource, null);
+    _analyzeAll_assertFinished();
+    expect(
+        _context.getResolvedCompilationUnit2(libASource, libASource), isNotNull,
+        reason: "libA resolved 2");
+    expect(_hasAnalysisErrorWithErrorSeverity(_context.getErrors(libASource)),
+        isTrue,
+        reason: "libA has an error");
+  }
+
+  void test_performAnalysisTask_IOException() {
+    TestSource source = _addSourceWithException2("/test.dart", "library test;");
+    int oldTimestamp = _context.getModificationStamp(source);
+    source.generateExceptionOnRead = false;
+    _analyzeAll_assertFinished();
+    expect(source.readCount, 1);
+    source.generateExceptionOnRead = true;
+    do {
+      _changeSource(source, "");
+      // Ensure that the timestamp differs,
+      // so that analysis engine notices the change
+    } while (oldTimestamp == _context.getModificationStamp(source));
+    _analyzeAll_assertFinished();
+    expect(source.readCount, 2);
+  }
+
+  void test_performAnalysisTask_missingPart() {
+    Source source =
+        _addSource("/test.dart", "library lib; part 'no-such-file.dart';");
+    _analyzeAll_assertFinished();
+    expect(_context.getLibraryElement(source), isNotNull,
+        reason: "performAnalysisTask failed to compute an element model");
+  }
+
+  void test_performAnalysisTask_modifiedAfterParse() {
+    // TODO(scheglov) no threads in Dart
+//    Source source = _addSource("/test.dart", "library lib;");
+//    int initialTime = _context.getModificationStamp(source);
+//    List<Source> sources = new List<Source>();
+//    sources.add(source);
+//    _context.analysisPriorityOrder = sources;
+//    _context.parseCompilationUnit(source);
+//    while (initialTime == JavaSystem.currentTimeMillis()) {
+//      Thread.sleep(1);
+//      // Force the modification time to be different.
+//    }
+//    _context.setContents(source, "library test;");
+//    JUnitTestCase.assertTrue(initialTime != _context.getModificationStamp(source));
+//    _analyzeAll_assertFinished();
+//    JUnitTestCase.assertNotNullMsg("performAnalysisTask failed to compute an element model", _context.getLibraryElement(source));
+  }
+
+  void test_resolveCompilationUnit_import_relative() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    Source sourceA =
+        _addSource("/libA.dart", "library libA; import 'libB.dart'; class A{}");
+    _addSource("/libB.dart", "library libB; class B{}");
+    CompilationUnit compilationUnit =
+        _context.resolveCompilationUnit2(sourceA, sourceA);
+    LibraryElement library = compilationUnit.element.library;
+    List<LibraryElement> importedLibraries = library.importedLibraries;
+    assertNamedElements(importedLibraries, ["dart.core", "libB"]);
+    List<LibraryElement> visibleLibraries = library.visibleLibraries;
+    assertNamedElements(visibleLibraries, ["dart.core", "libA", "libB"]);
+  }
+
+  void test_resolveCompilationUnit_import_relative_cyclic() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    Source sourceA =
+        _addSource("/libA.dart", "library libA; import 'libB.dart'; class A{}");
+    _addSource("/libB.dart", "library libB; import 'libA.dart'; class B{}");
+    CompilationUnit compilationUnit =
+        _context.resolveCompilationUnit2(sourceA, sourceA);
+    LibraryElement library = compilationUnit.element.library;
+    List<LibraryElement> importedLibraries = library.importedLibraries;
+    assertNamedElements(importedLibraries, ["dart.core", "libB"]);
+    List<LibraryElement> visibleLibraries = library.visibleLibraries;
+    assertNamedElements(visibleLibraries, ["dart.core", "libA", "libB"]);
+  }
+
+  void test_resolveCompilationUnit_library() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source source = _addSource("/lib.dart", "library lib;");
+    LibraryElement library = _context.computeLibraryElement(source);
+    CompilationUnit compilationUnit =
+        _context.resolveCompilationUnit(source, library);
+    expect(compilationUnit, isNotNull);
+    expect(compilationUnit.element, isNotNull);
+  }
+
+  void test_resolveCompilationUnit_source() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source source = _addSource("/lib.dart", "library lib;");
+    CompilationUnit compilationUnit =
+        _context.resolveCompilationUnit2(source, source);
+    expect(compilationUnit, isNotNull);
+  }
+
+  void test_resolveCompilationUnit_sourceChangeDuringResolution() {
+    _context = new _AnalysisContext_sourceChangeDuringResolution();
+    AnalysisContextFactory.initContextWithCore(_context);
+    _sourceFactory = _context.sourceFactory;
+    Source source = _addSource("/lib.dart", "library lib;");
+    CompilationUnit compilationUnit =
+        _context.resolveCompilationUnit2(source, source);
+    expect(compilationUnit, isNotNull);
+    expect(_context.getLineInfo(source), isNotNull);
+  }
+
+  void test_resolveHtmlUnit() {
+    Source source = _addSource("/lib.html", "<html></html>");
+    ht.HtmlUnit unit = _context.resolveHtmlUnit(source);
+    expect(unit, isNotNull);
+  }
+
+  void test_setAnalysisOptions() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.cacheSize = 42;
+    options.dart2jsHint = false;
+    options.hint = false;
+    _context.analysisOptions = options;
+    AnalysisOptions result = _context.analysisOptions;
+    expect(result.cacheSize, options.cacheSize);
+    expect(result.dart2jsHint, options.dart2jsHint);
+    expect(result.hint, options.hint);
+  }
+
+  void test_setAnalysisOptions_reduceAnalysisPriorityOrder() {
+    AnalysisOptionsImpl options =
+        new AnalysisOptionsImpl.from(_context.analysisOptions);
+    List<Source> sources = new List<Source>();
+    for (int index = 0; index < options.cacheSize; index++) {
+      sources.add(_addSource("/lib.dart$index", ""));
+    }
+    _context.analysisPriorityOrder = sources;
+    int oldPriorityOrderSize = _getPriorityOrder(_context).length;
+    options.cacheSize = options.cacheSize - 10;
+    _context.analysisOptions = options;
+    expect(oldPriorityOrderSize > _getPriorityOrder(_context).length, isTrue);
+  }
+
+  void test_setAnalysisPriorityOrder_empty() {
+    _context.analysisPriorityOrder = new List<Source>();
+  }
+
+  void test_setAnalysisPriorityOrder_lessThanCacheSize() {
+    AnalysisOptions options = _context.analysisOptions;
+    List<Source> sources = new List<Source>();
+    for (int index = 0; index < options.cacheSize; index++) {
+      sources.add(_addSource("/lib.dart$index", ""));
+    }
+    _context.analysisPriorityOrder = sources;
+    expect(options.cacheSize > _getPriorityOrder(_context).length, isTrue);
+  }
+
+  void test_setAnalysisPriorityOrder_nonEmpty() {
+    List<Source> sources = new List<Source>();
+    sources.add(_addSource("/lib.dart", "library lib;"));
+    _context.analysisPriorityOrder = sources;
+  }
+
+  Future test_setChangedContents_libraryWithPart() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.incremental = true;
+    _context = AnalysisContextFactory.oldContextWithCoreAndOptions(options);
+    SourcesChangedListener listener = new SourcesChangedListener();
+    _context.onSourcesChanged.listen(listener.onData);
+    _sourceFactory = _context.sourceFactory;
+    String oldCode = r'''
+library lib;
+part 'part.dart';
+int a = 0;''';
+    Source librarySource = _addSource("/lib.dart", oldCode);
+    String partContents = r'''
+part of lib;
+int b = a;''';
+    Source partSource = _addSource("/part.dart", partContents);
+    LibraryElement element = _context.computeLibraryElement(librarySource);
+    CompilationUnit unit =
+        _context.getResolvedCompilationUnit(librarySource, element);
+    expect(unit, isNotNull);
+    int offset = oldCode.indexOf("int a") + 4;
+    String newCode = r'''
+library lib;
+part 'part.dart';
+int ya = 0;''';
+    expect(_getIncrementalAnalysisCache(_context), isNull);
+    _context.setChangedContents(librarySource, newCode, offset, 0, 1);
+    expect(_context.getContents(librarySource).data, newCode);
+    IncrementalAnalysisCache incrementalCache =
+        _getIncrementalAnalysisCache(_context);
+    expect(incrementalCache.librarySource, librarySource);
+    expect(incrementalCache.resolvedUnit, same(unit));
+    expect(_context.getResolvedCompilationUnit2(partSource, librarySource),
+        isNull);
+    expect(incrementalCache.newContents, newCode);
+    return pumpEventQueue().then((_) {
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(changedSources: [librarySource]);
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(changedSources: [partSource]);
+      listener.assertEvent(changedSources: [librarySource]);
+      listener.assertNoMoreEvents();
+    });
+  }
+
+  void test_setChangedContents_notResolved() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    AnalysisOptionsImpl options =
+        new AnalysisOptionsImpl.from(_context.analysisOptions);
+    options.incremental = true;
+    _context.analysisOptions = options;
+    _sourceFactory = _context.sourceFactory;
+    String oldCode = r'''
+library lib;
+int a = 0;''';
+    Source librarySource = _addSource("/lib.dart", oldCode);
+    int offset = oldCode.indexOf("int a") + 4;
+    String newCode = r'''
+library lib;
+int ya = 0;''';
+    _context.setChangedContents(librarySource, newCode, offset, 0, 1);
+    expect(_context.getContents(librarySource).data, newCode);
+    expect(_getIncrementalAnalysisCache(_context), isNull);
+  }
+
+  Future test_setContents_libraryWithPart() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    SourcesChangedListener listener = new SourcesChangedListener();
+    _context.onSourcesChanged.listen(listener.onData);
+    _sourceFactory = _context.sourceFactory;
+    String libraryContents1 = r'''
+library lib;
+part 'part.dart';
+int a = 0;''';
+    Source librarySource = _addSource("/lib.dart", libraryContents1);
+    String partContents1 = r'''
+part of lib;
+int b = a;''';
+    Source partSource = _addSource("/part.dart", partContents1);
+    _context.computeLibraryElement(librarySource);
+    IncrementalAnalysisCache incrementalCache = new IncrementalAnalysisCache(
+        librarySource, librarySource, null, null, null, 0, 0, 0);
+    _setIncrementalAnalysisCache(_context, incrementalCache);
+    expect(_getIncrementalAnalysisCache(_context), same(incrementalCache));
+    String libraryContents2 = r'''
+library lib;
+part 'part.dart';
+int aa = 0;''';
+    _context.setContents(librarySource, libraryContents2);
+    expect(_context.getResolvedCompilationUnit2(partSource, librarySource),
+        isNull);
+    expect(_getIncrementalAnalysisCache(_context), isNull);
+    return pumpEventQueue().then((_) {
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(changedSources: [librarySource]);
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(changedSources: [partSource]);
+      listener.assertEvent(changedSources: [librarySource]);
+      listener.assertNoMoreEvents();
+    });
+  }
+
+  void test_setContents_null() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source librarySource = _addSource(
+        "/lib.dart",
+        r'''
+library lib;
+int a = 0;''');
+    _context.computeLibraryElement(librarySource);
+    IncrementalAnalysisCache incrementalCache = new IncrementalAnalysisCache(
+        librarySource, librarySource, null, null, null, 0, 0, 0);
+    _setIncrementalAnalysisCache(_context, incrementalCache);
+    expect(_getIncrementalAnalysisCache(_context), same(incrementalCache));
+    _context.setContents(librarySource, null);
+    expect(_context.getResolvedCompilationUnit2(librarySource, librarySource),
+        isNull);
+    expect(_getIncrementalAnalysisCache(_context), isNull);
+  }
+
+  void test_setContents_unchanged_consistentModificationTime() {
+    String contents = "// foo";
+    Source source = _addSource("/test.dart", contents);
+    // do all, no tasks
+    _analyzeAll_assertFinished();
+    {
+      AnalysisResult result = _context.performAnalysisTask();
+      expect(result.changeNotices, isNull);
+    }
+    // set the same contents, still no tasks
+    _context.setContents(source, contents);
+    {
+      AnalysisResult result = _context.performAnalysisTask();
+      expect(result.changeNotices, isNull);
+    }
+  }
+
+  void test_setSourceFactory() {
+    expect(_context.sourceFactory, _sourceFactory);
+    SourceFactory factory = new SourceFactory([]);
+    _context.sourceFactory = factory;
+    expect(_context.sourceFactory, factory);
+  }
+
+  void test_unreadableSource() {
+    _context = AnalysisContextFactory.oldContextWithCore();
+    _sourceFactory = _context.sourceFactory;
+    Source test1 = _addSource(
+        "/test1.dart",
+        r'''
+import 'test2.dart';
+library test1;''');
+    Source test2 = _addSource(
+        "/test2.dart",
+        r'''
+import 'test1.dart';
+import 'test3.dart';
+library test2;''');
+    Source test3 = _addSourceWithException("/test3.dart");
+    _analyzeAll_assertFinished();
+    // test1 and test2 should have been successfully analyzed
+    // despite the fact that test3 couldn't be read.
+    expect(_context.computeLibraryElement(test1), isNotNull);
+    expect(_context.computeLibraryElement(test2), isNotNull);
+    expect(_context.computeLibraryElement(test3), isNull);
+  }
+
+  void test_updateAnalysis() {
+    expect(_context.sourcesNeedingProcessing.isEmpty, isTrue);
+    Source source =
+        new FileBasedSource(FileUtilities2.createFile("/test.dart"));
+    AnalysisDelta delta = new AnalysisDelta();
+    delta.setAnalysisLevel(source, AnalysisLevel.ALL);
+    _context.applyAnalysisDelta(delta);
+    expect(_context.sourcesNeedingProcessing.contains(source), isTrue);
+    delta = new AnalysisDelta();
+    delta.setAnalysisLevel(source, AnalysisLevel.NONE);
+    _context.applyAnalysisDelta(delta);
+    expect(_context.sourcesNeedingProcessing.contains(source), isFalse);
+  }
+
+  void xtest_performAnalysisTask_stress() {
+    int maxCacheSize = 4;
+    AnalysisOptionsImpl options =
+        new AnalysisOptionsImpl.from(_context.analysisOptions);
+    options.cacheSize = maxCacheSize;
+    _context.analysisOptions = options;
+    int sourceCount = maxCacheSize + 2;
+    List<Source> sources = new List<Source>();
+    ChangeSet changeSet = new ChangeSet();
+    for (int i = 0; i < sourceCount; i++) {
+      Source source = _addSource("/lib$i.dart", "library lib$i;");
+      sources.add(source);
+      changeSet.addedSource(source);
+    }
+    _context.applyChanges(changeSet);
+    _context.analysisPriorityOrder = sources;
+    for (int i = 0; i < 1000; i++) {
+      List<ChangeNotice> notice = _context.performAnalysisTask().changeNotices;
+      if (notice == null) {
+        //System.out.println("test_performAnalysisTask_stress: " + i);
+        break;
+      }
+    }
+    List<ChangeNotice> notice = _context.performAnalysisTask().changeNotices;
+    if (notice != null) {
+      fail(
+          "performAnalysisTask failed to terminate after analyzing all sources");
+    }
+  }
+
+  Source _addSource(String fileName, String contents) {
+    Source source = new FileBasedSource(FileUtilities2.createFile(fileName));
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(source);
+    _context.applyChanges(changeSet);
+    _context.setContents(source, contents);
+    return source;
+  }
+
+  TestSource _addSourceWithException(String fileName) {
+    return _addSourceWithException2(fileName, "");
+  }
+
+  TestSource _addSourceWithException2(String fileName, String contents) {
+    TestSource source = new TestSource(fileName, contents);
+    source.generateExceptionOnRead = true;
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(source);
+    _context.applyChanges(changeSet);
+    return source;
+  }
+
+  /**
+   * Perform analysis tasks up to 512 times and asserts that that was enough.
+   */
+  void _analyzeAll_assertFinished() {
+    _analyzeAll_assertFinished2(512);
+  }
+
+  /**
+   * Perform analysis tasks up to the given number of times and asserts that that was enough.
+   *
+   * @param maxIterations the maximum number of tasks to perform
+   */
+  void _analyzeAll_assertFinished2(int maxIterations) {
+    for (int i = 0; i < maxIterations; i++) {
+      List<ChangeNotice> notice = _context.performAnalysisTask().changeNotices;
+      if (notice == null) {
+        return;
+      }
+    }
+    fail("performAnalysisTask failed to terminate after analyzing all sources");
+  }
+
+  void _changeSource(TestSource source, String contents) {
+    source.setContents(contents);
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.changedSource(source);
+    _context.applyChanges(changeSet);
+  }
+
+  Source _createSource(String fileName, String contents) {
+    Source source = new FileBasedSource(FileUtilities2.createFile(fileName));
+    _context.setContents(source, contents);
+    return source;
+  }
+
+  /**
+   * Search the given compilation unit for a class with the given name. Return the class with the
+   * given name, or `null` if the class cannot be found.
+   *
+   * @param unit the compilation unit being searched
+   * @param className the name of the class being searched for
+   * @return the class with the given name
+   */
+  ClassElement _findClass(CompilationUnitElement unit, String className) {
+    for (ClassElement classElement in unit.types) {
+      if (classElement.displayName == className) {
+        return classElement;
+      }
+    }
+    return null;
+  }
+
+  IncrementalAnalysisCache _getIncrementalAnalysisCache(
+      AnalysisContextImpl context2) {
+    return context2.test_incrementalAnalysisCache;
+  }
+
+  List<Source> _getPriorityOrder(AnalysisContextImpl context2) {
+    return context2.test_priorityOrder;
+  }
+
+  void _performPendingAnalysisTasks([int maxTasks = 20]) {
+    for (int i = 0; _context.performAnalysisTask().hasMoreWork; i++) {
+      if (i > maxTasks) {
+        fail('Analysis did not terminate.');
+      }
+    }
+  }
+
+  void _removeSource(Source source) {
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.removedSource(source);
+    _context.applyChanges(changeSet);
+  }
+
+  void _setIncrementalAnalysisCache(
+      AnalysisContextImpl context, IncrementalAnalysisCache incrementalCache) {
+    context.test_incrementalAnalysisCache = incrementalCache;
+  }
+
+  /**
+   * Returns `true` if there is an [AnalysisError] with [ErrorSeverity.ERROR] in
+   * the given [AnalysisErrorInfo].
+   */
+  static bool _hasAnalysisErrorWithErrorSeverity(AnalysisErrorInfo errorInfo) {
+    List<AnalysisError> errors = errorInfo.errors;
+    for (AnalysisError analysisError in errors) {
+      if (analysisError.errorCode.errorSeverity == ErrorSeverity.ERROR) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+class AnalysisContextImplTest_Source_exists_true extends TestSource {
+  @override
+  bool exists() => true;
+}
+
+class AnalysisContextImplTest_Source_getModificationStamp_fromSource
+    extends TestSource {
+  int stamp;
+  AnalysisContextImplTest_Source_getModificationStamp_fromSource(this.stamp);
+  @override
+  int get modificationStamp => stamp;
+}
+
+class AnalysisContextImplTest_Source_getModificationStamp_overridden
+    extends TestSource {
+  int stamp;
+  AnalysisContextImplTest_Source_getModificationStamp_overridden(this.stamp);
+  @override
+  int get modificationStamp => stamp;
+}
+
+@reflectiveTest
+class AnalysisOptionsImplTest extends EngineTestCase {
+  void test_AnalysisOptionsImpl_copy() {
+    bool booleanValue = true;
+    for (int i = 0; i < 2; i++, booleanValue = !booleanValue) {
+      AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+      options.analyzeFunctionBodies = booleanValue;
+      options.cacheSize = i;
+      options.dart2jsHint = booleanValue;
+      options.enableStrictCallChecks = booleanValue;
+      options.enableSuperMixins = booleanValue;
+      options.generateImplicitErrors = booleanValue;
+      options.generateSdkErrors = booleanValue;
+      options.hint = booleanValue;
+      options.incremental = booleanValue;
+      options.preserveComments = booleanValue;
+      options.strongMode = booleanValue;
+      AnalysisOptionsImpl copy = new AnalysisOptionsImpl.from(options);
+      expect(copy.analyzeFunctionBodies, options.analyzeFunctionBodies);
+      expect(copy.cacheSize, options.cacheSize);
+      expect(copy.dart2jsHint, options.dart2jsHint);
+      expect(copy.enableStrictCallChecks, options.enableStrictCallChecks);
+      expect(copy.enableSuperMixins, options.enableSuperMixins);
+      expect(copy.generateImplicitErrors, options.generateImplicitErrors);
+      expect(copy.generateSdkErrors, options.generateSdkErrors);
+      expect(copy.hint, options.hint);
+      expect(copy.incremental, options.incremental);
+      expect(copy.preserveComments, options.preserveComments);
+      expect(copy.strongMode, options.strongMode);
+    }
+  }
+
+  void test_analyzeFunctionBodies() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    bool value = !options.analyzeFunctionBodies;
+    options.analyzeFunctionBodies = value;
+    expect(options.analyzeFunctionBodies, value);
+  }
+
+  void test_cacheSize() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    expect(options.cacheSize, AnalysisOptionsImpl.DEFAULT_CACHE_SIZE);
+    int value = options.cacheSize + 1;
+    options.cacheSize = value;
+    expect(options.cacheSize, value);
+  }
+
+  void test_dart2jsHint() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    bool value = !options.dart2jsHint;
+    options.dart2jsHint = value;
+    expect(options.dart2jsHint, value);
+  }
+
+  void test_enableSuperMixins() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    bool value = !options.enableSuperMixins;
+    options.enableSuperMixins = value;
+    expect(options.enableSuperMixins, value);
+  }
+
+  void test_generateImplicitErrors() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    bool value = !options.generateImplicitErrors;
+    options.generateImplicitErrors = value;
+    expect(options.generateImplicitErrors, value);
+  }
+
+  void test_generateSdkErrors() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    bool value = !options.generateSdkErrors;
+    options.generateSdkErrors = value;
+    expect(options.generateSdkErrors, value);
+  }
+
+  void test_hint() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    bool value = !options.hint;
+    options.hint = value;
+    expect(options.hint, value);
+  }
+
+  void test_incremental() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    bool value = !options.incremental;
+    options.incremental = value;
+    expect(options.incremental, value);
+  }
+
+  void test_preserveComments() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    bool value = !options.preserveComments;
+    options.preserveComments = value;
+    expect(options.preserveComments, value);
+  }
+
+  void test_strongMode() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    bool value = !options.strongMode;
+    options.strongMode = value;
+    expect(options.strongMode, value);
+  }
+}
+
+class AnalysisTask_test_perform_exception extends AnalysisTask {
+  AnalysisTask_test_perform_exception(InternalAnalysisContext arg0)
+      : super(arg0);
+  @override
+  String get taskDescription => null;
+  @override
+  accept(AnalysisTaskVisitor visitor) {
+    expect(exception, isNotNull);
+    return null;
+  }
+
+  @override
+  void internalPerform() {
+    throw new AnalysisException("Forced exception");
+  }
+}
+
+@reflectiveTest
+class AnalysisTaskTest extends EngineTestCase {
+  void test_perform_exception() {
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    AnalysisTask task = new AnalysisTask_test_perform_exception(context);
+    task.perform(new TestTaskVisitor<Object>());
+  }
+}
+
+/**
+ * A listener used to gather the [ImplicitAnalysisEvent]s that are produced
+ * during analysis.
+ */
+class AnalyzedSourcesListener {
+  /**
+   * The events that have been gathered.
+   */
+  List<ImplicitAnalysisEvent> actualEvents = <ImplicitAnalysisEvent>[];
+
+  /**
+   * The sources that are being implicitly analyzed.
+   */
+  List<Source> analyzedSources = <Source>[];
+
+  /**
+   * Assert that the given source is currently being implicitly analyzed.
+   */
+  void expectAnalyzed(Source source) {
+    expect(analyzedSources, contains(source));
+  }
+
+  /**
+   * Assert that the given source is not currently being implicitly analyzed.
+   */
+  void expectNotAnalyzed(Source source) {
+    expect(analyzedSources, isNot(contains(source)));
+  }
+
+  /**
+   * Record that the given event was produced.
+   */
+  void onData(ImplicitAnalysisEvent event) {
+    actualEvents.add(event);
+    if (event.isAnalyzed) {
+      analyzedSources.add(event.source);
+    } else {
+      analyzedSources.remove(event.source);
+    }
+  }
+}
+
+class CompilationUnitMock extends TypedMock implements CompilationUnit {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+@reflectiveTest
+class DartEntryTest extends EngineTestCase {
+  void test_allErrors() {
+    Source source = new TestSource();
+    DartEntry entry = new DartEntry();
+    expect(entry.allErrors, hasLength(0));
+    entry.setValue(SourceEntry.CONTENT_ERRORS, <AnalysisError>[
+      new AnalysisError(source, 0, 0, ScannerErrorCode.UNABLE_GET_CONTENT,
+          ['exception details'])
+    ]);
+    entry.setValue(DartEntry.SCAN_ERRORS, <AnalysisError>[
+      new AnalysisError(
+          source, 0, 0, ScannerErrorCode.UNTERMINATED_STRING_LITERAL)
+    ]);
+    entry.setValue(DartEntry.PARSE_ERRORS, <AnalysisError>[
+      new AnalysisError(source, 0, 0, ParserErrorCode.ABSTRACT_CLASS_MEMBER)
+    ]);
+    entry.setValueInLibrary(
+        DartEntry.RESOLUTION_ERRORS, source, <AnalysisError>[
+      new AnalysisError(
+          source, 0, 0, CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION)
+    ]);
+    entry.setValueInLibrary(
+        DartEntry.VERIFICATION_ERRORS, source, <AnalysisError>[
+      new AnalysisError(
+          source, 0, 0, StaticWarningCode.CASE_BLOCK_NOT_TERMINATED)
+    ]);
+    entry.setValueInLibrary(DartEntry.HINTS, source,
+        <AnalysisError>[new AnalysisError(source, 0, 0, HintCode.DEAD_CODE)]);
+    expect(entry.allErrors, hasLength(6));
+  }
+
+  void test_creation() {
+    Source librarySource = new TestSource();
+    DartEntry entry = new DartEntry();
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.INVALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.CONTAINING_LIBRARIES),
+        same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.INVALID));
+    expect(
+        entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(
+        entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.INVALID));
+    expect(
+        entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
+
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, librarySource),
+        same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, librarySource),
+        same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, librarySource),
+        same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, librarySource),
+        same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource),
+        same(CacheState.INVALID));
+    expect(
+        entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource),
+        same(CacheState.INVALID));
+  }
+
+  void test_getResolvableCompilationUnit_none() {
+    DartEntry entry = new DartEntry();
+    expect(entry.resolvableCompilationUnit, isNull);
+  }
+
+  void test_getResolvableCompilationUnit_parsed_accessed() {
+    Source librarySource = new TestSource("/lib.dart");
+    String importUri = "/f1.dart";
+    Source importSource = new TestSource(importUri);
+    ImportDirective importDirective =
+        AstFactory.importDirective3(importUri, null);
+    importDirective.source = importSource;
+    importDirective.uriContent = importUri;
+    String exportUri = "/f2.dart";
+    Source exportSource = new TestSource(exportUri);
+    ExportDirective exportDirective = AstFactory.exportDirective2(exportUri);
+    exportDirective.source = exportSource;
+    exportDirective.uriContent = exportUri;
+    String partUri = "/f3.dart";
+    Source partSource = new TestSource(partUri);
+    PartDirective partDirective = AstFactory.partDirective2(partUri);
+    partDirective.source = partSource;
+    partDirective.uriContent = partUri;
+    CompilationUnit unit = AstFactory
+        .compilationUnit3([importDirective, exportDirective, partDirective]);
+    DartEntry entry = new DartEntry();
+    entry.setValue(DartEntry.PARSED_UNIT, unit);
+    entry.getValue(DartEntry.PARSED_UNIT);
+    CompilationUnit result = entry.resolvableCompilationUnit;
+    expect(result, same(unit));
+    entry.setValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource, unit);
+    result = entry.resolvableCompilationUnit;
+    expect(result, isNot(same(unit)));
+    NodeList<Directive> directives = result.directives;
+    ImportDirective resultImportDirective = directives[0] as ImportDirective;
+    expect(resultImportDirective.uriContent, importUri);
+    expect(resultImportDirective.source, same(importSource));
+    ExportDirective resultExportDirective = directives[1] as ExportDirective;
+    expect(resultExportDirective.uriContent, exportUri);
+    expect(resultExportDirective.source, same(exportSource));
+    PartDirective resultPartDirective = directives[2] as PartDirective;
+    expect(resultPartDirective.uriContent, partUri);
+    expect(resultPartDirective.source, same(partSource));
+  }
+
+  void test_getResolvableCompilationUnit_parsed_notAccessed() {
+    CompilationUnit unit = AstFactory.compilationUnit();
+    DartEntry entry = new DartEntry();
+    entry.setValue(DartEntry.PARSED_UNIT, unit);
+    expect(entry.resolvableCompilationUnit, same(unit));
+  }
+
+  void test_getResolvableCompilationUnit_resolved() {
+    String importUri = "f1.dart";
+    Source importSource = new TestSource(importUri);
+    ImportDirective importDirective =
+        AstFactory.importDirective3(importUri, null);
+    importDirective.source = importSource;
+    importDirective.uriContent = importUri;
+    String exportUri = "f2.dart";
+    Source exportSource = new TestSource(exportUri);
+    ExportDirective exportDirective = AstFactory.exportDirective2(exportUri);
+    exportDirective.source = exportSource;
+    exportDirective.uriContent = exportUri;
+    String partUri = "f3.dart";
+    Source partSource = new TestSource(partUri);
+    PartDirective partDirective = AstFactory.partDirective2(partUri);
+    partDirective.source = partSource;
+    partDirective.uriContent = partUri;
+    CompilationUnit unit = AstFactory
+        .compilationUnit3([importDirective, exportDirective, partDirective]);
+    DartEntry entry = new DartEntry();
+    entry.setValueInLibrary(
+        DartEntry.RESOLVED_UNIT, new TestSource("lib.dart"), unit);
+    CompilationUnit result = entry.resolvableCompilationUnit;
+    expect(result, isNot(same(unit)));
+    NodeList<Directive> directives = result.directives;
+    ImportDirective resultImportDirective = directives[0] as ImportDirective;
+    expect(resultImportDirective.uriContent, importUri);
+    expect(resultImportDirective.source, same(importSource));
+    ExportDirective resultExportDirective = directives[1] as ExportDirective;
+    expect(resultExportDirective.uriContent, exportUri);
+    expect(resultExportDirective.source, same(exportSource));
+    PartDirective resultPartDirective = directives[2] as PartDirective;
+    expect(resultPartDirective.uriContent, partUri);
+    expect(resultPartDirective.source, same(partSource));
+  }
+
+  void test_getState_invalid_resolutionErrors() {
+    DartEntry entry = new DartEntry();
+    try {
+      entry.getState(DartEntry.RESOLUTION_ERRORS);
+      fail("Expected ArgumentError for RESOLUTION_ERRORS");
+    } on ArgumentError {
+      // Expected
+    }
+  }
+
+  void test_getState_invalid_verificationErrors() {
+    DartEntry entry = new DartEntry();
+    try {
+      entry.getState(DartEntry.VERIFICATION_ERRORS);
+      fail("Expected ArgumentError for VERIFICATION_ERRORS");
+    } on ArgumentError {
+      // Expected
+    }
+  }
+
+  void test_getStateInLibrary_invalid_element() {
+    DartEntry entry = new DartEntry();
+    try {
+      entry.getStateInLibrary(DartEntry.ELEMENT, new TestSource());
+      fail("Expected ArgumentError for ELEMENT");
+    } on ArgumentError {
+      // Expected
+    }
+  }
+
+  void test_getValue_containingLibraries() {
+    Source testSource = new TestSource();
+    DartEntry entry = new DartEntry();
+    List<Source> value = entry.containingLibraries;
+    expect(value, hasLength(0));
+    entry.addContainingLibrary(testSource);
+    value = entry.containingLibraries;
+    expect(value, hasLength(1));
+    expect(value[0], testSource);
+    entry.removeContainingLibrary(testSource);
+    value = entry.containingLibraries;
+    expect(value, hasLength(0));
+  }
+
+  void test_getValue_invalid_resolutionErrors() {
+    DartEntry entry = new DartEntry();
+    try {
+      entry.getValue(DartEntry.RESOLUTION_ERRORS);
+      fail("Expected ArgumentError for RESOLUTION_ERRORS");
+    } on ArgumentError {}
+  }
+
+  void test_getValue_invalid_verificationErrors() {
+    DartEntry entry = new DartEntry();
+    try {
+      entry.getValue(DartEntry.VERIFICATION_ERRORS);
+      fail("Expected ArgumentError for VERIFICATION_ERRORS");
+    } on ArgumentError {
+      // Expected
+    }
+  }
+
+  void test_getValueInLibrary_invalid_element() {
+    DartEntry entry = new DartEntry();
+    try {
+      entry.getValueInLibrary(DartEntry.ELEMENT, new TestSource());
+      fail("Expected ArgumentError for ELEMENT");
+    } on ArgumentError {
+      // Expected
+    }
+  }
+
+  void test_getValueInLibrary_invalid_resolutionErrors_multiple() {
+    Source source1 = new TestSource();
+    Source source2 = new TestSource();
+    Source source3 = new TestSource();
+    DartEntry entry = new DartEntry();
+    entry.setValueInLibrary(
+        DartEntry.RESOLVED_UNIT, source1, AstFactory.compilationUnit());
+    entry.setValueInLibrary(
+        DartEntry.RESOLVED_UNIT, source2, AstFactory.compilationUnit());
+    entry.setValueInLibrary(
+        DartEntry.RESOLVED_UNIT, source3, AstFactory.compilationUnit());
+    try {
+      entry.getValueInLibrary(DartEntry.ELEMENT, source3);
+      fail("Expected ArgumentError for ELEMENT");
+    } on ArgumentError {
+      // Expected
+    }
+  }
+
+  void test_hasInvalidData_false() {
+    DartEntry entry = new DartEntry();
+    entry.recordScanError(new CaughtException(new AnalysisException(), null));
+    expect(entry.hasInvalidData(DartEntry.ELEMENT), isFalse);
+    expect(entry.hasInvalidData(DartEntry.EXPORTED_LIBRARIES), isFalse);
+    expect(entry.hasInvalidData(DartEntry.HINTS), isFalse);
+    expect(entry.hasInvalidData(DartEntry.IMPORTED_LIBRARIES), isFalse);
+    expect(entry.hasInvalidData(DartEntry.INCLUDED_PARTS), isFalse);
+    expect(entry.hasInvalidData(DartEntry.IS_CLIENT), isFalse);
+    expect(entry.hasInvalidData(DartEntry.IS_LAUNCHABLE), isFalse);
+    expect(entry.hasInvalidData(SourceEntry.LINE_INFO), isFalse);
+    expect(entry.hasInvalidData(DartEntry.PARSE_ERRORS), isFalse);
+    expect(entry.hasInvalidData(DartEntry.PARSED_UNIT), isFalse);
+    expect(entry.hasInvalidData(DartEntry.PUBLIC_NAMESPACE), isFalse);
+    expect(entry.hasInvalidData(DartEntry.SOURCE_KIND), isFalse);
+    expect(entry.hasInvalidData(DartEntry.RESOLUTION_ERRORS), isFalse);
+    expect(entry.hasInvalidData(DartEntry.RESOLVED_UNIT), isFalse);
+    expect(entry.hasInvalidData(DartEntry.VERIFICATION_ERRORS), isFalse);
+  }
+
+  void test_hasInvalidData_true() {
+    DartEntry entry = new DartEntry();
+    expect(entry.hasInvalidData(DartEntry.ELEMENT), isTrue);
+    expect(entry.hasInvalidData(DartEntry.EXPORTED_LIBRARIES), isTrue);
+    expect(entry.hasInvalidData(DartEntry.HINTS), isTrue);
+    expect(entry.hasInvalidData(DartEntry.IMPORTED_LIBRARIES), isTrue);
+    expect(entry.hasInvalidData(DartEntry.INCLUDED_PARTS), isTrue);
+    expect(entry.hasInvalidData(DartEntry.IS_CLIENT), isTrue);
+    expect(entry.hasInvalidData(DartEntry.IS_LAUNCHABLE), isTrue);
+    expect(entry.hasInvalidData(SourceEntry.LINE_INFO), isTrue);
+    expect(entry.hasInvalidData(DartEntry.PARSE_ERRORS), isTrue);
+    expect(entry.hasInvalidData(DartEntry.PARSED_UNIT), isTrue);
+    expect(entry.hasInvalidData(DartEntry.PUBLIC_NAMESPACE), isTrue);
+    expect(entry.hasInvalidData(DartEntry.SOURCE_KIND), isTrue);
+    expect(entry.hasInvalidData(DartEntry.RESOLUTION_ERRORS), isTrue);
+    expect(entry.hasInvalidData(DartEntry.RESOLVED_UNIT), isTrue);
+    expect(entry.hasInvalidData(DartEntry.VERIFICATION_ERRORS), isTrue);
+  }
+
+  void test_invalidateAllInformation() {
+    Source librarySource = new TestSource();
+    DartEntry entry = _entryWithValidState(librarySource);
+    entry.invalidateAllInformation();
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.INVALID));
+    expect(
+        entry.getState(SourceEntry.CONTENT_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.INVALID));
+    expect(
+        entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.INVALID));
+    expect(
+        entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(
+        entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.INVALID));
+    expect(
+        entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
+
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, librarySource),
+        same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, librarySource),
+        same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, librarySource),
+        same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, librarySource),
+        same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource),
+        same(CacheState.INVALID));
+    expect(
+        entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource),
+        same(CacheState.INVALID));
+  }
+
+  void test_invalidateAllResolutionInformation() {
+    Source librarySource = new TestSource();
+    DartEntry entry = _entryWithValidState(librarySource);
+    entry.invalidateAllResolutionInformation(false);
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.CONTENT_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.INVALID));
+    expect(
+        entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
+
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, librarySource),
+        same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, librarySource),
+        same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, librarySource),
+        same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, librarySource),
+        same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource),
+        same(CacheState.INVALID));
+    expect(
+        entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource),
+        same(CacheState.INVALID));
+  }
+
+  void test_invalidateAllResolutionInformation_includingUris() {
+    Source librarySource = new TestSource();
+    DartEntry entry = _entryWithValidState(librarySource);
+    entry.invalidateAllResolutionInformation(true);
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.CONTENT_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.INVALID));
+    expect(
+        entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(
+        entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
+
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, librarySource),
+        same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, librarySource),
+        same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, librarySource),
+        same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, librarySource),
+        same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource),
+        same(CacheState.INVALID));
+    expect(
+        entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource),
+        same(CacheState.INVALID));
+  }
+
+  void test_isClient() {
+    DartEntry entry = new DartEntry();
+    // true
+    entry.setValue(DartEntry.IS_CLIENT, true);
+    expect(entry.getValue(DartEntry.IS_CLIENT), isTrue);
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.VALID));
+    // invalidate
+    entry.setState(DartEntry.IS_CLIENT, CacheState.INVALID);
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.INVALID));
+    // false
+    entry.setValue(DartEntry.IS_CLIENT, false);
+    expect(entry.getValue(DartEntry.IS_CLIENT), isFalse);
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.VALID));
+  }
+
+  void test_isLaunchable() {
+    DartEntry entry = new DartEntry();
+    // true
+    entry.setValue(DartEntry.IS_LAUNCHABLE, true);
+    expect(entry.getValue(DartEntry.IS_LAUNCHABLE), isTrue);
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.VALID));
+    // invalidate
+    entry.setState(DartEntry.IS_LAUNCHABLE, CacheState.INVALID);
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.INVALID));
+    // false
+    entry.setValue(DartEntry.IS_LAUNCHABLE, false);
+    expect(entry.getValue(DartEntry.IS_LAUNCHABLE), isFalse);
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.VALID));
+  }
+
+  void test_recordBuildElementError() {
+    Source firstLibrary = new TestSource('first.dart');
+    Source secondLibrary = new TestSource('second.dart');
+    DartEntry entry = _entryWithValidState(firstLibrary, secondLibrary);
+    entry.recordBuildElementErrorInLibrary(
+        firstLibrary, new CaughtException(new AnalysisException(), null));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.CONTENT_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.ERROR));
+    expect(
+        entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
+
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, firstLibrary),
+        same(CacheState.ERROR));
+
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, secondLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, secondLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, secondLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, secondLibrary),
+        same(CacheState.VALID));
+    expect(
+        entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, secondLibrary),
+        same(CacheState.VALID));
+  }
+
+  void test_recordContentError() {
+    Source firstLibrary = new TestSource('first.dart');
+//    Source secondLibrary = new TestSource('second.dart');
+    DartEntry entry = _entryWithValidState(firstLibrary);
+    entry
+        .recordContentError(new CaughtException(new AnalysisException(), null));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.ERROR));
+    expect(entry.getState(SourceEntry.CONTENT_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.ERROR));
+    expect(
+        entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.ERROR));
+    expect(
+        entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.ERROR));
+    expect(
+        entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.ERROR));
+
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, firstLibrary),
+        same(CacheState.ERROR));
+
+    // The following lines are commented out because we don't currently have
+    // any way of setting the state for data associated with a library we
+    // don't know anything about.
+//    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.HINTS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, secondLibrary), same(CacheState.ERROR));
+  }
+
+  void test_recordHintErrorInLibrary() {
+    Source firstLibrary = new TestSource('first.dart');
+    Source secondLibrary = new TestSource('second.dart');
+    DartEntry entry = _entryWithValidState(firstLibrary, secondLibrary);
+    entry.recordHintErrorInLibrary(
+        firstLibrary, new CaughtException(new AnalysisException(), null));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.CONTENT_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
+
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, firstLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, firstLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, firstLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, firstLibrary),
+        same(CacheState.VALID));
+
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, secondLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, secondLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, secondLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, secondLibrary),
+        same(CacheState.VALID));
+    expect(
+        entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, secondLibrary),
+        same(CacheState.VALID));
+  }
+
+  void test_recordParseError() {
+    Source firstLibrary = new TestSource('first.dart');
+//    Source secondLibrary = new TestSource('second.dart');
+    DartEntry entry = _entryWithValidState(firstLibrary);
+    entry.recordParseError(new CaughtException(new AnalysisException(), null));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.CONTENT_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.ERROR));
+    expect(
+        entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.ERROR));
+    expect(
+        entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
+
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, firstLibrary),
+        same(CacheState.ERROR));
+
+    // The following lines are commented out because we don't currently have
+    // any way of setting the state for data associated with a library we
+    // don't know anything about.
+//    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.HINTS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, secondLibrary), same(CacheState.ERROR));
+  }
+
+  void test_recordResolutionError() {
+    Source firstLibrary = new TestSource('first.dart');
+//    Source secondLibrary = new TestSource('second.dart');
+    DartEntry entry = _entryWithValidState(firstLibrary);
+    entry.recordResolutionError(
+        new CaughtException(new AnalysisException(), null));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.CONTENT_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.ERROR));
+    expect(
+        entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
+
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, firstLibrary),
+        same(CacheState.ERROR));
+
+    // The following lines are commented out because we don't currently have
+    // any way of setting the state for data associated with a library we
+    // don't know anything about.
+//    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.HINTS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, secondLibrary), same(CacheState.ERROR));
+  }
+
+  void test_recordResolutionErrorInLibrary() {
+    Source firstLibrary = new TestSource('first.dart');
+    Source secondLibrary = new TestSource('second.dart');
+    DartEntry entry = _entryWithValidState(firstLibrary, secondLibrary);
+    entry.recordResolutionErrorInLibrary(
+        firstLibrary, new CaughtException(new AnalysisException(), null));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.CONTENT_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.ERROR));
+    expect(
+        entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
+
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, firstLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, firstLibrary),
+        same(CacheState.ERROR));
+
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, secondLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, secondLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, secondLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, secondLibrary),
+        same(CacheState.VALID));
+    expect(
+        entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, secondLibrary),
+        same(CacheState.VALID));
+  }
+
+  void test_recordScanError() {
+    Source firstLibrary = new TestSource('first.dart');
+//    Source secondLibrary = new TestSource('second.dart');
+    DartEntry entry = _entryWithValidState(firstLibrary);
+    entry.recordScanError(new CaughtException(new AnalysisException(), null));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.CONTENT_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.ERROR));
+    expect(
+        entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.ERROR));
+    expect(
+        entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.ERROR));
+    expect(
+        entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.ERROR));
+
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, firstLibrary),
+        same(CacheState.ERROR));
+
+    // The following lines are commented out because we don't currently have
+    // any way of setting the state for data associated with a library we
+    // don't know anything about.
+//    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.HINTS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, secondLibrary), same(CacheState.ERROR));
+  }
+
+  void test_recordVerificationErrorInLibrary() {
+    Source firstLibrary = new TestSource('first.dart');
+    Source secondLibrary = new TestSource('second.dart');
+    DartEntry entry = _entryWithValidState(firstLibrary, secondLibrary);
+    entry.recordVerificationErrorInLibrary(
+        firstLibrary, new CaughtException(new AnalysisException(), null));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.CONTENT_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
+
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, firstLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, firstLibrary),
+        same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, firstLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, firstLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, firstLibrary),
+        same(CacheState.ERROR));
+
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, secondLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, secondLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, secondLibrary),
+        same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, secondLibrary),
+        same(CacheState.VALID));
+    expect(
+        entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, secondLibrary),
+        same(CacheState.VALID));
+  }
+
+  void test_removeResolution_multiple_first() {
+    Source source1 = new TestSource('first.dart');
+    Source source2 = new TestSource('second.dart');
+    Source source3 = new TestSource('third.dart');
+    DartEntry entry = new DartEntry();
+    entry.setValueInLibrary(
+        DartEntry.RESOLVED_UNIT, source1, AstFactory.compilationUnit());
+    entry.setValueInLibrary(
+        DartEntry.RESOLVED_UNIT, source2, AstFactory.compilationUnit());
+    entry.setValueInLibrary(
+        DartEntry.RESOLVED_UNIT, source3, AstFactory.compilationUnit());
+    entry.removeResolution(source1);
+  }
+
+  void test_removeResolution_multiple_last() {
+    Source source1 = new TestSource('first.dart');
+    Source source2 = new TestSource('second.dart');
+    Source source3 = new TestSource('third.dart');
+    DartEntry entry = new DartEntry();
+    entry.setValueInLibrary(
+        DartEntry.RESOLVED_UNIT, source1, AstFactory.compilationUnit());
+    entry.setValueInLibrary(
+        DartEntry.RESOLVED_UNIT, source2, AstFactory.compilationUnit());
+    entry.setValueInLibrary(
+        DartEntry.RESOLVED_UNIT, source3, AstFactory.compilationUnit());
+    entry.removeResolution(source3);
+  }
+
+  void test_removeResolution_multiple_middle() {
+    Source source1 = new TestSource('first.dart');
+    Source source2 = new TestSource('second.dart');
+    Source source3 = new TestSource('third.dart');
+    DartEntry entry = new DartEntry();
+    entry.setValueInLibrary(
+        DartEntry.RESOLVED_UNIT, source1, AstFactory.compilationUnit());
+    entry.setValueInLibrary(
+        DartEntry.RESOLVED_UNIT, source2, AstFactory.compilationUnit());
+    entry.setValueInLibrary(
+        DartEntry.RESOLVED_UNIT, source3, AstFactory.compilationUnit());
+    entry.removeResolution(source2);
+  }
+
+  void test_removeResolution_single() {
+    Source source1 = new TestSource();
+    DartEntry entry = new DartEntry();
+    entry.setValueInLibrary(
+        DartEntry.RESOLVED_UNIT, source1, AstFactory.compilationUnit());
+    entry.removeResolution(source1);
+  }
+
+  void test_resolvableCompilationUnit_builtUnit() {
+    Source librarySource = new TestSource('/lib.dart');
+    CompilationUnit unit = AstFactory.compilationUnit();
+    CompilationUnitElement element =
+        ElementFactory.compilationUnit('test.dart');
+    unit.element = element;
+    DartEntry entry = new DartEntry();
+    entry.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
+    entry.setValueInLibrary(DartEntry.BUILT_UNIT, librarySource, unit);
+    entry.invalidateAllResolutionInformation(false);
+    CompilationUnit resolvableUnit = entry.resolvableCompilationUnit;
+    expect(resolvableUnit, isNotNull);
+    expect(resolvableUnit.element, isNull);
+    expect(entry.resolvableCompilationUnit, isNull);
+  }
+
+  void test_resolvableCompilationUnit_none() {
+    DartEntry entry = new DartEntry();
+    expect(entry.resolvableCompilationUnit, isNull);
+  }
+
+  void test_resolvableCompilationUnit_parsed() {
+    CompilationUnit unit = AstFactory.compilationUnit();
+    DartEntry entry = new DartEntry();
+    entry.setValue(DartEntry.PARSED_UNIT, unit);
+    expect(entry.resolvableCompilationUnit, unit);
+    expect(entry.resolvableCompilationUnit, isNull);
+  }
+
+  void test_resolvableCompilationUnit_resolved() {
+    Source librarySource = new TestSource('/lib.dart');
+    CompilationUnit unit = AstFactory.compilationUnit();
+    CompilationUnitElement element =
+        ElementFactory.compilationUnit('test.dart');
+    unit.element = element;
+    DartEntry entry = new DartEntry();
+    entry.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
+    entry.setValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource, unit);
+    entry.invalidateAllResolutionInformation(false);
+    CompilationUnit resolvableUnit = entry.resolvableCompilationUnit;
+    expect(resolvableUnit, isNotNull);
+    expect(resolvableUnit.element, isNull);
+    expect(entry.resolvableCompilationUnit, isNull);
+  }
+
+  void test_setState_element() {
+    _setState(DartEntry.ELEMENT);
+  }
+
+  void test_setState_exportedLibraries() {
+    _setState(DartEntry.EXPORTED_LIBRARIES);
+  }
+
+  void test_setState_hints() {
+    _setStateInLibrary(DartEntry.HINTS);
+  }
+
+  void test_setState_importedLibraries() {
+    _setState(DartEntry.IMPORTED_LIBRARIES);
+  }
+
+  void test_setState_includedParts() {
+    _setState(DartEntry.INCLUDED_PARTS);
+  }
+
+  void test_setState_invalid_element() {
+    DartEntry entry = new DartEntry();
+    try {
+      entry.setStateInLibrary(DartEntry.ELEMENT, null, CacheState.FLUSHED);
+      fail("Expected ArgumentError for ELEMENT");
+    } on ArgumentError {
+      // Expected
+    }
+  }
+
+  void test_setState_invalid_resolutionErrors() {
+    DartEntry entry = new DartEntry();
+    try {
+      entry.setState(DartEntry.RESOLUTION_ERRORS, CacheState.FLUSHED);
+      fail("Expected ArgumentError for RESOLUTION_ERRORS");
+    } on ArgumentError {
+      // Expected
+    }
+  }
+
+  void test_setState_invalid_validState() {
+    DartEntry entry = new DartEntry();
+    try {
+      entry.setState(SourceEntry.LINE_INFO, CacheState.VALID);
+      fail("Expected ArgumentError for a state of VALID");
+    } on ArgumentError {}
+  }
+
+  void test_setState_invalid_verificationErrors() {
+    DartEntry entry = new DartEntry();
+    try {
+      entry.setState(DartEntry.VERIFICATION_ERRORS, CacheState.FLUSHED);
+      fail("Expected ArgumentError for VERIFICATION_ERRORS");
+    } on ArgumentError {
+      // Expected
+    }
+  }
+
+  void test_setState_isClient() {
+    _setState(DartEntry.IS_CLIENT);
+  }
+
+  void test_setState_isLaunchable() {
+    _setState(DartEntry.IS_LAUNCHABLE);
+  }
+
+  void test_setState_lineInfo() {
+    _setState(SourceEntry.LINE_INFO);
+  }
+
+  void test_setState_parsedUnit() {
+    _setState(DartEntry.PARSED_UNIT);
+  }
+
+  void test_setState_parseErrors() {
+    _setState(DartEntry.PARSE_ERRORS);
+  }
+
+  void test_setState_publicNamespace() {
+    _setState(DartEntry.PUBLIC_NAMESPACE);
+  }
+
+  void test_setState_resolutionErrors() {
+    _setStateInLibrary(DartEntry.RESOLUTION_ERRORS);
+  }
+
+  void test_setState_resolvedUnit() {
+    _setStateInLibrary(DartEntry.RESOLVED_UNIT);
+  }
+
+  void test_setState_scanErrors() {
+    _setState(DartEntry.SCAN_ERRORS);
+  }
+
+  void test_setState_sourceKind() {
+    _setState(DartEntry.SOURCE_KIND);
+  }
+
+  void test_setState_tokenStream() {
+    _setState(DartEntry.TOKEN_STREAM);
+  }
+
+  void test_setState_verificationErrors() {
+    _setStateInLibrary(DartEntry.VERIFICATION_ERRORS);
+  }
+
+  void test_setValue_element() {
+    _setValue(
+        DartEntry.ELEMENT,
+        new LibraryElementImpl.forNode(
+            null, AstFactory.libraryIdentifier2(["lib"])));
+  }
+
+  void test_setValue_exportedLibraries() {
+    _setValue(DartEntry.EXPORTED_LIBRARIES, <Source>[new TestSource()]);
+  }
+
+  void test_setValue_hints() {
+    _setValueInLibrary(DartEntry.HINTS,
+        <AnalysisError>[new AnalysisError(null, 0, 0, HintCode.DEAD_CODE)]);
+  }
+
+  void test_setValue_importedLibraries() {
+    _setValue(DartEntry.IMPORTED_LIBRARIES, <Source>[new TestSource()]);
+  }
+
+  void test_setValue_includedParts() {
+    _setValue(DartEntry.INCLUDED_PARTS, <Source>[new TestSource()]);
+  }
+
+  void test_setValue_isClient() {
+    _setValue(DartEntry.IS_CLIENT, true);
+  }
+
+  void test_setValue_isLaunchable() {
+    _setValue(DartEntry.IS_LAUNCHABLE, true);
+  }
+
+  void test_setValue_lineInfo() {
+    _setValue(SourceEntry.LINE_INFO, new LineInfo(<int>[0]));
+  }
+
+  void test_setValue_parsedUnit() {
+    _setValue(DartEntry.PARSED_UNIT, AstFactory.compilationUnit());
+  }
+
+  void test_setValue_parseErrors() {
+    _setValue(DartEntry.PARSE_ERRORS, <AnalysisError>[
+      new AnalysisError(null, 0, 0, ParserErrorCode.ABSTRACT_CLASS_MEMBER)
+    ]);
+  }
+
+  void test_setValue_publicNamespace() {
+    _setValue(DartEntry.PUBLIC_NAMESPACE,
+        new Namespace(new HashMap<String, Element>()));
+  }
+
+  void test_setValue_resolutionErrors() {
+    _setValueInLibrary(DartEntry.RESOLUTION_ERRORS, <AnalysisError>[
+      new AnalysisError(
+          null, 0, 0, CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION)
+    ]);
+  }
+
+  void test_setValue_resolvedUnit() {
+    _setValueInLibrary(DartEntry.RESOLVED_UNIT, AstFactory.compilationUnit());
+  }
+
+  void test_setValue_scanErrors() {
+    _setValue(DartEntry.SCAN_ERRORS, <AnalysisError>[
+      new AnalysisError(
+          null, 0, 0, ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT)
+    ]);
+  }
+
+  void test_setValue_sourceKind() {
+    _setValue(DartEntry.SOURCE_KIND, SourceKind.LIBRARY);
+  }
+
+  void test_setValue_tokenStream() {
+    _setValue(DartEntry.TOKEN_STREAM, new Token(TokenType.LT, 5));
+  }
+
+  void test_setValue_verificationErrors() {
+    _setValueInLibrary(DartEntry.VERIFICATION_ERRORS, <AnalysisError>[
+      new AnalysisError(null, 0, 0, StaticWarningCode.CASE_BLOCK_NOT_TERMINATED)
+    ]);
+  }
+
+  DartEntry _entryWithValidState([Source firstLibrary, Source secondLibrary]) {
+    DartEntry entry = new DartEntry();
+    entry.setValue(SourceEntry.CONTENT, null);
+    entry.setValue(SourceEntry.CONTENT_ERRORS, null);
+    entry.setValue(SourceEntry.LINE_INFO, null);
+    entry.setValue(DartEntry.CONTAINING_LIBRARIES, null);
+    entry.setValue(DartEntry.ELEMENT, null);
+    entry.setValue(DartEntry.EXPORTED_LIBRARIES, null);
+    entry.setValue(DartEntry.IMPORTED_LIBRARIES, null);
+    entry.setValue(DartEntry.INCLUDED_PARTS, null);
+    entry.setValue(DartEntry.IS_CLIENT, null);
+    entry.setValue(DartEntry.IS_LAUNCHABLE, null);
+    entry.setValue(DartEntry.PARSE_ERRORS, null);
+    entry.setValue(DartEntry.PARSED_UNIT, null);
+    entry.setValue(DartEntry.PUBLIC_NAMESPACE, null);
+    entry.setValue(DartEntry.SCAN_ERRORS, null);
+    entry.setValue(DartEntry.SOURCE_KIND, null);
+    entry.setValue(DartEntry.TOKEN_STREAM, null);
+    if (firstLibrary != null) {
+      entry.setValueInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary, null);
+      entry.setValueInLibrary(DartEntry.BUILT_UNIT, firstLibrary, null);
+      entry.setValueInLibrary(DartEntry.HINTS, firstLibrary, null);
+      entry.setValueInLibrary(DartEntry.RESOLUTION_ERRORS, firstLibrary, null);
+      entry.setValueInLibrary(DartEntry.RESOLVED_UNIT, firstLibrary, null);
+      entry.setValueInLibrary(
+          DartEntry.VERIFICATION_ERRORS, firstLibrary, null);
+    }
+    if (secondLibrary != null) {
+      entry.setValueInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary, null);
+      entry.setValueInLibrary(DartEntry.BUILT_UNIT, secondLibrary, null);
+      entry.setValueInLibrary(DartEntry.HINTS, secondLibrary, null);
+      entry.setValueInLibrary(DartEntry.RESOLUTION_ERRORS, secondLibrary, null);
+      entry.setValueInLibrary(DartEntry.RESOLVED_UNIT, secondLibrary, null);
+      entry.setValueInLibrary(
+          DartEntry.VERIFICATION_ERRORS, secondLibrary, null);
+    }
+    //
+    // Validate that the state was set correctly.
+    //
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.CONTENT_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(
+        entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
+    if (firstLibrary != null) {
+      expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary),
+          same(CacheState.VALID));
+      expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, firstLibrary),
+          same(CacheState.VALID));
+      expect(entry.getStateInLibrary(DartEntry.HINTS, firstLibrary),
+          same(CacheState.VALID));
+      expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, firstLibrary),
+          same(CacheState.VALID));
+      expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, firstLibrary),
+          same(CacheState.VALID));
+      expect(
+          entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, firstLibrary),
+          same(CacheState.VALID));
+    }
+    if (secondLibrary != null) {
+      expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary),
+          same(CacheState.VALID));
+      expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, secondLibrary),
+          same(CacheState.VALID));
+      expect(entry.getStateInLibrary(DartEntry.HINTS, secondLibrary),
+          same(CacheState.VALID));
+      expect(
+          entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, secondLibrary),
+          same(CacheState.VALID));
+      expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, secondLibrary),
+          same(CacheState.VALID));
+      expect(
+          entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, secondLibrary),
+          same(CacheState.VALID));
+    }
+    return entry;
+  }
+
+  void _setState(DataDescriptor descriptor) {
+    DartEntry entry = new DartEntry();
+    expect(entry.getState(descriptor), isNot(same(CacheState.FLUSHED)));
+    entry.setState(descriptor, CacheState.FLUSHED);
+    expect(entry.getState(descriptor), same(CacheState.FLUSHED));
+  }
+
+  void _setStateInLibrary(DataDescriptor descriptor) {
+    Source source = new TestSource();
+    DartEntry entry = new DartEntry();
+    expect(entry.getStateInLibrary(descriptor, source),
+        isNot(same(CacheState.FLUSHED)));
+    entry.setStateInLibrary(descriptor, source, CacheState.FLUSHED);
+    expect(
+        entry.getStateInLibrary(descriptor, source), same(CacheState.FLUSHED));
+  }
+
+  void _setValue(DataDescriptor descriptor, Object newValue) {
+    DartEntry entry = new DartEntry();
+    Object value = entry.getValue(descriptor);
+    expect(newValue, isNot(same(value)));
+    entry.setValue(descriptor, newValue);
+    expect(entry.getState(descriptor), same(CacheState.VALID));
+    expect(entry.getValue(descriptor), same(newValue));
+  }
+
+  void _setValueInLibrary(DataDescriptor descriptor, Object newValue) {
+    Source source = new TestSource();
+    DartEntry entry = new DartEntry();
+    Object value = entry.getValueInLibrary(descriptor, source);
+    expect(newValue, isNot(same(value)));
+    entry.setValueInLibrary(descriptor, source, newValue);
+    expect(entry.getStateInLibrary(descriptor, source), same(CacheState.VALID));
+    expect(entry.getValueInLibrary(descriptor, source), same(newValue));
+  }
+}
+
+@reflectiveTest
+class GenerateDartErrorsTaskTest extends EngineTestCase {
+  void test_accept() {
+    GenerateDartErrorsTask task =
+        new GenerateDartErrorsTask(null, null, null, null);
+    expect(task.accept(new GenerateDartErrorsTaskTestTV_accept()), isTrue);
+  }
+
+  void test_getException() {
+    GenerateDartErrorsTask task =
+        new GenerateDartErrorsTask(null, null, null, null);
+    expect(task.exception, isNull);
+  }
+
+  void test_getLibraryElement() {
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    LibraryElement element = ElementFactory.library(context, "lib");
+    GenerateDartErrorsTask task =
+        new GenerateDartErrorsTask(context, null, null, element);
+    expect(task.libraryElement, same(element));
+  }
+
+  void test_getSource() {
+    Source source =
+        new FileBasedSource(FileUtilities2.createFile("/test.dart"));
+    GenerateDartErrorsTask task =
+        new GenerateDartErrorsTask(null, source, null, null);
+    expect(task.source, same(source));
+  }
+
+  void test_perform() {
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    Source source =
+        new FileBasedSource(FileUtilities2.createFile("/test.dart"));
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(source);
+    context.applyChanges(changeSet);
+    context.setContents(
+        source,
+        r'''
+library lib;
+class A {
+  int f = new A();
+}''');
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+    CompilationUnit unit =
+        context.getResolvedCompilationUnit(source, libraryElement);
+    GenerateDartErrorsTask task =
+        new GenerateDartErrorsTask(context, source, unit, libraryElement);
+    task.perform(
+        new GenerateDartErrorsTaskTestTV_perform(libraryElement, source));
+  }
+
+  void test_perform_validateDirectives() {
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    Source source =
+        new FileBasedSource(FileUtilities2.createFile("/test.dart"));
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(source);
+    context.applyChanges(changeSet);
+    // TODO(scheglov) "import" causes second error reported
+//    context.setContents(source, EngineTestCase.createSource([
+//        "library lib;",
+//        "import 'invaliduri^.dart';",
+//        "export '\${a}lib3.dart';",
+//        "part '/does/not/exist.dart';",
+//        "class A {}"]));
+    context.setContents(
+        source,
+        r'''
+library lib;
+part '/does/not/exist.dart';
+class A {}''');
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+    CompilationUnit unit =
+        context.getResolvedCompilationUnit(source, libraryElement);
+    GenerateDartErrorsTask task =
+        new GenerateDartErrorsTask(context, source, unit, libraryElement);
+    task.perform(new GenerateDartErrorsTaskTestTV_perform_validateDirectives(
+        libraryElement, source));
+  }
+}
+
+class GenerateDartErrorsTaskTestTV_accept extends TestTaskVisitor<bool> {
+  @override
+  bool visitGenerateDartErrorsTask(GenerateDartErrorsTask task) => true;
+}
+
+class GenerateDartErrorsTaskTestTV_perform extends TestTaskVisitor<bool> {
+  LibraryElement libraryElement;
+  Source source;
+  GenerateDartErrorsTaskTestTV_perform(this.libraryElement, this.source);
+  @override
+  bool visitGenerateDartErrorsTask(GenerateDartErrorsTask task) {
+    CaughtException exception = task.exception;
+    if (exception != null) {
+      throw exception;
+    }
+    expect(task.libraryElement, same(libraryElement));
+    expect(task.source, same(source));
+    List<AnalysisError> errors = task.errors;
+    expect(errors, hasLength(1));
+    return true;
+  }
+}
+
+class GenerateDartErrorsTaskTestTV_perform_validateDirectives
+    extends TestTaskVisitor<bool> {
+  LibraryElement libraryElement;
+  Source source;
+  GenerateDartErrorsTaskTestTV_perform_validateDirectives(
+      this.libraryElement, this.source);
+  @override
+  bool visitGenerateDartErrorsTask(GenerateDartErrorsTask task) {
+    CaughtException exception = task.exception;
+    if (exception != null) {
+      throw exception;
+    }
+    expect(task.libraryElement, same(libraryElement));
+    expect(task.source, same(source));
+    List<AnalysisError> errors = task.errors;
+    expect(errors, hasLength(1));
+    expect(errors[0].errorCode, same(CompileTimeErrorCode.URI_DOES_NOT_EXIST));
+    return true;
+  }
+}
+
+@reflectiveTest
+class GenerateDartHintsTaskTest extends EngineTestCase {
+  void test_accept() {
+    GenerateDartHintsTask task = new GenerateDartHintsTask(null, null, null);
+    expect(task.accept(new GenerateDartHintsTaskTestTV_accept()), isTrue);
+  }
+
+  void test_getException() {
+    GenerateDartHintsTask task = new GenerateDartHintsTask(null, null, null);
+    expect(task.exception, isNull);
+  }
+
+  void test_getHintMap() {
+    GenerateDartHintsTask task = new GenerateDartHintsTask(null, null, null);
+    expect(task.hintMap, isNull);
+  }
+
+  void test_getLibraryElement() {
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    LibraryElement element = ElementFactory.library(context, "lib");
+    GenerateDartHintsTask task =
+        new GenerateDartHintsTask(context, null, element);
+    expect(task.libraryElement, same(element));
+  }
+
+  void test_perform() {
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    ChangeSet changeSet = new ChangeSet();
+    Source librarySource =
+        new FileBasedSource(FileUtilities2.createFile("/test.dart"));
+    changeSet.addedSource(librarySource);
+    Source unusedSource =
+        new FileBasedSource(FileUtilities2.createFile("/unused.dart"));
+    changeSet.addedSource(unusedSource);
+    Source partSource =
+        new FileBasedSource(FileUtilities2.createFile("/part.dart"));
+    changeSet.addedSource(partSource);
+    context.applyChanges(changeSet);
+    context.setContents(
+        librarySource,
+        r'''
+library lib;
+import 'unused.dart';
+part 'part.dart';''');
+    context.setContents(unusedSource, "library unused;");
+    context.setContents(partSource, "part of lib;");
+    List<TimestampedData<CompilationUnit>> units = new List<TimestampedData>(2);
+    units[0] = new TimestampedData<CompilationUnit>(
+        context.getModificationStamp(librarySource),
+        context.resolveCompilationUnit2(librarySource, librarySource));
+    units[1] = new TimestampedData<CompilationUnit>(
+        context.getModificationStamp(partSource),
+        context.resolveCompilationUnit2(partSource, librarySource));
+    GenerateDartHintsTask task = new GenerateDartHintsTask(
+        context, units, context.computeLibraryElement(librarySource));
+    task.perform(
+        new GenerateDartHintsTaskTestTV_perform(librarySource, partSource));
+  }
+}
+
+class GenerateDartHintsTaskTestTV_accept extends TestTaskVisitor<bool> {
+  @override
+  bool visitGenerateDartHintsTask(GenerateDartHintsTask task) => true;
+}
+
+class GenerateDartHintsTaskTestTV_perform extends TestTaskVisitor<bool> {
+  Source librarySource;
+  Source partSource;
+  GenerateDartHintsTaskTestTV_perform(this.librarySource, this.partSource);
+  @override
+  bool visitGenerateDartHintsTask(GenerateDartHintsTask task) {
+    CaughtException exception = task.exception;
+    if (exception != null) {
+      throw exception;
+    }
+    expect(task.libraryElement, isNotNull);
+    HashMap<Source, List<AnalysisError>> hintMap = task.hintMap;
+    expect(hintMap, hasLength(2));
+    expect(hintMap[librarySource], hasLength(1));
+    expect(hintMap[partSource], hasLength(0));
+    return true;
+  }
+}
+
+@reflectiveTest
+class GenerateDartLintsTaskTest extends EngineTestCase {
+  void test_accept() {
+    GenerateDartLintsTask task = new GenerateDartLintsTask(null, null, null);
+    expect(task.accept(new GenerateDartLintsTaskTestTV_accept()), isTrue);
+  }
+
+  void test_exception() {
+    GenerateDartLintsTask task = new GenerateDartLintsTask(null, null, null);
+    expect(task.exception, isNull);
+  }
+
+  void test_libraryElement() {
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    LibraryElement element = ElementFactory.library(context, "lib");
+    GenerateDartLintsTask task =
+        new GenerateDartLintsTask(context, null, element);
+    expect(task.libraryElement, same(element));
+  }
+
+  void test_lintMap() {
+    GenerateDartLintsTask task = new GenerateDartLintsTask(null, null, null);
+    expect(task.lintMap, isNull);
+  }
+
+  void test_perform() {
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    ChangeSet changeSet = new ChangeSet();
+    Source librarySource =
+        new FileBasedSource(FileUtilities2.createFile("/test.dart"));
+    changeSet.addedSource(librarySource);
+    context.applyChanges(changeSet);
+    context.setContents(
+        librarySource,
+        r'''
+library lib;
+''');
+    List<TimestampedData<CompilationUnit>> units = new List<TimestampedData>(1);
+    units[0] = new TimestampedData<CompilationUnit>(
+        context.getModificationStamp(librarySource),
+        context.resolveCompilationUnit2(librarySource, librarySource));
+    GenerateDartLintsTask task = new GenerateDartLintsTask(
+        context, units, context.computeLibraryElement(librarySource));
+    task.perform(new GenerateDartLintsTaskTestTV_perform(librarySource));
+  }
+}
+
+class GenerateDartLintsTaskTestTV_accept extends TestTaskVisitor<bool> {
+  @override
+  bool visitGenerateDartLintsTask(GenerateDartLintsTask task) => true;
+}
+
+class GenerateDartLintsTaskTestTV_perform extends TestTaskVisitor<bool> {
+  Source librarySource;
+  GenerateDartLintsTaskTestTV_perform(this.librarySource);
+  @override
+  bool visitGenerateDartLintsTask(GenerateDartLintsTask task) {
+    CaughtException exception = task.exception;
+    if (exception != null) {
+      throw exception;
+    }
+    expect(task.libraryElement, isNotNull);
+    return true;
+  }
+}
+
+@reflectiveTest
+class GetContentTaskTest extends EngineTestCase {
+  void test_accept() {
+    Source source = new TestSource('/test.dart', '');
+    GetContentTask task = new GetContentTask(null, source);
+    expect(task.accept(new GetContentTaskTestTV_accept()), isTrue);
+  }
+
+  void test_getException() {
+    Source source = new TestSource('/test.dart', '');
+    GetContentTask task = new GetContentTask(null, source);
+    expect(task.exception, isNull);
+  }
+
+  void test_getModificationTime() {
+    Source source = new TestSource('/test.dart', '');
+    GetContentTask task = new GetContentTask(null, source);
+    expect(task.modificationTime, -1);
+  }
+
+  void test_getSource() {
+    Source source = new TestSource('/test.dart', '');
+    GetContentTask task = new GetContentTask(null, source);
+    expect(task.source, same(source));
+  }
+
+  void test_perform_exception() {
+    TestSource source = new TestSource();
+    source.generateExceptionOnRead = true;
+    //    final InternalAnalysisContext context = new AnalysisContextImpl();
+    //    context.setSourceFactory(new SourceFactory(new FileUriResolver()));
+    GetContentTask task = new GetContentTask(null, source);
+    task.perform(new GetContentTaskTestTV_perform_exception());
+  }
+
+  void test_perform_valid() {
+    Source source = new TestSource('/test.dart', 'class A {}');
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    GetContentTask task = new GetContentTask(context, source);
+    task.perform(new GetContentTaskTestTV_perform_valid(context, source));
+  }
+}
+
+class GetContentTaskTestTV_accept extends TestTaskVisitor<bool> {
+  @override
+  bool visitGetContentTask(GetContentTask task) => true;
+}
+
+class GetContentTaskTestTV_perform_exception extends TestTaskVisitor<bool> {
+  @override
+  bool visitGetContentTask(GetContentTask task) {
+    expect(task.exception, isNotNull);
+    return true;
+  }
+}
+
+class GetContentTaskTestTV_perform_valid extends TestTaskVisitor<bool> {
+  InternalAnalysisContext context;
+  Source source;
+  GetContentTaskTestTV_perform_valid(this.context, this.source);
+  @override
+  bool visitGetContentTask(GetContentTask task) {
+    CaughtException exception = task.exception;
+    if (exception != null) {
+      throw exception;
+    }
+    expect(task.modificationTime, context.getModificationStamp(source));
+    expect(task.source, same(source));
+    return true;
+  }
+}
+
+@reflectiveTest
+class HtmlEntryTest extends EngineTestCase {
+  void set state(DataDescriptor descriptor) {
+    HtmlEntry entry = new HtmlEntry();
+    expect(entry.getState(descriptor), isNot(same(CacheState.FLUSHED)));
+    entry.setState(descriptor, CacheState.FLUSHED);
+    expect(entry.getState(descriptor), same(CacheState.FLUSHED));
+  }
+
+  void test_creation() {
+    HtmlEntry entry = new HtmlEntry();
+    expect(entry, isNotNull);
+  }
+
+  void test_getAllErrors() {
+    Source source = new TestSource();
+    HtmlEntry entry = new HtmlEntry();
+    expect(entry.allErrors, hasLength(0));
+    entry.setValue(HtmlEntry.PARSE_ERRORS, <AnalysisError>[
+      new AnalysisError(source, 0, 0, ParserErrorCode.EXPECTED_TOKEN, [";"])
+    ]);
+    entry.setValue(HtmlEntry.RESOLUTION_ERRORS, <AnalysisError>[
+      new AnalysisError(source, 0, 0, HtmlWarningCode.INVALID_URI, ["-"])
+    ]);
+    entry.setValue(HtmlEntry.HINTS,
+        <AnalysisError>[new AnalysisError(source, 0, 0, HintCode.DEAD_CODE)]);
+    expect(entry.allErrors, hasLength(3));
+  }
+
+  void test_invalidateAllResolutionInformation() {
+    HtmlEntry entry = _entryWithValidState();
+    entry.invalidateAllResolutionInformation(false);
+    expect(entry.getState(HtmlEntry.ELEMENT), same(CacheState.INVALID));
+    expect(entry.getState(HtmlEntry.HINTS), same(CacheState.INVALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.PARSED_UNIT), same(CacheState.VALID));
+    expect(
+        entry.getState(HtmlEntry.REFERENCED_LIBRARIES), same(CacheState.VALID));
+    expect(
+        entry.getState(HtmlEntry.RESOLUTION_ERRORS), same(CacheState.INVALID));
+  }
+
+  void test_invalidateAllResolutionInformation_includingUris() {
+    HtmlEntry entry = _entryWithValidState();
+    entry.invalidateAllResolutionInformation(true);
+    expect(entry.getState(HtmlEntry.ELEMENT), same(CacheState.INVALID));
+    expect(entry.getState(HtmlEntry.HINTS), same(CacheState.INVALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.PARSED_UNIT), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.REFERENCED_LIBRARIES),
+        same(CacheState.INVALID));
+    expect(
+        entry.getState(HtmlEntry.RESOLUTION_ERRORS), same(CacheState.INVALID));
+  }
+
+  void test_setState_element() {
+    state = HtmlEntry.ELEMENT;
+  }
+
+  void test_setState_hints() {
+    state = HtmlEntry.HINTS;
+  }
+
+  void test_setState_lineInfo() {
+    state = SourceEntry.LINE_INFO;
+  }
+
+  void test_setState_parsedUnit() {
+    state = HtmlEntry.PARSED_UNIT;
+  }
+
+  void test_setState_parseErrors() {
+    state = HtmlEntry.PARSE_ERRORS;
+  }
+
+  void test_setState_referencedLibraries() {
+    state = HtmlEntry.REFERENCED_LIBRARIES;
+  }
+
+  void test_setState_resolutionErrors() {
+    state = HtmlEntry.RESOLUTION_ERRORS;
+  }
+
+  void test_setValue_element() {
+    _setValue(HtmlEntry.ELEMENT, new HtmlElementImpl(null, "test.html"));
+  }
+
+  void test_setValue_hints() {
+    _setValue(HtmlEntry.HINTS,
+        <AnalysisError>[new AnalysisError(null, 0, 0, HintCode.DEAD_CODE)]);
+  }
+
+  void test_setValue_illegal() {
+    HtmlEntry entry = new HtmlEntry();
+    try {
+      entry.setValue(DartEntry.ELEMENT, null);
+      fail("Expected ArgumentError for DartEntry.ELEMENT");
+    } on ArgumentError {}
+  }
+
+  void test_setValue_lineInfo() {
+    _setValue(SourceEntry.LINE_INFO, new LineInfo(<int>[0]));
+  }
+
+  void test_setValue_parsedUnit() {
+    _setValue(HtmlEntry.PARSED_UNIT, new ht.HtmlUnit(null, null, null));
+  }
+
+  void test_setValue_parseErrors() {
+    _setValue(HtmlEntry.PARSE_ERRORS, <AnalysisError>[
+      new AnalysisError(null, 0, 0, HtmlWarningCode.INVALID_URI, ["-"])
+    ]);
+  }
+
+  void test_setValue_referencedLibraries() {
+    _setValue(HtmlEntry.REFERENCED_LIBRARIES, <Source>[new TestSource()]);
+  }
+
+  void test_setValue_resolutionErrors() {
+    _setValue(HtmlEntry.RESOLUTION_ERRORS, <AnalysisError>[
+      new AnalysisError(null, 0, 0, HtmlWarningCode.INVALID_URI, ["-"])
+    ]);
+  }
+
+  HtmlEntry _entryWithValidState() {
+    HtmlEntry entry = new HtmlEntry();
+    entry.setValue(HtmlEntry.ELEMENT, null);
+    entry.setValue(HtmlEntry.HINTS, null);
+    entry.setValue(SourceEntry.LINE_INFO, null);
+    entry.setValue(HtmlEntry.PARSE_ERRORS, null);
+    entry.setValue(HtmlEntry.PARSED_UNIT, null);
+    entry.setValue(HtmlEntry.REFERENCED_LIBRARIES, null);
+    entry.setValue(HtmlEntry.RESOLUTION_ERRORS, null);
+    expect(entry.getState(HtmlEntry.ELEMENT), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.HINTS), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.PARSED_UNIT), same(CacheState.VALID));
+    expect(
+        entry.getState(HtmlEntry.REFERENCED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.RESOLUTION_ERRORS), same(CacheState.VALID));
+    return entry;
+  }
+
+  void _setValue(DataDescriptor descriptor, Object newValue) {
+    HtmlEntry entry = new HtmlEntry();
+    Object value = entry.getValue(descriptor);
+    expect(newValue, isNot(same(value)));
+    entry.setValue(descriptor, newValue);
+    expect(entry.getState(descriptor), same(CacheState.VALID));
+    expect(entry.getValue(descriptor), same(newValue));
+  }
+}
+
+@reflectiveTest
+class IncrementalAnalysisCacheTest {
+  Source _source = new TestSource();
+  DartEntry _entry = new DartEntry();
+  CompilationUnit _unit = new CompilationUnitMock();
+  IncrementalAnalysisCache _result;
+  void setUp() {
+    _entry.setValueInLibrary(DartEntry.RESOLVED_UNIT, _source, _unit);
+  }
+
+  void test_cacheResult() {
+    IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
+        null, _source, "hello", "hbazlo", 1, 2, 3, _entry);
+    CompilationUnit newUnit = new CompilationUnitMock();
+    _result = IncrementalAnalysisCache.cacheResult(cache, newUnit);
+    expect(_result, isNotNull);
+    expect(_result.source, same(_source));
+    expect(_result.resolvedUnit, same(newUnit));
+    expect(_result.oldContents, "hbazlo");
+    expect(_result.newContents, "hbazlo");
+    expect(_result.offset, 0);
+    expect(_result.oldLength, 0);
+    expect(_result.newLength, 0);
+  }
+
+  void test_cacheResult_noCache() {
+    IncrementalAnalysisCache cache = null;
+    CompilationUnit newUnit = new CompilationUnitMock();
+    _result = IncrementalAnalysisCache.cacheResult(cache, newUnit);
+    expect(_result, isNull);
+  }
+
+  void test_cacheResult_noCacheNoResult() {
+    IncrementalAnalysisCache cache = null;
+    CompilationUnit newUnit = null;
+    _result = IncrementalAnalysisCache.cacheResult(cache, newUnit);
+    expect(_result, isNull);
+  }
+
+  void test_cacheResult_noResult() {
+    IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
+        null, _source, "hello", "hbazlo", 1, 2, 3, _entry);
+    CompilationUnit newUnit = null;
+    _result = IncrementalAnalysisCache.cacheResult(cache, newUnit);
+    expect(_result, isNull);
+  }
+
+  void test_clear_differentSource() {
+    IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
+        null, _source, "hello", "hbazlo", 1, 2, 3, _entry);
+    Source otherSource = new TestSource("blat.dart", "blat");
+    _result = IncrementalAnalysisCache.clear(cache, otherSource);
+    expect(_result, same(cache));
+  }
+
+  void test_clear_nullCache() {
+    IncrementalAnalysisCache cache = null;
+    _result = IncrementalAnalysisCache.clear(cache, _source);
+    expect(_result, isNull);
+  }
+
+  void test_clear_sameSource() {
+    IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
+        null, _source, "hello", "hbazlo", 1, 2, 3, _entry);
+    _result = IncrementalAnalysisCache.clear(cache, _source);
+    expect(_result, isNull);
+  }
+
+  void test_update_append() {
+    IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
+        null, _source, "hello", "hbazlo", 1, 2, 3, _entry);
+    DartEntry newEntry = new DartEntry();
+    _result = IncrementalAnalysisCache.update(
+        cache, _source, "hbazlo", "hbazxlo", 4, 0, 1, newEntry);
+    expect(_result, isNotNull);
+    expect(_result.source, same(_source));
+    expect(_result.resolvedUnit, same(_unit));
+    expect(_result.oldContents, "hello");
+    expect(_result.newContents, "hbazxlo");
+    expect(_result.offset, 1);
+    expect(_result.oldLength, 2);
+    expect(_result.newLength, 4);
+  }
+
+  void test_update_appendToCachedResult() {
+    IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
+        null, _source, "hello", "hbazlo", 1, 2, 3, _entry);
+    CompilationUnit newUnit = new CompilationUnitMock();
+    cache = IncrementalAnalysisCache.cacheResult(cache, newUnit);
+    expect(cache, isNotNull);
+    DartEntry newEntry = new DartEntry();
+    _result = IncrementalAnalysisCache.update(
+        cache, _source, "hbazlo", "hbazxlo", 4, 0, 1, newEntry);
+    expect(_result, isNotNull);
+    expect(_result.source, same(_source));
+    expect(_result.resolvedUnit, same(newUnit));
+    expect(_result.oldContents, "hbazlo");
+    expect(_result.newContents, "hbazxlo");
+    expect(_result.offset, 4);
+    expect(_result.oldLength, 0);
+    expect(_result.newLength, 1);
+  }
+
+  void test_update_appendWithNewResolvedUnit() {
+    IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
+        null, _source, "hello", "hbazlo", 1, 2, 3, _entry);
+    DartEntry newEntry = new DartEntry();
+    CompilationUnit newUnit = new CompilationUnitMock();
+    newEntry.setValueInLibrary(DartEntry.RESOLVED_UNIT, _source, newUnit);
+    _result = IncrementalAnalysisCache.update(
+        cache, _source, "hbazlo", "hbazxlo", 4, 0, 1, newEntry);
+    expect(_result, isNotNull);
+    expect(_result.source, same(_source));
+    expect(_result.resolvedUnit, same(newUnit));
+    expect(_result.oldContents, "hbazlo");
+    expect(_result.newContents, "hbazxlo");
+    expect(_result.offset, 4);
+    expect(_result.oldLength, 0);
+    expect(_result.newLength, 1);
+  }
+
+  void test_update_appendWithNoNewResolvedUnit() {
+    IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
+        null, _source, "hello", "hbazlo", 1, 2, 3, _entry);
+    DartEntry newEntry = new DartEntry();
+    _result = IncrementalAnalysisCache.update(
+        cache, _source, "hbazlo", "hbazxlo", 4, 0, 1, newEntry);
+    expect(_result, isNotNull);
+    expect(_result.source, same(_source));
+    expect(_result.resolvedUnit, same(_unit));
+    expect(_result.oldContents, "hello");
+    expect(_result.newContents, "hbazxlo");
+    expect(_result.offset, 1);
+    expect(_result.oldLength, 2);
+    expect(_result.newLength, 4);
+  }
+
+  void test_update_delete() {
+    IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
+        null, _source, "hello", "hbazlo", 1, 2, 3, _entry);
+    DartEntry newEntry = new DartEntry();
+    _result = IncrementalAnalysisCache.update(
+        cache, _source, "hbazlo", "hzlo", 1, 2, 0, newEntry);
+    expect(_result, isNotNull);
+    expect(_result.source, same(_source));
+    expect(_result.resolvedUnit, same(_unit));
+    expect(_result.oldContents, "hello");
+    expect(_result.newContents, "hzlo");
+    expect(_result.offset, 1);
+    expect(_result.oldLength, 2);
+    expect(_result.newLength, 1);
+  }
+
+  void test_update_insert_nonContiguous_after() {
+    IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
+        null, _source, "hello", "hbazlo", 1, 2, 3, _entry);
+    DartEntry newEntry = new DartEntry();
+    _result = IncrementalAnalysisCache.update(
+        cache, _source, "hbazlo", "hbazlox", 6, 0, 1, newEntry);
+    expect(_result, isNull);
+  }
+
+  void test_update_insert_nonContiguous_before() {
+    IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
+        null, _source, "hello", "hbazlo", 1, 2, 3, _entry);
+    DartEntry newEntry = new DartEntry();
+    _result = IncrementalAnalysisCache.update(
+        cache, _source, "hbazlo", "xhbazlo", 0, 0, 1, newEntry);
+    expect(_result, isNull);
+  }
+
+  void test_update_newSource_entry() {
+    Source oldSource = new TestSource("blat.dart", "blat");
+    DartEntry oldEntry = new DartEntry();
+    CompilationUnit oldUnit = new CompilationUnitMock();
+    oldEntry.setValueInLibrary(DartEntry.RESOLVED_UNIT, _source, oldUnit);
+    IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
+        null, oldSource, "hello", "hbazlo", 1, 2, 3, oldEntry);
+    expect(cache.source, same(oldSource));
+    expect(cache.resolvedUnit, same(oldUnit));
+    _result = IncrementalAnalysisCache.update(
+        cache, _source, "foo", "foobz", 3, 0, 2, _entry);
+    expect(_result, isNotNull);
+    expect(_result.source, same(_source));
+    expect(_result.resolvedUnit, same(_unit));
+    expect(_result.oldContents, "foo");
+    expect(_result.newContents, "foobz");
+    expect(_result.offset, 3);
+    expect(_result.oldLength, 0);
+    expect(_result.newLength, 2);
+  }
+
+  void test_update_newSource_noEntry() {
+    Source oldSource = new TestSource("blat.dart", "blat");
+    DartEntry oldEntry = new DartEntry();
+    CompilationUnit oldUnit = new CompilationUnitMock();
+    oldEntry.setValueInLibrary(DartEntry.RESOLVED_UNIT, _source, oldUnit);
+    IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
+        null, oldSource, "hello", "hbazlo", 1, 2, 3, oldEntry);
+    expect(cache.source, same(oldSource));
+    expect(cache.resolvedUnit, same(oldUnit));
+    _result = IncrementalAnalysisCache.update(
+        cache, _source, "foo", "foobar", 3, 0, 3, null);
+    expect(_result, isNull);
+  }
+
+  void test_update_noCache_entry() {
+    _result = IncrementalAnalysisCache.update(
+        null, _source, "hello", "hbazlo", 1, 2, 3, _entry);
+    expect(_result, isNotNull);
+    expect(_result.source, same(_source));
+    expect(_result.resolvedUnit, same(_unit));
+    expect(_result.oldContents, "hello");
+    expect(_result.newContents, "hbazlo");
+    expect(_result.offset, 1);
+    expect(_result.oldLength, 2);
+    expect(_result.newLength, 3);
+    expect(_result.hasWork, isTrue);
+  }
+
+  void test_update_noCache_entry_noOldSource_append() {
+    _result = IncrementalAnalysisCache.update(
+        null, _source, null, "hellxo", 4, 0, 1, _entry);
+    expect(_result, isNotNull);
+    expect(_result.source, same(_source));
+    expect(_result.resolvedUnit, same(_unit));
+    expect(_result.oldContents, "hello");
+    expect(_result.newContents, "hellxo");
+    expect(_result.offset, 4);
+    expect(_result.oldLength, 0);
+    expect(_result.newLength, 1);
+    expect(_result.hasWork, isTrue);
+  }
+
+  void test_update_noCache_entry_noOldSource_delete() {
+    _result = IncrementalAnalysisCache.update(
+        null, _source, null, "helo", 4, 1, 0, _entry);
+    expect(_result, isNull);
+  }
+
+  void test_update_noCache_entry_noOldSource_replace() {
+    _result = IncrementalAnalysisCache.update(
+        null, _source, null, "helxo", 4, 1, 1, _entry);
+    expect(_result, isNull);
+  }
+
+  void test_update_noCache_noEntry() {
+    _result = IncrementalAnalysisCache.update(
+        null, _source, "hello", "hbazlo", 1, 2, 3, null);
+    expect(_result, isNull);
+  }
+
+  void test_update_replace() {
+    IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
+        null, _source, "hello", "hbazlo", 1, 2, 3, _entry);
+    _result = IncrementalAnalysisCache.update(
+        cache, _source, "hbazlo", "hbarrlo", 3, 1, 2, null);
+    expect(_result, isNotNull);
+    expect(_result.source, same(_source));
+    expect(_result.resolvedUnit, same(_unit));
+    expect(_result.oldContents, "hello");
+    expect(_result.newContents, "hbarrlo");
+    expect(_result.offset, 1);
+    expect(_result.oldLength, 2);
+    expect(_result.newLength, 4);
+  }
+
+  void test_verifyStructure_invalidUnit() {
+    String oldCode = "main() {foo;}";
+    String newCode = "main() {boo;}";
+    CompilationUnit badUnit = _parse("main() {bad;}");
+    _entry.setValueInLibrary(DartEntry.RESOLVED_UNIT, _source, badUnit);
+    IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
+        null, _source, oldCode, newCode, 8, 1, 1, _entry);
+    CompilationUnit newUnit = _parse(newCode);
+    _result = IncrementalAnalysisCache.verifyStructure(cache, _source, newUnit);
+    expect(_result, isNull);
+  }
+
+  void test_verifyStructure_noCache() {
+    IncrementalAnalysisCache cache = null;
+    CompilationUnit newUnit = new CompilationUnitMock();
+    _result = IncrementalAnalysisCache.verifyStructure(cache, _source, newUnit);
+    expect(_result, isNull);
+  }
+
+  void test_verifyStructure_noCacheNoUnit() {
+    IncrementalAnalysisCache cache = null;
+    CompilationUnit newUnit = null;
+    _result = IncrementalAnalysisCache.verifyStructure(cache, _source, newUnit);
+    expect(_result, isNull);
+  }
+
+  void test_verifyStructure_noUnit() {
+    IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
+        null, _source, "hello", "hbazlo", 1, 2, 3, _entry);
+    CompilationUnit newUnit = null;
+    _result = IncrementalAnalysisCache.verifyStructure(cache, _source, newUnit);
+    expect(_result, same(cache));
+    expect(_result.resolvedUnit, same(_unit));
+  }
+
+  void test_verifyStructure_otherSource() {
+    IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
+        null, _source, "hello", "hbazlo", 1, 2, 3, _entry);
+    CompilationUnit newUnit = new CompilationUnitMock();
+    Source otherSource = new TestSource("blat.dart", "blat");
+    _result =
+        IncrementalAnalysisCache.verifyStructure(cache, otherSource, newUnit);
+    expect(_result, same(cache));
+    expect(_result.resolvedUnit, same(_unit));
+  }
+
+  void test_verifyStructure_validUnit() {
+    String oldCode = "main() {foo;}";
+    String newCode = "main() {boo;}";
+    CompilationUnit goodUnit = _parse(newCode);
+    _entry.setValueInLibrary(DartEntry.RESOLVED_UNIT, _source, goodUnit);
+    IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
+        null, _source, oldCode, newCode, 1, 2, 3, _entry);
+    CompilationUnit newUnit = _parse(newCode);
+    _result = IncrementalAnalysisCache.verifyStructure(cache, _source, newUnit);
+    expect(_result, same(cache));
+    expect(_result.resolvedUnit, same(goodUnit));
+  }
+
+  CompilationUnit _parse(String code) {
+    Scanner scanner = new Scanner(_source, new CharSequenceReader(code),
+        AnalysisErrorListener.NULL_LISTENER);
+    Parser parser = new Parser(_source, AnalysisErrorListener.NULL_LISTENER);
+    return parser.parseCompilationUnit(scanner.tokenize());
+  }
+}
+
+@reflectiveTest
+class IncrementalAnalysisTaskTest extends EngineTestCase {
+  void test_accept() {
+    IncrementalAnalysisTask task = new IncrementalAnalysisTask(null, null);
+    expect(task.accept(new IncrementalAnalysisTaskTestTV_accept()), isTrue);
+  }
+
+  void test_perform() {
+    // main() {} String foo;
+    // main() {String} String foo;
+    CompilationUnit newUnit =
+        _assertTask("main() {", "", "String", "} String foo;");
+    NodeList<CompilationUnitMember> declarations = newUnit.declarations;
+    FunctionDeclaration main = declarations[0] as FunctionDeclaration;
+    expect(main.name.name, "main");
+    BlockFunctionBody body = main.functionExpression.body as BlockFunctionBody;
+    ExpressionStatement statement =
+        body.block.statements[0] as ExpressionStatement;
+    expect(statement.toSource(), "String;");
+    SimpleIdentifier identifier = statement.expression as SimpleIdentifier;
+    expect(identifier.name, "String");
+    expect(identifier.staticElement, isNotNull);
+    TopLevelVariableDeclaration fooDecl =
+        declarations[1] as TopLevelVariableDeclaration;
+    SimpleIdentifier fooName = fooDecl.variables.variables[0].name;
+    expect(fooName.name, "foo");
+    expect(fooName.staticElement, isNotNull);
+    // assert element reference is preserved
+  }
+
+  CompilationUnit _assertTask(
+      String prefix, String removed, String added, String suffix) {
+    String oldCode = "$prefix$removed$suffix";
+    String newCode = "$prefix$added$suffix";
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    Source source = new TestSource("/test.dart", oldCode);
+    DartEntry entry = new DartEntry();
+    CompilationUnit oldUnit = context.resolveCompilationUnit2(source, source);
+    expect(oldUnit, isNotNull);
+    entry.setValueInLibrary(DartEntry.RESOLVED_UNIT, source, oldUnit);
+    IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
+        null,
+        source,
+        oldCode,
+        newCode,
+        prefix.length,
+        removed.length,
+        added.length,
+        entry);
+    expect(cache, isNotNull);
+    IncrementalAnalysisTask task = new IncrementalAnalysisTask(context, cache);
+    CompilationUnit newUnit =
+        task.perform(new IncrementalAnalysisTaskTestTV_assertTask(task));
+    expect(newUnit, isNotNull);
+    return newUnit;
+  }
+}
+
+class IncrementalAnalysisTaskTestTV_accept extends TestTaskVisitor<bool> {
+  @override
+  bool visitIncrementalAnalysisTask(IncrementalAnalysisTask task) => true;
+}
+
+class IncrementalAnalysisTaskTestTV_assertTask
+    extends TestTaskVisitor<CompilationUnit> {
+  IncrementalAnalysisTask task;
+  IncrementalAnalysisTaskTestTV_assertTask(this.task);
+  @override
+  CompilationUnit visitIncrementalAnalysisTask(
+          IncrementalAnalysisTask incrementalAnalysisTask) =>
+      task.compilationUnit;
+}
+
+@reflectiveTest
+class LintGeneratorTest extends EngineTestCase {
+  void test_generate() {
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    ChangeSet changeSet = new ChangeSet();
+    Source librarySource =
+        new FileBasedSource(FileUtilities2.createFile("/test.dart"));
+    changeSet.addedSource(librarySource);
+    context.applyChanges(changeSet);
+    context.setContents(
+        librarySource,
+        r'''
+library lib;
+''');
+
+    CompilationUnit unit =
+        context.resolveCompilationUnit2(librarySource, librarySource);
+    List<CompilationUnit> units = <CompilationUnit>[];
+    units.add(unit);
+
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+
+    LintGeneratorTest_Linter linter = new LintGeneratorTest_Linter();
+
+    LintGenerator lintGenerator =
+        new LintGenerator(units, errorListener, [linter]);
+    lintGenerator.generate();
+
+    linter.testExpectations();
+  }
+
+  void test_generate_null_visitor() {
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    ChangeSet changeSet = new ChangeSet();
+    Source librarySource =
+        new FileBasedSource(FileUtilities2.createFile("/test.dart"));
+    changeSet.addedSource(librarySource);
+    context.applyChanges(changeSet);
+    context.setContents(
+        librarySource,
+        r'''
+library lib;
+''');
+
+    CompilationUnit unit =
+        context.resolveCompilationUnit2(librarySource, librarySource);
+    List<CompilationUnit> units = <CompilationUnit>[];
+    units.add(unit);
+
+    RecordingErrorListener errorListener = new RecordingErrorListener();
+
+    Linter badLinter = new LintGeneratorTest_Linter_Null_Visitor();
+    LintGeneratorTest_Linter goodLinter = new LintGeneratorTest_Linter();
+
+    LintGenerator lintGenerator =
+        new LintGenerator(units, errorListener, [badLinter, goodLinter]);
+    // Test that generate does not fall down with a null visitor
+    lintGenerator.generate();
+    // Well-formed linter should still get called
+    goodLinter.testExpectations();
+  }
+}
+
+class LintGeneratorTest_Linter extends Linter with SimpleAstVisitor<Object> {
+  bool visited;
+
+  @override
+  AstVisitor getVisitor() => this;
+
+  testExpectations() {
+    expect(reporter, isNotNull);
+    expect(visited, isTrue);
+  }
+
+  @override
+  Object visitCompilationUnit(CompilationUnit node) {
+    visited = true;
+    return null;
+  }
+}
+
+class LintGeneratorTest_Linter_Null_Visitor extends Linter {
+  @override
+  AstVisitor getVisitor() => null;
+}
+
+class MockSourceFactory extends SourceFactory {
+  MockSourceFactory() : super([]);
+  Source resolveUri(Source containingSource, String containedUri) {
+    throw new JavaIOException();
+  }
+}
+
+@reflectiveTest
+class ParseDartTaskTest extends EngineTestCase {
+  void test_accept() {
+    ParseDartTask task = new ParseDartTask(null, null, null, null);
+    expect(task.accept(new ParseDartTaskTestTV_accept()), isTrue);
+  }
+
+  void test_getCompilationUnit() {
+    ParseDartTask task = new ParseDartTask(null, null, null, null);
+    expect(task.compilationUnit, isNull);
+  }
+
+  void test_getErrors() {
+    ParseDartTask task = new ParseDartTask(null, null, null, null);
+    expect(task.errors, hasLength(0));
+  }
+
+  void test_getException() {
+    ParseDartTask task = new ParseDartTask(null, null, null, null);
+    expect(task.exception, isNull);
+  }
+
+  void test_getSource() {
+    Source source = new TestSource('/test.dart');
+    ParseDartTask task = new ParseDartTask(null, source, null, null);
+    expect(task.source, same(source));
+  }
+
+  void test_hasNonPartOfDirective() {
+    ParseDartTask task = new ParseDartTask(null, null, null, null);
+    expect(task.hasNonPartOfDirective, isFalse);
+  }
+
+  void test_hasPartOfDirective() {
+    ParseDartTask task = new ParseDartTask(null, null, null, null);
+    expect(task.hasPartOfDirective, isFalse);
+  }
+
+  void test_perform_exception() {
+    TestSource source = new TestSource();
+    source.generateExceptionOnRead = true;
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    ParseDartTask task = new ParseDartTask(context, source, null, null);
+    task.perform(new ParseDartTaskTestTV_perform_exception());
+  }
+
+  void test_perform_library() {
+    String content = r'''
+library lib;
+import 'lib2.dart';
+export 'lib3.dart';
+part 'part.dart';
+class A {''';
+    Source source = new TestSource('/test.dart', content);
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    ParseDartTask task = _createParseTask(context, source, content);
+    task.perform(new ParseDartTaskTestTV_perform_library(context, source));
+  }
+
+  void test_perform_part() {
+    String content = r'''
+part of lib;
+class B {}''';
+    Source source = new TestSource('/test.dart', content);
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    ParseDartTask task = _createParseTask(context, source, content);
+    task.perform(new ParseDartTaskTestTV_perform_part(context, source));
+  }
+
+  void test_perform_validateDirectives() {
+    String content = r'''
+library lib;
+import '/does/not/exist.dart';
+import '://invaliduri.dart';
+export '${a}lib3.dart';
+part 'part.dart';
+class A {}''';
+    Source source = new TestSource('/test.dart', content);
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    ParseDartTask task = _createParseTask(context, source, content);
+    task.perform(
+        new ParseDartTaskTestTV_perform_validateDirectives(context, source));
+  }
+
+  void test_resolveDirective_dartUri() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    ImportDirective directive = AstFactory.importDirective3('dart:core', null);
+    AnalysisContext context = AnalysisContextFactory.contextWithCore();
+    Source source =
+        ParseDartTask.resolveDirective(context, null, directive, listener);
+    expect(source, isNotNull);
+  }
+
+  void test_resolveDirective_exception() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    ImportDirective directive = AstFactory.importDirective3('dart:core', null);
+    AnalysisContext context = AnalysisContextFactory.contextWithCore();
+    context.sourceFactory = new MockSourceFactory();
+    Source source =
+        ParseDartTask.resolveDirective(context, null, directive, listener);
+    expect(source, isNull);
+    expect(listener.errors, hasLength(1));
+  }
+
+  /**
+   * Create and return a task that will parse the given content from the given source in the given
+   * context.
+   *
+   * @param context the context to be passed to the task
+   * @param source the source to be parsed
+   * @param content the content of the source to be parsed
+   * @return the task that was created
+   * @throws AnalysisException if the task could not be created
+   */
+  ParseDartTask _createParseTask(
+      InternalAnalysisContext context, Source source, String content) {
+    ScanDartTask scanTask = new ScanDartTask(context, source, content);
+    scanTask.perform(new ParseDartTaskTestTV_createParseTask());
+    return new ParseDartTask(
+        context, source, scanTask.tokenStream, scanTask.lineInfo);
+  }
+}
+
+class ParseDartTaskTestTV_accept extends TestTaskVisitor<bool> {
+  @override
+  bool visitParseDartTask(ParseDartTask task) => true;
+}
+
+class ParseDartTaskTestTV_createParseTask extends TestTaskVisitor<Object> {
+  @override
+  Object visitScanDartTask(ScanDartTask task) => null;
+}
+
+class ParseDartTaskTestTV_perform_exception extends TestTaskVisitor<bool> {
+  @override
+  bool visitParseDartTask(ParseDartTask task) {
+    expect(task.exception, isNotNull);
+    return true;
+  }
+}
+
+class ParseDartTaskTestTV_perform_library extends TestTaskVisitor<Object> {
+  InternalAnalysisContext context;
+  Source source;
+  ParseDartTaskTestTV_perform_library(this.context, this.source);
+  @override
+  Object visitParseDartTask(ParseDartTask task) {
+    CaughtException exception = task.exception;
+    if (exception != null) {
+      throw exception;
+    }
+    expect(task.compilationUnit, isNotNull);
+    expect(task.errors, hasLength(1));
+    expect(task.source, same(source));
+    expect(task.hasNonPartOfDirective, isTrue);
+    expect(task.hasPartOfDirective, isFalse);
+    return null;
+  }
+}
+
+class ParseDartTaskTestTV_perform_part extends TestTaskVisitor<Object> {
+  InternalAnalysisContext context;
+  Source source;
+  ParseDartTaskTestTV_perform_part(this.context, this.source);
+  @override
+  Object visitParseDartTask(ParseDartTask task) {
+    CaughtException exception = task.exception;
+    if (exception != null) {
+      throw exception;
+    }
+    expect(task.compilationUnit, isNotNull);
+    expect(task.errors, hasLength(0));
+    expect(task.source, same(source));
+    expect(task.hasNonPartOfDirective, isFalse);
+    expect(task.hasPartOfDirective, isTrue);
+    return null;
+  }
+}
+
+class ParseDartTaskTestTV_perform_validateDirectives
+    extends TestTaskVisitor<Object> {
+  InternalAnalysisContext context;
+  Source source;
+  ParseDartTaskTestTV_perform_validateDirectives(this.context, this.source);
+  @override
+  Object visitParseDartTask(ParseDartTask task) {
+    CaughtException exception = task.exception;
+    if (exception != null) {
+      throw exception;
+    }
+    expect(task.compilationUnit, isNotNull);
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    errorListener.addAll(task.errors);
+    errorListener.assertErrorsWithCodes([
+      CompileTimeErrorCode.URI_WITH_INTERPOLATION,
+      CompileTimeErrorCode.INVALID_URI
+    ]);
+    expect(task.source, same(source));
+    expect(task.hasNonPartOfDirective, isTrue);
+    expect(task.hasPartOfDirective, isFalse);
+    return null;
+  }
+}
+
+@reflectiveTest
+class ParseHtmlTaskTest extends EngineTestCase {
+  ParseHtmlTask parseContents(String contents, TestLogger testLogger) {
+    return parseSource(
+        new TestSource('/test.dart', contents), contents, testLogger);
+  }
+
+  ParseHtmlTask parseSource(
+      Source source, String contents, TestLogger testLogger) {
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    context.setContents(source, contents);
+    ParseHtmlTask task = new ParseHtmlTask(context, source, contents);
+    Logger oldLogger = AnalysisEngine.instance.logger;
+    try {
+      AnalysisEngine.instance.logger = testLogger;
+      task.perform(new ParseHtmlTaskTestTV_parseSource(context, source));
+    } finally {
+      AnalysisEngine.instance.logger = oldLogger;
+    }
+    return task;
+  }
+
+  void test_accept() {
+    ParseHtmlTask task = new ParseHtmlTask(null, null, "");
+    expect(task.accept(new ParseHtmlTaskTestTV_accept()), isTrue);
+  }
+
+  void test_getException() {
+    ParseHtmlTask task = new ParseHtmlTask(null, null, "");
+    expect(task.exception, isNull);
+  }
+
+  void test_getHtmlUnit() {
+    ParseHtmlTask task = new ParseHtmlTask(null, null, "");
+    expect(task.htmlUnit, isNull);
+  }
+
+  void test_getLineInfo() {
+    ParseHtmlTask task = new ParseHtmlTask(null, null, "");
+    expect(task.lineInfo, isNull);
+  }
+
+  void test_getReferencedLibraries() {
+    ParseHtmlTask task = new ParseHtmlTask(null, null, "");
+    expect(task.referencedLibraries, hasLength(0));
+  }
+
+  void test_getSource() {
+    Source source = new TestSource('/test.dart');
+    ParseHtmlTask task = new ParseHtmlTask(null, source, "");
+    expect(task.source, same(source));
+  }
+
+  void test_perform_embedded_source() {
+    String contents = r'''
+<html>
+<head>
+  <script type='application/dart'>
+    void buttonPressed() {}
+  </script>
+</head>
+<body>
+</body>
+</html>''';
+    TestLogger testLogger = new TestLogger();
+    ParseHtmlTask task = parseContents(contents, testLogger);
+    expect(task.referencedLibraries, hasLength(0));
+    expect(testLogger.errorCount, 0);
+    expect(testLogger.infoCount, 0);
+  }
+
+  void test_perform_empty_source_reference() {
+    String contents = r'''
+<html>
+<head>
+  <script type='application/dart' src=''/>
+</head>
+<body>
+</body>
+</html>''';
+    TestLogger testLogger = new TestLogger();
+    ParseHtmlTask task = parseContents(contents, testLogger);
+    expect(task.referencedLibraries, hasLength(0));
+    expect(testLogger.errorCount, 0);
+    expect(testLogger.infoCount, 0);
+  }
+
+  void test_perform_invalid_source_reference() {
+    String contents = r'''
+<html>
+<head>
+  <script type='application/dart' src='an;invalid:[]uri'/>
+</head>
+<body>
+</body>
+</html>''';
+    TestLogger testLogger = new TestLogger();
+    ParseHtmlTask task = parseContents(contents, testLogger);
+    expect(task.referencedLibraries, hasLength(0));
+    expect(testLogger.errorCount, 0);
+    expect(testLogger.infoCount, 0);
+  }
+
+  void test_perform_non_existing_source_reference() {
+    String contents = r'''
+<html>
+<head>
+  <script type='application/dart' src='does/not/exist.dart'/>
+</head>
+<body>
+</body>
+</html>''';
+    TestLogger testLogger = new TestLogger();
+    ParseHtmlTask task = parseSource(
+        new ParseHtmlTaskTest_non_existing_source(contents),
+        contents,
+        testLogger);
+    expect(task.referencedLibraries, hasLength(0));
+    expect(testLogger.errorCount, 0);
+    expect(testLogger.infoCount, 0);
+  }
+
+  void test_perform_referenced_source() {
+    // TODO(scheglov) this test fails because we put into cache TestSource
+    // test.dart (and actually should test.html), but resolve
+    // src='test.dart' as a FileBasedSource
+    // We need to switch to a virtual file system and use it everywhere.
+//    String contents = EngineTestCase.createSource([
+//        "<html>",
+//        "<head>",
+//        "  <script type='application/dart' src='test.dart'/>",
+//        "</head>",
+//        "<body>",
+//        "</body>",
+//        "</html>"]);
+//    TestLogger testLogger = new TestLogger();
+//    ParseHtmlTask task = parseContents(contents, testLogger);
+//    EngineTestCase.assertLength(1, task.referencedLibraries);
+//    JUnitTestCase.assertEquals(0, testLogger.errorCount);
+//    JUnitTestCase.assertEquals(0, testLogger.errorCount);
+  }
+}
+
+class ParseHtmlTaskTest_non_existing_source extends TestSource {
+  ParseHtmlTaskTest_non_existing_source(String arg0) : super(arg0);
+  @override
+  Uri resolveRelativeUri(Uri containedUri) {
+    try {
+      return parseUriWithException("file:/does/not/exist.dart");
+    } on URISyntaxException {
+      return null;
+    }
+  }
+}
+
+class ParseHtmlTaskTestTV_accept extends TestTaskVisitor<bool> {
+  @override
+  bool visitParseHtmlTask(ParseHtmlTask task) => true;
+}
+
+class ParseHtmlTaskTestTV_parseSource extends TestTaskVisitor<bool> {
+  InternalAnalysisContext context;
+  Source source;
+  ParseHtmlTaskTestTV_parseSource(this.context, this.source);
+  @override
+  bool visitParseHtmlTask(ParseHtmlTask task) {
+    CaughtException exception = task.exception;
+    if (exception != null) {
+      throw exception;
+    }
+    expect(task.htmlUnit, isNotNull);
+    expect(task.lineInfo, isNotNull);
+    expect(task.source, same(source));
+    return true;
+  }
+}
+
+@reflectiveTest
+class PartitionManagerTest extends EngineTestCase {
+  void test_clearCache() {
+    PartitionManager manager = new PartitionManager();
+    DartSdk sdk = new MockDartSdk();
+    SdkCachePartition oldPartition = manager.forSdk(sdk);
+    manager.clearCache();
+    SdkCachePartition newPartition = manager.forSdk(sdk);
+    expect(newPartition, isNot(same(oldPartition)));
+  }
+
+  void test_creation() {
+    expect(new PartitionManager(), isNotNull);
+  }
+
+  void test_forSdk() {
+    PartitionManager manager = new PartitionManager();
+    DartSdk sdk1 = new MockDartSdk();
+    SdkCachePartition partition1 = manager.forSdk(sdk1);
+    expect(partition1, isNotNull);
+    expect(manager.forSdk(sdk1), same(partition1));
+    DartSdk sdk2 = new MockDartSdk();
+    SdkCachePartition partition2 = manager.forSdk(sdk2);
+    expect(partition2, isNotNull);
+    expect(manager.forSdk(sdk2), same(partition2));
+    expect(partition2, isNot(same(partition1)));
+  }
+}
+
+@reflectiveTest
+class ResolveDartLibraryTaskTest extends EngineTestCase {
+  void test_accept() {
+    ResolveDartLibraryTask task = new ResolveDartLibraryTask(null, null, null);
+    expect(task.accept(new ResolveDartLibraryTaskTestTV_accept()), isTrue);
+  }
+
+  void test_getException() {
+    ResolveDartLibraryTask task = new ResolveDartLibraryTask(null, null, null);
+    expect(task.exception, isNull);
+  }
+
+  void test_getLibraryResolver() {
+    ResolveDartLibraryTask task = new ResolveDartLibraryTask(null, null, null);
+    expect(task.libraryResolver, isNull);
+  }
+
+  void test_getLibrarySource() {
+    Source source = new TestSource('/test.dart');
+    ResolveDartLibraryTask task =
+        new ResolveDartLibraryTask(null, null, source);
+    expect(task.librarySource, same(source));
+  }
+
+  void test_getUnitSource() {
+    Source source = new TestSource('/test.dart');
+    ResolveDartLibraryTask task =
+        new ResolveDartLibraryTask(null, source, null);
+    expect(task.unitSource, same(source));
+  }
+
+  void test_perform_exception() {
+    TestSource source = new TestSource();
+    source.generateExceptionOnRead = true;
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    ResolveDartLibraryTask task =
+        new ResolveDartLibraryTask(context, source, source);
+    task.perform(new ResolveDartLibraryTaskTestTV_perform_exception());
+  }
+
+  void test_perform_library() {
+    Source source = new TestSource(
+        '/test.dart',
+        r'''
+library lib;
+class A {}''');
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    ResolveDartLibraryTask task =
+        new ResolveDartLibraryTask(context, source, source);
+    task.perform(new ResolveDartLibraryTaskTestTV_perform_library(source));
+  }
+}
+
+class ResolveDartLibraryTaskTestTV_accept extends TestTaskVisitor<bool> {
+  @override
+  bool visitResolveDartLibraryTask(ResolveDartLibraryTask task) => true;
+}
+
+class ResolveDartLibraryTaskTestTV_perform_exception
+    extends TestTaskVisitor<bool> {
+  @override
+  bool visitResolveDartLibraryTask(ResolveDartLibraryTask task) {
+    expect(task.exception, isNotNull);
+    return true;
+  }
+}
+
+class ResolveDartLibraryTaskTestTV_perform_library
+    extends TestTaskVisitor<bool> {
+  Source source;
+  ResolveDartLibraryTaskTestTV_perform_library(this.source);
+  @override
+  bool visitResolveDartLibraryTask(ResolveDartLibraryTask task) {
+    CaughtException exception = task.exception;
+    if (exception != null) {
+      throw exception;
+    }
+    expect(task.libraryResolver, isNotNull);
+    expect(task.librarySource, same(source));
+    expect(task.unitSource, same(source));
+    return true;
+  }
+}
+
+@reflectiveTest
+class ResolveDartUnitTaskTest extends EngineTestCase {
+  void test_accept() {
+    ResolveDartUnitTask task = new ResolveDartUnitTask(null, null, null);
+    expect(task.accept(new ResolveDartUnitTaskTestTV_accept()), isTrue);
+  }
+
+  void test_getException() {
+    ResolveDartUnitTask task = new ResolveDartUnitTask(null, null, null);
+    expect(task.exception, isNull);
+  }
+
+  void test_getLibrarySource() {
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    LibraryElementImpl element = ElementFactory.library(context, "lib");
+    Source source = element.source;
+    ResolveDartUnitTask task = new ResolveDartUnitTask(null, null, element);
+    expect(task.librarySource, same(source));
+  }
+
+  void test_getResolvedUnit() {
+    ResolveDartUnitTask task = new ResolveDartUnitTask(null, null, null);
+    expect(task.resolvedUnit, isNull);
+  }
+
+  void test_getSource() {
+    Source source = new TestSource('/test.dart');
+    ResolveDartUnitTask task = new ResolveDartUnitTask(null, source, null);
+    expect(task.source, same(source));
+  }
+
+  void test_perform_exception() {
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    LibraryElementImpl element = ElementFactory.library(context, "lib");
+    TestSource source = new TestSource();
+    source.generateExceptionOnRead = true;
+    (element.definingCompilationUnit as CompilationUnitElementImpl).source =
+        source;
+    ResolveDartUnitTask task =
+        new ResolveDartUnitTask(context, source, element);
+    task.perform(new ResolveDartUnitTaskTestTV_perform_exception());
+  }
+
+  void test_perform_library() {
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    LibraryElementImpl libraryElement = ElementFactory.library(context, "lib");
+    CompilationUnitElementImpl unitElement =
+        libraryElement.definingCompilationUnit as CompilationUnitElementImpl;
+    ClassElementImpl classElement = ElementFactory.classElement2("A");
+    classElement.nameOffset = 19;
+    ConstructorElementImpl constructorElement =
+        ElementFactory.constructorElement2(classElement, null);
+    constructorElement.synthetic = true;
+    classElement.constructors = <ConstructorElement>[constructorElement];
+    unitElement.types = <ClassElement>[classElement];
+    Source source = unitElement.source;
+    context.setContents(
+        source,
+        r'''
+library lib;
+class A {}''');
+    ResolveDartUnitTask task =
+        new ResolveDartUnitTask(context, source, libraryElement);
+    task.perform(
+        new ResolveDartUnitTaskTestTV_perform_library(source, context));
+  }
+}
+
+class ResolveDartUnitTaskTestTV_accept extends TestTaskVisitor<bool> {
+  @override
+  bool visitResolveDartUnitTask(ResolveDartUnitTask task) => true;
+}
+
+class ResolveDartUnitTaskTestTV_perform_exception
+    extends TestTaskVisitor<bool> {
+  @override
+  bool visitResolveDartUnitTask(ResolveDartUnitTask task) {
+    expect(task.exception, isNotNull);
+    return true;
+  }
+}
+
+class ResolveDartUnitTaskTestTV_perform_library extends TestTaskVisitor<bool> {
+  Source source;
+  InternalAnalysisContext context;
+  ResolveDartUnitTaskTestTV_perform_library(this.source, this.context);
+  @override
+  bool visitResolveDartUnitTask(ResolveDartUnitTask task) {
+    CaughtException exception = task.exception;
+    if (exception != null) {
+      throw exception;
+    }
+    expect(task.librarySource, same(source));
+    expect(task.resolvedUnit, isNotNull);
+    expect(task.source, same(source));
+    return true;
+  }
+}
+
+@reflectiveTest
+class ResolveHtmlTaskTest extends EngineTestCase {
+  void test_accept() {
+    ResolveHtmlTask task = new ResolveHtmlTask(null, null, 0, null);
+    expect(task.accept(new ResolveHtmlTaskTestTV_accept()), isTrue);
+  }
+
+  void test_getElement() {
+    ResolveHtmlTask task = new ResolveHtmlTask(null, null, 0, null);
+    expect(task.element, isNull);
+  }
+
+  void test_getException() {
+    ResolveHtmlTask task = new ResolveHtmlTask(null, null, 0, null);
+    expect(task.exception, isNull);
+  }
+
+  void test_getResolutionErrors() {
+    ResolveHtmlTask task = new ResolveHtmlTask(null, null, 0, null);
+    expect(task.resolutionErrors, hasLength(0));
+  }
+
+  void test_getSource() {
+    Source source = new TestSource('test.dart', '');
+    ResolveHtmlTask task = new ResolveHtmlTask(null, source, 0, null);
+    expect(task.source, same(source));
+  }
+
+  void test_perform_exception() {
+    Source source = new TestSource();
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    ResolveHtmlTask task = new ResolveHtmlTask(context, source, 0, null);
+    task.perform(new ResolveHtmlTaskTestTV_perform_exception());
+  }
+
+  void test_perform_valid() {
+    int modificationStamp = 73;
+    String content = r'''
+<html>
+<head>
+  <script type='application/dart'>
+    void f() { x = 0; }
+  </script>
+</head>
+<body>
+</body>
+</html>''';
+    Source source = new TestSource("/test.html", content);
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    ParseHtmlTask parseTask = new ParseHtmlTask(context, source, content);
+    parseTask.perform(new ResolveHtmlTaskTestTV_perform_valid_2());
+    ResolveHtmlTask task = new ResolveHtmlTask(
+        context, source, modificationStamp, parseTask.htmlUnit);
+    task.perform(
+        new ResolveHtmlTaskTestTV_perform_valid(modificationStamp, source));
+  }
+}
+
+class ResolveHtmlTaskTestTV_accept extends TestTaskVisitor<bool> {
+  @override
+  bool visitResolveHtmlTask(ResolveHtmlTask task) => true;
+}
+
+class ResolveHtmlTaskTestTV_perform_exception extends TestTaskVisitor<bool> {
+  @override
+  bool visitResolveHtmlTask(ResolveHtmlTask task) {
+    expect(task.exception, isNotNull);
+    return true;
+  }
+}
+
+class ResolveHtmlTaskTestTV_perform_valid extends TestTaskVisitor<Object> {
+  int modificationStamp;
+  Source source;
+  ResolveHtmlTaskTestTV_perform_valid(this.modificationStamp, this.source);
+  @override
+  Object visitResolveHtmlTask(ResolveHtmlTask task) {
+    CaughtException exception = task.exception;
+    if (exception != null) {
+      throw exception;
+    }
+    expect(task.element, isNotNull);
+    expect(task.resolutionErrors, hasLength(1));
+    expect(task.source, same(source));
+    return null;
+  }
+}
+
+class ResolveHtmlTaskTestTV_perform_valid_2 extends TestTaskVisitor<Object> {
+  @override
+  Object visitParseHtmlTask(ParseHtmlTask task) => null;
+}
+
+@reflectiveTest
+class ScanDartTaskTest extends EngineTestCase {
+  void test_accept() {
+    ScanDartTask task = new ScanDartTask(null, null, null);
+    expect(task.accept(new ScanDartTaskTestTV_accept()), isTrue);
+  }
+
+  void test_getErrors() {
+    ScanDartTask task = new ScanDartTask(null, null, null);
+    expect(task.errors, hasLength(0));
+  }
+
+  void test_getException() {
+    ScanDartTask task = new ScanDartTask(null, null, null);
+    expect(task.exception, isNull);
+  }
+
+  void test_getLineInfo() {
+    ScanDartTask task = new ScanDartTask(null, null, null);
+    expect(task.lineInfo, isNull);
+  }
+
+  void test_getSource() {
+    Source source = new TestSource('test.dart', '');
+    ScanDartTask task = new ScanDartTask(null, source, null);
+    expect(task.source, same(source));
+  }
+
+  void test_perform_valid() {
+    String content = 'class A {}';
+    Source source = new TestSource('test.dart', content);
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    ScanDartTask task = new ScanDartTask(context, source, content);
+    task.perform(new ScanDartTaskTestTV_perform_valid(context, source));
+  }
+}
+
+class ScanDartTaskTestTV_accept extends TestTaskVisitor<bool> {
+  @override
+  bool visitScanDartTask(ScanDartTask task) => true;
+}
+
+class ScanDartTaskTestTV_perform_valid extends TestTaskVisitor<bool> {
+  InternalAnalysisContext context;
+  Source source;
+  ScanDartTaskTestTV_perform_valid(this.context, this.source);
+  @override
+  bool visitScanDartTask(ScanDartTask task) {
+    CaughtException exception = task.exception;
+    if (exception != null) {
+      throw exception;
+    }
+    expect(task.tokenStream, isNotNull);
+    expect(task.errors, hasLength(0));
+    expect(task.lineInfo, isNotNull);
+    expect(task.source, same(source));
+    return true;
+  }
+}
+
+@reflectiveTest
+class SdkCachePartitionTest extends EngineTestCase {
+  void test_contains_false() {
+    SdkCachePartition partition = new SdkCachePartition(null, 8);
+    Source source = new TestSource();
+    expect(partition.contains(source), isFalse);
+  }
+
+  void test_contains_true() {
+    SdkCachePartition partition = new SdkCachePartition(null, 8);
+    SourceFactory factory = new SourceFactory(
+        [new DartUriResolver(DirectoryBasedDartSdk.defaultSdk)]);
+    Source source = factory.forUri("dart:core");
+    expect(partition.contains(source), isTrue);
+  }
+
+  void test_creation() {
+    expect(new SdkCachePartition(null, 8), isNotNull);
+  }
+}
+
+@reflectiveTest
+class SourcesChangedEventTest {
+  void test_added() {
+    var source = new StringSource('', '/test.dart');
+    var changeSet = new ChangeSet();
+    changeSet.addedSource(source);
+    var event = new SourcesChangedEvent(changeSet);
+    assertEvent(event, wereSourcesAdded: true);
+  }
+
+  void test_changedContent() {
+    var source = new StringSource('', '/test.dart');
+    var changeSet = new ChangeSet();
+    changeSet.changedContent(source, 'library A;');
+    var event = new SourcesChangedEvent(changeSet);
+    assertEvent(event, changedSources: [source]);
+  }
+
+  void test_changedContent2() {
+    var source = new StringSource('', '/test.dart');
+    var event = new SourcesChangedEvent.changedContent(source, 'library A;');
+    assertEvent(event, changedSources: [source]);
+  }
+
+  void test_changedRange() {
+    var source = new StringSource('', '/test.dart');
+    var changeSet = new ChangeSet();
+    changeSet.changedRange(source, 'library A;', 0, 0, 13);
+    var event = new SourcesChangedEvent(changeSet);
+    assertEvent(event, changedSources: [source]);
+  }
+
+  void test_changedRange2() {
+    var source = new StringSource('', '/test.dart');
+    var event =
+        new SourcesChangedEvent.changedRange(source, 'library A;', 0, 0, 13);
+    assertEvent(event, changedSources: [source]);
+  }
+
+  void test_changedSources() {
+    var source = new StringSource('', '/test.dart');
+    var changeSet = new ChangeSet();
+    changeSet.changedSource(source);
+    var event = new SourcesChangedEvent(changeSet);
+    assertEvent(event, changedSources: [source]);
+  }
+
+  void test_deleted() {
+    var source = new StringSource('', '/test.dart');
+    var changeSet = new ChangeSet();
+    changeSet.deletedSource(source);
+    var event = new SourcesChangedEvent(changeSet);
+    assertEvent(event, wereSourcesRemovedOrDeleted: true);
+  }
+
+  void test_empty() {
+    var changeSet = new ChangeSet();
+    var event = new SourcesChangedEvent(changeSet);
+    assertEvent(event);
+  }
+
+  void test_removed() {
+    var source = new StringSource('', '/test.dart');
+    var changeSet = new ChangeSet();
+    changeSet.removedSource(source);
+    var event = new SourcesChangedEvent(changeSet);
+    assertEvent(event, wereSourcesRemovedOrDeleted: true);
+  }
+
+  static void assertEvent(SourcesChangedEvent event,
+      {bool wereSourcesAdded: false,
+      List<Source> changedSources: Source.EMPTY_LIST,
+      bool wereSourcesRemovedOrDeleted: false}) {
+    expect(event.wereSourcesAdded, wereSourcesAdded);
+    expect(event.changedSources, changedSources);
+    expect(event.wereSourcesRemovedOrDeleted, wereSourcesRemovedOrDeleted);
+  }
+}
+
+class SourcesChangedListener {
+  List<SourcesChangedEvent> actualEvents = [];
+
+  void assertEvent(
+      {bool wereSourcesAdded: false,
+      List<Source> changedSources: Source.EMPTY_LIST,
+      bool wereSourcesRemovedOrDeleted: false}) {
+    if (actualEvents.isEmpty) {
+      fail('Expected event but found none');
+    }
+    SourcesChangedEvent actual = actualEvents.removeAt(0);
+    SourcesChangedEventTest.assertEvent(actual,
+        wereSourcesAdded: wereSourcesAdded,
+        changedSources: changedSources,
+        wereSourcesRemovedOrDeleted: wereSourcesRemovedOrDeleted);
+  }
+
+  void assertNoMoreEvents() {
+    expect(actualEvents, []);
+  }
+
+  void onData(SourcesChangedEvent event) {
+    actualEvents.add(event);
+  }
+}
+
+/**
+ * Instances of the class `TestAnalysisContext` implement an analysis context in which every
+ * method will cause a test to fail when invoked.
+ */
+class TestAnalysisContext implements InternalAnalysisContext {
+  @override
+  AnalysisCache get analysisCache {
+    fail("Unexpected invocation of analysisCache");
+    return null;
+  }
+
+  @override
+  AnalysisOptions get analysisOptions {
+    fail("Unexpected invocation of getAnalysisOptions");
+    return null;
+  }
+
+  @override
+  void set analysisOptions(AnalysisOptions options) {
+    fail("Unexpected invocation of setAnalysisOptions");
+  }
+
+  @override
+  void set analysisPriorityOrder(List<Source> sources) {
+    fail("Unexpected invocation of setAnalysisPriorityOrder");
+  }
+
+  @override
+  set contentCache(ContentCache value) {
+    fail("Unexpected invocation of setContentCache");
+  }
+
+  @override
+  DeclaredVariables get declaredVariables {
+    fail("Unexpected invocation of getDeclaredVariables");
+    return null;
+  }
+
+  @override
+  List<AnalysisTarget> get explicitTargets {
+    fail("Unexpected invocation of visitCacheItems");
+    return null;
+  }
+
+  @override
+  List<Source> get htmlSources {
+    fail("Unexpected invocation of getHtmlSources");
+    return null;
+  }
+
+  @override
+  Stream<ImplicitAnalysisEvent> get implicitAnalysisEvents {
+    fail("Unexpected invocation of analyzedSources");
+    return null;
+  }
+
+  @override
+  bool get isDisposed {
+    fail("Unexpected invocation of isDisposed");
+    return false;
+  }
+
+  @override
+  List<Source> get launchableClientLibrarySources {
+    fail("Unexpected invocation of getLaunchableClientLibrarySources");
+    return null;
+  }
+
+  @override
+  List<Source> get launchableServerLibrarySources {
+    fail("Unexpected invocation of getLaunchableServerLibrarySources");
+    return null;
+  }
+
+  @override
+  LibraryResolverFactory get libraryResolverFactory {
+    fail("Unexpected invocation of getLibraryResolverFactory");
+    return null;
+  }
+
+  @override
+  List<Source> get librarySources {
+    fail("Unexpected invocation of getLibrarySources");
+    return null;
+  }
+
+  @override
+  String get name {
+    fail("Unexpected invocation of name");
+    return null;
+  }
+
+  @override
+  set name(String value) {
+    fail("Unexpected invocation of name");
+  }
+
+  @override
+  Stream<SourcesChangedEvent> get onSourcesChanged {
+    fail("Unexpected invocation of onSourcesChanged");
+    return null;
+  }
+
+  @override
+  List<Source> get prioritySources {
+    fail("Unexpected invocation of getPrioritySources");
+    return null;
+  }
+
+  @override
+  List<AnalysisTarget> get priorityTargets {
+    fail("Unexpected invocation of visitCacheItems");
+    return null;
+  }
+
+  @override
+  CachePartition get privateAnalysisCachePartition {
+    fail("Unexpected invocation of privateAnalysisCachePartition");
+    return null;
+  }
+
+  @override
+  ResolverVisitorFactory get resolverVisitorFactory {
+    fail("Unexpected invocation of getResolverVisitorFactory");
+    return null;
+  }
+
+  @override
+  SourceFactory get sourceFactory {
+    fail("Unexpected invocation of getSourceFactory");
+    return null;
+  }
+
+  @override
+  void set sourceFactory(SourceFactory factory) {
+    fail("Unexpected invocation of setSourceFactory");
+  }
+
+  @override
+  List<Source> get sources {
+    fail("Unexpected invocation of sources");
+    return null;
+  }
+
+  @override
+  AnalysisContextStatistics get statistics {
+    fail("Unexpected invocation of getStatistics");
+    return null;
+  }
+
+  @override
+  TypeProvider get typeProvider {
+    fail("Unexpected invocation of getTypeProvider");
+    return null;
+  }
+
+  @override
+  void set typeProvider(TypeProvider typeProvider) {
+    fail("Unexpected invocation of set typeProvider");
+  }
+
+  @override
+  TypeResolverVisitorFactory get typeResolverVisitorFactory {
+    fail("Unexpected invocation of getTypeResolverVisitorFactory");
+    return null;
+  }
+
+  @override
+  void addListener(AnalysisListener listener) {
+    fail("Unexpected invocation of addListener");
+  }
+
+  @override
+  void applyAnalysisDelta(AnalysisDelta delta) {
+    fail("Unexpected invocation of applyAnalysisDelta");
+  }
+
+  @override
+  void applyChanges(ChangeSet changeSet) {
+    fail("Unexpected invocation of applyChanges");
+  }
+
+  @override
+  String computeDocumentationComment(Element element) {
+    fail("Unexpected invocation of computeDocumentationComment");
+    return null;
+  }
+
+  @override
+  List<AnalysisError> computeErrors(Source source) {
+    fail("Unexpected invocation of computeErrors");
+    return null;
+  }
+
+  @override
+  List<Source> computeExportedLibraries(Source source) {
+    fail("Unexpected invocation of computeExportedLibraries");
+    return null;
+  }
+
+  @override
+  @deprecated
+  HtmlElement computeHtmlElement(Source source) {
+    fail("Unexpected invocation of computeHtmlElement");
+    return null;
+  }
+
+  @override
+  List<Source> computeImportedLibraries(Source source) {
+    fail("Unexpected invocation of computeImportedLibraries");
+    return null;
+  }
+
+  @override
+  SourceKind computeKindOf(Source source) {
+    fail("Unexpected invocation of computeKindOf");
+    return null;
+  }
+
+  @override
+  LibraryElement computeLibraryElement(Source source) {
+    fail("Unexpected invocation of computeLibraryElement");
+    return null;
+  }
+
+  @override
+  LineInfo computeLineInfo(Source source) {
+    fail("Unexpected invocation of computeLineInfo");
+    return null;
+  }
+
+  @override
+  CompilationUnit computeResolvableCompilationUnit(Source source) {
+    fail("Unexpected invocation of computeResolvableCompilationUnit");
+    return null;
+  }
+
+  @override
+  Future<CompilationUnit> computeResolvedCompilationUnitAsync(
+      Source source, Source librarySource) {
+    fail("Unexpected invocation of getResolvedCompilationUnitFuture");
+    return null;
+  }
+
+  @override
+  Object computeResult(AnalysisTarget target, ResultDescriptor result) {
+    fail("Unexpected invocation of computeResult");
+    return null;
+  }
+
+  @override
+  void dispose() {
+    fail("Unexpected invocation of dispose");
+  }
+
+  @override
+  List<CompilationUnit> ensureResolvedDartUnits(Source source) {
+    fail("Unexpected invocation of ensureResolvedDartUnits");
+    return null;
+  }
+
+  @override
+  bool exists(Source source) {
+    fail("Unexpected invocation of exists");
+    return false;
+  }
+
+  @override
+  CacheEntry getCacheEntry(AnalysisTarget target) {
+    fail("Unexpected invocation of visitCacheItems");
+    return null;
+  }
+
+  @override
+  CompilationUnitElement getCompilationUnitElement(
+      Source unitSource, Source librarySource) {
+    fail("Unexpected invocation of getCompilationUnitElement");
+    return null;
+  }
+
+  @override
+  TimestampedData<String> getContents(Source source) {
+    fail("Unexpected invocation of getContents");
+    return null;
+  }
+
+  @override
+  InternalAnalysisContext getContextFor(Source source) {
+    fail("Unexpected invocation of getContextFor");
+    return null;
+  }
+
+  @override
+  Element getElement(ElementLocation location) {
+    fail("Unexpected invocation of getElement");
+    return null;
+  }
+
+  @override
+  AnalysisErrorInfo getErrors(Source source) {
+    fail("Unexpected invocation of getErrors");
+    return null;
+  }
+
+  @override
+  @deprecated
+  HtmlElement getHtmlElement(Source source) {
+    fail("Unexpected invocation of getHtmlElement");
+    return null;
+  }
+
+  @override
+  List<Source> getHtmlFilesReferencing(Source source) {
+    fail("Unexpected invocation of getHtmlFilesReferencing");
+    return null;
+  }
+
+  @override
+  SourceKind getKindOf(Source source) {
+    fail("Unexpected invocation of getKindOf");
+    return null;
+  }
+
+  @override
+  List<Source> getLibrariesContaining(Source source) {
+    fail("Unexpected invocation of getLibrariesContaining");
+    return null;
+  }
+
+  @override
+  List<Source> getLibrariesDependingOn(Source librarySource) {
+    fail("Unexpected invocation of getLibrariesDependingOn");
+    return null;
+  }
+
+  @override
+  List<Source> getLibrariesReferencedFromHtml(Source htmlSource) {
+    fail("Unexpected invocation of getLibrariesReferencedFromHtml");
+    return null;
+  }
+
+  @override
+  LibraryElement getLibraryElement(Source source) {
+    fail("Unexpected invocation of getLibraryElement");
+    return null;
+  }
+
+  @override
+  LineInfo getLineInfo(Source source) {
+    fail("Unexpected invocation of getLineInfo");
+    return null;
+  }
+
+  @override
+  int getModificationStamp(Source source) {
+    fail("Unexpected invocation of getModificationStamp");
+    return 0;
+  }
+
+  @override
+  ChangeNoticeImpl getNotice(Source source) {
+    fail("Unexpected invocation of getNotice");
+    return null;
+  }
+
+  @override
+  Namespace getPublicNamespace(LibraryElement library) {
+    fail("Unexpected invocation of getPublicNamespace");
+    return null;
+  }
+
+  @override
+  CompilationUnit getResolvedCompilationUnit(
+      Source unitSource, LibraryElement library) {
+    fail("Unexpected invocation of getResolvedCompilationUnit");
+    return null;
+  }
+
+  @override
+  CompilationUnit getResolvedCompilationUnit2(
+      Source unitSource, Source librarySource) {
+    fail("Unexpected invocation of getResolvedCompilationUnit");
+    return null;
+  }
+
+  @override
+  @deprecated
+  ht.HtmlUnit getResolvedHtmlUnit(Source htmlSource) {
+    fail("Unexpected invocation of getResolvedHtmlUnit");
+    return null;
+  }
+
+  @override
+  Object getResult(AnalysisTarget target, ResultDescriptor result) {
+    fail("Unexpected invocation of getResult");
+    return null;
+  }
+
+  @override
+  List<Source> getSourcesWithFullName(String path) {
+    fail("Unexpected invocation of getSourcesWithFullName");
+    return null;
+  }
+
+  @override
+  bool handleContentsChanged(
+      Source source, String originalContents, String newContents, bool notify) {
+    fail("Unexpected invocation of handleContentsChanged");
+    return false;
+  }
+
+  @override
+  void invalidateLibraryHints(Source librarySource) {
+    fail("Unexpected invocation of invalidateLibraryHints");
+  }
+
+  @override
+  bool isClientLibrary(Source librarySource) {
+    fail("Unexpected invocation of isClientLibrary");
+    return false;
+  }
+
+  @override
+  bool isServerLibrary(Source librarySource) {
+    fail("Unexpected invocation of isServerLibrary");
+    return false;
+  }
+
+  @override
+  Stream<ComputedResult> onResultComputed(ResultDescriptor descriptor) {
+    fail("Unexpected invocation of onResultComputed");
+    return null;
+  }
+
+  @override
+  CompilationUnit parseCompilationUnit(Source source) {
+    fail("Unexpected invocation of parseCompilationUnit");
+    return null;
+  }
+
+  @override
+  Document parseHtmlDocument(Source source) {
+    fail("Unexpected invocation of parseHtmlDocument");
+    return null;
+  }
+
+  @override
+  ht.HtmlUnit parseHtmlUnit(Source source) {
+    fail("Unexpected invocation of parseHtmlUnit");
+    return null;
+  }
+
+  @override
+  AnalysisResult performAnalysisTask() {
+    fail("Unexpected invocation of performAnalysisTask");
+    return null;
+  }
+
+  @override
+  void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
+    fail("Unexpected invocation of recordLibraryElements");
+  }
+
+  @override
+  void removeListener(AnalysisListener listener) {
+    fail("Unexpected invocation of removeListener");
+  }
+
+  @override
+  CompilationUnit resolveCompilationUnit(
+      Source unitSource, LibraryElement library) {
+    fail("Unexpected invocation of resolveCompilationUnit");
+    return null;
+  }
+
+  @override
+  CompilationUnit resolveCompilationUnit2(
+      Source unitSource, Source librarySource) {
+    fail("Unexpected invocation of resolveCompilationUnit");
+    return null;
+  }
+
+  @override
+  @deprecated
+  ht.HtmlUnit resolveHtmlUnit(Source htmlSource) {
+    fail("Unexpected invocation of resolveHtmlUnit");
+    return null;
+  }
+
+  @override
+  void setChangedContents(Source source, String contents, int offset,
+      int oldLength, int newLength) {
+    fail("Unexpected invocation of setChangedContents");
+  }
+
+  @override
+  void setContents(Source source, String contents) {
+    fail("Unexpected invocation of setContents");
+  }
+
+  @override
+  bool shouldErrorsBeAnalyzed(Source source, Object entry) {
+    fail("Unexpected invocation of shouldErrorsBeAnalyzed");
+    return false;
+  }
+
+  @override
+  void test_flushAstStructures(Source source) {
+    fail("Unexpected invocation of test_flushAstStructures");
+  }
+
+  @override
+  bool validateCacheConsistency() {
+    fail("Unexpected invocation of validateCacheConsistency");
+    return false;
+  }
+
+  @deprecated
+  @override
+  void visitCacheItems(void callback(Source source, SourceEntry dartEntry,
+      DataDescriptor rowDesc, CacheState state)) {
+    fail("Unexpected invocation of visitCacheItems");
+  }
+
+  @override
+  void visitContentCache(ContentCacheVisitor visitor) {
+    fail("Unexpected invocation of visitContentCache");
+  }
+}
+
+class TestAnalysisContext_test_applyChanges extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_applyChanges();
+  @override
+  void applyChanges(ChangeSet changeSet) {
+    invoked = true;
+  }
+}
+
+class TestAnalysisContext_test_computeDocumentationComment
+    extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_computeDocumentationComment();
+  @override
+  String computeDocumentationComment(Element element) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_computeErrors extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_computeErrors();
+  @override
+  List<AnalysisError> computeErrors(Source source) {
+    invoked = true;
+    return AnalysisError.NO_ERRORS;
+  }
+}
+
+class TestAnalysisContext_test_computeExportedLibraries
+    extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_computeExportedLibraries();
+  @override
+  List<Source> computeExportedLibraries(Source source) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_computeHtmlElement extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_computeHtmlElement();
+  @override
+  @deprecated
+  HtmlElement computeHtmlElement(Source source) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_computeImportedLibraries
+    extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_computeImportedLibraries();
+  @override
+  List<Source> computeImportedLibraries(Source source) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_computeKindOf extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_computeKindOf();
+  @override
+  SourceKind computeKindOf(Source source) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_computeLibraryElement
+    extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_computeLibraryElement();
+  @override
+  LibraryElement computeLibraryElement(Source source) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_computeLineInfo extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_computeLineInfo();
+  @override
+  LineInfo computeLineInfo(Source source) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_computeResolvableCompilationUnit
+    extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_computeResolvableCompilationUnit();
+  @override
+  CompilationUnit computeResolvableCompilationUnit(Source source) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_dispose extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_dispose();
+  @override
+  void dispose() {
+    invoked = true;
+  }
+}
+
+class TestAnalysisContext_test_exists extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_exists();
+  @override
+  bool exists(Source source) {
+    invoked = true;
+    return false;
+  }
+}
+
+class TestAnalysisContext_test_getAnalysisOptions extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getAnalysisOptions();
+  @override
+  AnalysisOptions get analysisOptions {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_getCompilationUnitElement
+    extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getCompilationUnitElement();
+  @override
+  CompilationUnitElement getCompilationUnitElement(
+      Source unitSource, Source librarySource) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_getContents extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getContents();
+  @override
+  TimestampedData<String> getContents(Source source) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_getElement extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getElement();
+  @override
+  Element getElement(ElementLocation location) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_getErrors extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getErrors();
+  @override
+  AnalysisErrorInfo getErrors(Source source) {
+    invoked = true;
+    return new AnalysisErrorInfoImpl(AnalysisError.NO_ERRORS, null);
+  }
+}
+
+class TestAnalysisContext_test_getHtmlElement extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getHtmlElement();
+  @override
+  @deprecated
+  HtmlElement getHtmlElement(Source source) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_getHtmlFilesReferencing
+    extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getHtmlFilesReferencing();
+  @override
+  List<Source> getHtmlFilesReferencing(Source source) {
+    invoked = true;
+    return Source.EMPTY_LIST;
+  }
+}
+
+class TestAnalysisContext_test_getHtmlSources extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getHtmlSources();
+  @override
+  List<Source> get htmlSources {
+    invoked = true;
+    return Source.EMPTY_LIST;
+  }
+}
+
+class TestAnalysisContext_test_getKindOf extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getKindOf();
+  @override
+  SourceKind getKindOf(Source source) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_getLaunchableClientLibrarySources
+    extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getLaunchableClientLibrarySources();
+  @override
+  List<Source> get launchableClientLibrarySources {
+    invoked = true;
+    return Source.EMPTY_LIST;
+  }
+}
+
+class TestAnalysisContext_test_getLaunchableServerLibrarySources
+    extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getLaunchableServerLibrarySources();
+  @override
+  List<Source> get launchableServerLibrarySources {
+    invoked = true;
+    return Source.EMPTY_LIST;
+  }
+}
+
+class TestAnalysisContext_test_getLibrariesContaining
+    extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getLibrariesContaining();
+  @override
+  List<Source> getLibrariesContaining(Source source) {
+    invoked = true;
+    return Source.EMPTY_LIST;
+  }
+}
+
+class TestAnalysisContext_test_getLibrariesDependingOn
+    extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getLibrariesDependingOn();
+  @override
+  List<Source> getLibrariesDependingOn(Source librarySource) {
+    invoked = true;
+    return Source.EMPTY_LIST;
+  }
+}
+
+class TestAnalysisContext_test_getLibrariesReferencedFromHtml
+    extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getLibrariesReferencedFromHtml();
+  @override
+  List<Source> getLibrariesReferencedFromHtml(Source htmlSource) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_getLibraryElement extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getLibraryElement();
+  @override
+  LibraryElement getLibraryElement(Source source) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_getLibrarySources extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getLibrarySources();
+  @override
+  List<Source> get librarySources {
+    invoked = true;
+    return Source.EMPTY_LIST;
+  }
+}
+
+class TestAnalysisContext_test_getLineInfo extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getLineInfo();
+  @override
+  LineInfo getLineInfo(Source source) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_getModificationStamp
+    extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getModificationStamp();
+  @override
+  int getModificationStamp(Source source) {
+    invoked = true;
+    return 0;
+  }
+}
+
+class TestAnalysisContext_test_getPublicNamespace extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getPublicNamespace();
+  @override
+  Namespace getPublicNamespace(LibraryElement library) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_getResolvedCompilationUnit_element
+    extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getResolvedCompilationUnit_element();
+  @override
+  CompilationUnit getResolvedCompilationUnit(
+      Source unitSource, LibraryElement library) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_getResolvedCompilationUnit_source
+    extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getResolvedCompilationUnit_source();
+  @override
+  CompilationUnit getResolvedCompilationUnit2(
+      Source unitSource, Source librarySource) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_getResolvedHtmlUnit extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getResolvedHtmlUnit();
+  @override
+  @deprecated
+  ht.HtmlUnit getResolvedHtmlUnit(Source htmlSource) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_getSourceFactory extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getSourceFactory();
+  @override
+  SourceFactory get sourceFactory {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_getStatistics extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getStatistics();
+  @override
+  AnalysisContextStatistics get statistics {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_getTypeProvider extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_getTypeProvider();
+  @override
+  TypeProvider get typeProvider {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_isClientLibrary extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_isClientLibrary();
+  @override
+  bool isClientLibrary(Source librarySource) {
+    invoked = true;
+    return false;
+  }
+}
+
+class TestAnalysisContext_test_isDisposed extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_isDisposed();
+  @override
+  bool get isDisposed {
+    invoked = true;
+    return false;
+  }
+}
+
+class TestAnalysisContext_test_isServerLibrary extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_isServerLibrary();
+  @override
+  bool isServerLibrary(Source librarySource) {
+    invoked = true;
+    return false;
+  }
+}
+
+class TestAnalysisContext_test_parseCompilationUnit
+    extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_parseCompilationUnit();
+  @override
+  CompilationUnit parseCompilationUnit(Source source) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_parseHtmlUnit extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_parseHtmlUnit();
+  @override
+  ht.HtmlUnit parseHtmlUnit(Source source) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_performAnalysisTask extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_performAnalysisTask();
+  @override
+  AnalysisResult performAnalysisTask() {
+    invoked = true;
+    return new AnalysisResult(new List<ChangeNotice>(0), 0, null, 0);
+  }
+}
+
+class TestAnalysisContext_test_recordLibraryElements
+    extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_recordLibraryElements();
+  @override
+  void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
+    invoked = true;
+  }
+}
+
+class TestAnalysisContext_test_resolveCompilationUnit
+    extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_resolveCompilationUnit();
+  @override
+  CompilationUnit resolveCompilationUnit2(
+      Source unitSource, Source librarySource) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_resolveCompilationUnit_element
+    extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_resolveCompilationUnit_element();
+  @override
+  CompilationUnit resolveCompilationUnit(
+      Source unitSource, LibraryElement library) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_resolveHtmlUnit extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_resolveHtmlUnit();
+  @override
+  @deprecated
+  ht.HtmlUnit resolveHtmlUnit(Source htmlSource) {
+    invoked = true;
+    return null;
+  }
+}
+
+class TestAnalysisContext_test_setAnalysisOptions extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_setAnalysisOptions();
+  @override
+  void set analysisOptions(AnalysisOptions options) {
+    invoked = true;
+  }
+}
+
+class TestAnalysisContext_test_setAnalysisPriorityOrder
+    extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_setAnalysisPriorityOrder();
+  @override
+  void set analysisPriorityOrder(List<Source> sources) {
+    invoked = true;
+  }
+}
+
+class TestAnalysisContext_test_setChangedContents extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_setChangedContents();
+  @override
+  void setChangedContents(Source source, String contents, int offset,
+      int oldLength, int newLength) {
+    invoked = true;
+  }
+}
+
+class TestAnalysisContext_test_setContents extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_setContents();
+  @override
+  void setContents(Source source, String contents) {
+    invoked = true;
+  }
+}
+
+class TestAnalysisContext_test_setSourceFactory extends TestAnalysisContext {
+  bool invoked = false;
+  TestAnalysisContext_test_setSourceFactory();
+  @override
+  void set sourceFactory(SourceFactory factory) {
+    invoked = true;
+  }
+}
+
+/**
+ * Instances of the class `TestTaskVisitor` implement a task visitor that fails if any of its
+ * methods are invoked. Subclasses typically override the expected methods to not cause a test
+ * failure.
+ */
+class TestTaskVisitor<E> implements AnalysisTaskVisitor<E> {
+  @override
+  E visitGenerateDartErrorsTask(GenerateDartErrorsTask task) {
+    fail("Unexpectedly invoked visitGenerateDartErrorsTask");
+    return null;
+  }
+
+  @override
+  E visitGenerateDartHintsTask(GenerateDartHintsTask task) {
+    fail("Unexpectedly invoked visitGenerateDartHintsTask");
+    return null;
+  }
+
+  @override
+  E visitGenerateDartLintsTask(GenerateDartLintsTask task) {
+    fail("Unexpectedly invoked visitGenerateDartLintsTask");
+    return null;
+  }
+
+  @override
+  E visitGetContentTask(GetContentTask task) {
+    fail("Unexpectedly invoked visitGetContentsTask");
+    return null;
+  }
+
+  @override
+  E visitIncrementalAnalysisTask(
+      IncrementalAnalysisTask incrementalAnalysisTask) {
+    fail("Unexpectedly invoked visitIncrementalAnalysisTask");
+    return null;
+  }
+
+  @override
+  E visitParseDartTask(ParseDartTask task) {
+    fail("Unexpectedly invoked visitParseDartTask");
+    return null;
+  }
+
+  @override
+  E visitParseHtmlTask(ParseHtmlTask task) {
+    fail("Unexpectedly invoked visitParseHtmlTask");
+    return null;
+  }
+
+  @override
+  E visitResolveDartLibraryCycleTask(ResolveDartLibraryCycleTask task) {
+    fail("Unexpectedly invoked visitResolveDartLibraryCycleTask");
+    return null;
+  }
+
+  @override
+  E visitResolveDartLibraryTask(ResolveDartLibraryTask task) {
+    fail("Unexpectedly invoked visitResolveDartLibraryTask");
+    return null;
+  }
+
+  @override
+  E visitResolveDartUnitTask(ResolveDartUnitTask task) {
+    fail("Unexpectedly invoked visitResolveDartUnitTask");
+    return null;
+  }
+
+  @override
+  E visitResolveHtmlTask(ResolveHtmlTask task) {
+    fail("Unexpectedly invoked visitResolveHtmlTask");
+    return null;
+  }
+
+  @override
+  E visitScanDartTask(ScanDartTask task) {
+    fail("Unexpectedly invoked visitScanDartTask");
+    return null;
+  }
+}
+
+@reflectiveTest
+class UniversalCachePartitionTest extends EngineTestCase {
+  void test_contains() {
+    UniversalCachePartition partition =
+        new UniversalCachePartition(null, 8, null);
+    TestSource source = new TestSource();
+    expect(partition.contains(source), isTrue);
+  }
+
+  void test_creation() {
+    expect(new UniversalCachePartition(null, 8, null), isNotNull);
+  }
+
+  void test_entrySet() {
+    UniversalCachePartition partition =
+        new UniversalCachePartition(null, 8, null);
+    TestSource source = new TestSource();
+    DartEntry entry = new DartEntry();
+    partition.put(source, entry);
+    Map<Source, SourceEntry> entryMap = partition.map;
+    expect(entryMap.length, 1);
+    Source entryKey = entryMap.keys.first;
+    expect(entryKey, same(source));
+    expect(entryMap[entryKey], same(entry));
+  }
+
+  void test_get() {
+    UniversalCachePartition partition =
+        new UniversalCachePartition(null, 8, null);
+    TestSource source = new TestSource();
+    expect(partition.get(source), isNull);
+  }
+
+  void test_put_noFlush() {
+    UniversalCachePartition partition =
+        new UniversalCachePartition(null, 8, null);
+    TestSource source = new TestSource();
+    DartEntry entry = new DartEntry();
+    partition.put(source, entry);
+    expect(partition.get(source), same(entry));
+  }
+
+  void test_remove() {
+    UniversalCachePartition partition =
+        new UniversalCachePartition(null, 8, null);
+    TestSource source = new TestSource();
+    DartEntry entry = new DartEntry();
+    partition.put(source, entry);
+    expect(partition.get(source), same(entry));
+    partition.remove(source);
+    expect(partition.get(source), isNull);
+  }
+
+  void test_setMaxCacheSize() {
+    UniversalCachePartition partition = new UniversalCachePartition(
+        null, 8, new _UniversalCachePartitionTest_test_setMaxCacheSize());
+    int size = 6;
+    for (int i = 0; i < size; i++) {
+      Source source = new TestSource("/test$i.dart");
+      DartEntry entry = new DartEntry();
+      entry.setValue(DartEntry.PARSED_UNIT, null);
+      partition.put(source, entry);
+      partition.accessedAst(source);
+    }
+    _assertNonFlushedCount(size, partition);
+    int newSize = size - 2;
+    partition.maxCacheSize = newSize;
+    _assertNonFlushedCount(newSize, partition);
+  }
+
+  void test_size() {
+    UniversalCachePartition partition =
+        new UniversalCachePartition(null, 8, null);
+    int size = 4;
+    for (int i = 0; i < size; i++) {
+      Source source = new TestSource("/test$i.dart");
+      partition.put(source, new DartEntry());
+      partition.accessedAst(source);
+    }
+    expect(partition.size(), size);
+  }
+
+  void _assertNonFlushedCount(
+      int expectedCount, UniversalCachePartition partition) {
+    int nonFlushedCount = 0;
+    Map<Source, SourceEntry> entryMap = partition.map;
+    entryMap.values.forEach((SourceEntry value) {
+      if (value.getState(DartEntry.PARSED_UNIT) != CacheState.FLUSHED) {
+        nonFlushedCount++;
+      }
+    });
+    expect(nonFlushedCount, expectedCount);
+  }
+}
+
+@reflectiveTest
+class WorkManagerTest extends EngineTestCase {
+  void test_addFirst() {
+    TestSource source1 = new TestSource("/f1.dart");
+    TestSource source2 = new TestSource("/f2.dart");
+    WorkManager manager = new WorkManager();
+    manager.add(source1, SourcePriority.UNKNOWN);
+    manager.addFirst(source2, SourcePriority.UNKNOWN);
+    WorkManager_WorkIterator iterator = manager.iterator();
+    expect(iterator.next(), same(source2));
+    expect(iterator.next(), same(source1));
+  }
+
+  void test_creation() {
+    expect(new WorkManager(), isNotNull);
+  }
+
+  void test_iterator_empty() {
+    WorkManager manager = new WorkManager();
+    WorkManager_WorkIterator iterator = manager.iterator();
+    expect(iterator.hasNext, isFalse);
+    try {
+      iterator.next();
+      fail("Expected NoSuchElementException");
+    } on NoSuchElementException {}
+  }
+
+  void test_iterator_nonEmpty() {
+    TestSource source = new TestSource();
+    WorkManager manager = new WorkManager();
+    manager.add(source, SourcePriority.UNKNOWN);
+    WorkManager_WorkIterator iterator = manager.iterator();
+    expect(iterator.hasNext, isTrue);
+    expect(iterator.next(), same(source));
+  }
+
+  void test_remove() {
+    TestSource source1 = new TestSource("/f1.dart");
+    TestSource source2 = new TestSource("/f2.dart");
+    TestSource source3 = new TestSource("/f3.dart");
+    WorkManager manager = new WorkManager();
+    manager.add(source1, SourcePriority.UNKNOWN);
+    manager.add(source2, SourcePriority.UNKNOWN);
+    manager.add(source3, SourcePriority.UNKNOWN);
+    manager.remove(source2);
+    WorkManager_WorkIterator iterator = manager.iterator();
+    expect(iterator.next(), same(source1));
+    expect(iterator.next(), same(source3));
+  }
+
+  void test_toString_empty() {
+    WorkManager manager = new WorkManager();
+    expect(manager.toString(), isNotNull);
+  }
+
+  void test_toString_nonEmpty() {
+    WorkManager manager = new WorkManager();
+    manager.add(new TestSource(), SourcePriority.HTML);
+    manager.add(new TestSource(), SourcePriority.LIBRARY);
+    manager.add(new TestSource(), SourcePriority.NORMAL_PART);
+    manager.add(new TestSource(), SourcePriority.PRIORITY_PART);
+    manager.add(new TestSource(), SourcePriority.UNKNOWN);
+    expect(manager.toString(), isNotNull);
+  }
+}
+
+class _AnalysisCacheTest_test_setMaxCacheSize implements CacheRetentionPolicy {
+  @override
+  RetentionPriority getAstPriority(Source source, SourceEntry sourceEntry) =>
+      RetentionPriority.LOW;
+}
+
+class _AnalysisContext_sourceChangeDuringResolution
+    extends AnalysisContextForTests {
+  @override
+  DartEntry recordResolveDartLibraryTaskResults(ResolveDartLibraryTask task) {
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.changedSource(task.librarySource);
+    applyChanges(changeSet);
+    return super.recordResolveDartLibraryTaskResults(task);
+  }
+}
+
+class _AnalysisContextImplTest_test_applyChanges_removeContainer
+    implements SourceContainer {
+  Source libB;
+  _AnalysisContextImplTest_test_applyChanges_removeContainer(this.libB);
+  @override
+  bool contains(Source source) => source == libB;
+}
+
+class _Source_getContent_throwException extends NonExistingSource {
+  _Source_getContent_throwException(String name)
+      : super(name, pathos.toUri(name), UriKind.FILE_URI);
+
+  @override
+  TimestampedData<String> get contents {
+    throw 'Read error';
+  }
+
+  @override
+  bool exists() => true;
+}
+
+class _UniversalCachePartitionTest_test_setMaxCacheSize
+    implements CacheRetentionPolicy {
+  @override
+  RetentionPriority getAstPriority(Source source, SourceEntry sourceEntry) =>
+      RetentionPriority.LOW;
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/incremental_resolver_test.dart b/mojo/public/dart/third_party/analyzer/test/generated/incremental_resolver_test.dart
new file mode 100644
index 0000000..a08ede7
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/generated/incremental_resolver_test.dart
@@ -0,0 +1,4699 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.incremental_resolver_test;
+
+import 'package:analyzer/src/context/cache.dart' as task;
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/incremental_logger.dart' as log;
+import 'package:analyzer/src/generated/incremental_resolution_validator.dart';
+import 'package:analyzer/src/generated/incremental_resolver.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/parser.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/testing/ast_factory.dart';
+import 'package:analyzer/src/generated/testing/element_factory.dart';
+import 'package:analyzer/task/dart.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+import 'parser_test.dart';
+import 'resolver_test.dart';
+import 'test_support.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(DeclarationMatcherTest);
+  runReflectiveTests(IncrementalResolverTest);
+  runReflectiveTests(PoorMansIncrementalResolutionTest);
+  runReflectiveTests(ResolutionContextBuilderTest);
+}
+
+void initializeTestEnvironment() {}
+
+void _assertEqualError(AnalysisError incrError, AnalysisError fullError) {
+  expect(incrError.errorCode, same(fullError.errorCode));
+  expect(incrError.source, fullError.source);
+  expect(incrError.offset, fullError.offset);
+  expect(incrError.length, fullError.length);
+  expect(incrError.message, fullError.message);
+}
+
+void _assertEqualErrors(
+    List<AnalysisError> incrErrors, List<AnalysisError> fullErrors) {
+  expect(incrErrors, hasLength(fullErrors.length));
+  if (incrErrors.isNotEmpty) {
+    incrErrors.sort((a, b) => a.offset - b.offset);
+  }
+  if (fullErrors.isNotEmpty) {
+    fullErrors.sort((a, b) => a.offset - b.offset);
+  }
+  int length = incrErrors.length;
+  for (int i = 0; i < length; i++) {
+    AnalysisError incrError = incrErrors[i];
+    AnalysisError fullError = fullErrors[i];
+    _assertEqualError(incrError, fullError);
+  }
+}
+
+@reflectiveTest
+class DeclarationMatcherTest extends ResolverTestCase {
+  void setUp() {
+    super.setUp();
+    test_resolveApiChanges = true;
+  }
+
+  void test_false_class_annotation_accessor_edit() {
+    _assertDoesNotMatch(
+        r'''
+const my_annotationA = const Object();
+const my_annotationB = const Object();
+@my_annotationA
+class A {
+}
+''',
+        r'''
+const my_annotationA = const Object();
+const my_annotationB = const Object();
+@my_annotationB
+class A {
+}
+''');
+  }
+
+  void test_false_class_annotation_constructor_edit() {
+    _assertDoesNotMatch(
+        r'''
+class MyAnnotationA {
+  const MyAnnotationA();
+}
+class MyAnnotationB {
+  const MyAnnotationB();
+}
+@MyAnnotationA()
+class A {
+}
+''',
+        r'''
+class MyAnnotationA {
+  const MyAnnotationA();
+}
+class MyAnnotationB {
+  const MyAnnotationB();
+}
+@MyAnnotationB()
+class A {
+}
+''');
+  }
+
+  void test_false_class_annotations_add() {
+    _assertDoesNotMatch(
+        r'''
+const my_annotation = const Object();
+class A {
+}
+''',
+        r'''
+const my_annotation = const Object();
+@my_annotation
+class A {
+}
+''');
+  }
+
+  void test_false_class_annotations_remove() {
+    _assertDoesNotMatch(
+        r'''
+const my_annotation = const Object();
+@my_annotation
+class A {
+}
+''',
+        r'''
+const my_annotation = const Object();
+class A {
+}
+''');
+  }
+
+  void test_false_class_list_add() {
+    _assertDoesNotMatch(
+        r'''
+class A {}
+class B {}
+''',
+        r'''
+class A {}
+class B {}
+class C {}
+''');
+  }
+
+  void test_false_class_list_remove() {
+    _assertDoesNotMatch(
+        r'''
+class A {}
+class B {}
+class C {}
+''',
+        r'''
+class A {}
+class B {}
+''');
+  }
+
+  void test_false_class_typeParameters_bounds_add() {
+    _assertDoesNotMatch(
+        r'''
+class A {}
+class B<T> {
+  T f;
+}
+''',
+        r'''
+class A {}
+class B<T extends A> {
+  T f;
+}
+''');
+  }
+
+  void test_false_class_typeParameters_bounds_remove() {
+    _assertDoesNotMatch(
+        r'''
+class A {}
+class B<T extends A> {
+  T f;
+}
+''',
+        r'''
+class A {}
+class B<T> {
+  T f;
+}
+''');
+  }
+
+  void test_false_classMemberAccessor_list_add() {
+    _assertDoesNotMatchOK(
+        r'''
+class A {
+  get a => 1;
+  get b => 2;
+}
+''',
+        r'''
+class A {
+  get a => 1;
+  get b => 2;
+  get c => 3;
+}
+''');
+  }
+
+  void test_false_classMemberAccessor_list_remove() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+  get a => 1;
+  get b => 2;
+  get c => 3;
+}
+''',
+        r'''
+class A {
+  get a => 1;
+  get b => 2;
+}
+''');
+  }
+
+  void test_false_classMemberAccessor_wasGetter() {
+    _assertDoesNotMatchOK(
+        r'''
+class A {
+  get a => 1;
+}
+''',
+        r'''
+class A {
+  set a(x) {}
+}
+''');
+  }
+
+  void test_false_classMemberAccessor_wasInstance() {
+    _assertDoesNotMatchOK(
+        r'''
+class A {
+  get a => 1;
+}
+''',
+        r'''
+class A {
+  static get a => 1;
+}
+''');
+  }
+
+  void test_false_classMemberAccessor_wasSetter() {
+    _assertDoesNotMatchOK(
+        r'''
+class A {
+  set a(x) {}
+}
+''',
+        r'''
+class A {
+  get a => 1;
+}
+''');
+  }
+
+  void test_false_classMemberAccessor_wasStatic() {
+    _assertDoesNotMatchOK(
+        r'''
+class A {
+  static get a => 1;
+}
+''',
+        r'''
+class A {
+  get a => 1;
+}
+''');
+  }
+
+  void test_false_classTypeAlias_list_add() {
+    _assertDoesNotMatch(
+        r'''
+class M {}
+class A = Object with M;
+''',
+        r'''
+class M {}
+class A = Object with M;
+class B = Object with M;
+''');
+  }
+
+  void test_false_classTypeAlias_list_remove() {
+    _assertDoesNotMatch(
+        r'''
+class M {}
+class A = Object with M;
+class B = Object with M;
+''',
+        r'''
+class M {}
+class A = Object with M;
+''');
+  }
+
+  void test_false_classTypeAlias_typeParameters_bounds_add() {
+    _assertDoesNotMatch(
+        r'''
+class M<T> {}
+class A {}
+class B<T> = Object with M<T>;
+''',
+        r'''
+class M<T> {}
+class A {}
+class B<T extends A> = Object with M<T>;
+''');
+  }
+
+  void test_false_classTypeAlias_typeParameters_bounds_remove() {
+    _assertDoesNotMatch(
+        r'''
+class M<T> {}
+class A {}
+class B<T extends A> = Object with M<T>;
+''',
+        r'''
+class M<T> {}
+class A {}
+class B<T> = Object with M<T>;
+''');
+  }
+
+  void test_false_constructor_keywordConst_add() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+  A();
+}
+''',
+        r'''
+class A {
+  const A();
+}
+''');
+  }
+
+  void test_false_constructor_keywordConst_remove() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+  const A();
+}
+''',
+        r'''
+class A {
+  A();
+}
+''');
+  }
+
+  void test_false_constructor_keywordFactory_add() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+  A();
+  A.foo() {
+    return new A();
+  }
+}
+''',
+        r'''
+class A {
+  A();
+  factory A.foo() {
+    return new A();
+  }
+}
+''');
+  }
+
+  void test_false_constructor_keywordFactory_remove() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+  A();
+  factory A.foo() {
+    return new A();
+  }
+}
+''',
+        r'''
+class A {
+  A();
+  A.foo() {
+    return new A();
+  }
+}
+''');
+  }
+
+  void test_false_constructor_parameters_list_add() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+  A();
+}
+''',
+        r'''
+class A {
+  A(int p);
+}
+''');
+  }
+
+  void test_false_constructor_parameters_list_remove() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+  A(int p);
+}
+''',
+        r'''
+class A {
+  A();
+}
+''');
+  }
+
+  void test_false_constructor_parameters_type_edit() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+  A(int p);
+}
+''',
+        r'''
+class A {
+  A(String p);
+}
+''');
+  }
+
+  void test_false_constructor_unnamed_add_hadParameters() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+}
+''',
+        r'''
+class A {
+  A(int p) {}
+}
+''');
+  }
+
+  void test_false_constructor_unnamed_remove_hadParameters() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+  A(int p) {}
+}
+''',
+        r'''
+class A {
+}
+''');
+  }
+
+  void test_false_defaultFieldFormalParameterElement_wasSimple() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+  int field;
+  A(int field);
+}
+''',
+        r'''
+class A {
+  int field;
+  A([this.field = 0]);
+}
+''');
+  }
+
+  void test_false_enum_constants_add() {
+    _assertDoesNotMatch(
+        r'''
+enum E {A, B}
+''',
+        r'''
+enum E {A, B, C}
+''');
+  }
+
+  void test_false_enum_constants_remove() {
+    _assertDoesNotMatch(
+        r'''
+enum E {A, B, C}
+''',
+        r'''
+enum E {A, B}
+''');
+  }
+
+  void test_false_export_hide_add() {
+    _assertDoesNotMatch(
+        r'''
+export 'dart:async' hide Future;
+''',
+        r'''
+export 'dart:async' hide Future, Stream;
+''');
+  }
+
+  void test_false_export_hide_remove() {
+    _assertDoesNotMatch(
+        r'''
+export 'dart:async' hide Future, Stream;
+''',
+        r'''
+export 'dart:async' hide Future;
+''');
+  }
+
+  void test_false_export_list_add() {
+    _assertDoesNotMatch(
+        r'''
+export 'dart:async';
+''',
+        r'''
+export 'dart:async';
+export 'dart:math';
+''');
+  }
+
+  void test_false_export_list_remove() {
+    _assertDoesNotMatch(
+        r'''
+export 'dart:async';
+export 'dart:math';
+''',
+        r'''
+export 'dart:async';
+''');
+  }
+
+  void test_false_export_show_add() {
+    _assertDoesNotMatch(
+        r'''
+export 'dart:async' show Future;
+''',
+        r'''
+export 'dart:async' show Future, Stream;
+''');
+  }
+
+  void test_false_export_show_remove() {
+    _assertDoesNotMatch(
+        r'''
+export 'dart:async' show Future, Stream;
+''',
+        r'''
+export 'dart:async' show Future;
+''');
+  }
+
+  void test_false_extendsClause_add() {
+    _assertDoesNotMatch(
+        r'''
+class A {}
+class B {}
+''',
+        r'''
+class A {}
+class B extends A {}
+''');
+  }
+
+  void test_false_extendsClause_different() {
+    _assertDoesNotMatch(
+        r'''
+class A {}
+class B {}
+class C extends A {}
+''',
+        r'''
+class A {}
+class B {}
+class C extends B {}
+''');
+  }
+
+  void test_false_extendsClause_remove() {
+    _assertDoesNotMatch(
+        r'''
+class A {}
+class B extends A{}
+''',
+        r'''
+class A {}
+class B {}
+''');
+  }
+
+  void test_false_field_list_add() {
+    _assertDoesNotMatch(
+        r'''
+class T {
+  int A = 1;
+  int C = 3;
+}
+''',
+        r'''
+class T {
+  int A = 1;
+  int B = 2;
+  int C = 3;
+}
+''');
+  }
+
+  void test_false_field_list_remove() {
+    _assertDoesNotMatch(
+        r'''
+class T {
+  int A = 1;
+  int B = 2;
+  int C = 3;
+}
+''',
+        r'''
+class T {
+  int A = 1;
+  int C = 3;
+}
+''');
+  }
+
+  void test_false_field_modifier_isConst() {
+    _assertDoesNotMatch(
+        r'''
+class T {
+  static final A = 1;
+}
+''',
+        r'''
+class T {
+  static const A = 1;
+}
+''');
+  }
+
+  void test_false_field_modifier_isFinal() {
+    _assertDoesNotMatch(
+        r'''
+class T {
+  int A = 1;
+}
+''',
+        r'''
+class T {
+  final int A = 1;
+}
+''');
+  }
+
+  void test_false_field_modifier_isStatic() {
+    _assertDoesNotMatch(
+        r'''
+class T {
+  int A = 1;
+}
+''',
+        r'''
+class T {
+  static int A = 1;
+}
+''');
+  }
+
+  void test_false_field_modifier_wasConst() {
+    _assertDoesNotMatch(
+        r'''
+class T {
+  static const A = 1;
+}
+''',
+        r'''
+class T {
+  static final A = 1;
+}
+''');
+  }
+
+  void test_false_field_modifier_wasFinal() {
+    _assertDoesNotMatch(
+        r'''
+class T {
+  final int A = 1;
+}
+''',
+        r'''
+class T {
+  int A = 1;
+}
+''');
+  }
+
+  void test_false_field_modifier_wasStatic() {
+    _assertDoesNotMatch(
+        r'''
+class T {
+  static int A = 1;
+}
+''',
+        r'''
+class T {
+  int A = 1;
+}
+''');
+  }
+
+  void test_false_field_type_differentArgs() {
+    _assertDoesNotMatch(
+        r'''
+class T {
+  List<int> A;
+}
+''',
+        r'''
+class T {
+  List<String> A;
+}
+''');
+  }
+
+  void test_false_fieldFormalParameter_add() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+  final field;
+  A(field);
+}
+''',
+        r'''
+class A {
+  final field;
+  A(this.field);
+}
+''');
+  }
+
+  void test_false_fieldFormalParameter_add_function() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+  final field;
+  A(field(a));
+}
+''',
+        r'''
+class A {
+  final field;
+  A(this.field(a));
+}
+''');
+  }
+
+  void test_false_fieldFormalParameter_parameters_add() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+  final field;
+  A(this.field(a));
+}
+''',
+        r'''
+class A {
+  final field;
+  A(this.field(a, b));
+}
+''');
+  }
+
+  void test_false_fieldFormalParameter_parameters_remove() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+  final field;
+  A(this.field(a, b));
+}
+''',
+        r'''
+class A {
+  final field;
+  A(this.field(a));
+}
+''');
+  }
+
+  void test_false_fieldFormalParameter_parameters_typeEdit() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+  final field;
+  A(this.field(int p));
+}
+''',
+        r'''
+class A {
+  final field;
+  A(this.field(String p));
+}
+''');
+  }
+
+  void test_false_fieldFormalParameter_remove_default() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+  final field;
+  A([this.field = 0]);
+}
+''',
+        r'''
+class A {
+  final field;
+  A([field = 0]);
+}
+''');
+  }
+
+  void test_false_fieldFormalParameter_remove_function() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+  final field;
+  A(this.field(a));
+}
+''',
+        r'''
+class A {
+  final field;
+  A(field(a));
+}
+''');
+  }
+
+  void test_false_fieldFormalParameter_remove_normal() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+  final field;
+  A(this.field);
+}
+''',
+        r'''
+class A {
+  final field;
+  A(field);
+}
+''');
+  }
+
+  void test_false_fieldFormalParameterElement_wasSimple() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+  int field;
+  A(int field);
+}
+''',
+        r'''
+class A {
+  int field;
+  A(this.field);
+}
+''');
+  }
+
+  void test_false_final_type_different() {
+    _assertDoesNotMatch(
+        r'''
+class T {
+  int A;
+}
+''',
+        r'''
+class T {
+  String A;
+}
+''');
+  }
+
+  void test_false_function_async_add() {
+    _assertDoesNotMatch(
+        r'''
+main() {}
+''',
+        r'''
+main() async {}
+''');
+  }
+
+  void test_false_function_async_remove() {
+    _assertDoesNotMatch(
+        r'''
+main() async {}
+''',
+        r'''
+main() {}
+''');
+  }
+
+  void test_false_function_generator_add() {
+    _assertDoesNotMatch(
+        r'''
+main() async {}
+''',
+        r'''
+main() async* {}
+''');
+  }
+
+  void test_false_function_generator_remove() {
+    _assertDoesNotMatch(
+        r'''
+main() async* {}
+''',
+        r'''
+main() async {}
+''');
+  }
+
+  void test_false_functionTypeAlias_list_add() {
+    _assertDoesNotMatch(
+        r'''
+typedef A(int pa);
+typedef B(String pb);
+''',
+        r'''
+typedef A(int pa);
+typedef B(String pb);
+typedef C(pc);
+''');
+  }
+
+  void test_false_functionTypeAlias_list_remove() {
+    _assertDoesNotMatch(
+        r'''
+typedef A(int pa);
+typedef B(String pb);
+typedef C(pc);
+''',
+        r'''
+typedef A(int pa);
+typedef B(String pb);
+''');
+  }
+
+  void test_false_functionTypeAlias_parameters_list_add() {
+    _assertDoesNotMatch(
+        r'''
+typedef A(a);
+''',
+        r'''
+typedef A(a, b);
+''');
+  }
+
+  void test_false_functionTypeAlias_parameters_list_remove() {
+    _assertDoesNotMatch(
+        r'''
+typedef A(a, b);
+''',
+        r'''
+typedef A(a);
+''');
+  }
+
+  void test_false_functionTypeAlias_parameters_type_edit() {
+    _assertDoesNotMatch(
+        r'''
+typedef A(int p);
+''',
+        r'''
+typedef A(String p);
+''');
+  }
+
+  void test_false_functionTypeAlias_returnType_edit() {
+    _assertDoesNotMatch(
+        r'''
+typedef int A();
+''',
+        r'''
+typedef String A();
+''');
+  }
+
+  void test_false_functionTypeAlias_typeParameters_bounds_add() {
+    _assertDoesNotMatch(
+        r'''
+class A {}
+typedef F<T>();
+''',
+        r'''
+class A {}
+typedef F<T extends A>();
+''');
+  }
+
+  void test_false_functionTypeAlias_typeParameters_bounds_edit() {
+    _assertDoesNotMatch(
+        r'''
+class A {}
+class B {}
+typedef F<T extends A>();
+''',
+        r'''
+class A {}
+typedef F<T extends B>();
+''');
+  }
+
+  void test_false_functionTypeAlias_typeParameters_bounds_remove() {
+    _assertDoesNotMatch(
+        r'''
+class A {}
+typedef F<T extends A>();
+''',
+        r'''
+class A {}
+typedef F<T>();
+''');
+  }
+
+  void test_false_functionTypeAlias_typeParameters_list_add() {
+    _assertDoesNotMatch(
+        r'''
+typedef F<A>();
+''',
+        r'''
+typedef F<A, B>();
+''');
+  }
+
+  void test_false_functionTypeAlias_typeParameters_list_remove() {
+    _assertDoesNotMatch(
+        r'''
+typedef F<A, B>();
+''',
+        r'''
+typedef F<A>();
+''');
+  }
+
+  void test_false_FunctionTypedFormalParameter_parameters_list_add() {
+    _assertDoesNotMatch(
+        r'''
+main(int callback(int a)) {
+}
+''',
+        r'''
+main(int callback(int a, String b)) {
+}
+''');
+  }
+
+  void test_false_FunctionTypedFormalParameter_parameters_list_remove() {
+    _assertDoesNotMatch(
+        r'''
+main(int callback(int a, String b)) {
+}
+''',
+        r'''
+main(int callback(int a)) {
+}
+''');
+  }
+
+  void test_false_FunctionTypedFormalParameter_parameterType() {
+    _assertDoesNotMatch(
+        r'''
+main(int callback(int p)) {
+}
+''',
+        r'''
+main(int callback(String p)) {
+}
+''');
+  }
+
+  void test_false_FunctionTypedFormalParameter_returnType() {
+    _assertDoesNotMatch(
+        r'''
+main(int callback()) {
+}
+''',
+        r'''
+main(String callback()) {
+}
+''');
+  }
+
+  void test_false_FunctionTypedFormalParameter_wasSimple() {
+    _assertDoesNotMatch(
+        r'''
+main(int callback) {
+}
+''',
+        r'''
+main(int callback(int a, String b)) {
+}
+''');
+  }
+
+  void test_false_getter_body_add() {
+    _assertDoesNotMatchOK(
+        r'''
+class A {
+  int get foo;
+}
+''',
+        r'''
+class A {
+  int get foo => 0;
+}
+''');
+  }
+
+  void test_false_getter_body_remove() {
+    _assertDoesNotMatchOK(
+        r'''
+class A {
+  int get foo => 0;
+}
+''',
+        r'''
+class A {
+  int get foo;
+}
+''');
+  }
+
+  void test_false_implementsClause_add() {
+    _assertDoesNotMatch(
+        r'''
+class A {}
+class B {}
+''',
+        r'''
+class A {}
+class B implements A {}
+''');
+  }
+
+  void test_false_implementsClause_remove() {
+    _assertDoesNotMatch(
+        r'''
+class A {}
+class B implements A {}
+''',
+        r'''
+class A {}
+class B {}
+''');
+  }
+
+  void test_false_implementsClause_reorder() {
+    _assertDoesNotMatch(
+        r'''
+class A {}
+class B {}
+class C implements A, B {}
+''',
+        r'''
+class A {}
+class B {}
+class C implements B, A {}
+''');
+  }
+
+  void test_false_import_hide_add() {
+    _assertDoesNotMatch(
+        r'''
+import 'dart:async' hide Future;
+''',
+        r'''
+import 'dart:async' hide Future, Stream;
+''');
+  }
+
+  void test_false_import_hide_remove() {
+    _assertDoesNotMatch(
+        r'''
+import 'dart:async' hide Future, Stream;
+''',
+        r'''
+import 'dart:async' hide Future;
+''');
+  }
+
+  void test_false_import_list_add() {
+    _assertDoesNotMatch(
+        r'''
+import 'dart:async';
+''',
+        r'''
+import 'dart:async';
+import 'dart:math';
+''');
+  }
+
+  void test_false_import_list_remove() {
+    _assertDoesNotMatch(
+        r'''
+import 'dart:async';
+import 'dart:math';
+''',
+        r'''
+import 'dart:async';
+''');
+  }
+
+  void test_false_import_prefix_add() {
+    _assertDoesNotMatch(
+        r'''
+import 'dart:async';
+''',
+        r'''
+import 'dart:async' as async;
+''');
+  }
+
+  void test_false_import_prefix_edit() {
+    _assertDoesNotMatch(
+        r'''
+import 'dart:async' as oldPrefix;
+''',
+        r'''
+import 'dart:async' as newPrefix;
+''');
+  }
+
+  void test_false_import_prefix_remove() {
+    _assertDoesNotMatch(
+        r'''
+import 'dart:async' as async;
+''',
+        r'''
+import 'dart:async';
+''');
+  }
+
+  void test_false_import_show_add() {
+    _assertDoesNotMatch(
+        r'''
+import 'dart:async' show Future;
+''',
+        r'''
+import 'dart:async' show Future, Stream;
+''');
+  }
+
+  void test_false_import_show_remove() {
+    _assertDoesNotMatch(
+        r'''
+import 'dart:async' show Future, Stream;
+''',
+        r'''
+import 'dart:async' show Future;
+''');
+  }
+
+  void test_false_method_annotation_edit() {
+    _assertDoesNotMatchOK(
+        r'''
+const my_annotationA = const Object();
+const my_annotationB = const Object();
+class A {
+  @my_annotationA
+  void m() {}
+}
+''',
+        r'''
+const my_annotationA = const Object();
+const my_annotationB = const Object();
+class A {
+  @my_annotationB
+  void m() {}
+}
+''');
+  }
+
+  void test_false_method_annotations_add() {
+    _assertDoesNotMatchOK(
+        r'''
+const my_annotation = const Object();
+class A {
+  void m() {}
+}
+''',
+        r'''
+const my_annotation = const Object();
+class A {
+  @my_annotation
+  void m() {}
+}
+''');
+  }
+
+  void test_false_method_annotations_remove() {
+    _assertDoesNotMatchOK(
+        r'''
+const my_annotation = const Object();
+class A {
+  @my_annotation
+  void m() {}
+}
+''',
+        r'''
+const my_annotation = const Object();
+class A {
+  void m() {}
+}
+''');
+  }
+
+  void test_false_method_async_add() {
+    _assertDoesNotMatchOK(
+        r'''
+class A {
+  m() {}
+}
+''',
+        r'''
+class A {
+  m() async {}
+}
+''');
+  }
+
+  void test_false_method_async_remove() {
+    _assertDoesNotMatchOK(
+        r'''
+class A {
+  m() async {}
+}
+''',
+        r'''
+class A {
+  m() {}
+}
+''');
+  }
+
+  void test_false_method_body_add() {
+    _assertDoesNotMatchOK(
+        r'''
+class A {
+  void foo();
+}
+''',
+        r'''
+class A {
+  void foo() {}
+}
+''');
+  }
+
+  void test_false_method_body_remove() {
+    _assertDoesNotMatchOK(
+        r'''
+class A {
+  void foo() {}
+}
+''',
+        r'''
+class A {
+  void foo();
+}
+''');
+  }
+
+  void test_false_method_generator_add() {
+    _assertDoesNotMatchOK(
+        r'''
+class A {
+  m() async {}
+}
+''',
+        r'''
+class A {
+  m() async* {}
+}
+''');
+  }
+
+  void test_false_method_generator_remove() {
+    _assertDoesNotMatchOK(
+        r'''
+class A {
+  m() async* {}
+}
+''',
+        r'''
+class A {
+  m() async {}
+}
+''');
+  }
+
+  void test_false_method_list_add() {
+    _assertDoesNotMatchOK(
+        r'''
+class A {
+  a() {}
+  b() {}
+}
+''',
+        r'''
+class A {
+  a() {}
+  b() {}
+  c() {}
+}
+''');
+  }
+
+  void test_false_method_list_remove() {
+    _assertDoesNotMatch(
+        r'''
+class A {
+  a() {}
+  b() {}
+  c() {}
+}
+''',
+        r'''
+class A {
+  a() {}
+  b() {}
+}
+''');
+  }
+
+  void test_false_method_parameters_type_edit() {
+    _assertDoesNotMatchOK(
+        r'''
+class A {
+  m(int p) {
+  }
+}
+''',
+        r'''
+class A {
+  m(String p) {
+  }
+}
+''');
+  }
+
+  void test_false_method_parameters_type_edit_insertImportPrefix() {
+    _assertDoesNotMatchOK(
+        r'''
+import 'dart:async' as a;
+
+class C {
+  void foo(Future f) {}
+}
+
+class Future {}
+
+bar(C c, a.Future f) {
+  c.foo(f);
+}
+''',
+        r'''
+import 'dart:async' as a;
+
+class C {
+  void foo(a.Future f) {}
+}
+
+class Future {}
+
+bar(C c, a.Future f) {
+  c.foo(f);
+}
+''');
+  }
+
+  void test_false_method_returnType_edit() {
+    _assertDoesNotMatchOK(
+        r'''
+class A {
+  int m() {}
+}
+''',
+        r'''
+class A {
+  String m() {}
+}
+''');
+  }
+
+  void test_false_part_list_add() {
+    addNamedSource('/unitA.dart', 'part of lib; class A {}');
+    addNamedSource('/unitB.dart', 'part of lib; class B {}');
+    _assertDoesNotMatch(
+        r'''
+library lib;
+part 'unitA.dart';
+''',
+        r'''
+library lib;
+part 'unitA.dart';
+part 'unitB.dart';
+''');
+  }
+
+  void test_false_part_list_remove() {
+    addNamedSource('/unitA.dart', 'part of lib; class A {}');
+    addNamedSource('/unitB.dart', 'part of lib; class B {}');
+    _assertDoesNotMatch(
+        r'''
+library lib;
+part 'unitA.dart';
+part 'unitB.dart';
+''',
+        r'''
+library lib;
+part 'unitA.dart';
+''');
+  }
+
+  void test_false_SimpleFormalParameter_named_differentName() {
+    _assertDoesNotMatch(
+        r'''
+main({int oldName}) {
+}
+''',
+        r'''
+main({int newName}) {
+}
+''');
+  }
+
+  void test_false_SimpleFormalParameter_namedDefault_addValue() {
+    _assertDoesNotMatch(
+        r'''
+main({int p}) {
+}
+''',
+        r'''
+main({int p: 2}) {
+}
+''');
+  }
+
+  void test_false_SimpleFormalParameter_namedDefault_differentValue() {
+    _assertDoesNotMatch(
+        r'''
+main({int p: 1}) {
+}
+''',
+        r'''
+main({int p: 2}) {
+}
+''');
+  }
+
+  void test_false_SimpleFormalParameter_namedDefault_removeValue() {
+    _assertDoesNotMatch(
+        r'''
+main({int p: 1}) {
+}
+''',
+        r'''
+main({int p}) {
+}
+''');
+  }
+
+  void test_false_SimpleFormalParameter_optionalDefault_addValue() {
+    _assertDoesNotMatch(
+        r'''
+main([int p]) {
+}
+''',
+        r'''
+main([int p = 2]) {
+}
+''');
+  }
+
+  void test_false_SimpleFormalParameter_optionalDefault_differentValue() {
+    _assertDoesNotMatch(
+        r'''
+main([int p = 1]) {
+}
+''',
+        r'''
+main([int p = 2]) {
+}
+''');
+  }
+
+  void test_false_SimpleFormalParameter_optionalDefault_removeValue() {
+    _assertDoesNotMatch(
+        r'''
+main([int p = 1]) {
+}
+''',
+        r'''
+main([int p]) {
+}
+''');
+  }
+
+  void test_false_topLevelAccessor_list_add() {
+    _assertDoesNotMatch(
+        r'''
+get a => 1;
+get b => 2;
+''',
+        r'''
+get a => 1;
+get b => 2;
+get c => 3;
+''');
+  }
+
+  void test_false_topLevelAccessor_list_remove() {
+    _assertDoesNotMatch(
+        r'''
+get a => 1;
+get b => 2;
+get c => 3;
+''',
+        r'''
+get a => 1;
+get b => 2;
+''');
+  }
+
+  void test_false_topLevelAccessor_wasGetter() {
+    _assertDoesNotMatch(
+        r'''
+get a => 1;
+''',
+        r'''
+set a(x) {}
+''');
+  }
+
+  void test_false_topLevelAccessor_wasSetter() {
+    _assertDoesNotMatch(
+        r'''
+set a(x) {}
+''',
+        r'''
+get a => 1;
+''');
+  }
+
+  void test_false_topLevelFunction_list_add() {
+    _assertDoesNotMatch(
+        r'''
+a() {}
+b() {}
+''',
+        r'''
+a() {}
+b() {}
+c() {}
+''');
+  }
+
+  void test_false_topLevelFunction_list_remove() {
+    _assertDoesNotMatch(
+        r'''
+a() {}
+b() {}
+c() {}
+''',
+        r'''
+a() {}
+b() {}
+''');
+  }
+
+  void test_false_topLevelFunction_parameters_list_add() {
+    _assertDoesNotMatch(
+        r'''
+main(int a, int b) {
+}
+''',
+        r'''
+main(int a, int b, int c) {
+}
+''');
+  }
+
+  void test_false_topLevelFunction_parameters_list_remove() {
+    _assertDoesNotMatch(
+        r'''
+main(int a, int b, int c) {
+}
+''',
+        r'''
+main(int a, int b) {
+}
+''');
+  }
+
+  void test_false_topLevelFunction_parameters_type_edit() {
+    _assertDoesNotMatch(
+        r'''
+main(int a, int b, int c) {
+}
+''',
+        r'''
+main(int a, String b, int c) {
+}
+''');
+  }
+
+  void test_false_topLevelFunction_returnType_edit() {
+    _assertDoesNotMatch(
+        r'''
+int a() {}
+''',
+        r'''
+String a() {}
+''');
+  }
+
+  void test_false_topLevelVariable_list_add() {
+    _assertDoesNotMatch(
+        r'''
+const int A = 1;
+const int C = 3;
+''',
+        r'''
+const int A = 1;
+const int B = 2;
+const int C = 3;
+''');
+  }
+
+  void test_false_topLevelVariable_list_remove() {
+    _assertDoesNotMatch(
+        r'''
+const int A = 1;
+const int B = 2;
+const int C = 3;
+''',
+        r'''
+const int A = 1;
+const int C = 3;
+''');
+  }
+
+  void test_false_topLevelVariable_modifier_isConst() {
+    _assertDoesNotMatch(
+        r'''
+final int A = 1;
+''',
+        r'''
+const int A = 1;
+''');
+  }
+
+  void test_false_topLevelVariable_modifier_isFinal() {
+    _assertDoesNotMatch(
+        r'''
+int A = 1;
+''',
+        r'''
+final int A = 1;
+''');
+  }
+
+  void test_false_topLevelVariable_modifier_wasConst() {
+    _assertDoesNotMatch(
+        r'''
+const int A = 1;
+''',
+        r'''
+final int A = 1;
+''');
+  }
+
+  void test_false_topLevelVariable_modifier_wasFinal() {
+    _assertDoesNotMatch(
+        r'''
+final int A = 1;
+''',
+        r'''
+int A = 1;
+''');
+  }
+
+  void test_false_topLevelVariable_synthetic_wasGetter() {
+    _assertDoesNotMatch(
+        r'''
+int get A => 1;
+''',
+        r'''
+final int A = 1;
+''');
+  }
+
+  void test_false_topLevelVariable_type_different() {
+    _assertDoesNotMatch(
+        r'''
+int A;
+''',
+        r'''
+String A;
+''');
+  }
+
+  void test_false_topLevelVariable_type_differentArgs() {
+    _assertDoesNotMatch(
+        r'''
+List<int> A;
+''',
+        r'''
+List<String> A;
+''');
+  }
+
+  void test_false_type_noTypeArguments_hadTypeArguments() {
+    _assertDoesNotMatch(
+        r'''
+class A<T> {}
+A<int> main() {
+}
+''',
+        r'''
+class A<T> {}
+A main() {
+}
+''');
+  }
+
+  void test_false_withClause_add() {
+    _assertDoesNotMatch(
+        r'''
+class A {}
+class B {}
+''',
+        r'''
+class A {}
+class B extends Object with A {}
+''');
+  }
+
+  void test_false_withClause_remove() {
+    _assertDoesNotMatch(
+        r'''
+class A {}
+class B extends Object with A {}
+''',
+        r'''
+class A {}
+class B {}
+''');
+  }
+
+  void test_false_withClause_reorder() {
+    _assertDoesNotMatch(
+        r'''
+class A {}
+class B {}
+class C extends Object with A, B {}
+''',
+        r'''
+class A {}
+class B {}
+class C extends Object with B, A {}
+''');
+  }
+
+  void test_true_class_annotations_same() {
+    _assertMatches(
+        r'''
+const my_annotation = const Object();
+@my_annotation
+class A {
+}
+''',
+        r'''
+const my_annotation = const Object();
+@my_annotation
+class A {
+}
+''');
+  }
+
+  void test_true_class_list_reorder() {
+    _assertMatches(
+        r'''
+class A {}
+class B {}
+class C {}
+''',
+        r'''
+class C {}
+class A {}
+class B {}
+''');
+  }
+
+  void test_true_class_list_same() {
+    _assertMatches(
+        r'''
+class A {}
+class B {}
+class C {}
+''',
+        r'''
+class A {}
+class B {}
+class C {}
+''');
+  }
+
+  void test_true_class_typeParameters_same() {
+    _assertMatches(
+        r'''
+class A<T> {}
+''',
+        r'''
+class A<T> {}
+''');
+  }
+
+  void test_true_classMemberAccessor_getterSetter() {
+    _assertMatches(
+        r'''
+class A {
+  int _test;
+  get test => _test;
+  set test(v) {
+    _test = v;
+  }
+}
+''',
+        r'''
+class A {
+  int _test;
+  get test => _test;
+  set test(v) {
+    _test = v;
+  }
+}
+''');
+  }
+
+  void test_true_classMemberAccessor_list_reorder() {
+    _assertMatches(
+        r'''
+class A {
+  get a => 1;
+  get b => 2;
+  get c => 3;
+}
+''',
+        r'''
+class A {
+  get c => 3;
+  get a => 1;
+  get b => 2;
+}
+''');
+  }
+
+  void test_true_classMemberAccessor_list_same() {
+    _assertMatches(
+        r'''
+class A {
+  get a => 1;
+  get b => 2;
+  get c => 3;
+}
+''',
+        r'''
+class A {
+  get a => 1;
+  get b => 2;
+  get c => 3;
+}
+''');
+  }
+
+  void test_true_classTypeAlias_list_reorder() {
+    _assertMatches(
+        r'''
+class M {}
+class A = Object with M;
+class B = Object with M;
+class C = Object with M;
+''',
+        r'''
+class M {}
+class C = Object with M;
+class A = Object with M;
+class B = Object with M;
+''');
+  }
+
+  void test_true_classTypeAlias_list_same() {
+    _assertMatches(
+        r'''
+class M {}
+class A = Object with M;
+class B = Object with M;
+class C = Object with M;
+''',
+        r'''
+class M {}
+class A = Object with M;
+class B = Object with M;
+class C = Object with M;
+''');
+  }
+
+  void test_true_classTypeAlias_typeParameters_same() {
+    _assertMatches(
+        r'''
+class M<T> {}
+class A<T> {}
+class B<T> = A<T> with M<T>;
+''',
+        r'''
+class M<T> {}
+class A<T> {}
+class B<T> = A<T> with M<T>;
+''');
+  }
+
+  void test_true_constructor_body_add() {
+    _assertMatches(
+        r'''
+class A {
+  A(int p);
+}
+''',
+        r'''
+class A {
+  A(int p) {}
+}
+''');
+  }
+
+  void test_true_constructor_body_remove() {
+    _assertMatches(
+        r'''
+class A {
+  A(int p) {}
+}
+''',
+        r'''
+class A {
+  A(int p);
+}
+''');
+  }
+
+  void test_true_constructor_named_same() {
+    _assertMatches(
+        r'''
+class A {
+  A.name(int p);
+}
+''',
+        r'''
+class A {
+  A.name(int p);
+}
+''');
+  }
+
+  void test_true_constructor_unnamed_add_noParameters() {
+    _assertMatches(
+        r'''
+class A {
+}
+''',
+        r'''
+class A {
+  A() {}
+}
+''');
+  }
+
+  void test_true_constructor_unnamed_remove_noParameters() {
+    _assertMatches(
+        r'''
+class A {
+  A() {}
+}
+''',
+        r'''
+class A {
+}
+''');
+  }
+
+  void test_true_constructor_unnamed_same() {
+    _assertMatches(
+        r'''
+class A {
+  A(int p);
+}
+''',
+        r'''
+class A {
+  A(int p);
+}
+''');
+  }
+
+  void test_true_defaultFieldFormalParameterElement() {
+    _assertMatches(
+        r'''
+class A {
+  int field;
+  A([this.field = 0]);
+}
+''',
+        r'''
+class A {
+  int field;
+  A([this.field = 0]);
+}
+''');
+  }
+
+  void test_true_enum_constants_reorder() {
+    _assertMatches(
+        r'''
+enum E {A, B, C}
+''',
+        r'''
+enum E {C, A, B}
+''');
+  }
+
+  void test_true_enum_list_reorder() {
+    _assertMatches(
+        r'''
+enum A {A1, A2, A3}
+enum B {B1, B2, B3}
+enum C {C1, C2, C3}
+''',
+        r'''
+enum C {C1, C2, C3}
+enum A {A1, A2, A3}
+enum B {B1, B2, B3}
+''');
+  }
+
+  void test_true_enum_list_same() {
+    _assertMatches(
+        r'''
+enum A {A1, A2, A3}
+enum B {B1, B2, B3}
+enum C {C1, C2, C3}
+''',
+        r'''
+enum A {A1, A2, A3}
+enum B {B1, B2, B3}
+enum C {C1, C2, C3}
+''');
+  }
+
+  void test_true_executable_same_hasLabel() {
+    _assertMatches(
+        r'''
+main() {
+  label: return 42;
+}
+''',
+        r'''
+main() {
+  label: return 42;
+}
+''');
+  }
+
+  void test_true_executable_same_hasLocalVariable() {
+    _assertMatches(
+        r'''
+main() {
+  int a = 42;
+}
+''',
+        r'''
+main() {
+  int a = 42;
+}
+''');
+  }
+
+  void test_true_export_hide_reorder() {
+    _assertMatches(
+        r'''
+export 'dart:async' hide Future, Stream;
+''',
+        r'''
+export 'dart:async' hide Stream, Future;
+''');
+  }
+
+  void test_true_export_list_reorder() {
+    _assertMatches(
+        r'''
+export 'dart:async';
+export 'dart:math';
+''',
+        r'''
+export 'dart:math';
+export 'dart:async';
+''');
+  }
+
+  void test_true_export_list_same() {
+    _assertMatches(
+        r'''
+export 'dart:async';
+export 'dart:math';
+''',
+        r'''
+export 'dart:async';
+export 'dart:math';
+''');
+  }
+
+  void test_true_export_show_reorder() {
+    _assertMatches(
+        r'''
+export 'dart:async' show Future, Stream;
+''',
+        r'''
+export 'dart:async' show Stream, Future;
+''');
+  }
+
+  void test_true_extendsClause_same() {
+    _assertMatches(
+        r'''
+class A {}
+class B extends A {}
+''',
+        r'''
+class A {}
+class B extends A {}
+''');
+  }
+
+  void test_true_field_list_reorder() {
+    _assertMatches(
+        r'''
+class T {
+  int A = 1;
+  int B = 2;
+  int C = 3;
+}
+''',
+        r'''
+class T {
+  int C = 3;
+  int A = 1;
+  int B = 2;
+}
+''');
+  }
+
+  void test_true_field_list_same() {
+    _assertMatches(
+        r'''
+class T {
+  int A = 1;
+  int B = 2;
+  int C = 3;
+}
+''',
+        r'''
+class T {
+  int A = 1;
+  int B = 2;
+  int C = 3;
+}
+''');
+  }
+
+  void test_true_fieldFormalParameter() {
+    _assertMatches(
+        r'''
+class A {
+  int field;
+  A(this.field);
+}
+''',
+        r'''
+class A {
+  int field;
+  A(this.field);
+}
+''');
+  }
+
+  void test_true_fieldFormalParameter_function() {
+    _assertMatches(
+        r'''
+class A {
+  final field;
+  A(this.field(int a, String b));
+}
+''',
+        r'''
+class A {
+  final field;
+  A(this.field(int a, String b));
+}
+''');
+  }
+
+  void test_true_functionTypeAlias_list_reorder() {
+    _assertMatches(
+        r'''
+typedef A(int pa);
+typedef B(String pb);
+typedef C(pc);
+''',
+        r'''
+typedef C(pc);
+typedef A(int pa);
+typedef B(String pb);
+''');
+  }
+
+  void test_true_functionTypeAlias_list_same() {
+    _assertMatches(
+        r'''
+typedef String A(int pa);
+typedef int B(String pb);
+typedef C(pc);
+''',
+        r'''
+typedef String A(int pa);
+typedef int B(String pb);
+typedef C(pc);
+''');
+  }
+
+  void test_true_functionTypeAlias_typeParameters_list_same() {
+    _assertMatches(
+        r'''
+typedef F<A, B, C>();
+''',
+        r'''
+typedef F<A, B, C>();
+''');
+  }
+
+  void test_true_FunctionTypedFormalParameter() {
+    _assertMatches(
+        r'''
+main(int callback(int a, String b)) {
+}
+''',
+        r'''
+main(int callback(int a, String b)) {
+}
+''');
+  }
+
+  void test_true_implementsClause_same() {
+    _assertMatches(
+        r'''
+class A {}
+class B implements A {}
+''',
+        r'''
+class A {}
+class B implements A {}
+''');
+  }
+
+  void test_true_import_hide_reorder() {
+    _assertMatches(
+        r'''
+import 'dart:async' hide Future, Stream;
+''',
+        r'''
+import 'dart:async' hide Stream, Future;
+''');
+  }
+
+  void test_true_import_list_reorder() {
+    _assertMatches(
+        r'''
+import 'dart:async';
+import 'dart:math';
+''',
+        r'''
+import 'dart:math';
+import 'dart:async';
+''');
+  }
+
+  void test_true_import_list_same() {
+    _assertMatches(
+        r'''
+import 'dart:async';
+import 'dart:math';
+''',
+        r'''
+import 'dart:async';
+import 'dart:math';
+''');
+  }
+
+  void test_true_import_prefix() {
+    _assertMatches(
+        r'''
+import 'dart:async' as async;
+''',
+        r'''
+import 'dart:async' as async;
+''');
+  }
+
+  void test_true_import_show_reorder() {
+    _assertMatches(
+        r'''
+import 'dart:async' show Future, Stream;
+''',
+        r'''
+import 'dart:async' show Stream, Future;
+''');
+  }
+
+  void test_true_method_annotation_accessor_same() {
+    _assertMatches(
+        r'''
+const my_annotation = const Object();
+class A {
+  @my_annotation
+  void m() {}
+}
+''',
+        r'''
+const my_annotation = const Object();
+class A {
+  @my_annotation
+  void m() {}
+}
+''');
+  }
+
+  void test_true_method_annotation_constructor_same() {
+    _assertMatches(
+        r'''
+class MyAnnotation {
+  const MyAnnotation();
+}
+class A {
+  @MyAnnotation()
+  void m() {}
+}
+''',
+        r'''
+class MyAnnotation {
+  const MyAnnotation();
+}
+class A {
+  @MyAnnotation()
+  void m() {}
+}
+''');
+  }
+
+  void test_true_method_async() {
+    _assertMatches(
+        r'''
+class A {
+  m() async {}
+}
+''',
+        r'''
+class A {
+  m() async {}
+}
+''');
+  }
+
+  void test_true_method_list_reorder() {
+    _assertMatches(
+        r'''
+class A {
+  a() {}
+  b() {}
+  c() {}
+}
+''',
+        r'''
+class A {
+  c() {}
+  a() {}
+  b() {}
+}
+''');
+  }
+
+  void test_true_method_list_same() {
+    _assertMatches(
+        r'''
+class A {
+  a() {}
+  b() {}
+  c() {}
+}
+''',
+        r'''
+class A {
+  a() {}
+  b() {}
+  c() {}
+}
+''');
+  }
+
+  void test_true_method_operator_minus() {
+    _assertMatches(
+        r'''
+class A {
+  operator -(other) {}
+}
+''',
+        r'''
+class A {
+  operator -(other) {}
+}
+''');
+  }
+
+  void test_true_method_operator_minusUnary() {
+    _assertMatches(
+        r'''
+class A {
+  operator -() {}
+}
+''',
+        r'''
+class A {
+  operator -() {}
+}
+''');
+  }
+
+  void test_true_method_operator_plus() {
+    _assertMatches(
+        r'''
+class A {
+  operator +(other) {}
+}
+''',
+        r'''
+class A {
+  operator +(other) {}
+}
+''');
+  }
+
+  void test_true_method_parameters_type_functionType() {
+    _assertMatches(
+        r'''
+typedef F();
+class A {
+  m(F p) {}
+}
+''',
+        r'''
+typedef F();
+class A {
+  m(F p) {}
+}
+''');
+  }
+
+  void test_true_method_parameters_type_sameImportPrefix() {
+    _assertMatches(
+        r'''
+import 'dart:async' as a;
+
+bar(a.Future f) {
+  print(f);
+}
+''',
+        r'''
+import 'dart:async' as a;
+
+bar(a.Future ff) {
+  print(ff);
+}
+''');
+  }
+
+  void test_true_part_list_reorder() {
+    addNamedSource('/unitA.dart', 'part of lib; class A {}');
+    addNamedSource('/unitB.dart', 'part of lib; class B {}');
+    _assertMatches(
+        r'''
+library lib;
+part 'unitA.dart';
+part 'unitB.dart';
+''',
+        r'''
+library lib;
+part 'unitB.dart';
+part 'unitA.dart';
+''');
+  }
+
+  void test_true_part_list_same() {
+    addNamedSource('/unitA.dart', 'part of lib; class A {}');
+    addNamedSource('/unitB.dart', 'part of lib; class B {}');
+    _assertMatches(
+        r'''
+library lib;
+part 'unitA.dart';
+part 'unitB.dart';
+''',
+        r'''
+library lib;
+part 'unitA.dart';
+part 'unitB.dart';
+''');
+  }
+
+  void test_true_SimpleFormalParameter_optional_differentName() {
+    _assertMatches(
+        r'''
+main([int oldName]) {
+}
+''',
+        r'''
+main([int newName]) {
+}
+''');
+  }
+
+  void test_true_SimpleFormalParameter_optionalDefault_differentName() {
+    _assertMatches(
+        r'''
+main([int oldName = 1]) {
+}
+''',
+        r'''
+main([int newName = 1]) {
+}
+''');
+  }
+
+  void test_true_SimpleFormalParameter_required_differentName() {
+    _assertMatches(
+        r'''
+main(int oldName) {
+}
+''',
+        r'''
+main(int newName) {
+}
+''');
+  }
+
+  void test_true_topLevelAccessor_list_reorder() {
+    _assertMatches(
+        r'''
+set a(x) {}
+set b(x) {}
+set c(x) {}
+''',
+        r'''
+set c(x) {}
+set a(x) {}
+set b(x) {}
+''');
+  }
+
+  void test_true_topLevelAccessor_list_same() {
+    _assertMatches(
+        r'''
+get a => 1;
+get b => 2;
+get c => 3;
+''',
+        r'''
+get a => 1;
+get b => 2;
+get c => 3;
+''');
+  }
+
+  void test_true_topLevelFunction_list_reorder() {
+    _assertMatches(
+        r'''
+a() {}
+b() {}
+c() {}
+''',
+        r'''
+c() {}
+a() {}
+b() {}
+''');
+  }
+
+  void test_true_topLevelFunction_list_same() {
+    _assertMatches(
+        r'''
+a() {}
+b() {}
+c() {}
+''',
+        r'''
+a() {}
+b() {}
+c() {}
+''');
+  }
+
+  void test_true_topLevelVariable_list_reorder() {
+    _assertMatches(
+        r'''
+const int A = 1;
+const int B = 2;
+const int C = 3;
+''',
+        r'''
+const int C = 3;
+const int A = 1;
+const int B = 2;
+''');
+  }
+
+  void test_true_topLevelVariable_list_same() {
+    _assertMatches(
+        r'''
+const int A = 1;
+const int B = 2;
+const int C = 3;
+''',
+        r'''
+const int A = 1;
+const int B = 2;
+const int C = 3;
+''');
+  }
+
+  void test_true_topLevelVariable_type_sameArgs() {
+    _assertMatches(
+        r'''
+Map<int, String> A;
+''',
+        r'''
+Map<int, String> A;
+''');
+  }
+
+  void test_true_type_dynamic() {
+    _assertMatches(
+        r'''
+dynamic a() {}
+''',
+        r'''
+dynamic a() {}
+''');
+  }
+
+  void test_true_type_hasImportPrefix() {
+    _assertMatches(
+        r'''
+import 'dart:async' as async;
+async.Future F;
+''',
+        r'''
+import 'dart:async' as async;
+async.Future F;
+''');
+  }
+
+  void test_true_type_noTypeArguments_implyAllDynamic() {
+    _assertMatches(
+        r'''
+class A<T> {}
+A main() {
+}
+''',
+        r'''
+class A<T> {}
+A main() {
+}
+''');
+  }
+
+  void test_true_type_void() {
+    _assertMatches(
+        r'''
+void a() {}
+''',
+        r'''
+void a() {}
+''');
+  }
+
+  void test_true_withClause_same() {
+    _assertMatches(
+        r'''
+class A {}
+class B extends Object with A {}
+''',
+        r'''
+class A {}
+class B extends Object with A {}
+''');
+  }
+
+  void _assertDoesNotMatch(String oldContent, String newContent) {
+    _assertMatchKind(DeclarationMatchKind.MISMATCH, oldContent, newContent);
+  }
+
+  void _assertDoesNotMatchOK(String oldContent, String newContent) {
+    _assertMatchKind(DeclarationMatchKind.MISMATCH_OK, oldContent, newContent);
+  }
+
+  void _assertMatches(String oldContent, String newContent) {
+    _assertMatchKind(DeclarationMatchKind.MATCH, oldContent, newContent);
+  }
+
+  void _assertMatchKind(
+      DeclarationMatchKind expectMatch, String oldContent, String newContent) {
+    Source source = addSource(oldContent);
+    LibraryElement library = resolve2(source);
+    CompilationUnit oldUnit = resolveCompilationUnit(source, library);
+    // parse
+    CompilationUnit newUnit = ParserTestCase.parseCompilationUnit(newContent);
+    // build elements
+    {
+      ElementHolder holder = new ElementHolder();
+      ElementBuilder builder = new ElementBuilder(holder);
+      newUnit.accept(builder);
+    }
+    // match
+    DeclarationMatcher matcher = new DeclarationMatcher();
+    DeclarationMatchKind matchKind = matcher.matches(newUnit, oldUnit.element);
+    expect(matchKind, same(expectMatch));
+  }
+}
+
+@reflectiveTest
+class IncrementalResolverTest extends ResolverTestCase {
+  Source source;
+  String code;
+  LibraryElement library;
+  CompilationUnit unit;
+
+  @override
+  void reset() {
+    if (AnalysisEngine.instance.useTaskModel) {
+      analysisContext2 = AnalysisContextFactory.contextWithCore();
+    } else {
+      analysisContext2 = AnalysisContextFactory.oldContextWithCore();
+    }
+  }
+
+  @override
+  void resetWithOptions(AnalysisOptions options) {
+    if (AnalysisEngine.instance.useTaskModel) {
+      analysisContext2 =
+          AnalysisContextFactory.contextWithCoreAndOptions(options);
+    } else {
+      analysisContext2 =
+          AnalysisContextFactory.oldContextWithCoreAndOptions(options);
+    }
+  }
+
+  void setUp() {
+    super.setUp();
+    test_resolveApiChanges = true;
+    log.logger = log.NULL_LOGGER;
+  }
+
+  void test_classMemberAccessor_body() {
+    _resolveUnit(r'''
+class A {
+  int get test {
+    return 1 + 2;
+  }
+}''');
+    _resolve(_editString('+', '*'), _isFunctionBody);
+  }
+
+  void test_constructor_body() {
+    _resolveUnit(r'''
+class A {
+  int f;
+  A(int a, int b) {
+    f = a + b;
+  }
+}''');
+    _resolve(_editString('+', '*'), _isFunctionBody);
+  }
+
+  void test_constructor_fieldFormalParameter() {
+    _resolveUnit(r'''
+class A {
+  int xy;
+  A(this.x);
+}''');
+    _resolve(_editString('this.x', 'this.xy'), _isDeclaration);
+  }
+
+  void test_constructor_fieldInitializer_add() {
+    _resolveUnit(r'''
+class A {
+  int f;
+  A(int a, int b);
+}''');
+    _resolve(_editString(');', ') : f = a + b;'), _isClassMember);
+  }
+
+  void test_constructor_fieldInitializer_edit() {
+    _resolveUnit(r'''
+class A {
+  int f;
+  A(int a, int b) : f = a + b {
+    int a = 42;
+  }
+}''');
+    _resolve(_editString('+', '*'), _isExpression);
+  }
+
+  void test_constructor_label_add() {
+    _resolveUnit(r'''
+class A {
+  A() {
+    return 42;
+  }
+}
+''');
+    _resolve(_editString('return', 'label: return'), _isBlock);
+  }
+
+  void test_constructor_localVariable_add() {
+    _resolveUnit(r'''
+class A {
+  A() {
+    42;
+  }
+}
+''');
+    _resolve(_editString('42;', 'var res = 42;'), _isBlock);
+  }
+
+  void test_constructor_superConstructorInvocation() {
+    _resolveUnit(r'''
+class A {
+  A(int p);
+}
+class B extends A {
+  B(int a, int b) : super(a + b);
+}
+''');
+    _resolve(_editString('+', '*'), _isExpression);
+  }
+
+  void test_function_localFunction_add() {
+    _resolveUnit(r'''
+int main() {
+  return 0;
+}
+callIt(f) {}
+''');
+    _resolve(_editString('return 0;', 'callIt((p) {});'), _isBlock);
+  }
+
+  void test_functionBody_body() {
+    _resolveUnit(r'''
+main(int a, int b) {
+  return a + b;
+}''');
+    _resolve(_editString('+', '*'), _isFunctionBody);
+  }
+
+  void test_functionBody_expression() {
+    _resolveUnit(r'''
+main(int a, int b) => a + b;
+''');
+    _resolve(_editString('+', '*'), _isExpression);
+  }
+
+  void test_functionBody_statement() {
+    _resolveUnit(r'''
+main(int a, int b) {
+  return a + b;
+}''');
+    _resolve(_editString('+', '*'), _isStatement);
+  }
+
+  void test_method_body() {
+    _resolveUnit(r'''
+class A {
+  m(int a, int b) {
+    return a + b;
+  }
+}''');
+    _resolve(_editString('+', '*'), _isFunctionBody);
+  }
+
+  void test_method_label_add() {
+    _resolveUnit(r'''
+class A {
+  int m(int a, int b) {
+    return a + b;
+  }
+}
+''');
+    _resolve(_editString('return', 'label: return'), _isBlock);
+  }
+
+  void test_method_localFunction_add() {
+    _resolveUnit(r'''
+class A {
+  int m() {
+    return 0;
+  }
+}
+callIt(f) {}
+''');
+    _resolve(_editString('return 0;', 'callIt((p) {});'), _isBlock);
+  }
+
+  void test_method_localVariable_add() {
+    _resolveUnit(r'''
+class A {
+  int m(int a, int b) {
+    return a + b;
+  }
+}
+''');
+    _resolve(
+        _editString(
+            '    return a + b;',
+            r'''
+    int res = a + b;
+    return res;
+'''),
+        _isBlock);
+  }
+
+  void test_method_parameter_rename() {
+    _resolveUnit(r'''
+class A {
+  int m(int a, int b, int c) {
+    return a + b + c;
+  }
+}
+''');
+    _resolve(
+        _editString(
+            r'''(int a, int b, int c) {
+    return a + b + c;''',
+            r'''(int a, int second, int c) {
+    return a + second + c;'''),
+        _isDeclaration);
+  }
+
+  void test_superInvocation() {
+    _resolveUnit(r'''
+class A {
+  foo(p) {}
+}
+class B extends A {
+  bar() {
+    super.foo(1 + 2);
+  }
+}''');
+    _resolve(_editString('+', '*'), _isFunctionBody);
+  }
+
+  void test_topLevelAccessor_body() {
+    _resolveUnit(r'''
+int get test {
+  return 1 + 2;
+}''');
+    _resolve(_editString('+', '*'), _isFunctionBody);
+  }
+
+  void test_topLevelFunction_label_add() {
+    _resolveUnit(r'''
+int main(int a, int b) {
+  return a + b;
+}
+''');
+    _resolve(_editString('  return', 'label: return a + b;'), _isBlock);
+  }
+
+  void test_topLevelFunction_label_remove() {
+    _resolveUnit(r'''
+int main(int a, int b) {
+  label: return a + b;
+}
+''');
+    _resolve(_editString('label: ', ''), _isBlock);
+  }
+
+  void test_topLevelFunction_localVariable_add() {
+    _resolveUnit(r'''
+int main(int a, int b) {
+  return a + b;
+}
+''');
+    _resolve(
+        _editString(
+            '  return a + b;',
+            r'''
+  int res = a + b;
+  return res;
+'''),
+        _isBlock);
+  }
+
+  void test_topLevelFunction_localVariable_remove() {
+    _resolveUnit(r'''
+int main(int a, int b) {
+  int res = a * b;
+  return a + b;
+}
+''');
+    _resolve(_editString('int res = a * b;', ''), _isBlock);
+  }
+
+  void test_topLevelFunction_parameter_inFunctionTyped_rename() {
+    _resolveUnit(r'''
+test(f(int a, int b)) {
+}
+''');
+    _resolve(_editString('test(f(int a', 'test(f2(int a2'), _isDeclaration);
+  }
+
+  void test_topLevelFunction_parameter_rename() {
+    _resolveUnit(r'''
+int main(int a, int b) {
+  return a + b;
+}
+''');
+    _resolve(
+        _editString(
+            r'''(int a, int b) {
+  return a + b;''',
+            r'''(int first, int b) {
+  return first + b;'''),
+        _isDeclaration);
+  }
+
+  void test_topLevelVariable_initializer() {
+    _resolveUnit(r'''
+int C = 1 + 2;
+''');
+    _resolve(_editString('+', '*'), _isExpression);
+  }
+
+  void test_updateElementOffset() {
+    _resolveUnit(r'''
+class A {
+  int am(String ap) {
+    int av = 1;
+    return av;
+  }
+}
+main(int a, int b) {
+  return a + b;
+}
+class B {
+  int bm(String bp) {
+    int bv = 1;
+    return bv;
+  }
+}
+''');
+    _resolve(_editString('+', ' + '), _isStatement);
+  }
+
+  _Edit _editString(String search, String replacement, [int length]) {
+    int offset = code.indexOf(search);
+    expect(offset, isNot(-1));
+    if (length == null) {
+      length = search.length;
+    }
+    return new _Edit(offset, length, replacement);
+  }
+
+  /**
+   * Applies [edit] to [code], find the [AstNode] specified by [predicate]
+   * and incrementally resolves it.
+   *
+   * Then resolves the new code from scratch and validates that results of
+   * the incremental resolution and non-incremental resolutions are the same.
+   */
+  void _resolve(_Edit edit, Predicate<AstNode> predicate) {
+    int offset = edit.offset;
+    // parse "newCode"
+    String newCode = code.substring(0, offset) +
+        edit.replacement +
+        code.substring(offset + edit.length);
+    CompilationUnit newUnit = _parseUnit(newCode);
+    // replace the node
+    AstNode oldNode = _findNodeAt(unit, offset, predicate);
+    AstNode newNode = _findNodeAt(newUnit, offset, predicate);
+    {
+      bool success = NodeReplacer.replace(oldNode, newNode);
+      expect(success, isTrue);
+    }
+    // update tokens
+    {
+      int delta = edit.replacement.length - edit.length;
+      _shiftTokens(unit.beginToken, offset, delta);
+    }
+    // do incremental resolution
+    int updateOffset = edit.offset;
+    int updateEndOld = updateOffset + edit.length;
+    int updateOldNew = updateOffset + edit.replacement.length;
+    IncrementalResolver resolver;
+    if (AnalysisEngine.instance.useTaskModel) {
+      LibrarySpecificUnit lsu = new LibrarySpecificUnit(source, source);
+      task.AnalysisCache cache = analysisContext2.analysisCache;
+      resolver = new IncrementalResolver(
+          null,
+          cache.get(source),
+          cache.get(lsu),
+          unit.element,
+          updateOffset,
+          updateEndOld,
+          updateOldNew);
+    } else {
+      resolver = new IncrementalResolver(
+          (analysisContext2 as AnalysisContextImpl)
+              .getReadableSourceEntryOrNull(source),
+          null,
+          null,
+          unit.element,
+          updateOffset,
+          updateEndOld,
+          updateOldNew);
+    }
+    bool success = resolver.resolve(newNode);
+    expect(success, isTrue);
+    List<AnalysisError> newErrors = analysisContext.computeErrors(source);
+    // resolve "newCode" from scratch
+    CompilationUnit fullNewUnit;
+    {
+      source = addSource(newCode);
+      _runTasks();
+      LibraryElement library = resolve2(source);
+      fullNewUnit = resolveCompilationUnit(source, library);
+    }
+    try {
+      assertSameResolution(unit, fullNewUnit);
+    } on IncrementalResolutionMismatch catch (mismatch) {
+      fail(mismatch.message);
+    }
+    // errors
+    List<AnalysisError> newFullErrors =
+        analysisContext.getErrors(source).errors;
+    _assertEqualErrors(newErrors, newFullErrors);
+    // prepare for the next cycle
+    code = newCode;
+  }
+
+  void _resolveUnit(String code) {
+    this.code = code;
+    source = addSource(code);
+    library = resolve2(source);
+    unit = resolveCompilationUnit(source, library);
+    _runTasks();
+  }
+
+  void _runTasks() {
+    AnalysisResult result = analysisContext.performAnalysisTask();
+    while (result.changeNotices != null) {
+      result = analysisContext.performAnalysisTask();
+    }
+  }
+
+  static AstNode _findNodeAt(
+      CompilationUnit oldUnit, int offset, Predicate<AstNode> predicate) {
+    NodeLocator locator = new NodeLocator(offset);
+    AstNode node = locator.searchWithin(oldUnit);
+    return node.getAncestor(predicate);
+  }
+
+  static bool _isBlock(AstNode node) => node is Block;
+
+  static bool _isClassMember(AstNode node) => node is ClassMember;
+
+  static bool _isDeclaration(AstNode node) => node is Declaration;
+
+  static bool _isExpression(AstNode node) => node is Expression;
+
+  static bool _isFunctionBody(AstNode node) => node is FunctionBody;
+
+  static bool _isStatement(AstNode node) => node is Statement;
+
+  static CompilationUnit _parseUnit(String code) {
+    var errorListener = new BooleanErrorListener();
+    var reader = new CharSequenceReader(code);
+    var scanner = new Scanner(null, reader, errorListener);
+    var token = scanner.tokenize();
+    var parser = new Parser(null, errorListener);
+    return parser.parseCompilationUnit(token);
+  }
+
+  static void _shiftTokens(Token token, int afterOffset, int delta) {
+    while (token.type != TokenType.EOF) {
+      if (token.offset >= afterOffset) {
+        token.applyDelta(delta);
+      }
+      token = token.next;
+    }
+  }
+}
+
+/**
+ * The test for [poorMansIncrementalResolution] function and its integration
+ * into [AnalysisContext].
+ */
+@reflectiveTest
+class PoorMansIncrementalResolutionTest extends ResolverTestCase {
+  Source source;
+  String code;
+  LibraryElement oldLibrary;
+  CompilationUnit oldUnit;
+  CompilationUnitElement oldUnitElement;
+
+  void fail_updateErrors_removeExisting_duplicateMethodDeclaration() {
+    // TODO(scheglov) We fail to remove the second "foo" declaration.
+    // So, we still have the same duplicate declaration problem.
+    _resolveUnit(r'''
+class A {
+  void foo() {}
+  void foo() {}
+}
+''');
+    _updateAndValidate(r'''
+class A {
+  void foo() {}
+  void foo2() {}
+}
+''');
+  }
+
+  void setUp() {
+    super.setUp();
+    _resetWithIncremental(true);
+  }
+
+  void test_computeConstants() {
+    _resolveUnit(r'''
+int f() => 0;
+main() {
+  const x = f();
+  print(x + 1);
+}
+''');
+    _updateAndValidate(r'''
+int f() => 0;
+main() {
+  const x = f();
+  print(x + 2);
+}
+''');
+  }
+
+  void test_dartDoc_beforeField() {
+    _resolveUnit(r'''
+class A {
+  /**
+   * A field [field] of type [int] in class [A].
+   */
+  int field;
+}
+''');
+    _updateAndValidate(r'''
+class A {
+  /**
+   * A field [field] of the type [int] in the class [A].
+   * Updated, with a reference to the [String] type.
+   */
+  int field;
+}
+''');
+  }
+
+  void test_dartDoc_clumsy_addReference() {
+    _resolveUnit(r'''
+/**
+ * aaa bbbb
+ */
+main() {
+}
+''');
+    _updateAndValidate(r'''
+/**
+ * aaa [main] bbbb
+ */
+main() {
+}
+''');
+  }
+
+  void test_dartDoc_clumsy_removeReference() {
+    _resolveUnit(r'''
+/**
+ * aaa [main] bbbb
+ */
+main() {
+}
+''');
+    _updateAndValidate(r'''
+/**
+ * aaa bbbb
+ */
+main() {
+}
+''');
+  }
+
+  void test_dartDoc_clumsy_updateText_beforeKeywordToken() {
+    _resolveUnit(r'''
+/**
+ * A comment with the [int] type reference.
+ */
+class A {}
+''');
+    _updateAndValidate(r'''
+/**
+ * A comment with the [int] type reference.
+ * Plus reference to [A] itself.
+ */
+class A {}
+''');
+  }
+
+  void test_dartDoc_clumsy_updateText_insert() {
+    _resolveUnit(r'''
+/**
+ * A function [main] with a parameter [p] of type [int].
+ */
+main(int p) {
+  unresolvedFunctionProblem();
+}
+/**
+ * Other comment with [int] reference.
+ */
+foo() {}
+''');
+    _updateAndValidate(r'''
+/**
+ * A function [main] with a parameter [p] of type [int].
+ * Inserted text with [String] reference.
+ */
+main(int p) {
+  unresolvedFunctionProblem();
+}
+/**
+ * Other comment with [int] reference.
+ */
+foo() {}
+''');
+  }
+
+  void test_dartDoc_clumsy_updateText_remove() {
+    _resolveUnit(r'''
+/**
+ * A function [main] with a parameter [p] of type [int].
+ * Some text with [String] reference to remove.
+ */
+main(int p) {
+}
+/**
+ * Other comment with [int] reference.
+ */
+foo() {}
+''');
+    _updateAndValidate(r'''
+/**
+ * A function [main] with a parameter [p] of type [int].
+ */
+main(int p) {
+}
+/**
+ * Other comment with [int] reference.
+ */
+foo() {}
+''');
+  }
+
+  void test_dartDoc_elegant_addReference() {
+    _resolveUnit(r'''
+/// aaa bbb
+main() {
+  return 1;
+}
+''');
+    _updateAndValidate(r'''
+/// aaa [main] bbb
+/// ccc [int] ddd
+main() {
+  return 1;
+}
+''');
+  }
+
+  void test_dartDoc_elegant_removeReference() {
+    _resolveUnit(r'''
+/// aaa [main] bbb
+/// ccc [int] ddd
+main() {
+  return 1;
+}
+''');
+    _updateAndValidate(r'''
+/// aaa bbb
+main() {
+  return 1;
+}
+''');
+  }
+
+  void test_dartDoc_elegant_updateText_insertToken() {
+    _resolveUnit(r'''
+/// A
+/// [int]
+class Test {
+}
+''');
+    _updateAndValidate(r'''
+/// A
+///
+/// [int]
+class Test {
+}
+''');
+  }
+
+  void test_dartDoc_elegant_updateText_removeToken() {
+    _resolveUnit(r'''
+/// A
+///
+/// [int]
+class Test {
+}
+''');
+    _updateAndValidate(r'''
+/// A
+/// [int]
+class Test {
+}
+''');
+  }
+
+  void test_endOfLineComment_add_beforeKeywordToken() {
+    _resolveUnit(r'''
+main() {
+  var v = 42;
+}
+''');
+    _updateAndValidate(r'''
+main() {
+  // some comment
+  var v = 42;
+}
+''');
+  }
+
+  void test_endOfLineComment_add_beforeStringToken() {
+    _resolveUnit(r'''
+main() {
+  print(0);
+}
+''');
+    _updateAndValidate(r'''
+main() {
+  // some comment
+  print(0);
+}
+''');
+  }
+
+  void test_endOfLineComment_edit() {
+    _resolveUnit(r'''
+main() {
+  // some comment
+  print(0);
+}
+''');
+    _updateAndValidate(r'''
+main() {
+  // edited comment text
+  print(0);
+}
+''');
+  }
+
+  void test_endOfLineComment_localFunction_inTopLevelVariable() {
+    _resolveUnit(r'''
+typedef int Binary(one, two, three);
+
+int Global = f((a, b, c) {
+  return 0; // Some comment
+});
+''');
+    _updateAndValidate(r'''
+typedef int Binary(one, two, three);
+
+int Global = f((a, b, c) {
+  return 0; // Some  comment
+});
+''');
+  }
+
+  void test_endOfLineComment_outBody_add() {
+    _resolveUnit(r'''
+main() {
+  Object x;
+  x.foo();
+}
+''');
+    _updateAndValidate(
+        r'''
+// 000
+main() {
+  Object x;
+  x.foo();
+}
+''',
+        expectedSuccess: false);
+  }
+
+  void test_endOfLineComment_outBody_remove() {
+    _resolveUnit(r'''
+// 000
+main() {
+  Object x;
+  x.foo();
+}
+''');
+    _updateAndValidate(
+        r'''
+main() {
+  Object x;
+  x.foo();
+}
+''',
+        expectedSuccess: false);
+  }
+
+  void test_endOfLineComment_outBody_update() {
+    _resolveUnit(r'''
+// 000
+main() {
+  Object x;
+  x.foo();
+}
+''');
+    _updateAndValidate(
+        r'''
+// 10
+main() {
+  Object x;
+  x.foo();
+}
+''',
+        expectedSuccess: false);
+  }
+
+  void test_endOfLineComment_remove() {
+    _resolveUnit(r'''
+main() {
+  // some comment
+  print(0);
+}
+''');
+    _updateAndValidate(r'''
+main() {
+  print(0);
+}
+''');
+  }
+
+  void test_false_constConstructor_initializer() {
+    _resolveUnit(r'''
+class C {
+  final int x;
+  const C(this.x);
+  const C.foo() : x = 0;
+}
+main() {
+  const {const C(0): 0, const C.foo(): 1};
+}
+''');
+    _updateAndValidate(
+        r'''
+class C {
+  final int x;
+  const C(this.x);
+  const C.foo() : x = 1;
+}
+main() {
+  const {const C(0): 0, const C.foo(): 1};
+}
+''',
+        expectedSuccess: false);
+  }
+
+  void test_false_expressionBody() {
+    _resolveUnit(r'''
+class A {
+  final f = (() => 1)();
+}
+''');
+    _updateAndValidate(
+        r'''
+class A {
+  final f = (() => 2)();
+}
+''',
+        expectedSuccess: false);
+  }
+
+  void test_false_topLevelFunction_name() {
+    _resolveUnit(r'''
+a() {}
+b() {}
+''');
+    _updateAndValidate(
+        r'''
+a() {}
+bb() {}
+''',
+        expectedSuccess: false);
+  }
+
+  void test_false_unbalancedCurlyBrackets_inNew() {
+    _resolveUnit(r'''
+class A {
+  aaa() {
+    if (true) {
+      1;
+    }
+  }
+
+  bbb() {
+    print(0123456789);
+  }
+}''');
+    _updateAndValidate(
+        r'''
+class A {
+  aaa() {
+      1;
+    }
+  }
+
+  bbb() {
+    print(0123456789);
+  }
+}''',
+        expectedSuccess: false);
+  }
+
+  void test_false_unbalancedCurlyBrackets_inOld() {
+    _resolveUnit(r'''
+class A {
+  aaa() {
+      1;
+    }
+  }
+
+  bbb() {
+    print(0123456789);
+  }
+}''');
+    _updateAndValidate(
+        r'''
+class A {
+  aaa() {
+    if (true) {
+      1;
+    }
+  }
+
+  bbb() {
+    print(0123456789);
+  }
+}''',
+        expectedSuccess: false);
+  }
+
+  void test_fieldClassField_propagatedType() {
+    _resolveUnit(r'''
+class A {
+  static const A b = const B();
+  const A();
+}
+
+class B extends A {
+  const B();
+}
+
+main() {
+  print(12);
+  A.b;
+}
+''');
+    _updateAndValidate(r'''
+class A {
+  static const A b = const B();
+  const A();
+}
+
+class B extends A {
+  const B();
+}
+
+main() {
+  print(123);
+  A.b;
+}
+''');
+  }
+
+  void test_inBody_expression() {
+    _resolveUnit(r'''
+class A {
+  m() {
+    print(1);
+  }
+}
+''');
+    _updateAndValidate(r'''
+class A {
+  m() {
+    print(2 + 3);
+  }
+}
+''');
+  }
+
+  void test_inBody_insertStatement() {
+    _resolveUnit(r'''
+main() {
+  print(1);
+}
+''');
+    _updateAndValidate(r'''
+main() {
+  print(0);
+  print(1);
+}
+''');
+  }
+
+  void test_inBody_tokenToNode() {
+    _resolveUnit(r'''
+main() {
+  var v = 42;
+  print(v);
+}
+''');
+    _updateAndValidate(r'''
+main() {
+  int v = 42;
+  print(v);
+}
+''');
+  }
+
+  void test_multiple_emptyLine() {
+    _resolveUnit(r'''
+class A {
+  m() {
+    return true;
+  }
+}''');
+    for (int i = 0; i < 6; i++) {
+      if (i.isEven) {
+        _updateAndValidate(
+            r'''
+class A {
+  m() {
+    return true;
+
+  }
+}''',
+            compareWithFull: false);
+      } else {
+        _updateAndValidate(
+            r'''
+class A {
+  m() {
+    return true;
+  }
+}''',
+            compareWithFull: false);
+      }
+    }
+  }
+
+  void test_multiple_expression() {
+    _resolveUnit(r'''
+main() {
+  print(1);
+}''');
+    for (int i = 0; i < 6; i++) {
+      if (i.isEven) {
+        _updateAndValidate(
+            r'''
+main() {
+  print(12);
+}''',
+            compareWithFull: false);
+      } else {
+        _updateAndValidate(
+            r'''
+main() {
+  print(1);
+}''',
+            compareWithFull: false);
+      }
+    }
+  }
+
+  void test_true_emptyLine_betweenClassMembers_insert() {
+    _resolveUnit(r'''
+class A {
+  a() {}
+  b() {}
+}
+''');
+    _updateAndValidate(r'''
+class A {
+  a() {}
+
+  b() {}
+}
+''');
+  }
+
+  void test_true_emptyLine_betweenClassMembers_remove() {
+    _resolveUnit(r'''
+class A {
+  a() {}
+
+  b() {}
+}
+''');
+    _updateAndValidate(r'''
+class A {
+  a() {}
+  b() {}
+}
+''');
+  }
+
+  void test_true_emptyLine_betweenCompilationUnitMembers_insert() {
+    _resolveUnit(r'''
+a() {}
+b() {}
+''');
+    _updateAndValidate(r'''
+a() {}
+
+b() {}
+''');
+  }
+
+  void test_true_emptyLine_betweenCompilationUnitMembers_remove() {
+    _resolveUnit(r'''
+a() {
+  print(1)
+}
+
+b() {
+  foo(42);
+}
+foo(String p) {}
+''');
+    _updateAndValidate(r'''
+a() {
+  print(1)
+}
+b() {
+  foo(42);
+}
+foo(String p) {}
+''');
+  }
+
+  void test_true_wholeConstructor() {
+    _resolveUnit(r'''
+class A {
+  A(int a) {
+    print(a);
+  }
+}
+''');
+    _updateAndValidate(r'''
+class A {
+  A(int b) {
+    print(b);
+  }
+}
+''');
+  }
+
+  void test_true_wholeConstructor_addInitializer() {
+    _resolveUnit(r'''
+class A {
+  int field;
+  A();
+}
+''');
+    _updateAndValidate(r'''
+class A {
+  int field;
+  A() : field = 5;
+}
+''');
+  }
+
+  void test_true_wholeFunction() {
+    _resolveUnit(r'''
+foo() {}
+main(int a) {
+  print(a);
+}
+''');
+    _updateAndValidate(r'''
+foo() {}
+main(int b) {
+  print(b);
+}
+''');
+  }
+
+  void test_true_wholeFunction_firstTokenInUnit() {
+    _resolveUnit(r'''
+main(int a) {
+  print(a);
+}
+''');
+    _updateAndValidate(r'''
+main(int b) {
+  print(b);
+}
+''');
+  }
+
+  void test_true_wholeMethod() {
+    _resolveUnit(r'''
+class A {
+  main(int a) {
+    print(a);
+  }
+}
+''');
+    _updateAndValidate(r'''
+class A {
+  main(int b) {
+    print(b);
+  }
+}
+''');
+  }
+
+  void test_unusedHint_add_wasUsedOnlyInPart() {
+    Source partSource = addNamedSource(
+        '/my_unit.dart',
+        r'''
+part of lib;
+
+f(A a) {
+  a._foo();
+}
+''');
+    _resolveUnit(r'''
+library lib;
+part 'my_unit.dart';
+class A {
+  _foo() {
+    print(1);
+  }
+}
+''');
+    _runTasks();
+    // perform incremental resolution
+    _resetWithIncremental(true);
+    analysisContext2.setContents(
+        partSource,
+        r'''
+part of lib;
+
+f(A a) {
+//  a._foo();
+}
+''');
+    // no hints right now, because we delay hints computing
+    {
+      List<AnalysisError> errors = analysisContext.getErrors(source).errors;
+      expect(errors, isEmpty);
+    }
+    // a new hint should be added
+    List<AnalysisError> errors = analysisContext.computeErrors(source);
+    expect(errors, hasLength(1));
+    expect(errors[0].errorCode.type, ErrorType.HINT);
+    // the same hint should be reported using a ChangeNotice
+    bool noticeFound = false;
+    AnalysisResult result = analysisContext2.performAnalysisTask();
+    for (ChangeNotice notice in result.changeNotices) {
+      if (notice.source == source) {
+        expect(notice.errors, contains(errors[0]));
+        noticeFound = true;
+      }
+    }
+    expect(noticeFound, isTrue);
+  }
+
+  void test_unusedHint_false_stillUsedInPart() {
+    addNamedSource(
+        '/my_unit.dart',
+        r'''
+part of lib;
+
+f(A a) {
+  a._foo();
+}
+''');
+    _resolveUnit(r'''
+library lib;
+part 'my_unit.dart';
+class A {
+  _foo() {
+    print(1);
+  }
+}
+''');
+    // perform incremental resolution
+    _resetWithIncremental(true);
+    analysisContext2.setContents(
+        source,
+        r'''
+library lib;
+part 'my_unit.dart';
+class A {
+  _foo() {
+    print(12);
+  }
+}
+''');
+    // no hints
+    List<AnalysisError> errors = analysisContext.getErrors(source).errors;
+    expect(errors, isEmpty);
+  }
+
+  void test_updateErrors_addNew_hint1() {
+    _resolveUnit(r'''
+int main() {
+  return 42;
+}
+''');
+    _updateAndValidate(r'''
+int main() {
+}
+''');
+  }
+
+  void test_updateErrors_addNew_hint2() {
+    _resolveUnit(r'''
+main() {
+  int v = 0;
+  print(v);
+}
+''');
+    _updateAndValidate(r'''
+main() {
+  int v = 0;
+}
+''');
+  }
+
+  void test_updateErrors_addNew_parse() {
+    _resolveUnit(r'''
+main() {
+  print(42);
+}
+''');
+    _updateAndValidate(r'''
+main() {
+  print(42)
+}
+''');
+  }
+
+  void test_updateErrors_addNew_resolve() {
+    _resolveUnit(r'''
+main() {
+  foo();
+}
+foo() {}
+''');
+    _updateAndValidate(r'''
+main() {
+  bar();
+}
+foo() {}
+''');
+  }
+
+  void test_updateErrors_addNew_resolve2() {
+    _resolveUnit(r'''
+// this comment is important to reproduce the problem
+main() {
+  int vvv = 42;
+  print(vvv);
+}
+''');
+    _updateAndValidate(r'''
+// this comment is important to reproduce the problem
+main() {
+  int vvv = 42;
+  print(vvv2);
+}
+''');
+  }
+
+  void test_updateErrors_addNew_scan() {
+    _resolveUnit(r'''
+main() {
+  1;
+}
+''');
+    _updateAndValidate(r'''
+main() {
+  1e;
+}
+''');
+  }
+
+  void test_updateErrors_addNew_verify() {
+    _resolveUnit(r'''
+main() {
+  foo(0);
+}
+foo(int p) {}
+''');
+    _updateAndValidate(r'''
+main() {
+  foo('abc');
+}
+foo(int p) {}
+''');
+  }
+
+  void test_updateErrors_removeExisting_hint() {
+    _resolveUnit(r'''
+int main() {
+}
+''');
+    _updateAndValidate(r'''
+int main() {
+  return 42;
+}
+''');
+  }
+
+  void test_updateErrors_removeExisting_verify() {
+    _resolveUnit(r'''
+f1() {
+  print(1)
+}
+f2() {
+  print(22)
+}
+f3() {
+  print(333)
+}
+''');
+    _updateAndValidate(r'''
+f1() {
+  print(1)
+}
+f2() {
+  print(22);
+}
+f3() {
+  print(333)
+}
+''');
+  }
+
+  void test_updateErrors_shiftExisting() {
+    _resolveUnit(r'''
+f1() {
+  print(1)
+}
+f2() {
+  print(2);
+}
+f3() {
+  print(333)
+}
+''');
+    _updateAndValidate(r'''
+f1() {
+  print(1)
+}
+f2() {
+  print(22);
+}
+f3() {
+  print(333)
+}
+''');
+  }
+
+  void _assertEqualLineInfo(LineInfo incrLineInfo, LineInfo fullLineInfo) {
+    for (int offset = 0; offset < 1000; offset++) {
+      LineInfo_Location incrLocation = incrLineInfo.getLocation(offset);
+      LineInfo_Location fullLocation = fullLineInfo.getLocation(offset);
+      if (incrLocation.lineNumber != fullLocation.lineNumber ||
+          incrLocation.columnNumber != fullLocation.columnNumber) {
+        fail('At offset $offset ' +
+            '(${incrLocation.lineNumber}, ${incrLocation.columnNumber})' +
+            ' != ' +
+            '(${fullLocation.lineNumber}, ${fullLocation.columnNumber})');
+      }
+    }
+  }
+
+  /**
+   * Reset the analysis context to have the 'incremental' option set to the
+   * given value.
+   */
+  void _resetWithIncremental(bool enable) {
+    AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
+    analysisOptions.incremental = enable;
+    analysisOptions.incrementalApi = enable;
+//    log.logger = log.PRINT_LOGGER;
+    log.logger = log.NULL_LOGGER;
+    analysisContext2.analysisOptions = analysisOptions;
+  }
+
+  void _resolveUnit(String code) {
+    this.code = code;
+    source = addSource(code);
+    oldLibrary = resolve2(source);
+    oldUnit = resolveCompilationUnit(source, oldLibrary);
+    oldUnitElement = oldUnit.element;
+  }
+
+  void _runTasks() {
+    AnalysisResult result = analysisContext.performAnalysisTask();
+    while (result.changeNotices != null) {
+      result = analysisContext.performAnalysisTask();
+    }
+  }
+
+  void _updateAndValidate(String newCode,
+      {bool expectedSuccess: true, bool compareWithFull: true}) {
+    // Run any pending tasks tasks.
+    _runTasks();
+    // Update the source - currently this may cause incremental resolution.
+    // Then request the updated resolved unit.
+    _resetWithIncremental(true);
+    analysisContext2.setContents(source, newCode);
+    CompilationUnit newUnit = resolveCompilationUnit(source, oldLibrary);
+    List<AnalysisError> newErrors = analysisContext.computeErrors(source);
+    LineInfo newLineInfo = analysisContext.getLineInfo(source);
+    // check for expected failure
+    if (!expectedSuccess) {
+      expect(newUnit.element, isNot(same(oldUnitElement)));
+      return;
+    }
+    // The existing CompilationUnitElement should be updated.
+    expect(newUnit.element, same(oldUnitElement));
+    // The only expected pending task should return the same resolved
+    // "newUnit", so all clients will get it using the usual way.
+    AnalysisResult analysisResult = analysisContext.performAnalysisTask();
+    ChangeNotice notice = analysisResult.changeNotices[0];
+    expect(notice.resolvedDartUnit, same(newUnit));
+    // Resolve "newCode" from scratch.
+    if (compareWithFull) {
+      _resetWithIncremental(false);
+      source = addSource(newCode + ' ');
+      source = addSource(newCode);
+      _runTasks();
+      LibraryElement library = resolve2(source);
+      CompilationUnit fullNewUnit = resolveCompilationUnit(source, library);
+      // Validate tokens.
+      _assertEqualTokens(newUnit, fullNewUnit);
+      // Validate LineInfo
+      _assertEqualLineInfo(newLineInfo, analysisContext.getLineInfo(source));
+      // Validate that "incremental" and "full" units have the same resolution.
+      try {
+        assertSameResolution(newUnit, fullNewUnit, validateTypes: true);
+      } on IncrementalResolutionMismatch catch (mismatch) {
+        fail(mismatch.message);
+      }
+      List<AnalysisError> newFullErrors =
+          analysisContext.getErrors(source).errors;
+      _assertEqualErrors(newErrors, newFullErrors);
+    }
+  }
+
+  static void _assertEqualToken(Token incrToken, Token fullToken) {
+//    print('[${incrToken.offset}] |$incrToken| vs. [${fullToken.offset}] |$fullToken|');
+    expect(incrToken.type, fullToken.type);
+    expect(incrToken.offset, fullToken.offset);
+    expect(incrToken.length, fullToken.length);
+    expect(incrToken.lexeme, fullToken.lexeme);
+  }
+
+  static void _assertEqualTokens(
+      CompilationUnit incrUnit, CompilationUnit fullUnit) {
+    Token incrToken = incrUnit.beginToken;
+    Token fullToken = fullUnit.beginToken;
+    while (incrToken.type != TokenType.EOF && fullToken.type != TokenType.EOF) {
+      _assertEqualToken(incrToken, fullToken);
+      // comments
+      {
+        Token incrComment = incrToken.precedingComments;
+        Token fullComment = fullToken.precedingComments;
+        while (true) {
+          if (fullComment == null) {
+            expect(incrComment, isNull);
+            break;
+          }
+          expect(incrComment, isNotNull);
+          _assertEqualToken(incrComment, fullComment);
+          incrComment = incrComment.next;
+          fullComment = fullComment.next;
+        }
+      }
+      // next tokens
+      incrToken = incrToken.next;
+      fullToken = fullToken.next;
+    }
+  }
+}
+
+@reflectiveTest
+class ResolutionContextBuilderTest extends EngineTestCase {
+  GatheringErrorListener listener = new GatheringErrorListener();
+
+  void test_scopeFor_ClassDeclaration() {
+    Scope scope = _scopeFor(_createResolvedClassDeclaration());
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is LibraryScope, LibraryScope, scope);
+  }
+
+  void test_scopeFor_ClassTypeAlias() {
+    Scope scope = _scopeFor(_createResolvedClassTypeAlias());
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is LibraryScope, LibraryScope, scope);
+  }
+
+  void test_scopeFor_CompilationUnit() {
+    Scope scope = _scopeFor(_createResolvedCompilationUnit());
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is LibraryScope, LibraryScope, scope);
+  }
+
+  void test_scopeFor_ConstructorDeclaration() {
+    Scope scope = _scopeFor(_createResolvedConstructorDeclaration());
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ClassScope, ClassScope, scope);
+  }
+
+  void test_scopeFor_ConstructorDeclaration_parameters() {
+    Scope scope = _scopeFor(_createResolvedConstructorDeclaration().parameters);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is FunctionScope, FunctionScope, scope);
+  }
+
+  void test_scopeFor_FunctionDeclaration() {
+    Scope scope = _scopeFor(_createResolvedFunctionDeclaration());
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is LibraryScope, LibraryScope, scope);
+  }
+
+  void test_scopeFor_FunctionDeclaration_parameters() {
+    Scope scope = _scopeFor(
+        _createResolvedFunctionDeclaration().functionExpression.parameters);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is FunctionScope, FunctionScope, scope);
+  }
+
+  void test_scopeFor_FunctionTypeAlias() {
+    Scope scope = _scopeFor(_createResolvedFunctionTypeAlias());
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is LibraryScope, LibraryScope, scope);
+  }
+
+  void test_scopeFor_FunctionTypeAlias_parameters() {
+    Scope scope = _scopeFor(_createResolvedFunctionTypeAlias().parameters);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is FunctionTypeScope, FunctionTypeScope, scope);
+  }
+
+  void test_scopeFor_MethodDeclaration() {
+    Scope scope = _scopeFor(_createResolvedMethodDeclaration());
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ClassScope, ClassScope, scope);
+  }
+
+  void test_scopeFor_MethodDeclaration_body() {
+    Scope scope = _scopeFor(_createResolvedMethodDeclaration().body);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is FunctionScope, FunctionScope, scope);
+  }
+
+  void test_scopeFor_notInCompilationUnit() {
+    try {
+      _scopeFor(AstFactory.identifier3("x"));
+      fail("Expected AnalysisException");
+    } on AnalysisException {
+      // Expected
+    }
+  }
+
+  void test_scopeFor_null() {
+    try {
+      _scopeFor(null);
+      fail("Expected AnalysisException");
+    } on AnalysisException {
+      // Expected
+    }
+  }
+
+  void test_scopeFor_unresolved() {
+    try {
+      _scopeFor(AstFactory.compilationUnit());
+      fail("Expected AnalysisException");
+    } on AnalysisException {
+      // Expected
+    }
+  }
+
+  ClassDeclaration _createResolvedClassDeclaration() {
+    CompilationUnit unit = _createResolvedCompilationUnit();
+    String className = "C";
+    ClassDeclaration classNode = AstFactory.classDeclaration(
+        null, className, AstFactory.typeParameterList(), null, null, null);
+    unit.declarations.add(classNode);
+    ClassElement classElement = ElementFactory.classElement2(className);
+    classNode.name.staticElement = classElement;
+    (unit.element as CompilationUnitElementImpl).types = <ClassElement>[
+      classElement
+    ];
+    return classNode;
+  }
+
+  ClassTypeAlias _createResolvedClassTypeAlias() {
+    CompilationUnit unit = _createResolvedCompilationUnit();
+    String className = "C";
+    ClassTypeAlias classNode = AstFactory.classTypeAlias(
+        className, AstFactory.typeParameterList(), null, null, null, null);
+    unit.declarations.add(classNode);
+    ClassElement classElement = ElementFactory.classElement2(className);
+    classNode.name.staticElement = classElement;
+    (unit.element as CompilationUnitElementImpl).types = <ClassElement>[
+      classElement
+    ];
+    return classNode;
+  }
+
+  CompilationUnit _createResolvedCompilationUnit() {
+    CompilationUnit unit = AstFactory.compilationUnit();
+    LibraryElementImpl library =
+        ElementFactory.library(AnalysisContextFactory.contextWithCore(), "lib");
+    unit.element = library.definingCompilationUnit;
+    return unit;
+  }
+
+  ConstructorDeclaration _createResolvedConstructorDeclaration() {
+    ClassDeclaration classNode = _createResolvedClassDeclaration();
+    String constructorName = "f";
+    ConstructorDeclaration constructorNode = AstFactory.constructorDeclaration(
+        AstFactory.identifier3(constructorName),
+        null,
+        AstFactory.formalParameterList(),
+        null);
+    classNode.members.add(constructorNode);
+    ConstructorElement constructorElement =
+        ElementFactory.constructorElement2(classNode.element, null);
+    constructorNode.element = constructorElement;
+    (classNode.element as ClassElementImpl).constructors = <ConstructorElement>[
+      constructorElement
+    ];
+    return constructorNode;
+  }
+
+  FunctionDeclaration _createResolvedFunctionDeclaration() {
+    CompilationUnit unit = _createResolvedCompilationUnit();
+    String functionName = "f";
+    FunctionDeclaration functionNode = AstFactory.functionDeclaration(
+        null, null, functionName, AstFactory.functionExpression());
+    unit.declarations.add(functionNode);
+    FunctionElement functionElement =
+        ElementFactory.functionElement(functionName);
+    functionNode.name.staticElement = functionElement;
+    (unit.element as CompilationUnitElementImpl).functions = <FunctionElement>[
+      functionElement
+    ];
+    return functionNode;
+  }
+
+  FunctionTypeAlias _createResolvedFunctionTypeAlias() {
+    CompilationUnit unit = _createResolvedCompilationUnit();
+    FunctionTypeAlias aliasNode = AstFactory.typeAlias(
+        AstFactory.typeName4("A"),
+        "F",
+        AstFactory.typeParameterList(),
+        AstFactory.formalParameterList());
+    unit.declarations.add(aliasNode);
+    SimpleIdentifier aliasName = aliasNode.name;
+    FunctionTypeAliasElement aliasElement =
+        new FunctionTypeAliasElementImpl.forNode(aliasName);
+    aliasName.staticElement = aliasElement;
+    (unit.element as CompilationUnitElementImpl).typeAliases =
+        <FunctionTypeAliasElement>[aliasElement];
+    return aliasNode;
+  }
+
+  MethodDeclaration _createResolvedMethodDeclaration() {
+    ClassDeclaration classNode = _createResolvedClassDeclaration();
+    String methodName = "f";
+    MethodDeclaration methodNode = AstFactory.methodDeclaration(
+        null,
+        null,
+        null,
+        null,
+        AstFactory.identifier3(methodName),
+        AstFactory.formalParameterList());
+    classNode.members.add(methodNode);
+    MethodElement methodElement =
+        ElementFactory.methodElement(methodName, null);
+    methodNode.name.staticElement = methodElement;
+    (classNode.element as ClassElementImpl).methods = <MethodElement>[
+      methodElement
+    ];
+    return methodNode;
+  }
+
+  Scope _scopeFor(AstNode node) {
+    return ResolutionContextBuilder.contextFor(node, listener).scope;
+  }
+}
+
+class _Edit {
+  final int offset;
+  final int length;
+  final String replacement;
+  _Edit(this.offset, this.length, this.replacement);
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/incremental_scanner_test.dart b/mojo/public/dart/third_party/analyzer/test/generated/incremental_scanner_test.dart
new file mode 100644
index 0000000..6b72aa6
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/generated/incremental_scanner_test.dart
@@ -0,0 +1,545 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.incremental_scanner_test;
+
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/incremental_scanner.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+import '../utils.dart';
+import 'test_support.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(IncrementalScannerTest);
+}
+
+@reflectiveTest
+class IncrementalScannerTest extends EngineTestCase {
+  /**
+   * The first token from the token stream resulting from parsing the original
+   * source, or `null` if [scan] has not been invoked.
+   */
+  Token _originalTokens;
+
+  /**
+   * The scanner used to perform incremental scanning, or `null` if [scan] has
+   * not been invoked.
+   */
+  IncrementalScanner _incrementalScanner;
+
+  /**
+   * The first token from the token stream resulting from performing an
+   * incremental scan, or `null` if [scan] has not been invoked.
+   */
+  Token _incrementalTokens;
+
+  void fail_insert_beginning() {
+    // This is currently reporting the changed range as being from 0 to 5, but
+    // that would force us to re-parse both classes, which is clearly
+    // sub-optimal.
+    //
+    // "class B {}"
+    // "class A {} class B {}"
+    _scan("", "", "class A {} ", "class B {}");
+    _assertTokens(-1, 4, ["class", "A", "{", "}", "class", "B", "{", "}"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void fail_insert_comment_afterIdentifier() {
+    // "a + b"
+    // "a /* TODO */ + b"
+    _scan("a", "", " /* TODO */", " + b");
+    _assertTokens(0, 1, ["a", "+", "b"]);
+    _assertComments(1, ["/* TODO */"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isFalse);
+  }
+
+  void fail_insert_comment_beforeIdentifier() {
+    // "a + b"
+    // "a + /* TODO */ b"
+    _scan("a + ", "", "/* TODO */ ", "b");
+    _assertTokens(1, 2, ["a", "+", "b"]);
+    _assertComments(2, ["/* TODO */"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isFalse);
+  }
+
+  void fail_insert_inComment() {
+    // "a /* TO */ b"
+    // "a /* TODO */ b"
+    _scan("a /* TO", "", "DO", " */ b");
+    _assertTokens(0, 1, ["a", "b"]);
+    _assertComments(1, ["/* TODO */"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isFalse);
+  }
+
+  void test_delete_identifier_beginning() {
+    // "abs + b;"
+    // "s + b;"
+    _scan("", "ab", "", "s + b;");
+    _assertTokens(-1, 1, ["s", "+", "b", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_delete_identifier_end() {
+    // "abs + b;"
+    // "a + b;"
+    _scan("a", "bs", "", " + b;");
+    _assertTokens(-1, 1, ["a", "+", "b", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_delete_identifier_middle() {
+    // "abs + b;"
+    // "as + b;"
+    _scan("a", "b", "", "s + b;");
+    _assertTokens(-1, 1, ["as", "+", "b", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_delete_mergeTokens() {
+    // "a + b + c;"
+    // "ac;"
+    _scan("a", " + b + ", "", "c;");
+    _assertTokens(-1, 1, ["ac", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_delete_whitespace() {
+    // "a + b + c;"
+    // "a+ b + c;"
+    _scan("a", " ", "", "+ b + c;");
+    _assertTokens(1, 2, ["a", "+", "b", "+", "c", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isFalse);
+  }
+
+  void test_insert_convertOneFunctionToTwo_noOverlap() {
+    // "f() {}"
+    // "f() => 0; g() {}"
+    _scan("f()", "", " => 0; g()", " {}");
+    _assertTokens(
+        2, 9, ["f", "(", ")", "=>", "0", ";", "g", "(", ")", "{", "}"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_convertOneFunctionToTwo_overlap() {
+    // "f() {}"
+    // "f() {} g() {}"
+    _scan("f() {", "", "} g() {", "}");
+    _assertTokens(4, 10, ["f", "(", ")", "{", "}", "g", "(", ")", "{", "}"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_end() {
+    // "class A {}"
+    // "class A {} class B {}"
+    _scan("class A {}", "", " class B {}", "");
+    _assertTokens(3, 8, ["class", "A", "{", "}", "class", "B", "{", "}"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_identifierAndPeriod() {
+    // "a + b;"
+    // "a + x.b;"
+    _scan("a + ", "", "x.", "b;");
+    _assertTokens(1, 4, ["a", "+", "x", ".", "b", ";"]);
+  }
+
+  void test_insert_inIdentifier_left_firstToken() {
+    // "a + b;"
+    // "xa + b;"
+    _scan("", "", "x", "a + b;");
+    _assertTokens(-1, 1, ["xa", "+", "b", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_inIdentifier_left_lastToken() {
+    // "a + b"
+    // "a + xb"
+    _scan("a + ", "", "x", "b");
+    _assertTokens(1, 3, ["a", "+", "xb"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_inIdentifier_left_middleToken() {
+    // "a + b;"
+    // "a + xb;"
+    _scan("a + ", "", "x", "b;");
+    _assertTokens(1, 3, ["a", "+", "xb", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_inIdentifier_middle() {
+    // "cat;"
+    // "cart;"
+    _scan("ca", "", "r", "t;");
+    _assertTokens(-1, 1, ["cart", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_inIdentifier_right_firstToken() {
+    // "a + b;"
+    // "abs + b;"
+    _scan("a", "", "bs", " + b;");
+    _assertTokens(-1, 1, ["abs", "+", "b", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_inIdentifier_right_lastToken() {
+    // "a + b"
+    // "a + bc"
+    _scan("a + b", "", "c", "");
+    _assertTokens(1, 3, ["a", "+", "bc"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_inIdentifier_right_middleToken() {
+    // "a + b;"
+    // "a + by;"
+    _scan("a + b", "", "y", ";");
+    _assertTokens(1, 3, ["a", "+", "by", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_newIdentifier_noSpaceBefore() {
+    // "a; c;"
+    // "a;b c;"
+    _scan("a;", "", "b", " c;");
+    _assertTokens(1, 3, ["a", ";", "b", "c", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_newIdentifier_spaceBefore() {
+    // "a; c;"
+    // "a; b c;"
+    _scan("a; ", "", "b ", "c;");
+    _assertTokens(1, 3, ["a", ";", "b", "c", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_period_afterIdentifier() {
+    // "a + b;"
+    // "a + b.;"
+    _scan("a + b", "", ".", ";");
+    _assertTokens(2, 4, ["a", "+", "b", ".", ";"]);
+  }
+
+  void test_insert_period_betweenIdentifiers_left() {
+    // "a b;"
+    // "a. b;"
+    _scan("a", "", ".", " b;");
+    _assertTokens(0, 2, ["a", ".", "b", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_period_betweenIdentifiers_middle() {
+    // "a  b;"
+    // "a . b;"
+    _scan("a ", "", ".", " b;");
+    _assertTokens(0, 2, ["a", ".", "b", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_period_betweenIdentifiers_right() {
+    // "a b;"
+    // "a .b;"
+    _scan("a ", "", ".", "b;");
+    _assertTokens(0, 2, ["a", ".", "b", ";"]);
+  }
+
+  void test_insert_period_insideExistingIdentifier() {
+    // "ab;"
+    // "a.b;"
+    _scan("a", "", ".", "b;");
+    _assertTokens(-1, 3, ["a", ".", "b", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_periodAndIdentifier() {
+    // "a + b;"
+    // "a + b.x;"
+    _scan("a + b", "", ".x", ";");
+    _assertTokens(2, 5, ["a", "+", "b", ".", "x", ";"]);
+  }
+
+  void test_insert_splitIdentifier() {
+    // "cob;"
+    // "cow.b;"
+    _scan("co", "", "w.", "b;");
+    _assertTokens(-1, 3, ["cow", ".", "b", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_tokens_within_whitespace() {
+    // "a      ;"
+    // "a   +b   ;"
+    _scan("a   ", "", "+b", "   ;");
+    _assertTokens(0, 3, ["a", "+", "b", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_whitespace_beginning_beforeToken() {
+    // "a + b;"
+    // " a + b;"
+    _scan("", "", " ", "a + b;");
+    _assertTokens(0, 1, ["a", "+", "b", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isFalse);
+  }
+
+  void test_insert_whitespace_betweenTokens() {
+    // "a + b;"
+    // "a  + b;"
+    _scan("a ", "", " ", "+ b;");
+    _assertTokens(1, 2, ["a", "+", "b", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isFalse);
+  }
+
+  void test_insert_whitespace_end_afterToken() {
+    // "a + b;"
+    // "a + b; "
+    _scan("a + b;", "", " ", "");
+    _assertTokens(3, 4, ["a", "+", "b", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isFalse);
+  }
+
+  void test_insert_whitespace_end_afterWhitespace() {
+    // "a + b; "
+    // "a + b;  "
+    _scan("a + b; ", "", " ", "");
+    _assertTokens(3, 4, ["a", "+", "b", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isFalse);
+  }
+
+  void test_insert_whitespace_withMultipleComments() {
+    // "//comment1", "//comment2", "a + b;"
+    // "//comment1", "//comment2", "a  + b;"
+    _scan(
+        r'''
+//comment1
+//comment2
+a''',
+        "",
+        " ",
+        " + b;");
+    _assertTokens(1, 2, ["a", "+", "b", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isFalse);
+  }
+
+  void test_replace_identifier_beginning() {
+    // "bell + b;"
+    // "fell + b;"
+    _scan("", "b", "f", "ell + b;");
+    _assertTokens(-1, 1, ["fell", "+", "b", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_replace_identifier_end() {
+    // "bell + b;"
+    // "belt + b;"
+    _scan("bel", "l", "t", " + b;");
+    _assertTokens(-1, 1, ["belt", "+", "b", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_replace_identifier_middle() {
+    // "first + b;"
+    // "frost + b;"
+    _scan("f", "ir", "ro", "st + b;");
+    _assertTokens(-1, 1, ["frost", "+", "b", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_replace_multiple_partialFirstAndLast() {
+    // "aa + bb;"
+    // "ab * ab;"
+    _scan("a", "a + b", "b * a", "b;");
+    _assertTokens(-1, 3, ["ab", "*", "ab", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_replace_operator_oneForMany() {
+    // "a + b;"
+    // "a * c - b;"
+    _scan("a ", "+", "* c -", " b;");
+    _assertTokens(0, 4, ["a", "*", "c", "-", "b", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_replace_operator_oneForOne() {
+    // "a + b;"
+    // "a * b;"
+    _scan("a ", "+", "*", " b;");
+    _assertTokens(0, 2, ["a", "*", "b", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  /**
+   * Assert that the comments associated with the token at the given [index]
+   * have lexemes that match the given list of lexemes, both in number and in
+   * content.
+   */
+  void _assertComments(int index, List<String> lexemes) {
+    Token token = _incrementalTokens;
+    for (int i = 0; i < index; i++) {
+      token = token.next;
+    }
+    Token comment = token.precedingComments;
+    if (lexemes.isEmpty) {
+      expect(comment, isNull,
+          reason: "No comments expected but comments found");
+    }
+    int count = 0;
+    for (String lexeme in lexemes) {
+      if (comment == null) {
+        fail("Expected ${lexemes.length} comments but found $count");
+      }
+      expect(comment.lexeme, lexeme);
+      count++;
+      comment = comment.next;
+    }
+    if (comment != null) {
+      while (comment != null) {
+        count++;
+        comment = comment.next;
+      }
+      fail("Expected ${lexemes.length} comments but found $count");
+    }
+  }
+
+  /**
+   * Assert that the [expected] token is equal to the [actual] token.
+   */
+  void _assertEqualTokens(Token actual, Token expected) {
+    expect(actual.type, same(expected.type), reason: "Wrong type for token");
+    expect(actual.lexeme, expected.lexeme, reason: "Wrong lexeme for token");
+    expect(actual.offset, expected.offset,
+        reason:
+            "Wrong offset for token ('${actual.lexeme}' != '${expected.lexeme}')");
+    expect(actual.length, expected.length,
+        reason:
+            "Wrong length for token ('${actual.lexeme}' != '${expected.lexeme}')");
+  }
+
+  /**
+   * Assert that the result of the incremental scan matches the given list of
+   * [lexemes] and that the left and right tokens correspond to the tokens at
+   * the [leftIndex] and [rightIndex].
+   */
+  void _assertTokens(int leftIndex, int rightIndex, List<String> lexemes) {
+    int count = lexemes.length;
+    expect(leftIndex >= -1 && leftIndex < count, isTrue,
+        reason: "Invalid left index");
+    expect(rightIndex >= 0 && rightIndex <= count, isTrue,
+        reason: "Invalid right index");
+    Token leftToken = null;
+    Token rightToken = null;
+    Token token = _incrementalTokens;
+    if (leftIndex < 0) {
+      leftToken = token.previous;
+    }
+    for (int i = 0; i < count; i++) {
+      expect(token.lexeme, lexemes[i]);
+      if (i == leftIndex) {
+        leftToken = token;
+      }
+      if (i == rightIndex) {
+        rightToken = token;
+      }
+      token = token.next;
+    }
+    if (rightIndex >= count) {
+      rightToken = token;
+    }
+    expect(token.type, same(TokenType.EOF), reason: "Too many tokens");
+    if (leftIndex >= 0) {
+      expect(leftToken, isNotNull);
+    }
+    expect(_incrementalScanner.leftToken, same(leftToken),
+        reason: "Invalid left token");
+    if (rightIndex >= 0) {
+      expect(rightToken, isNotNull);
+    }
+    expect(_incrementalScanner.rightToken, same(rightToken),
+        reason: "Invalid right token");
+  }
+
+  /**
+   * Given a description of the original and modified contents, perform an
+   * incremental scan of the two pieces of text. Verify that the incremental
+   * scan produced the same tokens as those that would be produced by a full
+   * scan of the new contents.
+   *
+   * The original content is the concatenation of the [prefix], [removed] and
+   * [suffix] fragments. The modeified content is the concatenation of the
+   * [prefix], [added] and [suffix] fragments.
+   */
+  void _scan(String prefix, String removed, String added, String suffix) {
+    //
+    // Compute the information needed to perform the test.
+    //
+    String originalContents = "$prefix$removed$suffix";
+    String modifiedContents = "$prefix$added$suffix";
+    int replaceStart = prefix.length;
+    Source source = new TestSource();
+    //
+    // Scan the original contents.
+    //
+    GatheringErrorListener originalListener = new GatheringErrorListener();
+    Scanner originalScanner = new Scanner(
+        source, new CharSequenceReader(originalContents), originalListener);
+    _originalTokens = originalScanner.tokenize();
+    expect(_originalTokens, isNotNull);
+    //
+    // Scan the modified contents.
+    //
+    GatheringErrorListener modifiedListener = new GatheringErrorListener();
+    Scanner modifiedScanner = new Scanner(
+        source, new CharSequenceReader(modifiedContents), modifiedListener);
+    Token modifiedTokens = modifiedScanner.tokenize();
+    expect(modifiedTokens, isNotNull);
+    //
+    // Incrementally scan the modified contents.
+    //
+    GatheringErrorListener incrementalListener = new GatheringErrorListener();
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    _incrementalScanner = new IncrementalScanner(source,
+        new CharSequenceReader(modifiedContents), incrementalListener, options);
+    _incrementalTokens = _incrementalScanner.rescan(
+        _originalTokens, replaceStart, removed.length, added.length);
+    //
+    // Validate that the results of the incremental scan are the same as the
+    // full scan of the modified source.
+    //
+    Token incrementalToken = _incrementalTokens;
+    expect(incrementalToken, isNotNull);
+    while (incrementalToken.type != TokenType.EOF &&
+        modifiedTokens.type != TokenType.EOF) {
+      _assertEqualTokens(incrementalToken, modifiedTokens);
+      Token incrementalComment = incrementalToken.precedingComments;
+      Token modifiedComment = modifiedTokens.precedingComments;
+      while (incrementalComment != null && modifiedComment != null) {
+        _assertEqualTokens(incrementalComment, modifiedComment);
+        incrementalComment = incrementalComment.next;
+        modifiedComment = modifiedComment.next;
+      }
+      expect(incrementalComment, isNull,
+          reason:
+              "Too many comment tokens preceeding '${incrementalToken.lexeme}'");
+      expect(modifiedComment, isNull,
+          reason:
+              "Not enough comment tokens preceeding '${incrementalToken.lexeme}'");
+      incrementalToken = incrementalToken.next;
+      modifiedTokens = modifiedTokens.next;
+    }
+    expect(incrementalToken.type, same(TokenType.EOF),
+        reason: "Too many tokens");
+    expect(modifiedTokens.type, same(TokenType.EOF),
+        reason: "Not enough tokens");
+    // TODO(brianwilkerson) Verify that the errors are correct?
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/java_core_test.dart b/mojo/public/dart/third_party/analyzer/test/generated/java_core_test.dart
new file mode 100644
index 0000000..e60e9c1
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/generated/java_core_test.dart
@@ -0,0 +1,155 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.java_core_test;
+
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:unittest/unittest.dart';
+
+import '../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  group('Character', () {
+    group('isDigit', () {
+      test('digits', () {
+        expect(Character.isDigit('0'.codeUnitAt(0)), isTrue);
+        expect(Character.isDigit('1'.codeUnitAt(0)), isTrue);
+        expect(Character.isDigit('9'.codeUnitAt(0)), isTrue);
+      });
+
+      test('letters', () {
+        expect(Character.isDigit('a'.codeUnitAt(0)), isFalse);
+        expect(Character.isDigit('b'.codeUnitAt(0)), isFalse);
+        expect(Character.isDigit('z'.codeUnitAt(0)), isFalse);
+        expect(Character.isDigit('C'.codeUnitAt(0)), isFalse);
+        expect(Character.isDigit('D'.codeUnitAt(0)), isFalse);
+        expect(Character.isDigit('Y'.codeUnitAt(0)), isFalse);
+      });
+
+      test('other', () {
+        expect(Character.isDigit(' '.codeUnitAt(0)), isFalse);
+        expect(Character.isDigit('.'.codeUnitAt(0)), isFalse);
+        expect(Character.isDigit('-'.codeUnitAt(0)), isFalse);
+        expect(Character.isDigit('+'.codeUnitAt(0)), isFalse);
+      });
+    });
+
+    group('isLetter', () {
+      test('digits', () {
+        expect(Character.isLetter('0'.codeUnitAt(0)), isFalse);
+        expect(Character.isLetter('1'.codeUnitAt(0)), isFalse);
+        expect(Character.isLetter('9'.codeUnitAt(0)), isFalse);
+      });
+
+      test('letters', () {
+        expect(Character.isLetter('a'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetter('b'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetter('z'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetter('C'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetter('D'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetter('Y'.codeUnitAt(0)), isTrue);
+      });
+
+      test('other', () {
+        expect(Character.isLetter(' '.codeUnitAt(0)), isFalse);
+        expect(Character.isLetter('.'.codeUnitAt(0)), isFalse);
+        expect(Character.isLetter('-'.codeUnitAt(0)), isFalse);
+        expect(Character.isLetter('+'.codeUnitAt(0)), isFalse);
+      });
+    });
+
+    group('isLetterOrDigit', () {
+      test('digits', () {
+        expect(Character.isLetterOrDigit('0'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetterOrDigit('1'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetterOrDigit('9'.codeUnitAt(0)), isTrue);
+      });
+
+      test('letters', () {
+        expect(Character.isLetterOrDigit('a'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetterOrDigit('b'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetterOrDigit('z'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetterOrDigit('C'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetterOrDigit('D'.codeUnitAt(0)), isTrue);
+        expect(Character.isLetterOrDigit('Y'.codeUnitAt(0)), isTrue);
+      });
+
+      test('other', () {
+        expect(Character.isLetterOrDigit(' '.codeUnitAt(0)), isFalse);
+        expect(Character.isLetterOrDigit('.'.codeUnitAt(0)), isFalse);
+        expect(Character.isLetterOrDigit('-'.codeUnitAt(0)), isFalse);
+        expect(Character.isLetterOrDigit('+'.codeUnitAt(0)), isFalse);
+      });
+    });
+
+    group('isLowerCase', () {
+      test('ASCII digits', () {
+        expect(Character.isLowerCase('0'.codeUnitAt(0)), isFalse);
+        expect(Character.isLowerCase('9'.codeUnitAt(0)), isFalse);
+      });
+
+      test('ASCII lower', () {
+        expect(Character.isLowerCase('a'.codeUnitAt(0)), isTrue);
+        expect(Character.isLowerCase('s'.codeUnitAt(0)), isTrue);
+        expect(Character.isLowerCase('z'.codeUnitAt(0)), isTrue);
+      });
+
+      test('ASCII upper', () {
+        expect(Character.isLowerCase('A'.codeUnitAt(0)), isFalse);
+        expect(Character.isLowerCase('S'.codeUnitAt(0)), isFalse);
+        expect(Character.isLowerCase('Z'.codeUnitAt(0)), isFalse);
+      });
+    });
+
+    group('isUpperCase', () {
+      test('ASCII digits', () {
+        expect(Character.isUpperCase('0'.codeUnitAt(0)), isFalse);
+        expect(Character.isUpperCase('9'.codeUnitAt(0)), isFalse);
+      });
+
+      test('ASCII lower', () {
+        expect(Character.isUpperCase('a'.codeUnitAt(0)), isFalse);
+        expect(Character.isUpperCase('s'.codeUnitAt(0)), isFalse);
+        expect(Character.isUpperCase('z'.codeUnitAt(0)), isFalse);
+      });
+
+      test('ASCII upper', () {
+        expect(Character.isUpperCase('A'.codeUnitAt(0)), isTrue);
+        expect(Character.isUpperCase('S'.codeUnitAt(0)), isTrue);
+        expect(Character.isUpperCase('Z'.codeUnitAt(0)), isTrue);
+      });
+    });
+
+    test('toLowerCase', () {
+      expect(Character.toLowerCase('A'.codeUnitAt(0)), 'a'.codeUnitAt(0));
+      expect(Character.toLowerCase('B'.codeUnitAt(0)), 'b'.codeUnitAt(0));
+      expect(Character.toLowerCase('Z'.codeUnitAt(0)), 'z'.codeUnitAt(0));
+      expect(Character.toLowerCase('c'.codeUnitAt(0)), 'c'.codeUnitAt(0));
+      expect(Character.toLowerCase('0'.codeUnitAt(0)), '0'.codeUnitAt(0));
+    });
+
+    test('toUpperCase', () {
+      expect(Character.toUpperCase('a'.codeUnitAt(0)), 'A'.codeUnitAt(0));
+      expect(Character.toUpperCase('b'.codeUnitAt(0)), 'B'.codeUnitAt(0));
+      expect(Character.toUpperCase('z'.codeUnitAt(0)), 'Z'.codeUnitAt(0));
+      expect(Character.toUpperCase('C'.codeUnitAt(0)), 'C'.codeUnitAt(0));
+      expect(Character.toUpperCase('0'.codeUnitAt(0)), '0'.codeUnitAt(0));
+    });
+
+    test('isWhitespace', () {
+      expect(Character.isWhitespace('\t'.codeUnitAt(0)), isTrue);
+      expect(Character.isWhitespace(' '.codeUnitAt(0)), isTrue);
+      expect(Character.isWhitespace('\n'.codeUnitAt(0)), isTrue);
+      expect(Character.isWhitespace('\r'.codeUnitAt(0)), isTrue);
+      expect(Character.isWhitespace('.'.codeUnitAt(0)), isFalse);
+      expect(Character.isWhitespace('0'.codeUnitAt(0)), isFalse);
+      expect(Character.isWhitespace('9'.codeUnitAt(0)), isFalse);
+      expect(Character.isWhitespace('a'.codeUnitAt(0)), isFalse);
+      expect(Character.isWhitespace('z'.codeUnitAt(0)), isFalse);
+      expect(Character.isWhitespace('A'.codeUnitAt(0)), isFalse);
+      expect(Character.isWhitespace('Z'.codeUnitAt(0)), isFalse);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/java_io_test.dart b/mojo/public/dart/third_party/analyzer/test/generated/java_io_test.dart
new file mode 100644
index 0000000..0a46feb
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/generated/java_io_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.java_io_test;
+
+import 'dart:io';
+
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:unittest/unittest.dart';
+
+import '../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  group('JavaFile', () {
+    group('toURI', () {
+      test('forAbsolute', () {
+        String tempPath = '/temp';
+        String path = JavaFile.pathContext.join(tempPath, 'foo.dart');
+        // we use an absolute path
+        expect(JavaFile.pathContext.isAbsolute(path), isTrue,
+            reason: '"$path" is not absolute');
+        // test that toURI() returns an absolute URI
+        Uri uri = new JavaFile(path).toURI();
+        expect(uri.isAbsolute, isTrue);
+        expect(uri.scheme, 'file');
+      });
+      test('forRelative', () {
+        String tempPath = '/temp';
+        String path = JavaFile.pathContext.join(tempPath, 'foo.dart');
+        expect(JavaFile.pathContext.isAbsolute(path), isTrue,
+            reason: '"$path" is not absolute');
+        // prepare a relative path
+        // We should not check that "relPath" is actually relative -
+        // it may be not on Windows, if "temp" is on other disk.
+        String relPath = JavaFile.pathContext.relative(path);
+        // test that toURI() returns an absolute URI
+        Uri uri = new JavaFile(relPath).toURI();
+        expect(uri.isAbsolute, isTrue);
+        expect(uri.scheme, 'file');
+      });
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/non_error_resolver_test.dart b/mojo/public/dart/third_party/analyzer/test/generated/non_error_resolver_test.dart
new file mode 100644
index 0000000..dedbb2a
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/generated/non_error_resolver_test.dart
@@ -0,0 +1,5763 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.non_error_resolver_test;
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+import '../utils.dart';
+import 'resolver_test.dart';
+import 'test_support.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(NonErrorResolverTest);
+}
+
+@reflectiveTest
+class NonErrorResolverTest extends ResolverTestCase {
+  void fail_undefinedEnumConstant() {
+    Source source = addSource(r'''
+enum E { ONE }
+E e() {
+  return E.TWO;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_ambiguousExport() {
+    Source source = addSource(r'''
+library L;
+export 'lib1.dart';
+export 'lib2.dart';''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class M {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+class N {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_ambiguousExport_combinators_hide() {
+    Source source = addSource(r'''
+library L;
+export 'lib1.dart';
+export 'lib2.dart' hide B;''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library L1;
+class A {}
+class B {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library L2;
+class B {}
+class C {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_ambiguousExport_combinators_show() {
+    Source source = addSource(r'''
+library L;
+export 'lib1.dart';
+export 'lib2.dart' show C;''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library L1;
+class A {}
+class B {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library L2;
+class B {}
+class C {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_ambiguousExport_sameDeclaration() {
+    Source source = addSource(r'''
+library L;
+export 'lib.dart';
+export 'lib.dart';''');
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+class N {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_ambiguousImport_hideCombinator() {
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+import 'lib3.dart' hide N;
+main() {
+  new N1();
+  new N2();
+  new N3();
+}''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class N {}
+class N1 {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+class N {}
+class N2 {}''');
+    addNamedSource(
+        "/lib3.dart",
+        r'''
+library lib3;
+class N {}
+class N3 {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_ambiguousImport_showCombinator() {
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart' show N, N2;
+main() {
+  new N1();
+  new N2();
+}''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class N {}
+class N1 {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+class N {}
+class N2 {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_argumentTypeNotAssignable_classWithCall_Function() {
+    Source source = addSource(r'''
+  caller(Function callee) {
+    callee();
+  }
+
+  class CallMeBack {
+    call() => 0;
+  }
+
+  main() {
+    caller(new CallMeBack());
+  }''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_fieldFormalParameterElement_member() {
+    Source source = addSource(r'''
+class ObjectSink<T> {
+  void sink(T object) {
+    new TimestampedObject<T>(object);
+  }
+}
+class TimestampedObject<E> {
+  E object2;
+  TimestampedObject(this.object2);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_invocation_functionParameter_generic() {
+    Source source = addSource(r'''
+class A<K> {
+  m(f(K k), K v) {
+    f(v);
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_invocation_typedef_generic() {
+    Source source = addSource(r'''
+typedef A<T>(T p);
+f(A<int> a) {
+  a(1);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_Object_Function() {
+    Source source = addSource(r'''
+main() {
+  process(() {});
+}
+process(Object x) {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_typedef_local() {
+    Source source = addSource(r'''
+typedef A(int p1, String p2);
+A getA() => null;
+f() {
+  A a = getA();
+  a(1, '2');
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_typedef_parameter() {
+    Source source = addSource(r'''
+typedef A(int p1, String p2);
+f(A a) {
+  a(1, '2');
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_assignability_function_expr_rettype_from_typedef_cls() {
+    // In the code below, the type of (() => f()) has a return type which is
+    // a class, and that class is inferred from the return type of the typedef
+    // F.
+    Source source = addSource('''
+class C {}
+typedef C F();
+F f;
+main() {
+  F f2 = (() => f());
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_assignability_function_expr_rettype_from_typedef_typedef() {
+    // In the code below, the type of (() => f()) has a return type which is
+    // a typedef, and that typedef is inferred from the return type of the
+    // typedef F.
+    Source source = addSource('''
+typedef G F();
+typedef G();
+F f;
+main() {
+  F f2 = (() => f());
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_assignmentToFinal_prefixNegate() {
+    Source source = addSource(r'''
+f() {
+  final x = 0;
+  -x;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_assignmentToFinalNoSetter_prefixedIdentifier() {
+    Source source = addSource(r'''
+class A {
+  int get x => 0;
+  set x(v) {}
+}
+main() {
+  A a = new A();
+  a.x = 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_assignmentToFinalNoSetter_propertyAccess() {
+    Source source = addSource(r'''
+class A {
+  int get x => 0;
+  set x(v) {}
+}
+class B {
+  static A a;
+}
+main() {
+  B.a.x = 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_assignmentToFinals_importWithPrefix() {
+    Source source = addSource(r'''
+library lib;
+import 'lib1.dart' as foo;
+main() {
+  foo.x = true;
+}''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+bool x = false;''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_dynamic_with_return() {
+    Source source = addSource('''
+dynamic f() async {
+  return;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_dynamic_with_return_value() {
+    Source source = addSource('''
+dynamic f() async {
+  return 5;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_dynamic_without_return() {
+    Source source = addSource('''
+dynamic f() async {}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_expression_function_type() {
+    Source source = addSource('''
+import 'dart:async';
+typedef Future<int> F(int i);
+main() {
+  F f = (int i) async => i;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_flattened() {
+    Source source = addSource('''
+import 'dart:async';
+typedef Future<int> CreatesFutureInt();
+main() {
+  CreatesFutureInt createFutureInt = () async => f();
+  Future<int> futureInt = createFutureInt();
+  futureInt.then((int i) => print(i));
+}
+Future<int> f() => null;
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_future_dynamic_with_return() {
+    Source source = addSource('''
+import 'dart:async';
+Future<dynamic> f() async {
+  return;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_future_dynamic_with_return_value() {
+    Source source = addSource('''
+import 'dart:async';
+Future<dynamic> f() async {
+  return 5;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_future_dynamic_without_return() {
+    Source source = addSource('''
+import 'dart:async';
+Future<dynamic> f() async {}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_future_int_with_return_future_int() {
+    Source source = addSource('''
+import 'dart:async';
+Future<int> f() async {
+  return new Future<int>.value(5);
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_future_int_with_return_value() {
+    Source source = addSource('''
+import 'dart:async';
+Future<int> f() async {
+  return 5;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_future_null_with_return() {
+    Source source = addSource('''
+import 'dart:async';
+Future<Null> f() async {
+  return;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_future_null_without_return() {
+    Source source = addSource('''
+import 'dart:async';
+Future<Null> f() async {}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_future_object_with_return() {
+    Source source = addSource('''
+import 'dart:async';
+Future<Object> f() async {
+  return;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_future_object_with_return_value() {
+    Source source = addSource('''
+import 'dart:async';
+Future<Object> f() async {
+  return 5;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_future_object_without_return() {
+    Source source = addSource('''
+import 'dart:async';
+Future<Object> f() async {}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_future_with_return() {
+    Source source = addSource('''
+import 'dart:async';
+Future f() async {
+  return;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_future_with_return_value() {
+    Source source = addSource('''
+import 'dart:async';
+Future f() async {
+  return 5;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_future_without_return() {
+    Source source = addSource('''
+import 'dart:async';
+Future f() async {}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_return_flattens_futures() {
+    Source source = addSource('''
+import 'dart:async';
+Future<int> f() async {
+  return g();
+}
+Future<Future<int>> g() => null;
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_with_return() {
+    Source source = addSource('''
+f() async {
+  return;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_with_return_value() {
+    Source source = addSource('''
+f() async {
+  return 5;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_async_without_return() {
+    Source source = addSource('''
+f() async {}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_asyncForInWrongContext_async() {
+    Source source = addSource(r'''
+f(list) async {
+  await for (var e in list) {
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_asyncForInWrongContext_asyncStar() {
+    Source source = addSource(r'''
+f(list) async* {
+  await for (var e in list) {
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_await_flattened() {
+    Source source = addSource('''
+import 'dart:async';
+Future<Future<int>> ffi() => null;
+f() async {
+  int b = await ffi();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_await_simple() {
+    Source source = addSource('''
+import 'dart:async';
+Future<int> fi() => null;
+f() async {
+  int a = await fi();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_awaitInWrongContext_async() {
+    Source source = addSource(r'''
+f(x, y) async {
+  return await x + await y;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_awaitInWrongContext_asyncStar() {
+    Source source = addSource(r'''
+f(x, y) async* {
+  yield await x + await y;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_breakWithoutLabelInSwitch() {
+    Source source = addSource(r'''
+class A {
+  void m(int i) {
+    switch (i) {
+      case 0:
+        break;
+    }
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_builtInIdentifierAsType_dynamic() {
+    Source source = addSource(r'''
+f() {
+  dynamic x;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_caseBlockNotTerminated() {
+    Source source = addSource(r'''
+f(int p) {
+  for (int i = 0; i < 10; i++) {
+    switch (p) {
+      case 0:
+        break;
+      case 1:
+        continue;
+      case 2:
+        return;
+      case 3:
+        throw new Object();
+      case 4:
+      case 5:
+        return;
+      case 6:
+      default:
+        return;
+    }
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_caseBlockNotTerminated_lastCase() {
+    Source source = addSource(r'''
+f(int p) {
+  switch (p) {
+    case 0:
+      p = p + 1;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_caseExpressionTypeImplementsEquals() {
+    Source source = addSource(r'''
+print(p) {}
+
+abstract class B {
+  final id;
+  const B(this.id);
+  String toString() => 'C($id)';
+  /** Equality is identity equality, the id isn't used. */
+  bool operator==(Object other);
+  }
+
+class C extends B {
+  const C(id) : super(id);
+}
+
+void doSwitch(c) {
+  switch (c) {
+  case const C(0): print('Switch: 0'); break;
+  case const C(1): print('Switch: 1'); break;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_caseExpressionTypeImplementsEquals_int() {
+    Source source = addSource(r'''
+f(int i) {
+  switch(i) {
+    case(1) : return 1;
+    default: return 0;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_caseExpressionTypeImplementsEquals_Object() {
+    Source source = addSource(r'''
+class IntWrapper {
+  final int value;
+  const IntWrapper(this.value);
+}
+
+f(IntWrapper intWrapper) {
+  switch(intWrapper) {
+    case(const IntWrapper(1)) : return 1;
+    default: return 0;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_caseExpressionTypeImplementsEquals_String() {
+    Source source = addSource(r'''
+f(String s) {
+  switch(s) {
+    case('1') : return 1;
+    default: return 0;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_commentReference_beforeConstructor() {
+    String code = r'''
+abstract class A {
+  /// [p]
+  A(int p) {}
+}''';
+    Source source = addSource(code);
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = _getResolvedLibraryUnit(source);
+    {
+      SimpleIdentifier ref = EngineTestCase.findNode(
+          unit, code, "p]", (node) => node is SimpleIdentifier);
+      EngineTestCase.assertInstanceOf((obj) => obj is ParameterElement,
+          ParameterElement, ref.staticElement);
+    }
+  }
+
+  void test_commentReference_beforeEnum() {
+    String code = r'''
+/// This is the [Samurai] kind.
+enum Samurai {
+  /// Use [int].
+  WITH_SWORD,
+  /// Like [WITH_SWORD], but only without one.
+  WITHOUT_SWORD
+}''';
+    Source source = addSource(code);
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = _getResolvedLibraryUnit(source);
+    {
+      SimpleIdentifier ref = EngineTestCase.findNode(
+          unit, code, "Samurai]", (node) => node is SimpleIdentifier);
+      ClassElement refElement = ref.staticElement;
+      expect(refElement, isNotNull);
+      expect(refElement.name, 'Samurai');
+    }
+    {
+      SimpleIdentifier ref = EngineTestCase.findNode(
+          unit, code, "int]", (node) => node is SimpleIdentifier);
+      ClassElement refElement = ref.staticElement;
+      expect(refElement, isNotNull);
+      expect(refElement.name, 'int');
+    }
+    {
+      SimpleIdentifier ref = EngineTestCase.findNode(
+          unit, code, "WITH_SWORD]", (node) => node is SimpleIdentifier);
+      PropertyAccessorElement refElement = ref.staticElement;
+      expect(refElement, isNotNull);
+      expect(refElement.name, 'WITH_SWORD');
+    }
+  }
+
+  void test_commentReference_beforeFunction_blockBody() {
+    String code = r'''
+/// [p]
+foo(int p) {
+}''';
+    Source source = addSource(code);
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = _getResolvedLibraryUnit(source);
+    SimpleIdentifier ref = EngineTestCase.findNode(
+        unit, code, "p]", (node) => node is SimpleIdentifier);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ParameterElement, ParameterElement, ref.staticElement);
+  }
+
+  void test_commentReference_beforeFunction_expressionBody() {
+    String code = r'''
+/// [p]
+foo(int p) => null;''';
+    Source source = addSource(code);
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = _getResolvedLibraryUnit(source);
+    SimpleIdentifier ref = EngineTestCase.findNode(
+        unit, code, "p]", (node) => node is SimpleIdentifier);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ParameterElement, ParameterElement, ref.staticElement);
+  }
+
+  void test_commentReference_beforeMethod() {
+    String code = r'''
+abstract class A {
+  /// [p1]
+  ma(int p1) {}
+  /// [p2]
+  mb(int p2);
+}''';
+    Source source = addSource(code);
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = _getResolvedLibraryUnit(source);
+    {
+      SimpleIdentifier ref = EngineTestCase.findNode(
+          unit, code, "p1]", (node) => node is SimpleIdentifier);
+      EngineTestCase.assertInstanceOf((obj) => obj is ParameterElement,
+          ParameterElement, ref.staticElement);
+    }
+    {
+      SimpleIdentifier ref = EngineTestCase.findNode(
+          unit, code, "p2]", (node) => node is SimpleIdentifier);
+      EngineTestCase.assertInstanceOf((obj) => obj is ParameterElement,
+          ParameterElement, ref.staticElement);
+    }
+  }
+
+  void test_commentReference_class() {
+    String code = r'''
+/// [foo]
+class A {
+  foo() {}
+}''';
+    Source source = addSource(code);
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = _getResolvedLibraryUnit(source);
+    SimpleIdentifier ref = EngineTestCase.findNode(
+        unit, code, "foo]", (node) => node is SimpleIdentifier);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodElement, MethodElement, ref.staticElement);
+  }
+
+  void test_commentReference_setter() {
+    String code = r'''
+class A {
+  /// [x] in A
+  mA() {}
+  set x(value) {}
+}
+class B extends A {
+  /// [x] in B
+  mB() {}
+}
+''';
+    Source source = addSource(code);
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = _getResolvedLibraryUnit(source);
+    {
+      SimpleIdentifier ref = EngineTestCase.findNode(
+          unit, code, "x] in A", (node) => node is SimpleIdentifier);
+      EngineTestCase.assertInstanceOf((obj) => obj is PropertyAccessorElement,
+          PropertyAccessorElement, ref.staticElement);
+    }
+    {
+      SimpleIdentifier ref = EngineTestCase.findNode(
+          unit, code, "x] in B", (node) => node is SimpleIdentifier);
+      EngineTestCase.assertInstanceOf((obj) => obj is PropertyAccessorElement,
+          PropertyAccessorElement, ref.staticElement);
+    }
+  }
+
+  void test_concreteClassWithAbstractMember() {
+    Source source = addSource(r'''
+abstract class A {
+  m();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_concreteClassWithAbstractMember_inherited() {
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+class B extends A {
+  m();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_conflictingInstanceGetterAndSuperclassMember_instance() {
+    Source source = addSource(r'''
+class A {
+  get v => 0;
+}
+class B extends A {
+  get v => 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_conflictingStaticGetterAndInstanceSetter_thisClass() {
+    Source source = addSource(r'''
+class A {
+  static get x => 0;
+  static set x(int p) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_conflictingStaticSetterAndInstanceMember_thisClass_method() {
+    Source source = addSource(r'''
+class A {
+  static x() {}
+  static set x(int p) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_const_constructor_with_named_generic_parameter() {
+    Source source = addSource('''
+class C<T> {
+  const C({T t});
+}
+const c = const C(t: 1);
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_const_dynamic() {
+    Source source = addSource('''
+const Type d = dynamic;
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constConstructorWithNonConstSuper_explicit() {
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+class B extends A {
+  const B(): super();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constConstructorWithNonConstSuper_redirectingFactory() {
+    Source source = addSource(r'''
+class A {
+  A();
+}
+class B implements C {
+  const B();
+}
+class C extends A {
+  const factory C() = B;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constConstructorWithNonConstSuper_unresolved() {
+    Source source = addSource(r'''
+class A {
+  A.a();
+}
+class B extends A {
+  const B(): super();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
+    verify([source]);
+  }
+
+  void test_constConstructorWithNonFinalField_finalInstanceVar() {
+    Source source = addSource(r'''
+class A {
+  final int x = 0;
+  const A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constConstructorWithNonFinalField_mixin() {
+    Source source = addSource(r'''
+class A {
+  a() {}
+}
+class B extends Object with A {
+  const B();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN]);
+    verify([source]);
+  }
+
+  void test_constConstructorWithNonFinalField_static() {
+    Source source = addSource(r'''
+class A {
+  static int x;
+  const A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constConstructorWithNonFinalField_syntheticField() {
+    Source source = addSource(r'''
+class A {
+  const A();
+  set x(value) {}
+  get x {return 0;}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constDeferredClass_new() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {
+  const A.b();
+}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+main() {
+  new a.A.b();
+}'''
+    ], <ErrorCode>[]);
+  }
+
+  void test_constEval_functionTypeLiteral() {
+    Source source = addSource(r'''
+typedef F();
+const C = F;''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constEval_propertyExtraction_fieldStatic_targetType() {
+    addNamedSource(
+        "/math.dart",
+        r'''
+library math;
+const PI = 3.14;''');
+    Source source = addSource(r'''
+import 'math.dart' as math;
+const C = math.PI;''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constEval_propertyExtraction_methodStatic_targetType() {
+    Source source = addSource(r'''
+class A {
+  const A();
+  static m() {}
+}
+const C = A.m;''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constEval_symbol() {
+    addNamedSource(
+        "/math.dart",
+        r'''
+library math;
+const PI = 3.14;''');
+    Source source = addSource(r'''
+const C = #foo;
+foo() {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constEvalTypeBoolNumString_equal() {
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+class B {
+  final v;
+  const B.a1(bool p) : v = p == true;
+  const B.a2(bool p) : v = p == false;
+  const B.a3(bool p) : v = p == 0;
+  const B.a4(bool p) : v = p == 0.0;
+  const B.a5(bool p) : v = p == '';
+  const B.b1(int p) : v = p == true;
+  const B.b2(int p) : v = p == false;
+  const B.b3(int p) : v = p == 0;
+  const B.b4(int p) : v = p == 0.0;
+  const B.b5(int p) : v = p == '';
+  const B.c1(String p) : v = p == true;
+  const B.c2(String p) : v = p == false;
+  const B.c3(String p) : v = p == 0;
+  const B.c4(String p) : v = p == 0.0;
+  const B.c5(String p) : v = p == '';
+  const B.n1(num p) : v = p == null;
+  const B.n2(num p) : v = null == p;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_constEvalTypeBoolNumString_notEqual() {
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+class B {
+  final v;
+  const B.a1(bool p) : v = p != true;
+  const B.a2(bool p) : v = p != false;
+  const B.a3(bool p) : v = p != 0;
+  const B.a4(bool p) : v = p != 0.0;
+  const B.a5(bool p) : v = p != '';
+  const B.b1(int p) : v = p != true;
+  const B.b2(int p) : v = p != false;
+  const B.b3(int p) : v = p != 0;
+  const B.b4(int p) : v = p != 0.0;
+  const B.b5(int p) : v = p != '';
+  const B.c1(String p) : v = p != true;
+  const B.c2(String p) : v = p != false;
+  const B.c3(String p) : v = p != 0;
+  const B.c4(String p) : v = p != 0.0;
+  const B.c5(String p) : v = p != '';
+  const B.n1(num p) : v = p != null;
+  const B.n2(num p) : v = null != p;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constEvelTypeNum_String() {
+    Source source = addSource(r'''
+const String A = 'a';
+const String B = A + 'b';
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constMapKeyExpressionTypeImplementsEquals_abstract() {
+    Source source = addSource(r'''
+abstract class B {
+  final id;
+  const B(this.id);
+  String toString() => 'C($id)';
+  /** Equality is identity equality, the id isn't used. */
+  bool operator==(Object other);
+  }
+
+class C extends B {
+  const C(id) : super(id);
+}
+
+Map getMap() {
+  return const { const C(0): 'Map: 0' };
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constNotInitialized_field() {
+    Source source = addSource(r'''
+class A {
+  static const int x = 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constNotInitialized_local() {
+    Source source = addSource(r'''
+main() {
+  const int x = 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constructorDeclaration_scope_signature() {
+    Source source = addSource(r'''
+const app = 0;
+class A {
+  A(@app int app) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constWithNonConstantArgument_literals() {
+    Source source = addSource(r'''
+class A {
+  const A(a, b, c, d);
+}
+f() { return const A(true, 0, 1.0, '2'); }''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constWithTypeParameters_direct() {
+    Source source = addSource(r'''
+class A<T> {
+  static const V = const A<int>();
+  const A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constWithUndefinedConstructor() {
+    Source source = addSource(r'''
+class A {
+  const A.name();
+}
+f() {
+  return const A.name();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_constWithUndefinedConstructorDefault() {
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+f() {
+  return const A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_defaultValueInFunctionTypeAlias() {
+    Source source = addSource("typedef F([x]);");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_defaultValueInFunctionTypedParameter_named() {
+    Source source = addSource("f(g({p})) {}");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_defaultValueInFunctionTypedParameter_optional() {
+    Source source = addSource("f(g([p])) {}");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_deprecatedMemberUse_hide() {
+    Source source = addSource(r'''
+library lib;
+import 'lib1.dart' hide B;
+A a = new A();''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class A {}
+@deprecated
+class B {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_emptyName() {
+    // Note: This code has two FunctionElements '() {}' with an empty name,
+    // this tests that the empty string is not put into the scope
+    // (more than once).
+    Source source = addSource(r'''
+Map _globalMap = {
+  'a' : () {},
+  'b' : () {}
+};''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_duplicateDefinition_getter() {
+    Source source = addSource("bool get a => true;");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_dynamicIdentifier() {
+    Source source = addSource(r'''
+main() {
+  var v = dynamic;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_empty_generator_async() {
+    Source source = addSource('''
+import 'dart:async';
+Stream<int> f() async* {
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_empty_generator_sync() {
+    Source source = addSource('''
+Iterable<int> f() sync* {
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_expectedOneListTypeArgument() {
+    Source source = addSource(r'''
+main() {
+  <int> [];
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_expectedTwoMapTypeArguments() {
+    Source source = addSource(r'''
+main() {
+  <int, int> {};
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_exportDuplicatedLibraryUnnamed() {
+    Source source = addSource(r'''
+library test;
+export 'lib1.dart';
+export 'lib2.dart';''');
+    addNamedSource("/lib1.dart", "");
+    addNamedSource("/lib2.dart", "");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_exportOfNonLibrary_libraryDeclared() {
+    Source source = addSource(r'''
+library L;
+export 'lib1.dart';''');
+    addNamedSource("/lib1.dart", "library lib1;");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_exportOfNonLibrary_libraryNotDeclared() {
+    Source source = addSource(r'''
+library L;
+export 'lib1.dart';''');
+    addNamedSource("/lib1.dart", "");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_extraPositionalArguments_function() {
+    Source source = addSource(r'''
+f(p1, p2) {}
+main() {
+  f(1, 2);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_extraPositionalArguments_Function() {
+    Source source = addSource(r'''
+f(Function a) {
+  a(1, 2);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_extraPositionalArguments_implicitConstructor() {
+    Source source = addSource(r'''
+class A<E extends num> {
+  A(E x, E y);
+}
+class M {}
+class B<E extends num> = A<E> with M;
+void main() {
+   B<int> x = new B<int>(0,0);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_extraPositionalArguments_typedef_local() {
+    Source source = addSource(r'''
+typedef A(p1, p2);
+A getA() => null;
+f() {
+  A a = getA();
+  a(1, 2);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_extraPositionalArguments_typedef_parameter() {
+    Source source = addSource(r'''
+typedef A(p1, p2);
+f(A a) {
+  a(1, 2);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_fieldInitializedByMultipleInitializers() {
+    Source source = addSource(r'''
+class A {
+  int x;
+  int y;
+  A() : x = 0, y = 0 {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_fieldInitializedInInitializerAndDeclaration_fieldNotFinal() {
+    Source source = addSource(r'''
+class A {
+  int x = 0;
+  A() : x = 1 {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_fieldInitializedInInitializerAndDeclaration_finalFieldNotSet() {
+    Source source = addSource(r'''
+class A {
+  final int x;
+  A() : x = 1 {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_fieldInitializerOutsideConstructor() {
+    Source source = addSource(r'''
+class A {
+  int x;
+  A(this.x) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_fieldInitializerOutsideConstructor_defaultParameters() {
+    Source source = addSource(r'''
+class A {
+  int x;
+  A([this.x]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_fieldInitializerRedirectingConstructor_super() {
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+class B extends A {
+  int x;
+  B(this.x) : super();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_finalInitializedInDeclarationAndConstructor_initializer() {
+    Source source = addSource(r'''
+class A {
+  final x;
+  A() : x = 1 {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_finalInitializedInDeclarationAndConstructor_initializingFormal() {
+    Source source = addSource(r'''
+class A {
+  final x;
+  A(this.x) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_finalNotInitialized_atDeclaration() {
+    Source source = addSource(r'''
+class A {
+  final int x = 0;
+  A() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_finalNotInitialized_fieldFormal() {
+    Source source = addSource(r'''
+class A {
+  final int x = 0;
+  A() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_finalNotInitialized_functionTypedFieldFormal() {
+    Source source = addSource(r'''
+class A {
+  final Function x;
+  A(int this.x(int p)) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_finalNotInitialized_hasNativeClause_hasConstructor() {
+    Source source = addSource(r'''
+class A native 'something' {
+  final int x;
+  A() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE]);
+    verify([source]);
+  }
+
+  void test_finalNotInitialized_hasNativeClause_noConstructor() {
+    Source source = addSource(r'''
+class A native 'something' {
+  final int x;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE]);
+    verify([source]);
+  }
+
+  void test_finalNotInitialized_initializer() {
+    Source source = addSource(r'''
+class A {
+  final int x;
+  A() : x = 0 {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_finalNotInitialized_redirectingConstructor() {
+    Source source = addSource(r'''
+class A {
+  final int x;
+  A(this.x);
+  A.named() : this (42);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_functionDeclaration_scope_returnType() {
+    Source source = addSource("int f(int) { return 0; }");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_functionDeclaration_scope_signature() {
+    Source source = addSource(r'''
+const app = 0;
+f(@app int app) {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_functionTypeAlias_scope_returnType() {
+    Source source = addSource("typedef int f(int);");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_functionTypeAlias_scope_signature() {
+    Source source = addSource(r'''
+const app = 0;
+typedef int f(@app int app);''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_functionWithoutCall() {
+    Source source = addSource(r'''
+abstract class A implements Function {
+}
+class B implements A {
+  void call() {}
+}
+class C extends A {
+  void call() {}
+}
+class D extends C {
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_functionWithoutCall_doesNotImplementFunction() {
+    Source source = addSource("class A {}");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_functionWithoutCall_staticCallMethod() {
+    Source source = addSource(r'''
+class A { }
+class B extends A {
+  static call() { }
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_functionWithoutCall_withNoSuchMethod() {
+    // 16078
+    Source source = addSource(r'''
+class A implements Function {
+  noSuchMethod(inv) {
+    return 42;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_implicitConstructorDependencies() {
+    // No warning should be generated for the code below; this requires that
+    // implicit constructors are generated for C1 before C2, even though C1
+    // follows C2 in the file.  See dartbug.com/21600.
+    Source source = addSource(r'''
+class B {
+  B(int i);
+}
+class M1 {}
+class M2 {}
+
+class C2 = C1 with M2;
+class C1 = B with M1;
+
+main() {
+  new C2(5);
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_constructorName() {
+    Source source = addSource(r'''
+class A {
+  A.named() {}
+}
+class B {
+  var v;
+  B() : v = new A.named();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_importPrefix() {
+    Source source = addSource(r'''
+import 'dart:async' as abstract;
+class A {
+  var v = new abstract.Completer();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_prefixedIdentifier() {
+    Source source = addSource(r'''
+class A {
+  var f;
+}
+class B {
+  var v;
+  B(A a) : v = a.f;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_qualifiedMethodInvocation() {
+    Source source = addSource(r'''
+class A {
+  f() {}
+}
+class B {
+  var v;
+  B() : v = new A().f();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_qualifiedPropertyAccess() {
+    Source source = addSource(r'''
+class A {
+  var f;
+}
+class B {
+  var v;
+  B() : v = new A().f;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_staticField_thisClass() {
+    Source source = addSource(r'''
+class A {
+  var v;
+  A() : v = f;
+  static var f;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_staticGetter() {
+    Source source = addSource(r'''
+class A {
+  var v;
+  A() : v = f;
+  static get f => 42;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_staticMethod() {
+    Source source = addSource(r'''
+class A {
+  var v;
+  A() : v = f();
+  static f() => 42;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_topLevelField() {
+    Source source = addSource(r'''
+class A {
+  var v;
+  A() : v = f;
+}
+var f = 42;''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_topLevelFunction() {
+    Source source = addSource(r'''
+class A {
+  var v;
+  A() : v = f();
+}
+f() => 42;''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_topLevelGetter() {
+    Source source = addSource(r'''
+class A {
+  var v;
+  A() : v = f;
+}
+get f => 42;''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_implicitThisReferenceInInitializer_typeParameter() {
+    Source source = addSource(r'''
+class A<T> {
+  var v;
+  A(p) : v = (p is T);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_importDuplicatedLibraryName() {
+    Source source = addSource(r'''
+library test;
+import 'lib.dart';
+import 'lib.dart';''');
+    addNamedSource("/lib.dart", "library lib;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      HintCode.UNUSED_IMPORT,
+      HintCode.UNUSED_IMPORT,
+      HintCode.DUPLICATE_IMPORT
+    ]);
+    verify([source]);
+  }
+
+  void test_importDuplicatedLibraryUnnamed() {
+    Source source = addSource(r'''
+library test;
+import 'lib1.dart';
+import 'lib2.dart';''');
+    addNamedSource("/lib1.dart", "");
+    addNamedSource("/lib2.dart", "");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      // No warning on duplicate import (https://github.com/dart-lang/sdk/issues/24156)
+      HintCode.UNUSED_IMPORT,
+      HintCode.UNUSED_IMPORT
+    ]);
+    verify([source]);
+  }
+
+  void test_importOfNonLibrary_libraryDeclared() {
+    Source source = addSource(r'''
+library lib;
+import 'part.dart';
+A a;''');
+    addNamedSource(
+        "/part.dart",
+        r'''
+library lib1;
+class A {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_importOfNonLibrary_libraryNotDeclared() {
+    Source source = addSource(r'''
+library lib;
+import 'part.dart';
+A a;''');
+    addNamedSource("/part.dart", "class A {}");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_importPrefixes_withFirstLetterDifference() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' as math;
+import 'lib2.dart' as path;
+main() {
+  math.test1();
+  path.test2();
+}''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+test1() {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+test2() {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_inconsistentCaseExpressionTypes() {
+    Source source = addSource(r'''
+f(var p) {
+  switch (p) {
+    case 1:
+      break;
+    case 2:
+      break;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_inconsistentMethodInheritance_accessors_typeParameter2() {
+    Source source = addSource(r'''
+abstract class A<E> {
+  E get x {return null;}
+}
+class B<E> {
+  E get x {return null;}
+}
+class C<E> extends A<E> implements B<E> {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_inconsistentMethodInheritance_accessors_typeParameters1() {
+    Source source = addSource(r'''
+abstract class A<E> {
+  E get x;
+}
+abstract class B<E> {
+  E get x;
+}
+class C<E> implements A<E>, B<E> {
+  E get x => null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_inconsistentMethodInheritance_accessors_typeParameters_diamond() {
+    Source source = addSource(r'''
+abstract class F<E> extends B<E> {}
+class D<E> extends F<E> {
+  external E get g;
+}
+abstract class C<E> {
+  E get g;
+}
+abstract class B<E> implements C<E> {
+  E get g { return null; }
+}
+class A<E> extends B<E> implements D<E> {
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_inconsistentMethodInheritance_methods_typeParameter2() {
+    Source source = addSource(r'''
+class A<E> {
+  x(E e) {}
+}
+class B<E> {
+  x(E e) {}
+}
+class C<E> extends A<E> implements B<E> {
+  x(E e) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_inconsistentMethodInheritance_methods_typeParameters1() {
+    Source source = addSource(r'''
+class A<E> {
+  x(E e) {}
+}
+class B<E> {
+  x(E e) {}
+}
+class C<E> implements A<E>, B<E> {
+  x(E e) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_inconsistentMethodInheritance_overrideTrumpsInherits_getter() {
+    // 16134
+    Source source = addSource(r'''
+class B<S> {
+  S get g => null;
+}
+abstract class I<U> {
+  U get g => null;
+}
+class C extends B<double> implements I<int> {
+  num get g => null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_inconsistentMethodInheritance_overrideTrumpsInherits_method() {
+    // 16134
+    Source source = addSource(r'''
+class B<S> {
+  m(S s) => null;
+}
+abstract class I<U> {
+  m(U u) => null;
+}
+class C extends B<double> implements I<int> {
+  m(num n) => null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_inconsistentMethodInheritance_overrideTrumpsInherits_setter() {
+    // 16134
+    Source source = addSource(r'''
+class B<S> {
+  set t(S s) {}
+}
+abstract class I<U> {
+  set t(U u) {}
+}
+class C extends B<double> implements I<int> {
+  set t(num n) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_inconsistentMethodInheritance_simple() {
+    Source source = addSource(r'''
+abstract class A {
+  x();
+}
+abstract class B {
+  x();
+}
+class C implements A, B {
+  x() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_initializingFormalForNonExistentField() {
+    Source source = addSource(r'''
+class A {
+  int x;
+  A(this.x) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_instance_creation_inside_annotation() {
+    Source source = addSource('''
+class C {
+  const C();
+}
+class D {
+  final C c;
+  const D(this.c);
+}
+@D(const C())
+f() {}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_instanceAccessToStaticMember_fromComment() {
+    Source source = addSource(r'''
+class A {
+  static m() {}
+}
+/// [A.m]
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_instanceAccessToStaticMember_topLevel() {
+    Source source = addSource(r'''
+m() {}
+main() {
+  m();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_instanceMemberAccessFromStatic_fromComment() {
+    Source source = addSource(r'''
+class A {
+  m() {}
+  /// [m]
+  static foo() {
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_instanceMethodNameCollidesWithSuperclassStatic_field() {
+    Source source = addSource(r'''
+import 'lib.dart';
+class B extends A {
+  _m() {}
+}''');
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library L;
+class A {
+  static var _m;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_instanceMethodNameCollidesWithSuperclassStatic_method() {
+    Source source = addSource(r'''
+import 'lib.dart';
+class B extends A {
+  _m() {}
+}''');
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library L;
+class A {
+  static _m() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_constantVariable_field() {
+    Source source = addSource(r'''
+@A.C
+class A {
+  static const C = 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_constantVariable_field_importWithPrefix() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+class A {
+  static const C = 0;
+}''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+@p.A.C
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_constantVariable_topLevel() {
+    Source source = addSource(r'''
+const C = 0;
+@C
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_constantVariable_topLevel_importWithPrefix() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+const C = 0;''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+@p.C
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_constConstructor_importWithPrefix() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+class A {
+  const A(int p);
+}''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+@p.A(42)
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidAnnotation_constConstructor_named_importWithPrefix() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+class A {
+  const A.named(int p);
+}''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+@p.A.named(42)
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidAssignment() {
+    Source source = addSource(r'''
+f() {
+  var x;
+  var y;
+  x = y;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_compoundAssignment() {
+    Source source = addSource(r'''
+class byte {
+  int _value;
+  byte(this._value);
+  byte operator +(int val) { return this; }
+}
+
+void main() {
+  byte b = new byte(52);
+  b += 3;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_defaultValue_named() {
+    Source source = addSource(r'''
+f({String x: '0'}) {
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_defaultValue_optional() {
+    Source source = addSource(r'''
+f([String x = '0']) {
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_ifNullAssignment_compatibleType() {
+    Source source = addSource('''
+void f(int i) {
+  num n;
+  n ??= i;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_ifNullAssignment_sameType() {
+    Source source = addSource('''
+void f(int i) {
+  int j;
+  j ??= i;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_implicitlyImplementFunctionViaCall_1() {
+    // 18341
+    //
+    // This test and
+    // 'test_invalidAssignment_implicitlyImplementFunctionViaCall_2()'
+    // are closely related: here we see that 'I' checks as a subtype of
+    // 'IntToInt'.
+    Source source = addSource(r'''
+class I {
+  int call(int x) => 0;
+}
+class C implements I {
+  noSuchMethod(_) => null;
+}
+typedef int IntToInt(int x);
+IntToInt f = new I();''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_implicitlyImplementFunctionViaCall_2() {
+    // 18341
+    //
+    // Here 'C' checks as a subtype of 'I', but 'C' does not
+    // check as a subtype of 'IntToInt'. Together with
+    // 'test_invalidAssignment_implicitlyImplementFunctionViaCall_1()' we see
+    // that subtyping is not transitive here.
+    Source source = addSource(r'''
+class I {
+  int call(int x) => 0;
+}
+class C implements I {
+  noSuchMethod(_) => null;
+}
+typedef int IntToInt(int x);
+IntToInt f = new C();''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_implicitlyImplementFunctionViaCall_3() {
+    // 18341
+    //
+    // Like 'test_invalidAssignment_implicitlyImplementFunctionViaCall_2()',
+    // but uses type 'Function' instead of more precise type 'IntToInt' for 'f'.
+    Source source = addSource(r'''
+class I {
+  int call(int x) => 0;
+}
+class C implements I {
+  noSuchMethod(_) => null;
+}
+typedef int IntToInt(int x);
+Function f = new C();''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_implicitlyImplementFunctionViaCall_4() {
+    // 18341
+    //
+    // Like 'test_invalidAssignment_implicitlyImplementFunctionViaCall_2()',
+    // but uses type 'VoidToInt' instead of more precise type 'IntToInt' for
+    // 'f'.
+    //
+    // Here 'C <: IntToInt <: VoidToInt', but the spec gives no transitivity
+    // rule for '<:'. However, many of the :/tools/test.py tests assume this
+    // transitivity for 'JsBuilder' objects, assigning them to
+    // '(String) -> dynamic'. The declared type of 'JsBuilder.call' is
+    // '(String, [dynamic]) -> Expression'.
+    Source source = addSource(r'''
+class I {
+  int call([int x]) => 0;
+}
+class C implements I {
+  noSuchMethod(_) => null;
+}
+typedef int VoidToInt();
+VoidToInt f = new C();''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_toDynamic() {
+    Source source = addSource(r'''
+f() {
+  var g;
+  g = () => 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidFactoryNameNotAClass() {
+    Source source = addSource(r'''
+class A {
+  factory A() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidIdentifierInAsync() {
+    Source source = addSource(r'''
+class A {
+  m() {
+    int async;
+    int await;
+    int yield;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidMethodOverrideNamedParamType() {
+    Source source = addSource(r'''
+class A {
+  m({int a}) {}
+}
+class B implements A {
+  m({int a, int b}) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidOverrideDifferentDefaultValues_named() {
+    Source source = addSource(r'''
+class A {
+  m({int p : 0}) {}
+}
+class B extends A {
+  m({int p : 0}) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidOverrideDifferentDefaultValues_named_function() {
+    Source source = addSource(r'''
+nothing() => 'nothing';
+class A {
+  thing(String a, {orElse : nothing}) {}
+}
+class B extends A {
+  thing(String a, {orElse : nothing}) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidOverrideDifferentDefaultValues_positional() {
+    Source source = addSource(r'''
+class A {
+  m([int p = 0]) {}
+}
+class B extends A {
+  m([int p = 0]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidOverrideDifferentDefaultValues_positional_changedOrder() {
+    Source source = addSource(r'''
+class A {
+  m([int a = 0, String b = '0']) {}
+}
+class B extends A {
+  m([int b = 0, String a = '0']) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidOverrideDifferentDefaultValues_positional_function() {
+    Source source = addSource(r'''
+nothing() => 'nothing';
+class A {
+  thing(String a, [orElse = nothing]) {}
+}
+class B extends A {
+  thing(String a, [orElse = nothing]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidOverrideNamed_unorderedNamedParameter() {
+    Source source = addSource(r'''
+class A {
+  m({a, b}) {}
+}
+class B extends A {
+  m({b, a}) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidOverrideRequired_less() {
+    Source source = addSource(r'''
+class A {
+  m(a, b) {}
+}
+class B extends A {
+  m(a, [b]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidOverrideRequired_same() {
+    Source source = addSource(r'''
+class A {
+  m(a) {}
+}
+class B extends A {
+  m(a) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidOverrideReturnType_returnType_interface() {
+    Source source = addNamedSource(
+        "/test.dart",
+        r'''
+abstract class A {
+  num m();
+}
+class B implements A {
+  int m() { return 1; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidOverrideReturnType_returnType_interface2() {
+    Source source = addNamedSource(
+        "/test.dart",
+        r'''
+abstract class A {
+  num m();
+}
+abstract class B implements A {
+}
+class C implements B {
+  int m() { return 1; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidOverrideReturnType_returnType_mixin() {
+    Source source = addNamedSource(
+        "/test.dart",
+        r'''
+class A {
+  num m() { return 0; }
+}
+class B extends Object with A {
+  int m() { return 1; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidOverrideReturnType_returnType_parameterizedTypes() {
+    Source source = addSource(r'''
+abstract class A<E> {
+  List<E> m();
+}
+class B extends A<dynamic> {
+  List<dynamic> m() { return new List<dynamic>(); }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidOverrideReturnType_returnType_sameType() {
+    Source source = addNamedSource(
+        "/test.dart",
+        r'''
+class A {
+  int m() { return 0; }
+}
+class B extends A {
+  int m() { return 1; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidOverrideReturnType_returnType_superclass() {
+    Source source = addNamedSource(
+        "/test.dart",
+        r'''
+class A {
+  num m() { return 0; }
+}
+class B extends A {
+  int m() { return 1; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidOverrideReturnType_returnType_superclass2() {
+    Source source = addNamedSource(
+        "/test.dart",
+        r'''
+class A {
+  num m() { return 0; }
+}
+class B extends A {
+}
+class C extends B {
+  int m() { return 1; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidOverrideReturnType_returnType_void() {
+    Source source = addSource(r'''
+class A {
+  void m() {}
+}
+class B extends A {
+  int m() { return 0; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidReferenceToThis_constructor() {
+    Source source = addSource(r'''
+class A {
+  A() {
+    var v = this;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidReferenceToThis_instanceMethod() {
+    Source source = addSource(r'''
+class A {
+  m() {
+    var v = this;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidTypeArgumentForKey() {
+    Source source = addSource(r'''
+class A {
+  m() {
+    return const <int, int>{};
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidTypeArgumentInConstList() {
+    Source source = addSource(r'''
+class A<E> {
+  m() {
+    return <E>[];
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidTypeArgumentInConstMap() {
+    Source source = addSource(r'''
+class A<E> {
+  m() {
+    return <String, E>{};
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invocationOfNonFunction_dynamic() {
+    Source source = addSource(r'''
+class A {
+  var f;
+}
+class B extends A {
+  g() {
+    f();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invocationOfNonFunction_getter() {
+    Source source = addSource(r'''
+class A {
+  var g;
+}
+f() {
+  A a;
+  a.g();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invocationOfNonFunction_localVariable() {
+    Source source = addSource(r'''
+f() {
+  var g;
+  g();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invocationOfNonFunction_localVariable_dynamic() {
+    Source source = addSource(r'''
+f() {}
+main() {
+  var v = f;
+  v();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invocationOfNonFunction_localVariable_dynamic2() {
+    Source source = addSource(r'''
+f() {}
+main() {
+  var v = f;
+  v = 1;
+  v();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invocationOfNonFunction_Object() {
+    Source source = addSource(r'''
+main() {
+  Object v = null;
+  v();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invocationOfNonFunction_proxyOnFunctionClass() {
+    // 16078
+    Source source = addSource(r'''
+@proxy
+class Functor implements Function {
+  noSuchMethod(inv) {
+    return 42;
+  }
+}
+main() {
+  Functor f = new Functor();
+  f();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_issue_24191() {
+    Source source = addSource('''
+import 'dart:async';
+
+class S extends Stream {}
+f(S s) async {
+  await for (var v in s) {
+    print(v);
+  }
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_listElementTypeNotAssignable() {
+    Source source = addSource(r'''
+var v1 = <int> [42];
+var v2 = const <int> [42];''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_loadLibraryDefined() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+foo() => 22;''',
+      r'''
+import 'lib1.dart' deferred as other;
+main() {
+  other.loadLibrary().then((_) => other.foo());
+}'''
+    ], <ErrorCode>[]);
+  }
+
+  void test_local_generator_async() {
+    Source source = addSource('''
+f() {
+  return () async* { yield 0; };
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_local_generator_sync() {
+    Source source = addSource('''
+f() {
+  return () sync* { yield 0; };
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_mapKeyTypeNotAssignable() {
+    Source source = addSource("var v = <String, int > {'a' : 1};");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_memberWithClassName_setter() {
+    Source source = addSource(r'''
+class A {
+  set A(v) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_methodDeclaration_scope_signature() {
+    Source source = addSource(r'''
+const app = 0;
+class A {
+  foo(@app int app) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_misMatchedGetterAndSetterTypes_instance_sameTypes() {
+    Source source = addSource(r'''
+class C {
+  int get x => 0;
+  set x(int v) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_misMatchedGetterAndSetterTypes_instance_unspecifiedGetter() {
+    Source source = addSource(r'''
+class C {
+  get x => 0;
+  set x(String v) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_misMatchedGetterAndSetterTypes_instance_unspecifiedSetter() {
+    Source source = addSource(r'''
+class C {
+  int get x => 0;
+  set x(v) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_misMatchedGetterAndSetterTypes_topLevel_sameTypes() {
+    Source source = addSource(r'''
+int get x => 0;
+set x(int v) {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_misMatchedGetterAndSetterTypes_topLevel_unspecifiedGetter() {
+    Source source = addSource(r'''
+get x => 0;
+set x(String v) {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_misMatchedGetterAndSetterTypes_topLevel_unspecifiedSetter() {
+    Source source = addSource(r'''
+int get x => 0;
+set x(v) {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_missingEnumConstantInSwitch_all() {
+    Source source = addSource(r'''
+enum E { A, B, C }
+
+f(E e) {
+  switch (e) {
+    case E.A: break;
+    case E.B: break;
+    case E.C: break;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_missingEnumConstantInSwitch_default() {
+    Source source = addSource(r'''
+enum E { A, B, C }
+
+f(E e) {
+  switch (e) {
+    case E.B: break;
+    default: break;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_mixedReturnTypes_differentScopes() {
+    Source source = addSource(r'''
+class C {
+  m(int x) {
+    f(int y) {
+      return;
+    }
+    f(x);
+    return 0;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_mixedReturnTypes_ignoreImplicit() {
+    Source source = addSource(r'''
+f(bool p) {
+  if (p) return 42;
+  // implicit 'return;' is ignored
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_mixedReturnTypes_ignoreImplicit2() {
+    Source source = addSource(r'''
+f(bool p) {
+  if (p) {
+    return 42;
+  } else {
+    return 42;
+  }
+  // implicit 'return;' is ignored
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_mixedReturnTypes_sameKind() {
+    Source source = addSource(r'''
+class C {
+  m(int x) {
+    if (x < 0) {
+      return 1;
+    }
+    return 0;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_mixinDeclaresConstructor() {
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+class B extends Object with A {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_mixinDeclaresConstructor_factory() {
+    Source source = addSource(r'''
+class A {
+  factory A() {}
+}
+class B extends Object with A {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_mixinInheritsFromNotObject_classDeclaration_extends() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.enableSuperMixins = true;
+    resetWithOptions(options);
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+class C extends Object with B {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_mixinInheritsFromNotObject_classDeclaration_mixTypeAlias() {
+    Source source = addSource(r'''
+class A {}
+class B = Object with A;
+class C extends Object with B {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_mixinInheritsFromNotObject_classDeclaration_with() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.enableSuperMixins = true;
+    resetWithOptions(options);
+    Source source = addSource(r'''
+class A {}
+class B extends Object with A {}
+class C extends Object with B {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_mixinInheritsFromNotObject_typeAlias_extends() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.enableSuperMixins = true;
+    resetWithOptions(options);
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+class C = Object with B;''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_mixinInheritsFromNotObject_typeAlias_with() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.enableSuperMixins = true;
+    resetWithOptions(options);
+    Source source = addSource(r'''
+class A {}
+class B extends Object with A {}
+class C = Object with B;''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_mixinInheritsFromNotObject_typedef_mixTypeAlias() {
+    Source source = addSource(r'''
+class A {}
+class B = Object with A;
+class C = Object with B;''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_mixinReferencesSuper() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.enableSuperMixins = true;
+    resetWithOptions(options);
+    Source source = addSource(r'''
+class A {
+  toString() => super.toString();
+}
+class B extends Object with A {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_multipleSuperInitializers_no() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  B() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_multipleSuperInitializers_single() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  B() : super() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nativeFunctionBodyInNonSDKCode_function() {
+    Source source = addSource(r'''
+import 'dart-ext:x';
+int m(a) native 'string';''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    // Cannot verify the AST because the import's URI cannot be resolved.
+  }
+
+  void test_newWithAbstractClass_factory() {
+    Source source = addSource(r'''
+abstract class A {
+  factory A() { return new B(); }
+}
+class B implements A {
+  B() {}
+}
+A f() {
+  return new A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_newWithUndefinedConstructor() {
+    Source source = addSource(r'''
+class A {
+  A.name() {}
+}
+f() {
+  new A.name();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_newWithUndefinedConstructorDefault() {
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+f() {
+  new A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_abstractsDontOverrideConcretes_getter() {
+    Source source = addSource(r'''
+class A {
+  int get g => 0;
+}
+abstract class B extends A {
+  int get g;
+}
+class C extends B {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_abstractsDontOverrideConcretes_method() {
+    Source source = addSource(r'''
+class A {
+  m(p) {}
+}
+abstract class B extends A {
+  m(p);
+}
+class C extends B {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_abstractsDontOverrideConcretes_setter() {
+    Source source = addSource(r'''
+class A {
+  set s(v) {}
+}
+abstract class B extends A {
+  set s(v);
+}
+class C extends B {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_interface() {
+    // 15979
+    Source source = addSource(r'''
+abstract class M {}
+abstract class A {}
+abstract class I {
+  m();
+}
+abstract class B = A with M implements I;''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_mixin() {
+    // 15979
+    Source source = addSource(r'''
+abstract class M {
+  m();
+}
+abstract class A {}
+abstract class B = A with M;''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_superclass() {
+    // 15979
+    Source source = addSource(r'''
+class M {}
+abstract class A {
+  m();
+}
+abstract class B = A with M;''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_mixin_getter() {
+    // 17034
+    Source source = addSource(r'''
+class A {
+  var a;
+}
+abstract class M {
+  get a;
+}
+class B extends A with M {}
+class C extends B {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_mixin_method() {
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+abstract class M {
+  m();
+}
+class B extends A with M {}
+class C extends B {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_mixin_setter() {
+    Source source = addSource(r'''
+class A {
+  var a;
+}
+abstract class M {
+  set a(dynamic v);
+}
+class B extends A with M {}
+class C extends B {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_noSuchMethod_accessor() {
+    Source source = addSource(r'''
+abstract class A {
+  int get g;
+}
+class B extends A {
+  noSuchMethod(v) => '';
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_noSuchMethod_method() {
+    Source source = addSource(r'''
+abstract class A {
+  m(p);
+}
+class B extends A {
+  noSuchMethod(v) => '';
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_overridesMethodInObject() {
+    Source source = addSource(r'''
+class A {
+  String toString([String prefix = '']) => '${prefix}Hello';
+}
+class C {}
+class B extends A with C {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonBoolExpression_functionType() {
+    Source source = addSource(r'''
+bool makeAssertion() => true;
+f() {
+  assert(makeAssertion);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonBoolExpression_interfaceType() {
+    Source source = addSource(r'''
+f() {
+  assert(true);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonBoolNegationExpression() {
+    Source source = addSource(r'''
+f(bool pb, pd) {
+  !true;
+  !false;
+  !pb;
+  !pd;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonBoolOperand_and_bool() {
+    Source source = addSource(r'''
+bool f(bool left, bool right) {
+  return left && right;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonBoolOperand_and_dynamic() {
+    Source source = addSource(r'''
+bool f(left, dynamic right) {
+  return left && right;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonBoolOperand_or_bool() {
+    Source source = addSource(r'''
+bool f(bool left, bool right) {
+  return left || right;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonBoolOperand_or_dynamic() {
+    Source source = addSource(r'''
+bool f(dynamic left, right) {
+  return left || right;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValue_function_named() {
+    Source source = addSource("f({x : 2 + 3}) {}");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValue_function_positional() {
+    Source source = addSource("f([x = 2 + 3]) {}");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValue_inConstructor_named() {
+    Source source = addSource(r'''
+class A {
+  A({x : 2 + 3}) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValue_inConstructor_positional() {
+    Source source = addSource(r'''
+class A {
+  A([x = 2 + 3]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValue_method_named() {
+    Source source = addSource(r'''
+class A {
+  m({x : 2 + 3}) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonConstantDefaultValue_method_positional() {
+    Source source = addSource(r'''
+class A {
+  m([x = 2 + 3]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonConstantValueInInitializer_namedArgument() {
+    Source source = addSource(r'''
+class A {
+  final a;
+  const A({this.a});
+}
+class B extends A {
+  const B({b}) : super(a: b);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonConstCaseExpression() {
+    Source source = addSource(r'''
+f(Type t) {
+  switch (t) {
+    case bool:
+    case int:
+      return true;
+    default:
+      return false;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonConstMapAsExpressionStatement_const() {
+    Source source = addSource(r'''
+f() {
+  const {'a' : 0, 'b' : 1};
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonConstMapAsExpressionStatement_notExpressionStatement() {
+    Source source = addSource(r'''
+f() {
+  var m = {'a' : 0, 'b' : 1};
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonConstMapAsExpressionStatement_typeArguments() {
+    Source source = addSource(r'''
+f() {
+  <String, int> {'a' : 0, 'b' : 1};
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_binary_bool() {
+    Source source = addSource(r'''
+class A {
+  final v;
+  const A.a1(bool p) : v = p && true;
+  const A.a2(bool p) : v = true && p;
+  const A.b1(bool p) : v = p || true;
+  const A.b2(bool p) : v = true || p;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_binary_dynamic() {
+    Source source = addSource(r'''
+class A {
+  final v;
+  const A.a1(p) : v = p + 5;
+  const A.a2(p) : v = 5 + p;
+  const A.b1(p) : v = p - 5;
+  const A.b2(p) : v = 5 - p;
+  const A.c1(p) : v = p * 5;
+  const A.c2(p) : v = 5 * p;
+  const A.d1(p) : v = p / 5;
+  const A.d2(p) : v = 5 / p;
+  const A.e1(p) : v = p ~/ 5;
+  const A.e2(p) : v = 5 ~/ p;
+  const A.f1(p) : v = p > 5;
+  const A.f2(p) : v = 5 > p;
+  const A.g1(p) : v = p < 5;
+  const A.g2(p) : v = 5 < p;
+  const A.h1(p) : v = p >= 5;
+  const A.h2(p) : v = 5 >= p;
+  const A.i1(p) : v = p <= 5;
+  const A.i2(p) : v = 5 <= p;
+  const A.j1(p) : v = p % 5;
+  const A.j2(p) : v = 5 % p;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    // operations on "p" are not resolved
+  }
+
+  void test_nonConstValueInInitializer_binary_int() {
+    Source source = addSource(r'''
+class A {
+  final v;
+  const A.a1(int p) : v = p ^ 5;
+  const A.a2(int p) : v = 5 ^ p;
+  const A.b1(int p) : v = p & 5;
+  const A.b2(int p) : v = 5 & p;
+  const A.c1(int p) : v = p | 5;
+  const A.c2(int p) : v = 5 | p;
+  const A.d1(int p) : v = p >> 5;
+  const A.d2(int p) : v = 5 >> p;
+  const A.e1(int p) : v = p << 5;
+  const A.e2(int p) : v = 5 << p;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_binary_num() {
+    Source source = addSource(r'''
+class A {
+  final v;
+  const A.a1(num p) : v = p + 5;
+  const A.a2(num p) : v = 5 + p;
+  const A.b1(num p) : v = p - 5;
+  const A.b2(num p) : v = 5 - p;
+  const A.c1(num p) : v = p * 5;
+  const A.c2(num p) : v = 5 * p;
+  const A.d1(num p) : v = p / 5;
+  const A.d2(num p) : v = 5 / p;
+  const A.e1(num p) : v = p ~/ 5;
+  const A.e2(num p) : v = 5 ~/ p;
+  const A.f1(num p) : v = p > 5;
+  const A.f2(num p) : v = 5 > p;
+  const A.g1(num p) : v = p < 5;
+  const A.g2(num p) : v = 5 < p;
+  const A.h1(num p) : v = p >= 5;
+  const A.h2(num p) : v = 5 >= p;
+  const A.i1(num p) : v = p <= 5;
+  const A.i2(num p) : v = 5 <= p;
+  const A.j1(num p) : v = p % 5;
+  const A.j2(num p) : v = 5 % p;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_field() {
+    Source source = addSource(r'''
+class A {
+  final int a;
+  const A() : a = 5;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_redirecting() {
+    Source source = addSource(r'''
+class A {
+  const A.named(p);
+  const A() : this.named(42);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_super() {
+    Source source = addSource(r'''
+class A {
+  const A(p);
+}
+class B extends A {
+  const B() : super(42);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonConstValueInInitializer_unary() {
+    Source source = addSource(r'''
+class A {
+  final v;
+  const A.a(bool p) : v = !p;
+  const A.b(int p) : v = ~p;
+  const A.c(num p) : v = -p;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonGenerativeConstructor() {
+    Source source = addSource(r'''
+class A {
+  A.named() {}
+  factory A() {}
+}
+class B extends A {
+  B() : super.named();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonTypeInCatchClause_isClass() {
+    Source source = addSource(r'''
+f() {
+  try {
+  } on String catch (e) {
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonTypeInCatchClause_isFunctionTypeAlias() {
+    Source source = addSource(r'''
+typedef F();
+f() {
+  try {
+  } on F catch (e) {
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonTypeInCatchClause_isTypeParameter() {
+    Source source = addSource(r'''
+class A<T> {
+  f() {
+    try {
+    } on T catch (e) {
+    }
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonTypeInCatchClause_noType() {
+    Source source = addSource(r'''
+f() {
+  try {
+  } catch (e) {
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonVoidReturnForOperator_no() {
+    Source source = addSource(r'''
+class A {
+  operator []=(a, b) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonVoidReturnForOperator_void() {
+    Source source = addSource(r'''
+class A {
+  void operator []=(a, b) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonVoidReturnForSetter_function_no() {
+    Source source = addSource("set x(v) {}");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonVoidReturnForSetter_function_void() {
+    Source source = addSource("void set x(v) {}");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonVoidReturnForSetter_method_no() {
+    Source source = addSource(r'''
+class A {
+  set x(v) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_nonVoidReturnForSetter_method_void() {
+    Source source = addSource(r'''
+class A {
+  void set x(v) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_null_callMethod() {
+    Source source = addSource(r'''
+main() {
+  null.m();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_null_callOperator() {
+    Source source = addSource(r'''
+main() {
+  null + 5;
+  null == 5;
+  null[0];
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_optionalParameterInOperator_required() {
+    Source source = addSource(r'''
+class A {
+  operator +(p) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_parameterDefaultDoesNotReferToParameterName() {
+    // The final "f" should refer to the toplevel function "f", not to the
+    // parameter called "f".  See dartbug.com/13179.
+    Source source = addSource('void f([void f([x]) = f]) {}');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_parameterScope_local() {
+    // Parameter names shouldn't conflict with the name of the function they
+    // are enclosed in.
+    Source source = addSource(r'''
+f() {
+  g(g) {
+    h(g);
+  }
+}
+h(x) {}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_parameterScope_method() {
+    // Parameter names shouldn't conflict with the name of the function they
+    // are enclosed in.
+    Source source = addSource(r'''
+class C {
+  g(g) {
+    h(g);
+  }
+}
+h(x) {}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_parameterScope_toplevel() {
+    // Parameter names shouldn't conflict with the name of the function they
+    // are enclosed in.
+    Source source = addSource(r'''
+g(g) {
+  h(g);
+}
+h(x) {}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_prefixCollidesWithTopLevelMembers() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+class A {}''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+typedef P();
+p2() {}
+var p3;
+class p4 {}
+p.A a;''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_propagateTypeArgs_intoBounds() {
+    Source source = addSource(r'''
+abstract class A<E> {}
+abstract class B<F> implements A<F>{}
+abstract class C<G, H extends A<G>> {}
+class D<I> extends C<I, B<I>> {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_propagateTypeArgs_intoSupertype() {
+    Source source = addSource(r'''
+class A<T> {
+  A(T p);
+  A.named(T p);
+}
+class B<S> extends A<S> {
+  B(S p) : super(p);
+  B.named(S p) : super.named(p);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_proxy_annotation_prefixed() {
+    Source source = addSource(r'''
+library L;
+@proxy
+class A {}
+f(A a) {
+  a.m();
+  var x = a.g;
+  a.s = 1;
+  var y = a + a;
+  a++;
+  ++a;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_proxy_annotation_prefixed2() {
+    Source source = addSource(r'''
+library L;
+@proxy
+class A {}
+class B {
+  f(A a) {
+    a.m();
+    var x = a.g;
+    a.s = 1;
+    var y = a + a;
+    a++;
+    ++a;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_proxy_annotation_prefixed3() {
+    Source source = addSource(r'''
+library L;
+class B {
+  f(A a) {
+    a.m();
+    var x = a.g;
+    a.s = 1;
+    var y = a + a;
+    a++;
+    ++a;
+  }
+}
+@proxy
+class A {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_proxy_annotation_proxyHasPrefixedIdentifier() {
+    Source source = addSource(r'''
+library L;
+import 'dart:core' as core;
+@core.proxy class PrefixProxy {}
+main() {
+  new PrefixProxy().foo;
+  new PrefixProxy().foo();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_proxy_annotation_simple() {
+    Source source = addSource(r'''
+library L;
+@proxy
+class B {
+  m() {
+    n();
+    var x = g;
+    s = 1;
+    var y = this + this;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_proxy_annotation_superclass() {
+    Source source = addSource(r'''
+library L;
+class B extends A {
+  m() {
+    n();
+    var x = g;
+    s = 1;
+    var y = this + this;
+  }
+}
+@proxy
+class A {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_proxy_annotation_superclass_mixin() {
+    Source source = addSource(r'''
+library L;
+class B extends Object with A {
+  m() {
+    n();
+    var x = g;
+    s = 1;
+    var y = this + this;
+  }
+}
+@proxy
+class A {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_proxy_annotation_superinterface() {
+    Source source = addSource(r'''
+library L;
+class B implements A {
+  m() {
+    n();
+    var x = g;
+    s = 1;
+    var y = this + this;
+  }
+}
+@proxy
+class A {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_proxy_annotation_superinterface_infiniteLoop() {
+    Source source = addSource(r'''
+library L;
+class C implements A {
+  m() {
+    n();
+    var x = g;
+    s = 1;
+    var y = this + this;
+  }
+}
+class B implements A{}
+class A implements B{}''');
+    computeLibrarySourceErrors(source);
+    // Test is that a stack overflow isn't reached in resolution
+    // (previous line), no need to assert error set.
+  }
+
+  void test_recursiveConstructorRedirect() {
+    Source source = addSource(r'''
+class A {
+  A.a() : this.b();
+  A.b() : this.c();
+  A.c() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_recursiveFactoryRedirect() {
+    Source source = addSource(r'''
+class A {
+  factory A() = B;
+}
+class B implements A {
+  factory B() = C;
+}
+class C implements B {
+  factory C() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_redirectToInvalidFunctionType() {
+    Source source = addSource(r'''
+class A implements B {
+  A(int p) {}
+}
+class B {
+  factory B(int p) = A;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_redirectToInvalidReturnType() {
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+class B extends A {
+  factory B() = A;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_redirectToNonConstConstructor() {
+    Source source = addSource(r'''
+class A {
+  const A.a();
+  const factory A.b() = A.a;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_referencedBeforeDeclaration_cascade() {
+    Source source = addSource(r'''
+testRequestHandler() {}
+
+main() {
+  var s1 = null;
+  testRequestHandler()
+    ..stream(s1);
+  var stream = 123;
+  print(stream);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_referenceToDeclaredVariableInInitializer_constructorName() {
+    Source source = addSource(r'''
+class A {
+  A.x() {}
+}
+f() {
+  var x = new A.x();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_referenceToDeclaredVariableInInitializer_methodName() {
+    Source source = addSource(r'''
+class A {
+  x() {}
+}
+f(A a) {
+  var x = a.x();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_referenceToDeclaredVariableInInitializer_propertyName() {
+    Source source = addSource(r'''
+class A {
+  var x;
+}
+f(A a) {
+  var x = a.x;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_rethrowOutsideCatch() {
+    Source source = addSource(r'''
+class A {
+  void m() {
+    try {} catch (e) {rethrow;}
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_return_in_generator_async() {
+    Source source = addSource('''
+import 'dart:async';
+Stream<int> f() async* {
+  return;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_return_in_generator_sync() {
+    Source source = addSource('''
+Iterable<int> f() sync* {
+  return;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_returnInGenerativeConstructor() {
+    Source source = addSource(r'''
+class A {
+  A() { return; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_returnInGenerator_async() {
+    Source source = addSource(r'''
+f() async {
+  return 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_returnInGenerator_sync() {
+    Source source = addSource(r'''
+f() {
+  return 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_returnOfInvalidType_async() {
+    Source source = addSource(r'''
+import 'dart:async';
+class A {
+  Future<int> m() async {
+    return 0;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_returnOfInvalidType_dynamic() {
+    Source source = addSource(r'''
+class TypeError {}
+class A {
+  static void testLogicalOp() {
+    testOr(a, b, onTypeError) {
+      try {
+        return a || b;
+      } on TypeError catch (t) {
+        return onTypeError;
+      }
+    }
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_returnOfInvalidType_dynamicAsTypeArgument() {
+    Source source = addSource(r'''
+class I<T> {
+  factory I() => new A<T>();
+}
+class A<T> implements I {
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_returnOfInvalidType_subtype() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+A f(B b) { return b; }''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_returnOfInvalidType_supertype() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+B f(A a) { return a; }''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_returnOfInvalidType_typeParameter_18468() {
+    // https://code.google.com/p/dart/issues/detail?id=18468
+    //
+    // This test verifies that the type of T is more specific than Type,
+    // where T is a type parameter and Type is the type Type from
+    // core, this particular test case comes from issue 18468.
+    //
+    // A test cannot be added to TypeParameterTypeImplTest since the types
+    // returned out of the TestTypeProvider don't have a mock 'dart.core'
+    // enclosing library element.
+    // See TypeParameterTypeImpl.isMoreSpecificThan().
+    Source source = addSource(r'''
+class Foo<T> {
+  Type get t => T;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source);
+    verify([source]);
+  }
+
+  void test_returnOfInvalidType_void() {
+    Source source = addSource(r'''
+void f1() {}
+void f2() { return; }
+void f3() { return null; }
+void f4() { return g1(); }
+void f5() { return g2(); }
+g1() {}
+void g2() {}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_returnWithoutValue_noReturnType() {
+    Source source = addSource("f() { return; }");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_returnWithoutValue_void() {
+    Source source = addSource("void f() { return; }");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_reversedTypeArguments() {
+    Source source = addSource(r'''
+class Codec<S1, T1> {
+  Codec<T1, S1> get inverted => new _InvertedCodec<T1, S1>(this);
+}
+class _InvertedCodec<T2, S2> extends Codec<T2, S2> {
+  _InvertedCodec(Codec<S2, T2> codec);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_sharedDeferredPrefix() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+f1() {}''',
+      r'''
+library lib2;
+f2() {}''',
+      r'''
+library lib3;
+f3() {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as lib1;
+import 'lib2.dart' as lib;
+import 'lib3.dart' as lib;
+main() { lib1.f1(); lib.f2(); lib.f3(); }'''
+    ], <ErrorCode>[]);
+  }
+
+  void test_staticAccessToInstanceMember_annotation() {
+    Source source = addSource(r'''
+class A {
+  const A.name();
+}
+@A.name()
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_staticAccessToInstanceMember_method() {
+    Source source = addSource(r'''
+class A {
+  static m() {}
+}
+main() {
+  A.m;
+  A.m();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_staticAccessToInstanceMember_propertyAccess_field() {
+    Source source = addSource(r'''
+class A {
+  static var f;
+}
+main() {
+  A.f;
+  A.f = 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_staticAccessToInstanceMember_propertyAccess_propertyAccessor() {
+    Source source = addSource(r'''
+class A {
+  static get f => 42;
+  static set f(x) {}
+}
+main() {
+  A.f;
+  A.f = 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_superInInvalidContext() {
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+class B extends A {
+  B() {
+    var v = super.m();
+  }
+  n() {
+    var v = super.m();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typeAliasCannotReferenceItself_returnClass_withTypeAlias() {
+    Source source = addSource(r'''
+typedef B A();
+class B {
+  A a;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_const() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+class G<E extends A> {
+  const G();
+}
+f() { return const G<B>(); }''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_new() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+class G<E extends A> {}
+f() { return new G<B>(); }''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_typeArgumentList_0() {
+    Source source = addSource("abstract class A<T extends A>{}");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_typeArgumentList_1() {
+    Source source = addSource("abstract class A<T extends A<A>>{}");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_typeArgumentList_20() {
+    Source source = addSource(
+        "abstract class A<T extends A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A>>>>>>>>>>>>>>>>>>>>>{}");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typePromotion_booleanAnd_useInRight() {
+    Source source = addSource(r'''
+main(Object p) {
+  p is String && p.length != 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typePromotion_booleanAnd_useInRight_accessedInClosureRight_noAssignment() {
+    Source source = addSource(r'''
+callMe(f()) { f(); }
+main(Object p) {
+  (p is String) && callMe(() { p.length; });
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typePromotion_conditional_issue14655() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+class C extends B {
+  mc() {}
+}
+print(_) {}
+main(A p) {
+  (p is C) && (print(() => p) && (p is B)) ? p.mc() : p = null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typePromotion_conditional_useInThen() {
+    Source source = addSource(r'''
+main(Object p) {
+  p is String ? p.length : 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typePromotion_conditional_useInThen_accessedInClosure_noAssignment() {
+    Source source = addSource(r'''
+callMe(f()) { f(); }
+main(Object p) {
+  p is String ? callMe(() { p.length; }) : 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typePromotion_functionType_arg_ignoreIfNotMoreSpecific() {
+    Source source = addSource(r'''
+typedef FuncB(B b);
+typedef FuncA(A a);
+class A {}
+class B {}
+main(FuncA f) {
+  if (f is FuncB) {
+    f(new A());
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typePromotion_functionType_return_ignoreIfNotMoreSpecific() {
+    Source source = addSource(r'''
+class A {}
+typedef FuncAtoDyn(A a);
+typedef FuncDynToDyn(x);
+main(FuncAtoDyn f) {
+  if (f is FuncDynToDyn) {
+    A a = f(new A());
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typePromotion_functionType_return_voidToDynamic() {
+    Source source = addSource(r'''
+typedef FuncDynToDyn(x);
+typedef void FuncDynToVoid(x);
+class A {}
+main(FuncDynToVoid f) {
+  if (f is FuncDynToDyn) {
+    A a = f(null);
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typePromotion_if_accessedInClosure_noAssignment() {
+    Source source = addSource(r'''
+callMe(f()) { f(); }
+main(Object p) {
+  if (p is String) {
+    callMe(() {
+      p.length;
+    });
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typePromotion_if_extends_moreSpecific() {
+    Source source = addSource(r'''
+class V {}
+class VP extends V {}
+class A<T> {}
+class B<S> extends A<S> {
+  var b;
+}
+
+main(A<V> p) {
+  if (p is B<VP>) {
+    p.b;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typePromotion_if_hasAssignment_outsideAfter() {
+    Source source = addSource(r'''
+main(Object p) {
+  if (p is String) {
+    p.length;
+  }
+  p = 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typePromotion_if_hasAssignment_outsideBefore() {
+    Source source = addSource(r'''
+main(Object p, Object p2) {
+  p = p2;
+  if (p is String) {
+    p.length;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typePromotion_if_implements_moreSpecific() {
+    Source source = addSource(r'''
+class V {}
+class VP extends V {}
+class A<T> {}
+class B<S> implements A<S> {
+  var b;
+}
+
+main(A<V> p) {
+  if (p is B<VP>) {
+    p.b;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typePromotion_if_inClosure_assignedAfter_inSameFunction() {
+    Source source = addSource(r'''
+main() {
+  f(Object p) {
+    if (p is String) {
+      p.length;
+    }
+    p = 0;
+  };
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typePromotion_if_is_and_left() {
+    Source source = addSource(r'''
+bool tt() => true;
+main(Object p) {
+  if (p is String && tt()) {
+    p.length;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typePromotion_if_is_and_right() {
+    Source source = addSource(r'''
+bool tt() => true;
+main(Object p) {
+  if (tt() && p is String) {
+    p.length;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typePromotion_if_is_and_subThenSuper() {
+    Source source = addSource(r'''
+class A {
+  var a;
+}
+class B extends A {
+  var b;
+}
+main(Object p) {
+  if (p is B && p is A) {
+    p.a;
+    p.b;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typePromotion_if_is_parenthesized() {
+    Source source = addSource(r'''
+main(Object p) {
+  if ((p is String)) {
+    p.length;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typePromotion_if_is_single() {
+    Source source = addSource(r'''
+main(Object p) {
+  if (p is String) {
+    p.length;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typePromotion_parentheses() {
+    Source source = addSource(r'''
+main(Object p) {
+  (p is String) ? p.length : 0;
+  (p) is String ? p.length : 0;
+  ((p)) is String ? p.length : 0;
+  ((p) is String) ? p.length : 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typeType_class() {
+    Source source = addSource(r'''
+class C {}
+f(Type t) {}
+main() {
+  f(C);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typeType_class_prefixed() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+class C {}''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+f(Type t) {}
+main() {
+  f(p.C);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typeType_functionTypeAlias() {
+    Source source = addSource(r'''
+typedef F();
+f(Type t) {}
+main() {
+  f(F);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_typeType_functionTypeAlias_prefixed() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+typedef F();''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+f(Type t) {}
+main() {
+  f(p.F);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_undefinedConstructorInInitializer_explicit_named() {
+    Source source = addSource(r'''
+class A {
+  A.named() {}
+}
+class B extends A {
+  B() : super.named();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_undefinedConstructorInInitializer_explicit_unnamed() {
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+class B extends A {
+  B() : super();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_undefinedConstructorInInitializer_hasOptionalParameters() {
+    Source source = addSource(r'''
+class A {
+  A([p]) {}
+}
+class B extends A {
+  B();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_undefinedConstructorInInitializer_implicit() {
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+class B extends A {
+  B();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_undefinedConstructorInInitializer_implicit_typeAlias() {
+    Source source = addSource(r'''
+class M {}
+class A = Object with M;
+class B extends A {
+  B();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_undefinedConstructorInInitializer_redirecting() {
+    Source source = addSource(r'''
+class Foo {
+  Foo.ctor();
+}
+class Bar extends Foo {
+  Bar() : this.ctor();
+  Bar.ctor() : super.ctor();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_undefinedGetter_static_conditionalAccess() {
+    // The conditional access operator '?.' can be used to access static
+    // fields.
+    Source source = addSource('''
+class A {
+  static var x;
+}
+var a = A?.x;
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_undefinedGetter_typeSubstitution() {
+    Source source = addSource(r'''
+class A<E> {
+  E element;
+}
+class B extends A<List> {
+  m() {
+    element.last;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_undefinedIdentifier_hide() {
+    Source source = addSource(r'''
+library L;
+export 'lib1.dart' hide a;''');
+    addNamedSource("/lib1.dart", "library lib1;");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_undefinedIdentifier_show() {
+    Source source = addSource(r'''
+library L;
+export 'lib1.dart' show a;''');
+    addNamedSource("/lib1.dart", "library lib1;");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_undefinedIdentifier_synthetic_whenExpression() {
+    Source source = addSource(r'''
+print(x) {}
+main() {
+  print(is String);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.MISSING_IDENTIFIER]);
+  }
+
+  void test_undefinedIdentifier_synthetic_whenMethodName() {
+    Source source = addSource(r'''
+print(x) {}
+main(int p) {
+  p.();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ParserErrorCode.MISSING_IDENTIFIER]);
+  }
+
+  void test_undefinedMethod_functionExpression_callMethod() {
+    Source source = addSource(r'''
+main() {
+  (() => null).call();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    // A call to verify(source) fails as '.call()' isn't resolved.
+  }
+
+  void test_undefinedMethod_functionExpression_directCall() {
+    Source source = addSource(r'''
+main() {
+  (() => null)();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    // A call to verify(source) fails as '(() => null)()' isn't resolved.
+  }
+
+  void test_undefinedMethod_static_conditionalAccess() {
+    // The conditional access operator '?.' can be used to access static
+    // methods.
+    Source source = addSource('''
+class A {
+  static void m() {}
+}
+f() { A?.m(); }
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_undefinedOperator_index() {
+    Source source = addSource(r'''
+class A {
+  operator [](a) {}
+  operator []=(a, b) {}
+}
+f(A a) {
+  a[0];
+  a[0] = 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_undefinedOperator_tilde() {
+    Source source = addSource(r'''
+const A = 3;
+const B = ~((1 << A) - 1);''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_undefinedSetter_importWithPrefix() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+set y(int value) {}''');
+    Source source = addSource(r'''
+import 'lib.dart' as x;
+main() {
+  x.y = 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_undefinedSetter_static_conditionalAccess() {
+    // The conditional access operator '?.' can be used to access static
+    // fields.
+    Source source = addSource('''
+class A {
+  static var x;
+}
+f() { A?.x = 1; }
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_undefinedSuperMethod_field() {
+    Source source = addSource(r'''
+class A {
+  var m;
+}
+class B extends A {
+  f() {
+    super.m();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_undefinedSuperMethod_method() {
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+class B extends A {
+  f() {
+    super.m();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unqualifiedReferenceToNonLocalStaticMember_fromComment_new() {
+    Source source = addSource(r'''
+class A {
+  A() {}
+  A.named() {}
+}
+/// [new A] or [new A.named]
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_uriDoesNotExist_dll() {
+    addNamedSource("/lib.dll", "");
+    Source source = addSource("import 'dart-ext:lib';");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_uriDoesNotExist_dylib() {
+    addNamedSource("/lib.dylib", "");
+    Source source = addSource("import 'dart-ext:lib';");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_uriDoesNotExist_so() {
+    addNamedSource("/lib.so", "");
+    Source source = addSource("import 'dart-ext:lib';");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_wrongNumberOfParametersForOperator1() {
+    _check_wrongNumberOfParametersForOperator1("<");
+    _check_wrongNumberOfParametersForOperator1(">");
+    _check_wrongNumberOfParametersForOperator1("<=");
+    _check_wrongNumberOfParametersForOperator1(">=");
+    _check_wrongNumberOfParametersForOperator1("+");
+    _check_wrongNumberOfParametersForOperator1("/");
+    _check_wrongNumberOfParametersForOperator1("~/");
+    _check_wrongNumberOfParametersForOperator1("*");
+    _check_wrongNumberOfParametersForOperator1("%");
+    _check_wrongNumberOfParametersForOperator1("|");
+    _check_wrongNumberOfParametersForOperator1("^");
+    _check_wrongNumberOfParametersForOperator1("&");
+    _check_wrongNumberOfParametersForOperator1("<<");
+    _check_wrongNumberOfParametersForOperator1(">>");
+    _check_wrongNumberOfParametersForOperator1("[]");
+  }
+
+  void test_wrongNumberOfParametersForOperator_index() {
+    Source source = addSource(r'''
+class A {
+  operator []=(a, b) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_wrongNumberOfParametersForOperator_minus() {
+    _check_wrongNumberOfParametersForOperator("-", "");
+    _check_wrongNumberOfParametersForOperator("-", "a");
+  }
+
+  void test_wrongNumberOfParametersForSetter() {
+    Source source = addSource(r'''
+class A {
+  set x(a) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yield_async_to_dynamic_type() {
+    Source source = addSource('''
+dynamic f() async* {
+  yield 3;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yield_async_to_generic_type() {
+    Source source = addSource('''
+import 'dart:async';
+Stream f() async* {
+  yield 3;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yield_async_to_parameterized_type() {
+    Source source = addSource('''
+import 'dart:async';
+Stream<int> f() async* {
+  yield 3;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yield_async_to_untyped() {
+    Source source = addSource('''
+f() async* {
+  yield 3;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yield_each_async_dynamic_to_dynamic() {
+    Source source = addSource('''
+f() async* {
+  yield* g();
+}
+g() => null;
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yield_each_async_dynamic_to_stream() {
+    Source source = addSource('''
+import 'dart:async';
+Stream f() async* {
+  yield* g();
+}
+g() => null;
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yield_each_async_dynamic_to_typed_stream() {
+    Source source = addSource('''
+import 'dart:async';
+Stream<int> f() async* {
+  yield* g();
+}
+g() => null;
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yield_each_async_stream_to_dynamic() {
+    Source source = addSource('''
+import 'dart:async';
+f() async* {
+  yield* g();
+}
+Stream g() => null;
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yield_each_async_typed_stream_to_dynamic() {
+    Source source = addSource('''
+import 'dart:async';
+f() async* {
+  yield* g();
+}
+Stream<int> g() => null;
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yield_each_async_typed_stream_to_typed_stream() {
+    Source source = addSource('''
+import 'dart:async';
+Stream<int> f() async* {
+  yield* g();
+}
+Stream<int> g() => null;
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yield_each_sync_dynamic_to_dynamic() {
+    Source source = addSource('''
+f() sync* {
+  yield* g();
+}
+g() => null;
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yield_each_sync_dynamic_to_iterable() {
+    Source source = addSource('''
+Iterable f() sync* {
+  yield* g();
+}
+g() => null;
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yield_each_sync_dynamic_to_typed_iterable() {
+    Source source = addSource('''
+Iterable<int> f() sync* {
+  yield* g();
+}
+g() => null;
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yield_each_sync_iterable_to_dynamic() {
+    Source source = addSource('''
+f() sync* {
+  yield* g();
+}
+Iterable g() => null;
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yield_each_sync_typed_iterable_to_dynamic() {
+    Source source = addSource('''
+f() sync* {
+  yield* g();
+}
+Iterable<int> g() => null;
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yield_each_sync_typed_iterable_to_typed_iterable() {
+    Source source = addSource('''
+Iterable<int> f() sync* {
+  yield* g();
+}
+Iterable<int> g() => null;
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yield_sync_to_dynamic_type() {
+    Source source = addSource('''
+dynamic f() sync* {
+  yield 3;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yield_sync_to_generic_type() {
+    Source source = addSource('''
+Iterable f() sync* {
+  yield 3;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yield_sync_to_parameterized_type() {
+    Source source = addSource('''
+Iterable<int> f() sync* {
+  yield 3;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yield_sync_to_untyped() {
+    Source source = addSource('''
+f() sync* {
+  yield 3;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yieldInNonGenerator_asyncStar() {
+    Source source = addSource(r'''
+f() async* {
+  yield 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_yieldInNonGenerator_syncStar() {
+    Source source = addSource(r'''
+f() sync* {
+  yield 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void _check_wrongNumberOfParametersForOperator(
+      String name, String parameters) {
+    Source source = addSource("""
+class A {
+  operator $name($parameters) {}
+}""");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+    reset();
+  }
+
+  void _check_wrongNumberOfParametersForOperator1(String name) {
+    _check_wrongNumberOfParametersForOperator(name, "a");
+  }
+
+  CompilationUnit _getResolvedLibraryUnit(Source source) =>
+      analysisContext.getResolvedCompilationUnit2(source, source);
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/parser_test.dart b/mojo/public/dart/third_party/analyzer/test/generated/parser_test.dart
new file mode 100644
index 0000000..98e80de
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/generated/parser_test.dart
@@ -0,0 +1,10694 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.parser_test;
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/incremental_scanner.dart';
+import 'package:analyzer/src/generated/parser.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/source.dart' show Source;
+import 'package:analyzer/src/generated/testing/ast_factory.dart';
+import 'package:analyzer/src/generated/testing/element_factory.dart';
+import 'package:analyzer/src/generated/testing/token_factory.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+import '../utils.dart';
+import 'test_support.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(ComplexParserTest);
+  runReflectiveTests(ErrorParserTest);
+  runReflectiveTests(IncrementalParserTest);
+  runReflectiveTests(NonErrorParserTest);
+  runReflectiveTests(RecoveryParserTest);
+  runReflectiveTests(ResolutionCopierTest);
+  runReflectiveTests(SimpleParserTest);
+}
+
+class AnalysisErrorListener_SimpleParserTest_computeStringValue
+    implements AnalysisErrorListener {
+  @override
+  void onError(AnalysisError event) {
+    fail(
+        "Unexpected compilation error: ${event.message} (${event.offset}, ${event.length})");
+  }
+}
+
+/**
+ * Instances of the class `AstValidator` are used to validate the correct construction of an
+ * AST structure.
+ */
+class AstValidator extends UnifyingAstVisitor<Object> {
+  /**
+   * A list containing the errors found while traversing the AST structure.
+   */
+  List<String> _errors = new List<String>();
+
+  /**
+   * Assert that no errors were found while traversing any of the AST structures that have been
+   * visited.
+   */
+  void assertValid() {
+    if (!_errors.isEmpty) {
+      StringBuffer buffer = new StringBuffer();
+      buffer.write("Invalid AST structure:");
+      for (String message in _errors) {
+        buffer.write("\r\n   ");
+        buffer.write(message);
+      }
+      fail(buffer.toString());
+    }
+  }
+
+  @override
+  Object visitNode(AstNode node) {
+    _validate(node);
+    return super.visitNode(node);
+  }
+
+  /**
+   * Validate that the given AST node is correctly constructed.
+   *
+   * @param node the AST node being validated
+   */
+  void _validate(AstNode node) {
+    AstNode parent = node.parent;
+    if (node is CompilationUnit) {
+      if (parent != null) {
+        _errors.add("Compilation units should not have a parent");
+      }
+    } else {
+      if (parent == null) {
+        _errors.add("No parent for ${node.runtimeType}");
+      }
+    }
+    if (node.beginToken == null) {
+      _errors.add("No begin token for ${node.runtimeType}");
+    }
+    if (node.endToken == null) {
+      _errors.add("No end token for ${node.runtimeType}");
+    }
+    int nodeStart = node.offset;
+    int nodeLength = node.length;
+    if (nodeStart < 0 || nodeLength < 0) {
+      _errors.add("No source info for ${node.runtimeType}");
+    }
+    if (parent != null) {
+      int nodeEnd = nodeStart + nodeLength;
+      int parentStart = parent.offset;
+      int parentEnd = parentStart + parent.length;
+      if (nodeStart < parentStart) {
+        _errors.add(
+            "Invalid source start ($nodeStart) for ${node.runtimeType} inside ${parent.runtimeType} ($parentStart)");
+      }
+      if (nodeEnd > parentEnd) {
+        _errors.add(
+            "Invalid source end ($nodeEnd) for ${node.runtimeType} inside ${parent.runtimeType} ($parentStart)");
+      }
+    }
+  }
+}
+
+/**
+ * The class `ComplexParserTest` defines parser tests that test the parsing of more complex
+ * code fragments or the interactions between multiple parsing methods. For example, tests to ensure
+ * that the precedence of operations is being handled correctly should be defined in this class.
+ *
+ * Simpler tests should be defined in the class [SimpleParserTest].
+ */
+@reflectiveTest
+class ComplexParserTest extends ParserTestCase {
+  void test_additiveExpression_normal() {
+    BinaryExpression expression = parseExpression("x + y - z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_additiveExpression_noSpaces() {
+    BinaryExpression expression = parseExpression("i+1");
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftOperand);
+    EngineTestCase.assertInstanceOf((obj) => obj is IntegerLiteral,
+        IntegerLiteral, expression.rightOperand);
+  }
+
+  void test_additiveExpression_precedence_multiplicative_left() {
+    BinaryExpression expression = parseExpression("x * y + z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_additiveExpression_precedence_multiplicative_left_withSuper() {
+    BinaryExpression expression = parseExpression("super * y - z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_additiveExpression_precedence_multiplicative_right() {
+    BinaryExpression expression = parseExpression("x + y * z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.rightOperand);
+  }
+
+  void test_additiveExpression_super() {
+    BinaryExpression expression = parseExpression("super + y - z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_assignableExpression_arguments_normal_chain() {
+    PropertyAccess propertyAccess1 = parseExpression("a(b)(c).d(e).f");
+    expect(propertyAccess1.propertyName.name, "f");
+    //
+    // a(b)(c).d(e)
+    //
+    MethodInvocation invocation2 = EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodInvocation,
+        MethodInvocation,
+        propertyAccess1.target);
+    expect(invocation2.methodName.name, "d");
+    expect(invocation2.typeArguments, isNull);
+    ArgumentList argumentList2 = invocation2.argumentList;
+    expect(argumentList2, isNotNull);
+    expect(argumentList2.arguments, hasLength(1));
+    //
+    // a(b)(c)
+    //
+    FunctionExpressionInvocation invocation3 = EngineTestCase.assertInstanceOf(
+        (obj) => obj is FunctionExpressionInvocation,
+        FunctionExpressionInvocation,
+        invocation2.target);
+    expect(invocation3.typeArguments, isNull);
+    ArgumentList argumentList3 = invocation3.argumentList;
+    expect(argumentList3, isNotNull);
+    expect(argumentList3.arguments, hasLength(1));
+    //
+    // a(b)
+    //
+    MethodInvocation invocation4 = EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodInvocation,
+        MethodInvocation,
+        invocation3.function);
+    expect(invocation4.methodName.name, "a");
+    expect(invocation4.typeArguments, isNull);
+    ArgumentList argumentList4 = invocation4.argumentList;
+    expect(argumentList4, isNotNull);
+    expect(argumentList4.arguments, hasLength(1));
+  }
+
+  void test_assignableExpression_arguments_normal_chain_typeArguments() {
+    enableGenericMethods = true;
+    PropertyAccess propertyAccess1 = parseExpression("a<E>(b)<F>(c).d<G>(e).f");
+    expect(propertyAccess1.propertyName.name, "f");
+    //
+    // a<E>(b)<F>(c).d>G?(e)
+    //
+    MethodInvocation invocation2 = EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodInvocation,
+        MethodInvocation,
+        propertyAccess1.target);
+    expect(invocation2.methodName.name, "d");
+    expect(invocation2.typeArguments, isNotNull);
+    ArgumentList argumentList2 = invocation2.argumentList;
+    expect(argumentList2, isNotNull);
+    expect(argumentList2.arguments, hasLength(1));
+    //
+    // a<E>(b)<F>(c)
+    //
+    FunctionExpressionInvocation invocation3 = EngineTestCase.assertInstanceOf(
+        (obj) => obj is FunctionExpressionInvocation,
+        FunctionExpressionInvocation,
+        invocation2.target);
+    expect(invocation3.typeArguments, isNotNull);
+    ArgumentList argumentList3 = invocation3.argumentList;
+    expect(argumentList3, isNotNull);
+    expect(argumentList3.arguments, hasLength(1));
+    //
+    // a(b)
+    //
+    MethodInvocation invocation4 = EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodInvocation,
+        MethodInvocation,
+        invocation3.function);
+    expect(invocation4.methodName.name, "a");
+    expect(invocation4.typeArguments, isNotNull);
+    ArgumentList argumentList4 = invocation4.argumentList;
+    expect(argumentList4, isNotNull);
+    expect(argumentList4.arguments, hasLength(1));
+  }
+
+  void test_assignmentExpression_compound() {
+    AssignmentExpression expression = parseExpression("x = y = 0");
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftHandSide);
+    EngineTestCase.assertInstanceOf((obj) => obj is AssignmentExpression,
+        AssignmentExpression, expression.rightHandSide);
+  }
+
+  void test_assignmentExpression_indexExpression() {
+    AssignmentExpression expression = parseExpression("x[1] = 0");
+    EngineTestCase.assertInstanceOf((obj) => obj is IndexExpression,
+        IndexExpression, expression.leftHandSide);
+    EngineTestCase.assertInstanceOf((obj) => obj is IntegerLiteral,
+        IntegerLiteral, expression.rightHandSide);
+  }
+
+  void test_assignmentExpression_prefixedIdentifier() {
+    AssignmentExpression expression = parseExpression("x.y = 0");
+    EngineTestCase.assertInstanceOf((obj) => obj is PrefixedIdentifier,
+        PrefixedIdentifier, expression.leftHandSide);
+    EngineTestCase.assertInstanceOf((obj) => obj is IntegerLiteral,
+        IntegerLiteral, expression.rightHandSide);
+  }
+
+  void test_assignmentExpression_propertyAccess() {
+    AssignmentExpression expression = parseExpression("super.y = 0");
+    EngineTestCase.assertInstanceOf((obj) => obj is PropertyAccess,
+        PropertyAccess, expression.leftHandSide);
+    EngineTestCase.assertInstanceOf((obj) => obj is IntegerLiteral,
+        IntegerLiteral, expression.rightHandSide);
+  }
+
+  void test_bitwiseAndExpression_normal() {
+    BinaryExpression expression = parseExpression("x & y & z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseAndExpression_precedence_equality_left() {
+    BinaryExpression expression = parseExpression("x == y && z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseAndExpression_precedence_equality_right() {
+    BinaryExpression expression = parseExpression("x && y == z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.rightOperand);
+  }
+
+  void test_bitwiseAndExpression_super() {
+    BinaryExpression expression = parseExpression("super & y & z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseOrExpression_normal() {
+    BinaryExpression expression = parseExpression("x | y | z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseOrExpression_precedence_xor_left() {
+    BinaryExpression expression = parseExpression("x ^ y | z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseOrExpression_precedence_xor_right() {
+    BinaryExpression expression = parseExpression("x | y ^ z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.rightOperand);
+  }
+
+  void test_bitwiseOrExpression_super() {
+    BinaryExpression expression = parseExpression("super | y | z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseXorExpression_normal() {
+    BinaryExpression expression = parseExpression("x ^ y ^ z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseXorExpression_precedence_and_left() {
+    BinaryExpression expression = parseExpression("x & y ^ z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseXorExpression_precedence_and_right() {
+    BinaryExpression expression = parseExpression("x ^ y & z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.rightOperand);
+  }
+
+  void test_bitwiseXorExpression_super() {
+    BinaryExpression expression = parseExpression("super ^ y ^ z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_cascade_withAssignment() {
+    CascadeExpression cascade =
+        parseExpression("new Map()..[3] = 4 ..[0] = 11;");
+    Expression target = cascade.target;
+    for (Expression section in cascade.cascadeSections) {
+      EngineTestCase.assertInstanceOf(
+          (obj) => obj is AssignmentExpression, AssignmentExpression, section);
+      Expression lhs = (section as AssignmentExpression).leftHandSide;
+      EngineTestCase.assertInstanceOf(
+          (obj) => obj is IndexExpression, IndexExpression, lhs);
+      IndexExpression index = lhs as IndexExpression;
+      expect(index.isCascaded, isTrue);
+      expect(index.realTarget, same(target));
+    }
+  }
+
+  void test_conditionalExpression_precedence_ifNullExpression() {
+    ConditionalExpression expression = parseExpression('a ?? b ? y : z');
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.condition);
+  }
+
+  void test_conditionalExpression_precedence_logicalOrExpression() {
+    ConditionalExpression expression = parseExpression("a | b ? y : z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.condition);
+  }
+
+  void test_constructor_initializer_withParenthesizedExpression() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(r'''
+class C {
+  C() :
+    this.a = (b == null ? c : d) {
+  }
+}''');
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    expect(declarations, hasLength(1));
+  }
+
+  void test_equalityExpression_normal() {
+    BinaryExpression expression = parseExpression(
+        "x == y != z", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_equalityExpression_precedence_relational_left() {
+    BinaryExpression expression = parseExpression("x is y == z");
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is IsExpression, IsExpression, expression.leftOperand);
+  }
+
+  void test_equalityExpression_precedence_relational_right() {
+    BinaryExpression expression = parseExpression("x == y is z");
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is IsExpression, IsExpression, expression.rightOperand);
+  }
+
+  void test_equalityExpression_super() {
+    BinaryExpression expression = parseExpression("super == y != z",
+        [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_ifNullExpression() {
+    BinaryExpression expression = parseExpression('x ?? y ?? z');
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_ifNullExpression_precedence_logicalOr_left() {
+    BinaryExpression expression = parseExpression('x || y ?? z');
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_ifNullExpression_precendce_logicalOr_right() {
+    BinaryExpression expression = parseExpression('x ?? y || z');
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.rightOperand);
+  }
+
+  void test_logicalAndExpression() {
+    BinaryExpression expression = parseExpression("x && y && z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_logicalAndExpression_precedence_bitwiseOr_left() {
+    BinaryExpression expression = parseExpression("x | y < z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_logicalAndExpression_precedence_bitwiseOr_right() {
+    BinaryExpression expression = parseExpression("x < y | z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.rightOperand);
+  }
+
+  void test_logicalOrExpression() {
+    BinaryExpression expression = parseExpression("x || y || z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_logicalOrExpression_precedence_logicalAnd_left() {
+    BinaryExpression expression = parseExpression("x && y || z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_logicalOrExpression_precedence_logicalAnd_right() {
+    BinaryExpression expression = parseExpression("x || y && z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.rightOperand);
+  }
+
+  void test_multipleLabels_statement() {
+    LabeledStatement statement =
+        ParserTestCase.parseStatement("a: b: c: return x;");
+    expect(statement.labels, hasLength(3));
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ReturnStatement, ReturnStatement, statement.statement);
+  }
+
+  void test_multiplicativeExpression_normal() {
+    BinaryExpression expression = parseExpression("x * y / z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_multiplicativeExpression_precedence_unary_left() {
+    BinaryExpression expression = parseExpression("-x * y");
+    EngineTestCase.assertInstanceOf((obj) => obj is PrefixExpression,
+        PrefixExpression, expression.leftOperand);
+  }
+
+  void test_multiplicativeExpression_precedence_unary_right() {
+    BinaryExpression expression = parseExpression("x * -y");
+    EngineTestCase.assertInstanceOf((obj) => obj is PrefixExpression,
+        PrefixExpression, expression.rightOperand);
+  }
+
+  void test_multiplicativeExpression_super() {
+    BinaryExpression expression = parseExpression("super * y / z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_relationalExpression_precedence_shift_right() {
+    IsExpression expression = parseExpression("x << y is z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.expression);
+  }
+
+  void test_shiftExpression_normal() {
+    BinaryExpression expression = parseExpression("x >> 4 << 3");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_shiftExpression_precedence_additive_left() {
+    BinaryExpression expression = parseExpression("x + y << z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_shiftExpression_precedence_additive_right() {
+    BinaryExpression expression = parseExpression("x << y + z");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.rightOperand);
+  }
+
+  void test_shiftExpression_super() {
+    BinaryExpression expression = parseExpression("super >> 4 << 3");
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+}
+
+/**
+ * The class `ErrorParserTest` defines parser tests that test the parsing of code to ensure
+ * that errors are correctly reported, and in some cases, not reported.
+ */
+@reflectiveTest
+class ErrorParserTest extends ParserTestCase {
+  void fail_expectedListOrMapLiteral() {
+    // It isn't clear that this test can ever pass. The parser is currently
+    // create a synthetic list literal in this case, but isSynthetic() isn't
+    // overridden for ListLiteral. The problem is that the synthetic list
+    // literals that are being created are not always zero length (because they
+    // could have type parameters), which violates the contract of
+    // isSynthetic().
+    TypedLiteral literal = parse3("parseListOrMapLiteral", <Object>[null], "1",
+        [ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL]);
+    expect(literal.isSynthetic, isTrue);
+  }
+
+  void fail_illegalAssignmentToNonAssignable_superAssigned() {
+    // TODO(brianwilkerson) When this test starts to pass, remove the test
+    // test_illegalAssignmentToNonAssignable_superAssigned.
+    parseExpression(
+        "super = x;", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
+  }
+
+  void fail_invalidCommentReference__new_nonIdentifier() {
+    // This test fails because the method parseCommentReference returns null.
+    parse3("parseCommentReference", <Object>["new 42", 0], "",
+        [ParserErrorCode.INVALID_COMMENT_REFERENCE]);
+  }
+
+  void fail_invalidCommentReference__new_tooMuch() {
+    parse3("parseCommentReference", <Object>["new a.b.c.d", 0], "",
+        [ParserErrorCode.INVALID_COMMENT_REFERENCE]);
+  }
+
+  void fail_invalidCommentReference__nonNew_nonIdentifier() {
+    // This test fails because the method parseCommentReference returns null.
+    parse3("parseCommentReference", <Object>["42", 0], "",
+        [ParserErrorCode.INVALID_COMMENT_REFERENCE]);
+  }
+
+  void fail_invalidCommentReference__nonNew_tooMuch() {
+    parse3("parseCommentReference", <Object>["a.b.c.d", 0], "",
+        [ParserErrorCode.INVALID_COMMENT_REFERENCE]);
+  }
+
+  void fail_missingClosingParenthesis() {
+    // It is possible that it is not possible to generate this error (that it's
+    // being reported in code that cannot actually be reached), but that hasn't
+    // been proven yet.
+    parse4("parseFormalParameterList", "(int a, int b ;",
+        [ParserErrorCode.MISSING_CLOSING_PARENTHESIS]);
+  }
+
+  void fail_missingFunctionParameters_local_nonVoid_block() {
+    // The parser does not recognize this as a function declaration, so it tries
+    // to parse it as an expression statement. It isn't clear what the best
+    // error message is in this case.
+    ParserTestCase.parseStatement(
+        "int f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+  }
+
+  void fail_missingFunctionParameters_local_nonVoid_expression() {
+    // The parser does not recognize this as a function declaration, so it tries
+    // to parse it as an expression statement. It isn't clear what the best
+    // error message is in this case.
+    ParserTestCase.parseStatement(
+        "int f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+  }
+
+  void fail_namedFunctionExpression() {
+    Expression expression = parse4("parsePrimaryExpression", "f() {}",
+        [ParserErrorCode.NAMED_FUNCTION_EXPRESSION]);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is FunctionExpression, FunctionExpression, expression);
+  }
+
+  void fail_unexpectedToken_invalidPostfixExpression() {
+    // Note: this might not be the right error to produce, but some error should
+    // be produced
+    parseExpression("f()++", [ParserErrorCode.UNEXPECTED_TOKEN]);
+  }
+
+  void fail_varAndType_local() {
+    // This is currently reporting EXPECTED_TOKEN for a missing semicolon, but
+    // this would be a better error message.
+    ParserTestCase.parseStatement("var int x;", [ParserErrorCode.VAR_AND_TYPE]);
+  }
+
+  void fail_varAndType_parameter() {
+    // This is currently reporting EXPECTED_TOKEN for a missing semicolon, but
+    // this would be a better error message.
+    parse4("parseFormalParameterList", "(var int x)",
+        [ParserErrorCode.VAR_AND_TYPE]);
+  }
+
+  void test_abstractClassMember_constructor() {
+    parse3("parseClassMember", <Object>["C"], "abstract C.c();",
+        [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
+  }
+
+  void test_abstractClassMember_field() {
+    parse3("parseClassMember", <Object>["C"], "abstract C f;",
+        [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
+  }
+
+  void test_abstractClassMember_getter() {
+    parse3("parseClassMember", <Object>["C"], "abstract get m;",
+        [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
+  }
+
+  void test_abstractClassMember_method() {
+    parse3("parseClassMember", <Object>["C"], "abstract m();",
+        [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
+  }
+
+  void test_abstractClassMember_setter() {
+    parse3("parseClassMember", <Object>["C"], "abstract set m(v);",
+        [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
+  }
+
+  void test_abstractEnum() {
+    ParserTestCase.parseCompilationUnit(
+        "abstract enum E {ONE}", [ParserErrorCode.ABSTRACT_ENUM]);
+  }
+
+  void test_abstractTopLevelFunction_function() {
+    ParserTestCase.parseCompilationUnit(
+        "abstract f(v) {}", [ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION]);
+  }
+
+  void test_abstractTopLevelFunction_getter() {
+    ParserTestCase.parseCompilationUnit(
+        "abstract get m {}", [ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION]);
+  }
+
+  void test_abstractTopLevelFunction_setter() {
+    ParserTestCase.parseCompilationUnit(
+        "abstract set m(v) {}", [ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION]);
+  }
+
+  void test_abstractTopLevelVariable() {
+    ParserTestCase.parseCompilationUnit(
+        "abstract C f;", [ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE]);
+  }
+
+  void test_abstractTypeDef() {
+    ParserTestCase.parseCompilationUnit(
+        "abstract typedef F();", [ParserErrorCode.ABSTRACT_TYPEDEF]);
+  }
+
+  void test_annotationOnEnumConstant_first() {
+    ParserTestCase.parseCompilationUnit("enum E { @override C }",
+        [ParserErrorCode.ANNOTATION_ON_ENUM_CONSTANT]);
+  }
+
+  void test_annotationOnEnumConstant_middle() {
+    ParserTestCase.parseCompilationUnit("enum E { C, @override D, E }",
+        [ParserErrorCode.ANNOTATION_ON_ENUM_CONSTANT]);
+  }
+
+  void test_assertDoesNotTakeAssignment() {
+    parse4("parseAssertStatement", "assert(b = true);",
+        [ParserErrorCode.ASSERT_DOES_NOT_TAKE_ASSIGNMENT]);
+  }
+
+  void test_assertDoesNotTakeCascades() {
+    parse4("parseAssertStatement", "assert(new A()..m());",
+        [ParserErrorCode.ASSERT_DOES_NOT_TAKE_CASCADE]);
+  }
+
+  void test_assertDoesNotTakeRethrow() {
+    parse4("parseAssertStatement", "assert(rethrow);",
+        [ParserErrorCode.ASSERT_DOES_NOT_TAKE_RETHROW]);
+  }
+
+  void test_assertDoesNotTakeThrow() {
+    parse4("parseAssertStatement", "assert(throw x);",
+        [ParserErrorCode.ASSERT_DOES_NOT_TAKE_THROW]);
+  }
+
+  void test_breakOutsideOfLoop_breakInDoStatement() {
+    parse4("parseDoStatement", "do {break;} while (x);");
+  }
+
+  void test_breakOutsideOfLoop_breakInForStatement() {
+    parse4("parseForStatement", "for (; x;) {break;}");
+  }
+
+  void test_breakOutsideOfLoop_breakInIfStatement() {
+    parse4("parseIfStatement", "if (x) {break;}",
+        [ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]);
+  }
+
+  void test_breakOutsideOfLoop_breakInSwitchStatement() {
+    parse4("parseSwitchStatement", "switch (x) {case 1: break;}");
+  }
+
+  void test_breakOutsideOfLoop_breakInWhileStatement() {
+    parse4("parseWhileStatement", "while (x) {break;}");
+  }
+
+  void test_breakOutsideOfLoop_functionExpression_inALoop() {
+    ParserTestCase.parseStatement(
+        "for(; x;) {() {break;};}", [ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]);
+  }
+
+  void test_breakOutsideOfLoop_functionExpression_withALoop() {
+    ParserTestCase.parseStatement("() {for (; x;) {break;}};");
+  }
+
+  void test_classInClass_abstract() {
+    ParserTestCase.parseCompilationUnit(
+        "class C { abstract class B {} }", [ParserErrorCode.CLASS_IN_CLASS]);
+  }
+
+  void test_classInClass_nonAbstract() {
+    ParserTestCase.parseCompilationUnit(
+        "class C { class B {} }", [ParserErrorCode.CLASS_IN_CLASS]);
+  }
+
+  void test_classTypeAlias_abstractAfterEq() {
+    // This syntax has been removed from the language in favor of
+    // "abstract class A = B with C;" (issue 18098).
+    parse3(
+        "parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()],
+        "class A = abstract B with C;",
+        [ParserErrorCode.EXPECTED_TOKEN, ParserErrorCode.EXPECTED_TOKEN]);
+  }
+
+  void test_colonInPlaceOfIn() {
+    ParserTestCase.parseStatement(
+        "for (var x : list) {}", [ParserErrorCode.COLON_IN_PLACE_OF_IN]);
+  }
+
+  void test_constAndFinal() {
+    parse3("parseClassMember", <Object>["C"], "const final int x;",
+        [ParserErrorCode.CONST_AND_FINAL]);
+  }
+
+  void test_constAndVar() {
+    parse3("parseClassMember", <Object>["C"], "const var x;",
+        [ParserErrorCode.CONST_AND_VAR]);
+  }
+
+  void test_constClass() {
+    ParserTestCase.parseCompilationUnit(
+        "const class C {}", [ParserErrorCode.CONST_CLASS]);
+  }
+
+  void test_constConstructorWithBody() {
+    parse3("parseClassMember", <Object>["C"], "const C() {}",
+        [ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY]);
+  }
+
+  void test_constEnum() {
+    ParserTestCase.parseCompilationUnit(
+        "const enum E {ONE}", [ParserErrorCode.CONST_ENUM]);
+  }
+
+  void test_constFactory() {
+    parse3("parseClassMember", <Object>["C"], "const factory C() {}",
+        [ParserErrorCode.CONST_FACTORY]);
+  }
+
+  void test_constMethod() {
+    parse3("parseClassMember", <Object>["C"], "const int m() {}",
+        [ParserErrorCode.CONST_METHOD]);
+  }
+
+  void test_constructorWithReturnType() {
+    parse3("parseClassMember", <Object>["C"], "C C() {}",
+        [ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE]);
+  }
+
+  void test_constructorWithReturnType_var() {
+    parse3("parseClassMember", <Object>["C"], "var C() {}",
+        [ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE]);
+  }
+
+  void test_constTypedef() {
+    ParserTestCase.parseCompilationUnit(
+        "const typedef F();", [ParserErrorCode.CONST_TYPEDEF]);
+  }
+
+  void test_continueOutsideOfLoop_continueInDoStatement() {
+    parse4("parseDoStatement", "do {continue;} while (x);");
+  }
+
+  void test_continueOutsideOfLoop_continueInForStatement() {
+    parse4("parseForStatement", "for (; x;) {continue;}");
+  }
+
+  void test_continueOutsideOfLoop_continueInIfStatement() {
+    parse4("parseIfStatement", "if (x) {continue;}",
+        [ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
+  }
+
+  void test_continueOutsideOfLoop_continueInSwitchStatement() {
+    parse4("parseSwitchStatement", "switch (x) {case 1: continue a;}");
+  }
+
+  void test_continueOutsideOfLoop_continueInWhileStatement() {
+    parse4("parseWhileStatement", "while (x) {continue;}");
+  }
+
+  void test_continueOutsideOfLoop_functionExpression_inALoop() {
+    ParserTestCase.parseStatement("for(; x;) {() {continue;};}",
+        [ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
+  }
+
+  void test_continueOutsideOfLoop_functionExpression_withALoop() {
+    ParserTestCase.parseStatement("() {for (; x;) {continue;}};");
+  }
+
+  void test_continueWithoutLabelInCase_error() {
+    parse4("parseSwitchStatement", "switch (x) {case 1: continue;}",
+        [ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE]);
+  }
+
+  void test_continueWithoutLabelInCase_noError() {
+    parse4("parseSwitchStatement", "switch (x) {case 1: continue a;}");
+  }
+
+  void test_continueWithoutLabelInCase_noError_switchInLoop() {
+    parse4(
+        "parseWhileStatement", "while (a) { switch (b) {default: continue;}}");
+  }
+
+  void test_deprecatedClassTypeAlias() {
+    ParserTestCase.parseCompilationUnit(
+        "typedef C = S with M;", [ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS]);
+  }
+
+  void test_deprecatedClassTypeAlias_withGeneric() {
+    ParserTestCase.parseCompilationUnit("typedef C<T> = S<T> with M;",
+        [ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS]);
+  }
+
+  void test_directiveAfterDeclaration_classBeforeDirective() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        "class Foo{} library l;",
+        [ParserErrorCode.DIRECTIVE_AFTER_DECLARATION]);
+    expect(unit, isNotNull);
+  }
+
+  void test_directiveAfterDeclaration_classBetweenDirectives() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        "library l;\nclass Foo{}\npart 'a.dart';",
+        [ParserErrorCode.DIRECTIVE_AFTER_DECLARATION]);
+    expect(unit, isNotNull);
+  }
+
+  void test_duplicatedModifier_const() {
+    parse3("parseClassMember", <Object>["C"], "const const m;",
+        [ParserErrorCode.DUPLICATED_MODIFIER]);
+  }
+
+  void test_duplicatedModifier_external() {
+    parse3("parseClassMember", <Object>["C"], "external external f();",
+        [ParserErrorCode.DUPLICATED_MODIFIER]);
+  }
+
+  void test_duplicatedModifier_factory() {
+    parse3("parseClassMember", <Object>["C"], "factory factory C() {}",
+        [ParserErrorCode.DUPLICATED_MODIFIER]);
+  }
+
+  void test_duplicatedModifier_final() {
+    parse3("parseClassMember", <Object>["C"], "final final m;",
+        [ParserErrorCode.DUPLICATED_MODIFIER]);
+  }
+
+  void test_duplicatedModifier_static() {
+    parse3("parseClassMember", <Object>["C"], "static static var m;",
+        [ParserErrorCode.DUPLICATED_MODIFIER]);
+  }
+
+  void test_duplicatedModifier_var() {
+    parse3("parseClassMember", <Object>["C"], "var var m;",
+        [ParserErrorCode.DUPLICATED_MODIFIER]);
+  }
+
+  void test_duplicateLabelInSwitchStatement() {
+    parse4(
+        "parseSwitchStatement",
+        "switch (e) {l1: case 0: break; l1: case 1: break;}",
+        [ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT]);
+  }
+
+  void test_emptyEnumBody() {
+    parse3("parseEnumDeclaration", <Object>[emptyCommentAndMetadata()],
+        "enum E {}", [ParserErrorCode.EMPTY_ENUM_BODY]);
+  }
+
+  void test_enumInClass() {
+    ParserTestCase.parseCompilationUnit(
+        r'''
+class Foo {
+  enum Bar {
+    Bar1, Bar2, Bar3
+  }
+}
+''',
+        [ParserErrorCode.ENUM_IN_CLASS]);
+  }
+
+  void test_equalityCannotBeEqualityOperand_eq_eq() {
+    parseExpression(
+        "1 == 2 == 3", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
+  }
+
+  void test_equalityCannotBeEqualityOperand_eq_neq() {
+    parseExpression(
+        "1 == 2 != 3", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
+  }
+
+  void test_equalityCannotBeEqualityOperand_neq_eq() {
+    parseExpression(
+        "1 != 2 == 3", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
+  }
+
+  void test_expectedCaseOrDefault() {
+    parse4("parseSwitchStatement", "switch (e) {break;}",
+        [ParserErrorCode.EXPECTED_CASE_OR_DEFAULT]);
+  }
+
+  void test_expectedClassMember_inClass_afterType() {
+    parse3("parseClassMember", <Object>["C"], "heart 2 heart",
+        [ParserErrorCode.EXPECTED_CLASS_MEMBER]);
+  }
+
+  void test_expectedClassMember_inClass_beforeType() {
+    parse3("parseClassMember", <Object>["C"], "4 score",
+        [ParserErrorCode.EXPECTED_CLASS_MEMBER]);
+  }
+
+  void test_expectedExecutable_inClass_afterVoid() {
+    parse3("parseClassMember", <Object>["C"], "void 2 void",
+        [ParserErrorCode.EXPECTED_EXECUTABLE]);
+  }
+
+  void test_expectedExecutable_topLevel_afterType() {
+    parse3("parseCompilationUnitMember", <Object>[emptyCommentAndMetadata()],
+        "heart 2 heart", [ParserErrorCode.EXPECTED_EXECUTABLE]);
+  }
+
+  void test_expectedExecutable_topLevel_afterVoid() {
+    parse3("parseCompilationUnitMember", <Object>[emptyCommentAndMetadata()],
+        "void 2 void", [ParserErrorCode.EXPECTED_EXECUTABLE]);
+  }
+
+  void test_expectedExecutable_topLevel_beforeType() {
+    parse3("parseCompilationUnitMember", <Object>[emptyCommentAndMetadata()],
+        "4 score", [ParserErrorCode.EXPECTED_EXECUTABLE]);
+  }
+
+  void test_expectedExecutable_topLevel_eof() {
+    parse2(
+        "parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()],
+        "x",
+        [new AnalysisError(null, 0, 1, ParserErrorCode.EXPECTED_EXECUTABLE)]);
+  }
+
+  void test_expectedInterpolationIdentifier() {
+    parse4(
+        "parseStringLiteral", "'\$x\$'", [ParserErrorCode.MISSING_IDENTIFIER]);
+  }
+
+  void test_expectedInterpolationIdentifier_emptyString() {
+    // The scanner inserts an empty string token between the two $'s; we need to
+    // make sure that the MISSING_IDENTIFIER error that is generated has a
+    // nonzero width so that it will show up in the editor UI.
+    parse2("parseStringLiteral", <Object>[], "'\$\$foo'",
+        [new AnalysisError(null, 2, 1, ParserErrorCode.MISSING_IDENTIFIER)]);
+  }
+
+  void test_expectedStringLiteral() {
+    StringLiteral expression = parse4(
+        "parseStringLiteral", "1", [ParserErrorCode.EXPECTED_STRING_LITERAL]);
+    expect(expression.isSynthetic, isTrue);
+  }
+
+  void test_expectedToken_commaMissingInArgumentList() {
+    parse4("parseArgumentList", "(x, y z)", [ParserErrorCode.EXPECTED_TOKEN]);
+  }
+
+  void test_expectedToken_parseStatement_afterVoid() {
+    ParserTestCase.parseStatement("void}",
+        [ParserErrorCode.EXPECTED_TOKEN, ParserErrorCode.MISSING_IDENTIFIER]);
+  }
+
+  void test_expectedToken_semicolonAfterClass() {
+    Token token = TokenFactory.tokenFromKeyword(Keyword.CLASS);
+    parse3(
+        "parseClassTypeAlias",
+        <Object>[emptyCommentAndMetadata(), null, token],
+        "A = B with C",
+        [ParserErrorCode.EXPECTED_TOKEN]);
+  }
+
+  void test_expectedToken_semicolonMissingAfterExport() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        "export '' class A {}", [ParserErrorCode.EXPECTED_TOKEN]);
+    ExportDirective directive = unit.directives[0] as ExportDirective;
+    Token semicolon = directive.semicolon;
+    expect(semicolon, isNotNull);
+    expect(semicolon.isSynthetic, isTrue);
+  }
+
+  void test_expectedToken_semicolonMissingAfterExpression() {
+    ParserTestCase.parseStatement("x", [ParserErrorCode.EXPECTED_TOKEN]);
+  }
+
+  void test_expectedToken_semicolonMissingAfterImport() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        "import '' class A {}", [ParserErrorCode.EXPECTED_TOKEN]);
+    ImportDirective directive = unit.directives[0] as ImportDirective;
+    Token semicolon = directive.semicolon;
+    expect(semicolon, isNotNull);
+    expect(semicolon.isSynthetic, isTrue);
+  }
+
+  void test_expectedToken_whileMissingInDoStatement() {
+    ParserTestCase.parseStatement(
+        "do {} (x);", [ParserErrorCode.EXPECTED_TOKEN]);
+  }
+
+  void test_expectedTypeName_is() {
+    parseExpression("x is", [ParserErrorCode.EXPECTED_TYPE_NAME]);
+  }
+
+  void test_exportDirectiveAfterPartDirective() {
+    ParserTestCase.parseCompilationUnit("part 'a.dart'; export 'b.dart';",
+        [ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE]);
+  }
+
+  void test_externalAfterConst() {
+    parse3("parseClassMember", <Object>["C"], "const external C();",
+        [ParserErrorCode.EXTERNAL_AFTER_CONST]);
+  }
+
+  void test_externalAfterFactory() {
+    parse3("parseClassMember", <Object>["C"], "factory external C();",
+        [ParserErrorCode.EXTERNAL_AFTER_FACTORY]);
+  }
+
+  void test_externalAfterStatic() {
+    parse3("parseClassMember", <Object>["C"], "static external int m();",
+        [ParserErrorCode.EXTERNAL_AFTER_STATIC]);
+  }
+
+  void test_externalClass() {
+    ParserTestCase.parseCompilationUnit(
+        "external class C {}", [ParserErrorCode.EXTERNAL_CLASS]);
+  }
+
+  void test_externalConstructorWithBody_factory() {
+    parse3("parseClassMember", <Object>["C"], "external factory C() {}",
+        [ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY]);
+  }
+
+  void test_externalConstructorWithBody_named() {
+    parse3("parseClassMember", <Object>["C"], "external C.c() {}",
+        [ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY]);
+  }
+
+  void test_externalEnum() {
+    ParserTestCase.parseCompilationUnit(
+        "external enum E {ONE}", [ParserErrorCode.EXTERNAL_ENUM]);
+  }
+
+  void test_externalField_const() {
+    parse3("parseClassMember", <Object>["C"], "external const A f;",
+        [ParserErrorCode.EXTERNAL_FIELD]);
+  }
+
+  void test_externalField_final() {
+    parse3("parseClassMember", <Object>["C"], "external final A f;",
+        [ParserErrorCode.EXTERNAL_FIELD]);
+  }
+
+  void test_externalField_static() {
+    parse3("parseClassMember", <Object>["C"], "external static A f;",
+        [ParserErrorCode.EXTERNAL_FIELD]);
+  }
+
+  void test_externalField_typed() {
+    parse3("parseClassMember", <Object>["C"], "external A f;",
+        [ParserErrorCode.EXTERNAL_FIELD]);
+  }
+
+  void test_externalField_untyped() {
+    parse3("parseClassMember", <Object>["C"], "external var f;",
+        [ParserErrorCode.EXTERNAL_FIELD]);
+  }
+
+  void test_externalGetterWithBody() {
+    parse3("parseClassMember", <Object>["C"], "external int get x {}",
+        [ParserErrorCode.EXTERNAL_GETTER_WITH_BODY]);
+  }
+
+  void test_externalMethodWithBody() {
+    parse3("parseClassMember", <Object>["C"], "external m() {}",
+        [ParserErrorCode.EXTERNAL_METHOD_WITH_BODY]);
+  }
+
+  void test_externalOperatorWithBody() {
+    parse3(
+        "parseClassMember",
+        <Object>["C"],
+        "external operator +(int value) {}",
+        [ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY]);
+  }
+
+  void test_externalSetterWithBody() {
+    parse3("parseClassMember", <Object>["C"], "external set x(int value) {}",
+        [ParserErrorCode.EXTERNAL_SETTER_WITH_BODY]);
+  }
+
+  void test_externalTypedef() {
+    ParserTestCase.parseCompilationUnit(
+        "external typedef F();", [ParserErrorCode.EXTERNAL_TYPEDEF]);
+  }
+
+  void test_factoryTopLevelDeclaration_class() {
+    ParserTestCase.parseCompilationUnit(
+        "factory class C {}", [ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION]);
+  }
+
+  void test_factoryTopLevelDeclaration_typedef() {
+    ParserTestCase.parseCompilationUnit("factory typedef F();",
+        [ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION]);
+  }
+
+  void test_factoryWithInitializers() {
+    parse3("parseClassMember", <Object>["C"], "factory C() : x = 3 {}",
+        [ParserErrorCode.FACTORY_WITH_INITIALIZERS]);
+  }
+
+  void test_factoryWithoutBody() {
+    parse3("parseClassMember", <Object>["C"], "factory C();",
+        [ParserErrorCode.FACTORY_WITHOUT_BODY]);
+  }
+
+  void test_fieldInitializerOutsideConstructor() {
+    parse3("parseClassMember", <Object>["C"], "void m(this.x);",
+        [ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR]);
+  }
+
+  void test_finalAndVar() {
+    parse3("parseClassMember", <Object>["C"], "final var x;",
+        [ParserErrorCode.FINAL_AND_VAR]);
+  }
+
+  void test_finalClass() {
+    ParserTestCase.parseCompilationUnit(
+        "final class C {}", [ParserErrorCode.FINAL_CLASS]);
+  }
+
+  void test_finalConstructor() {
+    parse3("parseClassMember", <Object>["C"], "final C() {}",
+        [ParserErrorCode.FINAL_CONSTRUCTOR]);
+  }
+
+  void test_finalEnum() {
+    ParserTestCase.parseCompilationUnit(
+        "final enum E {ONE}", [ParserErrorCode.FINAL_ENUM]);
+  }
+
+  void test_finalMethod() {
+    parse3("parseClassMember", <Object>["C"], "final int m() {}",
+        [ParserErrorCode.FINAL_METHOD]);
+  }
+
+  void test_finalTypedef() {
+    ParserTestCase.parseCompilationUnit(
+        "final typedef F();", [ParserErrorCode.FINAL_TYPEDEF]);
+  }
+
+  void test_functionTypedParameter_const() {
+    ParserTestCase.parseCompilationUnit(
+        "void f(const x()) {}", [ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR]);
+  }
+
+  void test_functionTypedParameter_final() {
+    ParserTestCase.parseCompilationUnit(
+        "void f(final x()) {}", [ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR]);
+  }
+
+  void test_functionTypedParameter_var() {
+    ParserTestCase.parseCompilationUnit(
+        "void f(var x()) {}", [ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR]);
+  }
+
+  void test_getterInFunction_block_noReturnType() {
+    FunctionDeclarationStatement statement = ParserTestCase.parseStatement(
+        "get x { return _x; }", [ParserErrorCode.GETTER_IN_FUNCTION]);
+    expect(statement.functionDeclaration.functionExpression.parameters, isNull);
+  }
+
+  void test_getterInFunction_block_returnType() {
+    ParserTestCase.parseStatement(
+        "int get x { return _x; }", [ParserErrorCode.GETTER_IN_FUNCTION]);
+  }
+
+  void test_getterInFunction_expression_noReturnType() {
+    ParserTestCase.parseStatement(
+        "get x => _x;", [ParserErrorCode.GETTER_IN_FUNCTION]);
+  }
+
+  void test_getterInFunction_expression_returnType() {
+    ParserTestCase.parseStatement(
+        "int get x => _x;", [ParserErrorCode.GETTER_IN_FUNCTION]);
+  }
+
+  void test_getterWithParameters() {
+    parse3("parseClassMember", <Object>["C"], "int get x() {}",
+        [ParserErrorCode.GETTER_WITH_PARAMETERS]);
+  }
+
+  void test_illegalAssignmentToNonAssignable_postfix_minusMinus_literal() {
+    parseExpression(
+        "0--", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
+  }
+
+  void test_illegalAssignmentToNonAssignable_postfix_plusPlus_literal() {
+    parseExpression(
+        "0++", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
+  }
+
+  void test_illegalAssignmentToNonAssignable_postfix_plusPlus_parethesized() {
+    parseExpression(
+        "(x)++", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
+  }
+
+  void test_illegalAssignmentToNonAssignable_primarySelectorPostfix() {
+    parseExpression(
+        "x(y)(z)++", [ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE]);
+  }
+
+  void test_illegalAssignmentToNonAssignable_superAssigned() {
+    // TODO(brianwilkerson) When the test
+    // fail_illegalAssignmentToNonAssignable_superAssigned starts to pass,
+    // remove this test (there should only be one error generated, but we're
+    // keeping this test until that time so that we can catch other forms of
+    // regressions).
+    parseExpression("super = x;", [
+      ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR,
+      ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE
+    ]);
+  }
+
+  void test_implementsBeforeExtends() {
+    ParserTestCase.parseCompilationUnit("class A implements B extends C {}",
+        [ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS]);
+  }
+
+  void test_implementsBeforeWith() {
+    ParserTestCase.parseCompilationUnit(
+        "class A extends B implements C with D {}",
+        [ParserErrorCode.IMPLEMENTS_BEFORE_WITH]);
+  }
+
+  void test_importDirectiveAfterPartDirective() {
+    ParserTestCase.parseCompilationUnit("part 'a.dart'; import 'b.dart';",
+        [ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE]);
+  }
+
+  void test_initializedVariableInForEach() {
+    parse4("parseForStatement", "for (int a = 0 in foo) {}",
+        [ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH]);
+  }
+
+  void test_invalidAwaitInFor() {
+    parse4("parseForStatement", "await for (; ;) {}",
+        [ParserErrorCode.INVALID_AWAIT_IN_FOR]);
+  }
+
+  void test_invalidCodePoint() {
+    parse4("parseStringLiteral", "'\\uD900'",
+        [ParserErrorCode.INVALID_CODE_POINT]);
+  }
+
+  void test_invalidHexEscape_invalidDigit() {
+    parse4(
+        "parseStringLiteral", "'\\x0 a'", [ParserErrorCode.INVALID_HEX_ESCAPE]);
+  }
+
+  void test_invalidHexEscape_tooFewDigits() {
+    parse4(
+        "parseStringLiteral", "'\\x0'", [ParserErrorCode.INVALID_HEX_ESCAPE]);
+  }
+
+  void test_invalidInterpolationIdentifier_startWithDigit() {
+    parse4("parseStringLiteral", "'\$1'", [ParserErrorCode.MISSING_IDENTIFIER]);
+  }
+
+  void test_invalidOperator() {
+    parse3("parseClassMember", <Object>["C"], "void operator ===(x) {}",
+        [ParserErrorCode.INVALID_OPERATOR]);
+  }
+
+  void test_invalidOperatorAfterSuper_assignableExpression() {
+    parse3('parseAssignableExpression', <Object>[false], 'super?.v',
+        [ParserErrorCode.INVALID_OPERATOR_FOR_SUPER]);
+  }
+
+  void test_invalidOperatorAfterSuper_primaryExpression() {
+    parse4('parsePrimaryExpression', 'super?.v',
+        [ParserErrorCode.INVALID_OPERATOR_FOR_SUPER]);
+  }
+
+  void test_invalidOperatorForSuper() {
+    parse4("parseUnaryExpression", "++super",
+        [ParserErrorCode.INVALID_OPERATOR_FOR_SUPER]);
+  }
+
+  void test_invalidStarAfterAsync() {
+    parse3("parseFunctionBody", <Object>[false, null, false], "async* => 0;",
+        [ParserErrorCode.INVALID_STAR_AFTER_ASYNC]);
+  }
+
+  void test_invalidSync() {
+    parse3("parseFunctionBody", <Object>[false, null, false], "sync* => 0;",
+        [ParserErrorCode.INVALID_SYNC]);
+  }
+
+  void test_invalidUnicodeEscape_incomplete_noDigits() {
+    parse4("parseStringLiteral", "'\\u{'",
+        [ParserErrorCode.INVALID_UNICODE_ESCAPE]);
+  }
+
+  void test_invalidUnicodeEscape_incomplete_someDigits() {
+    parse4("parseStringLiteral", "'\\u{0A'",
+        [ParserErrorCode.INVALID_UNICODE_ESCAPE]);
+  }
+
+  void test_invalidUnicodeEscape_invalidDigit() {
+    parse4("parseStringLiteral", "'\\u0 a'",
+        [ParserErrorCode.INVALID_UNICODE_ESCAPE]);
+  }
+
+  void test_invalidUnicodeEscape_tooFewDigits_fixed() {
+    parse4("parseStringLiteral", "'\\u04'",
+        [ParserErrorCode.INVALID_UNICODE_ESCAPE]);
+  }
+
+  void test_invalidUnicodeEscape_tooFewDigits_variable() {
+    parse4("parseStringLiteral", "'\\u{}'",
+        [ParserErrorCode.INVALID_UNICODE_ESCAPE]);
+  }
+
+  void test_invalidUnicodeEscape_tooManyDigits_variable() {
+    parse4("parseStringLiteral", "'\\u{12345678}'", [
+      ParserErrorCode.INVALID_UNICODE_ESCAPE,
+      ParserErrorCode.INVALID_CODE_POINT
+    ]);
+  }
+
+  void test_libraryDirectiveNotFirst() {
+    ParserTestCase.parseCompilationUnit("import 'x.dart'; library l;",
+        [ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST]);
+  }
+
+  void test_libraryDirectiveNotFirst_afterPart() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        "part 'a.dart';\nlibrary l;",
+        [ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST]);
+    expect(unit, isNotNull);
+  }
+
+  void test_localFunctionDeclarationModifier_abstract() {
+    ParserTestCase.parseStatement("abstract f() {}",
+        [ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER]);
+  }
+
+  void test_localFunctionDeclarationModifier_external() {
+    ParserTestCase.parseStatement("external f() {}",
+        [ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER]);
+  }
+
+  void test_localFunctionDeclarationModifier_factory() {
+    ParserTestCase.parseStatement("factory f() {}",
+        [ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER]);
+  }
+
+  void test_localFunctionDeclarationModifier_static() {
+    ParserTestCase.parseStatement(
+        "static f() {}", [ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MODIFIER]);
+  }
+
+  void test_missingAssignableSelector_identifiersAssigned() {
+    parseExpression("x.y = y;");
+  }
+
+  void test_missingAssignableSelector_prefix_minusMinus_literal() {
+    parseExpression("--0", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]);
+  }
+
+  void test_missingAssignableSelector_prefix_plusPlus_literal() {
+    parseExpression("++0", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]);
+  }
+
+  void test_missingAssignableSelector_selector() {
+    parseExpression("x(y)(z).a++");
+  }
+
+  void test_missingAssignableSelector_superPrimaryExpression() {
+    SuperExpression expression = parse4("parsePrimaryExpression", "super",
+        [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]);
+    expect(expression.superKeyword, isNotNull);
+  }
+
+  void test_missingAssignableSelector_superPropertyAccessAssigned() {
+    parseExpression("super.x = x;");
+  }
+
+  void test_missingCatchOrFinally() {
+    TryStatement statement = parse4("parseTryStatement", "try {}",
+        [ParserErrorCode.MISSING_CATCH_OR_FINALLY]);
+    expect(statement, isNotNull);
+  }
+
+  void test_missingClassBody() {
+    ParserTestCase.parseCompilationUnit(
+        "class A class B {}", [ParserErrorCode.MISSING_CLASS_BODY]);
+  }
+
+  void test_missingConstFinalVarOrType_static() {
+    ParserTestCase.parseCompilationUnit("class A { static f; }",
+        [ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]);
+  }
+
+  void test_missingConstFinalVarOrType_topLevel() {
+    parse3("parseFinalConstVarOrType", <Object>[false], "a;",
+        [ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]);
+  }
+
+  void test_missingEnumBody() {
+    parse3("parseEnumDeclaration", <Object>[emptyCommentAndMetadata()],
+        "enum E;", [ParserErrorCode.MISSING_ENUM_BODY]);
+  }
+
+  void test_missingExpressionInThrow_withCascade() {
+    parse4("parseThrowExpression", "throw;",
+        [ParserErrorCode.MISSING_EXPRESSION_IN_THROW]);
+  }
+
+  void test_missingExpressionInThrow_withoutCascade() {
+    parse4("parseThrowExpressionWithoutCascade", "throw;",
+        [ParserErrorCode.MISSING_EXPRESSION_IN_THROW]);
+  }
+
+  void test_missingFunctionBody_emptyNotAllowed() {
+    parse3(
+        "parseFunctionBody",
+        <Object>[false, ParserErrorCode.MISSING_FUNCTION_BODY, false],
+        ";",
+        [ParserErrorCode.MISSING_FUNCTION_BODY]);
+  }
+
+  void test_missingFunctionBody_invalid() {
+    parse3(
+        "parseFunctionBody",
+        <Object>[false, ParserErrorCode.MISSING_FUNCTION_BODY, false],
+        "return 0;",
+        [ParserErrorCode.MISSING_FUNCTION_BODY]);
+  }
+
+  void test_missingFunctionParameters_local_void_block() {
+    ParserTestCase.parseStatement(
+        "void f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+  }
+
+  void test_missingFunctionParameters_local_void_expression() {
+    ParserTestCase.parseStatement(
+        "void f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+  }
+
+  void test_missingFunctionParameters_topLevel_nonVoid_block() {
+    ParserTestCase.parseCompilationUnit(
+        "int f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+  }
+
+  void test_missingFunctionParameters_topLevel_nonVoid_expression() {
+    ParserTestCase.parseCompilationUnit(
+        "int f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+  }
+
+  void test_missingFunctionParameters_topLevel_void_block() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        "void f { return x;}", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+    FunctionDeclaration funct = unit.declarations[0];
+    expect(funct.functionExpression.parameters, hasLength(0));
+  }
+
+  void test_missingFunctionParameters_topLevel_void_expression() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        "void f => x;", [ParserErrorCode.MISSING_FUNCTION_PARAMETERS]);
+    FunctionDeclaration funct = unit.declarations[0];
+    expect(funct.functionExpression.parameters, hasLength(0));
+  }
+
+  void test_missingIdentifier_afterOperator() {
+    parse4("parseMultiplicativeExpression", "1 *",
+        [ParserErrorCode.MISSING_IDENTIFIER]);
+  }
+
+  void test_missingIdentifier_beforeClosingCurly() {
+    parse3("parseClassMember", <Object>["C"], "int}",
+        [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]);
+  }
+
+  void test_missingIdentifier_functionDeclaration_returnTypeWithoutName() {
+    parse4("parseFunctionDeclarationStatement", "A<T> () {}",
+        [ParserErrorCode.MISSING_IDENTIFIER]);
+  }
+
+  void test_missingIdentifier_inEnum() {
+    parse3("parseEnumDeclaration", <Object>[emptyCommentAndMetadata()],
+        "enum E {, TWO}", [ParserErrorCode.MISSING_IDENTIFIER]);
+  }
+
+  void test_missingIdentifier_inSymbol_afterPeriod() {
+    parse4("parseSymbolLiteral", "#a.", [ParserErrorCode.MISSING_IDENTIFIER]);
+  }
+
+  void test_missingIdentifier_inSymbol_first() {
+    parse4("parseSymbolLiteral", "#", [ParserErrorCode.MISSING_IDENTIFIER]);
+  }
+
+  void test_missingIdentifier_number() {
+    SimpleIdentifier expression = parse4(
+        "parseSimpleIdentifier", "1", [ParserErrorCode.MISSING_IDENTIFIER]);
+    expect(expression.isSynthetic, isTrue);
+  }
+
+  void test_missingKeywordOperator() {
+    parse3("parseOperator", <Object>[emptyCommentAndMetadata(), null, null],
+        "+(x) {}", [ParserErrorCode.MISSING_KEYWORD_OPERATOR]);
+  }
+
+  void test_missingKeywordOperator_parseClassMember() {
+    parse3("parseClassMember", <Object>["C"], "+() {}",
+        [ParserErrorCode.MISSING_KEYWORD_OPERATOR]);
+  }
+
+  void test_missingKeywordOperator_parseClassMember_afterTypeName() {
+    parse3("parseClassMember", <Object>["C"], "int +() {}",
+        [ParserErrorCode.MISSING_KEYWORD_OPERATOR]);
+  }
+
+  void test_missingKeywordOperator_parseClassMember_afterVoid() {
+    parse3("parseClassMember", <Object>["C"], "void +() {}",
+        [ParserErrorCode.MISSING_KEYWORD_OPERATOR]);
+  }
+
+  void test_missingMethodParameters_void_block() {
+    MethodDeclaration method = parse3("parseClassMember", <Object>["C"],
+        "void m {} }", [ParserErrorCode.MISSING_METHOD_PARAMETERS]);
+    expect(method.parameters, hasLength(0));
+  }
+
+  void test_missingMethodParameters_void_expression() {
+    parse3("parseClassMember", <Object>["C"], "void m => null; }",
+        [ParserErrorCode.MISSING_METHOD_PARAMETERS]);
+  }
+
+  void test_missingNameInLibraryDirective() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        "library;", [ParserErrorCode.MISSING_NAME_IN_LIBRARY_DIRECTIVE]);
+    expect(unit, isNotNull);
+  }
+
+  void test_missingNameInPartOfDirective() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        "part of;", [ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE]);
+    expect(unit, isNotNull);
+  }
+
+  void test_missingPrefixInDeferredImport() {
+    ParserTestCase.parseCompilationUnit("import 'foo.dart' deferred;",
+        [ParserErrorCode.MISSING_PREFIX_IN_DEFERRED_IMPORT]);
+  }
+
+  void test_missingStartAfterSync() {
+    parse3("parseFunctionBody", <Object>[false, null, false], "sync {}",
+        [ParserErrorCode.MISSING_STAR_AFTER_SYNC]);
+  }
+
+  void test_missingStatement() {
+    ParserTestCase.parseStatement("is", [ParserErrorCode.MISSING_STATEMENT]);
+  }
+
+  void test_missingStatement_afterVoid() {
+    ParserTestCase.parseStatement("void;", [ParserErrorCode.MISSING_STATEMENT]);
+  }
+
+  void test_missingTerminatorForParameterGroup_named() {
+    parse4("parseFormalParameterList", "(a, {b: 0)",
+        [ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP]);
+  }
+
+  void test_missingTerminatorForParameterGroup_optional() {
+    parse4("parseFormalParameterList", "(a, [b = 0)",
+        [ParserErrorCode.MISSING_TERMINATOR_FOR_PARAMETER_GROUP]);
+  }
+
+  void test_missingTypedefParameters_nonVoid() {
+    ParserTestCase.parseCompilationUnit(
+        "typedef int F;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
+  }
+
+  void test_missingTypedefParameters_typeParameters() {
+    ParserTestCase.parseCompilationUnit(
+        "typedef F<E>;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
+  }
+
+  void test_missingTypedefParameters_void() {
+    ParserTestCase.parseCompilationUnit(
+        "typedef void F;", [ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
+  }
+
+  void test_missingVariableInForEach() {
+    parse4("parseForStatement", "for (a < b in foo) {}",
+        [ParserErrorCode.MISSING_VARIABLE_IN_FOR_EACH]);
+  }
+
+  void test_mixedParameterGroups_namedPositional() {
+    parse4("parseFormalParameterList", "(a, {b}, [c])",
+        [ParserErrorCode.MIXED_PARAMETER_GROUPS]);
+  }
+
+  void test_mixedParameterGroups_positionalNamed() {
+    parse4("parseFormalParameterList", "(a, [b], {c})",
+        [ParserErrorCode.MIXED_PARAMETER_GROUPS]);
+  }
+
+  void test_mixin_application_lacks_with_clause() {
+    ParserTestCase.parseCompilationUnit(
+        "class Foo = Bar;", [ParserErrorCode.EXPECTED_TOKEN]);
+  }
+
+  void test_multipleExtendsClauses() {
+    ParserTestCase.parseCompilationUnit("class A extends B extends C {}",
+        [ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES]);
+  }
+
+  void test_multipleImplementsClauses() {
+    ParserTestCase.parseCompilationUnit("class A implements B implements C {}",
+        [ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES]);
+  }
+
+  void test_multipleLibraryDirectives() {
+    ParserTestCase.parseCompilationUnit(
+        "library l; library m;", [ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES]);
+  }
+
+  void test_multipleNamedParameterGroups() {
+    parse4("parseFormalParameterList", "(a, {b}, {c})",
+        [ParserErrorCode.MULTIPLE_NAMED_PARAMETER_GROUPS]);
+  }
+
+  void test_multiplePartOfDirectives() {
+    ParserTestCase.parseCompilationUnit(
+        "part of l; part of m;", [ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES]);
+  }
+
+  void test_multiplePositionalParameterGroups() {
+    parse4("parseFormalParameterList", "(a, [b], [c])",
+        [ParserErrorCode.MULTIPLE_POSITIONAL_PARAMETER_GROUPS]);
+  }
+
+  void test_multipleVariablesInForEach() {
+    parse4("parseForStatement", "for (int a, b in foo) {}",
+        [ParserErrorCode.MULTIPLE_VARIABLES_IN_FOR_EACH]);
+  }
+
+  void test_multipleWithClauses() {
+    ParserTestCase.parseCompilationUnit("class A extends B with C with D {}",
+        [ParserErrorCode.MULTIPLE_WITH_CLAUSES]);
+  }
+
+  void test_namedParameterOutsideGroup() {
+    parse4("parseFormalParameterList", "(a, b : 0)",
+        [ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP]);
+  }
+
+  void test_nonConstructorFactory_field() {
+    parse3("parseClassMember", <Object>["C"], "factory int x;",
+        [ParserErrorCode.NON_CONSTRUCTOR_FACTORY]);
+  }
+
+  void test_nonConstructorFactory_method() {
+    parse3("parseClassMember", <Object>["C"], "factory int m() {}",
+        [ParserErrorCode.NON_CONSTRUCTOR_FACTORY]);
+  }
+
+  void test_nonIdentifierLibraryName_library() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        "library 'lib';", [ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME]);
+    expect(unit, isNotNull);
+  }
+
+  void test_nonIdentifierLibraryName_partOf() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        "part of 'lib';", [ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME]);
+    expect(unit, isNotNull);
+  }
+
+  void test_nonPartOfDirectiveInPart_after() {
+    ParserTestCase.parseCompilationUnit("part of l; part 'f.dart';",
+        [ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART]);
+  }
+
+  void test_nonPartOfDirectiveInPart_before() {
+    ParserTestCase.parseCompilationUnit("part 'f.dart'; part of m;",
+        [ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART]);
+  }
+
+  void test_nonUserDefinableOperator() {
+    parse3("parseClassMember", <Object>["C"], "operator +=(int x) => x + 1;",
+        [ParserErrorCode.NON_USER_DEFINABLE_OPERATOR]);
+  }
+
+  void test_optionalAfterNormalParameters_named() {
+    ParserTestCase.parseCompilationUnit(
+        "f({a}, b) {}", [ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS]);
+  }
+
+  void test_optionalAfterNormalParameters_positional() {
+    ParserTestCase.parseCompilationUnit(
+        "f([a], b) {}", [ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS]);
+  }
+
+  void test_parseCascadeSection_missingIdentifier() {
+    MethodInvocation methodInvocation = parse4(
+        "parseCascadeSection", "..()", [ParserErrorCode.MISSING_IDENTIFIER]);
+    expect(methodInvocation.target, isNull);
+    expect(methodInvocation.methodName.name, "");
+    expect(methodInvocation.typeArguments, isNull);
+    expect(methodInvocation.argumentList.arguments, hasLength(0));
+  }
+
+  void test_parseCascadeSection_missingIdentifier_typeArguments() {
+    enableGenericMethods = true;
+    MethodInvocation methodInvocation = parse4(
+        "parseCascadeSection", "..<E>()", [ParserErrorCode.MISSING_IDENTIFIER]);
+    expect(methodInvocation.target, isNull);
+    expect(methodInvocation.methodName.name, "");
+    expect(methodInvocation.typeArguments, isNotNull);
+    expect(methodInvocation.argumentList.arguments, hasLength(0));
+  }
+
+  void test_positionalAfterNamedArgument() {
+    parse4("parseArgumentList", "(x: 1, 2)",
+        [ParserErrorCode.POSITIONAL_AFTER_NAMED_ARGUMENT]);
+  }
+
+  void test_positionalParameterOutsideGroup() {
+    parse4("parseFormalParameterList", "(a, b = 0)",
+        [ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP]);
+  }
+
+  void test_redirectionInNonFactoryConstructor() {
+    parse3("parseClassMember", <Object>["C"], "C() = D;",
+        [ParserErrorCode.REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR]);
+  }
+
+  void test_setterInFunction_block() {
+    ParserTestCase.parseStatement(
+        "set x(v) {_x = v;}", [ParserErrorCode.SETTER_IN_FUNCTION]);
+  }
+
+  void test_setterInFunction_expression() {
+    ParserTestCase.parseStatement(
+        "set x(v) => _x = v;", [ParserErrorCode.SETTER_IN_FUNCTION]);
+  }
+
+  void test_staticAfterConst() {
+    parse3("parseClassMember", <Object>["C"], "final static int f;",
+        [ParserErrorCode.STATIC_AFTER_FINAL]);
+  }
+
+  void test_staticAfterFinal() {
+    parse3("parseClassMember", <Object>["C"], "const static int f;",
+        [ParserErrorCode.STATIC_AFTER_CONST]);
+  }
+
+  void test_staticAfterVar() {
+    parse3("parseClassMember", <Object>["C"], "var static f;",
+        [ParserErrorCode.STATIC_AFTER_VAR]);
+  }
+
+  void test_staticConstructor() {
+    parse3("parseClassMember", <Object>["C"], "static C.m() {}",
+        [ParserErrorCode.STATIC_CONSTRUCTOR]);
+  }
+
+  void test_staticGetterWithoutBody() {
+    parse3("parseClassMember", <Object>["C"], "static get m;",
+        [ParserErrorCode.STATIC_GETTER_WITHOUT_BODY]);
+  }
+
+  void test_staticOperator_noReturnType() {
+    parse3(
+        "parseClassMember",
+        <Object>["C"],
+        "static operator +(int x) => x + 1;",
+        [ParserErrorCode.STATIC_OPERATOR]);
+  }
+
+  void test_staticOperator_returnType() {
+    parse3(
+        "parseClassMember",
+        <Object>["C"],
+        "static int operator +(int x) => x + 1;",
+        [ParserErrorCode.STATIC_OPERATOR]);
+  }
+
+  void test_staticSetterWithoutBody() {
+    parse3("parseClassMember", <Object>["C"], "static set m(x);",
+        [ParserErrorCode.STATIC_SETTER_WITHOUT_BODY]);
+  }
+
+  void test_staticTopLevelDeclaration_class() {
+    ParserTestCase.parseCompilationUnit(
+        "static class C {}", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
+  }
+
+  void test_staticTopLevelDeclaration_function() {
+    ParserTestCase.parseCompilationUnit(
+        "static f() {}", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
+  }
+
+  void test_staticTopLevelDeclaration_typedef() {
+    ParserTestCase.parseCompilationUnit(
+        "static typedef F();", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
+  }
+
+  void test_staticTopLevelDeclaration_variable() {
+    ParserTestCase.parseCompilationUnit(
+        "static var x;", [ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION]);
+  }
+
+  void test_switchHasCaseAfterDefaultCase() {
+    parse4(
+        "parseSwitchStatement",
+        "switch (a) {default: return 0; case 1: return 1;}",
+        [ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE]);
+  }
+
+  void test_switchHasCaseAfterDefaultCase_repeated() {
+    parse4("parseSwitchStatement",
+        "switch (a) {default: return 0; case 1: return 1; case 2: return 2;}", [
+      ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE,
+      ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE
+    ]);
+  }
+
+  void test_switchHasMultipleDefaultCases() {
+    parse4(
+        "parseSwitchStatement",
+        "switch (a) {default: return 0; default: return 1;}",
+        [ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES]);
+  }
+
+  void test_switchHasMultipleDefaultCases_repeated() {
+    parse4(
+        "parseSwitchStatement",
+        "switch (a) {default: return 0; default: return 1; default: return 2;}",
+        [
+      ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES,
+      ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES
+    ]);
+  }
+
+  void test_topLevel_getter() {
+    FunctionDeclaration funct = parse3("parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()], "get x => 7;");
+    expect(funct.functionExpression.parameters, isNull);
+  }
+
+  void test_topLevelOperator_withoutType() {
+    parse3(
+        "parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()],
+        "operator +(bool x, bool y) => x | y;",
+        [ParserErrorCode.TOP_LEVEL_OPERATOR]);
+  }
+
+  void test_topLevelOperator_withType() {
+    parse3(
+        "parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()],
+        "bool operator +(bool x, bool y) => x | y;",
+        [ParserErrorCode.TOP_LEVEL_OPERATOR]);
+  }
+
+  void test_topLevelOperator_withVoid() {
+    parse3(
+        "parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()],
+        "void operator +(bool x, bool y) => x | y;",
+        [ParserErrorCode.TOP_LEVEL_OPERATOR]);
+  }
+
+  void test_topLevelVariable_withMetadata() {
+    ParserTestCase.parseCompilationUnit("String @A string;", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.EXPECTED_TOKEN,
+      ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE
+    ]);
+  }
+
+  void test_typedefInClass_withoutReturnType() {
+    ParserTestCase.parseCompilationUnit(
+        "class C { typedef F(x); }", [ParserErrorCode.TYPEDEF_IN_CLASS]);
+  }
+
+  void test_typedefInClass_withReturnType() {
+    ParserTestCase.parseCompilationUnit("class C { typedef int F(int x); }",
+        [ParserErrorCode.TYPEDEF_IN_CLASS]);
+  }
+
+  void test_unexpectedTerminatorForParameterGroup_named() {
+    parse4("parseFormalParameterList", "(a, b})",
+        [ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP]);
+  }
+
+  void test_unexpectedTerminatorForParameterGroup_optional() {
+    parse4("parseFormalParameterList", "(a, b])",
+        [ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP]);
+  }
+
+  void test_unexpectedToken_endOfFieldDeclarationStatement() {
+    ParserTestCase.parseStatement(
+        "String s = (null));", [ParserErrorCode.UNEXPECTED_TOKEN]);
+  }
+
+  void test_unexpectedToken_returnInExpressionFuntionBody() {
+    ParserTestCase.parseCompilationUnit(
+        "f() => return null;", [ParserErrorCode.UNEXPECTED_TOKEN]);
+  }
+
+  void test_unexpectedToken_semicolonBetweenClassMembers() {
+    parse3("parseClassDeclaration", <Object>[emptyCommentAndMetadata(), null],
+        "class C { int x; ; int y;}", [ParserErrorCode.UNEXPECTED_TOKEN]);
+  }
+
+  void test_unexpectedToken_semicolonBetweenCompilationUnitMembers() {
+    ParserTestCase.parseCompilationUnit(
+        "int x; ; int y;", [ParserErrorCode.UNEXPECTED_TOKEN]);
+  }
+
+  void test_unterminatedString_at_eof() {
+    // Although the "unterminated string" error message is produced by the
+    // scanner, we need to verify that the parser can handle the tokens
+    // produced by the scanner when an unterminated string is encountered.
+    ParserTestCase.parseCompilationUnit(
+        r'''
+void main() {
+  var x = "''',
+        [
+      ScannerErrorCode.UNTERMINATED_STRING_LITERAL,
+      ParserErrorCode.EXPECTED_TOKEN,
+      ParserErrorCode.EXPECTED_TOKEN
+    ]);
+  }
+
+  void test_unterminatedString_at_eol() {
+    // Although the "unterminated string" error message is produced by the
+    // scanner, we need to verify that the parser can handle the tokens
+    // produced by the scanner when an unterminated string is encountered.
+    ParserTestCase.parseCompilationUnit(
+        r'''
+void main() {
+  var x = "
+;
+}
+''',
+        [ScannerErrorCode.UNTERMINATED_STRING_LITERAL]);
+  }
+
+  void test_unterminatedString_multiline_at_eof_3_quotes() {
+    // Although the "unterminated string" error message is produced by the
+    // scanner, we need to verify that the parser can handle the tokens
+    // produced by the scanner when an unterminated string is encountered.
+    ParserTestCase.parseCompilationUnit(
+        r'''
+void main() {
+  var x = """''',
+        [
+      ScannerErrorCode.UNTERMINATED_STRING_LITERAL,
+      ParserErrorCode.EXPECTED_TOKEN,
+      ParserErrorCode.EXPECTED_TOKEN
+    ]);
+  }
+
+  void test_unterminatedString_multiline_at_eof_4_quotes() {
+    // Although the "unterminated string" error message is produced by the
+    // scanner, we need to verify that the parser can handle the tokens
+    // produced by the scanner when an unterminated string is encountered.
+    ParserTestCase.parseCompilationUnit(
+        r'''
+void main() {
+  var x = """"''',
+        [
+      ScannerErrorCode.UNTERMINATED_STRING_LITERAL,
+      ParserErrorCode.EXPECTED_TOKEN,
+      ParserErrorCode.EXPECTED_TOKEN
+    ]);
+  }
+
+  void test_unterminatedString_multiline_at_eof_5_quotes() {
+    // Although the "unterminated string" error message is produced by the
+    // scanner, we need to verify that the parser can handle the tokens
+    // produced by the scanner when an unterminated string is encountered.
+    ParserTestCase.parseCompilationUnit(
+        r'''
+void main() {
+  var x = """""''',
+        [
+      ScannerErrorCode.UNTERMINATED_STRING_LITERAL,
+      ParserErrorCode.EXPECTED_TOKEN,
+      ParserErrorCode.EXPECTED_TOKEN
+    ]);
+  }
+
+  void test_useOfUnaryPlusOperator() {
+    SimpleIdentifier expression = parse4(
+        "parseUnaryExpression", "+x", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is SimpleIdentifier, SimpleIdentifier, expression);
+    expect(expression.isSynthetic, isTrue);
+  }
+
+  void test_varAndType_field() {
+    ParserTestCase.parseCompilationUnit(
+        "class C { var int x; }", [ParserErrorCode.VAR_AND_TYPE]);
+  }
+
+  void test_varAndType_topLevelVariable() {
+    ParserTestCase.parseCompilationUnit(
+        "var int x;", [ParserErrorCode.VAR_AND_TYPE]);
+  }
+
+  void test_varAsTypeName_as() {
+    parseExpression("x as var", [ParserErrorCode.VAR_AS_TYPE_NAME]);
+  }
+
+  void test_varClass() {
+    ParserTestCase.parseCompilationUnit(
+        "var class C {}", [ParserErrorCode.VAR_CLASS]);
+  }
+
+  void test_varEnum() {
+    ParserTestCase.parseCompilationUnit(
+        "var enum E {ONE}", [ParserErrorCode.VAR_ENUM]);
+  }
+
+  void test_varReturnType() {
+    parse3("parseClassMember", <Object>["C"], "var m() {}",
+        [ParserErrorCode.VAR_RETURN_TYPE]);
+  }
+
+  void test_varTypedef() {
+    ParserTestCase.parseCompilationUnit(
+        "var typedef F();", [ParserErrorCode.VAR_TYPEDEF]);
+  }
+
+  void test_voidParameter() {
+    parse4("parseNormalFormalParameter", "void a)",
+        [ParserErrorCode.VOID_PARAMETER]);
+  }
+
+  void test_voidVariable_parseClassMember_initializer() {
+    parse3("parseClassMember", <Object>["C"], "void x = 0;",
+        [ParserErrorCode.VOID_VARIABLE]);
+  }
+
+  void test_voidVariable_parseClassMember_noInitializer() {
+    parse3("parseClassMember", <Object>["C"], "void x;",
+        [ParserErrorCode.VOID_VARIABLE]);
+  }
+
+  void test_voidVariable_parseCompilationUnit_initializer() {
+    ParserTestCase.parseCompilationUnit(
+        "void x = 0;", [ParserErrorCode.VOID_VARIABLE]);
+  }
+
+  void test_voidVariable_parseCompilationUnit_noInitializer() {
+    ParserTestCase.parseCompilationUnit(
+        "void x;", [ParserErrorCode.VOID_VARIABLE]);
+  }
+
+  void test_voidVariable_parseCompilationUnitMember_initializer() {
+    parse3("parseCompilationUnitMember", <Object>[emptyCommentAndMetadata()],
+        "void a = 0;", [ParserErrorCode.VOID_VARIABLE]);
+  }
+
+  void test_voidVariable_parseCompilationUnitMember_noInitializer() {
+    parse3("parseCompilationUnitMember", <Object>[emptyCommentAndMetadata()],
+        "void a;", [ParserErrorCode.VOID_VARIABLE]);
+  }
+
+  void test_voidVariable_statement_initializer() {
+    ParserTestCase.parseStatement("void x = 0;", [
+      ParserErrorCode.VOID_VARIABLE,
+      ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE
+    ]);
+  }
+
+  void test_voidVariable_statement_noInitializer() {
+    ParserTestCase.parseStatement("void x;", [
+      ParserErrorCode.VOID_VARIABLE,
+      ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE
+    ]);
+  }
+
+  void test_withBeforeExtends() {
+    ParserTestCase.parseCompilationUnit(
+        "class A with B extends C {}", [ParserErrorCode.WITH_BEFORE_EXTENDS]);
+  }
+
+  void test_withWithoutExtends() {
+    parse3("parseClassDeclaration", <Object>[emptyCommentAndMetadata(), null],
+        "class A with B, C {}", [ParserErrorCode.WITH_WITHOUT_EXTENDS]);
+  }
+
+  void test_wrongSeparatorForNamedParameter() {
+    parse4("parseFormalParameterList", "(a, {b = 0})",
+        [ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER]);
+  }
+
+  void test_wrongSeparatorForPositionalParameter() {
+    parse4("parseFormalParameterList", "(a, [b : 0])",
+        [ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER]);
+  }
+
+  void test_wrongTerminatorForParameterGroup_named() {
+    parse4("parseFormalParameterList", "(a, {b, c])",
+        [ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP]);
+  }
+
+  void test_wrongTerminatorForParameterGroup_optional() {
+    parse4("parseFormalParameterList", "(a, [b, c})",
+        [ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP]);
+  }
+}
+
+@reflectiveTest
+class IncrementalParserTest extends EngineTestCase {
+  void fail_replace_identifier_with_functionLiteral_in_initializer_interp() {
+    // TODO(paulberry, brianwilkerson): broken due to incremental scanning bugs
+
+    // Function literals are allowed inside interpolation expressions in
+    // initializers.
+    //
+    // 'class A { var a; A(b) : a = "${b}";'
+    // 'class A { var a; A(b) : a = "${() {}}";'
+    _assertParse(r'class A { var a; A(b) : a = "${', 'b', '() {}', '}";');
+  }
+
+  void test_delete_everything() {
+    // "f() => a + b;"
+    // ""
+    _assertParse("", "f() => a + b;", "", "");
+  }
+
+  void test_delete_identifier_beginning() {
+    // "f() => abs + b;"
+    // "f() => s + b;"
+    _assertParse("f() => ", "ab", "", "s + b;");
+  }
+
+  void test_delete_identifier_end() {
+    // "f() => abs + b;"
+    // "f() => a + b;"
+    _assertParse("f() => a", "bs", "", " + b;");
+  }
+
+  void test_delete_identifier_middle() {
+    // "f() => abs + b;"
+    // "f() => as + b;"
+    _assertParse("f() => a", "b", "", "s + b;");
+  }
+
+  void test_delete_mergeTokens() {
+    // "f() => a + b + c;"
+    // "f() => ac;"
+    _assertParse("f() => a", " + b + ", "", "c;");
+  }
+
+  void test_insert_afterIdentifier1() {
+    // "f() => a + b;"
+    // "f() => abs + b;"
+    _assertParse("f() => a", "", "bs", " + b;");
+  }
+
+  void test_insert_afterIdentifier2() {
+    // "f() => a + b;"
+    // "f() => a + bar;"
+    _assertParse("f() => a + b", "", "ar", ";");
+  }
+
+  void test_insert_beforeIdentifier1() {
+    // "f() => a + b;"
+    // "f() => xa + b;"
+    _assertParse("f() => ", "", "x", "a + b;");
+  }
+
+  void test_insert_beforeIdentifier2() {
+    // "f() => a + b;"
+    // "f() => a + xb;"
+    _assertParse("f() => a + ", "", "x", "b;");
+  }
+
+  void test_insert_convertOneFunctionToTwo() {
+    // "f() {}"
+    // "f() => 0; g() {}"
+    _assertParse("f()", "", " => 0; g()", " {}");
+  }
+
+  void test_insert_end() {
+    // "class A {}"
+    // "class A {} class B {}"
+    _assertParse("class A {}", "", " class B {}", "");
+  }
+
+  void test_insert_final_before_field_declaration() {
+    _assertParse('class C { ', '', 'final ', 'int x; }');
+  }
+
+  void test_insert_function_parameter() {
+    _assertParse('class C { void f(', '', 'arg', ') {} }');
+  }
+
+  void test_insert_identifier_inCombinator() {
+    _assertParse("import 'foo.dart' show x", "", ", y", ";");
+  }
+
+  void test_insert_insideClassBody() {
+    // "class C {C(); }"
+    // "class C { C(); }"
+    _assertParse("class C {", "", " ", "C(); }");
+  }
+
+  void test_insert_insideIdentifier() {
+    // "f() => cob;"
+    // "f() => cow.b;"
+    _assertParse("f() => co", "", "w.", "b;");
+  }
+
+  void test_insert_newIdentifier1() {
+    // "f() => a; c;"
+    // "f() => a; b c;"
+    _assertParse("f() => a;", "", " b", " c;");
+  }
+
+  void test_insert_newIdentifier2() {
+    // "f() => a;  c;"
+    // "f() => a;b  c;"
+    _assertParse("f() => a;", "", "b", "  c;");
+  }
+
+  void test_insert_newIdentifier3() {
+    // "/** A simple function. */ f() => a; c;"
+    // "/** A simple function. */ f() => a; b c;"
+    _assertParse("/** A simple function. */ f() => a;", "", " b", " c;");
+  }
+
+  void test_insert_newIdentifier4() {
+    // "/** An [A]. */ class A {} class B { m() { return 1; } }"
+    // "/** An [A]. */ class A {} class B { m() { return 1 + 2; } }"
+    _assertParse("/** An [A]. */ class A {} class B { m() { return 1", "",
+        " + 2", "; } }");
+  }
+
+  void test_insert_period() {
+    // "f() => a + b;"
+    // "f() => a + b.;"
+    _assertParse("f() => a + b", "", ".", ";");
+  }
+
+  void test_insert_period_betweenIdentifiers1() {
+    // "f() => a b;"
+    // "f() => a. b;"
+    _assertParse("f() => a", "", ".", " b;");
+  }
+
+  void test_insert_period_betweenIdentifiers2() {
+    // "f() => a b;"
+    // "f() => a .b;"
+    _assertParse("f() => a ", "", ".", "b;");
+  }
+
+  void test_insert_period_betweenIdentifiers3() {
+    // "f() => a  b;"
+    // "f() => a . b;"
+    _assertParse("f() => a ", "", ".", " b;");
+  }
+
+  void test_insert_period_insideExistingIdentifier() {
+    // "f() => ab;"
+    // "f() => a.b;"
+    _assertParse("f() => a", "", ".", "b;");
+  }
+
+  void test_insert_periodAndIdentifier() {
+    // "f() => a + b;"
+    // "f() => a + b.x;"
+    _assertParse("f() => a + b", "", ".x", ";");
+  }
+
+  void test_insert_simpleToComplexExression() {
+    // "/** An [A]. */ class A {} class B { m() => 1; }"
+    // "/** An [A]. */ class A {} class B { m() => 1 + 2; }"
+    _assertParse(
+        "/** An [A]. */ class A {} class B { m() => 1", "", " + 2", "; }");
+  }
+
+  void test_insert_statement_in_method_with_mismatched_braces() {
+    _assertParse(
+        '''
+class C {
+  void f() {
+''',
+        '',
+        'g();',
+        '''
+    if (b) {
+
+
+  }
+
+  void g() {
+    h((x) {});
+  }
+}
+''');
+  }
+
+  void test_insert_whitespace_end() {
+    // "f() => a + b;"
+    // "f() => a + b; "
+    _assertParse("f() => a + b;", "", " ", "");
+  }
+
+  void test_insert_whitespace_end_multiple() {
+    // "f() => a + b;"
+    // "f() => a + b;  "
+    _assertParse("f() => a + b;", "", "  ", "");
+  }
+
+  void test_insert_whitespace_middle() {
+    // "f() => a + b;"
+    // "f() => a  + b;"
+    _assertParse("f() => a", "", " ", " + b;");
+  }
+
+  void test_rename_class_withConstructor() {
+    // "class C { C() {} }"
+    // "class D { C() {} }"
+    _assertParse('class ', 'C', 'D', ' { C() {} }');
+  }
+
+  void test_replace_field_type_with_void() {
+    // Note: this produces an error, but we still need the parser to produce a
+    // consistent parse tree for it.
+    _assertParse('class C { ', 'int', 'void', ' x; }');
+  }
+
+  void test_replace_identifier_beginning() {
+    // "f() => bell + b;"
+    // "f() => fell + b;"
+    _assertParse("f() => ", "b", "f", "ell + b;");
+  }
+
+  void test_replace_identifier_end() {
+    // "f() => bell + b;"
+    // "f() => belt + b;"
+    _assertParse("f() => bel", "l", "t", " + b;");
+  }
+
+  void test_replace_identifier_middle() {
+    // "f() => first + b;"
+    // "f() => frost + b;"
+    _assertParse("f() => f", "ir", "ro", "st + b;");
+  }
+
+  void test_replace_identifier_with_functionLiteral_in_initializer() {
+    // Function literals aren't allowed inside initializers; incremental parsing
+    // needs to gather the appropriate context.
+    //
+    // "class A { var a; A(b) : a = b ? b : 0 { } }"
+    // "class A { var a; A(b) : a = b ? () {} : 0 { } }"
+    _assertParse(
+        "class A { var a; A(b) : a = b ? ", "b", "() {}", " : 0 { } }");
+  }
+
+  void test_replace_identifier_with_functionLiteral_in_initializer_index() {
+    // Function literals are allowed inside index expressions in initializers.
+    //
+    // "class A { var a; A(b) : a = b[b];"
+    // "class A { var a; A(b) : a = b[() {}];"
+    _assertParse('class A { var a; A(b) : a = b[', 'b', '() {}', '];');
+  }
+
+  void test_replace_identifier_with_functionLiteral_in_initializer_list() {
+    // Function literals are allowed inside list literals in initializers.
+    //
+    // "class A { var a; A(b) : a = [b];"
+    // "class A { var a; A(b) : a = [() {}];"
+    _assertParse('class A { var a; A(b) : a = [', 'b', '() {}', '];');
+  }
+
+  void test_replace_identifier_with_functionLiteral_in_initializer_map() {
+    // Function literals are allowed inside map literals in initializers.
+    //
+    // "class A { var a; A(b) : a = {0: b};"
+    // "class A { var a; A(b) : a = {0: () {}};"
+    _assertParse('class A { var a; A(b) : a = {0: ', 'b', '() {}', '};');
+  }
+
+  void test_replace_identifier_with_functionLiteral_in_initializer_parens() {
+    // Function literals are allowed inside parentheses in initializers.
+    //
+    // "class A { var a; A(b) : a = (b);"
+    // "class A { var a; A(b) : a = (() {});"
+    _assertParse('class A { var a; A(b) : a = (', 'b', '() {}', ');');
+  }
+
+  void test_replace_multiple_partialFirstAndLast() {
+    // "f() => aa + bb;"
+    // "f() => ab * ab;"
+    _assertParse("f() => a", "a + b", "b * a", "b;");
+  }
+
+  void test_replace_operator_oneForMany() {
+    // "f() => a + b;"
+    // "f() => a * c - b;"
+    _assertParse("f() => a ", "+", "* c -", " b;");
+  }
+
+  void test_replace_operator_oneForOne() {
+    // "f() => a + b;"
+    // "f() => a * b;"
+    _assertParse("f() => a ", "+", "*", " b;");
+  }
+
+  void test_split_combinator() {
+    // "import 'foo.dart' show A;"
+    // "import 'foo.dart' show B hide A;"
+    _assertParse("import 'foo.dart' show ", "", "B hide ", "A;");
+  }
+
+  /**
+   * Given a description of the original and modified contents, perform an incremental scan of the
+   * two pieces of text.
+   *
+   * @param prefix the unchanged text before the edit region
+   * @param removed the text that was removed from the original contents
+   * @param added the text that was added to the modified contents
+   * @param suffix the unchanged text after the edit region
+   */
+  void _assertParse(
+      String prefix, String removed, String added, String suffix) {
+    //
+    // Compute the information needed to perform the test.
+    //
+    String originalContents = "$prefix$removed$suffix";
+    String modifiedContents = "$prefix$added$suffix";
+    int replaceStart = prefix.length;
+    Source source = new TestSource();
+    //
+    // Parse the original contents.
+    //
+    GatheringErrorListener originalListener = new GatheringErrorListener();
+    Scanner originalScanner = new Scanner(
+        source, new CharSequenceReader(originalContents), originalListener);
+    Token originalTokens = originalScanner.tokenize();
+    expect(originalTokens, isNotNull);
+    Parser originalParser = new Parser(source, originalListener);
+    CompilationUnit originalUnit =
+        originalParser.parseCompilationUnit(originalTokens);
+    expect(originalUnit, isNotNull);
+    //
+    // Parse the modified contents.
+    //
+    GatheringErrorListener modifiedListener = new GatheringErrorListener();
+    Scanner modifiedScanner = new Scanner(
+        source, new CharSequenceReader(modifiedContents), modifiedListener);
+    Token modifiedTokens = modifiedScanner.tokenize();
+    expect(modifiedTokens, isNotNull);
+    Parser modifiedParser = new Parser(source, modifiedListener);
+    CompilationUnit modifiedUnit =
+        modifiedParser.parseCompilationUnit(modifiedTokens);
+    expect(modifiedUnit, isNotNull);
+    //
+    // Incrementally parse the modified contents.
+    //
+    GatheringErrorListener incrementalListener = new GatheringErrorListener();
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    IncrementalScanner incrementalScanner = new IncrementalScanner(source,
+        new CharSequenceReader(modifiedContents), incrementalListener, options);
+    Token incrementalTokens = incrementalScanner.rescan(
+        originalTokens, replaceStart, removed.length, added.length);
+    expect(incrementalTokens, isNotNull);
+    IncrementalParser incrementalParser = new IncrementalParser(
+        source, incrementalScanner.tokenMap, incrementalListener);
+    CompilationUnit incrementalUnit = incrementalParser.reparse(
+        originalUnit,
+        incrementalScanner.leftToken,
+        incrementalScanner.rightToken,
+        replaceStart,
+        prefix.length + removed.length);
+    expect(incrementalUnit, isNotNull);
+    //
+    // Validate that the results of the incremental parse are the same as the
+    // full parse of the modified source.
+    //
+    expect(AstComparator.equalNodes(modifiedUnit, incrementalUnit), isTrue);
+    // TODO(brianwilkerson) Verify that the errors are correct?
+  }
+}
+
+@reflectiveTest
+class NonErrorParserTest extends ParserTestCase {
+  void test_constFactory_external() {
+    parse("parseClassMember", <Object>["C"], "external const factory C();");
+  }
+
+  void test_staticMethod_notParsingFunctionBodies() {
+    ParserTestCase.parseFunctionBodies = false;
+    try {
+      parse4("parseCompilationUnit", "class C { static void m() {} }");
+    } finally {
+      ParserTestCase.parseFunctionBodies = true;
+    }
+  }
+}
+
+class ParserTestCase extends EngineTestCase {
+  /**
+   * An empty list of objects used as arguments to zero-argument methods.
+   */
+  static const List<Object> _EMPTY_ARGUMENTS = const <Object>[];
+
+  /**
+   * A flag indicating whether parser is to parse function bodies.
+   */
+  static bool parseFunctionBodies = true;
+
+  /**
+   * A flag indicating whether generic method support should be enabled for a
+   * specific test.
+   */
+  bool enableGenericMethods = false;
+
+  /**
+   * Return a CommentAndMetadata object with the given values that can be used for testing.
+   *
+   * @param comment the comment to be wrapped in the object
+   * @param annotations the annotations to be wrapped in the object
+   * @return a CommentAndMetadata object that can be used for testing
+   */
+  CommentAndMetadata commentAndMetadata(Comment comment,
+      [List<Annotation> annotations]) {
+    return new CommentAndMetadata(comment, annotations);
+  }
+
+  /**
+   * Return an empty CommentAndMetadata object that can be used for testing.
+   *
+   * @return an empty CommentAndMetadata object that can be used for testing
+   */
+  CommentAndMetadata emptyCommentAndMetadata() =>
+      new CommentAndMetadata(null, null);
+
+  /**
+   * Invoke a method in [Parser]. The method is assumed to have the given number and type of
+   * parameters and will be invoked with the given arguments.
+   *
+   * The given source is scanned and the parser is initialized to start with the first token in the
+   * source before the method is invoked.
+   *
+   * @param methodName the name of the method that should be invoked
+   * @param objects the values of the arguments to the method
+   * @param source the source to be processed by the parse method
+   * @param listener the error listener that will be used for both scanning and parsing
+   * @return the result of invoking the method
+   * @throws Exception if the method could not be invoked or throws an exception
+   * @throws AssertionFailedError if the result is `null` or the errors produced while
+   *           scanning and parsing the source do not match the expected errors
+   */
+  Object invokeParserMethod(String methodName, List<Object> objects,
+      String source, GatheringErrorListener listener) {
+    //
+    // Scan the source.
+    //
+    Scanner scanner =
+        new Scanner(null, new CharSequenceReader(source), listener);
+    Token tokenStream = scanner.tokenize();
+    listener.setLineInfo(new TestSource(), scanner.lineStarts);
+    //
+    // Parse the source.
+    //
+    Parser parser = createParser(listener);
+    parser.parseGenericMethods = enableGenericMethods;
+    parser.parseFunctionBodies = parseFunctionBodies;
+    Object result =
+        invokeParserMethodImpl(parser, methodName, objects, tokenStream);
+    //
+    // Partially test the results.
+    //
+    if (!listener.hasErrors) {
+      expect(result, isNotNull);
+    }
+    return result;
+  }
+
+  /**
+   * Invoke a method in [Parser]. The method is assumed to have no arguments.
+   *
+   * The given source is scanned and the parser is initialized to start with the first token in the
+   * source before the method is invoked.
+   *
+   * @param methodName the name of the method that should be invoked
+   * @param source the source to be processed by the parse method
+   * @param listener the error listener that will be used for both scanning and parsing
+   * @return the result of invoking the method
+   * @throws Exception if the method could not be invoked or throws an exception
+   * @throws AssertionFailedError if the result is `null` or the errors produced while
+   *           scanning and parsing the source do not match the expected errors
+   */
+  Object invokeParserMethod2(
+          String methodName, String source, GatheringErrorListener listener) =>
+      invokeParserMethod(methodName, _EMPTY_ARGUMENTS, source, listener);
+
+  /**
+   * Invoke a parse method in [Parser]. The method is assumed to have the given number and
+   * type of parameters and will be invoked with the given arguments.
+   *
+   * The given source is scanned and the parser is initialized to start with the first token in the
+   * source before the parse method is invoked.
+   *
+   * @param methodName the name of the parse method that should be invoked to parse the source
+   * @param objects the values of the arguments to the method
+   * @param source the source to be parsed by the parse method
+   * @return the result of invoking the method
+   * @throws Exception if the method could not be invoked or throws an exception
+   * @throws AssertionFailedError if the result is `null` or if any errors are produced
+   */
+  Object parse(String methodName, List<Object> objects, String source) =>
+      parse2(methodName, objects, source);
+
+  /**
+   * Invoke a parse method in [Parser]. The method is assumed to have the given number and
+   * type of parameters and will be invoked with the given arguments.
+   *
+   * The given source is scanned and the parser is initialized to start with the first token in the
+   * source before the parse method is invoked.
+   *
+   * @param methodName the name of the parse method that should be invoked to parse the source
+   * @param objects the values of the arguments to the method
+   * @param source the source to be parsed by the parse method
+   * @param errors the errors that should be generated
+   * @return the result of invoking the method
+   * @throws Exception if the method could not be invoked or throws an exception
+   * @throws AssertionFailedError if the result is `null` or the errors produced while
+   *           scanning and parsing the source do not match the expected errors
+   */
+  Object parse2(String methodName, List<Object> objects, String source,
+      [List<AnalysisError> errors = AnalysisError.NO_ERRORS]) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Object result = invokeParserMethod(methodName, objects, source, listener);
+    listener.assertErrors(errors);
+    return result;
+  }
+
+  /**
+   * Invoke a parse method in [Parser]. The method is assumed to have the given number and
+   * type of parameters and will be invoked with the given arguments.
+   *
+   * The given source is scanned and the parser is initialized to start with the first token in the
+   * source before the parse method is invoked.
+   *
+   * @param methodName the name of the parse method that should be invoked to parse the source
+   * @param objects the values of the arguments to the method
+   * @param source the source to be parsed by the parse method
+   * @param errorCodes the error codes of the errors that should be generated
+   * @return the result of invoking the method
+   * @throws Exception if the method could not be invoked or throws an exception
+   * @throws AssertionFailedError if the result is `null` or the errors produced while
+   *           scanning and parsing the source do not match the expected errors
+   */
+  Object parse3(String methodName, List<Object> objects, String source,
+      [List<ErrorCode> errorCodes = ErrorCode.EMPTY_LIST]) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Object result = invokeParserMethod(methodName, objects, source, listener);
+    listener.assertErrorsWithCodes(errorCodes);
+    return result;
+  }
+
+  /**
+   * Invoke a parse method in [Parser]. The method is assumed to have no arguments.
+   *
+   * The given source is scanned and the parser is initialized to start with the first token in the
+   * source before the parse method is invoked.
+   *
+   * @param methodName the name of the parse method that should be invoked to parse the source
+   * @param source the source to be parsed by the parse method
+   * @param errorCodes the error codes of the errors that should be generated
+   * @return the result of invoking the method
+   * @throws Exception if the method could not be invoked or throws an exception
+   * @throws AssertionFailedError if the result is `null` or the errors produced while
+   *           scanning and parsing the source do not match the expected errors
+   */
+  Object parse4(String methodName, String source,
+          [List<ErrorCode> errorCodes = ErrorCode.EMPTY_LIST]) =>
+      parse3(methodName, _EMPTY_ARGUMENTS, source, errorCodes);
+
+  /**
+   * Parse the given source as an expression.
+   *
+   * @param source the source to be parsed
+   * @param errorCodes the error codes of the errors that are expected to be found
+   * @return the expression that was parsed
+   * @throws Exception if the source could not be parsed, if the compilation errors in the source do
+   *           not match those that are expected, or if the result would have been `null`
+   */
+  Expression parseExpression(String source,
+      [List<ErrorCode> errorCodes = ErrorCode.EMPTY_LIST]) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scanner scanner =
+        new Scanner(null, new CharSequenceReader(source), listener);
+    listener.setLineInfo(new TestSource(), scanner.lineStarts);
+    Token token = scanner.tokenize();
+    Parser parser = createParser(listener);
+    parser.parseGenericMethods = enableGenericMethods;
+    Expression expression = parser.parseExpression(token);
+    expect(expression, isNotNull);
+    listener.assertErrorsWithCodes(errorCodes);
+    return expression;
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    parseFunctionBodies = true;
+  }
+
+  /**
+   * Create a parser.
+   *
+   * @param listener the listener to be passed to the parser
+   * @return the parser that was created
+   */
+  static Parser createParser(GatheringErrorListener listener) {
+    return new Parser(null, listener);
+  }
+
+  /**
+   * Parse the given source as a compilation unit.
+   *
+   * @param source the source to be parsed
+   * @param errorCodes the error codes of the errors that are expected to be found
+   * @return the compilation unit that was parsed
+   * @throws Exception if the source could not be parsed, if the compilation errors in the source do
+   *           not match those that are expected, or if the result would have been `null`
+   */
+  static CompilationUnit parseCompilationUnit(String source,
+      [List<ErrorCode> errorCodes = ErrorCode.EMPTY_LIST]) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scanner scanner =
+        new Scanner(null, new CharSequenceReader(source), listener);
+    listener.setLineInfo(new TestSource(), scanner.lineStarts);
+    Token token = scanner.tokenize();
+    Parser parser = createParser(listener);
+    CompilationUnit unit = parser.parseCompilationUnit(token);
+    expect(unit, isNotNull);
+    listener.assertErrorsWithCodes(errorCodes);
+    return unit;
+  }
+
+  /**
+   * Parse the given source as a statement.
+   *
+   * @param source the source to be parsed
+   * @param errorCodes the error codes of the errors that are expected to be found
+   * @return the statement that was parsed
+   * @throws Exception if the source could not be parsed, if the compilation errors in the source do
+   *           not match those that are expected, or if the result would have been `null`
+   */
+  static Statement parseStatement(String source,
+      [List<ErrorCode> errorCodes = ErrorCode.EMPTY_LIST]) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scanner scanner =
+        new Scanner(null, new CharSequenceReader(source), listener);
+    listener.setLineInfo(new TestSource(), scanner.lineStarts);
+    Token token = scanner.tokenize();
+    Parser parser = createParser(listener);
+    Statement statement = parser.parseStatement(token);
+    expect(statement, isNotNull);
+    listener.assertErrorsWithCodes(errorCodes);
+    return statement;
+  }
+
+  /**
+   * Parse the given source as a sequence of statements.
+   *
+   * @param source the source to be parsed
+   * @param expectedCount the number of statements that are expected
+   * @param errorCodes the error codes of the errors that are expected to be found
+   * @return the statements that were parsed
+   * @throws Exception if the source could not be parsed, if the number of statements does not match
+   *           the expected count, if the compilation errors in the source do not match those that
+   *           are expected, or if the result would have been `null`
+   */
+  static List<Statement> parseStatements(String source, int expectedCount,
+      [List<ErrorCode> errorCodes = ErrorCode.EMPTY_LIST]) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scanner scanner =
+        new Scanner(null, new CharSequenceReader(source), listener);
+    listener.setLineInfo(new TestSource(), scanner.lineStarts);
+    Token token = scanner.tokenize();
+    Parser parser = createParser(listener);
+    List<Statement> statements = parser.parseStatements(token);
+    expect(statements, hasLength(expectedCount));
+    listener.assertErrorsWithCodes(errorCodes);
+    return statements;
+  }
+}
+
+/**
+ * The class `RecoveryParserTest` defines parser tests that test the parsing of invalid code
+ * sequences to ensure that the correct recovery steps are taken in the parser.
+ */
+@reflectiveTest
+class RecoveryParserTest extends ParserTestCase {
+  void fail_incomplete_returnType() {
+    ParserTestCase.parseCompilationUnit(r'''
+Map<Symbol, convertStringToSymbolMap(Map<String, dynamic> map) {
+  if (map == null) return null;
+  Map<Symbol, dynamic> result = new Map<Symbol, dynamic>();
+  map.forEach((name, value) {
+    result[new Symbol(name)] = value;
+  });
+  return result;
+}''');
+  }
+
+  void test_additiveExpression_missing_LHS() {
+    BinaryExpression expression =
+        parseExpression("+ y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand.isSynthetic, isTrue);
+  }
+
+  void test_additiveExpression_missing_LHS_RHS() {
+    BinaryExpression expression = parseExpression("+", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand.isSynthetic, isTrue);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_additiveExpression_missing_RHS() {
+    BinaryExpression expression =
+        parseExpression("x +", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_additiveExpression_missing_RHS_super() {
+    BinaryExpression expression =
+        parseExpression("super +", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_additiveExpression_precedence_multiplicative_left() {
+    BinaryExpression expression = parseExpression("* +", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_additiveExpression_precedence_multiplicative_right() {
+    BinaryExpression expression = parseExpression("+ *", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.rightOperand);
+  }
+
+  void test_additiveExpression_super() {
+    BinaryExpression expression = parseExpression("super + +", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_assignmentExpression_missing_compound1() {
+    AssignmentExpression expression =
+        parseExpression("= y = 0", [ParserErrorCode.MISSING_IDENTIFIER]);
+    Expression syntheticExpression = expression.leftHandSide;
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, syntheticExpression);
+    expect(syntheticExpression.isSynthetic, isTrue);
+  }
+
+  void test_assignmentExpression_missing_compound2() {
+    AssignmentExpression expression =
+        parseExpression("x = = 0", [ParserErrorCode.MISSING_IDENTIFIER]);
+    Expression syntheticExpression =
+        (expression.rightHandSide as AssignmentExpression).leftHandSide;
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, syntheticExpression);
+    expect(syntheticExpression.isSynthetic, isTrue);
+  }
+
+  void test_assignmentExpression_missing_compound3() {
+    AssignmentExpression expression =
+        parseExpression("x = y =", [ParserErrorCode.MISSING_IDENTIFIER]);
+    Expression syntheticExpression =
+        (expression.rightHandSide as AssignmentExpression).rightHandSide;
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, syntheticExpression);
+    expect(syntheticExpression.isSynthetic, isTrue);
+  }
+
+  void test_assignmentExpression_missing_LHS() {
+    AssignmentExpression expression =
+        parseExpression("= 0", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftHandSide);
+    expect(expression.leftHandSide.isSynthetic, isTrue);
+  }
+
+  void test_assignmentExpression_missing_RHS() {
+    AssignmentExpression expression =
+        parseExpression("x =", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftHandSide);
+    expect(expression.rightHandSide.isSynthetic, isTrue);
+  }
+
+  void test_bitwiseAndExpression_missing_LHS() {
+    BinaryExpression expression =
+        parseExpression("& y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand.isSynthetic, isTrue);
+  }
+
+  void test_bitwiseAndExpression_missing_LHS_RHS() {
+    BinaryExpression expression = parseExpression("&", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand.isSynthetic, isTrue);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_bitwiseAndExpression_missing_RHS() {
+    BinaryExpression expression =
+        parseExpression("x &", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_bitwiseAndExpression_missing_RHS_super() {
+    BinaryExpression expression =
+        parseExpression("super &", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_bitwiseAndExpression_precedence_equality_left() {
+    BinaryExpression expression = parseExpression("== &&", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseAndExpression_precedence_equality_right() {
+    BinaryExpression expression = parseExpression("&& ==", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.rightOperand);
+  }
+
+  void test_bitwiseAndExpression_super() {
+    BinaryExpression expression = parseExpression("super &  &", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseOrExpression_missing_LHS() {
+    BinaryExpression expression =
+        parseExpression("| y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand.isSynthetic, isTrue);
+  }
+
+  void test_bitwiseOrExpression_missing_LHS_RHS() {
+    BinaryExpression expression = parseExpression("|", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand.isSynthetic, isTrue);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_bitwiseOrExpression_missing_RHS() {
+    BinaryExpression expression =
+        parseExpression("x |", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_bitwiseOrExpression_missing_RHS_super() {
+    BinaryExpression expression =
+        parseExpression("super |", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_bitwiseOrExpression_precedence_xor_left() {
+    BinaryExpression expression = parseExpression("^ |", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseOrExpression_precedence_xor_right() {
+    BinaryExpression expression = parseExpression("| ^", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.rightOperand);
+  }
+
+  void test_bitwiseOrExpression_super() {
+    BinaryExpression expression = parseExpression("super |  |", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseXorExpression_missing_LHS() {
+    BinaryExpression expression =
+        parseExpression("^ y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand.isSynthetic, isTrue);
+  }
+
+  void test_bitwiseXorExpression_missing_LHS_RHS() {
+    BinaryExpression expression = parseExpression("^", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand.isSynthetic, isTrue);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_bitwiseXorExpression_missing_RHS() {
+    BinaryExpression expression =
+        parseExpression("x ^", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_bitwiseXorExpression_missing_RHS_super() {
+    BinaryExpression expression =
+        parseExpression("super ^", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_bitwiseXorExpression_precedence_and_left() {
+    BinaryExpression expression = parseExpression("& ^", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_bitwiseXorExpression_precedence_and_right() {
+    BinaryExpression expression = parseExpression("^ &", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.rightOperand);
+  }
+
+  void test_bitwiseXorExpression_super() {
+    BinaryExpression expression = parseExpression("super ^  ^", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_classTypeAlias_withBody() {
+    ParserTestCase.parseCompilationUnit(
+        r'''
+class A {}
+class B = Object with A {}''',
+        [ParserErrorCode.EXPECTED_TOKEN]);
+  }
+
+  void test_conditionalExpression_missingElse() {
+    ConditionalExpression expression = parse4("parseConditionalExpression",
+        "x ? y :", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.elseExpression);
+    expect(expression.elseExpression.isSynthetic, isTrue);
+  }
+
+  void test_conditionalExpression_missingThen() {
+    ConditionalExpression expression = parse4("parseConditionalExpression",
+        "x ? : z", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.thenExpression);
+    expect(expression.thenExpression.isSynthetic, isTrue);
+  }
+
+  void test_equalityExpression_missing_LHS() {
+    BinaryExpression expression =
+        parseExpression("== y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand.isSynthetic, isTrue);
+  }
+
+  void test_equalityExpression_missing_LHS_RHS() {
+    BinaryExpression expression = parseExpression("==", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand.isSynthetic, isTrue);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_equalityExpression_missing_RHS() {
+    BinaryExpression expression =
+        parseExpression("x ==", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_equalityExpression_missing_RHS_super() {
+    BinaryExpression expression =
+        parseExpression("super ==", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_equalityExpression_precedence_relational_left() {
+    BinaryExpression expression = parseExpression("is ==", [
+      ParserErrorCode.EXPECTED_TYPE_NAME,
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is IsExpression, IsExpression, expression.leftOperand);
+  }
+
+  void test_equalityExpression_precedence_relational_right() {
+    BinaryExpression expression = parseExpression("== is", [
+      ParserErrorCode.EXPECTED_TYPE_NAME,
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is IsExpression, IsExpression, expression.rightOperand);
+  }
+
+  void test_equalityExpression_super() {
+    BinaryExpression expression = parseExpression("super ==  ==", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_expressionList_multiple_end() {
+    List<Expression> result = parse4("parseExpressionList", ", 2, 3, 4",
+        [ParserErrorCode.MISSING_IDENTIFIER]);
+    expect(result, hasLength(4));
+    Expression syntheticExpression = result[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, syntheticExpression);
+    expect(syntheticExpression.isSynthetic, isTrue);
+  }
+
+  void test_expressionList_multiple_middle() {
+    List<Expression> result = parse4("parseExpressionList", "1, 2, , 4",
+        [ParserErrorCode.MISSING_IDENTIFIER]);
+    expect(result, hasLength(4));
+    Expression syntheticExpression = result[2];
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, syntheticExpression);
+    expect(syntheticExpression.isSynthetic, isTrue);
+  }
+
+  void test_expressionList_multiple_start() {
+    List<Expression> result = parse4("parseExpressionList", "1, 2, 3,",
+        [ParserErrorCode.MISSING_IDENTIFIER]);
+    expect(result, hasLength(4));
+    Expression syntheticExpression = result[3];
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, syntheticExpression);
+    expect(syntheticExpression.isSynthetic, isTrue);
+  }
+
+  void test_functionExpression_in_ConstructorFieldInitializer() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        "class A { A() : a = (){}; var v; }",
+        [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.UNEXPECTED_TOKEN]);
+    // Make sure we recovered and parsed "var v" correctly
+    ClassDeclaration declaration = unit.declarations[0] as ClassDeclaration;
+    NodeList<ClassMember> members = declaration.members;
+    ClassMember fieldDecl = members[1];
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is FieldDeclaration, FieldDeclaration, fieldDecl);
+    NodeList<VariableDeclaration> vars =
+        (fieldDecl as FieldDeclaration).fields.variables;
+    expect(vars, hasLength(1));
+    expect(vars[0].name.name, "v");
+  }
+
+  void test_functionExpression_named() {
+    parseExpression("m(f() => 0);", [ParserErrorCode.EXPECTED_TOKEN]);
+  }
+
+  void test_declarationBeforeDirective() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        "class foo { } import 'bar.dart';",
+        [ParserErrorCode.DIRECTIVE_AFTER_DECLARATION]);
+    expect(unit.directives, hasLength(1));
+    expect(unit.declarations, hasLength(1));
+    ClassDeclaration classDecl = unit.childEntities.first;
+    expect(classDecl, isNotNull);
+    expect(classDecl.name.name, 'foo');
+  }
+
+  void test_importDirectivePartial_as() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        "import 'b.dart' d as b;", [ParserErrorCode.UNEXPECTED_TOKEN]);
+    ImportDirective importDirective = unit.childEntities.first;
+    expect(importDirective.asKeyword, isNotNull);
+    expect(unit.directives, hasLength(1));
+    expect(unit.declarations, hasLength(0));
+  }
+
+  void test_importDirectivePartial_hide() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        "import 'b.dart' d hide foo;", [ParserErrorCode.UNEXPECTED_TOKEN]);
+    ImportDirective importDirective = unit.childEntities.first;
+    expect(importDirective.combinators, hasLength(1));
+    expect(unit.directives, hasLength(1));
+    expect(unit.declarations, hasLength(0));
+  }
+
+  void test_importDirectivePartial_show() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        "import 'b.dart' d show foo;", [ParserErrorCode.UNEXPECTED_TOKEN]);
+    ImportDirective importDirective = unit.childEntities.first;
+    expect(importDirective.combinators, hasLength(1));
+    expect(unit.directives, hasLength(1));
+    expect(unit.declarations, hasLength(0));
+  }
+
+  void test_incomplete_conditionalExpression() {
+    parseExpression("x ? 0",
+        [ParserErrorCode.EXPECTED_TOKEN, ParserErrorCode.MISSING_IDENTIFIER]);
+  }
+
+  void test_incomplete_constructorInitializers_empty() {
+    parse3("parseClassMember", ["C"], "C() : {}",
+        [ParserErrorCode.MISSING_INITIALIZER]);
+  }
+
+  void test_incomplete_constructorInitializers_missingEquals() {
+    ClassMember member = parse3("parseClassMember", ["C"], "C() : x(3) {}",
+        [ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER]);
+    expect(member, new isInstanceOf<ConstructorDeclaration>());
+    NodeList<ConstructorInitializer> initializers =
+        (member as ConstructorDeclaration).initializers;
+    expect(initializers, hasLength(1));
+    ConstructorInitializer initializer = initializers[0];
+    expect(initializer, new isInstanceOf<ConstructorFieldInitializer>());
+    Expression expression =
+        (initializer as ConstructorFieldInitializer).expression;
+    expect(expression, isNotNull);
+    expect(expression, new isInstanceOf<ParenthesizedExpression>());
+  }
+
+  void test_incomplete_constructorInitializers_variable() {
+    parse3("parseClassMember", ["C"], "C() : x {}",
+        [ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER]);
+  }
+
+  void test_incomplete_topLevelFunction() {
+    ParserTestCase.parseCompilationUnit(
+        "foo();", [ParserErrorCode.MISSING_FUNCTION_BODY]);
+  }
+
+  void test_incomplete_topLevelVariable() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        "String", [ParserErrorCode.EXPECTED_EXECUTABLE]);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    expect(declarations, hasLength(1));
+    CompilationUnitMember member = declarations[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration,
+        TopLevelVariableDeclaration, member);
+    NodeList<VariableDeclaration> variables =
+        (member as TopLevelVariableDeclaration).variables.variables;
+    expect(variables, hasLength(1));
+    SimpleIdentifier name = variables[0].name;
+    expect(name.isSynthetic, isTrue);
+  }
+
+  void test_incomplete_topLevelVariable_const() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("const ",
+        [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    expect(declarations, hasLength(1));
+    CompilationUnitMember member = declarations[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration,
+        TopLevelVariableDeclaration, member);
+    NodeList<VariableDeclaration> variables =
+        (member as TopLevelVariableDeclaration).variables.variables;
+    expect(variables, hasLength(1));
+    SimpleIdentifier name = variables[0].name;
+    expect(name.isSynthetic, isTrue);
+  }
+
+  void test_incomplete_topLevelVariable_final() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("final ",
+        [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    expect(declarations, hasLength(1));
+    CompilationUnitMember member = declarations[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration,
+        TopLevelVariableDeclaration, member);
+    NodeList<VariableDeclaration> variables =
+        (member as TopLevelVariableDeclaration).variables.variables;
+    expect(variables, hasLength(1));
+    SimpleIdentifier name = variables[0].name;
+    expect(name.isSynthetic, isTrue);
+  }
+
+  void test_incomplete_topLevelVariable_var() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("var ",
+        [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    expect(declarations, hasLength(1));
+    CompilationUnitMember member = declarations[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration,
+        TopLevelVariableDeclaration, member);
+    NodeList<VariableDeclaration> variables =
+        (member as TopLevelVariableDeclaration).variables.variables;
+    expect(variables, hasLength(1));
+    SimpleIdentifier name = variables[0].name;
+    expect(name.isSynthetic, isTrue);
+  }
+
+  void test_incompleteField_const() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        r'''
+class C {
+  const
+}''',
+        [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    expect(declarations, hasLength(1));
+    CompilationUnitMember unitMember = declarations[0];
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
+    NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
+    expect(members, hasLength(1));
+    ClassMember classMember = members[0];
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
+    VariableDeclarationList fieldList =
+        (classMember as FieldDeclaration).fields;
+    expect((fieldList.keyword as KeywordToken).keyword, Keyword.CONST);
+    NodeList<VariableDeclaration> fields = fieldList.variables;
+    expect(fields, hasLength(1));
+    VariableDeclaration field = fields[0];
+    expect(field.name.isSynthetic, isTrue);
+  }
+
+  void test_incompleteField_final() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        r'''
+class C {
+  final
+}''',
+        [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    expect(declarations, hasLength(1));
+    CompilationUnitMember unitMember = declarations[0];
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
+    NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
+    expect(members, hasLength(1));
+    ClassMember classMember = members[0];
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
+    VariableDeclarationList fieldList =
+        (classMember as FieldDeclaration).fields;
+    expect((fieldList.keyword as KeywordToken).keyword, Keyword.FINAL);
+    NodeList<VariableDeclaration> fields = fieldList.variables;
+    expect(fields, hasLength(1));
+    VariableDeclaration field = fields[0];
+    expect(field.name.isSynthetic, isTrue);
+  }
+
+  void test_incompleteField_var() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        r'''
+class C {
+  var
+}''',
+        [ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN]);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    expect(declarations, hasLength(1));
+    CompilationUnitMember unitMember = declarations[0];
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
+    NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
+    expect(members, hasLength(1));
+    ClassMember classMember = members[0];
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
+    VariableDeclarationList fieldList =
+        (classMember as FieldDeclaration).fields;
+    expect((fieldList.keyword as KeywordToken).keyword, Keyword.VAR);
+    NodeList<VariableDeclaration> fields = fieldList.variables;
+    expect(fields, hasLength(1));
+    VariableDeclaration field = fields[0];
+    expect(field.name.isSynthetic, isTrue);
+  }
+
+  void test_invalidFunctionBodyModifier() {
+    ParserTestCase.parseCompilationUnit(
+        "f() sync {}", [ParserErrorCode.MISSING_STAR_AFTER_SYNC]);
+  }
+
+  void test_isExpression_noType() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        "class Bar<T extends Foo> {m(x){if (x is ) return;if (x is !)}}", [
+      ParserErrorCode.EXPECTED_TYPE_NAME,
+      ParserErrorCode.EXPECTED_TYPE_NAME,
+      ParserErrorCode.MISSING_STATEMENT
+    ]);
+    ClassDeclaration declaration = unit.declarations[0] as ClassDeclaration;
+    MethodDeclaration method = declaration.members[0] as MethodDeclaration;
+    BlockFunctionBody body = method.body as BlockFunctionBody;
+    IfStatement ifStatement = body.block.statements[1] as IfStatement;
+    IsExpression expression = ifStatement.condition as IsExpression;
+    expect(expression.expression, isNotNull);
+    expect(expression.isOperator, isNotNull);
+    expect(expression.notOperator, isNotNull);
+    TypeName type = expression.type;
+    expect(type, isNotNull);
+    expect(type.name.isSynthetic, isTrue);
+    EngineTestCase.assertInstanceOf((obj) => obj is EmptyStatement,
+        EmptyStatement, ifStatement.thenStatement);
+  }
+
+  void test_keywordInPlaceOfIdentifier() {
+    // TODO(brianwilkerson) We could do better with this.
+    ParserTestCase.parseCompilationUnit("do() {}", [
+      ParserErrorCode.EXPECTED_EXECUTABLE,
+      ParserErrorCode.UNEXPECTED_TOKEN
+    ]);
+  }
+
+  void test_logicalAndExpression_missing_LHS() {
+    BinaryExpression expression =
+        parseExpression("&& y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand.isSynthetic, isTrue);
+  }
+
+  void test_logicalAndExpression_missing_LHS_RHS() {
+    BinaryExpression expression = parseExpression("&&", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand.isSynthetic, isTrue);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_logicalAndExpression_missing_RHS() {
+    BinaryExpression expression =
+        parseExpression("x &&", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_logicalAndExpression_precedence_bitwiseOr_left() {
+    BinaryExpression expression = parseExpression("| &&", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_logicalAndExpression_precedence_bitwiseOr_right() {
+    BinaryExpression expression = parseExpression("&& |", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.rightOperand);
+  }
+
+  void test_logicalOrExpression_missing_LHS() {
+    BinaryExpression expression =
+        parseExpression("|| y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand.isSynthetic, isTrue);
+  }
+
+  void test_logicalOrExpression_missing_LHS_RHS() {
+    BinaryExpression expression = parseExpression("||", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand.isSynthetic, isTrue);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_logicalOrExpression_missing_RHS() {
+    BinaryExpression expression =
+        parseExpression("x ||", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_logicalOrExpression_precedence_logicalAnd_left() {
+    BinaryExpression expression = parseExpression("&& ||", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_logicalOrExpression_precedence_logicalAnd_right() {
+    BinaryExpression expression = parseExpression("|| &&", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.rightOperand);
+  }
+
+  void test_missing_commaInArgumentList() {
+    parseExpression("f(x: 1 y: 2)", [ParserErrorCode.EXPECTED_TOKEN]);
+  }
+
+  void test_missingGet() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(
+        r'''
+class C {
+  int length {}
+  void foo() {}
+}''',
+        [ParserErrorCode.MISSING_GET]);
+    expect(unit, isNotNull);
+    ClassDeclaration classDeclaration =
+        unit.declarations[0] as ClassDeclaration;
+    NodeList<ClassMember> members = classDeclaration.members;
+    expect(members, hasLength(2));
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodDeclaration, MethodDeclaration, members[0]);
+    ClassMember member = members[1];
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodDeclaration, MethodDeclaration, member);
+    expect((member as MethodDeclaration).name.name, "foo");
+  }
+
+  void test_missingIdentifier_afterAnnotation() {
+    MethodDeclaration method = parse3("parseClassMember", <Object>["C"],
+        "@override }", [ParserErrorCode.EXPECTED_CLASS_MEMBER]);
+    expect(method.documentationComment, isNull);
+    NodeList<Annotation> metadata = method.metadata;
+    expect(metadata, hasLength(1));
+    expect(metadata[0].name.name, "override");
+  }
+
+  void test_multiplicativeExpression_missing_LHS() {
+    BinaryExpression expression =
+        parseExpression("* y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand.isSynthetic, isTrue);
+  }
+
+  void test_multiplicativeExpression_missing_LHS_RHS() {
+    BinaryExpression expression = parseExpression("*", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand.isSynthetic, isTrue);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_multiplicativeExpression_missing_RHS() {
+    BinaryExpression expression =
+        parseExpression("x *", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_multiplicativeExpression_missing_RHS_super() {
+    BinaryExpression expression =
+        parseExpression("super *", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_multiplicativeExpression_precedence_unary_left() {
+    BinaryExpression expression =
+        parseExpression("-x *", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is PrefixExpression,
+        PrefixExpression, expression.leftOperand);
+  }
+
+  void test_multiplicativeExpression_precedence_unary_right() {
+    BinaryExpression expression =
+        parseExpression("* -y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is PrefixExpression,
+        PrefixExpression, expression.rightOperand);
+  }
+
+  void test_multiplicativeExpression_super() {
+    BinaryExpression expression = parseExpression("super ==  ==", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_nonStringLiteralUri_import() {
+    ParserTestCase.parseCompilationUnit("import dart:io; class C {}",
+        [ParserErrorCode.NON_STRING_LITERAL_AS_URI]);
+  }
+
+  void test_prefixExpression_missing_operand_minus() {
+    PrefixExpression expression =
+        parseExpression("-", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.operand);
+    expect(expression.operand.isSynthetic, isTrue);
+    expect(expression.operator.type, TokenType.MINUS);
+  }
+
+  void test_primaryExpression_argumentDefinitionTest() {
+    Expression expression = parse4(
+        "parsePrimaryExpression", "?a", [ParserErrorCode.UNEXPECTED_TOKEN]);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is SimpleIdentifier, SimpleIdentifier, expression);
+  }
+
+  void test_relationalExpression_missing_LHS() {
+    IsExpression expression =
+        parseExpression("is y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.expression);
+    expect(expression.expression.isSynthetic, isTrue);
+  }
+
+  void test_relationalExpression_missing_LHS_RHS() {
+    IsExpression expression = parseExpression("is", [
+      ParserErrorCode.EXPECTED_TYPE_NAME,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.expression);
+    expect(expression.expression.isSynthetic, isTrue);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is TypeName, TypeName, expression.type);
+    expect(expression.type.isSynthetic, isTrue);
+  }
+
+  void test_relationalExpression_missing_RHS() {
+    IsExpression expression =
+        parseExpression("x is", [ParserErrorCode.EXPECTED_TYPE_NAME]);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is TypeName, TypeName, expression.type);
+    expect(expression.type.isSynthetic, isTrue);
+  }
+
+  void test_relationalExpression_precedence_shift_right() {
+    IsExpression expression = parseExpression("<< is", [
+      ParserErrorCode.EXPECTED_TYPE_NAME,
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.expression);
+  }
+
+  void test_shiftExpression_missing_LHS() {
+    BinaryExpression expression =
+        parseExpression("<< y", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand.isSynthetic, isTrue);
+  }
+
+  void test_shiftExpression_missing_LHS_RHS() {
+    BinaryExpression expression = parseExpression("<<", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand.isSynthetic, isTrue);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_shiftExpression_missing_RHS() {
+    BinaryExpression expression =
+        parseExpression("x <<", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_shiftExpression_missing_RHS_super() {
+    BinaryExpression expression =
+        parseExpression("super <<", [ParserErrorCode.MISSING_IDENTIFIER]);
+    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
+        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand.isSynthetic, isTrue);
+  }
+
+  void test_shiftExpression_precedence_unary_left() {
+    BinaryExpression expression = parseExpression("+ <<", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_shiftExpression_precedence_unary_right() {
+    BinaryExpression expression = parseExpression("<< +", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.rightOperand);
+  }
+
+  void test_shiftExpression_super() {
+    BinaryExpression expression = parseExpression("super << <<", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
+        BinaryExpression, expression.leftOperand);
+  }
+
+  void test_typedef_eof() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("typedef n", [
+      ParserErrorCode.EXPECTED_TOKEN,
+      ParserErrorCode.MISSING_TYPEDEF_PARAMETERS
+    ]);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    expect(declarations, hasLength(1));
+    CompilationUnitMember member = declarations[0];
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is FunctionTypeAlias, FunctionTypeAlias, member);
+  }
+
+  void test_unaryPlus() {
+    parseExpression("+2", [ParserErrorCode.MISSING_IDENTIFIER]);
+  }
+}
+
+@reflectiveTest
+class ResolutionCopierTest extends EngineTestCase {
+  void test_visitAnnotation() {
+    String annotationName = "proxy";
+    Annotation fromNode =
+        AstFactory.annotation(AstFactory.identifier3(annotationName));
+    Element element = ElementFactory.topLevelVariableElement2(annotationName);
+    fromNode.element = element;
+    Annotation toNode =
+        AstFactory.annotation(AstFactory.identifier3(annotationName));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.element, same(element));
+  }
+
+  void test_visitAsExpression() {
+    AsExpression fromNode = AstFactory.asExpression(
+        AstFactory.identifier3("x"), AstFactory.typeName4("A"));
+    DartType propagatedType = ElementFactory.classElement2("A").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("B").type;
+    fromNode.staticType = staticType;
+    AsExpression toNode = AstFactory.asExpression(
+        AstFactory.identifier3("x"), AstFactory.typeName4("A"));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitAssignmentExpression() {
+    AssignmentExpression fromNode = AstFactory.assignmentExpression(
+        AstFactory.identifier3("a"),
+        TokenType.PLUS_EQ,
+        AstFactory.identifier3("b"));
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    MethodElement propagatedElement =
+        ElementFactory.methodElement("+", propagatedType);
+    fromNode.propagatedElement = propagatedElement;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    MethodElement staticElement = ElementFactory.methodElement("+", staticType);
+    fromNode.staticElement = staticElement;
+    fromNode.staticType = staticType;
+    AssignmentExpression toNode = AstFactory.assignmentExpression(
+        AstFactory.identifier3("a"),
+        TokenType.PLUS_EQ,
+        AstFactory.identifier3("b"));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedElement, same(propagatedElement));
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticElement, same(staticElement));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitBinaryExpression() {
+    BinaryExpression fromNode = AstFactory.binaryExpression(
+        AstFactory.identifier3("a"),
+        TokenType.PLUS,
+        AstFactory.identifier3("b"));
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    MethodElement propagatedElement =
+        ElementFactory.methodElement("+", propagatedType);
+    fromNode.propagatedElement = propagatedElement;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    MethodElement staticElement = ElementFactory.methodElement("+", staticType);
+    fromNode.staticElement = staticElement;
+    fromNode.staticType = staticType;
+    BinaryExpression toNode = AstFactory.binaryExpression(
+        AstFactory.identifier3("a"),
+        TokenType.PLUS,
+        AstFactory.identifier3("b"));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedElement, same(propagatedElement));
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticElement, same(staticElement));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitBooleanLiteral() {
+    BooleanLiteral fromNode = AstFactory.booleanLiteral(true);
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    BooleanLiteral toNode = AstFactory.booleanLiteral(true);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitCascadeExpression() {
+    CascadeExpression fromNode = AstFactory.cascadeExpression(
+        AstFactory.identifier3("a"), [AstFactory.identifier3("b")]);
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    CascadeExpression toNode = AstFactory.cascadeExpression(
+        AstFactory.identifier3("a"), [AstFactory.identifier3("b")]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitCompilationUnit() {
+    CompilationUnit fromNode = AstFactory.compilationUnit();
+    CompilationUnitElement element =
+        new CompilationUnitElementImpl("test.dart");
+    fromNode.element = element;
+    CompilationUnit toNode = AstFactory.compilationUnit();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.element, same(element));
+  }
+
+  void test_visitConditionalExpression() {
+    ConditionalExpression fromNode = AstFactory.conditionalExpression(
+        AstFactory.identifier3("c"),
+        AstFactory.identifier3("a"),
+        AstFactory.identifier3("b"));
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    ConditionalExpression toNode = AstFactory.conditionalExpression(
+        AstFactory.identifier3("c"),
+        AstFactory.identifier3("a"),
+        AstFactory.identifier3("b"));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitConstructorDeclaration() {
+    String className = "A";
+    String constructorName = "c";
+    ConstructorDeclaration fromNode = AstFactory.constructorDeclaration(
+        AstFactory.identifier3(className),
+        constructorName,
+        AstFactory.formalParameterList(),
+        null);
+    ConstructorElement element = ElementFactory.constructorElement2(
+        ElementFactory.classElement2(className), constructorName);
+    fromNode.element = element;
+    ConstructorDeclaration toNode = AstFactory.constructorDeclaration(
+        AstFactory.identifier3(className),
+        constructorName,
+        AstFactory.formalParameterList(),
+        null);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.element, same(element));
+  }
+
+  void test_visitConstructorName() {
+    ConstructorName fromNode =
+        AstFactory.constructorName(AstFactory.typeName4("A"), "c");
+    ConstructorElement staticElement = ElementFactory.constructorElement2(
+        ElementFactory.classElement2("A"), "c");
+    fromNode.staticElement = staticElement;
+    ConstructorName toNode =
+        AstFactory.constructorName(AstFactory.typeName4("A"), "c");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.staticElement, same(staticElement));
+  }
+
+  void test_visitDoubleLiteral() {
+    DoubleLiteral fromNode = AstFactory.doubleLiteral(1.0);
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    DoubleLiteral toNode = AstFactory.doubleLiteral(1.0);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitExportDirective() {
+    ExportDirective fromNode = AstFactory.exportDirective2("dart:uri");
+    ExportElement element = new ExportElementImpl(-1);
+    fromNode.element = element;
+    ExportDirective toNode = AstFactory.exportDirective2("dart:uri");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.element, same(element));
+  }
+
+  void test_visitFunctionExpression() {
+    FunctionExpression fromNode = AstFactory.functionExpression2(
+        AstFactory.formalParameterList(), AstFactory.emptyFunctionBody());
+    MethodElement element = ElementFactory.methodElement(
+        "m", ElementFactory.classElement2("C").type);
+    fromNode.element = element;
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    FunctionExpression toNode = AstFactory.functionExpression2(
+        AstFactory.formalParameterList(), AstFactory.emptyFunctionBody());
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.element, same(element));
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitFunctionExpressionInvocation() {
+    FunctionExpressionInvocation fromNode =
+        AstFactory.functionExpressionInvocation(AstFactory.identifier3("f"));
+    MethodElement propagatedElement = ElementFactory.methodElement(
+        "m", ElementFactory.classElement2("C").type);
+    fromNode.propagatedElement = propagatedElement;
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    MethodElement staticElement = ElementFactory.methodElement(
+        "m", ElementFactory.classElement2("C").type);
+    fromNode.staticElement = staticElement;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    FunctionExpressionInvocation toNode =
+        AstFactory.functionExpressionInvocation(AstFactory.identifier3("f"));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedElement, same(propagatedElement));
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticElement, same(staticElement));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitImportDirective() {
+    ImportDirective fromNode = AstFactory.importDirective3("dart:uri", null);
+    ImportElement element = new ImportElementImpl(0);
+    fromNode.element = element;
+    ImportDirective toNode = AstFactory.importDirective3("dart:uri", null);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.element, same(element));
+  }
+
+  void test_visitIndexExpression() {
+    IndexExpression fromNode = AstFactory.indexExpression(
+        AstFactory.identifier3("a"), AstFactory.integer(0));
+    MethodElement propagatedElement = ElementFactory.methodElement(
+        "m", ElementFactory.classElement2("C").type);
+    MethodElement staticElement = ElementFactory.methodElement(
+        "m", ElementFactory.classElement2("C").type);
+    AuxiliaryElements auxiliaryElements =
+        new AuxiliaryElements(staticElement, propagatedElement);
+    fromNode.auxiliaryElements = auxiliaryElements;
+    fromNode.propagatedElement = propagatedElement;
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    fromNode.staticElement = staticElement;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    IndexExpression toNode = AstFactory.indexExpression(
+        AstFactory.identifier3("a"), AstFactory.integer(0));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.auxiliaryElements, same(auxiliaryElements));
+    expect(toNode.propagatedElement, same(propagatedElement));
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticElement, same(staticElement));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitInstanceCreationExpression() {
+    InstanceCreationExpression fromNode = AstFactory
+        .instanceCreationExpression2(Keyword.NEW, AstFactory.typeName4("C"));
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    ConstructorElement staticElement = ElementFactory.constructorElement2(
+        ElementFactory.classElement2("C"), null);
+    fromNode.staticElement = staticElement;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    InstanceCreationExpression toNode = AstFactory.instanceCreationExpression2(
+        Keyword.NEW, AstFactory.typeName4("C"));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticElement, same(staticElement));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitIntegerLiteral() {
+    IntegerLiteral fromNode = AstFactory.integer(2);
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    IntegerLiteral toNode = AstFactory.integer(2);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitIsExpression() {
+    IsExpression fromNode = AstFactory.isExpression(
+        AstFactory.identifier3("x"), false, AstFactory.typeName4("A"));
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    IsExpression toNode = AstFactory.isExpression(
+        AstFactory.identifier3("x"), false, AstFactory.typeName4("A"));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitLibraryIdentifier() {
+    LibraryIdentifier fromNode =
+        AstFactory.libraryIdentifier([AstFactory.identifier3("lib")]);
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    LibraryIdentifier toNode =
+        AstFactory.libraryIdentifier([AstFactory.identifier3("lib")]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitListLiteral() {
+    ListLiteral fromNode = AstFactory.listLiteral();
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    ListLiteral toNode = AstFactory.listLiteral();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitMapLiteral() {
+    MapLiteral fromNode = AstFactory.mapLiteral2();
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    MapLiteral toNode = AstFactory.mapLiteral2();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitMethodInvocation() {
+    MethodInvocation fromNode = AstFactory.methodInvocation2("m");
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    MethodInvocation toNode = AstFactory.methodInvocation2("m");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitNamedExpression() {
+    NamedExpression fromNode =
+        AstFactory.namedExpression2("n", AstFactory.integer(0));
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    NamedExpression toNode =
+        AstFactory.namedExpression2("n", AstFactory.integer(0));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitNullLiteral() {
+    NullLiteral fromNode = AstFactory.nullLiteral();
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    NullLiteral toNode = AstFactory.nullLiteral();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitParenthesizedExpression() {
+    ParenthesizedExpression fromNode =
+        AstFactory.parenthesizedExpression(AstFactory.integer(0));
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    ParenthesizedExpression toNode =
+        AstFactory.parenthesizedExpression(AstFactory.integer(0));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitPartDirective() {
+    PartDirective fromNode = AstFactory.partDirective2("part.dart");
+    LibraryElement element = new LibraryElementImpl.forNode(
+        null, AstFactory.libraryIdentifier2(["lib"]));
+    fromNode.element = element;
+    PartDirective toNode = AstFactory.partDirective2("part.dart");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.element, same(element));
+  }
+
+  void test_visitPartOfDirective() {
+    PartOfDirective fromNode =
+        AstFactory.partOfDirective(AstFactory.libraryIdentifier2(["lib"]));
+    LibraryElement element = new LibraryElementImpl.forNode(
+        null, AstFactory.libraryIdentifier2(["lib"]));
+    fromNode.element = element;
+    PartOfDirective toNode =
+        AstFactory.partOfDirective(AstFactory.libraryIdentifier2(["lib"]));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.element, same(element));
+  }
+
+  void test_visitPostfixExpression() {
+    String variableName = "x";
+    PostfixExpression fromNode = AstFactory.postfixExpression(
+        AstFactory.identifier3(variableName), TokenType.PLUS_PLUS);
+    MethodElement propagatedElement = ElementFactory.methodElement(
+        "+", ElementFactory.classElement2("C").type);
+    fromNode.propagatedElement = propagatedElement;
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    MethodElement staticElement = ElementFactory.methodElement(
+        "+", ElementFactory.classElement2("C").type);
+    fromNode.staticElement = staticElement;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    PostfixExpression toNode = AstFactory.postfixExpression(
+        AstFactory.identifier3(variableName), TokenType.PLUS_PLUS);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedElement, same(propagatedElement));
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticElement, same(staticElement));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitPrefixedIdentifier() {
+    PrefixedIdentifier fromNode = AstFactory.identifier5("p", "f");
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    PrefixedIdentifier toNode = AstFactory.identifier5("p", "f");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitPrefixExpression() {
+    PrefixExpression fromNode = AstFactory.prefixExpression(
+        TokenType.PLUS_PLUS, AstFactory.identifier3("x"));
+    MethodElement propagatedElement = ElementFactory.methodElement(
+        "+", ElementFactory.classElement2("C").type);
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedElement = propagatedElement;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    MethodElement staticElement = ElementFactory.methodElement(
+        "+", ElementFactory.classElement2("C").type);
+    fromNode.staticElement = staticElement;
+    fromNode.staticType = staticType;
+    PrefixExpression toNode = AstFactory.prefixExpression(
+        TokenType.PLUS_PLUS, AstFactory.identifier3("x"));
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedElement, same(propagatedElement));
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticElement, same(staticElement));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitPropertyAccess() {
+    PropertyAccess fromNode =
+        AstFactory.propertyAccess2(AstFactory.identifier3("x"), "y");
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    PropertyAccess toNode =
+        AstFactory.propertyAccess2(AstFactory.identifier3("x"), "y");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitRedirectingConstructorInvocation() {
+    RedirectingConstructorInvocation fromNode =
+        AstFactory.redirectingConstructorInvocation();
+    ConstructorElement staticElement = ElementFactory.constructorElement2(
+        ElementFactory.classElement2("C"), null);
+    fromNode.staticElement = staticElement;
+    RedirectingConstructorInvocation toNode =
+        AstFactory.redirectingConstructorInvocation();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.staticElement, same(staticElement));
+  }
+
+  void test_visitRethrowExpression() {
+    RethrowExpression fromNode = AstFactory.rethrowExpression();
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    RethrowExpression toNode = AstFactory.rethrowExpression();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitSimpleIdentifier() {
+    SimpleIdentifier fromNode = AstFactory.identifier3("x");
+    MethodElement propagatedElement = ElementFactory.methodElement(
+        "m", ElementFactory.classElement2("C").type);
+    MethodElement staticElement = ElementFactory.methodElement(
+        "m", ElementFactory.classElement2("C").type);
+    AuxiliaryElements auxiliaryElements =
+        new AuxiliaryElements(staticElement, propagatedElement);
+    fromNode.auxiliaryElements = auxiliaryElements;
+    fromNode.propagatedElement = propagatedElement;
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    fromNode.staticElement = staticElement;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    SimpleIdentifier toNode = AstFactory.identifier3("x");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.auxiliaryElements, same(auxiliaryElements));
+    expect(toNode.propagatedElement, same(propagatedElement));
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticElement, same(staticElement));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitSimpleStringLiteral() {
+    SimpleStringLiteral fromNode = AstFactory.string2("abc");
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    SimpleStringLiteral toNode = AstFactory.string2("abc");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitStringInterpolation() {
+    StringInterpolation fromNode =
+        AstFactory.string([AstFactory.interpolationString("a", "'a'")]);
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    StringInterpolation toNode =
+        AstFactory.string([AstFactory.interpolationString("a", "'a'")]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitSuperConstructorInvocation() {
+    SuperConstructorInvocation fromNode =
+        AstFactory.superConstructorInvocation();
+    ConstructorElement staticElement = ElementFactory.constructorElement2(
+        ElementFactory.classElement2("C"), null);
+    fromNode.staticElement = staticElement;
+    SuperConstructorInvocation toNode = AstFactory.superConstructorInvocation();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.staticElement, same(staticElement));
+  }
+
+  void test_visitSuperExpression() {
+    SuperExpression fromNode = AstFactory.superExpression();
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    SuperExpression toNode = AstFactory.superExpression();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitSymbolLiteral() {
+    SymbolLiteral fromNode = AstFactory.symbolLiteral(["s"]);
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    SymbolLiteral toNode = AstFactory.symbolLiteral(["s"]);
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitThisExpression() {
+    ThisExpression fromNode = AstFactory.thisExpression();
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    ThisExpression toNode = AstFactory.thisExpression();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitThrowExpression() {
+    ThrowExpression fromNode = AstFactory.throwExpression();
+    DartType propagatedType = ElementFactory.classElement2("C").type;
+    fromNode.propagatedType = propagatedType;
+    DartType staticType = ElementFactory.classElement2("C").type;
+    fromNode.staticType = staticType;
+    ThrowExpression toNode = AstFactory.throwExpression();
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
+  }
+
+  void test_visitTypeName() {
+    TypeName fromNode = AstFactory.typeName4("C");
+    DartType type = ElementFactory.classElement2("C").type;
+    fromNode.type = type;
+    TypeName toNode = AstFactory.typeName4("C");
+    ResolutionCopier.copyResolutionData(fromNode, toNode);
+    expect(toNode.type, same(type));
+  }
+}
+
+/**
+ * The class `SimpleParserTest` defines parser tests that test individual parsing method. The
+ * code fragments should be as minimal as possible in order to test the method, but should not test
+ * the interactions between the method under test and other methods.
+ *
+ * More complex tests should be defined in the class [ComplexParserTest].
+ */
+@reflectiveTest
+class SimpleParserTest extends ParserTestCase {
+  void fail_parseAwaitExpression_inSync() {
+    // This test requires better error recovery than we currently have. In
+    // particular, we need to be able to distinguish between an await expression
+    // in the wrong context, and the use of 'await' as an identifier.
+    MethodDeclaration method = parse(
+        "parseClassMember", <Object>["C"], "m() { return await x + await y; }");
+    FunctionBody body = method.body;
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is BlockFunctionBody, BlockFunctionBody, body);
+    Statement statement = (body as BlockFunctionBody).block.statements[0];
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ReturnStatement, ReturnStatement, statement);
+    Expression expression = (statement as ReturnStatement).expression;
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is BinaryExpression, BinaryExpression, expression);
+    EngineTestCase.assertInstanceOf((obj) => obj is AwaitExpression,
+        AwaitExpression, (expression as BinaryExpression).leftOperand);
+    EngineTestCase.assertInstanceOf((obj) => obj is AwaitExpression,
+        AwaitExpression, (expression as BinaryExpression).rightOperand);
+  }
+
+  void fail_parseCommentReference_this() {
+    // This fails because we are returning null from the method and asserting
+    // that the return value is not null.
+    CommentReference reference =
+        parse("parseCommentReference", <Object>["this", 5], "");
+    SimpleIdentifier identifier = EngineTestCase.assertInstanceOf(
+        (obj) => obj is SimpleIdentifier,
+        SimpleIdentifier,
+        reference.identifier);
+    expect(identifier.token, isNotNull);
+    expect(identifier.name, "a");
+    expect(identifier.offset, 5);
+  }
+
+  void test_computeStringValue_emptyInterpolationPrefix() {
+    expect(_computeStringValue("'''", true, false), "");
+  }
+
+  void test_computeStringValue_escape_b() {
+    expect(_computeStringValue("'\\b'", true, true), "\b");
+  }
+
+  void test_computeStringValue_escape_f() {
+    expect(_computeStringValue("'\\f'", true, true), "\f");
+  }
+
+  void test_computeStringValue_escape_n() {
+    expect(_computeStringValue("'\\n'", true, true), "\n");
+  }
+
+  void test_computeStringValue_escape_notSpecial() {
+    expect(_computeStringValue("'\\:'", true, true), ":");
+  }
+
+  void test_computeStringValue_escape_r() {
+    expect(_computeStringValue("'\\r'", true, true), "\r");
+  }
+
+  void test_computeStringValue_escape_t() {
+    expect(_computeStringValue("'\\t'", true, true), "\t");
+  }
+
+  void test_computeStringValue_escape_u_fixed() {
+    expect(_computeStringValue("'\\u4321'", true, true), "\u4321");
+  }
+
+  void test_computeStringValue_escape_u_variable() {
+    expect(_computeStringValue("'\\u{123}'", true, true), "\u0123");
+  }
+
+  void test_computeStringValue_escape_v() {
+    expect(_computeStringValue("'\\v'", true, true), "\u000B");
+  }
+
+  void test_computeStringValue_escape_x() {
+    expect(_computeStringValue("'\\xFF'", true, true), "\u00FF");
+  }
+
+  void test_computeStringValue_noEscape_single() {
+    expect(_computeStringValue("'text'", true, true), "text");
+  }
+
+  void test_computeStringValue_noEscape_triple() {
+    expect(_computeStringValue("'''text'''", true, true), "text");
+  }
+
+  void test_computeStringValue_raw_single() {
+    expect(_computeStringValue("r'text'", true, true), "text");
+  }
+
+  void test_computeStringValue_raw_triple() {
+    expect(_computeStringValue("r'''text'''", true, true), "text");
+  }
+
+  void test_computeStringValue_raw_withEscape() {
+    expect(_computeStringValue("r'two\\nlines'", true, true), "two\\nlines");
+  }
+
+  void test_computeStringValue_triple_internalQuote_first_empty() {
+    expect(_computeStringValue("''''", true, false), "'");
+  }
+
+  void test_computeStringValue_triple_internalQuote_first_nonEmpty() {
+    expect(_computeStringValue("''''text", true, false), "'text");
+  }
+
+  void test_computeStringValue_triple_internalQuote_last_empty() {
+    expect(_computeStringValue("'''", false, true), "");
+  }
+
+  void test_computeStringValue_triple_internalQuote_last_nonEmpty() {
+    expect(_computeStringValue("text'''", false, true), "text");
+  }
+
+  void test_constFactory() {
+    parse("parseClassMember", <Object>["C"], "const factory C() = A;");
+  }
+
+  void test_createSyntheticIdentifier() {
+    SimpleIdentifier identifier = _createSyntheticIdentifier();
+    expect(identifier.isSynthetic, isTrue);
+  }
+
+  void test_createSyntheticStringLiteral() {
+    SimpleStringLiteral literal = _createSyntheticStringLiteral();
+    expect(literal.isSynthetic, isTrue);
+  }
+
+  void test_function_literal_allowed_at_toplevel() {
+    ParserTestCase.parseCompilationUnit("var x = () {};");
+  }
+
+  void test_function_literal_allowed_in_ArgumentList_in_ConstructorFieldInitializer() {
+    ParserTestCase.parseCompilationUnit("class C { C() : a = f(() {}); }");
+  }
+
+  void test_function_literal_allowed_in_IndexExpression_in_ConstructorFieldInitializer() {
+    ParserTestCase.parseCompilationUnit("class C { C() : a = x[() {}]; }");
+  }
+
+  void test_function_literal_allowed_in_ListLiteral_in_ConstructorFieldInitializer() {
+    ParserTestCase.parseCompilationUnit("class C { C() : a = [() {}]; }");
+  }
+
+  void test_function_literal_allowed_in_MapLiteral_in_ConstructorFieldInitializer() {
+    ParserTestCase
+        .parseCompilationUnit("class C { C() : a = {'key': () {}}; }");
+  }
+
+  void test_function_literal_allowed_in_ParenthesizedExpression_in_ConstructorFieldInitializer() {
+    ParserTestCase.parseCompilationUnit("class C { C() : a = (() {}); }");
+  }
+
+  void test_function_literal_allowed_in_StringInterpolation_in_ConstructorFieldInitializer() {
+    ParserTestCase.parseCompilationUnit("class C { C() : a = \"\${(){}}\"; }");
+  }
+
+  void test_import_as_show() {
+    ParserTestCase.parseCompilationUnit("import 'dart:math' as M show E;");
+  }
+
+  void test_import_show_hide() {
+    ParserTestCase.parseCompilationUnit(
+        "import 'import1_lib.dart' show hide, show hide ugly;");
+  }
+
+  void test_isFunctionDeclaration_nameButNoReturn_block() {
+    expect(_isFunctionDeclaration("f() {}"), isTrue);
+  }
+
+  void test_isFunctionDeclaration_nameButNoReturn_expression() {
+    expect(_isFunctionDeclaration("f() => e"), isTrue);
+  }
+
+  void test_isFunctionDeclaration_nameButNoReturn_typeParameters_block() {
+    enableGenericMethods = true;
+    expect(_isFunctionDeclaration("f<E>() {}"), isTrue);
+  }
+
+  void test_isFunctionDeclaration_nameButNoReturn_typeParameters_expression() {
+    enableGenericMethods = true;
+    expect(_isFunctionDeclaration("f<E>() => e"), isTrue);
+  }
+
+  void test_isFunctionDeclaration_normalReturn_block() {
+    expect(_isFunctionDeclaration("C f() {}"), isTrue);
+  }
+
+  void test_isFunctionDeclaration_normalReturn_expression() {
+    expect(_isFunctionDeclaration("C f() => e"), isTrue);
+  }
+
+  void test_isFunctionDeclaration_normalReturn_typeParameters_block() {
+    enableGenericMethods = true;
+    expect(_isFunctionDeclaration("C f<E>() {}"), isTrue);
+  }
+
+  void test_isFunctionDeclaration_normalReturn_typeParameters_expression() {
+    enableGenericMethods = true;
+    expect(_isFunctionDeclaration("C f<E>() => e"), isTrue);
+  }
+
+  void test_isFunctionDeclaration_voidReturn_block() {
+    expect(_isFunctionDeclaration("void f() {}"), isTrue);
+  }
+
+  void test_isFunctionDeclaration_voidReturn_expression() {
+    expect(_isFunctionDeclaration("void f() => e"), isTrue);
+  }
+
+  void test_isFunctionDeclaration_voidReturn_typeParameters_block() {
+    enableGenericMethods = true;
+    expect(_isFunctionDeclaration("void f<E>() {}"), isTrue);
+  }
+
+  void test_isFunctionDeclaration_voidReturn_typeParameters_expression() {
+    enableGenericMethods = true;
+    expect(_isFunctionDeclaration("void f<E>() => e"), isTrue);
+  }
+
+  void test_isFunctionExpression_false_noBody() {
+    expect(_isFunctionExpression("f();"), isFalse);
+  }
+
+  void test_isFunctionExpression_false_notParameters() {
+    expect(_isFunctionExpression("(a + b) {"), isFalse);
+  }
+
+  void test_isFunctionExpression_noParameters_block() {
+    expect(_isFunctionExpression("() {}"), isTrue);
+  }
+
+  void test_isFunctionExpression_noParameters_expression() {
+    expect(_isFunctionExpression("() => e"), isTrue);
+  }
+
+  void test_isFunctionExpression_noParameters_typeParameters_block() {
+    enableGenericMethods = true;
+    expect(_isFunctionExpression("<E>() {}"), isTrue);
+  }
+
+  void test_isFunctionExpression_noParameters_typeParameters_expression() {
+    enableGenericMethods = true;
+    expect(_isFunctionExpression("<E>() => e"), isTrue);
+  }
+
+  void test_isFunctionExpression_parameter_final() {
+    expect(_isFunctionExpression("(final a) {}"), isTrue);
+    expect(_isFunctionExpression("(final a, b) {}"), isTrue);
+    expect(_isFunctionExpression("(final a, final b) {}"), isTrue);
+  }
+
+  void test_isFunctionExpression_parameter_final_typed() {
+    expect(_isFunctionExpression("(final int a) {}"), isTrue);
+    expect(_isFunctionExpression("(final prefix.List a) {}"), isTrue);
+    expect(_isFunctionExpression("(final List<int> a) {}"), isTrue);
+    expect(_isFunctionExpression("(final prefix.List<int> a) {}"), isTrue);
+  }
+
+  void test_isFunctionExpression_parameter_multiple() {
+    expect(_isFunctionExpression("(a, b) {}"), isTrue);
+  }
+
+  void test_isFunctionExpression_parameter_named() {
+    expect(_isFunctionExpression("({a}) {}"), isTrue);
+  }
+
+  void test_isFunctionExpression_parameter_optional() {
+    expect(_isFunctionExpression("([a]) {}"), isTrue);
+  }
+
+  void test_isFunctionExpression_parameter_single() {
+    expect(_isFunctionExpression("(a) {}"), isTrue);
+  }
+
+  void test_isFunctionExpression_parameter_typed() {
+    expect(_isFunctionExpression("(int a, int b) {}"), isTrue);
+  }
+
+  void test_isInitializedVariableDeclaration_assignment() {
+    expect(_isInitializedVariableDeclaration("a = null;"), isFalse);
+  }
+
+  void test_isInitializedVariableDeclaration_comparison() {
+    expect(_isInitializedVariableDeclaration("a < 0;"), isFalse);
+  }
+
+  void test_isInitializedVariableDeclaration_conditional() {
+    expect(_isInitializedVariableDeclaration("a == null ? init() : update();"),
+        isFalse);
+  }
+
+  void test_isInitializedVariableDeclaration_const_noType_initialized() {
+    expect(_isInitializedVariableDeclaration("const a = 0;"), isTrue);
+  }
+
+  void test_isInitializedVariableDeclaration_const_noType_uninitialized() {
+    expect(_isInitializedVariableDeclaration("const a;"), isTrue);
+  }
+
+  void test_isInitializedVariableDeclaration_const_simpleType_uninitialized() {
+    expect(_isInitializedVariableDeclaration("const A a;"), isTrue);
+  }
+
+  void test_isInitializedVariableDeclaration_final_noType_initialized() {
+    expect(_isInitializedVariableDeclaration("final a = 0;"), isTrue);
+  }
+
+  void test_isInitializedVariableDeclaration_final_noType_uninitialized() {
+    expect(_isInitializedVariableDeclaration("final a;"), isTrue);
+  }
+
+  void test_isInitializedVariableDeclaration_final_simpleType_initialized() {
+    expect(_isInitializedVariableDeclaration("final A a = 0;"), isTrue);
+  }
+
+  void test_isInitializedVariableDeclaration_functionDeclaration_typed() {
+    expect(_isInitializedVariableDeclaration("A f() {};"), isFalse);
+  }
+
+  void test_isInitializedVariableDeclaration_functionDeclaration_untyped() {
+    expect(_isInitializedVariableDeclaration("f() {};"), isFalse);
+  }
+
+  void test_isInitializedVariableDeclaration_noType_initialized() {
+    expect(_isInitializedVariableDeclaration("var a = 0;"), isTrue);
+  }
+
+  void test_isInitializedVariableDeclaration_noType_uninitialized() {
+    expect(_isInitializedVariableDeclaration("var a;"), isTrue);
+  }
+
+  void test_isInitializedVariableDeclaration_parameterizedType_initialized() {
+    expect(_isInitializedVariableDeclaration("List<int> a = null;"), isTrue);
+  }
+
+  void test_isInitializedVariableDeclaration_parameterizedType_uninitialized() {
+    expect(_isInitializedVariableDeclaration("List<int> a;"), isTrue);
+  }
+
+  void test_isInitializedVariableDeclaration_simpleType_initialized() {
+    expect(_isInitializedVariableDeclaration("A a = 0;"), isTrue);
+  }
+
+  void test_isInitializedVariableDeclaration_simpleType_uninitialized() {
+    expect(_isInitializedVariableDeclaration("A a;"), isTrue);
+  }
+
+  void test_isSwitchMember_case_labeled() {
+    expect(_isSwitchMember("l1: l2: case"), isTrue);
+  }
+
+  void test_isSwitchMember_case_unlabeled() {
+    expect(_isSwitchMember("case"), isTrue);
+  }
+
+  void test_isSwitchMember_default_labeled() {
+    expect(_isSwitchMember("l1: l2: default"), isTrue);
+  }
+
+  void test_isSwitchMember_default_unlabeled() {
+    expect(_isSwitchMember("default"), isTrue);
+  }
+
+  void test_isSwitchMember_false() {
+    expect(_isSwitchMember("break;"), isFalse);
+  }
+
+  void test_parseAdditiveExpression_normal() {
+    BinaryExpression expression = parse4("parseAdditiveExpression", "x + y");
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.PLUS);
+    expect(expression.rightOperand, isNotNull);
+  }
+
+  void test_parseAdditiveExpression_super() {
+    BinaryExpression expression =
+        parse4("parseAdditiveExpression", "super + y");
+    EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression,
+        SuperExpression, expression.leftOperand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.PLUS);
+    expect(expression.rightOperand, isNotNull);
+  }
+
+  void test_parseAnnotation_n1() {
+    Annotation annotation = parse4("parseAnnotation", "@A");
+    expect(annotation.atSign, isNotNull);
+    expect(annotation.name, isNotNull);
+    expect(annotation.period, isNull);
+    expect(annotation.constructorName, isNull);
+    expect(annotation.arguments, isNull);
+  }
+
+  void test_parseAnnotation_n1_a() {
+    Annotation annotation = parse4("parseAnnotation", "@A(x,y)");
+    expect(annotation.atSign, isNotNull);
+    expect(annotation.name, isNotNull);
+    expect(annotation.period, isNull);
+    expect(annotation.constructorName, isNull);
+    expect(annotation.arguments, isNotNull);
+  }
+
+  void test_parseAnnotation_n2() {
+    Annotation annotation = parse4("parseAnnotation", "@A.B");
+    expect(annotation.atSign, isNotNull);
+    expect(annotation.name, isNotNull);
+    expect(annotation.period, isNull);
+    expect(annotation.constructorName, isNull);
+    expect(annotation.arguments, isNull);
+  }
+
+  void test_parseAnnotation_n2_a() {
+    Annotation annotation = parse4("parseAnnotation", "@A.B(x,y)");
+    expect(annotation.atSign, isNotNull);
+    expect(annotation.name, isNotNull);
+    expect(annotation.period, isNull);
+    expect(annotation.constructorName, isNull);
+    expect(annotation.arguments, isNotNull);
+  }
+
+  void test_parseAnnotation_n3() {
+    Annotation annotation = parse4("parseAnnotation", "@A.B.C");
+    expect(annotation.atSign, isNotNull);
+    expect(annotation.name, isNotNull);
+    expect(annotation.period, isNotNull);
+    expect(annotation.constructorName, isNotNull);
+    expect(annotation.arguments, isNull);
+  }
+
+  void test_parseAnnotation_n3_a() {
+    Annotation annotation = parse4("parseAnnotation", "@A.B.C(x,y)");
+    expect(annotation.atSign, isNotNull);
+    expect(annotation.name, isNotNull);
+    expect(annotation.period, isNotNull);
+    expect(annotation.constructorName, isNotNull);
+    expect(annotation.arguments, isNotNull);
+  }
+
+  void test_parseArgument_named() {
+    NamedExpression expression = parse4("parseArgument", "n: x");
+    Label name = expression.name;
+    expect(name, isNotNull);
+    expect(name.label, isNotNull);
+    expect(name.colon, isNotNull);
+    expect(expression.expression, isNotNull);
+  }
+
+  void test_parseArgument_unnamed() {
+    String lexeme = "x";
+    SimpleIdentifier identifier = parse4("parseArgument", lexeme);
+    expect(identifier.name, lexeme);
+  }
+
+  void test_parseArgumentList_empty() {
+    ArgumentList argumentList = parse4("parseArgumentList", "()");
+    NodeList<Expression> arguments = argumentList.arguments;
+    expect(arguments, hasLength(0));
+  }
+
+  void test_parseArgumentList_mixed() {
+    ArgumentList argumentList =
+        parse4("parseArgumentList", "(w, x, y: y, z: z)");
+    NodeList<Expression> arguments = argumentList.arguments;
+    expect(arguments, hasLength(4));
+  }
+
+  void test_parseArgumentList_noNamed() {
+    ArgumentList argumentList = parse4("parseArgumentList", "(x, y, z)");
+    NodeList<Expression> arguments = argumentList.arguments;
+    expect(arguments, hasLength(3));
+  }
+
+  void test_parseArgumentList_onlyNamed() {
+    ArgumentList argumentList = parse4("parseArgumentList", "(x: x, y: y)");
+    NodeList<Expression> arguments = argumentList.arguments;
+    expect(arguments, hasLength(2));
+  }
+
+  void test_parseAssertStatement() {
+    AssertStatement statement = parse4("parseAssertStatement", "assert (x);");
+    expect(statement.assertKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.semicolon, isNotNull);
+  }
+
+  void test_parseAssignableExpression_expression_args_dot() {
+    PropertyAccess propertyAccess =
+        parse("parseAssignableExpression", <Object>[false], "(x)(y).z");
+    FunctionExpressionInvocation invocation =
+        propertyAccess.target as FunctionExpressionInvocation;
+    expect(invocation.function, isNotNull);
+    expect(invocation.typeArguments, isNull);
+    ArgumentList argumentList = invocation.argumentList;
+    expect(argumentList, isNotNull);
+    expect(argumentList.arguments, hasLength(1));
+    expect(propertyAccess.operator, isNotNull);
+    expect(propertyAccess.propertyName, isNotNull);
+  }
+
+  void test_parseAssignableExpression_expression_args_dot_typeParameters() {
+    enableGenericMethods = true;
+    PropertyAccess propertyAccess =
+        parse("parseAssignableExpression", <Object>[false], "(x)<F>(y).z");
+    FunctionExpressionInvocation invocation =
+        propertyAccess.target as FunctionExpressionInvocation;
+    expect(invocation.function, isNotNull);
+    expect(invocation.typeArguments, isNotNull);
+    ArgumentList argumentList = invocation.argumentList;
+    expect(argumentList, isNotNull);
+    expect(argumentList.arguments, hasLength(1));
+    expect(propertyAccess.operator, isNotNull);
+    expect(propertyAccess.propertyName, isNotNull);
+  }
+
+  void test_parseAssignableExpression_expression_dot() {
+    PropertyAccess propertyAccess =
+        parse("parseAssignableExpression", <Object>[false], "(x).y");
+    expect(propertyAccess.target, isNotNull);
+    expect(propertyAccess.operator.type, TokenType.PERIOD);
+    expect(propertyAccess.propertyName, isNotNull);
+  }
+
+  void test_parseAssignableExpression_expression_index() {
+    IndexExpression expression =
+        parse("parseAssignableExpression", <Object>[false], "(x)[y]");
+    expect(expression.target, isNotNull);
+    expect(expression.leftBracket, isNotNull);
+    expect(expression.index, isNotNull);
+    expect(expression.rightBracket, isNotNull);
+  }
+
+  void test_parseAssignableExpression_expression_question_dot() {
+    PropertyAccess propertyAccess =
+        parse("parseAssignableExpression", <Object>[false], "(x)?.y");
+    expect(propertyAccess.target, isNotNull);
+    expect(propertyAccess.operator.type, TokenType.QUESTION_PERIOD);
+    expect(propertyAccess.propertyName, isNotNull);
+  }
+
+  void test_parseAssignableExpression_identifier() {
+    SimpleIdentifier identifier =
+        parse("parseAssignableExpression", <Object>[false], "x");
+    expect(identifier, isNotNull);
+  }
+
+  void test_parseAssignableExpression_identifier_args_dot() {
+    PropertyAccess propertyAccess =
+        parse("parseAssignableExpression", <Object>[false], "x(y).z");
+    MethodInvocation invocation = propertyAccess.target as MethodInvocation;
+    expect(invocation.methodName.name, "x");
+    expect(invocation.typeArguments, isNull);
+    ArgumentList argumentList = invocation.argumentList;
+    expect(argumentList, isNotNull);
+    expect(argumentList.arguments, hasLength(1));
+    expect(propertyAccess.operator, isNotNull);
+    expect(propertyAccess.propertyName, isNotNull);
+  }
+
+  void test_parseAssignableExpression_identifier_args_dot_typeParameters() {
+    enableGenericMethods = true;
+    PropertyAccess propertyAccess =
+        parse("parseAssignableExpression", <Object>[false], "x<E>(y).z");
+    MethodInvocation invocation = propertyAccess.target as MethodInvocation;
+    expect(invocation.methodName.name, "x");
+    expect(invocation.typeArguments, isNotNull);
+    ArgumentList argumentList = invocation.argumentList;
+    expect(argumentList, isNotNull);
+    expect(argumentList.arguments, hasLength(1));
+    expect(propertyAccess.operator, isNotNull);
+    expect(propertyAccess.propertyName, isNotNull);
+  }
+
+  void test_parseAssignableExpression_identifier_dot() {
+    PropertyAccess propertyAccess =
+        parse("parseAssignableExpression", <Object>[false], "x.y");
+    expect(propertyAccess.target, isNotNull);
+    expect(propertyAccess.operator, isNotNull);
+    expect(propertyAccess.operator.type, TokenType.PERIOD);
+    expect(propertyAccess.propertyName, isNotNull);
+  }
+
+  void test_parseAssignableExpression_identifier_index() {
+    IndexExpression expression =
+        parse("parseAssignableExpression", <Object>[false], "x[y]");
+    expect(expression.target, isNotNull);
+    expect(expression.leftBracket, isNotNull);
+    expect(expression.index, isNotNull);
+    expect(expression.rightBracket, isNotNull);
+  }
+
+  void test_parseAssignableExpression_identifier_question_dot() {
+    PropertyAccess propertyAccess =
+        parse("parseAssignableExpression", <Object>[false], "x?.y");
+    expect(propertyAccess.target, isNotNull);
+    expect(propertyAccess.operator.type, TokenType.QUESTION_PERIOD);
+    expect(propertyAccess.propertyName, isNotNull);
+  }
+
+  void test_parseAssignableExpression_super_dot() {
+    PropertyAccess propertyAccess =
+        parse("parseAssignableExpression", <Object>[false], "super.y");
+    EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression,
+        SuperExpression, propertyAccess.target);
+    expect(propertyAccess.operator, isNotNull);
+    expect(propertyAccess.propertyName, isNotNull);
+  }
+
+  void test_parseAssignableExpression_super_index() {
+    IndexExpression expression =
+        parse("parseAssignableExpression", <Object>[false], "super[y]");
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is SuperExpression, SuperExpression, expression.target);
+    expect(expression.leftBracket, isNotNull);
+    expect(expression.index, isNotNull);
+    expect(expression.rightBracket, isNotNull);
+  }
+
+  void test_parseAssignableSelector_dot() {
+    PropertyAccess selector =
+        parse("parseAssignableSelector", <Object>[null, true], ".x");
+    expect(selector.operator.type, TokenType.PERIOD);
+    expect(selector.propertyName, isNotNull);
+  }
+
+  void test_parseAssignableSelector_index() {
+    IndexExpression selector =
+        parse("parseAssignableSelector", <Object>[null, true], "[x]");
+    expect(selector.leftBracket, isNotNull);
+    expect(selector.index, isNotNull);
+    expect(selector.rightBracket, isNotNull);
+  }
+
+  void test_parseAssignableSelector_none() {
+    SimpleIdentifier selector = parse("parseAssignableSelector",
+        <Object>[new SimpleIdentifier(null), true], ";");
+    expect(selector, isNotNull);
+  }
+
+  void test_parseAssignableSelector_question_dot() {
+    PropertyAccess selector =
+        parse("parseAssignableSelector", <Object>[null, true], "?.x");
+    expect(selector.operator.type, TokenType.QUESTION_PERIOD);
+    expect(selector.propertyName, isNotNull);
+  }
+
+  void test_parseAwaitExpression() {
+    AwaitExpression expression = parse4("parseAwaitExpression", "await x;");
+    expect(expression.awaitKeyword, isNotNull);
+    expect(expression.expression, isNotNull);
+  }
+
+  void test_parseAwaitExpression_asStatement_inAsync() {
+    MethodDeclaration method =
+        parse("parseClassMember", <Object>["C"], "m() async { await x; }");
+    FunctionBody body = method.body;
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is BlockFunctionBody, BlockFunctionBody, body);
+    Statement statement = (body as BlockFunctionBody).block.statements[0];
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ExpressionStatement, ExpressionStatement, statement);
+    Expression expression = (statement as ExpressionStatement).expression;
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is AwaitExpression, AwaitExpression, expression);
+    expect((expression as AwaitExpression).awaitKeyword, isNotNull);
+    expect((expression as AwaitExpression).expression, isNotNull);
+  }
+
+  void test_parseAwaitExpression_asStatement_inSync() {
+    MethodDeclaration method =
+        parse("parseClassMember", <Object>["C"], "m() { await x; }");
+    FunctionBody body = method.body;
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is BlockFunctionBody, BlockFunctionBody, body);
+    Statement statement = (body as BlockFunctionBody).block.statements[0];
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is VariableDeclarationStatement,
+        VariableDeclarationStatement,
+        statement);
+  }
+
+  void test_parseBitwiseAndExpression_normal() {
+    BinaryExpression expression = parse4("parseBitwiseAndExpression", "x & y");
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.AMPERSAND);
+    expect(expression.rightOperand, isNotNull);
+  }
+
+  void test_parseBitwiseAndExpression_super() {
+    BinaryExpression expression =
+        parse4("parseBitwiseAndExpression", "super & y");
+    EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression,
+        SuperExpression, expression.leftOperand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.AMPERSAND);
+    expect(expression.rightOperand, isNotNull);
+  }
+
+  void test_parseBitwiseOrExpression_normal() {
+    BinaryExpression expression = parse4("parseBitwiseOrExpression", "x | y");
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.BAR);
+    expect(expression.rightOperand, isNotNull);
+  }
+
+  void test_parseBitwiseOrExpression_super() {
+    BinaryExpression expression =
+        parse4("parseBitwiseOrExpression", "super | y");
+    EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression,
+        SuperExpression, expression.leftOperand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.BAR);
+    expect(expression.rightOperand, isNotNull);
+  }
+
+  void test_parseBitwiseXorExpression_normal() {
+    BinaryExpression expression = parse4("parseBitwiseXorExpression", "x ^ y");
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.CARET);
+    expect(expression.rightOperand, isNotNull);
+  }
+
+  void test_parseBitwiseXorExpression_super() {
+    BinaryExpression expression =
+        parse4("parseBitwiseXorExpression", "super ^ y");
+    EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression,
+        SuperExpression, expression.leftOperand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.CARET);
+    expect(expression.rightOperand, isNotNull);
+  }
+
+  void test_parseBlock_empty() {
+    Block block = parse4("parseBlock", "{}");
+    expect(block.leftBracket, isNotNull);
+    expect(block.statements, hasLength(0));
+    expect(block.rightBracket, isNotNull);
+  }
+
+  void test_parseBlock_nonEmpty() {
+    Block block = parse4("parseBlock", "{;}");
+    expect(block.leftBracket, isNotNull);
+    expect(block.statements, hasLength(1));
+    expect(block.rightBracket, isNotNull);
+  }
+
+  void test_parseBreakStatement_label() {
+    BreakStatement statement = parse4("parseBreakStatement", "break foo;");
+    expect(statement.breakKeyword, isNotNull);
+    expect(statement.label, isNotNull);
+    expect(statement.semicolon, isNotNull);
+  }
+
+  void test_parseBreakStatement_noLabel() {
+    BreakStatement statement = parse4("parseBreakStatement", "break;",
+        [ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]);
+    expect(statement.breakKeyword, isNotNull);
+    expect(statement.label, isNull);
+    expect(statement.semicolon, isNotNull);
+  }
+
+  void test_parseCascadeSection_i() {
+    IndexExpression section = parse4("parseCascadeSection", "..[i]");
+    expect(section.target, isNull);
+    expect(section.leftBracket, isNotNull);
+    expect(section.index, isNotNull);
+    expect(section.rightBracket, isNotNull);
+  }
+
+  void test_parseCascadeSection_ia() {
+    FunctionExpressionInvocation section =
+        parse4("parseCascadeSection", "..[i](b)");
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is IndexExpression, IndexExpression, section.function);
+    expect(section.typeArguments, isNull);
+    expect(section.argumentList, isNotNull);
+  }
+
+  void test_parseCascadeSection_ia_typeArguments() {
+    enableGenericMethods = true;
+    FunctionExpressionInvocation section =
+        parse4("parseCascadeSection", "..[i]<E>(b)");
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is IndexExpression, IndexExpression, section.function);
+    expect(section.typeArguments, isNotNull);
+    expect(section.argumentList, isNotNull);
+  }
+
+  void test_parseCascadeSection_ii() {
+    MethodInvocation section = parse4("parseCascadeSection", "..a(b).c(d)");
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodInvocation, MethodInvocation, section.target);
+    expect(section.operator, isNotNull);
+    expect(section.methodName, isNotNull);
+    expect(section.typeArguments, isNull);
+    expect(section.argumentList, isNotNull);
+    expect(section.argumentList.arguments, hasLength(1));
+  }
+
+  void test_parseCascadeSection_ii_typeArguments() {
+    enableGenericMethods = true;
+    MethodInvocation section =
+        parse4("parseCascadeSection", "..a<E>(b).c<F>(d)");
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodInvocation, MethodInvocation, section.target);
+    expect(section.operator, isNotNull);
+    expect(section.methodName, isNotNull);
+    expect(section.typeArguments, isNotNull);
+    expect(section.argumentList, isNotNull);
+    expect(section.argumentList.arguments, hasLength(1));
+  }
+
+  void test_parseCascadeSection_p() {
+    PropertyAccess section = parse4("parseCascadeSection", "..a");
+    expect(section.target, isNull);
+    expect(section.operator, isNotNull);
+    expect(section.propertyName, isNotNull);
+  }
+
+  void test_parseCascadeSection_p_assign() {
+    AssignmentExpression section = parse4("parseCascadeSection", "..a = 3");
+    expect(section.leftHandSide, isNotNull);
+    expect(section.operator, isNotNull);
+    Expression rhs = section.rightHandSide;
+    expect(rhs, isNotNull);
+  }
+
+  void test_parseCascadeSection_p_assign_withCascade() {
+    AssignmentExpression section =
+        parse4("parseCascadeSection", "..a = 3..m()");
+    expect(section.leftHandSide, isNotNull);
+    expect(section.operator, isNotNull);
+    Expression rhs = section.rightHandSide;
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is IntegerLiteral, IntegerLiteral, rhs);
+  }
+
+  void test_parseCascadeSection_p_assign_withCascade_typeArguments() {
+    enableGenericMethods = true;
+    AssignmentExpression section =
+        parse4("parseCascadeSection", "..a = 3..m<E>()");
+    expect(section.leftHandSide, isNotNull);
+    expect(section.operator, isNotNull);
+    Expression rhs = section.rightHandSide;
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is IntegerLiteral, IntegerLiteral, rhs);
+  }
+
+  void test_parseCascadeSection_p_builtIn() {
+    PropertyAccess section = parse4("parseCascadeSection", "..as");
+    expect(section.target, isNull);
+    expect(section.operator, isNotNull);
+    expect(section.propertyName, isNotNull);
+  }
+
+  void test_parseCascadeSection_pa() {
+    MethodInvocation section = parse4("parseCascadeSection", "..a(b)");
+    expect(section.target, isNull);
+    expect(section.operator, isNotNull);
+    expect(section.methodName, isNotNull);
+    expect(section.typeArguments, isNull);
+    expect(section.argumentList, isNotNull);
+    expect(section.argumentList.arguments, hasLength(1));
+  }
+
+  void test_parseCascadeSection_pa_typeArguments() {
+    enableGenericMethods = true;
+    MethodInvocation section = parse4("parseCascadeSection", "..a<E>(b)");
+    expect(section.target, isNull);
+    expect(section.operator, isNotNull);
+    expect(section.methodName, isNotNull);
+    expect(section.typeArguments, isNotNull);
+    expect(section.argumentList, isNotNull);
+    expect(section.argumentList.arguments, hasLength(1));
+  }
+
+  void test_parseCascadeSection_paa() {
+    FunctionExpressionInvocation section =
+        parse4("parseCascadeSection", "..a(b)(c)");
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodInvocation, MethodInvocation, section.function);
+    expect(section.typeArguments, isNull);
+    expect(section.argumentList, isNotNull);
+    expect(section.argumentList.arguments, hasLength(1));
+  }
+
+  void test_parseCascadeSection_paa_typeArguments() {
+    enableGenericMethods = true;
+    FunctionExpressionInvocation section =
+        parse4("parseCascadeSection", "..a<E>(b)<F>(c)");
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodInvocation, MethodInvocation, section.function);
+    expect(section.typeArguments, isNotNull);
+    expect(section.argumentList, isNotNull);
+    expect(section.argumentList.arguments, hasLength(1));
+  }
+
+  void test_parseCascadeSection_paapaa() {
+    FunctionExpressionInvocation section =
+        parse4("parseCascadeSection", "..a(b)(c).d(e)(f)");
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodInvocation, MethodInvocation, section.function);
+    expect(section.typeArguments, isNull);
+    expect(section.argumentList, isNotNull);
+    expect(section.argumentList.arguments, hasLength(1));
+  }
+
+  void test_parseCascadeSection_paapaa_typeArguments() {
+    enableGenericMethods = true;
+    FunctionExpressionInvocation section =
+        parse4("parseCascadeSection", "..a<E>(b)<F>(c).d<G>(e)<H>(f)");
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is MethodInvocation, MethodInvocation, section.function);
+    expect(section.typeArguments, isNotNull);
+    expect(section.argumentList, isNotNull);
+    expect(section.argumentList.arguments, hasLength(1));
+  }
+
+  void test_parseCascadeSection_pap() {
+    PropertyAccess section = parse4("parseCascadeSection", "..a(b).c");
+    expect(section.target, isNotNull);
+    expect(section.operator, isNotNull);
+    expect(section.propertyName, isNotNull);
+  }
+
+  void test_parseCascadeSection_pap_typeArguments() {
+    enableGenericMethods = true;
+    PropertyAccess section = parse4("parseCascadeSection", "..a<E>(b).c");
+    expect(section.target, isNotNull);
+    expect(section.operator, isNotNull);
+    expect(section.propertyName, isNotNull);
+  }
+
+  void test_parseClassDeclaration_abstract() {
+    ClassDeclaration declaration = parse(
+        "parseClassDeclaration",
+        <Object>[
+          emptyCommentAndMetadata(),
+          TokenFactory.tokenFromKeyword(Keyword.ABSTRACT)
+        ],
+        "class A {}");
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNotNull);
+    expect(declaration.extendsClause, isNull);
+    expect(declaration.implementsClause, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNull);
+  }
+
+  void test_parseClassDeclaration_empty() {
+    ClassDeclaration declaration = parse("parseClassDeclaration",
+        <Object>[emptyCommentAndMetadata(), null], "class A {}");
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.extendsClause, isNull);
+    expect(declaration.implementsClause, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNull);
+  }
+
+  void test_parseClassDeclaration_extends() {
+    ClassDeclaration declaration = parse("parseClassDeclaration",
+        <Object>[emptyCommentAndMetadata(), null], "class A extends B {}");
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.extendsClause, isNotNull);
+    expect(declaration.implementsClause, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNull);
+  }
+
+  void test_parseClassDeclaration_extendsAndImplements() {
+    ClassDeclaration declaration = parse(
+        "parseClassDeclaration",
+        <Object>[emptyCommentAndMetadata(), null],
+        "class A extends B implements C {}");
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.extendsClause, isNotNull);
+    expect(declaration.implementsClause, isNotNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNull);
+  }
+
+  void test_parseClassDeclaration_extendsAndWith() {
+    ClassDeclaration declaration = parse(
+        "parseClassDeclaration",
+        <Object>[emptyCommentAndMetadata(), null],
+        "class A extends B with C {}");
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.typeParameters, isNull);
+    expect(declaration.extendsClause, isNotNull);
+    expect(declaration.withClause, isNotNull);
+    expect(declaration.implementsClause, isNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+  }
+
+  void test_parseClassDeclaration_extendsAndWithAndImplements() {
+    ClassDeclaration declaration = parse(
+        "parseClassDeclaration",
+        <Object>[emptyCommentAndMetadata(), null],
+        "class A extends B with C implements D {}");
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.typeParameters, isNull);
+    expect(declaration.extendsClause, isNotNull);
+    expect(declaration.withClause, isNotNull);
+    expect(declaration.implementsClause, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+  }
+
+  void test_parseClassDeclaration_implements() {
+    ClassDeclaration declaration = parse("parseClassDeclaration",
+        <Object>[emptyCommentAndMetadata(), null], "class A implements C {}");
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.extendsClause, isNull);
+    expect(declaration.implementsClause, isNotNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNull);
+  }
+
+  void test_parseClassDeclaration_native() {
+    ClassDeclaration declaration = parse(
+        "parseClassDeclaration",
+        <Object>[emptyCommentAndMetadata(), null],
+        "class A native 'nativeValue' {}");
+    NativeClause nativeClause = declaration.nativeClause;
+    expect(nativeClause, isNotNull);
+    expect(nativeClause.nativeKeyword, isNotNull);
+    expect(nativeClause.name.stringValue, "nativeValue");
+    expect(nativeClause.beginToken, same(nativeClause.nativeKeyword));
+    expect(nativeClause.endToken, same(nativeClause.name.endToken));
+  }
+
+  void test_parseClassDeclaration_nonEmpty() {
+    ClassDeclaration declaration = parse("parseClassDeclaration",
+        <Object>[emptyCommentAndMetadata(), null], "class A {var f;}");
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.extendsClause, isNull);
+    expect(declaration.implementsClause, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(1));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNull);
+  }
+
+  void test_parseClassDeclaration_typeAlias_implementsC() {
+    ClassTypeAlias typeAlias = parse(
+        "parseClassDeclaration",
+        <Object>[emptyCommentAndMetadata(), null],
+        "class A = Object with B implements C;");
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.withClause, isNotNull);
+    expect(typeAlias.implementsClause, isNotNull);
+    expect(typeAlias.implementsClause.implementsKeyword, isNotNull);
+    expect(typeAlias.implementsClause.interfaces.length, 1);
+    expect(typeAlias.semicolon, isNotNull);
+  }
+
+  void test_parseClassDeclaration_typeAlias_withB() {
+    ClassTypeAlias typeAlias = parse("parseClassDeclaration",
+        <Object>[emptyCommentAndMetadata(), null], "class A = Object with B;");
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.withClause, isNotNull);
+    expect(typeAlias.withClause.withKeyword, isNotNull);
+    expect(typeAlias.withClause.mixinTypes.length, 1);
+    expect(typeAlias.implementsClause, isNull);
+    expect(typeAlias.semicolon, isNotNull);
+  }
+
+  void test_parseClassDeclaration_typeParameters() {
+    ClassDeclaration declaration = parse("parseClassDeclaration",
+        <Object>[emptyCommentAndMetadata(), null], "class A<B> {}");
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.extendsClause, isNull);
+    expect(declaration.implementsClause, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNotNull);
+    expect(declaration.typeParameters.typeParameters, hasLength(1));
+  }
+
+  void test_parseClassMember_constructor_withInitializers() {
+    // TODO(brianwilkerson) Test other kinds of class members: fields, getters
+    // and setters.
+    ConstructorDeclaration constructor = parse("parseClassMember",
+        <Object>["C"], "C(_, _\$, this.__) : _a = _ + _\$ {}");
+    expect(constructor.body, isNotNull);
+    expect(constructor.separator, isNotNull);
+    expect(constructor.externalKeyword, isNull);
+    expect(constructor.constKeyword, isNull);
+    expect(constructor.factoryKeyword, isNull);
+    expect(constructor.name, isNull);
+    expect(constructor.parameters, isNotNull);
+    expect(constructor.period, isNull);
+    expect(constructor.returnType, isNotNull);
+    expect(constructor.initializers, hasLength(1));
+  }
+
+  void test_parseClassMember_field_instance_prefixedType() {
+    FieldDeclaration field = parse("parseClassMember", <Object>["C"], "p.A f;");
+    expect(field.documentationComment, isNull);
+    expect(field.metadata, hasLength(0));
+    expect(field.staticKeyword, isNull);
+    VariableDeclarationList list = field.fields;
+    expect(list, isNotNull);
+    NodeList<VariableDeclaration> variables = list.variables;
+    expect(variables, hasLength(1));
+    VariableDeclaration variable = variables[0];
+    expect(variable.name, isNotNull);
+  }
+
+  void test_parseClassMember_field_namedGet() {
+    FieldDeclaration field =
+        parse("parseClassMember", <Object>["C"], "var get;");
+    expect(field.documentationComment, isNull);
+    expect(field.metadata, hasLength(0));
+    expect(field.staticKeyword, isNull);
+    VariableDeclarationList list = field.fields;
+    expect(list, isNotNull);
+    NodeList<VariableDeclaration> variables = list.variables;
+    expect(variables, hasLength(1));
+    VariableDeclaration variable = variables[0];
+    expect(variable.name, isNotNull);
+  }
+
+  void test_parseClassMember_field_namedOperator() {
+    FieldDeclaration field =
+        parse("parseClassMember", <Object>["C"], "var operator;");
+    expect(field.documentationComment, isNull);
+    expect(field.metadata, hasLength(0));
+    expect(field.staticKeyword, isNull);
+    VariableDeclarationList list = field.fields;
+    expect(list, isNotNull);
+    NodeList<VariableDeclaration> variables = list.variables;
+    expect(variables, hasLength(1));
+    VariableDeclaration variable = variables[0];
+    expect(variable.name, isNotNull);
+  }
+
+  void test_parseClassMember_field_namedOperator_withAssignment() {
+    FieldDeclaration field =
+        parse("parseClassMember", <Object>["C"], "var operator = (5);");
+    expect(field.documentationComment, isNull);
+    expect(field.metadata, hasLength(0));
+    expect(field.staticKeyword, isNull);
+    VariableDeclarationList list = field.fields;
+    expect(list, isNotNull);
+    NodeList<VariableDeclaration> variables = list.variables;
+    expect(variables, hasLength(1));
+    VariableDeclaration variable = variables[0];
+    expect(variable.name, isNotNull);
+    expect(variable.initializer, isNotNull);
+  }
+
+  void test_parseClassMember_field_namedSet() {
+    FieldDeclaration field =
+        parse("parseClassMember", <Object>["C"], "var set;");
+    expect(field.documentationComment, isNull);
+    expect(field.metadata, hasLength(0));
+    expect(field.staticKeyword, isNull);
+    VariableDeclarationList list = field.fields;
+    expect(list, isNotNull);
+    NodeList<VariableDeclaration> variables = list.variables;
+    expect(variables, hasLength(1));
+    VariableDeclaration variable = variables[0];
+    expect(variable.name, isNotNull);
+  }
+
+  void test_parseClassMember_getter_void() {
+    MethodDeclaration method =
+        parse("parseClassMember", <Object>["C"], "void get g {}");
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNotNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.body, isNotNull);
+    expect(method.parameters, isNull);
+  }
+
+  void test_parseClassMember_method_external() {
+    MethodDeclaration method =
+        parse("parseClassMember", <Object>["C"], "external m();");
+    expect(method.body, isNotNull);
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNotNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNull);
+  }
+
+  void test_parseClassMember_method_external_withTypeAndArgs() {
+    MethodDeclaration method =
+        parse("parseClassMember", <Object>["C"], "external int m(int a);");
+    expect(method.body, isNotNull);
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNotNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+  }
+
+  void test_parseClassMember_method_generic_noReturnType() {
+    enableGenericMethods = true;
+    MethodDeclaration method =
+        parse("parseClassMember", <Object>["C"], "m<T>() {}");
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNotNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
+  }
+
+  void test_parseClassMember_method_generic_returnType() {
+    enableGenericMethods = true;
+    MethodDeclaration method =
+        parse("parseClassMember", <Object>["C"], "T m<T>() {}");
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNotNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
+  }
+
+  void test_parseClassMember_method_generic_void() {
+    enableGenericMethods = true;
+    MethodDeclaration method =
+        parse("parseClassMember", <Object>["C"], "void m<T>() {}");
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNotNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
+  }
+
+  void test_parseClassMember_method_get_noType() {
+    MethodDeclaration method =
+        parse("parseClassMember", <Object>["C"], "get() {}");
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
+  }
+
+  void test_parseClassMember_method_get_type() {
+    MethodDeclaration method =
+        parse("parseClassMember", <Object>["C"], "int get() {}");
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
+  }
+
+  void test_parseClassMember_method_get_void() {
+    MethodDeclaration method =
+        parse("parseClassMember", <Object>["C"], "void get() {}");
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
+  }
+
+  void test_parseClassMember_method_operator_noType() {
+    MethodDeclaration method =
+        parse("parseClassMember", <Object>["C"], "operator() {}");
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
+  }
+
+  void test_parseClassMember_method_operator_type() {
+    MethodDeclaration method =
+        parse("parseClassMember", <Object>["C"], "int operator() {}");
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
+  }
+
+  void test_parseClassMember_method_operator_void() {
+    MethodDeclaration method =
+        parse("parseClassMember", <Object>["C"], "void operator() {}");
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
+  }
+
+  void test_parseClassMember_method_returnType_parameterized() {
+    MethodDeclaration method =
+        parse("parseClassMember", <Object>["C"], "p.A m() {}");
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
+  }
+
+  void test_parseClassMember_method_set_noType() {
+    MethodDeclaration method =
+        parse("parseClassMember", <Object>["C"], "set() {}");
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
+  }
+
+  void test_parseClassMember_method_set_type() {
+    MethodDeclaration method =
+        parse("parseClassMember", <Object>["C"], "int set() {}");
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
+  }
+
+  void test_parseClassMember_method_set_void() {
+    MethodDeclaration method =
+        parse("parseClassMember", <Object>["C"], "void set() {}");
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
+  }
+
+  void test_parseClassMember_operator_index() {
+    MethodDeclaration method =
+        parse("parseClassMember", <Object>["C"], "int operator [](int i) {}");
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNotNull);
+    expect(method.typeParameters, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
+  }
+
+  void test_parseClassMember_operator_indexAssign() {
+    MethodDeclaration method =
+        parse("parseClassMember", <Object>["C"], "int operator []=(int i) {}");
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNotNull);
+    expect(method.typeParameters, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
+  }
+
+  void test_parseClassMember_redirectingFactory_const() {
+    ConstructorDeclaration constructor =
+        parse("parseClassMember", <Object>["C"], "const factory C() = B;");
+    expect(constructor.externalKeyword, isNull);
+    expect(constructor.constKeyword, isNotNull);
+    expect(constructor.factoryKeyword, isNotNull);
+    expect(constructor.returnType, isNotNull);
+    expect(constructor.period, isNull);
+    expect(constructor.name, isNull);
+    expect(constructor.parameters, isNotNull);
+    expect(constructor.separator, isNotNull);
+    expect(constructor.initializers, hasLength(0));
+    expect(constructor.redirectedConstructor, isNotNull);
+    expect(constructor.body, isNotNull);
+  }
+
+  void test_parseClassMember_redirectingFactory_nonConst() {
+    ConstructorDeclaration constructor =
+        parse("parseClassMember", <Object>["C"], "factory C() = B;");
+    expect(constructor.externalKeyword, isNull);
+    expect(constructor.constKeyword, isNull);
+    expect(constructor.factoryKeyword, isNotNull);
+    expect(constructor.returnType, isNotNull);
+    expect(constructor.period, isNull);
+    expect(constructor.name, isNull);
+    expect(constructor.parameters, isNotNull);
+    expect(constructor.separator, isNotNull);
+    expect(constructor.initializers, hasLength(0));
+    expect(constructor.redirectedConstructor, isNotNull);
+    expect(constructor.body, isNotNull);
+  }
+
+  void test_parseClassTypeAlias_abstract() {
+    Token classToken = TokenFactory.tokenFromKeyword(Keyword.CLASS);
+    Token abstractToken = TokenFactory.tokenFromKeyword(Keyword.ABSTRACT);
+    ClassTypeAlias classTypeAlias = parse(
+        "parseClassTypeAlias",
+        <Object>[emptyCommentAndMetadata(), abstractToken, classToken],
+        "A = B with C;");
+    expect(classTypeAlias.typedefKeyword, isNotNull);
+    expect(classTypeAlias.name.name, "A");
+    expect(classTypeAlias.equals, isNotNull);
+    expect(classTypeAlias.abstractKeyword, isNotNull);
+    expect(classTypeAlias.superclass.name.name, isNotNull, reason: "B");
+    expect(classTypeAlias.withClause, isNotNull);
+    expect(classTypeAlias.implementsClause, isNull);
+    expect(classTypeAlias.semicolon, isNotNull);
+  }
+
+  void test_parseClassTypeAlias_implements() {
+    Token token = TokenFactory.tokenFromKeyword(Keyword.CLASS);
+    ClassTypeAlias classTypeAlias = parse(
+        "parseClassTypeAlias",
+        <Object>[emptyCommentAndMetadata(), null, token],
+        "A = B with C implements D;");
+    expect(classTypeAlias.typedefKeyword, isNotNull);
+    expect(classTypeAlias.name.name, "A");
+    expect(classTypeAlias.equals, isNotNull);
+    expect(classTypeAlias.abstractKeyword, isNull);
+    expect(classTypeAlias.superclass.name.name, isNotNull, reason: "B");
+    expect(classTypeAlias.withClause, isNotNull);
+    expect(classTypeAlias.implementsClause, isNotNull);
+    expect(classTypeAlias.semicolon, isNotNull);
+  }
+
+  void test_parseClassTypeAlias_with() {
+    Token token = TokenFactory.tokenFromKeyword(Keyword.CLASS);
+    ClassTypeAlias classTypeAlias = parse("parseClassTypeAlias",
+        <Object>[emptyCommentAndMetadata(), null, token], "A = B with C;");
+    expect(classTypeAlias.typedefKeyword, isNotNull);
+    expect(classTypeAlias.name.name, "A");
+    expect(classTypeAlias.equals, isNotNull);
+    expect(classTypeAlias.abstractKeyword, isNull);
+    expect(classTypeAlias.superclass.name.name, isNotNull, reason: "B");
+    expect(classTypeAlias.withClause, isNotNull);
+    expect(classTypeAlias.implementsClause, isNull);
+    expect(classTypeAlias.semicolon, isNotNull);
+  }
+
+  void test_parseClassTypeAlias_with_implements() {
+    Token token = TokenFactory.tokenFromKeyword(Keyword.CLASS);
+    ClassTypeAlias classTypeAlias = parse(
+        "parseClassTypeAlias",
+        <Object>[emptyCommentAndMetadata(), null, token],
+        "A = B with C implements D;");
+    expect(classTypeAlias.typedefKeyword, isNotNull);
+    expect(classTypeAlias.name.name, "A");
+    expect(classTypeAlias.equals, isNotNull);
+    expect(classTypeAlias.abstractKeyword, isNull);
+    expect(classTypeAlias.superclass.name.name, isNotNull, reason: "B");
+    expect(classTypeAlias.withClause, isNotNull);
+    expect(classTypeAlias.implementsClause, isNotNull);
+    expect(classTypeAlias.semicolon, isNotNull);
+  }
+
+  void test_parseCombinator_hide() {
+    HideCombinator combinator = parse4('parseCombinator', 'hide a;');
+    expect(combinator, new isInstanceOf<HideCombinator>());
+    expect(combinator.keyword, isNotNull);
+    expect(combinator.hiddenNames, hasLength(1));
+  }
+
+  void test_parseCombinator_show() {
+    ShowCombinator combinator = parse4('parseCombinator', 'show a;');
+    expect(combinator, new isInstanceOf<ShowCombinator>());
+    expect(combinator.keyword, isNotNull);
+    expect(combinator.shownNames, hasLength(1));
+  }
+
+  void test_parseCombinators_h() {
+    List<Combinator> combinators = parse4("parseCombinators", "hide a;");
+    expect(combinators, hasLength(1));
+    HideCombinator combinator = combinators[0] as HideCombinator;
+    expect(combinator, isNotNull);
+    expect(combinator.keyword, isNotNull);
+    expect(combinator.hiddenNames, hasLength(1));
+  }
+
+  void test_parseCombinators_hs() {
+    List<Combinator> combinators = parse4("parseCombinators", "hide a show b;");
+    expect(combinators, hasLength(2));
+    HideCombinator hideCombinator = combinators[0] as HideCombinator;
+    expect(hideCombinator, isNotNull);
+    expect(hideCombinator.keyword, isNotNull);
+    expect(hideCombinator.hiddenNames, hasLength(1));
+    ShowCombinator showCombinator = combinators[1] as ShowCombinator;
+    expect(showCombinator, isNotNull);
+    expect(showCombinator.keyword, isNotNull);
+    expect(showCombinator.shownNames, hasLength(1));
+  }
+
+  void test_parseCombinators_hshs() {
+    List<Combinator> combinators =
+        parse4("parseCombinators", "hide a show b hide c show d;");
+    expect(combinators, hasLength(4));
+  }
+
+  void test_parseCombinators_s() {
+    List<Combinator> combinators = parse4("parseCombinators", "show a;");
+    expect(combinators, hasLength(1));
+    ShowCombinator combinator = combinators[0] as ShowCombinator;
+    expect(combinator, isNotNull);
+    expect(combinator.keyword, isNotNull);
+    expect(combinator.shownNames, hasLength(1));
+  }
+
+  void test_parseCommentAndMetadata_c() {
+    CommentAndMetadata commentAndMetadata =
+        parse4("parseCommentAndMetadata", "/** 1 */ void");
+    expect(commentAndMetadata.comment, isNotNull);
+    expect(commentAndMetadata.metadata, hasLength(0));
+  }
+
+  void test_parseCommentAndMetadata_cmc() {
+    CommentAndMetadata commentAndMetadata =
+        parse4("parseCommentAndMetadata", "/** 1 */ @A /** 2 */ void");
+    expect(commentAndMetadata.comment, isNotNull);
+    expect(commentAndMetadata.metadata, hasLength(1));
+  }
+
+  void test_parseCommentAndMetadata_cmcm() {
+    CommentAndMetadata commentAndMetadata =
+        parse4("parseCommentAndMetadata", "/** 1 */ @A /** 2 */ @B void");
+    expect(commentAndMetadata.comment, isNotNull);
+    expect(commentAndMetadata.metadata, hasLength(2));
+  }
+
+  void test_parseCommentAndMetadata_cmm() {
+    CommentAndMetadata commentAndMetadata =
+        parse4("parseCommentAndMetadata", "/** 1 */ @A @B void");
+    expect(commentAndMetadata.comment, isNotNull);
+    expect(commentAndMetadata.metadata, hasLength(2));
+  }
+
+  void test_parseCommentAndMetadata_m() {
+    CommentAndMetadata commentAndMetadata =
+        parse4("parseCommentAndMetadata", "@A void");
+    expect(commentAndMetadata.comment, isNull);
+    expect(commentAndMetadata.metadata, hasLength(1));
+  }
+
+  void test_parseCommentAndMetadata_mcm() {
+    CommentAndMetadata commentAndMetadata =
+        parse4("parseCommentAndMetadata", "@A /** 1 */ @B void");
+    expect(commentAndMetadata.comment, isNotNull);
+    expect(commentAndMetadata.metadata, hasLength(2));
+  }
+
+  void test_parseCommentAndMetadata_mcmc() {
+    CommentAndMetadata commentAndMetadata =
+        parse4("parseCommentAndMetadata", "@A /** 1 */ @B /** 2 */ void");
+    expect(commentAndMetadata.comment, isNotNull);
+    expect(commentAndMetadata.metadata, hasLength(2));
+  }
+
+  void test_parseCommentAndMetadata_mm() {
+    CommentAndMetadata commentAndMetadata =
+        parse4("parseCommentAndMetadata", "@A @B(x) void");
+    expect(commentAndMetadata.comment, isNull);
+    expect(commentAndMetadata.metadata, hasLength(2));
+  }
+
+  void test_parseCommentAndMetadata_none() {
+    CommentAndMetadata commentAndMetadata =
+        parse4("parseCommentAndMetadata", "void");
+    expect(commentAndMetadata.comment, isNull);
+    expect(commentAndMetadata.metadata, hasLength(0));
+  }
+
+  void test_parseCommentAndMetadata_singleLine() {
+    CommentAndMetadata commentAndMetadata = parse4(
+        "parseCommentAndMetadata",
+        r'''
+/// 1
+/// 2
+void''');
+    expect(commentAndMetadata.comment, isNotNull);
+    expect(commentAndMetadata.metadata, hasLength(0));
+  }
+
+  void test_parseCommentReference_new_prefixed() {
+    CommentReference reference =
+        parse("parseCommentReference", <Object>["new a.b", 7], "");
+    PrefixedIdentifier prefixedIdentifier = EngineTestCase.assertInstanceOf(
+        (obj) => obj is PrefixedIdentifier,
+        PrefixedIdentifier,
+        reference.identifier);
+    SimpleIdentifier prefix = prefixedIdentifier.prefix;
+    expect(prefix.token, isNotNull);
+    expect(prefix.name, "a");
+    expect(prefix.offset, 11);
+    expect(prefixedIdentifier.period, isNotNull);
+    SimpleIdentifier identifier = prefixedIdentifier.identifier;
+    expect(identifier.token, isNotNull);
+    expect(identifier.name, "b");
+    expect(identifier.offset, 13);
+  }
+
+  void test_parseCommentReference_new_simple() {
+    CommentReference reference =
+        parse("parseCommentReference", <Object>["new a", 5], "");
+    SimpleIdentifier identifier = EngineTestCase.assertInstanceOf(
+        (obj) => obj is SimpleIdentifier,
+        SimpleIdentifier,
+        reference.identifier);
+    expect(identifier.token, isNotNull);
+    expect(identifier.name, "a");
+    expect(identifier.offset, 9);
+  }
+
+  void test_parseCommentReference_prefixed() {
+    CommentReference reference =
+        parse("parseCommentReference", <Object>["a.b", 7], "");
+    PrefixedIdentifier prefixedIdentifier = EngineTestCase.assertInstanceOf(
+        (obj) => obj is PrefixedIdentifier,
+        PrefixedIdentifier,
+        reference.identifier);
+    SimpleIdentifier prefix = prefixedIdentifier.prefix;
+    expect(prefix.token, isNotNull);
+    expect(prefix.name, "a");
+    expect(prefix.offset, 7);
+    expect(prefixedIdentifier.period, isNotNull);
+    SimpleIdentifier identifier = prefixedIdentifier.identifier;
+    expect(identifier.token, isNotNull);
+    expect(identifier.name, "b");
+    expect(identifier.offset, 9);
+  }
+
+  void test_parseCommentReference_simple() {
+    CommentReference reference =
+        parse("parseCommentReference", <Object>["a", 5], "");
+    SimpleIdentifier identifier = EngineTestCase.assertInstanceOf(
+        (obj) => obj is SimpleIdentifier,
+        SimpleIdentifier,
+        reference.identifier);
+    expect(identifier.token, isNotNull);
+    expect(identifier.name, "a");
+    expect(identifier.offset, 5);
+  }
+
+  void test_parseCommentReference_synthetic() {
+    CommentReference reference =
+        parse("parseCommentReference", <Object>["", 5], "");
+    SimpleIdentifier identifier = EngineTestCase.assertInstanceOf(
+        (obj) => obj is SimpleIdentifier,
+        SimpleIdentifier,
+        reference.identifier);
+    expect(identifier, isNotNull);
+    expect(identifier.isSynthetic, isTrue);
+    expect(identifier.token, isNotNull);
+    expect(identifier.name, "");
+    expect(identifier.offset, 5);
+  }
+
+  void test_parseCommentReferences_multiLine() {
+    DocumentationCommentToken token = new DocumentationCommentToken(
+        TokenType.MULTI_LINE_COMMENT, "/** xxx [a] yyy [bb] zzz */", 3);
+    List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[token];
+    List<CommentReference> references =
+        parse("parseCommentReferences", <Object>[tokens], "");
+    List<Token> tokenReferences = token.references;
+    expect(references, hasLength(2));
+    expect(tokenReferences, hasLength(2));
+    {
+      CommentReference reference = references[0];
+      expect(reference, isNotNull);
+      expect(reference.identifier, isNotNull);
+      expect(reference.offset, 12);
+      // the reference is recorded in the comment token
+      Token referenceToken = tokenReferences[0];
+      expect(referenceToken.offset, 12);
+      expect(referenceToken.lexeme, 'a');
+    }
+    {
+      CommentReference reference = references[1];
+      expect(reference, isNotNull);
+      expect(reference.identifier, isNotNull);
+      expect(reference.offset, 20);
+      // the reference is recorded in the comment token
+      Token referenceToken = tokenReferences[1];
+      expect(referenceToken.offset, 20);
+      expect(referenceToken.lexeme, 'bb');
+    }
+  }
+
+  void test_parseCommentReferences_notClosed_noIdentifier() {
+    List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+      new DocumentationCommentToken(
+          TokenType.MULTI_LINE_COMMENT, "/** [ some text", 5)
+    ];
+    List<CommentReference> references =
+        parse("parseCommentReferences", <Object>[tokens], "");
+    expect(references, hasLength(1));
+    CommentReference reference = references[0];
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.identifier.isSynthetic, isTrue);
+    expect(reference.identifier.name, "");
+  }
+
+  void test_parseCommentReferences_notClosed_withIdentifier() {
+    List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+      new DocumentationCommentToken(
+          TokenType.MULTI_LINE_COMMENT, "/** [namePrefix some text", 5)
+    ];
+    List<CommentReference> references =
+        parse("parseCommentReferences", <Object>[tokens], "");
+    expect(references, hasLength(1));
+    CommentReference reference = references[0];
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.identifier.isSynthetic, isFalse);
+    expect(reference.identifier.name, "namePrefix");
+  }
+
+  void test_parseCommentReferences_singleLine() {
+    List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+      new DocumentationCommentToken(
+          TokenType.SINGLE_LINE_COMMENT, "/// xxx [a] yyy [b] zzz", 3),
+      new DocumentationCommentToken(
+          TokenType.SINGLE_LINE_COMMENT, "/// x [c]", 28)
+    ];
+    List<CommentReference> references =
+        parse("parseCommentReferences", <Object>[tokens], "");
+    expect(references, hasLength(3));
+    CommentReference reference = references[0];
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.offset, 12);
+    reference = references[1];
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.offset, 20);
+    reference = references[2];
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.offset, 35);
+  }
+
+  void test_parseCommentReferences_skipCodeBlock_bracketed() {
+    List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+      new DocumentationCommentToken(
+          TokenType.MULTI_LINE_COMMENT, "/** [:xxx [a] yyy:] [b] zzz */", 3)
+    ];
+    List<CommentReference> references =
+        parse("parseCommentReferences", <Object>[tokens], "");
+    expect(references, hasLength(1));
+    CommentReference reference = references[0];
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.offset, 24);
+  }
+
+  void test_parseCommentReferences_skipCodeBlock_spaces() {
+    List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+      new DocumentationCommentToken(TokenType.MULTI_LINE_COMMENT,
+          "/**\n *     a[i]\n * xxx [i] zzz\n */", 3)
+    ];
+    List<CommentReference> references =
+        parse("parseCommentReferences", <Object>[tokens], "");
+    expect(references, hasLength(1));
+    CommentReference reference = references[0];
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.offset, 27);
+  }
+
+  void test_parseCommentReferences_skipLinkDefinition() {
+    List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+      new DocumentationCommentToken(TokenType.MULTI_LINE_COMMENT,
+          "/** [a]: http://www.google.com (Google) [b] zzz */", 3)
+    ];
+    List<CommentReference> references =
+        parse("parseCommentReferences", <Object>[tokens], "");
+    expect(references, hasLength(1));
+    CommentReference reference = references[0];
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.offset, 44);
+  }
+
+  void test_parseCommentReferences_skipLinked() {
+    List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+      new DocumentationCommentToken(TokenType.MULTI_LINE_COMMENT,
+          "/** [a](http://www.google.com) [b] zzz */", 3)
+    ];
+    List<CommentReference> references =
+        parse("parseCommentReferences", <Object>[tokens], "");
+    expect(references, hasLength(1));
+    CommentReference reference = references[0];
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.offset, 35);
+  }
+
+  void test_parseCommentReferences_skipReferenceLink() {
+    List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+      new DocumentationCommentToken(
+          TokenType.MULTI_LINE_COMMENT, "/** [a][c] [b] zzz */", 3)
+    ];
+    List<CommentReference> references =
+        parse("parseCommentReferences", <Object>[tokens], "");
+    expect(references, hasLength(1));
+    CommentReference reference = references[0];
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.offset, 15);
+  }
+
+  void test_parseCompilationUnit_abstractAsPrefix_parameterized() {
+    CompilationUnit unit = parse4("parseCompilationUnit",
+        "abstract<dynamic> _abstract = new abstract.A();");
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(1));
+  }
+
+  void test_parseCompilationUnit_builtIn_asFunctionName() {
+    parse4("parseCompilationUnit", "abstract(x) => 0;");
+    parse4("parseCompilationUnit", "as(x) => 0;");
+    parse4("parseCompilationUnit", "dynamic(x) => 0;");
+    parse4("parseCompilationUnit", "export(x) => 0;");
+    parse4("parseCompilationUnit", "external(x) => 0;");
+    parse4("parseCompilationUnit", "factory(x) => 0;");
+    parse4("parseCompilationUnit", "get(x) => 0;");
+    parse4("parseCompilationUnit", "implements(x) => 0;");
+    parse4("parseCompilationUnit", "import(x) => 0;");
+    parse4("parseCompilationUnit", "library(x) => 0;");
+    parse4("parseCompilationUnit", "operator(x) => 0;");
+    parse4("parseCompilationUnit", "part(x) => 0;");
+    parse4("parseCompilationUnit", "set(x) => 0;");
+    parse4("parseCompilationUnit", "static(x) => 0;");
+    parse4("parseCompilationUnit", "typedef(x) => 0;");
+  }
+
+  void test_parseCompilationUnit_directives_multiple() {
+    CompilationUnit unit =
+        parse4("parseCompilationUnit", "library l;\npart 'a.dart';");
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(2));
+    expect(unit.declarations, hasLength(0));
+  }
+
+  void test_parseCompilationUnit_directives_single() {
+    CompilationUnit unit = parse4("parseCompilationUnit", "library l;");
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(1));
+    expect(unit.declarations, hasLength(0));
+  }
+
+  void test_parseCompilationUnit_empty() {
+    CompilationUnit unit = parse4("parseCompilationUnit", "");
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(0));
+  }
+
+  void test_parseCompilationUnit_exportAsPrefix() {
+    CompilationUnit unit =
+        parse4("parseCompilationUnit", "export.A _export = new export.A();");
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(1));
+  }
+
+  void test_parseCompilationUnit_exportAsPrefix_parameterized() {
+    CompilationUnit unit = parse4(
+        "parseCompilationUnit", "export<dynamic> _export = new export.A();");
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(1));
+  }
+
+  void test_parseCompilationUnit_operatorAsPrefix_parameterized() {
+    CompilationUnit unit = parse4("parseCompilationUnit",
+        "operator<dynamic> _operator = new operator.A();");
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(1));
+  }
+
+  void test_parseCompilationUnit_script() {
+    CompilationUnit unit = parse4("parseCompilationUnit", "#! /bin/dart");
+    expect(unit.scriptTag, isNotNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(0));
+  }
+
+  void test_parseCompilationUnit_skipFunctionBody_withInterpolation() {
+    ParserTestCase.parseFunctionBodies = false;
+    CompilationUnit unit = parse4("parseCompilationUnit", "f() { '\${n}'; }");
+    expect(unit.scriptTag, isNull);
+    expect(unit.declarations, hasLength(1));
+  }
+
+  void test_parseCompilationUnit_topLevelDeclaration() {
+    CompilationUnit unit = parse4("parseCompilationUnit", "class A {}");
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(1));
+  }
+
+  void test_parseCompilationUnit_typedefAsPrefix() {
+    CompilationUnit unit =
+        parse4("parseCompilationUnit", "typedef.A _typedef = new typedef.A();");
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(1));
+  }
+
+  void test_parseCompilationUnitMember_abstractAsPrefix() {
+    TopLevelVariableDeclaration declaration = parse(
+        "parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()],
+        "abstract.A _abstract = new abstract.A();");
+    expect(declaration.semicolon, isNotNull);
+    expect(declaration.variables, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_class() {
+    ClassDeclaration declaration = parse("parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()], "class A {}");
+    expect(declaration.name.name, "A");
+    expect(declaration.members, hasLength(0));
+  }
+
+  void test_parseCompilationUnitMember_classTypeAlias() {
+    ClassTypeAlias alias = parse("parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()], "abstract class A = B with C;");
+    expect(alias.name.name, "A");
+    expect(alias.abstractKeyword, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_constVariable() {
+    TopLevelVariableDeclaration declaration = parse(
+        "parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()],
+        "const int x = 0;");
+    expect(declaration.semicolon, isNotNull);
+    expect(declaration.variables, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_finalVariable() {
+    TopLevelVariableDeclaration declaration = parse(
+        "parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()],
+        "final x = 0;");
+    expect(declaration.semicolon, isNotNull);
+    expect(declaration.variables, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_function_external_noType() {
+    FunctionDeclaration declaration = parse("parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()], "external f();");
+    expect(declaration.externalKeyword, isNotNull);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNull);
+  }
+
+  void test_parseCompilationUnitMember_function_external_type() {
+    FunctionDeclaration declaration = parse("parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()], "external int f();");
+    expect(declaration.externalKeyword, isNotNull);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNull);
+  }
+
+  void test_parseCompilationUnitMember_function_noType() {
+    FunctionDeclaration declaration = parse("parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()], "f() {}");
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNull);
+  }
+
+  void test_parseCompilationUnitMember_function_type() {
+    FunctionDeclaration declaration = parse("parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()], "int f() {}");
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNull);
+  }
+
+  void test_parseCompilationUnitMember_function_void() {
+    FunctionDeclaration declaration = parse("parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()], "void f() {}");
+    expect(declaration.returnType, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_getter_external_noType() {
+    FunctionDeclaration declaration = parse("parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()], "external get p;");
+    expect(declaration.externalKeyword, isNotNull);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_getter_external_type() {
+    FunctionDeclaration declaration = parse("parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()], "external int get p;");
+    expect(declaration.externalKeyword, isNotNull);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_getter_noType() {
+    FunctionDeclaration declaration = parse("parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()], "get p => 0;");
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_getter_type() {
+    FunctionDeclaration declaration = parse("parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()], "int get p => 0;");
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_setter_external_noType() {
+    FunctionDeclaration declaration = parse("parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()], "external set p(v);");
+    expect(declaration.externalKeyword, isNotNull);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_setter_external_type() {
+    FunctionDeclaration declaration = parse("parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()], "external void set p(int v);");
+    expect(declaration.externalKeyword, isNotNull);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_setter_noType() {
+    FunctionDeclaration declaration = parse("parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()], "set p(v) {}");
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_setter_type() {
+    FunctionDeclaration declaration = parse("parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()], "void set p(int v) {}");
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
+    expect(declaration.returnType, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_typeAlias_abstract() {
+    ClassTypeAlias typeAlias = parse("parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()], "abstract class C = S with M;");
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name.name, "C");
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.equals, isNotNull);
+    expect(typeAlias.abstractKeyword, isNotNull);
+    expect(typeAlias.superclass.name.name, "S");
+    expect(typeAlias.withClause, isNotNull);
+    expect(typeAlias.implementsClause, isNull);
+    expect(typeAlias.semicolon, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_typeAlias_generic() {
+    ClassTypeAlias typeAlias = parse(
+        "parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()],
+        "class C<E> = S<E> with M<E> implements I<E>;");
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name.name, "C");
+    expect(typeAlias.typeParameters.typeParameters, hasLength(1));
+    expect(typeAlias.equals, isNotNull);
+    expect(typeAlias.abstractKeyword, isNull);
+    expect(typeAlias.superclass.name.name, "S");
+    expect(typeAlias.withClause, isNotNull);
+    expect(typeAlias.implementsClause, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_typeAlias_implements() {
+    ClassTypeAlias typeAlias = parse(
+        "parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()],
+        "class C = S with M implements I;");
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name.name, "C");
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.equals, isNotNull);
+    expect(typeAlias.abstractKeyword, isNull);
+    expect(typeAlias.superclass.name.name, "S");
+    expect(typeAlias.withClause, isNotNull);
+    expect(typeAlias.implementsClause, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_typeAlias_noImplements() {
+    ClassTypeAlias typeAlias = parse("parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()], "class C = S with M;");
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name.name, "C");
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.equals, isNotNull);
+    expect(typeAlias.abstractKeyword, isNull);
+    expect(typeAlias.superclass.name.name, "S");
+    expect(typeAlias.withClause, isNotNull);
+    expect(typeAlias.implementsClause, isNull);
+    expect(typeAlias.semicolon, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_typedef() {
+    FunctionTypeAlias typeAlias = parse("parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()], "typedef F();");
+    expect(typeAlias.name.name, "F");
+    expect(typeAlias.parameters.parameters, hasLength(0));
+  }
+
+  void test_parseCompilationUnitMember_variable() {
+    TopLevelVariableDeclaration declaration = parse(
+        "parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()],
+        "var x = 0;");
+    expect(declaration.semicolon, isNotNull);
+    expect(declaration.variables, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_variableGet() {
+    TopLevelVariableDeclaration declaration = parse(
+        "parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()],
+        "String get = null;");
+    expect(declaration.semicolon, isNotNull);
+    expect(declaration.variables, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_variableSet() {
+    TopLevelVariableDeclaration declaration = parse(
+        "parseCompilationUnitMember",
+        <Object>[emptyCommentAndMetadata()],
+        "String set = null;");
+    expect(declaration.semicolon, isNotNull);
+    expect(declaration.variables, isNotNull);
+  }
+
+  void test_parseConditionalExpression() {
+    ConditionalExpression expression =
+        parse4("parseConditionalExpression", "x ? y : z");
+    expect(expression.condition, isNotNull);
+    expect(expression.question, isNotNull);
+    expect(expression.thenExpression, isNotNull);
+    expect(expression.colon, isNotNull);
+    expect(expression.elseExpression, isNotNull);
+  }
+
+  void test_parseConstExpression_instanceCreation() {
+    InstanceCreationExpression expression =
+        parse4("parseConstExpression", "const A()");
+    expect(expression.keyword, isNotNull);
+    ConstructorName name = expression.constructorName;
+    expect(name, isNotNull);
+    expect(name.type, isNotNull);
+    expect(name.period, isNull);
+    expect(name.name, isNull);
+    expect(expression.argumentList, isNotNull);
+  }
+
+  void test_parseConstExpression_listLiteral_typed() {
+    ListLiteral literal = parse4("parseConstExpression", "const <A> []");
+    expect(literal.constKeyword, isNotNull);
+    expect(literal.typeArguments, isNotNull);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.elements, hasLength(0));
+    expect(literal.rightBracket, isNotNull);
+  }
+
+  void test_parseConstExpression_listLiteral_untyped() {
+    ListLiteral literal = parse4("parseConstExpression", "const []");
+    expect(literal.constKeyword, isNotNull);
+    expect(literal.typeArguments, isNull);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.elements, hasLength(0));
+    expect(literal.rightBracket, isNotNull);
+  }
+
+  void test_parseConstExpression_mapLiteral_typed() {
+    MapLiteral literal = parse4("parseConstExpression", "const <A, B> {}");
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.entries, hasLength(0));
+    expect(literal.rightBracket, isNotNull);
+    expect(literal.typeArguments, isNotNull);
+  }
+
+  void test_parseConstExpression_mapLiteral_untyped() {
+    MapLiteral literal = parse4("parseConstExpression", "const {}");
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.entries, hasLength(0));
+    expect(literal.rightBracket, isNotNull);
+    expect(literal.typeArguments, isNull);
+  }
+
+  void test_parseConstructor() {
+    // TODO(brianwilkerson) Implement tests for this method.
+//    parse("parseConstructor", new Class[] {Parser.CommentAndMetadata.class,
+//        Token.class, Token.class, SimpleIdentifier.class, Token.class,
+//        SimpleIdentifier.class, FormalParameterList.class}, new Object[] {emptyCommentAndMetadata(),
+//        null, null, null, null, null, null}, "");
+  }
+
+  void test_parseConstructor_with_pseudo_function_literal() {
+    // "(b) {}" should not be misinterpreted as a function literal even though
+    // it looks like one.
+    ClassMember classMember =
+        parse("parseClassMember", <Object>["C"], "C() : a = (b) {}");
+    EngineTestCase.assertInstanceOf((obj) => obj is ConstructorDeclaration,
+        ConstructorDeclaration, classMember);
+    ConstructorDeclaration constructor = classMember as ConstructorDeclaration;
+    NodeList<ConstructorInitializer> initializers = constructor.initializers;
+    expect(initializers, hasLength(1));
+    ConstructorInitializer initializer = initializers[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is ConstructorFieldInitializer,
+        ConstructorFieldInitializer, initializer);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ParenthesizedExpression,
+        ParenthesizedExpression,
+        (initializer as ConstructorFieldInitializer).expression);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is BlockFunctionBody, BlockFunctionBody, constructor.body);
+  }
+
+  void test_parseConstructorFieldInitializer_qualified() {
+    ConstructorFieldInitializer invocation =
+        parse4("parseConstructorFieldInitializer", "this.a = b");
+    expect(invocation.equals, isNotNull);
+    expect(invocation.expression, isNotNull);
+    expect(invocation.fieldName, isNotNull);
+    expect(invocation.thisKeyword, isNotNull);
+    expect(invocation.period, isNotNull);
+  }
+
+  void test_parseConstructorFieldInitializer_unqualified() {
+    ConstructorFieldInitializer invocation =
+        parse4("parseConstructorFieldInitializer", "a = b");
+    expect(invocation.equals, isNotNull);
+    expect(invocation.expression, isNotNull);
+    expect(invocation.fieldName, isNotNull);
+    expect(invocation.thisKeyword, isNull);
+    expect(invocation.period, isNull);
+  }
+
+  void test_parseConstructorName_named_noPrefix() {
+    ConstructorName name = parse4("parseConstructorName", "A.n;");
+    expect(name.type, isNotNull);
+    expect(name.period, isNull);
+    expect(name.name, isNull);
+  }
+
+  void test_parseConstructorName_named_prefixed() {
+    ConstructorName name = parse4("parseConstructorName", "p.A.n;");
+    expect(name.type, isNotNull);
+    expect(name.period, isNotNull);
+    expect(name.name, isNotNull);
+  }
+
+  void test_parseConstructorName_unnamed_noPrefix() {
+    ConstructorName name = parse4("parseConstructorName", "A;");
+    expect(name.type, isNotNull);
+    expect(name.period, isNull);
+    expect(name.name, isNull);
+  }
+
+  void test_parseConstructorName_unnamed_prefixed() {
+    ConstructorName name = parse4("parseConstructorName", "p.A;");
+    expect(name.type, isNotNull);
+    expect(name.period, isNull);
+    expect(name.name, isNull);
+  }
+
+  void test_parseContinueStatement_label() {
+    ContinueStatement statement = parse4("parseContinueStatement",
+        "continue foo;", [ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
+    expect(statement.continueKeyword, isNotNull);
+    expect(statement.label, isNotNull);
+    expect(statement.semicolon, isNotNull);
+  }
+
+  void test_parseContinueStatement_noLabel() {
+    ContinueStatement statement = parse4("parseContinueStatement", "continue;",
+        [ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
+    expect(statement.continueKeyword, isNotNull);
+    expect(statement.label, isNull);
+    expect(statement.semicolon, isNotNull);
+  }
+
+  void test_parseDirective_export() {
+    ExportDirective directive = parse("parseDirective",
+        <Object>[emptyCommentAndMetadata()], "export 'lib/lib.dart';");
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.combinators, hasLength(0));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseDirective_import() {
+    ImportDirective directive = parse("parseDirective",
+        <Object>[emptyCommentAndMetadata()], "import 'lib/lib.dart';");
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.asKeyword, isNull);
+    expect(directive.prefix, isNull);
+    expect(directive.combinators, hasLength(0));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseDirective_library() {
+    LibraryDirective directive = parse(
+        "parseDirective", <Object>[emptyCommentAndMetadata()], "library l;");
+    expect(directive.libraryKeyword, isNotNull);
+    expect(directive.name, isNotNull);
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseDirective_part() {
+    PartDirective directive = parse("parseDirective",
+        <Object>[emptyCommentAndMetadata()], "part 'lib/lib.dart';");
+    expect(directive.partKeyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseDirective_partOf() {
+    PartOfDirective directive = parse(
+        "parseDirective", <Object>[emptyCommentAndMetadata()], "part of l;");
+    expect(directive.partKeyword, isNotNull);
+    expect(directive.ofKeyword, isNotNull);
+    expect(directive.libraryName, isNotNull);
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseDirectives_complete() {
+    CompilationUnit unit =
+        _parseDirectives("#! /bin/dart\nlibrary l;\nclass A {}");
+    expect(unit.scriptTag, isNotNull);
+    expect(unit.directives, hasLength(1));
+  }
+
+  void test_parseDirectives_empty() {
+    CompilationUnit unit = _parseDirectives("");
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+  }
+
+  void test_parseDirectives_mixed() {
+    CompilationUnit unit =
+        _parseDirectives("library l; class A {} part 'foo.dart';");
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(1));
+  }
+
+  void test_parseDirectives_multiple() {
+    CompilationUnit unit = _parseDirectives("library l;\npart 'a.dart';");
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(2));
+  }
+
+  void test_parseDirectives_script() {
+    CompilationUnit unit = _parseDirectives("#! /bin/dart");
+    expect(unit.scriptTag, isNotNull);
+    expect(unit.directives, hasLength(0));
+  }
+
+  void test_parseDirectives_single() {
+    CompilationUnit unit = _parseDirectives("library l;");
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(1));
+  }
+
+  void test_parseDirectives_topLevelDeclaration() {
+    CompilationUnit unit = _parseDirectives("class A {}");
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+  }
+
+  void test_parseDocumentationComment_block() {
+    Comment comment = parse4("parseDocumentationComment", "/** */ class");
+    expect(comment.isBlock, isFalse);
+    expect(comment.isDocumentation, isTrue);
+    expect(comment.isEndOfLine, isFalse);
+  }
+
+  void test_parseDocumentationComment_block_withReference() {
+    Comment comment = parse4("parseDocumentationComment", "/** [a] */ class");
+    expect(comment.isBlock, isFalse);
+    expect(comment.isDocumentation, isTrue);
+    expect(comment.isEndOfLine, isFalse);
+    NodeList<CommentReference> references = comment.references;
+    expect(references, hasLength(1));
+    CommentReference reference = references[0];
+    expect(reference, isNotNull);
+    expect(reference.offset, 5);
+  }
+
+  void test_parseDocumentationComment_endOfLine() {
+    Comment comment = parse4("parseDocumentationComment", "/// \n/// \n class");
+    expect(comment.isBlock, isFalse);
+    expect(comment.isDocumentation, isTrue);
+    expect(comment.isEndOfLine, isFalse);
+  }
+
+  void test_parseDoStatement() {
+    DoStatement statement = parse4("parseDoStatement", "do {} while (x);");
+    expect(statement.doKeyword, isNotNull);
+    expect(statement.body, isNotNull);
+    expect(statement.whileKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.semicolon, isNotNull);
+  }
+
+  void test_parseEmptyStatement() {
+    EmptyStatement statement = parse4("parseEmptyStatement", ";");
+    expect(statement.semicolon, isNotNull);
+  }
+
+  void test_parseEnumDeclaration_one() {
+    EnumDeclaration declaration = parse("parseEnumDeclaration",
+        <Object>[emptyCommentAndMetadata()], "enum E {ONE}");
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.enumKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.constants, hasLength(1));
+    expect(declaration.rightBracket, isNotNull);
+  }
+
+  void test_parseEnumDeclaration_trailingComma() {
+    EnumDeclaration declaration = parse("parseEnumDeclaration",
+        <Object>[emptyCommentAndMetadata()], "enum E {ONE,}");
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.enumKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.constants, hasLength(1));
+    expect(declaration.rightBracket, isNotNull);
+  }
+
+  void test_parseEnumDeclaration_two() {
+    EnumDeclaration declaration = parse("parseEnumDeclaration",
+        <Object>[emptyCommentAndMetadata()], "enum E {ONE, TWO}");
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.enumKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.constants, hasLength(2));
+    expect(declaration.rightBracket, isNotNull);
+  }
+
+  void test_parseEqualityExpression_normal() {
+    BinaryExpression expression = parse4("parseEqualityExpression", "x == y");
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.EQ_EQ);
+    expect(expression.rightOperand, isNotNull);
+  }
+
+  void test_parseEqualityExpression_super() {
+    BinaryExpression expression =
+        parse4("parseEqualityExpression", "super == y");
+    EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression,
+        SuperExpression, expression.leftOperand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.EQ_EQ);
+    expect(expression.rightOperand, isNotNull);
+  }
+
+  void test_parseExportDirective_hide() {
+    ExportDirective directive = parse(
+        "parseExportDirective",
+        <Object>[emptyCommentAndMetadata()],
+        "export 'lib/lib.dart' hide A, B;");
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.combinators, hasLength(1));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseExportDirective_hide_show() {
+    ExportDirective directive = parse(
+        "parseExportDirective",
+        <Object>[emptyCommentAndMetadata()],
+        "export 'lib/lib.dart' hide A show B;");
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.combinators, hasLength(2));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseExportDirective_noCombinator() {
+    ExportDirective directive = parse("parseExportDirective",
+        <Object>[emptyCommentAndMetadata()], "export 'lib/lib.dart';");
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.combinators, hasLength(0));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseExportDirective_show() {
+    ExportDirective directive = parse(
+        "parseExportDirective",
+        <Object>[emptyCommentAndMetadata()],
+        "export 'lib/lib.dart' show A, B;");
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.combinators, hasLength(1));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseExportDirective_show_hide() {
+    ExportDirective directive = parse(
+        "parseExportDirective",
+        <Object>[emptyCommentAndMetadata()],
+        "export 'lib/lib.dart' show B hide A;");
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.combinators, hasLength(2));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseExpression_assign() {
+    // TODO(brianwilkerson) Implement more tests for this method.
+    AssignmentExpression expression = parse4("parseExpression", "x = y");
+    expect(expression.leftHandSide, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.EQ);
+    expect(expression.rightHandSide, isNotNull);
+  }
+
+  void test_parseExpression_comparison() {
+    BinaryExpression expression = parse4("parseExpression", "--a.b == c");
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.EQ_EQ);
+    expect(expression.rightOperand, isNotNull);
+  }
+
+  void test_parseExpression_function_async() {
+    FunctionExpression expression = parseExpression("() async {}");
+    expect(expression.body, isNotNull);
+    expect(expression.body.isAsynchronous, isTrue);
+    expect(expression.body.isGenerator, isFalse);
+    expect(expression.parameters, isNotNull);
+  }
+
+  void test_parseExpression_function_asyncStar() {
+    FunctionExpression expression = parseExpression("() async* {}");
+    expect(expression.body, isNotNull);
+    expect(expression.body.isAsynchronous, isTrue);
+    expect(expression.body.isGenerator, isTrue);
+    expect(expression.parameters, isNotNull);
+  }
+
+  void test_parseExpression_function_sync() {
+    FunctionExpression expression = parseExpression("() {}");
+    expect(expression.body, isNotNull);
+    expect(expression.body.isAsynchronous, isFalse);
+    expect(expression.body.isGenerator, isFalse);
+    expect(expression.parameters, isNotNull);
+  }
+
+  void test_parseExpression_function_syncStar() {
+    FunctionExpression expression = parseExpression("() sync* {}");
+    expect(expression.body, isNotNull);
+    expect(expression.body.isAsynchronous, isFalse);
+    expect(expression.body.isGenerator, isTrue);
+    expect(expression.parameters, isNotNull);
+  }
+
+  void test_parseExpression_invokeFunctionExpression() {
+    FunctionExpressionInvocation invocation =
+        parse4("parseExpression", "(a) {return a + a;} (3)");
+    EngineTestCase.assertInstanceOf((obj) => obj is FunctionExpression,
+        FunctionExpression, invocation.function);
+    FunctionExpression expression = invocation.function as FunctionExpression;
+    expect(expression.parameters, isNotNull);
+    expect(expression.body, isNotNull);
+    expect(invocation.typeArguments, isNull);
+    ArgumentList list = invocation.argumentList;
+    expect(list, isNotNull);
+    expect(list.arguments, hasLength(1));
+  }
+
+  void test_parseExpression_nonAwait() {
+    MethodInvocation expression = parseExpression("await()");
+    expect(expression.methodName.name, 'await');
+    expect(expression.typeArguments, isNull);
+    expect(expression.argumentList, isNotNull);
+  }
+
+  void test_parseExpression_superMethodInvocation() {
+    MethodInvocation invocation = parse4("parseExpression", "super.m()");
+    expect(invocation.target, isNotNull);
+    expect(invocation.methodName, isNotNull);
+    expect(invocation.typeArguments, isNull);
+    expect(invocation.argumentList, isNotNull);
+  }
+
+  void test_parseExpression_superMethodInvocation_typeArguments() {
+    enableGenericMethods = true;
+    MethodInvocation invocation = parse4("parseExpression", "super.m<E>()");
+    expect(invocation.target, isNotNull);
+    expect(invocation.methodName, isNotNull);
+    expect(invocation.typeArguments, isNotNull);
+    expect(invocation.argumentList, isNotNull);
+  }
+
+  void test_parseExpressionList_multiple() {
+    List<Expression> result = parse4("parseExpressionList", "1, 2, 3");
+    expect(result, hasLength(3));
+  }
+
+  void test_parseExpressionList_single() {
+    List<Expression> result = parse4("parseExpressionList", "1");
+    expect(result, hasLength(1));
+  }
+
+  void test_parseExpressionWithoutCascade_assign() {
+    // TODO(brianwilkerson) Implement more tests for this method.
+    AssignmentExpression expression =
+        parse4("parseExpressionWithoutCascade", "x = y");
+    expect(expression.leftHandSide, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.EQ);
+    expect(expression.rightHandSide, isNotNull);
+  }
+
+  void test_parseExpressionWithoutCascade_comparison() {
+    BinaryExpression expression =
+        parse4("parseExpressionWithoutCascade", "--a.b == c");
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.EQ_EQ);
+    expect(expression.rightOperand, isNotNull);
+  }
+
+  void test_parseExpressionWithoutCascade_superMethodInvocation() {
+    MethodInvocation invocation =
+        parse4("parseExpressionWithoutCascade", "super.m()");
+    expect(invocation.target, isNotNull);
+    expect(invocation.methodName, isNotNull);
+    expect(invocation.typeArguments, isNull);
+    expect(invocation.argumentList, isNotNull);
+  }
+
+  void test_parseExpressionWithoutCascade_superMethodInvocation_typeArguments() {
+    enableGenericMethods = true;
+    MethodInvocation invocation =
+        parse4("parseExpressionWithoutCascade", "super.m<E>()");
+    expect(invocation.target, isNotNull);
+    expect(invocation.methodName, isNotNull);
+    expect(invocation.typeArguments, isNotNull);
+    expect(invocation.argumentList, isNotNull);
+  }
+
+  void test_parseExtendsClause() {
+    ExtendsClause clause = parse4("parseExtendsClause", "extends B");
+    expect(clause.extendsKeyword, isNotNull);
+    expect(clause.superclass, isNotNull);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is TypeName, TypeName, clause.superclass);
+  }
+
+  void test_parseFinalConstVarOrType_const_noType() {
+    FinalConstVarOrType result =
+        parse("parseFinalConstVarOrType", <Object>[false], "const");
+    Token keyword = result.keyword;
+    expect(keyword, isNotNull);
+    expect(keyword.type, TokenType.KEYWORD);
+    expect((keyword as KeywordToken).keyword, Keyword.CONST);
+    expect(result.type, isNull);
+  }
+
+  void test_parseFinalConstVarOrType_const_type() {
+    FinalConstVarOrType result =
+        parse("parseFinalConstVarOrType", <Object>[false], "const A a");
+    Token keyword = result.keyword;
+    expect(keyword, isNotNull);
+    expect(keyword.type, TokenType.KEYWORD);
+    expect((keyword as KeywordToken).keyword, Keyword.CONST);
+    expect(result.type, isNotNull);
+  }
+
+  void test_parseFinalConstVarOrType_final_noType() {
+    FinalConstVarOrType result =
+        parse("parseFinalConstVarOrType", <Object>[false], "final");
+    Token keyword = result.keyword;
+    expect(keyword, isNotNull);
+    expect(keyword.type, TokenType.KEYWORD);
+    expect((keyword as KeywordToken).keyword, Keyword.FINAL);
+    expect(result.type, isNull);
+  }
+
+  void test_parseFinalConstVarOrType_final_prefixedType() {
+    FinalConstVarOrType result =
+        parse("parseFinalConstVarOrType", <Object>[false], "final p.A a");
+    Token keyword = result.keyword;
+    expect(keyword, isNotNull);
+    expect(keyword.type, TokenType.KEYWORD);
+    expect((keyword as KeywordToken).keyword, Keyword.FINAL);
+    expect(result.type, isNotNull);
+  }
+
+  void test_parseFinalConstVarOrType_final_type() {
+    FinalConstVarOrType result =
+        parse("parseFinalConstVarOrType", <Object>[false], "final A a");
+    Token keyword = result.keyword;
+    expect(keyword, isNotNull);
+    expect(keyword.type, TokenType.KEYWORD);
+    expect((keyword as KeywordToken).keyword, Keyword.FINAL);
+    expect(result.type, isNotNull);
+  }
+
+  void test_parseFinalConstVarOrType_type_parameterized() {
+    FinalConstVarOrType result =
+        parse("parseFinalConstVarOrType", <Object>[false], "A<B> a");
+    expect(result.keyword, isNull);
+    expect(result.type, isNotNull);
+  }
+
+  void test_parseFinalConstVarOrType_type_prefixed() {
+    FinalConstVarOrType result =
+        parse("parseFinalConstVarOrType", <Object>[false], "p.A a");
+    expect(result.keyword, isNull);
+    expect(result.type, isNotNull);
+  }
+
+  void test_parseFinalConstVarOrType_type_prefixed_noIdentifier() {
+    FinalConstVarOrType result =
+        parse("parseFinalConstVarOrType", <Object>[false], "p.A,");
+    expect(result.keyword, isNull);
+    expect(result.type, isNotNull);
+  }
+
+  void test_parseFinalConstVarOrType_type_prefixedAndParameterized() {
+    FinalConstVarOrType result =
+        parse("parseFinalConstVarOrType", <Object>[false], "p.A<B> a");
+    expect(result.keyword, isNull);
+    expect(result.type, isNotNull);
+  }
+
+  void test_parseFinalConstVarOrType_type_simple() {
+    FinalConstVarOrType result =
+        parse("parseFinalConstVarOrType", <Object>[false], "A a");
+    expect(result.keyword, isNull);
+    expect(result.type, isNotNull);
+  }
+
+  void test_parseFinalConstVarOrType_var() {
+    FinalConstVarOrType result =
+        parse("parseFinalConstVarOrType", <Object>[false], "var");
+    Token keyword = result.keyword;
+    expect(keyword, isNotNull);
+    expect(keyword.type, TokenType.KEYWORD);
+    expect((keyword as KeywordToken).keyword, Keyword.VAR);
+    expect(result.type, isNull);
+  }
+
+  void test_parseFinalConstVarOrType_void() {
+    FinalConstVarOrType result =
+        parse("parseFinalConstVarOrType", <Object>[false], "void f()");
+    expect(result.keyword, isNull);
+    expect(result.type, isNotNull);
+  }
+
+  void test_parseFinalConstVarOrType_void_noIdentifier() {
+    FinalConstVarOrType result =
+        parse("parseFinalConstVarOrType", <Object>[false], "void,");
+    expect(result.keyword, isNull);
+    expect(result.type, isNotNull);
+  }
+
+  void test_parseFormalParameter_final_withType_named() {
+    ParameterKind kind = ParameterKind.NAMED;
+    DefaultFormalParameter parameter =
+        parse("parseFormalParameter", <Object>[kind], "final A a : null");
+    SimpleFormalParameter simpleParameter =
+        parameter.parameter as SimpleFormalParameter;
+    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.keyword, isNotNull);
+    expect(simpleParameter.type, isNotNull);
+    expect(simpleParameter.kind, kind);
+    expect(parameter.separator, isNotNull);
+    expect(parameter.defaultValue, isNotNull);
+    expect(parameter.kind, kind);
+  }
+
+  void test_parseFormalParameter_final_withType_normal() {
+    ParameterKind kind = ParameterKind.REQUIRED;
+    SimpleFormalParameter parameter =
+        parse("parseFormalParameter", <Object>[kind], "final A a");
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNotNull);
+    expect(parameter.kind, kind);
+  }
+
+  void test_parseFormalParameter_final_withType_positional() {
+    ParameterKind kind = ParameterKind.POSITIONAL;
+    DefaultFormalParameter parameter =
+        parse("parseFormalParameter", <Object>[kind], "final A a = null");
+    SimpleFormalParameter simpleParameter =
+        parameter.parameter as SimpleFormalParameter;
+    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.keyword, isNotNull);
+    expect(simpleParameter.type, isNotNull);
+    expect(simpleParameter.kind, kind);
+    expect(parameter.separator, isNotNull);
+    expect(parameter.defaultValue, isNotNull);
+    expect(parameter.kind, kind);
+  }
+
+  void test_parseFormalParameter_nonFinal_withType_named() {
+    ParameterKind kind = ParameterKind.NAMED;
+    DefaultFormalParameter parameter =
+        parse("parseFormalParameter", <Object>[kind], "A a : null");
+    SimpleFormalParameter simpleParameter =
+        parameter.parameter as SimpleFormalParameter;
+    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.keyword, isNull);
+    expect(simpleParameter.type, isNotNull);
+    expect(simpleParameter.kind, kind);
+    expect(parameter.separator, isNotNull);
+    expect(parameter.defaultValue, isNotNull);
+    expect(parameter.kind, kind);
+  }
+
+  void test_parseFormalParameter_nonFinal_withType_normal() {
+    ParameterKind kind = ParameterKind.REQUIRED;
+    SimpleFormalParameter parameter =
+        parse("parseFormalParameter", <Object>[kind], "A a");
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.keyword, isNull);
+    expect(parameter.type, isNotNull);
+    expect(parameter.kind, kind);
+  }
+
+  void test_parseFormalParameter_nonFinal_withType_positional() {
+    ParameterKind kind = ParameterKind.POSITIONAL;
+    DefaultFormalParameter parameter =
+        parse("parseFormalParameter", <Object>[kind], "A a = null");
+    SimpleFormalParameter simpleParameter =
+        parameter.parameter as SimpleFormalParameter;
+    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.keyword, isNull);
+    expect(simpleParameter.type, isNotNull);
+    expect(simpleParameter.kind, kind);
+    expect(parameter.separator, isNotNull);
+    expect(parameter.defaultValue, isNotNull);
+    expect(parameter.kind, kind);
+  }
+
+  void test_parseFormalParameter_var() {
+    ParameterKind kind = ParameterKind.REQUIRED;
+    SimpleFormalParameter parameter =
+        parse("parseFormalParameter", <Object>[kind], "var a");
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNull);
+    expect(parameter.kind, kind);
+  }
+
+  void test_parseFormalParameter_var_named() {
+    ParameterKind kind = ParameterKind.NAMED;
+    DefaultFormalParameter parameter =
+        parse("parseFormalParameter", <Object>[kind], "var a : null");
+    SimpleFormalParameter simpleParameter =
+        parameter.parameter as SimpleFormalParameter;
+    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.keyword, isNotNull);
+    expect(simpleParameter.type, isNull);
+    expect(simpleParameter.kind, kind);
+    expect(parameter.separator, isNotNull);
+    expect(parameter.defaultValue, isNotNull);
+    expect(parameter.kind, kind);
+  }
+
+  void test_parseFormalParameter_var_positional() {
+    ParameterKind kind = ParameterKind.POSITIONAL;
+    DefaultFormalParameter parameter =
+        parse("parseFormalParameter", <Object>[kind], "var a = null");
+    SimpleFormalParameter simpleParameter =
+        parameter.parameter as SimpleFormalParameter;
+    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.keyword, isNotNull);
+    expect(simpleParameter.type, isNull);
+    expect(simpleParameter.kind, kind);
+    expect(parameter.separator, isNotNull);
+    expect(parameter.defaultValue, isNotNull);
+    expect(parameter.kind, kind);
+  }
+
+  void test_parseFormalParameterList_empty() {
+    FormalParameterList parameterList =
+        parse4("parseFormalParameterList", "()");
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNull);
+    expect(parameterList.parameters, hasLength(0));
+    expect(parameterList.rightDelimiter, isNull);
+    expect(parameterList.rightParenthesis, isNotNull);
+  }
+
+  void test_parseFormalParameterList_named_multiple() {
+    FormalParameterList parameterList =
+        parse4("parseFormalParameterList", "({A a : 1, B b, C c : 3})");
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNotNull);
+    expect(parameterList.parameters, hasLength(3));
+    expect(parameterList.rightDelimiter, isNotNull);
+    expect(parameterList.rightParenthesis, isNotNull);
+  }
+
+  void test_parseFormalParameterList_named_single() {
+    FormalParameterList parameterList =
+        parse4("parseFormalParameterList", "({A a})");
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNotNull);
+    expect(parameterList.parameters, hasLength(1));
+    expect(parameterList.rightDelimiter, isNotNull);
+    expect(parameterList.rightParenthesis, isNotNull);
+  }
+
+  void test_parseFormalParameterList_normal_multiple() {
+    FormalParameterList parameterList =
+        parse4("parseFormalParameterList", "(A a, B b, C c)");
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNull);
+    expect(parameterList.parameters, hasLength(3));
+    expect(parameterList.rightDelimiter, isNull);
+    expect(parameterList.rightParenthesis, isNotNull);
+  }
+
+  void test_parseFormalParameterList_normal_named() {
+    FormalParameterList parameterList =
+        parse4("parseFormalParameterList", "(A a, {B b})");
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNotNull);
+    expect(parameterList.parameters, hasLength(2));
+    expect(parameterList.rightDelimiter, isNotNull);
+    expect(parameterList.rightParenthesis, isNotNull);
+  }
+
+  void test_parseFormalParameterList_normal_positional() {
+    FormalParameterList parameterList =
+        parse4("parseFormalParameterList", "(A a, [B b])");
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNotNull);
+    expect(parameterList.parameters, hasLength(2));
+    expect(parameterList.rightDelimiter, isNotNull);
+    expect(parameterList.rightParenthesis, isNotNull);
+  }
+
+  void test_parseFormalParameterList_normal_single() {
+    FormalParameterList parameterList =
+        parse4("parseFormalParameterList", "(A a)");
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNull);
+    expect(parameterList.parameters, hasLength(1));
+    expect(parameterList.rightDelimiter, isNull);
+    expect(parameterList.rightParenthesis, isNotNull);
+  }
+
+  void test_parseFormalParameterList_positional_multiple() {
+    FormalParameterList parameterList =
+        parse4("parseFormalParameterList", "([A a = null, B b, C c = null])");
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNotNull);
+    expect(parameterList.parameters, hasLength(3));
+    expect(parameterList.rightDelimiter, isNotNull);
+    expect(parameterList.rightParenthesis, isNotNull);
+  }
+
+  void test_parseFormalParameterList_positional_single() {
+    FormalParameterList parameterList =
+        parse4("parseFormalParameterList", "([A a = null])");
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNotNull);
+    expect(parameterList.parameters, hasLength(1));
+    expect(parameterList.rightDelimiter, isNotNull);
+    expect(parameterList.rightParenthesis, isNotNull);
+  }
+
+  void test_parseFormalParameterList_prefixedType() {
+    FormalParameterList parameterList =
+        parse4("parseFormalParameterList", "(io.File f)");
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNull);
+    expect(parameterList.parameters, hasLength(1));
+    expect(parameterList.parameters[0].toSource(), 'io.File f');
+    expect(parameterList.rightDelimiter, isNull);
+    expect(parameterList.rightParenthesis, isNotNull);
+  }
+
+  void test_parseFormalParameterList_prefixedType_partial() {
+    FormalParameterList parameterList = parse4(
+        "parseFormalParameterList", "(io.)", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNull);
+    expect(parameterList.parameters, hasLength(1));
+    expect(parameterList.parameters[0].toSource(), 'io. ');
+    expect(parameterList.rightDelimiter, isNull);
+    expect(parameterList.rightParenthesis, isNotNull);
+  }
+
+  void test_parseFormalParameterList_prefixedType_partial2() {
+    FormalParameterList parameterList = parse4(
+        "parseFormalParameterList", "(io.,a)", [
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNull);
+    expect(parameterList.parameters, hasLength(2));
+    expect(parameterList.parameters[0].toSource(), 'io. ');
+    expect(parameterList.parameters[1].toSource(), 'a');
+    expect(parameterList.rightDelimiter, isNull);
+    expect(parameterList.rightParenthesis, isNotNull);
+  }
+
+  void test_parseForStatement_each_await() {
+    ForEachStatement statement =
+        parse4("parseForStatement", "await for (element in list) {}");
+    expect(statement.awaitKeyword, isNotNull);
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.loopVariable, isNull);
+    expect(statement.identifier, isNotNull);
+    expect(statement.inKeyword, isNotNull);
+    expect(statement.iterable, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
+  }
+
+  void test_parseForStatement_each_identifier() {
+    ForEachStatement statement =
+        parse4("parseForStatement", "for (element in list) {}");
+    expect(statement.awaitKeyword, isNull);
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.loopVariable, isNull);
+    expect(statement.identifier, isNotNull);
+    expect(statement.inKeyword, isNotNull);
+    expect(statement.iterable, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
+  }
+
+  void test_parseForStatement_each_noType_metadata() {
+    ForEachStatement statement =
+        parse4("parseForStatement", "for (@A var element in list) {}");
+    expect(statement.awaitKeyword, isNull);
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.loopVariable, isNotNull);
+    expect(statement.loopVariable.metadata, hasLength(1));
+    expect(statement.identifier, isNull);
+    expect(statement.inKeyword, isNotNull);
+    expect(statement.iterable, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
+  }
+
+  void test_parseForStatement_each_type() {
+    ForEachStatement statement =
+        parse4("parseForStatement", "for (A element in list) {}");
+    expect(statement.awaitKeyword, isNull);
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.loopVariable, isNotNull);
+    expect(statement.identifier, isNull);
+    expect(statement.inKeyword, isNotNull);
+    expect(statement.iterable, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
+  }
+
+  void test_parseForStatement_each_var() {
+    ForEachStatement statement =
+        parse4("parseForStatement", "for (var element in list) {}");
+    expect(statement.awaitKeyword, isNull);
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.loopVariable, isNotNull);
+    expect(statement.identifier, isNull);
+    expect(statement.inKeyword, isNotNull);
+    expect(statement.iterable, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
+  }
+
+  void test_parseForStatement_loop_c() {
+    ForStatement statement =
+        parse4("parseForStatement", "for (; i < count;) {}");
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.variables, isNull);
+    expect(statement.initialization, isNull);
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.updaters, hasLength(0));
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
+  }
+
+  void test_parseForStatement_loop_cu() {
+    ForStatement statement =
+        parse4("parseForStatement", "for (; i < count; i++) {}");
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.variables, isNull);
+    expect(statement.initialization, isNull);
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.updaters, hasLength(1));
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
+  }
+
+  void test_parseForStatement_loop_ecu() {
+    ForStatement statement =
+        parse4("parseForStatement", "for (i--; i < count; i++) {}");
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.variables, isNull);
+    expect(statement.initialization, isNotNull);
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.updaters, hasLength(1));
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
+  }
+
+  void test_parseForStatement_loop_i() {
+    ForStatement statement =
+        parse4("parseForStatement", "for (var i = 0;;) {}");
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    VariableDeclarationList variables = statement.variables;
+    expect(variables, isNotNull);
+    expect(variables.metadata, hasLength(0));
+    expect(variables.variables, hasLength(1));
+    expect(statement.initialization, isNull);
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.condition, isNull);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.updaters, hasLength(0));
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
+  }
+
+  void test_parseForStatement_loop_i_withMetadata() {
+    ForStatement statement =
+        parse4("parseForStatement", "for (@A var i = 0;;) {}");
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    VariableDeclarationList variables = statement.variables;
+    expect(variables, isNotNull);
+    expect(variables.metadata, hasLength(1));
+    expect(variables.variables, hasLength(1));
+    expect(statement.initialization, isNull);
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.condition, isNull);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.updaters, hasLength(0));
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
+  }
+
+  void test_parseForStatement_loop_ic() {
+    ForStatement statement =
+        parse4("parseForStatement", "for (var i = 0; i < count;) {}");
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    VariableDeclarationList variables = statement.variables;
+    expect(variables, isNotNull);
+    expect(variables.variables, hasLength(1));
+    expect(statement.initialization, isNull);
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.updaters, hasLength(0));
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
+  }
+
+  void test_parseForStatement_loop_icu() {
+    ForStatement statement =
+        parse4("parseForStatement", "for (var i = 0; i < count; i++) {}");
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    VariableDeclarationList variables = statement.variables;
+    expect(variables, isNotNull);
+    expect(variables.variables, hasLength(1));
+    expect(statement.initialization, isNull);
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.updaters, hasLength(1));
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
+  }
+
+  void test_parseForStatement_loop_iicuu() {
+    ForStatement statement = parse4(
+        "parseForStatement", "for (int i = 0, j = count; i < j; i++, j--) {}");
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    VariableDeclarationList variables = statement.variables;
+    expect(variables, isNotNull);
+    expect(variables.variables, hasLength(2));
+    expect(statement.initialization, isNull);
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.updaters, hasLength(2));
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
+  }
+
+  void test_parseForStatement_loop_iu() {
+    ForStatement statement =
+        parse4("parseForStatement", "for (var i = 0;; i++) {}");
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    VariableDeclarationList variables = statement.variables;
+    expect(variables, isNotNull);
+    expect(variables.variables, hasLength(1));
+    expect(statement.initialization, isNull);
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.condition, isNull);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.updaters, hasLength(1));
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
+  }
+
+  void test_parseForStatement_loop_u() {
+    ForStatement statement = parse4("parseForStatement", "for (;; i++) {}");
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.variables, isNull);
+    expect(statement.initialization, isNull);
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.condition, isNull);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.updaters, hasLength(1));
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
+  }
+
+  void test_parseFunctionBody_block() {
+    BlockFunctionBody functionBody =
+        parse("parseFunctionBody", <Object>[false, null, false], "{}");
+    expect(functionBody.keyword, isNull);
+    expect(functionBody.star, isNull);
+    expect(functionBody.block, isNotNull);
+    expect(functionBody.isAsynchronous, isFalse);
+    expect(functionBody.isGenerator, isFalse);
+    expect(functionBody.isSynchronous, isTrue);
+  }
+
+  void test_parseFunctionBody_block_async() {
+    BlockFunctionBody functionBody =
+        parse("parseFunctionBody", <Object>[false, null, false], "async {}");
+    expect(functionBody.keyword, isNotNull);
+    expect(functionBody.keyword.lexeme, Parser.ASYNC);
+    expect(functionBody.star, isNull);
+    expect(functionBody.block, isNotNull);
+    expect(functionBody.isAsynchronous, isTrue);
+    expect(functionBody.isGenerator, isFalse);
+    expect(functionBody.isSynchronous, isFalse);
+  }
+
+  void test_parseFunctionBody_block_asyncGenerator() {
+    BlockFunctionBody functionBody =
+        parse("parseFunctionBody", <Object>[false, null, false], "async* {}");
+    expect(functionBody.keyword, isNotNull);
+    expect(functionBody.keyword.lexeme, Parser.ASYNC);
+    expect(functionBody.star, isNotNull);
+    expect(functionBody.block, isNotNull);
+    expect(functionBody.isAsynchronous, isTrue);
+    expect(functionBody.isGenerator, isTrue);
+    expect(functionBody.isSynchronous, isFalse);
+  }
+
+  void test_parseFunctionBody_block_syncGenerator() {
+    BlockFunctionBody functionBody =
+        parse("parseFunctionBody", <Object>[false, null, false], "sync* {}");
+    expect(functionBody.keyword, isNotNull);
+    expect(functionBody.keyword.lexeme, Parser.SYNC);
+    expect(functionBody.star, isNotNull);
+    expect(functionBody.block, isNotNull);
+    expect(functionBody.isAsynchronous, isFalse);
+    expect(functionBody.isGenerator, isTrue);
+    expect(functionBody.isSynchronous, isTrue);
+  }
+
+  void test_parseFunctionBody_empty() {
+    EmptyFunctionBody functionBody =
+        parse("parseFunctionBody", <Object>[true, null, false], ";");
+    expect(functionBody.semicolon, isNotNull);
+  }
+
+  void test_parseFunctionBody_expression() {
+    ExpressionFunctionBody functionBody =
+        parse("parseFunctionBody", <Object>[false, null, false], "=> y;");
+    expect(functionBody.keyword, isNull);
+    expect(functionBody.functionDefinition, isNotNull);
+    expect(functionBody.expression, isNotNull);
+    expect(functionBody.semicolon, isNotNull);
+    expect(functionBody.isAsynchronous, isFalse);
+    expect(functionBody.isGenerator, isFalse);
+    expect(functionBody.isSynchronous, isTrue);
+  }
+
+  void test_parseFunctionBody_expression_async() {
+    ExpressionFunctionBody functionBody =
+        parse("parseFunctionBody", <Object>[false, null, false], "async => y;");
+    expect(functionBody.keyword, isNotNull);
+    expect(functionBody.keyword.lexeme, Parser.ASYNC);
+    expect(functionBody.functionDefinition, isNotNull);
+    expect(functionBody.expression, isNotNull);
+    expect(functionBody.semicolon, isNotNull);
+    expect(functionBody.isAsynchronous, isTrue);
+    expect(functionBody.isGenerator, isFalse);
+    expect(functionBody.isSynchronous, isFalse);
+  }
+
+  void test_parseFunctionBody_nativeFunctionBody() {
+    NativeFunctionBody functionBody = parse(
+        "parseFunctionBody", <Object>[false, null, false], "native 'str';");
+    expect(functionBody.nativeKeyword, isNotNull);
+    expect(functionBody.stringLiteral, isNotNull);
+    expect(functionBody.semicolon, isNotNull);
+  }
+
+  void test_parseFunctionBody_skip_block() {
+    ParserTestCase.parseFunctionBodies = false;
+    FunctionBody functionBody =
+        parse("parseFunctionBody", <Object>[false, null, false], "{}");
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is EmptyFunctionBody, EmptyFunctionBody, functionBody);
+  }
+
+  void test_parseFunctionBody_skip_block_invalid() {
+    ParserTestCase.parseFunctionBodies = false;
+    FunctionBody functionBody = parse3("parseFunctionBody",
+        <Object>[false, null, false], "{", [ParserErrorCode.EXPECTED_TOKEN]);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is EmptyFunctionBody, EmptyFunctionBody, functionBody);
+  }
+
+  void test_parseFunctionBody_skip_blocks() {
+    ParserTestCase.parseFunctionBodies = false;
+    FunctionBody functionBody =
+        parse("parseFunctionBody", <Object>[false, null, false], "{ {} }");
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is EmptyFunctionBody, EmptyFunctionBody, functionBody);
+  }
+
+  void test_parseFunctionBody_skip_expression() {
+    ParserTestCase.parseFunctionBodies = false;
+    FunctionBody functionBody =
+        parse("parseFunctionBody", <Object>[false, null, false], "=> y;");
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is EmptyFunctionBody, EmptyFunctionBody, functionBody);
+  }
+
+  void test_parseFunctionDeclaration_function() {
+    Comment comment = Comment.createDocumentationComment(new List<Token>(0));
+    TypeName returnType = new TypeName(new SimpleIdentifier(null), null);
+    FunctionDeclaration declaration = parse("parseFunctionDeclaration",
+        <Object>[commentAndMetadata(comment), null, returnType], "f() {}");
+    expect(declaration.documentationComment, comment);
+    expect(declaration.returnType, returnType);
+    expect(declaration.name, isNotNull);
+    FunctionExpression expression = declaration.functionExpression;
+    expect(expression, isNotNull);
+    expect(expression.body, isNotNull);
+    expect(expression.typeParameters, isNull);
+    expect(expression.parameters, isNotNull);
+    expect(declaration.propertyKeyword, isNull);
+  }
+
+  void test_parseFunctionDeclaration_functionWithTypeParameters() {
+    enableGenericMethods = true;
+    Comment comment = Comment.createDocumentationComment(new List<Token>(0));
+    TypeName returnType = new TypeName(new SimpleIdentifier(null), null);
+    FunctionDeclaration declaration = parse("parseFunctionDeclaration",
+        <Object>[commentAndMetadata(comment), null, returnType], "f<E>() {}");
+    expect(declaration.documentationComment, comment);
+    expect(declaration.returnType, returnType);
+    expect(declaration.name, isNotNull);
+    FunctionExpression expression = declaration.functionExpression;
+    expect(expression, isNotNull);
+    expect(expression.body, isNotNull);
+    expect(expression.typeParameters, isNotNull);
+    expect(expression.parameters, isNotNull);
+    expect(declaration.propertyKeyword, isNull);
+  }
+
+  void test_parseFunctionDeclaration_getter() {
+    Comment comment = Comment.createDocumentationComment(new List<Token>(0));
+    TypeName returnType = new TypeName(new SimpleIdentifier(null), null);
+    FunctionDeclaration declaration = parse("parseFunctionDeclaration",
+        <Object>[commentAndMetadata(comment), null, returnType], "get p => 0;");
+    expect(declaration.documentationComment, comment);
+    expect(declaration.returnType, returnType);
+    expect(declaration.name, isNotNull);
+    FunctionExpression expression = declaration.functionExpression;
+    expect(expression, isNotNull);
+    expect(expression.body, isNotNull);
+    expect(expression.typeParameters, isNull);
+    expect(expression.parameters, isNull);
+    expect(declaration.propertyKeyword, isNotNull);
+  }
+
+  void test_parseFunctionDeclaration_setter() {
+    Comment comment = Comment.createDocumentationComment(new List<Token>(0));
+    TypeName returnType = new TypeName(new SimpleIdentifier(null), null);
+    FunctionDeclaration declaration = parse("parseFunctionDeclaration",
+        <Object>[commentAndMetadata(comment), null, returnType], "set p(v) {}");
+    expect(declaration.documentationComment, comment);
+    expect(declaration.returnType, returnType);
+    expect(declaration.name, isNotNull);
+    FunctionExpression expression = declaration.functionExpression;
+    expect(expression, isNotNull);
+    expect(expression.body, isNotNull);
+    expect(expression.typeParameters, isNull);
+    expect(expression.parameters, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
+  }
+
+  void test_parseFunctionDeclarationStatement() {
+    FunctionDeclarationStatement statement =
+        parse4("parseFunctionDeclarationStatement", "void f(int p) => p * 2;");
+    expect(statement.functionDeclaration, isNotNull);
+  }
+
+  void test_parseFunctionDeclarationStatement_typeParameters() {
+    enableGenericMethods = true;
+    FunctionDeclarationStatement statement =
+        parse4("parseFunctionDeclarationStatement", "E f<E>(E p) => p * 2;");
+    expect(statement.functionDeclaration, isNotNull);
+  }
+
+  void test_parseFunctionExpression_body_inExpression() {
+    FunctionExpression expression =
+        parse4("parseFunctionExpression", "(int i) => i++");
+    expect(expression.body, isNotNull);
+    expect(expression.typeParameters, isNull);
+    expect(expression.parameters, isNotNull);
+    expect((expression.body as ExpressionFunctionBody).semicolon, isNull);
+  }
+
+  void test_parseFunctionExpression_typeParameters() {
+    enableGenericMethods = true;
+    FunctionExpression expression =
+        parse4("parseFunctionExpression", "<E>(E i) => i++");
+    expect(expression.body, isNotNull);
+    expect(expression.typeParameters, isNotNull);
+    expect(expression.parameters, isNotNull);
+    expect((expression.body as ExpressionFunctionBody).semicolon, isNull);
+  }
+
+  void test_parseGetter_nonStatic() {
+    Comment comment = Comment.createDocumentationComment(new List<Token>(0));
+    TypeName returnType = new TypeName(new SimpleIdentifier(null), null);
+    MethodDeclaration method = parse(
+        "parseGetter",
+        <Object>[commentAndMetadata(comment), null, null, returnType],
+        "get a;");
+    expect(method.body, isNotNull);
+    expect(method.documentationComment, comment);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.parameters, isNull);
+    expect(method.propertyKeyword, isNotNull);
+    expect(method.returnType, returnType);
+  }
+
+  void test_parseGetter_static() {
+    Comment comment = Comment.createDocumentationComment(new List<Token>(0));
+    Token staticKeyword = TokenFactory.tokenFromKeyword(Keyword.STATIC);
+    TypeName returnType = new TypeName(new SimpleIdentifier(null), null);
+    MethodDeclaration method = parse(
+        "parseGetter",
+        <Object>[commentAndMetadata(comment), null, staticKeyword, returnType],
+        "get a => 42;");
+    expect(method.body, isNotNull);
+    expect(method.documentationComment, comment);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, staticKeyword);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNull);
+    expect(method.parameters, isNull);
+    expect(method.propertyKeyword, isNotNull);
+    expect(method.returnType, returnType);
+  }
+
+  void test_parseIdentifierList_multiple() {
+    List<SimpleIdentifier> list = parse4("parseIdentifierList", "a, b, c");
+    expect(list, hasLength(3));
+  }
+
+  void test_parseIdentifierList_single() {
+    List<SimpleIdentifier> list = parse4("parseIdentifierList", "a");
+    expect(list, hasLength(1));
+  }
+
+  void test_parseIfStatement_else_block() {
+    IfStatement statement = parse4("parseIfStatement", "if (x) {} else {}");
+    expect(statement.ifKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.thenStatement, isNotNull);
+    expect(statement.elseKeyword, isNotNull);
+    expect(statement.elseStatement, isNotNull);
+  }
+
+  void test_parseIfStatement_else_statement() {
+    IfStatement statement =
+        parse4("parseIfStatement", "if (x) f(x); else f(y);");
+    expect(statement.ifKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.thenStatement, isNotNull);
+    expect(statement.elseKeyword, isNotNull);
+    expect(statement.elseStatement, isNotNull);
+  }
+
+  void test_parseIfStatement_noElse_block() {
+    IfStatement statement = parse4("parseIfStatement", "if (x) {}");
+    expect(statement.ifKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.thenStatement, isNotNull);
+    expect(statement.elseKeyword, isNull);
+    expect(statement.elseStatement, isNull);
+  }
+
+  void test_parseIfStatement_noElse_statement() {
+    IfStatement statement = parse4("parseIfStatement", "if (x) f(x);");
+    expect(statement.ifKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.thenStatement, isNotNull);
+    expect(statement.elseKeyword, isNull);
+    expect(statement.elseStatement, isNull);
+  }
+
+  void test_parseImplementsClause_multiple() {
+    ImplementsClause clause =
+        parse4("parseImplementsClause", "implements A, B, C");
+    expect(clause.interfaces, hasLength(3));
+    expect(clause.implementsKeyword, isNotNull);
+  }
+
+  void test_parseImplementsClause_single() {
+    ImplementsClause clause = parse4("parseImplementsClause", "implements A");
+    expect(clause.interfaces, hasLength(1));
+    expect(clause.implementsKeyword, isNotNull);
+  }
+
+  void test_parseImportDirective_deferred() {
+    ImportDirective directive = parse(
+        "parseImportDirective",
+        <Object>[emptyCommentAndMetadata()],
+        "import 'lib/lib.dart' deferred as a;");
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredKeyword, isNotNull);
+    expect(directive.asKeyword, isNotNull);
+    expect(directive.prefix, isNotNull);
+    expect(directive.combinators, hasLength(0));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseImportDirective_hide() {
+    ImportDirective directive = parse(
+        "parseImportDirective",
+        <Object>[emptyCommentAndMetadata()],
+        "import 'lib/lib.dart' hide A, B;");
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredKeyword, isNull);
+    expect(directive.asKeyword, isNull);
+    expect(directive.prefix, isNull);
+    expect(directive.combinators, hasLength(1));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseImportDirective_noCombinator() {
+    ImportDirective directive = parse("parseImportDirective",
+        <Object>[emptyCommentAndMetadata()], "import 'lib/lib.dart';");
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredKeyword, isNull);
+    expect(directive.asKeyword, isNull);
+    expect(directive.prefix, isNull);
+    expect(directive.combinators, hasLength(0));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseImportDirective_prefix() {
+    ImportDirective directive = parse("parseImportDirective",
+        <Object>[emptyCommentAndMetadata()], "import 'lib/lib.dart' as a;");
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredKeyword, isNull);
+    expect(directive.asKeyword, isNotNull);
+    expect(directive.prefix, isNotNull);
+    expect(directive.combinators, hasLength(0));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseImportDirective_prefix_hide_show() {
+    ImportDirective directive = parse(
+        "parseImportDirective",
+        <Object>[emptyCommentAndMetadata()],
+        "import 'lib/lib.dart' as a hide A show B;");
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredKeyword, isNull);
+    expect(directive.asKeyword, isNotNull);
+    expect(directive.prefix, isNotNull);
+    expect(directive.combinators, hasLength(2));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseImportDirective_prefix_show_hide() {
+    ImportDirective directive = parse(
+        "parseImportDirective",
+        <Object>[emptyCommentAndMetadata()],
+        "import 'lib/lib.dart' as a show B hide A;");
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredKeyword, isNull);
+    expect(directive.asKeyword, isNotNull);
+    expect(directive.prefix, isNotNull);
+    expect(directive.combinators, hasLength(2));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseImportDirective_show() {
+    ImportDirective directive = parse(
+        "parseImportDirective",
+        <Object>[emptyCommentAndMetadata()],
+        "import 'lib/lib.dart' show A, B;");
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredKeyword, isNull);
+    expect(directive.asKeyword, isNull);
+    expect(directive.prefix, isNull);
+    expect(directive.combinators, hasLength(1));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseInitializedIdentifierList_type() {
+    Comment comment = Comment.createDocumentationComment(new List<Token>(0));
+    Token staticKeyword = TokenFactory.tokenFromKeyword(Keyword.STATIC);
+    TypeName type = new TypeName(new SimpleIdentifier(null), null);
+    FieldDeclaration declaration = parse(
+        "parseInitializedIdentifierList",
+        <Object>[commentAndMetadata(comment), staticKeyword, null, type],
+        "a = 1, b, c = 3;");
+    expect(declaration.documentationComment, comment);
+    VariableDeclarationList fields = declaration.fields;
+    expect(fields, isNotNull);
+    expect(fields.keyword, isNull);
+    expect(fields.type, type);
+    expect(fields.variables, hasLength(3));
+    expect(declaration.staticKeyword, staticKeyword);
+    expect(declaration.semicolon, isNotNull);
+  }
+
+  void test_parseInitializedIdentifierList_var() {
+    Comment comment = Comment.createDocumentationComment(new List<Token>(0));
+    Token staticKeyword = TokenFactory.tokenFromKeyword(Keyword.STATIC);
+    Token varKeyword = TokenFactory.tokenFromKeyword(Keyword.VAR);
+    FieldDeclaration declaration = parse(
+        "parseInitializedIdentifierList",
+        <Object>[commentAndMetadata(comment), staticKeyword, varKeyword, null],
+        "a = 1, b, c = 3;");
+    expect(declaration.documentationComment, comment);
+    VariableDeclarationList fields = declaration.fields;
+    expect(fields, isNotNull);
+    expect(fields.keyword, varKeyword);
+    expect(fields.type, isNull);
+    expect(fields.variables, hasLength(3));
+    expect(declaration.staticKeyword, staticKeyword);
+    expect(declaration.semicolon, isNotNull);
+  }
+
+  void test_parseInstanceCreationExpression_qualifiedType() {
+    Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+    InstanceCreationExpression expression =
+        parse("parseInstanceCreationExpression", <Object>[token], "A.B()");
+    expect(expression.keyword, token);
+    ConstructorName name = expression.constructorName;
+    expect(name, isNotNull);
+    expect(name.type, isNotNull);
+    expect(name.period, isNull);
+    expect(name.name, isNull);
+    expect(expression.argumentList, isNotNull);
+  }
+
+  void test_parseInstanceCreationExpression_qualifiedType_named() {
+    Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+    InstanceCreationExpression expression =
+        parse("parseInstanceCreationExpression", <Object>[token], "A.B.c()");
+    expect(expression.keyword, token);
+    ConstructorName name = expression.constructorName;
+    expect(name, isNotNull);
+    expect(name.type, isNotNull);
+    expect(name.period, isNotNull);
+    expect(name.name, isNotNull);
+    expect(expression.argumentList, isNotNull);
+  }
+
+  void test_parseInstanceCreationExpression_type() {
+    Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+    InstanceCreationExpression expression =
+        parse("parseInstanceCreationExpression", <Object>[token], "A()");
+    expect(expression.keyword, token);
+    ConstructorName name = expression.constructorName;
+    expect(name, isNotNull);
+    expect(name.type, isNotNull);
+    expect(name.period, isNull);
+    expect(name.name, isNull);
+    expect(expression.argumentList, isNotNull);
+  }
+
+  void test_parseInstanceCreationExpression_type_named() {
+    Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+    InstanceCreationExpression expression =
+        parse("parseInstanceCreationExpression", <Object>[token], "A<B>.c()");
+    expect(expression.keyword, token);
+    ConstructorName name = expression.constructorName;
+    expect(name, isNotNull);
+    expect(name.type, isNotNull);
+    expect(name.period, isNotNull);
+    expect(name.name, isNotNull);
+    expect(expression.argumentList, isNotNull);
+  }
+
+  void test_parseLibraryDirective() {
+    LibraryDirective directive = parse("parseLibraryDirective",
+        <Object>[emptyCommentAndMetadata()], "library l;");
+    expect(directive.libraryKeyword, isNotNull);
+    expect(directive.name, isNotNull);
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseLibraryIdentifier_multiple() {
+    String name = "a.b.c";
+    LibraryIdentifier identifier = parse4("parseLibraryIdentifier", name);
+    expect(identifier.name, name);
+  }
+
+  void test_parseLibraryIdentifier_single() {
+    String name = "a";
+    LibraryIdentifier identifier = parse4("parseLibraryIdentifier", name);
+    expect(identifier.name, name);
+  }
+
+  void test_parseListLiteral_empty_oneToken() {
+    Token token = TokenFactory.tokenFromKeyword(Keyword.CONST);
+    TypeArgumentList typeArguments = null;
+    ListLiteral literal =
+        parse("parseListLiteral", <Object>[token, typeArguments], "[]");
+    expect(literal.constKeyword, token);
+    expect(literal.typeArguments, typeArguments);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.elements, hasLength(0));
+    expect(literal.rightBracket, isNotNull);
+  }
+
+  void test_parseListLiteral_empty_oneToken_withComment() {
+    Token constToken = null;
+    TypeArgumentList typeArguments = null;
+    ListLiteral literal = parse(
+        "parseListLiteral", <Object>[constToken, typeArguments], "/* 0 */ []");
+    expect(literal.constKeyword, constToken);
+    expect(literal.typeArguments, typeArguments);
+    Token leftBracket = literal.leftBracket;
+    expect(leftBracket, isNotNull);
+    expect(leftBracket.precedingComments, isNotNull);
+    expect(literal.elements, hasLength(0));
+    expect(literal.rightBracket, isNotNull);
+  }
+
+  void test_parseListLiteral_empty_twoTokens() {
+    Token token = TokenFactory.tokenFromKeyword(Keyword.CONST);
+    TypeArgumentList typeArguments = null;
+    ListLiteral literal =
+        parse("parseListLiteral", <Object>[token, typeArguments], "[ ]");
+    expect(literal.constKeyword, token);
+    expect(literal.typeArguments, typeArguments);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.elements, hasLength(0));
+    expect(literal.rightBracket, isNotNull);
+  }
+
+  void test_parseListLiteral_multiple() {
+    ListLiteral literal =
+        parse("parseListLiteral", <Object>[null, null], "[1, 2, 3]");
+    expect(literal.constKeyword, isNull);
+    expect(literal.typeArguments, isNull);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.elements, hasLength(3));
+    expect(literal.rightBracket, isNotNull);
+  }
+
+  void test_parseListLiteral_single() {
+    ListLiteral literal =
+        parse("parseListLiteral", <Object>[null, null], "[1]");
+    expect(literal.constKeyword, isNull);
+    expect(literal.typeArguments, isNull);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.elements, hasLength(1));
+    expect(literal.rightBracket, isNotNull);
+  }
+
+  void test_parseListOrMapLiteral_list_noType() {
+    ListLiteral literal = parse("parseListOrMapLiteral", <Object>[null], "[1]");
+    expect(literal.constKeyword, isNull);
+    expect(literal.typeArguments, isNull);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.elements, hasLength(1));
+    expect(literal.rightBracket, isNotNull);
+  }
+
+  void test_parseListOrMapLiteral_list_type() {
+    ListLiteral literal =
+        parse("parseListOrMapLiteral", <Object>[null], "<int> [1]");
+    expect(literal.constKeyword, isNull);
+    expect(literal.typeArguments, isNotNull);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.elements, hasLength(1));
+    expect(literal.rightBracket, isNotNull);
+  }
+
+  void test_parseListOrMapLiteral_map_noType() {
+    MapLiteral literal =
+        parse("parseListOrMapLiteral", <Object>[null], "{'1' : 1}");
+    expect(literal.constKeyword, isNull);
+    expect(literal.typeArguments, isNull);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.entries, hasLength(1));
+    expect(literal.rightBracket, isNotNull);
+  }
+
+  void test_parseListOrMapLiteral_map_type() {
+    MapLiteral literal = parse(
+        "parseListOrMapLiteral", <Object>[null], "<String, int> {'1' : 1}");
+    expect(literal.constKeyword, isNull);
+    expect(literal.typeArguments, isNotNull);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.entries, hasLength(1));
+    expect(literal.rightBracket, isNotNull);
+  }
+
+  void test_parseLogicalAndExpression() {
+    BinaryExpression expression = parse4("parseLogicalAndExpression", "x && y");
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.AMPERSAND_AMPERSAND);
+    expect(expression.rightOperand, isNotNull);
+  }
+
+  void test_parseLogicalOrExpression() {
+    BinaryExpression expression = parse4("parseLogicalOrExpression", "x || y");
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.BAR_BAR);
+    expect(expression.rightOperand, isNotNull);
+  }
+
+  void test_parseMapLiteral_empty() {
+    Token token = TokenFactory.tokenFromKeyword(Keyword.CONST);
+    TypeArgumentList typeArguments = AstFactory.typeArgumentList(
+        [AstFactory.typeName4("String"), AstFactory.typeName4("int")]);
+    MapLiteral literal =
+        parse("parseMapLiteral", <Object>[token, typeArguments], "{}");
+    expect(literal.constKeyword, token);
+    expect(literal.typeArguments, typeArguments);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.entries, hasLength(0));
+    expect(literal.rightBracket, isNotNull);
+  }
+
+  void test_parseMapLiteral_multiple() {
+    MapLiteral literal =
+        parse("parseMapLiteral", <Object>[null, null], "{'a' : b, 'x' : y}");
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.entries, hasLength(2));
+    expect(literal.rightBracket, isNotNull);
+  }
+
+  void test_parseMapLiteral_single() {
+    MapLiteral literal =
+        parse("parseMapLiteral", <Object>[null, null], "{'x' : y}");
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.entries, hasLength(1));
+    expect(literal.rightBracket, isNotNull);
+  }
+
+  void test_parseMapLiteralEntry_complex() {
+    MapLiteralEntry entry = parse4("parseMapLiteralEntry", "2 + 2 : y");
+    expect(entry.key, isNotNull);
+    expect(entry.separator, isNotNull);
+    expect(entry.value, isNotNull);
+  }
+
+  void test_parseMapLiteralEntry_int() {
+    MapLiteralEntry entry = parse4("parseMapLiteralEntry", "0 : y");
+    expect(entry.key, isNotNull);
+    expect(entry.separator, isNotNull);
+    expect(entry.value, isNotNull);
+  }
+
+  void test_parseMapLiteralEntry_string() {
+    MapLiteralEntry entry = parse4("parseMapLiteralEntry", "'x' : y");
+    expect(entry.key, isNotNull);
+    expect(entry.separator, isNotNull);
+    expect(entry.value, isNotNull);
+  }
+
+  void test_parseModifiers_abstract() {
+    Modifiers modifiers = parse4("parseModifiers", "abstract A");
+    expect(modifiers.abstractKeyword, isNotNull);
+  }
+
+  void test_parseModifiers_const() {
+    Modifiers modifiers = parse4("parseModifiers", "const A");
+    expect(modifiers.constKeyword, isNotNull);
+  }
+
+  void test_parseModifiers_external() {
+    Modifiers modifiers = parse4("parseModifiers", "external A");
+    expect(modifiers.externalKeyword, isNotNull);
+  }
+
+  void test_parseModifiers_factory() {
+    Modifiers modifiers = parse4("parseModifiers", "factory A");
+    expect(modifiers.factoryKeyword, isNotNull);
+  }
+
+  void test_parseModifiers_final() {
+    Modifiers modifiers = parse4("parseModifiers", "final A");
+    expect(modifiers.finalKeyword, isNotNull);
+  }
+
+  void test_parseModifiers_static() {
+    Modifiers modifiers = parse4("parseModifiers", "static A");
+    expect(modifiers.staticKeyword, isNotNull);
+  }
+
+  void test_parseModifiers_var() {
+    Modifiers modifiers = parse4("parseModifiers", "var A");
+    expect(modifiers.varKeyword, isNotNull);
+  }
+
+  void test_parseMultiplicativeExpression_normal() {
+    BinaryExpression expression =
+        parse4("parseMultiplicativeExpression", "x * y");
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.STAR);
+    expect(expression.rightOperand, isNotNull);
+  }
+
+  void test_parseMultiplicativeExpression_super() {
+    BinaryExpression expression =
+        parse4("parseMultiplicativeExpression", "super * y");
+    EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression,
+        SuperExpression, expression.leftOperand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.STAR);
+    expect(expression.rightOperand, isNotNull);
+  }
+
+  void test_parseNewExpression() {
+    InstanceCreationExpression expression =
+        parse4("parseNewExpression", "new A()");
+    expect(expression.keyword, isNotNull);
+    ConstructorName name = expression.constructorName;
+    expect(name, isNotNull);
+    expect(name.type, isNotNull);
+    expect(name.period, isNull);
+    expect(name.name, isNull);
+    expect(expression.argumentList, isNotNull);
+  }
+
+  void test_parseNonLabeledStatement_const_list_empty() {
+    ExpressionStatement statement =
+        parse4("parseNonLabeledStatement", "const [];");
+    expect(statement.expression, isNotNull);
+  }
+
+  void test_parseNonLabeledStatement_const_list_nonEmpty() {
+    ExpressionStatement statement =
+        parse4("parseNonLabeledStatement", "const [1, 2];");
+    expect(statement.expression, isNotNull);
+  }
+
+  void test_parseNonLabeledStatement_const_map_empty() {
+    ExpressionStatement statement =
+        parse4("parseNonLabeledStatement", "const {};");
+    expect(statement.expression, isNotNull);
+  }
+
+  void test_parseNonLabeledStatement_const_map_nonEmpty() {
+    // TODO(brianwilkerson) Implement more tests for this method.
+    ExpressionStatement statement =
+        parse4("parseNonLabeledStatement", "const {'a' : 1};");
+    expect(statement.expression, isNotNull);
+  }
+
+  void test_parseNonLabeledStatement_const_object() {
+    ExpressionStatement statement =
+        parse4("parseNonLabeledStatement", "const A();");
+    expect(statement.expression, isNotNull);
+  }
+
+  void test_parseNonLabeledStatement_const_object_named_typeParameters() {
+    ExpressionStatement statement =
+        parse4("parseNonLabeledStatement", "const A<B>.c();");
+    expect(statement.expression, isNotNull);
+  }
+
+  void test_parseNonLabeledStatement_constructorInvocation() {
+    ExpressionStatement statement =
+        parse4("parseNonLabeledStatement", "new C().m();");
+    expect(statement.expression, isNotNull);
+  }
+
+  void test_parseNonLabeledStatement_false() {
+    ExpressionStatement statement =
+        parse4("parseNonLabeledStatement", "false;");
+    expect(statement.expression, isNotNull);
+  }
+
+  void test_parseNonLabeledStatement_functionDeclaration() {
+    parse4("parseNonLabeledStatement", "f() {};");
+  }
+
+  void test_parseNonLabeledStatement_functionDeclaration_arguments() {
+    parse4("parseNonLabeledStatement", "f(void g()) {};");
+  }
+
+  void test_parseNonLabeledStatement_functionExpressionIndex() {
+    parse4("parseNonLabeledStatement", "() {}[0] = null;");
+  }
+
+  void test_parseNonLabeledStatement_functionInvocation() {
+    ExpressionStatement statement = parse4("parseNonLabeledStatement", "f();");
+    expect(statement.expression, isNotNull);
+  }
+
+  void test_parseNonLabeledStatement_invokeFunctionExpression() {
+    ExpressionStatement statement =
+        parse4("parseNonLabeledStatement", "(a) {return a + a;} (3);");
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is FunctionExpressionInvocation,
+        FunctionExpressionInvocation,
+        statement.expression);
+    FunctionExpressionInvocation invocation =
+        statement.expression as FunctionExpressionInvocation;
+    EngineTestCase.assertInstanceOf((obj) => obj is FunctionExpression,
+        FunctionExpression, invocation.function);
+    FunctionExpression expression = invocation.function as FunctionExpression;
+    expect(expression.parameters, isNotNull);
+    expect(expression.body, isNotNull);
+    expect(invocation.typeArguments, isNull);
+    ArgumentList list = invocation.argumentList;
+    expect(list, isNotNull);
+    expect(list.arguments, hasLength(1));
+  }
+
+  void test_parseNonLabeledStatement_null() {
+    ExpressionStatement statement = parse4("parseNonLabeledStatement", "null;");
+    expect(statement.expression, isNotNull);
+  }
+
+  void test_parseNonLabeledStatement_startingWithBuiltInIdentifier() {
+    ExpressionStatement statement =
+        parse4("parseNonLabeledStatement", "library.getName();");
+    expect(statement.expression, isNotNull);
+  }
+
+  void test_parseNonLabeledStatement_true() {
+    ExpressionStatement statement = parse4("parseNonLabeledStatement", "true;");
+    expect(statement.expression, isNotNull);
+  }
+
+  void test_parseNonLabeledStatement_typeCast() {
+    ExpressionStatement statement =
+        parse4("parseNonLabeledStatement", "double.NAN as num;");
+    expect(statement.expression, isNotNull);
+  }
+
+  void test_parseNormalFormalParameter_field_const_noType() {
+    FieldFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "const this.a)");
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.parameters, isNull);
+  }
+
+  void test_parseNormalFormalParameter_field_const_type() {
+    FieldFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "const A this.a)");
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNotNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.parameters, isNull);
+  }
+
+  void test_parseNormalFormalParameter_field_final_noType() {
+    FieldFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "final this.a)");
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.parameters, isNull);
+  }
+
+  void test_parseNormalFormalParameter_field_final_type() {
+    FieldFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "final A this.a)");
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNotNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.parameters, isNull);
+  }
+
+  void test_parseNormalFormalParameter_field_function_nested() {
+    FieldFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "this.a(B b))");
+    expect(parameter.keyword, isNull);
+    expect(parameter.type, isNull);
+    expect(parameter.identifier, isNotNull);
+    FormalParameterList parameterList = parameter.parameters;
+    expect(parameterList, isNotNull);
+    expect(parameterList.parameters, hasLength(1));
+  }
+
+  void test_parseNormalFormalParameter_field_function_noNested() {
+    FieldFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "this.a())");
+    expect(parameter.keyword, isNull);
+    expect(parameter.type, isNull);
+    expect(parameter.identifier, isNotNull);
+    FormalParameterList parameterList = parameter.parameters;
+    expect(parameterList, isNotNull);
+    expect(parameterList.parameters, hasLength(0));
+  }
+
+  void test_parseNormalFormalParameter_field_noType() {
+    FieldFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "this.a)");
+    expect(parameter.keyword, isNull);
+    expect(parameter.type, isNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.parameters, isNull);
+  }
+
+  void test_parseNormalFormalParameter_field_type() {
+    FieldFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "A this.a)");
+    expect(parameter.keyword, isNull);
+    expect(parameter.type, isNotNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.parameters, isNull);
+  }
+
+  void test_parseNormalFormalParameter_field_var() {
+    FieldFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "var this.a)");
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.parameters, isNull);
+  }
+
+  void test_parseNormalFormalParameter_function_noType() {
+    FunctionTypedFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "a())");
+    expect(parameter.returnType, isNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.typeParameters, isNull);
+    expect(parameter.parameters, isNotNull);
+  }
+
+  void test_parseNormalFormalParameter_function_noType_typeParameters() {
+    enableGenericMethods = true;
+    FunctionTypedFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "a<E>())");
+    expect(parameter.returnType, isNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.typeParameters, isNotNull);
+    expect(parameter.parameters, isNotNull);
+  }
+
+  void test_parseNormalFormalParameter_function_type() {
+    FunctionTypedFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "A a())");
+    expect(parameter.returnType, isNotNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.typeParameters, isNull);
+    expect(parameter.parameters, isNotNull);
+  }
+
+  void test_parseNormalFormalParameter_function_type_typeParameters() {
+    enableGenericMethods = true;
+    FunctionTypedFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "A a<E>())");
+    expect(parameter.returnType, isNotNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.typeParameters, isNotNull);
+    expect(parameter.parameters, isNotNull);
+  }
+
+  void test_parseNormalFormalParameter_function_void() {
+    FunctionTypedFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "void a())");
+    expect(parameter.returnType, isNotNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.typeParameters, isNull);
+    expect(parameter.parameters, isNotNull);
+  }
+
+  void test_parseNormalFormalParameter_function_void_typeParameters() {
+    enableGenericMethods = true;
+    FunctionTypedFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "void a<E>())");
+    expect(parameter.returnType, isNotNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.typeParameters, isNotNull);
+    expect(parameter.parameters, isNotNull);
+  }
+
+  void test_parseNormalFormalParameter_simple_const_noType() {
+    SimpleFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "const a)");
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNull);
+    expect(parameter.identifier, isNotNull);
+  }
+
+  void test_parseNormalFormalParameter_simple_const_type() {
+    SimpleFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "const A a)");
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNotNull);
+    expect(parameter.identifier, isNotNull);
+  }
+
+  void test_parseNormalFormalParameter_simple_final_noType() {
+    SimpleFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "final a)");
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNull);
+    expect(parameter.identifier, isNotNull);
+  }
+
+  void test_parseNormalFormalParameter_simple_final_type() {
+    SimpleFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "final A a)");
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNotNull);
+    expect(parameter.identifier, isNotNull);
+  }
+
+  void test_parseNormalFormalParameter_simple_noType() {
+    SimpleFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "a)");
+    expect(parameter.keyword, isNull);
+    expect(parameter.type, isNull);
+    expect(parameter.identifier, isNotNull);
+  }
+
+  void test_parseNormalFormalParameter_simple_type() {
+    SimpleFormalParameter parameter =
+        parse4("parseNormalFormalParameter", "A a)");
+    expect(parameter.keyword, isNull);
+    expect(parameter.type, isNotNull);
+    expect(parameter.identifier, isNotNull);
+  }
+
+  void test_parseOperator() {
+    Comment comment = Comment.createDocumentationComment(new List<Token>(0));
+    TypeName returnType = new TypeName(new SimpleIdentifier(null), null);
+    MethodDeclaration method = parse(
+        "parseOperator",
+        <Object>[commentAndMetadata(comment), null, returnType],
+        "operator +(A a);");
+    expect(method.body, isNotNull);
+    expect(method.documentationComment, comment);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNotNull);
+    expect(method.typeParameters, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, returnType);
+  }
+
+  void test_parseOptionalReturnType() {
+    // TODO(brianwilkerson) Implement tests for this method.
+  }
+
+  void test_parsePartDirective_part() {
+    PartDirective directive = parse("parsePartDirective",
+        <Object>[emptyCommentAndMetadata()], "part 'lib/lib.dart';");
+    expect(directive.partKeyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parsePartDirective_partOf() {
+    PartOfDirective directive = parse("parsePartDirective",
+        <Object>[emptyCommentAndMetadata()], "part of l;");
+    expect(directive.partKeyword, isNotNull);
+    expect(directive.ofKeyword, isNotNull);
+    expect(directive.libraryName, isNotNull);
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parsePostfixExpression_decrement() {
+    PostfixExpression expression = parse4("parsePostfixExpression", "i--");
+    expect(expression.operand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.MINUS_MINUS);
+  }
+
+  void test_parsePostfixExpression_increment() {
+    PostfixExpression expression = parse4("parsePostfixExpression", "i++");
+    expect(expression.operand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.PLUS_PLUS);
+  }
+
+  void test_parsePostfixExpression_none_indexExpression() {
+    IndexExpression expression = parse4("parsePostfixExpression", "a[0]");
+    expect(expression.target, isNotNull);
+    expect(expression.index, isNotNull);
+  }
+
+  void test_parsePostfixExpression_none_methodInvocation() {
+    MethodInvocation expression = parse4("parsePostfixExpression", "a.m()");
+    expect(expression.target, isNotNull);
+    expect(expression.operator.type, TokenType.PERIOD);
+    expect(expression.methodName, isNotNull);
+    expect(expression.typeArguments, isNull);
+    expect(expression.argumentList, isNotNull);
+  }
+
+  void test_parsePostfixExpression_none_methodInvocation_question_dot() {
+    MethodInvocation expression = parse4('parsePostfixExpression', 'a?.m()');
+    expect(expression.target, isNotNull);
+    expect(expression.operator.type, TokenType.QUESTION_PERIOD);
+    expect(expression.methodName, isNotNull);
+    expect(expression.typeArguments, isNull);
+    expect(expression.argumentList, isNotNull);
+  }
+
+  void test_parsePostfixExpression_none_methodInvocation_question_dot_typeArguments() {
+    enableGenericMethods = true;
+    MethodInvocation expression = parse4('parsePostfixExpression', 'a?.m<E>()');
+    expect(expression.target, isNotNull);
+    expect(expression.operator.type, TokenType.QUESTION_PERIOD);
+    expect(expression.methodName, isNotNull);
+    expect(expression.typeArguments, isNotNull);
+    expect(expression.argumentList, isNotNull);
+  }
+
+  void test_parsePostfixExpression_none_methodInvocation_typeArguments() {
+    enableGenericMethods = true;
+    MethodInvocation expression = parse4("parsePostfixExpression", "a.m<E>()");
+    expect(expression.target, isNotNull);
+    expect(expression.operator.type, TokenType.PERIOD);
+    expect(expression.methodName, isNotNull);
+    expect(expression.typeArguments, isNotNull);
+    expect(expression.argumentList, isNotNull);
+  }
+
+  void test_parsePostfixExpression_none_propertyAccess() {
+    PrefixedIdentifier expression = parse4("parsePostfixExpression", "a.b");
+    expect(expression.prefix, isNotNull);
+    expect(expression.identifier, isNotNull);
+  }
+
+  void test_parsePrefixedIdentifier_noPrefix() {
+    String lexeme = "bar";
+    SimpleIdentifier identifier = parse4("parsePrefixedIdentifier", lexeme);
+    expect(identifier.token, isNotNull);
+    expect(identifier.name, lexeme);
+  }
+
+  void test_parsePrefixedIdentifier_prefix() {
+    String lexeme = "foo.bar";
+    PrefixedIdentifier identifier = parse4("parsePrefixedIdentifier", lexeme);
+    expect(identifier.prefix.name, "foo");
+    expect(identifier.period, isNotNull);
+    expect(identifier.identifier.name, "bar");
+  }
+
+  void test_parsePrimaryExpression_const() {
+    InstanceCreationExpression expression =
+        parse4("parsePrimaryExpression", "const A()");
+    expect(expression, isNotNull);
+  }
+
+  void test_parsePrimaryExpression_double() {
+    String doubleLiteral = "3.2e4";
+    DoubleLiteral literal = parse4("parsePrimaryExpression", doubleLiteral);
+    expect(literal.literal, isNotNull);
+    expect(literal.value, double.parse(doubleLiteral));
+  }
+
+  void test_parsePrimaryExpression_false() {
+    BooleanLiteral literal = parse4("parsePrimaryExpression", "false");
+    expect(literal.literal, isNotNull);
+    expect(literal.value, isFalse);
+  }
+
+  void test_parsePrimaryExpression_function_arguments() {
+    FunctionExpression expression =
+        parse4("parsePrimaryExpression", "(int i) => i + 1");
+    expect(expression.parameters, isNotNull);
+    expect(expression.body, isNotNull);
+  }
+
+  void test_parsePrimaryExpression_function_noArguments() {
+    FunctionExpression expression =
+        parse4("parsePrimaryExpression", "() => 42");
+    expect(expression.parameters, isNotNull);
+    expect(expression.body, isNotNull);
+  }
+
+  void test_parsePrimaryExpression_hex() {
+    String hexLiteral = "3F";
+    IntegerLiteral literal = parse4("parsePrimaryExpression", "0x$hexLiteral");
+    expect(literal.literal, isNotNull);
+    expect(literal.value, int.parse(hexLiteral, radix: 16));
+  }
+
+  void test_parsePrimaryExpression_identifier() {
+    SimpleIdentifier identifier = parse4("parsePrimaryExpression", "a");
+    expect(identifier, isNotNull);
+  }
+
+  void test_parsePrimaryExpression_int() {
+    String intLiteral = "472";
+    IntegerLiteral literal = parse4("parsePrimaryExpression", intLiteral);
+    expect(literal.literal, isNotNull);
+    expect(literal.value, int.parse(intLiteral));
+  }
+
+  void test_parsePrimaryExpression_listLiteral() {
+    ListLiteral literal = parse4("parsePrimaryExpression", "[ ]");
+    expect(literal, isNotNull);
+  }
+
+  void test_parsePrimaryExpression_listLiteral_index() {
+    ListLiteral literal = parse4("parsePrimaryExpression", "[]");
+    expect(literal, isNotNull);
+  }
+
+  void test_parsePrimaryExpression_listLiteral_typed() {
+    ListLiteral literal = parse4("parsePrimaryExpression", "<A>[ ]");
+    expect(literal.typeArguments, isNotNull);
+    expect(literal.typeArguments.arguments, hasLength(1));
+  }
+
+  void test_parsePrimaryExpression_mapLiteral() {
+    MapLiteral literal = parse4("parsePrimaryExpression", "{}");
+    expect(literal, isNotNull);
+  }
+
+  void test_parsePrimaryExpression_mapLiteral_typed() {
+    MapLiteral literal = parse4("parsePrimaryExpression", "<A, B>{}");
+    expect(literal.typeArguments, isNotNull);
+    expect(literal.typeArguments.arguments, hasLength(2));
+  }
+
+  void test_parsePrimaryExpression_new() {
+    InstanceCreationExpression expression =
+        parse4("parsePrimaryExpression", "new A()");
+    expect(expression, isNotNull);
+  }
+
+  void test_parsePrimaryExpression_null() {
+    NullLiteral literal = parse4("parsePrimaryExpression", "null");
+    expect(literal.literal, isNotNull);
+  }
+
+  void test_parsePrimaryExpression_parenthesized() {
+    ParenthesizedExpression expression =
+        parse4("parsePrimaryExpression", "(x)");
+    expect(expression, isNotNull);
+  }
+
+  void test_parsePrimaryExpression_string() {
+    SimpleStringLiteral literal =
+        parse4("parsePrimaryExpression", "\"string\"");
+    expect(literal.isMultiline, isFalse);
+    expect(literal.isRaw, isFalse);
+    expect(literal.value, "string");
+  }
+
+  void test_parsePrimaryExpression_string_multiline() {
+    SimpleStringLiteral literal =
+        parse4("parsePrimaryExpression", "'''string'''");
+    expect(literal.isMultiline, isTrue);
+    expect(literal.isRaw, isFalse);
+    expect(literal.value, "string");
+  }
+
+  void test_parsePrimaryExpression_string_raw() {
+    SimpleStringLiteral literal = parse4("parsePrimaryExpression", "r'string'");
+    expect(literal.isMultiline, isFalse);
+    expect(literal.isRaw, isTrue);
+    expect(literal.value, "string");
+  }
+
+  void test_parsePrimaryExpression_super() {
+    PropertyAccess propertyAccess = parse4("parsePrimaryExpression", "super.x");
+    expect(propertyAccess.target is SuperExpression, isTrue);
+    expect(propertyAccess.operator, isNotNull);
+    expect(propertyAccess.operator.type, TokenType.PERIOD);
+    expect(propertyAccess.propertyName, isNotNull);
+  }
+
+  void test_parsePrimaryExpression_this() {
+    ThisExpression expression = parse4("parsePrimaryExpression", "this");
+    expect(expression.thisKeyword, isNotNull);
+  }
+
+  void test_parsePrimaryExpression_true() {
+    BooleanLiteral literal = parse4("parsePrimaryExpression", "true");
+    expect(literal.literal, isNotNull);
+    expect(literal.value, isTrue);
+  }
+
+  void test_Parser() {
+    expect(new Parser(null, null), isNotNull);
+  }
+
+  void test_parseRedirectingConstructorInvocation_named() {
+    RedirectingConstructorInvocation invocation =
+        parse4("parseRedirectingConstructorInvocation", "this.a()");
+    expect(invocation.argumentList, isNotNull);
+    expect(invocation.constructorName, isNotNull);
+    expect(invocation.thisKeyword, isNotNull);
+    expect(invocation.period, isNotNull);
+  }
+
+  void test_parseRedirectingConstructorInvocation_unnamed() {
+    RedirectingConstructorInvocation invocation =
+        parse4("parseRedirectingConstructorInvocation", "this()");
+    expect(invocation.argumentList, isNotNull);
+    expect(invocation.constructorName, isNull);
+    expect(invocation.thisKeyword, isNotNull);
+    expect(invocation.period, isNull);
+  }
+
+  void test_parseRelationalExpression_as() {
+    AsExpression expression = parse4("parseRelationalExpression", "x as Y");
+    expect(expression.expression, isNotNull);
+    expect(expression.asOperator, isNotNull);
+    expect(expression.type, isNotNull);
+  }
+
+  void test_parseRelationalExpression_is() {
+    IsExpression expression = parse4("parseRelationalExpression", "x is y");
+    expect(expression.expression, isNotNull);
+    expect(expression.isOperator, isNotNull);
+    expect(expression.notOperator, isNull);
+    expect(expression.type, isNotNull);
+  }
+
+  void test_parseRelationalExpression_isNot() {
+    IsExpression expression = parse4("parseRelationalExpression", "x is! y");
+    expect(expression.expression, isNotNull);
+    expect(expression.isOperator, isNotNull);
+    expect(expression.notOperator, isNotNull);
+    expect(expression.type, isNotNull);
+  }
+
+  void test_parseRelationalExpression_normal() {
+    BinaryExpression expression = parse4("parseRelationalExpression", "x < y");
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.LT);
+    expect(expression.rightOperand, isNotNull);
+  }
+
+  void test_parseRelationalExpression_super() {
+    BinaryExpression expression =
+        parse4("parseRelationalExpression", "super < y");
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.LT);
+    expect(expression.rightOperand, isNotNull);
+  }
+
+  void test_parseRethrowExpression() {
+    RethrowExpression expression = parse4("parseRethrowExpression", "rethrow;");
+    expect(expression.rethrowKeyword, isNotNull);
+  }
+
+  void test_parseReturnStatement_noValue() {
+    ReturnStatement statement = parse4("parseReturnStatement", "return;");
+    expect(statement.returnKeyword, isNotNull);
+    expect(statement.expression, isNull);
+    expect(statement.semicolon, isNotNull);
+  }
+
+  void test_parseReturnStatement_value() {
+    ReturnStatement statement = parse4("parseReturnStatement", "return x;");
+    expect(statement.returnKeyword, isNotNull);
+    expect(statement.expression, isNotNull);
+    expect(statement.semicolon, isNotNull);
+  }
+
+  void test_parseReturnType_nonVoid() {
+    TypeName typeName = parse4("parseReturnType", "A<B>");
+    expect(typeName.name, isNotNull);
+    expect(typeName.typeArguments, isNotNull);
+  }
+
+  void test_parseReturnType_void() {
+    TypeName typeName = parse4("parseReturnType", "void");
+    expect(typeName.name, isNotNull);
+    expect(typeName.typeArguments, isNull);
+  }
+
+  void test_parseSetter_nonStatic() {
+    Comment comment = Comment.createDocumentationComment(new List<Token>(0));
+    TypeName returnType = new TypeName(new SimpleIdentifier(null), null);
+    MethodDeclaration method = parse(
+        "parseSetter",
+        <Object>[commentAndMetadata(comment), null, null, returnType],
+        "set a(var x);");
+    expect(method.body, isNotNull);
+    expect(method.documentationComment, comment);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.propertyKeyword, isNotNull);
+    expect(method.returnType, returnType);
+  }
+
+  void test_parseSetter_static() {
+    Comment comment = Comment.createDocumentationComment(new List<Token>(0));
+    Token staticKeyword = TokenFactory.tokenFromKeyword(Keyword.STATIC);
+    TypeName returnType = new TypeName(new SimpleIdentifier(null), null);
+    MethodDeclaration method = parse(
+        "parseSetter",
+        <Object>[commentAndMetadata(comment), null, staticKeyword, returnType],
+        "set a(var x) {}");
+    expect(method.body, isNotNull);
+    expect(method.documentationComment, comment);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, staticKeyword);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.typeParameters, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.propertyKeyword, isNotNull);
+    expect(method.returnType, returnType);
+  }
+
+  void test_parseShiftExpression_normal() {
+    BinaryExpression expression = parse4("parseShiftExpression", "x << y");
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.LT_LT);
+    expect(expression.rightOperand, isNotNull);
+  }
+
+  void test_parseShiftExpression_super() {
+    BinaryExpression expression = parse4("parseShiftExpression", "super << y");
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.LT_LT);
+    expect(expression.rightOperand, isNotNull);
+  }
+
+  void test_parseSimpleIdentifier1_normalIdentifier() {
+    // TODO(brianwilkerson) Implement tests for this method.
+  }
+
+  void test_parseSimpleIdentifier_builtInIdentifier() {
+    String lexeme = "as";
+    SimpleIdentifier identifier = parse4("parseSimpleIdentifier", lexeme);
+    expect(identifier.token, isNotNull);
+    expect(identifier.name, lexeme);
+  }
+
+  void test_parseSimpleIdentifier_normalIdentifier() {
+    String lexeme = "foo";
+    SimpleIdentifier identifier = parse4("parseSimpleIdentifier", lexeme);
+    expect(identifier.token, isNotNull);
+    expect(identifier.name, lexeme);
+  }
+
+  void test_parseStatement_emptyTypeArgumentListt() {
+    VariableDeclarationStatement statement = parse4(
+        "parseStatement", "C<> c;", [ParserErrorCode.EXPECTED_TYPE_NAME]);
+    VariableDeclarationList variables = statement.variables;
+    TypeName type = variables.type;
+    TypeArgumentList argumentList = type.typeArguments;
+    expect(argumentList.leftBracket, isNotNull);
+    expect(argumentList.arguments, hasLength(1));
+    expect(argumentList.arguments[0].isSynthetic, isTrue);
+    expect(argumentList.rightBracket, isNotNull);
+  }
+
+  void test_parseStatement_functionDeclaration_noReturnType() {
+    FunctionDeclarationStatement statement =
+        parse4("parseStatement", "f(a, b) {};");
+    expect(statement.functionDeclaration, isNotNull);
+  }
+
+  void test_parseStatement_functionDeclaration_noReturnType_typeParameters() {
+    enableGenericMethods = true;
+    FunctionDeclarationStatement statement =
+        parse4("parseStatement", "f(a, b) {};");
+    expect(statement.functionDeclaration, isNotNull);
+  }
+
+  void test_parseStatement_functionDeclaration_returnType() {
+    // TODO(brianwilkerson) Implement more tests for this method.
+    FunctionDeclarationStatement statement =
+        parse4("parseStatement", "int f(a, b) {};");
+    expect(statement.functionDeclaration, isNotNull);
+  }
+
+  void test_parseStatement_functionDeclaration_returnType_typeParameters() {
+    enableGenericMethods = true;
+    FunctionDeclarationStatement statement =
+        parse4("parseStatement", "int f<E>(a, b) {};");
+    expect(statement.functionDeclaration, isNotNull);
+  }
+
+  void test_parseStatement_mulipleLabels() {
+    LabeledStatement statement = parse4("parseStatement", "l: m: return x;");
+    expect(statement.labels, hasLength(2));
+    expect(statement.statement, isNotNull);
+  }
+
+  void test_parseStatement_noLabels() {
+    parse4("parseStatement", "return x;");
+  }
+
+  void test_parseStatement_singleLabel() {
+    LabeledStatement statement = parse4("parseStatement", "l: return x;");
+    expect(statement.labels, hasLength(1));
+    expect(statement.statement, isNotNull);
+  }
+
+  void test_parseStatements_multiple() {
+    List<Statement> statements =
+        ParserTestCase.parseStatements("return; return;", 2);
+    expect(statements, hasLength(2));
+  }
+
+  void test_parseStatements_single() {
+    List<Statement> statements = ParserTestCase.parseStatements("return;", 1);
+    expect(statements, hasLength(1));
+  }
+
+  void test_parseStringLiteral_adjacent() {
+    AdjacentStrings literal = parse4("parseStringLiteral", "'a' 'b'");
+    NodeList<StringLiteral> strings = literal.strings;
+    expect(strings, hasLength(2));
+    StringLiteral firstString = strings[0];
+    StringLiteral secondString = strings[1];
+    expect((firstString as SimpleStringLiteral).value, "a");
+    expect((secondString as SimpleStringLiteral).value, "b");
+  }
+
+  void test_parseStringLiteral_endsWithInterpolation() {
+    StringLiteral literal = parse4('parseStringLiteral', r"'x$y'");
+    expect(literal, new isInstanceOf<StringInterpolation>());
+    StringInterpolation interpolation = literal;
+    expect(interpolation.elements, hasLength(3));
+    expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
+    InterpolationString element0 = interpolation.elements[0];
+    expect(element0.value, 'x');
+    expect(
+        interpolation.elements[1], new isInstanceOf<InterpolationExpression>());
+    InterpolationExpression element1 = interpolation.elements[1];
+    expect(element1.expression, new isInstanceOf<SimpleIdentifier>());
+    expect(interpolation.elements[2], new isInstanceOf<InterpolationString>());
+    InterpolationString element2 = interpolation.elements[2];
+    expect(element2.value, '');
+  }
+
+  void test_parseStringLiteral_interpolated() {
+    StringInterpolation literal =
+        parse4("parseStringLiteral", "'a \${b} c \$this d'");
+    NodeList<InterpolationElement> elements = literal.elements;
+    expect(elements, hasLength(5));
+    expect(elements[0] is InterpolationString, isTrue);
+    expect(elements[1] is InterpolationExpression, isTrue);
+    expect(elements[2] is InterpolationString, isTrue);
+    expect(elements[3] is InterpolationExpression, isTrue);
+    expect(elements[4] is InterpolationString, isTrue);
+  }
+
+  void test_parseStringLiteral_multiline_encodedSpace() {
+    SimpleStringLiteral literal =
+        parse4("parseStringLiteral", "'''\\x20\na'''");
+    expect(literal.literal, isNotNull);
+    expect(literal.value, " \na");
+  }
+
+  void test_parseStringLiteral_multiline_endsWithInterpolation() {
+    StringLiteral literal = parse4('parseStringLiteral', r"'''x$y'''");
+    expect(literal, new isInstanceOf<StringInterpolation>());
+    StringInterpolation interpolation = literal;
+    expect(interpolation.elements, hasLength(3));
+    expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
+    InterpolationString element0 = interpolation.elements[0];
+    expect(element0.value, 'x');
+    expect(
+        interpolation.elements[1], new isInstanceOf<InterpolationExpression>());
+    InterpolationExpression element1 = interpolation.elements[1];
+    expect(element1.expression, new isInstanceOf<SimpleIdentifier>());
+    expect(interpolation.elements[2], new isInstanceOf<InterpolationString>());
+    InterpolationString element2 = interpolation.elements[2];
+    expect(element2.value, '');
+  }
+
+  void test_parseStringLiteral_multiline_escapedBackslash() {
+    SimpleStringLiteral literal = parse4("parseStringLiteral", "'''\\\\\na'''");
+    expect(literal.literal, isNotNull);
+    expect(literal.value, "\\\na");
+  }
+
+  void test_parseStringLiteral_multiline_escapedBackslash_raw() {
+    SimpleStringLiteral literal =
+        parse4("parseStringLiteral", "r'''\\\\\na'''");
+    expect(literal.literal, isNotNull);
+    expect(literal.value, "\\\\\na");
+  }
+
+  void test_parseStringLiteral_multiline_escapedEolMarker() {
+    SimpleStringLiteral literal = parse4("parseStringLiteral", "'''\\\na'''");
+    expect(literal.literal, isNotNull);
+    expect(literal.value, "a");
+  }
+
+  void test_parseStringLiteral_multiline_escapedEolMarker_raw() {
+    SimpleStringLiteral literal = parse4("parseStringLiteral", "r'''\\\na'''");
+    expect(literal.literal, isNotNull);
+    expect(literal.value, "a");
+  }
+
+  void test_parseStringLiteral_multiline_escapedSpaceAndEolMarker() {
+    SimpleStringLiteral literal =
+        parse4("parseStringLiteral", "'''\\ \\\na'''");
+    expect(literal.literal, isNotNull);
+    expect(literal.value, "a");
+  }
+
+  void test_parseStringLiteral_multiline_escapedSpaceAndEolMarker_raw() {
+    SimpleStringLiteral literal =
+        parse4("parseStringLiteral", "r'''\\ \\\na'''");
+    expect(literal.literal, isNotNull);
+    expect(literal.value, "a");
+  }
+
+  void test_parseStringLiteral_multiline_escapedTab() {
+    SimpleStringLiteral literal = parse4("parseStringLiteral", "'''\\t\na'''");
+    expect(literal.literal, isNotNull);
+    expect(literal.value, "\t\na");
+  }
+
+  void test_parseStringLiteral_multiline_escapedTab_raw() {
+    SimpleStringLiteral literal = parse4("parseStringLiteral", "r'''\\t\na'''");
+    expect(literal.literal, isNotNull);
+    expect(literal.value, "\\t\na");
+  }
+
+  void test_parseStringLiteral_multiline_quoteAfterInterpolation() {
+    StringLiteral literal = parse4('parseStringLiteral', r"""'''$x'y'''""");
+    expect(literal, new isInstanceOf<StringInterpolation>());
+    StringInterpolation interpolation = literal;
+    expect(interpolation.elements, hasLength(3));
+    expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
+    InterpolationString element0 = interpolation.elements[0];
+    expect(element0.value, '');
+    expect(
+        interpolation.elements[1], new isInstanceOf<InterpolationExpression>());
+    InterpolationExpression element1 = interpolation.elements[1];
+    expect(element1.expression, new isInstanceOf<SimpleIdentifier>());
+    expect(interpolation.elements[2], new isInstanceOf<InterpolationString>());
+    InterpolationString element2 = interpolation.elements[2];
+    expect(element2.value, "'y");
+  }
+
+  void test_parseStringLiteral_multiline_startsWithInterpolation() {
+    StringLiteral literal = parse4('parseStringLiteral', r"'''${x}y'''");
+    expect(literal, new isInstanceOf<StringInterpolation>());
+    StringInterpolation interpolation = literal;
+    expect(interpolation.elements, hasLength(3));
+    expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
+    InterpolationString element0 = interpolation.elements[0];
+    expect(element0.value, '');
+    expect(
+        interpolation.elements[1], new isInstanceOf<InterpolationExpression>());
+    InterpolationExpression element1 = interpolation.elements[1];
+    expect(element1.expression, new isInstanceOf<SimpleIdentifier>());
+    expect(interpolation.elements[2], new isInstanceOf<InterpolationString>());
+    InterpolationString element2 = interpolation.elements[2];
+    expect(element2.value, 'y');
+  }
+
+  void test_parseStringLiteral_multiline_twoSpaces() {
+    SimpleStringLiteral literal = parse4("parseStringLiteral", "'''  \na'''");
+    expect(literal.literal, isNotNull);
+    expect(literal.value, "a");
+  }
+
+  void test_parseStringLiteral_multiline_twoSpaces_raw() {
+    SimpleStringLiteral literal = parse4("parseStringLiteral", "r'''  \na'''");
+    expect(literal.literal, isNotNull);
+    expect(literal.value, "a");
+  }
+
+  void test_parseStringLiteral_multiline_untrimmed() {
+    SimpleStringLiteral literal = parse4("parseStringLiteral", "''' a\nb'''");
+    expect(literal.literal, isNotNull);
+    expect(literal.value, " a\nb");
+  }
+
+  void test_parseStringLiteral_quoteAfterInterpolation() {
+    StringLiteral literal = parse4('parseStringLiteral', r"""'$x"'""");
+    expect(literal, new isInstanceOf<StringInterpolation>());
+    StringInterpolation interpolation = literal;
+    expect(interpolation.elements, hasLength(3));
+    expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
+    InterpolationString element0 = interpolation.elements[0];
+    expect(element0.value, '');
+    expect(
+        interpolation.elements[1], new isInstanceOf<InterpolationExpression>());
+    InterpolationExpression element1 = interpolation.elements[1];
+    expect(element1.expression, new isInstanceOf<SimpleIdentifier>());
+    expect(interpolation.elements[2], new isInstanceOf<InterpolationString>());
+    InterpolationString element2 = interpolation.elements[2];
+    expect(element2.value, '"');
+  }
+
+  void test_parseStringLiteral_single() {
+    SimpleStringLiteral literal = parse4("parseStringLiteral", "'a'");
+    expect(literal.literal, isNotNull);
+    expect(literal.value, "a");
+  }
+
+  void test_parseStringLiteral_startsWithInterpolation() {
+    StringLiteral literal = parse4('parseStringLiteral', r"'${x}y'");
+    expect(literal, new isInstanceOf<StringInterpolation>());
+    StringInterpolation interpolation = literal;
+    expect(interpolation.elements, hasLength(3));
+    expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
+    InterpolationString element0 = interpolation.elements[0];
+    expect(element0.value, '');
+    expect(
+        interpolation.elements[1], new isInstanceOf<InterpolationExpression>());
+    InterpolationExpression element1 = interpolation.elements[1];
+    expect(element1.expression, new isInstanceOf<SimpleIdentifier>());
+    expect(interpolation.elements[2], new isInstanceOf<InterpolationString>());
+    InterpolationString element2 = interpolation.elements[2];
+    expect(element2.value, 'y');
+  }
+
+  void test_parseSuperConstructorInvocation_named() {
+    SuperConstructorInvocation invocation =
+        parse4("parseSuperConstructorInvocation", "super.a()");
+    expect(invocation.argumentList, isNotNull);
+    expect(invocation.constructorName, isNotNull);
+    expect(invocation.superKeyword, isNotNull);
+    expect(invocation.period, isNotNull);
+  }
+
+  void test_parseSuperConstructorInvocation_unnamed() {
+    SuperConstructorInvocation invocation =
+        parse4("parseSuperConstructorInvocation", "super()");
+    expect(invocation.argumentList, isNotNull);
+    expect(invocation.constructorName, isNull);
+    expect(invocation.superKeyword, isNotNull);
+    expect(invocation.period, isNull);
+  }
+
+  void test_parseSwitchStatement_case() {
+    SwitchStatement statement =
+        parse4("parseSwitchStatement", "switch (a) {case 1: return 'I';}");
+    expect(statement.switchKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.expression, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.leftBracket, isNotNull);
+    expect(statement.members, hasLength(1));
+    expect(statement.rightBracket, isNotNull);
+  }
+
+  void test_parseSwitchStatement_empty() {
+    SwitchStatement statement = parse4("parseSwitchStatement", "switch (a) {}");
+    expect(statement.switchKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.expression, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.leftBracket, isNotNull);
+    expect(statement.members, hasLength(0));
+    expect(statement.rightBracket, isNotNull);
+  }
+
+  void test_parseSwitchStatement_labeledCase() {
+    SwitchStatement statement =
+        parse4("parseSwitchStatement", "switch (a) {l1: l2: l3: case(1):}");
+    expect(statement.switchKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.expression, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.leftBracket, isNotNull);
+    expect(statement.members, hasLength(1));
+    expect(statement.members[0].labels, hasLength(3));
+    expect(statement.rightBracket, isNotNull);
+  }
+
+  void test_parseSwitchStatement_labeledStatementInCase() {
+    SwitchStatement statement = parse4(
+        "parseSwitchStatement", "switch (a) {case 0: f(); l1: g(); break;}");
+    expect(statement.switchKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.expression, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.leftBracket, isNotNull);
+    expect(statement.members, hasLength(1));
+    expect(statement.members[0].statements, hasLength(3));
+    expect(statement.rightBracket, isNotNull);
+  }
+
+  void test_parseSymbolLiteral_builtInIdentifier() {
+    SymbolLiteral literal =
+        parse4("parseSymbolLiteral", "#dynamic.static.abstract");
+    expect(literal.poundSign, isNotNull);
+    List<Token> components = literal.components;
+    expect(components, hasLength(3));
+    expect(components[0].lexeme, "dynamic");
+    expect(components[1].lexeme, "static");
+    expect(components[2].lexeme, "abstract");
+  }
+
+  void test_parseSymbolLiteral_multiple() {
+    SymbolLiteral literal = parse4("parseSymbolLiteral", "#a.b.c");
+    expect(literal.poundSign, isNotNull);
+    List<Token> components = literal.components;
+    expect(components, hasLength(3));
+    expect(components[0].lexeme, "a");
+    expect(components[1].lexeme, "b");
+    expect(components[2].lexeme, "c");
+  }
+
+  void test_parseSymbolLiteral_operator() {
+    SymbolLiteral literal = parse4("parseSymbolLiteral", "#==");
+    expect(literal.poundSign, isNotNull);
+    List<Token> components = literal.components;
+    expect(components, hasLength(1));
+    expect(components[0].lexeme, "==");
+  }
+
+  void test_parseSymbolLiteral_single() {
+    SymbolLiteral literal = parse4("parseSymbolLiteral", "#a");
+    expect(literal.poundSign, isNotNull);
+    List<Token> components = literal.components;
+    expect(components, hasLength(1));
+    expect(components[0].lexeme, "a");
+  }
+
+  void test_parseSymbolLiteral_void() {
+    SymbolLiteral literal = parse4("parseSymbolLiteral", "#void");
+    expect(literal.poundSign, isNotNull);
+    List<Token> components = literal.components;
+    expect(components, hasLength(1));
+    expect(components[0].lexeme, "void");
+  }
+
+  void test_parseThrowExpression() {
+    ThrowExpression expression = parse4("parseThrowExpression", "throw x;");
+    expect(expression.throwKeyword, isNotNull);
+    expect(expression.expression, isNotNull);
+  }
+
+  void test_parseThrowExpressionWithoutCascade() {
+    ThrowExpression expression =
+        parse4("parseThrowExpressionWithoutCascade", "throw x;");
+    expect(expression.throwKeyword, isNotNull);
+    expect(expression.expression, isNotNull);
+  }
+
+  void test_parseTryStatement_catch() {
+    TryStatement statement = parse4("parseTryStatement", "try {} catch (e) {}");
+    expect(statement.tryKeyword, isNotNull);
+    expect(statement.body, isNotNull);
+    NodeList<CatchClause> catchClauses = statement.catchClauses;
+    expect(catchClauses, hasLength(1));
+    CatchClause clause = catchClauses[0];
+    expect(clause.onKeyword, isNull);
+    expect(clause.exceptionType, isNull);
+    expect(clause.catchKeyword, isNotNull);
+    expect(clause.exceptionParameter, isNotNull);
+    expect(clause.comma, isNull);
+    expect(clause.stackTraceParameter, isNull);
+    expect(clause.body, isNotNull);
+    expect(statement.finallyKeyword, isNull);
+    expect(statement.finallyBlock, isNull);
+  }
+
+  void test_parseTryStatement_catch_finally() {
+    TryStatement statement =
+        parse4("parseTryStatement", "try {} catch (e, s) {} finally {}");
+    expect(statement.tryKeyword, isNotNull);
+    expect(statement.body, isNotNull);
+    NodeList<CatchClause> catchClauses = statement.catchClauses;
+    expect(catchClauses, hasLength(1));
+    CatchClause clause = catchClauses[0];
+    expect(clause.onKeyword, isNull);
+    expect(clause.exceptionType, isNull);
+    expect(clause.catchKeyword, isNotNull);
+    expect(clause.exceptionParameter, isNotNull);
+    expect(clause.comma, isNotNull);
+    expect(clause.stackTraceParameter, isNotNull);
+    expect(clause.body, isNotNull);
+    expect(statement.finallyKeyword, isNotNull);
+    expect(statement.finallyBlock, isNotNull);
+  }
+
+  void test_parseTryStatement_finally() {
+    TryStatement statement = parse4("parseTryStatement", "try {} finally {}");
+    expect(statement.tryKeyword, isNotNull);
+    expect(statement.body, isNotNull);
+    expect(statement.catchClauses, hasLength(0));
+    expect(statement.finallyKeyword, isNotNull);
+    expect(statement.finallyBlock, isNotNull);
+  }
+
+  void test_parseTryStatement_multiple() {
+    TryStatement statement = parse4("parseTryStatement",
+        "try {} on NPE catch (e) {} on Error {} catch (e) {}");
+    expect(statement.tryKeyword, isNotNull);
+    expect(statement.body, isNotNull);
+    expect(statement.catchClauses, hasLength(3));
+    expect(statement.finallyKeyword, isNull);
+    expect(statement.finallyBlock, isNull);
+  }
+
+  void test_parseTryStatement_on() {
+    TryStatement statement = parse4("parseTryStatement", "try {} on Error {}");
+    expect(statement.tryKeyword, isNotNull);
+    expect(statement.body, isNotNull);
+    NodeList<CatchClause> catchClauses = statement.catchClauses;
+    expect(catchClauses, hasLength(1));
+    CatchClause clause = catchClauses[0];
+    expect(clause.onKeyword, isNotNull);
+    expect(clause.exceptionType, isNotNull);
+    expect(clause.catchKeyword, isNull);
+    expect(clause.exceptionParameter, isNull);
+    expect(clause.comma, isNull);
+    expect(clause.stackTraceParameter, isNull);
+    expect(clause.body, isNotNull);
+    expect(statement.finallyKeyword, isNull);
+    expect(statement.finallyBlock, isNull);
+  }
+
+  void test_parseTryStatement_on_catch() {
+    TryStatement statement =
+        parse4("parseTryStatement", "try {} on Error catch (e, s) {}");
+    expect(statement.tryKeyword, isNotNull);
+    expect(statement.body, isNotNull);
+    NodeList<CatchClause> catchClauses = statement.catchClauses;
+    expect(catchClauses, hasLength(1));
+    CatchClause clause = catchClauses[0];
+    expect(clause.onKeyword, isNotNull);
+    expect(clause.exceptionType, isNotNull);
+    expect(clause.catchKeyword, isNotNull);
+    expect(clause.exceptionParameter, isNotNull);
+    expect(clause.comma, isNotNull);
+    expect(clause.stackTraceParameter, isNotNull);
+    expect(clause.body, isNotNull);
+    expect(statement.finallyKeyword, isNull);
+    expect(statement.finallyBlock, isNull);
+  }
+
+  void test_parseTryStatement_on_catch_finally() {
+    TryStatement statement = parse4(
+        "parseTryStatement", "try {} on Error catch (e, s) {} finally {}");
+    expect(statement.tryKeyword, isNotNull);
+    expect(statement.body, isNotNull);
+    NodeList<CatchClause> catchClauses = statement.catchClauses;
+    expect(catchClauses, hasLength(1));
+    CatchClause clause = catchClauses[0];
+    expect(clause.onKeyword, isNotNull);
+    expect(clause.exceptionType, isNotNull);
+    expect(clause.catchKeyword, isNotNull);
+    expect(clause.exceptionParameter, isNotNull);
+    expect(clause.comma, isNotNull);
+    expect(clause.stackTraceParameter, isNotNull);
+    expect(clause.body, isNotNull);
+    expect(statement.finallyKeyword, isNotNull);
+    expect(statement.finallyBlock, isNotNull);
+  }
+
+  void test_parseTypeAlias_function_noParameters() {
+    FunctionTypeAlias typeAlias = parse("parseTypeAlias",
+        <Object>[emptyCommentAndMetadata()], "typedef bool F();");
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.parameters, isNotNull);
+    expect(typeAlias.returnType, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+  }
+
+  void test_parseTypeAlias_function_noReturnType() {
+    FunctionTypeAlias typeAlias = parse(
+        "parseTypeAlias", <Object>[emptyCommentAndMetadata()], "typedef F();");
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.parameters, isNotNull);
+    expect(typeAlias.returnType, isNull);
+    expect(typeAlias.semicolon, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+  }
+
+  void test_parseTypeAlias_function_parameterizedReturnType() {
+    FunctionTypeAlias typeAlias = parse("parseTypeAlias",
+        <Object>[emptyCommentAndMetadata()], "typedef A<B> F();");
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.parameters, isNotNull);
+    expect(typeAlias.returnType, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+  }
+
+  void test_parseTypeAlias_function_parameters() {
+    FunctionTypeAlias typeAlias = parse("parseTypeAlias",
+        <Object>[emptyCommentAndMetadata()], "typedef bool F(Object value);");
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.parameters, isNotNull);
+    expect(typeAlias.returnType, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+  }
+
+  void test_parseTypeAlias_function_typeParameters() {
+    FunctionTypeAlias typeAlias = parse("parseTypeAlias",
+        <Object>[emptyCommentAndMetadata()], "typedef bool F<E>();");
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.parameters, isNotNull);
+    expect(typeAlias.returnType, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    expect(typeAlias.typeParameters, isNotNull);
+  }
+
+  void test_parseTypeAlias_function_voidReturnType() {
+    FunctionTypeAlias typeAlias = parse("parseTypeAlias",
+        <Object>[emptyCommentAndMetadata()], "typedef void F();");
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.parameters, isNotNull);
+    expect(typeAlias.returnType, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+  }
+
+  void test_parseTypeArgumentList_empty() {
+    TypeArgumentList argumentList = parse4(
+        "parseTypeArgumentList", "<>", [ParserErrorCode.EXPECTED_TYPE_NAME]);
+    expect(argumentList.leftBracket, isNotNull);
+    expect(argumentList.arguments, hasLength(1));
+    expect(argumentList.rightBracket, isNotNull);
+  }
+
+  void test_parseTypeArgumentList_multiple() {
+    TypeArgumentList argumentList =
+        parse4("parseTypeArgumentList", "<int, int, int>");
+    expect(argumentList.leftBracket, isNotNull);
+    expect(argumentList.arguments, hasLength(3));
+    expect(argumentList.rightBracket, isNotNull);
+  }
+
+  void test_parseTypeArgumentList_nested() {
+    TypeArgumentList argumentList = parse4("parseTypeArgumentList", "<A<B>>");
+    expect(argumentList.leftBracket, isNotNull);
+    expect(argumentList.arguments, hasLength(1));
+    TypeName argument = argumentList.arguments[0];
+    expect(argument, isNotNull);
+    TypeArgumentList innerList = argument.typeArguments;
+    expect(innerList, isNotNull);
+    expect(innerList.arguments, hasLength(1));
+    expect(argumentList.rightBracket, isNotNull);
+  }
+
+  void test_parseTypeArgumentList_nested_withComment_double() {
+    TypeArgumentList argumentList =
+        parse4("parseTypeArgumentList", "<A<B /* 0 */ >>");
+    expect(argumentList.leftBracket, isNotNull);
+    expect(argumentList.rightBracket, isNotNull);
+    expect(argumentList.arguments, hasLength(1));
+
+    TypeName argument = argumentList.arguments[0];
+    expect(argument, isNotNull);
+
+    TypeArgumentList innerList = argument.typeArguments;
+    expect(innerList, isNotNull);
+    expect(innerList.leftBracket, isNotNull);
+    expect(innerList.arguments, hasLength(1));
+    expect(innerList.rightBracket, isNotNull);
+    expect(innerList.rightBracket.precedingComments, isNotNull);
+  }
+
+  void test_parseTypeArgumentList_nested_withComment_tripple() {
+    TypeArgumentList argumentList =
+        parse4("parseTypeArgumentList", "<A<B<C /* 0 */ >>>");
+    expect(argumentList.leftBracket, isNotNull);
+    expect(argumentList.rightBracket, isNotNull);
+    expect(argumentList.arguments, hasLength(1));
+
+    TypeName argument = argumentList.arguments[0];
+    expect(argument, isNotNull);
+
+    TypeArgumentList innerList = argument.typeArguments;
+    expect(innerList, isNotNull);
+    expect(innerList.leftBracket, isNotNull);
+    expect(innerList.arguments, hasLength(1));
+    expect(innerList.rightBracket, isNotNull);
+
+    TypeName innerArgument = innerList.arguments[0];
+    expect(innerArgument, isNotNull);
+
+    TypeArgumentList innerInnerList = innerArgument.typeArguments;
+    expect(innerInnerList, isNotNull);
+    expect(innerInnerList.leftBracket, isNotNull);
+    expect(innerInnerList.arguments, hasLength(1));
+    expect(innerInnerList.rightBracket, isNotNull);
+    expect(innerInnerList.rightBracket.precedingComments, isNotNull);
+  }
+
+  void test_parseTypeArgumentList_single() {
+    TypeArgumentList argumentList = parse4("parseTypeArgumentList", "<int>");
+    expect(argumentList.leftBracket, isNotNull);
+    expect(argumentList.arguments, hasLength(1));
+    expect(argumentList.rightBracket, isNotNull);
+  }
+
+  void test_parseTypeName_parameterized() {
+    TypeName typeName = parse4("parseTypeName", "List<int>");
+    expect(typeName.name, isNotNull);
+    expect(typeName.typeArguments, isNotNull);
+  }
+
+  void test_parseTypeName_simple() {
+    TypeName typeName = parse4("parseTypeName", "int");
+    expect(typeName.name, isNotNull);
+    expect(typeName.typeArguments, isNull);
+  }
+
+  void test_parseTypeParameter_bounded() {
+    TypeParameter parameter = parse4("parseTypeParameter", "A extends B");
+    expect(parameter.bound, isNotNull);
+    expect(parameter.extendsKeyword, isNotNull);
+    expect(parameter.name, isNotNull);
+  }
+
+  void test_parseTypeParameter_simple() {
+    TypeParameter parameter = parse4("parseTypeParameter", "A");
+    expect(parameter.bound, isNull);
+    expect(parameter.extendsKeyword, isNull);
+    expect(parameter.name, isNotNull);
+  }
+
+  void test_parseTypeParameterList_multiple() {
+    TypeParameterList parameterList =
+        parse4("parseTypeParameterList", "<A, B extends C, D>");
+    expect(parameterList.leftBracket, isNotNull);
+    expect(parameterList.rightBracket, isNotNull);
+    expect(parameterList.typeParameters, hasLength(3));
+  }
+
+  void test_parseTypeParameterList_parameterizedWithTrailingEquals() {
+    TypeParameterList parameterList =
+        parse4("parseTypeParameterList", "<A extends B<E>>=");
+    expect(parameterList.leftBracket, isNotNull);
+    expect(parameterList.rightBracket, isNotNull);
+    expect(parameterList.typeParameters, hasLength(1));
+  }
+
+  void test_parseTypeParameterList_single() {
+    TypeParameterList parameterList = parse4("parseTypeParameterList", "<A>");
+    expect(parameterList.leftBracket, isNotNull);
+    expect(parameterList.rightBracket, isNotNull);
+    expect(parameterList.typeParameters, hasLength(1));
+  }
+
+  void test_parseTypeParameterList_withTrailingEquals() {
+    TypeParameterList parameterList = parse4("parseTypeParameterList", "<A>=");
+    expect(parameterList.leftBracket, isNotNull);
+    expect(parameterList.rightBracket, isNotNull);
+    expect(parameterList.typeParameters, hasLength(1));
+  }
+
+  void test_parseUnaryExpression_decrement_normal() {
+    PrefixExpression expression = parse4("parseUnaryExpression", "--x");
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.MINUS_MINUS);
+    expect(expression.operand, isNotNull);
+  }
+
+  void test_parseUnaryExpression_decrement_super() {
+    PrefixExpression expression = parse4("parseUnaryExpression", "--super");
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.MINUS);
+    Expression innerExpression = expression.operand;
+    expect(innerExpression, isNotNull);
+    expect(innerExpression is PrefixExpression, isTrue);
+    PrefixExpression operand = innerExpression as PrefixExpression;
+    expect(operand.operator, isNotNull);
+    expect(operand.operator.type, TokenType.MINUS);
+    expect(operand.operand, isNotNull);
+  }
+
+  void test_parseUnaryExpression_decrement_super_propertyAccess() {
+    PrefixExpression expression = parse4("parseUnaryExpression", "--super.x");
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.MINUS_MINUS);
+    expect(expression.operand, isNotNull);
+    PropertyAccess operand = expression.operand as PropertyAccess;
+    expect(operand.target is SuperExpression, isTrue);
+    expect(operand.propertyName.name, "x");
+  }
+
+  void test_parseUnaryExpression_decrement_super_withComment() {
+    PrefixExpression expression =
+        parse4("parseUnaryExpression", "/* 0 */ --super");
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.MINUS);
+    expect(expression.operator.precedingComments, isNotNull);
+    Expression innerExpression = expression.operand;
+    expect(innerExpression, isNotNull);
+    expect(innerExpression is PrefixExpression, isTrue);
+    PrefixExpression operand = innerExpression as PrefixExpression;
+    expect(operand.operator, isNotNull);
+    expect(operand.operator.type, TokenType.MINUS);
+    expect(operand.operand, isNotNull);
+  }
+
+  void test_parseUnaryExpression_increment_normal() {
+    PrefixExpression expression = parse4("parseUnaryExpression", "++x");
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.PLUS_PLUS);
+    expect(expression.operand, isNotNull);
+  }
+
+  void test_parseUnaryExpression_increment_super_index() {
+    PrefixExpression expression = parse4("parseUnaryExpression", "++super[0]");
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.PLUS_PLUS);
+    expect(expression.operand, isNotNull);
+    IndexExpression operand = expression.operand as IndexExpression;
+    expect(operand.realTarget is SuperExpression, isTrue);
+    expect(operand.index is IntegerLiteral, isTrue);
+  }
+
+  void test_parseUnaryExpression_increment_super_propertyAccess() {
+    PrefixExpression expression = parse4("parseUnaryExpression", "++super.x");
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.PLUS_PLUS);
+    expect(expression.operand, isNotNull);
+    PropertyAccess operand = expression.operand as PropertyAccess;
+    expect(operand.target is SuperExpression, isTrue);
+    expect(operand.propertyName.name, "x");
+  }
+
+  void test_parseUnaryExpression_minus_normal() {
+    PrefixExpression expression = parse4("parseUnaryExpression", "-x");
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.MINUS);
+    expect(expression.operand, isNotNull);
+  }
+
+  void test_parseUnaryExpression_minus_super() {
+    PrefixExpression expression = parse4("parseUnaryExpression", "-super");
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.MINUS);
+    expect(expression.operand, isNotNull);
+  }
+
+  void test_parseUnaryExpression_not_normal() {
+    PrefixExpression expression = parse4("parseUnaryExpression", "!x");
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.BANG);
+    expect(expression.operand, isNotNull);
+  }
+
+  void test_parseUnaryExpression_not_super() {
+    PrefixExpression expression = parse4("parseUnaryExpression", "!super");
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.BANG);
+    expect(expression.operand, isNotNull);
+  }
+
+  void test_parseUnaryExpression_tilda_normal() {
+    PrefixExpression expression = parse4("parseUnaryExpression", "~x");
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.TILDE);
+    expect(expression.operand, isNotNull);
+  }
+
+  void test_parseUnaryExpression_tilda_super() {
+    PrefixExpression expression = parse4("parseUnaryExpression", "~super");
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.TILDE);
+    expect(expression.operand, isNotNull);
+  }
+
+  void test_parseVariableDeclaration_equals() {
+    VariableDeclaration declaration =
+        parse4("parseVariableDeclaration", "a = b");
+    expect(declaration.name, isNotNull);
+    expect(declaration.equals, isNotNull);
+    expect(declaration.initializer, isNotNull);
+  }
+
+  void test_parseVariableDeclaration_noEquals() {
+    VariableDeclaration declaration = parse4("parseVariableDeclaration", "a");
+    expect(declaration.name, isNotNull);
+    expect(declaration.equals, isNull);
+    expect(declaration.initializer, isNull);
+  }
+
+  void test_parseVariableDeclarationListAfterMetadata_const_noType() {
+    VariableDeclarationList declarationList = parse(
+        "parseVariableDeclarationListAfterMetadata",
+        <Object>[emptyCommentAndMetadata()],
+        "const a");
+    expect(declarationList.keyword, isNotNull);
+    expect(declarationList.type, isNull);
+    expect(declarationList.variables, hasLength(1));
+  }
+
+  void test_parseVariableDeclarationListAfterMetadata_const_type() {
+    VariableDeclarationList declarationList = parse(
+        "parseVariableDeclarationListAfterMetadata",
+        <Object>[emptyCommentAndMetadata()],
+        "const A a");
+    expect(declarationList.keyword, isNotNull);
+    expect(declarationList.type, isNotNull);
+    expect(declarationList.variables, hasLength(1));
+  }
+
+  void test_parseVariableDeclarationListAfterMetadata_final_noType() {
+    VariableDeclarationList declarationList = parse(
+        "parseVariableDeclarationListAfterMetadata",
+        <Object>[emptyCommentAndMetadata()],
+        "final a");
+    expect(declarationList.keyword, isNotNull);
+    expect(declarationList.type, isNull);
+    expect(declarationList.variables, hasLength(1));
+  }
+
+  void test_parseVariableDeclarationListAfterMetadata_final_type() {
+    VariableDeclarationList declarationList = parse(
+        "parseVariableDeclarationListAfterMetadata",
+        <Object>[emptyCommentAndMetadata()],
+        "final A a");
+    expect(declarationList.keyword, isNotNull);
+    expect(declarationList.type, isNotNull);
+    expect(declarationList.variables, hasLength(1));
+  }
+
+  void test_parseVariableDeclarationListAfterMetadata_type_multiple() {
+    VariableDeclarationList declarationList = parse(
+        "parseVariableDeclarationListAfterMetadata",
+        <Object>[emptyCommentAndMetadata()],
+        "A a, b, c");
+    expect(declarationList.keyword, isNull);
+    expect(declarationList.type, isNotNull);
+    expect(declarationList.variables, hasLength(3));
+  }
+
+  void test_parseVariableDeclarationListAfterMetadata_type_single() {
+    VariableDeclarationList declarationList = parse(
+        "parseVariableDeclarationListAfterMetadata",
+        <Object>[emptyCommentAndMetadata()],
+        "A a");
+    expect(declarationList.keyword, isNull);
+    expect(declarationList.type, isNotNull);
+    expect(declarationList.variables, hasLength(1));
+  }
+
+  void test_parseVariableDeclarationListAfterMetadata_var_multiple() {
+    VariableDeclarationList declarationList = parse(
+        "parseVariableDeclarationListAfterMetadata",
+        <Object>[emptyCommentAndMetadata()],
+        "var a, b, c");
+    expect(declarationList.keyword, isNotNull);
+    expect(declarationList.type, isNull);
+    expect(declarationList.variables, hasLength(3));
+  }
+
+  void test_parseVariableDeclarationListAfterMetadata_var_single() {
+    VariableDeclarationList declarationList = parse(
+        "parseVariableDeclarationListAfterMetadata",
+        <Object>[emptyCommentAndMetadata()],
+        "var a");
+    expect(declarationList.keyword, isNotNull);
+    expect(declarationList.type, isNull);
+    expect(declarationList.variables, hasLength(1));
+  }
+
+  void test_parseVariableDeclarationListAfterType_type() {
+    TypeName type = new TypeName(new SimpleIdentifier(null), null);
+    VariableDeclarationList declarationList = parse(
+        "parseVariableDeclarationListAfterType",
+        <Object>[emptyCommentAndMetadata(), null, type],
+        "a");
+    expect(declarationList.keyword, isNull);
+    expect(declarationList.type, type);
+    expect(declarationList.variables, hasLength(1));
+  }
+
+  void test_parseVariableDeclarationListAfterType_var() {
+    Token keyword = TokenFactory.tokenFromKeyword(Keyword.VAR);
+    VariableDeclarationList declarationList = parse(
+        "parseVariableDeclarationListAfterType",
+        <Object>[emptyCommentAndMetadata(), keyword, null],
+        "a, b, c");
+    expect(declarationList.keyword, keyword);
+    expect(declarationList.type, isNull);
+    expect(declarationList.variables, hasLength(3));
+  }
+
+  void test_parseVariableDeclarationStatementAfterMetadata_multiple() {
+    VariableDeclarationStatement statement = parse(
+        "parseVariableDeclarationStatementAfterMetadata",
+        <Object>[emptyCommentAndMetadata()],
+        "var x, y, z;");
+    expect(statement.semicolon, isNotNull);
+    VariableDeclarationList variableList = statement.variables;
+    expect(variableList, isNotNull);
+    expect(variableList.variables, hasLength(3));
+  }
+
+  void test_parseVariableDeclarationStatementAfterMetadata_single() {
+    VariableDeclarationStatement statement = parse(
+        "parseVariableDeclarationStatementAfterMetadata",
+        <Object>[emptyCommentAndMetadata()],
+        "var x;");
+    expect(statement.semicolon, isNotNull);
+    VariableDeclarationList variableList = statement.variables;
+    expect(variableList, isNotNull);
+    expect(variableList.variables, hasLength(1));
+  }
+
+  void test_parseWhileStatement() {
+    WhileStatement statement = parse4("parseWhileStatement", "while (x) {}");
+    expect(statement.whileKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
+  }
+
+  void test_parseWithClause_multiple() {
+    WithClause clause = parse4("parseWithClause", "with A, B, C");
+    expect(clause.withKeyword, isNotNull);
+    expect(clause.mixinTypes, hasLength(3));
+  }
+
+  void test_parseWithClause_single() {
+    WithClause clause = parse4("parseWithClause", "with M");
+    expect(clause.withKeyword, isNotNull);
+    expect(clause.mixinTypes, hasLength(1));
+  }
+
+  void test_parseYieldStatement_each() {
+    YieldStatement statement = parse4("parseYieldStatement", "yield* x;");
+    expect(statement.yieldKeyword, isNotNull);
+    expect(statement.star, isNotNull);
+    expect(statement.expression, isNotNull);
+    expect(statement.semicolon, isNotNull);
+  }
+
+  void test_parseYieldStatement_normal() {
+    YieldStatement statement = parse4("parseYieldStatement", "yield x;");
+    expect(statement.yieldKeyword, isNotNull);
+    expect(statement.star, isNull);
+    expect(statement.expression, isNotNull);
+    expect(statement.semicolon, isNotNull);
+  }
+
+  void test_skipPrefixedIdentifier_invalid() {
+    Token following = _skip("skipPrefixedIdentifier", "+");
+    expect(following, isNull);
+  }
+
+  void test_skipPrefixedIdentifier_notPrefixed() {
+    Token following = _skip("skipPrefixedIdentifier", "a +");
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
+  }
+
+  void test_skipPrefixedIdentifier_prefixed() {
+    Token following = _skip("skipPrefixedIdentifier", "a.b +");
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
+  }
+
+  void test_skipReturnType_invalid() {
+    Token following = _skip("skipReturnType", "+");
+    expect(following, isNull);
+  }
+
+  void test_skipReturnType_type() {
+    Token following = _skip("skipReturnType", "C +");
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
+  }
+
+  void test_skipReturnType_void() {
+    Token following = _skip("skipReturnType", "void +");
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
+  }
+
+  void test_skipSimpleIdentifier_identifier() {
+    Token following = _skip("skipSimpleIdentifier", "i +");
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
+  }
+
+  void test_skipSimpleIdentifier_invalid() {
+    Token following = _skip("skipSimpleIdentifier", "9 +");
+    expect(following, isNull);
+  }
+
+  void test_skipSimpleIdentifier_pseudoKeyword() {
+    Token following = _skip("skipSimpleIdentifier", "as +");
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
+  }
+
+  void test_skipStringLiteral_adjacent() {
+    Token following = _skip("skipStringLiteral", "'a' 'b' +");
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
+  }
+
+  void test_skipStringLiteral_interpolated() {
+    Token following = _skip("skipStringLiteral", "'a\${b}c' +");
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
+  }
+
+  void test_skipStringLiteral_invalid() {
+    Token following = _skip("skipStringLiteral", "a");
+    expect(following, isNull);
+  }
+
+  void test_skipStringLiteral_single() {
+    Token following = _skip("skipStringLiteral", "'a' +");
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
+  }
+
+  void test_skipTypeArgumentList_invalid() {
+    Token following = _skip("skipTypeArgumentList", "+");
+    expect(following, isNull);
+  }
+
+  void test_skipTypeArgumentList_multiple() {
+    Token following = _skip("skipTypeArgumentList", "<E, F, G> +");
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
+  }
+
+  void test_skipTypeArgumentList_single() {
+    Token following = _skip("skipTypeArgumentList", "<E> +");
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
+  }
+
+  void test_skipTypeName_invalid() {
+    Token following = _skip("skipTypeName", "+");
+    expect(following, isNull);
+  }
+
+  void test_skipTypeName_parameterized() {
+    Token following = _skip("skipTypeName", "C<E<F<G>>> +");
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
+  }
+
+  void test_skipTypeName_simple() {
+    Token following = _skip("skipTypeName", "C +");
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
+  }
+
+  /**
+   * Invoke the method [Parser.computeStringValue] with the given argument.
+   *
+   * @param lexeme the argument to the method
+   * @param first `true` if this is the first token in a string literal
+   * @param last `true` if this is the last token in a string literal
+   * @return the result of invoking the method
+   * @throws Exception if the method could not be invoked or throws an exception
+   */
+  String _computeStringValue(String lexeme, bool first, bool last) {
+    AnalysisErrorListener listener =
+        new AnalysisErrorListener_SimpleParserTest_computeStringValue();
+    Parser parser = new Parser(null, listener);
+    return invokeParserMethodImpl(
+            parser, "computeStringValue", <Object>[lexeme, first, last], null)
+        as String;
+  }
+
+  /**
+   * Invoke the method [Parser.createSyntheticIdentifier] with the parser set to the token
+   * stream produced by scanning the given source.
+   *
+   * @param source the source to be scanned to produce the token stream being tested
+   * @return the result of invoking the method
+   * @throws Exception if the method could not be invoked or throws an exception
+   */
+  SimpleIdentifier _createSyntheticIdentifier() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    return invokeParserMethod2("createSyntheticIdentifier", "", listener);
+  }
+
+  /**
+   * Invoke the method [Parser.createSyntheticIdentifier] with the parser set to the token
+   * stream produced by scanning the given source.
+   *
+   * @param source the source to be scanned to produce the token stream being tested
+   * @return the result of invoking the method
+   * @throws Exception if the method could not be invoked or throws an exception
+   */
+  SimpleStringLiteral _createSyntheticStringLiteral() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    return invokeParserMethod2("createSyntheticStringLiteral", "", listener);
+  }
+
+  /**
+   * Invoke the method [Parser.isFunctionDeclaration] with the parser set to the token
+   * stream produced by scanning the given source.
+   *
+   * @param source the source to be scanned to produce the token stream being tested
+   * @return the result of invoking the method
+   * @throws Exception if the method could not be invoked or throws an exception
+   */
+  bool _isFunctionDeclaration(String source) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    return invokeParserMethod2("isFunctionDeclaration", source, listener)
+        as bool;
+  }
+
+  /**
+   * Invoke the method [Parser.isFunctionExpression] with the parser set to the token stream
+   * produced by scanning the given source.
+   *
+   * @param source the source to be scanned to produce the token stream being tested
+   * @return the result of invoking the method
+   * @throws Exception if the method could not be invoked or throws an exception
+   */
+  bool _isFunctionExpression(String source) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    //
+    // Scan the source.
+    //
+    Scanner scanner =
+        new Scanner(null, new CharSequenceReader(source), listener);
+    Token tokenStream = scanner.tokenize();
+    //
+    // Parse the source.
+    //
+    Parser parser = new Parser(null, listener);
+    return invokeParserMethodImpl(
+            parser, "isFunctionExpression", <Object>[tokenStream], tokenStream)
+        as bool;
+  }
+
+  /**
+   * Invoke the method [Parser.isInitializedVariableDeclaration] with the parser set to the
+   * token stream produced by scanning the given source.
+   *
+   * @param source the source to be scanned to produce the token stream being tested
+   * @return the result of invoking the method
+   * @throws Exception if the method could not be invoked or throws an exception
+   */
+  bool _isInitializedVariableDeclaration(String source) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    return invokeParserMethod2(
+        "isInitializedVariableDeclaration", source, listener) as bool;
+  }
+
+  /**
+   * Invoke the method [Parser.isSwitchMember] with the parser set to the token stream
+   * produced by scanning the given source.
+   *
+   * @param source the source to be scanned to produce the token stream being tested
+   * @return the result of invoking the method
+   * @throws Exception if the method could not be invoked or throws an exception
+   */
+  bool _isSwitchMember(String source) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    return invokeParserMethod2("isSwitchMember", source, listener) as bool;
+  }
+
+  /**
+   * Parse the given source as a compilation unit.
+   *
+   * @param source the source to be parsed
+   * @param errorCodes the error codes of the errors that are expected to be found
+   * @return the compilation unit that was parsed
+   * @throws Exception if the source could not be parsed, if the compilation errors in the source do
+   *           not match those that are expected, or if the result would have been `null`
+   */
+  CompilationUnit _parseDirectives(String source,
+      [List<ErrorCode> errorCodes = ErrorCode.EMPTY_LIST]) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scanner scanner =
+        new Scanner(null, new CharSequenceReader(source), listener);
+    listener.setLineInfo(new TestSource(), scanner.lineStarts);
+    Token token = scanner.tokenize();
+    Parser parser = new Parser(null, listener);
+    CompilationUnit unit = parser.parseDirectives(token);
+    expect(unit, isNotNull);
+    expect(unit.declarations, hasLength(0));
+    listener.assertErrorsWithCodes(errorCodes);
+    return unit;
+  }
+
+  /**
+   * Invoke a "skip" method in [Parser]. The method is assumed to take a token as it's
+   * parameter and is given the first token in the scanned source.
+   *
+   * @param methodName the name of the method that should be invoked
+   * @param source the source to be processed by the method
+   * @return the result of invoking the method
+   * @throws Exception if the method could not be invoked or throws an exception
+   * @throws AssertionFailedError if the result is `null`
+   */
+  Token _skip(String methodName, String source) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    //
+    // Scan the source.
+    //
+    Scanner scanner =
+        new Scanner(null, new CharSequenceReader(source), listener);
+    Token tokenStream = scanner.tokenize();
+    //
+    // Parse the source.
+    //
+    Parser parser = new Parser(null, listener);
+    return invokeParserMethodImpl(
+        parser, methodName, <Object>[tokenStream], tokenStream) as Token;
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/resolver_test.dart b/mojo/public/dart/third_party/analyzer/test/generated/resolver_test.dart
new file mode 100644
index 0000000..9c30594
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/generated/resolver_test.dart
@@ -0,0 +1,14526 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.resolver_test;
+
+import 'dart:collection';
+
+import 'package:analyzer/src/context/context.dart' as newContext;
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/element_resolver.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/java_engine_io.dart';
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/sdk_io.dart' show DirectoryBasedDartSdk;
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/static_type_analyzer.dart';
+import 'package:analyzer/src/generated/testing/ast_factory.dart';
+import 'package:analyzer/src/generated/testing/element_factory.dart';
+import 'package:analyzer/src/generated/testing/test_type_provider.dart';
+import 'package:analyzer/src/generated/testing/token_factory.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+import '../utils.dart';
+import 'test_support.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(AnalysisDeltaTest);
+  runReflectiveTests(ChangeSetTest);
+  runReflectiveTests(EnclosedScopeTest);
+  runReflectiveTests(LibraryImportScopeTest);
+  runReflectiveTests(LibraryScopeTest);
+  runReflectiveTests(ScopeTest);
+  runReflectiveTests(ElementResolverTest);
+  runReflectiveTests(InheritanceManagerTest);
+  if (!AnalysisEngine.instance.useTaskModel) {
+    runReflectiveTests(LibraryElementBuilderTest);
+  }
+  if (!AnalysisEngine.instance.useTaskModel) {
+    runReflectiveTests(LibraryResolver2Test);
+  }
+  if (!AnalysisEngine.instance.useTaskModel) {
+    runReflectiveTests(LibraryResolverTest);
+  }
+  runReflectiveTests(LibraryTest);
+  runReflectiveTests(StaticTypeAnalyzerTest);
+  runReflectiveTests(StaticTypeAnalyzer2Test);
+  runReflectiveTests(SubtypeManagerTest);
+  runReflectiveTests(TypeOverrideManagerTest);
+  runReflectiveTests(TypeProviderImplTest);
+  runReflectiveTests(TypeResolverVisitorTest);
+  runReflectiveTests(CheckedModeCompileTimeErrorCodeTest);
+  runReflectiveTests(ErrorResolverTest);
+  runReflectiveTests(HintCodeTest);
+  runReflectiveTests(MemberMapTest);
+  runReflectiveTests(NonHintCodeTest);
+  runReflectiveTests(SimpleResolverTest);
+  runReflectiveTests(StrictModeTest);
+  runReflectiveTests(TypePropagationTest);
+  runReflectiveTests(StrongModeTypePropagationTest);
+}
+
+/**
+ * The class `AnalysisContextFactory` defines utility methods used to create analysis contexts
+ * for testing purposes.
+ */
+class AnalysisContextFactory {
+  static String _DART_MATH = "dart:math";
+
+  static String _DART_INTERCEPTORS = "dart:_interceptors";
+
+  static String _DART_JS_HELPER = "dart:_js_helper";
+
+  /**
+   * Create an analysis context that has a fake core library already resolved.
+   * Return the context that was created.
+   */
+  static InternalAnalysisContext contextWithCore() {
+    if (AnalysisEngine.instance.useTaskModel) {
+      NewAnalysisContextForTests context = new NewAnalysisContextForTests();
+      return initContextWithCore(context);
+    }
+    AnalysisContextForTests context = new AnalysisContextForTests();
+    return initContextWithCore(context);
+  }
+
+  /**
+   * Create an analysis context that uses the given [options] and has a fake
+   * core library already resolved. Return the context that was created.
+   */
+  static InternalAnalysisContext contextWithCoreAndOptions(
+      AnalysisOptions options) {
+    if (AnalysisEngine.instance.useTaskModel) {
+      NewAnalysisContextForTests context = new NewAnalysisContextForTests();
+      context._internalSetAnalysisOptions(options);
+      return initContextWithCore(context);
+    }
+    AnalysisContextForTests context = new AnalysisContextForTests();
+    context._internalSetAnalysisOptions(options);
+    return initContextWithCore(context);
+  }
+
+  /**
+   * Initialize the given analysis context with a fake core library already resolved.
+   *
+   * @param context the context to be initialized (not `null`)
+   * @return the analysis context that was created
+   */
+  static InternalAnalysisContext initContextWithCore(
+      InternalAnalysisContext context) {
+    DirectoryBasedDartSdk sdk = new _AnalysisContextFactory_initContextWithCore(
+        new JavaFile("/fake/sdk"));
+    SourceFactory sourceFactory =
+        new SourceFactory([new DartUriResolver(sdk), new FileUriResolver()]);
+    context.sourceFactory = sourceFactory;
+    AnalysisContext coreContext = sdk.context;
+    //
+    // dart:core
+    //
+    TestTypeProvider provider = new TestTypeProvider();
+    CompilationUnitElementImpl coreUnit =
+        new CompilationUnitElementImpl("core.dart");
+    Source coreSource = sourceFactory.forUri(DartSdk.DART_CORE);
+    coreContext.setContents(coreSource, "");
+    coreUnit.librarySource = coreUnit.source = coreSource;
+    ClassElementImpl proxyClassElement = ElementFactory.classElement2("_Proxy");
+    ClassElement objectClassElement = provider.objectType.element;
+    coreUnit.types = <ClassElement>[
+      provider.boolType.element,
+      provider.deprecatedType.element,
+      provider.doubleType.element,
+      provider.functionType.element,
+      provider.intType.element,
+      provider.iterableType.element,
+      provider.iteratorType.element,
+      provider.listType.element,
+      provider.mapType.element,
+      provider.nullType.element,
+      provider.numType.element,
+      objectClassElement,
+      proxyClassElement,
+      provider.stackTraceType.element,
+      provider.stringType.element,
+      provider.symbolType.element,
+      provider.typeType.element
+    ];
+    coreUnit.functions = <FunctionElement>[
+      ElementFactory.functionElement3("identical", provider.boolType.element,
+          <ClassElement>[objectClassElement, objectClassElement], null),
+      ElementFactory.functionElement3("print", VoidTypeImpl.instance.element,
+          <ClassElement>[objectClassElement], null)
+    ];
+    TopLevelVariableElement proxyTopLevelVariableElt = ElementFactory
+        .topLevelVariableElement3("proxy", true, false, proxyClassElement.type);
+    ConstTopLevelVariableElementImpl deprecatedTopLevelVariableElt =
+        ElementFactory.topLevelVariableElement3(
+            "deprecated", true, false, provider.deprecatedType);
+    deprecatedTopLevelVariableElt.constantInitializer = AstFactory
+        .instanceCreationExpression2(
+            Keyword.CONST,
+            AstFactory.typeName(provider.deprecatedType.element),
+            [AstFactory.string2('next release')]);
+    coreUnit.accessors = <PropertyAccessorElement>[
+      proxyTopLevelVariableElt.getter,
+      deprecatedTopLevelVariableElt.getter
+    ];
+    coreUnit.topLevelVariables = <TopLevelVariableElement>[
+      proxyTopLevelVariableElt,
+      deprecatedTopLevelVariableElt
+    ];
+    LibraryElementImpl coreLibrary = new LibraryElementImpl.forNode(
+        coreContext, AstFactory.libraryIdentifier2(["dart", "core"]));
+    coreLibrary.definingCompilationUnit = coreUnit;
+    //
+    // dart:async
+    //
+    CompilationUnitElementImpl asyncUnit =
+        new CompilationUnitElementImpl("async.dart");
+    Source asyncSource = sourceFactory.forUri(DartSdk.DART_ASYNC);
+    coreContext.setContents(asyncSource, "");
+    asyncUnit.librarySource = asyncUnit.source = asyncSource;
+    // Future
+    ClassElementImpl futureElement =
+        ElementFactory.classElement2("Future", ["T"]);
+    InterfaceType futureType = futureElement.type;
+    //   factory Future.value([value])
+    ConstructorElementImpl futureConstructor =
+        ElementFactory.constructorElement2(futureElement, "value");
+    futureConstructor.parameters = <ParameterElement>[
+      ElementFactory.positionalParameter2("value", provider.dynamicType)
+    ];
+    futureConstructor.factory = true;
+    (futureConstructor.type as FunctionTypeImpl).typeArguments =
+        futureElement.type.typeArguments;
+    futureElement.constructors = <ConstructorElement>[futureConstructor];
+    //   Future then(onValue(T value), { Function onError });
+    List<ParameterElement> parameters = <ParameterElement>[
+      ElementFactory.requiredParameter2(
+          "value", futureElement.typeParameters[0].type)
+    ];
+    FunctionTypeAliasElementImpl aliasElement =
+        new FunctionTypeAliasElementImpl.forNode(null);
+    aliasElement.synthetic = true;
+    aliasElement.parameters = parameters;
+    aliasElement.returnType = provider.dynamicType;
+    aliasElement.enclosingElement = asyncUnit;
+    FunctionTypeImpl aliasType = new FunctionTypeImpl.forTypedef(aliasElement);
+    aliasElement.shareTypeParameters(futureElement.typeParameters);
+    aliasType.typeArguments = futureElement.type.typeArguments;
+    MethodElement thenMethod = ElementFactory.methodElementWithParameters(
+        "then", futureElement.type.typeArguments, futureType, [
+      ElementFactory.requiredParameter2("onValue", aliasType),
+      ElementFactory.namedParameter2("onError", provider.functionType)
+    ]);
+    futureElement.methods = <MethodElement>[thenMethod];
+    // Completer
+    ClassElementImpl completerElement =
+        ElementFactory.classElement2("Completer", ["T"]);
+    ConstructorElementImpl completerConstructor =
+        ElementFactory.constructorElement2(completerElement, null);
+    (completerConstructor.type as FunctionTypeImpl).typeArguments =
+        completerElement.type.typeArguments;
+    completerElement.constructors = <ConstructorElement>[completerConstructor];
+    // StreamSubscription
+    ClassElementImpl streamSubscriptionElement =
+        ElementFactory.classElement2("StreamSubscription", ["T"]);
+    // Stream
+    ClassElementImpl streamElement =
+        ElementFactory.classElement2("Stream", ["T"]);
+    streamElement.constructors = <ConstructorElement>[
+      ElementFactory.constructorElement2(streamElement, null)
+    ];
+    DartType returnType = streamSubscriptionElement.type
+        .substitute4(streamElement.type.typeArguments);
+    List<DartType> parameterTypes = <DartType>[
+      ElementFactory
+          .functionElement3('onData', VoidTypeImpl.instance.element,
+              <TypeDefiningElement>[streamElement.typeParameters[0]], null)
+          .type,
+    ];
+    // TODO(brianwilkerson) This is missing the optional parameters.
+    MethodElementImpl listenMethod =
+        ElementFactory.methodElement('listen', returnType, parameterTypes);
+    streamElement.methods = <MethodElement>[listenMethod];
+
+    asyncUnit.types = <ClassElement>[
+      completerElement,
+      futureElement,
+      streamElement
+    ];
+    LibraryElementImpl asyncLibrary = new LibraryElementImpl.forNode(
+        coreContext, AstFactory.libraryIdentifier2(["dart", "async"]));
+    asyncLibrary.definingCompilationUnit = asyncUnit;
+    //
+    // dart:html
+    //
+    CompilationUnitElementImpl htmlUnit =
+        new CompilationUnitElementImpl("html_dartium.dart");
+    Source htmlSource = sourceFactory.forUri(DartSdk.DART_HTML);
+    coreContext.setContents(htmlSource, "");
+    htmlUnit.librarySource = htmlUnit.source = htmlSource;
+    ClassElementImpl elementElement = ElementFactory.classElement2("Element");
+    InterfaceType elementType = elementElement.type;
+    ClassElementImpl canvasElement =
+        ElementFactory.classElement("CanvasElement", elementType);
+    ClassElementImpl contextElement =
+        ElementFactory.classElement2("CanvasRenderingContext");
+    InterfaceType contextElementType = contextElement.type;
+    ClassElementImpl context2dElement = ElementFactory.classElement(
+        "CanvasRenderingContext2D", contextElementType);
+    canvasElement.methods = <MethodElement>[
+      ElementFactory.methodElement(
+          "getContext", contextElementType, [provider.stringType])
+    ];
+    canvasElement.accessors = <PropertyAccessorElement>[
+      ElementFactory.getterElement("context2D", false, context2dElement.type)
+    ];
+    canvasElement.fields = canvasElement.accessors
+        .map((PropertyAccessorElement accessor) => accessor.variable)
+        .toList();
+    ClassElementImpl documentElement =
+        ElementFactory.classElement("Document", elementType);
+    ClassElementImpl htmlDocumentElement =
+        ElementFactory.classElement("HtmlDocument", documentElement.type);
+    htmlDocumentElement.methods = <MethodElement>[
+      ElementFactory.methodElement(
+          "query", elementType, <DartType>[provider.stringType])
+    ];
+    htmlUnit.types = <ClassElement>[
+      ElementFactory.classElement("AnchorElement", elementType),
+      ElementFactory.classElement("BodyElement", elementType),
+      ElementFactory.classElement("ButtonElement", elementType),
+      canvasElement,
+      contextElement,
+      context2dElement,
+      ElementFactory.classElement("DivElement", elementType),
+      documentElement,
+      elementElement,
+      htmlDocumentElement,
+      ElementFactory.classElement("InputElement", elementType),
+      ElementFactory.classElement("SelectElement", elementType)
+    ];
+    htmlUnit.functions = <FunctionElement>[
+      ElementFactory.functionElement3("query", elementElement,
+          <ClassElement>[provider.stringType.element], ClassElement.EMPTY_LIST)
+    ];
+    TopLevelVariableElementImpl document = ElementFactory
+        .topLevelVariableElement3(
+            "document", false, true, htmlDocumentElement.type);
+    htmlUnit.topLevelVariables = <TopLevelVariableElement>[document];
+    htmlUnit.accessors = <PropertyAccessorElement>[document.getter];
+    LibraryElementImpl htmlLibrary = new LibraryElementImpl.forNode(
+        coreContext, AstFactory.libraryIdentifier2(["dart", "dom", "html"]));
+    htmlLibrary.definingCompilationUnit = htmlUnit;
+    //
+    // dart:math
+    //
+    CompilationUnitElementImpl mathUnit =
+        new CompilationUnitElementImpl("math.dart");
+    Source mathSource = sourceFactory.forUri(_DART_MATH);
+    coreContext.setContents(mathSource, "");
+    mathUnit.librarySource = mathUnit.source = mathSource;
+    FunctionElement cosElement = ElementFactory.functionElement3(
+        "cos",
+        provider.doubleType.element,
+        <ClassElement>[provider.numType.element],
+        ClassElement.EMPTY_LIST);
+    TopLevelVariableElement ln10Element = ElementFactory
+        .topLevelVariableElement3("LN10", true, false, provider.doubleType);
+    TopLevelVariableElement piElement = ElementFactory.topLevelVariableElement3(
+        "PI", true, false, provider.doubleType);
+    ClassElementImpl randomElement = ElementFactory.classElement2("Random");
+    randomElement.abstract = true;
+    ConstructorElementImpl randomConstructor =
+        ElementFactory.constructorElement2(randomElement, null);
+    randomConstructor.factory = true;
+    ParameterElementImpl seedParam = new ParameterElementImpl("seed", 0);
+    seedParam.parameterKind = ParameterKind.POSITIONAL;
+    seedParam.type = provider.intType;
+    randomConstructor.parameters = <ParameterElement>[seedParam];
+    randomElement.constructors = <ConstructorElement>[randomConstructor];
+    FunctionElement sinElement = ElementFactory.functionElement3(
+        "sin",
+        provider.doubleType.element,
+        <ClassElement>[provider.numType.element],
+        ClassElement.EMPTY_LIST);
+    FunctionElement sqrtElement = ElementFactory.functionElement3(
+        "sqrt",
+        provider.doubleType.element,
+        <ClassElement>[provider.numType.element],
+        ClassElement.EMPTY_LIST);
+    mathUnit.accessors = <PropertyAccessorElement>[
+      ln10Element.getter,
+      piElement.getter
+    ];
+    mathUnit.functions = <FunctionElement>[cosElement, sinElement, sqrtElement];
+    mathUnit.topLevelVariables = <TopLevelVariableElement>[
+      ln10Element,
+      piElement
+    ];
+    mathUnit.types = <ClassElement>[randomElement];
+    LibraryElementImpl mathLibrary = new LibraryElementImpl.forNode(
+        coreContext, AstFactory.libraryIdentifier2(["dart", "math"]));
+    mathLibrary.definingCompilationUnit = mathUnit;
+    //
+    // Set empty sources for the rest of the libraries.
+    //
+    Source source = sourceFactory.forUri(_DART_INTERCEPTORS);
+    coreContext.setContents(source, "");
+    source = sourceFactory.forUri(_DART_JS_HELPER);
+    coreContext.setContents(source, "");
+    //
+    // Record the elements.
+    //
+    HashMap<Source, LibraryElement> elementMap =
+        new HashMap<Source, LibraryElement>();
+    elementMap[coreSource] = coreLibrary;
+    elementMap[asyncSource] = asyncLibrary;
+    elementMap[htmlSource] = htmlLibrary;
+    elementMap[mathSource] = mathLibrary;
+    context.recordLibraryElements(elementMap);
+    return context;
+  }
+
+  /**
+   * Create an analysis context that has a fake core library already resolved.
+   * Return the context that was created.
+   */
+  static AnalysisContextImpl oldContextWithCore() {
+    AnalysisContextForTests context = new AnalysisContextForTests();
+    return initContextWithCore(context);
+  }
+
+  /**
+   * Create an analysis context that uses the given [options] and has a fake
+   * core library already resolved. Return the context that was created.
+   */
+  static AnalysisContextImpl oldContextWithCoreAndOptions(
+      AnalysisOptions options) {
+    AnalysisContextForTests context = new AnalysisContextForTests();
+    context._internalSetAnalysisOptions(options);
+    return initContextWithCore(context);
+  }
+}
+
+/**
+ * Instances of the class `AnalysisContextForTests` implement an analysis context that has a
+ * fake SDK that is much smaller and faster for testing purposes.
+ */
+class AnalysisContextForTests extends AnalysisContextImpl {
+  @override
+  void set analysisOptions(AnalysisOptions options) {
+    AnalysisOptions currentOptions = analysisOptions;
+    bool needsRecompute = currentOptions.analyzeFunctionBodiesPredicate !=
+            options.analyzeFunctionBodiesPredicate ||
+        currentOptions.generateImplicitErrors !=
+            options.generateImplicitErrors ||
+        currentOptions.generateSdkErrors != options.generateSdkErrors ||
+        currentOptions.dart2jsHint != options.dart2jsHint ||
+        (currentOptions.hint && !options.hint) ||
+        currentOptions.preserveComments != options.preserveComments ||
+        currentOptions.enableStrictCallChecks != options.enableStrictCallChecks;
+    if (needsRecompute) {
+      fail(
+          "Cannot set options that cause the sources to be reanalyzed in a test context");
+    }
+    super.analysisOptions = options;
+  }
+
+  @override
+  bool exists(Source source) =>
+      super.exists(source) || sourceFactory.dartSdk.context.exists(source);
+
+  @override
+  TimestampedData<String> getContents(Source source) {
+    if (source.isInSystemLibrary) {
+      return sourceFactory.dartSdk.context.getContents(source);
+    }
+    return super.getContents(source);
+  }
+
+  @override
+  int getModificationStamp(Source source) {
+    if (source.isInSystemLibrary) {
+      return sourceFactory.dartSdk.context.getModificationStamp(source);
+    }
+    return super.getModificationStamp(source);
+  }
+
+  /**
+   * Set the analysis options, even if they would force re-analysis. This method should only be
+   * invoked before the fake SDK is initialized.
+   *
+   * @param options the analysis options to be set
+   */
+  void _internalSetAnalysisOptions(AnalysisOptions options) {
+    super.analysisOptions = options;
+  }
+}
+
+/**
+ * Helper for creating and managing single [AnalysisContext].
+ */
+class AnalysisContextHelper {
+  AnalysisContext context;
+
+  /**
+   * Creates new [AnalysisContext] using [AnalysisContextFactory].
+   */
+  AnalysisContextHelper([AnalysisOptionsImpl options]) {
+    if (options == null) {
+      options = new AnalysisOptionsImpl();
+    }
+    options.cacheSize = 256;
+    context = AnalysisContextFactory.contextWithCoreAndOptions(options);
+  }
+
+  Source addSource(String path, String code) {
+    Source source = new FileBasedSource(FileUtilities2.createFile(path));
+    if (path.endsWith(".dart") || path.endsWith(".html")) {
+      ChangeSet changeSet = new ChangeSet();
+      changeSet.addedSource(source);
+      context.applyChanges(changeSet);
+    }
+    context.setContents(source, code);
+    return source;
+  }
+
+  CompilationUnitElement getDefiningUnitElement(Source source) =>
+      context.getCompilationUnitElement(source, source);
+
+  CompilationUnit resolveDefiningUnit(Source source) {
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+    return context.resolveCompilationUnit(source, libraryElement);
+  }
+
+  void runTasks() {
+    AnalysisResult result = context.performAnalysisTask();
+    while (result.changeNotices != null) {
+      result = context.performAnalysisTask();
+    }
+  }
+}
+
+@reflectiveTest
+class AnalysisDeltaTest extends EngineTestCase {
+  TestSource source1 = new TestSource('/1.dart');
+  TestSource source2 = new TestSource('/2.dart');
+  TestSource source3 = new TestSource('/3.dart');
+
+  void test_getAddedSources() {
+    AnalysisDelta delta = new AnalysisDelta();
+    delta.setAnalysisLevel(source1, AnalysisLevel.ALL);
+    delta.setAnalysisLevel(source2, AnalysisLevel.ERRORS);
+    delta.setAnalysisLevel(source3, AnalysisLevel.NONE);
+    List<Source> addedSources = delta.addedSources;
+    expect(addedSources, hasLength(2));
+    expect(addedSources, unorderedEquals([source1, source2]));
+  }
+
+  void test_getAnalysisLevels() {
+    AnalysisDelta delta = new AnalysisDelta();
+    expect(delta.analysisLevels.length, 0);
+  }
+
+  void test_setAnalysisLevel() {
+    AnalysisDelta delta = new AnalysisDelta();
+    delta.setAnalysisLevel(source1, AnalysisLevel.ALL);
+    delta.setAnalysisLevel(source2, AnalysisLevel.ERRORS);
+    Map<Source, AnalysisLevel> levels = delta.analysisLevels;
+    expect(levels.length, 2);
+    expect(levels[source1], AnalysisLevel.ALL);
+    expect(levels[source2], AnalysisLevel.ERRORS);
+  }
+
+  void test_toString() {
+    AnalysisDelta delta = new AnalysisDelta();
+    delta.setAnalysisLevel(new TestSource(), AnalysisLevel.ALL);
+    String result = delta.toString();
+    expect(result, isNotNull);
+    expect(result.length > 0, isTrue);
+  }
+}
+
+@reflectiveTest
+class ChangeSetTest extends EngineTestCase {
+  void test_changedContent() {
+    TestSource source = new TestSource();
+    String content = "";
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.changedContent(source, content);
+    expect(changeSet.addedSources, hasLength(0));
+    expect(changeSet.changedSources, hasLength(0));
+    Map<Source, String> map = changeSet.changedContents;
+    expect(map, hasLength(1));
+    expect(map[source], same(content));
+    expect(changeSet.changedRanges, hasLength(0));
+    expect(changeSet.deletedSources, hasLength(0));
+    expect(changeSet.removedSources, hasLength(0));
+    expect(changeSet.removedContainers, hasLength(0));
+  }
+
+  void test_changedRange() {
+    TestSource source = new TestSource();
+    String content = "";
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.changedRange(source, content, 1, 2, 3);
+    expect(changeSet.addedSources, hasLength(0));
+    expect(changeSet.changedSources, hasLength(0));
+    expect(changeSet.changedContents, hasLength(0));
+    Map<Source, ChangeSet_ContentChange> map = changeSet.changedRanges;
+    expect(map, hasLength(1));
+    ChangeSet_ContentChange change = map[source];
+    expect(change, isNotNull);
+    expect(change.contents, content);
+    expect(change.offset, 1);
+    expect(change.oldLength, 2);
+    expect(change.newLength, 3);
+    expect(changeSet.deletedSources, hasLength(0));
+    expect(changeSet.removedSources, hasLength(0));
+    expect(changeSet.removedContainers, hasLength(0));
+  }
+
+  void test_toString() {
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(new TestSource());
+    changeSet.changedSource(new TestSource());
+    changeSet.changedContent(new TestSource(), "");
+    changeSet.changedRange(new TestSource(), "", 0, 0, 0);
+    changeSet.deletedSource(new TestSource());
+    changeSet.removedSource(new TestSource());
+    changeSet
+        .removedContainer(new SourceContainer_ChangeSetTest_test_toString());
+    expect(changeSet.toString(), isNotNull);
+  }
+}
+
+@reflectiveTest
+class CheckedModeCompileTimeErrorCodeTest extends ResolverTestCase {
+  void test_fieldFormalParameterAssignableToField_extends() {
+    // According to checked-mode type checking rules, a value of type B is
+    // assignable to a field of type A, because B extends A (and hence is a
+    // subtype of A).
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+class B extends A {
+  const B();
+}
+class C {
+  final A a;
+  const C(this.a);
+}
+var v = const C(const B());''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterAssignableToField_fieldType_unresolved_null() {
+    // Null always passes runtime type checks, even when the type is
+    // unresolved.
+    Source source = addSource(r'''
+class A {
+  final Unresolved x;
+  const A(String this.x);
+}
+var v = const A(null);''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.UNDEFINED_CLASS]);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterAssignableToField_implements() {
+    // According to checked-mode type checking rules, a value of type B is
+    // assignable to a field of type A, because B implements A (and hence is a
+    // subtype of A).
+    Source source = addSource(r'''
+class A {}
+class B implements A {
+  const B();
+}
+class C {
+  final A a;
+  const C(this.a);
+}
+var v = const C(const B());''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterAssignableToField_list_dynamic() {
+    // [1, 2, 3] has type List<dynamic>, which is a subtype of List<int>.
+    Source source = addSource(r'''
+class A {
+  const A(List<int> x);
+}
+var x = const A(const [1, 2, 3]);''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterAssignableToField_list_nonDynamic() {
+    // <int>[1, 2, 3] has type List<int>, which is a subtype of List<num>.
+    Source source = addSource(r'''
+class A {
+  const A(List<num> x);
+}
+var x = const A(const <int>[1, 2, 3]);''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterAssignableToField_map_dynamic() {
+    // {1: 2} has type Map<dynamic, dynamic>, which is a subtype of
+    // Map<int, int>.
+    Source source = addSource(r'''
+class A {
+  const A(Map<int, int> x);
+}
+var x = const A(const {1: 2});''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterAssignableToField_map_keyDifferent() {
+    // <int, int>{1: 2} has type Map<int, int>, which is a subtype of
+    // Map<num, int>.
+    Source source = addSource(r'''
+class A {
+  const A(Map<num, int> x);
+}
+var x = const A(const <int, int>{1: 2});''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterAssignableToField_map_valueDifferent() {
+    // <int, int>{1: 2} has type Map<int, int>, which is a subtype of
+    // Map<int, num>.
+    Source source = addSource(r'''
+class A {
+  const A(Map<int, num> x);
+}
+var x = const A(const <int, int>{1: 2});''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterAssignableToField_notype() {
+    // If a field is declared without a type, then any value may be assigned to
+    // it.
+    Source source = addSource(r'''
+class A {
+  final x;
+  const A(this.x);
+}
+var v = const A(5);''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterAssignableToField_null() {
+    // Null is assignable to anything.
+    Source source = addSource(r'''
+class A {
+  final int x;
+  const A(this.x);
+}
+var v = const A(null);''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterAssignableToField_typedef() {
+    // foo has the runtime type dynamic -> dynamic, so it should be assignable
+    // to A.f.
+    Source source = addSource(r'''
+typedef String Int2String(int x);
+class A {
+  final Int2String f;
+  const A(this.f);
+}
+foo(x) => 1;
+var v = const A(foo);''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterAssignableToField_typeSubstitution() {
+    // foo has the runtime type dynamic -> dynamic, so it should be assignable
+    // to A.f.
+    Source source = addSource(r'''
+class A<T> {
+  final T x;
+  const A(this.x);
+}
+var v = const A<int>(3);''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterNotAssignableToField() {
+    Source source = addSource(r'''
+class A {
+  final int x;
+  const A(this.x);
+}
+var v = const A('foo');''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
+      StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    ]);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterNotAssignableToField_extends() {
+    // According to checked-mode type checking rules, a value of type A is not
+    // assignable to a field of type B, because B extends A (the subtyping
+    // relationship is in the wrong direction).
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+class B extends A {
+  const B();
+}
+class C {
+  final B b;
+  const C(this.b);
+}
+var v = const C(const A());''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+    ]);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterNotAssignableToField_fieldType() {
+    Source source = addSource(r'''
+class A {
+  final int x;
+  const A(String this.x);
+}
+var v = const A('foo');''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
+      StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE
+    ]);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterNotAssignableToField_fieldType_unresolved() {
+    Source source = addSource(r'''
+class A {
+  final Unresolved x;
+  const A(String this.x);
+}
+var v = const A('foo');''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
+      StaticWarningCode.UNDEFINED_CLASS
+    ]);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterNotAssignableToField_implements() {
+    // According to checked-mode type checking rules, a value of type A is not
+    // assignable to a field of type B, because B implements A (the subtyping
+    // relationship is in the wrong direction).
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+class B implements A {}
+class C {
+  final B b;
+  const C(this.b);
+}
+var v = const C(const A());''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+    ]);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterNotAssignableToField_list() {
+    // <num>[1, 2, 3] has type List<num>, which is not a subtype of List<int>.
+    Source source = addSource(r'''
+class A {
+  const A(List<int> x);
+}
+var x = const A(const <num>[1, 2, 3]);''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+    ]);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterNotAssignableToField_map_keyMismatch() {
+    // <num, int>{1: 2} has type Map<num, int>, which is not a subtype of
+    // Map<int, int>.
+    Source source = addSource(r'''
+class A {
+  const A(Map<int, int> x);
+}
+var x = const A(const <num, int>{1: 2});''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+    ]);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterNotAssignableToField_map_valueMismatch() {
+    // <int, num>{1: 2} has type Map<int, num>, which is not a subtype of
+    // Map<int, int>.
+    Source source = addSource(r'''
+class A {
+  const A(Map<int, int> x);
+}
+var x = const A(const <int, num>{1: 2});''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+    ]);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterNotAssignableToField_optional() {
+    Source source = addSource(r'''
+class A {
+  final int x;
+  const A([this.x = 'foo']);
+}
+var v = const A();''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
+      StaticTypeWarningCode.INVALID_ASSIGNMENT
+    ]);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameterNotAssignableToField_typedef() {
+    // foo has the runtime type String -> int, so it should not be assignable
+    // to A.f (A.f requires it to be int -> String).
+    Source source = addSource(r'''
+typedef String Int2String(int x);
+class A {
+  final Int2String f;
+  const A(this.f);
+}
+int foo(String x) => 1;
+var v = const A(foo);''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
+      StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    ]);
+    verify([source]);
+  }
+
+  void test_fieldInitializerNotAssignable() {
+    Source source = addSource(r'''
+class A {
+  final int x;
+  const A() : x = '';
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE,
+      StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE
+    ]);
+    verify([source]);
+  }
+
+  void test_fieldTypeMismatch() {
+    Source source = addSource(r'''
+class A {
+  const A(x) : y = x;
+  final int y;
+}
+var v = const A('foo');''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
+    ]);
+    verify([source]);
+  }
+
+  void test_fieldTypeMismatch_generic() {
+    Source source = addSource(r'''
+class C<T> {
+  final T x = y;
+  const C();
+}
+const y = 1;
+var v = const C<String>();
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
+      HintCode.INVALID_ASSIGNMENT
+    ]);
+    verify([source]);
+  }
+
+  void test_fieldTypeMismatch_unresolved() {
+    Source source = addSource(r'''
+class A {
+  const A(x) : y = x;
+  final Unresolved y;
+}
+var v = const A('foo');''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
+      StaticWarningCode.UNDEFINED_CLASS
+    ]);
+    verify([source]);
+  }
+
+  void test_fieldTypeOk_generic() {
+    Source source = addSource(r'''
+class C<T> {
+  final T x = y;
+  const C();
+}
+const y = 1;
+var v = const C<int>();
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_fieldTypeOk_null() {
+    Source source = addSource(r'''
+class A {
+  const A(x) : y = x;
+  final int y;
+}
+var v = const A(null);''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_fieldTypeOk_unresolved_null() {
+    // Null always passes runtime type checks, even when the type is
+    // unresolved.
+    Source source = addSource(r'''
+class A {
+  const A(x) : y = x;
+  final Unresolved y;
+}
+var v = const A(null);''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.UNDEFINED_CLASS]);
+    verify([source]);
+  }
+
+  void test_listElementTypeNotAssignable() {
+    Source source = addSource("var v = const <String> [42];");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,
+      StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
+    ]);
+    verify([source]);
+  }
+
+  void test_mapKeyTypeNotAssignable() {
+    Source source = addSource("var v = const <String, int > {1 : 2};");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
+      StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE
+    ]);
+    verify([source]);
+  }
+
+  void test_mapValueTypeNotAssignable() {
+    Source source = addSource("var v = const <String, String> {'a' : 2};");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE,
+      StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE
+    ]);
+    verify([source]);
+  }
+
+  void test_parameterAssignable_null() {
+    // Null is assignable to anything.
+    Source source = addSource(r'''
+class A {
+  const A(int x);
+}
+var v = const A(null);''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_parameterAssignable_typeSubstitution() {
+    Source source = addSource(r'''
+class A<T> {
+  const A(T x);
+}
+var v = const A<int>(3);''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_parameterAssignable_undefined_null() {
+    // Null always passes runtime type checks, even when the type is
+    // unresolved.
+    Source source = addSource(r'''
+class A {
+  const A(Unresolved x);
+}
+var v = const A(null);''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.UNDEFINED_CLASS]);
+    verify([source]);
+  }
+
+  void test_parameterNotAssignable() {
+    Source source = addSource(r'''
+class A {
+  const A(int x);
+}
+var v = const A('foo');''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
+      StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    ]);
+    verify([source]);
+  }
+
+  void test_parameterNotAssignable_typeSubstitution() {
+    Source source = addSource(r'''
+class A<T> {
+  const A(T x);
+}
+var v = const A<int>('foo');''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
+      StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    ]);
+    verify([source]);
+  }
+
+  void test_parameterNotAssignable_undefined() {
+    Source source = addSource(r'''
+class A {
+  const A(Unresolved x);
+}
+var v = const A('foo');''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
+      StaticWarningCode.UNDEFINED_CLASS
+    ]);
+    verify([source]);
+  }
+
+  void test_redirectingConstructor_paramTypeMismatch() {
+    Source source = addSource(r'''
+class A {
+  const A.a1(x) : this.a2(x);
+  const A.a2(String x);
+}
+var v = const A.a1(0);''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+    ]);
+    verify([source]);
+  }
+
+  void test_topLevelVarAssignable_null() {
+    Source source = addSource("const int x = null;");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_topLevelVarAssignable_undefined_null() {
+    // Null always passes runtime type checks, even when the type is
+    // unresolved.
+    Source source = addSource("const Unresolved x = null;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.UNDEFINED_CLASS]);
+    verify([source]);
+  }
+
+  void test_topLevelVarNotAssignable() {
+    Source source = addSource("const int x = 'foo';");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH,
+      StaticTypeWarningCode.INVALID_ASSIGNMENT
+    ]);
+    verify([source]);
+  }
+
+  void test_topLevelVarNotAssignable_undefined() {
+    Source source = addSource("const Unresolved x = 'foo';");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH,
+      StaticWarningCode.UNDEFINED_CLASS
+    ]);
+    verify([source]);
+  }
+}
+
+@reflectiveTest
+class ElementResolverTest extends EngineTestCase {
+  /**
+   * The error listener to which errors will be reported.
+   */
+  GatheringErrorListener _listener;
+
+  /**
+   * The type provider used to access the types.
+   */
+  TestTypeProvider _typeProvider;
+
+  /**
+   * The library containing the code being resolved.
+   */
+  LibraryElementImpl _definingLibrary;
+
+  /**
+   * The resolver visitor that maintains the state for the resolver.
+   */
+  ResolverVisitor _visitor;
+
+  /**
+   * The resolver being used to resolve the test cases.
+   */
+  ElementResolver _resolver;
+
+  void fail_visitExportDirective_combinators() {
+    fail("Not yet tested");
+    // Need to set up the exported library so that the identifier can be
+    // resolved.
+    ExportDirective directive = AstFactory.exportDirective2(null, [
+      AstFactory.hideCombinator2(["A"])
+    ]);
+    _resolveNode(directive);
+    _listener.assertNoErrors();
+  }
+
+  void fail_visitFunctionExpressionInvocation() {
+    fail("Not yet tested");
+    _listener.assertNoErrors();
+  }
+
+  void fail_visitImportDirective_combinators_noPrefix() {
+    fail("Not yet tested");
+    // Need to set up the imported library so that the identifier can be
+    // resolved.
+    ImportDirective directive = AstFactory.importDirective3(null, null, [
+      AstFactory.showCombinator2(["A"])
+    ]);
+    _resolveNode(directive);
+    _listener.assertNoErrors();
+  }
+
+  void fail_visitImportDirective_combinators_prefix() {
+    fail("Not yet tested");
+    // Need to set up the imported library so that the identifiers can be
+    // resolved.
+    String prefixName = "p";
+    _definingLibrary.imports = <ImportElement>[
+      ElementFactory.importFor(null, ElementFactory.prefix(prefixName))
+    ];
+    ImportDirective directive = AstFactory.importDirective3(null, prefixName, [
+      AstFactory.showCombinator2(["A"]),
+      AstFactory.hideCombinator2(["B"])
+    ]);
+    _resolveNode(directive);
+    _listener.assertNoErrors();
+  }
+
+  void fail_visitRedirectingConstructorInvocation() {
+    fail("Not yet tested");
+    _listener.assertNoErrors();
+  }
+
+  @override
+  void setUp() {
+    _listener = new GatheringErrorListener();
+    _typeProvider = new TestTypeProvider();
+    _resolver = _createResolver();
+  }
+
+  void test_lookUpMethodInInterfaces() {
+    InterfaceType intType = _typeProvider.intType;
+    //
+    // abstract class A { int operator[](int index); }
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    MethodElement operator =
+        ElementFactory.methodElement("[]", intType, [intType]);
+    classA.methods = <MethodElement>[operator];
+    //
+    // class B implements A {}
+    //
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classB.interfaces = <InterfaceType>[classA.type];
+    //
+    // class C extends Object with B {}
+    //
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    classC.mixins = <InterfaceType>[classB.type];
+    //
+    // class D extends C {}
+    //
+    ClassElementImpl classD = ElementFactory.classElement("D", classC.type);
+    //
+    // D a;
+    // a[i];
+    //
+    SimpleIdentifier array = AstFactory.identifier3("a");
+    array.staticType = classD.type;
+    IndexExpression expression =
+        AstFactory.indexExpression(array, AstFactory.identifier3("i"));
+    expect(_resolveIndexExpression(expression), same(operator));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitAssignmentExpression_compound() {
+    InterfaceType intType = _typeProvider.intType;
+    SimpleIdentifier leftHandSide = AstFactory.identifier3("a");
+    leftHandSide.staticType = intType;
+    AssignmentExpression assignment = AstFactory.assignmentExpression(
+        leftHandSide, TokenType.PLUS_EQ, AstFactory.integer(1));
+    _resolveNode(assignment);
+    expect(
+        assignment.staticElement, same(getMethod(_typeProvider.numType, "+")));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitAssignmentExpression_simple() {
+    AssignmentExpression expression = AstFactory.assignmentExpression(
+        AstFactory.identifier3("x"), TokenType.EQ, AstFactory.integer(0));
+    _resolveNode(expression);
+    expect(expression.staticElement, isNull);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_bangEq() {
+    // String i;
+    // var j;
+    // i == j
+    InterfaceType stringType = _typeProvider.stringType;
+    SimpleIdentifier left = AstFactory.identifier3("i");
+    left.staticType = stringType;
+    BinaryExpression expression = AstFactory.binaryExpression(
+        left, TokenType.BANG_EQ, AstFactory.identifier3("j"));
+    _resolveNode(expression);
+    var stringElement = stringType.element;
+    expect(expression.staticElement, isNotNull);
+    expect(
+        expression.staticElement,
+        stringElement.lookUpMethod(
+            TokenType.EQ_EQ.lexeme, stringElement.library));
+    expect(expression.propagatedElement, isNull);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_eq() {
+    // String i;
+    // var j;
+    // i == j
+    InterfaceType stringType = _typeProvider.stringType;
+    SimpleIdentifier left = AstFactory.identifier3("i");
+    left.staticType = stringType;
+    BinaryExpression expression = AstFactory.binaryExpression(
+        left, TokenType.EQ_EQ, AstFactory.identifier3("j"));
+    _resolveNode(expression);
+    var stringElement = stringType.element;
+    expect(
+        expression.staticElement,
+        stringElement.lookUpMethod(
+            TokenType.EQ_EQ.lexeme, stringElement.library));
+    expect(expression.propagatedElement, isNull);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_plus() {
+    // num i;
+    // var j;
+    // i + j
+    InterfaceType numType = _typeProvider.numType;
+    SimpleIdentifier left = AstFactory.identifier3("i");
+    left.staticType = numType;
+    BinaryExpression expression = AstFactory.binaryExpression(
+        left, TokenType.PLUS, AstFactory.identifier3("j"));
+    _resolveNode(expression);
+    expect(expression.staticElement, getMethod(numType, "+"));
+    expect(expression.propagatedElement, isNull);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_plus_propagatedElement() {
+    // var i = 1;
+    // var j;
+    // i + j
+    InterfaceType numType = _typeProvider.numType;
+    SimpleIdentifier left = AstFactory.identifier3("i");
+    left.propagatedType = numType;
+    BinaryExpression expression = AstFactory.binaryExpression(
+        left, TokenType.PLUS, AstFactory.identifier3("j"));
+    _resolveNode(expression);
+    expect(expression.staticElement, isNull);
+    expect(expression.propagatedElement, getMethod(numType, "+"));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBreakStatement_withLabel() {
+    // loop: while (true) {
+    //   break loop;
+    // }
+    String label = "loop";
+    LabelElementImpl labelElement =
+        new LabelElementImpl(AstFactory.identifier3(label), false, false);
+    BreakStatement breakStatement = AstFactory.breakStatement2(label);
+    Expression condition = AstFactory.booleanLiteral(true);
+    WhileStatement whileStatement =
+        AstFactory.whileStatement(condition, breakStatement);
+    expect(_resolveBreak(breakStatement, labelElement, whileStatement),
+        same(labelElement));
+    expect(breakStatement.target, same(whileStatement));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBreakStatement_withoutLabel() {
+    BreakStatement statement = AstFactory.breakStatement();
+    _resolveStatement(statement, null, null);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitConstructorName_named() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String constructorName = "a";
+    ConstructorElement constructor =
+        ElementFactory.constructorElement2(classA, constructorName);
+    classA.constructors = <ConstructorElement>[constructor];
+    ConstructorName name = AstFactory.constructorName(
+        AstFactory.typeName(classA), constructorName);
+    _resolveNode(name);
+    expect(name.staticElement, same(constructor));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitConstructorName_unnamed() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String constructorName = null;
+    ConstructorElement constructor =
+        ElementFactory.constructorElement2(classA, constructorName);
+    classA.constructors = <ConstructorElement>[constructor];
+    ConstructorName name = AstFactory.constructorName(
+        AstFactory.typeName(classA), constructorName);
+    _resolveNode(name);
+    expect(name.staticElement, same(constructor));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitContinueStatement_withLabel() {
+    // loop: while (true) {
+    //   continue loop;
+    // }
+    String label = "loop";
+    LabelElementImpl labelElement =
+        new LabelElementImpl(AstFactory.identifier3(label), false, false);
+    ContinueStatement continueStatement = AstFactory.continueStatement(label);
+    Expression condition = AstFactory.booleanLiteral(true);
+    WhileStatement whileStatement =
+        AstFactory.whileStatement(condition, continueStatement);
+    expect(_resolveContinue(continueStatement, labelElement, whileStatement),
+        same(labelElement));
+    expect(continueStatement.target, same(whileStatement));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitContinueStatement_withoutLabel() {
+    ContinueStatement statement = AstFactory.continueStatement();
+    _resolveStatement(statement, null, null);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitEnumDeclaration() {
+    ClassElementImpl enumElement =
+        ElementFactory.enumElement(_typeProvider, ('E'));
+    EnumDeclaration enumNode = AstFactory.enumDeclaration2('E', []);
+    Annotation annotationNode =
+        AstFactory.annotation(AstFactory.identifier3('a'));
+    annotationNode.element = ElementFactory.classElement2('A');
+    enumNode.metadata.add(annotationNode);
+    enumNode.name.staticElement = enumElement;
+    _resolveNode(enumNode);
+    List<ElementAnnotation> metadata = enumElement.metadata;
+    expect(metadata, hasLength(1));
+  }
+
+  void test_visitExportDirective_noCombinators() {
+    ExportDirective directive = AstFactory.exportDirective2(null);
+    directive.element = ElementFactory
+        .exportFor(ElementFactory.library(_definingLibrary.context, "lib"));
+    _resolveNode(directive);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFieldFormalParameter() {
+    String fieldName = "f";
+    InterfaceType intType = _typeProvider.intType;
+    FieldElementImpl fieldElement =
+        ElementFactory.fieldElement(fieldName, false, false, false, intType);
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.fields = <FieldElement>[fieldElement];
+    FieldFormalParameter parameter =
+        AstFactory.fieldFormalParameter2(fieldName);
+    FieldFormalParameterElementImpl parameterElement =
+        ElementFactory.fieldFormalParameter(parameter.identifier);
+    parameterElement.field = fieldElement;
+    parameterElement.type = intType;
+    parameter.identifier.staticElement = parameterElement;
+    _resolveInClass(parameter, classA);
+    expect(parameter.element.type, same(intType));
+  }
+
+  void test_visitImportDirective_noCombinators_noPrefix() {
+    ImportDirective directive = AstFactory.importDirective3(null, null);
+    directive.element = ElementFactory.importFor(
+        ElementFactory.library(_definingLibrary.context, "lib"), null);
+    _resolveNode(directive);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitImportDirective_noCombinators_prefix() {
+    String prefixName = "p";
+    ImportElement importElement = ElementFactory.importFor(
+        ElementFactory.library(_definingLibrary.context, "lib"),
+        ElementFactory.prefix(prefixName));
+    _definingLibrary.imports = <ImportElement>[importElement];
+    ImportDirective directive = AstFactory.importDirective3(null, prefixName);
+    directive.element = importElement;
+    _resolveNode(directive);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitImportDirective_withCombinators() {
+    ShowCombinator combinator = AstFactory.showCombinator2(["A", "B", "C"]);
+    ImportDirective directive =
+        AstFactory.importDirective3(null, null, [combinator]);
+    LibraryElementImpl library =
+        ElementFactory.library(_definingLibrary.context, "lib");
+    TopLevelVariableElementImpl varA =
+        ElementFactory.topLevelVariableElement2("A");
+    TopLevelVariableElementImpl varB =
+        ElementFactory.topLevelVariableElement2("B");
+    TopLevelVariableElementImpl varC =
+        ElementFactory.topLevelVariableElement2("C");
+    CompilationUnitElementImpl unit =
+        library.definingCompilationUnit as CompilationUnitElementImpl;
+    unit.accessors = <PropertyAccessorElement>[
+      varA.getter,
+      varA.setter,
+      varB.getter,
+      varC.setter
+    ];
+    unit.topLevelVariables = <TopLevelVariableElement>[varA, varB, varC];
+    directive.element = ElementFactory.importFor(library, null);
+    _resolveNode(directive);
+    expect(combinator.shownNames[0].staticElement, same(varA));
+    expect(combinator.shownNames[1].staticElement, same(varB));
+    expect(combinator.shownNames[2].staticElement, same(varC));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitIndexExpression_get() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    InterfaceType intType = _typeProvider.intType;
+    MethodElement getter =
+        ElementFactory.methodElement("[]", intType, [intType]);
+    classA.methods = <MethodElement>[getter];
+    SimpleIdentifier array = AstFactory.identifier3("a");
+    array.staticType = classA.type;
+    IndexExpression expression =
+        AstFactory.indexExpression(array, AstFactory.identifier3("i"));
+    expect(_resolveIndexExpression(expression), same(getter));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitIndexExpression_set() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    InterfaceType intType = _typeProvider.intType;
+    MethodElement setter =
+        ElementFactory.methodElement("[]=", intType, [intType]);
+    classA.methods = <MethodElement>[setter];
+    SimpleIdentifier array = AstFactory.identifier3("a");
+    array.staticType = classA.type;
+    IndexExpression expression =
+        AstFactory.indexExpression(array, AstFactory.identifier3("i"));
+    AstFactory.assignmentExpression(
+        expression, TokenType.EQ, AstFactory.integer(0));
+    expect(_resolveIndexExpression(expression), same(setter));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitInstanceCreationExpression_named() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String constructorName = "a";
+    ConstructorElement constructor =
+        ElementFactory.constructorElement2(classA, constructorName);
+    classA.constructors = <ConstructorElement>[constructor];
+    ConstructorName name = AstFactory.constructorName(
+        AstFactory.typeName(classA), constructorName);
+    name.staticElement = constructor;
+    InstanceCreationExpression creation =
+        AstFactory.instanceCreationExpression(Keyword.NEW, name);
+    _resolveNode(creation);
+    expect(creation.staticElement, same(constructor));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitInstanceCreationExpression_unnamed() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String constructorName = null;
+    ConstructorElement constructor =
+        ElementFactory.constructorElement2(classA, constructorName);
+    classA.constructors = <ConstructorElement>[constructor];
+    ConstructorName name = AstFactory.constructorName(
+        AstFactory.typeName(classA), constructorName);
+    name.staticElement = constructor;
+    InstanceCreationExpression creation =
+        AstFactory.instanceCreationExpression(Keyword.NEW, name);
+    _resolveNode(creation);
+    expect(creation.staticElement, same(constructor));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitInstanceCreationExpression_unnamed_namedParameter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String constructorName = null;
+    ConstructorElementImpl constructor =
+        ElementFactory.constructorElement2(classA, constructorName);
+    String parameterName = "a";
+    ParameterElement parameter = ElementFactory.namedParameter(parameterName);
+    constructor.parameters = <ParameterElement>[parameter];
+    classA.constructors = <ConstructorElement>[constructor];
+    ConstructorName name = AstFactory.constructorName(
+        AstFactory.typeName(classA), constructorName);
+    name.staticElement = constructor;
+    InstanceCreationExpression creation = AstFactory.instanceCreationExpression(
+        Keyword.NEW,
+        name,
+        [AstFactory.namedExpression2(parameterName, AstFactory.integer(0))]);
+    _resolveNode(creation);
+    expect(creation.staticElement, same(constructor));
+    expect(
+        (creation.argumentList.arguments[0] as NamedExpression)
+            .name
+            .label
+            .staticElement,
+        same(parameter));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitMethodInvocation() {
+    InterfaceType numType = _typeProvider.numType;
+    SimpleIdentifier left = AstFactory.identifier3("i");
+    left.staticType = numType;
+    String methodName = "abs";
+    MethodInvocation invocation = AstFactory.methodInvocation(left, methodName);
+    _resolveNode(invocation);
+    expect(invocation.methodName.staticElement,
+        same(getMethod(numType, methodName)));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitMethodInvocation_namedParameter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    String parameterName = "p";
+    MethodElementImpl method = ElementFactory.methodElement(methodName, null);
+    ParameterElement parameter = ElementFactory.namedParameter(parameterName);
+    method.parameters = <ParameterElement>[parameter];
+    classA.methods = <MethodElement>[method];
+    SimpleIdentifier left = AstFactory.identifier3("i");
+    left.staticType = classA.type;
+    MethodInvocation invocation = AstFactory.methodInvocation(left, methodName,
+        [AstFactory.namedExpression2(parameterName, AstFactory.integer(0))]);
+    _resolveNode(invocation);
+    expect(invocation.methodName.staticElement, same(method));
+    expect(
+        (invocation.argumentList.arguments[0] as NamedExpression)
+            .name
+            .label
+            .staticElement,
+        same(parameter));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPostfixExpression() {
+    InterfaceType numType = _typeProvider.numType;
+    SimpleIdentifier operand = AstFactory.identifier3("i");
+    operand.staticType = numType;
+    PostfixExpression expression =
+        AstFactory.postfixExpression(operand, TokenType.PLUS_PLUS);
+    _resolveNode(expression);
+    expect(expression.staticElement, getMethod(numType, "+"));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixedIdentifier_dynamic() {
+    DartType dynamicType = _typeProvider.dynamicType;
+    SimpleIdentifier target = AstFactory.identifier3("a");
+    VariableElementImpl variable = ElementFactory.localVariableElement(target);
+    variable.type = dynamicType;
+    target.staticElement = variable;
+    target.staticType = dynamicType;
+    PrefixedIdentifier identifier =
+        AstFactory.identifier(target, AstFactory.identifier3("b"));
+    _resolveNode(identifier);
+    expect(identifier.staticElement, isNull);
+    expect(identifier.identifier.staticElement, isNull);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixedIdentifier_nonDynamic() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "b";
+    PropertyAccessorElement getter =
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[getter];
+    SimpleIdentifier target = AstFactory.identifier3("a");
+    VariableElementImpl variable = ElementFactory.localVariableElement(target);
+    variable.type = classA.type;
+    target.staticElement = variable;
+    target.staticType = classA.type;
+    PrefixedIdentifier identifier =
+        AstFactory.identifier(target, AstFactory.identifier3(getterName));
+    _resolveNode(identifier);
+    expect(identifier.staticElement, same(getter));
+    expect(identifier.identifier.staticElement, same(getter));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixedIdentifier_staticClassMember_getter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    // set accessors
+    String propName = "b";
+    PropertyAccessorElement getter =
+        ElementFactory.getterElement(propName, false, _typeProvider.intType);
+    PropertyAccessorElement setter =
+        ElementFactory.setterElement(propName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[getter, setter];
+    // prepare "A.m"
+    SimpleIdentifier target = AstFactory.identifier3("A");
+    target.staticElement = classA;
+    target.staticType = classA.type;
+    PrefixedIdentifier identifier =
+        AstFactory.identifier(target, AstFactory.identifier3(propName));
+    // resolve
+    _resolveNode(identifier);
+    expect(identifier.staticElement, same(getter));
+    expect(identifier.identifier.staticElement, same(getter));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixedIdentifier_staticClassMember_method() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    // set methods
+    String propName = "m";
+    MethodElement method =
+        ElementFactory.methodElement("m", _typeProvider.intType);
+    classA.methods = <MethodElement>[method];
+    // prepare "A.m"
+    SimpleIdentifier target = AstFactory.identifier3("A");
+    target.staticElement = classA;
+    target.staticType = classA.type;
+    PrefixedIdentifier identifier =
+        AstFactory.identifier(target, AstFactory.identifier3(propName));
+    AstFactory.assignmentExpression(
+        identifier, TokenType.EQ, AstFactory.nullLiteral());
+    // resolve
+    _resolveNode(identifier);
+    expect(identifier.staticElement, same(method));
+    expect(identifier.identifier.staticElement, same(method));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixedIdentifier_staticClassMember_setter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    // set accessors
+    String propName = "b";
+    PropertyAccessorElement getter =
+        ElementFactory.getterElement(propName, false, _typeProvider.intType);
+    PropertyAccessorElement setter =
+        ElementFactory.setterElement(propName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[getter, setter];
+    // prepare "A.b = null"
+    SimpleIdentifier target = AstFactory.identifier3("A");
+    target.staticElement = classA;
+    target.staticType = classA.type;
+    PrefixedIdentifier identifier =
+        AstFactory.identifier(target, AstFactory.identifier3(propName));
+    AstFactory.assignmentExpression(
+        identifier, TokenType.EQ, AstFactory.nullLiteral());
+    // resolve
+    _resolveNode(identifier);
+    expect(identifier.staticElement, same(setter));
+    expect(identifier.identifier.staticElement, same(setter));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixExpression() {
+    InterfaceType numType = _typeProvider.numType;
+    SimpleIdentifier operand = AstFactory.identifier3("i");
+    operand.staticType = numType;
+    PrefixExpression expression =
+        AstFactory.prefixExpression(TokenType.PLUS_PLUS, operand);
+    _resolveNode(expression);
+    expect(expression.staticElement, getMethod(numType, "+"));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPropertyAccess_getter_identifier() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "b";
+    PropertyAccessorElement getter =
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[getter];
+    SimpleIdentifier target = AstFactory.identifier3("a");
+    target.staticType = classA.type;
+    PropertyAccess access = AstFactory.propertyAccess2(target, getterName);
+    _resolveNode(access);
+    expect(access.propertyName.staticElement, same(getter));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPropertyAccess_getter_super() {
+    //
+    // class A {
+    //  int get b;
+    // }
+    // class B {
+    //   ... super.m ...
+    // }
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "b";
+    PropertyAccessorElement getter =
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[getter];
+    SuperExpression target = AstFactory.superExpression();
+    target.staticType = ElementFactory.classElement("B", classA.type).type;
+    PropertyAccess access = AstFactory.propertyAccess2(target, getterName);
+    AstFactory.methodDeclaration2(
+        null,
+        null,
+        null,
+        null,
+        AstFactory.identifier3("m"),
+        AstFactory.formalParameterList(),
+        AstFactory.expressionFunctionBody(access));
+    _resolveNode(access);
+    expect(access.propertyName.staticElement, same(getter));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPropertyAccess_setter_this() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String setterName = "b";
+    PropertyAccessorElement setter =
+        ElementFactory.setterElement(setterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[setter];
+    ThisExpression target = AstFactory.thisExpression();
+    target.staticType = classA.type;
+    PropertyAccess access = AstFactory.propertyAccess2(target, setterName);
+    AstFactory.assignmentExpression(
+        access, TokenType.EQ, AstFactory.integer(0));
+    _resolveNode(access);
+    expect(access.propertyName.staticElement, same(setter));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSimpleIdentifier_classScope() {
+    InterfaceType doubleType = _typeProvider.doubleType;
+    String fieldName = "NAN";
+    SimpleIdentifier node = AstFactory.identifier3(fieldName);
+    _resolveInClass(node, doubleType.element);
+    expect(node.staticElement, getGetter(doubleType, fieldName));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSimpleIdentifier_dynamic() {
+    SimpleIdentifier node = AstFactory.identifier3("dynamic");
+    _resolveIdentifier(node);
+    expect(node.staticElement, same(_typeProvider.dynamicType.element));
+    expect(node.staticType, same(_typeProvider.typeType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSimpleIdentifier_lexicalScope() {
+    SimpleIdentifier node = AstFactory.identifier3("i");
+    VariableElementImpl element = ElementFactory.localVariableElement(node);
+    expect(_resolveIdentifier(node, [element]), same(element));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSimpleIdentifier_lexicalScope_field_setter() {
+    InterfaceType intType = _typeProvider.intType;
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String fieldName = "a";
+    FieldElement field =
+        ElementFactory.fieldElement(fieldName, false, false, false, intType);
+    classA.fields = <FieldElement>[field];
+    classA.accessors = <PropertyAccessorElement>[field.getter, field.setter];
+    SimpleIdentifier node = AstFactory.identifier3(fieldName);
+    AstFactory.assignmentExpression(node, TokenType.EQ, AstFactory.integer(0));
+    _resolveInClass(node, classA);
+    Element element = node.staticElement;
+    EngineTestCase.assertInstanceOf((obj) => obj is PropertyAccessorElement,
+        PropertyAccessorElement, element);
+    expect((element as PropertyAccessorElement).isSetter, isTrue);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSuperConstructorInvocation() {
+    ClassElementImpl superclass = ElementFactory.classElement2("A");
+    ConstructorElementImpl superConstructor =
+        ElementFactory.constructorElement2(superclass, null);
+    superclass.constructors = <ConstructorElement>[superConstructor];
+    ClassElementImpl subclass =
+        ElementFactory.classElement("B", superclass.type);
+    ConstructorElementImpl subConstructor =
+        ElementFactory.constructorElement2(subclass, null);
+    subclass.constructors = <ConstructorElement>[subConstructor];
+    SuperConstructorInvocation invocation =
+        AstFactory.superConstructorInvocation();
+    _resolveInClass(invocation, subclass);
+    expect(invocation.staticElement, superConstructor);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSuperConstructorInvocation_namedParameter() {
+    ClassElementImpl superclass = ElementFactory.classElement2("A");
+    ConstructorElementImpl superConstructor =
+        ElementFactory.constructorElement2(superclass, null);
+    String parameterName = "p";
+    ParameterElement parameter = ElementFactory.namedParameter(parameterName);
+    superConstructor.parameters = <ParameterElement>[parameter];
+    superclass.constructors = <ConstructorElement>[superConstructor];
+    ClassElementImpl subclass =
+        ElementFactory.classElement("B", superclass.type);
+    ConstructorElementImpl subConstructor =
+        ElementFactory.constructorElement2(subclass, null);
+    subclass.constructors = <ConstructorElement>[subConstructor];
+    SuperConstructorInvocation invocation = AstFactory
+        .superConstructorInvocation([
+      AstFactory.namedExpression2(parameterName, AstFactory.integer(0))
+    ]);
+    _resolveInClass(invocation, subclass);
+    expect(invocation.staticElement, superConstructor);
+    expect(
+        (invocation.argumentList.arguments[0] as NamedExpression)
+            .name
+            .label
+            .staticElement,
+        same(parameter));
+    _listener.assertNoErrors();
+  }
+
+  /**
+   * Create the resolver used by the tests.
+   *
+   * @return the resolver that was created
+   */
+  ElementResolver _createResolver() {
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    FileBasedSource source =
+        new FileBasedSource(FileUtilities2.createFile("/test.dart"));
+    CompilationUnitElementImpl definingCompilationUnit =
+        new CompilationUnitElementImpl("test.dart");
+    definingCompilationUnit.librarySource =
+        definingCompilationUnit.source = source;
+    _definingLibrary = ElementFactory.library(context, "test");
+    _definingLibrary.definingCompilationUnit = definingCompilationUnit;
+    Library library = new Library(context, _listener, source);
+    library.libraryElement = _definingLibrary;
+    _visitor = new ResolverVisitor(
+        library.libraryElement, source, _typeProvider, library.errorListener,
+        nameScope: library.libraryScope,
+        inheritanceManager: library.inheritanceManager);
+    try {
+      return _visitor.elementResolver;
+    } catch (exception) {
+      throw new IllegalArgumentException(
+          "Could not create resolver", exception);
+    }
+  }
+
+  /**
+   * Return the element associated with the label of [statement] after the
+   * resolver has resolved it.  [labelElement] is the label element to be
+   * defined in the statement's label scope, and [labelTarget] is the statement
+   * the label resolves to.
+   */
+  Element _resolveBreak(BreakStatement statement, LabelElementImpl labelElement,
+      Statement labelTarget) {
+    _resolveStatement(statement, labelElement, labelTarget);
+    return statement.label.staticElement;
+  }
+
+  /**
+   * Return the element associated with the label [statement] after the
+   * resolver has resolved it.  [labelElement] is the label element to be
+   * defined in the statement's label scope, and [labelTarget] is the AST node
+   * the label resolves to.
+   *
+   * @param statement the statement to be resolved
+   * @param labelElement the label element to be defined in the statement's label scope
+   * @return the element to which the statement's label was resolved
+   */
+  Element _resolveContinue(ContinueStatement statement,
+      LabelElementImpl labelElement, AstNode labelTarget) {
+    _resolveStatement(statement, labelElement, labelTarget);
+    return statement.label.staticElement;
+  }
+
+  /**
+   * Return the element associated with the given identifier after the resolver has resolved the
+   * identifier.
+   *
+   * @param node the expression to be resolved
+   * @param definedElements the elements that are to be defined in the scope in which the element is
+   *          being resolved
+   * @return the element to which the expression was resolved
+   */
+  Element _resolveIdentifier(Identifier node, [List<Element> definedElements]) {
+    _resolveNode(node, definedElements);
+    return node.staticElement;
+  }
+
+  /**
+   * Return the element associated with the given identifier after the resolver has resolved the
+   * identifier.
+   *
+   * @param node the expression to be resolved
+   * @param enclosingClass the element representing the class enclosing the identifier
+   * @return the element to which the expression was resolved
+   */
+  void _resolveInClass(AstNode node, ClassElement enclosingClass) {
+    try {
+      Scope outerScope = _visitor.nameScope;
+      try {
+        _visitor.enclosingClass = enclosingClass;
+        EnclosedScope innerScope = new ClassScope(
+            new TypeParameterScope(outerScope, enclosingClass), enclosingClass);
+        _visitor.nameScope = innerScope;
+        node.accept(_resolver);
+      } finally {
+        _visitor.enclosingClass = null;
+        _visitor.nameScope = outerScope;
+      }
+    } catch (exception) {
+      throw new IllegalArgumentException("Could not resolve node", exception);
+    }
+  }
+
+  /**
+   * Return the element associated with the given expression after the resolver has resolved the
+   * expression.
+   *
+   * @param node the expression to be resolved
+   * @param definedElements the elements that are to be defined in the scope in which the element is
+   *          being resolved
+   * @return the element to which the expression was resolved
+   */
+  Element _resolveIndexExpression(IndexExpression node,
+      [List<Element> definedElements]) {
+    _resolveNode(node, definedElements);
+    return node.staticElement;
+  }
+
+  /**
+   * Return the element associated with the given identifier after the resolver has resolved the
+   * identifier.
+   *
+   * @param node the expression to be resolved
+   * @param definedElements the elements that are to be defined in the scope in which the element is
+   *          being resolved
+   * @return the element to which the expression was resolved
+   */
+  void _resolveNode(AstNode node, [List<Element> definedElements]) {
+    try {
+      Scope outerScope = _visitor.nameScope;
+      try {
+        EnclosedScope innerScope = new EnclosedScope(outerScope);
+        if (definedElements != null) {
+          for (Element element in definedElements) {
+            innerScope.define(element);
+          }
+        }
+        _visitor.nameScope = innerScope;
+        node.accept(_resolver);
+      } finally {
+        _visitor.nameScope = outerScope;
+      }
+    } catch (exception) {
+      throw new IllegalArgumentException("Could not resolve node", exception);
+    }
+  }
+
+  /**
+   * Return the element associated with the label of the given statement after the resolver has
+   * resolved the statement.
+   *
+   * @param statement the statement to be resolved
+   * @param labelElement the label element to be defined in the statement's label scope
+   * @return the element to which the statement's label was resolved
+   */
+  void _resolveStatement(
+      Statement statement, LabelElementImpl labelElement, AstNode labelTarget) {
+    try {
+      LabelScope outerScope = _visitor.labelScope;
+      try {
+        LabelScope innerScope;
+        if (labelElement == null) {
+          innerScope = outerScope;
+        } else {
+          innerScope = new LabelScope(
+              outerScope, labelElement.name, labelTarget, labelElement);
+        }
+        _visitor.labelScope = innerScope;
+        statement.accept(_resolver);
+      } finally {
+        _visitor.labelScope = outerScope;
+      }
+    } catch (exception) {
+      throw new IllegalArgumentException("Could not resolve node", exception);
+    }
+  }
+}
+
+@reflectiveTest
+class EnclosedScopeTest extends ResolverTestCase {
+  void test_define_duplicate() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope rootScope =
+        new Scope_EnclosedScopeTest_test_define_duplicate(listener);
+    EnclosedScope scope = new EnclosedScope(rootScope);
+    VariableElement element1 =
+        ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
+    VariableElement element2 =
+        ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
+    scope.define(element1);
+    scope.define(element2);
+    listener.assertErrorsWithSeverities([ErrorSeverity.ERROR]);
+  }
+
+  void test_define_normal() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope rootScope = new Scope_EnclosedScopeTest_test_define_normal(listener);
+    EnclosedScope outerScope = new EnclosedScope(rootScope);
+    EnclosedScope innerScope = new EnclosedScope(outerScope);
+    VariableElement element1 =
+        ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
+    VariableElement element2 =
+        ElementFactory.localVariableElement(AstFactory.identifier3("v2"));
+    outerScope.define(element1);
+    innerScope.define(element2);
+    listener.assertNoErrors();
+  }
+}
+
+@reflectiveTest
+class ErrorResolverTest extends ResolverTestCase {
+  void test_breakLabelOnSwitchMember() {
+    Source source = addSource(r'''
+class A {
+  void m(int i) {
+    switch (i) {
+      l: case 0:
+        break;
+      case 1:
+        break l;
+    }
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER]);
+    verify([source]);
+  }
+
+  void test_continueLabelOnSwitch() {
+    Source source = addSource(r'''
+class A {
+  void m(int i) {
+    l: switch (i) {
+      case 0:
+        continue l;
+    }
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH]);
+    verify([source]);
+  }
+
+  void test_enclosingElement_invalidLocalFunction() {
+    Source source = addSource(r'''
+class C {
+  C() {
+    int get x => 0;
+  }
+}''');
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    var unit = library.definingCompilationUnit;
+    expect(unit, isNotNull);
+    var types = unit.types;
+    expect(types, isNotNull);
+    expect(types, hasLength(1));
+    var type = types[0];
+    expect(type, isNotNull);
+    var constructors = type.constructors;
+    expect(constructors, isNotNull);
+    expect(constructors, hasLength(1));
+    ConstructorElement constructor = constructors[0];
+    expect(constructor, isNotNull);
+    List<FunctionElement> functions = constructor.functions;
+    expect(functions, isNotNull);
+    expect(functions, hasLength(1));
+    expect(functions[0].enclosingElement, constructor);
+    assertErrors(source, [ParserErrorCode.GETTER_IN_FUNCTION]);
+  }
+}
+
+@reflectiveTest
+class HintCodeTest extends ResolverTestCase {
+  void fail_deadCode_statementAfterRehrow() {
+    Source source = addSource(r'''
+f() {
+  try {
+    var one = 1;
+  } catch (e) {
+    rethrow;
+    var two = 2;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void fail_deadCode_statementAfterThrow() {
+    Source source = addSource(r'''
+f() {
+  var one = 1;
+  throw 'Stop here';
+  var two = 2;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void fail_isInt() {
+    Source source = addSource("var v = 1 is int;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.IS_INT]);
+    verify([source]);
+  }
+
+  void fail_isNotInt() {
+    Source source = addSource("var v = 1 is! int;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.IS_NOT_INT]);
+    verify([source]);
+  }
+
+  void fail_overrideEqualsButNotHashCode() {
+    Source source = addSource(r'''
+class A {
+  bool operator ==(x) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE]);
+    verify([source]);
+  }
+
+  void fail_unusedImport_as_equalPrefixes() {
+    // See todo at ImportsVerifier.prefixElementMap.
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' as one;
+import 'lib2.dart' as one;
+one.A a;''');
+    Source source2 = addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class A {}''');
+    Source source3 = addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+class B {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_IMPORT]);
+    assertNoErrors(source2);
+    assertNoErrors(source3);
+    verify([source, source2, source3]);
+  }
+
+  void test_argumentTypeNotAssignable_functionType() {
+    Source source = addSource(r'''
+m() {
+  var a = new A();
+  a.n(() => 0);
+}
+class A {
+  n(void f(int i)) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_message() {
+    // The implementation of HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE assumes that
+    // StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE has the same message.
+    expect(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE.message,
+        HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE.message);
+  }
+
+  void test_argumentTypeNotAssignable_type() {
+    Source source = addSource(r'''
+m() {
+  var i = '';
+  n(i);
+}
+n(int i) {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_conditionalElse() {
+    Source source = addSource(r'''
+f() {
+  true ? 1 : 2;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_conditionalElse_nested() {
+    // test that a dead else-statement can't generate additional violations
+    Source source = addSource(r'''
+f() {
+  true ? true : false && false;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_conditionalIf() {
+    Source source = addSource(r'''
+f() {
+  false ? 1 : 2;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_conditionalIf_nested() {
+    // test that a dead then-statement can't generate additional violations
+    Source source = addSource(r'''
+f() {
+  false ? false && false : true;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_else() {
+    Source source = addSource(r'''
+f() {
+  if(true) {} else {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_else_nested() {
+    // test that a dead else-statement can't generate additional violations
+    Source source = addSource(r'''
+f() {
+  if(true) {} else {if (false) {}}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_if() {
+    Source source = addSource(r'''
+f() {
+  if(false) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_if_nested() {
+    // test that a dead then-statement can't generate additional violations
+    Source source = addSource(r'''
+f() {
+  if(false) {if(false) {}}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_while() {
+    Source source = addSource(r'''
+f() {
+  while(false) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_while_nested() {
+    // test that a dead while body can't generate additional violations
+    Source source = addSource(r'''
+f() {
+  while(false) {if(false) {}}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadCatch_catchFollowingCatch() {
+    Source source = addSource(r'''
+class A {}
+f() {
+  try {} catch (e) {} catch (e) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadCatch_catchFollowingCatch_nested() {
+    // test that a dead catch clause can't generate additional violations
+    Source source = addSource(r'''
+class A {}
+f() {
+  try {} catch (e) {} catch (e) {if(false) {}}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadCatch_catchFollowingCatch_object() {
+    Source source = addSource(r'''
+f() {
+  try {} on Object catch (e) {} catch (e) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadCatch_catchFollowingCatch_object_nested() {
+    // test that a dead catch clause can't generate additional violations
+    Source source = addSource(r'''
+f() {
+  try {} on Object catch (e) {} catch (e) {if(false) {}}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadCatch_onCatchSubtype() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+f() {
+  try {} on A catch (e) {} on B catch (e) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE_ON_CATCH_SUBTYPE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadCatch_onCatchSubtype_nested() {
+    // test that a dead catch clause can't generate additional violations
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+f() {
+  try {} on A catch (e) {} on B catch (e) {if(false) {}}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE_ON_CATCH_SUBTYPE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadOperandLHS_and() {
+    Source source = addSource(r'''
+f() {
+  bool b = false && false;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadOperandLHS_and_nested() {
+    Source source = addSource(r'''
+f() {
+  bool b = false && (false && false);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadOperandLHS_or() {
+    Source source = addSource(r'''
+f() {
+  bool b = true || true;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_deadOperandLHS_or_nested() {
+    Source source = addSource(r'''
+f() {
+  bool b = true || (false && false);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterBreak_inDefaultCase() {
+    Source source = addSource(r'''
+f(v) {
+  switch(v) {
+    case 1:
+    default:
+      break;
+      var a;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterBreak_inForEachStatement() {
+    Source source = addSource(r'''
+f() {
+  var list;
+  for(var l in list) {
+    break;
+    var a;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterBreak_inForStatement() {
+    Source source = addSource(r'''
+f() {
+  for(;;) {
+    break;
+    var a;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterBreak_inSwitchCase() {
+    Source source = addSource(r'''
+f(v) {
+  switch(v) {
+    case 1:
+      break;
+      var a;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterBreak_inWhileStatement() {
+    Source source = addSource(r'''
+f(v) {
+  while(v) {
+    break;
+    var a;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterContinue_inForEachStatement() {
+    Source source = addSource(r'''
+f() {
+  var list;
+  for(var l in list) {
+    continue;
+    var a;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterContinue_inForStatement() {
+    Source source = addSource(r'''
+f() {
+  for(;;) {
+    continue;
+    var a;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterContinue_inWhileStatement() {
+    Source source = addSource(r'''
+f(v) {
+  while(v) {
+    continue;
+    var a;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterReturn_function() {
+    Source source = addSource(r'''
+f() {
+  var one = 1;
+  return;
+  var two = 2;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterReturn_ifStatement() {
+    Source source = addSource(r'''
+f(bool b) {
+  if(b) {
+    var one = 1;
+    return;
+    var two = 2;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterReturn_method() {
+    Source source = addSource(r'''
+class A {
+  m() {
+    var one = 1;
+    return;
+    var two = 2;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterReturn_nested() {
+    Source source = addSource(r'''
+f() {
+  var one = 1;
+  return;
+  if(false) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deadCode_statementAfterReturn_twoReturns() {
+    Source source = addSource(r'''
+f() {
+  var one = 1;
+  return;
+  var two = 2;
+  return;
+  var three = 3;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_assignment() {
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  A operator+(A a) { return a; }
+}
+f(A a) {
+  A b;
+  a += b;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_Deprecated() {
+    Source source = addSource(r'''
+class A {
+  @Deprecated('0.9')
+  m() {}
+  n() {m();}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_deprecated() {
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  m() {}
+  n() {m();}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_export() {
+    Source source = addSource("export 'deprecated_library.dart';");
+    addNamedSource(
+        "/deprecated_library.dart",
+        r'''
+@deprecated
+library deprecated_library;
+class A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_getter() {
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  get m => 1;
+}
+f(A a) {
+  return a.m;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_import() {
+    Source source = addSource(r'''
+import 'deprecated_library.dart';
+f(A a) {}''');
+    addNamedSource(
+        "/deprecated_library.dart",
+        r'''
+@deprecated
+library deprecated_library;
+class A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_indexExpression() {
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  operator[](int i) {}
+}
+f(A a) {
+  return a[1];
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_instanceCreation() {
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  A(int i) {}
+}
+f() {
+  A a = new A(1);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_instanceCreation_namedConstructor() {
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  A.named(int i) {}
+}
+f() {
+  A a = new A.named(1);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_operator() {
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  operator+(A a) {}
+}
+f(A a) {
+  A b;
+  return a + b;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_setter() {
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  set s(v) {}
+}
+f(A a) {
+  return a.s = 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_superConstructor() {
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  A() {}
+}
+class B extends A {
+  B() : super() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_deprecatedAnnotationUse_superConstructor_namedConstructor() {
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  A.named() {}
+}
+class B extends A {
+  B() : super.named() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
+    verify([source]);
+  }
+
+  void test_divisionOptimization_double() {
+    Source source = addSource(r'''
+f(double x, double y) {
+  var v = (x / y).toInt();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
+    verify([source]);
+  }
+
+  void test_divisionOptimization_int() {
+    Source source = addSource(r'''
+f(int x, int y) {
+  var v = (x / y).toInt();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
+    verify([source]);
+  }
+
+  void test_divisionOptimization_propagatedType() {
+    // Tests the propagated type information of the '/' method
+    Source source = addSource(r'''
+f(x, y) {
+  x = 1;
+  y = 1;
+  var v = (x / y).toInt();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
+    verify([source]);
+  }
+
+  void test_divisionOptimization_wrappedBinaryExpression() {
+    Source source = addSource(r'''
+f(int x, int y) {
+  var v = (((x / y))).toInt();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
+    verify([source]);
+  }
+
+  void test_duplicateImport() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+import 'lib1.dart';
+A a;''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DUPLICATE_IMPORT]);
+    verify([source]);
+  }
+
+  void test_duplicateImport2() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+import 'lib1.dart';
+import 'lib1.dart';
+A a;''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [HintCode.DUPLICATE_IMPORT, HintCode.DUPLICATE_IMPORT]);
+    verify([source]);
+  }
+
+  void test_duplicateImport3() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' as M show A hide B;
+import 'lib1.dart' as M show A hide B;
+M.A a;''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class A {}
+class B {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.DUPLICATE_IMPORT]);
+    verify([source]);
+  }
+
+  void test_importDeferredLibraryWithLoadFunction() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+loadLibrary() {}
+f() {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as lib1;
+main() { lib1.f(); }'''
+    ], <ErrorCode>[
+      HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION
+    ]);
+  }
+
+  void test_invalidAssignment_instanceVariable() {
+    Source source = addSource(r'''
+class A {
+  int x;
+}
+f(var y) {
+  A a;
+  if(y is String) {
+    a.x = y;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_localVariable() {
+    Source source = addSource(r'''
+f(var y) {
+  if(y is String) {
+    int x = y;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_message() {
+    // The implementation of HintCode.INVALID_ASSIGNMENT assumes that
+    // StaticTypeWarningCode.INVALID_ASSIGNMENT has the same message.
+    expect(StaticTypeWarningCode.INVALID_ASSIGNMENT.message,
+        HintCode.INVALID_ASSIGNMENT.message);
+  }
+
+  void test_invalidAssignment_staticVariable() {
+    Source source = addSource(r'''
+class A {
+  static int x;
+}
+f(var y) {
+  if(y is String) {
+    A.x = y;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_variableDeclaration() {
+    // 17971
+    Source source = addSource(r'''
+class Point {
+  final num x, y;
+  Point(this.x, this.y);
+  Point operator +(Point other) {
+    return new Point(x+other.x, y+other.y);
+  }
+}
+main() {
+  var p1 = new Point(0, 0);
+  var p2 = new Point(10, 10);
+  int n = p1 + p2;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_isDouble() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.dart2jsHint = true;
+    resetWithOptions(options);
+    Source source = addSource("var v = 1 is double;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.IS_DOUBLE]);
+    verify([source]);
+  }
+
+  void test_isNotDouble() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.dart2jsHint = true;
+    resetWithOptions(options);
+    Source source = addSource("var v = 1 is! double;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.IS_NOT_DOUBLE]);
+    verify([source]);
+  }
+
+  void test_missingReturn_async() {
+    Source source = addSource('''
+import 'dart:async';
+Future<int> f() async {}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.MISSING_RETURN]);
+    verify([source]);
+  }
+
+  void test_missingReturn_function() {
+    Source source = addSource("int f() {}");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.MISSING_RETURN]);
+    verify([source]);
+  }
+
+  void test_missingReturn_method() {
+    Source source = addSource(r'''
+class A {
+  int m() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.MISSING_RETURN]);
+    verify([source]);
+  }
+
+  void test_overrideOnNonOverridingGetter_invalid() {
+    Source source = addSource(r'''
+library dart.core;
+const override = null;
+class A {
+}
+class B extends A {
+  @override
+  int get m => 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.OVERRIDE_ON_NON_OVERRIDING_GETTER]);
+    verify([source]);
+  }
+
+  void test_overrideOnNonOverridingMethod_invalid() {
+    Source source = addSource(r'''
+library dart.core;
+const override = null;
+class A {
+}
+class B extends A {
+  @override
+  int m() => 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD]);
+    verify([source]);
+  }
+
+  void test_overrideOnNonOverridingSetter_invalid() {
+    Source source = addSource(r'''
+library dart.core;
+const override = null;
+class A {
+}
+class B extends A {
+  @override
+  set m(int x) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER]);
+    verify([source]);
+  }
+
+  void test_typeCheck_type_is_Null() {
+    Source source = addSource(r'''
+m(i) {
+  bool b = i is Null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.TYPE_CHECK_IS_NULL]);
+    verify([source]);
+  }
+
+  void test_typeCheck_type_not_Null() {
+    Source source = addSource(r'''
+m(i) {
+  bool b = i is! Null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.TYPE_CHECK_IS_NOT_NULL]);
+    verify([source]);
+  }
+
+  void test_undefinedGetter() {
+    Source source = addSource(r'''
+class A {}
+f(var a) {
+  if(a is A) {
+    return a.m;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNDEFINED_GETTER]);
+  }
+
+  void test_undefinedGetter_message() {
+    // The implementation of HintCode.UNDEFINED_SETTER assumes that
+    // UNDEFINED_SETTER in StaticTypeWarningCode and StaticWarningCode are the
+    // same, this verifies that assumption.
+    expect(StaticWarningCode.UNDEFINED_GETTER.message,
+        StaticTypeWarningCode.UNDEFINED_GETTER.message);
+  }
+
+  void test_undefinedMethod() {
+    Source source = addSource(r'''
+f() {
+  var a = 'str';
+  a.notAMethodOnString();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNDEFINED_METHOD]);
+  }
+
+  void test_undefinedMethod_assignmentExpression() {
+    Source source = addSource(r'''
+class A {}
+class B {
+  f(var a, var a2) {
+    a = new A();
+    a2 = new A();
+    a += a2;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNDEFINED_METHOD]);
+  }
+
+  void test_undefinedOperator_binaryExpression() {
+    Source source = addSource(r'''
+class A {}
+f(var a) {
+  if(a is A) {
+    a + 1;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_undefinedOperator_indexBoth() {
+    Source source = addSource(r'''
+class A {}
+f(var a) {
+  if(a is A) {
+    a[0]++;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_undefinedOperator_indexGetter() {
+    Source source = addSource(r'''
+class A {}
+f(var a) {
+  if(a is A) {
+    a[0];
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_undefinedOperator_indexSetter() {
+    Source source = addSource(r'''
+class A {}
+f(var a) {
+  if(a is A) {
+    a[0] = 1;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_undefinedOperator_postfixExpression() {
+    Source source = addSource(r'''
+class A {}
+f(var a) {
+  if(a is A) {
+    a++;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_undefinedOperator_prefixExpression() {
+    Source source = addSource(r'''
+class A {}
+f(var a) {
+  if(a is A) {
+    ++a;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_undefinedSetter() {
+    Source source = addSource(r'''
+class A {}
+f(var a) {
+  if(a is A) {
+    a.m = 0;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNDEFINED_SETTER]);
+  }
+
+  void test_undefinedSetter_message() {
+    // The implementation of HintCode.UNDEFINED_SETTER assumes that
+    // UNDEFINED_SETTER in StaticTypeWarningCode and StaticWarningCode are the
+    // same, this verifies that assumption.
+    expect(StaticWarningCode.UNDEFINED_SETTER.message,
+        StaticTypeWarningCode.UNDEFINED_SETTER.message);
+  }
+
+  void test_unnecessaryCast_type_supertype() {
+    Source source = addSource(r'''
+m(int i) {
+  var b = i as Object;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNNECESSARY_CAST]);
+    verify([source]);
+  }
+
+  void test_unnecessaryCast_type_type() {
+    Source source = addSource(r'''
+m(num i) {
+  var b = i as num;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNNECESSARY_CAST]);
+    verify([source]);
+  }
+
+  void test_unnecessaryTypeCheck_null_is_Null() {
+    Source source = addSource("bool b = null is Null;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_TRUE]);
+    verify([source]);
+  }
+
+  void test_unnecessaryTypeCheck_null_not_Null() {
+    Source source = addSource("bool b = null is! Null;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_FALSE]);
+    verify([source]);
+  }
+
+  void test_unnecessaryTypeCheck_type_is_dynamic() {
+    Source source = addSource(r'''
+m(i) {
+  bool b = i is dynamic;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_TRUE]);
+    verify([source]);
+  }
+
+  void test_unnecessaryTypeCheck_type_is_object() {
+    Source source = addSource(r'''
+m(i) {
+  bool b = i is Object;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_TRUE]);
+    verify([source]);
+  }
+
+  void test_unnecessaryTypeCheck_type_not_dynamic() {
+    Source source = addSource(r'''
+m(i) {
+  bool b = i is! dynamic;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_FALSE]);
+    verify([source]);
+  }
+
+  void test_unnecessaryTypeCheck_type_not_object() {
+    Source source = addSource(r'''
+m(i) {
+  bool b = i is! Object;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_FALSE]);
+    verify([source]);
+  }
+
+  void test_unusedElement_class_isUsed_extends() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class _A {}
+class B extends _A {}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_class_isUsed_implements() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class _A {}
+class B implements _A {}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_class_isUsed_instanceCreation() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class _A {}
+main() {
+  new _A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_class_isUsed_staticFieldAccess() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class _A {
+  static const F = 42;
+}
+main() {
+  _A.F;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_class_isUsed_staticMethodInvocation() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class _A {
+  static m() {}
+}
+main() {
+  _A.m();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_class_isUsed_typeArgument() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class _A {}
+main() {
+  var v = new List<_A>();
+  print(v);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_class_notUsed_inClassMember() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class _A {
+  static staticMethod() {
+    new _A();
+  }
+  instanceMethod() {
+    new _A();
+  }
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_ELEMENT]);
+    verify([source]);
+  }
+
+  void test_unusedElement_class_notUsed_inConstructorName() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class _A {
+  _A() {}
+  _A.named() {}
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_ELEMENT]);
+    verify([source]);
+  }
+
+  void test_unusedElement_class_notUsed_isExpression() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class _A {}
+main(p) {
+  if (p is _A) {
+  }
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_ELEMENT]);
+    verify([source]);
+  }
+
+  void test_unusedElement_class_notUsed_noReference() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class _A {}
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_ELEMENT]);
+    verify([source]);
+  }
+
+  void test_unusedElement_class_notUsed_variableDeclaration() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class _A {}
+main() {
+  _A v;
+  print(v);
+}
+print(x) {}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_ELEMENT]);
+    verify([source]);
+  }
+
+  void test_unusedElement_enum_isUsed_fieldReference() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+enum _MyEnum {A, B, C}
+main() {
+  print(_MyEnum.B);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_enum_notUsed_noReference() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+enum _MyEnum {A, B, C}
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_ELEMENT]);
+    verify([source]);
+  }
+
+  void test_unusedElement_functionLocal_isUsed_closure() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+main() {
+  print(() {});
+}
+print(x) {}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_functionLocal_isUsed_invocation() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+main() {
+  f() {}
+  f();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_functionLocal_isUsed_reference() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+main() {
+  f() {}
+  print(f);
+}
+print(x) {}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_functionLocal_notUsed_noReference() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+main() {
+  f() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_ELEMENT]);
+    verify([source]);
+  }
+
+  void test_unusedElement_functionLocal_notUsed_referenceFromItself() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+main() {
+  _f(int p) {
+    _f(p - 1);
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_ELEMENT]);
+    verify([source]);
+  }
+
+  void test_unusedElement_functionTop_isUsed_invocation() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+_f() {}
+main() {
+  _f();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_functionTop_isUsed_reference() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+_f() {}
+main() {
+  print(_f);
+}
+print(x) {}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_functionTop_notUsed_noReference() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+_f() {}
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_ELEMENT]);
+    verify([source]);
+  }
+
+  void test_unusedElement_functionTop_notUsed_referenceFromItself() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+_f(int p) {
+  _f(p - 1);
+}
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_ELEMENT]);
+    verify([source]);
+  }
+
+  void test_unusedElement_functionTypeAlias_isUsed_isExpression() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+typedef _F(a, b);
+main(f) {
+  if (f is _F) {
+    print('F');
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_functionTypeAlias_isUsed_reference() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+typedef _F(a, b);
+main(_F f) {
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_functionTypeAlias_isUsed_typeArgument() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+typedef _F(a, b);
+main() {
+  var v = new List<_F>();
+  print(v);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_functionTypeAlias_isUsed_variableDeclaration() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+typedef _F(a, b);
+class A {
+  _F f;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_functionTypeAlias_notUsed_noReference() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+typedef _F(a, b);
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_ELEMENT]);
+    verify([source]);
+  }
+
+  void test_unusedElement_getter_isUsed_invocation_implicitThis() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  get _g => null;
+  useGetter() {
+    var v = _g;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_getter_isUsed_invocation_PrefixedIdentifier() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  get _g => null;
+}
+main(A a) {
+  var v = a._g;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_getter_isUsed_invocation_PropertyAccess() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  get _g => null;
+}
+main() {
+  var v = new A()._g;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_getter_notUsed_noReference() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  get _g => null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_ELEMENT]);
+    verify([source]);
+  }
+
+  void test_unusedElement_getter_notUsed_referenceFromItself() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  get _g {
+    return _g;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_ELEMENT]);
+    verify([source]);
+  }
+
+  void test_unusedElement_method_isUsed_hasReference_implicitThis() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  _m() {}
+  useMethod() {
+    print(_m);
+  }
+}
+print(x) {}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_method_isUsed_hasReference_implicitThis_subclass() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  _m() {}
+  useMethod() {
+    print(_m);
+  }
+}
+class B extends A {
+  _m() {}
+}
+print(x) {}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_method_isUsed_hasReference_PrefixedIdentifier() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  _m() {}
+}
+main(A a) {
+  a._m;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_method_isUsed_hasReference_PropertyAccess() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  _m() {}
+}
+main() {
+  new A()._m;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_method_isUsed_invocation_implicitThis() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  _m() {}
+  useMethod() {
+    _m();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_method_isUsed_invocation_implicitThis_subclass() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  _m() {}
+  useMethod() {
+    _m();
+  }
+}
+class B extends A {
+  _m() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_method_isUsed_invocation_MemberElement() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A<T> {
+  _m(T t) {}
+}
+main(A<int> a) {
+  a._m(0);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_method_isUsed_invocation_propagated() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  _m() {}
+}
+main() {
+  var a = new A();
+  a._m();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_method_isUsed_invocation_static() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  _m() {}
+}
+main() {
+  A a = new A();
+  a._m();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_method_isUsed_invocation_subclass() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  _m() {}
+}
+class B extends A {
+  _m() {}
+}
+main(A a) {
+  a._m();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_method_isUsed_notPrivate() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_method_isUsed_staticInvocation() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  static _m() {}
+}
+main() {
+  A._m();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_method_notUsed_noReference() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  static _m() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_ELEMENT]);
+    verify([source]);
+  }
+
+  void test_unusedElement_method_notUsed_referenceFromItself() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  static _m(int p) {
+    _m(p - 1);
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_ELEMENT]);
+    verify([source]);
+  }
+
+  void test_unusedElement_setter_isUsed_invocation_implicitThis() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  set _s(x) {}
+  useSetter() {
+    _s = 42;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_setter_isUsed_invocation_PrefixedIdentifier() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  set _s(x) {}
+}
+main(A a) {
+  a._s = 42;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_setter_isUsed_invocation_PropertyAccess() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  set _s(x) {}
+}
+main() {
+  new A()._s = 42;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedElement_setter_notUsed_noReference() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  set _s(x) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_ELEMENT]);
+    verify([source]);
+  }
+
+  void test_unusedElement_setter_notUsed_referenceFromItself() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  set _s(int x) {
+    if (x > 5) {
+      _s = x - 1;
+    }
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_ELEMENT]);
+    verify([source]);
+  }
+
+  void test_unusedField_isUsed_argument() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  int _f = 0;
+  main() {
+    print(++_f);
+  }
+}
+print(x) {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedField_isUsed_reference_implicitThis() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  int _f;
+  main() {
+    print(_f);
+  }
+}
+print(x) {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedField_isUsed_reference_implicitThis_expressionFunctionBody() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  int _f;
+  m() => _f;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedField_isUsed_reference_implicitThis_subclass() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  int _f;
+  main() {
+    print(_f);
+  }
+}
+class B extends A {
+  int _f;
+}
+print(x) {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedField_isUsed_reference_qualified_propagatedElement() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  int _f;
+}
+main() {
+  var a = new A();
+  print(a._f);
+}
+print(x) {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedField_isUsed_reference_qualified_staticElement() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  int _f;
+}
+main() {
+  A a = new A();
+  print(a._f);
+}
+print(x) {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedField_isUsed_reference_qualified_unresolved() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  int _f;
+}
+main(a) {
+  print(a._f);
+}
+print(x) {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedField_notUsed_compoundAssign() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  int _f;
+  main() {
+    _f += 2;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_FIELD]);
+    verify([source]);
+  }
+
+  void test_unusedField_notUsed_noReference() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  int _f;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_FIELD]);
+    verify([source]);
+  }
+
+  void test_unusedField_notUsed_postfixExpr() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  int _f = 0;
+  main() {
+    _f++;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_FIELD]);
+    verify([source]);
+  }
+
+  void test_unusedField_notUsed_prefixExpr() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  int _f = 0;
+  main() {
+    ++_f;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_FIELD]);
+    verify([source]);
+  }
+
+  void test_unusedField_notUsed_simpleAssignment() {
+    enableUnusedElement = true;
+    Source source = addSource(r'''
+class A {
+  int _f;
+  m() {
+    _f = 1;
+  }
+}
+main(A a) {
+  a._f = 2;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_FIELD]);
+    verify([source]);
+  }
+
+  void test_unusedImport() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';''');
+    Source source2 = addNamedSource("/lib1.dart", "library lib1;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_IMPORT]);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  void test_unusedImport_as() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+import 'lib1.dart' as one;
+one.A a;''');
+    Source source2 = addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_IMPORT]);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  void test_unusedImport_hide() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+import 'lib1.dart' hide A;
+A a;''');
+    Source source2 = addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class A {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_IMPORT]);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  void test_unusedImport_show() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' show A;
+import 'lib1.dart' show B;
+A a;''');
+    Source source2 = addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class A {}
+class B {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_IMPORT]);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  void test_unusedLocalVariable_inCatch_exception() {
+    enableUnusedLocalVariable = true;
+    Source source = addSource(r'''
+main() {
+  try {
+  } on String catch (exception) {
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_CATCH_CLAUSE]);
+    verify([source]);
+  }
+
+  void test_unusedLocalVariable_inCatch_exception_hasStack() {
+    enableUnusedLocalVariable = true;
+    Source source = addSource(r'''
+main() {
+  try {
+  } catch (exception, stack) {
+    print(stack);
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedLocalVariable_inCatch_exception_noOnClause() {
+    enableUnusedLocalVariable = true;
+    Source source = addSource(r'''
+main() {
+  try {
+  } catch (exception) {
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedLocalVariable_inCatch_stackTrace() {
+    enableUnusedLocalVariable = true;
+    Source source = addSource(r'''
+main() {
+  try {
+  } catch (exception, stackTrace) {
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_CATCH_STACK]);
+    verify([source]);
+  }
+
+  void test_unusedLocalVariable_inCatch_stackTrace_used() {
+    enableUnusedLocalVariable = true;
+    Source source = addSource(r'''
+main() {
+  try {
+  } catch (exception, stackTrace) {
+    print('exception at $stackTrace');
+  }
+}
+print(x) {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedLocalVariable_inFor_underscore_ignored() {
+    enableUnusedLocalVariable = true;
+    Source source = addSource(r'''
+main() {
+  for (var _ in [1,2,3]) {
+    for (var __ in [4,5,6]) {
+      // do something
+    }
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedLocalVariable_inFunction() {
+    enableUnusedLocalVariable = true;
+    Source source = addSource(r'''
+main() {
+  var v = 1;
+  v = 2;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_LOCAL_VARIABLE]);
+    verify([source]);
+  }
+
+  void test_unusedLocalVariable_inMethod() {
+    enableUnusedLocalVariable = true;
+    Source source = addSource(r'''
+class A {
+  foo() {
+    var v = 1;
+    v = 2;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_LOCAL_VARIABLE]);
+    verify([source]);
+  }
+
+  void test_unusedLocalVariable_isInvoked() {
+    enableUnusedLocalVariable = true;
+    Source source = addSource(r'''
+typedef Foo();
+main() {
+  Foo foo;
+  foo();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedLocalVariable_isRead_notUsed_compoundAssign() {
+    enableUnusedLocalVariable = true;
+    Source source = addSource(r'''
+main() {
+  var v = 1;
+  v += 2;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_LOCAL_VARIABLE]);
+    verify([source]);
+  }
+
+  void test_unusedLocalVariable_isRead_notUsed_postfixExpr() {
+    enableUnusedLocalVariable = true;
+    Source source = addSource(r'''
+main() {
+  var v = 1;
+  v++;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_LOCAL_VARIABLE]);
+    verify([source]);
+  }
+
+  void test_unusedLocalVariable_isRead_notUsed_prefixExpr() {
+    enableUnusedLocalVariable = true;
+    Source source = addSource(r'''
+main() {
+  var v = 1;
+  ++v;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.UNUSED_LOCAL_VARIABLE]);
+    verify([source]);
+  }
+
+  void test_unusedLocalVariable_isRead_usedArgument() {
+    enableUnusedLocalVariable = true;
+    Source source = addSource(r'''
+main() {
+  var v = 1;
+  print(++v);
+}
+print(x) {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedLocalVariable_isRead_usedInvocationTarget() {
+    enableUnusedLocalVariable = true;
+    Source source = addSource(r'''
+class A {
+  foo() {}
+}
+main() {
+  var a = new A();
+  a.foo();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source);
+    verify([source]);
+  }
+
+  void test_useOfVoidResult_assignmentExpression_function() {
+    Source source = addSource(r'''
+void f() {}
+class A {
+  n() {
+    var a;
+    a = f();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
+    verify([source]);
+  }
+
+  void test_useOfVoidResult_assignmentExpression_method() {
+    Source source = addSource(r'''
+class A {
+  void m() {}
+  n() {
+    var a;
+    a = m();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
+    verify([source]);
+  }
+
+  void test_useOfVoidResult_inForLoop() {
+    Source source = addSource(r'''
+class A {
+  void m() {}
+  n() {
+    for(var a = m();;) {}
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
+    verify([source]);
+  }
+
+  void test_useOfVoidResult_variableDeclaration_function() {
+    Source source = addSource(r'''
+void f() {}
+class A {
+  n() {
+    var a = f();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
+    verify([source]);
+  }
+
+  void test_useOfVoidResult_variableDeclaration_method() {
+    Source source = addSource(r'''
+class A {
+  void m() {}
+  n() {
+    var a = m();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
+    verify([source]);
+  }
+
+  void test_useOfVoidResult_variableDeclaration_method2() {
+    Source source = addSource(r'''
+class A {
+  void m() {}
+  n() {
+    var a = m(), b = m();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [HintCode.USE_OF_VOID_RESULT, HintCode.USE_OF_VOID_RESULT]);
+    verify([source]);
+  }
+}
+
+@reflectiveTest
+class InheritanceManagerTest extends EngineTestCase {
+  /**
+   * The type provider used to access the types.
+   */
+  TestTypeProvider _typeProvider;
+
+  /**
+   * The library containing the code being resolved.
+   */
+  LibraryElementImpl _definingLibrary;
+
+  /**
+   * The inheritance manager being tested.
+   */
+  InheritanceManager _inheritanceManager;
+
+  /**
+   * The number of members that Object implements (as determined by [TestTypeProvider]).
+   */
+  int _numOfMembersInObject = 0;
+
+  @override
+  void setUp() {
+    _typeProvider = new TestTypeProvider();
+    _inheritanceManager = _createInheritanceManager();
+    InterfaceType objectType = _typeProvider.objectType;
+    _numOfMembersInObject =
+        objectType.methods.length + objectType.accessors.length;
+  }
+
+  void test_getMapOfMembersInheritedFromClasses_accessor_extends() {
+    // class A { int get g; }
+    // class B extends A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "g";
+    PropertyAccessorElement getterG =
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[getterG];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    MemberMap mapB =
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject + 1);
+    expect(mapB.get(getterName), same(getterG));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromClasses_accessor_implements() {
+    // class A { int get g; }
+    // class B implements A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "g";
+    PropertyAccessorElement getterG =
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[getterG];
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classB.interfaces = <InterfaceType>[classA.type];
+    MemberMap mapB =
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject);
+    expect(mapB.get(getterName), isNull);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromClasses_accessor_with() {
+    // class A { int get g; }
+    // class B extends Object with A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "g";
+    PropertyAccessorElement getterG =
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[getterG];
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classB.mixins = <InterfaceType>[classA.type];
+    MemberMap mapB =
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject + 1);
+    expect(mapB.get(getterName), same(getterG));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromClasses_implicitExtends() {
+    // class A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+    expect(mapA.size, _numOfMembersInObject);
+    _assertNoErrors(classA);
+  }
+
+  void test_getMapOfMembersInheritedFromClasses_method_extends() {
+    // class A { int g(); }
+    // class B extends A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement methodM =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classA.methods = <MethodElement>[methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classB.supertype = classA.type;
+    MemberMap mapB =
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject + 1);
+    expect(mapB.get(methodName), same(methodM));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromClasses_method_implements() {
+    // class A { int g(); }
+    // class B implements A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement methodM =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classA.methods = <MethodElement>[methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classB.interfaces = <InterfaceType>[classA.type];
+    MemberMap mapB =
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject);
+    expect(mapB.get(methodName), isNull);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromClasses_method_with() {
+    // class A { int g(); }
+    // class B extends Object with A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement methodM =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classA.methods = <MethodElement>[methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classB.mixins = <InterfaceType>[classA.type];
+    MemberMap mapB =
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject + 1);
+    expect(mapB.get(methodName), same(methodM));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromClasses_method_with_two_mixins() {
+    // class A1 { int m(); }
+    // class A2 { int m(); }
+    // class B extends Object with A1, A2 {}
+    ClassElementImpl classA1 = ElementFactory.classElement2("A1");
+    String methodName = "m";
+    MethodElement methodA1M =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classA1.methods = <MethodElement>[methodA1M];
+    ClassElementImpl classA2 = ElementFactory.classElement2("A2");
+    MethodElement methodA2M =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classA2.methods = <MethodElement>[methodA2M];
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classB.mixins = <InterfaceType>[classA1.type, classA2.type];
+    MemberMap mapB =
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+    expect(mapB.get(methodName), same(methodA2M));
+    _assertNoErrors(classA1);
+    _assertNoErrors(classA2);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_accessor_extends() {
+    // class A { int get g; }
+    // class B extends A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "g";
+    PropertyAccessorElement getterG =
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[getterG];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    MemberMap mapB =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject + 1);
+    expect(mapB.get(getterName), same(getterG));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_accessor_implements() {
+    // class A { int get g; }
+    // class B implements A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "g";
+    PropertyAccessorElement getterG =
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[getterG];
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classB.interfaces = <InterfaceType>[classA.type];
+    MemberMap mapB =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject + 1);
+    expect(mapB.get(getterName), same(getterG));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_accessor_with() {
+    // class A { int get g; }
+    // class B extends Object with A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "g";
+    PropertyAccessorElement getterG =
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[getterG];
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classB.mixins = <InterfaceType>[classA.type];
+    MemberMap mapB =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject + 1);
+    expect(mapB.get(getterName), same(getterG));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_implicitExtends() {
+    // class A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    expect(mapA.size, _numOfMembersInObject);
+    _assertNoErrors(classA);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_getter_method() {
+    // class I1 { int m(); }
+    // class I2 { int get m; }
+    // class A implements I2, I1 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1");
+    String methodName = "m";
+    MethodElement methodM =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classI1.methods = <MethodElement>[methodM];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2");
+    PropertyAccessorElement getter =
+        ElementFactory.getterElement(methodName, false, _typeProvider.intType);
+    classI2.accessors = <PropertyAccessorElement>[getter];
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.interfaces = <InterfaceType>[classI2.type, classI1.type];
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapA.get(methodName), isNull);
+    _assertErrors(classA,
+        [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD]);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_int_str() {
+    // class I1 { int m(); }
+    // class I2 { String m(); }
+    // class A implements I1, I2 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1");
+    String methodName = "m";
+    MethodElement methodM1 =
+        ElementFactory.methodElement(methodName, null, [_typeProvider.intType]);
+    classI1.methods = <MethodElement>[methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2");
+    MethodElement methodM2 = ElementFactory.methodElement(
+        methodName, null, [_typeProvider.stringType]);
+    classI2.methods = <MethodElement>[methodM2];
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.interfaces = <InterfaceType>[classI1.type, classI2.type];
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapA.get(methodName), isNull);
+    _assertErrors(
+        classA, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_method_getter() {
+    // class I1 { int m(); }
+    // class I2 { int get m; }
+    // class A implements I1, I2 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1");
+    String methodName = "m";
+    MethodElement methodM =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classI1.methods = <MethodElement>[methodM];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2");
+    PropertyAccessorElement getter =
+        ElementFactory.getterElement(methodName, false, _typeProvider.intType);
+    classI2.accessors = <PropertyAccessorElement>[getter];
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.interfaces = <InterfaceType>[classI1.type, classI2.type];
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapA.get(methodName), isNull);
+    _assertErrors(classA,
+        [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD]);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_numOfRequiredParams() {
+    // class I1 { dynamic m(int, [int]); }
+    // class I2 { dynamic m(int, int, int); }
+    // class A implements I1, I2 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1");
+    String methodName = "m";
+    MethodElementImpl methodM1 =
+        ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
+    ParameterElementImpl parameter1 =
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a1"));
+    parameter1.type = _typeProvider.intType;
+    parameter1.parameterKind = ParameterKind.REQUIRED;
+    ParameterElementImpl parameter2 =
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a2"));
+    parameter2.type = _typeProvider.intType;
+    parameter2.parameterKind = ParameterKind.POSITIONAL;
+    methodM1.parameters = <ParameterElement>[parameter1, parameter2];
+    classI1.methods = <MethodElement>[methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2");
+    MethodElementImpl methodM2 =
+        ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
+    ParameterElementImpl parameter3 =
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a3"));
+    parameter3.type = _typeProvider.intType;
+    parameter3.parameterKind = ParameterKind.REQUIRED;
+    ParameterElementImpl parameter4 =
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a4"));
+    parameter4.type = _typeProvider.intType;
+    parameter4.parameterKind = ParameterKind.REQUIRED;
+    ParameterElementImpl parameter5 =
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a5"));
+    parameter5.type = _typeProvider.intType;
+    parameter5.parameterKind = ParameterKind.REQUIRED;
+    methodM2.parameters = <ParameterElement>[
+      parameter3,
+      parameter4,
+      parameter5
+    ];
+    classI2.methods = <MethodElement>[methodM2];
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.interfaces = <InterfaceType>[classI1.type, classI2.type];
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapA.get(methodName), isNull);
+    _assertErrors(
+        classA, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_str_int() {
+    // class I1 { int m(); }
+    // class I2 { String m(); }
+    // class A implements I2, I1 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1");
+    String methodName = "m";
+    MethodElement methodM1 = ElementFactory.methodElement(
+        methodName, null, [_typeProvider.stringType]);
+    classI1.methods = <MethodElement>[methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2");
+    MethodElement methodM2 =
+        ElementFactory.methodElement(methodName, null, [_typeProvider.intType]);
+    classI2.methods = <MethodElement>[methodM2];
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.interfaces = <InterfaceType>[classI2.type, classI1.type];
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapA.get(methodName), isNull);
+    _assertErrors(
+        classA, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_method_extends() {
+    // class A { int g(); }
+    // class B extends A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement methodM =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classA.methods = <MethodElement>[methodM];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    MemberMap mapB =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject + 1);
+    expect(mapB.get(methodName), same(methodM));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_method_implements() {
+    // class A { int g(); }
+    // class B implements A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement methodM =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classA.methods = <MethodElement>[methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classB.interfaces = <InterfaceType>[classA.type];
+    MemberMap mapB =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject + 1);
+    expect(mapB.get(methodName), same(methodM));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_method_with() {
+    // class A { int g(); }
+    // class B extends Object with A {}
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement methodM =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classA.methods = <MethodElement>[methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classB.mixins = <InterfaceType>[classA.type];
+    MemberMap mapB =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject + 1);
+    expect(mapB.get(methodName), same(methodM));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_union_differentNames() {
+    // class I1 { int m1(); }
+    // class I2 { int m2(); }
+    // class A implements I1, I2 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1");
+    String methodName1 = "m1";
+    MethodElement methodM1 =
+        ElementFactory.methodElement(methodName1, _typeProvider.intType);
+    classI1.methods = <MethodElement>[methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2");
+    String methodName2 = "m2";
+    MethodElement methodM2 =
+        ElementFactory.methodElement(methodName2, _typeProvider.intType);
+    classI2.methods = <MethodElement>[methodM2];
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.interfaces = <InterfaceType>[classI1.type, classI2.type];
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    expect(mapA.size, _numOfMembersInObject + 2);
+    expect(mapA.get(methodName1), same(methodM1));
+    expect(mapA.get(methodName2), same(methodM2));
+    _assertNoErrors(classA);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_getters() {
+    // class I1 { int get g; }
+    // class I2 { num get g; }
+    // class A implements I1, I2 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1");
+    String accessorName = "g";
+    PropertyAccessorElement getter1 = ElementFactory.getterElement(
+        accessorName, false, _typeProvider.intType);
+    classI1.accessors = <PropertyAccessorElement>[getter1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2");
+    PropertyAccessorElement getter2 = ElementFactory.getterElement(
+        accessorName, false, _typeProvider.numType);
+    classI2.accessors = <PropertyAccessorElement>[getter2];
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.interfaces = <InterfaceType>[classI1.type, classI2.type];
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    expect(mapA.size, _numOfMembersInObject + 1);
+    PropertyAccessorElement syntheticAccessor = ElementFactory.getterElement(
+        accessorName, false, _typeProvider.dynamicType);
+    expect(mapA.get(accessorName).type, syntheticAccessor.type);
+    _assertNoErrors(classA);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_methods() {
+    // class I1 { dynamic m(int); }
+    // class I2 { dynamic m(num); }
+    // class A implements I1, I2 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1");
+    String methodName = "m";
+    MethodElementImpl methodM1 =
+        ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
+    ParameterElementImpl parameter1 =
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a0"));
+    parameter1.type = _typeProvider.intType;
+    parameter1.parameterKind = ParameterKind.REQUIRED;
+    methodM1.parameters = <ParameterElement>[parameter1];
+    classI1.methods = <MethodElement>[methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2");
+    MethodElementImpl methodM2 =
+        ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
+    ParameterElementImpl parameter2 =
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a0"));
+    parameter2.type = _typeProvider.numType;
+    parameter2.parameterKind = ParameterKind.REQUIRED;
+    methodM2.parameters = <ParameterElement>[parameter2];
+    classI2.methods = <MethodElement>[methodM2];
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.interfaces = <InterfaceType>[classI1.type, classI2.type];
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    expect(mapA.size, _numOfMembersInObject + 1);
+    MethodElement syntheticMethod = ElementFactory.methodElement(
+        methodName, _typeProvider.dynamicType, [_typeProvider.dynamicType]);
+    expect(mapA.get(methodName).type, syntheticMethod.type);
+    _assertNoErrors(classA);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_setters() {
+    // class I1 { set s(int); }
+    // class I2 { set s(num); }
+    // class A implements I1, I2 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1");
+    String accessorName = "s";
+    PropertyAccessorElement setter1 = ElementFactory.setterElement(
+        accessorName, false, _typeProvider.intType);
+    classI1.accessors = <PropertyAccessorElement>[setter1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2");
+    PropertyAccessorElement setter2 = ElementFactory.setterElement(
+        accessorName, false, _typeProvider.numType);
+    classI2.accessors = <PropertyAccessorElement>[setter2];
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.interfaces = <InterfaceType>[classI1.type, classI2.type];
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    expect(mapA.size, _numOfMembersInObject + 1);
+    PropertyAccessorElementImpl syntheticAccessor = ElementFactory
+        .setterElement(accessorName, false, _typeProvider.dynamicType);
+    syntheticAccessor.returnType = _typeProvider.dynamicType;
+    expect(mapA.get("$accessorName=").type, syntheticAccessor.type);
+    _assertNoErrors(classA);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_getters() {
+    // class A {}
+    // class B extends A {}
+    // class C extends B {}
+    // class I1 { A get g; }
+    // class I2 { B get g; }
+    // class I3 { C get g; }
+    // class D implements I1, I2, I3 {}
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classB.type);
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1");
+    String accessorName = "g";
+    PropertyAccessorElement getter1 =
+        ElementFactory.getterElement(accessorName, false, classA.type);
+    classI1.accessors = <PropertyAccessorElement>[getter1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2");
+    PropertyAccessorElement getter2 =
+        ElementFactory.getterElement(accessorName, false, classB.type);
+    classI2.accessors = <PropertyAccessorElement>[getter2];
+    ClassElementImpl classI3 = ElementFactory.classElement2("I3");
+    PropertyAccessorElement getter3 =
+        ElementFactory.getterElement(accessorName, false, classC.type);
+    classI3.accessors = <PropertyAccessorElement>[getter3];
+    ClassElementImpl classD = ElementFactory.classElement2("D");
+    classD.interfaces = <InterfaceType>[
+      classI1.type,
+      classI2.type,
+      classI3.type
+    ];
+    MemberMap mapD =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD);
+    expect(mapD.size, _numOfMembersInObject + 1);
+    PropertyAccessorElement syntheticAccessor = ElementFactory.getterElement(
+        accessorName, false, _typeProvider.dynamicType);
+    expect(mapD.get(accessorName).type, syntheticAccessor.type);
+    _assertNoErrors(classD);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_methods() {
+    // class A {}
+    // class B extends A {}
+    // class C extends B {}
+    // class I1 { dynamic m(A a); }
+    // class I2 { dynamic m(B b); }
+    // class I3 { dynamic m(C c); }
+    // class D implements I1, I2, I3 {}
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classB.type);
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1");
+    String methodName = "m";
+    MethodElementImpl methodM1 =
+        ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
+    ParameterElementImpl parameter1 =
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a0"));
+    parameter1.type = classA.type;
+    parameter1.parameterKind = ParameterKind.REQUIRED;
+    methodM1.parameters = <ParameterElement>[parameter1];
+    classI1.methods = <MethodElement>[methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2");
+    MethodElementImpl methodM2 =
+        ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
+    ParameterElementImpl parameter2 =
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a0"));
+    parameter2.type = classB.type;
+    parameter2.parameterKind = ParameterKind.REQUIRED;
+    methodM2.parameters = <ParameterElement>[parameter2];
+    classI2.methods = <MethodElement>[methodM2];
+    ClassElementImpl classI3 = ElementFactory.classElement2("I3");
+    MethodElementImpl methodM3 =
+        ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
+    ParameterElementImpl parameter3 =
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a0"));
+    parameter3.type = classC.type;
+    parameter3.parameterKind = ParameterKind.REQUIRED;
+    methodM3.parameters = <ParameterElement>[parameter3];
+    classI3.methods = <MethodElement>[methodM3];
+    ClassElementImpl classD = ElementFactory.classElement2("D");
+    classD.interfaces = <InterfaceType>[
+      classI1.type,
+      classI2.type,
+      classI3.type
+    ];
+    MemberMap mapD =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD);
+    expect(mapD.size, _numOfMembersInObject + 1);
+    MethodElement syntheticMethod = ElementFactory.methodElement(
+        methodName, _typeProvider.dynamicType, [_typeProvider.dynamicType]);
+    expect(mapD.get(methodName).type, syntheticMethod.type);
+    _assertNoErrors(classD);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_setters() {
+    // class A {}
+    // class B extends A {}
+    // class C extends B {}
+    // class I1 { set s(A); }
+    // class I2 { set s(B); }
+    // class I3 { set s(C); }
+    // class D implements I1, I2, I3 {}
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classB.type);
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1");
+    String accessorName = "s";
+    PropertyAccessorElement setter1 =
+        ElementFactory.setterElement(accessorName, false, classA.type);
+    classI1.accessors = <PropertyAccessorElement>[setter1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2");
+    PropertyAccessorElement setter2 =
+        ElementFactory.setterElement(accessorName, false, classB.type);
+    classI2.accessors = <PropertyAccessorElement>[setter2];
+    ClassElementImpl classI3 = ElementFactory.classElement2("I3");
+    PropertyAccessorElement setter3 =
+        ElementFactory.setterElement(accessorName, false, classC.type);
+    classI3.accessors = <PropertyAccessorElement>[setter3];
+    ClassElementImpl classD = ElementFactory.classElement2("D");
+    classD.interfaces = <InterfaceType>[
+      classI1.type,
+      classI2.type,
+      classI3.type
+    ];
+    MemberMap mapD =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD);
+    expect(mapD.size, _numOfMembersInObject + 1);
+    PropertyAccessorElementImpl syntheticAccessor = ElementFactory
+        .setterElement(accessorName, false, _typeProvider.dynamicType);
+    syntheticAccessor.returnType = _typeProvider.dynamicType;
+    expect(mapD.get("$accessorName=").type, syntheticAccessor.type);
+    _assertNoErrors(classD);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_2_methods() {
+    // class I1 { int m(); }
+    // class I2 { int m([int]); }
+    // class A implements I1, I2 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1");
+    String methodName = "m";
+    MethodElement methodM1 =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classI1.methods = <MethodElement>[methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2");
+    MethodElementImpl methodM2 =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    ParameterElementImpl parameter1 =
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a1"));
+    parameter1.type = _typeProvider.intType;
+    parameter1.parameterKind = ParameterKind.POSITIONAL;
+    methodM2.parameters = <ParameterElement>[parameter1];
+    classI2.methods = <MethodElement>[methodM2];
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.interfaces = <InterfaceType>[classI1.type, classI2.type];
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    expect(mapA.size, _numOfMembersInObject + 1);
+    expect(mapA.get(methodName), same(methodM2));
+    _assertNoErrors(classA);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_3_methods() {
+    // class I1 { int m(); }
+    // class I2 { int m([int]); }
+    // class I3 { int m([int, int]); }
+    // class A implements I1, I2, I3 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1");
+    String methodName = "m";
+    MethodElementImpl methodM1 =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classI1.methods = <MethodElement>[methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2");
+    MethodElementImpl methodM2 =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    ParameterElementImpl parameter1 =
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a1"));
+    parameter1.type = _typeProvider.intType;
+    parameter1.parameterKind = ParameterKind.POSITIONAL;
+    methodM1.parameters = <ParameterElement>[parameter1];
+    classI2.methods = <MethodElement>[methodM2];
+    ClassElementImpl classI3 = ElementFactory.classElement2("I3");
+    MethodElementImpl methodM3 =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    ParameterElementImpl parameter2 =
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a2"));
+    parameter2.type = _typeProvider.intType;
+    parameter2.parameterKind = ParameterKind.POSITIONAL;
+    ParameterElementImpl parameter3 =
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a3"));
+    parameter3.type = _typeProvider.intType;
+    parameter3.parameterKind = ParameterKind.POSITIONAL;
+    methodM3.parameters = <ParameterElement>[parameter2, parameter3];
+    classI3.methods = <MethodElement>[methodM3];
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.interfaces = <InterfaceType>[
+      classI1.type,
+      classI2.type,
+      classI3.type
+    ];
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    expect(mapA.size, _numOfMembersInObject + 1);
+    expect(mapA.get(methodName), same(methodM3));
+    _assertNoErrors(classA);
+  }
+
+  void test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_4_methods() {
+    // class I1 { int m(); }
+    // class I2 { int m(); }
+    // class I3 { int m([int]); }
+    // class I4 { int m([int, int]); }
+    // class A implements I1, I2, I3, I4 {}
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1");
+    String methodName = "m";
+    MethodElement methodM1 =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classI1.methods = <MethodElement>[methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2");
+    MethodElement methodM2 =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classI2.methods = <MethodElement>[methodM2];
+    ClassElementImpl classI3 = ElementFactory.classElement2("I3");
+    MethodElementImpl methodM3 =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    ParameterElementImpl parameter1 =
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a1"));
+    parameter1.type = _typeProvider.intType;
+    parameter1.parameterKind = ParameterKind.POSITIONAL;
+    methodM3.parameters = <ParameterElement>[parameter1];
+    classI3.methods = <MethodElement>[methodM3];
+    ClassElementImpl classI4 = ElementFactory.classElement2("I4");
+    MethodElementImpl methodM4 =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    ParameterElementImpl parameter2 =
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a2"));
+    parameter2.type = _typeProvider.intType;
+    parameter2.parameterKind = ParameterKind.POSITIONAL;
+    ParameterElementImpl parameter3 =
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a3"));
+    parameter3.type = _typeProvider.intType;
+    parameter3.parameterKind = ParameterKind.POSITIONAL;
+    methodM4.parameters = <ParameterElement>[parameter2, parameter3];
+    classI4.methods = <MethodElement>[methodM4];
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.interfaces = <InterfaceType>[
+      classI1.type,
+      classI2.type,
+      classI3.type,
+      classI4.type
+    ];
+    MemberMap mapA =
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+    expect(mapA.size, _numOfMembersInObject + 1);
+    expect(mapA.get(methodName), same(methodM4));
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupInheritance_interface_getter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "g";
+    PropertyAccessorElement getterG =
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[getterG];
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classB.interfaces = <InterfaceType>[classA.type];
+    expect(_inheritanceManager.lookupInheritance(classB, getterName),
+        same(getterG));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_interface_method() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement methodM =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classA.methods = <MethodElement>[methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classB.interfaces = <InterfaceType>[classA.type];
+    expect(_inheritanceManager.lookupInheritance(classB, methodName),
+        same(methodM));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_interface_setter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String setterName = "s";
+    PropertyAccessorElement setterS =
+        ElementFactory.setterElement(setterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[setterS];
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classB.interfaces = <InterfaceType>[classA.type];
+    expect(_inheritanceManager.lookupInheritance(classB, "$setterName="),
+        same(setterS));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_interface_staticMember() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement methodM =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    (methodM as MethodElementImpl).static = true;
+    classA.methods = <MethodElement>[methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classB.interfaces = <InterfaceType>[classA.type];
+    expect(_inheritanceManager.lookupInheritance(classB, methodName), isNull);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_interfaces_infiniteLoop() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.interfaces = <InterfaceType>[classA.type];
+    expect(_inheritanceManager.lookupInheritance(classA, "name"), isNull);
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupInheritance_interfaces_infiniteLoop2() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classA.interfaces = <InterfaceType>[classB.type];
+    classB.interfaces = <InterfaceType>[classA.type];
+    expect(_inheritanceManager.lookupInheritance(classA, "name"), isNull);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_interfaces_union2() {
+    ClassElementImpl classI1 = ElementFactory.classElement2("I1");
+    String methodName1 = "m1";
+    MethodElement methodM1 =
+        ElementFactory.methodElement(methodName1, _typeProvider.intType);
+    classI1.methods = <MethodElement>[methodM1];
+    ClassElementImpl classI2 = ElementFactory.classElement2("I2");
+    String methodName2 = "m2";
+    MethodElement methodM2 =
+        ElementFactory.methodElement(methodName2, _typeProvider.intType);
+    classI2.methods = <MethodElement>[methodM2];
+    classI2.interfaces = <InterfaceType>[classI1.type];
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.interfaces = <InterfaceType>[classI2.type];
+    expect(_inheritanceManager.lookupInheritance(classA, methodName1),
+        same(methodM1));
+    expect(_inheritanceManager.lookupInheritance(classA, methodName2),
+        same(methodM2));
+    _assertNoErrors(classI1);
+    _assertNoErrors(classI2);
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupInheritance_mixin_getter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "g";
+    PropertyAccessorElement getterG =
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[getterG];
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classB.mixins = <InterfaceType>[classA.type];
+    expect(_inheritanceManager.lookupInheritance(classB, getterName),
+        same(getterG));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_mixin_method() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement methodM =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classA.methods = <MethodElement>[methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classB.mixins = <InterfaceType>[classA.type];
+    expect(_inheritanceManager.lookupInheritance(classB, methodName),
+        same(methodM));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_mixin_setter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String setterName = "s";
+    PropertyAccessorElement setterS =
+        ElementFactory.setterElement(setterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[setterS];
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classB.mixins = <InterfaceType>[classA.type];
+    expect(_inheritanceManager.lookupInheritance(classB, "$setterName="),
+        same(setterS));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_mixin_staticMember() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement methodM =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    (methodM as MethodElementImpl).static = true;
+    classA.methods = <MethodElement>[methodM];
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classB.mixins = <InterfaceType>[classA.type];
+    expect(_inheritanceManager.lookupInheritance(classB, methodName), isNull);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_noMember() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    expect(_inheritanceManager.lookupInheritance(classA, "a"), isNull);
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupInheritance_superclass_getter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "g";
+    PropertyAccessorElement getterG =
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[getterG];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    expect(_inheritanceManager.lookupInheritance(classB, getterName),
+        same(getterG));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_superclass_infiniteLoop() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    classA.supertype = classA.type;
+    expect(_inheritanceManager.lookupInheritance(classA, "name"), isNull);
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupInheritance_superclass_infiniteLoop2() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classA.supertype = classB.type;
+    classB.supertype = classA.type;
+    expect(_inheritanceManager.lookupInheritance(classA, "name"), isNull);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_superclass_method() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement methodM =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classA.methods = <MethodElement>[methodM];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    expect(_inheritanceManager.lookupInheritance(classB, methodName),
+        same(methodM));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_superclass_setter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String setterName = "s";
+    PropertyAccessorElement setterS =
+        ElementFactory.setterElement(setterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[setterS];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    expect(_inheritanceManager.lookupInheritance(classB, "$setterName="),
+        same(setterS));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupInheritance_superclass_staticMember() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement methodM =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    (methodM as MethodElementImpl).static = true;
+    classA.methods = <MethodElement>[methodM];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    expect(_inheritanceManager.lookupInheritance(classB, methodName), isNull);
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupMember_getter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "g";
+    PropertyAccessorElement getterG =
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[getterG];
+    expect(_inheritanceManager.lookupMember(classA, getterName), same(getterG));
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupMember_getter_static() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String getterName = "g";
+    PropertyAccessorElement getterG =
+        ElementFactory.getterElement(getterName, true, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[getterG];
+    expect(_inheritanceManager.lookupMember(classA, getterName), isNull);
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupMember_method() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement methodM =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classA.methods = <MethodElement>[methodM];
+    expect(_inheritanceManager.lookupMember(classA, methodName), same(methodM));
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupMember_method_static() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElement methodM =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    (methodM as MethodElementImpl).static = true;
+    classA.methods = <MethodElement>[methodM];
+    expect(_inheritanceManager.lookupMember(classA, methodName), isNull);
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupMember_noMember() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    expect(_inheritanceManager.lookupMember(classA, "a"), isNull);
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupMember_setter() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String setterName = "s";
+    PropertyAccessorElement setterS =
+        ElementFactory.setterElement(setterName, false, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[setterS];
+    expect(_inheritanceManager.lookupMember(classA, "$setterName="),
+        same(setterS));
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupMember_setter_static() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String setterName = "s";
+    PropertyAccessorElement setterS =
+        ElementFactory.setterElement(setterName, true, _typeProvider.intType);
+    classA.accessors = <PropertyAccessorElement>[setterS];
+    expect(_inheritanceManager.lookupMember(classA, setterName), isNull);
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupOverrides_noParentClasses() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElementImpl methodM =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classA.methods = <MethodElement>[methodM];
+    expect(
+        _inheritanceManager.lookupOverrides(classA, methodName), hasLength(0));
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupOverrides_overrideBaseClass() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElementImpl methodMinA =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classA.methods = <MethodElement>[methodMinA];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    MethodElementImpl methodMinB =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classB.methods = <MethodElement>[methodMinB];
+    List<ExecutableElement> overrides =
+        _inheritanceManager.lookupOverrides(classB, methodName);
+    expect(overrides, unorderedEquals([methodMinA]));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupOverrides_overrideInterface() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElementImpl methodMinA =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classA.methods = <MethodElement>[methodMinA];
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    classB.interfaces = <InterfaceType>[classA.type];
+    MethodElementImpl methodMinB =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classB.methods = <MethodElement>[methodMinB];
+    List<ExecutableElement> overrides =
+        _inheritanceManager.lookupOverrides(classB, methodName);
+    expect(overrides, unorderedEquals([methodMinA]));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupOverrides_overrideTwoInterfaces() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    String methodName = "m";
+    MethodElementImpl methodMinA =
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
+    classA.methods = <MethodElement>[methodMinA];
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    MethodElementImpl methodMinB =
+        ElementFactory.methodElement(methodName, _typeProvider.doubleType);
+    classB.methods = <MethodElement>[methodMinB];
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    classC.interfaces = <InterfaceType>[classA.type, classB.type];
+    MethodElementImpl methodMinC =
+        ElementFactory.methodElement(methodName, _typeProvider.numType);
+    classC.methods = <MethodElement>[methodMinC];
+    List<ExecutableElement> overrides =
+        _inheritanceManager.lookupOverrides(classC, methodName);
+    expect(overrides, unorderedEquals([methodMinA, methodMinB]));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+    _assertNoErrors(classC);
+  }
+
+  void _assertErrors(ClassElement classElt,
+      [List<ErrorCode> expectedErrorCodes = ErrorCode.EMPTY_LIST]) {
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    HashSet<AnalysisError> actualErrors =
+        _inheritanceManager.getErrors(classElt);
+    if (actualErrors != null) {
+      for (AnalysisError error in actualErrors) {
+        errorListener.onError(error);
+      }
+    }
+    errorListener.assertErrorsWithCodes(expectedErrorCodes);
+  }
+
+  void _assertNoErrors(ClassElement classElt) {
+    _assertErrors(classElt);
+  }
+
+  /**
+   * Create the inheritance manager used by the tests.
+   *
+   * @return the inheritance manager that was created
+   */
+  InheritanceManager _createInheritanceManager() {
+    AnalysisContext context = AnalysisContextFactory.contextWithCore();
+    FileBasedSource source =
+        new FileBasedSource(FileUtilities2.createFile("/test.dart"));
+    CompilationUnitElementImpl definingCompilationUnit =
+        new CompilationUnitElementImpl("test.dart");
+    definingCompilationUnit.librarySource =
+        definingCompilationUnit.source = source;
+    _definingLibrary = ElementFactory.library(context, "test");
+    _definingLibrary.definingCompilationUnit = definingCompilationUnit;
+    return new InheritanceManager(_definingLibrary);
+  }
+}
+
+@reflectiveTest
+class LibraryElementBuilderTest extends EngineTestCase {
+  /**
+   * The analysis context used to analyze sources.
+   */
+  InternalAnalysisContext _context;
+
+  /**
+   * Add a source file to the content provider. The file path should be absolute.
+   *
+   * @param filePath the path of the file being added
+   * @param contents the contents to be returned by the content provider for the specified file
+   * @return the source object representing the added file
+   */
+  Source addSource(String filePath, String contents) {
+    Source source = new FileBasedSource(FileUtilities2.createFile(filePath));
+    _context.setContents(source, contents);
+    return source;
+  }
+
+  @override
+  void setUp() {
+    _context = AnalysisContextFactory.contextWithCore();
+  }
+
+  @override
+  void tearDown() {
+    _context = null;
+    super.tearDown();
+  }
+
+  void test_accessorsAcrossFiles() {
+    Source librarySource = addSource(
+        "/lib.dart",
+        r'''
+library lib;
+part 'first.dart';
+part 'second.dart';''');
+    addSource(
+        "/first.dart",
+        r'''
+part of lib;
+int get V => 0;''');
+    addSource(
+        "/second.dart",
+        r'''
+part of lib;
+void set V(int v) {}''');
+    LibraryElement element = _buildLibrary(librarySource);
+    expect(element, isNotNull);
+    List<CompilationUnitElement> sourcedUnits = element.parts;
+    expect(sourcedUnits, hasLength(2));
+    List<PropertyAccessorElement> firstAccessors = sourcedUnits[0].accessors;
+    expect(firstAccessors, hasLength(1));
+    List<PropertyAccessorElement> secondAccessors = sourcedUnits[1].accessors;
+    expect(secondAccessors, hasLength(1));
+    expect(secondAccessors[0].variable, same(firstAccessors[0].variable));
+  }
+
+  void test_empty() {
+    Source librarySource = addSource("/lib.dart", "library lib;");
+    LibraryElement element = _buildLibrary(librarySource);
+    expect(element, isNotNull);
+    expect(element.name, "lib");
+    expect(element.entryPoint, isNull);
+    expect(element.importedLibraries, hasLength(0));
+    expect(element.imports, hasLength(0));
+    expect(element.library, same(element));
+    expect(element.prefixes, hasLength(0));
+    expect(element.parts, hasLength(0));
+    CompilationUnitElement unit = element.definingCompilationUnit;
+    expect(unit, isNotNull);
+    expect(unit.name, "lib.dart");
+    expect(unit.library, element);
+    expect(unit.accessors, hasLength(0));
+    expect(unit.functions, hasLength(0));
+    expect(unit.functionTypeAliases, hasLength(0));
+    expect(unit.types, hasLength(0));
+    expect(unit.topLevelVariables, hasLength(0));
+  }
+
+  void test_missingLibraryDirectiveWithPart() {
+    addSource("/a.dart", "part of lib;");
+    Source librarySource = addSource("/lib.dart", "part 'a.dart';");
+    LibraryElement element = _buildLibrary(
+        librarySource, [ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART]);
+    expect(element, isNotNull);
+  }
+
+  void test_missingPartOfDirective() {
+    addSource("/a.dart", "class A {}");
+    Source librarySource = addSource(
+        "/lib.dart",
+        r'''
+library lib;
+
+part 'a.dart';''');
+    LibraryElement element =
+        _buildLibrary(librarySource, [CompileTimeErrorCode.PART_OF_NON_PART]);
+    expect(element, isNotNull);
+  }
+
+  void test_multipleFiles() {
+    Source librarySource = addSource(
+        "/lib.dart",
+        r'''
+library lib;
+part 'first.dart';
+part 'second.dart';
+
+class A {}''');
+    addSource(
+        "/first.dart",
+        r'''
+part of lib;
+class B {}''');
+    addSource(
+        "/second.dart",
+        r'''
+part of lib;
+class C {}''');
+    LibraryElement element = _buildLibrary(librarySource);
+    expect(element, isNotNull);
+    List<CompilationUnitElement> sourcedUnits = element.parts;
+    expect(sourcedUnits, hasLength(2));
+    _assertTypes(element.definingCompilationUnit, ["A"]);
+    if (sourcedUnits[0].name == "first.dart") {
+      _assertTypes(sourcedUnits[0], ["B"]);
+      _assertTypes(sourcedUnits[1], ["C"]);
+    } else {
+      _assertTypes(sourcedUnits[0], ["C"]);
+      _assertTypes(sourcedUnits[1], ["B"]);
+    }
+  }
+
+  void test_singleFile() {
+    Source librarySource = addSource(
+        "/lib.dart",
+        r'''
+library lib;
+
+class A {}''');
+    LibraryElement element = _buildLibrary(librarySource);
+    expect(element, isNotNull);
+    _assertTypes(element.definingCompilationUnit, ["A"]);
+  }
+
+  /**
+   * Ensure that there are elements representing all of the types in the given array of type names.
+   *
+   * @param unit the compilation unit containing the types
+   * @param typeNames the names of the types that should be found
+   */
+  void _assertTypes(CompilationUnitElement unit, List<String> typeNames) {
+    expect(unit, isNotNull);
+    List<ClassElement> types = unit.types;
+    expect(types, hasLength(typeNames.length));
+    for (ClassElement type in types) {
+      expect(type, isNotNull);
+      String actualTypeName = type.displayName;
+      bool wasExpected = false;
+      for (String expectedTypeName in typeNames) {
+        if (expectedTypeName == actualTypeName) {
+          wasExpected = true;
+        }
+      }
+      if (!wasExpected) {
+        fail("Found unexpected type $actualTypeName");
+      }
+    }
+  }
+
+  /**
+   * Build the element model for the library whose defining compilation unit has the given source.
+   *
+   * @param librarySource the source of the defining compilation unit for the library
+   * @param expectedErrorCodes the errors that are expected to be found while building the element
+   *          model
+   * @return the element model that was built for the library
+   * @throws Exception if the element model could not be built
+   */
+  LibraryElement _buildLibrary(Source librarySource,
+      [List<ErrorCode> expectedErrorCodes = ErrorCode.EMPTY_LIST]) {
+    LibraryResolver resolver = new LibraryResolver(_context);
+    LibraryElementBuilder builder = new LibraryElementBuilder(
+        resolver.analysisContext, resolver.errorListener);
+    Library library = resolver.createLibrary(librarySource);
+    LibraryElement element = builder.buildLibrary(library);
+    GatheringErrorListener listener = new GatheringErrorListener();
+    listener.addAll2(resolver.errorListener);
+    listener.assertErrorsWithCodes(expectedErrorCodes);
+    return element;
+  }
+}
+
+@reflectiveTest
+class LibraryImportScopeTest extends ResolverTestCase {
+  void test_conflictingImports() {
+    AnalysisContext context = AnalysisContextFactory.contextWithCore();
+    String typeNameA = "A";
+    String typeNameB = "B";
+    String typeNameC = "C";
+    ClassElement typeA = ElementFactory.classElement2(typeNameA);
+    ClassElement typeB1 = ElementFactory.classElement2(typeNameB);
+    ClassElement typeB2 = ElementFactory.classElement2(typeNameB);
+    ClassElement typeC = ElementFactory.classElement2(typeNameC);
+    LibraryElement importedLibrary1 = createTestLibrary(context, "imported1");
+    (importedLibrary1.definingCompilationUnit as CompilationUnitElementImpl)
+        .types = <ClassElement>[typeA, typeB1];
+    ImportElementImpl import1 =
+        ElementFactory.importFor(importedLibrary1, null);
+    LibraryElement importedLibrary2 = createTestLibrary(context, "imported2");
+    (importedLibrary2.definingCompilationUnit as CompilationUnitElementImpl)
+        .types = <ClassElement>[typeB2, typeC];
+    ImportElementImpl import2 =
+        ElementFactory.importFor(importedLibrary2, null);
+    LibraryElementImpl importingLibrary =
+        createTestLibrary(context, "importing");
+    importingLibrary.imports = <ImportElement>[import1, import2];
+    {
+      GatheringErrorListener errorListener = new GatheringErrorListener();
+      Scope scope = new LibraryImportScope(importingLibrary, errorListener);
+      expect(scope.lookup(AstFactory.identifier3(typeNameA), importingLibrary),
+          typeA);
+      errorListener.assertNoErrors();
+      expect(scope.lookup(AstFactory.identifier3(typeNameC), importingLibrary),
+          typeC);
+      errorListener.assertNoErrors();
+      Element element =
+          scope.lookup(AstFactory.identifier3(typeNameB), importingLibrary);
+      errorListener.assertErrorsWithCodes([StaticWarningCode.AMBIGUOUS_IMPORT]);
+      EngineTestCase.assertInstanceOf((obj) => obj is MultiplyDefinedElement,
+          MultiplyDefinedElement, element);
+      List<Element> conflictingElements =
+          (element as MultiplyDefinedElement).conflictingElements;
+      expect(conflictingElements, hasLength(2));
+      if (identical(conflictingElements[0], typeB1)) {
+        expect(conflictingElements[1], same(typeB2));
+      } else if (identical(conflictingElements[0], typeB2)) {
+        expect(conflictingElements[1], same(typeB1));
+      } else {
+        expect(conflictingElements[0], same(typeB1));
+      }
+    }
+    {
+      GatheringErrorListener errorListener = new GatheringErrorListener();
+      Scope scope = new LibraryImportScope(importingLibrary, errorListener);
+      Identifier identifier = AstFactory.identifier3(typeNameB);
+      AstFactory.methodDeclaration(null, AstFactory.typeName3(identifier), null,
+          null, AstFactory.identifier3("foo"), null);
+      Element element = scope.lookup(identifier, importingLibrary);
+      errorListener.assertErrorsWithCodes([StaticWarningCode.AMBIGUOUS_IMPORT]);
+      EngineTestCase.assertInstanceOf((obj) => obj is MultiplyDefinedElement,
+          MultiplyDefinedElement, element);
+    }
+  }
+
+  void test_creation_empty() {
+    LibraryElement definingLibrary = createDefaultTestLibrary();
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    new LibraryImportScope(definingLibrary, errorListener);
+  }
+
+  void test_creation_nonEmpty() {
+    AnalysisContext context = AnalysisContextFactory.contextWithCore();
+    String importedTypeName = "A";
+    ClassElement importedType =
+        new ClassElementImpl.forNode(AstFactory.identifier3(importedTypeName));
+    LibraryElement importedLibrary = createTestLibrary(context, "imported");
+    (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl)
+        .types = <ClassElement>[importedType];
+    LibraryElementImpl definingLibrary =
+        createTestLibrary(context, "importing");
+    ImportElementImpl importElement = new ImportElementImpl(0);
+    importElement.importedLibrary = importedLibrary;
+    definingLibrary.imports = <ImportElement>[importElement];
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    Scope scope = new LibraryImportScope(definingLibrary, errorListener);
+    expect(
+        scope.lookup(AstFactory.identifier3(importedTypeName), definingLibrary),
+        importedType);
+  }
+
+  void test_getErrorListener() {
+    LibraryElement definingLibrary = createDefaultTestLibrary();
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    LibraryImportScope scope =
+        new LibraryImportScope(definingLibrary, errorListener);
+    expect(scope.errorListener, errorListener);
+  }
+
+  void test_nonConflictingImports_fromSdk() {
+    AnalysisContext context = AnalysisContextFactory.contextWithCore();
+    String typeName = "List";
+    ClassElement type = ElementFactory.classElement2(typeName);
+    LibraryElement importedLibrary = createTestLibrary(context, "lib");
+    (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl)
+        .types = <ClassElement>[type];
+    ImportElementImpl importCore = ElementFactory.importFor(
+        context.getLibraryElement(context.sourceFactory.forUri("dart:core")),
+        null);
+    ImportElementImpl importLib =
+        ElementFactory.importFor(importedLibrary, null);
+    LibraryElementImpl importingLibrary =
+        createTestLibrary(context, "importing");
+    importingLibrary.imports = <ImportElement>[importCore, importLib];
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    Scope scope = new LibraryImportScope(importingLibrary, errorListener);
+    expect(
+        scope.lookup(AstFactory.identifier3(typeName), importingLibrary), type);
+    errorListener
+        .assertErrorsWithCodes([StaticWarningCode.CONFLICTING_DART_IMPORT]);
+  }
+
+  void test_nonConflictingImports_sameElement() {
+    AnalysisContext context = AnalysisContextFactory.contextWithCore();
+    String typeNameA = "A";
+    String typeNameB = "B";
+    ClassElement typeA = ElementFactory.classElement2(typeNameA);
+    ClassElement typeB = ElementFactory.classElement2(typeNameB);
+    LibraryElement importedLibrary = createTestLibrary(context, "imported");
+    (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl)
+        .types = <ClassElement>[typeA, typeB];
+    ImportElementImpl import1 = ElementFactory.importFor(importedLibrary, null);
+    ImportElementImpl import2 = ElementFactory.importFor(importedLibrary, null);
+    LibraryElementImpl importingLibrary =
+        createTestLibrary(context, "importing");
+    importingLibrary.imports = <ImportElement>[import1, import2];
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    Scope scope = new LibraryImportScope(importingLibrary, errorListener);
+    expect(scope.lookup(AstFactory.identifier3(typeNameA), importingLibrary),
+        typeA);
+    errorListener.assertNoErrors();
+    expect(scope.lookup(AstFactory.identifier3(typeNameB), importingLibrary),
+        typeB);
+    errorListener.assertNoErrors();
+  }
+
+  void test_prefixedAndNonPrefixed() {
+    AnalysisContext context = AnalysisContextFactory.contextWithCore();
+    String typeName = "C";
+    String prefixName = "p";
+    ClassElement prefixedType = ElementFactory.classElement2(typeName);
+    ClassElement nonPrefixedType = ElementFactory.classElement2(typeName);
+    LibraryElement prefixedLibrary =
+        createTestLibrary(context, "import.prefixed");
+    (prefixedLibrary.definingCompilationUnit as CompilationUnitElementImpl)
+        .types = <ClassElement>[prefixedType];
+    ImportElementImpl prefixedImport = ElementFactory.importFor(
+        prefixedLibrary, ElementFactory.prefix(prefixName));
+    LibraryElement nonPrefixedLibrary =
+        createTestLibrary(context, "import.nonPrefixed");
+    (nonPrefixedLibrary.definingCompilationUnit as CompilationUnitElementImpl)
+        .types = <ClassElement>[nonPrefixedType];
+    ImportElementImpl nonPrefixedImport =
+        ElementFactory.importFor(nonPrefixedLibrary, null);
+    LibraryElementImpl importingLibrary =
+        createTestLibrary(context, "importing");
+    importingLibrary.imports = <ImportElement>[
+      prefixedImport,
+      nonPrefixedImport
+    ];
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    Scope scope = new LibraryImportScope(importingLibrary, errorListener);
+    Element prefixedElement = scope.lookup(
+        AstFactory.identifier5(prefixName, typeName), importingLibrary);
+    errorListener.assertNoErrors();
+    expect(prefixedElement, same(prefixedType));
+    Element nonPrefixedElement =
+        scope.lookup(AstFactory.identifier3(typeName), importingLibrary);
+    errorListener.assertNoErrors();
+    expect(nonPrefixedElement, same(nonPrefixedType));
+  }
+}
+
+@reflectiveTest
+class LibraryResolver2Test extends ResolverTestCase {
+  LibraryResolver2 _resolver;
+
+  Source _coreLibrarySource;
+
+  Source _asyncLibrarySource;
+
+  @override
+  void setUp() {
+    super.setUp();
+    _resolver = new LibraryResolver2(analysisContext2);
+    _coreLibrarySource =
+        analysisContext2.sourceFactory.forUri(DartSdk.DART_CORE);
+    _asyncLibrarySource =
+        analysisContext2.sourceFactory.forUri(DartSdk.DART_ASYNC);
+  }
+
+  void test_imports_relative() {
+    Source sourceA = addSource(r'''
+library libA;
+import 'libB.dart';
+class A {}''');
+    Source sourceB = addNamedSource(
+        "/libB.dart",
+        r'''
+library libB;
+import 'test.dart
+class B {}''');
+    List<ResolvableLibrary> cycle = new List<ResolvableLibrary>();
+    ResolvableLibrary coreLib = _createResolvableLibrary(_coreLibrarySource);
+    coreLib.libraryElement = analysisContext2
+        .computeLibraryElement(_coreLibrarySource) as LibraryElementImpl;
+    ResolvableLibrary asyncLib = _createResolvableLibrary(_asyncLibrarySource);
+    asyncLib.libraryElement = analysisContext2
+        .computeLibraryElement(_asyncLibrarySource) as LibraryElementImpl;
+    ResolvableLibrary libA = _createResolvableLibrary(sourceA);
+    ResolvableLibrary libB = _createResolvableLibrary(sourceB);
+    libA.importedLibraries = <ResolvableLibrary>[coreLib, asyncLib, libB];
+    libB.importedLibraries = <ResolvableLibrary>[coreLib, asyncLib, libA];
+    cycle.add(libA);
+    cycle.add(libB);
+    LibraryElement library = _resolver.resolveLibrary(sourceA, cycle);
+    List<LibraryElement> importedLibraries = library.importedLibraries;
+    assertNamedElements(importedLibraries, ["dart.core", "libB"]);
+  }
+
+  ResolvableLibrary _createResolvableLibrary(Source source) {
+    CompilationUnit unit = analysisContext2.parseCompilationUnit(source);
+    ResolvableLibrary resolvableLibrary = new ResolvableLibrary(source);
+    resolvableLibrary.resolvableCompilationUnits = <ResolvableCompilationUnit>[
+      new ResolvableCompilationUnit(source, unit)
+    ];
+    return resolvableLibrary;
+  }
+}
+
+@reflectiveTest
+class LibraryResolverTest extends ResolverTestCase {
+  LibraryResolver _resolver;
+
+  @override
+  void setUp() {
+    super.setUp();
+    _resolver = new LibraryResolver(analysisContext2);
+  }
+
+  void test_imports_dart_html() {
+    Source source = addSource(r'''
+library libA;
+import 'dart:html';
+class A {}''');
+    LibraryElement library = _resolver.resolveLibrary(source, true);
+    List<LibraryElement> importedLibraries = library.importedLibraries;
+    assertNamedElements(importedLibraries, ["dart.core", "dart.dom.html"]);
+  }
+
+  void test_imports_none() {
+    Source source = addSource(r'''
+library libA;
+class A {}''');
+    LibraryElement library = _resolver.resolveLibrary(source, true);
+    List<LibraryElement> importedLibraries = library.importedLibraries;
+    assertNamedElements(importedLibraries, ["dart.core"]);
+  }
+
+  void test_imports_relative() {
+    addNamedSource("/libB.dart", "library libB;");
+    Source source = addSource(r'''
+library libA;
+import 'libB.dart';
+class A {}''');
+    LibraryElement library = _resolver.resolveLibrary(source, true);
+    List<LibraryElement> importedLibraries = library.importedLibraries;
+    assertNamedElements(importedLibraries, ["dart.core", "libB"]);
+  }
+}
+
+@reflectiveTest
+class LibraryScopeTest extends ResolverTestCase {
+  void test_creation_empty() {
+    LibraryElement definingLibrary = createDefaultTestLibrary();
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    new LibraryScope(definingLibrary, errorListener);
+  }
+
+  void test_creation_nonEmpty() {
+    AnalysisContext context = AnalysisContextFactory.contextWithCore();
+    String importedTypeName = "A";
+    ClassElement importedType =
+        new ClassElementImpl.forNode(AstFactory.identifier3(importedTypeName));
+    LibraryElement importedLibrary = createTestLibrary(context, "imported");
+    (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl)
+        .types = <ClassElement>[importedType];
+    LibraryElementImpl definingLibrary =
+        createTestLibrary(context, "importing");
+    ImportElementImpl importElement = new ImportElementImpl(0);
+    importElement.importedLibrary = importedLibrary;
+    definingLibrary.imports = <ImportElement>[importElement];
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    Scope scope = new LibraryScope(definingLibrary, errorListener);
+    expect(
+        scope.lookup(AstFactory.identifier3(importedTypeName), definingLibrary),
+        importedType);
+  }
+
+  void test_getErrorListener() {
+    LibraryElement definingLibrary = createDefaultTestLibrary();
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    LibraryScope scope = new LibraryScope(definingLibrary, errorListener);
+    expect(scope.errorListener, errorListener);
+  }
+}
+
+@reflectiveTest
+class LibraryTest extends EngineTestCase {
+  /**
+   * The error listener to which all errors will be reported.
+   */
+  GatheringErrorListener _errorListener;
+
+  /**
+   * The analysis context to pass in to all libraries created by the tests.
+   */
+  InternalAnalysisContext _analysisContext;
+
+  /**
+   * The library used by the tests.
+   */
+  Library _library;
+
+  @override
+  void setUp() {
+    _analysisContext = AnalysisContextFactory.contextWithCore();
+    _errorListener = new GatheringErrorListener();
+    _library = _createLibrary("/lib.dart");
+  }
+
+  @override
+  void tearDown() {
+    _errorListener = null;
+    _analysisContext = null;
+    _library = null;
+    super.tearDown();
+  }
+
+  void test_getExplicitlyImportsCore() {
+    expect(_library.explicitlyImportsCore, isFalse);
+    _errorListener.assertNoErrors();
+  }
+
+  void test_getExports() {
+    expect(_library.exports, hasLength(0));
+    _errorListener.assertNoErrors();
+  }
+
+  void test_getImports() {
+    expect(_library.imports, hasLength(0));
+    _errorListener.assertNoErrors();
+  }
+
+  void test_getImportsAndExports() {
+    _library.importedLibraries = <Library>[_createLibrary("/imported.dart")];
+    _library.exportedLibraries = <Library>[_createLibrary("/exported.dart")];
+    expect(_library.importsAndExports, hasLength(2));
+    _errorListener.assertNoErrors();
+  }
+
+  void test_getLibraryScope() {
+    LibraryElementImpl element = new LibraryElementImpl.forNode(
+        _analysisContext, AstFactory.libraryIdentifier2(["lib"]));
+    element.definingCompilationUnit =
+        new CompilationUnitElementImpl("lib.dart");
+    _library.libraryElement = element;
+    expect(_library.libraryScope, isNotNull);
+    _errorListener.assertNoErrors();
+  }
+
+  void test_getLibrarySource() {
+    expect(_library.librarySource, isNotNull);
+  }
+
+  void test_setExplicitlyImportsCore() {
+    _library.explicitlyImportsCore = true;
+    expect(_library.explicitlyImportsCore, isTrue);
+    _errorListener.assertNoErrors();
+  }
+
+  void test_setExportedLibraries() {
+    Library exportLibrary = _createLibrary("/exported.dart");
+    _library.exportedLibraries = <Library>[exportLibrary];
+    List<Library> exports = _library.exports;
+    expect(exports, hasLength(1));
+    expect(exports[0], same(exportLibrary));
+    _errorListener.assertNoErrors();
+  }
+
+  void test_setImportedLibraries() {
+    Library importLibrary = _createLibrary("/imported.dart");
+    _library.importedLibraries = <Library>[importLibrary];
+    List<Library> imports = _library.imports;
+    expect(imports, hasLength(1));
+    expect(imports[0], same(importLibrary));
+    _errorListener.assertNoErrors();
+  }
+
+  void test_setLibraryElement() {
+    LibraryElementImpl element = new LibraryElementImpl.forNode(
+        _analysisContext, AstFactory.libraryIdentifier2(["lib"]));
+    _library.libraryElement = element;
+    expect(_library.libraryElement, same(element));
+  }
+
+  Library _createLibrary(String definingCompilationUnitPath) => new Library(
+      _analysisContext,
+      _errorListener,
+      new FileBasedSource(
+          FileUtilities2.createFile(definingCompilationUnitPath)));
+}
+
+@reflectiveTest
+class MemberMapTest {
+  /**
+   * The null type.
+   */
+  InterfaceType _nullType;
+
+  void setUp() {
+    _nullType = new TestTypeProvider().nullType;
+  }
+
+  void test_MemberMap_copyConstructor() {
+    MethodElement m1 = ElementFactory.methodElement("m1", _nullType);
+    MethodElement m2 = ElementFactory.methodElement("m2", _nullType);
+    MethodElement m3 = ElementFactory.methodElement("m3", _nullType);
+    MemberMap map = new MemberMap();
+    map.put(m1.name, m1);
+    map.put(m2.name, m2);
+    map.put(m3.name, m3);
+    MemberMap copy = new MemberMap.from(map);
+    expect(copy.size, map.size);
+    expect(copy.get(m1.name), m1);
+    expect(copy.get(m2.name), m2);
+    expect(copy.get(m3.name), m3);
+  }
+
+  void test_MemberMap_override() {
+    MethodElement m1 = ElementFactory.methodElement("m", _nullType);
+    MethodElement m2 = ElementFactory.methodElement("m", _nullType);
+    MemberMap map = new MemberMap();
+    map.put(m1.name, m1);
+    map.put(m2.name, m2);
+    expect(map.size, 1);
+    expect(map.get("m"), m2);
+  }
+
+  void test_MemberMap_put() {
+    MethodElement m1 = ElementFactory.methodElement("m1", _nullType);
+    MemberMap map = new MemberMap();
+    expect(map.size, 0);
+    map.put(m1.name, m1);
+    expect(map.size, 1);
+    expect(map.get("m1"), m1);
+  }
+}
+
+/**
+ * An analysis context that has a fake SDK that is much smaller and faster for
+ * testing purposes.
+ */
+class NewAnalysisContextForTests extends newContext.AnalysisContextImpl {
+  @override
+  void set analysisOptions(AnalysisOptions options) {
+    AnalysisOptions currentOptions = analysisOptions;
+    bool needsRecompute = currentOptions.analyzeFunctionBodiesPredicate !=
+            options.analyzeFunctionBodiesPredicate ||
+        currentOptions.generateImplicitErrors !=
+            options.generateImplicitErrors ||
+        currentOptions.generateSdkErrors != options.generateSdkErrors ||
+        currentOptions.dart2jsHint != options.dart2jsHint ||
+        (currentOptions.hint && !options.hint) ||
+        currentOptions.preserveComments != options.preserveComments ||
+        currentOptions.enableStrictCallChecks != options.enableStrictCallChecks;
+    if (needsRecompute) {
+      fail(
+          "Cannot set options that cause the sources to be reanalyzed in a test context");
+    }
+    super.analysisOptions = options;
+  }
+
+  @override
+  bool exists(Source source) =>
+      super.exists(source) || sourceFactory.dartSdk.context.exists(source);
+
+  @override
+  TimestampedData<String> getContents(Source source) {
+    if (source.isInSystemLibrary) {
+      return sourceFactory.dartSdk.context.getContents(source);
+    }
+    return super.getContents(source);
+  }
+
+  @override
+  int getModificationStamp(Source source) {
+    if (source.isInSystemLibrary) {
+      return sourceFactory.dartSdk.context.getModificationStamp(source);
+    }
+    return super.getModificationStamp(source);
+  }
+
+  /**
+   * Set the analysis options, even if they would force re-analysis. This method should only be
+   * invoked before the fake SDK is initialized.
+   *
+   * @param options the analysis options to be set
+   */
+  void _internalSetAnalysisOptions(AnalysisOptions options) {
+    super.analysisOptions = options;
+  }
+}
+
+@reflectiveTest
+class NonHintCodeTest extends ResolverTestCase {
+  void test_deadCode_deadBlock_conditionalElse_debugConst() {
+    Source source = addSource(r'''
+const bool DEBUG = true;
+f() {
+  DEBUG ? 1 : 2;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_conditionalIf_debugConst() {
+    Source source = addSource(r'''
+const bool DEBUG = false;
+f() {
+  DEBUG ? 1 : 2;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_else() {
+    Source source = addSource(r'''
+const bool DEBUG = true;
+f() {
+  if(DEBUG) {} else {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_if_debugConst_prefixedIdentifier() {
+    Source source = addSource(r'''
+class A {
+  static const bool DEBUG = false;
+}
+f() {
+  if(A.DEBUG) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_if_debugConst_prefixedIdentifier2() {
+    Source source = addSource(r'''
+library L;
+import 'lib2.dart';
+f() {
+  if(A.DEBUG) {}
+}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+class A {
+  static const bool DEBUG = false;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_if_debugConst_propertyAccessor() {
+    Source source = addSource(r'''
+library L;
+import 'lib2.dart' as LIB;
+f() {
+  if(LIB.A.DEBUG) {}
+}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+class A {
+  static const bool DEBUG = false;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_if_debugConst_simpleIdentifier() {
+    Source source = addSource(r'''
+const bool DEBUG = false;
+f() {
+  if(DEBUG) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_deadCode_deadBlock_while_debugConst() {
+    Source source = addSource(r'''
+const bool DEBUG = false;
+f() {
+  while(DEBUG) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_deadCode_deadCatch_onCatchSubtype() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+f() {
+  try {} on B catch (e) {} on A catch (e) {} catch (e) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_deadCode_deadOperandLHS_and_debugConst() {
+    Source source = addSource(r'''
+const bool DEBUG = false;
+f() {
+  bool b = DEBUG && false;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_deadCode_deadOperandLHS_or_debugConst() {
+    Source source = addSource(r'''
+const bool DEBUG = true;
+f() {
+  bool b = DEBUG || true;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_divisionOptimization() {
+    Source source = addSource(r'''
+f(int x, int y) {
+  var v = x / y.toInt();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_divisionOptimization_supressIfDivisionNotDefinedInCore() {
+    Source source = addSource(r'''
+f(x, y) {
+  var v = (x / y).toInt();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_divisionOptimization_supressIfDivisionOverridden() {
+    Source source = addSource(r'''
+class A {
+  num operator /(x) { return x; }
+}
+f(A x, A y) {
+  var v = (x / y).toInt();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_duplicateImport_as() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+import 'lib1.dart' as one;
+A a;
+one.A a2;''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class A {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_duplicateImport_hide() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+import 'lib1.dart' hide A;
+A a;
+B b;''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class A {}
+class B {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_duplicateImport_show() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+import 'lib1.dart' show A;
+A a;
+B b;''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class A {}
+class B {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_importDeferredLibraryWithLoadFunction() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+f() {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as lib1;
+main() { lib1.f(); }'''
+    ], ErrorCode.EMPTY_LIST);
+  }
+
+  void test_issue20904BuggyTypePromotionAtIfJoin_1() {
+    // https://code.google.com/p/dart/issues/detail?id=20904
+    Source source = addSource(r'''
+f(var message, var dynamic_) {
+  if (message is Function) {
+    message = dynamic_;
+  }
+  int s = message;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_issue20904BuggyTypePromotionAtIfJoin_3() {
+    // https://code.google.com/p/dart/issues/detail?id=20904
+    Source source = addSource(r'''
+f(var message) {
+  var dynamic_;
+  if (message is Function) {
+    message = dynamic_;
+  } else {
+    return;
+  }
+  int s = message;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_issue20904BuggyTypePromotionAtIfJoin_4() {
+    // https://code.google.com/p/dart/issues/detail?id=20904
+    Source source = addSource(r'''
+f(var message) {
+  if (message is Function) {
+    message = '';
+  } else {
+    return;
+  }
+  String s = message;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_missingReturn_emptyFunctionBody() {
+    Source source = addSource(r'''
+abstract class A {
+  int m();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_missingReturn_expressionFunctionBody() {
+    Source source = addSource("int f() => 0;");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_missingReturn_noReturnType() {
+    Source source = addSource("f() {}");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_missingReturn_voidReturnType() {
+    Source source = addSource("void f() {}");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_overrideEqualsButNotHashCode() {
+    Source source = addSource(r'''
+class A {
+  bool operator ==(x) { return x; }
+  get hashCode => 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_overrideOnNonOverridingGetter_inInterface() {
+    Source source = addSource(r'''
+library dart.core;
+const override = null;
+class A {
+  int get m => 0;
+}
+class B implements A {
+  @override
+  int get m => 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_overrideOnNonOverridingGetter_inSuperclass() {
+    Source source = addSource(r'''
+library dart.core;
+const override = null;
+class A {
+  int get m => 0;
+}
+class B extends A {
+  @override
+  int get m => 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_overrideOnNonOverridingMethod_inInterface() {
+    Source source = addSource(r'''
+library dart.core;
+const override = null;
+class A {
+  int m() => 0;
+}
+class B implements A {
+  @override
+  int m() => 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_overrideOnNonOverridingMethod_inSuperclass() {
+    Source source = addSource(r'''
+library dart.core;
+const override = null;
+class A {
+  int m() => 0;
+}
+class B extends A {
+  @override
+  int m() => 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_overrideOnNonOverridingSetter_inInterface() {
+    Source source = addSource(r'''
+library dart.core;
+const override = null;
+class A {
+  set m(int x) {}
+}
+class B implements A {
+  @override
+  set m(int x) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_overrideOnNonOverridingSetter_inSuperclass() {
+    Source source = addSource(r'''
+library dart.core;
+const override = null;
+class A {
+  set m(int x) {}
+}
+class B extends A {
+  @override
+  set m(int x) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_propagatedFieldType() {
+    Source source = addSource(r'''
+class A { }
+class X<T> {
+  final x = new List<T>();
+}
+class Z {
+  final X<A> y = new X<A>();
+  foo() {
+    y.x.add(new A());
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_proxy_annotation_prefixed() {
+    Source source = addSource(r'''
+library L;
+@proxy
+class A {}
+f(var a) {
+  a = new A();
+  a.m();
+  var x = a.g;
+  a.s = 1;
+  var y = a + a;
+  a++;
+  ++a;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_proxy_annotation_prefixed2() {
+    Source source = addSource(r'''
+library L;
+@proxy
+class A {}
+class B {
+  f(var a) {
+    a = new A();
+    a.m();
+    var x = a.g;
+    a.s = 1;
+    var y = a + a;
+    a++;
+    ++a;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_proxy_annotation_prefixed3() {
+    Source source = addSource(r'''
+library L;
+class B {
+  f(var a) {
+    a = new A();
+    a.m();
+    var x = a.g;
+    a.s = 1;
+    var y = a + a;
+    a++;
+    ++a;
+  }
+}
+@proxy
+class A {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedGetter_inSubtype() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  get b => 0;
+}
+f(var a) {
+  if(a is A) {
+    return a.b;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedMethod_assignmentExpression_inSubtype() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  operator +(B b) {return new B();}
+}
+f(var a, var a2) {
+  a = new A();
+  a2 = new A();
+  a += a2;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedMethod_dynamic() {
+    Source source = addSource(r'''
+class D<T extends dynamic> {
+  fieldAccess(T t) => t.abc;
+  methodAccess(T t) => t.xyz(1, 2, 'three');
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedMethod_inSubtype() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  b() {}
+}
+f() {
+  var a = new A();
+  a.b();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedMethod_unionType_all() {
+    Source source = addSource(r'''
+class A {
+  int m(int x) => 0;
+}
+class B {
+  String m() => '0';
+}
+f(A a, B b) {
+  var ab;
+  if (0 < 1) {
+    ab = a;
+  } else {
+    ab = b;
+  }
+  ab.m();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedMethod_unionType_some() {
+    Source source = addSource(r'''
+class A {
+  int m(int x) => 0;
+}
+class B {}
+f(A a, B b) {
+  var ab;
+  if (0 < 1) {
+    ab = a;
+  } else {
+    ab = b;
+  }
+  ab.m(0);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedOperator_binaryExpression_inSubtype() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  operator +(B b) {}
+}
+f(var a) {
+  if(a is A) {
+    a + 1;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedOperator_indexBoth_inSubtype() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  operator [](int index) {}
+}
+f(var a) {
+  if(a is A) {
+    a[0]++;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedOperator_indexGetter_inSubtype() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  operator [](int index) {}
+}
+f(var a) {
+  if(a is A) {
+    a[0];
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedOperator_indexSetter_inSubtype() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  operator []=(i, v) {}
+}
+f(var a) {
+  if(a is A) {
+    a[0] = 1;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedOperator_postfixExpression() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  operator +(B b) {return new B();}
+}
+f(var a) {
+  if(a is A) {
+    a++;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedOperator_prefixExpression() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  operator +(B b) {return new B();}
+}
+f(var a) {
+  if(a is A) {
+    ++a;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_undefinedSetter_inSubtype() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  set b(x) {}
+}
+f(var a) {
+  if(a is A) {
+    a.b = 0;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_unnecessaryCast_13855_parameter_A() {
+    // dartbug.com/13855, dartbug.com/13732
+    Source source = addSource(r'''
+class A{
+  a() {}
+}
+class B<E> {
+  E e;
+  m() {
+    (e as A).a();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unnecessaryCast_conditionalExpression() {
+    Source source = addSource(r'''
+abstract class I {}
+class A implements I {}
+class B implements I {}
+I m(A a, B b) {
+  return a == null ? b as I : a as I;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unnecessaryCast_dynamic_type() {
+    Source source = addSource(r'''
+m(v) {
+  var b = v as Object;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unnecessaryCast_generics() {
+    // dartbug.com/18953
+    Source source = addSource(r'''
+import 'dart:async';
+Future<int> f() => new Future.value(0);
+void g(bool c) {
+  (c ? f(): new Future.value(0) as Future<int>).then((int value) {});
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unnecessaryCast_type_dynamic() {
+    Source source = addSource(r'''
+m(v) {
+  var b = Object as dynamic;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedImport_annotationOnDirective() {
+    Source source = addSource(r'''
+library L;
+@A()
+import 'lib1.dart';''');
+    Source source2 = addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class A {
+  const A() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source);
+    verify([source, source2]);
+  }
+
+  void test_unusedImport_as_equalPrefixes() {
+    // 18818
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' as one;
+import 'lib2.dart' as one;
+one.A a;
+one.B b;''');
+    Source source2 = addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class A {}''');
+    Source source3 = addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+class B {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source);
+    assertNoErrors(source2);
+    assertNoErrors(source3);
+    verify([source, source2, source3]);
+  }
+
+  void test_unusedImport_core_library() {
+    Source source = addSource(r'''
+library L;
+import 'dart:core';''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedImport_export() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+Two two;''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+export 'lib2.dart';
+class One {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+class Two {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedImport_export2() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+Three three;''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+export 'lib2.dart';
+class One {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+export 'lib3.dart';
+class Two {}''');
+    addNamedSource(
+        "/lib3.dart",
+        r'''
+library lib3;
+class Three {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedImport_export_infiniteLoop() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+Two two;''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+export 'lib2.dart';
+class One {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+export 'lib3.dart';
+class Two {}''');
+    addNamedSource(
+        "/lib3.dart",
+        r'''
+library lib3;
+export 'lib2.dart';
+class Three {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedImport_metadata() {
+    Source source = addSource(r'''
+library L;
+@A(x)
+import 'lib1.dart';
+class A {
+  final int value;
+  const A(this.value);
+}''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+const x = 0;''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_unusedImport_prefix_topLevelFunction() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' hide topLevelFunction;
+import 'lib1.dart' as one show topLevelFunction;
+class A {
+  static void x() {
+    One o;
+    one.topLevelFunction();
+  }
+}''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class One {}
+topLevelFunction() {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_useOfVoidResult_implicitReturnValue() {
+    Source source = addSource(r'''
+f() {}
+class A {
+  n() {
+    var a = f();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_useOfVoidResult_nonVoidReturnValue() {
+    Source source = addSource(r'''
+int f() => 1;
+g() {
+  var a = f();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+}
+
+class PubSuggestionCodeTest extends ResolverTestCase {
+  void test_import_package() {
+    Source source = addSource("import 'package:somepackage/other.dart';");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
+  }
+
+  void test_import_packageWithDotDot() {
+    Source source = addSource("import 'package:somepackage/../other.dart';");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.URI_DOES_NOT_EXIST,
+      HintCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT
+    ]);
+  }
+
+  void test_import_packageWithLeadingDotDot() {
+    Source source = addSource("import 'package:../other.dart';");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.URI_DOES_NOT_EXIST,
+      HintCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT
+    ]);
+  }
+
+  void test_import_referenceIntoLibDirectory() {
+    cacheSource("/myproj/pubspec.yaml", "");
+    cacheSource("/myproj/lib/other.dart", "");
+    Source source =
+        addNamedSource("/myproj/web/test.dart", "import '../lib/other.dart';");
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [HintCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE]);
+  }
+
+  void test_import_referenceIntoLibDirectory_no_pubspec() {
+    cacheSource("/myproj/lib/other.dart", "");
+    Source source =
+        addNamedSource("/myproj/web/test.dart", "import '../lib/other.dart';");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_import_referenceOutOfLibDirectory() {
+    cacheSource("/myproj/pubspec.yaml", "");
+    cacheSource("/myproj/web/other.dart", "");
+    Source source =
+        addNamedSource("/myproj/lib/test.dart", "import '../web/other.dart';");
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [HintCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE]);
+  }
+
+  void test_import_referenceOutOfLibDirectory_no_pubspec() {
+    cacheSource("/myproj/web/other.dart", "");
+    Source source =
+        addNamedSource("/myproj/lib/test.dart", "import '../web/other.dart';");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_import_valid_inside_lib1() {
+    cacheSource("/myproj/pubspec.yaml", "");
+    cacheSource("/myproj/lib/other.dart", "");
+    Source source =
+        addNamedSource("/myproj/lib/test.dart", "import 'other.dart';");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_import_valid_inside_lib2() {
+    cacheSource("/myproj/pubspec.yaml", "");
+    cacheSource("/myproj/lib/bar/other.dart", "");
+    Source source = addNamedSource(
+        "/myproj/lib/foo/test.dart", "import '../bar/other.dart';");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_import_valid_outside_lib() {
+    cacheSource("/myproj/pubspec.yaml", "");
+    cacheSource("/myproj/web/other.dart", "");
+    Source source =
+        addNamedSource("/myproj/lib2/test.dart", "import '../web/other.dart';");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+}
+
+/**
+ * An AST visitor used to verify that all of the nodes in an AST structure that
+ * should have been resolved were resolved.
+ */
+class ResolutionVerifier extends RecursiveAstVisitor<Object> {
+  /**
+   * A set containing nodes that are known to not be resolvable and should
+   * therefore not cause the test to fail.
+   */
+  final Set<AstNode> _knownExceptions;
+
+  /**
+   * A list containing all of the AST nodes that were not resolved.
+   */
+  List<AstNode> _unresolvedNodes = new List<AstNode>();
+
+  /**
+   * A list containing all of the AST nodes that were resolved to an element of
+   * the wrong type.
+   */
+  List<AstNode> _wrongTypedNodes = new List<AstNode>();
+
+  /**
+   * Initialize a newly created verifier to verify that all of the identifiers
+   * in the visited AST structures that are expected to have been resolved have
+   * an element associated with them. Nodes in the set of [_knownExceptions] are
+   * not expected to have been resolved, even if they normally would have been
+   * expected to have been resolved.
+   */
+  ResolutionVerifier([this._knownExceptions]);
+
+  /**
+   * Assert that all of the visited identifiers were resolved.
+   */
+  void assertResolved() {
+    if (!_unresolvedNodes.isEmpty || !_wrongTypedNodes.isEmpty) {
+      StringBuffer buffer = new StringBuffer();
+      if (!_unresolvedNodes.isEmpty) {
+        buffer.write("Failed to resolve ");
+        buffer.write(_unresolvedNodes.length);
+        buffer.writeln(" nodes:");
+        _printNodes(buffer, _unresolvedNodes);
+      }
+      if (!_wrongTypedNodes.isEmpty) {
+        buffer.write("Resolved ");
+        buffer.write(_wrongTypedNodes.length);
+        buffer.writeln(" to the wrong type of element:");
+        _printNodes(buffer, _wrongTypedNodes);
+      }
+      fail(buffer.toString());
+    }
+  }
+
+  @override
+  Object visitAnnotation(Annotation node) {
+    node.visitChildren(this);
+    ElementAnnotation elementAnnotation = node.elementAnnotation;
+    if (elementAnnotation == null) {
+      if (_knownExceptions == null || !_knownExceptions.contains(node)) {
+        _unresolvedNodes.add(node);
+      }
+    } else if (elementAnnotation is! ElementAnnotation) {
+      _wrongTypedNodes.add(node);
+    }
+    return null;
+  }
+
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    node.visitChildren(this);
+    if (!node.operator.isUserDefinableOperator) {
+      return null;
+    }
+    DartType operandType = node.leftOperand.staticType;
+    if (operandType == null || operandType.isDynamic) {
+      return null;
+    }
+    return _checkResolved(
+        node, node.staticElement, (node) => node is MethodElement);
+  }
+
+  @override
+  Object visitCommentReference(CommentReference node) => null;
+
+  @override
+  Object visitCompilationUnit(CompilationUnit node) {
+    node.visitChildren(this);
+    return _checkResolved(
+        node, node.element, (node) => node is CompilationUnitElement);
+  }
+
+  @override
+  Object visitExportDirective(ExportDirective node) =>
+      _checkResolved(node, node.element, (node) => node is ExportElement);
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    node.visitChildren(this);
+    if (node.element is LibraryElement) {
+      _wrongTypedNodes.add(node);
+    }
+    return null;
+  }
+
+  @override
+  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    node.visitChildren(this);
+    // TODO(brianwilkerson) If we start resolving function expressions, then
+    // conditionally check to see whether the node was resolved correctly.
+    return null;
+    //checkResolved(node, node.getElement(), FunctionElement.class);
+  }
+
+  @override
+  Object visitImportDirective(ImportDirective node) {
+    // Not sure how to test the combinators given that it isn't an error if the
+    // names are not defined.
+    _checkResolved(node, node.element, (node) => node is ImportElement);
+    SimpleIdentifier prefix = node.prefix;
+    if (prefix == null) {
+      return null;
+    }
+    return _checkResolved(
+        prefix, prefix.staticElement, (node) => node is PrefixElement);
+  }
+
+  @override
+  Object visitIndexExpression(IndexExpression node) {
+    node.visitChildren(this);
+    DartType targetType = node.realTarget.staticType;
+    if (targetType == null || targetType.isDynamic) {
+      return null;
+    }
+    return _checkResolved(
+        node, node.staticElement, (node) => node is MethodElement);
+  }
+
+  @override
+  Object visitLibraryDirective(LibraryDirective node) =>
+      _checkResolved(node, node.element, (node) => node is LibraryElement);
+
+  @override
+  Object visitNamedExpression(NamedExpression node) =>
+      node.expression.accept(this);
+
+  @override
+  Object visitPartDirective(PartDirective node) => _checkResolved(
+      node, node.element, (node) => node is CompilationUnitElement);
+
+  @override
+  Object visitPartOfDirective(PartOfDirective node) =>
+      _checkResolved(node, node.element, (node) => node is LibraryElement);
+
+  @override
+  Object visitPostfixExpression(PostfixExpression node) {
+    node.visitChildren(this);
+    if (!node.operator.isUserDefinableOperator) {
+      return null;
+    }
+    DartType operandType = node.operand.staticType;
+    if (operandType == null || operandType.isDynamic) {
+      return null;
+    }
+    return _checkResolved(
+        node, node.staticElement, (node) => node is MethodElement);
+  }
+
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    SimpleIdentifier prefix = node.prefix;
+    prefix.accept(this);
+    DartType prefixType = prefix.staticType;
+    if (prefixType == null || prefixType.isDynamic) {
+      return null;
+    }
+    return _checkResolved(node, node.staticElement, null);
+  }
+
+  @override
+  Object visitPrefixExpression(PrefixExpression node) {
+    node.visitChildren(this);
+    if (!node.operator.isUserDefinableOperator) {
+      return null;
+    }
+    DartType operandType = node.operand.staticType;
+    if (operandType == null || operandType.isDynamic) {
+      return null;
+    }
+    return _checkResolved(
+        node, node.staticElement, (node) => node is MethodElement);
+  }
+
+  @override
+  Object visitPropertyAccess(PropertyAccess node) {
+    Expression target = node.realTarget;
+    target.accept(this);
+    DartType targetType = target.staticType;
+    if (targetType == null || targetType.isDynamic) {
+      return null;
+    }
+    return node.propertyName.accept(this);
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    if (node.name == "void") {
+      return null;
+    }
+    AstNode parent = node.parent;
+    if (parent is MethodInvocation) {
+      MethodInvocation invocation = parent;
+      if (identical(invocation.methodName, node)) {
+        Expression target = invocation.realTarget;
+        DartType targetType = target == null ? null : target.staticType;
+        if (targetType == null || targetType.isDynamic) {
+          return null;
+        }
+      }
+    }
+    return _checkResolved(node, node.staticElement, null);
+  }
+
+  Object _checkResolved(
+      AstNode node, Element element, Predicate<Element> predicate) {
+    if (element == null) {
+      if (_knownExceptions == null || !_knownExceptions.contains(node)) {
+        _unresolvedNodes.add(node);
+      }
+    } else if (predicate != null) {
+      if (!predicate(element)) {
+        _wrongTypedNodes.add(node);
+      }
+    }
+    return null;
+  }
+
+  String _getFileName(AstNode node) {
+    // TODO (jwren) there are two copies of this method, one here and one in
+    // StaticTypeVerifier, they should be resolved into a single method
+    if (node != null) {
+      AstNode root = node.root;
+      if (root is CompilationUnit) {
+        CompilationUnit rootCU = root;
+        if (rootCU.element != null) {
+          return rootCU.element.source.fullName;
+        } else {
+          return "<unknown file- CompilationUnit.getElement() returned null>";
+        }
+      } else {
+        return "<unknown file- CompilationUnit.getRoot() is not a CompilationUnit>";
+      }
+    }
+    return "<unknown file- ASTNode is null>";
+  }
+
+  void _printNodes(StringBuffer buffer, List<AstNode> nodes) {
+    for (AstNode identifier in nodes) {
+      buffer.write("  ");
+      buffer.write(identifier.toString());
+      buffer.write(" (");
+      buffer.write(_getFileName(identifier));
+      buffer.write(" : ");
+      buffer.write(identifier.offset);
+      buffer.writeln(")");
+    }
+  }
+}
+
+class ResolverTestCase extends EngineTestCase {
+  /**
+   * The analysis context used to parse the compilation units being resolved.
+   */
+  InternalAnalysisContext analysisContext2;
+
+  /**
+   * Specifies if [assertErrors] should check for [HintCode.UNUSED_ELEMENT] and
+   * [HintCode.UNUSED_FIELD].
+   */
+  bool enableUnusedElement = false;
+
+  /**
+   * Specifies if [assertErrors] should check for [HintCode.UNUSED_LOCAL_VARIABLE].
+   */
+  bool enableUnusedLocalVariable = false;
+
+  AnalysisContext get analysisContext => analysisContext2;
+
+  /**
+   * Return a type provider that can be used to test the results of resolution.
+   *
+   * @return a type provider
+   * @throws AnalysisException if dart:core cannot be resolved
+   */
+  TypeProvider get typeProvider => analysisContext2.typeProvider;
+
+  /**
+   * Add a source file to the content provider. The file path should be absolute.
+   *
+   * @param filePath the path of the file being added
+   * @param contents the contents to be returned by the content provider for the specified file
+   * @return the source object representing the added file
+   */
+  Source addNamedSource(String filePath, String contents) {
+    Source source = cacheSource(filePath, contents);
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(source);
+    analysisContext2.applyChanges(changeSet);
+    return source;
+  }
+
+  /**
+   * Add a source file to the content provider.
+   *
+   * @param contents the contents to be returned by the content provider for the specified file
+   * @return the source object representing the added file
+   */
+  Source addSource(String contents) => addNamedSource("/test.dart", contents);
+
+  /**
+   * Assert that the number of errors reported against the given source matches the number of errors
+   * that are given and that they have the expected error codes. The order in which the errors were
+   * gathered is ignored.
+   *
+   * @param source the source against which the errors should have been reported
+   * @param expectedErrorCodes the error codes of the errors that should have been reported
+   * @throws AnalysisException if the reported errors could not be computed
+   * @throws AssertionFailedError if a different number of errors have been reported than were
+   *           expected
+   */
+  void assertErrors(Source source,
+      [List<ErrorCode> expectedErrorCodes = ErrorCode.EMPTY_LIST]) {
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    for (AnalysisError error in analysisContext2.computeErrors(source)) {
+      ErrorCode errorCode = error.errorCode;
+      if (!enableUnusedElement &&
+          (errorCode == HintCode.UNUSED_ELEMENT ||
+              errorCode == HintCode.UNUSED_FIELD)) {
+        continue;
+      }
+      if (!enableUnusedLocalVariable &&
+          (errorCode == HintCode.UNUSED_CATCH_CLAUSE ||
+              errorCode == HintCode.UNUSED_CATCH_STACK ||
+              errorCode == HintCode.UNUSED_LOCAL_VARIABLE)) {
+        continue;
+      }
+      errorListener.onError(error);
+    }
+    errorListener.assertErrorsWithCodes(expectedErrorCodes);
+  }
+
+  /**
+   * Assert that no errors have been reported against the given source.
+   *
+   * @param source the source against which no errors should have been reported
+   * @throws AnalysisException if the reported errors could not be computed
+   * @throws AssertionFailedError if any errors have been reported
+   */
+  void assertNoErrors(Source source) {
+    assertErrors(source);
+  }
+
+  /**
+   * Cache the source file content in the source factory but don't add the source to the analysis
+   * context. The file path should be absolute.
+   *
+   * @param filePath the path of the file being cached
+   * @param contents the contents to be returned by the content provider for the specified file
+   * @return the source object representing the cached file
+   */
+  Source cacheSource(String filePath, String contents) {
+    Source source = new FileBasedSource(FileUtilities2.createFile(filePath));
+    analysisContext2.setContents(source, contents);
+    return source;
+  }
+
+  /**
+   * Computes errors for the given [librarySource].
+   * This assumes that the given [librarySource] and its parts have already
+   * been added to the content provider using the method [addNamedSource].
+   */
+  void computeLibrarySourceErrors(Source librarySource) {
+    analysisContext.computeErrors(librarySource);
+  }
+
+  /**
+   * Create a library element that represents a library named `"test"` containing a single
+   * empty compilation unit.
+   *
+   * @return the library element that was created
+   */
+  LibraryElementImpl createDefaultTestLibrary() =>
+      createTestLibrary(AnalysisContextFactory.contextWithCore(), "test");
+
+  /**
+   * Create a library element that represents a library with the given name containing a single
+   * empty compilation unit.
+   *
+   * @param libraryName the name of the library to be created
+   * @return the library element that was created
+   */
+  LibraryElementImpl createTestLibrary(
+      AnalysisContext context, String libraryName,
+      [List<String> typeNames]) {
+    String fileName = "$libraryName.dart";
+    FileBasedSource definingCompilationUnitSource =
+        _createNamedSource(fileName);
+    List<CompilationUnitElement> sourcedCompilationUnits;
+    if (typeNames == null) {
+      sourcedCompilationUnits = CompilationUnitElement.EMPTY_LIST;
+    } else {
+      int count = typeNames.length;
+      sourcedCompilationUnits = new List<CompilationUnitElement>(count);
+      for (int i = 0; i < count; i++) {
+        String typeName = typeNames[i];
+        ClassElementImpl type =
+            new ClassElementImpl.forNode(AstFactory.identifier3(typeName));
+        String fileName = "$typeName.dart";
+        CompilationUnitElementImpl compilationUnit =
+            new CompilationUnitElementImpl(fileName);
+        compilationUnit.source = _createNamedSource(fileName);
+        compilationUnit.librarySource = definingCompilationUnitSource;
+        compilationUnit.types = <ClassElement>[type];
+        sourcedCompilationUnits[i] = compilationUnit;
+      }
+    }
+    CompilationUnitElementImpl compilationUnit =
+        new CompilationUnitElementImpl(fileName);
+    compilationUnit.librarySource =
+        compilationUnit.source = definingCompilationUnitSource;
+    LibraryElementImpl library = new LibraryElementImpl.forNode(
+        context, AstFactory.libraryIdentifier2([libraryName]));
+    library.definingCompilationUnit = compilationUnit;
+    library.parts = sourcedCompilationUnits;
+    return library;
+  }
+
+  Expression findTopLevelConstantExpression(
+          CompilationUnit compilationUnit, String name) =>
+      findTopLevelDeclaration(compilationUnit, name).initializer;
+
+  VariableDeclaration findTopLevelDeclaration(
+      CompilationUnit compilationUnit, String name) {
+    for (CompilationUnitMember member in compilationUnit.declarations) {
+      if (member is TopLevelVariableDeclaration) {
+        for (VariableDeclaration variable in member.variables.variables) {
+          if (variable.name.name == name) {
+            return variable;
+          }
+        }
+      }
+    }
+    return null;
+    // Not found
+  }
+
+  /**
+   * @param code the code that assigns the value to the variable "v", no matter how. We check that
+   *          "v" has expected static and propagated type.
+   */
+  void _assertPropagatedAssignedType(String code, DartType expectedStaticType,
+      DartType expectedPropagatedType) {
+    SimpleIdentifier identifier = _findMarkedIdentifier(code, "v = ");
+    expect(identifier.staticType, same(expectedStaticType));
+    expect(identifier.propagatedType, same(expectedPropagatedType));
+  }
+
+  /**
+   * Check the static and propagated types of the expression marked with "; // marker" comment.
+   *
+   * @param code source code to analyze, with the expression to check marked with "// marker".
+   * @param expectedStaticType if non-null, check actual static type is equal to this.
+   * @param expectedPropagatedType if non-null, check actual static type is equal to this.
+   * @throws Exception
+   */
+  void _assertTypeOfMarkedExpression(String code, DartType expectedStaticType,
+      DartType expectedPropagatedType) {
+    SimpleIdentifier identifier = _findMarkedIdentifier(code, "; // marker");
+    if (expectedStaticType != null) {
+      expect(identifier.staticType, expectedStaticType);
+    }
+    expect(identifier.propagatedType, expectedPropagatedType);
+  }
+
+  /**
+   * Return the `SimpleIdentifier` marked by `marker`. The source code must have no
+   * errors and be verifiable.
+   *
+   * @param code source code to analyze.
+   * @param marker marker identifying sought after expression in source code.
+   * @return expression marked by the marker.
+   * @throws Exception
+   */
+  SimpleIdentifier _findMarkedIdentifier(String code, String marker) {
+    try {
+      Source source = addSource(code);
+      LibraryElement library = resolve2(source);
+      assertNoErrors(source);
+      verify([source]);
+      CompilationUnit unit = resolveCompilationUnit(source, library);
+      // Could generalize this further by making [SimpleIdentifier.class] a
+      // parameter.
+      return EngineTestCase.findNode(
+          unit, code, marker, (node) => node is SimpleIdentifier);
+    } catch (exception) {
+      // Is there a better exception to throw here? The point is that an
+      // assertion failure here should be a failure, in both "test_*" and
+      // "fail_*" tests. However, an assertion failure is success for the
+      // purpose of "fail_*" tests, so without catching them here "fail_*" tests
+      // can succeed by failing for the wrong reason.
+      throw new JavaException("Unexexpected assertion failure: $exception");
+    }
+  }
+
+  /**
+   * In the rare cases we want to group several tests into single "test_" method, so need a way to
+   * reset test instance to reuse it.
+   */
+  void reset() {
+    analysisContext2 = AnalysisContextFactory.contextWithCore();
+  }
+
+  /**
+   * Reset the analysis context to have the given options applied.
+   *
+   * @param options the analysis options to be applied to the context
+   */
+  void resetWithOptions(AnalysisOptions options) {
+    analysisContext2 =
+        AnalysisContextFactory.contextWithCoreAndOptions(options);
+  }
+
+  /**
+   * Given a library and all of its parts, resolve the contents of the library and the contents of
+   * the parts. This assumes that the sources for the library and its parts have already been added
+   * to the content provider using the method [addNamedSource].
+   *
+   * @param librarySource the source for the compilation unit that defines the library
+   * @return the element representing the resolved library
+   * @throws AnalysisException if the analysis could not be performed
+   */
+  LibraryElement resolve2(Source librarySource) =>
+      analysisContext2.computeLibraryElement(librarySource);
+
+  /**
+   * Return the resolved compilation unit corresponding to the given source in the given library.
+   *
+   * @param source the source of the compilation unit to be returned
+   * @param library the library in which the compilation unit is to be resolved
+   * @return the resolved compilation unit
+   * @throws Exception if the compilation unit could not be resolved
+   */
+  CompilationUnit resolveCompilationUnit(
+          Source source, LibraryElement library) =>
+      analysisContext2.resolveCompilationUnit(source, library);
+
+  CompilationUnit resolveSource(String sourceText) =>
+      resolveSource2("/test.dart", sourceText);
+
+  CompilationUnit resolveSource2(String fileName, String sourceText) {
+    Source source = addNamedSource(fileName, sourceText);
+    LibraryElement library = analysisContext.computeLibraryElement(source);
+    return analysisContext.resolveCompilationUnit(source, library);
+  }
+
+  Source resolveSources(List<String> sourceTexts) {
+    for (int i = 0; i < sourceTexts.length; i++) {
+      CompilationUnit unit =
+          resolveSource2("/lib${i + 1}.dart", sourceTexts[i]);
+      // reference the source if this is the last source
+      if (i + 1 == sourceTexts.length) {
+        return unit.element.source;
+      }
+    }
+    return null;
+  }
+
+  void resolveWithAndWithoutExperimental(
+      List<String> strSources,
+      List<ErrorCode> codesWithoutExperimental,
+      List<ErrorCode> codesWithExperimental) {
+    // Setup analysis context as non-experimental
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+//    options.enableDeferredLoading = false;
+    resetWithOptions(options);
+    // Analysis and assertions
+    Source source = resolveSources(strSources);
+    assertErrors(source, codesWithoutExperimental);
+    verify([source]);
+    // Setup analysis context as experimental
+    reset();
+    // Analysis and assertions
+    source = resolveSources(strSources);
+    assertErrors(source, codesWithExperimental);
+    verify([source]);
+  }
+
+  void resolveWithErrors(List<String> strSources, List<ErrorCode> codes) {
+    // Analysis and assertions
+    Source source = resolveSources(strSources);
+    assertErrors(source, codes);
+    verify([source]);
+  }
+
+  @override
+  void setUp() {
+    reset();
+  }
+
+  @override
+  void tearDown() {
+    analysisContext2 = null;
+    super.tearDown();
+  }
+
+  /**
+   * Verify that all of the identifiers in the compilation units associated with
+   * the given [sources] have been resolved.
+   */
+  void verify(List<Source> sources) {
+    ResolutionVerifier verifier = new ResolutionVerifier();
+    for (Source source in sources) {
+      List<Source> libraries = analysisContext2.getLibrariesContaining(source);
+      for (Source library in libraries) {
+        analysisContext2
+            .resolveCompilationUnit2(source, library)
+            .accept(verifier);
+      }
+    }
+    verifier.assertResolved();
+  }
+
+  /**
+   * Create a source object representing a file with the given [fileName] and
+   * give it an empty content. Return the source that was created.
+   */
+  FileBasedSource _createNamedSource(String fileName) {
+    FileBasedSource source =
+        new FileBasedSource(FileUtilities2.createFile(fileName));
+    analysisContext2.setContents(source, "");
+    return source;
+  }
+}
+
+class Scope_EnclosedScopeTest_test_define_duplicate extends Scope {
+  GatheringErrorListener listener;
+
+  Scope_EnclosedScopeTest_test_define_duplicate(this.listener) : super();
+
+  @override
+  AnalysisErrorListener get errorListener => listener;
+
+  @override
+  Element internalLookup(Identifier identifier, String name,
+          LibraryElement referencingLibrary) =>
+      null;
+}
+
+class Scope_EnclosedScopeTest_test_define_normal extends Scope {
+  GatheringErrorListener listener;
+
+  Scope_EnclosedScopeTest_test_define_normal(this.listener) : super();
+
+  @override
+  AnalysisErrorListener get errorListener => listener;
+
+  @override
+  Element internalLookup(Identifier identifier, String name,
+          LibraryElement referencingLibrary) =>
+      null;
+}
+
+@reflectiveTest
+class ScopeTest extends ResolverTestCase {
+  void test_define_duplicate() {
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    ScopeTest_TestScope scope = new ScopeTest_TestScope(errorListener);
+    VariableElement element1 =
+        ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
+    VariableElement element2 =
+        ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
+    scope.define(element1);
+    scope.define(element2);
+    errorListener.assertErrorsWithSeverities([ErrorSeverity.ERROR]);
+  }
+
+  void test_define_normal() {
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    ScopeTest_TestScope scope = new ScopeTest_TestScope(errorListener);
+    VariableElement element1 =
+        ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
+    VariableElement element2 =
+        ElementFactory.localVariableElement(AstFactory.identifier3("v2"));
+    scope.define(element1);
+    scope.define(element2);
+    errorListener.assertNoErrors();
+  }
+
+  void test_getErrorListener() {
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    ScopeTest_TestScope scope = new ScopeTest_TestScope(errorListener);
+    expect(scope.errorListener, errorListener);
+  }
+
+  void test_isPrivateName_nonPrivate() {
+    expect(Scope.isPrivateName("Public"), isFalse);
+  }
+
+  void test_isPrivateName_private() {
+    expect(Scope.isPrivateName("_Private"), isTrue);
+  }
+}
+
+/**
+ * A non-abstract subclass that can be used for testing purposes.
+ */
+class ScopeTest_TestScope extends Scope {
+  /**
+   * The listener that is to be informed when an error is encountered.
+   */
+  final AnalysisErrorListener errorListener;
+
+  ScopeTest_TestScope(this.errorListener);
+
+  @override
+  Element internalLookup(Identifier identifier, String name,
+          LibraryElement referencingLibrary) =>
+      localLookup(name, referencingLibrary);
+}
+
+@reflectiveTest
+class SimpleResolverTest extends ResolverTestCase {
+  void fail_getter_and_setter_fromMixins_property_access() {
+    // TODO(paulberry): it appears that auxiliaryElements isn't properly set on
+    // a SimpleIdentifier that's inside a property access.  This bug should be
+    // fixed.
+    Source source = addSource('''
+class B {}
+class M1 {
+  get x => null;
+  set x(value) {}
+}
+class M2 {
+  get x => null;
+  set x(value) {}
+}
+class C extends B with M1, M2 {}
+void main() {
+  new C().x += 1;
+}
+''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    // Verify that both the getter and setter for "x" in "new C().x" refer to
+    // the accessors defined in M2.
+    FunctionDeclaration main =
+        library.definingCompilationUnit.functions[0].computeNode();
+    BlockFunctionBody body = main.functionExpression.body;
+    ExpressionStatement stmt = body.block.statements[0];
+    AssignmentExpression assignment = stmt.expression;
+    PropertyAccess propertyAccess = assignment.leftHandSide;
+    expect(
+        propertyAccess.propertyName.staticElement.enclosingElement.name, 'M2');
+    expect(
+        propertyAccess
+            .propertyName.auxiliaryElements.staticElement.enclosingElement.name,
+        'M2');
+  }
+
+  void fail_staticInvocation() {
+    Source source = addSource(r'''
+class A {
+  static int get g => (a,b) => 0;
+}
+class B {
+  f() {
+    A.g(1,0);
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_argumentResolution_required_matching() {
+    Source source = addSource(r'''
+class A {
+  void f() {
+    g(1, 2, 3);
+  }
+  void g(a, b, c) {}
+}''');
+    _validateArgumentResolution(source, [0, 1, 2]);
+  }
+
+  void test_argumentResolution_required_tooFew() {
+    Source source = addSource(r'''
+class A {
+  void f() {
+    g(1, 2);
+  }
+  void g(a, b, c) {}
+}''');
+    _validateArgumentResolution(source, [0, 1]);
+  }
+
+  void test_argumentResolution_required_tooMany() {
+    Source source = addSource(r'''
+class A {
+  void f() {
+    g(1, 2, 3);
+  }
+  void g(a, b) {}
+}''');
+    _validateArgumentResolution(source, [0, 1, -1]);
+  }
+
+  void test_argumentResolution_requiredAndNamed_extra() {
+    Source source = addSource(r'''
+class A {
+  void f() {
+    g(1, 2, c: 3, d: 4);
+  }
+  void g(a, b, {c}) {}
+}''');
+    _validateArgumentResolution(source, [0, 1, 2, -1]);
+  }
+
+  void test_argumentResolution_requiredAndNamed_matching() {
+    Source source = addSource(r'''
+class A {
+  void f() {
+    g(1, 2, c: 3);
+  }
+  void g(a, b, {c}) {}
+}''');
+    _validateArgumentResolution(source, [0, 1, 2]);
+  }
+
+  void test_argumentResolution_requiredAndNamed_missing() {
+    Source source = addSource(r'''
+class A {
+  void f() {
+    g(1, 2, d: 3);
+  }
+  void g(a, b, {c, d}) {}
+}''');
+    _validateArgumentResolution(source, [0, 1, 3]);
+  }
+
+  void test_argumentResolution_requiredAndPositional_fewer() {
+    Source source = addSource(r'''
+class A {
+  void f() {
+    g(1, 2, 3);
+  }
+  void g(a, b, [c, d]) {}
+}''');
+    _validateArgumentResolution(source, [0, 1, 2]);
+  }
+
+  void test_argumentResolution_requiredAndPositional_matching() {
+    Source source = addSource(r'''
+class A {
+  void f() {
+    g(1, 2, 3, 4);
+  }
+  void g(a, b, [c, d]) {}
+}''');
+    _validateArgumentResolution(source, [0, 1, 2, 3]);
+  }
+
+  void test_argumentResolution_requiredAndPositional_more() {
+    Source source = addSource(r'''
+class A {
+  void f() {
+    g(1, 2, 3, 4);
+  }
+  void g(a, b, [c]) {}
+}''');
+    _validateArgumentResolution(source, [0, 1, 2, -1]);
+  }
+
+  void test_argumentResolution_setter_propagated() {
+    Source source = addSource(r'''
+main() {
+  var a = new A();
+  a.sss = 0;
+}
+class A {
+  set sss(x) {}
+}''');
+    LibraryElement library = resolve2(source);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    // find "a.sss = 0"
+    AssignmentExpression assignment;
+    {
+      FunctionElement mainElement = unit.functions[0];
+      FunctionBody mainBody = mainElement.computeNode().functionExpression.body;
+      Statement statement = (mainBody as BlockFunctionBody).block.statements[1];
+      ExpressionStatement expressionStatement =
+          statement as ExpressionStatement;
+      assignment = expressionStatement.expression as AssignmentExpression;
+    }
+    // get parameter
+    Expression rhs = assignment.rightHandSide;
+    expect(rhs.staticParameterElement, isNull);
+    ParameterElement parameter = rhs.propagatedParameterElement;
+    expect(parameter, isNotNull);
+    expect(parameter.displayName, "x");
+    // validate
+    ClassElement classA = unit.types[0];
+    PropertyAccessorElement setter = classA.accessors[0];
+    expect(setter.parameters[0], same(parameter));
+  }
+
+  void test_argumentResolution_setter_propagated_propertyAccess() {
+    Source source = addSource(r'''
+main() {
+  var a = new A();
+  a.b.sss = 0;
+}
+class A {
+  B b = new B();
+}
+class B {
+  set sss(x) {}
+}''');
+    LibraryElement library = resolve2(source);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    // find "a.b.sss = 0"
+    AssignmentExpression assignment;
+    {
+      FunctionElement mainElement = unit.functions[0];
+      FunctionBody mainBody = mainElement.computeNode().functionExpression.body;
+      Statement statement = (mainBody as BlockFunctionBody).block.statements[1];
+      ExpressionStatement expressionStatement =
+          statement as ExpressionStatement;
+      assignment = expressionStatement.expression as AssignmentExpression;
+    }
+    // get parameter
+    Expression rhs = assignment.rightHandSide;
+    expect(rhs.staticParameterElement, isNull);
+    ParameterElement parameter = rhs.propagatedParameterElement;
+    expect(parameter, isNotNull);
+    expect(parameter.displayName, "x");
+    // validate
+    ClassElement classB = unit.types[1];
+    PropertyAccessorElement setter = classB.accessors[0];
+    expect(setter.parameters[0], same(parameter));
+  }
+
+  void test_argumentResolution_setter_static() {
+    Source source = addSource(r'''
+main() {
+  A a = new A();
+  a.sss = 0;
+}
+class A {
+  set sss(x) {}
+}''');
+    LibraryElement library = resolve2(source);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    // find "a.sss = 0"
+    AssignmentExpression assignment;
+    {
+      FunctionElement mainElement = unit.functions[0];
+      FunctionBody mainBody = mainElement.computeNode().functionExpression.body;
+      Statement statement = (mainBody as BlockFunctionBody).block.statements[1];
+      ExpressionStatement expressionStatement =
+          statement as ExpressionStatement;
+      assignment = expressionStatement.expression as AssignmentExpression;
+    }
+    // get parameter
+    Expression rhs = assignment.rightHandSide;
+    ParameterElement parameter = rhs.staticParameterElement;
+    expect(parameter, isNotNull);
+    expect(parameter.displayName, "x");
+    // validate
+    ClassElement classA = unit.types[0];
+    PropertyAccessorElement setter = classA.accessors[0];
+    expect(setter.parameters[0], same(parameter));
+  }
+
+  void test_argumentResolution_setter_static_propertyAccess() {
+    Source source = addSource(r'''
+main() {
+  A a = new A();
+  a.b.sss = 0;
+}
+class A {
+  B b = new B();
+}
+class B {
+  set sss(x) {}
+}''');
+    LibraryElement library = resolve2(source);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    // find "a.b.sss = 0"
+    AssignmentExpression assignment;
+    {
+      FunctionElement mainElement = unit.functions[0];
+      FunctionBody mainBody = mainElement.computeNode().functionExpression.body;
+      Statement statement = (mainBody as BlockFunctionBody).block.statements[1];
+      ExpressionStatement expressionStatement =
+          statement as ExpressionStatement;
+      assignment = expressionStatement.expression as AssignmentExpression;
+    }
+    // get parameter
+    Expression rhs = assignment.rightHandSide;
+    ParameterElement parameter = rhs.staticParameterElement;
+    expect(parameter, isNotNull);
+    expect(parameter.displayName, "x");
+    // validate
+    ClassElement classB = unit.types[1];
+    PropertyAccessorElement setter = classB.accessors[0];
+    expect(setter.parameters[0], same(parameter));
+  }
+
+  void test_breakTarget_labeled() {
+    // Verify that the target of the label is correctly found and is recorded
+    // as the unlabeled portion of the statement.
+    String text = r'''
+void f() {
+  loop1: while (true) {
+    loop2: for (int i = 0; i < 10; i++) {
+      break loop1;
+      break loop2;
+    }
+  }
+}
+''';
+    CompilationUnit unit = resolveSource(text);
+    WhileStatement whileStatement = EngineTestCase.findNode(
+        unit, text, 'while (true)', (n) => n is WhileStatement);
+    ForStatement forStatement =
+        EngineTestCase.findNode(unit, text, 'for', (n) => n is ForStatement);
+    BreakStatement break1 = EngineTestCase.findNode(
+        unit, text, 'break loop1', (n) => n is BreakStatement);
+    BreakStatement break2 = EngineTestCase.findNode(
+        unit, text, 'break loop2', (n) => n is BreakStatement);
+    expect(break1.target, same(whileStatement));
+    expect(break2.target, same(forStatement));
+  }
+
+  void test_breakTarget_unlabeledBreakFromDo() {
+    String text = r'''
+void f() {
+  do {
+    break;
+  } while (true);
+}
+''';
+    CompilationUnit unit = resolveSource(text);
+    DoStatement doStatement =
+        EngineTestCase.findNode(unit, text, 'do', (n) => n is DoStatement);
+    BreakStatement breakStatement = EngineTestCase.findNode(
+        unit, text, 'break', (n) => n is BreakStatement);
+    expect(breakStatement.target, same(doStatement));
+  }
+
+  void test_breakTarget_unlabeledBreakFromFor() {
+    String text = r'''
+void f() {
+  for (int i = 0; i < 10; i++) {
+    break;
+  }
+}
+''';
+    CompilationUnit unit = resolveSource(text);
+    ForStatement forStatement =
+        EngineTestCase.findNode(unit, text, 'for', (n) => n is ForStatement);
+    BreakStatement breakStatement = EngineTestCase.findNode(
+        unit, text, 'break', (n) => n is BreakStatement);
+    expect(breakStatement.target, same(forStatement));
+  }
+
+  void test_breakTarget_unlabeledBreakFromForEach() {
+    String text = r'''
+void f() {
+  for (x in []) {
+    break;
+  }
+}
+''';
+    CompilationUnit unit = resolveSource(text);
+    ForEachStatement forStatement = EngineTestCase.findNode(
+        unit, text, 'for', (n) => n is ForEachStatement);
+    BreakStatement breakStatement = EngineTestCase.findNode(
+        unit, text, 'break', (n) => n is BreakStatement);
+    expect(breakStatement.target, same(forStatement));
+  }
+
+  void test_breakTarget_unlabeledBreakFromSwitch() {
+    String text = r'''
+void f() {
+  while (true) {
+    switch (0) {
+      case 0:
+        break;
+    }
+  }
+}
+''';
+    CompilationUnit unit = resolveSource(text);
+    SwitchStatement switchStatement = EngineTestCase.findNode(
+        unit, text, 'switch', (n) => n is SwitchStatement);
+    BreakStatement breakStatement = EngineTestCase.findNode(
+        unit, text, 'break', (n) => n is BreakStatement);
+    expect(breakStatement.target, same(switchStatement));
+  }
+
+  void test_breakTarget_unlabeledBreakFromWhile() {
+    String text = r'''
+void f() {
+  while (true) {
+    break;
+  }
+}
+''';
+    CompilationUnit unit = resolveSource(text);
+    WhileStatement whileStatement = EngineTestCase.findNode(
+        unit, text, 'while', (n) => n is WhileStatement);
+    BreakStatement breakStatement = EngineTestCase.findNode(
+        unit, text, 'break', (n) => n is BreakStatement);
+    expect(breakStatement.target, same(whileStatement));
+  }
+
+  void test_breakTarget_unlabeledBreakToOuterFunction() {
+    // Verify that unlabeled break statements can't resolve to loops in an
+    // outer function.
+    String text = r'''
+void f() {
+  while (true) {
+    void g() {
+      break;
+    }
+  }
+}
+''';
+    CompilationUnit unit = resolveSource(text);
+    BreakStatement breakStatement = EngineTestCase.findNode(
+        unit, text, 'break', (n) => n is BreakStatement);
+    expect(breakStatement.target, isNull);
+  }
+
+  void test_class_definesCall() {
+    Source source = addSource(r'''
+class A {
+  int call(int x) { return x; }
+}
+int f(A a) {
+  return a(0);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_class_extends_implements() {
+    Source source = addSource(r'''
+class A extends B implements C {}
+class B {}
+class C {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_commentReference_class() {
+    Source source = addSource(r'''
+f() {}
+/** [A] [new A] [A.n] [new A.n] [m] [f] */
+class A {
+  A() {}
+  A.n() {}
+  m() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_commentReference_parameter() {
+    Source source = addSource(r'''
+class A {
+  A() {}
+  A.n() {}
+  /** [e] [f] */
+  m(e, f()) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_commentReference_singleLine() {
+    Source source = addSource(r'''
+/// [A]
+class A {}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_continueTarget_labeled() {
+    // Verify that the target of the label is correctly found and is recorded
+    // as the unlabeled portion of the statement.
+    String text = r'''
+void f() {
+  loop1: while (true) {
+    loop2: for (int i = 0; i < 10; i++) {
+      continue loop1;
+      continue loop2;
+    }
+  }
+}
+''';
+    CompilationUnit unit = resolveSource(text);
+    WhileStatement whileStatement = EngineTestCase.findNode(
+        unit, text, 'while (true)', (n) => n is WhileStatement);
+    ForStatement forStatement =
+        EngineTestCase.findNode(unit, text, 'for', (n) => n is ForStatement);
+    ContinueStatement continue1 = EngineTestCase.findNode(
+        unit, text, 'continue loop1', (n) => n is ContinueStatement);
+    ContinueStatement continue2 = EngineTestCase.findNode(
+        unit, text, 'continue loop2', (n) => n is ContinueStatement);
+    expect(continue1.target, same(whileStatement));
+    expect(continue2.target, same(forStatement));
+  }
+
+  void test_continueTarget_unlabeledContinueFromDo() {
+    String text = r'''
+void f() {
+  do {
+    continue;
+  } while (true);
+}
+''';
+    CompilationUnit unit = resolveSource(text);
+    DoStatement doStatement =
+        EngineTestCase.findNode(unit, text, 'do', (n) => n is DoStatement);
+    ContinueStatement continueStatement = EngineTestCase.findNode(
+        unit, text, 'continue', (n) => n is ContinueStatement);
+    expect(continueStatement.target, same(doStatement));
+  }
+
+  void test_continueTarget_unlabeledContinueFromFor() {
+    String text = r'''
+void f() {
+  for (int i = 0; i < 10; i++) {
+    continue;
+  }
+}
+''';
+    CompilationUnit unit = resolveSource(text);
+    ForStatement forStatement =
+        EngineTestCase.findNode(unit, text, 'for', (n) => n is ForStatement);
+    ContinueStatement continueStatement = EngineTestCase.findNode(
+        unit, text, 'continue', (n) => n is ContinueStatement);
+    expect(continueStatement.target, same(forStatement));
+  }
+
+  void test_continueTarget_unlabeledContinueFromForEach() {
+    String text = r'''
+void f() {
+  for (x in []) {
+    continue;
+  }
+}
+''';
+    CompilationUnit unit = resolveSource(text);
+    ForEachStatement forStatement = EngineTestCase.findNode(
+        unit, text, 'for', (n) => n is ForEachStatement);
+    ContinueStatement continueStatement = EngineTestCase.findNode(
+        unit, text, 'continue', (n) => n is ContinueStatement);
+    expect(continueStatement.target, same(forStatement));
+  }
+
+  void test_continueTarget_unlabeledContinueFromWhile() {
+    String text = r'''
+void f() {
+  while (true) {
+    continue;
+  }
+}
+''';
+    CompilationUnit unit = resolveSource(text);
+    WhileStatement whileStatement = EngineTestCase.findNode(
+        unit, text, 'while', (n) => n is WhileStatement);
+    ContinueStatement continueStatement = EngineTestCase.findNode(
+        unit, text, 'continue', (n) => n is ContinueStatement);
+    expect(continueStatement.target, same(whileStatement));
+  }
+
+  void test_continueTarget_unlabeledContinueSkipsSwitch() {
+    String text = r'''
+void f() {
+  while (true) {
+    switch (0) {
+      case 0:
+        continue;
+    }
+  }
+}
+''';
+    CompilationUnit unit = resolveSource(text);
+    WhileStatement whileStatement = EngineTestCase.findNode(
+        unit, text, 'while', (n) => n is WhileStatement);
+    ContinueStatement continueStatement = EngineTestCase.findNode(
+        unit, text, 'continue', (n) => n is ContinueStatement);
+    expect(continueStatement.target, same(whileStatement));
+  }
+
+  void test_continueTarget_unlabeledContinueToOuterFunction() {
+    // Verify that unlabeled continue statements can't resolve to loops in an
+    // outer function.
+    String text = r'''
+void f() {
+  while (true) {
+    void g() {
+      continue;
+    }
+  }
+}
+''';
+    CompilationUnit unit = resolveSource(text);
+    ContinueStatement continueStatement = EngineTestCase.findNode(
+        unit, text, 'continue', (n) => n is ContinueStatement);
+    expect(continueStatement.target, isNull);
+  }
+
+  void test_empty() {
+    Source source = addSource("");
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_entryPoint_exported() {
+    addNamedSource(
+        "/two.dart",
+        r'''
+library two;
+main() {}''');
+    Source source = addNamedSource(
+        "/one.dart",
+        r'''
+library one;
+export 'two.dart';''');
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    FunctionElement main = library.entryPoint;
+    expect(main, isNotNull);
+    expect(main.library, isNot(same(library)));
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_entryPoint_local() {
+    Source source = addNamedSource(
+        "/one.dart",
+        r'''
+library one;
+main() {}''');
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    FunctionElement main = library.entryPoint;
+    expect(main, isNotNull);
+    expect(main.library, same(library));
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_entryPoint_none() {
+    Source source = addNamedSource("/one.dart", "library one;");
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    expect(library.entryPoint, isNull);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_enum_externalLibrary() {
+    addNamedSource(
+        "/my_lib.dart",
+        r'''
+library my_lib;
+enum EEE {A, B, C}''');
+    Source source = addSource(r'''
+import 'my_lib.dart';
+main() {
+  EEE e = null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_extractedMethodAsConstant() {
+    Source source = addSource(r'''
+abstract class Comparable<T> {
+  int compareTo(T other);
+  static int compare(Comparable a, Comparable b) => a.compareTo(b);
+}
+class A {
+  void sort([compare = Comparable.compare]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_fieldFormalParameter() {
+    Source source = addSource(r'''
+class A {
+  int x;
+  A(this.x) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_forEachLoops_nonConflicting() {
+    Source source = addSource(r'''
+f() {
+  List list = [1,2,3];
+  for (int x in list) {}
+  for (int x in list) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_forLoops_nonConflicting() {
+    Source source = addSource(r'''
+f() {
+  for (int i = 0; i < 3; i++) {
+  }
+  for (int i = 0; i < 3; i++) {
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_functionTypeAlias() {
+    Source source = addSource(r'''
+typedef bool P(e);
+class A {
+  P p;
+  m(e) {
+    if (p(e)) {}
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_getter_and_setter_fromMixins_bare_identifier() {
+    Source source = addSource('''
+class B {}
+class M1 {
+  get x => null;
+  set x(value) {}
+}
+class M2 {
+  get x => null;
+  set x(value) {}
+}
+class C extends B with M1, M2 {
+  void f() {
+    x += 1;
+  }
+}
+''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    // Verify that both the getter and setter for "x" in C.f() refer to the
+    // accessors defined in M2.
+    ClassElement classC = library.definingCompilationUnit.types[3];
+    MethodDeclaration f = classC.getMethod('f').computeNode();
+    BlockFunctionBody body = f.body;
+    ExpressionStatement stmt = body.block.statements[0];
+    AssignmentExpression assignment = stmt.expression;
+    SimpleIdentifier leftHandSide = assignment.leftHandSide;
+    expect(leftHandSide.staticElement.enclosingElement.name, 'M2');
+    expect(leftHandSide.auxiliaryElements.staticElement.enclosingElement.name,
+        'M2');
+  }
+
+  void test_getter_fromMixins_bare_identifier() {
+    Source source = addSource('''
+class B {}
+class M1 {
+  get x => null;
+}
+class M2 {
+  get x => null;
+}
+class C extends B with M1, M2 {
+  f() {
+    return x;
+  }
+}
+''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    // Verify that the getter for "x" in C.f() refers to the getter defined in
+    // M2.
+    ClassElement classC = library.definingCompilationUnit.types[3];
+    MethodDeclaration f = classC.getMethod('f').computeNode();
+    BlockFunctionBody body = f.body;
+    ReturnStatement stmt = body.block.statements[0];
+    SimpleIdentifier x = stmt.expression;
+    expect(x.staticElement.enclosingElement.name, 'M2');
+  }
+
+  void test_getter_fromMixins_property_access() {
+    Source source = addSource('''
+class B {}
+class M1 {
+  get x => null;
+}
+class M2 {
+  get x => null;
+}
+class C extends B with M1, M2 {}
+void main() {
+  var y = new C().x;
+}
+''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    // Verify that the getter for "x" in "new C().x" refers to the getter
+    // defined in M2.
+    FunctionDeclaration main =
+        library.definingCompilationUnit.functions[0].computeNode();
+    BlockFunctionBody body = main.functionExpression.body;
+    VariableDeclarationStatement stmt = body.block.statements[0];
+    PropertyAccess propertyAccess = stmt.variables.variables[0].initializer;
+    expect(
+        propertyAccess.propertyName.staticElement.enclosingElement.name, 'M2');
+  }
+
+  void test_getterAndSetterWithDifferentTypes() {
+    Source source = addSource(r'''
+class A {
+  int get f => 0;
+  void set f(String s) {}
+}
+g (A a) {
+  a.f = a.f.toString();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
+    verify([source]);
+  }
+
+  void test_hasReferenceToSuper() {
+    Source source = addSource(r'''
+class A {}
+class B {toString() => super.toString();}''');
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    expect(unit, isNotNull);
+    List<ClassElement> classes = unit.types;
+    expect(classes, hasLength(2));
+    expect(classes[0].hasReferenceToSuper, isFalse);
+    expect(classes[1].hasReferenceToSuper, isTrue);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_import_hide() {
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+set foo(value) {}
+class A {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+set foo(value) {}''');
+    Source source = addNamedSource(
+        "/lib3.dart",
+        r'''
+import 'lib1.dart' hide foo;
+import 'lib2.dart';
+
+main() {
+  foo = 0;
+}
+A a;''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_import_prefix() {
+    addNamedSource(
+        "/two.dart",
+        r'''
+library two;
+f(int x) {
+  return x * x;
+}''');
+    Source source = addNamedSource(
+        "/one.dart",
+        r'''
+library one;
+import 'two.dart' as _two;
+main() {
+  _two.f(0);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_import_spaceInUri() {
+    addNamedSource(
+        "/sub folder/lib.dart",
+        r'''
+library lib;
+foo() {}''');
+    Source source = addNamedSource(
+        "/app.dart",
+        r'''
+import 'sub folder/lib.dart';
+
+main() {
+  foo();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_indexExpression_typeParameters() {
+    Source source = addSource(r'''
+f() {
+  List<int> a;
+  a[0];
+  List<List<int>> b;
+  b[0][0];
+  List<List<List<int>>> c;
+  c[0][0][0];
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_indexExpression_typeParameters_invalidAssignmentWarning() {
+    Source source = addSource(r'''
+f() {
+  List<List<int>> b;
+  b[0][0] = 'hi';
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_indirectOperatorThroughCall() {
+    Source source = addSource(r'''
+class A {
+  B call() { return new B(); }
+}
+
+class B {
+  int operator [](int i) { return i; }
+}
+
+A f = new A();
+
+g(int x) {}
+
+main() {
+  g(f()[0]);
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invoke_dynamicThroughGetter() {
+    Source source = addSource(r'''
+class A {
+  List get X => [() => 0];
+  m(A a) {
+    X.last;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_isValidMixin_badSuperclass() {
+    Source source = addSource(r'''
+class A extends B {}
+class B {}''');
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    expect(unit, isNotNull);
+    List<ClassElement> classes = unit.types;
+    expect(classes, hasLength(2));
+    expect(classes[0].isValidMixin, isFalse);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_isValidMixin_constructor() {
+    Source source = addSource(r'''
+class A {
+  A() {}
+}''');
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    expect(unit, isNotNull);
+    List<ClassElement> classes = unit.types;
+    expect(classes, hasLength(1));
+    expect(classes[0].isValidMixin, isFalse);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_isValidMixin_super() {
+    Source source = addSource(r'''
+class A {
+  toString() {
+    return super.toString();
+  }
+}''');
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    expect(unit, isNotNull);
+    List<ClassElement> classes = unit.types;
+    expect(classes, hasLength(1));
+    expect(classes[0].isValidMixin, isFalse);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_isValidMixin_valid() {
+    Source source = addSource("class A {}");
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    expect(unit, isNotNull);
+    List<ClassElement> classes = unit.types;
+    expect(classes, hasLength(1));
+    expect(classes[0].isValidMixin, isTrue);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_labels_switch() {
+    Source source = addSource(r'''
+void doSwitch(int target) {
+  switch (target) {
+    l0: case 0:
+      continue l1;
+    l1: case 1:
+      continue l0;
+    default:
+      continue l1;
+  }
+}''');
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_localVariable_types_invoked() {
+    Source source = addSource(r'''
+const A = null;
+main() {
+  var myVar = (int p) => 'foo';
+  myVar(42);
+}''');
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    CompilationUnit unit =
+        analysisContext.resolveCompilationUnit(source, library);
+    expect(unit, isNotNull);
+    List<bool> found = [false];
+    List<CaughtException> thrownException = new List<CaughtException>(1);
+    unit.accept(new _SimpleResolverTest_localVariable_types_invoked(
+        this, found, thrownException));
+    if (thrownException[0] != null) {
+      throw new AnalysisException(
+          "Exception", new CaughtException(thrownException[0], null));
+    }
+    expect(found[0], isTrue);
+  }
+
+  void test_metadata_class() {
+    Source source = addSource(r'''
+const A = null;
+@A class C<A> {}''');
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    CompilationUnitElement unitElement = library.definingCompilationUnit;
+    expect(unitElement, isNotNull);
+    List<ClassElement> classes = unitElement.types;
+    expect(classes, hasLength(1));
+    List<ElementAnnotation> annotations = classes[0].metadata;
+    expect(annotations, hasLength(1));
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    expect(declarations, hasLength(2));
+    Element expectedElement = (declarations[0] as TopLevelVariableDeclaration)
+        .variables
+        .variables[0].name.staticElement;
+    EngineTestCase.assertInstanceOf((obj) => obj is PropertyInducingElement,
+        PropertyInducingElement, expectedElement);
+    expectedElement = (expectedElement as PropertyInducingElement).getter;
+    Element actualElement =
+        (declarations[1] as ClassDeclaration).metadata[0].name.staticElement;
+    expect(actualElement, same(expectedElement));
+  }
+
+  void test_metadata_field() {
+    Source source = addSource(r'''
+const A = null;
+class C {
+  @A int f;
+}''');
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    expect(unit, isNotNull);
+    List<ClassElement> classes = unit.types;
+    expect(classes, hasLength(1));
+    FieldElement field = classes[0].fields[0];
+    List<ElementAnnotation> annotations = field.metadata;
+    expect(annotations, hasLength(1));
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_metadata_fieldFormalParameter() {
+    Source source = addSource(r'''
+const A = null;
+class C {
+  int f;
+  C(@A this.f);
+}''');
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    expect(unit, isNotNull);
+    List<ClassElement> classes = unit.types;
+    expect(classes, hasLength(1));
+    List<ConstructorElement> constructors = classes[0].constructors;
+    expect(constructors, hasLength(1));
+    List<ParameterElement> parameters = constructors[0].parameters;
+    expect(parameters, hasLength(1));
+    List<ElementAnnotation> annotations = parameters[0].metadata;
+    expect(annotations, hasLength(1));
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_metadata_function() {
+    Source source = addSource(r'''
+const A = null;
+@A f() {}''');
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    expect(unit, isNotNull);
+    List<FunctionElement> functions = unit.functions;
+    expect(functions, hasLength(1));
+    List<ElementAnnotation> annotations = functions[0].metadata;
+    expect(annotations, hasLength(1));
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_metadata_functionTypedParameter() {
+    Source source = addSource(r'''
+const A = null;
+f(@A int p(int x)) {}''');
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    expect(unit, isNotNull);
+    List<FunctionElement> functions = unit.functions;
+    expect(functions, hasLength(1));
+    List<ParameterElement> parameters = functions[0].parameters;
+    expect(parameters, hasLength(1));
+    List<ElementAnnotation> annotations1 = parameters[0].metadata;
+    expect(annotations1, hasLength(1));
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_metadata_libraryDirective() {
+    Source source = addSource(r'''
+@A library lib;
+const A = null;''');
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    List<ElementAnnotation> annotations = library.metadata;
+    expect(annotations, hasLength(1));
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_metadata_method() {
+    Source source = addSource(r'''
+const A = null;
+class C {
+  @A void m() {}
+}''');
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    expect(unit, isNotNull);
+    List<ClassElement> classes = unit.types;
+    expect(classes, hasLength(1));
+    MethodElement method = classes[0].methods[0];
+    List<ElementAnnotation> annotations = method.metadata;
+    expect(annotations, hasLength(1));
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_metadata_namedParameter() {
+    Source source = addSource(r'''
+const A = null;
+f({@A int p : 0}) {}''');
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    expect(unit, isNotNull);
+    List<FunctionElement> functions = unit.functions;
+    expect(functions, hasLength(1));
+    List<ParameterElement> parameters = functions[0].parameters;
+    expect(parameters, hasLength(1));
+    List<ElementAnnotation> annotations1 = parameters[0].metadata;
+    expect(annotations1, hasLength(1));
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_metadata_positionalParameter() {
+    Source source = addSource(r'''
+const A = null;
+f([@A int p = 0]) {}''');
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    expect(unit, isNotNull);
+    List<FunctionElement> functions = unit.functions;
+    expect(functions, hasLength(1));
+    List<ParameterElement> parameters = functions[0].parameters;
+    expect(parameters, hasLength(1));
+    List<ElementAnnotation> annotations1 = parameters[0].metadata;
+    expect(annotations1, hasLength(1));
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_metadata_simpleParameter() {
+    Source source = addSource(r'''
+const A = null;
+f(@A p1, @A int p2) {}''');
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    CompilationUnitElement unit = library.definingCompilationUnit;
+    expect(unit, isNotNull);
+    List<FunctionElement> functions = unit.functions;
+    expect(functions, hasLength(1));
+    List<ParameterElement> parameters = functions[0].parameters;
+    expect(parameters, hasLength(2));
+    List<ElementAnnotation> annotations1 = parameters[0].metadata;
+    expect(annotations1, hasLength(1));
+    List<ElementAnnotation> annotations2 = parameters[1].metadata;
+    expect(annotations2, hasLength(1));
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_metadata_typedef() {
+    Source source = addSource(r'''
+const A = null;
+@A typedef F<A>();''');
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    CompilationUnitElement unitElement = library.definingCompilationUnit;
+    expect(unitElement, isNotNull);
+    List<FunctionTypeAliasElement> aliases = unitElement.functionTypeAliases;
+    expect(aliases, hasLength(1));
+    List<ElementAnnotation> annotations = aliases[0].metadata;
+    expect(annotations, hasLength(1));
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    expect(declarations, hasLength(2));
+    Element expectedElement = (declarations[0] as TopLevelVariableDeclaration)
+        .variables
+        .variables[0].name.staticElement;
+    EngineTestCase.assertInstanceOf((obj) => obj is PropertyInducingElement,
+        PropertyInducingElement, expectedElement);
+    expectedElement = (expectedElement as PropertyInducingElement).getter;
+    Element actualElement =
+        (declarations[1] as FunctionTypeAlias).metadata[0].name.staticElement;
+    expect(actualElement, same(expectedElement));
+  }
+
+  void test_method_fromMixin() {
+    Source source = addSource(r'''
+class B {
+  bar() => 1;
+}
+class A {
+  foo() => 2;
+}
+
+class C extends B with A {
+  bar() => super.bar();
+  foo() => super.foo();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_method_fromMixins() {
+    Source source = addSource('''
+class B {}
+class M1 {
+  void f() {}
+}
+class M2 {
+  void f() {}
+}
+class C extends B with M1, M2 {}
+void main() {
+  new C().f();
+}
+''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    // Verify that the "f" in "new C().f()" refers to the "f" defined in M2.
+    FunctionDeclaration main =
+        library.definingCompilationUnit.functions[0].computeNode();
+    BlockFunctionBody body = main.functionExpression.body;
+    ExpressionStatement stmt = body.block.statements[0];
+    MethodInvocation expr = stmt.expression;
+    expect(expr.methodName.staticElement.enclosingElement.name, 'M2');
+  }
+
+  void test_method_fromMixins_bare_identifier() {
+    Source source = addSource('''
+class B {}
+class M1 {
+  void f() {}
+}
+class M2 {
+  void f() {}
+}
+class C extends B with M1, M2 {
+  void g() {
+    f();
+  }
+}
+''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    // Verify that the call to f() in C.g() refers to the method defined in M2.
+    ClassElement classC = library.definingCompilationUnit.types[3];
+    MethodDeclaration g = classC.getMethod('g').computeNode();
+    BlockFunctionBody body = g.body;
+    ExpressionStatement stmt = body.block.statements[0];
+    MethodInvocation invocation = stmt.expression;
+    SimpleIdentifier methodName = invocation.methodName;
+    expect(methodName.staticElement.enclosingElement.name, 'M2');
+  }
+
+  void test_method_fromMixins_invked_from_outside_class() {
+    Source source = addSource('''
+class B {}
+class M1 {
+  void f() {}
+}
+class M2 {
+  void f() {}
+}
+class C extends B with M1, M2 {}
+void main() {
+  new C().f();
+}
+''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    // Verify that the call to f() in "new C().f()" refers to the method
+    // defined in M2.
+    FunctionDeclaration main =
+        library.definingCompilationUnit.functions[0].computeNode();
+    BlockFunctionBody body = main.functionExpression.body;
+    ExpressionStatement stmt = body.block.statements[0];
+    MethodInvocation invocation = stmt.expression;
+    expect(invocation.methodName.staticElement.enclosingElement.name, 'M2');
+  }
+
+  void test_method_fromSuperclassMixin() {
+    Source source = addSource(r'''
+class A {
+  void m1() {}
+}
+class B extends Object with A {
+}
+class C extends B {
+}
+f(C c) {
+  c.m1();
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_methodCascades() {
+    Source source = addSource(r'''
+class A {
+  void m1() {}
+  void m2() {}
+  void m() {
+    A a = new A();
+    a..m1()
+     ..m2();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_methodCascades_withSetter() {
+    Source source = addSource(r'''
+class A {
+  String name;
+  void m1() {}
+  void m2() {}
+  void m() {
+    A a = new A();
+    a..m1()
+     ..name = 'name'
+     ..m2();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    // failing with error code: INVOCATION_OF_NON_FUNCTION
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_resolveAgainstNull() {
+    Source source = addSource(r'''
+f(var p) {
+  return null == p;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_setter_fromMixins_bare_identifier() {
+    Source source = addSource('''
+class B {}
+class M1 {
+  set x(value) {}
+}
+class M2 {
+  set x(value) {}
+}
+class C extends B with M1, M2 {
+  void f() {
+    x = 1;
+  }
+}
+''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    // Verify that the setter for "x" in C.f() refers to the setter defined in
+    // M2.
+    ClassElement classC = library.definingCompilationUnit.types[3];
+    MethodDeclaration f = classC.getMethod('f').computeNode();
+    BlockFunctionBody body = f.body;
+    ExpressionStatement stmt = body.block.statements[0];
+    AssignmentExpression assignment = stmt.expression;
+    SimpleIdentifier leftHandSide = assignment.leftHandSide;
+    expect(leftHandSide.staticElement.enclosingElement.name, 'M2');
+  }
+
+  void test_setter_fromMixins_property_access() {
+    Source source = addSource('''
+class B {}
+class M1 {
+  set x(value) {}
+}
+class M2 {
+  set x(value) {}
+}
+class C extends B with M1, M2 {}
+void main() {
+  new C().x = 1;
+}
+''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    // Verify that the setter for "x" in "new C().x" refers to the setter
+    // defined in M2.
+    FunctionDeclaration main =
+        library.definingCompilationUnit.functions[0].computeNode();
+    BlockFunctionBody body = main.functionExpression.body;
+    ExpressionStatement stmt = body.block.statements[0];
+    AssignmentExpression assignment = stmt.expression;
+    PropertyAccess propertyAccess = assignment.leftHandSide;
+    expect(
+        propertyAccess.propertyName.staticElement.enclosingElement.name, 'M2');
+  }
+
+  void test_setter_inherited() {
+    Source source = addSource(r'''
+class A {
+  int get x => 0;
+  set x(int p) {}
+}
+class B extends A {
+  int get x => super.x == null ? 0 : super.x;
+  int f() => x = 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_setter_static() {
+    Source source = addSource(r'''
+set s(x) {
+}
+
+main() {
+  s = 123;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  /**
+   * Resolve the given source and verify that the arguments in a specific method invocation were
+   * correctly resolved.
+   *
+   * The source is expected to be source for a compilation unit, the first declaration is expected
+   * to be a class, the first member of which is expected to be a method with a block body, and the
+   * first statement in the body is expected to be an expression statement whose expression is a
+   * method invocation. It is the arguments to that method invocation that are tested. The method
+   * invocation can contain errors.
+   *
+   * The arguments were resolved correctly if the number of expressions in the list matches the
+   * length of the array of indices and if, for each index in the array of indices, the parameter to
+   * which the argument expression was resolved is the parameter in the invoked method's list of
+   * parameters at that index. Arguments that should not be resolved to a parameter because of an
+   * error can be denoted by including a negative index in the array of indices.
+   *
+   * @param source the source to be resolved
+   * @param indices the array of indices used to associate arguments with parameters
+   * @throws Exception if the source could not be resolved or if the structure of the source is not
+   *           valid
+   */
+  void _validateArgumentResolution(Source source, List<int> indices) {
+    LibraryElement library = resolve2(source);
+    expect(library, isNotNull);
+    ClassElement classElement = library.definingCompilationUnit.types[0];
+    List<ParameterElement> parameters = classElement.methods[1].parameters;
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    expect(unit, isNotNull);
+    ClassDeclaration classDeclaration =
+        unit.declarations[0] as ClassDeclaration;
+    MethodDeclaration methodDeclaration =
+        classDeclaration.members[0] as MethodDeclaration;
+    Block block = (methodDeclaration.body as BlockFunctionBody).block;
+    ExpressionStatement statement = block.statements[0] as ExpressionStatement;
+    MethodInvocation invocation = statement.expression as MethodInvocation;
+    NodeList<Expression> arguments = invocation.argumentList.arguments;
+    int argumentCount = arguments.length;
+    expect(argumentCount, indices.length);
+    for (int i = 0; i < argumentCount; i++) {
+      Expression argument = arguments[i];
+      ParameterElement element = argument.staticParameterElement;
+      int index = indices[i];
+      if (index < 0) {
+        expect(element, isNull);
+      } else {
+        expect(element, same(parameters[index]));
+      }
+    }
+  }
+}
+
+class SourceContainer_ChangeSetTest_test_toString implements SourceContainer {
+  @override
+  bool contains(Source source) => false;
+}
+
+/**
+ * Like [StaticTypeAnalyzerTest], but as end-to-end tests.
+ */
+@reflectiveTest
+class StaticTypeAnalyzer2Test extends ResolverTestCase {
+  String testCode;
+  Source testSource;
+  CompilationUnit testUnit;
+
+  void test_FunctionExpressionInvocation_block() {
+    String code = r'''
+main() {
+  var foo = (() { return 1; })();
+}
+''';
+    _resolveTestUnit(code);
+    SimpleIdentifier identifier = _findIdentifier('foo');
+    VariableDeclaration declaration =
+        identifier.getAncestor((node) => node is VariableDeclaration);
+    expect(declaration.initializer.staticType.isDynamic, isTrue);
+    expect(declaration.initializer.propagatedType, isNull);
+  }
+
+  void test_FunctionExpressionInvocation_curried() {
+    String code = r'''
+typedef int F();
+F f() => null;
+main() {
+  var foo = f()();
+}
+''';
+    _resolveTestUnit(code);
+    SimpleIdentifier identifier = _findIdentifier('foo');
+    VariableDeclaration declaration =
+        identifier.getAncestor((node) => node is VariableDeclaration);
+    expect(declaration.initializer.staticType.name, 'int');
+    expect(declaration.initializer.propagatedType, isNull);
+  }
+
+  void test_FunctionExpressionInvocation_expression() {
+    String code = r'''
+main() {
+  var foo = (() => 1)();
+}
+''';
+    _resolveTestUnit(code);
+    SimpleIdentifier identifier = _findIdentifier('foo');
+    VariableDeclaration declaration =
+        identifier.getAncestor((node) => node is VariableDeclaration);
+    expect(declaration.initializer.staticType.name, 'int');
+    expect(declaration.initializer.propagatedType, isNull);
+  }
+
+  void test_MethodInvocation_nameType_localVariable() {
+    String code = r"""
+typedef Foo();
+main() {
+  Foo foo;
+  foo();
+}
+""";
+    _resolveTestUnit(code);
+    // "foo" should be resolved to the "Foo" type
+    SimpleIdentifier identifier = _findIdentifier("foo();");
+    DartType type = identifier.staticType;
+    expect(type, new isInstanceOf<FunctionType>());
+  }
+
+  void test_MethodInvocation_nameType_parameter_FunctionTypeAlias() {
+    String code = r"""
+typedef Foo();
+main(Foo foo) {
+  foo();
+}
+""";
+    _resolveTestUnit(code);
+    // "foo" should be resolved to the "Foo" type
+    SimpleIdentifier identifier = _findIdentifier("foo();");
+    DartType type = identifier.staticType;
+    expect(type, new isInstanceOf<FunctionType>());
+  }
+
+  void test_MethodInvocation_nameType_parameter_propagatedType() {
+    String code = r"""
+typedef Foo();
+main(p) {
+  if (p is Foo) {
+    p();
+  }
+}
+""";
+    _resolveTestUnit(code);
+    SimpleIdentifier identifier = _findIdentifier("p()");
+    expect(identifier.staticType, DynamicTypeImpl.instance);
+    {
+      FunctionType type = identifier.propagatedType;
+      expect(type, isNotNull);
+      expect(type.name, 'Foo');
+    }
+  }
+
+  SimpleIdentifier _findIdentifier(String search) {
+    SimpleIdentifier identifier = EngineTestCase.findNode(
+        testUnit, testCode, search, (node) => node is SimpleIdentifier);
+    return identifier;
+  }
+
+  void _resolveTestUnit(String code) {
+    testCode = code;
+    testSource = addSource(testCode);
+    LibraryElement library = resolve2(testSource);
+    assertNoErrors(testSource);
+    verify([testSource]);
+    testUnit = resolveCompilationUnit(testSource, library);
+  }
+}
+
+@reflectiveTest
+class StaticTypeAnalyzerTest extends EngineTestCase {
+  /**
+   * The error listener to which errors will be reported.
+   */
+  GatheringErrorListener _listener;
+
+  /**
+   * The resolver visitor used to create the analyzer.
+   */
+  ResolverVisitor _visitor;
+
+  /**
+   * The analyzer being used to analyze the test cases.
+   */
+  StaticTypeAnalyzer _analyzer;
+
+  /**
+   * The type provider used to access the types.
+   */
+  TestTypeProvider _typeProvider;
+
+  void fail_visitFunctionExpressionInvocation() {
+    fail("Not yet tested");
+    _listener.assertNoErrors();
+  }
+
+  void fail_visitMethodInvocation() {
+    fail("Not yet tested");
+    _listener.assertNoErrors();
+  }
+
+  void fail_visitSimpleIdentifier() {
+    fail("Not yet tested");
+    _listener.assertNoErrors();
+  }
+
+  @override
+  void setUp() {
+    _listener = new GatheringErrorListener();
+    _typeProvider = new TestTypeProvider();
+    _analyzer = _createAnalyzer();
+  }
+
+  void test_flatten_derived() {
+    // class Derived<T> extends Future<T> { ... }
+    ClassElementImpl derivedClass =
+        ElementFactory.classElement2('Derived', ['T']);
+    derivedClass.supertype = _typeProvider.futureType
+        .substitute4([derivedClass.typeParameters[0].type]);
+    InterfaceType intType = _typeProvider.intType;
+    DartType dynamicType = _typeProvider.dynamicType;
+    InterfaceType derivedIntType = derivedClass.type.substitute4([intType]);
+    // flatten(Derived) = dynamic
+    InterfaceType derivedDynamicType =
+        derivedClass.type.substitute4([dynamicType]);
+    expect(_flatten(derivedDynamicType), dynamicType);
+    // flatten(Derived<int>) = int
+    expect(_flatten(derivedIntType), intType);
+    // flatten(Derived<Derived>) = Derived
+    expect(_flatten(derivedClass.type.substitute4([derivedDynamicType])),
+        derivedDynamicType);
+    // flatten(Derived<Derived<int>>) = Derived<int>
+    expect(_flatten(derivedClass.type.substitute4([derivedIntType])),
+        derivedIntType);
+  }
+
+  void test_flatten_inhibit_recursion() {
+    // class A extends B
+    // class B extends A
+    ClassElementImpl classA = ElementFactory.classElement2('A', []);
+    ClassElementImpl classB = ElementFactory.classElement2('B', []);
+    classA.supertype = classB.type;
+    classB.supertype = classA.type;
+    // flatten(A) = A and flatten(B) = B, since neither class contains Future
+    // in its class hierarchy.  Even though there is a loop in the class
+    // hierarchy, flatten() should terminate.
+    expect(_flatten(classA.type), classA.type);
+    expect(_flatten(classB.type), classB.type);
+  }
+
+  void test_flatten_related_derived_types() {
+    InterfaceType intType = _typeProvider.intType;
+    InterfaceType numType = _typeProvider.numType;
+    // class Derived<T> extends Future<T>
+    ClassElementImpl derivedClass =
+        ElementFactory.classElement2('Derived', ['T']);
+    derivedClass.supertype = _typeProvider.futureType
+        .substitute4([derivedClass.typeParameters[0].type]);
+    InterfaceType derivedType = derivedClass.type;
+    // class A extends Derived<int> implements Derived<num> { ... }
+    ClassElementImpl classA =
+        ElementFactory.classElement('A', derivedType.substitute4([intType]));
+    classA.interfaces = <InterfaceType>[
+      derivedType.substitute4([numType])
+    ];
+    // class B extends Future<num> implements Future<int> { ... }
+    ClassElementImpl classB =
+        ElementFactory.classElement('B', derivedType.substitute4([numType]));
+    classB.interfaces = <InterfaceType>[
+      derivedType.substitute4([intType])
+    ];
+    // flatten(A) = flatten(B) = int, since int is more specific than num.
+    // The code in flatten() that inhibits infinite recursion shouldn't be
+    // fooled by the fact that Derived appears twice in the type hierarchy.
+    expect(_flatten(classA.type), intType);
+    expect(_flatten(classB.type), intType);
+  }
+
+  void test_flatten_related_types() {
+    InterfaceType futureType = _typeProvider.futureType;
+    InterfaceType intType = _typeProvider.intType;
+    InterfaceType numType = _typeProvider.numType;
+    // class A extends Future<int> implements Future<num> { ... }
+    ClassElementImpl classA =
+        ElementFactory.classElement('A', futureType.substitute4([intType]));
+    classA.interfaces = <InterfaceType>[
+      futureType.substitute4([numType])
+    ];
+    // class B extends Future<num> implements Future<int> { ... }
+    ClassElementImpl classB =
+        ElementFactory.classElement('B', futureType.substitute4([numType]));
+    classB.interfaces = <InterfaceType>[
+      futureType.substitute4([intType])
+    ];
+    // flatten(A) = flatten(B) = int, since int is more specific than num.
+    expect(_flatten(classA.type), intType);
+    expect(_flatten(classB.type), intType);
+  }
+
+  void test_flatten_simple() {
+    InterfaceType intType = _typeProvider.intType;
+    DartType dynamicType = _typeProvider.dynamicType;
+    InterfaceType futureDynamicType = _typeProvider.futureDynamicType;
+    InterfaceType futureIntType =
+        _typeProvider.futureType.substitute4([intType]);
+    InterfaceType futureFutureDynamicType =
+        _typeProvider.futureType.substitute4([futureDynamicType]);
+    InterfaceType futureFutureIntType =
+        _typeProvider.futureType.substitute4([futureIntType]);
+    // flatten(int) = int
+    expect(_flatten(intType), intType);
+    // flatten(dynamic) = dynamic
+    expect(_flatten(dynamicType), dynamicType);
+    // flatten(Future) = dynamic
+    expect(_flatten(futureDynamicType), dynamicType);
+    // flatten(Future<int>) = int
+    expect(_flatten(futureIntType), intType);
+    // flatten(Future<Future>) = dynamic
+    expect(_flatten(futureFutureDynamicType), dynamicType);
+    // flatten(Future<Future<int>>) = int
+    expect(_flatten(futureFutureIntType), intType);
+  }
+
+  void test_flatten_unrelated_types() {
+    InterfaceType futureType = _typeProvider.futureType;
+    InterfaceType intType = _typeProvider.intType;
+    InterfaceType stringType = _typeProvider.stringType;
+    // class A extends Future<int> implements Future<String> { ... }
+    ClassElementImpl classA =
+        ElementFactory.classElement('A', futureType.substitute4([intType]));
+    classA.interfaces = <InterfaceType>[
+      futureType.substitute4([stringType])
+    ];
+    // class B extends Future<String> implements Future<int> { ... }
+    ClassElementImpl classB =
+        ElementFactory.classElement('B', futureType.substitute4([stringType]));
+    classB.interfaces = <InterfaceType>[
+      futureType.substitute4([intType])
+    ];
+    // flatten(A) = A and flatten(B) = B, since neither string nor int is more
+    // specific than the other.
+    expect(_flatten(classA.type), classA.type);
+    expect(_flatten(classB.type), classB.type);
+  }
+
+  void test_visitAdjacentStrings() {
+    // "a" "b"
+    Expression node = AstFactory
+        .adjacentStrings([_resolvedString("a"), _resolvedString("b")]);
+    expect(_analyze(node), same(_typeProvider.stringType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitAsExpression() {
+    // class A { ... this as B ... }
+    // class B extends A {}
+    ClassElement superclass = ElementFactory.classElement2("A");
+    InterfaceType superclassType = superclass.type;
+    ClassElement subclass = ElementFactory.classElement("B", superclassType);
+    Expression node = AstFactory.asExpression(
+        AstFactory.thisExpression(), AstFactory.typeName(subclass));
+    expect(_analyze3(node, superclassType), same(subclass.type));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitAssignmentExpression_compound() {
+    // i += 1
+    InterfaceType numType = _typeProvider.numType;
+    SimpleIdentifier identifier = _resolvedVariable(_typeProvider.intType, "i");
+    AssignmentExpression node = AstFactory.assignmentExpression(
+        identifier, TokenType.PLUS_EQ, _resolvedInteger(1));
+    MethodElement plusMethod = getMethod(numType, "+");
+    node.staticElement = plusMethod;
+    expect(_analyze(node), same(numType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitAssignmentExpression_compoundIfNull_differentTypes() {
+    // double d; d ??= 0
+    Expression node = AstFactory.assignmentExpression(
+        _resolvedVariable(_typeProvider.doubleType, 'd'),
+        TokenType.QUESTION_QUESTION_EQ,
+        _resolvedInteger(0));
+    expect(_analyze(node), same(_typeProvider.numType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitAssignmentExpression_compoundIfNull_sameTypes() {
+    // int i; i ??= 0
+    Expression node = AstFactory.assignmentExpression(
+        _resolvedVariable(_typeProvider.intType, 'i'),
+        TokenType.QUESTION_QUESTION_EQ,
+        _resolvedInteger(0));
+    expect(_analyze(node), same(_typeProvider.intType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitAssignmentExpression_simple() {
+    // i = 0
+    InterfaceType intType = _typeProvider.intType;
+    Expression node = AstFactory.assignmentExpression(
+        _resolvedVariable(intType, "i"), TokenType.EQ, _resolvedInteger(0));
+    expect(_analyze(node), same(intType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitAwaitExpression_flattened() {
+    // await e, where e has type Future<Future<int>>
+    InterfaceType intType = _typeProvider.intType;
+    InterfaceType futureIntType =
+        _typeProvider.futureType.substitute4(<DartType>[intType]);
+    InterfaceType futureFutureIntType =
+        _typeProvider.futureType.substitute4(<DartType>[futureIntType]);
+    Expression node =
+        AstFactory.awaitExpression(_resolvedVariable(futureFutureIntType, 'e'));
+    expect(_analyze(node), same(intType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitAwaitExpression_simple() {
+    // await e, where e has type Future<int>
+    InterfaceType intType = _typeProvider.intType;
+    InterfaceType futureIntType =
+        _typeProvider.futureType.substitute4(<DartType>[intType]);
+    Expression node =
+        AstFactory.awaitExpression(_resolvedVariable(futureIntType, 'e'));
+    expect(_analyze(node), same(intType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_equals() {
+    // 2 == 3
+    Expression node = AstFactory.binaryExpression(
+        _resolvedInteger(2), TokenType.EQ_EQ, _resolvedInteger(3));
+    expect(_analyze(node), same(_typeProvider.boolType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_ifNull() {
+    // 1 ?? 1.5
+    Expression node = AstFactory.binaryExpression(
+        _resolvedInteger(1), TokenType.QUESTION_QUESTION, _resolvedDouble(1.5));
+    expect(_analyze(node), same(_typeProvider.numType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_logicalAnd() {
+    // false && true
+    Expression node = AstFactory.binaryExpression(
+        AstFactory.booleanLiteral(false),
+        TokenType.AMPERSAND_AMPERSAND,
+        AstFactory.booleanLiteral(true));
+    expect(_analyze(node), same(_typeProvider.boolType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_logicalOr() {
+    // false || true
+    Expression node = AstFactory.binaryExpression(
+        AstFactory.booleanLiteral(false),
+        TokenType.BAR_BAR,
+        AstFactory.booleanLiteral(true));
+    expect(_analyze(node), same(_typeProvider.boolType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_minusID_propagated() {
+    // a - b
+    BinaryExpression node = AstFactory.binaryExpression(
+        _propagatedVariable(_typeProvider.intType, 'a'),
+        TokenType.MINUS,
+        _propagatedVariable(_typeProvider.doubleType, 'b'));
+    node.propagatedElement = getMethod(_typeProvider.numType, "+");
+    _analyze(node);
+    expect(node.propagatedType, same(_typeProvider.doubleType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_notEquals() {
+    // 2 != 3
+    Expression node = AstFactory.binaryExpression(
+        _resolvedInteger(2), TokenType.BANG_EQ, _resolvedInteger(3));
+    expect(_analyze(node), same(_typeProvider.boolType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_plusID() {
+    // 1 + 2.0
+    BinaryExpression node = AstFactory.binaryExpression(
+        _resolvedInteger(1), TokenType.PLUS, _resolvedDouble(2.0));
+    node.staticElement = getMethod(_typeProvider.numType, "+");
+    expect(_analyze(node), same(_typeProvider.doubleType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_plusII() {
+    // 1 + 2
+    BinaryExpression node = AstFactory.binaryExpression(
+        _resolvedInteger(1), TokenType.PLUS, _resolvedInteger(2));
+    node.staticElement = getMethod(_typeProvider.numType, "+");
+    expect(_analyze(node), same(_typeProvider.intType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_plusII_propagated() {
+    // a + b
+    BinaryExpression node = AstFactory.binaryExpression(
+        _propagatedVariable(_typeProvider.intType, 'a'),
+        TokenType.PLUS,
+        _propagatedVariable(_typeProvider.intType, 'b'));
+    node.propagatedElement = getMethod(_typeProvider.numType, "+");
+    _analyze(node);
+    expect(node.propagatedType, same(_typeProvider.intType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_slash() {
+    // 2 / 2
+    BinaryExpression node = AstFactory.binaryExpression(
+        _resolvedInteger(2), TokenType.SLASH, _resolvedInteger(2));
+    node.staticElement = getMethod(_typeProvider.numType, "/");
+    expect(_analyze(node), same(_typeProvider.doubleType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_star_notSpecial() {
+    // class A {
+    //   A operator *(double value);
+    // }
+    // (a as A) * 2.0
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    InterfaceType typeA = classA.type;
+    MethodElement operator =
+        ElementFactory.methodElement("*", typeA, [_typeProvider.doubleType]);
+    classA.methods = <MethodElement>[operator];
+    BinaryExpression node = AstFactory.binaryExpression(
+        AstFactory.asExpression(
+            AstFactory.identifier3("a"), AstFactory.typeName(classA)),
+        TokenType.PLUS,
+        _resolvedDouble(2.0));
+    node.staticElement = operator;
+    expect(_analyze(node), same(typeA));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_starID() {
+    // 1 * 2.0
+    BinaryExpression node = AstFactory.binaryExpression(
+        _resolvedInteger(1), TokenType.PLUS, _resolvedDouble(2.0));
+    node.staticElement = getMethod(_typeProvider.numType, "*");
+    expect(_analyze(node), same(_typeProvider.doubleType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBooleanLiteral_false() {
+    // false
+    Expression node = AstFactory.booleanLiteral(false);
+    expect(_analyze(node), same(_typeProvider.boolType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBooleanLiteral_true() {
+    // true
+    Expression node = AstFactory.booleanLiteral(true);
+    expect(_analyze(node), same(_typeProvider.boolType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitCascadeExpression() {
+    // a..length
+    Expression node = AstFactory.cascadeExpression(
+        _resolvedString("a"), [AstFactory.propertyAccess2(null, "length")]);
+    expect(_analyze(node), same(_typeProvider.stringType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitConditionalExpression_differentTypes() {
+    // true ? 1.0 : 0
+    Expression node = AstFactory.conditionalExpression(
+        AstFactory.booleanLiteral(true),
+        _resolvedDouble(1.0),
+        _resolvedInteger(0));
+    expect(_analyze(node), same(_typeProvider.numType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitConditionalExpression_sameTypes() {
+    // true ? 1 : 0
+    Expression node = AstFactory.conditionalExpression(
+        AstFactory.booleanLiteral(true),
+        _resolvedInteger(1),
+        _resolvedInteger(0));
+    expect(_analyze(node), same(_typeProvider.intType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitDoubleLiteral() {
+    // 4.33
+    Expression node = AstFactory.doubleLiteral(4.33);
+    expect(_analyze(node), same(_typeProvider.doubleType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_async_block() {
+    // () async {}
+    BlockFunctionBody body = AstFactory.blockFunctionBody2();
+    body.keyword = TokenFactory.tokenFromString('async');
+    FunctionExpression node =
+        _resolvedFunctionExpression(AstFactory.formalParameterList([]), body);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(
+        _typeProvider.futureDynamicType, null, null, null, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_async_expression() {
+    // () async => e, where e has type int
+    InterfaceType intType = _typeProvider.intType;
+    InterfaceType futureIntType =
+        _typeProvider.futureType.substitute4(<DartType>[intType]);
+    Expression expression = _resolvedVariable(intType, 'e');
+    ExpressionFunctionBody body = AstFactory.expressionFunctionBody(expression);
+    body.keyword = TokenFactory.tokenFromString('async');
+    FunctionExpression node =
+        _resolvedFunctionExpression(AstFactory.formalParameterList([]), body);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(futureIntType, null, null, null, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_async_expression_flatten() {
+    // () async => e, where e has type Future<int>
+    InterfaceType intType = _typeProvider.intType;
+    InterfaceType futureIntType =
+        _typeProvider.futureType.substitute4(<DartType>[intType]);
+    Expression expression = _resolvedVariable(futureIntType, 'e');
+    ExpressionFunctionBody body = AstFactory.expressionFunctionBody(expression);
+    body.keyword = TokenFactory.tokenFromString('async');
+    FunctionExpression node =
+        _resolvedFunctionExpression(AstFactory.formalParameterList([]), body);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(futureIntType, null, null, null, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_async_expression_flatten_twice() {
+    // () async => e, where e has type Future<Future<int>>
+    InterfaceType intType = _typeProvider.intType;
+    InterfaceType futureIntType =
+        _typeProvider.futureType.substitute4(<DartType>[intType]);
+    InterfaceType futureFutureIntType =
+        _typeProvider.futureType.substitute4(<DartType>[futureIntType]);
+    Expression expression = _resolvedVariable(futureFutureIntType, 'e');
+    ExpressionFunctionBody body = AstFactory.expressionFunctionBody(expression);
+    body.keyword = TokenFactory.tokenFromString('async');
+    FunctionExpression node =
+        _resolvedFunctionExpression(AstFactory.formalParameterList([]), body);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(futureIntType, null, null, null, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_generator_async() {
+    // () async* {}
+    BlockFunctionBody body = AstFactory.blockFunctionBody2();
+    body.keyword = TokenFactory.tokenFromString('async');
+    body.star = TokenFactory.tokenFromType(TokenType.STAR);
+    FunctionExpression node =
+        _resolvedFunctionExpression(AstFactory.formalParameterList([]), body);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(
+        _typeProvider.streamDynamicType, null, null, null, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_generator_sync() {
+    // () sync* {}
+    BlockFunctionBody body = AstFactory.blockFunctionBody2();
+    body.keyword = TokenFactory.tokenFromString('sync');
+    body.star = TokenFactory.tokenFromType(TokenType.STAR);
+    FunctionExpression node =
+        _resolvedFunctionExpression(AstFactory.formalParameterList([]), body);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(
+        _typeProvider.iterableDynamicType, null, null, null, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_named_block() {
+    // ({p1 : 0, p2 : 0}) {}
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p1 = AstFactory.namedFormalParameter(
+        AstFactory.simpleFormalParameter3("p1"), _resolvedInteger(0));
+    _setType(p1, dynamicType);
+    FormalParameter p2 = AstFactory.namedFormalParameter(
+        AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(
+        AstFactory.formalParameterList([p1, p2]),
+        AstFactory.blockFunctionBody2());
+    _analyze5(p1);
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>();
+    expectedNamedTypes["p1"] = dynamicType;
+    expectedNamedTypes["p2"] = dynamicType;
+    _assertFunctionType(
+        dynamicType, null, null, expectedNamedTypes, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_named_expression() {
+    // ({p : 0}) -> 0;
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p = AstFactory.namedFormalParameter(
+        AstFactory.simpleFormalParameter3("p"), _resolvedInteger(0));
+    _setType(p, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(
+        AstFactory.formalParameterList([p]),
+        AstFactory.expressionFunctionBody(_resolvedInteger(0)));
+    _analyze5(p);
+    DartType resultType = _analyze(node);
+    Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>();
+    expectedNamedTypes["p"] = dynamicType;
+    _assertFunctionType(
+        _typeProvider.intType, null, null, expectedNamedTypes, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_normal_block() {
+    // (p1, p2) {}
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p1 = AstFactory.simpleFormalParameter3("p1");
+    _setType(p1, dynamicType);
+    FormalParameter p2 = AstFactory.simpleFormalParameter3("p2");
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(
+        AstFactory.formalParameterList([p1, p2]),
+        AstFactory.blockFunctionBody2());
+    _analyze5(p1);
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(dynamicType, <DartType>[dynamicType, dynamicType], null,
+        null, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_normal_expression() {
+    // (p1, p2) -> 0
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p = AstFactory.simpleFormalParameter3("p");
+    _setType(p, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(
+        AstFactory.formalParameterList([p]),
+        AstFactory.expressionFunctionBody(_resolvedInteger(0)));
+    _analyze5(p);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(
+        _typeProvider.intType, <DartType>[dynamicType], null, null, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_normalAndNamed_block() {
+    // (p1, {p2 : 0}) {}
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p1 = AstFactory.simpleFormalParameter3("p1");
+    _setType(p1, dynamicType);
+    FormalParameter p2 = AstFactory.namedFormalParameter(
+        AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(
+        AstFactory.formalParameterList([p1, p2]),
+        AstFactory.blockFunctionBody2());
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>();
+    expectedNamedTypes["p2"] = dynamicType;
+    _assertFunctionType(dynamicType, <DartType>[dynamicType], null,
+        expectedNamedTypes, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_normalAndNamed_expression() {
+    // (p1, {p2 : 0}) -> 0
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p1 = AstFactory.simpleFormalParameter3("p1");
+    _setType(p1, dynamicType);
+    FormalParameter p2 = AstFactory.namedFormalParameter(
+        AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(
+        AstFactory.formalParameterList([p1, p2]),
+        AstFactory.expressionFunctionBody(_resolvedInteger(0)));
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>();
+    expectedNamedTypes["p2"] = dynamicType;
+    _assertFunctionType(_typeProvider.intType, <DartType>[dynamicType], null,
+        expectedNamedTypes, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_normalAndPositional_block() {
+    // (p1, [p2 = 0]) {}
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p1 = AstFactory.simpleFormalParameter3("p1");
+    _setType(p1, dynamicType);
+    FormalParameter p2 = AstFactory.positionalFormalParameter(
+        AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(
+        AstFactory.formalParameterList([p1, p2]),
+        AstFactory.blockFunctionBody2());
+    _analyze5(p1);
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(dynamicType, <DartType>[dynamicType],
+        <DartType>[dynamicType], null, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_normalAndPositional_expression() {
+    // (p1, [p2 = 0]) -> 0
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p1 = AstFactory.simpleFormalParameter3("p1");
+    _setType(p1, dynamicType);
+    FormalParameter p2 = AstFactory.positionalFormalParameter(
+        AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(
+        AstFactory.formalParameterList([p1, p2]),
+        AstFactory.expressionFunctionBody(_resolvedInteger(0)));
+    _analyze5(p1);
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(_typeProvider.intType, <DartType>[dynamicType],
+        <DartType>[dynamicType], null, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_positional_block() {
+    // ([p1 = 0, p2 = 0]) {}
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p1 = AstFactory.positionalFormalParameter(
+        AstFactory.simpleFormalParameter3("p1"), _resolvedInteger(0));
+    _setType(p1, dynamicType);
+    FormalParameter p2 = AstFactory.positionalFormalParameter(
+        AstFactory.simpleFormalParameter3("p2"), _resolvedInteger(0));
+    _setType(p2, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(
+        AstFactory.formalParameterList([p1, p2]),
+        AstFactory.blockFunctionBody2());
+    _analyze5(p1);
+    _analyze5(p2);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(dynamicType, null, <DartType>[dynamicType, dynamicType],
+        null, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionExpression_positional_expression() {
+    // ([p1 = 0, p2 = 0]) -> 0
+    DartType dynamicType = _typeProvider.dynamicType;
+    FormalParameter p = AstFactory.positionalFormalParameter(
+        AstFactory.simpleFormalParameter3("p"), _resolvedInteger(0));
+    _setType(p, dynamicType);
+    FunctionExpression node = _resolvedFunctionExpression(
+        AstFactory.formalParameterList([p]),
+        AstFactory.expressionFunctionBody(_resolvedInteger(0)));
+    _analyze5(p);
+    DartType resultType = _analyze(node);
+    _assertFunctionType(
+        _typeProvider.intType, null, <DartType>[dynamicType], null, resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitIndexExpression_getter() {
+    // List a;
+    // a[2]
+    InterfaceType listType = _typeProvider.listType;
+    SimpleIdentifier identifier = _resolvedVariable(listType, "a");
+    IndexExpression node =
+        AstFactory.indexExpression(identifier, _resolvedInteger(2));
+    MethodElement indexMethod = listType.element.methods[0];
+    node.staticElement = indexMethod;
+    expect(_analyze(node), same(listType.typeArguments[0]));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitIndexExpression_setter() {
+    // List a;
+    // a[2] = 0
+    InterfaceType listType = _typeProvider.listType;
+    SimpleIdentifier identifier = _resolvedVariable(listType, "a");
+    IndexExpression node =
+        AstFactory.indexExpression(identifier, _resolvedInteger(2));
+    MethodElement indexMethod = listType.element.methods[1];
+    node.staticElement = indexMethod;
+    AstFactory.assignmentExpression(node, TokenType.EQ, AstFactory.integer(0));
+    expect(_analyze(node), same(listType.typeArguments[0]));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitIndexExpression_typeParameters() {
+    // List<int> list = ...
+    // list[0]
+    InterfaceType intType = _typeProvider.intType;
+    InterfaceType listType = _typeProvider.listType;
+    // (int) -> E
+    MethodElement methodElement = getMethod(listType, "[]");
+    // "list" has type List<int>
+    SimpleIdentifier identifier = AstFactory.identifier3("list");
+    InterfaceType listOfIntType = listType.substitute4(<DartType>[intType]);
+    identifier.staticType = listOfIntType;
+    // list[0] has MethodElement element (int) -> E
+    IndexExpression indexExpression =
+        AstFactory.indexExpression(identifier, AstFactory.integer(0));
+    MethodElement indexMethod = MethodMember.from(methodElement, listOfIntType);
+    indexExpression.staticElement = indexMethod;
+    // analyze and assert result of the index expression
+    expect(_analyze(indexExpression), same(intType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitIndexExpression_typeParameters_inSetterContext() {
+    // List<int> list = ...
+    // list[0] = 0;
+    InterfaceType intType = _typeProvider.intType;
+    InterfaceType listType = _typeProvider.listType;
+    // (int, E) -> void
+    MethodElement methodElement = getMethod(listType, "[]=");
+    // "list" has type List<int>
+    SimpleIdentifier identifier = AstFactory.identifier3("list");
+    InterfaceType listOfIntType = listType.substitute4(<DartType>[intType]);
+    identifier.staticType = listOfIntType;
+    // list[0] has MethodElement element (int) -> E
+    IndexExpression indexExpression =
+        AstFactory.indexExpression(identifier, AstFactory.integer(0));
+    MethodElement indexMethod = MethodMember.from(methodElement, listOfIntType);
+    indexExpression.staticElement = indexMethod;
+    // list[0] should be in a setter context
+    AstFactory.assignmentExpression(
+        indexExpression, TokenType.EQ, AstFactory.integer(0));
+    // analyze and assert result of the index expression
+    expect(_analyze(indexExpression), same(intType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitInstanceCreationExpression_named() {
+    // new C.m()
+    ClassElementImpl classElement = ElementFactory.classElement2("C");
+    String constructorName = "m";
+    ConstructorElementImpl constructor =
+        ElementFactory.constructorElement2(classElement, constructorName);
+    constructor.returnType = classElement.type;
+    FunctionTypeImpl constructorType = new FunctionTypeImpl(constructor);
+    constructor.type = constructorType;
+    classElement.constructors = <ConstructorElement>[constructor];
+    InstanceCreationExpression node = AstFactory.instanceCreationExpression2(
+        null,
+        AstFactory.typeName(classElement),
+        [AstFactory.identifier3(constructorName)]);
+    node.staticElement = constructor;
+    expect(_analyze(node), same(classElement.type));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitInstanceCreationExpression_typeParameters() {
+    // new C<I>()
+    ClassElementImpl elementC = ElementFactory.classElement2("C", ["E"]);
+    ClassElementImpl elementI = ElementFactory.classElement2("I");
+    ConstructorElementImpl constructor =
+        ElementFactory.constructorElement2(elementC, null);
+    elementC.constructors = <ConstructorElement>[constructor];
+    constructor.returnType = elementC.type;
+    FunctionTypeImpl constructorType = new FunctionTypeImpl(constructor);
+    constructor.type = constructorType;
+    TypeName typeName =
+        AstFactory.typeName(elementC, [AstFactory.typeName(elementI)]);
+    typeName.type = elementC.type.substitute4(<DartType>[elementI.type]);
+    InstanceCreationExpression node =
+        AstFactory.instanceCreationExpression2(null, typeName);
+    node.staticElement = constructor;
+    InterfaceType interfaceType = _analyze(node) as InterfaceType;
+    List<DartType> typeArgs = interfaceType.typeArguments;
+    expect(typeArgs.length, 1);
+    expect(typeArgs[0], elementI.type);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitInstanceCreationExpression_unnamed() {
+    // new C()
+    ClassElementImpl classElement = ElementFactory.classElement2("C");
+    ConstructorElementImpl constructor =
+        ElementFactory.constructorElement2(classElement, null);
+    constructor.returnType = classElement.type;
+    FunctionTypeImpl constructorType = new FunctionTypeImpl(constructor);
+    constructor.type = constructorType;
+    classElement.constructors = <ConstructorElement>[constructor];
+    InstanceCreationExpression node = AstFactory.instanceCreationExpression2(
+        null, AstFactory.typeName(classElement));
+    node.staticElement = constructor;
+    expect(_analyze(node), same(classElement.type));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitIntegerLiteral() {
+    // 42
+    Expression node = _resolvedInteger(42);
+    expect(_analyze(node), same(_typeProvider.intType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitIsExpression_negated() {
+    // a is! String
+    Expression node = AstFactory.isExpression(
+        _resolvedString("a"), true, AstFactory.typeName4("String"));
+    expect(_analyze(node), same(_typeProvider.boolType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitIsExpression_notNegated() {
+    // a is String
+    Expression node = AstFactory.isExpression(
+        _resolvedString("a"), false, AstFactory.typeName4("String"));
+    expect(_analyze(node), same(_typeProvider.boolType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitListLiteral_empty() {
+    // []
+    Expression node = AstFactory.listLiteral();
+    DartType resultType = _analyze(node);
+    _assertType2(
+        _typeProvider.listType
+            .substitute4(<DartType>[_typeProvider.dynamicType]),
+        resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitListLiteral_nonEmpty() {
+    // [0]
+    Expression node = AstFactory.listLiteral([_resolvedInteger(0)]);
+    DartType resultType = _analyze(node);
+    _assertType2(
+        _typeProvider.listType
+            .substitute4(<DartType>[_typeProvider.dynamicType]),
+        resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitMapLiteral_empty() {
+    // {}
+    Expression node = AstFactory.mapLiteral2();
+    DartType resultType = _analyze(node);
+    _assertType2(
+        _typeProvider.mapType.substitute4(
+            <DartType>[_typeProvider.dynamicType, _typeProvider.dynamicType]),
+        resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitMapLiteral_nonEmpty() {
+    // {"k" : 0}
+    Expression node = AstFactory
+        .mapLiteral2([AstFactory.mapLiteralEntry("k", _resolvedInteger(0))]);
+    DartType resultType = _analyze(node);
+    _assertType2(
+        _typeProvider.mapType.substitute4(
+            <DartType>[_typeProvider.dynamicType, _typeProvider.dynamicType]),
+        resultType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitMethodInvocation_then() {
+    // then()
+    Expression node = AstFactory.methodInvocation(null, "then");
+    _analyze(node);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitNamedExpression() {
+    // n: a
+    Expression node = AstFactory.namedExpression2("n", _resolvedString("a"));
+    expect(_analyze(node), same(_typeProvider.stringType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitNullLiteral() {
+    // null
+    Expression node = AstFactory.nullLiteral();
+    expect(_analyze(node), same(_typeProvider.bottomType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitParenthesizedExpression() {
+    // (0)
+    Expression node = AstFactory.parenthesizedExpression(_resolvedInteger(0));
+    expect(_analyze(node), same(_typeProvider.intType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPostfixExpression_minusMinus() {
+    // 0--
+    PostfixExpression node = AstFactory.postfixExpression(
+        _resolvedInteger(0), TokenType.MINUS_MINUS);
+    expect(_analyze(node), same(_typeProvider.intType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPostfixExpression_plusPlus() {
+    // 0++
+    PostfixExpression node =
+        AstFactory.postfixExpression(_resolvedInteger(0), TokenType.PLUS_PLUS);
+    expect(_analyze(node), same(_typeProvider.intType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixedIdentifier_getter() {
+    DartType boolType = _typeProvider.boolType;
+    PropertyAccessorElementImpl getter =
+        ElementFactory.getterElement("b", false, boolType);
+    PrefixedIdentifier node = AstFactory.identifier5("a", "b");
+    node.identifier.staticElement = getter;
+    expect(_analyze(node), same(boolType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixedIdentifier_setter() {
+    DartType boolType = _typeProvider.boolType;
+    FieldElementImpl field =
+        ElementFactory.fieldElement("b", false, false, false, boolType);
+    PropertyAccessorElement setter = field.setter;
+    PrefixedIdentifier node = AstFactory.identifier5("a", "b");
+    node.identifier.staticElement = setter;
+    expect(_analyze(node), same(boolType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixedIdentifier_variable() {
+    VariableElementImpl variable = ElementFactory.localVariableElement2("b");
+    variable.type = _typeProvider.boolType;
+    PrefixedIdentifier node = AstFactory.identifier5("a", "b");
+    node.identifier.staticElement = variable;
+    expect(_analyze(node), same(_typeProvider.boolType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixExpression_bang() {
+    // !0
+    PrefixExpression node =
+        AstFactory.prefixExpression(TokenType.BANG, _resolvedInteger(0));
+    expect(_analyze(node), same(_typeProvider.boolType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixExpression_minus() {
+    // -0
+    PrefixExpression node =
+        AstFactory.prefixExpression(TokenType.MINUS, _resolvedInteger(0));
+    MethodElement minusMethod = getMethod(_typeProvider.numType, "-");
+    node.staticElement = minusMethod;
+    expect(_analyze(node), same(_typeProvider.numType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixExpression_minusMinus() {
+    // --0
+    PrefixExpression node =
+        AstFactory.prefixExpression(TokenType.MINUS_MINUS, _resolvedInteger(0));
+    MethodElement minusMethod = getMethod(_typeProvider.numType, "-");
+    node.staticElement = minusMethod;
+    expect(_analyze(node), same(_typeProvider.intType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixExpression_not() {
+    // !true
+    Expression node = AstFactory.prefixExpression(
+        TokenType.BANG, AstFactory.booleanLiteral(true));
+    expect(_analyze(node), same(_typeProvider.boolType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixExpression_plusPlus() {
+    // ++0
+    PrefixExpression node =
+        AstFactory.prefixExpression(TokenType.PLUS_PLUS, _resolvedInteger(0));
+    MethodElement plusMethod = getMethod(_typeProvider.numType, "+");
+    node.staticElement = plusMethod;
+    expect(_analyze(node), same(_typeProvider.intType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPrefixExpression_tilde() {
+    // ~0
+    PrefixExpression node =
+        AstFactory.prefixExpression(TokenType.TILDE, _resolvedInteger(0));
+    MethodElement tildeMethod = getMethod(_typeProvider.intType, "~");
+    node.staticElement = tildeMethod;
+    expect(_analyze(node), same(_typeProvider.intType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPropertyAccess_propagated_getter() {
+    DartType boolType = _typeProvider.boolType;
+    PropertyAccessorElementImpl getter =
+        ElementFactory.getterElement("b", false, boolType);
+    PropertyAccess node =
+        AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
+    node.propertyName.propagatedElement = getter;
+    expect(_analyze2(node, false), same(boolType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPropertyAccess_propagated_setter() {
+    DartType boolType = _typeProvider.boolType;
+    FieldElementImpl field =
+        ElementFactory.fieldElement("b", false, false, false, boolType);
+    PropertyAccessorElement setter = field.setter;
+    PropertyAccess node =
+        AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
+    node.propertyName.propagatedElement = setter;
+    expect(_analyze2(node, false), same(boolType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPropertyAccess_static_getter() {
+    DartType boolType = _typeProvider.boolType;
+    PropertyAccessorElementImpl getter =
+        ElementFactory.getterElement("b", false, boolType);
+    PropertyAccess node =
+        AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
+    node.propertyName.staticElement = getter;
+    expect(_analyze(node), same(boolType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitPropertyAccess_static_setter() {
+    DartType boolType = _typeProvider.boolType;
+    FieldElementImpl field =
+        ElementFactory.fieldElement("b", false, false, false, boolType);
+    PropertyAccessorElement setter = field.setter;
+    PropertyAccess node =
+        AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
+    node.propertyName.staticElement = setter;
+    expect(_analyze(node), same(boolType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSimpleIdentifier_dynamic() {
+    // "dynamic"
+    SimpleIdentifier identifier = AstFactory.identifier3('dynamic');
+    DynamicElementImpl element = DynamicElementImpl.instance;
+    identifier.staticElement = element;
+    identifier.staticType = _typeProvider.typeType;
+    expect(_analyze(identifier), same(_typeProvider.typeType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSimpleStringLiteral() {
+    // "a"
+    Expression node = _resolvedString("a");
+    expect(_analyze(node), same(_typeProvider.stringType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitStringInterpolation() {
+    // "a${'b'}c"
+    Expression node = AstFactory.string([
+      AstFactory.interpolationString("a", "a"),
+      AstFactory.interpolationExpression(_resolvedString("b")),
+      AstFactory.interpolationString("c", "c")
+    ]);
+    expect(_analyze(node), same(_typeProvider.stringType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSuperExpression() {
+    // super
+    InterfaceType superType = ElementFactory.classElement2("A").type;
+    InterfaceType thisType = ElementFactory.classElement("B", superType).type;
+    Expression node = AstFactory.superExpression();
+    expect(_analyze3(node, thisType), same(thisType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSymbolLiteral() {
+    expect(_analyze(AstFactory.symbolLiteral(["a"])),
+        same(_typeProvider.symbolType));
+  }
+
+  void test_visitThisExpression() {
+    // this
+    InterfaceType thisType = ElementFactory
+        .classElement("B", ElementFactory.classElement2("A").type)
+        .type;
+    Expression node = AstFactory.thisExpression();
+    expect(_analyze3(node, thisType), same(thisType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitThrowExpression_withoutValue() {
+    // throw
+    Expression node = AstFactory.throwExpression();
+    expect(_analyze(node), same(_typeProvider.bottomType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitThrowExpression_withValue() {
+    // throw 0
+    Expression node = AstFactory.throwExpression2(_resolvedInteger(0));
+    expect(_analyze(node), same(_typeProvider.bottomType));
+    _listener.assertNoErrors();
+  }
+
+  /**
+   * Return the type associated with the given expression after the static type analyzer has
+   * computed a type for it.
+   *
+   * @param node the expression with which the type is associated
+   * @return the type associated with the expression
+   */
+  DartType _analyze(Expression node) => _analyze4(node, null, true);
+
+  /**
+   * Return the type associated with the given expression after the static or propagated type
+   * analyzer has computed a type for it.
+   *
+   * @param node the expression with which the type is associated
+   * @param useStaticType `true` if the static type is being requested, and `false` if
+   *          the propagated type is being requested
+   * @return the type associated with the expression
+   */
+  DartType _analyze2(Expression node, bool useStaticType) =>
+      _analyze4(node, null, useStaticType);
+
+  /**
+   * Return the type associated with the given expression after the static type analyzer has
+   * computed a type for it.
+   *
+   * @param node the expression with which the type is associated
+   * @param thisType the type of 'this'
+   * @return the type associated with the expression
+   */
+  DartType _analyze3(Expression node, InterfaceType thisType) =>
+      _analyze4(node, thisType, true);
+
+  /**
+   * Return the type associated with the given expression after the static type analyzer has
+   * computed a type for it.
+   *
+   * @param node the expression with which the type is associated
+   * @param thisType the type of 'this'
+   * @param useStaticType `true` if the static type is being requested, and `false` if
+   *          the propagated type is being requested
+   * @return the type associated with the expression
+   */
+  DartType _analyze4(
+      Expression node, InterfaceType thisType, bool useStaticType) {
+    try {
+      _analyzer.thisType = thisType;
+    } catch (exception) {
+      throw new IllegalArgumentException(
+          "Could not set type of 'this'", exception);
+    }
+    node.accept(_analyzer);
+    if (useStaticType) {
+      return node.staticType;
+    } else {
+      return node.propagatedType;
+    }
+  }
+
+  /**
+   * Return the type associated with the given parameter after the static type analyzer has computed
+   * a type for it.
+   *
+   * @param node the parameter with which the type is associated
+   * @return the type associated with the parameter
+   */
+  DartType _analyze5(FormalParameter node) {
+    node.accept(_analyzer);
+    return (node.identifier.staticElement as ParameterElement).type;
+  }
+
+  /**
+   * Assert that the actual type is a function type with the expected characteristics.
+   *
+   * @param expectedReturnType the expected return type of the function
+   * @param expectedNormalTypes the expected types of the normal parameters
+   * @param expectedOptionalTypes the expected types of the optional parameters
+   * @param expectedNamedTypes the expected types of the named parameters
+   * @param actualType the type being tested
+   */
+  void _assertFunctionType(
+      DartType expectedReturnType,
+      List<DartType> expectedNormalTypes,
+      List<DartType> expectedOptionalTypes,
+      Map<String, DartType> expectedNamedTypes,
+      DartType actualType) {
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is FunctionType, FunctionType, actualType);
+    FunctionType functionType = actualType as FunctionType;
+    List<DartType> normalTypes = functionType.normalParameterTypes;
+    if (expectedNormalTypes == null) {
+      expect(normalTypes, hasLength(0));
+    } else {
+      int expectedCount = expectedNormalTypes.length;
+      expect(normalTypes, hasLength(expectedCount));
+      for (int i = 0; i < expectedCount; i++) {
+        expect(normalTypes[i], same(expectedNormalTypes[i]));
+      }
+    }
+    List<DartType> optionalTypes = functionType.optionalParameterTypes;
+    if (expectedOptionalTypes == null) {
+      expect(optionalTypes, hasLength(0));
+    } else {
+      int expectedCount = expectedOptionalTypes.length;
+      expect(optionalTypes, hasLength(expectedCount));
+      for (int i = 0; i < expectedCount; i++) {
+        expect(optionalTypes[i], same(expectedOptionalTypes[i]));
+      }
+    }
+    Map<String, DartType> namedTypes = functionType.namedParameterTypes;
+    if (expectedNamedTypes == null) {
+      expect(namedTypes, hasLength(0));
+    } else {
+      expect(namedTypes, hasLength(expectedNamedTypes.length));
+      expectedNamedTypes.forEach((String name, DartType type) {
+        expect(namedTypes[name], same(type));
+      });
+    }
+    expect(functionType.returnType, equals(expectedReturnType));
+  }
+
+  void _assertType(
+      InterfaceTypeImpl expectedType, InterfaceTypeImpl actualType) {
+    expect(actualType.displayName, expectedType.displayName);
+    expect(actualType.element, expectedType.element);
+    List<DartType> expectedArguments = expectedType.typeArguments;
+    int length = expectedArguments.length;
+    List<DartType> actualArguments = actualType.typeArguments;
+    expect(actualArguments, hasLength(length));
+    for (int i = 0; i < length; i++) {
+      _assertType2(expectedArguments[i], actualArguments[i]);
+    }
+  }
+
+  void _assertType2(DartType expectedType, DartType actualType) {
+    if (expectedType is InterfaceTypeImpl) {
+      EngineTestCase.assertInstanceOf(
+          (obj) => obj is InterfaceTypeImpl, InterfaceTypeImpl, actualType);
+      _assertType(expectedType, actualType as InterfaceTypeImpl);
+    }
+    // TODO(brianwilkerson) Compare other kinds of types then make this a shared
+    // utility method.
+  }
+
+  /**
+   * Create the analyzer used by the tests.
+   *
+   * @return the analyzer to be used by the tests
+   */
+  StaticTypeAnalyzer _createAnalyzer() {
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    FileBasedSource source =
+        new FileBasedSource(FileUtilities2.createFile("/lib.dart"));
+    CompilationUnitElementImpl definingCompilationUnit =
+        new CompilationUnitElementImpl("lib.dart");
+    definingCompilationUnit.librarySource =
+        definingCompilationUnit.source = source;
+    LibraryElementImpl definingLibrary =
+        new LibraryElementImpl.forNode(context, null);
+    definingLibrary.definingCompilationUnit = definingCompilationUnit;
+    Library library = new Library(context, _listener, source);
+    library.libraryElement = definingLibrary;
+    _visitor = new ResolverVisitor(
+        library.libraryElement, source, _typeProvider, library.errorListener,
+        nameScope: library.libraryScope,
+        inheritanceManager: library.inheritanceManager);
+    _visitor.overrideManager.enterScope();
+    try {
+      return _visitor.typeAnalyzer;
+    } catch (exception) {
+      throw new IllegalArgumentException(
+          "Could not create analyzer", exception);
+    }
+  }
+
+  DartType _flatten(DartType type) =>
+      StaticTypeAnalyzer.flattenFutures(_typeProvider, type);
+
+  /**
+   * Return a simple identifier that has been resolved to a variable element with the given type.
+   *
+   * @param type the type of the variable being represented
+   * @param variableName the name of the variable
+   * @return a simple identifier that has been resolved to a variable element with the given type
+   */
+  SimpleIdentifier _propagatedVariable(
+      InterfaceType type, String variableName) {
+    SimpleIdentifier identifier = AstFactory.identifier3(variableName);
+    VariableElementImpl element =
+        ElementFactory.localVariableElement(identifier);
+    element.type = type;
+    identifier.staticType = _typeProvider.dynamicType;
+    identifier.propagatedElement = element;
+    identifier.propagatedType = type;
+    return identifier;
+  }
+
+  /**
+   * Return an integer literal that has been resolved to the correct type.
+   *
+   * @param value the value of the literal
+   * @return an integer literal that has been resolved to the correct type
+   */
+  DoubleLiteral _resolvedDouble(double value) {
+    DoubleLiteral literal = AstFactory.doubleLiteral(value);
+    literal.staticType = _typeProvider.doubleType;
+    return literal;
+  }
+
+  /**
+   * Create a function expression that has an element associated with it, where the element has an
+   * incomplete type associated with it (just like the one
+   * [ElementBuilder.visitFunctionExpression] would have built if we had
+   * run it).
+   *
+   * @param parameters the parameters to the function
+   * @param body the body of the function
+   * @return a resolved function expression
+   */
+  FunctionExpression _resolvedFunctionExpression(
+      FormalParameterList parameters, FunctionBody body) {
+    List<ParameterElement> parameterElements = new List<ParameterElement>();
+    for (FormalParameter parameter in parameters.parameters) {
+      ParameterElementImpl element =
+          new ParameterElementImpl.forNode(parameter.identifier);
+      element.parameterKind = parameter.kind;
+      element.type = _typeProvider.dynamicType;
+      parameter.identifier.staticElement = element;
+      parameterElements.add(element);
+    }
+    FunctionExpression node = AstFactory.functionExpression2(parameters, body);
+    FunctionElementImpl element = new FunctionElementImpl.forNode(null);
+    element.parameters = parameterElements;
+    element.type = new FunctionTypeImpl(element);
+    node.element = element;
+    return node;
+  }
+
+  /**
+   * Return an integer literal that has been resolved to the correct type.
+   *
+   * @param value the value of the literal
+   * @return an integer literal that has been resolved to the correct type
+   */
+  IntegerLiteral _resolvedInteger(int value) {
+    IntegerLiteral literal = AstFactory.integer(value);
+    literal.staticType = _typeProvider.intType;
+    return literal;
+  }
+
+  /**
+   * Return a string literal that has been resolved to the correct type.
+   *
+   * @param value the value of the literal
+   * @return a string literal that has been resolved to the correct type
+   */
+  SimpleStringLiteral _resolvedString(String value) {
+    SimpleStringLiteral string = AstFactory.string2(value);
+    string.staticType = _typeProvider.stringType;
+    return string;
+  }
+
+  /**
+   * Return a simple identifier that has been resolved to a variable element with the given type.
+   *
+   * @param type the type of the variable being represented
+   * @param variableName the name of the variable
+   * @return a simple identifier that has been resolved to a variable element with the given type
+   */
+  SimpleIdentifier _resolvedVariable(InterfaceType type, String variableName) {
+    SimpleIdentifier identifier = AstFactory.identifier3(variableName);
+    VariableElementImpl element =
+        ElementFactory.localVariableElement(identifier);
+    element.type = type;
+    identifier.staticElement = element;
+    identifier.staticType = type;
+    return identifier;
+  }
+
+  /**
+   * Set the type of the given parameter to the given type.
+   *
+   * @param parameter the parameter whose type is to be set
+   * @param type the new type of the given parameter
+   */
+  void _setType(FormalParameter parameter, DartType type) {
+    SimpleIdentifier identifier = parameter.identifier;
+    Element element = identifier.staticElement;
+    if (element is! ParameterElement) {
+      element = new ParameterElementImpl.forNode(identifier);
+      identifier.staticElement = element;
+    }
+    (element as ParameterElementImpl).type = type;
+  }
+}
+
+/**
+ * Instances of the class `StaticTypeVerifier` verify that all of the nodes in an AST
+ * structure that should have a static type associated with them do have a static type.
+ */
+class StaticTypeVerifier extends GeneralizingAstVisitor<Object> {
+  /**
+   * A list containing all of the AST Expression nodes that were not resolved.
+   */
+  List<Expression> _unresolvedExpressions = new List<Expression>();
+
+  /**
+   * A list containing all of the AST Expression nodes for which a propagated type was computed but
+   * where that type was not more specific than the static type.
+   */
+  List<Expression> _invalidlyPropagatedExpressions = new List<Expression>();
+
+  /**
+   * A list containing all of the AST TypeName nodes that were not resolved.
+   */
+  List<TypeName> _unresolvedTypes = new List<TypeName>();
+
+  /**
+   * Counter for the number of Expression nodes visited that are resolved.
+   */
+  int _resolvedExpressionCount = 0;
+
+  /**
+   * Counter for the number of Expression nodes visited that have propagated type information.
+   */
+  int _propagatedExpressionCount = 0;
+
+  /**
+   * Counter for the number of TypeName nodes visited that are resolved.
+   */
+  int _resolvedTypeCount = 0;
+
+  /**
+   * Assert that all of the visited nodes have a static type associated with them.
+   */
+  void assertResolved() {
+    if (!_unresolvedExpressions.isEmpty || !_unresolvedTypes.isEmpty) {
+      StringBuffer buffer = new StringBuffer();
+      int unresolvedTypeCount = _unresolvedTypes.length;
+      if (unresolvedTypeCount > 0) {
+        buffer.write("Failed to resolve ");
+        buffer.write(unresolvedTypeCount);
+        buffer.write(" of ");
+        buffer.write(_resolvedTypeCount + unresolvedTypeCount);
+        buffer.writeln(" type names:");
+        for (TypeName identifier in _unresolvedTypes) {
+          buffer.write("  ");
+          buffer.write(identifier.toString());
+          buffer.write(" (");
+          buffer.write(_getFileName(identifier));
+          buffer.write(" : ");
+          buffer.write(identifier.offset);
+          buffer.writeln(")");
+        }
+      }
+      int unresolvedExpressionCount = _unresolvedExpressions.length;
+      if (unresolvedExpressionCount > 0) {
+        buffer.writeln("Failed to resolve ");
+        buffer.write(unresolvedExpressionCount);
+        buffer.write(" of ");
+        buffer.write(_resolvedExpressionCount + unresolvedExpressionCount);
+        buffer.writeln(" expressions:");
+        for (Expression expression in _unresolvedExpressions) {
+          buffer.write("  ");
+          buffer.write(expression.toString());
+          buffer.write(" (");
+          buffer.write(_getFileName(expression));
+          buffer.write(" : ");
+          buffer.write(expression.offset);
+          buffer.writeln(")");
+        }
+      }
+      int invalidlyPropagatedExpressionCount =
+          _invalidlyPropagatedExpressions.length;
+      if (invalidlyPropagatedExpressionCount > 0) {
+        buffer.writeln("Incorrectly propagated ");
+        buffer.write(invalidlyPropagatedExpressionCount);
+        buffer.write(" of ");
+        buffer.write(_propagatedExpressionCount);
+        buffer.writeln(" expressions:");
+        for (Expression expression in _invalidlyPropagatedExpressions) {
+          buffer.write("  ");
+          buffer.write(expression.toString());
+          buffer.write(" [");
+          buffer.write(expression.staticType.displayName);
+          buffer.write(", ");
+          buffer.write(expression.propagatedType.displayName);
+          buffer.writeln("]");
+          buffer.write("    ");
+          buffer.write(_getFileName(expression));
+          buffer.write(" : ");
+          buffer.write(expression.offset);
+          buffer.writeln(")");
+        }
+      }
+      fail(buffer.toString());
+    }
+  }
+
+  @override
+  Object visitBreakStatement(BreakStatement node) => null;
+
+  @override
+  Object visitCommentReference(CommentReference node) => null;
+
+  @override
+  Object visitContinueStatement(ContinueStatement node) => null;
+
+  @override
+  Object visitExportDirective(ExportDirective node) => null;
+
+  @override
+  Object visitExpression(Expression node) {
+    node.visitChildren(this);
+    DartType staticType = node.staticType;
+    if (staticType == null) {
+      _unresolvedExpressions.add(node);
+    } else {
+      _resolvedExpressionCount++;
+      DartType propagatedType = node.propagatedType;
+      if (propagatedType != null) {
+        _propagatedExpressionCount++;
+        if (!propagatedType.isMoreSpecificThan(staticType)) {
+          _invalidlyPropagatedExpressions.add(node);
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitImportDirective(ImportDirective node) => null;
+
+  @override
+  Object visitLabel(Label node) => null;
+
+  @override
+  Object visitLibraryIdentifier(LibraryIdentifier node) => null;
+
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    // In cases where we have a prefixed identifier where the prefix is dynamic,
+    // we don't want to assert that the node will have a type.
+    if (node.staticType == null && node.prefix.staticType.isDynamic) {
+      return null;
+    }
+    return super.visitPrefixedIdentifier(node);
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    // In cases where identifiers are being used for something other than an
+    // expressions, then they can be ignored.
+    AstNode parent = node.parent;
+    if (parent is MethodInvocation && identical(node, parent.methodName)) {
+      return null;
+    } else if (parent is RedirectingConstructorInvocation &&
+        identical(node, parent.constructorName)) {
+      return null;
+    } else if (parent is SuperConstructorInvocation &&
+        identical(node, parent.constructorName)) {
+      return null;
+    } else if (parent is ConstructorName && identical(node, parent.name)) {
+      return null;
+    } else if (parent is ConstructorFieldInitializer &&
+        identical(node, parent.fieldName)) {
+      return null;
+    } else if (node.staticElement is PrefixElement) {
+      // Prefixes don't have a type.
+      return null;
+    }
+    return super.visitSimpleIdentifier(node);
+  }
+
+  @override
+  Object visitTypeName(TypeName node) {
+    // Note: do not visit children from this node, the child SimpleIdentifier in
+    // TypeName (i.e. "String") does not have a static type defined.
+    if (node.type == null) {
+      _unresolvedTypes.add(node);
+    } else {
+      _resolvedTypeCount++;
+    }
+    return null;
+  }
+
+  String _getFileName(AstNode node) {
+    // TODO (jwren) there are two copies of this method, one here and one in
+    // ResolutionVerifier, they should be resolved into a single method
+    if (node != null) {
+      AstNode root = node.root;
+      if (root is CompilationUnit) {
+        CompilationUnit rootCU = root;
+        if (rootCU.element != null) {
+          return rootCU.element.source.fullName;
+        } else {
+          return "<unknown file- CompilationUnit.getElement() returned null>";
+        }
+      } else {
+        return "<unknown file- CompilationUnit.getRoot() is not a CompilationUnit>";
+      }
+    }
+    return "<unknown file- ASTNode is null>";
+  }
+}
+
+/**
+ * The class `StrictModeTest` contains tests to ensure that the correct errors and warnings
+ * are reported when the analysis engine is run in strict mode.
+ */
+@reflectiveTest
+class StrictModeTest extends ResolverTestCase {
+  void fail_for() {
+    Source source = addSource(r'''
+int f(List<int> list) {
+  num sum = 0;
+  for (num i = 0; i < list.length; i++) {
+    sum += list[i];
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  @override
+  void setUp() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.hint = false;
+    resetWithOptions(options);
+  }
+
+  void test_assert_is() {
+    Source source = addSource(r'''
+int f(num n) {
+  assert (n is int);
+  return n & 0x0F;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_conditional_and_is() {
+    Source source = addSource(r'''
+int f(num n) {
+  return (n is int && n > 0) ? n & 0x0F : 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_conditional_is() {
+    Source source = addSource(r'''
+int f(num n) {
+  return (n is int) ? n & 0x0F : 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_conditional_isNot() {
+    Source source = addSource(r'''
+int f(num n) {
+  return (n is! int) ? 0 : n & 0x0F;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_conditional_or_is() {
+    Source source = addSource(r'''
+int f(num n) {
+  return (n is! int || n < 0) ? 0 : n & 0x0F;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_forEach() {
+    Source source = addSource(r'''
+int f(List<int> list) {
+  num sum = 0;
+  for (num n in list) {
+    sum += n & 0x0F;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_if_and_is() {
+    Source source = addSource(r'''
+int f(num n) {
+  if (n is int && n > 0) {
+    return n & 0x0F;
+  }
+  return 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_if_is() {
+    Source source = addSource(r'''
+int f(num n) {
+  if (n is int) {
+    return n & 0x0F;
+  }
+  return 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_if_isNot() {
+    Source source = addSource(r'''
+int f(num n) {
+  if (n is! int) {
+    return 0;
+  } else {
+    return n & 0x0F;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_if_isNot_abrupt() {
+    Source source = addSource(r'''
+int f(num n) {
+  if (n is! int) {
+    return 0;
+  }
+  return n & 0x0F;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_if_or_is() {
+    Source source = addSource(r'''
+int f(num n) {
+  if (n is! int || n < 0) {
+    return 0;
+  } else {
+    return n & 0x0F;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_localVar() {
+    Source source = addSource(r'''
+int f() {
+  num n = 1234;
+  return n & 0x0F;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+}
+
+@reflectiveTest
+class SubtypeManagerTest extends EngineTestCase {
+  /**
+   * The inheritance manager being tested.
+   */
+  SubtypeManager _subtypeManager;
+
+  /**
+   * The compilation unit element containing all of the types setup in each test.
+   */
+  CompilationUnitElementImpl _definingCompilationUnit;
+
+  @override
+  void setUp() {
+    super.setUp();
+    AnalysisContext context = AnalysisContextFactory.contextWithCore();
+    FileBasedSource source =
+        new FileBasedSource(FileUtilities2.createFile("/test.dart"));
+    _definingCompilationUnit = new CompilationUnitElementImpl("test.dart");
+    _definingCompilationUnit.librarySource =
+        _definingCompilationUnit.source = source;
+    LibraryElementImpl definingLibrary =
+        ElementFactory.library(context, "test");
+    definingLibrary.definingCompilationUnit = _definingCompilationUnit;
+    _subtypeManager = new SubtypeManager();
+  }
+
+  void test_computeAllSubtypes_infiniteLoop() {
+    //
+    // class A extends B
+    // class B extends A
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    classA.supertype = classB.type;
+    _definingCompilationUnit.types = <ClassElement>[classA, classB];
+    HashSet<ClassElement> subtypesOfA =
+        _subtypeManager.computeAllSubtypes(classA);
+    List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
+    expect(subtypesOfA, hasLength(2));
+    expect(arraySubtypesOfA, unorderedEquals([classA, classB]));
+  }
+
+  void test_computeAllSubtypes_manyRecursiveSubtypes() {
+    //
+    // class A
+    // class B extends A
+    // class C extends B
+    // class D extends B
+    // class E extends B
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classB.type);
+    ClassElementImpl classD = ElementFactory.classElement("D", classB.type);
+    ClassElementImpl classE = ElementFactory.classElement("E", classB.type);
+    _definingCompilationUnit.types = <ClassElement>[
+      classA,
+      classB,
+      classC,
+      classD,
+      classE
+    ];
+    HashSet<ClassElement> subtypesOfA =
+        _subtypeManager.computeAllSubtypes(classA);
+    List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
+    HashSet<ClassElement> subtypesOfB =
+        _subtypeManager.computeAllSubtypes(classB);
+    List<ClassElement> arraySubtypesOfB = new List.from(subtypesOfB);
+    expect(subtypesOfA, hasLength(4));
+    expect(arraySubtypesOfA, unorderedEquals([classB, classC, classD, classE]));
+    expect(subtypesOfB, hasLength(3));
+    expect(arraySubtypesOfB, unorderedEquals([classC, classD, classE]));
+  }
+
+  void test_computeAllSubtypes_noSubtypes() {
+    //
+    // class A
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    _definingCompilationUnit.types = <ClassElement>[classA];
+    HashSet<ClassElement> subtypesOfA =
+        _subtypeManager.computeAllSubtypes(classA);
+    expect(subtypesOfA, hasLength(0));
+  }
+
+  void test_computeAllSubtypes_oneSubtype() {
+    //
+    // class A
+    // class B extends A
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    _definingCompilationUnit.types = <ClassElement>[classA, classB];
+    HashSet<ClassElement> subtypesOfA =
+        _subtypeManager.computeAllSubtypes(classA);
+    List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
+    expect(subtypesOfA, hasLength(1));
+    expect(arraySubtypesOfA, unorderedEquals([classB]));
+  }
+}
+
+@reflectiveTest
+class TypeOverrideManagerTest extends EngineTestCase {
+  void test_exitScope_noScopes() {
+    TypeOverrideManager manager = new TypeOverrideManager();
+    try {
+      manager.exitScope();
+      fail("Expected IllegalStateException");
+    } on IllegalStateException {
+      // Expected
+    }
+  }
+
+  void test_exitScope_oneScope() {
+    TypeOverrideManager manager = new TypeOverrideManager();
+    manager.enterScope();
+    manager.exitScope();
+    try {
+      manager.exitScope();
+      fail("Expected IllegalStateException");
+    } on IllegalStateException {
+      // Expected
+    }
+  }
+
+  void test_exitScope_twoScopes() {
+    TypeOverrideManager manager = new TypeOverrideManager();
+    manager.enterScope();
+    manager.exitScope();
+    manager.enterScope();
+    manager.exitScope();
+    try {
+      manager.exitScope();
+      fail("Expected IllegalStateException");
+    } on IllegalStateException {
+      // Expected
+    }
+  }
+
+  void test_getType_enclosedOverride() {
+    TypeOverrideManager manager = new TypeOverrideManager();
+    LocalVariableElementImpl element =
+        ElementFactory.localVariableElement2("v");
+    InterfaceType type = ElementFactory.classElement2("C").type;
+    manager.enterScope();
+    manager.setType(element, type);
+    manager.enterScope();
+    expect(manager.getType(element), same(type));
+  }
+
+  void test_getType_immediateOverride() {
+    TypeOverrideManager manager = new TypeOverrideManager();
+    LocalVariableElementImpl element =
+        ElementFactory.localVariableElement2("v");
+    InterfaceType type = ElementFactory.classElement2("C").type;
+    manager.enterScope();
+    manager.setType(element, type);
+    expect(manager.getType(element), same(type));
+  }
+
+  void test_getType_noOverride() {
+    TypeOverrideManager manager = new TypeOverrideManager();
+    manager.enterScope();
+    expect(manager.getType(ElementFactory.localVariableElement2("v")), isNull);
+  }
+
+  void test_getType_noScope() {
+    TypeOverrideManager manager = new TypeOverrideManager();
+    expect(manager.getType(ElementFactory.localVariableElement2("v")), isNull);
+  }
+}
+
+@reflectiveTest
+class TypePropagationTest extends ResolverTestCase {
+  void fail_finalPropertyInducingVariable_classMember_instance() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+class A {
+  final v = 0;
+}''');
+    String code = r'''
+import 'lib.dart';
+f(A a) {
+  return a.v; // marker
+}''';
+    _assertTypeOfMarkedExpression(
+        code, typeProvider.dynamicType, typeProvider.intType);
+  }
+
+  void fail_finalPropertyInducingVariable_classMember_instance_inherited() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+class A {
+  final v = 0;
+}''');
+    String code = r'''
+import 'lib.dart';
+class B extends A {
+  m() {
+    return v; // marker
+  }
+}''';
+    _assertTypeOfMarkedExpression(
+        code, typeProvider.dynamicType, typeProvider.intType);
+  }
+
+  void fail_finalPropertyInducingVariable_classMember_instance_propagatedTarget() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+class A {
+  final v = 0;
+}''');
+    String code = r'''
+import 'lib.dart';
+f(p) {
+  if (p is A) {
+    return p.v; // marker
+  }
+}''';
+    _assertTypeOfMarkedExpression(
+        code, typeProvider.dynamicType, typeProvider.intType);
+  }
+
+  void fail_finalPropertyInducingVariable_classMember_static() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+class A {
+  static final V = 0;
+}''');
+    String code = r'''
+import 'lib.dart';
+f() {
+  return A.V; // marker
+}''';
+    _assertTypeOfMarkedExpression(
+        code, typeProvider.dynamicType, typeProvider.intType);
+  }
+
+  void fail_finalPropertyInducingVariable_topLevelVaraible_prefixed() {
+    addNamedSource("/lib.dart", "final V = 0;");
+    String code = r'''
+import 'lib.dart' as p;
+f() {
+  var v2 = p.V; // marker prefixed
+}''';
+    _assertTypeOfMarkedExpression(
+        code, typeProvider.dynamicType, typeProvider.intType);
+  }
+
+  void fail_finalPropertyInducingVariable_topLevelVaraible_simple() {
+    addNamedSource("/lib.dart", "final V = 0;");
+    String code = r'''
+import 'lib.dart';
+f() {
+  return V; // marker simple
+}''';
+    _assertTypeOfMarkedExpression(
+        code, typeProvider.dynamicType, typeProvider.intType);
+  }
+
+  void fail_mergePropagatedTypesAtJoinPoint_1() {
+    // https://code.google.com/p/dart/issues/detail?id=19929
+    _assertTypeOfMarkedExpression(
+        r'''
+f1(x) {
+  var y = [];
+  if (x) {
+    y = 0;
+  } else {
+    y = '';
+  }
+  // Propagated type is [List] here: incorrect.
+  // Best we can do is [Object]?
+  return y; // marker
+}''',
+        null,
+        typeProvider.dynamicType);
+  }
+
+  void fail_mergePropagatedTypesAtJoinPoint_2() {
+    // https://code.google.com/p/dart/issues/detail?id=19929
+    _assertTypeOfMarkedExpression(
+        r'''
+f2(x) {
+  var y = [];
+  if (x) {
+    y = 0;
+  } else {
+  }
+  // Propagated type is [List] here: incorrect.
+  // Best we can do is [Object]?
+  return y; // marker
+}''',
+        null,
+        typeProvider.dynamicType);
+  }
+
+  void fail_mergePropagatedTypesAtJoinPoint_3() {
+    // https://code.google.com/p/dart/issues/detail?id=19929
+    _assertTypeOfMarkedExpression(
+        r'''
+f4(x) {
+  var y = [];
+  if (x) {
+    y = 0;
+  } else {
+    y = 1.5;
+  }
+  // Propagated type is [List] here: incorrect.
+  // A correct answer is the least upper bound of [int] and [double],
+  // i.e. [num].
+  return y; // marker
+}''',
+        null,
+        typeProvider.numType);
+  }
+
+  void fail_mergePropagatedTypesAtJoinPoint_5() {
+    // https://code.google.com/p/dart/issues/detail?id=19929
+    _assertTypeOfMarkedExpression(
+        r'''
+f6(x,y) {
+  var z = [];
+  if (x || (z = y) < 0) {
+  } else {
+    z = 0;
+  }
+  // Propagated type is [List] here: incorrect.
+  // Best we can do is [Object]?
+  return z; // marker
+}''',
+        null,
+        typeProvider.dynamicType);
+  }
+
+  void fail_mergePropagatedTypesAtJoinPoint_7() {
+    // https://code.google.com/p/dart/issues/detail?id=19929
+    //
+    // In general [continue]s are unsafe for the purposes of
+    // [isAbruptTerminationStatement].
+    //
+    // This is like example 6, but less tricky: the code in the branch that
+    // [continue]s is in effect after the [if].
+    String code = r'''
+f() {
+  var x = 0;
+  var c = false;
+  var d = true;
+  while (d) {
+    if (c) {
+      d = false;
+    } else {
+      x = '';
+      c = true;
+      continue;
+    }
+    x; // marker
+  }
+}''';
+    DartType t = _findMarkedIdentifier(code, "; // marker").propagatedType;
+    expect(typeProvider.intType.isSubtypeOf(t), isTrue);
+    expect(typeProvider.stringType.isSubtypeOf(t), isTrue);
+  }
+
+  void fail_mergePropagatedTypesAtJoinPoint_8() {
+    // https://code.google.com/p/dart/issues/detail?id=19929
+    //
+    // In nested loops [breaks]s are unsafe for the purposes of
+    // [isAbruptTerminationStatement].
+    //
+    // This is a combination of 6 and 7: we use an unlabeled [break]
+    // like a continue for the outer loop / like a labeled [break] to
+    // jump just above the [if].
+    String code = r'''
+f() {
+  var x = 0;
+  var c = false;
+  var d = true;
+  while (d) {
+    while (d) {
+      if (c) {
+        d = false;
+      } else {
+        x = '';
+        c = true;
+        break;
+      }
+      x; // marker
+    }
+  }
+}''';
+    DartType t = _findMarkedIdentifier(code, "; // marker").propagatedType;
+    expect(typeProvider.intType.isSubtypeOf(t), isTrue);
+    expect(typeProvider.stringType.isSubtypeOf(t), isTrue);
+  }
+
+  void fail_propagatedReturnType_functionExpression() {
+    // TODO(scheglov) disabled because we don't resolve function expression
+    String code = r'''
+main() {
+  var v = (() {return 42;})();
+}''';
+    _assertPropagatedAssignedType(
+        code, typeProvider.dynamicType, typeProvider.intType);
+  }
+
+  void test_as() {
+    Source source = addSource(r'''
+class A {
+  bool get g => true;
+}
+A f(var p) {
+  if ((p as A).g) {
+    return p;
+  } else {
+    return null;
+  }
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    IfStatement ifStatement = body.block.statements[0] as IfStatement;
+    ReturnStatement statement =
+        (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    expect(variableName.propagatedType, same(typeA));
+  }
+
+  void test_assert() {
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  assert (p is A);
+  return p;
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    expect(variableName.propagatedType, same(typeA));
+  }
+
+  void test_assignment() {
+    Source source = addSource(r'''
+f() {
+  var v;
+  v = 0;
+  return v;
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[2] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    expect(variableName.propagatedType, same(typeProvider.intType));
+  }
+
+  void test_assignment_afterInitializer() {
+    Source source = addSource(r'''
+f() {
+  var v = 0;
+  v = 1.0;
+  return v;
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[2] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    expect(variableName.propagatedType, same(typeProvider.doubleType));
+  }
+
+  void test_assignment_null() {
+    String code = r'''
+main() {
+  int v; // declare
+  v = null;
+  return v; // return
+}''';
+    CompilationUnit unit;
+    {
+      Source source = addSource(code);
+      LibraryElement library = resolve2(source);
+      assertNoErrors(source);
+      verify([source]);
+      unit = resolveCompilationUnit(source, library);
+    }
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(
+          unit, code, "v; // declare", (node) => node is SimpleIdentifier);
+      expect(identifier.staticType, same(typeProvider.intType));
+      expect(identifier.propagatedType, same(null));
+    }
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(
+          unit, code, "v = null;", (node) => node is SimpleIdentifier);
+      expect(identifier.staticType, same(typeProvider.intType));
+      expect(identifier.propagatedType, same(null));
+    }
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(
+          unit, code, "v; // return", (node) => node is SimpleIdentifier);
+      expect(identifier.staticType, same(typeProvider.intType));
+      expect(identifier.propagatedType, same(null));
+    }
+  }
+
+  void test_CanvasElement_getContext() {
+    String code = r'''
+import 'dart:html';
+main(CanvasElement canvas) {
+  var context = canvas.getContext('2d');
+}''';
+    Source source = addSource(code);
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    SimpleIdentifier identifier = EngineTestCase.findNode(
+        unit, code, "context", (node) => node is SimpleIdentifier);
+    expect(identifier.propagatedType.name, "CanvasRenderingContext2D");
+  }
+
+  void test_forEach() {
+    String code = r'''
+main() {
+  var list = <String> [];
+  for (var e in list) {
+    e;
+  }
+}''';
+    Source source = addSource(code);
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    InterfaceType stringType = typeProvider.stringType;
+    // in the declaration
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(
+          unit, code, "e in", (node) => node is SimpleIdentifier);
+      expect(identifier.propagatedType, same(stringType));
+    }
+    // in the loop body
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(
+          unit, code, "e;", (node) => node is SimpleIdentifier);
+      expect(identifier.propagatedType, same(stringType));
+    }
+  }
+
+  void test_forEach_async() {
+    String code = r'''
+import 'dart:async';
+f(Stream<String> stream) async {
+  await for (var e in stream) {
+    e;
+  }
+}''';
+    Source source = addSource(code);
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    InterfaceType stringType = typeProvider.stringType;
+    // in the declaration
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(
+          unit, code, "e in", (node) => node is SimpleIdentifier);
+      expect(identifier.propagatedType, same(stringType));
+    }
+    // in the loop body
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(
+          unit, code, "e;", (node) => node is SimpleIdentifier);
+      expect(identifier.propagatedType, same(stringType));
+    }
+  }
+
+  void test_functionExpression_asInvocationArgument() {
+    String code = r'''
+class MyMap<K, V> {
+  forEach(f(K key, V value)) {}
+}
+f(MyMap<int, String> m) {
+  m.forEach((k, v) {
+    k;
+    v;
+  });
+}''';
+    Source source = addSource(code);
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    // k
+    DartType intType = typeProvider.intType;
+    FormalParameter kParameter = EngineTestCase.findNode(
+        unit, code, "k, ", (node) => node is SimpleFormalParameter);
+    expect(kParameter.identifier.propagatedType, same(intType));
+    SimpleIdentifier kIdentifier = EngineTestCase.findNode(
+        unit, code, "k;", (node) => node is SimpleIdentifier);
+    expect(kIdentifier.propagatedType, same(intType));
+    expect(kIdentifier.staticType, same(typeProvider.dynamicType));
+    // v
+    DartType stringType = typeProvider.stringType;
+    FormalParameter vParameter = EngineTestCase.findNode(
+        unit, code, "v)", (node) => node is SimpleFormalParameter);
+    expect(vParameter.identifier.propagatedType, same(stringType));
+    SimpleIdentifier vIdentifier = EngineTestCase.findNode(
+        unit, code, "v;", (node) => node is SimpleIdentifier);
+    expect(vIdentifier.propagatedType, same(stringType));
+    expect(vIdentifier.staticType, same(typeProvider.dynamicType));
+  }
+
+  void test_functionExpression_asInvocationArgument_fromInferredInvocation() {
+    String code = r'''
+class MyMap<K, V> {
+  forEach(f(K key, V value)) {}
+}
+f(MyMap<int, String> m) {
+  var m2 = m;
+  m2.forEach((k, v) {});
+}''';
+    Source source = addSource(code);
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    // k
+    DartType intType = typeProvider.intType;
+    FormalParameter kParameter = EngineTestCase.findNode(
+        unit, code, "k, ", (node) => node is SimpleFormalParameter);
+    expect(kParameter.identifier.propagatedType, same(intType));
+    // v
+    DartType stringType = typeProvider.stringType;
+    FormalParameter vParameter = EngineTestCase.findNode(
+        unit, code, "v)", (node) => node is SimpleFormalParameter);
+    expect(vParameter.identifier.propagatedType, same(stringType));
+  }
+
+  void test_functionExpression_asInvocationArgument_functionExpressionInvocation() {
+    String code = r'''
+main() {
+  (f(String value)) {} ((v) {
+    v;
+  });
+}''';
+    Source source = addSource(code);
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    // v
+    DartType dynamicType = typeProvider.dynamicType;
+    DartType stringType = typeProvider.stringType;
+    FormalParameter vParameter = EngineTestCase.findNode(
+        unit, code, "v)", (node) => node is FormalParameter);
+    expect(vParameter.identifier.propagatedType, same(stringType));
+    expect(vParameter.identifier.staticType, same(dynamicType));
+    SimpleIdentifier vIdentifier = EngineTestCase.findNode(
+        unit, code, "v;", (node) => node is SimpleIdentifier);
+    expect(vIdentifier.propagatedType, same(stringType));
+    expect(vIdentifier.staticType, same(dynamicType));
+  }
+
+  void test_functionExpression_asInvocationArgument_keepIfLessSpecific() {
+    String code = r'''
+class MyList {
+  forEach(f(Object value)) {}
+}
+f(MyList list) {
+  list.forEach((int v) {
+    v;
+  });
+}''';
+    Source source = addSource(code);
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    // v
+    DartType intType = typeProvider.intType;
+    FormalParameter vParameter = EngineTestCase.findNode(
+        unit, code, "v)", (node) => node is SimpleFormalParameter);
+    expect(vParameter.identifier.propagatedType, same(null));
+    expect(vParameter.identifier.staticType, same(intType));
+    SimpleIdentifier vIdentifier = EngineTestCase.findNode(
+        unit, code, "v;", (node) => node is SimpleIdentifier);
+    expect(vIdentifier.staticType, same(intType));
+    expect(vIdentifier.propagatedType, same(null));
+  }
+
+  void test_functionExpression_asInvocationArgument_notSubtypeOfStaticType() {
+    String code = r'''
+class A {
+  m(void f(int i)) {}
+}
+x() {
+  A a = new A();
+  a.m(() => 0);
+}''';
+    Source source = addSource(code);
+    LibraryElement library = resolve2(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    // () => 0
+    FunctionExpression functionExpression = EngineTestCase.findNode(
+        unit, code, "() => 0)", (node) => node is FunctionExpression);
+    expect((functionExpression.staticType as FunctionType).parameters.length,
+        same(0));
+    expect(functionExpression.propagatedType, same(null));
+  }
+
+  void test_functionExpression_asInvocationArgument_replaceIfMoreSpecific() {
+    String code = r'''
+class MyList<E> {
+  forEach(f(E value)) {}
+}
+f(MyList<String> list) {
+  list.forEach((Object v) {
+    v;
+  });
+}''';
+    Source source = addSource(code);
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    // v
+    DartType stringType = typeProvider.stringType;
+    FormalParameter vParameter = EngineTestCase.findNode(
+        unit, code, "v)", (node) => node is SimpleFormalParameter);
+    expect(vParameter.identifier.propagatedType, same(stringType));
+    expect(vParameter.identifier.staticType, same(typeProvider.objectType));
+    SimpleIdentifier vIdentifier = EngineTestCase.findNode(
+        unit, code, "v;", (node) => node is SimpleIdentifier);
+    expect(vIdentifier.propagatedType, same(stringType));
+  }
+
+  void test_Future_then() {
+    String code = r'''
+import 'dart:async';
+main(Future<int> firstFuture) {
+  firstFuture.then((p1) {
+    return 1.0;
+  }).then((p2) {
+    return new Future<String>.value('str');
+  }).then((p3) {
+  });
+}''';
+    Source source = addSource(code);
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    // p1
+    FormalParameter p1 = EngineTestCase.findNode(
+        unit, code, "p1) {", (node) => node is SimpleFormalParameter);
+    expect(p1.identifier.propagatedType, same(typeProvider.intType));
+    // p2
+    FormalParameter p2 = EngineTestCase.findNode(
+        unit, code, "p2) {", (node) => node is SimpleFormalParameter);
+    expect(p2.identifier.propagatedType, same(typeProvider.doubleType));
+    // p3
+    FormalParameter p3 = EngineTestCase.findNode(
+        unit, code, "p3) {", (node) => node is SimpleFormalParameter);
+    expect(p3.identifier.propagatedType, same(typeProvider.stringType));
+  }
+
+  void test_initializer() {
+    Source source = addSource(r'''
+f() {
+  var v = 0;
+  return v;
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    NodeList<Statement> statements = body.block.statements;
+    // Type of 'v' in declaration.
+    {
+      VariableDeclarationStatement statement =
+          statements[0] as VariableDeclarationStatement;
+      SimpleIdentifier variableName = statement.variables.variables[0].name;
+      expect(variableName.staticType, same(typeProvider.dynamicType));
+      expect(variableName.propagatedType, same(typeProvider.intType));
+    }
+    // Type of 'v' in reference.
+    {
+      ReturnStatement statement = statements[1] as ReturnStatement;
+      SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+      expect(variableName.propagatedType, same(typeProvider.intType));
+    }
+  }
+
+  void test_initializer_dereference() {
+    Source source = addSource(r'''
+f() {
+  var v = 'String';
+  v.
+}''');
+    LibraryElement library = resolve2(source);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    ExpressionStatement statement =
+        body.block.statements[1] as ExpressionStatement;
+    PrefixedIdentifier invocation = statement.expression as PrefixedIdentifier;
+    SimpleIdentifier variableName = invocation.prefix;
+    expect(variableName.propagatedType, same(typeProvider.stringType));
+  }
+
+  void test_initializer_hasStaticType() {
+    Source source = addSource(r'''
+f() {
+  int v = 0;
+  return v;
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    NodeList<Statement> statements = body.block.statements;
+    // Type of 'v' in declaration.
+    {
+      VariableDeclarationStatement statement =
+          statements[0] as VariableDeclarationStatement;
+      SimpleIdentifier variableName = statement.variables.variables[0].name;
+      expect(variableName.staticType, same(typeProvider.intType));
+      expect(variableName.propagatedType, isNull);
+    }
+    // Type of 'v' in reference.
+    {
+      ReturnStatement statement = statements[1] as ReturnStatement;
+      SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+      expect(variableName.staticType, same(typeProvider.intType));
+      expect(variableName.propagatedType, isNull);
+    }
+  }
+
+  void test_initializer_hasStaticType_parameterized() {
+    Source source = addSource(r'''
+f() {
+  List<int> v = <int>[];
+  return v;
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    NodeList<Statement> statements = body.block.statements;
+    // Type of 'v' in declaration.
+    {
+      VariableDeclarationStatement statement =
+          statements[0] as VariableDeclarationStatement;
+      SimpleIdentifier variableName = statement.variables.variables[0].name;
+      expect(variableName.staticType, isNotNull);
+      expect(variableName.propagatedType, isNull);
+    }
+    // Type of 'v' in reference.
+    {
+      ReturnStatement statement = statements[1] as ReturnStatement;
+      SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+      expect(variableName.staticType, isNotNull);
+      expect(variableName.propagatedType, isNull);
+    }
+  }
+
+  void test_initializer_null() {
+    String code = r'''
+main() {
+  int v = null;
+  return v; // marker
+}''';
+    CompilationUnit unit;
+    {
+      Source source = addSource(code);
+      LibraryElement library = resolve2(source);
+      assertNoErrors(source);
+      verify([source]);
+      unit = resolveCompilationUnit(source, library);
+    }
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(
+          unit, code, "v = null;", (node) => node is SimpleIdentifier);
+      expect(identifier.staticType, same(typeProvider.intType));
+      expect(identifier.propagatedType, same(null));
+    }
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(
+          unit, code, "v; // marker", (node) => node is SimpleIdentifier);
+      expect(identifier.staticType, same(typeProvider.intType));
+      expect(identifier.propagatedType, same(null));
+    }
+  }
+
+  void test_is_conditional() {
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  return (p is A) ? p : null;
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[0] as ReturnStatement;
+    ConditionalExpression conditional =
+        statement.expression as ConditionalExpression;
+    SimpleIdentifier variableName =
+        conditional.thenExpression as SimpleIdentifier;
+    expect(variableName.propagatedType, same(typeA));
+  }
+
+  void test_is_if() {
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  if (p is A) {
+    return p;
+  } else {
+    return null;
+  }
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    // prepare A
+    InterfaceType typeA;
+    {
+      ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+      typeA = classA.element.type;
+    }
+    // verify "f"
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    IfStatement ifStatement = body.block.statements[0] as IfStatement;
+    // "p is A"
+    {
+      IsExpression isExpression = ifStatement.condition;
+      SimpleIdentifier variableName = isExpression.expression;
+      expect(variableName.propagatedType, isNull);
+    }
+    // "return p;"
+    {
+      ReturnStatement statement =
+          (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
+      SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+      expect(variableName.propagatedType, same(typeA));
+    }
+  }
+
+  void test_is_if_lessSpecific() {
+    Source source = addSource(r'''
+class A {}
+A f(A p) {
+  if (p is String) {
+    return p;
+  } else {
+    return null;
+  }
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+//    ClassDeclaration classA = (ClassDeclaration) unit.getDeclarations().get(0);
+//    InterfaceType typeA = classA.getElement().getType();
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    IfStatement ifStatement = body.block.statements[0] as IfStatement;
+    ReturnStatement statement =
+        (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    expect(variableName.propagatedType, same(null));
+  }
+
+  void test_is_if_logicalAnd() {
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  if (p is A && p != null) {
+    return p;
+  } else {
+    return null;
+  }
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    IfStatement ifStatement = body.block.statements[0] as IfStatement;
+    ReturnStatement statement =
+        (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    expect(variableName.propagatedType, same(typeA));
+  }
+
+  void test_is_postConditional() {
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  A a = (p is A) ? p : throw null;
+  return p;
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    expect(variableName.propagatedType, same(typeA));
+  }
+
+  void test_is_postIf() {
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  if (p is A) {
+    A a = p;
+  } else {
+    return null;
+  }
+  return p;
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    expect(variableName.propagatedType, same(typeA));
+  }
+
+  void test_is_subclass() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  B m() => this;
+}
+A f(A p) {
+  if (p is B) {
+    return p.m();
+  }
+  return p;
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[2] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    IfStatement ifStatement = body.block.statements[0] as IfStatement;
+    ReturnStatement statement =
+        (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
+    MethodInvocation invocation = statement.expression as MethodInvocation;
+    expect(invocation.methodName.staticElement, isNotNull);
+    expect(invocation.methodName.propagatedElement, isNull);
+  }
+
+  void test_is_while() {
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  while (p is A) {
+    return p;
+  }
+  return p;
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    WhileStatement whileStatement = body.block.statements[0] as WhileStatement;
+    ReturnStatement statement =
+        (whileStatement.body as Block).statements[0] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    expect(variableName.propagatedType, same(typeA));
+  }
+
+  void test_isNot_conditional() {
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  return (p is! A) ? null : p;
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[0] as ReturnStatement;
+    ConditionalExpression conditional =
+        statement.expression as ConditionalExpression;
+    SimpleIdentifier variableName =
+        conditional.elseExpression as SimpleIdentifier;
+    expect(variableName.propagatedType, same(typeA));
+  }
+
+  void test_isNot_if() {
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  if (p is! A) {
+    return null;
+  } else {
+    return p;
+  }
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    IfStatement ifStatement = body.block.statements[0] as IfStatement;
+    ReturnStatement statement =
+        (ifStatement.elseStatement as Block).statements[0] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    expect(variableName.propagatedType, same(typeA));
+  }
+
+  void test_isNot_if_logicalOr() {
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  if (p is! A || null == p) {
+    return null;
+  } else {
+    return p;
+  }
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    IfStatement ifStatement = body.block.statements[0] as IfStatement;
+    ReturnStatement statement =
+        (ifStatement.elseStatement as Block).statements[0] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    expect(variableName.propagatedType, same(typeA));
+  }
+
+  void test_isNot_postConditional() {
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  A a = (p is! A) ? throw null : p;
+  return p;
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    expect(variableName.propagatedType, same(typeA));
+  }
+
+  void test_isNot_postIf() {
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  if (p is! A) {
+    return null;
+  }
+  return p;
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    ClassDeclaration classA = unit.declarations[0] as ClassDeclaration;
+    InterfaceType typeA = classA.element.type;
+    FunctionDeclaration function = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
+    SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
+    expect(variableName.propagatedType, same(typeA));
+  }
+
+  void test_issue20904BuggyTypePromotionAtIfJoin_5() {
+    // https://code.google.com/p/dart/issues/detail?id=20904
+    //
+    // This is not an example of the 20904 bug, but rather,
+    // an example of something that one obvious fix changes inadvertently: we
+    // want to avoid using type information from is-checks when it
+    // loses precision. I can't see how to get a bad hint this way, since
+    // it seems the propagated type is not used to generate hints when a
+    // more precise type would cause no hint. For example, for code like the
+    // following, when the propagated type of [x] is [A] -- as happens for the
+    // fix these tests aim to warn against -- there is no warning for
+
+    // calling a method defined on [B] but not [A] (there aren't any, but
+    // pretend), but there is for calling a method not defined on either.
+    // By not overriding the propagated type via an is-check that loses
+    // precision, we get more precise completion under an is-check. However,
+    // I can only imagine strange code would make use of this feature.
+    //
+    // Here the is-check improves precision, so we use it.
+    String code = r'''
+class A {}
+class B extends A {}
+f() {
+  var a = new A();
+  var b = new B();
+  b; // B
+  if (a is B) {
+    return a; // marker
+  }
+}''';
+    DartType tB = _findMarkedIdentifier(code, "; // B").propagatedType;
+    _assertTypeOfMarkedExpression(code, null, tB);
+  }
+
+  void test_issue20904BuggyTypePromotionAtIfJoin_6() {
+    // https://code.google.com/p/dart/issues/detail?id=20904
+    //
+    // The other half of the *_5() test.
+    //
+    // Here the is-check loses precision, so we don't use it.
+    String code = r'''
+class A {}
+class B extends A {}
+f() {
+  var b = new B();
+  b; // B
+  if (b is A) {
+    return b; // marker
+  }
+}''';
+    DartType tB = _findMarkedIdentifier(code, "; // B").propagatedType;
+    _assertTypeOfMarkedExpression(code, null, tB);
+  }
+
+  void test_listLiteral_different() {
+    Source source = addSource(r'''
+f() {
+  var v = [0, '1', 2];
+  return v[2];
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
+    IndexExpression indexExpression = statement.expression as IndexExpression;
+    expect(indexExpression.propagatedType, isNull);
+  }
+
+  void test_listLiteral_same() {
+    Source source = addSource(r'''
+f() {
+  var v = [0, 1, 2];
+  return v[2];
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
+    IndexExpression indexExpression = statement.expression as IndexExpression;
+    expect(indexExpression.propagatedType, isNull);
+    Expression v = indexExpression.target;
+    InterfaceType propagatedType = v.propagatedType as InterfaceType;
+    expect(propagatedType.element, same(typeProvider.listType.element));
+    List<DartType> typeArguments = propagatedType.typeArguments;
+    expect(typeArguments, hasLength(1));
+    expect(typeArguments[0], same(typeProvider.dynamicType));
+  }
+
+  void test_mapLiteral_different() {
+    Source source = addSource(r'''
+f() {
+  var v = {'0' : 0, 1 : '1', '2' : 2};
+  return v;
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
+    SimpleIdentifier identifier = statement.expression as SimpleIdentifier;
+    InterfaceType propagatedType = identifier.propagatedType as InterfaceType;
+    expect(propagatedType.element, same(typeProvider.mapType.element));
+    List<DartType> typeArguments = propagatedType.typeArguments;
+    expect(typeArguments, hasLength(2));
+    expect(typeArguments[0], same(typeProvider.dynamicType));
+    expect(typeArguments[1], same(typeProvider.dynamicType));
+  }
+
+  void test_mapLiteral_same() {
+    Source source = addSource(r'''
+f() {
+  var v = {'a' : 0, 'b' : 1, 'c' : 2};
+  return v;
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body =
+        function.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[1] as ReturnStatement;
+    SimpleIdentifier identifier = statement.expression as SimpleIdentifier;
+    InterfaceType propagatedType = identifier.propagatedType as InterfaceType;
+    expect(propagatedType.element, same(typeProvider.mapType.element));
+    List<DartType> typeArguments = propagatedType.typeArguments;
+    expect(typeArguments, hasLength(2));
+    expect(typeArguments[0], same(typeProvider.dynamicType));
+    expect(typeArguments[1], same(typeProvider.dynamicType));
+  }
+
+  void test_mergePropagatedTypes_afterIfThen_different() {
+    String code = r'''
+main() {
+  var v = 0;
+  if (v != null) {
+    v = '';
+  }
+  return v;
+}''';
+    {
+      SimpleIdentifier identifier = _findMarkedIdentifier(code, "v;");
+      expect(identifier.propagatedType, null);
+    }
+    {
+      SimpleIdentifier identifier = _findMarkedIdentifier(code, "v = '';");
+      expect(identifier.propagatedType, typeProvider.stringType);
+    }
+  }
+
+  void test_mergePropagatedTypes_afterIfThen_same() {
+    _assertTypeOfMarkedExpression(
+        r'''
+main() {
+  var v = 1;
+  if (v != null) {
+    v = 2;
+  }
+  return v; // marker
+}''',
+        null,
+        typeProvider.intType);
+  }
+
+  void test_mergePropagatedTypes_afterIfThenElse_different() {
+    _assertTypeOfMarkedExpression(
+        r'''
+main() {
+  var v = 1;
+  if (v != null) {
+    v = 2;
+  } else {
+    v = '3';
+  }
+  return v; // marker
+}''',
+        null,
+        null);
+  }
+
+  void test_mergePropagatedTypes_afterIfThenElse_same() {
+    _assertTypeOfMarkedExpression(
+        r'''
+main() {
+  var v = 1;
+  if (v != null) {
+    v = 2;
+  } else {
+    v = 3;
+  }
+  return v; // marker
+}''',
+        null,
+        typeProvider.intType);
+  }
+
+  void test_mergePropagatedTypesAtJoinPoint_4() {
+    // https://code.google.com/p/dart/issues/detail?id=19929
+    _assertTypeOfMarkedExpression(
+        r'''
+f5(x) {
+  var y = [];
+  if (x) {
+    y = 0;
+  } else {
+    return y;
+  }
+  // Propagated type is [int] here: correct.
+  return y; // marker
+}''',
+        null,
+        typeProvider.intType);
+  }
+
+  void test_mutatedOutsideScope() {
+    // https://code.google.com/p/dart/issues/detail?id=22732
+    Source source = addSource(r'''
+class Base {
+}
+
+class Derived extends Base {
+  get y => null;
+}
+
+class C {
+  void f() {
+    Base x = null;
+    if (x is Derived) {
+      print(x.y); // BAD
+    }
+    x = null;
+  }
+}
+
+void g() {
+  Base x = null;
+  if (x is Derived) {
+    print(x.y); // GOOD
+  }
+  x = null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+  }
+
+  void test_objectMethodOnDynamicExpression_doubleEquals() {
+    // https://code.google.com/p/dart/issues/detail?id=20342
+    //
+    // This was not actually part of Issue 20342, since the spec specifies a
+    // static type of [bool] for [==] comparison and the implementation
+    // was already consistent with the spec there. But, it's another
+    // [Object] method, so it's included here.
+    _assertTypeOfMarkedExpression(
+        r'''
+f1(x) {
+  var v = (x == x);
+  return v; // marker
+}''',
+        null,
+        typeProvider.boolType);
+  }
+
+  void test_objectMethodOnDynamicExpression_hashCode() {
+    // https://code.google.com/p/dart/issues/detail?id=20342
+    _assertTypeOfMarkedExpression(
+        r'''
+f1(x) {
+  var v = x.hashCode;
+  return v; // marker
+}''',
+        null,
+        typeProvider.intType);
+  }
+
+  void test_objectMethodOnDynamicExpression_runtimeType() {
+    // https://code.google.com/p/dart/issues/detail?id=20342
+    _assertTypeOfMarkedExpression(
+        r'''
+f1(x) {
+  var v = x.runtimeType;
+  return v; // marker
+}''',
+        null,
+        typeProvider.typeType);
+  }
+
+  void test_objectMethodOnDynamicExpression_toString() {
+    // https://code.google.com/p/dart/issues/detail?id=20342
+    _assertTypeOfMarkedExpression(
+        r'''
+f1(x) {
+  var v = x.toString();
+  return v; // marker
+}''',
+        null,
+        typeProvider.stringType);
+  }
+
+  void test_propagatedReturnType_function_hasReturnType_returnsNull() {
+    String code = r'''
+String f() => null;
+main() {
+  var v = f();
+}''';
+    _assertPropagatedAssignedType(
+        code, typeProvider.dynamicType, typeProvider.stringType);
+  }
+
+  void test_propagatedReturnType_function_lessSpecificStaticReturnType() {
+    String code = r'''
+Object f() => 42;
+main() {
+  var v = f();
+}''';
+    _assertPropagatedAssignedType(
+        code, typeProvider.dynamicType, typeProvider.intType);
+  }
+
+  void test_propagatedReturnType_function_moreSpecificStaticReturnType() {
+    String code = r'''
+int f(v) => (v as num);
+main() {
+  var v = f(3);
+}''';
+    _assertPropagatedAssignedType(
+        code, typeProvider.dynamicType, typeProvider.intType);
+  }
+
+  void test_propagatedReturnType_function_noReturnTypeName_blockBody_multipleReturns() {
+    String code = r'''
+f() {
+  if (true) return 0;
+  return 1.0;
+}
+main() {
+  var v = f();
+}''';
+    _assertPropagatedAssignedType(
+        code, typeProvider.dynamicType, typeProvider.numType);
+  }
+
+  void test_propagatedReturnType_function_noReturnTypeName_blockBody_oneReturn() {
+    String code = r'''
+f() {
+  var z = 42;
+  return z;
+}
+main() {
+  var v = f();
+}''';
+    _assertPropagatedAssignedType(
+        code, typeProvider.dynamicType, typeProvider.intType);
+  }
+
+  void test_propagatedReturnType_function_noReturnTypeName_expressionBody() {
+    String code = r'''
+f() => 42;
+main() {
+  var v = f();
+}''';
+    _assertPropagatedAssignedType(
+        code, typeProvider.dynamicType, typeProvider.intType);
+  }
+
+  void test_propagatedReturnType_localFunction() {
+    String code = r'''
+main() {
+  f() => 42;
+  var v = f();
+}''';
+    _assertPropagatedAssignedType(
+        code, typeProvider.dynamicType, typeProvider.intType);
+  }
+
+  void test_query() {
+    Source source = addSource(r'''
+import 'dart:html';
+
+main() {
+  var v1 = query('a');
+  var v2 = query('A');
+  var v3 = query('body:active');
+  var v4 = query('button[foo="bar"]');
+  var v5 = query('div.class');
+  var v6 = query('input#id');
+  var v7 = query('select#id');
+  // invocation of method
+  var m1 = document.query('div');
+ // unsupported currently
+  var b1 = query('noSuchTag');
+  var b2 = query('DART_EDITOR_NO_SUCH_TYPE');
+  var b3 = query('body div');
+  return [v1, v2, v3, v4, v5, v6, v7, m1, b1, b2, b3];
+}''');
+    LibraryElement library = resolve2(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    FunctionDeclaration main = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body = main.functionExpression.body as BlockFunctionBody;
+    ReturnStatement statement = body.block.statements[11] as ReturnStatement;
+    NodeList<Expression> elements =
+        (statement.expression as ListLiteral).elements;
+    expect(elements[0].propagatedType.name, "AnchorElement");
+    expect(elements[1].propagatedType.name, "AnchorElement");
+    expect(elements[2].propagatedType.name, "BodyElement");
+    expect(elements[3].propagatedType.name, "ButtonElement");
+    expect(elements[4].propagatedType.name, "DivElement");
+    expect(elements[5].propagatedType.name, "InputElement");
+    expect(elements[6].propagatedType.name, "SelectElement");
+    expect(elements[7].propagatedType.name, "DivElement");
+    expect(elements[8].propagatedType.name, "Element");
+    expect(elements[9].propagatedType.name, "Element");
+    expect(elements[10].propagatedType.name, "Element");
+  }
+}
+
+@reflectiveTest
+class StrongModeTypePropagationTest extends ResolverTestCase {
+  @override
+  void setUp() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.strongMode = true;
+    resetWithOptions(options);
+  }
+
+  void test_localVariableInference_constant() {
+    String code = r'''
+main() {
+  var v = 3;
+  return v; // marker
+}''';
+    _assertPropagatedAssignedType(code, typeProvider.intType, null);
+    _assertTypeOfMarkedExpression(code, typeProvider.intType, null);
+  }
+
+  void test_localVariableInference_transitive_local() {
+    String code = r'''
+main() {
+  var x = 3;
+  var v = x;
+  return v; // marker
+}''';
+    _assertPropagatedAssignedType(code, typeProvider.intType, null);
+    _assertTypeOfMarkedExpression(code, typeProvider.intType, null);
+  }
+
+  void test_localVariableInference_transitive_list_local() {
+    String code = r'''
+main() {
+  var x = <int>[3];
+  var v = x[0];
+  return v; // marker
+}''';
+    _assertPropagatedAssignedType(code, typeProvider.intType, null);
+    _assertTypeOfMarkedExpression(code, typeProvider.intType, null);
+  }
+
+  void test_localVariableInference_transitive_toplevel_lexical() {
+    String code = r'''
+int x = 3;
+main() {
+  var v = x;
+  return v; // marker
+}
+''';
+    _assertPropagatedAssignedType(code, typeProvider.intType, null);
+    _assertTypeOfMarkedExpression(code, typeProvider.intType, null);
+  }
+
+  void test_localVariableInference_transitive_toplevel_reversed() {
+    String code = r'''
+main() {
+  var v = x;
+  return v; // marker
+}
+int x = 3;
+''';
+    _assertPropagatedAssignedType(code, typeProvider.intType, null);
+    _assertTypeOfMarkedExpression(code, typeProvider.intType, null);
+  }
+
+  void fail_localVariableInference_transitive_toplevel_inferred_lexical() {
+    String code = r'''
+final x = 3;
+main() {
+  var v = x;
+  return v; // marker
+}
+''';
+    _assertPropagatedAssignedType(code, typeProvider.intType, null);
+    _assertTypeOfMarkedExpression(code, typeProvider.intType, null);
+  }
+
+  void fail_localVariableInference_transitive_toplevel_inferred_reversed() {
+    String code = r'''
+main() {
+  var v = x;
+  return v; // marker
+}
+final x = 3;
+''';
+    _assertPropagatedAssignedType(code, typeProvider.intType, null);
+    _assertTypeOfMarkedExpression(code, typeProvider.intType, null);
+  }
+
+  void test_localVariableInference_transitive_field_lexical() {
+    String code = r'''
+class A {
+  int x = 3;
+  f() {
+    var v = x;
+    return v; // marker
+  }
+}
+main() {
+}
+''';
+    _assertPropagatedAssignedType(code, typeProvider.intType, null);
+    _assertTypeOfMarkedExpression(code, typeProvider.intType, null);
+  }
+
+  void test_localVariableInference_transitive_field_reversed() {
+    String code = r'''
+class A {
+  f() {
+    var v = x;
+    return v; // marker
+  }
+  int x = 3;
+}
+main() {
+}
+''';
+    _assertPropagatedAssignedType(code, typeProvider.intType, null);
+    _assertTypeOfMarkedExpression(code, typeProvider.intType, null);
+  }
+
+  void fail_localVariableInference_transitive_field_inferred_lexical() {
+    String code = r'''
+class A {
+  final x = 3;
+  f() {
+    var v = x;
+    return v; // marker
+  }
+}
+main() {
+}
+''';
+    _assertPropagatedAssignedType(code, typeProvider.intType, null);
+    _assertTypeOfMarkedExpression(code, typeProvider.intType, null);
+  }
+
+  void fail_localVariableInference_transitive_field_inferred_reversed() {
+    String code = r'''
+class A {
+  f() {
+    var v = x;
+    return v; // marker
+  }
+  final x = 3;
+}
+main() {
+}
+''';
+    _assertPropagatedAssignedType(code, typeProvider.intType, null);
+    _assertTypeOfMarkedExpression(code, typeProvider.intType, null);
+  }
+
+  void test_localVariableInference_declaredType_disabled() {
+    String code = r'''
+main() {
+  dynamic v = 3;
+  return v; // marker
+}''';
+    _assertPropagatedAssignedType(
+        code, typeProvider.dynamicType, typeProvider.intType);
+    _assertTypeOfMarkedExpression(
+        code, typeProvider.dynamicType, typeProvider.intType);
+  }
+
+  void test_localVariableInference_bottom_disabled() {
+    String code = r'''
+main() {
+  var v = null;
+  return v; // marker
+}''';
+    _assertPropagatedAssignedType(code, typeProvider.dynamicType, null);
+    _assertTypeOfMarkedExpression(code, typeProvider.dynamicType, null);
+  }
+
+  void test_localVariableInference_noInitializer_disabled() {
+    String code = r'''
+main() {
+  var v;
+  v = 3;
+  return v; // marker
+}''';
+    _assertPropagatedAssignedType(
+        code, typeProvider.dynamicType, typeProvider.intType);
+    _assertTypeOfMarkedExpression(
+        code, typeProvider.dynamicType, typeProvider.intType);
+  }
+}
+
+@reflectiveTest
+class TypeProviderImplTest extends EngineTestCase {
+  void test_creation() {
+    //
+    // Create a mock library element with the types expected to be in dart:core.
+    // We cannot use either ElementFactory or TestTypeProvider (which uses
+    // ElementFactory) because we side-effect the elements in ways that would
+    // break other tests.
+    //
+    InterfaceType objectType = _classElement("Object", null).type;
+    InterfaceType boolType = _classElement("bool", objectType).type;
+    InterfaceType numType = _classElement("num", objectType).type;
+    InterfaceType doubleType = _classElement("double", numType).type;
+    InterfaceType functionType = _classElement("Function", objectType).type;
+    InterfaceType futureType = _classElement("Future", objectType, ["T"]).type;
+    InterfaceType intType = _classElement("int", numType).type;
+    InterfaceType iterableType =
+        _classElement("Iterable", objectType, ["T"]).type;
+    InterfaceType listType = _classElement("List", objectType, ["E"]).type;
+    InterfaceType mapType = _classElement("Map", objectType, ["K", "V"]).type;
+    InterfaceType stackTraceType = _classElement("StackTrace", objectType).type;
+    InterfaceType streamType = _classElement("Stream", objectType, ["T"]).type;
+    InterfaceType stringType = _classElement("String", objectType).type;
+    InterfaceType symbolType = _classElement("Symbol", objectType).type;
+    InterfaceType typeType = _classElement("Type", objectType).type;
+    CompilationUnitElementImpl coreUnit =
+        new CompilationUnitElementImpl("core.dart");
+    coreUnit.types = <ClassElement>[
+      boolType.element,
+      doubleType.element,
+      functionType.element,
+      intType.element,
+      iterableType.element,
+      listType.element,
+      mapType.element,
+      objectType.element,
+      stackTraceType.element,
+      stringType.element,
+      symbolType.element,
+      typeType.element
+    ];
+    CompilationUnitElementImpl asyncUnit =
+        new CompilationUnitElementImpl("async.dart");
+    asyncUnit.types = <ClassElement>[futureType.element, streamType.element];
+    AnalysisContext context = AnalysisEngine.instance.createAnalysisContext();
+    LibraryElementImpl coreLibrary = new LibraryElementImpl.forNode(
+        context, AstFactory.libraryIdentifier2(["dart.core"]));
+    coreLibrary.definingCompilationUnit = coreUnit;
+    LibraryElementImpl asyncLibrary = new LibraryElementImpl.forNode(
+        context, AstFactory.libraryIdentifier2(["dart.async"]));
+    asyncLibrary.definingCompilationUnit = asyncUnit;
+    //
+    // Create a type provider and ensure that it can return the expected types.
+    //
+    TypeProviderImpl provider = new TypeProviderImpl(coreLibrary, asyncLibrary);
+    expect(provider.boolType, same(boolType));
+    expect(provider.bottomType, isNotNull);
+    expect(provider.doubleType, same(doubleType));
+    expect(provider.dynamicType, isNotNull);
+    expect(provider.functionType, same(functionType));
+    expect(provider.futureType, same(futureType));
+    expect(provider.intType, same(intType));
+    expect(provider.listType, same(listType));
+    expect(provider.mapType, same(mapType));
+    expect(provider.objectType, same(objectType));
+    expect(provider.stackTraceType, same(stackTraceType));
+    expect(provider.stringType, same(stringType));
+    expect(provider.symbolType, same(symbolType));
+    expect(provider.typeType, same(typeType));
+  }
+
+  ClassElement _classElement(String typeName, InterfaceType superclassType,
+      [List<String> parameterNames]) {
+    ClassElementImpl element =
+        new ClassElementImpl.forNode(AstFactory.identifier3(typeName));
+    element.supertype = superclassType;
+    InterfaceTypeImpl type = new InterfaceTypeImpl(element);
+    element.type = type;
+    if (parameterNames != null) {
+      int count = parameterNames.length;
+      if (count > 0) {
+        List<TypeParameterElementImpl> typeParameters =
+            new List<TypeParameterElementImpl>(count);
+        List<TypeParameterTypeImpl> typeArguments =
+            new List<TypeParameterTypeImpl>(count);
+        for (int i = 0; i < count; i++) {
+          TypeParameterElementImpl typeParameter =
+              new TypeParameterElementImpl.forNode(
+                  AstFactory.identifier3(parameterNames[i]));
+          typeParameters[i] = typeParameter;
+          typeArguments[i] = new TypeParameterTypeImpl(typeParameter);
+          typeParameter.type = typeArguments[i];
+        }
+        element.typeParameters = typeParameters;
+        type.typeArguments = typeArguments;
+      }
+    }
+    return element;
+  }
+}
+
+@reflectiveTest
+class TypeResolverVisitorTest extends EngineTestCase {
+  /**
+   * The error listener to which errors will be reported.
+   */
+  GatheringErrorListener _listener;
+
+  /**
+   * The object representing the information about the library in which the types are being
+   * resolved.
+   */
+  Library _library;
+
+  /**
+   * The type provider used to access the types.
+   */
+  TestTypeProvider _typeProvider;
+
+  /**
+   * The visitor used to resolve types needed to form the type hierarchy.
+   */
+  TypeResolverVisitor _visitor;
+
+  void fail_visitConstructorDeclaration() {
+    fail("Not yet tested");
+    _listener.assertNoErrors();
+  }
+
+  void fail_visitFunctionTypeAlias() {
+    fail("Not yet tested");
+    _listener.assertNoErrors();
+  }
+
+  void fail_visitVariableDeclaration() {
+    fail("Not yet tested");
+    ClassElement type = ElementFactory.classElement2("A");
+    VariableDeclaration node = AstFactory.variableDeclaration("a");
+    AstFactory.variableDeclarationList(null, AstFactory.typeName(type), [node]);
+    //resolve(node);
+    expect(node.name.staticType, same(type.type));
+    _listener.assertNoErrors();
+  }
+
+  @override
+  void setUp() {
+    _listener = new GatheringErrorListener();
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    Source librarySource =
+        new FileBasedSource(FileUtilities2.createFile("/lib.dart"));
+    _library = new Library(context, _listener, librarySource);
+    LibraryElementImpl element = new LibraryElementImpl.forNode(
+        context, AstFactory.libraryIdentifier2(["lib"]));
+    element.definingCompilationUnit =
+        new CompilationUnitElementImpl("lib.dart");
+    _library.libraryElement = element;
+    _typeProvider = new TestTypeProvider();
+    _visitor = new TypeResolverVisitor(_library.libraryElement, librarySource,
+        _typeProvider, _library.errorListener,
+        nameScope: _library.libraryScope);
+  }
+
+  void test_visitCatchClause_exception() {
+    // catch (e)
+    CatchClause clause = AstFactory.catchClause("e");
+    SimpleIdentifier exceptionParameter = clause.exceptionParameter;
+    exceptionParameter.staticElement =
+        new LocalVariableElementImpl.forNode(exceptionParameter);
+    _resolveCatchClause(clause, _typeProvider.dynamicType, null);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitCatchClause_exception_stackTrace() {
+    // catch (e, s)
+    CatchClause clause = AstFactory.catchClause2("e", "s");
+    SimpleIdentifier exceptionParameter = clause.exceptionParameter;
+    exceptionParameter.staticElement =
+        new LocalVariableElementImpl.forNode(exceptionParameter);
+    SimpleIdentifier stackTraceParameter = clause.stackTraceParameter;
+    stackTraceParameter.staticElement =
+        new LocalVariableElementImpl.forNode(stackTraceParameter);
+    _resolveCatchClause(
+        clause, _typeProvider.dynamicType, _typeProvider.stackTraceType);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitCatchClause_on_exception() {
+    // on E catch (e)
+    ClassElement exceptionElement = ElementFactory.classElement2("E");
+    TypeName exceptionType = AstFactory.typeName(exceptionElement);
+    CatchClause clause = AstFactory.catchClause4(exceptionType, "e");
+    SimpleIdentifier exceptionParameter = clause.exceptionParameter;
+    exceptionParameter.staticElement =
+        new LocalVariableElementImpl.forNode(exceptionParameter);
+    _resolveCatchClause(
+        clause, exceptionElement.type, null, [exceptionElement]);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitCatchClause_on_exception_stackTrace() {
+    // on E catch (e, s)
+    ClassElement exceptionElement = ElementFactory.classElement2("E");
+    TypeName exceptionType = AstFactory.typeName(exceptionElement);
+    (exceptionType.name as SimpleIdentifier).staticElement = exceptionElement;
+    CatchClause clause = AstFactory.catchClause5(exceptionType, "e", "s");
+    SimpleIdentifier exceptionParameter = clause.exceptionParameter;
+    exceptionParameter.staticElement =
+        new LocalVariableElementImpl.forNode(exceptionParameter);
+    SimpleIdentifier stackTraceParameter = clause.stackTraceParameter;
+    stackTraceParameter.staticElement =
+        new LocalVariableElementImpl.forNode(stackTraceParameter);
+    _resolveCatchClause(clause, exceptionElement.type,
+        _typeProvider.stackTraceType, [exceptionElement]);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitClassDeclaration() {
+    // class A extends B with C implements D {}
+    // class B {}
+    // class C {}
+    // class D {}
+    ClassElement elementA = ElementFactory.classElement2("A");
+    ClassElement elementB = ElementFactory.classElement2("B");
+    ClassElement elementC = ElementFactory.classElement2("C");
+    ClassElement elementD = ElementFactory.classElement2("D");
+    ExtendsClause extendsClause =
+        AstFactory.extendsClause(AstFactory.typeName(elementB));
+    WithClause withClause =
+        AstFactory.withClause([AstFactory.typeName(elementC)]);
+    ImplementsClause implementsClause =
+        AstFactory.implementsClause([AstFactory.typeName(elementD)]);
+    ClassDeclaration declaration = AstFactory.classDeclaration(
+        null, "A", null, extendsClause, withClause, implementsClause);
+    declaration.name.staticElement = elementA;
+    _resolveNode(declaration, [elementA, elementB, elementC, elementD]);
+    expect(elementA.supertype, same(elementB.type));
+    List<InterfaceType> mixins = elementA.mixins;
+    expect(mixins, hasLength(1));
+    expect(mixins[0], same(elementC.type));
+    List<InterfaceType> interfaces = elementA.interfaces;
+    expect(interfaces, hasLength(1));
+    expect(interfaces[0], same(elementD.type));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitClassDeclaration_instanceMemberCollidesWithClass() {
+    // class A {}
+    // class B extends A {
+    //   void A() {}
+    // }
+    ClassElementImpl elementA = ElementFactory.classElement2("A");
+    ClassElementImpl elementB = ElementFactory.classElement2("B");
+    elementB.methods = <MethodElement>[
+      ElementFactory.methodElement("A", VoidTypeImpl.instance)
+    ];
+    ExtendsClause extendsClause =
+        AstFactory.extendsClause(AstFactory.typeName(elementA));
+    ClassDeclaration declaration =
+        AstFactory.classDeclaration(null, "B", null, extendsClause, null, null);
+    declaration.name.staticElement = elementB;
+    _resolveNode(declaration, [elementA, elementB]);
+    expect(elementB.supertype, same(elementA.type));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitClassTypeAlias() {
+    // class A = B with C implements D;
+    ClassElement elementA = ElementFactory.classElement2("A");
+    ClassElement elementB = ElementFactory.classElement2("B");
+    ClassElement elementC = ElementFactory.classElement2("C");
+    ClassElement elementD = ElementFactory.classElement2("D");
+    WithClause withClause =
+        AstFactory.withClause([AstFactory.typeName(elementC)]);
+    ImplementsClause implementsClause =
+        AstFactory.implementsClause([AstFactory.typeName(elementD)]);
+    ClassTypeAlias alias = AstFactory.classTypeAlias("A", null, null,
+        AstFactory.typeName(elementB), withClause, implementsClause);
+    alias.name.staticElement = elementA;
+    _resolveNode(alias, [elementA, elementB, elementC, elementD]);
+    expect(elementA.supertype, same(elementB.type));
+    List<InterfaceType> mixins = elementA.mixins;
+    expect(mixins, hasLength(1));
+    expect(mixins[0], same(elementC.type));
+    List<InterfaceType> interfaces = elementA.interfaces;
+    expect(interfaces, hasLength(1));
+    expect(interfaces[0], same(elementD.type));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitClassTypeAlias_constructorWithOptionalParams_ignored() {
+    // class T {}
+    // class B {
+    //   B.c1();
+    //   B.c2([T a0]);
+    //   B.c3({T a0});
+    // }
+    // class M {}
+    // class C = B with M
+    ClassElement classT = ElementFactory.classElement2('T', []);
+    ClassElementImpl classB = ElementFactory.classElement2('B', []);
+    ConstructorElementImpl constructorBc1 =
+        ElementFactory.constructorElement2(classB, 'c1', []);
+    ConstructorElementImpl constructorBc2 =
+        ElementFactory.constructorElement2(classB, 'c2', [classT.type]);
+    (constructorBc2.parameters[0] as ParameterElementImpl).parameterKind =
+        ParameterKind.POSITIONAL;
+    ConstructorElementImpl constructorBc3 =
+        ElementFactory.constructorElement2(classB, 'c3', [classT.type]);
+    (constructorBc3.parameters[0] as ParameterElementImpl).parameterKind =
+        ParameterKind.NAMED;
+    classB.constructors = [constructorBc1, constructorBc2, constructorBc3];
+    ClassElement classM = ElementFactory.classElement2('M', []);
+    WithClause withClause =
+        AstFactory.withClause([AstFactory.typeName(classM, [])]);
+    ClassElement classC = ElementFactory.classTypeAlias2('C', []);
+    ClassTypeAlias alias = AstFactory.classTypeAlias(
+        'C', null, null, AstFactory.typeName(classB, []), withClause, null);
+    alias.name.staticElement = classC;
+    _resolveNode(alias, [classT, classB, classM, classC]);
+    expect(classC.constructors, hasLength(1));
+    ConstructorElement constructor = classC.constructors[0];
+    expect(constructor.isFactory, isFalse);
+    expect(constructor.isSynthetic, isTrue);
+    expect(constructor.name, 'c1');
+    expect(constructor.functions, hasLength(0));
+    expect(constructor.labels, hasLength(0));
+    expect(constructor.localVariables, hasLength(0));
+    expect(constructor.parameters, isEmpty);
+  }
+
+  void test_visitClassTypeAlias_constructorWithParams() {
+    // class T {}
+    // class B {
+    //   B(T a0);
+    // }
+    // class M {}
+    // class C = B with M
+    ClassElement classT = ElementFactory.classElement2('T', []);
+    ClassElementImpl classB = ElementFactory.classElement2('B', []);
+    ConstructorElementImpl constructorB =
+        ElementFactory.constructorElement2(classB, '', [classT.type]);
+    classB.constructors = [constructorB];
+    ClassElement classM = ElementFactory.classElement2('M', []);
+    WithClause withClause =
+        AstFactory.withClause([AstFactory.typeName(classM, [])]);
+    ClassElement classC = ElementFactory.classTypeAlias2('C', []);
+    ClassTypeAlias alias = AstFactory.classTypeAlias(
+        'C', null, null, AstFactory.typeName(classB, []), withClause, null);
+    alias.name.staticElement = classC;
+    _resolveNode(alias, [classT, classB, classM, classC]);
+    expect(classC.constructors, hasLength(1));
+    ConstructorElement constructor = classC.constructors[0];
+    expect(constructor.isFactory, isFalse);
+    expect(constructor.isSynthetic, isTrue);
+    expect(constructor.name, '');
+    expect(constructor.functions, hasLength(0));
+    expect(constructor.labels, hasLength(0));
+    expect(constructor.localVariables, hasLength(0));
+    expect(constructor.parameters, hasLength(1));
+    expect(constructor.parameters[0].type, equals(classT.type));
+    expect(constructor.parameters[0].name,
+        equals(constructorB.parameters[0].name));
+  }
+
+  void test_visitClassTypeAlias_defaultConstructor() {
+    // class B {}
+    // class M {}
+    // class C = B with M
+    ClassElementImpl classB = ElementFactory.classElement2('B', []);
+    ConstructorElementImpl constructorB =
+        ElementFactory.constructorElement2(classB, '', []);
+    constructorB.setModifier(Modifier.SYNTHETIC, true);
+    classB.constructors = [constructorB];
+    ClassElement classM = ElementFactory.classElement2('M', []);
+    WithClause withClause =
+        AstFactory.withClause([AstFactory.typeName(classM, [])]);
+    ClassElement classC = ElementFactory.classTypeAlias2('C', []);
+    ClassTypeAlias alias = AstFactory.classTypeAlias(
+        'C', null, null, AstFactory.typeName(classB, []), withClause, null);
+    alias.name.staticElement = classC;
+    _resolveNode(alias, [classB, classM, classC]);
+    expect(classC.constructors, hasLength(1));
+    ConstructorElement constructor = classC.constructors[0];
+    expect(constructor.isFactory, isFalse);
+    expect(constructor.isSynthetic, isTrue);
+    expect(constructor.name, '');
+    expect(constructor.functions, hasLength(0));
+    expect(constructor.labels, hasLength(0));
+    expect(constructor.localVariables, hasLength(0));
+    expect(constructor.parameters, isEmpty);
+  }
+
+  void test_visitFieldFormalParameter_functionType() {
+    InterfaceType intType = _typeProvider.intType;
+    TypeName intTypeName = AstFactory.typeName4("int");
+    String innerParameterName = "a";
+    SimpleFormalParameter parameter =
+        AstFactory.simpleFormalParameter3(innerParameterName);
+    parameter.identifier.staticElement =
+        ElementFactory.requiredParameter(innerParameterName);
+    String outerParameterName = "p";
+    FormalParameter node = AstFactory.fieldFormalParameter(null, intTypeName,
+        outerParameterName, AstFactory.formalParameterList([parameter]));
+    node.identifier.staticElement =
+        ElementFactory.requiredParameter(outerParameterName);
+    DartType parameterType = _resolveFormalParameter(node, [intType.element]);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is FunctionType, FunctionType, parameterType);
+    FunctionType functionType = parameterType as FunctionType;
+    expect(functionType.returnType, same(intType));
+    expect(functionType.parameters, hasLength(1));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFieldFormalParameter_noType() {
+    String parameterName = "p";
+    FormalParameter node =
+        AstFactory.fieldFormalParameter(Keyword.VAR, null, parameterName);
+    node.identifier.staticElement =
+        ElementFactory.requiredParameter(parameterName);
+    expect(_resolveFormalParameter(node), same(_typeProvider.dynamicType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFieldFormalParameter_type() {
+    InterfaceType intType = _typeProvider.intType;
+    TypeName intTypeName = AstFactory.typeName4("int");
+    String parameterName = "p";
+    FormalParameter node =
+        AstFactory.fieldFormalParameter(null, intTypeName, parameterName);
+    node.identifier.staticElement =
+        ElementFactory.requiredParameter(parameterName);
+    expect(_resolveFormalParameter(node, [intType.element]), same(intType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionDeclaration() {
+    // R f(P p) {}
+    // class R {}
+    // class P {}
+    ClassElement elementR = ElementFactory.classElement2('R');
+    ClassElement elementP = ElementFactory.classElement2('P');
+    FunctionElement elementF = ElementFactory.functionElement('f');
+    FunctionDeclaration declaration = AstFactory.functionDeclaration(
+        AstFactory.typeName4('R'),
+        null,
+        'f',
+        AstFactory.functionExpression2(
+            AstFactory.formalParameterList([
+              AstFactory.simpleFormalParameter4(AstFactory.typeName4('P'), 'p')
+            ]),
+            null));
+    declaration.name.staticElement = elementF;
+    _resolveNode(declaration, [elementR, elementP]);
+    expect(declaration.returnType.type, elementR.type);
+    SimpleFormalParameter parameter =
+        declaration.functionExpression.parameters.parameters[0];
+    expect(parameter.type.type, elementP.type);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionDeclaration_typeParameter() {
+    // E f<E>(E e) {}
+    TypeParameterElement elementE = ElementFactory.typeParameterElement('E');
+    FunctionElementImpl elementF = ElementFactory.functionElement('f');
+    elementF.typeParameters = <TypeParameterElement>[elementE];
+    FunctionDeclaration declaration = AstFactory.functionDeclaration(
+        AstFactory.typeName4('E'),
+        null,
+        'f',
+        AstFactory.functionExpression2(
+            AstFactory.formalParameterList([
+              AstFactory.simpleFormalParameter4(AstFactory.typeName4('E'), 'e')
+            ]),
+            null));
+    declaration.name.staticElement = elementF;
+    _resolveNode(declaration, []);
+    expect(declaration.returnType.type, elementE.type);
+    SimpleFormalParameter parameter =
+        declaration.functionExpression.parameters.parameters[0];
+    expect(parameter.type.type, elementE.type);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionTypedFormalParameter() {
+    // R f(R g(P p)) {}
+    // class R {}
+    // class P {}
+    ClassElement elementR = ElementFactory.classElement2('R');
+    ClassElement elementP = ElementFactory.classElement2('P');
+    FunctionElement elementF = ElementFactory.functionElement('f');
+    ParameterElementImpl requiredParameter =
+        ElementFactory.requiredParameter('p');
+    FunctionTypedFormalParameter parameterDeclaration = AstFactory
+        .functionTypedFormalParameter(AstFactory.typeName4('R'), 'g', [
+      AstFactory.simpleFormalParameter4(AstFactory.typeName4('P'), 'p')
+    ]);
+    parameterDeclaration.identifier.staticElement = requiredParameter;
+    FunctionDeclaration declaration = AstFactory.functionDeclaration(
+        AstFactory.typeName4('R'),
+        null,
+        'f',
+        AstFactory.functionExpression2(
+            AstFactory.formalParameterList([parameterDeclaration]), null));
+    declaration.name.staticElement = elementF;
+    _resolveNode(declaration, [elementR, elementP]);
+    expect(declaration.returnType.type, elementR.type);
+    FunctionTypedFormalParameter parameter =
+        declaration.functionExpression.parameters.parameters[0];
+    expect(parameter.returnType.type, elementR.type);
+    SimpleFormalParameter innerParameter = parameter.parameters.parameters[0];
+    expect(innerParameter.type.type, elementP.type);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitFunctionTypedFormalParameter_typeParameter() {
+    // R f(R g<E>(E e)) {}
+    // class R {}
+    ClassElement elementR = ElementFactory.classElement2('R');
+    TypeParameterElement elementE = ElementFactory.typeParameterElement('E');
+    FunctionElement elementF = ElementFactory.functionElement('f');
+    ParameterElementImpl requiredParameter =
+        ElementFactory.requiredParameter('g');
+    requiredParameter.typeParameters = <TypeParameterElement>[elementE];
+    FunctionTypedFormalParameter parameterDeclaration = AstFactory
+        .functionTypedFormalParameter(AstFactory.typeName4('R'), 'g', [
+      AstFactory.simpleFormalParameter4(AstFactory.typeName4('E'), 'e')
+    ]);
+    parameterDeclaration.identifier.staticElement = requiredParameter;
+    FunctionDeclaration declaration = AstFactory.functionDeclaration(
+        AstFactory.typeName4('R'),
+        null,
+        'f',
+        AstFactory.functionExpression2(
+            AstFactory.formalParameterList([parameterDeclaration]), null));
+    declaration.name.staticElement = elementF;
+    _resolveNode(declaration, [elementR]);
+    expect(declaration.returnType.type, elementR.type);
+    FunctionTypedFormalParameter parameter =
+        declaration.functionExpression.parameters.parameters[0];
+    expect(parameter.returnType.type, elementR.type);
+    SimpleFormalParameter innerParameter = parameter.parameters.parameters[0];
+    expect(innerParameter.type.type, elementE.type);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitMethodDeclaration() {
+    // class A {
+    //   R m(P p) {}
+    // }
+    // class R {}
+    // class P {}
+    ClassElementImpl elementA = ElementFactory.classElement2('A');
+    ClassElement elementR = ElementFactory.classElement2('R');
+    ClassElement elementP = ElementFactory.classElement2('P');
+    MethodElement elementM = ElementFactory.methodElement('m', null);
+    elementA.methods = <MethodElement>[elementM];
+    MethodDeclaration declaration = AstFactory.methodDeclaration(
+        null,
+        AstFactory.typeName4('R'),
+        null,
+        null,
+        AstFactory.identifier3('m'),
+        AstFactory.formalParameterList([
+          AstFactory.simpleFormalParameter4(AstFactory.typeName4('P'), 'p')
+        ]));
+    declaration.name.staticElement = elementM;
+    _resolveNode(declaration, [elementA, elementR, elementP]);
+    expect(declaration.returnType.type, elementR.type);
+    SimpleFormalParameter parameter = declaration.parameters.parameters[0];
+    expect(parameter.type.type, elementP.type);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitMethodDeclaration_typeParameter() {
+    // class A {
+    //   E m<E>(E e) {}
+    // }
+    ClassElementImpl elementA = ElementFactory.classElement2('A');
+    TypeParameterElement elementE = ElementFactory.typeParameterElement('E');
+    MethodElementImpl elementM = ElementFactory.methodElement('m', null);
+    elementM.typeParameters = <TypeParameterElement>[elementE];
+    elementA.methods = <MethodElement>[elementM];
+    MethodDeclaration declaration = AstFactory.methodDeclaration(
+        null,
+        AstFactory.typeName4('E'),
+        null,
+        null,
+        AstFactory.identifier3('m'),
+        AstFactory.formalParameterList([
+          AstFactory.simpleFormalParameter4(AstFactory.typeName4('E'), 'e')
+        ]));
+    declaration.name.staticElement = elementM;
+    _resolveNode(declaration, [elementA]);
+    expect(declaration.returnType.type, elementE.type);
+    SimpleFormalParameter parameter = declaration.parameters.parameters[0];
+    expect(parameter.type.type, elementE.type);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSimpleFormalParameter_noType() {
+    // p
+    FormalParameter node = AstFactory.simpleFormalParameter3("p");
+    node.identifier.staticElement =
+        new ParameterElementImpl.forNode(AstFactory.identifier3("p"));
+    expect(_resolveFormalParameter(node), same(_typeProvider.dynamicType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitSimpleFormalParameter_type() {
+    // int p
+    InterfaceType intType = _typeProvider.intType;
+    ClassElement intElement = intType.element;
+    FormalParameter node =
+        AstFactory.simpleFormalParameter4(AstFactory.typeName(intElement), "p");
+    SimpleIdentifier identifier = node.identifier;
+    ParameterElementImpl element = new ParameterElementImpl.forNode(identifier);
+    identifier.staticElement = element;
+    expect(_resolveFormalParameter(node, [intElement]), same(intType));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitTypeName_noParameters_noArguments() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    TypeName typeName = AstFactory.typeName(classA);
+    typeName.type = null;
+    _resolveNode(typeName, [classA]);
+    expect(typeName.type, same(classA.type));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitTypeName_parameters_arguments() {
+    ClassElement classA = ElementFactory.classElement2("A", ["E"]);
+    ClassElement classB = ElementFactory.classElement2("B");
+    TypeName typeName =
+        AstFactory.typeName(classA, [AstFactory.typeName(classB)]);
+    typeName.type = null;
+    _resolveNode(typeName, [classA, classB]);
+    InterfaceType resultType = typeName.type as InterfaceType;
+    expect(resultType.element, same(classA));
+    List<DartType> resultArguments = resultType.typeArguments;
+    expect(resultArguments, hasLength(1));
+    expect(resultArguments[0], same(classB.type));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitTypeName_parameters_noArguments() {
+    ClassElement classA = ElementFactory.classElement2("A", ["E"]);
+    TypeName typeName = AstFactory.typeName(classA);
+    typeName.type = null;
+    _resolveNode(typeName, [classA]);
+    InterfaceType resultType = typeName.type as InterfaceType;
+    expect(resultType.element, same(classA));
+    List<DartType> resultArguments = resultType.typeArguments;
+    expect(resultArguments, hasLength(1));
+    expect(resultArguments[0], same(DynamicTypeImpl.instance));
+    _listener.assertNoErrors();
+  }
+
+  void test_visitTypeName_void() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    TypeName typeName = AstFactory.typeName4("void");
+    _resolveNode(typeName, [classA]);
+    expect(typeName.type, same(VoidTypeImpl.instance));
+    _listener.assertNoErrors();
+  }
+
+  /**
+   * Analyze the given catch clause and assert that the types of the parameters have been set to the
+   * given types. The types can be null if the catch clause does not have the corresponding
+   * parameter.
+   *
+   * @param node the catch clause to be analyzed
+   * @param exceptionType the expected type of the exception parameter
+   * @param stackTraceType the expected type of the stack trace parameter
+   * @param definedElements the elements that are to be defined in the scope in which the element is
+   *          being resolved
+   */
+  void _resolveCatchClause(
+      CatchClause node, DartType exceptionType, InterfaceType stackTraceType,
+      [List<Element> definedElements]) {
+    _resolveNode(node, definedElements);
+    SimpleIdentifier exceptionParameter = node.exceptionParameter;
+    if (exceptionParameter != null) {
+      expect(exceptionParameter.staticType, same(exceptionType));
+    }
+    SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
+    if (stackTraceParameter != null) {
+      expect(stackTraceParameter.staticType, same(stackTraceType));
+    }
+  }
+
+  /**
+   * Return the type associated with the given parameter after the static type analyzer has computed
+   * a type for it.
+   *
+   * @param node the parameter with which the type is associated
+   * @param definedElements the elements that are to be defined in the scope in which the element is
+   *          being resolved
+   * @return the type associated with the parameter
+   */
+  DartType _resolveFormalParameter(FormalParameter node,
+      [List<Element> definedElements]) {
+    _resolveNode(node, definedElements);
+    return (node.identifier.staticElement as ParameterElement).type;
+  }
+
+  /**
+   * Return the element associated with the given identifier after the resolver has resolved the
+   * identifier.
+   *
+   * @param node the expression to be resolved
+   * @param definedElements the elements that are to be defined in the scope in which the element is
+   *          being resolved
+   * @return the element to which the expression was resolved
+   */
+  void _resolveNode(AstNode node, [List<Element> definedElements]) {
+    if (definedElements != null) {
+      for (Element element in definedElements) {
+        _library.libraryScope.define(element);
+      }
+    }
+    node.accept(_visitor);
+  }
+}
+
+class _AnalysisContextFactory_initContextWithCore
+    extends DirectoryBasedDartSdk {
+  _AnalysisContextFactory_initContextWithCore(JavaFile arg0) : super(arg0);
+
+  @override
+  LibraryMap initialLibraryMap(bool useDart2jsPaths) {
+    LibraryMap map = new LibraryMap();
+    _addLibrary(map, DartSdk.DART_ASYNC, false, "async.dart");
+    _addLibrary(map, DartSdk.DART_CORE, false, "core.dart");
+    _addLibrary(map, DartSdk.DART_HTML, false, "html_dartium.dart");
+    _addLibrary(map, AnalysisContextFactory._DART_MATH, false, "math.dart");
+    _addLibrary(map, AnalysisContextFactory._DART_INTERCEPTORS, true,
+        "_interceptors.dart");
+    _addLibrary(
+        map, AnalysisContextFactory._DART_JS_HELPER, true, "_js_helper.dart");
+    return map;
+  }
+
+  void _addLibrary(LibraryMap map, String uri, bool isInternal, String path) {
+    SdkLibraryImpl library = new SdkLibraryImpl(uri);
+    if (isInternal) {
+      library.category = "Internal";
+    }
+    library.path = path;
+    map.setLibrary(uri, library);
+  }
+}
+
+class _SimpleResolverTest_localVariable_types_invoked
+    extends RecursiveAstVisitor<Object> {
+  final SimpleResolverTest test;
+
+  List<bool> found;
+
+  List<CaughtException> thrownException;
+
+  _SimpleResolverTest_localVariable_types_invoked(
+      this.test, this.found, this.thrownException)
+      : super();
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    if (node.name == "myVar" && node.parent is MethodInvocation) {
+      try {
+        found[0] = true;
+        // check static type
+        DartType staticType = node.staticType;
+        expect(staticType, same(test.typeProvider.dynamicType));
+        // check propagated type
+        FunctionType propagatedType = node.propagatedType as FunctionType;
+        expect(propagatedType.returnType, test.typeProvider.stringType);
+      } on AnalysisException catch (e, stackTrace) {
+        thrownException[0] = new CaughtException(e, stackTrace);
+      }
+    }
+    return null;
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/scanner_test.dart b/mojo/public/dart/third_party/analyzer/test/generated/scanner_test.dart
new file mode 100644
index 0000000..119d4aa
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/generated/scanner_test.dart
@@ -0,0 +1,1399 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.scanner_test;
+
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+import '../utils.dart';
+import 'test_support.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(CharSequenceReaderTest);
+  runReflectiveTests(KeywordStateTest);
+  runReflectiveTests(ScannerTest);
+  runReflectiveTests(TokenTypeTest);
+}
+
+class CharacterRangeReaderTest extends EngineTestCase {
+  void test_advance() {
+    CharSequenceReader baseReader = new CharSequenceReader("xyzzy");
+    CharacterRangeReader reader = new CharacterRangeReader(baseReader, 1, 4);
+    expect(reader.advance(), 0x79);
+    expect(reader.advance(), 0x80);
+    expect(reader.advance(), 0x80);
+    expect(reader.advance(), -1);
+    expect(reader.advance(), -1);
+  }
+
+  void test_creation() {
+    CharSequenceReader baseReader = new CharSequenceReader("xyzzy");
+    CharacterRangeReader reader = new CharacterRangeReader(baseReader, 1, 4);
+    expect(reader, isNotNull);
+  }
+
+  void test_getOffset() {
+    CharSequenceReader baseReader = new CharSequenceReader("xyzzy");
+    CharacterRangeReader reader = new CharacterRangeReader(baseReader, 1, 2);
+    expect(reader.offset, 1);
+    reader.advance();
+    expect(reader.offset, 2);
+    reader.advance();
+    expect(reader.offset, 2);
+  }
+
+  void test_getString() {
+    CharSequenceReader baseReader = new CharSequenceReader("__xyzzy__");
+    CharacterRangeReader reader = new CharacterRangeReader(baseReader, 2, 7);
+    reader.offset = 5;
+    expect(reader.getString(3, 0), "yzz");
+    expect(reader.getString(4, 1), "zzy");
+  }
+
+  void test_peek() {
+    CharSequenceReader baseReader = new CharSequenceReader("xyzzy");
+    CharacterRangeReader reader = new CharacterRangeReader(baseReader, 1, 3);
+    expect(reader.peek(), 0x79);
+    expect(reader.peek(), 0x79);
+    reader.advance();
+    expect(reader.peek(), 0x80);
+    expect(reader.peek(), 0x80);
+    reader.advance();
+    expect(reader.peek(), -1);
+    expect(reader.peek(), -1);
+  }
+
+  void test_setOffset() {
+    CharSequenceReader baseReader = new CharSequenceReader("xyzzy");
+    CharacterRangeReader reader = new CharacterRangeReader(baseReader, 1, 4);
+    reader.offset = 2;
+    expect(reader.offset, 2);
+  }
+}
+
+@reflectiveTest
+class CharSequenceReaderTest {
+  void test_advance() {
+    CharSequenceReader reader = new CharSequenceReader("x");
+    expect(reader.advance(), 0x78);
+    expect(reader.advance(), -1);
+    expect(reader.advance(), -1);
+  }
+
+  void test_creation() {
+    expect(new CharSequenceReader("x"), isNotNull);
+  }
+
+  void test_getOffset() {
+    CharSequenceReader reader = new CharSequenceReader("x");
+    expect(reader.offset, -1);
+    reader.advance();
+    expect(reader.offset, 0);
+    reader.advance();
+    expect(reader.offset, 0);
+  }
+
+  void test_getString() {
+    CharSequenceReader reader = new CharSequenceReader("xyzzy");
+    reader.offset = 3;
+    expect(reader.getString(1, 0), "yzz");
+    expect(reader.getString(2, 1), "zzy");
+  }
+
+  void test_peek() {
+    CharSequenceReader reader = new CharSequenceReader("xy");
+    expect(reader.peek(), 0x78);
+    expect(reader.peek(), 0x78);
+    reader.advance();
+    expect(reader.peek(), 0x79);
+    expect(reader.peek(), 0x79);
+    reader.advance();
+    expect(reader.peek(), -1);
+    expect(reader.peek(), -1);
+  }
+
+  void test_setOffset() {
+    CharSequenceReader reader = new CharSequenceReader("xyz");
+    reader.offset = 2;
+    expect(reader.offset, 2);
+  }
+}
+
+@reflectiveTest
+class KeywordStateTest {
+  void test_KeywordState() {
+    //
+    // Generate the test data to be scanned.
+    //
+    List<Keyword> keywords = Keyword.values;
+    int keywordCount = keywords.length;
+    List<String> textToTest = new List<String>(keywordCount * 3);
+    for (int i = 0; i < keywordCount; i++) {
+      String syntax = keywords[i].syntax;
+      textToTest[i] = syntax;
+      textToTest[i + keywordCount] = "${syntax}x";
+      textToTest[i + keywordCount * 2] = syntax.substring(0, syntax.length - 1);
+    }
+    //
+    // Scan each of the identifiers.
+    //
+    KeywordState firstState = KeywordState.KEYWORD_STATE;
+    for (int i = 0; i < textToTest.length; i++) {
+      String text = textToTest[i];
+      int index = 0;
+      int length = text.length;
+      KeywordState state = firstState;
+      while (index < length && state != null) {
+        state = state.next(text.codeUnitAt(index));
+        index++;
+      }
+      if (i < keywordCount) {
+        // keyword
+        expect(state, isNotNull);
+        expect(state.keyword(), isNotNull);
+        expect(state.keyword(), keywords[i]);
+      } else if (i < keywordCount * 2) {
+        // keyword + "x"
+        expect(state, isNull);
+      } else {
+        // keyword.substring(0, keyword.length() - 1)
+        expect(state, isNotNull);
+      }
+    }
+  }
+}
+
+@reflectiveTest
+class ScannerTest {
+  void fail_incomplete_string_interpolation() {
+    // https://code.google.com/p/dart/issues/detail?id=18073
+    _assertErrorAndTokens(
+        ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 9, "\"foo \${bar", [
+      new StringToken(TokenType.STRING, "\"foo ", 0),
+      new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 5),
+      new StringToken(TokenType.IDENTIFIER, "bar", 7)
+    ]);
+  }
+
+  void test_ampersand() {
+    _assertToken(TokenType.AMPERSAND, "&");
+  }
+
+  void test_ampersand_ampersand() {
+    _assertToken(TokenType.AMPERSAND_AMPERSAND, "&&");
+  }
+
+  void test_ampersand_eq() {
+    _assertToken(TokenType.AMPERSAND_EQ, "&=");
+  }
+
+  void test_at() {
+    _assertToken(TokenType.AT, "@");
+  }
+
+  void test_backping() {
+    _assertToken(TokenType.BACKPING, "`");
+  }
+
+  void test_backslash() {
+    _assertToken(TokenType.BACKSLASH, "\\");
+  }
+
+  void test_bang() {
+    _assertToken(TokenType.BANG, "!");
+  }
+
+  void test_bang_eq() {
+    _assertToken(TokenType.BANG_EQ, "!=");
+  }
+
+  void test_bar() {
+    _assertToken(TokenType.BAR, "|");
+  }
+
+  void test_bar_bar() {
+    _assertToken(TokenType.BAR_BAR, "||");
+  }
+
+  void test_bar_eq() {
+    _assertToken(TokenType.BAR_EQ, "|=");
+  }
+
+  void test_caret() {
+    _assertToken(TokenType.CARET, "^");
+  }
+
+  void test_caret_eq() {
+    _assertToken(TokenType.CARET_EQ, "^=");
+  }
+
+  void test_close_curly_bracket() {
+    _assertToken(TokenType.CLOSE_CURLY_BRACKET, "}");
+  }
+
+  void test_close_paren() {
+    _assertToken(TokenType.CLOSE_PAREN, ")");
+  }
+
+  void test_close_quare_bracket() {
+    _assertToken(TokenType.CLOSE_SQUARE_BRACKET, "]");
+  }
+
+  void test_colon() {
+    _assertToken(TokenType.COLON, ":");
+  }
+
+  void test_comma() {
+    _assertToken(TokenType.COMMA, ",");
+  }
+
+  void test_comment_disabled_multi() {
+    Scanner scanner = new Scanner(
+        null,
+        new CharSequenceReader("/* comment */ "),
+        AnalysisErrorListener.NULL_LISTENER);
+    scanner.preserveComments = false;
+    Token token = scanner.tokenize();
+    expect(token, isNotNull);
+    expect(token.precedingComments, isNull);
+  }
+
+  void test_comment_multi() {
+    _assertComment(TokenType.MULTI_LINE_COMMENT, "/* comment */");
+  }
+
+  void test_comment_multi_lineEnds() {
+    String code = r'''
+/**
+ * aa
+ * bbb
+ * c
+ */''';
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scanner scanner = new Scanner(null, new CharSequenceReader(code), listener);
+    scanner.tokenize();
+    expect(
+        scanner.lineStarts,
+        equals(<int>[
+          code.indexOf('/**'),
+          code.indexOf(' * aa'),
+          code.indexOf(' * bbb'),
+          code.indexOf(' * c'),
+          code.indexOf(' */')
+        ]));
+  }
+
+  void test_comment_multi_unterminated() {
+    _assertError(ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT, 3, "/* x");
+  }
+
+  void test_comment_nested() {
+    _assertComment(
+        TokenType.MULTI_LINE_COMMENT, "/* comment /* within a */ comment */");
+  }
+
+  void test_comment_single() {
+    _assertComment(TokenType.SINGLE_LINE_COMMENT, "// comment");
+  }
+
+  void test_double_both_E() {
+    _assertToken(TokenType.DOUBLE, "0.123E4");
+  }
+
+  void test_double_both_e() {
+    _assertToken(TokenType.DOUBLE, "0.123e4");
+  }
+
+  void test_double_fraction() {
+    _assertToken(TokenType.DOUBLE, ".123");
+  }
+
+  void test_double_fraction_E() {
+    _assertToken(TokenType.DOUBLE, ".123E4");
+  }
+
+  void test_double_fraction_e() {
+    _assertToken(TokenType.DOUBLE, ".123e4");
+  }
+
+  void test_double_missingDigitInExponent() {
+    _assertError(ScannerErrorCode.MISSING_DIGIT, 1, "1e");
+  }
+
+  void test_double_whole_E() {
+    _assertToken(TokenType.DOUBLE, "12E4");
+  }
+
+  void test_double_whole_e() {
+    _assertToken(TokenType.DOUBLE, "12e4");
+  }
+
+  void test_eq() {
+    _assertToken(TokenType.EQ, "=");
+  }
+
+  void test_eq_eq() {
+    _assertToken(TokenType.EQ_EQ, "==");
+  }
+
+  void test_gt() {
+    _assertToken(TokenType.GT, ">");
+  }
+
+  void test_gt_eq() {
+    _assertToken(TokenType.GT_EQ, ">=");
+  }
+
+  void test_gt_gt() {
+    _assertToken(TokenType.GT_GT, ">>");
+  }
+
+  void test_gt_gt_eq() {
+    _assertToken(TokenType.GT_GT_EQ, ">>=");
+  }
+
+  void test_hash() {
+    _assertToken(TokenType.HASH, "#");
+  }
+
+  void test_hexidecimal() {
+    _assertToken(TokenType.HEXADECIMAL, "0x1A2B3C");
+  }
+
+  void test_hexidecimal_missingDigit() {
+    _assertError(ScannerErrorCode.MISSING_HEX_DIGIT, 1, "0x");
+  }
+
+  void test_identifier() {
+    _assertToken(TokenType.IDENTIFIER, "result");
+  }
+
+  void test_illegalChar_cyrillicLetter_middle() {
+    _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 5, "Shche\u0433lov");
+  }
+
+  void test_illegalChar_cyrillicLetter_start() {
+    _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0429");
+  }
+
+  void test_illegalChar_nbsp() {
+    _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u00A0");
+  }
+
+  void test_illegalChar_notLetter() {
+    _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0312");
+  }
+
+  void test_index() {
+    _assertToken(TokenType.INDEX, "[]");
+  }
+
+  void test_index_eq() {
+    _assertToken(TokenType.INDEX_EQ, "[]=");
+  }
+
+  void test_int() {
+    _assertToken(TokenType.INT, "123");
+  }
+
+  void test_int_initialZero() {
+    _assertToken(TokenType.INT, "0123");
+  }
+
+  void test_keyword_abstract() {
+    _assertKeywordToken("abstract");
+  }
+
+  void test_keyword_as() {
+    _assertKeywordToken("as");
+  }
+
+  void test_keyword_assert() {
+    _assertKeywordToken("assert");
+  }
+
+  void test_keyword_break() {
+    _assertKeywordToken("break");
+  }
+
+  void test_keyword_case() {
+    _assertKeywordToken("case");
+  }
+
+  void test_keyword_catch() {
+    _assertKeywordToken("catch");
+  }
+
+  void test_keyword_class() {
+    _assertKeywordToken("class");
+  }
+
+  void test_keyword_const() {
+    _assertKeywordToken("const");
+  }
+
+  void test_keyword_continue() {
+    _assertKeywordToken("continue");
+  }
+
+  void test_keyword_default() {
+    _assertKeywordToken("default");
+  }
+
+  void test_keyword_deferred() {
+    _assertKeywordToken("deferred");
+  }
+
+  void test_keyword_do() {
+    _assertKeywordToken("do");
+  }
+
+  void test_keyword_dynamic() {
+    _assertKeywordToken("dynamic");
+  }
+
+  void test_keyword_else() {
+    _assertKeywordToken("else");
+  }
+
+  void test_keyword_enum() {
+    _assertKeywordToken("enum");
+  }
+
+  void test_keyword_export() {
+    _assertKeywordToken("export");
+  }
+
+  void test_keyword_extends() {
+    _assertKeywordToken("extends");
+  }
+
+  void test_keyword_factory() {
+    _assertKeywordToken("factory");
+  }
+
+  void test_keyword_false() {
+    _assertKeywordToken("false");
+  }
+
+  void test_keyword_final() {
+    _assertKeywordToken("final");
+  }
+
+  void test_keyword_finally() {
+    _assertKeywordToken("finally");
+  }
+
+  void test_keyword_for() {
+    _assertKeywordToken("for");
+  }
+
+  void test_keyword_get() {
+    _assertKeywordToken("get");
+  }
+
+  void test_keyword_if() {
+    _assertKeywordToken("if");
+  }
+
+  void test_keyword_implements() {
+    _assertKeywordToken("implements");
+  }
+
+  void test_keyword_import() {
+    _assertKeywordToken("import");
+  }
+
+  void test_keyword_in() {
+    _assertKeywordToken("in");
+  }
+
+  void test_keyword_is() {
+    _assertKeywordToken("is");
+  }
+
+  void test_keyword_library() {
+    _assertKeywordToken("library");
+  }
+
+  void test_keyword_new() {
+    _assertKeywordToken("new");
+  }
+
+  void test_keyword_null() {
+    _assertKeywordToken("null");
+  }
+
+  void test_keyword_operator() {
+    _assertKeywordToken("operator");
+  }
+
+  void test_keyword_part() {
+    _assertKeywordToken("part");
+  }
+
+  void test_keyword_rethrow() {
+    _assertKeywordToken("rethrow");
+  }
+
+  void test_keyword_return() {
+    _assertKeywordToken("return");
+  }
+
+  void test_keyword_set() {
+    _assertKeywordToken("set");
+  }
+
+  void test_keyword_static() {
+    _assertKeywordToken("static");
+  }
+
+  void test_keyword_super() {
+    _assertKeywordToken("super");
+  }
+
+  void test_keyword_switch() {
+    _assertKeywordToken("switch");
+  }
+
+  void test_keyword_this() {
+    _assertKeywordToken("this");
+  }
+
+  void test_keyword_throw() {
+    _assertKeywordToken("throw");
+  }
+
+  void test_keyword_true() {
+    _assertKeywordToken("true");
+  }
+
+  void test_keyword_try() {
+    _assertKeywordToken("try");
+  }
+
+  void test_keyword_typedef() {
+    _assertKeywordToken("typedef");
+  }
+
+  void test_keyword_var() {
+    _assertKeywordToken("var");
+  }
+
+  void test_keyword_void() {
+    _assertKeywordToken("void");
+  }
+
+  void test_keyword_while() {
+    _assertKeywordToken("while");
+  }
+
+  void test_keyword_with() {
+    _assertKeywordToken("with");
+  }
+
+  void test_lineInfo_multilineComment() {
+    String source = "/*\r *\r */";
+    _assertLineInfo(source, [
+      new ScannerTest_ExpectedLocation(0, 1, 1),
+      new ScannerTest_ExpectedLocation(4, 2, 2),
+      new ScannerTest_ExpectedLocation(source.length - 1, 3, 3)
+    ]);
+  }
+
+  void test_lineInfo_multilineString() {
+    String source = "'''a\r\nbc\r\nd'''";
+    _assertLineInfo(source, [
+      new ScannerTest_ExpectedLocation(0, 1, 1),
+      new ScannerTest_ExpectedLocation(7, 2, 2),
+      new ScannerTest_ExpectedLocation(source.length - 1, 3, 4)
+    ]);
+  }
+
+  void test_lineInfo_multilineString_raw() {
+    String source = "var a = r'''\nblah\n''';\n\nfoo";
+    _assertLineInfo(source, [
+      new ScannerTest_ExpectedLocation(0, 1, 1),
+      new ScannerTest_ExpectedLocation(14, 2, 2),
+      new ScannerTest_ExpectedLocation(source.length - 2, 5, 2)
+    ]);
+  }
+
+  void test_lineInfo_simpleClass() {
+    String source =
+        "class Test {\r\n    String s = '...';\r\n    int get x => s.MISSING_GETTER;\r\n}";
+    _assertLineInfo(source, [
+      new ScannerTest_ExpectedLocation(0, 1, 1),
+      new ScannerTest_ExpectedLocation(source.indexOf("MISSING_GETTER"), 3, 20),
+      new ScannerTest_ExpectedLocation(source.length - 1, 4, 1)
+    ]);
+  }
+
+  void test_lineInfo_slashN() {
+    String source = "class Test {\n}";
+    _assertLineInfo(source, [
+      new ScannerTest_ExpectedLocation(0, 1, 1),
+      new ScannerTest_ExpectedLocation(source.indexOf("}"), 2, 1)
+    ]);
+  }
+
+  void test_lt() {
+    _assertToken(TokenType.LT, "<");
+  }
+
+  void test_lt_eq() {
+    _assertToken(TokenType.LT_EQ, "<=");
+  }
+
+  void test_lt_lt() {
+    _assertToken(TokenType.LT_LT, "<<");
+  }
+
+  void test_lt_lt_eq() {
+    _assertToken(TokenType.LT_LT_EQ, "<<=");
+  }
+
+  void test_minus() {
+    _assertToken(TokenType.MINUS, "-");
+  }
+
+  void test_minus_eq() {
+    _assertToken(TokenType.MINUS_EQ, "-=");
+  }
+
+  void test_minus_minus() {
+    _assertToken(TokenType.MINUS_MINUS, "--");
+  }
+
+  void test_open_curly_bracket() {
+    _assertToken(TokenType.OPEN_CURLY_BRACKET, "{");
+  }
+
+  void test_open_paren() {
+    _assertToken(TokenType.OPEN_PAREN, "(");
+  }
+
+  void test_open_square_bracket() {
+    _assertToken(TokenType.OPEN_SQUARE_BRACKET, "[");
+  }
+
+  void test_openSquareBracket() {
+    _assertToken(TokenType.OPEN_SQUARE_BRACKET, "[");
+  }
+
+  void test_percent() {
+    _assertToken(TokenType.PERCENT, "%");
+  }
+
+  void test_percent_eq() {
+    _assertToken(TokenType.PERCENT_EQ, "%=");
+  }
+
+  void test_period() {
+    _assertToken(TokenType.PERIOD, ".");
+  }
+
+  void test_period_period() {
+    _assertToken(TokenType.PERIOD_PERIOD, "..");
+  }
+
+  void test_period_period_period() {
+    _assertToken(TokenType.PERIOD_PERIOD_PERIOD, "...");
+  }
+
+  void test_periodAfterNumberNotIncluded_identifier() {
+    _assertTokens("42.isEven()", [
+      new StringToken(TokenType.INT, "42", 0),
+      new Token(TokenType.PERIOD, 2),
+      new StringToken(TokenType.IDENTIFIER, "isEven", 3),
+      new Token(TokenType.OPEN_PAREN, 9),
+      new Token(TokenType.CLOSE_PAREN, 10)
+    ]);
+  }
+
+  void test_periodAfterNumberNotIncluded_period() {
+    _assertTokens("42..isEven()", [
+      new StringToken(TokenType.INT, "42", 0),
+      new Token(TokenType.PERIOD_PERIOD, 2),
+      new StringToken(TokenType.IDENTIFIER, "isEven", 4),
+      new Token(TokenType.OPEN_PAREN, 10),
+      new Token(TokenType.CLOSE_PAREN, 11)
+    ]);
+  }
+
+  void test_plus() {
+    _assertToken(TokenType.PLUS, "+");
+  }
+
+  void test_plus_eq() {
+    _assertToken(TokenType.PLUS_EQ, "+=");
+  }
+
+  void test_plus_plus() {
+    _assertToken(TokenType.PLUS_PLUS, "++");
+  }
+
+  void test_question() {
+    _assertToken(TokenType.QUESTION, "?");
+  }
+
+  void test_question_dot() {
+    _assertToken(TokenType.QUESTION_PERIOD, "?.");
+  }
+
+  void test_question_question() {
+    _assertToken(TokenType.QUESTION_QUESTION, "??");
+  }
+
+  void test_question_question_eq() {
+    _assertToken(TokenType.QUESTION_QUESTION_EQ, "??=");
+  }
+
+  void test_scriptTag_withArgs() {
+    _assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart -debug");
+  }
+
+  void test_scriptTag_withoutSpace() {
+    _assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart");
+  }
+
+  void test_scriptTag_withSpace() {
+    _assertToken(TokenType.SCRIPT_TAG, "#! /bin/dart");
+  }
+
+  void test_semicolon() {
+    _assertToken(TokenType.SEMICOLON, ";");
+  }
+
+  void test_setSourceStart() {
+    int offsetDelta = 42;
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scanner scanner =
+        new Scanner(null, new SubSequenceReader("a", offsetDelta), listener);
+    scanner.setSourceStart(3, 9);
+    scanner.tokenize();
+    List<int> lineStarts = scanner.lineStarts;
+    expect(lineStarts, isNotNull);
+    expect(lineStarts.length, 3);
+    expect(lineStarts[2], 33);
+  }
+
+  void test_slash() {
+    _assertToken(TokenType.SLASH, "/");
+  }
+
+  void test_slash_eq() {
+    _assertToken(TokenType.SLASH_EQ, "/=");
+  }
+
+  void test_star() {
+    _assertToken(TokenType.STAR, "*");
+  }
+
+  void test_star_eq() {
+    _assertToken(TokenType.STAR_EQ, "*=");
+  }
+
+  void test_startAndEnd() {
+    Token token = _scan("a");
+    Token previous = token.previous;
+    expect(previous.next, token);
+    expect(previous.previous, previous);
+    Token next = token.next;
+    expect(next.next, next);
+    expect(next.previous, token);
+  }
+
+  void test_string_multi_double() {
+    _assertToken(TokenType.STRING, "\"\"\"line1\nline2\"\"\"");
+  }
+
+  void test_string_multi_embeddedQuotes() {
+    _assertToken(TokenType.STRING, "\"\"\"line1\n\"\"\nline2\"\"\"");
+  }
+
+  void test_string_multi_embeddedQuotes_escapedChar() {
+    _assertToken(TokenType.STRING, "\"\"\"a\"\"\\tb\"\"\"");
+  }
+
+  void test_string_multi_interpolation_block() {
+    _assertTokens("\"Hello \${name}!\"", [
+      new StringToken(TokenType.STRING, "\"Hello ", 0),
+      new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 7),
+      new StringToken(TokenType.IDENTIFIER, "name", 9),
+      new Token(TokenType.CLOSE_CURLY_BRACKET, 13),
+      new StringToken(TokenType.STRING, "!\"", 14)
+    ]);
+  }
+
+  void test_string_multi_interpolation_identifier() {
+    _assertTokens("\"Hello \$name!\"", [
+      new StringToken(TokenType.STRING, "\"Hello ", 0),
+      new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 7),
+      new StringToken(TokenType.IDENTIFIER, "name", 8),
+      new StringToken(TokenType.STRING, "!\"", 12)
+    ]);
+  }
+
+  void test_string_multi_single() {
+    _assertToken(TokenType.STRING, "'''string'''");
+  }
+
+  void test_string_multi_slashEnter() {
+    _assertToken(TokenType.STRING, "'''\\\n'''");
+  }
+
+  void test_string_multi_unterminated() {
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8,
+        "'''string", [new StringToken(TokenType.STRING, "'''string", 0)]);
+  }
+
+  void test_string_multi_unterminated_interpolation_block() {
+    _assertErrorAndTokens(
+        ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "'''\${name", [
+      new StringToken(TokenType.STRING, "'''", 0),
+      new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 3),
+      new StringToken(TokenType.IDENTIFIER, "name", 5),
+      new StringToken(TokenType.STRING, "", 9)
+    ]);
+  }
+
+  void test_string_multi_unterminated_interpolation_identifier() {
+    _assertErrorAndTokens(
+        ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "'''\$name", [
+      new StringToken(TokenType.STRING, "'''", 0),
+      new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 3),
+      new StringToken(TokenType.IDENTIFIER, "name", 4),
+      new StringToken(TokenType.STRING, "", 8)
+    ]);
+  }
+
+  void test_string_raw_multi_double() {
+    _assertToken(TokenType.STRING, "r\"\"\"line1\nline2\"\"\"");
+  }
+
+  void test_string_raw_multi_single() {
+    _assertToken(TokenType.STRING, "r'''string'''");
+  }
+
+  void test_string_raw_multi_unterminated() {
+    String source = "r'''string";
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 9,
+        source, [new StringToken(TokenType.STRING, source, 0)]);
+  }
+
+  void test_string_raw_simple_double() {
+    _assertToken(TokenType.STRING, "r\"string\"");
+  }
+
+  void test_string_raw_simple_single() {
+    _assertToken(TokenType.STRING, "r'string'");
+  }
+
+  void test_string_raw_simple_unterminated_eof() {
+    String source = "r'string";
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7,
+        source, [new StringToken(TokenType.STRING, source, 0)]);
+  }
+
+  void test_string_raw_simple_unterminated_eol() {
+    String source = "r'string";
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8,
+        "$source\n", [new StringToken(TokenType.STRING, source, 0)]);
+  }
+
+  void test_string_simple_double() {
+    _assertToken(TokenType.STRING, "\"string\"");
+  }
+
+  void test_string_simple_escapedDollar() {
+    _assertToken(TokenType.STRING, "'a\\\$b'");
+  }
+
+  void test_string_simple_interpolation_adjacentIdentifiers() {
+    _assertTokens("'\$a\$b'", [
+      new StringToken(TokenType.STRING, "'", 0),
+      new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1),
+      new StringToken(TokenType.IDENTIFIER, "a", 2),
+      new StringToken(TokenType.STRING, "", 3),
+      new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 3),
+      new StringToken(TokenType.IDENTIFIER, "b", 4),
+      new StringToken(TokenType.STRING, "'", 5)
+    ]);
+  }
+
+  void test_string_simple_interpolation_block() {
+    _assertTokens("'Hello \${name}!'", [
+      new StringToken(TokenType.STRING, "'Hello ", 0),
+      new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 7),
+      new StringToken(TokenType.IDENTIFIER, "name", 9),
+      new Token(TokenType.CLOSE_CURLY_BRACKET, 13),
+      new StringToken(TokenType.STRING, "!'", 14)
+    ]);
+  }
+
+  void test_string_simple_interpolation_blockWithNestedMap() {
+    _assertTokens("'a \${f({'b' : 'c'})} d'", [
+      new StringToken(TokenType.STRING, "'a ", 0),
+      new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 3),
+      new StringToken(TokenType.IDENTIFIER, "f", 5),
+      new Token(TokenType.OPEN_PAREN, 6),
+      new Token(TokenType.OPEN_CURLY_BRACKET, 7),
+      new StringToken(TokenType.STRING, "'b'", 8),
+      new Token(TokenType.COLON, 12),
+      new StringToken(TokenType.STRING, "'c'", 14),
+      new Token(TokenType.CLOSE_CURLY_BRACKET, 17),
+      new Token(TokenType.CLOSE_PAREN, 18),
+      new Token(TokenType.CLOSE_CURLY_BRACKET, 19),
+      new StringToken(TokenType.STRING, " d'", 20)
+    ]);
+  }
+
+  void test_string_simple_interpolation_firstAndLast() {
+    _assertTokens("'\$greeting \$name'", [
+      new StringToken(TokenType.STRING, "'", 0),
+      new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1),
+      new StringToken(TokenType.IDENTIFIER, "greeting", 2),
+      new StringToken(TokenType.STRING, " ", 10),
+      new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 11),
+      new StringToken(TokenType.IDENTIFIER, "name", 12),
+      new StringToken(TokenType.STRING, "'", 16)
+    ]);
+  }
+
+  void test_string_simple_interpolation_identifier() {
+    _assertTokens("'Hello \$name!'", [
+      new StringToken(TokenType.STRING, "'Hello ", 0),
+      new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 7),
+      new StringToken(TokenType.IDENTIFIER, "name", 8),
+      new StringToken(TokenType.STRING, "!'", 12)
+    ]);
+  }
+
+  void test_string_simple_interpolation_missingIdentifier() {
+    _assertTokens("'\$x\$'", [
+      new StringToken(TokenType.STRING, "'", 0),
+      new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1),
+      new StringToken(TokenType.IDENTIFIER, "x", 2),
+      new StringToken(TokenType.STRING, "", 3),
+      new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 3),
+      new StringToken(TokenType.STRING, "'", 4)
+    ]);
+  }
+
+  void test_string_simple_interpolation_nonIdentifier() {
+    _assertTokens("'\$1'", [
+      new StringToken(TokenType.STRING, "'", 0),
+      new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1),
+      new StringToken(TokenType.STRING, "1'", 2)
+    ]);
+  }
+
+  void test_string_simple_single() {
+    _assertToken(TokenType.STRING, "'string'");
+  }
+
+  void test_string_simple_unterminated_eof() {
+    String source = "'string";
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 6,
+        source, [new StringToken(TokenType.STRING, source, 0)]);
+  }
+
+  void test_string_simple_unterminated_eol() {
+    String source = "'string";
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7,
+        "$source\r", [new StringToken(TokenType.STRING, source, 0)]);
+  }
+
+  void test_string_simple_unterminated_interpolation_block() {
+    _assertErrorAndTokens(
+        ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 6, "'\${name", [
+      new StringToken(TokenType.STRING, "'", 0),
+      new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 1),
+      new StringToken(TokenType.IDENTIFIER, "name", 3),
+      new StringToken(TokenType.STRING, "", 7)
+    ]);
+  }
+
+  void test_string_simple_unterminated_interpolation_identifier() {
+    _assertErrorAndTokens(
+        ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 5, "'\$name", [
+      new StringToken(TokenType.STRING, "'", 0),
+      new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1),
+      new StringToken(TokenType.IDENTIFIER, "name", 2),
+      new StringToken(TokenType.STRING, "", 6)
+    ]);
+  }
+
+  void test_tilde() {
+    _assertToken(TokenType.TILDE, "~");
+  }
+
+  void test_tilde_slash() {
+    _assertToken(TokenType.TILDE_SLASH, "~/");
+  }
+
+  void test_tilde_slash_eq() {
+    _assertToken(TokenType.TILDE_SLASH_EQ, "~/=");
+  }
+
+  void test_unclosedPairInInterpolation() {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    _scanWithListener("'\${(}'", listener);
+  }
+
+  void _assertComment(TokenType commentType, String source) {
+    //
+    // Test without a trailing end-of-line marker
+    //
+    Token token = _scan(source);
+    expect(token, isNotNull);
+    expect(token.type, TokenType.EOF);
+    Token comment = token.precedingComments;
+    expect(comment, isNotNull);
+    expect(comment.type, commentType);
+    expect(comment.offset, 0);
+    expect(comment.length, source.length);
+    expect(comment.lexeme, source);
+    //
+    // Test with a trailing end-of-line marker
+    //
+    token = _scan("$source\n");
+    expect(token, isNotNull);
+    expect(token.type, TokenType.EOF);
+    comment = token.precedingComments;
+    expect(comment, isNotNull);
+    expect(comment.type, commentType);
+    expect(comment.offset, 0);
+    expect(comment.length, source.length);
+    expect(comment.lexeme, source);
+  }
+
+  /**
+   * Assert that scanning the given [source] produces an error with the given
+   * code.
+   *
+   * [expectedError] the error that should be produced
+   * [expectedOffset] the string offset that should be associated with the error
+   * [source] the source to be scanned to produce the error
+   */
+  void _assertError(
+      ScannerErrorCode expectedError, int expectedOffset, String source) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    _scanWithListener(source, listener);
+    listener.assertErrors([
+      new AnalysisError(null, expectedOffset, 1, expectedError,
+          [source.codeUnitAt(expectedOffset)])
+    ]);
+  }
+
+  /**
+   * Assert that scanning the given [source] produces an error with the given
+   * code, and also produces the given tokens.
+   *
+   * [expectedError] the error that should be produced
+   * [expectedOffset] the string offset that should be associated with the error
+   * [source] the source to be scanned to produce the error
+   * [expectedTokens] the tokens that are expected to be in the source
+   */
+  void _assertErrorAndTokens(ScannerErrorCode expectedError, int expectedOffset,
+      String source, List<Token> expectedTokens) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Token token = _scanWithListener(source, listener);
+    listener.assertErrors([
+      new AnalysisError(null, expectedOffset, 1, expectedError,
+          [source.codeUnitAt(expectedOffset)])
+    ]);
+    _checkTokens(token, expectedTokens);
+  }
+
+  /**
+   * Assert that when scanned the given [source] contains a single keyword token
+   * with the same lexeme as the original source.
+   */
+  void _assertKeywordToken(String source) {
+    Token token = _scan(source);
+    expect(token, isNotNull);
+    expect(token.type, TokenType.KEYWORD);
+    expect(token.offset, 0);
+    expect(token.length, source.length);
+    expect(token.lexeme, source);
+    Object value = token.value();
+    expect(value is Keyword, isTrue);
+    expect((value as Keyword).syntax, source);
+    token = _scan(" $source ");
+    expect(token, isNotNull);
+    expect(token.type, TokenType.KEYWORD);
+    expect(token.offset, 1);
+    expect(token.length, source.length);
+    expect(token.lexeme, source);
+    value = token.value();
+    expect(value is Keyword, isTrue);
+    expect((value as Keyword).syntax, source);
+    expect(token.next.type, TokenType.EOF);
+  }
+
+  void _assertLineInfo(
+      String source, List<ScannerTest_ExpectedLocation> expectedLocations) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    _scanWithListener(source, listener);
+    listener.assertNoErrors();
+    LineInfo info = listener.getLineInfo(new TestSource());
+    expect(info, isNotNull);
+    int count = expectedLocations.length;
+    for (int i = 0; i < count; i++) {
+      ScannerTest_ExpectedLocation expectedLocation = expectedLocations[i];
+      LineInfo_Location location = info.getLocation(expectedLocation._offset);
+      expect(location.lineNumber, expectedLocation._lineNumber,
+          reason: 'Line number in location $i');
+      expect(location.columnNumber, expectedLocation._columnNumber,
+          reason: 'Column number in location $i');
+    }
+  }
+
+  /**
+   * Assert that the token scanned from the given [source] has the
+   * [expectedType].
+   */
+  Token _assertToken(TokenType expectedType, String source) {
+    Token originalToken = _scan(source);
+    expect(originalToken, isNotNull);
+    expect(originalToken.type, expectedType);
+    expect(originalToken.offset, 0);
+    expect(originalToken.length, source.length);
+    expect(originalToken.lexeme, source);
+    if (expectedType == TokenType.SCRIPT_TAG) {
+      // Adding space before the script tag is not allowed, and adding text at
+      // the end changes nothing.
+      return originalToken;
+    } else if (expectedType == TokenType.SINGLE_LINE_COMMENT) {
+      // Adding space to an end-of-line comment changes the comment.
+      Token tokenWithSpaces = _scan(" $source");
+      expect(tokenWithSpaces, isNotNull);
+      expect(tokenWithSpaces.type, expectedType);
+      expect(tokenWithSpaces.offset, 1);
+      expect(tokenWithSpaces.length, source.length);
+      expect(tokenWithSpaces.lexeme, source);
+      return originalToken;
+    } else if (expectedType == TokenType.INT ||
+        expectedType == TokenType.DOUBLE) {
+      Token tokenWithLowerD = _scan("${source}d");
+      expect(tokenWithLowerD, isNotNull);
+      expect(tokenWithLowerD.type, expectedType);
+      expect(tokenWithLowerD.offset, 0);
+      expect(tokenWithLowerD.length, source.length);
+      expect(tokenWithLowerD.lexeme, source);
+      Token tokenWithUpperD = _scan("${source}D");
+      expect(tokenWithUpperD, isNotNull);
+      expect(tokenWithUpperD.type, expectedType);
+      expect(tokenWithUpperD.offset, 0);
+      expect(tokenWithUpperD.length, source.length);
+      expect(tokenWithUpperD.lexeme, source);
+    }
+    Token tokenWithSpaces = _scan(" $source ");
+    expect(tokenWithSpaces, isNotNull);
+    expect(tokenWithSpaces.type, expectedType);
+    expect(tokenWithSpaces.offset, 1);
+    expect(tokenWithSpaces.length, source.length);
+    expect(tokenWithSpaces.lexeme, source);
+    expect(originalToken.next.type, TokenType.EOF);
+    return originalToken;
+  }
+
+  /**
+   * Assert that when scanned the given [source] contains a sequence of tokens
+   * identical to the given list of [expectedTokens].
+   */
+  void _assertTokens(String source, List<Token> expectedTokens) {
+    Token token = _scan(source);
+    _checkTokens(token, expectedTokens);
+  }
+
+  void _checkTokens(Token firstToken, List<Token> expectedTokens) {
+    expect(firstToken, isNotNull);
+    Token token = firstToken;
+    for (int i = 0; i < expectedTokens.length; i++) {
+      Token expectedToken = expectedTokens[i];
+      expect(token.type, expectedToken.type, reason: "Wrong type for token $i");
+      expect(token.offset, expectedToken.offset,
+          reason: "Wrong offset for token $i");
+      expect(token.length, expectedToken.length,
+          reason: "Wrong length for token $i");
+      expect(token.lexeme, expectedToken.lexeme,
+          reason: "Wrong lexeme for token $i");
+      token = token.next;
+      expect(token, isNotNull);
+    }
+    expect(token.type, TokenType.EOF);
+  }
+
+  Token _scan(String source) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Token token = _scanWithListener(source, listener);
+    listener.assertNoErrors();
+    return token;
+  }
+
+  Token _scanWithListener(String source, GatheringErrorListener listener) {
+    Scanner scanner =
+        new Scanner(null, new CharSequenceReader(source), listener);
+    Token result = scanner.tokenize();
+    listener.setLineInfo(new TestSource(), scanner.lineStarts);
+    return result;
+  }
+}
+
+/**
+ * An `ExpectedLocation` encodes information about the expected location of a
+ * given offset in source code.
+ */
+class ScannerTest_ExpectedLocation {
+  final int _offset;
+
+  final int _lineNumber;
+
+  final int _columnNumber;
+
+  ScannerTest_ExpectedLocation(
+      this._offset, this._lineNumber, this._columnNumber);
+}
+
+/**
+ * A `TokenStreamValidator` is used to validate the correct construction of a
+ * stream of tokens.
+ */
+class TokenStreamValidator {
+  /**
+   * Validate that the stream of tokens that starts with the given [token] is
+   * correct.
+   */
+  void validate(Token token) {
+    StringBuffer buffer = new StringBuffer();
+    _validateStream(buffer, token);
+    if (buffer.length > 0) {
+      fail(buffer.toString());
+    }
+  }
+
+  void _validateStream(StringBuffer buffer, Token token) {
+    if (token == null) {
+      return;
+    }
+    Token previousToken = null;
+    int previousEnd = -1;
+    Token currentToken = token;
+    while (currentToken != null && currentToken.type != TokenType.EOF) {
+      _validateStream(buffer, currentToken.precedingComments);
+      TokenType type = currentToken.type;
+      if (type == TokenType.OPEN_CURLY_BRACKET ||
+          type == TokenType.OPEN_PAREN ||
+          type == TokenType.OPEN_SQUARE_BRACKET ||
+          type == TokenType.STRING_INTERPOLATION_EXPRESSION) {
+        if (currentToken is! BeginToken) {
+          buffer.write("\r\nExpected BeginToken, found ");
+          buffer.write(currentToken.runtimeType.toString());
+          buffer.write(" ");
+          _writeToken(buffer, currentToken);
+        }
+      }
+      int currentStart = currentToken.offset;
+      int currentLength = currentToken.length;
+      int currentEnd = currentStart + currentLength - 1;
+      if (currentStart <= previousEnd) {
+        buffer.write("\r\nInvalid token sequence: ");
+        _writeToken(buffer, previousToken);
+        buffer.write(" followed by ");
+        _writeToken(buffer, currentToken);
+      }
+      previousEnd = currentEnd;
+      previousToken = currentToken;
+      currentToken = currentToken.next;
+    }
+  }
+
+  void _writeToken(StringBuffer buffer, Token token) {
+    buffer.write("[");
+    buffer.write(token.type);
+    buffer.write(", '");
+    buffer.write(token.lexeme);
+    buffer.write("', ");
+    buffer.write(token.offset);
+    buffer.write(", ");
+    buffer.write(token.length);
+    buffer.write("]");
+  }
+}
+
+@reflectiveTest
+class TokenTypeTest extends EngineTestCase {
+  void test_isOperator() {
+    expect(TokenType.AMPERSAND.isOperator, isTrue);
+    expect(TokenType.AMPERSAND_AMPERSAND.isOperator, isTrue);
+    expect(TokenType.AMPERSAND_EQ.isOperator, isTrue);
+    expect(TokenType.BANG.isOperator, isTrue);
+    expect(TokenType.BANG_EQ.isOperator, isTrue);
+    expect(TokenType.BAR.isOperator, isTrue);
+    expect(TokenType.BAR_BAR.isOperator, isTrue);
+    expect(TokenType.BAR_EQ.isOperator, isTrue);
+    expect(TokenType.CARET.isOperator, isTrue);
+    expect(TokenType.CARET_EQ.isOperator, isTrue);
+    expect(TokenType.EQ.isOperator, isTrue);
+    expect(TokenType.EQ_EQ.isOperator, isTrue);
+    expect(TokenType.GT.isOperator, isTrue);
+    expect(TokenType.GT_EQ.isOperator, isTrue);
+    expect(TokenType.GT_GT.isOperator, isTrue);
+    expect(TokenType.GT_GT_EQ.isOperator, isTrue);
+    expect(TokenType.INDEX.isOperator, isTrue);
+    expect(TokenType.INDEX_EQ.isOperator, isTrue);
+    expect(TokenType.IS.isOperator, isTrue);
+    expect(TokenType.LT.isOperator, isTrue);
+    expect(TokenType.LT_EQ.isOperator, isTrue);
+    expect(TokenType.LT_LT.isOperator, isTrue);
+    expect(TokenType.LT_LT_EQ.isOperator, isTrue);
+    expect(TokenType.MINUS.isOperator, isTrue);
+    expect(TokenType.MINUS_EQ.isOperator, isTrue);
+    expect(TokenType.MINUS_MINUS.isOperator, isTrue);
+    expect(TokenType.PERCENT.isOperator, isTrue);
+    expect(TokenType.PERCENT_EQ.isOperator, isTrue);
+    expect(TokenType.PERIOD_PERIOD.isOperator, isTrue);
+    expect(TokenType.PLUS.isOperator, isTrue);
+    expect(TokenType.PLUS_EQ.isOperator, isTrue);
+    expect(TokenType.PLUS_PLUS.isOperator, isTrue);
+    expect(TokenType.QUESTION.isOperator, isTrue);
+    expect(TokenType.SLASH.isOperator, isTrue);
+    expect(TokenType.SLASH_EQ.isOperator, isTrue);
+    expect(TokenType.STAR.isOperator, isTrue);
+    expect(TokenType.STAR_EQ.isOperator, isTrue);
+    expect(TokenType.TILDE.isOperator, isTrue);
+    expect(TokenType.TILDE_SLASH.isOperator, isTrue);
+    expect(TokenType.TILDE_SLASH_EQ.isOperator, isTrue);
+  }
+
+  void test_isUserDefinableOperator() {
+    expect(TokenType.AMPERSAND.isUserDefinableOperator, isTrue);
+    expect(TokenType.BAR.isUserDefinableOperator, isTrue);
+    expect(TokenType.CARET.isUserDefinableOperator, isTrue);
+    expect(TokenType.EQ_EQ.isUserDefinableOperator, isTrue);
+    expect(TokenType.GT.isUserDefinableOperator, isTrue);
+    expect(TokenType.GT_EQ.isUserDefinableOperator, isTrue);
+    expect(TokenType.GT_GT.isUserDefinableOperator, isTrue);
+    expect(TokenType.INDEX.isUserDefinableOperator, isTrue);
+    expect(TokenType.INDEX_EQ.isUserDefinableOperator, isTrue);
+    expect(TokenType.LT.isUserDefinableOperator, isTrue);
+    expect(TokenType.LT_EQ.isUserDefinableOperator, isTrue);
+    expect(TokenType.LT_LT.isUserDefinableOperator, isTrue);
+    expect(TokenType.MINUS.isUserDefinableOperator, isTrue);
+    expect(TokenType.PERCENT.isUserDefinableOperator, isTrue);
+    expect(TokenType.PLUS.isUserDefinableOperator, isTrue);
+    expect(TokenType.SLASH.isUserDefinableOperator, isTrue);
+    expect(TokenType.STAR.isUserDefinableOperator, isTrue);
+    expect(TokenType.TILDE.isUserDefinableOperator, isTrue);
+    expect(TokenType.TILDE_SLASH.isUserDefinableOperator, isTrue);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/source_factory_test.dart b/mojo/public/dart/third_party/analyzer/test/generated/source_factory_test.dart
new file mode 100644
index 0000000..c16f1f8
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/generated/source_factory_test.dart
@@ -0,0 +1,352 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.test.generated.source_factory;
+
+import 'dart:convert';
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/source/package_map_resolver.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/java_engine_io.dart';
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart' as utils;
+import 'package:package_config/packages.dart';
+import 'package:package_config/packages_file.dart' as pkgfile show parse;
+import 'package:package_config/src/packages_impl.dart';
+import 'package:path/path.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+import '../utils.dart';
+import 'test_support.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(SourceFactoryTest);
+  runPackageMapTests();
+}
+
+Source createSource({String path, String uri}) =>
+    //TODO(pquitslund): find some way to pass an actual URI into source creation
+    new MemoryResourceProvider()
+        .getFile(path)
+        .createSource(uri != null ? Uri.parse(uri) : null);
+
+void runPackageMapTests() {
+  final Uri baseUri = new Uri.file('test/base');
+  final List<UriResolver> testResolvers = [new FileUriResolver()];
+
+  Packages createPackageMap(Uri base, String configFileContents) {
+    List<int> bytes = UTF8.encode(configFileContents);
+    Map<String, Uri> map = pkgfile.parse(bytes, base);
+    return new MapPackages(map);
+  }
+
+  Map<String, List<Folder>> getPackageMap(String config) {
+    Packages packages = createPackageMap(baseUri, config);
+    SourceFactory factory = new SourceFactory(testResolvers, packages);
+    return factory.packageMap;
+  }
+
+  String resolvePackageUri(
+      {String uri,
+      String config,
+      Source containingSource,
+      UriResolver customResolver}) {
+    Packages packages = createPackageMap(baseUri, config);
+    List<UriResolver> resolvers = testResolvers.toList();
+    if (customResolver != null) {
+      resolvers.add(customResolver);
+    }
+    SourceFactory factory = new SourceFactory(resolvers, packages);
+    Source source = factory.resolveUri(containingSource, uri);
+    return source != null ? source.fullName : null;
+  }
+
+  Uri restorePackageUri(
+      {Source source, String config, UriResolver customResolver}) {
+    Packages packages = createPackageMap(baseUri, config);
+    List<UriResolver> resolvers = testResolvers.toList();
+    if (customResolver != null) {
+      resolvers.add(customResolver);
+    }
+    SourceFactory factory = new SourceFactory(resolvers, packages);
+    return factory.restoreUri(source);
+  }
+
+  group('SourceFactoryTest', () {
+    group('package mapping', () {
+      group('resolveUri', () {
+        test('URI in mapping', () {
+          String uri = resolvePackageUri(
+              config: '''
+unittest:file:///home/somebody/.pub/cache/unittest-0.9.9/lib/
+async:file:///home/somebody/.pub/cache/async-1.1.0/lib/
+quiver:file:///home/somebody/.pub/cache/quiver-1.2.1/lib
+''',
+              uri: 'package:unittest/unittest.dart');
+          expect(
+              uri,
+              equals(
+                  '/home/somebody/.pub/cache/unittest-0.9.9/lib/unittest.dart'));
+        });
+        test('URI in mapping (no scheme)', () {
+          String uri = resolvePackageUri(
+              config: '''
+unittest:/home/somebody/.pub/cache/unittest-0.9.9/lib/
+async:/home/somebody/.pub/cache/async-1.1.0/lib/
+quiver:/home/somebody/.pub/cache/quiver-1.2.1/lib
+''',
+              uri: 'package:unittest/unittest.dart');
+          expect(
+              uri,
+              equals(
+                  '/home/somebody/.pub/cache/unittest-0.9.9/lib/unittest.dart'));
+        });
+        test('URI not in mapping', () {
+          String uri = resolvePackageUri(
+              config: 'unittest:/home/somebody/.pub/cache/unittest-0.9.9/lib/',
+              uri: 'package:foo/foo.dart');
+          expect(uri, isNull);
+        });
+        test('Non-package URI', () {
+          var testResolver = new CustomUriResolver(uriPath: 'test_uri');
+          String uri = resolvePackageUri(
+              config: 'unittest:/home/somebody/.pub/cache/unittest-0.9.9/lib/',
+              uri: 'custom:custom.dart',
+              customResolver: testResolver);
+          expect(uri, testResolver.uriPath);
+        });
+        test('Invalid URI', () {
+          // TODO(pquitslund): fix clients to handle errors appropriately
+          //   CLI: print message 'invalid package file format'
+          //   SERVER: best case tell user somehow and recover...
+          expect(
+              () => resolvePackageUri(
+                  config: 'foo:<:&%>', uri: 'package:foo/bar.dart'),
+              throwsA(new isInstanceOf('FormatException')));
+        });
+        test('Valid URI that cannot be further resolved', () {
+          String uri = resolvePackageUri(
+              config: 'foo:http://www.google.com', uri: 'package:foo/bar.dart');
+          expect(uri, isNull);
+        });
+        test('Relative URIs', () {
+          Source containingSource = createSource(
+              path: '/foo/bar/baz/foo.dart', uri: 'package:foo/foo.dart');
+          String uri = resolvePackageUri(
+              config: 'foo:/foo/bar/baz',
+              uri: 'bar.dart',
+              containingSource: containingSource);
+          expect(uri, isNotNull);
+          expect(uri, equals('/foo/bar/baz/bar.dart'));
+        });
+      });
+      group('restoreUri', () {
+        test('URI in mapping', () {
+          Uri uri = restorePackageUri(
+              config: '''
+unittest:/home/somebody/.pub/cache/unittest-0.9.9/lib/
+async:/home/somebody/.pub/cache/async-1.1.0/lib/
+quiver:/home/somebody/.pub/cache/quiver-1.2.1/lib
+''',
+              source: new FileBasedSource(FileUtilities2.createFile(
+                  '/home/somebody/.pub/cache/unittest-0.9.9/lib/unittest.dart')));
+          expect(uri, isNotNull);
+          expect(uri.toString(), equals('package:unittest/unittest.dart'));
+        });
+      });
+      group('packageMap', () {
+        test('non-file URIs filtered', () {
+          Map<String, List<Folder>> map = getPackageMap('''
+quiver:/home/somebody/.pub/cache/quiver-1.2.1/lib
+foo:http://www.google.com
+''');
+          expect(map.keys, unorderedEquals(['quiver']));
+        });
+      });
+    });
+  });
+
+  group('URI utils', () {
+    group('URI', () {
+      test('startsWith', () {
+        expect(utils.startsWith(Uri.parse('/foo/bar/'), Uri.parse('/foo/')),
+            isTrue);
+        expect(utils.startsWith(Uri.parse('/foo/bar/'), Uri.parse('/foo/bar/')),
+            isTrue);
+        expect(utils.startsWith(Uri.parse('/foo/bar'), Uri.parse('/foo/b')),
+            isFalse);
+        // Handle odd URIs (https://github.com/dart-lang/sdk/issues/24126)
+        expect(utils.startsWith(Uri.parse('/foo/bar'), Uri.parse('')), isFalse);
+        expect(utils.startsWith(Uri.parse(''), Uri.parse('/foo/bar')), isFalse);
+      });
+    });
+  });
+}
+
+class CustomUriResolver extends UriResolver {
+  String uriPath;
+  CustomUriResolver({this.uriPath});
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) =>
+      createSource(path: uriPath);
+}
+
+@reflectiveTest
+class SourceFactoryTest {
+  void test_creation() {
+    expect(new SourceFactory([]), isNotNull);
+  }
+
+  void test_fromEncoding_invalidUri() {
+    SourceFactory factory = new SourceFactory([]);
+    expect(() => factory.fromEncoding("<:&%>"),
+        throwsA(new isInstanceOf<IllegalArgumentException>()));
+  }
+
+  void test_fromEncoding_noResolver() {
+    SourceFactory factory = new SourceFactory([]);
+    expect(() => factory.fromEncoding("foo:/does/not/exist.dart"),
+        throwsA(new isInstanceOf<IllegalArgumentException>()));
+  }
+
+  void test_fromEncoding_valid() {
+    String encoding = "file:///does/not/exist.dart";
+    SourceFactory factory = new SourceFactory(
+        [new UriResolver_SourceFactoryTest_test_fromEncoding_valid(encoding)]);
+    expect(factory.fromEncoding(encoding), isNotNull);
+  }
+
+  void test_resolveUri_absolute() {
+    UriResolver_absolute resolver = new UriResolver_absolute();
+    SourceFactory factory = new SourceFactory([resolver]);
+    factory.resolveUri(null, "dart:core");
+    expect(resolver.invoked, isTrue);
+  }
+
+  void test_resolveUri_nonAbsolute_absolute() {
+    SourceFactory factory =
+        new SourceFactory([new UriResolver_nonAbsolute_absolute()]);
+    String absolutePath = "/does/not/matter.dart";
+    Source containingSource =
+        new FileBasedSource(FileUtilities2.createFile("/does/not/exist.dart"));
+    Source result = factory.resolveUri(containingSource, absolutePath);
+    expect(result.fullName,
+        FileUtilities2.createFile(absolutePath).getAbsolutePath());
+  }
+
+  void test_resolveUri_nonAbsolute_relative() {
+    SourceFactory factory =
+        new SourceFactory([new UriResolver_nonAbsolute_relative()]);
+    Source containingSource =
+        new FileBasedSource(FileUtilities2.createFile("/does/not/have.dart"));
+    Source result = factory.resolveUri(containingSource, "exist.dart");
+    expect(result.fullName,
+        FileUtilities2.createFile("/does/not/exist.dart").getAbsolutePath());
+  }
+
+  void test_resolveUri_nonAbsolute_relative_package() {
+    MemoryResourceProvider provider = new MemoryResourceProvider();
+    Context context = provider.pathContext;
+    String packagePath =
+        context.joinAll([context.separator, 'path', 'to', 'package']);
+    String libPath = context.joinAll([packagePath, 'lib']);
+    String dirPath = context.joinAll([libPath, 'dir']);
+    String firstPath = context.joinAll([dirPath, 'first.dart']);
+    String secondPath = context.joinAll([dirPath, 'second.dart']);
+
+    provider.newFolder(packagePath);
+    Folder libFolder = provider.newFolder(libPath);
+    provider.newFolder(dirPath);
+    File firstFile = provider.newFile(firstPath, '');
+    provider.newFile(secondPath, '');
+
+    PackageMapUriResolver resolver = new PackageMapUriResolver(provider, {
+      'package': [libFolder]
+    });
+    SourceFactory factory = new SourceFactory([resolver]);
+    Source librarySource =
+        firstFile.createSource(Uri.parse('package:package/dir/first.dart'));
+
+    Source result = factory.resolveUri(librarySource, 'second.dart');
+    expect(result, isNotNull);
+    expect(result.fullName, secondPath);
+    expect(result.uri.toString(), 'package:package/dir/second.dart');
+  }
+
+  void test_restoreUri() {
+    JavaFile file1 = FileUtilities2.createFile("/some/file1.dart");
+    JavaFile file2 = FileUtilities2.createFile("/some/file2.dart");
+    Source source1 = new FileBasedSource(file1);
+    Source source2 = new FileBasedSource(file2);
+    Uri expected1 = parseUriWithException("file:///my_file.dart");
+    SourceFactory factory =
+        new SourceFactory([new UriResolver_restoreUri(source1, expected1)]);
+    expect(factory.restoreUri(source1), same(expected1));
+    expect(factory.restoreUri(source2), same(null));
+  }
+}
+
+class UriResolver_absolute extends UriResolver {
+  bool invoked = false;
+
+  UriResolver_absolute();
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    invoked = true;
+    return null;
+  }
+}
+
+class UriResolver_nonAbsolute_absolute extends UriResolver {
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    return new FileBasedSource(new JavaFile.fromUri(uri), actualUri);
+  }
+}
+
+class UriResolver_nonAbsolute_relative extends UriResolver {
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    return new FileBasedSource(new JavaFile.fromUri(uri), actualUri);
+  }
+}
+
+class UriResolver_restoreUri extends UriResolver {
+  Source source1;
+  Uri expected1;
+  UriResolver_restoreUri(this.source1, this.expected1);
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) => null;
+
+  @override
+  Uri restoreAbsolute(Source source) {
+    if (identical(source, source1)) {
+      return expected1;
+    }
+    return null;
+  }
+}
+
+class UriResolver_SourceFactoryTest_test_fromEncoding_valid
+    extends UriResolver {
+  String encoding;
+  UriResolver_SourceFactoryTest_test_fromEncoding_valid(this.encoding);
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    if (uri.toString() == encoding) {
+      return new TestSource();
+    }
+    return null;
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/static_type_warning_code_test.dart b/mojo/public/dart/third_party/analyzer/test/generated/static_type_warning_code_test.dart
new file mode 100644
index 0000000..a14e8c8
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/generated/static_type_warning_code_test.dart
@@ -0,0 +1,1985 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.static_type_warning_code_test;
+
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+import '../utils.dart';
+import 'resolver_test.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(StaticTypeWarningCodeTest);
+}
+
+@reflectiveTest
+class StaticTypeWarningCodeTest extends ResolverTestCase {
+  void fail_inaccessibleSetter() {
+    Source source = addSource(r'''
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INACCESSIBLE_SETTER]);
+    verify([source]);
+  }
+
+  void fail_undefinedEnumConstant() {
+    // We need a way to set the parseEnum flag in the parser to true.
+    Source source = addSource(r'''
+enum E { ONE }
+E e() {
+  return E.TWO;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_ENUM_CONSTANT]);
+    verify([source]);
+  }
+
+  void test_ambiguousImport_function() {
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+g() { return f(); }''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+f() {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+f() {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
+  }
+
+  void test_await_flattened() {
+    Source source = addSource('''
+import 'dart:async';
+Future<Future<int>> ffi() => null;
+f() async {
+  Future<int> b = await ffi(); // Warning: int not assignable to Future<int>
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_await_simple() {
+    Source source = addSource('''
+import 'dart:async';
+Future<int> fi() => null;
+f() async {
+  String a = await fi(); // Warning: int not assignable to String
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_bug21912() {
+    Source source = addSource('''
+class A {}
+class B extends A {}
+
+typedef T Function2<S, T>(S z);
+typedef B AToB(A x);
+typedef A BToA(B x);
+
+void main() {
+  {
+    Function2<Function2<A, B>, Function2<B, A>> t1;
+    Function2<AToB, BToA> t2;
+
+    Function2<Function2<int, double>, Function2<int, double>> left;
+
+    left = t1;
+    left = t2;
+  }
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticTypeWarningCode.INVALID_ASSIGNMENT,
+      StaticTypeWarningCode.INVALID_ASSIGNMENT
+    ]);
+    verify([source]);
+  }
+
+  void test_expectedOneListTypeArgument() {
+    Source source = addSource(r'''
+main() {
+  <int, int> [];
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_expectedTwoMapTypeArguments_one() {
+    Source source = addSource(r'''
+main() {
+  <int> {};
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_expectedTwoMapTypeArguments_three() {
+    Source source = addSource(r'''
+main() {
+  <int, int, int> {};
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_illegal_return_type_async_function() {
+    Source source = addSource('''
+int f() async {}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE,
+      HintCode.MISSING_RETURN
+    ]);
+    verify([source]);
+  }
+
+  void test_illegal_return_type_async_generator_function() {
+    Source source = addSource('''
+int f() async* {}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE]);
+    verify([source]);
+  }
+
+  void test_illegal_return_type_async_generator_method() {
+    Source source = addSource('''
+class C {
+  int f() async* {}
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE]);
+    verify([source]);
+  }
+
+  void test_illegal_return_type_async_method() {
+    Source source = addSource('''
+class C {
+  int f() async {}
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE,
+      HintCode.MISSING_RETURN
+    ]);
+    verify([source]);
+  }
+
+  void test_illegal_return_type_sync_generator_function() {
+    Source source = addSource('''
+int f() sync* {}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE]);
+    verify([source]);
+  }
+
+  void test_illegal_return_type_sync_generator_method() {
+    Source source = addSource('''
+class C {
+  int f() sync* {}
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE]);
+    verify([source]);
+  }
+
+  void test_inconsistentMethodInheritance_paramCount() {
+    Source source = addSource(r'''
+abstract class A {
+  int x();
+}
+abstract class B {
+  int x(int y);
+}
+class C implements A, B {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_inconsistentMethodInheritance_paramType() {
+    Source source = addSource(r'''
+abstract class A {
+  x(int i);
+}
+abstract class B {
+  x(String s);
+}
+abstract class C implements A, B {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_inconsistentMethodInheritance_returnType() {
+    Source source = addSource(r'''
+abstract class A {
+  int x();
+}
+abstract class B {
+  String x();
+}
+abstract class C implements A, B {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
+    verify([source]);
+  }
+
+  void test_instanceAccessToStaticMember_method_invocation() {
+    Source source = addSource(r'''
+class A {
+  static m() {}
+}
+main(A a) {
+  a.m();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
+    verify([source]);
+  }
+
+  void test_instanceAccessToStaticMember_method_reference() {
+    Source source = addSource(r'''
+class A {
+  static m() {}
+}
+main(A a) {
+  a.m;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
+    verify([source]);
+  }
+
+  void test_instanceAccessToStaticMember_propertyAccess_field() {
+    Source source = addSource(r'''
+class A {
+  static var f;
+}
+main(A a) {
+  a.f;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
+    verify([source]);
+  }
+
+  void test_instanceAccessToStaticMember_propertyAccess_getter() {
+    Source source = addSource(r'''
+class A {
+  static get f => 42;
+}
+main(A a) {
+  a.f;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
+    verify([source]);
+  }
+
+  void test_instanceAccessToStaticMember_propertyAccess_setter() {
+    Source source = addSource(r'''
+class A {
+  static set f(x) {}
+}
+main(A a) {
+  a.f = 42;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_compoundAssignment() {
+    Source source = addSource(r'''
+class byte {
+  int _value;
+  byte(this._value);
+  int operator +(int val) { return 0; }
+}
+
+void main() {
+  byte b = new byte(52);
+  b += 3;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_defaultValue_named() {
+    Source source = addSource(r'''
+f({String x: 0}) {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_defaultValue_optional() {
+    Source source = addSource(r'''
+f([String x = 0]) {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_dynamic() {
+    Source source = addSource(r'''
+main() {
+  dynamic = 1;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_functionExpressionInvocation() {
+    Source source = addSource('''
+main() {
+  String x = (() => 5)();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_ifNullAssignment() {
+    Source source = addSource('''
+void f(int i) {
+  double d;
+  d ??= i;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_instanceVariable() {
+    Source source = addSource(r'''
+class A {
+  int x;
+}
+f() {
+  A a;
+  a.x = '0';
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_localVariable() {
+    Source source = addSource(r'''
+f() {
+  int x;
+  x = '0';
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_regressionInIssue18468Fix() {
+    // https://code.google.com/p/dart/issues/detail?id=18628
+    Source source = addSource(r'''
+class C<T> {
+  T t = int;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_staticVariable() {
+    Source source = addSource(r'''
+class A {
+  static int x;
+}
+f() {
+  A.x = '0';
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_topLevelVariableDeclaration() {
+    Source source = addSource("int x = 'string';");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_typeParameter() {
+    // 14221
+    Source source = addSource(r'''
+class B<T> {
+  T value;
+  void test(num n) {
+    value = n;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_invalidAssignment_variableDeclaration() {
+    Source source = addSource(r'''
+class A {
+  int x = 'string';
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
+  void test_invocationOfNonFunction_class() {
+    Source source = addSource(r'''
+class A {
+  void m() {
+    A();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
+  }
+
+  void test_invocationOfNonFunction_localGenericFunction() {
+    // Objects having a specific function type may be invoked, but objects
+    // having type Function may not, because type Function lacks a call method
+    // (this is because it is impossible to know what signature the call should
+    // have).
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.enableStrictCallChecks = true;
+    resetWithOptions(options);
+    Source source = addSource('''
+f(Function f) {
+  return f();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
+    verify([source]);
+  }
+
+  void test_invocationOfNonFunction_localObject() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.enableStrictCallChecks = true;
+    resetWithOptions(options);
+    Source source = addSource('''
+f(Object o) {
+  return o();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
+    verify([source]);
+  }
+
+  void test_invocationOfNonFunction_localVariable() {
+    Source source = addSource(r'''
+f() {
+  int x;
+  return x();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
+    verify([source]);
+  }
+
+  void test_invocationOfNonFunction_ordinaryInvocation() {
+    Source source = addSource(r'''
+class A {
+  static int x;
+}
+class B {
+  m() {
+    A.x();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
+    // A call to verify(source) fails as A.x() cannot be resolved.
+  }
+
+  void test_invocationOfNonFunction_staticInvocation() {
+    Source source = addSource(r'''
+class A {
+  static int get g => 0;
+  f() {
+    A.g();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
+    // A call to verify(source) fails as g() cannot be resolved.
+  }
+
+  void test_invocationOfNonFunction_superExpression() {
+    Source source = addSource(r'''
+class A {
+  int get g => 0;
+}
+class B extends A {
+  m() {
+    var v = super.g();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
+    verify([source]);
+  }
+
+  void test_invocationOfNonFunctionExpression_literal() {
+    Source source = addSource(r'''
+f() {
+  3(5);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION]);
+    verify([source]);
+  }
+
+  void test_nonBoolCondition_conditional() {
+    Source source = addSource("f() { return 3 ? 2 : 1; }");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_CONDITION]);
+    verify([source]);
+  }
+
+  void test_nonBoolCondition_do() {
+    Source source = addSource(r'''
+f() {
+  do {} while (3);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_CONDITION]);
+    verify([source]);
+  }
+
+  void test_nonBoolCondition_if() {
+    Source source = addSource(r'''
+f() {
+  if (3) return 2; else return 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_CONDITION]);
+    verify([source]);
+  }
+
+  void test_nonBoolCondition_while() {
+    Source source = addSource(r'''
+f() {
+  while (3) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_CONDITION]);
+    verify([source]);
+  }
+
+  void test_nonBoolExpression_functionType() {
+    Source source = addSource(r'''
+int makeAssertion() => 1;
+f() {
+  assert(makeAssertion);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_EXPRESSION]);
+    verify([source]);
+  }
+
+  void test_nonBoolExpression_interfaceType() {
+    Source source = addSource(r'''
+f() {
+  assert(0);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_EXPRESSION]);
+    verify([source]);
+  }
+
+  void test_nonBoolNegationExpression() {
+    Source source = addSource(r'''
+f() {
+  !42;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION]);
+    verify([source]);
+  }
+
+  void test_nonBoolOperand_and_left() {
+    Source source = addSource(r'''
+bool f(int left, bool right) {
+  return left && right;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_OPERAND]);
+    verify([source]);
+  }
+
+  void test_nonBoolOperand_and_right() {
+    Source source = addSource(r'''
+bool f(bool left, String right) {
+  return left && right;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_OPERAND]);
+    verify([source]);
+  }
+
+  void test_nonBoolOperand_or_left() {
+    Source source = addSource(r'''
+bool f(List<int> left, bool right) {
+  return left || right;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_OPERAND]);
+    verify([source]);
+  }
+
+  void test_nonBoolOperand_or_right() {
+    Source source = addSource(r'''
+bool f(bool left, double right) {
+  return left || right;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.NON_BOOL_OPERAND]);
+    verify([source]);
+  }
+
+  void test_nonTypeAsTypeArgument_notAType() {
+    Source source = addSource(r'''
+int A;
+class B<E> {}
+f(B<A> b) {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  void test_nonTypeAsTypeArgument_undefinedIdentifier() {
+    Source source = addSource(r'''
+class B<E> {}
+f(B<A> b) {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  void test_returnOfInvalidType_async_future_int_mismatches_future_null() {
+    Source source = addSource('''
+import 'dart:async';
+Future<Null> f() async {
+  return 5;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
+    verify([source]);
+  }
+
+  void test_returnOfInvalidType_async_future_int_mismatches_future_string() {
+    Source source = addSource('''
+import 'dart:async';
+Future<String> f() async {
+  return 5;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
+    verify([source]);
+  }
+
+  void test_returnOfInvalidType_async_future_int_mismatches_int() {
+    Source source = addSource('''
+int f() async {
+  return 5;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
+      StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE
+    ]);
+    verify([source]);
+  }
+
+  void test_returnOfInvalidType_expressionFunctionBody_function() {
+    Source source = addSource("int f() => '0';");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
+    verify([source]);
+  }
+
+  void test_returnOfInvalidType_expressionFunctionBody_getter() {
+    Source source = addSource("int get g => '0';");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
+    verify([source]);
+  }
+
+  void test_returnOfInvalidType_expressionFunctionBody_localFunction() {
+    Source source = addSource(r'''
+class A {
+  String m() {
+    int f() => '0';
+    return '0';
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
+    verify([source]);
+  }
+
+  void test_returnOfInvalidType_expressionFunctionBody_method() {
+    Source source = addSource(r'''
+class A {
+  int f() => '0';
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
+    verify([source]);
+  }
+
+  void test_returnOfInvalidType_expressionFunctionBody_void() {
+    Source source = addSource("void f() => 42;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
+    verify([source]);
+  }
+
+  void test_returnOfInvalidType_function() {
+    Source source = addSource("int f() { return '0'; }");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
+    verify([source]);
+  }
+
+  void test_returnOfInvalidType_getter() {
+    Source source = addSource("int get g { return '0'; }");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
+    verify([source]);
+  }
+
+  void test_returnOfInvalidType_localFunction() {
+    Source source = addSource(r'''
+class A {
+  String m() {
+    int f() { return '0'; }
+    return '0';
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
+    verify([source]);
+  }
+
+  void test_returnOfInvalidType_method() {
+    Source source = addSource(r'''
+class A {
+  int f() { return '0'; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
+    verify([source]);
+  }
+
+  void test_returnOfInvalidType_void() {
+    Source source = addSource("void f() { return 42; }");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_classTypeAlias() {
+    Source source = addSource(r'''
+class A {}
+class B {}
+class C {}
+class G<E extends A> {}
+class D = G<B> with C;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_extends() {
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+class C extends G<B>{}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_extends_regressionInIssue18468Fix() {
+    // https://code.google.com/p/dart/issues/detail?id=18628
+    Source source = addSource(r'''
+class X<T extends Type> {}
+class Y<U> extends X<U> {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_fieldFormalParameter() {
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+class C {
+  var f;
+  C(G<B> this.f) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_functionReturnType() {
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+G<B> f() { return null; }''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_functionTypeAlias() {
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+typedef G<B> f();''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_functionTypedFormalParameter() {
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+f(G<B> h()) {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_implements() {
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+class C implements G<B>{}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_is() {
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+var b = 1 is G<B>;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_methodReturnType() {
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+class C {
+  G<B> m() { return null; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_new() {
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+f() { return new G<B>(); }''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_new_superTypeOfUpperBound() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+class C extends B {}
+class G<E extends B> {}
+f() { return new G<A>(); }''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_parameter() {
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+f(G<B> g) {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_redirectingConstructor() {
+    Source source = addSource(r'''
+class A {}
+class B {}
+class X<T extends A> {
+  X(int x, int y) {}
+  factory X.name(int x, int y) = X<B>;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
+      StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE
+    ]);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_typeArgumentList() {
+    Source source = addSource(r'''
+class A {}
+class B {}
+class C<E> {}
+class D<E extends A> {}
+C<D<B>> Var;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_typeParameter() {
+    Source source = addSource(r'''
+class A {}
+class B {}
+class C {}
+class G<E extends A> {}
+class D<F extends G<B>> {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_variableDeclaration() {
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+G<B> g;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_typeArgumentNotMatchingBounds_with() {
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+class C extends Object with G<B>{}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_typeParameterSupertypeOfItsBound() {
+    Source source = addSource(r'''
+class A<T extends T> {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND]);
+    verify([source]);
+  }
+
+  void test_typePromotion_booleanAnd_useInRight_accessedInClosureRight_mutated() {
+    Source source = addSource(r'''
+callMe(f()) { f(); }
+main(Object p) {
+  (p is String) && callMe(() { p.length; });
+  p = 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_typePromotion_booleanAnd_useInRight_mutatedInLeft() {
+    Source source = addSource(r'''
+main(Object p) {
+  ((p is String) && ((p = 42) == 42)) && p.length != 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_typePromotion_booleanAnd_useInRight_mutatedInRight() {
+    Source source = addSource(r'''
+main(Object p) {
+  (p is String) && (((p = 42) == 42) && p.length != 0);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_typePromotion_conditional_useInThen_accessedInClosure_hasAssignment_after() {
+    Source source = addSource(r'''
+callMe(f()) { f(); }
+main(Object p) {
+  p is String ? callMe(() { p.length; }) : 0;
+  p = 42;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_typePromotion_conditional_useInThen_accessedInClosure_hasAssignment_before() {
+    Source source = addSource(r'''
+callMe(f()) { f(); }
+main(Object p) {
+  p = 42;
+  p is String ? callMe(() { p.length; }) : 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_typePromotion_conditional_useInThen_hasAssignment() {
+    Source source = addSource(r'''
+main(Object p) {
+  p is String ? (p.length + (p = 42)) : 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_typePromotion_if_accessedInClosure_hasAssignment() {
+    Source source = addSource(r'''
+callMe(f()) { f(); }
+main(Object p) {
+  if (p is String) {
+    callMe(() {
+      p.length;
+    });
+  }
+  p = 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_typePromotion_if_and_right_hasAssignment() {
+    Source source = addSource(r'''
+main(Object p) {
+  if (p is String && (p = null) == null) {
+    p.length;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_typePromotion_if_extends_notMoreSpecific_dynamic() {
+    Source source = addSource(r'''
+class V {}
+class A<T> {}
+class B<S> extends A<S> {
+  var b;
+}
+
+main(A<V> p) {
+  if (p is B) {
+    p.b;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_typePromotion_if_extends_notMoreSpecific_notMoreSpecificTypeArg() {
+    Source source = addSource(r'''
+class V {}
+class A<T> {}
+class B<S> extends A<S> {
+  var b;
+}
+
+main(A<V> p) {
+  if (p is B<int>) {
+    p.b;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_typePromotion_if_hasAssignment_after() {
+    Source source = addSource(r'''
+main(Object p) {
+  if (p is String) {
+    p.length;
+    p = 0;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_typePromotion_if_hasAssignment_before() {
+    Source source = addSource(r'''
+main(Object p) {
+  if (p is String) {
+    p = 0;
+    p.length;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_typePromotion_if_hasAssignment_inClosure_anonymous_after() {
+    Source source = addSource(r'''
+main(Object p) {
+  if (p is String) {
+    p.length;
+  }
+  () {p = 0;};
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_typePromotion_if_hasAssignment_inClosure_anonymous_before() {
+    Source source = addSource(r'''
+main(Object p) {
+  () {p = 0;};
+  if (p is String) {
+    p.length;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_typePromotion_if_hasAssignment_inClosure_function_after() {
+    Source source = addSource(r'''
+main(Object p) {
+  if (p is String) {
+    p.length;
+  }
+  f() {p = 0;};
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_typePromotion_if_hasAssignment_inClosure_function_before() {
+    Source source = addSource(r'''
+main(Object p) {
+  f() {p = 0;};
+  if (p is String) {
+    p.length;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_typePromotion_if_implements_notMoreSpecific_dynamic() {
+    Source source = addSource(r'''
+class V {}
+class A<T> {}
+class B<S> implements A<S> {
+  var b;
+}
+
+main(A<V> p) {
+  if (p is B) {
+    p.b;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_typePromotion_if_with_notMoreSpecific_dynamic() {
+    Source source = addSource(r'''
+class V {}
+class A<T> {}
+class B<S> extends Object with A<S> {
+  var b;
+}
+
+main(A<V> p) {
+  if (p is B) {
+    p.b;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_undefinedFunction() {
+    Source source = addSource(r'''
+void f() {
+  g();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_FUNCTION]);
+  }
+
+  void test_undefinedFunction_inCatch() {
+    Source source = addSource(r'''
+void f() {
+  try {
+  } on Object {
+    g();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_FUNCTION]);
+  }
+
+  void test_undefinedFunction_inImportedLib() {
+    Source source = addSource(r'''
+import 'lib.dart' as f;
+main() { return f.g(); }''');
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+h() {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_FUNCTION]);
+  }
+
+  void test_undefinedGetter() {
+    Source source = addSource(r'''
+class T {}
+f(T e) { return e.m; }''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_undefinedGetter_generic_function_call() {
+    // Objects having a specific function type have a call() method, but
+    // objects having type Function do not (this is because it is impossible to
+    // know what signature the call should have).
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.enableStrictCallChecks = true;
+    resetWithOptions(options);
+    Source source = addSource('''
+f(Function f) {
+  return f.call;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_undefinedGetter_object_call() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.enableStrictCallChecks = true;
+    resetWithOptions(options);
+    Source source = addSource('''
+f(Object o) {
+  return o.call;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_undefinedGetter_proxy_annotation_fakeProxy() {
+    Source source = addSource(r'''
+library L;
+class Fake {
+  const Fake();
+}
+const proxy = const Fake();
+@proxy class PrefixProxy {}
+main() {
+  new PrefixProxy().foo;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_undefinedGetter_static() {
+    Source source = addSource(r'''
+class A {}
+var a = A.B;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_undefinedGetter_typeLiteral_conditionalAccess() {
+    // When applied to a type literal, the conditional access operator '?.'
+    // cannot be used to access instance getters of Type.
+    Source source = addSource('''
+class A {}
+f() => A?.hashCode;
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_undefinedGetter_void() {
+    Source source = addSource(r'''
+class T {
+  void m() {}
+}
+f(T e) { return e.m().f; }''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_undefinedGetter_wrongNumberOfTypeArguments_tooLittle() {
+    Source source = addSource(r'''
+class A<K, V> {
+  K element;
+}
+main(A<int> a) {
+  a.element.anyGetterExistsInDynamic;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_undefinedGetter_wrongNumberOfTypeArguments_tooMany() {
+    Source source = addSource(r'''
+class A<E> {
+  E element;
+}
+main(A<int,int> a) {
+  a.element.anyGetterExistsInDynamic;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_undefinedGetter_wrongOfTypeArgument() {
+    Source source = addSource(r'''
+class A<E> {
+  E element;
+}
+main(A<NoSuchType> a) {
+  a.element.anyGetterExistsInDynamic;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
+    verify([source]);
+  }
+
+  void test_undefinedMethod() {
+    Source source = addSource(r'''
+class A {
+  void m() {
+    n();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+  }
+
+  void test_undefinedMethod_assignmentExpression() {
+    Source source = addSource(r'''
+class A {}
+class B {
+  f(A a) {
+    A a2 = new A();
+    a += a2;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+  }
+
+  void test_undefinedMethod_generic_function_call() {
+    // Objects having a specific function type have a call() method, but
+    // objects having type Function do not (this is because it is impossible to
+    // know what signature the call should have).
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.enableStrictCallChecks = true;
+    resetWithOptions(options);
+    Source source = addSource('''
+f(Function f) {
+  f.call();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+  }
+
+  void test_undefinedMethod_ignoreTypePropagation() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  m() {}
+}
+class C {
+  f() {
+    A a = new B();
+    a.m();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+  }
+
+  void test_undefinedMethod_leastUpperBoundWithNull() {
+    Source source = addSource('f(bool b, int i) => (b ? null : i).foo();');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+  }
+
+  void test_undefinedMethod_object_call() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.enableStrictCallChecks = true;
+    resetWithOptions(options);
+    Source source = addSource('''
+f(Object o) {
+  o.call();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+  }
+
+  void test_undefinedMethod_private() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+class A {
+  _foo() {}
+}''');
+    Source source = addSource(r'''
+import 'lib.dart';
+class B extends A {
+  test() {
+    _foo();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+  }
+
+  void test_undefinedMethod_proxy_annotation_fakeProxy() {
+    Source source = addSource(r'''
+library L;
+class Fake {
+  const Fake();
+}
+const proxy = const Fake();
+@proxy class PrefixProxy {}
+main() {
+  new PrefixProxy().foo();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+  }
+
+  void test_undefinedMethod_typeLiteral_conditionalAccess() {
+    // When applied to a type literal, the conditional access operator '?.'
+    // cannot be used to access instance methods of Type.
+    Source source = addSource('''
+class A {}
+f() => A?.toString();
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+  }
+
+  void test_undefinedOperator_indexBoth() {
+    Source source = addSource(r'''
+class A {}
+f(A a) {
+  a[0]++;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_undefinedOperator_indexGetter() {
+    Source source = addSource(r'''
+class A {}
+f(A a) {
+  a[0];
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_undefinedOperator_indexSetter() {
+    Source source = addSource(r'''
+class A {}
+f(A a) {
+  a[0] = 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_undefinedOperator_plus() {
+    Source source = addSource(r'''
+class A {}
+f(A a) {
+  a + 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_undefinedOperator_postfixExpression() {
+    Source source = addSource(r'''
+class A {}
+f(A a) {
+  a++;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_undefinedOperator_prefixExpression() {
+    Source source = addSource(r'''
+class A {}
+f(A a) {
+  ++a;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+  }
+
+  void test_undefinedSetter() {
+    Source source = addSource(r'''
+class T {}
+f(T e1) { e1.m = 0; }''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SETTER]);
+  }
+
+  void test_undefinedSetter_static() {
+    Source source = addSource(r'''
+class A {}
+f() { A.B = 0;}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SETTER]);
+  }
+
+  void test_undefinedSetter_void() {
+    Source source = addSource(r'''
+class T {
+  void m() {}
+}
+f(T e) { e.m().f = 0; }''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SETTER]);
+  }
+
+  void test_undefinedSuperGetter() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  get g {
+    return super.g;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SUPER_GETTER]);
+  }
+
+  void test_undefinedSuperMethod() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  m() { return super.m(); }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SUPER_METHOD]);
+  }
+
+  void test_undefinedSuperOperator_binaryExpression() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  operator +(value) {
+    return super + value;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
+  }
+
+  void test_undefinedSuperOperator_indexBoth() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  operator [](index) {
+    return super[index]++;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
+  }
+
+  void test_undefinedSuperOperator_indexGetter() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  operator [](index) {
+    return super[index + 1];
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
+  }
+
+  void test_undefinedSuperOperator_indexSetter() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  operator []=(index, value) {
+    return super[index] = 0;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
+  }
+
+  void test_undefinedSuperSetter() {
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  f() {
+    super.m = 0;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SUPER_SETTER]);
+  }
+
+  void test_unqualifiedReferenceToNonLocalStaticMember_getter() {
+    Source source = addSource(r'''
+class A {
+  static int get a => 0;
+}
+class B extends A {
+  int b() {
+    return a;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
+    ]);
+    verify([source]);
+  }
+
+  void test_unqualifiedReferenceToNonLocalStaticMember_method() {
+    Source source = addSource(r'''
+class A {
+  static void a() {}
+}
+class B extends A {
+  void b() {
+    a();
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
+    ]);
+    verify([source]);
+  }
+
+  void test_unqualifiedReferenceToNonLocalStaticMember_setter() {
+    Source source = addSource(r'''
+class A {
+  static set a(x) {}
+}
+class B extends A {
+  b(y) {
+    a = y;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
+    ]);
+    verify([source]);
+  }
+
+  void test_wrongNumberOfTypeArguments_classAlias() {
+    Source source = addSource(r'''
+class A {}
+class M {}
+class B<F extends num> = A<F> with M;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_wrongNumberOfTypeArguments_tooFew() {
+    Source source = addSource(r'''
+class A<E, F> {}
+A<A> a = null;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_wrongNumberOfTypeArguments_tooMany() {
+    Source source = addSource(r'''
+class A<E> {}
+A<A, A> a = null;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_wrongNumberOfTypeArguments_typeTest_tooFew() {
+    Source source = addSource(r'''
+class A {}
+class C<K, V> {}
+f(p) {
+  return p is C<A>;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_wrongNumberOfTypeArguments_typeTest_tooMany() {
+    Source source = addSource(r'''
+class A {}
+class C<E> {}
+f(p) {
+  return p is C<A, A>;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_yield_async_to_basic_type() {
+    Source source = addSource('''
+int f() async* {
+  yield 3;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
+      StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE
+    ]);
+    verify([source]);
+  }
+
+  void test_yield_async_to_iterable() {
+    Source source = addSource('''
+Iterable<int> f() async* {
+  yield 3;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
+      StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE
+    ]);
+    verify([source]);
+  }
+
+  void test_yield_async_to_mistyped_stream() {
+    Source source = addSource('''
+import 'dart:async';
+Stream<int> f() async* {
+  yield "foo";
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
+    verify([source]);
+  }
+
+  void test_yield_each_async_non_stream() {
+    Source source = addSource('''
+f() async* {
+  yield* 0;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
+    verify([source]);
+  }
+
+  void test_yield_each_async_to_mistyped_stream() {
+    Source source = addSource('''
+import 'dart:async';
+Stream<int> f() async* {
+  yield* g();
+}
+Stream<String> g() => null;
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
+    verify([source]);
+  }
+
+  void test_yield_each_sync_non_iterable() {
+    Source source = addSource('''
+f() sync* {
+  yield* 0;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
+    verify([source]);
+  }
+
+  void test_yield_each_sync_to_mistyped_iterable() {
+    Source source = addSource('''
+Iterable<int> f() sync* {
+  yield* g();
+}
+Iterable<String> g() => null;
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
+    verify([source]);
+  }
+
+  void test_yield_sync_to_basic_type() {
+    Source source = addSource('''
+int f() sync* {
+  yield 3;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
+      StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE
+    ]);
+    verify([source]);
+  }
+
+  void test_yield_sync_to_mistyped_iterable() {
+    Source source = addSource('''
+Iterable<int> f() sync* {
+  yield "foo";
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
+    verify([source]);
+  }
+
+  void test_yield_sync_to_stream() {
+    Source source = addSource('''
+import 'dart:async';
+Stream<int> f() sync* {
+  yield 3;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
+      StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE
+    ]);
+    verify([source]);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/static_warning_code_test.dart b/mojo/public/dart/third_party/analyzer/test/generated/static_warning_code_test.dart
new file mode 100644
index 0000000..3d63d3c
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/generated/static_warning_code_test.dart
@@ -0,0 +1,3588 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.static_warning_code_test;
+
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+import '../utils.dart';
+import 'resolver_test.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(StaticWarningCodeTest);
+}
+
+@reflectiveTest
+class StaticWarningCodeTest extends ResolverTestCase {
+  void fail_undefinedGetter() {
+    Source source = addSource(r'''
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.UNDEFINED_GETTER]);
+    verify([source]);
+  }
+
+  void fail_undefinedIdentifier_commentReference() {
+    Source source = addSource(r'''
+/** [m] xxx [new B.c] */
+class A {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.UNDEFINED_IDENTIFIER,
+      StaticWarningCode.UNDEFINED_IDENTIFIER
+    ]);
+  }
+
+  void fail_undefinedSetter() {
+    Source source = addSource(r'''
+class C {}
+f(var p) {
+  C.m = 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.UNDEFINED_SETTER]);
+    verify([source]);
+  }
+
+  void test_ambiguousImport_as() {
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+f(p) {p as N;}''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class N {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+class N {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
+  }
+
+  void test_ambiguousImport_extends() {
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+class A extends N {}''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class N {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+class N {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.AMBIGUOUS_IMPORT,
+      CompileTimeErrorCode.EXTENDS_NON_CLASS
+    ]);
+  }
+
+  void test_ambiguousImport_implements() {
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+class A implements N {}''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class N {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+class N {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.AMBIGUOUS_IMPORT,
+      CompileTimeErrorCode.IMPLEMENTS_NON_CLASS
+    ]);
+  }
+
+  void test_ambiguousImport_inPart() {
+    Source source = addSource(r'''
+library lib;
+import 'lib1.dart';
+import 'lib2.dart';
+part 'part.dart';''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class N {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+class N {}''');
+    Source partSource = addNamedSource(
+        "/part.dart",
+        r'''
+part of lib;
+class A extends N {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(partSource, [
+      StaticWarningCode.AMBIGUOUS_IMPORT,
+      CompileTimeErrorCode.EXTENDS_NON_CLASS
+    ]);
+  }
+
+  void test_ambiguousImport_instanceCreation() {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+import 'lib2.dart';
+f() {new N();}''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class N {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+class N {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
+  }
+
+  void test_ambiguousImport_is() {
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+f(p) {p is N;}''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class N {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+class N {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
+  }
+
+  void test_ambiguousImport_qualifier() {
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+g() { N.FOO; }''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class N {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+class N {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
+  }
+
+  void test_ambiguousImport_typeAnnotation() {
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+typedef N FT(N p);
+N f(N p) {
+  N v;
+  return null;
+}
+class A {
+  N m() { return null; }
+}
+class B<T extends N> {}''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class N {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+class N {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.AMBIGUOUS_IMPORT,
+      StaticWarningCode.AMBIGUOUS_IMPORT,
+      StaticWarningCode.AMBIGUOUS_IMPORT,
+      StaticWarningCode.AMBIGUOUS_IMPORT,
+      StaticWarningCode.AMBIGUOUS_IMPORT,
+      StaticWarningCode.AMBIGUOUS_IMPORT,
+      StaticWarningCode.AMBIGUOUS_IMPORT
+    ]);
+  }
+
+  void test_ambiguousImport_typeArgument_annotation() {
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+class A<T> {}
+A<N> f() { return null; }''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class N {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+class N {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
+  }
+
+  void test_ambiguousImport_typeArgument_instanceCreation() {
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+class A<T> {}
+f() {new A<N>();}''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+class N {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+class N {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
+  }
+
+  void test_ambiguousImport_varRead() {
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+f() { g(v); }
+g(p) {}''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+var v;''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+var v;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
+  }
+
+  void test_ambiguousImport_varWrite() {
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+f() { v = 0; }''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+var v;''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+var v;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
+  }
+
+  void test_ambiguousImport_withPrefix() {
+    Source source = addSource(r'''
+library test;
+import 'lib1.dart' as p;
+import 'lib2.dart' as p;
+main() {
+  p.f();
+}''');
+    addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+f() {}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+f() {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
+  }
+
+  void test_argumentTypeNotAssignable_ambiguousClassName() {
+    // See dartbug.com/19624
+    Source source = addNamedSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+import 'lib2.dart';
+class _A {}
+f() {
+  g((_A a) {});
+}''');
+    addNamedSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+class _A {}
+g(h(_A a)) {}''');
+    computeLibrarySourceErrors(source);
+    // The name _A is private to the library it's defined in, so this is a type
+    // mismatch. Furthermore, the error message should mention both _A and the
+    // filenames so the user can figure out what's going on.
+    List<AnalysisError> errors = analysisContext2.computeErrors(source);
+    expect(errors, hasLength(1));
+    AnalysisError error = errors[0];
+    expect(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, error.errorCode);
+    String message = error.message;
+    expect(message.indexOf("_A") != -1, isTrue);
+    expect(message.indexOf("lib1.dart") != -1, isTrue);
+    expect(message.indexOf("lib2.dart") != -1, isTrue);
+  }
+
+  void test_argumentTypeNotAssignable_annotation_namedConstructor() {
+    Source source = addSource(r'''
+class A {
+  const A.fromInt(int p);
+}
+@A.fromInt('0')
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_annotation_unnamedConstructor() {
+    Source source = addSource(r'''
+class A {
+  const A(int p);
+}
+@A('0')
+main() {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_binary() {
+    Source source = addSource(r'''
+class A {
+  operator +(int p) {}
+}
+f(A a) {
+  a + '0';
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_cascadeSecond() {
+    Source source = addSource(r'''
+// filler filler filler filler filler filler filler filler filler filler
+class A {
+  B ma() { return new B(); }
+}
+class B {
+  mb(String p) {}
+}
+
+main() {
+  A a = new A();
+  a..  ma().mb(0);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_const() {
+    Source source = addSource(r'''
+class A {
+  const A(String p);
+}
+main() {
+  const A(42);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
+      CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+    ]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_const_super() {
+    Source source = addSource(r'''
+class A {
+  const A(String p);
+}
+class B extends A {
+  const B() : super(42);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_functionExpressionInvocation_required() {
+    Source source = addSource(r'''
+main() {
+  (int x) {} ('');
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_index() {
+    Source source = addSource(r'''
+class A {
+  operator [](int index) {}
+}
+f(A a) {
+  a['0'];
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_invocation_callParameter() {
+    Source source = addSource(r'''
+class A {
+  call(int p) {}
+}
+f(A a) {
+  a('0');
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_invocation_callVariable() {
+    Source source = addSource(r'''
+class A {
+  call(int p) {}
+}
+main() {
+  A a = new A();
+  a('0');
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_invocation_functionParameter() {
+    Source source = addSource(r'''
+a(b(int p)) {
+  b('0');
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_invocation_functionParameter_generic() {
+    Source source = addSource(r'''
+class A<K, V> {
+  m(f(K k), V v) {
+    f(v);
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_invocation_functionTypes_optional() {
+    Source source = addSource(r'''
+void acceptFunNumOptBool(void funNumOptBool([bool b])) {}
+void funNumBool(bool b) {}
+main() {
+  acceptFunNumOptBool(funNumBool);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_invocation_generic() {
+    Source source = addSource(r'''
+class A<T> {
+  m(T t) {}
+}
+f(A<String> a) {
+  a.m(1);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_invocation_named() {
+    Source source = addSource(r'''
+f({String p}) {}
+main() {
+  f(p: 42);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_invocation_optional() {
+    Source source = addSource(r'''
+f([String p]) {}
+main() {
+  f(42);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_invocation_required() {
+    Source source = addSource(r'''
+f(String p) {}
+main() {
+  f(42);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_invocation_typedef_generic() {
+    Source source = addSource(r'''
+typedef A<T>(T p);
+f(A<int> a) {
+  a('1');
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_invocation_typedef_local() {
+    Source source = addSource(r'''
+typedef A(int p);
+A getA() => null;
+main() {
+  A a = getA();
+  a('1');
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_invocation_typedef_parameter() {
+    Source source = addSource(r'''
+typedef A(int p);
+f(A a) {
+  a('1');
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_new_generic() {
+    Source source = addSource(r'''
+class A<T> {
+  A(T p) {}
+}
+main() {
+  new A<String>(42);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_new_optional() {
+    Source source = addSource(r'''
+class A {
+  A([String p]) {}
+}
+main() {
+  new A(42);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_argumentTypeNotAssignable_new_required() {
+    Source source = addSource(r'''
+class A {
+  A(String p) {}
+}
+main() {
+  new A(42);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_assignmentToClass() {
+    Source source = addSource('''
+class C {}
+main() {
+  C = null;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_TYPE]);
+  }
+
+  void test_assignmentToConst_instanceVariable() {
+    Source source = addSource(r'''
+class A {
+  static const v = 0;
+}
+f() {
+  A.v = 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_CONST]);
+    verify([source]);
+  }
+
+  void test_assignmentToConst_instanceVariable_plusEq() {
+    Source source = addSource(r'''
+class A {
+  static const v = 0;
+}
+f() {
+  A.v += 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_CONST]);
+    verify([source]);
+  }
+
+  void test_assignmentToConst_localVariable() {
+    Source source = addSource(r'''
+f() {
+  const x = 0;
+  x = 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_CONST]);
+    verify([source]);
+  }
+
+  void test_assignmentToConst_localVariable_plusEq() {
+    Source source = addSource(r'''
+f() {
+  const x = 0;
+  x += 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_CONST]);
+    verify([source]);
+  }
+
+  void test_assignmentToEnumType() {
+    Source source = addSource('''
+enum E { e }
+main() {
+  E = null;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_TYPE]);
+  }
+
+  void test_assignmentToFinal_instanceVariable() {
+    Source source = addSource(r'''
+class A {
+  final v = 0;
+}
+f() {
+  A a = new A();
+  a.v = 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+
+  void test_assignmentToFinal_instanceVariable_plusEq() {
+    Source source = addSource(r'''
+class A {
+  final v = 0;
+}
+f() {
+  A a = new A();
+  a.v += 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+
+  void test_assignmentToFinal_localVariable() {
+    Source source = addSource(r'''
+f() {
+  final x = 0;
+  x = 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+
+  void test_assignmentToFinal_localVariable_plusEq() {
+    Source source = addSource(r'''
+f() {
+  final x = 0;
+  x += 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+
+  void test_assignmentToFinal_postfixMinusMinus() {
+    Source source = addSource(r'''
+f() {
+  final x = 0;
+  x--;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+
+  void test_assignmentToFinal_postfixPlusPlus() {
+    Source source = addSource(r'''
+f() {
+  final x = 0;
+  x++;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+
+  void test_assignmentToFinal_prefixMinusMinus() {
+    Source source = addSource(r'''
+f() {
+  final x = 0;
+  --x;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+
+  void test_assignmentToFinal_prefixPlusPlus() {
+    Source source = addSource(r'''
+f() {
+  final x = 0;
+  ++x;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+
+  void test_assignmentToFinal_suffixMinusMinus() {
+    Source source = addSource(r'''
+f() {
+  final x = 0;
+  x--;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+
+  void test_assignmentToFinal_suffixPlusPlus() {
+    Source source = addSource(r'''
+f() {
+  final x = 0;
+  x++;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+
+  void test_assignmentToFinal_topLevelVariable() {
+    Source source = addSource(r'''
+final x = 0;
+f() { x = 1; }''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
+    verify([source]);
+  }
+
+  void test_assignmentToFinalNoSetter_prefixedIdentifier() {
+    Source source = addSource(r'''
+class A {
+  int get x => 0;
+}
+main() {
+  A a = new A();
+  a.x = 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER]);
+    verify([source]);
+  }
+
+  void test_assignmentToFinalNoSetter_propertyAccess() {
+    Source source = addSource(r'''
+class A {
+  int get x => 0;
+}
+class B {
+  static A a;
+}
+main() {
+  B.a.x = 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER]);
+    verify([source]);
+  }
+
+  void test_assignmentToFunction() {
+    Source source = addSource(r'''
+f() {}
+main() {
+  f = null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FUNCTION]);
+    verify([source]);
+  }
+
+  void test_assignmentToMethod() {
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+f(A a) {
+  a.m = () {};
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_METHOD]);
+    verify([source]);
+  }
+
+  void test_assignmentToTypedef() {
+    Source source = addSource('''
+typedef void F();
+main() {
+  F = null;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_TYPE]);
+  }
+
+  void test_assignmentToTypeParameter() {
+    Source source = addSource('''
+class C<T> {
+  f() {
+    T = null;
+  }
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_TYPE]);
+  }
+
+  void test_caseBlockNotTerminated() {
+    Source source = addSource(r'''
+f(int p) {
+  switch (p) {
+    case 0:
+      f(p);
+    case 1:
+      break;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.CASE_BLOCK_NOT_TERMINATED]);
+    verify([source]);
+  }
+
+  void test_castToNonType() {
+    Source source = addSource(r'''
+var A = 0;
+f(String s) { var x = s as A; }''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.CAST_TO_NON_TYPE]);
+    verify([source]);
+  }
+
+  void test_concreteClassWithAbstractMember() {
+    Source source = addSource(r'''
+class A {
+  m();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER]);
+    verify([source]);
+  }
+
+  void test_conflictingDartImport() {
+    Source source = addSource(r'''
+import 'lib.dart';
+import 'dart:async';
+Future f = null;
+Stream s;''');
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+class Future {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.CONFLICTING_DART_IMPORT]);
+  }
+
+  void test_conflictingInstanceGetterAndSuperclassMember_declField_direct_setter() {
+    Source source = addSource(r'''
+class A {
+  static set v(x) {}
+}
+class B extends A {
+  var v;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
+    verify([source]);
+  }
+
+  void test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_getter() {
+    Source source = addSource(r'''
+class A {
+  static get v => 0;
+}
+class B extends A {
+  get v => 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
+    verify([source]);
+  }
+
+  void test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_method() {
+    Source source = addSource(r'''
+class A {
+  static v() {}
+}
+class B extends A {
+  get v => 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
+    verify([source]);
+  }
+
+  void test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_setter() {
+    Source source = addSource(r'''
+class A {
+  static set v(x) {}
+}
+class B extends A {
+  get v => 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
+    verify([source]);
+  }
+
+  void test_conflictingInstanceGetterAndSuperclassMember_declGetter_indirect() {
+    Source source = addSource(r'''
+class A {
+  static int v;
+}
+class B extends A {}
+class C extends B {
+  get v => 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
+    verify([source]);
+  }
+
+  void test_conflictingInstanceGetterAndSuperclassMember_declGetter_mixin() {
+    Source source = addSource(r'''
+class M {
+  static int v;
+}
+class B extends Object with M {
+  get v => 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
+    verify([source]);
+  }
+
+  void test_conflictingInstanceGetterAndSuperclassMember_direct_field() {
+    Source source = addSource(r'''
+class A {
+  static int v;
+}
+class B extends A {
+  get v => 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
+    verify([source]);
+  }
+
+  void test_conflictingInstanceMethodSetter2() {
+    Source source = addSource(r'''
+class A {
+  foo() {}
+  set foo(a) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER2]);
+    verify([source]);
+  }
+
+  void test_conflictingInstanceMethodSetter_sameClass() {
+    Source source = addSource(r'''
+class A {
+  set foo(a) {}
+  foo() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER]);
+    verify([source]);
+  }
+
+  void test_conflictingInstanceMethodSetter_setterInInterface() {
+    Source source = addSource(r'''
+abstract class A {
+  set foo(a);
+}
+abstract class B implements A {
+  foo() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER]);
+    verify([source]);
+  }
+
+  void test_conflictingInstanceMethodSetter_setterInSuper() {
+    Source source = addSource(r'''
+class A {
+  set foo(a) {}
+}
+class B extends A {
+  foo() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER]);
+    verify([source]);
+  }
+
+  void test_conflictingInstanceSetterAndSuperclassMember() {
+    Source source = addSource(r'''
+class A {
+  static int v;
+}
+class B extends A {
+  set v(x) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER]);
+    verify([source]);
+  }
+
+  void test_conflictingStaticGetterAndInstanceSetter_mixin() {
+    Source source = addSource(r'''
+class A {
+  set x(int p) {}
+}
+class B extends Object with A {
+  static get x => 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER]);
+    verify([source]);
+  }
+
+  void test_conflictingStaticGetterAndInstanceSetter_superClass() {
+    Source source = addSource(r'''
+class A {
+  set x(int p) {}
+}
+class B extends A {
+  static get x => 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER]);
+    verify([source]);
+  }
+
+  void test_conflictingStaticGetterAndInstanceSetter_thisClass() {
+    Source source = addSource(r'''
+class A {
+  static get x => 0;
+  set x(int p) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER]);
+    verify([source]);
+  }
+
+  void test_conflictingStaticSetterAndInstanceMember_thisClass_getter() {
+    Source source = addSource(r'''
+class A {
+  get x => 0;
+  static set x(int p) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER]);
+    verify([source]);
+  }
+
+  void test_conflictingStaticSetterAndInstanceMember_thisClass_method() {
+    Source source = addSource(r'''
+class A {
+  x() {}
+  static set x(int p) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER]);
+    verify([source]);
+  }
+
+  void test_constWithAbstractClass() {
+    Source source = addSource(r'''
+abstract class A {
+  const A();
+}
+void f() {
+  A a = const A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.CONST_WITH_ABSTRACT_CLASS]);
+    verify([source]);
+  }
+
+  void test_equalKeysInMap() {
+    Source source = addSource("var m = {'a' : 0, 'b' : 1, 'a' : 2};");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.EQUAL_KEYS_IN_MAP]);
+    verify([source]);
+  }
+
+  void test_equalKeysInMap_withEqualTypeParams() {
+    Source source = addSource(r'''
+class A<T> {
+  const A();
+}
+var m = {const A<int>(): 0, const A<int>(): 1};''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.EQUAL_KEYS_IN_MAP]);
+    verify([source]);
+  }
+
+  void test_equalKeysInMap_withUnequalTypeParams() {
+    // No error should be produced because A<int> and A<num> are different
+    // types.
+    Source source = addSource(r'''
+class A<T> {
+  const A();
+}
+var m = {const A<int>(): 0, const A<num>(): 1};''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_exportDuplicatedLibraryNamed() {
+    Source source = addSource(r'''
+library test;
+export 'lib1.dart';
+export 'lib2.dart';''');
+    addNamedSource("/lib1.dart", "library lib;");
+    addNamedSource("/lib2.dart", "library lib;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAMED]);
+    verify([source]);
+  }
+
+  void test_extraPositionalArguments() {
+    Source source = addSource(r'''
+f() {}
+main() {
+  f(0, 1, '2');
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_extraPositionalArguments_functionExpression() {
+    Source source = addSource(r'''
+main() {
+  (int x) {} (0, 1);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_fieldInitializedInInitializerAndDeclaration_final() {
+    Source source = addSource(r'''
+class A {
+  final int x = 0;
+  A() : x = 1 {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION]);
+    verify([source]);
+  }
+
+  void test_fieldInitializerNotAssignable() {
+    Source source = addSource(r'''
+class A {
+  int x;
+  A() : x = '';
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_fieldInitializingFormalNotAssignable() {
+    Source source = addSource(r'''
+class A {
+  int x;
+  A(String this.x) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  /**
+   * This test doesn't test the FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR code, but tests the
+   * FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION code instead. It is provided here to show
+   * coverage over all of the permutations of initializers in constructor declarations.
+   *
+   * Note: FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION covers a subset of
+   * FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, since it more specific, we use it instead of
+   * the broader code
+   */
+  void test_finalInitializedInDeclarationAndConstructor_initializers() {
+    Source source = addSource(r'''
+class A {
+  final x = 0;
+  A() : x = 0 {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION]);
+    verify([source]);
+  }
+
+  void test_finalInitializedInDeclarationAndConstructor_initializingFormal() {
+    Source source = addSource(r'''
+class A {
+  final x = 0;
+  A(this.x) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR]);
+    verify([source]);
+  }
+
+  void test_finalNotInitialized_inConstructor_1() {
+    Source source = addSource(r'''
+class A {
+  final int x;
+  A() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1]);
+    verify([source]);
+  }
+
+  void test_finalNotInitialized_inConstructor_2() {
+    Source source = addSource(r'''
+class A {
+  final int a;
+  final int b;
+  A() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_2]);
+    verify([source]);
+  }
+
+  void test_finalNotInitialized_inConstructor_3() {
+    Source source = addSource(r'''
+class A {
+  final int a;
+  final int b;
+  final int c;
+  A() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS]);
+    verify([source]);
+  }
+
+  void test_finalNotInitialized_instanceField_final() {
+    Source source = addSource(r'''
+class A {
+  final F;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.FINAL_NOT_INITIALIZED]);
+    verify([source]);
+  }
+
+  void test_finalNotInitialized_instanceField_final_static() {
+    Source source = addSource(r'''
+class A {
+  static final F;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.FINAL_NOT_INITIALIZED]);
+    verify([source]);
+  }
+
+  void test_finalNotInitialized_library_final() {
+    Source source = addSource("final F;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.FINAL_NOT_INITIALIZED]);
+    verify([source]);
+  }
+
+  void test_finalNotInitialized_local_final() {
+    Source source = addSource(r'''
+f() {
+  final int x;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.FINAL_NOT_INITIALIZED]);
+    verify([source]);
+  }
+
+  void test_functionWithoutCall_direct() {
+    Source source = addSource(r'''
+class A implements Function {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.FUNCTION_WITHOUT_CALL]);
+    verify([source]);
+  }
+
+  void test_functionWithoutCall_indirect_extends() {
+    Source source = addSource(r'''
+abstract class A implements Function {
+}
+class B extends A {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.FUNCTION_WITHOUT_CALL]);
+    verify([source]);
+  }
+
+  void test_functionWithoutCall_indirect_implements() {
+    Source source = addSource(r'''
+abstract class A implements Function {
+}
+class B implements A {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.FUNCTION_WITHOUT_CALL]);
+    verify([source]);
+  }
+
+  void test_importDuplicatedLibraryNamed() {
+    Source source = addSource(r'''
+library test;
+import 'lib1.dart';
+import 'lib2.dart';''');
+    addNamedSource("/lib1.dart", "library lib;");
+    addNamedSource("/lib2.dart", "library lib;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAMED,
+      HintCode.UNUSED_IMPORT,
+      HintCode.UNUSED_IMPORT
+    ]);
+    verify([source]);
+  }
+
+  void test_importOfNonLibrary() {
+    resolveWithErrors(<String>[
+      r'''
+part of lib;
+class A {}''',
+      r'''
+library lib;
+import 'lib1.dart' deferred as p;
+var a = new p.A();'''
+    ], <ErrorCode>[
+      StaticWarningCode.IMPORT_OF_NON_LIBRARY
+    ]);
+  }
+
+  void test_inconsistentMethodInheritanceGetterAndMethod() {
+    Source source = addSource(r'''
+abstract class A {
+  int x();
+}
+abstract class B {
+  int get x;
+}
+class C implements A, B {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD]);
+    verify([source]);
+  }
+
+  void test_instanceMethodNameCollidesWithSuperclassStatic_field() {
+    Source source = addSource(r'''
+class A {
+  static var n;
+}
+class B extends A {
+  void n() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
+    ]);
+    verify([source]);
+  }
+
+  void test_instanceMethodNameCollidesWithSuperclassStatic_field2() {
+    Source source = addSource(r'''
+class A {
+  static var n;
+}
+class B extends A {
+}
+class C extends B {
+  void n() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
+    ]);
+    verify([source]);
+  }
+
+  void test_instanceMethodNameCollidesWithSuperclassStatic_getter() {
+    Source source = addSource(r'''
+class A {
+  static get n {return 0;}
+}
+class B extends A {
+  void n() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
+    ]);
+    verify([source]);
+  }
+
+  void test_instanceMethodNameCollidesWithSuperclassStatic_getter2() {
+    Source source = addSource(r'''
+class A {
+  static get n {return 0;}
+}
+class B extends A {
+}
+class C extends B {
+  void n() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
+    ]);
+    verify([source]);
+  }
+
+  void test_instanceMethodNameCollidesWithSuperclassStatic_interface() {
+    Source source = addSource(r'''
+class Base {
+  static foo() {}
+}
+abstract class Ifc {
+  foo();
+}
+class C extends Base implements Ifc {
+  foo() {}
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
+    ]);
+    verify([source]);
+  }
+
+  void test_instanceMethodNameCollidesWithSuperclassStatic_method() {
+    Source source = addSource(r'''
+class A {
+  static n () {}
+}
+class B extends A {
+  void n() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
+    ]);
+    verify([source]);
+  }
+
+  void test_instanceMethodNameCollidesWithSuperclassStatic_method2() {
+    Source source = addSource(r'''
+class A {
+  static n () {}
+}
+class B extends A {
+}
+class C extends B {
+  void n() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
+    ]);
+    verify([source]);
+  }
+
+  void test_instanceMethodNameCollidesWithSuperclassStatic_setter() {
+    Source source = addSource(r'''
+class A {
+  static set n(int x) {}
+}
+class B extends A {
+  void n() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
+    ]);
+    verify([source]);
+  }
+
+  void test_instanceMethodNameCollidesWithSuperclassStatic_setter2() {
+    Source source = addSource(r'''
+class A {
+  static set n(int x) {}
+}
+class B extends A {
+}
+class C extends B {
+  void n() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
+    ]);
+    verify([source]);
+  }
+
+  void test_invalidGetterOverrideReturnType() {
+    Source source = addSource(r'''
+class A {
+  int get g { return 0; }
+}
+class B extends A {
+  String get g { return 'a'; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidGetterOverrideReturnType_implicit() {
+    Source source = addSource(r'''
+class A {
+  String f;
+}
+class B extends A {
+  int f;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE,
+      StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE
+    ]);
+    verify([source]);
+  }
+
+  void test_invalidGetterOverrideReturnType_twoInterfaces() {
+    // test from language/override_inheritance_field_test_11.dart
+    Source source = addSource(r'''
+abstract class I {
+  int get getter => null;
+}
+abstract class J {
+  num get getter => null;
+}
+abstract class A implements I, J {}
+class B extends A {
+  String get getter => null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidGetterOverrideReturnType_twoInterfaces_conflicting() {
+    Source source = addSource(r'''
+abstract class I<U> {
+  U get g => null;
+}
+abstract class J<V> {
+  V get g => null;
+}
+class B implements I<int>, J<String> {
+  double get g => null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidMethodOverrideNamedParamType() {
+    Source source = addSource(r'''
+class A {
+  m({int a}) {}
+}
+class B implements A {
+  m({String a}) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidMethodOverrideNormalParamType_interface() {
+    Source source = addSource(r'''
+class A {
+  m(int a) {}
+}
+class B implements A {
+  m(String a) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidMethodOverrideNormalParamType_superclass() {
+    Source source = addSource(r'''
+class A {
+  m(int a) {}
+}
+class B extends A {
+  m(String a) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidMethodOverrideNormalParamType_superclass_interface() {
+    Source source = addSource(r'''
+abstract class I<U> {
+  m(U u) => null;
+}
+abstract class J<V> {
+  m(V v) => null;
+}
+class B extends I<int> implements J<String> {
+  m(double d) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidMethodOverrideNormalParamType_twoInterfaces() {
+    Source source = addSource(r'''
+abstract class I {
+  m(int n);
+}
+abstract class J {
+  m(num n);
+}
+abstract class A implements I, J {}
+class B extends A {
+  m(String n) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidMethodOverrideNormalParamType_twoInterfaces_conflicting() {
+    // language/override_inheritance_generic_test/08
+    Source source = addSource(r'''
+abstract class I<U> {
+  m(U u) => null;
+}
+abstract class J<V> {
+  m(V v) => null;
+}
+class B implements I<int>, J<String> {
+  m(double d) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidMethodOverrideOptionalParamType() {
+    Source source = addSource(r'''
+class A {
+  m([int a]) {}
+}
+class B implements A {
+  m([String a]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidMethodOverrideOptionalParamType_twoInterfaces() {
+    Source source = addSource(r'''
+abstract class I {
+  m([int n]);
+}
+abstract class J {
+  m([num n]);
+}
+abstract class A implements I, J {}
+class B extends A {
+  m([String n]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidMethodOverrideReturnType_interface() {
+    Source source = addSource(r'''
+class A {
+  int m() { return 0; }
+}
+class B implements A {
+  String m() { return 'a'; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidMethodOverrideReturnType_interface_grandparent() {
+    Source source = addSource(r'''
+abstract class A {
+  int m();
+}
+abstract class B implements A {
+}
+class C implements B {
+  String m() { return 'a'; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidMethodOverrideReturnType_mixin() {
+    Source source = addSource(r'''
+class A {
+  int m() { return 0; }
+}
+class B extends Object with A {
+  String m() { return 'a'; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidMethodOverrideReturnType_superclass() {
+    Source source = addSource(r'''
+class A {
+  int m() { return 0; }
+}
+class B extends A {
+  String m() { return 'a'; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidMethodOverrideReturnType_superclass_grandparent() {
+    Source source = addSource(r'''
+class A {
+  int m() { return 0; }
+}
+class B extends A {
+}
+class C extends B {
+  String m() { return 'a'; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidMethodOverrideReturnType_twoInterfaces() {
+    Source source = addSource(r'''
+abstract class I {
+  int m();
+}
+abstract class J {
+  num m();
+}
+abstract class A implements I, J {}
+class B extends A {
+  String m() => '';
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidMethodOverrideReturnType_void() {
+    Source source = addSource(r'''
+class A {
+  int m() { return 0; }
+}
+class B extends A {
+  void m() {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidOverride_defaultOverridesNonDefault() {
+    // If the base class provided an explicit value for a default parameter,
+    // then it is a static warning for the derived class to provide a different
+    // value, even if implicitly.
+    Source source = addSource(r'''
+class A {
+  foo([x = 1]) {}
+}
+class B extends A {
+  foo([x]) {}
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL
+    ]);
+    verify([source]);
+  }
+
+  void test_invalidOverride_defaultOverridesNonDefault_named() {
+    // If the base class provided an explicit value for a default parameter,
+    // then it is a static warning for the derived class to provide a different
+    // value, even if implicitly.
+    Source source = addSource(r'''
+class A {
+  foo({x: 1}) {}
+}
+class B extends A {
+  foo({x}) {}
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED]);
+    verify([source]);
+  }
+
+  void test_invalidOverride_defaultOverridesNonDefaultNull() {
+    // If the base class provided an explicit null value for a default
+    // parameter, then it is ok for the derived class to let the default value
+    // be implicit, because the implicit default value of null matches the
+    // explicit default value of null.
+    Source source = addSource(r'''
+class A {
+  foo([x = null]) {}
+}
+class B extends A {
+  foo([x]) {}
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidOverride_defaultOverridesNonDefaultNull_named() {
+    // If the base class provided an explicit null value for a default
+    // parameter, then it is ok for the derived class to let the default value
+    // be implicit, because the implicit default value of null matches the
+    // explicit default value of null.
+    Source source = addSource(r'''
+class A {
+  foo({x: null}) {}
+}
+class B extends A {
+  foo({x}) {}
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidOverride_nonDefaultOverridesDefault() {
+    // If the base class lets the default parameter be implicit, then it is ok
+    // for the derived class to provide an explicit default value, even if it's
+    // not null.
+    Source source = addSource(r'''
+class A {
+  foo([x]) {}
+}
+class B extends A {
+  foo([x = 1]) {}
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidOverride_nonDefaultOverridesDefault_named() {
+    // If the base class lets the default parameter be implicit, then it is ok
+    // for the derived class to provide an explicit default value, even if it's
+    // not null.
+    Source source = addSource(r'''
+class A {
+  foo({x}) {}
+}
+class B extends A {
+  foo({x: 1}) {}
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_invalidOverrideDifferentDefaultValues_named() {
+    Source source = addSource(r'''
+class A {
+  m({int p : 0}) {}
+}
+class B extends A {
+  m({int p : 1}) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED]);
+    verify([source]);
+  }
+
+  void test_invalidOverrideDifferentDefaultValues_positional() {
+    Source source = addSource(r'''
+class A {
+  m([int p = 0]) {}
+}
+class B extends A {
+  m([int p = 1]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL
+    ]);
+    verify([source]);
+  }
+
+  void test_invalidOverrideNamed_fewerNamedParameters() {
+    Source source = addSource(r'''
+class A {
+  m({a, b}) {}
+}
+class B extends A {
+  m({a}) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_NAMED]);
+    verify([source]);
+  }
+
+  void test_invalidOverrideNamed_missingNamedParameter() {
+    Source source = addSource(r'''
+class A {
+  m({a, b}) {}
+}
+class B extends A {
+  m({a, c}) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_NAMED]);
+    verify([source]);
+  }
+
+  void test_invalidOverridePositional_optional() {
+    Source source = addSource(r'''
+class A {
+  m([a, b]) {}
+}
+class B extends A {
+  m([a]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_POSITIONAL]);
+    verify([source]);
+  }
+
+  void test_invalidOverridePositional_optionalAndRequired() {
+    Source source = addSource(r'''
+class A {
+  m(a, b, [c, d]) {}
+}
+class B extends A {
+  m(a, b, [c]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_POSITIONAL]);
+    verify([source]);
+  }
+
+  void test_invalidOverridePositional_optionalAndRequired2() {
+    Source source = addSource(r'''
+class A {
+  m(a, b, [c, d]) {}
+}
+class B extends A {
+  m(a, [c, d]) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_POSITIONAL]);
+    verify([source]);
+  }
+
+  void test_invalidOverrideRequired() {
+    Source source = addSource(r'''
+class A {
+  m(a) {}
+}
+class B extends A {
+  m(a, b) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_REQUIRED]);
+    verify([source]);
+  }
+
+  void test_invalidSetterOverrideNormalParamType() {
+    Source source = addSource(r'''
+class A {
+  void set s(int v) {}
+}
+class B extends A {
+  void set s(String v) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidSetterOverrideNormalParamType_superclass_interface() {
+    Source source = addSource(r'''
+abstract class I {
+  set setter14(int _) => null;
+}
+abstract class J {
+  set setter14(num _) => null;
+}
+abstract class A extends I implements J {}
+class B extends A {
+  set setter14(String _) => null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidSetterOverrideNormalParamType_twoInterfaces() {
+    // test from language/override_inheritance_field_test_34.dart
+    Source source = addSource(r'''
+abstract class I {
+  set setter14(int _) => null;
+}
+abstract class J {
+  set setter14(num _) => null;
+}
+abstract class A implements I, J {}
+class B extends A {
+  set setter14(String _) => null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
+    verify([source]);
+  }
+
+  void test_invalidSetterOverrideNormalParamType_twoInterfaces_conflicting() {
+    Source source = addSource(r'''
+abstract class I<U> {
+  set s(U u) {}
+}
+abstract class J<V> {
+  set s(V v) {}
+}
+class B implements I<int>, J<String> {
+  set s(double d) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
+    verify([source]);
+  }
+
+  void test_listElementTypeNotAssignable() {
+    Source source = addSource("var v = <String> [42];");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_mapKeyTypeNotAssignable() {
+    Source source = addSource("var v = <String, int > {1 : 2};");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_mapValueTypeNotAssignable() {
+    Source source = addSource("var v = <String, String> {'a' : 2};");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_mismatchedAccessorTypes_class() {
+    Source source = addSource(r'''
+class A {
+  int get g { return 0; }
+  set g(String v) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
+    verify([source]);
+  }
+
+  void test_mismatchedAccessorTypes_getterAndSuperSetter() {
+    Source source = addSource(r'''
+class A {
+  int get g { return 0; }
+}
+class B extends A {
+  set g(String v) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE]);
+    verify([source]);
+  }
+
+  void test_mismatchedAccessorTypes_setterAndSuperGetter() {
+    Source source = addSource(r'''
+class A {
+  set g(int v) {}
+}
+class B extends A {
+  String get g { return ''; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE]);
+    verify([source]);
+  }
+
+  void test_mismatchedAccessorTypes_topLevel() {
+    Source source = addSource(r'''
+int get g { return 0; }
+set g(String v) {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
+    verify([source]);
+  }
+
+  void test_mixedReturnTypes_localFunction() {
+    Source source = addSource(r'''
+class C {
+  m(int x) {
+    return (int y) {
+      if (y < 0) {
+        return;
+      }
+      return 0;
+    };
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.MIXED_RETURN_TYPES,
+      StaticWarningCode.MIXED_RETURN_TYPES
+    ]);
+    verify([source]);
+  }
+
+  void test_mixedReturnTypes_method() {
+    Source source = addSource(r'''
+class C {
+  m(int x) {
+    if (x < 0) {
+      return;
+    }
+    return 0;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.MIXED_RETURN_TYPES,
+      StaticWarningCode.MIXED_RETURN_TYPES
+    ]);
+    verify([source]);
+  }
+
+  void test_mixedReturnTypes_topLevelFunction() {
+    Source source = addSource(r'''
+f(int x) {
+  if (x < 0) {
+    return;
+  }
+  return 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.MIXED_RETURN_TYPES,
+      StaticWarningCode.MIXED_RETURN_TYPES
+    ]);
+    verify([source]);
+  }
+
+  void test_newWithAbstractClass() {
+    Source source = addSource(r'''
+abstract class A {}
+void f() {
+  A a = new A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.NEW_WITH_ABSTRACT_CLASS]);
+    verify([source]);
+  }
+
+  void test_newWithInvalidTypeParameters() {
+    Source source = addSource(r'''
+class A {}
+f() { return new A<A>(); }''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS]);
+    verify([source]);
+  }
+
+  void test_newWithInvalidTypeParameters_tooFew() {
+    Source source = addSource(r'''
+class A {}
+class C<K, V> {}
+f(p) {
+  return new C<A>();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS]);
+    verify([source]);
+  }
+
+  void test_newWithInvalidTypeParameters_tooMany() {
+    Source source = addSource(r'''
+class A {}
+class C<E> {}
+f(p) {
+  return new C<A, A>();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS]);
+    verify([source]);
+  }
+
+  void test_newWithNonType() {
+    Source source = addSource(r'''
+var A = 0;
+void f() {
+  var a = new A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.NEW_WITH_NON_TYPE]);
+    verify([source]);
+  }
+
+  void test_newWithNonType_fromLibrary() {
+    Source source1 = addNamedSource("/lib.dart", "class B {}");
+    Source source2 = addNamedSource(
+        "/lib2.dart",
+        r'''
+import 'lib.dart' as lib;
+void f() {
+  var a = new lib.A();
+}
+lib.B b;''');
+    computeLibrarySourceErrors(source1);
+    computeLibrarySourceErrors(source2);
+    assertErrors(source2, [StaticWarningCode.NEW_WITH_NON_TYPE]);
+    verify([source1]);
+  }
+
+  void test_newWithUndefinedConstructor() {
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+f() {
+  new A.name();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR]);
+    // no verify(), 'name' is not resolved
+  }
+
+  void test_newWithUndefinedConstructorDefault() {
+    Source source = addSource(r'''
+class A {
+  A.name() {}
+}
+f() {
+  new A();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberFivePlus() {
+    Source source = addSource(r'''
+abstract class A {
+  m();
+  n();
+  o();
+  p();
+  q();
+}
+class C extends A {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS
+    ]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberFour() {
+    Source source = addSource(r'''
+abstract class A {
+  m();
+  n();
+  o();
+  p();
+}
+class C extends A {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_interface() {
+    // 15979
+    Source source = addSource(r'''
+abstract class M {}
+abstract class A {}
+abstract class I {
+  m();
+}
+class B = A with M implements I;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_mixin() {
+    // 15979
+    Source source = addSource(r'''
+abstract class M {
+  m();
+}
+abstract class A {}
+class B = A with M;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_superclass() {
+    // 15979
+    Source source = addSource(r'''
+class M {}
+abstract class A {
+  m();
+}
+class B = A with M;''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_ensureCorrectFunctionSubtypeIsUsedInImplementation() {
+    // 15028
+    Source source = addSource(r'''
+class C {
+  foo(int x) => x;
+}
+abstract class D {
+  foo(x, [y]);
+}
+class E extends C implements D {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_getter_fromInterface() {
+    Source source = addSource(r'''
+class I {
+  int get g {return 1;}
+}
+class C implements I {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_getter_fromSuperclass() {
+    Source source = addSource(r'''
+abstract class A {
+  int get g;
+}
+class C extends A {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_method_fromInterface() {
+    Source source = addSource(r'''
+class I {
+  m(p) {}
+}
+class C implements I {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_method_fromSuperclass() {
+    Source source = addSource(r'''
+abstract class A {
+  m(p);
+}
+class C extends A {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_method_optionalParamCount() {
+    // 7640
+    Source source = addSource(r'''
+abstract class A {
+  int x(int a);
+}
+abstract class B {
+  int x(int a, [int b]);
+}
+class C implements A, B {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_mixinInherits_getter() {
+    // 15001
+    Source source = addSource(r'''
+abstract class A { get g1; get g2; }
+abstract class B implements A { get g1 => 1; }
+class C extends Object with B {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_mixinInherits_method() {
+    // 15001
+    Source source = addSource(r'''
+abstract class A { m1(); m2(); }
+abstract class B implements A { m1() => 1; }
+class C extends Object with B {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_mixinInherits_setter() {
+    // 15001
+    Source source = addSource(r'''
+abstract class A { set s1(v); set s2(v); }
+abstract class B implements A { set s1(v) {} }
+class C extends Object with B {}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_setter_and_implicitSetter() {
+    // test from language/override_inheritance_abstract_test_14.dart
+    Source source = addSource(r'''
+abstract class A {
+  set field(_);
+}
+abstract class I {
+  var field;
+}
+class B extends A implements I {
+  get field => 0;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_setter_fromInterface() {
+    Source source = addSource(r'''
+class I {
+  set s(int i) {}
+}
+class C implements I {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_setter_fromSuperclass() {
+    Source source = addSource(r'''
+abstract class A {
+  set s(int i);
+}
+class C extends A {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_superclasses_interface() {
+    // bug 11154
+    Source source = addSource(r'''
+class A {
+  get a => 'a';
+}
+abstract class B implements A {
+  get b => 'b';
+}
+class C extends B {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_variable_fromInterface_missingGetter() {
+    // 16133
+    Source source = addSource(r'''
+class I {
+  var v;
+}
+class C implements I {
+  set v(_) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_variable_fromInterface_missingSetter() {
+    // 16133
+    Source source = addSource(r'''
+class I {
+  var v;
+}
+class C implements I {
+  get v => 1;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberThree() {
+    Source source = addSource(r'''
+abstract class A {
+  m();
+  n();
+  o();
+}
+class C extends A {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberTwo() {
+    Source source = addSource(r'''
+abstract class A {
+  m();
+  n();
+}
+class C extends A {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberTwo_variable_fromInterface_missingBoth() {
+    // 16133
+    Source source = addSource(r'''
+class I {
+  var v;
+}
+class C implements I {
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source,
+        [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO]);
+    verify([source]);
+  }
+
+  void test_nonTypeInCatchClause_noElement() {
+    Source source = addSource(r'''
+f() {
+  try {
+  } on T catch (e) {
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE]);
+    verify([source]);
+  }
+
+  void test_nonTypeInCatchClause_notType() {
+    Source source = addSource(r'''
+var T = 0;
+f() {
+  try {
+  } on T catch (e) {
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE]);
+    verify([source]);
+  }
+
+  void test_nonVoidReturnForOperator() {
+    Source source = addSource(r'''
+class A {
+  int operator []=(a, b) { return a; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR]);
+    verify([source]);
+  }
+
+  void test_nonVoidReturnForSetter_function() {
+    Source source = addSource(r'''
+int set x(int v) {
+  return 42;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.NON_VOID_RETURN_FOR_SETTER]);
+    verify([source]);
+  }
+
+  void test_nonVoidReturnForSetter_method() {
+    Source source = addSource(r'''
+class A {
+  int set x(int v) {
+    return 42;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.NON_VOID_RETURN_FOR_SETTER]);
+    verify([source]);
+  }
+
+  void test_notAType() {
+    Source source = addSource(r'''
+f() {}
+main() {
+  f v = null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.NOT_A_TYPE]);
+    verify([source]);
+  }
+
+  void test_notEnoughRequiredArguments() {
+    Source source = addSource(r'''
+f(int a, String b) {}
+main() {
+  f();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_notEnoughRequiredArguments_functionExpression() {
+    Source source = addSource(r'''
+main() {
+  (int x) {} ();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_notEnoughRequiredArguments_getterReturningFunction() {
+    Source source = addSource(r'''
+typedef Getter(self);
+Getter getter = (x) => x;
+main() {
+  getter();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
+    verify([source]);
+  }
+
+  void test_partOfDifferentLibrary() {
+    Source source = addSource(r'''
+library lib;
+part 'part.dart';''');
+    addNamedSource("/part.dart", "part of lub;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.PART_OF_DIFFERENT_LIBRARY]);
+    verify([source]);
+  }
+
+  void test_redirectToInvalidFunctionType() {
+    Source source = addSource(r'''
+class A implements B {
+  A(int p) {}
+}
+class B {
+  factory B() = A;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE]);
+    verify([source]);
+  }
+
+  void test_redirectToInvalidReturnType() {
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+class B {
+  factory B() = A;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE]);
+    verify([source]);
+  }
+
+  void test_redirectToMissingConstructor_named() {
+    Source source = addSource(r'''
+class A implements B{
+  A() {}
+}
+class B {
+  factory B() = A.name;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR]);
+  }
+
+  void test_redirectToMissingConstructor_unnamed() {
+    Source source = addSource(r'''
+class A implements B{
+  A.name() {}
+}
+class B {
+  factory B() = A;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR]);
+  }
+
+  void test_redirectToNonClass_notAType() {
+    Source source = addSource(r'''
+class B {
+  int A;
+  factory B() = A;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.REDIRECT_TO_NON_CLASS]);
+    verify([source]);
+  }
+
+  void test_redirectToNonClass_undefinedIdentifier() {
+    Source source = addSource(r'''
+class B {
+  factory B() = A;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.REDIRECT_TO_NON_CLASS]);
+    verify([source]);
+  }
+
+  void test_returnWithoutValue_async() {
+    Source source = addSource('''
+import 'dart:async';
+Future<int> f() async {
+  return;
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.RETURN_WITHOUT_VALUE]);
+    verify([source]);
+  }
+
+  void test_returnWithoutValue_factoryConstructor() {
+    Source source = addSource("class A { factory A() { return; } }");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.RETURN_WITHOUT_VALUE]);
+    verify([source]);
+  }
+
+  void test_returnWithoutValue_function() {
+    Source source = addSource("int f() { return; }");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.RETURN_WITHOUT_VALUE]);
+    verify([source]);
+  }
+
+  void test_returnWithoutValue_method() {
+    Source source = addSource("class A { int m() { return; } }");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.RETURN_WITHOUT_VALUE]);
+    verify([source]);
+  }
+
+  void test_returnWithoutValue_mixedReturnTypes_function() {
+    // Tests that only the RETURN_WITHOUT_VALUE warning is created, and no
+    // MIXED_RETURN_TYPES are created.
+    Source source = addSource(r'''
+int f(int x) {
+  if (x < 0) {
+    return 1;
+  }
+  return;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.RETURN_WITHOUT_VALUE]);
+    verify([source]);
+  }
+
+  void test_staticAccessToInstanceMember_method_invocation() {
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+main() {
+  A.m();
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER]);
+    verify([source]);
+  }
+
+  void test_staticAccessToInstanceMember_method_reference() {
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+main() {
+  A.m;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER]);
+    verify([source]);
+  }
+
+  void test_staticAccessToInstanceMember_propertyAccess_field() {
+    Source source = addSource(r'''
+class A {
+  var f;
+}
+main() {
+  A.f;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER]);
+    verify([source]);
+  }
+
+  void test_staticAccessToInstanceMember_propertyAccess_getter() {
+    Source source = addSource(r'''
+class A {
+  get f => 42;
+}
+main() {
+  A.f;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER]);
+    verify([source]);
+  }
+
+  void test_staticAccessToInstanceMember_propertyAccess_setter() {
+    Source source = addSource(r'''
+class A {
+  set f(x) {}
+}
+main() {
+  A.f = 42;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER]);
+    verify([source]);
+  }
+
+  void test_switchExpressionNotAssignable() {
+    Source source = addSource(r'''
+f(int p) {
+  switch (p) {
+    case 'a': break;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+
+  void test_typeAnnotationDeferredClass_asExpression() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+f(var v) {
+  v as a.A;
+}'''
+    ], <ErrorCode>[
+      StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS
+    ]);
+  }
+
+  void test_typeAnnotationDeferredClass_catchClause() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+f(var v) {
+  try {
+  } on a.A {
+  }
+}'''
+    ], <ErrorCode>[
+      StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS
+    ]);
+  }
+
+  void test_typeAnnotationDeferredClass_fieldFormalParameter() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+class C {
+  var v;
+  C(a.A this.v);
+}'''
+    ], <ErrorCode>[
+      StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS
+    ]);
+  }
+
+  void test_typeAnnotationDeferredClass_functionDeclaration_returnType() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+a.A f() { return null; }'''
+    ], <ErrorCode>[
+      StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS
+    ]);
+  }
+
+  void test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+f(a.A g()) {}'''
+    ], <ErrorCode>[
+      StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS
+    ]);
+  }
+
+  void test_typeAnnotationDeferredClass_isExpression() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+f(var v) {
+  bool b = v is a.A;
+}'''
+    ], <ErrorCode>[
+      StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS
+    ]);
+  }
+
+  void test_typeAnnotationDeferredClass_methodDeclaration_returnType() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+class C {
+  a.A m() { return null; }
+}'''
+    ], <ErrorCode>[
+      StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS
+    ]);
+  }
+
+  void test_typeAnnotationDeferredClass_simpleFormalParameter() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+f(a.A v) {}'''
+    ], <ErrorCode>[
+      StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS
+    ]);
+  }
+
+  void test_typeAnnotationDeferredClass_typeArgumentList() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+class C<E> {}
+C<a.A> c;'''
+    ], <ErrorCode>[
+      StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS
+    ]);
+  }
+
+  void test_typeAnnotationDeferredClass_typeArgumentList2() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+class C<E, F> {}
+C<a.A, a.A> c;'''
+    ], <ErrorCode>[
+      StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS,
+      StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS
+    ]);
+  }
+
+  void test_typeAnnotationDeferredClass_typeParameter_bound() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+class C<E extends a.A> {}'''
+    ], <ErrorCode>[
+      StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS
+    ]);
+  }
+
+  void test_typeAnnotationDeferredClass_variableDeclarationList() {
+    resolveWithErrors(<String>[
+      r'''
+library lib1;
+class A {}''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+a.A v;'''
+    ], <ErrorCode>[
+      StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS
+    ]);
+  }
+
+  void test_typeParameterReferencedByStatic_field() {
+    Source source = addSource(r'''
+class A<K> {
+  static K k;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
+    verify([source]);
+  }
+
+  void test_typeParameterReferencedByStatic_getter() {
+    Source source = addSource(r'''
+class A<K> {
+  static K get k => null;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
+    verify([source]);
+  }
+
+  void test_typeParameterReferencedByStatic_methodBodyReference() {
+    Source source = addSource(r'''
+class A<K> {
+  static m() {
+    K k;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
+    verify([source]);
+  }
+
+  void test_typeParameterReferencedByStatic_methodParameter() {
+    Source source = addSource(r'''
+class A<K> {
+  static m(K k) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
+    verify([source]);
+  }
+
+  void test_typeParameterReferencedByStatic_methodReturn() {
+    Source source = addSource(r'''
+class A<K> {
+  static K m() { return null; }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
+    verify([source]);
+  }
+
+  void test_typeParameterReferencedByStatic_setter() {
+    Source source = addSource(r'''
+class A<K> {
+  static set s(K k) {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(
+        source, [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
+    verify([source]);
+  }
+
+  void test_typePromotion_functionType_arg_InterToDyn() {
+    Source source = addSource(r'''
+typedef FuncDyn(x);
+typedef FuncA(A a);
+class A {}
+class B {}
+main(FuncA f) {
+  if (f is FuncDyn) {
+    f(new B());
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+  }
+
+  void test_typeTestNonType() {
+    Source source = addSource(r'''
+var A = 0;
+f(var p) {
+  if (p is A) {
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.TYPE_TEST_WITH_NON_TYPE]);
+    verify([source]);
+  }
+
+  void test_typeTestWithUndefinedName() {
+    Source source = addSource(r'''
+f(var p) {
+  if (p is A) {
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.TYPE_TEST_WITH_UNDEFINED_NAME]);
+    verify([source]);
+  }
+
+  void test_undefinedClass_instanceCreation() {
+    Source source = addSource("f() { new C(); }");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.UNDEFINED_CLASS]);
+  }
+
+  void test_undefinedClass_variableDeclaration() {
+    Source source = addSource("f() { C c; }");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.UNDEFINED_CLASS]);
+  }
+
+  void test_undefinedClassBoolean_variableDeclaration() {
+    Source source = addSource("f() { boolean v; }");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.UNDEFINED_CLASS_BOOLEAN]);
+  }
+
+  void test_undefinedGetter_fromLibrary() {
+    Source source1 = addNamedSource("/lib.dart", "");
+    Source source2 = addNamedSource(
+        "/lib2.dart",
+        r'''
+import 'lib.dart' as lib;
+void f() {
+  var g = lib.gg;
+}''');
+    computeLibrarySourceErrors(source1);
+    computeLibrarySourceErrors(source2);
+    assertErrors(source2, [StaticWarningCode.UNDEFINED_GETTER]);
+    verify([source1]);
+  }
+
+  void test_undefinedIdentifier_for() {
+    Source source = addSource(r'''
+f(var l) {
+  for (e in l) {
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
+  }
+
+  void test_undefinedIdentifier_function() {
+    Source source = addSource("int a() => b;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
+  }
+
+  void test_undefinedIdentifier_importCore_withShow() {
+    Source source = addSource(r'''
+import 'dart:core' show List;
+main() {
+  List;
+  String;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
+  }
+
+  void test_undefinedIdentifier_initializer() {
+    Source source = addSource("var a = b;");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
+  }
+
+  void test_undefinedIdentifier_methodInvocation() {
+    Source source = addSource("f() { C.m(); }");
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
+  }
+
+  void test_undefinedIdentifier_private_getter() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+class A {
+  var _foo;
+}''');
+    Source source = addSource(r'''
+import 'lib.dart';
+class B extends A {
+  test() {
+    var v = _foo;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
+  }
+
+  void test_undefinedIdentifier_private_setter() {
+    addNamedSource(
+        "/lib.dart",
+        r'''
+library lib;
+class A {
+  var _foo;
+}''');
+    Source source = addSource(r'''
+import 'lib.dart';
+class B extends A {
+  test() {
+    _foo = 42;
+  }
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
+  }
+
+  void test_undefinedNamedParameter() {
+    Source source = addSource(r'''
+f({a, b}) {}
+main() {
+  f(c: 1);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.UNDEFINED_NAMED_PARAMETER]);
+    // no verify(), 'c' is not resolved
+  }
+
+  void test_undefinedSetter() {
+    Source source1 = addNamedSource("/lib.dart", "");
+    Source source2 = addNamedSource(
+        "/lib2.dart",
+        r'''
+import 'lib.dart' as lib;
+void f() {
+  lib.gg = null;
+}''');
+    computeLibrarySourceErrors(source1);
+    computeLibrarySourceErrors(source2);
+    assertErrors(source2, [StaticWarningCode.UNDEFINED_SETTER]);
+  }
+
+  void test_undefinedStaticMethodOrGetter_getter() {
+    Source source = addSource(r'''
+class C {}
+f(var p) {
+  f(C.m);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_undefinedStaticMethodOrGetter_getter_inSuperclass() {
+    Source source = addSource(r'''
+class S {
+  static int get g => 0;
+}
+class C extends S {}
+f(var p) {
+  f(C.g);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
+  }
+
+  void test_undefinedStaticMethodOrGetter_method() {
+    Source source = addSource(r'''
+class C {}
+f(var p) {
+  f(C.m());
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+  }
+
+  void test_undefinedStaticMethodOrGetter_method_inSuperclass() {
+    Source source = addSource(r'''
+class S {
+  static m() {}
+}
+class C extends S {}
+f(var p) {
+  f(C.m());
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
+  }
+
+  void test_undefinedStaticMethodOrGetter_setter_inSuperclass() {
+    Source source = addSource(r'''
+class S {
+  static set s(int i) {}
+}
+class C extends S {}
+f(var p) {
+  f(C.s = 1);
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SETTER]);
+  }
+
+  void test_voidReturnForGetter() {
+    Source source = addSource(r'''
+class S {
+  void get value {}
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [StaticWarningCode.VOID_RETURN_FOR_GETTER]);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/test_all.dart b/mojo/public/dart/third_party/analyzer/test/generated/test_all.dart
new file mode 100644
index 0000000..fb84d46
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/generated/test_all.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.generated;
+
+import 'package:unittest/unittest.dart';
+
+import '../utils.dart';
+import 'all_the_rest_test.dart' as all_the_rest;
+import 'ast_test.dart' as ast_test;
+import 'compile_time_error_code_test.dart' as compile_time_error_code_test;
+import 'element_test.dart' as element_test;
+import 'engine_test.dart' as engine_test;
+import 'incremental_resolver_test.dart' as incremental_resolver_test;
+import 'incremental_scanner_test.dart' as incremental_scanner_test;
+import 'java_core_test.dart' as java_core_test;
+import 'java_io_test.dart' as java_io_test;
+import 'non_error_resolver_test.dart' as non_error_resolver_test;
+import 'parser_test.dart' as parser_test;
+import 'resolver_test.dart' as resolver_test;
+import 'scanner_test.dart' as scanner_test;
+import 'source_factory_test.dart' as source_factory_test;
+import 'static_type_warning_code_test.dart' as static_type_warning_code_test;
+import 'static_warning_code_test.dart' as static_warning_code_test;
+import 'type_system_test.dart' as type_system_test;
+import 'utilities_test.dart' as utilities_test;
+
+/// Utility for manually running all tests.
+main() {
+  initializeTestEnvironment();
+  group('generated tests', () {
+    all_the_rest.main();
+    ast_test.main();
+    compile_time_error_code_test.main();
+    element_test.main();
+    engine_test.main();
+    incremental_resolver_test.main();
+    incremental_scanner_test.main();
+    java_core_test.main();
+    java_io_test.main();
+    non_error_resolver_test.main();
+    parser_test.main();
+    resolver_test.main();
+    scanner_test.main();
+    source_factory_test.main();
+    static_type_warning_code_test.main();
+    static_warning_code_test.main();
+    type_system_test.main();
+    utilities_test.main();
+  });
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/test_support.dart b/mojo/public/dart/third_party/analyzer/test/generated/test_support.dart
new file mode 100644
index 0000000..6c1b066
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/generated/test_support.dart
@@ -0,0 +1,649 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.test_support;
+
+import 'dart:collection';
+
+import 'package:analyzer/src/generated/ast.dart' show AstNode, NodeLocator;
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:unittest/unittest.dart';
+
+import 'resolver_test.dart';
+
+/**
+ * The class `EngineTestCase` defines utility methods for making assertions.
+ */
+class EngineTestCase {
+  /**
+   * Assert that the given collection has the same number of elements as the number of specified
+   * names, and that for each specified name, a corresponding element can be found in the given
+   * collection with that name.
+   *
+   * @param elements the elements
+   * @param names the names
+   */
+  void assertNamedElements(List<Element> elements, List<String> names) {
+    for (String elemName in names) {
+      bool found = false;
+      for (Element elem in elements) {
+        if (elem.name == elemName) {
+          found = true;
+          break;
+        }
+      }
+      if (!found) {
+        StringBuffer buffer = new StringBuffer();
+        buffer.write("Expected element named: ");
+        buffer.write(elemName);
+        buffer.write("\n  but found: ");
+        for (Element elem in elements) {
+          buffer.write(elem.name);
+          buffer.write(", ");
+        }
+        fail(buffer.toString());
+      }
+    }
+    expect(elements, hasLength(names.length));
+  }
+
+  AnalysisContext createAnalysisContext() {
+    return AnalysisContextFactory.contextWithCore();
+  }
+
+  /**
+   * Return the getter in the given type with the given name. Inherited getters are ignored.
+   *
+   * @param type the type in which the getter is declared
+   * @param getterName the name of the getter to be returned
+   * @return the property accessor element representing the getter with the given name
+   */
+  PropertyAccessorElement getGetter(InterfaceType type, String getterName) {
+    for (PropertyAccessorElement accessor in type.element.accessors) {
+      if (accessor.isGetter && accessor.name == getterName) {
+        return accessor;
+      }
+    }
+    fail("Could not find getter named $getterName in ${type.displayName}");
+    return null;
+  }
+
+  /**
+   * Return the method in the given type with the given name. Inherited methods are ignored.
+   *
+   * @param type the type in which the method is declared
+   * @param methodName the name of the method to be returned
+   * @return the method element representing the method with the given name
+   */
+  MethodElement getMethod(InterfaceType type, String methodName) {
+    for (MethodElement method in type.element.methods) {
+      if (method.name == methodName) {
+        return method;
+      }
+    }
+    fail("Could not find method named $methodName in ${type.displayName}");
+    return null;
+  }
+
+  void setUp() {}
+
+  void tearDown() {}
+
+  /**
+   * Assert that the given object is an instance of the expected class.
+   *
+   * @param expectedClass the class that the object is expected to be an instance of
+   * @param object the object being tested
+   * @return the object that was being tested
+   * @throws Exception if the object is not an instance of the expected class
+   */
+  static Object assertInstanceOf(
+      Predicate<Object> predicate, Type expectedClass, Object object) {
+    if (!predicate(object)) {
+      fail(
+          "Expected instance of $expectedClass, found ${object == null ? "null" : object.runtimeType}");
+    }
+    return object;
+  }
+
+  /**
+   * @return the [AstNode] with requested type at offset of the "prefix".
+   */
+  static AstNode findNode(
+      AstNode root, String code, String prefix, Predicate<AstNode> predicate) {
+    int offset = code.indexOf(prefix);
+    if (offset == -1) {
+      throw new IllegalArgumentException("Not found '$prefix'.");
+    }
+    AstNode node = new NodeLocator(offset).searchWithin(root);
+    return node.getAncestor(predicate);
+  }
+}
+
+/**
+ * Instances of the class `GatheringErrorListener` implement an error listener that collects
+ * all of the errors passed to it for later examination.
+ */
+class GatheringErrorListener implements AnalysisErrorListener {
+  /**
+   * An empty array of errors used when no errors are expected.
+   */
+  static List<AnalysisError> _NO_ERRORS = new List<AnalysisError>(0);
+
+  /**
+   * A list containing the errors that were collected.
+   */
+  List<AnalysisError> _errors = new List<AnalysisError>();
+
+  /**
+   * A table mapping sources to the line information for the source.
+   */
+  HashMap<Source, LineInfo> _lineInfoMap = new HashMap<Source, LineInfo>();
+
+  /**
+   * Initialize a newly created error listener to collect errors.
+   */
+  GatheringErrorListener();
+
+  /**
+   * Return the errors that were collected.
+   *
+   * @return the errors that were collected
+   */
+  List<AnalysisError> get errors => _errors;
+
+  /**
+   * Return `true` if at least one error has been gathered.
+   *
+   * @return `true` if at least one error has been gathered
+   */
+  bool get hasErrors => _errors.length > 0;
+
+  /**
+   * Add all of the given errors to this listener.
+   *
+   * @param the errors to be added
+   */
+  void addAll(List<AnalysisError> errors) {
+    for (AnalysisError error in errors) {
+      onError(error);
+    }
+  }
+
+  /**
+   * Add all of the errors recorded by the given listener to this listener.
+   *
+   * @param listener the listener that has recorded the errors to be added
+   */
+  void addAll2(RecordingErrorListener listener) {
+    addAll(listener.errors);
+  }
+
+  /**
+   * Assert that the number of errors that have been gathered matches the number of errors that are
+   * given and that they have the expected error codes and locations. The order in which the errors
+   * were gathered is ignored.
+   *
+   * @param errorCodes the errors that should have been gathered
+   * @throws AssertionFailedError if a different number of errors have been gathered than were
+   *           expected or if they do not have the same codes and locations
+   */
+  void assertErrors(List<AnalysisError> expectedErrors) {
+    if (_errors.length != expectedErrors.length) {
+      _fail(expectedErrors);
+    }
+    List<AnalysisError> remainingErrors = new List<AnalysisError>();
+    for (AnalysisError error in expectedErrors) {
+      remainingErrors.add(error);
+    }
+    for (AnalysisError error in _errors) {
+      if (!_foundAndRemoved(remainingErrors, error)) {
+        _fail(expectedErrors);
+      }
+    }
+  }
+
+  /**
+   * Assert that the number of errors that have been gathered matches the number of errors that are
+   * given and that they have the expected error codes. The order in which the errors were gathered
+   * is ignored.
+   *
+   * @param expectedErrorCodes the error codes of the errors that should have been gathered
+   * @throws AssertionFailedError if a different number of errors have been gathered than were
+   *           expected
+   */
+  void assertErrorsWithCodes(
+      [List<ErrorCode> expectedErrorCodes = ErrorCode.EMPTY_LIST]) {
+    StringBuffer buffer = new StringBuffer();
+    //
+    // Verify that the expected error codes have a non-empty message.
+    //
+    for (ErrorCode errorCode in expectedErrorCodes) {
+      expect(errorCode.message.isEmpty, isFalse,
+          reason: "Empty error code message");
+    }
+    //
+    // Compute the expected number of each type of error.
+    //
+    HashMap<ErrorCode, int> expectedCounts = new HashMap<ErrorCode, int>();
+    for (ErrorCode code in expectedErrorCodes) {
+      int count = expectedCounts[code];
+      if (count == null) {
+        count = 1;
+      } else {
+        count = count + 1;
+      }
+      expectedCounts[code] = count;
+    }
+    //
+    // Compute the actual number of each type of error.
+    //
+    HashMap<ErrorCode, List<AnalysisError>> errorsByCode =
+        new HashMap<ErrorCode, List<AnalysisError>>();
+    for (AnalysisError error in _errors) {
+      ErrorCode code = error.errorCode;
+      List<AnalysisError> list = errorsByCode[code];
+      if (list == null) {
+        list = new List<AnalysisError>();
+        errorsByCode[code] = list;
+      }
+      list.add(error);
+    }
+    //
+    // Compare the expected and actual number of each type of error.
+    //
+    expectedCounts.forEach((ErrorCode code, int expectedCount) {
+      int actualCount;
+      List<AnalysisError> list = errorsByCode.remove(code);
+      if (list == null) {
+        actualCount = 0;
+      } else {
+        actualCount = list.length;
+      }
+      if (actualCount != expectedCount) {
+        if (buffer.length == 0) {
+          buffer.write("Expected ");
+        } else {
+          buffer.write("; ");
+        }
+        buffer.write(expectedCount);
+        buffer.write(" errors of type ");
+        buffer.write(code.uniqueName);
+        buffer.write(", found ");
+        buffer.write(actualCount);
+      }
+    });
+    //
+    // Check that there are no more errors in the actual-errors map,
+    // otherwise record message.
+    //
+    errorsByCode.forEach((ErrorCode code, List<AnalysisError> actualErrors) {
+      int actualCount = actualErrors.length;
+      if (buffer.length == 0) {
+        buffer.write("Expected ");
+      } else {
+        buffer.write("; ");
+      }
+      buffer.write("0 errors of type ");
+      buffer.write(code.uniqueName);
+      buffer.write(", found ");
+      buffer.write(actualCount);
+      buffer.write(" (");
+      for (int i = 0; i < actualErrors.length; i++) {
+        AnalysisError error = actualErrors[i];
+        if (i > 0) {
+          buffer.write(", ");
+        }
+        buffer.write(error.offset);
+      }
+      buffer.write(")");
+    });
+    if (buffer.length > 0) {
+      fail(buffer.toString());
+    }
+  }
+
+  /**
+   * Assert that the number of errors that have been gathered matches the number of severities that
+   * are given and that there are the same number of errors and warnings as specified by the
+   * argument. The order in which the errors were gathered is ignored.
+   *
+   * @param expectedSeverities the severities of the errors that should have been gathered
+   * @throws AssertionFailedError if a different number of errors have been gathered than were
+   *           expected
+   */
+  void assertErrorsWithSeverities(List<ErrorSeverity> expectedSeverities) {
+    int expectedErrorCount = 0;
+    int expectedWarningCount = 0;
+    for (ErrorSeverity severity in expectedSeverities) {
+      if (severity == ErrorSeverity.ERROR) {
+        expectedErrorCount++;
+      } else {
+        expectedWarningCount++;
+      }
+    }
+    int actualErrorCount = 0;
+    int actualWarningCount = 0;
+    for (AnalysisError error in _errors) {
+      if (error.errorCode.errorSeverity == ErrorSeverity.ERROR) {
+        actualErrorCount++;
+      } else {
+        actualWarningCount++;
+      }
+    }
+    if (expectedErrorCount != actualErrorCount ||
+        expectedWarningCount != actualWarningCount) {
+      fail(
+          "Expected $expectedErrorCount errors and $expectedWarningCount warnings, found $actualErrorCount errors and $actualWarningCount warnings");
+    }
+  }
+
+  /**
+   * Assert that no errors have been gathered.
+   *
+   * @throws AssertionFailedError if any errors have been gathered
+   */
+  void assertNoErrors() {
+    assertErrors(_NO_ERRORS);
+  }
+
+  /**
+   * Return the line information associated with the given source, or `null` if no line
+   * information has been associated with the source.
+   *
+   * @param source the source with which the line information is associated
+   * @return the line information associated with the source
+   */
+  LineInfo getLineInfo(Source source) => _lineInfoMap[source];
+
+  /**
+   * Return `true` if an error with the given error code has been gathered.
+   *
+   * @param errorCode the error code being searched for
+   * @return `true` if an error with the given error code has been gathered
+   */
+  bool hasError(ErrorCode errorCode) {
+    for (AnalysisError error in _errors) {
+      if (identical(error.errorCode, errorCode)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  void onError(AnalysisError error) {
+    _errors.add(error);
+  }
+
+  /**
+   * Set the line information associated with the given source to the given information.
+   *
+   * @param source the source with which the line information is associated
+   * @param lineStarts the line start information to be associated with the source
+   */
+  void setLineInfo(Source source, List<int> lineStarts) {
+    _lineInfoMap[source] = new LineInfo(lineStarts);
+  }
+
+  /**
+   * Return `true` if the two errors are equivalent.
+   *
+   * @param firstError the first error being compared
+   * @param secondError the second error being compared
+   * @return `true` if the two errors are equivalent
+   */
+  bool _equalErrors(AnalysisError firstError, AnalysisError secondError) =>
+      identical(firstError.errorCode, secondError.errorCode) &&
+          firstError.offset == secondError.offset &&
+          firstError.length == secondError.length &&
+          _equalSources(firstError.source, secondError.source);
+
+  /**
+   * Return `true` if the two sources are equivalent.
+   *
+   * @param firstSource the first source being compared
+   * @param secondSource the second source being compared
+   * @return `true` if the two sources are equivalent
+   */
+  bool _equalSources(Source firstSource, Source secondSource) {
+    if (firstSource == null) {
+      return secondSource == null;
+    } else if (secondSource == null) {
+      return false;
+    }
+    return firstSource == secondSource;
+  }
+
+  /**
+   * Assert that the number of errors that have been gathered matches the number of errors that are
+   * given and that they have the expected error codes. The order in which the errors were gathered
+   * is ignored.
+   *
+   * @param errorCodes the errors that should have been gathered
+   * @throws AssertionFailedError with
+   */
+  void _fail(List<AnalysisError> expectedErrors) {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("Expected ");
+    buffer.write(expectedErrors.length);
+    buffer.write(" errors:");
+    for (AnalysisError error in expectedErrors) {
+      Source source = error.source;
+      LineInfo lineInfo = _lineInfoMap[source];
+      buffer.writeln();
+      if (lineInfo == null) {
+        int offset = error.offset;
+        StringUtils.printf(buffer, "  %s %s (%d..%d)", [
+          source == null ? "" : source.shortName,
+          error.errorCode,
+          offset,
+          offset + error.length
+        ]);
+      } else {
+        LineInfo_Location location = lineInfo.getLocation(error.offset);
+        StringUtils.printf(buffer, "  %s %s (%d, %d/%d)", [
+          source == null ? "" : source.shortName,
+          error.errorCode,
+          location.lineNumber,
+          location.columnNumber,
+          error.length
+        ]);
+      }
+    }
+    buffer.writeln();
+    buffer.write("found ");
+    buffer.write(_errors.length);
+    buffer.write(" errors:");
+    for (AnalysisError error in _errors) {
+      Source source = error.source;
+      LineInfo lineInfo = _lineInfoMap[source];
+      buffer.writeln();
+      if (lineInfo == null) {
+        int offset = error.offset;
+        StringUtils.printf(buffer, "  %s %s (%d..%d): %s", [
+          source == null ? "" : source.shortName,
+          error.errorCode,
+          offset,
+          offset + error.length,
+          error.message
+        ]);
+      } else {
+        LineInfo_Location location = lineInfo.getLocation(error.offset);
+        StringUtils.printf(buffer, "  %s %s (%d, %d/%d): %s", [
+          source == null ? "" : source.shortName,
+          error.errorCode,
+          location.lineNumber,
+          location.columnNumber,
+          error.length,
+          error.message
+        ]);
+      }
+    }
+    fail(buffer.toString());
+  }
+
+  /**
+   * Search through the given list of errors for an error that is equal to the target error. If one
+   * is found, remove it from the list and return `true`, otherwise return `false`
+   * without modifying the list.
+   *
+   * @param errors the errors through which we are searching
+   * @param targetError the error being searched for
+   * @return `true` if the error is found and removed from the list
+   */
+  bool _foundAndRemoved(List<AnalysisError> errors, AnalysisError targetError) {
+    for (AnalysisError error in errors) {
+      if (_equalErrors(error, targetError)) {
+        errors.remove(error);
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+/**
+ * Instances of the class [TestLogger] implement a logger that can be used by
+ * tests.
+ */
+class TestLogger implements Logger {
+  /**
+   * The number of error messages that were logged.
+   */
+  int errorCount = 0;
+
+  /**
+   * The number of informational messages that were logged.
+   */
+  int infoCount = 0;
+
+  @override
+  void logError(String message, [CaughtException exception]) {
+    errorCount++;
+  }
+
+  @override
+  void logError2(String message, Object exception) {
+    errorCount++;
+  }
+
+  @override
+  void logInformation(String message, [CaughtException exception]) {
+    infoCount++;
+  }
+
+  @override
+  void logInformation2(String message, Object exception) {
+    infoCount++;
+  }
+}
+
+class TestSource extends Source {
+  String _name;
+  String _contents;
+  int _modificationStamp = 0;
+  bool exists2 = true;
+
+  /**
+   * A flag indicating whether an exception should be generated when an attempt
+   * is made to access the contents of this source.
+   */
+  bool generateExceptionOnRead = false;
+
+  @override
+  int get modificationStamp => generateExceptionOnRead ? -1 : _modificationStamp;
+
+  /**
+   * The number of times that the contents of this source have been requested.
+   */
+  int readCount = 0;
+
+  TestSource([this._name = '/test.dart', this._contents]);
+
+  TimestampedData<String> get contents {
+    readCount++;
+    if (generateExceptionOnRead) {
+      String msg = "I/O Exception while getting the contents of " + _name;
+      throw new Exception(msg);
+    }
+    return new TimestampedData<String>(0, _contents);
+  }
+  String get encoding {
+    throw new UnsupportedOperationException();
+  }
+  String get fullName {
+    return _name;
+  }
+  int get hashCode => 0;
+  bool get isInSystemLibrary {
+    return false;
+  }
+  String get shortName {
+    return _name;
+  }
+  Uri get uri {
+    throw new UnsupportedOperationException();
+  }
+  UriKind get uriKind {
+    throw new UnsupportedOperationException();
+  }
+  bool operator ==(Object other) {
+    if (other is TestSource) {
+      return other._name == _name;
+    }
+    return false;
+  }
+  bool exists() => exists2;
+  void getContentsToReceiver(Source_ContentReceiver receiver) {
+    throw new UnsupportedOperationException();
+  }
+  Source resolve(String uri) {
+    throw new UnsupportedOperationException();
+  }
+  Uri resolveRelativeUri(Uri uri) {
+    return new Uri(scheme: 'file', path: _name).resolveUri(uri);
+  }
+  void setContents(String value) {
+    generateExceptionOnRead = false;
+    _modificationStamp = new DateTime.now().millisecondsSinceEpoch;
+    _contents = value;
+  }
+  @override
+  String toString() => '$_name';
+}
+
+class TestSourceWithUri extends TestSource {
+  final Uri uri;
+
+  TestSourceWithUri(String path, this.uri, [String content])
+      : super(path, content);
+
+  UriKind get uriKind {
+    if (uri == null) {
+      return UriKind.FILE_URI;
+    } else if (uri.scheme == 'dart') {
+      return UriKind.DART_URI;
+    } else if (uri.scheme == 'package') {
+      return UriKind.PACKAGE_URI;
+    }
+    return UriKind.FILE_URI;
+  }
+
+  bool operator ==(Object other) {
+    if (other is TestSource) {
+      return other.uri == uri;
+    }
+    return false;
+  }
+
+  Uri resolveRelativeUri(Uri uri) {
+    return this.uri.resolveUri(uri);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/type_system_test.dart b/mojo/public/dart/third_party/analyzer/test/generated/type_system_test.dart
new file mode 100644
index 0000000..c24297f
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/generated/type_system_test.dart
@@ -0,0 +1,358 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests related to the [TypeSystem] class.
+
+library engine.type_system_test;
+
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/testing/element_factory.dart';
+import 'package:analyzer/src/generated/testing/test_type_provider.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+import '../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(TypeSystemTest);
+}
+
+@reflectiveTest
+class TypeSystemTest {
+  TypeProvider typeProvider;
+  TypeSystem typeSystem;
+  FunctionType simpleFunctionType;
+
+  DartType get bottomType => typeProvider.bottomType;
+  InterfaceType get doubleType => typeProvider.doubleType;
+  DartType get dynamicType => typeProvider.dynamicType;
+  InterfaceType get functionType => typeProvider.functionType;
+  InterfaceType get intType => typeProvider.intType;
+  InterfaceType get listType => typeProvider.listType;
+  InterfaceType get numType => typeProvider.numType;
+  InterfaceType get objectType => typeProvider.objectType;
+  InterfaceType get stringType => typeProvider.stringType;
+  DartType get voidType => VoidTypeImpl.instance;
+
+  void setUp() {
+    typeProvider = new TestTypeProvider();
+    typeSystem = new TypeSystemImpl(typeProvider);
+    FunctionTypeAliasElementImpl typeAlias =
+        ElementFactory.functionTypeAliasElement('A');
+    typeAlias.parameters = [];
+    typeAlias.returnType = voidType;
+    simpleFunctionType = typeAlias.type;
+  }
+
+  void test_getLeastUpperBound_bottom_function() {
+    _checkLeastUpperBound(bottomType, simpleFunctionType, simpleFunctionType);
+  }
+
+  void test_getLeastUpperBound_bottom_interface() {
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    _checkLeastUpperBound(bottomType, interfaceType, interfaceType);
+  }
+
+  void test_getLeastUpperBound_bottom_typeParam() {
+    DartType typeParam = ElementFactory.typeParameterElement('T').type;
+    _checkLeastUpperBound(bottomType, typeParam, typeParam);
+  }
+
+  void test_getLeastUpperBound_directInterfaceCase() {
+    //
+    // class A
+    // class B implements A
+    // class C implements B
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    classB.interfaces = <InterfaceType>[typeA];
+    classC.interfaces = <InterfaceType>[typeB];
+    _checkLeastUpperBound(typeB, typeC, typeB);
+  }
+
+  void test_getLeastUpperBound_directSubclassCase() {
+    //
+    // class A
+    // class B extends A
+    // class C extends B
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classB.type);
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    _checkLeastUpperBound(typeB, typeC, typeB);
+  }
+
+  void test_getLeastUpperBound_dynamic_bottom() {
+    _checkLeastUpperBound(dynamicType, bottomType, dynamicType);
+  }
+
+  void test_getLeastUpperBound_dynamic_function() {
+    _checkLeastUpperBound(dynamicType, simpleFunctionType, dynamicType);
+  }
+
+  void test_getLeastUpperBound_dynamic_interface() {
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    _checkLeastUpperBound(dynamicType, interfaceType, dynamicType);
+  }
+
+  void test_getLeastUpperBound_dynamic_typeParam() {
+    DartType typeParam = ElementFactory.typeParameterElement('T').type;
+    _checkLeastUpperBound(dynamicType, typeParam, dynamicType);
+  }
+
+  void test_getLeastUpperBound_dynamic_void() {
+    _checkLeastUpperBound(dynamicType, voidType, dynamicType);
+  }
+
+  void test_getLeastUpperBound_interface_function() {
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    _checkLeastUpperBound(interfaceType, simpleFunctionType, objectType);
+  }
+
+  void test_getLeastUpperBound_mixinCase() {
+    //
+    // class A
+    // class B extends A
+    // class C extends A
+    // class D extends B with M, N, O, P
+    //
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    ClassElement classC = ElementFactory.classElement("C", classA.type);
+    ClassElementImpl classD = ElementFactory.classElement("D", classB.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeC = classC.type;
+    InterfaceType typeD = classD.type;
+    classD.mixins = <InterfaceType>[
+      ElementFactory.classElement2("M").type,
+      ElementFactory.classElement2("N").type,
+      ElementFactory.classElement2("O").type,
+      ElementFactory.classElement2("P").type
+    ];
+    _checkLeastUpperBound(typeD, typeC, typeA);
+  }
+
+  void test_getLeastUpperBound_object() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    DartType typeObject = typeA.element.supertype;
+    // assert that object does not have a super type
+    expect((typeObject.element as ClassElement).supertype, isNull);
+    // assert that both A and B have the same super type of Object
+    expect(typeB.element.supertype, typeObject);
+    // finally, assert that the only least upper bound of A and B is Object
+    _checkLeastUpperBound(typeA, typeB, typeObject);
+  }
+
+  void test_getLeastUpperBound_self() {
+    DartType typeParam = ElementFactory.typeParameterElement('T').type;
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    expect(
+        typeSystem.getLeastUpperBound(dynamicType, dynamicType), dynamicType);
+    expect(typeSystem.getLeastUpperBound(voidType, voidType), voidType);
+    expect(typeSystem.getLeastUpperBound(bottomType, bottomType), bottomType);
+    expect(typeSystem.getLeastUpperBound(typeParam, typeParam), typeParam);
+    expect(typeSystem.getLeastUpperBound(interfaceType, interfaceType),
+        interfaceType);
+    expect(
+        typeSystem.getLeastUpperBound(simpleFunctionType, simpleFunctionType),
+        simpleFunctionType);
+  }
+
+  void test_getLeastUpperBound_sharedSuperclass1() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classA.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    _checkLeastUpperBound(typeB, typeC, typeA);
+  }
+
+  void test_getLeastUpperBound_sharedSuperclass2() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classA.type);
+    ClassElementImpl classD = ElementFactory.classElement("D", classC.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeD = classD.type;
+    _checkLeastUpperBound(typeB, typeD, typeA);
+  }
+
+  void test_getLeastUpperBound_sharedSuperclass3() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classB.type);
+    ClassElementImpl classD = ElementFactory.classElement("D", classB.type);
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    InterfaceType typeD = classD.type;
+    _checkLeastUpperBound(typeC, typeD, typeB);
+  }
+
+  void test_getLeastUpperBound_sharedSuperclass4() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classA2 = ElementFactory.classElement2("A2");
+    ClassElement classA3 = ElementFactory.classElement2("A3");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classA.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeA2 = classA2.type;
+    InterfaceType typeA3 = classA3.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    classB.interfaces = <InterfaceType>[typeA2];
+    classC.interfaces = <InterfaceType>[typeA3];
+    _checkLeastUpperBound(typeB, typeC, typeA);
+  }
+
+  void test_getLeastUpperBound_sharedSuperinterface1() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    classB.interfaces = <InterfaceType>[typeA];
+    classC.interfaces = <InterfaceType>[typeA];
+    _checkLeastUpperBound(typeB, typeC, typeA);
+  }
+
+  void test_getLeastUpperBound_sharedSuperinterface2() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    ClassElementImpl classD = ElementFactory.classElement2("D");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    InterfaceType typeD = classD.type;
+    classB.interfaces = <InterfaceType>[typeA];
+    classC.interfaces = <InterfaceType>[typeA];
+    classD.interfaces = <InterfaceType>[typeC];
+    _checkLeastUpperBound(typeB, typeD, typeA);
+  }
+
+  void test_getLeastUpperBound_sharedSuperinterface3() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    ClassElementImpl classD = ElementFactory.classElement2("D");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    InterfaceType typeD = classD.type;
+    classB.interfaces = <InterfaceType>[typeA];
+    classC.interfaces = <InterfaceType>[typeB];
+    classD.interfaces = <InterfaceType>[typeB];
+    _checkLeastUpperBound(typeC, typeD, typeB);
+  }
+
+  void test_getLeastUpperBound_sharedSuperinterface4() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classA2 = ElementFactory.classElement2("A2");
+    ClassElement classA3 = ElementFactory.classElement2("A3");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeA2 = classA2.type;
+    InterfaceType typeA3 = classA3.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    classB.interfaces = <InterfaceType>[typeA, typeA2];
+    classC.interfaces = <InterfaceType>[typeA, typeA3];
+    _checkLeastUpperBound(typeB, typeC, typeA);
+  }
+
+  void test_getLeastUpperBound_twoComparables() {
+    _checkLeastUpperBound(stringType, numType, objectType);
+  }
+
+  void test_getLeastUpperBound_typeParam_function_bounded() {
+    DartType typeA = ElementFactory.classElement('A', functionType).type;
+    TypeParameterElementImpl typeParamElement =
+        ElementFactory.typeParameterElement('T');
+    typeParamElement.bound = typeA;
+    DartType typeParam = typeParamElement.type;
+    _checkLeastUpperBound(typeParam, simpleFunctionType, functionType);
+  }
+
+  void test_getLeastUpperBound_typeParam_function_noBound() {
+    DartType typeParam = ElementFactory.typeParameterElement('T').type;
+    _checkLeastUpperBound(typeParam, simpleFunctionType, objectType);
+  }
+
+  void test_getLeastUpperBound_typeParam_interface_bounded() {
+    DartType typeA = ElementFactory.classElement2('A', []).type;
+    DartType typeB = ElementFactory.classElement('B', typeA).type;
+    DartType typeC = ElementFactory.classElement('C', typeA).type;
+    TypeParameterElementImpl typeParamElement =
+        ElementFactory.typeParameterElement('T');
+    typeParamElement.bound = typeB;
+    DartType typeParam = typeParamElement.type;
+    _checkLeastUpperBound(typeParam, typeC, typeA);
+  }
+
+  void test_getLeastUpperBound_typeParam_interface_noBound() {
+    DartType typeParam = ElementFactory.typeParameterElement('T').type;
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    _checkLeastUpperBound(typeParam, interfaceType, objectType);
+  }
+
+  void test_getLeastUpperBound_typeParameters_different() {
+    //
+    // class List<int>
+    // class List<double>
+    //
+    InterfaceType listOfIntType = listType.substitute4(<DartType>[intType]);
+    InterfaceType listOfDoubleType =
+        listType.substitute4(<DartType>[doubleType]);
+    _checkLeastUpperBound(listOfIntType, listOfDoubleType, objectType);
+  }
+
+  void test_getLeastUpperBound_typeParameters_same() {
+    //
+    // List<int>
+    // List<int>
+    //
+    InterfaceType listOfIntType = listType.substitute4(<DartType>[intType]);
+    expect(typeSystem.getLeastUpperBound(listOfIntType, listOfIntType),
+        listOfIntType);
+  }
+
+  void test_getLeastUpperBound_void_bottom() {
+    _checkLeastUpperBound(voidType, bottomType, voidType);
+  }
+
+  void test_getLeastUpperBound_void_function() {
+    _checkLeastUpperBound(voidType, simpleFunctionType, voidType);
+  }
+
+  void test_getLeastUpperBound_void_interface() {
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    _checkLeastUpperBound(voidType, interfaceType, voidType);
+  }
+
+  void test_getLeastUpperBound_void_typeParam() {
+    DartType typeParam = ElementFactory.typeParameterElement('T').type;
+    _checkLeastUpperBound(voidType, typeParam, voidType);
+  }
+
+  void _checkLeastUpperBound(
+      DartType type1, DartType type2, DartType expectedResult) {
+    expect(typeSystem.getLeastUpperBound(type1, type2), expectedResult);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/generated/utilities_test.dart b/mojo/public/dart/third_party/analyzer/test/generated/utilities_test.dart
new file mode 100644
index 0000000..24263e7
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/generated/utilities_test.dart
@@ -0,0 +1,4837 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.utilities_test;
+
+import 'dart:collection';
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/testing/ast_factory.dart';
+import 'package:analyzer/src/generated/testing/token_factory.dart';
+import 'package:analyzer/src/generated/utilities_collection.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+import '../utils.dart';
+import 'test_support.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(AstClonerTest);
+  runReflectiveTests(NodeReplacerTest);
+  runReflectiveTests(LineInfoTest);
+  runReflectiveTests(SourceRangeTest);
+  runReflectiveTests(BooleanArrayTest);
+  runReflectiveTests(DirectedGraphTest);
+  runReflectiveTests(ListUtilitiesTest);
+  runReflectiveTests(MultipleMapIteratorTest);
+  runReflectiveTests(SingleMapIteratorTest);
+  runReflectiveTests(TokenMapTest);
+  runReflectiveTests(StringUtilitiesTest);
+}
+
+class AstCloneComparator extends AstComparator {
+  final bool expectTokensCopied;
+
+  AstCloneComparator(this.expectTokensCopied);
+
+  @override
+  bool isEqualNodes(AstNode first, AstNode second) {
+    if (first != null && identical(first, second)) {
+      fail('Failed to copy node: $first (${first.offset})');
+      return false;
+    }
+    return super.isEqualNodes(first, second);
+  }
+
+  @override
+  bool isEqualTokens(Token first, Token second) {
+    if (expectTokensCopied && first != null && identical(first, second)) {
+      fail('Failed to copy token: ${first.lexeme} (${first.offset})');
+      return false;
+    }
+    return super.isEqualTokens(first, second);
+  }
+}
+
+@reflectiveTest
+class AstClonerTest extends EngineTestCase {
+  void test_visitAdjacentStrings() {
+    _assertClone(AstFactory
+        .adjacentStrings([AstFactory.string2("a"), AstFactory.string2("b")]));
+  }
+
+  void test_visitAnnotation_constant() {
+    _assertClone(AstFactory.annotation(AstFactory.identifier3("A")));
+  }
+
+  void test_visitAnnotation_constructor() {
+    _assertClone(AstFactory.annotation2(AstFactory.identifier3("A"),
+        AstFactory.identifier3("c"), AstFactory.argumentList()));
+  }
+
+  void test_visitArgumentList() {
+    _assertClone(AstFactory.argumentList(
+        [AstFactory.identifier3("a"), AstFactory.identifier3("b")]));
+  }
+
+  void test_visitAsExpression() {
+    _assertClone(AstFactory.asExpression(
+        AstFactory.identifier3("e"), AstFactory.typeName4("T")));
+  }
+
+  void test_visitAssertStatement() {
+    _assertClone(AstFactory.assertStatement(AstFactory.identifier3("a")));
+  }
+
+  void test_visitAssignmentExpression() {
+    _assertClone(AstFactory.assignmentExpression(AstFactory.identifier3("a"),
+        TokenType.EQ, AstFactory.identifier3("b")));
+  }
+
+  void test_visitAwaitExpression() {
+    _assertClone(AstFactory.awaitExpression(AstFactory.identifier3("a")));
+  }
+
+  void test_visitBinaryExpression() {
+    _assertClone(AstFactory.binaryExpression(AstFactory.identifier3("a"),
+        TokenType.PLUS, AstFactory.identifier3("b")));
+  }
+
+  void test_visitBlock_empty() {
+    _assertClone(AstFactory.block());
+  }
+
+  void test_visitBlock_nonEmpty() {
+    _assertClone(AstFactory
+        .block([AstFactory.breakStatement(), AstFactory.breakStatement()]));
+  }
+
+  void test_visitBlockFunctionBody() {
+    _assertClone(AstFactory.blockFunctionBody2());
+  }
+
+  void test_visitBooleanLiteral_false() {
+    _assertClone(AstFactory.booleanLiteral(false));
+  }
+
+  void test_visitBooleanLiteral_true() {
+    _assertClone(AstFactory.booleanLiteral(true));
+  }
+
+  void test_visitBreakStatement_label() {
+    _assertClone(AstFactory.breakStatement2("l"));
+  }
+
+  void test_visitBreakStatement_noLabel() {
+    _assertClone(AstFactory.breakStatement());
+  }
+
+  void test_visitCascadeExpression_field() {
+    _assertClone(AstFactory.cascadeExpression(AstFactory.identifier3("a"), [
+      AstFactory.cascadedPropertyAccess("b"),
+      AstFactory.cascadedPropertyAccess("c")
+    ]));
+  }
+
+  void test_visitCascadeExpression_index() {
+    _assertClone(AstFactory.cascadeExpression(AstFactory.identifier3("a"), [
+      AstFactory.cascadedIndexExpression(AstFactory.integer(0)),
+      AstFactory.cascadedIndexExpression(AstFactory.integer(1))
+    ]));
+  }
+
+  void test_visitCascadeExpression_method() {
+    _assertClone(AstFactory.cascadeExpression(AstFactory.identifier3("a"), [
+      AstFactory.cascadedMethodInvocation("b"),
+      AstFactory.cascadedMethodInvocation("c")
+    ]));
+  }
+
+  void test_visitCatchClause_catch_noStack() {
+    _assertClone(AstFactory.catchClause("e"));
+  }
+
+  void test_visitCatchClause_catch_stack() {
+    _assertClone(AstFactory.catchClause2("e", "s"));
+  }
+
+  void test_visitCatchClause_on() {
+    _assertClone(AstFactory.catchClause3(AstFactory.typeName4("E")));
+  }
+
+  void test_visitCatchClause_on_catch() {
+    _assertClone(AstFactory.catchClause4(AstFactory.typeName4("E"), "e"));
+  }
+
+  void test_visitClassDeclaration_abstract() {
+    _assertClone(AstFactory.classDeclaration(
+        Keyword.ABSTRACT, "C", null, null, null, null));
+  }
+
+  void test_visitClassDeclaration_empty() {
+    _assertClone(
+        AstFactory.classDeclaration(null, "C", null, null, null, null));
+  }
+
+  void test_visitClassDeclaration_extends() {
+    _assertClone(AstFactory.classDeclaration(null, "C", null,
+        AstFactory.extendsClause(AstFactory.typeName4("A")), null, null));
+  }
+
+  void test_visitClassDeclaration_extends_implements() {
+    _assertClone(AstFactory.classDeclaration(
+        null,
+        "C",
+        null,
+        AstFactory.extendsClause(AstFactory.typeName4("A")),
+        null,
+        AstFactory.implementsClause([AstFactory.typeName4("B")])));
+  }
+
+  void test_visitClassDeclaration_extends_with() {
+    _assertClone(AstFactory.classDeclaration(
+        null,
+        "C",
+        null,
+        AstFactory.extendsClause(AstFactory.typeName4("A")),
+        AstFactory.withClause([AstFactory.typeName4("M")]),
+        null));
+  }
+
+  void test_visitClassDeclaration_extends_with_implements() {
+    _assertClone(AstFactory.classDeclaration(
+        null,
+        "C",
+        null,
+        AstFactory.extendsClause(AstFactory.typeName4("A")),
+        AstFactory.withClause([AstFactory.typeName4("M")]),
+        AstFactory.implementsClause([AstFactory.typeName4("B")])));
+  }
+
+  void test_visitClassDeclaration_implements() {
+    _assertClone(AstFactory.classDeclaration(null, "C", null, null, null,
+        AstFactory.implementsClause([AstFactory.typeName4("B")])));
+  }
+
+  void test_visitClassDeclaration_multipleMember() {
+    _assertClone(
+        AstFactory.classDeclaration(null, "C", null, null, null, null, [
+      AstFactory.fieldDeclaration2(
+          false, Keyword.VAR, [AstFactory.variableDeclaration("a")]),
+      AstFactory.fieldDeclaration2(
+          false, Keyword.VAR, [AstFactory.variableDeclaration("b")])
+    ]));
+  }
+
+  void test_visitClassDeclaration_parameters() {
+    _assertClone(AstFactory.classDeclaration(
+        null, "C", AstFactory.typeParameterList(["E"]), null, null, null));
+  }
+
+  void test_visitClassDeclaration_parameters_extends() {
+    _assertClone(AstFactory.classDeclaration(
+        null,
+        "C",
+        AstFactory.typeParameterList(["E"]),
+        AstFactory.extendsClause(AstFactory.typeName4("A")),
+        null,
+        null));
+  }
+
+  void test_visitClassDeclaration_parameters_extends_implements() {
+    _assertClone(AstFactory.classDeclaration(
+        null,
+        "C",
+        AstFactory.typeParameterList(["E"]),
+        AstFactory.extendsClause(AstFactory.typeName4("A")),
+        null,
+        AstFactory.implementsClause([AstFactory.typeName4("B")])));
+  }
+
+  void test_visitClassDeclaration_parameters_extends_with() {
+    _assertClone(AstFactory.classDeclaration(
+        null,
+        "C",
+        AstFactory.typeParameterList(["E"]),
+        AstFactory.extendsClause(AstFactory.typeName4("A")),
+        AstFactory.withClause([AstFactory.typeName4("M")]),
+        null));
+  }
+
+  void test_visitClassDeclaration_parameters_extends_with_implements() {
+    _assertClone(AstFactory.classDeclaration(
+        null,
+        "C",
+        AstFactory.typeParameterList(["E"]),
+        AstFactory.extendsClause(AstFactory.typeName4("A")),
+        AstFactory.withClause([AstFactory.typeName4("M")]),
+        AstFactory.implementsClause([AstFactory.typeName4("B")])));
+  }
+
+  void test_visitClassDeclaration_parameters_implements() {
+    _assertClone(AstFactory.classDeclaration(
+        null,
+        "C",
+        AstFactory.typeParameterList(["E"]),
+        null,
+        null,
+        AstFactory.implementsClause([AstFactory.typeName4("B")])));
+  }
+
+  void test_visitClassDeclaration_singleMember() {
+    _assertClone(
+        AstFactory.classDeclaration(null, "C", null, null, null, null, [
+      AstFactory.fieldDeclaration2(
+          false, Keyword.VAR, [AstFactory.variableDeclaration("a")])
+    ]));
+  }
+
+  void test_visitClassDeclaration_withMetadata() {
+    ClassDeclaration declaration =
+        AstFactory.classDeclaration(null, "C", null, null, null, null);
+    declaration.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertClone(declaration);
+  }
+
+  void test_visitClassTypeAlias_abstract() {
+    _assertClone(AstFactory.classTypeAlias(
+        "C",
+        null,
+        Keyword.ABSTRACT,
+        AstFactory.typeName4("S"),
+        AstFactory.withClause([AstFactory.typeName4("M1")]),
+        null));
+  }
+
+  void test_visitClassTypeAlias_abstract_implements() {
+    _assertClone(AstFactory.classTypeAlias(
+        "C",
+        null,
+        Keyword.ABSTRACT,
+        AstFactory.typeName4("S"),
+        AstFactory.withClause([AstFactory.typeName4("M1")]),
+        AstFactory.implementsClause([AstFactory.typeName4("I")])));
+  }
+
+  void test_visitClassTypeAlias_generic() {
+    _assertClone(AstFactory.classTypeAlias(
+        "C",
+        AstFactory.typeParameterList(["E"]),
+        null,
+        AstFactory.typeName4("S", [AstFactory.typeName4("E")]),
+        AstFactory.withClause([
+          AstFactory.typeName4("M1", [AstFactory.typeName4("E")])
+        ]),
+        null));
+  }
+
+  void test_visitClassTypeAlias_implements() {
+    _assertClone(AstFactory.classTypeAlias(
+        "C",
+        null,
+        null,
+        AstFactory.typeName4("S"),
+        AstFactory.withClause([AstFactory.typeName4("M1")]),
+        AstFactory.implementsClause([AstFactory.typeName4("I")])));
+  }
+
+  void test_visitClassTypeAlias_minimal() {
+    _assertClone(AstFactory.classTypeAlias(
+        "C",
+        null,
+        null,
+        AstFactory.typeName4("S"),
+        AstFactory.withClause([AstFactory.typeName4("M1")]),
+        null));
+  }
+
+  void test_visitClassTypeAlias_parameters_abstract() {
+    _assertClone(AstFactory.classTypeAlias(
+        "C",
+        AstFactory.typeParameterList(["E"]),
+        Keyword.ABSTRACT,
+        AstFactory.typeName4("S"),
+        AstFactory.withClause([AstFactory.typeName4("M1")]),
+        null));
+  }
+
+  void test_visitClassTypeAlias_parameters_abstract_implements() {
+    _assertClone(AstFactory.classTypeAlias(
+        "C",
+        AstFactory.typeParameterList(["E"]),
+        Keyword.ABSTRACT,
+        AstFactory.typeName4("S"),
+        AstFactory.withClause([AstFactory.typeName4("M1")]),
+        AstFactory.implementsClause([AstFactory.typeName4("I")])));
+  }
+
+  void test_visitClassTypeAlias_parameters_implements() {
+    _assertClone(AstFactory.classTypeAlias(
+        "C",
+        AstFactory.typeParameterList(["E"]),
+        null,
+        AstFactory.typeName4("S"),
+        AstFactory.withClause([AstFactory.typeName4("M1")]),
+        AstFactory.implementsClause([AstFactory.typeName4("I")])));
+  }
+
+  void test_visitClassTypeAlias_withMetadata() {
+    ClassTypeAlias declaration = AstFactory.classTypeAlias(
+        "C",
+        null,
+        null,
+        AstFactory.typeName4("S"),
+        AstFactory.withClause([AstFactory.typeName4("M1")]),
+        null);
+    declaration.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertClone(declaration);
+  }
+
+  void test_visitComment() {
+    _assertClone(Comment.createBlockComment(
+        <Token>[TokenFactory.tokenFromString("/* comment */")]));
+  }
+
+  void test_visitCommentReference() {
+    _assertClone(new CommentReference(null, AstFactory.identifier3("a")));
+  }
+
+  void test_visitCompilationUnit_declaration() {
+    _assertClone(AstFactory.compilationUnit2([
+      AstFactory.topLevelVariableDeclaration2(
+          Keyword.VAR, [AstFactory.variableDeclaration("a")])
+    ]));
+  }
+
+  void test_visitCompilationUnit_directive() {
+    _assertClone(
+        AstFactory.compilationUnit3([AstFactory.libraryDirective2("l")]));
+  }
+
+  void test_visitCompilationUnit_directive_declaration() {
+    _assertClone(AstFactory.compilationUnit4([
+      AstFactory.libraryDirective2("l")
+    ], [
+      AstFactory.topLevelVariableDeclaration2(
+          Keyword.VAR, [AstFactory.variableDeclaration("a")])
+    ]));
+  }
+
+  void test_visitCompilationUnit_empty() {
+    _assertClone(AstFactory.compilationUnit());
+  }
+
+  void test_visitCompilationUnit_script() {
+    _assertClone(AstFactory.compilationUnit5("!#/bin/dartvm"));
+  }
+
+  void test_visitCompilationUnit_script_declaration() {
+    _assertClone(AstFactory.compilationUnit6("!#/bin/dartvm", [
+      AstFactory.topLevelVariableDeclaration2(
+          Keyword.VAR, [AstFactory.variableDeclaration("a")])
+    ]));
+  }
+
+  void test_visitCompilationUnit_script_directive() {
+    _assertClone(AstFactory.compilationUnit7(
+        "!#/bin/dartvm", [AstFactory.libraryDirective2("l")]));
+  }
+
+  void test_visitCompilationUnit_script_directives_declarations() {
+    _assertClone(AstFactory.compilationUnit8("!#/bin/dartvm", [
+      AstFactory.libraryDirective2("l")
+    ], [
+      AstFactory.topLevelVariableDeclaration2(
+          Keyword.VAR, [AstFactory.variableDeclaration("a")])
+    ]));
+  }
+
+  void test_visitConditionalExpression() {
+    _assertClone(AstFactory.conditionalExpression(AstFactory.identifier3("a"),
+        AstFactory.identifier3("b"), AstFactory.identifier3("c")));
+  }
+
+  void test_visitConstructorDeclaration_const() {
+    _assertClone(AstFactory.constructorDeclaration2(
+        Keyword.CONST,
+        null,
+        AstFactory.identifier3("C"),
+        null,
+        AstFactory.formalParameterList(),
+        null,
+        AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitConstructorDeclaration_external() {
+    _assertClone(AstFactory.constructorDeclaration(AstFactory.identifier3("C"),
+        null, AstFactory.formalParameterList(), null));
+  }
+
+  void test_visitConstructorDeclaration_minimal() {
+    _assertClone(AstFactory.constructorDeclaration2(
+        null,
+        null,
+        AstFactory.identifier3("C"),
+        null,
+        AstFactory.formalParameterList(),
+        null,
+        AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitConstructorDeclaration_multipleInitializers() {
+    _assertClone(AstFactory.constructorDeclaration2(
+        null,
+        null,
+        AstFactory.identifier3("C"),
+        null,
+        AstFactory.formalParameterList(),
+        [
+          AstFactory.constructorFieldInitializer(
+              false, "a", AstFactory.identifier3("b")),
+          AstFactory.constructorFieldInitializer(
+              false, "c", AstFactory.identifier3("d"))
+        ],
+        AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitConstructorDeclaration_multipleParameters() {
+    _assertClone(AstFactory.constructorDeclaration2(
+        null,
+        null,
+        AstFactory.identifier3("C"),
+        null,
+        AstFactory.formalParameterList([
+          AstFactory.simpleFormalParameter(Keyword.VAR, "a"),
+          AstFactory.simpleFormalParameter(Keyword.VAR, "b")
+        ]),
+        null,
+        AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitConstructorDeclaration_named() {
+    _assertClone(AstFactory.constructorDeclaration2(
+        null,
+        null,
+        AstFactory.identifier3("C"),
+        "m",
+        AstFactory.formalParameterList(),
+        null,
+        AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitConstructorDeclaration_singleInitializer() {
+    _assertClone(AstFactory.constructorDeclaration2(
+        null,
+        null,
+        AstFactory.identifier3("C"),
+        null,
+        AstFactory.formalParameterList(),
+        [
+          AstFactory.constructorFieldInitializer(
+              false, "a", AstFactory.identifier3("b"))
+        ],
+        AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitConstructorDeclaration_withMetadata() {
+    ConstructorDeclaration declaration = AstFactory.constructorDeclaration2(
+        null,
+        null,
+        AstFactory.identifier3("C"),
+        null,
+        AstFactory.formalParameterList(),
+        null,
+        AstFactory.blockFunctionBody2());
+    declaration.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertClone(declaration);
+  }
+
+  void test_visitConstructorFieldInitializer_withoutThis() {
+    _assertClone(AstFactory.constructorFieldInitializer(
+        false, "a", AstFactory.identifier3("b")));
+  }
+
+  void test_visitConstructorFieldInitializer_withThis() {
+    _assertClone(AstFactory.constructorFieldInitializer(
+        true, "a", AstFactory.identifier3("b")));
+  }
+
+  void test_visitConstructorName_named_prefix() {
+    _assertClone(
+        AstFactory.constructorName(AstFactory.typeName4("p.C.n"), null));
+  }
+
+  void test_visitConstructorName_unnamed_noPrefix() {
+    _assertClone(AstFactory.constructorName(AstFactory.typeName4("C"), null));
+  }
+
+  void test_visitConstructorName_unnamed_prefix() {
+    _assertClone(AstFactory.constructorName(
+        AstFactory.typeName3(AstFactory.identifier5("p", "C")), null));
+  }
+
+  void test_visitContinueStatement_label() {
+    _assertClone(AstFactory.continueStatement("l"));
+  }
+
+  void test_visitContinueStatement_noLabel() {
+    _assertClone(AstFactory.continueStatement());
+  }
+
+  void test_visitDefaultFormalParameter_named_noValue() {
+    _assertClone(AstFactory.namedFormalParameter(
+        AstFactory.simpleFormalParameter3("p"), null));
+  }
+
+  void test_visitDefaultFormalParameter_named_value() {
+    _assertClone(AstFactory.namedFormalParameter(
+        AstFactory.simpleFormalParameter3("p"), AstFactory.integer(0)));
+  }
+
+  void test_visitDefaultFormalParameter_positional_noValue() {
+    _assertClone(AstFactory.positionalFormalParameter(
+        AstFactory.simpleFormalParameter3("p"), null));
+  }
+
+  void test_visitDefaultFormalParameter_positional_value() {
+    _assertClone(AstFactory.positionalFormalParameter(
+        AstFactory.simpleFormalParameter3("p"), AstFactory.integer(0)));
+  }
+
+  void test_visitDoStatement() {
+    _assertClone(AstFactory.doStatement(
+        AstFactory.block(), AstFactory.identifier3("c")));
+  }
+
+  void test_visitDoubleLiteral() {
+    _assertClone(AstFactory.doubleLiteral(4.2));
+  }
+
+  void test_visitEmptyFunctionBody() {
+    _assertClone(AstFactory.emptyFunctionBody());
+  }
+
+  void test_visitEmptyStatement() {
+    _assertClone(AstFactory.emptyStatement());
+  }
+
+  void test_visitExportDirective_combinator() {
+    _assertClone(AstFactory.exportDirective2("a.dart", [
+      AstFactory.showCombinator([AstFactory.identifier3("A")])
+    ]));
+  }
+
+  void test_visitExportDirective_combinators() {
+    _assertClone(AstFactory.exportDirective2("a.dart", [
+      AstFactory.showCombinator([AstFactory.identifier3("A")]),
+      AstFactory.hideCombinator([AstFactory.identifier3("B")])
+    ]));
+  }
+
+  void test_visitExportDirective_minimal() {
+    _assertClone(AstFactory.exportDirective2("a.dart"));
+  }
+
+  void test_visitExportDirective_withMetadata() {
+    ExportDirective directive = AstFactory.exportDirective2("a.dart");
+    directive.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertClone(directive);
+  }
+
+  void test_visitExpressionFunctionBody() {
+    _assertClone(
+        AstFactory.expressionFunctionBody(AstFactory.identifier3("a")));
+  }
+
+  void test_visitExpressionStatement() {
+    _assertClone(AstFactory.expressionStatement(AstFactory.identifier3("a")));
+  }
+
+  void test_visitExtendsClause() {
+    _assertClone(AstFactory.extendsClause(AstFactory.typeName4("C")));
+  }
+
+  void test_visitFieldDeclaration_instance() {
+    _assertClone(AstFactory.fieldDeclaration2(
+        false, Keyword.VAR, [AstFactory.variableDeclaration("a")]));
+  }
+
+  void test_visitFieldDeclaration_static() {
+    _assertClone(AstFactory.fieldDeclaration2(
+        true, Keyword.VAR, [AstFactory.variableDeclaration("a")]));
+  }
+
+  void test_visitFieldDeclaration_withMetadata() {
+    FieldDeclaration declaration = AstFactory.fieldDeclaration2(
+        false, Keyword.VAR, [AstFactory.variableDeclaration("a")]);
+    declaration.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertClone(declaration);
+  }
+
+  void test_visitFieldFormalParameter_functionTyped() {
+    _assertClone(AstFactory.fieldFormalParameter(
+        null,
+        AstFactory.typeName4("A"),
+        "a",
+        AstFactory
+            .formalParameterList([AstFactory.simpleFormalParameter3("b")])));
+  }
+
+  void test_visitFieldFormalParameter_keyword() {
+    _assertClone(AstFactory.fieldFormalParameter(Keyword.VAR, null, "a"));
+  }
+
+  void test_visitFieldFormalParameter_keywordAndType() {
+    _assertClone(AstFactory.fieldFormalParameter(
+        Keyword.FINAL, AstFactory.typeName4("A"), "a"));
+  }
+
+  void test_visitFieldFormalParameter_type() {
+    _assertClone(
+        AstFactory.fieldFormalParameter(null, AstFactory.typeName4("A"), "a"));
+  }
+
+  void test_visitForEachStatement_declared() {
+    _assertClone(AstFactory.forEachStatement(
+        AstFactory.declaredIdentifier3("a"),
+        AstFactory.identifier3("b"),
+        AstFactory.block()));
+  }
+
+  void test_visitForEachStatement_variable() {
+    _assertClone(new ForEachStatement.withReference(
+        null,
+        TokenFactory.tokenFromKeyword(Keyword.FOR),
+        TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+        AstFactory.identifier3("a"),
+        TokenFactory.tokenFromKeyword(Keyword.IN),
+        AstFactory.identifier3("b"),
+        TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+        AstFactory.block()));
+  }
+
+  void test_visitForEachStatement_variable_await() {
+    _assertClone(new ForEachStatement.withReference(
+        TokenFactory.tokenFromString("await"),
+        TokenFactory.tokenFromKeyword(Keyword.FOR),
+        TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+        AstFactory.identifier3("a"),
+        TokenFactory.tokenFromKeyword(Keyword.IN),
+        AstFactory.identifier3("b"),
+        TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+        AstFactory.block()));
+  }
+
+  void test_visitFormalParameterList_empty() {
+    _assertClone(AstFactory.formalParameterList());
+  }
+
+  void test_visitFormalParameterList_n() {
+    _assertClone(AstFactory.formalParameterList([
+      AstFactory.namedFormalParameter(
+          AstFactory.simpleFormalParameter3("a"), AstFactory.integer(0))
+    ]));
+  }
+
+  void test_visitFormalParameterList_nn() {
+    _assertClone(AstFactory.formalParameterList([
+      AstFactory.namedFormalParameter(
+          AstFactory.simpleFormalParameter3("a"), AstFactory.integer(0)),
+      AstFactory.namedFormalParameter(
+          AstFactory.simpleFormalParameter3("b"), AstFactory.integer(1))
+    ]));
+  }
+
+  void test_visitFormalParameterList_p() {
+    _assertClone(AstFactory.formalParameterList([
+      AstFactory.positionalFormalParameter(
+          AstFactory.simpleFormalParameter3("a"), AstFactory.integer(0))
+    ]));
+  }
+
+  void test_visitFormalParameterList_pp() {
+    _assertClone(AstFactory.formalParameterList([
+      AstFactory.positionalFormalParameter(
+          AstFactory.simpleFormalParameter3("a"), AstFactory.integer(0)),
+      AstFactory.positionalFormalParameter(
+          AstFactory.simpleFormalParameter3("b"), AstFactory.integer(1))
+    ]));
+  }
+
+  void test_visitFormalParameterList_r() {
+    _assertClone(AstFactory
+        .formalParameterList([AstFactory.simpleFormalParameter3("a")]));
+  }
+
+  void test_visitFormalParameterList_rn() {
+    _assertClone(AstFactory.formalParameterList([
+      AstFactory.simpleFormalParameter3("a"),
+      AstFactory.namedFormalParameter(
+          AstFactory.simpleFormalParameter3("b"), AstFactory.integer(1))
+    ]));
+  }
+
+  void test_visitFormalParameterList_rnn() {
+    _assertClone(AstFactory.formalParameterList([
+      AstFactory.simpleFormalParameter3("a"),
+      AstFactory.namedFormalParameter(
+          AstFactory.simpleFormalParameter3("b"), AstFactory.integer(1)),
+      AstFactory.namedFormalParameter(
+          AstFactory.simpleFormalParameter3("c"), AstFactory.integer(2))
+    ]));
+  }
+
+  void test_visitFormalParameterList_rp() {
+    _assertClone(AstFactory.formalParameterList([
+      AstFactory.simpleFormalParameter3("a"),
+      AstFactory.positionalFormalParameter(
+          AstFactory.simpleFormalParameter3("b"), AstFactory.integer(1))
+    ]));
+  }
+
+  void test_visitFormalParameterList_rpp() {
+    _assertClone(AstFactory.formalParameterList([
+      AstFactory.simpleFormalParameter3("a"),
+      AstFactory.positionalFormalParameter(
+          AstFactory.simpleFormalParameter3("b"), AstFactory.integer(1)),
+      AstFactory.positionalFormalParameter(
+          AstFactory.simpleFormalParameter3("c"), AstFactory.integer(2))
+    ]));
+  }
+
+  void test_visitFormalParameterList_rr() {
+    _assertClone(AstFactory.formalParameterList([
+      AstFactory.simpleFormalParameter3("a"),
+      AstFactory.simpleFormalParameter3("b")
+    ]));
+  }
+
+  void test_visitFormalParameterList_rrn() {
+    _assertClone(AstFactory.formalParameterList([
+      AstFactory.simpleFormalParameter3("a"),
+      AstFactory.simpleFormalParameter3("b"),
+      AstFactory.namedFormalParameter(
+          AstFactory.simpleFormalParameter3("c"), AstFactory.integer(3))
+    ]));
+  }
+
+  void test_visitFormalParameterList_rrnn() {
+    _assertClone(AstFactory.formalParameterList([
+      AstFactory.simpleFormalParameter3("a"),
+      AstFactory.simpleFormalParameter3("b"),
+      AstFactory.namedFormalParameter(
+          AstFactory.simpleFormalParameter3("c"), AstFactory.integer(3)),
+      AstFactory.namedFormalParameter(
+          AstFactory.simpleFormalParameter3("d"), AstFactory.integer(4))
+    ]));
+  }
+
+  void test_visitFormalParameterList_rrp() {
+    _assertClone(AstFactory.formalParameterList([
+      AstFactory.simpleFormalParameter3("a"),
+      AstFactory.simpleFormalParameter3("b"),
+      AstFactory.positionalFormalParameter(
+          AstFactory.simpleFormalParameter3("c"), AstFactory.integer(3))
+    ]));
+  }
+
+  void test_visitFormalParameterList_rrpp() {
+    _assertClone(AstFactory.formalParameterList([
+      AstFactory.simpleFormalParameter3("a"),
+      AstFactory.simpleFormalParameter3("b"),
+      AstFactory.positionalFormalParameter(
+          AstFactory.simpleFormalParameter3("c"), AstFactory.integer(3)),
+      AstFactory.positionalFormalParameter(
+          AstFactory.simpleFormalParameter3("d"), AstFactory.integer(4))
+    ]));
+  }
+
+  void test_visitForStatement_c() {
+    _assertClone(AstFactory.forStatement(
+        null, AstFactory.identifier3("c"), null, AstFactory.block()));
+  }
+
+  void test_visitForStatement_cu() {
+    _assertClone(AstFactory.forStatement(null, AstFactory.identifier3("c"),
+        [AstFactory.identifier3("u")], AstFactory.block()));
+  }
+
+  void test_visitForStatement_e() {
+    _assertClone(AstFactory.forStatement(
+        AstFactory.identifier3("e"), null, null, AstFactory.block()));
+  }
+
+  void test_visitForStatement_ec() {
+    _assertClone(AstFactory.forStatement(AstFactory.identifier3("e"),
+        AstFactory.identifier3("c"), null, AstFactory.block()));
+  }
+
+  void test_visitForStatement_ecu() {
+    _assertClone(AstFactory.forStatement(
+        AstFactory.identifier3("e"),
+        AstFactory.identifier3("c"),
+        [AstFactory.identifier3("u")],
+        AstFactory.block()));
+  }
+
+  void test_visitForStatement_eu() {
+    _assertClone(AstFactory.forStatement(AstFactory.identifier3("e"), null,
+        [AstFactory.identifier3("u")], AstFactory.block()));
+  }
+
+  void test_visitForStatement_i() {
+    _assertClone(AstFactory.forStatement2(
+        AstFactory.variableDeclarationList2(
+            Keyword.VAR, [AstFactory.variableDeclaration("i")]),
+        null,
+        null,
+        AstFactory.block()));
+  }
+
+  void test_visitForStatement_ic() {
+    _assertClone(AstFactory.forStatement2(
+        AstFactory.variableDeclarationList2(
+            Keyword.VAR, [AstFactory.variableDeclaration("i")]),
+        AstFactory.identifier3("c"),
+        null,
+        AstFactory.block()));
+  }
+
+  void test_visitForStatement_icu() {
+    _assertClone(AstFactory.forStatement2(
+        AstFactory.variableDeclarationList2(
+            Keyword.VAR, [AstFactory.variableDeclaration("i")]),
+        AstFactory.identifier3("c"),
+        [AstFactory.identifier3("u")],
+        AstFactory.block()));
+  }
+
+  void test_visitForStatement_iu() {
+    _assertClone(AstFactory.forStatement2(
+        AstFactory.variableDeclarationList2(
+            Keyword.VAR, [AstFactory.variableDeclaration("i")]),
+        null,
+        [AstFactory.identifier3("u")],
+        AstFactory.block()));
+  }
+
+  void test_visitForStatement_u() {
+    _assertClone(AstFactory.forStatement(
+        null, null, [AstFactory.identifier3("u")], AstFactory.block()));
+  }
+
+  void test_visitFunctionDeclaration_getter() {
+    _assertClone(AstFactory.functionDeclaration(
+        null, Keyword.GET, "f", AstFactory.functionExpression()));
+  }
+
+  void test_visitFunctionDeclaration_normal() {
+    _assertClone(AstFactory.functionDeclaration(
+        null, null, "f", AstFactory.functionExpression()));
+  }
+
+  void test_visitFunctionDeclaration_setter() {
+    _assertClone(AstFactory.functionDeclaration(
+        null, Keyword.SET, "f", AstFactory.functionExpression()));
+  }
+
+  void test_visitFunctionDeclaration_withMetadata() {
+    FunctionDeclaration declaration = AstFactory.functionDeclaration(
+        null, null, "f", AstFactory.functionExpression());
+    declaration.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertClone(declaration);
+  }
+
+  void test_visitFunctionDeclarationStatement() {
+    _assertClone(AstFactory.functionDeclarationStatement(
+        null, null, "f", AstFactory.functionExpression()));
+  }
+
+  void test_visitFunctionExpression() {
+    _assertClone(AstFactory.functionExpression());
+  }
+
+  void test_visitFunctionExpressionInvocation() {
+    _assertClone(
+        AstFactory.functionExpressionInvocation(AstFactory.identifier3("f")));
+  }
+
+  void test_visitFunctionTypeAlias_generic() {
+    _assertClone(AstFactory.typeAlias(AstFactory.typeName4("A"), "F",
+        AstFactory.typeParameterList(["B"]), AstFactory.formalParameterList()));
+  }
+
+  void test_visitFunctionTypeAlias_nonGeneric() {
+    _assertClone(AstFactory.typeAlias(AstFactory.typeName4("A"), "F", null,
+        AstFactory.formalParameterList()));
+  }
+
+  void test_visitFunctionTypeAlias_withMetadata() {
+    FunctionTypeAlias declaration = AstFactory.typeAlias(
+        AstFactory.typeName4("A"), "F", null, AstFactory.formalParameterList());
+    declaration.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertClone(declaration);
+  }
+
+  void test_visitFunctionTypedFormalParameter_noType() {
+    _assertClone(AstFactory.functionTypedFormalParameter(null, "f"));
+  }
+
+  void test_visitFunctionTypedFormalParameter_type() {
+    _assertClone(AstFactory.functionTypedFormalParameter(
+        AstFactory.typeName4("T"), "f"));
+  }
+
+  void test_visitIfStatement_withElse() {
+    _assertClone(AstFactory.ifStatement2(
+        AstFactory.identifier3("c"), AstFactory.block(), AstFactory.block()));
+  }
+
+  void test_visitIfStatement_withoutElse() {
+    _assertClone(AstFactory.ifStatement(
+        AstFactory.identifier3("c"), AstFactory.block()));
+  }
+
+  void test_visitImplementsClause_multiple() {
+    _assertClone(AstFactory.implementsClause(
+        [AstFactory.typeName4("A"), AstFactory.typeName4("B")]));
+  }
+
+  void test_visitImplementsClause_single() {
+    _assertClone(AstFactory.implementsClause([AstFactory.typeName4("A")]));
+  }
+
+  void test_visitImportDirective_combinator() {
+    _assertClone(AstFactory.importDirective3("a.dart", null, [
+      AstFactory.showCombinator([AstFactory.identifier3("A")])
+    ]));
+  }
+
+  void test_visitImportDirective_combinators() {
+    _assertClone(AstFactory.importDirective3("a.dart", null, [
+      AstFactory.showCombinator([AstFactory.identifier3("A")]),
+      AstFactory.hideCombinator([AstFactory.identifier3("B")])
+    ]));
+  }
+
+  void test_visitImportDirective_minimal() {
+    _assertClone(AstFactory.importDirective3("a.dart", null));
+  }
+
+  void test_visitImportDirective_prefix() {
+    _assertClone(AstFactory.importDirective3("a.dart", "p"));
+  }
+
+  void test_visitImportDirective_prefix_combinator() {
+    _assertClone(AstFactory.importDirective3("a.dart", "p", [
+      AstFactory.showCombinator([AstFactory.identifier3("A")])
+    ]));
+  }
+
+  void test_visitImportDirective_prefix_combinators() {
+    _assertClone(AstFactory.importDirective3("a.dart", "p", [
+      AstFactory.showCombinator([AstFactory.identifier3("A")]),
+      AstFactory.hideCombinator([AstFactory.identifier3("B")])
+    ]));
+  }
+
+  void test_visitImportDirective_withMetadata() {
+    ImportDirective directive = AstFactory.importDirective3("a.dart", null);
+    directive.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertClone(directive);
+  }
+
+  void test_visitImportHideCombinator_multiple() {
+    _assertClone(AstFactory.hideCombinator(
+        [AstFactory.identifier3("a"), AstFactory.identifier3("b")]));
+  }
+
+  void test_visitImportHideCombinator_single() {
+    _assertClone(AstFactory.hideCombinator([AstFactory.identifier3("a")]));
+  }
+
+  void test_visitImportShowCombinator_multiple() {
+    _assertClone(AstFactory.showCombinator(
+        [AstFactory.identifier3("a"), AstFactory.identifier3("b")]));
+  }
+
+  void test_visitImportShowCombinator_single() {
+    _assertClone(AstFactory.showCombinator([AstFactory.identifier3("a")]));
+  }
+
+  void test_visitIndexExpression() {
+    _assertClone(AstFactory.indexExpression(
+        AstFactory.identifier3("a"), AstFactory.identifier3("i")));
+  }
+
+  void test_visitInstanceCreationExpression_const() {
+    _assertClone(AstFactory.instanceCreationExpression2(
+        Keyword.CONST, AstFactory.typeName4("C")));
+  }
+
+  void test_visitInstanceCreationExpression_named() {
+    _assertClone(AstFactory.instanceCreationExpression3(
+        Keyword.NEW, AstFactory.typeName4("C"), "c"));
+  }
+
+  void test_visitInstanceCreationExpression_unnamed() {
+    _assertClone(AstFactory.instanceCreationExpression2(
+        Keyword.NEW, AstFactory.typeName4("C")));
+  }
+
+  void test_visitIntegerLiteral() {
+    _assertClone(AstFactory.integer(42));
+  }
+
+  void test_visitInterpolationExpression_expression() {
+    _assertClone(
+        AstFactory.interpolationExpression(AstFactory.identifier3("a")));
+  }
+
+  void test_visitInterpolationExpression_identifier() {
+    _assertClone(AstFactory.interpolationExpression2("a"));
+  }
+
+  void test_visitInterpolationString() {
+    _assertClone(AstFactory.interpolationString("'x", "x"));
+  }
+
+  void test_visitIsExpression_negated() {
+    _assertClone(AstFactory.isExpression(
+        AstFactory.identifier3("a"), true, AstFactory.typeName4("C")));
+  }
+
+  void test_visitIsExpression_normal() {
+    _assertClone(AstFactory.isExpression(
+        AstFactory.identifier3("a"), false, AstFactory.typeName4("C")));
+  }
+
+  void test_visitLabel() {
+    _assertClone(AstFactory.label2("a"));
+  }
+
+  void test_visitLabeledStatement_multiple() {
+    _assertClone(AstFactory.labeledStatement(
+        [AstFactory.label2("a"), AstFactory.label2("b")],
+        AstFactory.returnStatement()));
+  }
+
+  void test_visitLabeledStatement_single() {
+    _assertClone(AstFactory.labeledStatement(
+        [AstFactory.label2("a")], AstFactory.returnStatement()));
+  }
+
+  void test_visitLibraryDirective() {
+    _assertClone(AstFactory.libraryDirective2("l"));
+  }
+
+  void test_visitLibraryDirective_withMetadata() {
+    LibraryDirective directive = AstFactory.libraryDirective2("l");
+    directive.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertClone(directive);
+  }
+
+  void test_visitLibraryIdentifier_multiple() {
+    _assertClone(AstFactory.libraryIdentifier([
+      AstFactory.identifier3("a"),
+      AstFactory.identifier3("b"),
+      AstFactory.identifier3("c")
+    ]));
+  }
+
+  void test_visitLibraryIdentifier_single() {
+    _assertClone(AstFactory.libraryIdentifier([AstFactory.identifier3("a")]));
+  }
+
+  void test_visitListLiteral_const() {
+    _assertClone(AstFactory.listLiteral2(Keyword.CONST, null));
+  }
+
+  void test_visitListLiteral_empty() {
+    _assertClone(AstFactory.listLiteral());
+  }
+
+  void test_visitListLiteral_nonEmpty() {
+    _assertClone(AstFactory.listLiteral([
+      AstFactory.identifier3("a"),
+      AstFactory.identifier3("b"),
+      AstFactory.identifier3("c")
+    ]));
+  }
+
+  void test_visitMapLiteral_const() {
+    _assertClone(AstFactory.mapLiteral(Keyword.CONST, null));
+  }
+
+  void test_visitMapLiteral_empty() {
+    _assertClone(AstFactory.mapLiteral2());
+  }
+
+  void test_visitMapLiteral_nonEmpty() {
+    _assertClone(AstFactory.mapLiteral2([
+      AstFactory.mapLiteralEntry("a", AstFactory.identifier3("a")),
+      AstFactory.mapLiteralEntry("b", AstFactory.identifier3("b")),
+      AstFactory.mapLiteralEntry("c", AstFactory.identifier3("c"))
+    ]));
+  }
+
+  void test_visitMapLiteralEntry() {
+    _assertClone(AstFactory.mapLiteralEntry("a", AstFactory.identifier3("b")));
+  }
+
+  void test_visitMethodDeclaration_external() {
+    _assertClone(AstFactory.methodDeclaration(null, null, null, null,
+        AstFactory.identifier3("m"), AstFactory.formalParameterList()));
+  }
+
+  void test_visitMethodDeclaration_external_returnType() {
+    _assertClone(AstFactory.methodDeclaration(
+        null,
+        AstFactory.typeName4("T"),
+        null,
+        null,
+        AstFactory.identifier3("m"),
+        AstFactory.formalParameterList()));
+  }
+
+  void test_visitMethodDeclaration_getter() {
+    _assertClone(AstFactory.methodDeclaration2(null, null, Keyword.GET, null,
+        AstFactory.identifier3("m"), null, AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_getter_returnType() {
+    _assertClone(AstFactory.methodDeclaration2(
+        null,
+        AstFactory.typeName4("T"),
+        Keyword.GET,
+        null,
+        AstFactory.identifier3("m"),
+        null,
+        AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_getter_seturnType() {
+    _assertClone(AstFactory.methodDeclaration2(
+        null,
+        AstFactory.typeName4("T"),
+        Keyword.SET,
+        null,
+        AstFactory.identifier3("m"),
+        AstFactory.formalParameterList(
+            [AstFactory.simpleFormalParameter(Keyword.VAR, "v")]),
+        AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_minimal() {
+    _assertClone(AstFactory.methodDeclaration2(
+        null,
+        null,
+        null,
+        null,
+        AstFactory.identifier3("m"),
+        AstFactory.formalParameterList(),
+        AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_multipleParameters() {
+    _assertClone(AstFactory.methodDeclaration2(
+        null,
+        null,
+        null,
+        null,
+        AstFactory.identifier3("m"),
+        AstFactory.formalParameterList([
+          AstFactory.simpleFormalParameter(Keyword.VAR, "a"),
+          AstFactory.simpleFormalParameter(Keyword.VAR, "b")
+        ]),
+        AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_operator() {
+    _assertClone(AstFactory.methodDeclaration2(
+        null,
+        null,
+        null,
+        Keyword.OPERATOR,
+        AstFactory.identifier3("+"),
+        AstFactory.formalParameterList(),
+        AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_operator_returnType() {
+    _assertClone(AstFactory.methodDeclaration2(
+        null,
+        AstFactory.typeName4("T"),
+        null,
+        Keyword.OPERATOR,
+        AstFactory.identifier3("+"),
+        AstFactory.formalParameterList(),
+        AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_returnType() {
+    _assertClone(AstFactory.methodDeclaration2(
+        null,
+        AstFactory.typeName4("T"),
+        null,
+        null,
+        AstFactory.identifier3("m"),
+        AstFactory.formalParameterList(),
+        AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_setter() {
+    _assertClone(AstFactory.methodDeclaration2(
+        null,
+        null,
+        Keyword.SET,
+        null,
+        AstFactory.identifier3("m"),
+        AstFactory.formalParameterList(
+            [AstFactory.simpleFormalParameter(Keyword.VAR, "v")]),
+        AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_static() {
+    _assertClone(AstFactory.methodDeclaration2(
+        Keyword.STATIC,
+        null,
+        null,
+        null,
+        AstFactory.identifier3("m"),
+        AstFactory.formalParameterList(),
+        AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_static_returnType() {
+    _assertClone(AstFactory.methodDeclaration2(
+        Keyword.STATIC,
+        AstFactory.typeName4("T"),
+        null,
+        null,
+        AstFactory.identifier3("m"),
+        AstFactory.formalParameterList(),
+        AstFactory.blockFunctionBody2()));
+  }
+
+  void test_visitMethodDeclaration_withMetadata() {
+    MethodDeclaration declaration = AstFactory.methodDeclaration2(
+        null,
+        null,
+        null,
+        null,
+        AstFactory.identifier3("m"),
+        AstFactory.formalParameterList(),
+        AstFactory.blockFunctionBody2());
+    declaration.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertClone(declaration);
+  }
+
+  void test_visitMethodInvocation_noTarget() {
+    _assertClone(AstFactory.methodInvocation2("m"));
+  }
+
+  void test_visitMethodInvocation_target() {
+    _assertClone(AstFactory.methodInvocation(AstFactory.identifier3("t"), "m"));
+  }
+
+  void test_visitNamedExpression() {
+    _assertClone(AstFactory.namedExpression2("a", AstFactory.identifier3("b")));
+  }
+
+  void test_visitNamedFormalParameter() {
+    _assertClone(AstFactory.namedFormalParameter(
+        AstFactory.simpleFormalParameter(Keyword.VAR, "a"),
+        AstFactory.integer(0)));
+  }
+
+  void test_visitNativeClause() {
+    _assertClone(AstFactory.nativeClause("code"));
+  }
+
+  void test_visitNativeFunctionBody() {
+    _assertClone(AstFactory.nativeFunctionBody("str"));
+  }
+
+  void test_visitNullLiteral() {
+    _assertClone(AstFactory.nullLiteral());
+  }
+
+  void test_visitParenthesizedExpression() {
+    _assertClone(
+        AstFactory.parenthesizedExpression(AstFactory.identifier3("a")));
+  }
+
+  void test_visitPartDirective() {
+    _assertClone(AstFactory.partDirective2("a.dart"));
+  }
+
+  void test_visitPartDirective_withMetadata() {
+    PartDirective directive = AstFactory.partDirective2("a.dart");
+    directive.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertClone(directive);
+  }
+
+  void test_visitPartOfDirective() {
+    _assertClone(
+        AstFactory.partOfDirective(AstFactory.libraryIdentifier2(["l"])));
+  }
+
+  void test_visitPartOfDirective_withMetadata() {
+    PartOfDirective directive =
+        AstFactory.partOfDirective(AstFactory.libraryIdentifier2(["l"]));
+    directive.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertClone(directive);
+  }
+
+  void test_visitPositionalFormalParameter() {
+    _assertClone(AstFactory.positionalFormalParameter(
+        AstFactory.simpleFormalParameter(Keyword.VAR, "a"),
+        AstFactory.integer(0)));
+  }
+
+  void test_visitPostfixExpression() {
+    _assertClone(AstFactory.postfixExpression(
+        AstFactory.identifier3("a"), TokenType.PLUS_PLUS));
+  }
+
+  void test_visitPrefixedIdentifier() {
+    _assertClone(AstFactory.identifier5("a", "b"));
+  }
+
+  void test_visitPrefixExpression() {
+    _assertClone(AstFactory.prefixExpression(
+        TokenType.MINUS, AstFactory.identifier3("a")));
+  }
+
+  void test_visitPropertyAccess() {
+    _assertClone(AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b"));
+  }
+
+  void test_visitRedirectingConstructorInvocation_named() {
+    _assertClone(AstFactory.redirectingConstructorInvocation2("c"));
+  }
+
+  void test_visitRedirectingConstructorInvocation_unnamed() {
+    _assertClone(AstFactory.redirectingConstructorInvocation());
+  }
+
+  void test_visitRethrowExpression() {
+    _assertClone(AstFactory.rethrowExpression());
+  }
+
+  void test_visitReturnStatement_expression() {
+    _assertClone(AstFactory.returnStatement2(AstFactory.identifier3("a")));
+  }
+
+  void test_visitReturnStatement_noExpression() {
+    _assertClone(AstFactory.returnStatement());
+  }
+
+  void test_visitScriptTag() {
+    String scriptTag = "!#/bin/dart.exe";
+    _assertClone(AstFactory.scriptTag(scriptTag));
+  }
+
+  void test_visitSimpleFormalParameter_keyword() {
+    _assertClone(AstFactory.simpleFormalParameter(Keyword.VAR, "a"));
+  }
+
+  void test_visitSimpleFormalParameter_keyword_type() {
+    _assertClone(AstFactory.simpleFormalParameter2(
+        Keyword.FINAL, AstFactory.typeName4("A"), "a"));
+  }
+
+  void test_visitSimpleFormalParameter_type() {
+    _assertClone(
+        AstFactory.simpleFormalParameter4(AstFactory.typeName4("A"), "a"));
+  }
+
+  void test_visitSimpleIdentifier() {
+    _assertClone(AstFactory.identifier3("a"));
+  }
+
+  void test_visitSimpleStringLiteral() {
+    _assertClone(AstFactory.string2("a"));
+  }
+
+  void test_visitStringInterpolation() {
+    _assertClone(AstFactory.string([
+      AstFactory.interpolationString("'a", "a"),
+      AstFactory.interpolationExpression(AstFactory.identifier3("e")),
+      AstFactory.interpolationString("b'", "b")
+    ]));
+  }
+
+  void test_visitSuperConstructorInvocation() {
+    _assertClone(AstFactory.superConstructorInvocation());
+  }
+
+  void test_visitSuperConstructorInvocation_named() {
+    _assertClone(AstFactory.superConstructorInvocation2("c"));
+  }
+
+  void test_visitSuperExpression() {
+    _assertClone(AstFactory.superExpression());
+  }
+
+  void test_visitSwitchCase_multipleLabels() {
+    _assertClone(AstFactory.switchCase2(
+        [AstFactory.label2("l1"), AstFactory.label2("l2")],
+        AstFactory.identifier3("a"),
+        [AstFactory.block()]));
+  }
+
+  void test_visitSwitchCase_multipleStatements() {
+    _assertClone(AstFactory.switchCase(
+        AstFactory.identifier3("a"), [AstFactory.block(), AstFactory.block()]));
+  }
+
+  void test_visitSwitchCase_noLabels() {
+    _assertClone(AstFactory.switchCase(
+        AstFactory.identifier3("a"), [AstFactory.block()]));
+  }
+
+  void test_visitSwitchCase_singleLabel() {
+    _assertClone(AstFactory.switchCase2([AstFactory.label2("l1")],
+        AstFactory.identifier3("a"), [AstFactory.block()]));
+  }
+
+  void test_visitSwitchDefault_multipleLabels() {
+    _assertClone(AstFactory.switchDefault(
+        [AstFactory.label2("l1"), AstFactory.label2("l2")],
+        [AstFactory.block()]));
+  }
+
+  void test_visitSwitchDefault_multipleStatements() {
+    _assertClone(
+        AstFactory.switchDefault2([AstFactory.block(), AstFactory.block()]));
+  }
+
+  void test_visitSwitchDefault_noLabels() {
+    _assertClone(AstFactory.switchDefault2([AstFactory.block()]));
+  }
+
+  void test_visitSwitchDefault_singleLabel() {
+    _assertClone(AstFactory.switchDefault(
+        [AstFactory.label2("l1")], [AstFactory.block()]));
+  }
+
+  void test_visitSwitchStatement() {
+    _assertClone(AstFactory.switchStatement(AstFactory.identifier3("a"), [
+      AstFactory.switchCase(AstFactory.string2("b"), [AstFactory.block()]),
+      AstFactory.switchDefault2([AstFactory.block()])
+    ]));
+  }
+
+  void test_visitSymbolLiteral_multiple() {
+    _assertClone(AstFactory.symbolLiteral(["a", "b", "c"]));
+  }
+
+  void test_visitSymbolLiteral_single() {
+    _assertClone(AstFactory.symbolLiteral(["a"]));
+  }
+
+  void test_visitThisExpression() {
+    _assertClone(AstFactory.thisExpression());
+  }
+
+  void test_visitThrowStatement() {
+    _assertClone(AstFactory.throwExpression2(AstFactory.identifier3("e")));
+  }
+
+  void test_visitTopLevelVariableDeclaration_multiple() {
+    _assertClone(AstFactory.topLevelVariableDeclaration2(
+        Keyword.VAR, [AstFactory.variableDeclaration("a")]));
+  }
+
+  void test_visitTopLevelVariableDeclaration_single() {
+    _assertClone(AstFactory.topLevelVariableDeclaration2(Keyword.VAR, [
+      AstFactory.variableDeclaration("a"),
+      AstFactory.variableDeclaration("b")
+    ]));
+  }
+
+  void test_visitTryStatement_catch() {
+    _assertClone(AstFactory.tryStatement2(AstFactory.block(),
+        [AstFactory.catchClause3(AstFactory.typeName4("E"))]));
+  }
+
+  void test_visitTryStatement_catches() {
+    _assertClone(AstFactory.tryStatement2(AstFactory.block(), [
+      AstFactory.catchClause3(AstFactory.typeName4("E")),
+      AstFactory.catchClause3(AstFactory.typeName4("F"))
+    ]));
+  }
+
+  void test_visitTryStatement_catchFinally() {
+    _assertClone(AstFactory.tryStatement3(
+        AstFactory.block(),
+        [AstFactory.catchClause3(AstFactory.typeName4("E"))],
+        AstFactory.block()));
+  }
+
+  void test_visitTryStatement_finally() {
+    _assertClone(
+        AstFactory.tryStatement(AstFactory.block(), AstFactory.block()));
+  }
+
+  void test_visitTypeArgumentList_multiple() {
+    _assertClone(AstFactory.typeArgumentList(
+        [AstFactory.typeName4("E"), AstFactory.typeName4("F")]));
+  }
+
+  void test_visitTypeArgumentList_single() {
+    _assertClone(AstFactory.typeArgumentList([AstFactory.typeName4("E")]));
+  }
+
+  void test_visitTypeName_multipleArgs() {
+    _assertClone(AstFactory.typeName4(
+        "C", [AstFactory.typeName4("D"), AstFactory.typeName4("E")]));
+  }
+
+  void test_visitTypeName_nestedArg() {
+    _assertClone(AstFactory.typeName4("C", [
+      AstFactory.typeName4("D", [AstFactory.typeName4("E")])
+    ]));
+  }
+
+  void test_visitTypeName_noArgs() {
+    _assertClone(AstFactory.typeName4("C"));
+  }
+
+  void test_visitTypeName_singleArg() {
+    _assertClone(AstFactory.typeName4("C", [AstFactory.typeName4("D")]));
+  }
+
+  void test_visitTypeParameter_withExtends() {
+    _assertClone(AstFactory.typeParameter2("E", AstFactory.typeName4("C")));
+  }
+
+  void test_visitTypeParameter_withMetadata() {
+    TypeParameter parameter = AstFactory.typeParameter("E");
+    parameter.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertClone(parameter);
+  }
+
+  void test_visitTypeParameter_withoutExtends() {
+    _assertClone(AstFactory.typeParameter("E"));
+  }
+
+  void test_visitTypeParameterList_multiple() {
+    _assertClone(AstFactory.typeParameterList(["E", "F"]));
+  }
+
+  void test_visitTypeParameterList_single() {
+    _assertClone(AstFactory.typeParameterList(["E"]));
+  }
+
+  void test_visitVariableDeclaration_initialized() {
+    _assertClone(
+        AstFactory.variableDeclaration2("a", AstFactory.identifier3("b")));
+  }
+
+  void test_visitVariableDeclaration_uninitialized() {
+    _assertClone(AstFactory.variableDeclaration("a"));
+  }
+
+  void test_visitVariableDeclarationList_const_type() {
+    _assertClone(AstFactory.variableDeclarationList(
+        Keyword.CONST, AstFactory.typeName4("C"), [
+      AstFactory.variableDeclaration("a"),
+      AstFactory.variableDeclaration("b")
+    ]));
+  }
+
+  void test_visitVariableDeclarationList_final_noType() {
+    _assertClone(AstFactory.variableDeclarationList2(Keyword.FINAL, [
+      AstFactory.variableDeclaration("a"),
+      AstFactory.variableDeclaration("b")
+    ]));
+  }
+
+  void test_visitVariableDeclarationList_final_withMetadata() {
+    VariableDeclarationList declarationList = AstFactory
+        .variableDeclarationList2(Keyword.FINAL, [
+      AstFactory.variableDeclaration("a"),
+      AstFactory.variableDeclaration("b")
+    ]);
+    declarationList.metadata
+        .add(AstFactory.annotation(AstFactory.identifier3("deprecated")));
+    _assertClone(declarationList);
+  }
+
+  void test_visitVariableDeclarationList_type() {
+    _assertClone(AstFactory.variableDeclarationList(
+        null, AstFactory.typeName4("C"), [
+      AstFactory.variableDeclaration("a"),
+      AstFactory.variableDeclaration("b")
+    ]));
+  }
+
+  void test_visitVariableDeclarationList_var() {
+    _assertClone(AstFactory.variableDeclarationList2(Keyword.VAR, [
+      AstFactory.variableDeclaration("a"),
+      AstFactory.variableDeclaration("b")
+    ]));
+  }
+
+  void test_visitVariableDeclarationStatement() {
+    _assertClone(AstFactory.variableDeclarationStatement(null,
+        AstFactory.typeName4("C"), [AstFactory.variableDeclaration("c")]));
+  }
+
+  void test_visitWhileStatement() {
+    _assertClone(AstFactory.whileStatement(
+        AstFactory.identifier3("c"), AstFactory.block()));
+  }
+
+  void test_visitWithClause_multiple() {
+    _assertClone(AstFactory.withClause([
+      AstFactory.typeName4("A"),
+      AstFactory.typeName4("B"),
+      AstFactory.typeName4("C")
+    ]));
+  }
+
+  void test_visitWithClause_single() {
+    _assertClone(AstFactory.withClause([AstFactory.typeName4("A")]));
+  }
+
+  void test_visitYieldStatement() {
+    _assertClone(AstFactory.yieldStatement(AstFactory.identifier3("A")));
+  }
+
+  /**
+   * Assert that an `AstCloner` will produce the expected AST structure when
+   * visiting the given [node].
+   *
+   * @param node the AST node being visited to produce the cloned structure
+   * @throws AFE if the visitor does not produce the expected source for the given node
+   */
+  void _assertClone(AstNode node) {
+    AstNode clone = node.accept(new AstCloner());
+    AstCloneComparator comparitor = new AstCloneComparator(false);
+    if (!comparitor.isEqualNodes(node, clone)) {
+      fail("Failed to clone ${node.runtimeType.toString()}");
+    }
+
+    clone = node.accept(new AstCloner(true));
+    comparitor = new AstCloneComparator(true);
+    if (!comparitor.isEqualNodes(node, clone)) {
+      fail("Failed to clone ${node.runtimeType.toString()}");
+    }
+  }
+}
+
+@reflectiveTest
+class BooleanArrayTest {
+  void test_get_negative() {
+    try {
+      BooleanArray.get(0, -1);
+      fail("Expected ");
+    } on RangeError {
+      // Expected
+    }
+  }
+
+  void test_get_tooBig() {
+    try {
+      BooleanArray.get(0, 31);
+      fail("Expected ");
+    } on RangeError {
+      // Expected
+    }
+  }
+
+  void test_get_valid() {
+    expect(BooleanArray.get(0, 0), false);
+    expect(BooleanArray.get(1, 0), true);
+    expect(BooleanArray.get(0, 30), false);
+    expect(BooleanArray.get(1 << 30, 30), true);
+  }
+
+  void test_set_negative() {
+    try {
+      BooleanArray.set(0, -1, true);
+      fail("Expected ");
+    } on RangeError {
+      // Expected
+    }
+  }
+
+  void test_set_tooBig() {
+    try {
+      BooleanArray.set(0, 32, true);
+      fail("Expected ");
+    } on RangeError {
+      // Expected
+    }
+  }
+
+  void test_set_valueChanging() {
+    expect(BooleanArray.set(0, 0, true), 1);
+    expect(BooleanArray.set(1, 0, false), 0);
+    expect(BooleanArray.set(0, 30, true), 1 << 30);
+    expect(BooleanArray.set(1 << 30, 30, false), 0);
+  }
+
+  void test_set_valuePreserving() {
+    expect(BooleanArray.set(0, 0, false), 0);
+    expect(BooleanArray.set(1, 0, true), 1);
+    expect(BooleanArray.set(0, 30, false), 0);
+    expect(BooleanArray.set(1 << 30, 30, true), 1 << 30);
+  }
+}
+
+@reflectiveTest
+class DirectedGraphTest extends EngineTestCase {
+  void test_addEdge() {
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    expect(graph.isEmpty, isTrue);
+    graph.addEdge(new DirectedGraphTest_Node(), new DirectedGraphTest_Node());
+    expect(graph.isEmpty, isFalse);
+  }
+
+  void test_addNode() {
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    expect(graph.isEmpty, isTrue);
+    graph.addNode(new DirectedGraphTest_Node());
+    expect(graph.isEmpty, isFalse);
+  }
+
+  void test_containsPath_noCycles() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    graph.addEdge(node2, node3);
+    expect(graph.containsPath(node1, node1), isTrue);
+    expect(graph.containsPath(node1, node2), isTrue);
+    expect(graph.containsPath(node1, node3), isTrue);
+    expect(graph.containsPath(node2, node1), isFalse);
+    expect(graph.containsPath(node2, node2), isTrue);
+    expect(graph.containsPath(node2, node3), isTrue);
+    expect(graph.containsPath(node3, node1), isFalse);
+    expect(graph.containsPath(node3, node2), isFalse);
+    expect(graph.containsPath(node3, node3), isTrue);
+  }
+
+  void test_containsPath_withCycles() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node4 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    graph.addEdge(node2, node1);
+    graph.addEdge(node1, node3);
+    graph.addEdge(node3, node4);
+    graph.addEdge(node4, node3);
+    expect(graph.containsPath(node1, node1), isTrue);
+    expect(graph.containsPath(node1, node2), isTrue);
+    expect(graph.containsPath(node1, node3), isTrue);
+    expect(graph.containsPath(node1, node4), isTrue);
+    expect(graph.containsPath(node2, node1), isTrue);
+    expect(graph.containsPath(node2, node2), isTrue);
+    expect(graph.containsPath(node2, node3), isTrue);
+    expect(graph.containsPath(node2, node4), isTrue);
+    expect(graph.containsPath(node3, node1), isFalse);
+    expect(graph.containsPath(node3, node2), isFalse);
+    expect(graph.containsPath(node3, node3), isTrue);
+    expect(graph.containsPath(node3, node4), isTrue);
+    expect(graph.containsPath(node4, node1), isFalse);
+    expect(graph.containsPath(node4, node2), isFalse);
+    expect(graph.containsPath(node4, node3), isTrue);
+    expect(graph.containsPath(node4, node4), isTrue);
+  }
+
+  void test_creation() {
+    expect(new DirectedGraph<DirectedGraphTest_Node>(), isNotNull);
+  }
+
+  void test_findCycleContaining_complexCycle() {
+    // Two overlapping loops: (1, 2, 3) and (3, 4, 5)
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node4 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node5 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    graph.addEdge(node2, node3);
+    graph.addEdge(node3, node1);
+    graph.addEdge(node3, node4);
+    graph.addEdge(node4, node5);
+    graph.addEdge(node5, node3);
+    List<DirectedGraphTest_Node> cycle = graph.findCycleContaining(node1);
+    expect(cycle, hasLength(5));
+    expect(cycle.contains(node1), isTrue);
+    expect(cycle.contains(node2), isTrue);
+    expect(cycle.contains(node3), isTrue);
+    expect(cycle.contains(node4), isTrue);
+    expect(cycle.contains(node5), isTrue);
+  }
+
+  void test_findCycleContaining_cycle() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    graph.addEdge(node2, node3);
+    graph.addEdge(node2, new DirectedGraphTest_Node());
+    graph.addEdge(node3, node1);
+    graph.addEdge(node3, new DirectedGraphTest_Node());
+    List<DirectedGraphTest_Node> cycle = graph.findCycleContaining(node1);
+    expect(cycle, hasLength(3));
+    expect(cycle.contains(node1), isTrue);
+    expect(cycle.contains(node2), isTrue);
+    expect(cycle.contains(node3), isTrue);
+  }
+
+  void test_findCycleContaining_notInGraph() {
+    DirectedGraphTest_Node node = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    List<DirectedGraphTest_Node> cycle = graph.findCycleContaining(node);
+    expect(cycle, hasLength(1));
+    expect(cycle[0], node);
+  }
+
+  void test_findCycleContaining_null() {
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    try {
+      graph.findCycleContaining(null);
+      fail("Expected IllegalArgumentException");
+    } on IllegalArgumentException {
+      // Expected
+    }
+  }
+
+  void test_findCycleContaining_singleton() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    graph.addEdge(node2, node3);
+    List<DirectedGraphTest_Node> cycle = graph.findCycleContaining(node1);
+    expect(cycle, hasLength(1));
+    expect(cycle[0], node1);
+  }
+
+  void test_getNodeCount() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    expect(graph.nodeCount, 0);
+    graph.addNode(node1);
+    expect(graph.nodeCount, 1);
+    graph.addNode(node2);
+    expect(graph.nodeCount, 2);
+    graph.removeNode(node1);
+    expect(graph.nodeCount, 1);
+  }
+
+  void test_getTails() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    expect(graph.getTails(node1), hasLength(0));
+    graph.addEdge(node1, node2);
+    expect(graph.getTails(node1), hasLength(1));
+    graph.addEdge(node1, node3);
+    expect(graph.getTails(node1), hasLength(2));
+  }
+
+  void test_removeAllNodes() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    List<DirectedGraphTest_Node> nodes = new List<DirectedGraphTest_Node>();
+    nodes.add(node1);
+    nodes.add(node2);
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    graph.addEdge(node2, node1);
+    expect(graph.isEmpty, isFalse);
+    graph.removeAllNodes(nodes);
+    expect(graph.isEmpty, isTrue);
+  }
+
+  void test_removeEdge() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    graph.addEdge(node1, node3);
+    expect(graph.getTails(node1), hasLength(2));
+    graph.removeEdge(node1, node2);
+    expect(graph.getTails(node1), hasLength(1));
+  }
+
+  void test_removeNode() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    graph.addEdge(node1, node3);
+    expect(graph.getTails(node1), hasLength(2));
+    graph.removeNode(node2);
+    expect(graph.getTails(node1), hasLength(1));
+  }
+
+  void test_removeSink() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    expect(graph.removeSink(), same(node2));
+    expect(graph.removeSink(), same(node1));
+    expect(graph.isEmpty, isTrue);
+  }
+
+  void test_topologicalSort_noCycles() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    graph.addEdge(node1, node3);
+    graph.addEdge(node2, node3);
+    List<List<DirectedGraphTest_Node>> topologicalSort =
+        graph.computeTopologicalSort();
+    expect(topologicalSort, hasLength(3));
+    expect(topologicalSort[0], hasLength(1));
+    expect(topologicalSort[0][0], node3);
+    expect(topologicalSort[1], hasLength(1));
+    expect(topologicalSort[1][0], node2);
+    expect(topologicalSort[2], hasLength(1));
+    expect(topologicalSort[2][0], node1);
+  }
+
+  void test_topologicalSort_withCycles() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node4 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    graph.addEdge(node2, node1);
+    graph.addEdge(node1, node3);
+    graph.addEdge(node3, node4);
+    graph.addEdge(node4, node3);
+    List<List<DirectedGraphTest_Node>> topologicalSort =
+        graph.computeTopologicalSort();
+    expect(topologicalSort, hasLength(2));
+    expect(topologicalSort[0], unorderedEquals([node3, node4]));
+    expect(topologicalSort[1], unorderedEquals([node1, node2]));
+  }
+}
+
+/**
+ * Instances of the class `Node` represent simple nodes used for testing purposes.
+ */
+class DirectedGraphTest_Node {}
+
+class Getter_NodeReplacerTest_test_annotation
+    implements NodeReplacerTest_Getter {
+  @override
+  ArgumentList get(Annotation node) => node.arguments;
+}
+
+class Getter_NodeReplacerTest_test_annotation_2
+    implements NodeReplacerTest_Getter {
+  @override
+  Identifier get(Annotation node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_annotation_3
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(Annotation node) => node.constructorName;
+}
+
+class Getter_NodeReplacerTest_test_asExpression
+    implements NodeReplacerTest_Getter {
+  @override
+  TypeName get(AsExpression node) => node.type;
+}
+
+class Getter_NodeReplacerTest_test_asExpression_2
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(AsExpression node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_assertStatement
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(AssertStatement node) => node.condition;
+}
+
+class Getter_NodeReplacerTest_test_assignmentExpression
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(AssignmentExpression node) => node.rightHandSide;
+}
+
+class Getter_NodeReplacerTest_test_assignmentExpression_2
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(AssignmentExpression node) => node.leftHandSide;
+}
+
+class Getter_NodeReplacerTest_test_awaitExpression
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(AwaitExpression node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_binaryExpression
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(BinaryExpression node) => node.leftOperand;
+}
+
+class Getter_NodeReplacerTest_test_binaryExpression_2
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(BinaryExpression node) => node.rightOperand;
+}
+
+class Getter_NodeReplacerTest_test_blockFunctionBody
+    implements NodeReplacerTest_Getter {
+  @override
+  Block get(BlockFunctionBody node) => node.block;
+}
+
+class Getter_NodeReplacerTest_test_breakStatement
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(BreakStatement node) => node.label;
+}
+
+class Getter_NodeReplacerTest_test_cascadeExpression
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(CascadeExpression node) => node.target;
+}
+
+class Getter_NodeReplacerTest_test_catchClause
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(CatchClause node) => node.stackTraceParameter;
+}
+
+class Getter_NodeReplacerTest_test_catchClause_2
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(CatchClause node) => node.exceptionParameter;
+}
+
+class Getter_NodeReplacerTest_test_catchClause_3
+    implements NodeReplacerTest_Getter {
+  @override
+  TypeName get(CatchClause node) => node.exceptionType;
+}
+
+class Getter_NodeReplacerTest_test_classDeclaration
+    implements NodeReplacerTest_Getter {
+  @override
+  ImplementsClause get(ClassDeclaration node) => node.implementsClause;
+}
+
+class Getter_NodeReplacerTest_test_classDeclaration_2
+    implements NodeReplacerTest_Getter {
+  @override
+  WithClause get(ClassDeclaration node) => node.withClause;
+}
+
+class Getter_NodeReplacerTest_test_classDeclaration_3
+    implements NodeReplacerTest_Getter {
+  @override
+  NativeClause get(ClassDeclaration node) => node.nativeClause;
+}
+
+class Getter_NodeReplacerTest_test_classDeclaration_4
+    implements NodeReplacerTest_Getter {
+  @override
+  ExtendsClause get(ClassDeclaration node) => node.extendsClause;
+}
+
+class Getter_NodeReplacerTest_test_classDeclaration_5
+    implements NodeReplacerTest_Getter {
+  @override
+  TypeParameterList get(ClassDeclaration node) => node.typeParameters;
+}
+
+class Getter_NodeReplacerTest_test_classDeclaration_6
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(ClassDeclaration node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_classTypeAlias
+    implements NodeReplacerTest_Getter {
+  @override
+  TypeName get(ClassTypeAlias node) => node.superclass;
+}
+
+class Getter_NodeReplacerTest_test_classTypeAlias_2
+    implements NodeReplacerTest_Getter {
+  @override
+  ImplementsClause get(ClassTypeAlias node) => node.implementsClause;
+}
+
+class Getter_NodeReplacerTest_test_classTypeAlias_3
+    implements NodeReplacerTest_Getter {
+  @override
+  WithClause get(ClassTypeAlias node) => node.withClause;
+}
+
+class Getter_NodeReplacerTest_test_classTypeAlias_4
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(ClassTypeAlias node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_classTypeAlias_5
+    implements NodeReplacerTest_Getter {
+  @override
+  TypeParameterList get(ClassTypeAlias node) => node.typeParameters;
+}
+
+class Getter_NodeReplacerTest_test_commentReference
+    implements NodeReplacerTest_Getter {
+  @override
+  Identifier get(CommentReference node) => node.identifier;
+}
+
+class Getter_NodeReplacerTest_test_compilationUnit
+    implements NodeReplacerTest_Getter {
+  @override
+  ScriptTag get(CompilationUnit node) => node.scriptTag;
+}
+
+class Getter_NodeReplacerTest_test_conditionalExpression
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(ConditionalExpression node) => node.elseExpression;
+}
+
+class Getter_NodeReplacerTest_test_conditionalExpression_2
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(ConditionalExpression node) => node.thenExpression;
+}
+
+class Getter_NodeReplacerTest_test_conditionalExpression_3
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(ConditionalExpression node) => node.condition;
+}
+
+class Getter_NodeReplacerTest_test_constructorDeclaration
+    implements NodeReplacerTest_Getter {
+  @override
+  ConstructorName get(ConstructorDeclaration node) =>
+      node.redirectedConstructor;
+}
+
+class Getter_NodeReplacerTest_test_constructorDeclaration_2
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(ConstructorDeclaration node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_constructorDeclaration_3
+    implements NodeReplacerTest_Getter {
+  @override
+  Identifier get(ConstructorDeclaration node) => node.returnType;
+}
+
+class Getter_NodeReplacerTest_test_constructorDeclaration_4
+    implements NodeReplacerTest_Getter {
+  @override
+  FormalParameterList get(ConstructorDeclaration node) => node.parameters;
+}
+
+class Getter_NodeReplacerTest_test_constructorDeclaration_5
+    implements NodeReplacerTest_Getter {
+  @override
+  FunctionBody get(ConstructorDeclaration node) => node.body;
+}
+
+class Getter_NodeReplacerTest_test_constructorFieldInitializer
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(ConstructorFieldInitializer node) => node.fieldName;
+}
+
+class Getter_NodeReplacerTest_test_constructorFieldInitializer_2
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(ConstructorFieldInitializer node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_constructorName
+    implements NodeReplacerTest_Getter {
+  @override
+  TypeName get(ConstructorName node) => node.type;
+}
+
+class Getter_NodeReplacerTest_test_constructorName_2
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(ConstructorName node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_continueStatement
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(ContinueStatement node) => node.label;
+}
+
+class Getter_NodeReplacerTest_test_declaredIdentifier
+    implements NodeReplacerTest_Getter {
+  @override
+  TypeName get(DeclaredIdentifier node) => node.type;
+}
+
+class Getter_NodeReplacerTest_test_declaredIdentifier_2
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(DeclaredIdentifier node) => node.identifier;
+}
+
+class Getter_NodeReplacerTest_test_defaultFormalParameter
+    implements NodeReplacerTest_Getter {
+  @override
+  NormalFormalParameter get(DefaultFormalParameter node) => node.parameter;
+}
+
+class Getter_NodeReplacerTest_test_defaultFormalParameter_2
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(DefaultFormalParameter node) => node.defaultValue;
+}
+
+class Getter_NodeReplacerTest_test_doStatement
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(DoStatement node) => node.condition;
+}
+
+class Getter_NodeReplacerTest_test_doStatement_2
+    implements NodeReplacerTest_Getter {
+  @override
+  Statement get(DoStatement node) => node.body;
+}
+
+class Getter_NodeReplacerTest_test_enumConstantDeclaration
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(EnumConstantDeclaration node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_enumDeclaration
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(EnumDeclaration node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_expressionFunctionBody
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(ExpressionFunctionBody node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_expressionStatement
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(ExpressionStatement node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_extendsClause
+    implements NodeReplacerTest_Getter {
+  @override
+  TypeName get(ExtendsClause node) => node.superclass;
+}
+
+class Getter_NodeReplacerTest_test_fieldDeclaration
+    implements NodeReplacerTest_Getter {
+  @override
+  VariableDeclarationList get(FieldDeclaration node) => node.fields;
+}
+
+class Getter_NodeReplacerTest_test_fieldFormalParameter
+    implements NodeReplacerTest_Getter {
+  @override
+  FormalParameterList get(FieldFormalParameter node) => node.parameters;
+}
+
+class Getter_NodeReplacerTest_test_fieldFormalParameter_2
+    implements NodeReplacerTest_Getter {
+  @override
+  TypeName get(FieldFormalParameter node) => node.type;
+}
+
+class Getter_NodeReplacerTest_test_forEachStatement_withIdentifier
+    implements NodeReplacerTest_Getter {
+  @override
+  Statement get(ForEachStatement node) => node.body;
+}
+
+class Getter_NodeReplacerTest_test_forEachStatement_withIdentifier_2
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(ForEachStatement node) => node.identifier;
+}
+
+class Getter_NodeReplacerTest_test_forEachStatement_withIdentifier_3
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(ForEachStatement node) => node.iterable;
+}
+
+class Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(ForEachStatement node) => node.iterable;
+}
+
+class Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable_2
+    implements NodeReplacerTest_Getter {
+  @override
+  DeclaredIdentifier get(ForEachStatement node) => node.loopVariable;
+}
+
+class Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable_3
+    implements NodeReplacerTest_Getter {
+  @override
+  Statement get(ForEachStatement node) => node.body;
+}
+
+class Getter_NodeReplacerTest_test_forStatement_withInitialization
+    implements NodeReplacerTest_Getter {
+  @override
+  Statement get(ForStatement node) => node.body;
+}
+
+class Getter_NodeReplacerTest_test_forStatement_withInitialization_2
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(ForStatement node) => node.condition;
+}
+
+class Getter_NodeReplacerTest_test_forStatement_withInitialization_3
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(ForStatement node) => node.initialization;
+}
+
+class Getter_NodeReplacerTest_test_forStatement_withVariables
+    implements NodeReplacerTest_Getter {
+  @override
+  Statement get(ForStatement node) => node.body;
+}
+
+class Getter_NodeReplacerTest_test_forStatement_withVariables_2
+    implements NodeReplacerTest_Getter {
+  @override
+  VariableDeclarationList get(ForStatement node) => node.variables;
+}
+
+class Getter_NodeReplacerTest_test_forStatement_withVariables_3
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(ForStatement node) => node.condition;
+}
+
+class Getter_NodeReplacerTest_test_functionDeclaration
+    implements NodeReplacerTest_Getter {
+  @override
+  TypeName get(FunctionDeclaration node) => node.returnType;
+}
+
+class Getter_NodeReplacerTest_test_functionDeclaration_2
+    implements NodeReplacerTest_Getter {
+  @override
+  FunctionExpression get(FunctionDeclaration node) => node.functionExpression;
+}
+
+class Getter_NodeReplacerTest_test_functionDeclaration_3
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(FunctionDeclaration node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_functionDeclarationStatement
+    implements NodeReplacerTest_Getter {
+  @override
+  FunctionDeclaration get(FunctionDeclarationStatement node) =>
+      node.functionDeclaration;
+}
+
+class Getter_NodeReplacerTest_test_functionExpression
+    implements NodeReplacerTest_Getter {
+  @override
+  FormalParameterList get(FunctionExpression node) => node.parameters;
+}
+
+class Getter_NodeReplacerTest_test_functionExpression_2
+    implements NodeReplacerTest_Getter {
+  @override
+  FunctionBody get(FunctionExpression node) => node.body;
+}
+
+class Getter_NodeReplacerTest_test_functionExpressionInvocation
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(FunctionExpressionInvocation node) => node.function;
+}
+
+class Getter_NodeReplacerTest_test_functionExpressionInvocation_2
+    implements NodeReplacerTest_Getter {
+  @override
+  ArgumentList get(FunctionExpressionInvocation node) => node.argumentList;
+}
+
+class Getter_NodeReplacerTest_test_functionTypeAlias
+    implements NodeReplacerTest_Getter {
+  @override
+  TypeParameterList get(FunctionTypeAlias node) => node.typeParameters;
+}
+
+class Getter_NodeReplacerTest_test_functionTypeAlias_2
+    implements NodeReplacerTest_Getter {
+  @override
+  FormalParameterList get(FunctionTypeAlias node) => node.parameters;
+}
+
+class Getter_NodeReplacerTest_test_functionTypeAlias_3
+    implements NodeReplacerTest_Getter {
+  @override
+  TypeName get(FunctionTypeAlias node) => node.returnType;
+}
+
+class Getter_NodeReplacerTest_test_functionTypeAlias_4
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(FunctionTypeAlias node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_functionTypedFormalParameter
+    implements NodeReplacerTest_Getter {
+  @override
+  TypeName get(FunctionTypedFormalParameter node) => node.returnType;
+}
+
+class Getter_NodeReplacerTest_test_functionTypedFormalParameter_2
+    implements NodeReplacerTest_Getter {
+  @override
+  FormalParameterList get(FunctionTypedFormalParameter node) => node.parameters;
+}
+
+class Getter_NodeReplacerTest_test_ifStatement
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(IfStatement node) => node.condition;
+}
+
+class Getter_NodeReplacerTest_test_ifStatement_2
+    implements NodeReplacerTest_Getter {
+  @override
+  Statement get(IfStatement node) => node.elseStatement;
+}
+
+class Getter_NodeReplacerTest_test_ifStatement_3
+    implements NodeReplacerTest_Getter {
+  @override
+  Statement get(IfStatement node) => node.thenStatement;
+}
+
+class Getter_NodeReplacerTest_test_importDirective
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(ImportDirective node) => node.prefix;
+}
+
+class Getter_NodeReplacerTest_test_indexExpression
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(IndexExpression node) => node.target;
+}
+
+class Getter_NodeReplacerTest_test_indexExpression_2
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(IndexExpression node) => node.index;
+}
+
+class Getter_NodeReplacerTest_test_instanceCreationExpression
+    implements NodeReplacerTest_Getter {
+  @override
+  ArgumentList get(InstanceCreationExpression node) => node.argumentList;
+}
+
+class Getter_NodeReplacerTest_test_instanceCreationExpression_2
+    implements NodeReplacerTest_Getter {
+  @override
+  ConstructorName get(InstanceCreationExpression node) => node.constructorName;
+}
+
+class Getter_NodeReplacerTest_test_interpolationExpression
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(InterpolationExpression node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_isExpression
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(IsExpression node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_isExpression_2
+    implements NodeReplacerTest_Getter {
+  @override
+  TypeName get(IsExpression node) => node.type;
+}
+
+class Getter_NodeReplacerTest_test_label implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(Label node) => node.label;
+}
+
+class Getter_NodeReplacerTest_test_labeledStatement
+    implements NodeReplacerTest_Getter {
+  @override
+  Statement get(LabeledStatement node) => node.statement;
+}
+
+class Getter_NodeReplacerTest_test_libraryDirective
+    implements NodeReplacerTest_Getter {
+  @override
+  LibraryIdentifier get(LibraryDirective node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_mapLiteralEntry
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(MapLiteralEntry node) => node.value;
+}
+
+class Getter_NodeReplacerTest_test_mapLiteralEntry_2
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(MapLiteralEntry node) => node.key;
+}
+
+class Getter_NodeReplacerTest_test_methodDeclaration
+    implements NodeReplacerTest_Getter {
+  @override
+  TypeName get(MethodDeclaration node) => node.returnType;
+}
+
+class Getter_NodeReplacerTest_test_methodDeclaration_2
+    implements NodeReplacerTest_Getter {
+  @override
+  FunctionBody get(MethodDeclaration node) => node.body;
+}
+
+class Getter_NodeReplacerTest_test_methodDeclaration_3
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(MethodDeclaration node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_methodDeclaration_4
+    implements NodeReplacerTest_Getter {
+  @override
+  FormalParameterList get(MethodDeclaration node) => node.parameters;
+}
+
+class Getter_NodeReplacerTest_test_methodInvocation
+    implements NodeReplacerTest_Getter {
+  @override
+  ArgumentList get(MethodInvocation node) => node.argumentList;
+}
+
+class Getter_NodeReplacerTest_test_methodInvocation_2
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(MethodInvocation node) => node.target;
+}
+
+class Getter_NodeReplacerTest_test_methodInvocation_3
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(MethodInvocation node) => node.methodName;
+}
+
+class Getter_NodeReplacerTest_test_namedExpression
+    implements NodeReplacerTest_Getter {
+  @override
+  Label get(NamedExpression node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_namedExpression_2
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(NamedExpression node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_nativeClause
+    implements NodeReplacerTest_Getter {
+  @override
+  StringLiteral get(NativeClause node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_nativeFunctionBody
+    implements NodeReplacerTest_Getter {
+  @override
+  StringLiteral get(NativeFunctionBody node) => node.stringLiteral;
+}
+
+class Getter_NodeReplacerTest_test_parenthesizedExpression
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(ParenthesizedExpression node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_partOfDirective
+    implements NodeReplacerTest_Getter {
+  @override
+  LibraryIdentifier get(PartOfDirective node) => node.libraryName;
+}
+
+class Getter_NodeReplacerTest_test_postfixExpression
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(PostfixExpression node) => node.operand;
+}
+
+class Getter_NodeReplacerTest_test_prefixedIdentifier
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(PrefixedIdentifier node) => node.identifier;
+}
+
+class Getter_NodeReplacerTest_test_prefixedIdentifier_2
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(PrefixedIdentifier node) => node.prefix;
+}
+
+class Getter_NodeReplacerTest_test_prefixExpression
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(PrefixExpression node) => node.operand;
+}
+
+class Getter_NodeReplacerTest_test_propertyAccess
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(PropertyAccess node) => node.target;
+}
+
+class Getter_NodeReplacerTest_test_propertyAccess_2
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(PropertyAccess node) => node.propertyName;
+}
+
+class Getter_NodeReplacerTest_test_redirectingConstructorInvocation
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(RedirectingConstructorInvocation node) =>
+      node.constructorName;
+}
+
+class Getter_NodeReplacerTest_test_redirectingConstructorInvocation_2
+    implements NodeReplacerTest_Getter {
+  @override
+  ArgumentList get(RedirectingConstructorInvocation node) => node.argumentList;
+}
+
+class Getter_NodeReplacerTest_test_returnStatement
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(ReturnStatement node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_simpleFormalParameter
+    implements NodeReplacerTest_Getter {
+  @override
+  TypeName get(SimpleFormalParameter node) => node.type;
+}
+
+class Getter_NodeReplacerTest_test_superConstructorInvocation
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(SuperConstructorInvocation node) => node.constructorName;
+}
+
+class Getter_NodeReplacerTest_test_superConstructorInvocation_2
+    implements NodeReplacerTest_Getter {
+  @override
+  ArgumentList get(SuperConstructorInvocation node) => node.argumentList;
+}
+
+class Getter_NodeReplacerTest_test_switchCase
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(SwitchCase node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_switchStatement
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(SwitchStatement node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_throwExpression
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(ThrowExpression node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_topLevelVariableDeclaration
+    implements NodeReplacerTest_Getter {
+  @override
+  VariableDeclarationList get(TopLevelVariableDeclaration node) =>
+      node.variables;
+}
+
+class Getter_NodeReplacerTest_test_tryStatement
+    implements NodeReplacerTest_Getter {
+  @override
+  Block get(TryStatement node) => node.finallyBlock;
+}
+
+class Getter_NodeReplacerTest_test_tryStatement_2
+    implements NodeReplacerTest_Getter {
+  @override
+  Block get(TryStatement node) => node.body;
+}
+
+class Getter_NodeReplacerTest_test_typeName implements NodeReplacerTest_Getter {
+  @override
+  TypeArgumentList get(TypeName node) => node.typeArguments;
+}
+
+class Getter_NodeReplacerTest_test_typeName_2
+    implements NodeReplacerTest_Getter {
+  @override
+  Identifier get(TypeName node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_typeParameter
+    implements NodeReplacerTest_Getter {
+  @override
+  TypeName get(TypeParameter node) => node.bound;
+}
+
+class Getter_NodeReplacerTest_test_typeParameter_2
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(TypeParameter node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_variableDeclaration
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(VariableDeclaration node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_variableDeclaration_2
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(VariableDeclaration node) => node.initializer;
+}
+
+class Getter_NodeReplacerTest_test_variableDeclarationList
+    implements NodeReplacerTest_Getter {
+  @override
+  TypeName get(VariableDeclarationList node) => node.type;
+}
+
+class Getter_NodeReplacerTest_test_variableDeclarationStatement
+    implements NodeReplacerTest_Getter {
+  @override
+  VariableDeclarationList get(VariableDeclarationStatement node) =>
+      node.variables;
+}
+
+class Getter_NodeReplacerTest_test_whileStatement
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(WhileStatement node) => node.condition;
+}
+
+class Getter_NodeReplacerTest_test_whileStatement_2
+    implements NodeReplacerTest_Getter {
+  @override
+  Statement get(WhileStatement node) => node.body;
+}
+
+class Getter_NodeReplacerTest_test_yieldStatement
+    implements NodeReplacerTest_Getter {
+  @override
+  Expression get(YieldStatement node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_testAnnotatedNode
+    implements NodeReplacerTest_Getter {
+  @override
+  Comment get(AnnotatedNode node) => node.documentationComment;
+}
+
+class Getter_NodeReplacerTest_testNormalFormalParameter
+    implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(NormalFormalParameter node) => node.identifier;
+}
+
+class Getter_NodeReplacerTest_testNormalFormalParameter_2
+    implements NodeReplacerTest_Getter {
+  @override
+  Comment get(NormalFormalParameter node) => node.documentationComment;
+}
+
+class Getter_NodeReplacerTest_testTypedLiteral
+    implements NodeReplacerTest_Getter {
+  @override
+  TypeArgumentList get(TypedLiteral node) => node.typeArguments;
+}
+
+class Getter_NodeReplacerTest_testUriBasedDirective
+    implements NodeReplacerTest_Getter {
+  @override
+  StringLiteral get(UriBasedDirective node) => node.uri;
+}
+
+@reflectiveTest
+class LineInfoTest {
+  void test_creation() {
+    expect(new LineInfo(<int>[0]), isNotNull);
+  }
+
+  void test_creation_empty() {
+    try {
+      new LineInfo(<int>[]);
+      fail("Expected IllegalArgumentException");
+    } on IllegalArgumentException {
+      // Expected
+    }
+  }
+
+  void test_creation_null() {
+    try {
+      new LineInfo(null);
+      fail("Expected IllegalArgumentException");
+    } on IllegalArgumentException {
+      // Expected
+    }
+  }
+
+  void test_firstLine() {
+    LineInfo info = new LineInfo(<int>[0, 12, 34]);
+    LineInfo_Location location = info.getLocation(4);
+    expect(location.lineNumber, 1);
+    expect(location.columnNumber, 5);
+  }
+
+  void test_lastLine() {
+    LineInfo info = new LineInfo(<int>[0, 12, 34]);
+    LineInfo_Location location = info.getLocation(36);
+    expect(location.lineNumber, 3);
+    expect(location.columnNumber, 3);
+  }
+
+  void test_middleLine() {
+    LineInfo info = new LineInfo(<int>[0, 12, 34]);
+    LineInfo_Location location = info.getLocation(12);
+    expect(location.lineNumber, 2);
+    expect(location.columnNumber, 1);
+  }
+}
+
+class ListGetter_NodeReplacerTest_test_adjacentStrings
+    extends NodeReplacerTest_ListGetter<AdjacentStrings, StringLiteral> {
+  ListGetter_NodeReplacerTest_test_adjacentStrings(int arg0) : super(arg0);
+
+  @override
+  NodeList<StringLiteral> getList(AdjacentStrings node) => node.strings;
+}
+
+class ListGetter_NodeReplacerTest_test_adjacentStrings_2
+    extends NodeReplacerTest_ListGetter<AdjacentStrings, StringLiteral> {
+  ListGetter_NodeReplacerTest_test_adjacentStrings_2(int arg0) : super(arg0);
+
+  @override
+  NodeList<StringLiteral> getList(AdjacentStrings node) => node.strings;
+}
+
+class ListGetter_NodeReplacerTest_test_argumentList
+    extends NodeReplacerTest_ListGetter<ArgumentList, Expression> {
+  ListGetter_NodeReplacerTest_test_argumentList(int arg0) : super(arg0);
+
+  @override
+  NodeList<Expression> getList(ArgumentList node) => node.arguments;
+}
+
+class ListGetter_NodeReplacerTest_test_block
+    extends NodeReplacerTest_ListGetter<Block, Statement> {
+  ListGetter_NodeReplacerTest_test_block(int arg0) : super(arg0);
+
+  @override
+  NodeList<Statement> getList(Block node) => node.statements;
+}
+
+class ListGetter_NodeReplacerTest_test_cascadeExpression
+    extends NodeReplacerTest_ListGetter<CascadeExpression, Expression> {
+  ListGetter_NodeReplacerTest_test_cascadeExpression(int arg0) : super(arg0);
+
+  @override
+  NodeList<Expression> getList(CascadeExpression node) => node.cascadeSections;
+}
+
+class ListGetter_NodeReplacerTest_test_classDeclaration
+    extends NodeReplacerTest_ListGetter<ClassDeclaration, ClassMember> {
+  ListGetter_NodeReplacerTest_test_classDeclaration(int arg0) : super(arg0);
+
+  @override
+  NodeList<ClassMember> getList(ClassDeclaration node) => node.members;
+}
+
+class ListGetter_NodeReplacerTest_test_comment
+    extends NodeReplacerTest_ListGetter<Comment, CommentReference> {
+  ListGetter_NodeReplacerTest_test_comment(int arg0) : super(arg0);
+
+  @override
+  NodeList<CommentReference> getList(Comment node) => node.references;
+}
+
+class ListGetter_NodeReplacerTest_test_compilationUnit
+    extends NodeReplacerTest_ListGetter<CompilationUnit, Directive> {
+  ListGetter_NodeReplacerTest_test_compilationUnit(int arg0) : super(arg0);
+
+  @override
+  NodeList<Directive> getList(CompilationUnit node) => node.directives;
+}
+
+class ListGetter_NodeReplacerTest_test_compilationUnit_2
+    extends NodeReplacerTest_ListGetter<CompilationUnit,
+        CompilationUnitMember> {
+  ListGetter_NodeReplacerTest_test_compilationUnit_2(int arg0) : super(arg0);
+
+  @override
+  NodeList<CompilationUnitMember> getList(CompilationUnit node) =>
+      node.declarations;
+}
+
+class ListGetter_NodeReplacerTest_test_constructorDeclaration
+    extends NodeReplacerTest_ListGetter<ConstructorDeclaration,
+        ConstructorInitializer> {
+  ListGetter_NodeReplacerTest_test_constructorDeclaration(int arg0)
+      : super(arg0);
+
+  @override
+  NodeList<ConstructorInitializer> getList(ConstructorDeclaration node) =>
+      node.initializers;
+}
+
+class ListGetter_NodeReplacerTest_test_formalParameterList
+    extends NodeReplacerTest_ListGetter<FormalParameterList, FormalParameter> {
+  ListGetter_NodeReplacerTest_test_formalParameterList(int arg0) : super(arg0);
+
+  @override
+  NodeList<FormalParameter> getList(FormalParameterList node) =>
+      node.parameters;
+}
+
+class ListGetter_NodeReplacerTest_test_forStatement_withInitialization
+    extends NodeReplacerTest_ListGetter<ForStatement, Expression> {
+  ListGetter_NodeReplacerTest_test_forStatement_withInitialization(int arg0)
+      : super(arg0);
+
+  @override
+  NodeList<Expression> getList(ForStatement node) => node.updaters;
+}
+
+class ListGetter_NodeReplacerTest_test_forStatement_withVariables
+    extends NodeReplacerTest_ListGetter<ForStatement, Expression> {
+  ListGetter_NodeReplacerTest_test_forStatement_withVariables(int arg0)
+      : super(arg0);
+
+  @override
+  NodeList<Expression> getList(ForStatement node) => node.updaters;
+}
+
+class ListGetter_NodeReplacerTest_test_hideCombinator
+    extends NodeReplacerTest_ListGetter<HideCombinator, SimpleIdentifier> {
+  ListGetter_NodeReplacerTest_test_hideCombinator(int arg0) : super(arg0);
+
+  @override
+  NodeList<SimpleIdentifier> getList(HideCombinator node) => node.hiddenNames;
+}
+
+class ListGetter_NodeReplacerTest_test_implementsClause
+    extends NodeReplacerTest_ListGetter<ImplementsClause, TypeName> {
+  ListGetter_NodeReplacerTest_test_implementsClause(int arg0) : super(arg0);
+
+  @override
+  NodeList<TypeName> getList(ImplementsClause node) => node.interfaces;
+}
+
+class ListGetter_NodeReplacerTest_test_labeledStatement
+    extends NodeReplacerTest_ListGetter<LabeledStatement, Label> {
+  ListGetter_NodeReplacerTest_test_labeledStatement(int arg0) : super(arg0);
+
+  @override
+  NodeList<Label> getList(LabeledStatement node) => node.labels;
+}
+
+class ListGetter_NodeReplacerTest_test_libraryIdentifier
+    extends NodeReplacerTest_ListGetter<LibraryIdentifier, SimpleIdentifier> {
+  ListGetter_NodeReplacerTest_test_libraryIdentifier(int arg0) : super(arg0);
+
+  @override
+  NodeList<SimpleIdentifier> getList(LibraryIdentifier node) => node.components;
+}
+
+class ListGetter_NodeReplacerTest_test_listLiteral
+    extends NodeReplacerTest_ListGetter<ListLiteral, Expression> {
+  ListGetter_NodeReplacerTest_test_listLiteral(int arg0) : super(arg0);
+
+  @override
+  NodeList<Expression> getList(ListLiteral node) => node.elements;
+}
+
+class ListGetter_NodeReplacerTest_test_mapLiteral
+    extends NodeReplacerTest_ListGetter<MapLiteral, MapLiteralEntry> {
+  ListGetter_NodeReplacerTest_test_mapLiteral(int arg0) : super(arg0);
+
+  @override
+  NodeList<MapLiteralEntry> getList(MapLiteral node) => node.entries;
+}
+
+class ListGetter_NodeReplacerTest_test_showCombinator
+    extends NodeReplacerTest_ListGetter<ShowCombinator, SimpleIdentifier> {
+  ListGetter_NodeReplacerTest_test_showCombinator(int arg0) : super(arg0);
+
+  @override
+  NodeList<SimpleIdentifier> getList(ShowCombinator node) => node.shownNames;
+}
+
+class ListGetter_NodeReplacerTest_test_stringInterpolation
+    extends NodeReplacerTest_ListGetter<StringInterpolation,
+        InterpolationElement> {
+  ListGetter_NodeReplacerTest_test_stringInterpolation(int arg0) : super(arg0);
+
+  @override
+  NodeList<InterpolationElement> getList(StringInterpolation node) =>
+      node.elements;
+}
+
+class ListGetter_NodeReplacerTest_test_switchStatement
+    extends NodeReplacerTest_ListGetter<SwitchStatement, SwitchMember> {
+  ListGetter_NodeReplacerTest_test_switchStatement(int arg0) : super(arg0);
+
+  @override
+  NodeList<SwitchMember> getList(SwitchStatement node) => node.members;
+}
+
+class ListGetter_NodeReplacerTest_test_tryStatement
+    extends NodeReplacerTest_ListGetter<TryStatement, CatchClause> {
+  ListGetter_NodeReplacerTest_test_tryStatement(int arg0) : super(arg0);
+
+  @override
+  NodeList<CatchClause> getList(TryStatement node) => node.catchClauses;
+}
+
+class ListGetter_NodeReplacerTest_test_typeArgumentList
+    extends NodeReplacerTest_ListGetter<TypeArgumentList, TypeName> {
+  ListGetter_NodeReplacerTest_test_typeArgumentList(int arg0) : super(arg0);
+
+  @override
+  NodeList<TypeName> getList(TypeArgumentList node) => node.arguments;
+}
+
+class ListGetter_NodeReplacerTest_test_typeParameterList
+    extends NodeReplacerTest_ListGetter<TypeParameterList, TypeParameter> {
+  ListGetter_NodeReplacerTest_test_typeParameterList(int arg0) : super(arg0);
+
+  @override
+  NodeList<TypeParameter> getList(TypeParameterList node) =>
+      node.typeParameters;
+}
+
+class ListGetter_NodeReplacerTest_test_variableDeclarationList
+    extends NodeReplacerTest_ListGetter<VariableDeclarationList,
+        VariableDeclaration> {
+  ListGetter_NodeReplacerTest_test_variableDeclarationList(int arg0)
+      : super(arg0);
+
+  @override
+  NodeList<VariableDeclaration> getList(VariableDeclarationList node) =>
+      node.variables;
+}
+
+class ListGetter_NodeReplacerTest_test_withClause
+    extends NodeReplacerTest_ListGetter<WithClause, TypeName> {
+  ListGetter_NodeReplacerTest_test_withClause(int arg0) : super(arg0);
+
+  @override
+  NodeList<TypeName> getList(WithClause node) => node.mixinTypes;
+}
+
+class ListGetter_NodeReplacerTest_testAnnotatedNode
+    extends NodeReplacerTest_ListGetter<AnnotatedNode, Annotation> {
+  ListGetter_NodeReplacerTest_testAnnotatedNode(int arg0) : super(arg0);
+
+  @override
+  NodeList<Annotation> getList(AnnotatedNode node) => node.metadata;
+}
+
+class ListGetter_NodeReplacerTest_testNamespaceDirective
+    extends NodeReplacerTest_ListGetter<NamespaceDirective, Combinator> {
+  ListGetter_NodeReplacerTest_testNamespaceDirective(int arg0) : super(arg0);
+
+  @override
+  NodeList<Combinator> getList(NamespaceDirective node) => node.combinators;
+}
+
+class ListGetter_NodeReplacerTest_testNormalFormalParameter
+    extends NodeReplacerTest_ListGetter<NormalFormalParameter, Annotation> {
+  ListGetter_NodeReplacerTest_testNormalFormalParameter(int arg0) : super(arg0);
+
+  @override
+  NodeList<Annotation> getList(NormalFormalParameter node) => node.metadata;
+}
+
+class ListGetter_NodeReplacerTest_testSwitchMember
+    extends NodeReplacerTest_ListGetter<SwitchMember, Label> {
+  ListGetter_NodeReplacerTest_testSwitchMember(int arg0) : super(arg0);
+
+  @override
+  NodeList<Label> getList(SwitchMember node) => node.labels;
+}
+
+class ListGetter_NodeReplacerTest_testSwitchMember_2
+    extends NodeReplacerTest_ListGetter<SwitchMember, Statement> {
+  ListGetter_NodeReplacerTest_testSwitchMember_2(int arg0) : super(arg0);
+
+  @override
+  NodeList<Statement> getList(SwitchMember node) => node.statements;
+}
+
+@reflectiveTest
+class ListUtilitiesTest {
+  void test_addAll_emptyToEmpty() {
+    List<String> list = new List<String>();
+    List<String> elements = <String>[];
+    ListUtilities.addAll(list, elements);
+    expect(list.length, 0);
+  }
+
+  void test_addAll_emptyToNonEmpty() {
+    List<String> list = new List<String>();
+    list.add("a");
+    List<String> elements = <String>[];
+    ListUtilities.addAll(list, elements);
+    expect(list.length, 1);
+  }
+
+  void test_addAll_nonEmptyToEmpty() {
+    List<String> list = new List<String>();
+    List<String> elements = ["b", "c"];
+    ListUtilities.addAll(list, elements);
+    expect(list.length, 2);
+  }
+
+  void test_addAll_nonEmptyToNonEmpty() {
+    List<String> list = new List<String>();
+    list.add("a");
+    List<String> elements = ["b", "c"];
+    ListUtilities.addAll(list, elements);
+    expect(list.length, 3);
+  }
+}
+
+@reflectiveTest
+class MultipleMapIteratorTest extends EngineTestCase {
+  void test_multipleMaps_firstEmpty() {
+    Map<String, String> map1 = new HashMap<String, String>();
+    Map<String, String> map2 = new HashMap<String, String>();
+    map2["k2"] = "v2";
+    Map<String, String> map3 = new HashMap<String, String>();
+    map3["k3"] = "v3";
+    MultipleMapIterator<String, String> iterator =
+        _iterator([map1, map2, map3]);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isFalse);
+  }
+
+  void test_multipleMaps_lastEmpty() {
+    Map<String, String> map1 = new HashMap<String, String>();
+    map1["k1"] = "v1";
+    Map<String, String> map2 = new HashMap<String, String>();
+    map2["k2"] = "v2";
+    Map<String, String> map3 = new HashMap<String, String>();
+    MultipleMapIterator<String, String> iterator =
+        _iterator([map1, map2, map3]);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isFalse);
+  }
+
+  void test_multipleMaps_middleEmpty() {
+    Map<String, String> map1 = new HashMap<String, String>();
+    map1["k1"] = "v1";
+    Map<String, String> map2 = new HashMap<String, String>();
+    Map<String, String> map3 = new HashMap<String, String>();
+    map3["k3"] = "v3";
+    MultipleMapIterator<String, String> iterator =
+        _iterator([map1, map2, map3]);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isFalse);
+  }
+
+  void test_multipleMaps_nonEmpty() {
+    Map<String, String> map1 = new HashMap<String, String>();
+    map1["k1"] = "v1";
+    Map<String, String> map2 = new HashMap<String, String>();
+    map2["k2"] = "v2";
+    Map<String, String> map3 = new HashMap<String, String>();
+    map3["k3"] = "v3";
+    MultipleMapIterator<String, String> iterator =
+        _iterator([map1, map2, map3]);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isFalse);
+  }
+
+  void test_noMap() {
+    MultipleMapIterator<String, String> iterator = _iterator([]);
+    expect(iterator.moveNext(), isFalse);
+    expect(iterator.moveNext(), isFalse);
+  }
+
+  void test_singleMap_empty() {
+    Map<String, String> map = new HashMap<String, String>();
+    MultipleMapIterator<String, String> iterator = _iterator(<Map>[map]);
+    expect(iterator.moveNext(), isFalse);
+    try {
+      iterator.key;
+      fail("Expected NoSuchElementException");
+    } on NoSuchElementException {
+      // Expected
+    }
+    try {
+      iterator.value;
+      fail("Expected NoSuchElementException");
+    } on NoSuchElementException {
+      // Expected
+    }
+    try {
+      iterator.value = "x";
+      fail("Expected NoSuchElementException");
+    } on NoSuchElementException {
+      // Expected
+    }
+  }
+
+  void test_singleMap_multiple() {
+    Map<String, String> map = new HashMap<String, String>();
+    map["k1"] = "v1";
+    map["k2"] = "v2";
+    map["k3"] = "v3";
+    MultipleMapIterator<String, String> iterator = _iterator([map]);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isFalse);
+  }
+
+  void test_singleMap_single() {
+    String key = "key";
+    String value = "value";
+    Map<String, String> map = new HashMap<String, String>();
+    map[key] = value;
+    MultipleMapIterator<String, String> iterator = _iterator([map]);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.key, same(key));
+    expect(iterator.value, same(value));
+    String newValue = "newValue";
+    iterator.value = newValue;
+    expect(iterator.value, same(newValue));
+    expect(iterator.moveNext(), isFalse);
+  }
+
+  MultipleMapIterator<String, String> _iterator(List<Map> maps) {
+    return new MultipleMapIterator<String, String>(maps);
+  }
+}
+
+@reflectiveTest
+class NodeReplacerTest extends EngineTestCase {
+  /**
+   * An empty list of tokens.
+   */
+  static const List<Token> EMPTY_TOKEN_LIST = const <Token>[];
+
+  void test_adjacentStrings() {
+    AdjacentStrings node = AstFactory
+        .adjacentStrings([AstFactory.string2("a"), AstFactory.string2("b")]);
+    _assertReplace(
+        node, new ListGetter_NodeReplacerTest_test_adjacentStrings_2(0));
+    _assertReplace(
+        node, new ListGetter_NodeReplacerTest_test_adjacentStrings(1));
+  }
+
+  void test_annotation() {
+    Annotation node = AstFactory.annotation2(
+        AstFactory.identifier3("C"),
+        AstFactory.identifier3("c"),
+        AstFactory.argumentList([AstFactory.integer(0)]));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_annotation());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_annotation_3());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_annotation_2());
+  }
+
+  void test_argumentList() {
+    ArgumentList node = AstFactory.argumentList([AstFactory.integer(0)]);
+    _assertReplace(node, new ListGetter_NodeReplacerTest_test_argumentList(0));
+  }
+
+  void test_asExpression() {
+    AsExpression node = AstFactory.asExpression(
+        AstFactory.integer(0),
+        AstFactory.typeName3(
+            AstFactory.identifier3("a"), [AstFactory.typeName4("C")]));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_asExpression_2());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_asExpression());
+  }
+
+  void test_assertStatement() {
+    AssertStatement node =
+        AstFactory.assertStatement(AstFactory.booleanLiteral(true));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_assertStatement());
+  }
+
+  void test_assignmentExpression() {
+    AssignmentExpression node = AstFactory.assignmentExpression(
+        AstFactory.identifier3("l"), TokenType.EQ, AstFactory.identifier3("r"));
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_assignmentExpression_2());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_assignmentExpression());
+  }
+
+  void test_awaitExpression() {
+    var node = AstFactory.awaitExpression(AstFactory.identifier3("A"));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_awaitExpression());
+  }
+
+  void test_binaryExpression() {
+    BinaryExpression node = AstFactory.binaryExpression(
+        AstFactory.identifier3("l"),
+        TokenType.PLUS,
+        AstFactory.identifier3("r"));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_binaryExpression());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_binaryExpression_2());
+  }
+
+  void test_block() {
+    Block node = AstFactory.block([AstFactory.emptyStatement()]);
+    _assertReplace(node, new ListGetter_NodeReplacerTest_test_block(0));
+  }
+
+  void test_blockFunctionBody() {
+    BlockFunctionBody node = AstFactory.blockFunctionBody(AstFactory.block());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_blockFunctionBody());
+  }
+
+  void test_breakStatement() {
+    BreakStatement node = AstFactory.breakStatement2("l");
+    _assertReplace(node, new Getter_NodeReplacerTest_test_breakStatement());
+  }
+
+  void test_cascadeExpression() {
+    CascadeExpression node = AstFactory.cascadeExpression(AstFactory.integer(0),
+        [AstFactory.propertyAccess(null, AstFactory.identifier3("b"))]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_cascadeExpression());
+    _assertReplace(
+        node, new ListGetter_NodeReplacerTest_test_cascadeExpression(0));
+  }
+
+  void test_catchClause() {
+    CatchClause node = AstFactory.catchClause5(
+        AstFactory.typeName4("E"), "e", "s", [AstFactory.emptyStatement()]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_catchClause_3());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_catchClause_2());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_catchClause());
+  }
+
+  void test_classDeclaration() {
+    ClassDeclaration node = AstFactory.classDeclaration(
+        null,
+        "A",
+        AstFactory.typeParameterList(["E"]),
+        AstFactory.extendsClause(AstFactory.typeName4("B")),
+        AstFactory.withClause([AstFactory.typeName4("C")]),
+        AstFactory.implementsClause([AstFactory.typeName4("D")]), [
+      AstFactory.fieldDeclaration2(
+          false, null, [AstFactory.variableDeclaration("f")])
+    ]);
+    node.documentationComment =
+        Comment.createEndOfLineComment(EMPTY_TOKEN_LIST);
+    node.metadata.add(AstFactory.annotation(AstFactory.identifier3("a")));
+    node.nativeClause = AstFactory.nativeClause("");
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classDeclaration_6());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classDeclaration_5());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classDeclaration_4());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classDeclaration_2());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classDeclaration());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classDeclaration_3());
+    _assertReplace(
+        node, new ListGetter_NodeReplacerTest_test_classDeclaration(0));
+    _testAnnotatedNode(node);
+  }
+
+  void test_classTypeAlias() {
+    ClassTypeAlias node = AstFactory.classTypeAlias(
+        "A",
+        AstFactory.typeParameterList(["E"]),
+        null,
+        AstFactory.typeName4("B"),
+        AstFactory.withClause([AstFactory.typeName4("C")]),
+        AstFactory.implementsClause([AstFactory.typeName4("D")]));
+    node.documentationComment =
+        Comment.createEndOfLineComment(EMPTY_TOKEN_LIST);
+    node.metadata.add(AstFactory.annotation(AstFactory.identifier3("a")));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classTypeAlias_4());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classTypeAlias_5());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classTypeAlias());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classTypeAlias_3());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classTypeAlias_2());
+    _testAnnotatedNode(node);
+  }
+
+  void test_comment() {
+    Comment node = Comment.createEndOfLineComment(EMPTY_TOKEN_LIST);
+    node.references
+        .add(new CommentReference(null, AstFactory.identifier3("x")));
+    _assertReplace(node, new ListGetter_NodeReplacerTest_test_comment(0));
+  }
+
+  void test_commentReference() {
+    CommentReference node =
+        new CommentReference(null, AstFactory.identifier3("x"));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_commentReference());
+  }
+
+  void test_compilationUnit() {
+    CompilationUnit node = AstFactory.compilationUnit8("", [
+      AstFactory.libraryDirective2("lib")
+    ], [
+      AstFactory.topLevelVariableDeclaration2(
+          null, [AstFactory.variableDeclaration("X")])
+    ]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_compilationUnit());
+    _assertReplace(
+        node, new ListGetter_NodeReplacerTest_test_compilationUnit(0));
+    _assertReplace(
+        node, new ListGetter_NodeReplacerTest_test_compilationUnit_2(0));
+  }
+
+  void test_conditionalExpression() {
+    ConditionalExpression node = AstFactory.conditionalExpression(
+        AstFactory.booleanLiteral(true),
+        AstFactory.integer(0),
+        AstFactory.integer(1));
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_conditionalExpression_3());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_conditionalExpression_2());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_conditionalExpression());
+  }
+
+  void test_constructorDeclaration() {
+    ConstructorDeclaration node = AstFactory.constructorDeclaration2(
+        null,
+        null,
+        AstFactory.identifier3("C"),
+        "d",
+        AstFactory.formalParameterList(),
+        [
+          AstFactory.constructorFieldInitializer(
+              false, "x", AstFactory.integer(0))
+        ],
+        AstFactory.emptyFunctionBody());
+    node.documentationComment =
+        Comment.createEndOfLineComment(EMPTY_TOKEN_LIST);
+    node.metadata.add(AstFactory.annotation(AstFactory.identifier3("a")));
+    node.redirectedConstructor =
+        AstFactory.constructorName(AstFactory.typeName4("B"), "a");
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_constructorDeclaration_3());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_constructorDeclaration_2());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_constructorDeclaration_4());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_constructorDeclaration());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_constructorDeclaration_5());
+    _assertReplace(
+        node, new ListGetter_NodeReplacerTest_test_constructorDeclaration(0));
+    _testAnnotatedNode(node);
+  }
+
+  void test_constructorFieldInitializer() {
+    ConstructorFieldInitializer node = AstFactory.constructorFieldInitializer(
+        false, "f", AstFactory.integer(0));
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_constructorFieldInitializer());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_constructorFieldInitializer_2());
+  }
+
+  void test_constructorName() {
+    ConstructorName node =
+        AstFactory.constructorName(AstFactory.typeName4("C"), "n");
+    _assertReplace(node, new Getter_NodeReplacerTest_test_constructorName());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_constructorName_2());
+  }
+
+  void test_continueStatement() {
+    ContinueStatement node = AstFactory.continueStatement("l");
+    _assertReplace(node, new Getter_NodeReplacerTest_test_continueStatement());
+  }
+
+  void test_declaredIdentifier() {
+    DeclaredIdentifier node =
+        AstFactory.declaredIdentifier4(AstFactory.typeName4("C"), "i");
+    node.documentationComment =
+        Comment.createEndOfLineComment(EMPTY_TOKEN_LIST);
+    node.metadata.add(AstFactory.annotation(AstFactory.identifier3("a")));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_declaredIdentifier());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_declaredIdentifier_2());
+    _testAnnotatedNode(node);
+  }
+
+  void test_defaultFormalParameter() {
+    DefaultFormalParameter node = AstFactory.positionalFormalParameter(
+        AstFactory.simpleFormalParameter3("p"), AstFactory.integer(0));
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_defaultFormalParameter());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_defaultFormalParameter_2());
+  }
+
+  void test_doStatement() {
+    DoStatement node = AstFactory.doStatement(
+        AstFactory.block(), AstFactory.booleanLiteral(true));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_doStatement_2());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_doStatement());
+  }
+
+  void test_enumConstantDeclaration() {
+    EnumConstantDeclaration node = new EnumConstantDeclaration(
+        Comment.createEndOfLineComment(EMPTY_TOKEN_LIST),
+        [AstFactory.annotation(AstFactory.identifier3("a"))],
+        AstFactory.identifier3("C"));
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_enumConstantDeclaration());
+    _testAnnotatedNode(node);
+  }
+
+  void test_enumDeclaration() {
+    EnumDeclaration node = AstFactory.enumDeclaration2("E", ["ONE", "TWO"]);
+    node.documentationComment =
+        Comment.createEndOfLineComment(EMPTY_TOKEN_LIST);
+    node.metadata.add(AstFactory.annotation(AstFactory.identifier3("a")));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_enumDeclaration());
+    _testAnnotatedNode(node);
+  }
+
+  void test_exportDirective() {
+    ExportDirective node = AstFactory.exportDirective2("", [
+      AstFactory.hideCombinator2(["C"])
+    ]);
+    node.documentationComment =
+        Comment.createEndOfLineComment(EMPTY_TOKEN_LIST);
+    node.metadata.add(AstFactory.annotation(AstFactory.identifier3("a")));
+    _testNamespaceDirective(node);
+  }
+
+  void test_expressionFunctionBody() {
+    ExpressionFunctionBody node =
+        AstFactory.expressionFunctionBody(AstFactory.integer(0));
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_expressionFunctionBody());
+  }
+
+  void test_expressionStatement() {
+    ExpressionStatement node =
+        AstFactory.expressionStatement(AstFactory.integer(0));
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_expressionStatement());
+  }
+
+  void test_extendsClause() {
+    ExtendsClause node = AstFactory.extendsClause(AstFactory.typeName4("S"));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_extendsClause());
+  }
+
+  void test_fieldDeclaration() {
+    FieldDeclaration node = AstFactory.fieldDeclaration(false, null,
+        AstFactory.typeName4("C"), [AstFactory.variableDeclaration("c")]);
+    node.documentationComment =
+        Comment.createEndOfLineComment(EMPTY_TOKEN_LIST);
+    node.metadata.add(AstFactory.annotation(AstFactory.identifier3("a")));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_fieldDeclaration());
+    _testAnnotatedNode(node);
+  }
+
+  void test_fieldFormalParameter() {
+    FieldFormalParameter node = AstFactory.fieldFormalParameter(
+        null, AstFactory.typeName4("C"), "f", AstFactory.formalParameterList());
+    node.documentationComment =
+        Comment.createEndOfLineComment(EMPTY_TOKEN_LIST);
+    node.metadata = [AstFactory.annotation(AstFactory.identifier3("a"))];
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_fieldFormalParameter_2());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_fieldFormalParameter());
+    _testNormalFormalParameter(node);
+  }
+
+  void test_forEachStatement_withIdentifier() {
+    ForEachStatement node = AstFactory.forEachStatement2(
+        AstFactory.identifier3("i"),
+        AstFactory.identifier3("l"),
+        AstFactory.block());
+    _assertReplace(node,
+        new Getter_NodeReplacerTest_test_forEachStatement_withIdentifier_2());
+    _assertReplace(node,
+        new Getter_NodeReplacerTest_test_forEachStatement_withIdentifier_3());
+    _assertReplace(node,
+        new Getter_NodeReplacerTest_test_forEachStatement_withIdentifier());
+  }
+
+  void test_forEachStatement_withLoopVariable() {
+    ForEachStatement node = AstFactory.forEachStatement(
+        AstFactory.declaredIdentifier3("e"),
+        AstFactory.identifier3("l"),
+        AstFactory.block());
+    _assertReplace(node,
+        new Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable_2());
+    _assertReplace(node,
+        new Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable());
+    _assertReplace(node,
+        new Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable_3());
+  }
+
+  void test_formalParameterList() {
+    FormalParameterList node = AstFactory
+        .formalParameterList([AstFactory.simpleFormalParameter3("p")]);
+    _assertReplace(
+        node, new ListGetter_NodeReplacerTest_test_formalParameterList(0));
+  }
+
+  void test_forStatement_withInitialization() {
+    ForStatement node = AstFactory.forStatement(
+        AstFactory.identifier3("a"),
+        AstFactory.booleanLiteral(true),
+        [AstFactory.integer(0)],
+        AstFactory.block());
+    _assertReplace(node,
+        new Getter_NodeReplacerTest_test_forStatement_withInitialization_3());
+    _assertReplace(node,
+        new Getter_NodeReplacerTest_test_forStatement_withInitialization_2());
+    _assertReplace(node,
+        new Getter_NodeReplacerTest_test_forStatement_withInitialization());
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_forStatement_withInitialization(
+            0));
+  }
+
+  void test_forStatement_withVariables() {
+    ForStatement node = AstFactory.forStatement2(
+        AstFactory.variableDeclarationList2(
+            null, [AstFactory.variableDeclaration("i")]),
+        AstFactory.booleanLiteral(true),
+        [AstFactory.integer(0)],
+        AstFactory.block());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_forStatement_withVariables_2());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_forStatement_withVariables_3());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_forStatement_withVariables());
+    _assertReplace(node,
+        new ListGetter_NodeReplacerTest_test_forStatement_withVariables(0));
+  }
+
+  void test_functionDeclaration() {
+    FunctionDeclaration node = AstFactory.functionDeclaration(
+        AstFactory.typeName4("R"),
+        null,
+        "f",
+        AstFactory.functionExpression2(AstFactory.formalParameterList(),
+            AstFactory.blockFunctionBody(AstFactory.block())));
+    node.documentationComment =
+        Comment.createEndOfLineComment(EMPTY_TOKEN_LIST);
+    node.metadata.add(AstFactory.annotation(AstFactory.identifier3("a")));
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_functionDeclaration());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_functionDeclaration_3());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_functionDeclaration_2());
+    _testAnnotatedNode(node);
+  }
+
+  void test_functionDeclarationStatement() {
+    FunctionDeclarationStatement node = AstFactory.functionDeclarationStatement(
+        AstFactory.typeName4("R"),
+        null,
+        "f",
+        AstFactory.functionExpression2(AstFactory.formalParameterList(),
+            AstFactory.blockFunctionBody(AstFactory.block())));
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_functionDeclarationStatement());
+  }
+
+  void test_functionExpression() {
+    FunctionExpression node = AstFactory.functionExpression2(
+        AstFactory.formalParameterList(),
+        AstFactory.blockFunctionBody(AstFactory.block()));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_functionExpression());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_functionExpression_2());
+  }
+
+  void test_functionExpressionInvocation() {
+    FunctionExpressionInvocation node = AstFactory.functionExpressionInvocation(
+        AstFactory.identifier3("f"), [AstFactory.integer(0)]);
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_functionExpressionInvocation());
+    _assertReplace(node,
+        new Getter_NodeReplacerTest_test_functionExpressionInvocation_2());
+  }
+
+  void test_functionTypeAlias() {
+    FunctionTypeAlias node = AstFactory.typeAlias(
+        AstFactory.typeName4("R"),
+        "F",
+        AstFactory.typeParameterList(["E"]),
+        AstFactory.formalParameterList());
+    node.documentationComment =
+        Comment.createEndOfLineComment(EMPTY_TOKEN_LIST);
+    node.metadata.add(AstFactory.annotation(AstFactory.identifier3("a")));
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_functionTypeAlias_3());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_functionTypeAlias_4());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_functionTypeAlias());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_functionTypeAlias_2());
+    _testAnnotatedNode(node);
+  }
+
+  void test_functionTypedFormalParameter() {
+    FunctionTypedFormalParameter node = AstFactory.functionTypedFormalParameter(
+        AstFactory.typeName4("R"),
+        "f",
+        [AstFactory.simpleFormalParameter3("p")]);
+    node.documentationComment =
+        Comment.createEndOfLineComment(EMPTY_TOKEN_LIST);
+    node.metadata = [AstFactory.annotation(AstFactory.identifier3("a"))];
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_functionTypedFormalParameter());
+    _assertReplace(node,
+        new Getter_NodeReplacerTest_test_functionTypedFormalParameter_2());
+    _testNormalFormalParameter(node);
+  }
+
+  void test_hideCombinator() {
+    HideCombinator node = AstFactory.hideCombinator2(["A", "B"]);
+    _assertReplace(
+        node, new ListGetter_NodeReplacerTest_test_hideCombinator(0));
+  }
+
+  void test_ifStatement() {
+    IfStatement node = AstFactory.ifStatement2(AstFactory.booleanLiteral(true),
+        AstFactory.block(), AstFactory.block());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_ifStatement());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_ifStatement_3());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_ifStatement_2());
+  }
+
+  void test_implementsClause() {
+    ImplementsClause node = AstFactory.implementsClause(
+        [AstFactory.typeName4("I"), AstFactory.typeName4("J")]);
+    _assertReplace(
+        node, new ListGetter_NodeReplacerTest_test_implementsClause(0));
+  }
+
+  void test_importDirective() {
+    ImportDirective node = AstFactory.importDirective3("", "p", [
+      AstFactory.showCombinator2(["A"]),
+      AstFactory.hideCombinator2(["B"])
+    ]);
+    node.documentationComment =
+        Comment.createEndOfLineComment(EMPTY_TOKEN_LIST);
+    node.metadata.add(AstFactory.annotation(AstFactory.identifier3("a")));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_importDirective());
+    _testNamespaceDirective(node);
+  }
+
+  void test_indexExpression() {
+    IndexExpression node = AstFactory.indexExpression(
+        AstFactory.identifier3("a"), AstFactory.identifier3("i"));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_indexExpression());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_indexExpression_2());
+  }
+
+  void test_instanceCreationExpression() {
+    InstanceCreationExpression node = AstFactory.instanceCreationExpression3(
+        null, AstFactory.typeName4("C"), "c", [AstFactory.integer(2)]);
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_instanceCreationExpression_2());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_instanceCreationExpression());
+  }
+
+  void test_interpolationExpression() {
+    InterpolationExpression node = AstFactory.interpolationExpression2("x");
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_interpolationExpression());
+  }
+
+  void test_isExpression() {
+    IsExpression node = AstFactory.isExpression(
+        AstFactory.identifier3("v"), false, AstFactory.typeName4("T"));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_isExpression());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_isExpression_2());
+  }
+
+  void test_label() {
+    Label node = AstFactory.label2("l");
+    _assertReplace(node, new Getter_NodeReplacerTest_test_label());
+  }
+
+  void test_labeledStatement() {
+    LabeledStatement node = AstFactory.labeledStatement(
+        [AstFactory.label2("l")], AstFactory.block());
+    _assertReplace(
+        node, new ListGetter_NodeReplacerTest_test_labeledStatement(0));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_labeledStatement());
+  }
+
+  void test_libraryDirective() {
+    LibraryDirective node = AstFactory.libraryDirective2("lib");
+    node.documentationComment =
+        Comment.createEndOfLineComment(EMPTY_TOKEN_LIST);
+    node.metadata.add(AstFactory.annotation(AstFactory.identifier3("a")));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_libraryDirective());
+    _testAnnotatedNode(node);
+  }
+
+  void test_libraryIdentifier() {
+    LibraryIdentifier node = AstFactory.libraryIdentifier2(["lib"]);
+    _assertReplace(
+        node, new ListGetter_NodeReplacerTest_test_libraryIdentifier(0));
+  }
+
+  void test_listLiteral() {
+    ListLiteral node = AstFactory.listLiteral2(
+        null,
+        AstFactory.typeArgumentList([AstFactory.typeName4("E")]),
+        [AstFactory.identifier3("e")]);
+    _assertReplace(node, new ListGetter_NodeReplacerTest_test_listLiteral(0));
+    _testTypedLiteral(node);
+  }
+
+  void test_mapLiteral() {
+    MapLiteral node = AstFactory.mapLiteral(
+        null,
+        AstFactory.typeArgumentList([AstFactory.typeName4("E")]),
+        [AstFactory.mapLiteralEntry("k", AstFactory.identifier3("v"))]);
+    _assertReplace(node, new ListGetter_NodeReplacerTest_test_mapLiteral(0));
+    _testTypedLiteral(node);
+  }
+
+  void test_mapLiteralEntry() {
+    MapLiteralEntry node =
+        AstFactory.mapLiteralEntry("k", AstFactory.identifier3("v"));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_mapLiteralEntry_2());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_mapLiteralEntry());
+  }
+
+  void test_methodDeclaration() {
+    MethodDeclaration node = AstFactory.methodDeclaration2(
+        null,
+        AstFactory.typeName4("A"),
+        null,
+        null,
+        AstFactory.identifier3("m"),
+        AstFactory.formalParameterList(),
+        AstFactory.blockFunctionBody(AstFactory.block()));
+    node.documentationComment =
+        Comment.createEndOfLineComment(EMPTY_TOKEN_LIST);
+    node.metadata.add(AstFactory.annotation(AstFactory.identifier3("a")));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_methodDeclaration());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_methodDeclaration_3());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_methodDeclaration_4());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_methodDeclaration_2());
+    _testAnnotatedNode(node);
+  }
+
+  void test_methodInvocation() {
+    MethodInvocation node = AstFactory.methodInvocation(
+        AstFactory.identifier3("t"), "m", [AstFactory.integer(0)]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_methodInvocation_2());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_methodInvocation_3());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_methodInvocation());
+  }
+
+  void test_namedExpression() {
+    NamedExpression node =
+        AstFactory.namedExpression2("l", AstFactory.identifier3("v"));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_namedExpression());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_namedExpression_2());
+  }
+
+  void test_nativeClause() {
+    NativeClause node = AstFactory.nativeClause("");
+    _assertReplace(node, new Getter_NodeReplacerTest_test_nativeClause());
+  }
+
+  void test_nativeFunctionBody() {
+    NativeFunctionBody node = AstFactory.nativeFunctionBody("m");
+    _assertReplace(node, new Getter_NodeReplacerTest_test_nativeFunctionBody());
+  }
+
+  void test_parenthesizedExpression() {
+    ParenthesizedExpression node =
+        AstFactory.parenthesizedExpression(AstFactory.integer(0));
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_parenthesizedExpression());
+  }
+
+  void test_partDirective() {
+    PartDirective node = AstFactory.partDirective2("");
+    node.documentationComment =
+        Comment.createEndOfLineComment(EMPTY_TOKEN_LIST);
+    node.metadata.add(AstFactory.annotation(AstFactory.identifier3("a")));
+    _testUriBasedDirective(node);
+  }
+
+  void test_partOfDirective() {
+    PartOfDirective node =
+        AstFactory.partOfDirective(AstFactory.libraryIdentifier2(["lib"]));
+    node.documentationComment =
+        Comment.createEndOfLineComment(EMPTY_TOKEN_LIST);
+    node.metadata.add(AstFactory.annotation(AstFactory.identifier3("a")));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_partOfDirective());
+    _testAnnotatedNode(node);
+  }
+
+  void test_postfixExpression() {
+    PostfixExpression node = AstFactory.postfixExpression(
+        AstFactory.identifier3("x"), TokenType.MINUS_MINUS);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_postfixExpression());
+  }
+
+  void test_prefixedIdentifier() {
+    PrefixedIdentifier node = AstFactory.identifier5("a", "b");
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_prefixedIdentifier_2());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_prefixedIdentifier());
+  }
+
+  void test_prefixExpression() {
+    PrefixExpression node = AstFactory.prefixExpression(
+        TokenType.PLUS_PLUS, AstFactory.identifier3("y"));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_prefixExpression());
+  }
+
+  void test_propertyAccess() {
+    PropertyAccess node =
+        AstFactory.propertyAccess2(AstFactory.identifier3("x"), "y");
+    _assertReplace(node, new Getter_NodeReplacerTest_test_propertyAccess());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_propertyAccess_2());
+  }
+
+  void test_redirectingConstructorInvocation() {
+    RedirectingConstructorInvocation node = AstFactory
+        .redirectingConstructorInvocation2("c", [AstFactory.integer(0)]);
+    _assertReplace(node,
+        new Getter_NodeReplacerTest_test_redirectingConstructorInvocation());
+    _assertReplace(node,
+        new Getter_NodeReplacerTest_test_redirectingConstructorInvocation_2());
+  }
+
+  void test_returnStatement() {
+    ReturnStatement node = AstFactory.returnStatement2(AstFactory.integer(0));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_returnStatement());
+  }
+
+  void test_showCombinator() {
+    ShowCombinator node = AstFactory.showCombinator2(["X", "Y"]);
+    _assertReplace(
+        node, new ListGetter_NodeReplacerTest_test_showCombinator(0));
+  }
+
+  void test_simpleFormalParameter() {
+    SimpleFormalParameter node =
+        AstFactory.simpleFormalParameter4(AstFactory.typeName4("T"), "p");
+    node.documentationComment =
+        Comment.createEndOfLineComment(EMPTY_TOKEN_LIST);
+    node.metadata = [AstFactory.annotation(AstFactory.identifier3("a"))];
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_simpleFormalParameter());
+    _testNormalFormalParameter(node);
+  }
+
+  void test_stringInterpolation() {
+    StringInterpolation node =
+        AstFactory.string([AstFactory.interpolationExpression2("a")]);
+    _assertReplace(
+        node, new ListGetter_NodeReplacerTest_test_stringInterpolation(0));
+  }
+
+  void test_superConstructorInvocation() {
+    SuperConstructorInvocation node =
+        AstFactory.superConstructorInvocation2("s", [AstFactory.integer(1)]);
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_superConstructorInvocation());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_superConstructorInvocation_2());
+  }
+
+  void test_switchCase() {
+    SwitchCase node = AstFactory.switchCase2(
+        [AstFactory.label2("l")], AstFactory.integer(0), [AstFactory.block()]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_switchCase());
+    _testSwitchMember(node);
+  }
+
+  void test_switchDefault() {
+    SwitchDefault node = AstFactory.switchDefault(
+        [AstFactory.label2("l")], [AstFactory.block()]);
+    _testSwitchMember(node);
+  }
+
+  void test_switchStatement() {
+    SwitchStatement node =
+        AstFactory.switchStatement(AstFactory.identifier3("x"), [
+      AstFactory.switchCase2([AstFactory.label2("l")], AstFactory.integer(0),
+          [AstFactory.block()]),
+      AstFactory.switchDefault([AstFactory.label2("l")], [AstFactory.block()])
+    ]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_switchStatement());
+    _assertReplace(
+        node, new ListGetter_NodeReplacerTest_test_switchStatement(0));
+  }
+
+  void test_throwExpression() {
+    ThrowExpression node =
+        AstFactory.throwExpression2(AstFactory.identifier3("e"));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_throwExpression());
+  }
+
+  void test_topLevelVariableDeclaration() {
+    TopLevelVariableDeclaration node = AstFactory.topLevelVariableDeclaration(
+        null, AstFactory.typeName4("T"), [AstFactory.variableDeclaration("t")]);
+    node.documentationComment =
+        Comment.createEndOfLineComment(EMPTY_TOKEN_LIST);
+    node.metadata.add(AstFactory.annotation(AstFactory.identifier3("a")));
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_topLevelVariableDeclaration());
+    _testAnnotatedNode(node);
+  }
+
+  void test_tryStatement() {
+    TryStatement node = AstFactory.tryStatement3(
+        AstFactory.block(),
+        [
+          AstFactory.catchClause("e", [AstFactory.block()])
+        ],
+        AstFactory.block());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_tryStatement_2());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_tryStatement());
+    _assertReplace(node, new ListGetter_NodeReplacerTest_test_tryStatement(0));
+  }
+
+  void test_typeArgumentList() {
+    TypeArgumentList node =
+        AstFactory.typeArgumentList([AstFactory.typeName4("A")]);
+    _assertReplace(
+        node, new ListGetter_NodeReplacerTest_test_typeArgumentList(0));
+  }
+
+  void test_typeName() {
+    TypeName node = AstFactory.typeName4(
+        "T", [AstFactory.typeName4("E"), AstFactory.typeName4("F")]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_typeName_2());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_typeName());
+  }
+
+  void test_typeParameter() {
+    TypeParameter node =
+        AstFactory.typeParameter2("E", AstFactory.typeName4("B"));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_typeParameter_2());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_typeParameter());
+  }
+
+  void test_typeParameterList() {
+    TypeParameterList node = AstFactory.typeParameterList(["A", "B"]);
+    _assertReplace(
+        node, new ListGetter_NodeReplacerTest_test_typeParameterList(0));
+  }
+
+  void test_variableDeclaration() {
+    VariableDeclaration node =
+        AstFactory.variableDeclaration2("a", AstFactory.nullLiteral());
+    node.documentationComment =
+        Comment.createEndOfLineComment(EMPTY_TOKEN_LIST);
+    node.metadata.add(AstFactory.annotation(AstFactory.identifier3("a")));
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_variableDeclaration());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_variableDeclaration_2());
+    _testAnnotatedNode(node);
+  }
+
+  void test_variableDeclarationList() {
+    VariableDeclarationList node = AstFactory.variableDeclarationList(
+        null, AstFactory.typeName4("T"), [AstFactory.variableDeclaration("a")]);
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_variableDeclarationList());
+    _assertReplace(
+        node, new ListGetter_NodeReplacerTest_test_variableDeclarationList(0));
+  }
+
+  void test_variableDeclarationStatement() {
+    VariableDeclarationStatement node = AstFactory.variableDeclarationStatement(
+        null, AstFactory.typeName4("T"), [AstFactory.variableDeclaration("a")]);
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_test_variableDeclarationStatement());
+  }
+
+  void test_whileStatement() {
+    WhileStatement node = AstFactory.whileStatement(
+        AstFactory.booleanLiteral(true), AstFactory.block());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_whileStatement());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_whileStatement_2());
+  }
+
+  void test_withClause() {
+    WithClause node = AstFactory.withClause([AstFactory.typeName4("M")]);
+    _assertReplace(node, new ListGetter_NodeReplacerTest_test_withClause(0));
+  }
+
+  void test_yieldStatement() {
+    var node = AstFactory.yieldStatement(AstFactory.identifier3("A"));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_yieldStatement());
+  }
+
+  void _assertReplace(AstNode parent, NodeReplacerTest_Getter getter) {
+    AstNode child = getter.get(parent);
+    if (child != null) {
+      AstNode clone = child.accept(new AstCloner());
+      NodeReplacer.replace(child, clone);
+      expect(getter.get(parent), clone);
+      expect(clone.parent, parent);
+    }
+  }
+
+  void _testAnnotatedNode(AnnotatedNode node) {
+    _assertReplace(node, new Getter_NodeReplacerTest_testAnnotatedNode());
+    _assertReplace(node, new ListGetter_NodeReplacerTest_testAnnotatedNode(0));
+  }
+
+  void _testNamespaceDirective(NamespaceDirective node) {
+    _assertReplace(
+        node, new ListGetter_NodeReplacerTest_testNamespaceDirective(0));
+    _testUriBasedDirective(node);
+  }
+
+  void _testNormalFormalParameter(NormalFormalParameter node) {
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_testNormalFormalParameter_2());
+    _assertReplace(
+        node, new Getter_NodeReplacerTest_testNormalFormalParameter());
+    _assertReplace(
+        node, new ListGetter_NodeReplacerTest_testNormalFormalParameter(0));
+  }
+
+  void _testSwitchMember(SwitchMember node) {
+    _assertReplace(node, new ListGetter_NodeReplacerTest_testSwitchMember(0));
+    _assertReplace(node, new ListGetter_NodeReplacerTest_testSwitchMember_2(0));
+  }
+
+  void _testTypedLiteral(TypedLiteral node) {
+    _assertReplace(node, new Getter_NodeReplacerTest_testTypedLiteral());
+  }
+
+  void _testUriBasedDirective(UriBasedDirective node) {
+    _assertReplace(node, new Getter_NodeReplacerTest_testUriBasedDirective());
+    _testAnnotatedNode(node);
+  }
+}
+
+abstract class NodeReplacerTest_Getter<P, C> {
+  C get(P parent);
+}
+
+abstract class NodeReplacerTest_ListGetter<P extends AstNode, C extends AstNode>
+    implements NodeReplacerTest_Getter<P, C> {
+  final int _index;
+
+  NodeReplacerTest_ListGetter(this._index);
+
+  @override
+  C get(P parent) {
+    NodeList<C> list = getList(parent);
+    if (list.isEmpty) {
+      return null;
+    }
+    return list[_index];
+  }
+
+  NodeList<C> getList(P parent);
+}
+
+@reflectiveTest
+class SingleMapIteratorTest extends EngineTestCase {
+  void test_empty() {
+    Map<String, String> map = new HashMap<String, String>();
+    SingleMapIterator<String, String> iterator =
+        new SingleMapIterator<String, String>(map);
+    expect(iterator.moveNext(), isFalse);
+    try {
+      iterator.key;
+      fail("Expected NoSuchElementException");
+    } on NoSuchElementException {
+      // Expected
+    }
+    try {
+      iterator.value;
+      fail("Expected NoSuchElementException");
+    } on NoSuchElementException {
+      // Expected
+    }
+    try {
+      iterator.value = "x";
+      fail("Expected NoSuchElementException");
+    } on NoSuchElementException {
+      // Expected
+    }
+    expect(iterator.moveNext(), isFalse);
+  }
+
+  void test_multiple() {
+    Map<String, String> map = new HashMap<String, String>();
+    map["k1"] = "v1";
+    map["k2"] = "v2";
+    map["k3"] = "v3";
+    SingleMapIterator<String, String> iterator =
+        new SingleMapIterator<String, String>(map);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isFalse);
+  }
+
+  void test_single() {
+    String key = "key";
+    String value = "value";
+    Map<String, String> map = new HashMap<String, String>();
+    map[key] = value;
+    SingleMapIterator<String, String> iterator =
+        new SingleMapIterator<String, String>(map);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.key, same(key));
+    expect(iterator.value, same(value));
+    String newValue = "newValue";
+    iterator.value = newValue;
+    expect(iterator.value, same(newValue));
+    expect(iterator.moveNext(), isFalse);
+  }
+}
+
+@reflectiveTest
+class SourceRangeTest {
+  void test_access() {
+    SourceRange r = new SourceRange(10, 1);
+    expect(r.offset, 10);
+    expect(r.length, 1);
+    expect(r.end, 10 + 1);
+    // to check
+    r.hashCode;
+  }
+
+  void test_contains() {
+    SourceRange r = new SourceRange(5, 10);
+    expect(r.contains(5), isTrue);
+    expect(r.contains(10), isTrue);
+    expect(r.contains(14), isTrue);
+    expect(r.contains(0), isFalse);
+    expect(r.contains(15), isFalse);
+  }
+
+  void test_containsExclusive() {
+    SourceRange r = new SourceRange(5, 10);
+    expect(r.containsExclusive(5), isFalse);
+    expect(r.containsExclusive(10), isTrue);
+    expect(r.containsExclusive(14), isTrue);
+    expect(r.containsExclusive(0), isFalse);
+    expect(r.containsExclusive(15), isFalse);
+  }
+
+  void test_coveredBy() {
+    SourceRange r = new SourceRange(5, 10);
+    // ends before
+    expect(r.coveredBy(new SourceRange(20, 10)), isFalse);
+    // starts after
+    expect(r.coveredBy(new SourceRange(0, 3)), isFalse);
+    // only intersects
+    expect(r.coveredBy(new SourceRange(0, 10)), isFalse);
+    expect(r.coveredBy(new SourceRange(10, 10)), isFalse);
+    // covered
+    expect(r.coveredBy(new SourceRange(0, 20)), isTrue);
+    expect(r.coveredBy(new SourceRange(5, 10)), isTrue);
+  }
+
+  void test_covers() {
+    SourceRange r = new SourceRange(5, 10);
+    // ends before
+    expect(r.covers(new SourceRange(0, 3)), isFalse);
+    // starts after
+    expect(r.covers(new SourceRange(20, 3)), isFalse);
+    // only intersects
+    expect(r.covers(new SourceRange(0, 10)), isFalse);
+    expect(r.covers(new SourceRange(10, 10)), isFalse);
+    // covers
+    expect(r.covers(new SourceRange(5, 10)), isTrue);
+    expect(r.covers(new SourceRange(6, 9)), isTrue);
+    expect(r.covers(new SourceRange(6, 8)), isTrue);
+  }
+
+  void test_endsIn() {
+    SourceRange r = new SourceRange(5, 10);
+    // ends before
+    expect(r.endsIn(new SourceRange(20, 10)), isFalse);
+    // starts after
+    expect(r.endsIn(new SourceRange(0, 3)), isFalse);
+    // ends
+    expect(r.endsIn(new SourceRange(10, 20)), isTrue);
+    expect(r.endsIn(new SourceRange(0, 20)), isTrue);
+  }
+
+  void test_equals() {
+    SourceRange r = new SourceRange(10, 1);
+    expect(r == null, isFalse);
+    expect(r == this, isFalse);
+    expect(r == new SourceRange(20, 2), isFalse);
+    expect(r == new SourceRange(10, 1), isTrue);
+    expect(r == r, isTrue);
+  }
+
+  void test_getExpanded() {
+    SourceRange r = new SourceRange(5, 3);
+    expect(r.getExpanded(0), r);
+    expect(r.getExpanded(2), new SourceRange(3, 7));
+    expect(r.getExpanded(-1), new SourceRange(6, 1));
+  }
+
+  void test_getMoveEnd() {
+    SourceRange r = new SourceRange(5, 3);
+    expect(r.getMoveEnd(0), r);
+    expect(r.getMoveEnd(3), new SourceRange(5, 6));
+    expect(r.getMoveEnd(-1), new SourceRange(5, 2));
+  }
+
+  void test_getTranslated() {
+    SourceRange r = new SourceRange(5, 3);
+    expect(r.getTranslated(0), r);
+    expect(r.getTranslated(2), new SourceRange(7, 3));
+    expect(r.getTranslated(-1), new SourceRange(4, 3));
+  }
+
+  void test_getUnion() {
+    expect(new SourceRange(10, 10).getUnion(new SourceRange(15, 10)),
+        new SourceRange(10, 15));
+    expect(new SourceRange(15, 10).getUnion(new SourceRange(10, 10)),
+        new SourceRange(10, 15));
+    // "other" is covered/covers
+    expect(new SourceRange(10, 10).getUnion(new SourceRange(15, 2)),
+        new SourceRange(10, 10));
+    expect(new SourceRange(15, 2).getUnion(new SourceRange(10, 10)),
+        new SourceRange(10, 10));
+  }
+
+  void test_intersects() {
+    SourceRange r = new SourceRange(5, 3);
+    // null
+    expect(r.intersects(null), isFalse);
+    // ends before
+    expect(r.intersects(new SourceRange(0, 5)), isFalse);
+    // begins after
+    expect(r.intersects(new SourceRange(8, 5)), isFalse);
+    // begins on same offset
+    expect(r.intersects(new SourceRange(5, 1)), isTrue);
+    // begins inside, ends inside
+    expect(r.intersects(new SourceRange(6, 1)), isTrue);
+    // begins inside, ends after
+    expect(r.intersects(new SourceRange(6, 10)), isTrue);
+    // begins before, ends after
+    expect(r.intersects(new SourceRange(0, 10)), isTrue);
+  }
+
+  void test_startsIn() {
+    SourceRange r = new SourceRange(5, 10);
+    // ends before
+    expect(r.startsIn(new SourceRange(20, 10)), isFalse);
+    // starts after
+    expect(r.startsIn(new SourceRange(0, 3)), isFalse);
+    // starts
+    expect(r.startsIn(new SourceRange(5, 1)), isTrue);
+    expect(r.startsIn(new SourceRange(0, 20)), isTrue);
+  }
+
+  void test_toString() {
+    SourceRange r = new SourceRange(10, 1);
+    expect(r.toString(), "[offset=10, length=1]");
+  }
+}
+
+@reflectiveTest
+class StringUtilitiesTest {
+  void test_EMPTY() {
+    expect(StringUtilities.EMPTY, "");
+    expect(StringUtilities.EMPTY.isEmpty, isTrue);
+  }
+
+  void test_EMPTY_ARRAY() {
+    expect(StringUtilities.EMPTY_ARRAY.length, 0);
+  }
+
+  void test_endsWith3() {
+    expect(StringUtilities.endsWith3("abc", 0x61, 0x62, 0x63), isTrue);
+    expect(StringUtilities.endsWith3("abcdefghi", 0x67, 0x68, 0x69), isTrue);
+    expect(StringUtilities.endsWith3("abcdefghi", 0x64, 0x65, 0x61), isFalse);
+    // missing
+  }
+
+  void test_endsWithChar() {
+    expect(StringUtilities.endsWithChar("a", 0x61), isTrue);
+    expect(StringUtilities.endsWithChar("b", 0x61), isFalse);
+    expect(StringUtilities.endsWithChar("", 0x61), isFalse);
+  }
+
+  void test_indexOf1() {
+    expect(StringUtilities.indexOf1("a", 0, 0x61), 0);
+    expect(StringUtilities.indexOf1("abcdef", 0, 0x61), 0);
+    expect(StringUtilities.indexOf1("abcdef", 0, 0x63), 2);
+    expect(StringUtilities.indexOf1("abcdef", 0, 0x66), 5);
+    expect(StringUtilities.indexOf1("abcdef", 0, 0x7A), -1);
+    expect(StringUtilities.indexOf1("abcdef", 1, 0x61), -1);
+    // before start
+  }
+
+  void test_indexOf2() {
+    expect(StringUtilities.indexOf2("ab", 0, 0x61, 0x62), 0);
+    expect(StringUtilities.indexOf2("abcdef", 0, 0x61, 0x62), 0);
+    expect(StringUtilities.indexOf2("abcdef", 0, 0x63, 0x64), 2);
+    expect(StringUtilities.indexOf2("abcdef", 0, 0x65, 0x66), 4);
+    expect(StringUtilities.indexOf2("abcdef", 0, 0x64, 0x61), -1);
+    expect(StringUtilities.indexOf2("abcdef", 1, 0x61, 0x62), -1);
+    // before start
+  }
+
+  void test_indexOf4() {
+    expect(StringUtilities.indexOf4("abcd", 0, 0x61, 0x62, 0x63, 0x64), 0);
+    expect(StringUtilities.indexOf4("abcdefghi", 0, 0x61, 0x62, 0x63, 0x64), 0);
+    expect(StringUtilities.indexOf4("abcdefghi", 0, 0x63, 0x64, 0x65, 0x66), 2);
+    expect(StringUtilities.indexOf4("abcdefghi", 0, 0x66, 0x67, 0x68, 0x69), 5);
+    expect(
+        StringUtilities.indexOf4("abcdefghi", 0, 0x64, 0x65, 0x61, 0x64), -1);
+    expect(
+        StringUtilities.indexOf4("abcdefghi", 1, 0x61, 0x62, 0x63, 0x64), -1);
+    // before start
+  }
+
+  void test_indexOf5() {
+    expect(
+        StringUtilities.indexOf5("abcde", 0, 0x61, 0x62, 0x63, 0x64, 0x65), 0);
+    expect(
+        StringUtilities.indexOf5("abcdefghi", 0, 0x61, 0x62, 0x63, 0x64, 0x65),
+        0);
+    expect(
+        StringUtilities.indexOf5("abcdefghi", 0, 0x63, 0x64, 0x65, 0x66, 0x67),
+        2);
+    expect(
+        StringUtilities.indexOf5("abcdefghi", 0, 0x65, 0x66, 0x67, 0x68, 0x69),
+        4);
+    expect(
+        StringUtilities.indexOf5("abcdefghi", 0, 0x64, 0x65, 0x66, 0x69, 0x6E),
+        -1);
+    expect(
+        StringUtilities.indexOf5("abcdefghi", 1, 0x61, 0x62, 0x63, 0x64, 0x65),
+        -1);
+    // before start
+  }
+
+  void test_isEmpty() {
+    expect(StringUtilities.isEmpty(""), isTrue);
+    expect(StringUtilities.isEmpty(" "), isFalse);
+    expect(StringUtilities.isEmpty("a"), isFalse);
+    expect(StringUtilities.isEmpty(StringUtilities.EMPTY), isTrue);
+  }
+
+  void test_isTagName() {
+    expect(StringUtilities.isTagName(null), isFalse);
+    expect(StringUtilities.isTagName(""), isFalse);
+    expect(StringUtilities.isTagName("-"), isFalse);
+    expect(StringUtilities.isTagName("0"), isFalse);
+    expect(StringUtilities.isTagName("0a"), isFalse);
+    expect(StringUtilities.isTagName("a b"), isFalse);
+    expect(StringUtilities.isTagName("a0"), isTrue);
+    expect(StringUtilities.isTagName("a"), isTrue);
+    expect(StringUtilities.isTagName("ab"), isTrue);
+    expect(StringUtilities.isTagName("a-b"), isTrue);
+  }
+
+  void test_printListOfQuotedNames_empty() {
+    try {
+      StringUtilities.printListOfQuotedNames(new List<String>(0));
+      fail("Expected IllegalArgumentException");
+    } on IllegalArgumentException {
+      // Expected
+    }
+  }
+
+  void test_printListOfQuotedNames_five() {
+    expect(
+        StringUtilities
+            .printListOfQuotedNames(<String>["a", "b", "c", "d", "e"]),
+        "'a', 'b', 'c', 'd' and 'e'");
+  }
+
+  void test_printListOfQuotedNames_null() {
+    try {
+      StringUtilities.printListOfQuotedNames(null);
+      fail("Expected IllegalArgumentException");
+    } on IllegalArgumentException {
+      // Expected
+    }
+  }
+
+  void test_printListOfQuotedNames_one() {
+    try {
+      StringUtilities.printListOfQuotedNames(<String>["a"]);
+      fail("Expected IllegalArgumentException");
+    } on IllegalArgumentException {
+      // Expected
+    }
+  }
+
+  void test_printListOfQuotedNames_three() {
+    expect(StringUtilities.printListOfQuotedNames(<String>["a", "b", "c"]),
+        "'a', 'b' and 'c'");
+  }
+
+  void test_printListOfQuotedNames_two() {
+    expect(StringUtilities.printListOfQuotedNames(<String>["a", "b"]),
+        "'a' and 'b'");
+  }
+
+  void test_startsWith2() {
+    expect(StringUtilities.startsWith2("ab", 0, 0x61, 0x62), isTrue);
+    expect(StringUtilities.startsWith2("abcdefghi", 0, 0x61, 0x62), isTrue);
+    expect(StringUtilities.startsWith2("abcdefghi", 2, 0x63, 0x64), isTrue);
+    expect(StringUtilities.startsWith2("abcdefghi", 5, 0x66, 0x67), isTrue);
+    expect(StringUtilities.startsWith2("abcdefghi", 0, 0x64, 0x64), isFalse);
+    // missing
+  }
+
+  void test_startsWith3() {
+    expect(StringUtilities.startsWith3("abc", 0, 0x61, 0x62, 0x63), isTrue);
+    expect(
+        StringUtilities.startsWith3("abcdefghi", 0, 0x61, 0x62, 0x63), isTrue);
+    expect(
+        StringUtilities.startsWith3("abcdefghi", 2, 0x63, 0x64, 0x65), isTrue);
+    expect(
+        StringUtilities.startsWith3("abcdefghi", 6, 0x67, 0x68, 0x69), isTrue);
+    expect(
+        StringUtilities.startsWith3("abcdefghi", 0, 0x64, 0x65, 0x61), isFalse);
+    // missing
+  }
+
+  void test_startsWith4() {
+    expect(
+        StringUtilities.startsWith4("abcd", 0, 0x61, 0x62, 0x63, 0x64), isTrue);
+    expect(StringUtilities.startsWith4("abcdefghi", 0, 0x61, 0x62, 0x63, 0x64),
+        isTrue);
+    expect(StringUtilities.startsWith4("abcdefghi", 2, 0x63, 0x64, 0x65, 0x66),
+        isTrue);
+    expect(StringUtilities.startsWith4("abcdefghi", 5, 0x66, 0x67, 0x68, 0x69),
+        isTrue);
+    expect(StringUtilities.startsWith4("abcdefghi", 0, 0x64, 0x65, 0x61, 0x64),
+        isFalse);
+    // missing
+  }
+
+  void test_startsWith5() {
+    expect(
+        StringUtilities.startsWith5("abcde", 0, 0x61, 0x62, 0x63, 0x64, 0x65),
+        isTrue);
+    expect(
+        StringUtilities.startsWith5(
+            "abcdefghi", 0, 0x61, 0x62, 0x63, 0x64, 0x65),
+        isTrue);
+    expect(
+        StringUtilities.startsWith5(
+            "abcdefghi", 2, 0x63, 0x64, 0x65, 0x66, 0x67),
+        isTrue);
+    expect(
+        StringUtilities.startsWith5(
+            "abcdefghi", 4, 0x65, 0x66, 0x67, 0x68, 0x69),
+        isTrue);
+    expect(
+        StringUtilities.startsWith5(
+            "abcdefghi", 0, 0x61, 0x62, 0x63, 0x62, 0x61),
+        isFalse);
+    // missing
+  }
+
+  void test_startsWith6() {
+    expect(
+        StringUtilities.startsWith6(
+            "abcdef", 0, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66),
+        isTrue);
+    expect(
+        StringUtilities.startsWith6(
+            "abcdefghi", 0, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66),
+        isTrue);
+    expect(
+        StringUtilities.startsWith6(
+            "abcdefghi", 2, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68),
+        isTrue);
+    expect(
+        StringUtilities.startsWith6(
+            "abcdefghi", 3, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69),
+        isTrue);
+    expect(
+        StringUtilities.startsWith6(
+            "abcdefghi", 0, 0x61, 0x62, 0x63, 0x64, 0x65, 0x67),
+        isFalse);
+    // missing
+  }
+
+  void test_startsWithChar() {
+    expect(StringUtilities.startsWithChar("a", 0x61), isTrue);
+    expect(StringUtilities.startsWithChar("b", 0x61), isFalse);
+    expect(StringUtilities.startsWithChar("", 0x61), isFalse);
+  }
+
+  void test_substringBefore() {
+    expect(StringUtilities.substringBefore(null, ""), null);
+    expect(StringUtilities.substringBefore(null, "a"), null);
+    expect(StringUtilities.substringBefore("", "a"), "");
+    expect(StringUtilities.substringBefore("abc", "a"), "");
+    expect(StringUtilities.substringBefore("abcba", "b"), "a");
+    expect(StringUtilities.substringBefore("abc", "c"), "ab");
+    expect(StringUtilities.substringBefore("abc", "d"), "abc");
+    expect(StringUtilities.substringBefore("abc", ""), "");
+    expect(StringUtilities.substringBefore("abc", null), "abc");
+  }
+
+  void test_substringBeforeChar() {
+    expect(StringUtilities.substringBeforeChar(null, 0x61), null);
+    expect(StringUtilities.substringBeforeChar("", 0x61), "");
+    expect(StringUtilities.substringBeforeChar("abc", 0x61), "");
+    expect(StringUtilities.substringBeforeChar("abcba", 0x62), "a");
+    expect(StringUtilities.substringBeforeChar("abc", 0x63), "ab");
+    expect(StringUtilities.substringBeforeChar("abc", 0x64), "abc");
+  }
+}
+
+@reflectiveTest
+class TokenMapTest {
+  void test_creation() {
+    expect(new TokenMap(), isNotNull);
+  }
+
+  void test_get_absent() {
+    TokenMap tokenMap = new TokenMap();
+    expect(tokenMap.get(TokenFactory.tokenFromType(TokenType.AT)), isNull);
+  }
+
+  void test_get_added() {
+    TokenMap tokenMap = new TokenMap();
+    Token key = TokenFactory.tokenFromType(TokenType.AT);
+    Token value = TokenFactory.tokenFromType(TokenType.AT);
+    tokenMap.put(key, value);
+    expect(tokenMap.get(key), same(value));
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/instrumentation/instrumentation_test.dart b/mojo/public/dart/third_party/analyzer/test/instrumentation/instrumentation_test.dart
new file mode 100644
index 0000000..e23fd9a
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/instrumentation/instrumentation_test.dart
@@ -0,0 +1,178 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.instrumentation;
+
+import 'package:analyzer/instrumentation/instrumentation.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+
+main() {
+  group('instrumentation', () {
+    runReflectiveTests(InstrumentationServiceTest);
+    runReflectiveTests(MulticastInstrumentationServerTest);
+  });
+}
+
+@reflectiveTest
+class InstrumentationServiceTest {
+  void assertNormal(
+      TestInstrumentationServer server, String tag, String message) {
+    String sent = server.normalChannel.toString();
+    if (!sent.endsWith(':$tag:$message\n')) {
+      fail('Expected "...:$tag:$message", found "$sent"');
+    }
+  }
+
+  void test_logError_withColon() {
+    TestInstrumentationServer server = new TestInstrumentationServer();
+    InstrumentationService service = new InstrumentationService(server);
+    service.logError('Error:message');
+    assertNormal(server, InstrumentationService.TAG_ERROR, 'Error::message');
+  }
+
+  void test_logError_withLeadingColon() {
+    TestInstrumentationServer server = new TestInstrumentationServer();
+    InstrumentationService service = new InstrumentationService(server);
+    service.logError(':a:bb');
+    assertNormal(server, InstrumentationService.TAG_ERROR, '::a::bb');
+  }
+
+  void test_logError_withoutColon() {
+    TestInstrumentationServer server = new TestInstrumentationServer();
+    InstrumentationService service = new InstrumentationService(server);
+    String message = 'Error message';
+    service.logError(message);
+    assertNormal(server, InstrumentationService.TAG_ERROR, message);
+  }
+
+  void test_logException_noTrace() {
+    TestInstrumentationServer server = new TestInstrumentationServer();
+    InstrumentationService service = new InstrumentationService(server);
+    String message = 'exceptionMessage';
+    service.logException(message, null);
+    assertNormal(server, InstrumentationService.TAG_EXCEPTION, '$message:null');
+  }
+
+  void test_logFileRead() {
+    TestInstrumentationServer server = new TestInstrumentationServer();
+    InstrumentationService service = new InstrumentationService(server);
+    String path = '/file/path';
+    int time = 978336000000;
+    String content = 'class C {\n}\n';
+    service.logFileRead(path, time, content);
+    assertNormal(
+        server, InstrumentationService.TAG_FILE_READ, '$path:$time:$content');
+  }
+
+  void test_logLogEntry() {
+    TestInstrumentationServer server = new TestInstrumentationServer();
+    InstrumentationService service = new InstrumentationService(server);
+    String level = 'level';
+    DateTime time = new DateTime(2001);
+    String message = 'message';
+    String exception = 'exception';
+    String stackTraceText = 'stackTrace';
+    StackTrace stackTrace = new StackTrace.fromString(stackTraceText);
+    service.logLogEntry(level, time, message, exception, stackTrace);
+    assertNormal(server, InstrumentationService.TAG_LOG_ENTRY,
+        '$level:${time.millisecondsSinceEpoch}:$message:$exception:$stackTraceText');
+  }
+
+  void test_logNotification() {
+    TestInstrumentationServer server = new TestInstrumentationServer();
+    InstrumentationService service = new InstrumentationService(server);
+    String message = 'notificationText';
+    service.logNotification(message);
+    assertNormal(server, InstrumentationService.TAG_NOTIFICATION, message);
+  }
+
+  void test_logRequest() {
+    TestInstrumentationServer server = new TestInstrumentationServer();
+    InstrumentationService service = new InstrumentationService(server);
+    String message = 'requestText';
+    service.logRequest(message);
+    assertNormal(server, InstrumentationService.TAG_REQUEST, message);
+  }
+
+  void test_logResponse() {
+    TestInstrumentationServer server = new TestInstrumentationServer();
+    InstrumentationService service = new InstrumentationService(server);
+    String message = 'responseText';
+    service.logResponse(message);
+    assertNormal(server, InstrumentationService.TAG_RESPONSE, message);
+  }
+
+  void test_logVersion() {
+    TestInstrumentationServer server = new TestInstrumentationServer();
+    InstrumentationService service = new InstrumentationService(server);
+    service.logVersion('myUuid', 'someClientId', 'someClientVersion',
+        'aServerVersion', 'anSdkVersion');
+    expect(server.normalChannel.toString(), '');
+    expect(server.priorityChannel.toString(), endsWith(
+        ':myUuid:someClientId:someClientVersion:aServerVersion:anSdkVersion\n'));
+  }
+}
+
+@reflectiveTest
+class MulticastInstrumentationServerTest {
+  TestInstrumentationServer serverA = new TestInstrumentationServer();
+  TestInstrumentationServer serverB = new TestInstrumentationServer();
+  MulticastInstrumentationServer server;
+
+  void setUp() {
+    server = new MulticastInstrumentationServer([serverA, serverB]);
+  }
+
+  void test_log() {
+    server.log('foo bar');
+    _assertNormal(serverA, 'foo bar');
+    _assertNormal(serverB, 'foo bar');
+  }
+
+  void test_logWithPriority() {
+    server.logWithPriority('foo bar');
+    _assertPriority(serverA, 'foo bar');
+    _assertPriority(serverB, 'foo bar');
+  }
+
+  void test_shutdown() {
+    server.shutdown();
+  }
+
+  void _assertNormal(TestInstrumentationServer server, String message) {
+    String sent = server.normalChannel.toString();
+    if (!sent.endsWith('$message\n')) {
+      fail('Expected "...$message", found "$sent"');
+    }
+  }
+
+  void _assertPriority(TestInstrumentationServer server, String message) {
+    String sent = server.priorityChannel.toString();
+    if (!sent.endsWith('$message\n')) {
+      fail('Expected "...$message", found "$sent"');
+    }
+  }
+}
+
+class TestInstrumentationServer implements InstrumentationServer {
+  StringBuffer normalChannel = new StringBuffer();
+  StringBuffer priorityChannel = new StringBuffer();
+
+  @override
+  void log(String message) {
+    normalChannel.writeln(message);
+  }
+
+  @override
+  void logWithPriority(String message) {
+    priorityChannel.writeln(message);
+  }
+
+  @override
+  void shutdown() {
+    // Ignored
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/instrumentation/test_all.dart b/mojo/public/dart/third_party/analyzer/test/instrumentation/test_all.dart
new file mode 100644
index 0000000..f9bfc2d
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/instrumentation/test_all.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.instrumentation.test_all;
+
+import 'package:unittest/unittest.dart';
+
+import 'instrumentation_test.dart' as instrumentation_test;
+
+/// Utility for manually running all tests.
+main() {
+  groupSep = ' | ';
+  group('instrumentation', () {
+    instrumentation_test.main();
+  });
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/parse_compilation_unit_test.dart b/mojo/public/dart/third_party/analyzer/test/parse_compilation_unit_test.dart
new file mode 100644
index 0000000..71e4838
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/parse_compilation_unit_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.parse.compilation.unit;
+
+import 'package:analyzer/analyzer.dart';
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+void main() {
+  initializeTestEnvironment();
+  test("parses a valid compilation unit successfully", () {
+    var unit = parseCompilationUnit("void main() => print('Hello, world!');");
+    expect(unit.toString(), equals("void main() => print('Hello, world!');"));
+  });
+
+  test("throws errors for an invalid compilation unit", () {
+    expect(() {
+      parseCompilationUnit("void main() => print('Hello, world!')",
+          name: 'test.dart');
+    }, throwsA(predicate((error) {
+      return error is AnalyzerErrorGroup &&
+          error.toString().contains("Error in test.dart: Expected to find ';'");
+    })));
+  });
+
+  test("defaults to '<unknown source>' if no name is provided", () {
+    expect(() {
+      parseCompilationUnit("void main() => print('Hello, world!')");
+    }, throwsA(predicate((error) {
+      return error is AnalyzerErrorGroup &&
+          error
+              .toString()
+              .contains("Error in <unknown source>: Expected to find ';'");
+    })));
+  });
+
+  test("allows you to specify whether or not to parse function bodies", () {
+    var unit = parseCompilationUnit("void main() => print('Hello, world!');",
+        parseFunctionBodies: false);
+    expect(unit.toString(), equals("void main();"));
+  });
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/reflective_tests.dart b/mojo/public/dart/third_party/analyzer/test/reflective_tests.dart
new file mode 100644
index 0000000..8180cf7
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/reflective_tests.dart
@@ -0,0 +1,121 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library reflective_tests;
+
+@MirrorsUsed(metaTargets: 'ReflectiveTest')
+import 'dart:mirrors';
+import 'dart:async';
+
+import 'package:unittest/unittest.dart';
+
+/**
+ * Runs test methods existing in the given [type].
+ *
+ * Methods with names starting with `test` are run using [test] function.
+ * Methods with names starting with `solo_test` are run using [solo_test] function.
+ *
+ * Each method is run with a new instance of [type].
+ * So, [type] should have a default constructor.
+ *
+ * If [type] declares method `setUp`, it methods will be invoked before any test
+ * method invocation.
+ *
+ * If [type] declares method `tearDown`, it will be invoked after any test
+ * method invocation. If method returns [Future] to test some asyncronous
+ * behavior, then `tearDown` will be invoked in `Future.complete`.
+ */
+void runReflectiveTests(Type type) {
+  ClassMirror classMirror = reflectClass(type);
+  if (!classMirror.metadata.any((InstanceMirror annotation) =>
+      annotation.type.reflectedType == ReflectiveTest)) {
+    String name = MirrorSystem.getName(classMirror.qualifiedName);
+    throw new Exception('Class $name must have annotation "@reflectiveTest" '
+        'in order to be run by runReflectiveTests.');
+  }
+  String className = MirrorSystem.getName(classMirror.simpleName);
+  group(className, () {
+    classMirror.instanceMembers.forEach((symbol, memberMirror) {
+      // we need only methods
+      if (memberMirror is! MethodMirror || !memberMirror.isRegularMethod) {
+        return;
+      }
+      String memberName = MirrorSystem.getName(symbol);
+      // test_
+      if (memberName.startsWith('test_')) {
+        test(memberName, () {
+          return _runTest(classMirror, symbol);
+        });
+        return;
+      }
+      // solo_test_
+      if (memberName.startsWith('solo_test_')) {
+        solo_test(memberName, () {
+          return _runTest(classMirror, symbol);
+        });
+      }
+      // fail_test_
+      if (memberName.startsWith('fail_')) {
+        test(memberName, () {
+          return _runFailingTest(classMirror, symbol);
+        });
+      }
+      // solo_fail_test_
+      if (memberName.startsWith('solo_fail_')) {
+        solo_test(memberName, () {
+          return _runFailingTest(classMirror, symbol);
+        });
+      }
+    });
+  });
+}
+
+Future _invokeSymbolIfExists(InstanceMirror instanceMirror, Symbol symbol) {
+  var invocationResult = null;
+  try {
+    invocationResult = instanceMirror.invoke(symbol, []).reflectee;
+  } on NoSuchMethodError {}
+  if (invocationResult is Future) {
+    return invocationResult;
+  } else {
+    return new Future.value(invocationResult);
+  }
+}
+
+/**
+ * Run a test that is expected to fail, and confirm that it fails.
+ *
+ * This properly handles the following cases:
+ * - The test fails by throwing an exception
+ * - The test returns a future which completes with an error.
+ *
+ * However, it does not handle the case where the test creates an asynchronous
+ * callback using expectAsync(), and that callback generates a failure.
+ */
+Future _runFailingTest(ClassMirror classMirror, Symbol symbol) {
+  return new Future(() => _runTest(classMirror, symbol)).then((_) {
+    fail('Test passed - expected to fail.');
+  }, onError: (_) {});
+}
+
+_runTest(ClassMirror classMirror, Symbol symbol) {
+  InstanceMirror instanceMirror = classMirror.newInstance(new Symbol(''), []);
+  return _invokeSymbolIfExists(instanceMirror, #setUp)
+      .then((_) => instanceMirror.invoke(symbol, []).reflectee)
+      .whenComplete(() => _invokeSymbolIfExists(instanceMirror, #tearDown));
+}
+
+/**
+ * A marker annotation used to instruct dart2js to keep reflection information
+ * for the annotated classes.
+ */
+class ReflectiveTest {
+  const ReflectiveTest();
+}
+
+/**
+ * A marker annotation used to instruct dart2js to keep reflection information
+ * for the annotated classes.
+ */
+const ReflectiveTest reflectiveTest = const ReflectiveTest();
diff --git a/mojo/public/dart/third_party/analyzer/test/source/analysis_options_provider_test.dart b/mojo/public/dart/third_party/analyzer/test/source/analysis_options_provider_test.dart
new file mode 100644
index 0000000..b200278
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/source/analysis_options_provider_test.dart
@@ -0,0 +1,68 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.source.analysis_options_provider;
+
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/source/analysis_options_provider.dart';
+import 'package:unittest/unittest.dart';
+import 'package:yaml/yaml.dart';
+
+import '../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  group('AnalysisOptionsProvider', () {
+    setUp(() {
+      buildResourceProvider();
+    });
+    tearDown(() {
+      clearResourceProvider();
+    });
+    test('test_simple', () {
+      var optionsProvider = new AnalysisOptionsProvider();
+      Map<String, YamlNode> options =
+          optionsProvider.getOptions(resourceProvider.getFolder('/'));
+      expect(options.length, equals(1));
+      expect(options['analyzer'], isNotNull);
+      YamlMap analyzer = options['analyzer'];
+      expect(analyzer.length, equals(1));
+      expect(analyzer['ignore'], isNotNull);
+      YamlList ignore = analyzer['ignore'];
+      expect(ignore.length, equals(2));
+      expect(ignore[0], equals('ignoreme.dart'));
+      expect(ignore[1], equals('sdk_ext/**'));
+    });
+    test('test_doesnotexist', () {
+      var optionsProvider = new AnalysisOptionsProvider();
+      Map<String, YamlNode> options =
+          optionsProvider.getOptions(resourceProvider.getFolder('/empty'));
+      expect(options.length, equals(0));
+    });
+  });
+}
+
+MemoryResourceProvider resourceProvider;
+
+buildResourceProvider() {
+  resourceProvider = new MemoryResourceProvider();
+  resourceProvider.newFolder('/empty');
+  resourceProvider.newFolder('/tmp');
+  resourceProvider.newFile(
+      '/.analysis_options',
+      r'''
+analyzer:
+  ignore:
+    - ignoreme.dart
+    - 'sdk_ext/**'
+''');
+}
+
+clearResourceProvider() {
+  resourceProvider = null;
+}
+
+emptyResourceProvider() {
+  resourceProvider = new MemoryResourceProvider();
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/source/package_map_provider_test.dart b/mojo/public/dart/third_party/analyzer/test/source/package_map_provider_test.dart
new file mode 100644
index 0000000..af5bedf
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/source/package_map_provider_test.dart
@@ -0,0 +1,126 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.package.map.provider;
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/source/package_map_provider.dart';
+import 'package:analyzer/source/pub_package_map_provider.dart';
+import 'package:analyzer/src/generated/sdk_io.dart';
+import 'package:unittest/unittest.dart';
+
+import '../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+
+  group('PubPackageMapProvider', () {
+    group('parsePackageMap', () {
+      MemoryResourceProvider resourceProvider;
+      PubPackageMapProvider packageMapProvider;
+      const String projectPath = '/path/to/project';
+      Folder projectFolder;
+
+      setUp(() {
+        resourceProvider = new MemoryResourceProvider();
+        packageMapProvider = new PubPackageMapProvider(
+            resourceProvider, DirectoryBasedDartSdk.defaultSdk);
+        projectFolder = resourceProvider.newFolder(projectPath);
+      });
+
+      PackageMapInfo parsePackageMap(Object obj) {
+        return packageMapProvider.parsePackageMap(obj, projectFolder);
+      }
+
+      test('normal folder', () {
+        String packageName = 'foo';
+        String folderPath = '/path/to/folder';
+        resourceProvider.newFolder(folderPath);
+        Map<String, List<Folder>> result = parsePackageMap({
+          'packages': {packageName: folderPath}
+        }).packageMap;
+        expect(result, hasLength(1));
+        expect(result.keys, contains(packageName));
+        expect(result[packageName], hasLength(1));
+        expect(result[packageName][0], new isInstanceOf<Folder>());
+        expect(result[packageName][0].path, equals(folderPath));
+      });
+
+      test("don't ignore nonexistent folder", () {
+        String packageName = 'foo';
+        String folderPath = '/path/to/folder';
+        Map<String, List<Folder>> result = parsePackageMap({
+          'packages': {packageName: folderPath}
+        }).packageMap;
+        expect(result, hasLength(1));
+        expect(result.keys, contains(packageName));
+        expect(result[packageName], hasLength(1));
+        expect(result[packageName][0], new isInstanceOf<Folder>());
+        expect(result[packageName][0].path, equals(folderPath));
+      });
+
+      test('package maps to list', () {
+        String packageName = 'foo';
+        String folderPath1 = '/path/to/folder1';
+        String folderPath2 = '/path/to/folder2';
+        resourceProvider.newFolder(folderPath1);
+        resourceProvider.newFolder(folderPath2);
+        Map<String, List<Folder>> result = parsePackageMap({
+          'packages': {
+            packageName: [folderPath1, folderPath2]
+          }
+        }).packageMap;
+        expect(result, hasLength(1));
+        expect(result.keys, contains(packageName));
+        expect(result[packageName], hasLength(2));
+        for (int i = 0; i < 2; i++) {
+          expect(result[packageName][i], new isInstanceOf<Folder>());
+          expect(result[packageName][i].path, isIn([folderPath1, folderPath2]));
+        }
+      });
+
+      test('Handle dependencies', () {
+        String path1 = '/path/to/folder1/pubspec.lock';
+        String path2 = '/path/to/folder2/pubspec.lock';
+        resourceProvider.newFile(path1, '...');
+        resourceProvider.newFile(path2, '...');
+        Set<String> dependencies = parsePackageMap({
+          'packages': {},
+          'input_files': [path1, path2]
+        }).dependencies;
+        expect(dependencies, hasLength(2));
+        expect(dependencies, contains(path1));
+        expect(dependencies, contains(path2));
+      });
+
+      test('Relative path in packages', () {
+        String packagePath = '/path/to/package';
+        String relativePackagePath = '../package';
+        String packageName = 'foo';
+        resourceProvider.newFolder(projectPath);
+        resourceProvider.newFolder(packagePath);
+        Map<String, List<Folder>> result = parsePackageMap({
+          'packages': {
+            packageName: [relativePackagePath]
+          }
+        }).packageMap;
+        expect(result[packageName][0].path, equals(packagePath));
+      });
+
+      test('Relative path in dependencies', () {
+        String dependencyPath = '/path/to/pubspec.lock';
+        String relativeDependencyPath = '../pubspec.lock';
+        resourceProvider.newFolder(projectPath);
+        resourceProvider.newFile(dependencyPath, 'contents');
+        Set<String> dependencies = parsePackageMap({
+          'packages': {},
+          'input_files': [relativeDependencyPath]
+        }).dependencies;
+        expect(dependencies, hasLength(1));
+        expect(dependencies, contains(dependencyPath));
+      });
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/source/package_map_resolver_test.dart b/mojo/public/dart/third_party/analyzer/test/source/package_map_resolver_test.dart
new file mode 100644
index 0000000..caf88da
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/source/package_map_resolver_test.dart
@@ -0,0 +1,237 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.source.package_map_resolver;
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/source/package_map_resolver.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:path/path.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+import '../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(_PackageMapUriResolverTest);
+}
+
+@reflectiveTest
+class _PackageMapUriResolverTest {
+  static const Map EMPTY_MAP = const <String, List<Folder>>{};
+  MemoryResourceProvider provider = new MemoryResourceProvider();
+
+  void test_isPackageUri() {
+    Uri uri = Uri.parse('package:test/test.dart');
+    expect(uri.scheme, 'package');
+    expect(PackageMapUriResolver.isPackageUri(uri), isTrue);
+  }
+
+  void test_isPackageUri_null_scheme() {
+    Uri uri = Uri.parse('foo.dart');
+    expect(uri.scheme, '');
+    expect(PackageMapUriResolver.isPackageUri(uri), isFalse);
+  }
+
+  void test_isPackageUri_other_scheme() {
+    Uri uri = Uri.parse('memfs:/foo.dart');
+    expect(uri.scheme, 'memfs');
+    expect(PackageMapUriResolver.isPackageUri(uri), isFalse);
+  }
+
+  void test_new_null_packageMap() {
+    expect(() {
+      new PackageMapUriResolver(provider, null);
+    }, throws);
+  }
+
+  void test_new_null_resourceProvider() {
+    expect(() {
+      new PackageMapUriResolver(null, <String, List<Folder>>{});
+    }, throws);
+  }
+
+  void test_resolve_multiple_folders() {
+    const pkgFileA = '/part1/lib/libA.dart';
+    const pkgFileB = '/part2/lib/libB.dart';
+    provider.newFile(pkgFileA, 'library lib_a');
+    provider.newFile(pkgFileB, 'library lib_b');
+    PackageMapUriResolver resolver =
+        new PackageMapUriResolver(provider, <String, List<Folder>>{
+      'pkg': [
+        provider.getResource('/part1/lib/'),
+        provider.getResource('/part2/lib/')
+      ]
+    });
+    {
+      Uri uri = Uri.parse('package:pkg/libA.dart');
+      Source result = resolver.resolveAbsolute(uri);
+      expect(result, isNotNull);
+      expect(result.exists(), isTrue);
+      expect(result.uriKind, UriKind.PACKAGE_URI);
+      expect(result.fullName, pkgFileA);
+    }
+    {
+      Uri uri = Uri.parse('package:pkg/libB.dart');
+      Source result = resolver.resolveAbsolute(uri);
+      expect(result, isNotNull);
+      expect(result.exists(), isTrue);
+      expect(result.uriKind, UriKind.PACKAGE_URI);
+      expect(result.fullName, pkgFileB);
+    }
+  }
+
+  void test_resolve_nonPackage() {
+    UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
+    Uri uri = Uri.parse('dart:core');
+    Source result = resolver.resolveAbsolute(uri);
+    expect(result, isNull);
+  }
+
+  void test_resolve_OK() {
+    const pkgFileA = '/pkgA/lib/libA.dart';
+    const pkgFileB = '/pkgB/lib/libB.dart';
+    provider.newFile(pkgFileA, 'library lib_a;');
+    provider.newFile(pkgFileB, 'library lib_b;');
+    PackageMapUriResolver resolver =
+        new PackageMapUriResolver(provider, <String, List<Folder>>{
+      'pkgA': [provider.getResource('/pkgA/lib/')],
+      'pkgB': [provider.getResource('/pkgB/lib/')]
+    });
+    {
+      Uri uri = Uri.parse('package:pkgA/libA.dart');
+      Source result = resolver.resolveAbsolute(uri);
+      expect(result, isNotNull);
+      expect(result.exists(), isTrue);
+      expect(result.uriKind, UriKind.PACKAGE_URI);
+      expect(result.fullName, pkgFileA);
+    }
+    {
+      Uri uri = Uri.parse('package:pkgB/libB.dart');
+      Source result = resolver.resolveAbsolute(uri);
+      expect(result, isNotNull);
+      expect(result.exists(), isTrue);
+      expect(result.uriKind, UriKind.PACKAGE_URI);
+      expect(result.fullName, pkgFileB);
+    }
+  }
+
+  void test_resolve_package_invalid_leadingSlash() {
+    UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
+    Uri uri = Uri.parse('package:/foo');
+    Source result = resolver.resolveAbsolute(uri);
+    expect(result, isNull);
+  }
+
+  void test_resolve_package_invalid_noSlash() {
+    UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
+    Uri uri = Uri.parse('package:foo');
+    Source result = resolver.resolveAbsolute(uri);
+    expect(result, isNull);
+  }
+
+  void test_resolve_package_invalid_onlySlash() {
+    UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
+    Uri uri = Uri.parse('package:/');
+    Source result = resolver.resolveAbsolute(uri);
+    expect(result, isNull);
+  }
+
+  void test_resolve_package_notInMap() {
+    UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
+    Uri uri = Uri.parse('package:analyzer/analyzer.dart');
+    Source result = resolver.resolveAbsolute(uri);
+    expect(result, isNotNull);
+    expect(result.exists(), isFalse);
+    expect(result.fullName, 'analyzer.dart');
+    expect(result.uri.toString(), 'package:analyzer/analyzer.dart');
+  }
+
+  void test_restoreAbsolute() {
+    const pkgFileA = '/pkgA/lib/libA.dart';
+    const pkgFileB = '/pkgB/lib/src/libB.dart';
+    provider.newFile(pkgFileA, 'library lib_a;');
+    provider.newFile(pkgFileB, 'library lib_b;');
+    PackageMapUriResolver resolver =
+        new PackageMapUriResolver(provider, <String, List<Folder>>{
+      'pkgA': [provider.getResource('/pkgA/lib/')],
+      'pkgB': [provider.getResource('/pkgB/lib/')]
+    });
+    {
+      Source source = _createFileSource('/pkgA/lib/libA.dart');
+      Uri uri = resolver.restoreAbsolute(source);
+      expect(uri, isNotNull);
+      expect(uri.toString(), 'package:pkgA/libA.dart');
+    }
+    {
+      Source source = _createFileSource('/pkgB/lib/src/libB.dart');
+      Uri uri = resolver.restoreAbsolute(source);
+      expect(uri, isNotNull);
+      expect(uri.toString(), 'package:pkgB/src/libB.dart');
+    }
+    {
+      Source source = _createFileSource('/no/such/file');
+      Uri uri = resolver.restoreAbsolute(source);
+      expect(uri, isNull);
+    }
+  }
+
+  void test_restoreAbsolute_ambiguous() {
+    const file1 = '/foo1/lib/bar.dart';
+    const file2 = '/foo2/lib/bar.dart';
+    provider.newFile(file1, 'library bar');
+    provider.newFile(file2, 'library bar');
+    PackageMapUriResolver resolver =
+        new PackageMapUriResolver(provider, <String, List<Folder>>{
+      'foo': [
+        provider.getResource('/foo1/lib'),
+        provider.getResource('/foo2/lib')
+      ]
+    });
+    // Restoring file1 should yield a package URI, and that package URI should
+    // resolve back to file1.
+    Source source1 = _createFileSource(file1);
+    Uri uri1 = resolver.restoreAbsolute(source1);
+    expect(uri1.toString(), 'package:foo/bar.dart');
+    expect(resolver.resolveAbsolute(uri1).fullName, file1);
+    // Restoring file2 should not yield a package URI, because there is no URI
+    // that resolves to file2.
+    Source source2 = _createFileSource(file2);
+    expect(resolver.restoreAbsolute(source2), isNull);
+  }
+
+  void test_restoreAbsolute_longestMatch() {
+    const file1 = '/foo1/bar1/lib.dart';
+    const file2 = '/foo2/bar2/lib.dart';
+    provider.newFile(file1, 'library lib');
+    provider.newFile(file2, 'library lib');
+    PackageMapUriResolver resolver =
+        new PackageMapUriResolver(provider, <String, List<Folder>>{
+      'pkg1': [
+        provider.getResource('/foo1'),
+        provider.getResource('/foo2/bar2')
+      ],
+      'pkg2': [
+        provider.getResource('/foo1/bar1'),
+        provider.getResource('/foo2')
+      ]
+    });
+    // Restoring file1 should yield a package URI for pkg2, since pkg2's match
+    // for the file path (/foo1/bar1) is longer than pkg1's match (/foo1).
+    Source source1 = _createFileSource(file1);
+    Uri uri1 = resolver.restoreAbsolute(source1);
+    expect(uri1.toString(), 'package:pkg2/lib.dart');
+    // Restoring file2 should yield a package URI for pkg1, since pkg1's match
+    // for the file path (/foo2/bar2) is longer than pkg2's match (/foo2).
+    Source source2 = _createFileSource(file2);
+    Uri uri2 = resolver.restoreAbsolute(source2);
+    expect(uri2.toString(), 'package:pkg1/lib.dart');
+  }
+
+  Source _createFileSource(String path) {
+    return new NonExistingSource(path, toUri(path), UriKind.FILE_URI);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/source/path_filter_test.dart b/mojo/public/dart/third_party/analyzer/test/source/path_filter_test.dart
new file mode 100644
index 0000000..a7e58fb
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/source/path_filter_test.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.source.path_filter;
+
+import 'package:analyzer/source/path_filter.dart';
+import 'package:path/path.dart';
+import 'package:unittest/unittest.dart';
+
+import '../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  String root(String path) => context.absolute(context.normalize(path));
+  group('PathFilterTest', () {
+    setUp(() {});
+    tearDown(() {});
+    test('test_ignoreEverything', () {
+      var filter = new PathFilter(root('/'), ['*'], context);
+      expect(filter.ignored('a'), isTrue);
+    });
+    test('test_ignoreFile', () {
+      var filter = new PathFilter(root('/'), ['apple'], context);
+      expect(filter.ignored('apple'), isTrue);
+      expect(filter.ignored('banana'), isFalse);
+    });
+    test('test_ignoreMultipleFiles', () {
+      var filter = new PathFilter(root('/'), ['apple', 'banana'], context);
+      expect(filter.ignored('apple'), isTrue);
+      expect(filter.ignored('banana'), isTrue);
+    });
+    test('test_ignoreSubDir', () {
+      var filter = new PathFilter(root('/'), ['apple/*'], context);
+      expect(filter.ignored('apple/banana'), isTrue);
+      expect(filter.ignored('apple/banana/cantaloupe'), isFalse);
+    });
+    test('test_ignoreTree', () {
+      var filter = new PathFilter(root('/'), ['apple/**'], context);
+      expect(filter.ignored('apple/banana'), isTrue);
+      expect(filter.ignored('apple/banana/cantaloupe'), isTrue);
+    });
+    test('test_ignoreSdkExt', () {
+      var filter = new PathFilter(root('/'), ['sdk_ext/**'], context);
+      expect(filter.ignored('sdk_ext/entry.dart'), isTrue);
+      expect(filter.ignored('sdk_ext/lib/src/part.dart'), isTrue);
+    });
+    test('test_outsideRoot', () {
+      var filter =
+          new PathFilter(root('/workspace/dart/sdk'), ['sdk_ext/**'], context);
+      expect(filter.ignored('/'), isTrue);
+      expect(filter.ignored('/workspace'), isTrue);
+      expect(filter.ignored('/workspace/dart'), isTrue);
+      expect(filter.ignored('/workspace/dart/sdk'), isFalse);
+      expect(filter.ignored('/workspace/dart/../dart/sdk'), isFalse);
+    });
+    test('test_relativePaths', () {
+      var filter =
+          new PathFilter(root('/workspace/dart/sdk'), ['sdk_ext/**'], context);
+      expect(filter.ignored('../apple'), isTrue);
+      expect(filter.ignored('../sdk/main.dart'), isFalse);
+      expect(filter.ignored('../sdk/sdk_ext/entry.dart'), isTrue);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/source/sdk_ext_test.dart b/mojo/public/dart/third_party/analyzer/test/source/sdk_ext_test.dart
new file mode 100644
index 0000000..01416af
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/source/sdk_ext_test.dart
@@ -0,0 +1,86 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.source.sdk_ext;
+
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/source/sdk_ext.dart';
+import 'package:unittest/unittest.dart';
+
+import '../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  group('SdkExtUriResolverTest', () {
+    setUp(() {
+      buildResourceProvider();
+    });
+    tearDown(() {
+      clearResourceProvider();
+    });
+    test('test_NullPackageMap', () {
+      var resolver = new SdkExtUriResolver(null);
+      expect(resolver.length, equals(0));
+    });
+    test('test_NoSdkExtPackageMap', () {
+      var resolver = new SdkExtUriResolver({
+        'fox': [resourceProvider.getResource('/empty')]
+      });
+      expect(resolver.length, equals(0));
+    });
+    test('test_SdkExtPackageMap', () {
+      var resolver = new SdkExtUriResolver({
+        'fox': [resourceProvider.getResource('/tmp')]
+      });
+      // We have four mappings.
+      expect(resolver.length, equals(4));
+      // Check that they map to the correct paths.
+      expect(resolver['dart:fox'], equals("/tmp/slippy.dart"));
+      expect(resolver['dart:bear'], equals("/tmp/grizzly.dart"));
+      expect(resolver['dart:relative'], equals("/relative.dart"));
+      expect(resolver['dart:deep'], equals("/tmp/deep/directory/file.dart"));
+    });
+    test('test_BadJSON', () {
+      var resolver = new SdkExtUriResolver(null);
+      resolver.addSdkExt(r'''{{{,{{}}},}}''', null);
+      expect(resolver.length, equals(0));
+    });
+    test('test_restoreAbsolute', () {
+      var resolver = new SdkExtUriResolver({
+        'fox': [resourceProvider.getResource('/tmp')]
+      });
+      var source = resolver.resolveAbsolute(Uri.parse('dart:fox'));
+      expect(source, isNotNull);
+      // Restore source's uri.
+      var restoreUri = resolver.restoreAbsolute(source);
+      expect(restoreUri, isNotNull);
+      // Verify that it is 'dart:fox'.
+      expect(restoreUri.toString(), equals('dart:fox'));
+      expect(restoreUri.scheme, equals('dart'));
+      expect(restoreUri.path, equals('fox'));
+    });
+  });
+}
+
+MemoryResourceProvider resourceProvider;
+
+buildResourceProvider() {
+  resourceProvider = new MemoryResourceProvider();
+  resourceProvider.newFolder('/empty');
+  resourceProvider.newFolder('/tmp');
+  resourceProvider.newFile(
+      '/tmp/_sdkext',
+      r'''
+  {
+    "dart:fox": "slippy.dart",
+    "dart:bear": "grizzly.dart",
+    "dart:relative": "../relative.dart",
+    "dart:deep": "deep/directory/file.dart",
+    "fart:loudly": "nomatter.dart"
+  }''');
+}
+
+clearResourceProvider() {
+  resourceProvider = null;
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/source/test_all.dart b/mojo/public/dart/third_party/analyzer/test/source/test_all.dart
new file mode 100644
index 0000000..6930bce
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/source/test_all.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.source;
+
+import 'package:unittest/unittest.dart';
+
+import '../utils.dart';
+import 'analysis_options_provider_test.dart' as analysis_options_provider_test;
+import 'package_map_provider_test.dart' as package_map_provider_test;
+import 'package_map_resolver_test.dart' as package_map_resolver_test;
+import 'path_filter_test.dart' as path_filter_test;
+import 'sdk_ext_test.dart' as sdk_ext_test;
+
+/// Utility for manually running all tests.
+main() {
+  initializeTestEnvironment();
+  group('source', () {
+    analysis_options_provider_test.main();
+    package_map_provider_test.main();
+    package_map_resolver_test.main();
+    sdk_ext_test.main();
+    path_filter_test.main();
+  });
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/context/abstract_context.dart b/mojo/public/dart/third_party/analyzer/test/src/context/abstract_context.dart
new file mode 100644
index 0000000..87f3b21
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/context/abstract_context.dart
@@ -0,0 +1,120 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.task.abstract_context_test;
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/context/cache.dart';
+import 'package:analyzer/src/context/context.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart'
+    hide AnalysisCache, AnalysisContextImpl, AnalysisTask;
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/task/driver.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:unittest/unittest.dart';
+
+import 'mock_sdk.dart';
+
+class AbstractContextTest {
+  MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
+
+  DartSdk sdk = new MockSdk();
+  SourceFactory sourceFactory;
+  AnalysisContextImpl context;
+  AnalysisCache analysisCache;
+  AnalysisDriver analysisDriver;
+
+  AnalysisTask task;
+  Map<ResultDescriptor<dynamic>, dynamic> oldOutputs;
+  Map<ResultDescriptor<dynamic>, dynamic> outputs;
+
+  Source addSource(String path, String contents) {
+    Source source = newSource(path, contents);
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(source);
+    context.applyChanges(changeSet);
+    return source;
+  }
+
+  /**
+   * Assert that the given [elements] has the same number of items as the number
+   * of specified [names], and that for each specified name, a corresponding
+   * element can be found in the given collection with that name.
+   */
+  void assertNamedElements(List<Element> elements, List<String> names) {
+    for (String elemName in names) {
+      bool found = false;
+      for (Element elem in elements) {
+        if (elem.name == elemName) {
+          found = true;
+          break;
+        }
+      }
+      if (!found) {
+        StringBuffer buffer = new StringBuffer();
+        buffer.write("Expected element named: ");
+        buffer.write(elemName);
+        buffer.write("\n  but found: ");
+        for (Element elem in elements) {
+          buffer.write(elem.name);
+          buffer.write(", ");
+        }
+        fail(buffer.toString());
+      }
+    }
+    expect(elements, hasLength(names.length));
+  }
+
+  /**
+   * Compute the given [result] for the given [target].
+   */
+  void computeResult(AnalysisTarget target, ResultDescriptor result) {
+    oldOutputs = outputs;
+    task = analysisDriver.computeResult(target, result);
+    expect(task, isNotNull);
+    expect(task.caughtException, isNull);
+    outputs = task.outputs;
+  }
+
+  AnalysisContextImpl createAnalysisContext() {
+    return new AnalysisContextImpl();
+  }
+
+  Source newSource(String path, [String content = '']) {
+    File file = resourceProvider.newFile(path, content);
+    return file.createSource();
+  }
+
+  List<Source> newSources(Map<String, String> sourceMap) {
+    List<Source> sources = <Source>[];
+    sourceMap.forEach((String path, String content) {
+      Source source = newSource(path, content);
+      sources.add(source);
+    });
+    return sources;
+  }
+
+  void prepareAnalysisContext([AnalysisOptions options]) {
+    sourceFactory = new SourceFactory(<UriResolver>[
+      new DartUriResolver(sdk),
+      new ResourceUriResolver(resourceProvider)
+    ]);
+    context = createAnalysisContext();
+    if (options != null) {
+      context.analysisOptions = options;
+    }
+    context.sourceFactory = sourceFactory;
+    analysisCache = context.analysisCache;
+    analysisDriver = context.driver;
+  }
+
+  void setUp() {
+    prepareAnalysisContext();
+  }
+
+  void tearDown() {}
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/context/cache_test.dart b/mojo/public/dart/third_party/analyzer/test/src/context/cache_test.dart
new file mode 100644
index 0000000..b9f3608
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/context/cache_test.dart
@@ -0,0 +1,1063 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.task.driver_test;
+
+import 'package:analyzer/src/context/cache.dart';
+import 'package:analyzer/src/generated/engine.dart'
+    show
+        AnalysisContext,
+        CacheState,
+        InternalAnalysisContext,
+        RetentionPriority;
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/sdk_io.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/utilities_collection.dart';
+import 'package:analyzer/src/task/model.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:typed_mock/typed_mock.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../generated/test_support.dart';
+import '../../reflective_tests.dart';
+import '../../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(AnalysisCacheTest);
+  runReflectiveTests(CacheEntryTest);
+  runReflectiveTests(CacheFlushManagerTest);
+  runReflectiveTests(SdkCachePartitionTest);
+  runReflectiveTests(UniversalCachePartitionTest);
+  runReflectiveTests(ResultDataTest);
+}
+
+AnalysisCache createCache(
+    {AnalysisContext context,
+    RetentionPriority policy: RetentionPriority.LOW}) {
+  CachePartition partition = new UniversalCachePartition(context);
+  return new AnalysisCache(<CachePartition>[partition]);
+}
+
+class AbstractCacheTest {
+  InternalAnalysisContext context;
+  AnalysisCache cache;
+
+  void setUp() {
+    context = new _InternalAnalysisContextMock();
+    when(context.priorityTargets).thenReturn([]);
+    cache = createCache(context: context);
+    when(context.analysisCache).thenReturn(cache);
+  }
+}
+
+@reflectiveTest
+class AnalysisCacheTest extends AbstractCacheTest {
+  void test_creation() {
+    expect(cache, isNotNull);
+  }
+
+  void test_get() {
+    AnalysisTarget target = new TestSource();
+    expect(cache.get(target), isNull);
+  }
+
+  void test_getContextFor() {
+    AnalysisTarget target = new TestSource();
+    expect(cache.getContextFor(target), context);
+  }
+
+  void test_getSourcesWithFullName() {
+    String filePath = '/foo/lib/file.dart';
+    // no sources
+    expect(cache.getSourcesWithFullName(filePath), isEmpty);
+    // add source1
+    TestSourceWithUri source1 =
+        new TestSourceWithUri(filePath, Uri.parse('file://$filePath'));
+    cache.put(new CacheEntry(source1));
+    expect(cache.getSourcesWithFullName(filePath), unorderedEquals([source1]));
+    // add source2
+    TestSourceWithUri source2 =
+        new TestSourceWithUri(filePath, Uri.parse('package:foo/file.dart'));
+    cache.put(new CacheEntry(source2));
+    expect(cache.getSourcesWithFullName(filePath),
+        unorderedEquals([source1, source2]));
+    // remove source1
+    cache.remove(source1);
+    expect(cache.getSourcesWithFullName(filePath), unorderedEquals([source2]));
+    // remove source2
+    cache.remove(source2);
+    expect(cache.getSourcesWithFullName(filePath), isEmpty);
+    // ignored
+    cache.remove(source1);
+    cache.remove(source2);
+    expect(cache.getSourcesWithFullName(filePath), isEmpty);
+  }
+
+  void test_getState_hasEntry_flushed() {
+    ResultDescriptor result = new ResultDescriptor('result', -1);
+    AnalysisTarget target = new TestSource();
+    CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
+    entry.setState(result, CacheState.FLUSHED);
+    expect(cache.getState(target, result), CacheState.FLUSHED);
+  }
+
+  void test_getState_hasEntry_valid() {
+    ResultDescriptor result = new ResultDescriptor('result', -1);
+    AnalysisTarget target = new TestSource();
+    CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
+    entry.setValue(result, '', []);
+    expect(cache.getState(target, result), CacheState.VALID);
+  }
+
+  void test_getState_noEntry() {
+    ResultDescriptor result = new ResultDescriptor('result', -1);
+    AnalysisTarget target = new TestSource();
+    expect(cache.getState(target, result), CacheState.INVALID);
+  }
+
+  void test_getValue_hasEntry_valid() {
+    ResultDescriptor result = new ResultDescriptor('result', -1);
+    AnalysisTarget target = new TestSource();
+    CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
+    entry.setValue(result, 111, []);
+    expect(cache.getValue(target, result), 111);
+  }
+
+  void test_getValue_noEntry() {
+    ResultDescriptor result = new ResultDescriptor('result', -1);
+    AnalysisTarget target = new TestSource();
+    expect(cache.getValue(target, result), -1);
+  }
+
+  void test_iterator() {
+    AnalysisTarget target = new TestSource();
+    CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
+    MapIterator<AnalysisTarget, CacheEntry> iterator = cache.iterator();
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.key, same(target));
+    expect(iterator.value, same(entry));
+    expect(iterator.moveNext(), isFalse);
+  }
+
+  void test_put() {
+    AnalysisTarget target = new TestSource();
+    CacheEntry entry = new CacheEntry(target);
+    expect(cache.get(target), isNull);
+    cache.put(entry);
+    expect(cache.get(target), entry);
+  }
+
+  void test_remove() {
+    AnalysisTarget target1 = new TestSource('/a.dart');
+    AnalysisTarget target2 = new TestSource('/b.dart');
+    AnalysisTarget target3 = new TestSource('/c.dart');
+    CacheEntry entry1 = new CacheEntry(target1);
+    CacheEntry entry2 = new CacheEntry(target2);
+    CacheEntry entry3 = new CacheEntry(target3);
+    cache.put(entry1);
+    cache.put(entry2);
+    cache.put(entry3);
+    ResultDescriptor result1 = new ResultDescriptor('result1', -1);
+    ResultDescriptor result2 = new ResultDescriptor('result2', -2);
+    ResultDescriptor result3 = new ResultDescriptor('result3', -3);
+    // set results, all of them are VALID
+    entry1.setValue(result1, 111, TargetedResult.EMPTY_LIST);
+    entry2.setValue(result2, 222, [new TargetedResult(target1, result1)]);
+    entry3.setValue(result3, 333, []);
+    expect(entry1.getState(result1), CacheState.VALID);
+    expect(entry2.getState(result2), CacheState.VALID);
+    expect(entry3.getState(result3), CacheState.VALID);
+    expect(entry1.getValue(result1), 111);
+    expect(entry2.getValue(result2), 222);
+    expect(entry3.getValue(result3), 333);
+    // remove entry1, invalidate result2 and remove empty entry2
+    expect(cache.remove(target1), entry1);
+    expect(cache.get(target1), isNull);
+    expect(cache.get(target2), isNull);
+    expect(cache.get(target3), entry3);
+    expect(entry3.getState(result3), CacheState.VALID);
+  }
+
+  void test_remove_invalidateResults_sameTarget() {
+    AnalysisTarget target = new TestSource('/a.dart');
+    CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
+    ResultDescriptor result1 = new ResultDescriptor('result1', -1);
+    ResultDescriptor result2 = new ResultDescriptor('result2', -2);
+    // set results, all of them are VALID
+    entry.setValue(result1, 111, TargetedResult.EMPTY_LIST);
+    entry.setValue(result2, 222, [new TargetedResult(target, result1)]);
+    expect(entry.getState(result1), CacheState.VALID);
+    expect(entry.getState(result2), CacheState.VALID);
+    expect(entry.getValue(result1), 111);
+    expect(entry.getValue(result2), 222);
+    // remove target, invalidate result2
+    expect(cache.remove(target), entry);
+    expect(cache.get(target), isNull);
+    expect(entry.getState(result2), CacheState.INVALID);
+  }
+
+  void test_size() {
+    int size = 4;
+    for (int i = 0; i < size; i++) {
+      AnalysisTarget target = new TestSource("/test$i.dart");
+      cache.put(new CacheEntry(target));
+    }
+    expect(cache.size(), size);
+  }
+
+  void test_sources() {
+    AnalysisTarget source1 = new TestSource('1.dart');
+    AnalysisTarget source2 = new TestSource('2.dart');
+    AnalysisTarget target1 = new _TestAnalysisTarget();
+    // no entries
+    expect(cache.sources, isEmpty);
+    // add source1
+    cache.put(new CacheEntry(source1));
+    expect(cache.sources, unorderedEquals([source1]));
+    // add target1
+    cache.put(new CacheEntry(target1));
+    expect(cache.sources, unorderedEquals([source1]));
+    // add source2
+    cache.put(new CacheEntry(source2));
+    expect(cache.sources, unorderedEquals([source1, source2]));
+    // remove source1
+    cache.remove(source1);
+    expect(cache.sources, unorderedEquals([source2]));
+    // remove source2
+    cache.remove(source2);
+    expect(cache.sources, isEmpty);
+  }
+}
+
+@reflectiveTest
+class CacheEntryTest extends AbstractCacheTest {
+  test_dispose() {
+    ResultDescriptor descriptor1 = new ResultDescriptor('result1', -1);
+    ResultDescriptor descriptor2 = new ResultDescriptor('result2', -2);
+    AnalysisTarget target1 = new TestSource('1.dart');
+    AnalysisTarget target2 = new TestSource('2.dart');
+    TargetedResult result1 = new TargetedResult(target1, descriptor1);
+    TargetedResult result2 = new TargetedResult(target2, descriptor2);
+    CacheEntry entry1 = new CacheEntry(target1);
+    CacheEntry entry2 = new CacheEntry(target2);
+    cache.put(entry1);
+    cache.put(entry2);
+    entry1.setValue(descriptor1, 1, TargetedResult.EMPTY_LIST);
+    entry2.setValue(descriptor2, 2, <TargetedResult>[result1]);
+    // target2 is listed as dependent in target1
+    expect(
+        entry1.getResultData(descriptor1).dependentResults, contains(result2));
+    // dispose entry2, result2 is removed from result1
+    entry2.dispose();
+    expect(entry1.getResultData(descriptor1).dependentResults, isEmpty);
+  }
+
+  test_explicitlyAdded() {
+    AnalysisTarget target = new TestSource();
+    CacheEntry entry = new CacheEntry(target);
+    expect(entry.explicitlyAdded, false);
+    entry.explicitlyAdded = true;
+    expect(entry.explicitlyAdded, true);
+  }
+
+  test_fixExceptionState_error_exception() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('test', null);
+    CaughtException exception = new CaughtException(null, null);
+    CacheEntry entry = new CacheEntry(target);
+    entry.setErrorState(exception, <ResultDescriptor>[result]);
+    entry.fixExceptionState();
+    expect(entry.getState(result), CacheState.ERROR);
+    expect(entry.exception, exception);
+  }
+
+  test_fixExceptionState_noError_exception() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('test', null);
+    CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
+    // set one result to ERROR
+    CaughtException exception = new CaughtException(null, null);
+    entry.setErrorState(exception, <ResultDescriptor>[result]);
+    // set the same result to VALID
+    entry.setValue(result, 1, TargetedResult.EMPTY_LIST);
+    // fix the exception state
+    entry.fixExceptionState();
+    expect(entry.exception, isNull);
+  }
+
+  test_fixExceptionState_noError_noException() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('test', null);
+    CacheEntry entry = new CacheEntry(target);
+    entry.fixExceptionState();
+    expect(entry.getState(result), CacheState.INVALID);
+    expect(entry.exception, isNull);
+  }
+
+  test_getState() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('test', null);
+    CacheEntry entry = new CacheEntry(target);
+    expect(entry.getState(result), CacheState.INVALID);
+  }
+
+  test_getValue_default() {
+    AnalysisTarget target = new TestSource();
+    String defaultValue = 'value';
+    ResultDescriptor result = new ResultDescriptor('test', defaultValue);
+    CacheEntry entry = new CacheEntry(target);
+    expect(entry.getValue(result), defaultValue);
+  }
+
+  test_getValue_flushResults() {
+    ResultCachingPolicy cachingPolicy = new SimpleResultCachingPolicy(2, 2);
+    ResultDescriptor descriptor1 =
+        new ResultDescriptor('result1', null, cachingPolicy: cachingPolicy);
+    ResultDescriptor descriptor2 =
+        new ResultDescriptor('result2', null, cachingPolicy: cachingPolicy);
+    ResultDescriptor descriptor3 =
+        new ResultDescriptor('result3', null, cachingPolicy: cachingPolicy);
+    AnalysisTarget target = new TestSource();
+    CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
+    {
+      entry.setValue(descriptor1, 1, TargetedResult.EMPTY_LIST);
+      expect(entry.getState(descriptor1), CacheState.VALID);
+    }
+    {
+      entry.setValue(descriptor2, 2, TargetedResult.EMPTY_LIST);
+      expect(entry.getState(descriptor1), CacheState.VALID);
+      expect(entry.getState(descriptor2), CacheState.VALID);
+    }
+    // get descriptor1, so that descriptor2 will be flushed
+    entry.getValue(descriptor1);
+    {
+      entry.setValue(descriptor3, 3, TargetedResult.EMPTY_LIST);
+      expect(entry.getState(descriptor1), CacheState.VALID);
+      expect(entry.getState(descriptor2), CacheState.FLUSHED);
+      expect(entry.getState(descriptor3), CacheState.VALID);
+    }
+  }
+
+  test_hasErrorState_false() {
+    AnalysisTarget target = new TestSource();
+    CacheEntry entry = new CacheEntry(target);
+    expect(entry.hasErrorState(), false);
+  }
+
+  test_hasErrorState_true() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('test', null);
+    CaughtException exception = new CaughtException(null, null);
+    CacheEntry entry = new CacheEntry(target);
+    entry.setErrorState(exception, <ResultDescriptor>[result]);
+    expect(entry.hasErrorState(), true);
+  }
+
+  test_invalidateAllInformation() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('test', null);
+    CacheEntry entry = new CacheEntry(target);
+    entry.setValue(result, 'value', TargetedResult.EMPTY_LIST);
+    entry.invalidateAllInformation();
+    expect(entry.getState(result), CacheState.INVALID);
+    expect(entry.getValue(result), isNull);
+  }
+
+  test_setErrorState() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result1 = new ResultDescriptor('res1', 1);
+    ResultDescriptor result2 = new ResultDescriptor('res2', 2);
+    ResultDescriptor result3 = new ResultDescriptor('res3', 3);
+    // prepare some good state
+    CacheEntry entry = new CacheEntry(target);
+    entry.setValue(result1, 10, TargetedResult.EMPTY_LIST);
+    entry.setValue(result2, 20, TargetedResult.EMPTY_LIST);
+    entry.setValue(result3, 30, TargetedResult.EMPTY_LIST);
+    // set error state
+    CaughtException exception = new CaughtException(null, null);
+    entry.setErrorState(exception, <ResultDescriptor>[result1, result2]);
+    // verify
+    expect(entry.exception, exception);
+    expect(entry.getState(result1), CacheState.ERROR);
+    expect(entry.getState(result2), CacheState.ERROR);
+    expect(entry.getState(result3), CacheState.VALID);
+    expect(entry.getValue(result1), 1);
+    expect(entry.getValue(result2), 2);
+    expect(entry.getValue(result3), 30);
+  }
+
+  test_setErrorState_invalidateDependent() {
+    AnalysisTarget target1 = new TestSource('/a.dart');
+    AnalysisTarget target2 = new TestSource('/b.dart');
+    CacheEntry entry1 = new CacheEntry(target1);
+    CacheEntry entry2 = new CacheEntry(target2);
+    cache.put(entry1);
+    cache.put(entry2);
+    ResultDescriptor result1 = new ResultDescriptor('result1', -1);
+    ResultDescriptor result2 = new ResultDescriptor('result2', -2);
+    ResultDescriptor result3 = new ResultDescriptor('result3', -3);
+    ResultDescriptor result4 = new ResultDescriptor('result4', -4);
+    // set results, all of them are VALID
+    entry1.setValue(result1, 111, TargetedResult.EMPTY_LIST);
+    entry2.setValue(result2, 222, [new TargetedResult(target1, result1)]);
+    entry2.setValue(result3, 333, [new TargetedResult(target2, result2)]);
+    entry2.setValue(result4, 444, []);
+    expect(entry1.getState(result1), CacheState.VALID);
+    expect(entry2.getState(result2), CacheState.VALID);
+    expect(entry2.getState(result3), CacheState.VALID);
+    expect(entry2.getState(result4), CacheState.VALID);
+    expect(entry1.getValue(result1), 111);
+    expect(entry2.getValue(result2), 222);
+    expect(entry2.getValue(result3), 333);
+    expect(entry2.getValue(result4), 444);
+    // set error state
+    CaughtException exception = new CaughtException(null, null);
+    entry1.setErrorState(exception, <ResultDescriptor>[result1]);
+    // result2 and result3 are invalidated, result4 is intact
+    expect(entry1.getState(result1), CacheState.ERROR);
+    expect(entry2.getState(result2), CacheState.ERROR);
+    expect(entry2.getState(result3), CacheState.ERROR);
+    expect(entry2.getState(result4), CacheState.VALID);
+    expect(entry1.getValue(result1), -1);
+    expect(entry2.getValue(result2), -2);
+    expect(entry2.getValue(result3), -3);
+    expect(entry2.getValue(result4), 444);
+    expect(entry1.exception, exception);
+    expect(entry2.exception, exception);
+  }
+
+  test_setErrorState_noDescriptors() {
+    AnalysisTarget target = new TestSource();
+    CaughtException exception = new CaughtException(null, null);
+    CacheEntry entry = new CacheEntry(target);
+    expect(() {
+      entry.setErrorState(exception, <ResultDescriptor>[]);
+    }, throwsArgumentError);
+  }
+
+  test_setErrorState_noException() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('test', null);
+    CacheEntry entry = new CacheEntry(target);
+    expect(() {
+      entry.setErrorState(null, <ResultDescriptor>[result]);
+    }, throwsArgumentError);
+  }
+
+  test_setErrorState_nullDescriptors() {
+    AnalysisTarget target = new TestSource();
+    CaughtException exception = new CaughtException(null, null);
+    CacheEntry entry = new CacheEntry(target);
+    expect(() {
+      entry.setErrorState(exception, null);
+    }, throwsArgumentError);
+  }
+
+  test_setState_error() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('test', null);
+    CacheEntry entry = new CacheEntry(target);
+    entry.setValue(result, 42, TargetedResult.EMPTY_LIST);
+    // an invalid state change
+    expect(() {
+      entry.setState(result, CacheState.ERROR);
+    }, throwsArgumentError);
+    // no changes
+    expect(entry.getState(result), CacheState.VALID);
+    expect(entry.getValue(result), 42);
+  }
+
+  test_setState_flushed() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('test', 1);
+    CacheEntry entry = new CacheEntry(target);
+    // set VALID
+    entry.setValue(result, 10, TargetedResult.EMPTY_LIST);
+    expect(entry.getState(result), CacheState.VALID);
+    expect(entry.getValue(result), 10);
+    // set FLUSHED
+    entry.setState(result, CacheState.FLUSHED);
+    expect(entry.getState(result), CacheState.FLUSHED);
+    expect(entry.getValue(result), 1);
+  }
+
+  test_setState_inProcess() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('test', 1);
+    CacheEntry entry = new CacheEntry(target);
+    // set VALID
+    entry.setValue(result, 10, TargetedResult.EMPTY_LIST);
+    expect(entry.getState(result), CacheState.VALID);
+    expect(entry.getValue(result), 10);
+    // set IN_PROCESS
+    entry.setState(result, CacheState.IN_PROCESS);
+    expect(entry.getState(result), CacheState.IN_PROCESS);
+    expect(entry.getValue(result), 10);
+  }
+
+  test_setState_invalid() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('test', 1);
+    CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
+    // set VALID
+    entry.setValue(result, 10, TargetedResult.EMPTY_LIST);
+    expect(entry.getState(result), CacheState.VALID);
+    expect(entry.getValue(result), 10);
+    // listen, expect "result" invalidation event
+    int numberOfEvents = 0;
+    cache.onResultInvalidated.listen((event) {
+      numberOfEvents++;
+      expect(event.entry, same(entry));
+      expect(event.descriptor, same(result));
+    });
+    // set INVALID
+    entry.setState(result, CacheState.INVALID);
+    expect(entry.getState(result), CacheState.INVALID);
+    expect(entry.getValue(result), 1);
+    expect(numberOfEvents, 1);
+  }
+
+  test_setState_invalid_dependencyCycle() {
+    AnalysisTarget target1 = new TestSource('/a.dart');
+    AnalysisTarget target2 = new TestSource('/b.dart');
+    CacheEntry entry1 = new CacheEntry(target1);
+    CacheEntry entry2 = new CacheEntry(target2);
+    cache.put(entry1);
+    cache.put(entry2);
+    ResultDescriptor result = new ResultDescriptor('result', -1);
+    // Set each result as VALID with a dependency on on the other.
+    entry1.setValue(result, 100, [new TargetedResult(target2, result)]);
+    entry2.setValue(result, 200, [new TargetedResult(target1, result)]);
+    expect(entry1.getState(result), CacheState.VALID);
+    expect(entry2.getState(result), CacheState.VALID);
+    // Listen, expect entry1.result and entry2.result invalidation events.
+    int numberOfEvents = 0;
+    bool wasEntry1 = false;
+    bool wasEntry2 = false;
+    cache.onResultInvalidated.listen((event) {
+      numberOfEvents++;
+      if (event.entry == entry1) wasEntry1 = true;
+      if (event.entry == entry2) wasEntry2 = true;
+      expect(event.descriptor, same(result));
+    });
+    // Invalidate entry1.result; this should cause entry2 to be also
+    // cleared without going into an infinite regress.
+    entry1.setState(result, CacheState.INVALID);
+    expect(cache.get(target1), isNull);
+    expect(cache.get(target2), isNull);
+    expect(numberOfEvents, 2);
+    expect(wasEntry1, isTrue);
+    expect(wasEntry2, isTrue);
+  }
+
+  test_setState_invalid_invalidateDependent() {
+    AnalysisTarget target = new TestSource();
+    CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
+    ResultDescriptor result1 = new ResultDescriptor('result1', -1);
+    ResultDescriptor result2 = new ResultDescriptor('result2', -2);
+    ResultDescriptor result3 = new ResultDescriptor('result3', -3);
+    ResultDescriptor result4 = new ResultDescriptor('result4', -4);
+    // set results, all of them are VALID
+    entry.setValue(result1, 111, TargetedResult.EMPTY_LIST);
+    entry.setValue(result2, 222, [new TargetedResult(target, result1)]);
+    entry.setValue(result3, 333, [new TargetedResult(target, result2)]);
+    entry.setValue(result4, 444, []);
+    expect(entry.getState(result1), CacheState.VALID);
+    expect(entry.getState(result2), CacheState.VALID);
+    expect(entry.getState(result3), CacheState.VALID);
+    expect(entry.getState(result4), CacheState.VALID);
+    expect(entry.getValue(result1), 111);
+    expect(entry.getValue(result2), 222);
+    expect(entry.getValue(result3), 333);
+    expect(entry.getValue(result4), 444);
+    // invalidate result1, invalidates result2 and result3, result4 is intact
+    entry.setState(result1, CacheState.INVALID);
+    expect(entry.getState(result1), CacheState.INVALID);
+    expect(entry.getState(result2), CacheState.INVALID);
+    expect(entry.getState(result3), CacheState.INVALID);
+    expect(entry.getState(result4), CacheState.VALID);
+    expect(entry.getValue(result1), -1);
+    expect(entry.getValue(result2), -2);
+    expect(entry.getValue(result3), -3);
+    expect(entry.getValue(result4), 444);
+    // result4 is still valid, so the entry is still in the cache
+    expect(cache.get(target), entry);
+  }
+
+  test_setState_invalid_removeEmptyEntry() {
+    AnalysisTarget target1 = new TestSource('/a.dart');
+    AnalysisTarget target2 = new TestSource('/b.dart');
+    CacheEntry entry1 = new CacheEntry(target1);
+    CacheEntry entry2 = new CacheEntry(target2);
+    cache.put(entry1);
+    cache.put(entry2);
+    ResultDescriptor result1 = new ResultDescriptor('result1', -1);
+    ResultDescriptor result2 = new ResultDescriptor('result2', -2);
+    ResultDescriptor result3 = new ResultDescriptor('result3', -3);
+    // set results, all of them are VALID
+    entry1.setValue(result1, 111, TargetedResult.EMPTY_LIST);
+    entry2.setValue(result2, 222, [new TargetedResult(target1, result1)]);
+    entry2.setValue(result3, 333, [new TargetedResult(target2, result2)]);
+    expect(entry1.getState(result1), CacheState.VALID);
+    expect(entry2.getState(result2), CacheState.VALID);
+    expect(entry2.getState(result3), CacheState.VALID);
+    expect(entry1.getValue(result1), 111);
+    expect(entry2.getValue(result2), 222);
+    expect(entry2.getValue(result3), 333);
+    // invalidate result1, remove entry1 & entry2
+    entry1.setState(result1, CacheState.INVALID);
+    expect(cache.get(target1), isNull);
+    expect(cache.get(target2), isNull);
+  }
+
+  test_setState_valid() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('test', null);
+    CacheEntry entry = new CacheEntry(target);
+    expect(() => entry.setState(result, CacheState.VALID), throwsArgumentError);
+  }
+
+  test_setValue() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('test', null);
+    String value = 'value';
+    CacheEntry entry = new CacheEntry(target);
+    entry.setValue(result, value, TargetedResult.EMPTY_LIST);
+    expect(entry.getState(result), CacheState.VALID);
+    expect(entry.getValue(result), value);
+  }
+
+  test_setValue_flushResults() {
+    ResultCachingPolicy cachingPolicy = new SimpleResultCachingPolicy(2, 2);
+    ResultDescriptor descriptor1 =
+        new ResultDescriptor('result1', null, cachingPolicy: cachingPolicy);
+    ResultDescriptor descriptor2 =
+        new ResultDescriptor('result2', null, cachingPolicy: cachingPolicy);
+    ResultDescriptor descriptor3 =
+        new ResultDescriptor('result3', null, cachingPolicy: cachingPolicy);
+    AnalysisTarget target = new TestSource();
+    CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
+    {
+      entry.setValue(descriptor1, 1, TargetedResult.EMPTY_LIST);
+      expect(entry.getState(descriptor1), CacheState.VALID);
+    }
+    {
+      entry.setValue(descriptor2, 2, TargetedResult.EMPTY_LIST);
+      expect(entry.getState(descriptor1), CacheState.VALID);
+      expect(entry.getState(descriptor2), CacheState.VALID);
+    }
+    {
+      entry.setValue(descriptor3, 3, TargetedResult.EMPTY_LIST);
+      expect(entry.getState(descriptor1), CacheState.FLUSHED);
+      expect(entry.getState(descriptor2), CacheState.VALID);
+      expect(entry.getState(descriptor3), CacheState.VALID);
+    }
+  }
+
+  test_setValue_keepDependent() {
+    AnalysisTarget target = new TestSource();
+    CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
+    ResultDescriptor result1 = new ResultDescriptor('result1', -1);
+    ResultDescriptor result2 = new ResultDescriptor('result2', -2);
+    // set results, all of them are VALID
+    entry.setValue(result1, 111, TargetedResult.EMPTY_LIST);
+    entry.setValue(result2, 222, [new TargetedResult(target, result1)]);
+    expect(entry.getState(result1), CacheState.VALID);
+    expect(entry.getState(result2), CacheState.VALID);
+    expect(entry.getValue(result1), 111);
+    expect(entry.getValue(result2), 222);
+    // set result1; result2 is intact
+    entry.setValue(result1, 1111, TargetedResult.EMPTY_LIST);
+    expect(entry.getState(result1), CacheState.VALID);
+    expect(entry.getState(result2), CacheState.VALID);
+    expect(entry.getValue(result1), 1111);
+    expect(entry.getValue(result2), 222);
+  }
+
+  test_setValueIncremental() {
+    AnalysisTarget target = new TestSource();
+    CacheEntry entry = new CacheEntry(target);
+    cache.put(entry);
+    ResultDescriptor result1 = new ResultDescriptor('result1', -1);
+    ResultDescriptor result2 = new ResultDescriptor('result2', -2);
+    ResultDescriptor result3 = new ResultDescriptor('result3', -3);
+    // set results, all of them are VALID
+    entry.setValue(result1, 111, TargetedResult.EMPTY_LIST);
+    entry.setValue(result2, 222, [new TargetedResult(target, result1)]);
+    entry.setValue(result3, 333, [new TargetedResult(target, result2)]);
+    expect(entry.getState(result1), CacheState.VALID);
+    expect(entry.getState(result2), CacheState.VALID);
+    expect(entry.getState(result3), CacheState.VALID);
+    expect(entry.getValue(result1), 111);
+    expect(entry.getValue(result2), 222);
+    expect(entry.getValue(result3), 333);
+    // replace result1, keep "dependedOn", invalidate result3
+    entry.setValueIncremental(result2, 2222);
+    expect(entry.getState(result1), CacheState.VALID);
+    expect(entry.getState(result2), CacheState.VALID);
+    expect(entry.getState(result3), CacheState.INVALID);
+    expect(entry.getValue(result1), 111);
+    expect(entry.getValue(result2), 2222);
+    expect(entry.getValue(result3), -3);
+    expect(entry.getResultData(result2).dependedOnResults,
+        unorderedEquals([new TargetedResult(target, result1)]));
+  }
+
+  test_toString_empty() {
+    AnalysisTarget target = new TestSource();
+    CacheEntry entry = new CacheEntry(target);
+    expect(entry.toString(), isNotNull);
+  }
+
+  test_toString_nonEmpty() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('test', null);
+    CacheEntry entry = new CacheEntry(target);
+    entry.setValue(result, 42, TargetedResult.EMPTY_LIST);
+    expect(entry.toString(), isNotNull);
+  }
+}
+
+@reflectiveTest
+class CacheFlushManagerTest {
+  CacheFlushManager manager = new CacheFlushManager(
+      new SimpleResultCachingPolicy(15, 3), (AnalysisTarget target) => false);
+
+  test_madeActive() {
+    manager.madeActive();
+    expect(manager.maxSize, 15);
+  }
+
+  test_madeIdle() {
+    manager.madeActive();
+    AnalysisTarget target = new TestSource();
+    // prepare TargetedResult(s)
+    List<TargetedResult> results = <TargetedResult>[];
+    for (int i = 0; i < 15; i++) {
+      ResultDescriptor descriptor = new ResultDescriptor('result$i', null);
+      results.add(new TargetedResult(target, descriptor));
+    }
+    // notify about storing TargetedResult(s)
+    for (TargetedResult result in results) {
+      manager.resultStored(result, null);
+    }
+    expect(manager.recentlyUsed, results);
+    expect(manager.currentSize, 15);
+    // make idle
+    List<TargetedResult> resultsToFlush = manager.madeIdle();
+    expect(manager.maxSize, 3);
+    expect(manager.recentlyUsed, results.skip(15 - 3));
+    expect(resultsToFlush, results.take(15 - 3));
+  }
+
+  test_new() {
+    expect(manager.maxActiveSize, 15);
+    expect(manager.maxIdleSize, 3);
+    expect(manager.maxSize, 3);
+    expect(manager.currentSize, 0);
+    expect(manager.recentlyUsed, isEmpty);
+  }
+
+  test_resultAccessed() {
+    ResultDescriptor descriptor1 = new ResultDescriptor('result1', null);
+    ResultDescriptor descriptor2 = new ResultDescriptor('result2', null);
+    ResultDescriptor descriptor3 = new ResultDescriptor('result3', null);
+    AnalysisTarget target = new TestSource();
+    TargetedResult result1 = new TargetedResult(target, descriptor1);
+    TargetedResult result2 = new TargetedResult(target, descriptor2);
+    TargetedResult result3 = new TargetedResult(target, descriptor3);
+    manager.resultStored(result1, null);
+    manager.resultStored(result2, null);
+    manager.resultStored(result3, null);
+    expect(manager.currentSize, 3);
+    expect(manager.recentlyUsed, orderedEquals([result1, result2, result3]));
+    // access result2
+    manager.resultAccessed(result2);
+    expect(manager.currentSize, 3);
+    expect(manager.recentlyUsed, orderedEquals([result1, result3, result2]));
+  }
+
+  test_resultAccessed_negativeMaxSize() {
+    manager = new CacheFlushManager(new SimpleResultCachingPolicy(-1, -1),
+        (AnalysisTarget target) => false);
+    ResultDescriptor descriptor1 = new ResultDescriptor('result1', null);
+    ResultDescriptor descriptor2 = new ResultDescriptor('result2', null);
+    AnalysisTarget target = new TestSource();
+    TargetedResult result1 = new TargetedResult(target, descriptor1);
+    TargetedResult result2 = new TargetedResult(target, descriptor2);
+    manager.resultStored(result1, null);
+    manager.resultStored(result2, null);
+    expect(manager.currentSize, 0);
+    expect(manager.recentlyUsed, isEmpty);
+    // access result2
+    manager.resultAccessed(result2);
+    expect(manager.currentSize, 0);
+    expect(manager.recentlyUsed, isEmpty);
+  }
+
+  test_resultAccessed_noSuchResult() {
+    ResultDescriptor descriptor1 = new ResultDescriptor('result1', null);
+    ResultDescriptor descriptor2 = new ResultDescriptor('result2', null);
+    ResultDescriptor descriptor3 = new ResultDescriptor('result3', null);
+    AnalysisTarget target = new TestSource();
+    TargetedResult result1 = new TargetedResult(target, descriptor1);
+    TargetedResult result2 = new TargetedResult(target, descriptor2);
+    TargetedResult result3 = new TargetedResult(target, descriptor3);
+    manager.resultStored(result1, null);
+    manager.resultStored(result2, null);
+    expect(manager.currentSize, 2);
+    expect(manager.recentlyUsed, orderedEquals([result1, result2]));
+    // access result3, no-op
+    manager.resultAccessed(result3);
+    expect(manager.currentSize, 2);
+    expect(manager.recentlyUsed, orderedEquals([result1, result2]));
+  }
+
+  test_resultStored() {
+    ResultDescriptor descriptor1 = new ResultDescriptor('result1', null);
+    ResultDescriptor descriptor2 = new ResultDescriptor('result2', null);
+    ResultDescriptor descriptor3 = new ResultDescriptor('result3', null);
+    ResultDescriptor descriptor4 = new ResultDescriptor('result4', null);
+    AnalysisTarget target = new TestSource();
+    TargetedResult result1 = new TargetedResult(target, descriptor1);
+    TargetedResult result2 = new TargetedResult(target, descriptor2);
+    TargetedResult result3 = new TargetedResult(target, descriptor3);
+    TargetedResult result4 = new TargetedResult(target, descriptor4);
+    manager.resultStored(result1, null);
+    manager.resultStored(result2, null);
+    manager.resultStored(result3, null);
+    expect(manager.currentSize, 3);
+    expect(manager.recentlyUsed, orderedEquals([result1, result2, result3]));
+    // store result2 again
+    {
+      List<TargetedResult> resultsToFlush = manager.resultStored(result2, null);
+      expect(resultsToFlush, isEmpty);
+      expect(manager.currentSize, 3);
+      expect(manager.recentlyUsed, orderedEquals([result1, result3, result2]));
+    }
+    // store result4
+    {
+      List<TargetedResult> resultsToFlush = manager.resultStored(result4, null);
+      expect(resultsToFlush, [result1]);
+      expect(manager.currentSize, 3);
+      expect(manager.recentlyUsed, orderedEquals([result3, result2, result4]));
+      expect(manager.resultSizeMap, {result3: 1, result2: 1, result4: 1});
+    }
+  }
+
+  test_resultStored_negativeMaxSize() {
+    manager = new CacheFlushManager(new SimpleResultCachingPolicy(-1, -1),
+        (AnalysisTarget target) => false);
+    ResultDescriptor descriptor1 = new ResultDescriptor('result1', null);
+    ResultDescriptor descriptor2 = new ResultDescriptor('result2', null);
+    AnalysisTarget target = new TestSource();
+    TargetedResult result1 = new TargetedResult(target, descriptor1);
+    TargetedResult result2 = new TargetedResult(target, descriptor2);
+    manager.resultStored(result1, null);
+    manager.resultStored(result2, null);
+    expect(manager.currentSize, 0);
+    expect(manager.recentlyUsed, isEmpty);
+  }
+
+  test_targetRemoved() {
+    ResultDescriptor descriptor1 = new ResultDescriptor('result1', null);
+    ResultDescriptor descriptor2 = new ResultDescriptor('result2', null);
+    ResultDescriptor descriptor3 = new ResultDescriptor('result3', null);
+    AnalysisTarget target1 = new TestSource('a.dart');
+    AnalysisTarget target2 = new TestSource('b.dart');
+    TargetedResult result1 = new TargetedResult(target1, descriptor1);
+    TargetedResult result2 = new TargetedResult(target2, descriptor2);
+    TargetedResult result3 = new TargetedResult(target1, descriptor3);
+    manager.resultStored(result1, null);
+    manager.resultStored(result2, null);
+    manager.resultStored(result3, null);
+    expect(manager.currentSize, 3);
+    expect(manager.recentlyUsed, orderedEquals([result1, result2, result3]));
+    expect(manager.resultSizeMap, {result1: 1, result2: 1, result3: 1});
+    // remove target1
+    {
+      manager.targetRemoved(target1);
+      expect(manager.currentSize, 1);
+      expect(manager.recentlyUsed, orderedEquals([result2]));
+      expect(manager.resultSizeMap, {result2: 1});
+    }
+    // remove target2
+    {
+      manager.targetRemoved(target2);
+      expect(manager.currentSize, 0);
+      expect(manager.recentlyUsed, isEmpty);
+      expect(manager.resultSizeMap, isEmpty);
+    }
+  }
+}
+
+abstract class CachePartitionTest extends EngineTestCase {
+  CachePartition createPartition();
+
+  void test_creation() {
+    expect(createPartition(), isNotNull);
+  }
+
+  void test_entrySet() {
+    CachePartition partition = createPartition();
+    AnalysisTarget target = new TestSource();
+    CacheEntry entry = new CacheEntry(target);
+    partition.put(entry);
+    Map<AnalysisTarget, CacheEntry> entryMap = partition.map;
+    expect(entryMap, hasLength(1));
+    AnalysisTarget entryKey = entryMap.keys.first;
+    expect(entryKey, target);
+    expect(entryMap[entryKey], entry);
+  }
+
+  void test_get() {
+    CachePartition partition = createPartition();
+    AnalysisTarget target = new TestSource();
+    expect(partition.get(target), isNull);
+  }
+
+  void test_put_alreadyInPartition() {
+    CachePartition partition1 = createPartition();
+    CachePartition partition2 = createPartition();
+    AnalysisTarget target = new TestSource();
+    CacheEntry entry = new CacheEntry(target);
+    partition1.put(entry);
+    expect(() => partition2.put(entry), throwsStateError);
+  }
+
+  void test_put_noFlush() {
+    CachePartition partition = createPartition();
+    AnalysisTarget target = new TestSource();
+    CacheEntry entry = new CacheEntry(target);
+    partition.put(entry);
+    expect(partition.get(target), entry);
+  }
+
+  void test_remove_absent() {
+    CachePartition partition = createPartition();
+    AnalysisTarget target = new TestSource();
+    expect(partition.get(target), isNull);
+    expect(partition.remove(target), isNull);
+    expect(partition.get(target), isNull);
+  }
+
+  void test_remove_present() {
+    CachePartition partition = createPartition();
+    AnalysisTarget target = new TestSource();
+    CacheEntry entry = new CacheEntry(target);
+    partition.put(entry);
+    expect(partition.get(target), entry);
+    expect(partition.remove(target), entry);
+    expect(partition.get(target), isNull);
+  }
+}
+
+@reflectiveTest
+class ResultDataTest extends EngineTestCase {
+  test_creation() {
+    String value = 'value';
+    ResultData data = new ResultData(new ResultDescriptor('test', value));
+    expect(data, isNotNull);
+    expect(data.state, CacheState.INVALID);
+    expect(data.value, value);
+  }
+
+  test_flush() {
+    ResultDescriptor result = new ResultDescriptor('test', -1);
+    ResultData data = new ResultData(result);
+    data.state = CacheState.VALID;
+    data.value = 123;
+    data.flush();
+    expect(data.state, CacheState.FLUSHED);
+    expect(data.value, -1);
+  }
+}
+
+@reflectiveTest
+class SdkCachePartitionTest extends CachePartitionTest {
+  CachePartition createPartition() {
+    return new SdkCachePartition(null);
+  }
+
+  void test_contains_false() {
+    CachePartition partition = createPartition();
+    AnalysisTarget target = new TestSource();
+    expect(partition.isResponsibleFor(target), isFalse);
+  }
+
+  void test_contains_true() {
+    SdkCachePartition partition = new SdkCachePartition(null);
+    SourceFactory factory = new SourceFactory(
+        [new DartUriResolver(DirectoryBasedDartSdk.defaultSdk)]);
+    AnalysisTarget target = factory.forUri("dart:core");
+    expect(partition.isResponsibleFor(target), isTrue);
+  }
+}
+
+@reflectiveTest
+class UniversalCachePartitionTest extends CachePartitionTest {
+  CachePartition createPartition() {
+    return new UniversalCachePartition(null);
+  }
+
+  void test_contains() {
+    UniversalCachePartition partition = new UniversalCachePartition(null);
+    TestSource source = new TestSource();
+    expect(partition.isResponsibleFor(source), isTrue);
+  }
+
+  test_dispose() {
+    InternalAnalysisContext context = new _InternalAnalysisContextMock();
+    CachePartition partition1 = new UniversalCachePartition(context);
+    CachePartition partition2 = new UniversalCachePartition(context);
+    AnalysisCache cache = new AnalysisCache([partition1, partition2]);
+    when(context.analysisCache).thenReturn(cache);
+    // configure
+    // prepare entries
+    ResultDescriptor descriptor1 = new ResultDescriptor('result1', -1);
+    ResultDescriptor descriptor2 = new ResultDescriptor('result2', -2);
+    AnalysisTarget target1 = new TestSource('1.dart');
+    AnalysisTarget target2 = new TestSource('2.dart');
+    TargetedResult result1 = new TargetedResult(target1, descriptor1);
+    TargetedResult result2 = new TargetedResult(target2, descriptor2);
+    CacheEntry entry1 = new CacheEntry(target1);
+    CacheEntry entry2 = new CacheEntry(target2);
+    partition1.put(entry1);
+    partition2.put(entry2);
+    entry1.setValue(descriptor1, 1, TargetedResult.EMPTY_LIST);
+    entry2.setValue(descriptor2, 2, <TargetedResult>[result1]);
+    // target2 is listed as dependent in target1
+    expect(
+        entry1.getResultData(descriptor1).dependentResults, contains(result2));
+    // dispose
+    partition2.dispose();
+    expect(partition1.get(target1), same(entry1));
+    expect(partition2.get(target2), isNull);
+    // result2 is removed from result1
+    expect(entry1.getResultData(descriptor1).dependentResults, isEmpty);
+  }
+}
+
+class _InternalAnalysisContextMock extends TypedMock
+    implements InternalAnalysisContext {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+class _TestAnalysisTarget implements AnalysisTarget {
+  @override
+  Source get source => null;
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/context/context_test.dart b/mojo/public/dart/third_party/analyzer/test/src/context/context_test.dart
new file mode 100644
index 0000000..bad2cc6
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/context/context_test.dart
@@ -0,0 +1,2499 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.context.context_test;
+
+import 'dart:async';
+
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/cancelable_future.dart';
+import 'package:analyzer/src/context/cache.dart';
+import 'package:analyzer/src/context/context.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart'
+    show
+        AnalysisContext,
+        AnalysisContextStatistics,
+        AnalysisDelta,
+        AnalysisEngine,
+        AnalysisErrorInfo,
+        AnalysisLevel,
+        AnalysisNotScheduledError,
+        AnalysisOptions,
+        AnalysisOptionsImpl,
+        AnalysisResult,
+        CacheState,
+        ChangeNotice,
+        ChangeSet,
+        IncrementalAnalysisCache,
+        TimestampedData;
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/task/dart.dart';
+import 'package:analyzer/src/task/html.dart';
+import 'package:analyzer/task/dart.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:html/dom.dart' show Document;
+import 'package:unittest/unittest.dart';
+import 'package:watcher/src/utils.dart';
+
+import '../../generated/engine_test.dart';
+import '../../generated/test_support.dart';
+import '../../reflective_tests.dart';
+import '../../utils.dart';
+import 'abstract_context.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(AnalysisContextImplTest);
+  runReflectiveTests(LimitedInvalidateTest);
+}
+
+@reflectiveTest
+class AnalysisContextImplTest extends AbstractContextTest {
+  Future fail_implicitAnalysisEvents_removed() async {
+    AnalyzedSourcesListener listener = new AnalyzedSourcesListener();
+    context.implicitAnalysisEvents.listen(listener.onData);
+    //
+    // Create a file that references an file that is not explicitly being
+    // analyzed and fully analyze it. Ensure that the listener is told about
+    // the implicitly analyzed file.
+    //
+    Source sourceA = newSource('/a.dart', "library a; import 'b.dart';");
+    Source sourceB = newSource('/b.dart', "library b;");
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(sourceA);
+    context.applyChanges(changeSet);
+    context.computeErrors(sourceA);
+    await pumpEventQueue();
+    listener.expectAnalyzed(sourceB);
+    //
+    // Remove the reference and ensure that the listener is told that we're no
+    // longer implicitly analyzing the file.
+    //
+    context.setContents(sourceA, "library a;");
+    context.computeErrors(sourceA);
+    await pumpEventQueue();
+    listener.expectNotAnalyzed(sourceB);
+  }
+
+  void fail_performAnalysisTask_importedLibraryDelete_html() {
+    // NOTE: This was failing before converting to the new task model.
+    Source htmlSource = addSource(
+        "/page.html",
+        r'''
+<html><body><script type="application/dart">
+  import 'libB.dart';
+  main() {print('hello dart');}
+</script></body></html>''');
+    Source libBSource = addSource("/libB.dart", "library libB;");
+    _analyzeAll_assertFinished();
+    context.computeErrors(htmlSource);
+    expect(
+        context.getResolvedCompilationUnit2(libBSource, libBSource), isNotNull,
+        reason: "libB resolved 1");
+    expect(!_hasAnalysisErrorWithErrorSeverity(context.getErrors(htmlSource)),
+        isTrue,
+        reason: "htmlSource doesn't have errors");
+    // remove libB.dart content and analyze
+    context.setContents(libBSource, null);
+    _analyzeAll_assertFinished();
+    context.computeErrors(htmlSource);
+    AnalysisErrorInfo errors = context.getErrors(htmlSource);
+    expect(_hasAnalysisErrorWithErrorSeverity(errors), isTrue,
+        reason: "htmlSource has an error");
+  }
+
+  void fail_recordLibraryElements() {
+    fail("Implement this");
+  }
+
+  @override
+  void tearDown() {
+    context = null;
+    sourceFactory = null;
+    super.tearDown();
+  }
+
+  Future test_applyChanges_add() {
+    SourcesChangedListener listener = new SourcesChangedListener();
+    context.onSourcesChanged.listen(listener.onData);
+    expect(context.sourcesNeedingProcessing, isEmpty);
+    Source source = newSource('/test.dart');
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(source);
+    context.applyChanges(changeSet);
+    expect(context.sourcesNeedingProcessing, contains(source));
+    return pumpEventQueue().then((_) {
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertNoMoreEvents();
+    });
+  }
+
+  Future test_applyChanges_change() {
+    SourcesChangedListener listener = new SourcesChangedListener();
+    context.onSourcesChanged.listen(listener.onData);
+    expect(context.sourcesNeedingProcessing, isEmpty);
+    Source source = newSource('/test.dart');
+    ChangeSet changeSet1 = new ChangeSet();
+    changeSet1.addedSource(source);
+    context.applyChanges(changeSet1);
+    expect(context.sourcesNeedingProcessing, contains(source));
+    Source source2 = newSource('/test2.dart');
+    ChangeSet changeSet2 = new ChangeSet();
+    changeSet2.addedSource(source2);
+    changeSet2.changedSource(source);
+    context.applyChanges(changeSet2);
+    return pumpEventQueue().then((_) {
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(wereSourcesAdded: true, changedSources: [source]);
+      listener.assertNoMoreEvents();
+    });
+  }
+
+  Future test_applyChanges_change_content() {
+    SourcesChangedListener listener = new SourcesChangedListener();
+    context.onSourcesChanged.listen(listener.onData);
+    expect(context.sourcesNeedingProcessing, isEmpty);
+    Source source = newSource('/test.dart');
+    ChangeSet changeSet1 = new ChangeSet();
+    changeSet1.addedSource(source);
+    context.applyChanges(changeSet1);
+    expect(context.sourcesNeedingProcessing, contains(source));
+    Source source2 = newSource('/test2.dart');
+    ChangeSet changeSet2 = new ChangeSet();
+    changeSet2.addedSource(source2);
+    changeSet2.changedContent(source, 'library test;');
+    context.applyChanges(changeSet2);
+    return pumpEventQueue().then((_) {
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(wereSourcesAdded: true, changedSources: [source]);
+      listener.assertNoMoreEvents();
+    });
+  }
+
+  void test_applyChanges_change_flush_element() {
+    Source librarySource = addSource(
+        "/lib.dart",
+        r'''
+library lib;
+int a = 0;''');
+    expect(context.computeLibraryElement(librarySource), isNotNull);
+    context.setContents(
+        librarySource,
+        r'''
+library lib;
+int aa = 0;''');
+    expect(context.getLibraryElement(librarySource), isNull);
+  }
+
+  Future test_applyChanges_change_multiple() {
+    SourcesChangedListener listener = new SourcesChangedListener();
+    context.onSourcesChanged.listen(listener.onData);
+    String libraryContents1 = r'''
+library lib;
+part 'part.dart';
+int a = 0;''';
+    Source librarySource = addSource("/lib.dart", libraryContents1);
+    String partContents1 = r'''
+part of lib;
+int b = a;''';
+    Source partSource = addSource("/part.dart", partContents1);
+    context.computeLibraryElement(librarySource);
+    String libraryContents2 = r'''
+library lib;
+part 'part.dart';
+int aa = 0;''';
+    context.setContents(librarySource, libraryContents2);
+    String partContents2 = r'''
+part of lib;
+int b = aa;''';
+    context.setContents(partSource, partContents2);
+    context.computeLibraryElement(librarySource);
+    CompilationUnit libraryUnit =
+        context.resolveCompilationUnit2(librarySource, librarySource);
+    expect(libraryUnit, isNotNull);
+    CompilationUnit partUnit =
+        context.resolveCompilationUnit2(partSource, librarySource);
+    expect(partUnit, isNotNull);
+    TopLevelVariableDeclaration declaration =
+        libraryUnit.declarations[0] as TopLevelVariableDeclaration;
+    Element declarationElement = declaration.variables.variables[0].element;
+    TopLevelVariableDeclaration use =
+        partUnit.declarations[0] as TopLevelVariableDeclaration;
+    Element useElement = (use.variables.variables[0].initializer
+        as SimpleIdentifier).staticElement;
+    expect((useElement as PropertyAccessorElement).variable,
+        same(declarationElement));
+    return pumpEventQueue().then((_) {
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(changedSources: [librarySource]);
+      listener.assertEvent(changedSources: [partSource]);
+      listener.assertNoMoreEvents();
+    });
+  }
+
+  Future test_applyChanges_change_range() {
+    SourcesChangedListener listener = new SourcesChangedListener();
+    context.onSourcesChanged.listen(listener.onData);
+    expect(context.sourcesNeedingProcessing, isEmpty);
+    Source source = newSource('/test.dart');
+    ChangeSet changeSet1 = new ChangeSet();
+    changeSet1.addedSource(source);
+    context.applyChanges(changeSet1);
+    expect(context.sourcesNeedingProcessing, contains(source));
+    Source source2 = newSource('/test2.dart');
+    ChangeSet changeSet2 = new ChangeSet();
+    changeSet2.addedSource(source2);
+    changeSet2.changedRange(source, 'library test;', 0, 0, 13);
+    context.applyChanges(changeSet2);
+    return pumpEventQueue().then((_) {
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(wereSourcesAdded: true, changedSources: [source]);
+      listener.assertNoMoreEvents();
+    });
+  }
+
+  void test_applyChanges_empty() {
+    context.applyChanges(new ChangeSet());
+    expect(context.performAnalysisTask().changeNotices, isNull);
+  }
+
+  void test_applyChanges_overriddenSource() {
+    // Note: addSource adds the source to the contentCache.
+    Source source = addSource("/test.dart", "library test;");
+    context.computeErrors(source);
+    while (!context.sourcesNeedingProcessing.isEmpty) {
+      context.performAnalysisTask();
+    }
+    // Adding the source as a changedSource should have no effect since
+    // it is already overridden in the content cache.
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.changedSource(source);
+    context.applyChanges(changeSet);
+    expect(context.sourcesNeedingProcessing, hasLength(0));
+  }
+
+  Future test_applyChanges_remove() {
+    SourcesChangedListener listener = new SourcesChangedListener();
+    context.onSourcesChanged.listen(listener.onData);
+    String libAContents = r'''
+library libA;
+import 'libB.dart';''';
+    Source libA = addSource("/libA.dart", libAContents);
+    String libBContents = "library libB;";
+    Source libB = addSource("/libB.dart", libBContents);
+    LibraryElement libAElement = context.computeLibraryElement(libA);
+    expect(libAElement, isNotNull);
+    List<LibraryElement> importedLibraries = libAElement.importedLibraries;
+    expect(importedLibraries, hasLength(2));
+    context.computeErrors(libA);
+    context.computeErrors(libB);
+    expect(context.sourcesNeedingProcessing, hasLength(0));
+    context.setContents(libB, null);
+    _removeSource(libB);
+    List<Source> sources = context.sourcesNeedingProcessing;
+    expect(sources, hasLength(1));
+    expect(sources[0], same(libA));
+    libAElement = context.computeLibraryElement(libA);
+    importedLibraries = libAElement.importedLibraries;
+    expect(importedLibraries, hasLength(1));
+    return pumpEventQueue().then((_) {
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(wereSourcesRemovedOrDeleted: true);
+      listener.assertNoMoreEvents();
+    });
+  }
+
+  /**
+   * IDEA uses the following scenario:
+   * 1. Add overlay.
+   * 2. Change overlay.
+   * 3. If the contents of the document buffer is the same as the contents
+   *    of the file, remove overlay.
+   * So, we need to try to use incremental resolution for removing overlays too.
+   */
+  void test_applyChanges_remove_incremental() {
+    MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
+    Source source = resourceProvider
+        .newFile(
+            '/test.dart',
+            r'''
+main() {
+  print(1);
+}
+''')
+        .createSource();
+    context.analysisOptions = new AnalysisOptionsImpl()..incremental = true;
+    context.applyChanges(new ChangeSet()..addedSource(source));
+    // remember compilation unit
+    _analyzeAll_assertFinished();
+    CompilationUnit unit = context.getResolvedCompilationUnit2(source, source);
+    // add overlay
+    context.setContents(
+        source,
+        r'''
+main() {
+  print(12);
+}
+''');
+    _analyzeAll_assertFinished();
+    expect(context.getResolvedCompilationUnit2(source, source), unit);
+    // remove overlay
+    context.setContents(source, null);
+    context.validateCacheConsistency();
+    _analyzeAll_assertFinished();
+    expect(context.getResolvedCompilationUnit2(source, source), unit);
+  }
+
+  Future test_applyChanges_removeContainer() {
+    SourcesChangedListener listener = new SourcesChangedListener();
+    context.onSourcesChanged.listen(listener.onData);
+    String libAContents = r'''
+library libA;
+import 'libB.dart';''';
+    Source libA = addSource("/libA.dart", libAContents);
+    String libBContents = "library libB;";
+    Source libB = addSource("/libB.dart", libBContents);
+    context.computeLibraryElement(libA);
+    context.computeErrors(libA);
+    context.computeErrors(libB);
+    expect(context.sourcesNeedingProcessing, hasLength(0));
+    ChangeSet changeSet = new ChangeSet();
+    SourceContainer removedContainer =
+        new _AnalysisContextImplTest_test_applyChanges_removeContainer(libB);
+    changeSet.removedContainer(removedContainer);
+    context.applyChanges(changeSet);
+    List<Source> sources = context.sourcesNeedingProcessing;
+    expect(sources, hasLength(1));
+    expect(sources[0], same(libA));
+    return pumpEventQueue().then((_) {
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(wereSourcesRemovedOrDeleted: true);
+      listener.assertNoMoreEvents();
+    });
+  }
+
+  void test_computeDocumentationComment_block() {
+    String comment = "/** Comment */";
+    Source source = addSource(
+        "/test.dart",
+        """
+$comment
+class A {}""");
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+    expect(libraryElement, isNotNull);
+    ClassElement classElement = libraryElement.definingCompilationUnit.types[0];
+    expect(libraryElement, isNotNull);
+    expect(context.computeDocumentationComment(classElement), comment);
+  }
+
+  void test_computeDocumentationComment_none() {
+    Source source = addSource("/test.dart", "class A {}");
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+    expect(libraryElement, isNotNull);
+    ClassElement classElement = libraryElement.definingCompilationUnit.types[0];
+    expect(libraryElement, isNotNull);
+    expect(context.computeDocumentationComment(classElement), isNull);
+  }
+
+  void test_computeDocumentationComment_null() {
+    expect(context.computeDocumentationComment(null), isNull);
+  }
+
+  void test_computeDocumentationComment_singleLine_multiple_EOL_n() {
+    String comment = "/// line 1\n/// line 2\n/// line 3\n";
+    Source source = addSource("/test.dart", "${comment}class A {}");
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+    expect(libraryElement, isNotNull);
+    ClassElement classElement = libraryElement.definingCompilationUnit.types[0];
+    expect(libraryElement, isNotNull);
+    String actual = context.computeDocumentationComment(classElement);
+    expect(actual, "/// line 1\n/// line 2\n/// line 3");
+  }
+
+  void test_computeDocumentationComment_singleLine_multiple_EOL_rn() {
+    String comment = "/// line 1\r\n/// line 2\r\n/// line 3\r\n";
+    Source source = addSource("/test.dart", "${comment}class A {}");
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+    expect(libraryElement, isNotNull);
+    ClassElement classElement = libraryElement.definingCompilationUnit.types[0];
+    expect(libraryElement, isNotNull);
+    String actual = context.computeDocumentationComment(classElement);
+    expect(actual, "/// line 1\n/// line 2\n/// line 3");
+  }
+
+  void test_computeErrors_dart_none() {
+    Source source = addSource("/lib.dart", "library lib;");
+    List<AnalysisError> errors = context.computeErrors(source);
+    expect(errors, hasLength(0));
+  }
+
+  void test_computeErrors_dart_part() {
+    Source librarySource =
+        addSource("/lib.dart", "library lib; part 'part.dart';");
+    Source partSource = addSource("/part.dart", "part of 'lib';");
+    context.parseCompilationUnit(librarySource);
+    List<AnalysisError> errors = context.computeErrors(partSource);
+    expect(errors, isNotNull);
+    expect(errors.length > 0, isTrue);
+  }
+
+  void test_computeErrors_dart_some() {
+    Source source = addSource("/lib.dart", "library 'lib';");
+    List<AnalysisError> errors = context.computeErrors(source);
+    expect(errors, isNotNull);
+    expect(errors.length > 0, isTrue);
+  }
+
+  void test_computeErrors_html_none() {
+    Source source = addSource("/test.html", "<!DOCTYPE html><html></html>");
+    List<AnalysisError> errors = context.computeErrors(source);
+    expect(errors, hasLength(0));
+  }
+
+  void test_computeExportedLibraries_none() {
+    Source source = addSource("/test.dart", "library test;");
+    expect(context.computeExportedLibraries(source), hasLength(0));
+  }
+
+  void test_computeExportedLibraries_some() {
+    //    addSource("/lib1.dart", "library lib1;");
+    //    addSource("/lib2.dart", "library lib2;");
+    Source source = addSource(
+        "/test.dart", "library test; export 'lib1.dart'; export 'lib2.dart';");
+    expect(context.computeExportedLibraries(source), hasLength(2));
+  }
+
+  void test_computeImportedLibraries_none() {
+    Source source = addSource("/test.dart", "library test;");
+    expect(context.computeImportedLibraries(source), hasLength(0));
+  }
+
+  void test_computeImportedLibraries_some() {
+    Source source = addSource(
+        "/test.dart", "library test; import 'lib1.dart'; import 'lib2.dart';");
+    expect(context.computeImportedLibraries(source), hasLength(2));
+  }
+
+  void test_computeKindOf_html() {
+    Source source = addSource("/test.html", "");
+    expect(context.computeKindOf(source), same(SourceKind.HTML));
+  }
+
+  void test_computeKindOf_library() {
+    Source source = addSource("/test.dart", "library lib;");
+    expect(context.computeKindOf(source), same(SourceKind.LIBRARY));
+  }
+
+  void test_computeKindOf_libraryAndPart() {
+    Source source = addSource("/test.dart", "library lib; part of lib;");
+    expect(context.computeKindOf(source), same(SourceKind.LIBRARY));
+  }
+
+  void test_computeKindOf_part() {
+    Source source = addSource("/test.dart", "part of lib;");
+    expect(context.computeKindOf(source), same(SourceKind.PART));
+  }
+
+  void test_computeLibraryElement() {
+    Source source = addSource("/test.dart", "library lib;");
+    LibraryElement element = context.computeLibraryElement(source);
+    expect(element, isNotNull);
+  }
+
+  void test_computeLineInfo_dart() {
+    Source source = addSource(
+        "/test.dart",
+        r'''
+library lib;
+
+main() {}''');
+    LineInfo info = context.computeLineInfo(source);
+    expect(info, isNotNull);
+  }
+
+  void test_computeLineInfo_html() {
+    Source source = addSource(
+        "/test.html",
+        r'''
+<html>
+  <body>
+    <h1>A</h1>
+  </body>
+</html>''');
+    LineInfo info = context.computeLineInfo(source);
+    expect(info, isNotNull);
+  }
+
+  Future test_computeResolvedCompilationUnitAsync() {
+    Source source = addSource("/lib.dart", "library lib;");
+    // Complete all pending analysis tasks and flush the AST so that it won't
+    // be available immediately.
+    _performPendingAnalysisTasks();
+    _flushAst(source);
+    bool completed = false;
+    context
+        .computeResolvedCompilationUnitAsync(source, source)
+        .then((CompilationUnit unit) {
+      expect(unit, isNotNull);
+      completed = true;
+    });
+    return pumpEventQueue().then((_) {
+      expect(completed, isFalse);
+      _performPendingAnalysisTasks();
+    }).then((_) => pumpEventQueue()).then((_) {
+      expect(completed, isTrue);
+    });
+  }
+
+  Future test_computeResolvedCompilationUnitAsync_afterDispose() {
+    Source source = addSource("/lib.dart", "library lib;");
+    // Complete all pending analysis tasks and flush the AST so that it won't
+    // be available immediately.
+    _performPendingAnalysisTasks();
+    _flushAst(source);
+    // Dispose of the context.
+    context.dispose();
+    // Any attempt to start an asynchronous computation should return a future
+    // which completes with error.
+    CancelableFuture<CompilationUnit> future =
+        context.computeResolvedCompilationUnitAsync(source, source);
+    bool completed = false;
+    future.then((CompilationUnit unit) {
+      fail('Future should have completed with error');
+    }, onError: (error) {
+      expect(error, new isInstanceOf<AnalysisNotScheduledError>());
+      completed = true;
+    });
+    return pumpEventQueue().then((_) {
+      expect(completed, isTrue);
+    });
+  }
+
+  Future test_computeResolvedCompilationUnitAsync_cancel() {
+    Source source = addSource("/lib.dart", "library lib;");
+    // Complete all pending analysis tasks and flush the AST so that it won't
+    // be available immediately.
+    _performPendingAnalysisTasks();
+    _flushAst(source);
+    CancelableFuture<CompilationUnit> future =
+        context.computeResolvedCompilationUnitAsync(source, source);
+    bool completed = false;
+    future.then((CompilationUnit unit) {
+      fail('Future should have been canceled');
+    }, onError: (error) {
+      expect(error, new isInstanceOf<FutureCanceledError>());
+      completed = true;
+    });
+    expect(completed, isFalse);
+    expect(context.pendingFutureSources_forTesting, isNotEmpty);
+    future.cancel();
+    expect(context.pendingFutureSources_forTesting, isEmpty);
+    return pumpEventQueue().then((_) {
+      expect(completed, isTrue);
+      expect(context.pendingFutureSources_forTesting, isEmpty);
+    });
+  }
+
+  Future test_computeResolvedCompilationUnitAsync_dispose() {
+    Source source = addSource("/lib.dart", "library lib;");
+    // Complete all pending analysis tasks and flush the AST so that it won't
+    // be available immediately.
+    _performPendingAnalysisTasks();
+    _flushAst(source);
+    bool completed = false;
+    CancelableFuture<CompilationUnit> future =
+        context.computeResolvedCompilationUnitAsync(source, source);
+    future.then((CompilationUnit unit) {
+      fail('Future should have completed with error');
+    }, onError: (error) {
+      expect(error, new isInstanceOf<AnalysisNotScheduledError>());
+      completed = true;
+    });
+    expect(completed, isFalse);
+    expect(context.pendingFutureSources_forTesting, isNotEmpty);
+    // Disposing of the context should cause all pending futures to complete
+    // with AnalysisNotScheduled, so that no clients are left hanging.
+    context.dispose();
+    expect(context.pendingFutureSources_forTesting, isEmpty);
+    return pumpEventQueue().then((_) {
+      expect(completed, isTrue);
+      expect(context.pendingFutureSources_forTesting, isEmpty);
+    });
+  }
+
+  Future test_computeResolvedCompilationUnitAsync_noCacheEntry() {
+    Source librarySource = addSource("/lib.dart", "library lib;");
+    Source partSource = addSource("/part.dart", "part of foo;");
+    bool completed = false;
+    context
+        .computeResolvedCompilationUnitAsync(partSource, librarySource)
+        .then((CompilationUnit unit) {
+      expect(unit, isNotNull);
+      completed = true;
+    });
+    return pumpEventQueue().then((_) {
+      expect(completed, isFalse);
+      _performPendingAnalysisTasks();
+    }).then((_) => pumpEventQueue()).then((_) {
+      expect(completed, isTrue);
+    });
+  }
+
+  void test_dispose() {
+    expect(context.isDisposed, isFalse);
+    context.dispose();
+    expect(context.isDisposed, isTrue);
+  }
+
+  void test_ensureResolvedDartUnits_definingUnit_hasResolved() {
+    Source source = addSource('/test.dart', '');
+    LibrarySpecificUnit libTarget = new LibrarySpecificUnit(source, source);
+    analysisDriver.computeResult(libTarget, RESOLVED_UNIT);
+    CompilationUnit unit =
+        context.getCacheEntry(libTarget).getValue(RESOLVED_UNIT);
+    List<CompilationUnit> units = context.ensureResolvedDartUnits(source);
+    expect(units, unorderedEquals([unit]));
+  }
+
+  void test_ensureResolvedDartUnits_definingUnit_notResolved() {
+    Source source = addSource('/test.dart', '');
+    LibrarySpecificUnit libTarget = new LibrarySpecificUnit(source, source);
+    analysisDriver.computeResult(libTarget, RESOLVED_UNIT);
+    // flush
+    context
+        .getCacheEntry(libTarget)
+        .setState(RESOLVED_UNIT, CacheState.FLUSHED);
+    // schedule recomputing
+    List<CompilationUnit> units = context.ensureResolvedDartUnits(source);
+    expect(units, isNull);
+    // should be the next result to compute
+    TargetedResult nextResult = context.dartWorkManager.getNextResult();
+    expect(nextResult.target, libTarget);
+    expect(nextResult.result, RESOLVED_UNIT);
+  }
+
+  void test_ensureResolvedDartUnits_partUnit_hasResolved() {
+    Source libSource1 = addSource(
+        '/lib1.dart',
+        r'''
+library lib;
+part 'part.dart';
+''');
+    Source libSource2 = addSource(
+        '/lib2.dart',
+        r'''
+library lib;
+part 'part.dart';
+''');
+    Source partSource = addSource(
+        '/part.dart',
+        r'''
+part of lib;
+''');
+    LibrarySpecificUnit partTarget1 =
+        new LibrarySpecificUnit(libSource1, partSource);
+    LibrarySpecificUnit partTarget2 =
+        new LibrarySpecificUnit(libSource2, partSource);
+    analysisDriver.computeResult(partTarget1, RESOLVED_UNIT);
+    analysisDriver.computeResult(partTarget2, RESOLVED_UNIT);
+    CompilationUnit unit1 =
+        context.getCacheEntry(partTarget1).getValue(RESOLVED_UNIT);
+    CompilationUnit unit2 =
+        context.getCacheEntry(partTarget2).getValue(RESOLVED_UNIT);
+    List<CompilationUnit> units = context.ensureResolvedDartUnits(partSource);
+    expect(units, unorderedEquals([unit1, unit2]));
+  }
+
+  void test_ensureResolvedDartUnits_partUnit_notResolved() {
+    Source libSource1 = addSource(
+        '/lib1.dart',
+        r'''
+library lib;
+part 'part.dart';
+''');
+    Source libSource2 = addSource(
+        '/lib2.dart',
+        r'''
+library lib;
+part 'part.dart';
+''');
+    Source partSource = addSource(
+        '/part.dart',
+        r'''
+part of lib;
+''');
+    LibrarySpecificUnit partTarget1 =
+        new LibrarySpecificUnit(libSource1, partSource);
+    LibrarySpecificUnit partTarget2 =
+        new LibrarySpecificUnit(libSource2, partSource);
+    analysisDriver.computeResult(partTarget1, RESOLVED_UNIT);
+    analysisDriver.computeResult(partTarget2, RESOLVED_UNIT);
+    // flush
+    context
+        .getCacheEntry(partTarget1)
+        .setState(RESOLVED_UNIT, CacheState.FLUSHED);
+    context
+        .getCacheEntry(partTarget2)
+        .setState(RESOLVED_UNIT, CacheState.FLUSHED);
+    // schedule recomputing
+    List<CompilationUnit> units = context.ensureResolvedDartUnits(partSource);
+    expect(units, isNull);
+    // should be the next result to compute
+    TargetedResult nextResult = context.dartWorkManager.getNextResult();
+    expect(nextResult.target, anyOf(partTarget1, partTarget2));
+    expect(nextResult.result, RESOLVED_UNIT);
+  }
+
+  void test_exists_false() {
+    TestSource source = new TestSource();
+    source.exists2 = false;
+    expect(context.exists(source), isFalse);
+  }
+
+  void test_exists_null() {
+    expect(context.exists(null), isFalse);
+  }
+
+  void test_exists_overridden() {
+    Source source = new TestSource();
+    context.setContents(source, "");
+    expect(context.exists(source), isTrue);
+  }
+
+  void test_exists_true() {
+    expect(context.exists(new AnalysisContextImplTest_Source_exists_true()),
+        isTrue);
+  }
+
+  void test_getAnalysisOptions() {
+    expect(context.analysisOptions, isNotNull);
+  }
+
+  void test_getContents_fromSource() {
+    String content = "library lib;";
+    TimestampedData<String> contents =
+        context.getContents(new TestSource('/test.dart', content));
+    expect(contents.data.toString(), content);
+  }
+
+  void test_getContents_overridden() {
+    String content = "library lib;";
+    Source source = new TestSource();
+    context.setContents(source, content);
+    TimestampedData<String> contents = context.getContents(source);
+    expect(contents.data.toString(), content);
+  }
+
+  void test_getContents_unoverridden() {
+    String content = "library lib;";
+    Source source = new TestSource('/test.dart', content);
+    context.setContents(source, "part of lib;");
+    context.setContents(source, null);
+    TimestampedData<String> contents = context.getContents(source);
+    expect(contents.data.toString(), content);
+  }
+
+  void test_getDeclaredVariables() {
+    expect(context.declaredVariables, isNotNull);
+  }
+
+  void test_getElement() {
+    LibraryElement core =
+        context.computeLibraryElement(sourceFactory.forUri("dart:core"));
+    expect(core, isNotNull);
+    ClassElement classObject =
+        _findClass(core.definingCompilationUnit, "Object");
+    expect(classObject, isNotNull);
+    ElementLocation location = classObject.location;
+    Element element = context.getElement(location);
+    expect(element, same(classObject));
+  }
+
+  void test_getElement_constructor_named() {
+    Source source = addSource(
+        "/lib.dart",
+        r'''
+class A {
+  A.named() {}
+}''');
+    _analyzeAll_assertFinished();
+    LibraryElement library = context.computeLibraryElement(source);
+    ClassElement classA = _findClass(library.definingCompilationUnit, "A");
+    ConstructorElement constructor = classA.constructors[0];
+    ElementLocation location = constructor.location;
+    Element element = context.getElement(location);
+    expect(element, same(constructor));
+  }
+
+  void test_getElement_constructor_unnamed() {
+    Source source = addSource(
+        "/lib.dart",
+        r'''
+class A {
+  A() {}
+}''');
+    _analyzeAll_assertFinished();
+    LibraryElement library = context.computeLibraryElement(source);
+    ClassElement classA = _findClass(library.definingCompilationUnit, "A");
+    ConstructorElement constructor = classA.constructors[0];
+    ElementLocation location = constructor.location;
+    Element element = context.getElement(location);
+    expect(element, same(constructor));
+  }
+
+  void test_getElement_enum() {
+    Source source = addSource('/test.dart', 'enum MyEnum {A, B, C}');
+    _analyzeAll_assertFinished();
+    LibraryElement library = context.computeLibraryElement(source);
+    ClassElement myEnum = library.definingCompilationUnit.getEnum('MyEnum');
+    ElementLocation location = myEnum.location;
+    Element element = context.getElement(location);
+    expect(element, same(myEnum));
+  }
+
+  void test_getErrors_dart_none() {
+    Source source = addSource("/lib.dart", "library lib;");
+    var errorInfo = context.getErrors(source);
+    expect(errorInfo, isNotNull);
+    List<AnalysisError> errors = errorInfo.errors;
+    expect(errors, hasLength(0));
+    context.computeErrors(source);
+    errors = errorInfo.errors;
+    expect(errors, hasLength(0));
+  }
+
+  void test_getErrors_dart_some() {
+    Source source = addSource("/lib.dart", "library 'lib';");
+    var errorInfo = context.getErrors(source);
+    expect(errorInfo, isNotNull);
+    List<AnalysisError> errors = errorInfo.errors;
+    expect(errors, hasLength(0));
+    errors = context.computeErrors(source);
+    expect(errors, hasLength(1));
+  }
+
+  void test_getErrors_html_none() {
+    Source source = addSource("/test.html", "<html></html>");
+    AnalysisErrorInfo errorInfo = context.getErrors(source);
+    expect(errorInfo, isNotNull);
+    List<AnalysisError> errors = errorInfo.errors;
+    expect(errors, hasLength(0));
+    context.computeErrors(source);
+    errors = errorInfo.errors;
+    expect(errors, hasLength(0));
+  }
+
+  void test_getErrors_html_some() {
+    Source source = addSource(
+        "/test.html",
+        r'''
+<html><head>
+<script type='application/dart' src='test.dart'/>
+</head></html>''');
+    AnalysisErrorInfo errorInfo = context.getErrors(source);
+    expect(errorInfo, isNotNull);
+    List<AnalysisError> errors = errorInfo.errors;
+    expect(errors, hasLength(0));
+    errors = context.computeErrors(source);
+    expect(errors, hasLength(3));
+  }
+
+  void test_getHtmlFilesReferencing_html() {
+    Source htmlSource = addSource(
+        "/test.html",
+        r'''
+<html><head>
+<script type='application/dart' src='test.dart'/>
+<script type='application/dart' src='test.js'/>
+</head></html>''');
+    Source librarySource = addSource("/test.dart", "library lib;");
+    Source secondHtmlSource = addSource("/test.html", "<html></html>");
+    context.computeLibraryElement(librarySource);
+    List<Source> result = context.getHtmlFilesReferencing(secondHtmlSource);
+    expect(result, hasLength(0));
+    context.parseHtmlDocument(htmlSource);
+    result = context.getHtmlFilesReferencing(secondHtmlSource);
+    expect(result, hasLength(0));
+  }
+
+  void test_getHtmlFilesReferencing_library() {
+    Source htmlSource = addSource(
+        "/test.html",
+        r'''
+<!DOCTYPE html>
+<html><head>
+<script type='application/dart' src='test.dart'/>
+<script type='application/dart' src='test.js'/>
+</head></html>''');
+    Source librarySource = addSource("/test.dart", "library lib;");
+    context.computeLibraryElement(librarySource);
+    List<Source> result = context.getHtmlFilesReferencing(librarySource);
+    expect(result, hasLength(0));
+    // Indirectly force the data to be computed.
+    context.computeErrors(htmlSource);
+    result = context.getHtmlFilesReferencing(librarySource);
+    expect(result, hasLength(1));
+    expect(result[0], htmlSource);
+  }
+
+  void test_getHtmlFilesReferencing_part() {
+    Source htmlSource = addSource(
+        "/test.html",
+        r'''
+<!DOCTYPE html>
+<html><head>
+<script type='application/dart' src='test.dart'/>
+<script type='application/dart' src='test.js'/>
+</head></html>''');
+    Source librarySource =
+        addSource("/test.dart", "library lib; part 'part.dart';");
+    Source partSource = addSource("/part.dart", "part of lib;");
+    context.computeLibraryElement(librarySource);
+    List<Source> result = context.getHtmlFilesReferencing(partSource);
+    expect(result, hasLength(0));
+    // Indirectly force the data to be computed.
+    context.computeErrors(htmlSource);
+    result = context.getHtmlFilesReferencing(partSource);
+    expect(result, hasLength(1));
+    expect(result[0], htmlSource);
+  }
+
+  void test_getHtmlSources() {
+    List<Source> sources = context.htmlSources;
+    expect(sources, hasLength(0));
+    Source source = addSource("/test.html", "");
+    sources = context.htmlSources;
+    expect(sources, hasLength(1));
+    expect(sources[0], source);
+  }
+
+  void test_getKindOf_html() {
+    Source source = addSource("/test.html", "");
+    expect(context.getKindOf(source), same(SourceKind.HTML));
+  }
+
+  void test_getKindOf_library() {
+    Source source = addSource("/test.dart", "library lib;");
+    expect(context.getKindOf(source), same(SourceKind.UNKNOWN));
+    context.computeKindOf(source);
+    expect(context.getKindOf(source), same(SourceKind.LIBRARY));
+  }
+
+  void test_getKindOf_part() {
+    Source source = addSource("/test.dart", "part of lib;");
+    expect(context.getKindOf(source), same(SourceKind.UNKNOWN));
+    context.computeKindOf(source);
+    expect(context.getKindOf(source), same(SourceKind.PART));
+  }
+
+  void test_getKindOf_unknown() {
+    Source source = addSource("/test.css", "");
+    expect(context.getKindOf(source), same(SourceKind.UNKNOWN));
+  }
+
+  void test_getLaunchableClientLibrarySources_doesNotImportHtml() {
+    Source source = addSource(
+        "/test.dart",
+        r'''
+main() {}''');
+    context.computeLibraryElement(source);
+    List<Source> sources = context.launchableClientLibrarySources;
+    expect(sources, isEmpty);
+  }
+
+  void test_getLaunchableClientLibrarySources_importsHtml_explicitly() {
+    List<Source> sources = context.launchableClientLibrarySources;
+    expect(sources, isEmpty);
+    Source source = addSource(
+        "/test.dart",
+        r'''
+import 'dart:html';
+main() {}''');
+    context.computeLibraryElement(source);
+    sources = context.launchableClientLibrarySources;
+    expect(sources, unorderedEquals([source]));
+  }
+
+  void test_getLaunchableClientLibrarySources_importsHtml_implicitly() {
+    List<Source> sources = context.launchableClientLibrarySources;
+    expect(sources, isEmpty);
+    addSource(
+        "/a.dart",
+        r'''
+import 'dart:html';
+''');
+    Source source = addSource(
+        "/test.dart",
+        r'''
+import 'a.dart';
+main() {}''');
+    context.computeLibraryElement(source);
+    sources = context.launchableClientLibrarySources;
+    expect(sources, unorderedEquals([source]));
+  }
+
+  void test_getLaunchableClientLibrarySources_importsHtml_implicitly2() {
+    List<Source> sources = context.launchableClientLibrarySources;
+    expect(sources, isEmpty);
+    addSource(
+        "/a.dart",
+        r'''
+export 'dart:html';
+''');
+    Source source = addSource(
+        "/test.dart",
+        r'''
+import 'a.dart';
+main() {}''');
+    context.computeLibraryElement(source);
+    sources = context.launchableClientLibrarySources;
+    expect(sources, unorderedEquals([source]));
+  }
+
+  void test_getLaunchableServerLibrarySources() {
+    expect(context.launchableServerLibrarySources, isEmpty);
+    Source source = addSource("/test.dart", "main() {}");
+    context.computeLibraryElement(source);
+    expect(context.launchableServerLibrarySources, unorderedEquals([source]));
+  }
+
+  void test_getLaunchableServerLibrarySources_importsHtml_explicitly() {
+    Source source = addSource(
+        "/test.dart",
+        r'''
+import 'dart:html';
+main() {}
+''');
+    context.computeLibraryElement(source);
+    expect(context.launchableServerLibrarySources, isEmpty);
+  }
+
+  void test_getLaunchableServerLibrarySources_importsHtml_implicitly() {
+    addSource(
+        "/imports_html.dart",
+        r'''
+import 'dart:html';
+''');
+    Source source = addSource(
+        "/test.dart",
+        r'''
+import 'imports_html.dart';
+main() {}''');
+    context.computeLibraryElement(source);
+    expect(context.launchableServerLibrarySources, isEmpty);
+  }
+
+  void test_getLaunchableServerLibrarySources_noMain() {
+    Source source = addSource("/test.dart", '');
+    context.computeLibraryElement(source);
+    expect(context.launchableServerLibrarySources, isEmpty);
+  }
+
+  void test_getLibrariesContaining() {
+    Source librarySource = addSource(
+        "/lib.dart",
+        r'''
+library lib;
+part 'part.dart';''');
+    Source partSource = addSource("/part.dart", "part of lib;");
+    context.computeLibraryElement(librarySource);
+    List<Source> result = context.getLibrariesContaining(librarySource);
+    expect(result, hasLength(1));
+    expect(result[0], librarySource);
+    result = context.getLibrariesContaining(partSource);
+    expect(result, hasLength(1));
+    expect(result[0], librarySource);
+  }
+
+  void test_getLibrariesDependingOn() {
+    Source libASource = addSource("/libA.dart", "library libA;");
+    addSource("/libB.dart", "library libB;");
+    Source lib1Source = addSource(
+        "/lib1.dart",
+        r'''
+library lib1;
+import 'libA.dart';
+export 'libB.dart';''');
+    Source lib2Source = addSource(
+        "/lib2.dart",
+        r'''
+library lib2;
+import 'libB.dart';
+export 'libA.dart';''');
+    context.computeLibraryElement(lib1Source);
+    context.computeLibraryElement(lib2Source);
+    List<Source> result = context.getLibrariesDependingOn(libASource);
+    expect(result, unorderedEquals([lib1Source, lib2Source]));
+  }
+
+  void test_getLibrariesReferencedFromHtml() {
+    Source htmlSource = addSource(
+        "/test.html",
+        r'''
+<!DOCTYPE html>
+<html><head>
+<script type='application/dart' src='test.dart'/>
+<script type='application/dart' src='test.js'/>
+</head></html>''');
+    Source librarySource = addSource("/test.dart", "library lib;");
+    context.computeLibraryElement(librarySource);
+    // Indirectly force the data to be computed.
+    context.computeErrors(htmlSource);
+    List<Source> result = context.getLibrariesReferencedFromHtml(htmlSource);
+    expect(result, hasLength(1));
+    expect(result[0], librarySource);
+  }
+
+  void test_getLibrariesReferencedFromHtml_none() {
+    Source htmlSource = addSource(
+        "/test.html",
+        r'''
+<html><head>
+<script type='application/dart' src='test.js'/>
+</head></html>''');
+    addSource("/test.dart", "library lib;");
+    context.parseHtmlDocument(htmlSource);
+    List<Source> result = context.getLibrariesReferencedFromHtml(htmlSource);
+    expect(result, hasLength(0));
+  }
+
+  void test_getLibraryElement() {
+    Source source = addSource("/test.dart", "library lib;");
+    LibraryElement element = context.getLibraryElement(source);
+    expect(element, isNull);
+    context.computeLibraryElement(source);
+    element = context.getLibraryElement(source);
+    expect(element, isNotNull);
+  }
+
+  void test_getLibrarySources() {
+    List<Source> sources = context.librarySources;
+    int originalLength = sources.length;
+    Source source = addSource("/test.dart", "library lib;");
+    context.computeKindOf(source);
+    sources = context.librarySources;
+    expect(sources, hasLength(originalLength + 1));
+    for (Source returnedSource in sources) {
+      if (returnedSource == source) {
+        return;
+      }
+    }
+    fail("The added source was not in the list of library sources");
+  }
+
+  void test_getLineInfo() {
+    Source source = addSource(
+        "/test.dart",
+        r'''
+library lib;
+
+main() {}''');
+    LineInfo info = context.getLineInfo(source);
+    expect(info, isNull);
+    context.parseCompilationUnit(source);
+    info = context.getLineInfo(source);
+    expect(info, isNotNull);
+  }
+
+  void test_getModificationStamp_fromSource() {
+    int stamp = 42;
+    expect(
+        context.getModificationStamp(
+            new AnalysisContextImplTest_Source_getModificationStamp_fromSource(
+                stamp)),
+        stamp);
+  }
+
+  void test_getModificationStamp_overridden() {
+    int stamp = 42;
+    Source source =
+        new AnalysisContextImplTest_Source_getModificationStamp_overridden(
+            stamp);
+    context.setContents(source, "");
+    expect(stamp != context.getModificationStamp(source), isTrue);
+  }
+
+  void test_getPublicNamespace_element() {
+    Source source = addSource("/test.dart", "class A {}");
+    LibraryElement library = context.computeLibraryElement(source);
+    expect(library, isNotNull);
+    Namespace namespace = context.getPublicNamespace(library);
+    expect(namespace, isNotNull);
+    EngineTestCase.assertInstanceOf(
+        (obj) => obj is ClassElement, ClassElement, namespace.get("A"));
+  }
+
+  void test_getResolvedCompilationUnit_library() {
+    Source source = addSource("/lib.dart", "library libb;");
+    LibraryElement library = context.computeLibraryElement(source);
+    context.computeErrors(source); // Force the resolved unit to be built.
+    expect(context.getResolvedCompilationUnit(source, library), isNotNull);
+    context.setContents(source, "library lib;");
+    expect(context.getResolvedCompilationUnit(source, library), isNull);
+  }
+
+  void test_getResolvedCompilationUnit_library_null() {
+    Source source = addSource("/lib.dart", "library lib;");
+    expect(context.getResolvedCompilationUnit(source, null), isNull);
+  }
+
+  void test_getResolvedCompilationUnit_source_dart() {
+    Source source = addSource("/lib.dart", "library lib;");
+    expect(context.getResolvedCompilationUnit2(source, source), isNull);
+    context.resolveCompilationUnit2(source, source);
+    expect(context.getResolvedCompilationUnit2(source, source), isNotNull);
+  }
+
+  void test_getResolvedCompilationUnit_source_html() {
+    Source source = addSource("/test.html", "<html></html>");
+    expect(context.getResolvedCompilationUnit2(source, source), isNull);
+    expect(context.resolveCompilationUnit2(source, source), isNull);
+    expect(context.getResolvedCompilationUnit2(source, source), isNull);
+  }
+
+  void test_getSourceFactory() {
+    expect(context.sourceFactory, same(sourceFactory));
+  }
+
+  void test_getSourcesWithFullName() {
+    String filePath = '/foo/lib/file.dart';
+    List<Source> expected = <Source>[];
+    ChangeSet changeSet = new ChangeSet();
+
+    TestSourceWithUri source1 =
+        new TestSourceWithUri(filePath, Uri.parse('file://$filePath'));
+    expected.add(source1);
+    changeSet.addedSource(source1);
+
+    TestSourceWithUri source2 =
+        new TestSourceWithUri(filePath, Uri.parse('package:foo/file.dart'));
+    expected.add(source2);
+    changeSet.addedSource(source2);
+
+    context.applyChanges(changeSet);
+    expect(context.getSourcesWithFullName(filePath), unorderedEquals(expected));
+  }
+
+  void test_getStatistics() {
+    AnalysisContextStatistics statistics = context.statistics;
+    expect(statistics, isNotNull);
+    // The following lines are fragile.
+    // The values depend on the number of libraries in the SDK.
+//    assertLength(0, statistics.getCacheRows());
+//    assertLength(0, statistics.getExceptions());
+//    assertLength(0, statistics.getSources());
+  }
+
+  void test_handleContentsChanged() {
+    ContentCache contentCache = new ContentCache();
+    context.contentCache = contentCache;
+    String oldContents = 'foo() {}';
+    String newContents = 'bar() {}';
+    // old contents
+    Source source = addSource("/test.dart", oldContents);
+    _analyzeAll_assertFinished();
+    expect(context.getResolvedCompilationUnit2(source, source), isNotNull);
+    // new contents
+    contentCache.setContents(source, newContents);
+    context.handleContentsChanged(source, oldContents, newContents, true);
+    // there is some work to do
+    AnalysisResult analysisResult = context.performAnalysisTask();
+    expect(analysisResult.changeNotices, isNotNull);
+  }
+
+  Future test_implicitAnalysisEvents_added() async {
+    AnalyzedSourcesListener listener = new AnalyzedSourcesListener();
+    context.implicitAnalysisEvents.listen(listener.onData);
+    //
+    // Create a file that references an file that is not explicitly being
+    // analyzed and fully analyze it. Ensure that the listener is told about
+    // the implicitly analyzed file.
+    //
+    Source sourceA = newSource('/a.dart', "library a; import 'b.dart';");
+    Source sourceB = newSource('/b.dart', "library b;");
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(sourceA);
+    context.applyChanges(changeSet);
+    context.computeErrors(sourceA);
+    await pumpEventQueue();
+    listener.expectAnalyzed(sourceB);
+  }
+
+  void test_isClientLibrary_dart() {
+    Source source = addSource(
+        "/test.dart",
+        r'''
+import 'dart:html';
+
+main() {}''');
+    expect(context.isClientLibrary(source), isFalse);
+    expect(context.isServerLibrary(source), isFalse);
+    context.computeLibraryElement(source);
+    expect(context.isClientLibrary(source), isTrue);
+    expect(context.isServerLibrary(source), isFalse);
+  }
+
+  void test_isClientLibrary_html() {
+    Source source = addSource("/test.html", "<html></html>");
+    expect(context.isClientLibrary(source), isFalse);
+  }
+
+  void test_isServerLibrary_dart() {
+    Source source = addSource(
+        "/test.dart",
+        r'''
+library lib;
+
+main() {}''');
+    expect(context.isClientLibrary(source), isFalse);
+    expect(context.isServerLibrary(source), isFalse);
+    context.computeLibraryElement(source);
+    expect(context.isClientLibrary(source), isFalse);
+    expect(context.isServerLibrary(source), isTrue);
+  }
+
+  void test_isServerLibrary_html() {
+    Source source = addSource("/test.html", "<html></html>");
+    expect(context.isServerLibrary(source), isFalse);
+  }
+
+  void test_parseCompilationUnit_errors() {
+    Source source = addSource("/lib.dart", "library {");
+    CompilationUnit compilationUnit = context.parseCompilationUnit(source);
+    expect(compilationUnit, isNotNull);
+    var errorInfo = context.getErrors(source);
+    expect(errorInfo, isNotNull);
+    List<AnalysisError> errors = errorInfo.errors;
+    expect(errors, isNotNull);
+    expect(errors.length > 0, isTrue);
+  }
+
+  void test_parseCompilationUnit_exception() {
+    Source source = _addSourceWithException("/test.dart");
+    try {
+      context.parseCompilationUnit(source);
+      fail("Expected AnalysisException");
+    } on AnalysisException {
+      // Expected
+    }
+  }
+
+  void test_parseCompilationUnit_html() {
+    Source source = addSource("/test.html", "<html></html>");
+    expect(context.parseCompilationUnit(source), isNull);
+  }
+
+  void test_parseCompilationUnit_noErrors() {
+    Source source = addSource("/lib.dart", "library lib;");
+    CompilationUnit compilationUnit = context.parseCompilationUnit(source);
+    expect(compilationUnit, isNotNull);
+    AnalysisErrorInfo errorInfo = context.getErrors(source);
+    expect(errorInfo, isNotNull);
+    expect(errorInfo.errors, hasLength(0));
+  }
+
+  void test_parseCompilationUnit_nonExistentSource() {
+    Source source = newSource('/test.dart');
+    resourceProvider.deleteFile('/test.dart');
+    try {
+      context.parseCompilationUnit(source);
+      fail("Expected AnalysisException because file does not exist");
+    } on AnalysisException {
+      // Expected result
+    }
+  }
+
+  void test_parseHtmlDocument() {
+    Source source = addSource("/lib.html", "<!DOCTYPE html><html></html>");
+    Document document = context.parseHtmlDocument(source);
+    expect(document, isNotNull);
+  }
+
+  void test_parseHtmlUnit_resolveDirectives() {
+    Source libSource = addSource(
+        "/lib.dart",
+        r'''
+library lib;
+class ClassA {}''');
+    Source source = addSource(
+        "/lib.html",
+        r'''
+<!DOCTYPE html>
+<html>
+<head>
+  <script type='application/dart'>
+    import 'lib.dart';
+    ClassA v = null;
+  </script>
+</head>
+<body>
+</body>
+</html>''');
+    Document document = context.parseHtmlDocument(source);
+    expect(document, isNotNull);
+    List<DartScript> scripts = context.computeResult(source, DART_SCRIPTS);
+    expect(scripts, hasLength(1));
+    CompilationUnit unit = context.computeResult(scripts[0], PARSED_UNIT);
+    ImportDirective importNode = unit.directives[0] as ImportDirective;
+    expect(importNode.uriContent, isNotNull);
+    expect(importNode.source, libSource);
+  }
+
+  void test_performAnalysisTask_addPart() {
+    Source libSource = addSource(
+        "/lib.dart",
+        r'''
+library lib;
+part 'part.dart';''');
+    // run all tasks without part
+    _analyzeAll_assertFinished();
+    expect(_hasAnalysisErrorWithErrorSeverity(context.getErrors(libSource)),
+        isTrue,
+        reason: "lib has errors");
+    // add part and run all tasks
+    Source partSource = addSource(
+        "/part.dart",
+        r'''
+part of lib;
+''');
+    _analyzeAll_assertFinished();
+    // "libSource" should be here
+    List<Source> librariesWithPart = context.getLibrariesContaining(partSource);
+    expect(librariesWithPart, unorderedEquals([libSource]));
+    expect(_hasAnalysisErrorWithErrorSeverity(context.getErrors(libSource)),
+        isFalse,
+        reason: "lib doesn't have errors");
+    expect(
+        context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
+        reason: "part resolved");
+  }
+
+  void test_performAnalysisTask_changeLibraryContents() {
+    Source libSource =
+        addSource("/test.dart", "library lib; part 'test-part.dart';");
+    Source partSource = addSource("/test-part.dart", "part of lib;");
+    _analyzeAll_assertFinished();
+    expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library resolved 1");
+    expect(
+        context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
+        reason: "part resolved 1");
+    // update and analyze #1
+    context.setContents(libSource, "library lib;");
+    expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull,
+        reason: "library changed 2");
+    expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
+        reason: "part changed 2");
+    _analyzeAll_assertFinished();
+    expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library resolved 2");
+    expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
+        reason: "part resolved 2");
+    // update and analyze #2
+    context.setContents(libSource, "library lib; part 'test-part.dart';");
+    expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull,
+        reason: "library changed 3");
+    expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
+        reason: "part changed 3");
+    _analyzeAll_assertFinished();
+    expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library resolved 2");
+    expect(
+        context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
+        reason: "part resolved 3");
+  }
+
+  void test_performAnalysisTask_changeLibraryThenPartContents() {
+    Source libSource =
+        addSource("/test.dart", "library lib; part 'test-part.dart';");
+    Source partSource = addSource("/test-part.dart", "part of lib;");
+    _analyzeAll_assertFinished();
+    expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library resolved 1");
+    expect(
+        context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
+        reason: "part resolved 1");
+    // update and analyze #1
+    context.setContents(libSource, "library lib;");
+    expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull,
+        reason: "library changed 2");
+    expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
+        reason: "part changed 2");
+    _analyzeAll_assertFinished();
+    expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library resolved 2");
+    expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
+        reason: "part resolved 2");
+    // update and analyze #2
+    context.setContents(partSource, "part of lib; // 1");
+    // Assert that changing the part's content does not effect the library
+    // now that it is no longer part of that library
+    expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library changed 3");
+    expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
+        reason: "part changed 3");
+    _analyzeAll_assertFinished();
+    expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library resolved 3");
+    expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
+        reason: "part resolved 3");
+  }
+
+  void test_performAnalysisTask_changePartContents_makeItAPart() {
+    Source libSource = addSource(
+        "/lib.dart",
+        r'''
+library lib;
+part 'part.dart';
+void f(x) {}''');
+    Source partSource = addSource("/part.dart", "void g() { f(null); }");
+    _analyzeAll_assertFinished();
+    expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library resolved 1");
+    expect(
+        context.getResolvedCompilationUnit2(partSource, partSource), isNotNull,
+        reason: "part resolved 1");
+    // update and analyze
+    context.setContents(
+        partSource,
+        r'''
+part of lib;
+void g() { f(null); }''');
+    expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull,
+        reason: "library changed 2");
+    expect(context.getResolvedCompilationUnit2(partSource, partSource), isNull,
+        reason: "part changed 2");
+    _analyzeAll_assertFinished();
+    expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library resolved 2");
+    expect(
+        context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
+        reason: "part resolved 2");
+    expect(context.getErrors(libSource).errors, hasLength(0));
+    expect(context.getErrors(partSource).errors, hasLength(0));
+  }
+
+  /**
+   * https://code.google.com/p/dart/issues/detail?id=12424
+   */
+  void test_performAnalysisTask_changePartContents_makeItNotPart() {
+    Source libSource = addSource(
+        "/lib.dart",
+        r'''
+library lib;
+part 'part.dart';
+void f(x) {}''');
+    Source partSource = addSource(
+        "/part.dart",
+        r'''
+part of lib;
+void g() { f(null); }''');
+    _analyzeAll_assertFinished();
+    expect(context.getErrors(libSource).errors, hasLength(0));
+    expect(context.getErrors(partSource).errors, hasLength(0));
+    // Remove 'part' directive, which should make "f(null)" an error.
+    context.setContents(
+        partSource,
+        r'''
+//part of lib;
+void g() { f(null); }''');
+    _analyzeAll_assertFinished();
+    expect(context.getErrors(libSource).errors.length != 0, isTrue);
+  }
+
+  void test_performAnalysisTask_changePartContents_noSemanticChanges() {
+    Source libSource =
+        addSource("/test.dart", "library lib; part 'test-part.dart';");
+    Source partSource = addSource("/test-part.dart", "part of lib;");
+    _analyzeAll_assertFinished();
+    expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+        reason: "library resolved 1");
+    expect(
+        context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
+        reason: "part resolved 1");
+    // update and analyze #1
+    context.setContents(partSource, "part of lib; // 1");
+    if (AnalysisEngine.instance.limitInvalidationInTaskModel) {
+      expect(
+          context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+          reason: "library changed 2");
+      expect(
+          context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
+          reason: "part changed 2");
+    } else {
+      expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull,
+          reason: "library changed 2");
+      expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
+          reason: "part changed 2");
+      _analyzeAll_assertFinished();
+      expect(
+          context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+          reason: "library resolved 2");
+      expect(
+          context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
+          reason: "part resolved 2");
+    }
+    // update and analyze #2
+    context.setContents(partSource, "part of lib; // 12");
+    if (AnalysisEngine.instance.limitInvalidationInTaskModel) {
+      expect(
+          context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+          reason: "library changed 3");
+      expect(
+          context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
+          reason: "part changed 3");
+    } else {
+      expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull,
+          reason: "library changed 3");
+      expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
+          reason: "part changed 3");
+      _analyzeAll_assertFinished();
+      expect(
+          context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
+          reason: "library resolved 3");
+      expect(
+          context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
+          reason: "part resolved 3");
+    }
+  }
+
+  void test_performAnalysisTask_getContentException_dart() {
+    Source source = _addSourceWithException('test.dart');
+    // prepare errors
+    _analyzeAll_assertFinished();
+    List<AnalysisError> errors = context.getErrors(source).errors;
+    // validate errors
+    expect(errors, hasLength(1));
+    AnalysisError error = errors[0];
+    expect(error.source, same(source));
+    expect(error.errorCode, ScannerErrorCode.UNABLE_GET_CONTENT);
+  }
+
+  void test_performAnalysisTask_getContentException_html() {
+    Source source = _addSourceWithException('test.html');
+    // prepare errors
+    _analyzeAll_assertFinished();
+    List<AnalysisError> errors = context.getErrors(source).errors;
+    // validate errors
+    expect(errors, hasLength(1));
+    AnalysisError error = errors[0];
+    expect(error.source, same(source));
+    expect(error.errorCode, ScannerErrorCode.UNABLE_GET_CONTENT);
+  }
+
+  void test_performAnalysisTask_importedLibraryAdd() {
+    Source libASource =
+        addSource("/libA.dart", "library libA; import 'libB.dart';");
+    _analyzeAll_assertFinished();
+    expect(
+        context.getResolvedCompilationUnit2(libASource, libASource), isNotNull,
+        reason: "libA resolved 1");
+    expect(_hasAnalysisErrorWithErrorSeverity(context.getErrors(libASource)),
+        isTrue,
+        reason: "libA has an error");
+    // add libB.dart and analyze
+    Source libBSource = addSource("/libB.dart", "library libB;");
+    _analyzeAll_assertFinished();
+    expect(
+        context.getResolvedCompilationUnit2(libASource, libASource), isNotNull,
+        reason: "libA resolved 2");
+    expect(
+        context.getResolvedCompilationUnit2(libBSource, libBSource), isNotNull,
+        reason: "libB resolved 2");
+    expect(_hasAnalysisErrorWithErrorSeverity(context.getErrors(libASource)),
+        isFalse,
+        reason: "libA doesn't have errors");
+  }
+
+  void test_performAnalysisTask_importedLibraryAdd_html() {
+    Source htmlSource = addSource(
+        "/page.html",
+        r'''
+<html><body><script type="application/dart">
+  import '/libB.dart';
+  main() {print('hello dart');}
+</script></body></html>''');
+    _analyzeAll_assertFinished();
+    context.computeErrors(htmlSource);
+    expect(_hasAnalysisErrorWithErrorSeverity(context.getErrors(htmlSource)),
+        isTrue,
+        reason: "htmlSource has an error");
+    // add libB.dart and analyze
+    Source libBSource = addSource("/libB.dart", "library libB;");
+    _analyzeAll_assertFinished();
+    expect(
+        context.getResolvedCompilationUnit2(libBSource, libBSource), isNotNull,
+        reason: "libB resolved 2");
+    // TODO (danrubel) commented out to fix red bots
+//    context.computeErrors(htmlSource);
+//    AnalysisErrorInfo errors = _context.getErrors(htmlSource);
+//    expect(
+//        !_hasAnalysisErrorWithErrorSeverity(errors),
+//        isTrue,
+//        reason: "htmlSource doesn't have errors");
+  }
+
+  void test_performAnalysisTask_importedLibraryDelete() {
+    Source libASource =
+        addSource("/libA.dart", "library libA; import 'libB.dart';");
+    Source libBSource = addSource("/libB.dart", "library libB;");
+    _analyzeAll_assertFinished();
+    expect(
+        context.getResolvedCompilationUnit2(libASource, libASource), isNotNull,
+        reason: "libA resolved 1");
+    expect(
+        context.getResolvedCompilationUnit2(libBSource, libBSource), isNotNull,
+        reason: "libB resolved 1");
+    expect(!_hasAnalysisErrorWithErrorSeverity(context.getErrors(libASource)),
+        isTrue,
+        reason: "libA doesn't have errors");
+    // remove libB.dart and analyze
+    _removeSource(libBSource);
+    _analyzeAll_assertFinished();
+    expect(
+        context.getResolvedCompilationUnit2(libASource, libASource), isNotNull,
+        reason: "libA resolved 2");
+    expect(_hasAnalysisErrorWithErrorSeverity(context.getErrors(libASource)),
+        isTrue,
+        reason: "libA has an error");
+  }
+
+  void test_performAnalysisTask_IOException() {
+    TestSource source = _addSourceWithException2("/test.dart", "library test;");
+    source.generateExceptionOnRead = false;
+    _analyzeAll_assertFinished();
+    expect(source.readCount, 1);
+    _changeSource(source, "");
+    source.generateExceptionOnRead = true;
+    _analyzeAll_assertFinished();
+    if (AnalysisEngine.instance.limitInvalidationInTaskModel) {
+      expect(source.readCount, 5);
+    } else {
+      expect(source.readCount, 3);
+    }
+  }
+
+  void test_performAnalysisTask_missingPart() {
+    Source source =
+        addSource("/test.dart", "library lib; part 'no-such-file.dart';");
+    _analyzeAll_assertFinished();
+    expect(context.getLibraryElement(source), isNotNull,
+        reason: "performAnalysisTask failed to compute an element model");
+  }
+
+  void test_performAnalysisTask_modifiedAfterParse() {
+    // TODO(scheglov) no threads in Dart
+//    Source source = _addSource("/test.dart", "library lib;");
+//    int initialTime = _context.getModificationStamp(source);
+//    List<Source> sources = new List<Source>();
+//    sources.add(source);
+//    _context.analysisPriorityOrder = sources;
+//    _context.parseCompilationUnit(source);
+//    while (initialTime == JavaSystem.currentTimeMillis()) {
+//      Thread.sleep(1);
+//      // Force the modification time to be different.
+//    }
+//    _context.setContents(source, "library test;");
+//    JUnitTestCase.assertTrue(initialTime != _context.getModificationStamp(source));
+//    _analyzeAll_assertFinished();
+//    JUnitTestCase.assertNotNullMsg("performAnalysisTask failed to compute an element model", _context.getLibraryElement(source));
+  }
+
+  void test_performAnalysisTask_onResultComputed() {
+    Set<String> libraryElementUris = new Set<String>();
+    Set<String> parsedUnitUris = new Set<String>();
+    Set<String> resolvedUnitUris = new Set<String>();
+    // listen
+    context.onResultComputed(LIBRARY_ELEMENT).listen((event) {
+      Source librarySource = event.target;
+      libraryElementUris.add(librarySource.uri.toString());
+    });
+    context.onResultComputed(PARSED_UNIT).listen((event) {
+      Source source = event.target;
+      parsedUnitUris.add(source.uri.toString());
+    });
+    context.onResultComputed(RESOLVED_UNIT).listen((event) {
+      LibrarySpecificUnit target = event.target;
+      Source librarySource = target.library;
+      resolvedUnitUris.add(librarySource.uri.toString());
+    });
+    // analyze
+    addSource('/test.dart', 'main() {}');
+    _analyzeAll_assertFinished();
+    // verify
+    expect(libraryElementUris, contains('dart:core'));
+    expect(libraryElementUris, contains('file:///test.dart'));
+    expect(parsedUnitUris, contains('dart:core'));
+    expect(parsedUnitUris, contains('file:///test.dart'));
+    expect(resolvedUnitUris, contains('dart:core'));
+    expect(resolvedUnitUris, contains('file:///test.dart'));
+  }
+
+  void test_resolveCompilationUnit_import_relative() {
+    Source sourceA =
+        addSource("/libA.dart", "library libA; import 'libB.dart'; class A{}");
+    addSource("/libB.dart", "library libB; class B{}");
+    CompilationUnit compilationUnit =
+        context.resolveCompilationUnit2(sourceA, sourceA);
+    expect(compilationUnit, isNotNull);
+    LibraryElement library = compilationUnit.element.library;
+    List<LibraryElement> importedLibraries = library.importedLibraries;
+    assertNamedElements(importedLibraries, ["dart.core", "libB"]);
+    List<LibraryElement> visibleLibraries = library.visibleLibraries;
+    assertNamedElements(visibleLibraries,
+        ["dart.core", "dart.async", "dart.math", "libA", "libB"]);
+  }
+
+  void test_resolveCompilationUnit_import_relative_cyclic() {
+    Source sourceA =
+        addSource("/libA.dart", "library libA; import 'libB.dart'; class A{}");
+    addSource("/libB.dart", "library libB; import 'libA.dart'; class B{}");
+    CompilationUnit compilationUnit =
+        context.resolveCompilationUnit2(sourceA, sourceA);
+    expect(compilationUnit, isNotNull);
+    LibraryElement library = compilationUnit.element.library;
+    List<LibraryElement> importedLibraries = library.importedLibraries;
+    assertNamedElements(importedLibraries, ["dart.core", "libB"]);
+    List<LibraryElement> visibleLibraries = library.visibleLibraries;
+    assertNamedElements(visibleLibraries,
+        ["dart.core", "dart.async", "dart.math", "libA", "libB"]);
+  }
+
+//  void test_resolveCompilationUnit_sourceChangeDuringResolution() {
+//    _context = new _AnalysisContext_sourceChangeDuringResolution();
+//    AnalysisContextFactory.initContextWithCore(_context);
+//    _sourceFactory = _context.sourceFactory;
+//    Source source = _addSource("/lib.dart", "library lib;");
+//    CompilationUnit compilationUnit =
+//        _context.resolveCompilationUnit2(source, source);
+//    expect(compilationUnit, isNotNull);
+//    expect(_context.getLineInfo(source), isNotNull);
+//  }
+
+  void test_resolveCompilationUnit_library() {
+    Source source = addSource("/lib.dart", "library lib;");
+    LibraryElement library = context.computeLibraryElement(source);
+    CompilationUnit compilationUnit =
+        context.resolveCompilationUnit(source, library);
+    expect(compilationUnit, isNotNull);
+    expect(compilationUnit.element, isNotNull);
+  }
+
+  void test_resolveCompilationUnit_source() {
+    Source source = addSource("/lib.dart", "library lib;");
+    CompilationUnit compilationUnit =
+        context.resolveCompilationUnit2(source, source);
+    expect(compilationUnit, isNotNull);
+  }
+
+  void test_setAnalysisOptions() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.cacheSize = 42;
+    options.dart2jsHint = false;
+    options.hint = false;
+    context.analysisOptions = options;
+    AnalysisOptions result = context.analysisOptions;
+    expect(result.cacheSize, options.cacheSize);
+    expect(result.dart2jsHint, options.dart2jsHint);
+    expect(result.hint, options.hint);
+  }
+
+  void test_setAnalysisPriorityOrder() {
+    int priorityCount = 4;
+    List<Source> sources = new List<Source>();
+    for (int index = 0; index < priorityCount; index++) {
+      sources.add(addSource("/lib.dart$index", ""));
+    }
+    context.analysisPriorityOrder = sources;
+    expect(_getPriorityOrder(context).length, priorityCount);
+  }
+
+  void test_setAnalysisPriorityOrder_empty() {
+    context.analysisPriorityOrder = new List<Source>();
+  }
+
+  void test_setAnalysisPriorityOrder_nonEmpty() {
+    List<Source> sources = new List<Source>();
+    sources.add(addSource("/lib.dart", "library lib;"));
+    context.analysisPriorityOrder = sources;
+  }
+
+  Future test_setChangedContents_libraryWithPart() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.incremental = true;
+    context.analysisOptions = options;
+    SourcesChangedListener listener = new SourcesChangedListener();
+    context.onSourcesChanged.listen(listener.onData);
+    String oldCode = r'''
+library lib;
+part 'part.dart';
+int a = 0;''';
+    Source librarySource = addSource("/lib.dart", oldCode);
+    String partContents = r'''
+part of lib;
+int b = a;''';
+    Source partSource = addSource("/part.dart", partContents);
+    LibraryElement element = context.computeLibraryElement(librarySource);
+    CompilationUnit unit =
+        context.resolveCompilationUnit(librarySource, element);
+    expect(unit, isNotNull);
+    int offset = oldCode.indexOf("int a") + 4;
+    String newCode = r'''
+library lib;
+part 'part.dart';
+int ya = 0;''';
+    context.setChangedContents(librarySource, newCode, offset, 0, 1);
+    expect(context.getContents(librarySource).data, newCode);
+    expect(
+        context.getResolvedCompilationUnit2(partSource, librarySource), isNull);
+    return pumpEventQueue().then((_) {
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(changedSources: [librarySource]);
+      listener.assertNoMoreEvents();
+    });
+  }
+
+  void test_setChangedContents_notResolved() {
+    AnalysisOptionsImpl options =
+        new AnalysisOptionsImpl.from(context.analysisOptions);
+    options.incremental = true;
+    context.analysisOptions = options;
+    String oldCode = r'''
+library lib;
+int a = 0;''';
+    Source librarySource = addSource("/lib.dart", oldCode);
+    int offset = oldCode.indexOf("int a") + 4;
+    String newCode = r'''
+library lib;
+int ya = 0;''';
+    context.setChangedContents(librarySource, newCode, offset, 0, 1);
+    expect(context.getContents(librarySource).data, newCode);
+  }
+
+  Future test_setContents_libraryWithPart() {
+    SourcesChangedListener listener = new SourcesChangedListener();
+    context.onSourcesChanged.listen(listener.onData);
+    String libraryContents1 = r'''
+library lib;
+part 'part.dart';
+int a = 0;''';
+    Source librarySource = addSource("/lib.dart", libraryContents1);
+    String partContents1 = r'''
+part of lib;
+int b = a;''';
+    Source partSource = addSource("/part.dart", partContents1);
+    context.computeLibraryElement(librarySource);
+    String libraryContents2 = r'''
+library lib;
+part 'part.dart';
+int aa = 0;''';
+    context.setContents(librarySource, libraryContents2);
+    expect(
+        context.getResolvedCompilationUnit2(partSource, librarySource), isNull);
+    return pumpEventQueue().then((_) {
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(wereSourcesAdded: true);
+      listener.assertEvent(changedSources: [librarySource]);
+      listener.assertNoMoreEvents();
+    });
+  }
+
+  void test_setContents_null() {
+    Source librarySource = addSource(
+        "/lib.dart",
+        r'''
+library lib;
+int a = 0;''');
+    context.setContents(librarySource, '// different');
+    context.computeLibraryElement(librarySource);
+    context.setContents(librarySource, null);
+    expect(context.getResolvedCompilationUnit2(librarySource, librarySource),
+        isNull);
+  }
+
+  void test_setContents_unchanged_consistentModificationTime() {
+    String contents = "// foo";
+    Source source = addSource("/test.dart", contents);
+    context.setContents(source, contents);
+    // do all, no tasks
+    _analyzeAll_assertFinished();
+    {
+      AnalysisResult result = context.performAnalysisTask();
+      expect(result.changeNotices, isNull);
+    }
+    // set the same contents, still no tasks
+    context.setContents(source, contents);
+    {
+      AnalysisResult result = context.performAnalysisTask();
+      expect(result.changeNotices, isNull);
+    }
+  }
+
+  void test_setSourceFactory() {
+    expect(context.sourceFactory, sourceFactory);
+    SourceFactory factory = new SourceFactory([]);
+    context.sourceFactory = factory;
+    expect(context.sourceFactory, factory);
+  }
+
+  void test_updateAnalysis() {
+    expect(context.sourcesNeedingProcessing, isEmpty);
+    Source source = newSource('/test.dart');
+    AnalysisDelta delta = new AnalysisDelta();
+    delta.setAnalysisLevel(source, AnalysisLevel.ALL);
+    context.applyAnalysisDelta(delta);
+    expect(context.sourcesNeedingProcessing, contains(source));
+    delta = new AnalysisDelta();
+    delta.setAnalysisLevel(source, AnalysisLevel.NONE);
+    context.applyAnalysisDelta(delta);
+    expect(context.sourcesNeedingProcessing.contains(source), isFalse);
+  }
+
+  void xtest_performAnalysisTask_stress() {
+    int maxCacheSize = 4;
+    AnalysisOptionsImpl options =
+        new AnalysisOptionsImpl.from(context.analysisOptions);
+    options.cacheSize = maxCacheSize;
+    context.analysisOptions = options;
+    int sourceCount = maxCacheSize + 2;
+    List<Source> sources = new List<Source>();
+    ChangeSet changeSet = new ChangeSet();
+    for (int i = 0; i < sourceCount; i++) {
+      Source source = addSource("/lib$i.dart", "library lib$i;");
+      sources.add(source);
+      changeSet.addedSource(source);
+    }
+    context.applyChanges(changeSet);
+    context.analysisPriorityOrder = sources;
+    for (int i = 0; i < 1000; i++) {
+      List<ChangeNotice> notice = context.performAnalysisTask().changeNotices;
+      if (notice == null) {
+        //System.out.println("test_performAnalysisTask_stress: " + i);
+        break;
+      }
+    }
+    List<ChangeNotice> notice = context.performAnalysisTask().changeNotices;
+    if (notice != null) {
+      fail(
+          "performAnalysisTask failed to terminate after analyzing all sources");
+    }
+  }
+
+  TestSource _addSourceWithException(String fileName) {
+    return _addSourceWithException2(fileName, "");
+  }
+
+  TestSource _addSourceWithException2(String fileName, String contents) {
+    TestSource source = new TestSource(fileName, contents);
+    source.generateExceptionOnRead = true;
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(source);
+    context.applyChanges(changeSet);
+    return source;
+  }
+
+  /**
+   * Perform analysis tasks up to 512 times and assert that it was enough.
+   */
+  void _analyzeAll_assertFinished([int maxIterations = 512]) {
+    for (int i = 0; i < maxIterations; i++) {
+      List<ChangeNotice> notice = context.performAnalysisTask().changeNotices;
+      if (notice == null) {
+        return;
+      }
+    }
+    fail("performAnalysisTask failed to terminate after analyzing all sources");
+  }
+
+  void _changeSource(TestSource source, String contents) {
+    source.setContents(contents);
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.changedSource(source);
+    context.applyChanges(changeSet);
+  }
+
+  /**
+   * Search the given compilation unit for a class with the given name. Return the class with the
+   * given name, or `null` if the class cannot be found.
+   *
+   * @param unit the compilation unit being searched
+   * @param className the name of the class being searched for
+   * @return the class with the given name
+   */
+  ClassElement _findClass(CompilationUnitElement unit, String className) {
+    for (ClassElement classElement in unit.types) {
+      if (classElement.displayName == className) {
+        return classElement;
+      }
+    }
+    return null;
+  }
+
+  void _flushAst(Source source) {
+    CacheEntry entry =
+        context.getCacheEntry(new LibrarySpecificUnit(source, source));
+    entry.setState(RESOLVED_UNIT, CacheState.FLUSHED);
+  }
+
+  List<Source> _getPriorityOrder(AnalysisContextImpl context2) {
+    return context2.test_priorityOrder;
+  }
+
+  void _performPendingAnalysisTasks([int maxTasks = 512]) {
+    for (int i = 0; context.performAnalysisTask().hasMoreWork; i++) {
+      if (i > maxTasks) {
+        fail('Analysis did not terminate.');
+      }
+    }
+  }
+
+  void _removeSource(Source source) {
+    resourceProvider.deleteFile(source.fullName);
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.removedSource(source);
+    context.applyChanges(changeSet);
+  }
+
+  /**
+   * Returns `true` if there is an [AnalysisError] with [ErrorSeverity.ERROR] in
+   * the given [AnalysisErrorInfo].
+   */
+  static bool _hasAnalysisErrorWithErrorSeverity(AnalysisErrorInfo errorInfo) {
+    List<AnalysisError> errors = errorInfo.errors;
+    for (AnalysisError analysisError in errors) {
+      if (analysisError.errorCode.errorSeverity == ErrorSeverity.ERROR) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+@reflectiveTest
+class LimitedInvalidateTest extends AbstractContextTest {
+  @override
+  void setUp() {
+    AnalysisEngine.instance.limitInvalidationInTaskModel = true;
+    super.setUp();
+    AnalysisOptionsImpl options =
+        new AnalysisOptionsImpl.from(context.analysisOptions);
+    options.incremental = true;
+    context.analysisOptions = options;
+  }
+
+  @override
+  void tearDown() {
+    AnalysisEngine.instance.limitInvalidationInTaskModel = false;
+    super.tearDown();
+  }
+
+  void test_noChange_thenChange() {
+    Source sourceA = addSource(
+        "/a.dart",
+        r'''
+library lib_a;
+
+class A {
+  A();
+}
+class B {
+  B();
+}
+''');
+    Source sourceB = addSource(
+        "/b.dart",
+        r'''
+library lib_b;
+import 'a.dart';
+main() {
+  new A();
+}
+''');
+    _performPendingAnalysisTasks();
+    expect(context.getErrors(sourceA).errors, hasLength(0));
+    expect(context.getErrors(sourceB).errors, hasLength(0));
+    var unitA = context.getResolvedCompilationUnit2(sourceA, sourceA);
+    var unitElementA = unitA.element;
+    var libraryElementA = unitElementA.library;
+    // Update a.dart, no declaration changes.
+    context.setContents(
+        sourceA,
+        r'''
+library lib_a;
+class A {
+  A();
+}
+class B {
+  B();
+}
+''');
+    _assertInvalid(sourceA, LIBRARY_ERRORS_READY);
+    _assertValid(sourceB, LIBRARY_ERRORS_READY);
+    // The a.dart's unit and element are updated incrementally.
+    // They are the same instances as initially.
+    // So, all the references from other units are still valid.
+    {
+      LibrarySpecificUnit target = new LibrarySpecificUnit(sourceA, sourceA);
+      expect(analysisCache.getValue(target, RESOLVED_UNIT1), same(unitA));
+      expect(unitA.element, same(unitElementA));
+      expect(unitElementA.library, same(libraryElementA));
+    }
+    // Analyze.
+    _performPendingAnalysisTasks();
+    expect(context.getErrors(sourceA).errors, hasLength(0));
+    expect(context.getErrors(sourceB).errors, hasLength(0));
+    // The a.dart's unit and element are the same.
+    {
+      LibrarySpecificUnit target = new LibrarySpecificUnit(sourceA, sourceA);
+      expect(analysisCache.getValue(target, RESOLVED_UNIT), same(unitA));
+      expect(unitA.element, same(unitElementA));
+      expect(unitElementA.library, same(libraryElementA));
+    }
+    // Update a.dart, rename A to A2, invalidates b.dart, so
+    // we know that the previous update did not damage dependencies.
+    context.setContents(
+        sourceA,
+        r'''
+library lib_a;
+class A {
+  A();
+  m() {}
+}
+class B {
+  B();
+}
+''');
+    _assertInvalid(sourceA, LIBRARY_ERRORS_READY);
+    _assertInvalid(sourceB, LIBRARY_ERRORS_READY);
+    // The a.dart's unit and element are the same.
+    {
+      LibrarySpecificUnit target = new LibrarySpecificUnit(sourceA, sourceA);
+      expect(analysisCache.getValue(target, RESOLVED_UNIT1), same(unitA));
+      expect(unitA.element, same(unitElementA));
+      expect(unitElementA.library, same(libraryElementA));
+    }
+    // Analyze.
+    _performPendingAnalysisTasks();
+    expect(context.getErrors(sourceA).errors, hasLength(0));
+    expect(context.getErrors(sourceB).errors, hasLength(0));
+  }
+
+  void test_unusedName() {
+    Source sourceA = addSource(
+        "/a.dart",
+        r'''
+library lib_a;
+class A {}
+class B {}
+class C {}
+''');
+    Source sourceB = addSource(
+        "/b.dart",
+        r'''
+library lib_b;
+import 'a.dart';
+main() {
+  new A();
+  new C();
+}
+''');
+    _performPendingAnalysisTasks();
+    // Update A.
+    context.setContents(
+        sourceA,
+        r'''
+library lib_a;
+class A {}
+class B2 {}
+class C {}
+''');
+    // Only a.dart is invalidated.
+    // Because b.dart does not use B, so it is valid.
+    _assertInvalid(sourceA, LIBRARY_ERRORS_READY);
+    _assertValid(sourceB, LIBRARY_ERRORS_READY);
+  }
+
+  void test_usedName_directUser() {
+    Source sourceA = addSource(
+        "/a.dart",
+        r'''
+library lib_a;
+class A {}
+class B {}
+class C {}
+''');
+    Source sourceB = addSource(
+        "/b.dart",
+        r'''
+library lib_b;
+import 'a.dart';
+main() {
+  new A();
+  new C2();
+}
+''');
+    _performPendingAnalysisTasks();
+    expect(context.getErrors(sourceB).errors, hasLength(1));
+    // Update a.dart, invalidates b.dart because it references "C2".
+    context.setContents(
+        sourceA,
+        r'''
+library lib_a;
+class A {}
+class B {}
+class C2 {}
+''');
+    _assertInvalid(sourceA, LIBRARY_ERRORS_READY);
+    _assertInvalid(sourceB, LIBRARY_ERRORS_READY);
+    // Now b.dart is analyzed and the error is fixed.
+    _performPendingAnalysisTasks();
+    expect(context.getErrors(sourceB).errors, hasLength(0));
+    // Update a.dart, invalidates b.dart because it references "C".
+    context.setContents(
+        sourceA,
+        r'''
+library lib_a;
+class A {}
+class B {}
+class C {}
+''');
+    _assertInvalid(sourceA, LIBRARY_ERRORS_READY);
+    _assertInvalid(sourceB, LIBRARY_ERRORS_READY);
+    _performPendingAnalysisTasks();
+    // Now b.dart is analyzed and it again has the error.
+    expect(context.getErrors(sourceB).errors, hasLength(1));
+  }
+
+  void test_usedName_directUser_withIncremental() {
+    Source sourceA = addSource(
+        "/a.dart",
+        r'''
+library lib_a;
+class A {
+  m() {}
+}
+''');
+    Source sourceB = addSource(
+        "/b.dart",
+        r'''
+library lib_b;
+import 'a.dart';
+main() {
+  A a = new A();
+  a.m();
+}
+''');
+    _performPendingAnalysisTasks();
+    // Update A.
+    context.setContents(
+        sourceA,
+        r'''
+library lib_a;
+class A {
+  m2() {}
+}
+''');
+    _assertInvalid(sourceA, LIBRARY_ERRORS_READY);
+    _assertInvalid(sourceB, LIBRARY_ERRORS_READY);
+  }
+
+  void test_usedName_indirectUser() {
+    Source sourceA = addSource(
+        "/a.dart",
+        r'''
+library lib_a;
+class A {
+  m() {}
+}
+''');
+    Source sourceB = addSource(
+        "/b.dart",
+        r'''
+library lib_b;
+import 'a.dart';
+class B extends A {}
+''');
+    Source sourceC = addSource(
+        "/c.dart",
+        r'''
+library lib_c;
+import 'b.dart';
+class C extends B {
+  main() {
+    m();
+  }
+}
+''');
+    // No errors, "A.m" exists.
+    _performPendingAnalysisTasks();
+    expect(context.getErrors(sourceC).errors, hasLength(0));
+    // Replace "A.m" with "A.m2", invalidate both b.dart and c.dart files.
+    context.setContents(
+        sourceA,
+        r'''
+library lib_a;
+class A {
+  m2() {}
+}
+''');
+    _assertInvalid(sourceA, LIBRARY_ERRORS_READY);
+    _assertInvalid(sourceB, LIBRARY_ERRORS_READY);
+    _assertInvalid(sourceC, LIBRARY_ERRORS_READY);
+    // There is an error in c.dart, "A.m" does not exist.
+    _performPendingAnalysisTasks();
+    expect(context.getErrors(sourceB).errors, hasLength(0));
+    expect(context.getErrors(sourceC).errors, hasLength(1));
+    // Restore "A.m", invalidate both b.dart and c.dart files.
+    context.setContents(
+        sourceA,
+        r'''
+library lib_a;
+class A {
+  m() {}
+}
+''');
+    _assertInvalid(sourceA, LIBRARY_ERRORS_READY);
+    _assertInvalid(sourceB, LIBRARY_ERRORS_READY);
+    _assertInvalid(sourceC, LIBRARY_ERRORS_READY);
+    // No errors, "A.m" exists.
+    _performPendingAnalysisTasks();
+    expect(context.getErrors(sourceC).errors, hasLength(0));
+  }
+
+  void _assertInvalid(AnalysisTarget target, ResultDescriptor descriptor) {
+    CacheState state = analysisCache.getState(target, descriptor);
+    expect(state, CacheState.INVALID);
+  }
+
+  void _assertValid(AnalysisTarget target, ResultDescriptor descriptor) {
+    CacheState state = analysisCache.getState(target, descriptor);
+    expect(state, CacheState.VALID);
+  }
+
+  void _performPendingAnalysisTasks([int maxTasks = 512]) {
+    for (int i = 0; context.performAnalysisTask().hasMoreWork; i++) {
+      if (i > maxTasks) {
+        fail('Analysis did not terminate.');
+      }
+    }
+  }
+}
+
+class _AnalysisContextImplTest_test_applyChanges_removeContainer
+    implements SourceContainer {
+  Source libB;
+  _AnalysisContextImplTest_test_applyChanges_removeContainer(this.libB);
+  @override
+  bool contains(Source source) => source == libB;
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/context/mock_sdk.dart b/mojo/public/dart/third_party/analyzer/test/src/context/mock_sdk.dart
new file mode 100644
index 0000000..e5b7bcb
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/context/mock_sdk.dart
@@ -0,0 +1,337 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.mock_sdk;
+
+import 'package:analyzer/file_system/file_system.dart' as resource;
+import 'package:analyzer/file_system/memory_file_system.dart' as resource;
+import 'package:analyzer/src/context/cache.dart';
+import 'package:analyzer/src/context/context.dart';
+import 'package:analyzer/src/generated/engine.dart'
+    show AnalysisEngine, ChangeSet;
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+class MockSdk implements DartSdk {
+  static const _MockSdkLibrary LIB_CORE = const _MockSdkLibrary('dart:core',
+      '/lib/core/core.dart', '''
+library dart.core;
+
+import 'dart:async';
+
+class Object {
+  bool operator ==(other) => identical(this, other);
+  String toString() => 'a string';
+  int get hashCode => 0;
+}
+
+class Function {}
+class StackTrace {}
+class Symbol {}
+class Type {}
+
+abstract class Comparable<T> {
+  int compareTo(T other);
+}
+
+abstract class String implements Comparable<String> {
+  external factory String.fromCharCodes(Iterable<int> charCodes,
+                                        [int start = 0, int end]);
+  bool get isEmpty => false;
+  bool get isNotEmpty => false;
+  int get length => 0;
+  String toUpperCase();
+  List<int> get codeUnits;
+}
+
+class bool extends Object {}
+abstract class num implements Comparable<num> {
+  bool operator <(num other);
+  bool operator <=(num other);
+  bool operator >(num other);
+  bool operator >=(num other);
+  num operator +(num other);
+  num operator -(num other);
+  num operator *(num other);
+  num operator /(num other);
+  int toInt();
+  num abs();
+  int round();
+}
+abstract class int extends num {
+  bool get isEven => false;
+  int operator -();
+  external static int parse(String source,
+                            { int radix,
+                              int onError(String source) });
+}
+class double extends num {}
+class DateTime extends Object {}
+class Null extends Object {}
+
+class Deprecated extends Object {
+  final String expires;
+  const Deprecated(this.expires);
+}
+const Object deprecated = const Deprecated("next release");
+
+class Iterator<E> {
+  bool moveNext();
+  E get current;
+}
+
+abstract class Iterable<E> {
+  Iterator<E> get iterator;
+  bool get isEmpty;
+}
+
+abstract class List<E> implements Iterable<E> {
+  void add(E value);
+  E operator [](int index);
+  void operator []=(int index, E value);
+  Iterator<E> get iterator => null;
+  void clear();
+}
+
+abstract class Map<K, V> extends Object {
+  Iterable<K> get keys;
+}
+
+external bool identical(Object a, Object b);
+
+void print(Object object) {}
+
+class _Override {
+  const _Override();
+}
+const Object override = const _Override();
+''');
+
+  static const _MockSdkLibrary LIB_ASYNC = const _MockSdkLibrary('dart:async',
+      '/lib/async/async.dart', '''
+library dart.async;
+
+import 'dart:math';
+
+class Future<T> {
+  factory Future.delayed(Duration duration, [T computation()]) => null;
+  factory Future.value([value]) => null;
+  static Future wait(List<Future> futures) => null;
+}
+
+class Stream<T> {}
+abstract class StreamTransformer<S, T> {}
+''');
+
+  static const _MockSdkLibrary LIB_COLLECTION = const _MockSdkLibrary(
+      'dart:collection', '/lib/collection/collection.dart', '''
+library dart.collection;
+
+abstract class HashMap<K, V> implements Map<K, V> {}
+''');
+
+  static const _MockSdkLibrary LIB_CONVERT = const _MockSdkLibrary(
+      'dart:convert', '/lib/convert/convert.dart', '''
+library dart.convert;
+
+import 'dart:async';
+
+abstract class Converter<S, T> implements StreamTransformer {}
+class JsonDecoder extends Converter<String, Object> {}
+''');
+
+  static const _MockSdkLibrary LIB_MATH = const _MockSdkLibrary('dart:math',
+      '/lib/math/math.dart', '''
+library dart.math;
+const double E = 2.718281828459045;
+const double PI = 3.1415926535897932;
+const double LN10 =  2.302585092994046;
+num min(num a, num b) => 0;
+num max(num a, num b) => 0;
+external double cos(num x);
+external double sin(num x);
+external double sqrt(num x);
+class Random {
+  bool nextBool() => true;
+  double nextDouble() => 2.0;
+  int nextInt() => 1;
+}
+''');
+
+  static const _MockSdkLibrary LIB_HTML = const _MockSdkLibrary('dart:html',
+      '/lib/html/dartium/html_dartium.dart', '''
+library dart.html;
+class HtmlElement {}
+''');
+
+  static const List<SdkLibrary> LIBRARIES = const [
+    LIB_CORE,
+    LIB_ASYNC,
+    LIB_COLLECTION,
+    LIB_CONVERT,
+    LIB_MATH,
+    LIB_HTML,
+  ];
+
+  final resource.MemoryResourceProvider provider =
+      new resource.MemoryResourceProvider();
+
+  /**
+   * The [AnalysisContextImpl] which is used for all of the sources.
+   */
+  AnalysisContextImpl _analysisContext;
+
+  MockSdk() {
+    LIBRARIES.forEach((_MockSdkLibrary library) {
+      provider.newFile(library.path, library.content);
+    });
+  }
+
+  @override
+  AnalysisContextImpl get context {
+    if (_analysisContext == null) {
+      _analysisContext = new _SdkAnalysisContext(this);
+      SourceFactory factory = new SourceFactory([new DartUriResolver(this)]);
+      _analysisContext.sourceFactory = factory;
+      ChangeSet changeSet = new ChangeSet();
+      for (String uri in uris) {
+        Source source = factory.forUri(uri);
+        changeSet.addedSource(source);
+      }
+      _analysisContext.applyChanges(changeSet);
+    }
+    return _analysisContext;
+  }
+
+  @override
+  List<SdkLibrary> get sdkLibraries => LIBRARIES;
+
+  @override
+  String get sdkVersion => throw unimplemented;
+
+  UnimplementedError get unimplemented => new UnimplementedError();
+
+  @override
+  List<String> get uris {
+    List<String> uris = <String>[];
+    for (SdkLibrary library in LIBRARIES) {
+      uris.add(library.shortName);
+    }
+    return uris;
+  }
+
+  @override
+  Source fromFileUri(Uri uri) {
+    String filePath = uri.path;
+    String libPath = '/lib';
+    if (!filePath.startsWith("$libPath/")) {
+      return null;
+    }
+    for (SdkLibrary library in LIBRARIES) {
+      String libraryPath = library.path;
+      if (filePath.replaceAll('\\', '/') == libraryPath) {
+        try {
+          resource.File file = provider.getResource(uri.path);
+          Uri dartUri = Uri.parse(library.shortName);
+          return file.createSource(dartUri);
+        } catch (exception) {
+          return null;
+        }
+      }
+      if (filePath.startsWith("$libraryPath/")) {
+        String pathInLibrary = filePath.substring(libraryPath.length + 1);
+        String path = '${library.shortName}/${pathInLibrary}';
+        try {
+          resource.File file = provider.getResource(uri.path);
+          Uri dartUri = new Uri(scheme: 'dart', path: path);
+          return file.createSource(dartUri);
+        } catch (exception) {
+          return null;
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  SdkLibrary getSdkLibrary(String dartUri) {
+    // getSdkLibrary() is only used to determine whether a library is internal
+    // to the SDK.  The mock SDK doesn't have any internals, so it's safe to
+    // return null.
+    return null;
+  }
+
+  @override
+  Source mapDartUri(String dartUri) {
+    const Map<String, String> uriToPath = const {
+      "dart:core": "/lib/core/core.dart",
+      "dart:html": "/lib/html/dartium/html_dartium.dart",
+      "dart:async": "/lib/async/async.dart",
+      "dart:collection": "/lib/collection/collection.dart",
+      "dart:convert": "/lib/convert/convert.dart",
+      "dart:math": "/lib/math/math.dart"
+    };
+
+    String path = uriToPath[dartUri];
+    if (path != null) {
+      resource.File file = provider.getResource(path);
+      Uri uri = new Uri(scheme: 'dart', path: dartUri.substring(5));
+      return file.createSource(uri);
+    }
+
+    // If we reach here then we tried to use a dartUri that's not in the
+    // table above.
+    return null;
+  }
+}
+
+class _MockSdkLibrary implements SdkLibrary {
+  final String shortName;
+  final String path;
+  final String content;
+
+  const _MockSdkLibrary(this.shortName, this.path, this.content);
+
+  @override
+  String get category => throw unimplemented;
+
+  @override
+  bool get isDart2JsLibrary => throw unimplemented;
+
+  @override
+  bool get isDocumented => throw unimplemented;
+
+  @override
+  bool get isImplementation => throw unimplemented;
+
+  @override
+  bool get isInternal => throw unimplemented;
+
+  @override
+  bool get isShared => throw unimplemented;
+
+  @override
+  bool get isVmLibrary => throw unimplemented;
+
+  UnimplementedError get unimplemented => new UnimplementedError();
+}
+
+/**
+ * An [AnalysisContextImpl] that only contains sources for a Dart SDK.
+ */
+class _SdkAnalysisContext extends AnalysisContextImpl {
+  final DartSdk sdk;
+
+  _SdkAnalysisContext(this.sdk);
+
+  @override
+  AnalysisCache createCacheFromSourceFactory(SourceFactory factory) {
+    if (factory == null) {
+      return super.createCacheFromSourceFactory(factory);
+    }
+    return new AnalysisCache(<CachePartition>[
+      AnalysisEngine.instance.partitionManager_new.forSdk(sdk)
+    ]);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/context/test_all.dart b/mojo/public/dart/third_party/analyzer/test/src/context/test_all.dart
new file mode 100644
index 0000000..bbd021d
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/context/test_all.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.context.test_all;
+
+import 'package:unittest/unittest.dart';
+
+import '../../utils.dart';
+import 'cache_test.dart' as cache_test;
+import 'context_test.dart' as context_test;
+
+/// Utility for manually running all tests.
+main() {
+  initializeTestEnvironment();
+  group('context tests', () {
+    cache_test.main();
+    context_test.main();
+  });
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/mock_sdk.dart b/mojo/public/dart/third_party/analyzer/test/src/mock_sdk.dart
new file mode 100644
index 0000000..1487f4a
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/mock_sdk.dart
@@ -0,0 +1,320 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.mock_sdk;
+
+import 'package:analyzer/file_system/file_system.dart' as resource;
+import 'package:analyzer/file_system/memory_file_system.dart' as resource;
+import 'package:analyzer/src/context/context.dart' as newContext;
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+class MockSdk implements DartSdk {
+  static const _MockSdkLibrary LIB_CORE = const _MockSdkLibrary('dart:core',
+      '/lib/core/core.dart', '''
+library dart.core;
+
+import 'dart:async';
+
+class Object {
+  bool operator ==(other) => identical(this, other);
+  String toString() => 'a string';
+  int get hashCode => 0;
+}
+
+class Function {}
+class StackTrace {}
+class Symbol {}
+class Type {}
+
+abstract class Comparable<T> {
+  int compareTo(T other);
+}
+
+abstract class String implements Comparable<String> {
+  external factory String.fromCharCodes(Iterable<int> charCodes,
+                                        [int start = 0, int end]);
+  bool get isEmpty => false;
+  bool get isNotEmpty => false;
+  int get length => 0;
+  String toUpperCase();
+  List<int> get codeUnits;
+}
+
+class bool extends Object {}
+abstract class num implements Comparable<num> {
+  bool operator <(num other);
+  bool operator <=(num other);
+  bool operator >(num other);
+  bool operator >=(num other);
+  num operator +(num other);
+  num operator -(num other);
+  num operator *(num other);
+  num operator /(num other);
+  int toInt();
+  num abs();
+  int round();
+}
+abstract class int extends num {
+  bool get isEven => false;
+  int operator -();
+  external static int parse(String source,
+                            { int radix,
+                              int onError(String source) });
+}
+class double extends num {}
+class DateTime extends Object {}
+class Null extends Object {}
+
+class Deprecated extends Object {
+  final String expires;
+  const Deprecated(this.expires);
+}
+const Object deprecated = const Deprecated("next release");
+
+class Iterator<E> {
+  bool moveNext();
+  E get current;
+}
+
+abstract class Iterable<E> {
+  Iterator<E> get iterator;
+  bool get isEmpty;
+}
+
+abstract class List<E> implements Iterable<E> {
+  void add(E value);
+  E operator [](int index);
+  void operator []=(int index, E value);
+  Iterator<E> get iterator => null;
+  void clear();
+}
+
+abstract class Map<K, V> extends Object {
+  Iterable<K> get keys;
+}
+
+external bool identical(Object a, Object b);
+
+void print(Object object) {}
+
+class _Override {
+  const _Override();
+}
+const Object override = const _Override();
+''');
+
+  static const _MockSdkLibrary LIB_ASYNC = const _MockSdkLibrary('dart:async',
+      '/lib/async/async.dart', '''
+library dart.async;
+
+import 'dart:math';
+
+class Future<T> {
+  factory Future.delayed(Duration duration, [T computation()]) => null;
+  factory Future.value([value]) => null;
+  static Future wait(List<Future> futures) => null;
+}
+
+class Stream<T> {}
+abstract class StreamTransformer<S, T> {}
+''');
+
+  static const _MockSdkLibrary LIB_COLLECTION = const _MockSdkLibrary(
+      'dart:collection', '/lib/collection/collection.dart', '''
+library dart.collection;
+
+abstract class HashMap<K, V> implements Map<K, V> {}
+''');
+
+  static const _MockSdkLibrary LIB_CONVERT = const _MockSdkLibrary(
+      'dart:convert', '/lib/convert/convert.dart', '''
+library dart.convert;
+
+import 'dart:async';
+
+abstract class Converter<S, T> implements StreamTransformer {}
+class JsonDecoder extends Converter<String, Object> {}
+''');
+
+  static const _MockSdkLibrary LIB_MATH = const _MockSdkLibrary('dart:math',
+      '/lib/math/math.dart', '''
+library dart.math;
+const double E = 2.718281828459045;
+const double PI = 3.1415926535897932;
+const double LN10 =  2.302585092994046;
+num min(num a, num b) => 0;
+num max(num a, num b) => 0;
+external double cos(num x);
+external double sin(num x);
+external double sqrt(num x);
+class Random {
+  bool nextBool() => true;
+  double nextDouble() => 2.0;
+  int nextInt() => 1;
+}
+''');
+
+  static const _MockSdkLibrary LIB_HTML = const _MockSdkLibrary('dart:html',
+      '/lib/html/dartium/html_dartium.dart', '''
+library dart.html;
+class HtmlElement {}
+''');
+
+  static const List<SdkLibrary> LIBRARIES = const [
+    LIB_CORE,
+    LIB_ASYNC,
+    LIB_COLLECTION,
+    LIB_CONVERT,
+    LIB_MATH,
+    LIB_HTML,
+  ];
+
+  final resource.MemoryResourceProvider provider =
+      new resource.MemoryResourceProvider();
+
+  /**
+   * The [AnalysisContext] which is used for all of the sources.
+   */
+  InternalAnalysisContext _analysisContext;
+
+  MockSdk() {
+    LIBRARIES.forEach((_MockSdkLibrary library) {
+      provider.newFile(library.path, library.content);
+    });
+  }
+
+  @override
+  AnalysisContext get context {
+    if (_analysisContext == null) {
+      if (AnalysisEngine.instance.useTaskModel) {
+        _analysisContext = new newContext.SdkAnalysisContext();
+      } else {
+        _analysisContext = new SdkAnalysisContext();
+      }
+      SourceFactory factory = new SourceFactory([new DartUriResolver(this)]);
+      _analysisContext.sourceFactory = factory;
+      ChangeSet changeSet = new ChangeSet();
+      for (String uri in uris) {
+        Source source = factory.forUri(uri);
+        changeSet.addedSource(source);
+      }
+      _analysisContext.applyChanges(changeSet);
+    }
+    return _analysisContext;
+  }
+
+  @override
+  List<SdkLibrary> get sdkLibraries => LIBRARIES;
+
+  @override
+  String get sdkVersion => throw unimplemented;
+
+  UnimplementedError get unimplemented => new UnimplementedError();
+
+  @override
+  List<String> get uris {
+    List<String> uris = <String>[];
+    for (SdkLibrary library in LIBRARIES) {
+      uris.add(library.shortName);
+    }
+    return uris;
+  }
+
+  @override
+  Source fromFileUri(Uri uri) {
+    String filePath = uri.path;
+    String libPath = '/lib';
+    if (!filePath.startsWith("$libPath/")) {
+      return null;
+    }
+    for (SdkLibrary library in LIBRARIES) {
+      String libraryPath = library.path;
+      if (filePath.replaceAll('\\', '/') == libraryPath) {
+        try {
+          resource.File file = provider.getResource(uri.path);
+          Uri dartUri = Uri.parse(library.shortName);
+          return file.createSource(dartUri);
+        } catch (exception) {
+          return null;
+        }
+      }
+      if (filePath.startsWith("$libraryPath/")) {
+        String pathInLibrary = filePath.substring(libraryPath.length + 1);
+        String path = '${library.shortName}/${pathInLibrary}';
+        try {
+          resource.File file = provider.getResource(uri.path);
+          Uri dartUri = new Uri(scheme: 'dart', path: path);
+          return file.createSource(dartUri);
+        } catch (exception) {
+          return null;
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  SdkLibrary getSdkLibrary(String dartUri) {
+    // getSdkLibrary() is only used to determine whether a library is internal
+    // to the SDK.  The mock SDK doesn't have any internals, so it's safe to
+    // return null.
+    return null;
+  }
+
+  @override
+  Source mapDartUri(String dartUri) {
+    const Map<String, String> uriToPath = const {
+      "dart:core": "/lib/core/core.dart",
+      "dart:html": "/lib/html/dartium/html_dartium.dart",
+      "dart:async": "/lib/async/async.dart",
+      "dart:collection": "/lib/collection/collection.dart",
+      "dart:convert": "/lib/convert/convert.dart",
+      "dart:math": "/lib/math/math.dart"
+    };
+
+    String path = uriToPath[dartUri];
+    if (path != null) {
+      resource.File file = provider.getResource(path);
+      Uri uri = new Uri(scheme: 'dart', path: dartUri.substring(5));
+      return file.createSource(uri);
+    }
+
+    // If we reach here then we tried to use a dartUri that's not in the
+    // table above.
+    return null;
+  }
+}
+
+class _MockSdkLibrary implements SdkLibrary {
+  final String shortName;
+  final String path;
+  final String content;
+
+  const _MockSdkLibrary(this.shortName, this.path, this.content);
+
+  @override
+  String get category => throw unimplemented;
+
+  @override
+  bool get isDart2JsLibrary => throw unimplemented;
+
+  @override
+  bool get isDocumented => throw unimplemented;
+
+  @override
+  bool get isImplementation => throw unimplemented;
+
+  @override
+  bool get isInternal => throw unimplemented;
+
+  @override
+  bool get isShared => throw unimplemented;
+
+  @override
+  bool get isVmLibrary => throw unimplemented;
+
+  UnimplementedError get unimplemented => new UnimplementedError();
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/task/dart_test.dart b/mojo/public/dart/third_party/analyzer/test/src/task/dart_test.dart
new file mode 100644
index 0000000..f218461
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/task/dart_test.dart
@@ -0,0 +1,3057 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.task.dart_test;
+
+import 'package:analyzer/src/context/cache.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/constant.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart'
+    show AnalysisOptionsImpl, CacheState;
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/task/dart.dart';
+import 'package:analyzer/src/task/html.dart';
+import 'package:analyzer/task/dart.dart';
+import 'package:analyzer/task/general.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../generated/test_support.dart';
+import '../../reflective_tests.dart';
+import '../../utils.dart';
+import '../context/abstract_context.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(BuildCompilationUnitElementTaskTest);
+  runReflectiveTests(BuildDirectiveElementsTaskTest);
+  runReflectiveTests(BuildEnumMemberElementsTaskTest);
+  runReflectiveTests(BuildSourceExportClosureTaskTest);
+  runReflectiveTests(BuildSourceImportExportClosureTaskTest);
+  runReflectiveTests(BuildExportNamespaceTaskTest);
+  runReflectiveTests(BuildLibraryElementTaskTest);
+  runReflectiveTests(BuildPublicNamespaceTaskTest);
+  runReflectiveTests(BuildTypeProviderTaskTest);
+  runReflectiveTests(ComputeConstantDependenciesTaskTest);
+  runReflectiveTests(ComputeConstantValueTaskTest);
+  runReflectiveTests(ComputeInferableStaticVariableDependenciesTaskTest);
+  runReflectiveTests(ContainingLibrariesTaskTest);
+  runReflectiveTests(DartErrorsTaskTest);
+  runReflectiveTests(EvaluateUnitConstantsTaskTest);
+  runReflectiveTests(GatherUsedImportedElementsTaskTest);
+  runReflectiveTests(GatherUsedLocalElementsTaskTest);
+  runReflectiveTests(GenerateHintsTaskTest);
+  runReflectiveTests(InferStaticVariableTypesInUnitTaskTest);
+  runReflectiveTests(InferStaticVariableTypeTaskTest);
+  runReflectiveTests(LibraryErrorsReadyTaskTest);
+  runReflectiveTests(LibraryUnitErrorsTaskTest);
+  runReflectiveTests(ParseDartTaskTest);
+  runReflectiveTests(PartiallyResolveReferencesTaskTest);
+  runReflectiveTests(ResolveUnitTypeNamesTaskTest);
+  runReflectiveTests(ResolveLibraryTypeNamesTaskTest);
+  runReflectiveTests(ResolveReferencesTaskTest);
+  runReflectiveTests(ResolveVariableReferencesTaskTest);
+  runReflectiveTests(ScanDartTaskTest);
+  runReflectiveTests(VerifyUnitTaskTest);
+}
+
+@reflectiveTest
+class BuildCompilationUnitElementTaskTest extends _AbstractDartTaskTest {
+  Source source;
+  LibrarySpecificUnit target;
+
+  test_buildInputs() {
+    LibrarySpecificUnit target =
+        new LibrarySpecificUnit(emptySource, emptySource);
+    Map<String, TaskInput> inputs =
+        BuildCompilationUnitElementTask.buildInputs(target);
+    expect(inputs, isNotNull);
+    expect(
+        inputs.keys,
+        unorderedEquals(
+            [BuildCompilationUnitElementTask.PARSED_UNIT_INPUT_NAME]));
+  }
+
+  test_constructor() {
+    BuildCompilationUnitElementTask task =
+        new BuildCompilationUnitElementTask(context, emptySource);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, emptySource);
+  }
+
+  test_createTask() {
+    BuildCompilationUnitElementTask task =
+        BuildCompilationUnitElementTask.createTask(context, emptySource);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, emptySource);
+  }
+
+  test_description() {
+    BuildCompilationUnitElementTask task =
+        new BuildCompilationUnitElementTask(null, emptySource);
+    expect(task.description, isNotNull);
+  }
+
+  test_descriptor() {
+    TaskDescriptor descriptor = BuildCompilationUnitElementTask.DESCRIPTOR;
+    expect(descriptor, isNotNull);
+  }
+
+  test_perform_find_constants() {
+    _performBuildTask('''
+const x = 1;
+class C {
+  static const y = 1;
+  const C([p = 1]);
+}
+@x
+f() {
+  const z = 1;
+}
+''');
+    CompilationUnit unit = outputs[RESOLVED_UNIT1];
+    CompilationUnitElement unitElement = outputs[COMPILATION_UNIT_ELEMENT];
+    Annotation annotation = unit.declarations
+        .firstWhere((m) => m is FunctionDeclaration)
+        .metadata[0];
+    List<ConstantEvaluationTarget> expectedConstants = [
+      unitElement.accessors.firstWhere((e) => e.isGetter).variable,
+      unitElement.types[0].fields[0],
+      unitElement.functions[0].localVariables[0],
+      unitElement.types[0].constructors[0],
+      new ConstantEvaluationTarget_Annotation(
+          context, source, source, annotation),
+      unitElement.types[0].constructors[0].parameters[0]
+    ];
+    expect(
+        outputs[COMPILATION_UNIT_CONSTANTS].toSet(), expectedConstants.toSet());
+  }
+
+  test_perform_library() {
+    _performBuildTask(r'''
+library lib;
+import 'lib2.dart';
+export 'lib3.dart';
+part 'part.dart';
+final x = '';
+class A {
+  static final y = 0;
+}
+class B = Object with A;
+''');
+    expect(outputs, hasLength(3));
+    expect(outputs[COMPILATION_UNIT_CONSTANTS], isNotNull);
+    expect(outputs[COMPILATION_UNIT_ELEMENT], isNotNull);
+    expect(outputs[RESOLVED_UNIT1], isNotNull);
+  }
+
+  test_perform_reuseElement() {
+    _performBuildTask(r'''
+library lib;
+class A {}
+class B = Object with A;
+''');
+    CompilationUnit unit = outputs[RESOLVED_UNIT1];
+    CompilationUnitElement unitElement = outputs[COMPILATION_UNIT_ELEMENT];
+    expect(unit, isNotNull);
+    expect(unitElement, isNotNull);
+    // invalidate RESOLVED_UNIT1
+    CacheEntry cacheEntry = analysisCache.get(target);
+    cacheEntry.setState(RESOLVED_UNIT1, CacheState.INVALID);
+    // compute again
+    computeResult(target, RESOLVED_UNIT1);
+    expect(outputs[COMPILATION_UNIT_ELEMENT], same(unitElement));
+    expect(outputs[RESOLVED_UNIT1], isNot(same(unit)));
+  }
+
+  void _performBuildTask(String content) {
+    source = newSource('/test.dart', content);
+    target = new LibrarySpecificUnit(source, source);
+    computeResult(target, RESOLVED_UNIT1);
+    expect(task, new isInstanceOf<BuildCompilationUnitElementTask>());
+  }
+}
+
+@reflectiveTest
+class BuildDirectiveElementsTaskTest extends _AbstractDartTaskTest {
+  test_constructor() {
+    BuildDirectiveElementsTask task =
+        new BuildDirectiveElementsTask(context, emptySource);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, emptySource);
+  }
+
+  test_createTask() {
+    BuildDirectiveElementsTask task =
+        BuildDirectiveElementsTask.createTask(context, emptySource);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, emptySource);
+  }
+
+  test_description() {
+    BuildDirectiveElementsTask task =
+        new BuildDirectiveElementsTask(null, emptySource);
+    expect(task.description, isNotNull);
+  }
+
+  test_descriptor() {
+    TaskDescriptor descriptor = BuildDirectiveElementsTask.DESCRIPTOR;
+    expect(descriptor, isNotNull);
+  }
+
+  test_perform() {
+    List<Source> sources = newSources({
+      '/libA.dart': '''
+library libA;
+import 'libB.dart';
+export 'libC.dart';
+''',
+      '/libB.dart': '''
+library libB;
+''',
+      '/libC.dart': '''
+library libC;
+'''
+    });
+    Source sourceA = sources[0];
+    Source sourceB = sources[1];
+    Source sourceC = sources[2];
+    // perform task
+    computeResult(sourceA, LIBRARY_ELEMENT2);
+    expect(task, new isInstanceOf<BuildDirectiveElementsTask>());
+    // prepare outputs
+    LibraryElement libraryElementA = outputs[LIBRARY_ELEMENT2];
+    LibraryElement libraryElementB = _getImportLibraryInput(sourceB);
+    LibraryElement libraryElementC = _getExportLibraryInput(sourceC);
+    // no errors
+    _assertErrorsWithCodes([]);
+    // validate directives
+    CompilationUnit libraryUnitA = context
+        .getCacheEntry(new LibrarySpecificUnit(sourceA, sourceA))
+        .getValue(RESOLVED_UNIT1);
+    {
+      ImportDirective importNode = libraryUnitA.directives[1];
+      ImportElement importElement = importNode.element;
+      expect(importElement, isNotNull);
+      expect(importElement.importedLibrary, libraryElementB);
+      expect(importElement.prefix, isNull);
+      expect(importElement.nameOffset, 14);
+      expect(importElement.uriOffset, 21);
+      expect(importElement.uriEnd, 32);
+    }
+    {
+      ExportDirective exportNode = libraryUnitA.directives[2];
+      ExportElement exportElement = exportNode.element;
+      expect(exportElement, isNotNull);
+      expect(exportElement.exportedLibrary, libraryElementC);
+      expect(exportElement.nameOffset, 34);
+      expect(exportElement.uriOffset, 41);
+      expect(exportElement.uriEnd, 52);
+    }
+    // validate LibraryElement
+    expect(libraryElementA.hasExtUri, isFalse);
+    // has an artificial "dart:core" import
+    {
+      List<ImportElement> imports = libraryElementA.imports;
+      expect(imports, hasLength(2));
+      expect(imports[1].importedLibrary.isDartCore, isTrue);
+      expect(imports[1].isSynthetic, isTrue);
+    }
+  }
+
+  test_perform_combinators() {
+    List<Source> sources = newSources({
+      '/libA.dart': '''
+library libA;
+import 'libB.dart' show A, B hide C, D;
+''',
+      '/libB.dart': '''
+library libB;
+'''
+    });
+    Source sourceA = sources[0];
+    // perform task
+    computeResult(sourceA, LIBRARY_ELEMENT2);
+    expect(task, new isInstanceOf<BuildDirectiveElementsTask>());
+    // prepare outputs
+    CompilationUnit libraryUnitA = context
+        .getCacheEntry(new LibrarySpecificUnit(sourceA, sourceA))
+        .getValue(RESOLVED_UNIT1);
+    // no errors
+    _assertErrorsWithCodes([]);
+    // validate directives
+    ImportDirective importNode = libraryUnitA.directives[1];
+    ImportElement importElement = importNode.element;
+    List<NamespaceCombinator> combinators = importElement.combinators;
+    expect(combinators, hasLength(2));
+    {
+      ShowElementCombinator combinator = combinators[0];
+      expect(combinator.offset, 33);
+      expect(combinator.end, 42);
+      expect(combinator.shownNames, ['A', 'B']);
+    }
+    {
+      HideElementCombinator combinator = combinators[1];
+      expect(combinator.hiddenNames, ['C', 'D']);
+    }
+  }
+
+  test_perform_dartCoreContext() {
+    List<Source> sources = newSources({'/libA.dart': ''});
+    Source source = sources[0];
+    // perform task
+    computeResult(source, LIBRARY_ELEMENT2);
+    expect(task, new isInstanceOf<BuildDirectiveElementsTask>());
+    // prepare outputs
+    LibraryElement libraryElement = outputs[LIBRARY_ELEMENT2];
+    // verify that dart:core has SDK context
+    {
+      LibraryElement coreLibrary = libraryElement.importedLibraries[0];
+      DartSdk dartSdk = context.sourceFactory.dartSdk;
+      expect(coreLibrary.context, same(dartSdk.context));
+    }
+  }
+
+  test_perform_error_exportOfNonLibrary() {
+    List<Source> sources = newSources({
+      '/libA.dart': '''
+library libA;
+export 'part.dart';
+''',
+      '/part.dart': '''
+part of notLib;
+'''
+    });
+    Source sourceA = sources[0];
+    // perform task
+    computeResult(sourceA, LIBRARY_ELEMENT2);
+    expect(task, new isInstanceOf<BuildDirectiveElementsTask>());
+    // validate errors
+    _assertErrorsWithCodes([CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY]);
+  }
+
+  test_perform_error_importOfNonLibrary() {
+    List<Source> sources = newSources({
+      '/libA.dart': '''
+library libA;
+import 'part.dart';
+''',
+      '/part.dart': '''
+part of notLib;
+'''
+    });
+    Source sourceA = sources[0];
+    // perform task
+    computeResult(sourceA, LIBRARY_ELEMENT2);
+    expect(task, new isInstanceOf<BuildDirectiveElementsTask>());
+    // validate errors
+    _assertErrorsWithCodes([CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY]);
+  }
+
+  test_perform_explicitDartCoreImport() {
+    List<Source> sources = newSources({
+      '/lib.dart': '''
+library lib;
+import 'dart:core' show List;
+'''
+    });
+    Source source = sources[0];
+    // perform task
+    computeResult(source, LIBRARY_ELEMENT2);
+    expect(task, new isInstanceOf<BuildDirectiveElementsTask>());
+    // prepare outputs
+    LibraryElement libraryElement = outputs[LIBRARY_ELEMENT2];
+    // has an explicit "dart:core" import
+    {
+      List<ImportElement> imports = libraryElement.imports;
+      expect(imports, hasLength(1));
+      expect(imports[0].importedLibrary.isDartCore, isTrue);
+      expect(imports[0].isSynthetic, isFalse);
+    }
+  }
+
+  test_perform_hasExtUri() {
+    List<Source> sources = newSources({
+      '/lib.dart': '''
+import 'dart-ext:doesNotExist.dart';
+'''
+    });
+    Source source = sources[0];
+    // perform task
+    computeResult(source, LIBRARY_ELEMENT2);
+    expect(task, new isInstanceOf<BuildDirectiveElementsTask>());
+    // prepare outputs
+    LibraryElement libraryElement = outputs[LIBRARY_ELEMENT2];
+    expect(libraryElement.hasExtUri, isTrue);
+  }
+
+  test_perform_importPrefix() {
+    List<Source> sources = newSources({
+      '/libA.dart': '''
+library libA;
+import 'libB.dart' as pref;
+import 'libC.dart' as pref;
+''',
+      '/libB.dart': '''
+library libB;
+''',
+      '/libC.dart': '''
+library libC;
+'''
+    });
+    Source sourceA = sources[0];
+    Source sourceB = sources[1];
+    // perform task
+    computeResult(sourceA, LIBRARY_ELEMENT2);
+    expect(task, new isInstanceOf<BuildDirectiveElementsTask>());
+    // prepare outputs
+    CompilationUnit libraryUnitA = context
+        .getCacheEntry(new LibrarySpecificUnit(sourceA, sourceA))
+        .getValue(RESOLVED_UNIT1);
+    // validate directives
+    {
+      ImportDirective importNodeB = libraryUnitA.directives[1];
+      SimpleIdentifier prefixNodeB = importNodeB.prefix;
+      ImportElement importElementB = importNodeB.element;
+      PrefixElement prefixElement = importElementB.prefix;
+      expect(importElementB, isNotNull);
+      expect(importElementB.importedLibrary, _getImportLibraryInput(sourceB));
+      expect(prefixElement, isNotNull);
+      expect(importElementB.prefixOffset, prefixElement.nameOffset);
+      expect(prefixNodeB.staticElement, prefixElement);
+      // PrefixElement "pref" is shared
+      ImportDirective importNodeC = libraryUnitA.directives[2];
+      SimpleIdentifier prefixNodeC = importNodeC.prefix;
+      ImportElement importElementC = importNodeC.element;
+      expect(prefixNodeC.staticElement, prefixElement);
+      expect(importElementC.prefix, prefixElement);
+    }
+  }
+
+  void _assertErrorsWithCodes(List<ErrorCode> expectedErrorCodes) {
+    _fillErrorListener(BUILD_DIRECTIVES_ERRORS);
+    errorListener.assertErrorsWithCodes(expectedErrorCodes);
+  }
+
+  _getExportLibraryInput(Source source) {
+    var key = BuildDirectiveElementsTask.EXPORTS_LIBRARY_ELEMENT_INPUT_NAME;
+    return task.inputs[key][source];
+  }
+
+  _getImportLibraryInput(Source source) {
+    var key = BuildDirectiveElementsTask.IMPORTS_LIBRARY_ELEMENT_INPUT_NAME;
+    return task.inputs[key][source];
+  }
+}
+
+@reflectiveTest
+class BuildEnumMemberElementsTaskTest extends _AbstractDartTaskTest {
+  test_perform() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+enum MyEnum {
+  A, B
+}
+''');
+    computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT2);
+    expect(task, new isInstanceOf<BuildEnumMemberElementsTask>());
+    CompilationUnit unit = outputs[RESOLVED_UNIT2];
+    // validate Element
+    ClassElement enumElement = unit.element.getEnum('MyEnum');
+    List<FieldElement> fields = enumElement.fields;
+    expect(fields, hasLength(4));
+    {
+      FieldElementImpl index = fields[0];
+      expect(index, isNotNull);
+      expect(index.name, 'index');
+      expect(index.isStatic, isFalse);
+      expect(index.evaluationResult, isNull);
+      _assertGetter(index);
+    }
+    {
+      ConstFieldElementImpl values = fields[1];
+      expect(values, isNotNull);
+      expect(values.name, 'values');
+      expect(values.isStatic, isTrue);
+      expect(values.evaluationResult, isNotNull);
+      _assertGetter(values);
+    }
+    {
+      ConstFieldElementImpl constant = fields[2];
+      expect(constant, isNotNull);
+      expect(constant.name, 'A');
+      expect(constant.isStatic, isTrue);
+      expect(constant.evaluationResult, isNotNull);
+      _assertGetter(constant);
+    }
+    {
+      ConstFieldElementImpl constant = fields[3];
+      expect(constant, isNotNull);
+      expect(constant.name, 'B');
+      expect(constant.isStatic, isTrue);
+      expect(constant.evaluationResult, isNotNull);
+      _assertGetter(constant);
+    }
+    // validate nodes
+    EnumDeclaration enumNode = unit.declarations[0];
+    expect(enumNode.name.staticElement, same(enumElement));
+    expect(enumNode.constants[0].element, same(enumElement.getField('A')));
+    expect(enumNode.constants[1].element, same(enumElement.getField('B')));
+  }
+
+  static void _assertGetter(FieldElement field) {
+    PropertyAccessorElement getter = field.getter;
+    expect(getter, isNotNull);
+    expect(getter.variable, same(field));
+    expect(getter.type, isNotNull);
+  }
+}
+
+@reflectiveTest
+class BuildExportNamespaceTaskTest extends _AbstractDartTaskTest {
+  test_perform_entryPoint() {
+    Source sourceA = newSource(
+        '/a.dart',
+        '''
+library lib_a;
+export 'b.dart';
+''');
+    Source sourceB = newSource(
+        '/b.dart',
+        '''
+library lib_b;
+main() {}
+''');
+    computeResult(sourceA, LIBRARY_ELEMENT4);
+    expect(task, new isInstanceOf<BuildExportNamespaceTask>());
+    // validate
+    {
+      LibraryElement library = outputs[LIBRARY_ELEMENT4];
+      FunctionElement entryPoint = library.entryPoint;
+      expect(entryPoint, isNotNull);
+      expect(entryPoint.source, sourceB);
+    }
+  }
+
+  test_perform_hideCombinator() {
+    Source sourceA = newSource(
+        '/a.dart',
+        '''
+library lib_a;
+export 'b.dart' hide B1;
+class A1 {}
+class A2 {}
+class _A3 {}
+''');
+    newSource(
+        '/b.dart',
+        '''
+library lib_b;
+class B1 {}
+class B2 {}
+class B3 {}
+class _B4 {}
+''');
+    newSource(
+        '/c.dart',
+        '''
+library lib_c;
+class C1 {}
+class C2 {}
+class C3 {}
+''');
+    computeResult(sourceA, LIBRARY_ELEMENT4);
+    expect(task, new isInstanceOf<BuildExportNamespaceTask>());
+    // validate
+    {
+      LibraryElement library = outputs[LIBRARY_ELEMENT4];
+      Namespace namespace = library.exportNamespace;
+      Iterable<String> definedKeys = namespace.definedNames.keys;
+      expect(definedKeys, unorderedEquals(['A1', 'A2', 'B2', 'B3']));
+    }
+  }
+
+  test_perform_showCombinator() {
+    Source sourceA = newSource(
+        '/a.dart',
+        '''
+library lib_a;
+export 'b.dart' show B1;
+class A1 {}
+class A2 {}
+class _A3 {}
+''');
+    newSource(
+        '/b.dart',
+        '''
+library lib_b;
+class B1 {}
+class B2 {}
+class _B3 {}
+''');
+    computeResult(sourceA, LIBRARY_ELEMENT4);
+    expect(task, new isInstanceOf<BuildExportNamespaceTask>());
+    // validate
+    {
+      LibraryElement library = outputs[LIBRARY_ELEMENT4];
+      Namespace namespace = library.exportNamespace;
+      Iterable<String> definedKeys = namespace.definedNames.keys;
+      expect(definedKeys, unorderedEquals(['A1', 'A2', 'B1']));
+    }
+  }
+
+  test_perform_showCombinator_setter() {
+    Source sourceA = newSource(
+        '/a.dart',
+        '''
+library lib_a;
+export 'b.dart' show topLevelB;
+class A {}
+''');
+    newSource(
+        '/b.dart',
+        '''
+library lib_b;
+int topLevelB;
+''');
+    computeResult(sourceA, LIBRARY_ELEMENT4);
+    expect(task, new isInstanceOf<BuildExportNamespaceTask>());
+    // validate
+    {
+      LibraryElement library = outputs[LIBRARY_ELEMENT4];
+      Namespace namespace = library.exportNamespace;
+      Iterable<String> definedKeys = namespace.definedNames.keys;
+      expect(definedKeys, unorderedEquals(['A', 'topLevelB', 'topLevelB=']));
+    }
+  }
+}
+
+@reflectiveTest
+class BuildLibraryElementTaskTest extends _AbstractDartTaskTest {
+  Source librarySource;
+  CompilationUnit libraryUnit;
+  CompilationUnitElement libraryUnitElement;
+  List<CompilationUnit> partUnits;
+
+  LibraryElement libraryElement;
+
+  test_constructor() {
+    BuildLibraryElementTask task =
+        new BuildLibraryElementTask(context, emptySource);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, emptySource);
+  }
+
+  test_createTask() {
+    BuildLibraryElementTask task =
+        BuildLibraryElementTask.createTask(context, emptySource);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, emptySource);
+  }
+
+  test_description() {
+    BuildLibraryElementTask task =
+        new BuildLibraryElementTask(null, emptySource);
+    expect(task.description, isNotNull);
+  }
+
+  test_descriptor() {
+    TaskDescriptor descriptor = BuildLibraryElementTask.DESCRIPTOR;
+    expect(descriptor, isNotNull);
+  }
+
+  test_perform() {
+    _performBuildTask({
+      '/lib.dart': '''
+library lib;
+part 'part1.dart';
+part 'part2.dart';
+''',
+      '/part1.dart': '''
+part of lib;
+''',
+      '/part2.dart': '''
+part of lib;
+'''
+    });
+    expect(outputs, hasLength(3));
+    // simple outputs
+    expect(outputs[BUILD_LIBRARY_ERRORS], isEmpty);
+    expect(outputs[IS_LAUNCHABLE], isFalse);
+    // LibraryElement output
+    expect(libraryElement, isNotNull);
+    expect(libraryElement.entryPoint, isNull);
+    expect(libraryElement.source, same(librarySource));
+    expect(libraryElement.definingCompilationUnit, libraryUnitElement);
+    expect(libraryElement.parts,
+        unorderedEquals([partUnits[0].element, partUnits[1].element]));
+    // LibraryElement references
+    expect((libraryUnit.directives[0] as LibraryDirective).element,
+        same(libraryElement));
+    expect((partUnits[0].directives[0] as PartOfDirective).element,
+        same(libraryElement));
+    expect((partUnits[1].directives[0] as PartOfDirective).element,
+        same(libraryElement));
+    // CompilationUnitElement(s)
+    CompilationUnitElement firstPart;
+    CompilationUnitElement secondPart;
+    if (partUnits[0].element.uri == 'part1.dart') {
+      firstPart = partUnits[0].element;
+      secondPart = partUnits[1].element;
+    } else {
+      firstPart = partUnits[1].element;
+      secondPart = partUnits[0].element;
+    }
+    expect(firstPart.uri, 'part1.dart');
+    expect(firstPart.uriOffset, 18);
+    expect(firstPart.uriEnd, 30);
+    expect(
+        (libraryUnit.directives[1] as PartDirective).element, same(firstPart));
+
+    expect(secondPart.uri, 'part2.dart');
+    expect(secondPart.uriOffset, 37);
+    expect(secondPart.uriEnd, 49);
+    expect(
+        (libraryUnit.directives[2] as PartDirective).element, same(secondPart));
+  }
+
+  test_perform_error_missingLibraryDirectiveWithPart_hasCommon() {
+    _performBuildTask({
+      '/lib.dart': '''
+part 'partA.dart';
+part 'partB.dart';
+''',
+      '/partA.dart': '''
+part of my_lib;
+        ''',
+      '/partB.dart': '''
+part of my_lib;
+'''
+    });
+    _assertErrorsWithCodes(
+        [ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART]);
+    AnalysisError error = errorListener.errors[0];
+    expect(error.getProperty(ErrorProperty.PARTS_LIBRARY_NAME), 'my_lib');
+  }
+
+  test_perform_error_missingLibraryDirectiveWithPart_noCommon() {
+    _performBuildTask({
+      '/lib.dart': '''
+part 'partA.dart';
+part 'partB.dart';
+''',
+      '/partA.dart': '''
+part of libA;
+        ''',
+      '/partB.dart': '''
+part of libB;
+'''
+    });
+    _assertErrorsWithCodes(
+        [ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART]);
+    AnalysisError error = errorListener.errors[0];
+    expect(error.getProperty(ErrorProperty.PARTS_LIBRARY_NAME), isNull);
+  }
+
+  test_perform_error_partDoesNotExist() {
+    _performBuildTask({
+      '/lib.dart': '''
+library lib;
+part 'part.dart';
+'''
+    });
+    // we already report URI_DOES_NOT_EXIST, no need to report other errors
+    _assertErrorsWithCodes([]);
+  }
+
+  test_perform_error_partOfDifferentLibrary() {
+    _performBuildTask({
+      '/lib.dart': '''
+library lib;
+part 'part.dart';
+''',
+      '/part.dart': '''
+part of someOtherLib;
+'''
+    });
+    _assertErrorsWithCodes([StaticWarningCode.PART_OF_DIFFERENT_LIBRARY]);
+  }
+
+  test_perform_error_partOfNonPart() {
+    _performBuildTask({
+      '/lib.dart': '''
+library lib;
+part 'part.dart';
+''',
+      '/part.dart': '''
+// no part of
+'''
+    });
+    _assertErrorsWithCodes([CompileTimeErrorCode.PART_OF_NON_PART]);
+  }
+
+  test_perform_invalidUri_part() {
+    _performBuildTask({
+      '/lib.dart': '''
+library lib;
+part '//////////';
+'''
+    });
+    expect(libraryElement.parts, isEmpty);
+  }
+
+  test_perform_isLaunchable_inDefiningUnit() {
+    _performBuildTask({
+      '/lib.dart': '''
+library lib;
+main() {
+}
+'''
+    });
+    expect(outputs[IS_LAUNCHABLE], isTrue);
+    expect(libraryElement.entryPoint, isNotNull);
+  }
+
+  test_perform_isLaunchable_inPartUnit() {
+    _performBuildTask({
+      '/lib.dart': '''
+library lib;
+part 'part.dart';
+''',
+      '/part.dart': '''
+part of lib;
+main() {
+}
+'''
+    });
+    expect(outputs[IS_LAUNCHABLE], isTrue);
+    expect(libraryElement.entryPoint, isNotNull);
+  }
+
+  test_perform_noSuchFilePart() {
+    _performBuildTask({
+      '/lib.dart': '''
+library lib;
+part 'no-such-file.dart';
+'''
+    });
+    expect(libraryElement.parts, hasLength(1));
+    CompilationUnitElement part = libraryElement.parts[0];
+    expect(part, isNotNull);
+    expect(part.source, isNotNull);
+    expect(part.library, same(libraryElement));
+    expect(context.exists(part.source), isFalse);
+  }
+
+  test_perform_patchTopLevelAccessors() {
+    _performBuildTask({
+      '/lib.dart': '''
+library lib;
+part 'part1.dart';
+part 'part2.dart';
+''',
+      '/part1.dart': '''
+part of lib;
+int get test => 0;
+''',
+      '/part2.dart': '''
+part of lib;
+void set test(_) {}
+'''
+    });
+    CompilationUnitElement unitElement1 = partUnits[0].element;
+    CompilationUnitElement unitElement2 = partUnits[1].element;
+    PropertyAccessorElement getter = unitElement1.accessors[0];
+    PropertyAccessorElement setter = unitElement2.accessors[0];
+    PropertyInducingElement variable = getter.variable;
+    expect(getter.isGetter, isTrue);
+    expect(setter.isSetter, isTrue);
+    expect(variable, isNotNull);
+    expect(setter.variable, same(variable));
+    expect(unitElement1.topLevelVariables, [variable]);
+    expect(unitElement2.topLevelVariables, [variable]);
+  }
+
+  void _assertErrorsWithCodes(List<ErrorCode> expectedErrorCodes) {
+    _fillErrorListener(BUILD_LIBRARY_ERRORS);
+    errorListener.assertErrorsWithCodes(expectedErrorCodes);
+  }
+
+  void _performBuildTask(Map<String, String> sourceMap) {
+    List<Source> sources = newSources(sourceMap);
+    Source libSource = sources.first;
+    computeResult(libSource, LIBRARY_ELEMENT1);
+    expect(task, new isInstanceOf<BuildLibraryElementTask>());
+    libraryUnit = context
+        .getCacheEntry(new LibrarySpecificUnit(libSource, libSource))
+        .getValue(RESOLVED_UNIT1);
+    libraryUnitElement = libraryUnit.element;
+    librarySource = libraryUnitElement.source;
+    libraryElement = outputs[LIBRARY_ELEMENT1];
+    partUnits = task.inputs[BuildLibraryElementTask.PARTS_UNIT_INPUT];
+  }
+}
+
+@reflectiveTest
+class BuildPublicNamespaceTaskTest extends _AbstractDartTaskTest {
+  test_buildInputs() {
+    Map<String, TaskInput> inputs =
+        BuildPublicNamespaceTask.buildInputs(emptySource);
+    expect(inputs, isNotNull);
+    expect(
+        inputs.keys, unorderedEquals([BuildPublicNamespaceTask.LIBRARY_INPUT]));
+  }
+
+  test_constructor() {
+    BuildPublicNamespaceTask task =
+        new BuildPublicNamespaceTask(context, emptySource);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, emptySource);
+  }
+
+  test_createTask() {
+    BuildPublicNamespaceTask task =
+        BuildPublicNamespaceTask.createTask(context, emptySource);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, emptySource);
+  }
+
+  test_description() {
+    BuildPublicNamespaceTask task =
+        new BuildPublicNamespaceTask(null, emptySource);
+    expect(task.description, isNotNull);
+  }
+
+  test_descriptor() {
+    TaskDescriptor descriptor = BuildPublicNamespaceTask.DESCRIPTOR;
+    expect(descriptor, isNotNull);
+  }
+
+  test_perform() {
+    List<Source> sources = newSources({
+      '/lib.dart': '''
+library lib;
+part 'part.dart';
+a() {}
+_b() {}
+''',
+      '/part.dart': '''
+part of lib;
+_c() {}
+d() {}
+'''
+    });
+    computeResult(sources.first, LIBRARY_ELEMENT3);
+    expect(task, new isInstanceOf<BuildPublicNamespaceTask>());
+    // validate
+    LibraryElement library = outputs[LIBRARY_ELEMENT3];
+    Namespace namespace = library.publicNamespace;
+    expect(namespace.definedNames.keys, unorderedEquals(['a', 'd']));
+  }
+}
+
+@reflectiveTest
+class BuildSourceExportClosureTaskTest extends _AbstractDartTaskTest {
+  test_perform_exportClosure() {
+    Source sourceA = newSource(
+        '/a.dart',
+        '''
+library lib_a;
+export 'b.dart';
+''');
+    Source sourceB = newSource(
+        '/b.dart',
+        '''
+library lib_b;
+export 'c.dart';
+''');
+    Source sourceC = newSource(
+        '/c.dart',
+        '''
+library lib_c;
+export 'a.dart';
+''');
+    Source sourceD = newSource(
+        '/d.dart',
+        '''
+library lib_d;
+''');
+    // a.dart
+    {
+      computeResult(sourceA, EXPORT_SOURCE_CLOSURE);
+      expect(task, new isInstanceOf<BuildSourceExportClosureTask>());
+      List<Source> closure = outputs[EXPORT_SOURCE_CLOSURE];
+      expect(closure, unorderedEquals([sourceA, sourceB, sourceC]));
+    }
+    // c.dart
+    {
+      computeResult(sourceC, EXPORT_SOURCE_CLOSURE);
+      expect(task, new isInstanceOf<BuildSourceExportClosureTask>());
+      List<Source> closure = outputs[EXPORT_SOURCE_CLOSURE];
+      expect(closure, unorderedEquals([sourceA, sourceB, sourceC]));
+    }
+    // d.dart
+    {
+      computeResult(sourceD, EXPORT_SOURCE_CLOSURE);
+      expect(task, new isInstanceOf<BuildSourceExportClosureTask>());
+      List<Source> closure = outputs[EXPORT_SOURCE_CLOSURE];
+      expect(closure, unorderedEquals([sourceD]));
+    }
+  }
+}
+
+@reflectiveTest
+class BuildSourceImportExportClosureTaskTest extends _AbstractDartTaskTest {
+  test_perform_importExportClosure() {
+    Source sourceA = newSource(
+        '/a.dart',
+        '''
+library lib_a;
+''');
+    Source sourceB = newSource(
+        '/b.dart',
+        '''
+library lib_b;
+export 'a.dart';
+''');
+    Source sourceC = newSource(
+        '/c.dart',
+        '''
+library lib_c;
+import 'b.dart';
+''');
+    Source coreSource = context.sourceFactory.resolveUri(null, 'dart:core');
+    // c.dart
+    {
+      computeResult(sourceC, IMPORT_EXPORT_SOURCE_CLOSURE);
+      expect(task, new isInstanceOf<BuildSourceImportExportClosureTask>());
+      List<Source> closure = outputs[IMPORT_EXPORT_SOURCE_CLOSURE];
+      expect(closure, contains(sourceA));
+      expect(closure, contains(sourceB));
+      expect(closure, contains(sourceC));
+      expect(closure, contains(coreSource));
+    }
+    // b.dart
+    {
+      computeResult(sourceB, IMPORT_EXPORT_SOURCE_CLOSURE);
+      expect(task, new isInstanceOf<BuildSourceImportExportClosureTask>());
+      List<Source> closure = outputs[IMPORT_EXPORT_SOURCE_CLOSURE];
+      expect(closure, contains(sourceA));
+      expect(closure, contains(sourceB));
+      expect(closure, contains(coreSource));
+    }
+  }
+
+  test_perform_isClient_false() {
+    Source sourceA = newSource(
+        '/a.dart',
+        '''
+library lib_a;
+import 'b.dart';
+''');
+    newSource(
+        '/b.dart',
+        '''
+library lib_b;
+''');
+    computeResult(sourceA, IS_CLIENT);
+    expect(task, new isInstanceOf<BuildSourceImportExportClosureTask>());
+    expect(outputs[IS_CLIENT], isFalse);
+  }
+
+  test_perform_isClient_true_export_indirect() {
+    newSource(
+        '/exports_html.dart',
+        '''
+library lib_exports_html;
+export 'dart:html';
+''');
+    Source source = newSource(
+        '/test.dart',
+        '''
+import 'exports_html.dart';
+''');
+    computeResult(source, IS_CLIENT);
+    expect(task, new isInstanceOf<BuildSourceImportExportClosureTask>());
+    expect(outputs[IS_CLIENT], isTrue);
+  }
+
+  test_perform_isClient_true_import_direct() {
+    Source sourceA = newSource(
+        '/a.dart',
+        '''
+library lib_a;
+import 'dart:html';
+''');
+    computeResult(sourceA, IS_CLIENT);
+    expect(task, new isInstanceOf<BuildSourceImportExportClosureTask>());
+    expect(outputs[IS_CLIENT], isTrue);
+  }
+
+  test_perform_isClient_true_import_indirect() {
+    Source sourceA = newSource(
+        '/a.dart',
+        '''
+library lib_a;
+import 'b.dart';
+''');
+    newSource(
+        '/b.dart',
+        '''
+library lib_b;
+import 'dart:html';
+''');
+    computeResult(sourceA, IS_CLIENT);
+    expect(task, new isInstanceOf<BuildSourceImportExportClosureTask>());
+    expect(outputs[IS_CLIENT], isTrue);
+  }
+}
+
+@reflectiveTest
+class BuildTypeProviderTaskTest extends _AbstractDartTaskTest {
+  test_perform() {
+    computeResult(AnalysisContextTarget.request, TYPE_PROVIDER);
+    expect(task, new isInstanceOf<BuildTypeProviderTask>());
+    // validate
+    TypeProvider typeProvider = outputs[TYPE_PROVIDER];
+    expect(typeProvider, isNotNull);
+    expect(typeProvider.boolType, isNotNull);
+    expect(typeProvider.intType, isNotNull);
+    expect(typeProvider.futureType, isNotNull);
+  }
+}
+
+@reflectiveTest
+class ComputeConstantDependenciesTaskTest extends _AbstractDartTaskTest {
+  Annotation findClassAnnotation(CompilationUnit unit, String className) {
+    for (CompilationUnitMember member in unit.declarations) {
+      if (member is ClassDeclaration && member.name.name == className) {
+        expect(member.metadata, hasLength(1));
+        return member.metadata[0];
+      }
+    }
+    fail('Annotation not found');
+    return null;
+  }
+
+  test_annotation_with_args() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+const x = 1;
+@D(x) class C {}
+class D { const D(value); }
+''');
+    // First compute the resolved unit for the source.
+    LibrarySpecificUnit librarySpecificUnit =
+        new LibrarySpecificUnit(source, source);
+    computeResult(librarySpecificUnit, RESOLVED_UNIT1);
+    CompilationUnit unit = outputs[RESOLVED_UNIT1];
+    // Find the elements for x and D's constructor, and the annotation on C.
+    List<PropertyAccessorElement> accessors = unit.element.accessors;
+    Element x = accessors
+        .firstWhere((PropertyAccessorElement accessor) =>
+            accessor.isGetter && accessor.name == 'x')
+        .variable;
+    List<ClassElement> types = unit.element.types;
+    Element constructorForD =
+        types.firstWhere((ClassElement cls) => cls.name == 'D').constructors[0];
+    Annotation annotation = findClassAnnotation(unit, 'C');
+    // Now compute the dependencies for the annotation, and check that it is
+    // the set [x, constructorForD].
+    // TODO(paulberry): test librarySource != source
+    computeResult(
+        new ConstantEvaluationTarget_Annotation(
+            context, source, source, annotation),
+        CONSTANT_DEPENDENCIES);
+    expect(
+        outputs[CONSTANT_DEPENDENCIES].toSet(), [x, constructorForD].toSet());
+  }
+
+  test_annotation_without_args() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+const x = 1;
+@x class C {}
+''');
+    // First compute the resolved unit for the source.
+    LibrarySpecificUnit librarySpecificUnit =
+        new LibrarySpecificUnit(source, source);
+    computeResult(librarySpecificUnit, RESOLVED_UNIT1);
+    CompilationUnit unit = outputs[RESOLVED_UNIT1];
+    // Find the element for x and the annotation on C.
+    List<PropertyAccessorElement> accessors = unit.element.accessors;
+    Element x = accessors
+        .firstWhere((PropertyAccessorElement accessor) =>
+            accessor.isGetter && accessor.name == 'x')
+        .variable;
+    Annotation annotation = findClassAnnotation(unit, 'C');
+    // Now compute the dependencies for the annotation, and check that it is
+    // the list [x].
+    computeResult(
+        new ConstantEvaluationTarget_Annotation(
+            context, source, source, annotation),
+        CONSTANT_DEPENDENCIES);
+    expect(outputs[CONSTANT_DEPENDENCIES], [x]);
+  }
+
+  test_enumConstant() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+enum E {A, B, C}
+''');
+    // First compute the resolved unit for the source.
+    LibrarySpecificUnit librarySpecificUnit =
+        new LibrarySpecificUnit(source, source);
+    computeResult(librarySpecificUnit, RESOLVED_UNIT2);
+    CompilationUnit unit = outputs[RESOLVED_UNIT2];
+    // Find the element for 'A'
+    EnumDeclaration enumDeclaration = unit.declarations[0];
+    EnumConstantDeclaration constantDeclaration = enumDeclaration.constants[0];
+    FieldElement constantElement = constantDeclaration.element;
+    // Now compute the dependencies for the constant and check that there are
+    // none.
+    computeResult(constantElement, CONSTANT_DEPENDENCIES);
+    expect(outputs[CONSTANT_DEPENDENCIES], isEmpty);
+  }
+
+  test_perform() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+const x = y;
+const y = 1;
+''');
+    // First compute the resolved unit for the source.
+    LibrarySpecificUnit librarySpecificUnit =
+        new LibrarySpecificUnit(source, source);
+    computeResult(librarySpecificUnit, RESOLVED_UNIT1);
+    CompilationUnit unit = outputs[RESOLVED_UNIT1];
+    // Find the elements for the constants x and y.
+    List<PropertyAccessorElement> accessors = unit.element.accessors;
+    Element x = accessors
+        .firstWhere((PropertyAccessorElement accessor) =>
+            accessor.isGetter && accessor.name == 'x')
+        .variable;
+    Element y = accessors
+        .firstWhere((PropertyAccessorElement accessor) =>
+            accessor.isGetter && accessor.name == 'y')
+        .variable;
+    // Now compute the dependencies for x, and check that it is the list [y].
+    computeResult(x, CONSTANT_DEPENDENCIES);
+    expect(outputs[CONSTANT_DEPENDENCIES], [y]);
+  }
+}
+
+@reflectiveTest
+class ComputeConstantValueTaskTest extends _AbstractDartTaskTest {
+  EvaluationResultImpl computeClassAnnotation(
+      Source source, CompilationUnit unit, String className) {
+    for (CompilationUnitMember member in unit.declarations) {
+      if (member is ClassDeclaration && member.name.name == className) {
+        expect(member.metadata, hasLength(1));
+        Annotation annotation = member.metadata[0];
+        ConstantEvaluationTarget_Annotation target =
+            new ConstantEvaluationTarget_Annotation(
+                context, source, source, annotation);
+        computeResult(target, CONSTANT_VALUE);
+        expect(outputs[CONSTANT_VALUE], same(target));
+        EvaluationResultImpl evaluationResult = (annotation.elementAnnotation
+            as ElementAnnotationImpl).evaluationResult;
+        return evaluationResult;
+      }
+    }
+    fail('Annotation not found');
+    return null;
+  }
+
+  test_annotation_non_const_constructor() {
+    // Calling a non-const constructor from an annotation that is illegal, but
+    // shouldn't crash analysis.
+    Source source = newSource(
+        '/test.dart',
+        '''
+class A {
+  final int i;
+  A(this.i);
+}
+
+@A(5)
+class C {}
+''');
+    // First compute the resolved unit for the source.
+    CompilationUnit unit = _resolveSource(source);
+    // Compute the constant value of the annotation on C.
+    EvaluationResultImpl evaluationResult =
+        computeClassAnnotation(source, unit, 'C');
+    // And check that it has no value stored in it.
+    expect(evaluationResult, isNotNull);
+    expect(evaluationResult.value, isNull);
+  }
+
+  test_annotation_with_args() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+const x = 1;
+@D(x) class C {}
+class D {
+  const D(this.value);
+  final value;
+}
+''');
+    // First compute the resolved unit for the source.
+    CompilationUnit unit = _resolveSource(source);
+    // Compute the constant value of the annotation on C.
+    EvaluationResultImpl evaluationResult =
+        computeClassAnnotation(source, unit, 'C');
+    // And check that it has the expected value.
+    expect(evaluationResult, isNotNull);
+    expect(evaluationResult.value, isNotNull);
+    expect(evaluationResult.value.type, isNotNull);
+    expect(evaluationResult.value.type.name, 'D');
+    expect(evaluationResult.value.fields, contains('value'));
+    expect(evaluationResult.value.fields['value'].intValue, 1);
+  }
+
+  test_annotation_without_args() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+const x = 1;
+@x class C {}
+''');
+    // First compute the resolved unit for the source.
+    CompilationUnit unit = _resolveSource(source);
+    // Compute the constant value of the annotation on C.
+    EvaluationResultImpl evaluationResult =
+        computeClassAnnotation(source, unit, 'C');
+    // And check that it has the expected value.
+    expect(evaluationResult, isNotNull);
+    expect(evaluationResult.value, isNotNull);
+    expect(evaluationResult.value.intValue, 1);
+  }
+
+  test_circular_reference() {
+    _checkCircularities(
+        'x',
+        ['y'],
+        '''
+const x = y + 1;
+const y = x + 1;
+''');
+  }
+
+  test_circular_reference_one_element() {
+    // See dartbug.com/23490.
+    _checkCircularities('x', [], 'const x = x;');
+  }
+
+  test_circular_reference_strongly_connected_component() {
+    // When there is a circularity, all elements in the strongly connected
+    // component should be marked as having an error.
+    _checkCircularities(
+        'a',
+        ['b', 'c', 'd'],
+        '''
+const a = b;
+const b = c + d;
+const c = a;
+const d = a;
+''');
+  }
+
+  test_const_constructor_calls_implicit_super_constructor_implicitly() {
+    // Note: the situation below is a compile-time error (since the synthetic
+    // constructor for Base is non-const), but we need to handle it without
+    // throwing an exception.
+    EvaluationResultImpl evaluationResult = _computeTopLevelVariableConstValue(
+        'x',
+        '''
+class Base {}
+class Derived extends Base {
+  const Derived();
+}
+const x = const Derived();
+''');
+    expect(evaluationResult, isNotNull);
+  }
+
+  test_dependency() {
+    EvaluationResultImpl evaluationResult = _computeTopLevelVariableConstValue(
+        'x',
+        '''
+const x = y + 1;
+const y = 1;
+''');
+    expect(evaluationResult, isNotNull);
+    expect(evaluationResult.value, isNotNull);
+    expect(evaluationResult.value.intValue, 2);
+  }
+
+  test_external_const_factory() {
+    EvaluationResultImpl evaluationResult = _computeTopLevelVariableConstValue(
+        'x',
+        '''
+const x = const C.foo();
+
+class C extends B {
+  external const factory C.foo();
+}
+
+class B {}
+''');
+    expect(evaluationResult, isNotNull);
+  }
+
+  test_simple_constant() {
+    EvaluationResultImpl evaluationResult = _computeTopLevelVariableConstValue(
+        'x',
+        '''
+const x = 1;
+''');
+    expect(evaluationResult, isNotNull);
+    expect(evaluationResult.value, isNotNull);
+    expect(evaluationResult.value.intValue, 1);
+  }
+
+  void _checkCircularities(
+      String variableName, List<String> otherVariables, String content) {
+    // Evaluating the first constant should produce an error.
+    CompilationUnit unit = _resolveUnit(content);
+    _expectCircularityError(_evaluateConstant(unit, variableName));
+    // And all the other constants involved in the strongly connected component
+    // should be set to the same error state.
+    for (String otherVariableName in otherVariables) {
+      PropertyInducingElement otherVariableElement =
+          _findVariable(unit, otherVariableName);
+      _expectCircularityError((otherVariableElement
+          as TopLevelVariableElementImpl).evaluationResult);
+    }
+  }
+
+  EvaluationResultImpl _computeTopLevelVariableConstValue(
+      String variableName, String content) {
+    return _evaluateConstant(_resolveUnit(content), variableName);
+  }
+
+  EvaluationResultImpl _evaluateConstant(
+      CompilationUnit unit, String variableName) {
+    // Find the element for the given constant.
+    PropertyInducingElement variableElement = _findVariable(unit, variableName);
+    // Now compute the value of the constant.
+    computeResult(variableElement, CONSTANT_VALUE);
+    expect(outputs[CONSTANT_VALUE], same(variableElement));
+    EvaluationResultImpl evaluationResult =
+        (variableElement as TopLevelVariableElementImpl).evaluationResult;
+    return evaluationResult;
+  }
+
+  void _expectCircularityError(EvaluationResultImpl evaluationResult) {
+    expect(evaluationResult, isNotNull);
+    expect(evaluationResult.value, isNull);
+    expect(evaluationResult.errors, hasLength(1));
+    expect(evaluationResult.errors[0].errorCode,
+        CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT);
+  }
+
+  PropertyInducingElement _findVariable(
+      CompilationUnit unit, String variableName) {
+    // Find the element for the given constant.
+    return unit.element.topLevelVariables.firstWhere(
+        (TopLevelVariableElement variable) => variable.name == variableName);
+  }
+
+  CompilationUnit _resolveSource(Source source) {
+    LibrarySpecificUnit librarySpecificUnit =
+        new LibrarySpecificUnit(source, source);
+    computeResult(librarySpecificUnit, RESOLVED_UNIT1);
+    CompilationUnit unit = outputs[RESOLVED_UNIT1];
+    return unit;
+  }
+
+  CompilationUnit _resolveUnit(String content) =>
+      _resolveSource(newSource('/test.dart', content));
+}
+
+@reflectiveTest
+class ComputeInferableStaticVariableDependenciesTaskTest
+    extends _AbstractDartTaskTest {
+  test_perform() {
+    AnalysisTarget source = newSource(
+        '/test.dart',
+        '''
+const a = b;
+const b = 0;
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, RESOLVED_UNIT5);
+    CompilationUnit unit = outputs[RESOLVED_UNIT5];
+    TopLevelVariableElement elementA = unit.element.topLevelVariables[0];
+    TopLevelVariableElement elementB = unit.element.topLevelVariables[1];
+
+    computeResult(elementA, INFERABLE_STATIC_VARIABLE_DEPENDENCIES);
+    expect(task,
+        new isInstanceOf<ComputeInferableStaticVariableDependenciesTask>());
+    expect(outputs, hasLength(1));
+    List<VariableElement> dependencies =
+        outputs[INFERABLE_STATIC_VARIABLE_DEPENDENCIES];
+    expect(dependencies, unorderedEquals([elementB]));
+  }
+}
+
+@reflectiveTest
+class ContainingLibrariesTaskTest extends _AbstractDartTaskTest {
+  test_buildInputs() {
+    Map<String, TaskInput> inputs =
+        ContainingLibrariesTask.buildInputs(emptySource);
+    expect(inputs, isNotNull);
+    expect(inputs, isEmpty);
+  }
+
+  test_constructor() {
+    ContainingLibrariesTask task =
+        new ContainingLibrariesTask(context, emptySource);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, emptySource);
+  }
+
+  test_createTask() {
+    ContainingLibrariesTask task =
+        ContainingLibrariesTask.createTask(context, emptySource);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, emptySource);
+  }
+
+  test_description() {
+    ContainingLibrariesTask task =
+        new ContainingLibrariesTask(null, emptySource);
+    expect(task.description, isNotNull);
+  }
+
+  test_descriptor() {
+    TaskDescriptor descriptor = ContainingLibrariesTask.DESCRIPTOR;
+    expect(descriptor, isNotNull);
+  }
+
+  test_perform_definingCompilationUnit() {
+    AnalysisTarget library = newSource('/test.dart', 'library test;');
+    computeResult(library, INCLUDED_PARTS);
+    computeResult(library, CONTAINING_LIBRARIES);
+    expect(task, new isInstanceOf<ContainingLibrariesTask>());
+    expect(outputs, hasLength(1));
+    List<Source> containingLibraries = outputs[CONTAINING_LIBRARIES];
+    expect(containingLibraries, unorderedEquals([library]));
+  }
+
+  test_perform_partInMultipleLibraries() {
+    AnalysisTarget library1 =
+        newSource('/lib1.dart', 'library test; part "part.dart";');
+    AnalysisTarget library2 =
+        newSource('/lib2.dart', 'library test; part "part.dart";');
+    AnalysisTarget part = newSource('/part.dart', 'part of test;');
+    computeResult(library1, INCLUDED_PARTS);
+    computeResult(library2, INCLUDED_PARTS);
+    computeResult(part, SOURCE_KIND);
+    computeResult(part, CONTAINING_LIBRARIES);
+    expect(task, new isInstanceOf<ContainingLibrariesTask>());
+    expect(outputs, hasLength(1));
+    List<Source> containingLibraries = outputs[CONTAINING_LIBRARIES];
+    expect(containingLibraries, unorderedEquals([library1, library2]));
+  }
+
+  test_perform_partInSingleLibrary() {
+    AnalysisTarget library =
+        newSource('/lib.dart', 'library test; part "part.dart";');
+    AnalysisTarget part = newSource('/part.dart', 'part of test;');
+    computeResult(library, INCLUDED_PARTS);
+    computeResult(part, SOURCE_KIND);
+    computeResult(part, CONTAINING_LIBRARIES);
+    expect(task, new isInstanceOf<ContainingLibrariesTask>());
+    expect(outputs, hasLength(1));
+    List<Source> containingLibraries = outputs[CONTAINING_LIBRARIES];
+    expect(containingLibraries, unorderedEquals([library]));
+  }
+}
+
+@reflectiveTest
+class DartErrorsTaskTest extends _AbstractDartTaskTest {
+  test_buildInputs() {
+    Map<String, TaskInput> inputs = DartErrorsTask.buildInputs(emptySource);
+    expect(inputs, isNotNull);
+    expect(
+        inputs.keys,
+        unorderedEquals([
+          DartErrorsTask.BUILD_DIRECTIVES_ERRORS_INPUT,
+          DartErrorsTask.BUILD_LIBRARY_ERRORS_INPUT,
+          DartErrorsTask.PARSE_ERRORS_INPUT,
+          DartErrorsTask.SCAN_ERRORS_INPUT,
+          DartErrorsTask.LIBRARY_UNIT_ERRORS_INPUT
+        ]));
+  }
+
+  test_constructor() {
+    DartErrorsTask task = new DartErrorsTask(context, emptySource);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, emptySource);
+  }
+
+  test_createTask() {
+    DartErrorsTask task = DartErrorsTask.createTask(context, emptySource);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, emptySource);
+  }
+
+  test_description() {
+    DartErrorsTask task = new DartErrorsTask(null, emptySource);
+    expect(task.description, isNotNull);
+  }
+
+  test_descriptor() {
+    TaskDescriptor descriptor = DartErrorsTask.DESCRIPTOR;
+    expect(descriptor, isNotNull);
+  }
+
+  test_perform_definingCompilationUnit() {
+    AnalysisTarget library =
+        newSource('/test.dart', 'library test; import "dart:math";');
+    computeResult(library, INCLUDED_PARTS);
+    computeResult(library, DART_ERRORS);
+    expect(task, new isInstanceOf<DartErrorsTask>());
+    expect(outputs, hasLength(1));
+    List<AnalysisError> errors = outputs[DART_ERRORS];
+    expect(errors, hasLength(1));
+  }
+
+  test_perform_partInSingleLibrary() {
+    AnalysisTarget library = newSource(
+        '/lib.dart', 'library test; import "dart:math"; part "part.dart";');
+    AnalysisTarget part =
+        newSource('/part.dart', 'part of test; class A extends A {}');
+    computeResult(library, INCLUDED_PARTS);
+    computeResult(library, DART_ERRORS);
+    computeResult(part, DART_ERRORS);
+    expect(task, new isInstanceOf<DartErrorsTask>());
+    expect(outputs, hasLength(1));
+    List<AnalysisError> errors = outputs[DART_ERRORS];
+    // This should contain only the errors in the part file, not the ones in the
+    // library.
+    expect(errors, hasLength(1));
+  }
+}
+
+@reflectiveTest
+class EvaluateUnitConstantsTaskTest extends _AbstractDartTaskTest {
+  test_perform() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+class C {
+  const C();
+}
+
+@x
+f() {}
+
+const x = const C();
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, RESOLVED_UNIT);
+    expect(task, new isInstanceOf<EvaluateUnitConstantsTask>());
+    CompilationUnit unit = outputs[RESOLVED_UNIT];
+    CompilationUnitElement unitElement = unit.element;
+    expect(
+        (unitElement.types[0].constructors[0] as ConstructorElementImpl)
+            .isCycleFree,
+        isTrue);
+    expect(
+        (unitElement.functions[0].metadata[0] as ElementAnnotationImpl)
+            .evaluationResult,
+        isNotNull);
+    expect(
+        (unitElement.topLevelVariables[0] as TopLevelVariableElementImpl)
+            .evaluationResult,
+        isNotNull);
+  }
+}
+
+@reflectiveTest
+class GatherUsedImportedElementsTaskTest extends _AbstractDartTaskTest {
+  UsedImportedElements usedElements;
+  Set<String> usedElementNames;
+
+  test_perform() {
+    newSource(
+        '/a.dart',
+        r'''
+library lib_a;
+class A {}
+''');
+    newSource(
+        '/b.dart',
+        r'''
+library lib_b;
+class B {}
+''');
+    Source source = newSource(
+        '/test.dart',
+        r'''
+import 'a.dart';
+import 'b.dart';
+main() {
+  new A();
+}''');
+    _computeUsedElements(source);
+    // validate
+    expect(usedElementNames, unorderedEquals(['A']));
+  }
+
+  void _computeUsedElements(Source source) {
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, USED_IMPORTED_ELEMENTS);
+    expect(task, new isInstanceOf<GatherUsedImportedElementsTask>());
+    usedElements = outputs[USED_IMPORTED_ELEMENTS];
+    usedElementNames = usedElements.elements.map((e) => e.name).toSet();
+  }
+}
+
+@reflectiveTest
+class GatherUsedLocalElementsTaskTest extends _AbstractDartTaskTest {
+  UsedLocalElements usedElements;
+  Set<String> usedElementNames;
+
+  test_perform_localVariable() {
+    Source source = newSource(
+        '/test.dart',
+        r'''
+main() {
+  var v1 = 1;
+  var v2 = 2;
+  print(v2);
+}''');
+    _computeUsedElements(source);
+    // validate
+    expect(usedElementNames, unorderedEquals(['v2']));
+  }
+
+  test_perform_method() {
+    Source source = newSource(
+        '/test.dart',
+        r'''
+class A {
+  _m1() {}
+  _m2() {}
+}
+
+main(A a, p) {
+  a._m2();
+  p._m3();
+}
+''');
+    _computeUsedElements(source);
+    // validate
+    expect(usedElementNames, unorderedEquals(['A', 'a', 'p', '_m2']));
+    expect(usedElements.members, unorderedEquals(['_m2', '_m3']));
+  }
+
+  void _computeUsedElements(Source source) {
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, USED_LOCAL_ELEMENTS);
+    expect(task, new isInstanceOf<GatherUsedLocalElementsTask>());
+    usedElements = outputs[USED_LOCAL_ELEMENTS];
+    usedElementNames = usedElements.elements.map((e) => e.name).toSet();
+  }
+}
+
+@reflectiveTest
+class GenerateHintsTaskTest extends _AbstractDartTaskTest {
+  test_perform_bestPractices_missingReturn() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+int main() {
+}
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, HINTS);
+    expect(task, new isInstanceOf<GenerateHintsTask>());
+    // validate
+    _fillErrorListener(HINTS);
+    errorListener.assertErrorsWithCodes(<ErrorCode>[HintCode.MISSING_RETURN]);
+  }
+
+  test_perform_dart2js() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.dart2jsHint = true;
+    prepareAnalysisContext(options);
+    Source source = newSource(
+        '/test.dart',
+        '''
+main(p) {
+  if (p is double) {
+    print('double');
+  }
+}
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, HINTS);
+    expect(task, new isInstanceOf<GenerateHintsTask>());
+    // validate
+    _fillErrorListener(HINTS);
+    errorListener.assertErrorsWithCodes(<ErrorCode>[HintCode.IS_DOUBLE]);
+  }
+
+  test_perform_deadCode() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+main() {
+  if (false) {
+    print('how?');
+  }
+}
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, HINTS);
+    expect(task, new isInstanceOf<GenerateHintsTask>());
+    // validate
+    _fillErrorListener(HINTS);
+    errorListener.assertErrorsWithCodes(<ErrorCode>[HintCode.DEAD_CODE]);
+  }
+
+  test_perform_disabled() {
+    context.analysisOptions =
+        new AnalysisOptionsImpl.from(context.analysisOptions)..hint = false;
+    Source source = newSource(
+        '/test.dart',
+        '''
+int main() {
+}
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, HINTS);
+    expect(task, new isInstanceOf<GenerateHintsTask>());
+    // validate
+    _fillErrorListener(HINTS);
+    errorListener.assertNoErrors();
+  }
+
+  test_perform_imports_duplicateImport() {
+    newSource(
+        '/a.dart',
+        r'''
+library lib_a;
+class A {}
+''');
+    Source source = newSource(
+        '/test.dart',
+        r'''
+import 'a.dart';
+import 'a.dart';
+main() {
+  new A();
+}
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, HINTS);
+    expect(task, new isInstanceOf<GenerateHintsTask>());
+    // validate
+    _fillErrorListener(HINTS);
+    errorListener.assertErrorsWithCodes(<ErrorCode>[HintCode.DUPLICATE_IMPORT]);
+  }
+
+  test_perform_imports_unusedImport_one() {
+    newSource(
+        '/a.dart',
+        r'''
+library lib_a;
+class A {}
+''');
+    newSource(
+        '/b.dart',
+        r'''
+library lib_b;
+class B {}
+''');
+    Source source = newSource(
+        '/test.dart',
+        r'''
+import 'a.dart';
+import 'b.dart';
+main() {
+  new A();
+}''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, HINTS);
+    expect(task, new isInstanceOf<GenerateHintsTask>());
+    // validate
+    _fillErrorListener(HINTS);
+    errorListener.assertErrorsWithCodes(<ErrorCode>[HintCode.UNUSED_IMPORT]);
+  }
+
+  test_perform_imports_unusedImport_zero() {
+    newSource(
+        '/a.dart',
+        r'''
+library lib_a;
+class A {}
+''');
+    Source source = newSource(
+        '/test.dart',
+        r'''
+import 'a.dart';
+main() {
+  new A();
+}''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, HINTS);
+    expect(task, new isInstanceOf<GenerateHintsTask>());
+    // validate
+    _fillErrorListener(HINTS);
+    errorListener.assertNoErrors();
+  }
+
+  test_perform_overrideVerifier() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+class A {}
+class B {
+  @override
+  m() {}
+}
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, HINTS);
+    expect(task, new isInstanceOf<GenerateHintsTask>());
+    // validate
+    _fillErrorListener(HINTS);
+    errorListener.assertErrorsWithCodes(
+        <ErrorCode>[HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD]);
+  }
+
+  test_perform_todo() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+main() {
+  // TODO(developer) foo bar
+}
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, HINTS);
+    expect(task, new isInstanceOf<GenerateHintsTask>());
+    // validate
+    _fillErrorListener(HINTS);
+    errorListener.assertErrorsWithCodes(<ErrorCode>[TodoCode.TODO]);
+  }
+
+  test_perform_unusedLocalElements_class() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+class _A {}
+class _B {}
+main() {
+  new _A();
+}
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, HINTS);
+    expect(task, new isInstanceOf<GenerateHintsTask>());
+    // validate
+    _fillErrorListener(HINTS);
+    errorListener.assertErrorsWithCodes(<ErrorCode>[HintCode.UNUSED_ELEMENT]);
+  }
+
+  test_perform_unusedLocalElements_localVariable() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+main() {
+  var v = 42;
+}
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, HINTS);
+    expect(task, new isInstanceOf<GenerateHintsTask>());
+    // validate
+    _fillErrorListener(HINTS);
+    errorListener
+        .assertErrorsWithCodes(<ErrorCode>[HintCode.UNUSED_LOCAL_VARIABLE]);
+  }
+
+  test_perform_unusedLocalElements_method() {
+    Source source = newSource(
+        '/my_lib.dart',
+        '''
+library my_lib;
+part 'my_part.dart';
+class A {
+  _ma() {}
+  _mb() {}
+  _mc() {}
+}
+''');
+    newSource(
+        '/my_part.dart',
+        '''
+part of my_lib;
+
+f(A a) {
+  a._mb();
+}
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, HINTS);
+    expect(task, new isInstanceOf<GenerateHintsTask>());
+    // validate
+    _fillErrorListener(HINTS);
+    errorListener.assertErrorsWithCodes(
+        <ErrorCode>[HintCode.UNUSED_ELEMENT, HintCode.UNUSED_ELEMENT]);
+  }
+}
+
+@reflectiveTest
+class InferStaticVariableTypesInUnitTaskTest extends _AbstractDartTaskTest {
+  void test_perform() {
+    enableStrongMode();
+    AnalysisTarget firstSource = newSource(
+        '/first.dart',
+        '''
+import 'second.dart';
+
+var a = new M();
+var c = b;
+''');
+    AnalysisTarget secondSource = newSource(
+        '/second.dart',
+        '''
+import 'first.dart';
+
+var b = a;
+class M {}
+''');
+    computeResult(new LibrarySpecificUnit(firstSource, firstSource),
+        RESOLVED_UNIT6); //  new isInstanceOf<InferStaticVariableTypesInUnitTask>()
+    CompilationUnit firstUnit = outputs[RESOLVED_UNIT6];
+    computeResult(
+        new LibrarySpecificUnit(secondSource, secondSource), RESOLVED_UNIT6);
+    CompilationUnit secondUnit = outputs[RESOLVED_UNIT6];
+
+    VariableDeclaration variableA = getTopLevelVariable(firstUnit, 'a');
+    VariableDeclaration variableB = getTopLevelVariable(secondUnit, 'b');
+    VariableDeclaration variableC = getTopLevelVariable(firstUnit, 'c');
+    ClassDeclaration classM = getClass(secondUnit, 'M');
+    DartType typeM = classM.element.type;
+
+    expect(variableA.element.type, typeM);
+    expect(variableB.element.type, typeM);
+    expect(variableB.initializer.staticType, typeM);
+    expect(variableC.element.type, typeM);
+    expect(variableC.initializer.staticType, typeM);
+  }
+}
+
+@reflectiveTest
+class InferStaticVariableTypeTaskTest extends _AbstractDartTaskTest {
+  void test_getDeclaration_staticField() {
+    AnalysisTarget source = newSource(
+        '/test.dart',
+        '''
+class C {
+  var field = '';
+}
+''');
+    computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT5);
+    CompilationUnit unit = outputs[RESOLVED_UNIT5];
+    VariableDeclaration declaration = getFieldInClass(unit, 'C', 'field');
+    VariableElement variable = declaration.name.staticElement;
+    InferStaticVariableTypeTask inferTask =
+        new InferStaticVariableTypeTask(task.context, variable);
+    expect(inferTask.getDeclaration(unit), declaration);
+  }
+
+  void test_getDeclaration_topLevel() {
+    AnalysisTarget source = newSource(
+        '/test.dart',
+        '''
+var topLevel = '';
+''');
+    computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT5);
+    CompilationUnit unit = outputs[RESOLVED_UNIT5];
+    VariableDeclaration declaration = getTopLevelVariable(unit, 'topLevel');
+    VariableElement variable = declaration.name.staticElement;
+    InferStaticVariableTypeTask inferTask =
+        new InferStaticVariableTypeTask(task.context, variable);
+    expect(inferTask.getDeclaration(unit), declaration);
+  }
+
+  void test_perform() {
+    AnalysisTarget source = newSource(
+        '/test.dart',
+        '''
+var topLevel = '';
+class C {
+  var field = topLevel;
+}
+''');
+    computeResult(new LibrarySpecificUnit(source, source), RESOLVED_UNIT5);
+    CompilationUnit unit = outputs[RESOLVED_UNIT5];
+    VariableElement topLevel =
+        getTopLevelVariable(unit, 'topLevel').name.staticElement;
+    VariableElement field =
+        getFieldInClass(unit, 'C', 'field').name.staticElement;
+
+    computeResult(field, INFERRED_STATIC_VARIABLE);
+    InterfaceType stringType = context.typeProvider.stringType;
+    expect(topLevel.type, stringType);
+    expect(field.type, stringType);
+  }
+}
+
+@reflectiveTest
+class LibraryErrorsReadyTaskTest extends _AbstractDartTaskTest {
+  test_perform() {
+    Source library = newSource(
+        '/lib.dart',
+        r'''
+library lib;
+part 'part1.dart';
+part 'part2.dart';
+X v1;
+''');
+    Source part1 = newSource(
+        '/part1.dart',
+        r'''
+part of lib;
+X v2;
+''');
+    Source part2 = newSource(
+        '/part2.dart',
+        r'''
+part of lib;
+X v3;
+''');
+    computeResult(library, LIBRARY_ERRORS_READY);
+    expect(task, new isInstanceOf<LibraryErrorsReadyTask>());
+    expect(outputs, hasLength(1));
+    bool ready = outputs[LIBRARY_ERRORS_READY];
+    expect(ready, isTrue);
+    expect(context.getErrors(library).errors, hasLength(1));
+    expect(context.getErrors(part1).errors, hasLength(1));
+    expect(context.getErrors(part2).errors, hasLength(1));
+  }
+}
+
+@reflectiveTest
+class LibraryUnitErrorsTaskTest extends _AbstractDartTaskTest {
+  test_buildInputs() {
+    Map<String, TaskInput> inputs = LibraryUnitErrorsTask
+        .buildInputs(new LibrarySpecificUnit(emptySource, emptySource));
+    expect(inputs, isNotNull);
+    expect(
+        inputs.keys,
+        unorderedEquals([
+          LibraryUnitErrorsTask.HINTS_INPUT,
+          LibraryUnitErrorsTask.RESOLVE_REFERENCES_ERRORS_INPUT,
+          LibraryUnitErrorsTask.RESOLVE_TYPE_NAMES_ERRORS_INPUT,
+          LibraryUnitErrorsTask.VARIABLE_REFERENCE_ERRORS_INPUT,
+          LibraryUnitErrorsTask.VERIFY_ERRORS_INPUT
+        ]));
+  }
+
+  test_constructor() {
+    LibraryUnitErrorsTask task =
+        new LibraryUnitErrorsTask(context, emptySource);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, emptySource);
+  }
+
+  test_createTask() {
+    LibraryUnitErrorsTask task =
+        LibraryUnitErrorsTask.createTask(context, emptySource);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, emptySource);
+  }
+
+  test_description() {
+    LibraryUnitErrorsTask task = new LibraryUnitErrorsTask(null, emptySource);
+    expect(task.description, isNotNull);
+  }
+
+  test_descriptor() {
+    TaskDescriptor descriptor = LibraryUnitErrorsTask.DESCRIPTOR;
+    expect(descriptor, isNotNull);
+  }
+
+  test_perform_definingCompilationUnit() {
+    AnalysisTarget library =
+        newSource('/test.dart', 'library test; import "dart:math";');
+    computeResult(
+        new LibrarySpecificUnit(library, library), LIBRARY_UNIT_ERRORS);
+    expect(task, new isInstanceOf<LibraryUnitErrorsTask>());
+    expect(outputs, hasLength(1));
+    List<AnalysisError> errors = outputs[LIBRARY_UNIT_ERRORS];
+    expect(errors, hasLength(1));
+  }
+
+  test_perform_partInSingleLibrary() {
+    AnalysisTarget library =
+        newSource('/lib.dart', 'library test; part "part.dart";');
+    AnalysisTarget part = newSource('/part.dart', 'part of test;');
+    computeResult(new LibrarySpecificUnit(library, part), LIBRARY_UNIT_ERRORS);
+    expect(task, new isInstanceOf<LibraryUnitErrorsTask>());
+    expect(outputs, hasLength(1));
+    List<AnalysisError> errors = outputs[LIBRARY_UNIT_ERRORS];
+    expect(errors, hasLength(0));
+  }
+}
+
+@reflectiveTest
+class ParseDartTaskTest extends _AbstractDartTaskTest {
+  Source source;
+
+  test_buildInputs() {
+    Map<String, TaskInput> inputs = ParseDartTask.buildInputs(emptySource);
+    expect(inputs, isNotNull);
+    expect(
+        inputs.keys,
+        unorderedEquals([
+          ParseDartTask.LINE_INFO_INPUT_NAME,
+          ParseDartTask.MODIFICATION_TIME_INPUT_NAME,
+          ParseDartTask.TOKEN_STREAM_INPUT_NAME
+        ]));
+  }
+
+  test_constructor() {
+    ParseDartTask task = new ParseDartTask(context, emptySource);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, emptySource);
+  }
+
+  test_createTask() {
+    ParseDartTask task = ParseDartTask.createTask(context, emptySource);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, emptySource);
+  }
+
+  test_description() {
+    ParseDartTask task = new ParseDartTask(null, emptySource);
+    expect(task.description, isNotNull);
+  }
+
+  test_descriptor() {
+    TaskDescriptor descriptor = ParseDartTask.DESCRIPTOR;
+    expect(descriptor, isNotNull);
+  }
+
+  test_perform() {
+    _performParseTask(r'''
+part of lib;
+class B {}''');
+    expect(outputs, hasLength(8));
+    expect(outputs[EXPLICITLY_IMPORTED_LIBRARIES], hasLength(0));
+    expect(outputs[EXPORTED_LIBRARIES], hasLength(0));
+    _assertHasCore(outputs[IMPORTED_LIBRARIES], 1);
+    expect(outputs[INCLUDED_PARTS], hasLength(0));
+    expect(outputs[PARSE_ERRORS], hasLength(0));
+    expect(outputs[PARSED_UNIT], isNotNull);
+    expect(outputs[SOURCE_KIND], SourceKind.PART);
+    expect(outputs[UNITS], hasLength(1));
+  }
+
+  test_perform_computeSourceKind_noDirectives_hasContainingLibrary() {
+    // Parse "lib.dart" to let the context know that "test.dart" is included.
+    computeResult(
+        newSource(
+            '/lib.dart',
+            r'''
+library lib;
+part 'test.dart';
+'''),
+        PARSED_UNIT);
+    // If there are no the "part of" directive, then it is not a part.
+    _performParseTask('');
+    expect(outputs[SOURCE_KIND], SourceKind.LIBRARY);
+  }
+
+  test_perform_computeSourceKind_noDirectives_noContainingLibrary() {
+    _performParseTask('');
+    expect(outputs[SOURCE_KIND], SourceKind.LIBRARY);
+  }
+
+  test_perform_doesNotExist() {
+    _performParseTask(null);
+    expect(outputs, hasLength(8));
+    expect(outputs[EXPLICITLY_IMPORTED_LIBRARIES], hasLength(0));
+    expect(outputs[EXPORTED_LIBRARIES], hasLength(0));
+    _assertHasCore(outputs[IMPORTED_LIBRARIES], 1);
+    expect(outputs[INCLUDED_PARTS], hasLength(0));
+    expect(outputs[PARSE_ERRORS], hasLength(0));
+    expect(outputs[PARSED_UNIT], isNotNull);
+    expect(outputs[SOURCE_KIND], SourceKind.UNKNOWN);
+    expect(outputs[UNITS], hasLength(1));
+  }
+
+  test_perform_invalidDirectives() {
+    _performParseTask(r'''
+library lib;
+import '/does/not/exist.dart';
+import '://invaliduri.dart';
+export '${a}lib3.dart';
+part 'part.dart';
+class A {}''');
+    expect(outputs, hasLength(8));
+    expect(outputs[EXPLICITLY_IMPORTED_LIBRARIES], hasLength(1));
+    expect(outputs[EXPORTED_LIBRARIES], hasLength(0));
+    _assertHasCore(outputs[IMPORTED_LIBRARIES], 2);
+    expect(outputs[INCLUDED_PARTS], hasLength(1));
+    expect(outputs[PARSE_ERRORS], hasLength(2));
+    expect(outputs[PARSED_UNIT], isNotNull);
+    expect(outputs[SOURCE_KIND], SourceKind.LIBRARY);
+    expect(outputs[UNITS], hasLength(2));
+  }
+
+  test_perform_library() {
+    _performParseTask(r'''
+library lib;
+import 'lib2.dart';
+export 'lib3.dart';
+part 'part.dart';
+class A {''');
+    expect(outputs, hasLength(8));
+    expect(outputs[EXPLICITLY_IMPORTED_LIBRARIES], hasLength(1));
+    expect(outputs[EXPORTED_LIBRARIES], hasLength(1));
+    _assertHasCore(outputs[IMPORTED_LIBRARIES], 2);
+    expect(outputs[INCLUDED_PARTS], hasLength(1));
+    expect(outputs[PARSE_ERRORS], hasLength(1));
+    expect(outputs[PARSED_UNIT], isNotNull);
+    expect(outputs[SOURCE_KIND], SourceKind.LIBRARY);
+    expect(outputs[UNITS], hasLength(2));
+  }
+
+  test_perform_library_selfReferenceAsPart() {
+    _performParseTask(r'''
+library lib;
+part 'test.dart';
+''');
+    expect(outputs[INCLUDED_PARTS], unorderedEquals(<Source>[source]));
+  }
+
+  test_perform_part() {
+    _performParseTask(r'''
+part of lib;
+class B {}''');
+    expect(outputs, hasLength(8));
+    expect(outputs[EXPLICITLY_IMPORTED_LIBRARIES], hasLength(0));
+    expect(outputs[EXPORTED_LIBRARIES], hasLength(0));
+    _assertHasCore(outputs[IMPORTED_LIBRARIES], 1);
+    expect(outputs[INCLUDED_PARTS], hasLength(0));
+    expect(outputs[PARSE_ERRORS], hasLength(0));
+    expect(outputs[PARSED_UNIT], isNotNull);
+    expect(outputs[SOURCE_KIND], SourceKind.PART);
+    expect(outputs[UNITS], hasLength(1));
+  }
+
+  void _performParseTask(String content) {
+    source = newSource('/test.dart', content);
+    computeResult(source, PARSED_UNIT);
+    expect(task, new isInstanceOf<ParseDartTask>());
+  }
+
+  static void _assertHasCore(List<Source> sources, int lenght) {
+    expect(sources, hasLength(lenght));
+    expect(sources, contains(predicate((Source s) {
+      return s.fullName.endsWith('core.dart');
+    })));
+  }
+}
+
+@reflectiveTest
+class PartiallyResolveReferencesTaskTest extends _AbstractDartTaskTest {
+  test_perform() {
+    enableStrongMode();
+    Source source = newSource(
+        '/test.dart',
+        '''
+int a = b;
+int b = c;
+var d = 0;
+class A {}
+class C {
+  static final f = '';
+  var g = 0;
+}
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, RESOLVED_UNIT5);
+    expect(task, new isInstanceOf<PartiallyResolveUnitReferencesTask>());
+    // Test the outputs
+    expect(outputs[CLASSES_IN_UNIT], hasLength(2));
+    expect(outputs[INFERABLE_STATIC_VARIABLES_IN_UNIT], hasLength(2));
+    CompilationUnit unit = outputs[RESOLVED_UNIT5];
+    expect(unit, same(outputs[RESOLVED_UNIT5]));
+    // Test the state of the AST
+    TopLevelVariableDeclaration a = unit.declarations[0];
+    VariableDeclaration variableA = a.variables.variables[0];
+    SimpleIdentifier initializer = variableA.initializer;
+    expect(initializer.staticElement, isNotNull);
+    // Test the error generation
+    _fillErrorListener(PARTIALLY_RESOLVE_REFERENCES_ERRORS);
+    errorListener.assertErrorsWithCodes(
+        <ErrorCode>[StaticWarningCode.UNDEFINED_IDENTIFIER]);
+  }
+
+  test_perform_importExport() {
+    newSource(
+        '/a.dart',
+        '''
+library a;
+class A<T> {
+  T m() {}
+}
+''');
+    newSource(
+        '/b.dart',
+        '''
+library b;
+export 'a.dart';
+''');
+    Source sourceC = newSource(
+        '/c.dart',
+        '''
+library c;
+import 'b.dart';
+main() {
+  new A<int>().m();
+}
+''');
+    computeResult(new LibrarySpecificUnit(sourceC, sourceC), RESOLVED_UNIT5);
+    expect(task, new isInstanceOf<PartiallyResolveUnitReferencesTask>());
+    // validate
+    expect(outputs[CLASSES_IN_UNIT], hasLength(0));
+    expect(outputs[INFERABLE_STATIC_VARIABLES_IN_UNIT], hasLength(0));
+    CompilationUnit unit = outputs[RESOLVED_UNIT5];
+    expect(unit, isNotNull);
+
+    FunctionDeclaration functionDeclaration = unit.declarations[0];
+    BlockFunctionBody body = functionDeclaration.functionExpression.body;
+    List<Statement> statements = body.block.statements;
+    ExpressionStatement statement = statements[0];
+    MethodInvocation invocation = statement.expression;
+    MethodElement methodElement = invocation.methodName.staticElement;
+    expect(methodElement, isNotNull);
+    expect(methodElement.type, isNotNull);
+    expect(methodElement.returnType.toString(), 'int');
+  }
+}
+
+@reflectiveTest
+class ResolveLibraryTypeNamesTaskTest extends _AbstractDartTaskTest {
+  test_perform() {
+    Source sourceLib = newSource(
+        '/my_lib.dart',
+        '''
+library my_lib;
+part 'my_part.dart';
+class A {}
+class B extends A {}
+''');
+    newSource(
+        '/my_part.dart',
+        '''
+part of my_lib;
+class C extends A {}
+''');
+    computeResult(sourceLib, LIBRARY_ELEMENT5);
+    expect(task, new isInstanceOf<ResolveLibraryTypeNamesTask>());
+    // validate
+    LibraryElement library = outputs[LIBRARY_ELEMENT5];
+    {
+      ClassElement classB = library.getType('B');
+      expect(classB.supertype.displayName, 'A');
+    }
+    {
+      ClassElement classC = library.getType('C');
+      expect(classC.supertype.displayName, 'A');
+    }
+  }
+
+  test_perform_external() {
+    Source sourceA = newSource(
+        '/a.dart',
+        '''
+library a;
+import 'b.dart';
+class A extends B {}
+''');
+    newSource(
+        '/b.dart',
+        '''
+library b;
+class B {}
+''');
+    // The reference A to B should be resolved, but there's no requirement that
+    // the full class hierarchy be resolved.
+    computeResult(sourceA, LIBRARY_ELEMENT5);
+    expect(task, new isInstanceOf<ResolveLibraryTypeNamesTask>());
+    // validate
+    LibraryElement library = outputs[LIBRARY_ELEMENT5];
+    {
+      ClassElement clazz = library.getType('A');
+      expect(clazz.displayName, 'A');
+      clazz = clazz.supertype.element;
+      expect(clazz.displayName, 'B');
+    }
+  }
+}
+
+@reflectiveTest
+class ResolveReferencesTaskTest extends _AbstractDartTaskTest {
+  test_perform() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+class A {
+  m() {}
+}
+main(A a) {
+  a.m();
+}
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    // prepare unit and "a.m()" invocation
+    computeResult(target, RESOLVED_UNIT8);
+    CompilationUnit unit = outputs[RESOLVED_UNIT8];
+    // walk the AST
+    FunctionDeclaration function = unit.declarations[1];
+    BlockFunctionBody body = function.functionExpression.body;
+    ExpressionStatement statement = body.block.statements[0];
+    MethodInvocation invocation = statement.expression;
+    expect(task, new isInstanceOf<ResolveUnitReferencesTask>());
+    expect(unit, same(outputs[RESOLVED_UNIT8]));
+    // a.m() is resolved now
+    expect(invocation.methodName.staticElement, isNotNull);
+  }
+
+  test_perform_errors() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+class A {
+}
+main(A a) {
+  a.unknownMethod();
+}
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, RESOLVED_UNIT8);
+    expect(task, new isInstanceOf<ResolveUnitReferencesTask>());
+    // validate
+    _fillErrorListener(RESOLVE_REFERENCES_ERRORS);
+    errorListener.assertErrorsWithCodes(
+        <ErrorCode>[StaticTypeWarningCode.UNDEFINED_METHOD]);
+  }
+
+  test_perform_importExport() {
+    newSource(
+        '/a.dart',
+        '''
+library a;
+class A<T> {
+  T m() {}
+}
+''');
+    newSource(
+        '/b.dart',
+        '''
+library b;
+export 'a.dart';
+''');
+    Source sourceC = newSource(
+        '/c.dart',
+        '''
+library c;
+import 'b.dart';
+main() {
+  new A<int>().m();
+}
+''');
+    computeResult(new LibrarySpecificUnit(sourceC, sourceC), RESOLVED_UNIT8);
+    expect(task, new isInstanceOf<ResolveUnitReferencesTask>());
+    // validate
+    CompilationUnit unit = outputs[RESOLVED_UNIT8];
+    expect(unit, isNotNull);
+    {
+      FunctionDeclaration functionDeclaration = unit.declarations[0];
+      BlockFunctionBody body = functionDeclaration.functionExpression.body;
+      List<Statement> statements = body.block.statements;
+      ExpressionStatement statement = statements[0];
+      MethodInvocation invocation = statement.expression;
+      MethodElement methodElement = invocation.methodName.staticElement;
+      expect(methodElement, isNotNull);
+      expect(methodElement.type, isNotNull);
+      expect(methodElement.returnType.toString(), 'int');
+    }
+  }
+}
+
+@reflectiveTest
+class ResolveUnitTypeNamesTaskTest extends _AbstractDartTaskTest {
+  test_perform() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+class A {}
+class B extends A {}
+int f(String p) => p.length;
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, RESOLVED_UNIT3);
+    expect(task, new isInstanceOf<ResolveUnitTypeNamesTask>());
+    // validate
+    CompilationUnit unit = outputs[RESOLVED_UNIT3];
+    {
+      ClassDeclaration nodeA = unit.declarations[0];
+      ClassDeclaration nodeB = unit.declarations[1];
+      DartType extendsType = nodeB.extendsClause.superclass.type;
+      expect(extendsType, nodeA.element.type);
+    }
+    {
+      FunctionDeclaration functionNode = unit.declarations[2];
+      DartType returnType = functionNode.returnType.type;
+      List<FormalParameter> parameters =
+          functionNode.functionExpression.parameters.parameters;
+      expect(returnType.displayName, 'int');
+      expect(parameters[0].element.type.displayName, 'String');
+    }
+  }
+
+  test_perform_errors() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+NoSuchClass f() => null;
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, RESOLVE_TYPE_NAMES_ERRORS);
+    expect(task, new isInstanceOf<ResolveUnitTypeNamesTask>());
+    // validate
+    _fillErrorListener(RESOLVE_TYPE_NAMES_ERRORS);
+    errorListener
+        .assertErrorsWithCodes(<ErrorCode>[StaticWarningCode.UNDEFINED_CLASS]);
+  }
+
+  test_perform_typedef() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+typedef int F(G g);
+typedef String G(int p);
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, RESOLVED_UNIT3);
+    expect(task, new isInstanceOf<ResolveUnitTypeNamesTask>());
+    // validate
+    CompilationUnit unit = outputs[RESOLVED_UNIT3];
+    FunctionTypeAlias nodeF = unit.declarations[0];
+    FunctionTypeAlias nodeG = unit.declarations[1];
+    {
+      FormalParameter parameter = nodeF.parameters.parameters[0];
+      DartType parameterType = parameter.element.type;
+      Element returnTypeElement = nodeF.returnType.type.element;
+      expect(returnTypeElement.displayName, 'int');
+      expect(parameterType.element, nodeG.element);
+    }
+    {
+      FormalParameter parameter = nodeG.parameters.parameters[0];
+      DartType parameterType = parameter.element.type;
+      expect(nodeG.returnType.type.element.displayName, 'String');
+      expect(parameterType.element.displayName, 'int');
+    }
+  }
+
+  test_perform_typedef_errors() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+typedef int F(NoSuchType p);
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, RESOLVE_TYPE_NAMES_ERRORS);
+    expect(task, new isInstanceOf<ResolveUnitTypeNamesTask>());
+    // validate
+    _fillErrorListener(RESOLVE_TYPE_NAMES_ERRORS);
+    errorListener
+        .assertErrorsWithCodes(<ErrorCode>[StaticWarningCode.UNDEFINED_CLASS]);
+  }
+}
+
+@reflectiveTest
+class ResolveVariableReferencesTaskTest extends _AbstractDartTaskTest {
+  /**
+   * Verify that the mutated states of the given [variable] correspond to the
+   * [mutatedInClosure] and [mutatedInScope] matchers.
+   */
+  void expectMutated(VariableElement variable, Matcher mutatedInClosure,
+      Matcher mutatedInScope) {
+    expect(variable.isPotentiallyMutatedInClosure, mutatedInClosure);
+    expect(variable.isPotentiallyMutatedInScope, mutatedInScope);
+  }
+
+  test_perform_buildClosureLibraryElements() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+main() {
+}
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, RESOLVED_UNIT4);
+    expect(task, new isInstanceOf<ResolveVariableReferencesTask>());
+  }
+
+  test_perform_local() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+main() {
+  var v1 = 1;
+  var v2 = 1;
+  var v3 = 1;
+  var v4 = 1;
+  v2 = 2;
+  v4 = 2;
+  localFunction() {
+    v3 = 3;
+    v4 = 3;
+  }
+}
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, RESOLVED_UNIT4);
+    expect(task, new isInstanceOf<ResolveVariableReferencesTask>());
+    // validate
+    CompilationUnit unit = outputs[RESOLVED_UNIT4];
+    FunctionElement main = unit.element.functions[0];
+    expectMutated(main.localVariables[0], isFalse, isFalse);
+    expectMutated(main.localVariables[1], isFalse, isTrue);
+    expectMutated(main.localVariables[2], isTrue, isTrue);
+    expectMutated(main.localVariables[3], isTrue, isTrue);
+  }
+
+  test_perform_parameter() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+main(p1, p2, p3, p4) {
+  p2 = 2;
+  p4 = 2;
+  localFunction() {
+    p3 = 3;
+    p4 = 3;
+  }
+}
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, RESOLVED_UNIT4);
+    expect(task, new isInstanceOf<ResolveVariableReferencesTask>());
+    // validate
+    CompilationUnit unit = outputs[RESOLVED_UNIT4];
+    FunctionElement main = unit.element.functions[0];
+    expectMutated(main.parameters[0], isFalse, isFalse);
+    expectMutated(main.parameters[1], isFalse, isTrue);
+    expectMutated(main.parameters[2], isTrue, isTrue);
+    expectMutated(main.parameters[3], isTrue, isTrue);
+  }
+}
+
+@reflectiveTest
+class ScanDartTaskTest extends _AbstractDartTaskTest {
+  test_buildInputs() {
+    Map<String, TaskInput> inputs = ScanDartTask.buildInputs(emptySource);
+    expect(inputs, isNotNull);
+    expect(inputs.keys, unorderedEquals([ScanDartTask.CONTENT_INPUT_NAME]));
+  }
+
+  test_constructor() {
+    ScanDartTask task = new ScanDartTask(context, emptySource);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, emptySource);
+  }
+
+  test_createTask() {
+    ScanDartTask task = ScanDartTask.createTask(context, emptySource);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, emptySource);
+  }
+
+  test_description() {
+    ScanDartTask task = new ScanDartTask(null, emptySource);
+    expect(task.description, isNotNull);
+  }
+
+  test_descriptor() {
+    TaskDescriptor descriptor = ScanDartTask.DESCRIPTOR;
+    expect(descriptor, isNotNull);
+  }
+
+  test_perform_errors() {
+    _performScanTask('import "');
+    expect(outputs, hasLength(3));
+    expect(outputs[LINE_INFO], isNotNull);
+    expect(outputs[SCAN_ERRORS], hasLength(1));
+    expect(outputs[TOKEN_STREAM], isNotNull);
+  }
+
+  test_perform_noErrors() {
+    _performScanTask('class A {}');
+    expect(outputs, hasLength(3));
+    expect(outputs[LINE_INFO], isNotNull);
+    expect(outputs[SCAN_ERRORS], hasLength(0));
+    expect(outputs[TOKEN_STREAM], isNotNull);
+  }
+
+  test_perform_script() {
+    String scriptContent = '''
+      void buttonPressed() {
+    ''';
+    String htmlContent = '''
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>test page</title>
+    <script type='application/dart'>$scriptContent</script>
+  </head>
+  <body>Test</body>
+</html>
+''';
+    Source source = newSource('/test.html', htmlContent);
+    DartScript script =
+        new DartScript(source, [new ScriptFragment(97, 5, 36, scriptContent)]);
+
+    computeResult(script, TOKEN_STREAM);
+    expect(task, new isInstanceOf<ScanDartTask>());
+    expect(outputs[LINE_INFO], isNotNull);
+    expect(outputs[SCAN_ERRORS], isEmpty);
+    Token tokenStream = outputs[TOKEN_STREAM];
+    expect(tokenStream, isNotNull);
+    expect(tokenStream.lexeme, 'void');
+  }
+
+  void _performScanTask(String content) {
+    AnalysisTarget target = newSource('/test.dart', content);
+    computeResult(target, TOKEN_STREAM);
+    expect(task, new isInstanceOf<ScanDartTask>());
+  }
+}
+
+@reflectiveTest
+class VerifyUnitTaskTest extends _AbstractDartTaskTest {
+  test_perform_constantError() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+main(int p) {
+  const v = p;
+}
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, VERIFY_ERRORS);
+    expect(task, new isInstanceOf<VerifyUnitTask>());
+    // validate
+    _fillErrorListener(VERIFY_ERRORS);
+    errorListener.assertErrorsWithCodes(<ErrorCode>[
+      CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
+    ]);
+  }
+
+  test_perform_directiveError() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+import 'no-such-file.dart';
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, VERIFY_ERRORS);
+    expect(task, new isInstanceOf<VerifyUnitTask>());
+    // validate
+    _fillErrorListener(VERIFY_ERRORS);
+    errorListener.assertErrorsWithCodes(
+        <ErrorCode>[CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
+  }
+
+  test_perform_verifyError() {
+    Source source = newSource(
+        '/test.dart',
+        '''
+main() {
+  if (42) {
+    print('Not bool!');
+  }
+}
+''');
+    LibrarySpecificUnit target = new LibrarySpecificUnit(source, source);
+    computeResult(target, VERIFY_ERRORS);
+    expect(task, new isInstanceOf<VerifyUnitTask>());
+    // validate
+    _fillErrorListener(VERIFY_ERRORS);
+    errorListener.assertErrorsWithCodes(
+        <ErrorCode>[StaticTypeWarningCode.NON_BOOL_CONDITION]);
+  }
+}
+
+class _AbstractDartTaskTest extends AbstractContextTest {
+  Source emptySource;
+
+  GatheringErrorListener errorListener = new GatheringErrorListener();
+
+  void assertIsInvalid(AnalysisTarget target, ResultDescriptor descriptor) {
+    CacheEntry entry = context.getCacheEntry(target);
+    expect(entry.isInvalid(descriptor), isTrue);
+  }
+
+  void assertIsValid(AnalysisTarget target, ResultDescriptor descriptor) {
+    CacheEntry entry = context.getCacheEntry(target);
+    expect(entry.isValid(descriptor), isTrue);
+  }
+
+  void assertSameResults(List<ResultDescriptor> descriptors) {
+    descriptors.forEach((descriptor) {
+      var oldResult = oldOutputs[descriptor];
+      var newResult = outputs[descriptor];
+      expect(newResult, same(oldResult), reason: descriptor.name);
+    });
+  }
+
+  /**
+   * Create a script object with a single fragment containing the given
+   * [scriptContent].
+   */
+  DartScript createScript(String scriptContent) {
+    String htmlContent = '''
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>test page</title>
+    <script type='application/dart'>$scriptContent</script>
+  </head>
+  <body>Test</body>
+</html>
+''';
+    Source source = newSource('/test.html', htmlContent);
+    return new DartScript(
+        source, [new ScriptFragment(97, 5, 36, scriptContent)]);
+  }
+
+  /**
+   * Enable strong mode in the current analysis context.
+   */
+  void enableStrongMode() {
+    AnalysisOptionsImpl options = context.analysisOptions;
+    options.strongMode = true;
+    context.analysisOptions = options;
+  }
+
+  /**
+   * Return the declaration of the class with the given [className] in the given
+   * compilation [unit].
+   */
+  ClassDeclaration getClass(CompilationUnit unit, String className) {
+    NodeList<CompilationUnitMember> unitMembers = unit.declarations;
+    for (CompilationUnitMember unitMember in unitMembers) {
+      if (unitMember is ClassDeclaration && unitMember.name.name == className) {
+        return unitMember;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the declaration of the field with the given [fieldName] in the class
+   * with the given [className] in the given compilation [unit].
+   */
+  VariableDeclaration getFieldInClass(
+      CompilationUnit unit, String className, String fieldName) {
+    ClassDeclaration unitMember = getClass(unit, className);
+    if (unitMember == null) {
+      return null;
+    }
+    NodeList<ClassMember> classMembers = unitMember.members;
+    for (ClassMember classMember in classMembers) {
+      if (classMember is FieldDeclaration) {
+        NodeList<VariableDeclaration> fields = classMember.fields.variables;
+        for (VariableDeclaration field in fields) {
+          if (field.name.name == fieldName) {
+            return field;
+          }
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Return the declaration of the top-level variable with the given
+   * [variableName] in the given compilation [unit].
+   */
+  VariableDeclaration getTopLevelVariable(
+      CompilationUnit unit, String variableName) {
+    NodeList<CompilationUnitMember> unitMembers = unit.declarations;
+    for (CompilationUnitMember unitMember in unitMembers) {
+      if (unitMember is TopLevelVariableDeclaration) {
+        NodeList<VariableDeclaration> variables =
+            unitMember.variables.variables;
+        for (VariableDeclaration variable in variables) {
+          if (variable.name.name == variableName) {
+            return variable;
+          }
+        }
+      }
+    }
+    return null;
+  }
+
+  void setUp() {
+    super.setUp();
+    emptySource = newSource('/test.dart');
+  }
+
+  /**
+   * Fill [errorListener] with [result] errors in the current [task].
+   */
+  void _fillErrorListener(ResultDescriptor<List<AnalysisError>> result) {
+    List<AnalysisError> errors = task.outputs[result];
+    expect(errors, isNotNull, reason: result.name);
+    errorListener = new GatheringErrorListener();
+    errorListener.addAll(errors);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/task/dart_work_manager_test.dart b/mojo/public/dart/third_party/analyzer/test/src/task/dart_work_manager_test.dart
new file mode 100644
index 0000000..a5b6b26
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/task/dart_work_manager_test.dart
@@ -0,0 +1,727 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.task.dart_work_manager_test;
+
+import 'package:analyzer/src/context/cache.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/engine.dart'
+    show
+        AnalysisErrorInfo,
+        AnalysisErrorInfoImpl,
+        CacheState,
+        ChangeNoticeImpl,
+        InternalAnalysisContext;
+import 'package:analyzer/src/generated/error.dart' show AnalysisError;
+import 'package:analyzer/src/generated/java_engine.dart' show CaughtException;
+import 'package:analyzer/src/generated/scanner.dart' show ScannerErrorCode;
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/testing/ast_factory.dart';
+import 'package:analyzer/src/task/dart.dart';
+import 'package:analyzer/src/task/dart_work_manager.dart';
+import 'package:analyzer/src/task/driver.dart';
+import 'package:analyzer/task/dart.dart';
+import 'package:analyzer/task/general.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:typed_mock/typed_mock.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../generated/test_support.dart';
+import '../../reflective_tests.dart';
+import '../../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(DartWorkManagerTest);
+}
+
+@reflectiveTest
+class DartWorkManagerTest {
+  InternalAnalysisContext context = new _InternalAnalysisContextMock();
+  AnalysisCache cache;
+  DartWorkManager manager;
+
+  CaughtException caughtException = new CaughtException(null, null);
+
+  Source source1 = new TestSource('1.dart');
+  Source source2 = new TestSource('2.dart');
+  Source source3 = new TestSource('3.dart');
+  Source source4 = new TestSource('4.dart');
+  CacheEntry entry1;
+  CacheEntry entry2;
+  CacheEntry entry3;
+  CacheEntry entry4;
+
+  void expect_librarySourceQueue(List<Source> sources) {
+    expect(manager.librarySourceQueue, unorderedEquals(sources));
+  }
+
+  void expect_unknownSourceQueue(List<Source> sources) {
+    expect(manager.unknownSourceQueue, unorderedEquals(sources));
+  }
+
+  void setUp() {
+    cache = context.analysisCache;
+    manager = new DartWorkManager(context);
+    entry1 = context.getCacheEntry(source1);
+    entry2 = context.getCacheEntry(source2);
+    entry3 = context.getCacheEntry(source3);
+    entry4 = context.getCacheEntry(source4);
+  }
+
+  void test_applyChange_add() {
+    // add source1
+    manager.applyChange([source1], [], []);
+    expect_unknownSourceQueue([source1]);
+    expect_librarySourceQueue([]);
+    // add source2
+    manager.applyChange([source2], [], []);
+    expect_librarySourceQueue([]);
+    expect_unknownSourceQueue([source1, source2]);
+  }
+
+  void test_applyChange_add_duplicate() {
+    // add source1
+    manager.applyChange([source1], [], []);
+    expect_unknownSourceQueue([source1]);
+    expect_librarySourceQueue([]);
+    // add source2
+    manager.applyChange([source1], [], []);
+    expect_librarySourceQueue([]);
+    expect_unknownSourceQueue([source1]);
+  }
+
+  void test_applyChange_addRemove() {
+    manager.applyChange([source1, source2], [], [source2, source3]);
+    expect_unknownSourceQueue([source1]);
+    expect_librarySourceQueue([]);
+  }
+
+  void test_applyChange_change() {
+    manager.librarySourceQueue.addAll([source1, source3]);
+    manager.unknownSourceQueue.addAll([source4]);
+    // change source1
+    manager.applyChange([], [source1], []);
+    expect_librarySourceQueue([source3]);
+    expect_unknownSourceQueue([source4, source1]);
+  }
+
+  void test_applyChange_remove() {
+    manager.librarySourceQueue.addAll([source1, source3]);
+    manager.unknownSourceQueue.addAll([source4]);
+    // remove source1
+    manager.applyChange([], [], [source1]);
+    expect_librarySourceQueue([source3]);
+    expect_unknownSourceQueue([source4]);
+    // remove source3
+    manager.applyChange([], [], [source3]);
+    expect_librarySourceQueue([]);
+    expect_unknownSourceQueue([source4]);
+    // remove source4
+    manager.applyChange([], [], [source4]);
+    expect_librarySourceQueue([]);
+    expect_unknownSourceQueue([]);
+  }
+
+  void test_applyChange_updatePartsLibraries_changeLibrary() {
+    Source part1 = new TestSource('part1.dart');
+    Source part2 = new TestSource('part2.dart');
+    Source part3 = new TestSource('part3.dart');
+    Source library1 = new TestSource('library1.dart');
+    Source library2 = new TestSource('library2.dart');
+    manager.partLibrariesMap[part1] = [library1, library2];
+    manager.partLibrariesMap[part2] = [library2];
+    manager.partLibrariesMap[part3] = [library1];
+    manager.libraryPartsMap[library1] = [part1, part3];
+    manager.libraryPartsMap[library2] = [part1, part2];
+    _getOrCreateEntry(part1).setValue(CONTAINING_LIBRARIES, [], []);
+    expect(cache.getState(part1, CONTAINING_LIBRARIES), CacheState.VALID);
+    // change library1
+    manager.applyChange([], [library1], []);
+    expect(manager.partLibrariesMap[part1], unorderedEquals([library2]));
+    expect(manager.partLibrariesMap[part2], unorderedEquals([library2]));
+    expect(manager.partLibrariesMap[part3], unorderedEquals([]));
+    expect(manager.libraryPartsMap[library1], isNull);
+    expect(manager.libraryPartsMap[library2], [part1, part2]);
+    expect(cache.getState(part1, CONTAINING_LIBRARIES), CacheState.INVALID);
+  }
+
+  void test_applyChange_updatePartsLibraries_changePart() {
+    Source part1 = new TestSource('part1.dart');
+    Source part2 = new TestSource('part2.dart');
+    Source part3 = new TestSource('part3.dart');
+    Source library1 = new TestSource('library1.dart');
+    Source library2 = new TestSource('library2.dart');
+    manager.partLibrariesMap[part1] = [library1, library2];
+    manager.partLibrariesMap[part2] = [library2];
+    manager.partLibrariesMap[part3] = [library1];
+    manager.libraryPartsMap[library1] = [part1, part3];
+    manager.libraryPartsMap[library2] = [part1, part2];
+    _getOrCreateEntry(part1).setValue(CONTAINING_LIBRARIES, [], []);
+    expect(cache.getState(part1, CONTAINING_LIBRARIES), CacheState.VALID);
+    // change part1
+    manager.applyChange([], [part1], []);
+    expect(manager.partLibrariesMap[part2], unorderedEquals([library2]));
+    expect(manager.partLibrariesMap[part3], unorderedEquals([library1]));
+    expect(manager.libraryPartsMap[library1], [part1, part3]);
+    expect(manager.libraryPartsMap[library2], [part1, part2]);
+    expect(cache.getState(part1, CONTAINING_LIBRARIES), CacheState.INVALID);
+  }
+
+  void test_applyChange_updatePartsLibraries_removeLibrary() {
+    Source part1 = new TestSource('part1.dart');
+    Source part2 = new TestSource('part2.dart');
+    Source part3 = new TestSource('part3.dart');
+    Source library1 = new TestSource('library1.dart');
+    Source library2 = new TestSource('library2.dart');
+    manager.partLibrariesMap[part1] = [library1, library2];
+    manager.partLibrariesMap[part2] = [library2];
+    manager.partLibrariesMap[part3] = [library1];
+    manager.libraryPartsMap[library1] = [part1, part3];
+    manager.libraryPartsMap[library2] = [part1, part2];
+    // remove library1
+    manager.applyChange([], [], [library1]);
+    expect(manager.partLibrariesMap[part1], unorderedEquals([library2]));
+    expect(manager.partLibrariesMap[part2], unorderedEquals([library2]));
+    expect(manager.partLibrariesMap[part3], unorderedEquals([]));
+    expect(manager.libraryPartsMap[library1], isNull);
+    expect(manager.libraryPartsMap[library2], [part1, part2]);
+  }
+
+  void test_applyChange_updatePartsLibraries_removePart() {
+    Source part1 = new TestSource('part1.dart');
+    Source part2 = new TestSource('part2.dart');
+    Source part3 = new TestSource('part3.dart');
+    Source library1 = new TestSource('library1.dart');
+    Source library2 = new TestSource('library2.dart');
+    manager.partLibrariesMap[part1] = [library1, library2];
+    manager.partLibrariesMap[part2] = [library2];
+    manager.partLibrariesMap[part3] = [library1];
+    manager.libraryPartsMap[library1] = [part1, part3];
+    manager.libraryPartsMap[library2] = [part1, part2];
+    // remove part1
+    manager.applyChange([], [], [part1]);
+    expect(manager.partLibrariesMap[part1], isNull);
+    expect(manager.partLibrariesMap[part2], unorderedEquals([library2]));
+    expect(manager.partLibrariesMap[part3], unorderedEquals([library1]));
+    expect(manager.libraryPartsMap[library1], [part1, part3]);
+    expect(manager.libraryPartsMap[library2], [part1, part2]);
+  }
+
+  void test_applyPriorityTargets_isLibrary_computeErrors() {
+    when(context.shouldErrorsBeAnalyzed(source2, null)).thenReturn(true);
+    when(context.shouldErrorsBeAnalyzed(source3, null)).thenReturn(true);
+    entry1.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
+    entry2.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
+    entry3.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
+    manager.priorityResultQueue
+        .add(new TargetedResult(source1, LIBRARY_ERRORS_READY));
+    manager.priorityResultQueue
+        .add(new TargetedResult(source2, LIBRARY_ERRORS_READY));
+    // -source1 +source3
+    manager.applyPriorityTargets([source2, source3]);
+    expect(
+        manager.priorityResultQueue,
+        unorderedEquals([
+          new TargetedResult(source2, LIBRARY_ERRORS_READY),
+          new TargetedResult(source3, LIBRARY_ERRORS_READY)
+        ]));
+    // get next request
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source2);
+    expect(request.result, LIBRARY_ERRORS_READY);
+  }
+
+  void test_applyPriorityTargets_isLibrary_computeUnit() {
+    when(context.shouldErrorsBeAnalyzed(source2, null)).thenReturn(false);
+    when(context.shouldErrorsBeAnalyzed(source3, null)).thenReturn(false);
+    entry1.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
+    entry2.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
+    entry3.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
+    manager.priorityResultQueue
+        .add(new TargetedResult(source1, LIBRARY_ERRORS_READY));
+    manager.priorityResultQueue
+        .add(new TargetedResult(source2, LIBRARY_ERRORS_READY));
+    // -source1 +source3
+    manager.applyPriorityTargets([source2, source3]);
+    expect(
+        manager.priorityResultQueue,
+        unorderedEquals([
+          new TargetedResult(
+              new LibrarySpecificUnit(source2, source2), RESOLVED_UNIT),
+          new TargetedResult(
+              new LibrarySpecificUnit(source3, source3), RESOLVED_UNIT),
+        ]));
+  }
+
+  void test_applyPriorityTargets_isPart() {
+    entry1.setValue(SOURCE_KIND, SourceKind.PART, []);
+    entry2.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
+    entry3.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
+    // +source2 +source3
+    when(context.getLibrariesContaining(source1))
+        .thenReturn([source2, source3]);
+    manager.applyPriorityTargets([source1]);
+    expect(
+        manager.priorityResultQueue,
+        unorderedEquals([
+          new TargetedResult(source2, LIBRARY_ERRORS_READY),
+          new TargetedResult(source3, LIBRARY_ERRORS_READY)
+        ]));
+    // get next request
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source2);
+    expect(request.result, LIBRARY_ERRORS_READY);
+  }
+
+  void test_applyPriorityTargets_isUnknown() {
+    manager.applyPriorityTargets([source2, source3]);
+    expect(
+        manager.priorityResultQueue,
+        unorderedEquals([
+          new TargetedResult(source2, SOURCE_KIND),
+          new TargetedResult(source3, SOURCE_KIND)
+        ]));
+    // get next request
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source2);
+    expect(request.result, SOURCE_KIND);
+  }
+
+  void test_getErrors() {
+    AnalysisError error1 =
+        new AnalysisError(source1, 1, 0, ScannerErrorCode.MISSING_DIGIT);
+    AnalysisError error2 =
+        new AnalysisError(source1, 2, 0, ScannerErrorCode.MISSING_DIGIT);
+    when(context.getLibrariesContaining(source1)).thenReturn([source2]);
+    entry1.setValue(SCAN_ERRORS, <AnalysisError>[error1], []);
+    context
+        .getCacheEntry(new LibrarySpecificUnit(source2, source1))
+        .setValue(VERIFY_ERRORS, <AnalysisError>[error2], []);
+    List<AnalysisError> errors = manager.getErrors(source1);
+    expect(errors, unorderedEquals([error1, error2]));
+  }
+
+  void test_getErrors_hasFullList() {
+    AnalysisError error1 =
+        new AnalysisError(source1, 1, 0, ScannerErrorCode.MISSING_DIGIT);
+    AnalysisError error2 =
+        new AnalysisError(source1, 2, 0, ScannerErrorCode.MISSING_DIGIT);
+    when(context.getLibrariesContaining(source1)).thenReturn([source2]);
+    entry1.setValue(DART_ERRORS, <AnalysisError>[error1, error2], []);
+    List<AnalysisError> errors = manager.getErrors(source1);
+    expect(errors, unorderedEquals([error1, error2]));
+  }
+
+  void test_getLibrariesContainingPart() {
+    Source part1 = new TestSource('part1.dart');
+    Source part2 = new TestSource('part2.dart');
+    Source part3 = new TestSource('part3.dart');
+    Source library1 = new TestSource('library1.dart');
+    Source library2 = new TestSource('library2.dart');
+    manager.partLibrariesMap[part1] = [library1, library2];
+    manager.partLibrariesMap[part2] = [library2];
+    manager.libraryPartsMap[library1] = [part1];
+    manager.libraryPartsMap[library2] = [part1, part2];
+    // getLibrariesContainingPart
+    expect(manager.getLibrariesContainingPart(part1),
+        unorderedEquals([library1, library2]));
+    expect(
+        manager.getLibrariesContainingPart(part2), unorderedEquals([library2]));
+    expect(manager.getLibrariesContainingPart(part3), isEmpty);
+  }
+
+  void test_getNextResult_hasLibraries_firstIsError() {
+    entry1.setErrorState(caughtException, [LIBRARY_ERRORS_READY]);
+    manager.librarySourceQueue.addAll([source1, source2]);
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source2);
+    expect(request.result, LIBRARY_ERRORS_READY);
+    // source1 is out, source2 is waiting
+    expect_librarySourceQueue([source2]);
+  }
+
+  void test_getNextResult_hasLibraries_firstIsInvalid() {
+    entry1.setState(LIBRARY_ERRORS_READY, CacheState.INVALID);
+    manager.librarySourceQueue.addAll([source1, source2]);
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source1);
+    expect(request.result, LIBRARY_ERRORS_READY);
+    // no changes until computed
+    expect_librarySourceQueue([source1, source2]);
+  }
+
+  void test_getNextResult_hasLibraries_firstIsValid() {
+    entry1.setValue(LIBRARY_ERRORS_READY, true, []);
+    manager.librarySourceQueue.addAll([source1, source2]);
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source2);
+    expect(request.result, LIBRARY_ERRORS_READY);
+    // source1 is out, source2 is waiting
+    expect_librarySourceQueue([source2]);
+  }
+
+  void test_getNextResult_hasPriority_firstIsError() {
+    manager.addPriorityResult(source1, SOURCE_KIND);
+    manager.addPriorityResult(source2, SOURCE_KIND);
+    expect(
+        manager.priorityResultQueue,
+        unorderedEquals([
+          new TargetedResult(source1, SOURCE_KIND),
+          new TargetedResult(source2, SOURCE_KIND)
+        ]));
+    // configure state and get next result
+    entry1.setErrorState(caughtException, [SOURCE_KIND]);
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source2);
+    expect(request.result, SOURCE_KIND);
+    // source1 is out, source2 is waiting
+    expect(manager.priorityResultQueue,
+        unorderedEquals([new TargetedResult(source2, SOURCE_KIND)]));
+  }
+
+  void test_getNextResult_hasPriority_firstIsValid() {
+    manager.addPriorityResult(source1, SOURCE_KIND);
+    manager.addPriorityResult(source2, SOURCE_KIND);
+    expect(
+        manager.priorityResultQueue,
+        unorderedEquals([
+          new TargetedResult(source1, SOURCE_KIND),
+          new TargetedResult(source2, SOURCE_KIND)
+        ]));
+    // configure state and get next result
+    entry1.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source2);
+    expect(request.result, SOURCE_KIND);
+    // source1 is out, source2 is waiting
+    expect(manager.priorityResultQueue,
+        unorderedEquals([new TargetedResult(source2, SOURCE_KIND)]));
+  }
+
+  void test_getNextResult_hasUnknown_firstIsError() {
+    entry1.setErrorState(caughtException, [SOURCE_KIND]);
+    manager.unknownSourceQueue.addAll([source1, source2]);
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source2);
+    expect(request.result, SOURCE_KIND);
+    // source1 is out, source2 is waiting
+    expect_librarySourceQueue([]);
+    expect_unknownSourceQueue([source2]);
+  }
+
+  void test_getNextResult_hasUnknown_firstIsInvalid() {
+    manager.unknownSourceQueue.addAll([source1, source2]);
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source1);
+    expect(request.result, SOURCE_KIND);
+    // no changes until computed
+    expect_librarySourceQueue([]);
+    expect_unknownSourceQueue([source1, source2]);
+  }
+
+  void test_getNextResult_hasUnknown_firstIsValid() {
+    entry1.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
+    manager.unknownSourceQueue.addAll([source1, source2]);
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source2);
+    expect(request.result, SOURCE_KIND);
+    // source1 is out, source2 is waiting
+    expect_librarySourceQueue([]);
+    expect_unknownSourceQueue([source2]);
+  }
+
+  void test_getNextResult_nothingToDo() {
+    TargetedResult request = manager.getNextResult();
+    expect(request, isNull);
+  }
+
+  void test_getNextResultPriority_hasLibrary() {
+    manager.librarySourceQueue.addAll([source1]);
+    expect(manager.getNextResultPriority(), WorkOrderPriority.NORMAL);
+  }
+
+  void test_getNextResultPriority_hasPriority() {
+    manager.addPriorityResult(source1, SOURCE_KIND);
+    expect(manager.getNextResultPriority(), WorkOrderPriority.PRIORITY);
+  }
+
+  void test_getNextResultPriority_hasUnknown() {
+    manager.unknownSourceQueue.addAll([source1]);
+    expect(manager.getNextResultPriority(), WorkOrderPriority.NORMAL);
+  }
+
+  void test_getNextResultPriority_nothingToDo() {
+    expect(manager.getNextResultPriority(), WorkOrderPriority.NONE);
+  }
+
+  void test_onAnalysisOptionsChanged() {
+    when(context.exists(anyObject)).thenReturn(true);
+    // set cache values
+    entry1.setValue(PARSED_UNIT, AstFactory.compilationUnit(), []);
+    entry1.setValue(IMPORTED_LIBRARIES, <Source>[], []);
+    entry1.setValue(EXPLICITLY_IMPORTED_LIBRARIES, <Source>[], []);
+    entry1.setValue(EXPORTED_LIBRARIES, <Source>[], []);
+    entry1.setValue(INCLUDED_PARTS, <Source>[], []);
+    // configure LibrarySpecificUnit
+    LibrarySpecificUnit unitTarget = new LibrarySpecificUnit(source2, source3);
+    CacheEntry unitEntry = new CacheEntry(unitTarget);
+    cache.put(unitEntry);
+    unitEntry.setValue(BUILD_LIBRARY_ERRORS, <AnalysisError>[], []);
+    expect(unitEntry.getState(BUILD_LIBRARY_ERRORS), CacheState.VALID);
+    // notify
+    manager.onAnalysisOptionsChanged();
+    // resolution is invalidated
+    expect(unitEntry.getState(BUILD_LIBRARY_ERRORS), CacheState.INVALID);
+    // ...but URIs are still value
+    expect(entry1.getState(PARSED_UNIT), CacheState.VALID);
+    expect(entry1.getState(IMPORTED_LIBRARIES), CacheState.VALID);
+    expect(entry1.getState(EXPLICITLY_IMPORTED_LIBRARIES), CacheState.VALID);
+    expect(entry1.getState(EXPORTED_LIBRARIES), CacheState.VALID);
+    expect(entry1.getState(INCLUDED_PARTS), CacheState.VALID);
+  }
+
+  void test_onResultInvalidated_scheduleInvalidatedLibraries() {
+    // set SOURCE_KIND
+    entry1.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
+    entry2.setValue(SOURCE_KIND, SourceKind.PART, []);
+    entry3.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
+    // set LIBRARY_ERRORS_READY for source1 and source3
+    entry1.setValue(LIBRARY_ERRORS_READY, true, []);
+    entry3.setValue(LIBRARY_ERRORS_READY, true, []);
+    // invalidate LIBRARY_ERRORS_READY for source1, schedule it
+    entry1.setState(LIBRARY_ERRORS_READY, CacheState.INVALID);
+    expect_librarySourceQueue([source1]);
+    // invalidate LIBRARY_ERRORS_READY for source3, schedule it
+    entry3.setState(LIBRARY_ERRORS_READY, CacheState.INVALID);
+    expect_librarySourceQueue([source1, source3]);
+  }
+
+  void test_onSourceFactoryChanged() {
+    when(context.exists(anyObject)).thenReturn(true);
+    // set cache values
+    entry1.setValue(PARSED_UNIT, AstFactory.compilationUnit(), []);
+    entry1.setValue(IMPORTED_LIBRARIES, <Source>[], []);
+    entry1.setValue(EXPLICITLY_IMPORTED_LIBRARIES, <Source>[], []);
+    entry1.setValue(EXPORTED_LIBRARIES, <Source>[], []);
+    entry1.setValue(INCLUDED_PARTS, <Source>[], []);
+    // configure LibrarySpecificUnit
+    LibrarySpecificUnit unitTarget = new LibrarySpecificUnit(source2, source3);
+    CacheEntry unitEntry = new CacheEntry(unitTarget);
+    cache.put(unitEntry);
+    unitEntry.setValue(BUILD_LIBRARY_ERRORS, <AnalysisError>[], []);
+    expect(unitEntry.getState(BUILD_LIBRARY_ERRORS), CacheState.VALID);
+    // notify
+    manager.onSourceFactoryChanged();
+    // resolution is invalidated
+    expect(unitEntry.getState(BUILD_LIBRARY_ERRORS), CacheState.INVALID);
+    // ...and URIs resolution too
+    expect(entry1.getState(PARSED_UNIT), CacheState.INVALID);
+    expect(entry1.getState(IMPORTED_LIBRARIES), CacheState.INVALID);
+    expect(entry1.getState(EXPLICITLY_IMPORTED_LIBRARIES), CacheState.INVALID);
+    expect(entry1.getState(EXPORTED_LIBRARIES), CacheState.INVALID);
+    expect(entry1.getState(INCLUDED_PARTS), CacheState.INVALID);
+  }
+
+  void test_resultsComputed_errors_forLibrarySpecificUnit() {
+    LineInfo lineInfo = new LineInfo([0]);
+    AnalysisError error1 =
+        new AnalysisError(source1, 1, 0, ScannerErrorCode.MISSING_DIGIT);
+    AnalysisError error2 =
+        new AnalysisError(source1, 2, 0, ScannerErrorCode.MISSING_DIGIT);
+    when(context.getLibrariesContaining(source1)).thenReturn([source2]);
+    when(context.getErrors(source1))
+        .thenReturn(new AnalysisErrorInfoImpl([error1, error2], lineInfo));
+    entry1.setValue(LINE_INFO, lineInfo, []);
+    entry1.setValue(SCAN_ERRORS, <AnalysisError>[error1], []);
+    AnalysisTarget unitTarget = new LibrarySpecificUnit(source2, source1);
+    context
+        .getCacheEntry(unitTarget)
+        .setValue(VERIFY_ERRORS, <AnalysisError>[error2], []);
+    // RESOLVED_UNIT is ready, set errors
+    manager.resultsComputed(
+        unitTarget, {RESOLVED_UNIT: AstFactory.compilationUnit()});
+    // all of the errors are included
+    ChangeNoticeImpl notice = context.getNotice(source1);
+    expect(notice.errors, unorderedEquals([error1, error2]));
+    expect(notice.lineInfo, lineInfo);
+  }
+
+  void test_resultsComputed_errors_forSource() {
+    LineInfo lineInfo = new LineInfo([0]);
+    AnalysisError error1 =
+        new AnalysisError(source1, 1, 0, ScannerErrorCode.MISSING_DIGIT);
+    AnalysisError error2 =
+        new AnalysisError(source1, 2, 0, ScannerErrorCode.MISSING_DIGIT);
+    when(context.getLibrariesContaining(source1)).thenReturn([source2]);
+    when(context.getErrors(source1))
+        .thenReturn(new AnalysisErrorInfoImpl([error1, error2], lineInfo));
+    entry1.setValue(LINE_INFO, lineInfo, []);
+    entry1.setValue(SCAN_ERRORS, <AnalysisError>[error1], []);
+    entry1.setValue(PARSE_ERRORS, <AnalysisError>[error2], []);
+    // PARSED_UNIT is ready, set errors
+    manager.resultsComputed(
+        source1, {PARSED_UNIT: AstFactory.compilationUnit()});
+    // all of the errors are included
+    ChangeNoticeImpl notice = context.getNotice(source1);
+    expect(notice.errors, unorderedEquals([error1, error2]));
+    expect(notice.lineInfo, lineInfo);
+  }
+
+  void test_resultsComputed_includedParts_updatePartLibraries() {
+    Source part1 = new TestSource('part1.dart');
+    Source part2 = new TestSource('part2.dart');
+    Source part3 = new TestSource('part3.dart');
+    Source library1 = new TestSource('library1.dart');
+    Source library2 = new TestSource('library2.dart');
+    _getOrCreateEntry(part1).setValue(CONTAINING_LIBRARIES, [], []);
+    expect(cache.getState(part1, CONTAINING_LIBRARIES), CacheState.VALID);
+    // library1 parts
+    manager.resultsComputed(library1, {
+      INCLUDED_PARTS: [part1, part2]
+    });
+    expect(manager.partLibrariesMap[part1], [library1]);
+    expect(manager.partLibrariesMap[part2], [library1]);
+    expect(manager.partLibrariesMap[part3], isNull);
+    expect(manager.libraryPartsMap[library1], [part1, part2]);
+    expect(manager.libraryPartsMap[library2], isNull);
+    // library2 parts
+    manager.resultsComputed(library2, {
+      INCLUDED_PARTS: [part2, part3]
+    });
+    expect(manager.partLibrariesMap[part1], [library1]);
+    expect(manager.partLibrariesMap[part2], [library1, library2]);
+    expect(manager.partLibrariesMap[part3], [library2]);
+    expect(manager.libraryPartsMap[library1], [part1, part2]);
+    expect(manager.libraryPartsMap[library2], [part2, part3]);
+    // part1 CONTAINING_LIBRARIES
+    expect(cache.getState(part1, CONTAINING_LIBRARIES), CacheState.INVALID);
+  }
+
+  void test_resultsComputed_noSourceKind() {
+    manager.unknownSourceQueue.addAll([source1, source2]);
+    manager.resultsComputed(source1, {});
+    expect_librarySourceQueue([]);
+    expect_unknownSourceQueue([source1, source2]);
+  }
+
+  void test_resultsComputed_notDart() {
+    manager.unknownSourceQueue.addAll([source1, source2]);
+    manager.resultsComputed(new TestSource('test.html'), {});
+    expect_librarySourceQueue([]);
+    expect_unknownSourceQueue([source1, source2]);
+  }
+
+  void test_resultsComputed_parsedUnit() {
+    LineInfo lineInfo = new LineInfo([0]);
+    when(context.getLibrariesContaining(source1)).thenReturn([]);
+    when(context.getErrors(source1))
+        .thenReturn(new AnalysisErrorInfoImpl([], lineInfo));
+    entry1.setValue(LINE_INFO, lineInfo, []);
+    CompilationUnit unit = AstFactory.compilationUnit();
+    manager.resultsComputed(source1, {PARSED_UNIT: unit});
+    ChangeNoticeImpl notice = context.getNotice(source1);
+    expect(notice.parsedDartUnit, unit);
+    expect(notice.resolvedDartUnit, isNull);
+    expect(notice.lineInfo, lineInfo);
+  }
+
+  void test_resultsComputed_resolvedUnit() {
+    LineInfo lineInfo = new LineInfo([0]);
+    when(context.getLibrariesContaining(source2)).thenReturn([]);
+    when(context.getErrors(source2))
+        .thenReturn(new AnalysisErrorInfoImpl([], lineInfo));
+    entry2.setValue(LINE_INFO, lineInfo, []);
+    CompilationUnit unit = AstFactory.compilationUnit();
+    manager.resultsComputed(
+        new LibrarySpecificUnit(source1, source2), {RESOLVED_UNIT: unit});
+    ChangeNoticeImpl notice = context.getNotice(source2);
+    expect(notice.parsedDartUnit, isNull);
+    expect(notice.resolvedDartUnit, unit);
+    expect(notice.lineInfo, lineInfo);
+  }
+
+  void test_resultsComputed_sourceKind_isLibrary() {
+    manager.unknownSourceQueue.addAll([source1, source2, source3]);
+    when(context.prioritySources).thenReturn(<Source>[]);
+    when(context.shouldErrorsBeAnalyzed(source2, null)).thenReturn(true);
+    manager.resultsComputed(source2, {SOURCE_KIND: SourceKind.LIBRARY});
+    expect_librarySourceQueue([source2]);
+    expect_unknownSourceQueue([source1, source3]);
+  }
+
+  void test_resultsComputed_sourceKind_isLibrary_isPriority_computeErrors() {
+    manager.unknownSourceQueue.addAll([source1, source2, source3]);
+    when(context.prioritySources).thenReturn(<Source>[source2]);
+    when(context.shouldErrorsBeAnalyzed(source2, null)).thenReturn(true);
+    manager.resultsComputed(source2, {SOURCE_KIND: SourceKind.LIBRARY});
+    expect_unknownSourceQueue([source1, source3]);
+    expect(manager.priorityResultQueue,
+        unorderedEquals([new TargetedResult(source2, LIBRARY_ERRORS_READY)]));
+  }
+
+  void test_resultsComputed_sourceKind_isLibrary_isPriority_computeUnit() {
+    manager.unknownSourceQueue.addAll([source1, source2, source3]);
+    when(context.prioritySources).thenReturn(<Source>[source2]);
+    when(context.shouldErrorsBeAnalyzed(source2, null)).thenReturn(false);
+    manager.resultsComputed(source2, {SOURCE_KIND: SourceKind.LIBRARY});
+    expect_unknownSourceQueue([source1, source3]);
+    expect(
+        manager.priorityResultQueue,
+        unorderedEquals([
+          new TargetedResult(
+              new LibrarySpecificUnit(source2, source2), RESOLVED_UNIT)
+        ]));
+  }
+
+  void test_resultsComputed_sourceKind_isPart() {
+    manager.unknownSourceQueue.addAll([source1, source2, source3]);
+    manager.resultsComputed(source2, {SOURCE_KIND: SourceKind.PART});
+    expect_librarySourceQueue([]);
+    expect_unknownSourceQueue([source1, source3]);
+  }
+
+  CacheEntry _getOrCreateEntry(Source source) {
+    CacheEntry entry = cache.get(source);
+    if (entry == null) {
+      entry = new CacheEntry(source);
+      cache.put(entry);
+    }
+    return entry;
+  }
+}
+
+class _InternalAnalysisContextMock extends TypedMock
+    implements InternalAnalysisContext {
+  @override
+  CachePartition privateAnalysisCachePartition;
+
+  @override
+  AnalysisCache analysisCache;
+
+  Map<Source, ChangeNoticeImpl> _pendingNotices = <Source, ChangeNoticeImpl>{};
+
+  _InternalAnalysisContextMock() {
+    privateAnalysisCachePartition = new UniversalCachePartition(this);
+    analysisCache = new AnalysisCache([privateAnalysisCachePartition]);
+  }
+
+  @override
+  CacheEntry getCacheEntry(AnalysisTarget target) {
+    CacheEntry entry = analysisCache.get(target);
+    if (entry == null) {
+      entry = new CacheEntry(target);
+      analysisCache.put(entry);
+    }
+    return entry;
+  }
+
+  @override
+  ChangeNoticeImpl getNotice(Source source) {
+    return _pendingNotices.putIfAbsent(
+        source, () => new ChangeNoticeImpl(source));
+  }
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/task/driver_test.dart b/mojo/public/dart/third_party/analyzer/test/src/task/driver_test.dart
new file mode 100644
index 0000000..aed091c
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/task/driver_test.dart
@@ -0,0 +1,793 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.task.driver_test;
+
+import 'package:analyzer/src/context/cache.dart';
+import 'package:analyzer/src/generated/engine.dart'
+    hide
+        AnalysisCache,
+        AnalysisContextImpl,
+        AnalysisTask,
+        UniversalCachePartition,
+        WorkManager;
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/task/driver.dart';
+import 'package:analyzer/src/task/inputs.dart';
+import 'package:analyzer/src/task/manager.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:typed_mock/typed_mock.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../generated/test_support.dart';
+import '../../reflective_tests.dart';
+import '../../utils.dart';
+import 'test_support.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(AnalysisDriverTest);
+  runReflectiveTests(CycleAwareDependencyWalkerTest);
+  runReflectiveTests(WorkItemTest);
+  runReflectiveTests(WorkOrderTest);
+}
+
+class AbstractDriverTest {
+  TaskManager taskManager = new TaskManager();
+  List<WorkManager> workManagers = <WorkManager>[];
+  InternalAnalysisContext context = new _InternalAnalysisContextMock();
+  AnalysisDriver analysisDriver;
+
+  void setUp() {
+    context = new _InternalAnalysisContextMock();
+    analysisDriver = new AnalysisDriver(taskManager, workManagers, context);
+  }
+}
+
+@reflectiveTest
+class AnalysisDriverTest extends AbstractDriverTest {
+  WorkManager workManager1 = new _WorkManagerMock();
+  WorkManager workManager2 = new _WorkManagerMock();
+
+  AnalysisTarget target1 = new TestSource('/1.dart');
+  AnalysisTarget target2 = new TestSource('/2.dart');
+
+  ResultDescriptor result1 = new ResultDescriptor('result1', -1);
+  ResultDescriptor result2 = new ResultDescriptor('result2', -2);
+
+  TaskDescriptor descriptor1;
+  TaskDescriptor descriptor2;
+
+  void setUp() {
+    super.setUp();
+    when(workManager1.getNextResultPriority())
+        .thenReturn(WorkOrderPriority.NONE);
+    when(workManager2.getNextResultPriority())
+        .thenReturn(WorkOrderPriority.NONE);
+
+    workManagers.add(workManager1);
+    workManagers.add(workManager2);
+  }
+
+  test_computeResult() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('result', null);
+    TestAnalysisTask task;
+    TaskDescriptor descriptor = new TaskDescriptor(
+        'task', (context, target) => task, (target) => {}, [result]);
+    task = new TestAnalysisTask(context, target, descriptor: descriptor);
+    taskManager.addTaskDescriptor(descriptor);
+
+    analysisDriver.computeResult(target, result);
+    expect(context.getCacheEntry(target).getValue(result), 1);
+  }
+
+  test_create() {
+    expect(analysisDriver, isNotNull);
+    expect(analysisDriver.context, context);
+    expect(analysisDriver.currentWorkOrder, isNull);
+    expect(analysisDriver.taskManager, taskManager);
+  }
+
+  test_createNextWorkOrder_highLow() {
+    _configureDescriptors12();
+    when(workManager1.getNextResultPriority())
+        .thenReturn(WorkOrderPriority.PRIORITY);
+    when(workManager2.getNextResultPriority())
+        .thenReturn(WorkOrderPriority.NORMAL);
+    when(workManager1.getNextResult())
+        .thenReturn(new TargetedResult(target1, result1));
+    WorkOrder workOrder = analysisDriver.createNextWorkOrder();
+    expect(workOrder, isNotNull);
+    expect(workOrder.moveNext(), true);
+    expect(workOrder.current.target, target1);
+    expect(workOrder.current.descriptor, descriptor1);
+  }
+
+  test_createNextWorkOrder_lowHigh() {
+    _configureDescriptors12();
+    when(workManager1.getNextResultPriority())
+        .thenReturn(WorkOrderPriority.NORMAL);
+    when(workManager2.getNextResultPriority())
+        .thenReturn(WorkOrderPriority.PRIORITY);
+    when(workManager2.getNextResult())
+        .thenReturn(new TargetedResult(target1, result1));
+    WorkOrder workOrder = analysisDriver.createNextWorkOrder();
+    expect(workOrder, isNotNull);
+    expect(workOrder.moveNext(), true);
+    expect(workOrder.current.target, target1);
+    expect(workOrder.current.descriptor, descriptor1);
+  }
+
+  test_createNextWorkOrder_none() {
+    _configureDescriptors12();
+    when(workManager1.getNextResultPriority())
+        .thenReturn(WorkOrderPriority.NONE);
+    when(workManager2.getNextResultPriority())
+        .thenReturn(WorkOrderPriority.NONE);
+    expect(analysisDriver.createNextWorkOrder(), isNull);
+  }
+
+  test_createWorkOrderForResult_error() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('result', null);
+    CaughtException exception = new CaughtException(null, null);
+    context
+        .getCacheEntry(target)
+        .setErrorState(exception, <ResultDescriptor>[result]);
+
+    expect(analysisDriver.createWorkOrderForResult(target, result), isNull);
+  }
+
+  test_createWorkOrderForResult_inProcess() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('result', null);
+    context.getCacheEntry(target).setState(result, CacheState.IN_PROCESS);
+
+    expect(analysisDriver.createWorkOrderForResult(target, result), isNull);
+  }
+
+  test_createWorkOrderForResult_invalid() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('result', null);
+    TaskDescriptor descriptor = new TaskDescriptor(
+        'task',
+        (context, target) => new TestAnalysisTask(context, target),
+        (target) => {},
+        [result]);
+    taskManager.addTaskDescriptor(descriptor);
+    context.getCacheEntry(target).setState(result, CacheState.INVALID);
+
+    WorkOrder workOrder =
+        analysisDriver.createWorkOrderForResult(target, result);
+    expect(workOrder, isNotNull);
+  }
+
+  test_createWorkOrderForResult_valid() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('result', null);
+    context
+        .getCacheEntry(target)
+        .setValue(result, '', TargetedResult.EMPTY_LIST);
+
+    expect(analysisDriver.createWorkOrderForResult(target, result), isNull);
+  }
+
+  test_createWorkOrderForTarget_complete_generalTarget_generalResult() {
+    _createWorkOrderForTarget(true, false, false);
+  }
+
+  test_createWorkOrderForTarget_complete_generalTarget_priorityResult() {
+    _createWorkOrderForTarget(true, false, true);
+  }
+
+  test_createWorkOrderForTarget_complete_priorityTarget_generalResult() {
+    _createWorkOrderForTarget(true, true, false);
+  }
+
+  test_createWorkOrderForTarget_complete_priorityTarget_priorityResult() {
+    _createWorkOrderForTarget(true, true, true);
+  }
+
+  test_createWorkOrderForTarget_incomplete_generalTarget_generalResult() {
+    _createWorkOrderForTarget(false, false, false);
+  }
+
+  test_createWorkOrderForTarget_incomplete_generalTarget_priorityResult() {
+    _createWorkOrderForTarget(false, false, true);
+  }
+
+  test_createWorkOrderForTarget_incomplete_priorityTarget_generalResult() {
+    _createWorkOrderForTarget(false, true, false);
+  }
+
+  test_createWorkOrderForTarget_incomplete_priorityTarget_priorityResult() {
+    _createWorkOrderForTarget(false, true, true);
+  }
+
+  test_performAnalysisTask() {
+    _configureDescriptors12();
+    when(workManager1.getNextResultPriority()).thenReturnList(
+        <WorkOrderPriority>[WorkOrderPriority.NORMAL, WorkOrderPriority.NONE]);
+    when(workManager1.getNextResult())
+        .thenReturn(new TargetedResult(target1, result1));
+
+    expect(analysisDriver.performAnalysisTask(), true);
+    expect(analysisDriver.performAnalysisTask(), true);
+    expect(analysisDriver.performAnalysisTask(), false);
+  }
+
+  test_performAnalysisTask_infiniteLoop_handled() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor resultA = new ResultDescriptor('resultA', -1);
+    ResultDescriptor resultB = new ResultDescriptor('resultB', -2);
+    // configure tasks
+    TestAnalysisTask task1;
+    TestAnalysisTask task2;
+    TaskDescriptor descriptor1 = new TaskDescriptor(
+        'task1',
+        (context, target) => task1,
+        (target) => {'inputB': new SimpleTaskInput<int>(target, resultB)},
+        [resultA]);
+    TaskDescriptor descriptor2 = new TaskDescriptor(
+        'task2',
+        (context, target) => task2,
+        (target) => {'inputA': new SimpleTaskInput<int>(target, resultA)},
+        [resultB]);
+    task1 = new TestAnalysisTask(context, target,
+        descriptor: descriptor1,
+        results: [resultA],
+        value: 10,
+        handlesDependencyCycles: true);
+    task2 = new TestAnalysisTask(context, target,
+        descriptor: descriptor2,
+        results: [resultB],
+        value: 20,
+        handlesDependencyCycles: true);
+    taskManager.addTaskDescriptor(descriptor1);
+    taskManager.addTaskDescriptor(descriptor2);
+    // configure WorkManager
+    when(workManager1.getNextResultPriority()).thenReturnList(
+        <WorkOrderPriority>[WorkOrderPriority.NORMAL, WorkOrderPriority.NONE]);
+    when(workManager1.getNextResult())
+        .thenReturn(new TargetedResult(target, resultB));
+    // prepare work order
+    while (analysisDriver.performAnalysisTask()) {}
+    Set<TaskDescriptor> expectedCycle = [descriptor1, descriptor2].toSet();
+    expect(task1.dependencyCycle, isNotNull);
+    expect(task1.dependencyCycle.map((workItem) => workItem.descriptor).toSet(),
+        expectedCycle);
+    expect(task2.dependencyCycle, isNotNull);
+    expect(task2.dependencyCycle.map((workItem) => workItem.descriptor).toSet(),
+        expectedCycle);
+    CaughtException exception = context.getCacheEntry(target).exception;
+    expect(exception, isNull);
+    expect(context.getCacheEntry(target).getValue(resultA), 10);
+    expect(context.getCacheEntry(target).getValue(resultB), 20);
+  }
+
+  test_performAnalysisTask_infiniteLoop_unhandled() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor resultA = new ResultDescriptor('resultA', -1);
+    ResultDescriptor resultB = new ResultDescriptor('resultB', -2);
+    // configure tasks
+    TestAnalysisTask task1;
+    TestAnalysisTask task2;
+    TaskDescriptor descriptor1 = new TaskDescriptor(
+        'task1',
+        (context, target) => task1,
+        (target) => {'inputB': new SimpleTaskInput<int>(target, resultB)},
+        [resultA]);
+    TaskDescriptor descriptor2 = new TaskDescriptor(
+        'task2',
+        (context, target) => task2,
+        (target) => {'inputA': new SimpleTaskInput<int>(target, resultA)},
+        [resultB]);
+    task1 = new TestAnalysisTask(context, target, descriptor: descriptor1);
+    task2 = new TestAnalysisTask(context, target, descriptor: descriptor2);
+    taskManager.addTaskDescriptor(descriptor1);
+    taskManager.addTaskDescriptor(descriptor2);
+    // configure WorkManager
+    when(workManager1.getNextResultPriority()).thenReturnList(
+        <WorkOrderPriority>[WorkOrderPriority.NORMAL, WorkOrderPriority.NONE]);
+    when(workManager1.getNextResult())
+        .thenReturn(new TargetedResult(target, resultB));
+    // prepare work order
+    expect(analysisDriver.performAnalysisTask(), true);
+    expect(analysisDriver.performAnalysisTask(), true);
+    CaughtException exception = context.getCacheEntry(target).exception;
+    expect(exception, isNotNull);
+    expect(exception.exception, new isInstanceOf<InfiniteTaskLoopException>());
+  }
+
+  test_performAnalysisTask_inputsFirst() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor resultA = new ResultDescriptor('resultA', -1);
+    ResultDescriptor resultB = new ResultDescriptor('resultB', -2);
+    // configure tasks
+    TestAnalysisTask task1;
+    TestAnalysisTask task2;
+    TaskDescriptor descriptor1 = new TaskDescriptor(
+        'task1', (context, target) => task1, (target) => {}, [resultA]);
+    TaskDescriptor descriptor2 = new TaskDescriptor(
+        'task2',
+        (context, target) => task2,
+        (target) => {'inputA': new SimpleTaskInput<int>(target, resultA)},
+        [resultB]);
+    task1 = new TestAnalysisTask(context, target,
+        descriptor: descriptor1, results: [resultA], value: 10);
+    task2 = new TestAnalysisTask(context, target,
+        descriptor: descriptor2, value: 20);
+    taskManager.addTaskDescriptor(descriptor1);
+    taskManager.addTaskDescriptor(descriptor2);
+    // configure WorkManager
+    when(workManager1.getNextResultPriority()).thenReturnList(
+        <WorkOrderPriority>[WorkOrderPriority.NORMAL, WorkOrderPriority.NONE]);
+    when(workManager1.getNextResult())
+        .thenReturn(new TargetedResult(target, resultB));
+    // prepare work order
+    expect(analysisDriver.performAnalysisTask(), true);
+    expect(context.getCacheEntry(target).getValue(resultA), -1);
+    expect(context.getCacheEntry(target).getValue(resultB), -2);
+    // compute resultA
+    expect(analysisDriver.performAnalysisTask(), true);
+    expect(context.getCacheEntry(target).getValue(resultA), 10);
+    expect(context.getCacheEntry(target).getValue(resultB), -2);
+    // compute resultB
+    expect(analysisDriver.performAnalysisTask(), true);
+    expect(context.getCacheEntry(target).getValue(resultA), 10);
+    expect(context.getCacheEntry(target).getValue(resultB), 20);
+    // done
+    expect(analysisDriver.performAnalysisTask(), false);
+  }
+
+  test_performAnalysisTask_onResultComputed() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('result', null);
+    TestAnalysisTask task;
+    TaskDescriptor descriptor = new TaskDescriptor(
+        'task', (context, target) => task, (target) => {}, [result]);
+    task = new TestAnalysisTask(context, target,
+        descriptor: descriptor, value: 42);
+    WorkItem item = new WorkItem(context, target, descriptor, null);
+
+    bool streamNotified = false;
+    analysisDriver.onResultComputed(result).listen((event) {
+      streamNotified = true;
+      expect(event.context, same(context));
+      expect(event.target, same(target));
+      expect(event.descriptor, same(result));
+      expect(event.value, 42);
+    });
+    analysisDriver.performWorkItem(item);
+    expect(streamNotified, isTrue);
+  }
+
+  test_performWorkItem_exceptionInTask() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('result', null);
+    CaughtException exception =
+        new CaughtException(new AnalysisException(), null);
+    TestAnalysisTask task;
+    TaskDescriptor descriptor = new TaskDescriptor(
+        'task', (context, target) => task, (target) => {}, [result]);
+    task = new TestAnalysisTask(context, target,
+        descriptor: descriptor, exception: exception);
+    WorkItem item = new WorkItem(context, target, descriptor, null);
+
+    analysisDriver.performWorkItem(item);
+    CacheEntry targetEntry = context.getCacheEntry(item.target);
+    expect(targetEntry.exception, exception);
+    expect(targetEntry.getState(result), CacheState.ERROR);
+  }
+
+  test_performWorkItem_noException() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('result', null);
+    TestAnalysisTask task;
+    TaskDescriptor descriptor = new TaskDescriptor(
+        'task', (context, target) => task, (target) => {}, [result]);
+    task = new TestAnalysisTask(context, target, descriptor: descriptor);
+    WorkItem item = new WorkItem(context, target, descriptor, null);
+
+    analysisDriver.performWorkItem(item);
+    CacheEntry targetEntry = context.getCacheEntry(item.target);
+    expect(targetEntry.exception, isNull);
+    expect(targetEntry.getState(result), CacheState.VALID);
+  }
+
+  test_performWorkItem_preExistingException() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('result', null);
+    TaskDescriptor descriptor = new TaskDescriptor(
+        'task',
+        (context, target) => new TestAnalysisTask(context, target),
+        (target) => {},
+        [result]);
+    CaughtException exception =
+        new CaughtException(new AnalysisException(), null);
+    WorkItem item = new WorkItem(context, target, descriptor, null);
+    item.exception = exception;
+
+    analysisDriver.performWorkItem(item);
+    CacheEntry targetEntry = context.getCacheEntry(item.target);
+    expect(targetEntry.exception, exception);
+    expect(targetEntry.getState(result), CacheState.ERROR);
+  }
+
+  test_reset() {
+    ResultDescriptor inputResult = new ResultDescriptor('input', null);
+    TaskDescriptor descriptor = new TaskDescriptor(
+        'task',
+        (context, target) => new TestAnalysisTask(context, target),
+        (target) => {'one': inputResult.of(target)},
+        [new ResultDescriptor('output', null)]);
+    analysisDriver.currentWorkOrder =
+        new WorkOrder(taskManager, new WorkItem(null, null, descriptor, null));
+
+    analysisDriver.reset();
+    expect(analysisDriver.currentWorkOrder, isNull);
+  }
+
+  void _configureDescriptors12() {
+    descriptor1 = new TaskDescriptor(
+        'task1',
+        (context, target) =>
+            new TestAnalysisTask(context, target, descriptor: descriptor1),
+        (target) => {},
+        [result1]);
+    taskManager.addTaskDescriptor(descriptor1);
+
+    descriptor2 = new TaskDescriptor(
+        'task2',
+        (context, target) =>
+            new TestAnalysisTask(context, target, descriptor: descriptor1),
+        (target) => {},
+        [result2]);
+    taskManager.addTaskDescriptor(descriptor2);
+  }
+
+  /**
+   * [complete] is `true` if the value of the result has already been computed.
+   * [priorityTarget] is `true` if the target is in the list of priority
+   * targets.
+   * [priorityResult] is `true` if the result should only be computed for
+   * priority targets.
+   */
+  _createWorkOrderForTarget(
+      bool complete, bool priorityTarget, bool priorityResult) {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor result = new ResultDescriptor('result', null);
+    TaskDescriptor descriptor = new TaskDescriptor(
+        'task',
+        (context, target) => new TestAnalysisTask(context, target),
+        (target) => {},
+        [result]);
+    if (priorityResult) {
+      taskManager.addPriorityResult(result);
+    } else {
+      taskManager.addGeneralResult(result);
+    }
+    taskManager.addTaskDescriptor(descriptor);
+    if (priorityTarget) {
+      context.priorityTargets.add(target);
+    } else {
+      context.explicitTargets.add(target);
+    }
+    if (complete) {
+      context
+          .getCacheEntry(target)
+          .setValue(result, '', TargetedResult.EMPTY_LIST);
+    } else {
+      context.getCacheEntry(target).setState(result, CacheState.INVALID);
+    }
+
+    WorkOrder workOrder =
+        analysisDriver.createWorkOrderForTarget(target, priorityTarget);
+    if (complete) {
+      expect(workOrder, isNull);
+    } else if (priorityResult) {
+      expect(workOrder, priorityTarget ? isNotNull : isNull);
+    } else {
+      expect(workOrder, isNotNull);
+    }
+  }
+}
+
+@reflectiveTest
+class CycleAwareDependencyWalkerTest {
+  void checkGraph(Map<int, List<int>> graph, int startingNode,
+      List<StronglyConnectedComponent<int>> expectedResults) {
+    List<Set<int>> expectedResultsDisregardingOrder =
+        expectedResults.map((component) => component.nodes.toSet()).toList();
+    List<bool> expectedCycleIndicators =
+        expectedResults.map((component) => component.containsCycle).toList();
+    List<Set<int>> results = <Set<int>>[];
+    List<bool> cycleIndicators = <bool>[];
+    _TestCycleAwareDependencyWalker walker =
+        new _TestCycleAwareDependencyWalker(graph, startingNode);
+    while (true) {
+      StronglyConnectedComponent<int> nextStronglyConnectedComponent =
+          walker.getNextStronglyConnectedComponent();
+      if (nextStronglyConnectedComponent == null) {
+        break;
+      }
+      results.add(nextStronglyConnectedComponent.nodes.toSet());
+      cycleIndicators.add(nextStronglyConnectedComponent.containsCycle);
+      walker.evaluatedNodes.addAll(nextStronglyConnectedComponent.nodes);
+    }
+    expect(results, expectedResultsDisregardingOrder);
+    expect(cycleIndicators, expectedCycleIndicators);
+  }
+
+  StronglyConnectedComponent<int> cycle(List<int> nodes) =>
+      new StronglyConnectedComponent(nodes, true);
+
+  StronglyConnectedComponent<int> singleton(int node) =>
+      new StronglyConnectedComponent(<int>[node], false);
+
+  void test_complex_graph() {
+    checkGraph(
+        {
+          1: [2, 3],
+          2: [3, 4],
+          3: [],
+          4: [3, 5],
+          5: [2, 6],
+          6: [3, 4]
+        },
+        1,
+        [
+          singleton(3),
+          cycle([2, 4, 5, 6]),
+          singleton(1)
+        ]);
+  }
+
+  void test_cycle_depends_on_other_nodes() {
+    checkGraph(
+        {
+          1: [2, 3],
+          2: [4, 1],
+          3: [],
+          4: []
+        },
+        1,
+        [
+          singleton(4),
+          singleton(3),
+          cycle([1, 2])
+        ]);
+  }
+
+  void test_initial_node_depends_on_cycle() {
+    checkGraph(
+        {
+          1: [2],
+          2: [3],
+          3: [2]
+        },
+        1,
+        [
+          cycle([2, 3]),
+          singleton(1)
+        ]);
+  }
+
+  void test_simple_cycle() {
+    checkGraph(
+        {
+          1: [2],
+          2: [1]
+        },
+        1,
+        [
+          cycle([1, 2])
+        ]);
+  }
+
+  void test_simple_dependency_chain() {
+    checkGraph(
+        {
+          1: [2],
+          2: []
+        },
+        1,
+        [singleton(2), singleton(1)]);
+  }
+
+  void test_single_node() {
+    checkGraph({1: []}, 1, [singleton(1)]);
+  }
+
+  void test_single_node_cycle() {
+    checkGraph(
+        {
+          1: [1]
+        },
+        1,
+        [
+          cycle([1])
+        ]);
+  }
+}
+
+@reflectiveTest
+class WorkItemTest extends AbstractDriverTest {
+  test_buildTask_complete() {
+    AnalysisTarget target = new TestSource();
+    TaskDescriptor descriptor = new TaskDescriptor(
+        'task',
+        (context, target) => new TestAnalysisTask(context, target),
+        (target) => {},
+        [new ResultDescriptor('output', null)]);
+    WorkItem item = new WorkItem(context, target, descriptor, null);
+    AnalysisTask task = item.buildTask();
+    expect(task, isNotNull);
+  }
+
+  test_buildTask_incomplete() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor inputResult = new ResultDescriptor('input', null);
+    List<ResultDescriptor> outputResults = <ResultDescriptor>[
+      new ResultDescriptor('output', null)
+    ];
+    TaskDescriptor descriptor = new TaskDescriptor(
+        'task',
+        (context, target) =>
+            new TestAnalysisTask(context, target, results: outputResults),
+        (target) => {'one': inputResult.of(target)},
+        outputResults);
+    WorkItem item = new WorkItem(context, target, descriptor, null);
+    expect(() => item.buildTask(), throwsStateError);
+  }
+
+  test_create() {
+    AnalysisTarget target = new TestSource();
+    TaskDescriptor descriptor = new TaskDescriptor(
+        'task', null, (target) => {}, [new ResultDescriptor('result', null)]);
+    WorkItem item = new WorkItem(context, target, descriptor, null);
+    expect(item, isNotNull);
+    expect(item.context, context);
+    expect(item.descriptor, descriptor);
+    expect(item.target, target);
+  }
+
+  test_gatherInputs_complete() {
+    AnalysisTarget target = new TestSource();
+    TaskDescriptor descriptor = new TaskDescriptor(
+        'task',
+        (context, target) => new TestAnalysisTask(context, target),
+        (target) => {},
+        [new ResultDescriptor('output', null)]);
+    WorkItem item = new WorkItem(context, target, descriptor, null);
+    WorkItem result = item.gatherInputs(taskManager, []);
+    expect(result, isNull);
+    expect(item.exception, isNull);
+  }
+
+  test_gatherInputs_incomplete() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor resultA = new ResultDescriptor('resultA', null);
+    ResultDescriptor resultB = new ResultDescriptor('resultB', null);
+    // prepare tasks
+    TaskDescriptor task1 = new TaskDescriptor(
+        'task',
+        (context, target) =>
+            new TestAnalysisTask(context, target, results: [resultA]),
+        (target) => {},
+        [resultA]);
+    TaskDescriptor task2 = new TaskDescriptor(
+        'task',
+        (context, target) => new TestAnalysisTask(context, target),
+        (target) => {'one': resultA.of(target)},
+        [resultB]);
+    taskManager.addTaskDescriptor(task1);
+    taskManager.addTaskDescriptor(task2);
+    // gather inputs
+    WorkItem item = new WorkItem(context, target, task2, null);
+    WorkItem inputItem = item.gatherInputs(taskManager, []);
+    expect(inputItem, isNotNull);
+  }
+
+  test_gatherInputs_invalid() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptor inputResult = new ResultDescriptor('input', null);
+    TaskDescriptor descriptor = new TaskDescriptor(
+        'task',
+        (context, target) => new TestAnalysisTask(context, target),
+        (target) => {'one': inputResult.of(target)},
+        [new ResultDescriptor('output', null)]);
+    WorkItem item = new WorkItem(context, target, descriptor, null);
+    WorkItem result = item.gatherInputs(taskManager, []);
+    expect(result, isNull);
+    expect(item.exception, isNotNull);
+  }
+}
+
+@reflectiveTest
+class WorkOrderTest extends EngineTestCase {
+  test_create() {
+    TaskManager manager = new TaskManager();
+    TaskDescriptor descriptor = new TaskDescriptor(
+        'task', null, (_) => {}, [new ResultDescriptor('result', null)]);
+    WorkOrder order =
+        new WorkOrder(manager, new WorkItem(null, null, descriptor, null));
+    expect(order, isNotNull);
+    expect(order.currentItems, isNull);
+    expect(order.current, isNull);
+  }
+
+  test_moveNext() {
+    TaskManager manager = new TaskManager();
+    TaskDescriptor descriptor = new TaskDescriptor(
+        'task', null, (_) => {}, [new ResultDescriptor('result', null)]);
+    WorkItem workItem = new WorkItem(null, null, descriptor, null);
+    WorkOrder order = new WorkOrder(manager, workItem);
+    // "item" has no child items
+    expect(order.moveNext(), isTrue);
+    expect(order.current, workItem);
+    // done
+    expect(order.moveNext(), isFalse);
+    expect(order.current, isNull);
+  }
+}
+
+/**
+ * A dummy [InternalAnalysisContext] that does not use [AnalysisDriver] itself,
+ * but provides enough implementation for it to function.
+ */
+class _InternalAnalysisContextMock extends TypedMock
+    implements InternalAnalysisContext {
+  AnalysisCache analysisCache;
+
+  @override
+  List<AnalysisTarget> explicitTargets = <AnalysisTarget>[];
+
+  @override
+  List<AnalysisTarget> priorityTargets = <AnalysisTarget>[];
+
+  _InternalAnalysisContextMock() {
+    analysisCache = new AnalysisCache([new UniversalCachePartition(this)]);
+  }
+
+  @override
+  CacheEntry getCacheEntry(AnalysisTarget target) {
+    CacheEntry entry = analysisCache.get(target);
+    if (entry == null) {
+      entry = new CacheEntry(target);
+      analysisCache.put(entry);
+    }
+    return entry;
+  }
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+/**
+ * Concrete class for testing [CycleAwareDependencyWalker] behavior.
+ */
+class _TestCycleAwareDependencyWalker extends CycleAwareDependencyWalker<int> {
+  final Map<int, List<int>> graph;
+
+  Set<int> evaluatedNodes = new Set<int>();
+
+  _TestCycleAwareDependencyWalker(this.graph, int startingNode)
+      : super(startingNode);
+
+  @override
+  int getNextInput(int node, List<int> skipInputs) {
+    for (int dependency in graph[node]) {
+      if (!skipInputs.contains(dependency) &&
+          !evaluatedNodes.contains(dependency)) {
+        return dependency;
+      }
+    }
+    return null;
+  }
+}
+
+class _WorkManagerMock extends TypedMock implements WorkManager {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/task/general_test.dart b/mojo/public/dart/third_party/analyzer/test/src/task/general_test.dart
new file mode 100644
index 0000000..b335664
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/task/general_test.dart
@@ -0,0 +1,86 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.task.general_test;
+
+import 'package:analyzer/src/generated/engine.dart'
+    hide AnalysisTask, GetContentTask;
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/task/general.dart';
+import 'package:analyzer/task/general.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:typed_mock/typed_mock.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../generated/test_support.dart';
+import '../../reflective_tests.dart';
+import '../../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(GetContentTaskTest);
+}
+
+@reflectiveTest
+class GetContentTaskTest extends EngineTestCase {
+  test_buildInputs() {
+    AnalysisTarget target = new TestSource();
+    Map<String, TaskInput> inputs = GetContentTask.buildInputs(target);
+    expect(inputs, isEmpty);
+  }
+
+  test_constructor() {
+    AnalysisContext context = new _MockContext();
+    AnalysisTarget target = new TestSource();
+    GetContentTask task = new GetContentTask(context, target);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, target);
+  }
+
+  test_createTask() {
+    AnalysisContext context = new _MockContext();
+    AnalysisTarget target = new TestSource();
+    GetContentTask task = GetContentTask.createTask(context, target);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, target);
+  }
+
+  test_descriptor() {
+    AnalysisContext context = new _MockContext();
+    AnalysisTarget target = new TestSource();
+    GetContentTask task = new GetContentTask(context, target);
+    expect(task.descriptor, GetContentTask.DESCRIPTOR);
+  }
+
+  test_perform() {
+    AnalysisContext context = new _MockContext();
+    Source target = new TestSource();
+    GetContentTask task = new GetContentTask(context, target);
+    when(context.getContents(target))
+        .thenReturn(new TimestampedData<String>(42, 'foo'));
+    task.perform();
+    expect(task.caughtException, isNull);
+    expect(task.outputs, hasLength(2));
+    expect(task.outputs[CONTENT], 'foo');
+    expect(task.outputs[MODIFICATION_TIME], 42);
+  }
+
+  void test_perform_exception() {
+    AnalysisContext context = new _MockContext();
+    Source target = new TestSource();
+    GetContentTask task = new GetContentTask(context, target);
+    when(context.getContents(target)).thenThrow('My exception!');
+    task.perform();
+    expect(task.caughtException, isNull);
+    expect(task.outputs, hasLength(2));
+    expect(task.outputs[CONTENT], '');
+    expect(task.outputs[MODIFICATION_TIME], -1);
+  }
+}
+
+class _MockContext extends TypedMock implements AnalysisContext {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/task/html_test.dart b/mojo/public/dart/third_party/analyzer/test/src/task/html_test.dart
new file mode 100644
index 0000000..89e4992
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/task/html_test.dart
@@ -0,0 +1,332 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.task.html_test;
+
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/task/html.dart';
+import 'package:analyzer/task/html.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+import '../../utils.dart';
+import '../context/abstract_context.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(DartScriptsTaskTest);
+  runReflectiveTests(HtmlErrorsTaskTest);
+  runReflectiveTests(ParseHtmlTaskTest);
+}
+
+@reflectiveTest
+class DartScriptsTaskTest extends AbstractContextTest {
+  test_buildInputs() {
+    Source source = newSource('/test.html');
+    Map<String, TaskInput> inputs = DartScriptsTask.buildInputs(source);
+    expect(inputs, isNotNull);
+    expect(inputs.keys, unorderedEquals([DartScriptsTask.DOCUMENT_INPUT]));
+  }
+
+  test_constructor() {
+    Source source = newSource('/test.html');
+    DartScriptsTask task = new DartScriptsTask(context, source);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, source);
+  }
+
+  test_createTask() {
+    Source source = newSource('/test.html');
+    DartScriptsTask task = DartScriptsTask.createTask(context, source);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, source);
+  }
+
+  test_description() {
+    Source source = newSource('/test.html');
+    DartScriptsTask task = new DartScriptsTask(null, source);
+    expect(task.description, isNotNull);
+  }
+
+  test_descriptor() {
+    TaskDescriptor descriptor = DartScriptsTask.DESCRIPTOR;
+    expect(descriptor, isNotNull);
+  }
+
+  void test_perform_embedded_source() {
+    String content = r'''
+    void buttonPressed() {}
+  ''';
+    AnalysisTarget target = newSource(
+        '/test.html',
+        '''
+<!DOCTYPE html>
+<html>
+<head>
+  <script type='application/dart'>$content</script>
+</head>
+<body>
+</body>
+</html>''');
+    computeResult(target, REFERENCED_LIBRARIES);
+    expect(task, new isInstanceOf<DartScriptsTask>());
+    expect(outputs[REFERENCED_LIBRARIES], hasLength(0));
+    expect(outputs[DART_SCRIPTS], hasLength(1));
+    DartScript script = outputs[DART_SCRIPTS][0];
+    expect(script.fragments, hasLength(1));
+    ScriptFragment fragment = script.fragments[0];
+    expect(fragment.content, content);
+  }
+
+  void test_perform_empty_source_reference() {
+    AnalysisTarget target = newSource(
+        '/test.html',
+        r'''
+<!DOCTYPE html>
+<html>
+<head>
+  <script type='application/dart' src=''/>
+</head>
+<body>
+</body>
+</html>''');
+    computeResult(target, REFERENCED_LIBRARIES);
+    expect(task, new isInstanceOf<DartScriptsTask>());
+    expect(outputs[REFERENCED_LIBRARIES], hasLength(0));
+    expect(outputs[DART_SCRIPTS], hasLength(0));
+  }
+
+  void test_perform_invalid_source_reference() {
+    AnalysisTarget target = newSource(
+        '/test.html',
+        r'''
+<!DOCTYPE html>
+<html>
+<head>
+  <script type='application/dart' src='an;invalid:[]uri'/>
+</head>
+<body>
+</body>
+</html>''');
+    computeResult(target, REFERENCED_LIBRARIES);
+    expect(task, new isInstanceOf<DartScriptsTask>());
+    expect(outputs[REFERENCED_LIBRARIES], hasLength(0));
+    expect(outputs[DART_SCRIPTS], hasLength(0));
+  }
+
+  void test_perform_non_existing_source_reference() {
+    AnalysisTarget target = newSource(
+        '/test.html',
+        r'''
+<!DOCTYPE html>
+<html>
+<head>
+  <script type='application/dart' src='does/not/exist.dart'/>
+</head>
+<body>
+</body>
+</html>''');
+    computeResult(target, REFERENCED_LIBRARIES);
+    expect(task, new isInstanceOf<DartScriptsTask>());
+    expect(outputs[REFERENCED_LIBRARIES], hasLength(1));
+    expect(outputs[DART_SCRIPTS], hasLength(0));
+  }
+
+  test_perform_none() {
+    AnalysisTarget target = newSource(
+        '/test.html',
+        r'''
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>test page</title>
+  </head>
+  <body>
+    Test
+  </body>
+</html>
+''');
+    computeResult(target, REFERENCED_LIBRARIES);
+    expect(task, new isInstanceOf<DartScriptsTask>());
+    expect(outputs[REFERENCED_LIBRARIES], hasLength(0));
+    expect(outputs[DART_SCRIPTS], hasLength(0));
+  }
+
+  void test_perform_referenced_source() {
+    AnalysisTarget target = newSource(
+        '/test.html',
+        r'''
+<!DOCTYPE html>
+<html>
+<head>
+  <script type='application/dart' src='test.dart'/>
+</head>
+<body>
+</body>
+</html>''');
+    computeResult(target, REFERENCED_LIBRARIES);
+    expect(task, new isInstanceOf<DartScriptsTask>());
+    expect(outputs[REFERENCED_LIBRARIES], hasLength(1));
+    expect(outputs[DART_SCRIPTS], hasLength(0));
+  }
+}
+
+@reflectiveTest
+class HtmlErrorsTaskTest extends AbstractContextTest {
+  test_buildInputs() {
+    Source source = newSource('/test.html');
+    Map<String, TaskInput> inputs = HtmlErrorsTask.buildInputs(source);
+    expect(inputs, isNotNull);
+    expect(
+        inputs.keys,
+        unorderedEquals([
+          HtmlErrorsTask.DART_ERRORS_INPUT,
+          HtmlErrorsTask.DOCUMENT_ERRORS_INPUT
+        ]));
+  }
+
+  test_constructor() {
+    Source source = newSource('/test.html');
+    HtmlErrorsTask task = new HtmlErrorsTask(context, source);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, source);
+  }
+
+  test_createTask() {
+    Source source = newSource('/test.html');
+    HtmlErrorsTask task = HtmlErrorsTask.createTask(context, source);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, source);
+  }
+
+  test_description() {
+    Source source = newSource('/test.html');
+    HtmlErrorsTask task = new HtmlErrorsTask(null, source);
+    expect(task.description, isNotNull);
+  }
+
+  test_descriptor() {
+    TaskDescriptor descriptor = HtmlErrorsTask.DESCRIPTOR;
+    expect(descriptor, isNotNull);
+  }
+
+  test_perform_dartErrors() {
+    AnalysisTarget target = newSource(
+        '/test.html',
+        r'''
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>test page</title>
+    <script type='application/dart'>
+      void buttonPressed() {
+    </script>
+  </head>
+  <body>Test</body>
+</html>
+''');
+    computeResult(target, HTML_ERRORS);
+    expect(task, new isInstanceOf<HtmlErrorsTask>());
+    expect(outputs[HTML_ERRORS], hasLength(1));
+  }
+
+  test_perform_htmlErrors() {
+    AnalysisTarget target = newSource(
+        '/test.html',
+        r'''
+<html>
+  <head>
+    <title>test page</title>
+  </head>
+  <body>
+    Test
+  </body>
+</html>
+''');
+    computeResult(target, HTML_ERRORS);
+    expect(task, new isInstanceOf<HtmlErrorsTask>());
+    expect(outputs[HTML_ERRORS], hasLength(1));
+  }
+
+  test_perform_noErrors() {
+    AnalysisTarget target = newSource(
+        '/test.html',
+        r'''
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>test page</title>
+  </head>
+  <body>
+    Test
+  </body>
+</html>
+''');
+    computeResult(target, HTML_ERRORS);
+    expect(task, new isInstanceOf<HtmlErrorsTask>());
+    expect(outputs[HTML_ERRORS], isEmpty);
+  }
+}
+
+@reflectiveTest
+class ParseHtmlTaskTest extends AbstractContextTest {
+  test_buildInputs() {
+    Source source = newSource('/test.html');
+    Map<String, TaskInput> inputs = ParseHtmlTask.buildInputs(source);
+    expect(inputs, isNotNull);
+    expect(inputs.keys, unorderedEquals([ParseHtmlTask.CONTENT_INPUT_NAME]));
+  }
+
+  test_constructor() {
+    Source source = newSource('/test.html');
+    ParseHtmlTask task = new ParseHtmlTask(context, source);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, source);
+  }
+
+  test_createTask() {
+    Source source = newSource('/test.html');
+    ParseHtmlTask task = ParseHtmlTask.createTask(context, source);
+    expect(task, isNotNull);
+    expect(task.context, context);
+    expect(task.target, source);
+  }
+
+  test_description() {
+    Source source = newSource('/test.html');
+    ParseHtmlTask task = new ParseHtmlTask(null, source);
+    expect(task.description, isNotNull);
+  }
+
+  test_descriptor() {
+    TaskDescriptor descriptor = ParseHtmlTask.DESCRIPTOR;
+    expect(descriptor, isNotNull);
+  }
+
+  test_perform() {
+    AnalysisTarget target = newSource(
+        '/test.html',
+        r'''
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>test page</title>
+  </head>
+  <body>
+    <h1 Test>
+  </body>
+</html>
+''');
+    computeResult(target, HTML_DOCUMENT);
+    expect(task, new isInstanceOf<ParseHtmlTask>());
+    expect(outputs[HTML_DOCUMENT], isNotNull);
+    expect(outputs[HTML_DOCUMENT_ERRORS], isNotEmpty);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/task/html_work_manager_test.dart b/mojo/public/dart/third_party/analyzer/test/src/task/html_work_manager_test.dart
new file mode 100644
index 0000000..35bc13d
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/task/html_work_manager_test.dart
@@ -0,0 +1,352 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.task.html_work_manager_test;
+
+import 'package:analyzer/src/context/cache.dart';
+import 'package:analyzer/src/generated/engine.dart'
+    show
+        AnalysisEngine,
+        AnalysisErrorInfo,
+        AnalysisErrorInfoImpl,
+        CacheState,
+        ChangeNoticeImpl,
+        InternalAnalysisContext;
+import 'package:analyzer/src/generated/error.dart'
+    show AnalysisError, HtmlErrorCode;
+import 'package:analyzer/src/generated/java_engine.dart' show CaughtException;
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/task/driver.dart';
+import 'package:analyzer/src/task/html.dart';
+import 'package:analyzer/src/task/html_work_manager.dart';
+import 'package:analyzer/task/dart.dart';
+import 'package:analyzer/task/general.dart';
+import 'package:analyzer/task/html.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:typed_mock/typed_mock.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../generated/test_support.dart';
+import '../../reflective_tests.dart';
+import '../../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(HtmlWorkManagerTest);
+}
+
+@reflectiveTest
+class HtmlWorkManagerTest {
+  InternalAnalysisContext context = new _InternalAnalysisContextMock();
+  AnalysisCache cache;
+  HtmlWorkManager manager;
+
+  CaughtException caughtException = new CaughtException(null, null);
+
+  Source source1 = new TestSource('1.html');
+  Source source2 = new TestSource('2.html');
+  Source source3 = new TestSource('3.html');
+  Source source4 = new TestSource('4.html');
+  CacheEntry entry1;
+  CacheEntry entry2;
+  CacheEntry entry3;
+  CacheEntry entry4;
+
+  void expect_sourceQueue(List<Source> sources) {
+    expect(manager.sourceQueue, unorderedEquals(sources));
+  }
+
+  void setUp() {
+    cache = context.analysisCache;
+    manager = new HtmlWorkManager(context);
+    entry1 = context.getCacheEntry(source1);
+    entry2 = context.getCacheEntry(source2);
+    entry3 = context.getCacheEntry(source3);
+    entry4 = context.getCacheEntry(source4);
+  }
+
+  void test_applyChange_add() {
+    // add source1
+    manager.applyChange([source1], [], []);
+    expect_sourceQueue([source1]);
+    // add source2
+    manager.applyChange([source2], [], []);
+    expect_sourceQueue([source1, source2]);
+  }
+
+  void test_applyChange_add_duplicate() {
+    // add source1
+    manager.applyChange([source1], [], []);
+    expect_sourceQueue([source1]);
+    // add source1 again
+    manager.applyChange([source1], [], []);
+    expect_sourceQueue([source1]);
+  }
+
+  void test_applyChange_change() {
+    // change source1
+    manager.applyChange([], [source1], []);
+    expect_sourceQueue([source1]);
+  }
+
+  void test_applyChange_change_afterAdd() {
+    manager.applyChange([source1, source2], [], []);
+    // change source1
+    manager.applyChange([], [source1], []);
+    expect_sourceQueue([source1, source2]);
+  }
+
+  void test_applyChange_remove() {
+    manager.applyChange([source1, source2], [], []);
+    // remove source1
+    manager.applyChange([], [], [source1]);
+    expect_sourceQueue([source2]);
+    // remove source2
+    manager.applyChange([], [], [source2]);
+    expect_sourceQueue([]);
+    // remove source3
+    manager.applyChange([], [], [source3]);
+    expect_sourceQueue([]);
+  }
+
+  void test_applyPriorityTargets() {
+    when(context.shouldErrorsBeAnalyzed(source2, null)).thenReturn(true);
+    when(context.shouldErrorsBeAnalyzed(source3, null)).thenReturn(true);
+    manager.priorityResultQueue.add(new TargetedResult(source1, HTML_ERRORS));
+    manager.priorityResultQueue.add(new TargetedResult(source2, HTML_ERRORS));
+    // -source1 +source3
+    manager.applyPriorityTargets([source2, source3]);
+    expect(
+        manager.priorityResultQueue,
+        unorderedEquals([
+          new TargetedResult(source2, HTML_ERRORS),
+          new TargetedResult(source3, HTML_ERRORS)
+        ]));
+    // get next request
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source2);
+    expect(request.result, HTML_ERRORS);
+  }
+
+  void test_getErrors_fullList() {
+    AnalysisError error1 =
+        new AnalysisError(source1, 1, 0, HtmlErrorCode.PARSE_ERROR, ['']);
+    AnalysisError error2 =
+        new AnalysisError(source1, 2, 0, HtmlErrorCode.PARSE_ERROR, ['']);
+    entry1.setValue(HTML_DOCUMENT_ERRORS, <AnalysisError>[error1], []);
+
+    DartScript script = new DartScript(source1, []);
+    entry1.setValue(DART_SCRIPTS, [script], []);
+    CacheEntry scriptEntry = context.getCacheEntry(script);
+    scriptEntry.setValue(DART_ERRORS, [error2], []);
+
+    List<AnalysisError> errors = manager.getErrors(source1);
+    expect(errors, unorderedEquals([error1, error2]));
+  }
+
+  void test_getErrors_partialList() {
+    AnalysisError error1 =
+        new AnalysisError(source1, 1, 0, HtmlErrorCode.PARSE_ERROR, ['']);
+    AnalysisError error2 =
+        new AnalysisError(source1, 2, 0, HtmlErrorCode.PARSE_ERROR, ['']);
+    entry1.setValue(HTML_DOCUMENT_ERRORS, <AnalysisError>[error1, error2], []);
+
+    List<AnalysisError> errors = manager.getErrors(source1);
+    expect(errors, unorderedEquals([error1, error2]));
+  }
+
+  void test_getNextResult_hasNormal_firstIsError() {
+    entry1.setErrorState(caughtException, [HTML_ERRORS]);
+    manager.sourceQueue.addAll([source1, source2]);
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source2);
+    expect(request.result, HTML_ERRORS);
+    // source1 is out, source2 is waiting
+    expect_sourceQueue([source2]);
+  }
+
+  void test_getNextResult_hasNormal_firstIsInvalid() {
+    entry1.setState(HTML_ERRORS, CacheState.INVALID);
+    manager.sourceQueue.addAll([source1, source2]);
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source1);
+    expect(request.result, HTML_ERRORS);
+    // no changes until computed
+    expect_sourceQueue([source1, source2]);
+  }
+
+  void test_getNextResult_hasNormal_firstIsValid() {
+    entry1.setValue(HTML_ERRORS, [], []);
+    manager.sourceQueue.addAll([source1, source2]);
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source2);
+    expect(request.result, HTML_ERRORS);
+    // source1 is out, source2 is waiting
+    expect_sourceQueue([source2]);
+  }
+
+  void test_getNextResult_hasNormalAndPriority() {
+    entry1.setState(HTML_ERRORS, CacheState.INVALID);
+    manager.sourceQueue.addAll([source1, source2]);
+    manager.addPriorityResult(source3, HTML_ERRORS);
+
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source3);
+    expect(request.result, HTML_ERRORS);
+    // no changes until computed
+    expect_sourceQueue([source1, source2]);
+  }
+
+  void test_getNextResult_hasPriority() {
+    manager.addPriorityResult(source1, HTML_ERRORS);
+    manager.addPriorityResult(source2, HTML_ERRORS);
+    expect(
+        manager.priorityResultQueue,
+        unorderedEquals([
+          new TargetedResult(source1, HTML_ERRORS),
+          new TargetedResult(source2, HTML_ERRORS)
+        ]));
+
+    TargetedResult request = manager.getNextResult();
+    expect(request.target, source1);
+    expect(request.result, HTML_ERRORS);
+    // no changes until computed
+    expect(
+        manager.priorityResultQueue,
+        unorderedEquals([
+          new TargetedResult(source1, HTML_ERRORS),
+          new TargetedResult(source2, HTML_ERRORS)
+        ]));
+  }
+
+  void test_getNextResult_nothingToDo() {
+    TargetedResult request = manager.getNextResult();
+    expect(request, isNull);
+  }
+
+  void test_getNextResultPriority_hasPriority() {
+    manager.addPriorityResult(source1, SOURCE_KIND);
+    expect(manager.getNextResultPriority(), WorkOrderPriority.PRIORITY);
+  }
+
+  void test_getNextResultPriority_hasSource() {
+    manager.sourceQueue.addAll([source1]);
+    expect(manager.getNextResultPriority(), WorkOrderPriority.NORMAL);
+  }
+
+  void test_getNextResultPriority_nothingToDo() {
+    expect(manager.getNextResultPriority(), WorkOrderPriority.NONE);
+  }
+
+  void test_onAnalysisOptionsChanged() {
+    when(context.exists(anyObject)).thenReturn(true);
+    // set cache values
+    entry1.setValue(DART_SCRIPTS, [], []);
+    entry1.setValue(HTML_DOCUMENT, null, []);
+    entry1.setValue(HTML_DOCUMENT_ERRORS, [], []);
+    entry1.setValue(HTML_ERRORS, [], []);
+    entry1.setValue(REFERENCED_LIBRARIES, [], []);
+    // notify
+    manager.onAnalysisOptionsChanged();
+    // Only resolution-based values are invalidated.
+    expect(entry1.getState(DART_SCRIPTS), CacheState.VALID);
+    expect(entry1.getState(HTML_DOCUMENT), CacheState.VALID);
+    expect(entry1.getState(HTML_DOCUMENT_ERRORS), CacheState.VALID);
+    expect(entry1.getState(HTML_ERRORS), CacheState.INVALID);
+    expect(entry1.getState(REFERENCED_LIBRARIES), CacheState.VALID);
+  }
+
+  void test_onResultInvalidated_scheduleInvalidatedLibraries() {
+    // set HTML_ERRORS for source1 and source3
+    entry1.setValue(HTML_ERRORS, [], []);
+    entry3.setValue(HTML_ERRORS, [], []);
+    // invalidate HTML_ERRORS for source1, schedule it
+    entry1.setState(HTML_ERRORS, CacheState.INVALID);
+    expect_sourceQueue([source1]);
+    // invalidate HTML_ERRORS for source3, schedule it
+    entry3.setState(HTML_ERRORS, CacheState.INVALID);
+    expect_sourceQueue([source1, source3]);
+  }
+
+  void test_onSourceFactoryChanged() {
+    when(context.exists(anyObject)).thenReturn(true);
+    // set cache values
+    entry1.setValue(DART_SCRIPTS, [], []);
+    entry1.setValue(HTML_DOCUMENT, null, []);
+    entry1.setValue(HTML_DOCUMENT_ERRORS, [], []);
+    entry1.setValue(HTML_ERRORS, [], []);
+    entry1.setValue(REFERENCED_LIBRARIES, [], []);
+    // notify
+    manager.onSourceFactoryChanged();
+    // Only resolution-based values are invalidated.
+    expect(entry1.getState(DART_SCRIPTS), CacheState.VALID);
+    expect(entry1.getState(HTML_DOCUMENT), CacheState.VALID);
+    expect(entry1.getState(HTML_DOCUMENT_ERRORS), CacheState.VALID);
+    expect(entry1.getState(HTML_ERRORS), CacheState.INVALID);
+    expect(entry1.getState(REFERENCED_LIBRARIES), CacheState.INVALID);
+  }
+
+  void test_resultsComputed_errors() {
+    AnalysisError error1 =
+        new AnalysisError(source1, 1, 0, HtmlErrorCode.PARSE_ERROR, ['']);
+    AnalysisError error2 =
+        new AnalysisError(source1, 2, 0, HtmlErrorCode.PARSE_ERROR, ['']);
+    LineInfo lineInfo = new LineInfo([0]);
+    entry1.setValue(LINE_INFO, lineInfo, []);
+    entry1.setValue(HTML_ERRORS, <AnalysisError>[error1, error2], []);
+    // RESOLVED_UNIT is ready, set errors
+    manager.resultsComputed(source1, {HTML_ERRORS: null});
+    // all of the errors are included
+    ChangeNoticeImpl notice = context.getNotice(source1);
+    expect(notice.errors, unorderedEquals([error1, error2]));
+    expect(notice.lineInfo, lineInfo);
+  }
+}
+
+class _InternalAnalysisContextMock extends TypedMock
+    implements InternalAnalysisContext {
+  @override
+  CachePartition privateAnalysisCachePartition;
+
+  @override
+  AnalysisCache analysisCache;
+
+  Map<Source, ChangeNoticeImpl> _pendingNotices = <Source, ChangeNoticeImpl>{};
+
+  _InternalAnalysisContextMock() {
+    privateAnalysisCachePartition = new UniversalCachePartition(this);
+    analysisCache = new AnalysisCache([privateAnalysisCachePartition]);
+  }
+
+  @override
+  CacheEntry getCacheEntry(AnalysisTarget target) {
+    CacheEntry entry = analysisCache.get(target);
+    if (entry == null) {
+      entry = new CacheEntry(target);
+      analysisCache.put(entry);
+    }
+    return entry;
+  }
+
+  @override
+  AnalysisErrorInfo getErrors(Source source) {
+    String name = source.shortName;
+    List<AnalysisError> errors = AnalysisError.NO_ERRORS;
+    if (AnalysisEngine.isDartFileName(name) || source is DartScript) {
+      errors = getCacheEntry(source).getValue(DART_ERRORS);
+    } else if (AnalysisEngine.isHtmlFileName(name)) {
+      errors = getCacheEntry(source).getValue(HTML_ERRORS);
+    }
+    return new AnalysisErrorInfoImpl(
+        errors, getCacheEntry(source).getValue(LINE_INFO));
+  }
+
+  @override
+  ChangeNoticeImpl getNotice(Source source) {
+    return _pendingNotices.putIfAbsent(
+        source, () => new ChangeNoticeImpl(source));
+  }
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/task/incremental_element_builder_test.dart b/mojo/public/dart/third_party/analyzer/test/src/task/incremental_element_builder_test.dart
new file mode 100644
index 0000000..b495be7
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/task/incremental_element_builder_test.dart
@@ -0,0 +1,694 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.task.incremental_element_builder_test;
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/task/incremental_element_builder.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+import '../../utils.dart';
+import '../context/abstract_context.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(IncrementalCompilationUnitElementBuilderTest);
+}
+
+@reflectiveTest
+class IncrementalCompilationUnitElementBuilderTest extends AbstractContextTest {
+  Source source;
+
+  String oldCode;
+  CompilationUnit oldUnit;
+  CompilationUnitElement unitElement;
+
+  String newCode;
+  CompilationUnit newUnit;
+
+  CompilationUnitElementDelta unitDelta;
+
+  String getNodeText(AstNode node) {
+    return newCode.substring(node.offset, node.end);
+  }
+
+  test_directives_add() {
+    _buildOldUnit(r'''
+library test;
+import 'dart:math';
+''');
+    List<Directive> oldDirectives = oldUnit.directives.toList();
+    _buildNewUnit(r'''
+library test;
+import 'dart:async';
+import 'dart:math';
+''');
+    List<Directive> newDirectives = newUnit.directives;
+    {
+      Directive newNode = newDirectives[0];
+      expect(newNode, same(oldDirectives[0]));
+      expect(getNodeText(newNode), "library test;");
+      LibraryElement element = newNode.element;
+      expect(element, isNotNull);
+      expect(element.nameOffset, newCode.indexOf('test;'));
+    }
+    {
+      Directive newNode = newDirectives[1];
+      expect(getNodeText(newNode), "import 'dart:async';");
+      ImportElement element = newNode.element;
+      expect(element, isNull);
+    }
+    {
+      Directive newNode = newDirectives[2];
+      expect(newNode, same(oldDirectives[1]));
+      expect(getNodeText(newNode), "import 'dart:math';");
+      ImportElement element = newNode.element;
+      expect(element, isNotNull);
+      expect(element.nameOffset, newCode.indexOf("import 'dart:math';"));
+    }
+    expect(unitDelta.hasDirectiveChange, isTrue);
+  }
+
+  test_directives_keepOffset_partOf() {
+    String libCode = '''
+// comment to shift tokens
+library my_lib;
+part 'test.dart';
+''';
+    Source libSource = newSource('/lib.dart', libCode);
+    _buildOldUnit(
+        r'''
+part of my_lib;
+class A {}
+''',
+        libSource);
+    List<Directive> oldDirectives = oldUnit.directives.toList();
+    _buildNewUnit(r'''
+part of my_lib;
+class A {}
+''');
+    List<Directive> newDirectives = newUnit.directives;
+    {
+      Directive newNode = newDirectives[0];
+      expect(newNode, same(oldDirectives[0]));
+      expect(getNodeText(newNode), 'part of my_lib;');
+      LibraryElement element = newNode.element;
+      expect(element, isNotNull);
+      expect(element.nameOffset, libCode.indexOf('my_lib;'));
+    }
+  }
+
+  test_directives_remove() {
+    _buildOldUnit(r'''
+library test;
+import 'dart:async';
+import 'dart:math';
+''');
+    List<Directive> oldDirectives = oldUnit.directives.toList();
+    _buildNewUnit(r'''
+library test;
+import 'dart:math';
+''');
+    List<Directive> newDirectives = newUnit.directives;
+    {
+      Directive newNode = newDirectives[0];
+      expect(newNode, same(oldDirectives[0]));
+      expect(getNodeText(newNode), "library test;");
+      LibraryElement element = newNode.element;
+      expect(element, isNotNull);
+      expect(element.nameOffset, newCode.indexOf('test;'));
+    }
+    {
+      Directive newNode = newDirectives[1];
+      expect(newNode, same(oldDirectives[2]));
+      expect(getNodeText(newNode), "import 'dart:math';");
+      ImportElement element = newNode.element;
+      expect(element, isNotNull);
+      expect(element.nameOffset, newCode.indexOf("import 'dart:math';"));
+    }
+    expect(unitDelta.hasDirectiveChange, isTrue);
+  }
+
+  test_directives_reorder() {
+    _buildOldUnit(r'''
+library test;
+import  'dart:math' as m;
+import 'dart:async';
+''');
+    List<Directive> oldDirectives = oldUnit.directives.toList();
+    _buildNewUnit(r'''
+library test;
+import 'dart:async';
+import 'dart:math' as m;
+''');
+    List<Directive> newDirectives = newUnit.directives;
+    {
+      Directive newNode = newDirectives[0];
+      expect(newNode, same(oldDirectives[0]));
+      expect(getNodeText(newNode), "library test;");
+      LibraryElement element = newNode.element;
+      expect(element, isNotNull);
+      expect(element.nameOffset, newCode.indexOf('test;'));
+    }
+    {
+      Directive newNode = newDirectives[1];
+      expect(newNode, same(oldDirectives[2]));
+      expect(getNodeText(newNode), "import 'dart:async';");
+      ImportElement element = newNode.element;
+      expect(element, isNotNull);
+      expect(element.nameOffset, newCode.indexOf("import 'dart:async';"));
+    }
+    {
+      Directive newNode = newDirectives[2];
+      expect(newNode, same(oldDirectives[1]));
+      expect(getNodeText(newNode), "import 'dart:math' as m;");
+      ImportElement element = newNode.element;
+      expect(element, isNotNull);
+      expect(element.nameOffset, newCode.indexOf("import 'dart:math' as m;"));
+      expect(element.prefix.nameOffset, newCode.indexOf("m;"));
+    }
+    expect(unitDelta.hasDirectiveChange, isFalse);
+  }
+
+  test_directives_sameOrder_insertSpaces() {
+    _buildOldUnit(r'''
+library test;
+import 'dart:async';
+import 'dart:math';
+''');
+    List<Directive> oldDirectives = oldUnit.directives.toList();
+    _buildNewUnit(r'''
+library test;
+
+import 'dart:async' ;
+import  'dart:math';
+''');
+    List<Directive> newDirectives = newUnit.directives;
+    {
+      Directive newNode = newDirectives[0];
+      expect(newNode, same(oldDirectives[0]));
+      expect(getNodeText(newNode), "library test;");
+      LibraryElement element = newNode.element;
+      expect(element, isNotNull);
+      expect(element.nameOffset, newCode.indexOf('test;'));
+    }
+    {
+      Directive newNode = newDirectives[1];
+      expect(newNode, same(oldDirectives[1]));
+      expect(getNodeText(newNode), "import 'dart:async' ;");
+      ImportElement element = newNode.element;
+      expect(element, isNotNull);
+      expect(element.nameOffset, newCode.indexOf("import 'dart:async' ;"));
+    }
+    {
+      Directive newNode = newDirectives[2];
+      expect(newNode, same(oldDirectives[2]));
+      expect(getNodeText(newNode), "import  'dart:math';");
+      ImportElement element = newNode.element;
+      expect(element, isNotNull);
+      expect(element.nameOffset, newCode.indexOf("import  'dart:math';"));
+    }
+    expect(unitDelta.hasDirectiveChange, isFalse);
+  }
+
+  test_directives_sameOrder_removeSpaces() {
+    _buildOldUnit(r'''
+library test;
+
+import 'dart:async' ;
+import  'dart:math';
+''');
+    List<Directive> oldDirectives = oldUnit.directives.toList();
+    _buildNewUnit(r'''
+library test;
+import 'dart:async';
+import 'dart:math';
+''');
+    List<Directive> newDirectives = newUnit.directives;
+    {
+      Directive newNode = newDirectives[0];
+      expect(newNode, same(oldDirectives[0]));
+      expect(getNodeText(newNode), "library test;");
+      LibraryElement element = newNode.element;
+      expect(element, isNotNull);
+      expect(element.nameOffset, newCode.indexOf('test;'));
+    }
+    {
+      Directive newNode = newDirectives[1];
+      expect(newNode, same(oldDirectives[1]));
+      expect(getNodeText(newNode), "import 'dart:async';");
+      ImportElement element = newNode.element;
+      expect(element, isNotNull);
+      expect(element.nameOffset, newCode.indexOf("import 'dart:async';"));
+    }
+    {
+      Directive newNode = newDirectives[2];
+      expect(newNode, same(oldDirectives[2]));
+      expect(getNodeText(newNode), "import 'dart:math';");
+      ImportElement element = newNode.element;
+      expect(element, isNotNull);
+      expect(element.nameOffset, newCode.indexOf("import 'dart:math';"));
+    }
+    expect(unitDelta.hasDirectiveChange, isFalse);
+  }
+
+  test_unitMembers_accessor_add() {
+    _buildOldUnit(r'''
+get a => 1;
+''');
+    List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
+    _buildNewUnit(r'''
+get a => 1;
+get b => 2;
+''');
+    List<CompilationUnitMember> newNodes = newUnit.declarations;
+    // nodes
+    FunctionDeclaration node1 = newNodes[0];
+    FunctionDeclaration node2 = newNodes[1];
+    expect(node1, same(oldNodes[0]));
+    // elements
+    PropertyAccessorElement elementA = node1.element;
+    PropertyAccessorElement elementB = node2.element;
+    expect(elementA, isNotNull);
+    expect(elementB, isNotNull);
+    expect(elementA.name, 'a');
+    expect(elementB.name, 'b');
+    // unit.types
+    expect(unitElement.topLevelVariables,
+        unorderedEquals([elementA.variable, elementB.variable]));
+    expect(unitElement.accessors, unorderedEquals([elementA, elementB]));
+  }
+
+  test_unitMembers_class_add() {
+    _buildOldUnit(r'''
+class A {}
+''');
+    List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
+    _buildNewUnit(r'''
+class A {}
+class B {}
+''');
+    List<CompilationUnitMember> newNodes = newUnit.declarations;
+    // nodes
+    CompilationUnitMember nodeA = newNodes[0];
+    CompilationUnitMember nodeB = newNodes[1];
+    expect(nodeA, same(oldNodes[0]));
+    // elements
+    ClassElement elementA = nodeA.element;
+    ClassElement elementB = nodeB.element;
+    expect(elementA, isNotNull);
+    expect(elementB, isNotNull);
+    expect(elementA.name, 'A');
+    expect(elementB.name, 'B');
+    // unit.types
+    expect(unitElement.types, unorderedEquals([elementA, elementB]));
+    // verify delta
+    expect(unitDelta.addedDeclarations, unorderedEquals([elementB]));
+    expect(unitDelta.removedDeclarations, unorderedEquals([]));
+  }
+
+  test_unitMembers_class_comments() {
+    _buildOldUnit(r'''
+/// reference [bool] type.
+class A {}
+/// reference [int] type.
+class B {}
+/// reference [double] and [B] types.
+class C {}
+''');
+    List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
+    _buildNewUnit(r'''
+/// reference [double] and [B] types.
+class C {}
+/// reference [bool] type.
+class A {}
+/// reference [int] type.
+class B {}
+''');
+    List<CompilationUnitMember> newNodes = newUnit.declarations;
+    {
+      CompilationUnitMember newNode = newNodes[0];
+      expect(newNode, same(oldNodes[2]));
+      expect(
+          getNodeText(newNode),
+          r'''
+/// reference [double] and [B] types.
+class C {}''');
+      ClassElement element = newNode.element;
+      expect(element, isNotNull);
+      expect(element.name, 'C');
+      expect(element.nameOffset, newCode.indexOf('C {}'));
+      // [double] and [B] are still resolved
+      {
+        var docReferences = newNode.documentationComment.references;
+        expect(docReferences, hasLength(2));
+        expect(docReferences[0].identifier.staticElement.name, 'double');
+        expect(docReferences[1].identifier.staticElement,
+            same(newNodes[2].element));
+      }
+    }
+    {
+      CompilationUnitMember newNode = newNodes[1];
+      expect(newNode, same(oldNodes[0]));
+      expect(
+          getNodeText(newNode),
+          r'''
+/// reference [bool] type.
+class A {}''');
+      ClassElement element = newNode.element;
+      expect(element, isNotNull);
+      expect(element.name, 'A');
+      expect(element.nameOffset, newCode.indexOf('A {}'));
+      // [bool] is still resolved
+      {
+        var docReferences = newNode.documentationComment.references;
+        expect(docReferences, hasLength(1));
+        expect(docReferences[0].identifier.staticElement.name, 'bool');
+      }
+    }
+    {
+      CompilationUnitMember newNode = newNodes[2];
+      expect(newNode, same(oldNodes[1]));
+      expect(
+          getNodeText(newNode),
+          r'''
+/// reference [int] type.
+class B {}''');
+      ClassElement element = newNode.element;
+      expect(element, isNotNull);
+      expect(element.name, 'B');
+      expect(element.nameOffset, newCode.indexOf('B {}'));
+      // [int] is still resolved
+      {
+        var docReferences = newNode.documentationComment.references;
+        expect(docReferences, hasLength(1));
+        expect(docReferences[0].identifier.staticElement.name, 'int');
+      }
+    }
+    // verify delta
+    expect(unitDelta.addedDeclarations, unorderedEquals([]));
+    expect(unitDelta.removedDeclarations, unorderedEquals([]));
+  }
+
+  test_unitMembers_class_remove() {
+    _buildOldUnit(r'''
+class A {}
+class B {}
+''');
+    List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
+    _buildNewUnit(r'''
+class A {}
+''');
+    List<CompilationUnitMember> newNodes = newUnit.declarations;
+    // nodes
+    CompilationUnitMember nodeA = newNodes[0];
+    CompilationUnitMember nodeB = oldNodes[1];
+    expect(nodeA, same(oldNodes[0]));
+    // elements
+    ClassElement elementA = nodeA.element;
+    ClassElement elementB = nodeB.element;
+    expect(elementA, isNotNull);
+    expect(elementB, isNotNull);
+    expect(elementA.name, 'A');
+    expect(elementB.name, 'B');
+    // unit.types
+    expect(unitElement.types, unorderedEquals([elementA]));
+    // verify delta
+    expect(unitDelta.addedDeclarations, unorderedEquals([]));
+    expect(unitDelta.removedDeclarations, unorderedEquals([elementB]));
+  }
+
+  test_unitMembers_class_reorder() {
+    _buildOldUnit(r'''
+class A {}
+class B {}
+class C {}
+''');
+    List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
+    _buildNewUnit(r'''
+class C {}
+class A {}
+class B {}
+''');
+    List<CompilationUnitMember> newNodes = newUnit.declarations;
+    {
+      CompilationUnitMember newNode = newNodes[0];
+      expect(newNode, same(oldNodes[2]));
+      expect(getNodeText(newNode), 'class C {}');
+      ClassElement element = newNode.element;
+      expect(element, isNotNull);
+      expect(element.name, 'C');
+      expect(element.nameOffset, newCode.indexOf('C {}'));
+    }
+    {
+      CompilationUnitMember newNode = newNodes[1];
+      expect(newNode, same(oldNodes[0]));
+      expect(getNodeText(newNode), 'class A {}');
+      ClassElement element = newNode.element;
+      expect(element, isNotNull);
+      expect(element.name, 'A');
+      expect(element.nameOffset, newCode.indexOf('A {}'));
+    }
+    {
+      CompilationUnitMember newNode = newNodes[2];
+      expect(newNode, same(oldNodes[1]));
+      expect(getNodeText(newNode), 'class B {}');
+      ClassElement element = newNode.element;
+      expect(element, isNotNull);
+      expect(element.name, 'B');
+      expect(element.nameOffset, newCode.indexOf('B {}'));
+    }
+    // verify delta
+    expect(unitDelta.addedDeclarations, unorderedEquals([]));
+    expect(unitDelta.removedDeclarations, unorderedEquals([]));
+  }
+
+  test_unitMembers_enum_add() {
+    _buildOldUnit(r'''
+enum A {A1, A2}
+''');
+    List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
+    _buildNewUnit(r'''
+enum A {A1, A2}
+enum B {B1, B2}
+''');
+    List<CompilationUnitMember> newNodes = newUnit.declarations;
+    // nodes
+    CompilationUnitMember nodeA = newNodes[0];
+    CompilationUnitMember nodeB = newNodes[1];
+    expect(nodeA, same(oldNodes[0]));
+    // elements
+    ClassElement elementA = nodeA.element;
+    ClassElement elementB = nodeB.element;
+    expect(elementA, isNotNull);
+    expect(elementB, isNotNull);
+    expect(elementA.name, 'A');
+    expect(elementB.name, 'B');
+    // unit.types
+    expect(unitElement.enums, unorderedEquals([elementA, elementB]));
+    // verify delta
+    expect(unitDelta.addedDeclarations, unorderedEquals([elementB]));
+    expect(unitDelta.removedDeclarations, unorderedEquals([]));
+  }
+
+  test_unitMembers_function_add() {
+    _buildOldUnit(r'''
+a() {}
+''');
+    List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
+    _buildNewUnit(r'''
+a() {}
+b() {}
+''');
+    List<CompilationUnitMember> newNodes = newUnit.declarations;
+    // nodes
+    CompilationUnitMember nodeA = newNodes[0];
+    CompilationUnitMember nodeB = newNodes[1];
+    expect(nodeA, same(oldNodes[0]));
+    // elements
+    FunctionElement elementA = nodeA.element;
+    FunctionElement elementB = nodeB.element;
+    expect(elementA, isNotNull);
+    expect(elementB, isNotNull);
+    expect(elementA.name, 'a');
+    expect(elementB.name, 'b');
+    // unit.types
+    expect(unitElement.functions, unorderedEquals([elementA, elementB]));
+    // verify delta
+    expect(unitDelta.addedDeclarations, unorderedEquals([elementB]));
+    expect(unitDelta.removedDeclarations, unorderedEquals([]));
+  }
+
+  test_unitMembers_functionTypeAlias_add() {
+    _buildOldUnit(r'''
+typedef A();
+''');
+    List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
+    _buildNewUnit(r'''
+typedef A();
+typedef B();
+''');
+    List<CompilationUnitMember> newNodes = newUnit.declarations;
+    // nodes
+    CompilationUnitMember nodeA = newNodes[0];
+    CompilationUnitMember nodeB = newNodes[1];
+    expect(nodeA, same(oldNodes[0]));
+    // elements
+    FunctionTypeAliasElement elementA = nodeA.element;
+    FunctionTypeAliasElement elementB = nodeB.element;
+    expect(elementA, isNotNull);
+    expect(elementB, isNotNull);
+    expect(elementA.name, 'A');
+    expect(elementB.name, 'B');
+    // unit.types
+    expect(
+        unitElement.functionTypeAliases, unorderedEquals([elementA, elementB]));
+    // verify delta
+    expect(unitDelta.addedDeclarations, unorderedEquals([elementB]));
+    expect(unitDelta.removedDeclarations, unorderedEquals([]));
+  }
+
+  test_unitMembers_topLevelVariable() {
+    _buildOldUnit(r'''
+bool a = 1, b = 2;
+int c = 3;
+''');
+    List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
+    _buildNewUnit(r'''
+int c = 3;
+
+bool a =1, b = 2;
+''');
+    List<CompilationUnitMember> newNodes = newUnit.declarations;
+    {
+      TopLevelVariableDeclaration newNode = newNodes[0];
+      expect(newNode, same(oldNodes[1]));
+      expect(getNodeText(newNode), 'int c = 3;');
+      {
+        TopLevelVariableElement element =
+            newNode.variables.variables[0].element;
+        expect(element, isNotNull);
+        expect(element.name, 'c');
+        expect(element.nameOffset, newCode.indexOf('c = 3'));
+      }
+    }
+    {
+      TopLevelVariableDeclaration newNode = newNodes[1];
+      expect(newNode, same(oldNodes[0]));
+      expect(getNodeText(newNode), 'bool a =1, b = 2;');
+      {
+        TopLevelVariableElement element =
+            newNode.variables.variables[0].element;
+        expect(element, isNotNull);
+        expect(element.name, 'a');
+        expect(element.nameOffset, newCode.indexOf('a =1'));
+      }
+      {
+        TopLevelVariableElement element =
+            newNode.variables.variables[1].element;
+        expect(element, isNotNull);
+        expect(element.name, 'b');
+        expect(element.nameOffset, newCode.indexOf('b = 2'));
+      }
+    }
+    // verify delta
+    expect(unitDelta.addedDeclarations, unorderedEquals([]));
+    expect(unitDelta.removedDeclarations, unorderedEquals([]));
+  }
+
+  test_unitMembers_topLevelVariable_add() {
+    _buildOldUnit(r'''
+int a, b;
+''');
+    List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
+    _buildNewUnit(r'''
+int a, b;
+int c, d;
+''');
+    List<CompilationUnitMember> newNodes = newUnit.declarations;
+    // nodes
+    TopLevelVariableDeclaration node1 = newNodes[0];
+    TopLevelVariableDeclaration node2 = newNodes[1];
+    expect(node1, same(oldNodes[0]));
+    // elements
+    TopLevelVariableElement elementA = node1.variables.variables[0].element;
+    TopLevelVariableElement elementB = node1.variables.variables[1].element;
+    TopLevelVariableElement elementC = node2.variables.variables[0].element;
+    TopLevelVariableElement elementD = node2.variables.variables[1].element;
+    expect(elementA, isNotNull);
+    expect(elementB, isNotNull);
+    expect(elementC, isNotNull);
+    expect(elementD, isNotNull);
+    expect(elementA.name, 'a');
+    expect(elementB.name, 'b');
+    expect(elementC.name, 'c');
+    expect(elementD.name, 'd');
+    // unit.types
+    expect(unitElement.topLevelVariables,
+        unorderedEquals([elementA, elementB, elementC, elementD]));
+    expect(
+        unitElement.accessors,
+        unorderedEquals([
+          elementA.getter,
+          elementA.setter,
+          elementB.getter,
+          elementB.setter,
+          elementC.getter,
+          elementC.setter,
+          elementD.getter,
+          elementD.setter
+        ]));
+  }
+
+  test_unitMembers_topLevelVariable_final() {
+    _buildOldUnit(r'''
+final int a = 1;
+''');
+    List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
+    _buildNewUnit(r'''
+final int a =  1;
+''');
+    List<CompilationUnitMember> newNodes = newUnit.declarations;
+    {
+      TopLevelVariableDeclaration newNode = newNodes[0];
+      expect(newNode, same(oldNodes[0]));
+      expect(getNodeText(newNode), 'final int a =  1;');
+      {
+        TopLevelVariableElement element =
+            newNode.variables.variables[0].element;
+        expect(element, isNotNull);
+        expect(element.name, 'a');
+        expect(element.nameOffset, newCode.indexOf('a =  1'));
+      }
+    }
+    // verify delta
+    expect(unitDelta.addedDeclarations, unorderedEquals([]));
+    expect(unitDelta.removedDeclarations, unorderedEquals([]));
+  }
+
+  void _buildNewUnit(String newCode) {
+    this.newCode = newCode;
+    context.setContents(source, newCode);
+    newUnit = context.parseCompilationUnit(source);
+    IncrementalCompilationUnitElementBuilder builder =
+        new IncrementalCompilationUnitElementBuilder(oldUnit, newUnit);
+    builder.build();
+    unitDelta = builder.unitDelta;
+    expect(newUnit.element, unitElement);
+  }
+
+  void _buildOldUnit(String oldCode, [Source libSource]) {
+    this.oldCode = oldCode;
+    source = newSource('/test.dart', oldCode);
+    if (libSource == null) {
+      libSource = source;
+    }
+    oldUnit = context.resolveCompilationUnit2(source, libSource);
+    unitElement = oldUnit.element;
+    expect(unitElement, isNotNull);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/task/inputs_test.dart b/mojo/public/dart/third_party/analyzer/test/src/task/inputs_test.dart
new file mode 100644
index 0000000..35e4660
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/task/inputs_test.dart
@@ -0,0 +1,951 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.task.inputs_test;
+
+import 'package:analyzer/src/task/inputs.dart';
+import 'package:analyzer/src/task/model.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../generated/test_support.dart';
+import '../../reflective_tests.dart';
+import '../../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(ListTaskInputImplTest);
+  runReflectiveTests(ListToListTaskInputTest);
+  runReflectiveTests(ListToListTaskInputBuilderTest);
+  runReflectiveTests(ListToMapTaskInputBuilderTest);
+  runReflectiveTests(ListToMapTaskInputTest);
+  runReflectiveTests(ObjectToListTaskInputBuilderTest);
+  runReflectiveTests(ObjectToListTaskInputTest);
+  runReflectiveTests(SimpleTaskInputTest);
+  runReflectiveTests(SimpleTaskInputBuilderTest);
+  runReflectiveTests(TopLevelTaskInputBuilderTest);
+}
+
+@reflectiveTest
+class ListTaskInputImplTest extends EngineTestCase {
+  static final AnalysisTarget target = new TestSource();
+  static final result1 =
+      new ResultDescriptorImpl<List<AnalysisTarget>>('result1', null);
+  static final result2 = new ResultDescriptorImpl<int>('result2', null);
+
+  test_create() {
+    var input = new ListTaskInputImpl<AnalysisTarget>(target, result1);
+    expect(input, isNotNull);
+    expect(input.target, target);
+    expect(input.result, result1);
+  }
+
+  test_createBuilder() {
+    var input = new ListTaskInputImpl<AnalysisTarget>(target, result1);
+    expect(input.createBuilder(), new isInstanceOf<SimpleTaskInputBuilder>());
+  }
+
+  test_toList() {
+    var input = new ListTaskInputImpl<AnalysisTarget>(target, result1);
+    TaskInput<List> input2 = input.toList((target) => 'name');
+    expect(input2,
+        new isInstanceOf<ListToListTaskInput<AnalysisTarget, String>>());
+  }
+
+  test_toListOf() {
+    var input = new ListTaskInputImpl<AnalysisTarget>(target, result1);
+    TaskInput<List> input2 = input.toListOf(result2);
+    expect(
+        input2, new isInstanceOf<ListToListTaskInput<AnalysisTarget, int>>());
+  }
+
+  test_toMap() {
+    var input = new ListTaskInputImpl<AnalysisTarget>(target, result1);
+    TaskInput<Map> input2 = input.toMap((target) => 'name');
+    expect(
+        input2, new isInstanceOf<ListToMapTaskInput<AnalysisTarget, String>>());
+  }
+
+  test_toMapOf() {
+    var input = new ListTaskInputImpl<AnalysisTarget>(target, result1);
+    TaskInput<Map> input2 = input.toMapOf(result2);
+    expect(input2, new isInstanceOf<ListToMapTaskInput<AnalysisTarget, int>>());
+  }
+}
+
+@reflectiveTest
+class ListToListTaskInputBuilderTest extends EngineTestCase {
+  static final AnalysisTarget target1 = new TestSource();
+  static final ResultDescriptorImpl result1 =
+      new ResultDescriptorImpl('result1', null);
+  static final ResultDescriptorImpl result2 =
+      new ResultDescriptorImpl('result2', null);
+  static final ListToListTaskInput input = new ListToListTaskInput(
+      result1.of(target1), (element) => result2.of(element));
+
+  test_create() {
+    ListToListTaskInputBuilder builder = new ListToListTaskInputBuilder(input);
+    expect(builder, isNotNull);
+    expect(builder.input, input);
+  }
+
+  test_currentResult_afterComplete() {
+    ListToListTaskInputBuilder builder = new ListToListTaskInputBuilder(input);
+    builder.moveNext();
+    builder.currentValue = [];
+    builder.moveNext();
+    expect(builder.currentResult, null);
+  }
+
+  test_currentResult_afterCurrentValueNotAvailable() {
+    ListToListTaskInputBuilder builder = new ListToListTaskInputBuilder(input);
+    builder.moveNext();
+    builder.currentValueNotAvailable();
+    builder.moveNext();
+    expect(builder.currentResult, null);
+  }
+
+  test_currentResult_afterOneMoveNext() {
+    ListToListTaskInputBuilder builder = new ListToListTaskInputBuilder(input);
+    builder.moveNext();
+    expect(builder.currentResult, result1);
+  }
+
+  test_currentResult_beforeMoveNext() {
+    ListToListTaskInputBuilder builder = new ListToListTaskInputBuilder(input);
+    expect(builder.currentResult, null);
+  }
+
+  test_currentTarget_afterComplete() {
+    ListToListTaskInputBuilder builder = new ListToListTaskInputBuilder(input);
+    builder.moveNext();
+    builder.currentValue = [];
+    builder.moveNext();
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentTarget_afterCurrentValueNotAvailable() {
+    ListToListTaskInputBuilder builder = new ListToListTaskInputBuilder(input);
+    builder.moveNext();
+    builder.currentValueNotAvailable();
+    builder.moveNext();
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentTarget_afterOneMoveNext() {
+    ListToListTaskInputBuilder builder = new ListToListTaskInputBuilder(input);
+    builder.moveNext();
+    expect(builder.currentTarget, target1);
+  }
+
+  test_currentTarget_beforeMoveNext() {
+    ListToListTaskInputBuilder builder = new ListToListTaskInputBuilder(input);
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentValue_afterOneMoveNext() {
+    ListToListTaskInputBuilder builder = new ListToListTaskInputBuilder(input);
+    builder.moveNext();
+    builder.currentValue = [];
+  }
+
+  test_currentValue_beforeMoveNext() {
+    ListToListTaskInputBuilder builder = new ListToListTaskInputBuilder(input);
+    expect(() {
+      builder.currentValue = [];
+    }, throwsStateError);
+  }
+
+  test_currentValueNotAvailable_afterOneMoveNext() {
+    ListToListTaskInputBuilder builder = new ListToListTaskInputBuilder(input);
+    builder.moveNext();
+    builder.currentValueNotAvailable();
+  }
+
+  test_currentValueNotAvailable_beforeMoveNext() {
+    ListToListTaskInputBuilder builder = new ListToListTaskInputBuilder(input);
+    expect(() {
+      builder.currentValueNotAvailable();
+    }, throwsStateError);
+  }
+
+  test_inputValue_afterComplete() {
+    AnalysisTarget target2 = new TestSource();
+    AnalysisTarget target3 = new TestSource();
+    String value2 = 'value2';
+    String value3 = 'value3';
+    ListToListTaskInputBuilder builder = new ListToListTaskInputBuilder(input);
+    builder.moveNext(); // Advance to requesting the list
+    builder.currentValue = [target2, target3];
+    builder.moveNext(); // Advance to requesting result2 for target2
+    builder.currentValue = value2;
+    builder.moveNext(); // Advance to requesting result2 for target3
+    builder.currentValue = value3;
+    builder.moveNext(); // Advance to the end
+    var inputValue = builder.inputValue;
+    expect(inputValue, new isInstanceOf<List>());
+    List list = inputValue;
+    expect(list.length, 2);
+    expect(list[0], value2);
+    expect(list[1], value3);
+  }
+
+  test_inputValue_afterFirstValueNotAvailable() {
+    AnalysisTarget target2 = new TestSource();
+    AnalysisTarget target3 = new TestSource();
+    String value3 = 'value3';
+    ListToListTaskInputBuilder builder = new ListToListTaskInputBuilder(input);
+    builder.moveNext(); // Advance to requesting the list
+    builder.currentValue = [target2, target3];
+    builder.moveNext(); // Advance to requesting result2 for target2
+    builder.currentValueNotAvailable();
+    builder.moveNext(); // Advance to requesting result2 for target3
+    builder.currentValue = value3;
+    builder.moveNext(); // Advance to the end
+    var inputValue = builder.inputValue;
+    expect(inputValue, new isInstanceOf<List>());
+    List list = inputValue;
+    expect(list, orderedEquals([value3]));
+  }
+
+  test_inputValue_afterListNotAvailable() {
+    ListToListTaskInputBuilder builder = new ListToListTaskInputBuilder(input);
+    builder.moveNext(); // Advance to requesting the list
+    builder.currentValueNotAvailable();
+    builder.moveNext(); // Advance to the end
+    var inputValue = builder.inputValue;
+    expect(inputValue, new isInstanceOf<List>());
+    List list = inputValue;
+    expect(list, isEmpty);
+  }
+
+  test_inputValue_afterOneMoveNext() {
+    ListToListTaskInputBuilder builder = new ListToListTaskInputBuilder(input);
+    builder.moveNext();
+    expect(() => builder.inputValue, throwsStateError);
+  }
+
+  test_inputValue_beforeMoveNext() {
+    ListToListTaskInputBuilder builder = new ListToListTaskInputBuilder(input);
+    expect(() => builder.inputValue, throwsStateError);
+  }
+
+  test_moveNext_withoutSet() {
+    ListToListTaskInputBuilder builder = new ListToListTaskInputBuilder(input);
+    expect(builder.moveNext(), true);
+    expect(() => builder.moveNext(), throwsStateError);
+  }
+
+  test_moveNext_withSet() {
+    ListToListTaskInputBuilder builder = new ListToListTaskInputBuilder(input);
+    expect(builder.moveNext(), true);
+    builder.currentValue = [];
+    expect(builder.moveNext(), false);
+    expect(builder.moveNext(), false);
+  }
+}
+
+@reflectiveTest
+class ListToListTaskInputTest extends EngineTestCase {
+  static final AnalysisTarget target = new TestSource();
+  static final ResultDescriptorImpl result =
+      new ResultDescriptorImpl('result', null);
+
+  test_create() {
+    SimpleTaskInput baseAccessor = result.of(target);
+    GenerateTaskInputs generate = (object) {};
+    ListToListTaskInput input = new ListToListTaskInput(baseAccessor, generate);
+    expect(input, isNotNull);
+    expect(input.baseAccessor, baseAccessor);
+    expect(input.generateTaskInputs, equals(generate));
+  }
+
+  test_createBuilder() {
+    SimpleTaskInput baseAccessor = result.of(target);
+    GenerateTaskInputs generate = (object) {};
+    ListToListTaskInput input = new ListToListTaskInput(baseAccessor, generate);
+    expect(input.createBuilder(), isNotNull);
+  }
+}
+
+@reflectiveTest
+class ListToMapTaskInputBuilderTest extends EngineTestCase {
+  static final AnalysisTarget target1 = new TestSource('target1');
+  static final ResultDescriptorImpl result1 =
+      new ResultDescriptorImpl('result1', null);
+  static final ResultDescriptorImpl result2 =
+      new ResultDescriptorImpl('result2', null);
+  static final ListToMapTaskInput input = new ListToMapTaskInput(
+      result1.of(target1), (element) => result2.of(element));
+
+  test_create() {
+    ListToMapTaskInputBuilder builder = new ListToMapTaskInputBuilder(input);
+    expect(builder, isNotNull);
+    expect(builder.input, input);
+  }
+
+  test_currentResult_afterComplete() {
+    ListToMapTaskInputBuilder builder = new ListToMapTaskInputBuilder(input);
+    builder.moveNext();
+    builder.currentValue = [];
+    builder.moveNext();
+    expect(builder.currentResult, null);
+  }
+
+  test_currentResult_afterCurrentValueNotAvailable() {
+    ListToMapTaskInputBuilder builder = new ListToMapTaskInputBuilder(input);
+    builder.moveNext();
+    builder.currentValueNotAvailable();
+    builder.moveNext();
+    expect(builder.currentResult, null);
+  }
+
+  test_currentResult_afterOneMoveNext() {
+    ListToMapTaskInputBuilder builder = new ListToMapTaskInputBuilder(input);
+    builder.moveNext();
+    expect(builder.currentResult, result1);
+  }
+
+  test_currentResult_beforeMoveNext() {
+    ListToMapTaskInputBuilder builder = new ListToMapTaskInputBuilder(input);
+    expect(builder.currentResult, null);
+  }
+
+  test_currentTarget_afterComplete() {
+    ListToMapTaskInputBuilder builder = new ListToMapTaskInputBuilder(input);
+    builder.moveNext();
+    builder.currentValue = [];
+    builder.moveNext();
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentTarget_afterCurrentValueNotAvailable() {
+    ListToMapTaskInputBuilder builder = new ListToMapTaskInputBuilder(input);
+    builder.moveNext();
+    builder.currentValueNotAvailable();
+    builder.moveNext();
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentTarget_afterOneMoveNext() {
+    ListToMapTaskInputBuilder builder = new ListToMapTaskInputBuilder(input);
+    builder.moveNext();
+    expect(builder.currentTarget, target1);
+  }
+
+  test_currentTarget_beforeMoveNext() {
+    ListToMapTaskInputBuilder builder = new ListToMapTaskInputBuilder(input);
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentValue_afterOneMoveNext() {
+    ListToMapTaskInputBuilder builder = new ListToMapTaskInputBuilder(input);
+    builder.moveNext();
+    builder.currentValue = [];
+  }
+
+  test_currentValue_beforeMoveNext() {
+    ListToMapTaskInputBuilder builder = new ListToMapTaskInputBuilder(input);
+    expect(() {
+      builder.currentValue = [];
+    }, throwsStateError);
+  }
+
+  test_currentValueNotAvailable_afterOneMoveNext() {
+    ListToMapTaskInputBuilder builder = new ListToMapTaskInputBuilder(input);
+    builder.moveNext();
+    builder.currentValueNotAvailable();
+  }
+
+  test_currentValueNotAvailable_beforeMoveNext() {
+    ListToMapTaskInputBuilder builder = new ListToMapTaskInputBuilder(input);
+    expect(() {
+      builder.currentValueNotAvailable();
+    }, throwsStateError);
+  }
+
+  test_inputValue_afterComplete() {
+    AnalysisTarget target2 = new TestSource('target2');
+    AnalysisTarget target3 = new TestSource('target3');
+    String value2 = 'value2';
+    String value3 = 'value3';
+    ListToMapTaskInputBuilder builder = new ListToMapTaskInputBuilder(input);
+    builder.moveNext(); // Advance to requesting the list
+    builder.currentValue = [target2, target3];
+    builder.moveNext(); // Advance to requesting result2 for target2
+    builder.currentValue = value2;
+    builder.moveNext(); // Advance to requesting result2 for target3
+    builder.currentValue = value3;
+    builder.moveNext(); // Advance to the end
+    var inputValue = builder.inputValue;
+    expect(inputValue, new isInstanceOf<Map>());
+    expect(inputValue.length, 2);
+    expect(inputValue, containsPair(target2, value2));
+    expect(inputValue, containsPair(target3, value3));
+  }
+
+  test_inputValue_afterFirstValueNotAvailable() {
+    AnalysisTarget target2 = new TestSource('target2');
+    AnalysisTarget target3 = new TestSource('target3');
+    String value3 = 'value3';
+    ListToMapTaskInputBuilder builder = new ListToMapTaskInputBuilder(input);
+    builder.moveNext(); // Advance to requesting the list
+    builder.currentValue = [target2, target3];
+    builder.moveNext(); // Advance to requesting result2 for target2
+    builder.currentValueNotAvailable();
+    builder.moveNext(); // Advance to requesting result2 for target3
+    builder.currentValue = value3;
+    builder.moveNext(); // Advance to the end
+    var inputValue = builder.inputValue;
+    expect(inputValue, new isInstanceOf<Map>());
+    expect(inputValue, hasLength(1));
+    expect(inputValue, containsPair(target3, value3));
+  }
+
+  test_inputValue_afterListNotAvailable() {
+    ListToMapTaskInputBuilder builder = new ListToMapTaskInputBuilder(input);
+    builder.moveNext(); // Advance to requesting the list
+    builder.currentValueNotAvailable();
+    builder.moveNext(); // Advance to the end
+    var inputValue = builder.inputValue;
+    expect(inputValue, new isInstanceOf<Map>());
+    expect(inputValue, isEmpty);
+  }
+
+  test_inputValue_afterOneMoveNext() {
+    ListToMapTaskInputBuilder builder = new ListToMapTaskInputBuilder(input);
+    builder.moveNext();
+    expect(() => builder.inputValue, throwsStateError);
+  }
+
+  test_inputValue_beforeMoveNext() {
+    ListToMapTaskInputBuilder builder = new ListToMapTaskInputBuilder(input);
+    expect(() => builder.inputValue, throwsStateError);
+  }
+
+  test_moveNext_withoutSet() {
+    ListToMapTaskInputBuilder builder = new ListToMapTaskInputBuilder(input);
+    expect(builder.moveNext(), true);
+    expect(() => builder.moveNext(), throwsStateError);
+  }
+
+  test_moveNext_withSet() {
+    ListToMapTaskInputBuilder builder = new ListToMapTaskInputBuilder(input);
+    expect(builder.moveNext(), true);
+    builder.currentValue = [];
+    expect(builder.moveNext(), false);
+    expect(builder.moveNext(), false);
+  }
+}
+
+@reflectiveTest
+class ListToMapTaskInputTest extends EngineTestCase {
+  static final AnalysisTarget target = new TestSource();
+  static final ResultDescriptorImpl result =
+      new ResultDescriptorImpl('result', null);
+
+  test_create() {
+    SimpleTaskInput baseAccessor = result.of(target);
+    GenerateTaskInputs generate = (object) {};
+    ListToMapTaskInput input = new ListToMapTaskInput(baseAccessor, generate);
+    expect(input, isNotNull);
+    expect(input.baseAccessor, baseAccessor);
+    expect(input.generateTaskInputs, equals(generate));
+  }
+
+  test_createBuilder() {
+    SimpleTaskInput baseAccessor = result.of(target);
+    GenerateTaskInputs generate = (object) {};
+    ListToMapTaskInput input = new ListToMapTaskInput(baseAccessor, generate);
+    expect(input.createBuilder(), isNotNull);
+  }
+}
+
+@reflectiveTest
+class ObjectToListTaskInputBuilderTest extends EngineTestCase {
+  static final AnalysisTarget target = new TestSource();
+  static final ResultDescriptorImpl result =
+      new ResultDescriptorImpl('result', null);
+  static final SimpleTaskInput baseInput = new SimpleTaskInput(target, result);
+  static final Function mapper = (x) => [x];
+  static final ObjectToListTaskInput input =
+      new ObjectToListTaskInput(baseInput, mapper);
+
+  ObjectToListTaskInputBuilder builder;
+
+  void setUp() {
+    builder = new ObjectToListTaskInputBuilder(input);
+  }
+
+  test_create() {
+    expect(builder, isNotNull);
+    expect(builder.input, input);
+  }
+
+  test_currentResult_afterComplete() {
+    builder.moveNext();
+    builder.currentValue = 'value';
+    builder.moveNext();
+    expect(builder.currentResult, null);
+  }
+
+  test_currentResult_afterCurrentValueNotAvailable() {
+    builder.moveNext();
+    builder.currentValueNotAvailable();
+    builder.moveNext();
+    expect(builder.currentResult, null);
+  }
+
+  test_currentResult_afterOneMoveNext() {
+    builder.moveNext();
+    expect(builder.currentResult, result);
+  }
+
+  test_currentResult_beforeMoveNext() {
+    expect(builder.currentResult, null);
+  }
+
+  test_currentTarget_afterComplete() {
+    builder.moveNext();
+    builder.currentValue = 'value';
+    builder.moveNext();
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentTarget_afterCurrentValueNotAvailable() {
+    builder.moveNext();
+    builder.currentValueNotAvailable();
+    builder.moveNext();
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentTarget_afterOneMoveNext() {
+    builder.moveNext();
+    expect(builder.currentTarget, target);
+  }
+
+  test_currentTarget_beforeMoveNext() {
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentValue_afterOneMoveNext() {
+    builder.moveNext();
+    builder.currentValue = 'value';
+  }
+
+  test_currentValue_beforeMoveNext() {
+    expect(() {
+      builder.currentValue = 'value';
+    }, throwsStateError);
+  }
+
+  test_currentValueNotAvailable_afterOneMoveNext() {
+    builder.moveNext();
+    builder.currentValueNotAvailable();
+  }
+
+  test_currentValueNotAvailable_beforeMoveNext() {
+    expect(() {
+      builder.currentValueNotAvailable();
+    }, throwsStateError);
+  }
+
+  test_inputValue_afterComplete() {
+    builder.moveNext();
+    String value = 'value';
+    builder.currentValue = value;
+    builder.moveNext();
+    expect(builder.inputValue, [value]);
+  }
+
+  test_inputValue_afterCurrentValueNotAvailable() {
+    builder.moveNext();
+    builder.currentValueNotAvailable();
+    builder.moveNext();
+    expect(builder.inputValue, [null]);
+  }
+
+  test_inputValue_afterOneMoveNext() {
+    builder.moveNext();
+    expect(() => builder.inputValue, throwsStateError);
+  }
+
+  test_inputValue_beforeMoveNext() {
+    expect(() => builder.inputValue, throwsStateError);
+  }
+
+  test_moveNext_withoutSet() {
+    expect(builder.moveNext(), true);
+    expect(() => builder.moveNext(), throwsStateError);
+  }
+
+  test_moveNext_withSet() {
+    expect(builder.moveNext(), true);
+    builder.currentValue = 'value';
+    expect(builder.moveNext(), false);
+    expect(builder.moveNext(), false);
+  }
+}
+
+@reflectiveTest
+class ObjectToListTaskInputTest extends EngineTestCase {
+  static final AnalysisTarget target = new TestSource();
+  static final ResultDescriptorImpl result =
+      new ResultDescriptorImpl('result', null);
+
+  test_create() {
+    SimpleTaskInput baseInput = new SimpleTaskInput(target, result);
+    Function mapper = (x) => [x];
+    ObjectToListTaskInput input = new ObjectToListTaskInput(baseInput, mapper);
+    expect(input, isNotNull);
+    expect(input.baseInput, baseInput);
+    expect(input.mapper, equals(mapper));
+  }
+
+  test_createBuilder() {
+    SimpleTaskInput baseInput = new SimpleTaskInput(target, result);
+    Function mapper = (x) => [x];
+    ObjectToListTaskInput input = new ObjectToListTaskInput(baseInput, mapper);
+    expect(input.createBuilder(),
+        new isInstanceOf<ObjectToListTaskInputBuilder>());
+  }
+}
+
+@reflectiveTest
+class SimpleTaskInputBuilderTest extends EngineTestCase {
+  static final AnalysisTarget target = new TestSource();
+  static final ResultDescriptorImpl result =
+      new ResultDescriptorImpl('result', null);
+  static final SimpleTaskInput input = new SimpleTaskInput(target, result);
+
+  SimpleTaskInputBuilder builder;
+
+  void setUp() {
+    builder = new SimpleTaskInputBuilder(input);
+  }
+
+  test_create() {
+    expect(builder, isNotNull);
+    expect(builder.input, input);
+  }
+
+  test_currentResult_afterComplete() {
+    builder.moveNext();
+    builder.currentValue = 'value';
+    builder.moveNext();
+    expect(builder.currentResult, null);
+  }
+
+  test_currentResult_afterCurrentValueNotAvailable() {
+    builder.moveNext();
+    builder.currentValueNotAvailable();
+    builder.moveNext();
+    expect(builder.currentResult, null);
+  }
+
+  test_currentResult_afterOneMoveNext() {
+    builder.moveNext();
+    expect(builder.currentResult, result);
+  }
+
+  test_currentResult_beforeMoveNext() {
+    expect(builder.currentResult, null);
+  }
+
+  test_currentTarget_afterComplete() {
+    builder.moveNext();
+    builder.currentValue = 'value';
+    builder.moveNext();
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentTarget_afterCurrentValueNotAvailable() {
+    builder.moveNext();
+    builder.currentValueNotAvailable();
+    builder.moveNext();
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentTarget_afterOneMoveNext() {
+    builder.moveNext();
+    expect(builder.currentTarget, target);
+  }
+
+  test_currentTarget_beforeMoveNext() {
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentValue_afterOneMoveNext() {
+    builder.moveNext();
+    builder.currentValue = 'value';
+  }
+
+  test_currentValue_beforeMoveNext() {
+    expect(() {
+      builder.currentValue = 'value';
+    }, throwsStateError);
+  }
+
+  test_currentValueNotAvailable_afterOneMoveNext() {
+    builder.moveNext();
+    builder.currentValueNotAvailable();
+  }
+
+  test_currentValueNotAvailable_beforeMoveNext() {
+    expect(() {
+      builder.currentValueNotAvailable();
+    }, throwsStateError);
+  }
+
+  test_inputValue_afterComplete() {
+    builder.moveNext();
+    String value = 'value';
+    builder.currentValue = value;
+    builder.moveNext();
+    expect(builder.inputValue, value);
+  }
+
+  test_inputValue_afterCurrentValueNotAvailable() {
+    builder.moveNext();
+    builder.currentValueNotAvailable();
+    builder.moveNext();
+    expect(builder.inputValue, isNull);
+  }
+
+  test_inputValue_afterOneMoveNext() {
+    builder.moveNext();
+    expect(() => builder.inputValue, throwsStateError);
+  }
+
+  test_inputValue_beforeMoveNext() {
+    expect(() => builder.inputValue, throwsStateError);
+  }
+
+  test_moveNext_withoutSet() {
+    expect(builder.moveNext(), true);
+    expect(() => builder.moveNext(), throwsStateError);
+  }
+
+  test_moveNext_withSet() {
+    expect(builder.moveNext(), true);
+    builder.currentValue = 'value';
+    expect(builder.moveNext(), false);
+    expect(builder.moveNext(), false);
+  }
+}
+
+@reflectiveTest
+class SimpleTaskInputTest extends EngineTestCase {
+  static final AnalysisTarget target = new TestSource();
+  static final ResultDescriptorImpl result =
+      new ResultDescriptorImpl('result', null);
+
+  test_create() {
+    SimpleTaskInput input = new SimpleTaskInput(target, result);
+    expect(input, isNotNull);
+    expect(input.target, target);
+    expect(input.result, result);
+  }
+
+  test_createBuilder() {
+    SimpleTaskInput input = new SimpleTaskInput(target, result);
+    expect(input.createBuilder(), new isInstanceOf<SimpleTaskInputBuilder>());
+  }
+}
+
+@reflectiveTest
+class TopLevelTaskInputBuilderTest extends EngineTestCase {
+  static final AnalysisTarget target = new TestSource();
+  static final ResultDescriptorImpl result1 =
+      new ResultDescriptorImpl('result1', null);
+  static final ResultDescriptorImpl result2 =
+      new ResultDescriptorImpl('result2', null);
+  static final SimpleTaskInput input1 = new SimpleTaskInput(target, result1);
+  static final SimpleTaskInput input2 = new SimpleTaskInput(target, result2);
+
+  test_create() {
+    Map<String, TaskInput> inputDescriptors = {};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    expect(builder, isNotNull);
+    expect(builder.inputDescriptors, inputDescriptors);
+  }
+
+  test_currentResult_afterComplete() {
+    Map<String, TaskInput> inputDescriptors = {'one': input1};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    builder.moveNext();
+    builder.currentValue = 'value1';
+    builder.moveNext();
+    expect(builder.currentResult, null);
+  }
+
+  test_currentResult_afterCurrentValueNotAvailable() {
+    Map<String, TaskInput> inputDescriptors = {'one': input1};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    builder.moveNext();
+    builder.currentValueNotAvailable();
+    builder.moveNext();
+    expect(builder.currentResult, null);
+  }
+
+  test_currentResult_afterOneMoveNext() {
+    Map<String, TaskInput> inputDescriptors = {'one': input1, 'two': input2};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    builder.moveNext();
+    expect(builder.currentResult, result1);
+  }
+
+  test_currentResult_beforeMoveNext() {
+    Map<String, TaskInput> inputDescriptors = {};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    expect(builder.currentResult, null);
+  }
+
+  test_currentTarget_afterComplete() {
+    Map<String, TaskInput> inputDescriptors = {'one': input1};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    builder.moveNext();
+    builder.currentValue = 'value1';
+    builder.moveNext();
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentTarget_afterCurrentValueNotAvailable() {
+    Map<String, TaskInput> inputDescriptors = {'one': input1};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    builder.moveNext();
+    builder.currentValueNotAvailable();
+    builder.moveNext();
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentTarget_afterOneMoveNext() {
+    Map<String, TaskInput> inputDescriptors = {'one': input1};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    builder.moveNext();
+    expect(builder.currentTarget, target);
+  }
+
+  test_currentTarget_beforeMoveNext() {
+    Map<String, TaskInput> inputDescriptors = {};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    expect(builder.currentTarget, null);
+  }
+
+  test_currentValue_afterOneMoveNext() {
+    Map<String, TaskInput> inputDescriptors = {'one': input1};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    builder.moveNext();
+    builder.currentValue = 'value1';
+  }
+
+  test_currentValue_beforeMoveNext() {
+    Map<String, TaskInput> inputDescriptors = {'one': input1};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    expect(() {
+      builder.currentValue = 'value1';
+    }, throwsStateError);
+  }
+
+  test_currentValueNotAvailable_afterOneMoveNext() {
+    Map<String, TaskInput> inputDescriptors = {'one': input1};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    builder.moveNext();
+    builder.currentValueNotAvailable();
+  }
+
+  test_currentValueNotAvailable_beforeMoveNext() {
+    Map<String, TaskInput> inputDescriptors = {'one': input1};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    expect(() {
+      builder.currentValueNotAvailable();
+    }, throwsStateError);
+  }
+
+  test_inputValue_afterComplete() {
+    String key1 = 'one';
+    String key2 = 'two';
+    String value1 = 'value1';
+    String value2 = 'value2';
+    Map<String, TaskInput> inputDescriptors = {key1: input1, key2: input2};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    builder.moveNext(); // Advance to requesting result1 for target
+    builder.currentValue = value1;
+    builder.moveNext(); // Advance to requesting result2 for target
+    builder.currentValue = value2;
+    builder.moveNext(); // Advance to the end
+    var inputValue = builder.inputValue;
+    expect(inputValue, new isInstanceOf<Map>());
+    Map inputs = inputValue;
+    expect(inputs.length, 2);
+    expect(inputs, containsPair(key1, value1));
+    expect(inputs, containsPair(key2, value2));
+  }
+
+  test_inputValue_afterOneMoveNext() {
+    Map<String, TaskInput> inputDescriptors = {'one': input1};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    builder.moveNext();
+    expect(() => builder.inputValue, throwsStateError);
+  }
+
+  test_inputValue_afterOneValueNotAvailable() {
+    String key1 = 'one';
+    String key2 = 'two';
+    String value2 = 'value2';
+    Map<String, TaskInput> inputDescriptors = {key1: input1, key2: input2};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    builder.moveNext(); // Advance to requesting result1 for target
+    builder.currentValueNotAvailable();
+    builder.moveNext(); // Advance to requesting result2 for target
+    builder.currentValue = value2;
+    builder.moveNext(); // Advance to the end
+    var inputValue = builder.inputValue;
+    expect(inputValue, new isInstanceOf<Map>());
+    Map inputs = inputValue;
+    expect(inputs, hasLength(1));
+    expect(inputs, containsPair(key2, value2));
+  }
+
+  test_inputValue_beforeMoveNext() {
+    Map<String, TaskInput> inputDescriptors = {};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    expect(() => builder.inputValue, throwsStateError);
+  }
+
+  test_moveNext_withoutSet() {
+    Map<String, TaskInput> inputDescriptors = {'one': input1};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    expect(builder.moveNext(), true);
+    expect(() => builder.moveNext(), throwsStateError);
+  }
+
+  test_moveNext_withSet() {
+    Map<String, TaskInput> inputDescriptors = {'one': input1};
+    TopLevelTaskInputBuilder builder =
+        new TopLevelTaskInputBuilder(inputDescriptors);
+    expect(builder.moveNext(), true);
+    builder.currentValue = 'value1';
+    expect(builder.moveNext(), false);
+    expect(builder.moveNext(), false);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/task/manager_test.dart b/mojo/public/dart/third_party/analyzer/test/src/task/manager_test.dart
new file mode 100644
index 0000000..783c015
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/task/manager_test.dart
@@ -0,0 +1,132 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.task.manager_test;
+
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/task/manager.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../generated/test_support.dart';
+import '../../reflective_tests.dart';
+import '../../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(TaskManagerTest);
+}
+
+@reflectiveTest
+class TaskManagerTest extends EngineTestCase {
+  static final ResultDescriptor result1 = new ResultDescriptor('result1', null);
+  static final ResultDescriptor result2 = new ResultDescriptor('result2', null);
+
+  test_addGeneralResult() {
+    TaskManager manager = new TaskManager();
+    manager.addGeneralResult(result1);
+    Set<ResultDescriptor> results = manager.generalResults;
+    expect(results, unorderedEquals([result1]));
+  }
+
+  test_addPriorityResult() {
+    TaskManager manager = new TaskManager();
+    manager.addPriorityResult(result1);
+    Set<ResultDescriptor> results = manager.priorityResults;
+    expect(results, unorderedEquals([result1]));
+  }
+
+  test_addTaskDescriptor() {
+    TaskManager manager = new TaskManager();
+    TaskDescriptor descriptor =
+        new TaskDescriptor('task', null, null, [result1]);
+    manager.addTaskDescriptor(descriptor);
+    expect(manager.taskMap.length, 1);
+  }
+
+  test_constructor() {
+    TaskManager manager = new TaskManager();
+    expect(manager, isNotNull);
+    expect(manager.generalResults, isEmpty);
+    expect(manager.priorityResults, isEmpty);
+  }
+
+  test_findTask_defined() {
+    TaskManager manager = new TaskManager();
+    TaskDescriptor descriptor =
+        new TaskDescriptor('task', null, null, [result1]);
+    manager.addTaskDescriptor(descriptor);
+    AnalysisTarget target = new TestSource();
+    expect(manager.findTask(target, result1), descriptor);
+  }
+
+  test_findTask_empty() {
+    TaskManager manager = new TaskManager();
+    AnalysisTarget target = new TestSource();
+    expect(() => manager.findTask(target, result1),
+        throwsA(new isInstanceOf<AnalysisException>()));
+  }
+
+  test_findTask_multiple() {
+    TaskManager manager = new TaskManager();
+    TaskDescriptor descriptor1 =
+        new TaskDescriptor('task1', null, null, [result1]);
+    manager.addTaskDescriptor(descriptor1);
+    TaskDescriptor descriptor2 =
+        new TaskDescriptor('task2', null, null, [result1]);
+    manager.addTaskDescriptor(descriptor2);
+    TaskDescriptor descriptor3 =
+        new TaskDescriptor('task3', null, null, [result2]);
+    manager.addTaskDescriptor(descriptor3);
+
+    AnalysisTarget target = new TestSource();
+    TaskDescriptor task = manager.findTask(target, result1);
+    expect(task == descriptor1 || task == descriptor2, true);
+  }
+
+  test_findTask_undefined() {
+    TaskManager manager = new TaskManager();
+    TaskDescriptor descriptor =
+        new TaskDescriptor('task', null, null, [result1]);
+    manager.addTaskDescriptor(descriptor);
+    AnalysisTarget target = new TestSource();
+    expect(() => manager.findTask(target, result2),
+        throwsA(new isInstanceOf<AnalysisException>()));
+  }
+
+  test_removeGeneralResult_absent() {
+    TaskManager manager = new TaskManager();
+    manager.addGeneralResult(result1);
+    Set<ResultDescriptor> results = manager.generalResults;
+    expect(results, unorderedEquals([result1]));
+  }
+
+  test_removeGeneralResult_present() {
+    TaskManager manager = new TaskManager();
+    manager.addGeneralResult(result1);
+    manager.addGeneralResult(result2);
+    Set<ResultDescriptor> results = manager.generalResults;
+    expect(results, unorderedEquals([result1, result2]));
+    manager.removeGeneralResult(result1);
+    expect(results, unorderedEquals([result2]));
+  }
+
+  test_removePriorityResult_absent() {
+    TaskManager manager = new TaskManager();
+    manager.addPriorityResult(result1);
+    manager.removePriorityResult(result2);
+    Set<ResultDescriptor> results = manager.priorityResults;
+    expect(results, unorderedEquals([result1]));
+  }
+
+  test_removePriorityResult_present() {
+    TaskManager manager = new TaskManager();
+    manager.addPriorityResult(result1);
+    manager.addPriorityResult(result2);
+    Set<ResultDescriptor> results = manager.priorityResults;
+    expect(results, unorderedEquals([result1, result2]));
+    manager.removePriorityResult(result1);
+    expect(results, unorderedEquals([result2]));
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/task/model_test.dart b/mojo/public/dart/third_party/analyzer/test/src/task/model_test.dart
new file mode 100644
index 0000000..00cdcfa
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/task/model_test.dart
@@ -0,0 +1,136 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.task.model_test;
+
+import 'package:analyzer/src/generated/engine.dart' hide AnalysisTask;
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/task/model.dart';
+import 'package:analyzer/task/model.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../generated/test_support.dart';
+import '../../reflective_tests.dart';
+import '../../utils.dart';
+import 'test_support.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(AnalysisTaskTest);
+  runReflectiveTests(ResultDescriptorImplTest);
+  runReflectiveTests(SimpleResultCachingPolicyTest);
+  runReflectiveTests(TaskDescriptorImplTest);
+}
+
+@reflectiveTest
+class AnalysisTaskTest extends EngineTestCase {
+  test_getRequiredInput_missingKey() {
+    AnalysisTarget target = new TestSource();
+    AnalysisTask task = new TestAnalysisTask(null, target);
+    task.inputs = {'a': 'b'};
+    expect(() => task.getRequiredInput('c'),
+        throwsA(new isInstanceOf<AnalysisException>()));
+  }
+
+  test_getRequiredInput_noInputs() {
+    AnalysisTarget target = new TestSource();
+    AnalysisTask task = new TestAnalysisTask(null, target);
+    expect(() => task.getRequiredInput('x'),
+        throwsA(new isInstanceOf<AnalysisException>()));
+  }
+
+  test_getRequiredInput_valid() {
+    AnalysisTarget target = new TestSource();
+    AnalysisTask task = new TestAnalysisTask(null, target);
+    String key = 'a';
+    String value = 'b';
+    task.inputs = {key: value};
+    expect(task.getRequiredInput(key), value);
+  }
+
+  test_getRequiredSource() {
+    AnalysisTarget target = new TestSource();
+    AnalysisTask task = new TestAnalysisTask(null, target);
+    expect(task.getRequiredSource(), target);
+  }
+}
+
+@reflectiveTest
+class ResultDescriptorImplTest extends EngineTestCase {
+  test_create_withCachingPolicy() {
+    ResultCachingPolicy policy = new SimpleResultCachingPolicy(128, 16);
+    ResultDescriptorImpl result =
+        new ResultDescriptorImpl('result', null, cachingPolicy: policy);
+    expect(result.cachingPolicy, same(policy));
+  }
+
+  test_create_withoutCachingPolicy() {
+    ResultDescriptorImpl result = new ResultDescriptorImpl('result', null);
+    ResultCachingPolicy cachingPolicy = result.cachingPolicy;
+    expect(cachingPolicy, isNotNull);
+    expect(cachingPolicy.maxActiveSize, -1);
+    expect(cachingPolicy.maxIdleSize, -1);
+  }
+
+  test_create_withoutContribution() {
+    expect(new ResultDescriptorImpl('name', null), isNotNull);
+  }
+
+  test_inputFor() {
+    AnalysisTarget target = new TestSource();
+    ResultDescriptorImpl result = new ResultDescriptorImpl('result', null);
+    TaskInput input = result.of(target);
+    expect(input, isNotNull);
+  }
+
+  test_name() {
+    String name = 'result';
+    ResultDescriptorImpl result = new ResultDescriptorImpl(name, null);
+    expect(result.name, name);
+  }
+}
+
+@reflectiveTest
+class SimpleResultCachingPolicyTest extends EngineTestCase {
+  test_create() {
+    ResultCachingPolicy policy = new SimpleResultCachingPolicy(256, 32);
+    expect(policy.maxActiveSize, 256);
+    expect(policy.maxIdleSize, 32);
+    expect(policy.measure(null), 1);
+  }
+}
+
+@reflectiveTest
+class TaskDescriptorImplTest extends EngineTestCase {
+  test_create() {
+    String name = 'name';
+    BuildTask buildTask = (context, target) {};
+    CreateTaskInputs createTaskInputs = (target) {};
+    List<ResultDescriptor> results = <ResultDescriptor>[];
+    TaskDescriptorImpl descriptor =
+        new TaskDescriptorImpl(name, buildTask, createTaskInputs, results);
+    expect(descriptor, isNotNull);
+    expect(descriptor.name, name);
+    expect(descriptor.buildTask, equals(buildTask));
+    expect(descriptor.createTaskInputs, equals(createTaskInputs));
+    expect(descriptor.results, results);
+  }
+
+  test_createTask() {
+    BuildTask buildTask = (context, target) =>
+        new TestAnalysisTask(context, target);
+    CreateTaskInputs createTaskInputs = (target) {};
+    List<ResultDescriptor> results = <ResultDescriptor>[];
+    TaskDescriptorImpl descriptor =
+        new TaskDescriptorImpl('name', buildTask, createTaskInputs, results);
+    AnalysisContext context = null;
+    AnalysisTarget target = new TestSource();
+    Map<String, dynamic> inputs = {};
+    AnalysisTask createTask = descriptor.createTask(context, target, inputs);
+    expect(createTask, isNotNull);
+    expect(createTask.context, context);
+    expect(createTask.inputs, inputs);
+    expect(createTask.target, target);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/task/strong_mode_test.dart b/mojo/public/dart/third_party/analyzer/test/src/task/strong_mode_test.dart
new file mode 100644
index 0000000..6d9b3f9
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/task/strong_mode_test.dart
@@ -0,0 +1,954 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.task.strong_mode_test;
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/task/dart.dart';
+import 'package:analyzer/src/task/strong_mode.dart';
+import 'package:analyzer/task/dart.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+import '../../utils.dart';
+import '../context/abstract_context.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(InferrenceFinderTest);
+  runReflectiveTests(InstanceMemberInferrerTest);
+  runReflectiveTests(VariableGathererTest);
+}
+
+@reflectiveTest
+class InferrenceFinderTest extends AbstractContextTest {
+  void test_creation() {
+    InferrenceFinder finder = new InferrenceFinder();
+    expect(finder, isNotNull);
+    expect(finder.classes, isEmpty);
+    expect(finder.staticVariables, isEmpty);
+  }
+
+  void test_visit() {
+    Source source = addSource(
+        '/test.dart',
+        r'''
+const c = 1;
+final f = '';
+var v = const A();
+int i;
+class A {
+  static final fa = 0;
+  static int fi;
+  const A();
+}
+class B extends A {
+  static const cb = 1;
+  static vb = 0;
+  const ci = 2;
+  final fi = '';
+  var vi;
+}
+class C = Object with A;
+typedef int F(int x);
+''');
+    LibrarySpecificUnit librarySpecificUnit =
+        new LibrarySpecificUnit(source, source);
+    computeResult(librarySpecificUnit, RESOLVED_UNIT5);
+    CompilationUnit unit = outputs[RESOLVED_UNIT5];
+    InferrenceFinder finder = new InferrenceFinder();
+    unit.accept(finder);
+    expect(finder.classes, hasLength(3));
+    expect(finder.staticVariables, hasLength(6));
+  }
+}
+
+@reflectiveTest
+class InstanceMemberInferrerTest extends AbstractContextTest {
+  InstanceMemberInferrer get createInferrer =>
+      new InstanceMemberInferrer(context.typeProvider);
+
+  /**
+   * Add a source with the given [content] and return the result of resolving
+   * the source.
+   */
+  CompilationUnitElement resolve(String content) {
+    Source source = addSource('/test.dart', content);
+    return context.resolveCompilationUnit2(source, source).element;
+  }
+
+  void test_creation() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    expect(inferrer, isNotNull);
+    expect(inferrer.typeSystem, isNotNull);
+  }
+
+  void test_inferCompilationUnit_field_multiple_different() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String fieldName = 'f';
+    CompilationUnitElement unit = resolve('''
+class A {
+  int $fieldName;
+}
+class B {
+  double $fieldName;
+}
+class C implements A, B {
+  var $fieldName;
+}
+''');
+    ClassElement classC = unit.getType('C');
+    FieldElement fieldC = classC.getField(fieldName);
+    PropertyAccessorElement getterC = classC.getGetter(fieldName);
+    expect(fieldC.type.isDynamic, isTrue);
+    expect(getterC.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(fieldC.type.isDynamic, isTrue);
+    expect(getterC.returnType.isDynamic, isTrue);
+  }
+
+  void test_inferCompilationUnit_field_multiple_different_generic() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String fieldName = 'f';
+    CompilationUnitElement unit = resolve('''
+class A<E> {
+  E $fieldName;
+}
+class B<E> {
+  E $fieldName;
+}
+class C implements A<int>, B<double> {
+  var $fieldName;
+}
+''');
+    ClassElement classC = unit.getType('C');
+    FieldElement fieldC = classC.getField(fieldName);
+    PropertyAccessorElement getterC = classC.getGetter(fieldName);
+    expect(fieldC.type.isDynamic, isTrue);
+    expect(getterC.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(fieldC.type.isDynamic, isTrue);
+    expect(getterC.returnType.isDynamic, isTrue);
+  }
+
+  void test_inferCompilationUnit_field_multiple_dynamic() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String fieldName = 'f';
+    CompilationUnitElement unit = resolve('''
+class A {
+  int $fieldName;
+}
+class B {
+  var $fieldName;
+}
+class C implements A, B {
+  var $fieldName;
+}
+''');
+    ClassElement classC = unit.getType('C');
+    FieldElement fieldC = classC.getField(fieldName);
+    PropertyAccessorElement getterC = classC.getGetter(fieldName);
+    expect(fieldC.type.isDynamic, isTrue);
+    expect(getterC.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(fieldC.type.isDynamic, isTrue);
+    expect(getterC.returnType.isDynamic, isTrue);
+  }
+
+  void test_inferCompilationUnit_field_multiple_same() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String fieldName = 'f';
+    CompilationUnitElement unit = resolve('''
+class A {
+  int $fieldName;
+}
+class B {
+  int $fieldName;
+}
+class C implements A, B {
+  var $fieldName;
+}
+''');
+    ClassElement classA = unit.getType('A');
+    FieldElement fieldA = classA.getField(fieldName);
+    DartType expectedType = fieldA.type;
+    ClassElement classC = unit.getType('C');
+    FieldElement fieldC = classC.getField(fieldName);
+    PropertyAccessorElement getterC = classC.getGetter(fieldName);
+    expect(fieldC.type.isDynamic, isTrue);
+    expect(getterC.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(fieldC.type, expectedType);
+    expect(getterC.returnType, expectedType);
+  }
+
+  void test_inferCompilationUnit_field_noOverride() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String fieldName = 'f';
+    CompilationUnitElement unit = resolve('''
+class A {
+  final $fieldName = 0;
+}
+''');
+    ClassElement classA = unit.getType('A');
+    FieldElement fieldA = classA.getField(fieldName);
+    PropertyAccessorElement getterA = classA.getGetter(fieldName);
+    expect(fieldA.type.isDynamic, isTrue);
+    expect(getterA.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    DartType intType = inferrer.typeProvider.intType;
+    expect(fieldA.type, intType);
+    expect(getterA.returnType, intType);
+  }
+
+  void test_inferCompilationUnit_field_noOverride_bottom() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String fieldName = 'f';
+    CompilationUnitElement unit = resolve('''
+class A {
+  var $fieldName = null;
+}
+''');
+    ClassElement classA = unit.getType('A');
+    FieldElement fieldA = classA.getField(fieldName);
+    PropertyAccessorElement getterA = classA.getGetter(fieldName);
+    expect(fieldA.type.isDynamic, isTrue);
+    expect(getterA.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(fieldA.type.isDynamic, isTrue);
+    expect(getterA.returnType.isDynamic, isTrue);
+  }
+
+  void test_inferCompilationUnit_field_single_explicitlyDynamic() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String fieldName = 'f';
+    CompilationUnitElement unit = resolve('''
+class A {
+  dynamic $fieldName;
+}
+class B extends A {
+  var $fieldName = 0;
+}
+''');
+    ClassElement classA = unit.getType('A');
+    FieldElement fieldA = classA.getField(fieldName);
+    PropertyAccessorElement getterA = classA.getGetter(fieldName);
+    ClassElement classB = unit.getType('B');
+    FieldElement fieldB = classB.getField(fieldName);
+    PropertyAccessorElement getterB = classB.getGetter(fieldName);
+    expect(fieldB.type.isDynamic, isTrue);
+    expect(getterB.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(fieldB.type, fieldA.type);
+    expect(getterB.returnType, getterA.returnType);
+  }
+
+  void test_inferCompilationUnit_field_single_final() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String fieldName = 'f';
+    CompilationUnitElement unit = resolve('''
+class A {
+  final int $fieldName;
+}
+class B extends A {
+  final $fieldName;
+}
+''');
+    ClassElement classA = unit.getType('A');
+    FieldElement fieldA = classA.getField(fieldName);
+    PropertyAccessorElement getterA = classA.getGetter(fieldName);
+    ClassElement classB = unit.getType('B');
+    FieldElement fieldB = classB.getField(fieldName);
+    PropertyAccessorElement getterB = classB.getGetter(fieldName);
+    expect(fieldB.type.isDynamic, isTrue);
+    expect(getterB.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(fieldB.type, fieldA.type);
+    expect(getterB.returnType, getterA.returnType);
+  }
+
+  void test_inferCompilationUnit_field_single_generic() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String fieldName = 'f';
+    CompilationUnitElement unit = resolve('''
+class A<E> {
+  E $fieldName;
+}
+class B<E> extends A<E> {
+  var $fieldName;
+}
+''');
+    ClassElement classB = unit.getType('B');
+    DartType typeBE = classB.typeParameters[0].type;
+    FieldElement fieldB = classB.getField(fieldName);
+    PropertyAccessorElement getterB = classB.getGetter(fieldName);
+    expect(fieldB.type.isDynamic, isTrue);
+    expect(getterB.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(fieldB.type, typeBE);
+    expect(getterB.returnType, typeBE);
+  }
+
+  void test_inferCompilationUnit_field_single_inconsistentAccessors() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String fieldName = 'f';
+    CompilationUnitElement unit = resolve('''
+class A {
+  int get $fieldName => 0;
+  set $fieldName(String value) {}
+}
+class B extends A {
+  var $fieldName;
+}
+''');
+    ClassElement classB = unit.getType('B');
+    FieldElement fieldB = classB.getField(fieldName);
+    PropertyAccessorElement getterB = classB.getGetter(fieldName);
+    expect(fieldB.type.isDynamic, isTrue);
+    expect(getterB.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(fieldB.type.isDynamic, isTrue);
+    expect(getterB.returnType.isDynamic, isTrue);
+  }
+
+  void test_inferCompilationUnit_field_single_noModifiers() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String fieldName = 'f';
+    CompilationUnitElement unit = resolve('''
+class A {
+  int $fieldName;
+}
+class B extends A {
+  var $fieldName;
+}
+''');
+    ClassElement classA = unit.getType('A');
+    FieldElement fieldA = classA.getField(fieldName);
+    PropertyAccessorElement getterA = classA.getGetter(fieldName);
+    ClassElement classB = unit.getType('B');
+    FieldElement fieldB = classB.getField(fieldName);
+    PropertyAccessorElement getterB = classB.getGetter(fieldName);
+    expect(fieldB.type.isDynamic, isTrue);
+    expect(getterB.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(fieldB.type, fieldA.type);
+    expect(getterB.returnType, getterA.returnType);
+  }
+
+  void test_inferCompilationUnit_getter_multiple_different() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String getterName = 'g';
+    CompilationUnitElement unit = resolve('''
+class A {
+  int get $getterName => 0;
+}
+class B {
+  double get $getterName => 0.0;
+}
+class C implements A, B {
+  get $getterName => 0;
+}
+''');
+    ClassElement classC = unit.getType('C');
+    FieldElement fieldC = classC.getField(getterName);
+    PropertyAccessorElement getterC = classC.getGetter(getterName);
+    expect(fieldC.type.isDynamic, isTrue);
+    expect(getterC.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(fieldC.type.isDynamic, isTrue);
+    expect(getterC.returnType.isDynamic, isTrue);
+  }
+
+  void test_inferCompilationUnit_getter_multiple_dynamic() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String getterName = 'g';
+    CompilationUnitElement unit = resolve('''
+class A {
+  int get $getterName => 0;
+}
+class B {
+  get $getterName => 0;
+}
+class C implements A, B {
+  get $getterName => 0;
+}
+''');
+    ClassElement classC = unit.getType('C');
+    FieldElement fieldC = classC.getField(getterName);
+    PropertyAccessorElement getterC = classC.getGetter(getterName);
+    expect(fieldC.type.isDynamic, isTrue);
+    expect(getterC.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(fieldC.type.isDynamic, isTrue);
+    expect(getterC.returnType.isDynamic, isTrue);
+  }
+
+  void test_inferCompilationUnit_getter_multiple_same() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String getterName = 'g';
+    CompilationUnitElement unit = resolve('''
+class A {
+  String get $getterName => '';
+}
+class B {
+  String get $getterName => '';
+}
+class C implements A, B {
+  get $getterName => '';
+}
+''');
+    ClassElement classA = unit.getType('A');
+    PropertyAccessorElement getterA = classA.getGetter(getterName);
+    DartType expectedType = getterA.returnType;
+    ClassElement classC = unit.getType('C');
+    FieldElement fieldC = classC.getField(getterName);
+    PropertyAccessorElement getterC = classC.getGetter(getterName);
+    expect(fieldC.type.isDynamic, isTrue);
+    expect(getterC.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(fieldC.type, expectedType);
+    expect(getterC.returnType, expectedType);
+  }
+
+  void test_inferCompilationUnit_getter_single() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String getterName = 'g';
+    CompilationUnitElement unit = resolve('''
+class A {
+  int get $getterName => 0;
+}
+class B extends A {
+  get $getterName => 0;
+}
+''');
+    ClassElement classA = unit.getType('A');
+    FieldElement fieldA = classA.getField(getterName);
+    PropertyAccessorElement getterA = classA.getGetter(getterName);
+    ClassElement classB = unit.getType('B');
+    FieldElement fieldB = classB.getField(getterName);
+    PropertyAccessorElement getterB = classB.getGetter(getterName);
+    expect(fieldB.type.isDynamic, isTrue);
+    expect(getterB.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(fieldB.type, fieldA.type);
+    expect(getterB.returnType, getterA.returnType);
+  }
+
+  void test_inferCompilationUnit_getter_single_generic() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String getterName = 'g';
+    CompilationUnitElement unit = resolve('''
+class A<E> {
+  E get $getterName => 0;
+}
+class B<E> extends A<E> {
+  get $getterName => 0;
+}
+''');
+    ClassElement classB = unit.getType('B');
+    DartType typeBE = classB.typeParameters[0].type;
+    FieldElement fieldB = classB.getField(getterName);
+    PropertyAccessorElement getterB = classB.getGetter(getterName);
+    expect(fieldB.type.isDynamic, isTrue);
+    expect(getterB.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(fieldB.type, typeBE);
+    expect(getterB.returnType, typeBE);
+  }
+
+  void test_inferCompilationUnit_getter_single_inconsistentAccessors() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String getterName = 'g';
+    CompilationUnitElement unit = resolve('''
+class A {
+  int get $getterName => 0;
+  set $getterName(String value) {}
+}
+class B extends A {
+  var get $getterName => 1;
+}
+''');
+    ClassElement classB = unit.getType('B');
+    FieldElement fieldB = classB.getField(getterName);
+    PropertyAccessorElement getterB = classB.getGetter(getterName);
+    expect(fieldB.type.isDynamic, isTrue);
+    expect(getterB.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(fieldB.type.isDynamic, isTrue);
+    expect(getterB.returnType.isDynamic, isTrue);
+  }
+
+  void test_inferCompilationUnit_invalid_inheritanceCycle() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    CompilationUnitElement unit = resolve('''
+class A extends C {}
+class B extends A {}
+class C extends B {}
+''');
+    inferrer.inferCompilationUnit(unit);
+  }
+
+  void test_inferCompilationUnit_method_parameter_multiple_different() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String methodName = 'm';
+    CompilationUnitElement unit = resolve('''
+class A {
+  $methodName(int p) => 0;
+}
+class B {
+  $methodName(double p) => 0;
+}
+class C implements A, B {
+  $methodName(p) => 0;
+}
+''');
+    ClassElement classC = unit.getType('C');
+    MethodElement methodC = classC.getMethod(methodName);
+    ParameterElement parameterC = methodC.parameters[0];
+    expect(parameterC.type.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(parameterC.type.isDynamic, isTrue);
+  }
+
+  void test_inferCompilationUnit_method_parameter_multiple_named_different() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String methodName = 'm';
+    CompilationUnitElement unit = resolve('''
+class A {
+  $methodName({int p}) => 0;
+}
+class B {
+  $methodName({int q}) => 0;
+}
+class C implements A, B {
+  $methodName({p}) => 0;
+}
+''');
+    ClassElement classC = unit.getType('C');
+    MethodElement methodC = classC.getMethod(methodName);
+    ParameterElement parameterC = methodC.parameters[0];
+    expect(parameterC.type.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(parameterC.type.isDynamic, isTrue);
+  }
+
+  void test_inferCompilationUnit_method_parameter_multiple_named_same() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String methodName = 'm';
+    CompilationUnitElement unit = resolve('''
+class A {
+  $methodName({int p}) => 0;
+}
+class B {
+  $methodName({int p}) => 0;
+}
+class C implements A, B {
+  $methodName({p}) => 0;
+}
+''');
+    ClassElement classA = unit.getType('A');
+    MethodElement methodA = classA.getMethod(methodName);
+    ParameterElement parameterA = methodA.parameters[0];
+    DartType expectedType = parameterA.type;
+    ClassElement classC = unit.getType('C');
+    MethodElement methodC = classC.getMethod(methodName);
+    ParameterElement parameterC = methodC.parameters[0];
+    expect(parameterC.type.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(parameterC.type, expectedType);
+  }
+
+  void test_inferCompilationUnit_method_parameter_multiple_namedAndRequired() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String methodName = 'm';
+    CompilationUnitElement unit = resolve('''
+class A {
+  $methodName({int p}) => 0;
+}
+class B {
+  $methodName(int p) => 0;
+}
+class C implements A, B {
+  $methodName(p) => 0;
+}
+''');
+    ClassElement classC = unit.getType('C');
+    MethodElement methodC = classC.getMethod(methodName);
+    ParameterElement parameterC = methodC.parameters[0];
+    expect(parameterC.type.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(parameterC.type.isDynamic, isTrue);
+  }
+
+  void test_inferCompilationUnit_method_parameter_multiple_optionalAndRequired() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String methodName = 'm';
+    CompilationUnitElement unit = resolve('''
+class A {
+  $methodName(int p) => 0;
+}
+class B {
+  $methodName([int p]) => 0;
+}
+class C implements A, B {
+  $methodName(p) => 0;
+}
+''');
+    ClassElement classA = unit.getType('A');
+    MethodElement methodA = classA.getMethod(methodName);
+    ParameterElement parameterA = methodA.parameters[0];
+    DartType expectedType = parameterA.type;
+    ClassElement classC = unit.getType('C');
+    MethodElement methodC = classC.getMethod(methodName);
+    ParameterElement parameterC = methodC.parameters[0];
+    expect(parameterC.type.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(parameterC.type, expectedType);
+  }
+
+  void test_inferCompilationUnit_method_parameter_single_generic() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String methodName = 'm';
+    CompilationUnitElement unit = resolve('''
+class A<E> {
+  $methodName(E p) => 0;
+}
+class C<E> implements A<E> {
+  $methodName(p) => 0;
+}
+''');
+    ClassElement classC = unit.getType('C');
+    MethodElement methodC = classC.getMethod(methodName);
+    ParameterElement parameterC = methodC.parameters[0];
+    expect(parameterC.type.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(parameterC.type, classC.typeParameters[0].type);
+  }
+
+  void test_inferCompilationUnit_method_return_multiple_different() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String methodName = 'm';
+    CompilationUnitElement unit = resolve('''
+class A {
+  int $methodName() => 0;
+}
+class B {
+  double $methodName() => 0.0;
+}
+class C implements A, B {
+  $methodName() => 0;
+}
+''');
+    ClassElement classC = unit.getType('C');
+    MethodElement methodC = classC.getMethod(methodName);
+    expect(methodC.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(methodC.returnType.isDynamic, isTrue);
+  }
+
+  void test_inferCompilationUnit_method_return_multiple_different_generic() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String methodName = 'm';
+    CompilationUnitElement unit = resolve('''
+class A<E> {
+  E $methodName() => null;
+}
+class B<E> {
+  E $methodName() => null;
+}
+class C implements A<int>, B<double> {
+  $methodName() => null;
+}
+''');
+    ClassElement classC = unit.getType('C');
+    MethodElement methodC = classC.getMethod(methodName);
+    expect(methodC.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(methodC.returnType.isDynamic, isTrue);
+  }
+
+  void test_inferCompilationUnit_method_return_multiple_dynamic() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String methodName = 'm';
+    CompilationUnitElement unit = resolve('''
+class A {
+  int $methodName() => 0;
+}
+class B {
+  $methodName() => 0;
+}
+class C implements A, B {
+  $methodName() => 0;
+}
+''');
+    ClassElement classC = unit.getType('C');
+    MethodElement methodC = classC.getMethod(methodName);
+    expect(methodC.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(methodC.returnType.isDynamic, isTrue);
+  }
+
+  void test_inferCompilationUnit_method_return_multiple_same_generic() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String methodName = 'm';
+    CompilationUnitElement unit = resolve('''
+class A<E> {
+  E $methodName() => 0;
+}
+class B<E> {
+  E $methodName() => 0;
+}
+class C<E> implements A<E>, B<E> {
+  $methodName() => 0;
+}
+''');
+    ClassElement classC = unit.getType('C');
+    MethodElement methodC = classC.getMethod(methodName);
+    expect(methodC.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(methodC.returnType, classC.typeParameters[0].type);
+  }
+
+  void test_inferCompilationUnit_method_return_multiple_same_nonVoid() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String methodName = 'm';
+    CompilationUnitElement unit = resolve('''
+class A {
+  int $methodName() => 0;
+}
+class B {
+  int $methodName() => 0;
+}
+class C implements A, B {
+  $methodName() => 0;
+}
+''');
+    ClassElement classA = unit.getType('A');
+    MethodElement methodA = classA.getMethod(methodName);
+    DartType expectedType = methodA.returnType;
+    ClassElement classC = unit.getType('C');
+    MethodElement methodC = classC.getMethod(methodName);
+    expect(methodC.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(methodC.returnType, expectedType);
+  }
+
+  void test_inferCompilationUnit_method_return_multiple_same_void() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String methodName = 'm';
+    CompilationUnitElement unit = resolve('''
+class A {
+  void $methodName() {};
+}
+class B {
+  void $methodName() {};
+}
+class C implements A, B {
+  $methodName() {};
+}
+''');
+    ClassElement classA = unit.getType('A');
+    MethodElement methodA = classA.getMethod(methodName);
+    DartType expectedType = methodA.returnType;
+    ClassElement classC = unit.getType('C');
+    MethodElement methodC = classC.getMethod(methodName);
+    expect(methodC.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(methodC.returnType, expectedType);
+  }
+
+  void test_inferCompilationUnit_method_return_multiple_void() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String methodName = 'm';
+    CompilationUnitElement unit = resolve('''
+class A {
+  int $methodName() => 0;
+}
+class B {
+  void $methodName() => 0;
+}
+class C implements A, B {
+  $methodName() => 0;
+}
+''');
+    ClassElement classC = unit.getType('C');
+    MethodElement methodC = classC.getMethod(methodName);
+    expect(methodC.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(methodC.returnType.isDynamic, isTrue);
+  }
+
+  void test_inferCompilationUnit_method_return_single() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String methodName = 'm';
+    CompilationUnitElement unit = resolve('''
+class A {
+  int $methodName() => 0;
+}
+class B extends A {
+  $methodName() => 0;
+}
+''');
+    ClassElement classA = unit.getType('A');
+    MethodElement methodA = classA.getMethod(methodName);
+    ClassElement classB = unit.getType('B');
+    MethodElement methodB = classB.getMethod(methodName);
+    expect(methodB.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(methodB.returnType, methodA.returnType);
+  }
+
+  void test_inferCompilationUnit_method_return_single_generic() {
+    InstanceMemberInferrer inferrer = createInferrer;
+    String methodName = 'm';
+    CompilationUnitElement unit = resolve('''
+class A<E> {
+  E $methodName() => 0;
+}
+class B<E> extends A<E> {
+  $methodName() => 0;
+}
+''');
+    ClassElement classB = unit.getType('B');
+    MethodElement methodB = classB.getMethod(methodName);
+    expect(methodB.returnType.isDynamic, isTrue);
+
+    inferrer.inferCompilationUnit(unit);
+
+    expect(methodB.returnType, classB.typeParameters[0].type);
+  }
+}
+
+@reflectiveTest
+class VariableGathererTest extends AbstractContextTest {
+  void test_creation_withFilter() {
+    VariableFilter filter = (variable) => true;
+    VariableGatherer gatherer = new VariableGatherer(filter);
+    expect(gatherer, isNotNull);
+    expect(gatherer.filter, filter);
+  }
+
+  void test_creation_withoutFilter() {
+    VariableGatherer gatherer = new VariableGatherer();
+    expect(gatherer, isNotNull);
+    expect(gatherer.filter, isNull);
+  }
+
+  void test_visit_noReferences() {
+    Source source = addSource(
+        '/test.dart',
+        '''
+library lib;
+import 'dart:math';
+int zero = 0;
+class C {
+  void m() => null;
+}
+typedef void F();
+''');
+    CompilationUnit unit = context.resolveCompilationUnit2(source, source);
+    VariableGatherer gatherer = new VariableGatherer();
+    unit.accept(gatherer);
+    expect(gatherer.results, hasLength(0));
+  }
+
+  void test_visit_withFilter() {
+    VariableFilter filter = (VariableElement variable) => variable.isStatic;
+    expect(_gather(filter), hasLength(1));
+  }
+
+  void test_visit_withoutFilter() {
+    expect(_gather(), hasLength(4));
+  }
+
+  Set<VariableElement> _gather([VariableFilter filter = null]) {
+    Source source = addSource(
+        '/test.dart',
+        '''
+const int zero = 0;
+class Counter {
+  int value = zero;
+  void inc() {
+    value++;
+  }
+  void dec() {
+    value = value - 1;
+  }
+  void fromZero(f(int index)) {
+    for (int i = zero; i < value; i++) {
+      f(i);
+    }
+  }
+}
+''');
+    CompilationUnit unit = context.resolveCompilationUnit2(source, source);
+    VariableGatherer gatherer = new VariableGatherer(filter);
+    unit.accept(gatherer);
+    return gatherer.results;
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/task/test_all.dart b/mojo/public/dart/third_party/analyzer/test/src/task/test_all.dart
new file mode 100644
index 0000000..62fe20f
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/task/test_all.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.task.test_all;
+
+import 'package:unittest/unittest.dart';
+
+import '../../utils.dart';
+import 'dart_test.dart' as dart_test;
+import 'dart_work_manager_test.dart' as dart_work_manager_test;
+import 'driver_test.dart' as driver_test;
+import 'general_test.dart' as general_test;
+import 'html_test.dart' as html_test;
+import 'html_work_manager_test.dart' as html_work_manager_test;
+import 'incremental_element_builder_test.dart'
+    as incremental_element_builder_test;
+import 'inputs_test.dart' as inputs_test;
+import 'manager_test.dart' as manager_test;
+import 'model_test.dart' as model_test;
+import 'strong_mode_test.dart' as strong_mode_test;
+
+/// Utility for manually running all tests.
+main() {
+  initializeTestEnvironment();
+  group('task tests', () {
+    dart_test.main();
+    dart_work_manager_test.main();
+    driver_test.main();
+    general_test.main();
+    html_test.main();
+    html_work_manager_test.main();
+    incremental_element_builder_test.main();
+    inputs_test.main();
+    manager_test.main();
+    model_test.main();
+    strong_mode_test.main();
+  });
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/task/test_support.dart b/mojo/public/dart/third_party/analyzer/test/src/task/test_support.dart
new file mode 100644
index 0000000..2173ba2
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/task/test_support.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.task.test_support;
+
+import 'package:analyzer/src/generated/engine.dart' hide AnalysisTask;
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/task/model.dart';
+
+/**
+ * A configurable analysis task that can be used by tests.
+ */
+class TestAnalysisTask extends AnalysisTask {
+  /**
+   * The descriptor describing this task.
+   */
+  TaskDescriptor descriptor;
+
+  /**
+   * The exception that is to be "thrown" by this task.
+   */
+  CaughtException exception;
+
+  /**
+   * The results whose values are to be provided as outputs from this task.
+   */
+  List<ResultDescriptor> results;
+
+  /**
+   * The next value that is to be used for a result.
+   */
+  int value;
+
+  @override
+  final bool handlesDependencyCycles;
+
+  TestAnalysisTask(AnalysisContext context, AnalysisTarget target,
+      {this.descriptor, this.exception, this.handlesDependencyCycles: false,
+      this.results, this.value: 1})
+      : super(context, target);
+
+  @override
+  String get description => 'Test task';
+
+  @override
+  internalPerform() {
+    if (exception != null) {
+      caughtException = exception;
+    } else if (results != null) {
+      for (ResultDescriptor result in results) {
+        outputs[result] = value++;
+      }
+    } else if (descriptor != null) {
+      for (ResultDescriptor result in descriptor.results) {
+        outputs[result] = value++;
+      }
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/test_all.dart b/mojo/public/dart/third_party/analyzer/test/src/test_all.dart
new file mode 100644
index 0000000..5aefb66
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/test_all.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.test_all;
+
+import 'package:unittest/unittest.dart';
+
+import '../utils.dart';
+import 'context/test_all.dart' as context;
+import 'task/test_all.dart' as task;
+import 'util/test_all.dart' as util;
+
+/// Utility for manually running all tests.
+main() {
+  initializeTestEnvironment();
+  group('src tests', () {
+    context.main();
+    task.main();
+    util.main();
+  });
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/util/asserts_test.dart b/mojo/public/dart/third_party/analyzer/test/src/util/asserts_test.dart
new file mode 100644
index 0000000..a504e43
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/util/asserts_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.util.asserts;
+
+import 'package:analyzer/src/util/asserts.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+import '../../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(AnalysisTaskTest);
+}
+
+@reflectiveTest
+class AnalysisTaskTest {
+  void test_notNull_notNull() {
+    notNull(this);
+  }
+
+  void test_notNull_null_hasDescription() {
+    expect(() => notNull(null, 'desc'), throwsArgumentError);
+  }
+
+  void test_notNull_null_noDescription() {
+    expect(() => notNull(null), throwsArgumentError);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/util/lru_map_test.dart b/mojo/public/dart/third_party/analyzer/test/src/util/lru_map_test.dart
new file mode 100644
index 0000000..ef580a0
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/util/lru_map_test.dart
@@ -0,0 +1,96 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.util.lru_map;
+
+import 'package:analyzer/src/util/lru_map.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+import '../../utils.dart';
+
+main() {
+  initializeTestEnvironment();
+  runReflectiveTests(_LRUCacheTest);
+}
+
+@reflectiveTest
+class _LRUCacheTest {
+  LRUMap<int, String> cache = new LRUMap<int, String>(3);
+
+  void test_evict_notGet() {
+    List<int> evictedKeys = new List<int>();
+    List<String> evictedValues = new List<String>();
+    cache = new LRUMap<int, String>(3, (int key, String value) {
+      evictedKeys.add(key);
+      evictedValues.add(value);
+    });
+    // fill
+    cache.put(1, 'A');
+    cache.put(2, 'B');
+    cache.put(3, 'C');
+    // access '1' and '3'
+    cache.get(1);
+    cache.get(3);
+    // put '4', evict '2'
+    cache.put(4, 'D');
+    expect(cache.get(1), 'A');
+    expect(cache.get(2), isNull);
+    expect(cache.get(3), 'C');
+    expect(cache.get(4), 'D');
+    // check eviction listener
+    expect(evictedKeys, contains(2));
+    expect(evictedValues, contains('B'));
+  }
+
+  void test_evict_notPut() {
+    List<int> evictedKeys = new List<int>();
+    List<String> evictedValues = new List<String>();
+    cache = new LRUMap<int, String>(3, (int key, String value) {
+      evictedKeys.add(key);
+      evictedValues.add(value);
+    });
+    // fill
+    cache.put(1, 'A');
+    cache.put(2, 'B');
+    cache.put(3, 'C');
+    // put '1' and '3'
+    cache.put(1, 'AA');
+    cache.put(3, 'CC');
+    // put '4', evict '2'
+    cache.put(4, 'D');
+    expect(cache.get(1), 'AA');
+    expect(cache.get(2), isNull);
+    expect(cache.get(3), 'CC');
+    expect(cache.get(4), 'D');
+    // check eviction listener
+    expect(evictedKeys, contains(2));
+    expect(evictedValues, contains('B'));
+  }
+
+  void test_putGet() {
+    // fill
+    cache.put(1, 'A');
+    cache.put(2, 'B');
+    cache.put(3, 'C');
+    // check
+    expect(cache.get(1), 'A');
+    expect(cache.get(2), 'B');
+    expect(cache.get(3), 'C');
+    expect(cache.get(4), isNull);
+  }
+
+  void test_remove() {
+    cache.put(1, 'A');
+    cache.put(2, 'B');
+    cache.put(3, 'C');
+    // remove
+    cache.remove(1);
+    cache.remove(3);
+    // check
+    expect(cache.get(1), isNull);
+    expect(cache.get(2), 'B');
+    expect(cache.get(3), isNull);
+  }
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/src/util/test_all.dart b/mojo/public/dart/third_party/analyzer/test/src/util/test_all.dart
new file mode 100644
index 0000000..f611c58
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/src/util/test_all.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.util;
+
+import 'package:unittest/unittest.dart';
+
+import '../../utils.dart';
+import 'asserts_test.dart' as asserts_test;
+import 'lru_map_test.dart' as lru_map_test;
+
+/// Utility for manually running all tests.
+main() {
+  initializeTestEnvironment();
+  group('task tests', () {
+    asserts_test.main();
+    lru_map_test.main();
+  });
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/test_all.dart b/mojo/public/dart/third_party/analyzer/test/test_all.dart
new file mode 100644
index 0000000..c21cc3f
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/test_all.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.engine;
+
+import 'package:unittest/unittest.dart';
+
+import 'cancelable_future_test.dart' as cancelable_future_test;
+import 'enum_test.dart' as enum_test;
+import 'file_system/test_all.dart' as file_system;
+import 'generated/test_all.dart' as generated;
+import 'instrumentation/test_all.dart' as instrumentation;
+import 'parse_compilation_unit_test.dart' as parse_compilation_unit;
+import 'source/test_all.dart' as source;
+import 'src/test_all.dart' as src;
+import 'utils.dart';
+
+/// Utility for manually running all tests.
+main() {
+  initializeTestEnvironment();
+  group('analysis engine', () {
+    cancelable_future_test.main();
+    enum_test.main();
+    file_system.main();
+    generated.main();
+    instrumentation.main();
+    parse_compilation_unit.main();
+    source.main();
+    src.main();
+  });
+}
diff --git a/mojo/public/dart/third_party/analyzer/test/utils.dart b/mojo/public/dart/third_party/analyzer/test/utils.dart
new file mode 100644
index 0000000..7c9fbe0
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/test/utils.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.test.utils;
+
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:path/path.dart' as path;
+import 'package:unittest/unittest.dart';
+
+void initializeTestEnvironment() {
+  groupSep = ' | ';
+  JavaFile.pathContext = path.posix;
+}
diff --git a/mojo/public/dart/third_party/analyzer/tool/task_dependency_graph.dart b/mojo/public/dart/third_party/analyzer/tool/task_dependency_graph.dart
new file mode 100644
index 0000000..4625b42
--- /dev/null
+++ b/mojo/public/dart/third_party/analyzer/tool/task_dependency_graph.dart
@@ -0,0 +1,155 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * This file contains code to output a description of tasks and their
+ * dependencies in ".dot" format.  Prior to running, the user should run "pub
+ * get" in the analyzer directory to ensure that a "packages" folder exists.
+ *
+ * The ".dot" file is output to standard out.  To convert it to a pdf, store it
+ * in a file (e.g. "tasks.dot"), and post-process it with
+ * "dot tasks.dart -Tpdf -O".
+ *
+ * TODO(paulberry):
+ * - Add general.dart and html.dart for completeness.
+ * - Use Graphviz's "record" feature to produce more compact output
+ *   (http://www.graphviz.org/content/node-shapes#record)
+ * - Produce a warning if a result descriptor is found which isn't the output
+ *   of exactly one task.
+ * - Convert this tool to use package_config to find the package map.
+ */
+library task_dependency_graph;
+
+import 'dart:io' hide File;
+
+import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/sdk_io.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:path/path.dart' as path;
+
+main() {
+  new Driver().run();
+}
+
+typedef void ResultDescriptorFinderCallback(PropertyAccessorElement element);
+
+class Driver {
+  PhysicalResourceProvider resourceProvider;
+  AnalysisContext context;
+  InterfaceType resultDescriptorType;
+  String rootDir;
+
+  void findResultDescriptors(
+      AstNode node, void callback(String descriptorName)) {
+    Set<PropertyAccessorElement> resultDescriptors =
+        new Set<PropertyAccessorElement>();
+    node.accept(new ResultDescriptorFinder(
+        resultDescriptorType, resultDescriptors.add));
+    for (PropertyAccessorElement resultDescriptor in resultDescriptors) {
+      callback(resultDescriptor.name);
+    }
+  }
+
+  /**
+   * Find the root directory of the analyzer package by proceeding
+   * upward to the 'tool' dir, and then going up one more directory.
+   */
+  String findRoot(String pathname) {
+    while (path.basename(pathname) != 'tool') {
+      String parent = path.dirname(pathname);
+      if (parent.length >= pathname.length) {
+        throw new Exception("Can't find root directory");
+      }
+      pathname = parent;
+    }
+    return path.dirname(pathname);
+  }
+
+  CompilationUnit getUnit(Source source) =>
+      context.resolveCompilationUnit2(source, source);
+
+  void run() {
+    rootDir = findRoot(Platform.script.toFilePath(windows: Platform.isWindows));
+    resourceProvider = PhysicalResourceProvider.INSTANCE;
+    DartSdk sdk = DirectoryBasedDartSdk.defaultSdk;
+    context = AnalysisEngine.instance.createAnalysisContext();
+    JavaFile packagesDir = new JavaFile(path.join(rootDir, 'packages'));
+    List<UriResolver> uriResolvers = [
+      new DartUriResolver(sdk),
+      new PackageUriResolver(<JavaFile>[packagesDir]),
+      new FileUriResolver()
+    ];
+    context.sourceFactory = new SourceFactory(uriResolvers);
+    Source taskSource =
+        setupSource(path.join('lib', 'src', 'task', 'dart.dart'));
+    Source modelSource = setupSource(path.join('lib', 'task', 'model.dart'));
+    CompilationUnitElement modelElement = getUnit(modelSource).element;
+    InterfaceType analysisTaskType = modelElement.getType('AnalysisTask').type;
+    DartType dynamicType = context.typeProvider.dynamicType;
+    resultDescriptorType = modelElement.getType('ResultDescriptor').type
+        .substitute4([dynamicType]);
+    CompilationUnit taskUnit = getUnit(taskSource);
+    CompilationUnitElement taskUnitElement = taskUnit.element;
+    print('digraph G {');
+    Set<String> results = new Set<String>();
+    for (ClassElement cls in taskUnitElement.types) {
+      if (!cls.isAbstract && cls.type.isSubtypeOf(analysisTaskType)) {
+        String task = cls.name;
+        // TODO(paulberry): node is deprecated.  What am I supposed to do
+        // instead?
+        findResultDescriptors(cls.getMethod('buildInputs').node,
+            (String input) {
+          results.add(input);
+          print('  $input -> $task');
+        });
+        findResultDescriptors(cls.getField('DESCRIPTOR').node, (String output) {
+          results.add(output);
+          print('  $task -> $output');
+        });
+      }
+    }
+    for (String result in results) {
+      print('  $result [shape=box]');
+    }
+    print('}');
+  }
+
+  Source setupSource(String filename) {
+    String filePath = path.join(rootDir, filename);
+    File file = resourceProvider.getResource(filePath);
+    Source source = file.createSource();
+    Uri restoredUri = context.sourceFactory.restoreUri(source);
+    if (restoredUri != null) {
+      source = file.createSource(restoredUri);
+    }
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(source);
+    context.applyChanges(changeSet);
+    return source;
+  }
+}
+
+class ResultDescriptorFinder extends GeneralizingAstVisitor {
+  final InterfaceType resultDescriptorType;
+  final ResultDescriptorFinderCallback callback;
+
+  ResultDescriptorFinder(this.resultDescriptorType, this.callback);
+
+  @override
+  visitIdentifier(Identifier node) {
+    Element element = node.staticElement;
+    if (element is PropertyAccessorElement &&
+        element.isGetter &&
+        element.returnType.isSubtypeOf(resultDescriptorType)) {
+      callback(element);
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/args/.gitignore b/mojo/public/dart/third_party/args/.gitignore
new file mode 100644
index 0000000..388eff0
--- /dev/null
+++ b/mojo/public/dart/third_party/args/.gitignore
@@ -0,0 +1,14 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.pub/
+build/
+packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/args/.status b/mojo/public/dart/third_party/args/.status
new file mode 100644
index 0000000..ff095a2
--- /dev/null
+++ b/mojo/public/dart/third_party/args/.status
@@ -0,0 +1,15 @@
+# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Skip non-test files ending with "_test".
+packages/*: Skip
+*/packages/*: Skip
+*/*/packages/*: Skip
+*/*/*/packages/*: Skip
+*/*/*/*packages/*: Skip
+*/*/*/*/*packages/*: Skip
+
+# Only run tests from the build directory, since we don't care about the
+# difference between transformed an untransformed code.
+test/*: Skip
diff --git a/mojo/public/dart/third_party/args/CHANGELOG.md b/mojo/public/dart/third_party/args/CHANGELOG.md
new file mode 100644
index 0000000..123c564
--- /dev/null
+++ b/mojo/public/dart/third_party/args/CHANGELOG.md
@@ -0,0 +1,89 @@
+## 0.13.2
+
+* Allow option values that look like options. This more closely matches the
+  behavior of [`getopt`][getopt], the *de facto* standard for option parsing.
+
+[getopt]: http://man7.org/linux/man-pages/man3/getopt.3.html
+
+## 0.13.1
+
+* Add `ArgParser.addSeparator()`. Separators allow users to group their options
+  in the usage text.
+
+## 0.13.0
+
+* **Breaking change**: An option that allows multiple values will now
+  automatically split apart comma-separated values. This can be controlled with
+  the `splitCommas` option.
+
+## 0.12.2+6
+
+* Remove the dependency on the `collection` package.
+
+## 0.12.2+5
+
+* Add syntax highlighting to the README.
+
+## 0.12.2+4
+
+* Add an example of using command-line arguments to the README.
+
+## 0.12.2+3
+
+* Fixed implementation of ArgResults.options to really use Iterable<String>
+  instead of Iterable<dynamic> cast to Iterable<String>.
+
+## 0.12.2+2
+
+* Updated dependency constraint on `unittest`.
+
+* Formatted source code.
+
+* Fixed use of deprecated API in example.
+
+## 0.12.2+1
+
+* Fix the built-in `help` command for `CommandRunner`.
+
+## 0.12.2
+
+* Add `CommandRunner` and `Command` classes which make it easy to build a
+  command-based command-line application.
+
+* Add an `ArgResults.arguments` field, which contains the original argument list.
+
+## 0.12.1
+
+* Replace `ArgParser.getUsage()` with `ArgParser.usage`, a getter.
+  `ArgParser.getUsage()` is now deprecated, to be removed in args version 1.0.0.
+
+## 0.12.0+2
+
+* Widen the version constraint on the `collection` package.
+
+## 0.12.0+1
+
+* Remove the documentation link from the pubspec so this is linked to
+  pub.dartlang.org by default.
+
+## 0.12.0
+
+* Removed public constructors for `ArgResults` and `Option`.
+ 
+* `ArgResults.wasParsed()` can be used to determine if an option was actually
+  parsed or the default value is being returned.
+
+* Replaced `isFlag` and `allowMultiple` fields in the `Option` class with a
+  three-value `OptionType` enum.
+  
+* Options may define `valueHelp` which will then be shown in the usage.
+
+## 0.11.0
+
+* Move handling trailing options from `ArgParser.parse()` into `ArgParser`
+  itself. This lets subcommands have different behavior for how they handle
+  trailing options.
+
+## 0.10.0+2
+
+* Usage ignores hidden options when determining column widths.
diff --git a/mojo/public/dart/third_party/args/LICENSE b/mojo/public/dart/third_party/args/LICENSE
new file mode 100644
index 0000000..ee99930
--- /dev/null
+++ b/mojo/public/dart/third_party/args/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2013, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/args/README.md b/mojo/public/dart/third_party/args/README.md
new file mode 100644
index 0000000..96df5e6
--- /dev/null
+++ b/mojo/public/dart/third_party/args/README.md
@@ -0,0 +1,399 @@
+Parses raw command-line arguments into a set of options and values.
+
+This library supports [GNU][] and [POSIX][] style options, and it works
+in both server-side and client-side apps.
+
+## Defining options
+
+First create an [ArgParser][]:
+
+    var parser = new ArgParser();
+
+Then define a set of options on that parser using [addOption()][addOption] and
+[addFlag()][addFlag]. Here's the minimal way to create an option named "name":
+
+    parser.addOption('name');
+
+When an option can only be set or unset (as opposed to taking a string value),
+use a flag:
+
+```dart
+parser.addFlag('name');
+```
+
+Flag options, by default, accept a 'no-' prefix to negate the option. You can
+disable the 'no-' prefix using the `negatable` parameter:
+
+```dart
+parser.addFlag('name', negatable: false);
+```
+
+*Note:* From here on out, "option" refers to both regular options and flags. In
+cases where the distinction matters, we'll use "non-flag option."
+
+Options can have an optional single-character abbreviation, specified with the
+`abbr` parameter:
+
+```dart
+parser.addOption('mode', abbr: 'm');
+parser.addFlag('verbose', abbr: 'v');
+```
+
+Options can also have a default value, specified with the `defaultsTo`
+parameter. The default value is used when arguments don't specify the option.
+
+```dart
+parser.addOption('mode', defaultsTo: 'debug');
+parser.addFlag('verbose', defaultsTo: false);
+```
+
+The default value for non-flag options can be any string. For flags, it must
+be a `bool`.
+
+To validate a non-flag option, you can use the `allowed` parameter to provide an
+allowed set of values. When you do, the parser throws a [FormatException] if the
+value for an option is not in the allowed set. Here's an example of specifying
+allowed values:
+
+```dart
+parser.addOption('mode', allowed: ['debug', 'release']);
+```
+
+You can use the `callback` parameter to associate a function with an option.
+Later, when parsing occurs, the callback function is invoked with the value of
+the option:
+
+```dart
+parser.addOption('mode', callback: (mode) => print('Got mode $mode'));
+parser.addFlag('verbose', callback: (verbose) {
+  if (verbose) print('Verbose');
+});
+```
+
+The callbacks for all options are called whenever a set of arguments is parsed.
+If an option isn't provided in the args, its callback is passed the default
+value, or `null` if no default value is set.
+
+## Parsing arguments
+
+Once you have an [ArgParser][] set up with some options and flags, you use it by
+calling [ArgParser.parse()][parse] with a set of arguments:
+
+```dart
+var results = parser.parse(['some', 'command', 'line', 'args']);
+```
+
+These arguments usually come from the arguments to `main()`. For example:
+
+    main(List<String> args) {
+      // ...
+      var results = parser.parse(args);
+    }
+
+However, you can pass in any list of strings. The `parse()` method returns an
+instance of [ArgResults][], a map-like object that contains the values of the
+parsed options.
+
+```dart
+var parser = new ArgParser();
+parser.addOption('mode');
+parser.addFlag('verbose', defaultsTo: true);
+var results = parser.parse(['--mode', 'debug', 'something', 'else']);
+
+print(results['mode']); // debug
+print(results['verbose']); // true
+```
+
+By default, the `parse()` method stops as soon as it reaches `--` by itself or
+anything that the parser doesn't recognize as an option, flag, or option value.
+If arguments still remain, they go into [ArgResults.rest][rest].
+
+```dart
+print(results.rest); // ['something', 'else']
+```
+
+To continue to parse options found after non-option arguments, pass
+`allowTrailingOptions: true` when creating the [ArgParser][].
+
+## Specifying options
+
+To actually pass in options and flags on the command line, use GNU or POSIX
+style. Consider this option:
+
+```dart
+parser.addOption('name', abbr: 'n');
+```
+
+You can specify its value on the command line using any of the following:
+
+```
+--name=somevalue
+--name somevalue
+-nsomevalue
+-n somevalue
+```
+
+Consider this flag:
+
+```dart
+parser.addFlag('name', abbr: 'n');
+```
+
+You can set it to true using one of the following:
+
+```
+--name
+-n
+```
+
+You can set it to false using the following:
+
+```
+--no-name
+```
+
+Multiple flag abbreviations can be collapsed into a single argument. Say you
+define these flags:
+
+```dart
+parser
+  ..addFlag('verbose', abbr: 'v')
+  ..addFlag('french', abbr: 'f')
+  ..addFlag('iambic-pentameter', abbr: 'i');
+```
+
+You can set all three flags at once:
+
+```
+-vfi
+```
+
+By default, an option has only a single value, with later option values
+overriding earlier ones; for example:
+
+```dart
+var parser = new ArgParser();
+parser.addOption('mode');
+var results = parser.parse(['--mode', 'on', '--mode', 'off']);
+print(results['mode']); // prints 'off'
+```
+
+If you need multiple values, set the `allowMultiple` parameter. In that case the
+option can occur multiple times, and the `parse()` method returns a list of
+values:
+
+```dart
+var parser = new ArgParser();
+parser.addOption('mode', allowMultiple: true);
+var results = parser.parse(['--mode', 'on', '--mode', 'off']);
+print(results['mode']); // prints '[on, off]'
+```
+
+By default, values for a multi-valued option may also be separated with commas:
+
+```dart
+var parser = new ArgParser();
+parser.addOption('mode', allowMultiple: true);
+var results = parser.parse(['--mode', 'on,off']);
+print(results['mode']); // prints '[on, off]'
+```
+
+This can be disabled by passing `splitCommas: false`.
+
+## Defining commands ##
+
+In addition to *options*, you can also define *commands*. A command is a named
+argument that has its own set of options. For example, consider this shell
+command:
+
+```
+$ git commit -a
+```
+
+The executable is `git`, the command is `commit`, and the `-a` option is an
+option passed to the command. You can add a command using the [addCommand][]
+method:
+
+```dart
+var parser = new ArgParser();
+var command = parser.addCommand('commit');
+```
+
+It returns another [ArgParser][], which you can then use to define options
+specific to that command. If you already have an [ArgParser][] for the command's
+options, you can pass it in:
+
+```dart
+var parser = new ArgParser();
+var command = new ArgParser();
+parser.addCommand('commit', command);
+```
+
+The [ArgParser][] for a command can then define options or flags:
+
+```dart
+command.addFlag('all', abbr: 'a');
+```
+
+You can add multiple commands to the same parser so that a user can select one
+from a range of possible commands. When parsing an argument list, you can then
+determine which command was entered and what options were provided for it.
+
+```dart
+var results = parser.parse(['commit', '-a']);
+print(results.command.name);   // "commit"
+print(results.command['all']); // true
+```
+
+Options for a command must appear after the command in the argument list. For
+example, given the above parser, `"git -a commit"` is *not* valid. The parser
+tries to find the right-most command that accepts an option. For example:
+
+```dart
+var parser = new ArgParser();
+parser.addFlag('all', abbr: 'a');
+var command = parser.addCommand('commit');
+command.addFlag('all', abbr: 'a');
+
+var results = parser.parse(['commit', '-a']);
+print(results.command['all']); // true
+```
+
+Here, both the top-level parser and the `"commit"` command can accept a `"-a"`
+(which is probably a bad command line interface, admittedly). In that case, when
+`"-a"` appears after `"commit"`, it is applied to that command. If it appears to
+the left of `"commit"`, it is given to the top-level parser.
+
+## Dispatching Commands
+
+If you're writing a command-based application, you can use the [CommandRunner][]
+and [Command][] classes to help structure it. [CommandRunner][] has built-in
+support for dispatching to [Command][]s based on command-line arguments, as well
+as handling `--help` flags and invalid arguments. For example:
+
+```dart
+var runner = new CommandRunner("git", "Distributed version control.")
+  ..addCommand(new CommitCommand())
+  ..addCommand(new StashCommand())
+  ..run(['commit', '-a']); // Calls [CommitCommand.run()]
+```
+
+Custom commands are defined by extending the [Command][] class. For example:
+
+```dart
+class CommitCommand extends Command {
+  // The [name] and [description] properties must be defined by every
+  // subclass.
+  final name = "commit";
+  final description = "Record changes to the repository.";
+
+  CommitCommand() {
+    // [argParser] is automatically created by the parent class.
+    argParser.addFlag('all', abbr: 'a');
+  }
+
+  // [run] may also return a Future.
+  void run() {
+    // [options] is set before [run()] is called and contains the options
+    // passed to this command.
+    print(options['all']);
+  }
+}
+```
+
+Commands can also have subcommands, which are added with [addSubcommand][]. A
+command with subcommands can't run its own code, so [run][] doesn't need to be
+implemented. For example:
+
+```dart
+class StashCommand extends Command {
+  final String name = "stash";
+  final String description = "Stash changes in the working directory.";
+
+  StashCommand() {
+    addSubcommand(new StashSaveCommand());
+    addSubcommand(new StashListCommand());
+  }
+}
+```
+
+[CommandRunner][] automatically adds a `help` command that displays usage
+information for commands, as well as support for the `--help` flag for all
+commands. If it encounters an error parsing the arguments or processing a
+command, it throws a [UsageError][]; your `main()` method should catch these and
+print them appropriately. For example:
+
+```dart
+runner.run(arguments).catchError((error) {
+  if (error is! UsageError) throw error;
+  print(error);
+  exit(64); // Exit code 64 indicates a usage error.
+});
+```
+
+## Displaying usage
+
+You can automatically generate nice help text, suitable for use as the output of
+`--help`. To display good usage information, you should provide some help text
+when you create your options.
+
+To define help text for an entire option, use the `help:` parameter:
+
+```dart
+parser.addOption('mode', help: 'The compiler configuration',
+    allowed: ['debug', 'release']);
+parser.addFlag('verbose', help: 'Show additional diagnostic info');
+```
+
+For non-flag options, you can also provide a help string for the parameter:
+
+```dart
+parser.addOption('out', help: 'The output path', valueHelp: 'path',
+    allowed: ['debug', 'release']);
+```
+
+For non-flag options, you can also provide detailed help for each expected value
+by using the `allowedHelp:` parameter:
+
+```dart
+parser.addOption('arch', help: 'The architecture to compile for',
+    allowedHelp: {
+      'ia32': 'Intel x86',
+      'arm': 'ARM Holding 32-bit chip'
+    });
+```
+
+To display the help, use the [getUsage()][getUsage] method:
+
+```dart
+print(parser.getUsage());
+```
+
+The resulting string looks something like this:
+
+```
+--mode            The compiler configuration
+                  [debug, release]
+
+--out=<path>      The output path
+--[no-]verbose    Show additional diagnostic info
+--arch            The architecture to compile for
+      [arm]       ARM Holding 32-bit chip
+      [ia32]      Intel x86
+```
+
+[posix]: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02
+[gnu]: http://www.gnu.org/prep/standards/standards.html#Command_002dLine-Interfaces
+[ArgParser]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.ArgParser
+[ArgResults]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.ArgResults
+[CommandRunner]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.CommandRunner
+[Command]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.Command
+[UsageError]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.UsageError
+[addOption]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.ArgParser@id_addOption
+[addFlag]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.ArgParser@id_addFlag
+[parse]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.ArgParser@id_parse
+[rest]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.ArgResults@id_rest
+[addCommand]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.ArgParser@id_addCommand
+[getUsage]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.ArgParser@id_getUsage
+[addSubcommand]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.Command@id_addSubcommand
+[run]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.Command@id_run
diff --git a/mojo/public/dart/third_party/args/codereview.settings b/mojo/public/dart/third_party/args/codereview.settings
new file mode 100644
index 0000000..da6054d
--- /dev/null
+++ b/mojo/public/dart/third_party/args/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: http://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/args/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/args/example/test_runner.dart b/mojo/public/dart/third_party/args/example/test_runner.dart
new file mode 100644
index 0000000..0d15e83
--- /dev/null
+++ b/mojo/public/dart/third_party/args/example/test_runner.dart
@@ -0,0 +1,165 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// This is an example of converting the args in test.dart to use this API.
+/// It shows what it looks like to build an [ArgParser] and then, when the code
+/// is run, demonstrates what the generated usage text looks like.
+library example;
+
+import 'dart:io';
+
+import 'package:args/args.dart';
+
+main() {
+  var parser = new ArgParser();
+
+  parser.addSeparator('===== Platform');
+
+  parser.addOption('compiler',
+      abbr: 'c',
+      defaultsTo: 'none',
+      help: 'Specify any compilation step (if needed).',
+      allowed: ['none', 'dart2js', 'dartc'],
+      allowedHelp: {
+    'none': 'Do not compile the Dart code (run native Dart code on the'
+        ' VM).\n(only valid with the following runtimes: vm, drt)',
+    'dart2js': 'Compile dart code to JavaScript by running dart2js.\n'
+        '(only valid with the following runtimes: d8, drt, chrome\n'
+        'safari, ie, firefox, opera, none (compile only))',
+    'dartc': 'Perform static analysis on Dart code by running dartc.\n'
+        '(only valid with the following runtimes: none)',
+  });
+
+  parser.addOption('runtime',
+      abbr: 'r',
+      defaultsTo: 'vm',
+      help: 'Where the tests should be run.',
+      allowed: [
+    'vm',
+    'd8',
+    'drt',
+    'dartium',
+    'ff',
+    'firefox',
+    'chrome',
+    'safari',
+    'ie',
+    'opera',
+    'none'
+  ],
+      allowedHelp: {
+    'vm': 'Run Dart code on the standalone dart vm.',
+    'd8': 'Run JavaScript from the command line using v8.',
+    // TODO(antonm): rename flag.
+    'drt': 'Run Dart or JavaScript in the headless version of Chrome,\n'
+        'content shell.',
+    'dartium': 'Run Dart or JavaScript in Dartium.',
+    'ff': 'Run JavaScript in Firefox',
+    'chrome': 'Run JavaScript in Chrome',
+    'safari': 'Run JavaScript in Safari',
+    'ie': 'Run JavaScript in Internet Explorer',
+    'opera': 'Run JavaScript in Opera',
+    'none': 'No runtime, compile only (for example, used for dartc static\n'
+        'analysis tests).',
+  });
+
+  parser.addOption('arch',
+      abbr: 'a',
+      defaultsTo: 'ia32',
+      help: 'The architecture to run tests for',
+      allowed: ['all', 'ia32', 'x64', 'simarm']);
+
+  parser.addOption('system',
+      abbr: 's',
+      defaultsTo: Platform.operatingSystem,
+      help: 'The operating system to run tests on',
+      allowed: ['linux', 'macos', 'windows']);
+
+  parser.addSeparator('===== Runtime');
+
+  parser.addOption('mode',
+      abbr: 'm',
+      defaultsTo: 'debug',
+      help: 'Mode in which to run the tests',
+      allowed: ['all', 'debug', 'release']);
+
+  parser.addFlag('checked',
+      defaultsTo: false, help: 'Run tests in checked mode');
+
+  parser.addFlag('host-checked',
+      defaultsTo: false, help: 'Run compiler in checked mode');
+
+  parser.addOption('timeout', abbr: 't', help: 'Timeout in seconds');
+
+  parser.addOption('tasks',
+      abbr: 'j',
+      defaultsTo: Platform.numberOfProcessors.toString(),
+      help: 'The number of parallel tasks to run');
+
+  parser.addOption('shards',
+      defaultsTo: '1',
+      help: 'The number of instances that the tests will be sharded over');
+
+  parser.addOption('shard',
+      defaultsTo: '1',
+      help: 'The index of this instance when running in sharded mode');
+
+  parser.addFlag('valgrind',
+      defaultsTo: false, help: 'Run tests through valgrind');
+
+  parser.addSeparator('===== Output');
+
+  parser.addOption('progress',
+      abbr: 'p',
+      defaultsTo: 'compact',
+      help: 'Progress indication mode',
+      allowed: [
+    'compact',
+    'color',
+    'line',
+    'verbose',
+    'silent',
+    'status',
+    'buildbot'
+  ]);
+
+  parser.addFlag('report',
+      defaultsTo: false,
+      help: 'Print a summary report of the number of tests, by expectation');
+
+  parser.addFlag('verbose',
+      abbr: 'v', defaultsTo: false, help: 'Verbose output');
+
+  parser.addFlag('list',
+      defaultsTo: false, help: 'List tests only, do not run them');
+
+  parser.addFlag('time',
+      help: 'Print timing information after running tests', defaultsTo: false);
+
+  parser.addFlag('batch',
+      abbr: 'b', help: 'Run browser tests in batch mode', defaultsTo: true);
+
+  parser.addSeparator('===== Miscellaneous');
+
+  parser.addFlag('keep-generated-tests',
+      defaultsTo: false,
+      help: 'Keep the generated files in the temporary directory');
+
+  parser.addOption('special-command', help: """
+Special command support. Wraps the command line in
+a special command. The special command should contain
+an '@' character which will be replaced by the normal
+command.
+
+For example if the normal command that will be executed
+is 'dart file.dart' and you specify special command
+'python -u valgrind.py @ suffix' the final command will be
+'python -u valgrind.py dart file.dart suffix'""");
+
+  parser.addOption('dart', help: 'Path to dart executable');
+  parser.addOption('drt', help: 'Path to content shell executable');
+  parser.addOption('dartium', help: 'Path to Dartium Chrome executable');
+
+  print(parser.usage);
+}
diff --git a/mojo/public/dart/third_party/args/lib/args.dart b/mojo/public/dart/third_party/args/lib/args.dart
new file mode 100644
index 0000000..562df44
--- /dev/null
+++ b/mojo/public/dart/third_party/args/lib/args.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library args;
+
+export 'src/arg_parser.dart';
+export 'src/arg_results.dart' hide newArgResults;
+export 'src/option.dart' hide newOption;
diff --git a/mojo/public/dart/third_party/args/lib/command_runner.dart b/mojo/public/dart/third_party/args/lib/command_runner.dart
new file mode 100644
index 0000000..d728cb0
--- /dev/null
+++ b/mojo/public/dart/third_party/args/lib/command_runner.dart
@@ -0,0 +1,382 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library args.command_runner;
+
+import 'dart:async';
+import 'dart:collection';
+import 'dart:math' as math;
+
+import 'src/arg_parser.dart';
+import 'src/arg_results.dart';
+import 'src/help_command.dart';
+import 'src/usage_exception.dart';
+import 'src/utils.dart';
+
+export 'src/usage_exception.dart';
+
+/// A class for invoking [Commands] based on raw command-line arguments.
+class CommandRunner {
+  /// The name of the executable being run.
+  ///
+  /// Used for error reporting and [usage].
+  final String executableName;
+
+  /// A short description of this executable.
+  final String description;
+
+  /// A single-line template for how to invoke this executable.
+  ///
+  /// Defaults to "$executableName <command> [arguments]". Subclasses can
+  /// override this for a more specific template.
+  String get invocation => "$executableName <command> [arguments]";
+
+  /// Generates a string displaying usage information for the executable.
+  ///
+  /// This includes usage for the global arguments as well as a list of
+  /// top-level commands.
+  String get usage => "$description\n\n$_usageWithoutDescription";
+
+  /// An optional footer for [usage].
+  ///
+  /// If a subclass overrides this to return a string, it will automatically be
+  /// added to the end of [usage].
+  final String usageFooter = null;
+
+  /// Returns [usage] with [description] removed from the beginning.
+  String get _usageWithoutDescription {
+    var usage = '''
+Usage: $invocation
+
+Global options:
+${argParser.usage}
+
+${_getCommandUsage(_commands)}
+
+Run "$executableName help <command>" for more information about a command.''';
+
+    if (usageFooter != null) usage += "\n$usageFooter";
+    return usage;
+  }
+
+  /// An unmodifiable view of all top-level commands defined for this runner.
+  Map<String, Command> get commands => new UnmodifiableMapView(_commands);
+  final _commands = new Map<String, Command>();
+
+  /// The top-level argument parser.
+  ///
+  /// Global options should be registered with this parser; they'll end up
+  /// available via [Command.globalResults]. Commands should be registered with
+  /// [addCommand] rather than directly on the parser.
+  final argParser = new ArgParser();
+
+  CommandRunner(this.executableName, this.description) {
+    argParser.addFlag('help',
+        abbr: 'h', negatable: false, help: 'Print this usage information.');
+    addCommand(new HelpCommand());
+  }
+
+  /// Prints the usage information for this runner.
+  ///
+  /// This is called internally by [run] and can be overridden by subclasses to
+  /// control how output is displayed or integrate with a logging system.
+  void printUsage() => print(usage);
+
+  /// Throws a [UsageException] with [message].
+  void usageException(String message) =>
+      throw new UsageException(message, _usageWithoutDescription);
+
+  /// Adds [Command] as a top-level command to this runner.
+  void addCommand(Command command) {
+    var names = [command.name]..addAll(command.aliases);
+    for (var name in names) {
+      _commands[name] = command;
+      argParser.addCommand(name, command.argParser);
+    }
+    command._runner = this;
+  }
+
+  /// Parses [args] and invokes [Command.run] on the chosen command.
+  ///
+  /// This always returns a [Future] in case the command is asynchronous. The
+  /// [Future] will throw a [UsageError] if [args] was invalid.
+  Future run(Iterable<String> args) =>
+      new Future.sync(() => runCommand(parse(args)));
+
+  /// Parses [args] and returns the result, converting a [FormatException] to a
+  /// [UsageException].
+  ///
+  /// This is notionally a protected method. It may be overridden or called from
+  /// subclasses, but it shouldn't be called externally.
+  ArgResults parse(Iterable<String> args) {
+    try {
+      // TODO(nweiz): if arg parsing fails for a command, print that command's
+      // usage, not the global usage.
+      return argParser.parse(args);
+    } on FormatException catch (error) {
+      usageException(error.message);
+    }
+  }
+
+  /// Runs the command specified by [topLevelResults].
+  ///
+  /// This is notionally a protected method. It may be overridden or called from
+  /// subclasses, but it shouldn't be called externally.
+  ///
+  /// It's useful to override this to handle global flags and/or wrap the entire
+  /// command in a block. For example, you might handle the `--verbose` flag
+  /// here to enable verbose logging before running the command.
+  Future runCommand(ArgResults topLevelResults) {
+    return new Future.sync(() {
+      var argResults = topLevelResults;
+      var commands = _commands;
+      var command;
+      var commandString = executableName;
+
+      while (commands.isNotEmpty) {
+        if (argResults.command == null) {
+          if (argResults.rest.isEmpty) {
+            if (command == null) {
+              // No top-level command was chosen.
+              printUsage();
+              return new Future.value();
+            }
+
+            command.usageException('Missing subcommand for "$commandString".');
+          } else {
+            if (command == null) {
+              usageException(
+                  'Could not find a command named "${argResults.rest[0]}".');
+            }
+
+            command.usageException('Could not find a subcommand named '
+                '"${argResults.rest[0]}" for "$commandString".');
+          }
+        }
+
+        // Step into the command.
+        argResults = argResults.command;
+        command = commands[argResults.name];
+        command._globalResults = topLevelResults;
+        command._argResults = argResults;
+        commands = command._subcommands;
+        commandString += " ${argResults.name}";
+
+        if (argResults['help']) {
+          command.printUsage();
+          return new Future.value();
+        }
+      }
+
+      // Make sure there aren't unexpected arguments.
+      if (!command.takesArguments && argResults.rest.isNotEmpty) {
+        command.usageException(
+            'Command "${argResults.name}" does not take any arguments.');
+      }
+
+      return command.run();
+    });
+  }
+}
+
+/// A single command.
+///
+/// A command is known as a "leaf command" if it has no subcommands and is meant
+/// to be run. Leaf commands must override [run].
+///
+/// A command with subcommands is known as a "branch command" and cannot be run
+/// itself. It should call [addSubcommand] (often from the constructor) to
+/// register subcommands.
+abstract class Command {
+  /// The name of this command.
+  String get name;
+
+  /// A short description of this command.
+  String get description;
+
+  /// A single-line template for how to invoke this command (e.g. `"pub get
+  /// [package]"`).
+  String get invocation {
+    var parents = [name];
+    for (var command = parent; command != null; command = command.parent) {
+      parents.add(command.name);
+    }
+    parents.add(runner.executableName);
+
+    var invocation = parents.reversed.join(" ");
+    return _subcommands.isNotEmpty
+        ? "$invocation <subcommand> [arguments]"
+        : "$invocation [arguments]";
+  }
+
+  /// The command's parent command, if this is a subcommand.
+  ///
+  /// This will be `null` until [Command.addSubcommmand] has been called with
+  /// this command.
+  Command get parent => _parent;
+  Command _parent;
+
+  /// The command runner for this command.
+  ///
+  /// This will be `null` until [CommandRunner.addCommand] has been called with
+  /// this command or one of its parents.
+  CommandRunner get runner {
+    if (parent == null) return _runner;
+    return parent.runner;
+  }
+  CommandRunner _runner;
+
+  /// The parsed global argument results.
+  ///
+  /// This will be `null` until just before [Command.run] is called.
+  ArgResults get globalResults => _globalResults;
+  ArgResults _globalResults;
+
+  /// The parsed argument results for this command.
+  ///
+  /// This will be `null` until just before [Command.run] is called.
+  ArgResults get argResults => _argResults;
+  ArgResults _argResults;
+
+  /// The argument parser for this command.
+  ///
+  /// Options for this command should be registered with this parser (often in
+  /// the constructor); they'll end up available via [argResults]. Subcommands
+  /// should be registered with [addSubcommand] rather than directly on the
+  /// parser.
+  final argParser = new ArgParser();
+
+  /// Generates a string displaying usage information for this command.
+  ///
+  /// This includes usage for the command's arguments as well as a list of
+  /// subcommands, if there are any.
+  String get usage => "$description\n\n$_usageWithoutDescription";
+
+  /// An optional footer for [usage].
+  ///
+  /// If a subclass overrides this to return a string, it will automatically be
+  /// added to the end of [usage].
+  final String usageFooter = null;
+
+  /// Returns [usage] with [description] removed from the beginning.
+  String get _usageWithoutDescription {
+    var buffer = new StringBuffer()
+      ..writeln('Usage: $invocation')
+      ..writeln(argParser.usage);
+
+    if (_subcommands.isNotEmpty) {
+      buffer.writeln();
+      buffer.writeln(_getCommandUsage(_subcommands, isSubcommand: true));
+    }
+
+    buffer.writeln();
+    buffer.write('Run "${runner.executableName} help" to see global options.');
+
+    if (usageFooter != null) {
+      buffer.writeln();
+      buffer.write(usageFooter);
+    }
+
+    return buffer.toString();
+  }
+
+  /// An unmodifiable view of all sublevel commands of this command.
+  Map<String, Command> get subcommands => new UnmodifiableMapView(_subcommands);
+  final _subcommands = new Map<String, Command>();
+
+  /// Whether or not this command should be hidden from help listings.
+  ///
+  /// This is intended to be overridden by commands that want to mark themselves
+  /// hidden.
+  ///
+  /// By default, leaf commands are always visible. Branch commands are visible
+  /// as long as any of their leaf commands are visible.
+  bool get hidden {
+    // Leaf commands are visible by default.
+    if (_subcommands.isEmpty) return false;
+
+    // Otherwise, a command is hidden if all of its subcommands are.
+    return _subcommands.values.every((subcommand) => subcommand.hidden);
+  }
+
+  /// Whether or not this command takes positional arguments in addition to
+  /// options.
+  ///
+  /// If false, [CommandRunner.run] will throw a [UsageException] if arguments
+  /// are provided. Defaults to true.
+  ///
+  /// This is intended to be overridden by commands that don't want to receive
+  /// arguments. It has no effect for branch commands.
+  final takesArguments = true;
+
+  /// Alternate names for this command.
+  ///
+  /// These names won't be used in the documentation, but they will work when
+  /// invoked on the command line.
+  ///
+  /// This is intended to be overridden.
+  final aliases = const <String>[];
+
+  Command() {
+    argParser.addFlag('help',
+        abbr: 'h', negatable: false, help: 'Print this usage information.');
+  }
+
+  /// Runs this command.
+  ///
+  /// If this returns a [Future], [CommandRunner.run] won't complete until the
+  /// returned [Future] does. Otherwise, the return value is ignored.
+  run() {
+    throw new UnimplementedError("Leaf command $this must implement run().");
+  }
+
+  /// Adds [Command] as a subcommand of this.
+  void addSubcommand(Command command) {
+    var names = [command.name]..addAll(command.aliases);
+    for (var name in names) {
+      _subcommands[name] = command;
+      argParser.addCommand(name, command.argParser);
+    }
+    command._parent = this;
+  }
+
+  /// Prints the usage information for this command.
+  ///
+  /// This is called internally by [run] and can be overridden by subclasses to
+  /// control how output is displayed or integrate with a logging system.
+  void printUsage() => print(usage);
+
+  /// Throws a [UsageException] with [message].
+  void usageException(String message) =>
+      throw new UsageException(message, _usageWithoutDescription);
+}
+
+/// Returns a string representation of [commands] fit for use in a usage string.
+///
+/// [isSubcommand] indicates whether the commands should be called "commands" or
+/// "subcommands".
+String _getCommandUsage(Map<String, Command> commands,
+    {bool isSubcommand: false}) {
+  // Don't include aliases.
+  var names =
+      commands.keys.where((name) => !commands[name].aliases.contains(name));
+
+  // Filter out hidden ones, unless they are all hidden.
+  var visible = names.where((name) => !commands[name].hidden);
+  if (visible.isNotEmpty) names = visible;
+
+  // Show the commands alphabetically.
+  names = names.toList()..sort();
+  var length = names.map((name) => name.length).reduce(math.max);
+
+  var buffer =
+      new StringBuffer('Available ${isSubcommand ? "sub" : ""}commands:');
+  for (var name in names) {
+    buffer.writeln();
+    buffer.write('  ${padRight(name, length)}   '
+        '${commands[name].description.split("\n").first}');
+  }
+
+  return buffer.toString();
+}
diff --git a/mojo/public/dart/third_party/args/lib/src/arg_parser.dart b/mojo/public/dart/third_party/args/lib/src/arg_parser.dart
new file mode 100644
index 0000000..c32741d
--- /dev/null
+++ b/mojo/public/dart/third_party/args/lib/src/arg_parser.dart
@@ -0,0 +1,163 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library args.src.arg_parser;
+
+import 'dart:collection';
+
+import 'arg_results.dart';
+import 'option.dart';
+import 'parser.dart';
+import 'usage.dart';
+
+/// A class for taking a list of raw command line arguments and parsing out
+/// options and flags from them.
+class ArgParser {
+  final Map<String, Option> _options;
+  final Map<String, ArgParser> _commands;
+
+  /// The options that have been defined for this parser.
+  final Map<String, Option> options;
+
+  /// The commands that have been defined for this parser.
+  final Map<String, ArgParser> commands;
+
+  /// A list of the [Option]s in [options] intermingled with [String]
+  /// separators.
+  final _optionsAndSeparators = [];
+
+  /// Whether or not this parser parses options that appear after non-option
+  /// arguments.
+  final bool allowTrailingOptions;
+
+  /// Creates a new ArgParser.
+  ///
+  /// If [allowTrailingOptions] is set, the parser will continue parsing even
+  /// after it finds an argument that is neither an option nor a command.
+  /// This allows options to be specified after regular arguments. Defaults to
+  /// `false`.
+  factory ArgParser({bool allowTrailingOptions}) => new ArgParser._(
+      <String, Option>{}, <String, ArgParser>{},
+      allowTrailingOptions: allowTrailingOptions);
+
+  ArgParser._(Map<String, Option> options, Map<String, ArgParser> commands,
+      {bool allowTrailingOptions})
+      : this._options = options,
+        this.options = new UnmodifiableMapView(options),
+        this._commands = commands,
+        this.commands = new UnmodifiableMapView(commands),
+        this.allowTrailingOptions = allowTrailingOptions != null
+            ? allowTrailingOptions
+            : false;
+
+  /// Defines a command.
+  ///
+  /// A command is a named argument which may in turn define its own options and
+  /// subcommands using the given parser. If [parser] is omitted, implicitly
+  /// creates a new one. Returns the parser for the command.
+  ArgParser addCommand(String name, [ArgParser parser]) {
+    // Make sure the name isn't in use.
+    if (_commands.containsKey(name)) {
+      throw new ArgumentError('Duplicate command "$name".');
+    }
+
+    if (parser == null) parser = new ArgParser();
+    _commands[name] = parser;
+    return parser;
+  }
+
+  /// Defines a flag. Throws an [ArgumentError] if:
+  ///
+  /// * There is already an option named [name].
+  /// * There is already an option using abbreviation [abbr].
+  void addFlag(String name, {String abbr, String help, bool defaultsTo: false,
+      bool negatable: true, void callback(bool value), bool hide: false}) {
+    _addOption(name, abbr, help, null, null, null, defaultsTo, callback,
+        OptionType.FLAG, negatable: negatable, hide: hide);
+  }
+
+  /// Defines a value-taking option. Throws an [ArgumentError] if:
+  ///
+  /// * There is already an option with name [name].
+  /// * There is already an option using abbreviation [abbr].
+  /// * [splitCommas] is passed but [allowMultiple] is `false`.
+  void addOption(String name, {String abbr, String help, String valueHelp,
+      List<String> allowed, Map<String, String> allowedHelp, String defaultsTo,
+      void callback(value), bool allowMultiple: false, bool splitCommas,
+      bool hide: false}) {
+    if (!allowMultiple && splitCommas != null) {
+      throw new ArgumentError(
+          'splitCommas may not be set if allowMultiple is false.');
+    }
+
+    _addOption(name, abbr, help, valueHelp, allowed, allowedHelp, defaultsTo,
+        callback, allowMultiple ? OptionType.MULTIPLE : OptionType.SINGLE,
+        splitCommas: splitCommas, hide: hide);
+  }
+
+  void _addOption(String name, String abbr, String help, String valueHelp,
+      List<String> allowed, Map<String, String> allowedHelp, defaultsTo,
+      void callback(value), OptionType type,
+      {bool negatable: false, bool splitCommas, bool hide: false}) {
+    // Make sure the name isn't in use.
+    if (_options.containsKey(name)) {
+      throw new ArgumentError('Duplicate option "$name".');
+    }
+
+    // Make sure the abbreviation isn't too long or in use.
+    if (abbr != null) {
+      var existing = findByAbbreviation(abbr);
+      if (existing != null) {
+        throw new ArgumentError(
+            'Abbreviation "$abbr" is already used by "${existing.name}".');
+      }
+    }
+
+    var option = newOption(name, abbr, help, valueHelp, allowed,
+        allowedHelp, defaultsTo, callback, type,
+        negatable: negatable, splitCommas: splitCommas, hide: hide);
+    _options[name] = option;
+    _optionsAndSeparators.add(option);
+  }
+
+  /// Adds a separator line to the usage.
+  ///
+  /// In the usage text for the parser, this will appear between any options
+  /// added before this call and ones added after it.
+  void addSeparator(String text) {
+    _optionsAndSeparators.add(text);
+  }
+
+  /// Parses [args], a list of command-line arguments, matches them against the
+  /// flags and options defined by this parser, and returns the result.
+  ArgResults parse(List<String> args) =>
+      new Parser(null, this, args.toList(), null, null).parse();
+
+  /// Generates a string displaying usage information for the defined options.
+  ///
+  /// This is basically the help text shown on the command line.
+  @Deprecated("Replaced with get usage. getUsage() will be removed in args 1.0")
+  String getUsage() => usage;
+
+  /// Generates a string displaying usage information for the defined options.
+  ///
+  /// This is basically the help text shown on the command line.
+  String get usage => new Usage(_optionsAndSeparators).generate();
+
+  /// Get the default value for an option. Useful after parsing to test if the
+  /// user specified something other than the default.
+  getDefault(String option) {
+    if (!options.containsKey(option)) {
+      throw new ArgumentError('No option named $option');
+    }
+    return options[option].defaultValue;
+  }
+
+  /// Finds the option whose abbreviation is [abbr], or `null` if no option has
+  /// that abbreviation.
+  Option findByAbbreviation(String abbr) {
+    return options.values.firstWhere((option) => option.abbreviation == abbr,
+        orElse: () => null);
+  }
+}
diff --git a/mojo/public/dart/third_party/args/lib/src/arg_results.dart b/mojo/public/dart/third_party/args/lib/src/arg_results.dart
new file mode 100644
index 0000000..6be2de4
--- /dev/null
+++ b/mojo/public/dart/third_party/args/lib/src/arg_results.dart
@@ -0,0 +1,96 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library args.src.arg_results;
+
+import 'dart:collection';
+
+import 'arg_parser.dart';
+
+/// Creates a new [ArgResults].
+///
+/// Since [ArgResults] doesn't have a public constructor, this lets [Parser]
+/// get to it. This function isn't exported to the public API of the package.
+ArgResults newArgResults(ArgParser parser, Map<String, dynamic> parsed,
+    String name, ArgResults command, List<String> rest,
+    List<String> arguments) {
+  return new ArgResults._(parser, parsed, name, command, rest, arguments);
+}
+
+/// The results of parsing a series of command line arguments using
+/// [ArgParser.parse()].
+///
+/// Includes the parsed options and any remaining unparsed command line
+/// arguments.
+class ArgResults {
+  /// The [ArgParser] whose options were parsed for these results.
+  final ArgParser _parser;
+
+  /// The option values that were parsed from arguments.
+  final Map<String, dynamic> _parsed;
+
+  /// If these are the results for parsing a command's options, this will be the
+  /// name of the command. For top-level results, this returns `null`.
+  final String name;
+
+  /// The command that was selected, or `null` if none was.
+  ///
+  /// This will contain the options that were selected for that command.
+  final ArgResults command;
+
+  /// The remaining command-line arguments that were not parsed as options or
+  /// flags.
+  ///
+  /// If `--` was used to separate the options from the remaining arguments,
+  /// it will not be included in this list unless parsing stopped before the
+  /// `--` was reached.
+  final List<String> rest;
+
+  /// The original list of arguments that were parsed.
+  final List<String> arguments;
+
+  /// Creates a new [ArgResults].
+  ArgResults._(this._parser, this._parsed, this.name, this.command,
+      List<String> rest, List<String> arguments)
+      : this.rest = new UnmodifiableListView(rest),
+        this.arguments = new UnmodifiableListView(arguments);
+
+  /// Gets the parsed command-line option named [name].
+  operator [](String name) {
+    if (!_parser.options.containsKey(name)) {
+      throw new ArgumentError('Could not find an option named "$name".');
+    }
+
+    return _parser.options[name].getOrDefault(_parsed[name]);
+  }
+
+  /// Get the names of the available options as an [Iterable].
+  ///
+  /// This includes the options whose values were parsed or that have defaults.
+  /// Options that weren't present and have no default will be omitted.
+  Iterable<String> get options {
+    var result = new Set<String>.from(_parsed.keys);
+
+    // Include the options that have defaults.
+    _parser.options.forEach((name, option) {
+      if (option.defaultValue != null) result.add(name);
+    });
+
+    return result;
+  }
+
+  /// Returns `true` if the option with [name] was parsed from an actual
+  /// argument.
+  ///
+  /// Returns `false` if it wasn't provided and the default value or no default
+  /// value would be used instead.
+  bool wasParsed(String name) {
+    var option = _parser.options[name];
+    if (option == null) {
+      throw new ArgumentError('Could not find an option named "$name".');
+    }
+
+    return _parsed.containsKey(name);
+  }
+}
diff --git a/mojo/public/dart/third_party/args/lib/src/help_command.dart b/mojo/public/dart/third_party/args/lib/src/help_command.dart
new file mode 100644
index 0000000..f477b47
--- /dev/null
+++ b/mojo/public/dart/third_party/args/lib/src/help_command.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library args.help_command;
+
+import '../command_runner.dart';
+
+/// The built-in help command that's added to every [CommandRunner].
+///
+/// This command displays help information for the various subcommands.
+class HelpCommand extends Command {
+  final name = "help";
+  String get description =>
+      "Display help information for ${runner.executableName}.";
+  String get invocation => "${runner.executableName} help [command]";
+
+  void run() {
+    // Show the default help if no command was specified.
+    if (argResults.rest.isEmpty) {
+      runner.printUsage();
+      return;
+    }
+
+    // Walk the command tree to show help for the selected command or
+    // subcommand.
+    var commands = runner.commands;
+    var command = null;
+    var commandString = runner.executableName;
+
+    for (var name in argResults.rest) {
+      if (commands.isEmpty) {
+        command.usageException(
+            'Command "$commandString" does not expect a subcommand.');
+      }
+
+      if (commands[name] == null) {
+        if (command == null) {
+          runner.usageException('Could not find a command named "$name".');
+        }
+
+        command.usageException(
+            'Could not find a subcommand named "$name" for "$commandString".');
+      }
+
+      command = commands[name];
+      commands = command.subcommands;
+      commandString += " $name";
+    }
+
+    command.printUsage();
+  }
+}
diff --git a/mojo/public/dart/third_party/args/lib/src/option.dart b/mojo/public/dart/third_party/args/lib/src/option.dart
new file mode 100644
index 0000000..07e87f6
--- /dev/null
+++ b/mojo/public/dart/third_party/args/lib/src/option.dart
@@ -0,0 +1,134 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library args.src.option;
+
+import 'dart:collection';
+
+/// Creates a new [Option].
+///
+/// Since [Option] doesn't have a public constructor, this lets [ArgParser]
+/// get to it. This function isn't exported to the public API of the package.
+Option newOption(String name, String abbreviation, String help,
+    String valueHelp, List<String> allowed, Map<String, String> allowedHelp,
+    defaultValue, Function callback, OptionType type,
+    {bool negatable, bool splitCommas, bool hide: false}) {
+  return new Option._(name, abbreviation, help, valueHelp, allowed, allowedHelp,
+      defaultValue, callback, type, negatable: negatable,
+      splitCommas: splitCommas, hide: hide);
+}
+
+/// A command-line option. Includes both flags and options which take a value.
+class Option {
+  final String name;
+  final String abbreviation;
+  final List<String> allowed;
+  final defaultValue;
+  final Function callback;
+  final String help;
+  final String valueHelp;
+  final Map<String, String> allowedHelp;
+  final OptionType type;
+  final bool negatable;
+  final bool splitCommas;
+  final bool hide;
+
+  /// Whether the option is boolean-valued flag.
+  bool get isFlag => type == OptionType.FLAG;
+
+  /// Whether the option takes a single value.
+  bool get isSingle => type == OptionType.SINGLE;
+
+  /// Whether the option allows multiple values.
+  bool get isMultiple => type == OptionType.MULTIPLE;
+
+  Option._(this.name, this.abbreviation, this.help, this.valueHelp,
+      List<String> allowed, Map<String, String> allowedHelp, this.defaultValue,
+      this.callback, OptionType type, {this.negatable, bool splitCommas,
+      this.hide: false})
+      : this.allowed = allowed == null
+          ? null
+          : new UnmodifiableListView(allowed),
+        this.allowedHelp = allowedHelp == null
+            ? null
+            : new UnmodifiableMapView(allowedHelp),
+        this.type = type,
+        // If the user doesn't specify [splitCommas], it defaults to true for
+        // multiple options.
+        this.splitCommas = splitCommas == null
+            ? type == OptionType.MULTIPLE
+            : splitCommas {
+    if (name.isEmpty) {
+      throw new ArgumentError('Name cannot be empty.');
+    } else if (name.startsWith('-')) {
+      throw new ArgumentError('Name $name cannot start with "-".');
+    }
+
+    // Ensure name does not contain any invalid characters.
+    if (_invalidChars.hasMatch(name)) {
+      throw new ArgumentError('Name "$name" contains invalid characters.');
+    }
+
+    if (abbreviation != null) {
+      if (abbreviation.length != 1) {
+        throw new ArgumentError('Abbreviation must be null or have length 1.');
+      } else if (abbreviation == '-') {
+        throw new ArgumentError('Abbreviation cannot be "-".');
+      }
+
+      if (_invalidChars.hasMatch(abbreviation)) {
+        throw new ArgumentError('Abbreviation is an invalid character.');
+      }
+    }
+  }
+
+  /// Returns [value] if non-`null`, otherwise returns the default value for
+  /// this option.
+  ///
+  /// For single-valued options, it will be [defaultValue] if set or `null`
+  /// otherwise. For multiple-valued options, it will be an empty list or a
+  /// list containing [defaultValue] if set.
+  dynamic getOrDefault(value) {
+    if (value != null) return value;
+
+    if (!isMultiple) return defaultValue;
+    if (defaultValue != null) return [defaultValue];
+    return [];
+  }
+
+  static final _invalidChars = new RegExp(r'''[ \t\r\n"'\\/]''');
+}
+
+/// What kinds of values an option accepts.
+class OptionType {
+  /// An option that can only be `true` or `false`.
+  ///
+  /// The presence of the option name itself in the argument list means `true`.
+  static const FLAG = const OptionType._("OptionType.FLAG");
+
+  /// An option that takes a single value.
+  ///
+  /// Examples:
+  ///
+  ///     --mode debug
+  ///     -mdebug
+  ///     --mode=debug
+  ///
+  /// If the option is passed more than once, the last one wins.
+  static const SINGLE = const OptionType._("OptionType.SINGLE");
+
+  /// An option that allows multiple values.
+  ///
+  /// Example:
+  ///
+  ///     --output text --output xml
+  ///
+  /// In the parsed [ArgResults], a multiple-valued option will always return
+  /// a list, even if one or no values were passed.
+  static const MULTIPLE = const OptionType._("OptionType.MULTIPLE");
+
+  final String name;
+
+  const OptionType._(this.name);
+}
diff --git a/mojo/public/dart/third_party/args/lib/src/parser.dart b/mojo/public/dart/third_party/args/lib/src/parser.dart
new file mode 100644
index 0000000..a10692d
--- /dev/null
+++ b/mojo/public/dart/third_party/args/lib/src/parser.dart
@@ -0,0 +1,289 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library args.src.parser;
+
+import 'arg_parser.dart';
+import 'arg_results.dart';
+import 'option.dart';
+
+final _SOLO_OPT = new RegExp(r'^-([a-zA-Z0-9])$');
+final _ABBR_OPT = new RegExp(r'^-([a-zA-Z0-9]+)(.*)$');
+final _LONG_OPT = new RegExp(r'^--([a-zA-Z\-_0-9]+)(=(.*))?$');
+
+/// The actual argument parsing class.
+///
+/// Unlike [ArgParser] which is really more an "arg grammar", this is the class
+/// that does the parsing and holds the mutable state required during a parse.
+class Parser {
+  /// If parser is parsing a command's options, this will be the name of the
+  /// command. For top-level results, this returns `null`.
+  final String commandName;
+
+  /// The parser for the supercommand of this command parser, or `null` if this
+  /// is the top-level parser.
+  final Parser parent;
+
+  /// The grammar being parsed.
+  final ArgParser grammar;
+
+  /// The arguments being parsed.
+  final List<String> args;
+
+  /// The remaining non-option, non-command arguments.
+  final rest = <String>[];
+
+  /// The accumulated parsed options.
+  final Map<String, dynamic> results = <String, dynamic>{};
+
+  Parser(this.commandName, this.grammar, this.args, this.parent, rest) {
+    if (rest != null) this.rest.addAll(rest);
+  }
+
+  /// The current argument being parsed.
+  String get current => args[0];
+
+  /// Parses the arguments. This can only be called once.
+  ArgResults parse() {
+    var arguments = args.toList();
+    var commandResults = null;
+
+    // Parse the args.
+    while (args.length > 0) {
+      if (current == '--') {
+        // Reached the argument terminator, so stop here.
+        args.removeAt(0);
+        break;
+      }
+
+      // Try to parse the current argument as a command. This happens before
+      // options so that commands can have option-like names.
+      var command = grammar.commands[current];
+      if (command != null) {
+        validate(rest.isEmpty, 'Cannot specify arguments before a command.');
+        var commandName = args.removeAt(0);
+        var commandParser = new Parser(commandName, command, args, this, rest);
+        commandResults = commandParser.parse();
+
+        // All remaining arguments were passed to command so clear them here.
+        rest.clear();
+        break;
+      }
+
+      // Try to parse the current argument as an option. Note that the order
+      // here matters.
+      if (parseSoloOption()) continue;
+      if (parseAbbreviation(this)) continue;
+      if (parseLongOption()) continue;
+
+      // This argument is neither option nor command, so stop parsing unless
+      // the [allowTrailingOptions] option is set.
+      if (!grammar.allowTrailingOptions) break;
+      rest.add(args.removeAt(0));
+    }
+
+    // Invoke the callbacks.
+    grammar.options.forEach((name, option) {
+      if (option.callback == null) return;
+      option.callback(option.getOrDefault(results[name]));
+    });
+
+    // Add in the leftover arguments we didn't parse to the innermost command.
+    rest.addAll(args);
+    args.clear();
+    return newArgResults(
+        grammar, results, commandName, commandResults, rest, arguments);
+  }
+
+  /// Pulls the value for [option] from the second argument in [args].
+  ///
+  /// Validates that there is a valid value there.
+  void readNextArgAsValue(Option option) {
+    // Take the option argument from the next command line arg.
+    validate(args.length > 0, 'Missing argument for "${option.name}".');
+
+    setOption(results, option, current);
+    args.removeAt(0);
+  }
+
+  /// Tries to parse the current argument as a "solo" option, which is a single
+  /// hyphen followed by a single letter.
+  ///
+  /// We treat this differently than collapsed abbreviations (like "-abc") to
+  /// handle the possible value that may follow it.
+  bool parseSoloOption() {
+    var soloOpt = _SOLO_OPT.firstMatch(current);
+    if (soloOpt == null) return false;
+
+    var option = grammar.findByAbbreviation(soloOpt[1]);
+    if (option == null) {
+      // Walk up to the parent command if possible.
+      validate(
+          parent != null, 'Could not find an option or flag "-${soloOpt[1]}".');
+      return parent.parseSoloOption();
+    }
+
+    args.removeAt(0);
+
+    if (option.isFlag) {
+      setFlag(results, option, true);
+    } else {
+      readNextArgAsValue(option);
+    }
+
+    return true;
+  }
+
+  /// Tries to parse the current argument as a series of collapsed abbreviations
+  /// (like "-abc") or a single abbreviation with the value directly attached
+  /// to it (like "-mrelease").
+  bool parseAbbreviation(Parser innermostCommand) {
+    var abbrOpt = _ABBR_OPT.firstMatch(current);
+    if (abbrOpt == null) return false;
+
+    // If the first character is the abbreviation for a non-flag option, then
+    // the rest is the value.
+    var c = abbrOpt[1].substring(0, 1);
+    var first = grammar.findByAbbreviation(c);
+    if (first == null) {
+      // Walk up to the parent command if possible.
+      validate(
+          parent != null, 'Could not find an option with short name "-$c".');
+      return parent.parseAbbreviation(innermostCommand);
+    } else if (!first.isFlag) {
+      // The first character is a non-flag option, so the rest must be the
+      // value.
+      var value = '${abbrOpt[1].substring(1)}${abbrOpt[2]}';
+      setOption(results, first, value);
+    } else {
+      // If we got some non-flag characters, then it must be a value, but
+      // if we got here, it's a flag, which is wrong.
+      validate(abbrOpt[2] == '',
+          'Option "-$c" is a flag and cannot handle value '
+          '"${abbrOpt[1].substring(1)}${abbrOpt[2]}".');
+
+      // Not an option, so all characters should be flags.
+      // We use "innermostCommand" here so that if a parent command parses the
+      // *first* letter, subcommands can still be found to parse the other
+      // letters.
+      for (var i = 0; i < abbrOpt[1].length; i++) {
+        var c = abbrOpt[1].substring(i, i + 1);
+        innermostCommand.parseShortFlag(c);
+      }
+    }
+
+    args.removeAt(0);
+    return true;
+  }
+
+  void parseShortFlag(String c) {
+    var option = grammar.findByAbbreviation(c);
+    if (option == null) {
+      // Walk up to the parent command if possible.
+      validate(
+          parent != null, 'Could not find an option with short name "-$c".');
+      parent.parseShortFlag(c);
+      return;
+    }
+
+    // In a list of short options, only the first can be a non-flag. If
+    // we get here we've checked that already.
+    validate(
+        option.isFlag, 'Option "-$c" must be a flag to be in a collapsed "-".');
+
+    setFlag(results, option, true);
+  }
+
+  /// Tries to parse the current argument as a long-form named option, which
+  /// may include a value like "--mode=release" or "--mode release".
+  bool parseLongOption() {
+    var longOpt = _LONG_OPT.firstMatch(current);
+    if (longOpt == null) return false;
+
+    var name = longOpt[1];
+    var option = grammar.options[name];
+    if (option != null) {
+      args.removeAt(0);
+      if (option.isFlag) {
+        validate(longOpt[3] == null,
+            'Flag option "$name" should not be given a value.');
+
+        setFlag(results, option, true);
+      } else if (longOpt[3] != null) {
+        // We have a value like --foo=bar.
+        setOption(results, option, longOpt[3]);
+      } else {
+        // Option like --foo, so look for the value as the next arg.
+        readNextArgAsValue(option);
+      }
+    } else if (name.startsWith('no-')) {
+      // See if it's a negated flag.
+      name = name.substring('no-'.length);
+      option = grammar.options[name];
+      if (option == null) {
+        // Walk up to the parent command if possible.
+        validate(parent != null, 'Could not find an option named "$name".');
+        return parent.parseLongOption();
+      }
+
+      args.removeAt(0);
+      validate(option.isFlag, 'Cannot negate non-flag option "$name".');
+      validate(option.negatable, 'Cannot negate option "$name".');
+
+      setFlag(results, option, false);
+    } else {
+      // Walk up to the parent command if possible.
+      validate(parent != null, 'Could not find an option named "$name".');
+      return parent.parseLongOption();
+    }
+
+    return true;
+  }
+
+  /// Called during parsing to validate the arguments.
+  ///
+  /// Throws a [FormatException] if [condition] is `false`.
+  void validate(bool condition, String message) {
+    if (!condition) throw new FormatException(message);
+  }
+
+  /// Validates and stores [value] as the value for [option], which must not be
+  /// a flag.
+  void setOption(Map results, Option option, String value) {
+    assert(!option.isFlag);
+
+    if (!option.isMultiple) {
+      _validateAllowed(option, value);
+      results[option.name] = value;
+      return;
+    }
+
+    var list = results.putIfAbsent(option.name, () => []);
+
+    if (option.splitCommas) {
+      for (var element in value.split(",")) {
+        _validateAllowed(option, element);
+        list.add(element);
+      }
+    } else {
+      _validateAllowed(option, value);
+      list.add(value);
+    }
+  }
+
+  /// Validates and stores [value] as the value for [option], which must be a
+  /// flag.
+  void setFlag(Map results, Option option, bool value) {
+    assert(option.isFlag);
+    results[option.name] = value;
+  }
+
+  /// Validates that [value] is allowed as a value of [option].
+  void _validateAllowed(Option option, String value) {
+    if (option.allowed == null) return;
+
+    validate(option.allowed.contains(value),
+        '"$value" is not an allowed value for option "${option.name}".');
+  }
+}
diff --git a/mojo/public/dart/third_party/args/lib/src/usage.dart b/mojo/public/dart/third_party/args/lib/src/usage.dart
new file mode 100644
index 0000000..177a810
--- /dev/null
+++ b/mojo/public/dart/third_party/args/lib/src/usage.dart
@@ -0,0 +1,253 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library args.src.usage;
+
+import 'dart:math';
+
+import '../args.dart';
+
+/// Takes an [ArgParser] and generates a string of usage (i.e. help) text for
+/// its defined options.
+///
+/// Internally, it works like a tabular printer. The output is divided into
+/// three horizontal columns, like so:
+///
+///     -h, --help  Prints the usage information
+///     |  |        |                                 |
+///
+/// It builds the usage text up one column at a time and handles padding with
+/// spaces and wrapping to the next line to keep the cells correctly lined up.
+class Usage {
+  static const NUM_COLUMNS = 3; // Abbreviation, long name, help.
+
+  /// A list of the [Option]s intermingled with [String] separators.
+  final List optionsAndSeparators;
+
+  /// The working buffer for the generated usage text.
+  StringBuffer buffer;
+
+  /// The column that the "cursor" is currently on.
+  ///
+  /// If the next call to [write()] is not for this column, it will correctly
+  /// handle advancing to the next column (and possibly the next row).
+  int currentColumn = 0;
+
+  /// The width in characters of each column.
+  List<int> columnWidths;
+
+  /// The number of sequential lines of text that have been written to the last
+  /// column (which shows help info).
+  ///
+  /// We track this so that help text that spans multiple lines can be padded
+  /// with a blank line after it for separation. Meanwhile, sequential options
+  /// with single-line help will be compacted next to each other.
+  int numHelpLines = 0;
+
+  /// How many newlines need to be rendered before the next bit of text can be
+  /// written.
+  ///
+  /// We do this lazily so that the last bit of usage doesn't have dangling
+  /// newlines. We only write newlines right *before* we write some real
+  /// content.
+  int newlinesNeeded = 0;
+
+  Usage(this.optionsAndSeparators);
+
+  /// Generates a string displaying usage information for the defined options.
+  /// This is basically the help text shown on the command line.
+  String generate() {
+    buffer = new StringBuffer();
+
+    calculateColumnWidths();
+
+    for (var optionOrSeparator in optionsAndSeparators) {
+      if (optionOrSeparator is String) {
+        // Ensure that there's always a blank line before a separator.
+        if (buffer.isNotEmpty) buffer.write("\n\n");
+        buffer.write(optionOrSeparator);
+        newlinesNeeded = 1;
+        continue;
+      }
+
+      var option = optionOrSeparator as Option;
+      if (option.hide) continue;
+
+      write(0, getAbbreviation(option));
+      write(1, getLongOption(option));
+
+      if (option.help != null) write(2, option.help);
+
+      if (option.allowedHelp != null) {
+        var allowedNames = option.allowedHelp.keys.toList(growable: false);
+        allowedNames.sort();
+        newline();
+        for (var name in allowedNames) {
+          write(1, getAllowedTitle(name));
+          write(2, option.allowedHelp[name]);
+        }
+        newline();
+      } else if (option.allowed != null) {
+        write(2, buildAllowedList(option));
+      } else if (option.defaultValue != null) {
+        if (option.isFlag && option.defaultValue == true) {
+          write(2, '(defaults to on)');
+        } else if (!option.isFlag) {
+          write(2, '(defaults to "${option.defaultValue}")');
+        }
+      }
+
+      // If any given option displays more than one line of text on the right
+      // column (i.e. help, default value, allowed options, etc.) then put a
+      // blank line after it. This gives space where it's useful while still
+      // keeping simple one-line options clumped together.
+      if (numHelpLines > 1) newline();
+    }
+
+    return buffer.toString();
+  }
+
+  String getAbbreviation(Option option) {
+    if (option.abbreviation != null) {
+      return '-${option.abbreviation}, ';
+    } else {
+      return '';
+    }
+  }
+
+  String getLongOption(Option option) {
+    var result;
+    if (option.negatable) {
+      result = '--[no-]${option.name}';
+    } else {
+      result = '--${option.name}';
+    }
+
+    if (option.valueHelp != null) result += "=<${option.valueHelp}>";
+
+    return result;
+  }
+
+  String getAllowedTitle(String allowed) {
+    return '      [$allowed]';
+  }
+
+  void calculateColumnWidths() {
+    int abbr = 0;
+    int title = 0;
+    for (var option in optionsAndSeparators) {
+      if (option is! Option) continue;
+      if (option.hide) continue;
+
+      // Make room in the first column if there are abbreviations.
+      abbr = max(abbr, getAbbreviation(option).length);
+
+      // Make room for the option.
+      title = max(title, getLongOption(option).length);
+
+      // Make room for the allowed help.
+      if (option.allowedHelp != null) {
+        for (var allowed in option.allowedHelp.keys) {
+          title = max(title, getAllowedTitle(allowed).length);
+        }
+      }
+    }
+
+    // Leave a gutter between the columns.
+    title += 4;
+    columnWidths = [abbr, title];
+  }
+
+  void newline() {
+    newlinesNeeded++;
+    currentColumn = 0;
+    numHelpLines = 0;
+  }
+
+  void write(int column, String text) {
+    var lines = text.split('\n');
+
+    // Strip leading and trailing empty lines.
+    while (lines.length > 0 && lines[0].trim() == '') {
+      lines.removeRange(0, 1);
+    }
+
+    while (lines.length > 0 && lines[lines.length - 1].trim() == '') {
+      lines.removeLast();
+    }
+
+    for (var line in lines) {
+      writeLine(column, line);
+    }
+  }
+
+  void writeLine(int column, String text) {
+    // Write any pending newlines.
+    while (newlinesNeeded > 0) {
+      buffer.write('\n');
+      newlinesNeeded--;
+    }
+
+    // Advance until we are at the right column (which may mean wrapping around
+    // to the next line.
+    while (currentColumn != column) {
+      if (currentColumn < NUM_COLUMNS - 1) {
+        buffer.write(padRight('', columnWidths[currentColumn]));
+      } else {
+        buffer.write('\n');
+      }
+      currentColumn = (currentColumn + 1) % NUM_COLUMNS;
+    }
+
+    if (column < columnWidths.length) {
+      // Fixed-size column, so pad it.
+      buffer.write(padRight(text, columnWidths[column]));
+    } else {
+      // The last column, so just write it.
+      buffer.write(text);
+    }
+
+    // Advance to the next column.
+    currentColumn = (currentColumn + 1) % NUM_COLUMNS;
+
+    // If we reached the last column, we need to wrap to the next line.
+    if (column == NUM_COLUMNS - 1) newlinesNeeded++;
+
+    // Keep track of how many consecutive lines we've written in the last
+    // column.
+    if (column == NUM_COLUMNS - 1) {
+      numHelpLines++;
+    } else {
+      numHelpLines = 0;
+    }
+  }
+
+  String buildAllowedList(Option option) {
+    var allowedBuffer = new StringBuffer();
+    allowedBuffer.write('[');
+    bool first = true;
+    for (var allowed in option.allowed) {
+      if (!first) allowedBuffer.write(', ');
+      allowedBuffer.write(allowed);
+      if (allowed == option.defaultValue) {
+        allowedBuffer.write(' (default)');
+      }
+      first = false;
+    }
+    allowedBuffer.write(']');
+    return allowedBuffer.toString();
+  }
+}
+
+/// Pads [source] to [length] by adding spaces at the end.
+String padRight(String source, int length) {
+  final result = new StringBuffer();
+  result.write(source);
+
+  while (result.length < length) {
+    result.write(' ');
+  }
+
+  return result.toString();
+}
diff --git a/mojo/public/dart/third_party/args/lib/src/usage_exception.dart b/mojo/public/dart/third_party/args/lib/src/usage_exception.dart
new file mode 100644
index 0000000..35cc744
--- /dev/null
+++ b/mojo/public/dart/third_party/args/lib/src/usage_exception.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library args.usage_exception;
+
+class UsageException implements Exception {
+  final String message;
+  final String usage;
+
+  UsageException(this.message, this.usage);
+
+  String toString() => "$message\n\n$usage";
+}
diff --git a/mojo/public/dart/third_party/args/lib/src/utils.dart b/mojo/public/dart/third_party/args/lib/src/utils.dart
new file mode 100644
index 0000000..dc355df
--- /dev/null
+++ b/mojo/public/dart/third_party/args/lib/src/utils.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library args.utils;
+
+/// Pads [source] to [length] by adding spaces at the end.
+String padRight(String source, int length) =>
+    source + ' ' * (length - source.length);
diff --git a/mojo/public/dart/third_party/args/pubspec.yaml b/mojo/public/dart/third_party/args/pubspec.yaml
new file mode 100644
index 0000000..3ea1a11
--- /dev/null
+++ b/mojo/public/dart/third_party/args/pubspec.yaml
@@ -0,0 +1,12 @@
+name: args
+version: 0.13.2
+author: "Dart Team <misc@dartlang.org>"
+homepage: https://github.com/dart-lang/args
+description: >
+ Library for defining parsers for parsing raw command-line arguments into
+ a set of options and values using GNU and POSIX style options.
+
+dev_dependencies:
+  test: ">=0.12.0 <0.13.0"
+environment:
+  sdk: ">=1.4.0 <2.0.0"
diff --git a/mojo/public/dart/third_party/args/test/args_test.dart b/mojo/public/dart/third_party/args/test/args_test.dart
new file mode 100644
index 0000000..ee37b45
--- /dev/null
+++ b/mojo/public/dart/third_party/args/test/args_test.dart
@@ -0,0 +1,320 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library args_test;
+
+import 'package:test/test.dart';
+import 'package:args/args.dart';
+import 'utils.dart';
+
+void main() {
+  group('ArgParser.addFlag()', () {
+    test('throws ArgumentError if the flag already exists', () {
+      var parser = new ArgParser();
+      parser.addFlag('foo');
+      throwsIllegalArg(() => parser.addFlag('foo'));
+    });
+
+    test('throws ArgumentError if the option already exists', () {
+      var parser = new ArgParser();
+      parser.addOption('foo');
+      throwsIllegalArg(() => parser.addFlag('foo'));
+    });
+
+    test('throws ArgumentError if the abbreviation exists', () {
+      var parser = new ArgParser();
+      parser.addFlag('foo', abbr: 'f');
+      throwsIllegalArg(() => parser.addFlag('flummox', abbr: 'f'));
+    });
+
+    test('throws ArgumentError if the abbreviation is longer '
+        'than one character', () {
+      var parser = new ArgParser();
+      throwsIllegalArg(() => parser.addFlag('flummox', abbr: 'flu'));
+    });
+
+    test('throws ArgumentError if a flag name is invalid', () {
+      var parser = new ArgParser();
+
+      for (var name in _INVALID_OPTIONS) {
+        var reason = '${Error.safeToString(name)} is not valid';
+        throwsIllegalArg(() => parser.addFlag(name), reason: reason);
+      }
+    });
+
+    test('accepts valid flag names', () {
+      var parser = new ArgParser();
+
+      for (var name in _VALID_OPTIONS) {
+        var reason = '${Error.safeToString(name)} is valid';
+        expect(() => parser.addFlag(name), returnsNormally, reason: reason);
+      }
+    });
+  });
+
+  group('ArgParser.addOption()', () {
+    test('throws ArgumentError if the flag already exists', () {
+      var parser = new ArgParser();
+      parser.addFlag('foo');
+      throwsIllegalArg(() => parser.addOption('foo'));
+    });
+
+    test('throws ArgumentError if the option already exists', () {
+      var parser = new ArgParser();
+      parser.addOption('foo');
+      throwsIllegalArg(() => parser.addOption('foo'));
+    });
+
+    test('throws ArgumentError if the abbreviation exists', () {
+      var parser = new ArgParser();
+      parser.addFlag('foo', abbr: 'f');
+      throwsIllegalArg(() => parser.addOption('flummox', abbr: 'f'));
+    });
+
+    test('throws ArgumentError if the abbreviation is longer '
+        'than one character', () {
+      var parser = new ArgParser();
+      throwsIllegalArg(() => parser.addOption('flummox', abbr: 'flu'));
+    });
+
+    test('throws ArgumentError if the abbreviation is empty', () {
+      var parser = new ArgParser();
+      throwsIllegalArg(() => parser.addOption('flummox', abbr: ''));
+    });
+
+    test('throws ArgumentError if the abbreviation is an invalid value', () {
+      var parser = new ArgParser();
+      for (var name in _INVALID_OPTIONS.where((v) => v != null)) {
+        throwsIllegalArg(() => parser.addOption('flummox', abbr: name));
+      }
+    });
+
+    test('throws ArgumentError if the abbreviation is a dash', () {
+      var parser = new ArgParser();
+      throwsIllegalArg(() => parser.addOption('flummox', abbr: '-'));
+    });
+
+    test('allows explict null value for "abbr"', () {
+      var parser = new ArgParser();
+      expect(() => parser.addOption('flummox', abbr: null), returnsNormally);
+    });
+
+    test('throws ArgumentError if an option name is invalid', () {
+      var parser = new ArgParser();
+
+      for (var name in _INVALID_OPTIONS) {
+        var reason = '${Error.safeToString(name)} is not valid';
+        throwsIllegalArg(() => parser.addOption(name), reason: reason);
+      }
+    });
+
+    test('throws ArgumentError if splitCommas is passed with allowMultiple: '
+        'false', () {
+      var parser = new ArgParser();
+      throwsIllegalArg(() => parser.addOption('flummox', splitCommas: true));
+      throwsIllegalArg(() => parser.addOption('flummox', splitCommas: false));
+    });
+
+    test('accepts valid option names', () {
+      var parser = new ArgParser();
+
+      for (var name in _VALID_OPTIONS) {
+        var reason = '${Error.safeToString(name)} is valid';
+        expect(() => parser.addOption(name), returnsNormally, reason: reason);
+      }
+    });
+  });
+
+  group('ArgParser.getDefault()', () {
+    test('returns the default value for an option', () {
+      var parser = new ArgParser();
+      parser.addOption('mode', defaultsTo: 'debug');
+      expect(parser.getDefault('mode'), 'debug');
+    });
+
+    test('throws if the option is unknown', () {
+      var parser = new ArgParser();
+      parser.addOption('mode', defaultsTo: 'debug');
+      throwsIllegalArg(() => parser.getDefault('undefined'));
+    });
+  });
+
+  group('ArgParser.commands', () {
+    test('returns an empty map if there are no commands', () {
+      var parser = new ArgParser();
+      expect(parser.commands, isEmpty);
+    });
+
+    test('returns the commands that were added', () {
+      var parser = new ArgParser();
+      parser.addCommand('hide');
+      parser.addCommand('seek');
+      expect(parser.commands, hasLength(2));
+      expect(parser.commands['hide'], isNotNull);
+      expect(parser.commands['seek'], isNotNull);
+    });
+
+    test('iterates over the commands in the order they were added', () {
+      var parser = new ArgParser();
+      parser.addCommand('a');
+      parser.addCommand('d');
+      parser.addCommand('b');
+      parser.addCommand('c');
+      expect(parser.commands.keys, equals(['a', 'd', 'b', 'c']));
+    });
+  });
+
+  group('ArgParser.options', () {
+    test('returns an empty map if there are no options', () {
+      var parser = new ArgParser();
+      expect(parser.options, isEmpty);
+    });
+
+    test('returns the options that were added', () {
+      var parser = new ArgParser();
+      parser.addFlag('hide');
+      parser.addOption('seek');
+      expect(parser.options, hasLength(2));
+      expect(parser.options['hide'], isNotNull);
+      expect(parser.options['seek'], isNotNull);
+    });
+
+    test('iterates over the options in the order they were added', () {
+      var parser = new ArgParser();
+      parser.addFlag('a');
+      parser.addOption('d');
+      parser.addFlag('b');
+      parser.addOption('c');
+      expect(parser.options.keys, equals(['a', 'd', 'b', 'c']));
+    });
+  });
+
+  group('ArgResults', () {
+    group('options', () {
+      test('returns the provided options', () {
+        var parser = new ArgParser();
+        parser.addFlag('woof');
+        parser.addOption('meow');
+
+        parser.addOption('missing-option');
+        parser.addFlag('missing-flag', defaultsTo: null);
+
+        var args = parser.parse(['--woof', '--meow', 'kitty']);
+        expect(args.options, hasLength(2));
+        expect(args.options, contains('woof'));
+        expect(args.options, contains('meow'));
+      });
+
+      test('includes defaulted options', () {
+        var parser = new ArgParser();
+        parser.addFlag('woof', defaultsTo: false);
+        parser.addOption('meow', defaultsTo: 'kitty');
+
+        // Flags normally have a default value.
+        parser.addFlag('moo');
+
+        parser.addOption('missing-option');
+        parser.addFlag('missing-flag', defaultsTo: null);
+
+        var args = parser.parse([]);
+        expect(args.options, hasLength(3));
+        expect(args.options, contains('woof'));
+        expect(args.options, contains('meow'));
+        expect(args.options, contains('moo'));
+      });
+    });
+
+    test('[] throws if the name is not an option', () {
+      var results = new ArgParser().parse([]);
+      throwsIllegalArg(() => results['unknown']);
+    });
+
+    test('rest cannot be modified', () {
+      var results = new ArgParser().parse([]);
+      expect(() => results.rest.add('oops'), throwsUnsupportedError);
+    });
+
+    test('.arguments returns the original argument list', () {
+      var parser = new ArgParser();
+      parser.addFlag('foo');
+
+      var results = parser.parse(['--foo']);
+      expect(results.arguments, equals(['--foo']));
+    });
+
+    group('.wasParsed()', () {
+      test('throws if the name is not an option', () {
+        var results = new ArgParser().parse([]);
+        throwsIllegalArg(() => results.wasParsed('unknown'));
+      });
+
+      test('returns true for parsed options', () {
+        var parser = new ArgParser();
+        parser.addFlag('fast');
+        parser.addFlag('verbose');
+        parser.addOption('mode');
+        parser.addOption('output');
+
+        var results = parser.parse(['--fast', '--mode=debug']);
+
+        expect(results.wasParsed('fast'), isTrue);
+        expect(results.wasParsed('verbose'), isFalse);
+        expect(results.wasParsed('mode'), isTrue);
+        expect(results.wasParsed('output'), isFalse);
+      });
+    });
+  });
+
+  group('Option', () {
+    test('.getOrDefault() returns a type-specific default value', () {
+      var parser = new ArgParser();
+      parser.addFlag('flag-no', defaultsTo: null);
+      parser.addFlag('flag-def', defaultsTo: true);
+      parser.addOption('single-no');
+      parser.addOption('single-def', defaultsTo: 'def');
+      parser.addOption('multi-no', allowMultiple: true);
+      parser.addOption('multi-def', allowMultiple: true, defaultsTo: 'def');
+
+      expect(parser.options['flag-no'].getOrDefault(null), equals(null));
+      expect(parser.options['flag-no'].getOrDefault(false), equals(false));
+      expect(parser.options['flag-def'].getOrDefault(null), equals(true));
+      expect(parser.options['flag-def'].getOrDefault(false), equals(false));
+      expect(parser.options['single-no'].getOrDefault(null), equals(null));
+      expect(parser.options['single-no'].getOrDefault('v'), equals('v'));
+      expect(parser.options['single-def'].getOrDefault(null), equals('def'));
+      expect(parser.options['single-def'].getOrDefault('v'), equals('v'));
+      expect(parser.options['multi-no'].getOrDefault(null), equals([]));
+      expect(parser.options['multi-no'].getOrDefault(['v']), equals(['v']));
+      expect(parser.options['multi-def'].getOrDefault(null), equals(['def']));
+      expect(parser.options['multi-def'].getOrDefault(['v']), equals(['v']));
+    });
+  });
+}
+
+const _INVALID_OPTIONS = const [
+  ' ',
+  '',
+  '-',
+  '--',
+  '--foo',
+  ' with space',
+  'with\ttab',
+  'with\rcarriage\rreturn',
+  'with\nline\nfeed',
+  "'singlequotes'",
+  '"doublequotes"',
+  'back\\slash',
+  'forward/slash'
+];
+
+const _VALID_OPTIONS = const [
+  'a', // One character.
+  'contains-dash',
+  'contains_underscore',
+  'ends-with-dash-',
+  'contains--doubledash--',
+  '1starts-with-number',
+  'contains-a-1number',
+  'ends-with-a-number8'
+];
diff --git a/mojo/public/dart/third_party/args/test/command_parse_test.dart b/mojo/public/dart/third_party/args/test/command_parse_test.dart
new file mode 100644
index 0000000..54b3032
--- /dev/null
+++ b/mojo/public/dart/third_party/args/test/command_parse_test.dart
@@ -0,0 +1,205 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library command_parse_test;
+
+import 'package:test/test.dart';
+import 'package:args/args.dart';
+import 'utils.dart';
+
+void main() {
+  group('ArgParser.addCommand()', () {
+    test('creates a new ArgParser if none is given', () {
+      var parser = new ArgParser();
+      var command = parser.addCommand('install');
+      expect(parser.commands['install'], equals(command));
+      expect(command is ArgParser, isTrue);
+    });
+
+    test('uses the command parser if given one', () {
+      var parser = new ArgParser();
+      var command = new ArgParser();
+      var result = parser.addCommand('install', command);
+      expect(parser.commands['install'], equals(command));
+      expect(result, equals(command));
+    });
+
+    test('throws on a duplicate command name', () {
+      var parser = new ArgParser();
+      parser.addCommand('install');
+      throwsIllegalArg(() => parser.addCommand('install'));
+    });
+  });
+
+  group('ArgParser.parse()', () {
+    test('parses a command', () {
+      var parser = new ArgParser()..addCommand('install');
+
+      var args = parser.parse(['install']);
+
+      expect(args.command.name, equals('install'));
+      expect(args.rest, isEmpty);
+    });
+
+    test('parses a command option', () {
+      var parser = new ArgParser();
+      var command = parser.addCommand('install');
+      command.addOption('path');
+
+      var args = parser.parse(['install', '--path', 'some/path']);
+      expect(args.command['path'], equals('some/path'));
+    });
+
+    test('parses a parent solo option before the command', () {
+      var parser = new ArgParser()
+        ..addOption('mode', abbr: 'm')
+        ..addCommand('install');
+
+      var args = parser.parse(['-m', 'debug', 'install']);
+      expect(args['mode'], equals('debug'));
+      expect(args.command.name, equals('install'));
+    });
+
+    test('parses a parent solo option after the command', () {
+      var parser = new ArgParser()
+        ..addOption('mode', abbr: 'm')
+        ..addCommand('install');
+
+      var args = parser.parse(['install', '-m', 'debug']);
+      expect(args['mode'], equals('debug'));
+      expect(args.command.name, equals('install'));
+    });
+
+    test('parses a parent option before the command', () {
+      var parser = new ArgParser()
+        ..addFlag('verbose')
+        ..addCommand('install');
+
+      var args = parser.parse(['--verbose', 'install']);
+      expect(args['verbose'], isTrue);
+      expect(args.command.name, equals('install'));
+    });
+
+    test('parses a parent option after the command', () {
+      var parser = new ArgParser()
+        ..addFlag('verbose')
+        ..addCommand('install');
+
+      var args = parser.parse(['install', '--verbose']);
+      expect(args['verbose'], isTrue);
+      expect(args.command.name, equals('install'));
+    });
+
+    test('parses a parent negated option before the command', () {
+      var parser = new ArgParser()
+        ..addFlag('verbose', defaultsTo: true)
+        ..addCommand('install');
+
+      var args = parser.parse(['--no-verbose', 'install']);
+      expect(args['verbose'], isFalse);
+      expect(args.command.name, equals('install'));
+    });
+
+    test('parses a parent negated option after the command', () {
+      var parser = new ArgParser()
+        ..addFlag('verbose', defaultsTo: true)
+        ..addCommand('install');
+
+      var args = parser.parse(['install', '--no-verbose']);
+      expect(args['verbose'], isFalse);
+      expect(args.command.name, equals('install'));
+    });
+
+    test('parses a parent abbreviation before the command', () {
+      var parser = new ArgParser()
+        ..addFlag('debug', abbr: 'd')
+        ..addFlag('verbose', abbr: 'v')
+        ..addCommand('install');
+
+      var args = parser.parse(['-dv', 'install']);
+      expect(args['debug'], isTrue);
+      expect(args['verbose'], isTrue);
+      expect(args.command.name, equals('install'));
+    });
+
+    test('parses a parent abbreviation after the command', () {
+      var parser = new ArgParser()
+        ..addFlag('debug', abbr: 'd')
+        ..addFlag('verbose', abbr: 'v')
+        ..addCommand('install');
+
+      var args = parser.parse(['install', '-dv']);
+      expect(args['debug'], isTrue);
+      expect(args['verbose'], isTrue);
+      expect(args.command.name, equals('install'));
+    });
+
+    test('does not parse a solo command option before the command', () {
+      var parser = new ArgParser();
+      var command = parser.addCommand('install');
+      command.addOption('path', abbr: 'p');
+
+      throwsFormat(parser, ['-p', 'foo', 'install']);
+    });
+
+    test('does not parse a command option before the command', () {
+      var parser = new ArgParser();
+      var command = parser.addCommand('install');
+      command.addOption('path');
+
+      throwsFormat(parser, ['--path', 'foo', 'install']);
+    });
+
+    test('does not parse a command abbreviation before the command', () {
+      var parser = new ArgParser();
+      var command = parser.addCommand('install');
+      command.addFlag('debug', abbr: 'd');
+      command.addFlag('verbose', abbr: 'v');
+
+      throwsFormat(parser, ['-dv', 'install']);
+    });
+
+    test('assigns collapsed options to the proper command', () {
+      var parser = new ArgParser();
+      parser.addFlag('apple', abbr: 'a');
+      var command = parser.addCommand('cmd');
+      command.addFlag('banana', abbr: 'b');
+      var subcommand = command.addCommand('subcmd');
+      subcommand.addFlag('cherry', abbr: 'c');
+
+      var args = parser.parse(['cmd', 'subcmd', '-abc']);
+      expect(args['apple'], isTrue);
+      expect(args.command.name, equals('cmd'));
+      expect(args.command['banana'], isTrue);
+      expect(args.command.command.name, equals('subcmd'));
+      expect(args.command.command['cherry'], isTrue);
+    });
+
+    test('option is given to innermost command that can take it', () {
+      var parser = new ArgParser();
+      parser.addFlag('verbose');
+      parser.addCommand('cmd')
+        ..addFlag('verbose')
+        ..addCommand('subcmd');
+
+      var args = parser.parse(['cmd', 'subcmd', '--verbose']);
+      expect(args['verbose'], isFalse);
+      expect(args.command.name, equals('cmd'));
+      expect(args.command['verbose'], isTrue);
+      expect(args.command.command.name, equals('subcmd'));
+    });
+
+    test('remaining arguments are given to the innermost command', () {
+      var parser = new ArgParser();
+      parser.addCommand('cmd')..addCommand('subcmd');
+
+      var args = parser.parse(['cmd', 'subcmd', 'other', 'stuff']);
+      expect(args.command.name, equals('cmd'));
+      expect(args.rest, isEmpty);
+      expect(args.command.command.name, equals('subcmd'));
+      expect(args.command.rest, isEmpty);
+      expect(args.command.command.rest, equals(['other', 'stuff']));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/args/test/command_runner_test.dart b/mojo/public/dart/third_party/args/test/command_runner_test.dart
new file mode 100644
index 0000000..3a796f1
--- /dev/null
+++ b/mojo/public/dart/third_party/args/test/command_runner_test.dart
@@ -0,0 +1,289 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library command_runner_test;
+
+import 'package:args/command_runner.dart';
+import 'package:test/test.dart';
+
+import 'utils.dart';
+
+const _DEFAULT_USAGE = """
+Usage: test <command> [arguments]
+
+Global options:
+-h, --help    Print this usage information.
+
+Available commands:
+  help   Display help information for test.
+
+Run "test help <command>" for more information about a command.""";
+
+void main() {
+  var runner;
+  setUp(() {
+    runner = new CommandRunner("test", "A test command runner.");
+  });
+
+  test(".invocation has a sane default", () {
+    expect(runner.invocation, equals("test <command> [arguments]"));
+  });
+
+  group(".usage", () {
+    test("returns the usage string", () {
+      expect(runner.usage, equals("""
+A test command runner.
+
+$_DEFAULT_USAGE"""));
+    });
+
+    test("contains custom commands", () {
+      runner.addCommand(new FooCommand());
+
+      expect(runner.usage, equals("""
+A test command runner.
+
+Usage: test <command> [arguments]
+
+Global options:
+-h, --help    Print this usage information.
+
+Available commands:
+  foo    Set a value.
+  help   Display help information for test.
+
+Run "test help <command>" for more information about a command."""));
+    });
+
+    test("contains custom options", () {
+      runner.argParser.addFlag("foo", help: "Do something.");
+
+      expect(runner.usage, equals("""
+A test command runner.
+
+Usage: test <command> [arguments]
+
+Global options:
+-h, --help        Print this usage information.
+    --[no-]foo    Do something.
+
+Available commands:
+  help   Display help information for test.
+
+Run "test help <command>" for more information about a command."""));
+    });
+
+    test("doesn't print hidden commands", () {
+      runner.addCommand(new HiddenCommand());
+
+      expect(runner.usage, equals("""
+A test command runner.
+
+$_DEFAULT_USAGE"""));
+    });
+
+    test("doesn't print aliases", () {
+      runner.addCommand(new AliasedCommand());
+
+      expect(runner.usage, equals("""
+A test command runner.
+
+Usage: test <command> [arguments]
+
+Global options:
+-h, --help    Print this usage information.
+
+Available commands:
+  aliased   Set a value.
+  help      Display help information for test.
+
+Run "test help <command>" for more information about a command."""));
+    });
+  });
+
+  test("usageException splits up the message and usage", () {
+    expect(() => runner.usageException("message"),
+        throwsUsageError("message", _DEFAULT_USAGE));
+  });
+
+  group("run()", () {
+    test("runs a command", () {
+      var command = new FooCommand();
+      runner.addCommand(command);
+
+      expect(runner.run(["foo"]).then((_) {
+        expect(command.hasRun, isTrue);
+      }), completes);
+    });
+
+    test("runs an asynchronous command", () {
+      var command = new AsyncCommand();
+      runner.addCommand(command);
+
+      expect(runner.run(["async"]).then((_) {
+        expect(command.hasRun, isTrue);
+      }), completes);
+    });
+
+    test("runs a hidden comand", () {
+      var command = new HiddenCommand();
+      runner.addCommand(command);
+
+      expect(runner.run(["hidden"]).then((_) {
+        expect(command.hasRun, isTrue);
+      }), completes);
+    });
+
+    test("runs an aliased comand", () {
+      var command = new AliasedCommand();
+      runner.addCommand(command);
+
+      expect(runner.run(["als"]).then((_) {
+        expect(command.hasRun, isTrue);
+      }), completes);
+    });
+
+    test("runs a subcommand", () {
+      var command = new AsyncCommand();
+      runner.addCommand(new FooCommand()..addSubcommand(command));
+
+      expect(runner.run(["foo", "async"]).then((_) {
+        expect(command.hasRun, isTrue);
+      }), completes);
+    });
+
+    group("with --help", () {
+      test("with no command prints the usage", () {
+        expect(() => runner.run(["--help"]), prints("""
+A test command runner.
+
+$_DEFAULT_USAGE
+"""));
+      });
+
+      test("with a command prints the usage for that command", () {
+        var command = new FooCommand();
+        runner.addCommand(command);
+
+        expect(() => runner.run(["foo", "--help"]), prints("""
+Set a value.
+
+Usage: test foo [arguments]
+-h, --help    Print this usage information.
+
+Run "test help" to see global options.
+"""));
+      });
+    });
+
+    group("with help command", () {
+      test("with no command prints the usage", () {
+        expect(() => runner.run(["help"]), prints("""
+A test command runner.
+
+$_DEFAULT_USAGE
+"""));
+      });
+
+      test("with a command prints the usage for that command", () {
+        var command = new FooCommand();
+        runner.addCommand(command);
+
+        expect(() => runner.run(["help", "foo"]), prints("""
+Set a value.
+
+Usage: test foo [arguments]
+-h, --help    Print this usage information.
+
+Run "test help" to see global options.
+"""));
+      });
+
+      test("prints its own usage", () {
+        expect(() => runner.run(["help", "help"]), prints("""
+Display help information for test.
+
+Usage: test help [command]
+-h, --help    Print this usage information.
+
+Run "test help" to see global options.
+"""));
+      });
+    });
+  });
+
+  group("with a footer", () {
+    setUp(() {
+      runner = new CommandRunnerWithFooter("test", "A test command runner.");
+    });
+
+    test("includes the footer in the usage string", () {
+      expect(runner.usage, equals("""
+A test command runner.
+
+$_DEFAULT_USAGE
+Also, footer!"""));
+    });
+
+    test("includes the footer in usage errors", () {
+      expect(runner.run(["--bad"]), throwsUsageError(
+          'Could not find an option named "bad".',
+          "$_DEFAULT_USAGE\nAlso, footer!"));
+    });
+  });
+
+  group("throws a useful error when", () {
+    test("arg parsing fails", () {
+      expect(runner.run(["--bad"]), throwsUsageError(
+          'Could not find an option named "bad".', _DEFAULT_USAGE));
+    });
+
+    test("a top-level command doesn't exist", () {
+      expect(runner.run(["bad"]), throwsUsageError(
+          'Could not find a command named "bad".', _DEFAULT_USAGE));
+    });
+
+    test("a subcommand doesn't exist", () {
+      runner.addCommand(new FooCommand()..addSubcommand(new AsyncCommand()));
+
+      expect(runner.run(["foo bad"]), throwsUsageError(
+          'Could not find a command named "foo bad".', """
+Usage: test <command> [arguments]
+
+Global options:
+-h, --help    Print this usage information.
+
+Available commands:
+  foo    Set a value.
+  help   Display help information for test.
+
+Run "test help <command>" for more information about a command."""));
+    });
+
+    test("a subcommand wasn't passed", () {
+      runner.addCommand(new FooCommand()..addSubcommand(new AsyncCommand()));
+
+      expect(runner.run(["foo"]), throwsUsageError(
+          'Missing subcommand for "test foo".', """
+Usage: test foo <subcommand> [arguments]
+-h, --help    Print this usage information.
+
+Available subcommands:
+  async   Set a value asynchronously.
+
+Run "test help" to see global options."""));
+    });
+
+    test("a command that doesn't take arguments was given them", () {
+      runner.addCommand(new FooCommand());
+
+      expect(runner.run(["foo", "bar"]), throwsUsageError(
+          'Command "foo" does not take any arguments.', """
+Usage: test foo [arguments]
+-h, --help    Print this usage information.
+
+Run "test help" to see global options."""));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/args/test/command_test.dart b/mojo/public/dart/third_party/args/test/command_test.dart
new file mode 100644
index 0000000..888016a
--- /dev/null
+++ b/mojo/public/dart/third_party/args/test/command_test.dart
@@ -0,0 +1,106 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library command_test;
+
+import 'package:args/command_runner.dart';
+import 'package:test/test.dart';
+import 'utils.dart';
+
+void main() {
+  var foo;
+  setUp(() {
+    foo = new FooCommand();
+
+    // Make sure [Command.runner] is set up.
+    new CommandRunner("test", "A test command runner.").addCommand(foo);
+  });
+
+  group(".invocation has a sane default", () {
+    test("without subcommands", () {
+      expect(foo.invocation, equals("test foo [arguments]"));
+    });
+
+    test("with subcommands", () {
+      foo.addSubcommand(new AsyncCommand());
+      expect(foo.invocation, equals("test foo <subcommand> [arguments]"));
+    });
+
+    test("for a subcommand", () {
+      var async = new AsyncCommand();
+      foo.addSubcommand(async);
+
+      expect(async.invocation, equals("test foo async [arguments]"));
+    });
+  });
+
+  group(".usage", () {
+    test("returns the usage string", () {
+      expect(foo.usage, equals("""
+Set a value.
+
+Usage: test foo [arguments]
+-h, --help    Print this usage information.
+
+Run "test help" to see global options."""));
+    });
+
+    test("contains custom options", () {
+      foo.argParser.addFlag("flag", help: "Do something.");
+
+      expect(foo.usage, equals("""
+Set a value.
+
+Usage: test foo [arguments]
+-h, --help         Print this usage information.
+    --[no-]flag    Do something.
+
+Run "test help" to see global options."""));
+    });
+
+    test("doesn't print hidden subcommands", () {
+      foo.addSubcommand(new AsyncCommand());
+      foo.addSubcommand(new HiddenCommand());
+
+      expect(foo.usage, equals("""
+Set a value.
+
+Usage: test foo <subcommand> [arguments]
+-h, --help    Print this usage information.
+
+Available subcommands:
+  async   Set a value asynchronously.
+
+Run "test help" to see global options."""));
+    });
+
+    test("doesn't print subcommand aliases", () {
+      foo.addSubcommand(new AliasedCommand());
+
+      expect(foo.usage, equals("""
+Set a value.
+
+Usage: test foo <subcommand> [arguments]
+-h, --help    Print this usage information.
+
+Available subcommands:
+  aliased   Set a value.
+
+Run "test help" to see global options."""));
+    });
+  });
+
+  test("usageException splits up the message and usage", () {
+    expect(() => foo.usageException("message"), throwsUsageError("message", """
+Usage: test foo [arguments]
+-h, --help    Print this usage information.
+
+Run "test help" to see global options."""));
+  });
+
+  test("considers a command hidden if all its subcommands are hidden", () {
+    foo.addSubcommand(new HiddenCommand());
+    expect(foo.hidden, isTrue);
+  });
+}
diff --git a/mojo/public/dart/third_party/args/test/parse_test.dart b/mojo/public/dart/third_party/args/test/parse_test.dart
new file mode 100644
index 0000000..39027c2
--- /dev/null
+++ b/mojo/public/dart/third_party/args/test/parse_test.dart
@@ -0,0 +1,507 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library parse_test;
+
+import 'package:test/test.dart';
+import 'package:args/args.dart';
+import 'utils.dart';
+
+void main() {
+  group('ArgParser.parse()', () {
+    test('does not destructively modify the argument list', () {
+      var parser = new ArgParser();
+      parser.addFlag('verbose');
+
+      var args = ['--verbose'];
+      var results = parser.parse(args);
+      expect(args, equals(['--verbose']));
+      expect(results['verbose'], isTrue);
+    });
+
+    group('flags', () {
+      test('are true if present', () {
+        var parser = new ArgParser();
+        parser.addFlag('verbose');
+
+        var args = parser.parse(['--verbose']);
+        expect(args['verbose'], isTrue);
+      });
+
+      test('default if missing', () {
+        var parser = new ArgParser();
+        parser.addFlag('a', defaultsTo: true);
+        parser.addFlag('b', defaultsTo: false);
+
+        var args = parser.parse([]);
+        expect(args['a'], isTrue);
+        expect(args['b'], isFalse);
+      });
+
+      test('are false if missing with no default', () {
+        var parser = new ArgParser();
+        parser.addFlag('verbose');
+
+        var args = parser.parse([]);
+        expect(args['verbose'], isFalse);
+      });
+
+      test('throws if given a value', () {
+        var parser = new ArgParser();
+        parser.addFlag('verbose');
+
+        throwsFormat(parser, ['--verbose=true']);
+      });
+
+      test('are case-sensitive', () {
+        var parser = new ArgParser();
+        parser.addFlag('verbose');
+        parser.addFlag('Verbose');
+        var results = parser.parse(['--verbose']);
+        expect(results['verbose'], isTrue);
+        expect(results['Verbose'], isFalse);
+      });
+    });
+
+    group('flags negated with "no-"', () {
+      test('set the flag to false', () {
+        var parser = new ArgParser();
+        parser.addFlag('verbose');
+
+        var args = parser.parse(['--no-verbose']);
+        expect(args['verbose'], isFalse);
+      });
+
+      test('set the flag to true if the flag actually starts with "no-"', () {
+        var parser = new ArgParser();
+        parser.addFlag('no-body');
+
+        var args = parser.parse(['--no-body']);
+        expect(args['no-body'], isTrue);
+      });
+
+      test('are not preferred over a colliding one without', () {
+        var parser = new ArgParser();
+        parser.addFlag('no-strum');
+        parser.addFlag('strum');
+
+        var args = parser.parse(['--no-strum']);
+        expect(args['no-strum'], isTrue);
+        expect(args['strum'], isFalse);
+      });
+
+      test('fail for non-negatable flags', () {
+        var parser = new ArgParser();
+        parser.addFlag('strum', negatable: false);
+
+        throwsFormat(parser, ['--no-strum']);
+      });
+    });
+
+    group('callbacks', () {
+      test('for present flags are invoked with the value', () {
+        var a;
+        var parser = new ArgParser();
+        parser.addFlag('a', callback: (value) => a = value);
+
+        parser.parse(['--a']);
+        expect(a, isTrue);
+      });
+
+      test('for absent flags are invoked with the default value', () {
+        var a;
+        var parser = new ArgParser();
+        parser.addFlag('a', defaultsTo: false, callback: (value) => a = value);
+
+        parser.parse([]);
+        expect(a, isFalse);
+      });
+
+      test('are invoked even if the flag is not present', () {
+        var a = 'not called';
+        var parser = new ArgParser();
+        parser.addFlag('a', callback: (value) => a = value);
+
+        parser.parse([]);
+        expect(a, isFalse);
+      });
+
+      test('for present options are invoked with the value', () {
+        var a;
+        var parser = new ArgParser();
+        parser.addOption('a', callback: (value) => a = value);
+
+        parser.parse(['--a=v']);
+        expect(a, equals('v'));
+      });
+
+      test('for absent options are invoked with the default value', () {
+        var a;
+        var parser = new ArgParser();
+        parser.addOption('a', defaultsTo: 'v', callback: (value) => a = value);
+
+        parser.parse([]);
+        expect(a, equals('v'));
+      });
+
+      test('are invoked even if the option is not present', () {
+        var a = 'not called';
+        var parser = new ArgParser();
+        parser.addOption('a', callback: (value) => a = value);
+
+        parser.parse([]);
+        expect(a, isNull);
+      });
+
+      test('for multiple present, allowMultiple, options are invoked with '
+          'value as a list', () {
+        var a;
+        var parser = new ArgParser();
+        parser.addOption('a',
+            allowMultiple: true, callback: (value) => a = value);
+
+        parser.parse(['--a=v', '--a=x']);
+        expect(a, equals(['v', 'x']));
+      });
+
+      test('for single present, allowMultiple, options are invoked with '
+          ' value as a single element list', () {
+        var a;
+        var parser = new ArgParser();
+        parser.addOption('a',
+            allowMultiple: true, callback: (value) => a = value);
+
+        parser.parse(['--a=v']);
+        expect(a, equals(['v']));
+      });
+
+      test('for absent, allowMultiple, options are invoked with default '
+          'value as a list.', () {
+        var a;
+        var parser = new ArgParser();
+        parser.addOption('a',
+            allowMultiple: true,
+            defaultsTo: 'v',
+            callback: (value) => a = value);
+
+        parser.parse([]);
+        expect(a, equals(['v']));
+      });
+
+      test('for absent, allowMultiple, options are invoked with value '
+          'as an empty list.', () {
+        var a;
+        var parser = new ArgParser();
+        parser.addOption('a',
+            allowMultiple: true, callback: (value) => a = value);
+
+        parser.parse([]);
+        expect(a, isEmpty);
+      });
+
+      test('allowMultiple parses comma-separated strings', () {
+        var a;
+        var parser = new ArgParser();
+        parser.addOption('a',
+            allowMultiple: true, callback: (value) => a = value);
+
+        parser.parse(['--a=v,w', '--a=x']);
+        expect(a, equals(['v', 'w', 'x']));
+      });
+
+      test("allowMultiple doesn't parses comma-separated strings with "
+          "splitCommas: false", () {
+        var a;
+        var parser = new ArgParser();
+        parser.addOption('a',
+            allowMultiple: true,
+            splitCommas: false,
+            callback: (value) => a = value);
+
+        parser.parse(['--a=v,w', '--a=x']);
+        expect(a, equals(['v,w', 'x']));
+      });
+
+      test('allowMultiple parses empty strings', () {
+        var a;
+        var parser = new ArgParser();
+        parser.addOption('a',
+            allowMultiple: true, callback: (value) => a = value);
+
+        parser.parse(['--a=,v', '--a=w,', '--a=,', '--a=x,,y', '--a', '']);
+        expect(a, equals(['', 'v', 'w', '', '', '', 'x', '', 'y', '']));
+      });
+
+      test('allowMultiple with allowed parses comma-separated strings', () {
+        var a;
+        var parser = new ArgParser();
+        parser.addOption('a',
+            allowMultiple: true,
+            allowed: ['v', 'w', 'x'],
+            callback: (value) => a = value);
+
+        parser.parse(['--a=v,w', '--a=x']);
+        expect(a, equals(['v', 'w', 'x']));
+      });
+    });
+
+    group('abbreviations', () {
+      test('are parsed with a preceding "-"', () {
+        var parser = new ArgParser();
+        parser.addFlag('arg', abbr: 'a');
+
+        var args = parser.parse(['-a']);
+        expect(args['arg'], isTrue);
+      });
+
+      test('can use multiple after a single "-"', () {
+        var parser = new ArgParser();
+        parser.addFlag('first', abbr: 'f');
+        parser.addFlag('second', abbr: 's');
+        parser.addFlag('third', abbr: 't');
+
+        var args = parser.parse(['-tf']);
+        expect(args['first'], isTrue);
+        expect(args['second'], isFalse);
+        expect(args['third'], isTrue);
+      });
+
+      test('can have multiple "-" args', () {
+        var parser = new ArgParser();
+        parser.addFlag('first', abbr: 'f');
+        parser.addFlag('second', abbr: 's');
+        parser.addFlag('third', abbr: 't');
+
+        var args = parser.parse(['-s', '-tf']);
+        expect(args['first'], isTrue);
+        expect(args['second'], isTrue);
+        expect(args['third'], isTrue);
+      });
+
+      test('can take arguments without a space separating', () {
+        var parser = new ArgParser();
+        parser.addOption('file', abbr: 'f');
+
+        var args = parser.parse(['-flip']);
+        expect(args['file'], equals('lip'));
+      });
+
+      test('can take arguments with a space separating', () {
+        var parser = new ArgParser();
+        parser.addOption('file', abbr: 'f');
+
+        var args = parser.parse(['-f', 'name']);
+        expect(args['file'], equals('name'));
+      });
+
+      test('allow non-option characters in the value', () {
+        var parser = new ArgParser();
+        parser.addOption('apple', abbr: 'a');
+
+        var args = parser.parse(['-ab?!c']);
+        expect(args['apple'], equals('b?!c'));
+      });
+
+      test('throw if unknown', () {
+        var parser = new ArgParser();
+        throwsFormat(parser, ['-f']);
+      });
+
+      test('throw if the value is missing', () {
+        var parser = new ArgParser();
+        parser.addOption('file', abbr: 'f');
+
+        throwsFormat(parser, ['-f']);
+      });
+
+      test('does not throw if the value looks like an option', () {
+        var parser = new ArgParser();
+        parser.addOption('file', abbr: 'f');
+        parser.addOption('other');
+
+        expect(parser.parse(['-f', '--other'])['file'], equals('--other'));
+        expect(parser.parse(['-f', '--unknown'])['file'], equals('--unknown'));
+        expect(parser.parse(['-f', '-abbr'])['file'], equals('-abbr'));
+        expect(parser.parse(['-f', '--'])['file'], equals('--'));
+      });
+
+      test('throw if the value is not allowed', () {
+        var parser = new ArgParser();
+        parser.addOption('mode', abbr: 'm', allowed: ['debug', 'release']);
+
+        throwsFormat(parser, ['-mprofile']);
+      });
+
+      test('throw if a comma-separated value is not allowed', () {
+        var parser = new ArgParser();
+        parser.addOption('mode', abbr: 'm', allowMultiple: true,
+            allowed: ['debug', 'release']);
+
+        throwsFormat(parser, ['-mdebug,profile']);
+      });
+
+      test('throw if any but the first is not a flag', () {
+        var parser = new ArgParser();
+        parser.addFlag('apple', abbr: 'a');
+        parser.addOption('banana', abbr: 'b'); // Takes an argument.
+        parser.addFlag('cherry', abbr: 'c');
+
+        throwsFormat(parser, ['-abc']);
+      });
+
+      test('throw if it has a value but the option is a flag', () {
+        var parser = new ArgParser();
+        parser.addFlag('apple', abbr: 'a');
+        parser.addFlag('banana', abbr: 'b');
+
+        // The '?!' means this can only be understood as '--apple b?!c'.
+        throwsFormat(parser, ['-ab?!c']);
+      });
+
+      test('are case-sensitive', () {
+        var parser = new ArgParser();
+        parser.addFlag('file', abbr: 'f');
+        parser.addFlag('force', abbr: 'F');
+        var results = parser.parse(['-f']);
+        expect(results['file'], isTrue);
+        expect(results['force'], isFalse);
+      });
+    });
+
+    group('options', () {
+      test('are parsed if present', () {
+        var parser = new ArgParser();
+        parser.addOption('mode');
+        var args = parser.parse(['--mode=release']);
+        expect(args['mode'], equals('release'));
+      });
+
+      test('are null if not present', () {
+        var parser = new ArgParser();
+        parser.addOption('mode');
+        var args = parser.parse([]);
+        expect(args['mode'], isNull);
+      });
+
+      test('default if missing', () {
+        var parser = new ArgParser();
+        parser.addOption('mode', defaultsTo: 'debug');
+        var args = parser.parse([]);
+        expect(args['mode'], equals('debug'));
+      });
+
+      test('allow the value to be separated by whitespace', () {
+        var parser = new ArgParser();
+        parser.addOption('mode');
+        var args = parser.parse(['--mode', 'release']);
+        expect(args['mode'], equals('release'));
+      });
+
+      test('throw if unknown', () {
+        var parser = new ArgParser();
+        throwsFormat(parser, ['--unknown']);
+        throwsFormat(parser, ['--nobody']); // Starts with "no".
+      });
+
+      test('throw if the arg does not include a value', () {
+        var parser = new ArgParser();
+        parser.addOption('mode');
+        throwsFormat(parser, ['--mode']);
+      });
+
+      test('do not throw if the value looks like an option', () {
+        var parser = new ArgParser();
+        parser.addOption('mode');
+        parser.addOption('other');
+
+        expect(parser.parse(['--mode', '--other'])['mode'], equals('--other'));
+        expect(parser.parse(['--mode', '--unknown'])['mode'],
+            equals('--unknown'));
+        expect(parser.parse(['--mode', '-abbr'])['mode'], equals('-abbr'));
+        expect(parser.parse(['--mode', '--'])['mode'], equals('--'));
+      });
+
+      test('do not throw if the value is in the allowed set', () {
+        var parser = new ArgParser();
+        parser.addOption('mode', allowed: ['debug', 'release']);
+        var args = parser.parse(['--mode=debug']);
+        expect(args['mode'], equals('debug'));
+      });
+
+      test('throw if the value is not in the allowed set', () {
+        var parser = new ArgParser();
+        parser.addOption('mode', allowed: ['debug', 'release']);
+        throwsFormat(parser, ['--mode=profile']);
+      });
+
+      test('returns last provided value', () {
+        var parser = new ArgParser();
+        parser.addOption('define');
+        var args = parser.parse(['--define=1', '--define=2']);
+        expect(args['define'], equals('2'));
+      });
+
+      test('returns a List if multi-valued', () {
+        var parser = new ArgParser();
+        parser.addOption('define', allowMultiple: true);
+        var args = parser.parse(['--define=1']);
+        expect(args['define'], equals(['1']));
+        args = parser.parse(['--define=1', '--define=2']);
+        expect(args['define'], equals(['1', '2']));
+      });
+
+      test('returns the default value for multi-valued arguments '
+          'if not explicitly set', () {
+        var parser = new ArgParser();
+        parser.addOption('define', defaultsTo: '0', allowMultiple: true);
+        var args = parser.parse(['']);
+        expect(args['define'], equals(['0']));
+      });
+
+      test('are case-sensitive', () {
+        var parser = new ArgParser();
+        parser.addOption('verbose', defaultsTo: 'no');
+        parser.addOption('Verbose', defaultsTo: 'no');
+        var results = parser.parse(['--verbose', 'chatty']);
+        expect(results['verbose'], equals('chatty'));
+        expect(results['Verbose'], equals('no'));
+      });
+    });
+
+    group('remaining args', () {
+      test('stops parsing args when a non-option-like arg is encountered', () {
+        var parser = new ArgParser();
+        parser.addFlag('woof');
+        parser.addOption('meow');
+        parser.addOption('tweet', defaultsTo: 'bird');
+
+        var results = parser.parse(['--woof', '--meow', 'v', 'not', 'option']);
+        expect(results['woof'], isTrue);
+        expect(results['meow'], equals('v'));
+        expect(results['tweet'], equals('bird'));
+        expect(results.rest, equals(['not', 'option']));
+      });
+
+      test('consumes "--" and stops', () {
+        var parser = new ArgParser();
+        parser.addFlag('woof', defaultsTo: false);
+        parser.addOption('meow', defaultsTo: 'kitty');
+
+        var results = parser.parse(['--woof', '--', '--meow']);
+        expect(results['woof'], isTrue);
+        expect(results['meow'], equals('kitty'));
+        expect(results.rest, equals(['--meow']));
+      });
+
+      test('leaves "--" if not the first non-option', () {
+        var parser = new ArgParser();
+        parser.addFlag('woof');
+
+        var results = parser.parse(['--woof', 'stop', '--', 'arg']);
+        expect(results['woof'], isTrue);
+        expect(results.rest, equals(['stop', '--', 'arg']));
+      });
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/args/test/trailing_options_test.dart b/mojo/public/dart/third_party/args/test/trailing_options_test.dart
new file mode 100644
index 0000000..efc53b2
--- /dev/null
+++ b/mojo/public/dart/third_party/args/test/trailing_options_test.dart
@@ -0,0 +1,100 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library trailing_options_test;
+
+import 'package:test/test.dart';
+import 'package:args/args.dart';
+
+void main() {
+  test('allowTrailingOptions defaults to false', () {
+    var parser = new ArgParser();
+    expect(parser.allowTrailingOptions, isFalse);
+  });
+
+  group('when trailing options are allowed', () {
+    var parser;
+    setUp(() {
+      parser = new ArgParser(allowTrailingOptions: true);
+    });
+
+    void expectThrows(List<String> args) => expect(
+        () => parser.parse(args), throwsFormatException,
+        reason: "with allowTrailingOptions: true");
+
+    test('collects non-options in rest', () {
+      parser.addFlag('flag');
+      parser.addOption('opt', abbr: 'o');
+      var results = parser.parse(['a', '--flag', 'b', '-o', 'value', 'c']);
+      expect(results['flag'], isTrue);
+      expect(results['opt'], equals('value'));
+      expect(results.rest, equals(['a', 'b', 'c']));
+    });
+
+    test('stops parsing options at "--"', () {
+      parser.addFlag('flag');
+      parser.addOption('opt', abbr: 'o');
+      var results = parser.parse(['a', '--flag', '--', '-ovalue', 'c']);
+      expect(results['flag'], isTrue);
+      expect(results.rest, equals(['a', '-ovalue', 'c']));
+    });
+
+    test('only consumes first "--"', () {
+      parser.addFlag('flag', abbr: 'f');
+      parser.addOption('opt', abbr: 'o');
+      var results = parser.parse(['a', '--', 'b', '--', 'c']);
+      expect(results.rest, equals(['a', 'b', '--', 'c']));
+    });
+
+    test('parses a trailing flag', () {
+      parser.addFlag('flag');
+      var results = parser.parse(['arg', '--flag']);
+
+      expect(results['flag'], isTrue);
+      expect(results.rest, equals(['arg']));
+    });
+
+    test('throws on a trailing option missing its value', () {
+      parser.addOption('opt');
+      expectThrows(['arg', '--opt']);
+    });
+
+    test('parses a trailing option', () {
+      parser.addOption('opt');
+      var results = parser.parse(['arg', '--opt', 'v']);
+      expect(results['opt'], equals('v'));
+      expect(results.rest, equals(['arg']));
+    });
+
+    test('throws on a trailing unknown flag', () {
+      expectThrows(['arg', '--xflag']);
+    });
+
+    test('throws on a trailing unknown option and value', () {
+      expectThrows(['arg', '--xopt', 'v']);
+    });
+
+    test('throws on a command', () {
+      parser.addCommand('com');
+      expectThrows(['arg', 'com']);
+    });
+  });
+
+  test("uses the innermost command's trailing options behavior", () {
+    var parser = new ArgParser(allowTrailingOptions: true);
+    parser.addFlag('flag', abbr: 'f');
+    var command =
+        parser.addCommand('cmd', new ArgParser(allowTrailingOptions: false));
+    command.addFlag('verbose', abbr: 'v');
+
+    var results = parser.parse(['a', '-f', 'b']);
+    expect(results['flag'], isTrue);
+    expect(results.rest, equals(['a', 'b']));
+
+    results = parser.parse(['cmd', '-f', 'a', '-v', '--unknown']);
+    expect(results['flag'], isTrue); // Not trailing.
+    expect(results.command['verbose'], isFalse);
+    expect(results.command.rest, equals(['a', '-v', '--unknown']));
+  });
+}
diff --git a/mojo/public/dart/third_party/args/test/usage_test.dart b/mojo/public/dart/third_party/args/test/usage_test.dart
new file mode 100644
index 0000000..492c517
--- /dev/null
+++ b/mojo/public/dart/third_party/args/test/usage_test.dart
@@ -0,0 +1,320 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library usage_test;
+
+import 'package:test/test.dart';
+import 'package:args/args.dart';
+
+void main() {
+  group('ArgParser.usage', () {
+    test('negatable flags show "no-" in title', () {
+      var parser = new ArgParser();
+      parser.addFlag('mode', help: 'The mode');
+
+      validateUsage(parser, '''
+          --[no-]mode    The mode
+          ''');
+    });
+
+    test('non-negatable flags don\'t show "no-" in title', () {
+      var parser = new ArgParser();
+      parser.addFlag('mode', negatable: false, help: 'The mode');
+
+      validateUsage(parser, '''
+          --mode    The mode
+          ''');
+    });
+
+    test('if there are no abbreviations, there is no column for them', () {
+      var parser = new ArgParser();
+      parser.addFlag('mode', help: 'The mode');
+
+      validateUsage(parser, '''
+          --[no-]mode    The mode
+          ''');
+    });
+
+    test('options are lined up past abbreviations', () {
+      var parser = new ArgParser();
+      parser.addFlag('mode', abbr: 'm', help: 'The mode');
+      parser.addOption('long', help: 'Lacks an abbreviation');
+
+      validateUsage(parser, '''
+          -m, --[no-]mode    The mode
+              --long         Lacks an abbreviation
+          ''');
+    });
+
+    test('help text is lined up past the longest option', () {
+      var parser = new ArgParser();
+      parser.addFlag('mode', abbr: 'm', help: 'Lined up with below');
+      parser.addOption('a-really-long-name', help: 'Its help text');
+
+      validateUsage(parser, '''
+          -m, --[no-]mode             Lined up with below
+              --a-really-long-name    Its help text
+          ''');
+    });
+
+    test('leading empty lines are ignored in help text', () {
+      var parser = new ArgParser();
+      parser.addFlag('mode', help: '\n\n\n\nAfter newlines');
+
+      validateUsage(parser, '''
+          --[no-]mode    After newlines
+          ''');
+    });
+
+    test('trailing empty lines are ignored in help text', () {
+      var parser = new ArgParser();
+      parser.addFlag('mode', help: 'Before newlines\n\n\n\n');
+
+      validateUsage(parser, '''
+          --[no-]mode    Before newlines
+          ''');
+    });
+
+    test('options are documented in the order they were added', () {
+      var parser = new ArgParser();
+      parser.addFlag('zebra', help: 'First');
+      parser.addFlag('monkey', help: 'Second');
+      parser.addFlag('wombat', help: 'Third');
+
+      validateUsage(parser, '''
+          --[no-]zebra     First
+          --[no-]monkey    Second
+          --[no-]wombat    Third
+          ''');
+    });
+
+    test('the default value for a flag is shown if on', () {
+      var parser = new ArgParser();
+      parser.addFlag('affirm', help: 'Should be on', defaultsTo: true);
+      parser.addFlag('negate', help: 'Should be off', defaultsTo: false);
+
+      validateUsage(parser, '''
+          --[no-]affirm    Should be on
+                           (defaults to on)
+
+          --[no-]negate    Should be off
+          ''');
+    });
+
+    test('the default value for an option with no allowed list is shown', () {
+      var parser = new ArgParser();
+      parser.addOption('any', help: 'Can be anything', defaultsTo: 'whatevs');
+
+      validateUsage(parser, '''
+          --any    Can be anything
+                   (defaults to "whatevs")
+          ''');
+    });
+
+    test('the value help is shown', () {
+      var parser = new ArgParser();
+      parser.addOption('out',
+          abbr: 'o', help: 'Where to write file', valueHelp: 'path');
+
+      validateUsage(parser, '''
+          -o, --out=<path>    Where to write file
+          ''');
+    });
+
+    test('the allowed list is shown', () {
+      var parser = new ArgParser();
+      parser.addOption('suit',
+          help: 'Like in cards',
+          allowed: ['spades', 'clubs', 'hearts', 'diamonds']);
+
+      validateUsage(parser, '''
+          --suit    Like in cards
+                    [spades, clubs, hearts, diamonds]
+          ''');
+    });
+
+    test('the default is highlighted in the allowed list', () {
+      var parser = new ArgParser();
+      parser.addOption('suit',
+          help: 'Like in cards',
+          defaultsTo: 'clubs',
+          allowed: ['spades', 'clubs', 'hearts', 'diamonds']);
+
+      validateUsage(parser, '''
+          --suit    Like in cards
+                    [spades, clubs (default), hearts, diamonds]
+          ''');
+    });
+
+    test('the allowed help is shown', () {
+      var parser = new ArgParser();
+      parser.addOption('suit',
+          help: 'Like in cards',
+          defaultsTo: 'clubs',
+          allowed: ['spades', 'clubs', 'diamonds', 'hearts'],
+          allowedHelp: {
+        'spades': 'Swords of a soldier',
+        'clubs': 'Weapons of war',
+        'diamonds': 'Money for this art',
+        'hearts': 'The shape of my heart'
+      });
+
+      validateUsage(parser, '''
+          --suit              Like in cards
+
+                [clubs]       Weapons of war
+                [diamonds]    Money for this art
+                [hearts]      The shape of my heart
+                [spades]      Swords of a soldier
+          ''');
+    });
+
+    test("hidden options don't appear in the help", () {
+      var parser = new ArgParser();
+      parser.addOption('first', help: 'The first option');
+      parser.addOption('second', hide: true);
+      parser.addOption('third', help: 'The third option');
+
+      validateUsage(parser, '''
+          --first    The first option
+          --third    The third option
+          ''');
+    });
+
+    test("hidden flags don't appear in the help", () {
+      var parser = new ArgParser();
+      parser.addFlag('first', help: 'The first flag');
+      parser.addFlag('second', hide: true);
+      parser.addFlag('third', help: 'The third flag');
+
+      validateUsage(parser, '''
+          --[no-]first    The first flag
+          --[no-]third    The third flag
+          ''');
+    });
+
+    test("hidden options don't affect spacing", () {
+      var parser = new ArgParser();
+      parser.addFlag('first', help: 'The first flag');
+      parser.addFlag('second-very-long-option', hide: true);
+      parser.addFlag('third', help: 'The third flag');
+
+      validateUsage(parser, '''
+          --[no-]first    The first flag
+          --[no-]third    The third flag
+          ''');
+    });
+
+    group("separators", () {
+      test("separates options where it's placed", () {
+        var parser = new ArgParser();
+        parser.addFlag('zebra', help: 'First');
+        parser.addSeparator('Primate:');
+        parser.addFlag('monkey', help: 'Second');
+        parser.addSeparator('Marsupial:');
+        parser.addFlag('wombat', help: 'Third');
+
+        validateUsage(parser, '''
+            --[no-]zebra     First
+
+            Primate:
+            --[no-]monkey    Second
+
+            Marsupial:
+            --[no-]wombat    Third
+            ''');
+      });
+
+      test("doesn't add extra newlines after a multiline option", () {
+        var parser = new ArgParser();
+        parser.addFlag('zebra', help: 'Multi\nline');
+        parser.addSeparator('Primate:');
+        parser.addFlag('monkey', help: 'Second');
+
+        validateUsage(parser, '''
+            --[no-]zebra     Multi
+                             line
+
+            Primate:
+            --[no-]monkey    Second
+            ''');
+      });
+
+      test("doesn't add newlines if it's the first component", () {
+        var parser = new ArgParser();
+        parser.addSeparator('Equine:');
+        parser.addFlag('zebra', help: 'First');
+
+        validateUsage(parser, '''
+            Equine:
+            --[no-]zebra    First
+            ''');
+      });
+
+      test("doesn't add trailing newlines if it's the last component", () {
+        var parser = new ArgParser();
+        parser.addFlag('zebra', help: 'First');
+        parser.addSeparator('Primate:');
+
+        validateUsage(parser, '''
+            --[no-]zebra    First
+
+            Primate:
+            ''');
+      });
+
+      test("adds a newline after another separator", () {
+        var parser = new ArgParser();
+        parser.addSeparator('First');
+        parser.addSeparator('Second');
+
+        validateUsage(parser, '''
+            First
+
+            Second
+            ''');
+      });
+    });
+  });
+}
+
+void validateUsage(ArgParser parser, String expected) {
+  expected = unindentString(expected);
+  expect(parser.usage, equals(expected));
+}
+
+// TODO(rnystrom): Replace one in test_utils.
+String unindentString(String text) {
+  var lines = text.split('\n');
+
+  // Count the indentation of the last line.
+  var whitespace = new RegExp('^ *');
+  var indent = whitespace.firstMatch(lines[lines.length - 1])[0].length;
+
+  // Drop the last line. It only exists for specifying indentation.
+  lines.removeLast();
+
+  // Strip indentation from the remaining lines.
+  for (var i = 0; i < lines.length; i++) {
+    var line = lines[i];
+    if (line.length <= indent) {
+      // It's short, so it must be nothing but whitespace.
+      if (line.trim() != '') {
+        throw new ArgumentError(
+            'Line "$line" does not have enough indentation.');
+      }
+
+      lines[i] = '';
+    } else {
+      if (line.substring(0, indent).trim() != '') {
+        throw new ArgumentError(
+            'Line "$line" does not have enough indentation.');
+      }
+
+      lines[i] = line.substring(indent);
+    }
+  }
+
+  return lines.join('\n');
+}
diff --git a/mojo/public/dart/third_party/args/test/utils.dart b/mojo/public/dart/third_party/args/test/utils.dart
new file mode 100644
index 0000000..1cdd803
--- /dev/null
+++ b/mojo/public/dart/third_party/args/test/utils.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library utils;
+
+import 'dart:async';
+
+import 'package:args/args.dart';
+import 'package:args/command_runner.dart';
+import 'package:test/test.dart';
+
+class CommandRunnerWithFooter extends CommandRunner {
+  final usageFooter = "Also, footer!";
+
+  CommandRunnerWithFooter(String executableName, String description)
+      : super(executableName, description);
+}
+
+class FooCommand extends Command {
+  var hasRun = false;
+
+  final name = "foo";
+  final description = "Set a value.";
+  final takesArguments = false;
+
+  void run() {
+    hasRun = true;
+  }
+}
+
+class HiddenCommand extends Command {
+  var hasRun = false;
+
+  final name = "hidden";
+  final description = "Set a value.";
+  final hidden = true;
+  final takesArguments = false;
+
+  void run() {
+    hasRun = true;
+  }
+}
+
+class AliasedCommand extends Command {
+  var hasRun = false;
+
+  final name = "aliased";
+  final description = "Set a value.";
+  final takesArguments = false;
+  final aliases = const ["alias", "als"];
+
+  void run() {
+    hasRun = true;
+  }
+}
+
+class AsyncCommand extends Command {
+  var hasRun = false;
+
+  final name = "async";
+  final description = "Set a value asynchronously.";
+  final takesArguments = false;
+
+  Future run() => new Future.value().then((_) => hasRun = true);
+}
+
+void throwsIllegalArg(function, {String reason: null}) {
+  expect(function, throwsArgumentError, reason: reason);
+}
+
+void throwsFormat(ArgParser parser, List<String> args) {
+  expect(() => parser.parse(args), throwsFormatException);
+}
+
+Matcher throwsUsageError(message, usage) {
+  return throwsA(predicate((error) {
+    expect(error, new isInstanceOf<UsageException>());
+    expect(error.message, message);
+    expect(error.usage, usage);
+    return true;
+  }));
+}
diff --git a/mojo/public/dart/third_party/async/.gitignore b/mojo/public/dart/third_party/async/.gitignore
new file mode 100644
index 0000000..7a2e8dd
--- /dev/null
+++ b/mojo/public/dart/third_party/async/.gitignore
@@ -0,0 +1,9 @@
+.buildlog
+.DS_Store
+.idea
+.pub/
+.settings/
+build/
+packages
+pubspec.lock
+.packages
diff --git a/mojo/public/dart/third_party/async/.test_config b/mojo/public/dart/third_party/async/.test_config
new file mode 100644
index 0000000..412fc5c
--- /dev/null
+++ b/mojo/public/dart/third_party/async/.test_config
@@ -0,0 +1,3 @@
+{
+  "test_package": true
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/async/AUTHORS b/mojo/public/dart/third_party/async/AUTHORS
new file mode 100644
index 0000000..e8063a8
--- /dev/null
+++ b/mojo/public/dart/third_party/async/AUTHORS
@@ -0,0 +1,6 @@
+# Below is a list of people and organizations that have contributed
+# to the project. Names should be added to the list like so:
+#
+#   Name/Organization <email address>
+
+Google Inc.
diff --git a/mojo/public/dart/third_party/async/CHANGELOG.md b/mojo/public/dart/third_party/async/CHANGELOG.md
new file mode 100644
index 0000000..39d204b
--- /dev/null
+++ b/mojo/public/dart/third_party/async/CHANGELOG.md
@@ -0,0 +1,43 @@
+## 1.3.0
+
+- Added `StreamCompleter` class for creating a stream now and providing its
+  events later as another stream.
+
+- Added `StreamQueue` class which allows requesting events from a stream
+  before they are avilable. It is like a `StreamIterator` that can queue
+  requests.
+
+- Added `SubscriptionStream` which creates a single-subscription stream
+  from an existing stream subscription.
+
+- Added a `ResultFuture` class for synchronously accessing the result of a
+  wrapped future.
+
+- Added `FutureGroup.onIdle` and `FutureGroup.isIdle`, which provide visibility
+  into whether a group is actively waiting on any futures.
+
+- Add an `AsyncMemoizer` class for running an asynchronous block of code exactly
+  once.
+
+- Added delegating wrapper classes for a number of core async types:
+  `DelegatingFuture`, `DelegatingStreamConsumer`, `DelegatingStreamController`,
+  `DelegatingSink`, `DelegatingEventSink`, `DelegatingStreamSink`, and
+  `DelegatingStreamSubscription`. These are all simple wrappers that forward all
+  calls to the wrapped objects. They can be used to expose only the desired
+  interface for subclasses, or extended to add extra functionality.
+
+## 1.2.0
+
+- Added a `FutureGroup` class for waiting for a group of futures, potentially of
+  unknown size, to complete.
+
+- Added a `StreamGroup` class for merging the events of a group of streams,
+  potentially of unknown size.
+
+## 1.1.1
+
+- Updated SDK version constraint to at least 1.9.0.
+
+## 1.1.0
+
+- ChangeLog starts here.
diff --git a/mojo/public/dart/third_party/async/CONTRIBUTING.md b/mojo/public/dart/third_party/async/CONTRIBUTING.md
new file mode 100644
index 0000000..6f5e0ea
--- /dev/null
+++ b/mojo/public/dart/third_party/async/CONTRIBUTING.md
@@ -0,0 +1,33 @@
+Want to contribute? Great! First, read this page (including the small print at
+the end).
+
+### Before you contribute
+Before we can use your code, you must sign the
+[Google Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual)
+(CLA), which you can do online. The CLA is necessary mainly because you own the
+copyright to your changes, even after your contribution becomes part of our
+codebase, so we need your permission to use and distribute your code. We also
+need to be sure of various other things—for instance that you'll tell us if you
+know that your code infringes on other people's patents. You don't have to sign
+the CLA until after you've submitted your code for review and a member has
+approved it, but you must do it before we can put your code into our codebase.
+
+Before you start working on a larger contribution, you should get in touch with
+us first through the issue tracker with your idea so that we can help out and
+possibly guide you. Coordinating up front makes it much easier to avoid
+frustration later on.
+
+### Code reviews
+All submissions, including submissions by project members, require review.
+
+### File headers
+All files in the project must start with the following header.
+
+    // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+    // for details. All rights reserved. Use of this source code is governed by a
+    // BSD-style license that can be found in the LICENSE file.
+
+### The small print
+Contributions made by corporations are covered by a different agreement than the
+one above, the
+[Software Grant and Corporate Contributor License Agreement](https://developers.google.com/open-source/cla/corporate).
diff --git a/mojo/public/dart/third_party/async/LICENSE b/mojo/public/dart/third_party/async/LICENSE
new file mode 100644
index 0000000..de31e1a
--- /dev/null
+++ b/mojo/public/dart/third_party/async/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2015, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/async/README.md b/mojo/public/dart/third_party/async/README.md
new file mode 100644
index 0000000..3820f06
--- /dev/null
+++ b/mojo/public/dart/third_party/async/README.md
@@ -0,0 +1,28 @@
+# Async utilities package
+
+Contains tools to work with asynchronous computations.
+
+The package contains `Stream` and `Future` related functionality,
+as well as sub-libraries with different utilities.
+
+### Zipping streams
+
+The "stream_zip.dart" sub-library contains functionality
+to combine several streams of events into a single stream of tuples of events.
+
+### Results
+The "result.dart" sub-library introduces a `Result` class that can hold either
+a value or an error.
+It allows capturing an asynchronous computation which can give either a value
+or an error, into an asynchronous computation that always gives a `Result`
+value, where errors can be treated as data.
+It also allows releasing the `Result` back into an asynchronous computation.
+
+### History.
+This package is unrelated to the discontinued `async` package with version 0.1.7.
+
+## Features and bugs
+
+Please file feature requests and bugs at the [issue tracker][tracker].
+
+[tracker]: https://github.com/dart-lang/async/issues
diff --git a/mojo/public/dart/third_party/async/codereview.settings b/mojo/public/dart/third_party/async/codereview.settings
new file mode 100644
index 0000000..af9ef31
--- /dev/null
+++ b/mojo/public/dart/third_party/async/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: http://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/async/commit/
+CC_LIST: reviews@dartlang.org
diff --git a/mojo/public/dart/third_party/async/lib/async.dart b/mojo/public/dart/third_party/async/lib/async.dart
new file mode 100644
index 0000000..71a1849
--- /dev/null
+++ b/mojo/public/dart/third_party/async/lib/async.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart.pkg.async;
+
+export "result.dart";
+export "src/async_memoizer.dart";
+export "src/delegate/event_sink.dart";
+export "src/delegate/future.dart";
+export "src/delegate/sink.dart";
+export "src/delegate/stream_consumer.dart";
+export "src/delegate/stream_sink.dart";
+export "src/delegate/stream_subscription.dart";
+export "src/future_group.dart";
+export "src/result_future.dart";
+export "src/stream_completer.dart";
+export "src/stream_group.dart";
+export "src/stream_queue.dart";
+export "src/stream_splitter.dart";
+export "src/subscription_stream.dart";
+export "stream_zip.dart";
diff --git a/mojo/public/dart/third_party/async/lib/result.dart b/mojo/public/dart/third_party/async/lib/result.dart
new file mode 100644
index 0000000..13e3dd9
--- /dev/null
+++ b/mojo/public/dart/third_party/async/lib/result.dart
@@ -0,0 +1,256 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Capture asynchronous results into synchronous values.
+///
+/// Capturing a result (either a returned value or a thrown error)
+/// means converting it into a [Result] -
+/// either a [ValueResult] or an [ErrorResult].
+///
+/// This value can release itself by writing itself either to a
+/// [EventSink] or a [Completer], or by becoming a [Future].
+library dart.pkg.async.results;
+
+import "dart:async";
+
+/// The result of a computation.
+abstract class Result<T> {
+  /// Create a `Result` with the result of calling [computation].
+  ///
+  /// This generates either a [ValueResult] with the value returned by
+  /// calling `computation`, or an [ErrorResult] with an error thrown by
+  /// the call.
+  factory Result(T computation()) {
+    try {
+      return new ValueResult(computation());
+    } catch (e, s) {
+      return new ErrorResult(e, s);
+    }
+  }
+
+  /// Create a `Result` holding a value.
+  ///
+  /// Alias for [ValueResult.ValueResult].
+  factory Result.value(T value) = ValueResult<T>;
+
+  /// Create a `Result` holding an error.
+  ///
+  /// Alias for [ErrorResult.ErrorResult].
+  factory Result.error(Object error, [StackTrace stackTrace]) =>
+      new ErrorResult(error, stackTrace);
+
+  // Helper functions.
+  static _captureValue(value) => new ValueResult(value);
+  static _captureError(error, stack) => new ErrorResult(error, stack);
+  static _release(Result v) {
+    if (v.isValue) return v.asValue.value;  // Avoid wrapping in future.
+    return v.asFuture;
+  }
+
+  /// Capture the result of a future into a `Result` future.
+  ///
+  /// The resulting future will never have an error.
+  /// Errors have been converted to an [ErrorResult] value.
+  static Future<Result> capture(Future future) {
+    return future.then(_captureValue, onError: _captureError);
+  }
+
+  /// Release the result of a captured future.
+  ///
+  /// Converts the [Result] value of the given [future] to a value or error
+  /// completion of the returned future.
+  ///
+  /// If [future] completes with an error, the returned future completes with
+  /// the same error.
+  static Future release(Future<Result> future) {
+    return future.then(_release);
+  }
+
+  /// Capture the results of a stream into a stream of [Result] values.
+  ///
+  /// The returned stream will not have any error events.
+  /// Errors from the source stream have been converted to [ErrorResult]s.
+  ///
+  /// Shorthand for transforming the stream using [CaptureStreamTransformer].
+  static Stream<Result> captureStream(Stream source) {
+    return source.transform(const CaptureStreamTransformer());
+  }
+
+  /// Release a stream of [result] values into a stream of the results.
+  ///
+  /// `Result` values of the source stream become value or error events in
+  /// the returned stream as appropriate.
+  /// Errors from the source stream become errors in the returned stream.
+  ///
+  /// Shorthand for transforming the stream using [ReleaseStreamTransformer].
+  static Stream releaseStream(Stream<Result> source) {
+    return source.transform(const ReleaseStreamTransformer());
+  }
+
+  /// Converts a result of a result to a single result.
+  ///
+  /// If the result is an error, or it is a `Result` value
+  /// which is then an error, then a result with that error is returned.
+  /// Otherwise both levels of results are value results, and a single
+  /// result with the value is returned.
+  static Result flatten(Result<Result> result) {
+    if (result.isError) return result;
+    return result.asValue.value;
+  }
+
+  /// Whether this result is a value result.
+  ///
+  /// Always the opposite of [isError].
+  bool get isValue;
+
+  /// Whether this result is an error result.
+  ///
+  /// Always the opposite of [isValue].
+  bool get isError;
+
+  /// If this is a value result, return itself.
+  ///
+  /// Otherwise return `null`.
+  ValueResult<T> get asValue;
+
+  /// If this is an error result, return itself.
+  ///
+  /// Otherwise return `null`.
+  ErrorResult get asError;
+
+  /// Complete a completer with this result.
+  void complete(Completer<T> completer);
+
+  /// Add this result to an [EventSink].
+  ///
+  /// Calls the sink's `add` or `addError` method as appropriate.
+  void addTo(EventSink<T> sink);
+
+  /// Creates a future completed with this result as a value or an error.
+  Future<T> get asFuture;
+}
+
+/// A result representing a returned value.
+class ValueResult<T> implements Result<T> {
+  final T value;
+  ValueResult(this.value);
+  bool get isValue => true;
+  bool get isError => false;
+  ValueResult<T> get asValue => this;
+  ErrorResult get asError => null;
+  void complete(Completer<T> completer) {
+    completer.complete(value);
+  }
+  void addTo(EventSink<T> sink) {
+    sink.add(value);
+  }
+  Future<T> get asFuture => new Future.value(value);
+}
+
+/// A result representing a thrown error.
+class ErrorResult implements Result {
+  final error;
+  final StackTrace stackTrace;
+  ErrorResult(this.error, this.stackTrace);
+  bool get isValue => false;
+  bool get isError => true;
+  ValueResult get asValue => null;
+  ErrorResult get asError => this;
+  void complete(Completer completer) {
+    completer.completeError(error, stackTrace);
+  }
+  void addTo(EventSink sink) {
+    sink.addError(error, stackTrace);
+  }
+  Future get asFuture => new Future.error(error, stackTrace);
+
+  /// Calls an error handler with the error and stacktrace.
+  ///
+  /// An async error handler function is either a function expecting two
+  /// arguments, which will be called with the error and the stack trace,
+  /// or it has to be a function expecting only one argument,
+  /// which will be called with only the error.
+  void handle(Function errorHandler) {
+    if (errorHandler is ZoneBinaryCallback) {
+      errorHandler(error, stackTrace);
+    } else {
+      errorHandler(error);
+    }
+  }
+}
+
+/// A stream transformer that captures a stream of events into [Result]s.
+///
+/// The result of the transformation is a stream of [Result] values and
+/// no error events.
+class CaptureStreamTransformer<T> implements StreamTransformer<T, Result<T>> {
+  const CaptureStreamTransformer();
+
+  Stream<Result<T>> bind(Stream<T> source) {
+    return new Stream<Result<T>>.eventTransformed(source, _createSink);
+  }
+
+  static EventSink _createSink(EventSink<Result> sink) {
+    return new CaptureSink(sink);
+  }
+}
+
+/// A stream transformer that releases a stream of result events.
+///
+/// The result of the transformation is a stream of values and
+/// error events.
+class ReleaseStreamTransformer<T> implements StreamTransformer<Result<T>, T> {
+  const ReleaseStreamTransformer();
+
+  Stream<T> bind(Stream<Result<T>> source) {
+    return new Stream<T>.eventTransformed(source, _createSink);
+  }
+
+  static EventSink<Result> _createSink(EventSink sink) {
+    return new ReleaseSink(sink);
+  }
+}
+
+/// An event sink wrapper that captures the incoming events.
+///
+/// Wraps an [EventSink] that expects [Result] values.
+/// Accepts any value and error result,
+/// and passes them to the wrapped sink as [Result] values.
+///
+/// The wrapped sink will never receive an error event.
+class CaptureSink<T> implements EventSink<T> {
+  final EventSink _sink;
+
+  CaptureSink(EventSink<Result<T>> sink) : _sink = sink;
+  void add(T value) { _sink.add(new ValueResult(value)); }
+  void addError(Object error, [StackTrace stackTrace]) {
+    _sink.add(new ErrorResult(error, stackTrace));
+  }
+  void close() { _sink.close(); }
+}
+
+/// An event sink wrapper that releases the incoming result events.
+///
+/// Wraps an output [EventSink] that expects any result.
+/// Accepts [Result] values, and puts the result value or error into the
+/// corresponding output sink add method.
+class ReleaseSink<T> implements EventSink<Result<T>> {
+  final EventSink _sink;
+  ReleaseSink(EventSink<T> sink) : _sink = sink;
+  void add(Result<T> result) {
+    if (result.isValue) {
+      _sink.add(result.asValue.value);
+    } else {
+      ErrorResult error = result.asError;
+      _sink.addError(error.error, error.stackTrace);
+    }
+  }
+  void addError(Object error, [StackTrace stackTrace]) {
+    // Errors may be added by intermediate processing, even if it is never
+    // added by CaptureSink.
+    _sink.addError(error, stackTrace);
+  }
+
+  void close() { _sink.close(); }
+}
diff --git a/mojo/public/dart/third_party/async/lib/src/async_memoizer.dart b/mojo/public/dart/third_party/async/lib/src/async_memoizer.dart
new file mode 100644
index 0000000..68a6c80
--- /dev/null
+++ b/mojo/public/dart/third_party/async/lib/src/async_memoizer.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library async.async_memoizer;
+
+import 'dart:async';
+
+/// A class for running an asynchronous function exactly once and caching its
+/// result.
+///
+/// An `AsyncMemoizer` is used when some function may be run multiple times in
+/// order to get its result, but it only actually needs to be run once for its
+/// effect. To memoize the result of an async function, you can create a
+/// memoizer outside the function (for example as an instance field if you want
+/// to memoize the result of a method), and then wrap the function's body in a
+/// call to [runOnce].
+///
+/// This is useful for methods like `close()` and getters that need to do
+/// asynchronous work. For example:
+///
+/// ```dart
+/// class SomeResource {
+///   final _closeMemo = new AsyncMemoizer();
+///
+///   Future close() => _closeMemo.runOnce(() {
+///     // ...
+///   });
+/// }
+/// ```
+class AsyncMemoizer<T> {
+  /// The future containing the method's result.
+  ///
+  /// This will be `null` if [run] hasn't been called yet.
+  Future<T> _future;
+
+  /// Whether [run] has been called yet.
+  bool get hasRun => _future != null;
+
+  /// Runs the function, [computation], if it hasn't been run before.
+  ///
+  /// If [run] has already been called, this returns the original result.
+  Future<T> runOnce(computation()) {
+    if (_future == null) _future = new Future.sync(computation);
+    return _future;
+  }
+}
diff --git a/mojo/public/dart/third_party/async/lib/src/delegate/event_sink.dart b/mojo/public/dart/third_party/async/lib/src/delegate/event_sink.dart
new file mode 100644
index 0000000..337e7a8
--- /dev/null
+++ b/mojo/public/dart/third_party/async/lib/src/delegate/event_sink.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library async.delegate.event_sink;
+
+import 'dart:async';
+
+/// Simple delegating wrapper around an [EventSink].
+///
+/// Subclasses can override individual methods, or use this to expose only the
+/// [EventSink] methods of a subclass.
+class DelegatingEventSink<T> implements EventSink<T> {
+  final EventSink _sink;
+
+  /// Create a delegating sink forwarding calls to [sink].
+  DelegatingEventSink(EventSink sink) : _sink = sink;
+
+  void add(T data) {
+    _sink.add(data);
+  }
+
+  void addError(error, [StackTrace stackTrace]) {
+    _sink.addError(error, stackTrace);
+  }
+
+  void close() {
+    _sink.close();
+  }
+}
diff --git a/mojo/public/dart/third_party/async/lib/src/delegate/future.dart b/mojo/public/dart/third_party/async/lib/src/delegate/future.dart
new file mode 100644
index 0000000..34f6158
--- /dev/null
+++ b/mojo/public/dart/third_party/async/lib/src/delegate/future.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library async.delegate.future;
+
+import 'dart:async';
+
+/// A wrapper that forwards calls to a [Future].
+class DelegatingFuture<T> implements Future<T> {
+  /// The wrapped [Future].
+  final Future _future;
+
+  DelegatingFuture(this._future);
+
+  Stream<T> asStream() => _future.asStream();
+
+  Future catchError(Function onError, {bool test(error)}) =>
+    _future.catchError(onError, test: test);
+
+  Future then(onValue(T value), {Function onError}) =>
+    _future.then(onValue, onError: onError);
+
+  Future<T> whenComplete(action()) => _future.whenComplete(action);
+
+  Future timeout(Duration timeLimit, {void onTimeout()}) =>
+    _future.timeout(timeLimit, onTimeout: onTimeout);
+}
diff --git a/mojo/public/dart/third_party/async/lib/src/delegate/sink.dart b/mojo/public/dart/third_party/async/lib/src/delegate/sink.dart
new file mode 100644
index 0000000..bb50da3
--- /dev/null
+++ b/mojo/public/dart/third_party/async/lib/src/delegate/sink.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library async.delegate.sink;
+
+/// Simple delegating wrapper around a [Sink].
+///
+/// Subclasses can override individual methods, or use this to expose only the
+/// [Sink] methods of a subclass.
+class DelegatingSink<T> implements Sink<T> {
+  final Sink _sink;
+
+  /// Create a delegating sink forwarding calls to [sink].
+  DelegatingSink(Sink sink)
+      : _sink = sink;
+
+  void add(T data) {
+    _sink.add(data);
+  }
+
+  void close() {
+    _sink.close();
+  }
+}
diff --git a/mojo/public/dart/third_party/async/lib/src/delegate/stream_consumer.dart b/mojo/public/dart/third_party/async/lib/src/delegate/stream_consumer.dart
new file mode 100644
index 0000000..8162db6
--- /dev/null
+++ b/mojo/public/dart/third_party/async/lib/src/delegate/stream_consumer.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library async.delegate.stream_consumer;
+
+import 'dart:async';
+
+/// Simple delegating wrapper around a [StreamConsumer].
+///
+/// Subclasses can override individual methods, or use this to expose only the
+/// [StreamConsumer] methods of a subclass.
+class DelegatingStreamConsumer<T> implements StreamConsumer<T> {
+  final StreamConsumer _consumer;
+
+  /// Create a delegating consumer forwarding calls to [consumer].
+  DelegatingStreamConsumer(StreamConsumer consumer)
+      : _consumer = consumer;
+
+  Future addStream(Stream<T> stream) => _consumer.addStream(stream);
+
+  Future close() => _consumer.close();
+}
diff --git a/mojo/public/dart/third_party/async/lib/src/delegate/stream_sink.dart b/mojo/public/dart/third_party/async/lib/src/delegate/stream_sink.dart
new file mode 100644
index 0000000..b6ace65
--- /dev/null
+++ b/mojo/public/dart/third_party/async/lib/src/delegate/stream_sink.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library async.delegate.stream_sink;
+
+import 'dart:async';
+
+/// Simple delegating wrapper around a [StreamSink].
+///
+/// Subclasses can override individual methods, or use this to expose only the
+/// [StreamSink] methods of a subclass.
+class DelegatingStreamSink<T> implements StreamSink<T> {
+  final StreamSink _sink;
+
+  Future get done => _sink.done;
+
+  /// Create delegating sink forwarding calls to [sink].
+  DelegatingStreamSink(StreamSink sink)
+      : _sink = sink;
+
+  void add(T data) {
+    _sink.add(data);
+  }
+
+  void addError(error, [StackTrace stackTrace]) {
+    _sink.addError(error, stackTrace);
+  }
+
+  Future addStream(Stream<T> stream) => _sink.addStream(stream);
+
+  Future close() => _sink.close();
+}
diff --git a/mojo/public/dart/third_party/async/lib/src/delegate/stream_subscription.dart b/mojo/public/dart/third_party/async/lib/src/delegate/stream_subscription.dart
new file mode 100644
index 0000000..ff9b665
--- /dev/null
+++ b/mojo/public/dart/third_party/async/lib/src/delegate/stream_subscription.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library async.delegate.stream_subscription;
+
+import 'dart:async';
+
+/// Simple delegating wrapper around a [StreamSubscription].
+///
+/// Subclasses can override individual methods.
+class DelegatingStreamSubscription<T> implements StreamSubscription<T> {
+  final StreamSubscription _source;
+
+  /// Create delegating subscription forwarding calls to [sourceSubscription].
+  DelegatingStreamSubscription(StreamSubscription sourceSubscription)
+      : _source = sourceSubscription;
+
+  void onData(void handleData(T data)) {
+    _source.onData(handleData);
+  }
+
+  void onError(Function handleError) {
+    _source.onError(handleError);
+  }
+
+  void onDone(void handleDone()) {
+    _source.onDone(handleDone);
+  }
+
+  void pause([Future resumeFuture]) {
+    _source.pause(resumeFuture);
+  }
+
+  void resume() {
+    _source.resume();
+  }
+
+  Future cancel() => _source.cancel();
+
+  Future asFuture([futureValue]) => _source.asFuture(futureValue);
+
+  bool get isPaused => _source.isPaused;
+}
diff --git a/mojo/public/dart/third_party/async/lib/src/future_group.dart b/mojo/public/dart/third_party/async/lib/src/future_group.dart
new file mode 100644
index 0000000..02ff185
--- /dev/null
+++ b/mojo/public/dart/third_party/async/lib/src/future_group.dart
@@ -0,0 +1,98 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library async.future_group;
+
+import 'dart:async';
+
+/// A collection of futures waits until all added [Future]s complete.
+///
+/// Futures are added to the group with [add]. Once you're finished adding
+/// futures, signal that by calling [close]. Then, once all added futures have
+/// completed, [future] will complete with a list of values from the futures in
+/// the group, in the order they were added.
+///
+/// If any added future completes with an error, [future] will emit that error
+/// and the group will be closed, regardless of the state of other futures in
+/// the group.
+///
+/// This is similar to [Future.wait] with `eagerError` set to `true`, except
+/// that a [FutureGroup] can have futures added gradually over time rather than
+/// needing them all at once.
+class FutureGroup<T> implements Sink<Future<T>> {
+  /// The number of futures that have yet to complete.
+  var _pending = 0;
+
+  /// Whether [close] has been called.
+  var _closed = false;
+
+  /// The future that fires once [close] has been called and all futures in the
+  /// group have completed.
+  ///
+  /// This will also complete with an error if any of the futures in the group
+  /// fails, regardless of whether [close] was called.
+  Future<List<T>> get future => _completer.future;
+  final _completer = new Completer<List<T>>();
+
+  /// Whether this group is waiting on any futures.
+  bool get isIdle => _pending == 0;
+
+  /// A broadcast stream that emits a `null` event whenever the last pending
+  /// future in this group completes.
+  ///
+  /// Once this group isn't waiting on any futures *and* [close] has been
+  /// called, this stream will close.
+  Stream get onIdle {
+    if (_onIdleController == null) {
+      _onIdleController = new StreamController.broadcast(sync: true);
+    }
+    return _onIdleController.stream;
+  }
+  StreamController _onIdleController;
+
+  /// The values emitted by the futures that have been added to the group, in
+  /// the order they were added.
+  ///
+  /// The slots for futures that haven't completed yet are `null`.
+  final _values = new List<T>();
+
+  /// Wait for [task] to complete.
+  void add(Future<T> task) {
+    if (_closed) throw new StateError("The FutureGroup is closed.");
+
+    // Ensure that future values are put into [values] in the same order they're
+    // added to the group by pre-allocating a slot for them and recording its
+    // index.
+    var index = _values.length;
+    _values.add(null);
+
+    _pending++;
+    task.then((value) {
+      if (_completer.isCompleted) return;
+
+      _pending--;
+      _values[index] = value;
+
+      if (_pending != 0) return;
+      if (_onIdleController != null) _onIdleController.add(null);
+
+      if (!_closed) return;
+      if (_onIdleController != null) _onIdleController.close();
+      _completer.complete(_values);
+    }).catchError((error, stackTrace) {
+      if (_completer.isCompleted) return;
+      _completer.completeError(error, stackTrace);
+    });
+  }
+
+  /// Signals to the group that the caller is done adding futures, and so
+  /// [future] should fire once all added futures have completed.
+  void close() {
+    _closed = true;
+    if (_pending != 0) return;
+    if (_completer.isCompleted) return;
+    _completer.complete(_values);
+  }
+}
+
diff --git a/mojo/public/dart/third_party/async/lib/src/result_future.dart b/mojo/public/dart/third_party/async/lib/src/result_future.dart
new file mode 100644
index 0000000..311e83f
--- /dev/null
+++ b/mojo/public/dart/third_party/async/lib/src/result_future.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library async.result_future;
+
+import 'dart:async';
+
+import '../result.dart';
+import 'delegate/future.dart';
+
+/// A [Future] wrapper that provides synchronous access to the result of the
+/// wrapped [Future] once it's completed.
+class ResultFuture<T> extends DelegatingFuture<T> {
+  /// Whether the future has fired and [result] is available.
+  bool get isComplete => result != null;
+
+  /// The result of the wrapped [Future], if it's completed.
+  ///
+  /// If it hasn't completed yet, this will be `null`.
+  Result<T> get result => _result;
+  Result<T> _result;
+
+  factory ResultFuture(Future<T> future) {
+    var resultFuture;
+    resultFuture = new ResultFuture._(Result.capture(future).then((result) {
+      resultFuture._result = result;
+      return result.asFuture;
+    }));
+    return resultFuture;
+  }
+
+  ResultFuture._(Future<T> future)
+      : super(future);
+}
diff --git a/mojo/public/dart/third_party/async/lib/src/stream_completer.dart b/mojo/public/dart/third_party/async/lib/src/stream_completer.dart
new file mode 100644
index 0000000..c343e6e
--- /dev/null
+++ b/mojo/public/dart/third_party/async/lib/src/stream_completer.dart
@@ -0,0 +1,180 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library async.stream_completer;
+
+import "dart:async";
+
+/// A single-subscription [stream] where the contents are provided later.
+///
+/// It is generally recommended that you never create a `Future<Stream>`
+/// because you can just directly create a stream that doesn't do anything
+/// until it's ready to do so.
+/// This class can be used to create such a stream.
+///
+/// The [stream] is a normal stream that you can listen to immediately,
+/// but until either [setSourceStream] or [setEmpty] is called,
+/// the stream won't produce any events.
+///
+/// The same effect can be achieved by using a [StreamController]
+/// and adding the stream using `addStream` when both
+/// the controller's stream is listened to and the source stream is ready.
+/// This class attempts to shortcut some of the overhead when possible.
+/// For example, if the [stream] is only listened to
+/// after the source stream has been set,
+/// the listen is performed directly on the source stream.
+class StreamCompleter<T> {
+  /// The stream doing the actual work, is returned by [stream].
+  final _CompleterStream _stream = new _CompleterStream<T>();
+
+  /// Convert a `Future<Stream>` to a `Stream`.
+  ///
+  /// This creates a stream using a stream completer,
+  /// and sets the source stream to the result of the future when the
+  /// future completes.
+  ///
+  /// If the future completes with an error, the returned stream will
+  /// instead contain just that error.
+  static Stream fromFuture(Future<Stream> streamFuture) {
+    var completer = new StreamCompleter();
+    streamFuture.then(completer.setSourceStream,
+                      onError: (e, s) {
+                        completer.setSourceStream(streamFuture.asStream());
+                      });
+    return completer.stream;
+  }
+
+  /// The stream of this completer.
+  ///
+  /// This stream is always a single-subscription stream.
+  ///
+  /// When a source stream is provided, its events will be forwarded to
+  /// listeners on this stream.
+  ///
+  /// The stream can be listened either before or after a source stream
+  /// is set.
+  Stream<T> get stream => _stream;
+
+  /// Set a stream as the source of events for the [StreamCompleter]'s
+  /// [stream].
+  ///
+  /// The completer's `stream` will act exactly as [sourceStream].
+  ///
+  /// If the source stream is set before [stream] is listened to,
+  /// the listen call on [stream] is forwarded directly to [sourceStream].
+  ///
+  /// If [stream] is listened to before setting the source stream,
+  /// an intermediate subscription is created. It looks like a completely
+  /// normal subscription, and can be paused or canceled, but it won't
+  /// produce any events until a source stream is provided.
+  ///
+  /// If the `stream` subscription is canceled before a source stream is set,
+  /// the source stream will be listened to and immediately canceled again.
+  ///
+  /// Otherwise, when the source stream is then set,
+  /// it is immediately listened to, and its events are forwarded to the
+  /// existing subscription.
+  ///
+  /// Either [setSourceStream] or [setEmpty] may be called at most once.
+  /// Trying to call either of them again will fail.
+  void setSourceStream(Stream<T> sourceStream) {
+    if (_stream._isSourceStreamSet) {
+      throw new StateError("Source stream already set");
+    }
+    _stream._setSourceStream(sourceStream);
+  }
+
+  /// Equivalent to setting an empty stream using [setSourceStream].
+  ///
+  /// Either [setSourceStream] or [setEmpty] may be called at most once.
+  /// Trying to call either of them again will fail.
+  void setEmpty() {
+    if (_stream._isSourceStreamSet) {
+      throw new StateError("Source stream already set");
+    }
+    _stream._setEmpty();
+  }
+}
+
+/// Stream completed by [StreamCompleter].
+class _CompleterStream<T> extends Stream<T> {
+  /// Controller for an intermediate stream.
+  ///
+  /// Created if the user listens on this stream before the source stream
+  /// is set, or if using [_setEmpty] so there is no source stream.
+  StreamController _controller;
+
+  /// Source stream for the events provided by this stream.
+  ///
+  /// Set when the completer sets the source stream using [_setSourceStream]
+  /// or [_setEmpty].
+  Stream _sourceStream;
+
+  StreamSubscription<T> listen(onData(T data),
+                               {Function onError,
+                                void onDone(),
+                                bool cancelOnError}) {
+    if (_controller == null) {
+      if (_sourceStream != null && !_sourceStream.isBroadcast) {
+        // If the source stream is itself single subscription,
+        // just listen to it directly instead of creating a controller.
+        return _sourceStream.listen(onData, onError: onError, onDone: onDone,
+                                    cancelOnError: cancelOnError);
+      }
+      _createController();
+      if (_sourceStream != null) {
+        _linkStreamToController();
+      }
+    }
+    return _controller.stream.listen(onData, onError: onError, onDone: onDone,
+                                     cancelOnError: cancelOnError);
+  }
+
+  /// Whether a source stream has been set.
+  ///
+  /// Used to throw an error if trying to set a source stream twice.
+  bool get _isSourceStreamSet => _sourceStream != null;
+
+  /// Sets the source stream providing the events for this stream.
+  ///
+  /// If set before the user listens, listen calls will be directed directly
+  /// to the source stream. If the user listenes earlier, and intermediate
+  /// stream is created using a stream controller, and the source stream is
+  /// linked into that stream later.
+  void _setSourceStream(Stream<T> sourceStream) {
+    assert(_sourceStream == null);
+    _sourceStream = sourceStream;
+    if (_controller != null) {
+      // User has already listened, so provide the data through controller.
+      _linkStreamToController();
+    }
+  }
+
+  /// Links source stream to controller when both are available.
+  void _linkStreamToController() {
+    assert(_controller != null);
+    assert(_sourceStream != null);
+    _controller.addStream(_sourceStream, cancelOnError: false)
+               .whenComplete(_controller.close);
+  }
+
+  /// Sets an empty source stream.
+  ///
+  /// Uses [_controller] for the stream, then closes the controller
+  /// immediately.
+  void _setEmpty() {
+    assert(_sourceStream == null);
+    if (_controller == null) {
+      _createController();
+    }
+    _sourceStream = _controller.stream;  // Mark stream as set.
+    _controller.close();
+  }
+
+  // Creates the [_controller].
+  void _createController() {
+    assert(_controller == null);
+    _controller = new StreamController<T>(sync: true);
+  }
+}
diff --git a/mojo/public/dart/third_party/async/lib/src/stream_group.dart b/mojo/public/dart/third_party/async/lib/src/stream_group.dart
new file mode 100644
index 0000000..d99f515
--- /dev/null
+++ b/mojo/public/dart/third_party/async/lib/src/stream_group.dart
@@ -0,0 +1,259 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library async.stream_group;
+
+import 'dart:async';
+
+/// A collection of streams whose events are unified and sent through a central
+/// stream.
+///
+/// Both errors and data events are forwarded through [stream]. The streams in
+/// the group won't be listened to until [stream] has a listener. **Note that
+/// this means that events emitted by broadcast streams will be dropped until
+/// [stream] has a listener.**
+///
+/// If the `StreamGroup` is constructed using [new StreamGroup], [stream] will be
+/// single-subscription. In this case, if [stream] is paused or canceled, all
+/// streams in the group will likewise be paused or canceled, respectively.
+///
+/// If the `StreamGroup` is constructed using [new StreamGroup.broadcast],
+/// [stream] will be a broadcast stream. In this case, the streams in the group
+/// will never be paused and single-subscription streams in the group will never
+/// be canceled. **Note that single-subscription streams in a broadcast group
+/// may drop events if a listener is added and later removed.** Broadcast
+/// streams in the group will be canceled once [stream] has no listeners, and
+/// will be listened to again once [stream] has listeners.
+///
+/// [stream] won't close until [close] is called on the group *and* every stream
+/// in the group closes.
+class StreamGroup<T> implements Sink<Stream<T>> {
+  /// The stream through which all events from streams in the group are emitted.
+  Stream<T> get stream => _controller.stream;
+  StreamController<T> _controller;
+
+  /// Whether the group is closed, meaning that no more streams may be added.
+  var _closed = false;
+
+  /// The current state of the group.
+  ///
+  /// See [_StreamGroupState] for detailed descriptions of each state.
+  var _state = _StreamGroupState.dormant;
+
+  /// Streams that have been added to the group, and their subscriptions if they
+  /// have been subscribed to.
+  ///
+  /// The subscriptions will be null until the group has a listener registered.
+  /// If it's a broadcast group and it goes dormant again, broadcast stream
+  /// subscriptions will be canceled and set to null again. Single-subscriber
+  /// stream subscriptions will be left intact, since they can't be
+  /// re-subscribed.
+  final _subscriptions = new Map<Stream<T>, StreamSubscription<T>>();
+
+  /// Merges the events from [streams] into a single (single-subscriber) stream.
+  ///
+  /// This is equivalent to adding [streams] to a group, closing that group, and
+  /// returning its stream.
+  static Stream merge(Iterable<Stream> streams) {
+    var group = new StreamGroup();
+    streams.forEach(group.add);
+    group.close();
+    return group.stream;
+  }
+
+  /// Creates a new stream group where [stream] is single-subscriber.
+  StreamGroup() {
+    _controller = new StreamController<T>(
+        onListen: _onListen,
+        onPause: _onPause,
+        onResume: _onResume,
+        onCancel: _onCancel,
+        sync: true);
+  }
+
+  /// Creates a new stream group where [stream] is a broadcast stream.
+  StreamGroup.broadcast() {
+    _controller = new StreamController<T>.broadcast(
+        onListen: _onListen,
+        onCancel: _onCancelBroadcast,
+        sync: true);
+  }
+
+  /// Adds [stream] as a member of this group.
+  ///
+  /// Any events from [stream] will be emitted through [this.stream]. If this
+  /// group has a listener, [stream] will be listened to immediately; otherwise
+  /// it will only be listened to once this group gets a listener.
+  ///
+  /// If this is a single-subscription group and its subscription has been
+  /// canceled, [stream] will be canceled as soon as its added. If this returns
+  /// a [Future], it will be returned from [add]. Otherwise, [add] returns
+  /// `null`.
+  ///
+  /// Throws a [StateError] if this group is closed.
+  Future add(Stream<T> stream) {
+    if (_closed) {
+      throw new StateError("Can't add a Stream to a closed StreamGroup.");
+    }
+
+    if (_state == _StreamGroupState.dormant) {
+      _subscriptions.putIfAbsent(stream, () => null);
+    } else if (_state == _StreamGroupState.canceled) {
+      // Listen to the stream and cancel it immediately so that no one else can
+      // listen, for consistency. If the stream has an onCancel listener this
+      // will also fire that, which may help it clean up resources.
+      return stream.listen(null).cancel();
+    } else {
+      _subscriptions.putIfAbsent(stream, () => _listenToStream(stream));
+    }
+
+    return null;
+  }
+
+  /// Removes [stream] as a member of this group.
+  ///
+  /// No further events from [stream] will be emitted through this group. If
+  /// [stream] has been listened to, its subscription will be canceled.
+  ///
+  /// If [stream] has been listened to, this *synchronously* cancels its
+  /// subscription. This means that any events from [stream] that haven't yet
+  /// been emitted through this group will not be.
+  ///
+  /// If [stream]'s subscription is canceled, this returns
+  /// [StreamSubscription.cancel]'s return value. Otherwise, it returns `null`.
+  Future remove(Stream<T> stream) {
+    var subscription = _subscriptions.remove(stream);
+    var future = subscription == null ? null : subscription.cancel();
+    if (_closed && _subscriptions.isEmpty) _controller.close();
+    return future;
+  }
+
+  /// A callback called when [stream] is listened to.
+  ///
+  /// This is called for both single-subscription and broadcast groups.
+  void _onListen() {
+    _state = _StreamGroupState.listening;
+    _subscriptions.forEach((stream, subscription) {
+      // If this is a broadcast group and this isn't the first time it's been
+      // listened to, there may still be some subscriptions to
+      // single-subscription streams.
+      if (subscription != null) return;
+      _subscriptions[stream] = _listenToStream(stream);
+    });
+  }
+
+  /// A callback called when [stream] is paused.
+  void _onPause() {
+    _state = _StreamGroupState.paused;
+    for (var subscription in _subscriptions.values) {
+      subscription.pause();
+    }
+  }
+
+  /// A callback called when [stream] is resumed.
+  void _onResume() {
+    _state = _StreamGroupState.listening;
+    for (var subscription in _subscriptions.values) {
+      subscription.resume();
+    }
+  }
+
+  /// A callback called when [stream] is canceled.
+  ///
+  /// This is only called for single-subscription groups.
+  Future _onCancel() {
+    _state = _StreamGroupState.canceled;
+
+    var futures = _subscriptions.values
+        .map((subscription) => subscription.cancel())
+        .where((future) => future != null)
+        .toList();
+
+    _subscriptions.clear();
+    return futures.isEmpty ? null : Future.wait(futures);
+  }
+
+  /// A callback called when [stream]'s last listener is canceled.
+  ///
+  /// This is only called for broadcast groups.
+  void _onCancelBroadcast() {
+    _state = _StreamGroupState.dormant;
+
+    _subscriptions.forEach((stream, subscription) {
+      // Cancel the broadcast streams, since we can re-listen to those later,
+      // but allow the single-subscription streams to keep firing. Their events
+      // will still be added to [_controller], but then they'll be dropped since
+      // it has no listeners.
+      if (!stream.isBroadcast) return;
+      subscription.cancel();
+      _subscriptions[stream] = null;
+    });
+  }
+
+  /// Starts actively forwarding events from [stream] to [_controller].
+  ///
+  /// This will pause the resulting subscription if [this] is paused.
+  StreamSubscription _listenToStream(Stream stream) {
+    var subscription = stream.listen(
+        _controller.add,
+        onError: _controller.addError,
+        onDone: () => remove(stream));
+    if (_state == _StreamGroupState.paused) subscription.pause();
+    return subscription;
+  }
+
+  /// Closes the group, indicating that no more streams will be added.
+  ///
+  /// If there are no streams in the group, [stream] is closed immediately.
+  /// Otherwise, [stream] will close once all streams in the group close.
+  ///
+  /// Returns a [Future] that completes once [stream] has actually been closed.
+  Future close() {
+    if (_closed) return _controller.done;
+
+    _closed = true;
+    if (_subscriptions.isEmpty) _controller.close();
+
+    return _controller.done;
+  }
+}
+
+/// An enum of possible states of a [StreamGroup].
+class _StreamGroupState {
+  /// The group has no listeners.
+  ///
+  /// New streams added to the group will be listened once the group has a
+  /// listener.
+  static const dormant = const _StreamGroupState("dormant");
+
+  /// The group has one or more listeners and is actively firing events.
+  ///
+  /// New streams added to the group will be immediately listeners.
+  static const listening = const _StreamGroupState("listening");
+
+  /// The group is paused and no more events will be fired until it resumes.
+  ///
+  /// New streams added to the group will be listened to, but then paused. They
+  /// will be resumed once the group itself is resumed.
+  ///
+  /// This state is only used by single-subscriber groups.
+  static const paused = const _StreamGroupState("paused");
+
+  /// The group is canceled and no more events will be fired ever.
+  ///
+  /// New streams added to the group will be listened to, canceled, and
+  /// discarded.
+  ///
+  /// This state is only used by single-subscriber groups.
+  static const canceled = const _StreamGroupState("canceled");
+
+  /// The name of the state.
+  ///
+  /// Used for debugging.
+  final String name;
+
+  const _StreamGroupState(this.name);
+
+  String toString() => name;
+}
diff --git a/mojo/public/dart/third_party/async/lib/src/stream_queue.dart b/mojo/public/dart/third_party/async/lib/src/stream_queue.dart
new file mode 100644
index 0000000..36d03ef
--- /dev/null
+++ b/mojo/public/dart/third_party/async/lib/src/stream_queue.dart
@@ -0,0 +1,630 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library async.stream_events;
+
+import 'dart:async';
+import 'dart:collection';
+
+import "subscription_stream.dart";
+import "stream_completer.dart";
+import "../result.dart";
+
+/// An asynchronous pull-based interface for accessing stream events.
+///
+/// Wraps a stream and makes individual events available on request.
+///
+/// You can request (and reserve) one or more events from the stream,
+/// and after all previous requests have been fulfilled, stream events
+/// go towards fulfilling your request.
+///
+/// For example, if you ask for [next] two times, the returned futures
+/// will be completed by the next two unrequested events from the stream.
+///
+/// The stream subscription is paused when there are no active
+/// requests.
+///
+/// Some streams, including broadcast streams, will buffer
+/// events while paused, so waiting too long between requests may
+/// cause memory bloat somewhere else.
+///
+/// This is similar to, but more convenient than, a [StreamIterator].
+/// A `StreamIterator` requires you to manually check when a new event is
+/// available and you can only access the value of that event until you
+/// check for the next one. A `StreamQueue` allows you to request, for example,
+/// three events at a time, either individually, as a group using [take]
+/// or [skip], or in any combination.
+///
+/// You can also ask to have the [rest] of the stream provided as
+/// a new stream. This allows, for example, taking the first event
+/// out of a stream and continuing to use the rest of the stream as a stream.
+///
+/// Example:
+///
+///     var events = new StreamQueue<String>(someStreamOfLines);
+///     var first = await events.next;
+///     while (first.startsWith('#')) {
+///       // Skip comments.
+///       first = await events.next;
+///     }
+///
+///     if (first.startsWith(MAGIC_MARKER)) {
+///       var headerCount =
+///           first.parseInt(first.substring(MAGIC_MARKER.length + 1));
+///       handleMessage(headers: await events.take(headerCount),
+///                     body: events.rest);
+///       return;
+///     }
+///     // Error handling.
+///
+/// When you need no further events the `StreamQueue` should be closed
+/// using [cancel]. This releases the underlying stream subscription.
+class StreamQueue<T> {
+  // This class maintains two queues: one of events and one of requests.
+  // The active request (the one in front of the queue) is called with
+  // the current event queue when it becomes active.
+  //
+  // If the request returns true, it's complete and will be removed from the
+  // request queue.
+  // If the request returns false, it needs more events, and will be called
+  // again when new events are available.
+  // The request can remove events that it uses, or keep them in the event
+  // queue until it has all that it needs.
+  //
+  // This model is very flexible and easily extensible.
+  // It allows requests that don't consume events (like [hasNext]) or
+  // potentially a request that takes either five or zero events, determined
+  // by the content of the fifth event.
+
+  /// Source of events.
+  final Stream _sourceStream;
+
+  /// Subscription on [_sourceStream] while listening for events.
+  ///
+  /// Set to subscription when listening, and set to `null` when the
+  /// subscription is done (and [_isDone] is set to true).
+  StreamSubscription _subscription;
+
+  /// Whether we have listened on [_sourceStream] and the subscription is done.
+  bool _isDone = false;
+
+  /// Whether a closing operation has been performed on the stream queue.
+  ///
+  /// Closing operations are [cancel] and [rest].
+  bool _isClosed = false;
+
+  /// Queue of events not used by a request yet.
+  final Queue<Result> _eventQueue = new Queue();
+
+  /// Queue of pending requests.
+  ///
+  /// Access through methods below to ensure consistency.
+  final Queue<_EventRequest> _requestQueue = new Queue();
+
+  /// Create a `StreamQueue` of the events of [source].
+  StreamQueue(Stream source)
+      : _sourceStream = source;
+
+  /// Asks if the stream has any more events.
+  ///
+  /// Returns a future that completes with `true` if the stream has any
+  /// more events, whether data or error.
+  /// If the stream closes without producing any more events, the returned
+  /// future completes with `false`.
+  ///
+  /// Can be used before using [next] to avoid getting an error in the
+  /// future returned by `next` in the case where there are no more events.
+  Future<bool> get hasNext {
+    if (!_isClosed) {
+      var hasNextRequest = new _HasNextRequest();
+      _addRequest(hasNextRequest);
+      return hasNextRequest.future;
+    }
+    throw _failClosed();
+  }
+
+  /// Requests the next (yet unrequested) event from the stream.
+  ///
+  /// When the requested event arrives, the returned future is completed with
+  /// the event.
+  /// If the event is a data event, the returned future completes
+  /// with its value.
+  /// If the event is an error event, the returned future completes with
+  /// its error and stack trace.
+  /// If the stream closes before an event arrives, the returned future
+  /// completes with a [StateError].
+  ///
+  /// It's possible to have several pending [next] calls (or other requests),
+  /// and they will be completed in the order they were requested, by the
+  /// first events that were not consumed by previous requeusts.
+  Future<T> get next {
+    if (!_isClosed) {
+      var nextRequest = new _NextRequest<T>();
+      _addRequest(nextRequest);
+      return nextRequest.future;
+    }
+    throw _failClosed();
+  }
+
+  /// Returns a stream of all the remaning events of the source stream.
+  ///
+  /// All requested [next], [skip] or [take] operations are completed
+  /// first, and then any remaining events are provided as events of
+  /// the returned stream.
+  ///
+  /// Using `rest` closes this stream queue. After getting the
+  /// `rest` the caller may no longer request other events, like
+  /// after calling [cancel].
+  Stream<T> get rest {
+    if (_isClosed) {
+      throw _failClosed();
+    }
+    var request = new _RestRequest<T>(this);
+    _isClosed = true;
+    _addRequest(request);
+    return request.stream;
+  }
+
+  /// Skips the next [count] *data* events.
+  ///
+  /// The [count] must be non-negative.
+  ///
+  /// When successful, this is equivalent to using [take]
+  /// and ignoring the result.
+  ///
+  /// If an error occurs before `count` data events have been skipped,
+  /// the returned future completes with that error instead.
+  ///
+  /// If the stream closes before `count` data events,
+  /// the remaining unskipped event count is returned.
+  /// If the returned future completes with the integer `0`,
+  /// then all events were succssfully skipped. If the value
+  /// is greater than zero then the stream ended early.
+  Future<int> skip(int count) {
+    if (count < 0) throw new RangeError.range(count, 0, null, "count");
+    if (!_isClosed) {
+      var request = new _SkipRequest(count);
+      _addRequest(request);
+      return request.future;
+    }
+    throw _failClosed();
+  }
+
+  /// Requests the next [count] data events as a list.
+  ///
+  /// The [count] must be non-negative.
+  ///
+  /// Equivalent to calling [next] `count` times and
+  /// storing the data values in a list.
+  ///
+  /// If an error occurs before `count` data events has
+  /// been collected, the returned future completes with
+  /// that error instead.
+  ///
+  /// If the stream closes before `count` data events,
+  /// the returned future completes with the list
+  /// of data collected so far. That is, the returned
+  /// list may have fewer than [count] elements.
+  Future<List<T>> take(int count) {
+    if (count < 0) throw new RangeError.range(count, 0, null, "count");
+    if (!_isClosed) {
+      var request = new _TakeRequest<T>(count);
+      _addRequest(request);
+      return request.future;
+    }
+    throw _failClosed();
+  }
+
+  /// Cancels the underlying stream subscription.
+  ///
+  /// If [immediate] is `false` (the default), the cancel operation waits until
+  /// all previously requested events have been processed, then it cancels the
+  /// subscription providing the events.
+  ///
+  /// If [immediate] is `true`, the subscription is instead canceled
+  /// immediately. Any pending events complete with a 'closed'-event, as though
+  /// the stream had closed by itself.
+  ///
+  /// The returned future completes with the result of calling
+  /// `cancel`.
+  ///
+  /// After calling `cancel`, no further events can be requested.
+  /// None of [next], [rest], [skip], [take] or [cancel] may be
+  /// called again.
+  Future cancel({bool immediate: false}) {
+    if (_isClosed) throw _failClosed();
+    _isClosed = true;
+
+    if (!immediate) {
+      var request = new _CancelRequest(this);
+      _addRequest(request);
+      return request.future;
+    }
+
+    if (_isDone) return new Future.value();
+    if (_subscription == null) _subscription = _sourceStream.listen(null);
+    var future = _subscription.cancel();
+    _onDone();
+    return future;
+  }
+
+  /// Returns an error for when a request is made after cancel.
+  ///
+  /// Returns a [StateError] with a message saying that either
+  /// [cancel] or [rest] have already been called.
+  Error _failClosed() {
+    return new StateError("Already cancelled");
+  }
+
+  // Callbacks receiving the events of the source stream.
+
+  void _onData(T data) {
+    _eventQueue.add(new Result.value(data));
+    _checkQueues();
+  }
+
+  void _onError(error, StackTrace stack) {
+    _eventQueue.add(new Result.error(error, stack));
+    _checkQueues();
+  }
+
+  void _onDone() {
+    _subscription = null;
+    _isDone = true;
+    _closeAllRequests();
+  }
+
+  // Request queue management.
+
+  /// Adds a new request to the queue.
+  void _addRequest(_EventRequest request) {
+    if (_isDone) {
+      assert(_requestQueue.isEmpty);
+      if (!request.addEvents(_eventQueue)) {
+        request.close(_eventQueue);
+      }
+      return;
+    }
+    if (_requestQueue.isEmpty) {
+      if (request.addEvents(_eventQueue)) return;
+      _ensureListening();
+    }
+    _requestQueue.add(request);
+  }
+
+  /// Ensures that we are listening on events from [_sourceStream].
+  ///
+  /// Resumes subscription on [_sourceStream], or creates it if necessary.
+  void _ensureListening() {
+    assert(!_isDone);
+    if (_subscription == null) {
+      _subscription =
+          _sourceStream.listen(_onData, onError: _onError, onDone: _onDone);
+    } else {
+      _subscription.resume();
+    }
+  }
+
+  /// Removes all requests and closes them.
+  ///
+  /// Used when the source stream is done.
+  /// After this, no further requests will be added to the queue,
+  /// requests are immediately served entirely by events already in the event
+  /// queue, if any.
+  void _closeAllRequests() {
+    assert(_isDone);
+    while (_requestQueue.isNotEmpty) {
+      var request = _requestQueue.removeFirst();
+      if (!request.addEvents(_eventQueue)) {
+        request.close(_eventQueue);
+      }
+    }
+  }
+
+  /// Matches events with requests.
+  ///
+  /// Called after receiving an event.
+  void _checkQueues() {
+    while (_requestQueue.isNotEmpty) {
+      if (_requestQueue.first.addEvents(_eventQueue)) {
+        _requestQueue.removeFirst();
+      } else {
+        return;
+      }
+    }
+    if (!_isDone) {
+      _subscription.pause();
+    }
+  }
+
+  /// Extracts the subscription and makes this stream queue unusable.
+  ///
+  /// Can only be used by the very last request.
+  StreamSubscription _dispose() {
+    assert(_isClosed);
+    var subscription = _subscription;
+    _subscription = null;
+    _isDone = true;
+    return subscription;
+  }
+}
+
+/// Request object that receives events when they arrive, until fulfilled.
+///
+/// Each request that cannot be fulfilled immediately is represented by
+/// an `_EventRequest` object in the request queue.
+///
+/// Events from the source stream are sent to the first request in the
+/// queue until it reports itself as [isComplete].
+///
+/// When the first request in the queue `isComplete`, either when becoming
+/// the first request or after receiving an event, its [close] methods is
+/// called.
+///
+/// The [close] method is also called immediately when the source stream
+/// is done.
+abstract class _EventRequest {
+  /// Handle available events.
+  ///
+  /// The available events are provided as a queue. The `addEvents` function
+  /// should only remove events from the front of the event queue, e.g.,
+  /// using [removeFirst].
+  ///
+  /// Returns `true` if the request is completed, or `false` if it needs
+  /// more events.
+  /// The call may keep events in the queue until the requeust is complete,
+  /// or it may remove them immediately.
+  ///
+  /// If the method returns true, the request is considered fulfilled, and
+  /// will never be called again.
+  ///
+  /// This method is called when a request reaches the front of the request
+  /// queue, and if it returns `false`, it's called again every time a new event
+  /// becomes available, or when the stream closes.
+  bool addEvents(Queue<Result> events);
+
+  /// Complete the request.
+  ///
+  /// This is called when the source stream is done before the request
+  /// had a chance to receive all its events. That is, after a call
+  /// to [addEvents] has returned `false`.
+  /// If there are any unused events available, they are in the [events] queue.
+  /// No further events will become available.
+  ///
+  /// The queue should only remove events from the front of the event queue,
+  /// e.g., using [removeFirst].
+  ///
+  /// If the request kept events in the queue after an [addEvents] call,
+  /// this is the last chance to use them.
+  void close(Queue<Result> events);
+}
+
+/// Request for a [StreamQueue.next] call.
+///
+/// Completes the returned future when receiving the first event,
+/// and is then complete.
+class _NextRequest<T> implements _EventRequest {
+  /// Completer for the future returned by [StreamQueue.next].
+  final Completer _completer;
+
+  _NextRequest() : _completer = new Completer<T>();
+
+  Future<T> get future => _completer.future;
+
+  bool addEvents(Queue<Result> events) {
+    if (events.isEmpty) return false;
+    events.removeFirst().complete(_completer);
+    return true;
+  }
+
+  void close(Queue<Result> events) {
+    var errorFuture =
+        new Future.sync(() => throw new StateError("No elements"));
+    _completer.complete(errorFuture);
+  }
+}
+
+/// Request for a [StreamQueue.skip] call.
+class _SkipRequest implements _EventRequest {
+  /// Completer for the future returned by the skip call.
+  final Completer _completer = new Completer<int>();
+
+  /// Number of remaining events to skip.
+  ///
+  /// The request [isComplete] when the values reaches zero.
+  ///
+  /// Decremented when an event is seen.
+  /// Set to zero when an error is seen since errors abort the skip request.
+  int _eventsToSkip;
+
+  _SkipRequest(this._eventsToSkip);
+
+  /// The future completed when the correct number of events have been skipped.
+  Future get future => _completer.future;
+
+  bool addEvents(Queue<Result> events) {
+    while (_eventsToSkip > 0) {
+      if (events.isEmpty) return false;
+      _eventsToSkip--;
+      var event = events.removeFirst();
+      if (event.isError) {
+        event.complete(_completer);
+        return true;
+      }
+    }
+    _completer.complete(0);
+    return true;
+  }
+
+  void close(Queue<Result> events) {
+    _completer.complete(_eventsToSkip);
+  }
+}
+
+/// Request for a [StreamQueue.take] call.
+class _TakeRequest<T> implements _EventRequest {
+  /// Completer for the future returned by the take call.
+  final Completer _completer;
+
+  /// List collecting events until enough have been seen.
+  final List _list = <T>[];
+
+  /// Number of events to capture.
+  ///
+  /// The request [isComplete] when the length of [_list] reaches
+  /// this value.
+  final int _eventsToTake;
+
+  _TakeRequest(this._eventsToTake) : _completer = new Completer<List<T>>();
+
+  /// The future completed when the correct number of events have been captured.
+  Future get future => _completer.future;
+
+  bool addEvents(Queue<Result> events) {
+    while (_list.length < _eventsToTake) {
+      if (events.isEmpty) return false;
+      var result = events.removeFirst();
+      if (result.isError) {
+        result.complete(_completer);
+        return true;
+      }
+      _list.add(result.asValue.value);
+    }
+    _completer.complete(_list);
+    return true;
+  }
+
+  void close(Queue<Result> events) {
+    _completer.complete(_list);
+  }
+}
+
+/// Request for a [StreamQueue.cancel] call.
+///
+/// The request needs no events, it just waits in the request queue
+/// until all previous events are fulfilled, then it cancels the stream queue
+/// source subscription.
+class _CancelRequest implements _EventRequest {
+  /// Completer for the future returned by the `cancel` call.
+  final Completer _completer = new Completer();
+
+  /// The [StreamQueue] object that has this request queued.
+  ///
+  /// When the event is completed, it needs to cancel the active subscription
+  /// of the `StreamQueue` object, if any.
+  final StreamQueue _streamQueue;
+
+  _CancelRequest(this._streamQueue);
+
+  /// The future completed when the cancel request is completed.
+  Future get future => _completer.future;
+
+  bool addEvents(Queue<Result> events) {
+    _shutdown();
+    return true;
+  }
+
+  void close(_) {
+    _shutdown();
+  }
+
+  void _shutdown() {
+    if (_streamQueue._isDone) {
+      _completer.complete();
+    } else {
+      _streamQueue._ensureListening();
+      _completer.complete(_streamQueue._dispose().cancel());
+    }
+  }
+}
+
+/// Request for a [StreamQueue.rest] call.
+///
+/// The request is always complete, it just waits in the request queue
+/// until all previous events are fulfilled, then it takes over the
+/// stream events subscription and creates a stream from it.
+class _RestRequest<T> implements _EventRequest {
+  /// Completer for the stream returned by the `rest` call.
+  final StreamCompleter _completer = new StreamCompleter<T>();
+
+  /// The [StreamQueue] object that has this request queued.
+  ///
+  /// When the event is completed, it needs to cancel the active subscription
+  /// of the `StreamQueue` object, if any.
+  final StreamQueue _streamQueue;
+
+  _RestRequest(this._streamQueue);
+
+  /// The stream which will contain the remaining events of [_streamQueue].
+  Stream<T> get stream => _completer.stream;
+
+  bool addEvents(Queue<Result> events) {
+    _completeStream(events);
+    return true;
+  }
+
+  void close(Queue<Result> events) {
+    _completeStream(events);
+  }
+
+  void _completeStream(Queue<Result> events) {
+    if (events.isEmpty) {
+      if (_streamQueue._isDone) {
+        _completer.setEmpty();
+      } else {
+        _completer.setSourceStream(_getRestStream());
+      }
+    } else {
+      // There are prefetched events which needs to be added before the
+      // remaining stream.
+      var controller = new StreamController<T>();
+      for (var event in events) {
+        event.addTo(controller);
+      }
+      controller.addStream(_getRestStream(), cancelOnError: false)
+                .whenComplete(controller.close);
+      _completer.setSourceStream(controller.stream);
+    }
+  }
+
+  /// Create a stream from the rest of [_streamQueue]'s subscription.
+  Stream _getRestStream() {
+    if (_streamQueue._isDone) {
+      var controller = new StreamController<T>()..close();
+      return controller.stream;
+      // TODO(lrn). Use the following when 1.11 is released.
+      // return new Stream<T>.empty();
+    }
+    if (_streamQueue._subscription == null) {
+      return _streamQueue._sourceStream;
+    }
+    var subscription = _streamQueue._dispose();
+    subscription.resume();
+    return new SubscriptionStream<T>(subscription);
+  }
+}
+
+/// Request for a [StreamQueue.hasNext] call.
+///
+/// Completes the [future] with `true` if it sees any event,
+/// but doesn't consume the event.
+/// If the request is closed without seeing an event, then
+/// the [future] is completed with `false`.
+class _HasNextRequest<T> implements _EventRequest {
+  final Completer _completer = new Completer<bool>();
+
+  Future<bool> get future => _completer.future;
+
+  bool addEvents(Queue<Result> events) {
+    if (events.isNotEmpty) {
+      _completer.complete(true);
+      return true;
+    }
+    return false;
+  }
+
+  void close(_) {
+    _completer.complete(false);
+  }
+}
diff --git a/mojo/public/dart/third_party/async/lib/src/stream_splitter.dart b/mojo/public/dart/third_party/async/lib/src/stream_splitter.dart
new file mode 100644
index 0000000..6ec440f
--- /dev/null
+++ b/mojo/public/dart/third_party/async/lib/src/stream_splitter.dart
@@ -0,0 +1,213 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library async.stream_splitter;
+
+import 'dart:async';
+import 'dart:collection';
+
+import '../result.dart';
+import 'future_group.dart';
+
+/// A class that splits a single source stream into an arbitrary number of
+/// (single-subscription) streams (called "branch") that emit the same events.
+///
+/// Each branch will emit all the same values and errors as the source stream,
+/// regardless of which values have been emitted on other branches. This means
+/// that the splitter stores every event that has been emitted so far, which may
+/// consume a lot of memory. The user can call [close] to indicate that no more
+/// branches will be created, and this memory will be released.
+///
+/// The source stream is only listened to once a branch is created *and listened
+/// to*. It's paused when all branches are paused *or when all branches are
+/// canceled*, and resumed once there's at least one branch that's listening and
+/// unpaused. It's not canceled unless no branches are listening and [close] has
+/// been called.
+class StreamSplitter<T> {
+  /// The wrapped stream.
+  final Stream<T> _stream;
+
+  /// The subscription to [_stream].
+  ///
+  /// This will be `null` until a branch has a listener.
+  StreamSubscription<T> _subscription;
+
+  /// The buffer of events or errors that have already been emitted by
+  /// [_stream].
+  final _buffer = new List<Result<T>>();
+
+  /// The controllers for branches that are listening for future events from
+  /// [_stream].
+  ///
+  /// Once a branch is canceled, it's removed from this list. When [_stream] is
+  /// done, all branches are removed.
+  final _controllers = new Set<StreamController<T>>();
+
+  /// A group of futures returned by [close].
+  ///
+  /// This is used to ensure that [close] doesn't complete until all
+  /// [StreamController.close] and [StreamSubscription.cancel] calls complete.
+  final _closeGroup = new FutureGroup();
+
+  /// Whether [_stream] is done emitting events.
+  var _isDone = false;
+
+  /// Whether [close] has been called.
+  var _isClosed = false;
+
+  /// Splits [stream] into [count] identical streams.
+  ///
+  /// [count] defaults to 2. This is the same as creating [count] branches and
+  /// then closing the [StreamSplitter].
+  static List<Stream> splitFrom(Stream stream, [int count]) {
+    if (count == null) count = 2;
+    var splitter = new StreamSplitter(stream);
+    var streams = new List.generate(count, (_) => splitter.split());
+    splitter.close();
+    return streams;
+  }
+
+  StreamSplitter(this._stream);
+
+  /// Returns a single-subscription stream that's a copy of the input stream.
+  ///
+  /// This will throw a [StateError] if [close] has been called.
+  Stream<T> split() {
+    if (_isClosed) {
+      throw new StateError("Can't call split() on a closed StreamSplitter.");
+    }
+
+    var controller;
+    controller = new StreamController<T>(
+        onListen: _onListen,
+        onPause: _onPause,
+        onResume: _onResume,
+        onCancel: () => _onCancel(controller));
+
+    for (var result in _buffer) {
+      result.addTo(controller);
+    }
+
+    if (_isDone) {
+      _closeGroup.add(controller.close());
+    } else {
+      _controllers.add(controller);
+    }
+
+    return controller.stream;
+  }
+
+  /// Indicates that no more branches will be requested via [split].
+  ///
+  /// This clears the internal buffer of events. If there are no branches or all
+  /// branches have been canceled, this cancels the subscription to the input
+  /// stream.
+  ///
+  /// Returns a [Future] that completes once all events have been processed by
+  /// all branches and (if applicable) the subscription to the input stream has
+  /// been canceled.
+  Future close() {
+    if (_isClosed) return _closeGroup.future;
+    _isClosed = true;
+
+    _buffer.clear();
+    if (_controllers.isEmpty) _cancelSubscription();
+
+    return _closeGroup.future;
+  }
+
+  /// Cancel [_subscription] and close [_closeGroup].
+  ///
+  /// This should be called after all the branches' subscriptions have been
+  /// canceled and the splitter has been closed. In that case, we won't use the
+  /// events from [_subscription] any more, since there's nothing to pipe them
+  /// to and no more branches will be created. If [_subscription] is done,
+  /// canceling it will be a no-op.
+  ///
+  /// This may also be called before any branches have been created, in which
+  /// case [_subscription] will be `null`.
+  void _cancelSubscription() {
+    assert(_controllers.isEmpty);
+    assert(_isClosed);
+
+    var future = null;
+    if (_subscription != null) future = _subscription.cancel();
+    if (future != null) _closeGroup.add(future);
+    _closeGroup.close();
+  }
+
+  // StreamController events
+
+  /// Subscribe to [_stream] if we haven't yet done so, and resume the
+  /// subscription if we have.
+  void _onListen() {
+    if (_isDone) return;
+
+    if (_subscription != null) {
+      // Resume the subscription in case it was paused, either because all the
+      // controllers were paused or because the last one was canceled. If it
+      // wasn't paused, this will be a no-op.
+      _subscription.resume();
+    } else {
+      _subscription = _stream.listen(
+          _onData, onError: _onError, onDone: _onDone);
+    }
+  }
+
+  /// Pauses [_subscription] if every controller is paused.
+  void _onPause() {
+    if (!_controllers.every((controller) => controller.isPaused)) return;
+    _subscription.pause();
+  }
+
+  /// Resumes [_subscription].
+  ///
+  /// If [_subscription] wasn't paused, this is a no-op.
+  void _onResume() {
+    _subscription.resume();
+  }
+
+  /// Removes [controller] from [_controllers] and cancels or pauses
+  /// [_subscription] as appropriate.
+  ///
+  /// Since the controller emitting a done event will cause it to register as
+  /// canceled, this is the only way that a controller is ever removed from
+  /// [_controllers].
+  void _onCancel(StreamController controller) {
+    _controllers.remove(controller);
+    if (_controllers.isNotEmpty) return;
+
+    if (_isClosed) {
+      _cancelSubscription();
+    } else {
+      _subscription.pause();
+    }
+  }
+
+  // Stream events
+
+  /// Buffers [data] and passes it to [_controllers].
+  void _onData(T data) {
+    if (!_isClosed) _buffer.add(new Result.value(data));
+    for (var controller in _controllers) {
+      controller.add(data);
+    }
+  }
+
+  /// Buffers [error] and passes it to [_controllers].
+  void _onError(Object error, StackTrace stackTrace) {
+    if (!_isClosed) _buffer.add(new Result.error(error, stackTrace));
+    for (var controller in _controllers) {
+      controller.addError(error, stackTrace);
+    }
+  }
+
+  /// Marks [_controllers] as done.
+  void _onDone() {
+    _isDone = true;
+    for (var controller in _controllers) {
+      _closeGroup.add(controller.close());
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/async/lib/src/subscription_stream.dart b/mojo/public/dart/third_party/async/lib/src/subscription_stream.dart
new file mode 100644
index 0000000..e9e7d77
--- /dev/null
+++ b/mojo/public/dart/third_party/async/lib/src/subscription_stream.dart
@@ -0,0 +1,101 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library async.subscription_stream;
+
+import 'dart:async';
+
+import "delegate/stream_subscription.dart";
+
+/// A [Stream] adapter for a [StreamSubscription].
+///
+/// This class allows as `StreamSubscription` to be treated as a `Stream`.
+///
+/// The subscription is paused until the stream is listened to,
+/// then it is resumed and the events are passed on to the
+/// stream's new subscription.
+///
+/// This class assumes that is has control over the original subscription.
+/// If other code is accessing the subscription, results may be unpredictable.
+class SubscriptionStream<T> extends Stream<T> {
+  /// The subscription providing the events for this stream.
+  StreamSubscription _source;
+
+  /// Create a single-subscription `Stream` from [subscription].
+  ///
+  /// The `subscription` should not be paused. This class will not resume prior
+  /// pauses, so being paused is indistinguishable from not providing any
+  /// events.
+  ///
+  /// If the `subscription` doesn't send any `done` events, neither will this
+  /// stream. That may be an issue if `subscription` was made to cancel on
+  /// an error.
+  SubscriptionStream(StreamSubscription subscription)
+       : _source = subscription {
+    _source.pause();
+    // Clear callbacks to avoid keeping them alive unnecessarily.
+    _source.onData(null);
+    _source.onError(null);
+    _source.onDone(null);
+  }
+
+  StreamSubscription<T> listen(void onData(T event),
+                               {Function onError,
+                                void onDone(),
+                                bool cancelOnError}) {
+    if (_source == null) {
+      throw new StateError("Stream has already been listened to.");
+    }
+    cancelOnError = (true == cancelOnError);
+    var subscription = _source;
+    _source = null;
+    var result;
+    if (cancelOnError) {
+      result = new _CancelOnErrorSubscriptionWrapper<T>(subscription);
+    } else {
+      // Wrap the subscription to ensure correct type parameter.
+      result = new DelegatingStreamSubscription<T>(subscription);
+    }
+    result.onData(onData);
+    result.onError(onError);
+    result.onDone(onDone);
+    subscription.resume();
+    return result;
+  }
+}
+
+/// Subscription wrapper that cancels on error.
+///
+/// Used by [SubscriptionStream] when forwarding a subscription
+/// created with `cancelOnError` as `true` to one with (assumed)
+/// `cancelOnError` as `false`. It automatically cancels the
+/// source subscription on the first error.
+class _CancelOnErrorSubscriptionWrapper<T>
+    extends DelegatingStreamSubscription<T> {
+  _CancelOnErrorSubscriptionWrapper(StreamSubscription subscription)
+      : super(subscription);
+
+  void onError(Function handleError) {
+    // Cancel when receiving an error.
+    super.onError((error, StackTrace stackTrace) {
+      var cancelFuture = super.cancel();
+      if (cancelFuture != null) {
+        // Wait for the cancel to complete before sending the error event.
+        cancelFuture.whenComplete(() {
+          if (handleError is ZoneBinaryCallback) {
+            handleError(error, stackTrace);
+          } else {
+            handleError(error);
+          }
+        });
+      } else {
+        if (handleError is ZoneBinaryCallback) {
+          handleError(error, stackTrace);
+        } else {
+          handleError(error);
+        }
+      }
+    });
+  }
+}
diff --git a/mojo/public/dart/third_party/async/lib/stream_zip.dart b/mojo/public/dart/third_party/async/lib/stream_zip.dart
new file mode 100644
index 0000000..055489d
--- /dev/null
+++ b/mojo/public/dart/third_party/async/lib/stream_zip.dart
@@ -0,0 +1,119 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Help for combining multiple streams into a single stream.
+ */
+library dart.pkg.async.stream_zip;
+
+import "dart:async";
+
+/**
+ * A stream that combines the values of other streams.
+ */
+class StreamZip extends Stream<List> {
+  final Iterable<Stream> _streams;
+  StreamZip(Iterable<Stream> streams) : _streams = streams;
+
+  StreamSubscription<List> listen(void onData(List data), {
+                                  Function onError,
+                                  void onDone(),
+                                  bool cancelOnError}) {
+    cancelOnError = identical(true, cancelOnError);
+    List<StreamSubscription> subscriptions = <StreamSubscription>[];
+    StreamController controller;
+    List current;
+    int dataCount = 0;
+
+    /// Called for each data from a subscription in [subscriptions].
+    void handleData(int index, data) {
+      current[index] = data;
+      dataCount++;
+      if (dataCount == subscriptions.length) {
+        List data = current;
+        current = new List(subscriptions.length);
+        dataCount = 0;
+        for (int i = 0; i < subscriptions.length; i++) {
+          if (i != index) subscriptions[i].resume();
+        }
+        controller.add(data);
+      } else {
+        subscriptions[index].pause();
+      }
+    }
+
+    /// Called for each error from a subscription in [subscriptions].
+    /// Except if [cancelOnError] is true, in which case the function below
+    /// is used instead.
+    void handleError(Object error, StackTrace stackTrace) {
+      controller.addError(error, stackTrace);
+    }
+
+    /// Called when a subscription has an error and [cancelOnError] is true.
+    ///
+    /// Prematurely cancels all subscriptions since we know that we won't
+    /// be needing any more values.
+    void handleErrorCancel(Object error, StackTrace stackTrace) {
+      for (int i = 0; i < subscriptions.length; i++) {
+        subscriptions[i].cancel();
+      }
+      controller.addError(error, stackTrace);
+    }
+
+    void handleDone() {
+      for (int i = 0; i < subscriptions.length; i++) {
+        subscriptions[i].cancel();
+      }
+      controller.close();
+    }
+
+    try {
+      for (Stream stream in _streams) {
+        int index = subscriptions.length;
+        subscriptions.add(stream.listen(
+            (data) { handleData(index, data); },
+            onError: cancelOnError ? handleError : handleErrorCancel,
+            onDone: handleDone,
+            cancelOnError: cancelOnError));
+      }
+    } catch (e) {
+      for (int i = subscriptions.length - 1; i >= 0; i--) {
+        subscriptions[i].cancel();
+      }
+      rethrow;
+    }
+
+    current = new List(subscriptions.length);
+
+    controller = new StreamController<List>(
+      onPause: () {
+        for (int i = 0; i < subscriptions.length; i++) {
+          // This may pause some subscriptions more than once.
+          // These will not be resumed by onResume below, but must wait for the
+          // next round.
+          subscriptions[i].pause();
+        }
+      },
+      onResume: () {
+        for (int i = 0; i < subscriptions.length; i++) {
+          subscriptions[i].resume();
+        }
+      },
+      onCancel: () {
+        for (int i = 0; i < subscriptions.length; i++) {
+          // Canceling more than once is safe.
+          subscriptions[i].cancel();
+        }
+      }
+    );
+
+    if (subscriptions.isEmpty) {
+      controller.close();
+    }
+    return controller.stream.listen(onData,
+                                    onError: onError,
+                                    onDone: onDone,
+                                    cancelOnError: cancelOnError);
+  }
+}
diff --git a/mojo/public/dart/third_party/async/pubspec.yaml b/mojo/public/dart/third_party/async/pubspec.yaml
new file mode 100644
index 0000000..84b8de5
--- /dev/null
+++ b/mojo/public/dart/third_party/async/pubspec.yaml
@@ -0,0 +1,10 @@
+name: async
+version: 1.3.0
+author: Dart Team <misc@dartlang.org>
+description: Utility functions and classes related to the 'dart:async' library.
+homepage: https://www.github.com/dart-lang/async
+dev_dependencies:
+  stack_trace: "^1.0.0"
+  test: "^0.12.0"
+environment:
+  sdk: ">=1.9.0 <2.0.0"
diff --git a/mojo/public/dart/third_party/async/test/async_memoizer_test.dart b/mojo/public/dart/third_party/async/test/async_memoizer_test.dart
new file mode 100644
index 0000000..3289aa9
--- /dev/null
+++ b/mojo/public/dart/third_party/async/test/async_memoizer_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:async/async.dart';
+import 'package:test/test.dart';
+
+main() {
+  var cache;
+  setUp(() => cache = new AsyncMemoizer());
+
+  test("runs the function only the first time runOnce() is called", () async {
+    var count = 0;
+    expect(await cache.runOnce(() => count++), equals(0));
+    expect(count, equals(1));
+
+    expect(await cache.runOnce(() => count++), equals(0));
+    expect(count, equals(1));
+  });
+
+  test("forwards the return value from the function", () async {
+    expect(cache.runOnce(() => "value"), completion(equals("value")));
+    expect(cache.runOnce(() {}), completion(equals("value")));
+  });
+
+  test("forwards the return value from an async function", () async {
+    expect(cache.runOnce(() async => "value"), completion(equals("value")));
+    expect(cache.runOnce(() {}), completion(equals("value")));
+  });
+
+  test("forwards the error from an async function", () async {
+    expect(cache.runOnce(() async => throw "error"), throwsA("error"));
+    expect(cache.runOnce(() {}), throwsA("error"));
+  });
+}
diff --git a/mojo/public/dart/third_party/async/test/future_group_test.dart b/mojo/public/dart/third_party/async/test/future_group_test.dart
new file mode 100644
index 0000000..09ea29a
--- /dev/null
+++ b/mojo/public/dart/third_party/async/test/future_group_test.dart
@@ -0,0 +1,220 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:async/src/future_group.dart';
+import 'package:test/test.dart';
+
+import 'utils.dart';
+
+void main() {
+  var futureGroup;
+  setUp(() {
+    futureGroup = new FutureGroup();
+  });
+
+  group("with no futures", () {
+    test("never completes if nothing happens", () async {
+      var completed = false;
+      futureGroup.future.then((_) => completed = true);
+
+      await flushMicrotasks();
+      expect(completed, isFalse);
+    });
+
+    test("completes once it's closed", () {
+      expect(futureGroup.future, completion(isEmpty));
+      futureGroup.close();
+    });
+  });
+
+  group("with a future that already completed", () {
+    test("never completes if nothing happens", () async {
+      futureGroup.add(new Future.value());
+      await flushMicrotasks();
+
+      var completed = false;
+      futureGroup.future.then((_) => completed = true);
+
+      await flushMicrotasks();
+      expect(completed, isFalse);
+    });
+
+    test("completes once it's closed", () async {
+      futureGroup.add(new Future.value());
+      await flushMicrotasks();
+
+      expect(futureGroup.future, completes);
+      futureGroup.close();
+    });
+
+    test("completes to that future's value", () {
+      futureGroup.add(new Future.value(1));
+      futureGroup.close();
+      expect(futureGroup.future, completion(equals([1])));
+    });
+
+    test("completes to that future's error, even if it's not closed", () {
+      futureGroup.add(new Future.error("error"));
+      expect(futureGroup.future, throwsA("error"));
+    });
+  });
+
+  test("completes once all contained futures complete", () async {
+    var completer1 = new Completer();
+    var completer2 = new Completer();
+    var completer3 = new Completer();
+
+    futureGroup.add(completer1.future);
+    futureGroup.add(completer2.future);
+    futureGroup.add(completer3.future);
+    futureGroup.close();
+
+    var completed = false;
+    futureGroup.future.then((_) => completed = true);
+
+    completer1.complete();
+    await flushMicrotasks();
+    expect(completed, isFalse);
+
+    completer2.complete();
+    await flushMicrotasks();
+    expect(completed, isFalse);
+
+    completer3.complete();
+    await flushMicrotasks();
+    expect(completed, isTrue);
+  });
+
+  test("completes to the values of the futures in order of addition", () {
+    var completer1 = new Completer();
+    var completer2 = new Completer();
+    var completer3 = new Completer();
+
+    futureGroup.add(completer1.future);
+    futureGroup.add(completer2.future);
+    futureGroup.add(completer3.future);
+    futureGroup.close();
+
+    // Complete the completers in reverse order to prove that that doesn't
+    // affect the result order.
+    completer3.complete(3);
+    completer2.complete(2);
+    completer1.complete(1);
+    expect(futureGroup.future, completion(equals([1, 2, 3])));
+  });
+
+  test("completes to the first error to be emitted, even if it's not closed",
+      () {
+    var completer1 = new Completer();
+    var completer2 = new Completer();
+    var completer3 = new Completer();
+
+    futureGroup.add(completer1.future);
+    futureGroup.add(completer2.future);
+    futureGroup.add(completer3.future);
+
+    completer2.completeError("error 2");
+    completer1.completeError("error 1");
+    expect(futureGroup.future, throwsA("error 2"));
+  });
+
+  group("onIdle:", () {
+    test("emits an event when the last pending future completes", () async {
+      var idle = false;
+      futureGroup.onIdle.listen((_) => idle = true);
+
+      var completer1 = new Completer();
+      var completer2 = new Completer();
+      var completer3 = new Completer();
+
+      futureGroup.add(completer1.future);
+      futureGroup.add(completer2.future);
+      futureGroup.add(completer3.future);
+
+      await flushMicrotasks();
+      expect(idle, isFalse);
+      expect(futureGroup.isIdle, isFalse);
+
+      completer1.complete();
+      await flushMicrotasks();
+      expect(idle, isFalse);
+      expect(futureGroup.isIdle, isFalse);
+
+      completer2.complete();
+      await flushMicrotasks();
+      expect(idle, isFalse);
+      expect(futureGroup.isIdle, isFalse);
+
+      completer3.complete();
+      await flushMicrotasks();
+      expect(idle, isTrue);
+      expect(futureGroup.isIdle, isTrue);
+    });
+
+    test("emits an event each time it becomes idle", () async {
+      var idle = false;
+      futureGroup.onIdle.listen((_) => idle = true);
+
+      var completer = new Completer();
+      futureGroup.add(completer.future);
+
+      completer.complete();
+      await flushMicrotasks();
+      expect(idle, isTrue);
+      expect(futureGroup.isIdle, isTrue);
+
+      idle = false;
+      completer = new Completer();
+      futureGroup.add(completer.future);
+
+      await flushMicrotasks();
+      expect(idle, isFalse);
+      expect(futureGroup.isIdle, isFalse);
+
+      completer.complete();
+      await flushMicrotasks();
+      expect(idle, isTrue);
+      expect(futureGroup.isIdle, isTrue);
+    });
+
+    test("emits an event when the group closes", () async {
+      // It's important that the order of events here stays consistent over
+      // time, since code may rely on it in subtle ways.
+      var idle = false;
+      var onIdleDone = false;
+      var futureFired = false;
+
+      futureGroup.onIdle.listen(expectAsync((_) {
+        expect(futureFired, isFalse);
+        idle = true;
+      }), onDone: expectAsync(() {
+        expect(idle, isTrue);
+        expect(futureFired, isFalse);
+        onIdleDone = true;
+      }));
+
+      futureGroup.future.then(expectAsync((_) {
+        expect(idle, isTrue);
+        expect(onIdleDone, isTrue);
+        futureFired = true;
+      }));
+
+      var completer = new Completer();
+      futureGroup.add(completer.future);
+      futureGroup.close();
+
+      await flushMicrotasks();
+      expect(idle, isFalse);
+      expect(futureGroup.isIdle, isFalse);
+
+      completer.complete();
+      await flushMicrotasks();
+      expect(idle, isTrue);
+      expect(futureGroup.isIdle, isTrue);
+      expect(futureFired, isTrue);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/async/test/result_future_test.dart b/mojo/public/dart/third_party/async/test/result_future_test.dart
new file mode 100644
index 0000000..d8b4e01
--- /dev/null
+++ b/mojo/public/dart/third_party/async/test/result_future_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:async/async.dart';
+import 'package:stack_trace/stack_trace.dart';
+import 'package:test/test.dart';
+
+void main() {
+  var completer;
+  var future;
+  setUp(() {
+    completer = new Completer();
+    future = new ResultFuture(completer.future);
+  });
+
+  test('before completion, result is null', () {
+    expect(future.result, isNull);
+  });
+
+  test('after successful completion, result is the value of the future', () {
+    completer.complete(12);
+
+    // The completer calls its listeners asynchronously. We have to wait
+    // before we can access the result.
+    expect(future.then((_) => future.result.asValue.value),
+        completion(equals(12)));
+  });
+
+  test("after an error completion, result is the future's error", () {
+    var trace = new Trace.current();
+    completer.completeError('error', trace);
+
+    // The completer calls its listeners asynchronously. We have to wait
+    // before we can access the result.
+    return future.catchError((_) {}).then((_) {
+      var error = future.result.asError;
+      expect(error.error, equals('error'));
+      expect(error.stackTrace, equals(trace));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/async/test/result_test.dart b/mojo/public/dart/third_party/async/test/result_test.dart
new file mode 100644
index 0000000..848c455
--- /dev/null
+++ b/mojo/public/dart/third_party/async/test/result_test.dart
@@ -0,0 +1,339 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+import "dart:collection";
+
+import "package:async/result.dart";
+import "package:stack_trace/stack_trace.dart";
+import "package:test/test.dart";
+
+void main() {
+  var stack = new Trace.current();
+
+  test("create result value", () {
+    Result<int> result = new Result<int>.value(42);
+    expect(result.isValue, isTrue);
+    expect(result.isError, isFalse);
+    ValueResult value = result.asValue;
+    expect(value.value, equals(42));
+  });
+
+  test("create result value 2", () {
+    Result<int> result = new ValueResult<int>(42);
+    expect(result.isValue, isTrue);
+    expect(result.isError, isFalse);
+    ValueResult<int> value = result.asValue;
+    expect(value.value, equals(42));
+  });
+
+  test("create result error", () {
+    Result<bool> result = new Result<bool>.error("BAD", stack);
+    expect(result.isValue, isFalse);
+    expect(result.isError, isTrue);
+    ErrorResult error = result.asError;
+    expect(error.error, equals("BAD"));
+    expect(error.stackTrace, same(stack));
+  });
+
+  test("create result error 2", () {
+    Result<bool> result = new ErrorResult("BAD", stack);
+    expect(result.isValue, isFalse);
+    expect(result.isError, isTrue);
+    ErrorResult error = result.asError;
+    expect(error.error, equals("BAD"));
+    expect(error.stackTrace, same(stack));
+  });
+
+  test("create result error no stack", () {
+    Result<bool> result = new Result<bool>.error("BAD");
+    expect(result.isValue, isFalse);
+    expect(result.isError, isTrue);
+    ErrorResult error = result.asError;
+    expect(error.error, equals("BAD"));
+    expect(error.stackTrace, isNull);
+  });
+
+  test("complete with value", () {
+    Result<int> result = new ValueResult<int>(42);
+    Completer c = new Completer<int>();
+    c.future.then(expectAsync((int v) { expect(v, equals(42)); }),
+                  onError: (e, s) { fail("Unexpected error"); });
+    result.complete(c);
+  });
+
+  test("complete with error", () {
+    Result<bool> result = new ErrorResult("BAD", stack);
+    Completer c = new Completer<bool>();
+    c.future.then((bool v) { fail("Unexpected value $v"); },
+                  onError: expectAsync((e, s) {
+                    expect(e, equals("BAD"));
+                    expect(s, same(stack));
+                  }));
+    result.complete(c);
+  });
+
+  test("add sink value", () {
+    Result<int> result = new ValueResult<int>(42);
+    EventSink<int> sink = new TestSink(
+        onData: expectAsync((v) { expect(v, equals(42)); })
+    );
+    result.addTo(sink);
+  });
+
+  test("add sink error", () {
+    Result<bool> result = new ErrorResult("BAD", stack);
+    EventSink<bool> sink = new TestSink(
+        onError: expectAsync((e, s) {
+          expect(e, equals("BAD"));
+          expect(s, same(stack));
+        })
+    );
+    result.addTo(sink);
+  });
+
+  test("value as future", () {
+    Result<int> result = new ValueResult<int>(42);
+    result.asFuture.then(expectAsync((int v) { expect(v, equals(42)); }),
+                         onError: (e, s) { fail("Unexpected error"); });
+  });
+
+  test("error as future", () {
+    Result<bool> result = new ErrorResult("BAD", stack);
+    result.asFuture.then((bool v) { fail("Unexpected value $v"); },
+                         onError: expectAsync((e, s) {
+                           expect(e, equals("BAD"));
+                           expect(s, same(stack));
+                         }));
+  });
+
+  test("capture future value", () {
+    Future<int> value = new Future<int>.value(42);
+    Result.capture(value).then(expectAsync((Result result) {
+      expect(result.isValue, isTrue);
+      expect(result.isError, isFalse);
+      ValueResult value = result.asValue;
+      expect(value.value, equals(42));
+    }), onError: (e, s) {
+      fail("Unexpected error: $e");
+    });
+  });
+
+  test("capture future error", () {
+    Future<bool> value = new Future<bool>.error("BAD", stack);
+    Result.capture(value).then(expectAsync((Result result) {
+      expect(result.isValue, isFalse);
+      expect(result.isError, isTrue);
+      ErrorResult error = result.asError;
+      expect(error.error, equals("BAD"));
+      expect(error.stackTrace, same(stack));
+    }), onError: (e, s) {
+      fail("Unexpected error: $e");
+    });
+  });
+
+  test("release future value", () {
+    Future<Result<int>> future =
+        new Future<Result<int>>.value(new Result<int>.value(42));
+    Result.release(future).then(expectAsync((v) {
+      expect(v, equals(42));
+    }), onError: (e, s) {
+      fail("Unexpected error: $e");
+    });
+  });
+
+  test("release future error", () {
+    // An error in the result is unwrapped and reified by release.
+    Future<Result<bool>> future =
+        new Future<Result<bool>>.value(new Result<bool>.error("BAD", stack));
+    Result.release(future).then((v) {
+      fail("Unexpected value: $v");
+    }, onError: expectAsync((e, s) {
+      expect(e, equals("BAD"));
+      expect(s, same(stack));
+    }));
+  });
+
+  test("release future real error", () {
+    // An error in the error lane is passed through by release.
+    Future<Result<bool>> future = new Future<Result<bool>>.error("BAD", stack);
+    Result.release(future).then((v) {
+      fail("Unexpected value: $v");
+    }, onError: expectAsync((e, s) {
+      expect(e, equals("BAD"));
+      expect(s, same(stack));
+    }));
+  });
+
+  test("capture stream", () {
+    StreamController<int> c = new StreamController<int>();
+    Stream<Result> stream = Result.captureStream(c.stream);
+    var expectedList = new Queue.from([new Result.value(42),
+                                       new Result.error("BAD", stack),
+                                       new Result.value(37)]);
+    void listener(Result actual) {
+      expect(expectedList.isEmpty, isFalse);
+      expectResult(actual, expectedList.removeFirst());
+    }
+    stream.listen(expectAsync(listener, count: 3),
+                  onError: (e, s) { fail("Unexpected error: $e"); },
+                  onDone: expectAsync((){}),
+                  cancelOnError: true);
+    c.add(42);
+    c.addError("BAD", stack);
+    c.add(37);
+    c.close();
+  });
+
+  test("release stream", () {
+    StreamController<Result<int>> c = new StreamController<Result<int>>();
+    Stream<int> stream = Result.releaseStream(c.stream);
+    List events = [new Result<int>.value(42),
+                   new Result<int>.error("BAD", stack),
+                   new Result<int>.value(37)];
+    // Expect the data events, and an extra error event.
+    var expectedList = new Queue.from(events)
+        ..add(new Result.error("BAD2", stack));
+
+    void dataListener(int v) {
+      expect(expectedList.isEmpty, isFalse);
+      Result expected = expectedList.removeFirst();
+      expect(expected.isValue, isTrue);
+      expect(v, equals(expected.asValue.value));
+    }
+
+    void errorListener(error, StackTrace stackTrace) {
+      expect(expectedList.isEmpty, isFalse);
+      Result expected = expectedList.removeFirst();
+      expect(expected.isError, isTrue);
+      expect(error, equals(expected.asError.error));
+      expect(stackTrace, same(expected.asError.stackTrace));
+    }
+
+    stream.listen(expectAsync(dataListener, count: 2),
+                  onError: expectAsync(errorListener, count: 2),
+                  onDone: expectAsync((){}));
+    for (Result<int> result in events) {
+      c.add(result);  // Result value or error in data line.
+    }
+    c.addError("BAD2", stack);  // Error in error line.
+    c.close();
+  });
+
+  test("release stream cancel on error", () {
+    StreamController<Result<int>> c = new StreamController<Result<int>>();
+    Stream<int> stream = Result.releaseStream(c.stream);
+    stream.listen(expectAsync((v) { expect(v, equals(42)); }),
+                  onError: expectAsync((e, s) {
+                    expect(e, equals("BAD"));
+                    expect(s, same(stack));
+                  }),
+                  onDone: () { fail("Unexpected done event"); },
+                  cancelOnError: true);
+    c.add(new Result.value(42));
+    c.add(new Result.error("BAD", stack));
+    c.add(new Result.value(37));
+    c.close();
+  });
+
+
+  test("flatten error 1", () {
+    Result<int> error = new Result<int>.error("BAD", stack);
+    Result<int> flattened =
+        Result.flatten(new Result<Result<int>>.error("BAD", stack));
+    expectResult(flattened, error);
+  });
+
+  test("flatten error 2", () {
+    Result<int> error = new Result<int>.error("BAD", stack);
+    Result<Result<int>> result = new Result<Result<int>>.value(error);
+    Result<int> flattened = Result.flatten(result);
+    expectResult(flattened, error);
+  });
+
+  test("flatten value", () {
+    Result<Result<int>> result =
+        new Result<Result<int>>.value(new Result<int>.value(42));
+    expectResult(Result.flatten(result), new Result<int>.value(42));
+  });
+
+  test("handle unary", () {
+    var result = new Result.error("error", stack);
+    bool called = false;
+    result.handle((error) {
+      called = true;
+      expect(error, "error");
+    });
+    expect(called, isTrue);
+  });
+
+  test("handle binary", () {
+    var result = new Result.error("error", stack);
+    bool called = false;
+    result.handle((error, stackTrace) {
+      called = true;
+      expect(error, "error");
+      expect(stackTrace, same(stack));
+    });
+    expect(called, isTrue);
+  });
+
+  test("handle unary and binary", () {
+    var result = new Result.error("error", stack);
+    bool called = false;
+    result.handle((error, [stackTrace]) {
+      called = true;
+      expect(error, "error");
+      expect(stackTrace, same(stack));
+    });
+    expect(called, isTrue);
+  });
+
+  test("handle neither unary nor binary", () {
+    var result = new Result.error("error", stack);
+    expect(() => result.handle(() => fail("unreachable")),
+           throws);
+    expect(() => result.handle((a, b, c) => fail("unreachable")),
+           throws);
+    expect(() => result.handle((a, b, {c}) => fail("unreachable")),
+           throws);
+    expect(() => result.handle((a, {b}) => fail("unreachable")),
+           throws);
+    expect(() => result.handle(({a, b}) => fail("unreachable")),
+           throws);
+    expect(() => result.handle(({a}) => fail("unreachable")),
+           throws);
+  });
+}
+
+void expectResult(Result actual, Result expected) {
+  expect(actual.isValue, equals(expected.isValue));
+  expect(actual.isError, equals(expected.isError));
+  if (actual.isValue) {
+    expect(actual.asValue.value, equals(expected.asValue.value));
+  } else {
+    expect(actual.asError.error, equals(expected.asError.error));
+    expect(actual.asError.stackTrace, same(expected.asError.stackTrace));
+  }
+}
+
+class TestSink<T> implements EventSink<T> {
+  final Function onData;
+  final Function onError;
+  final Function onDone;
+
+  TestSink({void this.onData(T data) : _nullData,
+            void this.onError(e, StackTrace s) : _nullError,
+            void this.onDone() : _nullDone });
+
+  void add(T value) { onData(value); }
+  void addError(error, [StackTrace stack]) { onError(error, stack); }
+  void close() { onDone(); }
+
+  static void _nullData(value) { fail("Unexpected sink add: $value"); }
+  static void _nullError(e, StackTrace s) {
+    fail("Unexpected sink addError: $e");
+  }
+  static void _nullDone() { fail("Unepxected sink close"); }
+}
diff --git a/mojo/public/dart/third_party/async/test/stream_completer_test.dart b/mojo/public/dart/third_party/async/test/stream_completer_test.dart
new file mode 100644
index 0000000..cd3ceb9
--- /dev/null
+++ b/mojo/public/dart/third_party/async/test/stream_completer_test.dart
@@ -0,0 +1,350 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+
+import "package:async/async.dart" show StreamCompleter;
+import "package:test/test.dart";
+
+import "utils.dart";
+
+main() {
+  test("a stream is linked before listening", () async {
+    var completer = new StreamCompleter();
+    completer.setSourceStream(createStream());
+    expect(completer.stream.toList(), completion([1, 2, 3, 4]));
+  });
+
+  test("listened to before a stream is linked", () async {
+    var completer = new StreamCompleter();
+    var done = completer.stream.toList();
+    await flushMicrotasks();
+    completer.setSourceStream(createStream());
+    expect(done, completion([1, 2, 3, 4]));
+  });
+
+  test("cancel before linking a stream doesn't listen on stream", () async {
+    var completer = new StreamCompleter();
+    var subscription = completer.stream.listen(null);
+    subscription.pause();  // Should be ignored.
+    subscription.cancel();
+    completer.setSourceStream(new UnusableStream());  // Doesn't throw.
+  });
+
+  test("listen and pause before linking stream", () async {
+    var controller = new StreamCompleter();
+    var events = [];
+    var subscription = controller.stream.listen(events.add);
+    var done = subscription.asFuture();
+    subscription.pause();
+    var sourceController = new StreamController();
+    sourceController..add(1)..add(2)..add(3)..add(4);
+    controller.setSourceStream(sourceController.stream);
+    await flushMicrotasks();
+    expect(sourceController.hasListener, isTrue);
+    expect(sourceController.isPaused, isTrue);
+    expect(events, []);
+    subscription.resume();
+    await flushMicrotasks();
+    expect(sourceController.hasListener, isTrue);
+    expect(sourceController.isPaused, isFalse);
+    expect(events, [1, 2, 3, 4]);
+    sourceController.close();
+    await done;
+    expect(events, [1, 2, 3, 4]);
+  });
+
+  test("pause more than once", () async {
+    var completer = new StreamCompleter();
+    var events = [];
+    var subscription = completer.stream.listen(events.add);
+    var done = subscription.asFuture();
+    subscription.pause();
+    subscription.pause();
+    subscription.pause();
+    completer.setSourceStream(createStream());
+    for (int i = 0; i < 3; i++) {
+      await flushMicrotasks();
+      expect(events, []);
+      subscription.resume();
+    }
+    await done;
+    expect(events, [1, 2, 3, 4]);
+  });
+
+  test("cancel new stream before source is done", () async {
+    var completer = new StreamCompleter();
+    var lastEvent = -1;
+    var controller = new StreamController();
+    var subscription;
+    subscription = completer.stream.listen(
+        (value) {
+          expect(value, lessThan(3));
+          lastEvent = value;
+          if (value == 2) {
+            subscription.cancel();
+          }
+        },
+        onError: unreachable("error"),
+        onDone: unreachable("done"),
+        cancelOnError: true);
+    completer.setSourceStream(controller.stream);
+    expect(controller.hasListener, isTrue);
+
+    await flushMicrotasks();
+    expect(controller.hasListener, isTrue);
+    controller.add(1);
+
+    await flushMicrotasks();
+    expect(lastEvent, 1);
+    expect(controller.hasListener, isTrue);
+    controller.add(2);
+
+    await flushMicrotasks();
+    expect(lastEvent, 2);
+    expect(controller.hasListener, isFalse);
+  });
+
+  test("complete with setEmpty before listening", () async {
+    var completer = new StreamCompleter();
+    completer.setEmpty();
+    var done = new Completer();
+    completer.stream.listen(
+        unreachable("data"),
+        onError: unreachable("error"),
+        onDone: done.complete);
+    await done.future;
+  });
+
+  test("complete with setEmpty after listening", () async {
+    var completer = new StreamCompleter();
+    var done = new Completer();
+    completer.stream.listen(
+        unreachable("data"),
+        onError: unreachable("error"),
+        onDone: done.complete);
+    completer.setEmpty();
+    await done.future;
+  });
+
+  test("source stream isn't listened to until completer stream is", () async {
+    var completer = new StreamCompleter();
+    var controller;
+    controller = new StreamController(onListen: () {
+      scheduleMicrotask(controller.close);
+    });
+
+    completer.setSourceStream(controller.stream);
+    await flushMicrotasks();
+    expect(controller.hasListener, isFalse);
+    var subscription = completer.stream.listen(null);
+    expect(controller.hasListener, isTrue);
+    await subscription.asFuture();
+  });
+
+  test("cancelOnError true when listening before linking stream", () async {
+    var completer = new StreamCompleter();
+    var lastEvent = -1;
+    var controller = new StreamController();
+    completer.stream.listen(
+        (value) {
+          expect(value, lessThan(3));
+          lastEvent = value;
+        },
+        onError: (value) {
+          expect(value, "3");
+          lastEvent = value;
+        },
+        onDone: unreachable("done"),
+        cancelOnError: true);
+    completer.setSourceStream(controller.stream);
+    expect(controller.hasListener, isTrue);
+
+    await flushMicrotasks();
+    expect(controller.hasListener, isTrue);
+    controller.add(1);
+
+    await flushMicrotasks();
+    expect(lastEvent, 1);
+    expect(controller.hasListener, isTrue);
+    controller.add(2);
+
+    await flushMicrotasks();
+    expect(lastEvent, 2);
+    expect(controller.hasListener, isTrue);
+    controller.addError("3");
+
+    await flushMicrotasks();
+    expect(lastEvent, "3");
+    expect(controller.hasListener, isFalse);
+  });
+
+  test("cancelOnError true when listening after linking stream", () async {
+    var completer = new StreamCompleter();
+    var lastEvent = -1;
+    var controller = new StreamController();
+    completer.setSourceStream(controller.stream);
+    controller.add(1);
+    expect(controller.hasListener, isFalse);
+
+    completer.stream.listen(
+        (value) {
+          expect(value, lessThan(3));
+          lastEvent = value;
+        },
+        onError: (value) {
+          expect(value, "3");
+          lastEvent = value;
+        },
+        onDone: unreachable("done"),
+        cancelOnError: true);
+
+    expect(controller.hasListener, isTrue);
+
+    await flushMicrotasks();
+    expect(lastEvent, 1);
+    expect(controller.hasListener, isTrue);
+    controller.add(2);
+
+    await flushMicrotasks();
+    expect(lastEvent, 2);
+    expect(controller.hasListener, isTrue);
+    controller.addError("3");
+
+    await flushMicrotasks();
+    expect(controller.hasListener, isFalse);
+  });
+
+  test("linking a stream after setSourceStream before listen", () async {
+    var completer = new StreamCompleter();
+    completer.setSourceStream(createStream());
+    expect(() => completer.setSourceStream(createStream()), throwsStateError);
+    expect(() => completer.setEmpty(), throwsStateError);
+    await completer.stream.toList();
+    // Still fails after source is done
+    expect(() => completer.setSourceStream(createStream()), throwsStateError);
+    expect(() => completer.setEmpty(), throwsStateError);
+  });
+
+  test("linking a stream after setSourceStream after listen", () async {
+    var completer = new StreamCompleter();
+    var list = completer.stream.toList();
+    completer.setSourceStream(createStream());
+    expect(() => completer.setSourceStream(createStream()), throwsStateError);
+    expect(() => completer.setEmpty(), throwsStateError);
+    await list;
+    // Still fails after source is done.
+    expect(() => completer.setSourceStream(createStream()), throwsStateError);
+    expect(() => completer.setEmpty(), throwsStateError);
+  });
+
+  test("linking a stream after setEmpty before listen", () async {
+    var completer = new StreamCompleter();
+    completer.setEmpty();
+    expect(() => completer.setSourceStream(createStream()), throwsStateError);
+    expect(() => completer.setEmpty(), throwsStateError);
+    await completer.stream.toList();
+    // Still fails after source is done
+    expect(() => completer.setSourceStream(createStream()), throwsStateError);
+    expect(() => completer.setEmpty(), throwsStateError);
+  });
+
+  test("linking a stream after setEmpty() after listen", () async {
+    var completer = new StreamCompleter();
+    var list = completer.stream.toList();
+    completer.setEmpty();
+    expect(() => completer.setSourceStream(createStream()), throwsStateError);
+    expect(() => completer.setEmpty(), throwsStateError);
+    await list;
+    // Still fails after source is done.
+    expect(() => completer.setSourceStream(createStream()), throwsStateError);
+    expect(() => completer.setEmpty(), throwsStateError);
+  });
+
+  test("listening more than once after setting stream", () async {
+    var completer = new StreamCompleter();
+    completer.setSourceStream(createStream());
+    var list = completer.stream.toList();
+    expect(() => completer.stream.toList(), throwsStateError);
+    await list;
+    expect(() => completer.stream.toList(), throwsStateError);
+  });
+
+  test("listening more than once before setting stream", () async {
+    var completer = new StreamCompleter();
+    completer.stream.toList();
+    expect(() => completer.stream.toList(), throwsStateError);
+  });
+
+  test("setting onData etc. before and after setting stream", () async {
+    var completer = new StreamCompleter();
+    var controller = new StreamController();
+    var subscription = completer.stream.listen(null);
+    var lastEvent = 0;
+    subscription.onData((value) => lastEvent = value);
+    subscription.onError((value) => lastEvent = "$value");
+    subscription.onDone(() => lastEvent = -1);
+    completer.setSourceStream(controller.stream);
+    await flushMicrotasks();
+    controller.add(1);
+    await flushMicrotasks();
+    expect(lastEvent, 1);
+    controller.addError(2);
+    await flushMicrotasks();
+    expect(lastEvent, "2");
+    subscription.onData((value) => lastEvent = -value);
+    subscription.onError((value) => lastEvent = "${-value}");
+    controller.add(1);
+    await flushMicrotasks();
+    expect(lastEvent, -1);
+    controller.addError(2);
+    await flushMicrotasks();
+    expect(lastEvent, "-2");
+    controller.close();
+    await flushMicrotasks();
+    expect(lastEvent, -1);
+  });
+
+  test("pause w/ resume future accross setting stream", () async {
+    var completer = new StreamCompleter();
+    var resume = new Completer();
+    var subscription = completer.stream.listen(unreachable("data"));
+    subscription.pause(resume.future);
+    await flushMicrotasks();
+    completer.setSourceStream(createStream());
+    await flushMicrotasks();
+    resume.complete();
+    var events = [];
+    subscription.onData(events.add);
+    await subscription.asFuture();
+    expect(events, [1, 2, 3, 4]);
+  });
+
+  test("asFuture with error accross setting stream", () async {
+    var completer = new StreamCompleter();
+    var controller = new StreamController();
+    var subscription = completer.stream.listen(unreachable("data"),
+                                               cancelOnError: false);
+    var done = subscription.asFuture();
+    expect(controller.hasListener, isFalse);
+    completer.setSourceStream(controller.stream);
+    await flushMicrotasks();
+    expect(controller.hasListener, isTrue);
+    controller.addError(42);
+    await done.then(unreachable("data"), onError: (error) {
+      expect(error, 42);
+    });
+    expect(controller.hasListener, isFalse);
+  });
+}
+
+Stream<int> createStream() async* {
+  yield 1;
+  await flushMicrotasks();
+  yield 2;
+  await flushMicrotasks();
+  yield 3;
+  await flushMicrotasks();
+  yield 4;
+}
diff --git a/mojo/public/dart/third_party/async/test/stream_group_test.dart b/mojo/public/dart/third_party/async/test/stream_group_test.dart
new file mode 100644
index 0000000..db6c938
--- /dev/null
+++ b/mojo/public/dart/third_party/async/test/stream_group_test.dart
@@ -0,0 +1,723 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library async.test.stream_group_test;
+
+import 'dart:async';
+
+import 'package:async/async.dart';
+import 'package:test/test.dart';
+
+main() {
+  group("single-subscription", () {
+    var streamGroup;
+    setUp(() {
+      streamGroup = new StreamGroup<String>();
+    });
+
+    test("buffers events from multiple sources", () async {
+      var controller1 = new StreamController<String>();
+      streamGroup.add(controller1.stream);
+      controller1.add("first");
+      controller1.close();
+
+      var controller2 = new StreamController<String>();
+      streamGroup.add(controller2.stream);
+      controller2.add("second");
+      controller2.close();
+
+      await flushMicrotasks();
+
+      expect(streamGroup.close(), completes);
+
+      expect(streamGroup.stream.toList(),
+          completion(unorderedEquals(["first", "second"])));
+    });
+
+    test("buffers errors from multiple sources", () async {
+      var controller1 = new StreamController<String>();
+      streamGroup.add(controller1.stream);
+      controller1.addError("first");
+      controller1.close();
+
+      var controller2 = new StreamController<String>();
+      streamGroup.add(controller2.stream);
+      controller2.addError("second");
+      controller2.close();
+
+      await flushMicrotasks();
+
+      expect(streamGroup.close(), completes);
+
+      var transformed = streamGroup.stream.transform(
+          new StreamTransformer.fromHandlers(
+              handleError: (error, _, sink) => sink.add("error: $error")));
+      expect(transformed.toList(),
+          completion(equals(["error: first", "error: second"])));
+    });
+
+    test("buffers events and errors together", () async {
+      var controller = new StreamController<String>();
+      streamGroup.add(controller.stream);
+
+      controller.add("first");
+      controller.addError("second");
+      controller.add("third");
+      controller.addError("fourth");
+      controller.addError("fifth");
+      controller.add("sixth");
+      controller.close();
+
+      await flushMicrotasks();
+
+      expect(streamGroup.close(), completes);
+
+      var transformed = streamGroup.stream.transform(
+          new StreamTransformer.fromHandlers(
+              handleData: (data, sink) => sink.add("data: $data"),
+              handleError: (error, _, sink) => sink.add("error: $error")));
+      expect(transformed.toList(), completion(equals([
+        "data: first",
+        "error: second",
+        "data: third",
+        "error: fourth",
+        "error: fifth",
+        "data: sixth"
+      ])));
+    });
+
+    test("emits events once there's a listener", () {
+      var controller = new StreamController<String>();
+      streamGroup.add(controller.stream);
+
+      expect(streamGroup.stream.toList(),
+          completion(equals(["first", "second"])));
+
+      controller.add("first");
+      controller.add("second");
+      controller.close();
+
+      expect(streamGroup.close(), completes);
+    });
+
+    test("doesn't buffer events from a broadcast stream", () async {
+      var controller = new StreamController<String>.broadcast();
+      streamGroup.add(controller.stream);
+
+      controller.add("first");
+      controller.add("second");
+      controller.close();
+
+      await flushMicrotasks();
+
+      expect(streamGroup.close(), completes);
+      expect(streamGroup.stream.toList(), completion(isEmpty));
+    });
+
+    test("when paused, buffers events from a broadcast stream", () async {
+      var controller = new StreamController<String>.broadcast();
+      streamGroup.add(controller.stream);
+
+      var events = [];
+      var subscription = streamGroup.stream.listen(events.add);
+      subscription.pause();
+
+      controller.add("first");
+      controller.add("second");
+      controller.close();
+      await flushMicrotasks();
+
+      subscription.resume();
+      expect(streamGroup.close(), completes);
+      await flushMicrotasks();
+
+      expect(events, equals(["first", "second"]));
+    });
+
+    test("emits events from a broadcast stream once there's a listener", () {
+      var controller = new StreamController<String>.broadcast();
+      streamGroup.add(controller.stream);
+
+      expect(streamGroup.stream.toList(),
+          completion(equals(["first", "second"])));
+
+      controller.add("first");
+      controller.add("second");
+      controller.close();
+
+      expect(streamGroup.close(), completes);
+    });
+
+    test("forwards cancel errors", () async {
+      var subscription = streamGroup.stream.listen(null);
+
+      var controller = new StreamController<String>(
+          onCancel: () => throw "error");
+      streamGroup.add(controller.stream);
+      await flushMicrotasks();
+
+      expect(subscription.cancel(), throwsA("error"));
+    });
+
+    test("forwards a cancel future", () async {
+      var subscription = streamGroup.stream.listen(null);
+
+      var completer = new Completer();
+      var controller = new StreamController<String>(
+          onCancel: () => completer.future);
+      streamGroup.add(controller.stream);
+      await flushMicrotasks();
+
+      var fired = false;
+      subscription.cancel().then((_) => fired = true);
+
+      await flushMicrotasks();
+      expect(fired, isFalse);
+
+      completer.complete();
+      await flushMicrotasks();
+      expect(fired, isTrue);
+    });
+
+    test("add() while active pauses the stream if the group is paused, then "
+        "resumes once the group resumes", () async {
+      var subscription = streamGroup.stream.listen(null);
+      await flushMicrotasks();
+
+      var paused = false;
+      var controller = new StreamController<String>(
+          onPause: () => paused = true,
+          onResume: () => paused = false);
+
+      subscription.pause();
+      await flushMicrotasks();
+
+      streamGroup.add(controller.stream);
+      await flushMicrotasks();
+      expect(paused, isTrue);
+
+      subscription.resume();
+      await flushMicrotasks();
+      expect(paused, isFalse);
+    });
+
+    group("add() while canceled", () {
+      setUp(() async {
+        streamGroup.stream.listen(null).cancel();
+        await flushMicrotasks();
+      });
+
+      test("immediately listens to and cancels the stream", () async {
+        var listened = false;
+        var canceled = false;
+        var controller = new StreamController<String>(onListen: () {
+          listened = true;
+        }, onCancel: expectAsync(() {
+          expect(listened, isTrue);
+          canceled = true;
+        }));
+
+        streamGroup.add(controller.stream);
+        await flushMicrotasks();
+        expect(listened, isTrue);
+        expect(canceled, isTrue);
+      });
+
+      test("forwards cancel errors", () {
+        var controller = new StreamController<String>(
+            onCancel: () => throw "error");
+
+        expect(streamGroup.add(controller.stream), throwsA("error"));
+      });
+
+      test("forwards a cancel future", () async {
+        var completer = new Completer();
+        var controller = new StreamController<String>(
+            onCancel: () => completer.future);
+
+        var fired = false;
+        streamGroup.add(controller.stream).then((_) => fired = true);
+
+        await flushMicrotasks();
+        expect(fired, isFalse);
+
+        completer.complete();
+        await flushMicrotasks();
+        expect(fired, isTrue);
+      });
+    });
+  });
+
+  group("broadcast", () {
+    var streamGroup;
+    setUp(() {
+      streamGroup = new StreamGroup<String>.broadcast();
+    });
+
+    test("buffers events from multiple sources", () async {
+      var controller1 = new StreamController<String>();
+      streamGroup.add(controller1.stream);
+      controller1.add("first");
+      controller1.close();
+
+      var controller2 = new StreamController<String>();
+      streamGroup.add(controller2.stream);
+      controller2.add("second");
+      controller2.close();
+
+      await flushMicrotasks();
+
+      expect(streamGroup.close(), completes);
+
+      expect(streamGroup.stream.toList(),
+          completion(equals(["first", "second"])));
+    });
+
+    test("emits events from multiple sources once there's a listener", () {
+      var controller1 = new StreamController<String>();
+      streamGroup.add(controller1.stream);
+
+      var controller2 = new StreamController<String>();
+      streamGroup.add(controller2.stream);
+
+      expect(streamGroup.stream.toList(),
+          completion(equals(["first", "second"])));
+
+      controller1.add("first");
+      controller2.add("second");
+      controller1.close();
+      controller2.close();
+
+      expect(streamGroup.close(), completes);
+    });
+
+    test("doesn't buffer events once a listener has been added and removed",
+        () async {
+      var controller = new StreamController<String>();
+      streamGroup.add(controller.stream);
+
+      streamGroup.stream.listen(null).cancel();
+      await flushMicrotasks();
+
+      controller.add("first");
+      controller.addError("second");
+      controller.close();
+
+      await flushMicrotasks();
+
+      expect(streamGroup.close(), completes);
+      expect(streamGroup.stream.toList(), completion(isEmpty));
+    });
+
+    test("doesn't buffer events from a broadcast stream", () async {
+      var controller = new StreamController<String>.broadcast();
+      streamGroup.add(controller.stream);
+      controller.add("first");
+      controller.addError("second");
+      controller.close();
+
+      await flushMicrotasks();
+
+      expect(streamGroup.close(), completes);
+      expect(streamGroup.stream.toList(), completion(isEmpty));
+    });
+
+    test("emits events from a broadcast stream once there's a listener", () {
+      var controller = new StreamController<String>.broadcast();
+      streamGroup.add(controller.stream);
+
+      expect(streamGroup.stream.toList(),
+          completion(equals(["first", "second"])));
+
+      controller.add("first");
+      controller.add("second");
+      controller.close();
+
+      expect(streamGroup.close(), completes);
+    });
+
+    test("cancels and re-listens broadcast streams", () async {
+      var subscription = streamGroup.stream.listen(null);
+
+      var controller = new StreamController<String>.broadcast();
+
+      streamGroup.add(controller.stream);
+      await flushMicrotasks();
+      expect(controller.hasListener, isTrue);
+
+      subscription.cancel();
+      await flushMicrotasks();
+      expect(controller.hasListener, isFalse);
+
+      streamGroup.stream.listen(null);
+      await flushMicrotasks();
+      expect(controller.hasListener, isTrue);
+    });
+
+    test("never cancels single-subscription streams", () async {
+      var subscription = streamGroup.stream.listen(null);
+
+      var controller = new StreamController<String>(
+          onCancel: expectAsync(() {}, count: 0));
+
+      streamGroup.add(controller.stream);
+      await flushMicrotasks();
+
+      subscription.cancel();
+      await flushMicrotasks();
+
+      streamGroup.stream.listen(null);
+      await flushMicrotasks();
+    });
+
+    test("drops events from a single-subscription stream while dormant",
+        () async {
+      var events = [];
+      var subscription = streamGroup.stream.listen(events.add);
+
+      var controller = new StreamController<String>();
+      streamGroup.add(controller.stream);
+      await flushMicrotasks();
+
+      controller.add("first");
+      await flushMicrotasks();
+      expect(events, equals(["first"]));
+
+      subscription.cancel();
+      controller.add("second");
+      await flushMicrotasks();
+      expect(events, equals(["first"]));
+
+      streamGroup.stream.listen(events.add);
+      controller.add("third");
+      await flushMicrotasks();
+      expect(events, equals(["first", "third"]));
+    });
+
+    test("a single-subscription stream can be removed while dormant", () async {
+      var controller = new StreamController<String>();
+      streamGroup.add(controller.stream);
+      await flushMicrotasks();
+
+      streamGroup.stream.listen(null).cancel();
+      await flushMicrotasks();
+
+      streamGroup.remove(controller.stream);
+      expect(controller.hasListener, isFalse);
+      await flushMicrotasks();
+
+      expect(streamGroup.stream.toList(), completion(isEmpty));
+      controller.add("first");
+      expect(streamGroup.close(), completes);
+    });
+  });
+
+  group("regardless of type", () {
+    group("single-subscription", () {
+      regardlessOfType(() => new StreamGroup<String>());
+    });
+
+    group("broadcast", () {
+      regardlessOfType(() => new StreamGroup<String>.broadcast());
+    });
+  });
+
+  test("merge() emits events from all components streams", () {
+    var controller1 = new StreamController<String>();
+    var controller2 = new StreamController<String>();
+
+    var merged = StreamGroup.merge([controller1.stream, controller2.stream]);
+
+    controller1.add("first");
+    controller1.close();
+    controller2.add("second");
+    controller2.close();
+
+    expect(merged.toList(), completion(unorderedEquals(["first", "second"])));
+  });
+}
+
+void regardlessOfType(StreamGroup<String> newStreamGroup()) {
+  var streamGroup;
+  setUp(() {
+    streamGroup = newStreamGroup();
+  });
+
+  group("add()", () {
+    group("while dormant", () {
+      test("doesn't listen to the stream until the group is listened to",
+          () async {
+        var controller = new StreamController<String>();
+
+        expect(streamGroup.add(controller.stream), isNull);
+        await flushMicrotasks();
+        expect(controller.hasListener, isFalse);
+
+        streamGroup.stream.listen(null);
+        await flushMicrotasks();
+        expect(controller.hasListener, isTrue);
+      });
+
+      test("is a no-op if the stream is already in the group", () {
+        var controller = new StreamController<String>();
+        streamGroup.add(controller.stream);
+        streamGroup.add(controller.stream);
+        streamGroup.add(controller.stream);
+
+        // If the stream was actually listened to multiple times, this would
+        // throw a StateError.
+        streamGroup.stream.listen(null);
+      });
+    });
+
+    group("while active", () {
+      setUp(() async {
+        streamGroup.stream.listen(null);
+        await flushMicrotasks();
+      });
+
+      test("listens to the stream immediately", () async {
+        var controller = new StreamController<String>();
+
+        expect(streamGroup.add(controller.stream), isNull);
+        await flushMicrotasks();
+        expect(controller.hasListener, isTrue);
+      });
+
+      test("is a no-op if the stream is already in the group", () async {
+        var controller = new StreamController<String>();
+
+        // If the stream were actually listened to more than once, future
+        // calls to [add] would throw [StateError]s.
+        streamGroup.add(controller.stream);
+        streamGroup.add(controller.stream);
+        streamGroup.add(controller.stream);
+      });
+    });
+  });
+
+  group("remove()", () {
+    group("while dormant", () {
+      test("stops emitting events for a stream that's removed", () async {
+        var controller = new StreamController<String>();
+        streamGroup.add(controller.stream);
+
+        expect(streamGroup.stream.toList(), completion(equals(["first"])));
+
+        controller.add("first");
+        await flushMicrotasks();
+        controller.add("second");
+
+        expect(streamGroup.remove(controller.stream), isNull);
+        expect(streamGroup.close(), completes);
+      });
+
+      test("is a no-op for an unknown stream", () {
+        var controller = new StreamController<String>();
+        expect(streamGroup.remove(controller.stream), isNull);
+      });
+
+      test("and closed closes the group when the last stream is removed",
+          () async {
+        var controller1 = new StreamController<String>();
+        var controller2 = new StreamController<String>();
+
+        streamGroup.add(controller1.stream);
+        streamGroup.add(controller2.stream);
+        await flushMicrotasks();
+
+        streamGroup.close();
+
+        streamGroup.remove(controller1.stream);
+        await flushMicrotasks();
+
+        streamGroup.remove(controller2.stream);
+        await flushMicrotasks();
+
+        expect(streamGroup.stream.toList(), completion(isEmpty));
+      });
+    });
+
+    group("while listening", () {
+      test("doesn't emit events from a removed stream", () {
+        var controller = new StreamController<String>();
+        streamGroup.add(controller.stream);
+
+        // The subscription to [controller.stream] is canceled synchronously, so
+        // the first event is dropped even though it was added before the
+        // removal. This is documented in [StreamGroup.remove].
+        expect(streamGroup.stream.toList(), completion(isEmpty));
+
+        controller.add("first");
+        expect(streamGroup.remove(controller.stream), isNull);
+        controller.add("second");
+
+        expect(streamGroup.close(), completes);
+      });
+
+      test("cancels the stream's subscription", () async {
+        var controller = new StreamController<String>();
+        streamGroup.add(controller.stream);
+
+        streamGroup.stream.listen(null);
+        await flushMicrotasks();
+        expect(controller.hasListener, isTrue);
+
+        streamGroup.remove(controller.stream);
+        await flushMicrotasks();
+        expect(controller.hasListener, isFalse);
+      });
+
+      test("forwards cancel errors", () async {
+        var controller = new StreamController<String>(
+            onCancel: () => throw "error");
+        streamGroup.add(controller.stream);
+
+        streamGroup.stream.listen(null);
+        await flushMicrotasks();
+
+        expect(streamGroup.remove(controller.stream), throwsA("error"));
+      });
+
+      test("forwards cancel futures", () async {
+        var completer = new Completer();
+        var controller = new StreamController<String>(
+            onCancel: () => completer.future);
+
+        streamGroup.stream.listen(null);
+        await flushMicrotasks();
+
+        streamGroup.add(controller.stream);
+        await flushMicrotasks();
+
+        var fired = false;
+        streamGroup.remove(controller.stream).then((_) => fired = true);
+
+        await flushMicrotasks();
+        expect(fired, isFalse);
+
+        completer.complete();
+        await flushMicrotasks();
+        expect(fired, isTrue);
+      });
+
+      test("is a no-op for an unknown stream", () async {
+        var controller = new StreamController<String>();
+        streamGroup.stream.listen(null);
+        await flushMicrotasks();
+
+        expect(streamGroup.remove(controller.stream), isNull);
+      });
+
+      test("and closed closes the group when the last stream is removed",
+          () async {
+        var done = false;
+        streamGroup.stream.listen(null, onDone: () => done = true);
+        await flushMicrotasks();
+
+        var controller1 = new StreamController<String>();
+        var controller2 = new StreamController<String>();
+
+        streamGroup.add(controller1.stream);
+        streamGroup.add(controller2.stream);
+        await flushMicrotasks();
+
+        streamGroup.close();
+
+        streamGroup.remove(controller1.stream);
+        await flushMicrotasks();
+        expect(done, isFalse);
+
+        streamGroup.remove(controller2.stream);
+        await flushMicrotasks();
+        expect(done, isTrue);
+      });
+    });
+  });
+
+  group("close()", () {
+    group("while dormant", () {
+      test("if there are no streams, closes the group", () {
+        expect(streamGroup.close(), completes);
+        expect(streamGroup.stream.toList(), completion(isEmpty));
+      });
+
+      test("if there are streams, closes the group once those streams close "
+          "and there's a listener", () async {
+        var controller1 = new StreamController<String>();
+        var controller2 = new StreamController<String>();
+
+        streamGroup.add(controller1.stream);
+        streamGroup.add(controller2.stream);
+        await flushMicrotasks();
+
+        streamGroup.close();
+
+        controller1.close();
+        controller2.close();
+        expect(streamGroup.stream.toList(), completion(isEmpty));
+      });
+    });
+
+    group("while active", () {
+      test("if there are no streams, closes the group", () {
+        expect(streamGroup.stream.toList(), completion(isEmpty));
+        expect(streamGroup.close(), completes);
+      });
+
+      test("if there are streams, closes the group once those streams close",
+          () async {
+        var done = false;
+        streamGroup.stream.listen(null, onDone: () => done = true);
+        await flushMicrotasks();
+
+        var controller1 = new StreamController<String>();
+        var controller2 = new StreamController<String>();
+
+        streamGroup.add(controller1.stream);
+        streamGroup.add(controller2.stream);
+        await flushMicrotasks();
+
+        streamGroup.close();
+        await flushMicrotasks();
+        expect(done, isFalse);
+
+        controller1.close();
+        await flushMicrotasks();
+        expect(done, isFalse);
+
+        controller2.close();
+        await flushMicrotasks();
+        expect(done, isTrue);
+      });
+    });
+
+    test("returns a Future that completes once all events are dispatched",
+        () async {
+      var events = [];
+      streamGroup.stream.listen(events.add);
+
+      var controller = new StreamController<String>();
+      streamGroup.add(controller.stream);
+      await flushMicrotasks();
+
+      // Add a bunch of events. Each of these will get dispatched in a
+      // separate microtask, so we can test that [close] only completes once
+      // all of them have dispatched.
+      controller.add("one");
+      controller.add("two");
+      controller.add("three");
+      controller.add("four");
+      controller.add("five");
+      controller.add("six");
+      controller.close();
+
+      await streamGroup.close();
+      expect(events, equals(["one", "two", "three", "four", "five", "six"]));
+    });
+  });
+}
+
+/// Wait for all microtasks to complete.
+Future flushMicrotasks() => new Future.delayed(Duration.ZERO);
diff --git a/mojo/public/dart/third_party/async/test/stream_queue_test.dart b/mojo/public/dart/third_party/async/test/stream_queue_test.dart
new file mode 100644
index 0000000..228ba8a
--- /dev/null
+++ b/mojo/public/dart/third_party/async/test/stream_queue_test.dart
@@ -0,0 +1,703 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE filevents.
+
+import "dart:async";
+
+import "package:async/async.dart" show StreamQueue;
+import "package:test/test.dart";
+
+import "utils.dart";
+
+main() {
+  group("source stream", () {
+    test("is listened to on first request, paused between requests", () async {
+      var controller = new StreamController();
+      var events = new StreamQueue<int>(controller.stream);
+      await flushMicrotasks();
+      expect(controller.hasListener, isFalse);
+
+      var next = events.next;
+      expect(controller.hasListener, isTrue);
+      expect(controller.isPaused, isFalse);
+
+      controller.add(1);
+
+      expect(await next, 1);
+      expect(controller.hasListener, isTrue);
+      expect(controller.isPaused, isTrue);
+
+      next = events.next;
+      expect(controller.hasListener, isTrue);
+      expect(controller.isPaused, isFalse);
+
+      controller.add(2);
+
+      expect(await next, 2);
+      expect(controller.hasListener, isTrue);
+      expect(controller.isPaused, isTrue);
+
+      events.cancel();
+      expect(controller.hasListener, isFalse);
+    });
+  });
+
+  group("next operation", () {
+    test("simple sequence of requests", () async {
+      var events = new StreamQueue<int>(createStream());
+      for (int i = 1; i <= 4; i++) {
+        expect(await events.next, i);
+      }
+      expect(events.next, throwsStateError);
+    });
+
+    test("multiple requests at the same time", () async {
+      var events = new StreamQueue<int>(createStream());
+      var result = await Future.wait(
+          [events.next, events.next, events.next, events.next]);
+      expect(result, [1, 2, 3, 4]);
+      await events.cancel();
+    });
+
+    test("sequence of requests with error", () async {
+      var events = new StreamQueue<int>(createErrorStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(events.next, throwsA("To err is divine!"));
+      expect(await events.next, 4);
+      await events.cancel();
+    });
+  });
+
+  group("skip operation", () {
+    test("of two elements in the middle of sequence", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.skip(2), 0);
+      expect(await events.next, 4);
+      await events.cancel();
+    });
+
+    test("with negative/bad arguments throws", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(() => events.skip(-1), throwsArgumentError);
+      // A non-int throws either a type error or an argument error,
+      // depending on whether it's checked mode or not.
+      expect(await events.next, 1);  // Did not consume event.
+      expect(() => events.skip(-1), throwsArgumentError);
+      expect(await events.next, 2);  // Did not consume event.
+      await events.cancel();
+    });
+
+    test("of 0 elements works", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(events.skip(0), completion(0));
+      expect(events.next, completion(1));
+      expect(events.skip(0), completion(0));
+      expect(events.next, completion(2));
+      expect(events.skip(0), completion(0));
+      expect(events.next, completion(3));
+      expect(events.skip(0), completion(0));
+      expect(events.next, completion(4));
+      expect(events.skip(0), completion(0));
+      expect(events.skip(5), completion(5));
+      expect(events.next, throwsStateError);
+      await events.cancel();
+    });
+
+    test("of too many events ends at stream start", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.skip(6), 2);
+      await events.cancel();
+    });
+
+    test("of too many events after some events", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(await events.skip(6), 4);
+      await events.cancel();
+    });
+
+    test("of too many events ends at stream end", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(await events.next, 3);
+      expect(await events.next, 4);
+      expect(await events.skip(2), 2);
+      await events.cancel();
+    });
+
+    test("of events with error", () async {
+      var events = new StreamQueue<int>(createErrorStream());
+      expect(events.skip(4), throwsA("To err is divine!"));
+      expect(await events.next, 4);
+      await events.cancel();
+    });
+
+    test("of events with error, and skip again after", () async {
+      var events = new StreamQueue<int>(createErrorStream());
+      expect(events.skip(4), throwsA("To err is divine!"));
+      expect(events.skip(2), completion(1));
+      await events.cancel();
+    });
+    test("multiple skips at same time complete in order.", () async {
+      var events = new StreamQueue<int>(createStream());
+      var skip1 = events.skip(1);
+      var skip2 = events.skip(0);
+      var skip3 = events.skip(4);
+      var skip4 = events.skip(1);
+      var index = 0;
+      // Check that futures complete in order.
+      sequence(expectedValue, sequenceIndex) => (value) {
+        expect(value, expectedValue);
+        expect(index, sequenceIndex);
+        index++;
+      };
+      await Future.wait([skip1.then(sequence(0, 0)),
+                         skip2.then(sequence(0, 1)),
+                         skip3.then(sequence(1, 2)),
+                         skip4.then(sequence(1, 3))]);
+      await events.cancel();
+    });
+  });
+
+  group("take operation", () {
+    test("as simple take of events", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.take(2), [2, 3]);
+      expect(await events.next, 4);
+      await events.cancel();
+    });
+
+    test("of 0 events", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(events.take(0), completion([]));
+      expect(events.next, completion(1));
+      expect(events.take(0), completion([]));
+      expect(events.next, completion(2));
+      expect(events.take(0), completion([]));
+      expect(events.next, completion(3));
+      expect(events.take(0), completion([]));
+      expect(events.next, completion(4));
+      expect(events.take(0), completion([]));
+      expect(events.take(5), completion([]));
+      expect(events.next, throwsStateError);
+      await events.cancel();
+    });
+
+    test("with bad arguments throws", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(() => events.take(-1), throwsArgumentError);
+      expect(await events.next, 1);  // Did not consume event.
+      expect(() => events.take(-1), throwsArgumentError);
+      expect(await events.next, 2);  // Did not consume event.
+      await events.cancel();
+    });
+
+    test("of too many arguments", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.take(6), [1, 2, 3, 4]);
+      await events.cancel();
+    });
+
+    test("too large later", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(await events.take(6), [3, 4]);
+      await events.cancel();
+    });
+
+    test("error", () async {
+      var events = new StreamQueue<int>(createErrorStream());
+      expect(events.take(4), throwsA("To err is divine!"));
+      expect(await events.next, 4);
+      await events.cancel();
+    });
+  });
+
+  group("rest operation", () {
+    test("after single next", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.rest.toList(), [2, 3, 4]);
+    });
+
+    test("at start", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.rest.toList(), [1, 2, 3, 4]);
+    });
+
+    test("at end", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(await events.next, 3);
+      expect(await events.next, 4);
+      expect(await events.rest.toList(), isEmpty);
+    });
+
+    test("after end", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(await events.next, 3);
+      expect(await events.next, 4);
+      expect(events.next, throwsStateError);
+      expect(await events.rest.toList(), isEmpty);
+    });
+
+    test("after receiving done requested before", () async {
+      var events = new StreamQueue<int>(createStream());
+      var next1 = events.next;
+      var next2 = events.next;
+      var next3 = events.next;
+      var rest = events.rest;
+      for (int i = 0; i < 10; i++) {
+        await flushMicrotasks();
+      }
+      expect(await next1, 1);
+      expect(await next2, 2);
+      expect(await next3, 3);
+      expect(await rest.toList(), [4]);
+    });
+
+    test("with an error event error", () async {
+      var events = new StreamQueue<int>(createErrorStream());
+      expect(await events.next, 1);
+      var rest = events.rest;
+      var events2 = new StreamQueue(rest);
+      expect(await events2.next, 2);
+      expect(events2.next, throwsA("To err is divine!"));
+      expect(await events2.next, 4);
+    });
+
+    test("closes the events, prevents other operations", () async {
+      var events = new StreamQueue<int>(createStream());
+      var stream = events.rest;
+      expect(() => events.next, throwsStateError);
+      expect(() => events.skip(1), throwsStateError);
+      expect(() => events.take(1), throwsStateError);
+      expect(() => events.rest, throwsStateError);
+      expect(() => events.cancel(), throwsStateError);
+      expect(stream.toList(), completion([1, 2, 3, 4]));
+    });
+
+    test("forwards to underlying stream", () async {
+      var cancel = new Completer();
+      var controller = new StreamController(onCancel: () => cancel.future);
+      var events = new StreamQueue<int>(controller.stream);
+      expect(controller.hasListener, isFalse);
+      var next = events.next;
+      expect(controller.hasListener, isTrue);
+      expect(controller.isPaused, isFalse);
+
+      controller.add(1);
+      expect(await next, 1);
+      expect(controller.isPaused, isTrue);
+
+      var rest = events.rest;
+      var subscription = rest.listen(null);
+      expect(controller.hasListener, isTrue);
+      expect(controller.isPaused, isFalse);
+
+      var lastEvent;
+      subscription.onData((value) => lastEvent = value);
+
+      controller.add(2);
+
+      await flushMicrotasks();
+      expect(lastEvent, 2);
+      expect(controller.hasListener, isTrue);
+      expect(controller.isPaused, isFalse);
+
+      subscription.pause();
+      expect(controller.isPaused, isTrue);
+
+      controller.add(3);
+
+      await flushMicrotasks();
+      expect(lastEvent, 2);
+      subscription.resume();
+
+      await flushMicrotasks();
+      expect(lastEvent, 3);
+
+      var cancelFuture = subscription.cancel();
+      expect(controller.hasListener, isFalse);
+      cancel.complete(42);
+      expect(cancelFuture, completion(42));
+    });
+  });
+
+  group("cancel operation", () {
+    test("closes the events, prevents any other operation", () async {
+      var events = new StreamQueue<int>(createStream());
+      await events.cancel();
+      expect(() => events.next, throwsStateError);
+      expect(() => events.skip(1), throwsStateError);
+      expect(() => events.take(1), throwsStateError);
+      expect(() => events.rest, throwsStateError);
+      expect(() => events.cancel(), throwsStateError);
+    });
+
+    test("cancels underlying subscription when called before any event",
+        () async {
+      var cancelFuture = new Future.value(42);
+      var controller = new StreamController(onCancel: () => cancelFuture);
+      var events = new StreamQueue<int>(controller.stream);
+      expect(await events.cancel(), 42);
+    });
+
+    test("cancels underlying subscription, returns result", () async {
+      var cancelFuture = new Future.value(42);
+      var controller = new StreamController(onCancel: () => cancelFuture);
+      var events = new StreamQueue<int>(controller.stream);
+      controller.add(1);
+      expect(await events.next, 1);
+      expect(await events.cancel(), 42);
+    });
+
+    group("with immediate: true", () {
+      test("closes the events, prevents any other operation", () async {
+        var events = new StreamQueue<int>(createStream());
+        await events.cancel(immediate: true);
+        expect(() => events.next, throwsStateError);
+        expect(() => events.skip(1), throwsStateError);
+        expect(() => events.take(1), throwsStateError);
+        expect(() => events.rest, throwsStateError);
+        expect(() => events.cancel(), throwsStateError);
+      });
+
+      test("cancels the underlying subscription immediately", () async {
+        var controller = new StreamController();
+        controller.add(1);
+
+        var events = new StreamQueue<int>(controller.stream);
+        expect(await events.next, 1);
+        expect(controller.hasListener, isTrue);
+
+        events.cancel(immediate: true);
+        await expect(controller.hasListener, isFalse);
+      });
+
+      test("cancels the underlying subscription when called before any event",
+          () async {
+        var cancelFuture = new Future.value(42);
+        var controller = new StreamController(onCancel: () => cancelFuture);
+
+        var events = new StreamQueue<int>(controller.stream);
+        expect(await events.cancel(immediate: true), 42);
+      });
+
+      test("closes pending requests", () async {
+        var events = new StreamQueue<int>(createStream());
+        expect(await events.next, 1);
+        expect(events.next, throwsStateError);
+        expect(events.hasNext, completion(isFalse));
+
+        await events.cancel(immediate: true);
+      });
+
+      test("returns the result of closing the underlying subscription",
+          () async {
+        var controller = new StreamController(
+            onCancel: () => new Future.value(42));
+        var events = new StreamQueue<int>(controller.stream);
+        expect(await events.cancel(immediate: true), 42);
+      });
+
+      test("listens and then cancels a stream that hasn't been listened to yet",
+          () async {
+        var wasListened = false;
+        var controller = new StreamController(
+            onListen: () => wasListened = true);
+        var events = new StreamQueue<int>(controller.stream);
+        expect(wasListened, isFalse);
+        expect(controller.hasListener, isFalse);
+
+        await events.cancel(immediate: true);
+        expect(wasListened, isTrue);
+        expect(controller.hasListener, isFalse);
+      });
+    });
+  });
+
+  group("hasNext operation", () {
+    test("true at start", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.hasNext, isTrue);
+    });
+
+    test("true after start", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.hasNext, isTrue);
+    });
+
+    test("true at end", () async {
+      var events = new StreamQueue<int>(createStream());
+      for (int i = 1; i <= 4; i++) {
+        expect(await events.next, i);
+      }
+      expect(await events.hasNext, isFalse);
+    });
+
+    test("true when enqueued", () async {
+      var events = new StreamQueue<int>(createStream());
+      var values = [];
+      for (int i = 1; i <= 3; i++) {
+        events.next.then(values.add);
+      }
+      expect(values, isEmpty);
+      expect(await events.hasNext, isTrue);
+      expect(values, [1, 2, 3]);
+    });
+
+    test("false when enqueued", () async {
+      var events = new StreamQueue<int>(createStream());
+      var values = [];
+      for (int i = 1; i <= 4; i++) {
+        events.next.then(values.add);
+      }
+      expect(values, isEmpty);
+      expect(await events.hasNext, isFalse);
+      expect(values, [1, 2, 3, 4]);
+    });
+
+    test("true when data event", () async {
+      var controller = new StreamController();
+      var events = new StreamQueue<int>(controller.stream);
+
+      var hasNext;
+      events.hasNext.then((result) { hasNext = result; });
+      await flushMicrotasks();
+      expect(hasNext, isNull);
+      controller.add(42);
+      expect(hasNext, isNull);
+      await flushMicrotasks();
+      expect(hasNext, isTrue);
+    });
+
+    test("true when error event", () async {
+      var controller = new StreamController();
+      var events = new StreamQueue<int>(controller.stream);
+
+      var hasNext;
+      events.hasNext.then((result) { hasNext = result; });
+      await flushMicrotasks();
+      expect(hasNext, isNull);
+      controller.addError("BAD");
+      expect(hasNext, isNull);
+      await flushMicrotasks();
+      expect(hasNext, isTrue);
+      expect(events.next, throwsA("BAD"));
+    });
+
+    test("- hasNext after hasNext", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.hasNext, true);
+      expect(await events.hasNext, true);
+      expect(await events.next, 1);
+      expect(await events.hasNext, true);
+      expect(await events.hasNext, true);
+      expect(await events.next, 2);
+      expect(await events.hasNext, true);
+      expect(await events.hasNext, true);
+      expect(await events.next, 3);
+      expect(await events.hasNext, true);
+      expect(await events.hasNext, true);
+      expect(await events.next, 4);
+      expect(await events.hasNext, false);
+      expect(await events.hasNext, false);
+    });
+
+    test("- next after true", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.hasNext, true);
+      expect(await events.next, 2);
+      expect(await events.next, 3);
+    });
+
+    test("- next after true, enqueued", () async {
+      var events = new StreamQueue<int>(createStream());
+      var responses = [];
+      events.next.then(responses.add);
+      events.hasNext.then(responses.add);
+      events.next.then(responses.add);
+      do {
+        await flushMicrotasks();
+      } while (responses.length < 3);
+      expect(responses, [1, true, 2]);
+    });
+
+    test("- skip 0 after true", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.hasNext, true);
+      expect(await events.skip(0), 0);
+      expect(await events.next, 2);
+    });
+
+    test("- skip 1 after true", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.hasNext, true);
+      expect(await events.skip(1), 0);
+      expect(await events.next, 3);
+    });
+
+    test("- skip 2 after true", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.hasNext, true);
+      expect(await events.skip(2), 0);
+      expect(await events.next, 4);
+    });
+
+    test("- take 0 after true", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.hasNext, true);
+      expect(await events.take(0), isEmpty);
+      expect(await events.next, 2);
+    });
+
+    test("- take 1 after true", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.hasNext, true);
+      expect(await events.take(1), [2]);
+      expect(await events.next, 3);
+    });
+
+    test("- take 2 after true", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.hasNext, true);
+      expect(await events.take(2), [2, 3]);
+      expect(await events.next, 4);
+    });
+
+    test("- rest after true", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.hasNext, true);
+      var stream = events.rest;
+      expect(await stream.toList(), [2, 3, 4]);
+    });
+
+    test("- rest after true, at last", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(await events.next, 3);
+      expect(await events.hasNext, true);
+      var stream = events.rest;
+      expect(await stream.toList(), [4]);
+    });
+
+    test("- rest after false", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(await events.next, 3);
+      expect(await events.next, 4);
+      expect(await events.hasNext, false);
+      var stream = events.rest;
+      expect(await stream.toList(), isEmpty);
+    });
+
+    test("- cancel after true on data", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(await events.hasNext, true);
+      expect(await events.cancel(), null);
+    });
+
+    test("- cancel after true on error", () async {
+      var events = new StreamQueue<int>(createErrorStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(await events.hasNext, true);
+      expect(await events.cancel(), null);
+    });
+  });
+
+  test("all combinations sequential skip/next/take operations", () async {
+    // Takes all combinations of two of next, skip and take, then ends with
+    // doing rest. Each of the first rounds do 10 events of each type,
+    // the rest does 20 elements.
+    var eventCount = 20 * (3 * 3 + 1);
+    var events = new StreamQueue<int>(createLongStream(eventCount));
+
+    // Test expecting [startIndex .. startIndex + 9] as events using
+    // `next`.
+    nextTest(startIndex) {
+      for (int i = 0; i < 10; i++) {
+        expect(events.next, completion(startIndex + i));
+      }
+    }
+
+    // Test expecting 10 events to be skipped.
+    skipTest(startIndex) {
+      expect(events.skip(10), completion(0));
+    }
+
+    // Test expecting [startIndex .. startIndex + 9] as events using
+    // `take(10)`.
+    takeTest(startIndex) {
+      expect(events.take(10),
+             completion(new List.generate(10, (i) => startIndex + i)));
+    }
+    var tests = [nextTest, skipTest, takeTest];
+
+    int counter = 0;
+    // Run through all pairs of two tests and run them.
+    for (int i = 0; i < tests.length; i++) {
+      for (int j = 0; j < tests.length; j++) {
+        tests[i](counter);
+        tests[j](counter + 10);
+        counter += 20;
+      }
+    }
+    // Then expect 20 more events as a `rest` call.
+    expect(events.rest.toList(),
+           completion(new List.generate(20, (i) => counter + i)));
+  });
+}
+
+Stream<int> createStream() async* {
+  yield 1;
+  await flushMicrotasks();
+  yield 2;
+  await flushMicrotasks();
+  yield 3;
+  await flushMicrotasks();
+  yield 4;
+}
+
+Stream<int> createErrorStream() {
+  StreamController controller = new StreamController<int>();
+  () async {
+    controller.add(1);
+    await flushMicrotasks();
+    controller.add(2);
+    await flushMicrotasks();
+    controller.addError("To err is divine!");
+    await flushMicrotasks();
+    controller.add(4);
+    await flushMicrotasks();
+    controller.close();
+  }();
+  return controller.stream;
+}
+
+Stream<int> createLongStream(int eventCount) async* {
+  for (int i = 0; i < eventCount; i++) yield i;
+}
diff --git a/mojo/public/dart/third_party/async/test/stream_splitter_test.dart b/mojo/public/dart/third_party/async/test/stream_splitter_test.dart
new file mode 100644
index 0000000..ffd0c87
--- /dev/null
+++ b/mojo/public/dart/third_party/async/test/stream_splitter_test.dart
@@ -0,0 +1,286 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:async/async.dart';
+import 'package:test/test.dart';
+
+main() {
+  var controller;
+  var splitter;
+  setUp(() {
+    controller = new StreamController<int>();
+    splitter = new StreamSplitter<int>(controller.stream);
+  });
+
+  test("a branch that's created before the stream starts to replay it",
+      () async {
+    var events = [];
+    var branch = splitter.split();
+    splitter.close();
+    branch.listen(events.add);
+
+    controller.add(1);
+    await flushMicrotasks();
+    expect(events, equals([1]));
+
+    controller.add(2);
+    await flushMicrotasks();
+    expect(events, equals([1, 2]));
+
+    controller.add(3);
+    await flushMicrotasks();
+    expect(events, equals([1, 2, 3]));
+
+    controller.close();
+  });
+
+  test("a branch replays error events as well as data events", () {
+    var branch = splitter.split();
+    splitter.close();
+
+    controller.add(1);
+    controller.addError("error");
+    controller.add(3);
+    controller.close();
+
+    var count = 0;
+    branch.listen(expectAsync((value) {
+      expect(count, anyOf(0, 2));
+      expect(value, equals(count + 1));
+      count++;
+    }, count: 2), onError: expectAsync((error) {
+      expect(count, equals(1));
+      expect(error, equals("error"));
+      count++;
+    }), onDone: expectAsync(() {
+      expect(count, equals(3));
+    }));
+  });
+
+  test("a branch that's created in the middle of a stream replays it", () async {
+    controller.add(1);
+    controller.add(2);
+    await flushMicrotasks();
+
+    var branch = splitter.split();
+    splitter.close();
+
+    controller.add(3);
+    controller.add(4);
+    controller.close();
+
+    expect(branch.toList(), completion(equals([1, 2, 3, 4])));
+  });
+
+  test("a branch that's created after the stream is finished replays it",
+      () async {
+    controller.add(1);
+    controller.add(2);
+    controller.add(3);
+    controller.close();
+    await flushMicrotasks();
+
+    expect(splitter.split().toList(), completion(equals([1, 2, 3])));
+    splitter.close();
+  });
+
+  test("creates single-subscription branches", () async {
+    var branch = splitter.split();
+    expect(branch.isBroadcast, isFalse);
+    branch.listen(null);
+    expect(() => branch.listen(null), throwsStateError);
+    expect(() => branch.listen(null), throwsStateError);
+  });
+
+  // TODO(nweiz): Test that branches have the correct reified type once Dart
+  // 1.11 is released. In 1.10, the stream exposed by a StreamController didn't
+  // have a reified type.
+
+  test("multiple branches each replay the stream", () async {
+    var branch1 = splitter.split();
+    controller.add(1);
+    controller.add(2);
+    await flushMicrotasks();
+    
+    var branch2 = splitter.split();
+    controller.add(3);
+    controller.close();
+    await flushMicrotasks();
+    
+    var branch3 = splitter.split();
+    splitter.close();
+
+    expect(branch1.toList(), completion(equals([1, 2, 3])));
+    expect(branch2.toList(), completion(equals([1, 2, 3])));
+    expect(branch3.toList(), completion(equals([1, 2, 3])));
+  });
+
+  test("a branch doesn't close until the source stream closes", () async {
+    var branch = splitter.split();
+    splitter.close();
+
+    var closed = false;
+    branch.last.then((_) => closed = true);
+
+    controller.add(1);
+    controller.add(2);
+    controller.add(3);
+    await flushMicrotasks();
+    expect(closed, isFalse);
+
+    controller.close();
+    await flushMicrotasks();
+    expect(closed, isTrue);
+  });
+
+  test("the source stream isn't listened to until a branch is", () async {
+    expect(controller.hasListener, isFalse);
+
+    var branch = splitter.split();
+    splitter.close();
+    await flushMicrotasks();
+    expect(controller.hasListener, isFalse);
+
+    branch.listen(null);
+    await flushMicrotasks();
+    expect(controller.hasListener, isTrue);
+  });
+
+  test("the source stream is paused when all branches are paused", () async {
+    var branch1 = splitter.split();
+    var branch2 = splitter.split();
+    var branch3 = splitter.split();
+    splitter.close();
+
+    var subscription1 = branch1.listen(null);
+    var subscription2 = branch2.listen(null);
+    var subscription3 = branch3.listen(null);
+
+    subscription1.pause();
+    await flushMicrotasks();
+    expect(controller.isPaused, isFalse);
+
+    subscription2.pause();
+    await flushMicrotasks();
+    expect(controller.isPaused, isFalse);
+
+    subscription3.pause();
+    await flushMicrotasks();
+    expect(controller.isPaused, isTrue);
+
+    subscription2.resume();
+    await flushMicrotasks();
+    expect(controller.isPaused, isFalse);
+  });
+
+  test("the source stream is paused when all branches are canceled", () async {
+    var branch1 = splitter.split();
+    var branch2 = splitter.split();
+    var branch3 = splitter.split();
+
+    var subscription1 = branch1.listen(null);
+    var subscription2 = branch2.listen(null);
+    var subscription3 = branch3.listen(null);
+
+    subscription1.cancel();
+    await flushMicrotasks();
+    expect(controller.isPaused, isFalse);
+
+    subscription2.cancel();
+    await flushMicrotasks();
+    expect(controller.isPaused, isFalse);
+
+    subscription3.cancel();
+    await flushMicrotasks();
+    expect(controller.isPaused, isTrue);
+
+    var branch4 = splitter.split();
+    splitter.close();
+    await flushMicrotasks();
+    expect(controller.isPaused, isTrue);
+
+    branch4.listen(null);
+    await flushMicrotasks();
+    expect(controller.isPaused, isFalse);
+  });
+
+  test("the source stream is canceled when it's closed after all branches have "
+      "been canceled", () async {
+    var branch1 = splitter.split();
+    var branch2 = splitter.split();
+    var branch3 = splitter.split();
+
+    var subscription1 = branch1.listen(null);
+    var subscription2 = branch2.listen(null);
+    var subscription3 = branch3.listen(null);
+
+    subscription1.cancel();
+    await flushMicrotasks();
+    expect(controller.hasListener, isTrue);
+
+    subscription2.cancel();
+    await flushMicrotasks();
+    expect(controller.hasListener, isTrue);
+
+    subscription3.cancel();
+    await flushMicrotasks();
+    expect(controller.hasListener, isTrue);
+
+    splitter.close();
+    expect(controller.hasListener, isFalse);
+  });
+
+  test("the source stream is canceled when all branches are canceled after it "
+      "has been closed", () async {
+    var branch1 = splitter.split();
+    var branch2 = splitter.split();
+    var branch3 = splitter.split();
+    splitter.close();
+
+    var subscription1 = branch1.listen(null);
+    var subscription2 = branch2.listen(null);
+    var subscription3 = branch3.listen(null);
+
+    subscription1.cancel();
+    await flushMicrotasks();
+    expect(controller.hasListener, isTrue);
+
+    subscription2.cancel();
+    await flushMicrotasks();
+    expect(controller.hasListener, isTrue);
+
+    subscription3.cancel();
+    await flushMicrotasks();
+    expect(controller.hasListener, isFalse);
+  });
+
+  test("a splitter that's closed before any branches are added never listens "
+      "to the source stream", () {
+    splitter.close();
+
+    // This would throw an error if the stream had already been listened to.
+    controller.stream.listen(null);
+  });
+
+  test("splitFrom splits a source stream into the designated number of "
+      "branches", () {
+    var branches = StreamSplitter.splitFrom(controller.stream, 5);
+
+    controller.add(1);
+    controller.add(2);
+    controller.add(3);
+    controller.close();
+
+    expect(branches[0].toList(), completion(equals([1, 2, 3])));
+    expect(branches[1].toList(), completion(equals([1, 2, 3])));
+    expect(branches[2].toList(), completion(equals([1, 2, 3])));
+    expect(branches[3].toList(), completion(equals([1, 2, 3])));
+    expect(branches[4].toList(), completion(equals([1, 2, 3])));
+  });
+}
+
+/// Wait for all microtasks to complete.
+Future flushMicrotasks() => new Future.delayed(Duration.ZERO);
diff --git a/mojo/public/dart/third_party/async/test/stream_zip_test.dart b/mojo/public/dart/third_party/async/test/stream_zip_test.dart
new file mode 100644
index 0000000..35ace7d
--- /dev/null
+++ b/mojo/public/dart/third_party/async/test/stream_zip_test.dart
@@ -0,0 +1,235 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+import "package:async/stream_zip.dart";
+import "package:test/test.dart";
+
+/// Create an error with the same values as [base], except that it throwsA
+/// when seeing the value [errorValue].
+Stream streamError(Stream base, int errorValue, error) {
+  return base.map((x) => (x == errorValue) ? throw error : x);
+}
+
+/// Make a [Stream] from an [Iterable] by adding events to a stream controller
+/// at periodic intervals.
+Stream mks(Iterable iterable) {
+  Iterator iterator = iterable.iterator;
+  StreamController controller = new StreamController();
+  // Some varying time between 3 and 10 ms.
+  int ms = ((++ctr) * 5) % 7 + 3;
+  new Timer.periodic(new Duration(milliseconds: ms), (Timer timer) {
+    if (iterator.moveNext()) {
+      controller.add(iterator.current);
+    } else {
+      controller.close();
+      timer.cancel();
+    }
+  });
+  return controller.stream;
+}
+
+/// Counter used to give varying delays for streams.
+int ctr = 0;
+
+main() {
+  // Test that zipping [streams] gives the results iterated by [expectedData].
+  testZip(Iterable streams, Iterable expectedData) {
+    List data = [];
+    Stream zip = new StreamZip(streams);
+    zip.listen(data.add, onDone: expectAsync(() {
+      expect(data, equals(expectedData));
+    }));
+  }
+
+  test("Basic", () {
+    testZip([mks([1, 2, 3]), mks([4, 5, 6]), mks([7, 8, 9])],
+            [[1, 4, 7], [2, 5, 8], [3, 6, 9]]);
+  });
+
+  test("Uneven length 1", () {
+    testZip([mks([1, 2, 3, 99, 100]), mks([4, 5, 6]), mks([7, 8, 9])],
+            [[1, 4, 7], [2, 5, 8], [3, 6, 9]]);
+  });
+
+  test("Uneven length 2", () {
+    testZip([mks([1, 2, 3]), mks([4, 5, 6, 99, 100]), mks([7, 8, 9])],
+            [[1, 4, 7], [2, 5, 8], [3, 6, 9]]);
+  });
+
+  test("Uneven length 3", () {
+    testZip([mks([1, 2, 3]), mks([4, 5, 6]), mks([7, 8, 9, 99, 100])],
+            [[1, 4, 7], [2, 5, 8], [3, 6, 9]]);
+  });
+
+  test("Uneven length 4", () {
+    testZip([mks([1, 2, 3, 98]), mks([4, 5, 6]), mks([7, 8, 9, 99, 100])],
+            [[1, 4, 7], [2, 5, 8], [3, 6, 9]]);
+  });
+
+  test("Empty 1", () {
+    testZip([mks([]), mks([4, 5, 6]), mks([7, 8, 9])], []);
+  });
+
+  test("Empty 2", () {
+    testZip([mks([1, 2, 3]), mks([]), mks([7, 8, 9])], []);
+  });
+
+  test("Empty 3", () {
+    testZip([mks([1, 2, 3]), mks([4, 5, 6]), mks([])], []);
+  });
+
+  test("Empty source", () {
+    testZip([], []);
+  });
+
+  test("Single Source", () {
+    testZip([mks([1, 2, 3])], [[1], [2], [3]]);
+  });
+
+  test("Other-streams", () {
+    Stream st1 = mks([1, 2, 3, 4, 5, 6]).where((x) => x < 4);
+    Stream st2 = new Stream.periodic(const Duration(milliseconds: 5),
+                                     (x) => x + 4).take(3);
+    StreamController c = new StreamController.broadcast();
+    Stream st3 = c.stream;
+    testZip([st1, st2, st3],
+            [[1, 4, 7], [2, 5, 8], [3, 6, 9]]);
+    c..add(7)..add(8)..add(9)..close();
+  });
+
+  test("Error 1", () {
+    expect(new StreamZip([streamError(mks([1, 2, 3]), 2, "BAD-1"),
+                          mks([4, 5, 6]),
+                          mks([7, 8, 9])]).toList(),
+           throwsA(equals("BAD-1")));
+  });
+
+  test("Error 2", () {
+    expect(new StreamZip([mks([1, 2, 3]),
+                          streamError(mks([4, 5, 6]), 5, "BAD-2"),
+                          mks([7, 8, 9])]).toList(),
+           throwsA(equals("BAD-2")));
+  });
+
+  test("Error 3", () {
+    expect(new StreamZip([mks([1, 2, 3]),
+                          mks([4, 5, 6]),
+                          streamError(mks([7, 8, 9]), 8, "BAD-3")]).toList(),
+           throwsA(equals("BAD-3")));
+  });
+
+  test("Error at end", () {
+    expect(new StreamZip([mks([1, 2, 3]),
+                          streamError(mks([4, 5, 6]), 6, "BAD-4"),
+                          mks([7, 8, 9])]).toList(),
+           throwsA(equals("BAD-4")));
+  });
+
+  test("Error before first end", () {
+    // StreamControllers' streams with no "close" called will never be done,
+    // so the fourth event of the first stream is guaranteed to come first.
+    expect(new StreamZip(
+                [streamError(mks([1, 2, 3, 4]), 4, "BAD-5"),
+                 (new StreamController()..add(4)..add(5)..add(6)).stream,
+                 (new StreamController()..add(7)..add(8)..add(9)).stream]
+               ).toList(),
+           throwsA(equals("BAD-5")));
+  });
+
+  test("Error after first end", () {
+    StreamController controller = new StreamController();
+    controller..add(7)..add(8)..add(9);
+    // Transformer that puts error into controller when one of the first two
+    // streams have sent a done event.
+    StreamTransformer trans = new StreamTransformer.fromHandlers(
+        handleDone: (EventSink s) {
+      Timer.run(() { controller.addError("BAD-6"); });
+      s.close();
+    });
+    testZip([mks([1, 2, 3]).transform(trans),
+             mks([4, 5, 6]).transform(trans),
+             controller.stream],
+           [[1, 4, 7], [2, 5, 8], [3, 6, 9]]);
+  });
+
+  test("Pause/Resume", () {
+    int sc1p = 0;
+    StreamController c1 = new StreamController(
+      onPause: () {
+        sc1p++;
+      },
+      onResume: () {
+        sc1p--;
+      });
+
+    int sc2p = 0;
+    StreamController c2 = new StreamController(
+      onPause: () {
+        sc2p++;
+      },
+      onResume: () {
+        sc2p--;
+      });
+
+    var done = expectAsync((){
+      expect(sc1p, equals(1));
+      expect(sc2p, equals(0));
+    });  // Call to complete test.
+
+    Stream zip = new StreamZip([c1.stream, c2.stream]);
+
+    const ms25 = const Duration(milliseconds: 25);
+
+    // StreamIterator uses pause and resume to control flow.
+    StreamIterator it = new StreamIterator(zip);
+
+    it.moveNext().then((hasMore) {
+      expect(hasMore, isTrue);
+      expect(it.current, equals([1, 2]));
+      return it.moveNext();
+    }).then((hasMore) {
+      expect(hasMore, isTrue);
+      expect(it.current, equals([3, 4]));
+      c2.add(6);
+      return it.moveNext();
+    }).then((hasMore) {
+      expect(hasMore, isTrue);
+      expect(it.current, equals([5, 6]));
+      new Future.delayed(ms25).then((_) { c2.add(8); });
+      return it.moveNext();
+    }).then((hasMore) {
+      expect(hasMore, isTrue);
+      expect(it.current, equals([7, 8]));
+      c2.add(9);
+      return it.moveNext();
+    }).then((hasMore) {
+      expect(hasMore, isFalse);
+      done();
+    });
+
+    c1..add(1)..add(3)..add(5)..add(7)..close();
+    c2..add(2)..add(4);
+  });
+
+  test("pause-resume2", () {
+    var s1 = new Stream.fromIterable([0, 2, 4, 6, 8]);
+    var s2 = new Stream.fromIterable([1, 3, 5, 7]);
+    var sz = new StreamZip([s1, s2]);
+    int ctr = 0;
+    var sub;
+    sub = sz.listen(expectAsync((v) {
+      expect(v, equals([ctr * 2, ctr * 2 + 1]));
+      if (ctr == 1) {
+        sub.pause(new Future.delayed(const Duration(milliseconds: 25)));
+      } else if (ctr == 2) {
+        sub.pause();
+        new Future.delayed(const Duration(milliseconds: 25)).then((_) {
+          sub.resume();
+        });
+      }
+      ctr++;
+    }, count: 4));
+  });
+}
diff --git a/mojo/public/dart/third_party/async/test/stream_zip_zone_test.dart b/mojo/public/dart/third_party/async/test/stream_zip_zone_test.dart
new file mode 100644
index 0000000..47957a9
--- /dev/null
+++ b/mojo/public/dart/third_party/async/test/stream_zip_zone_test.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+import "package:test/test.dart";
+
+// Test that stream listener callbacks all happen in the zone where the
+// listen occurred.
+
+main() {
+ StreamController controller;
+ controller = new StreamController();
+ testStream("singlesub-async", controller, controller.stream);
+ controller = new StreamController.broadcast();
+ testStream("broadcast-async", controller, controller.stream);
+ controller = new StreamController();
+ testStream("asbroadcast-async", controller,
+                                 controller.stream.asBroadcastStream());
+
+ controller = new StreamController(sync: true);
+ testStream("singlesub-sync", controller, controller.stream);
+ controller = new StreamController.broadcast(sync: true);
+ testStream("broadcast-sync", controller, controller.stream);
+ controller = new StreamController(sync: true);
+ testStream("asbroadcast-sync", controller,
+                                controller.stream.asBroadcastStream());
+}
+
+void testStream(String name, StreamController controller, Stream stream) {
+  test(name, () {
+    Zone outer = Zone.current;
+    runZoned(() {
+      Zone newZone1 = Zone.current;
+      StreamSubscription sub;
+      sub = stream.listen(expectAsync((v) {
+        expect(v, 42);
+        expect(Zone.current, newZone1);
+        outer.run(() {
+          sub.onData(expectAsync((v) {
+            expect(v, 37);
+            expect(Zone.current, newZone1);
+            runZoned(() {
+              sub.onData(expectAsync((v) {
+                expect(v, 87);
+                expect(Zone.current, newZone1);
+              }));
+            });
+            if (controller is SynchronousStreamController) {
+              scheduleMicrotask(() => controller.add(87));
+            } else {
+              controller.add(87);
+            }
+          }));
+        });
+        if (controller is SynchronousStreamController) {
+          scheduleMicrotask(() => controller.add(37));
+        } else {
+          controller.add(37);
+        }
+      }));
+    });
+    controller.add(42);
+  });
+}
diff --git a/mojo/public/dart/third_party/async/test/subscription_stream_test.dart b/mojo/public/dart/third_party/async/test/subscription_stream_test.dart
new file mode 100644
index 0000000..03f0ddd
--- /dev/null
+++ b/mojo/public/dart/third_party/async/test/subscription_stream_test.dart
@@ -0,0 +1,176 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+
+import "package:async/async.dart" show SubscriptionStream;
+import "package:test/test.dart";
+
+import "utils.dart";
+
+main() {
+  test("subscription stream of an entire subscription", () async {
+    var stream = createStream();
+    var subscription = stream.listen(null);
+    var subscriptionStream = new SubscriptionStream<int>(subscription);
+    await flushMicrotasks();
+    expect(subscriptionStream.toList(), completion([1, 2, 3, 4]));
+  });
+
+  test("subscription stream after two events", () async {
+    var stream = createStream();
+    var skips = 0;
+    var completer = new Completer();
+    var subscription;
+    subscription = stream.listen((value) {
+      ++skips;
+      expect(value, skips);
+      if (skips == 2) {
+        completer.complete(new SubscriptionStream<int>(subscription));
+      }
+    });
+    var subscriptionStream = await completer.future;
+    await flushMicrotasks();
+    expect(subscriptionStream.toList(), completion([3, 4]));
+  });
+
+  test("listening twice fails", () async {
+    var stream = createStream();
+    var sourceSubscription = stream.listen(null);
+    var subscriptionStream = new SubscriptionStream<int>(sourceSubscription);
+    var subscription = subscriptionStream.listen(null);
+    expect(() => subscriptionStream.listen(null), throws);
+    await subscription.cancel();
+  });
+
+  test("pause and cancel passed through to original stream", () async {
+    var controller = new StreamController(onCancel: () async => 42);
+    var sourceSubscription = controller.stream.listen(null);
+    var subscriptionStream = new SubscriptionStream(sourceSubscription);
+    expect(controller.isPaused, isTrue);
+    var lastEvent;
+    var subscription = subscriptionStream.listen((value) {
+      lastEvent = value;
+    });
+    controller.add(1);
+
+    await flushMicrotasks();
+    expect(lastEvent, 1);
+    expect(controller.isPaused, isFalse);
+
+    subscription.pause();
+    expect(controller.isPaused, isTrue);
+
+    subscription.resume();
+    expect(controller.isPaused, isFalse);
+
+    expect(await subscription.cancel(), 42);
+    expect(controller.hasListener, isFalse);
+  });
+
+  group("cancelOnError source:", () {
+    for (var sourceCancels in [false, true]) {
+      group("${sourceCancels ? "yes" : "no"}:", () {
+        var subscriptionStream;
+        setUp(() {
+          var source = createErrorStream();
+          var sourceSubscription = source.listen(null,
+                                                 cancelOnError: sourceCancels);
+          subscriptionStream = new SubscriptionStream<int>(sourceSubscription);
+        });
+
+        test("- subscriptionStream: no", () async {
+          var done = new Completer();
+          var events = [];
+          subscriptionStream.listen(events.add,
+                                    onError: events.add,
+                                    onDone: done.complete,
+                                    cancelOnError: false);
+          var expected = [1, 2, "To err is divine!"];
+          if (sourceCancels) {
+            var timeout = done.future.timeout(const Duration(milliseconds: 5),
+                                              onTimeout: () => true);
+            expect(await timeout, true);
+          } else {
+            expected.add(4);
+            await done.future;
+          }
+          expect(events, expected);
+        });
+
+        test("- subscriptionStream: yes", () async {
+          var completer = new Completer();
+          var events = [];
+          subscriptionStream.listen(events.add,
+                                    onError: (value) {
+                                      events.add(value);
+                                      completer.complete();
+                                    },
+                                    onDone: () => throw "should not happen",
+                                    cancelOnError: true);
+          await completer.future;
+          await flushMicrotasks();
+          expect(events, [1, 2, "To err is divine!"]);
+        });
+      });
+    }
+
+    for (var cancelOnError in [false, true]) {
+      group(cancelOnError ? "yes" : "no", () {
+        test("- no error, value goes to asFuture", () async {
+          var stream = createStream();
+          var sourceSubscription =
+              stream.listen(null, cancelOnError: cancelOnError);
+          var subscriptionStream =
+              new SubscriptionStream(sourceSubscription);
+          var subscription =
+              subscriptionStream.listen(null, cancelOnError: cancelOnError);
+          expect(subscription.asFuture(42), completion(42));
+        });
+
+        test("- error goes to asFuture", () async {
+          var stream = createErrorStream();
+          var sourceSubscription = stream.listen(null,
+                                                 cancelOnError: cancelOnError);
+          var subscriptionStream =
+              new SubscriptionStream(sourceSubscription);
+
+          var subscription =
+              subscriptionStream.listen(null, cancelOnError: cancelOnError);
+          expect(subscription.asFuture(), throws);
+        });
+      });
+    }
+  });
+}
+
+Stream<int> createStream() async* {
+  yield 1;
+  await flushMicrotasks();
+  yield 2;
+  await flushMicrotasks();
+  yield 3;
+  await flushMicrotasks();
+  yield 4;
+}
+
+Stream<int> createErrorStream() {
+  StreamController controller = new StreamController<int>();
+  () async {
+    controller.add(1);
+    await flushMicrotasks();
+    controller.add(2);
+    await flushMicrotasks();
+    controller.addError("To err is divine!");
+    await flushMicrotasks();
+    controller.add(4);
+    await flushMicrotasks();
+    controller.close();
+  }();
+  return controller.stream;
+}
+
+Stream<int> createLongStream() async* {
+  for (int i = 0; i < 200; i++) yield i;
+}
diff --git a/mojo/public/dart/third_party/async/test/utils.dart b/mojo/public/dart/third_party/async/test/utils.dart
new file mode 100644
index 0000000..b2ea885
--- /dev/null
+++ b/mojo/public/dart/third_party/async/test/utils.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Helper utilities for testing.
+library async.test.util;
+
+import "dart:async";
+import "package:test/test.dart";
+
+/// A zero-millisecond timer should wait until after all microtasks.
+Future flushMicrotasks() => new Future.delayed(Duration.ZERO);
+
+/// A generic unreachable callback function.
+///
+/// Returns a function that fails the test if it is ever called.
+unreachable(String name) => ([a, b]) => fail("Unreachable: $name");
+
+/// A badly behaved stream which throws if it's ever listened to.
+///
+/// Can be used to test cases where a stream should not be used.
+class UnusableStream extends Stream {
+  listen(onData, {onError, onDone, cancelOnError}) {
+    throw new UnimplementedError("Gotcha!");
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/.gitignore b/mojo/public/dart/third_party/barback/.gitignore
new file mode 100644
index 0000000..7dbf035
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/.gitignore
@@ -0,0 +1,15 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.pub/
+build/
+packages
+.packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/barback/.status b/mojo/public/dart/third_party/barback/.status
new file mode 100644
index 0000000..cc86fa3
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/.status
@@ -0,0 +1,24 @@
+# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Skip non-test files ending with "_test".
+packages/*: Skip
+*/packages/*: Skip
+*/*/packages/*: Skip
+*/*/*/packages/*: Skip
+*/*/*/*packages/*: Skip
+*/*/*/*/*packages/*: Skip
+
+# Only run tests from the build directory, since we don't care about the
+# difference between transformed an untransformed code.
+test/*: Skip
+
+[ $runtime == vm && $mode == debug]
+build/test/package_graph/repetition_test: Skip  # Times out
+
+[ $runtime == vm && ( $arch == simarm || $arch == simmips ) ]
+build/test/too_many_open_files_test: Skip # 14220
+
+[ $browser ]
+*: Fail, OK # Uses dart:io.
diff --git a/mojo/public/dart/third_party/barback/CHANGELOG.md b/mojo/public/dart/third_party/barback/CHANGELOG.md
new file mode 100644
index 0000000..a5040e3
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/CHANGELOG.md
@@ -0,0 +1,159 @@
+## 0.15.2+6
+
+* Fix a deadlock that occurred occasionally when a declaring transformer was
+  followed by a lazy transformer (most commonly `$dart2js`).
+
+## 0.15.2+5
+
+* If a transformer requests a non-existent asset from another package, it will
+  now be re-run if that asset is later created.
+
+## 0.15.2+4
+
+* Fix an incorrect example.
+
+## 0.15.2+3
+
+* Clarify that a transform may emit any number of outputs.
+
+## 0.15.2+2
+
+* Fix a bug in listing all assets from a static package.
+
+## 0.15.2+1
+
+* Properly handle logs from a transformer that's been canceled.
+
+## 0.15.2
+
+* Add a `StaticPackageProvider` class to more efficiently handle immutable,
+  untransformed packages.
+
+## 0.15.0+1
+
+* Widen the version constraint on the `collection` package.
+
+## 0.15.0
+
+* Fully switch from `source_maps`' `Span` class to `source_span`'s `SourceSpan`
+  class.
+
+## 0.14.2
+
+* All TransformLogger methods now accept SourceSpans from the source_span
+  package in addition to Spans from the source_maps package. In 0.15.0, only
+  SourceSpans will be accepted.
+
+## 0.14.1+3
+
+* Add a dependency on the `pool` package.
+
+## 0.14.1+2
+
+* Automatically log how long it takes long-running transforms to run.
+
+## 0.14.1+1
+
+* Fix a bug where an event could be added to a closed stream.
+
+## 0.14.1
+
+* Add an `AggregateTransformer` type. Aggregate transformers transform groups of
+  assets for which no single asset is primary. For example, one could be used to
+  merge all images in a directory into a single file.
+
+* Add a `message` getter to `TransformerException` and `AssetLoadException`.
+
+* Fix a bug where transformers would occasionally emit stale output after their
+  inputs changed.
+
+## 0.14.0+3
+
+* Properly handle synchronous errors in `PackageProvider.getAsset()`.
+
+## 0.14.0+2
+
+* Fix a bug with the previous bug fix.
+
+## 0.14.0+1
+
+* Fix a bug where a transformer group preceded by another transformer group
+  would sometimes fail to load secondary assets.
+
+## 0.14.0
+
+* **Breaking change**: when an output of a lazy transformer is requested, that
+  transformer will run long enough to generate the output, then become lazy
+  again. Previously, it would become eager as soon as an asset had been
+  requested.
+
+* Only run `Transformer.isPrimary` and `Transformer.declareOutputs` once for
+  each asset.
+
+* Lazy transformers' laziness is preserved when followed by
+  declaring transformers, or by normal transformers for which the lazy outputs
+  aren't primary.
+
+* Fix a bug where reading the primary input using `Transform.readInputAsString`
+  had slightly different behavior than reading it using
+  `Transform.primary.readAsString`.
+
+* Fix a crashing bug when `Barback.getAllAssets` is called synchronously after
+  creating a new `Barback` instance.
+
+* Don't warn if a lazy or declaring transformer doesn't emit outputs that it has
+  declared. This is valid for transformers like dart2js that need to read their
+  primary input in order to determine whether they should run.
+
+* Allow `Transformer.isPrimary`, `Transformer.apply`, and
+  `DeclaringTransformer.declareOutputs` to return non-`Future` values if they
+  run synchronously.
+
+* Fix a deadlock bug when a lazy primary input to a lazy transformer became
+  dirty while the transformer's `apply` method was running.
+
+* Run declaring transformers with lazy inputs eagerly if the inputs become
+  available.
+
+## 0.13.0
+
+* `Transformer.isPrimary` now takes an `AssetId` rather than an `Asset`.
+
+* `DeclaringTransform` now only exposes the primary input's `AssetId`, rather
+  than the primary `Asset` object.
+
+* `DeclaringTransform` no longer supports `getInput`, `readInput`,
+  `readInputAsString`, or `hasInput`.
+
+## 0.12.0
+
+* Add a `Transform.logger.fine` function that doesn't print its messages by
+  default. When using Barback with pub in verbose mode, these messages will be
+  printed.
+
+* Add a `Transform.hasInput` function that returns whether or not a given
+  secondary input exists.
+
+* `Transformer.allowedExtensions` now supports extensions containing multiple
+  periods, such as `.dart.js`.
+
+* Transforms now pass their primary inputs through to the next phase by default.
+  A transformer may still overwrite its primary input without causing a
+  collision. If a transformer doesn't overwrite its primary input, it may cause
+  it not to be passed through by calling `Transform.consumePrimary`. The primary
+  input will be consumed by default if a transformer throws an error.
+
+* If an input requested with `Transform.getInput`, `Transform.readInput`, or
+  `Transform.readInputAsString` cannot be found, an `AssetNotFoundException`
+  will be thrown. This was always what the documentation said, but previously a
+  `MissingInputException` was thrown instead.
+
+* If a transformer calls `Transform.logger.error`, the transformer will now be
+  considered to have failed after it finishes running `apply()`. This means that
+  its outputs will not be consumed by future transformers and its primary input
+  will not be passed through to the next phase.
+
+* If a transform calls `Transform.getInput`, `Transform.readInput`,
+  `Transform.readInputAsString`, or `Transform.hasInput` on an input that
+  doesn't exist, the transform will be re-run if that input is created in the
+  future.
diff --git a/mojo/public/dart/third_party/barback/LICENSE b/mojo/public/dart/third_party/barback/LICENSE
new file mode 100644
index 0000000..ee99930
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2013, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/barback/README.md b/mojo/public/dart/third_party/barback/README.md
new file mode 100644
index 0000000..314b832
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/README.md
@@ -0,0 +1,12 @@
+Barback is an asset build system. It is the library underlying
+[pub](http://pub.dartlang.org/doc/)'s asset transformers in `pub build` and
+`pub serve`.
+
+Given a set of input files and a set of transformations (think compilers,
+preprocessors and the like), it will automatically apply the appropriate
+transforms and generate output files. When inputs are modified, it automatically
+runs the transforms that are affected.
+
+To learn more, see [here][].
+
+[here]: http://pub.dartlang.org/doc/assets-and-transformers.html
diff --git a/mojo/public/dart/third_party/barback/codereview.settings b/mojo/public/dart/third_party/barback/codereview.settings
new file mode 100644
index 0000000..836f17e
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: http://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/barback/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/barback/example/aggregate_transformer/README.md b/mojo/public/dart/third_party/barback/example/aggregate_transformer/README.md
new file mode 100644
index 0000000..3e7b12f
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/example/aggregate_transformer/README.md
@@ -0,0 +1,4 @@
+This example shows how to write an aggregate transformer.
+
+For more information, see Writing an Aggregate Transformer at:
+https://www.dartlang.org/tools/pub/transformers/aggregate.html
diff --git a/mojo/public/dart/third_party/barback/example/aggregate_transformer/lib/recipes-grammas/banana-pudding-recipe.html b/mojo/public/dart/third_party/barback/example/aggregate_transformer/lib/recipes-grammas/banana-pudding-recipe.html
new file mode 100644
index 0000000..f3e3b63
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/example/aggregate_transformer/lib/recipes-grammas/banana-pudding-recipe.html
@@ -0,0 +1,28 @@
+
+<h2><a name="banana-pudding">Banana Pudding</a></h2>
+<ul>
+<li>1/4 cup water</li>
+<li>2 Tblsp flour</li>
+<li>1 cup sugar</li>
+<li>6 lg eggs</li>
+<li>1 can evaporated milk</li>
+<li>1 Tblsp vanilla extract</li>
+<li>16 oz sour cream</li>
+<li>3 large bananas, sliced</li>
+<li>1 (16 oz) package of vanilla wafers</li>
+</ul>
+<p>
+Add water to saucepan. Whisk in flour until smooth. Add sugar
+and mix well. Add eggs, one at a time, mixing well after each one.
+Slowly stir in milk, mixing well.</p>
+<p>
+Place pan on low heat. Cook, stirring constantly, until mixture
+is thickened to the consistency of a thick gravy, approximately
+20 minutes. The mixture will start to steam and produce bubbles,
+but you don't want a full boil.</p>
+<p>
+Remove from heat and stir in vanilla. Cool thoroughly. Fold in
+sour cream and mix well.</p>
+<p>
+Layer wafers, bananas, and pudding in a glass serving bowl, such
+as a trifle bowl. Thoroughly chill. Serve with whipped cream.</p>
diff --git a/mojo/public/dart/third_party/barback/example/aggregate_transformer/lib/recipes-grammas/winter-squash-pie-recipe.html b/mojo/public/dart/third_party/barback/example/aggregate_transformer/lib/recipes-grammas/winter-squash-pie-recipe.html
new file mode 100644
index 0000000..3445186
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/example/aggregate_transformer/lib/recipes-grammas/winter-squash-pie-recipe.html
@@ -0,0 +1,24 @@
+
+<h2><a name="winter-squash-pie">Winter Squash Pie</a></h2>
+<ul>
+<li>2 eggs</li>
+<li>3/4 cup brown sugar</li>
+<li>1 tsp cinnamon</li>
+<li>1/4 tsp ginger</li>
+<li>1/4 tsp cardamom</li>
+<li>1 cup evaporated milk</li>
+<li>1/2 cup cream</li>
+<li>1-1/2 cups winter squash (such as pumpkin), pureed</li>
+<li>1 9" (single) pie crust</li>
+</ul>
+<p>
+Mix eggs and sugar together. Add pumpkin and mix. Add salt and spices.
+Slowly stir in evaporated milk, and then the cream.</p>
+<p>
+Pour into un nbaked pie crust. Bake in a preheated 425&deg;F oven
+for 15 minutes. Turn heat down to 325&degF and bake another 45 minutes
+until center is firm.</p>
+<p>
+Remove from oven and cool on a rack before serving.</p>
+<p>
+Serve with whipped cream.</p>
diff --git a/mojo/public/dart/third_party/barback/example/aggregate_transformer/lib/transformer.dart b/mojo/public/dart/third_party/barback/example/aggregate_transformer/lib/transformer.dart
new file mode 100644
index 0000000..35634dc
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/example/aggregate_transformer/lib/transformer.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as p;
+
+import 'dart:async';
+
+class MakeBook extends AggregateTransformer {
+  // All transformers need to implement "asPlugin" to let Pub know that they
+  // are transformers.
+  MakeBook.asPlugin();
+
+  // Implement the classifyPrimary method to claim any assets that you want
+  // to handle. Return a value for the assets you want to handle,
+  // or null for those that you do not want to handle.
+  classifyPrimary(AssetId id) {
+
+    // Only process assets where the filename ends with "recipe.html".
+    if (!id.path.endsWith('recipe.html')) return null;
+
+    // Return the path string, minus the recipe itself.
+    // This is where the output asset will be written.
+    return p.url.dirname(id.path);
+  }
+
+  // Implement the apply method to process the assets and create the
+  // output asset.
+  Future apply(AggregateTransform transform) async {
+    var buffer = new StringBuffer()..write('<html><body>');
+
+    var assets = await transform.primaryInputs.toList();
+    assets.sort((x, y) => x.id.compareTo(y.id));
+    for (var asset in assets) {
+      var content = await asset.readAsString();
+      buffer.write(content);
+      buffer.write('<hr>');
+    }
+    buffer.write('</body></html>');
+    // Write the output back to the same directory,
+    // in a file named recipes.html.
+    var id = new AssetId(
+        transform.package, p.url.join(transform.key, "recipes.html"));
+    transform.addOutput(new Asset.fromString(id, buffer.toString()));
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/example/aggregate_transformer/pubspec.yaml b/mojo/public/dart/third_party/barback/example/aggregate_transformer/pubspec.yaml
new file mode 100644
index 0000000..c43247b
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/example/aggregate_transformer/pubspec.yaml
@@ -0,0 +1,15 @@
+name: aggregate_transformer
+description: This example implements an aggregate transformer.
+  It collects recipes, stored as incomplete HTML files, into
+  a single, complete HTML file.
+
+dependencies:
+  barback: ">=0.14.1 <0.16.0"
+
+# Override the barback dependency so this example always uses the version
+# of barback it's bundled with.
+dependency_overrides:
+  barback: {path: ../..}
+
+transformers:
+- aggregate_transformer
diff --git a/mojo/public/dart/third_party/barback/example/lazy_transformer/README.md b/mojo/public/dart/third_party/barback/example/lazy_transformer/README.md
new file mode 100644
index 0000000..35c72cc
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/example/lazy_transformer/README.md
@@ -0,0 +1,14 @@
+This example shows how to write a lazy transformer.
+
+This lazy tranformer implements a ROT13 converter. ROT13 (ROTate 13)
+is a classic substitution cipher which replaces each letter in the source
+file with the corresponding letter 13 places later in the alphabet.
+The source file should have a ".txt" extension and the converted file
+is created with a ".shhhh" extension.
+
+Generally, only transformers that take a long time to run should be made lazy.
+This transformer is not particularly slow, but imagine that it might be used
+to convert the entire library of congress&ndash;laziness would then be a virtue.
+
+For more information, see Writing a Lazy Transformer at:
+https://www.dartlang.org/tools/pub/transformers/lazy-transformer.html
diff --git a/mojo/public/dart/third_party/barback/example/lazy_transformer/lib/message.txt b/mojo/public/dart/third_party/barback/example/lazy_transformer/lib/message.txt
new file mode 100644
index 0000000..7f95e57
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/example/lazy_transformer/lib/message.txt
@@ -0,0 +1,21 @@
+Dear Mom,
+
+Hi! How are you? Sorry that I haven't written recently,
+but I hope all is well!
+
+Life is great at University. I'm sure that I can bring
+up my D- in French.
+
+Also, the Dean's office says they won't press charges.
+It was a big todo about nothing - just your typical college
+prank and the badger (UFE's mascot) was eating pretty
+well on my lunch card. And some spackle will fix the
+damage to my dorm room walls right up...
+
+By the way, can I have a loan? $300 would be great.
+
+Thanks so much and I love you!
+
+Your loving son,
+
+     Rodger
diff --git a/mojo/public/dart/third_party/barback/example/lazy_transformer/lib/transformer.dart b/mojo/public/dart/third_party/barback/example/lazy_transformer/lib/transformer.dart
new file mode 100644
index 0000000..aaee46f
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/example/lazy_transformer/lib/transformer.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:barback/barback.dart';
+
+import 'dart:async';
+
+class CodedMessageConverter extends Transformer implements LazyTransformer {
+
+  // A constructor named "asPlugin" is required. It can be empty, but
+  // it must be present.
+  CodedMessageConverter.asPlugin();
+
+  Future<bool> isPrimary(AssetId id) async => id.extension == '.txt';
+
+  Future declareOutputs(DeclaringTransform transform) {
+    transform.declareOutput(transform.primaryId.changeExtension('.shhhhh'));
+  }
+
+  Future apply(Transform transform) async {
+    var content = await transform.primaryInput.readAsString();
+
+    // The output file is created with the '.shhhhh' extension.
+    var id = transform.primaryInput.id.changeExtension('.shhhhh');
+
+    var newContent = new StringBuffer();
+    for (var i = 0; i < content.length; i++) {
+      newContent.write(rot13(content[i]));
+    }
+    transform.addOutput(new Asset.fromString(id, newContent.toString()));
+  }
+
+  rot13(var ch) {
+    var c = ch.codeUnitAt(0);
+    if (c >= 'a'.codeUnitAt(0) && c <= 'm'.codeUnitAt(0)) c += 13;
+    else if (c >= 'A'.codeUnitAt(0) && c <= 'M'.codeUnitAt(0)) c += 13;
+    else if (c >= 'n'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0)) c -= 13;
+    else if (c >= 'N'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0)) c -= 13;
+    return new String.fromCharCode(c);
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/example/lazy_transformer/pubspec.yaml b/mojo/public/dart/third_party/barback/example/lazy_transformer/pubspec.yaml
new file mode 100644
index 0000000..e01c5d1
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/example/lazy_transformer/pubspec.yaml
@@ -0,0 +1,11 @@
+name: lazy_transformer
+description: This example implements a very simple lazy transformer
+ which implements a ROT13 converter. ROT13 (ROTate by 13 spaces) is
+ a classic substitution cipher where each letter is replaced by
+ the letter 13 places later in the alphabet.
+
+dependencies:
+  barback: ">=0.14.1 <0.16.0"
+
+transformers:
+- lazy_transformer
diff --git a/mojo/public/dart/third_party/barback/example/markdown_converter/README.md b/mojo/public/dart/third_party/barback/example/markdown_converter/README.md
new file mode 100644
index 0000000..84325dd
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/example/markdown_converter/README.md
@@ -0,0 +1,4 @@
+This example shows how to write a simple pub transformer.
+
+For more information, see Writing a Pub Transformer:
+https://www.dartlang.org/tools/pub/transformers/
diff --git a/mojo/public/dart/third_party/barback/example/markdown_converter/lib/images/bison.jpg b/mojo/public/dart/third_party/barback/example/markdown_converter/lib/images/bison.jpg
new file mode 100644
index 0000000..1a8c8b6
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/example/markdown_converter/lib/images/bison.jpg
Binary files differ
diff --git a/mojo/public/dart/third_party/barback/example/markdown_converter/lib/index.markdown b/mojo/public/dart/third_party/barback/example/markdown_converter/lib/index.markdown
new file mode 100644
index 0000000..3bbe8bd
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/example/markdown_converter/lib/index.markdown
@@ -0,0 +1,14 @@
+
+# First level header
+
+* one
+* two
+* three
+
+## Second level header
+
+1. apple
+2. banana
+3. pear
+
+<img src="images/bison.jpg" alt="The Google Bison" />
diff --git a/mojo/public/dart/third_party/barback/example/markdown_converter/lib/test2.md b/mojo/public/dart/third_party/barback/example/markdown_converter/lib/test2.md
new file mode 100644
index 0000000..452a24d
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/example/markdown_converter/lib/test2.md
@@ -0,0 +1,7 @@
+
+# Another first level header 
+
+* _Italics_ 
+* `literal`
+* **bold**
+
diff --git a/mojo/public/dart/third_party/barback/example/markdown_converter/lib/transformer.dart b/mojo/public/dart/third_party/barback/example/markdown_converter/lib/transformer.dart
new file mode 100644
index 0000000..dcbdd8c
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/example/markdown_converter/lib/transformer.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:barback/barback.dart';
+import 'package:markdown/markdown.dart';
+
+import 'dart:async';
+
+class ConvertMarkdown extends Transformer {
+
+  // A constructor named "asPlugin" is required. It can be empty, but
+  // it must be present. It is how pub determines that you want this
+  // class to be publicly available as a loadable transformer plugin.
+  ConvertMarkdown.asPlugin();
+
+  // Any markdown file with one of the following extensions is
+  // converted to HTML.
+  String get allowedExtensions => ".md .markdown .mdown";
+
+  Future apply(Transform transform) async {
+    var content = await transform.primaryInput.readAsString();
+
+    // The extension of the output is changed to ".html".
+    var id = transform.primaryInput.id.changeExtension(".html");
+
+    var newContent =
+        "<html><body>" + markdownToHtml(content) + "</body></html>";
+    transform.addOutput(new Asset.fromString(id, newContent));
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/example/markdown_converter/pubspec.yaml b/mojo/public/dart/third_party/barback/example/markdown_converter/pubspec.yaml
new file mode 100644
index 0000000..5cd04d6
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/example/markdown_converter/pubspec.yaml
@@ -0,0 +1,16 @@
+name: markdown_converter
+description: This hello world example implements a simple
+             transformer that converts a markdown file (with
+             a ".mdown", ".md", or a ".markdown" extension) to HTML.
+
+dependencies:
+  barback: ">=0.14.1 <0.16.0"
+  markdown: any
+
+# Override the barback dependency so this example always uses the version
+# of barback it's bundled with.
+dependency_overrides:
+  barback: {path: ../..}
+
+transformers:
+- markdown_converter
diff --git a/mojo/public/dart/third_party/barback/example/simple_transformer/README.md b/mojo/public/dart/third_party/barback/example/simple_transformer/README.md
new file mode 100644
index 0000000..84325dd
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/example/simple_transformer/README.md
@@ -0,0 +1,4 @@
+This example shows how to write a simple pub transformer.
+
+For more information, see Writing a Pub Transformer:
+https://www.dartlang.org/tools/pub/transformers/
diff --git a/mojo/public/dart/third_party/barback/example/simple_transformer/lib/test.txt b/mojo/public/dart/third_party/barback/example/simple_transformer/lib/test.txt
new file mode 100644
index 0000000..5da849b
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/example/simple_transformer/lib/test.txt
@@ -0,0 +1 @@
+ABC
diff --git a/mojo/public/dart/third_party/barback/example/simple_transformer/lib/transformer.dart b/mojo/public/dart/third_party/barback/example/simple_transformer/lib/transformer.dart
new file mode 100644
index 0000000..974a157
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/example/simple_transformer/lib/transformer.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:barback/barback.dart';
+
+import 'dart:async';
+
+class InsertCopyright extends Transformer {
+  String copyright = "Copyright (c) 2014, the Example project authors.\n";
+
+  // A constructor named "asPlugin" is required. It can be empty, but
+  // it must be present. It is how pub determines that you want this
+  // class to be publicly available as a loadable transformer plugin.
+  InsertCopyright.asPlugin();
+
+  Future<bool> isPrimary(AssetId id) async => id.extension == '.txt';
+
+  Future apply(Transform transform) async {
+    var content = await transform.primaryInput.readAsString();
+    var id = transform.primaryInput.id;
+    var newContent = copyright + content;
+    transform.addOutput(new Asset.fromString(id, newContent));
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/example/simple_transformer/pubspec.yaml b/mojo/public/dart/third_party/barback/example/simple_transformer/pubspec.yaml
new file mode 100644
index 0000000..aecd7ff
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/example/simple_transformer/pubspec.yaml
@@ -0,0 +1,15 @@
+name: simple_transformer
+description: This hello world example implements a simple
+             transformer that inserts a copyright string into
+             an input asset - a file that ends with ".txt".
+
+dependencies:
+  barback: ">=0.14.1 <0.16.0"
+
+# Override the barback dependency so this example always uses the version
+# of barback it's bundled with.
+dependency_overrides:
+  barback: {path: ../..}
+
+transformers:
+- simple_transformer
diff --git a/mojo/public/dart/third_party/barback/lib/barback.dart b/mojo/public/dart/third_party/barback/lib/barback.dart
new file mode 100644
index 0000000..3975758
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/barback.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback;
+
+export 'src/asset/asset.dart';
+export 'src/asset/asset_id.dart';
+export 'src/asset/asset_set.dart';
+export 'src/barback.dart';
+export 'src/build_result.dart';
+export 'src/errors.dart' hide flattenAggregateExceptions;
+export 'src/log.dart';
+export 'src/package_provider.dart';
+export 'src/transformer/aggregate_transform.dart';
+export 'src/transformer/aggregate_transformer.dart';
+export 'src/transformer/barback_settings.dart';
+export 'src/transformer/base_transform.dart';
+export 'src/transformer/declaring_aggregate_transform.dart';
+export 'src/transformer/declaring_aggregate_transformer.dart';
+export 'src/transformer/declaring_transform.dart' hide newDeclaringTransform;
+export 'src/transformer/declaring_transformer.dart';
+export 'src/transformer/lazy_aggregate_transformer.dart';
+export 'src/transformer/lazy_transformer.dart';
+export 'src/transformer/transform.dart' hide newTransform;
+export 'src/transformer/transform_logger.dart';
+export 'src/transformer/transformer.dart';
+export 'src/transformer/transformer_group.dart';
diff --git a/mojo/public/dart/third_party/barback/lib/src/asset/asset.dart b/mojo/public/dart/third_party/barback/lib/src/asset/asset.dart
new file mode 100644
index 0000000..c0f11ba
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/asset/asset.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.asset.asset;
+
+import 'dart:async';
+import 'dart:io';
+import 'dart:convert';
+
+import 'asset_id.dart';
+import 'internal_asset.dart';
+
+/// A blob of content.
+///
+/// Assets may come from the file system, or as the output of a [Transformer].
+/// They are identified by [AssetId].
+///
+/// Custom implementations of [Asset] are not currently supported.
+abstract class Asset {
+  /// The ID for this asset.
+  final AssetId id;
+
+  factory Asset.fromBytes(AssetId id, List<int> bytes) =>
+      new BinaryAsset(id, bytes);
+
+  factory Asset.fromFile(AssetId id, File file) =>
+      new FileAsset(id, file.path);
+
+  factory Asset.fromString(AssetId id, String content) =>
+      new StringAsset(id, content);
+
+  factory Asset.fromPath(AssetId id, String path) =>
+      new FileAsset(id, path);
+
+  factory Asset.fromStream(AssetId id, Stream<List<int>> stream) =>
+      new StreamAsset(id, stream);
+
+  /// Returns the contents of the asset as a string.
+  ///
+  /// If the asset was created from a [String] the original string is always
+  /// returned and [encoding] is ignored. Otherwise, the binary data of the
+  /// asset is decoded using [encoding], which defaults to [UTF8].
+  Future<String> readAsString({Encoding encoding});
+
+  /// Streams the binary contents of the asset.
+  ///
+  /// If the asset was created from a [String], this returns its UTF-8 encoding.
+  Stream<List<int>> read();
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/asset/asset_forwarder.dart b/mojo/public/dart/third_party/barback/lib/src/asset/asset_forwarder.dart
new file mode 100644
index 0000000..03c493c
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/asset/asset_forwarder.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.asset.asset_forwarder;
+
+import 'dart:async';
+
+import 'asset_node.dart';
+
+/// A wrapper for an [AssetNode] that forwards events to a new node.
+///
+/// A forwarder is used when a class wants to forward an [AssetNode] that it
+/// gets as an input, but also wants to have control over when that node is
+/// marked as removed. The forwarder can be closed, thus removing its output
+/// node, without the original node having been removed.
+class AssetForwarder {
+  /// The subscription on the input node.
+  StreamSubscription _subscription;
+
+  /// The controller for the output node.
+  final AssetNodeController _controller;
+
+  /// The node to which events are forwarded.
+  AssetNode get node => _controller.node;
+
+  AssetForwarder(AssetNode node)
+      : _controller = new AssetNodeController.from(node) {
+    if (node.state.isRemoved) return;
+
+    _subscription = node.onStateChange.listen((state) {
+      if (state.isAvailable) {
+        _controller.setAvailable(node.asset);
+      } else if (state.isDirty) {
+        _controller.setDirty();
+      } else {
+        assert(state.isRemoved);
+        close();
+      }
+    });
+  }
+
+  /// Closes the forwarder and marks [node] as removed.
+  void close() {
+    if (_controller.node.state.isRemoved) return;
+    _subscription.cancel();
+    _controller.setRemoved();
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/asset/asset_id.dart b/mojo/public/dart/third_party/barback/lib/src/asset/asset_id.dart
new file mode 100644
index 0000000..adb2247
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/asset/asset_id.dart
@@ -0,0 +1,111 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.asset.asset_id;
+
+import 'package:path/path.dart' as pathos;
+
+/// Identifies an asset within a package.
+class AssetId implements Comparable<AssetId> {
+  /// The name of the package containing this asset.
+  final String package;
+
+  /// The path to the asset relative to the root directory of [package].
+  ///
+  /// Source (i.e. read from disk) and generated (i.e. the output of a
+  /// [Transformer]) assets all have paths. Even intermediate assets that are
+  /// generated and then consumed by later transformations will still have
+  /// a path used to identify it.
+  ///
+  /// Asset paths always use forward slashes as path separators, regardless of
+  /// the host platform.
+  final String path;
+
+  /// Gets the file extension of the asset, if it has one, including the ".".
+  String get extension => pathos.extension(path);
+
+  /// Creates a new AssetId at [path] within [package].
+  ///
+  /// The [path] will be normalized: any backslashes will be replaced with
+  /// forward slashes (regardless of host OS) and "." and ".." will be removed
+  /// where possible.
+  AssetId(this.package, String path)
+      : path = _normalizePath(path);
+
+  /// Parses an [AssetId] string of the form "package|path/to/asset.txt".
+  ///
+  /// The [path] will be normalized: any backslashes will be replaced with
+  /// forward slashes (regardless of host OS) and "." and ".." will be removed
+  /// where possible.
+  factory AssetId.parse(String description) {
+    var parts = description.split("|");
+    if (parts.length != 2) {
+      throw new FormatException('Could not parse "$description".');
+    }
+
+    if (parts[0].isEmpty) {
+      throw new FormatException(
+          'Cannot have empty package name in "$description".');
+    }
+
+    if (parts[1].isEmpty) {
+      throw new FormatException(
+          'Cannot have empty path in "$description".');
+    }
+
+    return new AssetId(parts[0], parts[1]);
+  }
+
+  /// Deserializes an [AssetId] from [data], which must be the result of
+  /// calling [serialize] on an existing [AssetId].
+  ///
+  /// Note that this is intended for communicating ids across isolates and not
+  /// for persistent storage of asset identifiers. There is no guarantee of
+  /// backwards compatibility in serialization form across versions.
+  AssetId.deserialize(data)
+      : package = data[0],
+        path = data[1];
+
+  /// Returns `true` of [other] is an [AssetId] with the same package and path.
+  operator ==(other) =>
+      other is AssetId &&
+      package == other.package &&
+      path == other.path;
+
+  int get hashCode => package.hashCode ^ path.hashCode;
+
+  int compareTo(AssetId other) {
+    var packageComp = package.compareTo(other.package);
+    if (packageComp != 0) return packageComp;
+    return path.compareTo(other.path);
+  }
+
+  /// Returns a new [AssetId] with the same [package] as this one and with the
+  /// [path] extended to include [extension].
+  AssetId addExtension(String extension) =>
+      new AssetId(package, "$path$extension");
+
+  /// Returns a new [AssetId] with the same [package] and [path] as this one
+  /// but with file extension [newExtension].
+  AssetId changeExtension(String newExtension) =>
+      new AssetId(package, pathos.withoutExtension(path) + newExtension);
+
+  String toString() => "$package|$path";
+
+  /// Serializes this [AssetId] to an object that can be sent across isolates
+  /// and passed to [deserialize].
+  serialize() => [package, path];
+}
+
+String _normalizePath(String path) {
+  if (pathos.isAbsolute(path)) {
+    throw new ArgumentError('Asset paths must be relative, but got "$path".');
+  }
+
+  // Normalize path separators so that they are always "/" in the AssetID.
+  path = path.replaceAll(r"\", "/");
+
+  // Collapse "." and "..".
+  return pathos.posix.normalize(path);
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/barback/lib/src/asset/asset_node.dart b/mojo/public/dart/third_party/barback/lib/src/asset/asset_node.dart
new file mode 100644
index 0000000..45d1b17
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/asset/asset_node.dart
@@ -0,0 +1,283 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.asset.asset_node;
+
+import 'dart:async';
+
+import '../errors.dart';
+import '../graph/transform_node.dart';
+import '../utils.dart';
+import 'asset.dart';
+import 'asset_id.dart';
+
+/// Describes the current state of an asset as part of a transformation graph.
+///
+/// An asset node can be in one of three states (see [AssetState]). It provides
+/// an [onStateChange] stream that emits an event whenever it changes state.
+///
+/// Asset nodes are controlled using [AssetNodeController]s.
+class AssetNode {
+  /// The id of the asset that this node represents.
+  final AssetId id;
+
+  /// The [AssetNode] from which [this] is forwarded.
+  ///
+  /// For nodes that aren't forwarded, this will return [this]. Otherwise, it
+  /// will return the first node in the forwarding chain.
+  ///
+  /// This is used to determine whether two nodes are forwarded from the same
+  /// source.
+  AssetNode get origin => _origin == null ? this : _origin;
+  AssetNode _origin;
+
+  /// The transform that created this asset node.
+  ///
+  /// This is `null` for source assets. It can change if the upstream transform
+  /// that created this asset changes; this change will *not* cause an
+  /// [onStateChange] event.
+  TransformNode get transform => _transform;
+  TransformNode _transform;
+
+  /// The current state of the asset node.
+  AssetState get state => _state;
+  AssetState _state;
+
+  /// The concrete asset that this node represents.
+  ///
+  /// This is null unless [state] is [AssetState.AVAILABLE].
+  Asset get asset => _asset;
+  Asset _asset;
+
+  /// The callback to be called to notify this asset node's creator that the
+  /// concrete asset should be generated.
+  ///
+  /// This is null for non-lazy asset nodes (see [AssetNodeController.lazy]).
+  /// Once this is called, it's set to null and [this] is no longer considered
+  /// lazy.
+  Function _lazyCallback;
+
+  /// Whether this node is lazy, meaning that [force] must be called to
+  /// guarantee that it will eventually become available.
+  bool get isLazy => _lazyCallback != null ||
+      (_origin != null && _origin.isLazy);
+
+  /// A broadcast stream that emits an event whenever the node changes state.
+  ///
+  /// This stream is synchronous to ensure that when a source asset is modified
+  /// or removed, the appropriate portion of the asset graph is dirtied before
+  /// any [Barback.getAssetById] calls emit newly-incorrect values.
+  Stream<AssetState> get onStateChange => _stateChangeController.stream;
+
+  /// This is synchronous so that a source being updated will always be
+  /// propagated through the build graph before anything that depends on it is
+  /// requested.
+  final _stateChangeController =
+      new StreamController<AssetState>.broadcast(sync: true);
+
+  /// Calls [callback] when the node's asset is available.
+  ///
+  /// If the asset is currently available, this calls [callback] synchronously
+  /// to ensure that the asset is still available.
+  ///
+  /// The return value of [callback] is piped to the returned Future. If the
+  /// asset is removed before becoming available, the returned future will throw
+  /// an [AssetNotFoundException].
+  Future whenAvailable(callback(Asset asset)) {
+    return _waitForState((state) => state.isAvailable || state.isRemoved,
+        (state) {
+      if (state.isRemoved) throw new AssetNotFoundException(id);
+      return callback(asset);
+    });
+  }
+
+  /// Calls [callback] when the node's asset is removed.
+  ///
+  /// If the asset is already removed when this is called, it calls [callback]
+  /// synchronously.
+  ///
+  /// The return value of [callback] is piped to the returned Future.
+  Future whenRemoved(callback()) =>
+    _waitForState((state) => state.isRemoved, (_) => callback());
+
+  /// Returns a [Future] that completes when [state] changes from its current
+  /// value to any other value.
+  ///
+  /// The returned [Future] will contain the new state.
+  Future<AssetState> whenStateChanges() {
+    var startState = state;
+    return _waitForState((state) => state != startState, (state) => state);
+  }
+
+  /// Calls [callback] as soon as the node is in a state that matches [test].
+  ///
+  /// [callback] is called synchronously if this is already in such a state.
+  ///
+  /// The return value of [callback] is piped to the returned Future.
+  Future _waitForState(bool test(AssetState state),
+      callback(AssetState state)) {
+    if (test(state)) return syncFuture(() => callback(state));
+    return onStateChange.firstWhere(test).then((_) => callback(state));
+  }
+
+  AssetNode._(this.id, this._transform, this._origin)
+      : _state = AssetState.RUNNING;
+
+  AssetNode._available(Asset asset, this._transform, this._origin)
+      : id = asset.id,
+        _asset = asset,
+        _state = AssetState.AVAILABLE;
+
+  AssetNode._lazy(this.id, this._transform, this._origin, this._lazyCallback)
+      : _state = AssetState.RUNNING;
+
+  /// If [this] is lazy, force it to generate a concrete asset; otherwise, do
+  /// nothing.
+  ///
+  /// See [AssetNodeController.lazy].
+  void force() {
+    if (_origin != null) {
+      _origin.force();
+    } else if (_lazyCallback != null) {
+      _lazyCallback();
+      _lazyCallback = null;
+    }
+  }
+
+  String toString() => "${isLazy ? 'lazy' : state} asset $id";
+}
+
+/// The controller for an [AssetNode].
+///
+/// This controls which state the node is in.
+class AssetNodeController {
+  final AssetNode node;
+
+  /// Creates a controller for a dirty node.
+  AssetNodeController(AssetId id, [TransformNode transform])
+      : node = new AssetNode._(id, transform, null);
+
+  /// Creates a controller for an available node with the given concrete
+  /// [asset].
+  AssetNodeController.available(Asset asset, [TransformNode transform])
+      : node = new AssetNode._available(asset, transform, null);
+
+  /// Creates a controller for a lazy node.
+  ///
+  /// For the most part, this node works like any other dirty node. However, the
+  /// owner of its controller isn't expected to do the work to make it available
+  /// as soon as possible like they would for a non-lazy node. Instead, when its
+  /// value is needed, [callback] will fire to indicate that it should be made
+  /// available as soon as possible.
+  ///
+  /// [callback] is guaranteed to only fire once.
+  AssetNodeController.lazy(AssetId id, void callback(),
+          [TransformNode transform])
+      : node = new AssetNode._lazy(id, transform, null, callback);
+
+  /// Creates a controller for a node whose initial state matches the current
+  /// state of [node].
+  ///
+  /// [AssetNode.origin] of the returned node will automatically be set to
+  /// `node.origin`.
+  ///
+  /// If [node] is lazy, the returned node will also be lazy.
+  AssetNodeController.from(AssetNode node)
+      : node = new AssetNode._(node.id, node.transform, node.origin) {
+    if (node.state.isAvailable) {
+      setAvailable(node.asset);
+    } else if (node.state.isRemoved) {
+      setRemoved();
+    }
+  }
+
+  /// Marks the node as [AssetState.RUNNING].
+  void setDirty() {
+    assert(node._state != AssetState.REMOVED);
+    node._asset = null;
+    node._lazyCallback = null;
+
+    // Don't re-emit a dirty event to avoid cases where we try to dispatch an
+    // event while handling another event (e.g. an output is marked lazy, which
+    // causes it to be forced, which causes it to be marked dirty).
+    if (node._state.isDirty) return;
+    node._state = AssetState.RUNNING;
+    node._stateChangeController.add(AssetState.RUNNING);
+  }
+
+  /// Marks the node as [AssetState.REMOVED].
+  ///
+  /// Once a node is marked as removed, it can't be marked as any other state.
+  /// If a new asset is created with the same id, it will get a new node.
+  void setRemoved() {
+    assert(node._state != AssetState.REMOVED);
+    node._state = AssetState.REMOVED;
+    node._asset = null;
+    node._lazyCallback = null;
+    node._stateChangeController.add(AssetState.REMOVED);
+  }
+
+  /// Marks the node as [AssetState.AVAILABLE] with the given concrete [asset].
+  ///
+  /// It's an error to mark an already-available node as available. It should be
+  /// marked as dirty first.
+  void setAvailable(Asset asset) {
+    assert(asset.id == node.id);
+    assert(node._state != AssetState.REMOVED);
+    assert(node._state != AssetState.AVAILABLE);
+    node._state = AssetState.AVAILABLE;
+    node._asset = asset;
+    node._lazyCallback = null;
+    node._stateChangeController.add(AssetState.AVAILABLE);
+  }
+
+  /// Marks the node as [AssetState.RUNNING] and lazy.
+  ///
+  /// Lazy nodes aren't expected to have their values generated until needed.
+  /// Once it's necessary, [callback] will be called. [callback] is guaranteed
+  /// to be called only once.
+  ///
+  /// See also [AssetNodeController.lazy].
+  void setLazy(void callback()) {
+    assert(node._state != AssetState.REMOVED);
+    node._state = AssetState.RUNNING;
+    node._asset = null;
+    node._lazyCallback = callback;
+    node._stateChangeController.add(AssetState.RUNNING);
+  }
+
+  String toString() => "controller for $node";
+}
+
+// TODO(nweiz): add an error state.
+/// An enum of states that an [AssetNode] can be in.
+class AssetState {
+  /// The node has a concrete asset loaded, available, and up-to-date. The asset
+  /// is accessible via [AssetNode.asset]. An asset can only be marked available
+  /// again from the [AssetState.RUNNING] state.
+  static final AVAILABLE = const AssetState._("available");
+
+  /// The asset is no longer available, possibly for good. A removed asset will
+  /// never enter another state.
+  static final REMOVED = const AssetState._("removed");
+
+  /// The asset will exist in the future (unless it's removed), but the concrete
+  /// asset is not yet available.
+  static final RUNNING = const AssetState._("dirty");
+
+  /// Whether this state is [AssetState.AVAILABLE].
+  bool get isAvailable => this == AssetState.AVAILABLE;
+
+  /// Whether this state is [AssetState.REMOVED].
+  bool get isRemoved => this == AssetState.REMOVED;
+
+  /// Whether this state is [AssetState.RUNNING].
+  bool get isDirty => this == AssetState.RUNNING;
+
+  final String name;
+
+  const AssetState._(this.name);
+
+  String toString() => name;
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/asset/asset_node_set.dart b/mojo/public/dart/third_party/barback/lib/src/asset/asset_node_set.dart
new file mode 100644
index 0000000..a1fc17b
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/asset/asset_node_set.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.asset.asset_node_set;
+
+import 'package:collection/collection.dart';
+
+import 'asset_id.dart';
+import 'asset_node.dart';
+
+/// A set of [AssetNode]s that automatically ensures that nodes are removed from
+/// the set as soon as they're marked as [AssetState.REMOVED].
+///
+/// Asset nodes may be accessed by their ids. This means that only one node with
+/// a given id may be stored in the set at a time.
+class AssetNodeSet extends DelegatingSet<AssetNode> {
+  // TODO(nweiz): Use DelegatingMapSet when issue 18705 is fixed.
+  /// A map from asset ids to assets in the set.
+  final _assetsById = new Map<AssetId, AssetNode>();
+
+  AssetNodeSet()
+      : super(new Set());
+
+  /// Returns the asset node in the set with [id], or `null` if none exists.
+  AssetNode operator [](AssetId id) => _assetsById[id];
+
+  bool add(AssetNode node) {
+    if (node.state.isRemoved) return false;
+    node.whenRemoved(() {
+      super.remove(node);
+      _assetsById.remove(node.id);
+    });
+    _assetsById[node.id] = node;
+    return super.add(node);
+  }
+
+  /// Returns whether an asset node with the given [id] is in the set.
+  bool containsId(AssetId id) => _assetsById.containsKey(id);
+
+  void addAll(Iterable<AssetNode> nodes) => nodes.forEach(add);
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/barback/lib/src/asset/asset_set.dart b/mojo/public/dart/third_party/barback/lib/src/asset/asset_set.dart
new file mode 100644
index 0000000..ac58774
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/asset/asset_set.dart
@@ -0,0 +1,76 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.asset.asset_set;
+
+import 'dart:collection';
+
+import 'asset.dart';
+import 'asset_id.dart';
+
+/// A set of [Asset]s with distinct IDs.
+///
+/// This uses the [AssetId] of each asset to determine uniqueness, so no two
+/// assets with the same ID can be in the set.
+class AssetSet extends IterableBase<Asset> {
+  final _assets = new Map<AssetId, Asset>();
+
+  /// The ids of the assets in the set.
+  Iterable<AssetId> get ids => _assets.keys;
+
+  AssetSet();
+
+  /// Creates a new AssetSet from the contents of [other].
+  ///
+  /// If multiple assets in [other] have the same id, the last one takes
+  /// precedence.
+  AssetSet.from(Iterable<Asset> other) {
+    for (var asset in other) {
+      _assets[asset.id] = asset;
+    }
+  }
+
+  Iterator<Asset> get iterator => _assets.values.iterator;
+
+  int get length => _assets.length;
+
+  /// Gets the [Asset] in the set with [id], or returns `null` if no asset with
+  /// that ID is present.
+  Asset operator[](AssetId id) => _assets[id];
+
+  /// Adds [asset] to the set.
+  ///
+  /// If there is already an asset with that ID in the set, it is replaced by
+  /// the new one. Returns [asset].
+  Asset add(Asset asset) {
+    _assets[asset.id] = asset;
+    return asset;
+  }
+
+  /// Adds [assets] to the set.
+  void addAll(Iterable<Asset> assets) {
+    assets.forEach(add);
+  }
+
+  /// Returns `true` if the set contains [asset].
+  bool contains(Asset asset) {
+    var other = _assets[asset.id];
+    return other == asset;
+  }
+
+  /// Returns `true` if the set contains an [Asset] with [id].
+  bool containsId(AssetId id) {
+    return _assets.containsKey(id);
+  }
+
+  /// If the set contains an [Asset] with [id], removes and returns it.
+  Asset removeId(AssetId id) => _assets.remove(id);
+
+  /// Removes all assets from the set.
+  void clear() {
+    _assets.clear();
+  }
+
+  String toString() => _assets.toString();
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/asset/internal_asset.dart b/mojo/public/dart/third_party/barback/lib/src/asset/internal_asset.dart
new file mode 100644
index 0000000..dfacba5
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/asset/internal_asset.dart
@@ -0,0 +1,187 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.asset.internal_asset;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:typed_data';
+
+import '../serialize.dart';
+import '../utils.dart';
+import '../utils/file_pool.dart';
+import '../utils/stream_replayer.dart';
+import 'asset.dart';
+import 'asset_id.dart';
+
+/// Serialize an asset to a form that's safe to send across isolates.
+Map serializeAsset(Asset asset) {
+  var id = serializeId(asset.id);
+  if (asset is BinaryAsset) {
+    return {
+      'type': 'binary',
+      'id': id,
+      'contents': asset._contents
+    };
+  } else if (asset is FileAsset) {
+    return {
+      'type': 'file',
+      'id': id,
+      'path': asset._path
+    };
+  } else if (asset is StringAsset) {
+    return {
+      'type': 'string',
+      'id': id,
+      'contents': asset._contents
+    };
+  } else {
+    // [asset] is probably a [StreamAsset], but it's possible that the user has
+    // created a custom subclass, in which case we just serialize the stream
+    // anyway.
+    return {
+      'type': 'stream',
+      'id': id,
+      'stream': serializeStream(asset.read())
+    };
+  }
+}
+
+/// Deserialize an asset from the form returned by [serialize].
+Asset deserializeAsset(Map asset) {
+  var id = deserializeId(asset['id']);
+  switch (asset['type']) {
+    case 'binary': return new BinaryAsset(id, asset['contents']);
+    case 'file': return new FileAsset(id, asset['path']);
+    case 'string': return new StringAsset(id, asset['contents']);
+    case 'stream':
+      return new StreamAsset(id, deserializeStream(asset['stream']));
+    default:
+      throw new FormatException('Unknown asset type "${asset['type']}".');
+  }
+}
+
+/// An asset whose data is stored in a list of bytes.
+class BinaryAsset implements Asset {
+  final AssetId id;
+
+  final Uint8List _contents;
+
+  BinaryAsset(this.id, List<int> contents)
+      : _contents = toUint8List(contents);
+
+  Future<String> readAsString({Encoding encoding}) {
+    if (encoding == null) encoding = UTF8;
+
+    return new Future.value(encoding.decode(_contents));
+  }
+
+  Stream<List<int>> read() => new Future<List<int>>.value(_contents).asStream();
+
+  String toString() {
+    var buffer = new StringBuffer();
+    buffer.write("Bytes [");
+
+    // Don't show the whole list if it's long.
+    if (_contents.length > 11) {
+      for (var i = 0; i < 5; i++) {
+        buffer.write(byteToHex(_contents[i]));
+        buffer.write(" ");
+      }
+
+      buffer.write("...");
+
+      for (var i = _contents.length - 5; i < _contents.length; i++) {
+        buffer.write(" ");
+        buffer.write(byteToHex(_contents[i]));
+      }
+    } else {
+      for (var i = 0; i < _contents.length; i++) {
+        if (i > 0) buffer.write(" ");
+        buffer.write(byteToHex(_contents[i]));
+      }
+    }
+
+    buffer.write("]");
+    return buffer.toString();
+  }
+}
+
+/// An asset backed by a file on the local file system.
+class FileAsset implements Asset {
+  final AssetId id;
+
+  /// Use a [FilePool] to handle reads so we can try to cope with running out
+  /// of file descriptors more gracefully.
+  static final _pool = new FilePool();
+
+  final String _path;
+  FileAsset(this.id, this._path);
+
+  Future<String> readAsString({Encoding encoding}) {
+    if (encoding == null) encoding = UTF8;
+    return _pool.readAsString(_path, encoding);
+  }
+
+  Stream<List<int>> read() => _pool.openRead(_path);
+
+  String toString() => 'File "${_path}"';
+}
+
+/// An asset whose data is stored in a string.
+class StringAsset implements Asset {
+  final AssetId id;
+
+  final String _contents;
+
+  StringAsset(this.id, this._contents);
+
+  Future<String> readAsString({Encoding encoding}) =>
+      new Future.value(_contents);
+
+  Stream<List<int>> read() =>
+      new Future<List<int>>.value(UTF8.encode(_contents)).asStream();
+
+  String toString() {
+    // Don't show the whole string if it's long.
+    var contents = _contents;
+    if (contents.length > 40) {
+      contents = contents.substring(0, 20) + " ... " +
+                 contents.substring(contents.length - 20);
+    }
+
+    contents = _escape(contents);
+    return 'String "$contents"';
+  }
+
+  String _escape(String string) {
+    return string
+        .replaceAll("\"", r'\"')
+        .replaceAll("\n", r"\n")
+        .replaceAll("\r", r"\r")
+        .replaceAll("\t", r"\t");
+  }
+}
+
+/// An asset whose data is available from a stream.
+class StreamAsset implements Asset {
+  final AssetId id;
+
+  /// A stream replayer that records and replays the contents of the input
+  /// stream.
+  final StreamReplayer<List<int>> _replayer;
+
+  StreamAsset(this.id, Stream<List<int>> stream)
+      : _replayer = new StreamReplayer(stream);
+
+  Future<String> readAsString({Encoding encoding}) {
+    if (encoding == null) encoding = UTF8;
+    return _replayer.getReplay().toList()
+        .then((chunks) => encoding.decode(flatten(chunks)));
+  }
+
+  Stream<List<int>> read() => _replayer.getReplay();
+
+  String toString() => "Stream";
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/barback.dart b/mojo/public/dart/third_party/barback/lib/src/barback.dart
new file mode 100644
index 0000000..98d1154
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/barback.dart
@@ -0,0 +1,117 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.barback;
+
+import 'dart:async';
+
+import 'asset/asset.dart';
+import 'asset/asset_id.dart';
+import 'asset/asset_set.dart';
+import 'log.dart';
+import 'build_result.dart';
+import 'errors.dart';
+import 'graph/package_graph.dart';
+import 'package_provider.dart';
+import 'transformer/transformer.dart';
+
+/// A general-purpose asynchronous build dependency graph manager.
+///
+/// It consumes source assets (including Dart files) in a set of packages,
+/// runs transformations on them, and then tracks which sources have been
+/// modified and which transformations need to be re-run.
+///
+/// To do this, you give barback a [PackageProvider] which can yield a set of
+/// [Transformer]s and raw source [Asset]s. Then you tell it which input files
+/// have been added or modified by calling [updateSources]. Barback will
+/// automatically wire up the appropriate transformers to those inputs and
+/// start running them asynchronously. If a transformer produces outputs that
+/// can be consumed by other transformers, they will automatically be pipelined
+/// correctly.
+///
+/// You can then request assets (either source or generated) by calling
+/// [getAssetById]. This will wait for any necessary transformations and then
+/// return the asset.
+///
+/// When source files have been modified or removed, tell barback by calling
+/// [updateSources] and [removeSources] as appropriate. Barback will
+/// automatically track which transformations are affected by those changes and
+/// re-run them as needed.
+///
+/// Barback tries to be resilient to errors since assets are often in an
+/// in-progress state. When errors occur, they will be captured and emitted on
+/// the [errors] stream.
+class Barback {
+  /// The graph managed by this instance.
+  final PackageGraph _graph;
+
+  /// A stream that emits a [BuildResult] each time the build is completed,
+  /// whether or not it succeeded.
+  ///
+  /// This will emit a result only once every package's [AssetCascade] has
+  /// finished building.
+  ///
+  /// If an unexpected error in barback itself occurs, it will be emitted
+  /// through this stream's error channel.
+  Stream<BuildResult> get results => _graph.results;
+
+  /// A stream that emits any errors from the graph or the transformers.
+  ///
+  /// This emits errors as they're detected. If an error occurs in one part of
+  /// the graph, unrelated parts will continue building.
+  ///
+  /// This will not emit programming errors from barback itself. Those will be
+  /// emitted through the [results] stream's error channel.
+  Stream get errors => _graph.errors;
+
+  /// The stream of [LogEntry] objects used to report transformer log entries.
+  ///
+  /// If this stream has listeners, then log entries will go to that.
+  /// Otherwise, a default logger will display them.
+  Stream<LogEntry> get log => _graph.log;
+
+  Barback(PackageProvider provider)
+      : _graph = new PackageGraph(provider);
+
+  /// Gets the asset identified by [id].
+  ///
+  /// If [id] is for a generated or transformed asset, this will wait until
+  /// it has been created and return it. If the asset cannot be found, throws
+  /// [AssetNotFoundException].
+  Future<Asset> getAssetById(AssetId id) {
+    return _graph.getAssetNode(id).then((node) {
+      if (node == null) throw new AssetNotFoundException(id);
+      return node.asset;
+    });
+  }
+
+  /// Adds [sources] to the graph's known set of source assets.
+  ///
+  /// Begins applying any transforms that can consume any of the sources. If a
+  /// given source is already known, it is considered modified and all
+  /// transforms that use it will be re-applied.
+  void updateSources(Iterable<AssetId> sources) =>
+      _graph.updateSources(sources);
+
+  /// Removes [removed] from the graph's known set of source assets.
+  void removeSources(Iterable<AssetId> removed) =>
+      _graph.removeSources(removed);
+
+  /// Gets all output assets.
+  ///
+  /// If a build is currently in progress, waits until it completes. The
+  /// returned future will complete with a [BarbackException] if the build is
+  /// not successful.
+  Future<AssetSet> getAllAssets() => _graph.getAllAssets();
+
+  /// Sets the transformer phases for [package]'s assets to [transformers].
+  ///
+  /// To the extent that [transformers] is similar to the previous transformer
+  /// phases for [package], the existing asset graph will be preserved.
+  ///
+  /// Elements of the inner iterable of [transformers] must be [Transformer]s,
+  /// [TransformerGroup]s, or [AggregateTransformer]s.
+  void updateTransformers(String package, Iterable<Iterable> transformers) =>
+      _graph.updateTransformers(package, transformers);
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/build_result.dart b/mojo/public/dart/third_party/barback/lib/src/build_result.dart
new file mode 100644
index 0000000..faeb256
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/build_result.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.build_result;
+
+import 'errors.dart';
+import 'utils.dart';
+
+/// An event indicating that the cascade has finished building all assets.
+///
+/// A build can end either in success or failure. If there were no errors during
+/// the build, it's considered to be a success; any errors render it a failure,
+/// although individual assets may still have built successfully.
+class BuildResult {
+  // TODO(rnystrom): Revise how to track error results. Errors can come from
+  // both logs and exceptions. Accumulating them is likely slow and a waste of
+  // memory. If we do want to accumulate them, we should at least unify them
+  // in a single collection (probably of log entries).
+  /// All errors that were thrown during the build.
+  final Set<BarbackException> errors;
+
+  /// `true` if the build succeeded.
+  bool get succeeded => errors.isEmpty;
+
+  BuildResult(Iterable<BarbackException> errors)
+      : errors = flattenAggregateExceptions(errors).toSet();
+
+  /// Creates a build result indicating a successful build.
+  ///
+  /// This equivalent to a build result with no errors.
+  BuildResult.success()
+      : this([]);
+
+  /// Creates a single [BuildResult] that contains all of the errors of
+  /// [results].
+  factory BuildResult.aggregate(Iterable<BuildResult> results) {
+    var errors = unionAll(results.map((result) => result.errors));
+    return new BuildResult(errors);
+  }
+
+  String toString() {
+    if (succeeded) return "success";
+
+    return "errors:\n" + errors.map((error) {
+      var stackTrace = null;
+      if (error is TransformerException || error is AssetLoadException) {
+        stackTrace = error.stackTrace.terse;
+      }
+
+      var msg = new StringBuffer();
+      msg.write(prefixLines(error.toString()));
+      if (stackTrace != null) {
+        msg.write("\n\n");
+        msg.write("Stack chain:\n");
+        msg.write(prefixLines(stackTrace.toString()));
+      }
+      return msg.toString();
+    }).join("\n\n");
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/errors.dart b/mojo/public/dart/third_party/barback/lib/src/errors.dart
new file mode 100644
index 0000000..3488e31
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/errors.dart
@@ -0,0 +1,192 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.errors;
+
+import 'package:stack_trace/stack_trace.dart';
+
+import 'asset/asset_id.dart';
+import 'transformer/wrapping_aggregate_transformer.dart';
+import 'utils.dart';
+
+/// Error thrown when an asset with [id] cannot be found.
+class AssetNotFoundException implements Exception {
+  final AssetId id;
+
+  AssetNotFoundException(this.id);
+
+  String toString() => "Could not find asset $id.";
+}
+
+/// Replaces any occurrences of [AggregateException] in [errors] with the list
+/// of errors it contains.
+Iterable<BarbackException> flattenAggregateExceptions(
+    Iterable<BarbackException> errors) {
+  return errors.expand((error) {
+    if (error is! AggregateException) return [error];
+    return error.errors;
+  });
+}
+
+/// The interface for exceptions from the barback graph or its transformers.
+///
+/// These exceptions are never produced by programming errors in barback.
+abstract class BarbackException implements Exception {
+  /// Takes a collection of [BarbackExceptions] and returns a single exception
+  /// that contains them all.
+  ///
+  /// If [errors] is empty, returns `null`. If it only has one error, that
+  /// error is returned. Otherwise, an [AggregateException] is returned.
+  static BarbackException aggregate(Iterable<BarbackException> errors) {
+    if (errors.isEmpty) return null;
+    if (errors.length == 1) return errors.single;
+    return new AggregateException(errors);
+  }
+}
+
+/// An error that wraps a collection of other [BarbackException]s.
+///
+/// It implicitly flattens any [AggregateException]s that occur in the list of
+/// exceptions it wraps.
+class AggregateException implements BarbackException {
+  final Set<BarbackException> errors;
+
+  AggregateException(Iterable<BarbackException> errors)
+      : errors = flattenAggregateExceptions(errors).toSet();
+
+  String toString() {
+    var buffer = new StringBuffer();
+    buffer.writeln("Multiple errors occurred:\n");
+
+    for (var error in errors) {
+      buffer.writeln(prefixLines(error.toString(),
+                                 prefix: "  ", firstPrefix: "- "));
+    }
+
+    return buffer.toString();
+  }
+}
+
+/// Error thrown when two or more transformers both output an asset with [id].
+class AssetCollisionException implements BarbackException {
+  /// All the transforms that output an asset with [id].
+  ///
+  /// If this only contains a single transform, that indicates that a
+  /// transformer produced an output that collides with a source asset or an
+  /// asset from a previous phase.
+  final Set<TransformInfo> transforms;
+  final AssetId id;
+
+  AssetCollisionException(Iterable<TransformInfo> transforms, this.id)
+      : transforms = new Set.from(transforms);
+
+  String toString() => "Transforms $transforms all emitted asset $id.";
+}
+
+/// Error thrown when a transformer requests an input [id] which cannot be
+/// found.
+class MissingInputException implements BarbackException {
+  /// The transform that requested [id].
+  final TransformInfo transform;
+  final AssetId id;
+
+  MissingInputException(this.transform, this.id);
+
+  String toString() => "Transform $transform tried to load missing input $id.";
+}
+
+/// Error thrown when a transformer outputs an asset to a different package than
+/// the primary input's.
+class InvalidOutputException implements BarbackException {
+  /// The transform that output the asset.
+  final TransformInfo transform;
+  final AssetId id;
+
+  InvalidOutputException(this.transform, this.id);
+
+  String toString() => "Transform $transform emitted $id, which wasn't in the "
+      "same package (${transform.primaryId.package}).";
+}
+
+/// Base class for an error that wraps another.
+abstract class _WrappedException implements BarbackException {
+  /// The wrapped exception.
+  final error;
+  final Chain stackTrace;
+
+  String get message => "$_message: ${getErrorMessage(error)}";
+
+  String get _message;
+
+  _WrappedException(error, StackTrace stackTrace)
+      : this.error = error,
+        this.stackTrace = _getChain(error, stackTrace);
+
+  String toString() {
+    var result = message;
+    if (stackTrace != null) result = "$result\n${stackTrace.terse}";
+    return result;
+  }
+}
+
+/// Returns the stack chain for [error] and [stackTrace].
+Chain _getChain(error, StackTrace stackTrace) {
+  if (error is Error && stackTrace == null) stackTrace = error.stackTrace;
+  if (stackTrace != null) return new Chain.forTrace(stackTrace);
+  return null;
+}
+
+/// Error wrapping an exception thrown by a transform.
+class TransformerException extends _WrappedException {
+  /// The transform that threw the exception.
+  final TransformInfo transform;
+
+  TransformerException(this.transform, error, StackTrace stackTrace)
+      : super(error, stackTrace);
+
+  String get _message => "Transform $transform threw error";
+}
+
+/// Error thrown when a source asset [id] fails to load.
+///
+/// This can be thrown either because the source asset was expected to exist and
+/// did not or because reading it failed somehow.
+class AssetLoadException extends _WrappedException {
+  final AssetId id;
+
+  AssetLoadException(this.id, error, [StackTrace stackTrace])
+      : super(error, stackTrace);
+
+  String get _message => "Failed to load source asset $id";
+}
+
+/// Information about a single transform in the barback graph.
+///
+/// Identifies a single transformation in the barback graph.
+///
+/// A transformation is uniquely identified by the ID of its primary input, and
+/// the transformer that is applied to it.
+class TransformInfo {
+  /// The transformer that's run for this transform.
+  ///
+  /// This may be a [Transformer] or a [WrappingAggregateTransformer]. It may
+  /// also return additional types in the future.
+  final transformer;
+
+  /// The id of this transform's primary asset.
+  final AssetId primaryId;
+
+  TransformInfo(transformer, this.primaryId)
+      : transformer = transformer is WrappingAggregateTransformer ?
+            transformer.transformer : transformer;
+
+  bool operator==(other) =>
+      other is TransformInfo &&
+      other.transformer == transformer &&
+      other.primaryId == primaryId;
+
+  int get hashCode => transformer.hashCode ^ primaryId.hashCode;
+
+  String toString() => "$transformer on $primaryId";
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/graph/asset_cascade.dart b/mojo/public/dart/third_party/barback/lib/src/graph/asset_cascade.dart
new file mode 100644
index 0000000..70bc4c9
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/graph/asset_cascade.dart
@@ -0,0 +1,228 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.graph.asset_cascade;
+
+import 'dart:async';
+
+import '../asset/asset.dart';
+import '../asset/asset_id.dart';
+import '../asset/asset_node.dart';
+import '../asset/asset_set.dart';
+import '../errors.dart';
+import '../log.dart';
+import '../transformer/transformer.dart';
+import '../utils.dart';
+import '../utils/cancelable_future.dart';
+import 'node_status.dart';
+import 'node_streams.dart';
+import 'package_graph.dart';
+import 'phase.dart';
+
+/// The asset cascade for an individual package.
+///
+/// This keeps track of which [Transformer]s are applied to which assets, and
+/// re-runs those transformers when their dependencies change. The transformed
+/// asset nodes are accessible via [getAssetNode].
+///
+/// A cascade consists of one or more [Phases], each of which has one or more
+/// [Transformer]s that run in parallel, potentially on the same inputs. The
+/// inputs of the first phase are the source assets for this cascade's package.
+/// The inputs of each successive phase are the outputs of the previous phase,
+/// as well as any assets that haven't yet been transformed.
+class AssetCascade {
+  /// The name of the package whose assets are managed.
+  final String package;
+
+  /// The [PackageGraph] that tracks all [AssetCascade]s for all dependencies of
+  /// the current app.
+  final PackageGraph graph;
+
+  /// The controllers for the [AssetNode]s that provide information about this
+  /// cascade's package's source assets.
+  final _sourceControllerMap = new Map<AssetId, AssetNodeController>();
+
+  /// Futures for source assets that are currently being loaded.
+  ///
+  /// These futures are cancelable so that if an asset is updated after a load
+  /// has been kicked off, the previous load can be ignored in favor of a new
+  /// one.
+  final _loadingSources = new Map<AssetId, CancelableFuture<Asset>>();
+
+  /// The list of phases in this cascade.
+  ///
+  /// This will always contain at least one phase, and the first phase will
+  /// never have any transformers. This ensures that every transformer can
+  /// request inputs from a previous phase.
+  final _phases = <Phase>[];
+
+  /// The subscription to the [Phase.onStatusChange] stream of the last [Phase]
+  /// in [_phases].
+  StreamSubscription _phaseStatusSubscription;
+
+  /// A stream that emits any errors from the cascade or the transformers.
+  ///
+  /// This emits errors as they're detected. If an error occurs in one part of
+  /// the cascade, unrelated parts will continue building.
+  Stream<BarbackException> get errors => _errorsController.stream;
+  final _errorsController =
+      new StreamController<BarbackException>.broadcast(sync: true);
+
+  /// How far along [this] is in processing its assets.
+  NodeStatus get status {
+    // Just check the last phase, since it will check all the previous phases
+    // itself.
+    return _phases.last.status;
+  }
+
+  /// The streams exposed by this cascade.
+  final _streams = new NodeStreams();
+  Stream<LogEntry> get onLog => _streams.onLog;
+  Stream<NodeStatus> get onStatusChange => _streams.onStatusChange;
+  Stream<AssetNode> get onAsset => _streams.onAsset;
+
+  /// Returns all currently-available output assets from this cascade.
+  Future<AssetSet> get availableOutputs => new Future.value(new AssetSet.from(
+      _phases.last.availableOutputs.map((node) => node.asset)));
+
+  /// Creates a new [AssetCascade].
+  ///
+  /// It loads source assets within [package] using [provider].
+  AssetCascade(this.graph, this.package) {
+    _addPhase(new Phase(this, package));
+    _streams.onAssetPool.add(_phases.last.onAsset);
+  }
+
+  /// Gets the asset identified by [id].
+  ///
+  /// If [id] is for a generated or transformed asset, this will wait until it
+  /// has been created and return it. This means that the returned asset will
+  /// always be [AssetState.AVAILABLE].
+  ///
+  /// If the asset cannot be found, returns null.
+  Future<AssetNode> getAssetNode(AssetId id) {
+    assert(id.package == package);
+
+    var oldLastPhase = _phases.last;
+    // TODO(rnystrom): Waiting for the entire build to complete is unnecessary
+    // in some cases. Should optimize:
+    // * [id] may be generated before the compilation is finished. We should
+    //   be able to quickly check whether there are any more in-place
+    //   transformations that can be run on it. If not, we can return it early.
+    // * If [id] has never been generated and all active transformers provide
+    //   metadata about the file names of assets it can emit, we can prove that
+    //   none of them can emit [id] and fail early.
+    return oldLastPhase.getOutput(id).then((node) {
+      // The last phase may have changed if [updateSources] was called after
+      // requesting the output. In that case, we want the output from the new
+      // last phase.
+      if (_phases.last == oldLastPhase) return node;
+      return getAssetNode(id);
+    });
+  }
+
+  /// Adds [sources] to the graph's known set of source assets.
+  ///
+  /// Begins applying any transforms that can consume any of the sources. If a
+  /// given source is already known, it is considered modified and all
+  /// transforms that use it will be re-applied.
+  void updateSources(Iterable<AssetId> sources) {
+    for (var id in sources) {
+      var controller = _sourceControllerMap[id];
+      if (controller != null) {
+        controller.setDirty();
+      } else {
+        _sourceControllerMap[id] = new AssetNodeController(id);
+        _phases.first.addInput(_sourceControllerMap[id].node);
+      }
+
+      // If this source was already loading, cancel the old load, since it may
+      // return out-of-date contents for the asset.
+      if (_loadingSources.containsKey(id)) _loadingSources[id].cancel();
+
+      _loadingSources[id] = new CancelableFuture<Asset>(
+          syncFuture(() => graph.provider.getAsset(id)));
+      _loadingSources[id].whenComplete(() {
+        _loadingSources.remove(id);
+      }).then((asset) {
+        var controller = _sourceControllerMap[id].setAvailable(asset);
+      }).catchError((error, stack) {
+        reportError(new AssetLoadException(id, error, stack));
+
+        // TODO(nweiz): propagate error information through asset nodes.
+        _sourceControllerMap.remove(id).setRemoved();
+      });
+    }
+  }
+
+  /// Removes [removed] from the graph's known set of source assets.
+  void removeSources(Iterable<AssetId> removed) {
+    removed.forEach((id) {
+      // If the source was being loaded, cancel that load.
+      if (_loadingSources.containsKey(id)) _loadingSources.remove(id).cancel();
+
+      var controller = _sourceControllerMap.remove(id);
+      // Don't choke if an id is double-removed for some reason.
+      if (controller != null) controller.setRemoved();
+    });
+  }
+
+  /// Sets this cascade's transformer phases to [transformers].
+  ///
+  /// Elements of the inner iterable of [transformers] must be [Transformer]s,
+  /// [TransformerGroup]s, or [AggregateTransformer]s.
+  void updateTransformers(Iterable<Iterable> transformersIterable) {
+    _streams.onAssetPool.remove(_phases.last.onAsset);
+    var transformers = transformersIterable.toList();
+
+    // Always preserve a single phase with no transformers at the beginning of
+    // the cascade so that [TransformNode]s in the first populated phase will
+    // have something to request assets from.
+    for (var i = 0; i < transformers.length; i++) {
+      if (_phases.length > i + 1) {
+        _phases[i + 1].updateTransformers(transformers[i]);
+        continue;
+      }
+
+      var phase = _phases.last.addPhase();
+      _addPhase(phase);
+      phase.updateTransformers(transformers[i]);
+    }
+
+    for (var i = transformers.length + 1; i < _phases.length; i++) {
+      _phases[i].remove();
+    }
+    _phases.removeRange(transformers.length + 1, _phases.length);
+
+    _phaseStatusSubscription.cancel();
+    _phaseStatusSubscription = _phases.last.onStatusChange
+        .listen(_streams.changeStatus);
+
+    _streams.onAssetPool.add(_phases.last.onAsset);
+  }
+
+  /// Force all [LazyTransformer]s' transforms in this cascade to begin
+  /// producing concrete assets.
+  void forceAllTransforms() {
+    for (var phase in _phases) {
+      phase.forceAllTransforms();
+    }
+  }
+
+  void reportError(BarbackException error) {
+    _errorsController.add(error);
+  }
+
+  /// Add [phase] to the end of [_phases] and watch its streams.
+  void _addPhase(Phase phase) {
+    _streams.onLogPool.add(phase.onLog);
+    if (_phaseStatusSubscription != null) _phaseStatusSubscription.cancel();
+    _phaseStatusSubscription =
+        phase.onStatusChange.listen(_streams.changeStatus);
+
+    _phases.add(phase);
+  }
+
+  String toString() => "cascade for $package";
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/graph/group_runner.dart b/mojo/public/dart/third_party/barback/lib/src/graph/group_runner.dart
new file mode 100644
index 0000000..f9dcaa1
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/graph/group_runner.dart
@@ -0,0 +1,89 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.graph.group_runner;
+
+import 'dart:async';
+
+import '../asset/asset_node.dart';
+import '../log.dart';
+import '../transformer/transformer_group.dart';
+import '../utils/stream_pool.dart';
+import 'node_status.dart';
+import 'phase.dart';
+
+/// A class that processes all of the phases in a single transformer group.
+///
+/// A group takes many inputs, processes them, and emits many outputs.
+class GroupRunner {
+  /// The group this runner runs.
+  final TransformerGroup _group;
+
+  /// A string describing the location of [this] in the transformer graph.
+  final String _location;
+
+  /// The phases defined by this group.
+  final _phases = new List<Phase>();
+
+  /// How far along [this] is in processing its assets.
+  NodeStatus get status {
+    // Just check the last phase, since it will check all the previous phases
+    // itself.
+    return _phases.last.status;
+  }
+
+  /// A stream that emits an event every time the group's status changes.
+  Stream<NodeStatus> get onStatusChange => _onStatusChange;
+  Stream _onStatusChange;
+
+  /// A stream that emits any new assets emitted by [this].
+  ///
+  /// Assets are emitted synchronously to ensure that any changes are thoroughly
+  /// propagated as soon as they occur.
+  Stream<AssetNode> get onAsset => _onAsset;
+  Stream<AssetNode> _onAsset;
+
+  /// A stream that emits an event whenever any transforms in this group logs
+  /// an entry.
+  Stream<LogEntry> get onLog => _onLogPool.stream;
+  final _onLogPool = new StreamPool<LogEntry>.broadcast();
+
+  GroupRunner(Phase previous, this._group, this._location) {
+    _addPhase(previous.addPhase(_location), []);
+    for (var phase in _group.phases) {
+      _addPhase(_phases.last.addPhase(), phase);
+    }
+
+    _onAsset = _phases.last.onAsset;
+    _onStatusChange = _phases.last.onStatusChange;
+  }
+
+  /// Add a phase with [contents] to [this]'s list of phases.
+  ///
+  /// [contents] should be an inner [Iterable] from a [TransformGroup.phases]
+  /// value.
+  void _addPhase(Phase phase, Iterable contents) {
+    _phases.add(phase);
+    _onLogPool.add(phase.onLog);
+    phase.updateTransformers(contents);
+  }
+
+  /// Force all [LazyTransformer]s' transforms in this group to begin producing
+  /// concrete assets.
+  void forceAllTransforms() {
+    for (var phase in _phases) {
+      phase.forceAllTransforms();
+    }
+  }
+
+  /// Removes this group and all sub-phases within it.
+  void remove() {
+    _onLogPool.close();
+    for (var phase in _phases) {
+      phase.remove();
+    }
+  }
+
+  String toString() => "group in phase $_location for $_group";
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/graph/node_status.dart b/mojo/public/dart/third_party/barback/lib/src/graph/node_status.dart
new file mode 100644
index 0000000..a42e523
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/graph/node_status.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.graph.node_status;
+
+/// The status of a node in barback's package graph.
+///
+/// A node has three possible statuses: [IDLE], [MATERIALIZING], and [RUNNING].
+/// These are ordered from least dirty to most dirty; the [dirtier] and
+/// [dirtiest] functions make use of this ordering.
+class NodeStatus {
+  /// The node has finished its work and won't do anything else until external
+  /// input causes it to.
+  ///
+  /// For deferred nodes, this may indicate that they're finished declaring
+  /// their outputs and waiting to be forced.
+  static const IDLE = const NodeStatus("idle");
+
+  /// The node has declared its outputs but their concrete values are still
+  /// being generated.
+  ///
+  /// This is only meaningful for nodes that are or contain declaring
+  /// transformers. Note that a lazy transformer that's declared its outputs but
+  /// isn't actively working to generate them is considered [IDLE], not
+  /// [MATERIALIZING].
+  static const MATERIALIZING = const NodeStatus("materializing");
+
+  /// The node is actively working on declaring or generating its outputs.
+  ///
+  /// Declaring transformers are only considered dirty until they're finished
+  /// declaring their outputs; past that point, they're always either
+  /// [MATERIALIZING] or [IDLE]. Non-declaring transformers, by contrast, are
+  /// always either [RUNNING] or [IDLE].
+  static const RUNNING = const NodeStatus("running");
+
+  final String _name;
+
+  /// Returns the dirtiest status in [statuses].
+  static NodeStatus dirtiest(Iterable<NodeStatus> statuses) =>
+      statuses.fold(NodeStatus.IDLE,
+          (status1, status2) => status1.dirtier(status2));
+
+  const NodeStatus(this._name);
+
+  String toString() => _name;
+
+  /// Returns [this] or [other], whichever is dirtier.
+  NodeStatus dirtier(NodeStatus other) {
+    if (this == RUNNING || other == RUNNING) return RUNNING;
+    if (this == MATERIALIZING || other == MATERIALIZING) return MATERIALIZING;
+    return IDLE;
+  }
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/barback/lib/src/graph/node_streams.dart b/mojo/public/dart/third_party/barback/lib/src/graph/node_streams.dart
new file mode 100644
index 0000000..8344792
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/graph/node_streams.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.graph.node_streams;
+
+import 'dart:async';
+
+import '../asset/asset_node.dart';
+import '../log.dart';
+import '../utils/stream_pool.dart';
+import 'node_status.dart';
+
+/// A collection of streams that are common to nodes in barback's package graph.
+class NodeStreams {
+  /// A stream that emits an event every time the node's status changes.
+  ///
+  /// This will emit the new status. It's guaranteed to emit an event only when
+  /// the status changes from the previous value. To ensure this, callers should
+  /// emit status changes using [changeStatus]. The initial status is assumed to
+  /// be [NodeStatus.RUNNING].
+  Stream<NodeStatus> get onStatusChange => _onStatusChangeController.stream;
+  final _onStatusChangeController =
+      new StreamController<NodeStatus>.broadcast(sync: true);
+
+  /// A stream that emits any new assets produced by the node.
+  ///
+  /// Assets are emitted synchronously to ensure that any changes are thoroughly
+  /// propagated as soon as they occur.
+  Stream<AssetNode> get onAsset => onAssetPool.stream;
+  final onAssetPool = new StreamPool<AssetNode>.broadcast();
+  final onAssetController =
+      new StreamController<AssetNode>.broadcast(sync: true);
+
+  /// A stream that emits an event whenever any the node logs an entry.
+  Stream<LogEntry> get onLog => onLogPool.stream;
+  final onLogPool = new StreamPool<LogEntry>.broadcast();
+  final onLogController = new StreamController<LogEntry>.broadcast(sync: true);
+
+  var _previousStatus = NodeStatus.RUNNING;
+
+  /// Whether [this] has been closed.
+  bool get isClosed => onAssetController.isClosed;
+
+  NodeStreams() {
+    onAssetPool.add(onAssetController.stream);
+    onLogPool.add(onLogController.stream);
+  }
+
+  /// Emits a status change notification via [onStatusChange].
+  ///
+  /// This guarantees that a change notification won't be emitted if the status
+  /// didn't actually change.
+  void changeStatus(NodeStatus status) {
+    if (_previousStatus != status) _onStatusChangeController.add(status);
+  }
+
+  /// Closes all the streams.
+  void close() {
+    _onStatusChangeController.close();
+    onAssetController.close();
+    onAssetPool.close();
+    onLogController.close();
+    onLogPool.close();
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/graph/package_graph.dart b/mojo/public/dart/third_party/barback/lib/src/graph/package_graph.dart
new file mode 100644
index 0000000..7573081
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/graph/package_graph.dart
@@ -0,0 +1,291 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.graph.package_graph;
+
+import 'dart:async';
+import 'dart:collection';
+
+import '../asset/asset_id.dart';
+import '../asset/asset_node.dart';
+import '../asset/asset_set.dart';
+import '../build_result.dart';
+import '../errors.dart';
+import '../log.dart';
+import '../package_provider.dart';
+import '../utils.dart';
+import 'asset_cascade.dart';
+import 'node_status.dart';
+import 'static_asset_cascade.dart';
+
+/// The collection of [AssetCascade]s for an entire application.
+///
+/// This tracks each package's [AssetCascade] and routes asset requests between
+/// them.
+class PackageGraph {
+  /// The provider that exposes asset and package information.
+  final PackageProvider provider;
+
+  /// The [AssetCascade] for each package.
+  final _cascades = <String, AssetCascade>{};
+
+  /// A stream that emits a [BuildResult] each time the build is completed,
+  /// whether or not it succeeded.
+  ///
+  /// This will emit a result only once every package's [AssetCascade] has
+  /// finished building.
+  ///
+  /// If an unexpected error in barback itself occurs, it will be emitted
+  /// through this stream's error channel.
+  Stream<BuildResult> get results => _resultsController.stream;
+  final _resultsController =
+      new StreamController<BuildResult>.broadcast(sync: true);
+
+  /// A stream that emits any errors from the graph or the transformers.
+  ///
+  /// This emits errors as they're detected. If an error occurs in one part of
+  /// the graph, unrelated parts will continue building.
+  ///
+  /// This will not emit programming errors from barback itself. Those will be
+  /// emitted through the [results] stream's error channel.
+  Stream<BarbackException> get errors => _errors;
+  Stream<BarbackException> _errors;
+
+  /// The stream of [LogEntry] objects used to report transformer log entries.
+  Stream<LogEntry> get log => _logController.stream;
+  final _logController = new StreamController<LogEntry>.broadcast(sync: true);
+
+  /// How far along [this] is in processing its assets.
+  NodeStatus get _status => NodeStatus.dirtiest(
+      _cascades.values.map((cascade) => cascade.status));
+
+  /// Whether a [BuildResult] is scheduled to be emitted on [results] (see
+  /// [_tryScheduleResult]).
+  bool _resultScheduled = false;
+
+  /// The most recent [BuildResult] emitted on [results].
+  BuildResult _lastResult;
+
+  // TODO(nweiz): This can have bogus errors if an error is created and resolved
+  // in the space of one build.
+  /// The errors that have occurred since the current build started.
+  ///
+  /// This will be empty if no build is occurring.
+  final _accumulatedErrors = new Queue<BarbackException>();
+
+  /// The most recent error emitted from a cascade's result stream.
+  ///
+  /// This is used to pipe an unexpected error from a build to the resulting
+  /// [Future] returned by [getAllAssets].
+  var _lastUnexpectedError;
+
+  /// The stack trace for [_lastUnexpectedError].
+  StackTrace _lastUnexpectedErrorTrace;
+
+  /// Creates a new [PackageGraph] that will transform assets in all packages
+  /// made available by [provider].
+  PackageGraph(this.provider) {
+    _inErrorZone(() {
+      for (var package in provider.packages) {
+        var cascade = new AssetCascade(this, package);
+        _cascades[package] = cascade;
+        cascade.onLog.listen(_onLog);
+        cascade.onStatusChange.listen((status) {
+          if (status == NodeStatus.IDLE) _tryScheduleResult();
+        });
+      }
+
+      if (provider is StaticPackageProvider) {
+        StaticPackageProvider staticProvider = provider;
+        for (var package in staticProvider.staticPackages) {
+          if (_cascades.containsKey(package)) {
+            throw new StateError('Package "$package" is in both '
+                'PackageProvider.packages and PackageProvider.staticPackages.');
+          }
+
+          var cascade = new StaticAssetCascade(this, package);
+          _cascades[package] = cascade;
+        }
+      }
+
+      _errors = mergeStreams(_cascades.values.map((cascade) => cascade.errors),
+          broadcast: true);
+      _errors.listen(_accumulatedErrors.add);
+
+      // Make sure a result gets scheduled even if there are no cascades or all
+      // of them are static.
+      if (provider.packages.isEmpty) _tryScheduleResult();
+    });
+  }
+
+  /// Gets the asset node identified by [id].
+  ///
+  /// If [id] is for a generated or transformed asset, this will wait until it
+  /// has been created and return it. This means that the returned asset will
+  /// always be [AssetState.AVAILABLE].
+  ///
+  /// If the asset cannot be found, returns null.
+  Future<AssetNode> getAssetNode(AssetId id) {
+    return _inErrorZone(() {
+      var cascade = _cascades[id.package];
+      if (cascade != null) return cascade.getAssetNode(id);
+      return new Future.value(null);
+    });
+  }
+
+  /// Returns the stream of newly-emitted assets for the given package's
+  /// cascade.
+  ///
+  /// If there's no cascade for [package], returns `null`.
+  Stream<AssetNode> onAssetFor(String package) {
+    var cascade = _cascades[package];
+    return cascade == null ? null : cascade.onAsset;
+  }
+
+  /// Gets all output assets.
+  ///
+  /// If a build is currently in progress, waits until it completes. The
+  /// returned future will complete with an error if the build is not
+  /// successful.
+  ///
+  /// Any transforms using [LazyTransformer]s will be forced to generate
+  /// concrete outputs, and those outputs will be returned.
+  Future<AssetSet> getAllAssets() {
+    for (var cascade in _cascades.values) {
+      _inErrorZone(() => cascade.forceAllTransforms());
+    }
+
+    if (_status != NodeStatus.IDLE) {
+      // A build is still ongoing, so wait for it to complete and try again.
+      return results.first.then((_) => getAllAssets());
+    }
+
+    // If an unexpected error occurred, complete with that.
+    if (_lastUnexpectedError != null) {
+      var error = _lastUnexpectedError;
+      _lastUnexpectedError = null;
+      return new Future.error(error, _lastUnexpectedErrorTrace);
+    }
+
+    // If the last build completed with an error, complete the future with it.
+    if (!_lastResult.succeeded) {
+      return new Future.error(BarbackException.aggregate(_lastResult.errors));
+    }
+
+    // Otherwise, return all of the final output assets.
+    return Future.wait(_cascades.values.map(
+            (cascade) => cascade.availableOutputs))
+          .then((assetSets) {
+      var assets = unionAll(assetSets.map((assetSet) => assetSet.toSet()));
+      return new Future.value(new AssetSet.from(assets));
+    });
+  }
+
+  /// Adds [sources] to the graph's known set of source assets.
+  ///
+  /// Begins applying any transforms that can consume any of the sources. If a
+  /// given source is already known, it is considered modified and all
+  /// transforms that use it will be re-applied.
+  void updateSources(Iterable<AssetId> sources) {
+    groupBy(sources, (id) => id.package).forEach((package, ids) {
+      var cascade = _cascades[package];
+      if (cascade == null) throw new ArgumentError("Unknown package $package.");
+      _inErrorZone(() => cascade.updateSources(ids));
+    });
+
+    // It's possible for adding sources not to cause any processing. The user
+    // still expects there to be a build, though, so we emit one immediately.
+    _tryScheduleResult();
+  }
+
+  /// Removes [removed] from the graph's known set of source assets.
+  void removeSources(Iterable<AssetId> sources) {
+    groupBy(sources, (id) => id.package).forEach((package, ids) {
+      var cascade = _cascades[package];
+      if (cascade == null) throw new ArgumentError("Unknown package $package.");
+      _inErrorZone(() => cascade.removeSources(ids));
+    });
+
+    // It's possible for removing sources not to cause any processing. The user
+    // still expects there to be a build, though, so we emit one immediately.
+    _tryScheduleResult();
+  }
+
+  void updateTransformers(String package, Iterable<Iterable> transformers) {
+    _inErrorZone(() => _cascades[package].updateTransformers(transformers));
+
+    // It's possible for updating transformers not to cause any processing. The
+    // user still expects there to be a build, though, so we emit one
+    // immediately.
+    _tryScheduleResult();
+  }
+
+  /// A handler for a log entry from an [AssetCascade].
+  void _onLog(LogEntry entry) {
+    if (entry.level == LogLevel.ERROR) {
+      // TODO(nweiz): keep track of stack chain.
+      _accumulatedErrors.add(
+          new TransformerException(entry.transform, entry.message, null));
+    }
+
+    if (_logController.hasListener) {
+      _logController.add(entry);
+    } else if (entry.level != LogLevel.FINE) {
+      // No listeners, so just print entry.
+      var buffer = new StringBuffer();
+      buffer.write("[${entry.level} ${entry.transform}] ");
+
+      if (entry.span != null) {
+        buffer.write(entry.span.message(entry.message));
+      } else {
+        buffer.write(entry.message);
+      }
+
+      print(buffer);
+    }
+  }
+
+  /// If [this] is done processing, schedule a [BuildResult] to be emitted on
+  /// [results].
+  ///
+  /// This schedules the result (as opposed to just emitting one directly on
+  /// [BuildResult]) to ensure that calling multiple functions synchronously
+  /// produces only a single [BuildResult].
+  void _tryScheduleResult() {
+    if (_status != NodeStatus.IDLE) return;
+    if (_resultScheduled) return;
+
+    _resultScheduled = true;
+    newFuture(() {
+      _resultScheduled = false;
+      if (_status != NodeStatus.IDLE) return;
+
+      _lastResult = new BuildResult(_accumulatedErrors);
+      _accumulatedErrors.clear();
+      _resultsController.add(_lastResult);
+    });
+  }
+
+  /// Run [body] in an error-handling [Zone] and pipe any unexpected errors to
+  /// the error channel of [results].
+  ///
+  /// [body] can return a value or a [Future] that will be piped to the returned
+  /// [Future]. If it throws a [BarbackException], that exception will be piped
+  /// to the returned [Future] as well. Any other exceptions will be piped to
+  /// [results].
+  Future _inErrorZone(body()) {
+    var completer = new Completer.sync();
+    runZoned(() {
+      syncFuture(body).then(completer.complete).catchError((error, stackTrace) {
+        if (error is! BarbackException) throw error;
+        completer.completeError(error, stackTrace);
+      });
+    }, onError: (error, stackTrace) {
+      _lastUnexpectedError = error;
+      _lastUnexpectedErrorTrace = stackTrace;
+      _resultsController.addError(error, stackTrace);
+    });
+    return completer.future;
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/graph/phase.dart b/mojo/public/dart/third_party/barback/lib/src/graph/phase.dart
new file mode 100644
index 0000000..4bfc5e1
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/graph/phase.dart
@@ -0,0 +1,396 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.graph.phase;
+
+import 'dart:async';
+
+import '../asset/asset_id.dart';
+import '../asset/asset_node.dart';
+import '../asset/asset_node_set.dart';
+import '../errors.dart';
+import '../log.dart';
+import '../transformer/aggregate_transformer.dart';
+import '../transformer/transformer.dart';
+import '../transformer/transformer_group.dart';
+import '../utils.dart';
+import '../utils/multiset.dart';
+import 'asset_cascade.dart';
+import 'group_runner.dart';
+import 'node_status.dart';
+import 'node_streams.dart';
+import 'phase_forwarder.dart';
+import 'phase_output.dart';
+import 'transformer_classifier.dart';
+
+/// One phase in the ordered series of transformations in an [AssetCascade].
+///
+/// Each phase can access outputs from previous phases and can in turn pass
+/// outputs to later phases. Phases are processed strictly serially. All
+/// transforms in a phase will be complete before moving on to the next phase.
+/// Within a single phase, all transforms will be run in parallel.
+///
+/// Building can be interrupted between phases. For example, a source is added
+/// which starts the background process. Sometime during, say, phase 2 (which
+/// is running asynchronously) that source is modified. When the process queue
+/// goes to advance to phase 3, it will see that modification and start the
+/// waterfall from the beginning again.
+class Phase {
+  /// The cascade that owns this phase.
+  final AssetCascade cascade;
+
+  /// A string describing the location of [this] in the transformer graph.
+  final String _location;
+
+  /// The index of [this] in its parent cascade or group.
+  final int _index;
+
+  /// The groups for this phase.
+  final _groups = new Map<TransformerGroup, GroupRunner>();
+
+  /// The inputs for this phase.
+  ///
+  /// For the first phase, these will be the source assets. For all other
+  /// phases, they will be the outputs from the previous phase.
+  final _inputs = new AssetNodeSet();
+
+  /// The transformer classifiers for this phase.
+  ///
+  /// The keys can be either [Transformer]s or [AggregateTransformer]s.
+  final _classifiers = new Map<dynamic, TransformerClassifier>();
+
+  /// The forwarders for this phase.
+  final _forwarders = new Map<AssetId, PhaseForwarder>();
+
+  /// The outputs for this phase.
+  final _outputs = new Map<AssetId, PhaseOutput>();
+
+  /// The set of all [AssetNode.origin] properties of the input assets for this
+  /// phase.
+  ///
+  /// This is used to determine which assets have been passed unmodified through
+  /// [_classifiers] or [_groups]. It's possible that a given asset was consumed
+  /// by a group and not an individual transformer, and so shouldn't be
+  /// forwarded through the phase as a whole.
+  ///
+  /// In order to detect whether an output has been forwarded through a group or
+  /// a classifier, we must be able to distinguish it from other outputs with
+  /// the same id. To do so, we check if its origin is in [_inputOrigins]. If
+  /// so, it's been forwarded unmodified.
+  final _inputOrigins = new Multiset<AssetNode>();
+
+  /// The streams exposed by this phase.
+  final _streams = new NodeStreams();
+  Stream<NodeStatus> get onStatusChange => _streams.onStatusChange;
+  Stream<AssetNode> get onAsset => _streams.onAsset;
+  Stream<LogEntry> get onLog => _streams.onLog;
+
+  /// How far along [this] is in processing its assets.
+  NodeStatus get status {
+    // Before any transformers are added, the phase should be dirty if and only
+    // if any input is dirty.
+    if (_classifiers.isEmpty && _groups.isEmpty && previous == null) {
+      return _inputs.any((input) => input.state.isDirty) ?
+          NodeStatus.RUNNING : NodeStatus.IDLE;
+    }
+
+    var classifierStatus = NodeStatus.dirtiest(
+        _classifiers.values.map((classifier) => classifier.status));
+    var groupStatus = NodeStatus.dirtiest(
+        _groups.values.map((group) => group.status));
+    return (previous == null ? NodeStatus.IDLE : previous.status)
+        .dirtier(classifierStatus)
+        .dirtier(groupStatus);
+  }
+
+  /// The previous phase in the cascade, or null if this is the first phase.
+  final Phase previous;
+
+  /// The subscription to [previous]'s [onStatusChange] stream.
+  StreamSubscription _previousStatusSubscription;
+
+  /// The subscription to [previous]'s [onAsset] stream.
+  StreamSubscription<AssetNode> _previousOnAssetSubscription;
+
+  final _inputSubscriptions = new Set<StreamSubscription>();
+
+  /// A map of asset ids to completers for [getInput] requests.
+  ///
+  /// If an asset node is requested before it's available, we put a completer in
+  /// this map to wait for the asset to be generated. If it's not generated, the
+  /// completer should complete to `null`.
+  final _pendingOutputRequests = new Map<AssetId, Completer<AssetNode>>();
+
+  /// Returns all currently-available output assets for this phase.
+  Set<AssetNode> get availableOutputs {
+    return _outputs.values
+        .map((output) => output.output)
+        .where((node) => node.state.isAvailable)
+        .toSet();
+  }
+
+  // TODO(nweiz): Rather than passing the cascade and the phase everywhere,
+  // create an interface that just exposes [getInput]. Emit errors via
+  // [AssetNode]s.
+  Phase(AssetCascade cascade, String location)
+      : this._(cascade, location, 0);
+
+  Phase._(this.cascade, this._location, this._index, [this.previous]) {
+    if (previous != null) {
+      _previousOnAssetSubscription = previous.onAsset.listen(addInput);
+      _previousStatusSubscription = previous.onStatusChange
+          .listen((_) => _streams.changeStatus(status));
+    }
+
+    onStatusChange.listen((status) {
+      if (status == NodeStatus.RUNNING) return;
+
+      // All the previous phases have finished declaring or producing their
+      // outputs. If anyone's still waiting for outputs, cut off the wait; we
+      // won't be generating them, at least until a source asset changes.
+      for (var completer in _pendingOutputRequests.values) {
+        completer.complete(null);
+      }
+      _pendingOutputRequests.clear();
+    });
+  }
+
+  /// Adds a new asset as an input for this phase.
+  ///
+  /// [node] doesn't have to be [AssetState.AVAILABLE]. Once it is, the phase
+  /// will automatically begin determining which transforms can consume it as a
+  /// primary input. The transforms themselves won't be applied until [process]
+  /// is called, however.
+  ///
+  /// This should only be used for brand-new assets or assets that have been
+  /// removed and re-created. The phase will automatically handle updated assets
+  /// using the [AssetNode.onStateChange] stream.
+  void addInput(AssetNode node) {
+    // Each group is one channel along which an asset may be forwarded, as is
+    // each transformer.
+    var forwarder = new PhaseForwarder(
+        node, _classifiers.length, _groups.length);
+    _forwarders[node.id] = forwarder;
+    forwarder.onAsset.listen(_handleOutputWithoutForwarder);
+    if (forwarder.output != null) {
+      _handleOutputWithoutForwarder(forwarder.output);
+    }
+
+    _inputOrigins.add(node.origin);
+    _inputs.add(node);
+    _inputSubscriptions.add(node.onStateChange.listen((state) {
+      if (state.isRemoved) {
+        _inputOrigins.remove(node.origin);
+        _forwarders.remove(node.id).remove();
+      }
+      _streams.changeStatus(status);
+    }));
+
+    for (var classifier in _classifiers.values) {
+      classifier.addInput(node);
+    }
+  }
+
+  // TODO(nweiz): If the output is available when this is called, it's
+  // theoretically possible for it to become unavailable between the call and
+  // the return. If it does so, it won't trigger the rebuilding process. To
+  // avoid this, we should have this and the methods it calls take explicit
+  // callbacks, as in [AssetNode.whenAvailable].
+  /// Gets the asset node for an output [id].
+  ///
+  /// If [id] is for a generated or transformed asset, this will wait until it
+  /// has been created and return it. This means that the returned asset will
+  /// always be [AssetState.AVAILABLE].
+  /// 
+  /// If the output cannot be found, returns null.
+  Future<AssetNode> getOutput(AssetId id) {
+    return syncFuture(() {
+      if (id.package != cascade.package) return cascade.graph.getAssetNode(id);
+      if (_outputs.containsKey(id)) {
+        var output = _outputs[id].output;
+        // If the requested output is available, we can just return it.
+        if (output.state.isAvailable) return output;
+
+        // If the requested output exists but isn't yet available, wait to see
+        // if it becomes available. If it's removed before becoming available,
+        // try again, since it could be generated again.
+        output.force();
+        return output.whenAvailable((_) {
+          return output;
+        }).catchError((error) {
+          if (error is! AssetNotFoundException) throw error;
+          return getOutput(id);
+        });
+      }
+
+      // If this phase and the previous phases are fully declared or done, the
+      // requested output won't be generated and we can safely return null.
+      if (status != NodeStatus.RUNNING) return null;
+
+      // Otherwise, store a completer for the asset node. If it's generated in
+      // the future, we'll complete this completer.
+      var completer = _pendingOutputRequests.putIfAbsent(id,
+          () => new Completer.sync());
+      return completer.future;
+    });
+  }
+
+  /// Set this phase's transformers to [transformers].
+  void updateTransformers(Iterable transformers) {
+    var newTransformers = transformers
+        .where((op) => op is Transformer || op is AggregateTransformer)
+        .toSet();
+    var oldTransformers = _classifiers.keys.toSet();
+    for (var removed in oldTransformers.difference(newTransformers)) {
+      _classifiers.remove(removed).remove();
+    }
+
+    for (var transformer in newTransformers.difference(oldTransformers)) {
+      var classifier = new TransformerClassifier(
+          this, transformer, "$_location.$_index");
+      _classifiers[transformer] = classifier;
+      classifier.onAsset.listen(_handleOutput);
+      _streams.onLogPool.add(classifier.onLog);
+      classifier.onStatusChange.listen((_) => _streams.changeStatus(status));
+      for (var input in _inputs) {
+        classifier.addInput(input);
+      }
+    }
+
+    var newGroups = transformers.where((op) => op is TransformerGroup)
+        .toSet();
+    var oldGroups = _groups.keys.toSet();
+    for (var removed in oldGroups.difference(newGroups)) {
+      _groups.remove(removed).remove();
+    }
+
+    for (var added in newGroups.difference(oldGroups)) {
+      var runner = new GroupRunner(previous, added, "$_location.$_index");
+      _groups[added] = runner;
+      runner.onAsset.listen(_handleOutput);
+      _streams.onLogPool.add(runner.onLog);
+      runner.onStatusChange.listen((_) => _streams.changeStatus(status));
+    }
+
+    for (var forwarder in _forwarders.values) {
+      forwarder.updateTransformers(_classifiers.length, _groups.length);
+    }
+
+    _streams.changeStatus(status);
+  }
+
+  /// Force all [LazyTransformer]s' transforms in this phase to begin producing
+  /// concrete assets.
+  void forceAllTransforms() {
+    for (var classifier in _classifiers.values) {
+      classifier.forceAllTransforms();
+    }
+
+    for (var group in _groups.values) {
+      group.forceAllTransforms();
+    }
+  }
+
+  /// Add a new phase after this one.
+  ///
+  /// The new phase will have a location annotation describing its place in the
+  /// package graph. By default, this annotation will describe it as being
+  /// directly after [this]. If [location] is passed, though, it's described as
+  /// being the first phase in that location.
+  Phase addPhase([String location]) {
+    var index = 0;
+    if (location == null) {
+      location = _location;
+      index = _index + 1;
+    }
+
+    var next = new Phase._(cascade, location, index, this);
+    for (var output in _outputs.values.toList()) {
+      // Remove [output]'s listeners because now they should get the asset from
+      // [next], rather than this phase. Any transforms consuming [output] will
+      // be re-run and will consume the output from the new final phase.
+      output.removeListeners();
+    }
+    return next;
+  }
+
+  /// Mark this phase as removed.
+  ///
+  /// This will remove all the phase's outputs.
+  void remove() {
+    for (var classifier in _classifiers.values.toList()) {
+      classifier.remove();
+    }
+    for (var group in _groups.values) {
+      group.remove();
+    }
+    _streams.close();
+    for (var subscription in _inputSubscriptions) {
+      subscription.cancel();
+    }
+    if (_previousStatusSubscription != null) {
+      _previousStatusSubscription.cancel();
+    }
+    if (_previousOnAssetSubscription != null) {
+      _previousOnAssetSubscription.cancel();
+    }
+  }
+
+  /// Add [asset] as an output of this phase.
+  void _handleOutput(AssetNode asset) {
+    if (_inputOrigins.contains(asset.origin)) {
+      _forwarders[asset.id].addIntermediateAsset(asset);
+    } else {
+      _handleOutputWithoutForwarder(asset);
+    }
+  }
+
+  /// Add [asset] as an output of this phase without checking if it's a
+  /// forwarded asset.
+  void _handleOutputWithoutForwarder(AssetNode asset) {
+    if (_outputs.containsKey(asset.id)) {
+      _outputs[asset.id].add(asset);
+    } else {
+      _outputs[asset.id] = new PhaseOutput(this, asset, "$_location.$_index");
+      _outputs[asset.id].onAsset.listen(_emit,
+          onDone: () => _outputs.remove(asset.id));
+      _emit(_outputs[asset.id].output);
+    }
+
+    var exception = _outputs[asset.id].collisionException;
+    if (exception != null) cascade.reportError(exception);
+  }
+
+  /// Emit [asset] as an output of this phase.
+  ///
+  /// This should be called after [_handleOutput], so that collisions are
+  /// resolved.
+  void _emit(AssetNode asset) {
+    _streams.onAssetController.add(asset);
+    _providePendingAsset(asset);
+  }
+
+  /// Provide an asset to a pending [getOutput] call.
+  void _providePendingAsset(AssetNode asset) {
+    // If anyone's waiting for this asset, provide it to them.
+    var request = _pendingOutputRequests.remove(asset.id);
+    if (request == null) return;
+
+    if (asset.state.isAvailable) {
+      request.complete(asset);
+      return;
+    }
+
+    // A lazy asset may be emitted while still dirty. If so, we wait until it's
+    // either available or removed before trying again to access it.
+    assert(asset.state.isDirty);
+    asset.force();
+    asset.whenStateChanges().then((state) {
+      if (state.isRemoved) return getOutput(asset.id);
+      return asset;
+    }).then(request.complete).catchError(request.completeError);
+  }
+
+  String toString() => "phase $_location.$_index";
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/graph/phase_forwarder.dart b/mojo/public/dart/third_party/barback/lib/src/graph/phase_forwarder.dart
new file mode 100644
index 0000000..e70aff3
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/graph/phase_forwarder.dart
@@ -0,0 +1,134 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.graph.phase_forwarder;
+
+import 'dart:async';
+
+import '../asset/asset_node.dart';
+import '../asset/asset_node_set.dart';
+
+/// A class that takes care of forwarding assets within a phase.
+///
+/// Each phase contains one or more channels that process its input assets. Each
+/// non-grouped transformer for that phase is a channel, each [TransformerGroup]
+/// in that phase is another, and the source node is the final channel. For each
+/// input asset, each channel individually decides whether to forward that asset
+/// based on whether that channel uses it. If a channel does decide to forward
+/// an asset, we call that forwarded asset an "intermediate forwarded asset" to
+/// distinguish it from the output of a [PhaseForwarder].
+///
+/// All intermediate assets with a given origin are provided to a single
+/// [PhaseForwarder] via [addIntermediateAsset]. This forwarder then determines
+/// whether all channels in the phase produced intermediate assets. If so, that
+/// means the input asset wasn't consumed by any channel, so the
+/// [PhaseForwarder] forwards it again, producing an output which we'll call the
+/// "final forwarded asset".
+///
+/// A final forwarded asset will be available only if all of the intermediate
+/// forwarded assets are themselves available. If any of the intermediate assets
+/// are dirty, the final asset will also be marked dirty.
+class PhaseForwarder {
+  /// The number of channels to forward, counting the source node.
+  int _numChannels;
+
+  /// The intermediate forwarded assets.
+  final _intermediateAssets = new AssetNodeSet();
+
+  /// The final forwarded asset.
+  ///
+  /// This will be null if the asset is not being forwarded.
+  AssetNode get output =>
+      _outputController == null ? null : _outputController.node;
+  AssetNodeController _outputController;
+
+  /// A stream that emits an event whenever [this] starts producing a final
+  /// forwarded asset.
+  ///
+  /// Whenever this stream emits an event, the value will be identical to
+  /// [output].
+  Stream<AssetNode> get onAsset => _onAssetController.stream;
+  final _onAssetController =
+      new StreamController<AssetNode>.broadcast(sync: true);
+
+  /// Creates a phase forwarder forwarding nodes that come from [node] across
+  /// [numTransformers] transformers and [numGroups] groups.
+  ///
+  /// [node] is passed in explicitly so that it can be forwarded if there are no
+  /// other channels.
+  PhaseForwarder(AssetNode node, int numTransformers, int numGroups)
+      : _numChannels = numTransformers + numGroups + 1 {
+    addIntermediateAsset(node);
+  }
+
+  /// Notify the forwarder that the number of transformer and group channels has
+  /// changed.
+  void updateTransformers(int numTransformers, int numGroups) {
+    // Add one channel for the source node.
+    _numChannels = numTransformers + numGroups + 1;
+    _adjustOutput();
+  }
+
+  /// Adds an intermediate forwarded asset to [this].
+  ///
+  /// [asset] must have the same origin as all other intermediate forwarded
+  /// assets.
+  void addIntermediateAsset(AssetNode asset) {
+    if (_intermediateAssets.isNotEmpty) {
+      assert(asset.origin == _intermediateAssets.first.origin);
+    }
+
+    _intermediateAssets.add(asset);
+    asset.onStateChange.listen((_) => _adjustOutput());
+
+    _adjustOutput();
+  }
+
+  /// Mark this forwarder as removed.
+  ///
+  /// This will remove [output] if it exists.
+  void remove() {
+    if (_outputController != null) {
+      _outputController.setRemoved();
+      _outputController = null;
+    }
+    _onAssetController.close();
+  }
+
+  /// Adjusts [output] to ensure that it accurately reflects the current state
+  /// of the intermediate forwarded assets.
+  void _adjustOutput() {
+    assert(_intermediateAssets.length <= _numChannels);
+    assert(!_intermediateAssets.any((asset) => asset.state.isRemoved));
+
+    // If there are any channels that haven't forwarded an intermediate asset,
+    // we shouldn't forward a final asset. If we are currently, remove
+    // it.
+    if (_intermediateAssets.length < _numChannels) {
+      if (_outputController == null) return;
+      _outputController.setRemoved();
+      _outputController = null;
+      return;
+    }
+
+    // If there isn't a final asset being forwarded yet, we should forward one.
+    // It should be dirty iff any of the intermediate assets are dirty.
+    if (_outputController == null) {
+      var finalAsset = _intermediateAssets.firstWhere(
+          (asset) => asset.state.isDirty,
+          orElse: () => _intermediateAssets.first);
+      _outputController = new AssetNodeController.from(finalAsset);
+      _onAssetController.add(output);
+      return;
+    }
+
+    // If we're already forwarding a final asset, set it dirty iff any of the
+    // intermediate assets are dirty.
+    if (_intermediateAssets.any((asset) => asset.state.isDirty)) {
+      if (!_outputController.node.state.isDirty) _outputController.setDirty();
+    } else if (!_outputController.node.state.isAvailable) {
+      _outputController.setAvailable(_intermediateAssets.first.asset);
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/graph/phase_output.dart b/mojo/public/dart/third_party/barback/lib/src/graph/phase_output.dart
new file mode 100644
index 0000000..3d6460b
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/graph/phase_output.dart
@@ -0,0 +1,114 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.graph.phase_output;
+
+import 'dart:async';
+import 'dart:collection';
+
+import '../asset/asset_forwarder.dart';
+import '../asset/asset_node.dart';
+import '../errors.dart';
+import 'phase.dart';
+
+/// A class that handles a single output of a phase.
+///
+/// Normally there's only a single [AssetNode] for a phase's output, but it's
+/// possible that multiple transformers in the same phase emit assets with the
+/// same id, causing collisions. This handles those collisions by forwarding the
+/// chronologically first asset.
+///
+/// When the asset being forwarding changes, the old value of [output] will be
+/// marked as removed and a new value will replace it. Users of this class can
+/// be notified of this using [onAsset].
+class PhaseOutput {
+  /// The phase for which this is an output.
+  final Phase _phase;
+
+  /// A string describing the location of [this] in the transformer graph.
+  final String _location;
+
+  /// The asset node for this output.
+  AssetNode get output => _outputForwarder.node;
+  AssetForwarder _outputForwarder;
+
+  /// A stream that emits an [AssetNode] each time this output starts forwarding
+  /// a new asset.
+  Stream<AssetNode> get onAsset => _onAssetController.stream;
+  final _onAssetController =
+      new StreamController<AssetNode>.broadcast(sync: true);
+
+  /// The assets for this output.
+  ///
+  /// If there's no collision, this will only have one element. Otherwise, it
+  /// will be ordered by which asset was added first.
+  final _assets = new Queue<AssetNode>();
+
+  /// The [AssetCollisionException] for this output, or null if there is no
+  /// collision currently.
+  AssetCollisionException get collisionException {
+    if (_assets.length == 1) return null;
+    return new AssetCollisionException(
+        _assets.where((asset) => asset.transform != null)
+            .map((asset) => asset.transform.info),
+        output.id);
+  }
+
+  PhaseOutput(this._phase, AssetNode output, this._location)
+      : _outputForwarder = new AssetForwarder(output) {
+    assert(!output.state.isRemoved);
+    add(output);
+  }
+
+  /// Adds an asset node as an output with this id.
+  void add(AssetNode node) {
+    assert(node.id == output.id);
+    assert(!output.state.isRemoved);
+    _assets.add(node);
+    _watchAsset(node);
+  }
+
+  /// Removes all existing listeners on [output] without actually closing
+  /// [this].
+  ///
+  /// This marks [output] as removed, but immediately replaces it with a new
+  /// [AssetNode] in the same state as the old output. This is used when adding
+  /// a new [Phase] to cause consumers of the prior phase's outputs to be to
+  /// start consuming the new phase's outputs instead.
+  void removeListeners() {
+    _outputForwarder.close();
+    _outputForwarder = new AssetForwarder(_assets.first);
+    _onAssetController.add(output);
+  }
+
+  /// Watches [node] to adjust [_assets] and [output] when it's removed.
+  void _watchAsset(AssetNode node) {
+    node.whenRemoved(() {
+      if (_assets.length == 1) {
+        assert(_assets.single == node);
+        _outputForwarder.close();
+        _onAssetController.close();
+        return;
+      }
+
+      // If there was more than one asset, we're resolving a collision --
+      // possibly partially.
+      var wasFirst = _assets.first == node;
+      _assets.remove(node);
+
+      // If this was the first asset, we replace it with the next asset
+      // (chronologically).
+      if (wasFirst) removeListeners();
+
+      // If there's still a collision, report it. This lets the user know if
+      // they've successfully resolved the collision or not.
+      if (_assets.length > 1) {
+        // TODO(nweiz): report this through the output asset.
+        _phase.cascade.reportError(collisionException);
+      }
+    });
+  }
+
+  String toString() => "phase output in $_location for $output";
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/graph/static_asset_cascade.dart b/mojo/public/dart/third_party/barback/lib/src/graph/static_asset_cascade.dart
new file mode 100644
index 0000000..7eeda96
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/graph/static_asset_cascade.dart
@@ -0,0 +1,82 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.graph.static_asset_cascade;
+
+import 'dart:async';
+
+import '../asset/asset_id.dart';
+import '../asset/asset_node.dart';
+import '../asset/asset_set.dart';
+import '../errors.dart';
+import '../log.dart';
+import '../package_provider.dart';
+import 'asset_cascade.dart';
+import 'node_status.dart';
+import 'package_graph.dart';
+
+/// An asset cascade for a static package.
+///
+/// A static package is known to have no transformers and no changes to its
+/// assets. This allows this class to lazily and efficiently provide assets to
+/// the rest of the package graph.
+class StaticAssetCascade implements AssetCascade {
+  final String package;
+
+  final PackageGraph graph;
+
+  /// All sources that have been requested from the provider.
+  final _sources = new Map<AssetId, Future<AssetNode>>();
+
+  StaticAssetCascade(this.graph, this.package);
+
+  Stream<BarbackException> get errors => _errorsController.stream;
+  final _errorsController =
+      new StreamController<BarbackException>.broadcast(sync: true);
+
+  final status = NodeStatus.IDLE;
+
+  final onLog = new StreamController<LogEntry>.broadcast().stream;
+  final onStatusChange = new StreamController<LogEntry>.broadcast().stream;
+  final onAsset = new StreamController<AssetNode>.broadcast().stream;
+
+  Future<AssetSet> get availableOutputs {
+    var provider = graph.provider as StaticPackageProvider;
+    return provider.getAllAssetIds(package).asyncMap(provider.getAsset).toList()
+        .then((assets) => new AssetSet.from(assets));
+  }
+
+  Future<AssetNode> getAssetNode(AssetId id) {
+    return _sources.putIfAbsent(id, () {
+      return graph.provider.getAsset(id).then((asset) {
+        return new AssetNodeController.available(asset).node;
+      }).catchError((error, stackTrace) {
+        if (error is! AssetNotFoundException) {
+          reportError(new AssetLoadException(id, error, stackTrace));
+        }
+
+        // TODO(nweiz): propagate error information through asset nodes.
+        return null;
+      });
+    });
+  }
+
+  void updateSources(Iterable<AssetId> sources) =>
+      throw new UnsupportedError("Static package $package can't be explicitly "
+          "provided sources.");
+
+  void removeSources(Iterable<AssetId> sources) =>
+      throw new UnsupportedError("Static package $package can't be explicitly "
+          "provided sources.");
+
+  void updateTransformers(Iterable<Iterable> transformersIterable) =>
+      throw new UnsupportedError("Static package $package can't have "
+          "transformers.");
+
+  void forceAllTransforms() {}
+
+  void reportError(BarbackException error) => _errorsController.add(error);
+
+  String toString() => "static cascade for $package";
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/graph/transform_node.dart b/mojo/public/dart/third_party/barback/lib/src/graph/transform_node.dart
new file mode 100644
index 0000000..61bab3f
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/graph/transform_node.dart
@@ -0,0 +1,886 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.graph.transform_node;
+
+import 'dart:async';
+
+import '../asset/asset.dart';
+import '../asset/asset_id.dart';
+import '../asset/asset_node.dart';
+import '../asset/asset_node_set.dart';
+import '../errors.dart';
+import '../log.dart';
+import '../transformer/aggregate_transform.dart';
+import '../transformer/aggregate_transformer.dart';
+import '../transformer/declaring_aggregate_transform.dart';
+import '../transformer/declaring_aggregate_transformer.dart';
+import '../transformer/lazy_aggregate_transformer.dart';
+import '../utils.dart';
+import 'node_status.dart';
+import 'node_streams.dart';
+import 'phase.dart';
+import 'transformer_classifier.dart';
+
+/// Describes a transform on a set of assets and its relationship to the build
+/// dependency graph.
+///
+/// Keeps track of whether it's dirty and needs to be run and which assets it
+/// depends on.
+class TransformNode {
+  /// The aggregate key for this node.
+  final String key;
+
+  /// The [TransformerClassifier] that [this] belongs to.
+  final TransformerClassifier classifier;
+
+  /// The [Phase] that this transform runs in.
+  Phase get phase => classifier.phase;
+
+  /// The [AggregateTransformer] to apply to this node's inputs.
+  final AggregateTransformer transformer;
+
+  /// The primary asset nodes this transform runs on.
+  final _primaries = new AssetNodeSet();
+
+  /// A string describing the location of [this] in the transformer graph.
+  final String _location;
+
+  /// The subscription to the [_primaries]' [AssetNode.onStateChange] streams.
+  final _primarySubscriptions = new Map<AssetId, StreamSubscription>();
+
+  /// The subscription to [phase]'s [Phase.onAsset] stream.
+  StreamSubscription<AssetNode> _phaseAssetSubscription;
+
+  /// The subscription to [phase]'s [Phase.onStatusChange] stream.
+  StreamSubscription<NodeStatus> _phaseStatusSubscription;
+
+  /// How far along [this] is in processing its assets.
+  NodeStatus get status {
+    if (_state == _State.APPLIED || _state == _State.DECLARED) {
+      return NodeStatus.IDLE;
+    }
+
+    if (_declaring && _state != _State.DECLARING &&
+        _state != _State.NEEDS_DECLARE) {
+      return NodeStatus.MATERIALIZING;
+    } else {
+      return NodeStatus.RUNNING;
+    }
+  }
+
+  /// The [TransformInfo] describing this node.
+  ///
+  /// [TransformInfo] is the publicly-visible representation of a transform
+  /// node.
+  TransformInfo get info => new TransformInfo(transformer,
+      new AssetId(phase.cascade.package, key));
+
+  /// Whether this is a declaring transform.
+  ///
+  /// This is usually identical to `transformer is
+  /// DeclaringAggregateTransformer`, but if a declaring and non-lazy
+  /// transformer emits an error during `declareOutputs` it's treated as though
+  /// it wasn't declaring.
+  bool get _declaring => transformer is DeclaringAggregateTransformer &&
+      (_state == _State.DECLARING || _declaredOutputs != null);
+
+  /// Whether this transform has been forced since it last finished applying.
+  ///
+  /// A transform being forced means it should run until it generates outputs
+  /// and is no longer dirty. This is always true for non-declaring
+  /// transformers, since they always need to eagerly generate outputs.
+  bool _forced;
+
+  /// The subscriptions to each secondary input's [AssetNode.onStateChange]
+  /// stream.
+  final _secondarySubscriptions = new Map<AssetId, StreamSubscription>();
+
+  /// The subscriptions to the [AssetCascade.onAsset] stream for cascades that
+  /// might generate assets in [_missingInputs].
+  final _missingExternalInputSubscriptions =
+      new Map<String, StreamSubscription>();
+
+  /// The controllers for the asset nodes emitted by this node.
+  final _outputControllers = new Map<AssetId, AssetNodeController>();
+
+  /// The ids of inputs the transformer tried and failed to read last time it
+  /// ran.
+  final _missingInputs = new Set<AssetId>();
+
+  /// The controllers that are used to pass each primary input through [this] if
+  /// it's not consumed or overwritten.
+  ///
+  /// This needs an intervening controller to ensure that the output can be
+  /// marked dirty when determining whether [this] will consume or overwrite it,
+  /// and be marked removed if it does. No pass-through controller will exist
+  /// for primary inputs that are not being passed through.
+  final _passThroughControllers = new Map<AssetId, AssetNodeController>();
+
+  /// The asset node for this transform.
+  final _streams = new NodeStreams();
+  Stream<NodeStatus> get onStatusChange => _streams.onStatusChange;
+  Stream<AssetNode> get onAsset => _streams.onAsset;
+  Stream<LogEntry> get onLog => _streams.onLog;
+
+  /// The current state of [this].
+  var _state = _State.DECLARED;
+
+  /// Whether [this] has been marked as removed.
+  bool get _isRemoved => _streams.onAssetController.isClosed;
+
+  // If [transformer] is declaring but not lazy and [primary] is available, we
+  // can run [apply] even if [force] hasn't been called, since [transformer]
+  // should run eagerly if possible.
+  bool get _canRunDeclaringEagerly =>
+      _declaring && transformer is! LazyAggregateTransformer &&
+      _primaries.every((input) => input.state.isAvailable);
+
+  /// Which primary inputs the most recent run of this transform has declared
+  /// that it consumes.
+  ///
+  /// This starts out `null`, indicating that the transform hasn't declared
+  /// anything yet. This is not meaningful unless [_state] is [_State.APPLIED]
+  /// or [_State.DECLARED].
+  Set<AssetId> _consumedPrimaries;
+
+  /// The set of output ids that [transformer] declared it would emit.
+  ///
+  /// This is only non-null if [transformer] is a
+  /// [DeclaringAggregateTransformer] and its [declareOutputs] has been run
+  /// successfully.
+  Set<AssetId> _declaredOutputs;
+
+  /// The controller for the currently-running
+  /// [DeclaringAggregateTransformer.declareOutputs] call's
+  /// [DeclaringAggregateTransform].
+  ///
+  /// This will be non-`null` when
+  /// [DeclaringAggregateTransformer.declareOutputs] is running. This means that
+  /// it's always non-`null` when [_state] is [_State.DECLARING], sometimes
+  /// non-`null` when it's [_State.NEEDS_DECLARE], and always `null` otherwise.
+  DeclaringAggregateTransformController _declareController;
+
+  /// The controller for the currently-running [AggregateTransformer.apply]
+  /// call's [AggregateTransform].
+  ///
+  /// This will be non-`null` when [AggregateTransform.apply] is running, which
+  /// means that it's always non-`null` when [_state] is [_State.APPLYING] or
+  /// [_State.NEEDS_APPLY], sometimes non-`null` when it's
+  /// [_State.NEEDS_DECLARE], and always `null` otherwise.
+  AggregateTransformController _applyController;
+
+  /// The number of secondary inputs that have been requested but not yet
+  /// produced.
+  int _pendingSecondaryInputs = 0;
+
+  /// A stopwatch that tracks the total time spent in a transformer's `apply`
+  /// function.
+  final _timeInTransformer = new Stopwatch();
+
+  /// A stopwatch that tracks the time in a transformer's `apply` function spent
+  /// waiting for [getInput] calls to complete.
+  final _timeAwaitingInputs = new Stopwatch();
+
+  TransformNode(this.classifier, this.transformer, this.key, this._location) {
+    _forced = transformer is! DeclaringAggregateTransformer;
+
+    _phaseAssetSubscription = phase.previous.onAsset.listen((node) {
+      if (!_missingInputs.contains(node.id)) return;
+      if (_forced) node.force();
+      _dirty();
+    });
+
+    _phaseStatusSubscription = phase.previous.onStatusChange.listen((status) {
+      if (status == NodeStatus.RUNNING) return;
+
+      _maybeFinishDeclareController();
+      _maybeFinishApplyController();
+    });
+
+    classifier.onDoneClassifying.listen((_) {
+      _maybeFinishDeclareController();
+      _maybeFinishApplyController();
+    });
+
+    _run();
+  }
+
+  /// Adds [input] as a primary input for this node.
+  void addPrimary(AssetNode input) {
+    _primaries.add(input);
+    if (_forced) input.force();
+
+    _primarySubscriptions[input.id] = input.onStateChange
+        .listen((_) => _onPrimaryStateChange(input));
+
+    if (_state == _State.DECLARING && !_declareController.isDone) {
+      // If we're running `declareOutputs` and its id stream isn't closed yet,
+      // pass this in as another id.
+      _declareController.addId(input.id);
+      _maybeFinishDeclareController();
+    } else if (_state == _State.APPLYING) {
+      // If we're running `apply`, we need to wait until [input] is available
+      // before we pass it into the stream. If it's available now, great; if
+      // not, [_onPrimaryStateChange] will handle it.
+      if (!input.state.isAvailable) {
+        // If we started running eagerly without being forced, abort that run if
+        // a new unavailable asset comes in.
+        if (input.isLazy && !_forced) _restartRun();
+        return;
+      }
+
+      _onPrimaryStateChange(input);
+      _maybeFinishApplyController();
+    } else {
+      // Otherwise, a new input means we'll need to re-run `declareOutputs`.
+      _restartRun();
+    }
+  }
+
+  /// Marks this transform as removed.
+  ///
+  /// This causes all of the transform's outputs to be marked as removed as
+  /// well. Normally this will be automatically done internally based on events
+  /// from the primary input, but it's possible for a transform to no longer be
+  /// valid even if its primary input still exists.
+  void remove() {
+    _streams.close();
+    _phaseAssetSubscription.cancel();
+    _phaseStatusSubscription.cancel();
+    if (_declareController != null) _declareController.cancel();
+    if (_applyController != null) _applyController.cancel();
+    _clearSecondarySubscriptions();
+    _clearOutputs();
+
+    for (var subscription in _primarySubscriptions.values) {
+      subscription.cancel();
+    }
+    _primarySubscriptions.clear();
+
+    for (var controller in _passThroughControllers.values) {
+      controller.setRemoved();
+    }
+    _passThroughControllers.clear();
+  }
+
+  /// If [this] is deferred, ensures that its concrete outputs will be
+  /// generated.
+  void force() {
+    if (_forced || _state == _State.APPLIED) return;
+    for (var input in _primaries) {
+      input.force();
+    }
+
+    _forced = true;
+    if (_state == _State.DECLARED) _apply();
+  }
+
+  /// Marks this transform as dirty.
+  ///
+  /// Specifically, this should be called when one of the transform's inputs'
+  /// contents change, or when a secondary input is removed. Primary inputs
+  /// being added or removed are handled by [addInput] and
+  /// [_onPrimaryStateChange].
+  void _dirty() {
+    if (_state == _State.DECLARING || _state == _State.NEEDS_DECLARE ||
+        _state == _State.NEEDS_APPLY) {
+      // If we already know that [_apply] needs to be run, there's nothing to do
+      // here.
+      return;
+    }
+
+    if (!_forced && !_canRunDeclaringEagerly) {
+      // [forced] should only ever be false for a declaring transformer.
+      assert(_declaring);
+
+      // If we've finished applying, transition to DECLARED, indicating that we
+      // know what outputs [apply] will emit but we're waiting to emit them
+      // concretely until [force] is called. If we're still applying, we'll
+      // transition to DECLARED once we finish.
+      if (_state == _State.APPLIED) _state = _State.DECLARED;
+      for (var controller in _outputControllers.values) {
+        controller.setLazy(force);
+      }
+      _emitDeclaredOutputs();
+      return;
+    }
+
+    if (_state == _State.APPLIED) {
+      if (_declaredOutputs != null) _emitDeclaredOutputs();
+      _apply();
+    } else if (_state == _State.DECLARED) {
+      _apply();
+    } else {
+      _state = _State.NEEDS_APPLY;
+    }
+  }
+
+  /// The callback called when [input]'s state changes.
+  void _onPrimaryStateChange(AssetNode input) {
+    if (input.state.isRemoved) {
+      _primarySubscriptions.remove(input.id);
+
+      if (_primaries.isEmpty) {
+        // If there are no more primary inputs, there's no more use for this
+        // node in the graph. It will be re-created by its
+        // [TransformerClassifier] if a new input with [key] is added.
+        remove();
+        return;
+      }
+
+      // Any change to the number of primary inputs requires that we re-run the
+      // transformation.
+      _restartRun();
+    } else if (input.state.isAvailable) {
+      if (_state == _State.DECLARED) {
+        // If we're passing through this input and its contents don't matter,
+        // update the pass-through controller.
+        var controller = _passThroughControllers[input.id];
+        if (controller != null) controller.setAvailable(input.asset);
+      }
+
+      if (_state == _State.DECLARED && _canRunDeclaringEagerly) {
+        // If [this] is fully declared but hasn't started applying, this input
+        // becoming available may mean that all inputs are available, in which
+        // case we can run apply eagerly.
+        _apply();
+        return;
+      }
+
+      // If we're not actively passing concrete assets to the transformer, the
+      // distinction between a dirty asset and an available one isn't relevant.
+      if (_state != _State.APPLYING) return;
+
+      if (_applyController.isDone) {
+        // If we get a new asset after we've closed the asset stream, we need to
+        // re-run declare and then apply.
+        _restartRun();
+      } else {
+        // If the new asset comes before the asset stream is done, we can just
+        // pass it to the stream.
+        _applyController.addInput(input.asset);
+        _maybeFinishApplyController();
+      }
+    } else {
+      if (_forced) input.force();
+
+      var controller = _passThroughControllers[input.id];
+      if (controller != null) controller.setDirty();
+
+      if (_state == _State.APPLYING && !_applyController.addedId(input.id) &&
+          (_forced || !input.isLazy)) {
+        // If the input hasn't yet been added to the transform's input stream,
+        // there's no need to consider the transformation dirty. However, if the
+        // input is lazy and we're running eagerly, we need to restart the
+        // transformation.
+        return;
+      }
+      _dirty();
+    }
+  }
+
+  /// Run the entire transformation, including both `declareOutputs` (if
+  /// applicable) and `apply`.
+  void _run() {
+    assert(_state != _State.DECLARING);
+    assert(_state != _State.APPLYING);
+
+    _markOutputsDirty();
+    _declareOutputs(() {
+      if (_forced || _canRunDeclaringEagerly) {
+        _apply();
+      } else {
+        _state = _State.DECLARED;
+        _streams.changeStatus(NodeStatus.IDLE);
+      }
+    });
+  }
+
+  /// Restart the entire transformation, including `declareOutputs` if
+  /// applicable.
+  void _restartRun() {
+    if (_state == _State.DECLARED || _state == _State.APPLIED) {
+      // If we're currently idle, we can restart the transformation immediately.
+      _run();
+      return;
+    }
+
+    // If we're actively running `declareOutputs` or `apply`, cancel the
+    // transforms and transition to `NEEDS_DECLARE`. Once the transformer's
+    // method returns, we'll transition to `DECLARING`.
+    if (_declareController != null) _declareController.cancel();
+    if (_applyController != null) _applyController.cancel();
+    _state = _State.NEEDS_DECLARE;
+  }
+
+  /// Runs [transform.declareOutputs] and emits the resulting assets as dirty
+  /// assets.
+  ///
+  /// Calls [callback] when it's finished. This doesn't return a future so that
+  /// [callback] is called synchronously if there are no outputs to declare. If
+  /// [this] is removed while inputs are being declared, [callback] will not be
+  /// called.
+  void _declareOutputs(void callback()) {
+    if (transformer is! DeclaringAggregateTransformer) {
+      callback();
+      return;
+    }
+
+    _state = _State.DECLARING;
+    var controller = new DeclaringAggregateTransformController(this);
+    _declareController = controller;
+    _streams.onLogPool.add(controller.onLog);
+    for (var primary in _primaries) {
+      controller.addId(primary.id);
+    }
+    _maybeFinishDeclareController();
+
+    syncFuture(() {
+      return (transformer as DeclaringAggregateTransformer)
+          .declareOutputs(controller.transform);
+    }).whenComplete(() {
+      // Cancel the controller here even if `declareOutputs` wasn't interrupted.
+      // Since the declaration is finished, we want to close out the
+      // controller's streams.
+      controller.cancel();
+      _declareController = null;
+    }).then((_) {
+      if (_isRemoved) return;
+      if (_state == _State.NEEDS_DECLARE) {
+        _declareOutputs(callback);
+        return;
+      }
+
+      if (controller.loggedError) {
+        // If `declareOutputs` fails, fall back to treating a declaring
+        // transformer as though it were eager.
+        if (transformer is! LazyAggregateTransformer) _forced = true;
+        callback();
+        return;
+      }
+
+      _consumedPrimaries = controller.consumedPrimaries;
+      _declaredOutputs = controller.outputIds;
+      var invalidIds = _declaredOutputs
+          .where((id) => id.package != phase.cascade.package).toSet();
+      for (var id in invalidIds) {
+        _declaredOutputs.remove(id);
+        // TODO(nweiz): report this as a warning rather than a failing error.
+        phase.cascade.reportError(new InvalidOutputException(info, id));
+      }
+
+      for (var primary in _primaries) {
+        if (_declaredOutputs.contains(primary.id)) continue;
+        _passThrough(primary.id);
+      }
+      _emitDeclaredOutputs();
+      callback();
+    }).catchError((error, stackTrace) {
+      if (_isRemoved) return;
+      if (transformer is! LazyAggregateTransformer) _forced = true;
+      phase.cascade.reportError(_wrapException(error, stackTrace));
+      callback();
+    });
+  }
+
+  /// Emits a dirty asset node for all outputs that were declared by the
+  /// transformer.
+  ///
+  /// This won't emit any outputs for which there already exist output
+  /// controllers. It should only be called for transforms that have declared
+  /// their outputs.
+  void _emitDeclaredOutputs() {
+    assert(_declaredOutputs != null);
+    for (var id in _declaredOutputs) {
+      if (_outputControllers.containsKey(id)) continue;
+      var controller = _forced
+          ? new AssetNodeController(id, this)
+          : new AssetNodeController.lazy(id, force, this);
+      _outputControllers[id] = controller;
+      _streams.onAssetController.add(controller.node);
+    }
+  }
+
+  //// Mark all emitted and passed-through outputs of this transform as dirty.
+  void _markOutputsDirty() {
+    for (var controller in _passThroughControllers.values) {
+      controller.setDirty();
+    }
+    for (var controller in _outputControllers.values) {
+      if (_forced) {
+        controller.setDirty();
+      } else {
+        controller.setLazy(force);
+      }
+    }
+  }
+
+  /// Applies this transform.
+  void _apply() {
+    assert(!_isRemoved);
+
+    _markOutputsDirty();
+    _clearSecondarySubscriptions();
+    _state = _State.APPLYING;
+    _streams.changeStatus(status);
+    _runApply().then((hadError) {
+      if (_isRemoved) return;
+
+      if (_state == _State.DECLARED) return;
+
+      if (_state == _State.NEEDS_DECLARE) {
+        _run();
+        return;
+      }
+
+      // If an input's contents changed while running `apply`, retry unless the
+      // transformer is deferred and hasn't been forced.
+      if (_state == _State.NEEDS_APPLY) {
+        if (_forced || _canRunDeclaringEagerly) {
+          _apply();
+        } else {
+          _state = _State.DECLARED;
+        }
+        return;
+      }
+
+      if (_declaring) _forced = false;
+
+      assert(_state == _State.APPLYING);
+      if (hadError) {
+        _clearOutputs();
+        // If the transformer threw an error, we don't want to emit the
+        // pass-through assets in case they'll be overwritten by the
+        // transformer. However, if the transformer declared that it wouldn't
+        // overwrite or consume a pass-through asset, we can safely emit it.
+        if (_declaredOutputs != null) {
+          for (var input in _primaries) {
+            if (_consumedPrimaries.contains(input.id) ||
+                _declaredOutputs.contains(input.id)) {
+              _consumePrimary(input.id);
+            } else {
+              _passThrough(input.id);
+            }
+          }
+        }
+      }
+
+      _state = _State.APPLIED;
+      _streams.changeStatus(NodeStatus.IDLE);
+    });
+  }
+
+  /// Gets the asset for an input [id].
+  ///
+  /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
+  Future<Asset> getInput(AssetId id) {
+    _timeAwaitingInputs.start();
+    _pendingSecondaryInputs++;
+    return phase.previous.getOutput(id).then((node) {
+      // Throw if the input isn't found. This ensures the transformer's apply
+      // is exited. We'll then catch this and report it through the proper
+      // results stream.
+      if (node == null) {
+        _missingInputs.add(id);
+
+        // If this id is for an asset in another package, subscribe to that
+        // package's asset cascade so when it starts emitting the id we know to
+        // re-run the transformer.
+        if (id.package != phase.cascade.package) {
+          var stream = phase.cascade.graph.onAssetFor(id.package);
+          if (stream != null) {
+            _missingExternalInputSubscriptions.putIfAbsent(id.package, () {
+              return stream.listen((node) {
+                if (!_missingInputs.contains(node.id)) return;
+                if (_forced) node.force();
+                _dirty();
+              });
+            });
+          }
+        }
+
+        throw new AssetNotFoundException(id);
+      }
+
+      _secondarySubscriptions.putIfAbsent(node.id, () {
+        return node.onStateChange.listen((_) => _dirty());
+      });
+
+      return node.asset;
+    }).whenComplete(() {
+      _pendingSecondaryInputs--;
+      if (_pendingSecondaryInputs != 0) _timeAwaitingInputs.stop();
+    });
+  }
+
+  /// Run [AggregateTransformer.apply].
+  ///
+  /// Returns whether or not an error occurred while running the transformer.
+  Future<bool> _runApply() {
+    var controller = new AggregateTransformController(this);
+    _applyController = controller;
+    _streams.onLogPool.add(controller.onLog);
+    for (var primary in _primaries) {
+      if (!primary.state.isAvailable) continue;
+      controller.addInput(primary.asset);
+    }
+    _maybeFinishApplyController();
+
+    return syncFuture(() {
+      _timeInTransformer.reset();
+      _timeAwaitingInputs.reset();
+      _timeInTransformer.start();
+      return transformer.apply(controller.transform);
+    }).whenComplete(() {
+      _timeInTransformer.stop();
+      _timeAwaitingInputs.stop();
+
+      // Cancel the controller here even if `apply` wasn't interrupted. Since
+      // the apply is finished, we want to close out the controller's streams.
+      controller.cancel();
+      _applyController = null;
+    }).then((_) {
+      assert(_state != _State.DECLARED);
+      assert(_state != _State.DECLARING);
+      assert(_state != _State.APPLIED);
+
+      if (!_forced && _primaries.any((node) => !node.state.isAvailable)) {
+        _state = _State.DECLARED;
+        _streams.changeStatus(NodeStatus.IDLE);
+        return false;
+      }
+
+      if (_isRemoved) return false;
+      if (_state == _State.NEEDS_APPLY) return false;
+      if (_state == _State.NEEDS_DECLARE) return false;
+      if (controller.loggedError) return true;
+
+      // If the transformer took long enough, log its duration in fine output.
+      // That way it's not always visible, but users running with "pub serve
+      // --verbose" can see it.
+      var ranLong = _timeInTransformer.elapsed > new Duration(seconds: 1);
+      var ranLongLocally =
+          _timeInTransformer.elapsed - _timeAwaitingInputs.elapsed >
+            new Duration(milliseconds: 200);
+
+      // Report the transformer's timing information if it spent more than 0.2s
+      // doing things other than waiting for its secondary inputs or if it spent
+      // more than 1s in total.
+      if (ranLongLocally || ranLong) {
+        _streams.onLogController.add(new LogEntry(
+            info, info.primaryId, LogLevel.FINE,
+            "Took ${niceDuration(_timeInTransformer.elapsed)} "
+              "(${niceDuration(_timeAwaitingInputs.elapsed)} awaiting "
+              "secondary inputs).",
+            null));
+      }
+
+      _handleApplyResults(controller);
+      return false;
+    }).catchError((error, stackTrace) {
+      // If the transform became dirty while processing, ignore any errors from
+      // it.
+      if (_state == _State.NEEDS_APPLY || _isRemoved) return false;
+
+      // Catch all transformer errors and pipe them to the results stream. This
+      // is so a broken transformer doesn't take down the whole graph.
+      phase.cascade.reportError(_wrapException(error, stackTrace));
+      return true;
+    });
+  }
+
+  /// Handle the results of running [Transformer.apply].
+  ///
+  /// [controller] should be the controller for the [AggegateTransform] passed
+  /// to [AggregateTransformer.apply].
+  void _handleApplyResults(AggregateTransformController controller) {
+    _consumedPrimaries = controller.consumedPrimaries;
+
+    var newOutputs = controller.outputs;
+    // Any ids that are for a different package are invalid.
+    var invalidIds = newOutputs
+        .map((asset) => asset.id)
+        .where((id) => id.package != phase.cascade.package)
+        .toSet();
+    for (var id in invalidIds) {
+      newOutputs.removeId(id);
+      // TODO(nweiz): report this as a warning rather than a failing error.
+      phase.cascade.reportError(new InvalidOutputException(info, id));
+    }
+
+    // Remove outputs that used to exist but don't anymore.
+    for (var id in _outputControllers.keys.toList()) {
+      if (newOutputs.containsId(id)) continue;
+      _outputControllers.remove(id).setRemoved();
+    }
+
+    // Emit or stop emitting pass-through assets between removing and adding
+    // outputs to ensure there are no collisions.
+    for (var id in _primaries.map((node) => node.id)) {
+      if (_consumedPrimaries.contains(id) || newOutputs.containsId(id)) {
+        _consumePrimary(id);
+      } else {
+        _passThrough(id);
+      }
+    }
+
+    // Store any new outputs or new contents for existing outputs.
+    for (var asset in newOutputs) {
+      var controller = _outputControllers[asset.id];
+      if (controller != null) {
+        controller.setAvailable(asset);
+      } else {
+        var controller = new AssetNodeController.available(asset, this);
+        _outputControllers[asset.id] = controller;
+        _streams.onAssetController.add(controller.node);
+      }
+    }
+  }
+
+  /// Cancels all subscriptions to secondary input nodes and other cascades.
+  void _clearSecondarySubscriptions() {
+    _missingInputs.clear();
+    for (var subscription in _secondarySubscriptions.values) {
+      subscription.cancel();
+    }
+    for (var subscription in _missingExternalInputSubscriptions.values) {
+      subscription.cancel();
+    }
+    _secondarySubscriptions.clear();
+    _missingExternalInputSubscriptions.clear();
+  }
+
+  /// Removes all output assets.
+  void _clearOutputs() {
+    // Remove all the previously-emitted assets.
+    for (var controller in _outputControllers.values) {
+      controller.setRemoved();
+    }
+    _outputControllers.clear();
+  }
+
+  /// Emit the pass-through node for the primary input [id] if it's not being
+  /// emitted already.
+  void _passThrough(AssetId id) {
+    assert(!_outputControllers.containsKey(id));
+
+    if (_consumedPrimaries.contains(id)) return;
+    var controller = _passThroughControllers[id];
+    var primary = _primaries[id];
+    if (controller == null) {
+      controller = new AssetNodeController.from(primary);
+      _passThroughControllers[id] = controller;
+      _streams.onAssetController.add(controller.node);
+    } else if (primary.state.isDirty) {
+      controller.setDirty();
+    } else if (!controller.node.state.isAvailable) {
+      controller.setAvailable(primary.asset);
+    }
+  }
+
+  /// Stops emitting the pass-through node for the primary input [id] if it's
+  /// being emitted.
+  void _consumePrimary(AssetId id) {
+    var controller = _passThroughControllers.remove(id);
+    if (controller == null) return;
+    controller.setRemoved();
+  }
+
+  /// If `declareOutputs` is running and all previous phases have declared their
+  /// outputs, mark [_declareController] as done.
+  void _maybeFinishDeclareController() {
+    if (_declareController == null) return;
+    if (classifier.isClassifying) return;
+    if (phase.previous.status == NodeStatus.RUNNING) return;
+    _declareController.done();
+  }
+
+  /// If `apply` is running, all previous phases have declared their outputs,
+  /// and all primary inputs are available and thus have been passed to the
+  /// transformer, mark [_applyController] as done.
+  void _maybeFinishApplyController() {
+    if (_applyController == null) return;
+    if (classifier.isClassifying) return;
+    if (_primaries.any((input) => !input.state.isAvailable)) return;
+    if (phase.previous.status == NodeStatus.RUNNING) return;
+    _applyController.done();
+  }
+
+  BarbackException _wrapException(error, StackTrace stackTrace) {
+    if (error is! AssetNotFoundException) {
+      return new TransformerException(info, error, stackTrace);
+    } else {
+      return new MissingInputException(info, error.id);
+    }
+  }
+
+  String toString() =>
+      "transform node in $_location for $transformer on ${info.primaryId} "
+      "($_state, $status, ${_forced ? '' : 'un'}forced)";
+}
+
+/// The enum of states that [TransformNode] can be in.
+class _State {
+  /// The transform is running [DeclaringAggregateTransformer.declareOutputs].
+  ///
+  /// If the set of primary inputs changes while in this state, it will
+  /// transition to [NEEDS_DECLARE]. If the [TransformNode] is still in this
+  /// state when `declareOutputs` finishes running, it will transition to
+  /// [APPLYING] if the transform is non-lazy and all of its primary inputs are
+  /// available, and [DECLARED] otherwise.
+  ///
+  /// Non-declaring transformers will transition out of this state and into
+  /// [APPLYING] immediately.
+  static const DECLARING = const _State._("declaring outputs");
+
+  /// The transform is running [AggregateTransformer.declareOutputs] or
+  /// [AggregateTransform.apply], but a primary input was added or removed after
+  /// it started, so it will need to re-run `declareOutputs`.
+  ///
+  /// The [TransformNode] will transition to [DECLARING] once `declareOutputs`
+  /// or `apply` finishes running.
+  static const NEEDS_DECLARE = const _State._("needs declare");
+
+  /// The transform is deferred and has run
+  /// [DeclaringAggregateTransformer.declareOutputs] but hasn't yet been forced.
+  ///
+  /// The [TransformNode] will transition to [APPLYING] when one of the outputs
+  /// has been forced or if the transformer is non-lazy and all of its primary
+  /// inputs become available.
+  static const DECLARED = const _State._("declared");
+
+  /// The transform is running [AggregateTransformer.apply].
+  ///
+  /// If an input's contents change or a secondary input is added or removed
+  /// while in this state, the [TransformNode] will transition to [NEEDS_APPLY].
+  /// If a primary input is added or removed, it will transition to
+  /// [NEEDS_DECLARE]. If it's still in this state when `apply` finishes
+  /// running, it will transition to [APPLIED].
+  static const APPLYING = const _State._("applying");
+
+  /// The transform is running [AggregateTransformer.apply], but an input's
+  /// contents changed or a secondary input was added or removed after it
+  /// started, so it will need to re-run `apply`.
+  ///
+  /// If a primary input is added or removed while in this state, the
+  /// [TranformNode] will transition to [NEEDS_DECLARE]. If it's still in this
+  /// state when `apply` finishes running, it will transition to [APPLYING].
+  static const NEEDS_APPLY = const _State._("needs apply");
+
+  /// The transform has finished running [AggregateTransformer.apply], whether
+  /// or not it emitted an error.
+  ///
+  /// If an input's contents change or a secondary input is added or removed,
+  /// the [TransformNode] will transition to [DECLARED] if the transform is
+  /// declaring and [APPLYING] otherwise. If a primary input is added or
+  /// removed, this will transition to [DECLARING].
+  static const APPLIED = const _State._("applied");
+
+  final String name;
+
+  const _State._(this.name);
+
+  String toString() => name;
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/graph/transformer_classifier.dart b/mojo/public/dart/third_party/barback/lib/src/graph/transformer_classifier.dart
new file mode 100644
index 0000000..a095e8d
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/graph/transformer_classifier.dart
@@ -0,0 +1,147 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.graph.transformer_classifier;
+
+import 'dart:async';
+
+import '../asset/asset_forwarder.dart';
+import '../asset/asset_node.dart';
+import '../errors.dart';
+import '../log.dart';
+import '../transformer/aggregate_transformer.dart';
+import '../transformer/wrapping_aggregate_transformer.dart';
+import '../utils.dart';
+import 'node_status.dart';
+import 'node_streams.dart';
+import 'phase.dart';
+import 'transform_node.dart';
+
+/// A class for classifying the primary inputs for a transformer according to
+/// its [AggregateTransformer.classifyPrimary] method.
+///
+/// This is also used for non-aggregate transformers; they're modeled as
+/// aggregate transformers that return the primary path if `isPrimary` is true
+/// and `null` if `isPrimary` is `null`.
+class TransformerClassifier {
+  /// The containing [Phase].
+  final Phase phase;
+
+  /// The [AggregateTransformer] used to classify the inputs.
+  final AggregateTransformer transformer;
+
+  /// A string describing the location of [this] in the transformer graph.
+  final String _location;
+
+  /// The individual transforms for each classiciation key.
+  final _transforms = new Map<Object, TransformNode>();
+
+  /// Forwarders used to pass through assets that aren't used by [transformer].
+  final _passThroughForwarders = new Set<AssetForwarder>();
+
+  /// The streams exposed by this classifier.
+  final _streams = new NodeStreams();
+  Stream get onStatusChange => _streams.onStatusChange;
+  Stream<AssetNode> get onAsset => _streams.onAsset;
+  Stream<LogEntry> get onLog => _streams.onLog;
+
+  /// A broadcast stream that emits an event whenever [this] has finished
+  /// classifying all available inputs.
+  Stream get onDoneClassifying => _onDoneClassifyingController.stream;
+  final _onDoneClassifyingController =
+      new StreamController.broadcast(sync: true);
+
+  /// The number of currently-active calls to [transformer.classifyPrimary].
+  ///
+  /// This is used to determine whether [this] is dirty.
+  var _activeClassifications = 0;
+
+  /// Whether this is currently classifying any inputs.
+  bool get isClassifying => _activeClassifications > 0;
+
+  /// How far along [this] is in processing its assets.
+  NodeStatus get status {
+    if (isClassifying) return NodeStatus.RUNNING;
+    return NodeStatus.dirtiest(
+        _transforms.values.map((transform) => transform.status));
+  }
+
+  TransformerClassifier(this.phase, transformer, this._location)
+      : transformer = transformer is AggregateTransformer ?
+            transformer : new WrappingAggregateTransformer(transformer);
+
+  /// Adds a new asset as an input for this transformer.
+  void addInput(AssetNode input) {
+    _activeClassifications++;
+    syncFuture(() => transformer.classifyPrimary(input.id)).catchError(
+        (error, stackTrace) {
+      if (input.state.isRemoved) return null;
+
+      // Catch all transformer errors and pipe them to the results stream. This
+      // is so a broken transformer doesn't take down the whole graph.
+      var info = new TransformInfo(transformer, input.id);
+      if (error is! AssetNotFoundException) {
+        error = new TransformerException(info, error, stackTrace);
+      } else {
+        error = new MissingInputException(info, error.id);
+      }
+      phase.cascade.reportError(error);
+
+      return null;
+    }).then((key) {
+      if (input.state.isRemoved) return;
+      if (key == null) {
+        var forwarder = new AssetForwarder(input);
+        _passThroughForwarders.add(forwarder);
+        forwarder.node.whenRemoved(
+            () => _passThroughForwarders.remove(forwarder));
+        _streams.onAssetController.add(forwarder.node);
+      } else if (_transforms.containsKey(key)) {
+        _transforms[key].addPrimary(input);
+      } else {
+        var transform = new TransformNode(this, transformer, key, _location);
+        _transforms[key] = transform;
+
+        transform.onStatusChange.listen(
+            (_) => _streams.changeStatus(status),
+            onDone: () {
+          _transforms.remove(transform.key);
+          if (!_streams.isClosed) _streams.changeStatus(status);
+        });
+
+        _streams.onAssetPool.add(transform.onAsset);
+        _streams.onLogPool.add(transform.onLog);
+        transform.addPrimary(input);
+      }
+    }).whenComplete(() {
+      _activeClassifications--;
+      if (_streams.isClosed) return;
+      if (!isClassifying) _onDoneClassifyingController.add(null);
+      _streams.changeStatus(status);
+    });
+  }
+
+  /// Removes this transformer.
+  ///
+  /// This marks all outputs of the transformer as removed.
+  void remove() {
+    _streams.close();
+    _onDoneClassifyingController.close();
+    for (var transform in _transforms.values.toList()) {
+      transform.remove();
+    }
+    for (var forwarder in _passThroughForwarders.toList()) {
+      forwarder.close();
+    }
+  }
+
+  /// Force all deferred transforms to begin producing concrete assets.
+  void forceAllTransforms() {
+    for (var transform in _transforms.values) {
+      transform.force();
+    }
+  }
+
+  String toString() => "classifier in $_location for $transformer";
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/internal_asset.dart b/mojo/public/dart/third_party/barback/lib/src/internal_asset.dart
new file mode 100644
index 0000000..ab73901
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/internal_asset.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// This library exists so that pub can retain backwards-compatibility with
+/// versions of barback prior to 0.13.1.
+///
+/// In 0.13.1, `lib/src/internal_asset.dart` was moved to
+/// `lib/src/asset/internal_asset.dart. Pub needs to support all versions of
+/// barback back through 0.13.0, though. In order for this to work, it needs to
+/// be able to import "package:barback/src/internal_asset.dart" on all available
+/// barback versions, hence the existence of this library.
+library barback.internal_asset;
+
+export 'asset/internal_asset.dart';
diff --git a/mojo/public/dart/third_party/barback/lib/src/log.dart b/mojo/public/dart/third_party/barback/lib/src/log.dart
new file mode 100644
index 0000000..f0240a4
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/log.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.log;
+
+import 'package:source_span/source_span.dart';
+
+import 'asset/asset_id.dart';
+import 'errors.dart';
+
+/// The severity of a logged message.
+class LogLevel {
+  static const INFO = const LogLevel("Info");
+  static const FINE = const LogLevel("Fine");
+  static const WARNING = const LogLevel("Warning");
+  static const ERROR = const LogLevel("Error");
+
+  final String name;
+  const LogLevel(this.name);
+
+  String toString() => name;
+}
+
+/// One message logged during a transform.
+class LogEntry {
+  /// The transform that logged the message.
+  final TransformInfo transform;
+
+  /// The asset that the message is associated with.
+  final AssetId assetId;
+
+  final LogLevel level;
+  final String message;
+
+  /// The location that the message pertains to or null if not associated with
+  /// a [SourceSpan].
+  final SourceSpan span;
+
+  LogEntry(this.transform, this.assetId, this.level, this.message, this.span);
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/package_provider.dart b/mojo/public/dart/third_party/barback/lib/src/package_provider.dart
new file mode 100644
index 0000000..ce6ee23
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/package_provider.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.package_provider;
+
+import 'dart:async';
+
+import 'asset/asset.dart';
+import 'asset/asset_id.dart';
+
+/// API for locating and accessing packages on disk.
+///
+/// Implemented by pub and provided to barback so that it isn't coupled
+/// directly to pub.
+abstract class PackageProvider {
+  /// The names of all packages that can be provided by this provider.
+  ///
+  /// This is equal to the transitive closure of the entrypoint package
+  /// dependencies.
+  Iterable<String> get packages;
+
+  /// Loads an asset from disk.
+  ///
+  /// This should be re-entrant; it may be called multiple times with the same
+  /// id before the previously returned future has completed.
+  ///
+  /// If no asset with [id] exists, the provider should throw an
+  /// [AssetNotFoundException].
+  Future<Asset> getAsset(AssetId id);
+}
+
+/// A PackageProvider for which some packages are known to be static—that is,
+/// the package has no transformers and its assets won't ever change.
+///
+/// For static packages, rather than telling barback up-front which assets that
+/// package contains via [Barback.updateSources], barback will lazily query the
+/// provider for an asset when it's needed. This is much more efficient.
+abstract class StaticPackageProvider implements PackageProvider {
+  /// The names of all static packages provided by this provider.
+  ///
+  /// This must be disjoint from [packages].
+  Iterable<String> get staticPackages;
+
+  /// Returns all ids of assets in [package].
+  ///
+  /// This is used for [Barback.getAllAssets].
+  Stream<AssetId> getAllAssetIds(String package);
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/serialize.dart b/mojo/public/dart/third_party/barback/lib/src/serialize.dart
new file mode 100644
index 0000000..10cc6fe
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/serialize.dart
@@ -0,0 +1,113 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.serialize;
+
+import 'dart:async';
+import 'dart:isolate';
+
+import 'package:stack_trace/stack_trace.dart';
+
+import 'asset/asset_id.dart';
+import 'utils.dart';
+
+/// Converts [id] into a serializable map.
+Map serializeId(AssetId id) => {'package': id.package, 'path': id.path};
+
+/// Converts [stream] into a [SendPort] with which another isolate can request
+/// the data from [stream].
+SendPort serializeStream(Stream stream) {
+  var receivePort = new ReceivePort();
+  receivePort.first.then((sendPort) {
+    stream.listen((data) => sendPort.send({'type': 'data', 'data': data}),
+        onDone: () => sendPort.send({'type': 'done'}),
+        onError: (error, stackTrace) {
+      sendPort.send({
+        'type': 'error',
+        'error': CrossIsolateException.serialize(error, stackTrace)
+      });
+    });
+  });
+
+  return receivePort.sendPort;
+}
+
+/// Converts a serializable map into an [AssetId].
+AssetId deserializeId(Map id) => new AssetId(id['package'], id['path']);
+
+/// Convert a [SendPort] whose opposite is waiting to send us a stream into a
+/// [Stream].
+///
+/// No stream data will actually be sent across the isolate boundary until
+/// someone subscribes to the returned stream.
+Stream deserializeStream(SendPort sendPort) {
+  return callbackStream(() {
+    var receivePort = new ReceivePort();
+    sendPort.send(receivePort.sendPort);
+    return receivePort.transform(
+        const StreamTransformer(_deserializeTransformer));
+  });
+}
+
+/// The body of a [StreamTransformer] that deserializes the values in a stream
+/// sent by [serializeStream].
+StreamSubscription _deserializeTransformer(Stream input, bool cancelOnError) {
+  var subscription;
+  var transformed = input.transform(new StreamTransformer.fromHandlers(
+      handleData: (data, sink) {
+    if (data['type'] == 'data') {
+      sink.add(data['data']);
+    } else if (data['type'] == 'error') {
+      var exception = new CrossIsolateException.deserialize(data['error']);
+      sink.addError(exception, exception.stackTrace);
+    } else {
+      assert(data['type'] == 'done');
+      sink.close();
+      subscription.cancel();
+    }
+  }));
+  subscription = transformed.listen(null, cancelOnError: cancelOnError);
+  return subscription;
+}
+
+/// An exception that was originally raised in another isolate.
+///
+/// Exception objects can't cross isolate boundaries in general, so this class
+/// wraps as much information as can be consistently serialized.
+class CrossIsolateException implements Exception {
+  /// The name of the type of exception thrown.
+  ///
+  /// This is the return value of [error.runtimeType.toString()]. Keep in mind
+  /// that objects in different libraries may have the same type name.
+  final String type;
+
+  /// The exception's message, or its [toString] if it didn't expose a `message`
+  /// property.
+  final String message;
+
+  /// The exception's stack chain, or `null` if no stack chain was available.
+  final Chain stackTrace;
+
+  /// Loads a [CrossIsolateException] from a serialized representation.
+  ///
+  /// [error] should be the result of [CrossIsolateException.serialize].
+  CrossIsolateException.deserialize(Map error)
+      : type = error['type'],
+        message = error['message'],
+        stackTrace = error['stack'] == null ? null :
+            new Chain.parse(error['stack']);
+
+  /// Serializes [error] to an object that can safely be passed across isolate
+  /// boundaries.
+  static Map serialize(error, [StackTrace stack]) {
+    if (stack == null && error is Error) stack = error.stackTrace;
+    return {
+      'type': error.runtimeType.toString(),
+      'message': getErrorMessage(error),
+      'stack': stack == null ? null : new Chain.forTrace(stack).toString()
+    };
+  }
+
+  String toString() => "$message\n$stackTrace";
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/transformer/aggregate_transform.dart b/mojo/public/dart/third_party/barback/lib/src/transformer/aggregate_transform.dart
new file mode 100644
index 0000000..6d471fd
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/transformer/aggregate_transform.dart
@@ -0,0 +1,151 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.transformer.aggregate_transform;
+
+import 'dart:async';
+import 'dart:convert';
+
+import '../asset/asset.dart';
+import '../asset/asset_id.dart';
+import '../asset/asset_set.dart';
+import '../errors.dart';
+import '../graph/transform_node.dart';
+import '../utils.dart';
+import 'base_transform.dart';
+
+/// A transform for [AggregateTransformer]s that provides access to all of their
+/// primary inputs.
+class AggregateTransform extends BaseTransform {
+  final TransformNode _node;
+
+  /// The set of outputs emitted by the transformer.
+  final _outputs = new AssetSet();
+
+  /// The transform key.
+  ///
+  /// This is the key returned by [AggregateTransformer.classifyPrimary] for all
+  /// the assets in this transform.
+  String get key => _node.key;
+
+  /// The package in which this transform is running.
+  String get package => _node.phase.cascade.package;
+
+  /// The stream of primary inputs that will be processed by this transform.
+  ///
+  /// This is exposed as a stream so that the transformer can start working
+  /// before all its inputs are available. The stream is closed not just when
+  /// all inputs are provided, but when barback is confident no more inputs will
+  /// be forthcoming.
+  ///
+  /// A transformer may complete its `apply` method before this stream is
+  /// closed. For example, it may know that each key will only have two inputs
+  /// associated with it, and so use `transform.primaryInputs.take(2)` to access
+  /// only those inputs.
+  Stream<Asset> get primaryInputs => _inputController.stream;
+  final _inputController = new StreamController<Asset>();
+
+  /// The set of all primary inputs that have been emitted by [primaryInputs].
+  ///
+  /// This is populated by the transform's controller so that
+  /// [AggregateTransformController.addedId] synchronously returns the correct
+  /// result after [AggregateTransformController.addInput] is called.
+  final _emittedPrimaryInputs = new AssetSet();
+
+  AggregateTransform._(TransformNode node)
+      : _node = node,
+        super(node);
+
+  /// Gets the asset for an input [id].
+  ///
+  /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
+  Future<Asset> getInput(AssetId id) {
+    if (_emittedPrimaryInputs.containsId(id)) {
+      return syncFuture(() => _emittedPrimaryInputs[id]);
+    } else {
+      return _node.getInput(id);
+    }
+  }
+
+  /// A convenience method to the contents of the input with [id] as a string.
+  ///
+  /// This is equivalent to calling [getInput] followed by [Asset.readAsString].
+  ///
+  /// If the asset was created from a [String] the original string is always
+  /// returned and [encoding] is ignored. Otherwise, the binary data of the
+  /// asset is decoded using [encoding], which defaults to [UTF8].
+  ///
+  /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
+  Future<String> readInputAsString(AssetId id, {Encoding encoding}) {
+    if (encoding == null) encoding = UTF8;
+    return getInput(id).then((input) => input.readAsString(encoding: encoding));
+  }
+
+  /// A convenience method to the contents of the input with [id].
+  ///
+  /// This is equivalent to calling [getInput] followed by [Asset.read].
+  ///
+  /// If the asset was created from a [String], this returns its UTF-8 encoding.
+  ///
+  /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
+  Stream<List<int>> readInput(AssetId id) =>
+      futureStream(getInput(id).then((input) => input.read()));
+
+  /// A convenience method to return whether or not an asset exists.
+  ///
+  /// This is equivalent to calling [getInput] and catching an
+  /// [AssetNotFoundException].
+  Future<bool> hasInput(AssetId id) {
+    return getInput(id).then((_) => true).catchError((error) {
+      if (error is AssetNotFoundException && error.id == id) return false;
+      throw error;
+    });
+  }
+
+  /// Stores [output] as an output created by this transformation.
+  ///
+  /// A transformation can output as many assets as it wants.
+  void addOutput(Asset output) {
+    // TODO(rnystrom): This should immediately throw if an output with that ID
+    // has already been created by this transformer.
+    _outputs.add(output);
+  }
+
+  void consumePrimary(AssetId id) {
+    if (!_emittedPrimaryInputs.containsId(id)) {
+      throw new StateError(
+          "$id can't be consumed because it's not a primary input.");
+    }
+
+    super.consumePrimary(id);
+  }
+}
+
+/// The controller for [AggregateTransform].
+class AggregateTransformController extends BaseTransformController {
+  AggregateTransform get transform => super.transform;
+
+  /// The set of assets that the transformer has emitted.
+  AssetSet get outputs => transform._outputs;
+
+  bool get isDone => transform._inputController.isClosed;
+
+  AggregateTransformController(TransformNode node)
+      : super(new AggregateTransform._(node));
+
+  /// Adds a primary input asset to the [AggregateTransform.primaryInputs]
+  /// stream.
+  void addInput(Asset input) {
+    transform._emittedPrimaryInputs.add(input);
+    transform._inputController.add(input);
+  }
+
+  /// Returns whether an input with the given [id] was added via [addInput].
+  bool addedId(AssetId id) =>
+      transform._emittedPrimaryInputs.containsId(id);
+
+  void done() {
+    transform._inputController.close();
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/transformer/aggregate_transformer.dart b/mojo/public/dart/third_party/barback/lib/src/transformer/aggregate_transformer.dart
new file mode 100644
index 0000000..6873e99
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/transformer/aggregate_transformer.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.transformer.aggregate_transformer;
+
+import '../asset/asset_id.dart';
+import 'aggregate_transform.dart';
+
+/// An alternate interface for transformers that want to perform aggregate
+/// transformations on multiple inputs without any individual one of them being
+/// considered "primary".
+///
+/// This is useful for transformers like image spriting, where all the images in
+/// a directory need to be combined into a single image. A normal [Transformer]
+/// can't do this gracefully since when it's running on a single image, it has
+/// no way of knowing what other images exist to request as secondary inputs.
+///
+/// Aggregate transformers work by classifying assets into different groups
+/// based on their ids in [classifyPrimary]. Then [apply] is run once for each
+/// group. For example, a spriting transformer might put each image asset into a
+/// group identified by its directory name. All images in a given directory will
+/// end up in the same group, and they'll all be passed to one [apply] call.
+///
+/// If possible, aggregate transformers should implement
+/// [DeclaringAggregateTransformer] as well to help barback optimize the package
+/// graph.
+abstract class AggregateTransformer {
+  /// Classifies an asset id by returning a key identifying which group the
+  /// asset should be placed in.
+  ///
+  /// All assets for which [classifyPrimary] returns the same key are passed
+  /// together to the same [apply] call.
+  ///
+  /// This may return [Future<String>] or, if it's entirely synchronous,
+  /// [String]. Any string can be used to classify an asset. If possible,
+  /// though, this should return a path-like string to aid in logging.
+  ///
+  /// A return value of `null` indicates that the transformer is not interested
+  /// in an asset. Assets with a key of `null` will not be passed to any [apply]
+  /// call; this is equivalent to [Transformer.isPrimary] returning `false`.
+  classifyPrimary(AssetId id);
+
+  /// Runs this transformer on a group of primary inputs specified by
+  /// [transform].
+  ///
+  /// If this does asynchronous work, it should return a [Future] that completes
+  /// once it's finished.
+  ///
+  /// This may complete before [AggregateTransform.primarInputs] is closed. For
+  /// example, it may know that each key will only have two inputs associated
+  /// with it, and so use `transform.primaryInputs.take(2)` to access only those
+  /// inputs.
+  apply(AggregateTransform transform);
+
+  String toString() => runtimeType.toString().replaceAll("Transformer", "");
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/transformer/barback_settings.dart b/mojo/public/dart/third_party/barback/lib/src/transformer/barback_settings.dart
new file mode 100644
index 0000000..5b3f46c
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/transformer/barback_settings.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.transformer.barback_settings;
+
+/// A generic settings object for providing configuration details to
+/// [Transformer]s.
+///
+/// Barback does not specify *how* this is provided to transformers. It is up
+/// to a host application to handle this. (For example, pub passes this to the
+/// transformer's constructor.)
+class BarbackSettings {
+  /// An open-ended map of configuration properties specific to this
+  /// transformer.
+  ///
+  /// The contents of the map should be serializable across isolates, but
+  /// otherwise can contain whatever you want.
+  final Map configuration;
+
+  /// The mode that user is running Barback in.
+  ///
+  /// This will be the same for all transformers in a running instance of
+  /// Barback.
+  final BarbackMode mode;
+
+  BarbackSettings(this.configuration, this.mode);
+}
+
+/// Enum-like class for specifying a mode that transformers may be run in.
+///
+/// Note that this is not a *closed* set of enum values. Host applications may
+/// define their own values for this, so a transformer relying on it should
+/// ensure that it behaves sanely with unknown values.
+class BarbackMode {
+  /// The normal mode used during development.
+  static const DEBUG = const BarbackMode._("debug");
+
+  /// The normal mode used to build an application for deploying to production.
+  static const RELEASE = const BarbackMode._("release");
+
+  /// The name of the mode.
+  ///
+  /// By convention, this is a lowercase string.
+  final String name;
+
+  /// Create a mode named [name].
+  factory BarbackMode(String name) {
+    // Use canonical instances of known names.
+    switch (name) {
+      case "debug": return BarbackMode.DEBUG;
+      case "release": return BarbackMode.RELEASE;
+      default:
+        return new BarbackMode._(name);
+    }
+  }
+
+  const BarbackMode._(this.name);
+
+  String toString() => name;
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/transformer/base_transform.dart b/mojo/public/dart/third_party/barback/lib/src/transformer/base_transform.dart
new file mode 100644
index 0000000..fe3ab3b
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/transformer/base_transform.dart
@@ -0,0 +1,115 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.transformer.base_transform;
+
+import 'dart:async';
+
+import '../asset/asset_id.dart';
+import '../graph/transform_node.dart';
+import '../log.dart';
+import 'transform_logger.dart';
+
+/// The base class for the ephemeral transform objects that are passed to
+/// transformers.
+///
+/// This class provides the transformers with inputs, but its up to the
+/// subclasses to provide a means of emitting outputs.
+abstract class BaseTransform {
+  final TransformNode _node;
+
+  /// The ids of primary inputs that should be consumed.
+  ///
+  /// This is exposed by [BaseTransformController].
+  final _consumedPrimaries = new Set<AssetId>();
+
+  /// Whether the transformer logged an error.
+  ///
+  /// This is exposed via [BaseTransformController].
+  bool _loggedError = false;
+
+  /// The controller for the stream of log entries emitted by the transformer.
+  ///
+  /// This is exposed via [BaseTransformController].
+  ///
+  /// This is synchronous because error logs can cause the transform to fail, so
+  /// we need to ensure that their processing isn't delayed until after the
+  /// transform or build has finished.
+  final _onLogController = new StreamController<LogEntry>.broadcast(sync: true);
+
+  /// A logger so that the [Transformer] can report build details.
+  TransformLogger get logger => _logger;
+  TransformLogger _logger;
+
+  BaseTransform(this._node) {
+    _logger = new TransformLogger((asset, level, message, span) {
+      if (level == LogLevel.ERROR) _loggedError = true;
+
+      // If the log isn't already associated with an asset, use the primary.
+      if (asset == null) asset = _node.info.primaryId;
+      var entry = new LogEntry(_node.info, asset, level, message, span);
+
+      // The log controller can be closed while log entries are still coming in
+      // if the transformer is removed during [apply].
+      if (!_onLogController.isClosed) _onLogController.add(entry);
+    });
+  }
+
+  /// Consume a primary input so that it doesn't get processed by future
+  /// phases or emitted once processing has finished.
+  ///
+  /// Normally each primary input will automatically be forwarded unless the
+  /// transformer overwrites it by emitting an input with the same id. This
+  /// allows the transformer to tell barback not to forward a primary input
+  /// even if it's not overwritten.
+  void consumePrimary(AssetId id) {
+    // TODO(nweiz): throw an error if an id is consumed that wasn't listed as a
+    // primary input.
+    _consumedPrimaries.add(id);
+  }
+}
+
+/// The base class for controllers of subclasses of [BaseTransform].
+///
+/// Controllers are used so that [TransformNode]s can get values from a
+/// [BaseTransform] without exposing getters in the public API.
+abstract class BaseTransformController {
+  /// The [BaseTransform] controlled by this controller.
+  final BaseTransform transform;
+
+  /// The ids of primary inputs that should be consumed.
+  Set<AssetId> get consumedPrimaries => transform._consumedPrimaries;
+
+  /// Whether the transform logged an error.
+  bool get loggedError => transform._loggedError;
+
+  /// The stream of log entries emitted by the transformer during a run.
+  Stream<LogEntry> get onLog => transform._onLogController.stream;
+
+  /// Whether the transform's input or id stream has been closed.
+  ///
+  /// See also [done].
+  bool get isDone;
+
+  BaseTransformController(this.transform);
+
+  /// Mark this transform as finished emitting new inputs or input ids.
+  ///
+  /// This is distinct from [cancel] in that it *doesn't* indicate that the
+  /// transform is finished being used entirely. The transformer may still log
+  /// messages and load secondary inputs. This just indicates that all the
+  /// primary inputs are accounted for.
+  void done();
+
+  /// Mark this transform as canceled.
+  ///
+  /// This will close any streams and release any resources that were allocated
+  /// for the duration of the transformation. Unlike [done], this indicates that
+  /// the transformation is no longer relevant; either it has returned, or
+  /// something external has preemptively invalidated its results.
+  void cancel() {
+    done();
+    transform._onLogController.close();
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/transformer/declaring_aggregate_transform.dart b/mojo/public/dart/third_party/barback/lib/src/transformer/declaring_aggregate_transform.dart
new file mode 100644
index 0000000..cfcb782
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/transformer/declaring_aggregate_transform.dart
@@ -0,0 +1,105 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.transformer.declaring_aggregate_transform;
+
+import 'dart:async';
+
+import '../asset/asset_id.dart';
+import '../graph/transform_node.dart';
+import '../utils.dart';
+import 'base_transform.dart';
+
+/// A transform for [DeclaringAggregateTransformer]s that allows them to declare
+/// the ids of the outputs they'll generate without generating the concrete
+/// bodies of those outputs.
+class DeclaringAggregateTransform extends BaseTransform {
+  /// The set of output ids declared by the transformer.
+  final _outputIds = new Set<AssetId>();
+
+  /// The transform key.
+  ///
+  /// This is the key returned by [AggregateTransformer.classifyPrimary] for all
+  /// the assets in this transform.
+  final String key;
+
+  /// The package in which this transform is running.
+  final String package;
+
+  /// The stream of primary input ids that have been aggregated for this
+  /// transform.
+  ///
+  /// This is exposed as a stream so that the transformer can start working
+  /// before all its input ids are available. The stream is closed not just when
+  /// all inputs are provided, but when barback is confident no more inputs will
+  /// be forthcoming.
+  ///
+  /// A transformer may complete its `declareOutputs` method before this stream
+  /// is closed. For example, it may know that each key will only have two
+  /// inputs associated with it, and so use `transform.primaryIds.take(2)` to
+  /// access only those inputs' ids.
+  Stream<AssetId> get primaryIds => _primaryIds;
+  Stream<AssetId> _primaryIds;
+
+  /// The controller for [primaryIds].
+  ///
+  /// This is a broadcast controller so that the transform can keep
+  /// [_emittedPrimaryIds] up to date.
+  final _idController = new StreamController<AssetId>.broadcast();
+
+  /// The set of all primary input ids that have been emitted by [primaryIds].
+  final _emittedPrimaryIds = new Set<AssetId>();
+
+  DeclaringAggregateTransform._(TransformNode node)
+      : key = node.key,
+        package = node.phase.cascade.package,
+        super(node) {
+    _idController.stream.listen(_emittedPrimaryIds.add);
+    // [primaryIds] should be a non-broadcast stream.
+    _primaryIds = broadcastToSingleSubscription(_idController.stream);
+  }
+
+  /// Stores [id] as the id of an output that will be created by this
+  /// transformation when it's run.
+  ///
+  /// A transformation can declare as many assets as it wants. If
+  /// [DeclaringTransformer.declareOutputs] declares a given asset id for a
+  /// given input, [Transformer.apply] should emit the corresponding asset as
+  /// well.
+  void declareOutput(AssetId id) {
+    // TODO(nweiz): This should immediately throw if an output with that ID
+    // has already been declared by this transformer.
+    _outputIds.add(id);
+  }
+
+  void consumePrimary(AssetId id) {
+    if (!_emittedPrimaryIds.contains(id)) {
+      throw new StateError(
+          "$id can't be consumed because it's not a primary input.");
+    }
+
+    super.consumePrimary(id);
+  }
+}
+
+/// The controller for [DeclaringAggregateTransform].
+class DeclaringAggregateTransformController extends BaseTransformController {
+  DeclaringAggregateTransform get transform => super.transform;
+
+  /// The set of ids that the transformer declares it will emit.
+  Set<AssetId> get outputIds => transform._outputIds;
+
+  bool get isDone => transform._idController.isClosed;
+
+  DeclaringAggregateTransformController(TransformNode node)
+      : super(new DeclaringAggregateTransform._(node));
+
+  /// Adds a primary input id to the [DeclaringAggregateTransform.primaryIds]
+  /// stream.
+  void addId(AssetId id) => transform._idController.add(id);
+
+  void done() {
+    transform._idController.close();
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/transformer/declaring_aggregate_transformer.dart b/mojo/public/dart/third_party/barback/lib/src/transformer/declaring_aggregate_transformer.dart
new file mode 100644
index 0000000..cef8711
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/transformer/declaring_aggregate_transformer.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.transformer.declaring_aggregate_transformer;
+
+import 'declaring_aggregate_transform.dart';
+
+/// An interface for [Transformer]s that can cheaply figure out which assets
+/// they'll emit without doing the work of actually creating those assets.
+///
+/// If a transformer implements this interface, that allows barback to perform
+/// optimizations to make the asset graph work more smoothly.
+abstract class DeclaringAggregateTransformer {
+  /// Declare which assets would be emitted for the primary input ids specified
+  /// by [transform].
+  ///
+  /// This works a little like [AggregateTransformer.apply], with two main
+  /// differences. First, instead of having access to the primary inputs'
+  /// contents, it only has access to their ids. Second, instead of emitting
+  /// [Asset]s, it just emits [AssetId]s through [transform.addOutputId].
+  ///
+  /// If this does asynchronous work, it should return a [Future] that completes
+  /// once it's finished.
+  ///
+  /// This may complete before [DeclaringAggregateTransform.primaryIds] stream
+  /// is closed. For example, it may know that each key will only have two
+  /// inputs associated with it, and so use `transform.primaryIds.take(2)` to
+  /// access only those inputs' ids.
+  declareOutputs(DeclaringAggregateTransform transform);
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/transformer/declaring_transform.dart b/mojo/public/dart/third_party/barback/lib/src/transformer/declaring_transform.dart
new file mode 100644
index 0000000..7dff33a
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/transformer/declaring_transform.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.transformer.declaring_transform;
+
+import 'dart:async';
+
+import '../asset/asset_id.dart';
+import 'declaring_aggregate_transform.dart';
+import 'transform_logger.dart';
+
+/// Creates a new [DeclaringTransform] wrapping an
+/// [AggregateDeclaringTransform].
+///
+/// Although barback internally works in terms of
+/// [DeclaringAggregateTransformer]s, most transformers only work on individual
+/// primary inputs in isolation. We want to allow those transformers to
+/// implement the more user-friendly [DeclaringTransformer] interface which
+/// takes the more user-friendly [DeclaringTransform] object. This method wraps
+/// the more general [DeclaringAggregateTransform] to return a
+/// [DeclaringTransform] instead.
+Future<DeclaringTransform> newDeclaringTransform(
+    DeclaringAggregateTransform aggregate) {
+  // A wrapped [Transformer] will assign each primary input a unique transform
+  // key, so we can safely get the first asset emitted. We don't want to wait
+  // for the stream to close, since that requires barback to prove that no more
+  // new assets will be generated.
+  return aggregate.primaryIds.first.then((primaryId) => 
+      new DeclaringTransform._(aggregate, primaryId));
+}
+
+/// A transform for [DeclaringTransformer]s that allows them to declare the ids
+/// of the outputs they'll generate without generating the concrete bodies of
+/// those outputs.
+class DeclaringTransform {
+  /// The underlying aggregate transform.
+  final DeclaringAggregateTransform _aggregate;
+
+  final AssetId primaryId;
+
+  /// A logger so that the [Transformer] can report build details.
+  TransformLogger get logger => _aggregate.logger;
+
+  DeclaringTransform._(this._aggregate, this.primaryId);
+
+  /// Stores [id] as the id of an output that will be created by this
+  /// transformation when it's run.
+  ///
+  /// A transformation can declare as many assets as it wants. If
+  /// [DeclaringTransformer.declareOutputs] declareds a given asset id for a
+  /// given input, [Transformer.apply] should emit the corresponding asset as
+  /// well.
+  void declareOutput(AssetId id) => _aggregate.declareOutput(id);
+
+  /// Consume the primary input so that it doesn't get processed by future
+  /// phases or emitted once processing has finished.
+  ///
+  /// Normally the primary input will automatically be forwarded unless the
+  /// transformer overwrites it by emitting an input with the same id. This
+  /// allows the transformer to tell barback not to forward the primary input
+  /// even if it's not overwritten.
+  void consumePrimary() => _aggregate.consumePrimary(primaryId);
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/transformer/declaring_transformer.dart b/mojo/public/dart/third_party/barback/lib/src/transformer/declaring_transformer.dart
new file mode 100644
index 0000000..d9e5adc
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/transformer/declaring_transformer.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.transformer.declaring_transformer;
+
+import 'dart:async';
+
+import 'declaring_transform.dart';
+
+/// An interface for [Transformer]s that can cheaply figure out which assets
+/// they'll emit without doing the work of actually creating those assets.
+///
+/// If a transformer implements this interface, that allows barback to perform
+/// optimizations to make the asset graph work more smoothly.
+abstract class DeclaringTransformer {
+  /// Declare which assets would be emitted for the primary input id specified
+  /// by [transform].
+  ///
+  /// This works a little like [Transformer.apply], with two main differences.
+  /// First, instead of having access to the primary input's contents, it only
+  /// has access to its id. Second, instead of emitting [Asset]s, it just emits
+  /// [AssetId]s through [transform.addOutputId].
+  ///
+  /// If this does asynchronous work, it should return a [Future] that completes
+  /// once it's finished.
+  declareOutputs(DeclaringTransform transform);
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/transformer/lazy_aggregate_transformer.dart b/mojo/public/dart/third_party/barback/lib/src/transformer/lazy_aggregate_transformer.dart
new file mode 100644
index 0000000..891fc1e
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/transformer/lazy_aggregate_transformer.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.transformer.lazy_aggregate_transformer;
+
+import 'declaring_aggregate_transformer.dart';
+
+/// An interface for [AggregateTransformer]s that indicates that the
+/// transformer's outputs shouldn't be generated until requested.
+///
+/// The [declareOutputs] method is used to figure out which assets should be
+/// treated as "lazy." Lazy assets will only be forced to be generated if
+/// they're requested by the user or if they're used by a non-declaring
+/// transformer.
+abstract class LazyAggregateTransformer extends DeclaringAggregateTransformer {}
diff --git a/mojo/public/dart/third_party/barback/lib/src/transformer/lazy_transformer.dart b/mojo/public/dart/third_party/barback/lib/src/transformer/lazy_transformer.dart
new file mode 100644
index 0000000..657b65b
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/transformer/lazy_transformer.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.transformer.lazy_transformer;
+
+import 'declaring_transformer.dart';
+
+/// An interface for [Transformer]s that indicates that the transformer's
+/// outputs shouldn't be generated until requested.
+///
+/// The [declareOutputs] method is used to figure out which assets should be
+/// treated as "lazy." Lazy assets will only be forced to be generated if
+/// they're requested by the user or if they're used by a non-declaring
+/// transformer.
+abstract class LazyTransformer extends DeclaringTransformer {}
diff --git a/mojo/public/dart/third_party/barback/lib/src/transformer/transform.dart b/mojo/public/dart/third_party/barback/lib/src/transformer/transform.dart
new file mode 100644
index 0000000..2da73ee
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/transformer/transform.dart
@@ -0,0 +1,104 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.transformer.transform;
+
+import 'dart:async';
+import 'dart:convert';
+
+import '../asset/asset.dart';
+import '../asset/asset_id.dart';
+import '../errors.dart';
+import 'aggregate_transform.dart';
+import 'transform_logger.dart';
+
+/// Creates a new [Transform] wrapping an [AggregateTransform].
+///
+/// Although barback internally works in terms of [AggregateTransformer]s, most
+/// transformers only work on individual primary inputs in isolation. We want to
+/// allow those transformers to implement the more user-friendly [Transformer]
+/// interface which takes the more user-friendly [Transform] object. This method
+/// wraps the more general [AggregateTransform] to return a [Transform] instead.
+Future<Transform> newTransform(AggregateTransform aggregate) {
+  // A wrapped [Transformer] will assign each primary input a unique transform
+  // key, so we can safely get the first asset emitted. We don't want to wait
+  // for the stream to close, since that requires barback to prove that no more
+  // new assets will be generated.
+  return aggregate.primaryInputs.first.then((primaryInput) =>
+      new Transform._(aggregate, primaryInput));
+}
+
+/// While a [Transformer] represents a *kind* of transformation, this defines
+/// one specific usage of it on a set of files.
+///
+/// This ephemeral object exists only during an actual transform application to
+/// facilitate communication between the [Transformer] and the code hosting
+/// the transformation. It lets the [Transformer] access inputs and generate
+/// outputs.
+class Transform {
+  /// The underlying aggregate transform.
+  final AggregateTransform _aggregate;
+
+  /// Gets the primary input asset.
+  ///
+  /// While a transformation can use multiple input assets, one must be a
+  /// special "primary" asset. This will be the "entrypoint" or "main" input
+  /// file for a transformation.
+  ///
+  /// For example, with a dart2js transform, the primary input would be the
+  /// entrypoint Dart file. All of the other Dart files that that imports
+  /// would be secondary inputs.
+  final Asset primaryInput;
+
+  /// A logger so that the [Transformer] can report build details.
+  TransformLogger get logger => _aggregate.logger;
+
+  Transform._(this._aggregate, this.primaryInput);
+
+  /// Gets the asset for an input [id].
+  ///
+  /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
+  Future<Asset> getInput(AssetId id) => _aggregate.getInput(id);
+
+  /// A convenience method to the contents of the input with [id] as a string.
+  ///
+  /// This is equivalent to calling [getInput] followed by [Asset.readAsString].
+  ///
+  /// If the asset was created from a [String] the original string is always
+  /// returned and [encoding] is ignored. Otherwise, the binary data of the
+  /// asset is decoded using [encoding], which defaults to [UTF8].
+  ///
+  /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
+  Future<String> readInputAsString(AssetId id, {Encoding encoding}) =>
+      _aggregate.readInputAsString(id, encoding: encoding);
+
+  /// A convenience method to the contents of the input with [id].
+  ///
+  /// This is equivalent to calling [getInput] followed by [Asset.read].
+  ///
+  /// If the asset was created from a [String], this returns its UTF-8 encoding.
+  ///
+  /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
+  Stream<List<int>> readInput(AssetId id) => _aggregate.readInput(id);
+
+  /// A convenience method to return whether or not an asset exists.
+  ///
+  /// This is equivalent to calling [getInput] and catching an
+  /// [AssetNotFoundException].
+  Future<bool> hasInput(AssetId id) => _aggregate.hasInput(id);
+
+  /// Stores [output] as an output created by this transformation.
+  ///
+  /// A transformation can output as many assets as it wants.
+  void addOutput(Asset output) => _aggregate.addOutput(output);
+
+  /// Consume the primary input so that it doesn't get processed by future
+  /// phases or emitted once processing has finished.
+  ///
+  /// Normally the primary input will automatically be forwarded unless the
+  /// transformer overwrites it by emitting an input with the same id. This
+  /// allows the transformer to tell barback not to forward the primary input
+  /// even if it's not overwritten.
+  void consumePrimary() => _aggregate.consumePrimary(primaryInput.id);
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/transformer/transform_logger.dart b/mojo/public/dart/third_party/barback/lib/src/transformer/transform_logger.dart
new file mode 100644
index 0000000..5f26a97
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/transformer/transform_logger.dart
@@ -0,0 +1,71 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.transformer.transform_logger;
+
+import 'package:source_span/source_span.dart';
+
+import '../asset/asset_id.dart';
+import '../log.dart';
+
+typedef void LogFunction(AssetId asset, LogLevel level, String message,
+                         SourceSpan span);
+
+/// Object used to report warnings and errors encountered while running a
+/// transformer.
+class TransformLogger {
+  final LogFunction _logFunction;
+
+  TransformLogger(this._logFunction);
+
+  /// Logs an informative message.
+  ///
+  /// If [asset] is provided, the log entry is associated with that asset.
+  /// Otherwise it's associated with the primary input of [transformer]. If
+  /// present, [span] indicates the location in the input asset that caused the
+  /// error.
+  void info(String message, {AssetId asset, SourceSpan span}) {
+    _logFunction(asset, LogLevel.INFO, message, span);
+  }
+
+  /// Logs a message that won't be displayed unless the user is running in
+  /// verbose mode.
+  ///
+  /// If [asset] is provided, the log entry is associated with that asset.
+  /// Otherwise it's associated with the primary input of [transformer]. If
+  /// present, [span] indicates the location in the input asset that caused the
+  /// error.
+  void fine(String message, {AssetId asset, SourceSpan span}) {
+    _logFunction(asset, LogLevel.FINE, message, span);
+  }
+
+  /// Logs a warning message.
+  ///
+  /// If [asset] is provided, the log entry is associated with that asset.
+  /// Otherwise it's associated with the primary input of [transformer]. If
+  /// present, [span] indicates the location in the input asset that caused the
+  /// error.
+  void warning(String message, {AssetId asset, SourceSpan span}) {
+    _logFunction(asset, LogLevel.WARNING, message, span);
+  }
+
+  /// Logs an error message.
+  ///
+  /// If [asset] is provided, the log entry is associated with that asset.
+  /// Otherwise it's associated with the primary input of [transformer]. If
+  /// present, [span] indicates the location in the input asset that caused the
+  /// error.
+  ///
+  /// Logging any errors will cause Barback to consider the transformation to
+  /// have failed, much like throwing an exception. This means that neither the
+  /// primary input nor any outputs emitted by the transformer will be passed on
+  /// to the following phase, and the build will be reported as having failed.
+  ///
+  /// Unlike throwing an exception, this doesn't cause a transformer to stop
+  /// running. This makes it useful in cases where a single input may have
+  /// multiple errors that the user wants to know about.
+  void error(String message, {AssetId asset, SourceSpan span}) {
+    _logFunction(asset, LogLevel.ERROR, message, span);
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/transformer/transformer.dart b/mojo/public/dart/third_party/barback/lib/src/transformer/transformer.dart
new file mode 100644
index 0000000..b40d61d
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/transformer/transformer.dart
@@ -0,0 +1,93 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.transformer.transformer;
+
+import 'dart:async';
+
+import '../asset/asset_id.dart';
+import '../utils.dart';
+import 'transform.dart';
+
+/// A [Transformer] represents a processor that takes in one or more input
+/// assets and uses them to generate one or more output assets.
+///
+/// Dart2js, a SASS->CSS processor, a CSS spriter, and a tool to concatenate
+/// files are all examples of transformers. To define your own transformation
+/// step, extend (or implement) this class.
+///
+/// If possible, transformers should implement [DeclaringTransformer] as well to
+/// help barback optimize the package graph.
+abstract class Transformer {
+  /// Override this to return a space-separated list of file extensions that are
+  /// allowed for the primary inputs to this transformer.
+  ///
+  /// Each extension must begin with a leading `.`.
+  ///
+  /// If you don't override [isPrimary] yourself, it defaults to allowing any
+  /// asset whose extension matches one of the ones returned by this. If you
+  /// don't override [isPrimary] *or* this, it allows all files.
+  String get allowedExtensions => null;
+
+  Transformer() {
+    if (allowedExtensions == null) return;
+
+    var invalidExtensions = allowedExtensions.split(" ")
+        .where((extension) => !extension.startsWith("."))
+        .map((extension) => '"$extension"');
+    if (invalidExtensions.isEmpty) return;
+
+    throw new FormatException('Each extension in $this.allowedExtensions '
+        'must begin with a ".", but ${toSentence(invalidExtensions)} '
+        '${pluralize("doesn't", invalidExtensions.length, plural: "don't")}.');
+  }
+
+  /// Returns `true` if [id] can be a primary input for this transformer.
+  ///
+  /// While a transformer can read from multiple input files, one must be the
+  /// "primary" input. This asset determines whether the transformation should
+  /// be run at all. If the primary input is removed, the transformer will no
+  /// longer be run.
+  ///
+  /// A concrete example is dart2js. When you run dart2js, it will traverse
+  /// all of the imports in your Dart source files and use the contents of all
+  /// of those to generate the final JS. However you still run dart2js "on" a
+  /// single file: the entrypoint Dart file that has your `main()` method.
+  /// This entrypoint file would be the primary input.
+  ///
+  /// If this is not overridden, defaults to allow any asset whose extension
+  /// matches one of the ones returned by [allowedExtensions]. If *that* is
+  /// not overridden, allows all assets.
+  ///
+  /// This may return a `Future<bool>` or, if it's entirely synchronous, a
+  /// `bool`.
+  isPrimary(AssetId id) {
+    // Allow all files if [primaryExtensions] is not overridden.
+    if (allowedExtensions == null) return true;
+
+    for (var extension in allowedExtensions.split(" ")) {
+      if (id.path.endsWith(extension)) return true;
+    }
+
+    return false;
+  }
+
+  /// Run this transformer on the primary input specified by [transform].
+  ///
+  /// The [transform] is used by the [Transformer] for two purposes (in
+  /// addition to accessing the primary input). It can call `getInput()` to
+  /// request additional input assets. It also calls `addOutput()` to provide
+  /// generated assets back to the system. Either can be called multiple times,
+  /// in any order.
+  ///
+  /// In other words, a Transformer's job is to find all inputs for a
+  /// transform, starting at the primary input, then generate all output assets
+  /// and yield them back to the transform.
+  ///
+  /// If this does asynchronous work, it should return a [Future] that completes
+  /// once it's finished.
+  apply(Transform transform);
+
+  String toString() => runtimeType.toString().replaceAll("Transformer", "");
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/transformer/transformer_group.dart b/mojo/public/dart/third_party/barback/lib/src/transformer/transformer_group.dart
new file mode 100644
index 0000000..17a2e57
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/transformer/transformer_group.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.transformer.transformer_group;
+
+/// A [TransformerGroup] encapsulates a phased collection of transformers.
+///
+/// A transformer group is defined like a collection of phases, such as you
+/// might pass to [Barback.updateTransformers]. Input assets are transformed by
+/// the first phase, whose results are passed to the second phase, and so on.
+///
+/// However, from the perspective of someone using a [TransformerGroup], it
+/// works just like a [Transformer]. It can be included in phases, and will run
+/// in parallel to other transformers or groups in those phases. Other
+/// transformers and groups will be unable to see any intermediate assets that
+/// are generated by one phase of the group and consumed by another. Phases
+/// after the one containing the group will be able to see its outputs, though.
+class TransformerGroup {
+  /// The phases that comprise this group.
+  ///
+  /// Each element of the inner iterable must be either a [Transformer] or a
+  /// [TransformerGroup].
+  final Iterable<Iterable> phases;
+
+  TransformerGroup(Iterable<Iterable> phases)
+      : this.phases = phases.map((phase) => phase.toList()).toList();
+
+  String toString() => "group of $phases";
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/transformer/wrapping_aggregate_transformer.dart b/mojo/public/dart/third_party/barback/lib/src/transformer/wrapping_aggregate_transformer.dart
new file mode 100644
index 0000000..f41d075
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/transformer/wrapping_aggregate_transformer.dart
@@ -0,0 +1,84 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.transformer.wrapping_aggregate_transformer;
+
+import 'dart:async';
+
+import '../asset/asset_id.dart';
+import '../utils.dart';
+import 'aggregate_transform.dart';
+import 'aggregate_transformer.dart';
+import 'declaring_aggregate_transform.dart';
+import 'declaring_aggregate_transformer.dart';
+import 'declaring_transform.dart';
+import 'declaring_transformer.dart';
+import 'lazy_aggregate_transformer.dart';
+import 'lazy_transformer.dart';
+import 'transform.dart';
+import 'transformer.dart';
+
+/// An [AggregateTransformer] that wraps a non-aggregate [Transformer].
+///
+/// Although barback internally works in terms of [AggregateTransformer]s, most
+/// transformers only work on individual primary inputs in isolation. We want to
+/// allow those transformers to implement the more user-friendly [Transformer]
+/// interface. This class makes that possible.
+class WrappingAggregateTransformer implements AggregateTransformer {
+  /// The wrapped transformer.
+  final Transformer transformer;
+
+  factory WrappingAggregateTransformer(Transformer transformer) {
+    if (transformer is LazyTransformer) {
+      return new _LazyWrappingAggregateTransformer(
+          transformer as LazyTransformer);
+    } else if (transformer is DeclaringTransformer) {
+      return new _DeclaringWrappingAggregateTransformer(
+          transformer as DeclaringTransformer);
+    } else {
+      return new WrappingAggregateTransformer._(transformer);
+    }
+  }
+
+  WrappingAggregateTransformer._(this.transformer);
+
+  Future<String> classifyPrimary(AssetId id) {
+    return syncFuture(() => transformer.isPrimary(id))
+        .then((isPrimary) => isPrimary ? id.path : null);
+  }
+
+  Future apply(AggregateTransform aggregateTransform) {
+    return newTransform(aggregateTransform)
+        .then((transform) => transformer.apply(transform));
+  }
+
+  String toString() => transformer.toString();
+}
+
+/// A wrapper for [DeclaringTransformer]s that implements
+/// [DeclaringAggregateTransformer].
+class _DeclaringWrappingAggregateTransformer
+    extends WrappingAggregateTransformer
+    implements DeclaringAggregateTransformer {
+  final DeclaringTransformer _declaring;
+
+  _DeclaringWrappingAggregateTransformer(DeclaringTransformer transformer)
+      : _declaring = transformer,
+        super._(transformer as Transformer);
+
+  Future declareOutputs(DeclaringAggregateTransform aggregateTransform) {
+    return newDeclaringTransform(aggregateTransform).then((transform) {
+      return (transformer as DeclaringTransformer).declareOutputs(transform);
+    });
+  }
+}
+
+/// A wrapper for [LazyTransformer]s that implements
+/// [LazyAggregateTransformer].
+class _LazyWrappingAggregateTransformer
+    extends _DeclaringWrappingAggregateTransformer
+    implements LazyAggregateTransformer {
+  _LazyWrappingAggregateTransformer(LazyTransformer transformer)
+      : super(transformer);
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/utils.dart b/mojo/public/dart/third_party/barback/lib/src/utils.dart
new file mode 100644
index 0000000..7ce6724
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/utils.dart
@@ -0,0 +1,347 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.utils;
+
+import 'dart:async';
+import 'dart:typed_data';
+
+import 'package:stack_trace/stack_trace.dart';
+
+/// A class that represents a value or an error.
+class Fallible<E> {
+  /// Whether [this] has a [value], as opposed to an [error].
+  final bool hasValue;
+
+  /// Whether [this] has an [error], as opposed to a [value].
+  bool get hasError => !hasValue;
+
+  /// The value.
+  ///
+  /// This will be `null` if [this] has an [error].
+  final E _value;
+
+  /// The value.
+  ///
+  /// This will throw a [StateError] if [this] has an [error].
+  E get value {
+    if (hasValue) return _value;
+    throw new StateError("Fallible has no value.\n"
+        "$_error$_stackTraceSuffix");
+  }
+
+  /// The error.
+  ///
+  /// This will be `null` if [this] has a [value].
+  final _error;
+
+  /// The error.
+  ///
+  /// This will throw a [StateError] if [this] has a [value].
+  get error {
+    if (hasError) return _error;
+    throw new StateError("Fallible has no error.");
+  }
+
+  /// The stack trace for [_error].
+  ///
+  /// This will be `null` if [this] has a [value], or if no stack trace was
+  /// provided.
+  final StackTrace _stackTrace;
+
+  /// The stack trace for [error].
+  ///
+  /// This will throw a [StateError] if [this] has a [value].
+  StackTrace get stackTrace {
+    if (hasError) return _stackTrace;
+    throw new StateError("Fallible has no error.");
+  }
+
+  Fallible.withValue(this._value)
+      : _error = null,
+        _stackTrace = null,
+        hasValue = true;
+
+  Fallible.withError(this._error, [this._stackTrace])
+      : _value = null,
+        hasValue = false;
+
+  /// Returns a completed Future with the same value or error as [this].
+  Future toFuture() {
+    if (hasValue) return new Future.value(value);
+    return new Future.error(error, stackTrace);
+  }
+
+  String toString() {
+    if (hasValue) return "Fallible value: $value";
+    return "Fallible error: $error$_stackTraceSuffix";
+  }
+
+  String get _stackTraceSuffix {
+    if (stackTrace == null) return "";
+    return "\nStack trace:\n${new Chain.forTrace(_stackTrace).terse}";
+  }
+}
+
+/// Converts a number in the range [0-255] to a two digit hex string.
+///
+/// For example, given `255`, returns `ff`.
+String byteToHex(int byte) {
+  assert(byte >= 0 && byte <= 255);
+
+  const DIGITS = "0123456789abcdef";
+  return DIGITS[(byte ~/ 16) % 16] + DIGITS[byte % 16];
+}
+
+/// Returns a sentence fragment listing the elements of [iter].
+///
+/// This converts each element of [iter] to a string and separates them with
+/// commas and/or "and" where appropriate.
+String toSentence(Iterable iter) {
+  if (iter.length == 1) return iter.first.toString();
+  return iter.take(iter.length - 1).join(", ") + " and ${iter.last}";
+}
+
+/// Returns [name] if [number] is 1, or the plural of [name] otherwise.
+///
+/// By default, this just adds "s" to the end of [name] to get the plural. If
+/// [plural] is passed, that's used instead.
+String pluralize(String name, int number, {String plural}) {
+  if (number == 1) return name;
+  if (plural != null) return plural;
+  return '${name}s';
+}
+
+/// Converts [input] into a [Uint8List].
+///
+/// If [input] is a [TypedData], this just returns a view on [input].
+Uint8List toUint8List(List<int> input) {
+  if (input is Uint8List) return input;
+  if (input is TypedData) {
+    // TODO(nweiz): remove "as" when issue 11080 is fixed.
+    return new Uint8List.view((input as TypedData).buffer);
+  }
+  return new Uint8List.fromList(input);
+}
+
+/// Group the elements in [iter] by the value returned by [fn].
+///
+/// This returns a map whose keys are the return values of [fn] and whose values
+/// are lists of each element in [iter] for which [fn] returned that key.
+Map<Object, List> groupBy(Iterable iter, fn(element)) {
+  var map = {};
+  for (var element in iter) {
+    var list = map.putIfAbsent(fn(element), () => []);
+    list.add(element);
+  }
+  return map;
+}
+
+/// Flattens nested lists inside an iterable into a single list containing only
+/// non-list elements.
+List flatten(Iterable nested) {
+  var result = [];
+  helper(list) {
+    for (var element in list) {
+      if (element is List) {
+        helper(element);
+      } else {
+        result.add(element);
+      }
+    }
+  }
+  helper(nested);
+  return result;
+}
+
+/// Returns the union of all elements in each set in [sets].
+Set unionAll(Iterable<Set> sets) =>
+  sets.fold(new Set(), (union, set) => union.union(set));
+
+/// Creates a new map from [map] with new keys and values.
+///
+/// The return values of [keyFn] are used as the keys and the return values of
+/// [valueFn] are used as the values for the new map.
+Map mapMap(Map map, keyFn(key, value), valueFn(key, value)) =>
+  new Map.fromIterable(map.keys,
+      key: (key) => keyFn(key, map[key]),
+      value: (key) => valueFn(key, map[key]));
+
+/// Creates a new map from [map] with the same keys.
+///
+/// The return values of [fn] are used as the values for the new map.
+Map mapMapValues(Map map, fn(key, value)) => mapMap(map, (key, _) => key, fn);
+
+/// Creates a new map from [map] with the same keys.
+///
+/// The return values of [fn] are used as the keys for the new map.
+Map mapMapKeys(Map map, fn(key, value)) => mapMap(map, fn, (_, value) => value);
+
+/// Returns whether [set1] has exactly the same elements as [set2].
+bool setEquals(Set set1, Set set2) =>
+  set1.length == set2.length && set1.containsAll(set2);
+
+/// Merges [streams] into a single stream that emits events from all sources.
+///
+/// If [broadcast] is true, this will return a broadcast stream; otherwise, it
+/// will return a buffered stream.
+Stream mergeStreams(Iterable<Stream> streams, {bool broadcast: false}) {
+  streams = streams.toList();
+  var doneCount = 0;
+  // Use a sync stream to preserve the synchrony behavior of the input streams.
+  // If the inputs are sync, then this will be sync as well; if the inputs are
+  // async, then the events we receive will also be async, and forwarding them
+  // sync won't change that.
+  var controller = broadcast ? new StreamController.broadcast(sync: true)
+      : new StreamController(sync: true);
+
+  for (var stream in streams) {
+    stream.listen(
+        controller.add,
+        onError: controller.addError,
+        onDone: () {
+      doneCount++;
+      if (doneCount == streams.length) controller.close();
+    });
+  }
+
+  return controller.stream;
+}
+
+/// Prepends each line in [text] with [prefix]. If [firstPrefix] is passed, the
+/// first line is prefixed with that instead.
+String prefixLines(String text, {String prefix: '| ', String firstPrefix}) {
+  var lines = text.split('\n');
+  if (firstPrefix == null) {
+    return lines.map((line) => '$prefix$line').join('\n');
+  }
+
+  var firstLine = "$firstPrefix${lines.first}";
+  lines = lines.skip(1).map((line) => '$prefix$line').toList();
+  lines.insert(0, firstLine);
+  return lines.join('\n');
+}
+
+/// Returns a [Future] that completes after pumping the event queue [times]
+/// times. By default, this should pump the event queue enough times to allow
+/// any code to run, as long as it's not waiting on some external event.
+Future pumpEventQueue([int times=20]) {
+  if (times == 0) return new Future.value();
+  // We use a delayed future to allow microtask events to finish. The
+  // Future.value or Future() constructors use scheduleMicrotask themselves and
+  // would therefore not wait for microtask callbacks that are scheduled after
+  // invoking this method.
+  return new Future.delayed(Duration.ZERO, () => pumpEventQueue(times - 1));
+}
+
+/// Like `new Future`, but avoids issue 11911 by using `new Future.value` under
+/// the covers.
+// TODO(jmesserly): doc comment changed to due 14601.
+Future newFuture(callback()) => new Future.value().then((_) => callback());
+
+/// Like [Future.sync], but wraps the Future in [Chain.track] as well.
+Future syncFuture(callback()) => Chain.track(new Future.sync(callback));
+
+/// Returns a buffered stream that will emit the same values as the stream
+/// returned by [future] once [future] completes.
+///
+/// If [future] completes to an error, the return value will emit that error and
+/// then close.
+///
+/// If [broadcast] is true, a broadcast stream is returned. This assumes that
+/// the stream returned by [future] will be a broadcast stream as well.
+/// [broadcast] defaults to false.
+Stream futureStream(Future<Stream> future, {bool broadcast: false}) {
+  var subscription;
+  var controller;
+
+  future = future.catchError((e, stackTrace) {
+    // Since [controller] is synchronous, it's likely that emitting an error
+    // will cause it to be cancelled before we call close.
+    if (controller != null) controller.addError(e, stackTrace);
+    if (controller != null) controller.close();
+    controller = null;
+  });
+
+  onListen() {
+    future.then((stream) {
+      if (controller == null) return;
+      subscription = stream.listen(
+          controller.add,
+          onError: controller.addError,
+          onDone: controller.close);
+    });
+  }
+
+  onCancel() {
+    if (subscription != null) subscription.cancel();
+    subscription = null;
+    controller = null;
+  }
+
+  if (broadcast) {
+    controller = new StreamController.broadcast(
+        sync: true, onListen: onListen, onCancel: onCancel);
+  } else {
+    controller = new StreamController(
+        sync: true, onListen: onListen, onCancel: onCancel);
+  }
+  return controller.stream;
+}
+
+/// Returns a [Stream] that will emit the same values as the stream returned by
+/// [callback].
+///
+/// [callback] will only be called when the returned [Stream] gets a subscriber.
+Stream callbackStream(Stream callback()) {
+  var subscription;
+  var controller;
+  controller = new StreamController(onListen: () {
+    subscription = callback().listen(controller.add,
+        onError: controller.addError,
+        onDone: controller.close);
+  },
+      onCancel: () => subscription.cancel(),
+      onPause: () => subscription.pause(),
+      onResume: () => subscription.resume(),
+      sync: true);
+  return controller.stream;
+}
+
+/// Creates a single-subscription stream from a broadcast stream.
+///
+/// The returned stream will enqueue events from [broadcast] until a listener is
+/// attached, then pipe events to that listener.
+Stream broadcastToSingleSubscription(Stream broadcast) {
+  if (!broadcast.isBroadcast) return broadcast;
+
+  // TODO(nweiz): Implement this using a transformer when issues 18588 and 18586
+  // are fixed.
+  var subscription;
+  var controller = new StreamController(onCancel: () => subscription.cancel());
+  subscription = broadcast.listen(controller.add,
+      onError: controller.addError,
+      onDone: controller.close);
+  return controller.stream;
+}
+
+/// A regular expression to match the exception prefix that some exceptions'
+/// [Object.toString] values contain.
+final _exceptionPrefix = new RegExp(r'^([A-Z][a-zA-Z]*)?(Exception|Error): ');
+
+/// Get a string description of an exception.
+///
+/// Many exceptions include the exception class name at the beginning of their
+/// [toString], so we remove that if it exists.
+String getErrorMessage(error) =>
+  error.toString().replaceFirst(_exceptionPrefix, '');
+
+/// Returns a human-friendly representation of [duration].
+String niceDuration(Duration duration) {
+  var result = duration.inMinutes > 0 ? "${duration.inMinutes}:" : "";
+
+  var s = duration.inSeconds % 59;
+  var ms = (duration.inMilliseconds % 1000) ~/ 100;
+  return result + "$s.${ms}s";
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/utils/cancelable_future.dart b/mojo/public/dart/third_party/barback/lib/src/utils/cancelable_future.dart
new file mode 100644
index 0000000..64d2b5f
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/utils/cancelable_future.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.utils.cancelable_future;
+
+import 'dart:async';
+
+/// A wrapper for [Future] that can be cancelled.
+///
+/// When this is cancelled, that means it won't complete either successfully or
+/// with an error, regardless of whether the wrapped Future completes.
+/// Cancelling this won't stop whatever code is feeding the wrapped future from
+/// running.
+class CancelableFuture<T> implements Future<T> {
+  bool _canceled = false;
+  final _completer = new Completer<T>.sync();
+
+  CancelableFuture(Future<T> inner) {
+    inner.then((result) {
+      if (_canceled) return;
+      _completer.complete(result);
+    }).catchError((error, stackTrace) {
+      if (_canceled) return;
+      _completer.completeError(error, stackTrace);
+    });
+  }
+
+  Stream<T> asStream() => _completer.future.asStream();
+  Future catchError(Function onError, {bool test(error)}) =>
+    _completer.future.catchError(onError, test: test);
+  Future then(onValue(T value), {Function onError}) =>
+    _completer.future.then(onValue, onError: onError);
+  Future<T> whenComplete(action()) => _completer.future.whenComplete(action);
+  Future timeout(Duration timeLimit, {void onTimeout()}) =>
+    _completer.future.timeout(timeLimit, onTimeout: onTimeout);
+  /// Cancels this future.
+  void cancel() {
+    _canceled = true;
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/utils/file_pool.dart b/mojo/public/dart/third_party/barback/lib/src/utils/file_pool.dart
new file mode 100644
index 0000000..6a23337
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/utils/file_pool.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.utils.file_pool;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:pool/pool.dart';
+import 'package:stack_trace/stack_trace.dart';
+
+import '../utils.dart';
+
+/// Manages a pool of files that are opened for reading to cope with maximum
+/// file descriptor limits.
+///
+/// If a file cannot be opened because too many files are already open, this
+/// will defer the open until a previously opened file is closed and then try
+/// again. If this doesn't succeed after a certain amount of time, the open
+/// will fail and the original "too many files" exception will be thrown.
+class FilePool {
+  /// The underlying pool.
+  ///
+  /// The maximum number of allocated descriptors is based on empirical tests
+  /// that indicate that beyond 32, additional file reads don't provide
+  /// substantial additional throughput.
+  final Pool _pool = new Pool(32, timeout: new Duration(seconds: 60));
+
+  /// Opens the file at [path] for reading.
+  ///
+  /// When the returned stream is listened to, if there are too many files
+  /// open, this will wait for a previously opened file to be closed and then
+  /// try again.
+  Stream<List<int>> openRead(String path) {
+    return futureStream(_pool.request().then((resource) {
+      return Chain.track(new File(path).openRead()).transform(
+          new StreamTransformer.fromHandlers(handleDone: (sink) {
+        sink.close();
+        resource.release();
+      }));
+    }));
+  }
+
+  /// Reads [path] as a string using [encoding].
+  ///
+  /// If there are too many files open and the read fails, this will wait for
+  /// a previously opened file to be closed and then try again.
+  Future<String> readAsString(String path, Encoding encoding) {
+    return _readAsBytes(path).then(encoding.decode);
+  }
+
+  /// Reads [path] as a list of bytes, using [openRead] to retry if there are
+  /// failures.
+  Future<List<int>> _readAsBytes(String path) {
+    var completer = new Completer<List<int>>();
+    var builder = new BytesBuilder();
+
+    openRead(path).listen(builder.add, onDone: () {
+      completer.complete(builder.takeBytes());
+    }, onError: completer.completeError, cancelOnError: true);
+
+    return completer.future;
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/utils/multiset.dart b/mojo/public/dart/third_party/barback/lib/src/utils/multiset.dart
new file mode 100644
index 0000000..20d1c57
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/utils/multiset.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.utils.multiset;
+
+import 'dart:collection';
+
+/// A set of objects where each object can appear multiple times.
+///
+/// Like a set, this has amortized O(1) insertion, removal, and
+/// existence-checking of elements. Counting the number of copies of an element
+/// in the set is also amortized O(1).
+///
+/// Distinct elements retain insertion order. Additional copies of an element
+/// beyond the first are grouped with the original element.
+///
+/// If multiple equal elements are added, only the first actual object is
+/// retained.
+class Multiset<E> extends IterableBase<E> {
+  /// A map from each element in the set to the number of copies of that element
+  /// in the set.
+  final _map = new Map<E, int>();
+
+  Iterator<E> get iterator {
+    return _map.keys.expand((element) {
+      return new Iterable.generate(_map[element], (_) => element);
+    }).iterator;
+  }
+
+  Multiset()
+      : super();
+
+  /// Creates a multi-set and initializes it using the contents of [other].
+  Multiset.from(Iterable<E> other)
+      : super() {
+    other.forEach(add);
+  }
+
+  /// Adds [value] to the set.
+  void add(E value) {
+    _map.putIfAbsent(value, () => 0);
+    _map[value] += 1;
+  }
+
+  /// Removes one copy of [value] from the set.
+  ///
+  /// Returns whether a copy of [value] was removed, regardless of whether more
+  /// copies remain.
+  bool remove(E value) {
+    if (!_map.containsKey(value)) return false;
+
+    _map[value] -= 1;
+    if (_map[value] == 0) _map.remove(value);
+    return true;
+  }
+
+  /// Returns whether [value] is in the set.
+  bool contains(E value) => _map.containsKey(value);
+
+  /// Returns the number of copies of [value] in the set.
+  int count(E value) => _map.containsKey(value) ? _map[value] : 0;
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/utils/stream_pool.dart b/mojo/public/dart/third_party/barback/lib/src/utils/stream_pool.dart
new file mode 100644
index 0000000..679672d
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/utils/stream_pool.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.utils.stream_pool;
+
+import 'dart:async';
+
+/// A pool of streams whose events are unified and emitted through a central
+/// stream.
+class StreamPool<T> {
+  /// The stream through which all events from streams in the pool are emitted.
+  Stream<T> get stream => _controller.stream;
+  final StreamController<T> _controller;
+
+  /// Subscriptions to the streams that make up the pool.
+  final _subscriptions = new Map<Stream<T>, StreamSubscription<T>>();
+
+  /// Creates a new stream pool that only supports a single subscriber.
+  ///
+  /// Any events from broadcast streams in the pool will be buffered until a
+  /// listener is subscribed.
+  StreamPool()
+      // Create the controller as sync so that any sync input streams will be
+      // forwarded synchronously. Async input streams will have their asynchrony
+      // preserved, since _controller.add will be called asynchronously.
+      : _controller = new StreamController<T>(sync: true);
+
+  /// Creates a new stream pool where [stream] can be listened to more than
+  /// once.
+  ///
+  /// Any events from buffered streams in the pool will be emitted immediately,
+  /// regardless of whether [stream] has any subscribers.
+  StreamPool.broadcast()
+      // Create the controller as sync so that any sync input streams will be
+      // forwarded synchronously. Async input streams will have their asynchrony
+      // preserved, since _controller.add will be called asynchronously.
+      : _controller = new StreamController<T>.broadcast(sync: true);
+
+  /// Adds [stream] as a member of this pool.
+  ///
+  /// Any events from [stream] will be emitted through [this.stream]. If
+  /// [stream] is sync, they'll be emitted synchronously; if [stream] is async,
+  /// they'll be emitted asynchronously.
+  void add(Stream<T> stream) {
+    if (_subscriptions.containsKey(stream)) return;
+    _subscriptions[stream] = stream.listen(_controller.add,
+        onError: _controller.addError,
+        onDone: () => remove(stream));
+  }
+
+  /// Removes [stream] as a member of this pool.
+  void remove(Stream<T> stream) {
+    var subscription = _subscriptions.remove(stream);
+    if (subscription != null) subscription.cancel();
+  }
+
+  /// Removes all streams from this pool and closes [stream].
+  void close() {
+    for (var subscription in _subscriptions.values) {
+      subscription.cancel();
+    }
+    _subscriptions.clear();
+    _controller.close();
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/lib/src/utils/stream_replayer.dart b/mojo/public/dart/third_party/barback/lib/src/utils/stream_replayer.dart
new file mode 100644
index 0000000..4a25085
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/lib/src/utils/stream_replayer.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.utils.stream_replayer;
+
+import 'dart:async';
+import 'dart:collection';
+
+import '../utils.dart';
+
+/// Records the values and errors that are sent through a stream and allows them
+/// to be replayed arbitrarily many times.
+///
+/// This only listens to the wrapped stream when a replayed stream gets a
+/// listener.
+class StreamReplayer<T> {
+  /// The wrapped stream.
+  final Stream<T> _stream;
+
+  /// Whether or not [this] has started listening to [_stream].
+  bool _isSubscribed = false;
+
+  /// Whether or not [_stream] has been closed.
+  bool _isClosed = false;
+
+  /// The buffer of events or errors that have already been emitted by
+  /// [_stream].
+  ///
+  /// Each element is a [Fallible] that's either a value or an error sent
+  /// through the stream.
+  final _buffer = new Queue<Fallible<T>>();
+
+  /// The controllers that are listening for future events from [_stream].
+  final _controllers = new Set<StreamController<T>>();
+
+  StreamReplayer(this._stream);
+
+  /// Returns a stream that replays the values and errors of the input stream.
+  ///
+  /// This stream is a buffered stream.
+  Stream<T> getReplay() {
+    var controller = new StreamController<T>(onListen: _subscribe);
+
+    for (var eventOrError in _buffer) {
+      if (eventOrError.hasValue) {
+        controller.add(eventOrError.value);
+      } else {
+        controller.addError(eventOrError.error, eventOrError.stackTrace);
+      }
+    }
+    if (_isClosed) {
+      controller.close();
+    } else {
+      _controllers.add(controller);
+    }
+    return controller.stream;
+  }
+
+  /// Subscribe to [_stream] if we haven't yet done so.
+  void _subscribe() {
+    if (_isSubscribed || _isClosed) return;
+    _isSubscribed = true;
+
+    _stream.listen((data) {
+      _buffer.add(new Fallible<T>.withValue(data));
+      for (var controller in _controllers) {
+        controller.add(data);
+      }
+    }, onError: (error, [stackTrace]) {
+      _buffer.add(new Fallible<T>.withError(error, stackTrace));
+      for (var controller in _controllers) {
+        controller.addError(error, stackTrace);
+      }
+    }, onDone: () {
+      _isClosed = true;
+      for (var controller in _controllers) {
+        controller.close();
+      }
+      _controllers.clear();
+    });
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/pubspec.yaml b/mojo/public/dart/third_party/barback/pubspec.yaml
new file mode 100644
index 0000000..41e7cdf
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/pubspec.yaml
@@ -0,0 +1,34 @@
+name: barback
+
+# Note! This version number is referenced directly in the pub source code in
+# lib/src/barback.dart. Pub implicitly places a version constraint on barback to
+# ensure users only select a version of barback that works with their current
+# version of pub.
+#
+# When the minor or patch version of this is upgraded, you *must* update that
+# version constraint in pub to stay in sync with this.
+version: 0.15.2+6
+
+author: "Dart Team <misc@dartlang.org>"
+homepage: http://github.com/dart-lang/barback
+description: >
+  An asset build system.
+
+  Given a set of input files and a set of transformations (think compilers,
+  preprocessors and the like), will automatically apply the appropriate
+  transforms and generate output files. When inputs are modified, automatically
+  runs the transforms that are affected.
+
+  Runs transforms asynchronously and in parallel when possible to maximize
+  responsiveness.
+dependencies:
+  path: ">=0.9.0 <2.0.0"
+  pool: ">=1.0.0 <2.0.0"
+  source_span: ">=1.0.0 <2.0.0"
+  stack_trace: ">=0.9.1 <2.0.0"
+  collection: ">=0.9.1 <2.0.0"
+dev_dependencies:
+  scheduled_test: ">=0.9.0 <0.11.0"
+  unittest: ">=0.9.0 <0.10.0"
+environment:
+  sdk: ">=1.0.1 <2.0.0"
diff --git a/mojo/public/dart/third_party/barback/test/asset_id_test.dart b/mojo/public/dart/third_party/barback/test/asset_id_test.dart
new file mode 100644
index 0000000..16d29ae
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/asset_id_test.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.asset_id_test;
+
+import 'package:barback/barback.dart';
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+main() {
+  initConfig();
+  group("constructor", () {
+    test("normalizes the path", () {
+      var id = new AssetId("app", r"path/././/to/drop/..//asset.txt");
+      expect(id.path, equals("path/to/asset.txt"));
+    });
+
+    test("normalizes backslashes to slashes in the path", () {
+      var id = new AssetId("app", r"path\to/asset.txt");
+      expect(id.path, equals("path/to/asset.txt"));
+    });
+  });
+
+  group("parse", () {
+    test("parses the package and path", () {
+      var id = new AssetId.parse("package|path/to/asset.txt");
+      expect(id.package, equals("package"));
+      expect(id.path, equals("path/to/asset.txt"));
+    });
+
+    test("throws if there are multiple '|'", () {
+      expect(() => new AssetId.parse("app|path|wtf"), throwsFormatException);
+    });
+
+    test("throws if the package name is empty '|'", () {
+      expect(() => new AssetId.parse("|asset.txt"), throwsFormatException);
+    });
+
+    test("throws if the path is empty '|'", () {
+      expect(() => new AssetId.parse("app|"), throwsFormatException);
+    });
+
+    test("normalizes the path", () {
+      var id = new AssetId.parse(r"app|path/././/to/drop/..//asset.txt");
+      expect(id.path, equals("path/to/asset.txt"));
+    });
+
+    test("normalizes backslashes to slashes in the path", () {
+      var id = new AssetId.parse(r"app|path\to/asset.txt");
+      expect(id.path, equals("path/to/asset.txt"));
+    });
+  });
+
+  test("equals another ID with the same package and path", () {
+    expect(new AssetId.parse("foo|asset.txt"), equals(
+           new AssetId.parse("foo|asset.txt")));
+
+    expect(new AssetId.parse("foo|asset.txt"), isNot(equals(
+        new AssetId.parse("bar|asset.txt"))));
+
+    expect(new AssetId.parse("foo|asset.txt"), isNot(equals(
+        new AssetId.parse("bar|other.txt"))));
+  });
+}
diff --git a/mojo/public/dart/third_party/barback/test/asset_set_test.dart b/mojo/public/dart/third_party/barback/test/asset_set_test.dart
new file mode 100644
index 0000000..f339d7e
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/asset_set_test.dart
@@ -0,0 +1,159 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.asset_set_test;
+
+import 'package:barback/barback.dart';
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+main() {
+  initConfig();
+
+  var fooId = new AssetId.parse("app|foo.txt");
+  var barId = new AssetId.parse("app|bar.txt");
+  var bazId = new AssetId.parse("app|baz.txt");
+
+  group(".from()", () {
+    test("creates a set from an iterable", () {
+      var set = new AssetSet.from([
+        new Asset.fromString(fooId, "foo"),
+        new Asset.fromString(barId, "bar")
+      ]);
+
+      expect(set.containsId(fooId), isTrue);
+      expect(set.containsId(barId), isTrue);
+      expect(set.containsId(bazId), isFalse);
+    });
+  });
+
+  group("[] operator", () {
+    test("gets an asset with the given ID", () {
+      var set = new AssetSet();
+      var foo = new Asset.fromString(fooId, "foo");
+      set.add(foo);
+
+      expect(set[fooId], equals(foo));
+    });
+
+    test("returns null if no asset with the ID is in the set", () {
+      var set = new AssetSet();
+      expect(set[fooId], isNull);
+    });
+  });
+
+  group(".add()", () {
+    test("adds the asset to the set", () {
+      var set = new AssetSet();
+      var foo = new Asset.fromString(fooId, "foo");
+      set.add(foo);
+      expect(set.contains(foo), isTrue);
+    });
+
+    test("replaces a previously added asset with that ID", () {
+      var set = new AssetSet();
+      set.add(new Asset.fromString(fooId, "before"));
+      set.add(new Asset.fromString(fooId, "after"));
+      expect(set[fooId].readAsString(), completion(equals("after")));
+    });
+
+    test("returns the added item", () {
+      var set = new AssetSet();
+      var foo = new Asset.fromString(fooId, "foo");
+      expect(set.add(foo), equals(foo));
+    });
+  });
+
+  group(".addAll()", () {
+    test("adds the assets to the set", () {
+      var set = new AssetSet();
+      var foo = new Asset.fromString(fooId, "foo");
+      var bar = new Asset.fromString(barId, "bar");
+      set.addAll([foo, bar]);
+      expect(set.contains(foo), isTrue);
+      expect(set.contains(bar), isTrue);
+    });
+
+    test("replaces assets earlier in the sequence with later ones", () {
+      var set = new AssetSet();
+      var foo1 = new Asset.fromString(fooId, "before");
+      var foo2 = new Asset.fromString(fooId, "after");
+      set.addAll([foo1, foo2]);
+      expect(set[fooId].readAsString(), completion(equals("after")));
+    });
+  });
+
+  group(".clear()", () {
+    test("empties the set", () {
+      var set = new AssetSet();
+      var foo = new Asset.fromString(fooId, "foo");
+      set.add(foo);
+      set.clear();
+
+      expect(set.length, equals(0));
+      expect(set.contains(foo), isFalse);
+    });
+  });
+
+  group(".contains()", () {
+    test("returns true if the asset is in the set", () {
+      var set = new AssetSet();
+      var foo = new Asset.fromString(fooId, "foo");
+      var bar = new Asset.fromString(barId, "bar");
+      set.add(foo);
+
+      expect(set.contains(foo), isTrue);
+      expect(set.contains(bar), isFalse);
+    });
+  });
+
+  group(".containsId()", () {
+    test("returns true if an asset with the ID is in the set", () {
+      var set = new AssetSet();
+      var foo = new Asset.fromString(fooId, "foo");
+      set.add(foo);
+
+      expect(set.containsId(fooId), isTrue);
+      expect(set.containsId(barId), isFalse);
+    });
+  });
+
+  group(".removeId()", () {
+    test("removes the asset with the ID from the set", () {
+      var set = new AssetSet();
+      var foo = new Asset.fromString(fooId, "foo");
+      set.add(foo);
+
+      set.removeId(fooId);
+      expect(set.containsId(fooId), isFalse);
+    });
+
+    test("returns the removed asset", () {
+      var set = new AssetSet();
+      var foo = new Asset.fromString(fooId, "foo");
+      set.add(foo);
+
+      expect(set.removeId(fooId).readAsString(), completion(equals("foo")));
+    });
+
+    test("returns null when removing an asset not in the set", () {
+      var set = new AssetSet();
+      var foo = new Asset.fromString(fooId, "foo");
+      set.add(foo);
+
+      expect(set.removeId(barId), isNull);
+    });
+  });
+
+  group(".ids", () {
+    test("contains the ids of all the assets in the set", () {
+      var set = new AssetSet();
+      var foo = new Asset.fromString(fooId, "foo");
+      var bar = new Asset.fromString(barId, "bar");
+      set.addAll([foo, bar]);
+      expect(set.ids, unorderedEquals([fooId, barId]));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/barback/test/asset_test.dart b/mojo/public/dart/third_party/barback/test/asset_test.dart
new file mode 100644
index 0000000..7936c71
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/asset_test.dart
@@ -0,0 +1,268 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.asset_test;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+import 'dart:isolate';
+
+import 'package:barback/barback.dart';
+import 'package:barback/src/asset/internal_asset.dart';
+import 'package:path/path.dart' as pathos;
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+/// The contents of the test binary file.
+final binaryContents = [0, 1, 2, 3, 4];
+
+main() {
+  initConfig();
+
+  Directory tempDir;
+  String binaryFilePath;
+  String textFilePath;
+  String latin1FilePath;
+
+  setUp(() {
+    // Create a temp file we can use for assets.
+    tempDir = Directory.systemTemp.createTempSync('barback_asset_test_');
+    binaryFilePath = pathos.join(tempDir.path, "file.bin");
+    new File(binaryFilePath).writeAsBytesSync(binaryContents);
+
+    textFilePath = pathos.join(tempDir.path, "file.txt");
+    new File(textFilePath).writeAsStringSync("çøñ†éℵ™");
+
+    latin1FilePath = pathos.join(tempDir.path, "file.latin1");
+    new File(latin1FilePath).writeAsBytesSync(LATIN1.encode("blåbærgrød"));
+  });
+
+  tearDown(() {
+    if (tempDir != null) tempDir.deleteSync(recursive: true);
+  });
+
+  var id = new AssetId.parse("package|path/to/asset.txt");
+
+  group("Asset.fromBytes", () {
+    test("returns an asset with the given ID", () {
+      var asset = new Asset.fromBytes(id, [1]);
+      expect(asset.id, equals(id));
+    });
+  });
+
+  group("Asset.fromFile", () {
+    test("returns an asset with the given ID", () {
+      var asset = new Asset.fromFile(id, new File("asset.txt"));
+      expect(asset.id, equals(id));
+    });
+  });
+
+  group("Asset.fromPath", () {
+    test("returns an asset with the given ID", () {
+      var asset = new Asset.fromPath(id, "asset.txt");
+      expect(asset.id, equals(id));
+    });
+  });
+
+  group("Asset.fromString", () {
+    test("returns an asset with the given ID", () {
+      var asset = new Asset.fromString(id, "content");
+      expect(asset.id, equals(id));
+    });
+  });
+
+  group("Asset.fromStream", () {
+    test("returns an asset with the given ID", () {
+      var asset = new Asset.fromStream(id,
+          new Stream.fromFuture(new Future.value([104, 101, 108, 108, 111])));
+      expect(asset.id, equals(id));
+    });
+  });
+
+  group("read()", () {
+    test("gets the UTF-8-encoded string for a string asset", () {
+      var asset = new Asset.fromString(id, "çøñ†éℵ™");
+      expect(asset.read().toList(),
+          completion(equals([UTF8.encode("çøñ†éℵ™")])));
+    });
+
+    test("gets the raw bytes for a byte asset", () {
+      var asset = new Asset.fromBytes(id, binaryContents);
+      expect(asset.read().toList(),
+          completion(equals([binaryContents])));
+    });
+
+    test("gets the raw bytes for a binary file", () {
+      var asset = new Asset.fromPath(id, binaryFilePath);
+      expect(asset.read().toList(),
+          completion(equals([binaryContents])));
+    });
+
+    test("gets the raw bytes for a text file", () {
+      var asset = new Asset.fromPath(id, textFilePath);
+      expect(asset.read().toList(),
+          completion(equals([UTF8.encode("çøñ†éℵ™")])));
+    });
+
+    test("gets the raw bytes for a stream", () {
+      var asset = new Asset.fromStream(id,
+          new Stream.fromFuture(new Future.value(UTF8.encode("çøñ†éℵ™"))));
+      expect(asset.read().toList(),
+          completion(equals([UTF8.encode("çøñ†éℵ™")])));
+    });
+  });
+
+  group("readAsString()", () {
+    group("byte asset", () {
+      test("defaults to UTF-8 if encoding is omitted", () {
+        var asset = new Asset.fromBytes(id, UTF8.encode("çøñ†éℵ™"));
+        expect(asset.readAsString(),
+            completion(equals("çøñ†éℵ™")));
+      });
+
+      test("supports UTF-8", () {
+        var asset = new Asset.fromBytes(id, UTF8.encode("çøñ†éℵ™"));
+        expect(asset.readAsString(encoding: UTF8),
+            completion(equals("çøñ†éℵ™")));
+      });
+
+      // TODO(rnystrom): Test other encodings once #6284 is fixed.
+    });
+
+    group("string asset", () {
+      test("gets the string", () {
+        var asset = new Asset.fromString(id, "contents");
+        expect(asset.readAsString(),
+            completion(equals("contents")));
+      });
+
+      test("ignores the encoding", () {
+        var asset = new Asset.fromString(id, "contents");
+        expect(asset.readAsString(encoding: LATIN1),
+            completion(equals("contents")));
+      });
+    });
+
+    group("file asset", () {
+      test("defaults to UTF-8 if encoding is omitted", () {
+        var asset = new Asset.fromPath(id, textFilePath);
+        expect(asset.readAsString(),
+            completion(equals("çøñ†éℵ™")));
+      });
+    });
+
+    group("stream asset", () {
+      test("defaults to UTF-8 if encoding is omitted", () {
+        var asset = new Asset.fromStream(id,
+            new Stream.fromFuture(new Future.value(UTF8.encode("çøñ†éℵ™"))));
+        expect(asset.readAsString(),
+            completion(equals("çøñ†éℵ™")));
+      });
+
+      test("supports UTF-8", () {
+        var asset = new Asset.fromStream(id,
+            new Stream.fromFuture(new Future.value(UTF8.encode("çøñ†éℵ™"))));
+        expect(asset.readAsString(encoding: UTF8),
+            completion(equals("çøñ†éℵ™")));
+      });
+
+      test("supports ISO-8859-1", () {
+        var future = new Future.value(LATIN1.encode("blåbærgrød"));
+        var asset = new Asset.fromStream(id, new Stream.fromFuture(future));
+        expect(asset.readAsString(encoding: LATIN1),
+            completion(equals("blåbærgrød")));
+      });
+    });
+  });
+
+  group("toString()", () {
+    group("byte asset", () {
+      test("shows the list of bytes in hex", () {
+        var asset = new Asset.fromBytes(id,
+            [0, 1, 2, 4, 8, 16, 32, 64, 128, 255]);
+        expect(asset.toString(), equals(
+            "Bytes [00 01 02 04 08 10 20 40 80 ff]"));
+      });
+
+      test("truncates the middle of there are more than ten bytes", () {
+        var asset = new Asset.fromBytes(id,
+            [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]);
+        expect(asset.toString(), equals(
+            "Bytes [01 02 03 04 05 ... 0a 0b 0c 0d 0e]"));
+      });
+    });
+
+    group("string asset", () {
+      test("shows the contents", () {
+        var asset = new Asset.fromString(id, "contents");
+        expect(asset.toString(), equals(
+            'String "contents"'));
+      });
+
+      test("truncates the middle of there are more than 40 characters", () {
+        var asset = new Asset.fromString(id,
+            "this is a fairly long string asset content that gets shortened");
+        expect(asset.toString(), equals(
+            'String "this is a fairly lon ...  that gets shortened"'));
+      });
+    });
+
+    group("file asset", () {
+      test("shows the file path", () {
+        var asset = new Asset.fromPath(id, "path.txt");
+        expect(asset.toString(), equals('File "path.txt"'));
+      });
+    });
+  });
+
+  group("across isolates", () {
+    getBytesFromIsolate(Asset asset) {
+      var port = new ReceivePort();
+      return Isolate.spawn(_getAssetBytes, {
+        'asset': serializeAsset(asset),
+        'replyTo': port.sendPort
+      }).then((_) => port.first);
+    }
+
+    test("gets the UTF-8-encoded string for a string asset", () {
+      var asset = new Asset.fromString(id, "çøñ†éℵ™");
+      expect(getBytesFromIsolate(asset),
+          completion(equals(UTF8.encode("çøñ†éℵ™"))));
+    });
+
+    test("gets the raw bytes for a byte asset", () {
+      var asset = new Asset.fromBytes(id, binaryContents);
+      expect(getBytesFromIsolate(asset),
+          completion(equals(binaryContents)));
+    });
+
+    test("gets the raw bytes for a binary file", () {
+      var asset = new Asset.fromPath(id, binaryFilePath);
+      expect(getBytesFromIsolate(asset),
+          completion(equals(binaryContents)));
+    });
+
+    test("gets the raw bytes for a text file", () {
+      var asset = new Asset.fromPath(id, textFilePath);
+      expect(getBytesFromIsolate(asset),
+          completion(equals(UTF8.encode("çøñ†éℵ™"))));
+    });
+
+    test("gets the raw bytes for a stream", () {
+      var asset = new Asset.fromStream(id,
+          new Stream.fromFuture(new Future.value(UTF8.encode("çøñ†éℵ™"))));
+      expect(getBytesFromIsolate(asset),
+          completion(equals(UTF8.encode("çøñ†éℵ™"))));
+    });
+  });
+}
+
+void _getAssetBytes(message) {
+  var asset = deserializeAsset(message['asset']);
+  var builder = asset.read().fold(new BytesBuilder(),
+      (builder, chunk) => builder..add(chunk));
+  builder.then((builder) => message['replyTo'].send(builder.takeBytes()));
+}
diff --git a/mojo/public/dart/third_party/barback/test/barback_mode_test.dart b/mojo/public/dart/third_party/barback/test/barback_mode_test.dart
new file mode 100644
index 0000000..2d18f09
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/barback_mode_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.barback_mode_test;
+
+import 'package:barback/barback.dart';
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+main() {
+  initConfig();
+  test("constructor uses canonical instances for DEBUG and RELEASE", () {
+    expect(identical(BarbackMode.DEBUG,
+        new BarbackMode(BarbackMode.DEBUG.name)), isTrue);
+    expect(identical(BarbackMode.RELEASE,
+        new BarbackMode(BarbackMode.RELEASE.name)), isTrue);
+  });
+}
diff --git a/mojo/public/dart/third_party/barback/test/cancelable_future_test.dart b/mojo/public/dart/third_party/barback/test/cancelable_future_test.dart
new file mode 100644
index 0000000..6535894
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/cancelable_future_test.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.cancelable_future_test;
+
+import 'dart:async';
+
+import 'package:barback/src/utils.dart';
+import 'package:barback/src/utils/cancelable_future.dart';
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+main() {
+  initConfig();
+
+  var completer;
+  var future;
+  setUp(() {
+    completer = new Completer();
+    future = new CancelableFuture(completer.future);
+  });
+
+  group("when not canceled", () {
+    test("correctly completes successfully", () {
+      expect(future, completion(equals("success")));
+      completer.complete("success");
+    });
+
+    test("correctly completes with an error", () {
+      expect(future, throwsA(equals("error")));
+      completer.completeError("error");
+    });
+  });
+
+  group("when canceled", () {
+    test("never completes successfully", () {
+      var completed = false;
+      future.whenComplete(() {
+        completed = true;
+      });
+
+      future.cancel();
+      completer.complete("success");
+
+      expect(pumpEventQueue().then((_) => completed), completion(isFalse));
+    });
+
+    test("never completes with an error", () {
+      var completed = false;
+      future.catchError((_) {}).whenComplete(() {
+        completed = true;
+      });
+
+      future.cancel();
+      completer.completeError("error");
+
+      expect(pumpEventQueue().then((_) => completed), completion(isFalse));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/barback/test/logger_test.dart b/mojo/public/dart/third_party/barback/test/logger_test.dart
new file mode 100644
index 0000000..5c42b2e
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/logger_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.logger_test;
+
+import 'package:barback/barback.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import 'utils.dart';
+import 'transformer/log.dart';
+
+main() {
+  initConfig();
+
+  test("logs messages from a transformer", () {
+    var transformer = new LogTransformer([
+      "error: This is an error.",
+      "warning: This is a warning.",
+      "info: This is info.",
+      "fine: This is fine."
+    ]);
+    initGraph(["app|foo.txt"], {
+      "app": [[transformer]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    buildShouldLog(LogLevel.ERROR, equals("This is an error."));
+    buildShouldLog(LogLevel.WARNING, equals("This is a warning."));
+    buildShouldLog(LogLevel.INFO, equals("This is info."));
+    buildShouldLog(LogLevel.FINE, equals("This is fine."));
+  });
+
+  test("logs messages from a transformer group", () {
+    var transformer = new LogTransformer([
+      "error: This is an error.",
+      "warning: This is a warning.",
+      "info: This is info.",
+      "fine: This is fine."
+    ]);
+
+    initGraph(["app|foo.txt"], {"app": [
+      [new TransformerGroup([[transformer]])]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    buildShouldLog(LogLevel.ERROR, equals("This is an error."));
+    buildShouldLog(LogLevel.WARNING, equals("This is a warning."));
+    buildShouldLog(LogLevel.INFO, equals("This is info."));
+    buildShouldLog(LogLevel.FINE, equals("This is fine."));
+  });
+}
diff --git a/mojo/public/dart/third_party/barback/test/multiset_test.dart b/mojo/public/dart/third_party/barback/test/multiset_test.dart
new file mode 100644
index 0000000..7b6f09f
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/multiset_test.dart
@@ -0,0 +1,79 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.multiset_test;
+
+import 'package:barback/src/utils/multiset.dart';
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+main() {
+  initConfig();
+
+  test("new Multiset() creates an empty set", () {
+    var multiSet = new Multiset();
+    expect(multiSet, isEmpty);
+    expect(multiSet.contains(1), isFalse);
+    expect(multiSet.count(1), equals(0));
+  });
+
+  test("new Multiset.from(...) constructs a set from the argument", () {
+    var multiSet = new Multiset.from([1, 2, 3, 2, 4]);
+    expect(multiSet.toList(), equals([1, 2, 2, 3, 4]));
+    expect(multiSet.contains(1), isTrue);
+    expect(multiSet.contains(5), isFalse);
+    expect(multiSet.count(1), equals(1));
+    expect(multiSet.count(2), equals(2));
+    expect(multiSet.count(5), equals(0));
+  });
+
+  test("an element can be added and removed once", () {
+    var multiSet = new Multiset();
+    expect(multiSet.contains(1), isFalse);
+    multiSet.add(1);
+    expect(multiSet.contains(1), isTrue);
+    multiSet.remove(1);
+    expect(multiSet.contains(1), isFalse);
+  });
+
+  test("a set can contain multiple copies of an element", () {
+    var multiSet = new Multiset();
+    expect(multiSet.count(1), equals(0));
+    multiSet.add(1);
+    expect(multiSet.count(1), equals(1));
+    multiSet.add(1);
+    expect(multiSet.count(1), equals(2));
+    multiSet.remove(1);
+    expect(multiSet.count(1), equals(1));
+    multiSet.remove(1);
+    expect(multiSet.count(1), equals(0));
+  });
+
+  test("remove returns false if the element wasn't in the set", () {
+    var multiSet = new Multiset();
+    expect(multiSet.remove(1), isFalse);
+  });
+
+  test("remove returns true if the element was in the set", () {
+    var multiSet = new Multiset.from([1]);
+    expect(multiSet.remove(1), isTrue);
+  });
+
+  test("remove returns true if the element was in the set even if more copies "
+      "remain", () {
+    var multiSet = new Multiset.from([1, 1, 1]);
+    expect(multiSet.remove(1), isTrue);
+  });
+
+  test("iterator orders distinct elements in insertion order", () {
+    var multiSet = new Multiset()..add(1)..add(2)..add(3)..add(4)..add(5);
+    expect(multiSet.toList(), equals([1, 2, 3, 4, 5]));
+  });
+
+  test("iterator groups multiple copies of an element together", () {
+    var multiSet = new Multiset()..add(1)..add(2)..add(1)..add(2)..add(1);
+    expect(multiSet.toList(), equals([1, 1, 1, 2, 2]));
+  });
+}
diff --git a/mojo/public/dart/third_party/barback/test/package_graph/add_remove_transform_test.dart b/mojo/public/dart/third_party/barback/test/package_graph/add_remove_transform_test.dart
new file mode 100644
index 0000000..d3839ee
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/package_graph/add_remove_transform_test.dart
@@ -0,0 +1,390 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.package_graph.transform_test;
+
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../utils.dart';
+
+main() {
+  initConfig();
+  test("a new transformer is applied to a matching asset", () {
+    initGraph(["app|foo.blub"]);
+
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blub", "foo");
+    buildShouldSucceed();
+
+    updateTransformers("app", [[new RewriteTransformer("blub", "blab")]]);
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+  });
+
+  test("a new transformer is not applied to a non-matching asset", () {
+    initGraph(["app|foo.blub"]);
+
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blub", "foo");
+    buildShouldSucceed();
+
+    updateTransformers("app", [[new RewriteTransformer("zip", "zap")]]);
+    expectAsset("app|foo.blub", "foo");
+    expectNoAsset("app|foo.zap");
+    buildShouldSucceed();
+  });
+
+  test("updateTransformers doesn't re-run an old transformer", () {
+    var rewrite = new RewriteTransformer("blub", "blab");
+    initGraph(["app|foo.blub"], {"app": [[rewrite]]});
+
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+
+    updateTransformers("app", [[rewrite]]);
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+
+    expect(rewrite.numRuns, completion(equals(1)));
+  });
+
+  test("updateTransformers re-runs old transformers in a new phase", () {
+    var rewrite1 = new RewriteTransformer("txt", "blub");
+    var rewrite2 = new RewriteTransformer("blub", "blab");
+    initGraph(["app|foo.txt"], {"app": [[rewrite1], [rewrite2]]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.blab", "foo.blub.blab");
+    buildShouldSucceed();
+
+    updateTransformers("app", [[rewrite2], [rewrite1]]);
+    expectAsset("app|foo.blub", "foo.blub");
+    expectNoAsset("app|foo.blab");
+    buildShouldSucceed();
+  });
+
+  test("updateTransformers re-runs an old transformer when a previous phase "
+      "changes", () {
+    var rewrite = new RewriteTransformer("txt", "out");
+    initGraph(["app|foo.txt"], {"app": [[], [rewrite]]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.out", "foo.out");
+    buildShouldSucceed();
+
+    updateTransformers("app", [
+      [new RewriteTransformer("txt", "txt")],
+      [rewrite]
+    ]);
+    expectAsset("app|foo.out", "foo.txt.out");
+    buildShouldSucceed();
+  });
+
+  test("a removed transformer is no longer applied", () {
+    initGraph(["app|foo.blub"], {"app": [
+      [new RewriteTransformer("blub", "blab")]
+    ]});
+
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+
+    updateTransformers("app", []);
+    expectAsset("app|foo.blub", "foo");
+    expectNoAsset("app|foo.blab");
+    buildShouldSucceed();
+  });
+
+  test("a new transformer is pipelined", () {
+    var rewrite1 = new RewriteTransformer("source", "phase1");
+    var rewrite3 = new RewriteTransformer("phase2", "phase3");
+    initGraph(["app|foo.source"], {"app": [
+      [rewrite1],
+      [rewrite3]
+    ]});
+
+    updateSources(["app|foo.source"]);
+    expectNoAsset("app|foo.phase3");
+    buildShouldSucceed();
+
+    updateTransformers("app", [
+      [rewrite1],
+      [new RewriteTransformer("phase1", "phase2")],
+      [rewrite3]
+    ]);
+    expectAsset("app|foo.phase3", "foo.phase1.phase2.phase3");
+    buildShouldSucceed();
+  });
+
+  test("a removed transformer is un-pipelined", () {
+    var rewrite1 = new RewriteTransformer("source", "phase1");
+    var rewrite3 = new RewriteTransformer("phase2", "phase3");
+    initGraph(["app|foo.source"], {"app": [
+      [rewrite1],
+      [new RewriteTransformer("phase1", "phase2")],
+      [rewrite3]
+    ]});
+
+    updateSources(["app|foo.source"]);
+    expectAsset("app|foo.phase3", "foo.phase1.phase2.phase3");
+    buildShouldSucceed();
+
+    updateTransformers("app", [[rewrite1], [rewrite3]]);
+    expectNoAsset("app|foo.phase3");
+    buildShouldSucceed();
+  });
+
+  test("a transformer is removed during isPrimary", () {
+    var rewrite = new RewriteTransformer("blub", "blab");
+    initGraph(["app|foo.blub"], {"app": [[rewrite]]});
+
+    rewrite.pauseIsPrimary("app|foo.blub");
+    updateSources(["app|foo.blub"]);
+    // Ensure we're waiting on [rewrite.isPrimary].
+    schedule(pumpEventQueue);
+
+    updateTransformers("app", []);
+    rewrite.resumeIsPrimary("app|foo.blub");
+    expectAsset("app|foo.blub", "foo");
+    expectNoAsset("app|foo.blab");
+    buildShouldSucceed();
+  });
+
+  test("a transformer is removed during apply", () {
+    var rewrite = new RewriteTransformer("blub", "blab");
+    initGraph(["app|foo.blub"], {"app": [[rewrite]]});
+
+    rewrite.pauseApply();
+    updateSources(["app|foo.blub"]);
+    // Ensure we're waiting on [rewrite.apply].
+    schedule(pumpEventQueue);
+
+    updateTransformers("app", []);
+    rewrite.resumeApply();
+    expectAsset("app|foo.blub", "foo");
+    expectNoAsset("app|foo.blab");
+    buildShouldSucceed();
+  });
+
+  test("a transformer is added to an existing phase during isPrimary", () {
+    var rewrite = new RewriteTransformer("blub", "blab");
+    initGraph(["app|foo.blub", "app|bar.blib"], {"app": [[rewrite]]});
+
+    rewrite.pauseIsPrimary("app|foo.blub");
+    updateSources(["app|foo.blub", "app|bar.blib"]);
+    // Ensure we're waiting on [rewrite.isPrimary].
+    schedule(pumpEventQueue);
+
+    updateTransformers("app", [
+      [rewrite, new RewriteTransformer("blib", "blob")]
+    ]);
+    rewrite.resumeIsPrimary("app|foo.blub");
+    expectAsset("app|foo.blab", "foo.blab");
+    expectAsset("app|bar.blob", "bar.blob");
+    buildShouldSucceed();
+  });
+
+  test("a cross-package transform sees a new transformer in a new phase", () {
+    var rewrite = new RewriteTransformer("inc", "inc");
+    initGraph({
+      "pkg1|foo.txt": "pkg2|foo.inc",
+      "pkg2|foo.inc": "foo"
+    }, {
+      "pkg1": [[new ManyToOneTransformer("txt")]],
+      "pkg2": [[rewrite]]
+    });
+
+    updateSources(["pkg1|foo.txt", "pkg2|foo.inc"]);
+    expectAsset("pkg1|foo.out", "foo.inc");
+    buildShouldSucceed();
+
+    updateTransformers("pkg2", [
+      [rewrite],
+      [new RewriteTransformer("inc", "inc")]
+    ]);
+    expectAsset("pkg1|foo.out", "foo.inc.inc");
+    buildShouldSucceed();
+  });
+
+  test("a cross-package transform doesn't see a removed transformer in a "
+      "removed phase", () {
+    var rewrite = new RewriteTransformer("inc", "inc");
+    initGraph({
+      "pkg1|foo.txt": "pkg2|foo.inc",
+      "pkg2|foo.inc": "foo"
+    }, {
+      "pkg1": [[new ManyToOneTransformer("txt")]],
+      "pkg2": [
+        [rewrite],
+        [new RewriteTransformer("inc", "inc")]
+      ]
+    });
+
+    updateSources(["pkg1|foo.txt", "pkg2|foo.inc"]);
+    expectAsset("pkg1|foo.out", "foo.inc.inc");
+    buildShouldSucceed();
+
+    updateTransformers("pkg2", [[rewrite]]);
+    expectAsset("pkg1|foo.out", "foo.inc");
+    buildShouldSucceed();
+  });
+
+  group("pass-through", () {
+    test("a new transformer can see pass-through assets", () {
+      var rewrite = new RewriteTransformer("zip", "zap");
+      initGraph(["app|foo.blub"], {"app": [[rewrite]]});
+
+      updateSources(["app|foo.blub"]);
+      buildShouldSucceed();
+
+      updateTransformers("app", [
+        [rewrite],
+        [new RewriteTransformer("blub", "blab")]
+      ]);
+      expectAsset("app|foo.blab", "foo.blab");
+      buildShouldSucceed();
+    });
+
+    test("a new transformer can overwrite an old asset", () {
+      var rewrite = new RewriteTransformer("zip", "zap");
+      initGraph(["app|foo.txt"], {"app": [[rewrite]]});
+
+      updateSources(["app|foo.txt"]);
+      expectAsset("app|foo.txt", "foo");
+      buildShouldSucceed();
+
+      // Add a transformer that will overwrite the previously-passed-through
+      // "foo.txt" asset. The transformed asset should be emitted, not the
+      // passed-through asset.
+      updateTransformers("app", [
+        [rewrite, new RewriteTransformer("txt", "txt")]
+      ]);
+      expectAsset("app|foo.txt", "foo.txt");
+      buildShouldSucceed();
+    });
+
+    test("passes an asset through when an overwriting transform is removed",
+        () {
+      initGraph(["app|foo.txt"], {
+        "app": [[new RewriteTransformer("txt", "txt")]]
+      });
+
+      updateSources(["app|foo.txt"]);
+      expectAsset("app|foo.txt", "foo.txt");
+      buildShouldSucceed();
+
+      updateTransformers("app", [[]]);
+      expectAsset("app|foo.txt", "foo");
+      buildShouldSucceed();
+    });
+
+    test("passes an asset through when its overwriting transform is removed "
+        "during apply", () {
+      var rewrite = new RewriteTransformer("txt", "txt");
+      initGraph(["app|foo.txt"], {"app": [[rewrite]]});
+
+      rewrite.pauseApply();
+      updateSources(["app|foo.txt"]);
+      expectAssetDoesNotComplete("app|foo.txt");
+
+      updateTransformers("app", [[]]);
+      rewrite.resumeApply();
+      expectAsset("app|foo.txt", "foo");
+      buildShouldSucceed();
+    });
+
+    test("doesn't pass an asset through when its overwriting transform is "
+        "removed during apply if another transform overwrites it", () {
+      var rewrite1 = new RewriteTransformer("txt", "txt");
+      var rewrite2 = new RewriteTransformer("txt", "txt");
+      initGraph(["app|foo.txt"], {"app": [[rewrite1, rewrite2]]});
+
+      rewrite1.pauseApply();
+      updateSources(["app|foo.txt"]);
+      expectAsset("app|foo.txt", "foo.txt");
+      // Ensure we're waiting on [rewrite1.apply]
+      schedule(pumpEventQueue);
+
+      updateTransformers("app", [[rewrite2]]);
+      rewrite1.resumeApply();
+      expectAsset("app|foo.txt", "foo.txt");
+      buildShouldSucceed();
+    });
+
+    test("doesn't pass an asset through when one overwriting transform is "
+        "removed if another transform still overwrites it", () {
+      var rewrite = new RewriteTransformer("txt", "txt");
+      initGraph(["app|foo.txt"], {"app": [[
+        rewrite,
+        new RewriteTransformer("txt", "txt")
+      ]]});
+
+      updateSources(["app|foo.txt"]);
+      // This could be either the output of [CheckContentTransformer] or
+      // [RewriteTransformer], depending which completes first.
+      expectAsset("app|foo.txt", anything);
+      buildShouldFail([isAssetCollisionException("app|foo.txt")]);
+
+      updateTransformers("app", [[rewrite]]);
+      expectAsset("app|foo.txt", "foo.txt");
+      buildShouldSucceed();
+    });
+  });
+
+  // Regression test.
+  test("a phase is added, then an input is removed and re-added", () {
+    var rewrite = new RewriteTransformer("txt", "mid");
+    initGraph(["app|foo.txt"], {
+      "app": [[rewrite]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.mid", "foo.mid");
+    buildShouldSucceed();
+
+    updateTransformers("app", [
+      [rewrite],
+      [new RewriteTransformer("mid", "out")]
+    ]);
+    expectAsset("app|foo.out", "foo.mid.out");
+    buildShouldSucceed();
+
+    removeSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.out");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.out", "foo.mid.out");
+    buildShouldSucceed();
+  });
+
+  // Regression test for issue 19540.
+  test("a phase is removed and then one of its inputs is updated", () {
+    // Have an empty first phase because the first phase is never removed.
+    initGraph(["app|foo.txt"], {
+      "app": [[], [new RewriteTransformer("txt", "out")]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.out", "foo.out");
+    buildShouldSucceed();
+
+    // First empty both phases. This allows the second phase to be considered
+    // idle even when its transformer is no longer running.
+    updateTransformers("app", [[], []]);
+    buildShouldSucceed();
+
+    // Now remove the second phase. It should unsubscribe from its input's
+    // events.
+    updateTransformers("app", [[]]);
+    buildShouldSucceed();
+
+    // Update the input. With issue 19540, this would cause the removed phase to
+    // try to update its status, which would crash.
+    updateSources(["app|foo.txt"]);
+    buildShouldSucceed();
+  });
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/barback/test/package_graph/collisions_test.dart b/mojo/public/dart/third_party/barback/test/package_graph/collisions_test.dart
new file mode 100644
index 0000000..91d00a0
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/package_graph/collisions_test.dart
@@ -0,0 +1,203 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.package_graph.source_test;
+
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../utils.dart';
+
+main() {
+  initConfig();
+
+  test("errors if two transformers output the same file", () {
+    initGraph(["app|foo.a"], {"app": [
+      [
+        new RewriteTransformer("a", "b"),
+        new RewriteTransformer("a", "b")
+      ]
+    ]});
+    updateSources(["app|foo.a"]);
+
+    buildShouldFail([isAssetCollisionException("app|foo.b")]);
+  });
+
+  test("errors if a new transformer outputs the same file as an old "
+      "transformer", () {
+    initGraph(["app|foo.a", "app|foo.b"], {"app": [
+      [
+        new RewriteTransformer("a", "c"),
+        new RewriteTransformer("b", "c")
+      ]
+    ]});
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.c", "foo.c");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.b"]);
+    buildShouldFail([isAssetCollisionException("app|foo.c")]);
+  });
+
+  test("a collision returns the first-produced output", () {
+    var rewrite1 = new RewriteTransformer("one", "out");
+    var rewrite2 = new RewriteTransformer("two", "out");
+    initGraph({
+      "app|foo.one": "one",
+      "app|foo.two": "two"
+    }, {"app": [[rewrite1, rewrite2]]});
+
+    rewrite1.pauseApply();
+    updateSources(["app|foo.one", "app|foo.two"]);
+    // Wait long enough to ensure that rewrite2 has completed.
+    schedule(pumpEventQueue);
+
+    rewrite1.resumeApply();
+    expectAsset("app|foo.out", "two.out");
+    buildShouldFail([isAssetCollisionException("app|foo.out")]);
+
+    // Even after the collision is discovered, the first-produced output should
+    // be returned.
+    expectAsset("app|foo.out", "two.out");
+
+    // Even if the other output is updated more recently, the first output
+    // should continue to take precedence.
+    updateSources(["app|foo.one"]);
+    expectAsset("app|foo.out", "two.out");
+  });
+
+  test("a collision that is later resolved produces an output", () {
+    initGraph({
+      "app|foo.one": "one",
+      "app|foo.two": "two"
+    }, {"app": [
+      [
+        new RewriteTransformer("one", "out"),
+        new RewriteTransformer("two", "out")
+      ]
+    ]});
+
+    updateSources(["app|foo.one"]);
+    expectAsset("app|foo.out", "one.out");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.two"]);
+    expectAsset("app|foo.out", "one.out");
+    buildShouldFail([isAssetCollisionException("app|foo.out")]);
+
+    removeSources(["app|foo.one"]);
+    expectAsset("app|foo.out", "two.out");
+    buildShouldSucceed();
+  });
+
+  test("a collision that is later resolved runs transforms", () {
+    initGraph({
+      "app|foo.one": "one",
+      "app|foo.two": "two"
+    }, {"app": [
+      [
+        new RewriteTransformer("one", "mid"),
+        new RewriteTransformer("two", "mid")
+      ],
+      [new RewriteTransformer("mid", "out")]
+    ]});
+
+    updateSources(["app|foo.one"]);
+    expectAsset("app|foo.out", "one.mid.out");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.two"]);
+    expectAsset("app|foo.out", "one.mid.out");
+    buildShouldFail([isAssetCollisionException("app|foo.mid")]);
+
+    removeSources(["app|foo.one"]);
+    expectAsset("app|foo.out", "two.mid.out");
+    buildShouldSucceed();
+  });
+
+  test("a collision that is partially resolved returns the second completed "
+      "output", () {
+    var rewrite1 = new RewriteTransformer("one", "out");
+    var rewrite2 = new RewriteTransformer("two", "out");
+    var rewrite3 = new RewriteTransformer("three", "out");
+    initGraph({
+      "app|foo.one": "one",
+      "app|foo.two": "two",
+      "app|foo.three": "three"
+    }, {"app": [[rewrite1, rewrite2, rewrite3]]});
+
+    // Make rewrite3 the most-recently-completed transformer from the first run.
+    rewrite2.pauseApply();
+    rewrite3.pauseApply();
+    updateSources(["app|foo.one", "app|foo.two", "app|foo.three"]);
+    schedule(pumpEventQueue);
+    rewrite2.resumeApply();
+    schedule(pumpEventQueue);
+    rewrite3.resumeApply();
+    buildShouldFail([
+      isAssetCollisionException("app|foo.out"),
+      isAssetCollisionException("app|foo.out")
+    ]);
+
+    // Then update rewrite3 in a separate build. rewrite2 should still be the
+    // next version of foo.out in line.
+    // TODO(nweiz): Should this emit a collision error as well? Or should they
+    // only be emitted when a file is added or removed?
+    updateSources(["app|foo.three"]);
+    buildShouldSucceed();
+
+    removeSources(["app|foo.one"]);
+    expectAsset("app|foo.out", "two.out");
+    buildShouldFail([isAssetCollisionException("app|foo.out")]);
+  });
+
+  test("a collision with a pass-through asset returns the pass-through asset",
+      () {
+    initGraph([
+      "app|foo.txt",
+      "app|foo.in"
+    ], {"app": [
+      [new RewriteTransformer("in", "txt")]
+    ]});
+
+    updateSources(["app|foo.txt", "app|foo.in"]);
+    expectAsset("app|foo.txt", "foo");
+    buildShouldFail([isAssetCollisionException("app|foo.txt")]);
+  });
+
+  test("a new pass-through asset that collides returns the previous asset", () {
+    initGraph([
+      "app|foo.txt",
+      "app|foo.in"
+    ], {"app": [
+      [new RewriteTransformer("in", "txt")]
+    ]});
+
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.txt", "foo.txt");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt", "foo.txt");
+    buildShouldFail([isAssetCollisionException("app|foo.txt")]);
+  });
+
+  test("a new transform output that collides with a pass-through asset returns "
+      "the pass-through asset", () {
+    initGraph([
+      "app|foo.txt",
+      "app|foo.in"
+    ], {"app": [
+      [new RewriteTransformer("in", "txt")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt", "foo");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.txt", "foo");
+    buildShouldFail([isAssetCollisionException("app|foo.txt")]);
+  });
+}
diff --git a/mojo/public/dart/third_party/barback/test/package_graph/declaring_transformer_test.dart b/mojo/public/dart/third_party/barback/test/package_graph/declaring_transformer_test.dart
new file mode 100644
index 0000000..aa830df
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/package_graph/declaring_transformer_test.dart
@@ -0,0 +1,371 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.package_graph.declaring_transformer_test;
+
+import 'package:barback/barback.dart';
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../utils.dart';
+
+main() {
+  initConfig();
+
+  test("gets a declared output with a different path", () {
+    initGraph(["app|foo.blub"], {"app": [
+      [new DeclaringRewriteTransformer("blub", "blab")]
+    ]});
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+  });
+
+  test("gets a declared output with the same path", () {
+    initGraph(["app|foo.blub"], {"app": [
+      [new DeclaringRewriteTransformer("blub", "blub")]
+    ]});
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blub", "foo.blub");
+    buildShouldSucceed();
+  });
+
+  test("gets a passed-through asset", () {
+    initGraph(["app|foo.blub"], {"app": [
+      [new DeclaringRewriteTransformer("blub", "blab")]
+    ]});
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blub", "foo");
+    buildShouldSucceed();
+  });
+
+  test("doesn't get a consumed asset", () {
+    initGraph(["app|foo.blub"], {"app": [
+      [new DeclaringRewriteTransformer("blub", "blab")..consumePrimary = true]
+    ]});
+    updateSources(["app|foo.blub"]);
+    expectNoAsset("app|foo.blub");
+    buildShouldSucceed();
+  });
+
+  test("gets a passed-through asset before apply is finished", () {
+    var transformer = new DeclaringRewriteTransformer("blub", "blab");
+    initGraph(["app|foo.blub"], {"app": [[transformer]]});
+
+    transformer.pauseApply();
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blub", "foo");
+
+    transformer.resumeApply();
+    buildShouldSucceed();
+  });
+
+  test("fails to get a consumed asset before apply is finished", () {
+    var transformer = new DeclaringRewriteTransformer("blub", "blab")
+        ..consumePrimary = true;
+    initGraph(["app|foo.blub"], {"app": [[transformer]]});
+  
+    transformer.pauseApply();
+    updateSources(["app|foo.blub"]);
+    expectNoAsset("app|foo.blub");
+  
+    transformer.resumeApply();
+    buildShouldSucceed();
+  });
+
+  test("blocks on getting a declared asset that wasn't generated last run", () {
+    var transformer = new DeclaringCheckContentAndRenameTransformer(
+          oldExtension: "txt", oldContent: "yes",
+          newExtension: "out", newContent: "done");
+    initGraph({"app|foo.txt": "no"}, {"app": [[transformer]]});
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.out");
+    buildShouldSucceed();
+
+    // The transform should remember that foo.out was declared, so it should
+    // expect that it might still be generated even though it wasn't last time.
+    transformer.pauseApply();
+    modifyAsset("app|foo.txt", "yes");
+    updateSources(["app|foo.txt"]);
+    expectAssetDoesNotComplete("app|foo.out");
+
+    transformer.resumeApply();
+    expectAsset("app|foo.out", "done");
+    buildShouldSucceed();
+  });
+
+  test("doesn't block on on getting an undeclared asset that wasn't generated "
+      "last run", () {
+    var transformer = new DeclaringCheckContentAndRenameTransformer(
+          oldExtension: "txt", oldContent: "yes",
+          newExtension: "out", newContent: "done");
+    initGraph({"app|foo.txt": "no"}, {"app": [[transformer]]});
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.out");
+    buildShouldSucceed();
+
+    transformer.pauseApply();
+    modifyAsset("app|foo.txt", "yes");
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|undeclared.out");
+
+    transformer.resumeApply();
+    buildShouldSucceed();
+  });
+
+  test("fails to get a consumed asset before apply is finished when a sibling "
+      "has finished applying", () {
+    var transformer = new DeclaringRewriteTransformer("blub", "blab")
+        ..consumePrimary = true;
+    initGraph(["app|foo.blub", "app|foo.txt"], {"app": [[
+      transformer,
+      new RewriteTransformer("txt", "out")
+    ]]});
+  
+    transformer.pauseApply();
+    updateSources(["app|foo.blub", "app|foo.txt"]);
+    expectAsset("app|foo.out", "foo.out");
+    expectNoAsset("app|foo.blub");
+  
+    transformer.resumeApply();
+    buildShouldSucceed();
+  });
+
+  test("blocks getting a consumed asset before apply is finished when a "
+      "sibling hasn't finished applying", () {
+    var declaring = new DeclaringRewriteTransformer("blub", "blab")
+        ..consumePrimary = true;
+    var eager = new RewriteTransformer("txt", "out");
+    initGraph(["app|foo.blub", "app|foo.txt"], {"app": [[declaring, eager]]});
+  
+    declaring.pauseApply();
+    eager.pauseApply();
+    updateSources(["app|foo.blub", "app|foo.txt"]);
+    expectAssetDoesNotComplete("app|foo.blub");
+  
+    declaring.resumeApply();
+    eager.resumeApply();
+    expectNoAsset("app|foo.blub");
+    buildShouldSucceed();
+  });
+
+  test("waits until apply is finished to get an overwritten asset", () {
+    var transformer = new DeclaringRewriteTransformer("blub", "blub");
+    initGraph(["app|foo.blub"], {"app": [[transformer]]});
+
+    transformer.pauseApply();
+    updateSources(["app|foo.blub"]);
+    expectAssetDoesNotComplete("app|foo.blub");
+
+    transformer.resumeApply();
+    expectAsset("app|foo.blub", "foo.blub");
+    buildShouldSucceed();
+  });
+
+  // Regression test for #64.
+  test("a declaring transformer's output passes through a lazy transformer",
+      () {
+    var declaring = new DeclaringRewriteTransformer("one", "two");
+    initGraph(["app|foo.one"], {"app": [
+      [declaring],
+      [new LazyRewriteTransformer("two", "three")]
+    ]});
+
+    updateSources(["app|foo.one"]);
+    // Give the transformers time to declare their assets.
+    schedule(pumpEventQueue);
+
+    expectAsset("app|foo.one", "foo");
+    expectAsset("app|foo.two", "foo.two");
+    expectAsset("app|foo.three", "foo.two.three");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.one", "bar");
+    updateSources(["app|foo.one"]);
+
+    expectAsset("app|foo.one", "bar");
+    expectAsset("app|foo.two", "bar.two");
+    expectAsset("app|foo.three", "bar.two.three");
+    buildShouldSucceed();
+
+    expect(declaring.numRuns, completion(equals(2)));
+  });
+
+  test("a declaring transformer following a lazy transformer runs eagerly once "
+      "its input is available", () {
+    var declaring = new DeclaringRewriteTransformer("two", "three");
+    initGraph(["app|foo.in"], {"app": [
+      [new LazyAssetsTransformer(["app|out.one", "app|out.two"])],
+      [declaring]
+    ]});
+
+    updateSources(["app|foo.in"]);
+    // Give the transformers time to declare their assets.
+    schedule(pumpEventQueue);
+
+    expectAsset("app|out.one", "app|out.one");
+    buildShouldSucceed();
+
+    expect(declaring.numRuns, completion(equals(1)));
+  });
+
+  test("a declaring transformer following a lazy transformer doesn't re-run if "
+      "its input becomes available and then unavailable", () {
+    var declaring = new DeclaringRewriteTransformer("two", "three");
+    initGraph(["app|foo.in"], {"app": [
+      [new LazyAssetsTransformer(["app|out.one", "app|out.two"])],
+      [declaring]
+    ]});
+
+    declaring.pauseApply();
+    updateSources(["app|foo.in"]);
+    // Give the transformers time to declare their assets.
+    schedule(pumpEventQueue);
+
+    // Start [declaring] running, because its input became available.
+    expectAsset("app|out.one", "app|out.one");
+
+    // Make sure we're blocking on [declaring.apply].
+    schedule(pumpEventQueue);
+
+    // Now [declaring]'s input is dirty, so it shouldn't re-run without an
+    // explicit request.
+    updateSources(["app|foo.in"]);
+    declaring.resumeApply();
+    buildShouldSucceed();
+
+    // [declaring] should only have run once, despite its input changing. After
+    // the first run, it should be awaiting a force() call.
+    expect(declaring.numRuns, completion(equals(1)));
+
+    // Once we make a request, [declaring] should force the lazy transformer and
+    // then run itself.
+    expectAsset("app|out.three", "app|out.two.three");
+    buildShouldSucceed();
+
+    // Now [declaring] should have run twice. This ensures that it didn't use
+    // its original output for some reason.
+    expect(declaring.numRuns, completion(equals(2)));
+  });
+
+  test("a declaring transformer following a lazy transformer does re-run if "
+      "its input becomes available, it's forced, and then its input becomes "
+      "unavailable", () {
+    var declaring = new DeclaringRewriteTransformer("two", "three");
+    initGraph(["app|foo.in"], {"app": [
+      [new LazyAssetsTransformer(["app|out.one", "app|out.two"])],
+      [declaring]
+    ]});
+
+    declaring.pauseApply();
+    updateSources(["app|foo.in"]);
+
+    // Give the transformers time to declare their assets.
+    schedule(pumpEventQueue);
+
+    // Start [declaring] running, because its input became available.
+    expectAsset("app|out.one", "app|out.one");
+
+    // This shouldn't complete because [declaring.apply] is paused, but it
+    // should force the transformer.
+    expectAssetDoesNotComplete("app|out.three");
+
+    // Make sure we're blocking on [declaring.apply]
+    schedule(pumpEventQueue);
+
+    // Now [declaring]'s input is dirty, so it shouldn't re-run without an
+    // explicit request.
+    updateSources(["app|foo.in"]);
+    declaring.resumeApply();
+    buildShouldSucceed();
+
+    // [declaring] should have run twice, once for its original input and once
+    // after the input changed because it was forced.
+    expect(declaring.numRuns, completion(equals(2)));
+  });
+
+  group("with an error in declareOutputs", () {
+    test("still runs apply", () {
+      initGraph(["app|foo.txt"], {"app": [[
+        new DeclaringBadTransformer("app|out.txt",
+            declareError: true, applyError: false)
+      ]]});
+
+      updateSources(["app|foo.txt"]);
+      expectAsset("app|out.txt", "bad out");
+      expectAsset("app|foo.txt", "foo");
+      buildShouldFail([isTransformerException(BadTransformer.ERROR)]);
+    });
+
+    test("waits for apply to complete before passing through the input even if "
+        "consumePrimary was called", () {
+      var transformer = new DeclaringBadTransformer("app|out.txt",
+            declareError: true, applyError: false)..consumePrimary = true;
+      initGraph(["app|foo.txt"], {"app": [[transformer]]});
+
+      transformer.pauseApply();
+      updateSources(["app|foo.txt"]);
+      expectAssetDoesNotComplete("app|out.txt");
+      expectAssetDoesNotComplete("app|foo.txt");
+
+      transformer.resumeApply();
+      expectAsset("app|out.txt", "bad out");
+      expectNoAsset("app|foo.txt");
+      buildShouldFail([isTransformerException(BadTransformer.ERROR)]);
+    });
+  });
+
+  test("with an error in apply still passes through the input", () {
+   initGraph(["app|foo.txt"], {"app": [[
+     new DeclaringBadTransformer("app|out.txt",
+         declareError: false, applyError: true)
+   ]]});
+
+   updateSources(["app|foo.txt"]);
+   expectNoAsset("app|out.txt");
+   expectAsset("app|foo.txt", "foo");
+   buildShouldFail([isTransformerException(BadTransformer.ERROR)]);
+  });
+
+  test("can emit outputs it didn't declare", () {
+    initGraph(["app|foo.txt"], {"app": [
+      [new DeclareAssetsTransformer([], emitted: ["app|out.txt"])]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    // There's probably going to be some time when "out.txt" is unavailable,
+    // since it was undeclared.
+    schedule(pumpEventQueue);
+    expectAsset("app|out.txt", "app|out.txt");
+    buildShouldSucceed();
+  });
+
+  test("can overwrite the primary input even if it declared that it wouldn't",
+      () {
+    var transformer = new DeclareAssetsTransformer(
+        [], emitted: ["app|foo.txt"]);
+    initGraph(["app|foo.txt"], {"app": [[transformer]]});
+
+    transformer.pauseApply();
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt", "foo");
+
+    transformer.resumeApply();
+    schedule(pumpEventQueue);
+    expectAsset("app|foo.txt", "app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("can declare outputs it doesn't emit", () {
+    initGraph(["app|foo.txt"], {"app": [
+      [new DeclareAssetsTransformer(["app|out.txt"], emitted: [])]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|out.txt");
+    buildShouldSucceed();
+  });
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/barback/test/package_graph/errors_test.dart b/mojo/public/dart/third_party/barback/test/package_graph/errors_test.dart
new file mode 100644
index 0000000..1b578a5
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/package_graph/errors_test.dart
@@ -0,0 +1,213 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.package_graph.source_test;
+
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../utils.dart';
+
+main() {
+  initConfig();
+
+  test("does not report asset not found errors in results", () {
+    initGraph(["app|bar.txt"]);
+
+    // Trigger a build.
+    updateSources(["app|bar.txt"]);
+
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("reports an error for an unprovided package", () {
+    initGraph();
+    expect(() => updateSourcesSync(["unknown|foo.txt"]), throwsArgumentError);
+  });
+
+  test("reports an error for an unprovided source", () {
+    initGraph(["app|known.txt"], {"app": [
+      // Have a dummy transformer so that barback at least tries to load the
+      // asset.
+      [new RewriteTransformer("a", "b")]
+    ]});
+
+    updateSources(["app|unknown.txt"]);
+
+    buildShouldFail([
+      isAssetLoadException("app|unknown.txt",
+          isAssetNotFoundException("app|unknown.txt"))
+    ]);
+  });
+
+  test("reports missing input errors in results", () {
+    initGraph({"app|a.txt": "a.inc"}, {"app": [
+      [new ManyToOneTransformer("txt")]
+    ]});
+
+    updateSources(["app|a.txt"]);
+    expectNoAsset("app|a.out");
+    buildShouldFail([isMissingInputException("app|a.inc")]);
+  });
+
+  test("reports an error if a transformer emits an asset for another package",
+      () {
+    initGraph(["app|foo.txt"], {
+      "app": [[new CreateAssetTransformer("wrong|foo.txt")]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    buildShouldFail([isInvalidOutputException("wrong|foo.txt")]);
+  });
+
+  test("fails if a non-primary input is removed", () {
+    initGraph({
+      "app|a.txt": "a.inc,b.inc,c.inc",
+      "app|a.inc": "a",
+      "app|b.inc": "b",
+      "app|c.inc": "c"
+    }, {"app": [
+      [new ManyToOneTransformer("txt")]
+    ]});
+
+    updateSources(["app|a.txt", "app|a.inc", "app|b.inc", "app|c.inc"]);
+    expectAsset("app|a.out", "abc");
+    buildShouldSucceed();
+
+    removeSources(["app|b.inc"]);
+    buildShouldFail([isMissingInputException("app|b.inc")]);
+    expectNoAsset("app|a.out");
+  });
+
+  test("catches transformer exceptions and reports them", () {
+    initGraph(["app|foo.txt"], {"app": [
+      [new BadTransformer(["app|foo.out"])]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.out");
+    buildShouldFail([isTransformerException(equals(BadTransformer.ERROR))]);
+  });
+
+  test("catches errors even if nothing is waiting for process results", () {
+    initGraph(["app|foo.txt"], {"app": [[new BadTransformer([])]]});
+
+    updateSources(["app|foo.txt"]);
+    // Note: No asset requests here.
+    buildShouldFail([isTransformerException(equals(BadTransformer.ERROR))]);
+  });
+
+  test("discards outputs from failed transforms", () {
+    initGraph(["app|foo.txt"], {"app": [
+      [new BadTransformer(["a.out", "b.out"])]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|a.out");
+  });
+
+  test("fails if only one package fails", () {
+    initGraph(["pkg1|foo.txt", "pkg2|foo.txt"],
+        {"pkg1": [[new BadTransformer([])]]});
+
+    updateSources(["pkg1|foo.txt", "pkg2|foo.txt"]);
+    expectAsset("pkg2|foo.txt", "foo");
+    buildShouldFail([isTransformerException(equals(BadTransformer.ERROR))]);
+  });
+
+  test("emits multiple failures if multiple packages fail", () {
+    initGraph(["pkg1|foo.txt", "pkg2|foo.txt"], {
+      "pkg1": [[new BadTransformer([])]],
+      "pkg2": [[new BadTransformer([])]]
+    });
+
+    updateSources(["pkg1|foo.txt", "pkg2|foo.txt"]);
+    buildShouldFail([
+      isTransformerException(equals(BadTransformer.ERROR)),
+      isTransformerException(equals(BadTransformer.ERROR))
+    ]);
+  });
+
+  test("an error loading an asset removes the asset from the graph", () {
+    initGraph(["app|foo.txt"], {"app": [
+      // Have a dummy transformer so that barback at least tries to load the
+      // asset.
+      [new RewriteTransformer("a", "b")]
+    ]});
+
+    setAssetError("app|foo.txt");
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.txt");
+    buildShouldFail([
+      isAssetLoadException("app|foo.txt", isMockLoadException("app|foo.txt"))
+    ]);
+  });
+
+  test("a synchronous error loading an asset removes the asset from the graph",
+      () {
+    initGraph(["app|foo.txt"], {"app": [
+      // Have a dummy transformer so that barback at least tries to load the
+      // asset.
+      [new RewriteTransformer("a", "b")]
+    ]});
+
+    setAssetError("app|foo.txt", async: false);
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.txt");
+    buildShouldFail([
+      isAssetLoadException("app|foo.txt", isMockLoadException("app|foo.txt"))
+    ]);
+  });
+
+  test("an asset isn't passed through a transformer with an error", () {
+    initGraph(["app|foo.txt"], {"app": [[new BadTransformer([])]]});
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.txt");
+    buildShouldFail([isTransformerException(equals(BadTransformer.ERROR))]);
+  });
+
+  test("a transformer that logs errors shouldn't produce output", () {
+    initGraph(["app|foo.txt"], {"app": [
+      [new BadLogTransformer(["app|out.txt"])]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.txt");
+    expectNoAsset("app|out.txt");
+    buildShouldFail([
+      isTransformerException(equals("first error")),
+      isTransformerException(equals("second error"))
+    ]);
+  });
+
+  test("a transformer can catch an error loading a secondary input", () {
+    initGraph(["app|foo.txt"], {"app": [
+      [new CatchAssetNotFoundTransformer(".txt", "app|nothing")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt", "failed to load app|nothing");
+    buildShouldSucceed();
+  });
+
+  test("a transformer that fails due to a missing secondary input is re-run "
+      "when that input appears", () {
+    initGraph({
+      "app|foo.txt": "bar.inc",
+      "app|bar.inc": "bar"
+    }, {"app": [
+      [new ManyToOneTransformer("txt")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.out");
+    buildShouldFail([isMissingInputException("app|bar.inc")]);
+
+    updateSources(["app|bar.inc"]);
+    expectAsset("app|foo.out", "bar");
+    buildShouldSucceed();
+  });
+}
diff --git a/mojo/public/dart/third_party/barback/test/package_graph/get_all_assets_test.dart b/mojo/public/dart/third_party/barback/test/package_graph/get_all_assets_test.dart
new file mode 100644
index 0000000..08da238
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/package_graph/get_all_assets_test.dart
@@ -0,0 +1,100 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.barback_test;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../utils.dart';
+
+main() {
+  initConfig();
+
+  test("gets all source assets", () {
+    initGraph(["app|a.txt", "app|b.txt", "app|c.txt"]);
+    updateSources(["app|a.txt", "app|b.txt", "app|c.txt"]);
+    expectAllAssets(["app|a.txt", "app|b.txt", "app|c.txt"]);
+    buildShouldSucceed();
+  });
+
+  test("includes transformed outputs", () {
+    initGraph(["app|a.txt", "app|foo.blub"], {"app": [
+      [new RewriteTransformer("blub", "blab")]
+    ]});
+    updateSources(["app|a.txt", "app|foo.blub"]);
+    expectAllAssets(["app|a.txt", "app|foo.blub", "app|foo.blab"]);
+    buildShouldSucceed();
+  });
+
+  test("includes overwritten outputs", () {
+    initGraph(["app|a.txt", "app|foo.blub"], {"app": [
+      [new RewriteTransformer("blub", "blub")]
+    ]});
+    updateSources(["app|a.txt", "app|foo.blub"]);
+    expectAllAssets({
+      "app|a.txt": "a",
+      "app|foo.blub": "foo.blub"
+    });
+    buildShouldSucceed();
+  });
+
+  test("completes to an error if two transformers output the same file", () {
+    initGraph(["app|foo.a"], {"app": [
+      [
+        new RewriteTransformer("a", "b"),
+        new RewriteTransformer("a", "b")
+      ]
+    ]});
+    updateSources(["app|foo.a"]);
+    expectAllAssetsShouldFail(isAssetCollisionException("app|foo.b"));
+  });
+
+  test("completes to an error if a transformer fails", () {
+    initGraph(["app|foo.txt"], {"app": [
+      [new BadTransformer(["app|foo.out"])]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectAllAssetsShouldFail(isTransformerException(
+        equals(BadTransformer.ERROR)));
+  });
+
+  test("completes to an aggregate error if there are multiple errors", () {
+    initGraph(["app|foo.txt"], {"app": [
+      [
+        new BadTransformer(["app|foo.out"]),
+        new BadTransformer(["app|foo.out2"])
+      ]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectAllAssetsShouldFail(isAggregateException([
+      isTransformerException(equals(BadTransformer.ERROR)),
+      isTransformerException(equals(BadTransformer.ERROR))
+    ]));
+  });
+
+  // Regression test.
+  test("getAllAssets() is called synchronously after after initializing "
+      "barback", () {
+    var provider = new MockProvider({
+      "app|a.txt": "a",
+      "app|b.txt": "b",
+      "app|c.txt": "c"
+    });
+    var barback = new Barback(provider);
+    barback.updateSources([
+      new AssetId.parse("app|a.txt"),
+      new AssetId.parse("app|b.txt"),
+      new AssetId.parse("app|c.txt")
+    ]);
+
+    expect(barback.getAllAssets().then((assets) {
+      return Future.wait(assets.map((asset) => asset.readAsString()));
+    }), completion(unorderedEquals(["a", "b", "c"])));
+  });
+}
diff --git a/mojo/public/dart/third_party/barback/test/package_graph/group_test.dart b/mojo/public/dart/third_party/barback/test/package_graph/group_test.dart
new file mode 100644
index 0000000..4e2cb44
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/package_graph/group_test.dart
@@ -0,0 +1,473 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.package_graph.group_test;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../utils.dart';
+
+main() {
+  initConfig();
+  test("runs transforms in a group", () {
+    initGraph(["app|foo.a"], {"app": [
+      [new TransformerGroup([
+        [new RewriteTransformer("a", "b")],
+        [new RewriteTransformer("b", "c")]
+      ])]
+    ]});
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.c", "foo.b.c");
+    buildShouldSucceed();
+  });
+
+  test("passes the output of a group to the next phase", () {
+    initGraph(["app|foo.a"], {"app": [
+      [new TransformerGroup([
+        [new RewriteTransformer("a", "b")],
+        [new RewriteTransformer("b", "c")]
+      ])],
+      [new RewriteTransformer("c", "d")]
+    ]});
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.d", "foo.b.c.d");
+    buildShouldSucceed();
+  });
+
+  test("passes the output of a previous phase to a group", () {
+    initGraph(["app|foo.a"], {"app": [
+      [new RewriteTransformer("a", "b")],
+      [new TransformerGroup([
+        [new RewriteTransformer("b", "c")],
+        [new RewriteTransformer("c", "d")]
+      ])]
+    ]});
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.d", "foo.b.c.d");
+    buildShouldSucceed();
+  });
+
+  test("intermediate assets in a group are usable as secondary inputs within "
+      "that group", () {
+    initGraph({
+      "app|foo.a": "contents",
+      "app|bar.txt": "foo.inc"
+    }, {"app": [
+      [new TransformerGroup([
+        [new RewriteTransformer("a", "inc")],
+        [new ManyToOneTransformer("txt")]
+      ])]
+    ]});
+
+    updateSources(["app|foo.a", "app|bar.txt"]);
+    expectAsset("app|bar.out", "contents.inc");
+    buildShouldSucceed();
+  });
+
+  test("groups can be nested", () {
+    initGraph(["app|foo.a", "app|bar.x"], {"app": [
+      [new TransformerGroup([
+        [new TransformerGroup([
+          [new RewriteTransformer("a", "b")],
+          [new RewriteTransformer("b", "c")]
+        ]), new TransformerGroup([
+          [new RewriteTransformer("x", "y"), new RewriteTransformer("a", "y")],
+          [new RewriteTransformer("y", "z")]
+        ])],
+        [new RewriteTransformer("c", "d")]
+      ])]
+    ]});
+    updateSources(["app|foo.a", "app|bar.x"]);
+    expectAsset("app|foo.d", "foo.b.c.d");
+    expectAsset("app|foo.z", "foo.y.z");
+    expectAsset("app|bar.z", "bar.y.z");
+    buildShouldSucceed();
+  });
+
+  test("an updated asset is propagated through a group", () {
+    initGraph(["app|foo.a"], {"app": [
+      [new TransformerGroup([
+        [new RewriteTransformer("a", "b")],
+        [new RewriteTransformer("b", "c")]
+      ])]
+    ]});
+
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.c", "foo.b.c");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.a", "new foo");
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.c", "new foo.b.c");
+    buildShouldSucceed();
+  });
+
+  test("an updated asset only runs the necessary transforms in a group", () {
+    var rewriteA = new RewriteTransformer("a", "b");
+    var rewriteX = new RewriteTransformer("x", "b");
+    initGraph(["app|foo.a", "app|bar.x"], {"app": [
+      [new TransformerGroup([
+        [rewriteA, rewriteX],
+        [new RewriteTransformer("b", "c")]
+      ])]
+    ]});
+
+    updateSources(["app|foo.a", "app|bar.x"]);
+    expectAsset("app|foo.c", "foo.b.c");
+    expectAsset("app|bar.c", "bar.b.c");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.a", "new foo");
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.c", "new foo.b.c");
+    buildShouldSucceed();
+
+    expect(rewriteA.numRuns, completion(equals(2)));
+    expect(rewriteX.numRuns, completion(equals(1)));
+  });
+
+  group("encapsulation", () {
+    test("a group can't see a parallel transform's outputs", () {
+      initGraph(["app|foo.x"], {"app": [[
+        new TransformerGroup([
+          [new RewriteTransformer("a", "b")],
+          [new RewriteTransformer("b", "c")]
+        ]),
+        new RewriteTransformer("x", "b")
+      ]]});
+      updateSources(["app|foo.x"]);
+      expectAsset("app|foo.b", "foo.b");
+      expectNoAsset("app|foo.c");
+      buildShouldSucceed();
+    });
+
+    test("a parallel transform can't see a group's outputs", () {
+      initGraph(["app|foo.a"], {"app": [[
+        new TransformerGroup([
+          [new RewriteTransformer("a", "b")],
+          [new RewriteTransformer("b", "c")]
+        ]),
+        new RewriteTransformer("c", "z")
+      ]]});
+      updateSources(["app|foo.a"]);
+      expectAsset("app|foo.c", "foo.b.c");
+      expectNoAsset("app|foo.z");
+      buildShouldSucceed();
+    });
+
+    test("a parallel transform can't see a group's intermediate assets", () {
+      initGraph(["app|foo.a"], {"app": [[
+        new TransformerGroup([
+          [new RewriteTransformer("a", "b")],
+          [new RewriteTransformer("b", "c")]
+        ]),
+        new RewriteTransformer("b", "z")
+      ]]});
+      updateSources(["app|foo.a"]);
+      expectAsset("app|foo.c", "foo.b.c");
+      expectNoAsset("app|foo.z");
+      buildShouldSucceed();
+    });
+
+    test("parallel groups can't see one another's intermediate assets", () {
+      initGraph(["app|foo.a", "app|bar.x"], {"app": [
+        [new TransformerGroup([
+          [new RewriteTransformer("a", "b")],
+          [new RewriteTransformer("b", "c")]
+        ]), new TransformerGroup([
+          [new RewriteTransformer("x", "b")],
+          [new RewriteTransformer("b", "z")]
+        ])]
+      ]});
+      updateSources(["app|foo.a", "app|bar.x"]);
+      expectAsset("app|foo.c", "foo.b.c");
+      expectAsset("app|bar.z", "bar.b.z");
+      expectNoAsset("app|foo.z");
+      expectNoAsset("app|bar.c");
+      buildShouldSucceed();
+    });
+
+    test("parallel groups' intermediate assets can't collide", () {
+      initGraph(["app|foo.a", "app|foo.x"], {"app": [
+        [new TransformerGroup([
+          [new RewriteTransformer("a", "b")],
+          [new RewriteTransformer("b", "c")..consumePrimary = true]
+        ]), new TransformerGroup([
+          [new RewriteTransformer("x", "b")],
+          [new RewriteTransformer("b", "z")..consumePrimary = true]
+        ])]
+      ]});
+      updateSources(["app|foo.a", "app|foo.x"]);
+      expectAsset("app|foo.a");
+      expectAsset("app|foo.x");
+      expectAsset("app|foo.c", "foo.b.c");
+      expectAsset("app|foo.z", "foo.b.z");
+      buildShouldSucceed();
+    });
+  });
+
+  group("pass-through", () {
+    test("passes an unused input through a group", () {
+      initGraph(["app|foo.x"], {"app": [
+        [new TransformerGroup([
+          [new RewriteTransformer("a", "b")],
+          [new RewriteTransformer("b", "c")]
+        ])]
+      ]});
+      updateSources(["app|foo.x"]);
+      expectNoAsset("app|foo.c");
+      expectAsset("app|foo.x", "foo");
+      buildShouldSucceed();
+    });
+
+    test("passes non-overwritten inputs through a group", () {
+      initGraph(["app|foo.a"], {"app": [
+        [new TransformerGroup([
+          [new RewriteTransformer("a", "b")],
+          [new RewriteTransformer("b", "c")]
+        ])]
+      ]});
+      updateSources(["app|foo.a"]);
+      expectAsset("app|foo.a", "foo");
+      expectAsset("app|foo.b", "foo.b");
+      expectAsset("app|foo.c", "foo.b.c");
+      buildShouldSucceed();
+    });
+
+    test("passes an unused input through parallel groups", () {
+      initGraph(["app|foo.x"], {"app": [
+        [new TransformerGroup([
+          [new RewriteTransformer("a", "b")],
+          [new RewriteTransformer("b", "c")]
+        ]), new TransformerGroup([
+          [new RewriteTransformer("1", "2")],
+          [new RewriteTransformer("2", "3")]
+        ])]
+      ]});
+      updateSources(["app|foo.x"]);
+      expectNoAsset("app|foo.c");
+      expectNoAsset("app|foo.3");
+      expectAsset("app|foo.x", "foo");
+      buildShouldSucceed();
+    });
+
+    test("passes an unused input through a group and a transform", () {
+      initGraph(["app|foo.x"], {"app": [[
+        new TransformerGroup([
+          [new RewriteTransformer("a", "b")],
+          [new RewriteTransformer("b", "c")]
+        ]),
+        new RewriteTransformer("1", "2")
+      ]]});
+      updateSources(["app|foo.x"]);
+      expectNoAsset("app|foo.c");
+      expectNoAsset("app|foo.2");
+      expectAsset("app|foo.x", "foo");
+      buildShouldSucceed();
+    });
+
+    test("doesn't pass through an input that's overwritten by a group but not "
+        "by transformers", () {
+      initGraph(["app|foo.a"], {"app": [[
+        new TransformerGroup([
+          [new RewriteTransformer("a", "a")],
+        ]),
+        new RewriteTransformer("x", "y")
+      ]]});
+      updateSources(["app|foo.a"]);
+      expectNoAsset("app|foo.y");
+      expectAsset("app|foo.a", "foo.a");
+      buildShouldSucceed();
+    });
+
+    test("doesn't pass through an input that's overwritten by transformers but "
+        "not by a group", () {
+      initGraph(["app|foo.x"], {"app": [[
+        new TransformerGroup([
+          [new RewriteTransformer("a", "b")],
+          [new RewriteTransformer("b", "c")]
+        ]),
+        new RewriteTransformer("x", "x")
+      ]]});
+      updateSources(["app|foo.x"]);
+      expectNoAsset("app|foo.c");
+      expectAsset("app|foo.x", "foo.x");
+      buildShouldSucceed();
+    });
+
+    test("doesn't pass through an input that's consumed by a group but not "
+        "by transformers", () {
+      initGraph(["app|foo.a"], {"app": [[
+        new TransformerGroup([
+          [new RewriteTransformer("a", "b")..consumePrimary = true],
+        ]),
+        new RewriteTransformer("x", "y")
+      ]]});
+      updateSources(["app|foo.a"]);
+      expectNoAsset("app|foo.a");
+      expectAsset("app|foo.b", "foo.b");
+      buildShouldSucceed();
+    });
+
+    test("doesn't pass through an input that's consumed by transformers but "
+        "not by a group", () {
+      initGraph(["app|foo.x"], {"app": [[
+        new TransformerGroup([
+          [new RewriteTransformer("a", "b")],
+          [new RewriteTransformer("b", "c")]
+        ]),
+        new RewriteTransformer("x", "y")..consumePrimary = true
+      ]]});
+      updateSources(["app|foo.x"]);
+      expectNoAsset("app|foo.x");
+      expectAsset("app|foo.y", "foo.y");
+      buildShouldSucceed();
+    });
+
+    test("doesn't detect a collision for an input that's modified in-place by "
+        "a transformer", () {
+      initGraph(["app|foo.x"], {"app": [[
+        new TransformerGroup([
+          [new RewriteTransformer("a", "b")],
+          [new RewriteTransformer("b", "c")]
+        ]),
+        new RewriteTransformer("x", "x")
+      ]]});
+      updateSources(["app|foo.x"]);
+      expectAsset("app|foo.x", "foo.x");
+      buildShouldSucceed();
+    });
+
+    test("doesn't detect a collision for an input that's modified in-place by "
+        "a group", () {
+      initGraph(["app|foo.a"], {"app": [[
+        new TransformerGroup([[new RewriteTransformer("a", "a")]]),
+        new RewriteTransformer("x", "y")
+      ]]});
+      updateSources(["app|foo.a"]);
+      expectAsset("app|foo.a", "foo.a");
+      buildShouldSucceed();
+    });
+  });
+
+  test("runs transforms in an added group", () {
+    var rewrite = new RewriteTransformer("a", "z");
+    initGraph(["app|foo.a"], {"app": [[rewrite]]});
+
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.z", "foo.z");
+    buildShouldSucceed();
+
+    updateTransformers("app", [[
+      rewrite,
+      new TransformerGroup([
+        [new RewriteTransformer("a", "b")],
+        [new RewriteTransformer("b", "c")]
+      ])
+    ]]);
+    expectAsset("app|foo.z", "foo.z");
+    expectAsset("app|foo.c", "foo.b.c");
+    buildShouldSucceed();
+  });
+
+  test("doesn't re-run transforms in a re-added group", () {
+    var rewrite1 = new RewriteTransformer("a", "b");
+    var rewrite2 = new RewriteTransformer("b", "c");
+    var group = new TransformerGroup([[rewrite1], [rewrite2]]);
+    initGraph(["app|foo.a"], {"app": [[group]]});
+
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.c", "foo.b.c");
+    buildShouldSucceed();
+
+    updateTransformers("app", [
+      [group, new RewriteTransformer("a", "z")]
+    ]);
+    expectAsset("app|foo.c", "foo.b.c");
+    expectAsset("app|foo.z", "foo.z");
+    buildShouldSucceed();
+
+    expect(rewrite1.numRuns, completion(equals(1)));
+    expect(rewrite2.numRuns, completion(equals(1)));
+  });
+
+  test("doesn't run transforms in a removed group", () {
+    var rewrite1 = new RewriteTransformer("a", "b");
+    var rewrite2 = new RewriteTransformer("b", "c");
+    var group = new TransformerGroup([[rewrite1], [rewrite2]]);
+    initGraph(["app|foo.a"], {"app": [[group]]});
+
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.c", "foo.b.c");
+    buildShouldSucceed();
+
+    updateTransformers("app", []);
+    expectNoAsset("app|foo.c");
+    buildShouldSucceed();
+  });
+
+  test("doesn't pass through an input that's overwritten by an added group",
+      () {
+    var rewrite = new RewriteTransformer("x", "z");
+    initGraph(["app|foo.a"], {"app": [[rewrite]]});
+
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.a", "foo");
+    buildShouldSucceed();
+
+    updateTransformers("app", [
+      [rewrite, new TransformerGroup([[new RewriteTransformer("a", "a")]])]
+    ]);
+    expectAsset("app|foo.a", "foo.a");
+    buildShouldSucceed();
+  });
+
+  // TODO(nweiz): make the collision error message nice
+  test("reports collisions within a group", () {
+    initGraph(["app|foo.a", "app|foo.x"], {"app": [
+      [new TransformerGroup([
+        [new RewriteTransformer("a", "b")],
+        [new RewriteTransformer("x", "b")]
+      ])]
+    ]});
+    updateSources(["app|foo.a", "app|foo.x"]);
+    buildShouldFail([isAssetCollisionException("app|foo.b")]);
+  });
+
+  test("reports collisions between a group and a non-grouped transform", () {
+    initGraph(["app|foo.a", "app|foo.x"], {"app": [[
+      new TransformerGroup([
+        [new RewriteTransformer("a", "b")],
+        [new RewriteTransformer("b", "c")]
+      ]),
+      new RewriteTransformer("x", "c")
+    ]]});
+    updateSources(["app|foo.a", "app|foo.x"]);
+    buildShouldFail([isAssetCollisionException("app|foo.c")]);
+  });
+
+  // Regression test for issue 18872.
+  test("a multi-phase group's outputs should be visible as secondary inputs "
+      "for a following group", () {
+    initGraph({
+      "app|foo.txt": "bar.c",
+      "app|bar.a": "bar"
+    }, {"app": [
+      [new TransformerGroup([
+        [new RewriteTransformer("a", "b")],
+        [new RewriteTransformer("b", "c")]
+      ])],
+      [new TransformerGroup([
+        [new ManyToOneTransformer("txt")]
+      ])]
+    ]});
+
+    updateSources(["app|foo.txt", "app|bar.a"]);
+    expectAsset("app|foo.out", "bar.b.c");
+    buildShouldSucceed();
+  });
+}
diff --git a/mojo/public/dart/third_party/barback/test/package_graph/lazy_transformer_test.dart b/mojo/public/dart/third_party/barback/test/package_graph/lazy_transformer_test.dart
new file mode 100644
index 0000000..1503c47
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/package_graph/lazy_transformer_test.dart
@@ -0,0 +1,430 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.package_graph.lazy_asset_test;
+
+import 'package:barback/barback.dart';
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../utils.dart';
+
+main() {
+  initConfig();
+  test("requesting a lazy asset should cause it to be generated", () {
+    initGraph(["app|foo.blub"], {"app": [
+      [new LazyRewriteTransformer("blub", "blab")]
+    ]});
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+  });
+
+  test("calling getAllAssets should cause a lazy asset to be generated", () {
+    var transformer = new LazyRewriteTransformer("blub", "blab");
+    initGraph(["app|foo.blub"], {"app": [[transformer]]});
+    updateSources(["app|foo.blub"]);
+    expectAllAssets(["app|foo.blub", "app|foo.blab"]);
+    buildShouldSucceed();
+    expect(transformer.numRuns, completion(equals(1)));
+  });
+
+  test("requesting a lazy asset multiple times should only cause it to be "
+      "generated once", () {
+    var transformer = new LazyRewriteTransformer("blub", "blab");
+    initGraph(["app|foo.blub"], {"app": [[transformer]]});
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blab", "foo.blab");
+    expectAsset("app|foo.blab", "foo.blab");
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+    expect(transformer.numRuns, completion(equals(1)));
+  });
+
+  test("a lazy asset can be consumed by a non-lazy transformer", () {
+    initGraph(["app|foo.blub"], {"app": [
+      [new LazyRewriteTransformer("blub", "blab")],
+      [new RewriteTransformer("blab", "blib")]
+    ]});
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blib", "foo.blab.blib");
+    buildShouldSucceed();
+  });
+
+  test("a lazy asset isn't eagerly compiled", () {
+    var transformer = new LazyRewriteTransformer("blub", "blab");
+    initGraph(["app|foo.blub"], {"app": [[transformer]]});
+    updateSources(["app|foo.blub"]);
+    buildShouldSucceed();
+    expect(transformer.numRuns, completion(equals(0)));
+  });
+
+  test("a lazy asset emitted by a group isn't eagerly compiled", () {
+    var transformer = new LazyRewriteTransformer("blub", "blab");
+    initGraph(["app|foo.blub"], {"app": [
+      [new TransformerGroup([[transformer]])]
+    ]});
+    updateSources(["app|foo.blub"]);
+    buildShouldSucceed();
+    expect(transformer.numRuns, completion(equals(0)));
+  });
+
+  test("a lazy asset piped into a non-lazy transformer is eagerly compiled",
+      () {
+    var transformer = new LazyRewriteTransformer("blub", "blab");
+    initGraph(["app|foo.blub"], {"app": [
+      [transformer],
+      [new RewriteTransformer("blab", "blib")]
+    ]});
+    updateSources(["app|foo.blub"]);
+    buildShouldSucceed();
+    expect(transformer.numRuns, completion(equals(1)));
+  });
+
+  test("a lazy asset piped into a declaring transformer isn't eagerly "
+      "compiled", () {
+    var transformer1 = new LazyRewriteTransformer("blub", "blab");
+    var transformer2 = new DeclaringRewriteTransformer("blab", "blib");
+    initGraph(["app|foo.blub"], {"app": [
+      [transformer1], [transformer2]
+    ]});
+    updateSources(["app|foo.blub"]);
+    buildShouldSucceed();
+    expect(transformer1.numRuns, completion(equals(0)));
+    expect(transformer2.numRuns, completion(equals(0)));
+  });
+
+  test("a lazy asset piped into a declaring transformer is compiled "
+      "on-demand", () {
+    initGraph(["app|foo.blub"], {"app": [
+      [new LazyRewriteTransformer("blub", "blab")],
+      [new DeclaringRewriteTransformer("blab", "blib")]
+    ]});
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blib", "foo.blab.blib");
+    buildShouldSucceed();
+  });
+
+  test("a lazy asset piped through many declaring transformers isn't eagerly "
+      "compiled", () {
+    var transformer1 = new LazyRewriteTransformer("one", "two");
+    var transformer2 = new DeclaringRewriteTransformer("two", "three");
+    var transformer3 = new DeclaringRewriteTransformer("three", "four");
+    var transformer4 = new DeclaringRewriteTransformer("four", "five");
+    initGraph(["app|foo.one"], {"app": [
+      [transformer1], [transformer2], [transformer3], [transformer4]
+    ]});
+    updateSources(["app|foo.one"]);
+    buildShouldSucceed();
+    expect(transformer1.numRuns, completion(equals(0)));
+    expect(transformer2.numRuns, completion(equals(0)));
+    expect(transformer3.numRuns, completion(equals(0)));
+    expect(transformer4.numRuns, completion(equals(0)));
+  });
+
+  test("a lazy asset piped through many declaring transformers is compiled "
+      "on-demand", () {
+    initGraph(["app|foo.one"], {"app": [
+      [new LazyRewriteTransformer("one", "two")],
+      [new DeclaringRewriteTransformer("two", "three")],
+      [new DeclaringRewriteTransformer("three", "four")],
+      [new DeclaringRewriteTransformer("four", "five")]
+    ]});
+    updateSources(["app|foo.one"]);
+    expectAsset("app|foo.five", "foo.two.three.four.five");
+    buildShouldSucceed();
+  });
+
+  test("a lazy asset piped into a non-lazy transformer that doesn't use its "
+      "outputs isn't eagerly compiled", () {
+    var transformer = new LazyRewriteTransformer("blub", "blab");
+    initGraph(["app|foo.blub"], {"app": [
+      [transformer],
+      [new RewriteTransformer("txt", "out")]
+    ]});
+    updateSources(["app|foo.blub"]);
+    buildShouldSucceed();
+    expect(transformer.numRuns, completion(equals(0)));
+  });
+
+  test("a lazy asset piped into a non-lazy transformer that doesn't use its "
+      "outputs is compiled on-demand", () {
+    initGraph(["app|foo.blub"], {"app": [
+      [new LazyRewriteTransformer("blub", "blab")],
+      [new RewriteTransformer("txt", "out")]
+    ]});
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+  });
+
+  test("a lazy transformer followed by a non-lazy transformer is re-run "
+      "eagerly", () {
+    var rewrite = new LazyRewriteTransformer("one", "two");
+    initGraph(["app|foo.one"], {"app": [
+      [rewrite],
+      [new RewriteTransformer("two", "three")]
+    ]});
+
+    updateSources(["app|foo.one"]);
+    expectAsset("app|foo.three", "foo.two.three");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.one"]);
+    buildShouldSucceed();
+
+    expect(rewrite.numRuns, completion(equals(2)));
+  });
+
+  test("a lazy transformer followed by a declaring transformer isn't re-run "
+      "eagerly", () {
+    var rewrite = new LazyRewriteTransformer("one", "two");
+    initGraph(["app|foo.one"], {"app": [
+      [rewrite],
+      [new DeclaringRewriteTransformer("two", "three")]
+    ]});
+
+    updateSources(["app|foo.one"]);
+    expectAsset("app|foo.three", "foo.two.three");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.one"]);
+    buildShouldSucceed();
+
+    expect(rewrite.numRuns, completion(equals(1)));
+  });
+
+  test("a declaring transformer added after a materialized lazy transformer "
+      "is still deferred", () {
+    var lazy = new LazyRewriteTransformer("one", "two");
+    var declaring = new DeclaringRewriteTransformer("two", "three");
+    initGraph(["app|foo.one"], {"app": [[lazy]]});
+
+    updateSources(["app|foo.one"]);
+    expectAsset("app|foo.two", "foo.two");
+    buildShouldSucceed();
+
+    updateTransformers("app", [[lazy], [declaring]]);
+    expectAsset("app|foo.three", "foo.two.three");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.one"]);
+    buildShouldSucceed();
+
+    expect(lazy.numRuns, completion(equals(1)));
+    expect(declaring.numRuns, completion(equals(1)));
+  });
+
+  test("a lazy asset works as a cross-package input", () {
+    initGraph({
+      "pkg1|foo.blub": "foo",
+      "pkg2|a.txt": "pkg1|foo.blab"
+    }, {"pkg1": [
+      [new LazyRewriteTransformer("blub", "blab")],
+    ], "pkg2": [
+      [new ManyToOneTransformer("txt")]
+    ]});
+
+    updateSources(["pkg1|foo.blub", "pkg2|a.txt"]);
+    expectAsset("pkg2|a.out", "foo.blab");
+    buildShouldSucceed();
+  });
+
+  test("a lazy transformer can consume secondary inputs lazily", () {
+    initGraph({
+      "app|a.inc": "a",
+      "app|a.txt": "a.inc"
+    }, {"app": [
+      [new LazyManyToOneTransformer("txt")]
+    ]});
+
+    updateSources(["app|a.inc", "app|a.txt"]);
+    expectAsset("app|a.out", "a");
+    buildShouldSucceed();
+  });
+
+  test("after being materialized a lazy transformer is still lazy", () {
+    var transformer = new LazyRewriteTransformer("blub", "blab");
+    initGraph(["app|foo.blub"], {"app": [[transformer]]});
+
+    updateSources(["app|foo.blub"]);
+    buildShouldSucceed();
+
+    // Request the asset once to force it to be materialized.
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.blub"]);
+    buildShouldSucceed();
+
+    expect(transformer.numRuns, completion(equals(1)));
+  });
+
+  test("after being materialized a lazy transformer can be materialized again",
+      () {
+    var transformer = new LazyRewriteTransformer("blub", "blab");
+    initGraph(["app|foo.blub"], {"app": [[transformer]]});
+
+    updateSources(["app|foo.blub"]);
+    buildShouldSucceed();
+
+    // Request the asset once to force it to be materialized.
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.blub", "bar");
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blab", "bar.blab");
+    buildShouldSucceed();
+  });
+
+  test("an error emitted in a lazy transformer's declareOutputs method is "
+      "caught and reported", () {
+    initGraph(["app|foo.txt"], {"app": [
+      [new LazyBadTransformer("app|foo.out")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    buildShouldFail([isTransformerException(equals(LazyBadTransformer.ERROR))]);
+  });
+
+  test("an error emitted in a lazy transformer's declareOuputs method prevents "
+      "it from being materialized", () {
+    var transformer = new LazyBadTransformer("app|foo.out");
+    initGraph(["app|foo.txt"], {"app": [[transformer]]});
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.out");
+    buildShouldFail([isTransformerException(equals(LazyBadTransformer.ERROR))]);
+    expect(transformer.numRuns, completion(equals(0)));
+  });
+
+  test("a lazy transformer passes through inputs it doesn't apply to", () {
+    initGraph(["app|foo.txt"], {"app": [
+      [new LazyRewriteTransformer("blub", "blab")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("a lazy transformer passes through inputs it doesn't overwrite", () {
+    initGraph(["app|foo.txt"], {"app": [
+      [new LazyRewriteTransformer("txt", "out")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("a lazy transformer doesn't pass through inputs it overwrites", () {
+    initGraph(["app|foo.txt"], {"app": [
+      [new LazyRewriteTransformer("txt", "txt")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt", "foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("a lazy transformer doesn't pass through inputs it consumes", () {
+    initGraph(["app|foo.txt"], {"app": [
+      [new LazyRewriteTransformer("txt", "out")..consumePrimary = true]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("a lazy transformer that doesn't apply does nothing when forced", () {
+    initGraph(["app|foo.txt"], {"app": [
+      [new LazyRewriteTransformer("blub", "blab")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.blab");
+
+    // Getting all assets will force every lazy transformer. This shouldn't
+    // cause the rewrite to apply, because foo.txt isn't primary.
+    expectAllAssets(["app|foo.txt"]);
+    buildShouldSucceed();
+  });
+
+  test("a lazy transformer that generates fewer outputs than it declares is "
+      "forced when a declared but ungenerated output is requested", () {
+    initGraph({"app|foo.txt": "no"}, {"app": [
+      [new LazyCheckContentAndRenameTransformer(
+          oldExtension: "txt", oldContent: "yes",
+          newExtension: "out", newContent: "done")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.out");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.txt", "yes");
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.out", "done");
+    buildShouldSucceed();
+  });
+
+  // Regression tests.
+
+  test("a lazy transformer that doesn't apply updates its passed-through asset",
+      () {
+    initGraph(["app|foo.txt"], {"app": [
+      [new LazyRewriteTransformer("blub", "blab")]
+    ]});
+
+    // Pause the provider so that the transformer will start forwarding the
+    // asset while it's dirty.
+    pauseProvider();
+    updateSources(["app|foo.txt"]);
+    expectAssetDoesNotComplete("app|foo.txt");
+
+    resumeProvider();
+    expectAsset("app|foo.txt", "foo");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.txt", "bar");
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt", "bar");
+    buildShouldSucceed();
+  });
+
+  test("a lazy transformer is forced while the previous lazy transformer is "
+      "available, then the previous transformer becomes unavailable", () {
+    var assets = new LazyAssetsTransformer(["app|out.one", "app|out.two"]);
+    var rewrite = new LazyRewriteTransformer("two", "three");
+    initGraph(["app|foo.in"], {"app": [[assets], [rewrite]]});
+
+    updateSources(["app|foo.in"]);
+    // Request out.one so that [assets] runs but the second does not.
+    expectAsset("app|out.one", "app|out.one");
+    buildShouldSucceed();
+
+    // Start the [rewrite] running. The output from [assets] should still be
+    // available.
+    rewrite.pauseApply();
+    expectAssetDoesNotComplete("app|out.three");
+
+    // Mark [assets] as dirty. It should re-run, since [rewrite] still needs its
+    // input.
+    updateSources(["app|foo.in"]);
+    rewrite.resumeApply();
+
+    expectAsset("app|out.three", "app|out.two.three");
+    buildShouldSucceed();
+
+    // [assets] should run once for each time foo.in was updated.
+    expect(assets.numRuns, completion(equals(2)));
+
+    // [rewrite] should run once against [assets]'s original output and once
+    // against its new output.
+    expect(rewrite.numRuns, completion(equals(2)));
+  });
+}
diff --git a/mojo/public/dart/third_party/barback/test/package_graph/many_parallel_transformers_test.dart b/mojo/public/dart/third_party/barback/test/package_graph/many_parallel_transformers_test.dart
new file mode 100644
index 0000000..8c47241
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/package_graph/many_parallel_transformers_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.package_graph.transform_test;
+
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../utils.dart';
+
+main() {
+  initConfig();
+
+  test("handles many parallel transformers", () {
+    currentSchedule.timeout *= 3;
+    var files = new List.generate(100, (i) => "app|$i.txt");
+    var rewrite = new RewriteTransformer("txt", "out");
+    initGraph(files, {"app": [[rewrite]]});
+
+    // Pause and resume apply to simulate parallel long-running transformers.
+    rewrite.pauseApply();
+    updateSources(files);
+    schedule(pumpEventQueue);
+    rewrite.resumeApply();
+
+    for (var i = 0; i < 100; i++) {
+      expectAsset("app|$i.out", "$i.out");
+    }
+    buildShouldSucceed();
+  });
+}
diff --git a/mojo/public/dart/third_party/barback/test/package_graph/repetition_test.dart b/mojo/public/dart/third_party/barback/test/package_graph/repetition_test.dart
new file mode 100644
index 0000000..48462d8
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/package_graph/repetition_test.dart
@@ -0,0 +1,76 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.package_graph.transform_test;
+
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../utils.dart';
+
+// This tests the behavior of barback under many operations happening in quick
+// succession. Since Barback is so asynchronous, it's easy for it to have subtle
+// dependencies on the commonly-used and -tested usage patterns. These tests
+// exist to stress-test less-common usage patterns in order to root out
+// additional bugs.
+
+main() {
+  initConfig();
+
+  test("updates sources many times", () {
+    initGraph(["app|foo.txt"], {
+      "app": [[new RewriteTransformer("txt", "out")]]
+    });
+
+    for (var i = 0; i < 1000; i++) {
+      updateSources(["app|foo.txt"]);
+    }
+
+    expectAsset("app|foo.out", "foo.out");
+    buildShouldSucceed();
+  });
+
+  test("updates and then removes sources many times", () {
+    initGraph(["app|foo.txt"], {
+      "app": [[new RewriteTransformer("txt", "out")]]
+    });
+
+    for (var i = 0; i < 1000; i++) {
+      updateSources(["app|foo.txt"]);
+      removeSources(["app|foo.txt"]);
+    }
+
+    expectNoAsset("app|foo.out");
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("updates transformers many times", () {
+    var rewrite = new RewriteTransformer("txt", "out");
+    initGraph(["app|foo.txt"], {"app": [[rewrite]]});
+    updateSources(["app|foo.txt"]);
+
+    for (var i = 0; i < 1000; i++) {
+      updateTransformers("app", [[rewrite]]);
+    }
+
+    expectAsset("app|foo.out", "foo.out");
+    buildShouldSucceed();
+  });
+
+  test("updates and removes transformers many times", () {
+    var rewrite = new RewriteTransformer("txt", "out");
+    initGraph(["app|foo.txt"], {"app": [[rewrite]]});
+    updateSources(["app|foo.txt"]);
+
+    for (var i = 0; i < 1000; i++) {
+      updateTransformers("app", [[rewrite]]);
+      updateTransformers("app", [[]]);
+    }
+
+    expectAsset("app|foo.txt", "foo");
+    expectNoAsset("app|foo.out");
+    buildShouldSucceed();
+  });
+}
diff --git a/mojo/public/dart/third_party/barback/test/package_graph/source_test.dart b/mojo/public/dart/third_party/barback/test/package_graph/source_test.dart
new file mode 100644
index 0000000..b5763a8
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/package_graph/source_test.dart
@@ -0,0 +1,149 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.package_graph.source_test;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../utils.dart';
+
+main() {
+  initConfig();
+  test("gets a source asset", () {
+    initGraph(["app|foo.txt"]);
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("doesn't get an unknown source", () {
+    initGraph();
+    expectNoAsset("app|unknown.txt");
+  });
+
+  test("doesn't get an unprovided source", () {
+    initGraph();
+    updateSources(["app|unknown.txt"]);
+    expectNoAsset("app|unknown.txt");
+  });
+
+  test("doesn't get an asset that isn't an updated source", () {
+    initGraph(["app|foo.txt"]);
+
+    // Sources must be explicitly made visible to barback by calling
+    // updateSources() on them. It isn't enough for the provider to be able
+    // to provide it.
+    //
+    // This lets you distinguish between sources that you want to be primaries
+    // and the larger set of inputs that those primaries are allowed to pull in.
+    expectNoAsset("app|foo.txt");
+  });
+
+  test("gets a source asset if not transformed", () {
+    initGraph(["app|foo.txt"], {"app": [
+      [new RewriteTransformer("nottxt", "whatever")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("doesn't get a removed source", () {
+    initGraph(["app|foo.txt"]);
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt");
+    buildShouldSucceed();
+
+    removeSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("collapses redundant updates", () {
+    var transformer = new RewriteTransformer("blub", "blab");
+    initGraph(["app|foo.blub"], {"app": [[transformer]]});
+
+    schedule(() {
+      // Make a bunch of synchronous update calls.
+      updateSourcesSync(["app|foo.blub"]);
+      updateSourcesSync(["app|foo.blub"]);
+      updateSourcesSync(["app|foo.blub"]);
+      updateSourcesSync(["app|foo.blub"]);
+    });
+
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+
+    expect(transformer.numRuns, completion(equals(1)));
+  });
+
+  test("a removal cancels out an update", () {
+    initGraph(["app|foo.txt"]);
+
+    schedule(() {
+      updateSourcesSync(["app|foo.txt"]);
+      removeSourcesSync(["app|foo.txt"]);
+    });
+
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("an update cancels out a removal", () {
+    initGraph(["app|foo.txt"]);
+
+    schedule(() {
+      removeSourcesSync(["app|foo.txt"]);
+      updateSourcesSync(["app|foo.txt"]);
+    });
+
+    expectAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("reloads an asset that's updated while loading", () {
+    initGraph({"app|foo.txt": "foo"});
+
+    pauseProvider();
+    // The mock provider synchronously loads the value of the assets, so this
+    // will kick off two loads with different values. The second one should
+    // win.
+    updateSources(["app|foo.txt"]);
+    modifyAsset("app|foo.txt", "bar");
+    updateSources(["app|foo.txt"]);
+
+    resumeProvider();
+    expectAsset("app|foo.txt", "bar");
+    buildShouldSucceed();
+  });
+
+  test("restarts a build if a source is updated while sources are loading", () {
+    var transformer = new RewriteTransformer("txt", "out");
+    initGraph(["app|foo.txt", "app|other.bar"], {"app": [[transformer]]});
+
+    // Run the whole graph so all nodes are clean.
+    updateSources(["app|foo.txt", "app|other.bar"]);
+    expectAsset("app|foo.out", "foo.out");
+    expectAsset("app|other.bar");
+
+    buildShouldSucceed();
+
+    // Make the provider slow to load a source.
+    pauseProvider();
+
+    // Update an asset that doesn't trigger any transformers.
+    updateSources(["app|other.bar"]);
+
+    // Now update an asset that does trigger a transformer.
+    updateSources(["app|foo.txt"]);
+
+    resumeProvider();
+
+    buildShouldSucceed();
+
+    expect(transformer.numRuns, completion(equals(2)));
+  });
+}
diff --git a/mojo/public/dart/third_party/barback/test/package_graph/transform/aggregate_test.dart b/mojo/public/dart/third_party/barback/test/package_graph/transform/aggregate_test.dart
new file mode 100644
index 0000000..d6fb050
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/package_graph/transform/aggregate_test.dart
@@ -0,0 +1,326 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.package_graph.transform.aggregate_test;
+
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../utils.dart';
+
+main() {
+  initConfig();
+  test("an aggregate transformer can read from multiple primary inputs", () {
+    var sources = [
+      "app|dir/foo.txt",
+      "app|dir/bar.txt",
+      "app|dir/baz.jpg",
+      "app|dir/subdir/bang.txt",
+      "app|dir/subdir/qux.txt",
+      "app|dir/subdir/zap.png"
+    ];
+
+    initGraph(sources, {"app": [
+      [new AggregateManyToOneTransformer("txt", "out.txt")]
+    ]});
+
+    updateSources(sources);
+    expectAsset("app|dir/out.txt", "bar\nfoo");
+    expectAsset("app|dir/subdir/out.txt", "bang\nqux");
+    buildShouldSucceed();
+  });
+
+  test("an aggregate transformer isn't run if there are no primary inputs", () {
+    var transformer = new AggregateManyToOneTransformer("txt", "out.txt");
+    initGraph(["app|foo.zip", "app|bar.zap"], {"app": [
+      [transformer]
+    ]});
+
+    updateSources(["app|foo.zip", "app|bar.zap"]);
+    expectNoAsset("app|out.txt");
+    buildShouldSucceed();
+
+    expect(transformer.numRuns, completion(equals(0)));
+  });
+
+  test("an aggregate transformer is re-run if a primary input changes", () {
+    initGraph(["app|foo.txt", "app|bar.txt"], {"app": [
+      [new AggregateManyToOneTransformer("txt", "out.txt")]
+    ]});
+
+    updateSources(["app|foo.txt", "app|bar.txt"]);
+    expectAsset("app|out.txt", "bar\nfoo");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.txt", "new foo");
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|out.txt", "bar\nnew foo");
+    buildShouldSucceed();
+  });
+
+  test("an aggregate transformer is re-run if a primary input is removed", () {
+    initGraph(["app|foo.txt", "app|bar.txt"], {"app": [
+      [new AggregateManyToOneTransformer("txt", "out.txt")]
+    ]});
+
+    updateSources(["app|foo.txt", "app|bar.txt"]);
+    expectAsset("app|out.txt", "bar\nfoo");
+    buildShouldSucceed();
+
+    removeSources(["app|foo.txt"]);
+    expectAsset("app|out.txt", "bar");
+    buildShouldSucceed();
+  });
+
+  test("an aggregate transformer is re-run if a primary input is added", () {
+    initGraph(["app|foo.txt", "app|bar.txt", "app|baz.txt"], {"app": [
+      [new AggregateManyToOneTransformer("txt", "out.txt")]
+    ]});
+
+    updateSources(["app|foo.txt", "app|bar.txt"]);
+    expectAsset("app|out.txt", "bar\nfoo");
+    buildShouldSucceed();
+
+    updateSources(["app|baz.txt"]);
+    expectAsset("app|out.txt", "bar\nbaz\nfoo");
+    buildShouldSucceed();
+  });
+
+  test("an aggregate transformer ceases to run if all primary inputs are "
+      "removed", () {
+    initGraph(["app|foo.txt", "app|bar.txt"], {"app": [
+      [new AggregateManyToOneTransformer("txt", "out.txt")]
+    ]});
+
+    updateSources(["app|foo.txt", "app|bar.txt"]);
+    expectAsset("app|out.txt", "bar\nfoo");
+    buildShouldSucceed();
+
+    removeSources(["app|foo.txt", "app|bar.txt"]);
+    expectNoAsset("app|out.txt");
+    buildShouldSucceed();
+  });
+
+  test("an aggregate transformer starts to run if new primary inputs are "
+      "added", () {
+    initGraph(["app|foo.txt", "app|bar.txt"], {"app": [
+      [new AggregateManyToOneTransformer("txt", "out.txt")]
+    ]});
+
+    updateSources([]);
+    expectNoAsset("app|out.txt");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.txt", "app|bar.txt"]);
+    expectAsset("app|out.txt", "bar\nfoo");
+    buildShouldSucceed();
+  });
+
+  group("pass-through", () {
+    test("an aggregate transformer passes through its primary inputs by "
+        "default", () {
+      initGraph(["app|foo.txt", "app|bar.txt"], {"app": [
+        [new AggregateManyToOneTransformer("txt", "out.txt")]
+      ]});
+
+      updateSources(["app|foo.txt", "app|bar.txt"]);
+      expectAsset("app|foo.txt", "foo");
+      expectAsset("app|bar.txt", "bar");
+      buildShouldSucceed();
+
+      modifyAsset("app|foo.txt", "new foo");
+      updateSources(["app|foo.txt"]);
+      expectAsset("app|foo.txt", "new foo");
+      buildShouldSucceed();
+    });
+
+    test("an aggregate transformer can overwrite its primary inputs", () {
+      initGraph(["app|foo.txt", "app|bar.txt"], {"app": [
+        [new AggregateManyToManyTransformer("txt")]
+      ]});
+
+      updateSources(["app|foo.txt", "app|bar.txt"]);
+      expectAsset("app|foo.txt", "modified foo");
+      expectAsset("app|bar.txt", "modified bar");
+      buildShouldSucceed();
+    });
+
+    test("an aggregate transformer can consume its primary inputs", () {
+      var transformer = new AggregateManyToOneTransformer("txt", "out.txt");
+      transformer.consumePrimaries
+          ..add("app|foo.txt")
+          ..add("app|bar.txt");
+
+      initGraph(["app|foo.txt", "app|bar.txt"], {"app": [[transformer]]});
+
+      updateSources(["app|foo.txt", "app|bar.txt"]);
+      expectNoAsset("app|foo.txt");
+      expectNoAsset("app|bar.txt");
+      buildShouldSucceed();
+    });
+
+    test("an aggregate transformer passes through non-primary inputs", () {
+      initGraph(["app|foo.jpg", "app|bar.png"], {"app": [
+        [new AggregateManyToManyTransformer("txt")]
+      ]});
+
+      updateSources(["app|foo.jpg", "app|bar.png"]);
+      expectAsset("app|foo.jpg", "foo");
+      expectAsset("app|bar.png", "bar");
+      buildShouldSucceed();
+
+      modifyAsset("app|foo.jpg", "new foo");
+      updateSources(["app|foo.jpg"]);
+      expectAsset("app|foo.jpg", "new foo");
+      buildShouldSucceed();
+    });
+  });
+
+  group("apply() transform stream", () {
+    test("the primary input stream doesn't close if a previous phase is still "
+        "running", () {
+      var rewrite = new RewriteTransformer("a", "b");
+      initGraph(["app|foo.txt", "app|bar.a"], {"app": [
+        [rewrite],
+        [new AggregateManyToOneTransformer("txt", "out.txt")]
+      ]});
+
+      rewrite.pauseApply();
+      updateSources(["app|foo.txt", "app|bar.a"]);
+      expectAssetDoesNotComplete("app|out.txt");
+
+      rewrite.resumeApply();
+      expectAsset("app|out.txt", "foo");
+      buildShouldSucceed();
+    });
+
+    test("the primary input stream doesn't close if a previous phase is "
+        "materializing a primary input", () {
+      var rewrite = new DeclaringRewriteTransformer("in", "txt");
+      initGraph(["app|foo.txt", "app|bar.in"], {"app": [
+        [rewrite],
+        [new AggregateManyToOneTransformer("txt", "out.txt")]
+      ]});
+
+      rewrite.pauseApply();
+      updateSources(["app|foo.txt", "app|bar.in"]);
+      expectAssetDoesNotComplete("app|out.txt");
+
+      rewrite.resumeApply();
+      expectAsset("app|out.txt", "bar.txt\nfoo");
+      buildShouldSucceed();
+    });
+
+    test("the primary input stream closes if a previous phase is only "
+        "materializing non-primary inputs", () {
+      var rewrite = new DeclaringRewriteTransformer("a", "b");
+      initGraph(["app|foo.txt", "app|bar.a"], {"app": [
+        [rewrite],
+        [new AggregateManyToOneTransformer("txt", "out.txt")]
+      ]});
+
+      rewrite.pauseApply();
+      updateSources(["app|foo.txt", "app|bar.a"]);
+      expectAsset("app|out.txt", "foo");
+
+      rewrite.resumeApply();
+      buildShouldSucceed();
+    });
+
+    test("a new primary input that arrives before the stream closes doesn't "
+        "cause apply to restart", () {
+      var rewrite = new RewriteTransformer("a", "b");
+      var aggregate = new AggregateManyToOneTransformer("txt", "out.txt");
+      initGraph(["app|foo.txt", "app|bar.txt", "app|baz.a"], {"app": [
+        [rewrite],
+        [aggregate]
+      ]});
+
+      // The stream won't close until [rewrite] finishes running `apply()`.
+      rewrite.pauseApply();
+
+      updateSources(["app|foo.txt", "app|baz.a"]);
+      expectAssetDoesNotComplete("app|out.txt");
+
+      updateSources(["app|bar.txt"]);
+      expectAssetDoesNotComplete("app|out.txt");
+
+      rewrite.resumeApply();
+      expectAsset("app|out.txt", "bar\nfoo");
+      buildShouldSucceed();
+
+      expect(aggregate.numRuns, completion(equals(1)));
+    });
+
+    test("a new primary input that arrives after the stream closes causes "
+        "apply to restart", () {
+      var aggregate = new AggregateManyToOneTransformer("txt", "out.txt");
+      initGraph(["app|foo.txt", "app|bar.txt"], {"app": [[aggregate]]});
+
+      aggregate.pauseApply();
+      updateSources(["app|foo.txt"]);
+      expectAssetDoesNotComplete("app|out.txt");
+
+      updateSources(["app|bar.txt"]);
+      expectAssetDoesNotComplete("app|out.txt");
+
+      aggregate.resumeApply();
+      expectAsset("app|out.txt", "bar\nfoo");
+      buildShouldSucceed();
+
+      expect(aggregate.numRuns, completion(equals(2)));
+    });
+
+    test("a primary input that's modified before the stream closes causes "
+        "apply to restart", () {
+      var rewrite = new RewriteTransformer("a", "b");
+      var aggregate = new AggregateManyToOneTransformer("txt", "out.txt");
+      initGraph(["app|foo.txt", "app|bar.a"], {"app": [
+        [rewrite],
+        [aggregate]
+      ]});
+
+      // The stream won't close until [rewrite] finishes running `apply()`.
+      rewrite.pauseApply();
+
+      updateSources(["app|foo.txt", "app|bar.a"]);
+      expectAssetDoesNotComplete("app|out.txt");
+
+      modifyAsset("app|foo.txt", "new foo");
+      updateSources(["app|foo.txt"]);
+      expectAssetDoesNotComplete("app|out.txt");
+
+      rewrite.resumeApply();
+      expectAsset("app|out.txt", "new foo");
+      buildShouldSucceed();
+
+      expect(aggregate.numRuns, completion(equals(2)));
+    });
+
+    test("a primary input that's removed before the stream closes causes apply "
+        "to restart", () {
+      var rewrite = new RewriteTransformer("a", "b");
+      var aggregate = new AggregateManyToOneTransformer("txt", "out.txt");
+      initGraph(["app|foo.txt", "app|bar.txt", "app|baz.a"], {"app": [
+        [rewrite],
+        [aggregate]
+      ]});
+
+      // The stream won't close until [rewrite] finishes running `apply()`.
+      rewrite.pauseApply();
+
+      updateSources(["app|foo.txt", "app|bar.txt", "app|baz.a"]);
+      expectAssetDoesNotComplete("app|out.txt");
+
+      removeSources(["app|bar.txt"]);
+      expectAssetDoesNotComplete("app|out.txt");
+
+      rewrite.resumeApply();
+      expectAsset("app|out.txt", "foo");
+      buildShouldSucceed();
+
+      expect(aggregate.numRuns, completion(equals(2)));
+    });
+  });
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/barback/test/package_graph/transform/concurrency_test.dart b/mojo/public/dart/third_party/barback/test/package_graph/transform/concurrency_test.dart
new file mode 100644
index 0000000..f8927bb
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/package_graph/transform/concurrency_test.dart
@@ -0,0 +1,594 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// This library contains tests for transformer behavior that relates to actions
+/// happening concurrently or other complex asynchronous timing behavior.
+library barback.test.package_graph.transform.concurrency_test;
+
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../utils.dart';
+
+main() {
+  initConfig();
+  test("runs transforms in the same phase in parallel", () {
+    var transformerA = new RewriteTransformer("txt", "a");
+    var transformerB = new RewriteTransformer("txt", "b");
+    initGraph(["app|foo.txt"], {"app": [[transformerA, transformerB]]});
+
+    transformerA.pauseApply();
+    transformerB.pauseApply();
+
+    updateSources(["app|foo.txt"]);
+
+    transformerA.waitUntilStarted();
+    transformerB.waitUntilStarted();
+
+    // They should both still be running.
+    expect(transformerA.isRunning, completion(isTrue));
+    expect(transformerB.isRunning, completion(isTrue));
+
+    transformerA.resumeApply();
+    transformerB.resumeApply();
+
+    expectAsset("app|foo.a", "foo.a");
+    expectAsset("app|foo.b", "foo.b");
+    buildShouldSucceed();
+  });
+
+  test("discards outputs from a transform whose primary input is removed "
+      "during processing", () {
+    var rewrite = new RewriteTransformer("txt", "out");
+    initGraph(["app|foo.txt"], {"app": [[rewrite]]});
+
+    rewrite.pauseApply();
+    updateSources(["app|foo.txt"]);
+    rewrite.waitUntilStarted();
+
+    removeSources(["app|foo.txt"]);
+    rewrite.resumeApply();
+    expectNoAsset("app|foo.out");
+    buildShouldSucceed();
+  });
+
+  test("applies the correct transform if an asset is modified during isPrimary",
+      () {
+    var check1 = new CheckContentTransformer("first", "#1");
+    var check2 = new CheckContentTransformer("second", "#2");
+    initGraph({
+      "app|foo.txt": "first",
+    }, {"app": [[check1, check2]]});
+
+    check1.pauseIsPrimary("app|foo.txt");
+    updateSources(["app|foo.txt"]);
+    // Ensure that we're waiting on check1's isPrimary.
+    schedule(pumpEventQueue);
+
+    modifyAsset("app|foo.txt", "second");
+    updateSources(["app|foo.txt"]);
+    check1.resumeIsPrimary("app|foo.txt");
+
+    expectAsset("app|foo.txt", "second#2");
+    buildShouldSucceed();
+  });
+
+  test("applies the correct transform if an asset is removed and added during "
+      "isPrimary", () {
+    var check1 = new CheckContentTransformer("first", "#1");
+    var check2 = new CheckContentTransformer("second", "#2");
+    initGraph({
+      "app|foo.txt": "first",
+    }, {"app": [[check1, check2]]});
+
+    check1.pauseIsPrimary("app|foo.txt");
+    updateSources(["app|foo.txt"]);
+    // Ensure that we're waiting on check1's isPrimary.
+    schedule(pumpEventQueue);
+
+    removeSources(["app|foo.txt"]);
+    modifyAsset("app|foo.txt", "second");
+    updateSources(["app|foo.txt"]);
+    check1.resumeIsPrimary("app|foo.txt");
+
+    expectAsset("app|foo.txt", "second#2");
+    buildShouldSucceed();
+  });
+
+  test("restarts processing if a change occurs during processing", () {
+    var transformer = new RewriteTransformer("txt", "out");
+    initGraph(["app|foo.txt"], {"app": [[transformer]]});
+
+    transformer.pauseApply();
+
+    updateSources(["app|foo.txt"]);
+    transformer.waitUntilStarted();
+
+    // Now update the graph during it.
+    updateSources(["app|foo.txt"]);
+    transformer.resumeApply();
+
+    expectAsset("app|foo.out", "foo.out");
+    buildShouldSucceed();
+
+    expect(transformer.numRuns, completion(equals(2)));
+  });
+
+  test("aborts processing if the primary input is removed during processing",
+      () {
+    var transformer = new RewriteTransformer("txt", "out");
+    initGraph(["app|foo.txt"], {"app": [[transformer]]});
+
+    transformer.pauseApply();
+
+    updateSources(["app|foo.txt"]);
+    transformer.waitUntilStarted();
+
+    // Now remove its primary input while it's running.
+    removeSources(["app|foo.txt"]);
+    transformer.resumeApply();
+
+    expectNoAsset("app|foo.out");
+    buildShouldSucceed();
+
+    expect(transformer.numRuns, completion(equals(1)));
+  });
+
+  test("restarts processing if a change to a new secondary input occurs during "
+      "processing", () {
+    var transformer = new ManyToOneTransformer("txt");
+    initGraph({
+      "app|foo.txt": "bar.inc",
+      "app|bar.inc": "bar"
+    }, {"app": [[transformer]]});
+
+    transformer.pauseApply();
+
+    updateSources(["app|foo.txt", "app|bar.inc"]);
+    transformer.waitUntilStarted();
+
+    // Give the transform time to load bar.inc the first time.
+    schedule(pumpEventQueue);
+
+    // Now update the secondary input before the transform finishes.
+    modifyAsset("app|bar.inc", "baz");
+    updateSources(["app|bar.inc"]);
+    // Give bar.inc enough time to be loaded and marked available before the
+    // transformer completes.
+    schedule(pumpEventQueue);
+
+    transformer.resumeApply();
+
+    expectAsset("app|foo.out", "baz");
+    buildShouldSucceed();
+
+    expect(transformer.numRuns, completion(equals(2)));
+  });
+
+  test("doesn't restart processing if a change to an old secondary input "
+      "occurs during processing", () {
+    var transformer = new ManyToOneTransformer("txt");
+    initGraph({
+      "app|foo.txt": "bar.inc",
+      "app|bar.inc": "bar",
+      "app|baz.inc": "baz"
+    }, {"app": [[transformer]]});
+
+    updateSources(["app|foo.txt", "app|bar.inc", "app|baz.inc"]);
+    expectAsset("app|foo.out", "bar");
+    buildShouldSucceed();
+
+    transformer.pauseApply();
+    modifyAsset("app|foo.txt", "baz.inc");
+    updateSources(["app|foo.txt"]);
+    transformer.waitUntilStarted();
+
+    // Now update the old secondary input before the transform finishes.
+    modifyAsset("app|bar.inc", "new bar");
+    updateSources(["app|bar.inc"]);
+    // Give bar.inc enough time to be loaded and marked available before the
+    // transformer completes.
+    schedule(pumpEventQueue);
+
+    transformer.resumeApply();
+    expectAsset("app|foo.out", "baz");
+    buildShouldSucceed();
+
+    // Should have run once the first time, then again when switching to
+    // baz.inc. Should not run a third time because of bar.inc being modified.
+    expect(transformer.numRuns, completion(equals(2)));
+  });
+
+  test("restarts before finishing later phases when a change occurs", () {
+    var txtToInt = new RewriteTransformer("txt", "int");
+    var intToOut = new RewriteTransformer("int", "out");
+    initGraph(["app|foo.txt", "app|bar.txt"],
+        {"app": [[txtToInt], [intToOut]]});
+
+    txtToInt.pauseApply();
+
+    updateSources(["app|foo.txt"]);
+    txtToInt.waitUntilStarted();
+
+    // Now update the graph during it.
+    updateSources(["app|bar.txt"]);
+    txtToInt.resumeApply();
+
+    expectAsset("app|foo.out", "foo.int.out");
+    expectAsset("app|bar.out", "bar.int.out");
+    buildShouldSucceed();
+
+    // Should only have run each transform once for each primary.
+    expect(txtToInt.numRuns, completion(equals(2)));
+    expect(intToOut.numRuns, completion(equals(2)));
+  });
+
+  test("doesn't return an asset until it's finished rebuilding", () {
+    initGraph(["app|foo.in"], {"app": [
+      [new RewriteTransformer("in", "mid")],
+      [new RewriteTransformer("mid", "out")]
+    ]});
+
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.out", "foo.mid.out");
+    buildShouldSucceed();
+
+    pauseProvider();
+    modifyAsset("app|foo.in", "new");
+    updateSources(["app|foo.in"]);
+    expectAssetDoesNotComplete("app|foo.out");
+    buildShouldNotBeDone();
+
+    resumeProvider();
+    expectAsset("app|foo.out", "new.mid.out");
+    buildShouldSucceed();
+  });
+
+  test("doesn't return an asset until its in-place transform is done", () {
+    var rewrite = new RewriteTransformer("txt", "txt");
+    initGraph(["app|foo.txt"], {"app": [[rewrite]]});
+
+    rewrite.pauseApply();
+    updateSources(["app|foo.txt"]);
+    expectAssetDoesNotComplete("app|foo.txt");
+
+    rewrite.resumeApply();
+    expectAsset("app|foo.txt", "foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("doesn't return an asset that's removed during isPrimary", () {
+    var rewrite = new RewriteTransformer("txt", "txt");
+    initGraph(["app|foo.txt"], {"app": [[rewrite]]});
+
+    rewrite.pauseIsPrimary("app|foo.txt");
+    updateSources(["app|foo.txt"]);
+    // Make sure we're waiting on isPrimary.
+    schedule(pumpEventQueue);
+
+    removeSources(["app|foo.txt"]);
+    rewrite.resumeIsPrimary("app|foo.txt");
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("doesn't transform an asset that goes from primary to non-primary "
+      "during isPrimary", () {
+    var check = new CheckContentTransformer(new RegExp(r"^do$"), "ne");
+    initGraph({
+      "app|foo.txt": "do"
+    }, {"app": [[check]]});
+
+    check.pauseIsPrimary("app|foo.txt");
+    updateSources(["app|foo.txt"]);
+    // Make sure we're waiting on isPrimary.
+    schedule(pumpEventQueue);
+
+    modifyAsset("app|foo.txt", "don't");
+    updateSources(["app|foo.txt"]);
+    check.resumeIsPrimary("app|foo.txt");
+
+    expectAsset("app|foo.txt", "don't");
+    buildShouldSucceed();
+  });
+
+  test("transforms an asset that goes from non-primary to primary "
+      "during isPrimary", () {
+    var check = new CheckContentTransformer("do", "ne");
+    initGraph({
+      "app|foo.txt": "don't"
+    }, {"app": [[check]]});
+
+    check.pauseIsPrimary("app|foo.txt");
+    updateSources(["app|foo.txt"]);
+    // Make sure we're waiting on isPrimary.
+    schedule(pumpEventQueue);
+
+    modifyAsset("app|foo.txt", "do");
+    updateSources(["app|foo.txt"]);
+    check.resumeIsPrimary("app|foo.txt");
+
+    expectAsset("app|foo.txt", "done");
+    buildShouldSucceed();
+  });
+
+  test("doesn't return an asset that's removed during another transformer's "
+      "isPrimary", () {
+    var rewrite1 = new RewriteTransformer("txt", "txt");
+    var rewrite2 = new RewriteTransformer("md", "md");
+    initGraph(["app|foo.txt", "app|foo.md"], {"app": [[rewrite1, rewrite2]]});
+
+    rewrite2.pauseIsPrimary("app|foo.md");
+    updateSources(["app|foo.txt", "app|foo.md"]);
+    // Make sure we're waiting on the correct isPrimary.
+    schedule(pumpEventQueue);
+
+    removeSources(["app|foo.txt"]);
+    rewrite2.resumeIsPrimary("app|foo.md");
+    expectNoAsset("app|foo.txt");
+    expectAsset("app|foo.md", "foo.md");
+    buildShouldSucceed();
+  });
+
+  test("doesn't transform an asset that goes from primary to non-primary "
+      "during another transformer's isPrimary", () {
+    var rewrite = new RewriteTransformer("md", "md");
+    var check = new CheckContentTransformer(new RegExp(r"^do$"), "ne");
+    initGraph({
+      "app|foo.txt": "do",
+      "app|foo.md": "foo"
+    }, {"app": [[rewrite, check]]});
+
+    rewrite.pauseIsPrimary("app|foo.md");
+    updateSources(["app|foo.txt", "app|foo.md"]);
+    // Make sure we're waiting on the correct isPrimary.
+    schedule(pumpEventQueue);
+
+    modifyAsset("app|foo.txt", "don't");
+    updateSources(["app|foo.txt"]);
+    rewrite.resumeIsPrimary("app|foo.md");
+
+    expectAsset("app|foo.txt", "don't");
+    expectAsset("app|foo.md", "foo.md");
+    buildShouldSucceed();
+  });
+
+  test("transforms an asset that goes from non-primary to primary "
+      "during another transformer's isPrimary", () {
+    var rewrite = new RewriteTransformer("md", "md");
+    var check = new CheckContentTransformer("do", "ne");
+    initGraph({
+      "app|foo.txt": "don't",
+      "app|foo.md": "foo"
+    }, {"app": [[rewrite, check]]});
+
+    rewrite.pauseIsPrimary("app|foo.md");
+    updateSources(["app|foo.txt", "app|foo.md"]);
+    // Make sure we're waiting on the correct isPrimary.
+    schedule(pumpEventQueue);
+
+    modifyAsset("app|foo.txt", "do");
+    updateSources(["app|foo.txt"]);
+    rewrite.resumeIsPrimary("app|foo.md");
+
+    expectAsset("app|foo.txt", "done");
+    expectAsset("app|foo.md", "foo.md");
+    buildShouldSucceed();
+  });
+
+  test("returns an asset even if an unrelated build is running", () {
+    initGraph([
+      "app|foo.in",
+      "app|bar.in",
+    ], {"app": [[new RewriteTransformer("in", "out")]]});
+
+    updateSources(["app|foo.in", "app|bar.in"]);
+    expectAsset("app|foo.out", "foo.out");
+    expectAsset("app|bar.out", "bar.out");
+    buildShouldSucceed();
+
+    pauseProvider();
+    modifyAsset("app|foo.in", "new");
+    updateSources(["app|foo.in"]);
+    expectAssetDoesNotComplete("app|foo.out");
+    expectAsset("app|bar.out", "bar.out");
+    buildShouldNotBeDone();
+
+    resumeProvider();
+    expectAsset("app|foo.out", "new.out");
+    buildShouldSucceed();
+  });
+
+  test("doesn't report AssetNotFound until all builds are finished", () {
+    initGraph([
+      "app|foo.in",
+    ], {"app": [[new RewriteTransformer("in", "out")]]});
+
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.out", "foo.out");
+    buildShouldSucceed();
+
+    pauseProvider();
+    updateSources(["app|foo.in"]);
+    expectAssetDoesNotComplete("app|foo.out");
+    expectAssetDoesNotComplete("app|non-existent.out");
+    buildShouldNotBeDone();
+
+    resumeProvider();
+    expectAsset("app|foo.out", "foo.out");
+    expectNoAsset("app|non-existent.out");
+    buildShouldSucceed();
+  });
+
+  test("doesn't emit a result until all builds are finished", () {
+    var rewrite = new RewriteTransformer("txt", "out");
+    initGraph([
+      "pkg1|foo.txt",
+      "pkg2|foo.txt"
+    ], {"pkg1": [[rewrite]], "pkg2": [[rewrite]]});
+
+    // First, run both packages' transformers so both packages are successful.
+    updateSources(["pkg1|foo.txt", "pkg2|foo.txt"]);
+    expectAsset("pkg1|foo.out", "foo.out");
+    expectAsset("pkg2|foo.out", "foo.out");
+    buildShouldSucceed();
+
+    // pkg1 is still successful, but pkg2 is waiting on the provider, so the
+    // overall build shouldn't finish.
+    pauseProvider();
+    updateSources(["pkg2|foo.txt"]);
+    expectAsset("pkg1|foo.out", "foo.out");
+    buildShouldNotBeDone();
+
+    // Now that the provider is unpaused, pkg2's transforms finish and the
+    // overall build succeeds.
+    resumeProvider();
+    buildShouldSucceed();
+  });
+
+  test("one transformer takes a long time while the other finishes, then "
+      "the input is removed", () {
+    var rewrite1 = new RewriteTransformer("txt", "out1");
+    var rewrite2 = new RewriteTransformer("txt", "out2");
+    initGraph(["app|foo.txt"], {"app": [[rewrite1, rewrite2]]});
+
+    rewrite1.pauseApply();
+
+    updateSources(["app|foo.txt"]);
+
+    // Wait for rewrite1 to pause and rewrite2 to finish.
+    schedule(pumpEventQueue);
+
+    removeSources(["app|foo.txt"]);
+
+    // Make sure the removal is processed completely before we restart rewrite2.
+    schedule(pumpEventQueue);
+    rewrite1.resumeApply();
+
+    buildShouldSucceed();
+    expectNoAsset("app|foo.out1");
+    expectNoAsset("app|foo.out2");
+  });
+
+  test("a transformer in a later phase gets a slow secondary input from an "
+      "earlier phase", () {
+    var rewrite = new RewriteTransformer("in", "in");
+    initGraph({
+      "app|foo.in": "foo",
+      "app|bar.txt": "foo.in"
+    }, {"app": [
+      [rewrite],
+      [new ManyToOneTransformer("txt")]
+    ]});
+
+    rewrite.pauseApply();
+    updateSources(["app|foo.in", "app|bar.txt"]);
+    expectAssetDoesNotComplete("app|bar.out");
+
+    rewrite.resumeApply();
+    expectAsset("app|bar.out", "foo.in");
+    buildShouldSucceed();
+  });
+
+  test("materializes a passed-through asset that was emitted before it was "
+      "available", () {
+    initGraph(["app|foo.in"], {"app": [
+      [new RewriteTransformer("txt", "txt")]
+    ]});
+
+    pauseProvider();
+    updateSources(["app|foo.in"]);
+    expectAssetDoesNotComplete("app|foo.in");
+
+    resumeProvider();
+    expectAsset("app|foo.in", "foo");
+    buildShouldSucceed();
+  });
+
+  test("re-runs if the primary input is invalidated before accessing", () {
+    var transformer1 = new RewriteTransformer("txt", "mid");
+    var transformer2 = new RewriteTransformer("mid", "out");
+
+    initGraph([
+      "app|foo.txt"
+    ], {"app": [
+      [transformer1],
+      [transformer2]
+    ]});
+
+    transformer2.pausePrimaryInput();
+    updateSources(["app|foo.txt"]);
+
+    // Wait long enough to ensure that transformer1 has completed and
+    // transformer2 has started.
+    schedule(pumpEventQueue);
+
+    // Update the source again so that transformer1 invalidates the primary
+    // input of transformer2.
+    transformer1.pauseApply();
+    modifyAsset("app|foo.txt", "new foo");
+    updateSources(["app|foo.txt"]);
+
+    transformer2.resumePrimaryInput();
+    transformer1.resumeApply();
+
+    expectAsset("app|foo.out", "new foo.mid.out");
+    buildShouldSucceed();
+
+    expect(transformer1.numRuns, completion(equals(2)));
+    expect(transformer2.numRuns, completion(equals(2)));
+  });
+
+  // Regression test for issue 19038.
+  test("a secondary input that's marked dirty followed by the primary input "
+      "being synchronously marked dirty re-runs a transformer", () {
+    // Issue 19038 was caused by the following sequence of events:
+    //
+    // * Several inputs are marked dirty at once, causing dirty events to
+    //   propagate synchronously throughout the transform graph.
+    //
+    // * A transform (ManyToOneTransformer in this test case) has a secondary
+    //   input ("one.in") and a primary input ("foo.txt") that will both be
+    //   marked dirty.
+    //
+    // * The secondary input is marked dirty before the primary input. This
+    //   causes the transform to start running `apply`. Since as far as it knows
+    //   its primary input is still available, it passes that input to `apply`.
+    //
+    // * Now the primary input is marked dirty. The transform node checks to see
+    //   if this primary input has already been added to the transform
+    //   controller. This is where the bug existed: the answer to this was
+    //   incorrectly "no" until after some asynchronous processing occurred.
+    //
+    // * Since the transform thought the primary input hadn't yet been passed to
+    //   the transform controller, it didn't bother restarting the transform,
+    //   causing the old output to be preserved incorrectly.
+    initGraph({
+      "app|foo.txt": "one",
+      "app|one.in": "1",
+      "app|two.in": "2"
+    }, {"app": [
+      // We need to use CheckContentTransformer here so that
+      // ManyToOneTransformer reads its primary input from memory rather than
+      // from the filesystem. If it read from the filesystem, it might
+      // accidentally get the correct output despite accessing the incorrect
+      // asset, which would cause false positives for the test.
+      [new CheckContentTransformer(new RegExp("one|two"), ".in")],
+      [new ManyToOneTransformer("txt")]
+    ]});
+
+    updateSources(["app|foo.txt", "app|one.in", "app|two.in"]);
+    expectAsset("app|foo.out", "1");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.txt", "two");
+
+    // It's important that "one.in" come first in this list, since
+    // ManyToOneTransformer needs to see its secondary input change first.
+    updateSources(["app|one.in", "app|foo.txt"]);
+
+    expectAsset("app|foo.out", "2");
+    buildShouldSucceed();
+  });
+}
diff --git a/mojo/public/dart/third_party/barback/test/package_graph/transform/consume_input_test.dart b/mojo/public/dart/third_party/barback/test/package_graph/transform/consume_input_test.dart
new file mode 100644
index 0000000..2580f5d
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/package_graph/transform/consume_input_test.dart
@@ -0,0 +1,170 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.package_graph.transform.pass_through_test;
+
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../utils.dart';
+
+main() {
+  initConfig();
+  test("a transform consumes its input without overwriting it", () {
+    initGraph([
+      "app|foo.txt"
+    ], {
+      "app": [[new RewriteTransformer("txt", "out")..consumePrimary = true]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.out", "foo.out");
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("a transform consumes its input while a sibling overwrites it", () {
+    initGraph([
+      "app|foo.txt"
+    ], {
+      "app": [[
+        new RewriteTransformer("txt", "out")..consumePrimary = true,
+        new RewriteTransformer("txt", "txt")
+      ]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.out", "foo.out");
+    expectAsset("app|foo.txt", "foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("a transform stops consuming its input", () {
+    initGraph({
+      "app|foo.txt": "yes"
+    }, {
+      "app": [[
+        new ConditionallyConsumePrimaryTransformer("txt", "out", "yes")
+      ]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.out", "yes.out");
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.txt", "no");
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.out", "no.out");
+    expectAsset("app|foo.txt", "no");
+    buildShouldSucceed();
+  });
+
+  test("two sibling transforms both consume their input", () {
+    initGraph(["app|foo.txt"], {
+      "app": [[
+        new RewriteTransformer("txt", "one")..consumePrimary = true,
+        new RewriteTransformer("txt", "two")..consumePrimary = true
+      ]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.one", "foo.one");
+    expectAsset("app|foo.two", "foo.two");
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("a transform stops consuming its input but a sibling is still "
+      "consuming it", () {
+    initGraph({
+      "app|foo.txt": "yes"
+    }, {
+      "app": [[
+        new RewriteTransformer("txt", "one")..consumePrimary = true,
+        new ConditionallyConsumePrimaryTransformer("txt", "two", "yes")
+      ]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.one", "yes.one");
+    expectAsset("app|foo.two", "yes.two");
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.txt", "no");
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.one", "no.one");
+    expectAsset("app|foo.two", "no.two");
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("a transform consumes its input and emits nothing", () {
+    initGraph([
+      "app|foo.txt"
+    ], {
+      "app": [[new EmitNothingTransformer("txt")..consumePrimary = true]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("a transform consumes its input, then is removed", () {
+    initGraph([
+      "app|foo.txt"
+    ], {
+      "app": [[new RewriteTransformer("txt", "out")..consumePrimary = true]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.out", "foo.out");
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+
+    updateTransformers("app", [[]]);
+    expectNoAsset("app|foo.out");
+    expectAsset("app|foo.txt", "foo");
+    buildShouldSucceed();
+  });
+
+  test("a transform consumes its input and emits nothing, then is removed",
+      () {
+    initGraph([
+      "app|foo.txt"
+    ], {
+      "app": [[new EmitNothingTransformer("txt")..consumePrimary = true]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+
+    updateTransformers("app", [[]]);
+    expectAsset("app|foo.txt", "foo");
+    buildShouldSucceed();
+  });
+
+  test("a transform which consumes its input is added", () {
+    initGraph([
+      "app|foo.txt"
+    ], {
+      "app": [[]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.out");
+    expectAsset("app|foo.txt", "foo");
+    buildShouldSucceed();
+
+    updateTransformers("app", [[
+      new RewriteTransformer("txt", "out")..consumePrimary = true
+    ]]);
+    expectAsset("app|foo.out", "foo.out");
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/barback/test/package_graph/transform/cross_package_test.dart b/mojo/public/dart/third_party/barback/test/package_graph/transform/cross_package_test.dart
new file mode 100644
index 0000000..b499604
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/package_graph/transform/cross_package_test.dart
@@ -0,0 +1,193 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.package_graph.transform.pass_through_test;
+
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../utils.dart';
+
+main() {
+  initConfig();
+  test("can access other packages' source assets", () {
+    initGraph({
+      "pkg1|a.txt": "pkg2|a.inc",
+      "pkg2|a.inc": "a"
+    }, {"pkg1": [[new ManyToOneTransformer("txt")]]});
+
+    updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
+    expectAsset("pkg1|a.out", "a");
+    buildShouldSucceed();
+  });
+
+  test("can access other packages' transformed assets", () {
+    initGraph({
+      "pkg1|a.txt": "pkg2|a.inc",
+      "pkg2|a.txt": "a"
+    }, {
+      "pkg1": [[new ManyToOneTransformer("txt")]],
+      "pkg2": [[new RewriteTransformer("txt", "inc")]]
+    });
+
+    updateSources(["pkg1|a.txt", "pkg2|a.txt"]);
+    expectAsset("pkg1|a.out", "a.inc");
+    buildShouldSucceed();
+  });
+
+  test("re-runs a transform when an input from another package changes", () {
+    initGraph({
+      "pkg1|a.txt": "pkg2|a.inc",
+      "pkg2|a.inc": "a"
+    }, {
+      "pkg1": [[new ManyToOneTransformer("txt")]]
+    });
+
+    updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
+    expectAsset("pkg1|a.out", "a");
+    buildShouldSucceed();
+
+    modifyAsset("pkg2|a.inc", "new a");
+    updateSources(["pkg2|a.inc"]);
+    expectAsset("pkg1|a.out", "new a");
+    buildShouldSucceed();
+  });
+
+  test("re-runs a transform when a transformed input from another package "
+      "changes", () {
+    initGraph({
+      "pkg1|a.txt": "pkg2|a.inc",
+      "pkg2|a.txt": "a"
+    }, {
+      "pkg1": [[new ManyToOneTransformer("txt")]],
+      "pkg2": [[new RewriteTransformer("txt", "inc")]]
+    });
+
+    updateSources(["pkg1|a.txt", "pkg2|a.txt"]);
+    expectAsset("pkg1|a.out", "a.inc");
+    buildShouldSucceed();
+
+    modifyAsset("pkg2|a.txt", "new a");
+    updateSources(["pkg2|a.txt"]);
+    expectAsset("pkg1|a.out", "new a.inc");
+    buildShouldSucceed();
+  });
+
+  test("doesn't complete the build until all packages' transforms are "
+      "finished running", () {
+    var transformer = new ManyToOneTransformer("txt");
+    initGraph({
+      "pkg1|a.txt": "pkg2|a.inc",
+      "pkg2|a.inc": "a"
+    }, {
+      "pkg1": [[transformer]]
+    });
+
+    updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
+    expectAsset("pkg1|a.out", "a");
+    buildShouldSucceed();
+
+    transformer.pauseApply();
+    modifyAsset("pkg2|a.inc", "new a");
+    updateSources(["pkg2|a.inc"]);
+    buildShouldNotBeDone();
+
+    transformer.resumeApply();
+    buildShouldSucceed();
+  });
+
+  test("runs a transform that's added because of a change in another package",
+      () {
+    initGraph({
+      "pkg1|a.txt": "pkg2|a.inc",
+      "pkg2|a.inc": "b"
+    }, {
+      "pkg1": [
+        [new ManyToOneTransformer("txt")],
+        [new OneToManyTransformer("out")],
+        [new RewriteTransformer("md", "done")]
+      ],
+    });
+
+    // pkg1|a.txt generates outputs based on the contents of pkg2|a.inc. At
+    // first pkg2|a.inc only includes "b", which is not transformed. Then
+    // pkg2|a.inc is updated to include "b,c.md". pkg1|c.md triggers the
+    // md->done rewrite transformer, producing pkg1|c.done.
+
+    updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
+    expectAsset("pkg1|b", "spread out");
+    buildShouldSucceed();
+
+    modifyAsset("pkg2|a.inc", "b,c.md");
+    updateSources(["pkg2|a.inc"]);
+    expectAsset("pkg1|b", "spread out");
+    expectAsset("pkg1|c.done", "spread out.done");
+    buildShouldSucceed();
+  });
+
+  test("doesn't run a transform that's removed because of a change in "
+      "another package", () {
+    initGraph({
+      "pkg1|a.txt": "pkg2|a.inc",
+      "pkg2|a.inc": "b,c.md"
+    }, {
+      "pkg1": [
+        [new ManyToOneTransformer("txt")],
+        [new OneToManyTransformer("out")],
+        [new RewriteTransformer("md", "done")]
+      ],
+    });
+
+    updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
+    expectAsset("pkg1|b", "spread out");
+    expectAsset("pkg1|c.done", "spread out.done");
+    buildShouldSucceed();
+
+    modifyAsset("pkg2|a.inc", "b");
+    updateSources(["pkg2|a.inc"]);
+    expectAsset("pkg1|b", "spread out");
+    expectNoAsset("pkg1|c.done");
+    buildShouldSucceed();
+  });
+
+  test("sees a transformer that's newly applied to a cross-package "
+      "dependency", () {
+    initGraph({
+      "pkg1|a.txt": "pkg2|a.inc",
+      "pkg2|a.inc": "a"
+    }, {
+      "pkg1": [[new ManyToOneTransformer("txt")]],
+      "pkg2": [[new CheckContentTransformer("b", " transformed")]]
+    });
+
+    updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
+    expectAsset("pkg1|a.out", "a");
+    buildShouldSucceed();
+
+    modifyAsset("pkg2|a.inc", "b");
+    updateSources(["pkg2|a.inc"]);
+    expectAsset("pkg1|a.out", "b transformed");
+    buildShouldSucceed();
+  });
+
+  test("doesn't see a transformer that's newly not applied to a "
+      "cross-package dependency", () {
+    initGraph({
+      "pkg1|a.txt": "pkg2|a.inc",
+      "pkg2|a.inc": "a"
+    }, {
+      "pkg1": [[new ManyToOneTransformer("txt")]],
+      "pkg2": [[new CheckContentTransformer("a", " transformed")]]
+    });
+
+    updateSources(["pkg1|a.txt", "pkg2|a.inc"]);
+    expectAsset("pkg1|a.out", "a transformed");
+    buildShouldSucceed();
+
+    modifyAsset("pkg2|a.inc", "b");
+    updateSources(["pkg2|a.inc"]);
+    expectAsset("pkg1|a.out", "b");
+    buildShouldSucceed();
+  });
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/barback/test/package_graph/transform/declaring_aggregate_test.dart b/mojo/public/dart/third_party/barback/test/package_graph/transform/declaring_aggregate_test.dart
new file mode 100644
index 0000000..3465f26
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/package_graph/transform/declaring_aggregate_test.dart
@@ -0,0 +1,251 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.package_graph.transform.declaring_aggregate_test;
+
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../utils.dart';
+
+main() {
+  initConfig();
+  group("a declaring aggregate transformer", () {
+    test("is eager by default", () {
+      var transformer = new DeclaringAggregateManyToOneTransformer(
+          "txt", "out.txt");
+      initGraph(["app|foo.txt"], {"app": [[transformer]]});
+
+      updateSources(["app|foo.txt"]);
+      buildShouldSucceed();
+
+      expect(transformer.numRuns, completion(equals(1)));
+    });
+
+    test("is deferred if any primary input is deferred", () {
+      var rewrite = new LazyRewriteTransformer("in", "txt");
+      var aggregate = new DeclaringAggregateManyToOneTransformer(
+          "txt", "out.txt");
+      initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [
+        [rewrite]
+      ]});
+
+      updateSources(["app|foo.in", "app|bar.txt", "app|baz.txt"]);
+      buildShouldSucceed();
+
+      // Add [aggregate] to the graph after a build has been completed so that
+      // all its inputs are available immediately. Otherwise it could start
+      // applying eagerly before receiving its lazy input.
+      updateTransformers("app", [[rewrite], [aggregate]]);
+      buildShouldSucceed();
+      expect(aggregate.numRuns, completion(equals(0)));
+
+      expectAsset("app|out.txt", "bar\nbaz\nfoo.txt");
+      buildShouldSucceed();
+      expect(aggregate.numRuns, completion(equals(1)));
+    });
+
+    test("switches from eager to deferred if a deferred primary input is added",
+        () {
+      var transformer = new DeclaringAggregateManyToOneTransformer(
+          "txt", "out.txt");
+      initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [
+        [new LazyRewriteTransformer("in", "txt")],
+        [transformer]
+      ]});
+
+      updateSources(["app|bar.txt", "app|baz.txt"]);
+      buildShouldSucceed();
+      expect(transformer.numRuns, completion(equals(1)));
+
+      updateSources(["app|foo.in"]);
+      buildShouldSucceed();
+      expect(transformer.numRuns, completion(equals(1)));
+
+      expectAsset("app|out.txt", "bar\nbaz\nfoo.txt");
+      buildShouldSucceed();
+      expect(transformer.numRuns, completion(equals(2)));
+    });
+
+    test("switches from deferred to eager if its last deferred primary input "
+        "is removed", () {
+      var rewrite = new LazyRewriteTransformer("in", "txt");
+      var aggregate = new DeclaringAggregateManyToOneTransformer(
+          "txt", "out.txt");
+      initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [
+        [rewrite]
+      ]});
+
+      updateSources(["app|foo.in", "app|bar.txt", "app|baz.txt"]);
+      buildShouldSucceed();
+
+      // Add [aggregate] to the graph after a build has been completed so that
+      // all its inputs are available immediately. Otherwise it could start
+      // applying eagerly before receiving its lazy input.
+      updateTransformers("app", [[rewrite], [aggregate]]);
+      buildShouldSucceed();
+      expect(aggregate.numRuns, completion(equals(0)));
+
+      removeSources(["app|foo.in"]);
+      buildShouldSucceed();
+      expect(aggregate.numRuns, completion(equals(1)));
+    });
+
+    test("begins running eagerly when all its deferred primary inputs become "
+        "available", () {
+      var lazyPhase = [
+        new LazyAssetsTransformer(["app|foo.txt", "app|foo.x"],
+            input: "app|foo.in"),
+        new LazyAssetsTransformer(["app|bar.txt", "app|bar.x"],
+            input: "app|bar.in")
+      ];
+      var transformer = new DeclaringAggregateManyToOneTransformer(
+          "txt", "out.txt");
+      initGraph(["app|foo.in", "app|bar.in", "app|baz.txt"], {"app": [
+        lazyPhase,
+      ]});
+
+      updateSources(["app|foo.in", "app|bar.in", "app|baz.txt"]);
+      buildShouldSucceed();
+
+      // Add [transformer] to the graph after a build has been completed so that
+      // all its inputs are available immediately. Otherwise it could start
+      // applying eagerly before receiving its lazy inputs.
+      updateTransformers("app", [lazyPhase, [transformer]]);
+      buildShouldSucceed();
+      expect(transformer.numRuns, completion(equals(0)));
+
+      // Now "app|foo.txt" will be available, but "app|bar.txt" won't, so the
+      // [transformer] shouldn't run.
+      expectAsset("app|foo.x", "app|foo.x");
+      buildShouldSucceed();
+      expect(transformer.numRuns, completion(equals(0)));
+
+      // Now "app|foo.txt" and "app|bar.txt" will both be available, so the
+      // [transformer] should run.
+      expectAsset("app|bar.x", "app|bar.x");
+      buildShouldSucceed();
+      expect(transformer.numRuns, completion(equals(1)));
+    });
+
+    test("stops running eagerly when any of its deferred primary inputs become "
+        "unavailable", () {
+      var lazyPhase = [
+        new LazyAssetsTransformer(["app|foo.txt", "app|foo.x"],
+            input: "app|foo.in"),
+        new LazyAssetsTransformer(["app|bar.txt", "app|bar.x"],
+            input: "app|bar.in")
+      ];
+      var transformer = new DeclaringAggregateManyToOneTransformer(
+          "txt", "out.txt");
+      initGraph(["app|foo.in", "app|bar.in", "app|baz.txt"], {"app": [
+        lazyPhase
+      ]});
+
+      updateSources(["app|foo.in", "app|bar.in", "app|baz.txt"]);
+      expectAsset("app|foo.x", "app|foo.x");
+      expectAsset("app|bar.x", "app|bar.x");
+      buildShouldSucceed();
+
+      // Add [transformer] to the graph after a build has been completed so that
+      // all its inputs are available immediately. Otherwise it could start
+      // applying eagerly before receiving its lazy inputs.
+      updateTransformers("app", [lazyPhase, [transformer]]);
+      buildShouldSucceed();
+      expect(transformer.numRuns, completion(equals(1)));
+
+      // Now "app|foo.txt" is unavailable, so the [transformer] shouldn't run.
+      updateSources(["app|foo.in"]);
+      buildShouldSucceed();
+      expect(transformer.numRuns, completion(equals(1)));
+    });
+
+    test("re-declares its outputs for a new primary input", () {
+      initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [
+        [new LazyRewriteTransformer("in", "txt")],
+        [new DeclaringAggregateManyToManyTransformer("txt")]
+      ]});
+
+      updateSources(["app|foo.in", "app|bar.txt"]);
+      buildShouldSucceed();
+
+      updateSources(["app|baz.txt"]);
+      buildShouldSucceed();
+
+      // If the aggregate transformer didn't re-declare its outputs upon getting
+      // a new primary input, getting "baz.txt" wouldn't trigger an apply and
+      // would just return the unmodified baz.
+      expectAsset("app|baz.txt", "modified baz");
+    });
+
+    test("re-declares its outputs for a new primary input received while "
+        "applying", () {
+      var transformer = new DeclaringAggregateManyToManyTransformer("txt");
+      initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [
+        [new LazyRewriteTransformer("in", "txt")],
+        [transformer]
+      ]});
+
+      transformer.pauseApply();
+      updateSources(["app|foo.in", "app|bar.txt"]);
+
+      // Ensure we're waiting on `apply()`.
+      schedule(pumpEventQueue);
+
+      updateSources(["app|baz.txt"]);
+      transformer.resumeApply();
+      buildShouldSucceed();
+
+      expectAsset("app|baz.txt", "modified baz");
+    });
+
+    test("re-declares its outputs for a new primary input received while "
+        "applying after a primary input was modified", () {
+      var transformer = new DeclaringAggregateManyToManyTransformer("txt");
+      initGraph(["app|foo.in", "app|bar.txt", "app|baz.txt"], {"app": [
+        [new LazyRewriteTransformer("in", "txt")],
+        [transformer]
+      ]});
+
+      transformer.pauseApply();
+      updateSources(["app|foo.in", "app|bar.txt"]);
+
+      // Ensure we're waiting on `apply()`.
+      schedule(pumpEventQueue);
+
+      updateSources(["app|bar.txt"]);
+
+      // Make sure the change to "bar.txt" is fully processed.
+      schedule(pumpEventQueue);
+
+      updateSources(["app|baz.txt"]);
+      transformer.resumeApply();
+      buildShouldSucceed();
+
+      expectAsset("app|baz.txt", "modified baz");
+    });
+  });
+
+  group("a lazy aggregate transformer", () {
+    test("doesn't run eagerly", () {
+      var transformer = new LazyAggregateManyToOneTransformer("txt", "out.txt");
+      initGraph(["app|foo.txt"], {"app": [[transformer]]});
+
+      updateSources(["app|foo.txt"]);
+      buildShouldSucceed();
+
+      expect(transformer.numRuns, completion(equals(0)));
+    });
+
+    test("runs when an output is requested", () {
+      initGraph(["app|foo.txt"], {"app": [[
+        new LazyAggregateManyToOneTransformer("txt", "out.txt")
+      ]]});
+
+      updateSources(["app|foo.txt"]);
+      buildShouldSucceed();
+      expectAsset("app|out.txt", "foo");
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/barback/test/package_graph/transform/pass_through_test.dart b/mojo/public/dart/third_party/barback/test/package_graph/transform/pass_through_test.dart
new file mode 100644
index 0000000..1e5f4b3
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/package_graph/transform/pass_through_test.dart
@@ -0,0 +1,255 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.package_graph.transform.pass_through_test;
+
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../utils.dart';
+
+main() {
+  initConfig();
+  test("passes an asset through a phase in which no transforms apply", () {
+    initGraph([
+      "app|foo.in",
+      "app|bar.zip",
+    ], {"app": [
+      [new RewriteTransformer("in", "mid")],
+      [new RewriteTransformer("zip", "zap")],
+      [new RewriteTransformer("mid", "out")],
+    ]});
+
+    updateSources(["app|foo.in", "app|bar.zip"]);
+    expectAsset("app|foo.out", "foo.mid.out");
+    expectAsset("app|bar.zap", "bar.zap");
+    buildShouldSucceed();
+  });
+
+  test("passes an asset through a phase in which a transform uses it", () {
+    initGraph([
+      "app|foo.in",
+    ], {"app": [
+      [new RewriteTransformer("in", "mid")],
+      [new RewriteTransformer("mid", "phase2")],
+      [new RewriteTransformer("mid", "phase3")],
+    ]});
+
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.in", "foo");
+    expectAsset("app|foo.mid", "foo.mid");
+    expectAsset("app|foo.phase2", "foo.mid.phase2");
+    expectAsset("app|foo.phase3", "foo.mid.phase3");
+    buildShouldSucceed();
+  });
+
+  // If the asset were to get passed through, it might either cause a collision
+  // or silently supersede the overwriting asset. We want to assert that that
+  // doesn't happen.
+  test("doesn't pass an asset through a phase in which a transform "
+      "overwrites it", () {
+    initGraph([
+      "app|foo.txt"
+    ], {"app": [[new RewriteTransformer("txt", "txt")]]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt", "foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("removes a pass-through asset when the source is removed", () {
+    initGraph([
+      "app|foo.in",
+      "app|bar.zip",
+    ], {"app": [
+      [new RewriteTransformer("zip", "zap")],
+      [new RewriteTransformer("in", "out")],
+    ]});
+
+    updateSources(["app|foo.in", "app|bar.zip"]);
+    expectAsset("app|foo.out", "foo.out");
+    buildShouldSucceed();
+
+    removeSources(["app|foo.in"]);
+    expectNoAsset("app|foo.in");
+    expectNoAsset("app|foo.out");
+    buildShouldSucceed();
+  });
+
+  test("updates a pass-through asset when the source is updated", () {
+    initGraph([
+      "app|foo.in",
+      "app|bar.zip",
+    ], {"app": [
+      [new RewriteTransformer("zip", "zap")],
+      [new RewriteTransformer("in", "out")],
+    ]});
+
+    updateSources(["app|foo.in", "app|bar.zip"]);
+    expectAsset("app|foo.out", "foo.out");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.in", "boo");
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.out", "boo.out");
+    buildShouldSucceed();
+  });
+
+  test("passes an asset through a phase in which transforms have ceased to "
+      "apply", () {
+    initGraph([
+      "app|foo.in",
+    ], {"app": [
+      [new RewriteTransformer("in", "mid")],
+      [new CheckContentTransformer("foo.mid", ".phase2")],
+      [new CheckContentTransformer(new RegExp(r"\.mid$"), ".phase3")],
+    ]});
+
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.mid", "foo.mid.phase2");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.in", "bar");
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.mid", "bar.mid.phase3");
+    buildShouldSucceed();
+  });
+
+  test("doesn't pass an asset through a phase in which transforms have "
+      "started to apply", () {
+    initGraph([
+      "app|foo.in",
+    ], {"app": [
+      [new RewriteTransformer("in", "mid")],
+      [new CheckContentTransformer("bar.mid", ".phase2")],
+      [new CheckContentTransformer(new RegExp(r"\.mid$"), ".phase3")],
+    ]});
+
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.mid", "foo.mid.phase3");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.in", "bar");
+    updateSources(["app|foo.in"]);
+    expectAsset("app|foo.mid", "bar.mid.phase2");
+    buildShouldSucceed();
+  });
+
+  test("doesn't pass an asset through if it's removed during isPrimary", () {
+    var check = new CheckContentTransformer("bar", " modified");
+    initGraph(["app|foo.txt"], {"app": [[check]]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt", "foo");
+    buildShouldSucceed();
+
+    check.pauseIsPrimary("app|foo.txt");
+    modifyAsset("app|foo.txt", "bar");
+    updateSources(["app|foo.txt"]);
+    // Ensure we're waiting on [check.isPrimary]
+    schedule(pumpEventQueue);
+
+    removeSources(["app|foo.txt"]);
+    check.resumeIsPrimary("app|foo.txt");
+    expectNoAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("passes an asset through when its overwriting transform becomes "
+      "non-primary during apply", () {
+    var check = new CheckContentTransformer("yes", " modified");
+    initGraph({"app|foo.txt": "yes"}, {"app": [[check]]});
+
+    check.pauseApply();
+    updateSources(["app|foo.txt"]);
+    expectAssetDoesNotComplete("app|foo.txt");
+
+    modifyAsset("app|foo.txt", "no");
+    updateSources(["app|foo.txt"]);
+    check.resumeApply();
+
+    expectAsset("app|foo.txt", "no");
+    buildShouldSucceed();
+  });
+
+  test("doesn't pass an asset through when its overwriting transform becomes "
+      "non-primary during apply if another transform overwrites it", () {
+    var check = new CheckContentTransformer("yes", " modified");
+    initGraph({
+      "app|foo.txt": "yes"
+    }, {
+      "app": [[check, new RewriteTransformer("txt", "txt")]]
+    });
+
+    check.pauseApply();
+    updateSources(["app|foo.txt"]);
+    // Ensure we're waiting on [check.apply]
+    schedule(pumpEventQueue);
+
+    modifyAsset("app|foo.txt", "no");
+    updateSources(["app|foo.txt"]);
+    check.resumeApply();
+
+    expectAsset("app|foo.txt", "no.txt");
+    buildShouldSucceed();
+  });
+
+  test("doesn't pass an asset through when one overwriting transform becomes "
+      "non-primary if another transform still overwrites it", () {
+    initGraph({
+      "app|foo.txt": "yes"
+    }, {
+      "app": [[
+        new CheckContentTransformer("yes", " modified"),
+        new RewriteTransformer("txt", "txt")
+      ]]
+    });
+
+    updateSources(["app|foo.txt"]);
+    // This could be either the output of [CheckContentTransformer] or
+    // [RewriteTransformer], depending which completes first.
+    expectAsset("app|foo.txt", anything);
+    buildShouldFail([isAssetCollisionException("app|foo.txt")]);
+
+    modifyAsset("app|foo.txt", "no");
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt", "no.txt");
+    buildShouldSucceed();
+  });
+
+  test("doesn't return a pass-through asset until we know it won't be "
+      "overwritten", () {
+    var rewrite = new RewriteTransformer("txt", "txt");
+    initGraph(["app|foo.a"], {"app": [[rewrite]]});
+
+    rewrite.pauseIsPrimary("app|foo.a");
+    updateSources(["app|foo.a"]);
+    expectAssetDoesNotComplete("app|foo.a");
+
+    rewrite.resumeIsPrimary("app|foo.a");
+    expectAsset("app|foo.a", "foo");
+    buildShouldSucceed();
+  });
+
+  test("doesn't return a pass-through asset until we know it won't be "
+      "overwritten when secondary inputs change", () {
+    var manyToOne = new ManyToOneTransformer("txt");
+    initGraph({
+      "app|foo.txt": "bar.in",
+      "app|bar.in": "bar"
+    }, {"app": [[manyToOne]]});
+
+    updateSources(["app|foo.txt", "app|bar.in"]);
+    expectAsset("app|foo.txt", "bar.in");
+    expectAsset("app|foo.out", "bar");
+
+    manyToOne.pauseApply();
+    updateSources(["app|bar.in"]);
+    expectAssetDoesNotComplete("app|foo.txt");
+
+    manyToOne.resumeApply();
+    expectAsset("app|foo.txt", "bar.in");
+    buildShouldSucceed();
+  });
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/barback/test/package_graph/transform/transform_test.dart b/mojo/public/dart/third_party/barback/test/package_graph/transform/transform_test.dart
new file mode 100644
index 0000000..17af1ef
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/package_graph/transform/transform_test.dart
@@ -0,0 +1,435 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This library contains tests for transformer behavior that relates to actions
+// happening concurrently or other complex asynchronous timing behavior.
+library barback.test.package_graph.transform.transform_test;
+
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../utils.dart';
+
+main() {
+  initConfig();
+  test("gets a transformed asset with a different path", () {
+    initGraph(["app|foo.blub"], {"app": [
+      [new RewriteTransformer("blub", "blab")]
+    ]});
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+  });
+
+  test("gets a transformed asset with the same path", () {
+    initGraph(["app|foo.blub"], {"app": [
+      [new RewriteTransformer("blub", "blub")]
+    ]});
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blub", "foo.blub");
+    buildShouldSucceed();
+  });
+
+  test("doesn't find an output from a later phase", () {
+    initGraph(["app|foo.a"], {"app": [
+      [new RewriteTransformer("b", "c")],
+      [new RewriteTransformer("a", "b")]
+    ]});
+    updateSources(["app|foo.a"]);
+    expectNoAsset("app|foo.c");
+    buildShouldSucceed();
+  });
+
+  test("doesn't find an output from the same phase", () {
+    initGraph(["app|foo.a"], {"app": [
+      [
+        new RewriteTransformer("a", "b"),
+        new RewriteTransformer("b", "c")
+      ]
+    ]});
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.b", "foo.b");
+    expectNoAsset("app|foo.c");
+    buildShouldSucceed();
+  });
+
+  test("finds the latest output before the transformer's phase", () {
+    initGraph(["app|foo.blub"], {"app": [
+      [new RewriteTransformer("blub", "blub")],
+      [
+        new RewriteTransformer("blub", "blub"),
+        new RewriteTransformer("blub", "done")
+      ],
+      [new RewriteTransformer("blub", "blub")]
+    ]});
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.done", "foo.blub.done");
+    buildShouldSucceed();
+  });
+
+  test("applies multiple transformations to an asset", () {
+    initGraph(["app|foo.a"], {"app": [
+      [new RewriteTransformer("a", "b")],
+      [new RewriteTransformer("b", "c")],
+      [new RewriteTransformer("c", "d")],
+      [new RewriteTransformer("d", "e")],
+      [new RewriteTransformer("e", "f")],
+      [new RewriteTransformer("f", "g")],
+      [new RewriteTransformer("g", "h")],
+      [new RewriteTransformer("h", "i")],
+      [new RewriteTransformer("i", "j")],
+      [new RewriteTransformer("j", "k")],
+    ]});
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.k", "foo.b.c.d.e.f.g.h.i.j.k");
+    buildShouldSucceed();
+  });
+
+  test("only runs a transform once for all of its outputs", () {
+    var transformer = new RewriteTransformer("blub", "a b c");
+    initGraph(["app|foo.blub"], {"app": [[transformer]]});
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.a", "foo.a");
+    expectAsset("app|foo.b", "foo.b");
+    expectAsset("app|foo.c", "foo.c");
+    buildShouldSucceed();
+    expect(transformer.numRuns, completion(equals(1)));
+  });
+
+  test("outputs are passed through transformers by default", () {
+    initGraph(["app|foo.a"], {"app": [
+      [new RewriteTransformer("a", "b")],
+      [new RewriteTransformer("a", "c")]
+    ]});
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.a", "foo");
+    expectAsset("app|foo.b", "foo.b");
+    expectAsset("app|foo.c", "foo.c");
+    buildShouldSucceed();
+  });
+
+  test("does not reapply transform when inputs are not modified", () {
+    var transformer = new RewriteTransformer("blub", "blab");
+    initGraph(["app|foo.blub"], {"app": [[transformer]]});
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blab", "foo.blab");
+    expectAsset("app|foo.blab", "foo.blab");
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+
+    expect(transformer.numRuns, completion(equals(1)));
+  });
+
+  test("reapplies a transform when its input is modified", () {
+    var transformer = new RewriteTransformer("blub", "blab");
+    initGraph(["app|foo.blub"], {"app": [[transformer]]});
+
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blab", "foo.blab");
+    buildShouldSucceed();
+
+    expect(transformer.numRuns, completion(equals(3)));
+  });
+
+  test("does not reapply transform when a removed input is modified", () {
+    var transformer = new ManyToOneTransformer("txt");
+    initGraph({
+      "app|a.txt": "a.inc,b.inc",
+      "app|a.inc": "a",
+      "app|b.inc": "b"
+    }, {"app": [[transformer]]});
+
+    updateSources(["app|a.txt", "app|a.inc", "app|b.inc"]);
+
+    expectAsset("app|a.out", "ab");
+    buildShouldSucceed();
+
+    // Remove the dependency on the non-primary input.
+    modifyAsset("app|a.txt", "a.inc");
+    updateSources(["app|a.txt"]);
+
+    // Process it again.
+    expectAsset("app|a.out", "a");
+    buildShouldSucceed();
+
+    // Now touch the removed input. It should not trigger another build.
+    updateSources(["app|b.inc"]);
+    expectAsset("app|a.out", "a");
+    buildShouldSucceed();
+
+    expect(transformer.numRuns, completion(equals(2)));
+  });
+
+  test("allows a transform to generate multiple outputs", () {
+    initGraph({"app|foo.txt": "a.out,b.out"}, {"app": [
+      [new OneToManyTransformer("txt")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+
+    expectAsset("app|a.out", "spread txt");
+    expectAsset("app|b.out", "spread txt");
+    buildShouldSucceed();
+  });
+
+  test("does not rebuild transforms that don't use modified source", () {
+    var a = new RewriteTransformer("a", "aa");
+    var aa = new RewriteTransformer("aa", "aaa");
+    var b = new RewriteTransformer("b", "bb");
+    var bb = new RewriteTransformer("bb", "bbb");
+    initGraph(["app|foo.a", "app|foo.b"], {"app": [
+      [a, b],
+      [aa, bb],
+    ]});
+
+    updateSources(["app|foo.a"]);
+    updateSources(["app|foo.b"]);
+
+    expectAsset("app|foo.aaa", "foo.aa.aaa");
+    expectAsset("app|foo.bbb", "foo.bb.bbb");
+    buildShouldSucceed();
+
+    updateSources(["app|foo.a"]);
+    expectAsset("app|foo.aaa", "foo.aa.aaa");
+    expectAsset("app|foo.bbb", "foo.bb.bbb");
+    buildShouldSucceed();
+
+    expect(aa.numRuns, completion(equals(2)));
+    expect(bb.numRuns, completion(equals(1)));
+  });
+
+  test("doesn't get an output from a transform whose primary input is removed",
+      () {
+    initGraph(["app|foo.txt"], {"app": [
+      [new RewriteTransformer("txt", "out")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.out", "foo.out");
+    buildShouldSucceed();
+
+    removeSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.out");
+    buildShouldSucceed();
+  });
+
+  test("reapplies a transform when a non-primary input changes", () {
+    initGraph({
+      "app|a.txt": "a.inc",
+      "app|a.inc": "a"
+    }, {"app": [[new ManyToOneTransformer("txt")]]});
+
+    updateSources(["app|a.txt", "app|a.inc"]);
+    expectAsset("app|a.out", "a");
+    buildShouldSucceed();
+
+    modifyAsset("app|a.inc", "after");
+    updateSources(["app|a.inc"]);
+
+    expectAsset("app|a.out", "after");
+    buildShouldSucceed();
+  });
+
+  test("applies a transform when it becomes newly primary", () {
+    initGraph({
+      "app|foo.txt": "this",
+    }, {"app": [[new CheckContentTransformer("that", " and the other")]]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.txt", "this");
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.txt", "that");
+    updateSources(["app|foo.txt"]);
+
+    expectAsset("app|foo.txt", "that and the other");
+    buildShouldSucceed();
+  });
+
+  test("handles an output moving from one transformer to another", () {
+    // In the first run, "shared.out" is created by the "a.a" transformer.
+    initGraph({
+      "app|a.a": "a.out,shared.out",
+      "app|b.b": "b.out"
+    }, {"app": [
+      [new OneToManyTransformer("a"), new OneToManyTransformer("b")]
+    ]});
+
+    updateSources(["app|a.a", "app|b.b"]);
+
+    expectAsset("app|a.out", "spread a");
+    expectAsset("app|b.out", "spread b");
+    expectAsset("app|shared.out", "spread a");
+    buildShouldSucceed();
+
+    // Now switch their contents so that "shared.out" will be output by "b.b"'s
+    // transformer.
+    modifyAsset("app|a.a", "a.out");
+    modifyAsset("app|b.b", "b.out,shared.out");
+    updateSources(["app|a.a", "app|b.b"]);
+
+    expectAsset("app|a.out", "spread a");
+    expectAsset("app|b.out", "spread b");
+    expectAsset("app|shared.out", "spread b");
+    buildShouldSucceed();
+  });
+
+  test("applies transforms to the correct packages", () {
+    var rewrite1 = new RewriteTransformer("txt", "out1");
+    var rewrite2 = new RewriteTransformer("txt", "out2");
+    initGraph([
+      "pkg1|foo.txt",
+      "pkg2|foo.txt"
+    ], {"pkg1": [[rewrite1]], "pkg2": [[rewrite2]]});
+
+    updateSources(["pkg1|foo.txt", "pkg2|foo.txt"]);
+    expectAsset("pkg1|foo.out1", "foo.out1");
+    expectAsset("pkg2|foo.out2", "foo.out2");
+    buildShouldSucceed();
+  });
+
+  test("transforms don't see generated assets in other packages", () {
+    var fooToBar = new RewriteTransformer("foo", "bar");
+    var barToBaz = new RewriteTransformer("bar", "baz");
+    initGraph(["pkg1|file.foo"], {"pkg1": [[fooToBar]], "pkg2": [[barToBaz]]});
+
+    updateSources(["pkg1|file.foo"]);
+    expectAsset("pkg1|file.bar", "file.bar");
+    expectNoAsset("pkg2|file.baz");
+    buildShouldSucceed();
+  });
+
+  test("removes pipelined transforms when the root primary input is removed",
+      () {
+    initGraph(["app|foo.txt"], {"app": [
+      [new RewriteTransformer("txt", "mid")],
+      [new RewriteTransformer("mid", "out")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectAsset("app|foo.out", "foo.mid.out");
+    buildShouldSucceed();
+
+    removeSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.out");
+    buildShouldSucceed();
+  });
+
+  test("removes pipelined transforms when the parent ceases to generate the "
+      "primary input", () {
+    initGraph({"app|foo.txt": "foo.mid"}, {'app': [
+      [new OneToManyTransformer('txt')],
+      [new RewriteTransformer('mid', 'out')]
+    ]});
+
+    updateSources(['app|foo.txt']);
+    expectAsset('app|foo.out', 'spread txt.out');
+    buildShouldSucceed();
+
+    modifyAsset("app|foo.txt", "bar.mid");
+    updateSources(["app|foo.txt"]);
+    expectNoAsset('app|foo.out');
+    expectAsset('app|bar.out', 'spread txt.out');
+    buildShouldSucceed();
+  });
+
+  test("gets an asset transformed by a sync transformer", () {
+    initGraph(["app|foo.blub"], {"app": [
+      [new SyncRewriteTransformer("blub", "blab")]
+    ]});
+    updateSources(["app|foo.blub"]);
+    expectAsset("app|foo.blab", "new.blab");
+    buildShouldSucceed();
+  });
+
+  group("Transform.hasInput", () {
+    test("returns whether an input exists", () {
+      initGraph(["app|foo.txt", "app|bar.txt"], {'app': [
+        [new HasInputTransformer(['app|foo.txt', 'app|bar.txt', 'app|baz.txt'])]
+      ]});
+
+      updateSources(['app|foo.txt', 'app|bar.txt']);
+      expectAsset('app|foo.txt',
+          'app|foo.txt: true, app|bar.txt: true, app|baz.txt: false');
+      buildShouldSucceed();
+    });
+
+    test("re-runs the transformer when an input stops existing", () {
+      initGraph(["app|foo.txt", "app|bar.txt"], {'app': [
+        [new HasInputTransformer(['app|bar.txt'])]
+      ]});
+
+      updateSources(['app|foo.txt', 'app|bar.txt']);
+      expectAsset('app|foo.txt', 'app|bar.txt: true');
+      buildShouldSucceed();
+
+      removeSources(['app|bar.txt']);
+      expectAsset('app|foo.txt', 'app|bar.txt: false');
+      buildShouldSucceed();
+    });
+
+    test("re-runs the transformer when an input starts existing", () {
+      initGraph(["app|foo.txt", "app|bar.txt"], {'app': [
+        [new HasInputTransformer(['app|bar.txt'])]
+      ]});
+    
+      updateSources(['app|foo.txt']);
+      expectAsset('app|foo.txt', 'app|bar.txt: false');
+      buildShouldSucceed();
+    
+      updateSources(['app|bar.txt']);
+      expectAsset('app|foo.txt', 'app|bar.txt: true');
+      buildShouldSucceed();
+    });
+
+    group("on an input in another package", () {
+      test("returns whether it exists", () {
+        initGraph(["app|foo.txt", "other|bar.txt"], {'app': [
+          [new HasInputTransformer(['other|bar.txt', 'other|baz.txt'])]
+        ]});
+
+        updateSources(['app|foo.txt', 'other|bar.txt']);
+        expectAsset('app|foo.txt',
+            'other|bar.txt: true, other|baz.txt: false');
+        buildShouldSucceed();
+      });
+
+      test("re-runs the transformer when it stops existing", () {
+        initGraph(["app|foo.txt", "other|bar.txt"], {'app': [
+          [new HasInputTransformer(['other|bar.txt'])]
+        ]});
+
+        updateSources(['app|foo.txt', 'other|bar.txt']);
+        expectAsset('app|foo.txt', 'other|bar.txt: true');
+        buildShouldSucceed();
+
+        removeSources(['other|bar.txt']);
+        expectAsset('app|foo.txt', 'other|bar.txt: false');
+        buildShouldSucceed();
+      });
+
+      test("re-runs the transformer when it starts existing", () {
+        initGraph(["app|foo.txt", "other|bar.txt"], {'app': [
+          [new HasInputTransformer(['other|bar.txt'])]
+        ]});
+      
+        updateSources(['app|foo.txt']);
+        expectAsset('app|foo.txt', 'other|bar.txt: false');
+        buildShouldSucceed();
+      
+        updateSources(['other|bar.txt']);
+        expectAsset('app|foo.txt', 'other|bar.txt: true');
+        buildShouldSucceed();
+      });
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/barback/test/static_provider_test.dart b/mojo/public/dart/third_party/barback/test/static_provider_test.dart
new file mode 100644
index 0000000..4bd44f9
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/static_provider_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.static_provider_test;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import 'utils.dart';
+
+main() {
+  initConfig();
+  test("gets a static source asset", () {
+    initStaticGraph(["app|foo.txt"], staticPackages: ["app"]);
+    expectAsset("app|foo.txt");
+    buildShouldSucceed();
+  });
+
+  test("doesn't get a nonexistent static source asset", () {
+    initStaticGraph(["app|foo.txt"], staticPackages: ["app"]);
+    expectNoAsset("app|bar.txt");
+  });
+
+  test("a transformer can see a static asset", () {
+    initStaticGraph({
+      "static|b.inc": "b",
+      "app|a.txt": "static|b.inc"
+    }, staticPackages: ["static"], transformers: {
+      "app": [[new ManyToOneTransformer("txt")]]
+    });
+    updateSources(["app|a.txt"]);
+    expectAsset("app|a.out", "b");
+  });
+
+  test("can list all static assets", () {
+    initStaticGraph(["app|foo.txt", "app|bar.txt", "app|baz.txt"],
+        staticPackages: ["app"]);
+    expectAllAssets(["app|foo.txt", "app|bar.txt", "app|baz.txt"]);
+  });
+}
diff --git a/mojo/public/dart/third_party/barback/test/stream_pool_test.dart b/mojo/public/dart/third_party/barback/test/stream_pool_test.dart
new file mode 100644
index 0000000..ed590f3
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/stream_pool_test.dart
@@ -0,0 +1,219 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.stream_pool_test;
+
+import 'dart:async';
+
+import 'package:barback/src/utils.dart';
+import 'package:barback/src/utils/stream_pool.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import 'utils.dart';
+
+main() {
+  initConfig();
+
+  group("buffered", () {
+    test("buffers events from multiple inputs", () {
+      var pool = new StreamPool<String>();
+
+      var controller1 = new StreamController<String>();
+      pool.add(controller1.stream);
+      controller1.add("first");
+
+      var controller2 = new StreamController<String>();
+      pool.add(controller2.stream);
+      controller2.add("second");
+
+      // Call [toList] asynchronously to be sure that the events have been
+      // buffered beforehand and aren't just being received unbuffered.
+      expect(newFuture(() => pool.stream.toList()),
+          completion(equals(["first", "second"])));
+
+      pumpEventQueue().then((_) => pool.close());
+    });
+
+    test("buffers errors from multiple inputs", () {
+      var pool = new StreamPool<String>();
+
+      var controller1 = new StreamController<String>();
+      pool.add(controller1.stream);
+      controller1.add("first");
+
+      var controller2 = new StreamController<String>();
+      pool.add(controller2.stream);
+      controller2.add("second");
+      controller1.addError("third");
+      controller2.addError("fourth");
+      controller1.add("fifth");
+
+      expect(newFuture(() {
+        return pool.stream.transform(new StreamTransformer.fromHandlers(
+            handleData: (data, sink) => sink.add(["data", data]),
+            handleError: (error, stackTrace, sink) {
+          sink.add(["error", error]);
+        })).toList();
+      }), completion(equals([
+        ["data", "first"],
+        ["data", "second"],
+        ["error", "third"],
+        ["error", "fourth"],
+        ["data", "fifth"]
+      ])));
+
+      pumpEventQueue().then((_) => pool.close());
+    });
+
+    test("buffers inputs from a broadcast stream", () {
+      var pool = new StreamPool<String>();
+      var controller = new StreamController<String>.broadcast();
+      pool.add(controller.stream);
+      controller.add("first");
+      controller.add("second");
+
+      // Call [toList] asynchronously to be sure that the events have been
+      // buffered beforehand and aren't just being received unbuffered.
+      expect(newFuture(() => pool.stream.toList()),
+          completion(equals(["first", "second"])));
+
+      pumpEventQueue().then((_) => pool.close());
+    });
+  });
+
+  group("broadcast", () {
+    test("doesn't buffer inputs", () {
+      var pool = new StreamPool<String>.broadcast();
+
+      var controller1 = new StreamController<String>.broadcast();
+      pool.add(controller1.stream);
+      controller1.add("first");
+
+      var controller2 = new StreamController<String>.broadcast();
+      pool.add(controller2.stream);
+      controller2.add("second");
+
+      // Call [toList] asynchronously to be sure that the events have been
+      // buffered beforehand and aren't just being received unbuffered.
+      expect(newFuture(() => pool.stream.toList()), completion(isEmpty));
+
+      pumpEventQueue().then((_) => pool.close());
+    });
+
+    test("doesn't buffer errors", () {
+      var pool = new StreamPool<String>.broadcast();
+
+      var controller1 = new StreamController<String>.broadcast();
+      pool.add(controller1.stream);
+      controller1.addError("first");
+
+      var controller2 = new StreamController<String>.broadcast();
+      pool.add(controller2.stream);
+      controller2.addError("second");
+
+      expect(newFuture(() {
+        return pool.stream.transform(new StreamTransformer.fromHandlers(
+            handleData: (data, sink) => sink.add(data),
+            handleError: (error, stackTrace, sink) { sink.add(error); }))
+            .toList();
+      }), completion(isEmpty));
+
+      pumpEventQueue().then((_) => pool.close());
+    });
+
+    test("doesn't buffer inputs from a buffered stream", () {
+      var pool = new StreamPool<String>.broadcast();
+      var controller = new StreamController<String>();
+      pool.add(controller.stream);
+      controller.add("first");
+      controller.add("second");
+
+      expect(pumpEventQueue().then((_) => pool.stream.toList()),
+          completion(isEmpty));
+
+      pumpEventQueue().then((_) => pool.close());
+    });
+  });
+
+  for (var type in ["buffered", "broadcast"]) {
+    group(type, () {
+      var pool;
+      var bufferedController;
+      var bufferedStream;
+      var bufferedSyncController;
+      var broadcastController;
+      var broadcastStream;
+      var broadcastSyncController;
+
+      setUp(() {
+        if (type == "buffered") {
+          pool = new StreamPool<String>();
+        } else {
+          pool = new StreamPool<String>.broadcast();
+        }
+
+        bufferedController = new StreamController<String>();
+        pool.add(bufferedController.stream);
+
+        bufferedSyncController = new StreamController<String>(sync: true);
+        pool.add(bufferedSyncController.stream);
+
+        broadcastController = new StreamController<String>.broadcast();
+        pool.add(broadcastController.stream);
+
+        broadcastSyncController =
+          new StreamController<String>.broadcast(sync: true);
+        pool.add(broadcastSyncController.stream);
+      });
+
+      test("emits events to a listener", () {
+        expect(pool.stream.toList(), completion(equals(["first", "second"])));
+
+        bufferedController.add("first");
+        broadcastController.add("second");
+        pumpEventQueue().then((_) => pool.close());
+      });
+
+      test("emits sync events synchronously", () {
+        var events = [];
+        pool.stream.listen(events.add);
+
+        bufferedSyncController.add("first");
+        expect(events, equals(["first"]));
+
+        broadcastSyncController.add("second");
+        expect(events, equals(["first", "second"]));
+      });
+
+      test("emits async events asynchronously", () {
+        var events = [];
+        pool.stream.listen(events.add);
+
+        bufferedController.add("first");
+        broadcastController.add("second");
+        expect(events, isEmpty);
+
+        expect(pumpEventQueue().then((_) => events),
+            completion(equals(["first", "second"])));
+      });
+
+      test("doesn't emit events from removed streams", () {
+        expect(pool.stream.toList(), completion(equals(["first", "third"])));
+
+        bufferedController.add("first");
+        expect(pumpEventQueue().then((_) {
+          pool.remove(bufferedController.stream);
+          bufferedController.add("second");
+        }).then((_) {
+          broadcastController.add("third");
+          return pumpEventQueue();
+        }).then((_) {
+          pool.remove(broadcastController.stream);
+          broadcastController.add("fourth");
+          pool.close();
+        }), completes);
+      });
+    });
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/test/stream_replayer_test.dart b/mojo/public/dart/third_party/barback/test/stream_replayer_test.dart
new file mode 100644
index 0000000..802db14
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/stream_replayer_test.dart
@@ -0,0 +1,101 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.stream_replayer_test;
+
+import 'dart:async';
+
+import 'package:barback/src/utils.dart';
+import 'package:barback/src/utils/stream_replayer.dart';
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+main() {
+  initConfig();
+
+  test("a replay that's retrieved before the stream is finished replays the "
+      "stream", () {
+    var controller = new StreamController<int>();
+    var replay = new StreamReplayer<int>(controller.stream).getReplay();
+
+    controller.add(1);
+    controller.add(2);
+    controller.add(3);
+    controller.close();
+
+    expect(replay.toList(), completion(equals([1, 2, 3])));
+  });
+
+  test("a replay that's retrieved after the stream is finished replays the "
+      "stream", () {
+    var controller = new StreamController<int>();
+    var replayer = new StreamReplayer<int>(controller.stream);
+
+    controller.add(1);
+    controller.add(2);
+    controller.add(3);
+    controller.close();
+
+    expect(replayer.getReplay().toList(), completion(equals([1, 2, 3])));
+  });
+
+  test("multiple replays each replay the stream", () {
+    var controller = new StreamController<int>();
+    var replayer = new StreamReplayer<int>(controller.stream);
+
+    var replay1 = replayer.getReplay();
+    controller.add(1);
+    controller.add(2);
+    controller.add(3);
+    controller.close();
+    var replay2 = replayer.getReplay();
+
+    expect(replay1.toList(), completion(equals([1, 2, 3])));
+    expect(replay2.toList(), completion(equals([1, 2, 3])));
+  });
+
+  test("the replayed stream doesn't close until the source stream closes", () {
+    var controller = new StreamController<int>();
+    var replay = new StreamReplayer<int>(controller.stream).getReplay();
+    var isClosed = false;
+    replay.last.then((_) {
+      isClosed = true;
+    });
+
+    controller.add(1);
+    controller.add(2);
+    controller.add(3);
+
+    expect(pumpEventQueue().then((_) {
+      expect(isClosed, isFalse);
+      controller.close();
+      return pumpEventQueue();
+    }).then((_) {
+      expect(isClosed, isTrue);
+    }), completes);
+  });
+
+  test("the wrapped stream isn't opened if there are no replays", () {
+    var isOpened = false;
+    var controller = new StreamController<int>(onListen: () {
+      isOpened = true;
+    });
+    var replayer = new StreamReplayer<int>(controller.stream);
+
+    expect(pumpEventQueue().then((_) => isOpened), completion(isFalse));
+  });
+
+  test("the wrapped stream isn't opened if no replays are opened", () {
+    var isOpened = false;
+    var controller = new StreamController<int>(onListen: () {
+      isOpened = true;
+    });
+    var replayer = new StreamReplayer<int>(controller.stream);
+    replayer.getReplay();
+    replayer.getReplay();
+
+    expect(pumpEventQueue().then((_) => isOpened), completion(isFalse));
+  });
+}
diff --git a/mojo/public/dart/third_party/barback/test/too_many_open_files_test.dart b/mojo/public/dart/third_party/barback/test/too_many_open_files_test.dart
new file mode 100644
index 0000000..b45af71
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/too_many_open_files_test.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.too_many_open_files_test;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as pathos;
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+main() {
+  initConfig();
+
+  test("handles many simultaneous asset read() calls", () {
+    runOnManyFiles((asset) => asset.read().toList());
+  });
+
+  test("handles many simultaneous asset readToString() calls", () {
+    runOnManyFiles((asset) => asset.readAsString());
+  });
+}
+
+runOnManyFiles(Future assetHandler(Asset asset)) {
+  // Make a text file in a temp directory.
+  var tempDir = Directory.systemTemp.createTempSync("barback").path;
+  var filePath = pathos.join(tempDir, "out.txt");
+
+  // Make sure it's large enough to not be read in a single chunk.
+  var contents = new StringBuffer();
+  for (var i = 0; i < 1024; i++) {
+    contents.write(
+        "this is a sixty four character long string that describes itself");
+  }
+
+  new File(filePath).writeAsStringSync(contents.toString());
+
+  var id = new AssetId("myapp", "out.txt");
+
+  // Create a large number of assets, larger than the file descriptor limit
+  // of most machines and start reading from all of them.
+  var futures = [];
+  for (var i = 0; i < 1000; i++) {
+    var asset = new Asset.fromPath(id, filePath);
+    futures.add(assetHandler(asset));
+  }
+
+  expect(Future.wait(futures).whenComplete(() {
+    new Directory(tempDir).delete(recursive: true);
+  }), completes);
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/barback/test/transformer/aggregate_many_to_many.dart b/mojo/public/dart/third_party/barback/test/transformer/aggregate_many_to_many.dart
new file mode 100644
index 0000000..6e3c8a1
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/aggregate_many_to_many.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.aggregate_many_to_many;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as path;
+
+import 'mock_aggregate.dart';
+
+/// An [AggregateTransformer] that takes all assets with a given extension,
+/// grouped by directory, adds to their contents.
+class AggregateManyToManyTransformer extends MockAggregateTransformer {
+  /// The extension of assets to combine.
+  final String extension;
+
+  AggregateManyToManyTransformer(this.extension);
+
+  String doClassifyPrimary(AssetId id) {
+    if (id.extension != ".$extension") return null;
+    return path.url.dirname(id.path);
+  }
+
+  Future doApply(AggregateTransform transform) {
+    return getPrimaryInputs(transform).asyncMap((asset) {
+      return asset.readAsString().then((contents) {
+        transform.addOutput(new Asset.fromString(
+            asset.id, "modified $contents"));
+      });
+    }).toList();
+  }
+
+  String toString() => "aggregate $extension->many";
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/aggregate_many_to_one.dart b/mojo/public/dart/third_party/barback/test/transformer/aggregate_many_to_one.dart
new file mode 100644
index 0000000..7bba89f
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/aggregate_many_to_one.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.aggregate_many_to_one;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as path;
+
+import 'mock_aggregate.dart';
+
+/// An [AggregateTransformer] that applies to all assets with a given extension.
+/// For each directory containing any of these assets, it produces an output
+/// file that contains the concatenation of all matched assets in that
+/// directory in alphabetic order by name.
+class AggregateManyToOneTransformer extends MockAggregateTransformer {
+  /// The extension of assets to combine.
+  final String extension;
+
+  /// The basename of the output asset.
+  ///
+  /// The output asset's path will contain the directory name of the inputs as
+  /// well.
+  final String output;
+
+  AggregateManyToOneTransformer(this.extension, this.output);
+
+  String doClassifyPrimary(AssetId id) {
+    if (id.extension != ".$extension") return null;
+    return path.url.dirname(id.path);
+  }
+
+  Future doApply(AggregateTransform transform) {
+    return getPrimaryInputs(transform).toList().then((assets) {
+      assets.sort((asset1, asset2) => asset1.id.path.compareTo(asset2.id.path));
+      return Future.wait(assets.map((asset) => asset.readAsString()));
+    }).then((contents) {
+      var id = new AssetId(transform.package,
+          path.url.join(transform.key, output));
+      transform.addOutput(new Asset.fromString(id, contents.join('\n')));
+    });
+  }
+
+  String toString() => "aggregate $extension->$output";
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/bad.dart b/mojo/public/dart/third_party/barback/test/transformer/bad.dart
new file mode 100644
index 0000000..0cc3496
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/bad.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.bad;
+
+import 'package:barback/barback.dart';
+
+import 'mock.dart';
+
+/// A transformer that throws an exception when run, after generating the
+/// given outputs.
+class BadTransformer extends MockTransformer {
+  /// The error it throws.
+  static const ERROR = "I am a bad transformer!";
+
+  /// The list of asset names that it should output.
+  final List<String> outputs;
+
+  BadTransformer(this.outputs);
+
+  bool doIsPrimary(AssetId id) => true;
+
+  void doApply(Transform transform) {
+    // Create the outputs first.
+    for (var output in outputs) {
+      var id = new AssetId.parse(output);
+      transform.addOutput(new Asset.fromString(id, output));
+    }
+
+    // Then fail.
+    throw ERROR;
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/bad_log.dart b/mojo/public/dart/third_party/barback/test/transformer/bad_log.dart
new file mode 100644
index 0000000..b84f105
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/bad_log.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.bad_log;
+
+import 'package:barback/barback.dart';
+
+import 'mock.dart';
+
+/// A transformer that logs an error when run, Before generating the given
+/// outputs.
+class BadLogTransformer extends MockTransformer {
+  /// The list of asset names that it should output.
+  final List<String> outputs;
+
+  BadLogTransformer(this.outputs);
+
+  bool doIsPrimary(AssetId id) => true;
+
+  void doApply(Transform transform) {
+    transform.logger.error("first error");
+    transform.logger.error("second error");
+
+    for (var output in outputs) {
+      var id = new AssetId.parse(output);
+      transform.addOutput(new Asset.fromString(id, output));
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/catch_asset_not_found.dart b/mojo/public/dart/third_party/barback/test/transformer/catch_asset_not_found.dart
new file mode 100644
index 0000000..b43eeb7
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/catch_asset_not_found.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.catch_asset_not_found;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'mock.dart';
+
+/// A transformer that tries to load a secondary input and catches an
+/// [AssetNotFoundException] if the input doesn't exist.
+class CatchAssetNotFoundTransformer extends MockTransformer {
+  /// The extension of assets this applies to.
+  final String extension;
+
+  /// The id of the secondary input to load.
+  final AssetId input;
+
+  CatchAssetNotFoundTransformer(this.extension, String input)
+      : input = new AssetId.parse(input);
+
+  bool doIsPrimary(AssetId id) => id.extension == extension;
+
+  Future doApply(Transform transform) {
+    return transform.getInput(input).then((_) {
+      transform.addOutput(new Asset.fromString(
+          transform.primaryInput.id, "success"));
+    }).catchError((e) {
+      if (e is! AssetNotFoundException) throw e;
+      transform.addOutput(new Asset.fromString(
+          transform.primaryInput.id, "failed to load $input"));
+    });
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/check_content.dart b/mojo/public/dart/third_party/barback/test/transformer/check_content.dart
new file mode 100644
index 0000000..d9cecfa
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/check_content.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.check_content;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'mock.dart';
+
+/// A transformer that modifies assets that contains the given content.
+class CheckContentTransformer extends MockTransformer {
+  final Pattern content;
+  final String addition;
+
+  CheckContentTransformer(this.content, this.addition);
+
+  bool doIsPrimary(AssetId id) => true;
+
+  Future doApply(Transform transform) {
+    return getPrimary(transform).then((primary) {
+      return primary.readAsString().then((value) {
+        if (!value.contains(content)) return;
+
+        transform.addOutput(
+            new Asset.fromString(primary.id, "$value$addition"));
+      });
+    });
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/check_content_and_rename.dart b/mojo/public/dart/third_party/barback/test/transformer/check_content_and_rename.dart
new file mode 100644
index 0000000..dffad37
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/check_content_and_rename.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.check_content_and_rename;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'mock.dart';
+
+/// A transformer that checks the extension and content of an asset, then
+/// produces a new asset with a new extension and new content.
+class CheckContentAndRenameTransformer extends MockTransformer {
+  final String oldExtension;
+  final String oldContent;
+  final String newExtension;
+  final String newContent;
+
+  CheckContentAndRenameTransformer({this.oldExtension, this.oldContent,
+      this.newExtension, this.newContent}) {
+    assert(oldExtension != null);
+    assert(oldContent != null);
+    assert(newExtension != null);
+    assert(newContent != null);
+  }
+
+  bool doIsPrimary(AssetId id) => id.extension == '.$oldExtension';
+
+  Future doApply(Transform transform) {
+    return getPrimary(transform).then((input) {
+      return input.readAsString().then((contents) {
+        if (contents != oldContent) return;
+
+        transform.addOutput(new Asset.fromString(
+            input.id.changeExtension('.$newExtension'), newContent));
+      });
+    });
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/conditionally_consume_primary.dart b/mojo/public/dart/third_party/barback/test/transformer/conditionally_consume_primary.dart
new file mode 100644
index 0000000..e37aebf
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/conditionally_consume_primary.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.conditionally_consume_primary;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'rewrite.dart';
+
+/// A transformer that consumes its primary input only if its contents match a
+/// given pattern.
+class ConditionallyConsumePrimaryTransformer extends RewriteTransformer {
+  final Pattern content;
+
+  ConditionallyConsumePrimaryTransformer(String from, String to, this.content)
+      : super(from, to);
+
+  Future doApply(Transform transform) {
+    return getPrimary(transform).then((primary) {
+      return primary.readAsString().then((value) {
+        if (value.contains(content)) transform.consumePrimary();
+        return super.doApply(transform);
+      });
+    });
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/create_asset.dart b/mojo/public/dart/third_party/barback/test/transformer/create_asset.dart
new file mode 100644
index 0000000..82e80b3
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/create_asset.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.create_asset;
+
+import 'package:barback/barback.dart';
+
+import 'mock.dart';
+
+/// A transformer that outputs an asset with the given id.
+class CreateAssetTransformer extends MockTransformer {
+  final String output;
+
+  CreateAssetTransformer(this.output);
+
+  bool doIsPrimary(AssetId id) => true;
+
+  void doApply(Transform transform) {
+    transform.addOutput(
+        new Asset.fromString(new AssetId.parse(output), output));
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/declare_assets.dart b/mojo/public/dart/third_party/barback/test/transformer/declare_assets.dart
new file mode 100644
index 0000000..03418ed
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/declare_assets.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.declare_asset;
+
+import 'package:barback/barback.dart';
+
+import 'mock.dart';
+
+/// A transformer that declares some outputs and emits others.
+class DeclareAssetsTransformer extends MockTransformer
+    implements DeclaringTransformer {
+  /// The assets that the transformer declares that it will emit.
+  final List<AssetId> declared;
+
+  /// The assets that the transformer actually emits.
+  ///
+  /// These assets' contents will be identical to their ids.
+  final List<AssetId> emitted;
+
+  /// If this is non-`null`, assets are only declared for this input.
+  final AssetId input;
+
+  DeclareAssetsTransformer(Iterable<String> declared, {Iterable<String> emitted,
+        String input})
+      : this.declared = declared.map((id) => new AssetId.parse(id)).toList(),
+        this.emitted = (emitted == null ? declared : emitted)
+            .map((id) => new AssetId.parse(id)).toList(),
+        this.input = input == null ? null : new AssetId.parse(input);
+
+  bool doIsPrimary(AssetId id) => input == null || id == input;
+
+  void doApply(Transform transform) {
+    for (var id in emitted) {
+      transform.addOutput(new Asset.fromString(id, id.toString()));
+    }
+  }
+
+  void declareOutputs(DeclaringTransform transform) {
+    declared.forEach(transform.declareOutput);
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/declaring_aggregate_many_to_many.dart b/mojo/public/dart/third_party/barback/test/transformer/declaring_aggregate_many_to_many.dart
new file mode 100644
index 0000000..2377345
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/declaring_aggregate_many_to_many.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.declaring_aggregate_many_to_many;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'aggregate_many_to_many.dart';
+
+/// Like [AggregateManyToManyTransformer], but declares its assets ahead of
+/// time.
+class DeclaringAggregateManyToManyTransformer
+    extends AggregateManyToManyTransformer
+    implements DeclaringAggregateTransformer {
+  DeclaringAggregateManyToManyTransformer(String extension)
+      : super(extension);
+
+  Future declareOutputs(DeclaringAggregateTransform transform) =>
+      transform.primaryIds.asyncMap(transform.declareOutput).toList();
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/declaring_aggregate_many_to_one.dart b/mojo/public/dart/third_party/barback/test/transformer/declaring_aggregate_many_to_one.dart
new file mode 100644
index 0000000..7f18741
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/declaring_aggregate_many_to_one.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.declaring_aggregate_many_to_one;
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as path;
+
+import 'aggregate_many_to_one.dart';
+
+/// Like [AggregateManyToOneTransformer], but declares its assets ahead of time.
+class DeclaringAggregateManyToOneTransformer
+    extends AggregateManyToOneTransformer
+    implements DeclaringAggregateTransformer {
+  DeclaringAggregateManyToOneTransformer(String extension, String output)
+      : super(extension, output);
+
+  void declareOutputs(DeclaringAggregateTransform transform) {
+    transform.declareOutput(new AssetId(transform.package,
+        path.url.join(transform.key, output)));
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/declaring_bad.dart b/mojo/public/dart/third_party/barback/test/transformer/declaring_bad.dart
new file mode 100644
index 0000000..6643b0f
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/declaring_bad.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.declaring_bad;
+
+import 'package:barback/barback.dart';
+
+import 'bad.dart';
+import 'mock.dart';
+
+/// A transformer that throws an exception when run, after generating the
+/// given outputs.
+class DeclaringBadTransformer extends MockTransformer
+    implements DeclaringTransformer {
+  /// Whether this should throw an error in [declareOutputs].
+  final bool declareError;
+
+  /// Whether this should throw an error in [apply].
+  final bool applyError;
+
+  /// The id of the output asset to emit.
+  final AssetId output;
+
+  DeclaringBadTransformer(String output, {bool declareError: true,
+          bool applyError: false})
+      : this.output = new AssetId.parse(output),
+        this.declareError = declareError,
+        this.applyError = applyError;
+
+  bool doIsPrimary(AssetId id) => true;
+
+  void doApply(Transform transform) {
+    transform.addOutput(new Asset.fromString(output, "bad out"));
+    if (applyError) throw BadTransformer.ERROR;
+  }
+
+  void declareOutputs(DeclaringTransform transform) {
+    if (consumePrimary) transform.consumePrimary();
+    transform.declareOutput(output);
+    if (declareError) throw BadTransformer.ERROR;
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/declaring_check_content_and_rename.dart b/mojo/public/dart/third_party/barback/test/transformer/declaring_check_content_and_rename.dart
new file mode 100644
index 0000000..b26a15b
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/declaring_check_content_and_rename.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.declaring_check_content_and_rename;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'check_content_and_rename.dart';
+
+class DeclaringCheckContentAndRenameTransformer
+    extends CheckContentAndRenameTransformer
+    implements DeclaringTransformer {
+  DeclaringCheckContentAndRenameTransformer({String oldExtension,
+        String oldContent, String newExtension, String newContent})
+      : super(oldExtension: oldExtension, oldContent: oldContent,
+              newExtension: newExtension, newContent: newContent);
+
+  void declareOutputs(DeclaringTransform transform) {
+    transform.declareOutput(
+        transform.primaryId.changeExtension('.$newExtension'));
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/declaring_rewrite.dart b/mojo/public/dart/third_party/barback/test/transformer/declaring_rewrite.dart
new file mode 100644
index 0000000..8ab8a15
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/declaring_rewrite.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.declaring_rewrite;
+
+import 'package:barback/barback.dart';
+
+import 'rewrite.dart';
+
+/// Like [RewriteTransformer], but declares its assets ahead of time.
+class DeclaringRewriteTransformer extends RewriteTransformer
+    implements DeclaringTransformer {
+  DeclaringRewriteTransformer(String from, String to)
+      : super(from, to);
+
+  void declareOutputs(DeclaringTransform transform) {
+    if (consumePrimary) transform.consumePrimary();
+    for (var extension in to.split(" ")) {
+      var id = transform.primaryId.changeExtension(".$extension");
+      transform.declareOutput(id);
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/emit_nothing.dart b/mojo/public/dart/third_party/barback/test/transformer/emit_nothing.dart
new file mode 100644
index 0000000..9cf5134
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/emit_nothing.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.emit_nothing;
+
+import 'package:barback/barback.dart';
+
+import 'mock.dart';
+
+/// A transformer that emits no assets.
+class EmitNothingTransformer extends MockTransformer {
+  final String extension;
+
+  EmitNothingTransformer(this.extension);
+
+  bool doIsPrimary(AssetId id) => id.extension == ".$extension";
+
+  void doApply(Transform transform) {
+    // Emit nothing.
+  }
+
+  String toString() => "$extension->nothing";
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/has_input.dart b/mojo/public/dart/third_party/barback/test/transformer/has_input.dart
new file mode 100644
index 0000000..dfb89c5
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/has_input.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.has_input;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'mock.dart';
+
+/// Overwrites its primary inputs with descriptions of whether various secondary
+/// inputs exist.
+class HasInputTransformer extends MockTransformer {
+  /// The inputs whose existence will be checked.
+  final List<AssetId> inputs;
+
+  HasInputTransformer(Iterable<String> inputs)
+      : inputs = inputs.map((input) => new AssetId.parse(input)).toList();
+
+  bool doIsPrimary(AssetId id) => true;
+
+  Future doApply(Transform transform) {
+    return Future.wait(inputs.map((input) {
+      return transform.hasInput(input).then((hasInput) => "$input: $hasInput");
+    })).then((results) {
+      transform.addOutput(new Asset.fromString(
+          transform.primaryInput.id, results.join(', ')));
+    });
+  }
+
+  String toString() => "has inputs $inputs";
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/lazy_aggregate_many_to_many.dart b/mojo/public/dart/third_party/barback/test/transformer/lazy_aggregate_many_to_many.dart
new file mode 100644
index 0000000..6c010a4
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/lazy_aggregate_many_to_many.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.lazy_aggregate_many_to_many;
+
+import 'package:barback/barback.dart';
+
+import 'declaring_aggregate_many_to_many.dart';
+
+/// An [AggregateTransformer] that takes all assets in each directory with a
+/// given extension and adds to their contents.
+class LazyAggregateManyToManyTransformer
+    extends DeclaringAggregateManyToManyTransformer
+    implements LazyAggregateTransformer {
+  LazyAggregateManyToManyTransformer(String extension)
+      : super(extension);
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/lazy_aggregate_many_to_one.dart b/mojo/public/dart/third_party/barback/test/transformer/lazy_aggregate_many_to_one.dart
new file mode 100644
index 0000000..6bd2519
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/lazy_aggregate_many_to_one.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.lazy_aggregate_many_to_one;
+
+import 'package:barback/barback.dart';
+
+import 'declaring_aggregate_many_to_one.dart';
+
+/// Like [AggregateManyToOneTransformer], but returns a lazy asset that doesn't
+/// perform the rewrite until it's materialized.
+class LazyAggregateManyToOneTransformer
+    extends DeclaringAggregateManyToOneTransformer
+    implements LazyAggregateTransformer {
+  LazyAggregateManyToOneTransformer(String extension, String output)
+      : super(extension, output);
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/lazy_assets.dart b/mojo/public/dart/third_party/barback/test/transformer/lazy_assets.dart
new file mode 100644
index 0000000..5fa81d0
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/lazy_assets.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.lazy_assets;
+
+import 'package:barback/barback.dart';
+
+import 'declare_assets.dart';
+
+/// Like [DeclareAssetsTransformer], but lazy.
+class LazyAssetsTransformer extends DeclareAssetsTransformer
+    implements LazyTransformer {
+  LazyAssetsTransformer(Iterable<String> declared, {Iterable<String> emitted,
+        String input})
+      : super(declared, emitted: emitted, input: input);
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/lazy_bad.dart b/mojo/public/dart/third_party/barback/test/transformer/lazy_bad.dart
new file mode 100644
index 0000000..93fc8d8
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/lazy_bad.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.lazy_bad;
+
+import 'package:barback/barback.dart';
+
+import 'mock.dart';
+
+/// A lazy transformer that throws an exception after [declareOutputs].
+class LazyBadTransformer extends MockTransformer implements LazyTransformer {
+  /// The error [this] throws.
+  static const ERROR = "I am a bad transformer!";
+
+  /// The asset name that [this] should output.
+  final String output;
+
+  LazyBadTransformer(this.output);
+
+  bool doIsPrimary(AssetId id) => true;
+
+  void doApply(Transform transform) {
+    var id = new AssetId.parse(output);
+    transform.addOutput(new Asset.fromString(id, output));
+  }
+
+  void declareOutputs(DeclaringTransform transform) {
+    var id = new AssetId.parse(output);
+    transform.declareOutput(id);
+    throw ERROR;
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/lazy_check_content_and_rename.dart b/mojo/public/dart/third_party/barback/test/transformer/lazy_check_content_and_rename.dart
new file mode 100644
index 0000000..330ad22
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/lazy_check_content_and_rename.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.lazy_check_content_and_rename;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'declaring_check_content_and_rename.dart';
+
+class LazyCheckContentAndRenameTransformer
+    extends DeclaringCheckContentAndRenameTransformer
+    implements LazyTransformer {
+  LazyCheckContentAndRenameTransformer({String oldExtension,
+        String oldContent, String newExtension, String newContent})
+      : super(oldExtension: oldExtension, oldContent: oldContent,
+              newExtension: newExtension, newContent: newContent);
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/lazy_many_to_one.dart b/mojo/public/dart/third_party/barback/test/transformer/lazy_many_to_one.dart
new file mode 100644
index 0000000..ef407ef
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/lazy_many_to_one.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.lazy_many_to_one;
+
+import 'package:barback/barback.dart';
+
+import 'many_to_one.dart';
+
+/// Like [ManyToOneTransformer], but returns a lazy asset that doesn't perform
+/// the conglomeration until it's materialized.
+class LazyManyToOneTransformer extends ManyToOneTransformer
+    implements LazyTransformer {
+  LazyManyToOneTransformer(String extension)
+      : super(extension);
+
+  void declareOutputs(DeclaringTransform transform) {
+    transform.declareOutput(transform.primaryId.changeExtension(".out"));
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/lazy_rewrite.dart b/mojo/public/dart/third_party/barback/test/transformer/lazy_rewrite.dart
new file mode 100644
index 0000000..63bffb6
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/lazy_rewrite.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.lazy_rewrite;
+
+import 'package:barback/barback.dart';
+
+import 'declaring_rewrite.dart';
+
+/// Like [RewriteTransformer], but returns a lazy asset that doesn't perform the
+/// rewrite until it's materialized.
+class LazyRewriteTransformer extends DeclaringRewriteTransformer
+    implements LazyTransformer {
+  LazyRewriteTransformer(String from, String to)
+      : super(from, to);
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/log.dart b/mojo/public/dart/third_party/barback/test/transformer/log.dart
new file mode 100644
index 0000000..4e3dd72
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/log.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.log;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:barback/src/utils.dart';
+
+import 'mock.dart';
+
+/// A transformer that logs given entries during its apply.
+class LogTransformer extends MockTransformer {
+  /// The list of entries that it should log.
+  ///
+  /// Each entry has the log level followed by the message, like:
+  ///
+  ///     error: This is the error message.
+  final List<String> _entries;
+
+  LogTransformer(this._entries);
+
+  bool doIsPrimary(AssetId id) => true;
+
+  void doApply(Transform transform) {
+    for (var entry in _entries) {
+      var parts = entry.split(":");
+      var logFn;
+      switch (parts[0]) {
+        case "error":   logFn = transform.logger.error; break;
+        case "warning": logFn = transform.logger.warning; break;
+        case "info":    logFn = transform.logger.info; break;
+        case "fine":    logFn = transform.logger.fine; break;
+      }
+
+      logFn(parts[1].trim());
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/many_to_one.dart b/mojo/public/dart/third_party/barback/test/transformer/many_to_one.dart
new file mode 100644
index 0000000..a7414f6
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/many_to_one.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.many_to_one;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'mock.dart';
+
+/// A transformer that uses the contents of a file to define the other inputs.
+///
+/// Outputs a file with the same name as the primary but with an "out"
+/// extension containing the concatenated contents of all non-primary inputs.
+class ManyToOneTransformer extends MockTransformer {
+  final String extension;
+
+  /// Creates a transformer that consumes assets with [extension].
+  ///
+  /// That file contains a comma-separated list of paths and it will input
+  /// files at each of those paths.
+  ManyToOneTransformer(this.extension);
+
+  bool doIsPrimary(AssetId id) => id.extension == ".$extension";
+
+  Future doApply(Transform transform) {
+    return getPrimary(transform)
+        .then((primary) => primary.readAsString())
+        .then((contents) {
+      // Get all of the included inputs.
+      return Future.wait(contents.split(",").map((path) {
+        var id;
+        if (path.contains("|")) {
+          id = new AssetId.parse(path);
+        } else {
+          id = new AssetId(transform.primaryInput.id.package, path);
+        }
+        return getInput(transform, id).then((input) => input.readAsString());
+      }));
+    }).then((outputs) {
+      var id = transform.primaryInput.id.changeExtension(".out");
+      transform.addOutput(new Asset.fromString(id, outputs.join()));
+    });
+  }
+
+  String toString() => "many->1 $extension";
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/mock.dart b/mojo/public/dart/third_party/barback/test/transformer/mock.dart
new file mode 100644
index 0000000..143496b
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/mock.dart
@@ -0,0 +1,204 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.mock;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+/// The abstract base class for transformers used to test barback.
+///
+/// This adds the ability to pause and resume different components of the
+/// transformers, and to tell whether they're running, when they start running,
+/// and how many times they've run.
+///
+/// Transformers extending this should override [doIsPrimary] and [doApply]
+/// rather than [isPrimary] and [apply], and they should use [getInput] and
+/// [getPrimary] rather than [transform.getInput] and [transform.primaryInput].
+abstract class MockTransformer extends Transformer {
+  /// The number of times the transformer has been applied.
+  ///
+  /// This is scheduled. The Future will complete at the point in the schedule
+  /// that this is called.
+  Future<int> get numRuns => schedule(() => _numRuns);
+  var _numRuns = 0;
+
+  /// The number of currently running transforms.
+  int _runningTransforms = 0;
+
+  /// A completer for pausing the transformer before it finishes running
+  /// [apply].
+  Completer _apply;
+
+  /// Completers for pausing the transformer before it finishes running
+  /// [isPrimary].
+  final _isPrimary = new Map<AssetId, Completer>();
+
+  /// Completers for pausing the transformer before it finishes getting inputs
+  /// the [Transform].
+  final _getInput = new Map<AssetId, Completer>();
+
+  /// Completer for pausing the transformer before it accesses [primaryInput].
+  Completer _primaryInput;
+
+  /// A completer that completes once this transformer begins running.
+  ///
+  /// Once this transformer finishes running, this is reset to a new completer,
+  /// so it can be used multiple times.
+  var _started = new Completer();
+
+  /// `true` if any transforms are currently running.
+  ///
+  /// This is scheduled. The Future will complete at the point in the schedule
+  /// that this is called.
+  Future<bool> get isRunning => schedule(() => _runningTransforms > 0);
+
+  /// If this is set to `true`, the transformer will consume its primary input
+  /// during [apply].
+  bool consumePrimary = false;
+
+  /// Pauses the schedule until this transformer begins running.
+  void waitUntilStarted() {
+    schedule(() => _started.future, "wait until $this starts");
+  }
+
+  /// Causes the transformer to pause after running [apply] but before the
+  /// returned Future completes.
+  ///
+  /// This can be resumed by calling [resumeApply]. This operation is scheduled.
+  void pauseApply() {
+    schedule(() {
+      _apply = new Completer();
+    }, "pause apply for $this");
+  }
+
+  /// Resumes the transformer's [apply] call after [pauseApply] was called.
+  ///
+  /// This operation is scheduled.
+  void resumeApply() {
+    schedule(() {
+      _apply.complete();
+      _apply = null;
+    }, "resume apply for $this");
+  }
+
+  /// Causes the transformer to pause after running [isPrimary] on the asset
+  /// with the given [name], but before the returned Future completes.
+  ///
+  /// This can be resumed by calling [resumeIsPrimary]. This operation is
+  /// scheduled.
+  void pauseIsPrimary(String name) {
+    schedule(() {
+      _isPrimary[new AssetId.parse(name)] = new Completer();
+    }, "pause isPrimary($name) for $this");
+  }
+
+  /// Resumes the transformer's [isPrimary] call on the asset with the given
+  /// [name] after [pauseIsPrimary] was called.
+  ///
+  /// This operation is scheduled.
+  void resumeIsPrimary(String name) {
+    schedule(() {
+      _isPrimary.remove(new AssetId.parse(name)).complete();
+    }, "resume isPrimary($name) for $this");
+  }
+
+  /// Causes the transformer to pause while loading the secondary input with
+  /// the given [name].
+  ///
+  /// This can be resumed by calling [resumeGetInput]. This operation is
+  /// scheduled.
+  void pauseGetInput(String name) {
+    schedule(() {
+      _getInput[new AssetId.parse(name)] = new Completer();
+    }, "pause getInput($name) for $this");
+  }
+
+  /// Resumes the transformer's loading of the input with the given [name] after
+  /// [pauseGetInput] was called.
+  ///
+  /// This operation is scheduled.
+  void resumeGetInput(String name) {
+    schedule(() {
+      _getInput.remove(new AssetId.parse(name)).complete();
+    }, "resume getInput($name) for $this");
+  }
+
+  /// Causes the transformer to pause before accessing [primaryInput].
+  ///
+  /// This can be resumed by calling [resumeGetPrimary]. This operation is
+  /// scheduled.
+  void pausePrimaryInput() {
+    schedule(() {
+      _primaryInput = new Completer();
+    }, "pause primaryInput for $this");
+  }
+
+  /// Resumes the transformer's invocation of [primaryInput] after
+  /// [pauseGetPrimary] was called.
+  ///
+  /// This operation is scheduled.
+  void resumePrimaryInput() {
+    schedule(() {
+      _primaryInput.complete();
+      _primaryInput = null;
+    }, "resume getPrimary() for $this");
+  }
+
+  /// Like [Transform.getInput], but respects [pauseGetInput].
+  ///
+  /// This is intended for use by subclasses of [MockTransformer].
+  Future<Asset> getInput(Transform transform, AssetId id) {
+    return newFuture(() {
+      if (_getInput.containsKey(id)) return _getInput[id].future;
+    }).then((_) => transform.getInput(id));
+  }
+
+  /// Like [Transform.primaryInput], but respects [pauseGetPrimary].
+  ///
+  /// This is intended for use by subclasses of [MockTransformer].
+  Future<Asset> getPrimary(Transform transform) {
+    return newFuture(() {
+      if (_primaryInput != null) return _primaryInput.future;
+    }).then((_) => transform.primaryInput);
+  }
+
+  Future<bool> isPrimary(AssetId id) {
+    return newFuture(() => doIsPrimary(id)).then((result) {
+      return newFuture(() {
+        if (_isPrimary.containsKey(id)) {
+          return _isPrimary[id].future;
+        }
+      }).then((_) => result);
+    });
+  }
+
+  Future apply(Transform transform) {
+    _numRuns++;
+    if (_runningTransforms == 0) _started.complete();
+    _runningTransforms++;
+    if (consumePrimary) transform.consumePrimary();
+    return newFuture(() => doApply(transform)).then((_) {
+      if (_apply != null) return _apply.future;
+    }).whenComplete(() {
+      _runningTransforms--;
+      if (_runningTransforms == 0) _started = new Completer();
+    });
+  }
+
+  /// The wrapped version of [isPrimary] for subclasses to override.
+  ///
+  /// This may return a `Future<bool>` or, if it's entirely synchronous, a
+  /// `bool`.
+  doIsPrimary(AssetId id);
+
+  /// The wrapped version of [doApply] for subclasses to override.
+  ///
+  /// If this does asynchronous work, it should return a [Future] that completes
+  /// once it's finished.
+  doApply(Transform transform);
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/mock_aggregate.dart b/mojo/public/dart/third_party/barback/test/transformer/mock_aggregate.dart
new file mode 100644
index 0000000..7f47b53
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/mock_aggregate.dart
@@ -0,0 +1,208 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.mock_aggregate;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:barback/src/utils.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+/// The abstract base class for aggregate transformers used to test barback.
+///
+/// This adds the ability to pause and resume different components of the
+/// transformers, and to tell whether they're running, when they start running,
+/// and how many times they've run.
+///
+/// Transformers extending this should override [doClassifyPrimary] and
+/// [doApply] rather than [classifyPrimary] and [apply], and they should use
+/// [getInput] and [getPrimaryInputs] rather than [transform.getInput] and
+/// [transform.primaryInputs].
+abstract class MockAggregateTransformer extends AggregateTransformer {
+  /// The number of times the transformer has been applied.
+  ///
+  /// This is scheduled. The Future will complete at the point in the schedule
+  /// that this is called.
+  Future<int> get numRuns => schedule(() => _numRuns);
+  var _numRuns = 0;
+
+  /// The number of currently running transforms.
+  int _runningTransforms = 0;
+
+  /// A completer for pausing the transformer before it finishes running
+  /// [apply].
+  Completer _apply;
+
+  /// Completers for pausing the transformer before it finishes running
+  /// [classifyPrimary].
+  final _classifyPrimary = new Map<AssetId, Completer>();
+
+  /// Completers for pausing the transformer before it finishes getting inputs
+  /// the [Transform].
+  final _getInput = new Map<AssetId, Completer>();
+
+  /// Completer for pausing the transformer before it accesses
+  /// [getPrimaryInputs].
+  Completer _primaryInputs;
+
+  /// A completer that completes once this transformer begins running.
+  ///
+  /// Once this transformer finishes running, this is reset to a new completer,
+  /// so it can be used multiple times.
+  var _started = new Completer();
+
+  /// `true` if any transforms are currently running.
+  ///
+  /// This is scheduled. The Future will complete at the point in the schedule
+  /// that this is called.
+  Future<bool> get isRunning => schedule(() => _runningTransforms > 0);
+
+  /// All elements of this set will be automatically consumed during [apply].
+  final consumePrimaries = new Set<String>();
+
+  /// Pauses the schedule until this transformer begins running.
+  void waitUntilStarted() {
+    schedule(() => _started.future, "wait until $this starts");
+  }
+
+  /// Causes the transformer to pause after running [apply] but before the
+  /// returned Future completes.
+  ///
+  /// This can be resumed by calling [resumeApply]. This operation is scheduled.
+  void pauseApply() {
+    schedule(() {
+      _apply = new Completer();
+    }, "pause apply for $this");
+  }
+
+  /// Resumes the transformer's [apply] call after [pauseApply] was called.
+  ///
+  /// This operation is scheduled.
+  void resumeApply() {
+    schedule(() {
+      _apply.complete();
+      _apply = null;
+    }, "resume apply for $this");
+  }
+
+  /// Causes the transformer to pause after running [classifyPrimary] on the
+  /// asset with the given [name], but before the returned Future completes.
+  ///
+  /// This can be resumed by calling [resumeClassifyPrimary]. This operation is
+  /// scheduled.
+  void pauseClassifyPrimary(String name) {
+    schedule(() {
+      _classifyPrimary[new AssetId.parse(name)] = new Completer();
+    }, "pause classifyPrimary($name) for $this");
+  }
+
+  /// Resumes the transformer's [classifyPrimary] call on the asset with the
+  /// given [name] after [pauseClassifyPrimary] was called.
+  ///
+  /// This operation is scheduled.
+  void resumeClassifyPrimary(String name) {
+    schedule(() {
+      _classifyPrimary.remove(new AssetId.parse(name)).complete();
+    }, "resume classifyPrimary($name) for $this");
+  }
+
+  /// Causes the transformer to pause while loading the secondary input with
+  /// the given [name].
+  ///
+  /// This can be resumed by calling [resumeGetInput]. This operation is
+  /// scheduled.
+  void pauseGetInput(String name) {
+    schedule(() {
+      _getInput[new AssetId.parse(name)] = new Completer();
+    }, "pause getInput($name) for $this");
+  }
+
+  /// Resumes the transformer's loading of the input with the given [name] after
+  /// [pauseGetInput] was called.
+  ///
+  /// This operation is scheduled.
+  void resumeGetInput(String name) {
+    schedule(() {
+      _getInput.remove(new AssetId.parse(name)).complete();
+    }, "resume getInput($name) for $this");
+  }
+
+  /// Causes the transformer to pause before accessing [getPrimaryInputs].
+  ///
+  /// This can be resumed by calling [resumePrimaryInputs]. This operation is
+  /// scheduled.
+  void pausePrimaryInputs() {
+    schedule(() {
+      _primaryInputs = new Completer();
+    }, "pause primaryInputs for $this");
+  }
+
+  /// Resumes the transformer's invocation of [primaryInputs] after
+  /// [pausePrimaryInputs] was called.
+  ///
+  /// This operation is scheduled.
+  void resumePrimaryInputs() {
+    schedule(() {
+      _primaryInputs.complete();
+      _primaryInputs = null;
+    }, "resume primaryInputs for $this");
+  }
+
+  /// Like [AggregateTransform.getInput], but respects [pauseGetInput].
+  ///
+  /// This is intended for use by subclasses of [MockAggregateTransformer].
+  Future<Asset> getInput(AggregateTransform transform, AssetId id) {
+    return newFuture(() {
+      if (_getInput.containsKey(id)) return _getInput[id].future;
+    }).then((_) => transform.getInput(id));
+  }
+
+  /// Like [AggregateTransform.primaryInputs], but respects
+  /// [pausePrimaryInputs].
+  ///
+  /// This is intended for use by subclasses of [MockAggregateTransformer].
+  Stream<Asset> getPrimaryInputs(AggregateTransform transform) {
+    return futureStream(newFuture(() {
+      if (_primaryInputs != null) return _primaryInputs.future;
+    }).then((_) => transform.primaryInputs));
+  }
+
+  Future<String> classifyPrimary(AssetId id) {
+    return newFuture(() => doClassifyPrimary(id)).then((result) {
+      return newFuture(() {
+        if (_classifyPrimary.containsKey(id)) {
+          return _classifyPrimary[id].future;
+        }
+      }).then((_) => result);
+    });
+  }
+
+  Future apply(AggregateTransform transform) {
+    _numRuns++;
+    if (_runningTransforms == 0) _started.complete();
+    _runningTransforms++;
+    return newFuture(() => doApply(transform)).then((_) {
+      if (_apply != null) return _apply.future;
+    }).whenComplete(() {
+      for (var id in consumePrimaries) {
+        transform.consumePrimary(new AssetId.parse(id));
+      }
+      _runningTransforms--;
+      if (_runningTransforms == 0) _started = new Completer();
+    });
+  }
+
+  /// The wrapped version of [classifyPrimary] for subclasses to override.
+  ///
+  /// This may return a `Future<String>` or, if it's entirely synchronous, a
+  /// `String`.
+  doClassifyPrimary(AssetId id);
+
+  /// The wrapped version of [doApply] for subclasses to override.
+  ///
+  /// If this does asynchronous work, it should return a [Future] that completes
+  /// once it's finished.
+  doApply(AggregateTransform transform);
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/one_to_many.dart b/mojo/public/dart/third_party/barback/test/transformer/one_to_many.dart
new file mode 100644
index 0000000..0076680
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/one_to_many.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.one_to_many;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'mock.dart';
+
+/// A [Transformer] that takes an input asset that contains a comma-separated
+/// list of paths and outputs a file for each path.
+class OneToManyTransformer extends MockTransformer {
+  final String extension;
+
+  /// Creates a transformer that consumes assets with [extension].
+  ///
+  /// That file contains a comma-separated list of paths and it will output
+  /// files at each of those paths.
+  OneToManyTransformer(this.extension);
+
+  bool doIsPrimary(AssetId id) => id.extension == ".$extension";
+
+  Future doApply(Transform transform) {
+    return getPrimary(transform)
+        .then((input) => input.readAsString())
+        .then((lines) {
+      for (var line in lines.split(",")) {
+        var id = new AssetId(transform.primaryInput.id.package, line);
+        transform.addOutput(new Asset.fromString(id, "spread $extension"));
+      }
+    });
+  }
+
+  String toString() => "1->many $extension";
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/rewrite.dart b/mojo/public/dart/third_party/barback/test/transformer/rewrite.dart
new file mode 100644
index 0000000..d25a552
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/rewrite.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.rewrite;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'mock.dart';
+
+/// A [Transformer] that takes assets ending with one extension and generates
+/// assets with a given extension.
+///
+/// Appends the output extension to the contents of the input file.
+class RewriteTransformer extends MockTransformer {
+  final String from;
+  final String to;
+
+  /// Creates a transformer that rewrites assets whose extension is [from] to
+  /// one whose extension is [to].
+  ///
+  /// [to] may be a space-separated list in which case multiple outputs will be
+  /// created for each input.
+  RewriteTransformer(this.from, this.to);
+
+  bool doIsPrimary(AssetId id) => id.extension == ".$from";
+
+  Future doApply(Transform transform) {
+    return getPrimary(transform).then((input) {
+      return Future.wait(to.split(" ").map((extension) {
+        var id = input.id.changeExtension(".$extension");
+        return input.readAsString().then((content) {
+          transform.addOutput(new Asset.fromString(id, "$content.$extension"));
+        });
+      }));
+    });
+  }
+
+  String toString() => "$from->$to";
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer/sync_rewrite.dart b/mojo/public/dart/third_party/barback/test/transformer/sync_rewrite.dart
new file mode 100644
index 0000000..00ee32e
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer/sync_rewrite.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer.sync_rewrite;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+/// Like [DeclaringRewriteTransformer], but with no methods returning Futures.
+class SyncRewriteTransformer extends Transformer
+    implements DeclaringTransformer {
+  final String from;
+  final String to;
+
+  SyncRewriteTransformer(this.from, this.to);
+
+  bool isPrimary(AssetId id) => id.extension == ".$from";
+
+  void apply(Transform transform) {
+    for (var extension in to.split(" ")) {
+      var id = transform.primaryInput.id.changeExtension(".$extension");
+      transform.addOutput(new Asset.fromString(id, "new.$extension"));
+    }
+  }
+
+  void declareOutputs(DeclaringTransform transform) {
+    for (var extension in to.split(" ")) {
+      var id = transform.primaryId.changeExtension(".$extension");
+      transform.declareOutput(id);
+    }
+  }
+
+  String toString() => "$from->$to";
+}
diff --git a/mojo/public/dart/third_party/barback/test/transformer_test.dart b/mojo/public/dart/third_party/barback/test/transformer_test.dart
new file mode 100644
index 0000000..5ff96c8
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/transformer_test.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.transformer_test;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:barback/src/utils.dart';
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+main() {
+  initConfig();
+
+  group("isPrimary", () {
+    test("defaults to allowedExtensions", () {
+      var transformer = new ExtensionTransformer(".txt .bin");
+      expect(transformer.isPrimary(new AssetId("pkg", "foo.txt")), isTrue);
+
+      expect(transformer.isPrimary(new AssetId("pkg", "foo.bin")), isTrue);
+
+      expect(transformer.isPrimary(new AssetId("pkg", "foo.nottxt")), isFalse);
+    });
+
+    test("supports multi-level extensions with allowedExtensions", () {
+      var transformer = new ExtensionTransformer(".dart.js");
+      expect(transformer.isPrimary(new AssetId("pkg", "foo.dart.js")), isTrue);
+
+      expect(transformer.isPrimary(new AssetId("pkg", "foo.js")), isFalse);
+
+      expect(transformer.isPrimary(new AssetId("pkg", "foo.dart")), isFalse);
+    });
+
+    test("throws an error for extensions without periods", () {
+      expect(() => new ExtensionTransformer("dart"), throwsFormatException);
+    });
+
+    test("allows all files if allowedExtensions is not overridden", () {
+      var transformer = new MockTransformer();
+      expect(transformer.isPrimary(new AssetId("pkg", "foo.txt")), isTrue);
+
+      expect(transformer.isPrimary(new AssetId("pkg", "foo.bin")), isTrue);
+
+      expect(transformer.isPrimary(new AssetId("pkg", "anything")), isTrue);
+    });
+  });
+}
+
+class MockTransformer extends Transformer {
+  MockTransformer();
+
+  Future apply(Transform transform) => new Future.value();
+}
+
+class ExtensionTransformer extends Transformer {
+  final String allowedExtensions;
+
+  ExtensionTransformer(this.allowedExtensions);
+
+  Future apply(Transform transform) => new Future.value();
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/barback/test/utils.dart b/mojo/public/dart/third_party/barback/test/utils.dart
new file mode 100644
index 0000000..c24b58c
--- /dev/null
+++ b/mojo/public/dart/third_party/barback/test/utils.dart
@@ -0,0 +1,613 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library barback.test.utils;
+
+import 'dart:async';
+import 'dart:convert' show Encoding;
+
+import 'package:barback/barback.dart';
+import 'package:barback/src/utils.dart';
+import 'package:barback/src/utils/cancelable_future.dart';
+import 'package:path/path.dart' as pathos;
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:stack_trace/stack_trace.dart';
+import 'package:unittest/compact_vm_config.dart';
+
+export 'transformer/aggregate_many_to_many.dart';
+export 'transformer/aggregate_many_to_one.dart';
+export 'transformer/bad.dart';
+export 'transformer/bad_log.dart';
+export 'transformer/catch_asset_not_found.dart';
+export 'transformer/check_content.dart';
+export 'transformer/check_content_and_rename.dart';
+export 'transformer/conditionally_consume_primary.dart';
+export 'transformer/create_asset.dart';
+export 'transformer/declare_assets.dart';
+export 'transformer/declaring_aggregate_many_to_many.dart';
+export 'transformer/declaring_aggregate_many_to_one.dart';
+export 'transformer/declaring_bad.dart';
+export 'transformer/declaring_check_content_and_rename.dart';
+export 'transformer/declaring_rewrite.dart';
+export 'transformer/emit_nothing.dart';
+export 'transformer/has_input.dart';
+export 'transformer/lazy_aggregate_many_to_many.dart';
+export 'transformer/lazy_aggregate_many_to_one.dart';
+export 'transformer/lazy_assets.dart';
+export 'transformer/lazy_bad.dart';
+export 'transformer/lazy_check_content_and_rename.dart';
+export 'transformer/lazy_many_to_one.dart';
+export 'transformer/lazy_rewrite.dart';
+export 'transformer/many_to_one.dart';
+export 'transformer/mock.dart';
+export 'transformer/mock_aggregate.dart';
+export 'transformer/one_to_many.dart';
+export 'transformer/rewrite.dart';
+export 'transformer/sync_rewrite.dart';
+
+var _configured = false;
+
+MockProvider _provider;
+Barback _barback;
+
+/// Calls to [buildShouldSucceed] and [buildShouldFail] set expectations on
+/// successive [BuildResult]s from [_barback]. This keeps track of how many
+/// calls have already been made so later calls know which result to look for.
+int _nextBuildResult;
+
+/// Calls to [buildShouldLog] set expectations on successive log entries from
+/// [_barback]. This keeps track of how many calls have already been made so
+/// later calls know which result to look for.
+int _nextLog;
+
+void initConfig() {
+  if (_configured) return;
+  _configured = true;
+  useCompactVMConfiguration();
+  filterStacks = true;
+}
+
+/// Creates a new [PackageProvider] and [PackageGraph] with the given [assets]
+/// and [transformers].
+///
+/// This graph is used internally by most of the other functions in this
+/// library so you must call it in the test before calling any of the other
+/// functions.
+///
+/// [assets] may either be an [Iterable] or a [Map]. If it's an [Iterable],
+/// each element may either be an [AssetId] or a string that can be parsed to
+/// one. If it's a [Map], each key should be a string that can be parsed to an
+/// [AssetId] and the value should be a string defining the contents of that
+/// asset.
+///
+/// [transformers] is a map from package names to the transformers for each
+/// package.
+void initGraph([assets,
+      Map<String, Iterable<Iterable<Transformer>>> transformers]) =>
+    initStaticGraph(assets, transformers: transformers);
+
+void initStaticGraph(assets, {Iterable<String> staticPackages,
+    Map<String, Iterable<Iterable<Transformer>>> transformers}) {
+  if (assets == null) assets = [];
+  if (staticPackages == null) staticPackages = [];
+  if (transformers == null) transformers = {};
+
+  _provider = new MockProvider(assets,
+      staticPackages: staticPackages,
+      additionalPackages: transformers.keys);
+  _barback = new Barback(_provider);
+  // Add a dummy listener to the log so it doesn't print to stdout.
+  _barback.log.listen((_) {});
+  _nextBuildResult = 0;
+  _nextLog = 0;
+
+  schedule(() => transformers.forEach(_barback.updateTransformers));
+
+  // There should be one successful build after adding all the transformers but
+  // before adding any sources.
+  if (!transformers.isEmpty) buildShouldSucceed();
+}
+
+/// Updates [assets] in the current [PackageProvider].
+///
+/// Each item in the list may either be an [AssetId] or a string that can be
+/// parsed as one.
+void updateSources(Iterable assets) {
+  assets = _parseAssets(assets);
+  schedule(() => _barback.updateSources(assets),
+      "updating ${assets.join(', ')}");
+}
+
+/// Updates [assets] in the current [PackageProvider].
+///
+/// Each item in the list may either be an [AssetId] or a string that can be
+/// parsed as one. Unlike [updateSources], this is not automatically scheduled
+/// and will be run synchronously when called.
+void updateSourcesSync(Iterable assets) =>
+    _barback.updateSources(_parseAssets(assets));
+
+/// Removes [assets] from the current [PackageProvider].
+///
+/// Each item in the list may either be an [AssetId] or a string that can be
+/// parsed as one.
+void removeSources(Iterable assets) {
+  assets = _parseAssets(assets);
+  schedule(() => _barback.removeSources(assets),
+      "removing ${assets.join(', ')}");
+}
+
+/// Removes [assets] from the current [PackageProvider].
+///
+/// Each item in the list may either be an [AssetId] or a string that can be
+/// parsed as one. Unlike [removeSources], this is not automatically scheduled
+/// and will be run synchronously when called.
+void removeSourcesSync(Iterable assets) =>
+    _barback.removeSources(_parseAssets(assets));
+
+/// Sets the transformers for [package] to [transformers].
+void updateTransformers(String package, Iterable<Iterable> transformers) {
+  schedule(() => _barback.updateTransformers(package, transformers),
+      "updating transformers for $package");
+}
+
+/// Parse a list of strings or [AssetId]s into a list of [AssetId]s.
+List<AssetId> _parseAssets(Iterable assets) {
+  return assets.map((asset) {
+    if (asset is String) return new AssetId.parse(asset);
+    return asset;
+  }).toList();
+}
+
+/// Schedules a change to the contents of an asset identified by [name] to
+/// [contents].
+///
+/// Does not update it in the graph.
+void modifyAsset(String name, String contents) {
+  schedule(() {
+    _provider._modifyAsset(name, contents);
+  }, "modify asset $name");
+}
+
+/// Schedules an error to be generated when loading the asset identified by
+/// [name].
+///
+/// Does not update the asset in the graph. If [async] is true, the error is
+/// thrown asynchronously.
+void setAssetError(String name, {bool async: true}) {
+  schedule(() {
+    _provider._setAssetError(name, async);
+  }, "set error for asset $name");
+}
+
+/// Schedules a pause of the internally created [PackageProvider].
+///
+/// All asset requests that the [PackageGraph] makes to the provider after this
+/// will not complete until [resumeProvider] is called.
+void pauseProvider() {
+  schedule(() => _provider._pause(), "pause provider");
+}
+
+/// Schedules an unpause of the provider after a call to [pauseProvider] and
+/// allows all pending asset loads to finish.
+void resumeProvider() {
+  schedule(() => _provider._resume(), "resume provider");
+}
+
+/// Asserts that the current build step shouldn't have finished by this point in
+/// the schedule.
+///
+/// This uses the same build counter as [buildShouldSucceed] and
+/// [buildShouldFail], so those can be used to validate build results before and
+/// after this.
+void buildShouldNotBeDone() {
+  _futureShouldNotCompleteUntil(
+      _barback.results.elementAt(_nextBuildResult),
+      schedule(() => pumpEventQueue(), "build should not terminate"),
+      "build");
+}
+
+/// Expects that the next [BuildResult] is a build success.
+void buildShouldSucceed() {
+  expect(_getNextBuildResult("build should succeed").then((result) {
+    result.errors.forEach(currentSchedule.signalError);
+    expect(result.succeeded, isTrue);
+  }), completes);
+}
+
+/// Expects that the next [BuildResult] emitted is a failure.
+///
+/// [matchers] is a list of matchers to match against the errors that caused the
+/// build to fail. Every matcher is expected to match an error, but the order of
+/// matchers is unimportant.
+void buildShouldFail(List matchers) {
+  expect(_getNextBuildResult("build should fail").then((result) {
+    expect(result.succeeded, isFalse);
+    expect(result.errors.length, equals(matchers.length));
+    for (var matcher in matchers) {
+      expect(result.errors, contains(matcher));
+    }
+  }), completes);
+}
+
+/// Expects that the nexted logged [LogEntry] matches [matcher] which may be
+/// either a [Matcher] or a string to match a literal string.
+void buildShouldLog(LogLevel level, matcher) {
+  expect(_getNextLog("build should log").then((log) {
+    expect(log.level, equals(level));
+    expect(log.message, matcher);
+  }), completes);
+}
+
+Future<BuildResult> _getNextBuildResult(String description) {
+  var result = currentSchedule.wrapFuture(
+      _barback.results.elementAt(_nextBuildResult++));
+  return schedule(() => result, description);
+}
+
+Future<LogEntry> _getNextLog(String description) {
+  var result = currentSchedule.wrapFuture(
+      _barback.log.elementAt(_nextLog++));
+  return schedule(() => result, description);
+}
+
+/// Schedules an expectation that the graph will deliver an asset matching
+/// [name] and [contents].
+///
+/// [contents] may be a [String] or a [Matcher] that matches a string. If
+/// [contents] is omitted, defaults to the asset's filename without an extension
+/// (which is the same default that [initGraph] uses).
+void expectAsset(String name, [contents]) {
+  var id = new AssetId.parse(name);
+
+  if (contents == null) {
+    contents = pathos.basenameWithoutExtension(id.path);
+  }
+
+  schedule(() {
+    return _barback.getAssetById(id).then((asset) {
+      // TODO(rnystrom): Make an actual Matcher class for this.
+      expect(asset.id, equals(id));
+      expect(asset.readAsString(), completion(contents));
+    });
+  }, "get asset $name");
+}
+
+/// Schedules an expectation that the graph will not find an asset matching
+/// [name].
+void expectNoAsset(String name) {
+  var id = new AssetId.parse(name);
+
+  // Make sure the future gets the error.
+  schedule(() {
+    return _barback.getAssetById(id).then((asset) {
+      fail("Should have thrown error but got $asset.");
+    }).catchError((error) {
+      expect(error, new isInstanceOf<AssetNotFoundException>());
+      expect(error.id, equals(id));
+    });
+  }, "get asset $name");
+}
+
+/// Schedules an expectation that the graph will output all of the given
+/// assets, and no others.
+///
+/// [assets] may be an iterable of asset id strings, in which case this asserts
+/// that the graph outputs exactly the assets with those ids. It may also be a
+/// map from asset id strings to asset contents, in which case the contents must
+/// also match.
+void expectAllAssets(assets) {
+  var expected;
+  var expectedString;
+  if (assets is Map) {
+    expected = mapMapKeys(assets, (key, _) => new AssetId.parse(key));
+    expectedString = expected.toString();
+  } else {
+    expected = assets.map((asset) => new AssetId.parse(asset));
+    expectedString = expected.join(', ');
+  }
+
+  schedule(() {
+    return _barback.getAllAssets().then((actualAssets) {
+      var actualIds = actualAssets.map((asset) => asset.id).toSet();
+
+      if (expected is Map) {
+        expected.forEach((id, contents) {
+          expect(actualIds, contains(id));
+          actualIds.remove(id);
+          expect(actualAssets[id].readAsString(), completion(equals(contents)));
+        });
+      } else {
+        for (var id in expected) {
+          expect(actualIds, contains(id));
+          actualIds.remove(id);
+        }
+      }
+
+      expect(actualIds, isEmpty);
+    });
+  }, "get all assets, expecting $expectedString");
+}
+
+/// Schedules an expectation that [Barback.getAllAssets] will return a [Future]
+/// that completes to a error that matches [matcher].
+///
+/// If [match] is a [List], then it expects the completed error to be an
+/// [AggregateException] whose errors match each matcher in the list. Otherwise,
+/// [match] should be a single matcher that the error should match.
+void expectAllAssetsShouldFail(Matcher matcher) {
+  schedule(() {
+    expect(_barback.getAllAssets(), throwsA(matcher));
+  }, "get all assets should fail");
+}
+
+/// Schedules an expectation that a [getAssetById] call for the given asset
+/// won't terminate at this point in the schedule.
+void expectAssetDoesNotComplete(String name) {
+  var id = new AssetId.parse(name);
+
+  schedule(() {
+    return _futureShouldNotCompleteUntil(
+        _barback.getAssetById(id),
+        pumpEventQueue(),
+        "asset $id");
+  }, "asset $id should not complete");
+}
+
+/// Returns a matcher for an [AggregateException] containing errors that match
+/// [matchers].
+Matcher isAggregateException(Iterable<Matcher> errors) {
+  // Match the aggregate error itself.
+  var matchers = [
+    new isInstanceOf<AggregateException>(),
+    transform((error) => error.errors, hasLength(errors.length),
+        'errors.length == ${errors.length}')
+  ];
+
+  // Make sure its contained errors match the matchers.
+  for (var error in errors) {
+    matchers.add(transform((error) => error.errors, contains(error),
+        error.toString()));
+  }
+
+  return allOf(matchers);
+}
+
+/// Returns a matcher for an [AssetNotFoundException] with the given [id].
+Matcher isAssetNotFoundException(String name) {
+  var id = new AssetId.parse(name);
+  return allOf(
+      new isInstanceOf<AssetNotFoundException>(),
+      predicate((error) => error.id == id, 'id == $name'));
+}
+
+/// Returns a matcher for an [AssetCollisionException] with the given [id].
+Matcher isAssetCollisionException(String name) {
+  var id = new AssetId.parse(name);
+  return allOf(
+      new isInstanceOf<AssetCollisionException>(),
+      predicate((error) => error.id == id, 'id == $name'));
+}
+
+/// Returns a matcher for a [MissingInputException] with the given [id].
+Matcher isMissingInputException(String name) {
+  var id = new AssetId.parse(name);
+  return allOf(
+      new isInstanceOf<MissingInputException>(),
+      predicate((error) => error.id == id, 'id == $name'));
+}
+
+/// Returns a matcher for an [InvalidOutputException] with the given id.
+Matcher isInvalidOutputException(String name) {
+  var id = new AssetId.parse(name);
+  return allOf(
+      new isInstanceOf<InvalidOutputException>(),
+      predicate((error) => error.id == id, 'id == $name'));
+}
+
+/// Returns a matcher for an [AssetLoadException] with the given id and a
+/// wrapped error that matches [error].
+Matcher isAssetLoadException(String name, error) {
+  var id = new AssetId.parse(name);
+  return allOf(
+      new isInstanceOf<AssetLoadException>(),
+      transform((error) => error.id, equals(id), 'id'),
+      transform((error) => error.error, wrapMatcher(error), 'error'));
+}
+
+/// Returns a matcher for a [TransformerException] with a wrapped error that
+/// matches [error].
+Matcher isTransformerException(error) {
+  return allOf(
+      new isInstanceOf<TransformerException>(),
+      transform((error) => error.error, wrapMatcher(error), 'error'));
+}
+
+/// Returns a matcher for a [MockLoadException] with the given [id].
+Matcher isMockLoadException(String name) {
+  var id = new AssetId.parse(name);
+  return allOf(
+      new isInstanceOf<MockLoadException>(),
+      predicate((error) => error.id == id, 'id == $name'));
+}
+
+/// Returns a matcher that runs [transformation] on its input, then matches
+/// the output against [matcher].
+///
+/// [description] should be a noun phrase that describes the relation of the
+/// output of [transformation] to its input.
+Matcher transform(transformation(value), matcher, String description) =>
+  new _TransformMatcher(transformation, wrapMatcher(matcher), description);
+
+class _TransformMatcher extends Matcher {
+  final Function _transformation;
+  final Matcher _matcher;
+  final String _description;
+
+  _TransformMatcher(this._transformation, this._matcher, this._description);
+
+  bool matches(item, Map matchState) =>
+    _matcher.matches(_transformation(item), matchState);
+
+  Description describe(Description description) =>
+    description.add(_description).add(' ').addDescriptionOf(_matcher);
+}
+
+/// Asserts that [future] shouldn't complete until after [delay] completes.
+///
+/// Once [delay] completes, the output of [future] is ignored, even if it's an
+/// error.
+///
+/// [description] should describe [future].
+Future _futureShouldNotCompleteUntil(Future future, Future delay,
+    String description) {
+  var trace = new Trace.current();
+  var cancelable = new CancelableFuture(future);
+  cancelable.then((result) {
+    currentSchedule.signalError(
+        new Exception("Expected $description not to complete here, but it "
+            "completed with result: $result"),
+        trace);
+  }).catchError((error) {
+    currentSchedule.signalError(error);
+  });
+
+  return delay.then((_) => cancelable.cancel());
+}
+
+/// An [AssetProvider] that provides the given set of assets.
+class MockProvider implements StaticPackageProvider {
+  Iterable<String> get packages =>
+      _assets.keys.toSet().difference(staticPackages);
+
+  final Set<String> staticPackages;
+
+  final Map<String, AssetSet> _assets;
+
+  /// The set of assets for which [MockLoadException]s should be emitted if
+  /// they're loaded.
+  final _errors = new Set<AssetId>();
+
+  /// The set of assets for which synchronous [MockLoadException]s should be
+  /// emitted if they're loaded.
+  final _syncErrors = new Set<AssetId>();
+
+  /// The completer that [getAsset()] is waiting on to complete when paused.
+  ///
+  /// If `null` it will return the asset immediately.
+  Completer _pauseCompleter;
+
+  /// Tells the provider to wait during [getAsset] until [complete()]
+  /// is called.
+  ///
+  /// Lets you test the asynchronous behavior of loading.
+  void _pause() {
+    _pauseCompleter = new Completer();
+  }
+
+  void _resume() {
+    _pauseCompleter.complete();
+    _pauseCompleter = null;
+  }
+
+  MockProvider(assets, {Iterable<String> staticPackages,
+          Iterable<String> additionalPackages})
+      : staticPackages = staticPackages == null ? new Set() :
+            staticPackages.toSet(),
+        _assets = _normalizeAssets(assets, additionalPackages);
+
+  static Map<String, AssetSet> _normalizeAssets(assets,
+      Iterable<String> additionalPackages) {
+    var assetList;
+    if (assets is Map) {
+      assetList = assets.keys.map((asset) {
+        var id = new AssetId.parse(asset);
+        return new _MockAsset(id, assets[asset]);
+      });
+    } else if (assets is Iterable) {
+      assetList = assets.map((asset) {
+        var id = new AssetId.parse(asset);
+        var contents = pathos.basenameWithoutExtension(id.path);
+        return new _MockAsset(id, contents);
+      });
+    }
+
+    var assetMap = mapMapValues(groupBy(assetList, (asset) => asset.id.package),
+        (package, assets) => new AssetSet.from(assets));
+
+    // Make sure that packages that have transformers but no assets are
+    // considered by MockProvider to exist.
+    if (additionalPackages != null) {
+      for (var package in additionalPackages) {
+        assetMap.putIfAbsent(package, () => new AssetSet());
+      }
+    }
+
+    // If there are no assets or transformers, add a dummy package. This better
+    // simulates the real world, where there'll always be at least the
+    // entrypoint package.
+    return assetMap.isEmpty ? {"app": new AssetSet()} : assetMap;
+  }
+
+  void _modifyAsset(String name, String contents) {
+    var id = new AssetId.parse(name);
+    _errors.remove(id);
+    _syncErrors.remove(id);
+    (_assets[id.package][id] as _MockAsset).contents = contents;
+  }
+
+  void _setAssetError(String name, bool async) {
+    (async ? _errors : _syncErrors).add(new AssetId.parse(name));
+  }
+
+  Stream<AssetId> getAllAssetIds(String package) =>
+      new Stream.fromIterable(_assets[package].map((asset) => asset.id));
+
+  Future<Asset> getAsset(AssetId id) {
+    // Eagerly load the asset so we can test an asset's value changing between
+    // when a load starts and when it finishes.
+    var assets = _assets[id.package];
+    var asset;
+    if (assets != null) asset = assets[id];
+
+    if (_syncErrors.contains(id)) throw new MockLoadException(id);
+    var hasError = _errors.contains(id);
+
+    var future;
+    if (_pauseCompleter != null) {
+      future = _pauseCompleter.future;
+    } else {
+      future = new Future.value();
+    }
+
+    return future.then((_) {
+      if (hasError) throw new MockLoadException(id);
+      if (asset == null) throw new AssetNotFoundException(id);
+      return asset;
+    });
+  }
+}
+
+/// Error thrown for assets with [setAssetError] set.
+class MockLoadException implements Exception {
+  final AssetId id;
+
+  MockLoadException(this.id);
+
+  String toString() => "Error loading $id.";
+}
+
+/// An implementation of [Asset] that never hits the file system.
+class _MockAsset implements Asset {
+  final AssetId id;
+  String contents;
+
+  _MockAsset(this.id, this.contents);
+
+  Future<String> readAsString({Encoding encoding}) =>
+      new Future.value(contents);
+
+  Stream<List<int>> read() => throw new UnimplementedError();
+
+  String toString() => "MockAsset $id $contents";
+}
diff --git a/mojo/public/dart/third_party/charcode/LICENSE b/mojo/public/dart/third_party/charcode/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/mojo/public/dart/third_party/charcode/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/charcode/README.md b/mojo/public/dart/third_party/charcode/README.md
new file mode 100644
index 0000000..35c4818
--- /dev/null
+++ b/mojo/public/dart/third_party/charcode/README.md
@@ -0,0 +1,51 @@
+Character code constants.
+
+These libraries define symbolic names for some character codes.
+
+This is not an official Goggle package, and is not supported by Google.
+
+## Using
+
+Import either one of the libraries:
+
+    import "package:charcode/ascii.dart"
+    import "package:charcode/html_entity.dart"
+
+or import both libraries using the `charcode.dart` library:
+
+    import "package:charcode/charcode.dart"
+
+# Naming
+
+The character names are preceded by a `$` to avoid conflicting with other
+variables due to the short and common names (for example "$i").
+
+The characters that are valid in a Dart identifier directly follow the `$`.
+Examples: `$_`, `$a`, `$B` and `$3`. Other characters are given symbolic names.
+
+The names of letters are lower-case for lower-case letters, and mixed- or
+upper-case for upper-case letters. The names of symbols are all lower-case,
+and omit suffixes like "sign", "symbol" and "mark". E
+xamples: `$plus`, `$exclamation`
+
+The `ascii.dart` library defines a symbolic name for each ASCII character.
+For some chraceters, it has more than one name. For example the common `$tab`
+and the official `$ht` for the horisontal tab.
+
+The `html_entity.dart` library defines a constant for each HTML 4.01 character
+entity, using the standard entity abbreviation, incluing its case.
+Examples: `$nbsp` for `&nbps;`, `$aring` for the lower-case `&aring;`
+and `$Aring` for the upper-case `&Aring;`.
+
+The HTML entities includes all characters in the Latin-1 code page, greek
+letters and some mathematical symbols.
+
+The `charcode.dart` library just exports both `ascii.dart` and
+`html_entity.dart`.
+
+# Rationale
+
+The Dart language doesn't have character literals. If that ever happens, this
+library will be irrelevant. Until then, this library can be used for the most
+common characters.
+See [http://dartbug.com/4415](request for character literals).
diff --git a/mojo/public/dart/third_party/charcode/lib/ascii.dart b/mojo/public/dart/third_party/charcode/lib/ascii.dart
new file mode 100644
index 0000000..48b51d0
--- /dev/null
+++ b/mojo/public/dart/third_party/charcode/lib/ascii.dart
@@ -0,0 +1,354 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Declare integer constants for each ASCII character.
+ *
+ * The constants all start with "$" to avoid conflicting with other constants.
+ *
+ * For characters that are valid in an identifier, the character iteself
+ * follows the "$". For other characters, a symbolic name is used.
+ * In some cases, multiple alternative symbolic names are provided.
+ * Please stick to using one name per character in your code.
+ *
+ * The symbolic names are, where applicable, the name of the symbol without
+ * any "mark", "symbol" "sign" or "accent" suffix.
+ * Examples: [$exclamation], [$pipe], [$dollar] and [$grave].
+ * For less common symbols, a selection of common names are used.
+ *
+ * For parenthetical markers, there is both a short name, [$lparen]/[$rparen],
+ * and a long name, [$open_paren]/ [$close_paren].
+ *
+ * For common HTML entities, the entity names are also useable as symbolic
+ * names: [$apos], [$quot], [$lt], [$gt], and [$amp].
+ */
+library charcode.ascii.dollar_lowercase;
+
+// Control characters.
+
+/// "Null character" control character.
+const int $nul               = 0x00;
+/// "Start of Header" control character.
+const int $soh               = 0x01;
+/// "Start of Text" control character.
+const int $stx               = 0x02;
+/// "End of Text" control character.
+const int $etx               = 0x03;
+/// "End of Transmission" control character.
+const int $eot               = 0x04;
+/// "Enquiry" control character.
+const int $enq               = 0x05;
+/// "Acknowledgment" control character.
+const int $ack               = 0x06;
+/// "Bell" control character.
+const int $bel               = 0x07;
+/// "Backspace" control character.
+const int $bs                = 0x08;
+/// "Horizontal Tab" control character.
+const int $ht                = 0x09;
+/// "Horizontal Tab" control character, common name.
+const int $tab               = 0x09;
+/// "Line feed" control character.
+const int $lf                = 0x0A;
+/// "Vertical Tab" control character.
+const int $vt                = 0x0B;
+/// "Form feed" control character.
+const int $ff                = 0x0C;
+/// "Carriage return" control character.
+const int $cr                = 0x0D;
+/// "Shift Out" control character.
+const int $so                = 0x0E;
+/// "Shift In" control character.
+const int $si                = 0x0F;
+/// "Data Link Escape" control character.
+const int $dle               = 0x10;
+/// "Device Control 1" control character (oft. XON).
+const int $dc1               = 0x11;
+/// "Device Control 2" control character.
+const int $dc2               = 0x12;
+/// "Device Control 3" control character (oft. XOFF).
+const int $dc3               = 0x13;
+/// "Device Control 4" control character.
+const int $dc4               = 0x14;
+/// "Negative Acknowledgment" control character.
+const int $nak               = 0x15;
+/// "Synchronous idle" control character.
+const int $syn               = 0x16;
+/// "End of Transmission Block" control character.
+const int $etb               = 0x17;
+/// "Cancel" control character.
+const int $can               = 0x18;
+/// "End of Medium" control character.
+const int $em                = 0x19;
+/// "Substitute" control character.
+const int $sub               = 0x1A;
+/// "Escape" control character.
+const int $esc               = 0x1B;
+/// "File Separator" control character.
+const int $fs                = 0x1C;
+/// "Group Separator" control character.
+const int $gs                = 0x1D;
+/// "Record Separator" control character.
+const int $rs                = 0x1E;
+/// "Unit Separator" control character.
+const int $us                = 0x1F;
+/// "Delete" control character.
+const int $del               = 0x7F;
+
+// Visible characters.
+
+/// Space character.
+const int $space             = 0x20;
+/// Character '!'.
+const int $exclamation       = 0x21;
+/// Character '"', short name.
+const int $quot              = 0x22;
+/// Character '"'.
+const int $quote             = 0x22;
+/// Character '"'.
+const int $double_quote      = 0x22;
+/// Character '"'.
+const int $quotation         = 0x22;
+/// Character '#'.
+const int $hash              = 0x23;
+/// Character '$'.
+const int $$                 = 0x24;
+/// Character '$'.
+const int $dollar            = 0x24;
+/// Character '%'.
+const int $percent           = 0x25;
+/// Character '&', short name.
+const int $amp               = 0x26;
+/// Character '&'.
+const int $ampersand         = 0x26;
+/// Character "'".
+const int $apos              = 0x27;
+/// Character '''.
+const int $apostrophe        = 0x27;
+/// Character '''.
+const int $single_quote      = 0x27;
+/// Character '('.
+const int $lparen            = 0x28;
+/// Character '('.
+const int $open_paren        = 0x28;
+/// Character '('.
+const int $open_parenthesis  = 0x28;
+/// Character ')'.
+const int $rparen            = 0x29;
+/// Character ')'.
+const int $close_paren       = 0x29;
+/// Character ')'.
+const int $close_parenthesis = 0x29;
+/// Character '*'.
+const int $asterisk          = 0x2A;
+/// Character '+'.
+const int $plus              = 0x2B;
+/// Character ','.
+const int $comma             = 0x2C;
+/// Character '-'.
+const int $minus             = 0x2D;
+/// Character '-'.
+const int $dash              = 0x2D;
+/// Character '.'.
+const int $dot               = 0x2E;
+/// Character '.'.
+const int $fullstop          = 0x2E;
+/// Character '/'.
+const int $slash             = 0x2F;
+/// Character '/'.
+const int $solidus           = 0x2F;
+/// Character '/'.
+const int $division          = 0x2F;
+/// Character '0'.
+const int $0                 = 0x30;
+/// Character '1'.
+const int $1                 = 0x31;
+/// Character '2'.
+const int $2                 = 0x32;
+/// Character '3'.
+const int $3                 = 0x33;
+/// Character '4'.
+const int $4                 = 0x34;
+/// Character '5'.
+const int $5                 = 0x35;
+/// Character '6'.
+const int $6                 = 0x36;
+/// Character '7'.
+const int $7                 = 0x37;
+/// Character '8'.
+const int $8                 = 0x38;
+/// Character '9'.
+const int $9                 = 0x39;
+/// Character ':'.
+const int $colon             = 0x3A;
+/// Character ';'.
+const int $semicolon         = 0x3B;
+/// Character '<'.
+const int $lt                = 0x3C;
+/// Character '<'.
+const int $less_than         = 0x3C;
+/// Character '<'.
+const int $langle            = 0x3C;
+/// Character '<'.
+const int $open_angle        = 0x3C;
+/// Character '='.
+const int $equal             = 0x3D;
+/// Character '>'.
+const int $gt                = 0x3E;
+/// Character '>'.
+const int $greater_than      = 0x3E;
+/// Character '>'.
+const int $rangle            = 0x3E;
+/// Character '>'.
+const int $close_angle       = 0x3E;
+/// Character '?'.
+const int $question          = 0x3F;
+
+/// Character '@'.
+const int $at                = 0x40;
+/// Character 'A'.
+const int $A                 = 0x41;
+/// Character 'B'.
+const int $B                 = 0x42;
+/// Character 'C'.
+const int $C                 = 0x43;
+/// Character 'D'.
+const int $D                 = 0x44;
+/// Character 'E'.
+const int $E                 = 0x45;
+/// Character 'F'.
+const int $F                 = 0x46;
+/// Character 'G'.
+const int $G                 = 0x47;
+/// Character 'H'.
+const int $H                 = 0x48;
+/// Character 'I'.
+const int $I                 = 0x49;
+/// Character 'J'.
+const int $J                 = 0x4A;
+/// Character 'K'.
+const int $K                 = 0x4B;
+/// Character 'L'.
+const int $L                 = 0x4C;
+/// Character 'M'.
+const int $M                 = 0x4D;
+/// Character 'N'.
+const int $N                 = 0x4E;
+/// Character 'O'.
+const int $O                 = 0x4F;
+/// Character 'P'.
+const int $P                 = 0x50;
+/// Character 'Q'.
+const int $Q                 = 0x51;
+/// Character 'R'.
+const int $R                 = 0x52;
+/// Character 'S'.
+const int $S                 = 0x53;
+/// Character 'T'.
+const int $T                 = 0x54;
+/// Character 'U'.
+const int $U                 = 0x55;
+/// Character 'V'.
+const int $V                 = 0x56;
+/// Character 'W'.
+const int $W                 = 0x57;
+/// Character 'X'.
+const int $X                 = 0x58;
+/// Character 'Y'.
+const int $Y                 = 0x59;
+/// Character 'Z'.
+const int $Z                 = 0x5A;
+/// Character '['.
+const int $lbracket          = 0x5B;
+/// Character '['.
+const int $open_bracket      = 0x5B;
+/// Character '\'.
+const int $backslash         = 0x5C;
+/// Character ']'.
+const int $rbracket          = 0x5D;
+/// Character ']'.
+const int $close_bracket     = 0x5D;
+/// Character '^'.
+const int $circumflex        = 0x5E;
+/// Character '^'.
+const int $caret             = 0x5E;
+/// Character '^'.
+const int $hat               = 0x5E;
+/// Character '_'.
+const int $_                 = 0x5F;
+/// Character '_'.
+const int $underscore        = 0x5F;
+/// Character '_'.
+const int $underline         = 0x5F;
+
+/// Character '`'.
+const int $backquote         = 0x60;
+/// Character '`'.
+const int $grave             = 0x60;
+/// Character 'a'.
+const int $a                 = 0x61;
+/// Character 'b'.
+const int $b                 = 0x62;
+/// Character 'c'.
+const int $c                 = 0x63;
+/// Character 'd'.
+const int $d                 = 0x64;
+/// Character 'e'.
+const int $e                 = 0x65;
+/// Character 'f'.
+const int $f                 = 0x66;
+/// Character 'g'.
+const int $g                 = 0x67;
+/// Character 'h'.
+const int $h                 = 0x68;
+/// Character 'i'.
+const int $i                 = 0x69;
+/// Character 'j'.
+const int $j                 = 0x6A;
+/// Character 'k'.
+const int $k                 = 0x6B;
+/// Character 'l'.
+const int $l                 = 0x6C;
+/// Character 'm'.
+const int $m                 = 0x6D;
+/// Character 'n'.
+const int $n                 = 0x6E;
+/// Character 'o'.
+const int $o                 = 0x6F;
+/// Character 'p'.
+const int $p                 = 0x70;
+/// Character 'q'.
+const int $q                 = 0x71;
+/// Character 'r'.
+const int $r                 = 0x72;
+/// Character 's'.
+const int $s                 = 0x73;
+/// Character 't'.
+const int $t                 = 0x74;
+/// Character 'u'.
+const int $u                 = 0x75;
+/// Character 'v'.
+const int $v                 = 0x76;
+/// Character 'w'.
+const int $w                 = 0x77;
+/// Character 'x'.
+const int $x                 = 0x78;
+/// Character 'y'.
+const int $y                 = 0x79;
+/// Character 'z'.
+const int $z                 = 0x7A;
+/// Character '{'.
+const int $lbrace            = 0x7B;
+/// Character '{'.
+const int $open_brace        = 0x7B;
+/// Character '|'.
+const int $pipe              = 0x7C;
+/// Character '|'.
+const int $bar               = 0x7C;
+/// Character '}'.
+const int $rbrace            = 0x7D;
+/// Character '}'.
+const int $close_brace       = 0x7D;
+/// Character '~'.
+const int $tilde             = 0x7E;
diff --git a/mojo/public/dart/third_party/charcode/lib/charcode.dart b/mojo/public/dart/third_party/charcode/lib/charcode.dart
new file mode 100644
index 0000000..a47fc19
--- /dev/null
+++ b/mojo/public/dart/third_party/charcode/lib/charcode.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Defines symbolic names for character code points.
+ *
+ * Includes all ASCII and Latin-1 characters.
+ *
+ * Exports the libraries `ascii.dart` and `html_entity.dart`.
+ *
+ * Hides the characters `$minus`, `$sub` and `$tilde` from
+ * `html_entities.dart`, since other characters have the same name in
+ * `ascii.dart`.
+ */
+library charcode;
+
+export "ascii.dart";
+export "html_entity.dart" hide $minus, $tilde, $sub;
diff --git a/mojo/public/dart/third_party/charcode/lib/html_entity.dart b/mojo/public/dart/third_party/charcode/lib/html_entity.dart
new file mode 100644
index 0000000..507afd4
--- /dev/null
+++ b/mojo/public/dart/third_party/charcode/lib/html_entity.dart
@@ -0,0 +1,523 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Character codes based on HTML 4.01 character entity names.
+ *
+ * For each entity name, e.g., `nbsp`,
+ * a constant with that name prefixed by `$` is defined
+ * for that entity's code point.
+ *
+ * The HTML entities include the non-ASCII Latin-1 characters and
+ * symbols, mathematical symbols and Greek litters.
+ *
+ * The five characters that are ASCII
+ * are exported from the `ascii.dart` library.
+ *
+ * Three names conflict with `ascii.dart`: `$minus`, `$sub` and `$tilde`.
+ * If importing both libraries, these three should be hidden from one of the
+ * libraries.
+ */
+library charcode.htmlentity.dollar_lowercase;
+
+export "ascii.dart" show $quot, $amp, $apos, $lt, $gt;
+
+/// no-break space (non-breaking space)
+const int $nbsp     = 0x00A0;
+/// inverted exclamation mark ('¡')
+const int $iexcl    = 0x00A1;
+/// cent sign ('¢')
+const int $cent     = 0x00A2;
+/// pound sign ('£')
+const int $pound    = 0x00A3;
+/// currency sign ('¤')
+const int $curren   = 0x00A4;
+/// yen sign (yuan sign) ('¥')
+const int $yen      = 0x00A5;
+/// broken bar (broken vertical bar) ('¦')
+const int $brvbar   = 0x00A6;
+/// section sign ('§')
+const int $sect     = 0x00A7;
+/// diaeresis (spacing diaeresis); see Germanic umlaut ('¨')
+const int $uml      = 0x00A8;
+/// copyright symbol ('©')
+const int $copy     = 0x00A9;
+/// feminine ordinal indicator ('ª')
+const int $ordf     = 0x00AA;
+/// left-pointing double angle quotation mark (left pointing guillemet) ('«')
+const int $laquo    = 0x00AB;
+/// not sign ('¬')
+const int $not      = 0x00AC;
+/// soft hyphen (discretionary hyphen)
+const int $shy      = 0x00AD;
+/// registered sign (registered trademark symbol) ('®')
+const int $reg      = 0x00AE;
+/// macron (spacing macron, overline, APL overbar) ('¯')
+const int $macr     = 0x00AF;
+/// degree symbol ('°')
+const int $deg      = 0x00B0;
+/// plus-minus sign (plus-or-minus sign) ('±')
+const int $plusmn   = 0x00B1;
+/// superscript two (superscript digit two, squared) ('²')
+const int $sup2     = 0x00B2;
+/// superscript three (superscript digit three, cubed) ('³')
+const int $sup3     = 0x00B3;
+/// acute accent (spacing acute) ('´')
+const int $acute    = 0x00B4;
+/// micro sign ('µ')
+const int $micro    = 0x00B5;
+/// pilcrow sign (paragraph sign) ('¶')
+const int $para     = 0x00B6;
+/// middle dot (Georgian comma, Greek middle dot) ('·')
+const int $middot   = 0x00B7;
+/// cedilla (spacing cedilla) ('¸')
+const int $cedil    = 0x00B8;
+/// superscript one (superscript digit one) ('¹')
+const int $sup1     = 0x00B9;
+/// masculine ordinal indicator ('º')
+const int $ordm     = 0x00BA;
+/// right-pointing double angle quotation mark (right pointing guillemet) ('»')
+const int $raquo    = 0x00BB;
+/// vulgar fraction one quarter (fraction one quarter) ('¼')
+const int $frac14   = 0x00BC;
+/// vulgar fraction one half (fraction one half) ('½')
+const int $frac12   = 0x00BD;
+/// vulgar fraction three quarters (fraction three quarters) ('¾')
+const int $frac34   = 0x00BE;
+/// inverted question mark (turned question mark) ('¿')
+const int $iquest   = 0x00BF;
+/// Latin capital letter A with grave accent (Latin capital letter A grave) ('À')
+const int $Agrave   = 0x00C0;
+/// Latin capital letter A with acute accent ('Á')
+const int $Aacute   = 0x00C1;
+/// Latin capital letter A with circumflex ('Â')
+const int $Acirc    = 0x00C2;
+/// Latin capital letter A with tilde ('Ã')
+const int $Atilde   = 0x00C3;
+/// Latin capital letter A with diaeresis ('Ä')
+const int $Auml     = 0x00C4;
+/// Latin capital letter A with ring above (Latin capital letter A ring) ('Å')
+const int $Aring    = 0x00C5;
+/// Latin capital letter AE (Latin capital ligature AE) ('Æ')
+const int $AElig    = 0x00C6;
+/// Latin capital letter C with cedilla ('Ç')
+const int $Ccedil   = 0x00C7;
+/// Latin capital letter E with grave accent ('È')
+const int $Egrave   = 0x00C8;
+/// Latin capital letter E with acute accent ('É')
+const int $Eacute   = 0x00C9;
+/// Latin capital letter E with circumflex ('Ê')
+const int $Ecirc    = 0x00CA;
+/// Latin capital letter E with diaeresis ('Ë')
+const int $Euml     = 0x00CB;
+/// Latin capital letter I with grave accent ('Ì')
+const int $Igrave   = 0x00CC;
+/// Latin capital letter I with acute accent ('Í')
+const int $Iacute   = 0x00CD;
+/// Latin capital letter I with circumflex ('Î')
+const int $Icirc    = 0x00CE;
+/// Latin capital letter I with diaeresis ('Ï')
+const int $Iuml     = 0x00CF;
+/// Latin capital letter Eth ('Ð')
+const int $ETH      = 0x00D0;
+/// Latin capital letter N with tilde ('Ñ')
+const int $Ntilde   = 0x00D1;
+/// Latin capital letter O with grave accent ('Ò')
+const int $Ograve   = 0x00D2;
+/// Latin capital letter O with acute accent ('Ó')
+const int $Oacute   = 0x00D3;
+/// Latin capital letter O with circumflex ('Ô')
+const int $Ocirc    = 0x00D4;
+/// Latin capital letter O with tilde ('Õ')
+const int $Otilde   = 0x00D5;
+/// Latin capital letter O with diaeresis ('Ö')
+const int $Ouml     = 0x00D6;
+/// multiplication sign ('×')
+const int $times    = 0x00D7;
+/// Latin capital letter O with stroke (Latin capital letter O slash) ('Ø')
+const int $Oslash   = 0x00D8;
+/// Latin capital letter U with grave accent ('Ù')
+const int $Ugrave   = 0x00D9;
+/// Latin capital letter U with acute accent ('Ú')
+const int $Uacute   = 0x00DA;
+/// Latin capital letter U with circumflex ('Û')
+const int $Ucirc    = 0x00DB;
+/// Latin capital letter U with diaeresis ('Ü')
+const int $Uuml     = 0x00DC;
+/// Latin capital letter Y with acute accent ('Ý')
+const int $Yacute   = 0x00DD;
+/// Latin capital letter THORN ('Þ')
+const int $THORN    = 0x00DE;
+/// Latin small letter sharp s (ess-zed); see German Eszett ('ß')
+const int $szlig    = 0x00DF;
+/// Latin small letter a with grave accent ('à')
+const int $agrave   = 0x00E0;
+/// Latin small letter a with acute accent ('á')
+const int $aacute   = 0x00E1;
+/// Latin small letter a with circumflex ('â')
+const int $acirc    = 0x00E2;
+/// Latin small letter a with tilde ('ã')
+const int $atilde   = 0x00E3;
+/// Latin small letter a with diaeresis ('ä')
+const int $auml     = 0x00E4;
+/// Latin small letter a with ring above ('å')
+const int $aring    = 0x00E5;
+/// Latin small letter ae (Latin small ligature ae) ('æ')
+const int $aelig    = 0x00E6;
+/// Latin small letter c with cedilla ('ç')
+const int $ccedil   = 0x00E7;
+/// Latin small letter e with grave accent ('è')
+const int $egrave   = 0x00E8;
+/// Latin small letter e with acute accent ('é')
+const int $eacute   = 0x00E9;
+/// Latin small letter e with circumflex ('ê')
+const int $ecirc    = 0x00EA;
+/// Latin small letter e with diaeresis ('ë')
+const int $euml     = 0x00EB;
+/// Latin small letter i with grave accent ('ì')
+const int $igrave   = 0x00EC;
+/// Latin small letter i with acute accent ('í')
+const int $iacute   = 0x00ED;
+/// Latin small letter i with circumflex ('î')
+const int $icirc    = 0x00EE;
+/// Latin small letter i with diaeresis ('ï')
+const int $iuml     = 0x00EF;
+/// Latin small letter eth ('ð')
+const int $eth      = 0x00F0;
+/// Latin small letter n with tilde ('ñ')
+const int $ntilde   = 0x00F1;
+/// Latin small letter o with grave accent ('ò')
+const int $ograve   = 0x00F2;
+/// Latin small letter o with acute accent ('ó')
+const int $oacute   = 0x00F3;
+/// Latin small letter o with circumflex ('ô')
+const int $ocirc    = 0x00F4;
+/// Latin small letter o with tilde ('õ')
+const int $otilde   = 0x00F5;
+/// Latin small letter o with diaeresis ('ö')
+const int $ouml     = 0x00F6;
+/// division sign (obelus) ('÷')
+const int $divide   = 0x00F7;
+/// Latin small letter o with stroke (Latin small letter o slash) ('ø')
+const int $oslash   = 0x00F8;
+/// Latin small letter u with grave accent ('ù')
+const int $ugrave   = 0x00F9;
+/// Latin small letter u with acute accent ('ú')
+const int $uacute   = 0x00FA;
+/// Latin small letter u with circumflex ('û')
+const int $ucirc    = 0x00FB;
+/// Latin small letter u with diaeresis ('ü')
+const int $uuml     = 0x00FC;
+/// Latin small letter y with acute accent ('ý')
+const int $yacute   = 0x00FD;
+/// Latin small letter thorn ('þ')
+const int $thorn    = 0x00FE;
+/// Latin small letter y with diaeresis ('ÿ')
+const int $yuml     = 0x00FF;
+/// Latin capital ligature oe ('Œ')
+const int $OElig    = 0x0152;
+/// Latin small ligature oe ('œ')
+const int $oelig    = 0x0153;
+/// Latin capital letter s with caron ('Š')
+const int $Scaron   = 0x0160;
+/// Latin small letter s with caron ('š')
+const int $scaron   = 0x0161;
+/// Latin capital letter y with diaeresis ('Ÿ')
+const int $Yuml     = 0x0178;
+/// Latin small letter f with hook (function, florin) ('ƒ')
+const int $fnof     = 0x0192;
+/// modifier letter circumflex accent ('ˆ')
+const int $circ     = 0x02C6;
+/// small tilde ('˜')
+const int $tilde    = 0x02DC;
+/// Greek capital letter Alpha ('Α')
+const int $Alpha    = 0x0391;
+/// Greek capital letter Beta ('Β')
+const int $Beta     = 0x0392;
+/// Greek capital letter Gamma ('Γ')
+const int $Gamma    = 0x0393;
+/// Greek capital letter Delta ('Δ')
+const int $Delta    = 0x0394;
+/// Greek capital letter Epsilon ('Ε')
+const int $Epsilon  = 0x0395;
+/// Greek capital letter Zeta ('Ζ')
+const int $Zeta     = 0x0396;
+/// Greek capital letter Eta ('Η')
+const int $Eta      = 0x0397;
+/// Greek capital letter Theta ('Θ')
+const int $Theta    = 0x0398;
+/// Greek capital letter Iota ('Ι')
+const int $Iota     = 0x0399;
+/// Greek capital letter Kappa ('Κ')
+const int $Kappa    = 0x039A;
+/// Greek capital letter Lambda ('Λ')
+const int $Lambda   = 0x039B;
+/// Greek capital letter Mu ('Μ')
+const int $Mu       = 0x039C;
+/// Greek capital letter Nu ('Ν')
+const int $Nu       = 0x039D;
+/// Greek capital letter Xi ('Ξ')
+const int $Xi       = 0x039E;
+/// Greek capital letter Omicron ('Ο')
+const int $Omicron  = 0x039F;
+/// Greek capital letter Pi ('Π')
+const int $Pi       = 0x03A0;
+/// Greek capital letter Rho ('Ρ')
+const int $Rho      = 0x03A1;
+/// Greek capital letter Sigma ('Σ')
+const int $Sigma    = 0x03A3;
+/// Greek capital letter Tau ('Τ')
+const int $Tau      = 0x03A4;
+/// Greek capital letter Upsilon ('Υ')
+const int $Upsilon  = 0x03A5;
+/// Greek capital letter Phi ('Φ')
+const int $Phi      = 0x03A6;
+/// Greek capital letter Chi ('Χ')
+const int $Chi      = 0x03A7;
+/// Greek capital letter Psi ('Ψ')
+const int $Psi      = 0x03A8;
+/// Greek capital letter Omega ('Ω')
+const int $Omega    = 0x03A9;
+/// Greek small letter alpha ('α')
+const int $alpha    = 0x03B1;
+/// Greek small letter beta ('β')
+const int $beta     = 0x03B2;
+/// Greek small letter gamma ('γ')
+const int $gamma    = 0x03B3;
+/// Greek small letter delta ('δ')
+const int $delta    = 0x03B4;
+/// Greek small letter epsilon ('ε')
+const int $epsilon  = 0x03B5;
+/// Greek small letter zeta ('ζ')
+const int $zeta     = 0x03B6;
+/// Greek small letter eta ('η')
+const int $eta      = 0x03B7;
+/// Greek small letter theta ('θ')
+const int $theta    = 0x03B8;
+/// Greek small letter iota ('ι')
+const int $iota     = 0x03B9;
+/// Greek small letter kappa ('κ')
+const int $kappa    = 0x03BA;
+/// Greek small letter lambda ('λ')
+const int $lambda   = 0x03BB;
+/// Greek small letter mu ('μ')
+const int $mu       = 0x03BC;
+/// Greek small letter nu ('ν')
+const int $nu       = 0x03BD;
+/// Greek small letter xi ('ξ')
+const int $xi       = 0x03BE;
+/// Greek small letter omicron ('ο')
+const int $omicron  = 0x03BF;
+/// Greek small letter pi ('π')
+const int $pi       = 0x03C0;
+/// Greek small letter rho ('ρ')
+const int $rho      = 0x03C1;
+/// Greek small letter final sigma ('ς')
+const int $sigmaf   = 0x03C2;
+/// Greek small letter sigma ('σ')
+const int $sigma    = 0x03C3;
+/// Greek small letter tau ('τ')
+const int $tau      = 0x03C4;
+/// Greek small letter upsilon ('υ')
+const int $upsilon  = 0x03C5;
+/// Greek small letter phi ('φ')
+const int $phi      = 0x03C6;
+/// Greek small letter chi ('χ')
+const int $chi      = 0x03C7;
+/// Greek small letter psi ('ψ')
+const int $psi      = 0x03C8;
+/// Greek small letter omega ('ω')
+const int $omega    = 0x03C9;
+/// Greek theta symbol ('ϑ')
+const int $thetasym = 0x03D1;
+/// Greek Upsilon with hook symbol ('ϒ')
+const int $upsih    = 0x03D2;
+/// Greek pi symbol ('ϖ')
+const int $piv      = 0x03D6;
+/// en space
+const int $ensp     = 0x2002;
+/// em space
+const int $emsp     = 0x2003;
+/// thin space
+const int $thinsp   = 0x2009;
+/// zero-width non-joiner
+const int $zwnj     = 0x200C;
+/// zero-width joiner
+const int $zwj      = 0x200D;
+/// left-to-right mark
+const int $lrm      = 0x200E;
+/// right-to-left mark
+const int $rlm      = 0x200F;
+/// en dash ('–')
+const int $ndash    = 0x2013;
+/// em dash ('—')
+const int $mdash    = 0x2014;
+/// left single quotation mark ('‘')
+const int $lsquo    = 0x2018;
+/// right single quotation mark ('’')
+const int $rsquo    = 0x2019;
+/// single low-9 quotation mark ('‚')
+const int $sbquo    = 0x201A;
+/// left double quotation mark ('“')
+const int $ldquo    = 0x201C;
+/// right double quotation mark ('”')
+const int $rdquo    = 0x201D;
+/// double low-9 quotation mark ('„')
+const int $bdquo    = 0x201E;
+/// dagger, obelisk ('†')
+const int $dagger   = 0x2020;
+/// double dagger, double obelisk ('‡')
+const int $Dagger   = 0x2021;
+/// bullet (black small circle) ('•')
+const int $bull     = 0x2022;
+/// horizontal ellipsis (three dot leader) ('…')
+const int $hellip   = 0x2026;
+/// per mille sign ('‰')
+const int $permil   = 0x2030;
+/// prime (minutes, feet) ('′')
+const int $prime    = 0x2032;
+/// double prime (seconds, inches) ('″')
+const int $Prime    = 0x2033;
+/// single left-pointing angle quotation mark ('‹')
+const int $lsaquo   = 0x2039;
+/// single right-pointing angle quotation mark ('›')
+const int $rsaquo   = 0x203A;
+/// overline (spacing overscore) ('‾')
+const int $oline    = 0x203E;
+/// fraction slash (solidus) ('⁄')
+const int $frasl    = 0x2044;
+/// euro sign ('€')
+const int $euro     = 0x20AC;
+/// black-letter capital I (imaginary part) ('ℑ')
+const int $image    = 0x2111;
+/// script capital P (power set, Weierstrass p) ('℘')
+const int $weierp   = 0x2118;
+/// black-letter capital R (real part symbol) ('ℜ')
+const int $real     = 0x211C;
+/// trademark symbol ('™')
+const int $trade    = 0x2122;
+/// alef symbol (first transfinite cardinal) ('ℵ')
+const int $alefsym  = 0x2135;
+/// leftwards arrow ('←')
+const int $larr     = 0x2190;
+/// upwards arrow ('↑')
+const int $uarr     = 0x2191;
+/// rightwards arrow ('→')
+const int $rarr     = 0x2192;
+/// downwards arrow ('↓')
+const int $darr     = 0x2193;
+/// left right arrow ('↔')
+const int $harr     = 0x2194;
+/// downwards arrow with corner leftwards (carriage return) ('↵')
+const int $crarr    = 0x21B5;
+/// leftwards double arrow ('⇐')
+const int $lArr     = 0x21D0;
+/// upwards double arrow ('⇑')
+const int $uArr     = 0x21D1;
+/// rightwards double arrow ('⇒')
+const int $rArr     = 0x21D2;
+/// downwards double arrow ('⇓')
+const int $dArr     = 0x21D3;
+/// left right double arrow ('⇔')
+const int $hArr     = 0x21D4;
+/// for all ('∀')
+const int $forall   = 0x2200;
+/// partial differential ('∂')
+const int $part     = 0x2202;
+/// there exists ('∃')
+const int $exist    = 0x2203;
+/// empty set (null set); see also U+8960, ⌀ ('∅')
+const int $empty    = 0x2205;
+/// del or nabla (vector differential operator) ('∇')
+const int $nabla    = 0x2207;
+/// element of ('∈')
+const int $isin     = 0x2208;
+/// not an element of ('∉')
+const int $notin    = 0x2209;
+/// contains as member ('∋')
+const int $ni       = 0x220B;
+/// n-ary product (product sign) ('∏')
+const int $prod     = 0x220F;
+/// n-ary summation ('∑')
+const int $sum      = 0x2211;
+/// minus sign ('−')
+const int $minus    = 0x2212;
+/// asterisk operator ('∗')
+const int $lowast   = 0x2217;
+/// square root (radical sign) ('√')
+const int $radic    = 0x221A;
+/// proportional to ('∝')
+const int $prop     = 0x221D;
+/// infinity ('∞')
+const int $infin    = 0x221E;
+/// angle ('∠')
+const int $ang      = 0x2220;
+/// logical and (wedge) ('∧')
+const int $and      = 0x2227;
+/// logical or (vee) ('∨')
+const int $or       = 0x2228;
+/// intersection (cap) ('∩')
+const int $cap      = 0x2229;
+/// union (cup) ('∪')
+const int $cup      = 0x222A;
+/// integral ('∫')
+const int $int      = 0x222B;
+/// therefore sign ('∴')
+const int $there4   = 0x2234;
+/// tilde operator (varies with, similar to) ('∼')
+const int $sim      = 0x223C;
+/// congruent to ('≅')
+const int $cong     = 0x2245;
+/// almost equal to (asymptotic to) ('≈')
+const int $asymp    = 0x2248;
+/// not equal to ('≠')
+const int $ne       = 0x2260;
+/// identical to; sometimes used for 'equivalent to' ('≡')
+const int $equiv    = 0x2261;
+/// less-than or equal to ('≤')
+const int $le       = 0x2264;
+/// greater-than or equal to ('≥')
+const int $ge       = 0x2265;
+/// subset of ('⊂')
+const int $sub      = 0x2282;
+/// superset of ('⊃')
+const int $sup      = 0x2283;
+/// not a subset of ('⊄')
+const int $nsub     = 0x2284;
+/// subset of or equal to ('⊆')
+const int $sube     = 0x2286;
+/// superset of or equal to ('⊇')
+const int $supe     = 0x2287;
+/// circled plus (direct sum) ('⊕')
+const int $oplus    = 0x2295;
+/// circled times (vector product) ('⊗')
+const int $otimes   = 0x2297;
+/// up tack (orthogonal to, perpendicular) ('⊥')
+const int $perp     = 0x22A5;
+/// dot operator ('⋅')
+const int $sdot     = 0x22C5;
+/// vertical ellipsis ('⋮')
+const int $vellip   = 0x22EE;
+/// left ceiling (APL upstile) ('⌈')
+const int $lceil    = 0x2308;
+/// right ceiling ('⌉')
+const int $rceil    = 0x2309;
+/// left floor (APL downstile) ('⌊')
+const int $lfloor   = 0x230A;
+/// right floor ('⌋')
+const int $rfloor   = 0x230B;
+/// left-pointing angle bracket (bra) ('〈')
+const int $lang     = 0x2329;
+/// right-pointing angle bracket (ket) ('〉')
+const int $rang     = 0x232A;
+/// lozenge ('◊')
+const int $loz      = 0x25CA;
+/// black spade suit ('♠')
+const int $spades   = 0x2660;
+/// black club suit (shamrock) ('♣')
+const int $clubs    = 0x2663;
+/// black heart suit (valentine) ('♥')
+const int $hearts   = 0x2665;
+/// black diamond suit ('♦')
+const int $diams    = 0x2666;
diff --git a/mojo/public/dart/third_party/charcode/pubspec.yaml b/mojo/public/dart/third_party/charcode/pubspec.yaml
new file mode 100644
index 0000000..6494810
--- /dev/null
+++ b/mojo/public/dart/third_party/charcode/pubspec.yaml
@@ -0,0 +1,12 @@
+name: charcode
+version: 1.1.0
+author: Dart Team <misc@dartlang.org>
+description: >
+  Constants for ASCII and common non-ASCII character codes.
+
+  When working with characters in Dart, there is no simple way to
+  represent the code point of a character.
+  This library declares readable symbolic names for character codes.
+homepage: http://www.dartlang.org
+environment:
+  sdk: '>=1.0.0 <2.0.0'
diff --git a/mojo/public/dart/third_party/collection/.gitignore b/mojo/public/dart/third_party/collection/.gitignore
new file mode 100644
index 0000000..25a1df3
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/.gitignore
@@ -0,0 +1,9 @@
+.buildlog
+.DS_Store
+.idea
+.pub/
+.settings/
+build/
+packages
+.packages
+pubspec.lock
diff --git a/mojo/public/dart/third_party/collection/.status b/mojo/public/dart/third_party/collection/.status
new file mode 100644
index 0000000..ebc5f81
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/.status
@@ -0,0 +1,12 @@
+# Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Skip non-test files ending with "_test".
+packages/*: Skip
+*/packages/*: Skip
+*/*/packages/*: Skip
+*/*/*/packages/*: Skip
+*/*/*/*packages/*: Skip
+*/*/*/*/*packages/*: Skip
+
diff --git a/mojo/public/dart/third_party/collection/AUTHORS b/mojo/public/dart/third_party/collection/AUTHORS
new file mode 100644
index 0000000..e8063a8
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/AUTHORS
@@ -0,0 +1,6 @@
+# Below is a list of people and organizations that have contributed
+# to the project. Names should be added to the list like so:
+#
+#   Name/Organization <email address>
+
+Google Inc.
diff --git a/mojo/public/dart/third_party/collection/CHANGELOG.md b/mojo/public/dart/third_party/collection/CHANGELOG.md
new file mode 100644
index 0000000..098e475
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/CHANGELOG.md
@@ -0,0 +1,28 @@
+## 1.1.2
+
+* Export `UnmodifiableMapView` from the Dart core libraries.
+
+## 1.1.1
+
+* Bug-fix for signatures of `isValidKey` arguments of `CanonicalizedMap`.
+
+## 1.1.0
+
+* Add a `QueueList` class that implements both `Queue` and `List`.
+
+## 0.9.4
+
+* Add a `CanonicalizedMap` class that canonicalizes its keys to provide a custom
+  equality relation.
+
+## 0.9.3+1
+
+* Fix all analyzer hints.
+
+## 0.9.3
+
+* Add a `MapKeySet` class that exposes an unmodifiable `Set` view of a `Map`'s
+  keys.
+
+* Add a `MapValueSet` class that takes a function from values to keys and uses
+  it to expose a `Set` view of a `Map`'s values.
diff --git a/mojo/public/dart/third_party/collection/CONTRIBUTING.md b/mojo/public/dart/third_party/collection/CONTRIBUTING.md
new file mode 100644
index 0000000..6f5e0ea
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/CONTRIBUTING.md
@@ -0,0 +1,33 @@
+Want to contribute? Great! First, read this page (including the small print at
+the end).
+
+### Before you contribute
+Before we can use your code, you must sign the
+[Google Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual)
+(CLA), which you can do online. The CLA is necessary mainly because you own the
+copyright to your changes, even after your contribution becomes part of our
+codebase, so we need your permission to use and distribute your code. We also
+need to be sure of various other things—for instance that you'll tell us if you
+know that your code infringes on other people's patents. You don't have to sign
+the CLA until after you've submitted your code for review and a member has
+approved it, but you must do it before we can put your code into our codebase.
+
+Before you start working on a larger contribution, you should get in touch with
+us first through the issue tracker with your idea so that we can help out and
+possibly guide you. Coordinating up front makes it much easier to avoid
+frustration later on.
+
+### Code reviews
+All submissions, including submissions by project members, require review.
+
+### File headers
+All files in the project must start with the following header.
+
+    // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+    // for details. All rights reserved. Use of this source code is governed by a
+    // BSD-style license that can be found in the LICENSE file.
+
+### The small print
+Contributions made by corporations are covered by a different agreement than the
+one above, the
+[Software Grant and Corporate Contributor License Agreement](https://developers.google.com/open-source/cla/corporate).
diff --git a/mojo/public/dart/third_party/collection/LICENSE b/mojo/public/dart/third_party/collection/LICENSE
new file mode 100644
index 0000000..de31e1a
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2015, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/collection/README.md b/mojo/public/dart/third_party/collection/README.md
new file mode 100644
index 0000000..73429a5
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/README.md
@@ -0,0 +1,75 @@
+#Helper libraries for working with collections.
+
+The `collection` package contains a number of separate libraries
+with utility functions and classes that makes working with collections easier.
+
+## Using
+
+The `collection` package can be imported as separate libraries, or
+in totality:
+
+    import 'package:collection/algorithms.dart';
+    import 'package:collection/equality.dart';
+    import 'package:collection/iterable_zip.dart';
+    import 'package:collection/priority_queue.dart';
+    import 'package:collection/wrappers.dart';
+
+or
+
+    import 'package:collection/collection.dart';
+
+## Algorithms
+
+The algorithms library contains functions that operate on lists.
+
+It contains ways to shuffle a `List`, do binary search on a sorted `List`, and
+various sorting algorithms.
+
+
+## Equality
+
+The equality library gives a way to specify equality of elements and
+collections.
+
+Collections in Dart have no inherent equality. Two sets are not equal, even
+if they contain exactly the same objects as elements.
+
+The equality library provides a way to say define such an equality. In this
+case, for example, `const SetEquality(const IdentityEquality())` is an equality
+that considers two sets equal exactly if they contain identical elements.
+
+The library provides ways to define equalities on `Iterable`s, `List`s, `Set`s,
+and `Map`s, as well as combinations of these, such as:
+
+    const MapEquality(const IdentityEquality(), const ListEquality());
+
+This equality considers maps equal if they have identical keys, and the
+corresponding values are lists with equal (`operator==`) values.
+
+
+## Iterable Zip
+
+Utilities for "zipping" a list of iterables into an iterable of lists.
+
+
+## Priority Queue
+
+An interface and implemention of a priority queue.
+
+
+## Wrappers
+
+The wrappers library contains classes that "wrap" a collection.
+
+A wrapper class contains an object of the same type, and it forwards all
+methods to the wrapped object.
+
+Wrapper classes can be used in various ways, for example to restrict the type
+of an object to that of a supertype, or to change the behavior of selected
+functions on an existing object.
+
+## Features and bugs
+
+Please file feature requests and bugs at the [issue tracker][tracker].
+
+[tracker]: https://github.com/dart-lang/collection/issues
diff --git a/mojo/public/dart/third_party/collection/codereview.settings b/mojo/public/dart/third_party/collection/codereview.settings
new file mode 100644
index 0000000..4afc2cf
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: http://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/collection/commit/
+CC_LIST: reviews@dartlang.org
diff --git a/mojo/public/dart/third_party/collection/lib/algorithms.dart b/mojo/public/dart/third_party/collection/lib/algorithms.dart
new file mode 100644
index 0000000..5ff0bb3
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/lib/algorithms.dart
@@ -0,0 +1,301 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Operations on collections.
+ */
+library dart.pkg.collection.algorithms;
+
+import "dart:math" show Random;
+
+/** Version of [binarySearch] optimized for comparable keys */
+int _comparableBinarySearch(List<Comparable> list, Comparable key) {
+  int min = 0;
+  int max = list.length;
+  while (min < max) {
+    int mid = min + ((max - min) >> 1);
+    var element = list[mid];
+    int comp = element.compareTo(key);
+    if (comp == 0) return mid;
+    if (comp < 0) {
+      min = mid + 1;
+    } else {
+      max = mid;
+    }
+  }
+  return -1;
+}
+
+/**
+ * Returns a position of the [key] in [sortedList], if it is there.
+ *
+ * If the list isn't sorted according to the [compare] function, the result
+ * is unpredictable.
+ *
+ * If [compare] is omitted, it defaults to calling [Comparable.compareTo] on
+ * the objects.
+ *
+ * Returns -1 if [key] is not in the list by default.
+ */
+int binarySearch(List sortedList, var key,
+                 { int compare(var a, var b) }) {
+  if (compare == null) {
+    return _comparableBinarySearch(sortedList, key);
+  }
+  int min = 0;
+  int max = sortedList.length;
+  while (min < max) {
+    int mid = min + ((max - min) >> 1);
+    var element = sortedList[mid];
+    int comp = compare(element, key);
+    if (comp == 0) return mid;
+    if (comp < 0) {
+      min = mid + 1;
+    } else {
+      max = mid;
+    }
+  }
+  return -1;
+}
+
+
+/**
+ * Shuffles a list randomly.
+ *
+ * A sub-range of a list can be shuffled by providing [start] and [end].
+ */
+void shuffle(List list, [int start = 0, int end = null]) {
+  Random random = new Random();
+  if (end == null) end = list.length;
+  int length = end - start;
+  while (length > 1) {
+    int pos = random.nextInt(length);
+    length--;
+    var tmp1 = list[start + pos];
+    list[start + pos] = list[start + length];
+    list[start + length] = tmp1;
+  }
+}
+
+
+/**
+ * Reverses a list, or a part of a list, in-place.
+ */
+void reverse(List list, [int start = 0, int end = null]) {
+  if (end == null) end = list.length;
+  _reverse(list, start, end);
+}
+
+// Internal helper function that assumes valid arguments.
+void _reverse(List list, int start, int end) {
+  for (int i = start, j = end - 1; i < j; i++, j--) {
+    var tmp = list[i];
+    list[i] = list[j];
+    list[j] = tmp;
+  }
+}
+
+/**
+ * Sort a list using insertion sort.
+ *
+ * Insertion sort is a simple sorting algorithm. For `n` elements it does on
+ * the order of `n * log(n)` comparisons but up to `n` squared moves. The
+ * sorting is performed in-place, without using extra memory.
+ *
+ * For short lists the many moves have less impact than the simple algorithm,
+ * and it is often the favored sorting algorithm for short lists.
+ *
+ * This insertion sort is stable: Equal elements end up in the same order
+ * as they started in.
+ */
+void insertionSort(List list,
+                   { int compare(a, b),
+                     int start: 0,
+                     int end: null }) {
+  // If the same method could have both positional and named optional
+  // parameters, this should be (list, [start, end], {compare}).
+  if (end == null) end = list.length;
+  if (compare == null) compare = Comparable.compare;
+  _insertionSort(list, compare, start, end, start + 1);
+}
+
+/**
+ * Internal helper function that assumes arguments correct.
+ *
+ * Assumes that the elements up to [sortedUntil] (not inclusive) are
+ * already sorted. The [sortedUntil] values should always be at least
+ * `start + 1`.
+ */
+void _insertionSort(List list, int compare(a, b), int start, int end,
+                    int sortedUntil) {
+  for (int pos = sortedUntil; pos < end; pos++) {
+    int min = start;
+    int max = pos;
+    var element = list[pos];
+    while (min < max) {
+      int mid = min + ((max - min) >> 1);
+      int comparison = compare(element, list[mid]);
+      if (comparison < 0) {
+        max = mid;
+      } else {
+        min = mid + 1;
+      }
+    }
+    list.setRange(min + 1, pos + 1, list, min);
+    list[min] = element;
+  }
+}
+
+/** Limit below which merge sort defaults to insertion sort. */
+const int _MERGE_SORT_LIMIT = 32;
+
+/**
+ * Sorts a list, or a range of a list, using the merge sort algorithm.
+ *
+ * Merge-sorting works by splitting the job into two parts, sorting each
+ * recursively, and then merging the two sorted parts.
+ *
+ * This takes on the order of `n * log(n)` comparisons and moves to sort
+ * `n` elements, but requires extra space of about the same size as the list
+ * being sorted.
+ *
+ * This merge sort is stable: Equal elements end up in the same order
+ * as they started in.
+ */
+void mergeSort(List list, {int start: 0, int end: null, int compare(a, b)}) {
+  if (end == null) end = list.length;
+  if (compare == null) compare = Comparable.compare;
+  int length = end - start;
+  if (length < 2) return;
+  if (length < _MERGE_SORT_LIMIT) {
+    _insertionSort(list, compare, start, end, start + 1);
+    return;
+  }
+  // Special case the first split instead of directly calling
+  // _mergeSort, because the _mergeSort requires its target to
+  // be different from its source, and it requires extra space
+  // of the same size as the list to sort.
+  // This split allows us to have only half as much extra space,
+  // and it ends up in the original place.
+  int middle = start + ((end - start) >> 1);
+  int firstLength = middle - start;
+  int secondLength = end - middle;
+  // secondLength is always the same as firstLength, or one greater.
+  List scratchSpace = new List(secondLength);
+  _mergeSort(list, compare, middle, end, scratchSpace, 0);
+  int firstTarget = end - firstLength;
+  _mergeSort(list, compare, start, middle, list, firstTarget);
+  _merge(compare,
+         list, firstTarget, end,
+         scratchSpace, 0, secondLength,
+         list, start);
+}
+
+/**
+ * Performs an insertion sort into a potentially different list than the
+ * one containing the original values.
+ *
+ * It will work in-place as well.
+ */
+void _movingInsertionSort(List list, int compare(a, b), int start, int end,
+                          List target, int targetOffset) {
+  int length = end - start;
+  if (length == 0) return;
+  target[targetOffset] = list[start];
+  for (int i = 1; i < length; i++) {
+    var element = list[start + i];
+    int min = targetOffset;
+    int max = targetOffset + i;
+    while (min < max) {
+      int mid = min + ((max - min) >> 1);
+      if (compare(element, target[mid]) < 0) {
+        max = mid;
+      } else {
+        min = mid + 1;
+      }
+    }
+    target.setRange(min + 1, targetOffset + i + 1,
+                    target, min);
+    target[min] = element;
+  }
+}
+
+/**
+ * Sorts [list] from [start] to [end] into [target] at [targetOffset].
+ *
+ * The `target` list must be able to contain the range from `start` to `end`
+ * after `targetOffset`.
+ *
+ * Allows target to be the same list as [list], as long as it's not
+ * overlapping the `start..end` range.
+ */
+void _mergeSort(List list, int compare(a, b), int start, int end,
+                List target, int targetOffset) {
+  int length = end - start;
+  if (length < _MERGE_SORT_LIMIT) {
+    _movingInsertionSort(list, compare, start, end, target, targetOffset);
+    return;
+  }
+  int middle = start + (length >> 1);
+  int firstLength = middle - start;
+  int secondLength = end - middle;
+  // Here secondLength >= firstLength (differs by at most one).
+  int targetMiddle = targetOffset + firstLength;
+  // Sort the second half into the end of the target area.
+  _mergeSort(list, compare, middle, end,
+             target, targetMiddle);
+  // Sort the first half into the end of the source area.
+  _mergeSort(list, compare, start, middle,
+             list, middle);
+  // Merge the two parts into the target area.
+  _merge(compare,
+         list, middle, middle + firstLength,
+         target, targetMiddle, targetMiddle + secondLength,
+         target, targetOffset);
+}
+
+/**
+ * Merges two lists into a target list.
+ *
+ * One of the input lists may be positioned at the end of the target
+ * list.
+ *
+ * For equal object, elements from [firstList] are always preferred.
+ * This allows the merge to be stable if the first list contains elements
+ * that started out earlier than the ones in [secondList]
+ */
+void _merge(int compare(a, b),
+            List firstList, int firstStart, int firstEnd,
+            List secondList, int secondStart, int secondEnd,
+            List target, int targetOffset) {
+  // No empty lists reaches here.
+  assert(firstStart < firstEnd);
+  assert(secondStart < secondEnd);
+  int cursor1 = firstStart;
+  int cursor2 = secondStart;
+  var firstElement = firstList[cursor1++];
+  var secondElement = secondList[cursor2++];
+  while (true) {
+    if (compare(firstElement, secondElement) <= 0) {
+      target[targetOffset++] = firstElement;
+      if (cursor1 == firstEnd) break;  // Flushing second list after loop.
+      firstElement = firstList[cursor1++];
+    } else {
+      target[targetOffset++] = secondElement;
+      if (cursor2 != secondEnd) {
+        secondElement = secondList[cursor2++];
+        continue;
+      }
+      // Second list empties first. Flushing first list here.
+      target[targetOffset++] = firstElement;
+      target.setRange(targetOffset, targetOffset + (firstEnd - cursor1),
+          firstList, cursor1);
+      return;
+    }
+  }
+  // First list empties first. Reached by break above.
+  target[targetOffset++] = secondElement;
+  target.setRange(targetOffset, targetOffset + (secondEnd - cursor2),
+      secondList, cursor2);
+}
diff --git a/mojo/public/dart/third_party/collection/lib/collection.dart b/mojo/public/dart/third_party/collection/lib/collection.dart
new file mode 100644
index 0000000..45d3867
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/lib/collection.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Exports all the individual parts of the collection-helper library.
+ *
+ * The sub-libraries of this package are:
+ *
+ * - `algorithms.dart`: Algorithms that work on lists (shuffle, binary search
+ *                      and various sorting algorithms).
+ * - `equality.dart`: Different notions of equality of collections.
+ * - `iterable_zip.dart`: Combining multiple iterables into one.
+ * - `priority_queue.dart`: Priority queue type and implementations.
+ * - `wrappers.dart`: Wrapper classes that delegate to a collection object.
+ *                    Includes unmodifiable views of collections.
+ */
+library dart.pkg.collection;
+
+export "algorithms.dart";
+export "equality.dart";
+export "iterable_zip.dart";
+export "priority_queue.dart";
+export "src/canonicalized_map.dart";
+export "src/queue_list.dart";
+export "wrappers.dart";
diff --git a/mojo/public/dart/third_party/collection/lib/equality.dart b/mojo/public/dart/third_party/collection/lib/equality.dart
new file mode 100644
index 0000000..c6fdafa
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/lib/equality.dart
@@ -0,0 +1,419 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Defines equality relations on collections.
+ */
+library dart.pkg.collection.equality;
+
+import "dart:collection";
+
+const int _HASH_MASK = 0x7fffffff;
+
+/**
+ * A generic equality relation on objects.
+ */
+abstract class Equality<E> {
+  const factory Equality() = DefaultEquality;
+
+  /**
+   * Compare two elements for being equal.
+   *
+   * This should be a proper equality relation.
+   */
+  bool equals(E e1, E e2);
+
+  /**
+   * Get a hashcode of an element.
+   *
+   * The hashcode should be compatible with [equals], so that if
+   * `equals(a, b)` then `hash(a) == hash(b)`.
+   */
+  int hash(E e);
+
+  /**
+   * Test whether an object is a valid argument to [equals] and [hash].
+   *
+   * Some implementations may be restricted to only work on specific types
+   * of objects.
+   */
+  bool isValidKey(Object o);
+}
+
+/**
+ * Equality of objects that compares only the natural equality of the objects.
+ *
+ * This equality uses the objects' own [Object.==] and [Object.hashCode] for
+ * the equality.
+ */
+class DefaultEquality implements Equality {
+  const DefaultEquality();
+  bool equals(Object e1, Object e2) => e1 == e2;
+  int hash(Object e) => e.hashCode;
+  bool isValidKey(Object o) => true;
+}
+
+/**
+ * Equality of objects that compares only the identity of the objects.
+ */
+class IdentityEquality implements Equality {
+  const IdentityEquality();
+  bool equals(Object e1, Object e2) => identical(e1, e2);
+  int hash(Object e) => identityHashCode(e);
+  bool isValidKey(Object o) => true;
+}
+
+/**
+ * Equality on iterables.
+ *
+ * Two iterables are equal if they have the same elements in the same order.
+ */
+class IterableEquality<E> implements Equality<Iterable<E>> {
+  final Equality<E> _elementEquality;
+  const IterableEquality([Equality<E> elementEquality =
+                              const DefaultEquality()])
+      : _elementEquality = elementEquality;
+
+  bool equals(Iterable<E> elements1, Iterable<E> elements2) {
+    if (identical(elements1, elements2)) return true;
+    if (elements1 == null || elements2 == null) return false;
+    Iterator it1 = elements1.iterator;
+    Iterator it2 = elements2.iterator;
+    while (true) {
+      bool hasNext = it1.moveNext();
+      if (hasNext != it2.moveNext()) return false;
+      if (!hasNext) return true;
+      if (!_elementEquality.equals(it1.current, it2.current)) return false;
+    }
+  }
+
+  int hash(Iterable<E> elements) {
+    // Jenkins's one-at-a-time hash function.
+    int hash = 0;
+    for (E element in elements) {
+      int c = _elementEquality.hash(element);
+      hash = (hash + c) & _HASH_MASK;
+      hash = (hash + (hash << 10)) & _HASH_MASK;
+      hash ^= (hash >> 6);
+    }
+    hash = (hash + (hash << 3)) & _HASH_MASK;
+    hash ^= (hash >> 11);
+    hash = (hash + (hash << 15)) & _HASH_MASK;
+    return hash;
+  }
+
+  bool isValidKey(Object o) => o is Iterable<E>;
+}
+
+/**
+ * Equality on lists.
+ *
+ * Two lists are equal if they have the same length and their elements
+ * at each index are equal.
+ *
+ * This is effectively the same as [IterableEquality] except that it
+ * accesses elements by index instead of through iteration.
+ */
+class ListEquality<E> implements Equality<List<E>> {
+  final Equality<E> _elementEquality;
+  const ListEquality([Equality<E> elementEquality = const DefaultEquality()])
+      : _elementEquality = elementEquality;
+
+  bool equals(List<E> e1, List<E> e2) {
+    if (identical(e1, e2)) return true;
+    if (e1 == null || e2 == null) return false;
+    int length = e1.length;
+    if (length != e2.length) return false;
+    for (int i = 0; i < length; i++) {
+      if (!_elementEquality.equals(e1[i], e2[i])) return false;
+    }
+    return true;
+  }
+
+  int hash(List<E> e) {
+    // Jenkins's one-at-a-time hash function.
+    // This code is almost identical to the one in IterableEquality, except
+    // that it uses indexing instead of iterating to get the elements.
+    int hash = 0;
+    for (int i = 0; i < e.length; i++) {
+      int c = _elementEquality.hash(e[i]);
+      hash = (hash + c) & _HASH_MASK;
+      hash = (hash + (hash << 10)) & _HASH_MASK;
+      hash ^= (hash >> 6);
+    }
+    hash = (hash + (hash << 3)) & _HASH_MASK;
+    hash ^= (hash >> 11);
+    hash = (hash + (hash << 15)) & _HASH_MASK;
+    return hash;
+  }
+
+  bool isValidKey(Object o) => o is List<E>;
+}
+
+abstract class _UnorderedEquality<E, T extends Iterable<E>>
+    implements Equality<T> {
+  final Equality<E> _elementEquality;
+
+  const _UnorderedEquality(this._elementEquality);
+
+  bool equals(T e1, T e2) {
+    if (identical(e1, e2)) return true;
+    if (e1 == null || e2 == null) return false;
+    HashMap<E, int> counts = new HashMap(
+        equals: _elementEquality.equals,
+        hashCode: _elementEquality.hash,
+        isValidKey: _elementEquality.isValidKey);
+    int length = 0;
+    for (var e in e1) {
+      int count = counts[e];
+      if (count == null) count = 0;
+      counts[e] = count + 1;
+      length++;
+    }
+    for (var e in e2) {
+      int count = counts[e];
+      if (count == null || count == 0) return false;
+      counts[e] = count - 1;
+      length--;
+    }
+    return length == 0;
+  }
+
+  int hash(T e) {
+    int hash = 0;
+    for (E element in e) {
+      int c = _elementEquality.hash(element);
+      hash = (hash + c) & _HASH_MASK;
+    }
+    hash = (hash + (hash << 3)) & _HASH_MASK;
+    hash ^= (hash >> 11);
+    hash = (hash + (hash << 15)) & _HASH_MASK;
+    return hash;
+  }
+}
+
+/**
+ * Equality of the elements of two iterables without considering order.
+ *
+ * Two iterables are considered equal if they have the same number of elements,
+ * and the elements of one set can be paired with the elements
+ * of the other iterable, so that each pair are equal.
+ */
+class UnorderedIterableEquality<E> extends _UnorderedEquality<E, Iterable<E>> {
+  const UnorderedIterableEquality(
+      [Equality<E> elementEquality = const DefaultEquality()])
+      : super(elementEquality);
+
+  bool isValidKey(Object o) => o is Iterable<E>;
+}
+
+/**
+ * Equality of sets.
+ *
+ * Two sets are considered equal if they have the same number of elements,
+ * and the elements of one set can be paired with the elements
+ * of the other set, so that each pair are equal.
+ *
+ * This equality behaves the same as [UnorderedIterableEquality] except that
+ * it expects sets instead of iterables as arguments.
+ */
+class SetEquality<E> extends _UnorderedEquality<E, Set<E>> {
+  const SetEquality(
+      [Equality<E> elementEquality = const DefaultEquality()])
+      : super(elementEquality);
+
+  bool isValidKey(Object o) => o is Set<E>;
+}
+
+/**
+ *  Internal class used by [MapEquality].
+ *
+ *  The class represents a map entry as a single object,
+ *  using a combined hashCode and equality of the key and value.
+ */
+class _MapEntry {
+  final MapEquality equality;
+  final key;
+  final value;
+  _MapEntry(this.equality, this.key, this.value);
+
+  int get hashCode =>
+      (3 * equality._keyEquality.hash(key) +
+       7 * equality._valueEquality.hash(value)) & _HASH_MASK;
+
+  bool operator==(Object other) {
+    if (other is! _MapEntry) return false;
+    _MapEntry otherEntry = other;
+    return equality._keyEquality.equals(key, otherEntry.key) &&
+           equality._valueEquality.equals(value, otherEntry.value);
+
+  }
+}
+
+/**
+ * Equality on maps.
+ *
+ * Two maps are equal if they have the same number of entries, and if the
+ * entries of the two maps are pairwise equal on both key and value.
+ */
+class MapEquality<K, V> implements Equality<Map<K, V>> {
+  final Equality<K> _keyEquality;
+  final Equality<V> _valueEquality;
+  const MapEquality({ Equality<K> keys : const DefaultEquality(),
+                      Equality<V> values : const DefaultEquality() })
+      : _keyEquality = keys, _valueEquality = values;
+
+  bool equals(Map<K, V> e1, Map<K, V> e2) {
+    if (identical(e1, e2)) return true;
+    if (e1 == null || e2 == null) return false;
+    int length = e1.length;
+    if (length != e2.length) return false;
+    Map<_MapEntry, int> equalElementCounts = new HashMap();
+    for (K key in e1.keys) {
+      _MapEntry entry = new _MapEntry(this, key, e1[key]);
+      int count = equalElementCounts[entry];
+      if (count == null) count = 0;
+      equalElementCounts[entry] = count + 1;
+    }
+    for (K key in e2.keys) {
+      _MapEntry entry = new _MapEntry(this, key, e2[key]);
+      int count = equalElementCounts[entry];
+      if (count == null || count == 0) return false;
+      equalElementCounts[entry] = count - 1;
+    }
+    return true;
+  }
+
+  int hash(Map<K, V> map) {
+    int hash = 0;
+    for (K key in map.keys) {
+      int keyHash = _keyEquality.hash(key);
+      int valueHash = _valueEquality.hash(map[key]);
+      hash = (hash + 3 * keyHash + 7 * valueHash) & _HASH_MASK;
+    }
+    hash = (hash + (hash << 3)) & _HASH_MASK;
+    hash ^= (hash >> 11);
+    hash = (hash + (hash << 15)) & _HASH_MASK;
+    return hash;
+  }
+
+  bool isValidKey(Object o) => o is Map<K, V>;
+}
+
+/**
+ * Combines several equalities into a single equality.
+ *
+ * Tries each equality in order, using [Equality.isValidKey], and returns
+ * the result of the first equality that applies to the argument or arguments.
+ *
+ * For `equals`, the first equality that matches the first argument is used,
+ * and if the second argument of `equals` is not valid for that equality,
+ * it returns false.
+ *
+ * Because the equalities are tried in order, they should generally work on
+ * disjoint types. Otherwise the multi-equality may give inconsistent results
+ * for `equals(e1, e2)` and `equals(e2, e1)`. This can happen if one equality
+ * considers only `e1` a valid key, and not `e2`, but an equality which is
+ * checked later, allows both.
+ */
+class MultiEquality<E> implements Equality<E> {
+  final Iterable<Equality<E>> _equalities;
+
+  const MultiEquality(Iterable<Equality<E>> equalities)
+      : _equalities = equalities;
+
+  bool equals(E e1, E e2) {
+    for (Equality<E> eq in _equalities) {
+      if (eq.isValidKey(e1)) return eq.isValidKey(e2) && eq.equals(e1, e2);
+    }
+    return false;
+  }
+
+  int hash(E e) {
+    for (Equality<E> eq in _equalities) {
+      if (eq.isValidKey(e)) return eq.hash(e);
+    }
+    return -1;
+  }
+
+  bool isValidKey(Object o) {
+    for (Equality<E> eq in _equalities) {
+      if (eq.isValidKey(o)) return true;
+    }
+    return false;
+  }
+}
+
+/**
+ * Deep equality on collections.
+ *
+ * Recognizes lists, sets, iterables and maps and compares their elements using
+ * deep equality as well.
+ *
+ * Non-iterable/map objects are compared using a configurable base equality.
+ *
+ * Works in one of two modes: ordered or unordered.
+ *
+ * In ordered mode, lists and iterables are required to have equal elements
+ * in the same order. In unordered mode, the order of elements in iterables
+ * and lists are not importan.
+ *
+ * A list is only equal to another list, likewise for sets and maps. All other
+ * iterables are compared as iterables only.
+ */
+class DeepCollectionEquality implements Equality {
+  final Equality _base;
+  final bool _unordered;
+  const DeepCollectionEquality([Equality base = const DefaultEquality()])
+      : _base = base, _unordered = false;
+
+  /**
+   * Creates a deep equality on collections where the order of lists and
+   * iterables are not considered important. That is, lists and iterables are
+   * treated as unordered iterables.
+   */
+  const DeepCollectionEquality.unordered(
+      [Equality base = const DefaultEquality()])
+      : _base = base, _unordered = true;
+
+  bool equals(e1, e2) {
+    if (e1 is Set) {
+      if (e2 is! Set) return false;
+      return new SetEquality(this).equals(e1, e2);
+    }
+    if (e1 is Map) {
+      if (e2 is! Map) return false;
+      return new MapEquality(keys: this, values: this).equals(e1, e2);
+    }
+    if (!_unordered) {
+      if (e1 is List) {
+        if (e2 is! List) return false;
+        return new ListEquality(this).equals(e1, e2);
+      }
+      if (e1 is Iterable) {
+        if (e2 is! Iterable) return false;
+        return new IterableEquality(this).equals(e1, e2);
+      }
+    } else if (e1 is Iterable) {
+      if (e2 is! Iterable) return false;
+      if (e1 is List != e2 is List) return false;
+      return new UnorderedIterableEquality(this).equals(e1, e2);
+    }
+    return _base.equals(e1, e2);
+  }
+
+  int hash(Object o) {
+    if (o is Set) return new SetEquality(this).hash(o);
+    if (o is Map) return new MapEquality(keys: this, values: this).hash(o);
+    if (!_unordered) {
+      if (o is List) return new ListEquality(this).hash(o);
+      if (o is Iterable) return new IterableEquality(this).hash(o);
+    } else if (o is Iterable) {
+      return new UnorderedIterableEquality(this).hash(o);
+    }
+    return _base.hash(o);
+  }
+
+  bool isValidKey(Object o) => o is Iterable || o is Map || _base.isValidKey(o);
+}
diff --git a/mojo/public/dart/third_party/collection/lib/iterable_zip.dart b/mojo/public/dart/third_party/collection/lib/iterable_zip.dart
new file mode 100644
index 0000000..772b07e
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/lib/iterable_zip.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Zipping multiple iterables into one iterable of tuples of values.
+ */
+library dart.pkg.collection.iterable_zip;
+
+import "dart:collection" show IterableBase;
+
+/**
+ * Iterable that iterates over lists of values from other iterables.
+ *
+ * When [iterator] is read, an [Iterator] is created for each [Iterable] in
+ * the [Iterable] passed to the constructor.
+ *
+ * As long as all these iterators have a next value, those next values are
+ * combined into a single list, which becomes the next value of this
+ * [Iterable]'s [Iterator]. As soon as any of the iterators run out,
+ * the zipped iterator also stops.
+ */
+class IterableZip extends IterableBase<List> {
+  final Iterable<Iterable> _iterables;
+  IterableZip(Iterable<Iterable> iterables)
+      : this._iterables = iterables;
+
+  /**
+   * Returns an iterator that combines values of the iterables' iterators
+   * as long as they all have values.
+   */
+  Iterator<List> get iterator {
+    List iterators = _iterables.map((x) => x.iterator).toList(growable: false);
+    // TODO(lrn): Return an empty iterator directly if iterators is empty?
+    return new _IteratorZip(iterators);
+  }
+}
+
+class _IteratorZip implements Iterator<List> {
+  final List<Iterator> _iterators;
+  List _current;
+  _IteratorZip(List iterators) : _iterators = iterators;
+  bool moveNext() {
+    if (_iterators.isEmpty) return false;
+    for (int i = 0; i < _iterators.length; i++) {
+      if (!_iterators[i].moveNext()) {
+        _current = null;
+        return false;
+      }
+    }
+    _current = new List(_iterators.length);
+    for (int i = 0; i < _iterators.length; i++) {
+      _current[i] = _iterators[i].current;
+    }
+    return true;
+  }
+
+  List get current => _current;
+}
diff --git a/mojo/public/dart/third_party/collection/lib/priority_queue.dart b/mojo/public/dart/third_party/collection/lib/priority_queue.dart
new file mode 100644
index 0000000..efb3239
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/lib/priority_queue.dart
@@ -0,0 +1,396 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart.pkg.collection.priority_queue;
+
+import "dart:collection" show SplayTreeSet;
+
+/**
+ * A priority queue is a priority based work-list of elements.
+ *
+ * The queue allows adding elements, and removing them again in priority order.
+ */
+abstract class PriorityQueue<E> {
+  /**
+   * Number of elements in the queue.
+   */
+  int get length;
+
+  /**
+   * Whether the queue is empty.
+   */
+  bool get isEmpty;
+
+  /**
+   * Whether the queue has any elements.
+   */
+  bool get isNotEmpty;
+
+  /**
+   * Checks if [object] is in the queue.
+   *
+   * Returns true if the element is found.
+   */
+  bool contains(E object);
+
+  /**
+   * Adds element to the queue.
+   *
+   * The element will become the next to be removed by [removeFirst]
+   * when all elements with higher priority have been removed.
+   */
+  void add(E element);
+
+  /**
+   * Adds all [elements] to the queue.
+   */
+  void addAll(Iterable<E> elements);
+
+  /**
+   * Returns the next element that will be returned by [removeFirst].
+   *
+   * The element is not removed from the queue.
+   *
+   * The queue must not be empty when this method is called.
+   */
+  E get first;
+
+  /**
+   * Removes and returns the element with the highest priority.
+   *
+   * Repeatedly calling this method, without adding element in between,
+   * is guaranteed to return elements in non-decreasing order as, specified by
+   * [comparison].
+   *
+   * The queue must not be empty when this method is called.
+   */
+  E removeFirst();
+
+  /**
+   * Removes an element that compares equal to [element] in the queue.
+   *
+   * Returns true if an element is found and removed,
+   * and false if no equal element is found.
+   */
+  bool remove(E element);
+
+  /**
+   * Removes all the elements from this queue and returns them.
+   *
+   * The returned iterable has no specified order.
+   */
+  Iterable<E> removeAll();
+
+  /**
+   * Removes all the elements from this queue.
+   */
+  void clear();
+
+  /**
+   * Returns a list of the elements of this queue in priority order.
+   *
+   * The queue is not modified.
+   *
+   * The order is the order that the elements would be in if they were
+   * removed from this queue using [removeFirst].
+   */
+  List<E> toList();
+
+  /**
+   * Return a comparator based set using the comparator of this queue.
+   *
+   * The queue is not modified.
+   *
+   * The returned [Set] is currently a [SplayTreeSet],
+   * but this may change as other ordered sets are implemented.
+   *
+   * The set contains all the elements of this queue.
+   * If an element occurs more than once in the queue,
+   * the set will contain it only once.
+   */
+  Set<E> toSet();
+}
+
+/**
+ * Heap based priority queue.
+ *
+ * The elements are kept in a heap structure,
+ * where the element with the highest priority is immediately accessible,
+ * and modifying a single element takes
+ * logarithmic time in the number of elements on average.
+ *
+ * * The [add] and [removeFirst] operations take amortized logarithmic time,
+ *   O(log(n)), but may occasionally take linear time when growing the capacity
+ *   of the heap.
+ * * The [addAll] operation works as doing repeated [add] operations.
+ * * The [first] getter takes constant time, O(1).
+ * * The [clear] and [removeAll] methods also take constant time, O(1).
+ * * The [contains] and [remove] operations may need to search the entire
+ *   queue for the elements, taking O(n) time.
+ * * The [toList] operation effectively sorts the elements, taking O(n*log(n))
+ *   time.
+ * * The [toSet] operation effectively adds each element to the new set, taking
+ *   an expected O(n*log(n)) time.
+ */
+class HeapPriorityQueue<E> implements PriorityQueue<E> {
+  /**
+   * Initial capacity of a queue when created, or when added to after a [clear].
+   *
+   * Number can be any positive value. Picking a size that gives a whole
+   * number of "tree levels" in the heap is only done for aesthetic reasons.
+   */
+  static const int _INITIAL_CAPACITY = 7;
+
+  /**
+   * The comparison being used to compare the priority of elements.
+   */
+  final Comparator comparison;
+
+  /**
+   * List implementation of a heap.
+   */
+  List<E> _queue = new List<E>(_INITIAL_CAPACITY);
+
+  /**
+   * Number of elements in queue.
+   *
+   * The heap is implemented in the first [_length] entries of [_queue].
+   */
+  int _length = 0;
+
+  /**
+   * Create a new priority queue.
+   *
+   * The [comparison] is a [Comparator] used to compare the priority of
+   * elements. An element that compares as less than another element has
+   * a higher priority.
+   *
+   * If [comparison] is omitted, it defaults to [Comparable.compare].
+   */
+  HeapPriorityQueue([int comparison(E e1, E e2)])
+      : comparison = (comparison != null) ? comparison : Comparable.compare;
+
+  void add(E element) {
+    _add(element);
+  }
+
+  void addAll(Iterable<E> elements) {
+    for (E element in elements) {
+      _add(element);
+    }
+  }
+
+  void clear() {
+    _queue = const [];
+    _length = 0;
+  }
+
+  bool contains(E object) {
+    return _locate(object) >= 0;
+  }
+
+  E get first {
+    if (_length == 0) throw new StateError("No such element");
+    return _queue[0];
+  }
+
+  bool get isEmpty => _length == 0;
+
+  bool get isNotEmpty => _length != 0;
+
+  int get length => _length;
+
+  bool remove(E element) {
+    int index = _locate(element);
+    if (index < 0) return false;
+    E last = _removeLast();
+    if (index < _length) {
+      int comp = comparison(last, element);
+      if (comp <= 0) {
+        _bubbleUp(last, index);
+      } else {
+        _bubbleDown(last, index);
+      }
+    }
+    return true;
+  }
+
+  Iterable<E> removeAll() {
+    List<E> result = _queue;
+    int length = _length;
+    _queue = const [];
+    _length = 0;
+    return result.take(length);
+  }
+
+  E removeFirst() {
+    if (_length == 0) throw new StateError("No such element");
+    E result = _queue[0];
+    E last = _removeLast();
+    if (_length > 0) {
+      _bubbleDown(last, 0);
+    }
+    return result;
+  }
+
+  List<E> toList() {
+    List<E> list = new List<E>()..length = _length;
+    list.setRange(0, _length, _queue);
+    list.sort(comparison);
+    return list;
+  }
+
+  Set<E> toSet() {
+    Set<E> set = new SplayTreeSet<E>(comparison);
+    for (int i = 0; i < _length; i++) {
+      set.add(_queue[i]);
+    }
+    return set;
+  }
+
+  /**
+   * Returns some representation of the queue.
+   *
+   * The format isn't significant, and may change in the future.
+   */
+  String toString() {
+    return _queue.take(_length).toString();
+  }
+
+  /**
+   * Add element to the queue.
+   *
+   * Grows the capacity if the backing list is full.
+   */
+  void _add(E element) {
+    if (_length == _queue.length) _grow();
+    _bubbleUp(element, _length++);
+  }
+
+  /**
+   * Find the index of an object in the heap.
+   *
+   * Returns -1 if the object is not found.
+   */
+  int _locate(E object) {
+    if (_length == 0) return -1;
+    // Count positions from one instad of zero. This gives the numbers
+    // some nice properties. For example, all right children are odd,
+    // their left sibling is even, and the parent is found by shifting
+    // right by one.
+    // Valid range for position is [1.._length], inclusive.
+    int position = 1;
+    // Pre-order depth first search, omit child nodes if the current
+    // node has lower priority than [object], because all nodes lower
+    // in the heap will also have lower priority.
+    do {
+      int index = position - 1;
+      E element = _queue[index];
+      int comp = comparison(element, object);
+      if (comp == 0) return index;
+      if (comp < 0) {
+        // Element may be in subtree.
+        // Continue with the left child, if it is there.
+        int leftChildPosition = position * 2;
+        if (leftChildPosition <= _length) {
+          position = leftChildPosition;
+          continue;
+        }
+      }
+      // Find the next right sibling or right ancestor sibling.
+      do {
+        while (position.isOdd) {
+          // While position is a right child, go to the parent.
+          position >>= 1;
+        }
+        // Then go to the right sibling of the left-child.
+        position += 1;
+      } while (position > _length);  // Happens if last element is a left child.
+    } while (position != 1);  // At root again. Happens for right-most element.
+    return -1;
+  }
+
+  E _removeLast() {
+    int newLength = _length - 1;
+    E last = _queue[newLength];
+    _queue[newLength] = null;
+    _length = newLength;
+    return last;
+  }
+
+  /**
+   * Place [element] in heap at [index] or above.
+   *
+   * Put element into the empty cell at `index`.
+   * While the `element` has higher priority than the
+   * parent, swap it with the parent.
+   */
+  void _bubbleUp(E element, int index) {
+    while (index > 0) {
+      int parentIndex = (index - 1) ~/ 2;
+      E parent = _queue[parentIndex];
+      if (comparison(element, parent) > 0) break;
+      _queue[index] = parent;
+      index = parentIndex;
+    }
+    _queue[index] = element;
+  }
+
+  /**
+   * Place [element] in heap at [index] or above.
+   *
+   * Put element into the empty cell at `index`.
+   * While the `element` has lower priority than either child,
+   * swap it with the highest priority child.
+   */
+  void _bubbleDown(E element, int index) {
+    int rightChildIndex = index * 2 + 2;
+    while (rightChildIndex < _length) {
+      int leftChildIndex = rightChildIndex - 1;
+      E leftChild = _queue[leftChildIndex];
+      E rightChild = _queue[rightChildIndex];
+      int comp = comparison(leftChild, rightChild);
+      int minChildIndex;
+      E minChild;
+      if (comp < 0) {
+        minChild = leftChild;
+        minChildIndex = leftChildIndex;
+      } else {
+        minChild = rightChild;
+        minChildIndex = rightChildIndex;
+      }
+      comp = comparison(element, minChild);
+      if (comp <= 0) {
+        _queue[index] = element;
+        return;
+      }
+      _queue[index] = minChild;
+      index = minChildIndex;
+      rightChildIndex = index * 2 + 2;
+    }
+    int leftChildIndex = rightChildIndex - 1;
+    if (leftChildIndex < _length) {
+      E child = _queue[leftChildIndex];
+      int comp = comparison(element, child);
+      if (comp > 0) {
+        _queue[index] = child;
+        index = leftChildIndex;
+      }
+    }
+    _queue[index] = element;
+  }
+
+  /**
+   * Grows the capacity of the list holding the heap.
+   *
+   * Called when the list is full.
+   */
+  void _grow() {
+    int newCapacity = _queue.length * 2 + 1;
+    if (newCapacity < _INITIAL_CAPACITY) newCapacity = _INITIAL_CAPACITY;
+    List<E> newQueue = new List<E>(newCapacity);
+    newQueue.setRange(0, _length, _queue);
+    _queue = newQueue;
+  }
+}
diff --git a/mojo/public/dart/third_party/collection/lib/src/canonicalized_map.dart b/mojo/public/dart/third_party/collection/lib/src/canonicalized_map.dart
new file mode 100644
index 0000000..7ee3f86
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/lib/src/canonicalized_map.dart
@@ -0,0 +1,115 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart.pkg.collection.canonicalized_map;
+
+import 'dart:collection';
+
+import 'utils.dart';
+
+/**
+ * A map whose keys are converted to canonical values of type `C`.
+ *
+ * This is useful for using case-insensitive String keys, for example. It's more
+ * efficient than a [LinkedHashMap] with a custom equality operator because it
+ * only canonicalizes each key once, rather than doing so for each comparison.
+ *
+ * By default, `null` is allowed as a key. It can be forbidden via the
+ * `isValidKey` parameter.
+ */
+class CanonicalizedMap<C, K, V> implements Map<K, V> {
+  final Function _canonicalize;
+
+  final Function _isValidKeyFn;
+
+  final _base = new Map<C, Pair<K, V>>();
+
+  /**
+   * Creates an empty canonicalized map.
+   *
+   * The [canonicalize] function should return the canonical value for the given
+   * key. Keys with the same canonical value are considered equivalent.
+   *
+   * The [isValidKey] function is called before calling [canonicalize] for
+   * methods that take arbitrary objects. It can be used to filter out keys that
+   * can't be canonicalized.
+   */
+  CanonicalizedMap(C canonicalize(K key), {bool isValidKey(Object key)})
+      : _canonicalize = canonicalize,
+        _isValidKeyFn = isValidKey;
+
+  /**
+   * Creates a canonicalized map that is initialized with the key/value pairs of
+   * [other].
+   *
+   * The [canonicalize] function should return the canonical value for the given
+   * key. Keys with the same canonical value are considered equivalent.
+   *
+   * The [isValidKey] function is called before calling [canonicalize] for
+   * methods that take arbitrary objects. It can be used to filter out keys that
+   * can't be canonicalized.
+   */
+  CanonicalizedMap.from(Map<K, V> other, C canonicalize(K key),
+                        {bool isValidKey(Object key)})
+      : _canonicalize = canonicalize,
+        _isValidKeyFn = isValidKey {
+    addAll(other);
+  }
+
+  V operator [](Object key) {
+    if (!_isValidKey(key)) return null;
+    var pair = _base[_canonicalize(key)];
+    return pair == null ? null : pair.last;
+  }
+
+  void operator []=(K key, V value) {
+    _base[_canonicalize(key)] = new Pair(key, value);
+  }
+
+  void addAll(Map<K, V> other) {
+    other.forEach((key, value) => this[key] = value);
+  }
+
+  void clear() {
+    _base.clear();
+  }
+
+  bool containsKey(Object key) {
+    if (!_isValidKey(key)) return false;
+    return _base.containsKey(_canonicalize(key));
+  }
+
+  bool containsValue(Object value) =>
+      _base.values.any((pair) => pair.last == value);
+
+  void forEach(void f(K key, V value)) {
+    _base.forEach((key, pair) => f(pair.first, pair.last));
+  }
+
+  bool get isEmpty => _base.isEmpty;
+
+  bool get isNotEmpty => _base.isNotEmpty;
+
+  Iterable<K> get keys => _base.values.map((pair) => pair.first);
+
+  int get length => _base.length;
+
+  V putIfAbsent(K key, V ifAbsent()) {
+    return _base.putIfAbsent(_canonicalize(key),
+        () => new Pair(key, ifAbsent())).last;
+  }
+
+  V remove(Object key) {
+    if (!_isValidKey(key)) return null;
+    var pair = _base.remove(_canonicalize(key));
+    return pair == null ? null : pair.last;
+  }
+
+  Iterable<V> get values => _base.values.map((pair) => pair.last);
+
+  String toString() => Maps.mapToString(this);
+
+  bool _isValidKey(Object key) => (key == null || key is K) &&
+      (_isValidKeyFn == null || _isValidKeyFn(key));
+}
diff --git a/mojo/public/dart/third_party/collection/lib/src/queue_list.dart b/mojo/public/dart/third_party/collection/lib/src/queue_list.dart
new file mode 100644
index 0000000..0ef888f
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/lib/src/queue_list.dart
@@ -0,0 +1,231 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection';
+
+/**
+ * A class that efficiently implements both [Queue] and [List].
+ */
+// TODO(nweiz): Currently this code is copied almost verbatim from
+// dart:collection. The only changes are to implement List and to remove methods
+// that are redundant with ListMixin. Remove or simplify it when issue 21330 is
+// fixed.
+class QueueList<E> extends Object with ListMixin<E> implements Queue<E> {
+  static const int _INITIAL_CAPACITY = 8;
+  List<E> _table;
+  int _head;
+  int _tail;
+
+  /**
+   * Create an empty queue.
+   *
+   * If [initialCapacity] is given, prepare the queue for at least that many
+   * elements.
+   */
+  QueueList([int initialCapacity]) : _head = 0, _tail = 0 {
+    if (initialCapacity == null || initialCapacity < _INITIAL_CAPACITY) {
+      initialCapacity = _INITIAL_CAPACITY;
+    } else if (!_isPowerOf2(initialCapacity)) {
+      initialCapacity = _nextPowerOf2(initialCapacity);
+    }
+    assert(_isPowerOf2(initialCapacity));
+    _table = new List<E>(initialCapacity);
+  }
+
+  /**
+   * Create a queue initially containing the elements of [source].
+   */
+  factory QueueList.from(Iterable<E> source) {
+    if (source is List) {
+      int length = source.length;
+      QueueList<E> queue = new QueueList(length + 1);
+      assert(queue._table.length > length);
+      List sourceList = source;
+      queue._table.setRange(0, length, sourceList, 0);
+      queue._tail = length;
+      return queue;
+    } else {
+      return new QueueList<E>()..addAll(source);
+    }
+  }
+
+  // Collection interface.
+
+  void add(E element) {
+    _add(element);
+  }
+
+  void addAll(Iterable<E> elements) {
+    if (elements is List) {
+      List list = elements;
+      int addCount = list.length;
+      int length = this.length;
+      if (length + addCount >= _table.length) {
+        _preGrow(length + addCount);
+        // After preGrow, all elements are at the start of the list.
+        _table.setRange(length, length + addCount, list, 0);
+        _tail += addCount;
+      } else {
+        // Adding addCount elements won't reach _head.
+        int endSpace = _table.length - _tail;
+        if (addCount < endSpace) {
+          _table.setRange(_tail, _tail + addCount, list, 0);
+          _tail += addCount;
+        } else {
+          int preSpace = addCount - endSpace;
+          _table.setRange(_tail, _tail + endSpace, list, 0);
+          _table.setRange(0, preSpace, list, endSpace);
+          _tail = preSpace;
+        }
+      }
+    } else {
+      for (E element in elements) _add(element);
+    }
+  }
+
+  String toString() => IterableBase.iterableToFullString(this, "{", "}");
+
+  // Queue interface.
+
+  void addLast(E element) { _add(element); }
+
+  void addFirst(E element) {
+    _head = (_head - 1) & (_table.length - 1);
+    _table[_head] = element;
+    if (_head == _tail) _grow();
+  }
+
+  E removeFirst() {
+    if (_head == _tail) throw new StateError("No element");
+    E result = _table[_head];
+    _table[_head] = null;
+    _head = (_head + 1) & (_table.length - 1);
+    return result;
+  }
+
+  E removeLast() {
+    if (_head == _tail) throw new StateError("No element");
+    _tail = (_tail - 1) & (_table.length - 1);
+    E result = _table[_tail];
+    _table[_tail] = null;
+    return result;
+  }
+
+  // List interface.
+
+  int get length => (_tail - _head) & (_table.length - 1);
+
+  void set length(int value) {
+    if (value < 0) throw new RangeError("Length $value may not be negative.");
+
+    int delta = value - length;
+    if (delta >= 0) {
+      if (_table.length <= value) {
+        _preGrow(value);
+      }
+      _tail = (_tail + delta) & (_table.length - 1);
+      return;
+    }
+
+    int newTail = _tail + delta; // [delta] is negative.
+    if (newTail >= 0) {
+      _table.fillRange(newTail, _tail, null);
+    } else { 
+      newTail += _table.length;
+      _table.fillRange(0, _tail, null);
+      _table.fillRange(newTail, _table.length, null);
+    }
+    _tail = newTail;
+  }
+
+  E operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError("Index $index must be in the range [0..$length).");
+    }
+
+    return _table[(_head + index) & (_table.length - 1)];
+  }
+
+  void operator[]=(int index, E value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError("Index $index must be in the range [0..$length).");
+    }
+
+    _table[(_head + index) & (_table.length - 1)] = value;
+  }
+
+  // Internal helper functions.
+
+  /**
+   * Whether [number] is a power of two.
+   *
+   * Only works for positive numbers.
+   */
+  static bool _isPowerOf2(int number) => (number & (number - 1)) == 0;
+
+  /**
+   * Rounds [number] up to the nearest power of 2.
+   *
+   * If [number] is a power of 2 already, it is returned.
+   *
+   * Only works for positive numbers.
+   */
+  static int _nextPowerOf2(int number) {
+    assert(number > 0);
+    number = (number << 1) - 1;
+    for(;;) {
+      int nextNumber = number & (number - 1);
+      if (nextNumber == 0) return number;
+      number = nextNumber;
+    }
+  }
+
+  /** Adds element at end of queue. Used by both [add] and [addAll]. */
+  void _add(E element) {
+    _table[_tail] = element;
+    _tail = (_tail + 1) & (_table.length - 1);
+    if (_head == _tail) _grow();
+  }
+
+  /**
+   * Grow the table when full.
+   */
+  void _grow() {
+    List<E> newTable = new List<E>(_table.length * 2);
+    int split = _table.length - _head;
+    newTable.setRange(0, split, _table, _head);
+    newTable.setRange(split, split + _head, _table, 0);
+    _head = 0;
+    _tail = _table.length;
+    _table = newTable;
+  }
+
+  int _writeToList(List<E> target) {
+    assert(target.length >= length);
+    if (_head <= _tail) {
+      int length = _tail - _head;
+      target.setRange(0, length, _table, _head);
+      return length;
+    } else {
+      int firstPartSize = _table.length - _head;
+      target.setRange(0, firstPartSize, _table, _head);
+      target.setRange(firstPartSize, firstPartSize + _tail, _table, 0);
+      return _tail + firstPartSize;
+    }
+  }
+
+  /** Grows the table even if it is not full. */
+  void _preGrow(int newElementCount) {
+    assert(newElementCount >= length);
+
+    // Add 1.5x extra room to ensure that there's room for more elements after
+    // expansion.
+    newElementCount += newElementCount >> 1;
+    int newCapacity = _nextPowerOf2(newElementCount);
+    List<E> newTable = new List<E>(newCapacity);
+    _tail = _writeToList(newTable);
+    _table = newTable;
+    _head = 0;
+  }
+}
diff --git a/mojo/public/dart/third_party/collection/lib/src/unmodifiable_wrappers.dart b/mojo/public/dart/third_party/collection/lib/src/unmodifiable_wrappers.dart
new file mode 100644
index 0000000..7f7d901
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/lib/src/unmodifiable_wrappers.dart
@@ -0,0 +1,237 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Wrappers that prevent a List, Set, or Map object from being modified.
+ *
+ * The [Set] and [Map] wrappers allow reading from the wrapped collection,
+ * but prohibit writing.
+ *
+ * The [List] wrapper prevents changes to the length of the wrapped list,
+ * but allows changes to the contents.
+ */
+library collection.unmodifiable_wrappers;
+
+import '../wrappers.dart';
+
+export "dart:collection" show UnmodifiableListView, UnmodifiableMapView;
+
+/**
+ * A fixed-length list.
+ *
+ * A `NonGrowableListView` contains a [List] object and ensures that
+ * its length does not change.
+ * Methods that would change the length of the list,
+ * such as [add] and [remove], throw an [UnsupportedError].
+ * All other methods work directly on the underlying list.
+ *
+ * This class _does_ allow changes to the contents of the wrapped list.
+ * You can, for example, [sort] the list.
+ * Permitted operations defer to the wrapped list.
+ */
+class NonGrowableListView<E> extends DelegatingList<E>
+                             with NonGrowableListMixin<E> {
+  NonGrowableListView(List<E> listBase) : super(listBase);
+}
+
+/**
+ * Mixin class that implements a throwing version of all list operations that
+ * change the List's length.
+ */
+abstract class NonGrowableListMixin<E> implements List<E> {
+  static _throw() {
+    throw new UnsupportedError(
+        "Cannot change the length of a fixed-length list");
+  }
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  void set length(int newLength) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  bool add(E value) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  void addAll(Iterable<E> iterable) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  void insert(int index, E element) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  void insertAll(int index, Iterable<E> iterable) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  bool remove(Object value) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  E removeAt(int index) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  E removeLast() => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  void removeWhere(bool test(E element)) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  void retainWhere(bool test(E element)) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  void removeRange(int start, int end) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  void replaceRange(int start, int end, Iterable<E> iterable) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the length of the list are disallowed.
+   */
+  void clear() => _throw();
+}
+
+/**
+ * An unmodifiable set.
+ *
+ * An UnmodifiableSetView contains a [Set] object and ensures
+ * that it does not change.
+ * Methods that would change the set,
+ * such as [add] and [remove], throw an [UnsupportedError].
+ * Permitted operations defer to the wrapped set.
+ */
+class UnmodifiableSetView<E> extends DelegatingSet<E>
+                             with UnmodifiableSetMixin<E> {
+  UnmodifiableSetView(Set<E> setBase) : super(setBase);
+}
+
+/**
+ * Mixin class that implements a throwing version of all set operations that
+ * change the Set.
+ */
+abstract class UnmodifiableSetMixin<E> implements Set<E> {
+  _throw() {
+    throw new UnsupportedError("Cannot modify an unmodifiable Set");
+  }
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the set are disallowed.
+   */
+  bool add(E value) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the set are disallowed.
+   */
+  void addAll(Iterable<E> elements) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the set are disallowed.
+   */
+  bool remove(Object value) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the set are disallowed.
+   */
+  void removeAll(Iterable elements) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the set are disallowed.
+   */
+  void retainAll(Iterable elements) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the set are disallowed.
+   */
+  void removeWhere(bool test(E element)) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the set are disallowed.
+   */
+  void retainWhere(bool test(E element)) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the set are disallowed.
+   */
+  void clear() => _throw();
+}
+
+/**
+ * Mixin class that implements a throwing version of all map operations that
+ * change the Map.
+ */
+abstract class UnmodifiableMapMixin<K, V> implements Map<K, V> {
+  static _throw() {
+    throw new UnsupportedError("Cannot modify an unmodifiable Map");
+  }
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the map are disallowed.
+   */
+  void operator []=(K key, V value) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the map are disallowed.
+   */
+  V putIfAbsent(K key, V ifAbsent()) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the map are disallowed.
+   */
+  void addAll(Map<K, V> other) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the map are disallowed.
+   */
+  V remove(K key) => _throw();
+
+  /**
+   * Throws an [UnsupportedError];
+   * operations that change the map are disallowed.
+   */
+  void clear() => _throw();
+}
diff --git a/mojo/public/dart/third_party/collection/lib/src/utils.dart b/mojo/public/dart/third_party/collection/lib/src/utils.dart
new file mode 100644
index 0000000..c9c7537
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/lib/src/utils.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart.pkg.collection.utils;
+
+/// A pair of values.
+class Pair<E, F> {
+  E first;
+  F last;
+
+  Pair(this.first, this.last);
+}
diff --git a/mojo/public/dart/third_party/collection/lib/wrappers.dart b/mojo/public/dart/third_party/collection/lib/wrappers.dart
new file mode 100644
index 0000000..34f812c
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/lib/wrappers.dart
@@ -0,0 +1,570 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Delegating wrappers for [Iterable], [List], [Set], [Queue] and [Map].
+ *
+ * Also adds unmodifiable views for `Set` and `Map`, and a fixed length
+ * view for `List`. The unmodifable list view from `dart:collection` is exported
+ * as well, just for completeness.
+ */
+library dart.pkg.collection.wrappers;
+
+import "dart:collection";
+import "dart:math" show Random;
+
+import "src/unmodifiable_wrappers.dart";
+
+export "src/canonicalized_map.dart";
+export "src/unmodifiable_wrappers.dart";
+
+/**
+ * A base class for delegating iterables.
+ *
+ * Subclasses can provide a [_base] that should be delegated to. Unlike
+ * [DelegatingIterable], this allows the base to be created on demand.
+ */
+abstract class _DelegatingIterableBase<E> implements Iterable<E> {
+  Iterable<E> get _base;
+
+  const _DelegatingIterableBase();
+
+  bool any(bool test(E element)) => _base.any(test);
+
+  bool contains(Object element) => _base.contains(element);
+
+  E elementAt(int index) => _base.elementAt(index);
+
+  bool every(bool test(E element)) => _base.every(test);
+
+  Iterable expand(Iterable f(E element)) => _base.expand(f);
+
+  E get first => _base.first;
+
+  E firstWhere(bool test(E element), {E orElse()}) =>
+      _base.firstWhere(test, orElse: orElse);
+
+  fold(initialValue, combine(previousValue, E element)) =>
+      _base.fold(initialValue, combine);
+
+  void forEach(void f(E element)) => _base.forEach(f);
+
+  bool get isEmpty => _base.isEmpty;
+
+  bool get isNotEmpty => _base.isNotEmpty;
+
+  Iterator<E> get iterator => _base.iterator;
+
+  String join([String separator = ""]) => _base.join(separator);
+
+  E get last => _base.last;
+
+  E lastWhere(bool test(E element), {E orElse()}) =>
+      _base.lastWhere(test, orElse: orElse);
+
+  int get length => _base.length;
+
+  Iterable map(f(E element)) => _base.map(f);
+
+  E reduce(E combine(E value, E element)) => _base.reduce(combine);
+
+  E get single => _base.single;
+
+  E singleWhere(bool test(E element)) => _base.singleWhere(test);
+
+  Iterable<E> skip(int n) => _base.skip(n);
+
+  Iterable<E> skipWhile(bool test(E value)) => _base.skipWhile(test);
+
+  Iterable<E> take(int n) => _base.take(n);
+
+  Iterable<E> takeWhile(bool test(E value)) => _base.takeWhile(test);
+
+  List<E> toList({bool growable: true}) => _base.toList(growable: growable);
+
+  Set<E> toSet() => _base.toSet();
+
+  Iterable<E> where(bool test(E element)) => _base.where(test);
+
+  String toString() => _base.toString();
+}
+
+/**
+ * Creates an [Iterable] that delegates all operations to a base iterable.
+ *
+ * This class can be used hide non-`Iterable` methods of an iterable object,
+ * or it can be extended to add extra functionality on top of an existing
+ * iterable object.
+ */
+class DelegatingIterable<E> extends _DelegatingIterableBase<E> {
+  final Iterable<E> _base;
+
+  /**
+   * Create a wrapper that forwards operations to [base].
+   */
+  const DelegatingIterable(Iterable<E> base) : _base = base;
+}
+
+
+/**
+ * Creates a [List] that delegates all operations to a base list.
+ *
+ * This class can be used hide non-`List` methods of a list object,
+ * or it can be extended to add extra functionality on top of an existing
+ * list object.
+ */
+class DelegatingList<E> extends DelegatingIterable<E> implements List<E> {
+  const DelegatingList(List<E> base) : super(base);
+
+  List<E> get _listBase => _base;
+
+  E operator [](int index) => _listBase[index];
+
+  void operator []=(int index, E value) {
+    _listBase[index] = value;
+  }
+
+  void add(E value) {
+    _listBase.add(value);
+  }
+
+  void addAll(Iterable<E> iterable) {
+    _listBase.addAll(iterable);
+  }
+
+  Map<int, E> asMap() => _listBase.asMap();
+
+  void clear() {
+    _listBase.clear();
+  }
+
+  void fillRange(int start, int end, [E fillValue]) {
+    _listBase.fillRange(start, end, fillValue);
+  }
+
+  Iterable<E> getRange(int start, int end) => _listBase.getRange(start, end);
+
+  int indexOf(E element, [int start = 0]) => _listBase.indexOf(element, start);
+
+  void insert(int index, E element) {
+    _listBase.insert(index, element);
+  }
+
+  void insertAll(int index, Iterable<E> iterable) {
+    _listBase.insertAll(index, iterable);
+  }
+
+  int lastIndexOf(E element, [int start]) =>
+      _listBase.lastIndexOf(element, start);
+
+  void set length(int newLength) {
+    _listBase.length = newLength;
+  }
+
+  bool remove(Object value) => _listBase.remove(value);
+
+  E removeAt(int index) => _listBase.removeAt(index);
+
+  E removeLast() => _listBase.removeLast();
+
+  void removeRange(int start, int end) {
+    _listBase.removeRange(start, end);
+  }
+
+  void removeWhere(bool test(E element)) {
+    _listBase.removeWhere(test);
+  }
+
+  void replaceRange(int start, int end, Iterable<E> iterable) {
+    _listBase.replaceRange(start, end, iterable);
+  }
+
+  void retainWhere(bool test(E element)) {
+    _listBase.retainWhere(test);
+  }
+
+  Iterable<E> get reversed => _listBase.reversed;
+
+  void setAll(int index, Iterable<E> iterable) {
+    _listBase.setAll(index, iterable);
+  }
+
+  void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
+    _listBase.setRange(start, end, iterable, skipCount);
+  }
+
+  void shuffle([Random random]) {
+    _listBase.shuffle(random);
+  }
+
+  void sort([int compare(E a, E b)]) {
+    _listBase.sort(compare);
+  }
+
+  List<E> sublist(int start, [int end]) => _listBase.sublist(start, end);
+}
+
+
+/**
+ * Creates a [Set] that delegates all operations to a base set.
+ *
+ * This class can be used hide non-`Set` methods of a set object,
+ * or it can be extended to add extra functionality on top of an existing
+ * set object.
+ */
+class DelegatingSet<E> extends DelegatingIterable<E> implements Set<E> {
+  const DelegatingSet(Set<E> base) : super(base);
+
+  Set<E> get _setBase => _base;
+
+  bool add(E value) => _setBase.add(value);
+
+  void addAll(Iterable<E> elements) {
+    _setBase.addAll(elements);
+  }
+
+  void clear() {
+    _setBase.clear();
+  }
+
+  bool containsAll(Iterable<Object> other) => _setBase.containsAll(other);
+
+  Set<E> difference(Set<E> other) => _setBase.difference(other);
+
+  Set<E> intersection(Set<Object> other) => _setBase.intersection(other);
+
+  E lookup(E element) => _setBase.lookup(element);
+
+  bool remove(Object value) => _setBase.remove(value);
+
+  void removeAll(Iterable<Object> elements) {
+    _setBase.removeAll(elements);
+  }
+
+  void removeWhere(bool test(E element)) {
+    _setBase.removeWhere(test);
+  }
+
+  void retainAll(Iterable<Object> elements) {
+    _setBase.retainAll(elements);
+  }
+
+  void retainWhere(bool test(E element)) {
+    _setBase.retainWhere(test);
+  }
+
+  Set<E> union(Set<E> other) => _setBase.union(other);
+
+  Set<E> toSet() => new DelegatingSet<E>(_setBase.toSet());
+}
+
+/**
+ * Creates a [Queue] that delegates all operations to a base queue.
+ *
+ * This class can be used hide non-`Queue` methods of a queue object,
+ * or it can be extended to add extra functionality on top of an existing
+ * queue object.
+ */
+class DelegatingQueue<E> extends DelegatingIterable<E> implements Queue<E> {
+  const DelegatingQueue(Queue<E> queue) : super(queue);
+
+  Queue<E> get _baseQueue => _base;
+
+  void add(E value) {
+    _baseQueue.add(value);
+  }
+
+  void addAll(Iterable<E> iterable) {
+    _baseQueue.addAll(iterable);
+  }
+
+  void addFirst(E value) {
+    _baseQueue.addFirst(value);
+  }
+
+  void addLast(E value) {
+    _baseQueue.addLast(value);
+  }
+
+  void clear() {
+    _baseQueue.clear();
+  }
+
+  bool remove(Object object) => _baseQueue.remove(object);
+
+  void removeWhere(bool test(E element)) { _baseQueue.removeWhere(test); }
+
+  void retainWhere(bool test(E element)) { _baseQueue.retainWhere(test); }
+
+  E removeFirst() => _baseQueue.removeFirst();
+
+  E removeLast() => _baseQueue.removeLast();
+}
+
+/**
+ * Creates a [Map] that delegates all operations to a base map.
+ *
+ * This class can be used hide non-`Map` methods of an object that extends
+ * `Map`, or it can be extended to add extra functionality on top of an existing
+ * map object.
+ */
+class DelegatingMap<K, V> implements Map<K, V> {
+  final Map<K, V> _base;
+
+  const DelegatingMap(Map<K, V> base) : _base = base;
+
+  V operator [](Object key) => _base[key];
+
+  void operator []=(K key, V value) {
+    _base[key] = value;
+  }
+
+  void addAll(Map<K, V> other) {
+    _base.addAll(other);
+  }
+
+  void clear() {
+    _base.clear();
+  }
+
+  bool containsKey(Object key) => _base.containsKey(key);
+
+  bool containsValue(Object value) => _base.containsValue(value);
+
+  void forEach(void f(K key, V value)) {
+    _base.forEach(f);
+  }
+
+  bool get isEmpty => _base.isEmpty;
+
+  bool get isNotEmpty => _base.isNotEmpty;
+
+  Iterable<K> get keys => _base.keys;
+
+  int get length => _base.length;
+
+  V putIfAbsent(K key, V ifAbsent()) => _base.putIfAbsent(key, ifAbsent);
+
+  V remove(Object key) => _base.remove(key);
+
+  Iterable<V> get values => _base.values;
+
+  String toString() => _base.toString();
+}
+
+/**
+ * An unmodifiable [Set] view of the keys of a [Map].
+ *
+ * The set delegates all operations to the underlying map.
+ *
+ * A `Map` can only contain each key once, so its keys can always
+ * be viewed as a `Set` without any loss, even if the [Map.keys]
+ * getter only shows an [Iterable] view of the keys.
+ *
+ * Note that [lookup] is not supported for this set.
+ */
+class MapKeySet<E> extends _DelegatingIterableBase<E>
+    with UnmodifiableSetMixin<E> {
+  final Map<E, dynamic> _baseMap;
+
+  MapKeySet(Map<E, dynamic> base) : _baseMap = base;
+
+  Iterable<E> get _base => _baseMap.keys;
+
+  bool contains(Object element) => _baseMap.containsKey(element);
+
+  bool get isEmpty => _baseMap.isEmpty;
+
+  bool get isNotEmpty => _baseMap.isNotEmpty;
+
+  int get length => _baseMap.length;
+
+  String toString() => "{${_base.join(', ')}}";
+
+  bool containsAll(Iterable<Object> other) => other.every(contains);
+
+  /**
+   * Returns a new set with the the elements of [this] that are not in [other].
+   *
+   * That is, the returned set contains all the elements of this [Set] that are
+   * not elements of [other] according to `other.contains`.
+   *
+   * Note that the returned set will use the default equality operation, which
+   * may be different than the equality operation [this] uses.
+   */
+  Set<E> difference(Set<E> other) =>
+      where((element) => !other.contains(element)).toSet();
+
+  /**
+   * Returns a new set which is the intersection between [this] and [other].
+   *
+   * That is, the returned set contains all the elements of this [Set] that are
+   * also elements of [other] according to `other.contains`.
+   *
+   * Note that the returned set will use the default equality operation, which
+   * may be different than the equality operation [this] uses.
+   */
+  Set<E> intersection(Set<Object> other) => where(other.contains).toSet();
+
+  /**
+   * Throws an [UnsupportedError] since there's no corresponding method for
+   * [Map]s.
+   */
+  E lookup(E element) => throw new UnsupportedError(
+      "MapKeySet doesn't support lookup().");
+
+  /**
+   * Returns a new set which contains all the elements of [this] and [other].
+   *
+   * That is, the returned set contains all the elements of this [Set] and all
+   * the elements of [other].
+   *
+   * Note that the returned set will use the default equality operation, which
+   * may be different than the equality operation [this] uses.
+   */
+  Set<E> union(Set<E> other) => toSet()..addAll(other);
+}
+
+/**
+ * Creates a modifiable [Set] view of the values of a [Map].
+ * 
+ * The `Set` view assumes that the keys of the `Map` can be uniquely determined
+ * from the values. The `keyForValue` function passed to the constructor finds
+ * the key for a single value. The `keyForValue` function should be consistent
+ * with equality. If `value1 == value2` then `keyForValue(value1)` and
+ * `keyForValue(value2)` should be considered equal keys by the underlying map,
+ * and vice versa.
+ *
+ * Modifying the set will modify the underlying map based on the key returned by
+ * `keyForValue`.
+ *
+ * If the `Map` contents are not compatible with the `keyForValue` function, the
+ * set will not work consistently, and may give meaningless responses or do
+ * inconsistent updates.
+ *
+ * This set can, for example, be used on a map from database record IDs to the
+ * records. It exposes the records as a set, and allows for writing both
+ * `recordSet.add(databaseRecord)` and `recordMap[id]`.
+ *
+ * Effectively, the map will act as a kind of index for the set.
+ */
+class MapValueSet<K, V> extends _DelegatingIterableBase<V> implements Set<V> {
+  final Map<K, V> _baseMap;
+  final Function _keyForValue;
+
+  /**
+   * Creates a new [MapValueSet] based on [base].
+   *
+   * [keyForValue] returns the key in the map that should be associated with the
+   * given value. The set's notion of equality is identical to the equality of
+   * the return values of [keyForValue].
+   */
+  MapValueSet(Map<K, V> base, K keyForValue(V value))
+      : _baseMap = base,
+        _keyForValue = keyForValue;
+
+  Iterable<V> get _base => _baseMap.values;
+
+  bool contains(Object element) {
+    if (element != null && element is! V) return false;
+    return _baseMap.containsKey(_keyForValue(element));
+  }
+
+  bool get isEmpty => _baseMap.isEmpty;
+
+  bool get isNotEmpty => _baseMap.isNotEmpty;
+
+  int get length => _baseMap.length;
+
+  String toString() => toSet().toString();
+
+  bool add(V value) {
+    K key = _keyForValue(value);
+    bool result = false;
+    _baseMap.putIfAbsent(key, () {
+      result = true;
+      return value;
+    });
+    return result;
+  }
+
+  void addAll(Iterable<V> elements) => elements.forEach(add);
+
+  void clear() => _baseMap.clear();
+
+  bool containsAll(Iterable<Object> other) => other.every(contains);
+
+  /**
+   * Returns a new set with the the elements of [this] that are not in [other].
+   *
+   * That is, the returned set contains all the elements of this [Set] that are
+   * not elements of [other] according to `other.contains`.
+   *
+   * Note that the returned set will use the default equality operation, which
+   * may be different than the equality operation [this] uses.
+   */
+  Set<V> difference(Set<V> other) =>
+      where((element) => !other.contains(element)).toSet();
+
+  /**
+   * Returns a new set which is the intersection between [this] and [other].
+   *
+   * That is, the returned set contains all the elements of this [Set] that are
+   * also elements of [other] according to `other.contains`.
+   *
+   * Note that the returned set will use the default equality operation, which
+   * may be different than the equality operation [this] uses.
+   */
+  Set<V> intersection(Set<Object> other) => where(other.contains).toSet();
+
+  V lookup(V element) => _baseMap[_keyForValue(element)];
+
+  bool remove(Object value) {
+    if (value != null && value is! V) return false;
+    var key = _keyForValue(value);
+    if (!_baseMap.containsKey(key)) return false;
+    _baseMap.remove(key);
+    return true;
+  }
+
+  void removeAll(Iterable<Object> elements) => elements.forEach(remove);
+
+  void removeWhere(bool test(V element)) {
+    var toRemove = [];
+    _baseMap.forEach((key, value) {
+      if (test(value)) toRemove.add(key);
+    });
+    toRemove.forEach(_baseMap.remove);
+  }
+
+  void retainAll(Iterable<Object> elements) {
+    var valuesToRetain = new Set<V>.identity();
+    for (var element in elements) {
+      if (element != null && element is! V) continue;
+      var key = _keyForValue(element);
+      if (!_baseMap.containsKey(key)) continue;
+      valuesToRetain.add(_baseMap[key]);
+    }
+
+    var keysToRemove = [];
+    _baseMap.forEach((k, v) {
+      if (!valuesToRetain.contains(v)) keysToRemove.add(k);
+    });
+    keysToRemove.forEach(_baseMap.remove);
+  }
+
+  void retainWhere(bool test(V element)) =>
+      removeWhere((element) => !test(element));
+
+  /**
+   * Returns a new set which contains all the elements of [this] and [other].
+   *
+   * That is, the returned set contains all the elements of this [Set] and all
+   * the elements of [other].
+   *
+   * Note that the returned set will use the default equality operation, which
+   * may be different than the equality operation [this] uses.
+   */
+  Set<V> union(Set<V> other) => toSet()..addAll(other);
+}
diff --git a/mojo/public/dart/third_party/collection/pubspec.yaml b/mojo/public/dart/third_party/collection/pubspec.yaml
new file mode 100644
index 0000000..1517353
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/pubspec.yaml
@@ -0,0 +1,9 @@
+name: collection
+version: 1.1.2
+author: Dart Team <misc@dartlang.org>
+description: Collections and utilities functions and classes related to collections.
+homepage: https://www.github.com/dart-lang/collection
+environment:
+  sdk: '>=1.5.0 <2.0.0'
+dev_dependencies:
+  test: '^0.12.0'
diff --git a/mojo/public/dart/third_party/collection/test/algorithms_test.dart b/mojo/public/dart/third_party/collection/test/algorithms_test.dart
new file mode 100644
index 0000000..61fbf5b
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/test/algorithms_test.dart
@@ -0,0 +1,271 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Tests algorithm utilities.
+
+import "package:collection/collection.dart";
+import "package:test/test.dart";
+import 'dart:math';
+
+void main() {
+  void testShuffle(List list) {
+    List copy = list.toList();
+    shuffle(list);
+    expect(new UnorderedIterableEquality().equals(list, copy), isTrue);
+  }
+
+  test("Shuffle 0", () {
+    testShuffle([]);
+  });
+  test("Shuffle 1", () {
+    testShuffle([1]);
+  });
+  test("Shuffle 3", () {
+    testShuffle([1, 2, 3]);
+  });
+  test("Shuffle 10", () {
+    testShuffle([1, 2, 3, 4, 5, 1, 3, 5, 7, 9]);
+  });
+  test("Shuffle shuffles", () {
+    List l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
+    List c = l.toList();
+    int count = 0;
+    do {
+      shuffle(l);
+      if (!const ListEquality().equals(c, l)) return;
+      // Odds of not changing the order should be one in ~ 16! ~= 2e+13.
+      // Repeat this 10 times, and the odds of accidentally shuffling to the
+      // same result every time is disappearingly tiny.
+      count++;
+      // If this happens even once, it's ok to report it.
+      print("Failed shuffle $count times");
+      if (count == 10) fail("Shuffle didn't change order.");
+    } while (true);
+  });
+  test("Shuffle sublist", (){
+    List l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
+    List c = l.toList();
+    shuffle(l, 4, 12);
+    expect(const IterableEquality().equals(l.getRange(0, 4),
+                                           c.getRange(0, 4)), isTrue);
+    expect(const IterableEquality().equals(l.getRange(12, 16),
+                                           c.getRange(12, 16)), isTrue);
+    expect(const UnorderedIterableEquality().equals(l.getRange(4, 12),
+                                                    c.getRange(4, 12)),
+           isTrue);
+
+  });
+
+  test("binsearch0", () {
+    expect(binarySearch([], 2), equals(-1));
+  });
+
+  test("binsearch1", () {
+    expect(binarySearch([5], 2), equals(-1));
+    expect(binarySearch([5], 5), equals(0));
+    expect(binarySearch([5], 7), equals(-1));
+  });
+
+  test("binsearch3", () {
+    expect(binarySearch([0, 5, 10], -1), equals(-1));
+    expect(binarySearch([0, 5, 10], 0), equals(0));
+    expect(binarySearch([0, 5, 10], 2), equals(-1));
+    expect(binarySearch([0, 5, 10], 5), equals(1));
+    expect(binarySearch([0, 5, 10], 7), equals(-1));
+    expect(binarySearch([0, 5, 10], 10), equals(2));
+    expect(binarySearch([0, 5, 10], 12), equals(-1));
+  });
+
+  test("binsearchCompare0", () {
+    expect(binarySearch([], new C(2), compare: compareC), equals(-1));
+  });
+
+  test("binsearchCompare1", () {
+    var l1 = [new C(5)];
+    expect(binarySearch(l1, new C(2), compare: compareC), equals(-1));
+    expect(binarySearch(l1, new C(5), compare: compareC), equals(0));
+    expect(binarySearch(l1, new C(7), compare: compareC), equals(-1));
+  });
+
+  test("binsearchCompare3", () {
+    var l3 = [new C(0), new C(5), new C(10)];
+    expect(binarySearch(l3, new C(-1), compare: compareC), equals(-1));
+    expect(binarySearch(l3, new C(0), compare: compareC), equals(0));
+    expect(binarySearch(l3, new C(2), compare: compareC), equals(-1));
+    expect(binarySearch(l3, new C(5), compare: compareC), equals(1));
+    expect(binarySearch(l3, new C(7), compare: compareC), equals(-1));
+    expect(binarySearch(l3, new C(10), compare: compareC), equals(2));
+    expect(binarySearch(l3, new C(12), compare: compareC), equals(-1));
+  });
+
+  test("insertionSortRandom", () {
+    Random random = new Random();
+    for (int i = 0; i < 25; i++) {
+      List list = new List(i);
+      for (int j = 0; j < i; j++) {
+        list[j] = random.nextInt(25);  // Expect some equal elements.
+      }
+      insertionSort(list);
+      for (int j = 1; j < i; j++) {
+        expect(list[j - 1], lessThanOrEqualTo(list[j]));
+      }
+    }
+  });
+
+  test("insertionSortSubRanges", () {
+    List l = [6, 5, 4, 3, 2, 1];
+    insertionSort(l, start: 2, end: 4);
+    expect(l, equals([6, 5, 3, 4, 2, 1]));
+    insertionSort(l, start: 1, end: 1);
+    expect(l, equals([6, 5, 3, 4, 2, 1]));
+    insertionSort(l, start: 4, end: 6);
+    expect(l, equals([6, 5, 3, 4, 1, 2]));
+    insertionSort(l, start: 0, end: 2);
+    expect(l, equals([5, 6, 3, 4, 1, 2]));
+    insertionSort(l, start: 0, end: 6);
+    expect(l, equals([1, 2, 3, 4, 5, 6]));
+  });
+
+  test("insertionSortSpecialCases", () {
+    List l = [6, 6, 6, 6, 6, 6];
+    insertionSort(l);
+    expect(l, equals([6, 6, 6, 6, 6, 6]));
+
+    l = [6, 6, 3, 3, 0, 0];
+    insertionSort(l);
+    expect(l, equals([0, 0, 3, 3, 6, 6]));
+  });
+
+  test("MergeSortRandom", () {
+    Random random = new Random();
+    for (int i = 0; i < 250; i += 1) {
+      List list = new List(i);
+      for (int j = 0; j < i; j++) {
+        list[j] = random.nextInt(i);  // Expect some equal elements.
+      }
+      mergeSort(list);
+      for (int j = 1; j < i; j++) {
+        expect(list[j - 1], lessThanOrEqualTo(list[j]));
+      }
+    }
+  });
+
+  test("MergeSortPreservesOrder", () {
+    Random random = new Random();
+    // Small case where only insertion call is called,
+    // larger case where the internal moving insertion sort is used
+    // larger cases with multiple splittings, numbers just around a power of 2.
+    for (int size in [8, 50, 511, 512, 513]) {
+      List list = new List(size);
+      // Class OC compares using id.
+      // With size elements with id's in the range 0..size/4, a number of
+      // collisions are guaranteed. These should be sorted so that the "order"
+      // part of the objects are still in order.
+      for (int i = 0; i < size; i++) {
+        list[i] = new OC(random.nextInt(size >> 2), i);
+      }
+      mergeSort(list);
+      OC prev = list[0];
+      for (int i = 1; i < size; i++) {
+        OC next = list[i];
+        expect(prev.id, lessThanOrEqualTo(next.id));
+        if (next.id == prev.id) {
+          expect(prev.order, lessThanOrEqualTo(next.order));
+        }
+        prev = next;
+      }
+      // Reverse compare on part of list.
+      List copy = list.toList();
+      int min = size >> 2;
+      int max = size - min;
+      mergeSort(list, start: min, end: max, compare: (a, b) => b.compareTo(a));
+      prev = list[min];
+      for (int i = min + 1; i < max; i++) {
+        OC next = list[i];
+        expect(prev.id, greaterThanOrEqualTo(next.id));
+        if (next.id == prev.id) {
+          expect(prev.order, lessThanOrEqualTo(next.order));
+        }
+        prev = next;
+      }
+      // Equals on OC objects is identity, so this means the parts before min,
+      // and the parts after max, didn't change at all.
+      expect(list.sublist(0, min), equals(copy.sublist(0, min)));
+      expect(list.sublist(max), equals(copy.sublist(max)));
+    }
+  });
+
+  test("MergeSortSpecialCases", () {
+    for (int size in [511, 512, 513]) {
+      // All equal.
+      List list = new List(size);
+      for (int i = 0; i < size; i++) {
+        list[i] = new OC(0, i);
+      }
+      mergeSort(list);
+      for (int i = 0; i < size; i++) {
+        expect(list[i].order, equals(i));
+      }
+      // All but one equal, first.
+      list[0] = new OC(1, 0);
+      for (int i = 1; i < size; i++) {
+        list[i] = new OC(0, i);
+      }
+      mergeSort(list);
+      for (int i = 0; i < size - 1; i++) {
+        expect(list[i].order, equals(i + 1));
+      }
+      expect(list[size - 1].order, equals(0));
+
+      // All but one equal, last.
+      for (int i = 0; i < size - 1; i++) {
+        list[i] = new OC(0, i);
+      }
+      list[size - 1] = new OC(-1, size - 1);
+      mergeSort(list);
+      expect(list[0].order, equals(size - 1));
+      for (int i = 1; i < size; i++) {
+        expect(list[i].order, equals(i - 1));
+      }
+
+      // Reversed.
+      for (int i = 0; i < size; i++) {
+        list[i] = new OC(size - 1 - i, i);
+      }
+      mergeSort(list);
+      for (int i = 0; i < size; i++) {
+        expect(list[i].id, equals(i));
+        expect(list[i].order, equals(size - 1 - i));
+      }
+    }
+  });
+
+  test("Reverse", () {
+    List l = [6, 5, 4, 3, 2, 1];
+    reverse(l, 2, 4);
+    expect(l, equals([6, 5, 3, 4, 2, 1]));
+    reverse(l, 1, 1);
+    expect(l, equals([6, 5, 3, 4, 2, 1]));
+    reverse(l, 4, 6);
+    expect(l, equals([6, 5, 3, 4, 1, 2]));
+    reverse(l, 0, 2);
+    expect(l, equals([5, 6, 3, 4, 1, 2]));
+    reverse(l, 0, 6);
+    expect(l, equals([2, 1, 4, 3, 6, 5]));
+  });
+}
+
+class C {
+  final int id;
+  C(this.id);
+}
+int compareC(C one, C other) => one.id - other.id;
+
+class OC implements Comparable<OC> {
+  final int id;
+  final int order;
+  OC(this.id, this.order);
+  int compareTo(OC other) => id - other.id;
+  String toString() => "OC[$id,$order]";
+}
diff --git a/mojo/public/dart/third_party/collection/test/canonicalized_map_test.dart b/mojo/public/dart/third_party/collection/test/canonicalized_map_test.dart
new file mode 100644
index 0000000..f5f009b
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/test/canonicalized_map_test.dart
@@ -0,0 +1,166 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:collection/collection.dart";
+import "package:test/test.dart";
+
+void main() {
+  group("with an empty canonicalized map", () {
+    var map;
+    setUp(() {
+      map = new CanonicalizedMap<int, String, String>(int.parse,
+          isValidKey: new RegExp(r"^\d+$").hasMatch);
+    });
+
+    test("canonicalizes keys on set and get", () {
+      map["1"] = "value";
+      expect(map["01"], equals("value"));
+    });
+
+    test("get returns null for uncanonicalizable key", () {
+      expect(map["foo"], isNull);
+    });
+
+    test("canonicalizes keys for addAll", () {
+      map.addAll({
+        "1": "value 1",
+        "2": "value 2",
+        "3": "value 3"
+      });
+      expect(map["01"], equals("value 1"));
+      expect(map["02"], equals("value 2"));
+      expect(map["03"], equals("value 3"));
+    });
+
+    test("uses the final value for addAll collisions", () {
+      map.addAll({
+        "1": "value 1",
+        "01": "value 2",
+        "001": "value 3"
+      });
+      expect(map.length, equals(1));
+      expect(map["0001"], equals("value 3"));
+    });
+
+    test("clear clears the map", () {
+      map.addAll({
+        "1": "value 1",
+        "2": "value 2",
+        "3": "value 3"
+      });
+      expect(map, isNot(isEmpty));
+      map.clear();
+      expect(map, isEmpty);
+    });
+
+    test("canonicalizes keys for containsKey", () {
+      map["1"] = "value";
+      expect(map.containsKey("01"), isTrue);
+      expect(map.containsKey("2"), isFalse);
+    });
+
+    test("containsKey returns false for uncanonicalizable key", () {
+      expect(map.containsKey("foo"), isFalse);
+    });
+
+    test("canonicalizes keys for putIfAbsent", () {
+      map["1"] = "value";
+      expect(map.putIfAbsent("01", () => throw "shouldn't run"),
+             equals("value"));
+      expect(map.putIfAbsent("2", () => "new value"), equals("new value"));
+    });
+
+    test("canonicalizes keys for remove", () {
+      map["1"] = "value";
+      expect(map.remove("2"), isNull);
+      expect(map.remove("01"), equals("value"));
+      expect(map, isEmpty);
+    });
+
+    test("remove returns null for uncanonicalizable key", () {
+      expect(map.remove("foo"), isNull);
+    });
+
+    test("containsValue returns whether a value is in the map", () {
+      map["1"] = "value";
+      expect(map.containsValue("value"), isTrue);
+      expect(map.containsValue("not value"), isFalse);
+    });
+
+    test("isEmpty returns whether the map is empty", () {
+      expect(map.isEmpty, isTrue);
+      map["1"] = "value";
+      expect(map.isEmpty, isFalse);
+      map.remove("01");
+      expect(map.isEmpty, isTrue);
+    });
+
+    test("isNotEmpty returns whether the map isn't empty", () {
+      expect(map.isNotEmpty, isFalse);
+      map["1"] = "value";
+      expect(map.isNotEmpty, isTrue);
+      map.remove("01");
+      expect(map.isNotEmpty, isFalse);
+    });
+
+    test("length returns the number of pairs in the map", () {
+      expect(map.length, equals(0));
+      map["1"] = "value 1";
+      expect(map.length, equals(1));
+      map["01"] = "value 01";
+      expect(map.length, equals(1));
+      map["02"] = "value 02";
+      expect(map.length, equals(2));
+    });
+
+    test("uses original keys for keys", () {
+      map["001"] = "value 1";
+      map["02"] = "value 2";
+      expect(map.keys, equals(["001", "02"]));
+    });
+
+    test("uses original keys for forEach", () {
+      map["001"] = "value 1";
+      map["02"] = "value 2";
+
+      var keys = [];
+      map.forEach((key, value) => keys.add(key));
+      expect(keys, equals(["001", "02"]));
+    });
+
+    test("values returns all values in the map", () {
+      map.addAll({
+        "1": "value 1",
+        "01": "value 01",
+        "2": "value 2",
+        "03": "value 03"
+      });
+
+      expect(map.values, equals(["value 01", "value 2", "value 03"]));
+    });
+  });
+
+  group("CanonicalizedMap.from", () {
+    test("canonicalizes its keys", () {
+      var map = new CanonicalizedMap.from({
+        "1": "value 1",
+        "2": "value 2",
+        "3": "value 3"
+      }, int.parse);
+      expect(map["01"], equals("value 1"));
+      expect(map["02"], equals("value 2"));
+      expect(map["03"], equals("value 3"));
+    });
+
+    test("uses the final value for collisions", () {
+      var map = new CanonicalizedMap.from({
+        "1": "value 1",
+        "01": "value 2",
+        "001": "value 3"
+      }, int.parse);
+      expect(map.length, equals(1));
+      expect(map["0001"], equals("value 3"));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/collection/test/equality_test.dart b/mojo/public/dart/third_party/collection/test/equality_test.dart
new file mode 100644
index 0000000..e609608
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/test/equality_test.dart
@@ -0,0 +1,175 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests equality utilities.
+
+import "dart:collection";
+import "package:collection/collection.dart";
+import "package:test/test.dart";
+
+main() {
+  o(id) => new Element(id);
+
+  // Lists that are point-wise equal, but not identical.
+  var list1 = [o(1), o(2), o(3), o(4), o(5)];
+  var list2 = [o(1), o(2), o(3), o(4), o(5)];
+  // Similar length list with equal elements in different order.
+  var list3 = [o(1), o(3), o(5), o(4), o(2)];
+
+  test("IterableEquality - List", () {
+    expect(const IterableEquality().equals(list1, list2), isTrue);
+    Equality iterId = const IterableEquality(const IdentityEquality());
+    expect(iterId.equals(list1, list2), isFalse);
+  });
+
+  test("IterableEquality - LinkedSet", () {
+    var l1 = new LinkedHashSet.from(list1);
+    var l2 = new LinkedHashSet.from(list2);
+    expect(const IterableEquality().equals(l1, l2), isTrue);
+    Equality iterId = const IterableEquality(const IdentityEquality());
+    expect(iterId.equals(l1, l2), isFalse);
+  });
+
+  test("ListEquality", () {
+    expect(const ListEquality().equals(list1, list2),
+           isTrue);
+    Equality listId = const ListEquality(const IdentityEquality());
+    expect(listId.equals(list1, list2), isFalse);
+  });
+
+  test("ListInequality length", () {
+    var list4 = [o(1), o(2), o(3), o(4), o(5), o(6)];
+    expect(const ListEquality().equals(list1, list4),
+           isFalse);
+    expect(const ListEquality(const IdentityEquality()).equals(list1, list4),
+           isFalse);
+  });
+
+  test("ListInequality value", () {
+    var list5 = [o(1), o(2), o(3), o(4), o(6)];
+    expect(const ListEquality().equals(list1, list5),
+           isFalse);
+    expect(const ListEquality(const IdentityEquality()).equals(list1, list5),
+           isFalse);
+  });
+
+  test("UnorderedIterableEquality", () {
+    expect(const UnorderedIterableEquality().equals(list1, list3),
+           isTrue);
+    Equality uniterId =
+        const UnorderedIterableEquality(const IdentityEquality());
+    expect(uniterId.equals(list1, list3), isFalse);
+  });
+
+  test("UnorderedIterableInequality length", () {
+    var list6 = [o(1), o(3), o(5), o(4), o(2), o(1)];
+    expect(const UnorderedIterableEquality().equals(list1, list6),
+           isFalse);
+    expect(const UnorderedIterableEquality(const IdentityEquality())
+               .equals(list1, list6),
+           isFalse);
+  });
+
+  test("UnorderedIterableInequality values", () {
+    var list7 = [o(1), o(3), o(5), o(4), o(6)];
+    expect(const UnorderedIterableEquality().equals(list1, list7),
+           isFalse);
+    expect(const UnorderedIterableEquality(const IdentityEquality())
+               .equals(list1, list7),
+           isFalse);
+  });
+
+  test("SetEquality", () {
+    var set1 = new HashSet.from(list1);
+    var set2 = new LinkedHashSet.from(list3);
+    expect(const SetEquality().equals(set1, set2), isTrue);
+    Equality setId = const SetEquality(const IdentityEquality());
+    expect(setId.equals(set1, set2), isFalse);
+  });
+
+  test("SetInequality length", () {
+    var list8 = [o(1), o(3), o(5), o(4), o(2), o(6)];
+    var set1 = new HashSet.from(list1);
+    var set2 = new LinkedHashSet.from(list8);
+    expect(const SetEquality().equals(set1, set2),
+           isFalse);
+    expect(const SetEquality(const IdentityEquality()).equals(set1, set2),
+           isFalse);
+  });
+
+  test("SetInequality value", () {
+    var list7 = [o(1), o(3), o(5), o(4), o(6)];
+    var set1 = new HashSet.from(list1);
+    var set2 = new LinkedHashSet.from(list7);
+    expect(const SetEquality().equals(set1, set2),
+           isFalse);
+    expect(const SetEquality(const IdentityEquality()).equals(set1, set2),
+           isFalse);
+  });
+
+  var map1a = {"x": [o(1), o(2), o(3)], "y": [true, false, null]};
+  var map1b = {"x": [o(4), o(5), o(6)], "y": [false, true, null]};
+  var map2a = {"x": [o(3), o(2), o(1)], "y": [false, true, null]};
+  var map2b = {"x": [o(6), o(5), o(4)], "y": [null, false, true]};
+  var l1 = [map1a, map1b];
+  var l2 = [map2a, map2b];
+  var s1 = new Set.from(l1);
+  var s2 = new Set.from([map2b, map2a]);
+
+  test("RecursiveEquality", () {
+    const unordered = const UnorderedIterableEquality();
+    expect(unordered.equals(map1a["x"], map2a["x"]),
+        isTrue);
+    expect(unordered.equals(map1a["y"], map2a["y"]),
+        isTrue);
+    expect(unordered.equals(map1b["x"], map2b["x"]),
+        isTrue);
+    expect(unordered.equals(map1b["y"], map2b["y"]),
+        isTrue);
+    const mapval = const MapEquality(values: unordered);
+    expect(
+        mapval.equals(map1a, map2a),
+        isTrue);
+    expect(mapval.equals(map1b, map2b),
+        isTrue);
+    const listmapval = const ListEquality(mapval);
+    expect(listmapval.equals(l1, l2),
+        isTrue);
+    const setmapval = const SetEquality(mapval);
+    expect(setmapval.equals(s1, s2),
+        isTrue);
+  });
+
+  test("DeepEquality", () {
+    var colleq = const DeepCollectionEquality.unordered();
+    expect(colleq.equals(map1a["x"], map2a["x"]),
+        isTrue);
+    expect(colleq.equals(map1a["y"], map2a["y"]),
+        isTrue);
+    expect(colleq.equals(map1b["x"], map2b["x"]),
+        isTrue);
+    expect(colleq.equals(map1b["y"], map2b["y"]),
+        isTrue);
+    expect(colleq.equals(map1a, map2a),
+        isTrue);
+    expect(colleq.equals(map1b, map2b),
+        isTrue);
+    expect(colleq.equals(l1, l2),
+        isTrue);
+    expect(colleq.equals(s1, s2),
+        isTrue);
+  });
+}
+
+/// Wrapper objects for an `id` value.
+///
+/// Compares the `id` value by equality and for comparison.
+/// Allows creating simple objects that are equal without being identical.
+class Element implements Comparable<Element> {
+  final Comparable id;
+  const Element(this.id);
+  int get hashCode => id.hashCode;
+  bool operator==(Object other) => other is Element && id == other.id;
+  int compareTo(other) => id.compareTo(other.id);
+}
diff --git a/mojo/public/dart/third_party/collection/test/iterable_zip_test.dart b/mojo/public/dart/third_party/collection/test/iterable_zip_test.dart
new file mode 100644
index 0000000..cc8ac76
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/test/iterable_zip_test.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:collection";
+import "package:collection/iterable_zip.dart";
+import "package:test/test.dart";
+
+/// Iterable like [base] except that it throws when value equals [errorValue].
+Iterable iterError(Iterable base, int errorValue) {
+  return base.map((x) => x == errorValue ? throw "BAD" : x);
+}
+
+main() {
+  test("Basic", () {
+    expect(new IterableZip([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
+           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
+  });
+
+  test("Uneven length 1", () {
+    expect(new IterableZip([[1, 2, 3, 99, 100], [4, 5, 6], [7, 8, 9]]),
+           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
+  });
+
+  test("Uneven length 2", () {
+    expect(new IterableZip([[1, 2, 3], [4, 5, 6, 99, 100], [7, 8, 9]]),
+           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
+  });
+
+  test("Uneven length 3", () {
+    expect(new IterableZip([[1, 2, 3], [4, 5, 6], [7, 8, 9, 99, 100]]),
+           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
+  });
+
+  test("Uneven length 3", () {
+    expect(new IterableZip([[1, 2, 3, 98], [4, 5, 6], [7, 8, 9, 99, 100]]),
+           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
+  });
+
+  test("Empty 1", () {
+    expect(new IterableZip([[], [4, 5, 6], [7, 8, 9]]), equals([]));
+  });
+
+  test("Empty 2", () {
+    expect(new IterableZip([[1, 2, 3], [], [7, 8, 9]]), equals([]));
+  });
+
+  test("Empty 3", () {
+    expect(new IterableZip([[1, 2, 3], [4, 5, 6], []]), equals([]));
+  });
+
+  test("Empty source", () {
+    expect(new IterableZip([]), equals([]));
+  });
+
+  test("Single Source", () {
+    expect(new IterableZip([[1, 2, 3]]), equals([[1], [2], [3]]));
+  });
+
+  test("Not-lists", () {
+    // Use other iterables than list literals.
+    Iterable it1 = [1, 2, 3, 4, 5, 6].where((x) => x < 4);
+    Set it2 = new LinkedHashSet()..add(4)..add(5)..add(6);
+    Iterable it3 = (new LinkedHashMap()..[7] = 0 ..[8] = 0 ..[9] = 0).keys;
+    Iterable<Iterable> allIts =
+        new Iterable.generate(3, (i) => [it1, it2, it3][i]);
+    expect(new IterableZip(allIts),
+           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
+  });
+
+  test("Error 1", () {
+    expect(() => new IterableZip([iterError([1, 2, 3], 2),
+                                  [4, 5, 6],
+                                  [7, 8, 9]]).toList(),
+           throwsA(equals("BAD")));
+  });
+
+  test("Error 2", () {
+    expect(() => new IterableZip([[1, 2, 3],
+                                  iterError([4, 5, 6], 5),
+                                  [7, 8, 9]]).toList(),
+           throwsA(equals("BAD")));
+  });
+
+  test("Error 3", () {
+    expect(() => new IterableZip([[1, 2, 3],
+                                  [4, 5, 6],
+                                  iterError([7, 8, 9], 8)]).toList(),
+           throwsA(equals("BAD")));
+  });
+
+  test("Error at end", () {
+    expect(() => new IterableZip([[1, 2, 3],
+                                  iterError([4, 5, 6], 6),
+                                  [7, 8, 9]]).toList(),
+           throwsA(equals("BAD")));
+  });
+
+  test("Error before first end", () {
+    expect(() => new IterableZip([iterError([1, 2, 3, 4], 4),
+                                  [4, 5, 6],
+                                  [7, 8, 9]]).toList(),
+           throwsA(equals("BAD")));
+  });
+
+  test("Error after first end", () {
+    expect(new IterableZip([[1, 2, 3],
+                            [4, 5, 6],
+                            iterError([7, 8, 9, 10], 10)]),
+           equals([[1, 4, 7], [2, 5, 8], [3, 6, 9]]));
+  });
+}
diff --git a/mojo/public/dart/third_party/collection/test/priority_queue_test.dart b/mojo/public/dart/third_party/collection/test/priority_queue_test.dart
new file mode 100644
index 0000000..264bf94
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/test/priority_queue_test.dart
@@ -0,0 +1,166 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Tests priority queue implementations utilities.
+
+import "package:collection/priority_queue.dart";
+import "package:test/test.dart";
+
+void main() {
+  testInt(() => new HeapPriorityQueue<int>());
+  testCustom((comparator) => new HeapPriorityQueue<C>(comparator));
+}
+
+void testInt(PriorityQueue<int> create()) {
+  for (int count in [1, 5, 127, 128]) {
+    testQueue("int:$count",
+              create,
+              new List<int>.generate(count, (x) => x),
+              count);
+  }
+}
+
+void testCustom(PriorityQueue<C> create(comparator)) {
+  for (int count in [1, 5, 127, 128]) {
+    testQueue("Custom:$count/null",
+              () => create(null),
+              new List<C>.generate(count, (x) => new C(x)),
+              new C(count));
+    testQueue("Custom:$count/compare",
+              () => create(compare),
+              new List<C>.generate(count, (x) => new C(x)),
+              new C(count));
+    testQueue("Custom:$count/compareNeg",
+              () => create(compareNeg),
+              new List<C>.generate(count, (x) => new C(count - x)),
+              new C(0));
+  }
+}
+
+/**
+ * Test that a queue behaves correctly.
+ *
+ * The elements must be in priority order, from highest to lowest.
+ */
+void testQueue(String name, PriorityQueue create(), List elements, notElement) {
+  test(name, () => testQueueBody(create, elements, notElement));
+}
+
+void testQueueBody(PriorityQueue create(), List elements, notElement) {
+  PriorityQueue q = create();
+  expect(q.isEmpty, isTrue);
+  expect(q, hasLength(0));
+  expect(() { q.first; }, throwsStateError);
+  expect(() { q.removeFirst(); }, throwsStateError);
+
+  // Tests removeFirst, first, contains, toList and toSet.
+  void testElements() {
+    expect(q.isNotEmpty, isTrue);
+    expect(q, hasLength(elements.length));
+
+    expect(q.toList(), equals(elements));
+    expect(q.toSet().toList(), equals(elements));
+
+    for (int i = 0; i < elements.length; i++) {
+      expect(q.contains(elements[i]), isTrue);
+    }
+    expect(q.contains(notElement), isFalse);
+
+    List all = [];
+    while (!q.isEmpty) {
+      var expected = q.first;
+      var actual = q.removeFirst();
+      expect(actual, same(expected));
+      all.add(actual);
+    }
+
+    expect(all.length, elements.length);
+    for (int i = 0; i < all.length; i++) {
+      expect(all[i], same(elements[i]));
+    }
+
+    expect(q.isEmpty, isTrue);
+  }
+
+  q.addAll(elements);
+  testElements();
+
+  q.addAll(elements.reversed);
+  testElements();
+
+  // Add elements in a non-linear order (gray order).
+  for (int i = 0, j = 0; i < elements.length; i++) {
+    int gray;
+    do {
+      gray = j ^ (j >> 1);
+      j++;
+    } while (gray >= elements.length);
+    q.add(elements[gray]);
+  }
+  testElements();
+
+  // Add elements by picking the middle element first, and then recursing
+  // on each side.
+  void addRec(int min, int max) {
+    int mid = min + ((max - min) >> 1);
+    q.add(elements[mid]);
+    if (mid + 1 < max) addRec(mid + 1, max);
+    if (mid > min) addRec(min, mid);
+  }
+  addRec(0, elements.length);
+  testElements();
+
+  // Test removeAll.
+  q.addAll(elements);
+  expect(q, hasLength(elements.length));
+  Iterable all = q.removeAll();
+  expect(q.isEmpty, isTrue);
+  expect(all, hasLength(elements.length));
+  for (int i = 0; i < elements.length; i++) {
+    expect(all, contains(elements[i]));
+  }
+
+  // Test the same element more than once in queue.
+  q.addAll(elements);
+  q.addAll(elements.reversed);
+  expect(q, hasLength(elements.length * 2));
+  for (int i = 0; i < elements.length; i++) {
+    var element = elements[i];
+    expect(q.contains(element), isTrue);
+    expect(q.removeFirst(), element);
+    expect(q.removeFirst(), element);
+  }
+
+  // Test queue with all same element.
+  var a = elements[0];
+  for (int i = 0; i < elements.length; i++) {
+    q.add(a);
+  }
+  expect(q, hasLength(elements.length));
+  expect(q.contains(a), isTrue);
+  expect(q.contains(notElement), isFalse);
+  q.removeAll().forEach((x) => expect(x, same(a)));
+
+  // Test remove.
+  q.addAll(elements);
+  for (var element in elements.reversed) {
+    expect(q.remove(element), isTrue);
+  }
+  expect(q.isEmpty, isTrue);
+}
+
+
+// Custom class.
+// Class is comparable, comparators match normal and inverse order.
+int compare(C c1, C c2) => c1.value - c2.value;
+int compareNeg(C c1, C c2) => c2.value - c1.value;
+
+class C implements Comparable {
+  final int value;
+  const C(this.value);
+  int get hashCode => value;
+  bool operator==(Object other) => other is C && value == other.value;
+  int compareTo(C other) => value - other.value;
+  String toString() => "C($value)";
+}
diff --git a/mojo/public/dart/third_party/collection/test/queue_list_test.dart b/mojo/public/dart/third_party/collection/test/queue_list_test.dart
new file mode 100644
index 0000000..cbe518f
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/test/queue_list_test.dart
@@ -0,0 +1,275 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:collection/collection.dart";
+import "package:test/test.dart";
+
+void main() {
+  group("new QueueList()", () {
+    test("creates an empty QueueList", () {
+      expect(new QueueList(), isEmpty);
+    });
+
+    test("takes an initial capacity", () {
+      expect(new QueueList(100), isEmpty);
+    });
+  });
+
+  test("new QueueList.from() copies the contents of an iterable", () {
+    expect(new QueueList.from([1, 2, 3].skip(1)), equals([2, 3]));
+  });
+
+  group("add()", () {
+    test("adds an element to the end of the queue", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      queue.add(4);
+      expect(queue, equals([1, 2, 3, 4]));
+    });
+
+    test("expands a full queue", () {
+      var queue = atCapacity();
+      queue.add(8);
+      expect(queue, equals([1, 2, 3, 4, 5, 6, 7, 8]));
+    });
+  });
+
+  group("addAll()", () {
+    test("adds elements to the end of the queue", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      queue.addAll([4, 5, 6]);
+      expect(queue, equals([1, 2, 3, 4, 5, 6]));
+    });
+
+    test("expands a full queue", () {
+      var queue = atCapacity();
+      queue.addAll([8, 9]);
+      expect(queue, equals([1, 2, 3, 4, 5, 6, 7, 8, 9]));
+    });
+  });
+
+  group("addFirst()", () {
+    test("adds an element to the beginning of the queue", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      queue.addFirst(0);
+      expect(queue, equals([0, 1, 2, 3]));
+    });
+
+    test("expands a full queue", () {
+      var queue = atCapacity();
+      queue.addFirst(0);
+      expect(queue, equals([0, 1, 2, 3, 4, 5, 6, 7]));
+    });
+  });
+
+  group("removeFirst()", () {
+    test("removes an element from the beginning of the queue", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      expect(queue.removeFirst(), equals(1));
+      expect(queue, equals([2, 3]));
+    });
+
+    test("removes an element from the beginning of a queue with an internal "
+        "gap", () {
+      var queue = withInternalGap();
+      expect(queue.removeFirst(), equals(1));
+      expect(queue, equals([2, 3, 4, 5, 6, 7]));
+    });
+
+    test("removes an element from the beginning of a queue at capacity", () {
+      var queue = atCapacity();
+      expect(queue.removeFirst(), equals(1));
+      expect(queue, equals([2, 3, 4, 5, 6, 7]));
+    });
+
+    test("throws a StateError for an empty queue", () {
+      expect(new QueueList().removeFirst, throwsStateError);
+    });
+  });
+
+  group("removeLast()", () {
+    test("removes an element from the end of the queue", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      expect(queue.removeLast(), equals(3));
+      expect(queue, equals([1, 2]));
+    });
+
+    test("removes an element from the end of a queue with an internal gap", () {
+      var queue = withInternalGap();
+      expect(queue.removeLast(), equals(7));
+      expect(queue, equals([1, 2, 3, 4, 5, 6]));
+    });
+
+    test("removes an element from the end of a queue at capacity", () {
+      var queue = atCapacity();
+      expect(queue.removeLast(), equals(7));
+      expect(queue, equals([1, 2, 3, 4, 5, 6]));
+    });
+
+    test("throws a StateError for an empty queue", () {
+      expect(new QueueList().removeLast, throwsStateError);
+    });
+  });
+
+  group("length", () {
+    test("returns the length of a queue", () {
+      expect(new QueueList.from([1, 2, 3]).length, equals(3));
+    });
+
+    test("returns the length of a queue with an internal gap", () {
+      expect(withInternalGap().length, equals(7));
+    });
+
+    test("returns the length of a queue at capacity", () {
+      expect(atCapacity().length, equals(7));
+    });
+  });
+
+  group("length=", () {
+    test("shrinks a larger queue", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      queue.length = 1;
+      expect(queue, equals([1]));
+    });
+
+    test("grows a smaller queue", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      queue.length = 5;
+      expect(queue, equals([1, 2, 3, null, null]));
+    });
+
+    test("throws a RangeError if length is less than 0", () {
+      expect(() => new QueueList().length = -1, throwsRangeError);
+    });
+  });
+
+  group("[]", () {
+    test("returns individual entries in the queue", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      expect(queue[0], equals(1));
+      expect(queue[1], equals(2));
+      expect(queue[2], equals(3));
+    });
+
+    test("returns individual entries in a queue with an internal gap", () {
+      var queue = withInternalGap();
+      expect(queue[0], equals(1));
+      expect(queue[1], equals(2));
+      expect(queue[2], equals(3));
+      expect(queue[3], equals(4));
+      expect(queue[4], equals(5));
+      expect(queue[5], equals(6));
+      expect(queue[6], equals(7));
+    });
+
+    test("throws a RangeError if the index is less than 0", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      expect(() => queue[-1], throwsRangeError);
+    });
+
+    test("throws a RangeError if the index is greater than or equal to the "
+        "length", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      expect(() => queue[3], throwsRangeError);
+    });
+  });
+
+  group("[]=", () {
+    test("sets individual entries in the queue", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      queue[0] = "a";
+      queue[1] = "b";
+      queue[2] = "c";
+      expect(queue, equals(["a", "b", "c"]));
+    });
+
+    test("sets individual entries in a queue with an internal gap", () {
+      var queue = withInternalGap();
+      queue[0] = "a";
+      queue[1] = "b";
+      queue[2] = "c";
+      queue[3] = "d";
+      queue[4] = "e";
+      queue[5] = "f";
+      queue[6] = "g";
+      expect(queue, equals(["a", "b", "c", "d", "e", "f", "g"]));
+    });
+
+    test("throws a RangeError if the index is less than 0", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      expect(() {
+        queue[-1] = 0;
+      }, throwsRangeError);
+    });
+
+    test("throws a RangeError if the index is greater than or equal to the "
+        "length", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      expect(() {
+        queue[3] = 4;
+      }, throwsRangeError);
+    });
+  });
+
+  group("throws a modification error for", () {
+    var queue;
+    setUp(() {
+      queue = new QueueList.from([1, 2, 3]);
+    });
+
+    test("add", () {
+      expect(() => queue.forEach((_) => queue.add(4)),
+          throwsConcurrentModificationError);
+    });
+
+    test("addAll", () {
+      expect(() => queue.forEach((_) => queue.addAll([4, 5, 6])),
+          throwsConcurrentModificationError);
+    });
+
+    test("addFirst", () {
+      expect(() => queue.forEach((_) => queue.addFirst(0)),
+          throwsConcurrentModificationError);
+    });
+
+    test("removeFirst", () {
+      expect(() => queue.forEach((_) => queue.removeFirst()),
+          throwsConcurrentModificationError);
+    });
+
+    test("removeLast", () {
+      expect(() => queue.forEach((_) => queue.removeLast()),
+          throwsConcurrentModificationError);
+    });
+
+    test("length=", () {
+      expect(() => queue.forEach((_) => queue.length = 1),
+          throwsConcurrentModificationError);
+    });
+  });
+}
+
+/// Returns a queue whose internal ring buffer is full enough that adding a new
+/// element will expand it.
+QueueList atCapacity() {
+  // Use addAll because [new QueueList.from(List)] won't use the default initial
+  // capacity of 8.
+  return new QueueList()..addAll([1, 2, 3, 4, 5, 6, 7]);
+}
+
+/// Returns a queue whose internal tail has a lower index than its head.
+QueueList withInternalGap() {
+  var queue = new QueueList.from([null, null, null, null, 1, 2, 3, 4]);
+  for (var i = 0; i < 4; i++) {
+    queue.removeFirst();
+  }
+  for (var i = 5; i < 8; i++) {
+    queue.addLast(i);
+  }
+  return queue;
+}
+
+/// Returns a matcher that expects that a closure throws a
+/// [ConcurrentModificationError].
+final throwsConcurrentModificationError = throwsA(
+    new isInstanceOf<ConcurrentModificationError>());
diff --git a/mojo/public/dart/third_party/collection/test/unmodifiable_collection_test.dart b/mojo/public/dart/third_party/collection/test/unmodifiable_collection_test.dart
new file mode 100644
index 0000000..6c722d0
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/test/unmodifiable_collection_test.dart
@@ -0,0 +1,608 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:collection/wrappers.dart";
+import "package:test/test.dart";
+
+// Test unmodifiable collection views.
+// The collections should pass through the operations that are allowed,
+// an throw on the ones that aren't without affecting the original.
+
+main() {
+  List list = [];
+  testUnmodifiableList(list, new UnmodifiableListView(list), "empty");
+  list = [42];
+  testUnmodifiableList(list, new UnmodifiableListView(list), "single-42");
+  list = [7];
+  testUnmodifiableList(list, new UnmodifiableListView(list), "single!42");
+  list = [1, 42, 10];
+  testUnmodifiableList(list, new UnmodifiableListView(list), "three-42");
+  list = [1, 7, 10];
+  testUnmodifiableList(list, new UnmodifiableListView(list), "three!42");
+
+  list = [];
+  testNonGrowableList(list, new NonGrowableListView(list), "empty");
+  list = [42];
+  testNonGrowableList(list, new NonGrowableListView(list), "single-42");
+  list = [7];
+  testNonGrowableList(list, new NonGrowableListView(list), "single!42");
+  list = [1, 42, 10];
+  testNonGrowableList(list, new NonGrowableListView(list), "three-42");
+  list = [1, 7, 10];
+  testNonGrowableList(list, new NonGrowableListView(list), "three!42");
+
+  Set aSet = new Set();
+  testUnmodifiableSet(aSet, new UnmodifiableSetView(aSet), "empty");
+  aSet = new Set.from([42]);
+  testUnmodifiableSet(aSet, new UnmodifiableSetView(aSet), "single-42");
+  aSet = new Set.from([7]);
+  testUnmodifiableSet(aSet, new UnmodifiableSetView(aSet), "single!42");
+  aSet = new Set.from([1, 42, 10]);
+  testUnmodifiableSet(aSet, new UnmodifiableSetView(aSet), "three-42");
+  aSet = new Set.from([1, 7, 10]);
+  testUnmodifiableSet(aSet, new UnmodifiableSetView(aSet), "three!42");
+}
+
+void testUnmodifiableList(List original, List wrapped, String name) {
+  name = "unmodifiable-list-$name";
+  testIterable(original, wrapped, name);
+  testReadList(original, wrapped, name);
+  testNoWriteList(original, wrapped, name);
+  testNoChangeLengthList(original, wrapped, name);
+}
+
+void testNonGrowableList(List original, List wrapped, String name) {
+  name = "nongrowable-list-$name";
+  testIterable(original, wrapped, name);
+  testReadList(original, wrapped, name);
+  testWriteList(original, wrapped, name);
+  testNoChangeLengthList(original, wrapped, name);
+}
+
+void testUnmodifiableSet(Set original, Set wrapped, String name) {
+  name = "unmodifiable-set-$name";
+  testIterable(original, wrapped, name);
+  testReadSet(original, wrapped, name);
+  testNoChangeSet(original, wrapped, name);
+}
+
+void testIterable(Iterable original, Iterable wrapped, String name) {
+  test("$name - any", () {
+    expect(wrapped.any((x) => true), equals(original.any((x) => true)));
+    expect(wrapped.any((x) => false), equals(original.any((x) => false)));
+  });
+
+  test("$name - contains", () {
+    expect(wrapped.contains(0), equals(original.contains(0)));
+  });
+
+  test("$name - elementAt", () {
+    if (original.isEmpty) {
+      expect(() => wrapped.elementAt(0), throws);
+    } else {
+      expect(wrapped.elementAt(0), equals(original.elementAt(0)));
+    }
+  });
+
+  test("$name - every", () {
+    expect(wrapped.every((x) => true), equals(original.every((x) => true)));
+    expect(wrapped.every((x) => false), equals(original.every((x) => false)));
+  });
+
+  test("$name - expand", () {
+    expect(wrapped.expand((x) => [x, x]),
+           equals(original.expand((x) => [x, x])));
+  });
+
+  test("$name - first", () {
+    if (original.isEmpty) {
+      expect(() => wrapped.first, throws);
+    } else {
+      expect(wrapped.first, equals(original.first));
+    }
+  });
+
+  test("$name - firstWhere", () {
+    if (original.isEmpty) {
+      expect(() => wrapped.firstWhere((_) => true), throws);
+    } else {
+      expect(wrapped.firstWhere((_) => true),
+             equals(original.firstWhere((_) => true)));
+    }
+    expect(() => wrapped.firstWhere((_) => false), throws);
+  });
+
+  test("$name - fold", () {
+    expect(wrapped.fold(0, (x, y) => x + y),
+           equals(original.fold(0, (x, y) => x + y)));
+  });
+
+  test("$name - forEach", () {
+    int wrapCtr = 0;
+    int origCtr = 0;
+    wrapped.forEach((x) { wrapCtr += x; });
+    original.forEach((x) { origCtr += x; });
+    expect(wrapCtr, equals(origCtr));
+  });
+
+  test("$name - isEmpty", () {
+    expect(wrapped.isEmpty, equals(original.isEmpty));
+  });
+
+  test("$name - isNotEmpty", () {
+    expect(wrapped.isNotEmpty, equals(original.isNotEmpty));
+  });
+
+  test("$name - iterator", () {
+    Iterator wrapIter = wrapped.iterator;
+    Iterator origIter = original.iterator;
+    while (origIter.moveNext()) {
+      expect(wrapIter.moveNext(), equals(true));
+      expect(wrapIter.current, equals(origIter.current));
+    }
+    expect(wrapIter.moveNext(), equals(false));
+  });
+
+  test("$name - join", () {
+    expect(wrapped.join(""), equals(original.join("")));
+    expect(wrapped.join("-"), equals(original.join("-")));
+  });
+
+  test("$name - last", () {
+    if (original.isEmpty) {
+      expect(() => wrapped.last, throws);
+    } else {
+      expect(wrapped.last, equals(original.last));
+    }
+  });
+
+  test("$name - lastWhere", () {
+    if (original.isEmpty) {
+      expect(() => wrapped.lastWhere((_) => true), throws);
+    } else {
+      expect(wrapped.lastWhere((_) => true),
+             equals(original.lastWhere((_) => true)));
+    }
+    expect(() => wrapped.lastWhere((_) => false), throws);
+  });
+
+  test("$name - length", () {
+    expect(wrapped.length, equals(original.length));
+  });
+
+  test("$name - map", () {
+    expect(wrapped.map((x) => "[$x]"),
+           equals(original.map((x) => "[$x]")));
+  });
+
+  test("$name - reduce", () {
+    if (original.isEmpty) {
+      expect(() => wrapped.reduce((x, y) => x + y), throws);
+    } else {
+      expect(wrapped.reduce((x, y) => x + y),
+             equals(original.reduce((x, y) => x + y)));
+    }
+  });
+
+  test("$name - single", () {
+    if (original.length != 1) {
+      expect(() => wrapped.single, throws);
+    } else {
+      expect(wrapped.single, equals(original.single));
+    }
+  });
+
+  test("$name - singleWhere", () {
+    if (original.length != 1) {
+      expect(() => wrapped.singleWhere((_) => true), throws);
+    } else {
+      expect(wrapped.singleWhere((_) => true),
+             equals(original.singleWhere((_) => true)));
+    }
+    expect(() => wrapped.singleWhere((_) => false), throws);
+  });
+
+  test("$name - skip", () {
+    expect(wrapped.skip(0), orderedEquals(original.skip(0)));
+    expect(wrapped.skip(1), orderedEquals(original.skip(1)));
+    expect(wrapped.skip(5), orderedEquals(original.skip(5)));
+  });
+
+  test("$name - skipWhile", () {
+    expect(wrapped.skipWhile((x) => true),
+           orderedEquals(original.skipWhile((x) => true)));
+    expect(wrapped.skipWhile((x) => false),
+           orderedEquals(original.skipWhile((x) => false)));
+    expect(wrapped.skipWhile((x) => x != 42),
+           orderedEquals(original.skipWhile((x) => x != 42)));
+  });
+
+  test("$name - take", () {
+    expect(wrapped.take(0), orderedEquals(original.take(0)));
+    expect(wrapped.take(1), orderedEquals(original.take(1)));
+    expect(wrapped.take(5), orderedEquals(original.take(5)));
+  });
+
+  test("$name - takeWhile", () {
+    expect(wrapped.takeWhile((x) => true),
+           orderedEquals(original.takeWhile((x) => true)));
+    expect(wrapped.takeWhile((x) => false),
+           orderedEquals(original.takeWhile((x) => false)));
+    expect(wrapped.takeWhile((x) => x != 42),
+           orderedEquals(original.takeWhile((x) => x != 42)));
+  });
+
+  test("$name - toList", () {
+    expect(wrapped.toList(), orderedEquals(original.toList()));
+    expect(wrapped.toList(growable: false),
+           orderedEquals(original.toList(growable: false)));
+  });
+
+  test("$name - toSet", () {
+    expect(wrapped.toSet(), unorderedEquals(original.toSet()));
+  });
+
+  test("$name - where", () {
+    expect(wrapped.where((x) => true),
+           orderedEquals(original.where((x) => true)));
+    expect(wrapped.where((x) => false),
+           orderedEquals(original.where((x) => false)));
+    expect(wrapped.where((x) => x != 42),
+           orderedEquals(original.where((x) => x != 42)));
+  });
+}
+
+void testReadList(List original, List wrapped, String name) {
+  test("$name - length", () {
+    expect(wrapped.length, equals(original.length));
+  });
+
+  test("$name - isEmpty", () {
+    expect(wrapped.isEmpty, equals(original.isEmpty));
+  });
+
+  test("$name - isNotEmpty", () {
+    expect(wrapped.isNotEmpty, equals(original.isNotEmpty));
+  });
+
+  test("$name - []", () {
+    if (original.isEmpty) {
+      expect(() { wrapped[0]; }, throwsRangeError);
+    } else {
+      expect(wrapped[0], equals(original[0]));
+    }
+  });
+
+  test("$name - indexOf", () {
+    expect(wrapped.indexOf(42), equals(original.indexOf(42)));
+  });
+
+  test("$name - lastIndexOf", () {
+    expect(wrapped.lastIndexOf(42), equals(original.lastIndexOf(42)));
+  });
+
+  test("$name - getRange", () {
+    int len = original.length;
+    expect(wrapped.getRange(0, len), equals(original.getRange(0, len)));
+    expect(wrapped.getRange(len ~/ 2, len),
+           equals(original.getRange(len ~/ 2, len)));
+    expect(wrapped.getRange(0, len ~/ 2),
+           equals(original.getRange(0, len ~/ 2)));
+  });
+
+  test("$name - sublist", () {
+    int len = original.length;
+    expect(wrapped.sublist(0), equals(original.sublist(0)));
+    expect(wrapped.sublist(len ~/ 2), equals(original.sublist(len ~/ 2)));
+    expect(wrapped.sublist(0, len ~/ 2),
+           equals(original.sublist(0, len ~/ 2)));
+  });
+
+  test("$name - asMap", () {
+    expect(wrapped.asMap(), equals(original.asMap()));
+  });
+}
+
+void testNoWriteList(List original, List wrapped, String name) {
+  List copy = new List.from(original);
+
+  testThrows(name, thunk) {
+    test(name, () {
+      expect(thunk, throwsUnsupportedError);
+      // No modifications happened.
+      expect(original, equals(copy));
+    });
+  }
+
+  testThrows("$name - []= throws", () { wrapped[0] = 42; });
+
+  testThrows("$name - sort throws", () { wrapped.sort(); });
+
+  testThrows("$name - fillRange throws", () {
+    wrapped.fillRange(0, wrapped.length, 42);
+  });
+
+  testThrows("$name - setRange throws", () {
+      wrapped.setRange(0, wrapped.length,
+                    new Iterable.generate(wrapped.length, (i) => i));
+  });
+
+  testThrows("$name - setAll throws", () {
+      wrapped.setAll(0, new Iterable.generate(wrapped.length, (i) => i));
+  });
+}
+
+void testWriteList(List original, List wrapped, String name) {
+  List copy = new List.from(original);
+
+  test("$name - []=", () {
+    if (original.isNotEmpty) {
+      int originalFirst = original[0];
+      wrapped[0] = originalFirst + 1;
+      expect(original[0], equals(originalFirst + 1));
+      original[0] = originalFirst;
+    } else {
+      expect(() { wrapped[0] = 42; }, throws);
+    }
+  });
+
+  test("$name - sort", () {
+    List sortCopy = new List.from(original);
+    sortCopy.sort();
+    wrapped.sort();
+    expect(original, orderedEquals(sortCopy));
+    original.setAll(0, copy);
+  });
+
+  test("$name - fillRange", () {
+    wrapped.fillRange(0, wrapped.length, 37);
+    for (int i = 0; i < original.length; i++) {
+      expect(original[i], equals(37));
+    }
+    original.setAll(0, copy);
+  });
+
+  test("$name - setRange", () {
+    List reverseList = original.reversed.toList();
+    wrapped.setRange(0, wrapped.length, reverseList);
+    expect(original, equals(reverseList));
+    original.setAll(0, copy);
+  });
+
+  test("$name - setAll", () {
+    List reverseList = original.reversed.toList();
+    wrapped.setAll(0, reverseList);
+    expect(original, equals(reverseList));
+    original.setAll(0, copy);
+  });
+}
+
+void testNoChangeLengthList(List original, List wrapped, String name) {
+  List copy = new List.from(original);
+
+  testThrows(name, thunk) {
+    test(name, () {
+      expect(thunk, throwsUnsupportedError);
+      // No modifications happened.
+      expect(original, equals(copy));
+    });
+  }
+
+  testThrows("$name - length= throws", () {
+    wrapped.length = 100;
+  });
+
+  testThrows("$name - add throws", () {
+    wrapped.add(42);
+  });
+
+  testThrows("$name - addAll throws", () {
+    wrapped.addAll([42]);
+  });
+
+  testThrows("$name - insert throws", () {
+    wrapped.insert(0, 42);
+  });
+
+  testThrows("$name - insertAll throws", () {
+    wrapped.insertAll(0, [42]);
+  });
+
+  testThrows("$name - remove throws", () {
+    wrapped.remove(42);
+  });
+
+  testThrows("$name - removeAt throws", () {
+    wrapped.removeAt(0);
+  });
+
+  testThrows("$name - removeLast throws", () {
+    wrapped.removeLast();
+  });
+
+  testThrows("$name - removeWhere throws", () {
+    wrapped.removeWhere((element) => false);
+  });
+
+  testThrows("$name - retainWhere throws", () {
+    wrapped.retainWhere((element) => true);
+  });
+
+  testThrows("$name - removeRange throws", () {
+    wrapped.removeRange(0, wrapped.length);
+  });
+
+  testThrows("$name - replaceRange throws", () {
+    wrapped.replaceRange(0, wrapped.length, [42]);
+  });
+
+  testThrows("$name - clear throws", () {
+    wrapped.clear();
+  });
+}
+
+void testReadSet(Set original, Set wrapped, String name) {
+  Set copy = new Set.from(original);
+
+  test("$name - containsAll", () {
+    expect(wrapped.containsAll(copy), isTrue);
+    expect(wrapped.containsAll(copy.toList()), isTrue);
+    expect(wrapped.containsAll([]), isTrue);
+    expect(wrapped.containsAll([42]), equals(original.containsAll([42])));
+  });
+
+  test("$name - intersection", () {
+    expect(wrapped.intersection(new Set()), isEmpty);
+    expect(wrapped.intersection(copy), unorderedEquals(original));
+    expect(wrapped.intersection(new Set.from([42])),
+            new Set.from(original.contains(42) ? [42] : []));
+  });
+
+  test("$name - union", () {
+    expect(wrapped.union(new Set()), unorderedEquals(original));
+    expect(wrapped.union(copy), unorderedEquals(original));
+    expect(wrapped.union(new Set.from([42])),
+           equals(original.union(new Set.from([42]))));
+  });
+
+  test("$name - difference", () {
+    expect(wrapped.difference(new Set()), unorderedEquals(original));
+    expect(wrapped.difference(copy), isEmpty);
+    expect(wrapped.difference(new Set.from([42])),
+           equals(original.difference(new Set.from([42]))));
+  });
+}
+
+void testNoChangeSet(Set original, Set wrapped, String name) {
+  List originalElements = original.toList();
+
+  testThrows(name, thunk) {
+    test(name, () {
+      expect(thunk, throwsUnsupportedError);
+      // No modifications happened.
+      expect(original.toList(), equals(originalElements));
+    });
+  }
+
+  testThrows("$name - add throws", () {
+    wrapped.add(42);
+  });
+
+  testThrows("$name - addAll throws", () {
+    wrapped.addAll([42]);
+  });
+
+  testThrows("$name - addAll empty throws", () {
+    wrapped.addAll([]);
+  });
+
+  testThrows("$name - remove throws", () {
+    wrapped.remove(42);
+  });
+
+  testThrows("$name - removeAll throws", () {
+    wrapped.removeAll([42]);
+  });
+
+  testThrows("$name - removeAll empty throws", () {
+    wrapped.removeAll([]);
+  });
+
+  testThrows("$name - retainAll throws", () {
+    wrapped.retainAll([42]);
+  });
+
+  testThrows("$name - removeWhere throws", () {
+    wrapped.removeWhere((_) => false);
+  });
+
+  testThrows("$name - retainWhere throws", () {
+    wrapped.retainWhere((_) => true);
+  });
+
+  testThrows("$name - clear throws", () {
+    wrapped.clear();
+  });
+}
+
+void testReadMap(Map original, Map wrapped, String name) {
+  test("$name length", () {
+    expect(wrapped.length, equals(original.length));
+  });
+
+  test("$name isEmpty", () {
+    expect(wrapped.isEmpty, equals(original.isEmpty));
+  });
+
+  test("$name isNotEmpty", () {
+    expect(wrapped.isNotEmpty, equals(original.isNotEmpty));
+  });
+
+  test("$name operator[]", () {
+    expect(wrapped[0], equals(original[0]));
+    expect(wrapped[999], equals(original[999]));
+  });
+
+  test("$name containsKey", () {
+    expect(wrapped.containsKey(0), equals(original.containsKey(0)));
+    expect(wrapped.containsKey(999), equals(original.containsKey(999)));
+  });
+
+  test("$name containsValue", () {
+    expect(wrapped.containsValue(0), equals(original.containsValue(0)));
+    expect(wrapped.containsValue(999), equals(original.containsValue(999)));
+  });
+
+  test("$name forEach", () {
+    int origCnt = 0;
+    int wrapCnt = 0;
+    wrapped.forEach((k, v) { wrapCnt += 1 << k + 3 * v; });
+    original.forEach((k, v) { origCnt += 1 << k + 3 * v; });
+    expect(wrapCnt, equals(origCnt));
+  });
+
+  test("$name keys", () {
+    expect(wrapped.keys, orderedEquals(original.keys));
+  });
+
+  test("$name values", () {
+    expect(wrapped.values, orderedEquals(original.values));
+  });
+}
+
+testNoChangeMap(Map original, Map wrapped, String name) {
+  Map copy = new Map.from(original);
+
+  testThrows(name, thunk) {
+    test(name, () {
+      expect(thunk, throwsUnsupportedError);
+      // No modifications happened.
+      expect(original, equals(copy));
+    });
+  }
+
+ testThrows("$name operator[]= throws", () {
+   wrapped[0] = 42;
+ });
+
+ testThrows("$name putIfAbsent throws", () {
+   wrapped.putIfAbsent(0, () => 42);
+ });
+
+ testThrows("$name addAll throws", () {
+   wrapped.addAll(new Map()..[42] = 42);
+ });
+
+ testThrows("$name addAll empty throws", () {
+   wrapped.addAll(new Map());
+ });
+
+ testThrows("$name remove throws", () {
+   wrapped.remove(0);
+ });
+
+ testThrows("$name clear throws", () {
+   wrapped.clear();
+ });
+}
diff --git a/mojo/public/dart/third_party/collection/test/wrapper_test.dart b/mojo/public/dart/third_party/collection/test/wrapper_test.dart
new file mode 100644
index 0000000..a3526a3
--- /dev/null
+++ b/mojo/public/dart/third_party/collection/test/wrapper_test.dart
@@ -0,0 +1,664 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Tests wrapper utilities.
+
+import "dart:collection";
+import "package:collection/collection.dart";
+import "package:test/test.dart";
+
+// Test that any member access/call on the wrapper object is equal to
+// an expected access on the wrapped object.
+// This is implemented by capturing accesses using noSuchMethod and comparing
+// them to expected accesses captured previously.
+
+// Compare two Invocations for having equal type and arguments.
+void testInvocations(Invocation i1, Invocation i2) {
+  String name = "${i1.memberName}";
+  expect(i1.isGetter, equals(i2.isGetter), reason: name);
+  expect(i1.isSetter, equals(i2.isSetter), reason: name);
+  expect(i1.memberName, equals(i2.memberName), reason: name);
+  expect(i1.positionalArguments, equals(i2.positionalArguments), reason: name);
+  expect(i1.namedArguments, equals(i2.namedArguments), reason: name);
+}
+
+/**
+ * Utility class to record a member access and a member access on a wrapped
+ * object, and compare them for equality.
+ */
+abstract class Expector {
+  getWrappedObject(action(Invocation i));
+  // Hack to test assignment ([]=) because it doesn't return the result
+  // of the member call. Instead use (expect..[4]=5).equal[4]=5  where
+  // you would normally use expect[4].equals[4] for non-assignments.
+  var equals;
+
+  noSuchMethod(Invocation m) => new _Equals(equals = getWrappedObject((m2) {
+    testInvocations(m, m2);
+  }));
+
+  toString() => new _Equals(equals = getWrappedObject((m2) {
+    testInvocations(TO_STRING_INVOCATION, m2);
+  }));
+}
+
+// An object with a field called "equals", only introduced into the
+// flow to allow writing expect.xxx.equals.xxx.
+class _Equals {
+  final equals;
+  _Equals(this.equals);
+}
+
+class SyntheticInvocation implements Invocation {
+  static const int METHOD = 0x00;
+  static const int GETTER = 0x01;
+  static const int SETTER = 0x02;
+  final Symbol memberName;
+  final List positionalArguments;
+  final Map namedArguments;
+  final int _type;
+  const SyntheticInvocation(this.memberName,
+                            this.positionalArguments,
+                            this.namedArguments,
+                            this._type);
+  bool get isMethod => _type == METHOD;
+
+  bool get isGetter => _type == GETTER;
+
+  bool get isSetter => _type == SETTER;
+
+  bool get isAccessor => isGetter || isSetter;
+}
+
+// Parameterization of noSuchMethod.
+class NSM {
+  Function _action;
+  NSM(this._action);
+  noSuchMethod(Invocation i) => _action(i);
+}
+
+const TO_STRING_INVOCATION = const SyntheticInvocation(
+  #toString, const[], const{}, SyntheticInvocation.METHOD);
+
+// LikeNSM, but has types Iterable, Set and List to allow it as
+// argument to DelegatingIterable/Set/List.
+class IterableNSM extends NSM implements Iterable, Set, List, Queue {
+  IterableNSM(action(Invocation i)) : super(action);
+  noSuchMethod(Invocation i) => super.noSuchMethod(i);  // Silence warnings
+  toString() => super.noSuchMethod(TO_STRING_INVOCATION);
+}
+
+// Expector that wraps in DelegatingIterable.
+class IterableExpector extends Expector {
+  getWrappedObject(void action(Invocation i)) {
+    return new DelegatingIterable(new IterableNSM(action));
+  }
+}
+
+// Expector that wraps in DelegatingList.
+class ListExpector extends Expector {
+  getWrappedObject(void action(Invocation i)) {
+    return new DelegatingList(new IterableNSM(action));
+  }
+}
+
+// Expector that wraps in DelegatingSet.
+class SetExpector extends Expector {
+  getWrappedObject(void action(Invocation i)) {
+    return new DelegatingSet(new IterableNSM(action));
+  }
+}
+
+// Expector that wraps in DelegatingSet.
+class QueueExpector extends Expector {
+  getWrappedObject(void action(Invocation i)) {
+    return new DelegatingQueue(new IterableNSM(action));
+  }
+}
+
+// Like NSM but implements Map to allow as argument for DelegatingMap.
+class MapNSM extends NSM implements Map {
+  MapNSM(action(Invocation i)) : super(action);
+  noSuchMethod(Invocation i) => super.noSuchMethod(i);
+  toString() => super.noSuchMethod(TO_STRING_INVOCATION);
+}
+
+// Expector that wraps in DelegatingMap.
+class MapExpector extends Expector {
+  getWrappedObject(void action(Invocation i)) {
+    return new DelegatingMap(new MapNSM(action));
+  }
+}
+
+// Utility values to use as arguments in calls.
+func0() {}
+func1(x) {}
+func2(x, y) {}
+var val = new Object();
+
+void main() {
+  testIterable(var expect) {
+    expect.any(func1).equals.any(func1);
+    expect.contains(val).equals.contains(val);
+    expect.elementAt(0).equals.elementAt(0);
+    expect.every(func1).equals.every(func1);
+    expect.expand(func1).equals.expand(func1);
+    expect.first.equals.first;
+    // Default values of the Iterable interface will be added in the
+    // second call to firstWhere, so we must record them in our
+    // expectation (which doesn't have the interface implementat or
+    // its default values).
+    expect.firstWhere(func1, orElse: null).equals.firstWhere(func1);
+    expect.firstWhere(func1, orElse: func0).equals.
+           firstWhere(func1, orElse: func0);
+    expect.fold(null, func2).equals.fold(null, func2);
+    expect.forEach(func1).equals.forEach(func1);
+    expect.isEmpty.equals.isEmpty;
+    expect.isNotEmpty.equals.isNotEmpty;
+    expect.iterator.equals.iterator;
+    expect.join('').equals.join();
+    expect.join("X").equals.join("X");
+    expect.last.equals.last;
+    expect.lastWhere(func1, orElse: null).equals.lastWhere(func1);
+    expect.lastWhere(func1, orElse: func0).equals.
+           lastWhere(func1, orElse: func0);
+    expect.length.equals.length;
+    expect.map(func1).equals.map(func1);
+    expect.reduce(func2).equals.reduce(func2);
+    expect.single.equals.single;
+    expect.singleWhere(func1).equals.singleWhere(func1);
+    expect.skip(5).equals.skip(5);
+    expect.skipWhile(func1).equals.skipWhile(func1);
+    expect.take(5).equals.take(5);
+    expect.takeWhile(func1).equals.takeWhile(func1);
+    expect.toList(growable: true).equals.toList();
+    expect.toList(growable: true).equals.toList(growable: true);
+    expect.toList(growable: false).equals.toList(growable: false);
+    expect.toSet().equals.toSet();
+    expect.toString().equals.toString();
+    expect.where(func1).equals.where(func1);
+  }
+
+  void testList(var expect) {
+    testIterable(expect);
+
+    expect[4].equals[4];
+    (expect..[4] = 5).equals[4] = 5;
+
+    expect.add(val).equals.add(val);
+    expect.addAll([val]).equals.addAll([val]);
+    expect.asMap().equals.asMap();
+    expect.clear().equals.clear();
+    expect.fillRange(4, 5, null).equals.fillRange(4, 5);
+    expect.fillRange(4, 5, val).equals.fillRange(4, 5, val);
+    expect.getRange(4, 5).equals.getRange(4, 5);
+    expect.indexOf(val, 0).equals.indexOf(val);
+    expect.indexOf(val, 4).equals.indexOf(val, 4);
+    expect.insert(4, val).equals.insert(4, val);
+    expect.insertAll(4, [val]).equals.insertAll(4, [val]);
+    expect.lastIndexOf(val, null).equals.lastIndexOf(val);
+    expect.lastIndexOf(val, 4).equals.lastIndexOf(val, 4);
+    (expect..length = 4).equals.length = 4;
+    expect.remove(val).equals.remove(val);
+    expect.removeAt(4).equals.removeAt(4);
+    expect.removeLast().equals.removeLast();
+    expect.removeRange(4, 5).equals.removeRange(4, 5);
+    expect.removeWhere(func1).equals.removeWhere(func1);
+    expect.replaceRange(4, 5, [val]).equals.replaceRange(4, 5, [val]);
+    expect.retainWhere(func1).equals.retainWhere(func1);
+    expect.reversed.equals.reversed;
+    expect.setAll(4, [val]).equals.setAll(4, [val]);
+    expect.setRange(4, 5, [val], 0).equals.setRange(4, 5, [val]);
+    expect.setRange(4, 5, [val], 3).equals.setRange(4, 5, [val], 3);
+    expect.sort(null).equals.sort();
+    expect.sort(func2).equals.sort(func2);
+    expect.sublist(4, null).equals.sublist(4);
+    expect.sublist(4, 5).equals.sublist(4, 5);
+  }
+
+  void testSet(var expect) {
+    testIterable(expect);
+    Set set = new Set();
+    expect.add(val).equals.add(val);
+    expect.addAll([val]).equals.addAll([val]);
+    expect.clear().equals.clear();
+    expect.containsAll([val]).equals.containsAll([val]);
+    expect.difference(set).equals.difference(set);
+    expect.intersection(set).equals.intersection(set);
+    expect.remove(val).equals.remove(val);
+    expect.removeAll([val]).equals.removeAll([val]);
+    expect.removeWhere(func1).equals.removeWhere(func1);
+    expect.retainAll([val]).equals.retainAll([val]);
+    expect.retainWhere(func1).equals.retainWhere(func1);
+    expect.union(set).equals.union(set);
+  }
+
+  void testQueue(var expect) {
+    testIterable(expect);
+    expect.add(val).equals.add(val);
+    expect.addAll([val]).equals.addAll([val]);
+    expect.addFirst(val).equals.addFirst(val);
+    expect.addLast(val).equals.addLast(val);
+    expect.clear().equals.clear();
+    expect.remove(val).equals.remove(val);
+    expect.removeFirst().equals.removeFirst();
+    expect.removeLast().equals.removeLast();
+  }
+
+  void testMap(var expect) {
+    Map map = new Map();
+    expect[val].equals[val];
+    (expect..[val] = val).equals[val] = val;
+    expect.addAll(map).equals.addAll(map);
+    expect.clear().equals.clear();
+    expect.containsKey(val).equals.containsKey(val);
+    expect.containsValue(val).equals.containsValue(val);
+    expect.forEach(func2).equals.forEach(func2);
+    expect.isEmpty.equals.isEmpty;
+    expect.isNotEmpty.equals.isNotEmpty;
+    expect.keys.equals.keys;
+    expect.length.equals.length;
+    expect.putIfAbsent(val, func0).equals.putIfAbsent(val, func0);
+    expect.remove(val).equals.remove(val);
+    expect.values.equals.values;
+    expect.toString().equals.toString();
+  }
+
+  // Runs tests of Set behavior.
+  //
+  // [setUpSet] should return a set with two elements: "foo" and "bar".
+  void testTwoElementSet(Set<String> setUpSet()) {
+    group("with two elements", () {
+      var set;
+      setUp(() => set = setUpSet());
+
+      test(".any", () {
+        expect(set.any((element) => element == "foo"), isTrue);
+        expect(set.any((element) => element == "baz"), isFalse);
+      });
+
+      test(".elementAt", () {
+        expect(set.elementAt(0), equals("foo"));
+        expect(set.elementAt(1), equals("bar"));
+        expect(() => set.elementAt(2), throwsRangeError);
+      });
+
+      test(".every", () {
+        expect(set.every((element) => element == "foo"), isFalse);
+        expect(set.every((element) => element is String), isTrue);
+      });
+
+      test(".expand", () {
+        expect(set.expand((element) {
+          return [element.substring(0, 1), element.substring(1)];
+        }), equals(["f", "oo", "b", "ar"]));
+      });
+
+      test(".first", () {
+        expect(set.first, equals("foo"));
+      });
+
+      test(".firstWhere", () {
+        expect(set.firstWhere((element) => element is String), equals("foo"));
+        expect(set.firstWhere((element) => element.startsWith("b")),
+            equals("bar"));
+        expect(() => set.firstWhere((element) => element is int),
+            throwsStateError);
+        expect(set.firstWhere((element) => element is int, orElse: () => "baz"),
+            equals("baz"));
+      });
+
+      test(".fold", () {
+        expect(set.fold("start", (previous, element) => previous + element),
+            equals("startfoobar"));
+      });
+
+      test(".forEach", () {
+        var values = [];
+        set.forEach(values.add);
+        expect(values, equals(["foo", "bar"]));
+      });
+
+      test(".iterator", () {
+        var values = [];
+        for (var element in set) {
+          values.add(element);
+        }
+        expect(values, equals(["foo", "bar"]));
+      });
+
+      test(".join", () {
+        expect(set.join(", "), equals("foo, bar"));
+      });
+
+      test(".last", () {
+        expect(set.last, equals("bar"));
+      });
+
+      test(".lastWhere", () {
+        expect(set.lastWhere((element) => element is String), equals("bar"));
+        expect(set.lastWhere((element) => element.startsWith("f")),
+            equals("foo"));
+        expect(() => set.lastWhere((element) => element is int),
+            throwsStateError);
+        expect(set.lastWhere((element) => element is int, orElse: () => "baz"),
+            equals("baz"));
+      });
+
+      test(".map", () {
+        expect(set.map((element) => element.substring(1)),
+            equals(["oo", "ar"]));
+      });
+
+      test(".reduce", () {
+        expect(set.reduce((previous, element) => previous + element),
+            equals("foobar"));
+      });
+
+      test(".singleWhere", () {
+        expect(() => set.singleWhere((element) => element == "baz"),
+            throwsStateError);
+        expect(set.singleWhere((element) => element == "foo"),
+            "foo");
+        expect(() => set.singleWhere((element) => element is String),
+            throwsStateError);
+      });
+
+      test(".skip", () {
+        expect(set.skip(0), equals(["foo", "bar"]));
+        expect(set.skip(1), equals(["bar"]));
+        expect(set.skip(2), equals([]));
+      });
+
+      test(".skipWhile", () {
+        expect(set.skipWhile((element) => element.startsWith("f")),
+            equals(["bar"]));
+        expect(set.skipWhile((element) => element.startsWith("z")),
+            equals(["foo", "bar"]));
+        expect(set.skipWhile((element) => element is String),
+            equals([]));
+      });
+
+      test(".take", () {
+        expect(set.take(0), equals([]));
+        expect(set.take(1), equals(["foo"]));
+        expect(set.take(2), equals(["foo", "bar"]));
+      });
+
+      test(".takeWhile", () {
+        expect(set.takeWhile((element) => element.startsWith("f")),
+            equals(["foo"]));
+        expect(set.takeWhile((element) => element.startsWith("z")),
+            equals([]));
+        expect(set.takeWhile((element) => element is String),
+            equals(["foo", "bar"]));
+      });
+
+      test(".toList", () {
+        expect(set.toList(), equals(["foo", "bar"]));
+        expect(() => set.toList(growable: false).add("baz"),
+            throwsUnsupportedError);
+        expect(set.toList()..add("baz"), equals(["foo", "bar", "baz"]));
+      });
+
+      test(".toSet", () {
+        expect(set.toSet(), equals(new Set.from(["foo", "bar"])));
+      });
+
+      test(".where", () {
+        expect(set.where((element) => element.startsWith("f")),
+            equals(["foo"]));
+        expect(set.where((element) => element.startsWith("z")), equals([]));
+        expect(set.where((element) => element is String),
+            equals(["foo", "bar"]));
+      });
+
+      test(".containsAll", () {
+        expect(set.containsAll(["foo", "bar"]), isTrue);
+        expect(set.containsAll(["foo"]), isTrue);
+        expect(set.containsAll(["foo", "bar", "qux"]), isFalse);
+      });
+
+      test(".difference", () {
+        expect(set.difference(new Set.from(["foo", "baz"])),
+            equals(new Set.from(["bar"])));
+      });
+
+      test(".intersection", () {
+        expect(set.intersection(new Set.from(["foo", "baz"])),
+            equals(new Set.from(["foo"])));
+      });
+
+      test(".union", () {
+        expect(set.union(new Set.from(["foo", "baz"])),
+            equals(new Set.from(["foo", "bar", "baz"])));
+      });
+    });
+  }
+
+  test("Iterable", () {
+    testIterable(new IterableExpector());
+  });
+
+  test("List", () {
+    testList(new ListExpector());
+  });
+
+  test("Set", () {
+    testSet(new SetExpector());
+  });
+
+  test("Queue", () {
+    testQueue(new QueueExpector());
+  });
+
+  test("Map", () {
+    testMap(new MapExpector());
+  });
+
+  group("MapKeySet", () {
+    var map;
+    var set;
+
+    setUp(() {
+      map = new Map<String, int>();
+      set = new MapKeySet<String>(map);
+    });
+
+    testTwoElementSet(() {
+      map["foo"] = 1;
+      map["bar"] = 2;
+      return set;
+    });
+
+    test(".single", () {
+      expect(() => set.single, throwsStateError);
+      map["foo"] = 1;
+      expect(set.single, equals("foo"));
+      map["bar"] = 1;
+      expect(() => set.single, throwsStateError);
+    });
+
+    test(".toString", () {
+      expect(set.toString(), equals("{}"));
+      map["foo"] = 1;
+      map["bar"] = 2;
+      expect(set.toString(), equals("{foo, bar}"));
+    });
+
+    test(".contains", () {
+      expect(set.contains("foo"), isFalse);
+      map["foo"] = 1;
+      expect(set.contains("foo"), isTrue);
+    });
+
+    test(".isEmpty", () {
+      expect(set.isEmpty, isTrue);
+      map["foo"] = 1;
+      expect(set.isEmpty, isFalse);
+    });
+
+    test(".isNotEmpty", () {
+      expect(set.isNotEmpty, isFalse);
+      map["foo"] = 1;
+      expect(set.isNotEmpty, isTrue);
+    });
+
+    test(".length", () {
+      expect(set, hasLength(0));
+      map["foo"] = 1;
+      expect(set, hasLength(1));
+      map["bar"] = 2;
+      expect(set, hasLength(2));
+    });
+
+    test("is unmodifiable", () {
+      expect(() => set.add("baz"), throwsUnsupportedError);
+      expect(() => set.addAll(["baz", "bang"]), throwsUnsupportedError);
+      expect(() => set.remove("foo"), throwsUnsupportedError);
+      expect(() => set.removeAll(["baz", "bang"]), throwsUnsupportedError);
+      expect(() => set.retainAll(["foo"]), throwsUnsupportedError);
+      expect(() => set.removeWhere((_) => true), throwsUnsupportedError);
+      expect(() => set.retainWhere((_) => true), throwsUnsupportedError);
+      expect(() => set.clear(), throwsUnsupportedError);
+    });
+  });
+
+  group("MapValueSet", () {
+    var map;
+    var set;
+
+    setUp(() {
+      map = new Map<String, String>();
+      set = new MapValueSet<String, String>(map,
+          (string) => string.substring(0, 1));
+    });
+
+    testTwoElementSet(() {
+      map["f"] = "foo";
+      map["b"] = "bar";
+      return set;
+    });
+
+    test(".single", () {
+      expect(() => set.single, throwsStateError);
+      map["f"] = "foo";
+      expect(set.single, equals("foo"));
+      map["b"] = "bar";
+      expect(() => set.single, throwsStateError);
+    });
+
+    test(".toString", () {
+      expect(set.toString(), equals("{}"));
+      map["f"] = "foo";
+      map["b"] = "bar";
+      expect(set.toString(), equals("{foo, bar}"));
+    });
+
+    test(".contains", () {
+      expect(set.contains("foo"), isFalse);
+      map["f"] = "foo";
+      expect(set.contains("foo"), isTrue);
+      expect(set.contains("fblthp"), isTrue);
+    });
+
+    test(".isEmpty", () {
+      expect(set.isEmpty, isTrue);
+      map["f"] = "foo";
+      expect(set.isEmpty, isFalse);
+    });
+
+    test(".isNotEmpty", () {
+      expect(set.isNotEmpty, isFalse);
+      map["f"] = "foo";
+      expect(set.isNotEmpty, isTrue);
+    });
+
+    test(".length", () {
+      expect(set, hasLength(0));
+      map["f"] = "foo";
+      expect(set, hasLength(1));
+      map["b"] = "bar";
+      expect(set, hasLength(2));
+    });
+
+    test(".lookup", () {
+      map["f"] = "foo";
+      expect(set.lookup("fblthp"), equals("foo"));
+      expect(set.lookup("bar"), isNull);
+    });
+
+    test(".add", () {
+      set.add("foo");
+      set.add("bar");
+      expect(map, equals({"f": "foo", "b": "bar"}));
+    });
+
+    test(".addAll", () {
+      set.addAll(["foo", "bar"]);
+      expect(map, equals({"f": "foo", "b": "bar"}));
+    });
+
+    test(".clear", () {
+      map["f"] = "foo";
+      map["b"] = "bar";
+      set.clear();
+      expect(map, isEmpty);
+    });
+
+    test(".remove", () {
+      map["f"] = "foo";
+      map["b"] = "bar";
+      set.remove("fblthp");
+      expect(map, equals({"b": "bar"}));
+    });
+
+    test(".removeAll", () {
+      map["f"] = "foo";
+      map["b"] = "bar";
+      map["q"] = "qux";
+      set.removeAll(["fblthp", "qux"]);
+      expect(map, equals({"b": "bar"}));
+    });
+
+    test(".removeWhere", () {
+      map["f"] = "foo";
+      map["b"] = "bar";
+      map["q"] = "qoo";
+      set.removeWhere((element) => element.endsWith("o"));
+      expect(map, equals({"b": "bar"}));
+    });
+
+    test(".retainAll", () {
+      map["f"] = "foo";
+      map["b"] = "bar";
+      map["q"] = "qux";
+      set.retainAll(["fblthp", "qux"]);
+      expect(map, equals({"f": "foo", "q": "qux"}));
+    });
+
+    test(".retainAll respects an unusual notion of equality", () {
+      map = new HashMap<String, String>(
+          equals: (value1, value2) =>
+              value1.toLowerCase() == value2.toLowerCase(),
+          hashCode: (value) => value.toLowerCase().hashCode);
+      set = new MapValueSet<String, String>(map,
+          (string) => string.substring(0, 1));
+
+      map["f"] = "foo";
+      map["B"] = "bar";
+      map["Q"] = "qux";
+      set.retainAll(["fblthp", "qux"]);
+      expect(map, equals({"f": "foo", "Q": "qux"}));
+    });
+
+    test(".retainWhere", () {
+      map["f"] = "foo";
+      map["b"] = "bar";
+      map["q"] = "qoo";
+      set.retainWhere((element) => element.endsWith("o"));
+      expect(map, equals({"f": "foo", "q": "qoo"}));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/crypto/.gitignore b/mojo/public/dart/third_party/crypto/.gitignore
new file mode 100644
index 0000000..25a1df3
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/.gitignore
@@ -0,0 +1,9 @@
+.buildlog
+.DS_Store
+.idea
+.pub/
+.settings/
+build/
+packages
+.packages
+pubspec.lock
diff --git a/mojo/public/dart/third_party/crypto/.status b/mojo/public/dart/third_party/crypto/.status
new file mode 100644
index 0000000..ebc5f81
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/.status
@@ -0,0 +1,12 @@
+# Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Skip non-test files ending with "_test".
+packages/*: Skip
+*/packages/*: Skip
+*/*/packages/*: Skip
+*/*/*/packages/*: Skip
+*/*/*/*packages/*: Skip
+*/*/*/*/*packages/*: Skip
+
diff --git a/mojo/public/dart/third_party/crypto/AUTHORS b/mojo/public/dart/third_party/crypto/AUTHORS
new file mode 100644
index 0000000..e8063a8
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/AUTHORS
@@ -0,0 +1,6 @@
+# Below is a list of people and organizations that have contributed
+# to the project. Names should be added to the list like so:
+#
+#   Name/Organization <email address>
+
+Google Inc.
diff --git a/mojo/public/dart/third_party/crypto/CHANGELOG.md b/mojo/public/dart/third_party/crypto/CHANGELOG.md
new file mode 100644
index 0000000..229efd0
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/CHANGELOG.md
@@ -0,0 +1,11 @@
+# Changelog
+
+## 0.9.1
+
+* Base64 convert returns an Uint8List
+* Base64 codec and encoder can now take an encodePaddingCharacter
+* Implement a Base64 codec similar to codecs in 'dart:convert'
+
+## 0.9.0
+
+* ChangeLog starts here.
diff --git a/mojo/public/dart/third_party/crypto/CONTRIBUTING.md b/mojo/public/dart/third_party/crypto/CONTRIBUTING.md
new file mode 100644
index 0000000..6f5e0ea
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/CONTRIBUTING.md
@@ -0,0 +1,33 @@
+Want to contribute? Great! First, read this page (including the small print at
+the end).
+
+### Before you contribute
+Before we can use your code, you must sign the
+[Google Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual)
+(CLA), which you can do online. The CLA is necessary mainly because you own the
+copyright to your changes, even after your contribution becomes part of our
+codebase, so we need your permission to use and distribute your code. We also
+need to be sure of various other things—for instance that you'll tell us if you
+know that your code infringes on other people's patents. You don't have to sign
+the CLA until after you've submitted your code for review and a member has
+approved it, but you must do it before we can put your code into our codebase.
+
+Before you start working on a larger contribution, you should get in touch with
+us first through the issue tracker with your idea so that we can help out and
+possibly guide you. Coordinating up front makes it much easier to avoid
+frustration later on.
+
+### Code reviews
+All submissions, including submissions by project members, require review.
+
+### File headers
+All files in the project must start with the following header.
+
+    // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+    // for details. All rights reserved. Use of this source code is governed by a
+    // BSD-style license that can be found in the LICENSE file.
+
+### The small print
+Contributions made by corporations are covered by a different agreement than the
+one above, the
+[Software Grant and Corporate Contributor License Agreement](https://developers.google.com/open-source/cla/corporate).
diff --git a/mojo/public/dart/third_party/crypto/LICENSE b/mojo/public/dart/third_party/crypto/LICENSE
new file mode 100644
index 0000000..de31e1a
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2015, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/crypto/README.md b/mojo/public/dart/third_party/crypto/README.md
new file mode 100644
index 0000000..e12ded8
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/README.md
@@ -0,0 +1,22 @@
+# Library of cryptographic functions for Dart
+
+A set of cryptographic functions implemented in pure Dart.
+
+* MD5
+* SHA1
+* SHA265
+* Converting a list of bytes into a hex string
+* Converting a list of bytes into a base64-encoded string.
+* Converting a Base 64 encoded String into list of bytes.
+
+## Disclaimer
+
+Support for this library is given as _best effort_.
+
+This library has not been reviewed or vetted by security professionals.
+
+## Features and bugs
+
+Please file feature requests and bugs at the [issue tracker][tracker].
+
+[tracker]: https://github.com/dart-lang/crypto/issues
diff --git a/mojo/public/dart/third_party/crypto/codereview.settings b/mojo/public/dart/third_party/crypto/codereview.settings
new file mode 100644
index 0000000..6a07542
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: http://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/crypto/commit/
+CC_LIST: reviews@dartlang.org
diff --git a/mojo/public/dart/third_party/crypto/lib/crypto.dart b/mojo/public/dart/third_party/crypto/lib/crypto.dart
new file mode 100644
index 0000000..eb2905a
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/lib/crypto.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Cryptographic algorithms, with support for hash functions such as
+ * SHA-1, SHA-256, HMAC, and MD5.
+ */
+library crypto;
+
+import 'dart:math';
+import 'dart:typed_data';
+import 'dart:convert';
+
+part 'src/crypto_utils.dart';
+part 'src/hash_utils.dart';
+part 'src/hmac.dart';
+part 'src/md5.dart';
+part 'src/sha1.dart';
+part 'src/sha256.dart';
+part 'src/base64.dart';
+
+/**
+ * Interface for cryptographic hash functions.
+ *
+ * The [add] method is used to add data to the hash. The [close] method
+ * is used to extract the message digest.
+ *
+ * Once the [close] method has been called no more data can be added using the
+ * [add] method. If [add] is called after the first call to [close] a
+ * HashException is thrown.
+ *
+ * If multiple instances of a given Hash is needed the [newInstance]
+ * method can provide a new instance.
+ */
+// TODO(floitsch): make Hash implement Sink, EventSink or similar.
+abstract class Hash {
+  /**
+   * Add a list of bytes to the hash computation.
+   */
+  void add(List<int> data);
+
+  /**
+   * Finish the hash computation and extract the message digest as
+   * a list of bytes.
+   */
+  List<int> close();
+
+  /**
+   * Returns a new instance of this hash function.
+   */
+  Hash newInstance();
+
+  /**
+   * Internal block size of the hash in bytes.
+   *
+   * This is exposed for use by the HMAC class which needs to know the
+   * block size for the [Hash] it is using.
+   */
+  int get blockSize;
+}
+
+/**
+ * Utility methods for working with message digests.
+ */
+class CryptoUtils {
+  /**
+   * Convert a list of bytes (for example a message digest) into a hex
+   * string.
+   */
+  static String bytesToHex(List<int> bytes) {
+    return _CryptoUtils.bytesToHex(bytes);
+  }
+
+  /**
+   * Converts a list of bytes into a Base 64 encoded string.
+   *
+   * The list can be any list of integers in the range 0..255,
+   * for example a message digest.
+   *
+   * If [addLineSeparator] is true, the resulting string will  be
+   * broken into lines of 76 characters, separated by "\r\n".
+   *
+   * If [urlSafe] is true, the result is URL and filename safe.
+   *
+   * Based on [RFC 4648](http://tools.ietf.org/html/rfc4648)
+   *
+   */
+  static String bytesToBase64(List<int> bytes,
+                              {bool urlSafe : false,
+                               bool addLineSeparator : false}) {
+    return _CryptoUtils.bytesToBase64(bytes,
+                                      urlSafe,
+                                      addLineSeparator);
+  }
+
+
+  /**
+   * Converts a Base 64 encoded String into list of bytes.
+   *
+   * Decoder ignores "\r\n" sequences from input.
+   *
+   * Accepts both URL safe and unsafe Base 64 encoded strings.
+   *
+   * Throws a FormatException exception if input contains invalid characters.
+   *
+   * Based on [RFC 4648](http://tools.ietf.org/html/rfc4648)
+   */
+  static List<int> base64StringToBytes(String input) {
+    return _CryptoUtils.base64StringToBytes(input);
+  }
+}
diff --git a/mojo/public/dart/third_party/crypto/lib/src/base64.dart b/mojo/public/dart/third_party/crypto/lib/src/base64.dart
new file mode 100644
index 0000000..92a8275
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/lib/src/base64.dart
@@ -0,0 +1,399 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of crypto;
+
+const Base64Codec BASE64 = const Base64Codec();
+
+const List<int> _decodeTable =
+      const [ -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -2, -2, -1, -2, -2,
+              -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+              -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 62, -2, 62, -2, 63,
+              52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2,  0, -2, -2,
+              -2,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
+              15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -2, -2, -2, -2, 63,
+              -2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
+              41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2,
+              -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+              -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+              -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+              -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+              -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+              -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+              -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+              -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2 ];
+
+const String _encodeTableUrlSafe =
+      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
+
+const String _encodeTable =
+      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+const int _LINE_LENGTH = 76;
+const int _CR = 13;  // '\r'
+const int _LF = 10;  // '\n'
+const List<int> _PAD_BYTES = const [61]; // '='
+const List<int> _ENCODED_PAD_BYTES = const [37, 51, 68]; // '%3D'
+const String _PAD = "=";
+const String _ENCODED_PAD = "%3D";
+
+class Base64Codec extends Codec<List<int>, String> {
+
+  final bool _urlSafe;
+  final bool _addLineSeparator;
+  final bool _encodePaddingCharacter;
+
+  /**
+   * Instantiates a new [Base64Codec].
+   *
+   * The optional [urlSafe] argument specifies if [encoder] and [encode]
+   * should generate a string, that is safe to use in an URL.
+   *
+   * If [urlSafe] is `true` (and not overriden at the method invocation)
+   * the [encoder] and [encode] use '-' instead of '+' and '_' instead of '/'.
+   *
+   * The default value of [urlSafe] is `false`.
+   *
+   * The optional [addLineSeparator] argument specifies if the [encoder] and
+   * [encode] should add line separators.
+   *
+   * If `addLineSeparator` is `true` [encode] adds an
+   * optional line separator (CR + LF) for each 76 char output.
+   *
+   * The default value of [addLineSeparator] if `false`.
+   *
+   * If [encodePaddingCharacter] is `true` `encode` converts `=` to `%3D`.
+   * The default value of [encodePaddingCharacter] is `false`.
+   */
+  const Base64Codec({bool urlSafe: false,
+                     bool addLineSeparator: false,
+                     bool encodePaddingCharacter: false})
+      : _urlSafe = urlSafe,
+        _addLineSeparator = addLineSeparator,
+        _encodePaddingCharacter = encodePaddingCharacter;
+
+  String get name => "base64";
+
+  String encode(List<int> bytes,
+                {bool urlSafe,
+                 bool addLineSeparator,
+                 bool encodePaddingCharacter}) {
+    if (urlSafe == null) urlSafe = _urlSafe;
+    if (addLineSeparator == null) addLineSeparator = _addLineSeparator;
+    if (encodePaddingCharacter == null) {
+      encodePaddingCharacter = _encodePaddingCharacter;
+    }
+    return new Base64Encoder(
+                   urlSafe: urlSafe,
+                   addLineSeparator: addLineSeparator,
+                   encodePaddingCharacter: encodePaddingCharacter)
+                 .convert(bytes);
+
+
+  }
+
+  Base64Encoder get encoder =>
+      new Base64Encoder(urlSafe: _urlSafe,
+                        addLineSeparator: _addLineSeparator,
+                        encodePaddingCharacter: _encodePaddingCharacter);
+
+  Base64Decoder get decoder => new Base64Decoder();
+
+}
+
+/**
+ * This class encodes byte strings (lists of unsigned
+ * 8-bit integers) to strings according to Base64.
+ */
+class Base64Encoder extends Converter<List<int>, String> {
+  final bool _urlSafe;
+  final bool _addLineSeparator;
+  final bool _encodePaddingCharacter;
+  final List<int> _pad;
+
+  /**
+   * Instantiates a new [Base64Encoder].
+   *
+   * The optional [urlSafe] argument specifies if [convert]
+   * should generate a string, that is safe to use in an URL.
+   *
+   * If it is `true` the [convert] use
+   * '-' instead of '+' and '_' instead of '/'.
+   *
+   * The default value of [urlSafe] is `false`.
+   *
+   * The optional [addLineSeparator] argument specifies if [convert]
+   * should add line separators.
+   *
+   * If it is `true` [convert] adds an optional line separator(CR + LF)
+   * for each 76 char output.
+   *
+   * The default value of [addLineSeparator] if `false`.
+   *
+   * If [encodePaddingCharacter] is `true` `encode` converts `=` to `%3D`.
+   * The default value of [encodePaddingCharacter] is `false`.
+   */
+  const Base64Encoder({bool urlSafe: false,
+                       bool addLineSeparator: false,
+                       bool encodePaddingCharacter: false})
+      : _urlSafe = urlSafe,
+        _addLineSeparator = addLineSeparator,
+        _encodePaddingCharacter = encodePaddingCharacter,
+        _pad = encodePaddingCharacter == true ? _ENCODED_PAD_BYTES : _PAD_BYTES;
+
+  /**
+   * Converts [bytes] to its Base64 representation as a string.
+   *
+   * if [start] and [end] are provided, only the sublist
+   * `bytes.sublist(start, end)` is converted.
+   */
+  String convert(List<int> bytes, [int start = 0, int end]) {
+    int bytes_length = bytes.length;
+    RangeError.checkValidRange(start, end, bytes_length);
+    if (end == null) end = bytes_length;
+    int length = end - start;
+    if (length == 0) {
+      return "";
+    }
+    final String lookup = _urlSafe ? _encodeTableUrlSafe : _encodeTable;
+    // Size of 24 bit chunks.
+    final int remainderLength = length.remainder(3);
+    final int chunkLength = length - remainderLength;
+    // Size of base output.
+    int baseOutputLength = ((length ~/ 3) * 4);
+    int remainderOutputLength;
+    if(_encodePaddingCharacter) {
+      remainderOutputLength = ((remainderLength > 0) ? 6 : 0);
+    } else {
+      remainderOutputLength = ((remainderLength > 0) ? 4 : 0);
+    }
+
+    int outputLength = baseOutputLength + remainderOutputLength;
+    // Add extra for line separators.
+    if (_addLineSeparator) {
+      outputLength += ((outputLength - 1) ~/ _LINE_LENGTH) << 1;
+    }
+    List<int> out = new List<int>(outputLength);
+
+    // Encode 24 bit chunks.
+    int j = 0, i = start, c = 0;
+    while (i < chunkLength) {
+      int x = ((bytes[i++] << 16) & 0x00FFFFFF) |
+              ((bytes[i++] << 8) & 0x00FFFFFF) |
+                bytes[i++];
+      out[j++] = lookup.codeUnitAt(x >> 18);
+      out[j++] = lookup.codeUnitAt((x >> 12) & 0x3F);
+      out[j++] = lookup.codeUnitAt((x >> 6)  & 0x3F);
+      out[j++] = lookup.codeUnitAt(x & 0x3F);
+      // Add optional line separator for each 76 char output.
+      if (_addLineSeparator && ++c == 19 && j < outputLength - 2) {
+        out[j++] = _CR;
+        out[j++] = _LF;
+        c = 0;
+      }
+    }
+
+    // If input length if not a multiple of 3, encode remaining bytes and
+    // add padding.
+    if (remainderLength == 1) {
+      int x = bytes[i];
+      out[j++] = lookup.codeUnitAt(x >> 2);
+      out[j++] = lookup.codeUnitAt((x << 4) & 0x3F);
+      out.setRange(j, j + _pad.length, _pad);
+      out.setRange(j + _pad.length, j + 2 * _pad.length, _pad);
+    } else if (remainderLength == 2) {
+      int x = bytes[i];
+      int y = bytes[i + 1];
+      out[j++] = lookup.codeUnitAt(x >> 2);
+      out[j++] = lookup.codeUnitAt(((x << 4) | (y >> 4)) & 0x3F);
+      out[j++] = lookup.codeUnitAt((y << 2) & 0x3F);
+      out.setRange(j, j + _pad.length, _pad);
+    }
+
+    return new String.fromCharCodes(out);
+  }
+
+  _Base64EncoderSink startChunkedConversion(Sink<String> sink) {
+    StringConversionSink stringSink;
+    if (sink is StringConversionSink) {
+      stringSink = sink;
+    } else {
+      stringSink = new StringConversionSink.from(sink);
+    }
+    return new _Base64EncoderSink(stringSink, _urlSafe, _addLineSeparator);
+  }
+}
+
+class _Base64EncoderSink extends ChunkedConversionSink<List<int>> {
+
+  final Base64Encoder _encoder;
+  final ChunkedConversionSink<String> _outSink;
+  final List<int> _buffer = new List<int>();
+  int _bufferCount = 0;
+
+  _Base64EncoderSink(this._outSink, urlSafe, addLineSeparator)
+      : _encoder = new Base64Encoder(urlSafe: urlSafe,
+                                     addLineSeparator: addLineSeparator);
+
+
+  void add(List<int> chunk) {
+    var nextBufferCount = (chunk.length + _bufferCount) % 3;
+
+    int decodableLength = _bufferCount + chunk.length - nextBufferCount;
+
+    if (_bufferCount + chunk.length > _buffer.length) {
+      _buffer.replaceRange(_bufferCount,
+                           _buffer.length,
+                           chunk.sublist(0, _buffer.length - _bufferCount));
+      _buffer.addAll(chunk.sublist(_buffer.length - _bufferCount));
+    } else {
+      _buffer.replaceRange(_bufferCount, _bufferCount + chunk.length, chunk);
+    }
+
+    _outSink.add(_encoder.convert(_buffer, 0, decodableLength));
+    _buffer.removeRange(0, decodableLength);
+    _bufferCount = nextBufferCount;
+  }
+
+  void close() {
+    if (_bufferCount > 0) {
+      _outSink.add(_encoder.convert(_buffer.sublist(0, _bufferCount)));
+    }
+    _outSink.close();
+  }
+}
+
+/**
+ * This class decodes strings to lists of bytes(lists of
+ * unsigned 8-bit integers) according to Base64.
+ */
+class Base64Decoder extends Converter<String, List<int>> {
+
+  /**
+   * Instantiates a new [Base64Decoder]
+   */
+  const Base64Decoder();
+
+  List<int> convert(String input) {
+    int length = input.length;
+    if (length == 0) {
+      return new Uint8List(0);
+    }
+
+    int normalLength = 0;
+    int i = 0;
+    // Count '\r', '\n' and illegal characters, check if
+    // '/', '+' / '-', '_' are used consistently, for illegal characters,
+    // throw an exception.
+
+    while (i < length) {
+      int codeUnit = input.codeUnitAt(i);
+      int c = _decodeTable[codeUnit];
+      if (c == -2) {
+        if (codeUnit == _ENCODED_PAD_BYTES[0] &&
+            i < length - 2 &&
+            input.codeUnitAt(i + 1) == _ENCODED_PAD_BYTES[1] &&
+            input.codeUnitAt(i + 2) == _ENCODED_PAD_BYTES[2]) {
+          normalLength++;
+          i += 2;
+        } else {
+          throw new FormatException('Invalid character', input, i);
+        }
+      }
+      if (c >= 0) normalLength++;
+      i++;
+    }
+
+    if (normalLength % 4 != 0) {
+      throw new FormatException('''Size of Base 64 characters in Input
+          must be a multiple of 4''', input, normalLength);
+    }
+
+    // Count pad characters.
+    int padLength = 0;
+    i = length - 1;
+    while(i >= 0) {
+      int currentCodeUnit = input.codeUnitAt(i);
+      if (currentCodeUnit == _ENCODED_PAD_BYTES[2] &&
+                i >= 2 &&
+                input.codeUnitAt(i - 1) == _ENCODED_PAD_BYTES[1] &&
+                input.codeUnitAt(i - 2) == _ENCODED_PAD_BYTES[0]) {
+        padLength++;
+        i -= 2;
+      } else if (_decodeTable[currentCodeUnit] > 0) {
+        break;
+      } else if (currentCodeUnit == _PAD_BYTES[0]) {
+        padLength++;
+      }
+      i--;
+    }
+    int outputLength = ((normalLength * 6) >> 3) - padLength;
+    List<int> out = new Uint8List(outputLength);
+
+    for (int i = 0, o = 0; o < outputLength; ) {
+      // Accumulate 4 valid 6 bit Base 64 characters into an int.
+      int x = 0;
+      for (int j = 4; j > 0; ) {
+        int c = _decodeTable[input.codeUnitAt(i++)];
+        if (c >= 0) {
+          x = ((x << 6) & 0x00FFFFFF) | c;
+          j--;
+        }
+      }
+      out[o++] = x >> 16;
+      if (o < outputLength) {
+        out[o++] = (x >> 8) & 0xFF;
+        if (o < outputLength) out[o++] = x & 0xFF;
+      }
+    }
+
+    return out;
+  }
+
+  _Base64DecoderSink startChunkedConversion(Sink<List<int>> sink) {
+    if (sink is! ByteConversionSink) {
+      sink = new ByteConversionSink.from(sink);
+    }
+    return new _Base64DecoderSink(sink);
+  }
+}
+
+
+class _Base64DecoderSink extends ChunkedConversionSink<String> {
+
+  final Base64Decoder _decoder = new Base64Decoder();
+  final ChunkedConversionSink<List<int>> _outSink;
+  String _unconverted = "";
+
+  _Base64DecoderSink(this._outSink);
+
+  void add(String chunk) {
+    if (chunk.isEmpty) return;
+    if (_unconverted.isNotEmpty) {
+      chunk = _unconverted + chunk;
+    }
+    chunk = chunk.replaceAll(_ENCODED_PAD, _PAD);
+    int decodableLength = chunk.length;
+     // If chunk ends in "%" or "%3", it may be a partial encoded pad.
+     // If chunk is smaller than 4 characters, don't bother checking.
+    if (chunk.length > 3 &&
+      chunk.contains(_ENCODED_PAD[0], chunk.length - 2)) {
+      decodableLength = chunk.lastIndexOf(_ENCODED_PAD[0]);
+    }
+    decodableLength -= decodableLength % 4;
+    _unconverted = chunk.substring(decodableLength);
+    if (decodableLength > 0) {
+      _outSink.add(_decoder.convert(chunk.substring(0, decodableLength)));
+    }
+  }
+
+  void close() {
+    if (_unconverted.isNotEmpty) {
+      _outSink.add(_decoder.convert(_unconverted));
+    }
+    _outSink.close();
+  }
+}
+
+
diff --git a/mojo/public/dart/third_party/crypto/lib/src/crypto_utils.dart b/mojo/public/dart/third_party/crypto/lib/src/crypto_utils.dart
new file mode 100644
index 0000000..7111d6f
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/lib/src/crypto_utils.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of crypto;
+
+abstract class _CryptoUtils {
+  static String bytesToHex(List<int> bytes) {
+    var result = new StringBuffer();
+    for (var part in bytes) {
+      result.write('${part < 16 ? '0' : ''}${part.toRadixString(16)}');
+    }
+    return result.toString();
+  }
+
+  static String bytesToBase64(List<int> bytes,
+                              [bool urlSafe = false,
+                               bool addLineSeparator = false]) {
+    return BASE64.encode(bytes,
+                         urlSafe: urlSafe,
+                         addLineSeparator: addLineSeparator);
+  }
+
+  static List<int> base64StringToBytes(String input) {
+    return BASE64.decode(input);
+  }
+}
diff --git a/mojo/public/dart/third_party/crypto/lib/src/hash_utils.dart b/mojo/public/dart/third_party/crypto/lib/src/hash_utils.dart
new file mode 100644
index 0000000..12bcb0d
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/lib/src/hash_utils.dart
@@ -0,0 +1,151 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of crypto;
+
+// Constants.
+const _MASK_8 = 0xff;
+const _MASK_32 = 0xffffffff;
+const _BITS_PER_BYTE = 8;
+const _BYTES_PER_WORD = 4;
+
+// Helper functions used by more than one hasher.
+
+// Rotate left limiting to unsigned 32-bit values.
+int _rotl32(int val, int shift) {
+  var mod_shift = shift & 31;
+  return ((val << mod_shift) & _MASK_32) |
+      ((val & _MASK_32) >> (32 - mod_shift));
+}
+
+// Base class encapsulating common behavior for cryptographic hash
+// functions.
+abstract class _HashBase implements Hash {
+  final int _chunkSizeInWords;
+  final int _digestSizeInWords;
+  final bool _bigEndianWords;
+  final Uint32List _currentChunk;
+  final Uint32List _h;
+  int _lengthInBytes = 0;
+  List<int> _pendingData;
+  bool _digestCalled = false;
+
+  _HashBase(int chunkSizeInWords,
+            int digestSizeInWords,
+            bool this._bigEndianWords)
+      : _pendingData = [],
+        _currentChunk = new Uint32List(chunkSizeInWords),
+        _h = new Uint32List(digestSizeInWords),
+        _chunkSizeInWords = chunkSizeInWords,
+        _digestSizeInWords = digestSizeInWords;
+
+  // Update the hasher with more data.
+  void add(List<int> data) {
+    if (_digestCalled) {
+      throw new StateError(
+          'Hash update method called after digest was retrieved');
+    }
+    _lengthInBytes += data.length;
+    _pendingData.addAll(data);
+    _iterate();
+  }
+
+  // Finish the hash computation and return the digest string.
+  List<int> close() {
+    if (_digestCalled) {
+      return _resultAsBytes();
+    }
+    _digestCalled = true;
+    _finalizeData();
+    _iterate();
+    assert(_pendingData.length == 0);
+    return _resultAsBytes();
+  }
+
+  // Returns the block size of the hash in bytes.
+  int get blockSize {
+    return _chunkSizeInWords * _BYTES_PER_WORD;
+  }
+
+  // One round of the hash computation.
+  void _updateHash(Uint32List m);
+
+  // Helper methods.
+  int _add32(x, y) => (x + y) & _MASK_32;
+  int _roundUp(val, n) => (val + n - 1) & -n;
+
+  // Compute the final result as a list of bytes from the hash words.
+  List<int> _resultAsBytes() {
+    var result = [];
+    for (var i = 0; i < _h.length; i++) {
+      result.addAll(_wordToBytes(_h[i]));
+    }
+    return result;
+  }
+
+  // Converts a list of bytes to a chunk of 32-bit words.
+  void _bytesToChunk(List<int> data, int dataIndex) {
+    assert((data.length - dataIndex) >= (_chunkSizeInWords * _BYTES_PER_WORD));
+
+    for (var wordIndex = 0; wordIndex < _chunkSizeInWords; wordIndex++) {
+      var w3 = _bigEndianWords ? data[dataIndex] : data[dataIndex + 3];
+      var w2 = _bigEndianWords ? data[dataIndex + 1] : data[dataIndex + 2];
+      var w1 = _bigEndianWords ? data[dataIndex + 2] : data[dataIndex + 1];
+      var w0 = _bigEndianWords ? data[dataIndex + 3] : data[dataIndex];
+      dataIndex += 4;
+      var word = (w3 & 0xff) << 24;
+      word |= (w2 & _MASK_8) << 16;
+      word |= (w1 & _MASK_8) << 8;
+      word |= (w0 & _MASK_8);
+      _currentChunk[wordIndex] = word;
+    }
+  }
+
+  // Convert a 32-bit word to four bytes.
+  List<int> _wordToBytes(int word) {
+    List bytes = new List<int>(_BYTES_PER_WORD);
+    bytes[0] = (word >> (_bigEndianWords ? 24 : 0)) & _MASK_8;
+    bytes[1] = (word >> (_bigEndianWords ? 16 : 8)) & _MASK_8;
+    bytes[2] = (word >> (_bigEndianWords ? 8 : 16)) & _MASK_8;
+    bytes[3] = (word >> (_bigEndianWords ? 0 : 24)) & _MASK_8;
+    return bytes;
+  }
+
+  // Iterate through data updating the hash computation for each
+  // chunk.
+  void _iterate() {
+    var len = _pendingData.length;
+    var chunkSizeInBytes = _chunkSizeInWords * _BYTES_PER_WORD;
+    if (len >= chunkSizeInBytes) {
+      var index = 0;
+      for (; (len - index) >= chunkSizeInBytes; index += chunkSizeInBytes) {
+        _bytesToChunk(_pendingData, index);
+        _updateHash(_currentChunk);
+      }
+      _pendingData = _pendingData.sublist(index, len);
+    }
+  }
+
+  // Finalize the data. Add a 1 bit to the end of the message. Expand with
+  // 0 bits and add the length of the message.
+  void _finalizeData() {
+    _pendingData.add(0x80);
+    var contentsLength = _lengthInBytes + 9;
+    var chunkSizeInBytes = _chunkSizeInWords * _BYTES_PER_WORD;
+    var finalizedLength = _roundUp(contentsLength, chunkSizeInBytes);
+    var zeroPadding = finalizedLength - contentsLength;
+    for (var i = 0; i < zeroPadding; i++) {
+      _pendingData.add(0);
+    }
+    var lengthInBits = _lengthInBytes * _BITS_PER_BYTE;
+    assert(lengthInBits < pow(2, 32));
+    if (_bigEndianWords) {
+      _pendingData.addAll(_wordToBytes(0));
+      _pendingData.addAll(_wordToBytes(lengthInBits & _MASK_32));
+    } else {
+      _pendingData.addAll(_wordToBytes(lengthInBits & _MASK_32));
+      _pendingData.addAll(_wordToBytes(0));
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/crypto/lib/src/hmac.dart b/mojo/public/dart/third_party/crypto/lib/src/hmac.dart
new file mode 100644
index 0000000..a4ea193
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/lib/src/hmac.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of crypto;
+
+/**
+ * Hash-based Message Authentication Code support.
+ *
+ * The [add] method is used to add data to the message. The [digest] and
+ * [close] methods are used to extract the message authentication code.
+ */
+// TODO(floitsch): make Hash implement Sink, EventSink or similar.
+class HMAC {
+  final List<int> _message;
+  Hash _hash;
+  List<int> _key;
+  bool _isClosed = false;
+
+  /**
+   * Create an [HMAC] object from a [Hash] and a key.
+   */
+  HMAC(Hash this._hash, List<int> this._key): _message = [];
+
+  /**
+   * Add a list of bytes to the message.
+   */
+  void add(List<int> data) {
+    if (_isClosed) throw new StateError("HMAC is closed");
+    _message.addAll(data);
+  }
+
+  /**
+   * Extract the message digest as a list of bytes without closing [this].
+   */
+  List<int> get digest {
+    var blockSize = _hash.blockSize;
+
+    // Hash the key if it is longer than the block size of the hash.
+    if (_key.length > blockSize) {
+      _hash = _hash.newInstance();
+      _hash.add(_key);
+      _key = _hash.close();
+    }
+
+    // Zero-pad the key until its size is equal to the block size of the hash.
+    if (_key.length < blockSize) {
+      var newKey = new List(blockSize);
+      newKey.setRange(0, _key.length, _key);
+      for (var i = _key.length; i < blockSize; i++) {
+        newKey[i] = 0;
+      }
+      _key = newKey;
+    }
+
+    // Compute inner padding.
+    var padding = new List(blockSize);
+    for (var i = 0; i < blockSize; i++) {
+      padding[i] = 0x36 ^ _key[i];
+    }
+
+    // Inner hash computation.
+    _hash = _hash.newInstance();
+    _hash.add(padding);
+    _hash.add(_message);
+    var innerHash = _hash.close();
+
+    // Compute outer padding.
+    for (var i = 0; i < blockSize; i++) {
+      padding[i] = 0x5c ^ _key[i];
+    }
+
+    // Outer hash computation which is the result.
+    _hash = _hash.newInstance();
+    _hash.add(padding);
+    _hash.add(innerHash);
+    return _hash.close();
+  }
+
+  /**
+   * Perform the actual computation and extract the message digest
+   * as a list of bytes.
+   */
+  List<int> close() {
+    _isClosed = true;
+    return digest;
+  }
+
+  /**
+   * Verify that the HMAC computed for the data so far matches the
+   * given message digest.
+   *
+   * This method should be used instead of memcmp-style comparisons
+   * to avoid leaking information via timing.
+   *
+   * Throws an exception if the given digest does not have the same
+   * size as the digest computed by this HMAC instance.
+   */
+  bool verify(List<int> digest) {
+    var computedDigest = this.digest;
+    if (digest.length != computedDigest.length) {
+      throw new ArgumentError(
+          'Invalid digest size: ${digest.length} in HMAC.verify. '
+          'Expected: ${_hash.blockSize}.');
+    }
+    int result = 0;
+    for (var i = 0; i < digest.length; i++) {
+      result |= digest[i] ^ computedDigest[i];
+    }
+    return result == 0;
+  }
+}
diff --git a/mojo/public/dart/third_party/crypto/lib/src/md5.dart b/mojo/public/dart/third_party/crypto/lib/src/md5.dart
new file mode 100644
index 0000000..54bf3be
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/lib/src/md5.dart
@@ -0,0 +1,87 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of crypto;
+
+/**
+ * MD5 hash function implementation.
+ *
+ * WARNING: MD5 has known collisions and should only be used when
+ * required for backwards compatibility.
+ */
+class MD5 extends _HashBase {
+  MD5(): super(16, 4, false) {
+    _h[0] = 0x67452301;
+    _h[1] = 0xefcdab89;
+    _h[2] = 0x98badcfe;
+    _h[3] = 0x10325476;
+  }
+
+  // Returns a new instance of this Hash.
+  MD5 newInstance() {
+    return new MD5();
+  }
+
+  static const _k = const [
+    0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a,
+    0xa8304613, 0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
+    0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, 0xf61e2562, 0xc040b340,
+    0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,
+    0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8,
+    0x676f02d9, 0x8d2a4c8a, 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
+    0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, 0x289b7ec6, 0xeaa127fa,
+    0xd4ef3085, 0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
+    0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92,
+    0xffeff47d, 0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
+    0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 ];
+
+  static const _r = const [
+    7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5,  9, 14,
+    20, 5,  9, 14, 20, 5,  9, 14, 20, 5,  9, 14, 20, 4, 11, 16, 23, 4, 11,
+    16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6,
+    10, 15, 21, 6, 10, 15, 21 ];
+
+  // Compute one iteration of the MD5 algorithm with a chunk of
+  // 16 32-bit pieces.
+  void _updateHash(Uint32List m) {
+    assert(m.length == 16);
+
+    var a = _h[0];
+    var b = _h[1];
+    var c = _h[2];
+    var d = _h[3];
+
+    var t0;
+    var t1;
+
+    for (var i = 0; i < 64; i++) {
+      if (i < 16) {
+        t0 = (b & c) | ((~b & _MASK_32) & d);
+        t1 = i;
+      } else if (i < 32) {
+        t0 = (d & b) | ((~d & _MASK_32) & c);
+        t1 = ((5 * i) + 1) % 16;
+      } else if (i < 48) {
+        t0 = b ^ c ^ d;
+        t1 = ((3 * i) + 5) % 16;
+      } else {
+        t0 = c ^ (b | (~d & _MASK_32));
+        t1 = (7 * i) % 16;
+      }
+
+      var temp = d;
+      d = c;
+      c = b;
+      b = _add32(b, _rotl32(_add32(_add32(a, t0),
+                                   _add32(_k[i], m[t1])),
+                            _r[i]));
+      a = temp;
+    }
+
+    _h[0] = _add32(a, _h[0]);
+    _h[1] = _add32(b, _h[1]);
+    _h[2] = _add32(c, _h[2]);
+    _h[3] = _add32(d, _h[3]);
+  }
+}
diff --git a/mojo/public/dart/third_party/crypto/lib/src/sha1.dart b/mojo/public/dart/third_party/crypto/lib/src/sha1.dart
new file mode 100644
index 0000000..6e8ea48
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/lib/src/sha1.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of crypto;
+
+/**
+ * SHA1 hash function implementation.
+ */
+class SHA1 extends _HashBase {
+  final Uint32List _w;
+
+  // Construct a SHA1 hasher object.
+  SHA1() : _w = new Uint32List(80), super(16, 5, true) {
+    _h[0] = 0x67452301;
+    _h[1] = 0xEFCDAB89;
+    _h[2] = 0x98BADCFE;
+    _h[3] = 0x10325476;
+    _h[4] = 0xC3D2E1F0;
+  }
+
+  // Returns a new instance of this Hash.
+  SHA1 newInstance() {
+    return new SHA1();
+  }
+
+  // Compute one iteration of the SHA1 algorithm with a chunk of
+  // 16 32-bit pieces.
+  void _updateHash(Uint32List m) {
+    assert(m.length == 16);
+
+    var a = _h[0];
+    var b = _h[1];
+    var c = _h[2];
+    var d = _h[3];
+    var e = _h[4];
+
+    for (var i = 0; i < 80; i++) {
+      if (i < 16) {
+        _w[i] = m[i];
+      } else {
+        var n = _w[i - 3] ^ _w[i - 8] ^ _w[i - 14] ^ _w[i - 16];
+        _w[i] = _rotl32(n, 1);
+      }
+      var t = _add32(_add32(_rotl32(a, 5), e), _w[i]);
+      if (i < 20) {
+        t = _add32(_add32(t, (b & c) | (~b & d)), 0x5A827999);
+      } else if (i < 40) {
+        t = _add32(_add32(t, (b ^ c ^ d)), 0x6ED9EBA1);
+      } else if (i < 60) {
+        t = _add32(_add32(t, (b & c) | (b & d) | (c & d)), 0x8F1BBCDC);
+      } else {
+        t = _add32(_add32(t, b ^ c ^ d), 0xCA62C1D6);
+      }
+
+      e = d;
+      d = c;
+      c = _rotl32(b, 30);
+      b = a;
+      a = t & _MASK_32;
+    }
+
+    _h[0] = _add32(a, _h[0]);
+    _h[1] = _add32(b, _h[1]);
+    _h[2] = _add32(c, _h[2]);
+    _h[3] = _add32(d, _h[3]);
+    _h[4] = _add32(e, _h[4]);
+  }
+}
diff --git a/mojo/public/dart/third_party/crypto/lib/src/sha256.dart b/mojo/public/dart/third_party/crypto/lib/src/sha256.dart
new file mode 100644
index 0000000..f36561f
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/lib/src/sha256.dart
@@ -0,0 +1,107 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of crypto;
+
+/**
+ * SHA256 hash function implementation.
+ */
+class SHA256 extends _HashBase {
+  final Uint32List _w;
+
+  // Construct a SHA256 hasher object.
+  SHA256() : _w = new Uint32List(64), super(16, 8, true) {
+    // Initial value of the hash parts. First 32 bits of the fractional parts
+    // of the square roots of the first 8 prime numbers.
+    _h[0] = 0x6a09e667;
+    _h[1] = 0xbb67ae85;
+    _h[2] = 0x3c6ef372;
+    _h[3] = 0xa54ff53a;
+    _h[4] = 0x510e527f;
+    _h[5] = 0x9b05688c;
+    _h[6] = 0x1f83d9ab;
+    _h[7] = 0x5be0cd19;
+  }
+
+  // Returns a new instance of this Hash.
+  SHA256 newInstance() {
+    return new SHA256();
+  }
+
+  // Table of round constants. First 32 bits of the fractional
+  // parts of the cube roots of the first 64 prime numbers.
+  static const List<int> _K =
+      const [ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b,
+              0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01,
+              0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7,
+              0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
+              0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152,
+              0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
+              0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc,
+              0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+              0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819,
+              0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08,
+              0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f,
+              0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
+              0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 ];
+
+  // Helper functions as defined in http://tools.ietf.org/html/rfc6234
+  _rotr32(n, x) => (x >> n) | ((x << (32 - n)) & _MASK_32);
+  _ch(x, y, z) => (x & y) ^ ((~x & _MASK_32) & z);
+  _maj(x, y, z) => (x & y) ^ (x & z) ^ (y & z);
+  _bsig0(x) => _rotr32(2, x) ^ _rotr32(13, x) ^ _rotr32(22, x);
+  _bsig1(x) => _rotr32(6, x) ^ _rotr32(11, x) ^ _rotr32(25, x);
+  _ssig0(x) => _rotr32(7, x) ^ _rotr32(18, x) ^ (x >> 3);
+  _ssig1(x) => _rotr32(17, x) ^ _rotr32(19, x) ^ (x >> 10);
+
+  // Compute one iteration of the SHA256 algorithm with a chunk of
+  // 16 32-bit pieces.
+  void _updateHash(Uint32List M) {
+    assert(M.length == 16);
+
+    // Prepare message schedule.
+    var i = 0;
+    for (; i < 16; i++) {
+      _w[i] = M[i];
+    }
+    for (; i < 64; i++) {
+      _w[i] = _add32(_add32(_ssig1(_w[i - 2]), _w[i - 7]),
+                     _add32(_ssig0(_w[i - 15]), _w[i - 16]));
+    }
+
+    // Shuffle around the bits.
+    var a = _h[0];
+    var b = _h[1];
+    var c = _h[2];
+    var d = _h[3];
+    var e = _h[4];
+    var f = _h[5];
+    var g = _h[6];
+    var h = _h[7];
+
+    for (var t = 0; t < 64; t++) {
+      var t1 = _add32(_add32(h, _bsig1(e)),
+                      _add32(_ch(e, f, g), _add32(_K[t], _w[t])));
+      var t2 = _add32(_bsig0(a), _maj(a, b, c));
+      h = g;
+      g = f;
+      f = e;
+      e = _add32(d, t1);
+      d = c;
+      c = b;
+      b = a;
+      a = _add32(t1, t2);
+    }
+
+    // Update hash values after iteration.
+    _h[0] = _add32(a, _h[0]);
+    _h[1] = _add32(b, _h[1]);
+    _h[2] = _add32(c, _h[2]);
+    _h[3] = _add32(d, _h[3]);
+    _h[4] = _add32(e, _h[4]);
+    _h[5] = _add32(f, _h[5]);
+    _h[6] = _add32(g, _h[6]);
+    _h[7] = _add32(h, _h[7]);
+  }
+}
diff --git a/mojo/public/dart/third_party/crypto/pubspec.yaml b/mojo/public/dart/third_party/crypto/pubspec.yaml
new file mode 100644
index 0000000..dcee08d
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/pubspec.yaml
@@ -0,0 +1,9 @@
+name: crypto
+version: 0.9.1
+author: Dart Team <misc@dartlang.org>
+description: Library of cryptographic functions.
+homepage: https://www.github.com/dart-lang/crypto
+environment:
+  sdk: '>=1.0.0 <2.0.0'
+dev_dependencies:
+  test: '>=0.12.0 <0.13.0'
diff --git a/mojo/public/dart/third_party/crypto/test/base64_test.dart b/mojo/public/dart/third_party/crypto/test/base64_test.dart
new file mode 100644
index 0000000..879239b
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/test/base64_test.dart
@@ -0,0 +1,297 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Library tag to allow the test to run on Dartium.
+library base64_test;
+
+import 'dart:math';
+import 'dart:async';
+
+import "package:crypto/crypto.dart";
+import "package:test/test.dart";
+
+void main() {
+  test('encoder', _testEncoder);
+  test('decoder', _testDecoder);
+  test('decoder for malformed input', _testDecoderForMalformedInput);
+  test('encode decode lists', _testEncodeDecodeLists);
+  test('url safe encode-decode', _testUrlSafeEncodeDecode);
+  test('percent-encoded padding character encode-decode',
+       _testPaddingCharacter);
+  test('streaming encoder', _testStreamingEncoder);
+  test('streaming decoder', _testStreamingDecoder);
+  test('streaming decoder for malformed input',
+       _testStreamingDecoderForMalformedInput);
+  test('streaming encoder for different decompositions of a list of bytes',
+       _testStreamingEncoderForDecompositions);
+  test('streaming decoder for different decompositions of a string',
+       _testStreamingDecoderForDecompositions);
+  test('streaming for encoded padding character',
+       _testStreamingForEncodedPadding);
+  test('old api', _testOldApi);
+  test('url safe streaming encoder/decoder', _testUrlSafeStreaming);
+  test('performance', _testPerformance);
+
+
+}
+
+// Data from http://tools.ietf.org/html/rfc4648.
+const _INPUTS =
+    const [ '', 'f', 'fo', 'foo', 'foob', 'fooba', 'foobar'];
+const _RESULTS =
+    const [ '', 'Zg==', 'Zm8=', 'Zm9v', 'Zm9vYg==', 'Zm9vYmE=', 'Zm9vYmFy'];
+
+const _PADDING_INPUT = const [2, 8];
+
+var _STREAMING_ENCODER_INPUT =
+    [[102, 102], [111, 102],
+     [111, 111, 102, 111, 111, 98, 102, 111,
+      111, 98, 97, 102, 111, 111, 98, 97, 114]];
+
+const _STREAMING_ENCODED = 'ZmZvZm9vZm9vYmZvb2JhZm9vYmFy';
+const _STREAMING_DECODER_INPUT =
+    const ['YmFz', 'ZTY', '0I', 'GRlY29kZXI='];
+const _STREAMING_DECODED =
+    const [98, 97, 115, 101, 54, 52, 32, 100, 101, 99, 111, 100, 101, 114];
+const _STREAMING_DECODER_INPUT_FOR_ZEROES =
+    const ['AAAA', 'AAA=', 'AA==', ''];
+var _STREAMING_DECODED_ZEROES = [0, 0, 0, 0, 0, 0];
+
+var _DECOMPOSITIONS_FOR_DECODING = [
+    ["A", "", "BCD"], ["A", "BCD", "", ""], ["A", "B", "", "", "CD", ""],
+    ["", "A", "BC", "", "D"], ["", "AB", "C", "", "", "D"], ["AB", "CD", ""],
+    ["", "ABC", "", "D"], ["", "ABC", "D", ""], ["", "", "ABCD", ""],
+    ["A", "B", "C", "D"], ["", "A", "B", "C", "D", ""],
+    ["", "A", "B", "", "", "C", "", "D", ""]];
+
+const _DECOMPOSITION_DECODED = const [0, 16, 131];
+
+var _DECOMPOSITIONS_FOR_ENCODING = [
+    [[196, 16], [], [158], [196]],
+    [[196, 16], [158, 196], [], []],
+    [[196], [], [16], [], [], [158], [], [196]],
+    [[196], [], [16], [158, 196], [], []],
+    [[], [196], [], [], [16, 158], [], [196]],
+    [[], [196], [16, 158, 196], []],
+    [[196, 16, 158], [], [], [196]],
+    [[196, 16, 158], [], [196], []],
+    [[196, 16, 158, 196], [], [], []]];
+
+const _DECOMPOSITION_ENCODED = 'xBCexA==';
+
+// Test data with only zeroes.
+var inputsWithZeroes = [[0, 0, 0], [0, 0], [0], []];
+const _RESULTS_WITH_ZEROS = const ['AAAA', 'AAA=', 'AA==', ''];
+
+const _LONG_LINE =
+    "Man is distinguished, not only by his reason, but by this singular "
+    "passion from other animals, which is a lust of the mind, that by a "
+    "perseverance of delight in the continued and indefatigable generation "
+    "of knowledge, exceeds the short vehemence of any carnal pleasure.";
+
+const _LONG_LINE_RESULT =
+    "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbm"
+    "x5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz\r\n"
+    "IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlci"
+    "BhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg\r\n"
+    "dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcm"
+    "FuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu\r\n"
+    "dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYX"
+    "Rpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo\r\n"
+    "ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm"
+    "5hbCBwbGVhc3VyZS4=";
+
+const _LONG_LINE_RESULT_NO_BREAK =
+    "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbm"
+    "x5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz"
+    "IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlci"
+    "BhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg"
+    "dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcm"
+    "FuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu"
+    "dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYX"
+    "Rpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo"
+    "ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm"
+    "5hbCBwbGVhc3VyZS4=";
+
+void _testEncoder() {
+  for (var i = 0; i < _INPUTS.length; i++) {
+    expect(BASE64.encode(_INPUTS[i].codeUnits), _RESULTS[i]);
+  }
+  for (var i = 0; i < inputsWithZeroes.length; i++) {
+    expect(BASE64.encode(inputsWithZeroes[i]),
+           _RESULTS_WITH_ZEROS[i]);
+  }
+  expect(BASE64.encode(_LONG_LINE.codeUnits, addLineSeparator : true),
+         _LONG_LINE_RESULT);
+  expect(BASE64.encode(_LONG_LINE.codeUnits),
+         _LONG_LINE_RESULT_NO_BREAK);
+}
+
+void _testDecoder() {
+  for (var i = 0; i < _RESULTS.length; i++) {
+    expect(
+        new String.fromCharCodes(BASE64.decode(_RESULTS[i])),
+        _INPUTS[i]);
+  }
+
+  for (var i = 0; i < _RESULTS_WITH_ZEROS.length; i++) {
+    expect(BASE64.decode(_RESULTS_WITH_ZEROS[i]),
+        inputsWithZeroes[i]);
+  }
+
+  var longLineDecoded = BASE64.decode(_LONG_LINE_RESULT);
+  expect(new String.fromCharCodes(longLineDecoded), _LONG_LINE);
+
+  var longLineResultNoBreak = BASE64.decode(_LONG_LINE_RESULT);
+  expect(new String.fromCharCodes(longLineResultNoBreak), _LONG_LINE);
+}
+
+void _testPaddingCharacter() {
+  var encoded = BASE64.encode(_PADDING_INPUT, encodePaddingCharacter: true);
+  expect(encoded, 'Agg%3D');
+  expect(BASE64.decode(encoded), _PADDING_INPUT);
+}
+
+Future _testStreamingEncoder() async {
+  expect(
+      await new Stream.fromIterable(_STREAMING_ENCODER_INPUT)
+                      .transform(BASE64.encoder)
+                      .join(),
+      _STREAMING_ENCODED);
+}
+
+Future _testStreamingDecoder() async {
+  expect(
+      await new Stream.fromIterable(_STREAMING_DECODER_INPUT)
+                      .transform(BASE64.decoder)
+                      .expand((l) => l)
+                      .toList(),
+      _STREAMING_DECODED);
+
+  expect(
+      await new Stream.fromIterable(_STREAMING_DECODER_INPUT_FOR_ZEROES)
+                      .transform(BASE64.decoder)
+                      .expand((l) => l)
+                      .toList(),
+      _STREAMING_DECODED_ZEROES);
+}
+
+Future _testStreamingDecoderForMalformedInput() async {
+  expect(new Stream.fromIterable(['ABz'])
+                   .transform(BASE64.decoder)
+                   .toList(),
+         throwsFormatException);
+
+  expect(new Stream.fromIterable(['AB', 'Lx', 'z', 'xx'])
+                   .transform(BASE64.decoder)
+                   .toList(),
+         throwsFormatException);
+}
+
+Future _testStreamingEncoderForDecompositions() async {
+  for(var decomposition in _DECOMPOSITIONS_FOR_ENCODING) {
+    expect(
+        await new Stream.fromIterable(decomposition)
+                        .transform(BASE64.encoder)
+                        .join(),
+        _DECOMPOSITION_ENCODED);
+  }
+}
+
+Future _testStreamingDecoderForDecompositions() async {
+  for(var decomposition in _DECOMPOSITIONS_FOR_DECODING) {
+    expect(
+        await new Stream.fromIterable(decomposition)
+                        .transform(BASE64.decoder)
+                        .expand((x) => x)
+                        .toList(),
+        _DECOMPOSITION_DECODED);
+  }
+}
+
+void _testDecoderForMalformedInput() {
+  expect(() {
+    BASE64.decode('AB~');
+  }, throwsFormatException);
+
+  expect(() {
+    BASE64.decode('A');
+  }, throwsFormatException);
+}
+
+Future _testUrlSafeStreaming() async {
+  String encUrlSafe = '-_A=';
+  List<List<int>> dec = [BASE64.decode('+/A=')];
+  var streamedResult = await new Stream.fromIterable(dec)
+      .transform(new Base64Encoder(urlSafe: true)).join();
+
+  expect(streamedResult, encUrlSafe);
+}
+
+Future _testStreamingForEncodedPadding() async {
+  List<String> withEncodedPadding = ['AA%', '3D', '%', '3', 'DEFGZ'];
+  List<int> decoded = BASE64.decode('AA==EFGZ');
+  var streamedResult = await new Stream.fromIterable(withEncodedPadding)
+      .transform(BASE64.decoder).expand((x) => x).toList();
+
+  expect(streamedResult, decoded);
+}
+
+void _testUrlSafeEncodeDecode() {
+  List<int> decUrlSafe = BASE64.decode('-_A=');
+  List<int> dec = BASE64.decode('+/A=');
+  expect(decUrlSafe, orderedEquals(dec));
+  expect(BASE64.encode(dec, urlSafe: true), '-_A=');
+  expect(BASE64.encode(dec), '+/A=');
+}
+
+void _testEncodeDecodeLists() {
+  for (int i = 0; i < 10; i++) {
+    for (int j = 0; j < 256 - i; j++) {
+      List<int> x = new List<int>(i);
+      for (int k = 0; k < i; k++) {
+        x[k] = j;
+      }
+      var enc = BASE64.encode(x);
+      var dec = BASE64.decode(enc);
+      expect(dec, orderedEquals(x));
+    }
+  }
+}
+
+void _fillRandom(List<int> l) {
+  var random = new Random(0xBABE);
+  for (int j = 0; j < l.length; j++) {
+    l[j] = random.nextInt(255);
+  }
+}
+
+void _testOldApi() {
+  for (int i = 0; i < _INPUTS.length; i++) {
+    expect(CryptoUtils.bytesToBase64(_INPUTS[i].codeUnits), _RESULTS[i]);
+    expect(CryptoUtils.base64StringToBytes(_RESULTS[i]), _INPUTS[i].codeUnits);
+  }
+}
+
+void _testPerformance() {
+    var l = new List<int>(1024);
+    var iters = 5000;
+    _fillRandom(l);
+    String enc;
+    var w = new Stopwatch()..start();
+    for( int i = 0; i < iters; ++i ) {
+      enc = BASE64.encode(l);
+    }
+    int ms = w.elapsedMilliseconds;
+    int perSec = (iters * l.length) * 1000 ~/ ms;
+    // print("Encode 1024 bytes for $iters times: $ms msec. $perSec b/s");
+    w..reset();
+    for( int i = 0; i < iters; ++i ) {
+      BASE64.decode(enc);
+    }
+    ms = w.elapsedMilliseconds;
+    perSec = (iters * l.length) * 1000 ~/ ms;
+    // ('''Decode into ${l.length} bytes for $iters
+    //     times: $ms msec. $perSec b/s''');
+}
diff --git a/mojo/public/dart/third_party/crypto/test/hmac_md5_test.dart b/mojo/public/dart/third_party/crypto/test/hmac_md5_test.dart
new file mode 100644
index 0000000..f2a10d1
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/test/hmac_md5_test.dart
@@ -0,0 +1,117 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Library tag to allow the test to run on Dartium.
+library hmac_md5_test;
+
+import "package:crypto/crypto.dart";
+import "package:test/test.dart";
+
+void main() {
+  test('standard vectors', () {
+    _testStandardVectors(_HMAC_MD5_INPUTS, _HMAC_MD5_KEYS,
+        _HMAC_MD5_STRING_MACS, _HMAC_MD5_MACS);
+  });
+}
+
+void _testStandardVectors(inputs, keys, string_macs, macs) {
+  for (var i = 0; i < inputs.length; i++) {
+    var h = new HMAC(new MD5(), keys[i]);
+    h.add(inputs[i]);
+    var d = h.close();
+    expect(CryptoUtils.bytesToHex(d), startsWith(string_macs[i]));
+    expect(h.verify(macs[i]), isTrue);
+    expect(h.verify(macs[(i + 1) % macs.length]), isFalse);
+    expect(() => h.verify([]), throws);
+  }
+}
+
+// Data from http://tools.ietf.org/html/rfc2202.
+const _HMAC_MD5_INPUTS =
+    const [
+      const [ 0x48, 0x69, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65 ],
+      const [ 0x77, 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x20, 0x79, 0x61,
+              0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20,
+              0x6e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x3f ],
+      const [ 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+              0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+              0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+              0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+              0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd ],
+      const [ 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
+              0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
+              0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
+              0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
+              0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd ],
+      const [ 0x54, 0x65, 0x73, 0x74, 0x20, 0x57, 0x69, 0x74, 0x68, 0x20,
+              0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e ],
+      const [ 0x54, 0x65, 0x73, 0x74, 0x20, 0x55, 0x73, 0x69, 0x6e, 0x67,
+              0x20, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x54, 0x68,
+              0x61, 0x6e, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x53,
+              0x69, 0x7a, 0x65, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x2d, 0x20,
+              0x48, 0x61, 0x73, 0x68, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x46,
+              0x69, 0x72, 0x73, 0x74 ],
+      const [ 0x54, 0x65, 0x73, 0x74, 0x20, 0x55, 0x73, 0x69, 0x6e, 0x67,
+              0x20, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x54, 0x68,
+              0x61, 0x6e, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x53,
+              0x69, 0x7a, 0x65, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x61, 0x6e,
+              0x64, 0x20, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x54,
+              0x68, 0x61, 0x6e, 0x20, 0x4f, 0x6e, 0x65, 0x20, 0x42, 0x6c,
+              0x6f, 0x63, 0x6b, 0x2d, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x44,
+              0x61, 0x74, 0x61 ] ];
+
+const _HMAC_MD5_KEYS =
+    const [ const [0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+                   0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b],
+            const [ 0x4a, 0x65, 0x66, 0x65 ],
+            const [0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+                   0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa],
+            const [ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
+                    0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14,
+                    0x15, 0x16, 0x17, 0x18, 0x19 ],
+            const [ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
+                    0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c ],
+            const [ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+                    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+                    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+                    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+                    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+                    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+                    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+                    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+                    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa ],
+            const [ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+                    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+                    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+                    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+                    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+                    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+                    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+                    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+                    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa ] ];
+
+const _HMAC_MD5_STRING_MACS =
+    const [ '9294727a3638bb1c13f48ef8158bfc9d',
+            '750c783e6ab0b503eaa86e310a5db738',
+            '56be34521d144c88dbb8c733f0e8b3f6',
+            '697eaf0aca3a3aea3a75164746ffaa79',
+            '56461ef2342edc00f9bab995690efd4c',
+            '6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd',
+            '6f630fad67cda0ee1fb1f562db3aa53e' ];
+
+const _HMAC_MD5_MACS =
+    const [ const [0x92, 0x94, 0x72, 0x7a, 0x36, 0x38, 0xbb, 0x1c, 0x13, 0xf4,
+                   0x8e, 0xf8, 0x15, 0x8b, 0xfc, 0x9d],
+            const [0x75, 0x0c, 0x78, 0x3e, 0x6a, 0xb0, 0xb5, 0x03, 0xea, 0xa8,
+                   0x6e, 0x31, 0x0a, 0x5d, 0xb7, 0x38],
+            const [0x56, 0xbe, 0x34, 0x52, 0x1d, 0x14, 0x4c, 0x88, 0xdb, 0xb8,
+                   0xc7, 0x33, 0xf0, 0xe8, 0xb3, 0xf6],
+            const [0x69, 0x7e, 0xaf, 0x0a, 0xca, 0x3a, 0x3a, 0xea, 0x3a, 0x75,
+                   0x16, 0x47, 0x46, 0xff, 0xaa, 0x79],
+            const [0x56, 0x46, 0x1e, 0xf2, 0x34, 0x2e, 0xdc, 0x00, 0xf9, 0xba,
+                   0xb9, 0x95, 0x69, 0x0e, 0xfd, 0x4c],
+            const [0x6b, 0x1a, 0xb7, 0xfe, 0x4b, 0xd7, 0xbf, 0x8f, 0x0b, 0x62,
+                   0xe6, 0xce, 0x61, 0xb9, 0xd0, 0xcd],
+            const [0x6f, 0x63, 0x0f, 0xad, 0x67, 0xcd, 0xa0, 0xee, 0x1f, 0xb1,
+                   0xf5, 0x62, 0xdb, 0x3a, 0xa5, 0x3e]];
diff --git a/mojo/public/dart/third_party/crypto/test/hmac_sha1_test.dart b/mojo/public/dart/third_party/crypto/test/hmac_sha1_test.dart
new file mode 100644
index 0000000..4a378c7
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/test/hmac_sha1_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Library tag to allow the test to run on Dartium.
+library hmac_sha1_test;
+
+import "package:crypto/crypto.dart";
+import "package:test/test.dart";
+
+part 'hmac_sha1_test_vectors.dart';
+
+
+void main() {
+  test('standard vectors', () {
+    _testStandardVectors(hmac_sha1_inputs, hmac_sha1_keys, hmac_sha1_macs);
+  });
+}
+
+void _testStandardVectors(inputs, keys, macs) {
+  for (var i = 0; i < inputs.length; i++) {
+    var hmac = new HMAC(new SHA1(), keys[i]);
+    hmac.add(inputs[i]);
+    var d = hmac.close();
+    expect(CryptoUtils.bytesToHex(d), startsWith(macs[i]));
+  }
+}
diff --git a/mojo/public/dart/third_party/crypto/test/hmac_sha1_test_vectors.dart b/mojo/public/dart/third_party/crypto/test/hmac_sha1_test_vectors.dart
new file mode 100644
index 0000000..26f37f9
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/test/hmac_sha1_test_vectors.dart
@@ -0,0 +1,917 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Standard test vectors from:
+//   http://csrc.nist.gov/groups/STM/cavp/documents/mac/hmactestvectors.zip
+
+part of hmac_sha1_test;
+
+const hmac_sha1_inputs = const [
+const [ 0xfc, 0xd6, 0xd9, 0x8b, 0xef, 0x45, 0xed, 0x68, 0x50, 0x80, 0x6e, 0x96, 0xf2, 0x55, 0xfa, 0x0c, 0x81, 0x14, 0xb7, 0x28, 0x73, 0xab, 0xe8, 0xf4, 0x3c, 0x10, 0xbe, 0xa7, 0xc1, 0xdf, 0x70, 0x6f, 0x10, 0x45, 0x8e, 0x6d, 0x4e, 0x1c, 0x92, 0x01, 0xf0, 0x57, 0xb8, 0x49, 0x2f, 0xa1, 0x0f, 0xe4, 0xb5, 0x41, 0xd0, 0xfc, 0x9d, 0x41, 0xef, 0x83, 0x9a, 0xcf, 0xf1, 0xbc, 0x76, 0xe3, 0xfd, 0xfe, 0xbf, 0x22, 0x35, 0xb5, 0xbd, 0x03, 0x47, 0xa9, 0xa6, 0x30, 0x3e, 0x83, 0x15, 0x2f, 0x9f, 0x8d, 0xb9, 0x41, 0xb1, 0xb9, 0x4a, 0x8a, 0x1c, 0xe5, 0xc2, 0x73, 0xb5, 0x5d, 0xc9, 0x4d, 0x99, 0xa1, 0x71, 0x37, 0x79, 0x69, 0x23, 0x41, 0x34, 0xe7, 0xda, 0xd1, 0xab, 0x4c, 0x8e, 0x46, 0xd1, 0x8d, 0xf4, 0xdc, 0x01, 0x67, 0x64, 0xcf, 0x95, 0xa1, 0x1a, 0xc4, 0xb4, 0x91, 0xa2, 0x64, 0x6b, 0xe1 ],
+const [ 0xd6, 0x8b, 0x82, 0x8a, 0x15, 0x3f, 0x51, 0x98, 0xc0, 0x05, 0xee, 0x36, 0xc0, 0xaf, 0x2f, 0xf9, 0x2e, 0x84, 0x90, 0x75, 0x17, 0xf0, 0x1d, 0x9b, 0x7c, 0x79, 0x93, 0x46, 0x9d, 0xf5, 0xc2, 0x10, 0x78, 0xfa, 0x35, 0x6a, 0x8c, 0x97, 0x15, 0xec, 0xe2, 0x41, 0x4b, 0xe9, 0x4e, 0x10, 0xe5, 0x47, 0xf3, 0x2c, 0xbb, 0x8d, 0x05, 0x82, 0x52, 0x3e, 0xd3, 0xbb, 0x00, 0x66, 0x04, 0x6e, 0x51, 0x72, 0x20, 0x94, 0xaa, 0x44, 0x53, 0x3d, 0x2c, 0x87, 0x6e, 0x82, 0xdb, 0x40, 0x2f, 0xbb, 0x00, 0xa6, 0xc2, 0xf2, 0xcc, 0x34, 0x87, 0x97, 0x3d, 0xfc, 0x16, 0x74, 0x46, 0x3e, 0x81, 0xe4, 0x2a, 0x39, 0xd9, 0x40, 0x29, 0x41, 0xf3, 0x9b, 0x5e, 0x12, 0x6b, 0xaf, 0xe8, 0x64, 0xea, 0x16, 0x48, 0xc0, 0xa5, 0xbe, 0x0a, 0x91, 0x26, 0x97, 0xa8, 0x7e, 0x4f, 0x8e, 0xab, 0xf7, 0x9c, 0xbf, 0x13, 0x0e ],
+const [ 0xf8, 0x4d, 0x0d, 0x81, 0x3d, 0x2e, 0x9e, 0x77, 0x9e, 0x85, 0x70, 0xbd, 0xdb, 0xdf, 0x6f, 0xdc, 0x6b, 0xaa, 0xde, 0x5a, 0xcb, 0x3c, 0x4c, 0xde, 0x16, 0x18, 0xc4, 0x94, 0xd6, 0x6d, 0x45, 0xd3, 0x19, 0xe0, 0x71, 0xfe, 0xc8, 0x8b, 0x89, 0xa8, 0x35, 0x46, 0x99, 0xfb, 0xf3, 0x25, 0xf0, 0x5a, 0xea, 0x42, 0xd3, 0x45, 0xaa, 0xbc, 0x73, 0x7d, 0x00, 0xff, 0x1c, 0x69, 0xc7, 0x46, 0xae, 0xb9, 0x01, 0x5f, 0x51, 0x49, 0x27, 0xae, 0x65, 0x48, 0xbd, 0x75, 0xb8, 0x99, 0x28, 0x53, 0xfc, 0x79, 0xc4, 0x0a, 0x78, 0x63, 0x32, 0x85, 0xfd, 0x30, 0xef, 0x19, 0x1c, 0x83, 0x2b, 0x0b, 0x96, 0x64, 0xd8, 0x52, 0x14, 0x2b, 0x01, 0x9f, 0x18, 0xa0, 0x5d, 0x9b, 0x34, 0x60, 0x24, 0x6f, 0x7a, 0x83, 0x21, 0x8a, 0x33, 0x7b, 0x09, 0x9e, 0xd4, 0x3f, 0x0b, 0xec, 0x2d, 0xaa, 0xa8, 0xc2, 0xe4, 0x1d ],
+const [ 0xd6, 0xeb, 0x23, 0xc5, 0xea, 0x87, 0xfd, 0x67, 0xb9, 0x43, 0x92, 0x8b, 0xe0, 0x52, 0x18, 0x23, 0xdc, 0x50, 0x8a, 0xcb, 0x2a, 0xd5, 0xf0, 0xfd, 0xac, 0x49, 0xe0, 0x84, 0x4f, 0xfa, 0x45, 0x33, 0xeb, 0x6b, 0x5f, 0xd6, 0x6b, 0xf0, 0x0b, 0x69, 0x2d, 0x77, 0x45, 0x88, 0xac, 0xa9, 0xeb, 0x27, 0x5c, 0x32, 0xc3, 0x83, 0xd5, 0x5c, 0xc0, 0x58, 0x34, 0xe3, 0x81, 0x55, 0xbe, 0x05, 0x1b, 0xcd, 0xc7, 0xd8, 0x18, 0xaf, 0xd3, 0xe0, 0xc0, 0xb8, 0xfa, 0xe1, 0x97, 0xe7, 0x91, 0xf2, 0x26, 0x32, 0x06, 0xd3, 0xfe, 0x77, 0x0c, 0x80, 0xfb, 0xb5, 0xf8, 0x06, 0xc6, 0x7c, 0x6b, 0x96, 0x9d, 0xa2, 0x32, 0xd8, 0x57, 0x38, 0x6a, 0x81, 0xa2, 0xbc, 0xe8, 0x28, 0x90, 0x90, 0xd8, 0x56, 0x52, 0xab, 0xa3, 0xdc, 0x43, 0x8f, 0x17, 0x69, 0x28, 0x7b, 0xc2, 0x5b, 0xb5, 0xe1, 0x9e, 0xd6, 0x54, 0x1a ],
+const [ 0xa6, 0x4e, 0xc0, 0xd9, 0x33, 0x60, 0x97, 0x6b, 0x75, 0xf5, 0x0e, 0xa5, 0x32, 0xc3, 0xd5, 0x01, 0x46, 0x4a, 0x39, 0x2c, 0x00, 0xab, 0xa5, 0x72, 0xc9, 0xbd, 0x69, 0x77, 0x06, 0x5e, 0xbb, 0x29, 0x40, 0x07, 0xfb, 0xf2, 0x82, 0xa4, 0x3c, 0x32, 0x03, 0xa2, 0xff, 0xec, 0x05, 0x49, 0x41, 0xc0, 0xfd, 0x4c, 0xb9, 0x19, 0xf4, 0x9e, 0x5b, 0xa7, 0x2d, 0x88, 0x20, 0x10, 0x08, 0xf9, 0x09, 0xe2, 0x26, 0x1d, 0x62, 0xcd, 0xce, 0x30, 0x44, 0x0f, 0x90, 0x95, 0x5d, 0x2f, 0x28, 0x22, 0xf3, 0xee, 0xa5, 0xbf, 0x27, 0x7b, 0xca, 0x2f, 0x77, 0xe6, 0xb4, 0x2d, 0x87, 0xd7, 0xbd, 0xbb, 0x21, 0x80, 0xa1, 0xb7, 0x7a, 0xd0, 0xdf, 0xaf, 0xb7, 0xe9, 0x62, 0xf6, 0xaf, 0xd5, 0x61, 0xf7, 0xf3, 0x74, 0x84, 0xca, 0x0c, 0xb9, 0x48, 0x05, 0x03, 0x16, 0xa4, 0xd5, 0x27, 0x35, 0xed, 0x4d, 0x0a, 0xe9 ],
+const [ 0x5f, 0x45, 0x86, 0x57, 0xda, 0x5a, 0xec, 0x73, 0xd8, 0xaa, 0x5e, 0x34, 0x8b, 0xed, 0xc6, 0xaf, 0x48, 0x73, 0x41, 0x59, 0x3a, 0x0a, 0x74, 0x12, 0x56, 0x22, 0x23, 0x62, 0x91, 0x2f, 0xff, 0x02, 0x51, 0x4f, 0xc0, 0x9e, 0x22, 0x2d, 0x74, 0xd9, 0xab, 0x25, 0x17, 0x92, 0xe0, 0xa9, 0x63, 0x65, 0x79, 0xe3, 0xe9, 0x75, 0xa2, 0x9b, 0x61, 0x69, 0xf4, 0x5c, 0x3f, 0xb5, 0xa4, 0xd2, 0x87, 0x1b, 0xfa, 0x77, 0xe1, 0x71, 0x05, 0x6f, 0xf0, 0xa4, 0x8e, 0xaf, 0xe0, 0xfd, 0x4a, 0x65, 0x3e, 0xa3, 0x53, 0x94, 0x0d, 0x62, 0xd9, 0xff, 0x16, 0xaa, 0x15, 0x49, 0x7f, 0xdb, 0x7f, 0x5a, 0x9f, 0xbf, 0x41, 0x05, 0x11, 0x58, 0xeb, 0xe7, 0x07, 0xdd, 0x68, 0x92, 0xe1, 0xff, 0x31, 0xeb, 0xff, 0x70, 0xc0, 0xd0, 0xd3, 0xa6, 0x48, 0xfe, 0x3a, 0xdd, 0xa3, 0x32, 0x0c, 0x5b, 0x8c, 0x8f, 0xf1, 0xf7 ],
+const [ 0x20, 0x10, 0x0e, 0xd9, 0x97, 0xab, 0x74, 0x37, 0x06, 0x07, 0xae, 0xeb, 0x0b, 0xd2, 0xf6, 0x4f, 0x6a, 0x56, 0xc7, 0x04, 0x0d, 0x64, 0xfd, 0x8a, 0x49, 0x8a, 0x38, 0x0d, 0x63, 0x8c, 0x81, 0x82, 0x53, 0x12, 0x30, 0xf3, 0xc7, 0x9f, 0x0c, 0x17, 0x6b, 0xc2, 0xb5, 0x26, 0x68, 0x90, 0x3f, 0xeb, 0x2a, 0x51, 0x20, 0x1b, 0x67, 0x7a, 0x4c, 0xe5, 0x5d, 0xdc, 0x9e, 0xca, 0x5b, 0x1a, 0x7a, 0xaf, 0x82, 0x60, 0xb1, 0x31, 0xcd, 0x52, 0xa4, 0x38, 0x4f, 0x43, 0xad, 0xcf, 0xbc, 0xa8, 0xba, 0x33, 0x2b, 0xcc, 0x3b, 0x29, 0x1a, 0xc5, 0x3f, 0x95, 0xb3, 0xa6, 0xd9, 0x49, 0x4e, 0xf6, 0xc9, 0x1b, 0x36, 0x61, 0x58, 0x3a, 0xb0, 0xae, 0x84, 0xc2, 0x39, 0xf1, 0x5d, 0x8d, 0x10, 0x02, 0xaf, 0x4d, 0xf4, 0x2d, 0xe1, 0xd7, 0x2f, 0x2b, 0x1d, 0xc2, 0xd3, 0x51, 0xb2, 0x31, 0x44, 0x08, 0xb6, 0xed ],
+const [ 0x32, 0x23, 0x74, 0x43, 0x02, 0xf4, 0x81, 0xdd, 0x32, 0xa9, 0xd4, 0xd1, 0xce, 0xaf, 0x72, 0x22, 0x9b, 0x45, 0xf4, 0x13, 0xa1, 0xe8, 0x2d, 0x3c, 0xe7, 0x0f, 0x0d, 0xde, 0x7e, 0x19, 0xc5, 0x74, 0xc0, 0x84, 0x2c, 0x8a, 0xda, 0x5f, 0x62, 0xd2, 0x88, 0x02, 0xb3, 0x75, 0x20, 0xfc, 0xbe, 0xa7, 0xd2, 0x4d, 0xd6, 0x7e, 0x2e, 0xd6, 0xa8, 0x04, 0xe6, 0x0d, 0x1e, 0x8b, 0xd6, 0xf5, 0x84, 0x40, 0x41, 0x4e, 0xea, 0x03, 0x5e, 0x08, 0xc9, 0x76, 0x13, 0xfe, 0xe9, 0x54, 0x00, 0xe1, 0x81, 0x05, 0xbf, 0x72, 0xa1, 0x6f, 0x6a, 0xf5, 0xcd, 0x0e, 0x5e, 0xe2, 0xea, 0x47, 0x3f, 0xdd, 0x5f, 0xf9, 0x3d, 0xe8, 0x74, 0x56, 0x95, 0xd8, 0xfd, 0xf1, 0x5a, 0x05, 0x3d, 0x17, 0x75, 0x46, 0x05, 0x63, 0xeb, 0x1d, 0x1c, 0x8d, 0x5e, 0x2e, 0xe3, 0x83, 0xd7, 0xf6, 0x39, 0xbb, 0xc2, 0xb9, 0x9d, 0xc7 ],
+const [ 0xfb, 0x09, 0x1d, 0xdd, 0x95, 0xb1, 0x00, 0xdf, 0xcf, 0x89, 0x2d, 0x78, 0xe5, 0xe7, 0x70, 0xd3, 0xa3, 0x7b, 0x8c, 0x38, 0x85, 0xdf, 0x80, 0x3c, 0x1d, 0x6f, 0x09, 0x35, 0xb5, 0x5b, 0x68, 0xf1, 0x36, 0xfb, 0x65, 0xa8, 0x48, 0x62, 0x94, 0x2e, 0xbb, 0x35, 0xd7, 0x6d, 0x26, 0xbe, 0x24, 0x13, 0xcd, 0x3c, 0x89, 0x88, 0xc8, 0x7d, 0x6d, 0x23, 0x62, 0xaf, 0x18, 0x9d, 0xc0, 0x74, 0x76, 0xc6, 0xc3, 0x34, 0x17, 0x76, 0x2e, 0xb7, 0x7b, 0xc7, 0x0c, 0xf3, 0x8d, 0x81, 0x4c, 0x22, 0x6d, 0xd6, 0xaf, 0x18, 0x72, 0x50, 0xe4, 0xd4, 0x70, 0x07, 0xf1, 0x55, 0x36, 0x17, 0xd4, 0xaf, 0x5b, 0x51, 0x6a, 0x5d, 0x3b, 0x31, 0x91, 0xd9, 0x3c, 0x10, 0x89, 0x6a, 0x56, 0x9b, 0xa1, 0x3d, 0xd2, 0x84, 0x0f, 0xb8, 0x51, 0x78, 0x1f, 0x0b, 0x11, 0x50, 0x90, 0x08, 0x6c, 0x8b, 0x3a, 0x34, 0xa1, 0xfc ],
+const [ 0x97, 0xf2, 0x76, 0x9d, 0xc0, 0x81, 0xf1, 0xfd, 0x71, 0x38, 0xad, 0x61, 0xbd, 0x30, 0x74, 0x3c, 0xd8, 0x1a, 0x45, 0x65, 0xcf, 0x22, 0xa4, 0x1a, 0x76, 0x1a, 0x35, 0x44, 0xa2, 0xd4, 0x89, 0xfc, 0x99, 0xcf, 0x38, 0x4f, 0xc7, 0x16, 0x30, 0x3e, 0xb3, 0x66, 0x4c, 0x09, 0x31, 0x8f, 0x29, 0xae, 0xd8, 0x1c, 0x35, 0xac, 0xb6, 0x36, 0x08, 0x0c, 0x43, 0xc6, 0xf8, 0xa2, 0x94, 0xda, 0xe7, 0x91, 0xd1, 0x4a, 0x60, 0x0d, 0xe9, 0x9b, 0xe3, 0x65, 0x84, 0x23, 0x7c, 0x40, 0x3a, 0x6e, 0x9a, 0x26, 0x02, 0xe1, 0x1f, 0x43, 0xed, 0x9d, 0xb4, 0x68, 0x14, 0xa7, 0x5f, 0x53, 0xce, 0x45, 0x57, 0x30, 0x27, 0xab, 0x17, 0x60, 0x8e, 0xd6, 0xb1, 0x78, 0xce, 0xb9, 0x65, 0x8d, 0x40, 0x97, 0x72, 0xaf, 0x3e, 0xb0, 0x2c, 0xb3, 0xda, 0x1f, 0x4f, 0x36, 0xd0, 0x03, 0x93, 0xde, 0xba, 0xdd, 0x80, 0xe3 ],
+const [ 0x76, 0xa6, 0x9c, 0xdd, 0x9f, 0xf8, 0x7e, 0xe6, 0xb0, 0x7f, 0xfe, 0x6d, 0x49, 0x6c, 0x54, 0x56, 0x0d, 0xe1, 0xe9, 0xf6, 0x4c, 0x06, 0x1a, 0xcb, 0xe0, 0x59, 0x38, 0x6a, 0x54, 0x45, 0xd3, 0xb8, 0x4c, 0xf7, 0x38, 0x5d, 0x20, 0x6d, 0x38, 0x76, 0xcb, 0xcf, 0x2b, 0x8a, 0x04, 0x03, 0x35, 0xc0, 0xaa, 0x7c, 0xc8, 0x4f, 0x65, 0x52, 0x6a, 0x35, 0x8b, 0x98, 0xb9, 0x2c, 0x40, 0xea, 0xac, 0xda, 0xe2, 0x45, 0x1b, 0x48, 0xa4, 0x1b, 0x82, 0x95, 0x78, 0xa7, 0x02, 0xec, 0x33, 0x7f, 0xa8, 0xb3, 0xeb, 0x68, 0xf2, 0x05, 0xa4, 0x6d, 0x8f, 0x63, 0x2c, 0x33, 0x67, 0xa6, 0x44, 0x87, 0xdb, 0x38, 0x00, 0x39, 0x4e, 0x84, 0x71, 0x2d, 0xe4, 0xab, 0x81, 0xaf, 0x89, 0x79, 0x1d, 0x07, 0x36, 0x97, 0x9a, 0x4d, 0x6f, 0x02, 0x51, 0x7f, 0x11, 0xbb, 0x8d, 0xd1, 0x4a, 0xc1, 0xa8, 0x44, 0xe9, 0x3c ],
+const [ 0x36, 0x58, 0x21, 0x2a, 0x14, 0xb6, 0x5a, 0xc3, 0xbd, 0x9e, 0x3d, 0x90, 0x39, 0xc6, 0x31, 0xa9, 0x4b, 0xb4, 0x3c, 0x4e, 0x49, 0x38, 0x77, 0x85, 0x2a, 0x3a, 0xbf, 0x05, 0xe1, 0xb5, 0xae, 0x53, 0xea, 0x04, 0xc9, 0x2b, 0x22, 0x5d, 0xfb, 0x21, 0xdb, 0x9b, 0x43, 0x88, 0x30, 0x40, 0xa9, 0x93, 0x96, 0xba, 0x76, 0xba, 0xb4, 0xe5, 0xa4, 0x5f, 0x75, 0xd2, 0x94, 0xb2, 0x5b, 0xc7, 0xff, 0xd2, 0x16, 0x86, 0x2f, 0x35, 0x55, 0xd2, 0x6f, 0x49, 0xdc, 0x30, 0xc0, 0x5b, 0xd6, 0xeb, 0xcd, 0xb9, 0x6d, 0x5a, 0x21, 0x13, 0x99, 0x65, 0x98, 0x27, 0x35, 0x46, 0x13, 0x9e, 0x58, 0x8d, 0x70, 0x30, 0xe2, 0x67, 0xba, 0x0f, 0x55, 0x1f, 0x9c, 0x83, 0xe7, 0xe5, 0x1c, 0xd1, 0xd5, 0xcf, 0x86, 0x62, 0xf9, 0x1d, 0xa5, 0x21, 0x9f, 0xc1, 0x39, 0x25, 0x95, 0x1f, 0xa6, 0x90, 0x81, 0x11, 0xea, 0xb7 ],
+const [ 0xfc, 0xd6, 0xd3, 0xab, 0x67, 0x57, 0x4d, 0x8f, 0x0b, 0xbf, 0x5a, 0xd1, 0x49, 0x37, 0x96, 0x6d, 0xbd, 0x43, 0x86, 0xa9, 0x28, 0xe6, 0x2a, 0x53, 0xad, 0x0d, 0xd1, 0x4a, 0x41, 0x2b, 0x31, 0x40, 0x5d, 0x20, 0xb7, 0xbd, 0xf5, 0x5f, 0x1c, 0x67, 0xae, 0x50, 0x39, 0x82, 0x4c, 0xf3, 0x1c, 0xb3, 0x69, 0xc7, 0x5b, 0x09, 0x6d, 0xea, 0xa8, 0x3d, 0xba, 0x81, 0xa6, 0x39, 0x27, 0x5a, 0xfc, 0xd8, 0xb0, 0xd0, 0xa7, 0xed, 0x6c, 0xef, 0x94, 0x86, 0xbf, 0xd9, 0x6e, 0x72, 0xd0, 0x68, 0xb5, 0x00, 0x3d, 0x15, 0x10, 0x0a, 0x0e, 0x19, 0xe4, 0x32, 0xe8, 0xd2, 0x25, 0x6c, 0x83, 0x67, 0x6c, 0xbd, 0x5e, 0xaf, 0x4a, 0x42, 0xb2, 0x4f, 0xdd, 0x73, 0xa4, 0x23, 0xa0, 0xa9, 0xbe, 0xe0, 0x87, 0xde, 0xa0, 0xf7, 0x4c, 0xb4, 0xf3, 0xbc, 0x03, 0xb9, 0x9f, 0xc7, 0xf5, 0xea, 0x3e, 0x9a, 0xab, 0x76 ],
+const [ 0xc8, 0xf1, 0x6e, 0xfe, 0x63, 0x65, 0x81, 0xb6, 0xab, 0x7a, 0xb7, 0xf3, 0x94, 0x26, 0xbd, 0x03, 0x3d, 0xdc, 0xcb, 0x8e, 0xc5, 0x0d, 0x1b, 0x31, 0x60, 0xef, 0x9f, 0x69, 0xaa, 0x7d, 0xf3, 0xb3, 0x3b, 0xbf, 0x91, 0xf1, 0x7b, 0x4b, 0x44, 0x10, 0xb7, 0x0c, 0xdf, 0xe8, 0x75, 0x42, 0x2e, 0x63, 0x05, 0xca, 0x2d, 0xe2, 0x59, 0xa0, 0x78, 0xdc, 0x17, 0xa2, 0x03, 0xc8, 0xeb, 0x96, 0x0b, 0x3e, 0x22, 0x6f, 0x4c, 0x59, 0x75, 0xcc, 0x75, 0x5f, 0x22, 0xc2, 0xd9, 0xa4, 0x42, 0xdb, 0x67, 0xab, 0x56, 0x5e, 0xdc, 0x8f, 0x23, 0xd1, 0x37, 0xa1, 0xc0, 0xbd, 0x6d, 0x53, 0xed, 0xb1, 0x5f, 0x55, 0xa6, 0x89, 0x09, 0xfd, 0xf8, 0xf0, 0xfc, 0xec, 0x14, 0x24, 0x0e, 0xef, 0xa2, 0xfa, 0x50, 0x23, 0x57, 0x21, 0x40, 0x5d, 0xca, 0xaa, 0x40, 0xc8, 0x83, 0xc8, 0x47, 0xd0, 0x55, 0xd5, 0xd7, 0x3f ],
+const [ 0xca, 0xd5, 0x34, 0xc8, 0x66, 0x29, 0xfc, 0x60, 0x0b, 0x38, 0x13, 0x8a, 0x7f, 0x3e, 0x1a, 0x70, 0x1b, 0xc4, 0xbd, 0x1f, 0x86, 0x5f, 0x96, 0xda, 0xc3, 0x9a, 0x4e, 0xb4, 0x6e, 0x31, 0x06, 0x5e, 0x42, 0x80, 0xf5, 0x3d, 0xdf, 0x3a, 0x52, 0xbf, 0xca, 0x5e, 0x74, 0xf0, 0xb6, 0x67, 0x38, 0x48, 0x02, 0xc4, 0xa3, 0xc7, 0x82, 0x87, 0xc8, 0x45, 0x82, 0x61, 0xec, 0x03, 0x08, 0xce, 0xe9, 0x85, 0x5a, 0x8d, 0xd0, 0xa4, 0xc0, 0x53, 0xd2, 0xdf, 0x8b, 0xc0, 0x61, 0xf2, 0x56, 0x92, 0x92, 0xaa, 0x8c, 0x19, 0xc6, 0xf7, 0x2b, 0xeb, 0x89, 0x43, 0xc7, 0xd8, 0xba, 0x02, 0xd1, 0x20, 0xed, 0x8a, 0x19, 0xe4, 0x0d, 0x25, 0x92, 0xdb, 0x46, 0x65, 0x55, 0x46, 0x21, 0xb8, 0xe9, 0x26, 0xf1, 0x3c, 0xc2, 0xac, 0x6f, 0xd5, 0x07, 0xf1, 0xa1, 0x7c, 0x99, 0xe7, 0x00, 0xda, 0x50, 0x90, 0xd9, 0x15 ],
+const [ 0x96, 0xfa, 0x56, 0x19, 0xfa, 0xc6, 0x48, 0x84, 0x3d, 0xb7, 0x88, 0xcb, 0x8e, 0x90, 0xdc, 0x6f, 0xfd, 0x6e, 0xfe, 0x13, 0x32, 0xab, 0xf0, 0x81, 0x5f, 0x03, 0x90, 0xee, 0x73, 0xf5, 0x6c, 0x7f, 0x91, 0x6c, 0xd7, 0x0c, 0xc0, 0x9f, 0x3d, 0x23, 0xe4, 0x36, 0xb3, 0x50, 0xed, 0xae, 0xd2, 0x9b, 0x4e, 0xfe, 0xc6, 0x53, 0xb0, 0x7b, 0xa2, 0x0a, 0xe8, 0xf9, 0xf6, 0xe1, 0x27, 0x33, 0xa4, 0x06, 0x71, 0x6d, 0xef, 0x7a, 0x51, 0x57, 0xd5, 0x18, 0xca, 0x35, 0x9f, 0xd3, 0x90, 0x3d, 0xb6, 0x3f, 0x79, 0x40, 0xb8, 0x53, 0x2e, 0x8d, 0xcb, 0x6d, 0x26, 0x13, 0x32, 0x96, 0xd5, 0xc5, 0x1e, 0x07, 0x20, 0x43, 0xc6, 0xed, 0x15, 0xb6, 0xb9, 0x6a, 0xd9, 0xfb, 0x73, 0xdc, 0xe1, 0x05, 0x2f, 0x61, 0x65, 0x7c, 0xfd, 0x9b, 0x12, 0xaa, 0x14, 0xb0, 0x00, 0x98, 0x69, 0x95, 0xe3, 0x74, 0x81, 0x8d ],
+const [ 0x91, 0xf8, 0xec, 0x84, 0x8d, 0x6f, 0x81, 0x14, 0x31, 0xcb, 0xde, 0xee, 0x15, 0x0b, 0x93, 0xaf, 0x6f, 0x67, 0x8b, 0xe9, 0x9c, 0x90, 0x3f, 0x81, 0xfc, 0x38, 0x29, 0x55, 0x03, 0xd5, 0x7c, 0x22, 0x8d, 0xa2, 0x12, 0xa6, 0x72, 0xe7, 0xa6, 0x01, 0x5b, 0x7b, 0x43, 0x61, 0xd4, 0x87, 0xfc, 0xde, 0xa2, 0x8c, 0xde, 0xa3, 0x56, 0xa8, 0x23, 0x4f, 0x22, 0x15, 0xa8, 0x9b, 0xec, 0xf2, 0xa2, 0x3c, 0xa1, 0x46, 0x8c, 0x0b, 0xcc, 0x42, 0x64, 0x63, 0x67, 0xc6, 0x16, 0xca, 0xf0, 0x27, 0x39, 0xd4, 0xc0, 0x30, 0xf9, 0x45, 0x99, 0x66, 0x54, 0x76, 0x7e, 0x90, 0x8a, 0xfa, 0xc7, 0x77, 0xce, 0x80, 0x74, 0xeb, 0x42, 0xfb, 0xc2, 0x06, 0x22, 0x01, 0xfc, 0xb5, 0x3f, 0x71, 0x94, 0x73, 0xb0, 0x59, 0x72, 0x58, 0xc4, 0x17, 0x8c, 0x53, 0x3b, 0xbe, 0xb7, 0xb4, 0xb5, 0xbb, 0xbc, 0xed, 0x6a, 0xb8 ],
+const [ 0x5a, 0x52, 0x91, 0x14, 0xba, 0x6b, 0xda, 0xb6, 0x9b, 0xad, 0xa5, 0xe8, 0x91, 0x6f, 0xb6, 0xeb, 0x22, 0x2c, 0x71, 0x25, 0x6f, 0x91, 0x9d, 0xd1, 0x17, 0xd3, 0x69, 0xf6, 0x58, 0x46, 0xac, 0x95, 0x77, 0x2c, 0x71, 0x27, 0x62, 0xca, 0xb3, 0x47, 0x95, 0xc2, 0x65, 0xab, 0x3a, 0x9c, 0xb6, 0x58, 0x94, 0xa6, 0x92, 0x16, 0x9d, 0xfe, 0x6c, 0x22, 0xee, 0xed, 0x3b, 0x24, 0xe0, 0x76, 0xc2, 0x60, 0xf1, 0x2f, 0x15, 0x30, 0x69, 0x50, 0x59, 0xb2, 0x3d, 0x0a, 0xcb, 0xbe, 0x33, 0x1a, 0x04, 0x1b, 0x47, 0x9d, 0x7b, 0xf2, 0x4d, 0x26, 0x4b, 0x82, 0xd9, 0x0e, 0x36, 0x16, 0x5c, 0x0b, 0xea, 0x34, 0x8f, 0x04, 0x84, 0x18, 0x15, 0x24, 0x53, 0x61, 0x5c, 0x2e, 0xde, 0x09, 0xc4, 0x10, 0x28, 0x9a, 0x03, 0xba, 0x32, 0x9f, 0xc8, 0x30, 0xc2, 0x59, 0x9e, 0xde, 0x63, 0xb4, 0x13, 0x2d, 0xad, 0x79 ],
+const [ 0xf6, 0xd9, 0x56, 0x5e, 0xf9, 0x7e, 0xa1, 0x17, 0x48, 0x68, 0x9e, 0x26, 0x3f, 0x52, 0xb4, 0xaf, 0x88, 0x0f, 0xf5, 0xc8, 0xed, 0x12, 0x95, 0x22, 0x6a, 0x34, 0xa1, 0xec, 0x87, 0xb2, 0xed, 0xf4, 0xe5, 0x75, 0x4f, 0x10, 0x16, 0x97, 0x0a, 0xbc, 0xb1, 0x22, 0x8d, 0x04, 0xa6, 0x1b, 0x5e, 0xa5, 0xd0, 0xbf, 0x51, 0x6f, 0xc9, 0x0c, 0xfd, 0xed, 0x02, 0x83, 0x70, 0x48, 0x13, 0x2d, 0x22, 0x69, 0x4f, 0xdc, 0x28, 0x5e, 0x9c, 0xb3, 0xaa, 0xff, 0x82, 0xe8, 0x97, 0xd1, 0x81, 0xc9, 0x97, 0x2a, 0xa8, 0xfd, 0x42, 0x96, 0x63, 0x0d, 0x8f, 0x7a, 0x95, 0x23, 0x8f, 0xf7, 0xe6, 0x11, 0x5b, 0x11, 0x5f, 0x94, 0x4b, 0x11, 0x34, 0xda, 0x68, 0x27, 0xe0, 0x43, 0x24, 0x54, 0x77, 0x65, 0x49, 0x87, 0x38, 0x52, 0x30, 0x07, 0x62, 0x1d, 0x33, 0x10, 0x4a, 0x9a, 0x64, 0xc1, 0xa9, 0x66, 0x80, 0x36 ],
+const [ 0x68, 0xde, 0x2a, 0x68, 0xbd, 0x42, 0x15, 0xac, 0x21, 0xbf, 0xe2, 0xb6, 0xf0, 0xd2, 0x6f, 0xfd, 0x90, 0xd4, 0xff, 0xc9, 0xf9, 0x72, 0xdd, 0x47, 0x74, 0x5e, 0x43, 0xdd, 0xa2, 0x44, 0x79, 0xbb, 0xc1, 0x00, 0x41, 0xb3, 0x2b, 0x0e, 0x73, 0x4a, 0x1f, 0x41, 0xe5, 0x0f, 0xc4, 0xb8, 0x8d, 0x2b, 0x6b, 0x0f, 0xea, 0x3a, 0x15, 0xd2, 0x9f, 0x59, 0x35, 0x37, 0x62, 0x80, 0xb7, 0x0c, 0x14, 0x13, 0x40, 0xee, 0x31, 0xb3, 0xb8, 0xbc, 0x6b, 0x5a, 0x06, 0x4b, 0x92, 0xa7, 0x1a, 0x5b, 0xb7, 0x76, 0x31, 0xca, 0x91, 0xb4, 0x54, 0x08, 0x20, 0x72, 0x22, 0xcb, 0x8f, 0x37, 0xd0, 0x04, 0x5f, 0x9b, 0x6e, 0x11, 0xc2, 0x11, 0x6c, 0x34, 0x45, 0x05, 0x5c, 0x44, 0xb2, 0x27, 0xf9, 0xa2, 0x35, 0x06, 0x69, 0x6f, 0xbd, 0xe0, 0xbf, 0xfc, 0xa5, 0xb8, 0xc4, 0x82, 0x94, 0xaa, 0xf7, 0x14, 0xa2, 0x7c ],
+const [ 0xe1, 0xdb, 0x8f, 0x7b, 0xcc, 0x0e, 0x5c, 0x22, 0xee, 0xa3, 0xe8, 0xdc, 0xe3, 0x9a, 0xc2, 0x50, 0xc8, 0x68, 0x1d, 0x30, 0x95, 0xf8, 0xc8, 0x61, 0xad, 0xf0, 0x60, 0x5c, 0xb4, 0x35, 0xc4, 0xd4, 0xa1, 0xb1, 0xc9, 0x99, 0x14, 0x54, 0x2f, 0xbc, 0xe9, 0x58, 0xd4, 0xf4, 0x0d, 0xca, 0x28, 0x40, 0x90, 0x46, 0xe1, 0xce, 0xfc, 0x02, 0xf0, 0x1c, 0xe6, 0x0d, 0xb3, 0x5d, 0xc2, 0xd9, 0x6c, 0x1e, 0xfc, 0xf8, 0xf2, 0x29, 0x44, 0x23, 0xa6, 0xa9, 0x29, 0x80, 0xa9, 0x90, 0xe9, 0x25, 0x4c, 0x36, 0x87, 0xd8, 0xc8, 0x42, 0x1f, 0x18, 0x30, 0xce, 0x77, 0x62, 0xa3, 0xc6, 0xd6, 0xad, 0xc6, 0x91, 0x19, 0x37, 0x71, 0xf4, 0x03, 0x83, 0xa9, 0x33, 0xd5, 0xa2, 0xcf, 0x79, 0x1e, 0xb3, 0x16, 0x79, 0xd5, 0xa6, 0x3b, 0x56, 0xa5, 0x45, 0x70, 0xc0, 0x88, 0x74, 0x99, 0x61, 0x97, 0xb7, 0xba, 0x77 ],
+const [ 0x28, 0x5d, 0x72, 0x49, 0xef, 0x30, 0xbf, 0x4b, 0x6e, 0x5f, 0x6b, 0xdc, 0x3c, 0xba, 0x55, 0x70, 0xc7, 0x7f, 0x11, 0x5d, 0xe0, 0xd0, 0x8a, 0xee, 0x7a, 0x63, 0xec, 0xb2, 0xae, 0x7c, 0xc1, 0x1a, 0x03, 0x18, 0x5a, 0x43, 0xed, 0x6b, 0x70, 0x11, 0x93, 0x8d, 0x0b, 0x7d, 0xd5, 0x71, 0xa3, 0x30, 0x8e, 0x16, 0x85, 0x50, 0x16, 0x01, 0x79, 0x9a, 0x0c, 0xea, 0xa2, 0xb1, 0x52, 0xb6, 0xa5, 0xb5, 0x58, 0xa5, 0x0e, 0x18, 0x9e, 0xcd, 0xef, 0xad, 0x74, 0xc7, 0xc9, 0x02, 0x05, 0xa8, 0xb0, 0xf0, 0x93, 0x32, 0xab, 0x70, 0x04, 0x4c, 0x5a, 0xb0, 0x9e, 0xb0, 0xdb, 0x67, 0x0f, 0xe4, 0xed, 0x65, 0xb0, 0x6b, 0x56, 0x6e, 0x0a, 0x3c, 0x83, 0x48, 0x9a, 0x73, 0x6f, 0x13, 0xd1, 0x47, 0xc6, 0xd9, 0x5f, 0x3c, 0x49, 0x66, 0xb1, 0x99, 0x74, 0x5a, 0xb8, 0x1d, 0x5e, 0x7c, 0xed, 0xee, 0xe2, 0x51 ],
+const [ 0x2b, 0x7e, 0x03, 0x68, 0x0c, 0x9c, 0xa6, 0xc7, 0x59, 0xb6, 0x92, 0x93, 0x83, 0xca, 0xdf, 0x56, 0x7e, 0x4e, 0x38, 0xdd, 0x72, 0x16, 0x31, 0x3c, 0xb4, 0x77, 0xdb, 0x12, 0xf4, 0xad, 0x97, 0x0e, 0xb8, 0x7a, 0x27, 0xb2, 0x09, 0x10, 0x0b, 0x57, 0x6b, 0x31, 0x0a, 0x72, 0x13, 0x95, 0x0f, 0x15, 0x55, 0x8c, 0x36, 0xb9, 0x5c, 0xe4, 0x27, 0x3a, 0x1d, 0x0d, 0xa3, 0x23, 0x8d, 0x7b, 0x5c, 0x2c, 0x12, 0x4c, 0x0a, 0x01, 0x38, 0x2b, 0xbb, 0x45, 0xa6, 0x74, 0x6a, 0xd7, 0x50, 0x98, 0xd4, 0x54, 0xee, 0xc4, 0x87, 0xdd, 0xac, 0xbd, 0x3c, 0x1a, 0x23, 0x0f, 0x66, 0x7e, 0x88, 0x66, 0x0b, 0xcd, 0x23, 0x3c, 0xd3, 0xdc, 0x03, 0xb4, 0x5f, 0x99, 0xf1, 0xc6, 0xdb, 0x4a, 0xa2, 0x9d, 0xd7, 0x1a, 0x31, 0x3d, 0x52, 0xd1, 0xcc, 0x69, 0x18, 0xe3, 0xad, 0xc4, 0x4f, 0xac, 0x4b, 0x36, 0x4c, 0xfa ],
+const [ 0x59, 0x88, 0xc7, 0x94, 0xc1, 0xf1, 0xe8, 0x5d, 0x23, 0xd6, 0x5b, 0xe0, 0x40, 0xc0, 0x12, 0x9b, 0xb8, 0xa6, 0xbb, 0xcc, 0xd8, 0x6c, 0x3b, 0x1e, 0xb3, 0xa9, 0x58, 0x87, 0x74, 0xad, 0xb5, 0x71, 0xf2, 0xc3, 0x04, 0x18, 0x85, 0xb3, 0x77, 0x33, 0x19, 0x8b, 0x77, 0xd6, 0x80, 0x9f, 0x99, 0x97, 0x0d, 0xcf, 0xce, 0xf0, 0x5e, 0x08, 0xda, 0xe4, 0x79, 0x0e, 0x07, 0xe5, 0x1b, 0x78, 0x1a, 0xf6, 0x4c, 0xfc, 0x86, 0x0d, 0x37, 0xec, 0xe0, 0xbb, 0x39, 0x01, 0x93, 0x0e, 0x38, 0x58, 0xd5, 0xb7, 0x36, 0xba, 0xd9, 0x68, 0x25, 0x20, 0x46, 0x80, 0xfd, 0x76, 0xe9, 0xea, 0x0d, 0xa0, 0xa6, 0x42, 0x8e, 0xbb, 0xb5, 0x3a, 0x7e, 0xa5, 0x0b, 0x3d, 0xac, 0xbf, 0x15, 0x52, 0x0f, 0xf1, 0xac, 0x42, 0x5b, 0xef, 0x46, 0xfd, 0xd6, 0xbb, 0x69, 0x3a, 0x68, 0x6c, 0x66, 0x5e, 0xf2, 0x2d, 0x43, 0x9f ],
+const [ 0xe8, 0xbf, 0xc5, 0xc0, 0x9e, 0xc4, 0x80, 0x73, 0x19, 0xd8, 0xf7, 0x36, 0x95, 0x56, 0xe7, 0x65, 0x4e, 0x98, 0x16, 0x39, 0xe8, 0xc5, 0xdd, 0x3f, 0x0f, 0xea, 0xe3, 0x08, 0x5b, 0x4d, 0x2b, 0x22, 0x76, 0xfe, 0x51, 0x48, 0x80, 0xae, 0x10, 0xd6, 0xb2, 0xc4, 0x08, 0x80, 0x42, 0xae, 0xbe, 0x42, 0x87, 0x75, 0xe5, 0x9a, 0x5e, 0x95, 0xdc, 0xf6, 0xcc, 0x0b, 0x77, 0x68, 0xe5, 0xaf, 0x02, 0xa1, 0xec, 0xc4, 0x83, 0x1d, 0xbb, 0xce, 0x40, 0x9b, 0x65, 0xa3, 0x81, 0xd0, 0x1b, 0xc5, 0x97, 0x5c, 0x4c, 0xef, 0x1d, 0xfd, 0x10, 0xee, 0x7e, 0x03, 0xc7, 0xb2, 0xb8, 0x04, 0xfd, 0xa5, 0x5f, 0xd0, 0x92, 0x3c, 0xe4, 0xa7, 0x17, 0xcb, 0x17, 0xaa, 0x7a, 0x9d, 0xeb, 0x90, 0xe6, 0x44, 0x79, 0x9a, 0xe5, 0x2e, 0x48, 0xc9, 0xc8, 0x79, 0xcc, 0x4e, 0x48, 0x08, 0x2c, 0x42, 0x6d, 0xd7, 0x49, 0x97 ],
+const [ 0x7d, 0x70, 0xcf, 0xf8, 0xdf, 0x77, 0x77, 0x0e, 0xaf, 0x0c, 0xe6, 0x71, 0xb7, 0xa1, 0x5d, 0xaf, 0x5b, 0xdd, 0x75, 0x48, 0x2a, 0xe1, 0x58, 0x12, 0xb3, 0xcf, 0x30, 0xdc, 0x9a, 0x8d, 0xe0, 0x52, 0xeb, 0xc6, 0xf3, 0x21, 0xad, 0x32, 0xd1, 0x5b, 0xbb, 0x18, 0x39, 0x1c, 0xcf, 0x11, 0xeb, 0x6e, 0xe0, 0x0e, 0xa5, 0x6a, 0xae, 0x9c, 0x51, 0xa0, 0x9b, 0x67, 0x7d, 0xb9, 0xbc, 0xfd, 0x0b, 0x5b, 0x30, 0xd5, 0x2a, 0x4d, 0xb0, 0x90, 0x85, 0xdc, 0x68, 0x7e, 0xba, 0x7d, 0x05, 0x64, 0x0d, 0xb3, 0x10, 0x7d, 0x5e, 0x33, 0x7a, 0xbe, 0x58, 0x47, 0x78, 0x5e, 0xec, 0x70, 0x91, 0x96, 0xfd, 0x4f, 0xf4, 0xa6, 0x5d, 0xc5, 0x10, 0x18, 0xf9, 0x5a, 0x5f, 0x48, 0x50, 0xdb, 0x82, 0x24, 0x2a, 0x47, 0x93, 0x31, 0x86, 0xed, 0xb7, 0xcf, 0xd4, 0xce, 0xf2, 0xbd, 0x64, 0x48, 0x40, 0xdf, 0x1f, 0xf6 ],
+const [ 0xf9, 0x59, 0x8e, 0x9f, 0x4e, 0xce, 0x15, 0x9b, 0xeb, 0x89, 0x73, 0x17, 0xf6, 0x25, 0xa6, 0xa7, 0x08, 0xe9, 0xaa, 0xeb, 0x8e, 0x9d, 0xf7, 0x06, 0x70, 0x9c, 0x4c, 0x52, 0xf1, 0x2b, 0xab, 0x53, 0xd7, 0x09, 0xa4, 0xe9, 0xcb, 0x48, 0xd7, 0xc9, 0x02, 0x5a, 0xb5, 0x2d, 0x1d, 0x6f, 0x86, 0xcb, 0x4e, 0xff, 0xb0, 0x04, 0xbd, 0xa2, 0x36, 0x5f, 0x2a, 0x28, 0x7f, 0x35, 0xd3, 0xe6, 0x59, 0xae, 0x98, 0x4e, 0x3d, 0xec, 0x5d, 0xc3, 0xd5, 0x85, 0xb0, 0xab, 0xbb, 0x37, 0xab, 0xc5, 0x84, 0xd7, 0x1c, 0xbc, 0xfd, 0x8b, 0xe4, 0xfd, 0xb4, 0x39, 0x9d, 0xc6, 0xba, 0x3f, 0x80, 0x80, 0xa8, 0x65, 0x85, 0x4f, 0xe0, 0x0f, 0xcb, 0xe7, 0x15, 0xb8, 0x3b, 0xa1, 0x0e, 0x9b, 0x69, 0xce, 0xa6, 0xb3, 0xba, 0x4b, 0x18, 0xe6, 0xcc, 0x56, 0x79, 0x7e, 0x12, 0x9f, 0x86, 0xd8, 0xbf, 0xa2, 0xa0, 0x60 ],
+const [ 0x0f, 0x80, 0xcc, 0xfe, 0x5a, 0xde, 0x38, 0x6b, 0x40, 0xe4, 0x3f, 0x48, 0x13, 0x6a, 0xed, 0xbe, 0x69, 0x84, 0x93, 0x30, 0x27, 0x4b, 0x76, 0x1e, 0xde, 0xe1, 0xc4, 0x4a, 0x5b, 0xaf, 0xcc, 0x19, 0x79, 0xf1, 0x6d, 0x3b, 0x3a, 0x75, 0xcf, 0x8e, 0x16, 0x9f, 0x52, 0x40, 0x93, 0xb1, 0xc4, 0x35, 0x16, 0x49, 0xd7, 0xa8, 0xf9, 0x2c, 0xd2, 0x14, 0xdd, 0x41, 0x86, 0x55, 0x42, 0xe1, 0x84, 0x0a, 0x55, 0x4e, 0x8d, 0x3f, 0x08, 0x80, 0x4a, 0x49, 0x68, 0x28, 0x3d, 0xf0, 0x2c, 0xef, 0xf8, 0xd4, 0x89, 0xfe, 0x8d, 0x09, 0x4e, 0xc4, 0x45, 0x05, 0x2c, 0xf3, 0x95, 0xbc, 0x55, 0xcc, 0x4d, 0x09, 0x4a, 0x9d, 0x13, 0x50, 0xed, 0x88, 0x10, 0x62, 0xde, 0x85, 0xe9, 0xa0, 0x04, 0xaa, 0xf1, 0x64, 0x6a, 0xab, 0x9d, 0x9c, 0x4d, 0x9d, 0x38, 0xb8, 0x73, 0xff, 0xd7, 0xc7, 0xbe, 0xfa, 0x90, 0xdc ],
+const [ 0x49, 0x86, 0x7d, 0xfd, 0x01, 0x5a, 0x50, 0xdf, 0x8c, 0x67, 0x61, 0x41, 0xee, 0xef, 0x02, 0xfa, 0x2c, 0x34, 0x75, 0x15, 0xbb, 0x25, 0x02, 0x8d, 0x39, 0x3d, 0x47, 0x55, 0x5b, 0xa9, 0xd0, 0x9b, 0x27, 0xa9, 0xe7, 0x4e, 0x63, 0x38, 0xad, 0xde, 0x4d, 0xef, 0x6a, 0x43, 0x8c, 0x27, 0x22, 0x40, 0x67, 0x5e, 0x69, 0xe9, 0x35, 0xdc, 0x77, 0x63, 0x14, 0x95, 0x7f, 0xeb, 0xde, 0x52, 0x3d, 0x19, 0x59, 0x0c, 0xcf, 0x66, 0xae, 0x98, 0xc5, 0xed, 0x1d, 0x8a, 0x7b, 0x6e, 0xee, 0x53, 0xa7, 0x98, 0xab, 0xac, 0x2e, 0x88, 0x8c, 0x38, 0x3c, 0x8d, 0x33, 0x64, 0x93, 0x2e, 0x99, 0x93, 0x23, 0x6e, 0x49, 0x78, 0xdb, 0x4e, 0xcc, 0xc2, 0xc0, 0x94, 0x64, 0xff, 0x3c, 0xcb, 0xfd, 0xba, 0xb8, 0x8b, 0x60, 0xe7, 0x6d, 0xfa, 0xaa, 0x82, 0x76, 0x93, 0xfc, 0x72, 0x2a, 0x26, 0x75, 0xb3, 0xaa, 0x20 ],
+const [ 0x20, 0x4c, 0xdf, 0x0f, 0x38, 0x42, 0x80, 0xe3, 0xd5, 0x5f, 0x8d, 0xd0, 0x10, 0xe8, 0x86, 0x66, 0x08, 0x0d, 0x2d, 0x72, 0x2a, 0x1c, 0xe7, 0xcf, 0xaf, 0xf5, 0x64, 0x7f, 0x65, 0xbe, 0x82, 0xfa, 0xb3, 0xd8, 0x6f, 0xc6, 0xd7, 0x11, 0x0e, 0x48, 0x73, 0x1b, 0x9d, 0xda, 0x48, 0x3d, 0x94, 0x1e, 0x41, 0x48, 0xd0, 0x91, 0xb3, 0xcd, 0xf0, 0x63, 0xe3, 0x8d, 0x00, 0x86, 0xc9, 0x31, 0x55, 0x05, 0x13, 0x3b, 0xb7, 0x97, 0x6d, 0x3d, 0xc6, 0x74, 0x00, 0x48, 0x96, 0x67, 0x38, 0xa8, 0x9d, 0x24, 0xcb, 0xce, 0xcf, 0xdd, 0xf7, 0x8e, 0x07, 0x10, 0x0b, 0x8b, 0xa9, 0xa3, 0x28, 0xef, 0x85, 0x32, 0x49, 0x5f, 0xff, 0xa8, 0x81, 0x2e, 0x6d, 0x0c, 0x84, 0xd0, 0xc1, 0x9e, 0x69, 0x92, 0x68, 0x23, 0xae, 0x89, 0x72, 0x7d, 0x7d, 0xc8, 0xf2, 0x7e, 0x2d, 0xd6, 0xa8, 0xfe, 0x0c, 0x60, 0xdd, 0x2b ],
+const [ 0x44, 0xc7, 0xcc, 0x06, 0xad, 0x29, 0x0f, 0x3a, 0x54, 0xa9, 0x70, 0xb6, 0x40, 0x01, 0x4c, 0xb5, 0xd1, 0xe6, 0x18, 0x23, 0x52, 0x45, 0x99, 0x01, 0xcd, 0xcd, 0x57, 0x0c, 0x23, 0xad, 0x4f, 0x99, 0x5b, 0x9f, 0xe8, 0xc4, 0x3b, 0x25, 0x28, 0xc9, 0x15, 0x12, 0x28, 0xb2, 0xe4, 0x4d, 0xc5, 0x33, 0x98, 0xd2, 0x99, 0xd2, 0xad, 0xf9, 0x2a, 0x4a, 0x02, 0xfb, 0x60, 0x32, 0xe9, 0xb2, 0x3d, 0xda, 0x7a, 0xa0, 0xc8, 0x76, 0x2e, 0x33, 0x4a, 0x7e, 0xa9, 0x47, 0xbd, 0x54, 0xd6, 0xed, 0x82, 0x28, 0x39, 0x6b, 0x52, 0x19, 0x81, 0x84, 0x77, 0x9c, 0x5d, 0xf9, 0x3c, 0x22, 0x91, 0x4f, 0xa2, 0xf5, 0x49, 0xd3, 0x54, 0x63, 0xad, 0xdc, 0xdd, 0x1f, 0xb5, 0x50, 0x19, 0xe4, 0x3f, 0x69, 0xe9, 0x5b, 0x5f, 0xb9, 0x2b, 0x3f, 0xf6, 0x6c, 0xea, 0xbf, 0x86, 0xce, 0xd1, 0x24, 0x44, 0x0d, 0xe6, 0xb3 ],
+const [ 0x78, 0x7f, 0xda, 0xa9, 0x0a, 0x2d, 0xe3, 0x93, 0x7e, 0x79, 0x42, 0xe6, 0x71, 0x1f, 0x16, 0x5a, 0x89, 0xb9, 0xe0, 0x77, 0xfe, 0x32, 0x2c, 0xab, 0x59, 0x7d, 0x74, 0x9a, 0x7c, 0x87, 0x41, 0xb5, 0xe3, 0x6a, 0x93, 0x0e, 0x29, 0xe3, 0x83, 0x6a, 0xce, 0x06, 0x27, 0x98, 0x37, 0x30, 0xb6, 0x02, 0xf6, 0x3e, 0xec, 0x82, 0x4c, 0xfc, 0xb0, 0x77, 0xec, 0xe0, 0xf5, 0x17, 0x02, 0xf9, 0xde, 0x07, 0x74, 0x22, 0x25, 0x29, 0x68, 0x7b, 0xbd, 0xb5, 0x06, 0x1a, 0xb6, 0x8b, 0x7f, 0xfd, 0x62, 0xc7, 0x4e, 0x43, 0xb6, 0x96, 0xbe, 0x9c, 0xf2, 0x49, 0xac, 0xff, 0x85, 0xa8, 0x8e, 0x9b, 0x2a, 0x89, 0xb4, 0x0f, 0x58, 0xa1, 0xce, 0xdd, 0xd9, 0x99, 0xaf, 0x1c, 0xb8, 0x64, 0x50, 0x6e, 0x61, 0xd1, 0x18, 0x32, 0x04, 0x5c, 0x5a, 0xfb, 0x3a, 0x4a, 0x20, 0x40, 0xeb, 0xf5, 0x27, 0x55, 0x6f, 0x64 ],
+const [ 0xf9, 0xa9, 0xc1, 0x6e, 0x3a, 0x4b, 0xef, 0xf0, 0xd3, 0x64, 0x30, 0xc0, 0xe7, 0xe1, 0xd6, 0xbd, 0x68, 0x34, 0x94, 0x98, 0xd2, 0x40, 0xd8, 0xdc, 0x19, 0x75, 0x5a, 0x2c, 0xdf, 0x3c, 0xf5, 0xcc, 0xeb, 0x95, 0xb7, 0x64, 0xd7, 0xfe, 0x34, 0x00, 0x08, 0x98, 0x1f, 0x5a, 0xe4, 0x85, 0x1b, 0x5c, 0x3e, 0x94, 0xce, 0xe1, 0x15, 0x20, 0x37, 0xbc, 0x7f, 0x35, 0x42, 0xfb, 0xe0, 0xf5, 0x9a, 0x6d, 0x5f, 0x3a, 0xbf, 0x61, 0x9b, 0x7d, 0x58, 0xb1, 0x99, 0xf7, 0xca, 0xff, 0x02, 0x05, 0x09, 0x3f, 0x8b, 0xd1, 0xaf, 0x75, 0xb4, 0x2f, 0x4b, 0xc0, 0xb5, 0xc5, 0xfb, 0x98, 0xb5, 0x6f, 0x3d, 0x54, 0x3e, 0xe2, 0x02, 0xef, 0xee, 0x8f, 0x04, 0x0b, 0x6f, 0xca, 0x5a, 0x36, 0xa9, 0x2b, 0x49, 0x6d, 0x35, 0x34, 0x5e, 0xde, 0x15, 0x35, 0xb9, 0xf2, 0xa3, 0x6d, 0xac, 0x8b, 0xc8, 0x72, 0x85, 0x8b ],
+const [ 0xb9, 0x49, 0xdf, 0x3b, 0x02, 0x87, 0x1b, 0xea, 0x09, 0x76, 0x87, 0x3a, 0x9c, 0x76, 0x94, 0x2a, 0xc9, 0x34, 0xce, 0x63, 0xac, 0x29, 0x56, 0xd2, 0x85, 0x64, 0x92, 0x97, 0x0d, 0x8a, 0x23, 0x1e, 0x0b, 0x1b, 0x17, 0x8b, 0x22, 0xf6, 0x60, 0x5c, 0xed, 0x20, 0x85, 0x49, 0x4e, 0xc1, 0x98, 0x6f, 0x02, 0x6f, 0x68, 0xae, 0x79, 0xaf, 0xf7, 0x50, 0xe5, 0xb9, 0x2f, 0xeb, 0x92, 0x7c, 0xd0, 0x88, 0x75, 0xe2, 0xad, 0x04, 0x07, 0x55, 0x18, 0xb7, 0x54, 0x82, 0x9b, 0x54, 0x4e, 0x5d, 0xe9, 0x10, 0x68, 0x65, 0x13, 0x07, 0x60, 0x29, 0xff, 0xdb, 0x5c, 0x0b, 0x17, 0x9e, 0x39, 0x44, 0x3e, 0xf2, 0x20, 0x28, 0x08, 0x6e, 0x5a, 0xab, 0x2a, 0x44, 0x65, 0x25, 0x2f, 0x21, 0x47, 0x52, 0x6d, 0x55, 0x22, 0x9d, 0x38, 0x34, 0x09, 0x9e, 0x55, 0xbc, 0x12, 0xe1, 0xb1, 0x78, 0xac, 0xe9, 0x53, 0xa3 ],
+const [ 0x85, 0x0d, 0x67, 0x37, 0x23, 0x78, 0x9c, 0x78, 0x00, 0x40, 0x62, 0x0a, 0xd9, 0x45, 0xec, 0xe6, 0x18, 0x50, 0xa9, 0x4f, 0x41, 0xef, 0xc6, 0x4c, 0x8c, 0x81, 0xf4, 0x5b, 0xd4, 0x8d, 0x6b, 0x64, 0xaf, 0x58, 0x2e, 0xec, 0xdf, 0xb6, 0x91, 0x8b, 0xe9, 0x20, 0xf9, 0xa0, 0x03, 0x07, 0xe4, 0x43, 0x33, 0x68, 0x29, 0x7b, 0xb6, 0xa1, 0x80, 0xb1, 0x9f, 0x83, 0x44, 0x65, 0xc0, 0xa8, 0x78, 0x20, 0xcd, 0x06, 0x09, 0xaa, 0xbf, 0xc5, 0x52, 0x7c, 0x77, 0x4e, 0xe5, 0x78, 0xa4, 0xa5, 0x89, 0xd8, 0xe6, 0xf8, 0x7f, 0x65, 0x34, 0x78, 0x0a, 0xe9, 0x7b, 0x67, 0x2e, 0xe6, 0x87, 0x72, 0xb7, 0x88, 0x27, 0x42, 0x7d, 0xd9, 0x8c, 0x4e, 0xe7, 0x34, 0xf3, 0xf3, 0xae, 0xfc, 0x84, 0xc6, 0xe3, 0x8d, 0x79, 0x29, 0x34, 0x73, 0x82, 0x1c, 0x6b, 0xdb, 0x68, 0x56, 0x37, 0x46, 0xf1, 0x95, 0x2f, 0x85 ],
+const [ 0xb4, 0xc3, 0x0b, 0x45, 0x13, 0x25, 0xa9, 0x62, 0x1e, 0x25, 0x8a, 0x5d, 0x91, 0xde, 0x6d, 0xcb, 0x42, 0x1c, 0xfe, 0x79, 0x57, 0xc1, 0xa7, 0xf5, 0xb6, 0x67, 0xaa, 0x50, 0xbd, 0x46, 0x6d, 0x23, 0x34, 0x58, 0x14, 0xd0, 0x7f, 0xbc, 0x55, 0x0a, 0x18, 0x59, 0x88, 0x98, 0x3d, 0xc3, 0xfe, 0x55, 0xe6, 0x62, 0x94, 0x7c, 0xfa, 0xd1, 0x88, 0x22, 0xc2, 0x84, 0x8b, 0x04, 0x9e, 0xae, 0x17, 0x83, 0xf7, 0x61, 0x02, 0xed, 0x74, 0xf7, 0x54, 0xfe, 0x71, 0xb2, 0x56, 0xa7, 0xad, 0x9f, 0xeb, 0x0d, 0x42, 0xc0, 0x23, 0xd5, 0xdb, 0x69, 0x0e, 0x9f, 0x21, 0xeb, 0xce, 0xd0, 0x76, 0x70, 0xf0, 0x95, 0xe6, 0x26, 0xfd, 0x25, 0x5a, 0xa0, 0x4b, 0x46, 0x0f, 0x79, 0x19, 0x12, 0x47, 0x3a, 0xdb, 0xfb, 0x3f, 0x7d, 0xd3, 0x0d, 0x60, 0x53, 0xe1, 0x73, 0xb9, 0xe4, 0x9c, 0x3d, 0xad, 0x55, 0xa1, 0x60 ],
+const [ 0x48, 0x7e, 0xe9, 0x33, 0xa4, 0x92, 0x75, 0x72, 0x7c, 0x8e, 0x36, 0x58, 0x8e, 0x4c, 0x68, 0xc2, 0x95, 0xa5, 0x51, 0x6a, 0xb4, 0x41, 0xc8, 0x5b, 0x18, 0xae, 0xf8, 0xa9, 0xda, 0xb0, 0x62, 0x5e, 0x22, 0xd8, 0x21, 0xb7, 0x92, 0x58, 0x72, 0x91, 0xe2, 0x16, 0x73, 0x1e, 0xc7, 0xff, 0x2b, 0xdc, 0x1a, 0x9e, 0xcb, 0xc8, 0x36, 0xed, 0x33, 0xcf, 0xa2, 0x6b, 0xb8, 0x85, 0xf0, 0x6e, 0x25, 0x19, 0xe4, 0xbb, 0xff, 0x89, 0xd9, 0x54, 0x0e, 0x12, 0x61, 0x91, 0x18, 0xeb, 0x2c, 0x72, 0xf0, 0x32, 0x2b, 0x34, 0xb0, 0x27, 0xf4, 0x22, 0x42, 0x98, 0x69, 0xae, 0x25, 0x9c, 0x94, 0xc0, 0x6d, 0x84, 0xd6, 0x4e, 0x0c, 0x0f, 0x41, 0x2d, 0x51, 0xdd, 0x42, 0x27, 0xae, 0x26, 0x83, 0x4d, 0xbe, 0xac, 0x0f, 0x8e, 0x86, 0xee, 0xb8, 0x89, 0xfc, 0x9f, 0xb6, 0xa0, 0xc5, 0x56, 0x90, 0x4e, 0x43, 0x87 ],
+const [ 0x9c, 0x3a, 0x85, 0x24, 0xf8, 0xd6, 0xd9, 0xec, 0x90, 0x7b, 0xe8, 0x03, 0xba, 0xef, 0xee, 0x0a, 0xa0, 0x8b, 0x74, 0xad, 0x4f, 0xf6, 0x0f, 0x86, 0x0a, 0x33, 0x4a, 0x3e, 0xe4, 0xde, 0xe1, 0xf6, 0x8e, 0xb2, 0x30, 0xe5, 0x6d, 0x4f, 0xea, 0x42, 0xef, 0x3a, 0x0e, 0x64, 0x20, 0x26, 0x17, 0x28, 0x78, 0x72, 0x74, 0x93, 0xf7, 0xf2, 0x37, 0xb8, 0x75, 0xf2, 0x11, 0xdc, 0x33, 0x78, 0x7e, 0xd9, 0xb5, 0xca, 0x3d, 0xc0, 0xd4, 0x30, 0x03, 0xc2, 0x0f, 0xfb, 0x70, 0x51, 0x22, 0xc6, 0x42, 0x82, 0xda, 0xfc, 0xc9, 0xb6, 0x27, 0x9b, 0x9b, 0x79, 0x73, 0x37, 0x88, 0xaa, 0x32, 0x41, 0xd0, 0xdd, 0xba, 0x89, 0x94, 0xfd, 0x55, 0x02, 0x8b, 0x36, 0x95, 0xc5, 0xf6, 0x11, 0xe8, 0x59, 0xd6, 0xe1, 0x6c, 0x32, 0x5c, 0x5f, 0x05, 0x77, 0xa1, 0x91, 0xac, 0x09, 0x97, 0xf0, 0x0a, 0xc0, 0x40, 0xc9 ],
+const [ 0xf1, 0xf9, 0xc8, 0x95, 0xab, 0x63, 0xfc, 0xdd, 0x69, 0xae, 0xd7, 0x63, 0xd9, 0x98, 0xa7, 0x88, 0xe9, 0x2d, 0xdb, 0x52, 0x94, 0x47, 0x73, 0x13, 0xfc, 0x56, 0xb5, 0x45, 0xba, 0x5d, 0x22, 0xb9, 0x72, 0x3d, 0xa8, 0xf1, 0xaa, 0x36, 0x19, 0xca, 0xdc, 0xab, 0xdc, 0x5d, 0xc9, 0x25, 0xe3, 0x28, 0x11, 0x9b, 0xdc, 0x69, 0x01, 0xf1, 0xac, 0xcb, 0xac, 0xbe, 0x19, 0x44, 0x3d, 0x52, 0xc6, 0x3e, 0x8b, 0xf8, 0x65, 0xf5, 0xee, 0x78, 0x28, 0x20, 0x52, 0xe0, 0x78, 0xd3, 0x89, 0x84, 0xea, 0xa4, 0xe6, 0x44, 0x6f, 0x0d, 0x07, 0x0d, 0xcb, 0x11, 0xf2, 0xa3, 0x48, 0x22, 0x64, 0x9d, 0xab, 0x43, 0x65, 0xb1, 0x67, 0x6a, 0x20, 0x31, 0x11, 0x28, 0xf2, 0xd6, 0x14, 0x8b, 0xc1, 0xbd, 0xa6, 0x44, 0x8f, 0xaf, 0xfa, 0x05, 0x4e, 0xa5, 0xb7, 0x2d, 0xf6, 0x8b, 0xaa, 0xa7, 0xd6, 0x45, 0xb7, 0x0f ],
+const [ 0x5b, 0x1a, 0x67, 0x54, 0xc3, 0xc3, 0x0c, 0xc2, 0x9d, 0x04, 0x17, 0x79, 0x32, 0x59, 0x22, 0x78, 0x14, 0x54, 0x89, 0x7c, 0x9c, 0x3f, 0x7c, 0xc6, 0x97, 0x03, 0x52, 0x1e, 0x3d, 0x49, 0x20, 0x18, 0x63, 0xde, 0x8b, 0x96, 0xf1, 0x5c, 0xda, 0x8e, 0x95, 0x07, 0x50, 0x0e, 0xb9, 0xf5, 0xb8, 0x7d, 0xb3, 0x72, 0x41, 0x23, 0x3c, 0xa2, 0x8c, 0xec, 0x24, 0x68, 0x04, 0x68, 0x44, 0x87, 0x6e, 0x17, 0xb3, 0x07, 0xc0, 0xe4, 0x3d, 0xdb, 0x37, 0xef, 0x10, 0xc0, 0xa4, 0x8f, 0xb9, 0x68, 0x07, 0x98, 0x4f, 0xd8, 0x5e, 0xd9, 0xee, 0x0f, 0xbf, 0xe9, 0x67, 0xe8, 0xa5, 0x24, 0x36, 0x41, 0x88, 0xf0, 0xb5, 0x5d, 0xb0, 0x45, 0x8f, 0x87, 0x4a, 0x6c, 0x76, 0xf8, 0xbc, 0x06, 0x19, 0xfb, 0x36, 0x51, 0x50, 0x4f, 0x89, 0xa7, 0x9a, 0xcd, 0x3d, 0x47, 0xca, 0x4a, 0xdd, 0x58, 0xfd, 0xbf, 0x96, 0x2b ],
+const [ 0x43, 0x4a, 0x42, 0x27, 0x3f, 0x11, 0xfc, 0x06, 0xbc, 0x8e, 0xed, 0x40, 0x24, 0x50, 0xf1, 0x91, 0x53, 0x99, 0xd7, 0xe0, 0xa7, 0x1c, 0x12, 0x20, 0x56, 0x05, 0xb1, 0x74, 0x05, 0x3a, 0x92, 0x96, 0x96, 0xe0, 0xd2, 0x79, 0x41, 0x22, 0x87, 0x2d, 0xe6, 0x2d, 0xb2, 0x04, 0xa1, 0x7f, 0x6f, 0xf3, 0xa0, 0x62, 0x6f, 0x3a, 0x31, 0xb3, 0xa8, 0x47, 0x1f, 0xe8, 0x4b, 0xd8, 0x3f, 0x52, 0xf7, 0x61, 0x46, 0x9e, 0x2c, 0xad, 0xdd, 0xa2, 0x02, 0xc7, 0xf8, 0x57, 0x1b, 0x1b, 0x63, 0x21, 0xd6, 0xd9, 0x9d, 0x57, 0xc5, 0x9a, 0xea, 0xff, 0x62, 0x46, 0xa4, 0xd9, 0xfd, 0x35, 0xd2, 0xa0, 0xf9, 0x94, 0xfc, 0x8c, 0x38, 0x0b, 0x3d, 0x1b, 0xd4, 0x9c, 0x99, 0x11, 0x10, 0xcf, 0x91, 0xbd, 0x8e, 0x0c, 0xf5, 0x7f, 0xc2, 0x48, 0xfa, 0x87, 0xa6, 0xe4, 0x8c, 0xdf, 0xaf, 0xd1, 0xe5, 0xac, 0x00, 0xf9 ],
+const [ 0xf7, 0x53, 0xf3, 0xe9, 0xb4, 0xbd, 0x18, 0x95, 0xa2, 0x59, 0x49, 0x2b, 0xa1, 0x60, 0x71, 0x3f, 0x00, 0xac, 0x8e, 0x24, 0xdb, 0xbf, 0xab, 0x0d, 0xa7, 0x07, 0x0e, 0x72, 0x0b, 0x61, 0xb2, 0xb6, 0xf1, 0xdb, 0xf8, 0x06, 0xde, 0xbe, 0x99, 0x84, 0x7e, 0xcc, 0xdf, 0xa5, 0x84, 0xc6, 0x15, 0xd7, 0xb1, 0x31, 0x3c, 0x68, 0x31, 0x5a, 0xff, 0xa3, 0x2e, 0x98, 0xe9, 0x3c, 0xa0, 0xd1, 0xd6, 0xee, 0x62, 0x3f, 0xa7, 0x62, 0x8b, 0x74, 0x3a, 0x53, 0xfb, 0x9c, 0x9a, 0xf0, 0x34, 0x03, 0x72, 0x81, 0x6c, 0xd7, 0xc8, 0x4e, 0xe0, 0x2e, 0xe7, 0xbc, 0x6a, 0x4a, 0x9d, 0xba, 0x56, 0x1c, 0xa7, 0x5b, 0x72, 0x08, 0x6a, 0xc4, 0x64, 0xe8, 0xe4, 0x49, 0x40, 0x53, 0xe1, 0xd3, 0x5a, 0x1f, 0x72, 0x85, 0x59, 0x24, 0x9b, 0x9f, 0x8d, 0x43, 0x4c, 0xa2, 0x83, 0xa8, 0x92, 0xb5, 0xd6, 0x4b, 0x0f, 0x47 ],
+const [ 0xc5, 0xff, 0x34, 0xdd, 0x39, 0x8c, 0x10, 0xfc, 0x02, 0x02, 0x77, 0xab, 0x85, 0x05, 0x0c, 0x51, 0xa1, 0xc4, 0xd2, 0x38, 0x88, 0x7e, 0x9b, 0x34, 0xcd, 0x46, 0xc3, 0x86, 0xbe, 0x03, 0x1d, 0xff, 0xf3, 0xba, 0x2e, 0x69, 0x27, 0x10, 0x99, 0x22, 0x47, 0x0a, 0xdb, 0x0a, 0xc9, 0x18, 0x38, 0x9f, 0x3f, 0x52, 0xf5, 0x67, 0x2c, 0x01, 0xc8, 0x8f, 0x16, 0x61, 0x8d, 0xd1, 0xdc, 0xa5, 0x3a, 0x9b, 0x4a, 0x3c, 0x15, 0x6d, 0xeb, 0x53, 0x25, 0x82, 0x1e, 0x9b, 0xe6, 0xb4, 0x6c, 0x4c, 0x41, 0x9a, 0x19, 0x6a, 0xba, 0xf3, 0xf9, 0x47, 0xec, 0x47, 0x85, 0x49, 0x32, 0xcb, 0x2e, 0xed, 0xa8, 0x86, 0xf2, 0x0c, 0x52, 0xb2, 0x2c, 0x5d, 0x9a, 0x65, 0xb0, 0x3c, 0x00, 0x70, 0x17, 0xa9, 0x0d, 0x87, 0x58, 0x94, 0x88, 0xa3, 0x99, 0x58, 0xed, 0xa5, 0x44, 0x85, 0x1b, 0x3c, 0x5c, 0xe2, 0x4d, 0x08 ],
+const [ 0x5e, 0x09, 0xb4, 0x21, 0x39, 0xc3, 0xe0, 0xc7, 0x09, 0x52, 0x7f, 0x4f, 0x86, 0xd7, 0x36, 0x97, 0xaa, 0xbc, 0xdb, 0xec, 0x1d, 0x51, 0x8a, 0xcc, 0xf1, 0xb7, 0xf6, 0xf0, 0x8f, 0xfe, 0xfe, 0x8a, 0xf1, 0x8a, 0x81, 0xcb, 0x12, 0xbb, 0x72, 0xa8, 0xa3, 0xcd, 0x2f, 0xde, 0x00, 0xfc, 0x0e, 0x33, 0x62, 0xec, 0x39, 0xff, 0x56, 0x49, 0xbd, 0xec, 0x6e, 0xaa, 0xdd, 0xfa, 0x36, 0xbc, 0xac, 0xc6, 0x69, 0x9c, 0xdb, 0x0b, 0x65, 0x84, 0xcf, 0x69, 0xdd, 0xaa, 0xf6, 0x65, 0xce, 0x65, 0x5c, 0xb2, 0xb4, 0x92, 0x79, 0xaf, 0xfd, 0x36, 0x4e, 0x30, 0xbe, 0x65, 0xb0, 0x81, 0xa5, 0x62, 0xe3, 0xa8, 0x2f, 0x07, 0x6a, 0xeb, 0x1a, 0x67, 0x1e, 0x92, 0x1e, 0xb3, 0x7e, 0xee, 0xd8, 0x5a, 0x46, 0x9a, 0x07, 0x74, 0x43, 0x01, 0xfa, 0x61, 0x65, 0x20, 0x49, 0xad, 0x16, 0x8e, 0xc4, 0x37, 0xca, 0xb9 ],
+const [ 0x6e, 0xd7, 0xbb, 0x66, 0x53, 0xef, 0x66, 0xce, 0x21, 0xb7, 0xba, 0x0e, 0xe6, 0x16, 0xd0, 0x71, 0x14, 0xc6, 0x4d, 0x92, 0x28, 0x64, 0x2b, 0x15, 0x8a, 0xc3, 0xbc, 0x94, 0xb4, 0x86, 0xeb, 0xdc, 0x97, 0xee, 0xc6, 0x5a, 0x3a, 0xf0, 0x39, 0xd0, 0xa5, 0x8b, 0x1c, 0x4c, 0xfd, 0x58, 0x71, 0x5b, 0xf0, 0x63, 0xe6, 0x7a, 0x54, 0x39, 0xa2, 0xcd, 0x0a, 0x42, 0x3d, 0x14, 0x29, 0x51, 0x10, 0xda, 0x58, 0x7a, 0xb0, 0xef, 0x7c, 0x24, 0xb5, 0x19, 0x94, 0x5e, 0xc0, 0x07, 0xe0, 0x77, 0xbc, 0x86, 0x49, 0xc8, 0x63, 0xf8, 0xfd, 0xd5, 0x04, 0x01, 0x5a, 0x95, 0x84, 0x83, 0x0d, 0x0d, 0xa4, 0xcd, 0x7b, 0x24, 0x81, 0x0f, 0x60, 0xb2, 0x61, 0x11, 0xb5, 0xda, 0xac, 0x25, 0xd8, 0x9a, 0x39, 0x5b, 0xe7, 0xa0, 0xcb, 0xf3, 0x6c, 0x5f, 0xdc, 0x18, 0x40, 0x63, 0x99, 0xcb, 0xa9, 0xe1, 0x2d, 0x1d ],
+const [ 0xa3, 0xce, 0x88, 0x99, 0xdf, 0x10, 0x22, 0xe8, 0xd2, 0xd5, 0x39, 0xb4, 0x7b, 0xf0, 0xe3, 0x09, 0xc6, 0x6f, 0x84, 0x09, 0x5e, 0x21, 0x43, 0x8e, 0xc3, 0x55, 0xbf, 0x11, 0x9c, 0xe5, 0xfd, 0xcb, 0x4e, 0x73, 0xa6, 0x19, 0xcd, 0xf3, 0x6f, 0x25, 0xb3, 0x69, 0xd8, 0xc3, 0x8f, 0xf4, 0x19, 0x99, 0x7f, 0x0c, 0x59, 0x83, 0x01, 0x08, 0x22, 0x36, 0x06, 0xe3, 0x12, 0x23, 0x48, 0x3f, 0xd3, 0x9e, 0xde, 0xaa, 0x4d, 0x3f, 0x0d, 0x21, 0x19, 0x88, 0x62, 0xd2, 0x39, 0xc9, 0xfd, 0x26, 0x07, 0x41, 0x30, 0xff, 0x6c, 0x86, 0x49, 0x3f, 0x52, 0x27, 0xab, 0x89, 0x5c, 0x8f, 0x24, 0x4b, 0xd4, 0x2c, 0x7a, 0xfc, 0xe5, 0xd1, 0x47, 0xa2, 0x0a, 0x59, 0x07, 0x98, 0xc6, 0x8e, 0x70, 0x8e, 0x96, 0x49, 0x02, 0xd1, 0x24, 0xda, 0xde, 0xcd, 0xbd, 0xa9, 0xdb, 0xd0, 0x05, 0x1e, 0xd7, 0x10, 0xe9, 0xbf ],
+const [ 0x52, 0xb1, 0x13, 0x61, 0x4b, 0x80, 0xb9, 0x70, 0x51, 0x0f, 0x65, 0xa2, 0x5d, 0x46, 0xed, 0xc0, 0x23, 0xd9, 0xc7, 0xb8, 0xe7, 0xca, 0x7c, 0x41, 0x92, 0x30, 0x59, 0xc2, 0x05, 0x36, 0x68, 0x70, 0xad, 0x66, 0x9f, 0xb7, 0x57, 0x28, 0x56, 0xdc, 0x46, 0x85, 0xff, 0xe0, 0x83, 0x31, 0x11, 0xa7, 0x75, 0xc9, 0x45, 0x5a, 0xb1, 0x59, 0x05, 0x09, 0x13, 0x21, 0x21, 0x95, 0x0e, 0x99, 0xc5, 0xcd, 0x40, 0xb2, 0xa8, 0xd7, 0x4a, 0x5f, 0x85, 0xd2, 0xde, 0x54, 0xcf, 0xb9, 0x1a, 0x0d, 0xa1, 0x8a, 0x14, 0x13, 0xf4, 0xa8, 0xb6, 0x7b, 0x14, 0x7e, 0xcc, 0xaf, 0x55, 0x66, 0x5b, 0x71, 0x01, 0xc9, 0x34, 0x1c, 0x96, 0x87, 0xca, 0x2d, 0x2e, 0x99, 0x41, 0x03, 0x3f, 0xf5, 0xc7, 0xe3, 0x84, 0xb1, 0x27, 0x3f, 0x3b, 0x6c, 0x9b, 0x38, 0x91, 0xea, 0xe2, 0x61, 0x5b, 0xfe, 0x93, 0xc6, 0x06, 0xad ],
+const [ 0x9f, 0x33, 0x60, 0xcf, 0x8f, 0x54, 0x65, 0xc7, 0xd2, 0x4d, 0x7c, 0xbd, 0x7b, 0xef, 0x00, 0x31, 0x5c, 0xd4, 0xf4, 0xac, 0x29, 0xf2, 0x45, 0xf6, 0xdb, 0x71, 0x4e, 0x88, 0x53, 0xba, 0xa1, 0x44, 0x40, 0xd1, 0x05, 0x64, 0x42, 0xe4, 0xbb, 0xb1, 0x50, 0x24, 0x06, 0xf5, 0x57, 0xd3, 0xea, 0xb2, 0x23, 0x9e, 0x33, 0x14, 0x83, 0x2e, 0xb9, 0x25, 0xa8, 0xfa, 0xe3, 0x40, 0xcf, 0x5f, 0x6a, 0xc8, 0x20, 0xf2, 0x5f, 0x19, 0xd5, 0x15, 0x70, 0xbf, 0x9e, 0xc8, 0x67, 0xe7, 0x44, 0xc2, 0xf3, 0x12, 0x8d, 0xc1, 0xab, 0x11, 0x61, 0x1e, 0x50, 0x2d, 0x2a, 0xa4, 0x52, 0xa6, 0x81, 0xa2, 0x96, 0x5f, 0x06, 0x3f, 0x77, 0xd7, 0x8f, 0x0e, 0x0b, 0x5b, 0x86, 0xe2, 0xa7, 0x7a, 0x8c, 0xe4, 0xa5, 0xba, 0x62, 0xe2, 0x64, 0x89, 0x0a, 0xea, 0x91, 0x76, 0x29, 0x18, 0xa5, 0xa1, 0xb0, 0xac, 0xaf, 0x70 ],
+const [ 0xf5, 0xa0, 0x7e, 0x37, 0x41, 0xf0, 0x31, 0x74, 0xc6, 0xef, 0xcb, 0x1f, 0x9f, 0x18, 0x6d, 0x1f, 0x23, 0x3b, 0x36, 0x70, 0x73, 0xc5, 0x6e, 0x81, 0x4f, 0x42, 0x04, 0xdb, 0x2e, 0x20, 0x3b, 0x04, 0x8d, 0xb6, 0xa0, 0xa3, 0x87, 0x85, 0x3f, 0xe4, 0xa6, 0xbd, 0x16, 0x1e, 0xf9, 0x03, 0xca, 0xb4, 0x66, 0x71, 0x99, 0x39, 0x42, 0xde, 0x90, 0xd7, 0x1f, 0x60, 0xfe, 0xf1, 0xe5, 0x10, 0x28, 0x07, 0x25, 0x0d, 0x3e, 0xda, 0xa9, 0xc4, 0x8e, 0xd1, 0x50, 0x6e, 0xf8, 0x9c, 0x19, 0xd9, 0xa2, 0x17, 0x7d, 0x6c, 0xed, 0x71, 0x02, 0x66, 0xa7, 0x8d, 0x0d, 0x66, 0x82, 0xa8, 0xf7, 0x30, 0xc4, 0x3d, 0x64, 0xae, 0x41, 0x25, 0xd0, 0x35, 0x86, 0x03, 0x6b, 0x0a, 0x58, 0xdf, 0x27, 0x25, 0x5d, 0x11, 0x0f, 0x34, 0x18, 0x61, 0xda, 0xe3, 0x1b, 0x6c, 0xc0, 0x5b, 0x77, 0x4a, 0x8c, 0x08, 0x78, 0x6d ],
+const [ 0xda, 0x82, 0x64, 0x1c, 0x0e, 0x59, 0xbf, 0xab, 0xc0, 0x61, 0x8c, 0xd5, 0xcf, 0xce, 0xc1, 0x07, 0x05, 0x0c, 0xa4, 0xc1, 0xed, 0x4b, 0x3b, 0x3f, 0xe9, 0x3b, 0x04, 0x58, 0x7f, 0x14, 0xe7, 0xa6, 0xf4, 0xda, 0x69, 0xe7, 0x1c, 0xdf, 0x22, 0xa3, 0x70, 0x89, 0x71, 0x10, 0x61, 0x55, 0x6e, 0x32, 0xec, 0x1c, 0x20, 0x46, 0x6f, 0x96, 0xf1, 0x61, 0xbb, 0x1c, 0x5e, 0x55, 0x6a, 0xb2, 0xf3, 0xd4, 0x73, 0x44, 0x77, 0xd8, 0xfb, 0x30, 0x64, 0x41, 0x6e, 0x05, 0x9a, 0xc0, 0xcf, 0x8a, 0x53, 0xf5, 0x4c, 0x03, 0x5a, 0xd4, 0x16, 0xaf, 0x78, 0x4d, 0x6f, 0x95, 0x2f, 0x2c, 0x05, 0x81, 0xab, 0x3e, 0x7e, 0x49, 0xf6, 0xb5, 0x54, 0x54, 0x6b, 0xcd, 0xe3, 0x5d, 0x6d, 0xb0, 0xc0, 0x75, 0x59, 0x97, 0x4d, 0x47, 0xb8, 0x33, 0x8a, 0xa0, 0xba, 0x4b, 0x2e, 0x2f, 0xe0, 0xa6, 0xf7, 0x89, 0xf8, 0x2b ],
+const [ 0x1a, 0x40, 0xe8, 0x96, 0xd0, 0xc0, 0xc1, 0x3e, 0x78, 0x24, 0xc3, 0xef, 0x86, 0xe0, 0x23, 0x55, 0xfe, 0xb6, 0x29, 0xea, 0x88, 0x7c, 0xe4, 0xd2, 0xc7, 0x1f, 0x1d, 0x02, 0xe7, 0xe8, 0x89, 0xa8, 0x75, 0xfe, 0x42, 0xc7, 0x74, 0x2d, 0x78, 0x22, 0xad, 0xe5, 0x64, 0x5c, 0x46, 0x86, 0x7e, 0x5d, 0x96, 0xda, 0xf0, 0xf8, 0x38, 0xe3, 0x4a, 0xca, 0x5e, 0xd8, 0x77, 0x65, 0x68, 0x6a, 0xf0, 0xae, 0xb6, 0x4b, 0x2f, 0x83, 0xba, 0xf1, 0x67, 0xa1, 0x51, 0x98, 0x72, 0xc5, 0x53, 0x86, 0x0b, 0x12, 0x68, 0x92, 0x3d, 0xb3, 0x1e, 0xe7, 0x1b, 0xc1, 0x39, 0x06, 0xb2, 0x67, 0x4b, 0x0a, 0x3c, 0x44, 0x84, 0x30, 0x97, 0x10, 0xca, 0x96, 0xf5, 0x83, 0x0c, 0x43, 0xd4, 0x72, 0xd4, 0x68, 0x31, 0x3c, 0x1c, 0xe5, 0xf8, 0x64, 0x63, 0x0f, 0xc0, 0x7f, 0x00, 0xb1, 0xb5, 0x51, 0xb5, 0x51, 0xd5, 0x33 ],
+const [ 0x59, 0x35, 0xa8, 0x70, 0x22, 0x9c, 0x72, 0x51, 0xfc, 0xd0, 0xc5, 0xc6, 0x95, 0x61, 0x44, 0xf2, 0x51, 0xab, 0x2a, 0x39, 0xd7, 0x4d, 0xe9, 0x51, 0xd0, 0xdc, 0x11, 0x9c, 0xeb, 0xd8, 0x72, 0xb5, 0x25, 0xde, 0x85, 0x49, 0x47, 0x20, 0x08, 0x28, 0xb0, 0x13, 0xe9, 0x9b, 0x54, 0x67, 0x65, 0xf9, 0x05, 0x3c, 0x71, 0x75, 0xf2, 0x93, 0x59, 0x3a, 0x6d, 0x02, 0xa7, 0xba, 0xf1, 0xad, 0x46, 0x42, 0x63, 0x71, 0xe7, 0xd2, 0x98, 0x62, 0xa4, 0x2d, 0x18, 0x78, 0xe3, 0x2c, 0x21, 0x85, 0x7e, 0x57, 0xef, 0x6a, 0x21, 0xb6, 0x3b, 0x8b, 0xf3, 0xe5, 0x02, 0x80, 0x78, 0x67, 0x87, 0x0e, 0xb6, 0x3c, 0x9b, 0x55, 0x96, 0xb6, 0x1c, 0x4a, 0x8e, 0x88, 0xbc, 0x68, 0x7d, 0x20, 0x03, 0xa3, 0xd6, 0x37, 0x98, 0x9e, 0x01, 0xa6, 0xbc, 0x1d, 0xfe, 0x7b, 0x17, 0xbd, 0x4c, 0x4c, 0xb7, 0xe3, 0x09, 0xcb ],
+const [ 0xeb, 0x5d, 0xe6, 0x9e, 0xb1, 0x37, 0x1b, 0xfc, 0xe0, 0x0a, 0xb6, 0x29, 0xa1, 0x36, 0x2f, 0x0d, 0x48, 0x85, 0xaf, 0x7a, 0x71, 0xf9, 0xc9, 0x0f, 0x4e, 0xc9, 0x65, 0x5d, 0x3f, 0xa6, 0xfc, 0x49, 0xa3, 0x42, 0x0b, 0xb1, 0xef, 0x13, 0xc1, 0x53, 0xfd, 0x55, 0xfb, 0xea, 0xa6, 0x4e, 0x73, 0x99, 0x92, 0xd5, 0x34, 0x8d, 0x4f, 0x15, 0x52, 0xdf, 0xa1, 0x8f, 0xd7, 0xb7, 0x19, 0x5e, 0x00, 0xb7, 0xe9, 0xbf, 0xaa, 0x97, 0xf7, 0xd0, 0x07, 0x0c, 0x30, 0x98, 0x95, 0xef, 0x1f, 0x48, 0x51, 0x9b, 0xbe, 0xc0, 0x28, 0x97, 0x8c, 0x55, 0xae, 0x75, 0xdf, 0xd2, 0x12, 0xf9, 0x7c, 0xbc, 0x52, 0x7e, 0x65, 0xdb, 0xab, 0x96, 0xf2, 0xf5, 0x54, 0xf1, 0x23, 0xdd, 0x6b, 0x80, 0x35, 0xad, 0x30, 0xd9, 0x73, 0x4f, 0x71, 0xde, 0x4f, 0x42, 0x45, 0x99, 0xb1, 0x9a, 0xfd, 0x6b, 0x8f, 0x49, 0x58, 0x66 ],
+const [ 0x10, 0xca, 0x18, 0x6b, 0xaa, 0x79, 0xd9, 0x02, 0x9e, 0xb6, 0x18, 0xa2, 0xe5, 0xa6, 0x36, 0xb9, 0x89, 0x3b, 0x30, 0xe2, 0x0b, 0x06, 0x22, 0x58, 0x03, 0x4c, 0x0a, 0xb1, 0x06, 0x5b, 0xcf, 0xc9, 0xcc, 0x1e, 0x82, 0xfc, 0x92, 0xf0, 0xe3, 0x98, 0xbe, 0xae, 0x27, 0x91, 0xc2, 0x10, 0xf8, 0x77, 0x42, 0x39, 0xbe, 0xa6, 0x79, 0x8c, 0x1d, 0xbd, 0xd9, 0xc2, 0xbe, 0x51, 0xf1, 0x39, 0x53, 0xe2, 0x94, 0x8f, 0xd5, 0x0d, 0x38, 0x70, 0x10, 0x04, 0x9c, 0xac, 0x62, 0x3c, 0xae, 0x8d, 0xc0, 0x65, 0xab, 0x67, 0xf9, 0x9f, 0x88, 0x70, 0x3f, 0xeb, 0x91, 0xd2, 0xe3, 0xdf, 0x50, 0xff, 0x60, 0x9f, 0xb0, 0x45, 0x9b, 0x08, 0x62, 0xa2, 0x69, 0x2e, 0x80, 0xd9, 0x52, 0x09, 0x70, 0xc5, 0x95, 0x6b, 0x0c, 0xee, 0x6b, 0x35, 0xff, 0x5a, 0x90, 0xcb, 0x72, 0xa6, 0x00, 0xc5, 0xe9, 0x55, 0xfe, 0xe8 ],
+const [ 0x53, 0x69, 0x74, 0x5b, 0xbc, 0xcb, 0xba, 0x88, 0x78, 0x0e, 0xd2, 0xe2, 0xcc, 0x2d, 0x57, 0xe2, 0x59, 0x1d, 0x02, 0xb5, 0xaa, 0x0c, 0xd5, 0x9d, 0x0a, 0xe7, 0x99, 0x95, 0x98, 0x1e, 0x8b, 0x34, 0x9d, 0xab, 0x53, 0xd3, 0x1c, 0x51, 0x35, 0xf2, 0xab, 0x21, 0x8b, 0xd8, 0x82, 0x43, 0x73, 0x7a, 0xd2, 0xf3, 0xc5, 0x9e, 0x58, 0xca, 0x48, 0x40, 0x31, 0x3f, 0x25, 0x35, 0xf0, 0x6d, 0x9b, 0x0e, 0xee, 0x17, 0xf5, 0x3f, 0xe1, 0xe9, 0xb9, 0x81, 0xb0, 0x00, 0x23, 0x74, 0x86, 0xad, 0xd1, 0x89, 0x26, 0x76, 0xc0, 0x1f, 0x7e, 0x5e, 0x77, 0xec, 0x7e, 0x67, 0x82, 0x9f, 0x2a, 0x54, 0x22, 0xc3, 0xee, 0xb3, 0x43, 0xe7, 0x32, 0x1b, 0xae, 0xfc, 0x2f, 0xb3, 0x80, 0xfe, 0x01, 0xf3, 0xdb, 0xd7, 0xfd, 0xaf, 0xdb, 0x80, 0x44, 0x51, 0xcc, 0x69, 0x98, 0x66, 0x9a, 0x1b, 0x6f, 0x5c, 0x88, 0x1c ],
+const [ 0xa4, 0x13, 0xed, 0x98, 0xdd, 0x6e, 0x09, 0x01, 0xb1, 0x07, 0x43, 0x81, 0xe1, 0xa9, 0x0d, 0x59, 0xfb, 0xb6, 0x0e, 0x22, 0x82, 0xbd, 0x67, 0x06, 0x49, 0x4f, 0x3a, 0x2f, 0x20, 0x0f, 0x6d, 0x80, 0xb2, 0x09, 0xab, 0x83, 0xae, 0x45, 0xac, 0xa3, 0x25, 0x9b, 0xb7, 0x9c, 0x34, 0xc8, 0x65, 0x2f, 0xe2, 0xc2, 0xa7, 0x1a, 0x4b, 0x49, 0x0a, 0x47, 0xff, 0xbf, 0x3a, 0x44, 0xa5, 0x39, 0xc5, 0xf3, 0xe4, 0xd6, 0x22, 0x83, 0x83, 0x50, 0xf2, 0x9e, 0xce, 0xd0, 0x85, 0xe4, 0x3c, 0x07, 0xa0, 0x99, 0x50, 0x7a, 0x7e, 0x9a, 0xbd, 0x1d, 0x14, 0x96, 0xcd, 0x24, 0x9a, 0x7a, 0x03, 0x16, 0x46, 0x2d, 0x00, 0x23, 0x5b, 0x7e, 0xa3, 0xb7, 0x62, 0x5b, 0x74, 0x4f, 0xb7, 0x43, 0x43, 0x8c, 0x48, 0xfd, 0x0c, 0x85, 0x9a, 0x8b, 0x1e, 0x62, 0x0d, 0x5a, 0x7c, 0x27, 0x60, 0xbb, 0x84, 0xcd, 0x77, 0x97 ],
+const [ 0x25, 0xae, 0xe3, 0x05, 0xcd, 0xa0, 0x93, 0xa7, 0x10, 0x94, 0xbc, 0x5c, 0xa6, 0xf5, 0x70, 0xfb, 0xd6, 0x7f, 0xcb, 0x42, 0x39, 0xf3, 0xd7, 0x24, 0xc0, 0x0f, 0xad, 0x64, 0xf8, 0xbd, 0xdd, 0x63, 0x8d, 0x8b, 0x10, 0x37, 0x0e, 0x5b, 0xec, 0xfc, 0xef, 0x5b, 0x38, 0x6f, 0xd4, 0x38, 0x41, 0xb9, 0x0d, 0x8f, 0x7c, 0x88, 0x5c, 0xa5, 0x6c, 0x64, 0xff, 0x57, 0xc6, 0x41, 0xea, 0x54, 0xd4, 0x50, 0x55, 0x89, 0x17, 0x1b, 0x76, 0xdd, 0x30, 0xd1, 0x90, 0x1f, 0x01, 0xde, 0x2c, 0x3c, 0x0f, 0xbf, 0xa6, 0xb6, 0x2a, 0x15, 0xec, 0x51, 0x51, 0xf8, 0x83, 0x10, 0xd0, 0x8d, 0xcb, 0x5f, 0xab, 0xdb, 0x83, 0x92, 0x3f, 0xda, 0x8f, 0x8e, 0x27, 0xcd, 0xf9, 0xc6, 0x5d, 0xd2, 0x37, 0x6a, 0xa1, 0xb8, 0xac, 0xda, 0x1f, 0x10, 0x71, 0x61, 0x4c, 0x87, 0x54, 0x20, 0x11, 0x73, 0x21, 0x48, 0x2b, 0xab ],
+const [ 0x9d, 0x31, 0xb1, 0x68, 0xce, 0x6e, 0xc3, 0x18, 0x4d, 0x7c, 0x36, 0x24, 0x3a, 0xcb, 0x4e, 0x14, 0x04, 0xd8, 0x1d, 0xfd, 0x82, 0xf7, 0x3f, 0x60, 0x3f, 0x4f, 0xc8, 0x4f, 0x15, 0x26, 0x7b, 0xd1, 0xfd, 0x5f, 0x3d, 0x88, 0x25, 0x40, 0xc9, 0x91, 0x43, 0x79, 0xa4, 0xac, 0x2a, 0x62, 0x54, 0x9d, 0x9a, 0x85, 0xcd, 0xd2, 0x5d, 0x5c, 0x2c, 0x45, 0x8f, 0x5c, 0xa7, 0xa4, 0x3e, 0x32, 0xc4, 0xb0, 0x33, 0x4c, 0xca, 0xe3, 0x0e, 0x9b, 0x75, 0x55, 0x99, 0x97, 0xee, 0xe0, 0x56, 0x84, 0xfa, 0x82, 0x5a, 0xf4, 0x72, 0x04, 0x5e, 0x8e, 0xf3, 0xd9, 0x14, 0x0d, 0xd6, 0x49, 0xb7, 0x8c, 0x63, 0xcf, 0xe6, 0x00, 0x41, 0xbf, 0xb2, 0x06, 0x31, 0x2b, 0xf6, 0xdf, 0xfd, 0x08, 0xe7, 0xb8, 0xaa, 0x8d, 0xeb, 0x2f, 0xf5, 0xdc, 0xaf, 0x14, 0xfe, 0xe4, 0x73, 0x6c, 0x3e, 0x86, 0xa9, 0xbc, 0xbe, 0xf6 ],
+const [ 0xa7, 0x85, 0xab, 0xa7, 0x5e, 0x68, 0x29, 0xf9, 0x3f, 0x7a, 0x14, 0x1c, 0x71, 0x57, 0x63, 0xb6, 0x4e, 0xff, 0xee, 0xd0, 0x0c, 0xe1, 0x31, 0x89, 0x9d, 0x39, 0x4c, 0x0b, 0xd3, 0x9c, 0x4f, 0xbf, 0xc8, 0xd1, 0xb5, 0xbd, 0x7d, 0xe3, 0x2e, 0x87, 0xc1, 0x74, 0xa2, 0xf6, 0x55, 0x54, 0x72, 0x74, 0x4d, 0x53, 0x01, 0x6c, 0xb9, 0x53, 0x73, 0xff, 0x85, 0xa1, 0xb4, 0xf9, 0x9e, 0x85, 0xbc, 0x03, 0x56, 0x17, 0x12, 0x1a, 0x0a, 0x55, 0x8f, 0x3f, 0x02, 0x73, 0x65, 0x70, 0x98, 0x72, 0x60, 0xd8, 0x9d, 0xf4, 0x6b, 0x43, 0xf8, 0x4f, 0x55, 0xd4, 0x90, 0xe0, 0xd5, 0xfa, 0x6d, 0xa2, 0xcc, 0xa0, 0x1a, 0xfe, 0xcb, 0xa4, 0x4d, 0xe5, 0xd5, 0x8b, 0xc9, 0x1d, 0x66, 0x73, 0x84, 0xd8, 0xb3, 0x48, 0x05, 0x8b, 0x34, 0x3b, 0x11, 0xfd, 0x60, 0x70, 0x86, 0x9f, 0xb8, 0xf7, 0x87, 0x1b, 0x06, 0xfe ],
+const [ 0xed, 0xb2, 0xba, 0x09, 0x99, 0x61, 0xd3, 0x8f, 0xd0, 0xa0, 0xa6, 0xa2, 0x35, 0xd6, 0x12, 0x71, 0xcb, 0x4d, 0x49, 0x3b, 0x64, 0xd9, 0xde, 0x13, 0x5c, 0xbb, 0x1f, 0xe0, 0x86, 0xc4, 0xa4, 0xa7, 0x67, 0xbe, 0x28, 0x0d, 0xa2, 0x07, 0x98, 0x17, 0xb4, 0x7f, 0x6a, 0x35, 0xe1, 0xa4, 0x30, 0x7f, 0x6e, 0xfc, 0x6d, 0x3e, 0x11, 0xb4, 0xa7, 0xae, 0xa6, 0x86, 0xbd, 0x02, 0x23, 0xe0, 0x7b, 0xa9, 0xce, 0x42, 0x6c, 0xd0, 0xae, 0xe7, 0xef, 0x28, 0x3f, 0xa9, 0x8d, 0xe9, 0x6a, 0x1f, 0x8a, 0x17, 0xb3, 0x08, 0xba, 0x04, 0xb5, 0xec, 0x96, 0x16, 0xcb, 0x00, 0x8f, 0xca, 0x11, 0x4b, 0xa3, 0xf9, 0x8b, 0x07, 0x2d, 0x5a, 0xa3, 0x4a, 0x01, 0x49, 0xd9, 0xe5, 0xb8, 0xc6, 0xb6, 0x8c, 0x49, 0xc1, 0x01, 0x38, 0xda, 0x95, 0x36, 0xca, 0xd5, 0xd2, 0x34, 0xf1, 0x3d, 0x3f, 0x36, 0x4d, 0x43, 0x1f ],
+const [ 0x19, 0x48, 0xc7, 0x12, 0x0a, 0x06, 0x18, 0xc5, 0x44, 0xa3, 0x9e, 0x59, 0x57, 0x40, 0x8b, 0x89, 0x22, 0x0a, 0xe3, 0x98, 0xec, 0x05, 0x30, 0x39, 0xb0, 0x09, 0x78, 0xad, 0xb7, 0x0a, 0x6c, 0x2b, 0x6c, 0x9c, 0xe2, 0x84, 0x6d, 0xb5, 0x85, 0x07, 0xde, 0xb5, 0xcb, 0xa2, 0x02, 0xa5, 0x28, 0x4b, 0x0c, 0xbc, 0x82, 0x9e, 0x32, 0x28, 0xe4, 0xc8, 0x04, 0x0b, 0x76, 0xa3, 0xfc, 0xc3, 0xad, 0x22, 0x56, 0x6e, 0xbf, 0xf0, 0x21, 0xad, 0x5a, 0x54, 0x97, 0xa9, 0x95, 0x58, 0xaa, 0x54, 0x27, 0x2a, 0xdf, 0xf2, 0xd6, 0xc2, 0x5f, 0xd7, 0x33, 0xc5, 0x4c, 0x72, 0x85, 0xaa, 0x51, 0x8a, 0x03, 0x1b, 0x7d, 0xc8, 0x46, 0x9e, 0x51, 0x76, 0xfd, 0x74, 0x17, 0x86, 0xe3, 0xc1, 0x76, 0xd6, 0xee, 0xee, 0x44, 0xb2, 0xc9, 0x4c, 0x9b, 0x9b, 0x85, 0xfa, 0x2f, 0x46, 0x8c, 0x08, 0xde, 0xe8, 0xd6, 0xdc ],
+const [ 0x44, 0xc9, 0xbf, 0x3a, 0xe8, 0xf1, 0x4c, 0xc9, 0xd6, 0x93, 0x5d, 0xed, 0xa3, 0xc2, 0x4d, 0xe6, 0x9c, 0x67, 0xf0, 0x88, 0x5a, 0x87, 0xc8, 0x99, 0x96, 0xc4, 0x7c, 0x7b, 0x3e, 0x27, 0x85, 0x0a, 0xc7, 0x1c, 0x2b, 0xc8, 0xc6, 0xbe, 0xb0, 0x38, 0xba, 0x55, 0xcb, 0x87, 0x2c, 0x1d, 0x58, 0x71, 0xfb, 0x4a, 0x4d, 0x63, 0xf1, 0x48, 0xf0, 0xdd, 0x99, 0x47, 0x47, 0x1b, 0x55, 0xf7, 0xd0, 0xf4, 0xab, 0x90, 0x73, 0x02, 0xe0, 0x16, 0xb5, 0x03, 0xc8, 0xdb, 0x2e, 0x7f, 0xdc, 0x45, 0x3d, 0xac, 0x8d, 0xd1, 0xfa, 0x8e, 0xd8, 0x58, 0x6c, 0x62, 0x1b, 0x92, 0xfd, 0x3d, 0x27, 0xd8, 0x2a, 0xf1, 0x96, 0x2e, 0x7f, 0x30, 0x5f, 0x80, 0xc3, 0xf4, 0xa7, 0x2c, 0x70, 0x1d, 0xda, 0xc1, 0x66, 0x5c, 0xfb, 0x06, 0xdf, 0x51, 0x38, 0x3f, 0xa6, 0xf0, 0xc2, 0xab, 0x84, 0x29, 0xdb, 0x51, 0xfb, 0xc8 ],
+const [ 0xcb, 0x2a, 0x07, 0x2d, 0x74, 0xa5, 0x74, 0x94, 0x81, 0x03, 0x0e, 0xe4, 0x6e, 0xdc, 0xe2, 0x8c, 0x47, 0x1e, 0xf4, 0x12, 0xc8, 0xa4, 0x81, 0x4a, 0xc4, 0x0b, 0x87, 0xcb, 0xc3, 0xc1, 0x88, 0xa3, 0xef, 0x5e, 0x8a, 0x4a, 0x31, 0x38, 0x62, 0xd5, 0x97, 0x31, 0x32, 0x6c, 0xf9, 0xd4, 0x31, 0xfe, 0xdc, 0xa1, 0xaa, 0x33, 0x96, 0xa4, 0x48, 0xa3, 0xb3, 0x4d, 0x90, 0x45, 0x98, 0x7b, 0xaf, 0x2a, 0x66, 0xda, 0x76, 0x6b, 0x21, 0x6f, 0xa3, 0x60, 0x12, 0x71, 0x62, 0x12, 0x69, 0x5b, 0x13, 0xf3, 0x27, 0x3f, 0x4e, 0xcd, 0x3b, 0x5d, 0x24, 0xf9, 0xeb, 0xf4, 0xa8, 0xd1, 0x76, 0x58, 0xaf, 0x67, 0xf8, 0x45, 0xd3, 0x78, 0x8d, 0x73, 0xbe, 0x9b, 0xb9, 0x6a, 0xa5, 0xbe, 0x08, 0x98, 0x12, 0xd3, 0xf1, 0xa1, 0xe7, 0xc7, 0x00, 0xf6, 0xa0, 0xb4, 0x35, 0xa9, 0xd8, 0x57, 0xa7, 0x80, 0x0e, 0xc4 ],
+const [ 0xc7, 0xf4, 0x61, 0x2d, 0xc4, 0x7f, 0x7c, 0xe6, 0xb4, 0x99, 0xaf, 0x0a, 0x51, 0xe4, 0xa3, 0xec, 0xb2, 0xef, 0x40, 0x25, 0x1c, 0xb4, 0x20, 0x35, 0x1c, 0x65, 0x43, 0x6d, 0xd2, 0x68, 0x04, 0x0c, 0x90, 0xa0, 0x4b, 0xa8, 0xa4, 0xee, 0x05, 0xcf, 0x71, 0xf7, 0xd1, 0xef, 0xc5, 0x28, 0xfc, 0x73, 0x66, 0xf8, 0xb0, 0x2f, 0xee, 0x6d, 0x68, 0xfe, 0xd9, 0xe2, 0xa7, 0xa9, 0xdd, 0x07, 0xea, 0x0b, 0x7a, 0x29, 0xdb, 0x73, 0xd1, 0xb4, 0xc7, 0x4a, 0xb9, 0xf6, 0x52, 0xf6, 0x10, 0x25, 0x6a, 0xfd, 0x4f, 0xa4, 0x79, 0x6e, 0x61, 0x82, 0xdf, 0x7d, 0xb6, 0x44, 0x9f, 0x6d, 0x93, 0xe4, 0x58, 0xb3, 0xac, 0x19, 0x78, 0x58, 0xf4, 0xd9, 0xac, 0x9f, 0xb4, 0x1c, 0x9b, 0xe8, 0xda, 0xe4, 0xd3, 0xd4, 0x94, 0x7a, 0x03, 0xaa, 0x1e, 0xfa, 0x6c, 0xf9, 0xd9, 0x11, 0x92, 0x7f, 0x9c, 0x06, 0x37, 0x4a ],
+const [ 0x4c, 0x25, 0x9e, 0xd5, 0x3a, 0x1f, 0xaa, 0x09, 0xd9, 0xcf, 0x2a, 0x14, 0x54, 0xcc, 0x2e, 0x5a, 0xcf, 0xb3, 0xab, 0x88, 0x93, 0xbf, 0xc3, 0xca, 0x6b, 0x9a, 0x47, 0x3f, 0x4d, 0x73, 0x7b, 0xaa, 0x3d, 0x51, 0x19, 0x6a, 0x6f, 0xa7, 0x98, 0xac, 0xac, 0x28, 0xad, 0xdf, 0xf6, 0xdc, 0x13, 0x68, 0x6f, 0x74, 0x88, 0x97, 0x77, 0xdb, 0x18, 0xda, 0x15, 0x0d, 0x9d, 0x31, 0x98, 0x2c, 0x87, 0xe2, 0x7e, 0xd1, 0xd9, 0x6e, 0x94, 0xa0, 0x74, 0xc3, 0x5f, 0x1f, 0x98, 0xb3, 0xbb, 0xc8, 0xa8, 0xa5, 0xc2, 0x5c, 0x2d, 0x8b, 0xef, 0x7b, 0x1e, 0x14, 0x83, 0x72, 0x5f, 0x22, 0x28, 0x54, 0x87, 0x7e, 0xd5, 0x4c, 0xe6, 0xcb, 0xf1, 0x31, 0xc7, 0xb8, 0xbb, 0x5b, 0xf2, 0x7a, 0xe9, 0xb5, 0x75, 0x7a, 0x8f, 0x14, 0xa4, 0x4a, 0x43, 0xc7, 0x5f, 0xde, 0x7f, 0x70, 0x93, 0xf9, 0x47, 0x12, 0x03, 0xe5 ],
+const [ 0x1b, 0x87, 0x47, 0xaf, 0x6d, 0x82, 0xc6, 0x1f, 0x98, 0xcc, 0xc3, 0xd7, 0x9c, 0x7a, 0xce, 0xbe, 0x18, 0xbd, 0x1f, 0xb5, 0xb0, 0xba, 0x1f, 0x15, 0xb1, 0x95, 0x2b, 0x58, 0xf8, 0xcf, 0x94, 0x16, 0x10, 0xd3, 0xea, 0x34, 0x9a, 0xcb, 0x7a, 0x58, 0xf2, 0xb8, 0x15, 0x9f, 0x0f, 0xc2, 0x13, 0x93, 0xab, 0xcc, 0x98, 0x57, 0xa4, 0x4c, 0x16, 0x25, 0xa3, 0x5a, 0x13, 0xfb, 0xfb, 0x07, 0x2d, 0x90, 0xd4, 0xef, 0x5b, 0x8d, 0x88, 0x12, 0x75, 0xfa, 0x4d, 0xdf, 0xf7, 0xf6, 0x15, 0x92, 0x02, 0xac, 0xb2, 0xc0, 0xa3, 0x82, 0x3e, 0x30, 0x58, 0x93, 0xba, 0xed, 0xd0, 0x60, 0xf5, 0x99, 0xf3, 0xc2, 0xaf, 0x04, 0x22, 0x24, 0xff, 0xfe, 0xc0, 0xee, 0xf2, 0x69, 0xf1, 0x44, 0x75, 0x92, 0xa1, 0xf1, 0x75, 0xc1, 0xc9, 0x9e, 0x44, 0x0e, 0xed, 0x48, 0x3f, 0x77, 0xea, 0xf1, 0xae, 0x30, 0xee, 0x95 ],
+const [ 0x46, 0x17, 0xb3, 0x23, 0xbc, 0x28, 0x6d, 0x76, 0x80, 0xdf, 0x7e, 0xdd, 0xc1, 0x01, 0xae, 0xcf, 0xa4, 0x6c, 0x6d, 0xcc, 0x39, 0x43, 0x67, 0xa1, 0xae, 0x4b, 0x5a, 0xe8, 0xc2, 0x95, 0x24, 0xce, 0x7d, 0x5e, 0x21, 0x19, 0x1e, 0x33, 0xb3, 0x69, 0x56, 0x59, 0x22, 0xbd, 0xb3, 0x6b, 0xa7, 0x3a, 0x5f, 0x45, 0xc3, 0x28, 0x0a, 0x21, 0xd5, 0x3e, 0x25, 0x00, 0xec, 0x1f, 0x51, 0x4c, 0xda, 0x24, 0x17, 0xbb, 0x8a, 0x5c, 0xd9, 0x76, 0x93, 0xd1, 0x08, 0x7b, 0x0c, 0x0d, 0x98, 0x3f, 0xa3, 0xdd, 0xb1, 0x98, 0xe9, 0x55, 0xa8, 0xdb, 0xf0, 0x14, 0x2d, 0x41, 0x18, 0xca, 0xc6, 0x90, 0x26, 0xf7, 0x7c, 0xf7, 0x96, 0xf5, 0xd3, 0x39, 0x33, 0x38, 0x00, 0x0e, 0xe4, 0xd5, 0x57, 0xc6, 0xc9, 0x41, 0x03, 0x2f, 0x86, 0x5b, 0xf9, 0xb9, 0xdf, 0xad, 0x2f, 0xd8, 0x86, 0xef, 0x08, 0xaa, 0x30, 0xcd ],
+const [ 0xa0, 0xcf, 0xcc, 0x65, 0x59, 0xf2, 0xbd, 0xc8, 0xd0, 0xef, 0xe0, 0x51, 0x9e, 0x8d, 0x31, 0x1d, 0x3a, 0xf5, 0x85, 0xbf, 0xbf, 0x66, 0x6d, 0x90, 0xef, 0x2b, 0x5d, 0x46, 0x78, 0xca, 0x0e, 0xc9, 0x77, 0x7f, 0x20, 0x42, 0x3b, 0xe8, 0x04, 0x74, 0x4b, 0x02, 0x19, 0x4f, 0xaa, 0x54, 0x15, 0xc2, 0x59, 0x6a, 0xa7, 0xd2, 0x1e, 0x85, 0x5b, 0xe9, 0x84, 0x91, 0xbd, 0x70, 0x23, 0x57, 0xc1, 0x9f, 0x21, 0xf4, 0x62, 0x94, 0xf9, 0x8a, 0x8a, 0xa3, 0x7b, 0x35, 0x32, 0xee, 0x15, 0x41, 0xca, 0x35, 0x50, 0x9a, 0xdb, 0xef, 0x9d, 0x83, 0xeb, 0x99, 0x52, 0x8b, 0xa1, 0x4e, 0xf0, 0xbd, 0x29, 0x98, 0xa7, 0x18, 0xda, 0x86, 0x1c, 0x3f, 0x16, 0xfe, 0x69, 0x71, 0x72, 0x55, 0x65, 0xba, 0x17, 0x1d, 0x27, 0x6b, 0x69, 0x3e, 0xc5, 0xc9, 0xe6, 0x49, 0x61, 0x02, 0x50, 0x08, 0x67, 0x65, 0x0e, 0x5a ],
+const [ 0x2f, 0xa3, 0x3c, 0x03, 0xad, 0xa4, 0x0c, 0x59, 0x8f, 0x88, 0x00, 0xe0, 0x17, 0xdc, 0x80, 0x2a, 0x1c, 0x6a, 0x3f, 0xf0, 0xff, 0x5e, 0xcb, 0x58, 0xe1, 0xa7, 0x63, 0x77, 0x13, 0xa0, 0x08, 0x15, 0xce, 0xf0, 0xd6, 0xb1, 0x25, 0xaf, 0x95, 0xc5, 0x37, 0xca, 0x8c, 0x4c, 0xa9, 0xa8, 0x95, 0x80, 0x54, 0x0d, 0x77, 0xe8, 0x3a, 0x3f, 0x6f, 0x92, 0xbf, 0x68, 0x10, 0x9e, 0x16, 0x3c, 0x4e, 0xfc, 0xf9, 0xdb, 0xd5, 0x75, 0x9d, 0xf9, 0x9f, 0xf0, 0xe5, 0x3c, 0xc5, 0xee, 0xd6, 0xe5, 0x95, 0x58, 0x4b, 0xb3, 0xe6, 0x7a, 0xe9, 0x04, 0xa8, 0x4f, 0x56, 0x3e, 0xbf, 0xff, 0xa6, 0x6d, 0x12, 0xa6, 0x16, 0x2e, 0xde, 0x57, 0xfd, 0xcb, 0x51, 0x61, 0xff, 0xa7, 0x54, 0xd0, 0x84, 0xdd, 0xa8, 0x37, 0x68, 0x24, 0x34, 0xad, 0xf5, 0xf6, 0x9d, 0x16, 0x0e, 0xf1, 0x18, 0xa4, 0xac, 0x7d, 0x7c, 0x9d ],
+const [ 0x0f, 0x54, 0x68, 0x34, 0xa3, 0x13, 0xfe, 0x39, 0x81, 0xef, 0x45, 0x0f, 0x3e, 0x3b, 0x16, 0xbc, 0x18, 0x4e, 0x3d, 0x6b, 0xda, 0xd5, 0x7e, 0x65, 0x00, 0x6e, 0xd6, 0x3c, 0x1c, 0x72, 0x02, 0x49, 0x78, 0x11, 0x46, 0x59, 0xfd, 0xa5, 0x67, 0xa4, 0x53, 0x40, 0xf9, 0xff, 0x4a, 0x87, 0xe1, 0x52, 0x79, 0xc4, 0x12, 0x4b, 0x25, 0x36, 0x9a, 0x54, 0x64, 0xac, 0xe2, 0xc3, 0x81, 0x52, 0x31, 0x51, 0xa3, 0xca, 0x73, 0xce, 0xaa, 0x7e, 0x39, 0x13, 0x5a, 0x35, 0x00, 0x37, 0xbb, 0xe5, 0xb6, 0x06, 0xbf, 0xc8, 0x7a, 0xae, 0x26, 0xb2, 0xa4, 0xbc, 0x9f, 0xa2, 0x05, 0x47, 0x30, 0x97, 0x70, 0x6b, 0xd7, 0xa5, 0x78, 0xfa, 0x72, 0x47, 0x7c, 0x6d, 0xdc, 0xf7, 0xe1, 0x21, 0x59, 0xfc, 0x9f, 0xc0, 0x34, 0x84, 0xff, 0xfc, 0xa6, 0xf2, 0xa3, 0x84, 0xfa, 0x79, 0xc6, 0x30, 0xef, 0xea, 0xc5, 0x7f ],
+const [ 0x6f, 0xb3, 0xec, 0x66, 0xf9, 0xeb, 0x07, 0x0a, 0x71, 0x9b, 0xeb, 0xbe, 0x70, 0x8b, 0x93, 0xa6, 0x5b, 0x20, 0x1b, 0x78, 0xe2, 0xd2, 0x6d, 0x8c, 0xcc, 0xdf, 0x1c, 0x33, 0xf7, 0x41, 0x90, 0x4a, 0x9a, 0xde, 0x64, 0x0f, 0xce, 0x00, 0x0c, 0x33, 0x4d, 0x04, 0xbb, 0x30, 0x79, 0x56, 0x83, 0xdc, 0xa0, 0x9d, 0xbf, 0x3e, 0x7e, 0x32, 0xae, 0xa1, 0x03, 0xd7, 0x60, 0xe8, 0x57, 0xa6, 0xd6, 0x21, 0x1c, 0x47, 0x65, 0x5d, 0xf3, 0x66, 0x5b, 0xbe, 0x41, 0x64, 0xe5, 0xd1, 0x33, 0x4d, 0x30, 0x1e, 0xff, 0x0b, 0xcf, 0xfe, 0x6d, 0xd9, 0x5d, 0xad, 0x97, 0xfa, 0x63, 0xa0, 0xec, 0xaa, 0x7b, 0x19, 0x7b, 0x55, 0xb6, 0xf8, 0x6f, 0x07, 0x3c, 0xd4, 0xd5, 0x24, 0x32, 0x4a, 0xa6, 0x59, 0xe1, 0x95, 0x01, 0xd2, 0x14, 0x5f, 0xb8, 0xad, 0xc1, 0xd7, 0x0e, 0xaf, 0xec, 0x04, 0xbf, 0x36, 0xc9, 0x59 ],
+const [ 0x1d, 0x7f, 0x68, 0x33, 0x33, 0x3d, 0x6f, 0x99, 0xcc, 0x4d, 0xe8, 0x6d, 0xcb, 0x1a, 0x66, 0x8a, 0xf3, 0x69, 0x66, 0x07, 0x4c, 0x31, 0xd4, 0xad, 0xc9, 0xac, 0xd0, 0xae, 0x27, 0xae, 0xb1, 0x93, 0x18, 0x36, 0x4a, 0x77, 0xa1, 0x42, 0x6d, 0x73, 0xc1, 0xe8, 0xae, 0x59, 0x53, 0xa3, 0x69, 0xa5, 0x35, 0xeb, 0x07, 0xb0, 0xaa, 0x08, 0x7c, 0x27, 0xfd, 0x27, 0x14, 0xbc, 0x68, 0xae, 0x70, 0x1b, 0x33, 0xcd, 0xcb, 0x20, 0x20, 0x55, 0x83, 0x47, 0x07, 0xce, 0xd4, 0x64, 0xbe, 0xc4, 0xe6, 0x94, 0x3b, 0x61, 0x0a, 0x73, 0xfd, 0x41, 0x40, 0x8f, 0xa8, 0x81, 0xfe, 0x1d, 0xef, 0x19, 0x2c, 0xeb, 0xb6, 0x6c, 0x73, 0x96, 0x78, 0x1e, 0xb7, 0xfd, 0xe7, 0x26, 0xe2, 0xf5, 0xd3, 0x24, 0xe4, 0x3f, 0x4d, 0xf4, 0xf8, 0xb7, 0x0c, 0x83, 0x28, 0xcd, 0x10, 0xe1, 0x13, 0x39, 0x84, 0x98, 0xee, 0xeb ],
+const [ 0x3f, 0x5f, 0xe1, 0xa8, 0xa1, 0x3c, 0x83, 0x57, 0x14, 0x9f, 0x68, 0xbc, 0xe4, 0x73, 0x60, 0xbd, 0x6e, 0x73, 0xc9, 0x89, 0x32, 0xec, 0x4a, 0x7d, 0x2a, 0xc4, 0xc5, 0x49, 0x5b, 0xbb, 0x86, 0x4e, 0xa9, 0xf1, 0xc1, 0x4b, 0xef, 0xa9, 0x3b, 0x39, 0x4f, 0x4c, 0x47, 0x73, 0xc7, 0xb1, 0xf4, 0x1a, 0x05, 0x9b, 0x85, 0xb8, 0x7d, 0x83, 0x21, 0x23, 0xb8, 0x98, 0xcc, 0xa5, 0xef, 0x05, 0x96, 0x59, 0xd8, 0x72, 0x12, 0xd8, 0xc0, 0xcd, 0x0a, 0x15, 0xda, 0x4a, 0x71, 0x86, 0xd7, 0xa8, 0x99, 0x85, 0xb6, 0xb7, 0xa7, 0xf5, 0xde, 0x17, 0x43, 0x28, 0x6a, 0x42, 0x94, 0x00, 0xc4, 0xcc, 0x6b, 0x55, 0x75, 0xea, 0xbe, 0x97, 0x3b, 0x32, 0x59, 0xb5, 0x5c, 0xa1, 0xd0, 0x3d, 0x3b, 0xe2, 0xb8, 0xc4, 0x29, 0xcd, 0x16, 0x88, 0x7d, 0x2f, 0x18, 0x54, 0xe7, 0xc9, 0x03, 0xa4, 0x01, 0x9b, 0x6d, 0x0a ],
+const [ 0xa0, 0x4d, 0x56, 0x3e, 0xec, 0x5c, 0x90, 0x9d, 0xee, 0x3f, 0x6f, 0xa8, 0x13, 0x3c, 0x70, 0xf8, 0x62, 0xd4, 0x63, 0x33, 0xb9, 0xf5, 0xca, 0xde, 0x59, 0x71, 0x82, 0x73, 0xa4, 0xaf, 0xa5, 0xb4, 0x26, 0xa1, 0xae, 0x3e, 0xd3, 0xf5, 0xde, 0x61, 0x8f, 0x90, 0xdf, 0x2f, 0xf4, 0x38, 0xa8, 0xd3, 0x4f, 0x90, 0xa0, 0x25, 0xeb, 0x4a, 0x06, 0x7b, 0x93, 0x98, 0x90, 0xc1, 0x52, 0xe3, 0x52, 0xcc, 0x7d, 0xc0, 0xe2, 0xeb, 0xf3, 0x20, 0xba, 0xbf, 0xa4, 0xc6, 0xdd, 0x4d, 0x50, 0xff, 0xbe, 0x52, 0x91, 0x8d, 0x5d, 0xd6, 0x1c, 0xe4, 0xb3, 0x04, 0x44, 0x99, 0x50, 0x39, 0xc0, 0x17, 0x43, 0x5b, 0xad, 0x94, 0x3a, 0x6c, 0xd7, 0x43, 0xea, 0x5f, 0x34, 0xcb, 0xb1, 0x2a, 0xb1, 0xf9, 0x7a, 0x1c, 0x31, 0xb1, 0xe2, 0x71, 0xd3, 0x2b, 0x99, 0x24, 0x74, 0x5c, 0x0a, 0x04, 0x76, 0xb1, 0x3e, 0x0a ],
+const [ 0xbe, 0xc8, 0xd8, 0x8f, 0x65, 0xe4, 0x95, 0x67, 0xf2, 0x3c, 0xc9, 0x53, 0xd9, 0xca, 0x9b, 0xad, 0x9a, 0x5a, 0xb3, 0x4f, 0x38, 0x33, 0x4c, 0x55, 0xed, 0xf9, 0x8a, 0x25, 0x1c, 0xd2, 0x0e, 0xad, 0x87, 0xc8, 0xc9, 0xec, 0xc2, 0x6f, 0x0d, 0xb4, 0xe8, 0xc7, 0xea, 0xae, 0x8c, 0x63, 0xb7, 0x9e, 0xf2, 0xcb, 0xef, 0xe8, 0x7f, 0x20, 0x3f, 0x54, 0x6f, 0xfe, 0xdc, 0x0e, 0xc6, 0xa6, 0x1a, 0xf1, 0x89, 0x5d, 0x3b, 0x04, 0x2d, 0x0f, 0x84, 0x45, 0x50, 0x38, 0x97, 0xa6, 0xa7, 0x05, 0xfc, 0x56, 0x38, 0xb6, 0x01, 0x41, 0xc9, 0x46, 0xc4, 0xda, 0x98, 0x4e, 0x8e, 0x18, 0x4c, 0x27, 0x62, 0xbe, 0x2c, 0x4e, 0xd6, 0xe0, 0x8f, 0x0d, 0x22, 0xa3, 0x93, 0x58, 0x77, 0x44, 0x12, 0xf6, 0x92, 0x5c, 0xd2, 0xe1, 0x90, 0x62, 0xfc, 0xee, 0x04, 0x71, 0xd0, 0xb0, 0x47, 0x4b, 0x96, 0x9a, 0x0f, 0x9f ],
+const [ 0xd1, 0x99, 0x87, 0x5b, 0xb7, 0x07, 0x1c, 0x43, 0x4a, 0xb2, 0x36, 0xe6, 0xd1, 0x0f, 0x84, 0x05, 0x97, 0x8f, 0xca, 0x25, 0x9f, 0x7c, 0x34, 0x93, 0x94, 0x24, 0xea, 0xa6, 0xff, 0x3a, 0xe4, 0x44, 0xbd, 0x79, 0x00, 0xa7, 0xaf, 0x8a, 0x51, 0x61, 0xb3, 0x28, 0xba, 0x9e, 0xd3, 0x82, 0xbc, 0xaa, 0xbd, 0xe1, 0x8d, 0xb3, 0x73, 0x8a, 0x6a, 0xcf, 0x44, 0xe6, 0x2d, 0x41, 0xfb, 0xe0, 0x22, 0xf8, 0x56, 0x8f, 0x17, 0x58, 0xba, 0x15, 0xb2, 0x3d, 0x24, 0xc7, 0x08, 0x3d, 0x63, 0x8e, 0x6a, 0x2e, 0x85, 0x8c, 0x82, 0xe8, 0x8f, 0x03, 0xa0, 0x4c, 0x71, 0x73, 0x4e, 0x86, 0x38, 0x03, 0x2a, 0x8e, 0x86, 0x22, 0xf5, 0xf5, 0x3f, 0x6e, 0xe7, 0xde, 0x86, 0xd5, 0x45, 0x4b, 0xe8, 0xfa, 0x36, 0x9a, 0xd6, 0xda, 0xd3, 0x4f, 0x59, 0xaf, 0x7d, 0x13, 0x01, 0x15, 0x73, 0xfd, 0x1f, 0x6b, 0xa3, 0x11 ],
+const [ 0xac, 0x76, 0xa7, 0xdb, 0x96, 0x4e, 0x9f, 0xad, 0x2f, 0x98, 0xc1, 0x8c, 0x06, 0xf9, 0x29, 0xf2, 0x3b, 0x62, 0x17, 0xee, 0x35, 0xef, 0x45, 0x25, 0x92, 0x0f, 0x77, 0x17, 0x64, 0xe6, 0x53, 0xa3, 0x9a, 0xef, 0x73, 0xcd, 0xbc, 0xe6, 0xb9, 0xc0, 0xdc, 0xe5, 0xe2, 0x0f, 0xc9, 0xcd, 0x5e, 0x40, 0x85, 0xe7, 0x5f, 0x8b, 0xf9, 0xcb, 0x31, 0xdf, 0xe8, 0x81, 0xc9, 0x26, 0x22, 0xe7, 0xa0, 0xca, 0xfa, 0x52, 0xc2, 0x78, 0xf9, 0x78, 0x21, 0x24, 0xd4, 0x8e, 0x30, 0x4d, 0x9c, 0xad, 0xad, 0x82, 0x35, 0x7a, 0xbe, 0x25, 0x09, 0x06, 0x40, 0x6f, 0xfd, 0xf3, 0x5c, 0xb4, 0xa5, 0xd9, 0x5b, 0xe8, 0xb3, 0xe7, 0xbb, 0x63, 0xb6, 0xce, 0x82, 0xe1, 0x01, 0xda, 0xd2, 0xcd, 0xe8, 0x62, 0xbe, 0xbf, 0x33, 0x63, 0x5c, 0x43, 0xcc, 0x68, 0x1b, 0xdc, 0xbb, 0xad, 0x57, 0x48, 0x54, 0x83, 0x2b, 0x06 ],
+const [ 0xbf, 0x46, 0x5c, 0x88, 0x70, 0x60, 0xc7, 0x62, 0xcc, 0xcd, 0x43, 0xe4, 0xa6, 0x5c, 0x76, 0xe9, 0xfd, 0x68, 0x5f, 0x44, 0xe7, 0xfd, 0xea, 0x03, 0xc8, 0x3d, 0xc2, 0xf5, 0xc7, 0x02, 0x67, 0x69, 0x83, 0xc5, 0x80, 0x39, 0x01, 0xbf, 0x72, 0x07, 0xea, 0x4d, 0x31, 0xc7, 0xf3, 0x99, 0x57, 0x7d, 0x9c, 0x77, 0x73, 0x48, 0x1d, 0x8d, 0xa3, 0xa0, 0x9d, 0xb7, 0x65, 0xdc, 0xa6, 0xaa, 0xaa, 0xf7, 0xd6, 0xd7, 0x2c, 0x93, 0xd7, 0x92, 0x02, 0x3e, 0x91, 0x73, 0x71, 0xf5, 0x9d, 0xfc, 0x06, 0xe6, 0xfd, 0x7d, 0xe1, 0x7a, 0x0b, 0x35, 0x54, 0x93, 0xb0, 0xba, 0xad, 0x13, 0xd6, 0x9b, 0x4f, 0x9d, 0x20, 0x43, 0x08, 0x9f, 0xd8, 0x20, 0x9e, 0x90, 0x29, 0x05, 0xab, 0x76, 0x8e, 0xcd, 0xab, 0xac, 0x8a, 0x42, 0x54, 0xe2, 0x9a, 0x3d, 0x26, 0x65, 0x68, 0x0e, 0x42, 0xa1, 0x41, 0x1d, 0x7f, 0xe4 ],
+const [ 0x63, 0x5a, 0x50, 0x8c, 0x6c, 0x44, 0xc1, 0xeb, 0x78, 0xe3, 0xdb, 0xf5, 0x96, 0x1a, 0xca, 0xb6, 0xee, 0x7d, 0x9b, 0x92, 0xa8, 0xaa, 0x47, 0x36, 0x09, 0xdc, 0xed, 0xce, 0xdf, 0xbd, 0x5f, 0x78, 0x20, 0x7c, 0xe0, 0xf9, 0xce, 0x20, 0x2c, 0xb0, 0x1d, 0x1c, 0xb9, 0xc8, 0xd8, 0x23, 0x3d, 0xb1, 0x01, 0x3d, 0x70, 0xd0, 0xb8, 0x1b, 0x13, 0x75, 0x5d, 0xa7, 0x31, 0x0e, 0xf9, 0xe0, 0xa5, 0x9b, 0xda, 0xe5, 0xdc, 0x62, 0x7e, 0x4f, 0xdc, 0xe4, 0xb3, 0xc4, 0x85, 0x0f, 0xfb, 0xca, 0x17, 0xb5, 0x35, 0xd8, 0xf5, 0x3d, 0x7a, 0xb3, 0xa9, 0x99, 0x46, 0xf8, 0x27, 0x78, 0xd8, 0xf4, 0x56, 0xbc, 0xdb, 0xbc, 0xcc, 0x2e, 0x45, 0x7a, 0xd9, 0x70, 0x80, 0x06, 0xc8, 0x34, 0xc8, 0xb6, 0x61, 0xac, 0xd4, 0x76, 0xb3, 0x41, 0xb8, 0x1b, 0x10, 0x88, 0x0a, 0xf4, 0x58, 0x72, 0x43, 0xa2, 0x7b, 0xc3 ],
+const [ 0x63, 0x49, 0xe3, 0x26, 0x5d, 0x26, 0x30, 0xd1, 0xe1, 0x4b, 0xea, 0x68, 0x0d, 0x34, 0x2c, 0xe9, 0xf7, 0x6a, 0xef, 0xb7, 0x89, 0x02, 0x7f, 0x3d, 0x8f, 0x66, 0x30, 0xd5, 0x0e, 0x58, 0x4c, 0xe8, 0xd7, 0x33, 0x51, 0x56, 0x5d, 0x74, 0x59, 0x18, 0xc4, 0x7a, 0xda, 0x24, 0x3a, 0x8a, 0x8f, 0x90, 0x8a, 0x16, 0xb6, 0xfb, 0xee, 0x3f, 0x7c, 0x29, 0x25, 0x98, 0xb6, 0xed, 0xc6, 0x2d, 0xd1, 0x4c, 0xd4, 0xc4, 0x0c, 0xdf, 0x92, 0x62, 0xe4, 0x79, 0x99, 0x11, 0xd0, 0x0a, 0x27, 0xe1, 0x2f, 0xc3, 0xba, 0x2d, 0x7f, 0x7b, 0xde, 0x1f, 0xcf, 0x52, 0x43, 0x76, 0x77, 0x94, 0x12, 0x87, 0x06, 0xe0, 0x81, 0x82, 0x7c, 0x89, 0xa6, 0xf7, 0xba, 0x3c, 0x88, 0x99, 0x36, 0xe3, 0x7c, 0x41, 0xf3, 0xca, 0xaf, 0x36, 0xb1, 0x00, 0xff, 0xab, 0x61, 0x01, 0x0f, 0x89, 0xdb, 0x91, 0x9a, 0x6f, 0xd3, 0xeb ],
+const [ 0x64, 0xf3, 0xd0, 0xce, 0x82, 0x09, 0x7d, 0x36, 0x38, 0x5b, 0x67, 0x17, 0xfe, 0x15, 0x5d, 0x0f, 0xc5, 0xed, 0x85, 0xbf, 0x80, 0xa1, 0xfe, 0xd9, 0xe3, 0xa1, 0xc3, 0x7a, 0x6b, 0x08, 0xd3, 0xbb, 0x9e, 0xd1, 0x8f, 0x83, 0x94, 0x48, 0x63, 0x9f, 0xb6, 0xbe, 0xa8, 0x14, 0xc6, 0x81, 0xc9, 0xb3, 0x20, 0x0c, 0xa5, 0xef, 0x3f, 0x7a, 0x35, 0xec, 0x82, 0x41, 0x6f, 0xd8, 0x30, 0x1c, 0x6a, 0x7e, 0xbb, 0x49, 0xc2, 0x18, 0x41, 0xf5, 0x3e, 0x65, 0x58, 0xf5, 0xb0, 0xfc, 0x0b, 0xb6, 0x1d, 0xe0, 0x20, 0x77, 0x1e, 0x54, 0x9d, 0xb5, 0x86, 0xf1, 0x8a, 0xe7, 0x45, 0xf5, 0xf7, 0x6c, 0x8d, 0xde, 0x41, 0xc2, 0x33, 0x38, 0x92, 0xf8, 0x57, 0xb3, 0xa7, 0x66, 0x47, 0x78, 0xd6, 0x9b, 0xa1, 0xbd, 0x4f, 0x97, 0xb8, 0x97, 0xa2, 0x3b, 0x39, 0x10, 0x81, 0xfd, 0x0f, 0x7a, 0xc7, 0xe0, 0x83, 0x03 ],
+const [ 0x9c, 0x84, 0xd1, 0x8b, 0x6e, 0xc3, 0x39, 0x24, 0x74, 0x82, 0xcc, 0x3e, 0xe5, 0x2a, 0x1b, 0xbd, 0x6b, 0xd4, 0xae, 0x91, 0x82, 0x16, 0x91, 0x2d, 0x21, 0x1c, 0x10, 0x3a, 0x9d, 0xfb, 0xbe, 0x8d, 0xca, 0x43, 0xbc, 0x57, 0x63, 0xd3, 0x37, 0x9c, 0xac, 0xf2, 0x33, 0xe7, 0x55, 0x9b, 0x87, 0x3b, 0xa2, 0x17, 0x29, 0x4c, 0xc9, 0xd2, 0xac, 0xef, 0x9c, 0x67, 0x07, 0xd0, 0x67, 0xfd, 0x98, 0x63, 0x1c, 0xd6, 0x69, 0x1d, 0xad, 0x25, 0xb1, 0xe3, 0xba, 0x20, 0x9e, 0xc3, 0x6c, 0x57, 0x51, 0xe2, 0xa1, 0x44, 0x2b, 0xb5, 0x49, 0x23, 0x47, 0x74, 0x0f, 0x04, 0x47, 0xcc, 0x3d, 0x1e, 0x54, 0xd5, 0xd9, 0x66, 0x60, 0x43, 0x14, 0x60, 0xae, 0xe0, 0xe6, 0x35, 0x95, 0x3a, 0xf2, 0x07, 0x81, 0x98, 0xaf, 0x81, 0x3a, 0x33, 0xc9, 0xb2, 0x69, 0xa3, 0xc5, 0x1b, 0x58, 0x98, 0xe5, 0x06, 0xf9, 0xca ],
+const [ 0x84, 0x36, 0x22, 0x85, 0x56, 0xa7, 0x56, 0x92, 0x74, 0xbb, 0x14, 0xad, 0x62, 0x71, 0xab, 0xfb, 0x82, 0x39, 0x1e, 0x80, 0x93, 0x63, 0xcb, 0x38, 0x77, 0xd8, 0x4a, 0x63, 0x39, 0x08, 0x98, 0x20, 0x4e, 0x23, 0x75, 0x3d, 0x1b, 0x8c, 0x0a, 0x4e, 0xb8, 0x8b, 0xcf, 0xfc, 0xf4, 0x42, 0xac, 0xa0, 0x99, 0xe2, 0x5f, 0x11, 0xf1, 0x1e, 0x1d, 0xb9, 0x88, 0xe0, 0x7c, 0xef, 0x34, 0x3b, 0x90, 0x81, 0x53, 0xa2, 0x54, 0x8f, 0x54, 0x57, 0x4c, 0xa0, 0x79, 0x25, 0x69, 0xef, 0xda, 0x52, 0x2d, 0x06, 0xae, 0xd0, 0x0f, 0x8e, 0xc6, 0xb3, 0x21, 0x66, 0x5a, 0xe8, 0xf0, 0xf2, 0x08, 0x23, 0xac, 0xb6, 0x1a, 0x19, 0x89, 0x23, 0x08, 0xf0, 0x64, 0xb0, 0x3d, 0xf3, 0xaa, 0x2d, 0x1e, 0x8b, 0x76, 0x54, 0x49, 0x6a, 0xf9, 0xa2, 0x1a, 0x0a, 0x1f, 0x65, 0x74, 0x56, 0x6f, 0x15, 0xbe, 0xa7, 0x34, 0xe7 ],
+const [ 0xe0, 0x1e, 0x41, 0x33, 0x81, 0x98, 0x00, 0xb3, 0x04, 0x45, 0x98, 0x4a, 0x5f, 0x12, 0xd6, 0xe3, 0xe1, 0xe2, 0x9e, 0x1b, 0xc6, 0xd4, 0x28, 0xa2, 0x09, 0xc5, 0x69, 0xe3, 0x79, 0x17, 0xce, 0xe7, 0x0f, 0xb0, 0x30, 0x76, 0x7f, 0x45, 0x05, 0x80, 0x0d, 0xd8, 0xd3, 0xbc, 0xa2, 0x7f, 0xeb, 0x8f, 0x1f, 0x68, 0x53, 0x2f, 0xf1, 0x1a, 0x04, 0x08, 0xe6, 0xfd, 0x55, 0x5f, 0x3e, 0x1d, 0xb8, 0x35, 0x06, 0x2b, 0xa4, 0x6e, 0xa1, 0xc5, 0xd2, 0x32, 0xa8, 0xf6, 0xac, 0x94, 0xf4, 0x01, 0x03, 0x71, 0xf8, 0x5a, 0x00, 0x9b, 0x54, 0xf6, 0x5d, 0x37, 0xa8, 0xc4, 0xd4, 0x64, 0xa6, 0x7c, 0xd8, 0x1e, 0x6c, 0x97, 0x84, 0x61, 0x10, 0x9e, 0xd1, 0x91, 0x7c, 0xa8, 0x0b, 0x19, 0x7c, 0x1f, 0x86, 0x53, 0x15, 0xc2, 0x8d, 0xa8, 0x19, 0xf0, 0x9b, 0xf8, 0xf8, 0x23, 0xce, 0x3b, 0xd9, 0xbb, 0x98, 0x69 ],
+const [ 0x99, 0xd4, 0x48, 0x2d, 0xae, 0xcf, 0xee, 0xb8, 0xd4, 0x42, 0x26, 0xa3, 0x9f, 0x85, 0xb4, 0x2f, 0x95, 0x13, 0xfd, 0xc2, 0xd7, 0x98, 0xc6, 0x98, 0x04, 0x4c, 0x3e, 0xb5, 0x5a, 0x80, 0x3f, 0x1e, 0x1e, 0x76, 0xd1, 0x48, 0x3e, 0x76, 0xf0, 0xd1, 0x36, 0x1e, 0x8f, 0x6e, 0x30, 0xfa, 0xdc, 0x25, 0x6f, 0x55, 0xc6, 0xbc, 0xed, 0x4e, 0xbc, 0x71, 0x43, 0x2e, 0xb8, 0xeb, 0xca, 0xf8, 0x7d, 0x71, 0x00, 0x42, 0x1d, 0x5a, 0x2d, 0x44, 0xbd, 0xc4, 0x46, 0x2f, 0x9c, 0x89, 0x11, 0xc0, 0x52, 0x6f, 0x8a, 0x14, 0x56, 0x9f, 0x86, 0xbe, 0xc3, 0x59, 0x96, 0x17, 0x5c, 0xe5, 0x2e, 0xd5, 0xcd, 0xcd, 0x06, 0xdf, 0x34, 0x49, 0xc1, 0x60, 0xdf, 0xfb, 0xcd, 0x1a, 0x57, 0xdc, 0x8a, 0xfe, 0x9e, 0x77, 0xae, 0xf9, 0xb6, 0x55, 0xe8, 0x10, 0x62, 0xb8, 0xc3, 0xaf, 0x31, 0x8c, 0xce, 0x3e, 0xb7, 0x9a ],
+const [ 0xd8, 0x3c, 0x04, 0x02, 0x72, 0x97, 0xba, 0xca, 0xa0, 0xba, 0x8b, 0xed, 0xb8, 0x34, 0x16, 0x9f, 0xea, 0x05, 0xae, 0xf6, 0xc6, 0x0e, 0x00, 0xfc, 0xfe, 0xc5, 0xf6, 0x03, 0x6e, 0x2d, 0xdc, 0x38, 0x59, 0x06, 0xc2, 0x7b, 0xf6, 0x40, 0x21, 0x6e, 0x2b, 0xb6, 0xc1, 0xcc, 0x98, 0x19, 0xd9, 0xfd, 0xd7, 0x2a, 0x79, 0xe7, 0x02, 0x2d, 0x25, 0x06, 0x76, 0x9a, 0xc2, 0xbf, 0xd7, 0x15, 0xb7, 0xf1, 0x55, 0xa0, 0x4c, 0xce, 0x2d, 0x10, 0x55, 0xe9, 0x72, 0xbd, 0x15, 0x8f, 0x0d, 0x7e, 0x5d, 0x5b, 0x03, 0xd5, 0xf4, 0x05, 0xf6, 0x66, 0x3b, 0x7b, 0xef, 0xae, 0x11, 0x33, 0x5a, 0xf1, 0xf5, 0xbf, 0x52, 0x74, 0x6a, 0xa2, 0x1f, 0xed, 0xa0, 0x62, 0xfd, 0x38, 0x50, 0xde, 0x1f, 0x4b, 0xe8, 0xe2, 0xf4, 0x6c, 0xe8, 0xf9, 0xa9, 0xa2, 0x8c, 0x82, 0xef, 0x69, 0xab, 0x06, 0xfe, 0xa9, 0xdf, 0xc9 ],
+const [ 0x0e, 0x9b, 0x07, 0x3a, 0x31, 0xc8, 0xfd, 0x21, 0x5a, 0xf1, 0xd8, 0xd0, 0xce, 0x54, 0xac, 0x9a, 0xe1, 0x09, 0x03, 0x6e, 0x17, 0x94, 0x25, 0x09, 0x88, 0xb7, 0x96, 0x6a, 0x89, 0x8a, 0xdf, 0x86, 0x88, 0xcd, 0x91, 0x3e, 0x38, 0x7c, 0x88, 0x8e, 0xef, 0xa4, 0x6d, 0x07, 0x4c, 0x76, 0x7e, 0x7f, 0x1c, 0x99, 0x92, 0x07, 0x7e, 0xc5, 0x57, 0x1d, 0x46, 0x8e, 0xdf, 0x23, 0xa0, 0x7d, 0x5b, 0x10, 0xf6, 0x65, 0x26, 0x66, 0x13, 0xf4, 0x05, 0x64, 0x88, 0x89, 0xad, 0x7c, 0x4e, 0x45, 0x85, 0x07, 0xae, 0x65, 0xae, 0x38, 0x5e, 0xcf, 0x41, 0x4e, 0xed, 0xea, 0xd7, 0x0e, 0x60, 0xb3, 0x4f, 0x71, 0x1e, 0x0e, 0xcb, 0x9a, 0x09, 0x59, 0xfc, 0x0a, 0xee, 0x47, 0xa0, 0x17, 0x1f, 0xec, 0x48, 0x9a, 0x5e, 0x14, 0x5f, 0xe9, 0xfd, 0xd9, 0x68, 0x05, 0x44, 0x75, 0x87, 0x14, 0x13, 0x54, 0x43, 0x11 ],
+const [ 0x86, 0xc7, 0xc8, 0x2b, 0xba, 0x16, 0x5b, 0x31, 0xad, 0x74, 0xd9, 0x2b, 0xa2, 0x2a, 0x3b, 0xbf, 0xf9, 0x26, 0x80, 0x7e, 0x53, 0x96, 0xf4, 0x14, 0xf7, 0xb6, 0xb2, 0xc2, 0x75, 0xe6, 0x68, 0x0f, 0x89, 0x00, 0x5a, 0xba, 0x41, 0xe8, 0xaa, 0xf2, 0x62, 0x65, 0xd6, 0xc9, 0x09, 0x2f, 0x82, 0xe7, 0x8e, 0x49, 0x78, 0x7b, 0xad, 0x90, 0xed, 0x78, 0xe8, 0x95, 0x06, 0xfd, 0x27, 0xa8, 0x9a, 0x14, 0xa2, 0x35, 0x3a, 0xa0, 0x00, 0x54, 0x6e, 0x91, 0xc0, 0x9b, 0x42, 0x5a, 0xd9, 0x36, 0x01, 0xa5, 0x9d, 0x3a, 0x41, 0x45, 0xe3, 0x37, 0x1f, 0x6c, 0x65, 0x0d, 0xcc, 0x1e, 0x67, 0x00, 0x49, 0xe5, 0x9a, 0x0e, 0x6e, 0xc7, 0x3f, 0x7f, 0x31, 0x75, 0x8f, 0xbf, 0x25, 0xc5, 0x5b, 0x69, 0x41, 0x62, 0xf0, 0xa4, 0xe3, 0xc2, 0x3d, 0xb2, 0x14, 0x59, 0x38, 0xc6, 0x0e, 0x0d, 0x7d, 0x16, 0xfc, 0xe9 ],
+const [ 0xa6, 0x4a, 0xd9, 0x6b, 0xe2, 0x24, 0xdc, 0xee, 0xf6, 0x56, 0x3f, 0x18, 0xc6, 0x3f, 0xb7, 0x55, 0x5a, 0xd9, 0x26, 0x93, 0x3f, 0x8e, 0x1c, 0xb0, 0x2a, 0x4d, 0x9e, 0x2e, 0xdf, 0xdc, 0x27, 0x2e, 0x51, 0x70, 0xed, 0x9c, 0x0b, 0x7b, 0x65, 0xa7, 0xce, 0xc5, 0x09, 0x74, 0x7c, 0xbe, 0x59, 0x13, 0x34, 0x13, 0x20, 0xb2, 0xbf, 0x7f, 0xf8, 0x10, 0x2b, 0xe4, 0x10, 0x35, 0xb5, 0x9a, 0x2d, 0x61, 0xed, 0x06, 0xef, 0x42, 0x14, 0x6f, 0x56, 0x69, 0xc9, 0x0e, 0x84, 0xff, 0xe5, 0x64, 0xc5, 0xb4, 0xa3, 0xd1, 0xcc, 0xf9, 0x04, 0x61, 0x40, 0x6f, 0x71, 0xe9, 0x77, 0x9f, 0xa2, 0x53, 0x81, 0xeb, 0xc0, 0x36, 0x68, 0xc4, 0xc6, 0xaa, 0xb6, 0x1e, 0x2d, 0x5a, 0x38, 0x21, 0xc8, 0xda, 0x02, 0x22, 0xed, 0x3b, 0xb3, 0xd1, 0xd5, 0xdd, 0xfa, 0xb4, 0x45, 0x85, 0x59, 0xd4, 0x6e, 0xaf, 0x29, 0xb6 ],
+const [ 0x22, 0xee, 0xed, 0x3b, 0x24, 0xe0, 0x76, 0xc2, 0x60, 0xf1, 0x2f, 0x15, 0x30, 0x69, 0x50, 0x59, 0xb2, 0x3d, 0x0a, 0xcb, 0xbe, 0x33, 0x1a, 0x04, 0x1b, 0x47, 0x9d, 0x7b, 0xf2, 0x4d, 0x26, 0x4b, 0x82, 0xd9, 0x0e, 0x36, 0x16, 0x5c, 0x0b, 0xea, 0x34, 0x8f, 0x04, 0x84, 0x18, 0x15, 0x24, 0x53, 0x61, 0x5c, 0x2e, 0xde, 0x09, 0xc4, 0x10, 0x28, 0x9a, 0x03, 0xba, 0x32, 0x9f, 0xc8, 0x30, 0xc2, 0x59, 0x9e, 0xde, 0x63, 0xb4, 0x13, 0x2d, 0xad, 0x79, 0x1a, 0x53, 0xc6, 0xc5, 0xaf, 0x6f, 0x29, 0xba, 0xb9, 0xd5, 0xa6, 0x74, 0x34, 0xa6, 0xaa, 0x3f, 0x8f, 0xa5, 0xc1, 0x07, 0x53, 0x45, 0x59, 0x10, 0x06, 0x07, 0xc9, 0xe7, 0x4f, 0x02, 0x92, 0x98, 0x5b, 0xc3, 0xe4, 0x21, 0x7e, 0x58, 0x64, 0x27, 0x1e, 0xa8, 0x2c, 0xe8, 0xcd, 0x06, 0x13, 0x71, 0xb5, 0x05, 0x2f, 0x10, 0x39, 0x8d, 0x99 ],
+const [ 0x48, 0x0b, 0xe7, 0x58, 0xa9, 0xb7, 0xba, 0x9a, 0xf0, 0x01, 0xbf, 0x21, 0xdb, 0x00, 0xc4, 0x51, 0xcf, 0xd6, 0x6f, 0x06, 0xc9, 0xd8, 0xd5, 0xd6, 0x98, 0xef, 0x47, 0x97, 0x4a, 0x3d, 0x6f, 0x21, 0xe4, 0x04, 0x9d, 0x55, 0x56, 0xc4, 0x5b, 0x5f, 0xad, 0xa4, 0x47, 0x37, 0x8b, 0x13, 0x22, 0x6e, 0xd4, 0xaf, 0x24, 0x27, 0xab, 0x66, 0x92, 0x64, 0x9d, 0xdb, 0x93, 0x83, 0x1b, 0x0b, 0x40, 0x08, 0x2e, 0x30, 0xfa, 0x9c, 0x66, 0xe6, 0x00, 0x56, 0x14, 0x8c, 0x40, 0x3a, 0xb8, 0xed, 0x6e, 0xff, 0xbd, 0x1f, 0x54, 0x16, 0x64, 0xac, 0x69, 0xe7, 0xff, 0xf0, 0xa4, 0x5e, 0x5f, 0xc2, 0x92, 0xa6, 0x8f, 0x57, 0xa7, 0x34, 0xc3, 0x62, 0xd2, 0x08, 0x8b, 0x80, 0x53, 0x2f, 0x4c, 0xd4, 0xd1, 0x8d, 0xf1, 0xee, 0xa7, 0xd9, 0xde, 0xf2, 0x80, 0xe9, 0x25, 0xf6, 0x23, 0x30, 0xfd, 0xab, 0x90, 0x85 ],
+const [ 0x22, 0x02, 0x48, 0xf5, 0xe6, 0xd7, 0xa4, 0x93, 0x35, 0xb3, 0xf9, 0x13, 0x74, 0xf1, 0x8b, 0xb8, 0xb0, 0xff, 0x5e, 0x8b, 0x9a, 0x58, 0x53, 0xf3, 0xcf, 0xb2, 0x93, 0x85, 0x5d, 0x78, 0x30, 0x1d, 0x83, 0x7a, 0x0a, 0x2e, 0xb9, 0xe4, 0xf0, 0x56, 0xf0, 0x6c, 0x08, 0x36, 0x1b, 0xd0, 0x71, 0x80, 0xee, 0x80, 0x26, 0x51, 0xe6, 0x97, 0x26, 0xc2, 0x89, 0x10, 0xd2, 0xba, 0xef, 0x37, 0x96, 0x06, 0x81, 0x5d, 0xcb, 0xab, 0x01, 0xd0, 0xdc, 0x7a, 0xcb, 0x0b, 0xa8, 0xe6, 0x5a, 0x29, 0x28, 0x13, 0x0d, 0xa0, 0x52, 0x2f, 0x2b, 0x2b, 0x3d, 0x05, 0x26, 0x08, 0x85, 0xcf, 0x1c, 0x64, 0xf1, 0x4c, 0xa3, 0x14, 0x53, 0x13, 0xc6, 0x85, 0xb0, 0x27, 0x4b, 0xf6, 0xa1, 0xcb, 0x38, 0xe4, 0xf9, 0x98, 0x95, 0xc6, 0xa8, 0xcc, 0x72, 0xfb, 0xe0, 0xe5, 0x2c, 0x01, 0x76, 0x6f, 0xed, 0xe7, 0x8a, 0x1a ],
+const [ 0x6d, 0xcc, 0x39, 0x49, 0x42, 0x4f, 0xef, 0xab, 0xd4, 0xb3, 0xb7, 0xb4, 0xcb, 0xd0, 0x98, 0xa6, 0x77, 0x87, 0x81, 0x01, 0x64, 0x03, 0x80, 0xec, 0x2f, 0x3f, 0x34, 0xd6, 0x99, 0xc8, 0x85, 0x5d, 0xda, 0xc5, 0x92, 0x6f, 0x38, 0x34, 0xeb, 0xaf, 0xd7, 0x76, 0x01, 0x1a, 0xd3, 0x0e, 0xdb, 0xea, 0x8c, 0xa6, 0x0a, 0xba, 0x41, 0x52, 0xde, 0xec, 0xe1, 0x19, 0xda, 0x48, 0x1d, 0xb2, 0x66, 0xe5, 0xc2, 0x8b, 0xc4, 0x4d, 0x46, 0x10, 0x45, 0xdc, 0xa0, 0x29, 0xbd, 0x69, 0x5d, 0x04, 0x34, 0x29, 0xf1, 0x16, 0xde, 0xcf, 0x4b, 0x5c, 0x4e, 0xf8, 0xac, 0xe7, 0xe6, 0xc7, 0xb8, 0x97, 0x92, 0xcc, 0xce, 0x27, 0xb6, 0x2b, 0x95, 0x69, 0x64, 0xfa, 0xd7, 0xd3, 0xd3, 0xea, 0x93, 0x3b, 0x0c, 0x2a, 0x4d, 0xdf, 0xe7, 0x88, 0xa9, 0xa8, 0x36, 0xda, 0x38, 0xb0, 0x40, 0x9c, 0x92, 0x01, 0x71, 0xda ],
+const [ 0xf5, 0x3e, 0xe3, 0xe2, 0xce, 0x44, 0x67, 0xde, 0x8b, 0x3b, 0x30, 0xae, 0xce, 0x94, 0x04, 0xdc, 0x90, 0xae, 0xd0, 0x67, 0x5b, 0x3f, 0x84, 0x54, 0xba, 0xf6, 0x24, 0x65, 0xef, 0x5f, 0x1c, 0x29, 0xe3, 0x06, 0xd5, 0x35, 0x63, 0xdf, 0x85, 0xb0, 0x88, 0xe5, 0x4b, 0x15, 0x77, 0x02, 0x7b, 0x34, 0x4b, 0x2f, 0x37, 0x7a, 0x50, 0xdc, 0x3f, 0x73, 0x72, 0x92, 0x09, 0x8d, 0xf5, 0xd7, 0x15, 0x1f, 0x66, 0x52, 0x7b, 0xa9, 0xd1, 0x2f, 0xc6, 0x5e, 0x34, 0xc5, 0x04, 0xdf, 0x34, 0x76, 0x1e, 0x4a, 0x0f, 0xd7, 0x66, 0x73, 0xd2, 0x11, 0x6f, 0x71, 0xcc, 0x88, 0x21, 0x5d, 0x42, 0xba, 0x0c, 0x56, 0x64, 0x69, 0xfd, 0xc8, 0x80, 0xfc, 0xcf, 0xee, 0x76, 0x23, 0x84, 0x96, 0x6c, 0xba, 0x95, 0x25, 0xc2, 0xf0, 0x85, 0xda, 0x48, 0xa8, 0xbc, 0x57, 0xaf, 0x1f, 0x93, 0x5d, 0x3e, 0xcf, 0xac, 0xd7 ],
+const [ 0x53, 0x8e, 0x37, 0x9b, 0x06, 0xf1, 0xd8, 0x9a, 0x9e, 0xa9, 0x78, 0xa8, 0xf1, 0x7e, 0xcd, 0x6f, 0x8a, 0x22, 0xd1, 0xd1, 0x5a, 0x14, 0x18, 0xe4, 0xaa, 0xc5, 0x60, 0x3b, 0x54, 0xfa, 0x6a, 0x68, 0x33, 0x71, 0x08, 0xbe, 0xd8, 0xc7, 0x78, 0x5c, 0x7e, 0x99, 0xf0, 0x67, 0x40, 0xea, 0x7a, 0x96, 0x8a, 0xc4, 0x02, 0xf4, 0xce, 0x22, 0xad, 0xe1, 0x78, 0x0e, 0x6d, 0x5a, 0x23, 0x07, 0xd3, 0x7b, 0x0d, 0xa5, 0x24, 0x42, 0xc8, 0x80, 0xae, 0x96, 0x33, 0x4d, 0x5c, 0x88, 0xa9, 0x4a, 0x89, 0xd8, 0x78, 0xdd, 0x12, 0xbb, 0x95, 0x77, 0xaf, 0xdb, 0x8e, 0xbf, 0x83, 0xa0, 0xbf, 0xed, 0xf1, 0xae, 0xc9, 0x73, 0xb2, 0xaf, 0x40, 0xe3, 0x24, 0x52, 0xa4, 0x0d, 0xe5, 0x93, 0x93, 0x67, 0xa1, 0x3e, 0x3c, 0xb3, 0x28, 0xae, 0x17, 0xdb, 0xc4, 0xdb, 0xd4, 0x20, 0xc9, 0x94, 0x91, 0x73, 0x6d, 0x08 ],
+const [ 0x42, 0x60, 0x90, 0x15, 0x3d, 0xd0, 0x66, 0x65, 0x12, 0x3a, 0xa3, 0x75, 0xcb, 0x99, 0x2e, 0x22, 0x1c, 0xdd, 0x03, 0x06, 0x8b, 0x82, 0x7a, 0xa7, 0xd3, 0x67, 0xcc, 0xed, 0x8b, 0xde, 0xd3, 0xda, 0x03, 0xff, 0x11, 0x75, 0x6f, 0x43, 0xf4, 0x07, 0x47, 0x4e, 0x58, 0x8a, 0xed, 0x0b, 0x4e, 0x5f, 0x91, 0xfe, 0x1c, 0x3f, 0x52, 0xd6, 0x85, 0x74, 0xa5, 0x42, 0x4a, 0x49, 0xfb, 0x06, 0xf0, 0xbf, 0x9e, 0x4e, 0xc4, 0x81, 0xdc, 0x42, 0x1d, 0x1a, 0x68, 0xda, 0xe1, 0x66, 0xfd, 0xf4, 0x4a, 0x46, 0x44, 0xa4, 0xea, 0x98, 0xf8, 0xcb, 0xed, 0x67, 0x48, 0xeb, 0x9f, 0x5e, 0x7d, 0x39, 0x2e, 0x83, 0xdc, 0xf4, 0xb0, 0x22, 0xce, 0xf6, 0x67, 0x06, 0x3e, 0x89, 0x44, 0xef, 0x43, 0x7b, 0xab, 0x41, 0xff, 0x75, 0x76, 0xfa, 0xc7, 0x88, 0x3c, 0xe6, 0x83, 0x09, 0xd3, 0x16, 0x58, 0x9f, 0x13, 0x8e ],
+const [ 0x3c, 0x17, 0xd3, 0x27, 0x44, 0x95, 0xdc, 0xc8, 0x6f, 0x27, 0x22, 0x39, 0x8d, 0xb6, 0x02, 0x37, 0xfc, 0x70, 0xfc, 0x0e, 0x63, 0xb3, 0x0a, 0xa4, 0xa3, 0x2c, 0x30, 0xb9, 0x0b, 0x40, 0x55, 0x6d, 0xcc, 0xaa, 0x51, 0x03, 0xac, 0x66, 0x47, 0xe4, 0xfe, 0xce, 0x35, 0xe7, 0xd1, 0x04, 0xc9, 0xcf, 0x68, 0x8f, 0x77, 0x16, 0xea, 0x49, 0xc8, 0xe9, 0x5b, 0x78, 0xf5, 0x73, 0xcb, 0x3b, 0xb4, 0x5e, 0xcd, 0x28, 0x52, 0x97, 0x2b, 0x33, 0x02, 0x52, 0xd8, 0xd1, 0x75, 0x4f, 0x26, 0x5e, 0xaa, 0x5b, 0x39, 0xbc, 0x08, 0x19, 0xbc, 0x3e, 0xaa, 0x02, 0xd2, 0xc4, 0xfa, 0xab, 0x50, 0x27, 0x81, 0x46, 0x29, 0xd7, 0xfd, 0x6c, 0x2a, 0xc2, 0xb4, 0x1a, 0xe7, 0x78, 0x09, 0xf9, 0xf5, 0x8d, 0x4d, 0xe2, 0x59, 0x3f, 0xd7, 0xa1, 0x41, 0x59, 0x57, 0xf9, 0xf2, 0x58, 0x67, 0xe9, 0x02, 0xcb, 0x63, 0x2e ],
+const [ 0x4a, 0xe2, 0x31, 0xea, 0xfe, 0x77, 0xa1, 0x58, 0xc2, 0x47, 0x21, 0x43, 0xfa, 0xf1, 0x69, 0xdb, 0x29, 0xbf, 0x2b, 0x53, 0xc3, 0x28, 0x8d, 0x8b, 0x3c, 0x9a, 0xdd, 0xed, 0x65, 0x77, 0x80, 0x95, 0xf8, 0x5e, 0x2c, 0xb4, 0x71, 0xab, 0x58, 0x36, 0x20, 0x41, 0xf0, 0xa2, 0x7d, 0x87, 0x4c, 0x42, 0xbb, 0xb0, 0x63, 0x85, 0xa0, 0x40, 0x3c, 0xa1, 0x93, 0xcb, 0xa6, 0x7c, 0xf7, 0x00, 0x29, 0xcd, 0xb7, 0xe7, 0x3c, 0x7e, 0x22, 0x67, 0xb8, 0x56, 0xfa, 0x0b, 0x8d, 0xd4, 0xc7, 0x06, 0xb4, 0x5e, 0x71, 0x74, 0x65, 0x9b, 0x0e, 0xe2, 0x89, 0x1d, 0xf9, 0x11, 0x72, 0x43, 0x24, 0xf7, 0xca, 0x5d, 0xaf, 0x07, 0xc9, 0x12, 0xb9, 0xb2, 0xab, 0xff, 0x76, 0x2e, 0x62, 0xa1, 0x81, 0x76, 0x88, 0x75, 0x74, 0x92, 0x97, 0x5d, 0xb7, 0x18, 0x5c, 0x46, 0x95, 0xf3, 0xa9, 0x08, 0x95, 0x63, 0x4b, 0x8d ],
+const [ 0x00, 0xbf, 0x40, 0xf1, 0xef, 0xb6, 0x48, 0x4f, 0xb6, 0xf9, 0xfc, 0xff, 0x80, 0x51, 0x0b, 0xc8, 0x81, 0x79, 0x59, 0xcd, 0xe4, 0x3a, 0x98, 0xca, 0x04, 0xd5, 0x18, 0x9b, 0xde, 0xa1, 0xe0, 0xfe, 0xc7, 0xf5, 0xfd, 0x99, 0x5a, 0x48, 0x1a, 0x3f, 0xb5, 0x97, 0x51, 0x6f, 0xe5, 0x08, 0x41, 0x1d, 0x9e, 0xcc, 0x61, 0xb5, 0x2f, 0x49, 0x93, 0x5e, 0xb6, 0x79, 0xfd, 0x7c, 0x90, 0x8d, 0x14, 0x78, 0x14, 0xd7, 0xf9, 0xc3, 0x81, 0xe6, 0x09, 0x18, 0x34, 0xf3, 0xb0, 0x02, 0x1f, 0x7c, 0x7d, 0x9f, 0x76, 0x2e, 0x7c, 0xa3, 0xab, 0x08, 0xc0, 0x9f, 0x9d, 0xbe, 0x3f, 0x84, 0x0d, 0x5b, 0xe3, 0x63, 0x51, 0x2b, 0xdd, 0x76, 0x4c, 0xd8, 0x3d, 0x64, 0x9d, 0xd3, 0xbf, 0xc1, 0x17, 0xf5, 0xe8, 0xd4, 0x71, 0x67, 0x52, 0x9e, 0x3f, 0xbf, 0x45, 0x17, 0x21, 0x6b, 0x86, 0xbb, 0x3b, 0x53, 0x74, 0x45 ],
+const [ 0xfb, 0x9c, 0xfb, 0x8a, 0x89, 0x76, 0x1e, 0x4c, 0x02, 0x11, 0x7b, 0xe8, 0x50, 0x00, 0x6b, 0x26, 0xae, 0xde, 0x2a, 0x20, 0x5f, 0x34, 0x2d, 0x45, 0x9f, 0x9c, 0xb6, 0xa4, 0xda, 0x27, 0xa5, 0x68, 0x1c, 0xfd, 0x91, 0x9e, 0xc9, 0x43, 0x17, 0x3f, 0x8e, 0x42, 0x72, 0x6a, 0x97, 0xc5, 0x4c, 0xf1, 0x02, 0xc2, 0xd4, 0x17, 0x94, 0x3d, 0x11, 0x98, 0xab, 0x6a, 0x76, 0xea, 0x74, 0x12, 0xb6, 0xc3, 0x5e, 0x37, 0xda, 0xdb, 0xcf, 0xfb, 0x90, 0xf3, 0x15, 0xbe, 0xc6, 0x16, 0x9f, 0x87, 0x77, 0x1f, 0x6d, 0xa5, 0xc5, 0x7b, 0xc5, 0x96, 0x49, 0x30, 0x28, 0x27, 0xa7, 0x1e, 0x84, 0xdd, 0x65, 0x85, 0xab, 0x94, 0xfd, 0xc8, 0x04, 0x66, 0x30, 0x71, 0x80, 0xce, 0x9e, 0x74, 0xd0, 0x0d, 0x94, 0xb8, 0xd6, 0xcd, 0x25, 0xd3, 0x59, 0x05, 0x7c, 0x16, 0xfc, 0x1c, 0x70, 0xc9, 0x71, 0x51, 0x59, 0xb7 ],
+const [ 0xe7, 0x46, 0x28, 0x35, 0xe3, 0x85, 0x09, 0xf5, 0xbe, 0xe7, 0x4c, 0x31, 0x33, 0x48, 0x2a, 0xd4, 0xd7, 0xfb, 0x7d, 0xdc, 0xfb, 0x18, 0xc7, 0x54, 0xd2, 0x17, 0x76, 0x82, 0xd7, 0x9e, 0x66, 0x61, 0x69, 0x98, 0xa8, 0x52, 0xb8, 0x87, 0x82, 0x0e, 0xe5, 0x1b, 0xb6, 0xdf, 0x65, 0x03, 0x07, 0x10, 0xa7, 0x03, 0xfa, 0xa1, 0xf6, 0x47, 0xda, 0x40, 0xa0, 0xf7, 0xfe, 0x75, 0x58, 0x0b, 0x4f, 0x1d, 0xd9, 0x61, 0x04, 0x19, 0xcc, 0x0c, 0xb0, 0x47, 0xec, 0xf0, 0x7f, 0xb1, 0x68, 0x8c, 0xbc, 0x05, 0x88, 0x16, 0x97, 0x46, 0x94, 0xcd, 0x26, 0xc0, 0xf2, 0x8b, 0xa9, 0x41, 0x8e, 0x99, 0x12, 0x86, 0x7f, 0xc8, 0xc5, 0xf4, 0xe7, 0xbd, 0x9c, 0x89, 0x1a, 0x8d, 0x2e, 0x11, 0x03, 0x8a, 0x51, 0x9d, 0xc4, 0x5c, 0xdd, 0x31, 0x9d, 0x53, 0xb3, 0xbd, 0x0f, 0xfb, 0xfe, 0x4e, 0x41, 0xf1, 0xb9, 0x86 ],
+const [ 0x75, 0x7d, 0x2b, 0x41, 0x48, 0x47, 0x41, 0xe4, 0xf9, 0xa9, 0xfc, 0x4c, 0x30, 0xfc, 0x63, 0x3d, 0x31, 0xbe, 0x09, 0xc8, 0x56, 0x36, 0x27, 0x15, 0xbd, 0x5b, 0xed, 0x60, 0x3e, 0xf3, 0x1a, 0x42, 0xa0, 0xf8, 0xcb, 0x32, 0x0c, 0x3f, 0x90, 0x4b, 0xc1, 0x5c, 0xc5, 0x50, 0x0a, 0xc0, 0x20, 0xed, 0x6d, 0x24, 0x86, 0x3f, 0x26, 0x2b, 0x23, 0x97, 0xd4, 0x42, 0xb9, 0x7b, 0x71, 0xcb, 0x38, 0xee, 0x87, 0x7c, 0x90, 0xf2, 0xa1, 0x01, 0xc3, 0x4a, 0x00, 0xe9, 0x3e, 0x84, 0x90, 0xbf, 0x69, 0x37, 0x1b, 0x77, 0x7d, 0x8a, 0xbb, 0x0d, 0x96, 0xf5, 0x95, 0x68, 0x09, 0x4c, 0xc4, 0x84, 0xf7, 0xf9, 0x94, 0xd0, 0x22, 0x88, 0xf1, 0xd5, 0x00, 0x6a, 0x1f, 0x19, 0x0e, 0xf2, 0xab, 0x43, 0x67, 0xa4, 0xa1, 0x7f, 0x95, 0xaf, 0xff, 0x24, 0xa7, 0xb8, 0x6a, 0x95, 0x83, 0xd9, 0x20, 0x65, 0x7e, 0xea ],
+const [ 0x71, 0xdb, 0x63, 0xe8, 0xb1, 0x39, 0x26, 0x44, 0xe6, 0xfc, 0xf7, 0xc3, 0xd8, 0x1a, 0x03, 0xa7, 0x51, 0x82, 0x90, 0xf4, 0xd3, 0x00, 0x48, 0x76, 0x8a, 0x61, 0xd4, 0x05, 0x80, 0xd7, 0xad, 0x08, 0x10, 0x9f, 0x2f, 0x38, 0x9d, 0xe0, 0xf0, 0xa7, 0x84, 0xd7, 0x4f, 0x00, 0x4e, 0x31, 0x50, 0x10, 0x2b, 0xb8, 0xa7, 0x85, 0x9c, 0x32, 0x12, 0xf6, 0x6f, 0x86, 0xec, 0x24, 0xf0, 0x21, 0x00, 0x80, 0x5e, 0x98, 0x9b, 0xed, 0x9c, 0x8f, 0xe5, 0xc6, 0x29, 0xd9, 0x70, 0x23, 0x52, 0xe1, 0x12, 0x58, 0xa6, 0x48, 0xf0, 0xbf, 0xab, 0xcf, 0xdc, 0xb8, 0xcf, 0x78, 0xe1, 0xed, 0xa1, 0xe8, 0x1b, 0xdb, 0x41, 0x10, 0xcc, 0x8e, 0x15, 0x0c, 0xad, 0xab, 0xbe, 0x4b, 0x82, 0xb4, 0x4b, 0xf1, 0xf1, 0x88, 0xac, 0x79, 0x94, 0x29, 0x69, 0x9f, 0x4d, 0xc2, 0x94, 0x7d, 0xda, 0xe9, 0xfc, 0xf4, 0xa9, 0x21 ],
+const [ 0x17, 0x96, 0x45, 0xa0, 0x88, 0x5b, 0xf0, 0xf1, 0xde, 0xb9, 0xf6, 0xc1, 0x05, 0xbd, 0xbf, 0x2b, 0xbd, 0xf7, 0x28, 0xe6, 0xed, 0x81, 0x78, 0x6c, 0x3a, 0x3e, 0x95, 0x5b, 0xd9, 0x60, 0x78, 0x1b, 0xa1, 0x2d, 0xde, 0xc1, 0x65, 0x02, 0x40, 0x33, 0x80, 0x98, 0x06, 0x8d, 0xb1, 0x86, 0xf8, 0xc4, 0x2a, 0x07, 0xf5, 0x8a, 0xe3, 0xfe, 0xe7, 0x71, 0x34, 0x37, 0xf6, 0x52, 0xa3, 0xf0, 0xfc, 0xf0, 0xfb, 0x98, 0x39, 0xd9, 0x9e, 0xd6, 0x49, 0x8d, 0x1b, 0xcd, 0x52, 0xe2, 0x03, 0x9f, 0x82, 0xa7, 0xf9, 0x2f, 0xb9, 0x88, 0x09, 0x2c, 0x82, 0x31, 0x3b, 0x4b, 0x48, 0xb7, 0x67, 0xd3, 0xc7, 0x33, 0x4a, 0x5f, 0xc0, 0xb0, 0xda, 0xdf, 0xf1, 0x47, 0xd7, 0xe1, 0x44, 0x88, 0xa3, 0x0f, 0x47, 0x1c, 0x53, 0xf8, 0xdc, 0xa9, 0x06, 0x13, 0x32, 0xf6, 0x75, 0x00, 0xf3, 0x50, 0xcc, 0x12, 0xbf, 0x2c ],
+const [ 0xb2, 0x0f, 0x96, 0x99, 0x7b, 0x06, 0x03, 0xa0, 0xbb, 0x86, 0x00, 0x70, 0x36, 0x98, 0x85, 0xf3, 0xbb, 0x19, 0x08, 0x93, 0x9f, 0x61, 0x95, 0xfd, 0x6b, 0x23, 0x21, 0x24, 0xd2, 0x94, 0x1c, 0x89, 0xe6, 0xd0, 0x45, 0xbb, 0x8b, 0x79, 0xc2, 0x19, 0x2b, 0xa1, 0x70, 0xdf, 0xab, 0xea, 0x78, 0x61, 0x9e, 0xeb, 0x23, 0x91, 0xb9, 0xd6, 0xef, 0xc7, 0x87, 0x58, 0xe2, 0xc2, 0x5e, 0xc1, 0x1e, 0xea, 0x92, 0x65, 0xb6, 0xd7, 0xe8, 0x42, 0xc0, 0x17, 0x4e, 0xe3, 0xab, 0x2c, 0xc9, 0x84, 0xd3, 0xd5, 0xae, 0x76, 0x53, 0x8f, 0x15, 0xc5, 0x1a, 0x5a, 0x8b, 0x19, 0x42, 0xc0, 0x07, 0xda, 0x9d, 0x14, 0x20, 0x97, 0x90, 0xf8, 0x7c, 0xa9, 0x24, 0x21, 0x8c, 0x13, 0x5a, 0x5f, 0x76, 0xad, 0xbf, 0xd7, 0x53, 0x82, 0x41, 0x93, 0x9b, 0x76, 0x41, 0x3e, 0xdd, 0x2c, 0xe9, 0x28, 0xb4, 0x26, 0xc0, 0x91 ],
+const [ 0x88, 0x3e, 0x6c, 0xa2, 0xb1, 0x9e, 0xf5, 0x46, 0x40, 0xbb, 0x83, 0x33, 0xf8, 0x5a, 0x93, 0x80, 0xe1, 0x72, 0x11, 0xf6, 0xee, 0x3d, 0x1d, 0xc7, 0xdc, 0x8f, 0x0e, 0x7c, 0x5d, 0x67, 0xb7, 0x30, 0x76, 0xc3, 0xea, 0xfc, 0x26, 0xb9, 0x3b, 0xb2, 0x48, 0xc4, 0x06, 0xce, 0xba, 0x5c, 0xb4, 0xa9, 0xbf, 0xc9, 0x39, 0xf0, 0xa2, 0x38, 0xe1, 0x55, 0x9d, 0x0f, 0x4d, 0x84, 0xf8, 0x7e, 0xb8, 0x59, 0x75, 0x56, 0x80, 0x50, 0xec, 0x1f, 0xe1, 0x3d, 0x33, 0x65, 0x03, 0x3d, 0x40, 0x52, 0x37, 0xec, 0x92, 0x82, 0x7d, 0xd8, 0xcd, 0x12, 0x4b, 0x36, 0xa4, 0xfa, 0x89, 0xd4, 0xfb, 0x9d, 0xe0, 0x4f, 0x4d, 0x9f, 0x34, 0x86, 0x4c, 0xf7, 0x6f, 0x4e, 0xc8, 0x45, 0x81, 0x68, 0xd2, 0x65, 0xa5, 0xb0, 0x21, 0x44, 0xe5, 0x96, 0xb5, 0xf2, 0xe0, 0xd2, 0xb9, 0xf9, 0xcb, 0x54, 0xae, 0xee, 0xb6, 0x7a ],
+const [ 0xe4, 0x63, 0x62, 0x65, 0x06, 0x14, 0x4c, 0xec, 0xe5, 0x5d, 0xfb, 0x7a, 0xa2, 0x2e, 0xb2, 0x1e, 0xa3, 0xa4, 0x27, 0x7d, 0x89, 0x2c, 0x21, 0x17, 0x62, 0xea, 0x45, 0xcc, 0x20, 0x5c, 0x2d, 0x9e, 0x4b, 0x3a, 0xbb, 0xb8, 0xf2, 0xa1, 0xad, 0xb0, 0xe7, 0x71, 0x71, 0x09, 0x2c, 0xf4, 0x3a, 0xfc, 0xa8, 0xc0, 0x53, 0x77, 0x1e, 0xde, 0xb4, 0x67, 0x60, 0x2b, 0xd3, 0x33, 0xc0, 0xff, 0xbc, 0x88, 0xc8, 0x0d, 0x64, 0x5c, 0x2b, 0x8a, 0x3a, 0x2d, 0xfa, 0x92, 0x00, 0x8a, 0x1b, 0xc7, 0xd9, 0xd5, 0xf8, 0x3b, 0xa3, 0x47, 0x74, 0x90, 0x86, 0x34, 0x23, 0x5d, 0xcd, 0x91, 0xba, 0xd4, 0xf5, 0xb3, 0xc4, 0xa2, 0x04, 0x59, 0x97, 0x17, 0x1d, 0xed, 0x87, 0x87, 0x50, 0x07, 0x59, 0xf0, 0xb6, 0x33, 0xfb, 0xdc, 0xbe, 0xf4, 0x72, 0x89, 0xc2, 0x09, 0x13, 0x48, 0xde, 0xee, 0xf6, 0x23, 0x01, 0xa6 ],
+const [ 0x6c, 0xd7, 0x00, 0x39, 0xa7, 0x7e, 0x42, 0x0d, 0x99, 0x9b, 0x57, 0xca, 0xae, 0xb5, 0x3a, 0xce, 0xdd, 0xba, 0xb1, 0x17, 0x39, 0x44, 0x7f, 0xaa, 0xc3, 0x1a, 0xdb, 0x35, 0x83, 0xfa, 0x22, 0xf3, 0xd7, 0x96, 0xc9, 0xd0, 0x0a, 0xdc, 0x95, 0xce, 0x28, 0x7a, 0x0e, 0xa7, 0x11, 0xa2, 0x31, 0xb4, 0xcd, 0x0a, 0x65, 0x0d, 0x1f, 0x38, 0xb0, 0xf2, 0x5d, 0xfc, 0x2b, 0x69, 0x7e, 0x3e, 0xb3, 0x29, 0x75, 0xf9, 0xe2, 0xb7, 0xbe, 0x88, 0x3d, 0xcf, 0x36, 0x21, 0xaf, 0x05, 0x2f, 0x9f, 0x37, 0xac, 0xc4, 0x84, 0xdd, 0xf7, 0x6a, 0x3e, 0xea, 0x5e, 0xc8, 0xa9, 0x58, 0x43, 0xc9, 0xd6, 0x88, 0xd6, 0xef, 0x0b, 0x33, 0x36, 0xea, 0x0a, 0xa3, 0xd9, 0x69, 0x96, 0x23, 0x2d, 0x30, 0x34, 0xb4, 0x7f, 0x6a, 0x2f, 0x01, 0x1d, 0x41, 0xde, 0x95, 0xb7, 0xad, 0x29, 0x4c, 0x0b, 0x89, 0x4a, 0x07, 0xc2 ],
+const [ 0x8a, 0x2d, 0xb9, 0x6a, 0x4d, 0xf1, 0x88, 0xec, 0x32, 0x3e, 0xf6, 0xea, 0xa7, 0xd5, 0x8b, 0x56, 0x21, 0x6b, 0x00, 0x97, 0xbe, 0xb5, 0x01, 0x39, 0x29, 0xc2, 0x31, 0xe3, 0xbe, 0x8d, 0x6f, 0x89, 0xee, 0xd3, 0x58, 0xe2, 0xe5, 0x22, 0x0c, 0x1d, 0x6b, 0x33, 0x35, 0xd0, 0x08, 0x79, 0x46, 0x31, 0x6c, 0xfa, 0x01, 0x88, 0x0d, 0x5e, 0x3c, 0xe4, 0x12, 0x45, 0xe4, 0x0d, 0x70, 0xde, 0x42, 0xbb, 0x53, 0xb6, 0x7d, 0x05, 0xbf, 0xcd, 0x61, 0x1c, 0x77, 0xef, 0x5e, 0x39, 0x1e, 0x41, 0xd4, 0xd4, 0x9c, 0x1b, 0x8e, 0x17, 0xc3, 0x15, 0x8c, 0x92, 0x33, 0x65, 0x05, 0x30, 0x7a, 0x68, 0xac, 0x6a, 0x80, 0x7e, 0x33, 0xba, 0x23, 0x1b, 0x0d, 0x53, 0x1e, 0x1b, 0x79, 0x0f, 0x2f, 0x56, 0xbc, 0xa9, 0x79, 0x75, 0xad, 0x2c, 0x27, 0x04, 0x77, 0xab, 0x52, 0xc8, 0x9b, 0x33, 0x24, 0x52, 0x34, 0xfe ],
+const [ 0x1e, 0x69, 0x13, 0x65, 0xad, 0x90, 0x64, 0x60, 0x31, 0xe0, 0x1e, 0x73, 0x7c, 0xb3, 0xc6, 0x5a, 0x66, 0x54, 0x09, 0x62, 0x1d, 0x05, 0xad, 0x86, 0xbd, 0x47, 0xc9, 0xd7, 0x21, 0x55, 0x31, 0x21, 0xf8, 0xf2, 0x35, 0xcb, 0x1b, 0x64, 0x8b, 0xff, 0x1e, 0xc1, 0x89, 0x0b, 0x24, 0x69, 0x97, 0x07, 0xf8, 0xd4, 0xe5, 0xb8, 0x5a, 0x8e, 0x59, 0xb5, 0x97, 0x7f, 0xcc, 0xc8, 0x5d, 0x70, 0x75, 0x97, 0xcc, 0xcb, 0xa5, 0x84, 0xd0, 0xa2, 0xb5, 0xd1, 0xaf, 0xf3, 0x3d, 0x08, 0xde, 0x2b, 0x87, 0x9a, 0x19, 0xe8, 0x44, 0xc6, 0xb2, 0x03, 0x7d, 0xbc, 0x2a, 0xce, 0xcc, 0x03, 0xfe, 0x9a, 0xcb, 0x18, 0xc3, 0x7d, 0xcd, 0x58, 0x75, 0x52, 0xcc, 0x1f, 0x0d, 0x00, 0xa3, 0x32, 0x51, 0x00, 0x7d, 0x5a, 0xf0, 0x19, 0x8e, 0x52, 0xce, 0x6e, 0x01, 0xe3, 0x9d, 0xbb, 0x31, 0x4e, 0xad, 0xdc, 0x1b, 0xea ],
+const [ 0x21, 0x2a, 0x04, 0x48, 0xf4, 0xb3, 0x9f, 0x0d, 0x22, 0xf9, 0xa0, 0xd5, 0xa4, 0x20, 0x66, 0x16, 0x70, 0x56, 0x36, 0x8b, 0x9c, 0x66, 0x82, 0x72, 0xc7, 0x8a, 0x6b, 0xf8, 0xb5, 0x81, 0x84, 0xf2, 0x39, 0xe2, 0xd9, 0xcd, 0x58, 0xb0, 0x30, 0xc8, 0xab, 0x2e, 0x8e, 0x60, 0x05, 0xf5, 0xfd, 0x0c, 0x56, 0x43, 0x8d, 0x2b, 0xcf, 0x96, 0x99, 0x3b, 0x47, 0x7a, 0x4b, 0x4b, 0xde, 0x9f, 0x62, 0xb3, 0xe0, 0x2e, 0x33, 0x02, 0xec, 0x5d, 0xee, 0x38, 0x55, 0x42, 0x23, 0x36, 0xc8, 0xe4, 0x85, 0x72, 0x2f, 0x98, 0xed, 0xef, 0xd6, 0x8b, 0xa2, 0x6d, 0xcc, 0x9b, 0xd7, 0xdd, 0x8d, 0x6b, 0x75, 0x17, 0xdd, 0xb6, 0x1b, 0xcf, 0xf7, 0xe3, 0x63, 0xc5, 0xe7, 0xda, 0x68, 0x3d, 0x35, 0x17, 0x85, 0xaf, 0xc3, 0xfc, 0x5f, 0xbf, 0xf8, 0x6c, 0x25, 0x6f, 0x1e, 0x95, 0x16, 0x94, 0x09, 0x0d, 0x44, 0x87 ],
+const [ 0x2d, 0x93, 0x13, 0x69, 0x18, 0x68, 0x16, 0x1f, 0xf6, 0x09, 0xb6, 0xf0, 0xb0, 0x94, 0x31, 0x71, 0x98, 0xdd, 0x94, 0xcb, 0x41, 0xfb, 0x2e, 0x62, 0x93, 0x07, 0x44, 0xb4, 0x1e, 0x20, 0x06, 0x83, 0xaf, 0xb2, 0xc2, 0x36, 0x21, 0xf8, 0x58, 0x7d, 0x76, 0xc0, 0xee, 0x34, 0x27, 0x6f, 0xe4, 0x8a, 0xb7, 0x44, 0x0a, 0x62, 0x8e, 0xe1, 0x11, 0xf9, 0x05, 0x07, 0x40, 0xc9, 0xbe, 0xa1, 0x68, 0xae, 0x36, 0x04, 0x1a, 0x48, 0x9d, 0x75, 0x17, 0xa0, 0xe5, 0xeb, 0x08, 0x0e, 0x19, 0x17, 0x70, 0x5a, 0xf0, 0xa2, 0xde, 0x21, 0xa2, 0xb6, 0x67, 0x7a, 0xfa, 0xbf, 0x53, 0xda, 0xac, 0x73, 0x17, 0x35, 0xea, 0x10, 0x84, 0x66, 0x32, 0xe4, 0x3d, 0xd1, 0x6a, 0x13, 0x6e, 0x47, 0x2e, 0x95, 0xbb, 0x2a, 0x69, 0x7e, 0x77, 0xd1, 0x22, 0x82, 0x17, 0x2d, 0x99, 0xb8, 0xe6, 0xad, 0x93, 0x9e, 0xfa, 0x60 ],
+const [ 0x81, 0xc9, 0x4b, 0xe4, 0x26, 0xea, 0xf0, 0x18, 0x64, 0xe8, 0x13, 0xa0, 0x3e, 0x46, 0x74, 0x49, 0x1b, 0x61, 0x51, 0x6b, 0xc9, 0x5d, 0x8a, 0x77, 0xc1, 0x5f, 0x03, 0xd0, 0xad, 0xfc, 0x4a, 0xdc, 0x27, 0xf2, 0x7a, 0x5a, 0xc4, 0x16, 0x5f, 0xf6, 0x51, 0x8e, 0xda, 0x1a, 0x5c, 0x40, 0x87, 0x08, 0xf7, 0x8a, 0x9e, 0x26, 0xb8, 0x34, 0x17, 0x98, 0x04, 0xa3, 0x12, 0x14, 0x8d, 0x4f, 0x75, 0xf2, 0x1a, 0x77, 0xd7, 0x83, 0x87, 0x13, 0x9d, 0xa4, 0x0c, 0x0a, 0x62, 0x93, 0xc2, 0xa5, 0x9d, 0x01, 0x62, 0x43, 0x7d, 0x68, 0x50, 0x4f, 0x18, 0x9e, 0xd9, 0x70, 0xc5, 0xab, 0xb9, 0xff, 0xc6, 0xd8, 0xe1, 0xbe, 0x2b, 0x08, 0x77, 0xc7, 0xf2, 0x4b, 0x1d, 0xc2, 0x73, 0xb1, 0x76, 0x5b, 0xfc, 0x5c, 0xe6, 0xf4, 0xb8, 0xd9, 0x9a, 0x96, 0xd5, 0xb1, 0xc9, 0x2e, 0xe5, 0x3a, 0x39, 0xf6, 0x85, 0xb3 ],
+const [ 0xb3, 0x4e, 0x5b, 0x08, 0x32, 0x12, 0x8d, 0x3a, 0x87, 0x94, 0xc2, 0xab, 0x44, 0x71, 0x32, 0x85, 0x7a, 0xc0, 0xa8, 0x34, 0x75, 0xf6, 0xd9, 0x6e, 0xa6, 0x07, 0xf4, 0x70, 0xe1, 0xce, 0x7a, 0x8b, 0xc9, 0xaf, 0x50, 0xe0, 0x88, 0x7b, 0x13, 0x68, 0xc3, 0x93, 0xab, 0x37, 0xcc, 0x51, 0x23, 0x01, 0x1a, 0xa3, 0xb7, 0xdd, 0xf7, 0xf9, 0x2f, 0x49, 0x79, 0x62, 0x6c, 0x6e, 0xb3, 0xf1, 0x41, 0xa6, 0x2c, 0x66, 0x84, 0x3c, 0x91, 0x0a, 0x64, 0x73, 0xa6, 0xdb, 0xfc, 0xc9, 0x82, 0xe9, 0x29, 0x7c, 0xfc, 0x00, 0x99, 0x4e, 0x61, 0x87, 0x25, 0x85, 0x68, 0xa8, 0x61, 0x37, 0x67, 0xb2, 0x71, 0xc4, 0xc6, 0xbb, 0x1e, 0xa4, 0xb4, 0x89, 0x29, 0x63, 0x1a, 0xb3, 0xde, 0xe9, 0xcd, 0x03, 0xed, 0xff, 0x08, 0x1f, 0x76, 0x0f, 0x19, 0x68, 0x63, 0x2b, 0x5a, 0x23, 0xfa, 0x51, 0x63, 0xd7, 0xb2, 0xee ],
+const [ 0xf1, 0x84, 0xd3, 0x80, 0x9b, 0x13, 0xc4, 0x17, 0xe0, 0x6c, 0x7e, 0xd5, 0x1d, 0x89, 0xe7, 0x9c, 0x02, 0x6f, 0xbf, 0xbb, 0xf1, 0x02, 0x26, 0x62, 0xa6, 0x1d, 0x5e, 0x5a, 0x1d, 0xe2, 0xd3, 0xf2, 0xb0, 0x4f, 0x58, 0x3d, 0x81, 0x12, 0xb4, 0x7a, 0x17, 0x9f, 0x5d, 0xd4, 0x4c, 0x7f, 0x83, 0x4c, 0x66, 0xeb, 0x50, 0xf3, 0x84, 0x99, 0x6f, 0x5c, 0x3c, 0xd6, 0xcb, 0x51, 0x82, 0xd5, 0x99, 0xc5, 0xcb, 0x47, 0x98, 0x0a, 0x73, 0x2b, 0x97, 0x44, 0x5c, 0xe8, 0x39, 0x1e, 0xd9, 0x99, 0xf5, 0xbb, 0xca, 0xa8, 0x60, 0xf0, 0x08, 0x9e, 0xaf, 0xb0, 0x03, 0x39, 0x77, 0xc7, 0xa9, 0xc0, 0xb8, 0xcb, 0x8a, 0x93, 0x1a, 0x50, 0x3a, 0x06, 0x76, 0x5c, 0xf7, 0x6f, 0x98, 0x1b, 0x8c, 0x7e, 0x44, 0xd3, 0x75, 0xcd, 0x76, 0x19, 0x44, 0xb8, 0xee, 0x46, 0x44, 0x6f, 0xec, 0x25, 0x5b, 0x49, 0x39, 0xee ],
+const [ 0xbc, 0x74, 0x04, 0x1e, 0xa2, 0x0c, 0x9b, 0x74, 0x89, 0xdc, 0xe3, 0xba, 0x9e, 0x27, 0x9c, 0x00, 0xc1, 0x24, 0xb6, 0xbf, 0x94, 0xb9, 0x0c, 0xbf, 0xd2, 0x86, 0x4f, 0x37, 0xe3, 0x25, 0x40, 0x37, 0xad, 0xb0, 0x23, 0x43, 0xac, 0x84, 0x70, 0x40, 0x45, 0x45, 0xcb, 0x95, 0x57, 0x23, 0x36, 0x8a, 0x14, 0x5b, 0x86, 0xf3, 0x0f, 0x00, 0x13, 0x13, 0x95, 0xfb, 0xb4, 0xbb, 0x41, 0x51, 0xeb, 0xb2, 0xcb, 0xa4, 0x5c, 0x59, 0x21, 0xfd, 0x84, 0x8f, 0xb9, 0xc8, 0xa7, 0xd3, 0x25, 0x20, 0x0a, 0xa8, 0xe8, 0x4d, 0x63, 0x3e, 0x88, 0x8b, 0x8e, 0x4e, 0xe4, 0x0d, 0x81, 0x46, 0xc8, 0x42, 0x82, 0xa6, 0xbf, 0x57, 0x98, 0xaa, 0x28, 0xfd, 0x3f, 0x29, 0x8c, 0x6c, 0x5f, 0xbd, 0x2f, 0xa8, 0x7f, 0x24, 0xe5, 0x03, 0x36, 0xe6, 0x27, 0xe3, 0xe3, 0x38, 0x66, 0xc5, 0x9e, 0x21, 0x9f, 0x82, 0x6f, 0xdb ],
+const [ 0x2f, 0x42, 0xa2, 0xad, 0x39, 0xf8, 0x42, 0xc3, 0x55, 0xd4, 0x66, 0x70, 0x45, 0x58, 0x17, 0xe6, 0x89, 0xdd, 0xd9, 0xe7, 0xe8, 0xd8, 0xe1, 0x2b, 0x4d, 0x5b, 0x83, 0x02, 0xd4, 0xdf, 0xea, 0x3a, 0x25, 0x40, 0x0b, 0x43, 0x01, 0x09, 0xdb, 0x91, 0x1a, 0xf2, 0xc0, 0x42, 0x28, 0xa7, 0x46, 0x01, 0x39, 0xcb, 0x14, 0x2a, 0x48, 0x3d, 0x1e, 0x2e, 0x12, 0x9a, 0x1c, 0x3a, 0x25, 0x03, 0x3a, 0x13, 0x3a, 0x20, 0x11, 0x45, 0xc4, 0x64, 0xd6, 0x7c, 0xc9, 0x93, 0xd1, 0x32, 0xf1, 0x82, 0x11, 0x8a, 0xdd, 0x1f, 0x5f, 0x7c, 0xb9, 0xb0, 0x70, 0x33, 0x15, 0x60, 0x5f, 0xb3, 0xf0, 0xf7, 0x5a, 0xbf, 0x16, 0xe9, 0x9b, 0xfa, 0xad, 0x92, 0x99, 0x4c, 0x0a, 0xc0, 0x80, 0x87, 0xc9, 0x72, 0xdf, 0x4b, 0x1c, 0xdf, 0xa1, 0x27, 0x63, 0xba, 0x3f, 0x00, 0xfd, 0xb5, 0x34, 0xb7, 0x5e, 0x44, 0xb0, 0x06 ],
+const [ 0xee, 0xb9, 0x55, 0xb9, 0x59, 0xc4, 0x8f, 0x35, 0x9e, 0x05, 0xda, 0x6f, 0xe4, 0x99, 0x2c, 0x90, 0x7c, 0x1c, 0x01, 0x34, 0x67, 0x1c, 0x00, 0x78, 0x18, 0xce, 0xdb, 0x54, 0x7a, 0x00, 0x77, 0x2c, 0x35, 0x4f, 0x4d, 0xa1, 0x2e, 0x9a, 0x10, 0xad, 0x4c, 0xb7, 0x8f, 0xef, 0x82, 0x64, 0xde, 0x43, 0x0a, 0x80, 0xb0, 0x96, 0xee, 0x7b, 0x08, 0xf9, 0xcd, 0x0b, 0x11, 0xf3, 0xdc, 0x20, 0x49, 0x1c, 0x2b, 0x1b, 0xe5, 0xe7, 0x2a, 0x3a, 0x72, 0xc0, 0x6b, 0x57, 0xb8, 0x57, 0xa9, 0xd3, 0xe3, 0x3b, 0x0a, 0xcd, 0xe5, 0xaa, 0xa1, 0x97, 0x16, 0xa8, 0x37, 0x6a, 0x1d, 0x4e, 0x4b, 0x58, 0x14, 0x65, 0x57, 0x83, 0xe7, 0x33, 0x55, 0x8d, 0xfd, 0x95, 0x82, 0x4f, 0x1b, 0x4e, 0x62, 0xce, 0x85, 0x9f, 0x04, 0x6a, 0x66, 0x18, 0x87, 0x59, 0x71, 0xad, 0xdd, 0x54, 0xc9, 0x0c, 0xcf, 0x90, 0x1e, 0x2e ],
+const [ 0x15, 0x52, 0xdf, 0x9b, 0xae, 0x4f, 0xc9, 0x79, 0x85, 0xbc, 0xf7, 0xd5, 0xfa, 0x01, 0x79, 0x93, 0x32, 0x42, 0x3b, 0xff, 0x19, 0x4a, 0x2a, 0x61, 0xa7, 0xc2, 0x98, 0xd2, 0x63, 0xa7, 0xe2, 0x4d, 0x26, 0xfb, 0x50, 0x09, 0x22, 0xba, 0x3c, 0x06, 0x22, 0x0f, 0x77, 0xe6, 0x13, 0xc8, 0xe8, 0xff, 0xc4, 0x08, 0x76, 0xae, 0xea, 0x3b, 0x29, 0xee, 0x67, 0x4f, 0x8b, 0x29, 0xcc, 0x22, 0x55, 0x4e, 0x1c, 0x36, 0x47, 0x23, 0xd3, 0xac, 0x58, 0xdd, 0x26, 0x70, 0x0f, 0xee, 0x8d, 0xb1, 0x31, 0x1e, 0x7f, 0x94, 0x9c, 0xdd, 0x7c, 0x29, 0x73, 0xd7, 0x51, 0x9e, 0x7b, 0xca, 0x98, 0xb2, 0xc5, 0x94, 0x7e, 0x6d, 0x8e, 0x91, 0xc9, 0x0e, 0x63, 0x23, 0x19, 0x46, 0x89, 0x92, 0x6d, 0xa3, 0x9b, 0x17, 0xea, 0x4f, 0x75, 0x33, 0xd8, 0xfa, 0x51, 0x45, 0xee, 0x15, 0x30, 0x5c, 0xcf, 0x41, 0x7c, 0x4a ],
+const [ 0x4d, 0x44, 0x81, 0x93, 0x6f, 0x52, 0x30, 0x35, 0xb9, 0x21, 0x00, 0x51, 0x01, 0xba, 0x20, 0x6b, 0x85, 0xf5, 0x5e, 0x27, 0x2e, 0xa4, 0x90, 0x16, 0x16, 0x0e, 0x32, 0xd0, 0x47, 0x9f, 0x50, 0x43, 0xc6, 0xdd, 0xa7, 0x4a, 0xd0, 0x9e, 0x07, 0x82, 0x63, 0x78, 0xfb, 0x59, 0x00, 0x7a, 0xac, 0x67, 0xb0, 0x19, 0x03, 0x02, 0x45, 0x6d, 0x0e, 0x0c, 0xe2, 0x9e, 0xa5, 0x10, 0xbd, 0x99, 0x4d, 0x8d, 0x24, 0x07, 0x5c, 0x92, 0xbe, 0x7f, 0x5e, 0x8b, 0x14, 0xfa, 0xb8, 0x5b, 0x4f, 0x88, 0x8b, 0xab, 0x43, 0x42, 0xdb, 0x81, 0xad, 0x80, 0xf1, 0x14, 0xb9, 0x4c, 0xfd, 0xdf, 0xc8, 0x16, 0x00, 0xf4, 0x6f, 0xa9, 0xe9, 0x93, 0xc3, 0x5d, 0xfe, 0xfb, 0xd4, 0x8e, 0x7e, 0x80, 0x77, 0x4e, 0x85, 0xde, 0x49, 0x57, 0x2f, 0xcd, 0xf0, 0x43, 0x00, 0xd5, 0xa4, 0x00, 0x84, 0x64, 0xef, 0x7e, 0x32, 0x1e ],
+const [ 0x7c, 0x88, 0x1d, 0xe0, 0x03, 0x88, 0xa0, 0x0f, 0x8c, 0xee, 0xa8, 0x87, 0xb8, 0xe8, 0x7e, 0xf7, 0xce, 0xb2, 0x3e, 0xa0, 0x5d, 0xad, 0x95, 0x06, 0x23, 0xb0, 0xca, 0xeb, 0x2e, 0xa2, 0xfb, 0x7d, 0x41, 0x49, 0xaa, 0xcf, 0x79, 0x5d, 0x78, 0x86, 0x30, 0xe1, 0x2f, 0xd5, 0x22, 0xb3, 0x06, 0xab, 0xce, 0x61, 0x21, 0x2a, 0x20, 0x3e, 0x58, 0x5c, 0x4c, 0xb5, 0x39, 0x21, 0xfd, 0xde, 0x50, 0x6c, 0xaf, 0x4f, 0xa6, 0xaf, 0x59, 0x35, 0x87, 0x94, 0x50, 0xa3, 0x88, 0xee, 0x68, 0x29, 0xc9, 0xef, 0x5c, 0xa9, 0x78, 0x9b, 0x70, 0x66, 0x96, 0x7c, 0x54, 0x5e, 0xfe, 0x98, 0x4c, 0xda, 0xa3, 0xa0, 0x8e, 0x43, 0x19, 0x6a, 0xeb, 0x37, 0x57, 0xa1, 0xb2, 0xdc, 0xbb, 0xbc, 0xd2, 0x74, 0x4e, 0x2c, 0x3e, 0x32, 0x4a, 0xda, 0x96, 0x4c, 0xd9, 0xd0, 0x03, 0x52, 0x20, 0x36, 0x63, 0xbe, 0x7c, 0x81 ],
+const [ 0x83, 0x7d, 0xc1, 0x90, 0xbf, 0x0a, 0x96, 0xd9, 0xc7, 0x87, 0x9d, 0x8d, 0x99, 0x8c, 0x5c, 0x21, 0xa2, 0x63, 0x47, 0x51, 0x80, 0xbc, 0x9c, 0x70, 0x0c, 0xa2, 0x8c, 0xfc, 0x98, 0xae, 0x9b, 0x75, 0x75, 0x7b, 0x49, 0x6f, 0xb9, 0x59, 0xf2, 0xe7, 0x3e, 0x46, 0xf3, 0xd3, 0xee, 0x1a, 0x0e, 0xfc, 0x3e, 0x01, 0x10, 0x10, 0xf9, 0x2e, 0xb0, 0xf3, 0x3f, 0xce, 0xbb, 0x57, 0xcd, 0x3b, 0x6e, 0x8c, 0x7f, 0x73, 0x23, 0x99, 0x12, 0xc8, 0x31, 0x8b, 0x2f, 0xd9, 0x0d, 0x0d, 0xa5, 0xc0, 0xb5, 0x39, 0xf7, 0x8d, 0x4e, 0xae, 0x16, 0xf4, 0x0b, 0xe3, 0x6f, 0x42, 0x52, 0xbb, 0x28, 0x95, 0x1a, 0x59, 0xa7, 0x4d, 0x98, 0x35, 0x55, 0xbe, 0x1a, 0x6f, 0xa1, 0x27, 0x33, 0x64, 0x47, 0xe8, 0x18, 0x80, 0xd2, 0xef, 0x4a, 0x53, 0x5f, 0x74, 0x75, 0xe6, 0xa5, 0xe6, 0x98, 0x4f, 0x32, 0x25, 0x67, 0x83 ],
+const [ 0xd6, 0x08, 0x12, 0x43, 0x30, 0x98, 0xc4, 0x46, 0x23, 0x15, 0x91, 0x53, 0xde, 0x7c, 0xd2, 0x72, 0x1b, 0x34, 0x9f, 0x68, 0x5c, 0x43, 0x38, 0x8a, 0x74, 0xc2, 0xa3, 0xd0, 0x4a, 0x8e, 0x97, 0x2a, 0xda, 0x41, 0x99, 0x17, 0x7c, 0x61, 0x65, 0x73, 0x69, 0xd7, 0x8f, 0x90, 0x7b, 0xa2, 0x6a, 0x89, 0x34, 0xcc, 0x29, 0xd3, 0x02, 0x9d, 0x44, 0x15, 0xc1, 0x10, 0x1e, 0x3a, 0x82, 0x83, 0xe4, 0xc4, 0x8b, 0xb2, 0xb8, 0x63, 0x9f, 0xe6, 0x0f, 0xc6, 0x7f, 0x6a, 0x57, 0xb1, 0xb0, 0x3f, 0xde, 0x50, 0x7f, 0x10, 0xef, 0xcb, 0x43, 0x68, 0x3e, 0x1a, 0xe2, 0x23, 0x85, 0x1b, 0x96, 0x23, 0x70, 0xe1, 0xf1, 0x44, 0xb7, 0x4f, 0x1f, 0x91, 0x89, 0xe6, 0x6c, 0xb8, 0x31, 0xdc, 0x05, 0xbb, 0xf4, 0x6e, 0x03, 0xe9, 0x38, 0x77, 0xa5, 0x0d, 0xec, 0x40, 0xdd, 0xe5, 0x23, 0x9a, 0x0f, 0xd5, 0x02, 0x2a ],
+const [ 0xa1, 0x6b, 0x3f, 0xdc, 0xaa, 0x7e, 0xb6, 0xa2, 0x13, 0x51, 0x59, 0xaa, 0x69, 0x48, 0xc6, 0xa8, 0xdc, 0xe7, 0x47, 0x51, 0x9f, 0x9f, 0x54, 0xcb, 0x92, 0xe7, 0x59, 0x62, 0x1f, 0x8f, 0xb9, 0x7c, 0x61, 0x51, 0x12, 0xcf, 0x8c, 0xaa, 0xc3, 0xd1, 0x89, 0xe8, 0xab, 0x70, 0xe0, 0x83, 0x34, 0x04, 0xdb, 0xb0, 0x90, 0x82, 0xe9, 0x34, 0x43, 0xf2, 0x40, 0x76, 0xe2, 0x23, 0xc6, 0xd9, 0x1a, 0x9d, 0x32, 0x48, 0xf3, 0xd7, 0x6e, 0x13, 0x56, 0xaa, 0x40, 0xf9, 0xce, 0x06, 0x2a, 0x86, 0x8b, 0xe4, 0x8f, 0x9f, 0xac, 0x7b, 0x16, 0x5b, 0xbe, 0xb7, 0x54, 0x14, 0x7f, 0xe7, 0xa5, 0xbe, 0xe8, 0xb6, 0x5a, 0x78, 0x6b, 0x5c, 0x1a, 0x61, 0x7a, 0x15, 0x82, 0xad, 0x48, 0xd2, 0x0f, 0xf8, 0xd3, 0x2f, 0x3e, 0xd9, 0x22, 0xa6, 0xf1, 0xbb, 0xcb, 0x02, 0x15, 0xe8, 0xb9, 0x16, 0x82, 0xe7, 0x2c, 0xae ],
+const [ 0x04, 0xe4, 0x79, 0x8b, 0x90, 0xbe, 0xae, 0xe2, 0xec, 0xca, 0x6a, 0x4c, 0x14, 0x63, 0xad, 0x9c, 0x1f, 0x96, 0x61, 0xe0, 0x71, 0x83, 0x32, 0xe7, 0x31, 0x05, 0x9f, 0x00, 0xfe, 0x95, 0x51, 0x05, 0xdd, 0x6b, 0xac, 0x98, 0x76, 0xe7, 0xa5, 0xad, 0x81, 0x30, 0xd3, 0x49, 0x7b, 0x1b, 0xc8, 0x88, 0x9d, 0x4e, 0xa1, 0xe5, 0x0e, 0xa5, 0xdc, 0xb6, 0x58, 0xd4, 0x6a, 0xf6, 0x19, 0x4e, 0x05, 0x47, 0xfb, 0x66, 0xc4, 0x37, 0xe5, 0xb4, 0xed, 0xc3, 0x73, 0xbb, 0x0a, 0x1a, 0xa4, 0xc8, 0x3f, 0xa3, 0xd3, 0x1d, 0xda, 0x40, 0xe9, 0x4f, 0x2c, 0xd5, 0xd0, 0xed, 0x98, 0x04, 0x2b, 0x62, 0xe9, 0x3b, 0x44, 0x1d, 0xe8, 0xf1, 0x45, 0xef, 0x2f, 0x2c, 0xac, 0xb4, 0x38, 0x47, 0xf9, 0x35, 0xb9, 0xf2, 0xa9, 0x4d, 0x34, 0x7a, 0x68, 0x4b, 0xc9, 0x4b, 0x83, 0x98, 0x50, 0xb3, 0x9c, 0x9a, 0xa4, 0xe8 ],
+const [ 0x2d, 0x20, 0x11, 0x94, 0xf7, 0x3a, 0x9c, 0xa6, 0xe4, 0x48, 0x34, 0xd8, 0xa4, 0x4a, 0xa9, 0x48, 0x28, 0x7d, 0x15, 0x36, 0x06, 0x2c, 0x64, 0x70, 0x20, 0xc9, 0x14, 0x0d, 0x81, 0x3c, 0x3a, 0x5e, 0x87, 0x7b, 0xc6, 0x22, 0x47, 0x5b, 0x07, 0xf9, 0x2d, 0xa6, 0x72, 0x1c, 0xe3, 0x6d, 0x9f, 0x4a, 0x74, 0x9f, 0x94, 0x06, 0xb2, 0xdb, 0x46, 0xff, 0xd5, 0x83, 0x5d, 0xd0, 0x64, 0x12, 0x38, 0xe9, 0x59, 0xaf, 0x31, 0xcd, 0x80, 0x02, 0x22, 0x7f, 0x20, 0x46, 0x28, 0x36, 0xdd, 0x9f, 0xa6, 0x58, 0xdd, 0xae, 0x8d, 0xa6, 0x2a, 0x63, 0xdb, 0xb4, 0x57, 0x13, 0x62, 0x9d, 0x67, 0xcb, 0xcb, 0xf4, 0xea, 0xe3, 0xda, 0xfe, 0x69, 0xd6, 0xf4, 0x1e, 0x04, 0x51, 0xde, 0x90, 0x5a, 0x89, 0xc7, 0x5a, 0xa9, 0xd2, 0x89, 0x80, 0x36, 0x6e, 0x2c, 0x78, 0xf0, 0xa2, 0xab, 0xdd, 0x50, 0x0f, 0xfb, 0x68 ],
+const [ 0x1b, 0x3b, 0x01, 0x2e, 0x5a, 0x31, 0x47, 0x20, 0x73, 0x50, 0xe9, 0x81, 0xc0, 0x5f, 0x20, 0xf2, 0x68, 0xb4, 0x79, 0x20, 0x78, 0xf9, 0x86, 0xa2, 0x36, 0x30, 0xd3, 0x25, 0xb2, 0xf5, 0x1b, 0xc6, 0x9d, 0x03, 0xbc, 0xbf, 0x5e, 0xfa, 0x69, 0x46, 0x63, 0x60, 0x1f, 0xb2, 0xb5, 0xe5, 0x5a, 0xe0, 0xd0, 0xeb, 0x88, 0xd5, 0xb1, 0x45, 0xbe, 0xa4, 0x30, 0x3f, 0xaa, 0x92, 0x90, 0xdf, 0xc9, 0x79, 0x55, 0x6b, 0xd9, 0x6a, 0x55, 0x2b, 0x92, 0x96, 0x12, 0x70, 0x91, 0x6f, 0x47, 0xd6, 0x95, 0x0a, 0xc1, 0xc5, 0xed, 0xc8, 0x70, 0x3e, 0x31, 0x35, 0xbe, 0xd4, 0x31, 0x30, 0x1f, 0xf8, 0x2b, 0x4d, 0xea, 0x7a, 0x41, 0x77, 0x67, 0x4d, 0x29, 0xda, 0x29, 0x8b, 0x27, 0x00, 0x9e, 0xb8, 0x38, 0x39, 0xe4, 0x4b, 0x90, 0x41, 0xde, 0x6a, 0x47, 0x1d, 0x88, 0xf6, 0x50, 0x46, 0x87, 0xc7, 0xaa, 0x09 ],
+const [ 0xf8, 0x0c, 0x55, 0xde, 0x4b, 0x5a, 0xd7, 0x4e, 0x4f, 0x8d, 0xc1, 0x4b, 0x6a, 0x45, 0xc0, 0x19, 0xe1, 0x82, 0x66, 0x54, 0xed, 0x66, 0xd9, 0xd5, 0x12, 0x3d, 0xcd, 0xda, 0xac, 0xba, 0xaf, 0x60, 0xcb, 0x83, 0x23, 0xd4, 0x40, 0xf1, 0xb1, 0xeb, 0xf8, 0x10, 0xbb, 0xcf, 0x89, 0xee, 0xb3, 0x7b, 0x0b, 0x12, 0x8b, 0x68, 0x29, 0x4a, 0x6c, 0x69, 0x77, 0xaa, 0xaa, 0xd3, 0x07, 0xd1, 0xf8, 0xe2, 0x37, 0x6e, 0xd8, 0x58, 0xcc, 0x03, 0x56, 0x67, 0x45, 0xe9, 0xf6, 0xd1, 0x69, 0x95, 0xeb, 0x4e, 0x23, 0x19, 0x89, 0x2e, 0x8f, 0xed, 0xfd, 0x3f, 0x55, 0xf0, 0x3c, 0xf1, 0x36, 0xaa, 0x39, 0xb8, 0xe4, 0xd4, 0x5b, 0xb2, 0x17, 0x1a, 0x2e, 0x8a, 0xdd, 0x1f, 0x59, 0x9c, 0x31, 0xc2, 0xd0, 0x5a, 0xd0, 0xa0, 0x4a, 0xee, 0x48, 0xd9, 0xf6, 0x21, 0x52, 0x18, 0x69, 0x7b, 0x61, 0xcd, 0xdb, 0xab ],
+const [ 0x9f, 0x65, 0xa4, 0x26, 0x10, 0x6d, 0xb9, 0x9d, 0xcb, 0x21, 0x30, 0xbe, 0x14, 0x83, 0x92, 0x41, 0xd4, 0xa9, 0x2c, 0x8b, 0xec, 0xc1, 0x08, 0xd2, 0xc9, 0x52, 0x1b, 0x82, 0x38, 0xc5, 0xc0, 0xdf, 0x7c, 0x23, 0x65, 0xec, 0x9f, 0x20, 0x84, 0x8c, 0x05, 0x59, 0xd6, 0xe8, 0x47, 0xda, 0xc3, 0x10, 0x3e, 0xe3, 0x1c, 0xe5, 0x5d, 0xec, 0x0c, 0x36, 0x44, 0xe6, 0x4c, 0x29, 0x93, 0xc4, 0x97, 0xdd, 0xfc, 0x3a, 0x5e, 0x4d, 0x9d, 0xc4, 0xbc, 0x78, 0x8c, 0xeb, 0xac, 0xbf, 0xb3, 0xc4, 0x7a, 0x8e, 0xde, 0xb9, 0x77, 0x3e, 0x12, 0x8b, 0xf1, 0x3a, 0x21, 0x98, 0x62, 0x61, 0x7b, 0x5a, 0xe8, 0xac, 0x47, 0x31, 0xf5, 0x11, 0xb2, 0x62, 0x48, 0xa7, 0x87, 0x5f, 0x1c, 0x0a, 0x01, 0x49, 0x9f, 0x01, 0xdd, 0xb3, 0xa5, 0x5e, 0xb2, 0xa9, 0x9e, 0x26, 0x85, 0xf0, 0xc5, 0xf2, 0x98, 0x90, 0x9b, 0x95 ],
+const [ 0x5f, 0x17, 0x29, 0x73, 0x85, 0x2b, 0x94, 0x7a, 0xd8, 0x40, 0x6f, 0xe0, 0x04, 0xde, 0x6e, 0x94, 0x12, 0x7c, 0x7f, 0xe2, 0xe9, 0xf3, 0x65, 0x8c, 0x14, 0x33, 0xa2, 0x1d, 0xc5, 0x35, 0x9b, 0x7a, 0x1a, 0x31, 0xf7, 0xba, 0xa0, 0x10, 0x48, 0x37, 0x16, 0x24, 0xed, 0xe5, 0x73, 0x17, 0x37, 0xe3, 0x2a, 0x21, 0xca, 0x50, 0xac, 0x7e, 0x46, 0x60, 0x2e, 0x20, 0x27, 0xaf, 0xad, 0xa1, 0xea, 0xd5, 0x30, 0x7b, 0x72, 0x3a, 0x4e, 0x7b, 0xa9, 0x2c, 0xef, 0x73, 0x6a, 0x2e, 0x57, 0x30, 0x9f, 0x93, 0x60, 0xab, 0xa6, 0x4c, 0x06, 0x83, 0xfa, 0xff, 0x29, 0xab, 0x0f, 0x59, 0x8f, 0x60, 0x7d, 0xa4, 0x29, 0x5f, 0x61, 0x9c, 0x97, 0x54, 0x00, 0x7e, 0xed, 0x95, 0xae, 0x63, 0xb8, 0x10, 0xef, 0xcc, 0x3c, 0x83, 0xdb, 0x7e, 0x00, 0xeb, 0xc7, 0x90, 0x8d, 0x3e, 0x21, 0xc2, 0x72, 0x5c, 0x9c, 0x10 ],
+const [ 0xe8, 0x4d, 0xc3, 0xe5, 0xa3, 0xe9, 0xc5, 0x9b, 0x8d, 0x4c, 0x80, 0xfe, 0xe2, 0x0b, 0x43, 0xf3, 0x88, 0xc9, 0x35, 0xd5, 0xfd, 0x5c, 0xe9, 0xb9, 0x8f, 0x2b, 0x32, 0xf7, 0xcb, 0xda, 0x39, 0xe6, 0x37, 0x2a, 0xcc, 0xe6, 0x44, 0x1a, 0xf9, 0xa4, 0x7e, 0x53, 0xdc, 0x99, 0x06, 0xc2, 0xb5, 0xd4, 0x42, 0x87, 0x3d, 0xfa, 0xd3, 0x0e, 0x3b, 0x8b, 0xc7, 0x7b, 0x52, 0x66, 0x10, 0x4c, 0x1d, 0x90, 0x35, 0x39, 0x7e, 0x31, 0x48, 0x5f, 0x32, 0xdf, 0x18, 0x9e, 0xa9, 0x1f, 0xa7, 0x40, 0x15, 0x29, 0xdf, 0xdb, 0xc2, 0xec, 0x80, 0x78, 0xa5, 0x52, 0x5d, 0xf4, 0x37, 0xc5, 0xc8, 0xa7, 0x84, 0xf2, 0x4b, 0x44, 0x7e, 0xcd, 0x99, 0x00, 0x98, 0xd5, 0xc3, 0xf7, 0x90, 0x99, 0xaf, 0xcb, 0x8c, 0x7b, 0xc7, 0x8e, 0x69, 0xb4, 0xee, 0xe2, 0x50, 0x98, 0xb8, 0x5e, 0x8a, 0x1b, 0xda, 0x34, 0x95, 0x95 ],
+const [ 0xaa, 0xa0, 0x5c, 0x3e, 0x8c, 0x33, 0x37, 0x30, 0x6a, 0xbc, 0x75, 0x2b, 0x9b, 0x04, 0x4d, 0xd7, 0x34, 0x9c, 0x96, 0x04, 0xda, 0x69, 0x37, 0x49, 0xd4, 0x61, 0xdf, 0xea, 0x64, 0x8f, 0xf6, 0xff, 0x58, 0x5d, 0xd3, 0xd3, 0xdc, 0x12, 0x2f, 0x8b, 0x92, 0x9a, 0xd9, 0x08, 0xe5, 0x86, 0xac, 0x0e, 0x9a, 0x53, 0xbf, 0xa5, 0xa7, 0xef, 0xdb, 0xbf, 0x49, 0x79, 0x32, 0x1c, 0x51, 0x48, 0x4d, 0x6b, 0xbe, 0x30, 0x47, 0xb2, 0x91, 0x00, 0x39, 0xef, 0xdd, 0x4f, 0xf5, 0x00, 0x1e, 0x79, 0xf7, 0xc0, 0xcb, 0xe4, 0x98, 0x73, 0x2f, 0x88, 0x85, 0x64, 0x74, 0xae, 0x70, 0xcc, 0x01, 0xf7, 0x05, 0xf6, 0x06, 0xa1, 0x20, 0xa1, 0x54, 0x06, 0x3d, 0xa6, 0x73, 0x65, 0x30, 0xda, 0xee, 0xe5, 0x16, 0x36, 0xf2, 0xd7, 0x8b, 0x35, 0x17, 0x3c, 0x1d, 0x7e, 0x7e, 0x87, 0x01, 0xc3, 0x1c, 0xa4, 0x05, 0xe9 ],
+const [ 0xc8, 0xdc, 0x13, 0x45, 0xa0, 0x6e, 0x53, 0xe6, 0xd7, 0xb7, 0xee, 0xf4, 0x51, 0x9d, 0x82, 0xa4, 0x3f, 0x19, 0x77, 0xcd, 0xe9, 0xe8, 0xe2, 0x42, 0xac, 0x84, 0xa9, 0x5e, 0x3e, 0x52, 0xe9, 0xe0, 0x3a, 0x1d, 0x94, 0xf9, 0xd8, 0xc3, 0x5f, 0xa4, 0xfb, 0x2e, 0xdb, 0x36, 0x72, 0x86, 0xe1, 0x36, 0x77, 0xa5, 0x34, 0x6e, 0x7c, 0xcc, 0x62, 0x42, 0x28, 0x94, 0xeb, 0x41, 0x9c, 0x27, 0xa5, 0xfa, 0xfa, 0xaf, 0x5f, 0x11, 0x28, 0x0f, 0xc5, 0x92, 0xd1, 0xd2, 0x84, 0x84, 0xad, 0x60, 0xae, 0xc2, 0x03, 0x78, 0x5f, 0x06, 0x6c, 0xda, 0xa1, 0x47, 0xd9, 0x44, 0x8d, 0x45, 0xd7, 0xa0, 0xb3, 0x62, 0x12, 0x7c, 0xbc, 0xb3, 0x18, 0xba, 0x4e, 0x57, 0x60, 0x89, 0x30, 0x07, 0x8b, 0x94, 0xaf, 0xef, 0xe9, 0x79, 0x40, 0xbc, 0x3f, 0x7c, 0x66, 0xf7, 0xc8, 0x7d, 0xd6, 0x91, 0x79, 0x27, 0xda, 0xbf ],
+const [ 0x77, 0xc1, 0x92, 0x47, 0x22, 0x53, 0x68, 0x5d, 0x52, 0xa6, 0xfc, 0x39, 0x3b, 0xb7, 0xa9, 0xd5, 0xbd, 0x73, 0xf5, 0xaf, 0x2b, 0x6e, 0x74, 0x20, 0x50, 0xd7, 0xea, 0xe9, 0xb4, 0xac, 0xb0, 0x0f, 0x1b, 0x2a, 0x59, 0xea, 0x4f, 0x88, 0x94, 0x78, 0x1f, 0xe4, 0x54, 0xf7, 0xa8, 0x7e, 0x2f, 0xb2, 0xd3, 0x24, 0x04, 0x1b, 0x1f, 0xed, 0xe1, 0x1a, 0xa1, 0x2a, 0x24, 0xa5, 0x49, 0x9a, 0xe0, 0x91, 0x66, 0xdd, 0x82, 0xa7, 0x6c, 0x2b, 0xb4, 0xfb, 0xf5, 0x46, 0x81, 0x79, 0x07, 0xad, 0xba, 0xc1, 0x95, 0x13, 0x99, 0x35, 0x48, 0x0f, 0xa5, 0x4f, 0x7f, 0x15, 0xd5, 0x39, 0x94, 0xa5, 0xf8, 0x97, 0x61, 0xc2, 0x54, 0xa7, 0x02, 0xa6, 0x8e, 0x8d, 0xdd, 0xb4, 0xca, 0xe8, 0xe0, 0xae, 0x12, 0xa9, 0x0a, 0x28, 0xfc, 0x25, 0x2d, 0x3d, 0x87, 0x69, 0xf2, 0x80, 0x47, 0xcd, 0x1d, 0x35, 0xc2, 0xcc ],
+const [ 0x22, 0x72, 0x57, 0x9c, 0xa6, 0xeb, 0x22, 0xdc, 0x3f, 0x55, 0x83, 0x14, 0xc4, 0x7c, 0x2e, 0xf8, 0xab, 0x4d, 0x67, 0x8a, 0x7d, 0x80, 0x17, 0xe0, 0x87, 0x7a, 0x1f, 0x28, 0xd3, 0x71, 0xec, 0xe9, 0x56, 0xd1, 0x4b, 0x8c, 0x6b, 0xde, 0x7f, 0x1a, 0x80, 0x9b, 0x92, 0x47, 0x0f, 0xeb, 0xe8, 0xb0, 0xd1, 0xf7, 0x1a, 0x61, 0x2e, 0xcf, 0x01, 0x9a, 0xf7, 0x54, 0x10, 0xd3, 0x57, 0x55, 0xe7, 0xfd, 0x07, 0xf8, 0x26, 0x0b, 0xc2, 0x5c, 0x7f, 0xb1, 0xf9, 0x7c, 0x10, 0x6b, 0xc7, 0x57, 0xef, 0xc2, 0x27, 0x4e, 0x06, 0xcb, 0x65, 0xcd, 0x21, 0xf0, 0xd2, 0x2d, 0x45, 0xf2, 0xbc, 0xd9, 0x44, 0x2f, 0x9d, 0xb0, 0x8e, 0x21, 0x93, 0xab, 0x4a, 0x28, 0x10, 0xc0, 0xa5, 0x89, 0xd3, 0x06, 0x6a, 0xb6, 0x17, 0x19, 0xd4, 0xd0, 0x0a, 0xc0, 0xa0, 0x6a, 0x80, 0xcd, 0x65, 0x90, 0xe9, 0x45, 0x28, 0x07 ],
+const [ 0xf5, 0x4c, 0x5e, 0x14, 0xa2, 0x9a, 0xbb, 0x69, 0x9f, 0xea, 0x35, 0x04, 0xf4, 0xb9, 0xa0, 0x77, 0xbd, 0x40, 0xa4, 0xdd, 0x72, 0xa6, 0x1c, 0xb5, 0x6c, 0x75, 0xbd, 0xf0, 0xa5, 0x4b, 0xf8, 0x48, 0xc0, 0xd2, 0x21, 0xd4, 0x49, 0xf1, 0xd0, 0xd9, 0x3d, 0x44, 0x88, 0xe4, 0xcd, 0xca, 0x96, 0x15, 0x5f, 0xde, 0x3c, 0xbe, 0xd6, 0x69, 0x0f, 0x2d, 0x13, 0x55, 0x9e, 0xc5, 0xbb, 0x45, 0x54, 0x54, 0x3b, 0x83, 0xa0, 0xa0, 0x0a, 0x39, 0x52, 0x43, 0x2e, 0xe5, 0x49, 0xb9, 0x02, 0x07, 0x4b, 0xb8, 0x36, 0x1c, 0x34, 0xbf, 0x17, 0xd0, 0x53, 0xf2, 0x11, 0x70, 0x11, 0x25, 0x72, 0x9e, 0xd3, 0x37, 0x70, 0x48, 0x22, 0xa1, 0x6e, 0xdb, 0x0a, 0x4e, 0x7b, 0xb3, 0xbf, 0xae, 0x1c, 0xd7, 0x87, 0x06, 0x4b, 0xe3, 0xd3, 0x0a, 0xbf, 0x45, 0xaf, 0xad, 0x6e, 0xac, 0x5d, 0x38, 0x51, 0xbe, 0x3d, 0x99 ],
+const [ 0x8f, 0x63, 0x60, 0x70, 0xd8, 0xc5, 0xc1, 0xf9, 0x79, 0x73, 0x4a, 0xe3, 0x6a, 0xcf, 0xe6, 0x3f, 0x0c, 0x08, 0x17, 0x53, 0x1a, 0x3f, 0x8d, 0xe1, 0xdd, 0xe9, 0xf7, 0xad, 0xa0, 0x75, 0x19, 0x39, 0x64, 0x2e, 0x1e, 0xd3, 0xd5, 0x62, 0x30, 0xd1, 0x7c, 0xc4, 0x47, 0x1c, 0x35, 0x0f, 0x3e, 0xeb, 0xe4, 0xec, 0x2c, 0xd1, 0x64, 0x16, 0xf1, 0xfa, 0xc0, 0xbc, 0x0f, 0xb2, 0xa6, 0x27, 0xbc, 0x26, 0x18, 0x9c, 0x35, 0x6f, 0x65, 0x84, 0x54, 0xcc, 0x58, 0xca, 0x65, 0x2f, 0xaf, 0x85, 0x36, 0xfc, 0xce, 0xd7, 0x6d, 0x0d, 0xb5, 0x14, 0x1e, 0xf9, 0x30, 0x27, 0x9d, 0x96, 0x4d, 0x32, 0x91, 0xbc, 0x13, 0x75, 0x4a, 0x4c, 0x71, 0x71, 0x55, 0x71, 0x75, 0x4d, 0x4d, 0x26, 0xbf, 0x78, 0xf3, 0xf9, 0x34, 0x90, 0x81, 0x0e, 0xf7, 0x83, 0x3c, 0x66, 0x95, 0xf4, 0x49, 0x61, 0x7f, 0xe0, 0xc1, 0x82 ],
+const [ 0xa8, 0x9b, 0xba, 0xa8, 0x6a, 0x33, 0x99, 0x51, 0xdd, 0xcd, 0x37, 0x79, 0x9e, 0x21, 0xb5, 0xd1, 0x68, 0x8e, 0x4a, 0xbe, 0xdb, 0xc7, 0x2d, 0xaf, 0x7c, 0xc9, 0xb5, 0xad, 0xfe, 0x10, 0xbe, 0x34, 0xc0, 0x0a, 0x50, 0x41, 0x96, 0xcc, 0x7b, 0xac, 0xcc, 0x04, 0x85, 0xb8, 0x68, 0x2e, 0x48, 0xe9, 0xb0, 0x0b, 0xd5, 0x15, 0xec, 0x4f, 0x5d, 0xbe, 0x6d, 0x9a, 0x52, 0x9f, 0xce, 0xaa, 0xc9, 0x85, 0x7a, 0xcf, 0x23, 0x60, 0x6e, 0x9f, 0xec, 0x9a, 0x41, 0xea, 0x03, 0xa7, 0x61, 0xf1, 0xfb, 0xde, 0x9f, 0xd2, 0xc2, 0x87, 0xee, 0x47, 0x80, 0x35, 0x67, 0x90, 0xc2, 0x56, 0x91, 0xae, 0xd8, 0x08, 0xe0, 0xd2, 0x7b, 0x2e, 0x7b, 0x15, 0xb4, 0xc3, 0x42, 0x69, 0xf9, 0x6f, 0x10, 0xd0, 0x98, 0x58, 0x3d, 0xcc, 0x59, 0x3b, 0x68, 0x16, 0x5e, 0xbb, 0x73, 0x92, 0x4f, 0xf9, 0xce, 0x83, 0xb4, 0x64 ],
+const [ 0x46, 0x25, 0x2e, 0x54, 0x90, 0x7e, 0xc1, 0x02, 0x94, 0x8e, 0x82, 0x33, 0xe7, 0x25, 0x4a, 0x6a, 0xd0, 0xfe, 0x41, 0x42, 0x50, 0xaa, 0x00, 0x02, 0x5f, 0xca, 0xf2, 0x72, 0x79, 0x81, 0x00, 0xed, 0x59, 0x29, 0x6d, 0xb8, 0x05, 0x45, 0xfe, 0x92, 0x0a, 0xb7, 0x5f, 0x8c, 0x09, 0x34, 0xc2, 0x1b, 0x72, 0xf4, 0xc9, 0x6c, 0x90, 0xae, 0xa6, 0xf7, 0xc6, 0xc3, 0x81, 0x57, 0x18, 0xba, 0x19, 0x59, 0xec, 0xec, 0xaf, 0x53, 0x12, 0x80, 0x20, 0xb7, 0x03, 0x9a, 0x51, 0xe7, 0x66, 0xd0, 0xcf, 0x4b, 0xd9, 0xde, 0xb7, 0xa2, 0xed, 0x9a, 0xd4, 0x95, 0x72, 0x2a, 0x08, 0x92, 0xf6, 0x74, 0xed, 0xd7, 0x88, 0xd6, 0xbb, 0xcd, 0xc2, 0x17, 0x6d, 0x98, 0x06, 0x9e, 0x1f, 0xec, 0x07, 0xe2, 0xbb, 0x22, 0x8b, 0x22, 0xd4, 0x8b, 0x70, 0x56, 0xd2, 0x04, 0xed, 0x65, 0x50, 0xca, 0x1b, 0x98, 0xc2, 0x90 ],
+const [ 0x8d, 0x50, 0x44, 0xa3, 0x08, 0xc1, 0x8e, 0x30, 0x5d, 0x0a, 0x13, 0xbd, 0xa0, 0xc6, 0x95, 0x55, 0xbd, 0xfa, 0x93, 0xc9, 0x54, 0x9b, 0xc0, 0x53, 0xc7, 0x51, 0xb3, 0x7a, 0x91, 0x7b, 0xe0, 0x35, 0xd9, 0x73, 0xc7, 0x53, 0x46, 0x13, 0x6b, 0x1a, 0x16, 0x78, 0x06, 0x2f, 0x6a, 0x05, 0xfb, 0xb6, 0xe4, 0xab, 0x0c, 0xb9, 0x74, 0x68, 0xcd, 0xce, 0x6f, 0x0e, 0x58, 0xf4, 0xe2, 0x46, 0x43, 0xbf, 0x25, 0xd4, 0xcf, 0xb5, 0xb3, 0x1d, 0x62, 0xf7, 0x38, 0xe6, 0x38, 0x24, 0xec, 0x5e, 0x55, 0x7a, 0x20, 0x5f, 0xbe, 0x3e, 0x16, 0xf1, 0xe8, 0x5e, 0x16, 0x10, 0x71, 0x56, 0xbe, 0xaf, 0x0e, 0x50, 0x9a, 0xfc, 0xc5, 0x8f, 0xf5, 0xe6, 0x5c, 0x0d, 0xee, 0xdc, 0x11, 0x63, 0xce, 0xd8, 0x8b, 0xea, 0x98, 0x9d, 0x11, 0x20, 0xe2, 0x3d, 0xfa, 0x4d, 0xe4, 0xdd, 0x64, 0x66, 0xcf, 0xbc, 0x29, 0x31 ],
+const [ 0xf3, 0x9d, 0xcf, 0xd6, 0x5a, 0xb7, 0xd0, 0x25, 0xbb, 0xea, 0x7a, 0xa4, 0x05, 0xf6, 0xd6, 0x4a, 0x22, 0xae, 0xc2, 0x8f, 0x7c, 0x64, 0x93, 0x7f, 0xc0, 0xa2, 0xff, 0x0d, 0xe2, 0x1b, 0x3b, 0xa9, 0x61, 0xe0, 0x60, 0x15, 0xcc, 0xd7, 0x13, 0x74, 0x85, 0x6a, 0x65, 0xa4, 0xc5, 0x7c, 0xf8, 0xcd, 0xe0, 0xa1, 0x64, 0x3a, 0xca, 0x8e, 0xd8, 0x68, 0xda, 0xce, 0x05, 0x5d, 0xcf, 0xb7, 0x37, 0x3b, 0x11, 0x9d, 0xc5, 0x15, 0x39, 0x45, 0xac, 0x01, 0xd2, 0x9c, 0x77, 0x6f, 0x61, 0xa9, 0x62, 0xb9, 0xa4, 0xc1, 0xbe, 0xfb, 0x18, 0xfa, 0x97, 0x24, 0xbd, 0xe2, 0x95, 0x4d, 0x1d, 0x70, 0x20, 0x4a, 0x8b, 0x3a, 0xc7, 0x7f, 0xa9, 0xe9, 0xe3, 0xf5, 0x2d, 0xea, 0x77, 0xae, 0xe4, 0x67, 0x5b, 0x35, 0xf7, 0x76, 0x9a, 0x78, 0x6d, 0x90, 0x18, 0xda, 0xf1, 0x44, 0x78, 0x85, 0xd5, 0x2c, 0x3c, 0xfd ],
+const [ 0xa1, 0x8a, 0x27, 0x74, 0x8e, 0xf3, 0x9b, 0x49, 0xbe, 0x98, 0x4e, 0x8d, 0x18, 0x52, 0x01, 0x10, 0x00, 0x8b, 0xc8, 0xa1, 0xd5, 0xae, 0xb4, 0x24, 0xbe, 0xdc, 0xae, 0xe5, 0xa7, 0xe1, 0xa6, 0x2c, 0x86, 0x66, 0xee, 0x12, 0xe3, 0x67, 0xe0, 0x92, 0x97, 0xe8, 0xc7, 0xe3, 0xd4, 0xe4, 0xfd, 0x05, 0x65, 0x87, 0x50, 0x9b, 0x37, 0x9d, 0xaa, 0xf8, 0x19, 0x49, 0xf2, 0x7c, 0xc0, 0xfa, 0x2d, 0x21, 0x0e, 0x9b, 0xe9, 0x51, 0x94, 0x0a, 0xdb, 0xfb, 0x55, 0xcc, 0xc7, 0xe5, 0xcc, 0xff, 0xa0, 0x44, 0x31, 0x8f, 0xf1, 0x8a, 0xf9, 0xad, 0x7b, 0x7f, 0x9c, 0x7d, 0x1f, 0x93, 0x9a, 0x0f, 0xff, 0x72, 0xc0, 0x91, 0xe1, 0xda, 0xa7, 0xc3, 0xd4, 0xa9, 0x7f, 0xab, 0x15, 0x3b, 0x0a, 0x89, 0x33, 0xf2, 0xeb, 0x0d, 0x72, 0x16, 0x21, 0xc8, 0x6d, 0xe0, 0xcf, 0xe1, 0x00, 0xd1, 0x3e, 0x09, 0x65, 0x48 ],
+const [ 0x9e, 0xeb, 0x07, 0x9c, 0x55, 0x2e, 0x42, 0x1f, 0x70, 0x30, 0x85, 0xb9, 0xb2, 0x75, 0xd5, 0xb0, 0x5c, 0x0c, 0x92, 0x2e, 0xfe, 0x14, 0xf2, 0xe7, 0x8c, 0x7f, 0xae, 0xfb, 0xb4, 0x16, 0xfb, 0x1e, 0x6f, 0xbd, 0xbc, 0xf6, 0xd7, 0xf9, 0xf6, 0xc4, 0x38, 0xaf, 0x84, 0x47, 0x69, 0x2f, 0x0c, 0xde, 0x5d, 0x70, 0x31, 0xec, 0xf5, 0x9d, 0x0a, 0x80, 0x18, 0xd1, 0xd3, 0x36, 0x06, 0x20, 0xe3, 0x58, 0xe9, 0xd6, 0xde, 0x49, 0xae, 0x03, 0x2c, 0x24, 0x12, 0x37, 0xaa, 0xa0, 0x00, 0x8a, 0x9f, 0x37, 0x1a, 0xdf, 0xf1, 0x87, 0x96, 0x6a, 0x99, 0xf8, 0x4b, 0x70, 0x54, 0x9f, 0x0b, 0x4e, 0x9b, 0x62, 0x34, 0xbd, 0xd6, 0x5d, 0x82, 0x54, 0xcd, 0x85, 0x27, 0x4f, 0x5f, 0x8b, 0x1e, 0x8e, 0x76, 0x04, 0xbc, 0xe1, 0x3a, 0xc6, 0x88, 0x82, 0x85, 0x95, 0x4c, 0xe3, 0x97, 0xff, 0x6c, 0xaa, 0x0c, 0x84 ],
+const [ 0xb8, 0xec, 0x37, 0x14, 0xf0, 0xf5, 0x4c, 0x83, 0xd7, 0xe1, 0xe5, 0xe1, 0x87, 0xb1, 0x10, 0xd0, 0xab, 0xba, 0xdd, 0xf1, 0xec, 0x4a, 0x71, 0xa9, 0xac, 0x8e, 0x56, 0x25, 0xf7, 0xb3, 0x15, 0x9b, 0xb6, 0x4c, 0x07, 0xd3, 0x26, 0xf4, 0x68, 0xe7, 0x89, 0x34, 0xad, 0x47, 0x1c, 0xa7, 0x17, 0xff, 0x48, 0x5b, 0x89, 0x3d, 0x1c, 0x7b, 0x97, 0x0d, 0xfb, 0x2b, 0xdf, 0x68, 0x92, 0xb4, 0x9c, 0x6d, 0x0d, 0xe1, 0x78, 0xee, 0x8b, 0xa9, 0xa2, 0x2e, 0xcf, 0x0d, 0x21, 0xe9, 0x38, 0x44, 0x68, 0x95, 0xf3, 0x16, 0x2a, 0xe8, 0x6f, 0x86, 0x6f, 0x9a, 0x11, 0xb3, 0xe8, 0x6c, 0x2a, 0x00, 0x7f, 0x69, 0x26, 0x73, 0x33, 0x6c, 0x06, 0x5b, 0x23, 0xe2, 0x10, 0x36, 0xe8, 0xd1, 0xc4, 0xd1, 0x28, 0x1a, 0x13, 0xb1, 0x68, 0xfb, 0xcc, 0xb2, 0x22, 0xd7, 0x57, 0xee, 0x18, 0x3a, 0xa5, 0xe0, 0xe7, 0x18 ],
+const [ 0xbd, 0xff, 0x02, 0x4f, 0x5c, 0x8c, 0x62, 0x5b, 0xf0, 0xe5, 0x57, 0xc1, 0x38, 0xe0, 0x2f, 0x1f, 0xa7, 0x32, 0x9b, 0xf7, 0x0b, 0x84, 0x6d, 0x61, 0x6c, 0xca, 0xa1, 0xfc, 0x37, 0xd0, 0x9a, 0x2a, 0x9c, 0x15, 0xaf, 0x7d, 0x34, 0xdd, 0xe6, 0x6c, 0xe7, 0x82, 0xff, 0x4b, 0x0d, 0x0b, 0xb5, 0x7a, 0xd3, 0xff, 0x40, 0xdc, 0xe0, 0x7c, 0x1e, 0x8a, 0x39, 0x83, 0x13, 0xc9, 0x62, 0x96, 0x6f, 0x3a, 0xc7, 0x85, 0x8f, 0x51, 0x5a, 0x85, 0xa6, 0x08, 0x7c, 0x82, 0xbe, 0xd5, 0x21, 0xb6, 0xf9, 0xd9, 0x2f, 0x7b, 0x1d, 0x5a, 0x28, 0x5d, 0x4f, 0x73, 0x09, 0x74, 0x1f, 0x0a, 0x72, 0xf1, 0xc5, 0x03, 0x06, 0xf6, 0xaa, 0xb3, 0x15, 0xab, 0x2b, 0x98, 0x79, 0x8e, 0x99, 0x47, 0xbd, 0x0a, 0x84, 0xa5, 0x85, 0x4c, 0x39, 0x5a, 0x29, 0x52, 0x89, 0x83, 0xa4, 0x44, 0xcc, 0xa7, 0xad, 0x08, 0x26, 0xed ],
+const [ 0x8d, 0x80, 0x94, 0xc0, 0x73, 0x65, 0x64, 0x17, 0x5a, 0x29, 0xe5, 0x67, 0x30, 0x98, 0x09, 0xea, 0x14, 0xe0, 0x90, 0x74, 0x5e, 0x8e, 0x29, 0x04, 0xdf, 0xb9, 0xda, 0x99, 0x6a, 0x7d, 0xa1, 0x47, 0x92, 0xac, 0x5c, 0x89, 0xb6, 0xbf, 0xe6, 0xd9, 0x3b, 0x13, 0x83, 0x7e, 0x19, 0x52, 0x7e, 0xa6, 0x99, 0x2e, 0x10, 0xb4, 0x5d, 0x56, 0x84, 0xdb, 0xa0, 0xa2, 0x99, 0xec, 0xbf, 0x91, 0x28, 0x6c, 0xf8, 0xf6, 0x06, 0xea, 0x72, 0xee, 0x2c, 0x8f, 0x7e, 0x15, 0x15, 0xf7, 0x1d, 0xfa, 0x68, 0x3f, 0xc2, 0xd0, 0xd7, 0x60, 0x59, 0x66, 0x47, 0xbb, 0x87, 0x59, 0x31, 0xf5, 0x34, 0x88, 0x48, 0x04, 0x47, 0xc8, 0x5c, 0x8a, 0xb0, 0xd9, 0x7e, 0x62, 0xac, 0x99, 0x65, 0x79, 0x44, 0x78, 0x10, 0xe0, 0x17, 0x2c, 0xad, 0x1f, 0x5a, 0xa6, 0xba, 0xcb, 0x1d, 0x44, 0x6a, 0x5b, 0xd0, 0x48, 0x4a, 0x37 ],
+const [ 0x69, 0x96, 0x92, 0x42, 0xb7, 0x7b, 0xb6, 0x9e, 0x8d, 0x7d, 0x63, 0xbb, 0x08, 0xd6, 0x3e, 0xbe, 0x8b, 0xe9, 0x6a, 0x46, 0x07, 0x78, 0xf4, 0x44, 0x7a, 0x17, 0x6f, 0x0d, 0xb6, 0xe1, 0xdb, 0xad, 0x64, 0x69, 0xcc, 0x7e, 0x48, 0xf4, 0xc8, 0xfa, 0xc7, 0xe5, 0xf0, 0xce, 0xa6, 0x78, 0xe2, 0x2f, 0x14, 0xb3, 0xdf, 0x71, 0xeb, 0x9a, 0x29, 0xd6, 0x33, 0xa3, 0xaf, 0xa4, 0xe8, 0x69, 0xec, 0x7a, 0xfc, 0xa4, 0x0d, 0xe3, 0xa0, 0x59, 0x52, 0x2c, 0xc0, 0x4e, 0xb6, 0x73, 0xcc, 0xc1, 0xd2, 0x01, 0xbe, 0x59, 0xff, 0xda, 0x59, 0x5d, 0xbb, 0x91, 0xae, 0x24, 0x4e, 0x61, 0xe5, 0xcd, 0xad, 0x7a, 0x3a, 0x30, 0x9e, 0x99, 0x46, 0x13, 0x1d, 0xdb, 0x80, 0xa2, 0xfe, 0xd3, 0x03, 0x19, 0xd5, 0xda, 0x92, 0xc4, 0x13, 0xa6, 0xd9, 0x29, 0x71, 0x1f, 0xf5, 0x84, 0x92, 0x6d, 0x37, 0x73, 0xe3, 0x56 ],
+const [ 0xe6, 0x8c, 0xcc, 0x21, 0xd4, 0xd7, 0xe9, 0x15, 0x57, 0x73, 0xe9, 0xd6, 0x12, 0x81, 0x3f, 0x99, 0xba, 0xf6, 0xd7, 0x2c, 0x33, 0x36, 0x56, 0x2c, 0xf6, 0xe5, 0xa4, 0x78, 0xb6, 0xf9, 0xa8, 0xe5, 0x43, 0x14, 0x52, 0x34, 0xae, 0x12, 0xdf, 0x41, 0xae, 0xdd, 0x58, 0x7c, 0x42, 0x89, 0x5c, 0x9d, 0x98, 0x9d, 0x20, 0x94, 0x2e, 0xae, 0xb4, 0xbf, 0x37, 0x33, 0x88, 0x60, 0x40, 0x94, 0x2e, 0x4e, 0x13, 0x84, 0x61, 0xeb, 0xdc, 0x91, 0x47, 0x55, 0x8a, 0xf9, 0xf3, 0xe1, 0x78, 0xc0, 0x2e, 0xc5, 0x4d, 0xff, 0x77, 0x14, 0x21, 0x7f, 0x48, 0xf0, 0xe1, 0x86, 0x9b, 0xfb, 0xf4, 0xf1, 0xad, 0x0e, 0x1e, 0x83, 0x02, 0x2e, 0xa5, 0x7d, 0xa9, 0xbb, 0xb3, 0x6f, 0xc1, 0xeb, 0xfc, 0x4d, 0x3c, 0x77, 0xa0, 0xc5, 0xe3, 0x94, 0x53, 0xd0, 0x9a, 0x25, 0xbb, 0x88, 0xe6, 0x2f, 0x19, 0x39, 0xac, 0x8d ],
+const [ 0x65, 0x7f, 0xce, 0xf9, 0x62, 0xdb, 0x04, 0xbd, 0x26, 0x9a, 0xe5, 0xfe, 0xf2, 0xcb, 0xd5, 0xe6, 0x55, 0x8d, 0x07, 0x29, 0x46, 0xd2, 0x35, 0xe8, 0x70, 0x63, 0x94, 0xd4, 0xcd, 0x25, 0x07, 0x96, 0x76, 0x9a, 0x92, 0x6f, 0xba, 0xaa, 0x12, 0x1b, 0x6d, 0xa4, 0x2c, 0xfc, 0x82, 0x80, 0x84, 0x74, 0xdd, 0x67, 0x2f, 0x93, 0x62, 0x75, 0x6a, 0xf2, 0x52, 0xbd, 0x8c, 0xde, 0xd7, 0x8d, 0x39, 0xb9, 0xdd, 0xf4, 0xd9, 0x9e, 0x24, 0x82, 0x48, 0x44, 0x93, 0x4f, 0xcf, 0x25, 0xd0, 0x3e, 0x54, 0xdf, 0x0d, 0x83, 0xcd, 0xda, 0x25, 0x63, 0xfb, 0x2b, 0xe7, 0x3b, 0x54, 0xb8, 0xb1, 0xc4, 0x41, 0x9d, 0x42, 0x95, 0x89, 0xcf, 0xc9, 0xea, 0x0d, 0xff, 0x41, 0xa3, 0xb7, 0xc2, 0x01, 0x90, 0xad, 0xee, 0x8f, 0xeb, 0xca, 0x47, 0xb6, 0x26, 0x4e, 0x5b, 0xd8, 0xe8, 0xd4, 0xaa, 0x85, 0x52, 0x85, 0x0a ],
+const [ 0x42, 0x2e, 0x4c, 0xbd, 0xbc, 0xb7, 0x12, 0x8f, 0x19, 0x66, 0xef, 0x74, 0x32, 0x04, 0x9d, 0x13, 0xa4, 0x07, 0xcb, 0x27, 0xc8, 0xb4, 0xb7, 0xcb, 0xe6, 0x86, 0xff, 0xf4, 0xa5, 0xd3, 0xb5, 0x3f, 0xc6, 0xad, 0xb1, 0xed, 0x12, 0x07, 0x2b, 0x2b, 0x91, 0x18, 0x89, 0x97, 0xfd, 0x05, 0x75, 0x01, 0x76, 0xba, 0x33, 0x6e, 0x77, 0x18, 0x31, 0x63, 0x09, 0x56, 0xe0, 0x60, 0x37, 0xa1, 0xc3, 0xaa, 0xc1, 0x06, 0xc6, 0x4d, 0x15, 0x92, 0xd0, 0x62, 0x7a, 0xb8, 0x9b, 0x8e, 0x8f, 0xf2, 0xc4, 0xcb, 0xf4, 0xab, 0x1e, 0x6b, 0x47, 0x5d, 0x4c, 0x5a, 0x52, 0xf7, 0x8f, 0xa3, 0x82, 0x81, 0xdc, 0x35, 0x9b, 0x02, 0x32, 0xe8, 0xab, 0xa2, 0x2a, 0xbb, 0x3d, 0x0c, 0xd0, 0x5f, 0xce, 0x16, 0xb1, 0xfa, 0x85, 0xa4, 0x35, 0x25, 0x1e, 0xc9, 0x2f, 0x36, 0x28, 0x30, 0xb3, 0xc5, 0x70, 0xbb, 0x28, 0x69 ],
+const [ 0xa6, 0x7b, 0x1d, 0xc3, 0x63, 0x3d, 0x30, 0xc4, 0xef, 0x2b, 0xf3, 0x18, 0x5f, 0xd4, 0x48, 0x65, 0xd2, 0xaf, 0x5e, 0x72, 0x01, 0x5c, 0xdf, 0x8c, 0x18, 0x2e, 0x6b, 0x28, 0xc5, 0xe7, 0x46, 0xc9, 0x8e, 0xc2, 0x4d, 0x24, 0x67, 0xb7, 0x2f, 0x82, 0x84, 0xfa, 0xd9, 0x67, 0x6c, 0xc5, 0x32, 0x71, 0x4f, 0x57, 0x09, 0x82, 0x99, 0x3d, 0x4b, 0x22, 0xc7, 0xd0, 0x7a, 0x1e, 0x79, 0xff, 0x5a, 0x75, 0xc9, 0x4e, 0xee, 0x75, 0xdc, 0x1f, 0xa2, 0x22, 0xb6, 0x30, 0xca, 0xd7, 0x53, 0x66, 0x4b, 0x30, 0xf3, 0xc9, 0x98, 0x26, 0xb5, 0xcf, 0xe1, 0x7c, 0x67, 0xdd, 0x87, 0x5b, 0x9d, 0x0b, 0xd2, 0x39, 0x00, 0x28, 0xe6, 0xff, 0xe9, 0xfe, 0xf3, 0x6a, 0x2f, 0xd6, 0xad, 0xb1, 0x3d, 0x3f, 0xfc, 0x69, 0x67, 0x0c, 0xf4, 0xa6, 0x7e, 0x9c, 0x07, 0x64, 0xa1, 0x5e, 0x79, 0x25, 0x57, 0x93, 0x15, 0xdb ],
+const [ 0xa9, 0x17, 0x4a, 0x67, 0x60, 0x3a, 0x4d, 0x5f, 0xba, 0xa8, 0xcf, 0xb5, 0x62, 0xf0, 0x73, 0x93, 0xab, 0xad, 0xbc, 0x80, 0xd1, 0xb5, 0x72, 0x31, 0x82, 0x93, 0x47, 0xa2, 0x9c, 0x38, 0xba, 0x66, 0x39, 0xed, 0x3c, 0x3c, 0xe9, 0x8c, 0x91, 0xe2, 0x3e, 0xf0, 0x7a, 0x2e, 0x8e, 0xaa, 0x91, 0x5a, 0xf4, 0xf5, 0x74, 0xa0, 0x98, 0xed, 0x25, 0x06, 0x30, 0xfb, 0xb1, 0x7c, 0xc7, 0x94, 0x10, 0x24, 0xbd, 0x23, 0x4d, 0xf1, 0x10, 0x43, 0xe7, 0x73, 0xd9, 0x32, 0x76, 0xf1, 0x1a, 0x82, 0x91, 0xb9, 0xb6, 0x12, 0xf0, 0xb4, 0xc1, 0x3d, 0xce, 0x3d, 0xfa, 0x51, 0x91, 0x33, 0x96, 0x43, 0xad, 0x4d, 0x40, 0xa1, 0xc6, 0xae, 0x5d, 0xc7, 0x15, 0xba, 0x94, 0x56, 0x0c, 0x27, 0x8e, 0xe2, 0x3d, 0x57, 0xfa, 0xeb, 0x78, 0xe5, 0xd5, 0x0f, 0x33, 0x7e, 0xe8, 0x7d, 0x2f, 0xf2, 0x92, 0xad, 0x59, 0x8a ],
+const [ 0x5c, 0x97, 0xf1, 0x33, 0x31, 0xdb, 0x20, 0xf6, 0x35, 0x1f, 0x9a, 0xef, 0x4e, 0x0b, 0x7c, 0x9c, 0x92, 0xa2, 0xca, 0xbf, 0x47, 0x69, 0x03, 0xa8, 0x0e, 0xcb, 0xf8, 0xb6, 0x5b, 0xbc, 0xdd, 0x1c, 0x28, 0x9d, 0xa1, 0xe1, 0xeb, 0x5f, 0x7b, 0x2b, 0xc5, 0xec, 0xc6, 0xbc, 0xfc, 0xc2, 0x0e, 0xbd, 0xab, 0xe1, 0x6b, 0xba, 0xb8, 0xe8, 0x0d, 0xef, 0x07, 0x7b, 0x19, 0xc2, 0xed, 0xe7, 0xb4, 0x90, 0xe8, 0x09, 0x5c, 0xac, 0x8d, 0x6c, 0x7f, 0xa5, 0xc1, 0xb1, 0x46, 0xc8, 0x2c, 0x34, 0xb2, 0xe6, 0xeb, 0xec, 0xeb, 0x58, 0x85, 0x93, 0xd5, 0x3f, 0x21, 0x07, 0xe3, 0x10, 0xf6, 0xf1, 0x30, 0x51, 0x02, 0xa4, 0xcc, 0x9d, 0xff, 0x48, 0x53, 0xee, 0x93, 0x37, 0xc5, 0x1c, 0xc7, 0xa7, 0x91, 0xa0, 0xba, 0x8a, 0xf3, 0x9e, 0x97, 0xb2, 0x80, 0x23, 0xc4, 0x39, 0x00, 0xab, 0x5c, 0x20, 0x7b, 0xe6 ],
+const [ 0x17, 0x96, 0x45, 0xa0, 0x88, 0x5b, 0xf0, 0xf1, 0xde, 0xb9, 0xf6, 0xc1, 0x05, 0xbd, 0xbf, 0x2b, 0xbd, 0xf7, 0x28, 0xe6, 0xed, 0x81, 0x78, 0x6c, 0x3a, 0x3e, 0x95, 0x5b, 0xd9, 0x60, 0x78, 0x1b, 0xa1, 0x2d, 0xde, 0xc1, 0x65, 0x02, 0x40, 0x33, 0x80, 0x98, 0x06, 0x8d, 0xb1, 0x86, 0xf8, 0xc4, 0x2a, 0x07, 0xf5, 0x8a, 0xe3, 0xfe, 0xe7, 0x71, 0x34, 0x37, 0xf6, 0x52, 0xa3, 0xf0, 0xfc, 0xf0, 0xfb, 0x98, 0x39, 0xd9, 0x9e, 0xd6, 0x49, 0x8d, 0x1b, 0xcd, 0x52, 0xe2, 0x03, 0x9f, 0x82, 0xa7, 0xf9, 0x2f, 0xb9, 0x88, 0x09, 0x2c, 0x82, 0x31, 0x3b, 0x4b, 0x48, 0xb7, 0x67, 0xd3, 0xc7, 0x33, 0x4a, 0x5f, 0xc0, 0xb0, 0xda, 0xdf, 0xf1, 0x47, 0xd7, 0xe1, 0x44, 0x88, 0xa3, 0x0f, 0x47, 0x1c, 0x53, 0xf8, 0xdc, 0xa9, 0x06, 0x13, 0x32, 0xf6, 0x75, 0x00, 0xf3, 0x50, 0xcc, 0x12, 0xbf, 0x2c ],
+const [ 0xa7, 0x82, 0xb8, 0x73, 0x23, 0xa0, 0xec, 0x6a, 0xbd, 0x8f, 0x27, 0xe5, 0x0e, 0x97, 0x61, 0x84, 0x84, 0x7e, 0x16, 0x6a, 0x04, 0xa0, 0x01, 0xf1, 0xd4, 0x42, 0x28, 0x9c, 0xb9, 0x23, 0x18, 0x4e, 0x5c, 0x54, 0x72, 0xb9, 0xf2, 0x4a, 0xa6, 0x18, 0x1c, 0x32, 0xff, 0x21, 0x0c, 0x84, 0xe0, 0x35, 0xea, 0xdb, 0x4d, 0xdb, 0x76, 0x04, 0xac, 0x6c, 0xee, 0x54, 0xcd, 0x10, 0x32, 0x3f, 0x29, 0xe8, 0x26, 0x27, 0x67, 0x8d, 0x58, 0x72, 0x25, 0xba, 0xe3, 0xdf, 0xf4, 0x45, 0x93, 0x1a, 0xa4, 0x54, 0x49, 0x8e, 0xc3, 0xcd, 0xa1, 0x7a, 0x60, 0x0e, 0xd3, 0x47, 0x14, 0xdf, 0xd7, 0x19, 0x44, 0xa4, 0xcd, 0xa4, 0xa0, 0xd8, 0x9b, 0x41, 0xef, 0xb6, 0xd8, 0x40, 0x0f, 0x39, 0xe9, 0x80, 0x37, 0x47, 0x69, 0x3e, 0x80, 0x29, 0xcf, 0x2b, 0xa4, 0x3f, 0x4a, 0xc1, 0x05, 0xf2, 0xf0, 0xd6, 0xf1, 0xe9 ],
+const [ 0xf7, 0xa5, 0x19, 0xf3, 0xb5, 0xae, 0x6f, 0xd9, 0x88, 0xea, 0xe9, 0x2a, 0x9b, 0xdf, 0xbe, 0xcf, 0x81, 0xe7, 0xb4, 0x05, 0xd7, 0x3e, 0xe5, 0x0e, 0x25, 0x59, 0xc3, 0x26, 0x06, 0x79, 0x5a, 0xb9, 0x89, 0x81, 0xd5, 0xd3, 0xd6, 0x04, 0x44, 0xd8, 0x15, 0xa3, 0x9c, 0x75, 0x8b, 0x96, 0xff, 0xd6, 0x06, 0x88, 0x3e, 0x1a, 0x7c, 0xa8, 0x9d, 0x04, 0xef, 0xfd, 0xd6, 0xf3, 0x93, 0xf9, 0x60, 0x14, 0x33, 0x52, 0xf0, 0xd6, 0xd1, 0x0d, 0x41, 0x9e, 0x8d, 0xdc, 0x11, 0xbd, 0xc8, 0xa9, 0x6c, 0x9f, 0x88, 0x73, 0x2c, 0x44, 0x1e, 0x59, 0xc1, 0xf4, 0x07, 0xf4, 0x2e, 0x2f, 0x11, 0xea, 0x54, 0xe4, 0xbe, 0xc0, 0x73, 0xe3, 0xed, 0xf0, 0xee, 0x93, 0xb7, 0x3c, 0x4e, 0xe8, 0x98, 0x41, 0x8a, 0x90, 0xcf, 0x4f, 0x86, 0x6d, 0x07, 0x78, 0xd9, 0x48, 0x36, 0xe7, 0xd3, 0xc4, 0xc6, 0x74, 0xbf, 0x90 ],
+const [ 0x2f, 0xb3, 0xb0, 0x4e, 0x1f, 0x5e, 0x7f, 0xad, 0xe5, 0xab, 0xfb, 0x52, 0xef, 0xe1, 0x9e, 0xdd, 0x2e, 0xbc, 0x80, 0x18, 0x1a, 0x65, 0x7b, 0x85, 0xf7, 0xa1, 0x8d, 0x39, 0x57, 0x49, 0x7f, 0xed, 0xe1, 0xfa, 0xc4, 0x53, 0x50, 0x0d, 0xa4, 0xa6, 0xbf, 0xca, 0x9a, 0x85, 0x23, 0xd8, 0xfa, 0x01, 0x19, 0xf8, 0xd6, 0xf5, 0xe2, 0xf4, 0x23, 0x96, 0xab, 0xd1, 0x18, 0x4a, 0x12, 0x4c, 0xd7, 0xbe, 0xe7, 0x85, 0x4f, 0x32, 0x2f, 0xf5, 0x61, 0x18, 0x6f, 0xa5, 0x41, 0xde, 0x27, 0xa2, 0x20, 0x08, 0x9c, 0xac, 0x08, 0x81, 0xda, 0x2e, 0x07, 0x33, 0xfa, 0x73, 0x8f, 0xd5, 0xa1, 0x16, 0x1d, 0x04, 0xc9, 0xba, 0x19, 0x96, 0xc4, 0xfc, 0xfd, 0x2b, 0x7d, 0xa6, 0xba, 0x04, 0x02, 0x25, 0x58, 0x19, 0x3f, 0x3e, 0xdc, 0x65, 0x0c, 0xfc, 0x6e, 0x85, 0x6b, 0xed, 0xbb, 0x81, 0x0a, 0x8e, 0x99, 0xea ],
+const [ 0x7f, 0x75, 0x77, 0x73, 0x63, 0x13, 0xf7, 0x25, 0xfb, 0x87, 0x2d, 0x07, 0x03, 0xa3, 0x75, 0x9c, 0x42, 0x2a, 0x55, 0xdb, 0x25, 0xe3, 0x4a, 0xe0, 0xa7, 0xeb, 0xc8, 0xe2, 0x73, 0x4f, 0x7c, 0x65, 0x4d, 0xda, 0xd4, 0xb1, 0xae, 0x2c, 0xc1, 0x82, 0xae, 0x0c, 0xbc, 0x01, 0x27, 0x00, 0x07, 0xf3, 0x18, 0x1a, 0x35, 0x31, 0x47, 0x14, 0xec, 0x58, 0x2b, 0xa0, 0xea, 0xc1, 0x08, 0xf9, 0x46, 0xb4, 0x5c, 0xbe, 0xf8, 0xd8, 0x7a, 0x00, 0x9c, 0xee, 0x75, 0x9a, 0x73, 0xbf, 0x3f, 0xc0, 0xab, 0x53, 0x12, 0xdb, 0xe0, 0x64, 0x0f, 0x94, 0xe2, 0x12, 0x26, 0x2f, 0xb9, 0xd9, 0x35, 0x1b, 0xe6, 0xbf, 0x74, 0xc7, 0xec, 0xd2, 0x10, 0xb7, 0x0f, 0xd1, 0x16, 0xd6, 0x5c, 0x2a, 0x93, 0x0e, 0xe9, 0x24, 0xfa, 0x16, 0x5e, 0x5e, 0xc5, 0x8b, 0xb4, 0x78, 0x5f, 0x43, 0x3d, 0x10, 0x42, 0xde, 0xe5, 0xf0 ],
+const [ 0xca, 0xd0, 0x4d, 0x5a, 0x15, 0xec, 0x41, 0xe2, 0x8c, 0x99, 0x44, 0xfd, 0x13, 0xba, 0xfc, 0xc5, 0x2f, 0x54, 0xaa, 0x86, 0xc5, 0x42, 0x0d, 0x17, 0x25, 0x2a, 0x84, 0x6b, 0x46, 0xaf, 0x72, 0x63, 0x53, 0xe8, 0xe6, 0xe6, 0x67, 0x11, 0x7c, 0x34, 0x96, 0x81, 0x7e, 0x77, 0x2c, 0xdc, 0x4f, 0x9c, 0x39, 0x8a, 0x0a, 0x60, 0x4d, 0x68, 0x66, 0xae, 0x80, 0xbd, 0xdd, 0x28, 0xb5, 0x6f, 0x0d, 0x04, 0x20, 0x77, 0x5e, 0x19, 0x06, 0x92, 0xe5, 0x39, 0xc4, 0x39, 0x88, 0xc2, 0x13, 0xd4, 0x63, 0x70, 0x8a, 0x2b, 0x6b, 0x75, 0x65, 0x1d, 0x51, 0xcc, 0x84, 0x94, 0xaa, 0xca, 0xb7, 0xb8, 0x4c, 0xf6, 0x38, 0x63, 0xfb, 0x1a, 0x79, 0xd5, 0x45, 0x9a, 0x20, 0xaa, 0xaa, 0x05, 0x50, 0x09, 0x00, 0xea, 0x2b, 0x1d, 0x16, 0xed, 0x95, 0xc9, 0x98, 0x19, 0x3a, 0x97, 0x32, 0x78, 0xd2, 0xf2, 0xf8, 0xe1 ],
+const [ 0x55, 0xce, 0xb7, 0x32, 0x8e, 0xc0, 0x45, 0x96, 0x78, 0x07, 0xa8, 0x07, 0x90, 0xb5, 0xf5, 0x5b, 0x2a, 0x66, 0xaa, 0x1f, 0x6d, 0x2e, 0xdc, 0x2c, 0x9f, 0xd0, 0x92, 0x7b, 0xa3, 0x31, 0x6c, 0x3b, 0xbf, 0x0c, 0x88, 0x20, 0xa3, 0xe6, 0xa5, 0xfd, 0xa7, 0x45, 0x89, 0x95, 0x55, 0x1d, 0xa1, 0xaf, 0x27, 0x8b, 0xe8, 0x68, 0x91, 0xc5, 0x09, 0xcd, 0x42, 0x52, 0xc8, 0xa9, 0xa8, 0x76, 0x9e, 0x9c, 0xb2, 0xf1, 0xa3, 0x6d, 0xd9, 0xe9, 0xb2, 0xa1, 0x61, 0x24, 0xc7, 0x4d, 0xdc, 0x7a, 0xab, 0x28, 0xf1, 0x8a, 0xd4, 0xe4, 0x5b, 0xad, 0x86, 0xbf, 0x34, 0x28, 0x3f, 0x55, 0x74, 0xa6, 0x52, 0xb8, 0xb5, 0xe5, 0xd2, 0xc2, 0x39, 0xaf, 0xb1, 0xaa, 0x2d, 0x0c, 0x29, 0xd6, 0x2f, 0xb6, 0x5b, 0xf0, 0x0f, 0xcd, 0x37, 0x3c, 0xd2, 0xcc, 0x9b, 0x29, 0xfd, 0xbc, 0xbf, 0x26, 0x10, 0xa7, 0xd0, 0xb6 ],
+const [ 0xde, 0x66, 0xe5, 0x19, 0x98, 0x3b, 0xa0, 0x74, 0x22, 0x06, 0x40, 0xd0, 0x98, 0x48, 0xcf, 0x60, 0x6f, 0x6f, 0x95, 0x9c, 0x4e, 0x58, 0x8d, 0xe6, 0x1f, 0x11, 0x15, 0x6e, 0x67, 0xe3, 0xe9, 0x53, 0xd2, 0x90, 0x52, 0x0b, 0x13, 0xd9, 0x9b, 0x04, 0xea, 0x43, 0xc5, 0x8b, 0x86, 0x1b, 0x7c, 0xee, 0x0e, 0xb8, 0x49, 0xdd, 0x7b, 0x00, 0x08, 0x16, 0xa8, 0x2e, 0x9d, 0x42, 0xac, 0xd2, 0xe3, 0x19, 0x67, 0x18, 0xe5, 0xcd, 0x5b, 0x4e, 0x51, 0xa6, 0xbd, 0xa1, 0x29, 0xe9, 0xcc, 0x27, 0xbc, 0xff, 0x62, 0x23, 0xd5, 0xd3, 0xc9, 0x84, 0x32, 0x7c, 0xcf, 0xae, 0x37, 0x1c, 0x1d, 0x7d, 0xe4, 0x08, 0xc4, 0x87, 0x05, 0x29, 0x19, 0xa2, 0xa8, 0xa2, 0xc3, 0xa7, 0xd4, 0xb2, 0x12, 0x75, 0x78, 0xdc, 0x93, 0x38, 0xa2, 0x46, 0xe1, 0xeb, 0xf1, 0x60, 0xbd, 0x1b, 0x4d, 0xc5, 0x61, 0xee, 0xd5, 0x66 ],
+const [ 0xac, 0xa7, 0xf7, 0xf3, 0x26, 0x45, 0x34, 0x35, 0xb2, 0xec, 0x9e, 0x17, 0xf0, 0xc8, 0x82, 0x3f, 0x3c, 0xda, 0xb1, 0xcb, 0x8d, 0x47, 0x83, 0x42, 0x9d, 0xf6, 0x1c, 0xca, 0x4b, 0x59, 0xee, 0x9c, 0x3d, 0x8b, 0x7f, 0xb6, 0xc9, 0x9c, 0x6d, 0xcf, 0x16, 0x29, 0xaf, 0x90, 0x7e, 0x2f, 0x1d, 0x01, 0x37, 0x20, 0x33, 0x42, 0x33, 0x37, 0x12, 0x7b, 0x44, 0x09, 0xc7, 0x15, 0x84, 0x5e, 0xd0, 0x2b, 0xf4, 0x3e, 0xdc, 0x3b, 0x63, 0x4f, 0xd3, 0x22, 0x92, 0x5e, 0x16, 0x47, 0x95, 0x3b, 0x08, 0x16, 0x7c, 0xca, 0xcd, 0xb0, 0x33, 0x57, 0x52, 0xe0, 0xa7, 0x2a, 0x8d, 0x52, 0x2a, 0x5b, 0x06, 0xff, 0x19, 0xe8, 0x96, 0xec, 0xbc, 0x05, 0x6e, 0x14, 0x6d, 0xb3, 0x5c, 0xa2, 0xfd, 0x94, 0x4a, 0x64, 0x53, 0xfe, 0x08, 0x7d, 0x56, 0x4e, 0x4b, 0x5a, 0x0e, 0x7f, 0xf5, 0xe7, 0x05, 0xfb, 0x96, 0x02 ],
+const [ 0x13, 0x47, 0x5d, 0x77, 0xc3, 0x02, 0x10, 0xf6, 0xbe, 0xed, 0xff, 0x5c, 0x38, 0xb9, 0x26, 0x80, 0x3e, 0x95, 0x0d, 0xa0, 0xa5, 0x4f, 0x55, 0xa5, 0x40, 0xbc, 0x90, 0xa8, 0x56, 0x5b, 0x56, 0xb6, 0x52, 0x35, 0x95, 0xd0, 0xbd, 0x07, 0x28, 0x36, 0x6a, 0xa3, 0xab, 0xe6, 0xf0, 0x94, 0x8e, 0x5f, 0x5d, 0x01, 0x69, 0xaa, 0x29, 0xd4, 0x8f, 0x9b, 0x69, 0x1a, 0xe6, 0x55, 0x45, 0xad, 0xf6, 0x0c, 0xac, 0x11, 0x3f, 0x0f, 0x47, 0x9d, 0xd0, 0x05, 0xab, 0xdb, 0x15, 0x76, 0xd2, 0x31, 0xf1, 0x8e, 0xcc, 0xc0, 0x0c, 0x1e, 0xb2, 0x8c, 0x6f, 0xe4, 0xdc, 0xdd, 0x4e, 0x0c, 0x53, 0xe6, 0x24, 0xf6, 0x89, 0xa5, 0x06, 0x3a, 0x48, 0x0a, 0x30, 0xea, 0xe9, 0x5b, 0xe5, 0x17, 0xc6, 0xd7, 0x76, 0x96, 0xf2, 0x9a, 0xa0, 0x03, 0x27, 0xc0, 0x1a, 0x07, 0xff, 0xcd, 0x6f, 0xd7, 0x67, 0x4d, 0x0a, 0xfd ],
+const [ 0x3c, 0x5a, 0x85, 0xe4, 0xd4, 0xcc, 0xc1, 0xb8, 0xff, 0x94, 0xc7, 0xc7, 0xaf, 0x30, 0x31, 0x13, 0x6b, 0x58, 0xe1, 0xc7, 0x45, 0x29, 0x94, 0x79, 0x0c, 0x83, 0xba, 0xac, 0xc2, 0xb0, 0x86, 0x99, 0x50, 0x46, 0x41, 0x2f, 0x79, 0x4e, 0xe3, 0x58, 0x0d, 0xa5, 0xe4, 0x7e, 0x5f, 0xa3, 0x50, 0x4e, 0xf8, 0xfb, 0x1a, 0xbb, 0x8d, 0xe2, 0xb2, 0x46, 0x2f, 0x74, 0xd9, 0x7d, 0xc2, 0x53, 0xb5, 0xc2, 0xb0, 0x91, 0x20, 0x4e, 0xdf, 0xd0, 0x46, 0x76, 0xe0, 0xa7, 0x6f, 0x2c, 0x69, 0x48, 0x19, 0xc8, 0x05, 0x60, 0x4a, 0x09, 0x0a, 0x3f, 0x24, 0x56, 0xcb, 0x39, 0xba, 0x4a, 0x10, 0x4c, 0x22, 0x70, 0xc3, 0x03, 0xcc, 0x4b, 0xec, 0x99, 0x11, 0x9a, 0xe0, 0x62, 0x0f, 0xd9, 0xb4, 0x67, 0xb5, 0x0b, 0xf8, 0x50, 0x1a, 0xb7, 0xa2, 0x88, 0x13, 0x31, 0x49, 0x9b, 0x04, 0x1a, 0x94, 0xe3, 0xf6, 0x2a ],
+const [ 0x0e, 0x16, 0xa3, 0xbf, 0x11, 0x59, 0x33, 0x40, 0x3b, 0x17, 0x8e, 0xb5, 0x8a, 0x60, 0x4e, 0xe2, 0x03, 0x39, 0x3a, 0xfc, 0x54, 0xa6, 0x10, 0x60, 0xb8, 0x08, 0x82, 0x85, 0x1b, 0xa9, 0x7e, 0x2f, 0x7f, 0x96, 0xb2, 0xe6, 0x9e, 0xad, 0x50, 0xa7, 0xd0, 0xf6, 0x0e, 0xd9, 0x30, 0x37, 0x72, 0x82, 0xfa, 0xc2, 0x4c, 0xbb, 0x38, 0x92, 0x84, 0x62, 0x9e, 0x96, 0x15, 0x0e, 0xb2, 0x4d, 0x5a, 0x48, 0x30, 0x93, 0x89, 0xf8, 0xac, 0xbb, 0x7d, 0x1d, 0x79, 0xdd, 0xb8, 0xc1, 0xca, 0x71, 0xa8, 0x2d, 0x17, 0x1d, 0x29, 0x59, 0xc2, 0xcc, 0x4c, 0xa6, 0xfb, 0x00, 0x56, 0xcf, 0xe1, 0x69, 0x0c, 0x1d, 0xe9, 0xb6, 0x2e, 0xdb, 0x84, 0xab, 0x42, 0x0a, 0xfc, 0x74, 0x92, 0x56, 0x9f, 0x39, 0x78, 0x48, 0x20, 0xf2, 0xd9, 0xbc, 0x3a, 0x7d, 0xf0, 0x96, 0x96, 0xed, 0x4d, 0xb1, 0xef, 0x26, 0x1d, 0x18 ],
+const [ 0x8c, 0x83, 0x87, 0xf4, 0xae, 0x2c, 0xa1, 0xa6, 0xdd, 0x13, 0xd2, 0x9e, 0x93, 0x58, 0x0b, 0x1c, 0xdf, 0x62, 0x68, 0xda, 0x66, 0xcf, 0x58, 0x9c, 0xa8, 0xb1, 0xff, 0x08, 0x84, 0xf7, 0xd8, 0xb8, 0xfe, 0x29, 0x9f, 0x8e, 0x41, 0x59, 0x6e, 0x47, 0xe0, 0x56, 0x26, 0x53, 0x61, 0x22, 0x10, 0xe4, 0xfc, 0xa6, 0xc4, 0x46, 0xa0, 0xa5, 0x4a, 0x6e, 0x37, 0xef, 0x80, 0xd5, 0x2b, 0xd7, 0xbb, 0x87, 0x29, 0xe6, 0xb1, 0x76, 0x25, 0xd1, 0x97, 0x15, 0x9e, 0xa9, 0x86, 0x22, 0x23, 0x52, 0x23, 0xc3, 0x16, 0x36, 0x7f, 0xd5, 0xb0, 0x3a, 0x3c, 0x81, 0x45, 0xf2, 0xf2, 0x10, 0xc9, 0x10, 0xd0, 0x00, 0x94, 0x23, 0x87, 0x57, 0x62, 0x7e, 0x63, 0x37, 0x9e, 0x75, 0xbb, 0xb3, 0xe0, 0xd0, 0x8c, 0xe1, 0xb4, 0x79, 0x61, 0x30, 0x9d, 0x78, 0x76, 0xfc, 0x59, 0x21, 0x1c, 0x60, 0x67, 0x8c, 0x5f, 0x4c ],
+const [ 0x50, 0xbc, 0xdf, 0x31, 0x38, 0x9e, 0xad, 0xac, 0x5b, 0xb8, 0x19, 0x7e, 0xe9, 0x49, 0xf2, 0x86, 0x4e, 0xde, 0x28, 0x4c, 0x07, 0xd0, 0x39, 0xa0, 0xb4, 0x0e, 0xed, 0x7e, 0x6f, 0x1c, 0x43, 0x35, 0x5d, 0x5c, 0xab, 0xc8, 0x82, 0x8d, 0x75, 0x95, 0xda, 0x91, 0x8a, 0x34, 0xa5, 0x73, 0x5a, 0xa2, 0x02, 0xa8, 0x15, 0x9f, 0xbf, 0x95, 0x1e, 0x54, 0x70, 0x52, 0xbd, 0x39, 0xbe, 0xae, 0x14, 0x36, 0x02, 0x73, 0x54, 0x09, 0x13, 0xeb, 0x30, 0xe7, 0x5b, 0xa2, 0x92, 0x66, 0x31, 0x6e, 0x8d, 0x9a, 0x63, 0xad, 0x94, 0x7e, 0x11, 0xce, 0xe9, 0x96, 0xc2, 0x13, 0x57, 0xd3, 0xb1, 0x94, 0x24, 0xb7, 0x68, 0x88, 0x42, 0xb9, 0x90, 0xc0, 0xc5, 0xeb, 0x08, 0x74, 0x9a, 0xda, 0x34, 0x42, 0x75, 0xb6, 0x98, 0x74, 0x0b, 0xb3, 0xa5, 0x82, 0x82, 0xae, 0xd2, 0xd7, 0x25, 0x14, 0xef, 0xd8, 0x5d, 0x00 ],
+const [ 0x65, 0xbf, 0x93, 0x63, 0x3e, 0x3a, 0x4c, 0xf8, 0x78, 0xdd, 0xb2, 0x1a, 0x5a, 0xa2, 0x67, 0x2f, 0xbe, 0xc6, 0x44, 0xfc, 0x6b, 0xcc, 0x4e, 0xc5, 0x9e, 0xc6, 0xe5, 0xb5, 0xea, 0xd0, 0x3f, 0x80, 0x42, 0xdd, 0x15, 0x46, 0x55, 0xb6, 0x9c, 0xbb, 0x1a, 0x3f, 0xb7, 0x85, 0xab, 0xfc, 0x6b, 0xe5, 0x56, 0xd5, 0x93, 0x9a, 0xf1, 0x16, 0xd5, 0x02, 0x6f, 0xba, 0xd4, 0x83, 0xb1, 0xe9, 0xa7, 0x29, 0x9e, 0xbf, 0x8b, 0x90, 0x76, 0x4f, 0xd4, 0x05, 0x63, 0xe8, 0x2a, 0xe8, 0x52, 0x97, 0xf1, 0x54, 0x00, 0xec, 0x09, 0x03, 0x58, 0x01, 0xb8, 0x6b, 0xfc, 0xb9, 0xe4, 0x2d, 0x22, 0x46, 0x86, 0xb0, 0xa1, 0xee, 0x5b, 0x09, 0x4b, 0x0e, 0xdd, 0x1f, 0x7e, 0x5f, 0x71, 0x0c, 0xf6, 0x78, 0xe2, 0xc6, 0xe5, 0x94, 0x0e, 0xfe, 0x46, 0x96, 0xdf, 0x48, 0x6e, 0x4a, 0x7d, 0x7d, 0xe4, 0xee, 0xc2, 0x5d ],
+const [ 0xcf, 0x72, 0x10, 0xd4, 0x24, 0x0c, 0xbb, 0xa9, 0x5a, 0x86, 0x35, 0xc1, 0xc3, 0x7e, 0xf8, 0xbc, 0x4b, 0xbe, 0xf2, 0xdb, 0xfd, 0xb3, 0x2e, 0x16, 0xc9, 0x22, 0xb0, 0x68, 0x84, 0x16, 0xa1, 0x6e, 0x30, 0x1d, 0xac, 0x30, 0x7e, 0xb3, 0xa7, 0x3f, 0x91, 0xff, 0x76, 0x00, 0x05, 0xbd, 0x2c, 0x47, 0x30, 0x7c, 0x74, 0x27, 0xa7, 0x09, 0x30, 0x09, 0x04, 0x2b, 0x5f, 0xfc, 0xe7, 0x90, 0x44, 0x4c, 0x3b, 0x08, 0xc5, 0x56, 0xbb, 0xf1, 0x11, 0x9a, 0xb4, 0xf2, 0x85, 0x12, 0x0c, 0xed, 0xd1, 0xc3, 0x83, 0x2e, 0x56, 0x91, 0x39, 0xe9, 0xd3, 0x57, 0x71, 0xe3, 0x41, 0x37, 0x94, 0x6f, 0xfb, 0x2f, 0x79, 0x9c, 0x22, 0xed, 0xe3, 0xad, 0x40, 0xe5, 0x4b, 0xc9, 0x2b, 0xa0, 0xe0, 0xf4, 0x2d, 0x57, 0xcd, 0x3e, 0x61, 0xc0, 0xba, 0x3a, 0x60, 0x28, 0x95, 0xb2, 0x1d, 0xc2, 0x92, 0x99, 0x0e, 0x3f ],
+const [ 0x5d, 0x11, 0x8e, 0xbe, 0xeb, 0x1a, 0x97, 0x74, 0x90, 0x10, 0x45, 0xf4, 0xaf, 0x19, 0x39, 0x2c, 0x0a, 0x3f, 0x64, 0x1b, 0x35, 0x16, 0x18, 0x93, 0x4b, 0x9e, 0x65, 0x3d, 0xdf, 0x6a, 0xa2, 0xdd, 0x35, 0x02, 0x4a, 0xd7, 0xb2, 0x87, 0x0a, 0xf3, 0x92, 0x95, 0x17, 0x5d, 0xd9, 0x6d, 0xc5, 0xf0, 0x8c, 0x54, 0x56, 0xb3, 0x20, 0x36, 0x0f, 0xa4, 0x33, 0x8f, 0x92, 0xb5, 0x7a, 0x8c, 0x67, 0x15, 0xfb, 0x6d, 0xdc, 0xb0, 0x7c, 0x2d, 0x0f, 0xf9, 0x3b, 0x65, 0x49, 0xe7, 0xdf, 0x6e, 0x8d, 0x3d, 0xaf, 0xc5, 0x71, 0x0f, 0x02, 0xb4, 0x2d, 0x82, 0xf6, 0x2f, 0xf2, 0xd3, 0x65, 0xfd, 0x7d, 0x9b, 0x15, 0x18, 0xeb, 0x51, 0x2f, 0x55, 0xcf, 0x10, 0xf3, 0x47, 0x82, 0x9a, 0xa9, 0x61, 0xba, 0x9e, 0xdb, 0x5c, 0x5e, 0x36, 0xc1, 0xd8, 0x99, 0xb4, 0xfd, 0x46, 0x2e, 0x9e, 0x89, 0x05, 0x0b, 0xf7 ],
+const [ 0x15, 0x5f, 0x60, 0xad, 0x0a, 0x95, 0xbd, 0xde, 0xde, 0x2a, 0x10, 0xf0, 0xc8, 0x44, 0x7a, 0xcd, 0x23, 0xa5, 0x41, 0xf3, 0x7b, 0x76, 0x80, 0x62, 0xe8, 0x43, 0x1d, 0xb9, 0x9a, 0x48, 0xfc, 0x9c, 0xb6, 0xeb, 0x72, 0x58, 0x61, 0x89, 0xfd, 0xca, 0x19, 0x75, 0x32, 0x7d, 0x4c, 0x3e, 0xf6, 0x12, 0x23, 0x31, 0xf1, 0xe5, 0x9f, 0x1f, 0x40, 0xed, 0xe8, 0x61, 0x6a, 0xe4, 0xe2, 0x18, 0x96, 0xa8, 0x00, 0xb9, 0xfb, 0xe2, 0x5d, 0xca, 0x97, 0xe5, 0x09, 0xe6, 0x24, 0xd9, 0xa0, 0x07, 0x48, 0x18, 0x22, 0x05, 0x0c, 0xd8, 0xfe, 0x59, 0x8f, 0x0b, 0x70, 0x27, 0xfc, 0x83, 0x0d, 0x7c, 0xb9, 0x5a, 0x9d, 0xd4, 0xe1, 0x91, 0x28, 0xdf, 0xf5, 0xf7, 0x54, 0x84, 0xce, 0x4c, 0xee, 0x27, 0xd6, 0xa7, 0xc6, 0x27, 0x78, 0x15, 0xc0, 0xab, 0xd5, 0x83, 0x28, 0x9f, 0xb9, 0xde, 0x46, 0xf9, 0xcd, 0x78 ],
+const [ 0xa5, 0xbd, 0xdb, 0x41, 0x03, 0x51, 0x56, 0x67, 0x08, 0x18, 0xc0, 0x30, 0xd2, 0x89, 0x3f, 0x7e, 0xca, 0x39, 0xa4, 0x29, 0x79, 0x5d, 0xe6, 0xa1, 0x9e, 0x8a, 0xce, 0xd5, 0x7d, 0xc0, 0xf3, 0x53, 0x79, 0xa7, 0xe9, 0xb0, 0xe5, 0x18, 0xb6, 0x2a, 0x18, 0xdf, 0x85, 0x8c, 0xbf, 0xc0, 0x9f, 0x52, 0x78, 0xb8, 0x96, 0x0e, 0x9c, 0x84, 0xc3, 0x0a, 0x5b, 0x68, 0xf3, 0x2f, 0x0f, 0x29, 0x5e, 0x25, 0xca, 0x5b, 0xd9, 0xbc, 0x31, 0xe3, 0x4c, 0x8b, 0x8e, 0xb4, 0x65, 0xd7, 0x20, 0xdc, 0x8e, 0xb6, 0xb6, 0xc4, 0x1d, 0x73, 0x7c, 0xb3, 0xcb, 0x35, 0x14, 0x95, 0x68, 0xdc, 0xe8, 0xfb, 0xcd, 0x2c, 0xbf, 0x62, 0x11, 0x2d, 0x8f, 0xb8, 0x00, 0xd1, 0x92, 0x1c, 0xc8, 0xd8, 0x9c, 0xe6, 0xf6, 0xf1, 0xac, 0xe7, 0xa1, 0x22, 0xc1, 0xf2, 0xe5, 0x69, 0xef, 0x9a, 0x94, 0xa4, 0xb1, 0x3e, 0x27, 0xae ],
+const [ 0x32, 0x80, 0x22, 0x4a, 0x9c, 0x75, 0xf0, 0x1d, 0xa9, 0xfd, 0x8b, 0xef, 0x8b, 0x92, 0x5a, 0x1b, 0x7e, 0x90, 0x16, 0x04, 0xac, 0x8c, 0xd0, 0x06, 0x4e, 0xe8, 0x36, 0xad, 0x15, 0xa4, 0x12, 0x25, 0xc8, 0x77, 0x13, 0xf2, 0x2e, 0x1f, 0xd0, 0xe1, 0x2e, 0xf5, 0x0a, 0x3f, 0x35, 0xc4, 0x31, 0x48, 0xd8, 0xdb, 0x2a, 0xe2, 0xbb, 0x61, 0x50, 0x8c, 0xb1, 0xe9, 0xb9, 0x91, 0x24, 0x46, 0xba, 0x81, 0xb8, 0xa1, 0xad, 0xe1, 0x2b, 0xc9, 0xf1, 0x22, 0x80, 0xc9, 0x33, 0xd0, 0x5c, 0xc0, 0xec, 0x0c, 0xb0, 0xed, 0x2b, 0x3c, 0x98, 0x0a, 0x95, 0x01, 0x83, 0xdb, 0xaa, 0x6a, 0x95, 0x06, 0x4a, 0x67, 0x49, 0x25, 0x77, 0x80, 0x5b, 0x1a, 0x5c, 0xc6, 0xe5, 0xa2, 0x8e, 0x0a, 0xc8, 0x2e, 0x93, 0x4e, 0x4d, 0xee, 0xa1, 0x79, 0x0c, 0x2e, 0xa7, 0x4f, 0x0d, 0xe5, 0x92, 0x9f, 0x2e, 0x8b, 0xc9, 0xbe ],
+const [ 0x01, 0x28, 0x70, 0x16, 0x9a, 0xd7, 0x2e, 0xb3, 0x7a, 0x51, 0xb6, 0x76, 0x59, 0x7a, 0x2a, 0x8c, 0x01, 0x04, 0x46, 0x4f, 0xb3, 0x3f, 0xe6, 0xbd, 0xc6, 0x32, 0xc8, 0x28, 0x91, 0xea, 0x92, 0x2e, 0x8b, 0x12, 0x17, 0xec, 0xb1, 0xc4, 0xd6, 0x6f, 0x28, 0x9f, 0xc3, 0x6b, 0x24, 0x1a, 0x4b, 0x30, 0x08, 0x17, 0x92, 0xd9, 0xcf, 0xbc, 0xff, 0xc7, 0xaa, 0x7e, 0xfa, 0x4e, 0xea, 0x7e, 0xf4, 0xad, 0x21, 0x19, 0xa8, 0x44, 0x84, 0xba, 0xa1, 0x01, 0x94, 0xf3, 0xfd, 0x1c, 0xfe, 0xcd, 0x70, 0x04, 0xbf, 0x5c, 0x8c, 0x99, 0x8b, 0x96, 0x3f, 0x9b, 0x70, 0x65, 0x9d, 0x62, 0xb7, 0xfa, 0xdf, 0xd0, 0x0b, 0x65, 0xac, 0x85, 0xdd, 0x62, 0x98, 0x51, 0x06, 0x76, 0xeb, 0xef, 0xae, 0x3b, 0xa3, 0xf0, 0x6d, 0xf8, 0xbc, 0xf5, 0xb1, 0x75, 0xae, 0x21, 0x60, 0x0e, 0x38, 0xce, 0xbe, 0x05, 0x5c, 0x7f ],
+const [ 0x44, 0x32, 0xf4, 0x3f, 0x1b, 0x00, 0xd3, 0x06, 0xdf, 0xab, 0x2c, 0x2a, 0x24, 0x09, 0xd0, 0x49, 0xe1, 0xc3, 0x0e, 0x89, 0x74, 0x50, 0xd4, 0x2c, 0xe6, 0x24, 0x18, 0x65, 0x71, 0x24, 0x76, 0x6a, 0x3f, 0x5e, 0x1b, 0xcb, 0x75, 0xf7, 0xe1, 0x02, 0x70, 0x64, 0xbb, 0x4b, 0x4e, 0xdd, 0x54, 0xb6, 0xb1, 0x0f, 0xf3, 0x7a, 0xbf, 0x12, 0xa2, 0x8c, 0x6e, 0x9a, 0x8f, 0x70, 0xfe, 0x71, 0xb2, 0x50, 0xc7, 0x25, 0xb0, 0x4b, 0x34, 0xfe, 0x00, 0x0f, 0x10, 0x32, 0x4c, 0xaa, 0x00, 0x5c, 0x1a, 0x9d, 0x51, 0x2b, 0xab, 0x32, 0xf4, 0x57, 0x23, 0x10, 0xc7, 0xda, 0xeb, 0x0d, 0x17, 0x5c, 0x54, 0x43, 0x62, 0xef, 0x7d, 0x66, 0x61, 0xfc, 0x76, 0x55, 0x45, 0x7d, 0xa5, 0xee, 0x42, 0x6d, 0x69, 0x27, 0x4a, 0x7d, 0xfe, 0x5a, 0x1b, 0x09, 0xa1, 0xe1, 0x7b, 0x4a, 0xf4, 0xe3, 0xc2, 0xcd, 0xa3, 0x6d ],
+const [ 0x7a, 0xc3, 0x3a, 0xce, 0x5b, 0x4a, 0x6a, 0x32, 0x92, 0xb7, 0x2d, 0x0d, 0xd4, 0xbd, 0xf8, 0x53, 0x50, 0x9d, 0x9b, 0xdf, 0x87, 0xa5, 0xbc, 0x15, 0x5e, 0xf6, 0x84, 0xc6, 0x71, 0x8b, 0x98, 0x53, 0xab, 0x77, 0x4b, 0x16, 0x14, 0x6e, 0x12, 0xfd, 0xe9, 0x87, 0x38, 0x78, 0xf2, 0x40, 0xd2, 0x96, 0x10, 0xc3, 0xf6, 0x6b, 0x16, 0x68, 0x28, 0xb4, 0xd9, 0x7a, 0x15, 0xbe, 0x8b, 0x3e, 0x84, 0x83, 0x44, 0x31, 0x89, 0x16, 0xe2, 0x92, 0xfb, 0x42, 0x13, 0x20, 0x29, 0x6e, 0xb0, 0x25, 0xc9, 0xc4, 0x4d, 0xb3, 0x31, 0x93, 0x0e, 0x2e, 0xca, 0xf1, 0xbc, 0x0a, 0xc1, 0xa4, 0x17, 0xd6, 0xff, 0x43, 0x6e, 0x7a, 0x5c, 0x98, 0x6e, 0xbd, 0x0f, 0x49, 0x38, 0x0a, 0x69, 0xb7, 0xb6, 0x73, 0xc4, 0x27, 0x2e, 0xf6, 0xb6, 0x20, 0x17, 0xff, 0x8a, 0x13, 0x2c, 0x2f, 0xf0, 0x42, 0xc0, 0x5c, 0xf3, 0xda ],
+const [ 0xf4, 0xd7, 0xa8, 0xf7, 0x38, 0x98, 0xfe, 0x68, 0xc3, 0x98, 0x58, 0x8d, 0xfe, 0x2e, 0x01, 0x92, 0x31, 0x13, 0x1e, 0x19, 0x45, 0x17, 0x90, 0x8c, 0xce, 0x12, 0x1b, 0xb2, 0x49, 0x1e, 0xc7, 0x81, 0xa1, 0x03, 0x86, 0x34, 0xf9, 0xf3, 0x18, 0x9d, 0xa5, 0x78, 0x2c, 0xbb, 0x79, 0xaa, 0xc8, 0x8f, 0x47, 0xa5, 0xea, 0x2c, 0xa3, 0x3a, 0x70, 0x0e, 0xe9, 0xe5, 0x35, 0xac, 0x82, 0xff, 0x7d, 0x50, 0x62, 0x35, 0x93, 0x27, 0xd5, 0x39, 0xb0, 0x94, 0x7c, 0xb7, 0x1f, 0xca, 0x92, 0x8b, 0x9f, 0x9a, 0x74, 0x31, 0x09, 0x89, 0x61, 0x7d, 0x32, 0x26, 0x7e, 0x8c, 0x13, 0x9b, 0x1d, 0xfa, 0x27, 0x81, 0x3e, 0x55, 0x15, 0xf9, 0x56, 0xd2, 0x8f, 0xf8, 0x50, 0x3f, 0x7a, 0xe2, 0xd2, 0x39, 0x4f, 0x5b, 0xc1, 0x9f, 0xc1, 0x5a, 0x07, 0x47, 0xa0, 0x7e, 0x94, 0xef, 0xfd, 0xa6, 0xa2, 0x76, 0x8f, 0xbc ],
+const [ 0x50, 0x4c, 0xca, 0xaa, 0xf0, 0x9c, 0x8e, 0x8a, 0x0c, 0x56, 0x7a, 0xb7, 0xf1, 0xa1, 0xec, 0xa7, 0x8e, 0xbf, 0xed, 0xce, 0xd9, 0xe3, 0xb7, 0x12, 0x6e, 0x43, 0x75, 0x7e, 0x79, 0x6f, 0x49, 0x3a, 0xd7, 0xe1, 0x93, 0xbb, 0x78, 0xd5, 0x71, 0x37, 0x08, 0x5b, 0x82, 0x5c, 0xce, 0xaa, 0xf0, 0x41, 0xd4, 0xb7, 0xad, 0x9d, 0x48, 0x06, 0xfc, 0x37, 0x22, 0xc0, 0x34, 0x9d, 0x07, 0x07, 0xc0, 0x19, 0x6d, 0x86, 0x6b, 0xe1, 0x01, 0x4c, 0xdb, 0x8e, 0x45, 0xda, 0x5a, 0xcf, 0x7e, 0x7a, 0xdd, 0x5f, 0xcd, 0xd3, 0x3e, 0x34, 0x9c, 0xbb, 0xcd, 0xfa, 0x3b, 0x4c, 0x07, 0xbf, 0xcb, 0x3a, 0xa5, 0xf0, 0x5c, 0x63, 0xd9, 0x84, 0x52, 0xa8, 0xd4, 0x77, 0x0d, 0xfc, 0x8b, 0x7a, 0xc9, 0xba, 0xbb, 0xe9, 0xc2, 0x3c, 0x2a, 0xfd, 0x9c, 0xa9, 0x31, 0x43, 0x03, 0x0e, 0x77, 0x4c, 0x8f, 0xb1, 0xff, 0xa6 ],
+const [ 0x74, 0x16, 0xef, 0x51, 0xd9, 0xee, 0x97, 0x10, 0xb8, 0x3b, 0x2f, 0x0b, 0xba, 0x93, 0x45, 0xaa, 0x7c, 0xb4, 0xf4, 0xab, 0x8f, 0x73, 0x08, 0xba, 0xc4, 0xf6, 0x62, 0x42, 0xa6, 0x23, 0x9f, 0x82, 0x47, 0x58, 0xf4, 0xe3, 0x40, 0x5d, 0x5c, 0x89, 0xf3, 0x97, 0xf6, 0x28, 0x13, 0x7e, 0xa8, 0x19, 0x67, 0x51, 0x09, 0xad, 0xca, 0x08, 0x7e, 0xc1, 0x77, 0x8a, 0xa3, 0x92, 0x83, 0x20, 0xec, 0xd3, 0xab, 0x29, 0x8c, 0xfd, 0x50, 0x10, 0x95, 0xe7, 0xc0, 0x7c, 0x61, 0x96, 0xb7, 0xc6, 0x32, 0x56, 0x26, 0xb0, 0x15, 0x09, 0x32, 0x54, 0x0c, 0xc0, 0x80, 0x5a, 0x6b, 0x88, 0xb0, 0x6e, 0x83, 0x87, 0x27, 0xf1, 0x7e, 0x47, 0x12, 0xef, 0x8a, 0x51, 0xa7, 0x52, 0x3a, 0xfe, 0xae, 0x55, 0x28, 0x8a, 0x41, 0x3b, 0xe0, 0x6a, 0xd0, 0x40, 0xf9, 0xdf, 0x68, 0xd0, 0x85, 0xcc, 0x34, 0xf7, 0xac, 0xc5 ],
+const [ 0x0c, 0x69, 0x08, 0xb5, 0x05, 0x3e, 0x85, 0x8b, 0xd9, 0x01, 0xc1, 0x8b, 0xfe, 0x5f, 0x85, 0xe7, 0x33, 0x28, 0x30, 0x14, 0x65, 0xa5, 0xb6, 0xc2, 0xd4, 0x2d, 0xe9, 0x11, 0x72, 0xf3, 0xf7, 0x02, 0x8b, 0x22, 0x34, 0x2b, 0xab, 0x2c, 0x1a, 0xb0, 0xbd, 0x5e, 0x8e, 0x6e, 0x70, 0xb9, 0x65, 0x79, 0xdf, 0xfd, 0x27, 0xc9, 0x70, 0x06, 0x13, 0x30, 0xfc, 0x5b, 0x63, 0x8f, 0x31, 0x05, 0xd1, 0x4a, 0x35, 0x9d, 0x59, 0xf9, 0x8c, 0xa9, 0x41, 0x61, 0x3c, 0x29, 0x57, 0xa2, 0x2f, 0x6c, 0x7a, 0xb1, 0xd8, 0x28, 0x5b, 0x09, 0x1a, 0xca, 0x85, 0x9e, 0x65, 0x0b, 0x9b, 0x13, 0x22, 0xc4, 0xe1, 0x2c, 0x51, 0x03, 0xfe, 0x86, 0x70, 0x5e, 0x01, 0x86, 0x9f, 0x87, 0xa1, 0x8f, 0x03, 0x21, 0xc9, 0x78, 0x68, 0xd2, 0x54, 0x3d, 0x2a, 0x9a, 0x15, 0xf4, 0x55, 0x63, 0x1a, 0x03, 0x0b, 0xd9, 0x31, 0x91 ],
+const [ 0x07, 0x35, 0x5a, 0xc8, 0x18, 0xce, 0x6b, 0x46, 0xd3, 0x41, 0x63, 0xae, 0xec, 0x45, 0xab, 0x17, 0x2d, 0x4b, 0x85, 0x0b, 0x0d, 0xbb, 0x42, 0xe6, 0x83, 0x81, 0xb6, 0x7f, 0x1c, 0xc8, 0xe9, 0x0a, 0x4c, 0x05, 0x0f, 0x3d, 0x01, 0x38, 0xba, 0xb2, 0x7e, 0x6f, 0x4f, 0x8d, 0x67, 0x8b, 0xb6, 0x5e, 0x18, 0x46, 0x56, 0x49, 0x3b, 0x75, 0x41, 0x64, 0x9a, 0x8b, 0xab, 0x60, 0x31, 0x5f, 0xa1, 0x6c, 0x88, 0x2f, 0xf8, 0x56, 0x40, 0xe4, 0x83, 0xf3, 0xeb, 0x97, 0x89, 0xc2, 0x21, 0x55, 0x75, 0xcc, 0xd0, 0x1f, 0xd0, 0xce, 0xd3, 0x35, 0x6d, 0x9a, 0xc6, 0x95, 0xe3, 0xbb, 0x19, 0xbe, 0x40, 0x58, 0x64, 0xb9, 0xfc, 0x5b, 0xfa, 0x5a, 0x2c, 0xd1, 0xc1, 0xc4, 0xf8, 0x94, 0x41, 0x2b, 0x4f, 0x28, 0xfa, 0xde, 0xda, 0xe4, 0xfb, 0x84, 0x2e, 0x52, 0xb0, 0xa5, 0x45, 0xd8, 0xfc, 0x6d, 0x2f, 0x97 ],
+const [ 0x17, 0x92, 0x59, 0x52, 0xaf, 0x30, 0x95, 0x9b, 0x1a, 0x5a, 0x13, 0x6f, 0xf1, 0x1b, 0x3d, 0xe1, 0x0d, 0xb6, 0xe4, 0xce, 0xe1, 0x9f, 0x31, 0x08, 0x0d, 0xcb, 0xde, 0xb4, 0x31, 0x29, 0xa5, 0xf1, 0xff, 0x71, 0xf9, 0xbb, 0x95, 0x1c, 0xf5, 0x0e, 0x09, 0xb3, 0x92, 0x4e, 0x45, 0x4d, 0x1c, 0xe6, 0x15, 0x54, 0xe7, 0x30, 0x7e, 0x87, 0x3e, 0x95, 0x52, 0x45, 0x9c, 0xf5, 0x01, 0x08, 0x1f, 0x48, 0xb2, 0x30, 0x39, 0x86, 0x92, 0x02, 0xa9, 0xc5, 0x6c, 0xf0, 0xa9, 0xa1, 0x7b, 0x1a, 0x69, 0xe1, 0x7c, 0x16, 0xbd, 0x58, 0x06, 0xec, 0x12, 0x08, 0x1e, 0x65, 0xa7, 0x8e, 0x07, 0x86, 0xfa, 0xba, 0x57, 0x57, 0x80, 0x7d, 0x50, 0xe9, 0x98, 0x08, 0x6c, 0x96, 0xc2, 0x32, 0x3a, 0x8b, 0x0c, 0x1a, 0x69, 0x84, 0xce, 0x0e, 0x22, 0xd7, 0x97, 0xac, 0x9c, 0xb4, 0x67, 0x47, 0xea, 0xab, 0x1f, 0x8d ],
+const [ 0x00, 0xbd, 0x47, 0xd7, 0x52, 0x53, 0x29, 0x88, 0x75, 0x84, 0x06, 0xe3, 0xcf, 0x71, 0x8b, 0xaf, 0x9b, 0xb9, 0xed, 0x1b, 0xe0, 0x9a, 0x80, 0xfe, 0x9f, 0x59, 0x86, 0x63, 0x51, 0xe4, 0x44, 0x45, 0x91, 0xb7, 0x5c, 0x97, 0x15, 0xfc, 0x56, 0x88, 0xe2, 0xf6, 0x80, 0x04, 0xc0, 0x9f, 0xf8, 0x7e, 0xec, 0x90, 0x07, 0xed, 0x0e, 0x22, 0xb0, 0x14, 0x6a, 0xd3, 0x89, 0x07, 0x5a, 0xeb, 0xca, 0xeb, 0xfc, 0x5f, 0xa4, 0xfd, 0x28, 0xf5, 0xd4, 0xd6, 0xa5, 0xa9, 0x77, 0xed, 0x9c, 0x4f, 0x20, 0x5d, 0x4c, 0x7b, 0x28, 0xe8, 0x00, 0x9e, 0x45, 0x3c, 0x3e, 0x71, 0x5e, 0x76, 0x42, 0x97, 0x9e, 0xe5, 0xab, 0x7e, 0xc8, 0x10, 0x73, 0x86, 0xca, 0xfa, 0x24, 0x65, 0x94, 0xa4, 0x49, 0xca, 0x2a, 0xd4, 0x23, 0x40, 0xf8, 0x15, 0x9e, 0x55, 0x67, 0xff, 0x83, 0xfc, 0xad, 0xb8, 0xef, 0x31, 0xe9, 0xbb ],
+const [ 0xca, 0x7e, 0x27, 0x51, 0x13, 0xfa, 0xea, 0x9f, 0xa7, 0x09, 0xa4, 0xff, 0x19, 0x3b, 0xb0, 0x35, 0xae, 0x19, 0x85, 0xa5, 0xc9, 0xc3, 0xd3, 0x16, 0xa6, 0xd8, 0xcf, 0xb7, 0x4b, 0x96, 0xca, 0x5f, 0xbc, 0x43, 0x09, 0x19, 0x6f, 0xcb, 0xd1, 0xe0, 0xff, 0xaa, 0xc1, 0xa7, 0x24, 0x0c, 0x65, 0x9d, 0xe3, 0x33, 0x07, 0xae, 0x02, 0x1a, 0xc8, 0x4d, 0xbf, 0x58, 0xf0, 0x71, 0xc2, 0x46, 0x83, 0xdd, 0x4f, 0x64, 0x15, 0xa5, 0xc0, 0xf9, 0xde, 0xee, 0x33, 0xfa, 0x11, 0xf5, 0x80, 0x2d, 0x6a, 0x53, 0x6e, 0x8e, 0x06, 0x7f, 0x26, 0xf2, 0x78, 0x94, 0xe7, 0xea, 0x19, 0x54, 0xfc, 0xea, 0x9f, 0x6d, 0xeb, 0xab, 0xf2, 0xfc, 0xf0, 0xcd, 0x3b, 0x50, 0xa9, 0xc1, 0x3d, 0xf0, 0x13, 0xe6, 0xe8, 0xdf, 0xb5, 0xf2, 0x2b, 0x1e, 0x1b, 0x94, 0x0b, 0x73, 0x86, 0x58, 0xf2, 0x69, 0xe2, 0xca, 0x49, 0x98 ],
+const [ 0xf2, 0x11, 0xcb, 0xcb, 0xf3, 0xf7, 0xa9, 0xc4, 0x89, 0xeb, 0xe8, 0xf7, 0x69, 0x22, 0xfa, 0xd5, 0xcd, 0x3d, 0x0f, 0xa6, 0x6b, 0x6e, 0x9f, 0xd0, 0xa4, 0xdd, 0x42, 0x56, 0xff, 0x4a, 0xc8, 0x9f, 0xd5, 0xf3, 0x86, 0x79, 0x4e, 0xb8, 0xee, 0x5d, 0x8c, 0x7d, 0x63, 0xf5, 0x25, 0xd0, 0x4b, 0xdb, 0xd7, 0xcb, 0x65, 0xa4, 0x77, 0x3c, 0x5c, 0x1d, 0x2b, 0x04, 0x9d, 0xd4, 0xd9, 0xbd, 0x66, 0xda, 0xdf, 0xa0, 0x20, 0xc8, 0x05, 0xa5, 0xef, 0x00, 0xaf, 0xeb, 0x87, 0x35, 0x58, 0x5b, 0x41, 0x2e, 0x3b, 0x89, 0x6e, 0xc6, 0x53, 0xda, 0xeb, 0x38, 0x86, 0xec, 0xf6, 0x99, 0x1e, 0x32, 0x3f, 0xa6, 0x78, 0xdf, 0x42, 0xc0, 0x00, 0x06, 0xd5, 0x35, 0x5d, 0xff, 0xfd, 0xc1, 0xe8, 0x0c, 0x06, 0x55, 0x63, 0x3c, 0xd3, 0x16, 0xe8, 0x90, 0x72, 0xa9, 0x1f, 0x5d, 0xf3, 0xae, 0xb4, 0xf1, 0x7b, 0x8a ],
+const [ 0xdc, 0x59, 0xa9, 0xd3, 0xb6, 0xd8, 0x46, 0xf0, 0xc7, 0xb2, 0xce, 0x52, 0xeb, 0xa3, 0x1d, 0x3b, 0xf1, 0x92, 0x91, 0x5e, 0x4c, 0x72, 0x60, 0xe7, 0x0b, 0x66, 0x2f, 0xbc, 0x0c, 0x28, 0xe0, 0x02, 0x6c, 0xab, 0xab, 0xe4, 0x41, 0xff, 0x70, 0x8f, 0x8c, 0x76, 0x4b, 0x81, 0x69, 0x05, 0x6a, 0x04, 0x89, 0xec, 0x1b, 0xf5, 0xe2, 0x99, 0x29, 0xca, 0xa5, 0xca, 0x69, 0xd4, 0x71, 0xf3, 0x90, 0xc0, 0xc6, 0xdf, 0x47, 0x64, 0xbc, 0x99, 0x82, 0xb9, 0xf5, 0x8d, 0x0d, 0x23, 0xd0, 0xeb, 0x67, 0xf9, 0xdf, 0x4c, 0xd4, 0x41, 0x9c, 0x98, 0xae, 0xbb, 0x57, 0x27, 0xfc, 0x22, 0x73, 0x26, 0x46, 0xae, 0xd2, 0x3d, 0xa7, 0xdd, 0x8e, 0x6e, 0x23, 0x73, 0xea, 0x41, 0x3b, 0xbf, 0x88, 0x1e, 0xbf, 0x21, 0xdc, 0xfa, 0xe4, 0xc9, 0xe0, 0x36, 0x96, 0xc1, 0x09, 0xc3, 0x0f, 0x2e, 0x7a, 0x8b, 0xa9, 0xd3 ],
+const [ 0x62, 0xe2, 0xa7, 0x3b, 0xc7, 0x7a, 0xc8, 0x5b, 0x1a, 0xa8, 0x12, 0x46, 0x3d, 0xce, 0x29, 0xa0, 0x97, 0xcf, 0x3c, 0x69, 0x73, 0xd9, 0x8b, 0x76, 0xa2, 0x82, 0x26, 0x22, 0x68, 0x17, 0xf7, 0x41, 0x96, 0x30, 0x02, 0x55, 0xf3, 0x88, 0xec, 0x05, 0xe0, 0x0c, 0xba, 0xca, 0x3c, 0x32, 0xdc, 0xec, 0x86, 0x8c, 0x6a, 0xad, 0x41, 0x9d, 0xad, 0xc3, 0x9d, 0xeb, 0xe1, 0x0c, 0x53, 0x55, 0x39, 0x7e, 0xd1, 0xa7, 0x24, 0x5d, 0x97, 0x6c, 0xcf, 0xb0, 0xe1, 0x04, 0xeb, 0xf5, 0x86, 0xf6, 0xb0, 0x14, 0x20, 0x87, 0x22, 0x92, 0x6d, 0x8b, 0x93, 0x07, 0xf5, 0x7b, 0x69, 0xd2, 0xed, 0xc8, 0x21, 0x0b, 0x5c, 0x6f, 0x94, 0xb9, 0x7c, 0xce, 0x79, 0x45, 0x63, 0xb5, 0x2c, 0x2f, 0xe2, 0xc1, 0xae, 0x00, 0xae, 0xe5, 0xec, 0x80, 0xbd, 0x4a, 0x44, 0x28, 0xf3, 0x59, 0x45, 0xda, 0xfe, 0x16, 0xb6, 0xd0 ],
+const [ 0x34, 0x57, 0x6c, 0xe2, 0xcb, 0xe2, 0x17, 0x3b, 0xf4, 0x0d, 0xe2, 0x30, 0x50, 0x85, 0x1a, 0xed, 0x2f, 0xe7, 0x34, 0x1f, 0x56, 0x78, 0xb3, 0x4f, 0x00, 0x15, 0x4d, 0x6e, 0x22, 0x6d, 0x49, 0xb1, 0xf3, 0x6d, 0x2b, 0x9f, 0xac, 0xfc, 0x93, 0x68, 0x8c, 0xe9, 0x63, 0x78, 0x20, 0x21, 0x20, 0x4c, 0xc1, 0x26, 0x9b, 0x84, 0x5e, 0xbc, 0xd0, 0x3a, 0x7c, 0xe6, 0x0e, 0x93, 0x7a, 0x10, 0x58, 0x93, 0x1a, 0x8e, 0x0c, 0x36, 0x3d, 0x45, 0xc2, 0xbc, 0xee, 0xa8, 0x77, 0x44, 0xa2, 0xe7, 0xeb, 0x9c, 0xbe, 0x62, 0x47, 0x58, 0x5a, 0x64, 0x03, 0x21, 0x45, 0x0e, 0x07, 0x50, 0x49, 0x91, 0x10, 0xbc, 0xb0, 0xa1, 0x56, 0xcf, 0x06, 0x26, 0x6c, 0xe0, 0x21, 0x34, 0x67, 0xbc, 0x5f, 0x3d, 0x42, 0x86, 0x2f, 0x85, 0x81, 0xc2, 0xd3, 0xd7, 0x15, 0xac, 0x64, 0x77, 0x80, 0xce, 0x16, 0x57, 0x39, 0xd1 ],
+const [ 0xc8, 0xce, 0x98, 0x13, 0xcc, 0x18, 0xff, 0x5a, 0xc3, 0x09, 0xea, 0x9e, 0x2a, 0x79, 0xe5, 0x09, 0x13, 0x87, 0xa2, 0x58, 0xd2, 0x81, 0x4a, 0xe1, 0xfa, 0x05, 0x11, 0xd4, 0x88, 0x66, 0x0d, 0xc1, 0x5d, 0x51, 0x48, 0x5a, 0xf2, 0xb1, 0x14, 0x7b, 0x47, 0xcf, 0x9e, 0x67, 0x1c, 0xbe, 0xc6, 0x55, 0x64, 0xf6, 0x2e, 0x2b, 0xf7, 0x3f, 0x91, 0x89, 0x87, 0xd1, 0x57, 0x09, 0xd5, 0xb9, 0x66, 0xc5, 0x24, 0x7e, 0x3a, 0x1a, 0xee, 0x05, 0x38, 0xac, 0xd7, 0xb2, 0x3f, 0xaa, 0xdf, 0xd0, 0x81, 0x54, 0xdb, 0x33, 0x91, 0xba, 0x26, 0x1b, 0xbc, 0xc6, 0x94, 0x5c, 0x9d, 0x7c, 0xa7, 0xbc, 0xec, 0x81, 0x06, 0x9d, 0x97, 0xda, 0x2a, 0xdc, 0x14, 0xf7, 0x5b, 0xf8, 0xf5, 0xf0, 0xdb, 0x77, 0xbd, 0x0e, 0x61, 0x85, 0xf2, 0x8d, 0xc8, 0xdf, 0x73, 0xa0, 0x09, 0xef, 0x0c, 0xb6, 0x67, 0x38, 0x48, 0xfc ],
+const [ 0xc4, 0xc4, 0x5c, 0xc2, 0x35, 0x59, 0x23, 0x17, 0x74, 0x1f, 0x8e, 0xe2, 0x32, 0xcf, 0xfc, 0x52, 0xe9, 0xcd, 0xd8, 0x7d, 0x6f, 0x66, 0xc9, 0xba, 0xcc, 0x56, 0x28, 0x4b, 0x49, 0x8e, 0xb7, 0x40, 0xc9, 0x34, 0x90, 0x97, 0x5c, 0xea, 0x5b, 0xa8, 0x12, 0x53, 0xc4, 0xc1, 0x0d, 0xd3, 0x2d, 0x0d, 0xda, 0x97, 0x9f, 0xba, 0x02, 0xd6, 0x07, 0x5a, 0xdb, 0x56, 0x9f, 0x8a, 0xa4, 0x31, 0xaa, 0xd2, 0xd1, 0xd9, 0x64, 0xcd, 0xa4, 0x5a, 0x39, 0x8a, 0xfd, 0xdf, 0x35, 0x31, 0x73, 0x78, 0xbc, 0xea, 0xa3, 0x1a, 0x7b, 0xfa, 0xc8, 0xe8, 0x9e, 0x2f, 0x8d, 0xb0, 0x43, 0x7f, 0x1f, 0xb9, 0x2f, 0xec, 0x85, 0xbc, 0xc0, 0xab, 0x34, 0x30, 0x23, 0x84, 0xde, 0xca, 0xc7, 0x7c, 0x8c, 0x45, 0x12, 0xb2, 0xec, 0x5f, 0x52, 0x87, 0xec, 0x24, 0xf6, 0x01, 0x87, 0x6e, 0xfe, 0x72, 0xdf, 0xad, 0xb0, 0x54 ],
+const [ 0x2c, 0x86, 0x98, 0x31, 0x69, 0x63, 0x81, 0x34, 0x68, 0x90, 0xbd, 0x7b, 0xe4, 0x6d, 0x79, 0x8e, 0x15, 0xdd, 0x5c, 0x88, 0x79, 0xfa, 0x6b, 0x6d, 0xd4, 0x07, 0x2a, 0xbe, 0x76, 0xa5, 0x04, 0x4b, 0xbc, 0x4a, 0xed, 0x49, 0xd9, 0xf0, 0x46, 0xa4, 0xd6, 0x0a, 0x01, 0x97, 0xd8, 0xbc, 0x05, 0x79, 0xa2, 0x4b, 0xd4, 0xda, 0x5a, 0xd3, 0x6b, 0xce, 0x90, 0x38, 0x6a, 0x89, 0x7c, 0x5e, 0x74, 0x2c, 0x87, 0x9d, 0xd9, 0xdf, 0x0e, 0x6f, 0x72, 0x20, 0x62, 0x6c, 0xcd, 0x5a, 0x13, 0x79, 0x8a, 0xba, 0x6e, 0x3c, 0x05, 0x3e, 0x44, 0xd3, 0x36, 0x0f, 0xed, 0xc5, 0xd5, 0x10, 0x8d, 0x38, 0xc1, 0xb7, 0x96, 0x65, 0xa2, 0x1c, 0x8e, 0x4a, 0xcd, 0x4f, 0x13, 0x9e, 0x69, 0xef, 0x1c, 0x0a, 0xd0, 0xf8, 0x81, 0x96, 0x38, 0xdd, 0xbe, 0x62, 0x93, 0xd7, 0xf4, 0x96, 0xb4, 0x7c, 0x30, 0x9b, 0xb2, 0x93 ],
+const [ 0x00, 0x8c, 0xfd, 0x9f, 0x49, 0x4b, 0x35, 0xd9, 0x37, 0xef, 0x3e, 0x1d, 0x8d, 0xbf, 0x95, 0x01, 0x5f, 0x12, 0x84, 0xbd, 0xd2, 0x06, 0xff, 0x82, 0x23, 0x75, 0xcd, 0x0d, 0xeb, 0x25, 0xe8, 0x7b, 0xa1, 0x3f, 0x25, 0x5f, 0x60, 0x03, 0x17, 0x12, 0xea, 0xb9, 0x31, 0x4a, 0xee, 0xeb, 0x2c, 0xee, 0x86, 0xd1, 0xa8, 0x29, 0x04, 0x0d, 0x16, 0xbe, 0xee, 0x99, 0xd5, 0x9b, 0x47, 0xfd, 0x9b, 0xb0, 0x10, 0xc5, 0x17, 0x01, 0x0f, 0x32, 0xd5, 0xfa, 0xcf, 0x30, 0x61, 0x03, 0xe8, 0x88, 0xaf, 0x55, 0x80, 0x57, 0xba, 0x0c, 0x12, 0xbf, 0x6c, 0x7d, 0x6f, 0xdc, 0xbe, 0xc9, 0x02, 0xf9, 0x20, 0xb3, 0x57, 0x04, 0x1b, 0xae, 0xdf, 0x40, 0x35, 0x3a, 0xed, 0x3a, 0x15, 0x71, 0x05, 0xfe, 0xe7, 0xdd, 0x56, 0x8a, 0x02, 0x8d, 0x85, 0x83, 0xc8, 0x68, 0xac, 0x27, 0xce, 0xc1, 0xa3, 0x83, 0x3e, 0x2b ],
+const [ 0x07, 0x12, 0x8b, 0xc2, 0xe3, 0x1d, 0xcb, 0x22, 0xaa, 0x5b, 0x9f, 0x3e, 0xd1, 0xb8, 0x52, 0x04, 0x1d, 0x36, 0xf0, 0x22, 0x16, 0x8f, 0x59, 0xca, 0xb9, 0x1c, 0x95, 0xb2, 0x6d, 0xf5, 0x67, 0x60, 0x38, 0x5a, 0x25, 0xa4, 0x33, 0x51, 0xc6, 0x66, 0x3b, 0x91, 0x3d, 0xa1, 0xea, 0x9f, 0x06, 0xb0, 0xc5, 0x37, 0xfe, 0xc9, 0xb7, 0xed, 0x77, 0xc7, 0xbf, 0x14, 0x8c, 0x2c, 0xe5, 0xdf, 0xb2, 0x66, 0x72, 0xc6, 0x90, 0x51, 0x60, 0x2b, 0x11, 0xfe, 0x10, 0x3e, 0xb7, 0xb3, 0x3b, 0x1e, 0x32, 0x32, 0x2b, 0x41, 0x31, 0x3e, 0x2b, 0x15, 0x78, 0x5c, 0x3c, 0xe7, 0x32, 0xd7, 0x09, 0x05, 0x89, 0x06, 0x1d, 0x1f, 0x75, 0xd1, 0x54, 0xf3, 0xd1, 0x72, 0x8f, 0x2a, 0xb4, 0x79, 0xac, 0x7c, 0xfe, 0x13, 0xb6, 0x1b, 0x31, 0x8b, 0x58, 0x4f, 0x83, 0x11, 0x98, 0x5d, 0x31, 0xbb, 0xc2, 0xae, 0x15, 0xc9 ],
+const [ 0x58, 0xdb, 0xed, 0x97, 0xe8, 0x35, 0xff, 0x41, 0x8e, 0x9b, 0x06, 0xc0, 0x94, 0x3d, 0x43, 0xe2, 0xe3, 0x72, 0x7e, 0xdf, 0x23, 0x50, 0x4b, 0x8b, 0x24, 0x79, 0x8c, 0xd0, 0x7d, 0x37, 0x37, 0x5c, 0x73, 0xcc, 0x59, 0x97, 0x1c, 0x03, 0x5b, 0xd8, 0xc4, 0x0b, 0x84, 0xd8, 0x8f, 0x85, 0xc0, 0x67, 0x60, 0xdc, 0xa0, 0x5d, 0xfa, 0xd5, 0xa1, 0xd4, 0x65, 0x67, 0xb1, 0x94, 0x94, 0xcc, 0xef, 0xcf, 0x44, 0xd8, 0xb3, 0x0f, 0x27, 0x8a, 0xce, 0x6c, 0x42, 0xe1, 0x13, 0x02, 0x93, 0xf0, 0x16, 0xa2, 0xf8, 0x35, 0x33, 0xc8, 0x4c, 0x27, 0xd2, 0xcd, 0xd3, 0x0e, 0xea, 0x5e, 0xd8, 0x17, 0xc4, 0x2d, 0x94, 0xa8, 0x02, 0xe6, 0x52, 0xf1, 0xdf, 0x65, 0xd1, 0xc4, 0xb8, 0x26, 0xea, 0xa6, 0xcc, 0xfd, 0x72, 0x26, 0x40, 0x07, 0x62, 0x6d, 0x66, 0xe0, 0x35, 0x17, 0x3e, 0x16, 0x92, 0x41, 0x3d, 0xde ],
+const [ 0x10, 0xae, 0x29, 0xe7, 0x8a, 0xbb, 0xd1, 0xc4, 0xba, 0x1a, 0x24, 0xbc, 0x41, 0x7b, 0x61, 0x22, 0xf5, 0xe9, 0xb8, 0x76, 0x28, 0xfd, 0xb0, 0x38, 0x2e, 0x51, 0xc6, 0xfa, 0x19, 0x38, 0x56, 0xb9, 0xc7, 0xac, 0xbf, 0x6d, 0x1f, 0x88, 0xc3, 0xdf, 0x97, 0xf8, 0x2c, 0xbb, 0xf9, 0x2d, 0xb5, 0xe6, 0x68, 0x55, 0x27, 0x11, 0x9e, 0xca, 0xc3, 0x8f, 0x77, 0x89, 0xe0, 0x63, 0xb3, 0xe7, 0xd5, 0x9e, 0xf7, 0x7f, 0x19, 0xe8, 0x16, 0x6f, 0xa9, 0x5c, 0x8f, 0xc4, 0xaa, 0x99, 0x57, 0x32, 0x50, 0x15, 0xd8, 0x09, 0xfe, 0xb5, 0x39, 0x64, 0xaf, 0x9b, 0xe0, 0xa3, 0x94, 0x40, 0x35, 0x1c, 0xfe, 0xc2, 0xa9, 0x0e, 0x7f, 0x7f, 0xf8, 0xd6, 0x4c, 0xe2, 0xaa, 0x66, 0xe6, 0x7d, 0xe0, 0xf2, 0xfa, 0x58, 0x4d, 0xec, 0x85, 0x89, 0x83, 0x33, 0x3b, 0x05, 0x70, 0x88, 0x2a, 0xb6, 0x28, 0x41, 0x9b, 0xce ],
+const [ 0x33, 0xfc, 0xb8, 0xef, 0xf4, 0x17, 0x86, 0x63, 0x44, 0x63, 0x2d, 0x0f, 0x9e, 0x81, 0x98, 0xc4, 0xdb, 0xee, 0x1c, 0x13, 0x9e, 0xda, 0xfe, 0xbd, 0xef, 0x37, 0x35, 0x6b, 0x26, 0x10, 0x72, 0x9f, 0x0b, 0x1c, 0x5e, 0xeb, 0x3b, 0x93, 0x22, 0x61, 0xce, 0x40, 0x2d, 0x4a, 0x36, 0xd8, 0x31, 0x1b, 0x6a, 0x8a, 0x6f, 0xa4, 0x45, 0xd7, 0x35, 0x8b, 0x28, 0xa4, 0xa5, 0xf9, 0xe7, 0x8d, 0xb7, 0x93, 0xe3, 0x7d, 0x82, 0xac, 0x73, 0x7b, 0xb7, 0xb8, 0x89, 0xc7, 0x6e, 0x04, 0x92, 0x26, 0x25, 0xa5, 0x9d, 0x7a, 0x05, 0xaf, 0xc0, 0x95, 0x68, 0xa7, 0xb7, 0x4f, 0x99, 0x3a, 0xcf, 0xd6, 0xda, 0x2e, 0x03, 0x46, 0xac, 0x9a, 0x64, 0x7a, 0x4a, 0x52, 0xbe, 0x21, 0x77, 0xa6, 0x78, 0x14, 0x79, 0x4c, 0xbc, 0xe7, 0x66, 0x9a, 0xd8, 0xbd, 0x9e, 0xf8, 0xe4, 0x61, 0x99, 0x96, 0xa5, 0x93, 0xe3, 0x5a ],
+const [ 0x90, 0xa0, 0x2b, 0xc5, 0xf2, 0x6d, 0x2c, 0xcc, 0x03, 0x0b, 0x15, 0x03, 0xc6, 0xc7, 0x12, 0xb8, 0xe6, 0xef, 0x4b, 0x41, 0xec, 0x33, 0xb8, 0x87, 0xb4, 0x51, 0x37, 0xc1, 0x22, 0xf2, 0xdc, 0x82, 0x11, 0xce, 0x88, 0xf6, 0x8c, 0x17, 0xbd, 0x68, 0x41, 0x15, 0xb0, 0x08, 0x32, 0x0e, 0xa0, 0xec, 0xae, 0x68, 0x67, 0x54, 0x80, 0x11, 0x4f, 0x32, 0x66, 0x1f, 0x26, 0xea, 0xc5, 0xb4, 0x95, 0x56, 0x9a, 0x25, 0xad, 0x0d, 0xb4, 0x5b, 0xc3, 0xe5, 0x21, 0x79, 0x7e, 0xb6, 0xe6, 0xbe, 0x2e, 0x61, 0xf3, 0xae, 0x5f, 0x11, 0x55, 0x6c, 0xaf, 0xc1, 0xae, 0x6b, 0xdc, 0xff, 0xe2, 0x45, 0x21, 0xef, 0x14, 0xeb, 0xc3, 0x92, 0xd1, 0xff, 0xe7, 0x48, 0x8a, 0x7e, 0xa6, 0x94, 0x48, 0xa2, 0x63, 0x20, 0x9b, 0x07, 0x5c, 0x01, 0xd3, 0x0c, 0x80, 0x3b, 0x73, 0x7c, 0x81, 0x88, 0xe3, 0x6e, 0x29, 0x55 ],
+const [ 0xae, 0x38, 0x97, 0xb9, 0x02, 0xc4, 0x99, 0xfa, 0xa6, 0xe5, 0x4f, 0xcf, 0x88, 0x64, 0xae, 0x65, 0xef, 0xf6, 0xe2, 0x49, 0x03, 0xb5, 0xef, 0x7e, 0x8f, 0xd1, 0x98, 0xcd, 0x06, 0x83, 0x80, 0x5c, 0xc4, 0x43, 0x8f, 0x82, 0x97, 0x3b, 0x97, 0xda, 0x7e, 0xfb, 0x37, 0x96, 0xb0, 0x6e, 0x00, 0x16, 0xe0, 0x0d, 0xd7, 0xba, 0xc0, 0x52, 0x9a, 0xf4, 0xc4, 0x70, 0x07, 0xa1, 0x28, 0x41, 0xd9, 0x99, 0x34, 0x80, 0x33, 0x84, 0xbf, 0x38, 0x42, 0xf0, 0xf2, 0x7c, 0x1f, 0xa1, 0x4e, 0x59, 0xf2, 0x28, 0xf0, 0x09, 0x5d, 0xb8, 0x14, 0x69, 0x18, 0x34, 0xd9, 0xae, 0xd8, 0x8c, 0x44, 0x53, 0x76, 0x4a, 0x86, 0x55, 0x4d, 0x68, 0x82, 0xa3, 0xe4, 0x65, 0x8a, 0xd0, 0xcd, 0x98, 0x69, 0x0c, 0xcc, 0xc3, 0xa7, 0x52, 0x3c, 0xeb, 0x08, 0xe3, 0xaf, 0x67, 0x56, 0xf2, 0xd5, 0x38, 0x60, 0xa1, 0x9f, 0x98 ],
+const [ 0x7a, 0xc3, 0x3a, 0xce, 0x5b, 0x4a, 0x6a, 0x32, 0x92, 0xb7, 0x2d, 0x0d, 0xd4, 0xbd, 0xf8, 0x53, 0x50, 0x9d, 0x9b, 0xdf, 0x87, 0xa5, 0xbc, 0x15, 0x5e, 0xf6, 0x84, 0xc6, 0x71, 0x8b, 0x98, 0x53, 0xab, 0x77, 0x4b, 0x16, 0x14, 0x6e, 0x12, 0xfd, 0xe9, 0x87, 0x38, 0x78, 0xf2, 0x40, 0xd2, 0x96, 0x10, 0xc3, 0xf6, 0x6b, 0x16, 0x68, 0x28, 0xb4, 0xd9, 0x7a, 0x15, 0xbe, 0x8b, 0x3e, 0x84, 0x83, 0x44, 0x31, 0x89, 0x16, 0xe2, 0x92, 0xfb, 0x42, 0x13, 0x20, 0x29, 0x6e, 0xb0, 0x25, 0xc9, 0xc4, 0x4d, 0xb3, 0x31, 0x93, 0x0e, 0x2e, 0xca, 0xf1, 0xbc, 0x0a, 0xc1, 0xa4, 0x17, 0xd6, 0xff, 0x43, 0x6e, 0x7a, 0x5c, 0x98, 0x6e, 0xbd, 0x0f, 0x49, 0x38, 0x0a, 0x69, 0xb7, 0xb6, 0x73, 0xc4, 0x27, 0x2e, 0xf6, 0xb6, 0x20, 0x17, 0xff, 0x8a, 0x13, 0x2c, 0x2f, 0xf0, 0x42, 0xc0, 0x5c, 0xf3, 0xda ],
+const [ 0x82, 0x00, 0x37, 0xb2, 0x51, 0xf2, 0x83, 0xa5, 0x2f, 0x6c, 0x19, 0x17, 0x7d, 0xda, 0x02, 0xfe, 0x24, 0x16, 0x06, 0x0f, 0xd5, 0x93, 0x15, 0x8e, 0x96, 0xdb, 0xe6, 0x64, 0x7a, 0x3b, 0xde, 0x72, 0xaf, 0xbc, 0x33, 0x25, 0xbe, 0x56, 0x51, 0x4a, 0x0f, 0x61, 0x7d, 0x24, 0xac, 0x4c, 0xb8, 0xbc, 0x46, 0x91, 0xe6, 0x79, 0x7d, 0xe8, 0x2f, 0xf0, 0x5c, 0xbc, 0xa6, 0xfd, 0x23, 0xdb, 0x28, 0x13, 0x4a, 0x71, 0x87, 0xd0, 0xc2, 0x37, 0xe8, 0xd5, 0x7e, 0xe8, 0x6a, 0xd4, 0x32, 0xf5, 0x09, 0xea, 0x5b, 0x79, 0xc1, 0x30, 0x7f, 0x6f, 0xf6, 0x8d, 0xb6, 0x23, 0x13, 0xce, 0x69, 0xe6, 0x72, 0xf8, 0x5a, 0x06, 0x7c, 0xdc, 0xe4, 0xfd, 0x11, 0xed, 0x85, 0xe9, 0x2a, 0x4f, 0x99, 0x3c, 0xbc, 0x30, 0x68, 0xb5, 0xe0, 0x5b, 0x63, 0x8f, 0x32, 0x0a, 0xab, 0xf8, 0x76, 0xfc, 0xd3, 0xc4, 0x82, 0xc8 ],
+const [ 0x09, 0x7a, 0xbb, 0xed, 0x69, 0xeb, 0xf2, 0xe5, 0xe8, 0x7e, 0x4e, 0xd5, 0x4f, 0xe3, 0x8d, 0x10, 0xf3, 0x2f, 0x40, 0x73, 0x96, 0x2e, 0xd2, 0x50, 0x88, 0xfa, 0xc6, 0xab, 0x11, 0xcc, 0x40, 0xa9, 0x14, 0x13, 0xc7, 0x45, 0xec, 0xc3, 0x49, 0x45, 0x9a, 0xf0, 0x5f, 0x6c, 0x22, 0x9b, 0xd3, 0xf2, 0x32, 0xcc, 0x60, 0x31, 0x05, 0xe1, 0xb8, 0xa1, 0x87, 0x25, 0xcc, 0x06, 0xba, 0xa4, 0x47, 0xe8, 0x58, 0x3e, 0x5b, 0x44, 0xba, 0xfb, 0xc1, 0x81, 0xf8, 0x9e, 0xfb, 0xa5, 0x52, 0x7d, 0xdd, 0xc9, 0xce, 0x8f, 0x4b, 0xcb, 0x23, 0xc7, 0x44, 0x42, 0xd6, 0xa0, 0x20, 0xb7, 0xa3, 0xfa, 0x15, 0x12, 0x1e, 0x24, 0x00, 0x52, 0x9a, 0x3a, 0x62, 0x81, 0x4a, 0xb1, 0xa9, 0xe7, 0xa6, 0x30, 0xb2, 0x7f, 0x10, 0xa1, 0x8b, 0xa7, 0xb8, 0x89, 0x7d, 0x1b, 0xbd, 0x94, 0x4a, 0x24, 0x95, 0x75, 0xb3, 0x0d ],
+const [ 0x3f, 0x61, 0xd4, 0xe1, 0xb7, 0xb2, 0x01, 0x45, 0x10, 0x54, 0x4a, 0x12, 0xed, 0x36, 0x7d, 0x37, 0x8f, 0x62, 0x04, 0xbc, 0xeb, 0xc8, 0xa4, 0xa8, 0x00, 0x3d, 0x6b, 0x23, 0x67, 0xc3, 0xe3, 0xd8, 0x2c, 0x0b, 0x8c, 0x9d, 0xdc, 0x38, 0x89, 0x56, 0xdf, 0xe6, 0x9a, 0x16, 0x08, 0x6b, 0x4a, 0x88, 0x6b, 0x5c, 0x6a, 0x8e, 0x6f, 0x54, 0xbd, 0x27, 0x24, 0xf0, 0xf5, 0x96, 0xd6, 0x1e, 0xde, 0xc1, 0xe2, 0x98, 0xda, 0xd7, 0xc8, 0xab, 0x8d, 0x35, 0x82, 0x3d, 0xd9, 0x8b, 0x14, 0x0e, 0x0d, 0x3a, 0x65, 0x3e, 0x59, 0x01, 0x4d, 0x10, 0x86, 0xd9, 0xef, 0xed, 0xe3, 0x1d, 0x49, 0xac, 0x83, 0xee, 0x09, 0x10, 0xa5, 0xd6, 0xa2, 0x92, 0x74, 0xab, 0xa0, 0x61, 0xf1, 0xb7, 0x38, 0xa8, 0x2d, 0x15, 0x24, 0x0f, 0xbb, 0x5e, 0xae, 0x84, 0x65, 0x86, 0x0a, 0x3b, 0x1e, 0x00, 0xe8, 0xf3, 0x38, 0x29 ],
+const [ 0x0f, 0x31, 0x99, 0x28, 0x94, 0xb4, 0x1d, 0xb6, 0xdd, 0x3e, 0x8c, 0x80, 0x7c, 0xac, 0xa2, 0x60, 0xb2, 0xca, 0x46, 0xb5, 0x32, 0x0e, 0x6b, 0xb5, 0x28, 0x87, 0x34, 0x05, 0x7a, 0x10, 0x5b, 0x87, 0x4e, 0xc9, 0xd3, 0x73, 0xcc, 0xc8, 0xac, 0xa9, 0x25, 0x0b, 0x38, 0x45, 0xd4, 0xb1, 0x6c, 0x74, 0x24, 0x6a, 0x88, 0x87, 0xf2, 0x2d, 0xfb, 0x46, 0xb4, 0x29, 0x80, 0x87, 0xba, 0xfd, 0x8e, 0xff, 0xb4, 0x2b, 0xef, 0x57, 0x75, 0xca, 0xae, 0x82, 0xf6, 0x7c, 0x37, 0x4f, 0x9e, 0xa0, 0xba, 0x3a, 0xc0, 0xc9, 0xd0, 0x88, 0x66, 0x6e, 0x61, 0x93, 0x4d, 0xe3, 0xc5, 0x62, 0x30, 0x87, 0x29, 0x7c, 0x49, 0x40, 0x35, 0xfe, 0x16, 0x24, 0xec, 0xec, 0x59, 0x79, 0xd3, 0xc5, 0x62, 0xe0, 0x55, 0x5a, 0x90, 0xcd, 0x66, 0xdf, 0x16, 0x3a, 0x67, 0x43, 0xfb, 0x9d, 0x49, 0xbd, 0x65, 0x17, 0xf6, 0xa8 ],
+const [ 0x8e, 0xea, 0xbc, 0xff, 0xbb, 0xe9, 0x68, 0x42, 0x5f, 0xf7, 0x95, 0xfa, 0xba, 0xa1, 0xa9, 0xc7, 0x7a, 0x2c, 0xe9, 0xa9, 0x31, 0x33, 0x8f, 0xc2, 0x05, 0x92, 0x1c, 0x5e, 0xaa, 0x83, 0xef, 0x30, 0x8d, 0x07, 0x17, 0xde, 0x52, 0x88, 0x66, 0xc1, 0x81, 0xbc, 0xc6, 0xe6, 0x7c, 0xcc, 0xd0, 0x58, 0xb5, 0xb6, 0x9b, 0xa1, 0x1d, 0xf0, 0xd2, 0x8e, 0xe0, 0x4e, 0x0a, 0x33, 0x4f, 0x25, 0x52, 0x2f, 0x1d, 0xb1, 0x0b, 0x31, 0xcf, 0xb4, 0xfa, 0xbb, 0x6e, 0x60, 0x9b, 0x26, 0x7f, 0x77, 0xb8, 0xe7, 0x35, 0xb1, 0x3b, 0x10, 0xe4, 0x5e, 0x41, 0x1a, 0xb9, 0x4c, 0x6f, 0xe1, 0xa9, 0xeb, 0x89, 0xf0, 0xa7, 0xaf, 0x40, 0xff, 0x1a, 0xb6, 0x4c, 0xba, 0x8e, 0xab, 0xbb, 0xc4, 0xa9, 0xea, 0x89, 0xfc, 0x61, 0xe4, 0x70, 0xff, 0x6d, 0xc5, 0x01, 0xee, 0xf9, 0x55, 0xf4, 0x71, 0x9e, 0x1c, 0xbd, 0xfb ],
+const [ 0x07, 0xe2, 0x3b, 0xa5, 0x79, 0x79, 0xf5, 0x3a, 0xad, 0x3b, 0xcd, 0x93, 0x41, 0xe6, 0xde, 0x6f, 0xc6, 0x4f, 0xf3, 0x77, 0x0c, 0x9c, 0xf0, 0x19, 0xa0, 0xb3, 0x6e, 0x93, 0x94, 0xf3, 0xa6, 0x4e, 0x7e, 0x21, 0x90, 0x6e, 0xc3, 0xa5, 0x4c, 0xa7, 0x16, 0xf6, 0xc0, 0x52, 0x3b, 0x53, 0x83, 0xc0, 0x11, 0xb4, 0xf9, 0xce, 0xcf, 0x00, 0xc0, 0xb9, 0x8e, 0x80, 0x4b, 0x34, 0x08, 0x94, 0xcd, 0xb8, 0x9f, 0xa4, 0x59, 0x1c, 0xa1, 0x5a, 0x47, 0x65, 0xca, 0x0e, 0xd9, 0xdf, 0x0a, 0x82, 0x1f, 0x6d, 0x89, 0xd0, 0x17, 0x1d, 0xe9, 0xa0, 0x19, 0xff, 0xcb, 0x9e, 0x72, 0x38, 0x94, 0x2c, 0x50, 0x52, 0x71, 0x53, 0xde, 0xd6, 0x98, 0x00, 0xaf, 0x1d, 0xd1, 0x6d, 0x60, 0x63, 0x35, 0xdd, 0x79, 0x1d, 0x36, 0x8c, 0x95, 0x8c, 0xe0, 0xe6, 0xc3, 0x93, 0x5f, 0xf7, 0x2b, 0xc6, 0xc0, 0x23, 0xf5, 0xc3 ],
+const [ 0x8c, 0x79, 0xf9, 0x11, 0xb3, 0x01, 0xa8, 0x71, 0x8c, 0xc4, 0xb1, 0x9a, 0x81, 0xd5, 0xf0, 0xcb, 0x63, 0x12, 0xd8, 0x7c, 0x5b, 0x4b, 0x07, 0x9e, 0x23, 0xa6, 0x1d, 0x24, 0x75, 0x41, 0xcf, 0xc2, 0xc4, 0x1a, 0x37, 0xf5, 0x2b, 0x2c, 0x6e, 0x43, 0xa3, 0xdb, 0x5d, 0xc4, 0x78, 0x92, 0xd0, 0xe1, 0xfe, 0xab, 0xcc, 0x5c, 0x80, 0x8f, 0x23, 0x91, 0x79, 0x1e, 0x45, 0xfb, 0x06, 0x51, 0x59, 0xf9, 0x9c, 0x1d, 0x8d, 0xd2, 0xf6, 0x9b, 0xaa, 0xf7, 0x52, 0x67, 0xeb, 0x89, 0xdd, 0x46, 0x0f, 0x1b, 0x6c, 0x0b, 0xad, 0xb9, 0x6c, 0xbb, 0xc8, 0x29, 0x1c, 0xef, 0xa3, 0x70, 0xfa, 0x7a, 0xd6, 0x99, 0x7a, 0x4c, 0xa2, 0xb1, 0xfe, 0x96, 0x82, 0x16, 0x03, 0x2f, 0x02, 0xf2, 0x98, 0x37, 0xd4, 0x02, 0x15, 0xfa, 0x21, 0x9c, 0x09, 0x16, 0x1d, 0xf0, 0x74, 0xe1, 0xde, 0x8e, 0x37, 0x05, 0x6e, 0x28 ],
+const [ 0x08, 0xdd, 0x4f, 0x5c, 0x7a, 0xfb, 0xdb, 0x43, 0x63, 0xa7, 0xdf, 0x60, 0xd2, 0x47, 0x77, 0x6d, 0x6c, 0x7c, 0x12, 0x2e, 0xb1, 0x55, 0xd4, 0x49, 0x81, 0xc2, 0x38, 0x58, 0xde, 0x4b, 0xfa, 0x3d, 0xf3, 0x01, 0x34, 0xb5, 0x55, 0xb5, 0xc7, 0x31, 0x8a, 0x69, 0xfc, 0xe1, 0xc8, 0x04, 0x6b, 0x11, 0xfe, 0x4a, 0x1c, 0xb8, 0x19, 0x0a, 0xed, 0x4e, 0x80, 0x99, 0x33, 0xdf, 0xe0, 0x80, 0xa4, 0x5e, 0x2f, 0x72, 0x75, 0x3b, 0xeb, 0x81, 0xbf, 0x37, 0xa3, 0x91, 0x27, 0x78, 0xb9, 0x0c, 0xbe, 0xd8, 0x66, 0xd7, 0x26, 0x83, 0xfe, 0x85, 0xf7, 0xc1, 0x76, 0xcb, 0x60, 0x10, 0x23, 0x34, 0x12, 0x76, 0xc4, 0x16, 0x59, 0x15, 0xc3, 0xc5, 0x8c, 0x00, 0xb8, 0x06, 0xa8, 0x4d, 0x2f, 0xc7, 0x38, 0x6c, 0xab, 0x0d, 0x78, 0xb7, 0xeb, 0x2d, 0xb9, 0x49, 0x6b, 0x3f, 0x07, 0x14, 0x2e, 0xd0, 0x0a, 0x2e ],
+const [ 0x72, 0x61, 0x81, 0x8a, 0xa2, 0x6a, 0xd3, 0x86, 0x14, 0x26, 0xaf, 0x03, 0xae, 0x6d, 0xdc, 0xba, 0x10, 0xf1, 0x92, 0x13, 0xd4, 0x73, 0xde, 0xf6, 0x14, 0x37, 0x47, 0xde, 0x2d, 0xb5, 0xb2, 0x30, 0xc3, 0x91, 0x83, 0xcc, 0x06, 0xcd, 0x05, 0xe1, 0x33, 0x3e, 0x0c, 0x05, 0x5d, 0x3c, 0xd9, 0x85, 0x6d, 0x9e, 0x3d, 0xf9, 0x68, 0xe6, 0x02, 0x1c, 0xf0, 0xb8, 0x86, 0xdb, 0x0e, 0x91, 0xa9, 0xac, 0x2e, 0xb5, 0xe9, 0x21, 0x6b, 0x69, 0xcc, 0xbd, 0x0d, 0x63, 0x7f, 0x06, 0x50, 0x7f, 0xbc, 0xdb, 0x68, 0xb3, 0xf0, 0x08, 0xc1, 0x45, 0x9e, 0x18, 0x8b, 0x3b, 0xfe, 0x6b, 0x76, 0x14, 0xeb, 0x88, 0xba, 0xb5, 0xfc, 0xb3, 0x5b, 0xa6, 0xf0, 0xc3, 0xab, 0x7e, 0x4f, 0x2e, 0x10, 0x9c, 0x4e, 0x66, 0x07, 0x18, 0xf3, 0x68, 0x69, 0xf9, 0x7b, 0x91, 0xee, 0xa9, 0xf9, 0xb4, 0xef, 0xa6, 0x3f, 0x6b ],
+const [ 0x72, 0x54, 0x00, 0x78, 0x46, 0x25, 0xdf, 0x22, 0xbb, 0xb8, 0x97, 0xe7, 0xdf, 0x2b, 0xdc, 0x80, 0x1f, 0x8e, 0x8c, 0x1f, 0x72, 0x47, 0x88, 0xf5, 0xd4, 0xb5, 0xc3, 0xf7, 0xf6, 0x14, 0x98, 0xe2, 0x34, 0xa1, 0x61, 0x7c, 0xc7, 0xfe, 0x45, 0x1d, 0x3c, 0xd7, 0x51, 0x6f, 0x24, 0xc6, 0xca, 0x72, 0x0e, 0x74, 0xc2, 0xc3, 0xb2, 0x02, 0xea, 0x1d, 0x6f, 0xa7, 0xa7, 0x20, 0xf8, 0x9a, 0x68, 0x51, 0x4a, 0x32, 0x36, 0x63, 0xe1, 0x4b, 0x8d, 0xb5, 0x2b, 0xed, 0x6a, 0x1b, 0x3d, 0x28, 0xa5, 0xe1, 0xc5, 0x42, 0x81, 0x0d, 0x3f, 0x15, 0x82, 0xe5, 0x6c, 0xb2, 0x7e, 0xb1, 0x00, 0x4a, 0xf7, 0xc2, 0x9b, 0x4f, 0xa8, 0xb3, 0xfb, 0xd6, 0x5e, 0xef, 0x70, 0x40, 0x09, 0x73, 0x90, 0x19, 0x13, 0xd6, 0x2b, 0x40, 0xf0, 0x86, 0x82, 0x48, 0xf7, 0x54, 0xb3, 0x1f, 0x70, 0x33, 0x78, 0xed, 0xee, 0x3c ],
+const [ 0xab, 0xc9, 0xcc, 0xdf, 0xbd, 0x92, 0xb6, 0x91, 0x9a, 0x5d, 0x6c, 0x6b, 0x5a, 0x76, 0x5a, 0x39, 0x66, 0x2e, 0xd9, 0x00, 0x80, 0xd3, 0x54, 0x92, 0x04, 0xdf, 0xaa, 0x5f, 0x6d, 0x70, 0xd4, 0x8e, 0x1a, 0xf8, 0xc8, 0x4d, 0x53, 0x36, 0x9d, 0x65, 0x87, 0x65, 0xef, 0x11, 0xd7, 0xb3, 0x85, 0x10, 0xd9, 0xf4, 0x31, 0xf9, 0x95, 0x98, 0xf8, 0xcf, 0xd4, 0xda, 0x73, 0xd5, 0x9b, 0x3b, 0x75, 0xa3, 0xf2, 0x2f, 0xef, 0x7a, 0xe9, 0x16, 0x10, 0xd5, 0xdd, 0x6d, 0xb0, 0x40, 0xf8, 0x46, 0xee, 0x6d, 0xf7, 0xf5, 0x18, 0x85, 0x30, 0x0d, 0xcc, 0xbc, 0xd3, 0x8b, 0x5d, 0x28, 0x70, 0x50, 0x78, 0xd3, 0xb9, 0xd5, 0x08, 0x0f, 0x8a, 0x1a, 0x56, 0x09, 0x26, 0xdf, 0x75, 0xa1, 0xc4, 0x17, 0xdd, 0x79, 0x4a, 0x9a, 0x56, 0x4c, 0x58, 0x1a, 0x18, 0x82, 0x88, 0x58, 0x30, 0x01, 0xf4, 0x97, 0x25, 0x45 ],
+const [ 0x72, 0x72, 0xef, 0xf0, 0xb2, 0x89, 0x64, 0xa1, 0xaa, 0xbf, 0xa0, 0x8f, 0x37, 0x52, 0x7a, 0x86, 0x07, 0x04, 0x3f, 0xed, 0xf3, 0x1b, 0xa6, 0xee, 0x8f, 0xad, 0x05, 0xd8, 0xff, 0x1a, 0xc4, 0xc1, 0x0c, 0xda, 0x12, 0x6f, 0x77, 0x79, 0xd8, 0x79, 0x8c, 0xdf, 0xeb, 0xa9, 0xfb, 0xd5, 0x86, 0xa5, 0xe4, 0xc5, 0xf7, 0xce, 0x31, 0xc1, 0x98, 0x69, 0x28, 0xc7, 0x01, 0xfd, 0x40, 0x44, 0x7c, 0xfb, 0x34, 0xd6, 0xba, 0xa4, 0x57, 0x56, 0xc4, 0x28, 0x27, 0x16, 0x33, 0x0b, 0x24, 0x67, 0xa4, 0xcd, 0xe3, 0x5f, 0x67, 0xca, 0x5e, 0xd9, 0x77, 0x5f, 0x8e, 0xbc, 0xaf, 0x4e, 0x3c, 0x81, 0x3a, 0x64, 0x14, 0xef, 0x4c, 0x59, 0xfb, 0x29, 0x0f, 0xf7, 0xa2, 0xeb, 0xe1, 0x7e, 0x5b, 0x11, 0xbc, 0x48, 0x2c, 0x59, 0xf5, 0xa9, 0x22, 0x69, 0x2a, 0x19, 0xe8, 0x14, 0x76, 0x95, 0x98, 0xd9, 0xe6, 0x42 ],
+const [ 0xc2, 0xc1, 0xad, 0x60, 0x4e, 0x21, 0xc2, 0xc8, 0x69, 0x19, 0x3d, 0x67, 0x97, 0xae, 0x65, 0x7e, 0xe7, 0x40, 0x64, 0x9c, 0x78, 0x05, 0xee, 0xb8, 0x3c, 0xb6, 0x23, 0x7d, 0xfc, 0x88, 0xb7, 0xe5, 0x9d, 0x5e, 0x50, 0x09, 0xa1, 0x3d, 0x2f, 0x38, 0xf1, 0x00, 0x13, 0x46, 0xd9, 0x4d, 0x5a, 0x26, 0x54, 0xc7, 0x6a, 0xbb, 0x8a, 0x85, 0x4f, 0xec, 0x97, 0xc4, 0xa5, 0xf7, 0x8e, 0xd8, 0xb9, 0x07, 0xbd, 0x69, 0xeb, 0x08, 0x33, 0xdb, 0x57, 0xba, 0x80, 0x0e, 0xb4, 0x04, 0xbc, 0x48, 0x7b, 0x8c, 0xcb, 0x6f, 0x4c, 0x84, 0xde, 0x7c, 0x8f, 0xc7, 0x3d, 0x2c, 0x57, 0x24, 0x45, 0xf8, 0x8b, 0xf9, 0xac, 0x48, 0x47, 0x04, 0x0d, 0xe4, 0x80, 0x77, 0xa0, 0xab, 0xe7, 0x4a, 0x48, 0x87, 0x10, 0xd5, 0xd4, 0xa0, 0xd4, 0x9e, 0x7e, 0xd0, 0xf4, 0x70, 0xb8, 0x58, 0xfe, 0xad, 0x29, 0xd1, 0x75, 0xe4 ],
+const [ 0xa2, 0x0f, 0x4c, 0xfd, 0xe1, 0xc1, 0x2a, 0xc3, 0xaa, 0x4d, 0x11, 0xb1, 0x3d, 0xc4, 0x59, 0x0a, 0xd9, 0x39, 0x5f, 0x0e, 0xd2, 0x80, 0x32, 0xd8, 0xe4, 0x36, 0x8f, 0x87, 0xc7, 0x01, 0x10, 0x9c, 0x03, 0x19, 0xa0, 0xa3, 0x06, 0x08, 0x32, 0x16, 0x74, 0xae, 0xb3, 0x7e, 0xbe, 0x87, 0x3c, 0xdb, 0xf6, 0x31, 0x8d, 0x46, 0xe2, 0x28, 0xb7, 0xd5, 0x4f, 0xd5, 0x18, 0xbf, 0xa7, 0xc7, 0x8c, 0xc0, 0xc6, 0x40, 0xe2, 0xbf, 0x0a, 0xf3, 0x8d, 0xaf, 0xa9, 0x0c, 0x9c, 0xb3, 0x48, 0x71, 0xed, 0x85, 0xc9, 0x47, 0x9d, 0x18, 0x64, 0xb9, 0xc2, 0x7c, 0xf9, 0xf4, 0x5d, 0x03, 0xa4, 0x76, 0x8a, 0xa2, 0x93, 0x89, 0xfa, 0x99, 0x14, 0x0a, 0xa3, 0x56, 0xf2, 0x6f, 0xb6, 0x97, 0x02, 0x09, 0xd2, 0xd0, 0xf9, 0x85, 0x77, 0xcc, 0x80, 0xb9, 0xbd, 0x96, 0x8b, 0x9e, 0x46, 0x9a, 0xe6, 0x98, 0x71, 0x08 ],
+const [ 0x3b, 0x8b, 0xcf, 0x1c, 0xdc, 0xd4, 0xb5, 0x67, 0x3d, 0x29, 0x8f, 0x8d, 0xf1, 0xe2, 0x26, 0xc1, 0xa7, 0xff, 0x4a, 0x25, 0x52, 0xbd, 0x15, 0xf5, 0x88, 0x67, 0x74, 0x02, 0x28, 0x6f, 0xe2, 0x63, 0x40, 0xbd, 0x77, 0x67, 0x2e, 0x47, 0x22, 0xce, 0x05, 0xe2, 0x33, 0x38, 0x32, 0x57, 0x1c, 0xdd, 0x5f, 0xba, 0x78, 0x7f, 0x97, 0xf7, 0x4c, 0x9d, 0xab, 0xae, 0x8d, 0xea, 0xd5, 0x41, 0xe3, 0xfd, 0x9c, 0x2b, 0xad, 0x4a, 0xf7, 0x93, 0x45, 0x51, 0xb5, 0x20, 0x85, 0x15, 0x1c, 0x10, 0x8a, 0xd0, 0xd1, 0x84, 0xb7, 0xe5, 0xf8, 0x1e, 0xfd, 0x16, 0x9b, 0xce, 0x5a, 0xf7, 0x50, 0xe9, 0xa0, 0xa2, 0x16, 0x7c, 0x78, 0xad, 0x81, 0xdf, 0xa6, 0x59, 0x17, 0x8d, 0x8f, 0x0c, 0xf9, 0x32, 0xf8, 0x02, 0xc6, 0x06, 0x10, 0x3f, 0xbc, 0x5a, 0xb1, 0xc8, 0x20, 0x70, 0xe3, 0x12, 0xe0, 0x90, 0xa2, 0xbb ],
+const [ 0x5a, 0x84, 0xd4, 0x65, 0x60, 0xd7, 0xec, 0x2d, 0x1a, 0xb6, 0x63, 0xc9, 0x84, 0x02, 0x2c, 0xb2, 0x43, 0x93, 0x46, 0x35, 0x81, 0xc5, 0x36, 0x1a, 0xf7, 0x33, 0xb4, 0x84, 0x4b, 0xc2, 0xa5, 0x18, 0x9d, 0xe2, 0x49, 0x61, 0x5d, 0x10, 0xb6, 0x73, 0x5f, 0x9f, 0x85, 0xcf, 0x31, 0xb9, 0xcb, 0x87, 0xac, 0xa1, 0x4b, 0xa3, 0xc9, 0x3a, 0xe9, 0xc2, 0xb6, 0xcd, 0x62, 0x05, 0x29, 0x07, 0x3b, 0x28, 0xf5, 0x41, 0xf7, 0xf2, 0xdb, 0x05, 0x8d, 0xd0, 0xa2, 0xcd, 0x19, 0xbd, 0x69, 0x0d, 0xd2, 0x64, 0x3d, 0x74, 0x3c, 0x89, 0xe7, 0x6f, 0x9f, 0xa5, 0x07, 0xf0, 0xb7, 0xd0, 0x67, 0x6d, 0xad, 0xe4, 0x89, 0x2b, 0x46, 0xe0, 0x82, 0xbc, 0x5b, 0x8a, 0x0b, 0xc7, 0x89, 0x59, 0xd6, 0x07, 0x29, 0x91, 0x1e, 0x96, 0x82, 0xb0, 0x82, 0x6c, 0x3e, 0x09, 0x13, 0x22, 0x1b, 0xaf, 0xac, 0xfc, 0xe3, 0x94 ],
+const [ 0x9e, 0xad, 0x42, 0x2c, 0x9e, 0x22, 0xb8, 0x85, 0xa4, 0x22, 0xc3, 0x7e, 0xa4, 0x9c, 0x27, 0x1f, 0x9d, 0x65, 0xf2, 0x8d, 0x29, 0x7f, 0xae, 0x76, 0x51, 0x9b, 0xdb, 0xaf, 0xa5, 0xdc, 0x9d, 0x1c, 0x8d, 0xde, 0xb1, 0xd1, 0xda, 0xf7, 0xa5, 0x76, 0xa0, 0xbd, 0x49, 0xf0, 0x48, 0xc8, 0x61, 0x3e, 0xe1, 0xb9, 0x9c, 0xa0, 0xb7, 0x7a, 0xca, 0xff, 0x27, 0xc8, 0x49, 0x89, 0xb1, 0xef, 0xc0, 0x9c, 0x4f, 0xd5, 0x10, 0xe5, 0x05, 0x3a, 0x88, 0xc9, 0xba, 0x3e, 0x59, 0x03, 0x46, 0x24, 0x49, 0x8f, 0xcc, 0x55, 0xab, 0xc7, 0x4a, 0xa8, 0x8e, 0xcd, 0x6e, 0xe0, 0x35, 0x28, 0xac, 0x77, 0xc7, 0xb2, 0x8d, 0x9a, 0x48, 0xb1, 0x4a, 0x74, 0xc8, 0x44, 0x99, 0xaf, 0xda, 0x01, 0xc7, 0x38, 0x48, 0xdc, 0x07, 0x43, 0x05, 0x4a, 0x0a, 0x90, 0x63, 0xa7, 0xcf, 0xec, 0x86, 0xd5, 0xbd, 0xfa, 0x19, 0x27 ],
+const [ 0x0f, 0x72, 0x51, 0xcc, 0x86, 0x87, 0xe3, 0xe0, 0x2c, 0x36, 0x3a, 0xf2, 0xed, 0x45, 0x51, 0x23, 0x3c, 0xf2, 0xbf, 0xbb, 0x10, 0xe5, 0xdd, 0xbe, 0x2c, 0x62, 0x2b, 0xc0, 0xa4, 0xc3, 0xf0, 0xf9, 0x9d, 0x26, 0x21, 0x9c, 0x54, 0x63, 0x84, 0x65, 0x62, 0x41, 0x15, 0x71, 0x3e, 0xe9, 0xa9, 0x53, 0x03, 0x9a, 0xd1, 0x64, 0x73, 0x9f, 0x01, 0x5a, 0x3c, 0x7e, 0xf2, 0x1d, 0x7b, 0x73, 0x44, 0xd6, 0x7f, 0x1c, 0x68, 0x48, 0xcf, 0x76, 0xbd, 0x63, 0x6e, 0x08, 0xf9, 0x16, 0x5d, 0x5e, 0xcb, 0x66, 0x62, 0xb9, 0xbf, 0xbd, 0x08, 0x05, 0x61, 0x84, 0xe7, 0x0b, 0xa5, 0xf3, 0x25, 0xe8, 0x86, 0x28, 0x3d, 0xbe, 0xee, 0x77, 0xff, 0xa9, 0xd6, 0x02, 0xd9, 0xf5, 0xae, 0x89, 0x54, 0x8e, 0xff, 0x83, 0xe1, 0xb7, 0x4f, 0x6d, 0xd6, 0xff, 0x45, 0x62, 0xb4, 0x71, 0x0d, 0xec, 0xab, 0x0c, 0xfe, 0x1a ],
+const [ 0xe4, 0x37, 0xf8, 0xb6, 0xec, 0xad, 0x31, 0x82, 0x67, 0xdd, 0xf8, 0x5d, 0x7e, 0xe0, 0x5b, 0x35, 0x38, 0x2e, 0x3d, 0x6b, 0x40, 0x56, 0x41, 0x29, 0xe9, 0xf3, 0xea, 0xf6, 0x6f, 0xdb, 0x00, 0x87, 0x80, 0x99, 0x35, 0xd8, 0xfa, 0x1e, 0x08, 0x7c, 0xf7, 0xb3, 0xea, 0x32, 0x07, 0x32, 0x9f, 0xb8, 0xbc, 0x76, 0xe8, 0xe4, 0x6c, 0x10, 0x5f, 0xf0, 0x32, 0x3b, 0xa2, 0x16, 0x36, 0x13, 0xb3, 0x5c, 0x2e, 0x01, 0x9f, 0xb2, 0x25, 0x7a, 0x5e, 0x3a, 0x7b, 0xe9, 0xfb, 0xe7, 0x2e, 0xe9, 0xf5, 0x49, 0x57, 0xb8, 0xe4, 0xa7, 0xf8, 0xe8, 0x5f, 0x4f, 0xf4, 0x58, 0x1e, 0x2a, 0x5f, 0x63, 0x5c, 0x93, 0xf8, 0x57, 0x7f, 0x69, 0xf4, 0x29, 0xfb, 0x63, 0xfe, 0x67, 0x74, 0xa4, 0x7b, 0x6d, 0x23, 0x90, 0x12, 0xdc, 0x7a, 0xdd, 0x6c, 0x48, 0x0b, 0xed, 0x38, 0x31, 0xa6, 0x5b, 0x73, 0x35, 0xc1, 0xd4 ],
+const [ 0x5a, 0xd2, 0x14, 0x01, 0x11, 0x8c, 0x89, 0xf3, 0x81, 0xa8, 0x34, 0x3b, 0x12, 0xfd, 0x5a, 0x96, 0xd9, 0x5d, 0x58, 0x7d, 0xbc, 0x26, 0xe7, 0x58, 0xd7, 0x14, 0x9e, 0xef, 0x1f, 0x59, 0xb9, 0x21, 0x45, 0xf0, 0x18, 0xd8, 0xde, 0x2e, 0x8b, 0x3c, 0xc0, 0x9a, 0x4c, 0x27, 0xaf, 0xfe, 0xcd, 0xd9, 0x39, 0xbe, 0xb4, 0xee, 0xde, 0x69, 0x24, 0x8d, 0x74, 0x8e, 0x3f, 0xe1, 0xca, 0xd1, 0xe9, 0xcd, 0x8c, 0x3d, 0xce, 0xdb, 0x66, 0xdc, 0xa6, 0x76, 0x6c, 0x85, 0xb8, 0x5a, 0xba, 0xf6, 0x9c, 0x48, 0x57, 0x23, 0x46, 0xfe, 0x60, 0xcd, 0x40, 0x66, 0x62, 0x55, 0x37, 0x0e, 0x07, 0xd3, 0xb9, 0xd8, 0xf5, 0x63, 0x3d, 0xf3, 0xf3, 0xbf, 0x64, 0x09, 0x4d, 0x13, 0x7e, 0xba, 0x7a, 0x0c, 0x50, 0x4a, 0xfd, 0x32, 0x15, 0x96, 0x89, 0x79, 0xc2, 0x4d, 0x68, 0x12, 0x8e, 0x5c, 0x1e, 0x87, 0xb2, 0xaa ],
+const [ 0xe3, 0xa9, 0x06, 0x51, 0xf7, 0x65, 0x2c, 0x0c, 0x7d, 0xea, 0x98, 0x1f, 0x81, 0x67, 0xc7, 0xe3, 0x87, 0x9f, 0x81, 0xcd, 0xc2, 0x49, 0xb1, 0xef, 0x86, 0xb7, 0x73, 0xc2, 0x00, 0xb7, 0x6f, 0x22, 0x25, 0xb7, 0x66, 0x9a, 0xe8, 0x2c, 0x0a, 0xe2, 0xb0, 0x34, 0x13, 0xa6, 0x09, 0x79, 0x8f, 0x89, 0x99, 0x59, 0x79, 0x6a, 0x57, 0x45, 0x8e, 0xe6, 0xf7, 0x67, 0x5c, 0x1e, 0xa8, 0x88, 0x9c, 0xba, 0x02, 0x30, 0xc1, 0x2e, 0x3a, 0x0f, 0xd1, 0x3b, 0x99, 0x9b, 0x74, 0xb9, 0x2c, 0xfb, 0x4b, 0x95, 0xbc, 0x24, 0x82, 0x16, 0x00, 0x42, 0xa9, 0x64, 0x12, 0x59, 0xbf, 0x4a, 0x20, 0x2c, 0x90, 0x3b, 0x64, 0x5e, 0x42, 0x93, 0x56, 0xd7, 0x2a, 0x20, 0x20, 0x69, 0xe4, 0xe1, 0x52, 0xb3, 0xa2, 0x0d, 0xd7, 0x46, 0xc4, 0x57, 0x28, 0x07, 0xa9, 0x71, 0xbf, 0xd5, 0xc5, 0xcf, 0xcf, 0x6b, 0xf4, 0xad ],
+const [ 0xb9, 0xb8, 0xf4, 0xc8, 0x24, 0x37, 0x7a, 0x6c, 0xd1, 0xa3, 0x1b, 0x1f, 0x3a, 0x21, 0xb5, 0x51, 0xdf, 0xc1, 0x6b, 0xaf, 0x8b, 0xb0, 0x02, 0xf4, 0xd8, 0xb0, 0x8b, 0x02, 0xf5, 0xc6, 0x43, 0x31, 0xa7, 0x32, 0xb7, 0xe7, 0x8e, 0xa4, 0x2c, 0x69, 0xaa, 0xad, 0x3d, 0xf0, 0x1e, 0x74, 0xc6, 0x00, 0x33, 0xaa, 0x01, 0xf5, 0x9f, 0xc0, 0xef, 0xdf, 0x08, 0x57, 0xfa, 0x8f, 0xc4, 0xf8, 0xd8, 0xf2, 0xe3, 0x05, 0xb2, 0x9e, 0x6f, 0xef, 0x86, 0xab, 0xf2, 0xaa, 0xca, 0xc4, 0x39, 0x5e, 0x52, 0x7d, 0x58, 0x60, 0x73, 0xe7, 0xee, 0x60, 0x69, 0x63, 0xaa, 0xe4, 0xf6, 0xb3, 0x0e, 0xf5, 0x4c, 0x57, 0x73, 0x17, 0x2d, 0x16, 0x4e, 0x7f, 0x51, 0xdb, 0xb1, 0x81, 0x08, 0xc2, 0x15, 0x48, 0x20, 0x73, 0x56, 0xc9, 0x09, 0xaf, 0xff, 0xf9, 0x37, 0x28, 0xc8, 0x3e, 0xc8, 0x96, 0x5d, 0x24, 0x67, 0x07 ],
+const [ 0x84, 0xc5, 0x14, 0xe4, 0x71, 0x41, 0x19, 0xa9, 0xe4, 0xe4, 0x7f, 0xcc, 0xb9, 0xe8, 0x24, 0x04, 0xdd, 0x5a, 0x78, 0x50, 0x60, 0xd6, 0x31, 0xde, 0xcc, 0x92, 0x40, 0x2c, 0xb6, 0x9d, 0x03, 0x6d, 0x92, 0x69, 0xbc, 0x2e, 0xcc, 0x88, 0x42, 0x39, 0x14, 0xb3, 0xf6, 0xb9, 0xf9, 0x10, 0xf9, 0xa0, 0xb9, 0xb5, 0x9c, 0x46, 0x57, 0x68, 0x18, 0x52, 0xef, 0xa8, 0x80, 0xde, 0x47, 0xf2, 0xf3, 0xd6, 0xa6, 0x3d, 0x16, 0xa1, 0xe9, 0xc7, 0xc1, 0x04, 0xd3, 0x13, 0xf9, 0x43, 0xa5, 0x32, 0x1f, 0x89, 0xee, 0x43, 0x66, 0x89, 0xa5, 0x36, 0x8b, 0x66, 0x75, 0xd5, 0xc0, 0xd0, 0x58, 0x04, 0xe9, 0x71, 0x67, 0x47, 0x0a, 0x87, 0xf1, 0x86, 0x00, 0xd2, 0xca, 0x0d, 0x70, 0xb0, 0xe5, 0xd7, 0xfe, 0x87, 0x25, 0x0c, 0xbf, 0x63, 0x71, 0xc8, 0xf0, 0xe0, 0x07, 0x1e, 0xe8, 0x4b, 0x12, 0x5d, 0x4b, 0x04 ],
+const [ 0x3d, 0x31, 0xcf, 0x76, 0x28, 0x8b, 0xa7, 0x77, 0xd0, 0xda, 0x29, 0xe9, 0xce, 0x21, 0xd6, 0x9d, 0xc6, 0x41, 0x9c, 0x15, 0x3e, 0x7a, 0x4d, 0x2e, 0xb0, 0x2f, 0x50, 0x01, 0xdd, 0xe9, 0x97, 0x0c, 0x65, 0x9f, 0xd0, 0x8d, 0x95, 0x35, 0xe0, 0x2f, 0x80, 0x42, 0x8d, 0xe8, 0x51, 0x16, 0x7a, 0x22, 0xdf, 0xfc, 0x59, 0x19, 0x82, 0xbc, 0x5c, 0x84, 0x26, 0x64, 0xec, 0x77, 0x9d, 0x48, 0x9e, 0x88, 0x3a, 0x48, 0x63, 0x31, 0x9b, 0x51, 0xff, 0x75, 0xc6, 0x27, 0xbc, 0xc6, 0x78, 0x61, 0x5f, 0x27, 0xb9, 0xb5, 0x5b, 0x8e, 0xb4, 0x75, 0x45, 0x8c, 0xc6, 0x5a, 0x88, 0x2f, 0xd5, 0x81, 0x5a, 0x28, 0xe3, 0xb3, 0xee, 0x29, 0xe2, 0xe9, 0xeb, 0x91, 0xca, 0x0f, 0x1e, 0x4b, 0xea, 0x09, 0x6b, 0xf3, 0x7b, 0xf4, 0x0a, 0x3b, 0x7b, 0xae, 0xf0, 0x8e, 0xb9, 0x98, 0x8a, 0xf3, 0x2c, 0x9a, 0xb1, 0x33 ],
+const [ 0x4b, 0xbb, 0x75, 0x96, 0xf1, 0x9a, 0xa5, 0xde, 0xd4, 0x01, 0x7a, 0x81, 0xca, 0xc2, 0x8e, 0x7d, 0x6a, 0x68, 0x52, 0x53, 0xc0, 0x1a, 0x5e, 0x0c, 0x45, 0xc2, 0x05, 0x7a, 0x0d, 0x6e, 0x2d, 0xc0, 0x43, 0xf6, 0x5d, 0x15, 0xd3, 0xdf, 0x18, 0xc4, 0x66, 0x7f, 0x6a, 0x77, 0x93, 0x62, 0xc0, 0xb6, 0x53, 0xed, 0xfd, 0xab, 0xb6, 0x41, 0xc9, 0x28, 0xd5, 0x62, 0x2c, 0xeb, 0x08, 0x99, 0x5d, 0x20, 0x59, 0x16, 0xd4, 0x27, 0x38, 0xda, 0xa6, 0x98, 0x70, 0xd4, 0x12, 0x84, 0x59, 0x4a, 0x57, 0xfe, 0x4f, 0x7b, 0xc9, 0xda, 0x64, 0x83, 0x24, 0xb5, 0x52, 0x7e, 0x20, 0x36, 0xb4, 0xf0, 0x46, 0x92, 0x75, 0x65, 0x01, 0x56, 0x88, 0x54, 0xf8, 0x61, 0xd9, 0x49, 0x9b, 0x2f, 0x84, 0x43, 0xfc, 0x5e, 0x46, 0x5b, 0xe1, 0x6a, 0x30, 0xa7, 0x17, 0xbc, 0xa3, 0x5e, 0x09, 0xe3, 0x78, 0x3d, 0x91, 0x21 ],
+const [ 0xf4, 0xa6, 0x5e, 0xbf, 0x30, 0x90, 0x0a, 0xb9, 0x86, 0x04, 0x90, 0xc7, 0xbd, 0x7c, 0x0c, 0xe4, 0xf4, 0x6c, 0xb5, 0xbb, 0x38, 0x83, 0x0f, 0x10, 0x52, 0x2e, 0x62, 0x5c, 0xe2, 0x5f, 0x6a, 0xb7, 0xb2, 0x8c, 0x50, 0xfb, 0x44, 0xfa, 0xd9, 0x27, 0xad, 0x3b, 0xde, 0x01, 0xa6, 0xf6, 0xfc, 0x00, 0xe1, 0xe6, 0x8c, 0x68, 0x99, 0x25, 0xd5, 0xb7, 0x6d, 0xab, 0x81, 0x40, 0x6e, 0x11, 0x4e, 0x16, 0x77, 0x9b, 0x06, 0x2b, 0xbd, 0x76, 0xb1, 0xb9, 0xa6, 0x3e, 0x09, 0xe1, 0xdf, 0xc4, 0x2e, 0x93, 0xa9, 0x0d, 0x9b, 0xad, 0x73, 0x9e, 0x59, 0x67, 0xae, 0xf6, 0x72, 0xee, 0xdd, 0x5d, 0xa9, 0x4f, 0xeb, 0xdc, 0x68, 0x97, 0xc2, 0x8d, 0xfa, 0x38, 0x19, 0x15, 0xfa, 0xaf, 0x8d, 0x6e, 0x0c, 0x64, 0xf4, 0xea, 0xcb, 0xd2, 0xee, 0x74, 0x02, 0xe7, 0xbc, 0x19, 0x1e, 0xae, 0x56, 0xc8, 0xe3, 0x2b ],
+const [ 0x61, 0xcb, 0x9e, 0x1f, 0x1e, 0x4b, 0x3a, 0x3b, 0x3b, 0xdf, 0xf8, 0xcd, 0x5f, 0x24, 0x56, 0x6b, 0x98, 0x7f, 0x75, 0xc8, 0xa0, 0x53, 0x77, 0x85, 0x5f, 0x77, 0x2b, 0x49, 0xb0, 0xe7, 0xec, 0x13, 0x68, 0xb9, 0xc6, 0xcf, 0x95, 0x53, 0xdb, 0x28, 0x03, 0xdc, 0x05, 0x9e, 0x05, 0xf0, 0xbd, 0xd8, 0x71, 0x98, 0x3c, 0x3b, 0xed, 0x79, 0xdf, 0xbb, 0x69, 0x4b, 0xd0, 0xf1, 0xed, 0x8d, 0xe3, 0x6e, 0x95, 0x77, 0xbe, 0x50, 0xda, 0x31, 0x3d, 0x13, 0x12, 0x42, 0x15, 0xa9, 0x3a, 0x4b, 0xb7, 0xcc, 0xf4, 0xf5, 0x77, 0x93, 0xcc, 0x28, 0xed, 0x43, 0xbf, 0x7e, 0x9b, 0x68, 0xfe, 0xf7, 0xd1, 0x25, 0xef, 0xee, 0xce, 0xc9, 0x75, 0x4b, 0x28, 0xa2, 0x71, 0xfb, 0x6e, 0x16, 0x89, 0x9d, 0x0b, 0xef, 0x28, 0x7e, 0x6d, 0xf7, 0xc5, 0xc8, 0x67, 0xc5, 0x69, 0xf6, 0xd4, 0xd6, 0x6b, 0x8b, 0x7e, 0xe0 ],
+const [ 0x9a, 0xb4, 0x66, 0x7b, 0x2d, 0xf7, 0xeb, 0x4b, 0xe8, 0x86, 0x3a, 0xa5, 0x3e, 0x9b, 0xf9, 0xaf, 0x8b, 0xae, 0x0f, 0xc0, 0x9d, 0xe9, 0x4f, 0x73, 0x73, 0xdc, 0x56, 0xfa, 0x44, 0x72, 0xb6, 0xb5, 0xc4, 0x23, 0x54, 0x03, 0xa2, 0x6c, 0x0e, 0x59, 0x55, 0x7c, 0xa1, 0x91, 0x18, 0x31, 0xca, 0x84, 0x33, 0x42, 0xac, 0xda, 0x7d, 0xbe, 0x72, 0x21, 0x1f, 0xb5, 0x35, 0x1d, 0x9a, 0x34, 0x20, 0x5f, 0x0c, 0x77, 0xd2, 0x19, 0xaf, 0x5b, 0x03, 0x31, 0xa2, 0x12, 0x6b, 0x94, 0xec, 0x1a, 0xdf, 0xcd, 0xbe, 0x70, 0xbe, 0xd6, 0xf8, 0x01, 0x8b, 0x2e, 0xef, 0x61, 0xdb, 0x2b, 0x6d, 0xbf, 0x72, 0x92, 0xfa, 0x19, 0xa9, 0x65, 0x5a, 0xac, 0x13, 0xfc, 0x57, 0xaf, 0x5f, 0x57, 0xc1, 0x40, 0x80, 0xb3, 0xb2, 0x9f, 0x0c, 0x5b, 0x16, 0x9a, 0xe2, 0xc1, 0x6b, 0x48, 0x10, 0xcd, 0xc6, 0xfa, 0xf4, 0x75 ],
+const [ 0xa1, 0xc7, 0xf3, 0xc9, 0xa7, 0x9b, 0x07, 0x1b, 0x49, 0x30, 0x1a, 0xac, 0x75, 0x4a, 0x2e, 0x89, 0xd9, 0x71, 0xfd, 0x90, 0xa7, 0xa2, 0xdf, 0xc9, 0x95, 0x44, 0xef, 0xfa, 0x29, 0x5d, 0x69, 0x75, 0x33, 0x06, 0x57, 0x35, 0x9b, 0x1d, 0x6d, 0x29, 0x5c, 0x39, 0x31, 0xd0, 0xd1, 0xe3, 0x5f, 0x06, 0x30, 0x03, 0x8b, 0x1e, 0x54, 0x98, 0x08, 0x30, 0xbf, 0xac, 0x09, 0xb4, 0xdf, 0x88, 0x06, 0x50, 0x90, 0x24, 0x61, 0xef, 0xe3, 0xe1, 0x4a, 0x13, 0x1d, 0x7a, 0xe0, 0x6c, 0x03, 0x38, 0x98, 0xa9, 0x55, 0x66, 0xe3, 0x8e, 0x99, 0x05, 0x0b, 0x47, 0x19, 0xc1, 0x5e, 0xfc, 0x2f, 0x23, 0x8f, 0xa5, 0xc0, 0x07, 0x59, 0x20, 0x07, 0x51, 0x65, 0x80, 0x94, 0xdc, 0x6e, 0xa9, 0x94, 0xb3, 0xa3, 0x1a, 0x52, 0x84, 0x4d, 0x09, 0xfe, 0x51, 0xb1, 0xb5, 0xae, 0x69, 0x38, 0xf8, 0xa2, 0x97, 0xcd, 0x1b ],
+const [ 0x8c, 0x53, 0x37, 0xd7, 0x43, 0x88, 0xcb, 0xbf, 0xe0, 0xf4, 0x00, 0xf4, 0x03, 0x87, 0x96, 0x87, 0x88, 0x7b, 0x6b, 0x2f, 0x5c, 0xdd, 0xef, 0xeb, 0x8f, 0x49, 0xd8, 0xe9, 0xab, 0xf5, 0x17, 0xa7, 0x45, 0xf0, 0x0a, 0x58, 0xd1, 0xac, 0xf3, 0x89, 0xbb, 0xbb, 0xa9, 0x04, 0xb3, 0xd6, 0x8d, 0xf4, 0x48, 0x23, 0xc0, 0x4b, 0xb8, 0xb8, 0x93, 0x61, 0x06, 0x5b, 0x3f, 0xdd, 0x4e, 0x8b, 0xd7, 0xd9, 0x56, 0xc5, 0x7a, 0x41, 0x65, 0x00, 0xcd, 0x7c, 0x58, 0x7a, 0xa8, 0x4f, 0xf2, 0xb6, 0x10, 0xfe, 0x74, 0xc5, 0x66, 0xb4, 0x6d, 0xc6, 0xdd, 0x24, 0xd4, 0xa9, 0x32, 0x71, 0x54, 0x38, 0x97, 0x4b, 0xe7, 0x57, 0xf0, 0x5c, 0xa6, 0x8a, 0x41, 0xe2, 0xe0, 0xb9, 0x67, 0x9d, 0x69, 0x30, 0x07, 0xeb, 0x34, 0xea, 0xc5, 0x32, 0x24, 0x0f, 0xb6, 0x7e, 0x20, 0xbb, 0x17, 0x6b, 0x66, 0x01, 0x3f, 0x46 ],
+const [ 0xb9, 0xb5, 0x07, 0x74, 0x71, 0x5e, 0xde, 0xb6, 0x94, 0x78, 0x42, 0xae, 0x80, 0x7d, 0x18, 0xbe, 0xd9, 0x11, 0xc4, 0xc9, 0xce, 0x34, 0x91, 0xfd, 0x9e, 0xbb, 0x53, 0xf0, 0x5b, 0x01, 0x4b, 0xef, 0xef, 0xda, 0x4a, 0x93, 0x5c, 0xc8, 0x19, 0x94, 0x48, 0x72, 0x19, 0xe2, 0xb8, 0x51, 0x27, 0xf2, 0x1c, 0xad, 0xc2, 0x56, 0x8c, 0xc8, 0x70, 0x91, 0x51, 0x59, 0x5d, 0x29, 0xa7, 0x3b, 0x46, 0xfe, 0xc1, 0x67, 0x95, 0xd9, 0x0e, 0x20, 0xce, 0x48, 0xbb, 0x6d, 0x29, 0xaa, 0x79, 0xcc, 0x81, 0x86, 0x80, 0x25, 0x6c, 0x21, 0xd3, 0xfd, 0xac, 0x4f, 0xc6, 0xec, 0xc6, 0x89, 0xbe, 0x51, 0xf0, 0x40, 0x39, 0x44, 0x30, 0x71, 0x0e, 0xcc, 0xc3, 0x7a, 0xf5, 0x52, 0xbc, 0x2c, 0x49, 0x56, 0xed, 0x21, 0x0d, 0x61, 0x0a, 0x4f, 0x2e, 0x3b, 0x0c, 0xde, 0x07, 0x5d, 0xd4, 0x37, 0x2a, 0xa9, 0x11, 0x5e ],
+const [ 0x15, 0xb1, 0x86, 0xbc, 0xe7, 0x34, 0x56, 0x81, 0x3d, 0x85, 0xa5, 0x0e, 0x68, 0xc4, 0xe2, 0xa5, 0xfa, 0x4e, 0xc9, 0xa3, 0x28, 0x8f, 0xe5, 0xf7, 0x73, 0x17, 0x53, 0xd8, 0x88, 0xef, 0xca, 0xb8, 0x64, 0x2d, 0xd8, 0x73, 0xbb, 0xc6, 0x6e, 0xcd, 0x9b, 0xa4, 0x9f, 0x1b, 0x4d, 0xf8, 0xa5, 0x40, 0x7c, 0xd2, 0x25, 0xdb, 0x98, 0xef, 0xb4, 0xbf, 0x7d, 0xd1, 0x99, 0xa4, 0x50, 0x15, 0xd4, 0x1c, 0xaa, 0x02, 0x60, 0xc8, 0xf9, 0x5e, 0xb6, 0xcb, 0x23, 0x85, 0x92, 0x7f, 0x6c, 0xbc, 0xf9, 0x67, 0x99, 0xc2, 0x7b, 0x65, 0x55, 0xa8, 0xb6, 0x2d, 0xd5, 0xe3, 0x1b, 0xfa, 0xb8, 0xa0, 0xf5, 0x80, 0x31, 0x57, 0xa6, 0x21, 0x67, 0xa3, 0x34, 0x63, 0x1c, 0x51, 0x05, 0xa2, 0x8d, 0xb6, 0xe7, 0x02, 0x9a, 0x46, 0x54, 0xa8, 0x27, 0x63, 0xf3, 0x2a, 0xc2, 0x73, 0x61, 0x43, 0x86, 0x35, 0x32, 0xcc ],
+const [ 0x59, 0x67, 0xeb, 0xc2, 0xc8, 0x07, 0x85, 0xc8, 0x7c, 0xda, 0x84, 0xa8, 0x88, 0xf4, 0xba, 0xb9, 0x73, 0x12, 0xff, 0x49, 0xe9, 0x81, 0x81, 0x9a, 0xb1, 0x3b, 0x5c, 0x2a, 0xdf, 0x54, 0x6b, 0x37, 0x4b, 0x94, 0x5d, 0x83, 0x41, 0x66, 0x0b, 0x55, 0x7a, 0xf0, 0x08, 0xc0, 0x4b, 0x84, 0x7a, 0x27, 0x1d, 0x37, 0x29, 0x01, 0x1d, 0xcf, 0xd6, 0xda, 0x35, 0xe3, 0xce, 0x9a, 0x3a, 0x3d, 0xbf, 0x0a, 0x67, 0x83, 0xc9, 0x94, 0x0a, 0x17, 0xd8, 0x4b, 0x7d, 0x3b, 0x32, 0x2b, 0x58, 0x79, 0x4c, 0xa1, 0xe5, 0x42, 0xe2, 0x4e, 0xd4, 0xd5, 0x46, 0x08, 0x30, 0x62, 0xf9, 0x21, 0x92, 0x6f, 0x78, 0xec, 0x95, 0x7c, 0x58, 0x7e, 0x89, 0xe2, 0x95, 0xb2, 0x6c, 0x01, 0x28, 0x70, 0x16, 0x9a, 0xd7, 0x2e, 0xb3, 0x7a, 0x51, 0xb6, 0x76, 0x59, 0x7a, 0x2a, 0x8c, 0x01, 0x04, 0x46, 0x4f, 0xb3, 0x3f, 0xe6 ],
+const [ 0xec, 0xc7, 0x14, 0xbd, 0x81, 0xaa, 0xc0, 0x00, 0x2a, 0x98, 0x7a, 0x81, 0xd3, 0x5d, 0x32, 0x88, 0x72, 0xa2, 0x3a, 0x2e, 0x8f, 0x63, 0xec, 0x6e, 0x03, 0xa4, 0x93, 0x7f, 0x00, 0x60, 0x89, 0x61, 0x51, 0xc3, 0x9c, 0xb7, 0xe3, 0x99, 0xb6, 0xd4, 0x85, 0x05, 0xbe, 0x18, 0xec, 0x76, 0xb9, 0x7d, 0xfa, 0xd7, 0x35, 0x6d, 0x40, 0x06, 0xe7, 0xd7, 0xc1, 0x88, 0x93, 0x81, 0xf8, 0x7b, 0x2c, 0xa0, 0x1d, 0xcb, 0x3d, 0xa6, 0xa5, 0xa9, 0x87, 0x5b, 0x08, 0x39, 0xeb, 0x2f, 0xc6, 0x8b, 0x8b, 0xce, 0xac, 0xcd, 0x2d, 0xf6, 0x53, 0xbf, 0xe0, 0x85, 0xeb, 0x67, 0xe1, 0xd7, 0x36, 0x05, 0xbf, 0x4e, 0xd7, 0x49, 0xbe, 0x32, 0xcd, 0xc4, 0x79, 0xbc, 0x3b, 0x9d, 0xcc, 0x6d, 0x6a, 0x85, 0xf1, 0xa4, 0x10, 0xec, 0xe9, 0x70, 0xd3, 0x75, 0x1e, 0xa3, 0x09, 0xa8, 0x46, 0x28, 0xc2, 0xe8, 0x8a, 0x96 ],
+const [ 0xf7, 0x53, 0xf3, 0xe9, 0xb4, 0xbd, 0x18, 0x95, 0xa2, 0x59, 0x49, 0x2b, 0xa1, 0x60, 0x71, 0x3f, 0x00, 0xac, 0x8e, 0x24, 0xdb, 0xbf, 0xab, 0x0d, 0xa7, 0x07, 0x0e, 0x72, 0x0b, 0x61, 0xb2, 0xb6, 0xf1, 0xdb, 0xf8, 0x06, 0xde, 0xbe, 0x99, 0x84, 0x7e, 0xcc, 0xdf, 0xa5, 0x84, 0xc6, 0x15, 0xd7, 0xb1, 0x31, 0x3c, 0x68, 0x31, 0x5a, 0xff, 0xa3, 0x2e, 0x98, 0xe9, 0x3c, 0xa0, 0xd1, 0xd6, 0xee, 0x62, 0x3f, 0xa7, 0x62, 0x8b, 0x74, 0x3a, 0x53, 0xfb, 0x9c, 0x9a, 0xf0, 0x34, 0x03, 0x72, 0x81, 0x6c, 0xd7, 0xc8, 0x4e, 0xe0, 0x2e, 0xe7, 0xbc, 0x6a, 0x4a, 0x9d, 0xba, 0x56, 0x1c, 0xa7, 0x5b, 0x72, 0x08, 0x6a, 0xc4, 0x64, 0xe8, 0xe4, 0x49, 0x40, 0x53, 0xe1, 0xd3, 0x5a, 0x1f, 0x72, 0x85, 0x59, 0x24, 0x9b, 0x9f, 0x8d, 0x43, 0x4c, 0xa2, 0x83, 0xa8, 0x92, 0xb5, 0xd6, 0x4b, 0x0f, 0x47 ],
+const [ 0x4e, 0x7c, 0x66, 0x7a, 0x38, 0xbe, 0xe0, 0x8a, 0xc5, 0x1a, 0xfd, 0xe3, 0xf2, 0x2f, 0x2e, 0x38, 0x73, 0x6a, 0x7f, 0x7d, 0x3f, 0x7b, 0x32, 0xf9, 0x4e, 0x05, 0xa7, 0x9b, 0xa1, 0x9a, 0x80, 0x91, 0x84, 0xe6, 0x02, 0x17, 0x10, 0x2a, 0xbd, 0x8d, 0xf3, 0xed, 0x6f, 0xcd, 0x74, 0xee, 0x26, 0xbb, 0xb1, 0x5c, 0xa5, 0x1e, 0x2b, 0x49, 0x09, 0xae, 0x85, 0x5d, 0xac, 0x6d, 0x89, 0xc7, 0x4a, 0x3b, 0x6c, 0x79, 0x62, 0xa5, 0x53, 0x95, 0xdf, 0xff, 0x15, 0x22, 0xf8, 0xb2, 0x43, 0x04, 0x55, 0xd6, 0x66, 0x2b, 0x73, 0x04, 0x87, 0x0a, 0x49, 0x65, 0xf5, 0x4b, 0x2c, 0x0f, 0x42, 0xc1, 0xf0, 0x92, 0x8f, 0x9e, 0x50, 0xcd, 0x09, 0xe6, 0x8f, 0x07, 0xb4, 0x23, 0x60, 0x3b, 0x68, 0x5b, 0x04, 0xb2, 0x19, 0x3f, 0xb2, 0xd7, 0x5b, 0xa5, 0x3b, 0x48, 0x24, 0x38, 0xee, 0x29, 0xd4, 0x6e, 0xb9, 0xbd ],
+const [ 0x7a, 0x00, 0x0b, 0x03, 0xfc, 0xe1, 0x76, 0xde, 0x62, 0x0f, 0x0d, 0xf2, 0xd9, 0xd3, 0x88, 0x6b, 0xee, 0x54, 0x01, 0x4d, 0xa4, 0x5e, 0xa6, 0x5b, 0xc3, 0x61, 0xb1, 0x38, 0x74, 0xbd, 0x9a, 0xcc, 0x0b, 0x3c, 0x8a, 0xe9, 0x24, 0xe0, 0x14, 0x2e, 0xf1, 0xe0, 0x20, 0x2c, 0xd2, 0xed, 0x27, 0xc8, 0x26, 0xb9, 0xa6, 0xe0, 0x62, 0xba, 0xcc, 0x32, 0x60, 0x2c, 0x76, 0x79, 0xf9, 0x55, 0x5e, 0xd8, 0xd5, 0x0c, 0x8f, 0x7c, 0x82, 0x7c, 0x1d, 0x7e, 0xc4, 0x26, 0x12, 0x06, 0x2c, 0x25, 0xab, 0xb6, 0xec, 0xb6, 0xc5, 0x46, 0xea, 0xf7, 0x92, 0x6b, 0x13, 0xef, 0x90, 0xfe, 0xf2, 0xcf, 0xbc, 0x5a, 0x81, 0x77, 0x03, 0x06, 0x3f, 0x3c, 0xf9, 0x94, 0x82, 0xe9, 0xcd, 0xc8, 0x0f, 0x03, 0x7d, 0xfd, 0xe8, 0x52, 0x46, 0xc5, 0x65, 0x9c, 0x5f, 0xd0, 0x86, 0xb4, 0xe6, 0x0f, 0x88, 0xb4, 0x1b, 0x18 ],
+const [ 0x9e, 0xeb, 0x07, 0x9c, 0x55, 0x2e, 0x42, 0x1f, 0x70, 0x30, 0x85, 0xb9, 0xb2, 0x75, 0xd5, 0xb0, 0x5c, 0x0c, 0x92, 0x2e, 0xfe, 0x14, 0xf2, 0xe7, 0x8c, 0x7f, 0xae, 0xfb, 0xb4, 0x16, 0xfb, 0x1e, 0x6f, 0xbd, 0xbc, 0xf6, 0xd7, 0xf9, 0xf6, 0xc4, 0x38, 0xaf, 0x84, 0x47, 0x69, 0x2f, 0x0c, 0xde, 0x5d, 0x70, 0x31, 0xec, 0xf5, 0x9d, 0x0a, 0x80, 0x18, 0xd1, 0xd3, 0x36, 0x06, 0x20, 0xe3, 0x58, 0xe9, 0xd6, 0xde, 0x49, 0xae, 0x03, 0x2c, 0x24, 0x12, 0x37, 0xaa, 0xa0, 0x00, 0x8a, 0x9f, 0x37, 0x1a, 0xdf, 0xf1, 0x87, 0x96, 0x6a, 0x99, 0xf8, 0x4b, 0x70, 0x54, 0x9f, 0x0b, 0x4e, 0x9b, 0x62, 0x34, 0xbd, 0xd6, 0x5d, 0x82, 0x54, 0xcd, 0x85, 0x27, 0x4f, 0x5f, 0x8b, 0x1e, 0x8e, 0x76, 0x04, 0xbc, 0xe1, 0x3a, 0xc6, 0x88, 0x82, 0x85, 0x95, 0x4c, 0xe3, 0x97, 0xff, 0x6c, 0xaa, 0x0c, 0x84 ],
+const [ 0x3a, 0xf3, 0x49, 0xf3, 0x64, 0x72, 0x18, 0xe4, 0xbe, 0x26, 0xfa, 0x86, 0x3a, 0xc7, 0x13, 0x81, 0xb6, 0x4f, 0xcc, 0xaa, 0x7e, 0x66, 0x76, 0x1e, 0x12, 0x1e, 0x30, 0x8e, 0x2a, 0xe0, 0x0a, 0xd9, 0xf8, 0xa7, 0x6a, 0xe0, 0xad, 0x6b, 0xaf, 0x96, 0x3e, 0xe1, 0x15, 0x56, 0x68, 0x61, 0xd8, 0x7a, 0xf2, 0x27, 0x9d, 0x29, 0x32, 0xbf, 0x0d, 0x70, 0xd2, 0xbb, 0xc3, 0x94, 0xd4, 0xa7, 0x68, 0xa7, 0xd4, 0x3f, 0x1c, 0x5a, 0x8d, 0xdf, 0x18, 0x12, 0x9f, 0x3a, 0x92, 0x3e, 0x90, 0x4f, 0xe1, 0xe7, 0x10, 0x99, 0xe2, 0x88, 0x81, 0x86, 0x9a, 0x21, 0xb6, 0x2b, 0x1d, 0x87, 0xfb, 0x36, 0xae, 0xfe, 0x56, 0x24, 0x27, 0x09, 0x0d, 0xb4, 0x9c, 0x81, 0x68, 0x9b, 0x3b, 0xe5, 0xb8, 0x79, 0x76, 0xf1, 0x98, 0x0c, 0x65, 0x72, 0x73, 0xa3, 0x65, 0x58, 0x47, 0xd6, 0x06, 0x0d, 0xa8, 0x75, 0x24, 0x05 ],
+const [ 0x13, 0xaa, 0xeb, 0x07, 0x4c, 0x23, 0x59, 0x7b, 0xf5, 0x55, 0x7b, 0x22, 0x13, 0x00, 0xad, 0x3d, 0xf2, 0x11, 0xae, 0xdc, 0x75, 0xb1, 0x98, 0xfe, 0xaa, 0x81, 0x16, 0xf8, 0xa1, 0x24, 0xd1, 0x1b, 0x7f, 0xff, 0x2b, 0x91, 0xce, 0x3c, 0x30, 0x88, 0x17, 0x15, 0xc9, 0x93, 0xb3, 0x4f, 0x33, 0x4c, 0xde, 0x04, 0xb0, 0x3f, 0x0d, 0xa6, 0x7d, 0x03, 0x82, 0x41, 0x03, 0xaa, 0x1d, 0x00, 0x51, 0x5c, 0x75, 0xf3, 0xca, 0x3e, 0x27, 0x0f, 0x1b, 0x98, 0x6e, 0x77, 0x71, 0x38, 0xf4, 0xfa, 0xe8, 0x11, 0xe8, 0xdc, 0x46, 0x28, 0x51, 0xd9, 0xe9, 0xb1, 0xa2, 0x67, 0xfe, 0x74, 0x8e, 0x3c, 0xf4, 0x76, 0x1d, 0x10, 0x30, 0xd6, 0x00, 0xa4, 0x03, 0xf5, 0x22, 0x03, 0xd9, 0xd9, 0x7f, 0x07, 0xb3, 0xd4, 0x39, 0x20, 0xd7, 0x60, 0xe8, 0x51, 0xc5, 0x4e, 0x32, 0x7b, 0x6e, 0x20, 0x9d, 0xde, 0xa1, 0xb3 ],
+const [ 0x01, 0x36, 0xea, 0x47, 0x6e, 0x2e, 0x82, 0x3f, 0x8e, 0x00, 0xbb, 0xcc, 0x7f, 0x9f, 0xc7, 0x27, 0x2e, 0x95, 0x1b, 0xc4, 0xca, 0xa6, 0x7e, 0x1d, 0x78, 0xb0, 0x60, 0xb2, 0x48, 0xd6, 0x6e, 0x4e, 0x67, 0xdd, 0x63, 0x8b, 0x97, 0xd6, 0x21, 0x98, 0xdd, 0xfe, 0x00, 0x3a, 0x79, 0xe2, 0x66, 0x11, 0x1b, 0xc7, 0x98, 0x1d, 0x54, 0x48, 0xcf, 0x81, 0x4b, 0x41, 0x8f, 0x86, 0xb1, 0xec, 0x34, 0xe2, 0xf7, 0x4a, 0xce, 0x3b, 0xbe, 0xc5, 0x2e, 0xe7, 0x8f, 0x13, 0x41, 0xf6, 0xcc, 0x5d, 0x9d, 0x72, 0xe6, 0xa1, 0x5a, 0xe5, 0xd1, 0x55, 0x23, 0x1c, 0xb5, 0x4d, 0x8c, 0x2b, 0xe7, 0xde, 0xa6, 0xb1, 0x17, 0x44, 0xd2, 0x5d, 0xcb, 0x41, 0xd2, 0xb1, 0x0c, 0x07, 0x26, 0x06, 0x5e, 0x58, 0x95, 0xd1, 0xf6, 0xec, 0x0a, 0x24, 0x28, 0x13, 0xa1, 0x78, 0x1f, 0x9b, 0x02, 0xa9, 0xd0, 0xf4, 0xee, 0x42 ],
+const [ 0x0c, 0x36, 0xca, 0x43, 0xe7, 0xc1, 0x13, 0xed, 0x9f, 0xb7, 0x16, 0x70, 0xb3, 0xea, 0x73, 0xbf, 0xd6, 0x92, 0x8c, 0x83, 0x9f, 0x36, 0xdb, 0x1a, 0x82, 0xd0, 0x8a, 0xe0, 0xff, 0x2c, 0x3d, 0xae, 0x19, 0x91, 0x33, 0xa1, 0x0a, 0xa3, 0x8d, 0x1d, 0x35, 0x88, 0xed, 0x11, 0x5c, 0x4a, 0x43, 0x7c, 0x13, 0x7c, 0xe4, 0x30, 0x74, 0x21, 0xdd, 0xd6, 0x15, 0xc9, 0x86, 0x32, 0x37, 0xfd, 0x5a, 0xa8, 0x40, 0xdd, 0x05, 0xff, 0x6c, 0x08, 0xbf, 0x66, 0xbf, 0xbc, 0xd9, 0xb4, 0x3e, 0x3f, 0x95, 0xf4, 0x5e, 0x7d, 0x3b, 0x21, 0xbd, 0xf2, 0x69, 0x2e, 0x10, 0xca, 0xab, 0x49, 0x5c, 0x47, 0x4b, 0x61, 0x6a, 0x64, 0x6b, 0xe6, 0x75, 0xb8, 0x50, 0xd0, 0x25, 0x9c, 0x01, 0xe2, 0xc1, 0x90, 0x11, 0x30, 0xa0, 0xdb, 0xb9, 0xdf, 0xe0, 0x72, 0x2a, 0x2c, 0x5b, 0x1b, 0x20, 0xaf, 0xd7, 0xd2, 0xbb, 0xe1 ],
+const [ 0xab, 0x5d, 0xa4, 0xa6, 0x4f, 0xbb, 0xf3, 0xc6, 0x0f, 0x5a, 0xb1, 0xf7, 0x77, 0x6e, 0xd6, 0xa5, 0x57, 0x51, 0xe3, 0x9a, 0x5e, 0xc8, 0x19, 0x67, 0xea, 0x88, 0xe9, 0x06, 0x1f, 0xf9, 0xad, 0xbd, 0x37, 0x39, 0x95, 0x45, 0x18, 0x64, 0xe4, 0x2c, 0x2c, 0x13, 0x5c, 0x78, 0x6d, 0x22, 0xf6, 0x8d, 0xbf, 0xb7, 0xd7, 0x51, 0x83, 0x7f, 0x80, 0x8d, 0x69, 0x3b, 0x45, 0x97, 0x85, 0x7c, 0x00, 0x2e, 0xa6, 0xaa, 0x06, 0xa5, 0xe3, 0x4b, 0x5a, 0x44, 0x76, 0x82, 0x21, 0xeb, 0xce, 0xd6, 0x56, 0xf8, 0xdf, 0x35, 0xbf, 0x6b, 0xbd, 0x39, 0x20, 0x48, 0x69, 0xaa, 0xae, 0x3d, 0xea, 0x43, 0xc6, 0x85, 0xa0, 0xb9, 0xdf, 0x0c, 0xd6, 0xf9, 0xbe, 0xd4, 0x96, 0xb1, 0xe9, 0x97, 0xc1, 0x13, 0x5d, 0xae, 0x5f, 0xd6, 0x83, 0x31, 0x33, 0x7d, 0x61, 0x60, 0x92, 0xdb, 0x0d, 0x41, 0x76, 0xd7, 0x68, 0x8b ],
+const [ 0xb7, 0xb3, 0x58, 0x0d, 0xaf, 0x78, 0x3c, 0x07, 0x0f, 0xa8, 0xfd, 0x14, 0x3f, 0x5a, 0x65, 0xa1, 0x81, 0x15, 0xed, 0x1a, 0x26, 0x38, 0x8c, 0x67, 0x02, 0x99, 0xcd, 0xb7, 0x1d, 0x6d, 0x24, 0x7c, 0xab, 0x68, 0x82, 0xb6, 0x3f, 0x25, 0x27, 0x75, 0x3b, 0xc7, 0xb8, 0x99, 0x8b, 0xe1, 0x91, 0xdd, 0x93, 0x93, 0x5c, 0x14, 0x65, 0xf6, 0xe2, 0xb2, 0x38, 0xba, 0x22, 0x8d, 0x16, 0x0e, 0xa0, 0xe5, 0xd4, 0xc0, 0x00, 0xa2, 0x47, 0xa6, 0xd3, 0xde, 0xb5, 0x3c, 0xb1, 0xa3, 0x8a, 0x8e, 0x88, 0xf6, 0x4c, 0x59, 0x33, 0x14, 0xd1, 0x6d, 0x4f, 0xfb, 0xb0, 0x55, 0x4a, 0x2c, 0xf5, 0x3a, 0xbc, 0xb0, 0x19, 0x05, 0xfb, 0x59, 0x31, 0xc4, 0xea, 0x4a, 0x65, 0x4f, 0x11, 0xb9, 0xa4, 0x2b, 0xf3, 0xf4, 0x96, 0xae, 0x9b, 0xa2, 0xd2, 0x64, 0x79, 0x4c, 0x52, 0xb2, 0x6c, 0x1c, 0x23, 0xb9, 0x20, 0xe4 ],
+const [ 0x2a, 0xb5, 0x33, 0x07, 0x8b, 0x33, 0x14, 0x94, 0x9c, 0x1f, 0x34, 0xc6, 0x8b, 0xfd, 0xd7, 0x67, 0x50, 0xf7, 0x51, 0x05, 0x90, 0x2c, 0x11, 0xe8, 0xc1, 0x4a, 0xde, 0x47, 0x90, 0x5f, 0x61, 0xbb, 0x7f, 0xec, 0xe4, 0xf3, 0xd3, 0x3c, 0x59, 0xaa, 0xad, 0xf3, 0x9e, 0xd6, 0x77, 0xea, 0xff, 0x22, 0x81, 0x3a, 0xfd, 0x9f, 0xec, 0x97, 0x4d, 0xb6, 0xc8, 0xe0, 0x24, 0x62, 0x79, 0xf3, 0xb2, 0x9c, 0x5f, 0xc6, 0xec, 0x16, 0xb6, 0xb4, 0x8f, 0x2b, 0xba, 0x14, 0x62, 0x16, 0x0f, 0x10, 0xbb, 0x63, 0x61, 0xb5, 0x44, 0xa4, 0x48, 0x46, 0xff, 0x65, 0x6e, 0xd6, 0x88, 0x62, 0xf3, 0x15, 0x9b, 0xf7, 0x10, 0x6b, 0xd5, 0xd7, 0xfb, 0x43, 0xbf, 0x01, 0x0b, 0xaa, 0x08, 0xf0, 0x1d, 0x18, 0x12, 0x12, 0x36, 0x8d, 0xb1, 0x7c, 0x6a, 0xe0, 0x2f, 0xdc, 0xfc, 0x54, 0x93, 0xaf, 0xc6, 0x6d, 0x22, 0xb4 ],
+const [ 0xd1, 0xa3, 0x1b, 0x1f, 0x3a, 0x21, 0xb5, 0x51, 0xdf, 0xc1, 0x6b, 0xaf, 0x8b, 0xb0, 0x02, 0xf4, 0xd8, 0xb0, 0x8b, 0x02, 0xf5, 0xc6, 0x43, 0x31, 0xa7, 0x32, 0xb7, 0xe7, 0x8e, 0xa4, 0x2c, 0x69, 0xaa, 0xad, 0x3d, 0xf0, 0x1e, 0x74, 0xc6, 0x00, 0x33, 0xaa, 0x01, 0xf5, 0x9f, 0xc0, 0xef, 0xdf, 0x08, 0x57, 0xfa, 0x8f, 0xc4, 0xf8, 0xd8, 0xf2, 0xe3, 0x05, 0xb2, 0x9e, 0x6f, 0xef, 0x86, 0xab, 0xf2, 0xaa, 0xca, 0xc4, 0x39, 0x5e, 0x52, 0x7d, 0x58, 0x60, 0x73, 0xe7, 0xee, 0x60, 0x69, 0x63, 0xaa, 0xe4, 0xf6, 0xb3, 0x0e, 0xf5, 0x4c, 0x57, 0x73, 0x17, 0x2d, 0x16, 0x4e, 0x7f, 0x51, 0xdb, 0xb1, 0x81, 0x08, 0xc2, 0x15, 0x48, 0x20, 0x73, 0x56, 0xc9, 0x09, 0xaf, 0xff, 0xf9, 0x37, 0x28, 0xc8, 0x3e, 0xc8, 0x96, 0x5d, 0x24, 0x67, 0x07, 0x61, 0x52, 0x70, 0x76, 0xb3, 0xbc, 0x54, 0xa0 ],
+const [ 0x4c, 0x76, 0xc4, 0xe4, 0x16, 0xbe, 0x43, 0xac, 0x38, 0x2a, 0xbf, 0x32, 0xf4, 0x4d, 0x96, 0x32, 0xa7, 0x5c, 0x33, 0x37, 0x40, 0xd8, 0x28, 0x5f, 0xf6, 0x6d, 0x7d, 0x5e, 0x3b, 0x1b, 0x48, 0xc5, 0xeb, 0x93, 0x7e, 0x85, 0xca, 0xe4, 0x09, 0xae, 0x2d, 0x56, 0x1b, 0x7d, 0xf7, 0x96, 0xc1, 0x96, 0xc7, 0x14, 0xbb, 0x8e, 0x70, 0xaa, 0x8b, 0xac, 0xaa, 0x7e, 0xcc, 0xf1, 0x07, 0x29, 0xc5, 0x55, 0x28, 0x19, 0x3e, 0x54, 0x30, 0x33, 0x92, 0xa9, 0x79, 0xbd, 0x06, 0x5a, 0x86, 0x7c, 0x59, 0xf4, 0x39, 0x19, 0x9d, 0x18, 0x46, 0xca, 0x45, 0x36, 0xe8, 0x2e, 0x7e, 0x99, 0xd3, 0x78, 0xc3, 0xa4, 0x69, 0xcf, 0xab, 0x5b, 0x30, 0xf5, 0x06, 0x25, 0x84, 0x27, 0x29, 0xcf, 0x89, 0x45, 0x86, 0xd5, 0x64, 0x33, 0x80, 0xdd, 0xab, 0x7f, 0x7d, 0x85, 0x19, 0x44, 0x3c, 0x5e, 0x87, 0x4e, 0x69, 0x38 ],
+const [ 0x34, 0xf6, 0xd2, 0x87, 0x7d, 0x88, 0x0c, 0x45, 0x40, 0x8f, 0x53, 0xa1, 0xd8, 0xff, 0x95, 0x61, 0x46, 0xec, 0x6b, 0x48, 0x8e, 0x57, 0x9f, 0x8e, 0x5e, 0x48, 0xec, 0x8d, 0xf1, 0x1d, 0x04, 0xbd, 0x33, 0x21, 0xd8, 0xe2, 0x26, 0x60, 0x13, 0x84, 0x84, 0xba, 0xe7, 0xa0, 0xa6, 0x37, 0x0d, 0x9d, 0xa4, 0x9a, 0x07, 0x81, 0xbe, 0x39, 0xa9, 0x65, 0xfa, 0x0b, 0xd7, 0x27, 0x0f, 0x03, 0x90, 0x5e, 0x82, 0x9c, 0x2c, 0x93, 0x0f, 0xb6, 0xe1, 0xae, 0x4a, 0xa0, 0x8c, 0xae, 0x86, 0x76, 0xae, 0x9d, 0xf6, 0xad, 0xb5, 0xc3, 0x12, 0xec, 0x7e, 0x1b, 0x3c, 0x1d, 0x17, 0x03, 0xa4, 0xc5, 0xc9, 0x37, 0x69, 0x90, 0x56, 0x00, 0x01, 0x31, 0x7f, 0xa9, 0xda, 0x68, 0xc9, 0x33, 0x41, 0x64, 0x81, 0x4a, 0x84, 0x4c, 0xfe, 0x77, 0x53, 0x19, 0x26, 0x96, 0x6c, 0xa6, 0x34, 0x8b, 0x78, 0x0a, 0xb8, 0x31 ],
+const [ 0xcf, 0x3f, 0xd2, 0x62, 0x06, 0x8f, 0x49, 0x0c, 0x20, 0x3d, 0x8b, 0xa5, 0x78, 0x09, 0xe6, 0x93, 0xee, 0x28, 0x4f, 0x4a, 0x37, 0x44, 0x53, 0x6e, 0x77, 0xc5, 0x51, 0x37, 0x11, 0x4f, 0xe7, 0x1a, 0xbd, 0x8b, 0xaa, 0xa6, 0xdc, 0x2b, 0x1a, 0xac, 0x09, 0x28, 0xd5, 0xa2, 0xf1, 0x4e, 0x0a, 0x49, 0x64, 0xfb, 0x31, 0x8e, 0xac, 0x24, 0xf9, 0xae, 0x1d, 0x98, 0x82, 0x9e, 0xed, 0x89, 0xcd, 0xaa, 0x46, 0x48, 0x71, 0x5c, 0x9a, 0x50, 0x8f, 0x9f, 0x37, 0x86, 0x07, 0x24, 0x1b, 0xbf, 0xec, 0x05, 0x09, 0x83, 0x36, 0xa9, 0xdc, 0x11, 0xb7, 0xe7, 0x1c, 0xa2, 0x51, 0x6e, 0xcf, 0xf2, 0x65, 0x64, 0x91, 0xfd, 0x8e, 0x4d, 0xe7, 0x06, 0x90, 0x2f, 0xd1, 0xde, 0x8b, 0xf3, 0x9e, 0x63, 0x75, 0x0f, 0x04, 0x47, 0xc6, 0x62, 0x70, 0x13, 0x75, 0x5f, 0x9b, 0x6b, 0x24, 0x6e, 0x5e, 0x93, 0x98, 0x8f ],
+const [ 0xf5, 0x70, 0x27, 0x3a, 0x4e, 0x5d, 0xba, 0xb3, 0x84, 0x10, 0xe4, 0xaf, 0x67, 0x29, 0x95, 0xeb, 0x08, 0x84, 0x08, 0x46, 0x1e, 0x0e, 0x47, 0x30, 0xa8, 0xd7, 0xf1, 0x5f, 0xd4, 0x69, 0x3b, 0xc3, 0x20, 0x59, 0x35, 0xbd, 0xbf, 0x1b, 0x4f, 0x8c, 0x3e, 0x1a, 0x1b, 0x08, 0x67, 0x08, 0x54, 0x92, 0x66, 0x73, 0x20, 0x4b, 0x2a, 0x9a, 0x92, 0x84, 0x0e, 0x7e, 0x73, 0x76, 0xb9, 0x3c, 0x42, 0x33, 0x42, 0x99, 0x79, 0xdd, 0x98, 0xdf, 0x12, 0x16, 0x22, 0xe8, 0x4a, 0xb7, 0xa2, 0x78, 0xa5, 0xc5, 0x5f, 0xd0, 0x32, 0xa1, 0x83, 0x7f, 0x10, 0x7e, 0xc2, 0x7c, 0x31, 0x18, 0x3c, 0x72, 0x5e, 0xa4, 0xa5, 0x5b, 0x7b, 0x02, 0xa3, 0x50, 0x0d, 0x3a, 0x77, 0x9f, 0xf9, 0x26, 0xe0, 0x1f, 0x8e, 0x6c, 0x3c, 0xc0, 0xc6, 0xb0, 0xf1, 0x66, 0xc9, 0x07, 0x0b, 0xf8, 0xb3, 0xae, 0x27, 0xb3, 0x97, 0xfc ],
+const [ 0x25, 0x12, 0x71, 0x8e, 0x7c, 0x13, 0x9a, 0xcd, 0xcd, 0x32, 0x43, 0x03, 0xdb, 0x3a, 0xdb, 0x70, 0x34, 0x8d, 0x09, 0xb0, 0x58, 0xba, 0xf0, 0xe9, 0x1d, 0x52, 0xb2, 0x49, 0x52, 0xf8, 0x32, 0xb0, 0xa3, 0xb8, 0x1f, 0xa9, 0xbc, 0x9a, 0x2e, 0x9f, 0xb2, 0x76, 0xa6, 0x4e, 0x9e, 0x09, 0x22, 0x77, 0x8b, 0x49, 0x92, 0xd8, 0x92, 0xf6, 0x84, 0x5b, 0x43, 0x72, 0xa2, 0x8e, 0x47, 0xd2, 0x7b, 0x53, 0x44, 0x35, 0x86, 0xd9, 0x01, 0x54, 0x63, 0xca, 0xcb, 0x5b, 0x65, 0xc6, 0x17, 0xf8, 0x4e, 0x11, 0x68, 0xb1, 0x59, 0x88, 0x73, 0x7a, 0x7e, 0xda, 0x81, 0x87, 0xf1, 0xf4, 0x16, 0x5f, 0xec, 0xbd, 0xd0, 0x32, 0xae, 0x04, 0x91, 0x6c, 0xc4, 0xb6, 0xe1, 0x8a, 0x87, 0x55, 0x8d, 0x2c, 0xe6, 0xa5, 0x94, 0x6c, 0x65, 0xa9, 0x44, 0x6f, 0x66, 0xcd, 0xa1, 0x39, 0xa7, 0x65, 0x06, 0xc6, 0x0d, 0x56 ],
+const [ 0xb3, 0xfa, 0x42, 0xc5, 0x1a, 0xab, 0xb7, 0x08, 0xa6, 0x4e, 0x40, 0x56, 0x40, 0x2f, 0xc9, 0x7b, 0xd8, 0x96, 0x48, 0x20, 0xc0, 0x9c, 0x45, 0x41, 0x52, 0x3c, 0x99, 0xe2, 0xd9, 0xad, 0x76, 0xfe, 0xaf, 0xef, 0xa7, 0xc1, 0xa2, 0xa5, 0x19, 0xf7, 0x9c, 0x22, 0x9b, 0xc3, 0x84, 0xc6, 0xe2, 0x94, 0x5f, 0x8b, 0xd0, 0x55, 0xbb, 0xdb, 0xf6, 0xe4, 0x4d, 0xa5, 0x57, 0xc6, 0xd9, 0xaf, 0x6e, 0x19, 0x52, 0x2e, 0x73, 0xc9, 0x43, 0x94, 0xdb, 0x07, 0x6d, 0xa9, 0x1e, 0xf7, 0xb1, 0xdd, 0xbc, 0xa9, 0x31, 0xdc, 0x82, 0x4b, 0xb3, 0x64, 0x09, 0x9d, 0x46, 0x53, 0x81, 0xa5, 0x27, 0x05, 0xac, 0xa3, 0xe5, 0xdc, 0x2d, 0x47, 0xc4, 0x20, 0x03, 0x22, 0x5f, 0x0a, 0x51, 0x5b, 0x92, 0x1b, 0x60, 0xa3, 0x97, 0xb2, 0xe6, 0x6a, 0x6f, 0xde, 0x89, 0x53, 0x84, 0x71, 0x9f, 0xe6, 0x8c, 0x56, 0x38, 0x86 ],
+const [ 0x64, 0x97, 0x1c, 0xe1, 0x86, 0xec, 0x2d, 0xbe, 0x03, 0x7c, 0xa7, 0x14, 0xf2, 0x12, 0xf6, 0x2f, 0xc8, 0x63, 0xd0, 0x80, 0x79, 0x9e, 0x72, 0xdb, 0xe0, 0x44, 0x2d, 0xe3, 0x61, 0x3a, 0x22, 0xc2, 0xcd, 0x1d, 0x4a, 0x1d, 0x85, 0xd5, 0xb9, 0x46, 0xe3, 0x6d, 0x23, 0xb4, 0xd5, 0x21, 0x9f, 0xb1, 0xcb, 0xb9, 0xab, 0x53, 0xd4, 0x16, 0x70, 0xad, 0x03, 0x0b, 0x48, 0x46, 0x18, 0x6e, 0x7e, 0xcb, 0x5c, 0x6e, 0x55, 0x00, 0xcd, 0x26, 0x4b, 0xfc, 0x7b, 0x73, 0x9e, 0x96, 0x32, 0x03, 0x10, 0x1b, 0x59, 0xaf, 0xe7, 0x42, 0x1a, 0x0b, 0x39, 0x61, 0xc4, 0x3b, 0x66, 0xe0, 0x6d, 0x08, 0xe6, 0xee, 0xdb, 0x33, 0x45, 0x74, 0xa5, 0x08, 0x6b, 0x47, 0x95, 0x37, 0x21, 0xa2, 0x51, 0xe0, 0xd1, 0xd3, 0x3a, 0xed, 0x8d, 0x34, 0x95, 0xa4, 0x53, 0x5d, 0xe9, 0x7c, 0x90, 0x98, 0xa7, 0x30, 0xe2, 0x96 ],
+const [ 0x33, 0xd8, 0xe9, 0xe9, 0xc0, 0x66, 0xe5, 0x3f, 0x1b, 0x7d, 0x68, 0x9f, 0x82, 0xf3, 0x3f, 0xb1, 0xcc, 0xd9, 0x87, 0x2a, 0xa7, 0xad, 0x15, 0xa1, 0x25, 0xd1, 0x15, 0x9f, 0x77, 0x3c, 0xf0, 0xf5, 0xf8, 0x70, 0x74, 0x52, 0x6d, 0xac, 0x2f, 0x14, 0x8a, 0x62, 0x1b, 0x5f, 0xb9, 0xeb, 0x81, 0x6c, 0x18, 0x7a, 0x17, 0x24, 0xc0, 0x4f, 0x6b, 0xee, 0x4d, 0x2d, 0x85, 0xc5, 0x9b, 0x0d, 0xc8, 0x8d, 0xcd, 0x14, 0x1a, 0xa7, 0x94, 0xc3, 0x45, 0xc3, 0xae, 0x6e, 0x9c, 0xf5, 0xac, 0xef, 0xe1, 0x0c, 0xf9, 0x9b, 0x66, 0x1f, 0x18, 0x75, 0x73, 0x68, 0x2d, 0xa2, 0xe8, 0x55, 0xbf, 0x1d, 0x23, 0xdd, 0xbc, 0xac, 0x24, 0x11, 0xbd, 0x13, 0xef, 0xf3, 0x8c, 0x87, 0x32, 0x8a, 0xe4, 0x65, 0x28, 0x36, 0x77, 0x24, 0xbd, 0x42, 0x35, 0x89, 0xf3, 0xb8, 0xcc, 0x19, 0x84, 0x79, 0x6b, 0xd4, 0xc9, 0x8c ],
+const [ 0x6a, 0xf0, 0x47, 0x3b, 0x68, 0xf3, 0x89, 0xd5, 0xb6, 0xf2, 0x0e, 0xfc, 0x60, 0xdd, 0xdc, 0x2f, 0x35, 0x51, 0xe6, 0x21, 0x70, 0xb0, 0xd5, 0x69, 0x98, 0x77, 0x07, 0x7b, 0xa4, 0xcc, 0xd8, 0xd7, 0x63, 0x57, 0x21, 0x80, 0x1b, 0x53, 0xff, 0xb0, 0x71, 0xe5, 0xd6, 0xca, 0x88, 0xac, 0x95, 0x90, 0x6d, 0x99, 0x3b, 0x96, 0xb3, 0x01, 0x9a, 0xf6, 0x5a, 0xf0, 0x5a, 0x46, 0xf6, 0xc1, 0x42, 0xc7, 0x0c, 0xeb, 0xb3, 0xdf, 0xc0, 0x1e, 0x75, 0xca, 0xad, 0x8f, 0xb7, 0x8c, 0x15, 0x90, 0x50, 0x2a, 0x3a, 0x63, 0x4b, 0x19, 0x0b, 0x50, 0xa3, 0xf7, 0x03, 0xf5, 0x4b, 0x79, 0x4f, 0xde, 0x71, 0xa5, 0x2f, 0x55, 0x04, 0x41, 0x9e, 0x7b, 0x74, 0x8b, 0x35, 0x98, 0xb9, 0x2a, 0x4d, 0xb0, 0x96, 0x65, 0x64, 0x57, 0x1f, 0x93, 0xc2, 0xc5, 0x79, 0xd2, 0x5b, 0x2d, 0xe1, 0xfc, 0xf8, 0x4b, 0xef, 0xd7 ],
+const [ 0x8e, 0x7a, 0xae, 0x5e, 0xd6, 0x83, 0x2b, 0x58, 0xcf, 0x20, 0x00, 0x19, 0x10, 0x18, 0x22, 0xd0, 0xd5, 0x4c, 0x42, 0x78, 0xfe, 0xa6, 0xf5, 0x68, 0x5b, 0x4c, 0x11, 0x26, 0x26, 0x19, 0x5a, 0x7d, 0xd1, 0x4d, 0x5e, 0xcf, 0x03, 0x83, 0x9d, 0xac, 0xdd, 0xe4, 0xed, 0xa2, 0x81, 0x9b, 0x1d, 0x57, 0xd5, 0x88, 0xd9, 0xd6, 0x84, 0x39, 0xcd, 0x27, 0x46, 0x16, 0x0e, 0x22, 0x62, 0xdb, 0xb5, 0x84, 0x71, 0x4c, 0xcd, 0x43, 0x64, 0x24, 0x6f, 0x1f, 0xc8, 0x4e, 0x2b, 0x7a, 0x49, 0x57, 0xaa, 0x69, 0x75, 0x24, 0x92, 0x0b, 0xc3, 0xe0, 0xaa, 0x1a, 0xd4, 0x39, 0x3f, 0xbf, 0xf8, 0xcc, 0xc6, 0xab, 0xf4, 0xdd, 0xc2, 0x63, 0x03, 0x4c, 0xe8, 0xdb, 0x1a, 0xc4, 0x81, 0x47, 0x70, 0x36, 0x11, 0x2e, 0x3e, 0x86, 0x36, 0xc0, 0xc3, 0x84, 0xd2, 0x69, 0x8c, 0x1d, 0x6c, 0xa6, 0xf2, 0xd3, 0xd4, 0x18 ],
+const [ 0xc0, 0xb1, 0x84, 0xc7, 0xb9, 0xe4, 0xcb, 0x8d, 0xd1, 0x9a, 0xf3, 0x77, 0x30, 0x65, 0x16, 0xc5, 0x63, 0xb3, 0xb8, 0x78, 0xba, 0xa2, 0x50, 0xc1, 0xee, 0x16, 0x05, 0xb9, 0x07, 0x08, 0xb5, 0x52, 0x7d, 0x21, 0x3b, 0x8e, 0x9e, 0x87, 0xf2, 0xef, 0x2f, 0xf7, 0x75, 0x2e, 0x56, 0x14, 0xa9, 0x30, 0xb8, 0xfe, 0xfe, 0x35, 0xde, 0x27, 0xf1, 0x53, 0xdd, 0x62, 0xd6, 0x23, 0x36, 0x3d, 0xd4, 0xba, 0xfb, 0x91, 0x31, 0xda, 0x33, 0x57, 0xcf, 0x6a, 0x80, 0xbd, 0xf7, 0x24, 0xff, 0x7a, 0x56, 0x8e, 0x70, 0x5e, 0x45, 0x2b, 0x97, 0x2d, 0x4e, 0xf2, 0xe1, 0xad, 0xeb, 0xff, 0x4b, 0xfe, 0x90, 0x89, 0x80, 0x2a, 0xec, 0x14, 0x41, 0xfd, 0x6d, 0xe7, 0x0a, 0x17, 0x02, 0xc1, 0xf3, 0x3f, 0x24, 0xc8, 0xd4, 0xfa, 0x17, 0xc2, 0xac, 0x5c, 0x6d, 0x87, 0x44, 0x1f, 0xcd, 0xb6, 0x0f, 0xf2, 0xf2, 0xa8 ],
+const [ 0x28, 0xaa, 0xb2, 0xe4, 0xa0, 0xe5, 0x5c, 0x11, 0xd5, 0x50, 0x3c, 0x4d, 0xca, 0xb5, 0x84, 0x54, 0x5c, 0x49, 0x23, 0xa6, 0x1b, 0x31, 0x3c, 0x2c, 0x5a, 0x44, 0xd6, 0x1d, 0x82, 0x13, 0xd5, 0x23, 0xac, 0x26, 0x29, 0xba, 0x6e, 0x89, 0x45, 0xd9, 0xf4, 0x88, 0xd2, 0xd5, 0x53, 0xb6, 0xa5, 0x82, 0x1b, 0x34, 0xef, 0x9b, 0x2b, 0x2f, 0xb4, 0x64, 0xca, 0xab, 0x7f, 0x8d, 0xf3, 0x7f, 0x53, 0x5a, 0xef, 0xa1, 0xe4, 0x01, 0x2a, 0xa4, 0x07, 0x54, 0x3f, 0x7f, 0x68, 0x9f, 0x55, 0x90, 0x7b, 0xd4, 0xae, 0xe1, 0xb5, 0xe5, 0x7d, 0xa9, 0xfb, 0x72, 0xf8, 0x16, 0x5b, 0xa4, 0xaf, 0x49, 0xfa, 0x59, 0x1c, 0xa3, 0x4d, 0x81, 0x7b, 0x3f, 0x8c, 0xc7, 0xdc, 0xbf, 0x64, 0x75, 0x76, 0x4c, 0xed, 0x91, 0x3e, 0xd8, 0xdb, 0x4c, 0xb8, 0xa6, 0xf8, 0x9e, 0x0d, 0x0d, 0xd2, 0x2a, 0x5f, 0x79, 0xb0, 0x67 ],
+const [ 0xfb, 0xdb, 0xc0, 0xf3, 0x66, 0xd4, 0x67, 0x86, 0x54, 0x54, 0x48, 0x04, 0xb8, 0xd6, 0xfd, 0x6f, 0x17, 0x16, 0x68, 0xf2, 0x83, 0x2e, 0x46, 0x23, 0xcd, 0xff, 0x07, 0x85, 0xf7, 0xd2, 0xde, 0x51, 0xe8, 0x3f, 0x14, 0x76, 0x63, 0x4f, 0xa1, 0xde, 0x3a, 0xdd, 0xfd, 0xf3, 0xbf, 0x42, 0x34, 0x62, 0x7c, 0x31, 0x39, 0x1e, 0x24, 0xdf, 0x7c, 0xa9, 0xc9, 0x67, 0xbe, 0x8f, 0x4e, 0x6e, 0x24, 0x33, 0x20, 0x02, 0x8b, 0xcd, 0x21, 0xc8, 0x1c, 0xb4, 0xe5, 0x57, 0x20, 0xd9, 0x21, 0xdf, 0x15, 0x94, 0x60, 0x0e, 0x01, 0xa4, 0xf8, 0x34, 0x06, 0x71, 0x3d, 0xa5, 0x37, 0x93, 0xf4, 0x5f, 0xaa, 0x98, 0x0b, 0xec, 0xce, 0x02, 0x87, 0x8a, 0xff, 0x90, 0xbd, 0x8a, 0x58, 0xbf, 0xc5, 0xf6, 0xc9, 0x8f, 0x2c, 0x76, 0x69, 0x8a, 0xe9, 0x74, 0x0d, 0x03, 0x92, 0x7f, 0x19, 0x9c, 0xd0, 0xed, 0x96, 0x0b ],
+const [ 0x39, 0xb9, 0x71, 0xd2, 0x86, 0x92, 0xe9, 0xa0, 0xb5, 0x78, 0x1c, 0x9d, 0x40, 0x90, 0xe8, 0x39, 0xa7, 0xea, 0x70, 0x21, 0xb5, 0xb4, 0x79, 0x10, 0x04, 0xad, 0x14, 0xe8, 0xc3, 0xdd, 0x7e, 0x01, 0xb7, 0x84, 0x44, 0xc1, 0x80, 0x50, 0xaa, 0x6d, 0x1e, 0xd2, 0x4e, 0x3e, 0xb3, 0x33, 0x09, 0xb8, 0x8a, 0x23, 0x16, 0x37, 0x59, 0x13, 0x76, 0xcb, 0xc3, 0xa4, 0x92, 0x45, 0x21, 0x5f, 0x23, 0x92, 0x82, 0xa6, 0x4f, 0x48, 0xf0, 0xea, 0x14, 0x7f, 0xf6, 0x1f, 0xea, 0xe2, 0x5f, 0x6d, 0xa4, 0x06, 0x3f, 0x29, 0x98, 0xfa, 0x38, 0x03, 0xff, 0x1f, 0xf6, 0x81, 0x9f, 0x39, 0xfc, 0xac, 0xa7, 0xc7, 0xa3, 0x09, 0xda, 0x90, 0x5f, 0xca, 0xef, 0x7f, 0x45, 0x46, 0x38, 0xb0, 0xca, 0xa7, 0x83, 0xcb, 0xce, 0xe2, 0x3e, 0x91, 0xd9, 0xed, 0xde, 0xb4, 0xa4, 0x2c, 0x81, 0xec, 0xdb, 0x2c, 0xd1, 0x47 ],
+const [ 0x22, 0x4e, 0x8d, 0x76, 0xf9, 0x28, 0x22, 0x91, 0x5a, 0x2f, 0xd3, 0x6a, 0x51, 0x0c, 0x39, 0x84, 0x60, 0x09, 0x04, 0x21, 0xd1, 0x18, 0xec, 0x65, 0x4b, 0x17, 0xeb, 0xb9, 0xa4, 0x52, 0xa9, 0x6e, 0xf6, 0x4a, 0x38, 0xa2, 0xf5, 0xb5, 0x01, 0x68, 0x7f, 0xc5, 0xfe, 0x23, 0x75, 0xad, 0x2a, 0x33, 0xca, 0x62, 0x36, 0xd4, 0xd9, 0x9e, 0x7e, 0x42, 0xfc, 0x2b, 0x3b, 0x22, 0x5a, 0x5e, 0xfa, 0x1d, 0x00, 0xe2, 0x4d, 0xce, 0x34, 0xb6, 0xc0, 0xde, 0x05, 0x79, 0x0e, 0x6d, 0x27, 0xe6, 0x95, 0xb4, 0xfe, 0x9b, 0x08, 0xe9, 0xf9, 0x1e, 0x64, 0x63, 0x21, 0x21, 0x25, 0xff, 0xf2, 0x05, 0xb9, 0xc2, 0x69, 0x9e, 0x35, 0xc0, 0x5e, 0x36, 0x47, 0x3c, 0x14, 0xd4, 0x6b, 0x10, 0x0f, 0xbe, 0x62, 0x50, 0x25, 0x3c, 0xe1, 0x2a, 0xd8, 0x9f, 0x86, 0x10, 0xe3, 0x82, 0x0f, 0x1a, 0x13, 0x50, 0xce, 0xa5 ],
+const [ 0xf5, 0xc0, 0x5a, 0x09, 0x3a, 0xd9, 0x94, 0x09, 0x6d, 0xeb, 0xa2, 0x58, 0x58, 0xe5, 0xc5, 0x01, 0x68, 0xcf, 0xf2, 0xf3, 0x61, 0xb0, 0x28, 0x06, 0x51, 0xb0, 0x00, 0x39, 0xc3, 0x7a, 0x86, 0x3d, 0x34, 0xe4, 0x47, 0x38, 0xcb, 0xd2, 0xab, 0xc3, 0x44, 0x57, 0x85, 0x34, 0x2e, 0x1e, 0xe9, 0x23, 0x56, 0x09, 0x3e, 0x27, 0x83, 0x17, 0x93, 0xe1, 0x63, 0x8b, 0x37, 0x3c, 0xc6, 0x4b, 0x83, 0xf2, 0x0a, 0x86, 0xfb, 0x53, 0xd6, 0x99, 0x96, 0x42, 0x0c, 0x34, 0x59, 0x80, 0xf8, 0xb8, 0x2a, 0x2d, 0xce, 0xe4, 0xe4, 0x8b, 0x53, 0xb1, 0xa7, 0x06, 0xda, 0x7a, 0x72, 0x71, 0x72, 0x60, 0xf3, 0x93, 0x5e, 0xed, 0x9d, 0xe2, 0xc5, 0xf8, 0xfc, 0x8e, 0xab, 0xc8, 0x45, 0xc1, 0x20, 0x7c, 0x32, 0x26, 0xb7, 0xa9, 0x0c, 0xa8, 0x3a, 0x46, 0x09, 0x7c, 0x9c, 0xc5, 0xd9, 0x61, 0x2f, 0x83, 0x7c, 0x26 ],
+const [ 0x23, 0x1b, 0x4a, 0x2a, 0x2e, 0x6a, 0x51, 0x7a, 0x55, 0xf1, 0x0a, 0xa8, 0x04, 0x7c, 0xdf, 0x05, 0x94, 0x10, 0x91, 0xdf, 0x70, 0x7f, 0x7e, 0xb0, 0x77, 0x39, 0x20, 0x96, 0xa2, 0x65, 0xd7, 0x03, 0xe7, 0x30, 0xe8, 0xb6, 0x5d, 0x65, 0xc5, 0xea, 0xa0, 0x3f, 0x8f, 0xcd, 0x77, 0x7b, 0xd9, 0x33, 0xb4, 0xb0, 0xaf, 0x8c, 0x5c, 0xe3, 0xd6, 0x13, 0x08, 0x56, 0x56, 0x49, 0x8b, 0xa2, 0x36, 0xa2, 0xd5, 0x05, 0x87, 0x7e, 0x18, 0xfd, 0xa4, 0x5a, 0x29, 0x16, 0xb7, 0x48, 0x28, 0x00, 0x7f, 0x9c, 0x63, 0xe4, 0x51, 0xe9, 0x78, 0xf8, 0x5d, 0x2c, 0xba, 0x52, 0x33, 0x46, 0xd6, 0xfa, 0x86, 0xb0, 0xb7, 0x42, 0x2f, 0x6a, 0xa6, 0x5a, 0x74, 0x34, 0xb6, 0x1f, 0x8b, 0x01, 0x5f, 0x34, 0x5a, 0xa9, 0x69, 0x54, 0x81, 0xde, 0x0b, 0xe6, 0x9a, 0x61, 0x55, 0xd2, 0xbf, 0x75, 0xcb, 0x94, 0x4d, 0x95 ],
+const [ 0xee, 0x59, 0xb4, 0x7d, 0x83, 0x7c, 0xe4, 0x66, 0xa5, 0xc6, 0x36, 0x1a, 0xc4, 0xf6, 0x43, 0x65, 0xce, 0x50, 0x07, 0xde, 0x53, 0x37, 0x2d, 0x17, 0xe8, 0xfe, 0x8d, 0x16, 0xc9, 0xfc, 0xf4, 0x09, 0xc2, 0xde, 0x23, 0x35, 0x4f, 0x41, 0x1a, 0x30, 0x02, 0x81, 0x96, 0x50, 0x25, 0xcb, 0xd8, 0x63, 0xa1, 0x7a, 0xa8, 0xa0, 0x1e, 0xa0, 0x9a, 0xde, 0x6c, 0xe2, 0x90, 0x04, 0x21, 0x8a, 0x80, 0xc1, 0x84, 0xd7, 0x77, 0x7d, 0xaa, 0x97, 0xde, 0x8f, 0xdf, 0xf8, 0xfd, 0xb0, 0x48, 0x9c, 0xbd, 0xaf, 0xc6, 0xeb, 0xb2, 0x67, 0x1c, 0xad, 0x58, 0xef, 0x55, 0xd8, 0x9d, 0x10, 0x60, 0xa6, 0xa0, 0xfc, 0xfe, 0xeb, 0xb9, 0x3c, 0xde, 0xa6, 0xb9, 0xeb, 0x05, 0xd6, 0x73, 0x22, 0x74, 0x8f, 0x7b, 0xb3, 0x05, 0x4c, 0x2d, 0x1a, 0x97, 0x87, 0xf1, 0xb0, 0x6a, 0x87, 0xbe, 0x22, 0xcc, 0x7a, 0xdd, 0x22 ],
+const [ 0x1d, 0xc0, 0x26, 0xb6, 0xad, 0xff, 0xd6, 0x9b, 0x60, 0x05, 0xab, 0xa5, 0xe5, 0xd1, 0x79, 0xec, 0x42, 0x62, 0x0f, 0x8c, 0x75, 0xcc, 0x04, 0x56, 0x5b, 0x8a, 0xb4, 0xc6, 0xd2, 0x16, 0x85, 0x35, 0x1a, 0xb7, 0x6f, 0x50, 0x82, 0x9a, 0xbb, 0xc9, 0x40, 0x25, 0x0a, 0x4d, 0xa0, 0x88, 0x9a, 0xb5, 0x61, 0x95, 0xc5, 0x80, 0x5b, 0xd1, 0xca, 0x81, 0x66, 0xcb, 0xd0, 0xd5, 0x78, 0xac, 0x28, 0x18, 0x0d, 0x10, 0xd3, 0xd8, 0xcc, 0x14, 0x44, 0x4a, 0x67, 0xb0, 0x66, 0x3c, 0xc3, 0x48, 0xe1, 0x4b, 0x59, 0x7d, 0x9a, 0x56, 0xdc, 0x49, 0x78, 0x33, 0x1b, 0x4b, 0x6e, 0xa0, 0x2a, 0x5f, 0xb6, 0x7c, 0xbc, 0x72, 0x5a, 0x37, 0xd4, 0x95, 0xf9, 0x87, 0x9d, 0x4f, 0xc8, 0x5c, 0x95, 0x38, 0xd7, 0x17, 0xf1, 0xc3, 0x96, 0xf6, 0x3e, 0x5c, 0x97, 0xd3, 0x44, 0xb3, 0x95, 0x0f, 0x2f, 0x57, 0xb6, 0xc9 ],
+const [ 0x8a, 0x7f, 0xdf, 0x73, 0x4f, 0xe3, 0xe0, 0x30, 0x17, 0xce, 0x96, 0xe9, 0xa1, 0x54, 0xd7, 0xe6, 0xa2, 0xa5, 0x25, 0x78, 0xba, 0x33, 0x3b, 0x3a, 0xa7, 0x13, 0xe6, 0x97, 0xb9, 0xa6, 0x16, 0x8c, 0x85, 0x78, 0x35, 0xaf, 0xde, 0x68, 0xb7, 0x71, 0x01, 0x0a, 0xf3, 0xa0, 0x10, 0x49, 0x31, 0x30, 0xc2, 0x51, 0x04, 0x3a, 0x58, 0xac, 0xda, 0x45, 0xd3, 0xaa, 0xd1, 0xc5, 0x64, 0x07, 0xcc, 0xe1, 0x24, 0xc8, 0xc7, 0x79, 0x05, 0x66, 0x67, 0x68, 0x08, 0x2e, 0xd5, 0x06, 0xb1, 0xe8, 0xcd, 0xf1, 0xb9, 0xb7, 0xf2, 0x0e, 0x02, 0x40, 0x65, 0xca, 0xd0, 0x0e, 0x95, 0xa6, 0x35, 0x35, 0x59, 0xf2, 0xcd, 0x36, 0x3c, 0xd8, 0xac, 0x23, 0x17, 0x9d, 0x95, 0x04, 0xe6, 0x24, 0x6c, 0x78, 0xd4, 0xb4, 0xee, 0xa0, 0x98, 0xfa, 0xa0, 0x38, 0x04, 0x52, 0x05, 0x07, 0xdb, 0x42, 0x14, 0x7a, 0xe4, 0x47 ],
+const [ 0x0e, 0x0e, 0x09, 0x15, 0x2c, 0xa3, 0xb8, 0xf9, 0xe7, 0x7d, 0x4f, 0x07, 0x81, 0xa0, 0x50, 0x0b, 0xa7, 0xd8, 0xe5, 0xd2, 0x02, 0xfd, 0x18, 0x8e, 0x09, 0x76, 0x46, 0x7b, 0x19, 0xfc, 0xd1, 0xc3, 0xc7, 0xa0, 0x16, 0xa0, 0x75, 0x10, 0x9f, 0xc0, 0x23, 0x16, 0x99, 0xed, 0x88, 0x61, 0x88, 0xed, 0x61, 0x88, 0x39, 0xa7, 0x0a, 0x4c, 0xf8, 0x88, 0x4b, 0x1e, 0x04, 0x25, 0x74, 0xe1, 0x40, 0x22, 0xac, 0xf0, 0x2b, 0x52, 0x86, 0x63, 0x12, 0x1f, 0xd5, 0x8e, 0x85, 0x2d, 0xc2, 0xcb, 0x07, 0x3a, 0x1b, 0x7a, 0x09, 0x49, 0xee, 0x45, 0x1a, 0xff, 0x57, 0xa9, 0x58, 0x4d, 0x96, 0xb1, 0x2a, 0x4f, 0x64, 0x05, 0x31, 0x74, 0x88, 0x24, 0x7b, 0xe0, 0xa5, 0xee, 0xfa, 0x0e, 0x56, 0x65, 0x35, 0xba, 0x7c, 0xb4, 0x3e, 0xfe, 0xd7, 0x71, 0xe4, 0xbb, 0xd4, 0x1f, 0x29, 0x3a, 0xa6, 0xf7, 0xf7, 0x13 ],
+const [ 0x35, 0xa2, 0xb3, 0x69, 0xb9, 0xe1, 0xd7, 0x99, 0x93, 0x54, 0xb2, 0xa6, 0xd3, 0xa2, 0xe3, 0x01, 0x35, 0x5f, 0x3d, 0x83, 0x3e, 0xd2, 0x77, 0x55, 0x88, 0xfc, 0x25, 0x0d, 0x5b, 0xd5, 0xe7, 0x19, 0x7c, 0xd9, 0xe1, 0x61, 0x4a, 0xc3, 0x6b, 0x28, 0x06, 0x99, 0x09, 0x33, 0x73, 0xe8, 0x9d, 0x2e, 0x9f, 0x51, 0xdb, 0x4b, 0x00, 0x44, 0xfe, 0x2c, 0xc2, 0x0c, 0xb9, 0x03, 0x60, 0x0c, 0x71, 0xf8, 0x72, 0x48, 0xa9, 0xcb, 0xc6, 0x27, 0xbe, 0xba, 0xb1, 0x77, 0xd4, 0xa5, 0xa7, 0xb1, 0x10, 0x70, 0x0a, 0x7e, 0x08, 0xa9, 0x40, 0x7b, 0x77, 0x6a, 0x08, 0x39, 0x36, 0x81, 0x0e, 0x89, 0x67, 0xcf, 0xbd, 0xf6, 0xf3, 0xee, 0x54, 0x92, 0x38, 0x17, 0x3c, 0xf6, 0xfb, 0x42, 0x99, 0x84, 0xa4, 0x8e, 0x1f, 0xef, 0xaa, 0xe4, 0x26, 0xfe, 0x4c, 0xd7, 0x01, 0x8c, 0x82, 0xcf, 0x8c, 0xd4, 0x33, 0x67 ],
+const [ 0x18, 0x9a, 0xed, 0x1c, 0x0c, 0xf7, 0x70, 0x08, 0x29, 0x33, 0x3e, 0x57, 0x51, 0xbf, 0xd7, 0x18, 0xa4, 0x45, 0x08, 0x79, 0xe8, 0x83, 0x6a, 0x3a, 0x2e, 0x5a, 0x2d, 0x61, 0xb2, 0x22, 0x13, 0x2e, 0x04, 0x41, 0xbf, 0x51, 0x65, 0xfc, 0x30, 0x5b, 0x74, 0x8d, 0x89, 0x73, 0x0a, 0x75, 0x13, 0x4a, 0x62, 0x13, 0x84, 0x51, 0x7d, 0x76, 0x82, 0x29, 0xc4, 0x70, 0x63, 0x5a, 0xf0, 0xeb, 0x37, 0x49, 0x27, 0x80, 0x08, 0x64, 0x67, 0x46, 0x60, 0xa0, 0x28, 0xe8, 0x0c, 0x25, 0x3d, 0xfb, 0x20, 0x47, 0xfc, 0x8e, 0x3b, 0xb9, 0x9e, 0x02, 0x0c, 0xfd, 0xe9, 0x1c, 0x15, 0x1f, 0x0c, 0x58, 0xaf, 0xa3, 0xca, 0x80, 0x4f, 0xbc, 0xda, 0x7e, 0x07, 0xbf, 0x8e, 0x6f, 0x50, 0xd6, 0xb4, 0xf8, 0x06, 0xf9, 0xba, 0xdd, 0xb4, 0x1a, 0x15, 0xcf, 0x12, 0xa0, 0xe2, 0x86, 0xcc, 0x17, 0xce, 0x10, 0x85, 0x26 ],
+const [ 0xf0, 0x8d, 0xac, 0x1d, 0x4d, 0x6a, 0x7a, 0xc4, 0x67, 0x2b, 0x44, 0x7a, 0x46, 0xcb, 0xeb, 0x31, 0x62, 0xf2, 0x47, 0xea, 0x09, 0xc6, 0xb4, 0x29, 0x00, 0x04, 0xcd, 0xa6, 0x6d, 0x4f, 0x77, 0x46, 0xf4, 0xc8, 0x22, 0x49, 0x21, 0xde, 0x4b, 0xc5, 0x06, 0x68, 0x45, 0x53, 0x25, 0xf1, 0x3a, 0x08, 0x90, 0x52, 0x6d, 0xa7, 0x4e, 0x87, 0xc1, 0x14, 0x01, 0xbb, 0x7f, 0x0c, 0xc6, 0xa5, 0x54, 0x14, 0x5d, 0x17, 0x99, 0xaf, 0x8a, 0xd4, 0xd7, 0xd4, 0xba, 0xa3, 0x8b, 0x9f, 0xea, 0xa1, 0x26, 0x47, 0xc5, 0xdb, 0x58, 0x50, 0x0c, 0x1c, 0x8e, 0x02, 0x3b, 0x04, 0xba, 0x19, 0x6a, 0x5a, 0x52, 0xbe, 0x71, 0xa3, 0x9b, 0xb6, 0x4f, 0xf4, 0x27, 0xda, 0xcd, 0x04, 0x9c, 0xc7, 0x5e, 0x85, 0xb8, 0xd6, 0x4a, 0xb5, 0x92, 0x4f, 0x0b, 0x30, 0x23, 0xd9, 0xf7, 0x08, 0x04, 0x35, 0x20, 0x17, 0x79, 0x2c ],
+const [ 0x8c, 0x84, 0x81, 0x0e, 0x4c, 0x90, 0xbf, 0x6e, 0x1e, 0x88, 0xc8, 0xb9, 0x44, 0x39, 0x8b, 0x35, 0xc4, 0x22, 0xd4, 0x8c, 0x6a, 0x70, 0x70, 0x68, 0x0c, 0x2d, 0x91, 0x3f, 0x11, 0xb4, 0x74, 0x71, 0x34, 0x68, 0x40, 0x90, 0x86, 0xa5, 0x32, 0xfe, 0xb2, 0xf7, 0xf7, 0xbe, 0x85, 0x8a, 0x59, 0x84, 0xae, 0xe2, 0x1e, 0x0e, 0xc2, 0xcc, 0x2d, 0xb7, 0x83, 0x95, 0xf3, 0x4a, 0x61, 0x79, 0x05, 0x14, 0x41, 0x5e, 0x07, 0x3d, 0x7e, 0xc3, 0xcc, 0x58, 0x2d, 0xf3, 0xbe, 0x38, 0xa6, 0x7e, 0x81, 0x05, 0x40, 0xe9, 0xd3, 0x90, 0x5b, 0xa5, 0xb7, 0xe4, 0xa4, 0x3e, 0xd2, 0x1e, 0x94, 0xd5, 0x15, 0x7e, 0x3a, 0xd0, 0x9c, 0xbd, 0x3b, 0xd0, 0xd6, 0xa1, 0x17, 0xe3, 0xe7, 0xd0, 0xad, 0xfc, 0x4a, 0xe2, 0x02, 0xa0, 0xbb, 0xb9, 0x3e, 0xe1, 0x54, 0x15, 0xf7, 0x90, 0xf6, 0x63, 0xb2, 0xaf, 0xea, 0xd6 ],
+const [ 0x8e, 0xcd, 0xcd, 0x81, 0x76, 0xd8, 0xa1, 0x64, 0xf6, 0x25, 0x97, 0x33, 0xbc, 0x77, 0xef, 0x78, 0x3b, 0x48, 0xd4, 0x0c, 0xff, 0xc5, 0x47, 0x35, 0x3d, 0x19, 0x59, 0x12, 0xaf, 0xee, 0x9d, 0x39, 0x9e, 0x31, 0xdd, 0x9e, 0x41, 0x16, 0x0c, 0xb7, 0x45, 0x5d, 0x7c, 0xdd, 0xad, 0xd3, 0x51, 0xf6, 0xdc, 0x1b, 0x36, 0x51, 0xf0, 0xae, 0x4e, 0xd1, 0x52, 0x21, 0x6d, 0x4e, 0x8b, 0xa7, 0x89, 0x38, 0x5a, 0xd6, 0x6b, 0x7d, 0x03, 0xae, 0xaa, 0xad, 0xe9, 0xd7, 0xda, 0x5d, 0x5f, 0x2a, 0x01, 0xc9, 0xbc, 0x73, 0x4a, 0xbd, 0xad, 0x75, 0xfe, 0xb5, 0xd0, 0x2f, 0xaf, 0x43, 0x7e, 0x5e, 0xb7, 0xb1, 0xe8, 0x43, 0xe1, 0xe7, 0x65, 0xa6, 0x65, 0x90, 0x0a, 0x1b, 0x1a, 0x79, 0x7c, 0x84, 0xe7, 0x39, 0x02, 0xd7, 0x7a, 0x17, 0xde, 0x22, 0x3d, 0x28, 0xde, 0xcc, 0x86, 0xb8, 0x2e, 0x1d, 0x0f, 0xeb ],
+const [ 0x1c, 0x43, 0x96, 0xf7, 0xb7, 0xf9, 0x22, 0x8e, 0x83, 0x2a, 0x13, 0x69, 0x20, 0x02, 0xba, 0x2a, 0xff, 0x43, 0x9d, 0xcb, 0x7f, 0xdd, 0xbf, 0xd4, 0x56, 0xc0, 0x22, 0xd1, 0x33, 0xee, 0x89, 0x03, 0xa2, 0xd4, 0x82, 0x56, 0x2f, 0xda, 0xa4, 0x93, 0xce, 0x39, 0x16, 0xd7, 0x7a, 0x0c, 0x51, 0x44, 0x1d, 0xab, 0x26, 0xf6, 0xb0, 0x34, 0x02, 0x38, 0xa3, 0x6a, 0x71, 0xf8, 0x7f, 0xc3, 0xe1, 0x79, 0xca, 0xbc, 0xa9, 0x48, 0x2b, 0x70, 0x49, 0x71, 0xce, 0x69, 0xf3, 0xf2, 0x0a, 0xb6, 0x4b, 0x70, 0x41, 0x3d, 0x6c, 0x29, 0x08, 0x53, 0x2b, 0x2a, 0x88, 0x8a, 0x9f, 0xc2, 0x24, 0xca, 0xe1, 0x36, 0x5d, 0xa4, 0x10, 0xb6, 0xf2, 0xe2, 0x98, 0x90, 0x4b, 0x63, 0xb4, 0xa4, 0x17, 0x26, 0x32, 0x18, 0x35, 0xa4, 0x77, 0x4d, 0xd0, 0x63, 0xc2, 0x11, 0xcf, 0xc8, 0xb5, 0x16, 0x6c, 0x2d, 0x11, 0xa2 ],
+const [ 0x7c, 0x28, 0x7c, 0xa5, 0x2d, 0x40, 0xf5, 0x3f, 0x92, 0xb0, 0x04, 0x32, 0x98, 0x45, 0x95, 0xcd, 0x20, 0xe6, 0x44, 0x49, 0x4a, 0xc7, 0xc3, 0xa4, 0xf3, 0xe0, 0x7c, 0xad, 0x7c, 0x9e, 0x78, 0x5b, 0xcd, 0xd8, 0x80, 0x62, 0x9a, 0x04, 0x82, 0x08, 0xe5, 0xab, 0x36, 0x35, 0xc5, 0x1a, 0x00, 0xca, 0x65, 0x5b, 0x19, 0x34, 0x4f, 0x63, 0xea, 0x41, 0xeb, 0x8d, 0xb8, 0x32, 0x42, 0x47, 0x86, 0x11, 0x08, 0x0b, 0x37, 0x45, 0xda, 0x92, 0xf4, 0x63, 0xc4, 0x44, 0xcd, 0x47, 0x06, 0xf2, 0xa3, 0x64, 0x18, 0xc7, 0x45, 0x58, 0xeb, 0x7c, 0xd9, 0xc3, 0x72, 0xcc, 0x7e, 0x5a, 0x61, 0x28, 0x2f, 0x37, 0x35, 0xab, 0xea, 0x73, 0x74, 0x50, 0x12, 0xf7, 0x36, 0x63, 0x13, 0x8f, 0xe4, 0x35, 0x44, 0x41, 0x40, 0x14, 0x11, 0xdc, 0xa5, 0x7a, 0x59, 0xd3, 0x90, 0x85, 0x15, 0x4c, 0x60, 0xa7, 0x3b, 0x75 ],
+const [ 0xdd, 0x3e, 0x68, 0xb7, 0x57, 0xff, 0xe0, 0x60, 0x68, 0xe5, 0x20, 0x05, 0x88, 0x9b, 0xfb, 0xc1, 0xb4, 0x3b, 0xf0, 0xa1, 0x11, 0x64, 0xf3, 0x5c, 0xd3, 0x8d, 0x71, 0x3e, 0x5d, 0x99, 0x8e, 0x66, 0xa9, 0xab, 0xb1, 0x31, 0xeb, 0x3b, 0x42, 0xf6, 0x71, 0x6a, 0xb2, 0xf4, 0xce, 0x92, 0xbc, 0x88, 0x37, 0x22, 0xeb, 0xa4, 0x2d, 0xa9, 0x5d, 0x7c, 0x5d, 0x30, 0xc6, 0x82, 0xc4, 0xcd, 0xb7, 0x95, 0x16, 0x75, 0x21, 0x75, 0x61, 0x12, 0x15, 0x7b, 0xed, 0xd5, 0xcd, 0x87, 0x68, 0xce, 0xf0, 0x39, 0x3f, 0xba, 0x12, 0x64, 0x4f, 0x1c, 0x7a, 0xbf, 0xbd, 0x8f, 0x29, 0xde, 0x22, 0x5a, 0x18, 0x61, 0xec, 0x45, 0xc0, 0x6c, 0x01, 0xab, 0xdf, 0x57, 0xa5, 0xd1, 0x7a, 0xa6, 0x9d, 0x76, 0x1e, 0x3b, 0x94, 0xab, 0x6c, 0xca, 0xbf, 0xe5, 0xd5, 0x8e, 0xbd, 0x51, 0xa1, 0x3a, 0xc1, 0x67, 0x36, 0x33 ],
+const [ 0x0a, 0x20, 0xbb, 0x48, 0xb5, 0xa3, 0xe4, 0xf4, 0x7b, 0x2f, 0xe7, 0x31, 0x2c, 0x22, 0x3c, 0xec, 0x12, 0x71, 0x93, 0x62, 0x81, 0xeb, 0x0a, 0x88, 0xaf, 0xc2, 0xa2, 0xaa, 0xc6, 0x47, 0xf4, 0x52, 0x38, 0xf5, 0x20, 0x6b, 0x53, 0xb1, 0x07, 0xa6, 0x15, 0x50, 0xba, 0x1d, 0x41, 0x5a, 0x31, 0x37, 0xb2, 0x0d, 0x41, 0xcb, 0xf0, 0xa5, 0xc8, 0x88, 0x01, 0xdb, 0x2b, 0x94, 0x82, 0xac, 0x02, 0x73, 0xf6, 0x5b, 0x11, 0x2b, 0x5d, 0xb9, 0x7b, 0xa5, 0x09, 0xa4, 0x32, 0x57, 0xad, 0xce, 0xb2, 0x20, 0xb7, 0xc0, 0xef, 0x73, 0xdf, 0x1e, 0x8b, 0xb8, 0x00, 0x2c, 0x4d, 0xef, 0x27, 0x91, 0xcf, 0x97, 0xea, 0x5b, 0x76, 0xce, 0xfc, 0x44, 0xa7, 0xb9, 0xfe, 0x33, 0x38, 0x26, 0x97, 0x06, 0x25, 0x70, 0xc6, 0x8f, 0x85, 0xa3, 0x77, 0xdc, 0xbc, 0xe1, 0x55, 0xbc, 0xf1, 0x05, 0xe0, 0x7e, 0xc3, 0x85 ],
+const [ 0x16, 0x6c, 0xdb, 0xea, 0x93, 0x46, 0x94, 0x28, 0xe6, 0x6e, 0xfe, 0x85, 0x3b, 0x6c, 0x4d, 0xf9, 0xfb, 0x13, 0xdb, 0x05, 0xf4, 0x12, 0x6d, 0xea, 0xb4, 0xc5, 0xb8, 0x1a, 0x35, 0x51, 0x24, 0xec, 0xc0, 0xef, 0xcf, 0x93, 0x0b, 0x88, 0xd5, 0x51, 0xa5, 0x83, 0xcf, 0xe8, 0x93, 0xdb, 0x99, 0x52, 0x3c, 0x74, 0x59, 0xb1, 0x82, 0xaf, 0xbc, 0x89, 0x32, 0x3c, 0x83, 0x2d, 0x9e, 0x2f, 0x3f, 0x77, 0x88, 0x56, 0x58, 0xbc, 0x42, 0xca, 0x54, 0xff, 0x14, 0xc5, 0x56, 0x65, 0xde, 0xb3, 0xe5, 0xe9, 0xfe, 0x8c, 0xef, 0x51, 0x74, 0x60, 0x0e, 0x61, 0x44, 0x34, 0x09, 0x4e, 0x1c, 0x0c, 0x9e, 0x76, 0x37, 0x49, 0x7f, 0x4d, 0x81, 0x35, 0x9a, 0x9b, 0xfc, 0xdd, 0x9d, 0xe5, 0x62, 0x1f, 0xba, 0x28, 0x0c, 0x03, 0xa8, 0xce, 0x12, 0x4f, 0xea, 0xda, 0xb4, 0x55, 0x53, 0x66, 0xf9, 0x10, 0xca, 0x4f ],
+const [ 0xc2, 0x41, 0x2a, 0x6d, 0x1d, 0x52, 0xd1, 0x2c, 0x0a, 0x54, 0xb8, 0xf5, 0x70, 0x1e, 0xa5, 0x8a, 0xda, 0xa1, 0x1a, 0x76, 0x7a, 0xd5, 0x7a, 0x9e, 0x6f, 0xf4, 0x6c, 0x19, 0x43, 0xe7, 0x84, 0x41, 0xb8, 0xfd, 0x21, 0x0a, 0xc4, 0xe3, 0x91, 0x93, 0xda, 0xd1, 0x7c, 0xfb, 0x6b, 0x01, 0x7f, 0x76, 0xad, 0x65, 0x17, 0xa0, 0x9b, 0x99, 0xc1, 0x11, 0x3d, 0x17, 0x5f, 0x31, 0x29, 0xaa, 0xde, 0x4d, 0x4a, 0x25, 0x16, 0xeb, 0xe0, 0x54, 0xf1, 0x5b, 0xc8, 0x33, 0xd0, 0x8f, 0xfe, 0x5e, 0x2a, 0x2d, 0x60, 0xc9, 0x76, 0xe1, 0xb4, 0xb1, 0x4c, 0xf8, 0xed, 0xd2, 0xc7, 0x2b, 0xaa, 0xdb, 0x2d, 0xb8, 0x00, 0x1f, 0xd2, 0xb8, 0x79, 0x8d, 0x39, 0xac, 0x5c, 0xe2, 0x7d, 0x59, 0x2f, 0x1d, 0xef, 0xd6, 0x7b, 0x33, 0x01, 0xe3, 0xcf, 0x05, 0x63, 0x7c, 0x07, 0x8f, 0x6b, 0xae, 0xce, 0x62, 0xba, 0xaa ],
+const [ 0x77, 0x51, 0x7d, 0xbf, 0xda, 0x50, 0x49, 0x3a, 0x04, 0x44, 0x5d, 0x72, 0x43, 0x0e, 0xa3, 0xf6, 0xfd, 0x54, 0xbb, 0x31, 0xfc, 0x81, 0xf2, 0x92, 0x0a, 0x0d, 0x72, 0xea, 0xbe, 0xfe, 0xb6, 0x15, 0x95, 0xaf, 0x41, 0xdc, 0x44, 0xd0, 0x90, 0x1a, 0x4d, 0xae, 0x4d, 0x1e, 0xd1, 0xb4, 0xc5, 0x51, 0xa5, 0x32, 0x9c, 0x18, 0xa8, 0x5e, 0xbf, 0xfc, 0x53, 0x99, 0x9b, 0x09, 0x91, 0xf3, 0x8d, 0x73, 0xd1, 0xf0, 0x99, 0x80, 0x5a, 0x8d, 0x5e, 0xa1, 0xdf, 0x7e, 0x49, 0xe2, 0x54, 0xba, 0x0a, 0x85, 0x00, 0x39, 0x44, 0xea, 0xd2, 0xfc, 0x89, 0xb3, 0xf8, 0x4f, 0x85, 0x25, 0xae, 0x4b, 0x79, 0xd0, 0x54, 0x9e, 0xec, 0x72, 0xc4, 0x8f, 0x9d, 0x19, 0xe2, 0x3c, 0xbb, 0x88, 0x75, 0x26, 0x58, 0xdc, 0x35, 0xf0, 0x1c, 0x6f, 0x24, 0x64, 0x36, 0xfd, 0x22, 0xb7, 0x98, 0x05, 0xbc, 0x0e, 0x64, 0x72 ],
+const [ 0xe8, 0x8b, 0x88, 0x54, 0x5a, 0xf5, 0x4f, 0x35, 0x59, 0x59, 0x42, 0x39, 0xf0, 0xe4, 0xf0, 0x85, 0x47, 0x70, 0xd5, 0x76, 0xd3, 0xf0, 0x2c, 0x2a, 0xca, 0x0f, 0x05, 0x43, 0xda, 0x14, 0x97, 0xe7, 0x1a, 0x09, 0xd7, 0x0b, 0x41, 0x1c, 0x4a, 0xf2, 0x16, 0x45, 0x17, 0xf0, 0x27, 0x29, 0x60, 0x74, 0xbe, 0x3f, 0xd2, 0x46, 0x11, 0x31, 0x7b, 0x0c, 0xb9, 0x85, 0xdc, 0x13, 0x65, 0x7c, 0x40, 0x4c, 0xd0, 0x3a, 0x4c, 0x95, 0xf0, 0x28, 0xd6, 0x3a, 0x71, 0x97, 0xfb, 0xbc, 0x61, 0xa6, 0x6b, 0xd1, 0x2d, 0x65, 0x08, 0xab, 0xcc, 0x3a, 0xb0, 0x7d, 0x3a, 0x84, 0x56, 0x3c, 0x28, 0x7f, 0x58, 0xa3, 0xf2, 0x68, 0x0c, 0x79, 0xd1, 0xe1, 0x9c, 0x16, 0x52, 0x96, 0x15, 0x24, 0x06, 0x21, 0xba, 0xa3, 0x7b, 0x2b, 0x9e, 0x2f, 0x6c, 0xd4, 0x72, 0x86, 0x35, 0x55, 0x9b, 0x45, 0x89, 0xe4, 0x88, 0xf2 ],
+const [ 0x02, 0x14, 0x0f, 0x7b, 0x50, 0xf2, 0x60, 0x09, 0x61, 0xce, 0xd8, 0xb3, 0x6d, 0xd4, 0x8b, 0x8e, 0x3f, 0x70, 0xc2, 0x10, 0x8c, 0x55, 0xef, 0x2d, 0x83, 0xc4, 0xe6, 0xc0, 0xa5, 0x0b, 0x49, 0x2d, 0xd7, 0x4c, 0x44, 0x44, 0xb5, 0x7f, 0x7b, 0x69, 0x2a, 0xba, 0x41, 0xf2, 0x3d, 0xb0, 0x0b, 0xd1, 0x2e, 0x79, 0x24, 0x73, 0xc2, 0x91, 0xa2, 0xe8, 0xdb, 0x22, 0x98, 0x43, 0x4b, 0x86, 0x8d, 0x44, 0xea, 0x07, 0x2d, 0x34, 0xe7, 0xea, 0x3f, 0x11, 0x5b, 0xad, 0xd7, 0xeb, 0x24, 0x8c, 0xcd, 0x8e, 0xf0, 0x4a, 0x6d, 0x61, 0x98, 0x2d, 0x70, 0x8e, 0xb0, 0x4b, 0x2c, 0x63, 0x5c, 0x04, 0x07, 0xf9, 0x64, 0xd0, 0x31, 0x13, 0x8b, 0x3b, 0x93, 0x48, 0x1d, 0x2d, 0x02, 0x65, 0xc8, 0x6f, 0xb9, 0x0d, 0xac, 0x6b, 0x06, 0xa2, 0xb5, 0x33, 0x43, 0x69, 0x29, 0xc5, 0x08, 0xe8, 0x7d, 0x8e, 0x9f, 0x93 ],
+const [ 0x7b, 0x7b, 0xa2, 0xa8, 0x54, 0x84, 0x0b, 0x24, 0xfd, 0x75, 0xae, 0x12, 0xeb, 0xc2, 0xc6, 0x14, 0x4b, 0xb2, 0x06, 0x5c, 0x95, 0xab, 0xd3, 0x11, 0x64, 0xb0, 0xb0, 0xf5, 0x85, 0x28, 0xfa, 0x46, 0x4e, 0xe1, 0xd5, 0xe2, 0x31, 0x54, 0x66, 0xae, 0x91, 0x2b, 0x43, 0x37, 0xd3, 0x00, 0x27, 0x9a, 0xb9, 0x68, 0xeb, 0xa2, 0xeb, 0x30, 0xb1, 0x31, 0xd7, 0xe6, 0x63, 0xe1, 0xbb, 0x9b, 0x5c, 0xea, 0x00, 0xe8, 0x64, 0x47, 0xca, 0x2f, 0xe2, 0x14, 0xcd, 0x23, 0x4d, 0x3b, 0x62, 0x8b, 0xe4, 0x4f, 0xda, 0x43, 0x9f, 0xb8, 0x12, 0x83, 0x65, 0x11, 0x47, 0x63, 0x7f, 0xce, 0x2c, 0x9f, 0x4d, 0x22, 0x3a, 0x98, 0x37, 0x20, 0x48, 0x9c, 0xe7, 0x20, 0x5b, 0x67, 0xb5, 0x64, 0xbf, 0xea, 0x63, 0xfb, 0x57, 0x4b, 0x0b, 0xe6, 0x31, 0x2c, 0x55, 0x7a, 0x5d, 0x30, 0xed, 0x05, 0x00, 0xbb, 0x35, 0xb4 ],
+const [ 0xc1, 0xe9, 0x69, 0xae, 0x81, 0x50, 0x7c, 0xe3, 0xdd, 0x94, 0xef, 0x0a, 0x21, 0xda, 0x24, 0x93, 0x51, 0x29, 0xda, 0xce, 0xca, 0x79, 0xf3, 0xa4, 0x27, 0x0d, 0x7a, 0x85, 0x62, 0x03, 0xe4, 0xa1, 0x3b, 0x2a, 0x96, 0x5b, 0xde, 0x13, 0xa8, 0xfa, 0xc0, 0x6b, 0xe9, 0xa2, 0xca, 0x87, 0x23, 0x84, 0xb9, 0x41, 0xa0, 0x51, 0xc5, 0x03, 0xec, 0xf4, 0x80, 0x21, 0xdd, 0x80, 0x02, 0x6c, 0xd1, 0x67, 0x43, 0x04, 0x37, 0xee, 0xc8, 0x6d, 0x51, 0xdd, 0x82, 0xe5, 0x37, 0x7b, 0xf3, 0xf5, 0x20, 0xb9, 0x92, 0x47, 0xdd, 0xae, 0x71, 0xb7, 0xa6, 0x43, 0x1d, 0xac, 0x19, 0x30, 0xc5, 0xa9, 0x80, 0x27, 0x9f, 0x1f, 0x53, 0x4e, 0x88, 0x86, 0xfe, 0xf3, 0xeb, 0xab, 0xe3, 0x7c, 0xe3, 0x4c, 0xa3, 0x9c, 0xa4, 0xe2, 0x99, 0xcd, 0x17, 0xbe, 0xa8, 0xfa, 0xc4, 0x57, 0x37, 0x7b, 0xf5, 0xe3, 0x79, 0x47 ],
+const [ 0x09, 0xca, 0xed, 0xbd, 0x55, 0x68, 0xcc, 0x3a, 0xd0, 0x59, 0x0b, 0x7d, 0x40, 0x9f, 0xbc, 0x26, 0x54, 0x7a, 0x2a, 0x20, 0xd9, 0xd0, 0xb2, 0x26, 0x30, 0xd2, 0xd5, 0x85, 0x00, 0xdd, 0x8b, 0x23, 0x28, 0x9e, 0xd9, 0xc0, 0xf8, 0x7a, 0xa5, 0x7c, 0xa0, 0x2d, 0xca, 0x99, 0xe8, 0xb1, 0x68, 0x83, 0x22, 0x61, 0x7d, 0x0d, 0x5d, 0x5e, 0xba, 0xfe, 0xdc, 0x32, 0x8f, 0xcc, 0xc7, 0xb3, 0x89, 0xa7, 0x1f, 0x2a, 0xdd, 0xb9, 0xf7, 0xb5, 0x45, 0xad, 0xe2, 0xea, 0x0a, 0x6e, 0xa8, 0xbd, 0x62, 0x31, 0x3d, 0xa4, 0xfd, 0xb5, 0xf3, 0xf9, 0xdb, 0xc9, 0xee, 0x9f, 0x60, 0x10, 0xd8, 0xe8, 0xaa, 0x01, 0xd7, 0xb6, 0x22, 0x31, 0xbc, 0xe1, 0x51, 0xd5, 0x7e, 0xd9, 0xf6, 0x82, 0xe6, 0x8d, 0x55, 0x38, 0x8b, 0x8b, 0xd1, 0x9f, 0x01, 0x68, 0xbd, 0x90, 0x4e, 0x62, 0x70, 0xd7, 0x9d, 0x44, 0x97, 0x38 ],
+const [ 0x08, 0xdf, 0x48, 0x71, 0x3d, 0xb1, 0xb8, 0xab, 0x2b, 0x51, 0xe0, 0x5c, 0xde, 0x25, 0xdc, 0x3d, 0xfb, 0xce, 0x1b, 0x12, 0x04, 0x5b, 0xc1, 0x81, 0xd8, 0xbc, 0x49, 0x24, 0x79, 0x79, 0x6f, 0xdd, 0x12, 0xa4, 0x4d, 0x6a, 0x39, 0x0c, 0xc4, 0x39, 0x71, 0xb3, 0x1d, 0x7d, 0xf3, 0x82, 0xf0, 0x81, 0xae, 0x3c, 0x45, 0x3c, 0x8c, 0xb1, 0xfa, 0x27, 0xf7, 0x34, 0x65, 0x4b, 0x9c, 0x4e, 0x39, 0x9e, 0x6e, 0xb4, 0xae, 0x8f, 0xee, 0x77, 0xdc, 0xe0, 0xaa, 0x7b, 0x68, 0xb4, 0x04, 0x2a, 0x63, 0xe9, 0x35, 0x69, 0x6f, 0xa7, 0x92, 0xcb, 0x24, 0x39, 0x0d, 0x05, 0xb2, 0x1c, 0xfe, 0xa3, 0xc7, 0x56, 0x24, 0xf9, 0xb3, 0x09, 0xe6, 0x5b, 0xca, 0x48, 0xdf, 0x91, 0x09, 0x29, 0x9a, 0x85, 0xfd, 0x1c, 0x9a, 0x3f, 0xe1, 0x7b, 0x9e, 0x13, 0x07, 0x62, 0x23, 0x19, 0x79, 0xc0, 0x29, 0xde, 0xdf, 0xae ],
+const [ 0xa2, 0x04, 0xbe, 0x1f, 0xc0, 0x43, 0x72, 0xee, 0xd3, 0xc9, 0xe5, 0xcc, 0xd1, 0x43, 0x5a, 0x02, 0xb3, 0x57, 0x31, 0x7e, 0x78, 0x96, 0x0b, 0x6e, 0x6c, 0xac, 0x2f, 0x0e, 0xaa, 0xda, 0x2d, 0xbe, 0xe0, 0xa7, 0xc1, 0x58, 0x52, 0xd2, 0xf9, 0xc0, 0x22, 0x8a, 0x9a, 0xbd, 0xce, 0xe1, 0xc1, 0x07, 0xfa, 0x7f, 0xc6, 0xa1, 0x70, 0x93, 0x65, 0x68, 0x65, 0x10, 0x20, 0xed, 0xfe, 0x15, 0xdf, 0x80, 0x12, 0xac, 0xda, 0x8d, 0x32, 0xb8, 0xb8, 0x2c, 0xe6, 0x29, 0xf8, 0xf3, 0x3a, 0x72, 0x91, 0x0e, 0x79, 0x3d, 0xd5, 0x92, 0x39, 0x5d, 0x9b, 0x0f, 0x97, 0x04, 0x9d, 0x65, 0xc4, 0x36, 0x1f, 0xd8, 0xc1, 0x7d, 0xd2, 0x66, 0x66, 0xdf, 0xf7, 0x57, 0xa9, 0x0d, 0xc7, 0x17, 0x1d, 0xdd, 0x13, 0x41, 0xb9, 0xfa, 0x28, 0xfc, 0xdb, 0xda, 0xf5, 0x8a, 0x8c, 0xf1, 0x70, 0x1e, 0x06, 0x25, 0x35, 0xee ],
+const [ 0x28, 0xbe, 0x0d, 0x9e, 0x62, 0xdc, 0x89, 0xe2, 0xa9, 0x13, 0x06, 0x4c, 0x0d, 0x3d, 0xbf, 0xb3, 0x5a, 0x0c, 0x77, 0x66, 0xf7, 0x56, 0x74, 0x1b, 0x0e, 0xaf, 0xcc, 0x28, 0xed, 0x3d, 0xdf, 0xf6, 0xad, 0xc8, 0x25, 0xb2, 0x11, 0x11, 0x2a, 0x45, 0xb0, 0x65, 0xd6, 0x87, 0x57, 0x71, 0xf2, 0xaf, 0xa9, 0x58, 0xe8, 0x0f, 0x08, 0x03, 0xca, 0xfe, 0xb9, 0xb9, 0x96, 0x15, 0x42, 0xef, 0xb9, 0x9e, 0x17, 0x61, 0xd1, 0x49, 0x76, 0x61, 0xb7, 0x21, 0x90, 0x6f, 0xbd, 0xbf, 0xe9, 0x0b, 0x34, 0xbd, 0x01, 0xc7, 0x32, 0x6e, 0x34, 0xa0, 0x92, 0xcc, 0xdf, 0x8e, 0x3b, 0xb2, 0xc4, 0x5a, 0xa6, 0x4c, 0xb0, 0xb0, 0x9a, 0xcb, 0x5b, 0x75, 0x3a, 0x5d, 0x8f, 0x5a, 0x42, 0x5c, 0x8c, 0xb2, 0x8e, 0xc5, 0xac, 0x81, 0xdc, 0xed, 0x43, 0xd5, 0xd2, 0x6f, 0xc9, 0x59, 0x43, 0x69, 0x3b, 0x27, 0xae, 0xe8 ],
+const [ 0xfb, 0x09, 0x1d, 0xdd, 0x95, 0xb1, 0x00, 0xdf, 0xcf, 0x89, 0x2d, 0x78, 0xe5, 0xe7, 0x70, 0xd3, 0xa3, 0x7b, 0x8c, 0x38, 0x85, 0xdf, 0x80, 0x3c, 0x1d, 0x6f, 0x09, 0x35, 0xb5, 0x5b, 0x68, 0xf1, 0x36, 0xfb, 0x65, 0xa8, 0x48, 0x62, 0x94, 0x2e, 0xbb, 0x35, 0xd7, 0x6d, 0x26, 0xbe, 0x24, 0x13, 0xcd, 0x3c, 0x89, 0x88, 0xc8, 0x7d, 0x6d, 0x23, 0x62, 0xaf, 0x18, 0x9d, 0xc0, 0x74, 0x76, 0xc6, 0xc3, 0x34, 0x17, 0x76, 0x2e, 0xb7, 0x7b, 0xc7, 0x0c, 0xf3, 0x8d, 0x81, 0x4c, 0x22, 0x6d, 0xd6, 0xaf, 0x18, 0x72, 0x50, 0xe4, 0xd4, 0x70, 0x07, 0xf1, 0x55, 0x36, 0x17, 0xd4, 0xaf, 0x5b, 0x51, 0x6a, 0x5d, 0x3b, 0x31, 0x91, 0xd9, 0x3c, 0x10, 0x89, 0x6a, 0x56, 0x9b, 0xa1, 0x3d, 0xd2, 0x84, 0x0f, 0xb8, 0x51, 0x78, 0x1f, 0x0b, 0x11, 0x50, 0x90, 0x08, 0x6c, 0x8b, 0x3a, 0x34, 0xa1, 0xfc ],
+const [ 0x9f, 0x63, 0xb0, 0xed, 0xfa, 0xf8, 0x3b, 0xaf, 0xce, 0x6c, 0x4e, 0x68, 0x0b, 0xc0, 0x75, 0xc7, 0xb3, 0xba, 0xf1, 0x57, 0x33, 0xe5, 0xae, 0xa7, 0xf3, 0xd9, 0x75, 0xa8, 0x2c, 0xbc, 0x63, 0x56, 0xfa, 0x09, 0x9a, 0x9a, 0xb2, 0x90, 0x36, 0x6f, 0x75, 0xbf, 0x83, 0x45, 0x05, 0x1f, 0x6d, 0xa2, 0xd8, 0x21, 0x37, 0x0f, 0x6b, 0x1b, 0x70, 0x32, 0xd9, 0x8e, 0x23, 0x38, 0xac, 0xaa, 0x4f, 0x76, 0xf3, 0x14, 0x96, 0x4f, 0x95, 0xe6, 0x39, 0x58, 0xe4, 0xf8, 0x44, 0xba, 0x75, 0x5e, 0x06, 0xd8, 0x30, 0x31, 0xc4, 0x32, 0xa3, 0x93, 0xaf, 0x89, 0x9b, 0xed, 0x12, 0x45, 0xf6, 0x7b, 0xd0, 0x13, 0xb3, 0x0b, 0x0e, 0xd2, 0x4b, 0x01, 0x2d, 0xb0, 0x44, 0x9f, 0xfb, 0x90, 0x03, 0x83, 0x2a, 0xb0, 0xe2, 0x71, 0x01, 0x88, 0x82, 0x53, 0x51, 0xf5, 0x63, 0x7e, 0xab, 0x96, 0xb1, 0x37, 0xd0, 0x76 ],
+const [ 0xb0, 0x2d, 0xca, 0xe9, 0x15, 0xa6, 0xa6, 0xbe, 0x9d, 0x3c, 0x9b, 0xf3, 0xfc, 0x61, 0xa9, 0x9e, 0xc3, 0xf1, 0x81, 0xb4, 0xe3, 0xb0, 0x32, 0x1f, 0x6c, 0xf3, 0x04, 0x11, 0x9b, 0x9d, 0xa4, 0x97, 0x14, 0x4d, 0x82, 0x71, 0x6c, 0xd6, 0x78, 0x21, 0xea, 0xf0, 0xac, 0x42, 0x8f, 0x2d, 0xb7, 0x1b, 0x53, 0x2e, 0x07, 0x74, 0xb2, 0x16, 0x81, 0xa8, 0x67, 0x3f, 0x6b, 0xfc, 0x78, 0x2c, 0x8a, 0x2f, 0x72, 0xbf, 0x87, 0x53, 0xf6, 0xac, 0x98, 0xdb, 0x74, 0x2e, 0x5c, 0xf4, 0x37, 0xf9, 0x06, 0x19, 0xa2, 0x6f, 0xbd, 0xe1, 0xb9, 0x16, 0x43, 0x1c, 0xe3, 0x4a, 0xd5, 0x1f, 0xed, 0x2f, 0x53, 0x5c, 0x53, 0xea, 0xa1, 0x36, 0xbb, 0x11, 0x4d, 0x13, 0xc3, 0x5f, 0x72, 0xb2, 0xfc, 0xad, 0xdc, 0xbf, 0x36, 0x1d, 0x6c, 0xa4, 0xff, 0x99, 0xbe, 0xa3, 0x66, 0x7c, 0x0a, 0x21, 0x05, 0x8e, 0x48, 0x45 ],
+const [ 0xee, 0x88, 0x0b, 0x81, 0x50, 0xbc, 0x9b, 0x86, 0x60, 0x70, 0x12, 0xa9, 0xa3, 0xe7, 0x37, 0xe2, 0x40, 0x75, 0x98, 0xd6, 0x59, 0x89, 0x7f, 0xfc, 0x9b, 0xeb, 0x22, 0xfe, 0x14, 0x41, 0x1a, 0x62, 0x45, 0xd8, 0x16, 0x69, 0x79, 0xa1, 0xd1, 0x37, 0x55, 0x7a, 0x41, 0x35, 0xaf, 0xaf, 0x12, 0xb4, 0xa4, 0xc1, 0x52, 0xd3, 0xe4, 0x66, 0x6e, 0xa2, 0x51, 0xd0, 0x5d, 0x87, 0xc9, 0x32, 0x1b, 0xe1, 0x3f, 0x81, 0x59, 0xec, 0x11, 0x78, 0x73, 0xe5, 0x95, 0xde, 0xa2, 0x6e, 0xf5, 0x0b, 0x73, 0x33, 0x3e, 0xa9, 0x77, 0xce, 0xb3, 0xb8, 0x3c, 0xe8, 0x67, 0xd4, 0x7d, 0xa1, 0x0b, 0xbb, 0x96, 0x32, 0x04, 0x0a, 0x3a, 0xd1, 0xc1, 0x47, 0x68, 0xd6, 0x4b, 0x24, 0x9b, 0x1b, 0x1d, 0x02, 0x42, 0xa8, 0x37, 0xb5, 0x6f, 0x90, 0x6e, 0x87, 0xd3, 0x16, 0x06, 0x7f, 0xea, 0x14, 0x82, 0xe3, 0x73, 0x9e ],
+const [ 0xc2, 0x80, 0xf5, 0xb7, 0x82, 0xa0, 0xba, 0x40, 0xa1, 0x56, 0x99, 0xd6, 0x80, 0x12, 0x9b, 0x72, 0x07, 0xaa, 0x89, 0xc8, 0xea, 0x94, 0x51, 0x1c, 0x2b, 0x59, 0xaa, 0x57, 0xe1, 0x46, 0xfb, 0x5a, 0x37, 0x65, 0x79, 0x92, 0xb7, 0xac, 0x90, 0xcc, 0xc9, 0x73, 0x85, 0x4b, 0x76, 0x2c, 0x59, 0x18, 0x72, 0x4e, 0xf0, 0x9a, 0x5a, 0x92, 0x73, 0x66, 0x3a, 0x62, 0xf2, 0x58, 0x52, 0x8e, 0x4e, 0xe3, 0x1a, 0x42, 0x56, 0xa5, 0x83, 0x35, 0x30, 0x3f, 0x80, 0x22, 0xfb, 0x63, 0xc5, 0x7c, 0xb2, 0x2f, 0xce, 0x5e, 0x53, 0xb9, 0x24, 0xc1, 0x41, 0xeb, 0xdc, 0xf1, 0xe7, 0x91, 0x60, 0x42, 0x9f, 0xb0, 0x72, 0xfe, 0xd2, 0x19, 0x6d, 0xa3, 0x60, 0x3f, 0xce, 0x4b, 0x42, 0x46, 0xf4, 0x6c, 0x6e, 0x5c, 0x24, 0xc1, 0xfa, 0x4c, 0xd0, 0x88, 0x85, 0x50, 0x19, 0xee, 0xd3, 0x27, 0x92, 0xc8, 0xb7, 0x68 ],
+const [ 0xb9, 0x49, 0xdf, 0x3b, 0x02, 0x87, 0x1b, 0xea, 0x09, 0x76, 0x87, 0x3a, 0x9c, 0x76, 0x94, 0x2a, 0xc9, 0x34, 0xce, 0x63, 0xac, 0x29, 0x56, 0xd2, 0x85, 0x64, 0x92, 0x97, 0x0d, 0x8a, 0x23, 0x1e, 0x0b, 0x1b, 0x17, 0x8b, 0x22, 0xf6, 0x60, 0x5c, 0xed, 0x20, 0x85, 0x49, 0x4e, 0xc1, 0x98, 0x6f, 0x02, 0x6f, 0x68, 0xae, 0x79, 0xaf, 0xf7, 0x50, 0xe5, 0xb9, 0x2f, 0xeb, 0x92, 0x7c, 0xd0, 0x88, 0x75, 0xe2, 0xad, 0x04, 0x07, 0x55, 0x18, 0xb7, 0x54, 0x82, 0x9b, 0x54, 0x4e, 0x5d, 0xe9, 0x10, 0x68, 0x65, 0x13, 0x07, 0x60, 0x29, 0xff, 0xdb, 0x5c, 0x0b, 0x17, 0x9e, 0x39, 0x44, 0x3e, 0xf2, 0x20, 0x28, 0x08, 0x6e, 0x5a, 0xab, 0x2a, 0x44, 0x65, 0x25, 0x2f, 0x21, 0x47, 0x52, 0x6d, 0x55, 0x22, 0x9d, 0x38, 0x34, 0x09, 0x9e, 0x55, 0xbc, 0x12, 0xe1, 0xb1, 0x78, 0xac, 0xe9, 0x53, 0xa3 ],
+const [ 0xd1, 0xd9, 0x4b, 0xc5, 0x94, 0x65, 0x65, 0x7e, 0x9c, 0xf4, 0x02, 0x02, 0x39, 0xe6, 0x16, 0x4e, 0x00, 0xc7, 0x07, 0xf8, 0xc4, 0x76, 0x4d, 0x70, 0xc2, 0x87, 0x3b, 0x87, 0x1c, 0xe5, 0x1c, 0x2d, 0x89, 0xbc, 0x82, 0x7f, 0x4a, 0x96, 0xdb, 0x01, 0x60, 0xc4, 0x45, 0x27, 0xfc, 0xff, 0xa4, 0x1b, 0x37, 0x4f, 0xf1, 0xba, 0x03, 0x2c, 0xd5, 0xdf, 0x61, 0xe3, 0x76, 0xe5, 0xd5, 0x3c, 0x91, 0x67, 0x17, 0x5a, 0xc9, 0x4a, 0x0c, 0xe2, 0x3e, 0xfe, 0xf4, 0x60, 0x62, 0x00, 0xe5, 0xe6, 0x08, 0xa4, 0x78, 0xf6, 0xbe, 0x11, 0xc2, 0xa1, 0x5d, 0x8d, 0x86, 0xf1, 0xde, 0xfb, 0xa8, 0x85, 0x6f, 0xa1, 0xe5, 0x7b, 0xc6, 0x2f, 0xc2, 0x93, 0xb6, 0xfd, 0xc2, 0x90, 0x00, 0x95, 0xdc, 0xe2, 0x6b, 0x71, 0x2c, 0x83, 0x17, 0x06, 0xe9, 0x1f, 0x0e, 0x01, 0x97, 0x77, 0x1c, 0xd0, 0x7e, 0x07, 0xe1, 0x64 ],
+const [ 0xa6, 0x0c, 0x0e, 0x1c, 0xa3, 0x29, 0xb2, 0x7b, 0xe5, 0x89, 0x68, 0x17, 0x10, 0x49, 0xa6, 0x25, 0xd7, 0x61, 0x54, 0x73, 0x1e, 0x34, 0x1b, 0x9e, 0x60, 0x66, 0xdf, 0x85, 0x4f, 0xee, 0x8a, 0xfd, 0xbb, 0x6c, 0x0c, 0xc7, 0xb5, 0xbc, 0xa0, 0xbf, 0xf4, 0xcb, 0x50, 0x55, 0x78, 0xa9, 0xbb, 0x41, 0x6c, 0xe0, 0x16, 0x73, 0x51, 0x05, 0x71, 0x49, 0x59, 0x8c, 0x3b, 0x05, 0x11, 0xe0, 0x09, 0x7e, 0x43, 0xb4, 0x93, 0x16, 0x1b, 0x93, 0xff, 0xeb, 0x88, 0xbf, 0x63, 0x52, 0xe5, 0x38, 0x85, 0x81, 0xd9, 0x1b, 0xe5, 0x8b, 0x7c, 0x2d, 0xfd, 0x92, 0xbb, 0xb8, 0xc7, 0x37, 0xfd, 0x96, 0x80, 0x56, 0x07, 0x8b, 0xac, 0xf1, 0x1c, 0xd8, 0x5a, 0x69, 0x69, 0x0c, 0xa9, 0xf4, 0xa1, 0x1e, 0x8b, 0x4b, 0xe5, 0xb9, 0xc9, 0xa3, 0xe6, 0xd7, 0x47, 0xdf, 0x4d, 0x91, 0x8a, 0x04, 0x5b, 0x35, 0x77, 0xed ],
+const [ 0x49, 0x96, 0xec, 0x69, 0xeb, 0x25, 0x22, 0x59, 0x9c, 0xcb, 0x47, 0xed, 0x1d, 0xd6, 0xbb, 0x0f, 0x79, 0xb5, 0x85, 0xbe, 0x8b, 0x68, 0xf4, 0x19, 0xc0, 0x35, 0x85, 0xb9, 0x1f, 0x9d, 0x08, 0x44, 0x86, 0x8e, 0xff, 0x3f, 0x36, 0xda, 0x47, 0x24, 0x91, 0xe8, 0xfa, 0xb5, 0x23, 0xaa, 0x93, 0x8f, 0xe0, 0xce, 0x53, 0x02, 0xac, 0x39, 0xe4, 0x20, 0x21, 0xb1, 0x3d, 0x14, 0x8c, 0xd9, 0xc5, 0xb6, 0x38, 0x63, 0xbb, 0x5c, 0xf0, 0x81, 0xd5, 0xf2, 0xbf, 0x9c, 0x27, 0x4d, 0xfa, 0x49, 0x47, 0xbc, 0x80, 0x79, 0xaf, 0xe0, 0x41, 0xef, 0x62, 0xbe, 0xfd, 0xf8, 0xd3, 0x13, 0x4e, 0x56, 0x02, 0xe7, 0xe9, 0x7d, 0xe8, 0x65, 0x21, 0x02, 0x15, 0xea, 0xad, 0x50, 0x98, 0x5c, 0xaa, 0x9d, 0x1f, 0xbd, 0xe4, 0x1c, 0x5f, 0x00, 0x51, 0x74, 0xb6, 0x1b, 0xde, 0x72, 0x0f, 0x5d, 0x6e, 0xfa, 0x07, 0x02 ],
+const [ 0x01, 0x06, 0x9a, 0x2a, 0x04, 0x8a, 0xac, 0x57, 0x91, 0xe0, 0xe9, 0x22, 0xef, 0xcd, 0x52, 0x92, 0xd7, 0xaf, 0x1e, 0x19, 0xc0, 0xb3, 0x15, 0x6d, 0x60, 0x48, 0x3a, 0x93, 0x6f, 0xd4, 0xac, 0x3c, 0xae, 0xa5, 0xce, 0x55, 0x28, 0x2a, 0xa6, 0xda, 0xb7, 0x63, 0x83, 0xeb, 0xcb, 0x96, 0xe3, 0x21, 0x67, 0x44, 0x93, 0x22, 0x6c, 0x5b, 0x18, 0x73, 0x1a, 0xad, 0x4e, 0x8e, 0xd4, 0xa1, 0x4f, 0x35, 0x23, 0x28, 0x96, 0x05, 0xfe, 0xf3, 0x65, 0x4e, 0x49, 0xe4, 0x63, 0x22, 0x9b, 0xc2, 0x8a, 0xac, 0x44, 0x30, 0x40, 0xc3, 0x8f, 0xe0, 0xc4, 0xbf, 0x44, 0x04, 0xcc, 0x8c, 0x71, 0x05, 0x6d, 0xfd, 0x6a, 0x78, 0x3a, 0x62, 0x0f, 0x4e, 0xb0, 0x5c, 0x4d, 0x4a, 0xd2, 0xf0, 0xe8, 0xb9, 0x10, 0xdb, 0x77, 0x5d, 0x6d, 0x25, 0xb0, 0xaa, 0xe1, 0xf9, 0xe5, 0x35, 0xfc, 0xb4, 0xcf, 0x69, 0xcd, 0x3c ],
+const [ 0x6e, 0xf9, 0x90, 0x52, 0xe9, 0x3d, 0xe7, 0x2a, 0x09, 0x28, 0x88, 0x63, 0x50, 0xc3, 0xa8, 0x6b, 0x3e, 0x1b, 0x75, 0xc8, 0x1b, 0xef, 0xfc, 0x65, 0xf0, 0xad, 0x4a, 0x29, 0xd7, 0x9d, 0xd1, 0xce, 0x74, 0x5b, 0x0e, 0xf1, 0xc4, 0x8a, 0x69, 0x65, 0x15, 0xc7, 0x5d, 0xcd, 0x56, 0xdc, 0xd8, 0x6a, 0x91, 0x36, 0xe5, 0x31, 0xb6, 0x9a, 0x88, 0x21, 0x9a, 0x13, 0xe9, 0xd3, 0x3f, 0x2f, 0xb5, 0x53, 0x56, 0x6a, 0xc2, 0x2e, 0x02, 0xeb, 0xf2, 0xcc, 0xdf, 0x6e, 0x59, 0x00, 0x43, 0x82, 0xa2, 0xde, 0xc4, 0xf4, 0xae, 0xcd, 0xfa, 0x8b, 0x7f, 0xdd, 0x86, 0xf5, 0x55, 0x5a, 0x52, 0x02, 0x16, 0xa1, 0x1b, 0x10, 0xf3, 0x32, 0x2d, 0xc7, 0x49, 0x07, 0x6e, 0x06, 0xc5, 0x24, 0x9e, 0x1c, 0xcc, 0x70, 0xdd, 0x3c, 0x1a, 0xc3, 0x6e, 0x2b, 0xa9, 0x40, 0xba, 0x3c, 0xd4, 0xe5, 0x98, 0x7e, 0xbc, 0x60 ],
+const [ 0xe3, 0x6b, 0x3b, 0x02, 0xb8, 0x6b, 0x02, 0x99, 0x6c, 0x1c, 0xc2, 0x1f, 0xcb, 0x70, 0xb5, 0xb3, 0x03, 0x27, 0xaf, 0xad, 0xa1, 0xf0, 0xaf, 0xde, 0xbc, 0xd1, 0xb4, 0x19, 0x70, 0xc8, 0xd2, 0xf1, 0x8f, 0xb3, 0x84, 0xc5, 0x92, 0x6d, 0x44, 0xfa, 0xd6, 0x3a, 0x59, 0x88, 0x05, 0x65, 0xf1, 0xb8, 0xd1, 0x27, 0x6f, 0x2c, 0xe9, 0xcb, 0x06, 0x1f, 0x25, 0x10, 0x87, 0xee, 0x04, 0xcf, 0x77, 0xd7, 0x59, 0xdd, 0x65, 0x01, 0x41, 0x33, 0x7a, 0xbd, 0x58, 0x4c, 0x52, 0x0c, 0x2d, 0xcf, 0x0a, 0x61, 0xf3, 0x6e, 0x9b, 0xa8, 0x79, 0x0e, 0x66, 0x86, 0x5c, 0x28, 0x10, 0xe3, 0x7b, 0x6f, 0x8f, 0xa6, 0xab, 0xb3, 0x85, 0xbf, 0xac, 0x05, 0xcd, 0x6b, 0x5c, 0x1c, 0x54, 0xb3, 0x2b, 0xf7, 0x2b, 0x36, 0xcf, 0xc4, 0xda, 0x29, 0x39, 0x01, 0xf6, 0x9c, 0xc7, 0xe1, 0xf6, 0xff, 0xbb, 0xf1, 0x42, 0xe4 ],
+const [ 0xdd, 0xe1, 0xc0, 0x90, 0x44, 0x6d, 0x11, 0xf9, 0x36, 0x51, 0x7e, 0xac, 0x73, 0xd6, 0x77, 0x66, 0x95, 0xc1, 0xff, 0x30, 0x51, 0x85, 0x0e, 0x32, 0xfa, 0xb7, 0x34, 0xcc, 0x46, 0xc2, 0x80, 0xe3, 0x55, 0xdc, 0xa0, 0x79, 0xef, 0x39, 0x49, 0x81, 0x0e, 0x7e, 0xda, 0xf1, 0x9c, 0x78, 0x3c, 0x18, 0x7d, 0x0e, 0x0c, 0x32, 0xd0, 0x74, 0xfc, 0x3a, 0x72, 0xa2, 0x76, 0xff, 0xc4, 0x05, 0x83, 0x7a, 0xaf, 0x74, 0xec, 0x5f, 0xe5, 0x65, 0x9f, 0xf2, 0x69, 0x61, 0x53, 0x1c, 0x51, 0xb5, 0x6f, 0xbe, 0xcb, 0x6b, 0x28, 0x45, 0x5e, 0x78, 0xea, 0x7f, 0x72, 0x37, 0xfa, 0xad, 0x13, 0x16, 0x59, 0xd9, 0xf2, 0x90, 0xeb, 0x69, 0xac, 0x5b, 0xd8, 0xf5, 0x4f, 0xe2, 0x33, 0x56, 0x1b, 0xf5, 0xda, 0xff, 0x85, 0xbf, 0x9d, 0x91, 0x82, 0xf9, 0xa2, 0xa9, 0x01, 0x5e, 0x07, 0xfc, 0xb9, 0x5f, 0xca, 0xa7 ],
+const [ 0x99, 0x95, 0x8a, 0xa4, 0x59, 0x60, 0x46, 0x57, 0xc7, 0xbf, 0x6e, 0x4c, 0xdf, 0xcc, 0x87, 0x85, 0xf0, 0xab, 0xf0, 0x6f, 0xfe, 0x63, 0x6b, 0x5b, 0x64, 0xec, 0xd9, 0x31, 0xbd, 0x8a, 0x45, 0x63, 0x05, 0x59, 0x24, 0x21, 0xfc, 0x28, 0xdb, 0xcc, 0xcb, 0x8a, 0x82, 0xac, 0xea, 0x2b, 0xe8, 0xe5, 0x41, 0x61, 0xd7, 0xa7, 0x8e, 0x03, 0x99, 0xa6, 0x06, 0x7e, 0xba, 0xca, 0x3f, 0x25, 0x10, 0x27, 0x4d, 0xc9, 0xf9, 0x2f, 0x2c, 0x8a, 0xe4, 0x26, 0x5e, 0xec, 0x13, 0xd7, 0xd4, 0x2e, 0x9f, 0x86, 0x12, 0xd7, 0xbc, 0x25, 0x8f, 0x91, 0x3e, 0xcb, 0x5a, 0x3a, 0x5c, 0x61, 0x03, 0x39, 0xb4, 0x9f, 0xb9, 0x0e, 0x90, 0x37, 0xb0, 0x2d, 0x68, 0x4f, 0xc6, 0x0d, 0xa8, 0x35, 0x65, 0x7c, 0xb2, 0x4e, 0xab, 0x35, 0x27, 0x50, 0xc8, 0xb4, 0x63, 0xb1, 0xa8, 0x49, 0x46, 0x60, 0xd3, 0x6c, 0x3a, 0xb2 ],
+];
+
+const hmac_sha1_keys = const [
+const [ 0x82, 0xf3, 0xb6, 0x9a, 0x1b, 0xff, 0x4d, 0xe1, 0x5c, 0x33 ],
+const [ 0x47, 0x66, 0xe6, 0xfe, 0x5d, 0xff, 0xc9, 0x8a, 0x5c, 0x50 ],
+const [ 0x0f, 0x94, 0x2d, 0x98, 0xa5, 0xc4, 0x06, 0x15, 0x59, 0x67 ],
+const [ 0x78, 0xcb, 0x19, 0x4a, 0x95, 0x8f, 0xc1, 0xb9, 0x5e, 0x35 ],
+const [ 0x2b, 0xaa, 0x67, 0x31, 0xc3, 0x67, 0xe0, 0xf8, 0x18, 0xab ],
+const [ 0xc1, 0xf4, 0xf1, 0xac, 0x1a, 0xdf, 0x93, 0xdf, 0x6e, 0x58 ],
+const [ 0x5d, 0xe2, 0x37, 0xba, 0x1e, 0xda, 0xdf, 0x54, 0xd5, 0x66 ],
+const [ 0xed, 0x00, 0xf3, 0xc4, 0xc2, 0x27, 0xd0, 0x7c, 0xf2, 0xd1 ],
+const [ 0x3b, 0x6a, 0xf3, 0x4a, 0xe3, 0xea, 0x52, 0xd3, 0x96, 0x2d ],
+const [ 0x64, 0x45, 0xf6, 0xd8, 0x84, 0xfb, 0xd5, 0x7a, 0x1e, 0xec ],
+const [ 0xb9, 0xec, 0x31, 0x34, 0x68, 0x06, 0xac, 0xaa, 0x92, 0x21 ],
+const [ 0x51, 0x8a, 0x96, 0xff, 0x0a, 0x44, 0xf9, 0x5d, 0x97, 0xee ],
+const [ 0xa7, 0x90, 0x32, 0xa4, 0xf7, 0xf7, 0x40, 0xf6, 0xd1, 0x3e ],
+const [ 0xab, 0x6b, 0x1f, 0xd8, 0x23, 0x11, 0x47, 0x51, 0x23, 0x09 ],
+const [ 0xd7, 0xf2, 0xbe, 0x75, 0xaa, 0xeb, 0xb9, 0x0d, 0x87, 0xa8 ],
+const [ 0x13, 0x79, 0xa7, 0xaf, 0xcc, 0x09, 0x05, 0xa5, 0xfc, 0x81 ],
+const [ 0x80, 0xa0, 0xdb, 0x49, 0xd0, 0x39, 0xb3, 0x16, 0xae, 0x12 ],
+const [ 0x26, 0x18, 0x12, 0x24, 0x9e, 0x13, 0x38, 0xac, 0x5a, 0x22 ],
+const [ 0x07, 0xa2, 0x7c, 0x1b, 0x24, 0x09, 0x4d, 0xd9, 0xa0, 0xb9 ],
+const [ 0xae, 0xb5, 0x26, 0x73, 0x1e, 0x1d, 0x0c, 0xa8, 0x09, 0xf6 ],
+const [ 0xbc, 0xe4, 0x13, 0xc5, 0x61, 0x20, 0x19, 0xbe, 0x93, 0x7e ],
+const [ 0x10, 0xfd, 0x56, 0xdd, 0xc8, 0xf6, 0x4b, 0x9f, 0xd8, 0x00 ],
+const [ 0x8b, 0x09, 0xea, 0x6a, 0xf3, 0xed, 0x29, 0x28, 0x82, 0x22 ],
+const [ 0x71, 0xab, 0x12, 0xca, 0x47, 0x95, 0x50, 0x5d, 0xea, 0xdd ],
+const [ 0x5f, 0x24, 0xaa, 0x8b, 0xbc, 0x1e, 0xca, 0x3e, 0xab, 0x79 ],
+const [ 0xbe, 0x88, 0x1a, 0x06, 0x10, 0x74, 0xed, 0x05, 0xe5, 0xba ],
+const [ 0x67, 0xf3, 0x85, 0x22, 0x80, 0x39, 0x42, 0x7d, 0xf6, 0x81 ],
+const [ 0xed, 0x01, 0xed, 0xde, 0x5f, 0x8b, 0xee, 0x44, 0x33, 0x46 ],
+const [ 0xab, 0x69, 0x2b, 0x9e, 0x0d, 0x9c, 0xc9, 0x63, 0x27, 0x54 ],
+const [ 0x25, 0x41, 0xc8, 0x92, 0x49, 0x54, 0x52, 0xed, 0x89, 0xdc ],
+const [ 0xf5, 0x73, 0x1a, 0x6e, 0x89, 0x25, 0xf7, 0x43, 0x06, 0xfa ],
+const [ 0x29, 0x05, 0x66, 0xd7, 0x77, 0xb0, 0xee, 0xe9, 0x84, 0xfa ],
+const [ 0xa7, 0xe5, 0x4c, 0xe2, 0x34, 0xb0, 0xd5, 0xc8, 0x39, 0xb8 ],
+const [ 0x29, 0x18, 0xc7, 0x77, 0x9c, 0x43, 0xfd, 0xf2, 0x17, 0x48 ],
+const [ 0x9e, 0x8c, 0x66, 0x5b, 0xa5, 0x38, 0x54, 0xf0, 0xfd, 0x27 ],
+const [ 0x41, 0x16, 0x49, 0x88, 0x75, 0x24, 0x65, 0xa8, 0xf9, 0x29 ],
+const [ 0xea, 0x66, 0xbf, 0x3a, 0x62, 0x8d, 0xd1, 0xa9, 0x68, 0xc9 ],
+const [ 0x14, 0xf4, 0x3e, 0x54, 0x24, 0xac, 0x9a, 0xeb, 0x97, 0xe7 ],
+const [ 0x62, 0x51, 0xc2, 0xa2, 0x97, 0x6b, 0x87, 0x57, 0xad, 0xca ],
+const [ 0x03, 0x6f, 0xc9, 0x4f, 0xaf, 0xab, 0x92, 0xba, 0x55, 0x39 ],
+const [ 0xc0, 0x7d, 0x47, 0x55, 0x9b, 0x67, 0x59, 0xf0, 0x96, 0x51 ],
+const [ 0xa3, 0x2e, 0x28, 0xd4, 0xb4, 0x58, 0xce, 0xb7, 0xcb, 0x13 ],
+const [ 0x9f, 0xc0, 0x5e, 0xf4, 0x95, 0x79, 0xaa, 0xef, 0x45, 0xc0 ],
+const [ 0xfe, 0x5d, 0xf1, 0x4e, 0x58, 0x88, 0xfa, 0xd1, 0x38, 0xea ],
+const [ 0x6c, 0x56, 0x89, 0x0c, 0x60, 0x3b, 0xd3, 0x83, 0x3d, 0x21 ],
+const [ 0x59, 0x78, 0x59, 0x28, 0xd7, 0x25, 0x16, 0xe3, 0x12, 0x72 ],
+const [ 0xc5, 0x21, 0x09, 0xc9, 0xd0, 0xda, 0x92, 0x58, 0xeb, 0x73 ],
+const [ 0xaa, 0x61, 0x97, 0xd4, 0xaf, 0xd5, 0xee, 0xf5, 0x18, 0x7a ],
+const [ 0x9e, 0x0b, 0xe9, 0x4e, 0xd7, 0x07, 0x45, 0x8d, 0x5c, 0xec ],
+const [ 0x65, 0xe0, 0x69, 0x54, 0xb0, 0x35, 0x0f, 0xb3, 0xdb, 0x19 ],
+const [ 0xe8, 0x9d, 0xef, 0xd4, 0x07, 0x77, 0xfe, 0x17, 0x31, 0x67 ],
+const [ 0x15, 0x01, 0xb9, 0x8c, 0xd2, 0xb0, 0x30, 0xd6, 0x26, 0x60 ],
+const [ 0xbc, 0x28, 0xbe, 0x9d, 0x8f, 0xbb, 0x1d, 0x76, 0x63, 0x60 ],
+const [ 0xaf, 0xf7, 0xd8, 0x36, 0x88, 0x02, 0x32, 0xf8, 0x13, 0x2d ],
+const [ 0xef, 0xe1, 0xc6, 0x5a, 0x8a, 0x23, 0x0e, 0x96, 0xcf, 0xa6 ],
+const [ 0x4f, 0xb2, 0x51, 0x4d, 0x3d, 0x73, 0xb4, 0x77, 0x0a, 0x69 ],
+const [ 0x1b, 0x6c, 0x51, 0x46, 0xea, 0x28, 0xdc, 0xa9, 0xf6, 0xa4 ],
+const [ 0x2d, 0x54, 0x4e, 0x00, 0x3b, 0x09, 0xcd, 0xe4, 0xa4, 0xc7 ],
+const [ 0x1b, 0x5c, 0xdd, 0xff, 0x53, 0x1b, 0xab, 0xb5, 0x1b, 0x4c ],
+const [ 0x8d, 0x8d, 0x15, 0xd8, 0xa9, 0x57, 0x9a, 0xdb, 0x2d, 0x62 ],
+const [ 0x19, 0x1a, 0x70, 0x0f, 0x3d, 0xc5, 0x60, 0xa5, 0x89, 0xf9, 0xc2, 0xca, 0x78, 0x4e, 0x97, 0x0c, 0xb1, 0xe5, 0x52, 0xa0, 0xe6, 0xb3, 0xdf, 0x54, 0xfc, 0x1c, 0xe3, 0xc5, 0x6c, 0xc4, 0x46, 0xd2 ],
+const [ 0xdc, 0xb4, 0x63, 0xa1, 0x3a, 0xe3, 0x37, 0x41, 0x41, 0x51, 0xa3, 0x1a, 0xa0, 0xc3, 0xe8, 0xba, 0xb3, 0xee, 0x78, 0x1b, 0x9f, 0x3a, 0xaa, 0x86, 0x9d, 0xc5, 0xb1, 0xb1, 0x96, 0xab, 0xcf, 0x2b ],
+const [ 0x93, 0xe7, 0x40, 0x2c, 0xb2, 0xb1, 0xb5, 0x94, 0x67, 0x0e, 0x65, 0x6a, 0x6c, 0xa4, 0xef, 0x24, 0x72, 0x31, 0xac, 0x09, 0xb7, 0xcc, 0xe1, 0x94, 0xd7, 0x6e, 0x39, 0x19, 0xe4, 0xb0, 0x72, 0xaa ],
+const [ 0xac, 0x28, 0x6e, 0x20, 0x6d, 0x88, 0xa3, 0xc0, 0x0e, 0x67, 0x05, 0xdf, 0x21, 0x1b, 0x5e, 0xad, 0x6a, 0x69, 0x36, 0x25, 0x44, 0x53, 0x51, 0x87, 0x41, 0x31, 0x79, 0x09, 0x11, 0x03, 0x7e, 0xc9 ],
+const [ 0xd5, 0x0f, 0xf2, 0xc5, 0x44, 0x8b, 0x5c, 0x2b, 0x69, 0x5f, 0x61, 0xdc, 0x55, 0xde, 0x55, 0xee, 0x96, 0xf7, 0xbb, 0xe5, 0x70, 0x67, 0xae, 0x85, 0x6a, 0x2d, 0x80, 0xe5, 0x0d, 0x3e, 0xa0, 0xc5 ],
+const [ 0x60, 0x7e, 0x64, 0x5e, 0x1b, 0xd7, 0xfc, 0xef, 0xa0, 0xe3, 0x46, 0x02, 0xd3, 0x44, 0x71, 0xdd, 0x71, 0x17, 0x31, 0x30, 0xff, 0x1c, 0x59, 0x53, 0x00, 0x17, 0xac, 0xd0, 0x6b, 0x76, 0xf0, 0x21 ],
+const [ 0xba, 0x60, 0xee, 0x37, 0x34, 0xa5, 0x4a, 0xe4, 0x2c, 0xfe, 0xb6, 0x78, 0x23, 0x3e, 0xca, 0xfd, 0x8d, 0x55, 0xc7, 0x83, 0xca, 0x74, 0x28, 0x65, 0x57, 0x72, 0x79, 0xcd, 0x46, 0x6f, 0x6c, 0x7a ],
+const [ 0x86, 0x1a, 0xe8, 0x4f, 0x59, 0x6b, 0xd2, 0x3c, 0xd3, 0x79, 0x70, 0x45, 0x4e, 0x89, 0x08, 0x68, 0x60, 0x22, 0x11, 0x11, 0x54, 0xb5, 0x46, 0xe1, 0xda, 0x84, 0xfa, 0xae, 0xfd, 0xbc, 0xab, 0xcb ],
+const [ 0x30, 0x4e, 0x23, 0xc5, 0x70, 0xeb, 0x78, 0x87, 0x27, 0x0d, 0x73, 0xab, 0xba, 0x9c, 0x32, 0x68, 0xd0, 0xae, 0x42, 0xaa, 0xfb, 0x9e, 0x62, 0xc0, 0x9a, 0x5e, 0x89, 0x54, 0xfe, 0x0e, 0x2a, 0xa1 ],
+const [ 0xcb, 0x3c, 0x6f, 0xb3, 0xfc, 0xd4, 0x64, 0xd5, 0xd2, 0xdc, 0xeb, 0xac, 0x4f, 0xa4, 0x1c, 0xba, 0x7a, 0x60, 0x70, 0x6d, 0x9c, 0x88, 0x8b, 0xa1, 0xaf, 0x7e, 0x58, 0x67, 0x14, 0x72, 0x5b, 0x05 ],
+const [ 0xd5, 0x0d, 0xf8, 0xab, 0xa7, 0x27, 0x3e, 0x64, 0x27, 0xea, 0x6b, 0xc0, 0xa4, 0xfd, 0xd4, 0xd5, 0xb0, 0x36, 0x4f, 0x33, 0x6c, 0xc6, 0x96, 0xb9, 0x06, 0xb1, 0xed, 0xae, 0x7f, 0x82, 0x05, 0x0d ],
+const [ 0x1d, 0xae, 0xbe, 0x36, 0x00, 0x7d, 0x26, 0xb9, 0x88, 0xf8, 0xc4, 0xfc, 0xaa, 0x0b, 0x5a, 0x07, 0x65, 0x8e, 0xf6, 0xff, 0x52, 0x83, 0x25, 0x92, 0x7d, 0x98, 0x64, 0x96, 0x73, 0xf4, 0xd7, 0xec ],
+const [ 0xfd, 0xef, 0xd6, 0xdb, 0xd4, 0x3c, 0xb8, 0x17, 0xb1, 0x32, 0x75, 0x46, 0x33, 0xc0, 0xce, 0x72, 0x4b, 0xe5, 0x57, 0x2e, 0x4e, 0x73, 0x2b, 0x7d, 0x48, 0x13, 0xdd, 0xef, 0x94, 0x89, 0xb2, 0x0d ],
+const [ 0xe3, 0x2e, 0x6a, 0xcc, 0x16, 0xd4, 0xf6, 0xed, 0x9c, 0xc3, 0xe2, 0x3a, 0xc6, 0x5a, 0x25, 0x9c, 0x65, 0x70, 0x4a, 0x3f, 0x84, 0x37, 0xc5, 0x98, 0x57, 0x66, 0x87, 0xa7, 0x6e, 0x97, 0xd0, 0x79 ],
+const [ 0x12, 0x8f, 0xfb, 0x7d, 0x52, 0xb7, 0x10, 0xde, 0x97, 0xee, 0x92, 0x1c, 0xc9, 0xd2, 0xbc, 0x5e, 0x07, 0x50, 0xd3, 0xa2, 0xe1, 0x0d, 0xfc, 0x49, 0xc8, 0x05, 0x50, 0xd6, 0xc2, 0x73, 0x32, 0xf3 ],
+const [ 0xa1, 0x27, 0x94, 0x05, 0x7d, 0xe3, 0xb3, 0xea, 0x42, 0x6f, 0xbe, 0x01, 0x95, 0xee, 0x17, 0xb4, 0x87, 0x3e, 0xf7, 0xe6, 0xba, 0x87, 0xb2, 0x2b, 0xc6, 0x14, 0x3c, 0x38, 0xda, 0x62, 0xec, 0x98 ],
+const [ 0x2a, 0x43, 0x2b, 0x46, 0x2e, 0xbb, 0x78, 0x83, 0x50, 0x08, 0xb4, 0xaa, 0x8a, 0x92, 0xb4, 0x0f, 0x6f, 0xe9, 0xdc, 0x53, 0xa9, 0x63, 0x35, 0x2e, 0xa5, 0x07, 0xc0, 0x6c, 0x8d, 0xa9, 0x0a, 0x36 ],
+const [ 0x23, 0x2e, 0xab, 0xc4, 0x78, 0x50, 0x1f, 0x24, 0x6e, 0x73, 0xe7, 0x6b, 0xf0, 0x22, 0x7e, 0x03, 0x56, 0xa4, 0x16, 0x1f, 0x97, 0x68, 0x75, 0x40, 0xba, 0xa7, 0x02, 0xfe, 0x8e, 0x44, 0x20, 0x05 ],
+const [ 0xaa, 0xe2, 0x0e, 0x01, 0xf6, 0x18, 0x5d, 0x80, 0x73, 0xf4, 0x0f, 0xd7, 0x64, 0x80, 0x98, 0xfc, 0xfa, 0xf3, 0xdd, 0x8b, 0x6c, 0x7b, 0xec, 0xb1, 0x4a, 0x39, 0xea, 0x48, 0x0e, 0x8d, 0x4c, 0x43 ],
+const [ 0x58, 0xd2, 0x59, 0xd3, 0x65, 0x1b, 0x65, 0x33, 0xf9, 0x8c, 0xd0, 0xf7, 0xda, 0x9c, 0xc4, 0xf3, 0xa2, 0x51, 0xbc, 0x02, 0xcd, 0x06, 0x3b, 0xed, 0x11, 0x6b, 0xbe, 0x8f, 0xee, 0xcd, 0xef, 0x37 ],
+const [ 0xe0, 0x42, 0x10, 0x39, 0xb6, 0x49, 0xa0, 0xd7, 0x2d, 0x2b, 0x5d, 0xba, 0x7a, 0xa0, 0x2e, 0xf7, 0xf1, 0xf8, 0x33, 0x03, 0xbd, 0x01, 0x10, 0xbd, 0xd3, 0x2b, 0x89, 0xaf, 0x29, 0xea, 0x50, 0x91 ],
+const [ 0x59, 0xb8, 0x18, 0xb1, 0x2c, 0x95, 0xbe, 0x44, 0x1f, 0xf5, 0x2d, 0x8b, 0xd1, 0x92, 0x86, 0x30, 0x0f, 0x8c, 0xb8, 0x77, 0xe2, 0x5e, 0xa4, 0xcf, 0xcb, 0x11, 0x7f, 0xa7, 0x4d, 0xb0, 0x77, 0x82 ],
+const [ 0x4d, 0xef, 0x68, 0x55, 0x32, 0x99, 0x9b, 0x63, 0x52, 0xa6, 0x74, 0x1b, 0xa4, 0x7b, 0xd2, 0xaa, 0x39, 0x39, 0x61, 0xe1, 0x2a, 0xe4, 0x26, 0x7e, 0xcf, 0xc5, 0x58, 0xad, 0x31, 0x0c, 0x72, 0xce ],
+const [ 0xa3, 0xe9, 0x83, 0xe3, 0xe9, 0x59, 0xad, 0x38, 0xb9, 0xbc, 0x4b, 0x45, 0x16, 0x58, 0x9b, 0x26, 0x3a, 0xd2, 0xc1, 0x41, 0x88, 0x4e, 0x5c, 0x84, 0xc2, 0xd6, 0x5d, 0xee, 0x7c, 0x00, 0x19, 0x51 ],
+const [ 0xb1, 0xb6, 0xd5, 0xe0, 0xb9, 0xb1, 0xef, 0xb6, 0x08, 0x91, 0x2d, 0xa4, 0x8d, 0x56, 0x1f, 0x44, 0x89, 0x10, 0x2a, 0xba, 0xa0, 0x9f, 0x39, 0x96, 0x31, 0xbe, 0xb0, 0xfc, 0xe3, 0x40, 0xa2, 0x02 ],
+const [ 0xc9, 0x13, 0xfe, 0x12, 0xcb, 0x76, 0xe5, 0x74, 0xa2, 0x3b, 0xf4, 0x6c, 0x90, 0x32, 0x10, 0x58, 0x48, 0xce, 0x2c, 0x71, 0xf6, 0x1e, 0x6d, 0x58, 0x80, 0xff, 0x8c, 0xf2, 0x0b, 0x91, 0x7d, 0x76 ],
+const [ 0xd3, 0xdd, 0xed, 0x60, 0x91, 0x13, 0x43, 0xbc, 0xa3, 0xaf, 0x35, 0xd2, 0xdc, 0xcb, 0xca, 0x9d, 0x23, 0x44, 0xb6, 0x0c, 0x74, 0xb4, 0x81, 0x9e, 0x27, 0xa0, 0xe6, 0x2f, 0x75, 0xf3, 0x7a, 0x12 ],
+const [ 0x04, 0xd3, 0x11, 0x06, 0x09, 0x8f, 0xbd, 0xa1, 0x9a, 0xf2, 0x8e, 0x84, 0x33, 0x9c, 0x73, 0x6e, 0xec, 0x54, 0xe5, 0x85, 0x9d, 0x9f, 0x28, 0x8f, 0x45, 0x91, 0xce, 0x64, 0xad, 0xe4, 0x7e, 0xa3 ],
+const [ 0xad, 0xdd, 0xe2, 0xc6, 0x2b, 0xfa, 0x07, 0x22, 0xf7, 0x3b, 0x99, 0xad, 0xd6, 0x5f, 0x2b, 0x3c, 0x9b, 0xfd, 0xc9, 0x3c, 0x4b, 0x18, 0x39, 0xec, 0x7f, 0xf3, 0x80, 0xca, 0x0a, 0x26, 0xa9, 0x4a ],
+const [ 0xab, 0x40, 0xbb, 0x08, 0x91, 0x99, 0xcc, 0xc0, 0xea, 0x49, 0xc6, 0xf5, 0x21, 0x62, 0x80, 0xf5, 0xdd, 0x3e, 0xff, 0x7c, 0x77, 0x1f, 0x8f, 0x7b, 0xb1, 0x12, 0x12, 0x17, 0xa5, 0x19, 0x99, 0xf5 ],
+const [ 0x58, 0x10, 0x24, 0x23, 0xa4, 0x16, 0x8f, 0xa6, 0x0a, 0x5a, 0xa7, 0xf7, 0x90, 0x92, 0xd5, 0x23, 0x26, 0xc9, 0x8e, 0x22, 0xee, 0x5f, 0x3d, 0xff, 0xdb, 0x52, 0x7d, 0x39, 0x7d, 0xbb, 0x8c, 0x68 ],
+const [ 0x81, 0x6a, 0xa4, 0xc3, 0xee, 0x06, 0x63, 0x10, 0xac, 0x1e, 0x66, 0x66, 0xcf, 0x83, 0x0c, 0x37, 0x53, 0x55, 0xc3, 0xc8, 0xba, 0x18, 0xcf, 0xe1, 0xf5, 0x0a, 0x48, 0xc9, 0x88, 0xb4, 0x62, 0x72 ],
+const [ 0xed, 0xbc, 0x48, 0xed, 0x94, 0x8c, 0xcc, 0xc4, 0x21, 0xef, 0xc7, 0xa6, 0x47, 0x5a, 0x2d, 0xc2, 0x47, 0x9d, 0xd9, 0x99, 0x6f, 0x5e, 0x2f, 0x10, 0xe0, 0xc6, 0x00, 0xc3, 0x95, 0x7a, 0xad, 0x9d ],
+const [ 0x42, 0x0e, 0x70, 0xec, 0xc3, 0xcd, 0xaf, 0xfb, 0x72, 0x6a, 0x18, 0x3c, 0x79, 0x38, 0x45, 0x31, 0x5f, 0x73, 0x0f, 0xa4, 0xda, 0xc9, 0xfe, 0x46, 0xe4, 0x18, 0x03, 0x97, 0x10, 0x7a, 0x6a, 0x05 ],
+const [ 0x78, 0xb8, 0xb8, 0xaa, 0x70, 0xfc, 0xb2, 0xb0, 0xcb, 0xe8, 0x35, 0x94, 0x12, 0x75, 0xa5, 0x40, 0x5c, 0xef, 0x6d, 0x80, 0x13, 0xaa, 0xe7, 0x59, 0xf6, 0xf1, 0x7c, 0x9d, 0x64, 0x3f, 0x0c, 0xbc ],
+const [ 0xaa, 0x01, 0xf6, 0x99, 0xda, 0x8d, 0x42, 0x26, 0x1e, 0x3b, 0x04, 0xba, 0x13, 0x89, 0xd2, 0x63, 0x1e, 0x98, 0x5f, 0xdb, 0xa2, 0x8a, 0x4c, 0x0a, 0x76, 0x2e, 0x40, 0xcb, 0x96, 0xdf, 0x3a, 0xf3 ],
+const [ 0x67, 0x33, 0x49, 0x85, 0x82, 0xe9, 0x4a, 0x58, 0xce, 0xf9, 0x83, 0xb1, 0xf5, 0x2f, 0x21, 0x5d, 0xa1, 0x61, 0x2e, 0x8e, 0x48, 0xf6, 0x05, 0x81, 0x4a, 0xa9, 0x09, 0x5d, 0x39, 0x8b, 0x96, 0x5f ],
+const [ 0x3a, 0x23, 0x9f, 0xf1, 0x56, 0x05, 0x8e, 0xa4, 0xff, 0x05, 0xe0, 0xf6, 0x72, 0xb7, 0xec, 0xb5, 0xd1, 0x06, 0xfa, 0xd5, 0xd3, 0x1e, 0x9d, 0x6f, 0xb9, 0x89, 0x43, 0x0a, 0x84, 0x97, 0x0a, 0x1a ],
+const [ 0xa3, 0xab, 0xb8, 0x93, 0xaa, 0x5f, 0x82, 0xc4, 0xa8, 0xef, 0x75, 0x44, 0x60, 0x62, 0x8a, 0xf6, 0xb7, 0x5a, 0xf0, 0x21, 0x68, 0xf4, 0x5b, 0x72, 0xf8, 0xf0, 0x9e, 0x45, 0xed, 0x12, 0x7c, 0x20 ],
+const [ 0xc3, 0x07, 0x0d, 0x79, 0xeb, 0xe3, 0xc6, 0xa9, 0x8a, 0xc1, 0x3e, 0x50, 0xae, 0x47, 0x10, 0xe6, 0x02, 0x48, 0x5a, 0x68, 0xa0, 0x43, 0x29, 0xfb, 0x27, 0x2c, 0x31, 0xd3, 0x0d, 0x6f, 0xc2, 0x53 ],
+const [ 0xa9, 0xd5, 0x99, 0xa9, 0xd0, 0x03, 0x68, 0x6e, 0x2a, 0x3b, 0x2a, 0x27, 0x40, 0x76, 0x44, 0xb7, 0x3b, 0xc4, 0xd7, 0xc7, 0xef, 0x3e, 0xe7, 0x5d, 0x19, 0x3c, 0xbd, 0xb0, 0xe5, 0xc8, 0x89, 0x3b ],
+const [ 0x8e, 0xf7, 0x3e, 0x17, 0xf2, 0xdc, 0x9e, 0x06, 0x32, 0x30, 0xa3, 0x35, 0x2f, 0xe5, 0xc5, 0x49, 0xc1, 0xfd, 0x52, 0x6c, 0x43, 0xf9, 0x0f, 0x57, 0x53, 0x95, 0x22, 0xb0, 0xd3, 0xb2, 0x2f, 0x97 ],
+const [ 0xa5, 0x35, 0xc3, 0x8a, 0x4f, 0x69, 0xcc, 0xbc, 0x13, 0x43, 0x06, 0xf5, 0xf1, 0x58, 0x01, 0x9b, 0x7c, 0x79, 0x99, 0x26, 0x25, 0xe4, 0x62, 0xe9, 0xbc, 0xba, 0x4a, 0x2f, 0x34, 0xb4, 0x79, 0x8a ],
+const [ 0x2b, 0x3a, 0x58, 0x90, 0xde, 0x01, 0xa3, 0x0f, 0x88, 0xd4, 0xf7, 0xea, 0xaf, 0x70, 0x2f, 0x61, 0x29, 0xa5, 0xe7, 0x71, 0x8d, 0xfe, 0x8f, 0x9c, 0xe7, 0xa4, 0xbf, 0xe8, 0xb0, 0x80, 0xca, 0x2a ],
+const [ 0xc0, 0x5d, 0x6b, 0x83, 0xa2, 0x7e, 0xf6, 0x5c, 0xef, 0x55, 0x71, 0x22, 0x2d, 0x24, 0xad, 0xbc, 0xc1, 0x89, 0x58, 0x64, 0x05, 0x48, 0xbc, 0x95, 0x9a, 0x4b, 0xaa, 0x2b, 0x00, 0xe7, 0xb0, 0xc6 ],
+const [ 0x89, 0x58, 0x68, 0xf1, 0x96, 0x95, 0xc1, 0xf5, 0xa2, 0x6d, 0x8a, 0xe3, 0x39, 0xc5, 0x67, 0xe5, 0xab, 0x43, 0xb0, 0xfc, 0xc8, 0x05, 0x60, 0x50, 0xe9, 0x92, 0x2e, 0xc5, 0x30, 0x10, 0xf9, 0xce ],
+const [ 0x95, 0x0f, 0xb0, 0xcd, 0xe3, 0x0f, 0x34, 0xf5, 0x97, 0xaf, 0x5c, 0xaa, 0x2b, 0x16, 0xfc, 0x86, 0xa5, 0xc3, 0xef, 0x06, 0x5d, 0x36, 0xff, 0xdd, 0x06, 0xec, 0x04, 0x8e, 0xec, 0x91, 0x50, 0x39 ],
+const [ 0xa3, 0x1a, 0xcd, 0x1a, 0xf2, 0x61, 0xa1, 0xe7, 0xf7, 0x51, 0x14, 0x0a, 0x58, 0x0b, 0x91, 0xd4, 0x76, 0x79, 0x2a, 0x9f, 0x96, 0xe1, 0xdd, 0x01, 0x3f, 0xba, 0x16, 0x45, 0xe2, 0xbf, 0x76, 0x1b ],
+const [ 0x8d, 0xdf, 0x3b, 0xe2, 0xab, 0x49, 0xf1, 0x1f, 0x12, 0xf3, 0x92, 0xa0, 0x9f, 0x5b, 0x72, 0xfc, 0xdd, 0xec, 0x1e, 0x18, 0x6d, 0xd3, 0xe4, 0x9a, 0xab, 0x0e, 0x95, 0xa0, 0x8e, 0xc5, 0x89, 0xb1 ],
+const [ 0x90, 0xae, 0xa6, 0xf7, 0xc6, 0xc3, 0x81, 0x57, 0x18, 0xba, 0x19, 0x59, 0xec, 0xec, 0xaf, 0x53, 0x12, 0x80, 0x20, 0xb7, 0x03, 0x9a, 0x51, 0xe7, 0x66, 0xd0, 0xcf, 0x4b, 0xd9, 0xde, 0xb7, 0xa2 ],
+const [ 0x5e, 0x6a, 0x48, 0x97, 0x25, 0x81, 0x0a, 0x85, 0xfe, 0x45, 0x05, 0xfa, 0xb0, 0x3d, 0x3b, 0x3c, 0x78, 0x77, 0x10, 0x75, 0xe9, 0x13, 0xb7, 0x59, 0xf7, 0x01, 0xea, 0x08, 0x4e, 0x0a, 0xde, 0x36 ],
+const [ 0x61, 0x84, 0x06, 0xf4, 0x3d, 0xd7, 0x9a, 0xcd, 0x2c, 0xd3, 0x84, 0xb3, 0xd1, 0x27, 0x09, 0xe4, 0x3d, 0x26, 0x7d, 0x76, 0xfe, 0xbf, 0x63, 0xed, 0x58, 0xaf, 0xd6, 0x0d, 0xd2, 0xf5, 0x28, 0xed ],
+const [ 0xad, 0x44, 0x5d, 0xa4, 0x8d, 0x46, 0xab, 0xfe, 0xf1, 0x03, 0xf9, 0xc6, 0xc5, 0x47, 0x34, 0x44, 0xff, 0xbb, 0xae, 0x90, 0x27, 0x5c, 0xc4, 0xa8, 0x16, 0x2b, 0xbe, 0xc0, 0xfe, 0x26, 0xf6, 0xd9 ],
+const [ 0x05, 0x90, 0x5a, 0x6e, 0xcb, 0x16, 0x79, 0x36, 0x40, 0x90, 0xc9, 0x51, 0x0f, 0x06, 0xfb, 0x3c, 0x0e, 0x09, 0x32, 0x1b, 0x21, 0xfe, 0x0a, 0xad, 0x5c, 0xb9, 0xd9, 0x80, 0x67, 0x4e, 0x35, 0x61 ],
+const [ 0x3e, 0x9e, 0xeb, 0xe9, 0xad, 0xd8, 0xe8, 0x31, 0x58, 0x92, 0xc6, 0xb3, 0xbb, 0xeb, 0x77, 0xab, 0xf6, 0x0d, 0xcd, 0xae, 0x19, 0x61, 0xe2, 0x83, 0x9f, 0xff, 0xb7, 0x35, 0x38, 0x69, 0x1b, 0x66 ],
+const [ 0xc1, 0x16, 0xc6, 0x98, 0xb1, 0x2c, 0x15, 0x3b, 0x57, 0xc9, 0xd5, 0x7d, 0x4e, 0xeb, 0x97, 0xf7, 0xdd, 0x8e, 0xff, 0x14, 0xcc, 0x2a, 0x2d, 0xbd, 0x76, 0x7e, 0x7c, 0x35, 0x20, 0x8c, 0x6f, 0x41 ],
+const [ 0xff, 0x73, 0x00, 0x4a, 0x8a, 0xa6, 0x29, 0xca, 0x5c, 0x72, 0x41, 0x4e, 0xa6, 0x52, 0xa6, 0x53, 0x3f, 0xd2, 0x82, 0xe8, 0x47, 0xa4, 0x92, 0x65, 0x0a, 0xf1, 0x2c, 0x59, 0x26, 0xed, 0x80, 0xc4 ],
+const [ 0xbe, 0xdb, 0x39, 0x2f, 0x8a, 0x77, 0xa4, 0x70, 0x85, 0x8a, 0x9c, 0x36, 0x6b, 0x72, 0x55, 0xf3, 0xb2, 0x5c, 0x9a, 0x5d, 0x10, 0xb7, 0x6d, 0x79, 0x3d, 0xe9, 0xee, 0xf8, 0xfa, 0x40, 0x7e, 0xc7 ],
+const [ 0x86, 0x3b, 0xbe, 0x40, 0xcb, 0x66, 0x94, 0xf7, 0x36, 0xb5, 0x32, 0xb9, 0x5e, 0x38, 0xfb, 0xab, 0xe0, 0xe4, 0x9c, 0x15, 0xf7, 0xdc, 0x42, 0xc5, 0x4d, 0xef, 0x09, 0xae, 0x11, 0x61, 0xb7, 0xd5 ],
+const [ 0xb4, 0x76, 0xd2, 0x8a, 0xeb, 0x5f, 0xac, 0x74, 0xfc, 0xf4, 0xcd, 0xb1, 0xab, 0x00, 0xa3, 0x85, 0x71, 0x23, 0x1d, 0xb0, 0x66, 0x24, 0xb4, 0x58, 0x65, 0x88, 0xac, 0x43, 0x6a, 0x64, 0x97, 0x49 ],
+const [ 0x26, 0x8b, 0x0e, 0x1f, 0x11, 0x00, 0x52, 0xaa, 0xa2, 0xee, 0xe3, 0x27, 0xe3, 0x4a, 0xb3, 0x49, 0x02, 0x98, 0x06, 0xda, 0xf7, 0x02, 0x30, 0x68, 0x67, 0xa7, 0xa0, 0x3b, 0xc8, 0x35, 0x1d, 0x8a, 0xc7, 0xba, 0x50, 0xee, 0xe6, 0xb7, 0x83, 0x16, 0x6a, 0x77, 0xa8, 0xbd, 0x74, 0x9e, 0x9d, 0xd9, 0x6e, 0x05, 0xae, 0x15, 0xa8, 0xc5, 0x5c, 0x82, 0x43, 0x92, 0x5c, 0x89, 0x4f, 0x4b, 0xe3, 0x25 ],
+const [ 0x77, 0xc1, 0x92, 0x47, 0x22, 0x53, 0x68, 0x5d, 0x52, 0xa6, 0xfc, 0x39, 0x3b, 0xb7, 0xa9, 0xd5, 0xbd, 0x73, 0xf5, 0xaf, 0x2b, 0x6e, 0x74, 0x20, 0x50, 0xd7, 0xea, 0xe9, 0xb4, 0xac, 0xb0, 0x0f, 0x1b, 0x2a, 0x59, 0xea, 0x4f, 0x88, 0x94, 0x78, 0x1f, 0xe4, 0x54, 0xf7, 0xa8, 0x7e, 0x2f, 0xb2, 0xd3, 0x24, 0x04, 0x1b, 0x1f, 0xed, 0xe1, 0x1a, 0xa1, 0x2a, 0x24, 0xa5, 0x49, 0x9a, 0xe0, 0x91 ],
+const [ 0x79, 0xa5, 0x57, 0x10, 0x25, 0x17, 0xe4, 0x06, 0xb2, 0x65, 0x57, 0xd0, 0x26, 0xcf, 0x06, 0x42, 0x9a, 0x5b, 0xe8, 0x40, 0xec, 0xc0, 0xf0, 0xc9, 0xb3, 0x83, 0x99, 0x35, 0x78, 0x60, 0xc3, 0xba, 0x23, 0xeb, 0xbd, 0x35, 0xb3, 0x77, 0xa3, 0x27, 0x32, 0x37, 0xea, 0xfe, 0xe8, 0xa3, 0x39, 0x97, 0xd0, 0x1d, 0x7a, 0x00, 0x48, 0xd5, 0x32, 0x82, 0x0c, 0xea, 0x0d, 0xdf, 0x65, 0xd2, 0xbe, 0xd8 ],
+const [ 0x3a, 0x41, 0x82, 0xaf, 0x8c, 0x39, 0x14, 0xd1, 0xdf, 0x57, 0xb6, 0x32, 0x1f, 0xa5, 0xde, 0xc6, 0x87, 0x48, 0xad, 0x74, 0x6e, 0x03, 0x69, 0xbb, 0x64, 0xfc, 0x2d, 0x9b, 0x7d, 0xc3, 0xdf, 0xb3, 0xed, 0x90, 0x63, 0xa7, 0xd5, 0xcc, 0x0e, 0xc4, 0x5d, 0xd3, 0x5e, 0xe7, 0x03, 0xf9, 0xe8, 0x9a, 0x33, 0xcb, 0x91, 0x81, 0x17, 0x97, 0x01, 0xf5, 0xb0, 0x2e, 0x55, 0xee, 0x26, 0xe8, 0x14, 0x26 ],
+const [ 0x35, 0x10, 0xc8, 0xf6, 0xda, 0x91, 0x37, 0x1b, 0x5c, 0x81, 0x46, 0x8b, 0x71, 0x4d, 0x05, 0x28, 0x4b, 0xec, 0xda, 0xd0, 0x1d, 0x5a, 0x24, 0x76, 0xdc, 0x48, 0x1f, 0x78, 0x43, 0x12, 0x08, 0x2c, 0x19, 0xf1, 0x81, 0xbc, 0xb6, 0x72, 0x36, 0x35, 0xc4, 0x26, 0xc1, 0xda, 0x43, 0x9b, 0xcb, 0xbe, 0xcf, 0x8c, 0x74, 0x92, 0x26, 0x55, 0xf5, 0xbb, 0xe5, 0xa9, 0x84, 0xa8, 0x92, 0x87, 0x79, 0x62 ],
+const [ 0x23, 0x90, 0x40, 0x39, 0x64, 0x0d, 0x48, 0xe1, 0x63, 0x67, 0x6d, 0x16, 0x19, 0x88, 0x84, 0xa8, 0x25, 0x60, 0x4b, 0xa8, 0x63, 0x29, 0xa1, 0xcd, 0xc0, 0xf0, 0xf6, 0x16, 0x4d, 0x51, 0x00, 0xb1, 0x92, 0x82, 0xaf, 0x1c, 0x24, 0x93, 0x64, 0x8a, 0x7a, 0xf3, 0x5e, 0x88, 0xfc, 0x37, 0x74, 0xe0, 0x5d, 0x17, 0x0a, 0xbe, 0x2b, 0xb9, 0x3e, 0x11, 0xa4, 0x33, 0x62, 0x34, 0xcc, 0x4b, 0xaf, 0xce ],
+const [ 0xd4, 0x47, 0x1c, 0x7f, 0x61, 0x86, 0xe8, 0xc0, 0xed, 0x3d, 0xfa, 0x2b, 0x0e, 0xf2, 0xcd, 0x18, 0x4d, 0x60, 0x41, 0xc0, 0x92, 0x1e, 0xa5, 0xfd, 0xdc, 0x7c, 0x15, 0x51, 0x35, 0xae, 0x06, 0x2a, 0xe6, 0x2c, 0x1f, 0x64, 0xe7, 0x58, 0x4b, 0x10, 0x99, 0x61, 0x0c, 0x74, 0xb7, 0x68, 0x12, 0x52, 0x8a, 0xe2, 0x0c, 0x6e, 0x5d, 0x3e, 0xbe, 0x4a, 0x31, 0xc7, 0x53, 0x34, 0xb2, 0xcb, 0xf5, 0x82 ],
+const [ 0xde, 0x6c, 0xc5, 0xa1, 0x86, 0xdc, 0x79, 0xb9, 0xe2, 0x1b, 0x05, 0x78, 0xb5, 0xac, 0x6e, 0x24, 0x40, 0xa1, 0x15, 0xe7, 0x13, 0x16, 0x2d, 0x75, 0x22, 0xfe, 0x72, 0xee, 0x1b, 0x22, 0x18, 0x06, 0xf7, 0x66, 0x02, 0x63, 0xd0, 0x4e, 0x35, 0x47, 0xf2, 0xc2, 0x8c, 0x6e, 0x34, 0x0e, 0xad, 0x3a, 0x89, 0x2d, 0x3b, 0x0d, 0xd2, 0x47, 0x4e, 0xf6, 0xf6, 0x78, 0x20, 0x91, 0x35, 0xd3, 0x09, 0x28 ],
+const [ 0x89, 0x89, 0xb2, 0x29, 0x9f, 0x9d, 0xb5, 0xa5, 0xdf, 0x02, 0x53, 0xa9, 0x7b, 0x77, 0x5c, 0x94, 0xe8, 0xe9, 0x19, 0x5a, 0xd6, 0x98, 0xe1, 0xcd, 0x65, 0x76, 0xe7, 0x1b, 0x96, 0xcf, 0x56, 0x98, 0xff, 0x2f, 0xa0, 0xbe, 0xc4, 0x81, 0x12, 0x72, 0xc2, 0x74, 0xad, 0x89, 0x0d, 0x23, 0x31, 0x8b, 0x9d, 0xf4, 0x7a, 0xb7, 0x44, 0xc0, 0x0f, 0x47, 0xe3, 0x35, 0xf9, 0xf5, 0xde, 0x79, 0xd1, 0xbd ],
+const [ 0x8f, 0x55, 0xe5, 0x3e, 0x04, 0x6e, 0x6d, 0x6d, 0x64, 0xc4, 0x46, 0x8d, 0x44, 0xaa, 0x49, 0xa4, 0xe0, 0x77, 0x42, 0xdd, 0x04, 0xd8, 0xf4, 0x81, 0x2c, 0x6b, 0x5e, 0x22, 0xea, 0x89, 0x3d, 0x1a, 0x88, 0x63, 0xd2, 0x34, 0xee, 0x50, 0xe5, 0xa8, 0xc7, 0x65, 0x0a, 0x4d, 0xe0, 0x47, 0x23, 0x0a, 0xd0, 0x3d, 0x26, 0x8d, 0xde, 0x89, 0x21, 0x40, 0x1f, 0xf9, 0x7b, 0x79, 0xdf, 0xb9, 0x7c, 0xf2 ],
+const [ 0xd5, 0xbb, 0xd2, 0xa2, 0xa5, 0x36, 0xe6, 0x20, 0x42, 0x59, 0xcb, 0xc2, 0xaa, 0x7e, 0x88, 0x45, 0x2f, 0xfc, 0x2a, 0x52, 0x70, 0x48, 0x5c, 0xb8, 0x87, 0x60, 0x38, 0xfa, 0x84, 0x69, 0x5d, 0x09, 0x1b, 0x96, 0x42, 0x52, 0x99, 0x4d, 0xca, 0xfb, 0x1c, 0x85, 0x18, 0x6a, 0x04, 0x73, 0xa4, 0x08, 0xa5, 0x65, 0x8e, 0x44, 0x3e, 0xee, 0x33, 0xda, 0x2f, 0x43, 0xff, 0x55, 0x66, 0xe5, 0x82, 0xd2 ],
+const [ 0x4c, 0x34, 0x13, 0x27, 0x86, 0x86, 0x5e, 0xbb, 0xa9, 0xbd, 0x1a, 0xa5, 0xd2, 0xd3, 0x67, 0x56, 0x37, 0x74, 0x4f, 0x7e, 0x5e, 0x61, 0x9e, 0x8a, 0x8e, 0x16, 0xf3, 0x6b, 0x84, 0xab, 0x18, 0x9a, 0x66, 0xf8, 0x8f, 0x59, 0xfd, 0xfc, 0x6d, 0x3b, 0x1e, 0x80, 0x6c, 0xe6, 0x69, 0xf7, 0x3b, 0x18, 0x37, 0xa9, 0x18, 0xe8, 0xcd, 0x10, 0xa1, 0x4f, 0xd6, 0x82, 0xe7, 0xe6, 0x10, 0x11, 0xc5, 0xf1 ],
+const [ 0xd7, 0x93, 0x11, 0x74, 0xea, 0x18, 0x8b, 0x2c, 0x8a, 0x1f, 0x04, 0x59, 0x78, 0x34, 0x65, 0x92, 0x01, 0x42, 0x83, 0xa1, 0xd2, 0x0f, 0x99, 0x2c, 0x0e, 0x06, 0xf5, 0x95, 0x9e, 0x39, 0xf1, 0x1e, 0xc9, 0xa6, 0x25, 0x51, 0x04, 0xb9, 0xdb, 0x9f, 0x0b, 0x13, 0xc3, 0x47, 0x30, 0x8a, 0xe9, 0x79, 0xf3, 0x71, 0xe3, 0xbb, 0xd4, 0x19, 0x4f, 0x8d, 0x65, 0x97, 0x7d, 0x48, 0xa3, 0xc8, 0x68, 0x4c ],
+const [ 0x45, 0x42, 0x62, 0xab, 0x05, 0xcc, 0xa5, 0x7f, 0xf0, 0x0f, 0x12, 0xd6, 0x53, 0xf0, 0x8a, 0x5e, 0x2e, 0x44, 0x1e, 0x32, 0x44, 0x93, 0xc6, 0xb8, 0x6e, 0x1b, 0x56, 0xc9, 0x34, 0x18, 0xaf, 0x13, 0x9e, 0x43, 0x32, 0xbc, 0x48, 0x99, 0x7b, 0x48, 0xb5, 0x5d, 0x4b, 0xbd, 0xe5, 0x60, 0xc5, 0x05, 0x2a, 0x80, 0xde, 0x93, 0x37, 0x6f, 0x0f, 0x4a, 0x7a, 0xb6, 0x4c, 0x9a, 0xac, 0xf9, 0x3a, 0xec ],
+const [ 0x66, 0xec, 0xea, 0x6c, 0xe6, 0x27, 0x45, 0x78, 0xae, 0x52, 0x83, 0xc8, 0xde, 0x95, 0x76, 0xf5, 0x86, 0x5a, 0x38, 0xc3, 0x21, 0xb9, 0xca, 0x3d, 0x5f, 0x33, 0xfb, 0x08, 0x28, 0xa4, 0x8b, 0xf1, 0xdd, 0x73, 0x91, 0xc8, 0xe1, 0x0c, 0x1a, 0x71, 0x58, 0x90, 0x13, 0x38, 0x2e, 0xca, 0x69, 0x65, 0x5b, 0x66, 0x6e, 0x10, 0x66, 0x5d, 0x7f, 0x37, 0x28, 0xb4, 0xe4, 0x0e, 0xd3, 0x66, 0xf7, 0x96 ],
+const [ 0xb2, 0x44, 0xd3, 0x05, 0xbf, 0xd5, 0x34, 0xde, 0x7b, 0x05, 0xb6, 0x6c, 0xda, 0x0b, 0x7b, 0xd3, 0xc2, 0x41, 0x49, 0x56, 0xb5, 0x36, 0x46, 0x11, 0xb0, 0xfe, 0xff, 0xea, 0x53, 0xcd, 0xaf, 0xc5, 0x41, 0xc5, 0xbf, 0xf7, 0xca, 0x0b, 0x89, 0xfd, 0xc8, 0x20, 0x61, 0x6f, 0xc6, 0x6f, 0xd6, 0x2f, 0x68, 0x22, 0x35, 0xe6, 0x07, 0x3a, 0x4f, 0xb1, 0x9b, 0xdf, 0x7c, 0x17, 0xde, 0xf4, 0xe0, 0x3f ],
+const [ 0xf3, 0xcb, 0x2c, 0xba, 0xaf, 0xe6, 0x28, 0x1e, 0xbb, 0x54, 0x6a, 0xf8, 0x8c, 0x05, 0x2e, 0x66, 0x58, 0xa5, 0x84, 0x07, 0xcd, 0x7b, 0xa3, 0x05, 0x02, 0x91, 0x80, 0x52, 0xae, 0x15, 0x9f, 0x31, 0x98, 0xff, 0x29, 0xf9, 0x4e, 0xf4, 0x40, 0x15, 0x1a, 0x6a, 0x8f, 0x50, 0x32, 0x0e, 0x25, 0x50, 0x2f, 0x62, 0x83, 0x5f, 0xc0, 0xab, 0xf3, 0x72, 0xa0, 0x0a, 0x1c, 0x63, 0xc5, 0xe9, 0xd4, 0x82 ],
+const [ 0x5e, 0xd9, 0x64, 0x04, 0xce, 0x1f, 0x0a, 0xe0, 0x0c, 0x32, 0xad, 0xa5, 0xf6, 0x05, 0xc1, 0x02, 0x53, 0xd5, 0xde, 0x41, 0x13, 0x5f, 0x21, 0x1b, 0xd8, 0x4f, 0xd0, 0xd1, 0xb6, 0xfb, 0x3c, 0x78, 0x37, 0x51, 0xec, 0x94, 0xa3, 0x0e, 0xf7, 0xe9, 0x7e, 0x32, 0xb2, 0x8e, 0x51, 0xb0, 0x8b, 0x43, 0xae, 0x69, 0x35, 0x04, 0x6e, 0x5b, 0x06, 0xdf, 0x3d, 0x16, 0x9d, 0x02, 0x59, 0x70, 0xc7, 0x18 ],
+const [ 0xc9, 0x26, 0x60, 0xb2, 0xf0, 0x09, 0xf4, 0x7d, 0x35, 0x89, 0xc7, 0x4e, 0x22, 0xda, 0xca, 0x9f, 0x60, 0xd0, 0x14, 0x7f, 0xce, 0xa2, 0x8e, 0x7c, 0xd0, 0xef, 0xf0, 0xc5, 0xea, 0xfe, 0xec, 0x90, 0x8d, 0x4a, 0xa8, 0xba, 0x30, 0x3e, 0x72, 0xad, 0xa3, 0x3d, 0xb0, 0x87, 0xa0, 0xe5, 0x15, 0x79, 0xa4, 0x95, 0x1b, 0x6c, 0xfc, 0x2c, 0xad, 0xeb, 0x23, 0x14, 0x23, 0x3d, 0x4b, 0x80, 0x74, 0xd1 ],
+const [ 0x2a, 0xb0, 0x4d, 0x9a, 0x3a, 0xf6, 0x59, 0x17, 0x1d, 0x80, 0x65, 0x3a, 0x1f, 0x7a, 0xb9, 0xbc, 0x64, 0x86, 0x3e, 0x6c, 0xcf, 0x0f, 0x88, 0x25, 0x23, 0xd9, 0x13, 0xfd, 0x68, 0xdd, 0xcd, 0xc0, 0x91, 0x55, 0xd5, 0x9d, 0x5b, 0x13, 0x83, 0x1e, 0x78, 0x16, 0xa8, 0x5e, 0xed, 0x5f, 0x17, 0x76, 0xb9, 0x01, 0x64, 0x38, 0xb7, 0x78, 0xeb, 0x20, 0xc5, 0x3b, 0x14, 0x87, 0x26, 0x95, 0xd6, 0x1a ],
+const [ 0x2c, 0x66, 0xbc, 0x60, 0x70, 0x7a, 0x1d, 0xa0, 0xc1, 0x94, 0xe5, 0x42, 0x2b, 0xa0, 0x22, 0xac, 0xd0, 0x49, 0xa0, 0x05, 0x8a, 0x0f, 0xb2, 0xe9, 0xd2, 0x99, 0x2e, 0x61, 0xe1, 0x4c, 0xba, 0x12, 0x14, 0x1c, 0x46, 0xb4, 0x95, 0xa2, 0xda, 0xc6, 0x38, 0x6f, 0x92, 0x80, 0xa3, 0xa1, 0xe7, 0x0a, 0xb2, 0xb4, 0x2f, 0xeb, 0x1a, 0x9a, 0x67, 0xc4, 0x4c, 0x0d, 0x31, 0x3e, 0x9c, 0x24, 0x19, 0x41 ],
+const [ 0x67, 0x85, 0x6f, 0x8f, 0x84, 0xdb, 0xa1, 0x9c, 0xb3, 0x8a, 0x23, 0xb0, 0xef, 0xad, 0x6e, 0xed, 0x22, 0x9c, 0x53, 0x6f, 0x45, 0x75, 0x3f, 0x81, 0xc8, 0xfb, 0xbe, 0x11, 0x34, 0xa4, 0x3e, 0x62, 0x0f, 0xed, 0x16, 0x01, 0x00, 0xf1, 0xc6, 0xfa, 0x33, 0x3a, 0x80, 0x4b, 0xff, 0xd7, 0xe8, 0x99, 0xc6, 0xae, 0x19, 0x22, 0x1d, 0x14, 0xe8, 0xf3, 0x2d, 0x9b, 0x6c, 0x5b, 0x59, 0x2b, 0xbe, 0x9f ],
+const [ 0xcd, 0xe3, 0x63, 0x48, 0x5e, 0x01, 0xd4, 0xd3, 0x62, 0x42, 0x66, 0x5f, 0x35, 0xa6, 0xe9, 0x10, 0xb9, 0x91, 0xfd, 0x90, 0x41, 0x21, 0x1c, 0x05, 0xad, 0xbf, 0xdb, 0x40, 0xd6, 0xf4, 0x6c, 0x37, 0x2c, 0x7e, 0x68, 0xb6, 0x9d, 0xa4, 0xcb, 0x51, 0xb9, 0xc6, 0x41, 0x9d, 0x14, 0x38, 0xa0, 0xa0, 0xec, 0x51, 0xb5, 0x85, 0x0c, 0xbe, 0x43, 0x94, 0xf0, 0x1c, 0x49, 0x62, 0x2a, 0xc7, 0x84, 0x45 ],
+const [ 0x74, 0xc6, 0xbd, 0x81, 0xed, 0x71, 0xbe, 0xba, 0xcf, 0x5f, 0x72, 0x63, 0xca, 0xd7, 0x15, 0x95, 0x1c, 0x69, 0x0a, 0xfe, 0x4c, 0xd1, 0x27, 0xe4, 0x1b, 0x1e, 0x54, 0x68, 0xb8, 0x13, 0x54, 0x08, 0x33, 0xcd, 0xe2, 0x68, 0x34, 0xa6, 0x00, 0x52, 0xed, 0x5a, 0x8c, 0xfb, 0x4d, 0x68, 0x14, 0x88, 0x76, 0xbb, 0xeb, 0xd0, 0x72, 0x8a, 0x7c, 0x64, 0x21, 0x7d, 0xdf, 0xcd, 0x76, 0x11, 0xaa, 0x14 ],
+const [ 0x18, 0xf1, 0x00, 0x73, 0xe7, 0x14, 0x22, 0xa3, 0xd2, 0x23, 0xc1, 0xa9, 0x5f, 0xdf, 0xa6, 0xf3, 0xd5, 0xc2, 0x71, 0x72, 0xf0, 0xe4, 0xec, 0x9e, 0xd9, 0x1f, 0x99, 0xbb, 0x55, 0x71, 0x8d, 0x5b, 0x3d, 0xa3, 0x81, 0x25, 0x2e, 0x28, 0x27, 0xd4, 0x81, 0x48, 0xba, 0x83, 0x7e, 0x7e, 0xd9, 0x27, 0xcc, 0x1e, 0x95, 0x5d, 0x2c, 0x3a, 0xc9, 0x66, 0x68, 0xc7, 0xaa, 0x6f, 0x85, 0xfc, 0x9e, 0x16 ],
+const [ 0xfd, 0x4e, 0x7d, 0xfc, 0x0c, 0x21, 0x46, 0x1f, 0x69, 0xfb, 0x23, 0x7f, 0xa2, 0x83, 0x37, 0x84, 0x13, 0xf1, 0xe5, 0xd2, 0x5d, 0xb7, 0xe6, 0x13, 0x14, 0x67, 0x98, 0xf6, 0xb8, 0xd1, 0x99, 0x77, 0xe7, 0x6b, 0x95, 0x62, 0xd0, 0xf7, 0x5c, 0x12, 0xeb, 0x5f, 0x38, 0x7f, 0xe8, 0xe4, 0x7d, 0x78, 0xe5, 0x77, 0x61, 0x2c, 0xe3, 0x67, 0x0e, 0xef, 0x7b, 0x3d, 0xf6, 0x3b, 0xcd, 0xe5, 0x67, 0xf5 ],
+const [ 0x02, 0x93, 0x92, 0x6e, 0x81, 0xc0, 0x51, 0xa6, 0xc0, 0x94, 0x5d, 0x25, 0x94, 0x64, 0x4b, 0x82, 0x4c, 0x10, 0x0c, 0x36, 0x8a, 0x85, 0x63, 0x47, 0x51, 0x86, 0x9c, 0x24, 0x5e, 0xad, 0x7c, 0xd0, 0xbc, 0xac, 0x74, 0x43, 0x93, 0xd9, 0x19, 0x0e, 0x41, 0xea, 0xd9, 0x3d, 0xab, 0xfc, 0xe6, 0x81, 0xd5, 0xdb, 0x77, 0x8f, 0xb1, 0x7d, 0x30, 0xc3, 0x35, 0xcf, 0xde, 0x09, 0xb0, 0xb5, 0x68, 0xfd ],
+const [ 0x75, 0xdf, 0xc0, 0xb7, 0x34, 0x04, 0x6a, 0xa2, 0xef, 0x9d, 0x82, 0xf7, 0x59, 0x62, 0x69, 0xe1, 0x00, 0x79, 0x3e, 0x52, 0x23, 0xf8, 0x53, 0xa2, 0xc3, 0xa5, 0xe1, 0x79, 0xfc, 0x00, 0xfa, 0xee, 0x96, 0x83, 0xc0, 0xf0, 0xd8, 0x28, 0xd5, 0xe5, 0x9c, 0x2c, 0x12, 0x92, 0xa9, 0x12, 0x7c, 0x3b, 0x3c, 0xec, 0x73, 0x0b, 0xe8, 0xd6, 0x2d, 0xb6, 0xa0, 0xc3, 0x63, 0x5c, 0x13, 0x7c, 0x4a, 0xb1 ],
+const [ 0x8a, 0xf2, 0xe7, 0x2e, 0xd2, 0xad, 0x3b, 0xe1, 0xe8, 0x1a, 0x21, 0xe6, 0xfc, 0xbd, 0xdf, 0xf6, 0x2d, 0x45, 0x38, 0x5b, 0xf0, 0x61, 0xed, 0x60, 0xb6, 0xd5, 0x83, 0x06, 0xc9, 0xcd, 0x47, 0xf8, 0x77, 0x71, 0x90, 0xc1, 0x73, 0xb9, 0x44, 0x3d, 0x78, 0x83, 0x9d, 0x4d, 0x2f, 0xe3, 0x2d, 0xcf, 0x53, 0xba, 0x20, 0xce, 0x13, 0x8a, 0xc2, 0xf5, 0xb8, 0x88, 0x41, 0x4a, 0x87, 0xf3, 0xb3, 0x19 ],
+const [ 0x81, 0xb7, 0xe4, 0x64, 0x79, 0x68, 0x41, 0x36, 0x8c, 0xda, 0x2c, 0xf7, 0x04, 0x80, 0x55, 0x64, 0x3e, 0x8d, 0x38, 0xde, 0xa6, 0x14, 0xab, 0xb3, 0xe3, 0x6d, 0xb3, 0x9f, 0x4e, 0xda, 0x9c, 0x93, 0xa9, 0x6a, 0x49, 0xb4, 0x0e, 0x1e, 0xc8, 0xa7, 0x25, 0x4b, 0x29, 0x0c, 0x9a, 0x3f, 0x91, 0x48, 0xce, 0x27, 0x8a, 0x88, 0xcd, 0x31, 0x9d, 0x03, 0x81, 0xed, 0x23, 0x7f, 0x25, 0xf9, 0x58, 0x16 ],
+const [ 0x8e, 0xcc, 0xd4, 0x67, 0xd8, 0x75, 0x83, 0x9c, 0xb4, 0xb0, 0xa0, 0x17, 0x0a, 0x97, 0x6f, 0x60, 0x56, 0x87, 0x68, 0x59, 0xfb, 0x24, 0x2f, 0x69, 0xd9, 0x9d, 0xc6, 0xda, 0x21, 0x32, 0x02, 0x80, 0x68, 0xf3, 0x3b, 0x9c, 0xfb, 0xca, 0x48, 0xff, 0x73, 0xbb, 0xaa, 0x73, 0x89, 0x6b, 0x08, 0x56, 0x2b, 0xdf, 0xdc, 0x88, 0xcf, 0x87, 0x6b, 0x88, 0x07, 0x7b, 0xfa, 0xd9, 0x55, 0x04, 0x3f, 0xab ],
+const [ 0xb4, 0x88, 0x33, 0x2a, 0x10, 0xf2, 0xbc, 0x7d, 0x90, 0x42, 0xa1, 0x93, 0x3d, 0xa8, 0x5d, 0xcc, 0x89, 0x25, 0x04, 0xbe, 0x3e, 0xa8, 0xd5, 0x7b, 0xb5, 0x78, 0x0f, 0x16, 0x48, 0xd1, 0x07, 0x63, 0x09, 0xd2, 0x76, 0xff, 0xb5, 0x97, 0x17, 0x90, 0xe3, 0xa2, 0x72, 0x4e, 0x81, 0x7f, 0xf2, 0xc3, 0x81, 0xa7, 0x3e, 0xce, 0xd0, 0xa6, 0xc6, 0xee, 0x88, 0x79, 0x9c, 0xbd, 0x66, 0x3a, 0x86, 0xbb ],
+const [ 0x9d, 0xcb, 0x2a, 0xc4, 0x82, 0x97, 0x9d, 0x2b, 0x4f, 0x69, 0xb8, 0x61, 0x54, 0xa6, 0x62, 0x86, 0xc1, 0x0a, 0x73, 0xdd, 0x5e, 0x8f, 0x0e, 0xcf, 0x7d, 0x90, 0x31, 0x33, 0x2e, 0x2e, 0x8a, 0xcc, 0xb1, 0xf3, 0x8d, 0x13, 0x31, 0xb5, 0xc3, 0x37, 0xaf, 0xbd, 0x65, 0x63, 0x3c, 0x29, 0x29, 0x3f, 0x6b, 0x8f, 0x5c, 0xb9, 0x06, 0xe3, 0x31, 0x05, 0x00, 0x9b, 0x59, 0xe2, 0xab, 0x10, 0xd3, 0x20 ],
+const [ 0x5f, 0x36, 0x0b, 0x2b, 0xe1, 0xb1, 0xd9, 0x47, 0x3e, 0xc7, 0x4f, 0xfe, 0x0b, 0xca, 0x45, 0x5c, 0x71, 0x50, 0xcf, 0xb2, 0xd3, 0x3e, 0x06, 0x45, 0xb1, 0x25, 0x0c, 0x43, 0xcd, 0xd2, 0x4a, 0xfb, 0x8c, 0x20, 0xfc, 0x4c, 0x9e, 0x11, 0xf0, 0x5e, 0xe1, 0x1d, 0x8a, 0x91, 0x83, 0xca, 0x0c, 0xb3, 0x68, 0x7d, 0x14, 0x76, 0xcb, 0x90, 0x67, 0x21, 0x27, 0xa4, 0xec, 0x85, 0x58, 0x39, 0xfc, 0x33 ],
+const [ 0xc0, 0x5d, 0x6b, 0x83, 0xa2, 0x7e, 0xf6, 0x5c, 0xef, 0x55, 0x71, 0x22, 0x2d, 0x24, 0xad, 0xbc, 0xc1, 0x89, 0x58, 0x64, 0x05, 0x48, 0xbc, 0x95, 0x9a, 0x4b, 0xaa, 0x2b, 0x00, 0xe7, 0xb0, 0xc6, 0x63, 0x61, 0x92, 0x6f, 0xb8, 0xb1, 0xf8, 0x7e, 0x09, 0x85, 0x65, 0xba, 0x0d, 0x89, 0x68, 0xc3, 0xfc, 0xe6, 0x16, 0xad, 0xa1, 0x08, 0xb7, 0xee, 0xb1, 0xa5, 0xc0, 0x7a, 0x5b, 0xfb, 0x02, 0x2c ],
+const [ 0x2a, 0xf1, 0x05, 0x3d, 0x2c, 0xca, 0x20, 0x40, 0x6b, 0x78, 0x14, 0xab, 0x90, 0x13, 0x67, 0x7f, 0xee, 0xae, 0xb7, 0x73, 0xad, 0xe5, 0xfb, 0x2d, 0x27, 0xb5, 0x0b, 0xb8, 0x92, 0x91, 0x63, 0x33, 0xe0, 0xb1, 0x23, 0xc6, 0xe3, 0xae, 0x5b, 0xdb, 0xb5, 0x4c, 0x86, 0x8a, 0x57, 0x96, 0x54, 0x54, 0x98, 0x31, 0xad, 0x15, 0x38, 0xea, 0xf2, 0x34, 0x4e, 0x91, 0x86, 0x1d, 0xe7, 0x0a, 0x8d, 0xf1 ],
+const [ 0x9c, 0x94, 0x45, 0xd7, 0xdf, 0x7e, 0xab, 0x77, 0xc9, 0xa5, 0xc7, 0xaf, 0xbd, 0x2f, 0x38, 0x70, 0x7d, 0x26, 0xef, 0xb8, 0x9d, 0x1d, 0x41, 0x59, 0x38, 0x17, 0x3a, 0xfc, 0xe1, 0xa4, 0x35, 0x65, 0xdc, 0x4d, 0xa9, 0xf9, 0x8f, 0x32, 0x46, 0x7d, 0x33, 0xf2, 0x41, 0x20, 0xcf, 0xcb, 0xec, 0xbc, 0x67, 0x03, 0x89, 0x59, 0x70, 0x86, 0x60, 0xf3, 0x88, 0xd0, 0x0f, 0x7d, 0x64, 0x0d, 0x22, 0x25 ],
+const [ 0x64, 0x16, 0x9f, 0xd4, 0xb7, 0xba, 0x1e, 0x5a, 0x62, 0x41, 0x2b, 0x87, 0x19, 0xa2, 0xb6, 0x22, 0xd5, 0x03, 0x1a, 0xa7, 0x77, 0xce, 0xe7, 0xf5, 0xae, 0x06, 0xe4, 0x47, 0x1a, 0xdc, 0x54, 0x65, 0xb2, 0x7d, 0x79, 0x1c, 0x63, 0x2f, 0x57, 0xeb, 0xf9, 0x9c, 0xba, 0xff, 0x43, 0x6d, 0x7a, 0x62, 0x72, 0x1b, 0xfe, 0x6f, 0xc3, 0x02, 0xff, 0x89, 0x5e, 0xb8, 0x8e, 0x0c, 0x7d, 0x9c, 0x59, 0x84 ],
+const [ 0xc4, 0x95, 0x05, 0xbe, 0x68, 0x19, 0x6b, 0xf7, 0xb8, 0x74, 0xb2, 0x53, 0x53, 0xde, 0x09, 0xd6, 0x77, 0xa8, 0x47, 0x85, 0x6a, 0x14, 0x77, 0xd5, 0x18, 0x6a, 0x94, 0x64, 0xfd, 0x48, 0x91, 0xe7, 0x45, 0x3a, 0x9c, 0x63, 0x32, 0x8a, 0xa4, 0xa1, 0xbf, 0x5a, 0x19, 0xdc, 0x83, 0xef, 0xf3, 0xbc, 0xd7, 0x50, 0xf5, 0x88, 0x3b, 0x10, 0x33, 0x97, 0xf6, 0x68, 0xd2, 0x07, 0xfd, 0x89, 0x0f, 0xb2 ],
+const [ 0x5a, 0x90, 0x5c, 0x63, 0xf9, 0x66, 0x04, 0x29, 0xac, 0x7b, 0x7b, 0xe8, 0x47, 0x66, 0xc7, 0x1b, 0xa5, 0xa4, 0x43, 0x45, 0x8f, 0xea, 0x9f, 0xe3, 0xe0, 0xba, 0x28, 0x9f, 0xe7, 0x35, 0x49, 0xc6, 0x0d, 0x30, 0x52, 0xfc, 0xb8, 0x89, 0x79, 0x2f, 0x6f, 0xbb, 0x1f, 0xc9, 0x3e, 0xb1, 0x54, 0x2a, 0x5c, 0xd8, 0x9c, 0x55, 0x0b, 0x78, 0xf3, 0xe9, 0xc0, 0x44, 0x10, 0x54, 0x84, 0x30, 0xe7, 0x43 ],
+const [ 0xc9, 0xb7, 0x4b, 0x2b, 0xa8, 0x07, 0xd6, 0x5a, 0xe6, 0x27, 0x28, 0x88, 0x2a, 0x32, 0xc4, 0xc0, 0xa0, 0xb2, 0xd9, 0x01, 0x9f, 0xb5, 0x0c, 0xed, 0x8a, 0x24, 0x77, 0xc5, 0xf4, 0x51, 0xf2, 0x95, 0x07, 0xcf, 0x91, 0xac, 0x26, 0x86, 0x6e, 0x4f, 0xd1, 0x06, 0xa8, 0xaf, 0xc9, 0x1c, 0xab, 0x18, 0x75, 0xa3, 0xb2, 0x6a, 0x85, 0x9d, 0x8b, 0xcd, 0xd5, 0x83, 0x9a, 0xa1, 0x94, 0xd9, 0x21, 0xb4 ],
+const [ 0x3a, 0xf3, 0x49, 0xf3, 0x64, 0x72, 0x18, 0xe4, 0xbe, 0x26, 0xfa, 0x86, 0x3a, 0xc7, 0x13, 0x81, 0xb6, 0x4f, 0xcc, 0xaa, 0x7e, 0x66, 0x76, 0x1e, 0x12, 0x1e, 0x30, 0x8e, 0x2a, 0xe0, 0x0a, 0xd9, 0xf8, 0xa7, 0x6a, 0xe0, 0xad, 0x6b, 0xaf, 0x96, 0x3e, 0xe1, 0x15, 0x56, 0x68, 0x61, 0xd8, 0x7a, 0xf2, 0x27, 0x9d, 0x29, 0x32, 0xbf, 0x0d, 0x70, 0xd2, 0xbb, 0xc3, 0x94, 0xd4, 0xa7, 0x68, 0xa7 ],
+const [ 0x23, 0xd9, 0x92, 0x87, 0x3b, 0x96, 0x8a, 0x51, 0x06, 0xf9, 0x5b, 0x36, 0x93, 0xe2, 0x30, 0x42, 0x0a, 0xe8, 0x19, 0xd9, 0x93, 0xa8, 0x0b, 0xa8, 0x73, 0x5d, 0x29, 0xdb, 0x78, 0xb2, 0x41, 0x90, 0x98, 0xd4, 0x9a, 0x8c, 0xd5, 0xca, 0xed, 0x2d, 0x64, 0x09, 0xb1, 0xa0, 0x0d, 0x43, 0x9b, 0x54, 0xd5, 0x81, 0x66, 0xaf, 0xdb, 0x71, 0xd0, 0xff, 0x80, 0x01, 0xe5, 0xb3, 0xca, 0x2c, 0x7f, 0xcb ],
+const [ 0x2e, 0x4a, 0x7b, 0x49, 0xeb, 0x4f, 0xf9, 0x70, 0xdc, 0x93, 0x2c, 0x15, 0x6e, 0x9a, 0x1a, 0x7b, 0xe9, 0x61, 0x62, 0x17, 0x00, 0x9c, 0x6f, 0xf2, 0xa7, 0x42, 0xf1, 0x4f, 0x24, 0x4b, 0x8e, 0x8e, 0x69, 0xb9, 0xd4, 0x50, 0xa1, 0xd5, 0x73, 0xdc, 0x09, 0xbb, 0xa9, 0xc1, 0x01, 0x18, 0xfd, 0xbd, 0x63, 0x33, 0x30, 0xde, 0x13, 0x2a, 0x71, 0xe7, 0xd7, 0x7e, 0xd0, 0xf5, 0x69, 0xd2, 0xf5, 0x62 ],
+const [ 0xbb, 0xfc, 0x60, 0xad, 0x85, 0x31, 0x42, 0xbe, 0x6f, 0x60, 0x2f, 0xd1, 0xee, 0xf9, 0x5f, 0x88, 0x2f, 0x47, 0x89, 0x15, 0xaa, 0xad, 0x0e, 0xa0, 0xfa, 0x2f, 0x75, 0xe8, 0xec, 0x33, 0x17, 0x2e, 0xd6, 0x89, 0x1b, 0x4f, 0x2a, 0xaa, 0xa5, 0x30, 0x4a, 0x3d, 0x4b, 0x5e, 0x9e, 0xe0, 0xc9, 0xf6, 0xe5, 0x24, 0xf5, 0xc3, 0xc8, 0xd9, 0xf5, 0xa7, 0xb5, 0x8d, 0xaf, 0x3c, 0xea, 0x4f, 0x81, 0xba ],
+const [ 0xb9, 0x57, 0x5f, 0x4d, 0x5e, 0xcc, 0x0f, 0x4f, 0x62, 0xe4, 0xa0, 0x55, 0x6b, 0xb8, 0x94, 0x64, 0xba, 0x97, 0xd4, 0x57, 0x0e, 0x55, 0xac, 0xd4, 0xc5, 0xe5, 0x17, 0x7e, 0x45, 0x2a, 0x3d, 0x6c, 0x9a, 0x0b, 0x3a, 0xdb, 0x60, 0xc6, 0x21, 0x1f, 0xe4, 0x86, 0x40, 0xe0, 0x86, 0x37, 0xa6, 0x82, 0x62, 0x99, 0xe3, 0xe5, 0x2f, 0x93, 0x0f, 0x4f, 0x66, 0xcb, 0x0e, 0xa6, 0xa7, 0x73, 0x11, 0xe3 ],
+const [ 0xd2, 0x91, 0xad, 0xbf, 0x05, 0xb0, 0x65, 0x96, 0xc2, 0xf3, 0x6f, 0x41, 0xa8, 0xcd, 0x80, 0x70, 0x37, 0x0c, 0x42, 0xf6, 0x87, 0xb8, 0xa6, 0xcc, 0x3a, 0x3e, 0x7b, 0x59, 0xaf, 0xcd, 0x40, 0xf0, 0x78, 0x01, 0x36, 0x9b, 0x0f, 0xbf, 0xba, 0x17, 0xc4, 0x60, 0xd2, 0x1f, 0xfa, 0x11, 0x06, 0xee, 0x93, 0x79, 0x71, 0xff, 0xa9, 0x9d, 0x17, 0x17, 0x7f, 0x01, 0x79, 0x85, 0xb7, 0x10, 0x67, 0xa8 ],
+const [ 0x90, 0x2c, 0x2a, 0xf0, 0xd1, 0x3f, 0xb3, 0x53, 0xf1, 0x4a, 0x93, 0xea, 0xba, 0x7e, 0x8a, 0x8f, 0x76, 0x8e, 0xcc, 0xac, 0xb2, 0x64, 0xef, 0x95, 0x41, 0x14, 0x07, 0x1b, 0x84, 0x0e, 0x10, 0x5e, 0xe9, 0x97, 0x8c, 0xe2, 0xb2, 0x7a, 0x6c, 0xe5, 0xf8, 0xfa, 0x34, 0xf0, 0xef, 0x0c, 0x5b, 0xad, 0x6b, 0xc3, 0xf0, 0xf8, 0xa3, 0x0c, 0x84, 0x38, 0x35, 0x9b, 0x43, 0xf0, 0x6b, 0x25, 0x64, 0x91 ],
+const [ 0xb9, 0xf4, 0xcc, 0xde, 0x4d, 0xbc, 0x27, 0xf1, 0xe6, 0xbb, 0x0f, 0xc9, 0xe8, 0x54, 0xaa, 0x08, 0x42, 0x49, 0x02, 0x9c, 0xf3, 0x2e, 0xaa, 0xda, 0xcd, 0x1e, 0xa5, 0xd1, 0x78, 0xac, 0x83, 0xd8, 0xbb, 0x1c, 0xcd, 0x6a, 0xf7, 0xd4, 0xa3, 0x34, 0xf4, 0x0d, 0xa4, 0x6b, 0xe0, 0xce, 0x0e, 0x63, 0x95, 0x1b, 0x26, 0x5e, 0x1b, 0x6a, 0xdb, 0xa2, 0x6e, 0x56, 0xa6, 0xce, 0x81, 0x97, 0xb4, 0x6d ],
+const [ 0xa1, 0xaa, 0x03, 0x46, 0x87, 0xdd, 0xff, 0xdd, 0x65, 0x93, 0x26, 0xc6, 0xd1, 0x1f, 0x58, 0xf1, 0x45, 0x1f, 0x85, 0x24, 0xc4, 0x99, 0x6d, 0xa8, 0xc0, 0x4a, 0xaa, 0x43, 0x3c, 0x3a, 0xf1, 0x66, 0x2e, 0x94, 0x95, 0xa6, 0x27, 0xb5, 0x4c, 0x70, 0x35, 0x83, 0x36, 0xf9, 0x09, 0x00, 0x1b, 0x75, 0x55, 0x1f, 0xf5, 0x89, 0x78, 0xd6, 0xae, 0x02, 0x5d, 0x74, 0x2a, 0xc7, 0xa0, 0x35, 0x88, 0x0c ],
+const [ 0x8f, 0xc7, 0xe7, 0x19, 0xff, 0x49, 0x28, 0x46, 0xf1, 0x51, 0xbd, 0xc5, 0xf6, 0xf6, 0xed, 0x15, 0xa6, 0x45, 0x24, 0x42, 0xef, 0x42, 0xe8, 0x06, 0xac, 0x2a, 0x0f, 0x34, 0x79, 0xfb, 0x2f, 0x56, 0xc6, 0x36, 0x57, 0x95, 0x2b, 0xe4, 0xfc, 0xda, 0xfb, 0xd7, 0x36, 0x33, 0x1c, 0x32, 0x2d, 0x78, 0x16, 0x2c, 0xcd, 0x2e, 0x69, 0x10, 0xc2, 0xab, 0x24, 0x88, 0xa0, 0x7b, 0xb3, 0x1c, 0x61, 0x03 ],
+const [ 0xcd, 0x7f, 0xd6, 0xbe, 0xaf, 0x8e, 0xcd, 0xad, 0xa5, 0xa4, 0xdf, 0xb8, 0x00, 0x61, 0x7e, 0x9b, 0x5b, 0x83, 0xbf, 0x23, 0x21, 0x5a, 0x03, 0x40, 0x50, 0x7c, 0xd6, 0x5c, 0x7c, 0xb9, 0x17, 0xeb, 0x16, 0x51, 0x5a, 0x43, 0xee, 0x65, 0x8a, 0xae, 0xf7, 0xac, 0xd3, 0xbe, 0x4a, 0x67, 0xbe, 0xe1, 0x6e, 0x97, 0x9e, 0x35, 0xd7, 0x6d, 0x2c, 0x9e, 0xac, 0x02, 0x6e, 0x15, 0xce, 0x48, 0xdd, 0x43 ],
+const [ 0x56, 0x57, 0xc2, 0x29, 0x33, 0xcb, 0x8f, 0x8e, 0xe3, 0x5b, 0x3a, 0xb8, 0x21, 0xab, 0x6b, 0x01, 0xef, 0x85, 0x54, 0x25, 0x2b, 0x1e, 0xe4, 0xa3, 0x63, 0x9b, 0x3d, 0x66, 0xea, 0xd3, 0x69, 0xa5, 0x2b, 0x57, 0x48, 0x08, 0x3e, 0xb0, 0xcd, 0x0c, 0xb9, 0xe7, 0x6a, 0xa8, 0xc9, 0x4b, 0xc9, 0x31, 0x81, 0x6e, 0xbd, 0x7b, 0x71, 0x71, 0x78, 0x41, 0x7b, 0x81, 0xfe, 0xc6, 0xe2, 0xa2, 0xda, 0xbd ],
+const [ 0x58, 0x9e, 0x1c, 0x67, 0x21, 0x4c, 0x34, 0xf4, 0x38, 0x0e, 0x1b, 0xfa, 0x36, 0x29, 0xce, 0x13, 0x9b, 0x29, 0x7b, 0x3f, 0xb8, 0x31, 0x8b, 0xd9, 0xcc, 0x90, 0xe0, 0xca, 0x6d, 0x94, 0x5b, 0xfc, 0x29, 0xa3, 0xa2, 0x12, 0x6e, 0x87, 0x20, 0x56, 0xa7, 0x0a, 0x4d, 0xf2, 0xa8, 0xc3, 0x2f, 0x64, 0x4c, 0x2f, 0x21, 0x2c, 0x5c, 0x04, 0xd3, 0xc7, 0xb3, 0xc1, 0x92, 0xe1, 0xa0, 0x8a, 0xc9, 0xc7 ],
+const [ 0x95, 0xec, 0xe1, 0xc8, 0xae, 0x5e, 0x94, 0xd1, 0x6e, 0xc9, 0x98, 0x3b, 0x10, 0x89, 0xa3, 0x73, 0x95, 0xad, 0x5b, 0x1d, 0x66, 0x09, 0x16, 0xc1, 0x3c, 0x87, 0xe4, 0xc1, 0x3d, 0xbe, 0xcf, 0x8f, 0x68, 0xc6, 0x61, 0x1c, 0x32, 0x4a, 0x67, 0x94, 0x71, 0xde, 0xf5, 0x48, 0x7a, 0x93, 0xaa, 0xec, 0x86, 0xc9, 0x35, 0x02, 0x5b, 0x45, 0x18, 0x96, 0x28, 0x84, 0xac, 0x2c, 0xb0, 0x4e, 0x66, 0xf7 ],
+const [ 0x91, 0x65, 0x0e, 0xd8, 0x9a, 0xaa, 0x63, 0xa8, 0xfd, 0x43, 0x90, 0x7d, 0xaa, 0xf3, 0x98, 0x5c, 0x64, 0x04, 0xee, 0x02, 0xc2, 0x3b, 0x92, 0x77, 0x7a, 0x0b, 0x7d, 0xe6, 0xde, 0x09, 0x3f, 0xac, 0xa7, 0xa0, 0xe7, 0xaf, 0xf2, 0x06, 0x23, 0xf1, 0x88, 0x6e, 0xa8, 0x65, 0x62, 0x80, 0xd4, 0x01, 0x6d, 0x06, 0x92, 0x14, 0x8a, 0xe8, 0x7f, 0xda, 0xd9, 0x5a, 0x4b, 0x4d, 0x37, 0x54, 0x61, 0x3f ],
+const [ 0xca, 0xa2, 0xf0, 0x77, 0xc0, 0xbd, 0xe9, 0xe9, 0x8c, 0x2f, 0x54, 0xa9, 0x8c, 0xab, 0xa4, 0xa9, 0xf9, 0x5d, 0xe8, 0x0e, 0x74, 0x2b, 0xfe, 0x92, 0xe2, 0x3b, 0x03, 0x26, 0x7a, 0xb5, 0x0d, 0xdb, 0x1c, 0xca, 0x1d, 0x02, 0xe5, 0xf5, 0x4f, 0x92, 0x00, 0x80, 0x54, 0xcb, 0xbf, 0x4b, 0x22, 0x19, 0xea, 0xc9, 0xea, 0x3b, 0x57, 0x4b, 0x4b, 0xa4, 0xba, 0x81, 0xc5, 0x22, 0xbf, 0x3d, 0x70, 0xbd ],
+const [ 0xac, 0x04, 0x9e, 0x1a, 0x39, 0xd6, 0x03, 0x9c, 0xe4, 0x80, 0x41, 0x6f, 0x05, 0x8e, 0x06, 0x99, 0x5b, 0x54, 0xa2, 0x3c, 0x4d, 0x26, 0x69, 0x6b, 0x76, 0xcc, 0x58, 0x3c, 0x61, 0x30, 0xfc, 0x1f, 0x91, 0x5a, 0x90, 0x6e, 0xc5, 0x9e, 0x66, 0x45, 0x7a, 0x14, 0x88, 0x93, 0xb0, 0x49, 0x9e, 0x71, 0xf1, 0x34, 0x12, 0xb3, 0x90, 0x6c, 0x73, 0xbd, 0x2f, 0x98, 0x17, 0x99, 0x83, 0x26, 0x05, 0x46 ],
+const [ 0x82, 0xc1, 0x6c, 0x68, 0xec, 0xa5, 0x9a, 0x92, 0x98, 0x69, 0x38, 0x36, 0x6d, 0xe6, 0x0c, 0x16, 0xf6, 0x0c, 0x98, 0xbd, 0x66, 0xd4, 0x3e, 0x10, 0xd9, 0x75, 0xa8, 0x26, 0xdc, 0xdb, 0x67, 0x59, 0x30, 0x55, 0xda, 0x9d, 0xcb, 0x8e, 0x52, 0x11, 0x20, 0xbe, 0x73, 0xd4, 0xa0, 0x21, 0xde, 0x1a, 0x81, 0xa9, 0x0d, 0x7f, 0xbe, 0xf0, 0x7d, 0x9b, 0x5f, 0x70, 0x13, 0xd6, 0xfa, 0xf6, 0xb9, 0x7d ],
+const [ 0xe2, 0x62, 0xa7, 0x38, 0x5a, 0xa3, 0x28, 0x2c, 0x5d, 0x42, 0x98, 0x37, 0x6a, 0xcd, 0x1b, 0x7b, 0x6c, 0x97, 0x8b, 0x02, 0x9a, 0x0c, 0x75, 0xac, 0x9c, 0x41, 0x65, 0x6c, 0xef, 0xd0, 0x64, 0xb4, 0x8a, 0xe2, 0xbe, 0x2e, 0xc2, 0x8d, 0x09, 0xad, 0x6b, 0x61, 0x62, 0x63, 0x40, 0x3d, 0xfa, 0x54, 0x85, 0x67, 0xd2, 0x0a, 0xea, 0xdc, 0xc2, 0x8b, 0xb3, 0xe5, 0xc0, 0x88, 0x16, 0xeb, 0x5f, 0xd7 ],
+const [ 0x15, 0x0d, 0x3a, 0xa3, 0x09, 0xa3, 0x66, 0x9a, 0xf9, 0x9a, 0x70, 0xf2, 0xce, 0xc5, 0x2d, 0x3d, 0xa1, 0x6b, 0x1c, 0x13, 0x7f, 0xf7, 0x46, 0x62, 0x69, 0xf2, 0x68, 0x05, 0x9f, 0x2f, 0x54, 0x98, 0x1f, 0x45, 0x95, 0x8b, 0x68, 0x42, 0x52, 0x76, 0x83, 0x9e, 0x75, 0xac, 0x44, 0x6e, 0x0b, 0x13, 0xce, 0xda, 0xee, 0x33, 0x55, 0xd1, 0xa2, 0x8c, 0x28, 0xfc, 0x7e, 0x2d, 0xee, 0xf0, 0x0c, 0x82, 0x2f, 0xa7, 0xb2, 0x6e, 0x17, 0x31 ],
+const [ 0xc9, 0xc8, 0xb8, 0x91, 0xb8, 0x25, 0x67, 0x75, 0x7d, 0xbf, 0x1a, 0x15, 0xb3, 0x17, 0x62, 0x8d, 0x98, 0xc4, 0x86, 0xdb, 0xbe, 0x5e, 0xd4, 0xe6, 0x04, 0x9a, 0x35, 0xbf, 0xc5, 0xb6, 0x04, 0x26, 0x4f, 0x18, 0x20, 0x50, 0x97, 0x32, 0x40, 0xe7, 0x2b, 0xa8, 0x87, 0x53, 0x67, 0xb5, 0x59, 0x38, 0xec, 0xcb, 0x6c, 0x3f, 0x4e, 0x79, 0x22, 0x1a, 0x0d, 0x92, 0x16, 0xc2, 0xc7, 0x8c, 0xf4, 0x03, 0xab, 0x26, 0x8f, 0x3b, 0x31, 0x4d ],
+const [ 0xf3, 0xca, 0x2d, 0xbf, 0x8a, 0x94, 0x69, 0x7d, 0x35, 0x1f, 0x5f, 0x18, 0x32, 0x07, 0x49, 0xae, 0xae, 0x13, 0xe6, 0xd5, 0x7e, 0x15, 0xcd, 0x98, 0x0f, 0x12, 0x01, 0xbd, 0xa0, 0xa3, 0xc5, 0x4a, 0xae, 0x9b, 0xb2, 0x47, 0xb0, 0xea, 0x06, 0xc4, 0x05, 0xc2, 0x3f, 0x1e, 0x2b, 0xf8, 0xe9, 0x7f, 0x31, 0xac, 0xb4, 0xa4, 0x6f, 0x2c, 0xc9, 0xe3, 0x74, 0x16, 0x5e, 0x6c, 0x40, 0xbd, 0x88, 0xcf, 0xb4, 0xce, 0x51, 0xbe, 0x46, 0x34 ],
+const [ 0xe5, 0x52, 0xf4, 0xff, 0xf6, 0xf6, 0xbb, 0xd1, 0x4e, 0xc5, 0x0a, 0xee, 0x19, 0x49, 0x14, 0x52, 0xac, 0x91, 0x7a, 0xa3, 0x6a, 0x83, 0x5a, 0x1f, 0xe8, 0x74, 0x88, 0xd3, 0x4f, 0xf6, 0x1b, 0x0d, 0x02, 0xf1, 0x2c, 0x15, 0x81, 0xf6, 0xda, 0x18, 0x8e, 0xcf, 0x91, 0x65, 0x8e, 0x5b, 0x8d, 0xdc, 0x31, 0x99, 0x99, 0xa2, 0x55, 0x02, 0x1d, 0x1a, 0x28, 0x1c, 0x57, 0x11, 0x8d, 0x4c, 0xe9, 0x39, 0xc2, 0xeb, 0x94, 0xd9, 0x3f, 0x9d ],
+const [ 0x9d, 0x42, 0x19, 0xed, 0x56, 0x9e, 0xb3, 0x5a, 0x9f, 0x55, 0x13, 0xeb, 0x1b, 0x93, 0x88, 0x42, 0x37, 0x1a, 0x99, 0x58, 0x56, 0xda, 0x49, 0xb8, 0x2b, 0xc2, 0x99, 0xeb, 0x65, 0xd7, 0x4f, 0x33, 0x92, 0x83, 0xf6, 0x7c, 0x3d, 0x2f, 0x26, 0x8f, 0x5a, 0x14, 0x05, 0x89, 0xe5, 0x4d, 0x0e, 0x8b, 0xc5, 0x31, 0x11, 0xb4, 0xf6, 0xe1, 0x7b, 0x4c, 0xe7, 0x1d, 0xd8, 0x42, 0x21, 0x5c, 0x96, 0xd9, 0x2a, 0x1b, 0x0c, 0x9e, 0xa9, 0x75 ],
+const [ 0x4e, 0x1a, 0xcb, 0x25, 0xc4, 0x12, 0x16, 0xf4, 0x8b, 0x66, 0x62, 0x73, 0x20, 0xab, 0xc5, 0xf5, 0xe0, 0xdd, 0x1a, 0x74, 0x27, 0xf5, 0x48, 0xcb, 0xba, 0xb9, 0xc8, 0x25, 0x62, 0xd8, 0x61, 0xb6, 0xda, 0x36, 0x36, 0xa9, 0xeb, 0x85, 0x03, 0x59, 0xd6, 0x15, 0xa4, 0xc3, 0xf2, 0xed, 0xd7, 0x3c, 0x96, 0x1a, 0x42, 0x5f, 0x39, 0x47, 0xb8, 0x4a, 0xd8, 0x8e, 0xb8, 0x0a, 0x99, 0x8e, 0x36, 0x53, 0xad, 0xbe, 0x9e, 0x74, 0x7a, 0x00 ],
+const [ 0x4f, 0x04, 0x7d, 0x37, 0xc6, 0x53, 0xac, 0x94, 0x34, 0xb9, 0xac, 0x3e, 0x79, 0x62, 0x88, 0x64, 0x17, 0x9a, 0xee, 0x4f, 0x44, 0x8e, 0xe0, 0x44, 0x3d, 0x57, 0xad, 0xac, 0xdc, 0x34, 0x20, 0x72, 0x6d, 0x17, 0xf7, 0xad, 0xbe, 0x64, 0x96, 0x7f, 0x75, 0xf5, 0xfd, 0x3c, 0xa6, 0x61, 0xf8, 0xcf, 0xa5, 0x7e, 0x95, 0x5a, 0x19, 0x24, 0xdb, 0x1d, 0x52, 0x34, 0xb9, 0x99, 0xdd, 0xd9, 0x3d, 0xf5, 0x55, 0x0e, 0x07, 0xa0, 0x7b, 0x61 ],
+const [ 0x22, 0x32, 0x98, 0x12, 0x51, 0x7b, 0x7a, 0x7a, 0x31, 0xd3, 0xcb, 0xbe, 0x04, 0xc3, 0x00, 0x4e, 0x07, 0xe6, 0x5a, 0x36, 0xa3, 0x4a, 0xbc, 0xa4, 0xe7, 0x1a, 0xba, 0xa4, 0x36, 0x7a, 0xf2, 0x2f, 0x3d, 0xb3, 0x9f, 0x64, 0x28, 0x90, 0x6b, 0x15, 0x16, 0x08, 0x85, 0x85, 0xca, 0x1c, 0xf4, 0x70, 0xa3, 0x03, 0x2b, 0x4c, 0xce, 0x85, 0xdd, 0xcf, 0xba, 0xa5, 0x12, 0xb1, 0xcc, 0x82, 0x7b, 0xb3, 0x55, 0x7f, 0x02, 0xe0, 0xc1, 0xa2 ],
+const [ 0x09, 0xe5, 0xe3, 0x26, 0xd7, 0xc2, 0xb5, 0xb1, 0x73, 0x81, 0x09, 0x49, 0x33, 0xea, 0x11, 0xa5, 0x03, 0x0c, 0x36, 0xd9, 0xb8, 0x39, 0x0d, 0x7b, 0xa1, 0x51, 0x87, 0x04, 0x5f, 0x44, 0x68, 0x7a, 0xf7, 0xd2, 0xfa, 0x4c, 0x26, 0x95, 0x02, 0x7e, 0xf5, 0x42, 0xf3, 0x05, 0x8c, 0x2c, 0x62, 0x75, 0x4b, 0x09, 0xba, 0xd9, 0x17, 0xf9, 0x31, 0xe2, 0xf2, 0xc4, 0xfa, 0x45, 0xcf, 0x63, 0xbc, 0x5e, 0xa4, 0xc3, 0x44, 0x19, 0xc0, 0xc5 ],
+const [ 0x25, 0xff, 0x10, 0xf4, 0x31, 0x2e, 0xcc, 0x23, 0xb4, 0xaf, 0x65, 0x3f, 0xef, 0x94, 0x3c, 0x72, 0x72, 0xf9, 0x84, 0x70, 0x31, 0xd1, 0xf9, 0x59, 0xda, 0xe5, 0xcf, 0xe1, 0x66, 0x19, 0xe9, 0xae, 0xef, 0xf1, 0x4c, 0x02, 0xc1, 0x55, 0xd3, 0x99, 0xb3, 0x91, 0x24, 0xd5, 0xb8, 0xa0, 0xe2, 0x18, 0xb1, 0xaa, 0x25, 0x71, 0x85, 0xcb, 0x27, 0x7c, 0x74, 0x16, 0x40, 0x83, 0xa8, 0xda, 0x14, 0xe9, 0x0d, 0x23, 0x0b, 0xc9, 0x63, 0x84 ],
+const [ 0x81, 0x16, 0x8b, 0x80, 0xd7, 0x9f, 0x8d, 0xde, 0xcb, 0xd9, 0xe4, 0x11, 0xcc, 0x41, 0xa2, 0x2e, 0xb0, 0x2b, 0x63, 0xb3, 0x04, 0xbe, 0x3b, 0xb5, 0xa1, 0x40, 0xed, 0x3b, 0x80, 0x94, 0x5e, 0xe5, 0xd0, 0x00, 0x49, 0xd1, 0x45, 0x34, 0x33, 0xbe, 0xb2, 0x88, 0xa2, 0x72, 0xda, 0x86, 0x8a, 0x5a, 0x84, 0xa8, 0x08, 0x71, 0xcd, 0x62, 0x52, 0x62, 0xc2, 0x63, 0xef, 0xf1, 0x2e, 0x19, 0x23, 0x97, 0xb1, 0x73, 0xae, 0x6c, 0x12, 0xea ],
+const [ 0xc6, 0xc9, 0xfd, 0x57, 0x57, 0x59, 0xc0, 0xf6, 0x01, 0x0e, 0xcb, 0x93, 0x2f, 0xb2, 0x95, 0x59, 0xb5, 0xdc, 0x24, 0xc3, 0x6e, 0x09, 0xd3, 0x54, 0x23, 0xee, 0x52, 0x89, 0xaf, 0x0d, 0xee, 0x0c, 0x61, 0x87, 0x13, 0x2a, 0xa2, 0x31, 0x0f, 0x87, 0xd8, 0xe9, 0x18, 0x10, 0x8a, 0x2b, 0x91, 0x32, 0xc4, 0xdf, 0x89, 0x49, 0xbd, 0x75, 0x85, 0x5c, 0xb7, 0x34, 0x7f, 0x07, 0x27, 0xcf, 0x2e, 0xb8, 0x16, 0x3a, 0x88, 0x1f, 0xc7, 0xbb ],
+const [ 0x56, 0x0d, 0x76, 0xc1, 0xbd, 0xde, 0x2e, 0x56, 0xff, 0x54, 0x56, 0x7d, 0xf6, 0x71, 0x3e, 0x4e, 0x24, 0x3c, 0x1a, 0x42, 0xf7, 0xfe, 0x62, 0xfd, 0x4b, 0xb1, 0x78, 0x6a, 0x31, 0xb6, 0x8c, 0x0d, 0xef, 0xc6, 0xbd, 0x95, 0x48, 0x2b, 0x80, 0xb1, 0xfd, 0x30, 0x46, 0x25, 0x93, 0xd6, 0x59, 0x1d, 0x57, 0xc8, 0x07, 0xc1, 0xa0, 0x91, 0x03, 0x09, 0x54, 0x0d, 0x08, 0xd3, 0xad, 0x1d, 0xbf, 0x33, 0x3d, 0x9f, 0xe3, 0x0a, 0x30, 0x9e ],
+const [ 0xa1, 0x93, 0xb5, 0x58, 0x89, 0x1e, 0x94, 0x7e, 0x0e, 0xe7, 0x6f, 0x91, 0x2a, 0xd5, 0x1c, 0x60, 0x7c, 0xdb, 0x59, 0xff, 0xe0, 0x33, 0x05, 0x21, 0x43, 0xe7, 0x90, 0xc9, 0xb6, 0x96, 0xb0, 0x22, 0xc0, 0x75, 0x55, 0xaa, 0xf9, 0x94, 0xe0, 0x96, 0xd4, 0x63, 0x8f, 0x73, 0xbd, 0x74, 0x3c, 0x09, 0x64, 0x82, 0x48, 0x84, 0x58, 0xb3, 0xd2, 0xd6, 0xd7, 0x1a, 0x2c, 0x57, 0xe5, 0x80, 0x8f, 0xae, 0x9b, 0x64, 0x0d, 0xf5, 0xc2, 0x40 ],
+const [ 0xdc, 0x98, 0x6d, 0x3d, 0x92, 0x36, 0x8e, 0x2a, 0x19, 0xf4, 0x9b, 0x6e, 0x53, 0x7a, 0xaf, 0x84, 0x5a, 0xcb, 0xce, 0x31, 0x71, 0x6c, 0x79, 0xc4, 0x3a, 0xc8, 0x80, 0x9d, 0x29, 0xd3, 0x18, 0xec, 0x38, 0xee, 0x2d, 0xbb, 0xdc, 0x0b, 0xfa, 0x2f, 0x38, 0x11, 0xd6, 0x0a, 0x91, 0x82, 0x51, 0x75, 0x03, 0x5b, 0x7f, 0xfd, 0x72, 0x3b, 0x94, 0xdb, 0xc3, 0xc8, 0xb1, 0x78, 0x4b, 0x4e, 0xfe, 0x30, 0x87, 0xaa, 0xf9, 0x56, 0x0e, 0x67 ],
+const [ 0x08, 0x6d, 0x40, 0xb5, 0xbb, 0xe7, 0x5d, 0xfa, 0x59, 0x05, 0x54, 0x5f, 0x83, 0xbc, 0xd5, 0x2d, 0x71, 0x2f, 0x09, 0x2f, 0xce, 0x2c, 0x0f, 0x5c, 0xc9, 0xfa, 0xac, 0xb5, 0x69, 0x52, 0x3e, 0x71, 0x20, 0xab, 0xf2, 0x58, 0xa4, 0xbb, 0x37, 0x6d, 0xfa, 0x3a, 0x73, 0xcf, 0xd3, 0xe9, 0xf4, 0xe1, 0x1c, 0xd3, 0x29, 0xa9, 0xd1, 0xd2, 0x12, 0x76, 0x12, 0x56, 0xf5, 0xc6, 0x78, 0x62, 0x53, 0x66, 0xa9, 0xd7, 0x1a, 0xdb, 0x2a, 0xf5 ],
+const [ 0x57, 0x44, 0x61, 0x8f, 0xe8, 0xe5, 0xc1, 0xe4, 0xca, 0xd9, 0x5c, 0xf4, 0x35, 0x05, 0xcc, 0x03, 0x2d, 0xf1, 0xcf, 0xe5, 0x04, 0x34, 0xed, 0x13, 0x20, 0x2d, 0x5b, 0xfe, 0xfe, 0xf4, 0x20, 0xa3, 0x77, 0x90, 0x76, 0x60, 0x42, 0x6b, 0x73, 0x06, 0xbb, 0x03, 0xe8, 0x2f, 0xe2, 0xe1, 0x8a, 0xd2, 0xa7, 0xcf, 0x4f, 0x14, 0x65, 0x46, 0x1b, 0x61, 0xac, 0x26, 0x9c, 0xbc, 0x43, 0xa9, 0x72, 0x53, 0x6d, 0x9a, 0x94, 0x57, 0x6c, 0xc2 ],
+const [ 0x61, 0x54, 0xb5, 0xd6, 0xd2, 0x33, 0xc4, 0xe6, 0x30, 0xb4, 0xb2, 0x09, 0x41, 0x55, 0x95, 0x4e, 0xe6, 0x3f, 0x80, 0xcb, 0xf4, 0xcc, 0xfa, 0x3d, 0x40, 0x47, 0xaf, 0xee, 0xf9, 0xf3, 0x66, 0xdc, 0x3b, 0x4e, 0x33, 0x17, 0xe0, 0x96, 0xee, 0x6b, 0x9a, 0x8d, 0xe3, 0x3f, 0x3f, 0x7a, 0xcb, 0xbd, 0x63, 0x70, 0xfc, 0x33, 0x2c, 0xd2, 0xdc, 0xb9, 0x62, 0x17, 0x9b, 0x15, 0xc6, 0xcb, 0x22, 0xdb, 0xa5, 0xd6, 0x46, 0xd9, 0xac, 0x01 ],
+const [ 0x1e, 0x86, 0x02, 0xe3, 0xf3, 0xa1, 0x2b, 0x3f, 0x9a, 0xb2, 0x1c, 0x3a, 0x7a, 0xdd, 0x7f, 0xa9, 0xa5, 0x38, 0x1e, 0xff, 0x4f, 0x74, 0xf5, 0x13, 0x85, 0xc0, 0x8c, 0x23, 0x1c, 0xea, 0x84, 0x18, 0xe7, 0xc7, 0x6f, 0x0b, 0x2d, 0xd6, 0xe5, 0x09, 0x59, 0x20, 0xd4, 0x13, 0xf4, 0x62, 0x17, 0x69, 0xd1, 0x6e, 0x4a, 0x09, 0x87, 0xcf, 0xdd, 0x72, 0x24, 0xac, 0x68, 0xad, 0x20, 0xef, 0x3e, 0x8e, 0x90, 0xa5, 0x45, 0x38, 0x9c, 0xa8 ],
+const [ 0xca, 0xa2, 0xf0, 0x77, 0xc0, 0xbd, 0xe9, 0xe9, 0x8c, 0x2f, 0x54, 0xa9, 0x8c, 0xab, 0xa4, 0xa9, 0xf9, 0x5d, 0xe8, 0x0e, 0x74, 0x2b, 0xfe, 0x92, 0xe2, 0x3b, 0x03, 0x26, 0x7a, 0xb5, 0x0d, 0xdb, 0x1c, 0xca, 0x1d, 0x02, 0xe5, 0xf5, 0x4f, 0x92, 0x00, 0x80, 0x54, 0xcb, 0xbf, 0x4b, 0x22, 0x19, 0xea, 0xc9, 0xea, 0x3b, 0x57, 0x4b, 0x4b, 0xa4, 0xba, 0x81, 0xc5, 0x22, 0xbf, 0x3d, 0x70, 0xbd, 0x56, 0x7b, 0xee, 0xe2, 0x4e, 0x9f ],
+const [ 0x12, 0x14, 0x5f, 0xf8, 0x72, 0x25, 0xda, 0xbf, 0xb7, 0xc8, 0xdc, 0x37, 0x0e, 0xc6, 0x1b, 0x16, 0xe6, 0x21, 0x9c, 0x14, 0xa4, 0xfb, 0x10, 0xf2, 0x98, 0xb4, 0x64, 0xbb, 0x30, 0x53, 0x94, 0x4a, 0x6c, 0x27, 0xc0, 0x0c, 0x92, 0xae, 0x81, 0x07, 0x23, 0xb5, 0x7d, 0x1b, 0x0d, 0xc1, 0x39, 0x88, 0x22, 0xae, 0x2f, 0xb1, 0xc9, 0x96, 0x21, 0x20, 0xf4, 0xf4, 0xac, 0xc9, 0x52, 0x09, 0x20, 0x93, 0xc5, 0x7f, 0x8f, 0x14, 0x16, 0x4d ],
+const [ 0x49, 0x55, 0x39, 0xa6, 0x81, 0x41, 0xfc, 0x09, 0x93, 0x93, 0xad, 0x40, 0x55, 0x5a, 0x70, 0xeb, 0xb4, 0x5e, 0x3d, 0x37, 0xf9, 0x57, 0x3f, 0xb1, 0x4b, 0x5c, 0x7a, 0x5c, 0x75, 0x9e, 0xb1, 0x00, 0xea, 0x56, 0x87, 0xc6, 0x06, 0xfc, 0xe4, 0x02, 0x97, 0xba, 0x9a, 0x50, 0x9c, 0x20, 0x49, 0xe2, 0x4d, 0x19, 0x80, 0x18, 0x5b, 0x1e, 0x24, 0x51, 0x78, 0xa9, 0x16, 0x02, 0x1a, 0xed, 0x10, 0x05, 0x7c, 0xc4, 0xd0, 0x33, 0xe6, 0xe9 ],
+const [ 0x38, 0x7c, 0xa5, 0x7d, 0x6c, 0xea, 0x7e, 0xce, 0x2a, 0xdf, 0x50, 0x7e, 0xe4, 0x97, 0xbb, 0xc1, 0xcd, 0x04, 0x3b, 0x32, 0xe3, 0xc0, 0x4d, 0x6b, 0x2d, 0x45, 0xd4, 0xd3, 0x41, 0x60, 0xba, 0xb8, 0x0a, 0xe3, 0xda, 0x9e, 0xc8, 0x9b, 0x1e, 0xd6, 0x58, 0x81, 0xe4, 0x52, 0xb6, 0x34, 0xa7, 0xb7, 0xc0, 0xa7, 0xdb, 0xb4, 0x3d, 0x17, 0x18, 0x93, 0x1d, 0x41, 0x7b, 0x0d, 0x02, 0xd1, 0x4a, 0x63, 0x00, 0x1d, 0xd6, 0xaa, 0xa1, 0x13 ],
+const [ 0xbf, 0x15, 0x12, 0x50, 0x68, 0x58, 0xd2, 0xb3, 0x8e, 0x38, 0x7a, 0x1e, 0x65, 0xaa, 0x81, 0x3b, 0xc1, 0xc1, 0xf6, 0xe6, 0xd9, 0x6a, 0x6a, 0x86, 0x4b, 0x59, 0x09, 0x9e, 0x61, 0x43, 0x0a, 0x9f, 0x93, 0x4e, 0x4a, 0x01, 0x4d, 0xc6, 0x33, 0x91, 0xf2, 0x11, 0xe3, 0x0d, 0x20, 0xe5, 0x8a, 0xee, 0x36, 0xb8, 0x14, 0x85, 0x13, 0x78, 0x09, 0x49, 0x21, 0x7d, 0xb1, 0x70, 0x93, 0xbc, 0x7b, 0xbc, 0xea, 0x3d, 0x9f, 0x98, 0xbe, 0xcf ],
+const [ 0x33, 0x2c, 0x02, 0x2c, 0xd7, 0xcd, 0xbb, 0x71, 0xfc, 0xc3, 0xea, 0xf4, 0x86, 0x35, 0xa8, 0xbb, 0x6e, 0x03, 0xe7, 0x3f, 0x5c, 0x08, 0xa9, 0xcd, 0x79, 0x9c, 0x70, 0x2d, 0x7e, 0x5d, 0xf5, 0x82, 0x12, 0x30, 0x1c, 0x71, 0x52, 0x82, 0x28, 0x85, 0xb1, 0xd4, 0x2b, 0xd2, 0x02, 0x76, 0xc1, 0xd9, 0xd3, 0x92, 0xfe, 0xac, 0xfd, 0x6d, 0xa5, 0x53, 0x79, 0xea, 0x9b, 0x6d, 0x75, 0x50, 0x9b, 0x1a, 0xa7, 0x4c, 0x2a, 0x19, 0xe2, 0x3a ],
+const [ 0xae, 0x1b, 0xa7, 0x36, 0xe2, 0x06, 0x91, 0xbc, 0xc3, 0x49, 0x5b, 0xe8, 0xe4, 0x38, 0xd9, 0xcd, 0x5a, 0xa4, 0x69, 0xde, 0x20, 0xac, 0x7c, 0x5d, 0xba, 0xd7, 0x53, 0x16, 0x19, 0x60, 0x07, 0x4c, 0xbf, 0xd1, 0xcc, 0xf4, 0x23, 0xd3, 0x76, 0x21, 0x57, 0x45, 0x3d, 0xc0, 0xe8, 0x8b, 0xbd, 0x85, 0x06, 0x29, 0x41, 0x25, 0xe4, 0x90, 0x40, 0xc6, 0x62, 0x37, 0x28, 0xb3, 0xea, 0xee, 0x5b, 0x55, 0x97, 0x70, 0x77, 0x5f, 0x9d, 0x37 ],
+const [ 0x25, 0x11, 0x77, 0x74, 0xde, 0xaf, 0x7c, 0x06, 0x8c, 0xbd, 0x4c, 0xe8, 0x2a, 0x59, 0x5a, 0x58, 0x4e, 0xcc, 0x9d, 0xfd, 0x54, 0x1a, 0xd8, 0x1e, 0xb9, 0xd7, 0x1f, 0x12, 0xc5, 0x3b, 0x97, 0xf7, 0x6d, 0x79, 0x7d, 0xa7, 0x77, 0x4d, 0x6a, 0xe8, 0xdf, 0xd4, 0xd5, 0xe3, 0x7a, 0xa1, 0xd9, 0xd8, 0xd9, 0x0d, 0x38, 0x0f, 0x70, 0xce, 0xa1, 0x12, 0xf7, 0xcc, 0x2e, 0x19, 0x11, 0x30, 0x31, 0xc6, 0x2c, 0xbd, 0x30, 0x12, 0xa8, 0x63 ],
+const [ 0xaa, 0xc2, 0x32, 0x2f, 0xfd, 0x2e, 0xfa, 0xeb, 0xcc, 0xf8, 0x38, 0x9e, 0xab, 0xb3, 0x41, 0x1a, 0xb5, 0x5f, 0x21, 0x08, 0x7d, 0x90, 0x32, 0x2c, 0x48, 0xcc, 0xee, 0xeb, 0x79, 0x34, 0x02, 0x0a, 0x4c, 0x66, 0xa3, 0xb8, 0xc7, 0xa3, 0x25, 0xcf, 0xee, 0x2d, 0xca, 0x57, 0x37, 0xf3, 0xd8, 0x4c, 0x3d, 0x70, 0xee, 0xa0, 0xb8, 0xd1, 0x97, 0x84, 0xad, 0x56, 0x20, 0xe4, 0xe2, 0xfa, 0xa7, 0x30, 0x95, 0x56, 0x75, 0x62, 0x6d, 0xc3 ],
+const [ 0x10, 0x0b, 0xd0, 0x0e, 0x9c, 0x4c, 0x9f, 0x2b, 0xec, 0xae, 0xc6, 0x14, 0x56, 0x40, 0xe5, 0x7d, 0x13, 0x63, 0xa9, 0xe8, 0xe8, 0xdc, 0x95, 0x61, 0x06, 0x27, 0x02, 0x6c, 0x30, 0x0e, 0x64, 0x3c, 0x1b, 0x7b, 0xd0, 0x25, 0x1a, 0x8b, 0xbb, 0x54, 0xfb, 0xe3, 0x05, 0xbe, 0x2b, 0x47, 0x36, 0x56, 0x21, 0x69, 0x07, 0x83, 0xfa, 0xfe, 0x24, 0xd1, 0x61, 0x17, 0x30, 0xe7, 0xb2, 0xaf, 0x09, 0xb9, 0x5f, 0x80, 0x4e, 0xfe, 0x92, 0x1c ],
+const [ 0xe0, 0x1b, 0x54, 0xdf, 0xce, 0xbf, 0x64, 0xfd, 0xc6, 0x1b, 0xc0, 0xd9, 0xa4, 0x6f, 0x38, 0x50, 0xdb, 0x32, 0xf7, 0x35, 0x09, 0x58, 0xb6, 0xab, 0xcf, 0xd1, 0x30, 0xd1, 0xdf, 0x52, 0xd6, 0xa5, 0x56, 0x57, 0xc3, 0x22, 0x4d, 0x69, 0xf2, 0xac, 0xaa, 0x9c, 0xaf, 0xae, 0x3c, 0x5d, 0x4b, 0x82, 0x08, 0x6a, 0x14, 0x91, 0xdd, 0x22, 0x84, 0xbb, 0x2f, 0xff, 0xb9, 0xf9, 0x22, 0x61, 0x25, 0x40, 0xe4, 0x8d, 0x87, 0xa9, 0x40, 0xf5 ],
+const [ 0x4a, 0x25, 0xe3, 0xa8, 0x8e, 0xae, 0x86, 0x48, 0x51, 0xb4, 0xc6, 0xd0, 0x1c, 0x6b, 0x98, 0xb7, 0x99, 0xa7, 0x0f, 0x0c, 0xa4, 0x9f, 0x18, 0x60, 0xa4, 0xf1, 0x67, 0xdf, 0x1c, 0xe7, 0xb1, 0xc0, 0x7d, 0xf9, 0x1c, 0xe0, 0x3f, 0x93, 0xf4, 0xa9, 0x2f, 0x18, 0x9f, 0x39, 0x0b, 0x26, 0xd3, 0xc0, 0x4c, 0x1c, 0x06, 0x2a, 0x43, 0xd9, 0x26, 0xff, 0x67, 0xc7, 0x8b, 0x87, 0xee, 0x19, 0x2a, 0x31, 0x9a, 0x50, 0x0b, 0x35, 0xd6, 0x04 ],
+const [ 0x13, 0xe8, 0xb6, 0x56, 0x8b, 0x1d, 0x83, 0xee, 0x06, 0x23, 0x52, 0x23, 0xca, 0xf6, 0xbe, 0x6e, 0x76, 0x89, 0x7f, 0xfc, 0x95, 0x0a, 0x9a, 0x0f, 0x74, 0x68, 0xd5, 0xa2, 0x31, 0x13, 0x6e, 0x4c, 0x15, 0x03, 0x0c, 0x66, 0x23, 0xfb, 0xf6, 0x70, 0xf1, 0x0f, 0x83, 0xb1, 0xb7, 0x64, 0xd2, 0x1e, 0xa6, 0x37, 0xba, 0x7d, 0x7b, 0x20, 0x04, 0xca, 0x53, 0x98, 0xd8, 0xda, 0xc1, 0xba, 0x76, 0x3e, 0x1e, 0x46, 0x27, 0x6a, 0x20, 0xeb ],
+const [ 0x58, 0x3e, 0x7b, 0x26, 0x71, 0x56, 0x47, 0xc6, 0xc5, 0x04, 0x82, 0x86, 0x6f, 0x84, 0xc9, 0xa0, 0x97, 0xef, 0x1f, 0x1b, 0xf4, 0xb1, 0x8e, 0xe4, 0x8e, 0x3e, 0x11, 0x20, 0xc9, 0x01, 0xb2, 0xc1, 0x9f, 0x95, 0xf0, 0x57, 0x2d, 0x38, 0x63, 0x29, 0x71, 0x7d, 0xa3, 0x85, 0x52, 0x41, 0x65, 0x54, 0xe0, 0xdf, 0xe7, 0xf1, 0xde, 0xa8, 0x8f, 0x3c, 0x7e, 0x8d, 0xcf, 0xea, 0x6b, 0x1f, 0x4b, 0x1f, 0x0c, 0xba, 0x3e, 0x3e, 0x08, 0xfc ],
+const [ 0x38, 0x1d, 0xfe, 0x5c, 0x34, 0x05, 0xf0, 0xc6, 0x72, 0x16, 0xa3, 0x44, 0x75, 0xd4, 0x53, 0xaf, 0x05, 0xf8, 0xae, 0x8f, 0xd4, 0x7b, 0x92, 0xd5, 0x61, 0xf1, 0x19, 0xcd, 0x1d, 0x18, 0xd3, 0x4e, 0xcd, 0xb1, 0x52, 0x34, 0x2f, 0x8e, 0xec, 0x0f, 0xe0, 0xed, 0xbc, 0x1d, 0x7d, 0x04, 0xea, 0x76, 0x08, 0xdd, 0x2c, 0x87, 0x8e, 0x64, 0x8d, 0xc1, 0x07, 0xbf, 0x6e, 0x92, 0x7e, 0xdd, 0xca, 0x95, 0x72, 0x52, 0xbe, 0x06, 0x7b, 0x62 ],
+const [ 0x77, 0x26, 0x19, 0xf0, 0x48, 0xd8, 0xcf, 0xa9, 0xcb, 0x84, 0x6e, 0x1a, 0xc8, 0xde, 0xb0, 0xab, 0x56, 0xb0, 0x02, 0x9e, 0xff, 0x70, 0xd0, 0x44, 0x1f, 0x18, 0x02, 0x71, 0x8d, 0x32, 0xc7, 0x2d, 0x7d, 0x32, 0x91, 0xac, 0xa5, 0x09, 0x61, 0x81, 0x9f, 0xf7, 0x44, 0x0e, 0x8f, 0xa1, 0x1d, 0x3f, 0x05, 0x63, 0xa6, 0x78, 0x25, 0xe7, 0xb2, 0xcb, 0x05, 0xf7, 0xb5, 0x6f, 0x56, 0x8f, 0x85, 0x6d, 0x47, 0x37, 0x62, 0x9d, 0xa6, 0x8f ],
+const [ 0xf3, 0x9a, 0xdc, 0xa2, 0x1f, 0xf0, 0x93, 0x96, 0x39, 0xff, 0x8d, 0x6d, 0xa2, 0x36, 0xd5, 0x19, 0x57, 0x2d, 0xe9, 0x2a, 0x74, 0x23, 0x64, 0xe7, 0xf7, 0xaa, 0xda, 0x9e, 0xc7, 0xa1, 0x04, 0x38, 0xf5, 0x63, 0x1d, 0x10, 0x41, 0x3e, 0x8b, 0x06, 0xe0, 0x27, 0xc2, 0xcf, 0x7c, 0xab, 0x66, 0x8f, 0x7d, 0x29, 0xaf, 0xa9, 0x87, 0x3f, 0x12, 0xd5, 0x43, 0x82, 0x1e, 0x74, 0x63, 0x72, 0xa4, 0x21, 0xe0, 0xad, 0x1a, 0x89, 0x86, 0x62 ],
+const [ 0xcf, 0x20, 0xea, 0xca, 0x22, 0x1a, 0x64, 0x66, 0x75, 0xf6, 0x96, 0xc2, 0xc9, 0xff, 0xab, 0x2c, 0xca, 0x83, 0xcd, 0xfa, 0x01, 0x35, 0xf4, 0x15, 0x4a, 0xd0, 0xfb, 0xb4, 0x89, 0xfd, 0xf9, 0x6a, 0x99, 0x77, 0xce, 0x63, 0x85, 0x6d, 0xfc, 0xeb, 0xfb, 0x28, 0xb9, 0x2f, 0xfd, 0xed, 0x42, 0x48, 0xda, 0x25, 0x71, 0x75, 0x5d, 0xbb, 0x92, 0xa8, 0x44, 0xc6, 0x73, 0x45, 0xf3, 0x68, 0xba, 0x26, 0x6a, 0xf5, 0x7b, 0xe2, 0x75, 0x58 ],
+const [ 0x8c, 0x26, 0xd9, 0xe7, 0x39, 0xfe, 0xf0, 0x07, 0xec, 0xf4, 0x26, 0x61, 0x2f, 0x74, 0x08, 0xda, 0xa6, 0xa8, 0xe4, 0x1a, 0xaa, 0x91, 0x8b, 0x3e, 0x33, 0x57, 0x55, 0xcd, 0xfb, 0xdd, 0x66, 0xee, 0xe0, 0x99, 0x30, 0xd8, 0x8a, 0xa3, 0x39, 0x89, 0x4f, 0x0b, 0x1e, 0xbb, 0x53, 0x70, 0xd9, 0x14, 0xf4, 0xce, 0x3f, 0x9d, 0x65, 0x98, 0xcc, 0x75, 0x98, 0x07, 0xa3, 0xc7, 0x62, 0xb1, 0xd1, 0xf9, 0xda, 0x5d, 0xd2, 0x26, 0x02, 0x16 ],
+const [ 0xf1, 0xe9, 0x5a, 0x2a, 0xc2, 0x98, 0x2a, 0x63, 0x58, 0x4a, 0xf1, 0xb7, 0xaa, 0xb0, 0xee, 0x73, 0x9b, 0xac, 0xcc, 0xaa, 0xc5, 0x05, 0x81, 0x87, 0x75, 0x5e, 0x77, 0xe1, 0xf6, 0x69, 0xe9, 0x10, 0x13, 0x58, 0x91, 0xff, 0xd7, 0x94, 0x80, 0x83, 0x97, 0xb2, 0x4d, 0xeb, 0x33, 0xa3, 0x71, 0xd9, 0x98, 0x2a, 0xf2, 0x50, 0x89, 0x93, 0x3f, 0x0d, 0xa0, 0xa3, 0x5b, 0x1b, 0x8f, 0xcb, 0x3e, 0xa2, 0xac, 0xa0, 0x79, 0x00, 0xad, 0x90 ],
+const [ 0x4c, 0x16, 0x24, 0xa9, 0x40, 0x76, 0x97, 0xdd, 0x3f, 0xeb, 0x1b, 0xdd, 0xd4, 0xa9, 0xad, 0x07, 0xf9, 0x90, 0x39, 0xe1, 0x2d, 0xf3, 0x56, 0xfd, 0xc6, 0x9d, 0x30, 0x20, 0x89, 0x16, 0xc5, 0xa2, 0x78, 0x22, 0x55, 0x18, 0xeb, 0x8b, 0x13, 0x31, 0xe2, 0x20, 0x21, 0xde, 0x9a, 0xfe, 0xbb, 0xb6, 0x5e, 0x0e, 0xb3, 0x98, 0xa0, 0xcf, 0x1d, 0x92, 0x48, 0x56, 0x4b, 0x01, 0x4c, 0x93, 0xfc, 0xfa, 0x81, 0xd5, 0xd0, 0xe9, 0xb1, 0x90 ],
+const [ 0x05, 0x31, 0xb9, 0x2d, 0x1b, 0x21, 0x8c, 0x08, 0xcd, 0x86, 0x30, 0xdd, 0x48, 0x61, 0xf7, 0xc8, 0x0a, 0xce, 0xd6, 0xf7, 0x5d, 0x7e, 0x0d, 0xb8, 0x1e, 0x67, 0x0a, 0xd6, 0xc3, 0xba, 0x8b, 0x26, 0x9d, 0x16, 0x04, 0x5d, 0x59, 0xfb, 0x40, 0x24, 0xcd, 0x81, 0x4a, 0x6f, 0xf2, 0x4a, 0x8e, 0x0a, 0x2c, 0xb5, 0x3c, 0x74, 0xd2, 0x54, 0xed, 0xf1, 0xea, 0xa1, 0x89, 0xdb, 0x34, 0xec, 0x68, 0x39, 0x6b, 0x98, 0xb7, 0x93, 0xc7, 0x87 ],
+const [ 0xec, 0xd2, 0x9c, 0xbb, 0x1a, 0x39, 0xd7, 0xfd, 0xbc, 0x5c, 0x92, 0xa0, 0x96, 0xc0, 0xce, 0xf1, 0xd4, 0xb2, 0x36, 0x3e, 0x9e, 0x89, 0x55, 0x37, 0xec, 0x2b, 0x07, 0x9a, 0x9c, 0xd3, 0x2d, 0x10, 0xc2, 0x11, 0xa5, 0x52, 0x3f, 0x12, 0x7a, 0x8f, 0x95, 0x21, 0x57, 0x12, 0xf9, 0x6e, 0x42, 0x20, 0xaa, 0x0e, 0x86, 0x1f, 0x82, 0x44, 0xf1, 0xfe, 0xca, 0xff, 0x40, 0xd0, 0x53, 0xa3, 0xd8, 0xba, 0xc2, 0x0c, 0xb7, 0x10, 0x2c, 0xd1 ],
+const [ 0xf5, 0x4e, 0x51, 0x4e, 0xb7, 0x0f, 0x39, 0x57, 0x9c, 0x9f, 0x17, 0x5a, 0xfd, 0x7c, 0xbd, 0xf1, 0xde, 0x2f, 0xdf, 0x10, 0x2b, 0x82, 0x76, 0xe0, 0x42, 0xee, 0x63, 0xca, 0xb2, 0x53, 0x55, 0xd1, 0x42, 0xec, 0xec, 0x26, 0x36, 0x81, 0x1f, 0xf6, 0xcd, 0xde, 0xdb, 0x87, 0x0e, 0x85, 0xec, 0x83, 0xc4, 0xa0, 0x21, 0x94, 0xc8, 0x39, 0xab, 0x30, 0x7e, 0xad, 0xc7, 0xb7, 0xa2, 0x5e, 0x9d, 0xbb, 0x45, 0xa9, 0x67, 0x9e, 0x12, 0x18 ],
+const [ 0xe8, 0x80, 0x06, 0x36, 0x49, 0x55, 0xd8, 0x11, 0x0c, 0x55, 0x3f, 0xdf, 0xd5, 0x9d, 0xb9, 0xba, 0xaa, 0x31, 0x0a, 0xe5, 0x0f, 0x90, 0x81, 0x02, 0x6f, 0x8b, 0x7e, 0x85, 0xbe, 0x56, 0x31, 0x68, 0x5d, 0xe0, 0xa4, 0x21, 0x3e, 0x60, 0xfc, 0xd1, 0x48, 0x30, 0xfc, 0xbe, 0xfd, 0xdf, 0xca, 0x03, 0x5a, 0x82, 0xf6, 0x86, 0xfe, 0x4a, 0xb8, 0x2b, 0x8f, 0x5c, 0x79, 0x47, 0x5a, 0xdc, 0x95, 0x58, 0x39, 0x4b, 0x60, 0xf3, 0xba, 0x14 ],
+const [ 0xde, 0xca, 0x6c, 0xc2, 0xbe, 0xc0, 0x06, 0xc1, 0x9a, 0xe4, 0xb3, 0xb2, 0x24, 0x6f, 0xd6, 0x36, 0x08, 0xac, 0xa2, 0x8b, 0x22, 0x5a, 0xe8, 0x0b, 0xee, 0x52, 0x2d, 0xf5, 0x40, 0x6a, 0x00, 0x70, 0x35, 0x98, 0x8b, 0xcd, 0x69, 0x5b, 0x67, 0x0d, 0x6a, 0x56, 0xb5, 0xa3, 0x6d, 0x3e, 0x6a, 0x7b, 0x40, 0xf7, 0xea, 0x3a, 0x80, 0xfa, 0xd9, 0xc8, 0x0c, 0xfa, 0x2d, 0x0c, 0xb9, 0xc7, 0x88, 0xf6, 0x48, 0x72, 0xc6, 0xc3, 0x95, 0xb2 ],
+const [ 0xf0, 0xda, 0xe6, 0xd8, 0x75, 0x30, 0x76, 0xb1, 0x89, 0x5c, 0x01, 0x26, 0x2c, 0xa9, 0xb5, 0x76, 0x33, 0xeb, 0x28, 0xb3, 0xf9, 0x63, 0xa7, 0xc7, 0x52, 0xe2, 0xcb, 0xb4, 0xc0, 0x31, 0x4c, 0x20, 0xea, 0xb1, 0x1a, 0x10, 0x49, 0x3f, 0xaa, 0xf4, 0x25, 0x5a, 0x8e, 0xe4, 0xc0, 0x88, 0x49, 0x29, 0xd1, 0xf5, 0x61, 0xff, 0x33, 0x5e, 0xb6, 0x99, 0xdf, 0x2d, 0x11, 0x66, 0x18, 0xe6, 0x00, 0x93, 0xe5, 0xc1, 0xe2, 0xd1, 0xc4, 0x99 ],
+const [ 0x65, 0xaf, 0x1f, 0x17, 0xcd, 0x7f, 0xda, 0xa5, 0x23, 0xb9, 0xb7, 0xa9, 0x82, 0x9d, 0x49, 0x7c, 0xac, 0x73, 0x03, 0xd4, 0x50, 0xc5, 0x9e, 0x98, 0x88, 0xcb, 0xba, 0xf3, 0xa6, 0x27, 0xc8, 0xa8, 0x30, 0xd3, 0x27, 0xa5, 0x29, 0x57, 0x8d, 0xda, 0x92, 0x3f, 0xa9, 0x4b, 0x31, 0xcc, 0x07, 0x64, 0x91, 0xea, 0x33, 0x8d, 0x4a, 0x62, 0x21, 0xff, 0x82, 0x51, 0xcc, 0xd6, 0xb4, 0xd9, 0x1e, 0x67, 0xb1, 0x16, 0x10, 0xd3, 0xe4, 0x53 ],
+const [ 0x53, 0x8b, 0x4a, 0x47, 0x53, 0x18, 0x3c, 0xe5, 0x60, 0x7f, 0xa0, 0x36, 0x36, 0xdb, 0x2f, 0xdc, 0x84, 0x72, 0x2a, 0xeb, 0x9d, 0x98, 0xa6, 0xed, 0x70, 0xd0, 0x28, 0x2a, 0xba, 0x35, 0x71, 0x26, 0x7a, 0x18, 0x9b, 0x6a, 0xa6, 0xeb, 0x65, 0x87, 0x1c, 0x5d, 0xcc, 0x59, 0xdb, 0xc7, 0xdb, 0x89, 0x73, 0xc7, 0xc3, 0x55, 0xba, 0x2a, 0x2e, 0x94, 0xc1, 0x10, 0xd1, 0xf4, 0x06, 0x4a, 0x40, 0x87, 0xeb, 0x07, 0x07, 0x7e, 0x67, 0xb0 ],
+const [ 0x1e, 0x79, 0x82, 0xd0, 0x97, 0x5b, 0x36, 0xda, 0x41, 0x44, 0x04, 0x1f, 0xac, 0x9a, 0x7f, 0x70, 0xb4, 0xd5, 0x18, 0x0b, 0xed, 0x48, 0x9f, 0x11, 0x45, 0x3e, 0x07, 0x3b, 0xe4, 0x49, 0x6a, 0xc9, 0x57, 0xd7, 0x4c, 0xbc, 0xee, 0x06, 0x24, 0x45, 0x62, 0xba, 0x19, 0x7d, 0xbb, 0xec, 0x09, 0x56, 0x71, 0x45, 0xcf, 0xd2, 0xd2, 0xeb, 0xc6, 0x73, 0xa3, 0x9b, 0x89, 0xf2, 0x0a, 0xf8, 0xfd, 0x34, 0xac, 0x22, 0x92, 0x79, 0x12, 0x8b ],
+const [ 0xff, 0x5f, 0x9f, 0xb0, 0x3f, 0xc1, 0x5b, 0x21, 0x43, 0xef, 0x63, 0x8b, 0xba, 0xac, 0x07, 0x55, 0x7d, 0x3e, 0xfd, 0xa9, 0x20, 0xbb, 0x9b, 0xd5, 0xc6, 0x83, 0x49, 0xf1, 0x3a, 0x0e, 0x37, 0xc2, 0x3c, 0xe8, 0x4b, 0xdf, 0x19, 0xf9, 0x5e, 0x12, 0x7f, 0x0a, 0xa7, 0x01, 0x8e, 0x85, 0x77, 0x0e, 0x32, 0x7c, 0x27, 0x7b, 0xb1, 0xed, 0x4f, 0xd2, 0x80, 0x45, 0x39, 0x84, 0x5b, 0x22, 0x96, 0xd0, 0x94, 0x5d, 0x6f, 0xe6, 0xac, 0x48 ],
+const [ 0x06, 0xec, 0x0e, 0x5b, 0xc8, 0x33, 0xca, 0xaf, 0x76, 0x6f, 0x8a, 0x53, 0x1b, 0x09, 0x62, 0x1c, 0x0c, 0x93, 0xe8, 0x59, 0x28, 0x01, 0x96, 0xac, 0x5f, 0x16, 0x6f, 0x18, 0x71, 0x1c, 0xe5, 0x5a, 0xf8, 0xd8, 0xfb, 0x7d, 0xa9, 0xbd, 0xa7, 0xa9, 0xd7, 0x60, 0x7a, 0x3c, 0x38, 0x2c, 0x82, 0x1b, 0xec, 0x57, 0x70, 0x4b, 0xbb, 0x14, 0xf6, 0xbb, 0x9f, 0x0b, 0x73, 0x64, 0x82, 0x06, 0xd2, 0x94, 0x48, 0xed, 0xaf, 0x87, 0x10, 0xf4 ],
+const [ 0xa5, 0x20, 0x69, 0xd0, 0x8c, 0x72, 0x9e, 0xec, 0x3f, 0x80, 0x3d, 0xf6, 0xad, 0xcf, 0xc5, 0x3c, 0x7e, 0xb6, 0x45, 0x65, 0x49, 0xbf, 0x29, 0xfa, 0x08, 0x4f, 0x54, 0x25, 0xc9, 0x8a, 0x6f, 0xb8, 0xa6, 0x71, 0x80, 0x70, 0xf6, 0x4d, 0xbe, 0x7c, 0xc5, 0x51, 0xa4, 0x39, 0x82, 0x7b, 0x44, 0x40, 0xf8, 0xbb, 0xde, 0xa2, 0x80, 0x57, 0xb1, 0x72, 0x74, 0x8e, 0x11, 0x84, 0xe6, 0x7c, 0xba, 0x75, 0x92, 0x3d, 0x64, 0xeb, 0x12, 0x55 ],
+const [ 0x5a, 0x04, 0x58, 0x58, 0x91, 0xa5, 0xdd, 0xc9, 0x7a, 0x7c, 0xe8, 0x3b, 0xab, 0x92, 0xeb, 0xa5, 0x51, 0x33, 0x90, 0x5c, 0x7f, 0xf4, 0xaa, 0x34, 0xc5, 0xf5, 0x6b, 0xe8, 0x05, 0x64, 0xd7, 0xbc, 0x82, 0x42, 0x78, 0x60, 0x3a, 0x6a, 0x54, 0x18, 0x76, 0xcf, 0x1c, 0x1a, 0x9f, 0x05, 0xa6, 0x37, 0x53, 0x03, 0x9d, 0xbe, 0xb8, 0x27, 0x78, 0x9e, 0x10, 0x7a, 0xa8, 0xca, 0x8e, 0x36, 0x16, 0xe2, 0x68, 0x85, 0xcc, 0x0f, 0x2e, 0x8c ],
+const [ 0xd5, 0xed, 0x1c, 0xda, 0xae, 0x3e, 0xda, 0xcf, 0x80, 0xee, 0x94, 0x87, 0xeb, 0x31, 0x7d, 0xf4, 0x6b, 0xa2, 0x93, 0xb0, 0x7d, 0xdb, 0xdd, 0x35, 0x04, 0x43, 0xf1, 0x50, 0xea, 0x28, 0xba, 0xd3, 0x0a, 0x0e, 0x78, 0x8b, 0x4e, 0x46, 0x08, 0x71, 0x14, 0xc2, 0x66, 0x24, 0xd7, 0x27, 0x70, 0x97, 0x0b, 0x24, 0xed, 0x07, 0x48, 0x03, 0xcd, 0x31, 0xab, 0x7d, 0xb2, 0xc1, 0x7a, 0xd3, 0xb0, 0x0d, 0x06, 0x1a, 0x51, 0x03, 0xd6, 0xd6 ],
+const [ 0x9f, 0xc0, 0x5e, 0xf4, 0x95, 0x79, 0xaa, 0xef, 0x45, 0xc0, 0x05, 0x86, 0xc8, 0xa3, 0x5d, 0xc0, 0x96, 0x05, 0x13, 0x48, 0x3e, 0x89, 0x51, 0x71, 0x5b, 0xb2, 0x9e, 0x77, 0xc3, 0x48, 0xaf, 0x08, 0x01, 0xfd, 0x80, 0x02, 0x06, 0x50, 0xa4, 0x7f, 0x1b, 0xb2, 0xda, 0x0f, 0x1a, 0xe7, 0xe0, 0x44, 0xde, 0xb0, 0x8c, 0x74, 0xf8, 0xa7, 0x18, 0xba, 0xa3, 0x6a, 0xbe, 0x3e, 0xfb, 0xfb, 0x84, 0xb6, 0x69, 0x67, 0x5a, 0x2d, 0x62, 0xa6 ],
+const [ 0x3e, 0x3b, 0x57, 0x7a, 0x9c, 0xc8, 0x00, 0xd2, 0xdc, 0x69, 0x36, 0x28, 0x37, 0x87, 0x8d, 0x4f, 0x7e, 0xc0, 0xfb, 0xf3, 0xfe, 0x3a, 0xe0, 0x8a, 0xa6, 0x37, 0x45, 0x88, 0x6c, 0xea, 0x61, 0xd2, 0xec, 0x8a, 0x62, 0x76, 0x52, 0xa4, 0x6a, 0x99, 0x7b, 0xb5, 0xd7, 0xb1, 0x57, 0xf8, 0xc7, 0xf4, 0x92, 0x7d, 0xdb, 0x0f, 0x73, 0x7b, 0x3c, 0x1c, 0x04, 0xe7, 0xdc, 0xce, 0x73, 0x45, 0xff, 0xef, 0xb8, 0xbf, 0xf9, 0x0d, 0x78, 0x74 ],
+const [ 0x98, 0xfd, 0xfe, 0x9b, 0x59, 0x10, 0x08, 0xfa, 0x03, 0xfc, 0xc4, 0x80, 0x80, 0x94, 0x10, 0xa5, 0x3a, 0x2a, 0x41, 0x75, 0xde, 0x48, 0x0d, 0xe3, 0x60, 0xa1, 0xa9, 0x5f, 0x3f, 0x46, 0x2e, 0xab, 0x0a, 0x1d, 0x41, 0xea, 0x23, 0x90, 0xf3, 0xfa, 0xc3, 0x82, 0xe6, 0x03, 0x3e, 0x87, 0xb2, 0x50, 0x88, 0x54, 0x86, 0x5e, 0xf8, 0x74, 0x13, 0x33, 0x4d, 0x3d, 0xa5, 0xf1, 0xef, 0x03, 0x93, 0xab, 0x77, 0x8b, 0xda, 0x77, 0x70, 0xc2 ],
+const [ 0x74, 0xc6, 0xbd, 0x81, 0xed, 0x71, 0xbe, 0xba, 0xcf, 0x5f, 0x72, 0x63, 0xca, 0xd7, 0x15, 0x95, 0x1c, 0x69, 0x0a, 0xfe, 0x4c, 0xd1, 0x27, 0xe4, 0x1b, 0x1e, 0x54, 0x68, 0xb8, 0x13, 0x54, 0x08, 0x33, 0xcd, 0xe2, 0x68, 0x34, 0xa6, 0x00, 0x52, 0xed, 0x5a, 0x8c, 0xfb, 0x4d, 0x68, 0x14, 0x88, 0x76, 0xbb, 0xeb, 0xd0, 0x72, 0x8a, 0x7c, 0x64, 0x21, 0x7d, 0xdf, 0xcd, 0x76, 0x11, 0xaa, 0x14, 0xe3, 0x3d, 0x0a, 0x88, 0x12, 0x56 ],
+const [ 0xce, 0xa6, 0x53, 0x20, 0xf0, 0xca, 0x8d, 0xc1, 0x60, 0xc5, 0xff, 0x83, 0x10, 0x0e, 0x52, 0x3a, 0x16, 0xb7, 0x65, 0x1d, 0x5e, 0x4d, 0x9c, 0xca, 0x9c, 0x00, 0x7b, 0x8b, 0x85, 0x03, 0x73, 0xd8, 0x3f, 0x36, 0xfb, 0x1d, 0x16, 0x03, 0xe3, 0xbd, 0x70, 0x85, 0xe5, 0x56, 0x03, 0xf0, 0x7e, 0x47, 0x45, 0x2d, 0xfc, 0x6f, 0x24, 0xc4, 0xd7, 0x38, 0xf8, 0xff, 0x44, 0xd4, 0xb6, 0x4d, 0x08, 0xc7, 0x66, 0xe4, 0x8a, 0xa6, 0xd7, 0xaa ],
+const [ 0x31, 0x47, 0x43, 0x43, 0x5c, 0xf8, 0xe0, 0xa1, 0xe1, 0xc4, 0xa3, 0x21, 0x43, 0x3b, 0xaf, 0xec, 0x55, 0xec, 0x26, 0x2d, 0xe7, 0x7a, 0xeb, 0xc5, 0xa4, 0xf3, 0xad, 0x3f, 0x3b, 0x5e, 0x21, 0x06, 0xbd, 0x93, 0x8e, 0xd5, 0x46, 0x50, 0x8f, 0x70, 0xe0, 0x88, 0x15, 0x92, 0xa4, 0xfe, 0xab, 0x26, 0x23, 0x13, 0xfe, 0xb9, 0x04, 0xdc, 0x9c, 0x30, 0xee, 0x78, 0xfc, 0xb6, 0xa8, 0xa1, 0xbf, 0xf9, 0x7e, 0x80, 0x35, 0x96, 0xe7, 0xc6 ],
+const [ 0x13, 0xfb, 0x1e, 0xd6, 0x38, 0x9f, 0x32, 0xd1, 0xde, 0x31, 0x39, 0xcb, 0x04, 0xbc, 0xdd, 0x53, 0x52, 0x5c, 0x98, 0x89, 0xb8, 0x53, 0x79, 0xd3, 0x53, 0x5a, 0x25, 0xd2, 0x90, 0x35, 0x1c, 0x95, 0x93, 0x8a, 0x3d, 0x0c, 0xda, 0xf3, 0x8d, 0xbf, 0x1d, 0x52, 0x34, 0xbf, 0x79, 0x65, 0xc8, 0xdd, 0xce, 0x9a, 0xce, 0x1b, 0x66, 0x24, 0x7e, 0x60, 0xd7, 0x4e, 0xc7, 0x70, 0x2a, 0x0f, 0x93, 0x1a, 0x3c, 0xdf, 0x4c, 0xb4, 0x65, 0xca, 0x9f, 0xc4, 0x58, 0xc3, 0x80, 0x00, 0x4a, 0x3a, 0x6e, 0x79 ],
+const [ 0x5c, 0xf5, 0x9e, 0x34, 0xf1, 0xae, 0x4e, 0xd7, 0x32, 0xa9, 0x5c, 0xee, 0x65, 0xeb, 0x49, 0x4c, 0x1f, 0x7e, 0x89, 0xe1, 0xa2, 0x72, 0x7c, 0xde, 0x68, 0x22, 0x9f, 0x1a, 0x00, 0xb9, 0x04, 0xb5, 0x19, 0xf4, 0xff, 0xfb, 0xdd, 0x29, 0x23, 0x8b, 0x80, 0x88, 0x6c, 0xb8, 0x18, 0xa1, 0xbe, 0x2f, 0xaf, 0x26, 0x8e, 0xda, 0x96, 0xf2, 0xdf, 0x05, 0xfd, 0x4b, 0x71, 0xc0, 0xc1, 0x64, 0x35, 0x84, 0x85, 0x26, 0x03, 0x19, 0x04, 0x30, 0x8f, 0xb6, 0xa5, 0x1d, 0x9a, 0x6b, 0x51, 0x05, 0x65, 0xbc ],
+const [ 0x90, 0x9d, 0x38, 0x91, 0xb6, 0xa5, 0xef, 0x3c, 0x81, 0x21, 0x28, 0xcc, 0x63, 0x07, 0x11, 0x86, 0x1b, 0x6e, 0x73, 0xdc, 0xe4, 0xf2, 0x89, 0xef, 0xec, 0x5a, 0x12, 0x52, 0x07, 0x78, 0xa5, 0x11, 0xa5, 0x51, 0x45, 0xf2, 0x02, 0x7e, 0x35, 0xfa, 0x9c, 0xd2, 0x0d, 0x33, 0xea, 0x3d, 0x0e, 0xad, 0x4b, 0xf0, 0xb3, 0xc3, 0x3d, 0xc2, 0x88, 0x9f, 0xcf, 0xd3, 0x3f, 0x01, 0x59, 0x6f, 0x01, 0x3b, 0x6a, 0x35, 0x02, 0x81, 0x02, 0x78, 0x58, 0x5f, 0x01, 0xe5, 0x0d, 0x8b, 0xe0, 0x66, 0x73, 0xdd ],
+const [ 0xb5, 0x1e, 0xc0, 0x38, 0xea, 0xf0, 0x3b, 0x3a, 0xce, 0xcf, 0x40, 0x7f, 0x43, 0xe2, 0xf0, 0xf4, 0x96, 0x15, 0x16, 0x85, 0x0f, 0x5e, 0x5d, 0x87, 0xc6, 0x45, 0xc1, 0x53, 0xb9, 0xa3, 0x44, 0x34, 0x1c, 0xaa, 0xe2, 0x84, 0xf0, 0x25, 0xc6, 0x11, 0xd7, 0x01, 0xbe, 0xc6, 0x27, 0x0d, 0xed, 0x87, 0x3d, 0xfe, 0xc0, 0x5c, 0x14, 0xb6, 0x23, 0xd2, 0x16, 0xc6, 0xf4, 0x9e, 0x31, 0x31, 0xb7, 0x84, 0x2e, 0x73, 0x8c, 0x77, 0x3e, 0xc1, 0x5f, 0x02, 0xd6, 0x93, 0x5f, 0xe6, 0xbd, 0x60, 0xb1, 0x05 ],
+const [ 0xd4, 0xc8, 0x92, 0xac, 0xa8, 0xc9, 0x57, 0x4a, 0x48, 0xb7, 0x61, 0xf3, 0x3f, 0x44, 0xaa, 0x86, 0x7b, 0xf0, 0xc6, 0x1a, 0x49, 0x29, 0x73, 0x42, 0x80, 0xb7, 0x72, 0x90, 0xfb, 0x57, 0x95, 0x57, 0x4d, 0xa6, 0x1a, 0xb5, 0xb1, 0x41, 0x37, 0xd1, 0x40, 0x2b, 0xf6, 0x62, 0x67, 0x6f, 0x43, 0x71, 0x97, 0x06, 0x43, 0x5f, 0x3e, 0xfa, 0xe8, 0x29, 0xf7, 0xcc, 0xc3, 0xeb, 0xfd, 0x14, 0x19, 0xa3, 0xe6, 0x67, 0x38, 0x38, 0x8e, 0x7d, 0x0b, 0xbb, 0x51, 0x93, 0xed, 0xec, 0x7d, 0x0f, 0xbb, 0x00 ],
+const [ 0xb6, 0x29, 0x4d, 0x16, 0x0b, 0x6d, 0xf3, 0x0f, 0xa4, 0x54, 0x6b, 0x63, 0xae, 0x64, 0xef, 0xfc, 0xbc, 0xf7, 0x44, 0x15, 0x69, 0x49, 0x84, 0xf1, 0x3e, 0xcf, 0x21, 0xcc, 0xd6, 0xca, 0x27, 0x12, 0x3f, 0x1d, 0xc1, 0xcf, 0xa4, 0x5b, 0xff, 0x66, 0x29, 0x25, 0xd6, 0x87, 0x17, 0xb3, 0x69, 0x5b, 0x39, 0xb0, 0x86, 0x01, 0x86, 0x4b, 0x74, 0x3e, 0xff, 0x8b, 0xec, 0x70, 0xdb, 0xe2, 0x65, 0xc4, 0xe2, 0x06, 0x95, 0xa9, 0x17, 0xfc, 0x34, 0x85, 0x99, 0x75, 0x03, 0xa6, 0xcb, 0x5e, 0x0d, 0x7b ],
+const [ 0x3b, 0x1c, 0xbf, 0x6f, 0x42, 0x12, 0xf6, 0xbf, 0xb9, 0xbc, 0x10, 0x6d, 0xfb, 0x55, 0x68, 0x39, 0x56, 0x43, 0xde, 0x58, 0xbf, 0xfa, 0x27, 0x74, 0xc3, 0x1e, 0x67, 0xf5, 0xc1, 0xe7, 0x01, 0x7f, 0x57, 0xca, 0xad, 0xbb, 0x1a, 0x56, 0xcc, 0x5b, 0x8a, 0x5c, 0xf9, 0x58, 0x45, 0x52, 0xe1, 0x7e, 0x7a, 0xf9, 0x54, 0x2b, 0xa1, 0x3e, 0x9c, 0x54, 0x69, 0x5e, 0x0d, 0xc8, 0xf2, 0x4e, 0xdd, 0xb9, 0x3d, 0x5a, 0x36, 0x78, 0xe1, 0x0c, 0x8a, 0x80, 0xff, 0x4f, 0x27, 0xb6, 0x77, 0xd4, 0x0b, 0xef ],
+const [ 0x09, 0xc8, 0xf4, 0xa8, 0x92, 0xb2, 0xef, 0xd2, 0x09, 0xaf, 0x0a, 0x81, 0x35, 0xc1, 0x57, 0x56, 0xc5, 0x28, 0x21, 0x3c, 0x86, 0xca, 0xc5, 0xed, 0xd9, 0xd8, 0xc3, 0xb9, 0x65, 0xaf, 0x15, 0x83, 0x09, 0xfc, 0xc0, 0x0c, 0x14, 0x24, 0xa8, 0x74, 0xb9, 0xe3, 0xa8, 0xfd, 0xbd, 0x33, 0xe2, 0x13, 0x73, 0x6f, 0x54, 0x89, 0xea, 0xb8, 0xad, 0x26, 0x65, 0x98, 0x5e, 0x60, 0x0b, 0xe5, 0xf3, 0x67, 0xe0, 0xe8, 0xa4, 0x65, 0xf4, 0xbf, 0x27, 0x04, 0xdb, 0x00, 0xc9, 0x32, 0x5c, 0x9f, 0xbd, 0x21 ],
+const [ 0xae, 0x69, 0xe1, 0xf1, 0x0b, 0xcc, 0x8e, 0xa9, 0xe4, 0x7a, 0x17, 0x95, 0xc9, 0x16, 0xa3, 0x13, 0x2b, 0x9d, 0x4b, 0xa7, 0x10, 0x49, 0x70, 0xfa, 0x0b, 0xb5, 0x51, 0x23, 0x6c, 0x43, 0xdc, 0x26, 0xb4, 0xbb, 0xc5, 0xba, 0x4c, 0x34, 0xd6, 0x50, 0x76, 0x38, 0x86, 0x50, 0x83, 0x23, 0xcc, 0xa6, 0x47, 0xcc, 0x35, 0x7d, 0xca, 0x67, 0x35, 0x4a, 0x40, 0xaa, 0xba, 0x0d, 0x3b, 0x2f, 0x07, 0xd4, 0x20, 0x1a, 0xc0, 0x80, 0xd7, 0xfb, 0x41, 0xcb, 0xc7, 0xf6, 0x34, 0x8a, 0x02, 0x21, 0x63, 0x30 ],
+const [ 0x7f, 0x05, 0x68, 0xcc, 0xa4, 0xff, 0x79, 0xdc, 0xf1, 0xe5, 0xa3, 0x06, 0xb4, 0x19, 0xd2, 0x5d, 0x47, 0xdd, 0x4c, 0xdd, 0x42, 0xbb, 0x86, 0xf3, 0xef, 0x24, 0x3c, 0x40, 0xfe, 0x57, 0xc0, 0x9a, 0x7a, 0x84, 0x93, 0x53, 0xfc, 0x31, 0x32, 0xbe, 0x1f, 0xde, 0x32, 0xf0, 0x33, 0xe4, 0x8f, 0xc4, 0x36, 0xa3, 0x42, 0x22, 0x00, 0xdc, 0x11, 0x80, 0xbd, 0x5c, 0xab, 0xa8, 0xa0, 0xdb, 0xf4, 0xbc, 0xd6, 0x23, 0x9e, 0x78, 0xb9, 0x75, 0xf9, 0xb8, 0x47, 0x28, 0x0c, 0x3a, 0xd2, 0x93, 0xe4, 0xa4 ],
+const [ 0x0d, 0xaf, 0x68, 0xd4, 0x7c, 0xae, 0xcb, 0xcb, 0x73, 0x73, 0xb6, 0x93, 0xbb, 0xfa, 0x4b, 0x98, 0xa3, 0x9d, 0x88, 0xad, 0x3e, 0x7e, 0x1b, 0x99, 0xcb, 0x24, 0x78, 0xd2, 0x75, 0x69, 0x28, 0x88, 0x3d, 0x93, 0x64, 0xe5, 0x34, 0xc1, 0xe2, 0x94, 0xed, 0x89, 0xef, 0x80, 0x32, 0xdf, 0xbe, 0xde, 0xf6, 0x38, 0x00, 0x6d, 0x8b, 0xf0, 0xb4, 0xfc, 0x15, 0xe9, 0x41, 0x2e, 0x3f, 0x76, 0xc2, 0x7a, 0x2c, 0x77, 0xa1, 0x75, 0xb1, 0xc5, 0x67, 0x54, 0xc1, 0xd0, 0xd2, 0xac, 0x28, 0x86, 0x29, 0x7d ],
+const [ 0x01, 0x66, 0x3b, 0x65, 0xd9, 0xd2, 0x58, 0x26, 0x8b, 0x1f, 0x8c, 0x77, 0x0f, 0x71, 0x3c, 0xbc, 0x85, 0x7c, 0x18, 0x70, 0xd3, 0x99, 0xe7, 0xce, 0x90, 0x18, 0x87, 0xd1, 0x21, 0xd8, 0x2f, 0x5f, 0x21, 0x16, 0xf8, 0xc1, 0x07, 0x83, 0x9c, 0x57, 0x02, 0x99, 0x7d, 0x8a, 0x28, 0x2e, 0xe9, 0x01, 0xd0, 0x4a, 0x9c, 0x18, 0x3c, 0x36, 0x86, 0x8e, 0x7c, 0xd5, 0xcf, 0x7d, 0x8e, 0x37, 0x19, 0x90, 0xca, 0x6c, 0x05, 0x70, 0x7e, 0x96, 0xf8, 0x7f, 0xd5, 0x42, 0x1f, 0xc9, 0xfd, 0xf9, 0xb0, 0x38 ],
+const [ 0xab, 0x68, 0x32, 0x84, 0x6f, 0x39, 0xaa, 0x9b, 0xe6, 0xde, 0xdc, 0xdc, 0xe2, 0xf0, 0xd5, 0xad, 0x7d, 0x33, 0x11, 0x29, 0xb8, 0xb3, 0x40, 0xd1, 0x62, 0x12, 0x49, 0x7e, 0x3c, 0x20, 0x90, 0x9b, 0x5a, 0xac, 0x75, 0x90, 0xcc, 0x9a, 0x1d, 0x81, 0x7e, 0x36, 0x74, 0x39, 0x5d, 0xc8, 0x72, 0x61, 0xbb, 0x69, 0x9e, 0xf6, 0xf5, 0x14, 0xd1, 0xfa, 0x53, 0x00, 0x3d, 0x69, 0x2f, 0x2d, 0xad, 0x6e, 0x5a, 0x3d, 0x0e, 0xd7, 0xbb, 0x86, 0x2f, 0xc7, 0x39, 0x65, 0xc5, 0xaa, 0xdc, 0xd5, 0xb2, 0x6e ],
+const [ 0xd1, 0x44, 0x74, 0xfe, 0x02, 0x3c, 0x28, 0x4a, 0x27, 0xf7, 0xbe, 0x75, 0x1c, 0xed, 0x9a, 0xe2, 0x10, 0xa4, 0xfe, 0x5e, 0xe6, 0x81, 0x88, 0x9b, 0xdb, 0xde, 0xfc, 0xe0, 0x6a, 0x5d, 0x44, 0xfe, 0x6d, 0x7b, 0xb5, 0x86, 0x84, 0x68, 0x94, 0x39, 0xba, 0x16, 0xd9, 0xc0, 0x66, 0x8f, 0x32, 0x9e, 0x50, 0x8d, 0x4b, 0x62, 0x15, 0x44, 0x4d, 0x21, 0xcd, 0x83, 0xa5, 0x23, 0xea, 0xfb, 0x06, 0xdd, 0x63, 0xde, 0xb1, 0x1f, 0x13, 0xad, 0xf4, 0x8f, 0x5c, 0x4b, 0xf0, 0x56, 0x0f, 0x55, 0xa0, 0x19 ],
+const [ 0x1f, 0x92, 0x84, 0x00, 0x03, 0x41, 0xa2, 0x62, 0xe7, 0xb6, 0x1f, 0x94, 0x95, 0x23, 0xb7, 0x74, 0x42, 0x77, 0xe9, 0x90, 0x13, 0xd5, 0xa0, 0x3b, 0xe0, 0x44, 0x13, 0xe1, 0x37, 0xa8, 0xea, 0x97, 0xa4, 0xf1, 0xa2, 0xf6, 0x2f, 0x92, 0x32, 0x2a, 0x27, 0x34, 0xef, 0x46, 0x1e, 0xac, 0xad, 0xda, 0x35, 0x2b, 0x27, 0xc8, 0x9a, 0xb5, 0xa1, 0x53, 0x4e, 0xd5, 0xcb, 0x79, 0x2c, 0x8e, 0xe9, 0x83, 0x27, 0x94, 0x31, 0xda, 0xd3, 0xbd, 0x74, 0x1c, 0x27, 0xb2, 0x01, 0x6f, 0x81, 0xea, 0xc7, 0x16 ],
+const [ 0x24, 0xd8, 0x93, 0x8c, 0x16, 0x44, 0xcb, 0xb0, 0x80, 0xc4, 0x50, 0x55, 0x39, 0xe4, 0x4c, 0x8a, 0x61, 0x56, 0x7c, 0xa7, 0x44, 0x43, 0x36, 0x3b, 0x80, 0xdf, 0xaa, 0x46, 0x6b, 0x40, 0x68, 0xa9, 0xaf, 0x70, 0x22, 0xda, 0x37, 0xc1, 0xb3, 0xdc, 0x4f, 0x60, 0x61, 0x6f, 0x06, 0x2d, 0x5f, 0x84, 0xd7, 0xca, 0x96, 0xf3, 0x89, 0xf2, 0xa6, 0x70, 0x54, 0x0d, 0x27, 0xbc, 0x45, 0x01, 0x34, 0x18, 0xe4, 0x4a, 0x2a, 0xff, 0x13, 0x4d, 0xad, 0x14, 0x39, 0xe9, 0xec, 0x5a, 0xa0, 0x50, 0x26, 0xa3 ],
+const [ 0x4b, 0xdc, 0x4b, 0x88, 0x62, 0x95, 0x68, 0x99, 0x37, 0x3d, 0x3d, 0xf4, 0xda, 0x72, 0x81, 0xc0, 0xea, 0x2b, 0xdd, 0x57, 0x63, 0x40, 0x59, 0xef, 0xb8, 0x2d, 0x15, 0x7a, 0x22, 0x13, 0x39, 0xcb, 0x37, 0xff, 0x2e, 0xf9, 0xbe, 0x6f, 0x0f, 0x08, 0xc2, 0x12, 0x5a, 0xc6, 0xe5, 0xd0, 0xec, 0xf4, 0xf7, 0x0a, 0x2c, 0xa6, 0xc7, 0x23, 0x86, 0xed, 0x39, 0x3f, 0x1b, 0xb2, 0x99, 0x4a, 0xb6, 0xe5, 0x2f, 0x3d, 0x02, 0xd8, 0x14, 0x9c, 0xfb, 0xe5, 0x44, 0x43, 0xa3, 0x57, 0xf3, 0x63, 0xf6, 0x88 ],
+const [ 0x73, 0x29, 0x57, 0xd1, 0x86, 0x70, 0x47, 0xf2, 0x90, 0x48, 0x17, 0xb4, 0xf5, 0x59, 0x64, 0x90, 0x59, 0x87, 0x0d, 0x38, 0xb2, 0xbc, 0xe7, 0x7e, 0xa2, 0xe8, 0xb2, 0x72, 0x05, 0x46, 0x4c, 0xcb, 0xc6, 0xe0, 0x25, 0x89, 0xf6, 0x55, 0xf3, 0xd8, 0x1f, 0xda, 0xa7, 0x36, 0xd5, 0x7f, 0x9f, 0xd8, 0x8f, 0xb4, 0x1d, 0x4a, 0xb5, 0x0b, 0xf8, 0x57, 0xfa, 0x3f, 0x91, 0x28, 0xec, 0x76, 0x09, 0xb0, 0xc9, 0xc3, 0xb1, 0x47, 0x95, 0xef, 0xc2, 0x94, 0x69, 0x79, 0x4f, 0xb1, 0x0e, 0xdb, 0x77, 0x8a ],
+const [ 0x05, 0x41, 0x27, 0x98, 0x05, 0xec, 0x5e, 0x82, 0xdd, 0xea, 0x16, 0x89, 0x78, 0x48, 0xb0, 0xdd, 0x58, 0x4f, 0xe5, 0x9f, 0x2d, 0xc1, 0xff, 0x44, 0xa6, 0x5f, 0x49, 0x3b, 0x87, 0xae, 0xc4, 0xcf, 0xfc, 0xfb, 0x1b, 0x4e, 0x2c, 0x9d, 0xd9, 0x6b, 0x12, 0x7a, 0xda, 0xe1, 0x88, 0xcd, 0xff, 0x59, 0xa5, 0x26, 0x26, 0x8e, 0x49, 0xb2, 0x5a, 0xaf, 0xf6, 0xbc, 0x46, 0x05, 0xe2, 0x74, 0xf0, 0xd5, 0x4a, 0xef, 0xa4, 0x88, 0x08, 0x70, 0x2d, 0x09, 0x68, 0xe6, 0x4c, 0x6f, 0x38, 0xb5, 0x62, 0xdc ],
+const [ 0x68, 0xed, 0x9f, 0xb9, 0x0a, 0xa9, 0xc9, 0x5f, 0xf1, 0xad, 0xd2, 0x47, 0x6e, 0xd9, 0xa8, 0xf9, 0xf8, 0x94, 0xa3, 0xbf, 0xc5, 0x14, 0xb7, 0x07, 0x97, 0xda, 0xef, 0x0a, 0xd9, 0x7b, 0x16, 0xab, 0xea, 0xa6, 0xb7, 0xa2, 0xb9, 0x63, 0x49, 0xd9, 0x92, 0x99, 0xa3, 0x16, 0x37, 0xd3, 0xb6, 0xdb, 0x33, 0x43, 0x7a, 0x8b, 0x6b, 0x08, 0x29, 0xcd, 0xf6, 0xac, 0xac, 0x35, 0x2e, 0xf1, 0x52, 0x22, 0x07, 0xcd, 0xc8, 0xe2, 0xa0, 0xb3, 0x46, 0x1d, 0x18, 0x14, 0x06, 0x70, 0xa3, 0x26, 0xfa, 0x58 ],
+const [ 0x77, 0x23, 0x26, 0xbc, 0x0d, 0x10, 0x92, 0x1a, 0x48, 0x9a, 0x82, 0xe3, 0x65, 0x1d, 0xaf, 0x79, 0x8b, 0x2e, 0x2a, 0x39, 0xf7, 0x2f, 0xa1, 0xad, 0x56, 0x20, 0xde, 0x02, 0x72, 0xb8, 0x90, 0xbc, 0x11, 0xb5, 0x4e, 0xa8, 0x1a, 0x70, 0xd9, 0x12, 0xfa, 0xb4, 0xa1, 0x39, 0x46, 0xd0, 0x8b, 0x00, 0xa2, 0xeb, 0xf2, 0xe6, 0xe1, 0x98, 0xec, 0x38, 0x6e, 0xab, 0xce, 0x86, 0xea, 0x4a, 0xf2, 0x53, 0x16, 0x47, 0xb7, 0x10, 0xf4, 0xad, 0xca, 0x4c, 0x29, 0x98, 0xa4, 0x25, 0xa6, 0x4a, 0x54, 0x02 ],
+const [ 0xab, 0x7b, 0x93, 0x24, 0x94, 0xcc, 0xb9, 0xa4, 0x79, 0x2c, 0xaf, 0xbf, 0x75, 0x98, 0x8f, 0xf4, 0x95, 0x35, 0xf8, 0x37, 0x90, 0x37, 0x61, 0xf5, 0xb2, 0x01, 0xad, 0x52, 0x1a, 0x8d, 0xff, 0xb5, 0x25, 0x0f, 0xcf, 0x86, 0x2a, 0xd5, 0x3e, 0x36, 0x68, 0x72, 0xa6, 0x80, 0x3c, 0x1b, 0x76, 0xef, 0x98, 0x51, 0x3d, 0xa1, 0xb0, 0xc1, 0x04, 0x4a, 0xf6, 0x68, 0xe1, 0x7b, 0x49, 0xfa, 0xc9, 0x25, 0x69, 0x85, 0xa6, 0x59, 0xaf, 0x51, 0xa9, 0x51, 0xfb, 0x0c, 0xe2, 0xb4, 0xed, 0x23, 0x0e, 0x16 ],
+const [ 0x1f, 0x85, 0x09, 0xc8, 0x55, 0x3d, 0x0d, 0x77, 0x59, 0x3d, 0x26, 0x1f, 0xc9, 0xfc, 0xff, 0x90, 0xbf, 0x77, 0xb2, 0x4c, 0x4b, 0xd3, 0xde, 0x47, 0x21, 0x44, 0xfa, 0xeb, 0x8e, 0x2d, 0xe8, 0x5f, 0xb1, 0x89, 0xcd, 0x09, 0xe7, 0x89, 0x21, 0x52, 0x87, 0x7e, 0x02, 0xa9, 0xd0, 0xfa, 0xce, 0xca, 0x1f, 0x32, 0xf0, 0x40, 0x65, 0xa7, 0xfa, 0x28, 0xd9, 0x06, 0xf5, 0x39, 0xea, 0x4c, 0xf4, 0x01, 0x78, 0x2d, 0xf0, 0x71, 0x43, 0xb7, 0xcf, 0x9c, 0xa4, 0x33, 0xc6, 0xbc, 0x7b, 0x4c, 0xe1, 0x76 ],
+const [ 0x24, 0xb2, 0xd6, 0x33, 0x2e, 0xba, 0x8f, 0xd7, 0x19, 0xb4, 0xb3, 0x74, 0x63, 0xb4, 0x56, 0xe4, 0x4b, 0x91, 0x40, 0xd9, 0x90, 0x9a, 0xdc, 0x28, 0x7c, 0x85, 0x51, 0x68, 0x21, 0xa8, 0xee, 0xbc, 0xe3, 0x6c, 0xcb, 0xed, 0x36, 0xfe, 0xad, 0xbc, 0xa9, 0x47, 0x2b, 0x76, 0x24, 0x1f, 0x0f, 0xc8, 0x6d, 0xbd, 0xff, 0xd5, 0xf1, 0x72, 0x5d, 0x86, 0xc2, 0x98, 0x6b, 0x21, 0xdc, 0xc5, 0xb3, 0x1e, 0xac, 0x44, 0xa6, 0x36, 0xd3, 0xc5, 0x83, 0xbc, 0x27, 0x53, 0x7a, 0x30, 0xfa, 0x87, 0x12, 0x12 ],
+const [ 0xb7, 0x12, 0xf9, 0x4e, 0x60, 0x6e, 0x29, 0x36, 0x83, 0xb2, 0x96, 0x88, 0x06, 0xff, 0x6a, 0x14, 0x85, 0x50, 0x4a, 0x3e, 0xeb, 0xb8, 0x89, 0x5c, 0x3f, 0xeb, 0x9b, 0x60, 0xc1, 0x00, 0xcd, 0xb7, 0x36, 0x75, 0x34, 0x71, 0x80, 0x74, 0xe3, 0xa1, 0x71, 0x54, 0x61, 0x07, 0xe1, 0x63, 0x5b, 0xec, 0xfe, 0xe3, 0x95, 0x4e, 0xe4, 0x52, 0x26, 0x3d, 0x6e, 0xef, 0xe5, 0x85, 0x4b, 0x79, 0x1f, 0x8d, 0x54, 0x3a, 0x8b, 0x7f, 0x1c, 0x44, 0x7f, 0xa9, 0xc9, 0xfb, 0x63, 0x24, 0x23, 0xd3, 0x67, 0xb3 ],
+const [ 0xe1, 0x99, 0xdd, 0xb8, 0x61, 0x29, 0x36, 0xd2, 0xe4, 0x6b, 0x4e, 0x30, 0x1a, 0x1e, 0x77, 0x2b, 0x03, 0x12, 0xd5, 0xa9, 0x03, 0xe7, 0x13, 0xf9, 0x38, 0x17, 0x54, 0xfe, 0x0b, 0x37, 0x6d, 0x90, 0x05, 0x79, 0x51, 0x1f, 0xe5, 0x76, 0xcc, 0x99, 0xef, 0x2a, 0x75, 0x8e, 0x86, 0x40, 0xde, 0x93, 0xfd, 0x90, 0x0d, 0xe4, 0xab, 0xe7, 0x30, 0x4d, 0x3d, 0x06, 0x8c, 0x4a, 0x50, 0xed, 0xb7, 0x6d, 0x40, 0x59, 0x07, 0x00, 0x3a, 0x8b, 0x4a, 0xec, 0x99, 0x4b, 0xb7, 0xd9, 0x6f, 0x2d, 0x25, 0x97 ],
+const [ 0x48, 0x3d, 0x31, 0x90, 0xb2, 0xbf, 0xaf, 0x49, 0x2e, 0x96, 0x88, 0xe6, 0x1d, 0xb2, 0xb9, 0xff, 0x0b, 0x7d, 0xd8, 0x64, 0xd7, 0x6b, 0x55, 0x53, 0x14, 0xd2, 0x01, 0xee, 0xb0, 0xfd, 0xcc, 0xeb, 0xd3, 0x7c, 0xd3, 0x8e, 0x0a, 0xbd, 0x9a, 0xd4, 0xa5, 0xe1, 0x95, 0xf2, 0x5e, 0xc8, 0xee, 0xfd, 0x3b, 0x6e, 0x82, 0xeb, 0xb5, 0x7b, 0x2d, 0xba, 0x19, 0x15, 0x47, 0xef, 0x2f, 0xf9, 0x6e, 0x42, 0x1a, 0xca, 0x86, 0x98, 0x7f, 0xa8, 0xff, 0x31, 0xe9, 0x05, 0x56, 0x23, 0x6c, 0xb4, 0xdf, 0x07 ],
+const [ 0x2a, 0xa3, 0xcc, 0x87, 0xde, 0xb1, 0x65, 0xb2, 0xc4, 0x11, 0x4d, 0x1e, 0x50, 0x38, 0xb8, 0x82, 0x73, 0x23, 0x38, 0x78, 0x6d, 0xe3, 0x32, 0x23, 0xe3, 0x58, 0x8f, 0x16, 0x31, 0x3d, 0xb3, 0x71, 0x01, 0x64, 0xb3, 0x4d, 0x1d, 0x43, 0xc2, 0x5b, 0x81, 0xb0, 0xed, 0xc7, 0xb5, 0xe9, 0x09, 0x63, 0x59, 0xd7, 0xe9, 0x01, 0x01, 0x94, 0xd4, 0x20, 0x44, 0x2a, 0x35, 0xcc, 0x10, 0x9e, 0x95, 0xbf, 0x40, 0x2d, 0xc7, 0xcc, 0x71, 0xd5, 0x62, 0x7e, 0x11, 0x17, 0x75, 0xfc, 0xb8, 0xfc, 0x75, 0x2f ],
+const [ 0x4d, 0xe1, 0xed, 0x23, 0x5e, 0x42, 0x47, 0xd7, 0x3d, 0xf8, 0x6f, 0xc5, 0x7e, 0x56, 0x36, 0x0f, 0x0c, 0xa7, 0x8c, 0x6c, 0x13, 0x7d, 0x8e, 0x1d, 0x1d, 0x46, 0xc0, 0x23, 0x7b, 0x20, 0x96, 0xaf, 0xe6, 0xef, 0x3a, 0xda, 0x66, 0xac, 0x89, 0x96, 0x73, 0x00, 0x5e, 0xe4, 0x5a, 0x11, 0x14, 0x48, 0xe3, 0x9c, 0x46, 0x7a, 0x31, 0x44, 0xd9, 0x5f, 0xe9, 0x29, 0x3d, 0x37, 0x97, 0xbd, 0xef, 0x18, 0x4d, 0xd3, 0x43, 0x9b, 0x8d, 0xf9, 0x60, 0xd5, 0x68, 0x08, 0x8c, 0x89, 0xe8, 0xf9, 0xaa, 0x9b ],
+const [ 0xe4, 0x88, 0x25, 0xa5, 0x50, 0x3a, 0x6a, 0xfe, 0x0b, 0xf9, 0xa2, 0x40, 0xc6, 0x7f, 0x27, 0xac, 0xd4, 0xa8, 0xf6, 0x99, 0x38, 0x34, 0x64, 0x5e, 0x03, 0xc8, 0x0c, 0x72, 0xdd, 0x37, 0x0c, 0xd2, 0xe1, 0x00, 0x71, 0xa3, 0xae, 0x18, 0xef, 0x19, 0xba, 0xe9, 0xd6, 0x97, 0xea, 0x9a, 0x41, 0x18, 0x60, 0x91, 0x90, 0xcd, 0x95, 0x36, 0x19, 0x07, 0xa7, 0xfa, 0x1b, 0x58, 0xf4, 0x99, 0xf3, 0xf5, 0xe7, 0x9b, 0x93, 0x5f, 0x12, 0x21, 0x2f, 0x43, 0x7d, 0xde, 0x39, 0x9e, 0x3e, 0x64, 0x90, 0x24 ],
+const [ 0xb5, 0x43, 0x8e, 0x38, 0x45, 0xf3, 0x9a, 0xfe, 0x7d, 0xeb, 0x0f, 0xcf, 0xb8, 0x6e, 0x2d, 0xbe, 0x4f, 0xbc, 0x48, 0x9f, 0x55, 0xf0, 0x1c, 0x0f, 0x84, 0x29, 0x61, 0xb5, 0x76, 0xe8, 0x9f, 0xc7, 0x19, 0xb9, 0x44, 0xcf, 0x5d, 0x16, 0xf4, 0xaf, 0x2f, 0x88, 0x20, 0xe2, 0xab, 0x0f, 0xda, 0x06, 0x8d, 0xc4, 0xe7, 0x97, 0xe9, 0xbd, 0x16, 0xfe, 0x1d, 0x31, 0xd1, 0xca, 0x03, 0xdc, 0xf2, 0x3d, 0x6b, 0xa5, 0xd8, 0x0a, 0xc8, 0x7f, 0xb9, 0x5d, 0x29, 0x8d, 0x39, 0x1c, 0x6b, 0x89, 0x3c, 0x6c ],
+const [ 0x95, 0xf2, 0xc1, 0x50, 0x9d, 0xff, 0x6d, 0x16, 0x2e, 0xdd, 0x5d, 0xe3, 0x2d, 0xed, 0x42, 0x38, 0x66, 0xdf, 0xda, 0x68, 0x2b, 0xc7, 0xb7, 0x50, 0x3e, 0x73, 0x41, 0x42, 0xf2, 0xfc, 0xfe, 0x42, 0x8c, 0x9c, 0x11, 0x75, 0xef, 0xbf, 0x01, 0xd6, 0x79, 0x5d, 0xbc, 0x2b, 0x28, 0x86, 0xdc, 0x38, 0x01, 0x3f, 0x28, 0x32, 0xb2, 0x8c, 0x5e, 0x76, 0x76, 0xce, 0x30, 0x7b, 0x39, 0x4f, 0x8c, 0x05, 0xfd, 0x1c, 0x20, 0x9c, 0x7c, 0x13, 0x1e, 0x3d, 0x0e, 0x3c, 0x3c, 0x4f, 0xce, 0x5d, 0x00, 0xd8 ],
+const [ 0x9d, 0xa0, 0xc1, 0x14, 0x68, 0x2f, 0x82, 0xc1, 0xd1, 0xe9, 0xb5, 0x44, 0x30, 0x58, 0x0b, 0x9c, 0x56, 0x94, 0x89, 0xca, 0x16, 0xb9, 0x2e, 0xe1, 0x04, 0x98, 0xd5, 0x5d, 0x7c, 0xad, 0x5d, 0xb5, 0xe6, 0x52, 0x06, 0x34, 0x39, 0x31, 0x1e, 0x04, 0xbe, 0xff, 0xde, 0x8c, 0x17, 0x68, 0x8f, 0xfc, 0x7f, 0x45, 0xf0, 0x25, 0x53, 0x15, 0xdc, 0x8f, 0xd2, 0xab, 0x28, 0xc5, 0x21, 0x24, 0xcb, 0xf4, 0x91, 0x1c, 0x41, 0xb4, 0x25, 0x22, 0x31, 0x26, 0x4f, 0x68, 0x4d, 0x3f, 0xfb, 0xbf, 0x79, 0x63 ],
+const [ 0xac, 0xc3, 0xe6, 0x77, 0x46, 0x03, 0x3c, 0x73, 0x95, 0x89, 0x92, 0xfd, 0x94, 0xf4, 0x57, 0xd6, 0xd1, 0x2c, 0x29, 0x36, 0x70, 0x50, 0xf6, 0x63, 0x72, 0xf0, 0x61, 0x81, 0x38, 0x7d, 0x67, 0xac, 0x42, 0xfd, 0x42, 0x44, 0x3d, 0x03, 0x8d, 0x88, 0x3d, 0xdf, 0xaa, 0x67, 0x47, 0x12, 0x61, 0x92, 0x12, 0x05, 0xc9, 0xd6, 0x0e, 0xfa, 0x6c, 0xa9, 0xa6, 0x42, 0xa6, 0x03, 0xc2, 0xb0, 0x4e, 0x6f, 0x91, 0x4f, 0x98, 0x61, 0x85, 0x50, 0x3a, 0xca, 0x9f, 0x46, 0xce, 0xea, 0xec, 0x96, 0x78, 0x65 ],
+const [ 0x54, 0x55, 0x14, 0xc7, 0x4c, 0x93, 0x2e, 0x3e, 0xd8, 0x56, 0xe9, 0x3d, 0x87, 0x8a, 0xd4, 0x2c, 0xed, 0xf8, 0xe0, 0x44, 0x34, 0xbd, 0x09, 0xa1, 0xd4, 0xfa, 0x38, 0x98, 0x9e, 0xce, 0x68, 0x4a, 0xff, 0x81, 0x08, 0x79, 0x83, 0x02, 0xa1, 0x9b, 0x98, 0x94, 0xb9, 0x2d, 0x95, 0xc4, 0xf7, 0x4a, 0xfa, 0x9e, 0x88, 0x7c, 0xf9, 0x20, 0xc0, 0xd2, 0x36, 0xef, 0x05, 0x33, 0xcc, 0x49, 0xe9, 0xf1, 0x90, 0x3b, 0x96, 0xa1, 0x99, 0x14, 0x6f, 0x2b, 0x00, 0x19, 0xf4, 0x1d, 0xe4, 0x7a, 0xe6, 0x45 ],
+const [ 0xe7, 0x94, 0x61, 0xf0, 0x0c, 0x4c, 0x05, 0xe2, 0xe0, 0x18, 0x08, 0xde, 0x19, 0x26, 0xf4, 0x1a, 0xa8, 0xf4, 0x5e, 0xa5, 0xeb, 0xb5, 0xba, 0xf1, 0x24, 0xf6, 0x74, 0x90, 0x2a, 0x81, 0x3c, 0x3b, 0x5e, 0x81, 0xa1, 0x18, 0xe1, 0xe8, 0xe1, 0x3d, 0x04, 0x0e, 0xff, 0x70, 0x00, 0x9a, 0x17, 0x30, 0xe8, 0xa6, 0xef, 0xfa, 0xdb, 0x1e, 0xce, 0xc5, 0x7e, 0x69, 0x91, 0xcf, 0xa9, 0x4c, 0xfb, 0x9b, 0x61, 0x0b, 0x4d, 0x3a, 0x07, 0xd1, 0x16, 0xcb, 0xce, 0x51, 0x4d, 0x3e, 0x73, 0xae, 0x9d, 0x5d ],
+const [ 0x48, 0xef, 0xf7, 0xd4, 0x89, 0xf9, 0xb2, 0x5c, 0x0c, 0x65, 0xcb, 0x3a, 0x37, 0xd4, 0xef, 0xba, 0x3a, 0x84, 0xf7, 0x9b, 0xe7, 0xcf, 0x62, 0xb5, 0xc3, 0xf4, 0x03, 0xe0, 0x5d, 0x1a, 0xf7, 0x12, 0xde, 0x92, 0xda, 0xc7, 0xe2, 0x5d, 0x3a, 0xa6, 0x86, 0xee, 0x4c, 0x61, 0xc2, 0x30, 0xde, 0xdd, 0xfa, 0xcb, 0x8d, 0x93, 0xcf, 0xa4, 0x38, 0x36, 0x3b, 0xa2, 0xb5, 0x95, 0xdd, 0xb8, 0xc2, 0xc4, 0x91, 0x20, 0x3e, 0x76, 0x44, 0xe4, 0x99, 0xae, 0x07, 0xa3, 0x89, 0x97, 0x61, 0x92, 0xfe, 0xaf ],
+const [ 0x6a, 0xd2, 0x5e, 0x9d, 0xab, 0xd1, 0x63, 0xd0, 0x92, 0xe1, 0x24, 0xfa, 0x0a, 0xd1, 0x86, 0x7f, 0xbb, 0x3e, 0x02, 0x03, 0x89, 0x07, 0x4a, 0x7c, 0x5e, 0x01, 0x30, 0x8c, 0x2a, 0xec, 0xc4, 0x0f, 0x28, 0xa6, 0xbd, 0xf0, 0x62, 0x9f, 0x1b, 0x40, 0x77, 0x8d, 0x0a, 0x89, 0x9c, 0x61, 0x08, 0x5f, 0xe1, 0x79, 0x4a, 0x39, 0xb6, 0x17, 0x5c, 0x7f, 0xad, 0x12, 0x09, 0xe4, 0x81, 0xcb, 0x7a, 0xf6, 0x58, 0x63, 0xa2, 0xf3, 0x45, 0x2b, 0xd9, 0xdf, 0x11, 0x5c, 0xc6, 0xd3, 0x3b, 0x09, 0x83, 0x98 ],
+const [ 0x58, 0x81, 0x2c, 0xe4, 0x01, 0x8d, 0x2c, 0xb6, 0x55, 0x71, 0x27, 0x14, 0x92, 0xfe, 0xf8, 0x7c, 0x06, 0xd7, 0x03, 0xd4, 0xd5, 0x28, 0x19, 0xb8, 0xf7, 0x95, 0x9c, 0x13, 0x80, 0x71, 0xe3, 0xec, 0x24, 0x31, 0xdf, 0x83, 0xfa, 0x20, 0xff, 0x9d, 0x80, 0x54, 0x52, 0x1c, 0xe0, 0xe0, 0xec, 0xd2, 0x71, 0x4b, 0x8a, 0x97, 0x81, 0x41, 0x79, 0x99, 0x52, 0x89, 0xb3, 0xf4, 0x62, 0x37, 0x4c, 0x83, 0xef, 0x23, 0x0c, 0xf5, 0xbb, 0x99, 0x5e, 0x23, 0x0d, 0x52, 0x68, 0xa0, 0xf8, 0xa3, 0x7c, 0x92 ],
+const [ 0x20, 0xc0, 0xdb, 0x0a, 0xab, 0x2f, 0x9b, 0xe2, 0x1d, 0x2b, 0xf0, 0x42, 0x1a, 0x16, 0xc6, 0x39, 0x0a, 0x0b, 0xdd, 0x57, 0xc9, 0xc1, 0x1c, 0xb4, 0xa0, 0xb2, 0x29, 0x33, 0x75, 0x7c, 0x36, 0x08, 0x3e, 0x87, 0x1e, 0x78, 0xbc, 0xe8, 0xb0, 0xe0, 0x65, 0x85, 0x4a, 0xf9, 0xa2, 0x7a, 0xab, 0x5a, 0x3a, 0xbc, 0x02, 0x3f, 0x0e, 0xfc, 0x4a, 0x88, 0x08, 0xcf, 0xda, 0x05, 0x4e, 0x0b, 0x38, 0xf0, 0xbb, 0x74, 0x2f, 0xbb, 0x8f, 0x98, 0x21, 0x0d, 0x65, 0xf7, 0x9e, 0x07, 0x66, 0x67, 0x34, 0xcb ],
+const [ 0x28, 0x2d, 0x22, 0x2b, 0x84, 0x8c, 0xe9, 0x63, 0x72, 0x40, 0x99, 0x31, 0xab, 0xe8, 0xe1, 0xdb, 0x70, 0x99, 0x14, 0xb2, 0xd6, 0xdd, 0x21, 0x3d, 0x62, 0xfb, 0xc5, 0x93, 0xd5, 0x79, 0xff, 0x09, 0x49, 0xe0, 0xc5, 0x0d, 0x7d, 0xbf, 0xf5, 0x52, 0x6e, 0xf2, 0x8e, 0x2e, 0x27, 0x24, 0x20, 0x40, 0xd9, 0x93, 0x81, 0x55, 0x2e, 0x13, 0xc2, 0x8c, 0xdb, 0x56, 0x61, 0xb9, 0x75, 0x6a, 0xc0, 0x08, 0x85, 0x83, 0xd6, 0xe3, 0xde, 0xfb, 0x25, 0x15, 0x2e, 0x97, 0xec, 0x2f, 0xd4, 0x0c, 0x9d, 0x2a ],
+const [ 0x82, 0xa1, 0x90, 0x90, 0x19, 0x0e, 0xf5, 0x9e, 0x77, 0xa2, 0x6c, 0xde, 0x0e, 0x17, 0x99, 0xec, 0x5b, 0x0a, 0x79, 0x6b, 0xc6, 0x4e, 0x5a, 0xf8, 0xca, 0x86, 0x2b, 0x5d, 0x55, 0xf3, 0xf6, 0x07, 0x72, 0x8a, 0xab, 0xbb, 0x25, 0x4a, 0x1f, 0x84, 0x96, 0xcc, 0x54, 0xf0, 0x72, 0x1c, 0xfb, 0x7b, 0x8f, 0xc7, 0x37, 0x4c, 0xcf, 0x35, 0xa4, 0x1f, 0x46, 0x39, 0x98, 0x83, 0x9f, 0xe7, 0xa9, 0x45, 0xbb, 0xa6, 0x6f, 0x2c, 0x9c, 0x86, 0x8b, 0xe6, 0x82, 0xd3, 0xe7, 0x43, 0x53, 0xea, 0x40, 0xa1 ],
+const [ 0x76, 0x28, 0x0c, 0x24, 0x84, 0x9f, 0x0c, 0x38, 0x4d, 0x6e, 0x5b, 0x51, 0x2a, 0x9f, 0xb1, 0xdd, 0x21, 0x31, 0xda, 0x03, 0x07, 0xb2, 0xff, 0xdc, 0xe7, 0x10, 0x27, 0xe0, 0xa8, 0xac, 0xfd, 0x9e, 0xe9, 0xb0, 0xd4, 0xb1, 0x30, 0xa3, 0xe8, 0xef, 0x44, 0x3a, 0xe7, 0xe3, 0xd7, 0x71, 0xb0, 0x7e, 0x68, 0xdb, 0x5a, 0x09, 0x68, 0x36, 0x78, 0x5e, 0x9c, 0x43, 0x9b, 0x58, 0xc2, 0xd5, 0x19, 0x88, 0x77, 0x27, 0x0d, 0x29, 0x58, 0x72, 0x9f, 0x56, 0x68, 0xbf, 0x86, 0x7b, 0xb2, 0xfa, 0xcb, 0x0a ],
+const [ 0x72, 0xce, 0x9c, 0xfd, 0x27, 0xb7, 0x14, 0x41, 0x9b, 0xde, 0x4d, 0xcd, 0x9b, 0x37, 0x7d, 0xc8, 0x40, 0xbd, 0xc3, 0xad, 0xaf, 0x5a, 0x73, 0x4c, 0x03, 0x07, 0xaf, 0x12, 0x88, 0x34, 0x37, 0x8b, 0x2a, 0x6a, 0x81, 0x25, 0x2d, 0x2f, 0x0d, 0x37, 0x1e, 0x2a, 0xf3, 0x41, 0x09, 0x87, 0xbe, 0x76, 0xec, 0x9d, 0x7c, 0x77, 0x6c, 0xce, 0x16, 0x62, 0xc7, 0xaf, 0xde, 0x0b, 0x0a, 0x69, 0x67, 0x89, 0x84, 0x60, 0x99, 0xf5, 0x7a, 0x12, 0x04, 0x6e, 0x1c, 0x41, 0x75, 0x60, 0xb8, 0x54, 0xc7, 0x06 ],
+const [ 0x34, 0x99, 0x1e, 0x9f, 0x5b, 0x19, 0xfc, 0x2b, 0x84, 0x7a, 0x87, 0xbe, 0x72, 0xff, 0x49, 0xc9, 0x9e, 0xcf, 0x19, 0xd8, 0x37, 0xee, 0x3e, 0x23, 0x68, 0x6c, 0xd7, 0x60, 0xd9, 0xdd, 0x7a, 0xdc, 0x78, 0x09, 0x1b, 0xca, 0x79, 0xe4, 0x2f, 0xdb, 0x9b, 0xc0, 0x12, 0x0f, 0xae, 0xc1, 0xa6, 0xca, 0x52, 0x91, 0x3e, 0x2a, 0x01, 0x56, 0xba, 0x98, 0x50, 0xe1, 0xf3, 0x9d, 0x71, 0x28, 0x59, 0xf7, 0xfd, 0xf7, 0xda, 0xed, 0xf0, 0xe2, 0x06, 0xdf, 0xf6, 0x7e, 0x71, 0x21, 0xe5, 0xd1, 0x59, 0x0a ],
+const [ 0x4d, 0xdd, 0x00, 0xd0, 0xab, 0x6a, 0xab, 0x21, 0x00, 0xce, 0x97, 0x54, 0xc3, 0xb3, 0x98, 0x7c, 0x06, 0xf7, 0xe5, 0x86, 0x56, 0x01, 0x1d, 0x26, 0xe3, 0x51, 0x87, 0x11, 0xe1, 0x5b, 0x9e, 0x6d, 0x2d, 0x96, 0xcd, 0x85, 0x34, 0xd0, 0x77, 0xc2, 0x11, 0xc4, 0x3a, 0xd7, 0xf5, 0xee, 0x75, 0x3b, 0xcc, 0x9e, 0x07, 0xdc, 0x1d, 0x4c, 0x5a, 0x12, 0x32, 0x2b, 0xa1, 0xd1, 0x7a, 0x00, 0x5d, 0x24, 0x2b, 0x35, 0x26, 0xd6, 0x2b, 0x29, 0xa8, 0x72, 0x31, 0xcb, 0xec, 0x6f, 0x28, 0x67, 0xd9, 0xa4 ],
+const [ 0x7a, 0x31, 0x55, 0x3b, 0x05, 0xe9, 0x6a, 0x8d, 0xa0, 0xa4, 0xd5, 0xb8, 0x1a, 0x85, 0x7d, 0x19, 0x2a, 0xfb, 0x6a, 0xab, 0xb1, 0xf1, 0x27, 0xd7, 0x40, 0x45, 0x6a, 0x8e, 0xda, 0x7c, 0xf6, 0x96, 0xfb, 0xb4, 0xc1, 0x21, 0xd8, 0xd9, 0x52, 0xa4, 0xe9, 0x1c, 0x6e, 0xe6, 0xa5, 0xa1, 0xf3, 0x58, 0x8d, 0x78, 0x04, 0xa4, 0x6b, 0xcf, 0x66, 0x88, 0xdc, 0x66, 0x2a, 0xe5, 0x0c, 0x43, 0x8d, 0x13, 0xc1, 0xa6, 0x1c, 0x78, 0x9b, 0x3f, 0x1c, 0x59, 0x9a, 0x9f, 0x28, 0xef, 0xe0, 0xed, 0x1c, 0xbe ],
+const [ 0x64, 0x45, 0xf6, 0xd8, 0x84, 0xfb, 0xd5, 0x7a, 0x1e, 0xec, 0x07, 0x16, 0xf8, 0x93, 0xaa, 0x9f, 0x47, 0x28, 0xaa, 0xa0, 0x7d, 0x20, 0x38, 0xda, 0x62, 0xf3, 0x78, 0x2e, 0x66, 0x21, 0x7a, 0xbe, 0x35, 0x77, 0x6c, 0x50, 0x8d, 0x8e, 0x0e, 0xf3, 0x4c, 0x96, 0x66, 0xe4, 0xce, 0x51, 0xb4, 0xb2, 0x75, 0x62, 0xa8, 0xa1, 0x89, 0xc8, 0xd3, 0x4c, 0x43, 0xa6, 0x5c, 0x8f, 0x24, 0x45, 0xf4, 0xa4, 0x8b, 0x5b, 0x0b, 0x8c, 0x87, 0x8e, 0x44, 0xb1, 0xea, 0x34, 0x27, 0xc9, 0x9f, 0x5d, 0x17, 0xfd ],
+const [ 0x29, 0x67, 0xfa, 0x4c, 0x62, 0x6d, 0x18, 0xa7, 0x7a, 0xee, 0x78, 0x1a, 0xa5, 0x20, 0x0c, 0x22, 0x7f, 0xfe, 0x70, 0x3c, 0xa0, 0x90, 0x1e, 0x4a, 0x70, 0x6c, 0xe1, 0x39, 0x3c, 0x7d, 0x8c, 0xe1, 0x8a, 0x03, 0xeb, 0x2c, 0xaa, 0xdb, 0xfa, 0x7b, 0x8e, 0x01, 0x55, 0x45, 0xdc, 0x53, 0xf0, 0x01, 0x40, 0x97, 0x08, 0x47, 0x07, 0xc0, 0x59, 0x32, 0xea, 0x6d, 0x92, 0x08, 0x27, 0xb3, 0x06, 0x1d, 0xd7, 0x1c, 0xa4, 0xf4, 0x7b, 0xef, 0x29, 0xa8, 0xd8, 0xb2, 0x94, 0x8a, 0x05, 0xee, 0xda, 0x0c ],
+const [ 0x58, 0xfc, 0xc3, 0x89, 0x59, 0x30, 0xc2, 0xfc, 0xf0, 0xd7, 0xc9, 0x34, 0xa4, 0xec, 0x36, 0x25, 0x63, 0x35, 0x09, 0xe3, 0xc7, 0x76, 0x46, 0x6f, 0x98, 0xe4, 0x9b, 0xd0, 0x91, 0xdc, 0x43, 0x66, 0x67, 0xd5, 0x2a, 0x7c, 0x07, 0x94, 0x52, 0x1c, 0x1f, 0x9f, 0x75, 0x27, 0xe1, 0xf3, 0xec, 0xa5, 0x04, 0xf9, 0xcf, 0x59, 0x0b, 0xb7, 0x5e, 0x98, 0xc9, 0x43, 0x9f, 0x5c, 0x25, 0x7e, 0x49, 0x95, 0x1b, 0xfe, 0xe1, 0xbf, 0x03, 0x4c, 0x23, 0xb9, 0x16, 0x50, 0xa3, 0xd5, 0x2e, 0x09, 0xb4, 0x2c ],
+const [ 0xf6, 0xfb, 0x32, 0x2a, 0x18, 0xba, 0xc3, 0x4c, 0x75, 0x99, 0x80, 0x40, 0x51, 0x1c, 0xf0, 0x48, 0x77, 0x34, 0x4e, 0x7d, 0x2b, 0x63, 0x24, 0x13, 0x5f, 0x20, 0x1c, 0xde, 0x2a, 0x7d, 0x12, 0x15, 0x75, 0x07, 0x6d, 0x57, 0xf8, 0xee, 0xb0, 0xeb, 0x65, 0x66, 0x4c, 0x4c, 0xe2, 0x4c, 0xb9, 0xe5, 0xbd, 0x0d, 0xc4, 0x19, 0x5b, 0xc4, 0x2b, 0x86, 0x72, 0xa2, 0x67, 0x8b, 0x78, 0x93, 0xc9, 0x07, 0x5c, 0x1e, 0xc8, 0x64, 0x73, 0x8d, 0x9a, 0xd5, 0xb5, 0x4f, 0x01, 0xdb, 0x29, 0x9a, 0x68, 0x0e ],
+const [ 0xe0, 0x3e, 0x23, 0xe5, 0x02, 0x70, 0x04, 0x21, 0xf0, 0x01, 0x84, 0x49, 0xc0, 0xfc, 0x91, 0x64, 0xea, 0x48, 0x8c, 0x1d, 0x00, 0x84, 0x9f, 0xc6, 0x99, 0x36, 0x51, 0x9e, 0x8f, 0x25, 0x57, 0x4f, 0x6a, 0x03, 0xad, 0xbb, 0x1b, 0x4f, 0xe6, 0xf8, 0xee, 0x7a, 0xc1, 0x99, 0xba, 0x49, 0xfc, 0x30, 0x5a, 0x7a, 0x6d, 0x11, 0x61, 0xaa, 0x4e, 0x58, 0x0a, 0x76, 0xd9, 0x2d, 0x6e, 0xe1, 0x15, 0x46, 0xfa, 0xf5, 0xef, 0xae, 0x1f, 0xae, 0x8c, 0xc5, 0x4b, 0x13, 0xde, 0x89, 0x19, 0xa6, 0x75, 0x13 ],
+const [ 0x9e, 0x8c, 0x66, 0x5b, 0xa5, 0x38, 0x54, 0xf0, 0xfd, 0x27, 0xec, 0x45, 0xec, 0xcf, 0xd0, 0x3d, 0x58, 0xd1, 0x36, 0x0a, 0x3a, 0x94, 0xf5, 0xf2, 0x4f, 0x2d, 0xdf, 0x52, 0x11, 0x83, 0x52, 0xe3, 0xe5, 0xb0, 0x0a, 0x3c, 0x96, 0xaa, 0x39, 0x98, 0x02, 0x22, 0xda, 0xda, 0x13, 0xac, 0x42, 0xce, 0xf1, 0x21, 0xf8, 0xb2, 0x76, 0x41, 0xc6, 0xf5, 0xe3, 0x9d, 0x10, 0x3e, 0xd1, 0xb5, 0x65, 0xb0, 0x6a, 0x5d, 0x54, 0x6d, 0xd8, 0x65, 0x81, 0x58, 0xfe, 0x78, 0xf8, 0x20, 0x66, 0x45, 0xc0, 0x7a ],
+const [ 0x05, 0xb0, 0x36, 0x3f, 0xc5, 0x00, 0xdc, 0xcb, 0xe7, 0x8c, 0xa1, 0x8a, 0xc7, 0xd3, 0x52, 0x1d, 0x53, 0x9d, 0xee, 0x9e, 0x10, 0xe9, 0xc4, 0x32, 0x5e, 0x27, 0xd5, 0xdd, 0xfc, 0xa7, 0x7f, 0x9b, 0xce, 0x52, 0x5d, 0xac, 0xde, 0x98, 0x69, 0x2f, 0xa2, 0xa9, 0x63, 0xf2, 0x7d, 0xe8, 0x77, 0x89, 0x87, 0x9c, 0x1a, 0x9d, 0x91, 0xe9, 0x35, 0x87, 0x64, 0x00, 0x85, 0x1d, 0x4a, 0x92, 0x41, 0xcc, 0xd0, 0x8a, 0xfe, 0xe8, 0xc9, 0xfb, 0xd1, 0x3f, 0x96, 0x57, 0xb3, 0xf4, 0xa5, 0xe3, 0x29, 0x8b ],
+const [ 0x5e, 0xfb, 0x39, 0xea, 0x8b, 0xbf, 0x4b, 0xdc, 0x7b, 0xd9, 0x85, 0xda, 0xba, 0xb0, 0x7d, 0xb4, 0x27, 0xbc, 0xa4, 0xa8, 0x55, 0x50, 0xc8, 0xd8, 0x32, 0xb7, 0xdd, 0xfb, 0xe6, 0x83, 0xfc, 0x52, 0xfe, 0x22, 0xac, 0xdd, 0xca, 0xb2, 0x61, 0xd0, 0x03, 0x16, 0x42, 0x41, 0xb1, 0x4a, 0x2f, 0x23, 0x4c, 0xf3, 0x03, 0x77, 0x22, 0x3b, 0x16, 0xc1, 0xf8, 0xdb, 0x07, 0xb9, 0xf4, 0x79, 0xb8, 0x44, 0xbb, 0x35, 0x99, 0xa2, 0xd6, 0x7f, 0x2a, 0xe9, 0x5a, 0x2b, 0xbb, 0xb2, 0xc8, 0xc7, 0x76, 0x12 ],
+const [ 0x37, 0x24, 0xe4, 0xbe, 0xd1, 0xe7, 0x29, 0x85, 0xfd, 0x1f, 0x87, 0x93, 0x94, 0x54, 0x3a, 0xc9, 0x44, 0x8c, 0xfb, 0x8b, 0x33, 0x63, 0xc7, 0x71, 0xe5, 0x5e, 0xe1, 0x3f, 0x60, 0x7d, 0x1a, 0x18, 0x8e, 0x0f, 0x50, 0xee, 0xe2, 0xca, 0x35, 0x3d, 0x3e, 0x1b, 0x51, 0xf9, 0x15, 0xbb, 0x4b, 0xc5, 0xcd, 0x83, 0x64, 0x65, 0x67, 0x81, 0x44, 0x76, 0x61, 0x4b, 0xf9, 0x5c, 0xdb, 0x93, 0x3d, 0x7d, 0xfa, 0xfc, 0xf7, 0xad, 0x8a, 0x2c, 0x05, 0xe8, 0xe7, 0x23, 0x39, 0x47, 0x1d, 0xcb, 0xa1, 0x2d ],
+const [ 0x47, 0x18, 0xad, 0x42, 0x34, 0x39, 0xcc, 0x9d, 0x3b, 0x1f, 0x69, 0x17, 0x18, 0xe3, 0x4a, 0x30, 0xdf, 0x9b, 0x3c, 0x4d, 0xee, 0x7e, 0xa9, 0x01, 0x1f, 0x49, 0x6d, 0x8a, 0x42, 0xe1, 0xe6, 0x9f, 0xca, 0x39, 0x4a, 0x69, 0xc6, 0x76, 0x3e, 0xcf, 0x13, 0x51, 0xa4, 0xf6, 0xd0, 0xbd, 0xb4, 0x08, 0x13, 0xca, 0x4e, 0x35, 0xda, 0xca, 0x8e, 0xf8, 0x45, 0xb2, 0xa2, 0x9c, 0x02, 0xc3, 0xd8, 0xfe, 0x08, 0x69, 0xfb, 0x94, 0x88, 0x63, 0xe0, 0xae, 0x20, 0x24, 0x3c, 0xfc, 0x53, 0x79, 0xb8, 0x51 ],
+const [ 0x7f, 0xc4, 0xaa, 0x49, 0x2a, 0x3d, 0x12, 0xda, 0x5d, 0x2d, 0xe0, 0xcf, 0x9a, 0x61, 0xc0, 0xfb, 0xf9, 0xe4, 0xa2, 0x57, 0x19, 0x20, 0x55, 0x4a, 0x5c, 0x45, 0x58, 0x27, 0x54, 0xef, 0xed, 0xf8, 0x78, 0x03, 0x6e, 0x7a, 0x1c, 0xd9, 0xe4, 0x68, 0xa0, 0xa1, 0xd6, 0xfc, 0xe7, 0xff, 0x5f, 0xb4, 0x0a, 0xf9, 0x83, 0x52, 0x4e, 0x13, 0xc3, 0x26, 0x54, 0xb8, 0xef, 0x8f, 0x90, 0xdc, 0x3c, 0xc0, 0xfc, 0xe0, 0x97, 0xc0, 0x0e, 0xb6, 0x38, 0xb4, 0xe7, 0x45, 0x79, 0x61, 0xcd, 0x0f, 0xe9, 0xed ],
+const [ 0xb6, 0xec, 0x7c, 0xe6, 0x44, 0x84, 0x28, 0xc3, 0x4f, 0xc6, 0x81, 0x9d, 0x50, 0x50, 0x7a, 0x2d, 0x74, 0xae, 0x41, 0x75, 0xfd, 0x2a, 0xc5, 0x3e, 0xe5, 0xe5, 0x76, 0xc5, 0xc5, 0x27, 0x4b, 0xb2, 0xf6, 0xf4, 0x0a, 0x49, 0xf6, 0xe0, 0xc4, 0xe4, 0x0d, 0x24, 0x9e, 0xa1, 0x30, 0xf0, 0xd8, 0x58, 0x25, 0x03, 0x07, 0xd0, 0xe8, 0x7a, 0xa5, 0x32, 0x4e, 0xe5, 0xcc, 0xbd, 0xe8, 0xa0, 0x3f, 0xbc, 0x2a, 0x61, 0xaa, 0xb5, 0xcc, 0x0d, 0x2b, 0xe4, 0x71, 0xd0, 0x10, 0xe7, 0x87, 0x6c, 0xe3, 0xbb ],
+const [ 0xce, 0xb9, 0xae, 0xdf, 0x8d, 0x6e, 0xfc, 0xf0, 0xae, 0x52, 0xbe, 0xa0, 0xfa, 0x99, 0xa9, 0xe2, 0x6a, 0xe8, 0x1b, 0xac, 0xea, 0x0c, 0xff, 0x4d, 0x5e, 0xec, 0xf2, 0x01, 0xe3, 0xbc, 0xa3, 0xc3, 0x57, 0x74, 0x80, 0x62, 0x1b, 0x81, 0x8f, 0xd7, 0x17, 0xba, 0x99, 0xd6, 0xff, 0x95, 0x8e, 0xa3, 0xd5, 0x9b, 0x25, 0x27, 0xb0, 0x19, 0xc3, 0x43, 0xbb, 0x19, 0x9e, 0x64, 0x80, 0x90, 0x22, 0x58, 0x67, 0xd9, 0x94, 0x60, 0x79, 0x62, 0xf5, 0x86, 0x6a, 0xa6, 0x29, 0x30, 0xd7, 0x5b, 0x58, 0xf6 ],
+];
+
+const hmac_sha1_macs = const [
+'1ba0e66cf72efc349207',
+'007e4504041a12f9e345',
+'c19d05a808054b8039f9',
+'539d5cbb60739e152196',
+'2ddc8c4803e5a4c7871c',
+'c1ebf896bd26a30cf668',
+'8a3e105bffc04ba113cd',
+'4104ef3c144bcfaf8dd3',
+'838ba0117e413095d056',
+'cdcff19dc81026983e6c',
+'f069430eb49866d7d39b',
+'0f4fae1d2b5960a54b82',
+'7d809c2533c47f832046',
+'0c7799c513f4a3308de3',
+'00e416c156dc85d4d47d',
+'42537b22520a085577587616',
+'ecae138322d2d4086aa2bec6',
+'2fe2bd1355a64e4661a6567a',
+'144d3a67685bf4ac70bb7fe6',
+'c3b94fdb9a6bc9b8e0b7ecb4',
+'2eca333903bf60931eb08ba7',
+'04614d9e215e11546ef411dd',
+'f5ec42b8e5e3ef658223c8a1',
+'a055bb1256afef8fac818a39',
+'449a3eaf1aaeedc860a7c522',
+'d991f360f28b18086fc552f6',
+'3f99eb6518dcdcfb45eda5e8',
+'e4183c3f9245e63ac093e070',
+'6a31ddbafa486d1a847e0b1a',
+'e2cfa49f38958405705dc320',
+'73b083d8be0d19ee7a697f9e5d76362f',
+'d72b370a1d8290105173c83aeedb8358',
+'657db872e6e9aefcc3d69110c7591057',
+'7bc8883375527df5ac60fe47357e105e',
+'805a8f3cbb5ce17139cf8bb03db6b9b4',
+'b9b6e8e09db8509ac5a6609ad5e6390b',
+'571b3401f273a16d9d6011993c78bcfc',
+'6c82c5f72dba335ff85181131dbeb990',
+'9502475fa252e5bf4318e451c7f5fe41',
+'736c3332227a1b48acce71465f5726cb',
+'66af7ccfa98bcb8d01ead88d046f1038',
+'2993b746cb98445019cb1ed31ed34070',
+'287a4765a91fe81c21c4593f985a1253',
+'a8483672c40305d7630f3e86b80fa4b0',
+'a7df6225fc8a9bc8b91e4c39eef870eb',
+'3c8162589aafaee024fc9a5ca50dd2336fe3eb28',
+'2fecb466bc920f610e3eae9949e00f454a714ab5',
+'3745829991354a1eb42277bb9aff04ab2abcaa47',
+'e7c051682dfbbdecc828606868a8fe2eb85919ba',
+'60d775c440e378a5b3df018edb08c33c063bd8a5',
+'3fdaec4c28dd5758d937efb8cd4ada0cd40a5d13',
+'c3b30827b4e2bba31b6fc0985fa597eb4896c7a2',
+'d7264b214307520629ee5e76aa4a8dda4b556b3a',
+'42ddd9b92c2a45420a770b9727bf53dcffc84d20',
+'b099c135065fb0c4c71a4fcb37a95b13cff95437',
+'d8fdc66e0c97c0738f236f3dde60af8ac6c3d29a',
+'be13212ac81902215c85a7697a2d1870ef74f9ac',
+'c87995813b3156fd712c511c328bace2d05cab41',
+'57e9692b230b55a8a206ca48838d8d1f920202b6',
+'0c662e4793938cc37f3d51d2b40548ec55914f0d',
+'402493fac26c2454d0cb',
+'b96de3a219d76614aaa4',
+'2eb0b56949f78f796b9b',
+'5cee7667d0a29278aea8',
+'476d8d8db76e87df0a3f',
+'3bddf9f7384c84b3a66d',
+'c4b0bc18c2784c858754',
+'e42a3482a658c651f55c',
+'d623d5ce7f0e22c269af',
+'6cc56c226b22110fb13d',
+'51ae4aaf0de1921b08cb',
+'a03712aad2fc0e59732d',
+'af6a6235395d057c6d2a',
+'190e04e5dfa9eab70cce',
+'2394aef32f606989812a',
+'445aa92b032c6b65b28a6541',
+'2f8e18b75cb37402d6e87355',
+'9dc9ffa7894d69c67295c994',
+'a246956f07f6af8830fcd392',
+'cbdb6ff2298283b4ddec7526',
+'d7fa45de6ac34e2d3ddeeb97',
+'7fed72bdb85fbd6fd73f9656',
+'1dd37b69db9cf4a7494697f1',
+'24a2f45f719e993e63adcf23',
+'cd4057acd7ab2b1909ade91e',
+'0695b866fc28c2a3390e8449',
+'1b0dd1dec270305c1a669ca8',
+'8e2916ef6b7bb91c15901210',
+'1930cb1a51265b09b0aaba99',
+'e1c43cb277d8c07146fbc6e1',
+'4c41bea823ee6791e83636bf752c1240',
+'17cb2e9e98b748b5ae0f7078ea5519e5',
+'9005e6ded766f31ca4277bb116c483cc',
+'9a148fc9f2372f9c07c328e832b96430',
+'85543d27b8a34ed9e222172ce308c672',
+'d9f1dbeb901ac73bab9b5d40065c21e6',
+'adbffa3c88f82e0991fe2128ba2798a6',
+'9411d3cf30e359f33328f80a07b7ba6d',
+'79fffaa6767b3bacde8078aabcfbda9b',
+'8aef0e90bd29fd1ad4d80c37e070dbf7',
+'11ddc4d89e463be1338373f0a1cb22f8',
+'7a5efb96b080064a05fd021e31f1dbc1',
+'c070e020d56f7e294f10fd586bc3e063',
+'3d866bc71d43209d97bb596fa59460c4',
+'15eec3c6d6f4e7f2b1426d01259ae8b6',
+'374c88f4480f5e8aaa9f448b777557c50065e9ac',
+'8c90480ea6414553df17e53cf96dcb166b94be35',
+'1b6a55344a48f62f8b351c69acb3a33b4c57c024',
+'7652e4b24051283af4caf67079955373f6604c9a',
+'8a536922cc905ed4c321180ebbf4f000e2a809fc',
+'9e35e4bc678997c18bfb39568e1f77cc49ad153e',
+'46d9d7c519e520029320b48451faed81f9112f44',
+'91bc355fb0221825307af876d11404b473222d5a',
+'f76d200078fb5b3d3aacc3d90efd4edc5612a777',
+'99fbfd85069f25da97f9621fff93ea599f61d0c2',
+'8da25f1b52990f59dad1405161c54eb148f002fb',
+'ed84ee8c4d99c5dbe7a253be436ac0c4e4b5e0bc',
+'7ab9416ae1d32bbbd13277aeda805d66b006461e',
+'ccf2155306cf89a73f55a0560d32337e266432af',
+'65437f28501640304b1ff95db6a6437cac37d10a',
+'e06c086d3434d79595d3',
+'2d0f6c935a06d9d48e10',
+'6cdbed1cff27b79ac20b',
+'bb7654e63c2ef4313c63',
+'df4a9f32c2b911138a7d',
+'9238de28fd468cc27d76',
+'65d6db01f95625fcb481',
+'c4953ddadc2acf38e677',
+'616a0dfee4c59643e047',
+'145ce9119643c0c9c23a',
+'0f6585d0203aedecad76',
+'fd4032c4adf2a19e69e5',
+'8e99a60f575dff478d99',
+'d52b5f1b01dc36d76d8e',
+'6ece755234adba6cd01a',
+'e685c26a4ef766a1ac244bf7',
+'3bf0f6f4ac757afb9deafdb3',
+'a8028cb31b89d1e668eb4196',
+'515a7febe556a317919eb3dc',
+'a3bc85d2694d7868120934ce',
+'03368545751957bda8ff9db3',
+'e2ac4a0e354277a62cc82573',
+'31a0920da97a3e94b151bfc8',
+'ea5be261fbfdf4e083358099',
+'96f596dc5ce8952cb2b0f914',
+'ab8810c9a05afb0169fd36df',
+'078437f1a1089c5724eebf2e',
+'a1147bb0ba909865a46b4720',
+'6eb55c6365a8957cf579ca2f',
+'9609b20113e61797397a428f',
+'f35a4323cab7ade7168c8b9f7276744e',
+'59a116a249eacaffc54498957787f8f4',
+'86d4b3a747285f26530e364b659a3c15',
+'924243335c2eebd348ea23efcb442cc3',
+'c05fea12c1594631fa9a5b7e35cc74e0',
+'34515b41c4af316223ae43e6869a38c1',
+'8bbe93e9a0e39128595251c7a0504f10',
+'b3d266e44d21fea613913002229b7994',
+'45d9e3d8155dd1d7aac1faa36827402d',
+'f5d0c72599bd5f8323a599ca7d2d54f1',
+'2c77d71152e343414dab1c83fc5f6429',
+'ddc60e14dc64399f48c2629cd9ef9551',
+'2c47a1dfc80df9195ccac2b006904088',
+'f253721edace08cccce596b231bdef4b',
+'32e3a37e8ca379cd7b604840059480d6',
+'15af23331648171499b58042dbe7b2d5df72d152',
+'5f7a57d42e3ebbcb85b08565304dab941d6234f3',
+'5921643e2713d10428843447df91f482f3922aeb',
+'3f74a3b2a77c173b8b6e20c2ededffd43103e4f6',
+'3b0ce0fd9eed9287527edb23c0ceaaee4026b570',
+'c6c30cc650546dee441ad83d2c01b0bb50319da0',
+'3e87e626a2014346f4d3b545f0c47043a657c82f',
+'46251e1b289f217c0b1f0f7dfd988aa62425efc6',
+'79cd6dd6ad3d3aaf11617b0a9303ed3645ab71b2',
+'cdae582296f2c18e05c47a2c3885b24e4976fd00',
+'d985cf29d85533af9b58113d7153732678830390',
+'790315ef7d9441b0ea3382471dd217dde2143788',
+'2258ded89a07b87e3397aa8a033f151e3c1a23a3',
+'43673696e3003a2a06ab0f4bf07870fca1b51415',
+'449121a13d619ca26cfd574204fc9643df12cc8b',
+'c73d3cf2bd6c5c9dcb91',
+'3b89bc8d9f3fbedb86a8',
+'d6d0b96cfd9fcbacd20a',
+'4fa9b60a5cde90c2c0a5',
+'b621d1fa15d9345096b2',
+'5686971a145ca79e0b63',
+'8ca1bbe34502616b975d',
+'970c9b7981a9b706806d',
+'fb8e0cd4a7656f1aa4da',
+'dc82b94bb291d36a94a6',
+'e61320faa6b1a7b6796d',
+'490d70fc32e3c5f6c17b',
+'e271addca04e8f983680',
+'e2280710a35f000d2ca5',
+'2a7d988c3a8ed31c16e5',
+'14ad915c8190567f889160f9',
+'43bf1001ad1f5c5adf0f59c2',
+'72ad19cc01c8933dc6a37cc5',
+'639410b3e778003a9d66c317',
+'ac6f7955adb9610c7a30a046',
+'abee151bbe2d515b07c63a23',
+'21b96662150e4f742128dfa3',
+'aaf4e6bc966753260f912e95',
+'6ea8c31c4035c2084be1743a',
+'07c6d34628e28c8ba39a619a',
+'ff39e0b4fd5cd0c40be32024',
+'a52411b649601f629bb75f5c',
+'2785abca097ad771fcaeed6e',
+'86d5e21fca7caf63426a9a4f',
+'0aa1a8368477289bdcd2bb2f',
+'76122c5582fea3b4f59181cb1d83a5ee',
+'87ae0952132a3b0583317997e5907ae4',
+'702a4317f0e27c16ad95ec8217917285',
+'dfc632da93cb1a878ae38c0cdf5db11a',
+'490c969829f9413c70287001488b0f18',
+'a7549bb8be315b3a8fd3e62c8d960758',
+'9d0b8ca2dfa14e8aea28a65698796da2',
+'0d5aed6fd871560f8123439d476e19bd',
+'f137933e9b264f559dfd0fc262a69c0f',
+'b4276d71392026f683012521bda55952',
+'6369914b2350ed960f0e8128c02f04c9',
+'d598d7af92d2d65d418a116484cdad9a',
+'0dfdb14b000d0420880f83192888bdea',
+'dba4d87dc72e6187afd8381a490b0d0d',
+'97f6e4631174e11964193a37a916f257',
+'62ac956ada19f04be50c23f2328a32477cd58fb9',
+'a279d055e2d73306a8187344fc32cb0b5b80cd35',
+'05598da96093f17687d9cca772ef61ea2af8ee40',
+'f174bb064880c9b111d71be221ceedd9add971ee',
+'2f5e0b070c0e268578ac6e868b364b144abf84ad',
+'4bbcf1bf06f47a720078e2a886d70c8e90ced8da',
+'2835d14142e4b662578b4c0879c1831bb7245a5c',
+'b8ffe657b108b8367502a28c0fa1d595ffa853b6',
+'7056292af9371cf9ad3e1b9c2743cbc1f52b4e16',
+'4dcd504d883e2b9d5d1e1ee15c0ff396f4d1c42b',
+'49d70fcedd5029673d8027f34a4282968237cfef',
+'e887df3367b67f8c9e7386d13d1a07a08de9ec68',
+'97284bd4e44b2e7a034a2f2795d70250ed5c84da',
+'0819f3d43c19965373a3fc72c446508c969d154e',
+'ad4892f36828b64ff5c3fc2dfd780dee39ea30d6',
+'7653dc1ca2b70f058614',
+'8db94baaaf03a51acc87',
+'670c4e2d2661928b8262',
+'e7007d2f4a194a8b8144',
+'b58e9dfdb9d88df4c71a',
+'97eb7dab4c4d89026158',
+'d56a5de69805f8a9906c',
+'583bc1ca3c68ecebd811',
+'d4225a4949faca02f3ef',
+'85a83e94fd8b941124e7',
+'9d835f06dd733eeca888',
+'be05ae222904afc2c266',
+'a5095b5f7a26ab55a37d',
+'51d76d949452cbf42262',
+'7832413077e6bc1ee994',
+'1d1d12f4ff4e0debb715b9cb',
+'b3ebb567bef1fea5d4f954bb',
+'243785864b714d4132b916a3',
+'3528e08689fac23da65b7024',
+'3f172df211dc9da262936060',
+'46a5b300d160deae52b0dc0a',
+'d012486da17a6c96d6ec6a85',
+'f5eddca9a528054bc587c7a0',
+'109f370cfa011ede8627fe4a',
+'3072ddb57d76181c164e08b8',
+'5b3a0278b3e71a3a93951b84',
+'994e9838eaa0bb1d6515c12a',
+'5a745e9ceda09b0332cb4cfe',
+'7f25062caa0a514034f793a6',
+'cf0b256cb91aeb1bf3877d4c',
+'a95cf7bb2f67983469d4fc489e3192d3',
+'0a060735b4799eeb204c5203e617a776',
+'d2f6e9f1ea2cbb0519df68fde357979c',
+'104ac1da3bc023eb3a94c45f7c42be51',
+'f72b19e31efa84db9775dcdab258b91a',
+'04d599b40b7623ca25c8ea694aec3afd',
+'7bf44b98d95c3a57d83f8e8bf82a1cb3',
+'69211fd5573b030e379f7661ae6e6d57',
+'85c9afe1502539c3140777de9b5afe35',
+'66aacb93fac3b3ab7f9a61ea907f863b',
+'5e671f68bee18089e4fb7fb8ce85e66d',
+'b1fbf176cb48f5a90db4af7a555a0c65',
+'d65dfc5a7d8477da3f29a4ea7809f265',
+'cb314cbfe1f935b03adb10e5a8b88c96',
+'548cba2de5c3944be4d48ec1a2a34d9e',
+'393238d3afdb7d970b966d374fe097ec8797a870',
+'0fdd3f836dd7e5c506ab21adde9ae5dc09cb359d',
+'090cedb3f2833a3f260b0937baae56267a6cd935',
+'ccbecd82cf4b29b535a9d57137b853076de78ddd',
+'d8013127f8491c97f1d5d275cabeb1ba3b71a2a4',
+'75cb23746c04f583b8ac78998537d98022ef2440',
+'d78807f2a69d8e348cbd2c2d745f342397e20a41',
+'9602a3a1fd2dc3c55df5815ac0517001f8c6593b',
+'b95df20e4e63936b74af4ceb7ad94d4e4b56ea8d',
+'5f009c918e2f8d7c9f9087b78af44f54518e1c5a',
+'f92f9c4b8d423b14ac7ad924f183a1cc27de6afd',
+'f476bd42bae22e645cedf601511b1ab8f2852b2c',
+'48d48ceb4c1f3e6b1e9c0fb8515f1121b846c19b',
+'9e51be58cf2d5c8e85556b8f3d484109fb49553a',
+'4ac41ab89f625c60125ed65ffa958c6b490ea670',
+];
diff --git a/mojo/public/dart/third_party/crypto/test/hmac_sha256_test.dart b/mojo/public/dart/third_party/crypto/test/hmac_sha256_test.dart
new file mode 100644
index 0000000..f2a7768
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/test/hmac_sha256_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Library tag to allow the test to run on Dartium.
+library hmac_sha256_test;
+
+import "package:crypto/crypto.dart";
+import "package:test/test.dart";
+
+part 'hmac_sha256_test_vectors.dart';
+
+void main() {
+  test('standard vectors', () {
+    _testStandardVectors(hmac_sha256_inputs, hmac_sha256_keys,
+        hmac_sha256_macs);
+  });
+}
+
+void _testStandardVectors(inputs, keys, macs) {
+  for (var i = 0; i < inputs.length; i++) {
+    var hmac = new HMAC(new SHA256(), keys[i]);
+    hmac.add(inputs[i]);
+    var d = hmac.close();
+    expect(CryptoUtils.bytesToHex(d), startsWith(macs[i]));
+  }
+}
diff --git a/mojo/public/dart/third_party/crypto/test/hmac_sha256_test_vectors.dart b/mojo/public/dart/third_party/crypto/test/hmac_sha256_test_vectors.dart
new file mode 100644
index 0000000..6cb65b1
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/test/hmac_sha256_test_vectors.dart
@@ -0,0 +1,692 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Standard test vectors from:
+//   http://csrc.nist.gov/groups/STM/cavp/documents/mac/hmactestvectors.zip
+
+part of hmac_sha256_test;
+
+const hmac_sha256_inputs = const [
+const [ 0x75, 0x2c, 0xff, 0x52, 0xe4, 0xb9, 0x07, 0x68, 0x55, 0x8e, 0x53, 0x69, 0xe7, 0x5d, 0x97, 0xc6, 0x96, 0x43, 0x50, 0x9a, 0x5e, 0x59, 0x04, 0xe0, 0xa3, 0x86, 0xcb, 0xe4, 0xd0, 0x97, 0x0e, 0xf7, 0x3f, 0x91, 0x8f, 0x67, 0x59, 0x45, 0xa9, 0xae, 0xfe, 0x26, 0xda, 0xea, 0x27, 0x58, 0x7e, 0x8d, 0xc9, 0x09, 0xdd, 0x56, 0xfd, 0x04, 0x68, 0x80, 0x5f, 0x83, 0x40, 0x39, 0xb3, 0x45, 0xf8, 0x55, 0xcf, 0xe1, 0x9c, 0x44, 0xb5, 0x5a, 0xf2, 0x41, 0xff, 0xf3, 0xff, 0xcd, 0x80, 0x45, 0xcd, 0x5c, 0x28, 0x8e, 0x6c, 0x4e, 0x28, 0x4c, 0x37, 0x20, 0x57, 0x0b, 0x58, 0xe4, 0xd4, 0x7b, 0x8f, 0xee, 0xed, 0xc5, 0x2f, 0xd1, 0x40, 0x1f, 0x69, 0x8a, 0x20, 0x9f, 0xcc, 0xfa, 0x3b, 0x4c, 0x0d, 0x9a, 0x79, 0x7b, 0x04, 0x6a, 0x27, 0x59, 0xf8, 0x2a, 0x54, 0xc4, 0x1c, 0xcd, 0x7b, 0x5f, 0x59, 0x2b ],
+const [ 0xe0, 0xef, 0xf0, 0x0f, 0x3c, 0x46, 0xe9, 0x6c, 0x8d, 0x5b, 0xd1, 0x81, 0x28, 0x3e, 0x46, 0x05, 0x34, 0x8e, 0x3f, 0xa1, 0x0b, 0x47, 0x94, 0x5d, 0xe3, 0xdc, 0xc1, 0x59, 0xae, 0x86, 0xe7, 0xbd, 0x3f, 0xdb, 0x13, 0xf2, 0xad, 0xa2, 0xc3, 0x13, 0xfc, 0xe6, 0xa6, 0x9e, 0xfa, 0x49, 0xa4, 0x70, 0x68, 0x9b, 0x1e, 0xf0, 0x5a, 0xab, 0x77, 0x8a, 0xe1, 0x5d, 0xd3, 0x5f, 0xe6, 0xfd, 0x1e, 0x3a, 0x59, 0xd3, 0x51, 0xc6, 0x8c, 0xf8, 0xf0, 0xff, 0xd9, 0x68, 0xd7, 0xe7, 0x8b, 0x57, 0x37, 0x7a, 0xfc, 0xc9, 0xdc, 0xe3, 0xfa, 0x5d, 0xb1, 0xf0, 0x6f, 0x69, 0x85, 0xc4, 0x41, 0x4c, 0x0f, 0xcc, 0x78, 0x00, 0x30, 0xf4, 0x9f, 0xef, 0x79, 0x1a, 0x6c, 0x08, 0xed, 0xc2, 0xa3, 0x11, 0x08, 0x0c, 0x37, 0x3f, 0x00, 0xe4, 0xb2, 0x04, 0x4a, 0x79, 0xd8, 0x28, 0x60, 0xf0, 0x87, 0x1b, 0xc2, 0x59 ],
+const [ 0xbf, 0xd1, 0x66, 0x79, 0x3a, 0xbd, 0xcf, 0xfb, 0xbd, 0x56, 0xdf, 0x76, 0x91, 0x50, 0xd1, 0x46, 0x6c, 0x18, 0xa6, 0x7a, 0xf4, 0x52, 0xc7, 0xe6, 0x7f, 0x86, 0xed, 0x74, 0x1d, 0x16, 0x3e, 0xbb, 0xd8, 0x74, 0xb9, 0xd3, 0x3a, 0x91, 0xd3, 0x67, 0x10, 0x99, 0x62, 0x0b, 0x6e, 0xdd, 0xbb, 0xd0, 0xf3, 0x11, 0x17, 0x16, 0x4e, 0xb7, 0x3c, 0xa2, 0x01, 0xdb, 0x59, 0xf1, 0x65, 0x01, 0x31, 0xcb, 0xef, 0x5c, 0x7b, 0x1b, 0xb1, 0x40, 0x89, 0xfd, 0x24, 0xda, 0x29, 0x19, 0x24, 0x1f, 0xc9, 0x30, 0x3c, 0x02, 0xde, 0xf4, 0x24, 0xea, 0x86, 0x1d, 0x88, 0x63, 0x6b, 0xb9, 0x0b, 0x13, 0xeb, 0xc3, 0x8c, 0xf1, 0x77, 0xf8, 0xa8, 0xb1, 0x39, 0xe6, 0x80, 0x82, 0xfa, 0x46, 0xbc, 0xfc, 0x42, 0x8b, 0xd0, 0x54, 0xc1, 0xbb, 0x7d, 0xd3, 0xed, 0x7e, 0x9b, 0x86, 0xed, 0x75, 0x17, 0x36, 0xb6, 0xcc ],
+const [ 0xf6, 0x98, 0x9e, 0xbb, 0x07, 0xaa, 0xda, 0xee, 0xf9, 0x70, 0xf0, 0xb5, 0xce, 0xb8, 0x06, 0xec, 0xff, 0xe7, 0x7c, 0xc2, 0x0f, 0x3c, 0x22, 0x1a, 0x66, 0x59, 0xa9, 0x31, 0x5d, 0xff, 0x58, 0x81, 0x96, 0x19, 0x00, 0xe6, 0x8e, 0xfc, 0x32, 0x00, 0x75, 0xed, 0xaf, 0xd8, 0x3d, 0xe3, 0x20, 0xc6, 0xf1, 0x8f, 0x08, 0x92, 0x48, 0x9a, 0xf6, 0xd9, 0x7a, 0x2e, 0xff, 0xb2, 0x52, 0xb7, 0x6b, 0x92, 0x84, 0xeb, 0xaf, 0x6d, 0x42, 0x08, 0x9c, 0x1e, 0x0a, 0x5c, 0xd5, 0x09, 0xc2, 0x0b, 0x86, 0xff, 0x06, 0x0d, 0x53, 0x62, 0xc1, 0x76, 0x8f, 0x89, 0xfa, 0xfa, 0xaf, 0x65, 0xf1, 0xb0, 0xfe, 0x65, 0x6b, 0x16, 0x92, 0x98, 0x4a, 0x56, 0x7e, 0x12, 0x60, 0xc7, 0x49, 0x90, 0x85, 0xb7, 0x9f, 0x5f, 0xe7, 0x68, 0x47, 0x79, 0xa2, 0x58, 0x55, 0xf2, 0x91, 0xc5, 0xa1, 0x92, 0x63, 0x71, 0x77, 0xc4 ],
+const [ 0x71, 0x29, 0x9c, 0xa3, 0xda, 0xff, 0x23, 0x31, 0x08, 0x2d, 0xb3, 0x70, 0xbd, 0xf8, 0xce, 0xec, 0x22, 0x7b, 0x71, 0xbd, 0xc4, 0x9c, 0x3b, 0x14, 0xdc, 0x3f, 0xd2, 0x13, 0xd3, 0xba, 0x83, 0xe2, 0x05, 0x88, 0x28, 0xff, 0xc6, 0x41, 0x4f, 0xd5, 0xa2, 0xc9, 0x98, 0x91, 0xe9, 0xc8, 0x5f, 0x31, 0x6c, 0x5b, 0x9b, 0xdd, 0x81, 0x0a, 0x06, 0x7b, 0x4d, 0xf9, 0x7f, 0x7e, 0x42, 0x62, 0xac, 0xfe, 0xe6, 0x42, 0xe3, 0x0e, 0xd6, 0x53, 0x4b, 0x4a, 0x0b, 0x3b, 0x3e, 0xaf, 0x5d, 0x03, 0xf2, 0xb0, 0x45, 0xca, 0x59, 0x85, 0xe7, 0xbb, 0x45, 0xc7, 0x50, 0x3c, 0xd0, 0x3a, 0xfc, 0x68, 0xfb, 0xea, 0x9b, 0xc0, 0x95, 0x79, 0x14, 0x1d, 0x5f, 0xb7, 0xcb, 0xea, 0x6d, 0x73, 0x20, 0x8f, 0xcf, 0x91, 0x38, 0x30, 0x71, 0x5d, 0xff, 0x98, 0x40, 0x1f, 0x6d, 0x70, 0x8e, 0xf0, 0x09, 0xb5, 0xb8, 0xcb ],
+const [ 0x8b, 0x4a, 0xa2, 0x0d, 0xe6, 0xc1, 0xf0, 0x51, 0xd1, 0x1a, 0xd5, 0x0b, 0xa2, 0xe4, 0xfc, 0x4f, 0xf1, 0xec, 0x47, 0x84, 0x55, 0xf9, 0xb5, 0xb9, 0x6f, 0xb9, 0x89, 0x3d, 0x2a, 0xfc, 0xa9, 0x69, 0x40, 0x20, 0x44, 0xc1, 0x01, 0xcc, 0xb7, 0x3c, 0x50, 0xe2, 0xb2, 0xdf, 0xee, 0xae, 0x96, 0x90, 0xfb, 0x64, 0x22, 0x2a, 0xb9, 0xc9, 0x4f, 0xcd, 0x94, 0x30, 0x78, 0x78, 0x5f, 0xa8, 0xbe, 0xd9, 0xe1, 0x74, 0xab, 0x63, 0x90, 0xbb, 0x16, 0xa2, 0x9c, 0x81, 0x46, 0xcb, 0x2f, 0xd6, 0x5a, 0x98, 0xf4, 0x4d, 0xe7, 0x52, 0xd6, 0xb0, 0xe4, 0x2f, 0x0a, 0xf2, 0xc3, 0xdf, 0x4f, 0x65, 0xe1, 0x62, 0x74, 0x2d, 0x20, 0x1c, 0x1b, 0xf5, 0xd2, 0x2b, 0xbe, 0xe1, 0xda, 0xf8, 0xef, 0xc3, 0x0d, 0x0c, 0xe4, 0x91, 0xdf, 0x26, 0x32, 0x17, 0x3b, 0x8a, 0xd9, 0xe9, 0xb2, 0x9b, 0x81, 0x9c, 0xd8, 0xac ],
+const [ 0x32, 0x74, 0xa0, 0x32, 0x66, 0x82, 0xba, 0x59, 0xd6, 0xc4, 0x7d, 0xb4, 0x16, 0x4e, 0x3e, 0x99, 0x37, 0xbf, 0xad, 0x41, 0x99, 0xc6, 0x50, 0x71, 0x01, 0xe5, 0x30, 0x5a, 0xeb, 0x75, 0xd2, 0xbf, 0x22, 0xeb, 0x68, 0x55, 0x8d, 0x59, 0x49, 0x6f, 0x4c, 0x38, 0x9f, 0xda, 0x04, 0x64, 0x5f, 0x06, 0x76, 0x68, 0x7f, 0x67, 0x57, 0xfc, 0x63, 0x1b, 0x5b, 0xcc, 0x98, 0xcd, 0x94, 0x7b, 0xc4, 0xd9, 0xfa, 0xe8, 0xdd, 0xb1, 0x4b, 0xb0, 0x9a, 0x7f, 0x15, 0xf4, 0x27, 0x0c, 0x10, 0x5c, 0x1d, 0xe0, 0xb2, 0x5b, 0xb1, 0xab, 0xfe, 0xb5, 0x2c, 0xe3, 0x9d, 0x3f, 0x9b, 0xaf, 0x2f, 0xe6, 0xc7, 0x04, 0xe3, 0xf3, 0x67, 0x0d, 0x45, 0x8e, 0x95, 0xd1, 0x58, 0x80, 0x7f, 0x10, 0xe5, 0x3d, 0x5f, 0x6d, 0x12, 0x21, 0xad, 0xd3, 0x36, 0xfa, 0x92, 0x11, 0xec, 0xc7, 0xa1, 0xc7, 0x67, 0xbf, 0xc2, 0x86 ],
+const [ 0x04, 0x86, 0xd2, 0x64, 0x7e, 0x2c, 0xdf, 0x7b, 0xba, 0x36, 0xc8, 0xf3, 0xff, 0x9e, 0x29, 0x41, 0x00, 0x1c, 0x70, 0x6e, 0xb1, 0xa4, 0x4c, 0xbd, 0x58, 0x2f, 0x63, 0x8e, 0xe7, 0xbe, 0x44, 0x82, 0x89, 0x9c, 0x9c, 0xe0, 0x7b, 0xe4, 0xac, 0x38, 0x1d, 0x44, 0xfa, 0x46, 0x49, 0x00, 0x47, 0x18, 0xe3, 0x3a, 0xc2, 0x73, 0xb1, 0x70, 0x7b, 0x74, 0x6d, 0x46, 0x1a, 0x73, 0x19, 0x86, 0xd1, 0x2c, 0x93, 0x65, 0x8f, 0x21, 0x69, 0x08, 0x77, 0x3a, 0xee, 0x46, 0x90, 0xaf, 0x8e, 0xb0, 0xbe, 0x27, 0x5e, 0xce, 0xf1, 0x22, 0xf7, 0xac, 0x9c, 0x94, 0x85, 0x95, 0x69, 0xd2, 0x1b, 0x1f, 0x2b, 0xb2, 0x4a, 0x68, 0x13, 0xee, 0xf1, 0x9e, 0x28, 0xca, 0x56, 0xc5, 0xf1, 0xf7, 0x76, 0xb4, 0x74, 0xb6, 0x9a, 0x61, 0x65, 0x41, 0x2b, 0x5f, 0x97, 0x66, 0xc7, 0xa5, 0xb6, 0x75, 0x94, 0x91, 0x38, 0x5c ],
+const [ 0xfd, 0x5c, 0xf7, 0x2e, 0xe0, 0x77, 0x9a, 0xab, 0x7d, 0xaa, 0x27, 0xd5, 0xc8, 0xa8, 0xd3, 0x1f, 0x40, 0x82, 0xba, 0x47, 0x74, 0x1e, 0x7e, 0x73, 0xc6, 0xe6, 0x31, 0x80, 0x6f, 0xbd, 0x75, 0x97, 0xc3, 0x37, 0xe1, 0x01, 0xb6, 0x09, 0xa7, 0x3c, 0xa0, 0xbe, 0x74, 0x4e, 0x3d, 0xac, 0x98, 0x59, 0xf8, 0x27, 0x67, 0x70, 0x69, 0xf4, 0xdf, 0xa9, 0x1c, 0x00, 0x8b, 0x73, 0x94, 0x52, 0xa6, 0x2a, 0x8f, 0x3f, 0x84, 0xe9, 0x8c, 0xdd, 0x2e, 0xa0, 0x8b, 0xba, 0x4d, 0x66, 0x14, 0xcd, 0x49, 0x10, 0x7a, 0xac, 0xb1, 0x02, 0x61, 0x00, 0xde, 0x45, 0x7e, 0x36, 0xd3, 0xda, 0x9e, 0x78, 0x68, 0x4e, 0xea, 0xdc, 0xa8, 0x8f, 0x69, 0xdb, 0x77, 0xfe, 0xc6, 0x04, 0x78, 0xc5, 0x54, 0xf1, 0x2d, 0x6b, 0x4f, 0x7b, 0x60, 0xa6, 0x65, 0x2a, 0xc2, 0x70, 0x74, 0xef, 0xd3, 0x5c, 0x96, 0x16, 0x01, 0x2b ],
+const [ 0x31, 0xf5, 0x1d, 0x39, 0x5a, 0x06, 0x88, 0x5e, 0xfc, 0x34, 0x03, 0x23, 0x49, 0xbc, 0x63, 0x5c, 0xd4, 0xb1, 0x00, 0x4c, 0xea, 0xfc, 0xb1, 0xc4, 0x26, 0xa2, 0xf8, 0x8b, 0x40, 0x45, 0x79, 0x02, 0x26, 0xee, 0xb1, 0x08, 0x4e, 0x09, 0xe4, 0x1c, 0x4a, 0xb1, 0x57, 0xc1, 0x9d, 0x2e, 0xc0, 0x27, 0xcd, 0xbc, 0xfb, 0x07, 0xb9, 0x8e, 0xfe, 0xcf, 0x2d, 0x13, 0x0f, 0xff, 0xb4, 0x78, 0x35, 0xd3, 0xad, 0x6e, 0xec, 0x22, 0xa1, 0x2d, 0x1c, 0x86, 0xd4, 0xb9, 0x4c, 0xbd, 0x1a, 0x64, 0x13, 0x4f, 0xec, 0x94, 0xd0, 0x71, 0xbb, 0xc6, 0x9b, 0x2a, 0x84, 0xd3, 0x7c, 0xb4, 0xa5, 0x72, 0xda, 0x25, 0xef, 0xff, 0x36, 0x4f, 0xfc, 0x7b, 0x19, 0xe4, 0xc3, 0xd3, 0x4a, 0xde, 0x69, 0x65, 0x45, 0x1d, 0x5b, 0xc0, 0xe9, 0x52, 0x99, 0xab, 0x71, 0x1d, 0x55, 0x6a, 0xa5, 0x72, 0xbc, 0x3c, 0x51, 0x41 ],
+const [ 0x48, 0xbd, 0xae, 0x9d, 0x81, 0xf1, 0xbe, 0xac, 0xcf, 0xd0, 0x03, 0x74, 0xf5, 0x22, 0xf9, 0x0c, 0xfe, 0xdd, 0x8e, 0x3d, 0xd9, 0x3b, 0xe1, 0x39, 0x47, 0x10, 0x4a, 0x89, 0xf7, 0x5b, 0x9a, 0x48, 0xee, 0x1b, 0xa4, 0x8f, 0x2d, 0x64, 0xfc, 0x30, 0x8e, 0xb1, 0xfe, 0xa7, 0xf0, 0x7c, 0x12, 0x4d, 0x93, 0x0c, 0x2f, 0xcf, 0xc5, 0x8f, 0x9e, 0xdf, 0xbf, 0x68, 0x01, 0x29, 0xca, 0xca, 0x93, 0x89, 0xa6, 0x86, 0xb1, 0x7b, 0x2b, 0x21, 0x9a, 0xd3, 0x31, 0x2a, 0x73, 0xae, 0xae, 0xca, 0x8e, 0xa8, 0x1e, 0x9d, 0xeb, 0x4f, 0x28, 0xc0, 0xff, 0xd8, 0x7e, 0x2c, 0xb5, 0x11, 0x05, 0x42, 0xb3, 0x97, 0x36, 0xa6, 0xde, 0x49, 0xc4, 0x51, 0x20, 0xfc, 0x7e, 0xe2, 0x69, 0x71, 0x78, 0x35, 0xf3, 0x84, 0x65, 0x37, 0xcb, 0xa5, 0x48, 0xf9, 0x8d, 0x8c, 0x4c, 0x03, 0x6e, 0x29, 0xef, 0xea, 0x80, 0xda ],
+const [ 0x1e, 0x1b, 0xda, 0xa9, 0x84, 0xca, 0x68, 0x73, 0x0f, 0xaf, 0x61, 0xc6, 0x97, 0xd5, 0xfb, 0x15, 0x95, 0x5b, 0x28, 0x99, 0x2d, 0x69, 0xba, 0xe8, 0x6c, 0x68, 0xcb, 0xc9, 0xce, 0x73, 0x5c, 0x47, 0x03, 0x08, 0x3c, 0x04, 0xf2, 0x04, 0x2c, 0xd0, 0xff, 0xce, 0x40, 0x7a, 0x89, 0xd2, 0x88, 0xe6, 0xb7, 0x31, 0xf0, 0x60, 0x75, 0xb6, 0x65, 0x30, 0xb9, 0x0d, 0x39, 0x6f, 0x0b, 0x2f, 0xc9, 0x19, 0x44, 0x21, 0x5d, 0x63, 0x96, 0xde, 0x4f, 0x4e, 0xcc, 0x92, 0x70, 0x7c, 0xd3, 0x08, 0xa7, 0x42, 0x7a, 0x66, 0xdb, 0x00, 0x76, 0x18, 0x13, 0xad, 0xa9, 0x0a, 0xdc, 0xb6, 0xa4, 0x1a, 0xec, 0x09, 0x6a, 0xcd, 0x04, 0x6c, 0x76, 0x40, 0x1b, 0x14, 0x00, 0x62, 0xb8, 0x73, 0x7d, 0x61, 0xa0, 0x51, 0x65, 0x62, 0xb1, 0x1e, 0x38, 0x75, 0x0e, 0x87, 0xc3, 0xc8, 0x7c, 0x47, 0xa0, 0x1b, 0x0c, 0x40 ],
+const [ 0x49, 0x07, 0x00, 0xea, 0x58, 0x7a, 0x00, 0x1c, 0x71, 0x62, 0xf0, 0x94, 0x6f, 0x7c, 0xa6, 0xa5, 0xe3, 0x65, 0x5c, 0x6e, 0x09, 0xba, 0x4c, 0x13, 0xfa, 0x7e, 0x7d, 0x4e, 0x22, 0xbc, 0xdc, 0x27, 0xf5, 0x6d, 0x8e, 0xff, 0xde, 0x9b, 0x85, 0xd3, 0x78, 0xc7, 0x51, 0xbf, 0x01, 0x89, 0x39, 0xc1, 0x0c, 0x76, 0x8b, 0xc0, 0x75, 0x46, 0x30, 0xcd, 0x9a, 0x37, 0x83, 0xa8, 0xc8, 0xac, 0x64, 0x86, 0xf4, 0x1a, 0x87, 0x11, 0xac, 0x24, 0x12, 0xb1, 0x4d, 0x05, 0x68, 0x0a, 0x75, 0x2f, 0x3f, 0xc6, 0xbb, 0x31, 0xf9, 0x94, 0x9e, 0xde, 0x31, 0x70, 0xbc, 0xac, 0x94, 0x26, 0x45, 0x5a, 0xf2, 0x11, 0xae, 0xd6, 0x94, 0x29, 0xaa, 0x5d, 0xd1, 0x3d, 0x56, 0xe4, 0xdc, 0x7c, 0xb3, 0xb7, 0xe0, 0x3a, 0x5a, 0x60, 0x4f, 0xf1, 0x6b, 0xca, 0x77, 0x86, 0xc7, 0xa6, 0x56, 0xce, 0x7f, 0x0e, 0xaf, 0x51 ],
+const [ 0x5b, 0xc9, 0x3a, 0x65, 0x5f, 0x35, 0xd3, 0x46, 0xf9, 0xe9, 0x6e, 0x96, 0xe9, 0xbb, 0x56, 0x01, 0x78, 0xda, 0xd0, 0x4e, 0xa4, 0x62, 0x59, 0x91, 0x7d, 0x2d, 0x30, 0xa2, 0xcf, 0xed, 0x14, 0xcd, 0x01, 0x77, 0x4f, 0xcb, 0x3d, 0x62, 0xf3, 0xf1, 0xd2, 0xd1, 0x64, 0xa8, 0xd6, 0x8d, 0x16, 0x1d, 0x0f, 0x57, 0x98, 0x3a, 0x14, 0x7c, 0xd2, 0xd4, 0xaf, 0xa9, 0x8b, 0x26, 0x86, 0x01, 0x2e, 0x7e, 0xfa, 0x6d, 0xcd, 0x36, 0x50, 0x33, 0x66, 0xe6, 0x0e, 0xcb, 0x65, 0xd8, 0xa8, 0xee, 0x6b, 0xbc, 0x5c, 0xef, 0x4e, 0x9d, 0x5b, 0x4e, 0x61, 0x14, 0x29, 0x8b, 0xf5, 0xbc, 0x46, 0x38, 0x1f, 0xe5, 0x0e, 0x52, 0xbc, 0x8d, 0xde, 0xd1, 0xb3, 0x8c, 0x78, 0x7e, 0x7a, 0x0e, 0xa9, 0x05, 0xdc, 0x46, 0x29, 0x4b, 0xf9, 0x61, 0xc2, 0x01, 0x8e, 0xb9, 0xb4, 0x7a, 0x76, 0x4c, 0x59, 0xb9, 0x71, 0x6c ],
+const [ 0xb7, 0x33, 0xd5, 0x1a, 0x7e, 0xaa, 0x4b, 0x6b, 0xb0, 0xe3, 0x78, 0xa2, 0x18, 0xca, 0xa6, 0xae, 0x74, 0x75, 0xa3, 0xf3, 0x29, 0x09, 0x18, 0x4d, 0x34, 0xd7, 0x16, 0x52, 0x64, 0xcb, 0xf2, 0xd8, 0xc6, 0x07, 0x53, 0xb8, 0x61, 0xcb, 0x89, 0xd1, 0x24, 0x98, 0x20, 0x4f, 0x1d, 0x95, 0xb5, 0x2d, 0xec, 0x31, 0x09, 0xf8, 0x76, 0x0a, 0x54, 0xd6, 0xde, 0x0e, 0xdc, 0xc8, 0xb1, 0xdf, 0xc5, 0x2c, 0x60, 0x7c, 0x2b, 0x86, 0xf4, 0x1f, 0x6e, 0x7f, 0xfd, 0x61, 0xcd, 0x2e, 0xcb, 0xa4, 0x37, 0x97, 0xe1, 0xb2, 0x5d, 0x71, 0xa7, 0xa2, 0x0c, 0x2d, 0x5f, 0xfc, 0xba, 0x33, 0x5a, 0x1d, 0x5f, 0x6f, 0x6c, 0xdc, 0x86, 0x0c, 0x9d, 0x6d, 0xa3, 0x7f, 0x21, 0x86, 0xa7, 0xc8, 0x8b, 0xc1, 0xd2, 0xf4, 0x3d, 0x42, 0xc8, 0xe7, 0x23, 0x99, 0xe8, 0x58, 0xa1, 0xe9, 0xd9, 0x1d, 0xc9, 0x4a, 0x65, 0xa9 ],
+const [ 0x0c, 0x29, 0x4a, 0x31, 0x8b, 0x7c, 0x1e, 0x88, 0x46, 0x49, 0xfe, 0x54, 0xe4, 0xa8, 0x72, 0x85, 0xe4, 0x2f, 0x86, 0x8e, 0x3d, 0x0a, 0x85, 0x19, 0x41, 0x4e, 0x05, 0xf9, 0xc7, 0x8b, 0x23, 0x60, 0x89, 0xa1, 0x10, 0x52, 0xcb, 0xd4, 0xcd, 0x59, 0x3e, 0x22, 0x32, 0x7b, 0x23, 0xd3, 0x35, 0x69, 0xb3, 0x53, 0x69, 0xf9, 0xbf, 0x3d, 0xc5, 0xd6, 0x94, 0xb8, 0xa7, 0x76, 0x21, 0x06, 0x18, 0x4d, 0x5c, 0x5a, 0x52, 0x41, 0xe1, 0xea, 0x80, 0x5d, 0xdc, 0x46, 0xc4, 0xc9, 0x2a, 0xe8, 0x7e, 0xfa, 0xbb, 0x0c, 0xcc, 0x26, 0x3b, 0xc2, 0x4d, 0xfb, 0xf1, 0x41, 0x2b, 0x90, 0xe7, 0x7e, 0x58, 0x9c, 0x4b, 0xfd, 0x17, 0xe6, 0x15, 0xe7, 0xbf, 0xfc, 0xea, 0x5e, 0xbb, 0x28, 0x40, 0x0d, 0xd6, 0xa0, 0xc4, 0x03, 0xb6, 0xfd, 0xf8, 0xc1, 0xa5, 0xee, 0x21, 0x91, 0x98, 0x2e, 0x60, 0x1a, 0x69, 0xb3 ],
+const [ 0xd6, 0x08, 0x12, 0x43, 0x30, 0x98, 0xc4, 0x46, 0x23, 0x15, 0x91, 0x53, 0xde, 0x7c, 0xd2, 0x72, 0x1b, 0x34, 0x9f, 0x68, 0x5c, 0x43, 0x38, 0x8a, 0x74, 0xc2, 0xa3, 0xd0, 0x4a, 0x8e, 0x97, 0x2a, 0xda, 0x41, 0x99, 0x17, 0x7c, 0x61, 0x65, 0x73, 0x69, 0xd7, 0x8f, 0x90, 0x7b, 0xa2, 0x6a, 0x89, 0x34, 0xcc, 0x29, 0xd3, 0x02, 0x9d, 0x44, 0x15, 0xc1, 0x10, 0x1e, 0x3a, 0x82, 0x83, 0xe4, 0xc4, 0x8b, 0xb2, 0xb8, 0x63, 0x9f, 0xe6, 0x0f, 0xc6, 0x7f, 0x6a, 0x57, 0xb1, 0xb0, 0x3f, 0xde, 0x50, 0x7f, 0x10, 0xef, 0xcb, 0x43, 0x68, 0x3e, 0x1a, 0xe2, 0x23, 0x85, 0x1b, 0x96, 0x23, 0x70, 0xe1, 0xf1, 0x44, 0xb7, 0x4f, 0x1f, 0x91, 0x89, 0xe6, 0x6c, 0xb8, 0x31, 0xdc, 0x05, 0xbb, 0xf4, 0x6e, 0x03, 0xe9, 0x38, 0x77, 0xa5, 0x0d, 0xec, 0x40, 0xdd, 0xe5, 0x23, 0x9a, 0x0f, 0xd5, 0x02, 0x2a ],
+const [ 0x3d, 0xb0, 0x52, 0x69, 0x5a, 0x59, 0x98, 0x13, 0x30, 0x9f, 0xae, 0x5c, 0xf5, 0xb1, 0x96, 0x90, 0xd3, 0xe1, 0xe6, 0x3b, 0x3c, 0xaa, 0xc1, 0x48, 0x7e, 0xf1, 0x07, 0x66, 0x97, 0x8b, 0xc9, 0xb0, 0x4a, 0x00, 0x00, 0x8c, 0x72, 0x8e, 0x7e, 0xd3, 0x97, 0x71, 0x24, 0x33, 0xbf, 0x62, 0x56, 0xd2, 0x86, 0x5e, 0xac, 0x34, 0x71, 0xa8, 0xea, 0x5f, 0x80, 0x11, 0x33, 0x3d, 0x02, 0x77, 0x79, 0x41, 0xad, 0x8c, 0x38, 0x4d, 0xee, 0xd8, 0x64, 0xd4, 0x7e, 0x02, 0xa0, 0x3c, 0x36, 0x4b, 0xb0, 0x86, 0x24, 0x5b, 0x31, 0x30, 0xde, 0x40, 0x87, 0x5a, 0x16, 0xb4, 0x18, 0x29, 0x6f, 0x9e, 0xb8, 0x69, 0x8f, 0xdc, 0x63, 0x76, 0x76, 0x40, 0x32, 0x5c, 0x0e, 0xd8, 0x88, 0x3d, 0x03, 0x73, 0x8c, 0xf3, 0xd4, 0x60, 0xdd, 0xf7, 0x2b, 0x79, 0x81, 0x81, 0x6a, 0x61, 0x1e, 0xf1, 0x86, 0x09, 0x6c, 0x6e ],
+const [ 0x9a, 0xe4, 0xb7, 0x99, 0x98, 0x9b, 0xc1, 0x32, 0xe5, 0xa5, 0x0c, 0x4f, 0xce, 0x6d, 0x6e, 0x44, 0xe2, 0x94, 0x0c, 0x6b, 0xa7, 0xdb, 0xb8, 0x24, 0x8b, 0x44, 0x7d, 0x19, 0x1d, 0x74, 0x77, 0xc7, 0x7d, 0x5c, 0xe8, 0x3a, 0x11, 0x18, 0x89, 0x17, 0x7a, 0x17, 0x1e, 0xe0, 0xc7, 0x7d, 0x4d, 0x74, 0xe8, 0xc5, 0xb0, 0xd5, 0x65, 0xab, 0x29, 0x2e, 0x50, 0x49, 0x76, 0x15, 0x78, 0x80, 0x05, 0x0d, 0xdf, 0x99, 0x09, 0x4f, 0x6e, 0x2c, 0xcd, 0xca, 0xe8, 0x41, 0x48, 0x68, 0x1d, 0xb6, 0xf3, 0x93, 0x60, 0xe1, 0xd7, 0xf8, 0x3a, 0x75, 0xea, 0x8a, 0x60, 0xaa, 0x9b, 0xca, 0xe3, 0x98, 0xac, 0x46, 0xa7, 0xe4, 0x40, 0x60, 0x16, 0x9f, 0x35, 0x51, 0x15, 0x6b, 0xb3, 0x6e, 0x37, 0xe0, 0x05, 0xa9, 0x31, 0x2e, 0xa8, 0x5a, 0x8f, 0x03, 0xa2, 0x40, 0xa5, 0xaf, 0x15, 0xc2, 0xc7, 0x86, 0x14, 0x7b ],
+const [ 0x00, 0x9f, 0x5e, 0x39, 0x94, 0x30, 0x03, 0x82, 0x50, 0x72, 0x1b, 0xe1, 0x79, 0x65, 0x35, 0xff, 0x21, 0xa6, 0x09, 0xfd, 0xf9, 0xf0, 0xf6, 0x12, 0x66, 0xe3, 0xaf, 0x75, 0xd7, 0x04, 0x31, 0x7d, 0x55, 0x06, 0xf8, 0x06, 0x5c, 0x48, 0x72, 0x18, 0xe9, 0x9e, 0xb4, 0xc3, 0xd4, 0x54, 0x6c, 0x4d, 0x60, 0x70, 0x16, 0x90, 0x11, 0x38, 0x73, 0x9d, 0xbd, 0xf4, 0x37, 0xa5, 0xe6, 0xf5, 0x02, 0x1a, 0x47, 0xd6, 0x92, 0x11, 0xad, 0x02, 0x37, 0xeb, 0x08, 0x76, 0x87, 0x34, 0xc2, 0xc9, 0x52, 0xcb, 0x4f, 0x69, 0xd9, 0x43, 0x06, 0x27, 0x3a, 0x8a, 0x2f, 0xf6, 0x2f, 0xc8, 0x5d, 0xef, 0xf8, 0x8a, 0xfe, 0x99, 0x96, 0x20, 0x30, 0x68, 0x3a, 0x43, 0xd6, 0x83, 0xfd, 0xfc, 0xeb, 0xca, 0xd1, 0xc1, 0x17, 0x18, 0xb8, 0xe0, 0x80, 0xc5, 0x34, 0x21, 0xe3, 0x70, 0xfe, 0xa6, 0xe3, 0xfb, 0xfa, 0x17 ],
+const [ 0x1d, 0xd2, 0x87, 0x56, 0xd2, 0x92, 0xe5, 0xa4, 0xf3, 0x53, 0x7e, 0x88, 0x77, 0x79, 0x33, 0x33, 0x5a, 0x64, 0xf7, 0x9a, 0x4d, 0x50, 0x25, 0x7a, 0xac, 0x79, 0x17, 0x99, 0xb0, 0x83, 0xf4, 0x50, 0xe6, 0x1a, 0xc9, 0x46, 0xdf, 0xd6, 0xdc, 0x7e, 0x29, 0x61, 0x3d, 0x94, 0x7f, 0xdb, 0x9d, 0x43, 0x3d, 0x7d, 0x63, 0x2b, 0x17, 0x7d, 0xfd, 0xd1, 0x09, 0x32, 0x74, 0xe8, 0x91, 0x79, 0x44, 0xcf, 0x1d, 0x57, 0x6a, 0x5a, 0xbf, 0xe0, 0xbe, 0xd5, 0x28, 0x57, 0x83, 0x46, 0xd4, 0x96, 0x3d, 0xf3, 0x82, 0xb0, 0xc2, 0x24, 0xe7, 0xd6, 0x94, 0x2a, 0xa3, 0x77, 0x6e, 0xa0, 0x74, 0xab, 0x1d, 0xf1, 0xaa, 0xd2, 0x91, 0x1b, 0xdb, 0x78, 0x34, 0xb2, 0xd7, 0x7d, 0x7b, 0x27, 0xde, 0x72, 0xba, 0x4a, 0x11, 0x45, 0x3c, 0x0e, 0x27, 0x21, 0x93, 0x8c, 0x61, 0x90, 0x2d, 0x4b, 0xc0, 0xe3, 0x28, 0xbf ],
+const [ 0x0c, 0x24, 0x5d, 0xe3, 0xb2, 0x50, 0xc3, 0x32, 0x82, 0xea, 0x1a, 0x02, 0xd0, 0x07, 0xf0, 0x3b, 0x34, 0xed, 0x42, 0x76, 0x31, 0x28, 0x3e, 0xb6, 0x14, 0xdb, 0x4d, 0x52, 0x1f, 0x55, 0x51, 0x36, 0xe7, 0xe4, 0x2b, 0x4c, 0xfb, 0xee, 0x81, 0x34, 0xc6, 0x3d, 0xbe, 0x3b, 0xb7, 0x9b, 0x5a, 0x8b, 0x9f, 0x9f, 0x5b, 0x9f, 0x5a, 0xc6, 0x1c, 0xfa, 0xb1, 0xc5, 0x4d, 0x19, 0x7f, 0x1e, 0x3b, 0xa6, 0x13, 0xf2, 0x51, 0xee, 0xd6, 0x16, 0xdf, 0x95, 0x2d, 0x69, 0x1b, 0x88, 0xa1, 0x64, 0x66, 0x34, 0x3e, 0xf2, 0xd0, 0xf6, 0x38, 0x82, 0xdd, 0xd2, 0xd5, 0x5b, 0x8a, 0x67, 0x86, 0x30, 0x8b, 0x22, 0x57, 0xf5, 0xd7, 0xb3, 0x8a, 0xf1, 0x66, 0xbd, 0x7f, 0x13, 0x39, 0xd2, 0xd8, 0x89, 0x9c, 0x9e, 0xda, 0x8f, 0xa8, 0x62, 0x15, 0x85, 0x0b, 0xa5, 0x47, 0x45, 0x0c, 0x26, 0x7e, 0xb3, 0xc9, 0x14 ],
+const [ 0xd1, 0x06, 0xa9, 0xae, 0xc4, 0x42, 0xfe, 0xd6, 0x16, 0x29, 0xe7, 0x75, 0x66, 0xf7, 0x89, 0xb2, 0x8c, 0x2c, 0x2c, 0x3e, 0xc6, 0x28, 0x87, 0x8a, 0x12, 0xf7, 0x3d, 0x37, 0xda, 0x6e, 0xa7, 0xce, 0xd6, 0x77, 0xd4, 0xb1, 0x2f, 0xa9, 0xce, 0x51, 0xe0, 0x1c, 0x1f, 0xa2, 0x62, 0x7b, 0x94, 0xcc, 0x88, 0x5a, 0x41, 0x24, 0xa8, 0xca, 0xc5, 0x5a, 0xfb, 0x2b, 0xd0, 0xf3, 0x46, 0x42, 0xe2, 0xfa, 0xba, 0x8c, 0x55, 0xf3, 0x19, 0xd1, 0x9d, 0x11, 0x1b, 0xfb, 0xcf, 0xa9, 0x10, 0x29, 0x60, 0xe5, 0xc6, 0x00, 0x2f, 0xbd, 0xad, 0x41, 0xc6, 0x23, 0x39, 0xa1, 0xdd, 0x7e, 0x88, 0xd5, 0x20, 0x5a, 0x45, 0xec, 0x33, 0x5e, 0xcc, 0xe1, 0xf2, 0x7e, 0x8f, 0x71, 0xfd, 0x72, 0xb8, 0x2a, 0x74, 0x66, 0x10, 0xc5, 0xff, 0xf3, 0x1f, 0xb5, 0x12, 0x4e, 0x95, 0x00, 0x6f, 0xbf, 0xe8, 0x4e, 0xec, 0x55 ],
+const [ 0x96, 0x56, 0x0a, 0x07, 0xf7, 0xe3, 0x98, 0xfc, 0x73, 0x96, 0x48, 0xce, 0x9a, 0x92, 0x43, 0x50, 0xfb, 0xf9, 0xb4, 0x52, 0x39, 0xae, 0x7c, 0x7f, 0x62, 0x60, 0x26, 0x86, 0x7d, 0xc4, 0x1d, 0x78, 0x62, 0x21, 0x1c, 0x71, 0xcf, 0x12, 0xe7, 0x7b, 0xb7, 0x88, 0x39, 0xaf, 0xdd, 0x0e, 0xfd, 0x9e, 0xa2, 0x51, 0xc0, 0xef, 0x1b, 0xdf, 0x67, 0x49, 0x67, 0x2f, 0x1d, 0x73, 0x40, 0xe2, 0x90, 0xb9, 0xcf, 0x48, 0x5d, 0x92, 0xc5, 0x26, 0xc8, 0x81, 0xa7, 0xb6, 0xb1, 0x39, 0x69, 0xf0, 0xc4, 0x04, 0x3f, 0x08, 0xef, 0x65, 0xb0, 0x38, 0x19, 0xfc, 0xec, 0xbf, 0x11, 0xab, 0x5f, 0x2a, 0xc4, 0xf7, 0x86, 0xd2, 0xb4, 0xb1, 0x02, 0xa6, 0xa5, 0xd5, 0xeb, 0x2a, 0x99, 0xb2, 0x66, 0xc0, 0xff, 0x4b, 0x7a, 0x27, 0x28, 0xfe, 0x1f, 0x41, 0xfa, 0x63, 0x98, 0x19, 0xe8, 0x77, 0x03, 0x24, 0x22, 0xfa ],
+const [ 0x81, 0xb8, 0xde, 0x7e, 0x17, 0xcc, 0x5f, 0xfd, 0xce, 0x4f, 0x22, 0x13, 0xb5, 0x61, 0xd6, 0x7d, 0x24, 0x4e, 0xa5, 0x91, 0xaa, 0xb5, 0xc3, 0x7f, 0x47, 0xe9, 0x46, 0xd7, 0xdb, 0x97, 0x38, 0x4b, 0xdf, 0xa9, 0xea, 0xb7, 0x53, 0x6b, 0x8c, 0x5e, 0xf7, 0xec, 0xfb, 0x76, 0xbe, 0xa8, 0xda, 0xe8, 0x80, 0x63, 0xe4, 0x51, 0xef, 0x58, 0x80, 0x4c, 0xcc, 0x93, 0x96, 0xf3, 0x5b, 0x9c, 0xa2, 0xa3, 0x14, 0x55, 0x07, 0x00, 0x9b, 0x25, 0xa5, 0x39, 0xf2, 0x56, 0xad, 0x8e, 0xee, 0xbc, 0xb4, 0x0f, 0xe7, 0x98, 0x07, 0xa6, 0xb4, 0xbb, 0x3f, 0x57, 0xd6, 0xef, 0x15, 0xc7, 0xf4, 0x92, 0x77, 0xfb, 0x88, 0x84, 0xdb, 0x63, 0xd7, 0x44, 0xd3, 0x17, 0x26, 0x55, 0xe1, 0x60, 0x2b, 0xe7, 0x8d, 0x7a, 0xc2, 0xb3, 0xb6, 0x98, 0xe1, 0x27, 0x26, 0x29, 0xce, 0xc3, 0x69, 0x5a, 0x8f, 0xc3, 0xde, 0xdc ],
+const [ 0xf4, 0xd6, 0xae, 0xdd, 0x9a, 0x34, 0xe0, 0xa1, 0x82, 0x23, 0x62, 0x71, 0x4d, 0x4e, 0x81, 0x79, 0x4b, 0x53, 0xb2, 0x66, 0x41, 0x76, 0x78, 0xc1, 0x6a, 0x97, 0x88, 0x7b, 0xbb, 0x61, 0x2c, 0xc9, 0x6b, 0xc5, 0xe5, 0x32, 0xb3, 0xa6, 0x54, 0xe5, 0xd3, 0xd6, 0x5a, 0x51, 0x55, 0x42, 0x7f, 0xf0, 0x95, 0x69, 0x90, 0x63, 0x81, 0x13, 0x8c, 0xc4, 0x9e, 0x3f, 0xc2, 0x38, 0x4c, 0x5d, 0x33, 0xc3, 0x4a, 0xbd, 0x3d, 0x61, 0x7c, 0x48, 0x7b, 0x52, 0xec, 0x6e, 0xe7, 0xb5, 0x10, 0x5f, 0x41, 0x58, 0x4b, 0x7e, 0xb5, 0xcf, 0xb5, 0x12, 0xb8, 0xc3, 0x1f, 0x3f, 0x33, 0x8d, 0x52, 0x36, 0xe3, 0x03, 0x98, 0xa8, 0xff, 0x92, 0x7e, 0x80, 0x1c, 0x8e, 0xd7, 0xd1, 0x4f, 0xc5, 0x04, 0x0d, 0x91, 0x5a, 0x73, 0x79, 0x67, 0xd1, 0x66, 0xdd, 0xc2, 0x66, 0xf6, 0x80, 0x23, 0xa3, 0x57, 0x53, 0x04, 0x31 ],
+const [ 0xbb, 0xf9, 0x6d, 0x79, 0x4a, 0x6a, 0x06, 0x2f, 0xed, 0x76, 0x42, 0x9a, 0x8b, 0x39, 0x5e, 0x56, 0x64, 0xc6, 0xb1, 0xb0, 0xa2, 0x6b, 0xdf, 0x08, 0x31, 0x37, 0x50, 0x7a, 0xd1, 0xba, 0xe0, 0xbd, 0x6a, 0x0c, 0xd8, 0x4a, 0x9f, 0x11, 0x1e, 0xc1, 0xa5, 0xfa, 0xa8, 0x89, 0x56, 0x0f, 0x36, 0xb7, 0x81, 0xac, 0x41, 0x32, 0x85, 0x8a, 0x2e, 0x14, 0x1e, 0x40, 0xc8, 0x53, 0x7e, 0x0a, 0xed, 0xa0, 0xa0, 0xc8, 0x87, 0x8f, 0xd9, 0x4a, 0xbf, 0xf9, 0xb0, 0xca, 0x6d, 0x9f, 0xef, 0xba, 0xd2, 0x0f, 0xfa, 0xc1, 0x89, 0xcc, 0x60, 0x00, 0xbb, 0xa9, 0xb0, 0x99, 0x93, 0x76, 0x8e, 0x72, 0xf1, 0xde, 0x05, 0x36, 0x63, 0x90, 0x1f, 0x9d, 0x51, 0x9d, 0xb3, 0xee, 0x77, 0x21, 0x7f, 0xc2, 0x98, 0x26, 0x76, 0x0a, 0x71, 0xc5, 0x5b, 0x53, 0xed, 0x8e, 0x8f, 0x49, 0x97, 0x2b, 0x28, 0x7a, 0x54, 0x3f ],
+const [ 0x99, 0x14, 0x0d, 0x97, 0x8b, 0x2e, 0x37, 0xf3, 0x26, 0x84, 0xf3, 0xbf, 0x07, 0x5c, 0x46, 0x78, 0xfe, 0x4b, 0x3a, 0x95, 0xfc, 0x93, 0xdf, 0x75, 0x32, 0xaf, 0x90, 0x96, 0x77, 0x2b, 0x77, 0x07, 0xea, 0xb9, 0x54, 0x20, 0xd9, 0x82, 0x79, 0x70, 0xe2, 0xba, 0x19, 0xf7, 0x58, 0x77, 0xc3, 0x95, 0xe9, 0xc3, 0x2a, 0xc3, 0x7d, 0xef, 0x27, 0x81, 0x60, 0x2b, 0x01, 0x8f, 0xa4, 0x54, 0xeb, 0xe0, 0xc1, 0x0d, 0xce, 0x4c, 0x7f, 0x11, 0x49, 0x85, 0x16, 0xc8, 0xf7, 0x4c, 0x93, 0x18, 0xf0, 0xe5, 0x7d, 0x7d, 0x92, 0xc8, 0xb9, 0x5c, 0x81, 0x99, 0xab, 0x94, 0xec, 0x5a, 0x9e, 0x57, 0x12, 0xe0, 0x66, 0x38, 0x05, 0x83, 0x43, 0x84, 0xae, 0x1a, 0x09, 0xd6, 0x12, 0x27, 0x7e, 0xe6, 0xd3, 0x4e, 0x04, 0xa2, 0xfa, 0x0c, 0x78, 0x80, 0xf3, 0xa5, 0x59, 0x12, 0xd9, 0x5e, 0x2d, 0xdb, 0xf5, 0xed ],
+const [ 0x41, 0x67, 0x76, 0x77, 0xd9, 0xb1, 0x9e, 0x24, 0x9d, 0x44, 0x88, 0xc3, 0xeb, 0x18, 0x15, 0x3d, 0x5b, 0x70, 0x50, 0x02, 0xea, 0x6a, 0xae, 0x42, 0x58, 0xd5, 0x95, 0x60, 0xce, 0x42, 0x1a, 0xa4, 0xc4, 0x5e, 0x0f, 0x30, 0x22, 0x7f, 0x3d, 0x35, 0xa5, 0x7c, 0xee, 0x66, 0x85, 0xc2, 0xaf, 0xad, 0x55, 0xa4, 0x53, 0x1d, 0x2a, 0xf3, 0x3b, 0x29, 0xff, 0xcf, 0xd5, 0x13, 0x58, 0xbc, 0x63, 0xa7, 0x26, 0xf9, 0xfe, 0x28, 0xeb, 0x0d, 0xda, 0x8b, 0x1e, 0xa2, 0xcb, 0xe3, 0xd1, 0x96, 0x08, 0x1d, 0x91, 0x50, 0x30, 0xed, 0x8e, 0x50, 0x8a, 0x08, 0xfc, 0x0a, 0x91, 0x94, 0xb8, 0xf5, 0xb0, 0xdc, 0x2f, 0xdf, 0x4a, 0x49, 0x7c, 0x83, 0xfd, 0x8e, 0xd0, 0x5d, 0x28, 0x22, 0x17, 0xbd, 0xaa, 0xf3, 0xd8, 0x1b, 0xed, 0x59, 0x5d, 0xaa, 0x24, 0x48, 0x15, 0x2f, 0xd0, 0xcb, 0x36, 0x14, 0x89, 0xad ],
+const [ 0x50, 0xee, 0x23, 0x89, 0xb8, 0xb7, 0x01, 0x82, 0x54, 0x8c, 0xcd, 0x7e, 0x82, 0xde, 0x84, 0x96, 0xc6, 0xb3, 0x60, 0x2b, 0xc9, 0x9e, 0xfc, 0x7c, 0xa2, 0xef, 0xba, 0x77, 0x55, 0x27, 0x62, 0xd0, 0x99, 0xaf, 0x0b, 0x51, 0xdf, 0xc9, 0x3f, 0x71, 0x8f, 0xc6, 0x5a, 0x27, 0x95, 0x7a, 0x33, 0x00, 0x1c, 0xed, 0xfe, 0x70, 0x99, 0x53, 0x71, 0x65, 0x0c, 0x3e, 0x26, 0x22, 0x83, 0x13, 0x41, 0x4b, 0xdf, 0xba, 0x52, 0x3c, 0xda, 0x9a, 0x7d, 0x9f, 0x49, 0xc5, 0xd8, 0x3e, 0x9f, 0x6f, 0x14, 0x15, 0xb3, 0xa5, 0x60, 0xac, 0xc3, 0x3c, 0x8a, 0xa4, 0xb8, 0x07, 0x67, 0x8f, 0xab, 0x4d, 0x76, 0x05, 0xa9, 0x79, 0xc0, 0xf4, 0xb3, 0x14, 0x02, 0x37, 0x09, 0xf1, 0x0e, 0x6a, 0xa9, 0xa7, 0x6f, 0xfd, 0x12, 0x44, 0x4c, 0x88, 0x4d, 0x40, 0x8f, 0x5e, 0x2e, 0xb0, 0x45, 0x65, 0xd8, 0xbc, 0x48, 0x25 ],
+const [ 0xb1, 0x68, 0x9c, 0x25, 0x91, 0xea, 0xf3, 0xc9, 0xe6, 0x60, 0x70, 0xf8, 0xa7, 0x79, 0x54, 0xff, 0xb8, 0x17, 0x49, 0xf1, 0xb0, 0x03, 0x46, 0xf9, 0xdf, 0xe0, 0xb2, 0xee, 0x90, 0x5d, 0xcc, 0x28, 0x8b, 0xaf, 0x4a, 0x92, 0xde, 0x3f, 0x40, 0x01, 0xdd, 0x9f, 0x44, 0xc4, 0x68, 0xc3, 0xd0, 0x7d, 0x6c, 0x6e, 0xe8, 0x2f, 0xac, 0xea, 0xfc, 0x97, 0xc2, 0xfc, 0x0f, 0xc0, 0x60, 0x17, 0x19, 0xd2, 0xdc, 0xd0, 0xaa, 0x2a, 0xec, 0x92, 0xd1, 0xb0, 0xae, 0x93, 0x3c, 0x65, 0xeb, 0x06, 0xa0, 0x3c, 0x9c, 0x93, 0x5c, 0x2b, 0xad, 0x04, 0x59, 0x81, 0x02, 0x41, 0x34, 0x7a, 0xb8, 0x7e, 0x9f, 0x11, 0xad, 0xb3, 0x04, 0x15, 0x42, 0x4c, 0x6c, 0x7f, 0x5f, 0x22, 0xa0, 0x03, 0xb8, 0xab, 0x8d, 0xe5, 0x4f, 0x6d, 0xed, 0x0e, 0x3a, 0xb9, 0x24, 0x5f, 0xa7, 0x95, 0x68, 0x45, 0x1d, 0xfa, 0x25, 0x8e ],
+const [ 0x0c, 0xf2, 0x19, 0x8c, 0x31, 0x37, 0x6f, 0x5c, 0x89, 0x15, 0x66, 0x01, 0x37, 0x72, 0x5f, 0x2b, 0xbc, 0x18, 0x0a, 0x98, 0x6e, 0x5a, 0x7b, 0xda, 0x27, 0xfa, 0x81, 0x59, 0x3a, 0x4a, 0x33, 0x9b, 0xab, 0x92, 0xcb, 0xc3, 0x9f, 0xb2, 0xb8, 0x58, 0x11, 0x08, 0xee, 0x48, 0xc7, 0x94, 0x81, 0x2d, 0x84, 0x5a, 0x72, 0xce, 0x80, 0x08, 0xc9, 0xe9, 0x15, 0xd9, 0xe3, 0x30, 0xbb, 0xb9, 0x0e, 0x91, 0x36, 0xaa, 0x53, 0xba, 0x0e, 0x66, 0x93, 0xdd, 0x40, 0x46, 0xd6, 0xb0, 0x33, 0x62, 0xdf, 0xb9, 0xed, 0xfa, 0x04, 0xc8, 0x87, 0x15, 0x3c, 0xc5, 0xde, 0x67, 0x7a, 0xab, 0x8c, 0x78, 0x39, 0xd5, 0x17, 0x03, 0x58, 0x79, 0x67, 0x9c, 0x29, 0x72, 0x7e, 0x96, 0xc5, 0x42, 0x63, 0x24, 0xa2, 0x57, 0x5f, 0xbe, 0x67, 0x8d, 0x6c, 0xc7, 0xfe, 0xf5, 0xeb, 0x6c, 0xeb, 0xd5, 0x95, 0xcf, 0xdd, 0xef ],
+const [ 0x3f, 0xb3, 0x01, 0xcb, 0x40, 0x92, 0xf9, 0x62, 0x3a, 0xa5, 0xff, 0xd6, 0x90, 0xd2, 0x2d, 0x65, 0xd5, 0x6e, 0x5a, 0x1c, 0x33, 0x0b, 0x9c, 0x4a, 0x0d, 0x91, 0x0c, 0x34, 0xe3, 0x91, 0xc9, 0x0a, 0x76, 0xd5, 0x40, 0x1a, 0x2d, 0x3c, 0xaa, 0x44, 0xb8, 0xc5, 0xd5, 0xae, 0xf3, 0xe9, 0x28, 0xb9, 0x0d, 0x2e, 0xe2, 0x33, 0xe9, 0xf9, 0xa2, 0xce, 0xc4, 0xa3, 0x2c, 0xd0, 0x19, 0xd0, 0x6a, 0x0d, 0xc1, 0xfc, 0xb1, 0x12, 0x5f, 0x57, 0x46, 0xa4, 0xfb, 0xd3, 0x21, 0x69, 0xed, 0x7b, 0xf0, 0xe4, 0xfd, 0x06, 0x5f, 0xa7, 0xc8, 0xac, 0x97, 0xc3, 0x66, 0x38, 0x04, 0x84, 0x49, 0x5f, 0x5c, 0x5b, 0x68, 0x50, 0xdd, 0x1c, 0x9d, 0x8c, 0xd6, 0x69, 0x4c, 0xf8, 0x68, 0x6e, 0x46, 0x30, 0x8e, 0xd0, 0xed, 0x1f, 0x5b, 0xdf, 0x98, 0xcd, 0x83, 0x13, 0x39, 0x77, 0x1d, 0xb6, 0x3d, 0xe5, 0xa7, 0xde ],
+const [ 0x1c, 0x43, 0x96, 0xf7, 0xb7, 0xf9, 0x22, 0x8e, 0x83, 0x2a, 0x13, 0x69, 0x20, 0x02, 0xba, 0x2a, 0xff, 0x43, 0x9d, 0xcb, 0x7f, 0xdd, 0xbf, 0xd4, 0x56, 0xc0, 0x22, 0xd1, 0x33, 0xee, 0x89, 0x03, 0xa2, 0xd4, 0x82, 0x56, 0x2f, 0xda, 0xa4, 0x93, 0xce, 0x39, 0x16, 0xd7, 0x7a, 0x0c, 0x51, 0x44, 0x1d, 0xab, 0x26, 0xf6, 0xb0, 0x34, 0x02, 0x38, 0xa3, 0x6a, 0x71, 0xf8, 0x7f, 0xc3, 0xe1, 0x79, 0xca, 0xbc, 0xa9, 0x48, 0x2b, 0x70, 0x49, 0x71, 0xce, 0x69, 0xf3, 0xf2, 0x0a, 0xb6, 0x4b, 0x70, 0x41, 0x3d, 0x6c, 0x29, 0x08, 0x53, 0x2b, 0x2a, 0x88, 0x8a, 0x9f, 0xc2, 0x24, 0xca, 0xe1, 0x36, 0x5d, 0xa4, 0x10, 0xb6, 0xf2, 0xe2, 0x98, 0x90, 0x4b, 0x63, 0xb4, 0xa4, 0x17, 0x26, 0x32, 0x18, 0x35, 0xa4, 0x77, 0x4d, 0xd0, 0x63, 0xc2, 0x11, 0xcf, 0xc8, 0xb5, 0x16, 0x6c, 0x2d, 0x11, 0xa2 ],
+const [ 0x49, 0x53, 0x40, 0x8b, 0xe3, 0xdd, 0xde, 0x42, 0x52, 0x1e, 0xb6, 0x25, 0xa3, 0x7a, 0xf0, 0xd2, 0xcf, 0x9e, 0xd1, 0x84, 0xf5, 0xb6, 0x27, 0xe5, 0xe7, 0xe0, 0xe8, 0x24, 0xe8, 0xe1, 0x16, 0x48, 0xb4, 0x18, 0xe5, 0xc4, 0xc1, 0xb0, 0x20, 0x4b, 0xc5, 0x19, 0xc9, 0xe5, 0x78, 0xb8, 0x00, 0x43, 0x9b, 0xdd, 0x25, 0x4f, 0x39, 0xf6, 0x41, 0x08, 0x2d, 0x03, 0xa2, 0x8d, 0xe4, 0x4a, 0xc6, 0x77, 0x64, 0x4c, 0x7b, 0x6c, 0x8d, 0xf7, 0x43, 0xf2, 0x9f, 0x1d, 0xfd, 0x80, 0xfd, 0x25, 0xc2, 0xdb, 0x31, 0x01, 0x0e, 0xa0, 0x2f, 0x60, 0x20, 0x1c, 0xde, 0x24, 0xa3, 0x64, 0xd4, 0x16, 0x8d, 0xa2, 0x61, 0xd8, 0x48, 0xae, 0xd0, 0x1c, 0x10, 0xde, 0xe9, 0x14, 0x9c, 0x1e, 0xbb, 0x29, 0x00, 0x43, 0x98, 0xf0, 0xd2, 0x9c, 0x60, 0x5a, 0x8b, 0xca, 0x03, 0x2b, 0x31, 0xd2, 0x41, 0xad, 0x33, 0x71 ],
+const [ 0x44, 0x13, 0x11, 0x87, 0xc0, 0x7a, 0x8e, 0x39, 0x79, 0x25, 0x4b, 0x0c, 0x1d, 0x1c, 0xfa, 0x80, 0x81, 0xf0, 0xbe, 0xb8, 0x89, 0x06, 0x33, 0x74, 0x49, 0x32, 0xaf, 0x3f, 0x69, 0x87, 0xc7, 0xea, 0xce, 0x6e, 0x15, 0x38, 0x76, 0xf6, 0x39, 0xdb, 0xa4, 0x6b, 0x1e, 0x9f, 0x3e, 0x2a, 0x7f, 0xe6, 0x73, 0xb3, 0xa9, 0x54, 0xa0, 0x00, 0x82, 0xcb, 0x75, 0x16, 0xca, 0x9a, 0x54, 0xd9, 0xa1, 0xf1, 0xf9, 0x24, 0x49, 0x99, 0x60, 0x19, 0x2e, 0xe1, 0xe3, 0xb6, 0x23, 0xdc, 0xa4, 0xa9, 0xef, 0xc9, 0x2a, 0x66, 0x08, 0xd3, 0x4f, 0x76, 0x9e, 0xfb, 0x59, 0x12, 0xdb, 0x52, 0x67, 0xf0, 0x6a, 0x6b, 0x0f, 0x5d, 0x36, 0x10, 0x45, 0x8c, 0x74, 0x34, 0x7e, 0x2e, 0xe3, 0x29, 0x16, 0x42, 0x52, 0x13, 0xef, 0x2f, 0x64, 0x9d, 0x5c, 0x10, 0x90, 0xea, 0x3d, 0x4f, 0x6b, 0xcf, 0x6b, 0x75, 0x2a, 0x3f ],
+const [ 0x32, 0xb4, 0x5f, 0xbc, 0xba, 0xf2, 0x62, 0xbb, 0xe3, 0x47, 0x36, 0x0b, 0xd6, 0x07, 0x6c, 0x43, 0xdc, 0x26, 0xba, 0x95, 0x73, 0xfc, 0xab, 0xae, 0xa1, 0x45, 0x95, 0xde, 0x88, 0x6c, 0xcc, 0x79, 0x3b, 0x09, 0x15, 0x7d, 0xd0, 0xa8, 0x5d, 0x74, 0xb6, 0xcc, 0xab, 0x9c, 0x49, 0x33, 0x54, 0x46, 0xa4, 0x5c, 0x6e, 0x7c, 0xb6, 0x47, 0x86, 0xe6, 0x99, 0x7c, 0x96, 0xef, 0x1e, 0x4e, 0x31, 0x23, 0xad, 0x61, 0x01, 0xdb, 0x4c, 0x6a, 0x73, 0x1d, 0xfd, 0x36, 0xb1, 0xbe, 0x4d, 0xee, 0xd1, 0xc9, 0x2a, 0x99, 0x4b, 0x25, 0xf5, 0xe2, 0xb1, 0x71, 0xd8, 0x1b, 0x9a, 0x33, 0x5a, 0x83, 0xe0, 0x32, 0x30, 0xc4, 0x0b, 0x20, 0x56, 0xc0, 0x0c, 0x7c, 0x5f, 0x8d, 0x2f, 0xb7, 0x0a, 0xbe, 0x4b, 0x96, 0x15, 0xe5, 0x3b, 0xd7, 0x56, 0x56, 0x92, 0x17, 0x07, 0x2d, 0x8b, 0xf3, 0x62, 0x92, 0x3f, 0x6e ],
+const [ 0x14, 0x89, 0x0f, 0x3b, 0x2e, 0xe6, 0x37, 0x46, 0xc8, 0x24, 0x99, 0x09, 0x01, 0x35, 0x71, 0xa4, 0x03, 0xeb, 0x54, 0x27, 0x37, 0x60, 0x09, 0x0d, 0xb5, 0x95, 0x9b, 0x06, 0xff, 0x59, 0xac, 0xfa, 0xee, 0x6d, 0x0c, 0x4a, 0xec, 0xe5, 0x8b, 0x59, 0x64, 0xd1, 0x0b, 0x4b, 0x77, 0x1d, 0xd9, 0x0c, 0xf1, 0xb6, 0x3d, 0x94, 0x7b, 0xee, 0x4f, 0x6a, 0x12, 0x22, 0x0d, 0x67, 0xb7, 0x9a, 0xab, 0xbd, 0x68, 0xb0, 0x2a, 0x38, 0x50, 0x35, 0x2c, 0xc3, 0x3b, 0x10, 0x07, 0x2d, 0x4c, 0x28, 0x18, 0x2d, 0xf2, 0x85, 0x5a, 0xa4, 0x18, 0xb2, 0x36, 0x23, 0x9c, 0x65, 0x9d, 0xad, 0x03, 0x61, 0x55, 0xbe, 0x6b, 0x9c, 0x90, 0x8b, 0xc0, 0x9d, 0xc3, 0x8c, 0x33, 0x29, 0xb5, 0x38, 0xe8, 0x1e, 0xd7, 0x10, 0xef, 0x9f, 0xd3, 0xde, 0x76, 0x71, 0x67, 0x3f, 0x3d, 0xa5, 0x74, 0x5f, 0x4a, 0x78, 0x52, 0x04 ],
+const [ 0x3e, 0x8a, 0x90, 0x30, 0xea, 0xe1, 0xbb, 0x60, 0x84, 0xcf, 0xfd, 0xb5, 0x77, 0x62, 0x3c, 0x4c, 0xf9, 0x4b, 0x7a, 0xee, 0x3d, 0x3c, 0xa9, 0x94, 0xea, 0x94, 0xc1, 0x2a, 0xcd, 0x3e, 0x11, 0x94, 0xca, 0xd6, 0xd2, 0xef, 0x19, 0x0e, 0x02, 0x19, 0xaf, 0x51, 0x70, 0x73, 0xf9, 0xa6, 0x13, 0xe5, 0xd0, 0xd6, 0x9f, 0x23, 0xaa, 0xd1, 0x5a, 0x2f, 0x0d, 0x4e, 0x2c, 0x20, 0x4a, 0xb2, 0xf6, 0x21, 0x67, 0x33, 0x25, 0xbc, 0x5d, 0x3d, 0x87, 0x59, 0x84, 0x14, 0x5d, 0x01, 0x4b, 0xbc, 0xb1, 0x68, 0x2c, 0x16, 0xea, 0x2b, 0xdf, 0x4b, 0x9d, 0x56, 0xce, 0x6d, 0xa6, 0x29, 0xca, 0x5c, 0x78, 0x1c, 0xfc, 0xe7, 0xb1, 0x20, 0x1e, 0x34, 0xf2, 0x28, 0xeb, 0x62, 0xed, 0xe8, 0xd3, 0x6c, 0xbf, 0xdc, 0xf4, 0x51, 0x81, 0x8d, 0x46, 0x72, 0x19, 0x10, 0x15, 0x3b, 0x56, 0xcf, 0xb5, 0x05, 0x3d, 0x8c ],
+const [ 0x97, 0xd2, 0x9a, 0xc5, 0xed, 0xe9, 0x4c, 0x0a, 0x50, 0x71, 0xe0, 0x09, 0x5e, 0x61, 0x02, 0x12, 0x3d, 0x17, 0x26, 0x13, 0x2f, 0x9d, 0xc1, 0x02, 0x67, 0x2a, 0xb8, 0x7b, 0x1c, 0xec, 0x18, 0xab, 0xdb, 0x04, 0x09, 0x6c, 0x21, 0xd3, 0xfd, 0xb1, 0x29, 0x74, 0x2d, 0x25, 0x03, 0x89, 0x46, 0x0f, 0xe6, 0x3b, 0x5f, 0x79, 0xc7, 0x7c, 0x2f, 0x91, 0x2a, 0x8f, 0x7d, 0x4f, 0x39, 0xcb, 0xd7, 0x58, 0x13, 0x9c, 0x87, 0x23, 0x66, 0xca, 0xc3, 0x5a, 0x40, 0xfe, 0x24, 0x83, 0x22, 0x82, 0x5a, 0xdf, 0x57, 0x48, 0x1d, 0x92, 0x83, 0x2e, 0x66, 0x05, 0x7f, 0x80, 0xe0, 0x89, 0x64, 0xbe, 0x99, 0x3d, 0xe6, 0xa0, 0xfe, 0x31, 0xe4, 0x58, 0x06, 0xcb, 0x3c, 0x17, 0xad, 0x6a, 0xe4, 0xd2, 0xa4, 0x4a, 0x37, 0x46, 0x47, 0xa8, 0x8c, 0x3a, 0xcf, 0x26, 0x0d, 0x04, 0xc9, 0x70, 0xc7, 0x4e, 0xc7, 0x20 ],
+const [ 0x87, 0x34, 0xe4, 0x9e, 0x3e, 0x62, 0x9d, 0xeb, 0x35, 0x2c, 0x77, 0xf5, 0x8f, 0xf4, 0xdc, 0xce, 0x2a, 0xf3, 0xb1, 0x18, 0x2e, 0x7d, 0x89, 0x6a, 0xe6, 0x86, 0x19, 0xf6, 0xcf, 0x66, 0xed, 0x69, 0xef, 0xd9, 0x59, 0x13, 0x68, 0x4a, 0xb1, 0x48, 0x4d, 0x51, 0xbc, 0x06, 0xb4, 0x7a, 0x67, 0xd7, 0x0d, 0x48, 0xb7, 0xf9, 0xb2, 0x79, 0x01, 0xbd, 0xbf, 0x8c, 0x5d, 0x2d, 0x23, 0x81, 0x58, 0xf1, 0xf7, 0xe0, 0xe9, 0x74, 0x0f, 0xfc, 0xa7, 0x42, 0xcf, 0x79, 0x38, 0xb5, 0x40, 0x0c, 0x0d, 0xd0, 0x63, 0x82, 0x4c, 0x6b, 0xc6, 0x04, 0x0e, 0x90, 0x54, 0x99, 0xcb, 0x26, 0x71, 0xec, 0x12, 0xcc, 0x47, 0x50, 0x7e, 0x08, 0x5a, 0x01, 0xe5, 0xa1, 0x63, 0xac, 0xd2, 0x49, 0x5b, 0x32, 0x36, 0x7f, 0xd6, 0xaa, 0x5a, 0xb4, 0x92, 0xa5, 0x18, 0xad, 0x50, 0xb5, 0x4b, 0x28, 0xe2, 0x30, 0x84, 0xc2 ],
+const [ 0x61, 0xc5, 0xbe, 0x97, 0x2f, 0xaa, 0x61, 0xf6, 0x7b, 0xcb, 0x33, 0x25, 0x42, 0xc0, 0xb8, 0xa7, 0xc7, 0x4e, 0xf6, 0x7c, 0xdb, 0x95, 0xd6, 0xf6, 0x5c, 0x8a, 0xce, 0xc8, 0xfc, 0xa8, 0xbd, 0x60, 0x43, 0xe3, 0x16, 0x77, 0xd8, 0xde, 0x41, 0xe6, 0xfc, 0x5d, 0x3e, 0xbb, 0x57, 0xfd, 0x8c, 0x8c, 0xf7, 0x23, 0x49, 0x0b, 0x96, 0x32, 0x9a, 0xdb, 0x1b, 0x01, 0x4d, 0xa2, 0x64, 0x8c, 0xbd, 0x60, 0x43, 0xe9, 0xf6, 0xff, 0xc6, 0x7e, 0x1a, 0x2b, 0xbc, 0x72, 0x04, 0x63, 0x74, 0x61, 0x2a, 0x50, 0xc8, 0x54, 0xc8, 0x56, 0x5a, 0xf0, 0x3b, 0x6a, 0x1e, 0xed, 0xaa, 0x23, 0x19, 0xca, 0xec, 0x13, 0x68, 0xbf, 0xa6, 0x57, 0x83, 0xf4, 0xb4, 0x6d, 0xc3, 0xf0, 0xcb, 0x46, 0x22, 0x54, 0x5c, 0x9c, 0x43, 0xc9, 0xbb, 0x86, 0xb2, 0x37, 0x80, 0x4a, 0x6c, 0x38, 0x2e, 0x72, 0xa2, 0xcc, 0x12, 0x22 ],
+const [ 0xb3, 0x1d, 0x11, 0xcb, 0x4f, 0x5c, 0x57, 0x2c, 0xcf, 0x34, 0x05, 0xc6, 0x5c, 0xbd, 0x21, 0x8e, 0xe8, 0xab, 0xdc, 0x08, 0xb6, 0xc8, 0x2e, 0x5d, 0x1d, 0xa2, 0xba, 0xaf, 0x89, 0x80, 0xf7, 0xa9, 0xc2, 0x9b, 0x91, 0x5a, 0x71, 0x8b, 0x0d, 0x43, 0xe0, 0x00, 0xad, 0xae, 0x01, 0xb2, 0x93, 0x42, 0xb2, 0x9b, 0x28, 0xd5, 0x3f, 0x63, 0xbf, 0x81, 0x28, 0x1c, 0x76, 0xfa, 0x25, 0x2f, 0x5d, 0x1e, 0x68, 0x96, 0xdb, 0xce, 0x22, 0x4c, 0x4d, 0xfd, 0x48, 0x02, 0xef, 0x06, 0x97, 0x14, 0x00, 0x43, 0xd6, 0xbb, 0x21, 0xdb, 0x5b, 0x84, 0xff, 0xdb, 0xd0, 0x01, 0x31, 0x89, 0x37, 0xbe, 0x64, 0xf5, 0x2c, 0x76, 0xb5, 0xd0, 0x6a, 0x87, 0x5e, 0x81, 0x91, 0xa4, 0x95, 0x76, 0x27, 0xca, 0xb1, 0xb8, 0xdc, 0x75, 0x8f, 0xc3, 0x12, 0x13, 0x34, 0x94, 0x9c, 0xb9, 0xb3, 0x03, 0xc6, 0x15, 0x51, 0x53 ],
+const [ 0x3a, 0xd1, 0x73, 0x08, 0xcd, 0x25, 0x96, 0x88, 0xd5, 0xb5, 0x2c, 0x32, 0xd0, 0x1a, 0x3b, 0x86, 0x8b, 0xfa, 0xa4, 0x75, 0x8b, 0xda, 0xa5, 0xce, 0xac, 0x34, 0xa1, 0xf9, 0x08, 0xca, 0x24, 0xe7, 0x1a, 0x39, 0x22, 0x49, 0x24, 0xd1, 0x7f, 0x00, 0xcd, 0xa4, 0xd4, 0xd5, 0x0f, 0xdd, 0x71, 0x6b, 0x50, 0x54, 0x9e, 0x71, 0xcf, 0x5f, 0x27, 0x1c, 0x42, 0xea, 0x17, 0xd5, 0xbe, 0xca, 0xc3, 0x2f, 0xd6, 0x4e, 0x0a, 0x1b, 0x07, 0x17, 0xdc, 0x5f, 0x54, 0x2a, 0xf9, 0x44, 0x2d, 0x44, 0xfb, 0x8f, 0x95, 0x6e, 0x97, 0xb3, 0x84, 0xd0, 0x20, 0x45, 0x8a, 0xca, 0x4c, 0xb0, 0xb6, 0x41, 0x3b, 0x2a, 0xb6, 0x37, 0xb5, 0xe7, 0x3f, 0x9f, 0xb4, 0x8c, 0xb0, 0x6f, 0x22, 0xe6, 0xf2, 0xf6, 0xe3, 0xdc, 0xa2, 0x70, 0x16, 0xa2, 0x72, 0xd8, 0x98, 0x30, 0xcc, 0xfd, 0xca, 0xf3, 0xb9, 0xd8, 0x95, 0xc2 ],
+const [ 0x46, 0xeb, 0x50, 0x59, 0x05, 0x5d, 0x33, 0x45, 0xc1, 0xea, 0x84, 0xa4, 0xeb, 0xd2, 0xd7, 0xcc, 0x53, 0x36, 0x17, 0x07, 0xec, 0xcd, 0x70, 0xe7, 0xcf, 0xd8, 0x6b, 0xda, 0x83, 0x58, 0x5b, 0xfe, 0x7c, 0x7e, 0xf9, 0x37, 0xe1, 0x63, 0x4b, 0x7e, 0x93, 0xf9, 0xca, 0x7c, 0x6a, 0x42, 0xc3, 0x57, 0xc2, 0xbf, 0xfe, 0xcc, 0x36, 0x2c, 0x9e, 0x7e, 0xab, 0x6a, 0x48, 0x8d, 0x91, 0xbd, 0x87, 0x6b, 0x65, 0x37, 0x6f, 0xeb, 0x7a, 0x74, 0x81, 0x9b, 0xfa, 0x88, 0xcf, 0x54, 0x27, 0x36, 0x61, 0x0f, 0xe7, 0x63, 0xd6, 0xfa, 0x80, 0xc9, 0x4e, 0xcc, 0xa0, 0xf0, 0x88, 0x55, 0xa0, 0x5a, 0x48, 0x59, 0x09, 0xfe, 0xfc, 0x9e, 0x58, 0xf9, 0x9e, 0x44, 0xfe, 0x7f, 0xdc, 0x55, 0xab, 0x17, 0x77, 0x9d, 0xcc, 0x08, 0xe9, 0xbc, 0x53, 0x0e, 0x4a, 0x79, 0xb6, 0x52, 0x74, 0x59, 0x3a, 0x99, 0x66, 0x71 ],
+const [ 0x39, 0x0a, 0x9d, 0xc2, 0xea, 0x20, 0x22, 0x1c, 0x59, 0x93, 0xc5, 0x81, 0x89, 0x2e, 0xb4, 0xb0, 0x43, 0x64, 0x29, 0x4f, 0xad, 0x91, 0x9c, 0x45, 0x1e, 0x83, 0x37, 0x65, 0x31, 0x39, 0x8a, 0x4c, 0x18, 0xea, 0x80, 0x8c, 0x33, 0x4a, 0x91, 0x0a, 0xe1, 0x08, 0x3a, 0xa4, 0x97, 0x9b, 0xaa, 0x17, 0x2f, 0x3e, 0xbf, 0x20, 0x82, 0x39, 0x30, 0xe2, 0x38, 0x63, 0x0c, 0x88, 0xdf, 0xe5, 0x63, 0x2b, 0x3b, 0x40, 0x42, 0xf6, 0xdd, 0x92, 0xe5, 0x88, 0xf7, 0x15, 0x29, 0x99, 0x6f, 0xe8, 0x40, 0xe1, 0x32, 0x12, 0xa8, 0x35, 0xcb, 0xc4, 0x5e, 0xf4, 0x34, 0xde, 0x4f, 0xa1, 0xec, 0xb5, 0x0f, 0xd1, 0x49, 0x13, 0xcd, 0x48, 0x10, 0x80, 0x87, 0x5f, 0x43, 0xc0, 0x7a, 0xa9, 0x3a, 0x9d, 0xdd, 0xd5, 0xf5, 0xe7, 0xce, 0xd6, 0xb1, 0xb8, 0x8d, 0x42, 0xb9, 0xfc, 0xe8, 0xf8, 0x7f, 0x31, 0xf6, 0x06 ],
+const [ 0xf9, 0x07, 0x68, 0x95, 0x4c, 0xdc, 0xbd, 0x57, 0x05, 0xf9, 0xd3, 0x18, 0xfc, 0xa6, 0x59, 0x17, 0x87, 0xaf, 0x84, 0x0a, 0x92, 0x1f, 0xbd, 0x06, 0xf2, 0x4b, 0x97, 0x9e, 0xf6, 0x12, 0x03, 0x4f, 0x3f, 0x64, 0xc7, 0x1c, 0xd2, 0x01, 0x2c, 0x75, 0x6c, 0x83, 0xf7, 0x5d, 0x16, 0x9f, 0x9b, 0xcc, 0xf8, 0xa8, 0xad, 0x52, 0x72, 0x54, 0x98, 0xfe, 0x69, 0xc3, 0x92, 0x7e, 0xdf, 0xbd, 0xcf, 0x87, 0xc7, 0x3c, 0xf4, 0x78, 0x17, 0x2a, 0xce, 0x3a, 0x1e, 0x6b, 0x44, 0x6a, 0x18, 0x1e, 0x8a, 0xba, 0x00, 0x20, 0x98, 0x94, 0xa5, 0xd2, 0xdb, 0x01, 0x00, 0x1d, 0x2a, 0xca, 0xc5, 0xb3, 0xfb, 0xdd, 0x38, 0x97, 0xd7, 0xf1, 0x42, 0xdf, 0x0b, 0x6d, 0xc4, 0xb9, 0xa1, 0x86, 0x2b, 0xac, 0x8e, 0xa8, 0x45, 0x20, 0x2d, 0x18, 0x53, 0x21, 0xec, 0xd7, 0x5f, 0x60, 0x46, 0xc9, 0xcf, 0x7a, 0xf1, 0x16 ],
+const [ 0xc1, 0xd8, 0x01, 0x28, 0xfa, 0x20, 0x8b, 0xa1, 0x8b, 0xbb, 0x13, 0x42, 0x40, 0x12, 0xea, 0x65, 0x1e, 0xe7, 0x5e, 0x73, 0xf7, 0x96, 0xe9, 0x4c, 0x3b, 0x9a, 0xa9, 0xe9, 0x11, 0x52, 0x10, 0x40, 0xa6, 0x05, 0xdd, 0x67, 0xc5, 0x25, 0x4b, 0xfd, 0xa9, 0xd0, 0x88, 0xc6, 0x0f, 0x9c, 0x68, 0x95, 0x8f, 0x94, 0x5b, 0x6f, 0x2b, 0x7e, 0x9d, 0xed, 0x29, 0x60, 0xac, 0xe2, 0x1e, 0x42, 0xff, 0x3e, 0x4c, 0x34, 0xf5, 0x32, 0x2d, 0x93, 0x0c, 0x95, 0x50, 0x89, 0x53, 0x87, 0x64, 0xd3, 0x22, 0x54, 0x93, 0xc7, 0x08, 0x9b, 0x11, 0x95, 0x05, 0xaf, 0xf4, 0xcd, 0xf9, 0x3d, 0x46, 0x21, 0x5d, 0x2f, 0x58, 0x6d, 0x31, 0xd1, 0x5a, 0xf4, 0x35, 0x32, 0x29, 0xec, 0x5c, 0xce, 0x68, 0x3e, 0x7e, 0x69, 0xd2, 0x87, 0x4d, 0x3e, 0xce, 0x62, 0x8a, 0x59, 0x44, 0xe9, 0x79, 0x42, 0xb0, 0x79, 0x92, 0xdb ],
+const [ 0xf5, 0x7e, 0xa8, 0x4c, 0xaa, 0xa2, 0xaf, 0x18, 0xdd, 0x7e, 0xfd, 0xca, 0x35, 0x6b, 0x96, 0x25, 0xf9, 0xe7, 0x0d, 0x3a, 0x80, 0x3a, 0x9d, 0x31, 0xe9, 0x59, 0x76, 0x46, 0x0c, 0x0a, 0x55, 0x12, 0xaf, 0x49, 0x57, 0x0c, 0xfe, 0xea, 0x0f, 0x4f, 0x35, 0x81, 0xd6, 0x9e, 0xa0, 0x7f, 0x62, 0xa5, 0xc5, 0x9d, 0x9b, 0x81, 0xe0, 0x7e, 0xa9, 0x83, 0x8f, 0x8f, 0x52, 0x31, 0xcf, 0x33, 0x83, 0x8e, 0x27, 0x1d, 0x2c, 0x9c, 0x23, 0xfc, 0x51, 0x1e, 0x04, 0x5e, 0x5f, 0xa2, 0xb6, 0xce, 0xbc, 0xbf, 0x02, 0x40, 0xa1, 0x9c, 0x05, 0xb0, 0x2c, 0xb1, 0xe1, 0x05, 0xb1, 0xd2, 0xb2, 0x3b, 0x52, 0x69, 0xc4, 0xc1, 0xcf, 0x03, 0x03, 0x20, 0x9f, 0x0e, 0xb2, 0xde, 0x3f, 0xe0, 0x60, 0xa2, 0xca, 0xfc, 0x18, 0x98, 0xca, 0x91, 0xd9, 0x17, 0x4d, 0x44, 0x45, 0x82, 0x3c, 0x2f, 0x9d, 0x6c, 0xe9, 0x2a ],
+const [ 0x33, 0xca, 0x6e, 0xb7, 0xec, 0x10, 0x91, 0xb4, 0x06, 0xcf, 0x64, 0x49, 0x5c, 0xcf, 0xa2, 0x16, 0x9f, 0x47, 0xb3, 0xb5, 0x90, 0x47, 0x7d, 0x40, 0x73, 0x53, 0x7c, 0x14, 0xc0, 0x50, 0x15, 0xd5, 0x1b, 0xa5, 0x27, 0xb3, 0x86, 0x9a, 0xe4, 0xeb, 0xd6, 0x03, 0xdf, 0x90, 0x63, 0x23, 0x65, 0x8b, 0x04, 0xcb, 0x11, 0xe1, 0x3b, 0xc2, 0x9b, 0x34, 0xac, 0x69, 0xf1, 0x8d, 0xd4, 0x9f, 0x89, 0x58, 0xf7, 0xe3, 0xf5, 0xb0, 0x5a, 0xb8, 0xb8, 0xdd, 0xb3, 0x4e, 0x58, 0x1b, 0xde, 0x5e, 0xb4, 0x9d, 0xd1, 0x56, 0x98, 0xd2, 0xd2, 0xb6, 0x8f, 0xe7, 0xe8, 0xba, 0xf8, 0x8d, 0x8f, 0x39, 0x5c, 0xfc, 0xaf, 0xcd, 0xff, 0x38, 0xcf, 0x34, 0xb5, 0x93, 0x86, 0xf6, 0xf7, 0x73, 0x33, 0x48, 0x36, 0x55, 0xee, 0x31, 0x6f, 0x12, 0xbf, 0xeb, 0x00, 0x61, 0x0d, 0x8c, 0xba, 0x9e, 0x59, 0xe6, 0x37, 0xca ],
+const [ 0x74, 0xc4, 0xca, 0x4d, 0xb1, 0xaa, 0x81, 0x2b, 0x4d, 0x75, 0x85, 0x2c, 0x67, 0x17, 0x14, 0x63, 0x51, 0xe8, 0x32, 0x99, 0x44, 0x8f, 0xf8, 0x4d, 0x52, 0x26, 0x2f, 0xf9, 0x9d, 0x99, 0x1d, 0x97, 0xc7, 0x4f, 0x9f, 0x64, 0xa9, 0x0d, 0x78, 0xe4, 0x48, 0x17, 0xe9, 0x26, 0x04, 0x98, 0x82, 0x49, 0x13, 0x43, 0x37, 0x3f, 0x2e, 0x3b, 0xb6, 0xd1, 0x8a, 0x30, 0xf8, 0xe3, 0x0a, 0xcb, 0x16, 0xfa, 0xb3, 0x4d, 0x5f, 0xfb, 0x60, 0x73, 0xa7, 0x36, 0xb7, 0x9c, 0xe1, 0xa2, 0x5b, 0x2d, 0xf1, 0x6a, 0x63, 0x35, 0xbb, 0xa9, 0x0c, 0x4d, 0x80, 0x72, 0xaa, 0xc3, 0x6a, 0x14, 0xe5, 0xf7, 0x65, 0x9c, 0x21, 0x04, 0x31, 0x9b, 0x3e, 0xa3, 0xb5, 0x29, 0x82, 0x4d, 0x97, 0x29, 0xd3, 0xa0, 0x09, 0xcf, 0x2a, 0x04, 0xe6, 0x60, 0x44, 0x8e, 0xfd, 0x39, 0x9b, 0x25, 0xad, 0x13, 0x94, 0xe3, 0xb2, 0x85 ],
+const [ 0x68, 0xbb, 0x5b, 0x62, 0x89, 0x90, 0x75, 0x89, 0xf8, 0xd9, 0x1e, 0x46, 0xd4, 0x44, 0x17, 0xea, 0x80, 0xbf, 0x6b, 0xe1, 0x02, 0x45, 0xf5, 0x2b, 0xa9, 0xf8, 0x22, 0x11, 0xf3, 0x71, 0xf8, 0x10, 0xad, 0x54, 0x57, 0x1a, 0x5c, 0x27, 0x7f, 0xfe, 0xdc, 0x64, 0xd3, 0x24, 0x47, 0xcc, 0xdd, 0x7d, 0x19, 0xff, 0x91, 0xba, 0x91, 0x4a, 0xd6, 0xbc, 0x5a, 0xc0, 0x42, 0x4c, 0x6a, 0x8c, 0x25, 0x0d, 0x2b, 0x85, 0xca, 0xae, 0xd8, 0x03, 0xf9, 0x64, 0x2a, 0xf1, 0xc0, 0x98, 0x35, 0x24, 0x74, 0xdd, 0x8c, 0xeb, 0xf2, 0x24, 0xac, 0xe8, 0x2a, 0x33, 0x98, 0x1e, 0xdf, 0x53, 0xc0, 0x4a, 0xa8, 0x49, 0x27, 0x77, 0x3b, 0x88, 0xc5, 0xcd, 0xea, 0xa5, 0x2b, 0xaa, 0x6e, 0x0b, 0x65, 0xf4, 0xe4, 0xf0, 0x24, 0xad, 0x15, 0x88, 0x1d, 0xc7, 0xfa, 0x78, 0xac, 0x3a, 0x80, 0x8d, 0xbd, 0x55, 0x88, 0xae ],
+const [ 0x90, 0x0e, 0x41, 0x52, 0x13, 0x1d, 0x8c, 0x4d, 0xcc, 0x38, 0xa9, 0xe8, 0x64, 0x72, 0x34, 0xdf, 0xfc, 0x7c, 0xe8, 0x8e, 0xcb, 0xbb, 0x65, 0xa8, 0x08, 0x9d, 0x30, 0x2c, 0x0a, 0x2e, 0xfc, 0x95, 0xae, 0xe6, 0x28, 0x52, 0xf9, 0xc5, 0x88, 0x75, 0xfe, 0xa3, 0x68, 0xaf, 0x02, 0xc1, 0xce, 0x7c, 0xdf, 0xa3, 0x00, 0x9b, 0xa6, 0x22, 0x46, 0xc1, 0x88, 0xbd, 0xf1, 0x8e, 0xf7, 0x30, 0x9c, 0xc0, 0x08, 0x48, 0xb2, 0xa7, 0x1c, 0xf5, 0x31, 0xd9, 0xbf, 0xa1, 0xad, 0x26, 0xd0, 0xc0, 0x97, 0xce, 0xe3, 0xa8, 0xbf, 0xf2, 0xe3, 0xa3, 0x18, 0x49, 0xfc, 0x43, 0xbb, 0x14, 0xb7, 0xf6, 0x2f, 0x54, 0x67, 0xda, 0xe8, 0x3a, 0xc5, 0xd3, 0x0d, 0xdf, 0xd7, 0xda, 0x7f, 0x35, 0x16, 0x98, 0x16, 0x3e, 0xcf, 0x33, 0x2e, 0x7b, 0xca, 0x68, 0x62, 0xa8, 0x2a, 0xda, 0x97, 0xa6, 0x94, 0xa9, 0x3d, 0xb9 ],
+const [ 0x71, 0x59, 0xec, 0xc1, 0x45, 0xa3, 0xf9, 0x19, 0x04, 0x4c, 0x85, 0x1a, 0x4e, 0xca, 0x42, 0x82, 0x79, 0x62, 0x6e, 0x68, 0xcd, 0x8f, 0xa4, 0xc5, 0xf4, 0xa7, 0xf9, 0x32, 0xac, 0xbc, 0x44, 0xf3, 0xbf, 0xc0, 0xbd, 0x35, 0x35, 0xed, 0xca, 0x94, 0xc8, 0x64, 0x15, 0xe0, 0x98, 0x15, 0xe2, 0x21, 0x20, 0xde, 0xa0, 0xd8, 0x69, 0xf7, 0xbd, 0x88, 0x7d, 0x8d, 0xbf, 0x75, 0x1f, 0xad, 0x91, 0xac, 0xb9, 0x64, 0x1a, 0x43, 0x96, 0x25, 0x14, 0xe2, 0x51, 0x6a, 0x1c, 0x83, 0x8e, 0x9e, 0x05, 0x75, 0xe7, 0x3b, 0x72, 0xa7, 0x2a, 0x30, 0xa4, 0x23, 0xc1, 0x85, 0x90, 0xd9, 0x71, 0x41, 0x35, 0x9e, 0x48, 0x8c, 0x2c, 0x74, 0xd0, 0x11, 0x81, 0x0c, 0x89, 0xa6, 0xc1, 0x89, 0x96, 0x2f, 0x54, 0x87, 0xb7, 0xbf, 0x0d, 0x5c, 0x77, 0x01, 0x00, 0x9d, 0xa7, 0xd7, 0x94, 0xe5, 0x0a, 0x40, 0xd9, 0xd1 ],
+const [ 0x93, 0x9b, 0xfa, 0xab, 0x9f, 0x60, 0x36, 0x95, 0x42, 0x92, 0x8b, 0x14, 0x90, 0x89, 0x42, 0x59, 0xc2, 0x27, 0x06, 0x74, 0x7f, 0x0c, 0x48, 0x21, 0x5b, 0x08, 0xe1, 0xe5, 0x9e, 0xd6, 0xf9, 0x5a, 0x46, 0x07, 0x28, 0xc7, 0x4f, 0x3c, 0xdc, 0xf4, 0x31, 0x98, 0xfb, 0x3d, 0xab, 0x75, 0xc9, 0xe4, 0xbf, 0x56, 0x0b, 0xac, 0xfe, 0x1d, 0x6d, 0xa3, 0x05, 0x7f, 0x21, 0x3f, 0x48, 0xb4, 0xc9, 0xac, 0x0e, 0x73, 0x97, 0x65, 0xbd, 0x1d, 0xb2, 0x02, 0x58, 0x39, 0xdc, 0x50, 0x46, 0x20, 0x53, 0xa7, 0x55, 0xf9, 0xf4, 0x78, 0xfe, 0xe8, 0xa6, 0x26, 0xeb, 0x83, 0xf6, 0x17, 0xb6, 0x86, 0xff, 0x0a, 0xf4, 0xc7, 0x8d, 0xab, 0x72, 0x6c, 0x82, 0x64, 0xbe, 0x5b, 0x78, 0x77, 0xe9, 0xf2, 0xa7, 0x4a, 0x8c, 0xf9, 0x09, 0x01, 0x09, 0xd4, 0xbd, 0x52, 0x13, 0xfd, 0xaa, 0x95, 0x71, 0xb2, 0x64, 0x1b ],
+const [ 0x29, 0xba, 0x20, 0x50, 0x89, 0xb1, 0x2e, 0x8b, 0xe5, 0xb4, 0x22, 0xfa, 0xf9, 0x9c, 0x3d, 0x69, 0xaa, 0xca, 0x32, 0x4e, 0xeb, 0x73, 0x2d, 0xb8, 0xe1, 0x3c, 0x14, 0x82, 0x45, 0x07, 0x0d, 0xcc, 0x0b, 0x0c, 0x40, 0xab, 0x41, 0x2b, 0xde, 0x20, 0x39, 0x80, 0x62, 0x47, 0xea, 0x39, 0x17, 0xd1, 0x94, 0xa4, 0xda, 0xb4, 0xa3, 0x8c, 0x21, 0x21, 0xd6, 0xc6, 0x3c, 0xb7, 0xa0, 0x07, 0xdb, 0xf6, 0xcf, 0xf9, 0xd1, 0xf6, 0x6b, 0x8d, 0x17, 0x59, 0xe1, 0x92, 0x14, 0x7e, 0x60, 0x87, 0x1b, 0xf7, 0x84, 0xad, 0x36, 0x3e, 0x32, 0x61, 0x22, 0xa3, 0xc3, 0xa9, 0x9a, 0x89, 0x64, 0x0d, 0xd9, 0xd2, 0xbc, 0xa8, 0x5a, 0x98, 0xd0, 0x7e, 0xe2, 0x1e, 0x24, 0x10, 0xc0, 0x06, 0x23, 0x2e, 0x53, 0xc4, 0xc1, 0x0d, 0xce, 0x52, 0x5f, 0x99, 0x38, 0x25, 0xef, 0x0c, 0xb7, 0x61, 0x58, 0xc0, 0x0d, 0x49 ],
+const [ 0xf7, 0x32, 0x17, 0x18, 0xbb, 0xd3, 0xb4, 0x01, 0xfb, 0x5d, 0x72, 0xf2, 0xe8, 0x93, 0x1a, 0x5e, 0xbb, 0x18, 0xd2, 0xa1, 0xec, 0xd4, 0xf1, 0x89, 0xa5, 0x99, 0x12, 0x15, 0x76, 0x07, 0x68, 0x7c, 0x4a, 0xad, 0x51, 0x71, 0x9a, 0x70, 0x2d, 0xa6, 0xe0, 0x31, 0x70, 0x8f, 0x4f, 0xaa, 0xf6, 0x68, 0xc1, 0x99, 0x97, 0x79, 0xf1, 0x21, 0xfc, 0x99, 0xea, 0x6d, 0xb0, 0xf1, 0xbf, 0x96, 0x7a, 0x02, 0x7d, 0xc7, 0xeb, 0xea, 0x5e, 0x9f, 0x33, 0xe2, 0x3f, 0xd6, 0x39, 0x0c, 0x54, 0x24, 0xea, 0x6c, 0x1b, 0x5e, 0xd0, 0x33, 0x8e, 0xe3, 0xe7, 0x44, 0x9d, 0x36, 0xad, 0xf1, 0xdb, 0xec, 0x79, 0x05, 0x78, 0xc9, 0x0d, 0x08, 0x6f, 0x26, 0x6e, 0xbe, 0x00, 0x95, 0xf4, 0xf1, 0x61, 0xc8, 0x9d, 0x70, 0xb1, 0xaf, 0xa6, 0x58, 0x2d, 0xe1, 0x5d, 0x92, 0xa6, 0x3d, 0x31, 0x9d, 0x33, 0xd1, 0x0b, 0x8e ],
+const [ 0xcf, 0x25, 0xd6, 0x19, 0xfb, 0x46, 0xbf, 0xbc, 0x39, 0x55, 0x79, 0x14, 0xdd, 0xa0, 0x2d, 0x76, 0x7a, 0xc5, 0x11, 0x12, 0x0d, 0x17, 0x3b, 0x78, 0x77, 0x43, 0xb3, 0x5b, 0x31, 0x34, 0xcb, 0x94, 0x3b, 0x33, 0xb3, 0x69, 0x55, 0x53, 0x48, 0x10, 0x72, 0x0c, 0x2d, 0x6f, 0x6a, 0x26, 0x1d, 0x26, 0xef, 0xd8, 0x7f, 0xcf, 0xc2, 0x32, 0x3b, 0x84, 0x26, 0xb8, 0xcd, 0xa2, 0x96, 0x50, 0x98, 0xcd, 0xb3, 0x5e, 0x7c, 0x35, 0x80, 0x2d, 0xaa, 0x17, 0xd1, 0x91, 0xb7, 0x86, 0x01, 0xca, 0xf0, 0x6b, 0xe4, 0xac, 0xee, 0xcb, 0xfc, 0xfd, 0x6a, 0x48, 0xf0, 0x1f, 0x52, 0xeb, 0x39, 0xee, 0x1b, 0x20, 0x1f, 0xec, 0x5a, 0x02, 0xe4, 0x9c, 0x8e, 0xd9, 0x3f, 0x2b, 0x40, 0xe1, 0x0c, 0x55, 0x4f, 0x4e, 0x41, 0x87, 0x85, 0x8c, 0x24, 0x41, 0x6d, 0xcb, 0xbb, 0xbf, 0x69, 0xbb, 0x84, 0xd8, 0xff, 0x94 ],
+const [ 0xe2, 0xa2, 0x6c, 0xa1, 0x37, 0x02, 0x70, 0x66, 0xaf, 0x85, 0x64, 0x53, 0xd2, 0xa4, 0xad, 0xc4, 0xd5, 0xd0, 0xc9, 0xd5, 0xbf, 0x06, 0x8f, 0x8a, 0xca, 0xa4, 0xb7, 0x4d, 0x0c, 0x7b, 0x9c, 0x9e, 0x56, 0x25, 0x41, 0x06, 0x5d, 0x98, 0x92, 0x4c, 0x17, 0xfc, 0xed, 0xec, 0x68, 0xba, 0xe1, 0xc5, 0xfe, 0xd6, 0x36, 0x12, 0x7a, 0x7e, 0x2d, 0x9b, 0xd0, 0xe3, 0x08, 0x2d, 0xf0, 0x47, 0xcd, 0x47, 0xa6, 0x57, 0x48, 0x16, 0xbe, 0xbc, 0x4f, 0xa3, 0x6d, 0xed, 0x4a, 0x4c, 0xec, 0x47, 0xf2, 0x71, 0x66, 0x5f, 0x58, 0x6f, 0x14, 0x97, 0x29, 0xd2, 0xa7, 0xef, 0x31, 0xc6, 0xe6, 0x1e, 0x1f, 0xcf, 0x98, 0xe2, 0x88, 0xba, 0xa4, 0x94, 0x2e, 0xd4, 0x77, 0xff, 0x81, 0x59, 0xa6, 0x72, 0x66, 0x2f, 0xd4, 0x14, 0x38, 0xd4, 0xd7, 0x78, 0x0c, 0x96, 0x16, 0x71, 0x3a, 0x02, 0x35, 0x28, 0x19, 0x9e ],
+const [ 0x3b, 0x9a, 0x49, 0x48, 0xd6, 0x7d, 0xc8, 0x94, 0xd7, 0x0c, 0x9e, 0xc3, 0x71, 0x04, 0xa7, 0x14, 0x7e, 0x22, 0xbc, 0xcc, 0xb9, 0x89, 0x83, 0xc2, 0x2d, 0x64, 0x8b, 0x21, 0xed, 0xcc, 0x98, 0x6a, 0x06, 0xec, 0x3b, 0xb8, 0xb2, 0x63, 0xa6, 0x48, 0xce, 0xe9, 0xbf, 0x38, 0x8e, 0x36, 0x73, 0x8f, 0x70, 0x20, 0x4d, 0x7e, 0x6e, 0x03, 0x47, 0xe6, 0x78, 0x65, 0xe0, 0x19, 0x21, 0xda, 0x6e, 0xe5, 0x99, 0x26, 0xb6, 0xcf, 0xdb, 0xa2, 0xba, 0x9c, 0x27, 0xe1, 0xd2, 0x16, 0xb3, 0x92, 0xfe, 0x0c, 0x9e, 0xa8, 0x7b, 0x9b, 0x25, 0xb9, 0x94, 0xac, 0x19, 0xa4, 0xbb, 0xbe, 0x90, 0x77, 0xd8, 0xe6, 0xdc, 0x90, 0xe1, 0x13, 0xb9, 0x02, 0xab, 0x97, 0xca, 0x3a, 0x00, 0xe3, 0x47, 0xe2, 0xf1, 0x92, 0xf0, 0x05, 0x6d, 0xaa, 0x45, 0x74, 0x13, 0x1e, 0xf8, 0x69, 0x45, 0x97, 0xa3, 0x6b, 0x7e, 0x73 ],
+const [ 0x93, 0x5a, 0x3c, 0x27, 0x24, 0x9d, 0xcf, 0x92, 0xae, 0xda, 0xc8, 0xdc, 0x76, 0xd2, 0x2f, 0xf7, 0x74, 0x2e, 0x5c, 0xee, 0x57, 0x71, 0x17, 0x78, 0xc9, 0x2a, 0xfd, 0xcd, 0xf3, 0x6e, 0x26, 0xb8, 0x44, 0x85, 0x04, 0xee, 0x6e, 0xe4, 0x8e, 0x9e, 0xb2, 0x5b, 0x9e, 0x49, 0x5e, 0x90, 0x98, 0xd4, 0x94, 0xac, 0x4d, 0xdc, 0x4c, 0x54, 0x1f, 0x49, 0x9c, 0xdb, 0x65, 0x26, 0x38, 0xb6, 0x11, 0xb0, 0x35, 0x30, 0x90, 0xac, 0x12, 0x5f, 0xf1, 0xfe, 0xf8, 0x56, 0x4a, 0x78, 0x41, 0x9c, 0x57, 0xf0, 0x38, 0xdd, 0x65, 0x95, 0x1f, 0xe0, 0x6e, 0x83, 0x77, 0xb9, 0x86, 0x94, 0x7b, 0x40, 0x75, 0x79, 0xee, 0xc1, 0xa6, 0x0a, 0x16, 0xf5, 0x40, 0xdb, 0x09, 0x31, 0x92, 0x10, 0x27, 0xde, 0xb4, 0x72, 0xe8, 0x29, 0x6b, 0xc2, 0xd8, 0xfb, 0x4e, 0x4d, 0xdf, 0x2c, 0x27, 0xc0, 0xc6, 0xf4, 0x9c, 0x3e ],
+const [ 0x54, 0x85, 0x64, 0xe5, 0xb7, 0x37, 0x04, 0x26, 0xd5, 0x75, 0xbb, 0xe8, 0x17, 0x5b, 0x48, 0xc2, 0x44, 0xde, 0xdc, 0xef, 0x3d, 0xaf, 0x72, 0x52, 0xec, 0x62, 0x5f, 0xb7, 0x77, 0xd0, 0x2a, 0x5c, 0xb9, 0xba, 0x9d, 0xb0, 0xf2, 0xaf, 0x1c, 0x5a, 0xbd, 0x2f, 0x36, 0x7d, 0x43, 0x10, 0x7a, 0x3a, 0xaf, 0x21, 0x8c, 0x77, 0xe2, 0x0e, 0x78, 0xdf, 0x67, 0x83, 0x45, 0x2a, 0xa9, 0x94, 0xce, 0x9f, 0x63, 0x5d, 0xcd, 0xd7, 0x59, 0xe5, 0x39, 0xc3, 0x46, 0x49, 0xd2, 0xf1, 0x15, 0x16, 0xfa, 0x0a, 0x53, 0xf6, 0xc6, 0xa0, 0xe5, 0x8f, 0x55, 0x26, 0xf6, 0xa8, 0x60, 0x40, 0x34, 0x8d, 0x13, 0x3e, 0x3c, 0xb5, 0x1b, 0xe2, 0x52, 0xa3, 0x01, 0x6a, 0x56, 0x0a, 0xb6, 0xca, 0xf3, 0x34, 0x6f, 0x3a, 0x1a, 0xa4, 0xb2, 0xf0, 0xaf, 0xfb, 0xb1, 0x2f, 0x82, 0x18, 0xd8, 0x80, 0x80, 0x83, 0xa2, 0x40 ],
+const [ 0xdd, 0x80, 0x26, 0x35, 0xf7, 0x14, 0x06, 0x03, 0x81, 0xd2, 0xee, 0x1d, 0xfb, 0x50, 0xf2, 0xda, 0xac, 0xc6, 0x37, 0x59, 0x89, 0x65, 0xfa, 0x71, 0x58, 0xea, 0xd3, 0xeb, 0x15, 0x72, 0x3b, 0xef, 0x95, 0x90, 0x4d, 0xbd, 0x69, 0x9d, 0xc9, 0x9e, 0x05, 0x4f, 0x5e, 0x19, 0x22, 0x8d, 0x29, 0x69, 0x60, 0x82, 0x79, 0x2f, 0x30, 0xf1, 0xd5, 0x65, 0xf1, 0xc8, 0x40, 0x93, 0x59, 0xf7, 0xbb, 0x45, 0x17, 0x82, 0x0c, 0xbc, 0xb6, 0xd5, 0xbe, 0xe4, 0xc5, 0x59, 0x69, 0x86, 0x35, 0x44, 0x33, 0xbf, 0x02, 0xb5, 0x97, 0xb1, 0x16, 0x00, 0x65, 0x78, 0x6a, 0x46, 0x0a, 0x5f, 0x6e, 0x4a, 0x12, 0x54, 0xab, 0x7f, 0xeb, 0x9a, 0xa6, 0x66, 0xec, 0xbe, 0x08, 0x16, 0x95, 0xcc, 0xfd, 0x1c, 0x19, 0xc2, 0xda, 0x86, 0x19, 0x45, 0x02, 0x3b, 0xb3, 0x93, 0x0a, 0x8e, 0xbb, 0xb9, 0x1b, 0x12, 0x48, 0x06 ],
+const [ 0xe8, 0x0a, 0x11, 0x27, 0x13, 0xb2, 0xe0, 0xaa, 0xfd, 0xdf, 0xdb, 0x71, 0xc0, 0x91, 0x14, 0x17, 0x19, 0xe1, 0x50, 0x1c, 0x1c, 0xe5, 0x5e, 0xe5, 0x26, 0xd4, 0xa8, 0x04, 0x14, 0x6a, 0x08, 0xba, 0xb2, 0x8e, 0xdd, 0xba, 0x76, 0x33, 0x5d, 0x30, 0x6f, 0x7c, 0x2d, 0x02, 0x78, 0x23, 0x2f, 0x56, 0xb1, 0x1b, 0x9b, 0x54, 0x30, 0x74, 0x51, 0x2d, 0xf3, 0x80, 0x6d, 0x5c, 0x19, 0x34, 0x1c, 0x2c, 0x52, 0xd0, 0xaf, 0x7a, 0x95, 0xc3, 0xee, 0xbc, 0x11, 0xc8, 0xaf, 0x42, 0x65, 0x56, 0xa7, 0xbc, 0x13, 0x37, 0x7f, 0xfd, 0x32, 0x76, 0x2a, 0xfe, 0x64, 0x7f, 0x77, 0x26, 0x08, 0x82, 0xe2, 0xc8, 0xb1, 0x18, 0xb0, 0xee, 0xd6, 0x29, 0x3b, 0x55, 0xcb, 0x0d, 0x8a, 0xb8, 0xef, 0xf1, 0x24, 0x51, 0x28, 0x7d, 0x26, 0x9e, 0x8c, 0xb4, 0x94, 0x61, 0x61, 0x1b, 0xed, 0xea, 0x48, 0x1d, 0x02, 0x98 ],
+const [ 0x7e, 0x5d, 0x6e, 0x5e, 0x94, 0x91, 0xa9, 0x65, 0x96, 0x8a, 0x08, 0xad, 0xcb, 0xfb, 0xbd, 0xb1, 0x99, 0x49, 0xf0, 0x09, 0x03, 0xf7, 0x61, 0x82, 0x70, 0x62, 0x4e, 0x74, 0xae, 0xae, 0x97, 0x50, 0x36, 0x00, 0x20, 0x79, 0xb2, 0xed, 0x77, 0x55, 0xbc, 0x33, 0xb7, 0xa3, 0xe9, 0xa7, 0xac, 0x0f, 0x06, 0x6f, 0x37, 0x03, 0xa1, 0x71, 0xf4, 0xc1, 0xcc, 0x0b, 0x1b, 0xaf, 0x1d, 0x05, 0xa4, 0xf1, 0xf9, 0xc4, 0xaf, 0x3d, 0x12, 0xc0, 0x22, 0xeb, 0x2f, 0x38, 0x94, 0x4c, 0x2c, 0x24, 0x6a, 0x3d, 0x41, 0x6b, 0x3f, 0xfc, 0x87, 0x56, 0x8a, 0x3a, 0xb7, 0x44, 0x7a, 0x71, 0x35, 0xa0, 0x25, 0x77, 0x4e, 0x11, 0xe2, 0x54, 0xbe, 0xf0, 0xf3, 0x51, 0x76, 0xff, 0x68, 0x51, 0x9c, 0x58, 0x3f, 0x64, 0xd2, 0xa3, 0xd0, 0x9a, 0xbb, 0x8c, 0x69, 0x15, 0xbb, 0x75, 0x35, 0x62, 0xff, 0x67, 0x62, 0x0a ],
+const [ 0xfc, 0x06, 0x24, 0xc9, 0xd2, 0xfb, 0x23, 0x77, 0x07, 0xdf, 0x2c, 0x7b, 0xd9, 0x09, 0x0b, 0x03, 0x13, 0x29, 0x83, 0x54, 0x32, 0xd9, 0x93, 0x04, 0xc5, 0x75, 0xf8, 0x69, 0x1a, 0x2d, 0xf3, 0x51, 0x16, 0x58, 0x4c, 0xf3, 0x65, 0x0b, 0x97, 0x26, 0xd4, 0xeb, 0xb6, 0xd1, 0xfa, 0x3f, 0x9f, 0xa3, 0x1e, 0x4a, 0x60, 0x04, 0x55, 0xd7, 0x60, 0x4b, 0xeb, 0x15, 0xe7, 0x31, 0x04, 0xa5, 0xe0, 0x85, 0x83, 0xf2, 0xde, 0x22, 0x2b, 0xc1, 0x5e, 0x1f, 0x04, 0x09, 0x4c, 0x45, 0x01, 0x04, 0xc8, 0xc6, 0xdf, 0x86, 0x29, 0x2b, 0x50, 0x8e, 0x42, 0x8f, 0x59, 0x1a, 0xe5, 0x0b, 0xf9, 0x40, 0xa6, 0x71, 0x0b, 0x7b, 0xe1, 0x3d, 0x6d, 0x43, 0xff, 0xc8, 0x62, 0xe0, 0xf4, 0xbf, 0x35, 0x7f, 0x0c, 0xd4, 0x20, 0x86, 0xe8, 0xb3, 0x6b, 0x25, 0xc3, 0x38, 0xd8, 0x2d, 0xfb, 0xdf, 0x3f, 0x26, 0xcc, 0x7c ],
+const [ 0xe3, 0x5d, 0xc1, 0xd0, 0xe4, 0x14, 0xae, 0x0e, 0x58, 0x6e, 0xbe, 0xc9, 0xa4, 0x4c, 0x19, 0x18, 0xd7, 0x95, 0xdb, 0x37, 0x8a, 0x89, 0x17, 0x7d, 0x0b, 0x52, 0x1c, 0x8e, 0xba, 0xdc, 0xf6, 0xd2, 0xb2, 0xe7, 0x38, 0x26, 0xac, 0x5b, 0xf9, 0xd1, 0x21, 0xdb, 0x1d, 0xb9, 0xaf, 0x9c, 0xd6, 0xd7, 0xbe, 0x78, 0x69, 0xe8, 0x63, 0x3e, 0x36, 0x65, 0x85, 0x4d, 0xf3, 0xb6, 0x3e, 0x61, 0x38, 0xa3, 0x83, 0xac, 0x40, 0x0b, 0x08, 0x29, 0xee, 0xd8, 0x5e, 0x2d, 0x0e, 0x32, 0x5e, 0x3f, 0xde, 0xf3, 0xcb, 0x29, 0xcc, 0x5b, 0x33, 0x4f, 0x82, 0x06, 0x16, 0x40, 0x20, 0x1a, 0x4b, 0x8b, 0xc8, 0xc5, 0x9e, 0xd4, 0x60, 0xe7, 0xbe, 0x26, 0x93, 0x0b, 0x57, 0x8b, 0x19, 0x9c, 0x7b, 0xda, 0x39, 0x56, 0x46, 0xd1, 0x8c, 0xfa, 0xc2, 0x63, 0x03, 0x46, 0x08, 0x53, 0x2b, 0x24, 0xa8, 0x02, 0xb0, 0x22 ],
+const [ 0xdc, 0x43, 0x54, 0xff, 0x55, 0x7d, 0xfa, 0x58, 0xb1, 0x7a, 0x0e, 0x38, 0xf6, 0x3a, 0x61, 0xc2, 0x0e, 0x0f, 0xd1, 0xeb, 0x6c, 0xac, 0x10, 0x2c, 0xf3, 0x7f, 0xa7, 0x79, 0x13, 0x41, 0x3a, 0x77, 0x35, 0xcb, 0x0d, 0xea, 0x59, 0x2b, 0xc7, 0x6c, 0xfd, 0xf7, 0x76, 0x65, 0x41, 0xe1, 0xd4, 0x37, 0x4a, 0x8c, 0xc9, 0xb9, 0xe4, 0x9e, 0x30, 0xe7, 0x6b, 0x17, 0xde, 0xd8, 0xeb, 0xe1, 0xe0, 0xf0, 0x86, 0xa7, 0x05, 0x56, 0x16, 0xeb, 0x9d, 0xa8, 0x14, 0x53, 0x7f, 0xee, 0xb9, 0x44, 0x51, 0xcd, 0x62, 0xb2, 0x03, 0xfe, 0x39, 0x37, 0x9d, 0xfe, 0x12, 0x62, 0x3b, 0x06, 0x93, 0x51, 0x55, 0x3d, 0x98, 0x82, 0x44, 0x2d, 0xd5, 0xe6, 0x02, 0x73, 0xbe, 0x37, 0x32, 0xbb, 0xa3, 0x8c, 0x60, 0xec, 0x20, 0x2b, 0x89, 0xa0, 0xb4, 0x9e, 0xde, 0xd7, 0xb0, 0x09, 0xc5, 0xec, 0x53, 0xba, 0x21, 0xc8 ],
+const [ 0x36, 0x58, 0x1b, 0x49, 0x8c, 0xc8, 0xb9, 0xea, 0x79, 0xde, 0x28, 0xca, 0x91, 0xa9, 0xcd, 0x0a, 0x87, 0xe3, 0x0b, 0xce, 0xfe, 0x73, 0xb9, 0xe5, 0x9c, 0x37, 0xd3, 0xa8, 0x60, 0x01, 0x6f, 0x24, 0x36, 0xdf, 0xf3, 0x7b, 0xc9, 0xa0, 0x86, 0x87, 0x99, 0x93, 0xc4, 0xc1, 0x4d, 0x92, 0xb6, 0x61, 0x4a, 0x3f, 0x01, 0xc7, 0x84, 0x8e, 0x5d, 0x1a, 0x94, 0x84, 0x49, 0x2f, 0x0c, 0x3e, 0xfe, 0xac, 0x07, 0x34, 0xa1, 0x6d, 0x04, 0xbf, 0xbc, 0x26, 0xf4, 0xd9, 0xef, 0x4a, 0x91, 0x24, 0xe3, 0x2c, 0xf2, 0x2f, 0x80, 0x65, 0x5c, 0xf4, 0x60, 0x75, 0x5c, 0xa5, 0x83, 0xad, 0x12, 0xa8, 0x44, 0x4c, 0xd0, 0xe0, 0x8b, 0xe8, 0xe4, 0x2e, 0x45, 0x0f, 0xb1, 0x37, 0x11, 0x2f, 0x05, 0x68, 0x3c, 0xb3, 0xa6, 0x38, 0xf0, 0x6f, 0x2e, 0xad, 0xa8, 0x3e, 0x19, 0x22, 0xe7, 0xe9, 0x1d, 0x47, 0x2a, 0x4b ],
+const [ 0x45, 0xae, 0x84, 0xfe, 0x11, 0x07, 0x87, 0x13, 0xbc, 0x87, 0xc4, 0x65, 0xe8, 0xd8, 0x8f, 0x0b, 0x23, 0xe2, 0x80, 0x4a, 0x6a, 0x3e, 0x19, 0xaf, 0xeb, 0xee, 0xaa, 0x5a, 0x0f, 0x4c, 0x72, 0x9d, 0xb8, 0x41, 0x07, 0xc6, 0xc8, 0xb7, 0xf8, 0x38, 0xe2, 0x51, 0xb0, 0xc1, 0x74, 0x59, 0x9d, 0x27, 0xf5, 0xfa, 0x92, 0x04, 0x6b, 0xaf, 0x6a, 0xd4, 0x31, 0xfb, 0xef, 0x4d, 0xf7, 0x5b, 0xfa, 0xef, 0x0a, 0x79, 0xdb, 0xdb, 0xd6, 0xa2, 0xfa, 0xe8, 0xa9, 0x7a, 0xbf, 0xf4, 0xb9, 0xee, 0xb0, 0x78, 0x69, 0x6b, 0xd9, 0x5f, 0xc8, 0x4d, 0x71, 0x19, 0x5a, 0x9b, 0xba, 0xeb, 0x1c, 0xf1, 0x29, 0x89, 0xc2, 0xbd, 0xc7, 0xe6, 0x43, 0xae, 0xd7, 0x4b, 0x97, 0x6a, 0xb9, 0xa7, 0xbf, 0x80, 0x0e, 0x26, 0x07, 0x9d, 0x1d, 0x04, 0x88, 0x02, 0x76, 0xa4, 0xf0, 0x35, 0xd4, 0xdc, 0x86, 0xf7, 0x48, 0x93 ],
+const [ 0xf6, 0xf8, 0x3f, 0xf6, 0xdd, 0xf3, 0x86, 0xbd, 0xf3, 0xaf, 0x94, 0x09, 0xef, 0x5c, 0xef, 0x16, 0xac, 0xb3, 0x76, 0x18, 0x23, 0x22, 0xf5, 0x7b, 0x97, 0x29, 0xf7, 0x6f, 0x0f, 0x04, 0xdb, 0xa4, 0x09, 0x8a, 0x2a, 0x52, 0x6d, 0x55, 0x28, 0x7d, 0xc0, 0x23, 0xa9, 0x77, 0x9a, 0x7c, 0x26, 0xa6, 0x5a, 0x95, 0x10, 0x87, 0x18, 0x75, 0x64, 0xf3, 0xdb, 0x56, 0x80, 0xa2, 0x0c, 0x4e, 0x35, 0xed, 0x2b, 0x2e, 0x1d, 0xd8, 0xc1, 0xab, 0x2f, 0x4f, 0x96, 0xbb, 0x90, 0xb0, 0x23, 0x42, 0xac, 0x8a, 0x4a, 0xee, 0x86, 0xa5, 0x45, 0x5f, 0x4c, 0x42, 0xdd, 0x8c, 0x2f, 0xa3, 0xdc, 0x62, 0x72, 0xce, 0xc4, 0xae, 0xc0, 0x8f, 0xc1, 0x3c, 0xc2, 0xbc, 0xdd, 0x40, 0xf1, 0xbc, 0x73, 0xf6, 0xa9, 0x4a, 0xe6, 0x86, 0x7f, 0x77, 0x92, 0x2a, 0xd5, 0xee, 0x03, 0x92, 0xac, 0x7c, 0x65, 0x88, 0xb9, 0xd0 ],
+const [ 0x25, 0xc0, 0x4b, 0x85, 0x7a, 0x22, 0x43, 0x89, 0xe8, 0xa2, 0xa3, 0x04, 0xe1, 0xbb, 0x8e, 0xe1, 0xb3, 0x52, 0xe4, 0xcf, 0x5c, 0x3c, 0xb6, 0xe9, 0x9f, 0x01, 0xfd, 0x95, 0x57, 0xdf, 0x8b, 0xac, 0x0c, 0x12, 0x41, 0xdc, 0xc4, 0x53, 0x83, 0x4b, 0x1b, 0x9f, 0xe9, 0x7d, 0x96, 0x39, 0x37, 0x78, 0x35, 0xf2, 0x90, 0x26, 0x47, 0xa8, 0xe6, 0xfa, 0x82, 0x0d, 0xb5, 0xd6, 0x53, 0xa9, 0xf1, 0x2d, 0x73, 0x23, 0x3d, 0x65, 0xbb, 0xbc, 0x5d, 0x7f, 0x39, 0x1c, 0xee, 0xf9, 0x83, 0x51, 0x54, 0xf3, 0x4b, 0x15, 0xf5, 0x92, 0x34, 0x4f, 0xa5, 0xa2, 0xe4, 0xdd, 0x60, 0x7f, 0x5b, 0x91, 0x3f, 0x35, 0x83, 0x79, 0xa5, 0xe6, 0x08, 0x64, 0xb9, 0x6c, 0x69, 0xa1, 0x1a, 0x40, 0x50, 0x0a, 0xce, 0x9a, 0x1f, 0x42, 0x7b, 0xda, 0xcb, 0x3a, 0xd9, 0x27, 0xed, 0xfa, 0x67, 0x56, 0x16, 0x9e, 0x5d, 0x0d ],
+const [ 0x6c, 0x15, 0xd1, 0x68, 0x6e, 0x68, 0x0c, 0x5a, 0xee, 0x29, 0x41, 0x90, 0x0d, 0xc9, 0xaf, 0x9d, 0x25, 0x03, 0xb3, 0xb6, 0xa5, 0x62, 0x3f, 0x5c, 0x1c, 0x04, 0x87, 0x3c, 0x93, 0x9d, 0xfd, 0x53, 0x20, 0xbe, 0x80, 0x55, 0xb8, 0x58, 0xd0, 0x50, 0x45, 0x7c, 0x46, 0x8c, 0xf8, 0x64, 0xc2, 0xb7, 0xe1, 0xb7, 0xe4, 0x3e, 0xbd, 0x09, 0x7f, 0xfe, 0x0f, 0xa1, 0x4a, 0x1c, 0x72, 0x80, 0xd9, 0x31, 0x2d, 0x9f, 0xcc, 0xab, 0x08, 0x77, 0x47, 0x70, 0x5e, 0xc6, 0xa2, 0xc4, 0x74, 0x91, 0x61, 0x6c, 0x09, 0x65, 0x66, 0x13, 0x2e, 0xe3, 0x65, 0xee, 0x58, 0x7c, 0x99, 0x9c, 0xb4, 0x78, 0xb5, 0x50, 0xba, 0x3d, 0x1e, 0x31, 0x05, 0xce, 0x57, 0x01, 0x62, 0x92, 0xbc, 0xfd, 0x27, 0x57, 0x74, 0x05, 0xc6, 0x96, 0xa1, 0xfd, 0xa1, 0xf8, 0xd9, 0x73, 0x20, 0x1a, 0xda, 0x82, 0x01, 0x8d, 0x79, 0xf6 ],
+const [ 0xb9, 0x9a, 0x11, 0x0b, 0xee, 0x03, 0xf4, 0x40, 0xf1, 0x51, 0x45, 0xe2, 0x8d, 0x32, 0xc3, 0x40, 0x29, 0x7f, 0xb8, 0x10, 0xef, 0xcc, 0x36, 0xa8, 0x2e, 0x3d, 0xa1, 0x71, 0xfc, 0x9b, 0x6d, 0x98, 0x1f, 0xa6, 0x29, 0x06, 0x2e, 0xad, 0xbd, 0x93, 0xf3, 0x5d, 0xf0, 0x76, 0x14, 0xd7, 0x2d, 0x00, 0xf2, 0x05, 0x86, 0x8b, 0xd2, 0x2d, 0xf9, 0xad, 0x3b, 0xc6, 0xf2, 0xb1, 0x9e, 0x8b, 0x12, 0x47, 0x3d, 0xcf, 0x2f, 0x7a, 0x45, 0x10, 0x9c, 0xe3, 0x3d, 0xce, 0xaa, 0x1c, 0xa4, 0x9d, 0x6e, 0x78, 0xd6, 0x7a, 0xc5, 0xf1, 0x30, 0x5b, 0x96, 0x62, 0x74, 0x0a, 0x57, 0xf7, 0x6f, 0x32, 0xd3, 0xe1, 0xd9, 0xba, 0x2a, 0x4e, 0x7c, 0x53, 0x19, 0x98, 0x99, 0x4d, 0x7b, 0xbc, 0x87, 0xaf, 0x10, 0x0f, 0x9d, 0x86, 0x7e, 0x2c, 0x52, 0x7d, 0x95, 0x31, 0xa3, 0xae, 0xd7, 0x2b, 0xb5, 0xb8, 0x38, 0xce ],
+const [ 0xc8, 0x21, 0xbe, 0x1c, 0xce, 0x09, 0x57, 0x9e, 0xa8, 0x99, 0x89, 0x9d, 0x24, 0xf8, 0x32, 0x99, 0x94, 0xc2, 0xc8, 0x39, 0xcf, 0x00, 0x84, 0xe2, 0x78, 0x57, 0xc6, 0x88, 0x83, 0x7f, 0xb5, 0xc4, 0xf4, 0xf7, 0x25, 0x27, 0xea, 0xf7, 0xbf, 0xcf, 0xdd, 0xa7, 0x5b, 0x37, 0x24, 0x8e, 0xb1, 0x53, 0xba, 0x4d, 0x31, 0xdd, 0x41, 0x8d, 0x2f, 0xea, 0x47, 0x36, 0x43, 0xc0, 0xc9, 0xe1, 0xf0, 0xeb, 0xf5, 0x91, 0x83, 0x8e, 0x34, 0x9d, 0x3e, 0xf8, 0x68, 0xf1, 0xb6, 0x77, 0x72, 0x77, 0x7a, 0x71, 0xf8, 0xcf, 0xf5, 0xb0, 0x65, 0x46, 0x96, 0xfe, 0x31, 0x06, 0x2e, 0xf2, 0x62, 0x8a, 0x99, 0x09, 0x53, 0x55, 0xa0, 0xf8, 0xb4, 0xe4, 0x1e, 0x41, 0xd2, 0xe1, 0x62, 0x05, 0x18, 0x99, 0xd5, 0x19, 0xd6, 0xb0, 0xdc, 0x5c, 0x42, 0x13, 0x00, 0x47, 0xbd, 0x2f, 0x4d, 0xc5, 0x57, 0x61, 0xf7, 0x45 ],
+const [ 0x53, 0xcb, 0x09, 0xd0, 0xa7, 0x88, 0xe4, 0x46, 0x6d, 0x01, 0x58, 0x8d, 0xf6, 0x94, 0x5d, 0x87, 0x28, 0xd9, 0x36, 0x3f, 0x76, 0xcd, 0x01, 0x2a, 0x10, 0x30, 0x8d, 0xad, 0x56, 0x2b, 0x6b, 0xe0, 0x93, 0x36, 0x48, 0x92, 0xe8, 0x39, 0x7a, 0x8d, 0x86, 0xf1, 0xd8, 0x1a, 0x20, 0x96, 0xcf, 0xc8, 0xa1, 0xbb, 0xb2, 0x6a, 0x1a, 0x75, 0x52, 0x5f, 0xfe, 0xbf, 0xcf, 0x16, 0x91, 0x1d, 0xad, 0xd0, 0x9e, 0x80, 0x2a, 0xa8, 0x68, 0x6a, 0xcf, 0xd1, 0xe4, 0x52, 0x46, 0x20, 0x25, 0x4a, 0x6b, 0xca, 0x18, 0xdf, 0xa5, 0x6e, 0x71, 0x41, 0x77, 0x56, 0xe5, 0xa4, 0x52, 0xfa, 0x9a, 0xe5, 0xae, 0xc5, 0xdc, 0x71, 0x59, 0x1c, 0x11, 0x63, 0x0e, 0x9d, 0xef, 0xec, 0x49, 0xa4, 0xec, 0xf8, 0x5a, 0x14, 0xf6, 0x0e, 0xb8, 0x54, 0x65, 0x78, 0x99, 0x97, 0x2e, 0xa5, 0xbf, 0x61, 0x59, 0xcb, 0x95, 0x47 ],
+const [ 0xf9, 0x66, 0x0f, 0xb7, 0x84, 0xc1, 0x4b, 0x5f, 0xbe, 0xc2, 0x80, 0x52, 0x6a, 0x69, 0xc2, 0x29, 0x4f, 0xba, 0x12, 0xae, 0xa1, 0x63, 0x78, 0x9b, 0xbe, 0x9f, 0x52, 0xa5, 0x1b, 0x5a, 0xeb, 0xb9, 0x7d, 0x96, 0x4f, 0x86, 0x6c, 0x0d, 0x5e, 0x3b, 0xe4, 0x18, 0x20, 0x92, 0x4f, 0xcf, 0x58, 0x0d, 0xb0, 0x72, 0x5c, 0x7f, 0x21, 0x08, 0x23, 0xcf, 0x7f, 0x45, 0xa0, 0xf9, 0x64, 0xb1, 0x4e, 0x55, 0x55, 0x07, 0x0d, 0x1c, 0x3d, 0xdb, 0x2c, 0x28, 0x1a, 0x80, 0xc7, 0xfb, 0xf7, 0x29, 0x53, 0x03, 0x1a, 0x4e, 0x77, 0x1d, 0x7e, 0x52, 0x1d, 0x57, 0x84, 0x62, 0xca, 0xfa, 0xe5, 0xa0, 0x2a, 0xc8, 0xeb, 0x81, 0xf0, 0x82, 0xe1, 0x73, 0xdd, 0xad, 0xc8, 0xc4, 0x1d, 0x96, 0x4b, 0xbf, 0xda, 0x94, 0xf5, 0x18, 0x0c, 0x8d, 0xa2, 0x8a, 0x8e, 0xbb, 0x33, 0xbe, 0x77, 0xb0, 0x86, 0x6f, 0xa7, 0x98 ],
+const [ 0x64, 0xa7, 0x8a, 0x4d, 0x6f, 0xb8, 0xff, 0x38, 0x13, 0xdf, 0x8d, 0xc0, 0x22, 0xfa, 0xaf, 0x44, 0x15, 0xe4, 0xdf, 0x29, 0x49, 0xe1, 0x64, 0x67, 0x68, 0x3c, 0x6c, 0x47, 0x24, 0x2e, 0x5a, 0x6b, 0x2c, 0x02, 0x61, 0x0e, 0x58, 0x77, 0x52, 0x8d, 0x27, 0x66, 0xb2, 0x26, 0x6c, 0xa4, 0x10, 0x00, 0x44, 0x2a, 0x95, 0x6c, 0x4b, 0x73, 0xdd, 0x6b, 0x10, 0x26, 0x05, 0x70, 0xc6, 0xf5, 0x06, 0x67, 0x3c, 0xc5, 0x41, 0xf5, 0x0f, 0x0f, 0x5b, 0x02, 0x1e, 0x86, 0x4a, 0x75, 0x3e, 0xfa, 0xb0, 0x3e, 0x2f, 0x7c, 0x68, 0x9a, 0xcf, 0xc3, 0x5f, 0x92, 0x8e, 0xce, 0xa6, 0xc5, 0x22, 0xcb, 0xc5, 0x68, 0x7c, 0x38, 0x51, 0x8b, 0xfa, 0x48, 0xc1, 0x9e, 0xde, 0x88, 0x7d, 0x33, 0xff, 0xc2, 0x38, 0x06, 0xbe, 0x21, 0x80, 0x3a, 0x3c, 0x97, 0x93, 0xe5, 0xca, 0x7c, 0x75, 0xcf, 0xa1, 0x78, 0x3f, 0x77 ],
+const [ 0xa7, 0x73, 0x4a, 0x07, 0x39, 0xd5, 0x1a, 0xf0, 0xac, 0x2c, 0x40, 0x39, 0xdf, 0xaf, 0xa8, 0x6f, 0x36, 0xfc, 0x06, 0xc2, 0x35, 0x5d, 0x0f, 0x65, 0x4d, 0x4a, 0xe9, 0x38, 0xf5, 0x2f, 0xe0, 0xa5, 0xfd, 0x6f, 0x5a, 0xc7, 0x1f, 0xa8, 0x0d, 0xd2, 0xd8, 0x39, 0x6f, 0xaf, 0x76, 0x01, 0x6e, 0xe6, 0x71, 0x6a, 0x62, 0xc1, 0xfe, 0xa6, 0x40, 0xaf, 0xe2, 0x39, 0x10, 0xe6, 0x84, 0xb8, 0xa1, 0x4c, 0x47, 0xd0, 0x7b, 0x98, 0x16, 0x89, 0x15, 0xb4, 0x41, 0xcc, 0x48, 0x66, 0x87, 0x24, 0x04, 0x30, 0x74, 0xc1, 0x42, 0x75, 0xed, 0xc2, 0x39, 0xdc, 0x09, 0xb4, 0xd5, 0xfa, 0x22, 0x55, 0x65, 0x2b, 0x2c, 0x9e, 0x94, 0xc0, 0x46, 0x01, 0x9a, 0x60, 0x8f, 0xf0, 0xb3, 0xa8, 0x3b, 0x9e, 0xd0, 0x15, 0xe6, 0x09, 0x8d, 0x24, 0x27, 0x38, 0x64, 0xb7, 0x69, 0xc1, 0x20, 0xbb, 0xf6, 0x8f, 0x94, 0x08 ],
+const [ 0x0b, 0x9a, 0x58, 0xcd, 0x96, 0x35, 0x1a, 0x13, 0x5c, 0x55, 0x9d, 0x17, 0xe8, 0x2e, 0xde, 0x34, 0x34, 0xa0, 0xca, 0xf0, 0xbe, 0xfe, 0xf5, 0xdf, 0xdf, 0x13, 0x8e, 0xc5, 0x58, 0x67, 0x93, 0xfb, 0x2e, 0xbe, 0x41, 0x14, 0xb9, 0xe2, 0xcf, 0xbf, 0xf7, 0xa2, 0x5b, 0xef, 0x26, 0x1b, 0x25, 0x3a, 0x91, 0x36, 0xfb, 0x7f, 0xaa, 0x72, 0xf4, 0xcc, 0x59, 0xe4, 0x61, 0x7f, 0x94, 0x7c, 0x01, 0xab, 0x30, 0x89, 0x74, 0xbd, 0xf6, 0x7f, 0xf2, 0x5f, 0xfa, 0xf8, 0x3d, 0x9c, 0x28, 0xfa, 0xd4, 0x45, 0x20, 0x78, 0x6a, 0x94, 0x44, 0x1b, 0x96, 0x10, 0x0e, 0x42, 0xcc, 0xb0, 0xa8, 0x47, 0x8c, 0x43, 0xb6, 0x04, 0xd9, 0x0f, 0x76, 0x95, 0xed, 0xb9, 0x0c, 0x60, 0x2b, 0x65, 0x17, 0x53, 0x55, 0x1d, 0x88, 0x6d, 0xff, 0x77, 0xb4, 0x80, 0x44, 0x72, 0xa8, 0x35, 0xb7, 0xa2, 0xbc, 0x50, 0x9c, 0x8d ],
+const [ 0xe5, 0x80, 0x4b, 0x09, 0x9e, 0xe4, 0xb3, 0x51, 0x84, 0x3a, 0xdb, 0x9c, 0x9e, 0x3c, 0x23, 0x17, 0x73, 0x25, 0x6e, 0x6a, 0x20, 0x70, 0xd6, 0x97, 0xa9, 0xe2, 0x9e, 0x25, 0x8d, 0xca, 0x67, 0x7f, 0x9d, 0x88, 0xa7, 0x97, 0x0d, 0x4c, 0x58, 0xce, 0xcc, 0x20, 0xed, 0x18, 0x11, 0x29, 0x8a, 0x5b, 0x37, 0x29, 0x74, 0x19, 0xca, 0x49, 0xc7, 0x4f, 0xe2, 0x16, 0x67, 0x9d, 0xaf, 0xc9, 0x38, 0xa6, 0x56, 0xcb, 0x92, 0xba, 0xfb, 0x78, 0xef, 0xb3, 0x1f, 0x24, 0xe7, 0x1c, 0x2d, 0x5b, 0x5f, 0x99, 0x4f, 0x6d, 0xfd, 0x82, 0x86, 0x2a, 0xdf, 0xd2, 0xfa, 0xeb, 0x8c, 0x40, 0x8f, 0xd2, 0x2a, 0xab, 0xb8, 0x52, 0xf2, 0xbb, 0x90, 0xf1, 0xe2, 0xc6, 0x27, 0x4c, 0xb1, 0xf0, 0x19, 0x5c, 0x08, 0x97, 0x66, 0xf9, 0xef, 0xee, 0x7d, 0x9c, 0x86, 0xe7, 0x9a, 0x69, 0xf5, 0x57, 0x52, 0x6d, 0xa5, 0x55 ],
+const [ 0x8b, 0x1d, 0x45, 0x23, 0xb6, 0xe4, 0x57, 0xf8, 0x56, 0xe5, 0xf0, 0x98, 0x75, 0xd3, 0x89, 0xeb, 0x65, 0x87, 0x22, 0x3e, 0x53, 0x47, 0x7b, 0xa0, 0x1f, 0x49, 0x87, 0x8c, 0x6c, 0x73, 0x1e, 0xc9, 0xf3, 0x65, 0xf2, 0x8f, 0x1c, 0xb9, 0xc4, 0xeb, 0xcf, 0x89, 0xd8, 0x64, 0x87, 0x32, 0xa6, 0xdf, 0xa9, 0x58, 0xd2, 0xc0, 0x15, 0x2b, 0x5e, 0x52, 0xfa, 0xe8, 0x1f, 0x69, 0xee, 0xa2, 0x6d, 0x46, 0x3e, 0x42, 0x1f, 0xba, 0x82, 0xcd, 0xb7, 0x8f, 0x75, 0xe5, 0xd9, 0x23, 0x04, 0x93, 0x02, 0x56, 0xa5, 0x43, 0x76, 0xa6, 0xea, 0x10, 0x7a, 0x99, 0x56, 0x42, 0xc4, 0x5c, 0x6f, 0x15, 0x30, 0xa9, 0x14, 0xbd, 0xb4, 0xed, 0x11, 0xa6, 0x96, 0xab, 0xf1, 0x00, 0xdc, 0x1b, 0x14, 0x7b, 0x05, 0x18, 0x01, 0x4f, 0xf6, 0x39, 0xfc, 0x80, 0x37, 0x3d, 0xdc, 0x60, 0x5f, 0xac, 0x17, 0x55, 0xcd, 0xbb ],
+const [ 0xff, 0x86, 0x62, 0xe9, 0xaf, 0x3a, 0x38, 0xd3, 0xef, 0xc0, 0x14, 0x31, 0x38, 0xfa, 0x61, 0x9a, 0x57, 0xd5, 0x69, 0xf6, 0x1e, 0x29, 0xb3, 0x89, 0x5a, 0xe0, 0x8f, 0x2d, 0x05, 0x5b, 0xef, 0xde, 0xbc, 0x11, 0x78, 0x7c, 0x73, 0x79, 0xd9, 0xcd, 0x67, 0x2b, 0x5c, 0xc2, 0x54, 0x42, 0xba, 0xfb, 0xe8, 0x04, 0x34, 0x8c, 0x78, 0xc5, 0xdf, 0x02, 0xf3, 0x08, 0x40, 0xa1, 0x14, 0xe8, 0x18, 0xf0, 0xdb, 0xb6, 0x81, 0x78, 0x3d, 0xe4, 0x3a, 0xc8, 0x1b, 0x21, 0x40, 0xbc, 0x71, 0xc6, 0x9e, 0xff, 0xd0, 0x71, 0x85, 0xcf, 0x0e, 0xef, 0x9f, 0x00, 0x3c, 0x60, 0xa1, 0x44, 0xd8, 0x95, 0x20, 0xa9, 0x44, 0xbd, 0xa5, 0x63, 0x77, 0x41, 0x03, 0xcc, 0xf3, 0xec, 0xe8, 0xa9, 0xf6, 0x4f, 0xb3, 0xaf, 0xf5, 0x64, 0x85, 0x46, 0x46, 0x71, 0x9b, 0x8c, 0x1d, 0x2f, 0xdb, 0x9d, 0xb9, 0x2c, 0xac, 0x12 ],
+const [ 0x33, 0xab, 0x86, 0x1f, 0x08, 0x9b, 0xac, 0x0e, 0x5c, 0x88, 0x6f, 0x66, 0xad, 0xc5, 0x68, 0xae, 0x7b, 0xa3, 0x31, 0x65, 0x5a, 0x37, 0x1d, 0xe7, 0x47, 0x5e, 0x26, 0x91, 0x38, 0xff, 0x27, 0x25, 0xf7, 0x90, 0x4c, 0x70, 0x2f, 0xdc, 0xc6, 0x2a, 0xc7, 0x03, 0xc3, 0x1d, 0x70, 0xc2, 0x9d, 0x8a, 0x7a, 0xf4, 0x51, 0xc8, 0xec, 0x59, 0x34, 0x2e, 0xd3, 0x97, 0xe1, 0x33, 0xda, 0x7e, 0x76, 0xd4, 0x1b, 0x90, 0x00, 0x36, 0x35, 0xc1, 0x33, 0x8d, 0x9f, 0x7b, 0x5f, 0x3c, 0x3c, 0xe5, 0x9f, 0x3e, 0x2f, 0x65, 0x54, 0xc4, 0xf0, 0x64, 0xd1, 0x1f, 0x9f, 0x51, 0x58, 0xe1, 0x99, 0xe8, 0x46, 0x3f, 0x4a, 0xb4, 0x8a, 0xba, 0x42, 0xd2, 0x5b, 0xff, 0x8a, 0xf9, 0x2b, 0x0b, 0x38, 0xb7, 0xd6, 0x92, 0x41, 0xfd, 0x20, 0xa2, 0x8f, 0xde, 0x5e, 0x84, 0x53, 0x94, 0x73, 0xe3, 0x9d, 0xc4, 0xfe, 0x2f ],
+const [ 0x5a, 0x22, 0x40, 0xf6, 0x4f, 0xc7, 0x04, 0xce, 0x9f, 0x8e, 0xd3, 0x3d, 0x01, 0x9e, 0x41, 0x55, 0xcb, 0x46, 0x74, 0x7a, 0x65, 0x9e, 0x34, 0x21, 0xfe, 0x6b, 0x42, 0xd6, 0x7f, 0x44, 0xeb, 0x84, 0xbd, 0xf3, 0xdc, 0xf1, 0xf3, 0x1e, 0x38, 0x88, 0x6f, 0x27, 0xe8, 0x5b, 0x8b, 0x50, 0x33, 0x68, 0xdf, 0x23, 0x8e, 0x1b, 0xb5, 0x11, 0xb5, 0x15, 0xbd, 0x59, 0xfa, 0x2c, 0x03, 0x2b, 0xdd, 0xb3, 0x1d, 0x0d, 0xde, 0xfb, 0xa9, 0x7f, 0x8f, 0x19, 0xf7, 0xda, 0xed, 0xea, 0x02, 0x7e, 0xf0, 0x55, 0xa5, 0x2c, 0x61, 0xd0, 0x0b, 0xb1, 0xec, 0x26, 0x68, 0xc5, 0x76, 0x77, 0xe6, 0x32, 0xb1, 0x80, 0xe3, 0x39, 0xed, 0x1c, 0x59, 0x31, 0x31, 0x0b, 0x9d, 0x71, 0x8a, 0xf3, 0x4d, 0x70, 0xa3, 0xa4, 0x83, 0x2b, 0x96, 0xa0, 0x4f, 0xc7, 0x02, 0xdb, 0x65, 0x78, 0x5e, 0xbf, 0x12, 0xa1, 0x8c, 0x73 ],
+const [ 0xf4, 0x07, 0xf8, 0x15, 0xa3, 0x3c, 0xd4, 0x50, 0xc0, 0xb7, 0x2a, 0x37, 0x8f, 0x00, 0x76, 0x27, 0x88, 0xf9, 0x1b, 0xc4, 0x4f, 0x09, 0xf9, 0x3d, 0xe6, 0x7a, 0x41, 0xd2, 0x22, 0x20, 0x88, 0x93, 0x5b, 0x3c, 0x1b, 0x6a, 0x68, 0x9f, 0x93, 0x5b, 0xca, 0x13, 0xa9, 0x0b, 0x28, 0xf6, 0x4b, 0x7f, 0xfc, 0x28, 0xef, 0x27, 0x8b, 0x28, 0x27, 0x1b, 0x1a, 0x79, 0x75, 0xa4, 0x5f, 0x4b, 0x61, 0xfe, 0x36, 0x57, 0xca, 0x5c, 0x95, 0x0b, 0x7a, 0x2d, 0xc2, 0xe7, 0xfd, 0x9e, 0xc3, 0x27, 0xb2, 0x60, 0x17, 0xa2, 0x22, 0xab, 0xa3, 0xf2, 0x91, 0x83, 0xef, 0xd5, 0xd3, 0x3a, 0x92, 0xd3, 0x61, 0x36, 0xeb, 0x21, 0xac, 0xf4, 0x12, 0xc6, 0xb1, 0x4d, 0x0e, 0xfc, 0xce, 0xf8, 0x49, 0xd9, 0xd4, 0x51, 0x41, 0x2e, 0x5d, 0x58, 0x7f, 0xb0, 0x60, 0xfd, 0xcd, 0x55, 0x02, 0x9b, 0xa4, 0x01, 0xaf, 0xc2 ],
+const [ 0xdb, 0xb8, 0x4f, 0xef, 0x13, 0x0f, 0x92, 0x98, 0x05, 0xb0, 0x87, 0x6c, 0xb4, 0x64, 0x6a, 0x04, 0x63, 0x30, 0xbc, 0x33, 0xab, 0x1c, 0xf1, 0xe9, 0xca, 0x38, 0x69, 0x57, 0x3e, 0xe1, 0xa1, 0x54, 0x93, 0x41, 0xab, 0x00, 0x79, 0x15, 0xdb, 0xa7, 0x19, 0xb3, 0xc4, 0xe8, 0xa9, 0x4b, 0x62, 0x16, 0x3e, 0x6d, 0x99, 0xde, 0xe2, 0xcb, 0xde, 0x2a, 0xe7, 0x41, 0x35, 0x46, 0x7b, 0x12, 0x5b, 0x41, 0x7c, 0x75, 0x44, 0x97, 0x8d, 0x50, 0xc8, 0x0c, 0x69, 0x43, 0x99, 0xdb, 0x77, 0xe8, 0x78, 0x10, 0x9f, 0x59, 0xa8, 0x33, 0x5d, 0xf3, 0xa3, 0x26, 0x13, 0x5a, 0x0d, 0x50, 0xa4, 0xbd, 0xe6, 0xfc, 0x3e, 0x5c, 0x03, 0xfb, 0x77, 0x47, 0xbf, 0x91, 0x9c, 0x68, 0xee, 0x8f, 0x45, 0xc3, 0x12, 0xbc, 0x2d, 0xfd, 0xd2, 0x79, 0x41, 0x1b, 0xa7, 0xa5, 0xf7, 0x8d, 0xd9, 0xbf, 0xe1, 0x6b, 0xaa, 0x4a ],
+const [ 0x1d, 0xe0, 0x02, 0x88, 0xa6, 0xe9, 0x39, 0x30, 0x07, 0x01, 0x83, 0xde, 0x9d, 0x9e, 0xd0, 0xce, 0x86, 0xf6, 0xcc, 0x0f, 0x64, 0xb7, 0xbe, 0xdb, 0x5d, 0xf8, 0xaf, 0x24, 0x67, 0x6f, 0xd0, 0x6f, 0xc2, 0xe5, 0x16, 0xe5, 0xc5, 0xe8, 0x27, 0xa7, 0xde, 0xc0, 0x79, 0x63, 0xd5, 0xa4, 0xb8, 0x25, 0x50, 0x2d, 0x69, 0x6f, 0x9c, 0x0a, 0xce, 0x8b, 0xaa, 0xf6, 0x09, 0x20, 0x58, 0xe7, 0x83, 0x04, 0xf2, 0x88, 0x8f, 0x51, 0xf9, 0xea, 0x4b, 0xbb, 0x23, 0x76, 0xc7, 0x20, 0xa2, 0x27, 0x6a, 0x61, 0xa9, 0xf6, 0x91, 0x71, 0x2d, 0x95, 0x78, 0xab, 0xe9, 0x5f, 0x5e, 0x69, 0xa4, 0x90, 0xe4, 0xd2, 0xb6, 0xb1, 0xb7, 0xf3, 0xc9, 0x57, 0x6e, 0x12, 0xdd, 0x0d, 0xb6, 0x3e, 0x8f, 0x8f, 0xac, 0x2b, 0x9a, 0x39, 0x8a, 0x3d, 0x9e, 0xbe, 0x86, 0xe3, 0x20, 0x1d, 0xf7, 0x26, 0xd2, 0xd1, 0xba, 0x82 ],
+const [ 0x29, 0x37, 0xaa, 0x2f, 0xf7, 0xc9, 0x42, 0xbf, 0x7d, 0xcf, 0xa6, 0x70, 0x15, 0x4e, 0x98, 0x8c, 0x28, 0x17, 0x73, 0x91, 0x96, 0x9d, 0xb4, 0x99, 0x58, 0x04, 0xba, 0x1a, 0x64, 0x7a, 0xca, 0xcf, 0xd0, 0xca, 0x56, 0xf6, 0x3b, 0x2e, 0x7f, 0xbc, 0x69, 0x65, 0xd8, 0xf6, 0x2d, 0x06, 0x6d, 0x11, 0x8c, 0x14, 0x04, 0x4c, 0x1f, 0xd2, 0xa2, 0x24, 0xb9, 0xd9, 0x51, 0x10, 0x4a, 0x67, 0x21, 0x6f, 0x03, 0xfa, 0x6d, 0xbf, 0xbb, 0x1e, 0x5f, 0x0f, 0x92, 0x83, 0xb6, 0xb7, 0xd4, 0x52, 0xc7, 0x46, 0x20, 0xc1, 0xc2, 0xbc, 0xc9, 0xe6, 0x37, 0xfa, 0x7c, 0xc8, 0xd9, 0x76, 0x23, 0xbc, 0x81, 0x33, 0x0a, 0xef, 0x76, 0xf1, 0x40, 0x3f, 0xeb, 0xa1, 0x41, 0x4f, 0xc9, 0x1b, 0xd1, 0xda, 0xaf, 0x13, 0x2b, 0x47, 0x37, 0x49, 0x5b, 0x7e, 0x7c, 0x01, 0xe9, 0xfb, 0xd9, 0xb3, 0xb7, 0x20, 0xf3, 0x03 ],
+const [ 0xdf, 0xa3, 0xb0, 0x6e, 0xb1, 0xe3, 0x0b, 0x47, 0xad, 0x9f, 0x0b, 0xf0, 0xf4, 0x41, 0xfc, 0xd9, 0x48, 0x56, 0xca, 0x8b, 0x1f, 0x4c, 0xb8, 0x8c, 0xf6, 0x79, 0x55, 0x82, 0xe8, 0x60, 0xad, 0x9c, 0x7f, 0x30, 0xbc, 0x2e, 0xca, 0x8e, 0x28, 0x9b, 0xb0, 0x94, 0x2f, 0x78, 0x83, 0x1a, 0xdd, 0xee, 0xd9, 0x34, 0x83, 0x60, 0x97, 0xfb, 0x66, 0x4e, 0x4e, 0x91, 0xb4, 0x7a, 0xcb, 0x5f, 0xbc, 0x49, 0xe9, 0xa1, 0x5d, 0x6b, 0xaa, 0x25, 0xbf, 0xbe, 0x86, 0x4f, 0x42, 0x70, 0x03, 0x61, 0xb4, 0x65, 0x86, 0xf9, 0xc7, 0xd8, 0x69, 0xdc, 0xc2, 0x44, 0x4d, 0xf1, 0x76, 0x85, 0xb2, 0x91, 0x74, 0x3a, 0xc5, 0xfe, 0x7d, 0x6f, 0x78, 0x30, 0x3a, 0x79, 0xd8, 0xd8, 0x2d, 0x20, 0x9c, 0x9f, 0xe8, 0x04, 0xf9, 0xae, 0x7d, 0x39, 0xbe, 0x74, 0x35, 0x35, 0x9c, 0xa3, 0x85, 0xec, 0xc5, 0x7c, 0x3d, 0x39 ],
+const [ 0x50, 0x9a, 0x0a, 0x45, 0xa1, 0x51, 0x2b, 0x50, 0x72, 0x47, 0x4b, 0x29, 0x7f, 0x9c, 0x1a, 0x8c, 0x24, 0x89, 0x00, 0x16, 0x14, 0x44, 0x68, 0x50, 0x4e, 0x24, 0x5f, 0xe9, 0x4d, 0x06, 0x5d, 0x43, 0x7f, 0xef, 0x62, 0x32, 0xf9, 0xf3, 0x45, 0x00, 0x69, 0x55, 0x49, 0xb4, 0x4c, 0xef, 0xf2, 0x93, 0x61, 0xd4, 0x17, 0xe8, 0x5d, 0x35, 0x37, 0x01, 0xe0, 0x81, 0x11, 0x7a, 0xa8, 0xd0, 0x6e, 0xbe, 0x05, 0x82, 0x42, 0xca, 0x8c, 0x23, 0xf3, 0x34, 0x10, 0x92, 0xf9, 0x6c, 0xce, 0x63, 0xa7, 0x43, 0xe8, 0x81, 0x48, 0xa9, 0x15, 0x18, 0x6e, 0xbb, 0x96, 0xb2, 0x87, 0xfd, 0x6c, 0xa0, 0xb1, 0xe3, 0xc8, 0x9b, 0xd0, 0x97, 0xc3, 0xab, 0xdd, 0xf6, 0x4f, 0x48, 0x81, 0xdb, 0x6d, 0xbf, 0xe2, 0xa1, 0xa1, 0xd8, 0xbd, 0xe3, 0xa3, 0xb6, 0xb5, 0x86, 0x58, 0xfe, 0xea, 0xfa, 0x00, 0x3c, 0xce, 0xbc ],
+const [ 0xc2, 0x8f, 0x6a, 0x09, 0xce, 0x07, 0x6e, 0xf2, 0x70, 0x45, 0x89, 0x67, 0xfe, 0x19, 0xd4, 0x6e, 0x6f, 0x6b, 0x2c, 0xbe, 0xb6, 0x36, 0x2b, 0xdc, 0x4f, 0xd5, 0x56, 0x84, 0x17, 0x7e, 0x98, 0x4a, 0x60, 0x0c, 0xf0, 0x81, 0x45, 0x01, 0x66, 0x5c, 0x3b, 0xcb, 0x43, 0x53, 0xe9, 0x46, 0x81, 0xc8, 0x3a, 0x83, 0x81, 0xeb, 0xb0, 0xc8, 0xfc, 0xdb, 0xfb, 0xd7, 0x3c, 0x0e, 0xca, 0x73, 0x8c, 0xf2, 0xe1, 0x21, 0xed, 0xd4, 0x6b, 0x2c, 0x0a, 0x02, 0x92, 0xeb, 0x6e, 0x2c, 0x4e, 0x46, 0xf5, 0x10, 0x7a, 0x77, 0x80, 0x57, 0x2d, 0x0e, 0xed, 0xb9, 0x47, 0x38, 0x47, 0x68, 0x4a, 0x40, 0x39, 0xac, 0x6c, 0x56, 0xc9, 0xca, 0xea, 0x90, 0x43, 0x2b, 0x9e, 0x2e, 0x72, 0xba, 0xd4, 0x22, 0x16, 0x8e, 0x5a, 0xd0, 0x93, 0xc9, 0xd6, 0x12, 0xe7, 0xc0, 0x5c, 0x7f, 0xde, 0x5c, 0x40, 0xed, 0x89, 0xc0 ],
+const [ 0x5a, 0x60, 0x0c, 0x46, 0x8e, 0xc2, 0x2e, 0x42, 0xaf, 0x5b, 0xa9, 0x3e, 0xb7, 0x94, 0x52, 0x86, 0x4e, 0xbe, 0x46, 0x9a, 0x86, 0xf8, 0x36, 0x32, 0xc8, 0x52, 0x01, 0x80, 0x0f, 0x32, 0x88, 0xb5, 0x53, 0xf7, 0xbe, 0xc6, 0x49, 0xdd, 0xfe, 0x70, 0x49, 0x20, 0xa2, 0x7a, 0x8f, 0x65, 0xd1, 0x3a, 0xa7, 0x55, 0x98, 0x5a, 0x23, 0x8b, 0x3c, 0xdc, 0x8f, 0xb0, 0xcf, 0x5c, 0xa7, 0xe4, 0x02, 0x95, 0xc7, 0x60, 0x3a, 0x27, 0xa2, 0x5a, 0xe6, 0x98, 0x37, 0x29, 0x0f, 0x98, 0x01, 0xaa, 0x30, 0x89, 0x6e, 0xe2, 0x49, 0x3e, 0x93, 0xe5, 0x2f, 0x03, 0x1e, 0xf6, 0x26, 0xde, 0x8c, 0xef, 0xb1, 0x15, 0x9c, 0xe4, 0xa9, 0xf0, 0x03, 0x03, 0x8d, 0xc0, 0x61, 0xbe, 0x19, 0x20, 0x74, 0x2d, 0x1a, 0x7b, 0x8b, 0xad, 0x80, 0xcf, 0x3e, 0xce, 0xb5, 0xb0, 0x5d, 0x6c, 0x2d, 0x8f, 0x26, 0x1b, 0x3f, 0x3c ],
+const [ 0x04, 0x36, 0x9f, 0x95, 0x92, 0xb0, 0x06, 0x26, 0xd1, 0x5b, 0x0a, 0x4b, 0x0e, 0xe2, 0xf9, 0x2b, 0xa0, 0xd0, 0x86, 0xc1, 0x6d, 0x01, 0x6c, 0xe7, 0xb0, 0x56, 0x54, 0xb4, 0xf9, 0xad, 0xf9, 0x08, 0x75, 0x11, 0x8a, 0x65, 0x6f, 0x2d, 0x50, 0x01, 0x17, 0x07, 0x90, 0x19, 0x82, 0xeb, 0xb3, 0x87, 0xf3, 0xa4, 0xa4, 0x97, 0x59, 0xf3, 0x7a, 0x17, 0x18, 0x39, 0x57, 0xad, 0x0c, 0x77, 0x8f, 0x6e, 0xcb, 0x78, 0x0d, 0xab, 0x2b, 0x4d, 0xf3, 0x0e, 0x05, 0xfa, 0x81, 0xe6, 0x38, 0x6f, 0x38, 0xc0, 0xf0, 0xba, 0x3f, 0x37, 0x28, 0x7a, 0x05, 0x0d, 0x6d, 0x97, 0x28, 0x7a, 0xe5, 0x30, 0x96, 0xc3, 0x91, 0xd5, 0xf2, 0x0f, 0xcf, 0xf7, 0x39, 0x77, 0x23, 0x9c, 0xa5, 0x5c, 0x36, 0x57, 0xd1, 0xfd, 0x1f, 0x78, 0x1f, 0x48, 0xe2, 0x80, 0x57, 0xf1, 0x36, 0xd8, 0x90, 0xc2, 0x8c, 0xc2, 0x54, 0x32 ],
+const [ 0x59, 0xa6, 0xb0, 0x31, 0x7f, 0x13, 0x0f, 0x62, 0x48, 0xe7, 0x46, 0xe3, 0x96, 0xcc, 0x68, 0x4b, 0x32, 0xb9, 0xa0, 0xea, 0xbf, 0x15, 0xc5, 0x0b, 0xec, 0x1f, 0x2f, 0x76, 0xee, 0x8d, 0xc9, 0x39, 0x2e, 0x73, 0x68, 0xa8, 0x3e, 0x67, 0x5b, 0xa3, 0x12, 0xe3, 0x44, 0x17, 0x6d, 0xeb, 0x26, 0xc7, 0x99, 0xef, 0xbe, 0x4d, 0x5b, 0xf2, 0x17, 0x5b, 0x26, 0xec, 0x59, 0x47, 0x8f, 0x6d, 0xe1, 0xc7, 0x01, 0x84, 0x97, 0xf9, 0xb2, 0xdf, 0x7c, 0xa6, 0xd5, 0x33, 0x83, 0xc7, 0x12, 0xdf, 0xa2, 0x48, 0x33, 0xcc, 0x28, 0x0d, 0x20, 0x97, 0x51, 0x33, 0x0d, 0xf2, 0x18, 0x98, 0xf2, 0x47, 0x4c, 0x9d, 0x3b, 0x9f, 0xe6, 0x2a, 0xc1, 0xc3, 0x9a, 0xf3, 0xfa, 0xa0, 0xac, 0xfa, 0x6c, 0xf0, 0x05, 0x55, 0x68, 0x17, 0x86, 0x32, 0xf4, 0x4b, 0x9c, 0x18, 0x09, 0xf8, 0x15, 0x70, 0xff, 0x63, 0x32, 0x43 ],
+const [ 0x95, 0x2e, 0x93, 0x85, 0x3e, 0x95, 0x79, 0xc2, 0xfe, 0x35, 0x3d, 0xc8, 0x32, 0x03, 0xd3, 0x4f, 0x04, 0x96, 0x3f, 0xd6, 0x48, 0x80, 0xa0, 0x95, 0xa4, 0xde, 0x6e, 0xb4, 0xf4, 0x2e, 0x00, 0xba, 0xec, 0x61, 0x51, 0x48, 0xff, 0x31, 0x03, 0x07, 0x80, 0xb5, 0xa4, 0xdf, 0x08, 0x33, 0x31, 0x6a, 0x17, 0x35, 0xd8, 0xa8, 0xfe, 0xdf, 0x02, 0xf4, 0xfc, 0x7f, 0x91, 0x36, 0xa7, 0x66, 0x66, 0x5b, 0x8d, 0xf7, 0x27, 0x02, 0x1c, 0xfd, 0x3f, 0x78, 0xbf, 0x42, 0x26, 0xe7, 0x4a, 0x5d, 0xe2, 0xca, 0x98, 0xcb, 0xce, 0xa4, 0x72, 0x41, 0x9a, 0xf2, 0xb3, 0x41, 0x93, 0x5e, 0xaa, 0xec, 0x24, 0x35, 0xc0, 0x17, 0x9d, 0x1b, 0x5b, 0xa0, 0x34, 0xfe, 0x02, 0x02, 0x4a, 0x48, 0xc1, 0x28, 0xef, 0x59, 0xcf, 0x7f, 0xa7, 0x34, 0x6e, 0x4f, 0x6e, 0x78, 0x13, 0x4b, 0xfb, 0x93, 0xc7, 0x67, 0x42, 0x32 ],
+const [ 0x7d, 0x3d, 0x92, 0x86, 0xc1, 0xfa, 0x05, 0x71, 0x75, 0xc3, 0x3c, 0x55, 0x6d, 0x2c, 0x4b, 0x87, 0xfe, 0x46, 0xd1, 0xb7, 0x64, 0x72, 0x7d, 0x6b, 0x61, 0x72, 0xd1, 0xac, 0x27, 0xc6, 0x26, 0xfe, 0x78, 0x35, 0xf1, 0x96, 0x0c, 0xaa, 0x44, 0xc8, 0x33, 0x41, 0x98, 0xbf, 0xbb, 0xa2, 0xc9, 0x70, 0x14, 0x8e, 0x62, 0xd0, 0xb2, 0xb7, 0x1b, 0x45, 0xb3, 0xd5, 0xa0, 0x5b, 0xc2, 0xf6, 0x94, 0xb9, 0x3b, 0x15, 0xd6, 0x53, 0x8f, 0xef, 0x03, 0xe1, 0xeb, 0x12, 0x3c, 0x8f, 0x14, 0x37, 0x29, 0xf6, 0x96, 0xd1, 0x3d, 0x4b, 0x1d, 0xe6, 0x3c, 0xd6, 0x23, 0x1e, 0xfb, 0xa6, 0xcb, 0x1a, 0x68, 0x84, 0x0d, 0x06, 0xc9, 0x25, 0x14, 0x72, 0x49, 0xa4, 0xe4, 0x5d, 0xb0, 0x2f, 0x40, 0x93, 0x72, 0x00, 0xcb, 0x3a, 0xeb, 0x8e, 0x6d, 0xa7, 0xe9, 0x05, 0xf8, 0x76, 0x6b, 0xf4, 0x0c, 0xd9, 0xa8, 0x46 ],
+const [ 0x18, 0x8a, 0x7f, 0xb0, 0x22, 0x2c, 0x9d, 0x8e, 0x19, 0xd0, 0x57, 0xab, 0x22, 0xd7, 0x1e, 0x03, 0x56, 0xc4, 0xf8, 0xd1, 0x18, 0x41, 0x79, 0xae, 0xa6, 0x63, 0xee, 0xfc, 0xef, 0x2e, 0xdb, 0x85, 0xa5, 0x5c, 0xa8, 0x60, 0x92, 0x5a, 0x97, 0x15, 0x2f, 0x94, 0xf9, 0x00, 0x73, 0xf2, 0xa2, 0xfb, 0xe9, 0xa2, 0x9a, 0x37, 0x05, 0x19, 0x15, 0x6b, 0xb8, 0x54, 0xa5, 0x31, 0x42, 0x64, 0xaf, 0xac, 0x48, 0x29, 0x1c, 0x6f, 0x26, 0x5e, 0x50, 0x9a, 0x86, 0xd5, 0x60, 0x46, 0x32, 0x04, 0x7f, 0x24, 0x26, 0xc1, 0xba, 0x60, 0xea, 0x4a, 0xe6, 0xcc, 0x1e, 0x88, 0xd6, 0x3a, 0x56, 0x95, 0xd1, 0x29, 0x29, 0x7b, 0x42, 0xa5, 0x85, 0x3f, 0xb2, 0x68, 0x45, 0x1e, 0xf4, 0x45, 0x06, 0x16, 0x9f, 0xc7, 0x36, 0xa8, 0xc2, 0x15, 0x6d, 0xdd, 0xd2, 0x18, 0x01, 0x87, 0xe7, 0xe0, 0xd5, 0xc9, 0x28, 0x44 ],
+const [ 0xe1, 0x05, 0xff, 0x11, 0x48, 0x11, 0x59, 0xc5, 0x2b, 0xae, 0xf5, 0xde, 0x55, 0x08, 0x98, 0x21, 0x4e, 0x1d, 0x9a, 0x90, 0xda, 0x2d, 0x90, 0x83, 0xc3, 0x6b, 0x29, 0xfa, 0xd8, 0xf9, 0x56, 0x32, 0x36, 0x13, 0xae, 0x76, 0xc6, 0x8b, 0x10, 0x38, 0x07, 0x75, 0x8a, 0x60, 0x0e, 0x23, 0x79, 0xe4, 0xcb, 0x54, 0xf2, 0x99, 0x8d, 0xa8, 0x61, 0x49, 0xc8, 0x57, 0x70, 0x05, 0x17, 0x23, 0x2b, 0xbc, 0x7d, 0x8b, 0x61, 0x0d, 0xf0, 0x42, 0x4d, 0x5a, 0x18, 0xdf, 0x75, 0x1e, 0x54, 0xd6, 0xd3, 0x80, 0xfe, 0xa7, 0x33, 0x28, 0xf0, 0x55, 0xdc, 0x51, 0x46, 0x1a, 0x72, 0x1f, 0x66, 0x59, 0x1b, 0x33, 0x3e, 0xd4, 0xe1, 0x7e, 0xcd, 0x1f, 0x58, 0x52, 0xe5, 0x55, 0x80, 0xbf, 0x2f, 0x09, 0xec, 0x1c, 0x6f, 0x7f, 0x24, 0xe4, 0x09, 0x1c, 0x49, 0xc4, 0xc5, 0x1c, 0xf7, 0xf1, 0xcf, 0x83, 0x6f, 0xbf ],
+const [ 0xba, 0x52, 0x73, 0x05, 0x60, 0x4e, 0xf5, 0x58, 0x18, 0x50, 0xb2, 0x22, 0xfd, 0x19, 0x2e, 0x62, 0x60, 0xc3, 0xf2, 0x0e, 0xb3, 0x0d, 0x8f, 0x04, 0xa5, 0xf4, 0xe1, 0x43, 0x8f, 0x83, 0x91, 0x5b, 0x0f, 0xeb, 0xdd, 0x22, 0xf2, 0xd6, 0x9c, 0xa9, 0x58, 0xf9, 0x7c, 0x6e, 0x12, 0xe8, 0x8f, 0xd3, 0x4f, 0x2f, 0x06, 0xcf, 0x78, 0x9e, 0x3c, 0xe4, 0x58, 0xe4, 0xf6, 0x51, 0x80, 0x60, 0xe9, 0x88, 0xea, 0x33, 0x7c, 0xe2, 0xdc, 0x9a, 0xd0, 0x92, 0x0f, 0x7b, 0xfd, 0xd8, 0x11, 0x3d, 0x9f, 0x77, 0xe8, 0xdd, 0x92, 0x68, 0xf8, 0x3e, 0xf9, 0xd0, 0x27, 0xc1, 0x85, 0x30, 0x3e, 0x16, 0xf4, 0xdb, 0x92, 0x52, 0xd7, 0xae, 0xe5, 0x41, 0x99, 0xfb, 0x87, 0xfd, 0xbd, 0xc6, 0xc0, 0xbf, 0x67, 0x34, 0x73, 0xf6, 0x1e, 0x40, 0xfb, 0x96, 0xd0, 0xb0, 0x59, 0xb3, 0x16, 0x47, 0x91, 0x4e, 0xba, 0x3d ],
+const [ 0x19, 0x8b, 0x79, 0xd0, 0x9a, 0x3d, 0xfd, 0xb5, 0xd4, 0x10, 0x43, 0xe6, 0x79, 0xba, 0xba, 0x65, 0x92, 0xf3, 0xc7, 0x51, 0xcd, 0x7c, 0xbb, 0x0d, 0x18, 0x60, 0x02, 0x9f, 0x6e, 0x7a, 0x9c, 0x56, 0xf1, 0x37, 0xd2, 0xb0, 0x3a, 0x9d, 0x21, 0x7a, 0xed, 0x8c, 0x7b, 0x39, 0x90, 0x44, 0xaf, 0xc9, 0x9d, 0x28, 0x25, 0x44, 0xd5, 0xc2, 0xce, 0x26, 0xd8, 0x06, 0x5b, 0xae, 0xf3, 0xdb, 0xad, 0x87, 0x39, 0xd7, 0x8d, 0xa7, 0xd5, 0x4a, 0x9e, 0x78, 0x9e, 0x7f, 0x8f, 0x35, 0xec, 0x3e, 0x95, 0x97, 0xaa, 0x95, 0x19, 0xb2, 0xad, 0xd9, 0xae, 0x19, 0x44, 0xe7, 0x45, 0x49, 0x11, 0xaf, 0xa4, 0x45, 0x17, 0xf4, 0x14, 0x7d, 0x13, 0x4d, 0x5a, 0xf4, 0x10, 0x70, 0xe9, 0xa2, 0x36, 0xaf, 0x56, 0x18, 0xe3, 0xc3, 0x0c, 0x62, 0xfd, 0xc9, 0x41, 0x31, 0x86, 0x8a, 0x29, 0x3a, 0x70, 0xff, 0x69, 0xd9 ],
+const [ 0xba, 0xc0, 0x88, 0x92, 0x81, 0xfe, 0x55, 0xda, 0xe1, 0x7c, 0x45, 0x07, 0x9b, 0xc4, 0x4f, 0x89, 0x76, 0x50, 0x8f, 0x5a, 0x92, 0x95, 0x3c, 0x26, 0xf9, 0x40, 0xda, 0xae, 0x77, 0xbf, 0xb1, 0x6e, 0xac, 0x03, 0x7d, 0x7d, 0x5f, 0x84, 0x67, 0xb6, 0x15, 0x86, 0x34, 0x15, 0xe2, 0x9b, 0xbd, 0x63, 0x80, 0x6a, 0x9f, 0x16, 0x9e, 0xae, 0x33, 0x73, 0x7a, 0x82, 0xc1, 0xf5, 0xb2, 0xdb, 0xf0, 0xf2, 0x58, 0x56, 0x81, 0x7c, 0x44, 0x34, 0x3d, 0x86, 0xae, 0xa2, 0x2c, 0x47, 0xfc, 0x3e, 0x08, 0xe4, 0xd8, 0xd8, 0xf1, 0x49, 0x86, 0x75, 0x62, 0x57, 0x74, 0x9a, 0x64, 0x45, 0x13, 0xc7, 0x02, 0x40, 0xe6, 0x41, 0xfc, 0x55, 0xd9, 0x14, 0xc0, 0x91, 0xd3, 0x59, 0x95, 0x67, 0x8e, 0xb5, 0x1a, 0x51, 0xa7, 0x22, 0xef, 0xba, 0xf1, 0xf2, 0xb2, 0x1c, 0x0f, 0x11, 0x2d, 0x66, 0x42, 0x8a, 0xcd, 0xa0 ],
+const [ 0xda, 0x32, 0x31, 0x4c, 0x22, 0xdd, 0xe5, 0x56, 0xd8, 0x86, 0xce, 0x2d, 0xde, 0x12, 0x91, 0xf1, 0xa4, 0xc1, 0xba, 0x14, 0xaa, 0xa9, 0x5b, 0x69, 0x40, 0x63, 0xf5, 0x7e, 0x91, 0x04, 0x9c, 0x2c, 0xdf, 0x4e, 0x57, 0x6c, 0x10, 0x28, 0xc6, 0x6c, 0x6a, 0x4c, 0x07, 0xe3, 0x9b, 0x40, 0xd9, 0xa1, 0xfc, 0x87, 0x02, 0x6a, 0x16, 0x18, 0xef, 0x04, 0x66, 0x0f, 0x9b, 0x8f, 0x5d, 0xa3, 0xb2, 0x15, 0xab, 0x58, 0xf5, 0x62, 0xbd, 0x75, 0xe0, 0x16, 0x84, 0xb9, 0x8a, 0xf8, 0x79, 0x4a, 0xce, 0x8d, 0xde, 0xee, 0xa8, 0xea, 0x46, 0x7d, 0xe1, 0xc6, 0x57, 0x97, 0xef, 0xd3, 0xcf, 0x92, 0x17, 0x4f, 0xc5, 0xb6, 0xd4, 0xd5, 0x32, 0xad, 0x7c, 0x7a, 0xaf, 0x35, 0x21, 0x15, 0x80, 0x18, 0xb5, 0xde, 0xd2, 0x5e, 0x72, 0x3b, 0x41, 0xc1, 0x79, 0xd6, 0x9d, 0x61, 0xba, 0xf3, 0xee, 0xb9, 0x13, 0x01 ],
+const [ 0x55, 0x7f, 0x84, 0x5d, 0xc8, 0x96, 0x2a, 0xe1, 0x15, 0x61, 0xf6, 0x3f, 0xf9, 0xf7, 0xa9, 0xfd, 0x73, 0xad, 0x5d, 0xa4, 0x79, 0xf1, 0xd1, 0xc3, 0xe9, 0x76, 0x02, 0x36, 0xc2, 0x92, 0xfb, 0xa8, 0x94, 0xe4, 0xed, 0x57, 0x35, 0x39, 0x82, 0x17, 0xb6, 0xb0, 0x6f, 0x9a, 0x95, 0x1d, 0x49, 0xee, 0x34, 0xac, 0x99, 0x47, 0x8a, 0xc7, 0x32, 0xff, 0x19, 0x39, 0xc2, 0xdb, 0x20, 0x93, 0xa8, 0x90, 0x11, 0xce, 0x05, 0x86, 0x45, 0x33, 0x16, 0xdb, 0xef, 0x78, 0xc1, 0xab, 0x4f, 0x2c, 0x6d, 0x8f, 0x28, 0x55, 0x17, 0x63, 0x73, 0x57, 0xa2, 0x4d, 0x55, 0x17, 0x6f, 0xfa, 0x4f, 0x61, 0x2e, 0x2b, 0xb5, 0x87, 0xf4, 0x71, 0x61, 0x4b, 0x8d, 0x34, 0xa8, 0xff, 0x13, 0xfa, 0x8d, 0xeb, 0xbf, 0xe6, 0x35, 0xef, 0x00, 0x7f, 0x9b, 0x6a, 0xca, 0xb4, 0x85, 0x5a, 0x31, 0x1c, 0xb7, 0xc4, 0x36, 0x82 ],
+const [ 0xda, 0xc4, 0x16, 0xdf, 0x79, 0x3e, 0xe5, 0xfb, 0xca, 0x99, 0x26, 0x82, 0x97, 0x4a, 0x0c, 0x2c, 0xca, 0x63, 0xeb, 0x49, 0x80, 0x5d, 0xf0, 0xa7, 0x5e, 0x14, 0x10, 0xb6, 0x28, 0x13, 0x3e, 0xea, 0x8f, 0x12, 0xe1, 0x61, 0x4b, 0xbd, 0x85, 0xc6, 0x6a, 0xb7, 0xd0, 0x75, 0xe8, 0xdf, 0xb8, 0xdf, 0x7f, 0xd2, 0xf4, 0x30, 0xc0, 0xb1, 0xb0, 0x30, 0x63, 0x24, 0x85, 0x67, 0xdc, 0x9e, 0xa8, 0x85, 0x2f, 0xe3, 0x62, 0x01, 0x04, 0xc8, 0xc0, 0xff, 0xfe, 0x3a, 0x8b, 0x77, 0x49, 0x82, 0x7a, 0x94, 0x72, 0xc7, 0xa7, 0x5a, 0x7c, 0xd5, 0x40, 0x8c, 0x30, 0x1d, 0x7f, 0xcd, 0xb4, 0xfc, 0xdc, 0x05, 0x5f, 0x40, 0x81, 0x06, 0xcc, 0xe8, 0xfe, 0x70, 0x2d, 0x2b, 0x3e, 0xd1, 0xe2, 0xbc, 0xb9, 0x11, 0x4b, 0x4d, 0xec, 0x0e, 0xda, 0x52, 0x06, 0x83, 0x6c, 0x07, 0xe5, 0x2e, 0xd9, 0xb4, 0x40, 0x32 ],
+const [ 0x5c, 0xf3, 0xa5, 0x20, 0x2d, 0xf8, 0x70, 0x6f, 0x6b, 0xff, 0x5b, 0xf2, 0x59, 0x0d, 0xe3, 0x7c, 0x90, 0x2c, 0x7f, 0xfd, 0x4e, 0x6c, 0x8e, 0xa6, 0x11, 0x28, 0x8e, 0x4e, 0x65, 0x8a, 0x8e, 0x15, 0xfa, 0x51, 0xe6, 0x47, 0xf9, 0xd2, 0x25, 0x83, 0x98, 0x3d, 0x4b, 0x1c, 0xed, 0x22, 0x39, 0xbf, 0xff, 0x34, 0x65, 0x56, 0x23, 0x4c, 0xd2, 0x2d, 0x86, 0xb1, 0x40, 0x53, 0x06, 0x96, 0xa0, 0x44, 0x46, 0xe4, 0xca, 0xc4, 0x01, 0x3a, 0x72, 0x0e, 0x9e, 0x32, 0x58, 0x2e, 0x05, 0xe7, 0xc0, 0xac, 0xb2, 0xb4, 0x22, 0x6a, 0x07, 0x3e, 0x22, 0xcf, 0xe7, 0xb4, 0xc2, 0x25, 0x80, 0x55, 0xd7, 0x40, 0x68, 0x33, 0xba, 0x61, 0xec, 0x37, 0x3f, 0x5a, 0xa5, 0x66, 0xeb, 0xf2, 0x4c, 0x62, 0x61, 0x8a, 0xce, 0x34, 0x1e, 0x01, 0xa3, 0x48, 0x66, 0xd6, 0x5c, 0xb9, 0x7e, 0x8c, 0x7c, 0xd0, 0x1c, 0x53 ],
+const [ 0xc1, 0x26, 0x3b, 0xe4, 0x23, 0xe7, 0x88, 0x8e, 0xac, 0xec, 0xcf, 0xef, 0x26, 0xf0, 0xb5, 0xaa, 0xef, 0xe0, 0x3f, 0x3c, 0xe7, 0x32, 0xdd, 0xe9, 0x8c, 0x78, 0xa7, 0xf6, 0x64, 0x35, 0xe6, 0x19, 0x9c, 0xef, 0xd6, 0x2e, 0xee, 0x85, 0xaa, 0x2b, 0xc8, 0xc3, 0xd1, 0x56, 0xaa, 0x34, 0x78, 0xb6, 0xcf, 0x37, 0x50, 0xc7, 0x11, 0x55, 0x91, 0x72, 0x07, 0xd2, 0x3f, 0x3b, 0x70, 0x82, 0xac, 0xbd, 0xd4, 0xde, 0x3e, 0x53, 0x68, 0x57, 0x72, 0x19, 0x33, 0xeb, 0x21, 0x13, 0x6f, 0xf5, 0x02, 0xab, 0x32, 0x49, 0x71, 0x61, 0x4d, 0x80, 0x6e, 0xbe, 0x74, 0x91, 0xe9, 0x89, 0xa0, 0xa2, 0x3d, 0x3e, 0xb2, 0x1d, 0xfa, 0xbc, 0x59, 0x05, 0xe7, 0x3e, 0x35, 0x8b, 0x47, 0x8c, 0x3d, 0xdc, 0x5c, 0x73, 0x5e, 0x3e, 0x2a, 0x72, 0x64, 0x5b, 0x7d, 0xb6, 0x1e, 0xdc, 0x2d, 0x49, 0xbd, 0x3a, 0xa1, 0x86 ],
+const [ 0xa5, 0xde, 0xb7, 0x12, 0xfc, 0x3b, 0xb9, 0xfb, 0xaf, 0x13, 0x98, 0x69, 0x8b, 0x56, 0x96, 0x60, 0x0f, 0xcd, 0x61, 0xac, 0x68, 0x48, 0x9f, 0x26, 0xa0, 0xf8, 0xca, 0x32, 0x12, 0x1a, 0x3e, 0x8c, 0x21, 0xd5, 0x90, 0x45, 0x29, 0x66, 0x22, 0x08, 0xb6, 0x7a, 0xf4, 0xa2, 0xf4, 0xdb, 0xbd, 0xc1, 0x67, 0x4f, 0x3b, 0xfc, 0xdc, 0xbe, 0xc7, 0x14, 0xa0, 0x92, 0x2c, 0x7a, 0xef, 0x63, 0xb9, 0x11, 0xaf, 0xd4, 0x95, 0x34, 0x5f, 0xb8, 0x53, 0xfb, 0x4a, 0x7a, 0xc6, 0xba, 0x00, 0xbb, 0x17, 0xcb, 0x06, 0x3c, 0x14, 0x8e, 0xcd, 0xff, 0xcb, 0xad, 0xe1, 0xa9, 0x58, 0xa5, 0x63, 0x2b, 0xfb, 0x82, 0xb9, 0xa1, 0x6e, 0xe9, 0x84, 0x7a, 0x75, 0x5c, 0xd2, 0xda, 0xb6, 0xba, 0x96, 0x3c, 0xcb, 0x05, 0x55, 0x5c, 0x96, 0x68, 0x21, 0x54, 0xd4, 0x79, 0xcb, 0x05, 0xf5, 0xbb, 0x55, 0xb8, 0x2c, 0x67 ],
+const [ 0x2d, 0xac, 0x15, 0x99, 0x84, 0x4d, 0x82, 0xa7, 0x9c, 0x7c, 0xd1, 0x66, 0x9a, 0x1c, 0x69, 0x76, 0x26, 0x7f, 0x65, 0x51, 0x67, 0x87, 0x2f, 0x8b, 0x2e, 0x0c, 0x50, 0x59, 0x71, 0x7e, 0x86, 0x51, 0xfc, 0xcc, 0x17, 0x70, 0x63, 0x84, 0x66, 0x61, 0x3b, 0x3b, 0xc4, 0xfc, 0x89, 0x2f, 0x88, 0x0e, 0x7b, 0x2b, 0x62, 0x58, 0x56, 0xab, 0xec, 0xda, 0xb0, 0x41, 0x82, 0x51, 0xdf, 0x37, 0x54, 0xfe, 0xb1, 0x76, 0xb9, 0xa9, 0x5e, 0xa6, 0xc7, 0xe6, 0xba, 0x97, 0x20, 0x97, 0xaf, 0xe0, 0x0e, 0xb2, 0xeb, 0xc6, 0xd3, 0x44, 0xd6, 0x5f, 0x3a, 0xb6, 0xc7, 0xf7, 0x72, 0x4f, 0x77, 0xb2, 0x1c, 0xfb, 0xb6, 0x73, 0xa3, 0x4b, 0x5c, 0xfd, 0xcc, 0xbc, 0x83, 0x58, 0x8e, 0x3c, 0xf3, 0x77, 0x23, 0xea, 0xde, 0x17, 0x5f, 0x1e, 0xce, 0xea, 0x41, 0xa9, 0xdb, 0xf5, 0xc8, 0x5e, 0x21, 0x36, 0x07, 0xd1 ],
+const [ 0x06, 0x7e, 0xf2, 0xee, 0x1e, 0x95, 0xca, 0x54, 0x68, 0x82, 0xe2, 0xa9, 0xd4, 0x41, 0xdc, 0x56, 0x32, 0x35, 0x19, 0x8e, 0xfe, 0xb5, 0x2b, 0xe9, 0x7d, 0xc7, 0x89, 0x4f, 0x09, 0x2b, 0x87, 0x18, 0xa8, 0x9c, 0x85, 0x71, 0xe4, 0x52, 0x66, 0x02, 0xd7, 0xcb, 0x44, 0xce, 0x86, 0xcb, 0x61, 0x5a, 0x70, 0xa2, 0x61, 0x11, 0x66, 0xad, 0xb7, 0xe7, 0x9c, 0x1f, 0x5e, 0x3d, 0x01, 0x01, 0xc9, 0x04, 0xcc, 0x78, 0x1c, 0x26, 0x57, 0x47, 0x9c, 0x21, 0x31, 0x94, 0x64, 0xf5, 0x6f, 0xef, 0x5b, 0x41, 0x42, 0x90, 0x62, 0xa9, 0xcf, 0xe0, 0xd2, 0x7a, 0x3a, 0x3c, 0x25, 0x91, 0x04, 0xf5, 0xf3, 0x79, 0x98, 0x9b, 0x21, 0xd3, 0x20, 0x7b, 0x55, 0xfb, 0x9d, 0x66, 0xac, 0xe8, 0x37, 0xb4, 0xb0, 0x54, 0xd1, 0x89, 0x84, 0x1d, 0xe1, 0x57, 0x62, 0xec, 0x7f, 0xa4, 0x48, 0x14, 0xbc, 0x0e, 0xed, 0xbd ],
+const [ 0xd6, 0xfc, 0x8b, 0x4b, 0x72, 0xb7, 0xee, 0xa8, 0x0b, 0x1c, 0x6f, 0x53, 0xc1, 0x1a, 0x52, 0x51, 0x0f, 0x92, 0x05, 0x27, 0xfe, 0xb8, 0xf9, 0x55, 0x98, 0xbd, 0xb1, 0x20, 0xa0, 0xab, 0x19, 0x94, 0x80, 0x90, 0x18, 0xca, 0x83, 0xde, 0x68, 0x67, 0x44, 0x12, 0xa6, 0x65, 0x67, 0x94, 0xa5, 0x16, 0x86, 0xde, 0x08, 0x65, 0x6e, 0xe1, 0x10, 0x60, 0x8c, 0xa4, 0xb2, 0xf3, 0xa2, 0x2f, 0xed, 0xf6, 0xbe, 0xa7, 0x5a, 0x6b, 0x6d, 0xba, 0x05, 0x00, 0x2c, 0x3e, 0x7b, 0xdc, 0x1f, 0x14, 0x24, 0x97, 0x06, 0x53, 0xd3, 0x8a, 0x6c, 0xa2, 0x9c, 0x4a, 0x21, 0xe6, 0xe6, 0x6f, 0xeb, 0x1e, 0xc0, 0x9a, 0x79, 0x8a, 0x79, 0xb6, 0x98, 0x13, 0x6a, 0x7d, 0xaa, 0xe7, 0x17, 0x3e, 0x53, 0x64, 0x77, 0xde, 0x75, 0x37, 0x8f, 0x1e, 0x5f, 0xc5, 0x46, 0x1b, 0x41, 0xca, 0x74, 0x1b, 0xe3, 0x3f, 0x3c, 0x86 ],
+const [ 0x5e, 0x87, 0x3d, 0xf5, 0xf2, 0x80, 0x72, 0x3d, 0xad, 0xd7, 0x18, 0x87, 0x56, 0x84, 0x59, 0x2a, 0x7b, 0x2c, 0x56, 0x91, 0x66, 0x46, 0xbd, 0x87, 0x4d, 0x7c, 0x99, 0xb1, 0xc9, 0x54, 0x6f, 0x5c, 0x89, 0x0f, 0x86, 0x7a, 0x48, 0xd2, 0x86, 0xe6, 0xfc, 0x03, 0x45, 0xf0, 0x51, 0xf6, 0xdd, 0x15, 0x55, 0xc9, 0x02, 0x0e, 0x75, 0x8c, 0x92, 0x0d, 0xa8, 0xa5, 0x6e, 0x43, 0xea, 0x73, 0x89, 0xa5, 0xec, 0x32, 0x3e, 0xf0, 0x0a, 0x1f, 0xe7, 0xea, 0x7d, 0xdc, 0xab, 0xeb, 0xd2, 0x15, 0x97, 0x9d, 0x9a, 0x64, 0xf0, 0x00, 0x64, 0x72, 0xc8, 0xb1, 0xe8, 0x60, 0xd0, 0x6b, 0x85, 0x65, 0x6d, 0xce, 0xee, 0xb8, 0x0e, 0x5f, 0x20, 0xb0, 0xbc, 0xd1, 0x97, 0x29, 0xf3, 0x83, 0xc1, 0x2b, 0xb0, 0x49, 0xb3, 0xc6, 0xcb, 0x6f, 0x1b, 0x40, 0x87, 0xfb, 0x75, 0x73, 0x68, 0x33, 0x82, 0x70, 0x44, 0x5f ],
+const [ 0xc2, 0x92, 0x5d, 0x3d, 0x09, 0xcf, 0xab, 0x81, 0xf3, 0x2f, 0x76, 0x9d, 0x61, 0xda, 0xd5, 0xa0, 0x3a, 0xec, 0x04, 0x23, 0xbe, 0x78, 0x5a, 0x74, 0x17, 0xcd, 0x7b, 0xf3, 0x31, 0xf7, 0xcf, 0xbb, 0xcc, 0x89, 0x33, 0x85, 0xd0, 0x9a, 0xee, 0xca, 0xe0, 0x0e, 0xe6, 0x28, 0x31, 0x17, 0x14, 0x07, 0x9d, 0xfa, 0x35, 0x7c, 0xf3, 0x17, 0xc2, 0x6e, 0x92, 0x24, 0x23, 0xf7, 0x36, 0xb9, 0x20, 0x0c, 0x11, 0x11, 0x98, 0x61, 0x1e, 0x0f, 0x75, 0x87, 0xb2, 0x7f, 0xdf, 0x57, 0x54, 0x9f, 0xb0, 0x94, 0xce, 0xdd, 0x28, 0xcc, 0x84, 0xe3, 0xe3, 0x7f, 0x05, 0xd1, 0x07, 0x84, 0xe0, 0xc9, 0xc2, 0xa7, 0xb9, 0xb1, 0xf4, 0x97, 0x9b, 0x34, 0x28, 0x00, 0x90, 0x0a, 0xc9, 0xf4, 0x6f, 0x7a, 0x93, 0x8f, 0xf6, 0x1d, 0x47, 0xdb, 0x18, 0xe4, 0xa3, 0xf1, 0x98, 0x5c, 0x91, 0x61, 0xd7, 0x31, 0x9f, 0xd4 ],
+const [ 0x5c, 0x32, 0x69, 0x8a, 0x0a, 0x56, 0xb9, 0xaa, 0xbd, 0x41, 0x27, 0x0e, 0xc1, 0xe4, 0x75, 0xc5, 0xf9, 0x65, 0xbd, 0xd0, 0x73, 0x66, 0xa7, 0x84, 0x3f, 0x8a, 0xdf, 0x2f, 0x82, 0x35, 0xc7, 0xfe, 0xc6, 0x94, 0x69, 0x1e, 0x94, 0xde, 0xaf, 0x22, 0x45, 0xd9, 0xd6, 0xa5, 0x15, 0x9f, 0x20, 0x30, 0x79, 0xa2, 0xc9, 0x5e, 0xb3, 0xee, 0x3d, 0x3d, 0xa3, 0xae, 0x88, 0xf8, 0xe0, 0xf2, 0x0e, 0xb3, 0x07, 0xaf, 0x7c, 0xb7, 0x53, 0x07, 0xfe, 0xcf, 0x6e, 0xcb, 0xb3, 0xf1, 0x87, 0x3f, 0x5e, 0x21, 0xa5, 0x1d, 0x5e, 0x93, 0x3b, 0xdc, 0xe0, 0x10, 0xfc, 0x31, 0x53, 0x9a, 0xf0, 0xd7, 0x1c, 0x53, 0xc8, 0x8c, 0x8b, 0x9b, 0x6f, 0x5c, 0x0e, 0x79, 0xe1, 0x21, 0xa5, 0x3c, 0x40, 0x4b, 0x96, 0x62, 0x25, 0xdd, 0x62, 0xb8, 0x34, 0xb8, 0xf7, 0xc3, 0xf3, 0x1c, 0x27, 0x5f, 0xdc, 0x6c, 0x59, 0xa6 ],
+const [ 0x70, 0x90, 0x1c, 0x61, 0xc4, 0x3a, 0x67, 0xe6, 0x47, 0xb5, 0x27, 0x4e, 0x55, 0xfd, 0x3a, 0x93, 0x4b, 0x0b, 0x87, 0x90, 0xeb, 0xa5, 0x84, 0x70, 0x02, 0x7a, 0xfc, 0x67, 0x47, 0x6e, 0x0f, 0xa0, 0x87, 0x33, 0x7a, 0x76, 0xff, 0x19, 0x18, 0xe6, 0x0a, 0x27, 0xa9, 0x44, 0xfc, 0x6a, 0xd3, 0x2e, 0x4d, 0x8d, 0x66, 0xbf, 0xfa, 0xaa, 0xe4, 0x04, 0x28, 0x60, 0x41, 0xb4, 0x0a, 0x26, 0xe7, 0x1b, 0x06, 0xde, 0xfd, 0x58, 0x13, 0xae, 0xe9, 0xc8, 0x66, 0x0b, 0x13, 0xc2, 0x4d, 0x16, 0xec, 0x85, 0x5b, 0x2c, 0x30, 0x6e, 0xc5, 0xb8, 0x68, 0x6f, 0x0c, 0x4c, 0xb2, 0xbc, 0xdc, 0xf1, 0xc4, 0xc7, 0x35, 0xbb, 0x2f, 0x6f, 0xc8, 0xa0, 0xe1, 0x74, 0xa4, 0x89, 0xee, 0x2f, 0x11, 0xaa, 0x90, 0x80, 0xbc, 0x0f, 0x6c, 0x07, 0x15, 0x78, 0x16, 0x97, 0xf6, 0x67, 0xd8, 0xe7, 0x85, 0x77, 0xaf, 0x8b ],
+const [ 0xa8, 0x5e, 0xe9, 0x73, 0xc9, 0x9d, 0x8d, 0xa6, 0x0d, 0x74, 0x58, 0x94, 0x99, 0x0b, 0x24, 0xb9, 0xca, 0xd7, 0xe4, 0x50, 0xbe, 0x0e, 0x43, 0x69, 0x17, 0x5e, 0x88, 0x3b, 0xfb, 0xde, 0xbd, 0xbb, 0x5f, 0x45, 0x10, 0x6e, 0x86, 0x5a, 0x79, 0x7b, 0xc4, 0xab, 0x9d, 0x04, 0x88, 0x82, 0xf3, 0xb6, 0x9a, 0x15, 0x25, 0x9f, 0xa0, 0xfd, 0xb9, 0x40, 0xe7, 0xe9, 0xf0, 0xe4, 0x60, 0x94, 0xee, 0x30, 0xe9, 0xf4, 0x1c, 0xfa, 0xce, 0xb5, 0xcb, 0x5f, 0x90, 0xe5, 0x1a, 0x0f, 0xe5, 0xf1, 0x19, 0xec, 0xff, 0xd0, 0x2e, 0xd4, 0x11, 0x7e, 0xb8, 0xba, 0x10, 0xac, 0xf3, 0xfc, 0xb7, 0xb6, 0x1c, 0xf0, 0xcd, 0xd5, 0xd5, 0xc0, 0xaa, 0x96, 0xca, 0x79, 0xf8, 0x8a, 0x95, 0x5e, 0xb7, 0x3f, 0xdf, 0x82, 0x83, 0x70, 0xc8, 0x96, 0x1a, 0x79, 0x89, 0xff, 0x19, 0x0d, 0x58, 0x2c, 0x06, 0x2b, 0x8d, 0x26 ],
+const [ 0x7b, 0xa8, 0xff, 0x92, 0x84, 0x60, 0xa4, 0x7c, 0x78, 0xaa, 0x93, 0x85, 0x19, 0xd3, 0x39, 0x78, 0xd7, 0x17, 0x2b, 0xa2, 0x97, 0x5c, 0x0d, 0x2b, 0xb4, 0x21, 0xb2, 0xa6, 0x43, 0xb1, 0x84, 0xe6, 0x9c, 0x9c, 0x27, 0x13, 0x16, 0x67, 0x59, 0xfe, 0x11, 0x83, 0x1d, 0xb2, 0x3a, 0x7c, 0x18, 0x4c, 0x0a, 0x73, 0x3b, 0x0c, 0x90, 0xce, 0xa2, 0xab, 0x71, 0x2e, 0xbc, 0xef, 0x2d, 0xa1, 0xad, 0x7e, 0xa3, 0x1a, 0xf0, 0xf0, 0xd8, 0x1e, 0x41, 0x27, 0xf4, 0xbf, 0xba, 0xe3, 0x8d, 0xce, 0x3c, 0x91, 0x28, 0x4d, 0x10, 0x64, 0xfd, 0x23, 0xce, 0xa7, 0xfb, 0x13, 0x7e, 0x52, 0x0c, 0xef, 0xfe, 0xdb, 0x9a, 0x09, 0xa4, 0x4e, 0x52, 0xeb, 0x23, 0xa0, 0x28, 0x48, 0xb3, 0x41, 0x9b, 0x32, 0x6c, 0xf0, 0x3a, 0x8c, 0xf3, 0xd3, 0x67, 0xc3, 0x59, 0xc7, 0x5b, 0xb9, 0x40, 0xf5, 0x6a, 0x02, 0x40, 0xa6 ],
+const [ 0x20, 0xdf, 0xbd, 0xc1, 0x07, 0xb5, 0xe0, 0xaf, 0x83, 0xb2, 0xd1, 0x60, 0x21, 0x03, 0x9d, 0x02, 0x69, 0xde, 0x2d, 0x27, 0xb4, 0x0b, 0xbe, 0x6c, 0x3e, 0xa4, 0x92, 0x59, 0x7c, 0x19, 0xe5, 0x89, 0xb0, 0x76, 0x23, 0x0b, 0xba, 0xe9, 0x58, 0x07, 0x31, 0x7f, 0xe8, 0xa5, 0xb2, 0x2e, 0x80, 0x2a, 0x78, 0x18, 0x4c, 0x65, 0x2d, 0x0e, 0x6b, 0x49, 0x00, 0x53, 0xa0, 0xdb, 0xf8, 0xa3, 0x4a, 0x4f, 0x88, 0x74, 0x96, 0x6d, 0x63, 0x7c, 0xf3, 0x3a, 0x91, 0x73, 0xc6, 0xd5, 0xc3, 0x1a, 0x5f, 0x9f, 0xe4, 0x7c, 0x2c, 0x9e, 0xf0, 0x74, 0x2d, 0x24, 0x09, 0x6f, 0xa8, 0xab, 0xc8, 0x73, 0x1e, 0x04, 0xd1, 0x61, 0x7d, 0xb1, 0xaa, 0x77, 0x97, 0x8f, 0xcd, 0x18, 0xd3, 0xb8, 0xfb, 0xd0, 0x23, 0xa7, 0xd4, 0x93, 0x36, 0x9d, 0xa5, 0x45, 0xee, 0x44, 0x81, 0x80, 0x14, 0x92, 0x93, 0x91, 0x4b, 0xf1 ],
+const [ 0x62, 0xd4, 0x32, 0xe9, 0x7b, 0x12, 0x14, 0xa9, 0x4a, 0xb9, 0x22, 0xb6, 0xbf, 0xc7, 0xf0, 0xa3, 0x2f, 0x0e, 0x99, 0x73, 0xa7, 0x37, 0xb0, 0xb6, 0x7f, 0x06, 0x7a, 0xf5, 0x32, 0xe0, 0x5a, 0x50, 0x6d, 0x8a, 0x8c, 0x66, 0x65, 0x33, 0x16, 0x75, 0x6e, 0xb5, 0xfc, 0xc2, 0xca, 0x18, 0xb4, 0x3c, 0xbe, 0x57, 0xd9, 0x5c, 0xeb, 0x67, 0x24, 0x4f, 0xdc, 0x76, 0x97, 0x57, 0xdc, 0x71, 0xfb, 0x6f, 0x0a, 0xc8, 0x8d, 0x2e, 0xaf, 0x75, 0xf5, 0xed, 0xce, 0x3b, 0x77, 0x2c, 0xfd, 0x2b, 0x6d, 0x32, 0x74, 0x6d, 0xf5, 0xf4, 0x64, 0x3d, 0xe7, 0x38, 0x8a, 0x34, 0x0a, 0xfa, 0x03, 0xc9, 0x87, 0x0f, 0x62, 0x17, 0x9d, 0x08, 0x00, 0xe1, 0x97, 0x59, 0x93, 0xd3, 0xfb, 0xbb, 0x02, 0x0a, 0x05, 0xce, 0x78, 0xd7, 0x53, 0x03, 0xb8, 0xc0, 0xe2, 0xb9, 0xb0, 0xc8, 0x39, 0xa6, 0x50, 0xf1, 0xe4, 0x79 ],
+const [ 0xb0, 0x8f, 0x5e, 0x59, 0x26, 0xb6, 0x8f, 0x1c, 0x18, 0x65, 0x2c, 0x7f, 0x7f, 0xc5, 0x93, 0xfb, 0x3c, 0x3f, 0x53, 0x70, 0xfe, 0xd6, 0x33, 0x19, 0x65, 0xbb, 0x77, 0xbe, 0x68, 0x1b, 0x5e, 0x2b, 0xf4, 0x3c, 0xef, 0xe2, 0xd5, 0xc8, 0xf5, 0x0d, 0xda, 0x69, 0x49, 0xb6, 0x34, 0x95, 0x4f, 0x3a, 0x20, 0xac, 0xc3, 0xfb, 0xc6, 0x40, 0xb6, 0x56, 0x60, 0xb3, 0xd3, 0xd5, 0x9e, 0x08, 0xe7, 0xa5, 0x49, 0xf3, 0xa1, 0x4a, 0x28, 0x32, 0x96, 0x91, 0x20, 0x20, 0x87, 0xc6, 0x9e, 0x88, 0xe7, 0x28, 0x3a, 0xb7, 0x98, 0x9a, 0x94, 0xd5, 0xf6, 0x9b, 0x82, 0x75, 0x16, 0x78, 0x6e, 0x6a, 0x4f, 0xc0, 0xf9, 0xdc, 0xfa, 0xf9, 0xe4, 0x9c, 0x77, 0x91, 0x31, 0xb5, 0x71, 0x18, 0x85, 0x44, 0x62, 0xac, 0xd1, 0x89, 0x59, 0xb4, 0x31, 0x3d, 0xfb, 0xd1, 0x15, 0x26, 0xc7, 0x11, 0x9e, 0xea, 0x9f, 0x66 ],
+const [ 0xed, 0x4f, 0x26, 0x9a, 0x88, 0x51, 0xeb, 0x31, 0x54, 0x77, 0x15, 0x16, 0xb2, 0x72, 0x28, 0x15, 0x52, 0x00, 0x77, 0x80, 0x49, 0xb2, 0xdc, 0x19, 0x63, 0xf3, 0xac, 0x32, 0xba, 0x46, 0xea, 0x13, 0x87, 0xcf, 0xbb, 0x9c, 0x39, 0x15, 0x1a, 0x2c, 0xc4, 0x06, 0xcd, 0xc1, 0x3c, 0x3c, 0x98, 0x60, 0xa2, 0x7e, 0xb0, 0xb7, 0xfe, 0x8a, 0x72, 0x01, 0xad, 0x11, 0x55, 0x2a, 0xfd, 0x04, 0x1e, 0x33, 0xf7, 0x0e, 0x53, 0xd9, 0x7c, 0x62, 0xf1, 0x71, 0x94, 0xb6, 0x61, 0x17, 0x02, 0x8f, 0xa9, 0x07, 0x1c, 0xc0, 0xe0, 0x4b, 0xd9, 0x2d, 0xe4, 0x97, 0x2c, 0xd5, 0x4f, 0x71, 0x90, 0x10, 0xa6, 0x94, 0xe4, 0x14, 0xd4, 0x97, 0x7a, 0xbe, 0xd7, 0xca, 0x6b, 0x90, 0xba, 0x61, 0x2d, 0xf6, 0xc3, 0xd4, 0x67, 0xcd, 0xed, 0x85, 0x03, 0x25, 0x98, 0xa4, 0x85, 0x46, 0x80, 0x4f, 0x9c, 0xf2, 0xec, 0xfe ],
+const [ 0x6d, 0xde, 0x9a, 0xe8, 0x67, 0xe2, 0xfe, 0xb3, 0x67, 0x00, 0x8a, 0x97, 0x5d, 0x78, 0x53, 0xed, 0x8f, 0x89, 0x69, 0x0f, 0x3c, 0x87, 0xa1, 0x10, 0x7f, 0x2e, 0x98, 0xaa, 0x77, 0x36, 0xf4, 0x77, 0xa5, 0x27, 0xed, 0x64, 0x95, 0x6f, 0x0d, 0x64, 0xc1, 0xb2, 0x33, 0x61, 0xb2, 0x61, 0xde, 0x78, 0x68, 0x8e, 0xa8, 0x65, 0xfc, 0xff, 0x11, 0x3c, 0x84, 0x81, 0x7e, 0x5b, 0x37, 0x7e, 0x82, 0x9c, 0xd2, 0xd2, 0x5b, 0xcf, 0x3a, 0xdb, 0xc0, 0x67, 0x62, 0xcf, 0xda, 0x73, 0x6f, 0x53, 0x90, 0xd0, 0x1a, 0x49, 0x07, 0x9d, 0x56, 0xe9, 0x69, 0xf0, 0x33, 0x13, 0xe6, 0xc7, 0x03, 0xe3, 0xf9, 0x42, 0xbb, 0x87, 0xed, 0x0f, 0x9c, 0x4d, 0x9f, 0x25, 0x12, 0x00, 0x85, 0xb5, 0xdc, 0x75, 0xef, 0x5d, 0x6d, 0x61, 0x8d, 0xa0, 0x92, 0x6d, 0x32, 0x93, 0x56, 0x8d, 0xd7, 0xd8, 0x23, 0x8d, 0xe3, 0xd0 ],
+const [ 0x10, 0x7b, 0xdf, 0xb5, 0x5c, 0x60, 0x1e, 0x74, 0xf6, 0x50, 0x50, 0x15, 0xa5, 0xcb, 0x87, 0xbc, 0x0e, 0xb0, 0xb2, 0xe7, 0xcb, 0x04, 0x59, 0x4f, 0xbe, 0xef, 0x8e, 0x0f, 0xa5, 0x07, 0x20, 0x07, 0xee, 0xd2, 0x11, 0x83, 0xcc, 0x85, 0x4a, 0x18, 0x8a, 0x12, 0x8e, 0xcf, 0x20, 0x62, 0xad, 0x86, 0x04, 0xdf, 0xfa, 0x92, 0x42, 0x36, 0xfe, 0xa9, 0xcf, 0x5b, 0x6e, 0x00, 0x1a, 0xcd, 0x5b, 0xb0, 0xe5, 0x1b, 0xa9, 0x5e, 0x53, 0xa7, 0xc2, 0x1b, 0x42, 0xaa, 0x8b, 0x89, 0xda, 0x78, 0x98, 0x3f, 0x66, 0x06, 0x9c, 0x6f, 0x63, 0xa9, 0x23, 0xc6, 0xd7, 0x20, 0x83, 0x94, 0xe5, 0xd5, 0x0f, 0x2d, 0x9d, 0x60, 0x8f, 0x8f, 0x19, 0x4d, 0xed, 0x45, 0xc5, 0x1f, 0x31, 0x8b, 0xfe, 0x94, 0xaf, 0xb2, 0xdf, 0x2b, 0x7f, 0xc6, 0x57, 0xe4, 0x2e, 0x6f, 0x7f, 0x47, 0xb3, 0x15, 0x2b, 0xa7, 0xa5, 0x47 ],
+const [ 0xf6, 0x27, 0x96, 0xfa, 0xaa, 0x33, 0x3d, 0xdd, 0xae, 0x59, 0x6f, 0x98, 0xcd, 0x4d, 0xe3, 0x93, 0x1e, 0xd9, 0x07, 0x10, 0x28, 0x74, 0x46, 0x60, 0x4a, 0x15, 0x8b, 0x57, 0x5b, 0x49, 0x01, 0xfd, 0x8d, 0x84, 0x1e, 0x86, 0x97, 0xb4, 0xdf, 0x85, 0x13, 0x1c, 0x55, 0x5c, 0x24, 0x60, 0x60, 0xf7, 0x5d, 0xdc, 0xbb, 0xba, 0xde, 0x3a, 0x38, 0xb7, 0xc0, 0x44, 0x4d, 0x25, 0xb4, 0xf6, 0xd0, 0x0d, 0xe6, 0xd8, 0xff, 0x47, 0x28, 0x8b, 0xc3, 0xa5, 0x4c, 0xa1, 0x36, 0x6e, 0xd1, 0xb2, 0x62, 0x0e, 0xc3, 0xab, 0x4c, 0x0b, 0xdc, 0x6a, 0x31, 0x3b, 0xef, 0x88, 0x0f, 0x35, 0x87, 0x76, 0x67, 0x05, 0xcb, 0xcc, 0x41, 0x24, 0xa4, 0xdd, 0x72, 0xa7, 0x22, 0x8f, 0x1a, 0xb6, 0x1c, 0x6a, 0x70, 0x40, 0x17, 0xee, 0xc2, 0xed, 0x69, 0x2a, 0xb7, 0x54, 0x9f, 0x8a, 0xd8, 0x6f, 0x1b, 0xf1, 0x4e, 0x4b ],
+const [ 0x44, 0xe9, 0xa1, 0xf1, 0x43, 0x77, 0x91, 0x96, 0x3c, 0x1a, 0x3e, 0x0a, 0xaa, 0xae, 0x24, 0xaf, 0xfc, 0x3b, 0x40, 0x58, 0x44, 0xd1, 0x6a, 0x52, 0x33, 0xb6, 0xe5, 0xa1, 0x45, 0xc4, 0x35, 0x8b, 0x39, 0x0c, 0x30, 0x5b, 0xc4, 0xbf, 0x58, 0x5f, 0x86, 0x4f, 0x68, 0x33, 0x3d, 0xd1, 0x2d, 0x41, 0x39, 0xa6, 0x97, 0x89, 0x10, 0x5a, 0x10, 0x9e, 0x92, 0xcc, 0x0c, 0xf1, 0xff, 0x8f, 0xe2, 0x52, 0x78, 0x91, 0xda, 0xb4, 0xb4, 0xfa, 0x87, 0x31, 0xf4, 0x57, 0x57, 0x4e, 0x39, 0xf8, 0x68, 0x7f, 0xb4, 0x96, 0x9d, 0xee, 0x7e, 0x3a, 0xf2, 0x78, 0x89, 0x59, 0x0c, 0xf8, 0xd7, 0x44, 0x15, 0xc9, 0xe9, 0xc0, 0xc6, 0x86, 0x7b, 0xf0, 0xc5, 0x14, 0x6e, 0x7c, 0x32, 0xe3, 0x06, 0xec, 0x7c, 0x70, 0x55, 0x55, 0x7a, 0x0f, 0xf7, 0x38, 0xb7, 0xe7, 0x00, 0xa7, 0x0d, 0x3e, 0x33, 0xa9, 0x75, 0xf7 ],
+const [ 0x0e, 0xba, 0xef, 0xd2, 0x15, 0x3d, 0xe2, 0xc7, 0x05, 0x37, 0xce, 0xb2, 0x7e, 0x5e, 0xe7, 0x01, 0x05, 0xae, 0x85, 0xbd, 0x4d, 0xa3, 0x84, 0x62, 0xb4, 0xab, 0xeb, 0xed, 0x11, 0xdb, 0xcd, 0x36, 0xad, 0xe1, 0x6d, 0x80, 0x8f, 0x3a, 0xa5, 0x4f, 0xfd, 0xa5, 0x89, 0x7a, 0x3f, 0xd7, 0x47, 0x80, 0xa6, 0x70, 0x52, 0x1f, 0xcd, 0x2e, 0xbf, 0x23, 0x1f, 0x60, 0xef, 0x7d, 0x99, 0x9e, 0x6e, 0x94, 0xd1, 0xb8, 0x1b, 0xe0, 0x38, 0xec, 0x89, 0xb4, 0x9c, 0x5c, 0xa6, 0x5b, 0xf1, 0xbf, 0x9a, 0x67, 0x50, 0x56, 0xf2, 0x46, 0x40, 0x21, 0xfe, 0x16, 0x35, 0x54, 0x77, 0xba, 0x56, 0x05, 0x65, 0x2e, 0x83, 0x27, 0x40, 0x17, 0x97, 0xbb, 0x56, 0x9f, 0xea, 0x45, 0x6c, 0x7f, 0x1b, 0x7d, 0xa8, 0x5d, 0x0c, 0x48, 0xaf, 0x59, 0x2d, 0xe6, 0x0a, 0xe3, 0xfe, 0x6d, 0xce, 0xcf, 0xcf, 0x76, 0x7c, 0xab ],
+const [ 0xd9, 0x85, 0x57, 0x50, 0x4a, 0x21, 0xfc, 0x3a, 0x43, 0x4c, 0x78, 0x0c, 0x32, 0x8e, 0xc2, 0x39, 0xcf, 0x8d, 0x7c, 0x26, 0xf5, 0x8d, 0x6a, 0xd7, 0xb2, 0x33, 0x29, 0xc7, 0x9a, 0x8e, 0x1e, 0x17, 0x60, 0x58, 0xac, 0xeb, 0xa7, 0x78, 0xaa, 0x12, 0x15, 0xcc, 0x14, 0xe5, 0xa9, 0x26, 0x00, 0x71, 0x4f, 0x94, 0xd4, 0xd8, 0xb2, 0xe5, 0xb7, 0xf4, 0x52, 0x68, 0x45, 0x3e, 0xd6, 0xf7, 0x87, 0xee, 0xa3, 0x34, 0x22, 0x64, 0xad, 0x13, 0xce, 0xc7, 0x8d, 0x99, 0x0a, 0xec, 0xd5, 0xe3, 0x0f, 0x79, 0xa0, 0x69, 0x02, 0x4a, 0x6d, 0x84, 0x6d, 0x13, 0x2d, 0x2e, 0xf0, 0x47, 0x9a, 0x09, 0x34, 0x39, 0xcb, 0xa4, 0x21, 0x82, 0x05, 0xf9, 0x51, 0xa2, 0xd5, 0x3a, 0xc4, 0xea, 0x5b, 0xcd, 0xd5, 0x99, 0xe9, 0x95, 0x6c, 0x45, 0xcd, 0x73, 0x76, 0x7c, 0x6a, 0x0c, 0x92, 0xac, 0x8e, 0xcd, 0x0d, 0x40 ],
+const [ 0x6e, 0x09, 0xfe, 0xbe, 0xd3, 0x08, 0xba, 0xa4, 0x1a, 0x8b, 0x6e, 0x0f, 0x7f, 0xab, 0x61, 0x80, 0x8c, 0x9c, 0x84, 0x71, 0xea, 0x32, 0xee, 0xf1, 0x78, 0xa4, 0x88, 0x8e, 0x9a, 0x91, 0x0a, 0x77, 0xd4, 0x40, 0x26, 0xe2, 0x97, 0x2c, 0x02, 0xac, 0x5a, 0xc0, 0xec, 0x3f, 0xed, 0x5f, 0x4a, 0xb9, 0x0a, 0xa7, 0xcf, 0x4b, 0x2e, 0xf7, 0xf5, 0xde, 0xa6, 0x2e, 0xa7, 0xfd, 0xed, 0xb6, 0x3d, 0xef, 0x35, 0xc2, 0xae, 0x23, 0x44, 0xd3, 0x01, 0xd2, 0x81, 0x81, 0x05, 0xdf, 0x4f, 0x78, 0x42, 0x02, 0x99, 0xc1, 0x2f, 0x25, 0xae, 0x43, 0xa6, 0x0e, 0x50, 0x89, 0x94, 0x3f, 0x07, 0xc5, 0xf5, 0x1a, 0xbc, 0x15, 0x00, 0x49, 0x82, 0x06, 0x9e, 0x5d, 0xb7, 0x57, 0x21, 0xb5, 0x4c, 0xff, 0x33, 0xa2, 0x61, 0x70, 0x0c, 0xc8, 0x15, 0x1e, 0xe9, 0xc8, 0x9c, 0x3b, 0xb9, 0x1c, 0x92, 0xc5, 0x19, 0x42 ],
+const [ 0x7a, 0xf3, 0x90, 0xcc, 0x4e, 0xdd, 0xe0, 0xf3, 0xd4, 0x96, 0x13, 0x7d, 0x0c, 0xac, 0xd0, 0x87, 0x6b, 0x54, 0xc9, 0x09, 0xdc, 0x5c, 0xe3, 0x67, 0x05, 0x61, 0x97, 0x42, 0xcb, 0x42, 0x98, 0x94, 0x18, 0xd4, 0xb6, 0xfc, 0xdb, 0xd8, 0x02, 0x56, 0x51, 0x2a, 0x33, 0x8f, 0x84, 0x3b, 0x48, 0xb7, 0x11, 0xc0, 0x6f, 0x58, 0x2d, 0xac, 0x26, 0x07, 0xea, 0x5c, 0xa0, 0x38, 0xb7, 0x12, 0x6a, 0x57, 0x26, 0xa5, 0x4e, 0x14, 0xf3, 0x77, 0x78, 0xfe, 0x41, 0xa6, 0xd7, 0x53, 0x26, 0x87, 0xc6, 0x16, 0x6a, 0x50, 0xec, 0x63, 0x8c, 0x14, 0x60, 0x00, 0x06, 0xf5, 0x11, 0x34, 0xd2, 0x95, 0x66, 0xdc, 0x2d, 0xcd, 0x21, 0xbb, 0x9b, 0xa2, 0x89, 0x12, 0x2b, 0x74, 0xc8, 0x70, 0xfc, 0x79, 0x92, 0xcc, 0x00, 0x6a, 0x07, 0xd1, 0x00, 0x7c, 0xdb, 0x79, 0xe1, 0x92, 0xb4, 0xdd, 0x25, 0xb1, 0xd3, 0x4c ],
+const [ 0x75, 0xed, 0x3a, 0xe9, 0x08, 0x5b, 0xbf, 0x2d, 0x03, 0x4b, 0x86, 0x4d, 0x7f, 0x87, 0x05, 0x7c, 0x2d, 0x0b, 0x12, 0xc7, 0x39, 0x5f, 0xeb, 0x03, 0x75, 0x23, 0x79, 0x03, 0xb3, 0xeb, 0xd6, 0x0e, 0x72, 0x4e, 0x0c, 0x8f, 0xbe, 0x3a, 0x20, 0x0f, 0x51, 0x8a, 0x4f, 0x61, 0xfe, 0xdb, 0x97, 0x1c, 0x50, 0x9b, 0x79, 0x4f, 0x6e, 0x62, 0xfe, 0x6f, 0x41, 0x86, 0xf8, 0x94, 0xd9, 0xea, 0x8a, 0xe5, 0x0d, 0x16, 0xea, 0x51, 0x62, 0x8d, 0x66, 0x81, 0x2f, 0x5a, 0xa5, 0x0a, 0xfe, 0xed, 0x30, 0xe6, 0x34, 0x25, 0x30, 0x25, 0xf5, 0xae, 0x7a, 0xe0, 0x42, 0x8d, 0xc8, 0x6f, 0x64, 0xf9, 0x49, 0xdb, 0x8e, 0x6d, 0x5d, 0x96, 0xbe, 0xfb, 0x99, 0x6a, 0xe4, 0xe3, 0x12, 0xb0, 0x46, 0x64, 0xd8, 0xc2, 0x23, 0xd2, 0xc0, 0xb3, 0x96, 0xe9, 0x67, 0x3d, 0xbe, 0x61, 0x73, 0xfa, 0x1c, 0xc2, 0x1c, 0xd7 ],
+const [ 0x78, 0x09, 0xe5, 0x9a, 0xd4, 0x8a, 0xeb, 0x2c, 0x6f, 0x03, 0xde, 0x77, 0x5b, 0x13, 0x71, 0xb7, 0xf8, 0x69, 0x26, 0xae, 0x0b, 0x87, 0x09, 0x8e, 0x10, 0xc6, 0x9e, 0x19, 0xd2, 0x9b, 0x18, 0x07, 0x38, 0x18, 0xcb, 0xa8, 0x62, 0xb6, 0xe4, 0xca, 0xf4, 0x51, 0x58, 0xdd, 0xb2, 0x74, 0x1a, 0x55, 0x4e, 0xd7, 0x91, 0x50, 0x7d, 0x26, 0x49, 0x79, 0x50, 0x04, 0xe9, 0x2c, 0xc2, 0x50, 0x65, 0xdb, 0x8e, 0xa7, 0x74, 0xb0, 0x43, 0x2a, 0x45, 0x73, 0x99, 0x81, 0x6d, 0xaf, 0x06, 0x20, 0x25, 0x10, 0x8d, 0xc8, 0xb2, 0x10, 0xd7, 0x51, 0x24, 0xd2, 0x84, 0xa8, 0x43, 0x4e, 0xc3, 0x14, 0xc7, 0xaf, 0x20, 0xbd, 0xc7, 0xf9, 0x9e, 0x6e, 0x74, 0xef, 0x06, 0x9a, 0x07, 0x34, 0x7e, 0x9d, 0xf8, 0xb0, 0x5d, 0x45, 0x71, 0x35, 0x3e, 0x91, 0x02, 0x63, 0x54, 0xb8, 0x96, 0xc9, 0xfd, 0x6d, 0xa6, 0x4c ],
+const [ 0x47, 0x45, 0x10, 0x0c, 0xec, 0x04, 0x06, 0xcf, 0xfa, 0x14, 0x63, 0x50, 0xee, 0x12, 0x21, 0x33, 0x30, 0xd1, 0x92, 0x12, 0x3a, 0xf4, 0xa1, 0xba, 0xfd, 0xbc, 0x5c, 0x98, 0x80, 0x1e, 0xaf, 0x6e, 0xcb, 0x19, 0x72, 0x4a, 0x03, 0x46, 0xa7, 0xb9, 0xd6, 0xb1, 0xfc, 0x38, 0x1a, 0xe7, 0x98, 0xeb, 0xb0, 0x50, 0x13, 0x92, 0xaf, 0xbf, 0xc6, 0xb8, 0xbe, 0x48, 0x46, 0x2d, 0xc2, 0x52, 0x2b, 0xb7, 0xba, 0xec, 0x16, 0x05, 0xe6, 0x65, 0xf2, 0xe4, 0x2f, 0x16, 0x79, 0xb6, 0xc3, 0x83, 0xfa, 0x1f, 0x00, 0xa3, 0x5a, 0x01, 0x93, 0x7b, 0x5a, 0xab, 0xe1, 0xf2, 0x17, 0x4d, 0xa6, 0xe0, 0xd7, 0xaf, 0xdb, 0x68, 0x02, 0x23, 0xde, 0x88, 0x6f, 0xb9, 0xcd, 0xee, 0xe1, 0xb1, 0x32, 0x0d, 0xd2, 0x36, 0xe6, 0x71, 0x6f, 0x49, 0x2f, 0x4f, 0xe3, 0xfb, 0x2c, 0x61, 0xd8, 0xdf, 0x73, 0xf0, 0x3b, 0xbf ],
+const [ 0x91, 0xea, 0x78, 0x33, 0x41, 0x08, 0xce, 0x62, 0x61, 0xdd, 0xee, 0x5d, 0x98, 0x04, 0x5b, 0xb3, 0x07, 0xa6, 0xe8, 0xf3, 0xd0, 0xee, 0x65, 0xc1, 0xd9, 0xbc, 0x7d, 0x28, 0xcd, 0x9e, 0xdf, 0x32, 0x64, 0xfc, 0x9c, 0xb6, 0xe5, 0x92, 0xd0, 0x72, 0xe9, 0x23, 0x85, 0x59, 0x61, 0x6c, 0xd4, 0x2e, 0xda, 0x58, 0x4d, 0x52, 0x00, 0x72, 0x9a, 0xdb, 0x61, 0x9f, 0x5e, 0xe5, 0x74, 0x0d, 0x63, 0x2d, 0xda, 0x67, 0xf5, 0xdc, 0xe3, 0x4b, 0x89, 0xa0, 0x54, 0xfd, 0xa3, 0x01, 0x68, 0x5d, 0xf6, 0xf3, 0x14, 0x16, 0xcc, 0xa7, 0x8f, 0x19, 0xa8, 0xa7, 0x12, 0x4a, 0x2a, 0x22, 0xdd, 0x78, 0x34, 0x84, 0x7a, 0x93, 0x4b, 0x4a, 0x45, 0x19, 0x40, 0x15, 0x2c, 0xd2, 0x0f, 0xfd, 0xb4, 0xbd, 0x07, 0x27, 0x3c, 0x4a, 0x2b, 0x9a, 0x86, 0xc9, 0xd9, 0x4e, 0x73, 0x23, 0xa9, 0x86, 0x0e, 0xc8, 0x98, 0x60 ],
+const [ 0xec, 0x63, 0x87, 0x34, 0xd3, 0x36, 0xb8, 0xda, 0x6d, 0xfa, 0xf3, 0xda, 0x9e, 0x18, 0xc7, 0x13, 0x14, 0x94, 0xfc, 0xc0, 0x70, 0x9c, 0xd3, 0xa9, 0xa6, 0x61, 0x8e, 0x9b, 0xa6, 0x25, 0x33, 0x15, 0x3c, 0x95, 0x8e, 0x44, 0x34, 0x5a, 0x75, 0x31, 0xc3, 0xeb, 0x50, 0x3a, 0x22, 0xa5, 0xd8, 0xbf, 0x7c, 0x1d, 0x1e, 0x1d, 0x0a, 0xb5, 0xcf, 0xe0, 0x7d, 0x6d, 0xb7, 0x34, 0x9c, 0xfc, 0x85, 0x9d, 0x2e, 0x20, 0xce, 0xe8, 0x1a, 0x32, 0x54, 0x62, 0xcd, 0xfd, 0x87, 0x47, 0xdc, 0xd0, 0x4c, 0x7d, 0xea, 0xd2, 0xfe, 0x82, 0xcd, 0x96, 0xb2, 0xa4, 0xec, 0xef, 0xc0, 0x70, 0xeb, 0x06, 0x7f, 0x6c, 0x8b, 0xa9, 0x4f, 0x09, 0xcb, 0xe6, 0xdd, 0xd3, 0x54, 0xd9, 0xa2, 0xeb, 0x13, 0xc2, 0xad, 0xb7, 0x28, 0x5a, 0xa3, 0xd8, 0xff, 0x68, 0x04, 0x5c, 0xbc, 0x8f, 0xaf, 0x35, 0xdd, 0x6a, 0xa9, 0xea ],
+const [ 0xac, 0x47, 0x56, 0xb8, 0x51, 0xfc, 0x88, 0x66, 0xb9, 0xad, 0xfa, 0xc2, 0xd0, 0x25, 0x99, 0x14, 0x8e, 0x0d, 0xb7, 0x75, 0x7a, 0x62, 0xb1, 0xe0, 0x6d, 0x26, 0xcf, 0x8c, 0x99, 0x55, 0x6b, 0x79, 0xc9, 0x1a, 0x56, 0x49, 0xea, 0x43, 0x77, 0x52, 0xcb, 0xf3, 0xb5, 0xf1, 0x21, 0x96, 0x18, 0x21, 0xce, 0x1a, 0x2a, 0x4c, 0x63, 0x5d, 0xa4, 0x61, 0xe3, 0xe1, 0x46, 0x26, 0xca, 0xc7, 0x07, 0xd0, 0x4d, 0xfb, 0x6e, 0xd1, 0xe4, 0xac, 0x40, 0xf1, 0x06, 0xff, 0x5b, 0xa0, 0x33, 0x04, 0xe2, 0x8a, 0x38, 0xe9, 0x9a, 0x6d, 0xaf, 0x6d, 0x94, 0x27, 0xc5, 0x98, 0x0d, 0x14, 0x40, 0xa9, 0x92, 0x96, 0xc0, 0x51, 0x68, 0xf5, 0x44, 0x1e, 0x2a, 0x6a, 0xf1, 0x3a, 0xb4, 0x76, 0x0f, 0x55, 0x40, 0x78, 0x55, 0xe0, 0xcf, 0x7f, 0x66, 0x7c, 0xcb, 0x5d, 0x9b, 0xb2, 0xea, 0xfd, 0x03, 0xe4, 0x55, 0xf6 ],
+const [ 0x2a, 0xa1, 0xd9, 0x4e, 0xc8, 0x3c, 0xe7, 0xc3, 0xc7, 0x5c, 0x6b, 0xc8, 0x47, 0x75, 0x9b, 0x08, 0x52, 0x34, 0xfd, 0x44, 0xb4, 0x07, 0xd8, 0xf8, 0x0d, 0xdf, 0xe9, 0x3c, 0x24, 0x35, 0x56, 0xe8, 0x7e, 0x4b, 0xe8, 0xfb, 0x30, 0xb4, 0x74, 0x3e, 0xf1, 0x16, 0x9a, 0x24, 0x73, 0x2f, 0xb2, 0xf5, 0xf4, 0x16, 0x04, 0x2b, 0x10, 0xc3, 0x37, 0x1d, 0xd9, 0xd2, 0x0d, 0xda, 0x29, 0x84, 0x4d, 0x58, 0x37, 0x07, 0x00, 0xce, 0x69, 0xf7, 0xdf, 0x5e, 0x69, 0x24, 0x0d, 0xf7, 0x7b, 0x96, 0x02, 0x7a, 0x0e, 0xce, 0xc7, 0x1b, 0x90, 0x4f, 0x69, 0x0b, 0x87, 0x5d, 0xa8, 0x54, 0xde, 0x05, 0xef, 0x04, 0x7c, 0x5d, 0x89, 0x8d, 0x1c, 0x0d, 0x11, 0x6c, 0x58, 0x0e, 0x2a, 0x09, 0x06, 0xb2, 0x71, 0xde, 0xc8, 0xe5, 0xb0, 0xdc, 0xdf, 0xb2, 0x55, 0x0a, 0x40, 0x09, 0x22, 0x70, 0xea, 0xbf, 0x25, 0x33 ],
+const [ 0xd1, 0xa7, 0x08, 0x6d, 0x13, 0x4c, 0x11, 0xa8, 0xa3, 0x20, 0x4e, 0x01, 0x9f, 0x52, 0x84, 0x3e, 0x89, 0xf2, 0xd0, 0x1a, 0x02, 0xa8, 0x8a, 0x94, 0xd4, 0xa6, 0x6e, 0x8d, 0x36, 0xdb, 0xfe, 0x92, 0x4c, 0x69, 0x22, 0xf7, 0xee, 0x5a, 0x12, 0x25, 0xaa, 0x8e, 0x75, 0x34, 0x0c, 0xf8, 0xcb, 0xbd, 0x1c, 0x0b, 0x08, 0xe9, 0x29, 0x6e, 0x81, 0xce, 0xc5, 0xf7, 0x0c, 0xfc, 0x11, 0xd7, 0x63, 0x52, 0x3b, 0x12, 0xca, 0x17, 0x44, 0x33, 0xf2, 0x46, 0x07, 0x3d, 0x1c, 0x28, 0x77, 0xe4, 0x81, 0x28, 0x28, 0xfd, 0xf2, 0xe4, 0x11, 0x34, 0xbc, 0x80, 0x90, 0xfd, 0xce, 0x3f, 0xae, 0xcd, 0x1e, 0x54, 0xa5, 0x89, 0x48, 0xf5, 0x9f, 0x3f, 0x78, 0xb2, 0xc1, 0x14, 0x8b, 0x05, 0x68, 0x7d, 0x71, 0x2a, 0xb2, 0xb2, 0xd6, 0x30, 0x41, 0x60, 0x01, 0x51, 0x3b, 0x9e, 0xfc, 0x7f, 0x95, 0x23, 0xf5, 0x3f ],
+const [ 0xee, 0xfa, 0x0d, 0x62, 0x25, 0x45, 0x97, 0xbd, 0x67, 0xc8, 0x7e, 0x00, 0xfb, 0x35, 0xf6, 0x9c, 0x5c, 0xb2, 0xdc, 0x09, 0xf5, 0x8d, 0x9d, 0x14, 0x29, 0x2b, 0x54, 0x7b, 0x96, 0x42, 0x32, 0xb7, 0x9b, 0x48, 0x23, 0x19, 0x17, 0x2c, 0xae, 0x18, 0x74, 0x43, 0x1d, 0xea, 0xe5, 0x85, 0xdf, 0x51, 0xeb, 0xf9, 0x2a, 0xb8, 0x1e, 0x6e, 0xe5, 0x7e, 0x2a, 0x6c, 0xc4, 0x92, 0x18, 0x6a, 0xb5, 0x40, 0xcf, 0x41, 0x7b, 0x4a, 0xda, 0xe1, 0x98, 0x3b, 0x6b, 0x43, 0x71, 0xf8, 0xa0, 0x9f, 0xad, 0x98, 0x06, 0xde, 0xde, 0x75, 0x5c, 0x52, 0x63, 0x83, 0x99, 0xa5, 0x8d, 0xe1, 0x30, 0x0f, 0x00, 0xae, 0x92, 0xcc, 0x5c, 0x1e, 0xf4, 0xce, 0x1d, 0xcd, 0x53, 0xaf, 0xc0, 0x53, 0xb6, 0xe9, 0x28, 0x18, 0xb4, 0x49, 0x3f, 0x6a, 0x35, 0xa1, 0xe0, 0xcc, 0x7d, 0xbe, 0xf5, 0x91, 0x66, 0x99, 0xdc, 0xaa ],
+const [ 0x56, 0xdc, 0x2b, 0x84, 0xda, 0x28, 0xf9, 0x48, 0x47, 0xf5, 0x98, 0x98, 0x0e, 0xbc, 0x2d, 0x58, 0x92, 0x27, 0x4e, 0x16, 0x39, 0xd0, 0xb7, 0xec, 0xc2, 0x4c, 0x3e, 0xa8, 0xd9, 0x68, 0x09, 0x2b, 0xe8, 0xb2, 0xfe, 0x0f, 0x31, 0x3c, 0x7b, 0x8d, 0x1a, 0x9c, 0x47, 0x9d, 0xc7, 0x37, 0xc9, 0x5e, 0xee, 0xc0, 0x78, 0xb9, 0xe7, 0xfb, 0x93, 0x41, 0x03, 0xc7, 0x12, 0x5e, 0x1f, 0x5b, 0xdc, 0xab, 0x79, 0xd0, 0x3a, 0x9c, 0xc2, 0xe0, 0x8c, 0x64, 0x74, 0xed, 0x3b, 0x16, 0x65, 0x44, 0xee, 0x0a, 0x9d, 0xa4, 0x01, 0x82, 0x64, 0xfa, 0x33, 0x8d, 0xa0, 0x6f, 0x9e, 0x2c, 0x5e, 0xa4, 0xed, 0xb4, 0xaf, 0x3c, 0xc9, 0x73, 0xb5, 0x9c, 0x94, 0x96, 0xfd, 0xee, 0x5a, 0x4a, 0x0f, 0x6c, 0x04, 0x22, 0x44, 0xdb, 0xcf, 0xb9, 0xd8, 0x55, 0xfd, 0x98, 0x40, 0x4c, 0xcb, 0x5a, 0xbe, 0xcc, 0xa2, 0x0e ],
+const [ 0x3a, 0x51, 0xf6, 0xfb, 0xfe, 0xf3, 0x87, 0x24, 0x34, 0x7a, 0xb1, 0xa4, 0xf7, 0xaa, 0xfb, 0x7a, 0x99, 0x9a, 0xee, 0x9b, 0x89, 0x0a, 0x19, 0xe8, 0x7a, 0xf6, 0x58, 0x5d, 0xc1, 0x6c, 0x56, 0x8b, 0xff, 0x9a, 0x51, 0x48, 0x01, 0x2b, 0x1d, 0xa5, 0xe4, 0xd4, 0x6c, 0x20, 0x7d, 0x29, 0x4c, 0x1b, 0xf8, 0xb6, 0xf1, 0x8d, 0xbe, 0x4b, 0xb5, 0xf8, 0x9d, 0x97, 0x5d, 0x9b, 0x23, 0xf8, 0x9e, 0xe8, 0x4a, 0x92, 0xe0, 0x38, 0x5b, 0x9f, 0x41, 0xbe, 0x0c, 0x05, 0xdd, 0xb9, 0xeb, 0x2e, 0x4d, 0xee, 0x00, 0x14, 0x6d, 0x56, 0xae, 0x9b, 0x62, 0x14, 0xdb, 0x24, 0xdc, 0xa9, 0x51, 0x5f, 0x99, 0x6b, 0x63, 0x60, 0x2b, 0x34, 0xd3, 0xf6, 0xfa, 0x57, 0xf3, 0x38, 0x8c, 0xd8, 0x0b, 0x60, 0x04, 0xdc, 0xfb, 0xdd, 0xe9, 0x5e, 0x21, 0xa3, 0x29, 0x24, 0x7d, 0xc6, 0x5e, 0xf1, 0x13, 0x47, 0x4f, 0xfd ],
+const [ 0xaa, 0x02, 0xf0, 0xb3, 0x77, 0xf1, 0x61, 0xee, 0x60, 0xb0, 0xfb, 0xd6, 0xc5, 0x6a, 0x53, 0x7c, 0x03, 0x58, 0xcb, 0x8d, 0xa6, 0x2b, 0x63, 0xd5, 0xda, 0xaa, 0xd2, 0x03, 0x23, 0x9c, 0xd6, 0xac, 0x4e, 0xe8, 0xc8, 0x92, 0xa8, 0xfb, 0x73, 0x25, 0x6d, 0x6a, 0x26, 0x4a, 0x83, 0xd8, 0x08, 0x5c, 0x68, 0x1b, 0xac, 0x70, 0x6a, 0x9a, 0xe5, 0xde, 0x16, 0xf9, 0xdc, 0xfd, 0xf2, 0xf9, 0x5f, 0x2d, 0x6f, 0x99, 0x7c, 0x1b, 0x19, 0x82, 0x4f, 0x40, 0x11, 0xa1, 0x18, 0xab, 0xbd, 0x16, 0x90, 0x01, 0xbe, 0x4d, 0x7e, 0xc2, 0x22, 0x6a, 0x85, 0xcd, 0xdb, 0xeb, 0x40, 0x27, 0x70, 0x88, 0x91, 0xf8, 0xf3, 0x5e, 0x35, 0xd6, 0x33, 0x4d, 0x9c, 0x46, 0x32, 0x9f, 0xf8, 0x80, 0xda, 0xea, 0x95, 0x73, 0xeb, 0x37, 0x68, 0x09, 0x38, 0x63, 0xea, 0xac, 0x13, 0xc6, 0x27, 0x09, 0x06, 0x13, 0x11, 0x14 ],
+const [ 0x72, 0xd1, 0x89, 0x51, 0xda, 0x90, 0xb1, 0xf6, 0xd9, 0x08, 0x25, 0x3e, 0x55, 0xda, 0x1b, 0x5b, 0x47, 0x6d, 0x6a, 0x93, 0x6c, 0xd6, 0xe4, 0x43, 0x3e, 0xfc, 0xe7, 0x24, 0x22, 0xf9, 0x2f, 0xcd, 0xe3, 0xc3, 0xee, 0x79, 0x5f, 0x0b, 0x1f, 0x0b, 0x80, 0x65, 0x17, 0x4f, 0x6e, 0xaa, 0x5d, 0x83, 0x03, 0x9a, 0xbb, 0x16, 0x80, 0xc6, 0x95, 0xaf, 0x7e, 0xae, 0x7a, 0x71, 0x27, 0x26, 0xf9, 0x7e, 0xa5, 0xfe, 0xb6, 0xb9, 0xdb, 0xe1, 0xbd, 0xd1, 0x53, 0x7e, 0x15, 0x7b, 0x78, 0xe6, 0x99, 0xfe, 0x06, 0x35, 0x03, 0xf5, 0xbe, 0x75, 0x4a, 0x50, 0x5e, 0xbf, 0x2e, 0x9d, 0xd0, 0xa3, 0x10, 0x86, 0xa2, 0xcb, 0x08, 0x9a, 0xb6, 0xda, 0x32, 0x50, 0x3b, 0x9a, 0x48, 0x48, 0xdb, 0x57, 0x76, 0xd5, 0x36, 0x86, 0x69, 0xb9, 0x90, 0xab, 0xaa, 0x2f, 0xc6, 0x79, 0x2a, 0x2f, 0x87, 0x3a, 0x1e, 0xed ],
+const [ 0xeb, 0x6b, 0x60, 0xd0, 0x85, 0x8d, 0x6f, 0x87, 0xf5, 0xb9, 0xba, 0x7f, 0xc7, 0x5a, 0xcb, 0xa8, 0x75, 0x17, 0x84, 0xef, 0x88, 0x60, 0x61, 0x70, 0x00, 0x47, 0xfd, 0xe7, 0xf6, 0x92, 0xd8, 0x68, 0x80, 0x0e, 0x57, 0x51, 0xd5, 0x26, 0x0c, 0x7c, 0xb1, 0xb3, 0x38, 0xb9, 0xfb, 0x16, 0x8e, 0x7b, 0xa6, 0x85, 0x3a, 0xd1, 0xd5, 0xa2, 0x22, 0x98, 0x42, 0x52, 0x6c, 0xf0, 0xe0, 0xcc, 0x40, 0xec, 0xbf, 0xf0, 0xcf, 0x8e, 0x30, 0xdb, 0x94, 0xf2, 0x2b, 0xb8, 0xd9, 0xc9, 0xed, 0xd8, 0x7e, 0x09, 0xe5, 0x06, 0xf6, 0xe3, 0xd1, 0x14, 0x92, 0xf6, 0x25, 0xba, 0x02, 0xc2, 0xac, 0xa1, 0x19, 0x5f, 0x71, 0xba, 0xd0, 0x6e, 0xe0, 0xd4, 0x8e, 0x51, 0x29, 0x6e, 0xa6, 0x97, 0xe5, 0xc9, 0x21, 0xba, 0xfc, 0x42, 0xbf, 0x0d, 0xc6, 0xdf, 0x38, 0xf0, 0x70, 0x28, 0xc7, 0x46, 0xa2, 0x38, 0xe9, 0x29 ],
+const [ 0x36, 0xb5, 0xcf, 0x31, 0xaf, 0x37, 0xc9, 0x03, 0x34, 0xf2, 0xf4, 0xad, 0xf6, 0xa9, 0x18, 0xa2, 0x2e, 0xff, 0x5e, 0x3e, 0x54, 0xdc, 0x1a, 0x4f, 0x92, 0x12, 0xe8, 0xd4, 0x78, 0x41, 0xfa, 0x05, 0xf1, 0xf8, 0xb0, 0x93, 0x76, 0x1c, 0x69, 0x30, 0x81, 0x8e, 0x9a, 0x52, 0x45, 0x08, 0x1d, 0x34, 0x9c, 0x48, 0xcb, 0x1e, 0x41, 0x71, 0x4c, 0xe7, 0x3f, 0xae, 0x2e, 0xb8, 0xa9, 0x18, 0x35, 0x12, 0x8c, 0xda, 0xf2, 0x13, 0x22, 0x92, 0x97, 0xf5, 0x48, 0xfb, 0x0a, 0xd7, 0x32, 0xca, 0x38, 0xc0, 0x5e, 0xd5, 0xac, 0xe1, 0xc6, 0x7a, 0x60, 0x1a, 0x5a, 0x3f, 0xd3, 0xc0, 0xad, 0xb6, 0x5b, 0x9e, 0xef, 0xa4, 0xbd, 0x39, 0x1b, 0x61, 0xfb, 0x59, 0x71, 0x82, 0x6d, 0xc4, 0x27, 0xb6, 0x13, 0x4d, 0x5c, 0xee, 0x2a, 0x0d, 0x4d, 0xc1, 0xfd, 0xf1, 0xcb, 0x0e, 0xfe, 0x75, 0xed, 0xe3, 0x15, 0xae ],
+const [ 0xf1, 0xab, 0x8f, 0xda, 0x83, 0x9d, 0x00, 0xf0, 0x47, 0x7d, 0x1a, 0xb6, 0xf3, 0xba, 0xdd, 0x42, 0x18, 0x34, 0xfa, 0x89, 0xa4, 0xab, 0x80, 0x75, 0xab, 0x77, 0xb7, 0x38, 0x67, 0x7a, 0x4c, 0xdf, 0x7d, 0x54, 0xaf, 0x2a, 0x81, 0xd5, 0xba, 0x9b, 0xbd, 0xb8, 0x93, 0xcd, 0x2e, 0x8e, 0xd3, 0x07, 0xd0, 0xf8, 0xe8, 0x11, 0x1c, 0x19, 0xb8, 0x46, 0xce, 0x4b, 0x86, 0xeb, 0xeb, 0x11, 0x1a, 0xbf, 0x03, 0x4e, 0x1c, 0xd3, 0xb3, 0xb4, 0xc2, 0x9c, 0x6f, 0x7e, 0xab, 0x47, 0x7e, 0x62, 0x0a, 0x4c, 0x46, 0xc1, 0x06, 0x46, 0xca, 0x22, 0x61, 0x02, 0x71, 0xde, 0x58, 0xd6, 0x09, 0x1c, 0xcb, 0x34, 0x0b, 0x00, 0x9e, 0x7e, 0x21, 0x20, 0x5f, 0x1c, 0xe5, 0x38, 0x29, 0xcd, 0xec, 0x1e, 0xc8, 0x3a, 0x03, 0xf8, 0x1d, 0xd1, 0xb8, 0xac, 0xc4, 0xd0, 0x1d, 0x98, 0xf5, 0xa0, 0xc8, 0x84, 0xa8, 0x65 ],
+const [ 0x6b, 0xfd, 0xc8, 0x53, 0x9f, 0xe6, 0xbf, 0x99, 0x89, 0x2c, 0x1c, 0x36, 0xd5, 0x21, 0xf7, 0xb1, 0x7c, 0x22, 0x4e, 0xe3, 0x83, 0x77, 0x55, 0xfe, 0xe5, 0x7a, 0x0d, 0xce, 0xce, 0xfb, 0x18, 0x3e, 0x09, 0xe4, 0xcc, 0x1d, 0xbc, 0x19, 0x86, 0x22, 0x53, 0xa2, 0x41, 0x2e, 0xba, 0x0c, 0x67, 0xd2, 0xcf, 0x0c, 0xe6, 0x11, 0x17, 0x66, 0x87, 0x67, 0xaf, 0x0d, 0x7c, 0x0a, 0x86, 0x8c, 0x37, 0x6f, 0xca, 0xa4, 0x83, 0x10, 0xa0, 0x37, 0xcd, 0x6d, 0x18, 0x65, 0xc2, 0x50, 0x60, 0xf4, 0x20, 0x56, 0x38, 0xf5, 0xc5, 0xab, 0xa5, 0xa4, 0x0d, 0x15, 0xea, 0x91, 0x5a, 0x34, 0xb4, 0xfd, 0xf4, 0x08, 0x95, 0x87, 0x14, 0xb3, 0xb3, 0x08, 0x3b, 0x80, 0xc2, 0xbb, 0xc8, 0x25, 0x2f, 0xa1, 0xca, 0x45, 0x9e, 0x23, 0x13, 0x39, 0x97, 0xfa, 0x8e, 0x10, 0x7c, 0x4c, 0xd2, 0xd4, 0xbf, 0x17, 0xf6, 0x0f ],
+const [ 0xb5, 0x51, 0x09, 0x6a, 0x19, 0x4a, 0xee, 0x89, 0x92, 0x99, 0x13, 0x25, 0xde, 0x92, 0xc9, 0x59, 0x7c, 0x4d, 0x1c, 0x15, 0x6c, 0x57, 0xb4, 0x70, 0x36, 0xa7, 0xf9, 0x3f, 0x2d, 0xd4, 0x7b, 0xe6, 0xf5, 0x85, 0x90, 0x6e, 0x43, 0x28, 0x3f, 0xd8, 0xe4, 0xe7, 0x5c, 0xb1, 0x01, 0xd7, 0xf5, 0xe7, 0xa1, 0x73, 0xed, 0xdb, 0x6f, 0x4a, 0xe7, 0xb7, 0xbe, 0xf4, 0x65, 0x02, 0xca, 0x4a, 0x31, 0x72, 0x40, 0xd7, 0xfd, 0x01, 0x01, 0x89, 0x46, 0x42, 0x23, 0xac, 0x7e, 0xf6, 0x39, 0x19, 0x69, 0xdb, 0xd5, 0xab, 0xc8, 0xc4, 0x4b, 0xf3, 0x35, 0xee, 0xb7, 0x2d, 0x4e, 0x92, 0x41, 0x72, 0x15, 0xb7, 0x9f, 0x2f, 0x97, 0x4a, 0xdc, 0xd5, 0xcc, 0x70, 0x58, 0xd2, 0xbf, 0x1b, 0x11, 0xc1, 0xee, 0xdc, 0x20, 0xdd, 0xf4, 0xf8, 0x87, 0xbc, 0x65, 0xbd, 0x29, 0x3a, 0xfa, 0x16, 0x1a, 0xb3, 0xee, 0x5e ],
+const [ 0x86, 0x8b, 0xf0, 0x10, 0xb6, 0xe2, 0x6e, 0x4c, 0x1f, 0x91, 0xf0, 0x61, 0x4f, 0xf4, 0x2b, 0xc1, 0x40, 0x30, 0x87, 0xc3, 0x3b, 0x7e, 0x22, 0x9a, 0xf6, 0xc7, 0x18, 0x88, 0x00, 0x72, 0x02, 0x4f, 0x5e, 0x7a, 0xbc, 0xe9, 0x77, 0xc3, 0x6c, 0x78, 0x2d, 0xae, 0xbf, 0x80, 0x4d, 0xeb, 0x76, 0x54, 0x29, 0x8e, 0x22, 0xce, 0x83, 0x65, 0x2b, 0x43, 0xad, 0x89, 0x17, 0xb6, 0xef, 0x34, 0x09, 0x4c, 0x29, 0xd2, 0x88, 0x00, 0xb9, 0x5b, 0x82, 0x98, 0x9f, 0xdf, 0x91, 0xd8, 0xdf, 0x63, 0x7c, 0xf5, 0x27, 0xeb, 0x01, 0x4d, 0xb2, 0xd8, 0xd2, 0x54, 0x6c, 0x74, 0xdd, 0xd2, 0x57, 0xcc, 0xd0, 0x4c, 0x2d, 0xbe, 0xdd, 0xbf, 0x47, 0x52, 0xbb, 0x95, 0xbd, 0x4e, 0xed, 0xd1, 0xcf, 0x04, 0x46, 0x8d, 0x84, 0x6f, 0xad, 0xa6, 0x90, 0x7e, 0x1e, 0xb6, 0x7b, 0xb0, 0xf1, 0x42, 0x00, 0xe1, 0x5f, 0x35 ],
+const [ 0x85, 0x2f, 0x42, 0x03, 0x42, 0xb4, 0xbe, 0xad, 0x2e, 0x71, 0x44, 0x24, 0xeb, 0x0f, 0x28, 0x7f, 0x07, 0x76, 0x02, 0x04, 0x7f, 0x40, 0x55, 0x3d, 0x81, 0x6d, 0x6e, 0x4e, 0x76, 0x58, 0x8f, 0x85, 0x40, 0xe9, 0x4d, 0x33, 0xc0, 0x0d, 0x37, 0xba, 0x9c, 0x63, 0xb8, 0xe8, 0x3f, 0x39, 0x3f, 0x83, 0x21, 0xb6, 0x9c, 0x25, 0x48, 0x58, 0xae, 0x4a, 0x0f, 0xa2, 0x3b, 0xa8, 0x26, 0x0e, 0x1f, 0xbf, 0xda, 0x49, 0xa9, 0xb0, 0x96, 0x9f, 0x42, 0x52, 0xaa, 0xb4, 0x4f, 0x83, 0x4c, 0x76, 0x59, 0xbc, 0xdc, 0x4f, 0x6b, 0xe9, 0x6d, 0x9f, 0xbc, 0x77, 0x80, 0x69, 0x8e, 0xae, 0x12, 0x4d, 0x56, 0x41, 0xda, 0xb6, 0x1d, 0x23, 0xcc, 0x54, 0x26, 0x9d, 0xe1, 0xcd, 0xd1, 0x9e, 0x1a, 0xaf, 0xbf, 0x52, 0xc3, 0xaa, 0x37, 0xf5, 0xf5, 0xfc, 0xc9, 0xea, 0x5e, 0x2c, 0x31, 0x07, 0x44, 0xfb, 0x7e, 0x34 ],
+const [ 0x01, 0xc6, 0xd5, 0xc0, 0x27, 0x2b, 0x63, 0x1c, 0x3f, 0x9d, 0x1c, 0x06, 0x87, 0xf7, 0xc1, 0x49, 0x6e, 0x77, 0xe1, 0x47, 0x9b, 0xb9, 0xfc, 0x8f, 0x31, 0xe6, 0xe8, 0xb2, 0x52, 0x29, 0x74, 0x53, 0xe2, 0x62, 0x4c, 0x7e, 0x8d, 0x1f, 0x1c, 0x3b, 0x0b, 0xc8, 0xf8, 0x62, 0xa2, 0x19, 0xfc, 0xb0, 0xed, 0xd5, 0x2f, 0x1b, 0xdd, 0xb9, 0xad, 0x63, 0xfd, 0xaf, 0x06, 0xea, 0xfa, 0x45, 0xe1, 0xc5, 0x62, 0x5d, 0xe5, 0x13, 0xac, 0x26, 0xd9, 0x8d, 0x79, 0x4b, 0x09, 0x5f, 0x19, 0x6a, 0xec, 0x37, 0x51, 0xc7, 0x05, 0x9b, 0x5b, 0x42, 0x07, 0x7f, 0x2f, 0x86, 0x3c, 0x17, 0x01, 0x84, 0x27, 0xea, 0x0b, 0x20, 0x69, 0x28, 0x8c, 0x29, 0xe1, 0x3d, 0x11, 0x8f, 0x17, 0xa6, 0xf3, 0xd0, 0xdb, 0x03, 0x21, 0xb4, 0x29, 0x6e, 0x1f, 0x3a, 0x50, 0x0c, 0x4f, 0xd2, 0x53, 0xe1, 0x70, 0xcc, 0x90, 0xe9 ],
+const [ 0xa7, 0x41, 0x00, 0xcf, 0x30, 0xcd, 0x26, 0x41, 0x6e, 0x98, 0x78, 0x73, 0x9d, 0xfd, 0xb3, 0xc1, 0xfa, 0x56, 0x9d, 0x64, 0x27, 0xca, 0x8e, 0xe9, 0xd0, 0x66, 0x30, 0xe1, 0x8f, 0x6f, 0x83, 0xdb, 0x0d, 0xf7, 0x24, 0x8f, 0x6b, 0xaf, 0xce, 0x5c, 0xe0, 0xfc, 0x21, 0xf5, 0xa3, 0x4d, 0xa2, 0x57, 0x0b, 0xab, 0x04, 0xfe, 0xf4, 0x92, 0xa6, 0x58, 0x66, 0xff, 0x5c, 0x7a, 0x71, 0xca, 0x72, 0x12, 0x5b, 0x36, 0xee, 0x9c, 0xfe, 0xc7, 0x16, 0xd9, 0x6b, 0x53, 0x32, 0x7d, 0xd3, 0x5c, 0x93, 0x28, 0xa8, 0x9d, 0xd4, 0x98, 0xff, 0xe3, 0x60, 0x1d, 0x39, 0x1e, 0x34, 0x4d, 0xe2, 0xb8, 0xe7, 0xf8, 0xd9, 0x25, 0xe7, 0x5f, 0xb1, 0xbc, 0x05, 0xa0, 0x58, 0xc5, 0x34, 0x75, 0xf6, 0xd3, 0x8d, 0x1e, 0x18, 0x54, 0x97, 0x9c, 0x0e, 0x66, 0xc6, 0x20, 0x91, 0xec, 0x41, 0xc3, 0xaa, 0xe1, 0xe8, 0x77 ],
+const [ 0x72, 0xc2, 0x1b, 0xe6, 0xf0, 0xc4, 0xdf, 0x7c, 0xc8, 0xa5, 0x3f, 0x92, 0x26, 0xf3, 0x61, 0x46, 0xf9, 0xec, 0x5b, 0xea, 0x9c, 0x94, 0xf3, 0xb7, 0xb6, 0x04, 0xa8, 0xbf, 0x5f, 0x05, 0xf7, 0x24, 0x84, 0xdd, 0xd7, 0x88, 0x8c, 0x69, 0x86, 0xc4, 0x3b, 0x6c, 0x87, 0xdd, 0xd7, 0x27, 0xec, 0x34, 0x8a, 0x2a, 0xd1, 0xfc, 0x08, 0x69, 0x29, 0xf1, 0x71, 0x92, 0xbd, 0x47, 0x79, 0x9e, 0x71, 0xe1, 0xc6, 0xa7, 0xc9, 0xc4, 0x9a, 0xf9, 0xad, 0xcb, 0xb1, 0x6b, 0x69, 0x9c, 0x6d, 0xf0, 0xf8, 0xda, 0x30, 0x69, 0x82, 0x9d, 0x09, 0xbd, 0x23, 0x1f, 0x94, 0x2c, 0xee, 0xb8, 0x1b, 0xe0, 0x32, 0x0c, 0x01, 0xc5, 0xfb, 0x83, 0x61, 0x9b, 0xdc, 0xf9, 0xf2, 0x4a, 0xec, 0xb7, 0x2e, 0x75, 0x0f, 0xa2, 0xb3, 0x51, 0x77, 0xb3, 0xe9, 0xb8, 0x6a, 0xa7, 0xe5, 0x79, 0x45, 0xf8, 0x8d, 0xf3, 0xc1, 0x0b ],
+const [ 0xc7, 0x62, 0x7c, 0x9a, 0x6d, 0x1e, 0x7c, 0x41, 0xc1, 0x86, 0x57, 0xb5, 0x98, 0xac, 0x29, 0xb2, 0x8c, 0x4d, 0x0e, 0xf0, 0x47, 0x00, 0x8a, 0xf7, 0xfe, 0xb3, 0x29, 0x35, 0x3b, 0x58, 0x62, 0x4e, 0xe0, 0xdc, 0xc1, 0xb3, 0x69, 0x59, 0x46, 0x76, 0x71, 0x8c, 0x08, 0x5d, 0x77, 0x89, 0x1d, 0x35, 0xe3, 0xad, 0xbe, 0x68, 0x44, 0xd5, 0xa7, 0xd2, 0xdc, 0xcd, 0xbd, 0xd1, 0x5e, 0x0c, 0xf3, 0x9b, 0xf6, 0x9e, 0x6e, 0xd5, 0x8a, 0x61, 0xe8, 0x61, 0x40, 0x74, 0x52, 0x77, 0x40, 0xed, 0xbd, 0xf7, 0xbb, 0xca, 0x7a, 0xfd, 0x2c, 0x2b, 0x80, 0xb6, 0xdd, 0xbe, 0x0f, 0x73, 0xad, 0x7a, 0x93, 0xfc, 0x12, 0x90, 0xcb, 0x27, 0x5a, 0x9e, 0x2a, 0xa9, 0x36, 0x26, 0x7e, 0x2b, 0x78, 0x40, 0xcf, 0xa1, 0x1c, 0x8b, 0x8a, 0xd7, 0x85, 0x69, 0xdf, 0x4c, 0x0a, 0x6c, 0x67, 0x44, 0xb1, 0x0b, 0x0a, 0x19 ],
+const [ 0x84, 0x19, 0x33, 0x07, 0x10, 0x96, 0x8f, 0xb4, 0x0a, 0xe9, 0x15, 0xe6, 0x65, 0x48, 0xf1, 0xac, 0x44, 0x55, 0x09, 0xe3, 0x61, 0xf5, 0x83, 0xab, 0xaf, 0x5f, 0x87, 0x17, 0x3e, 0x73, 0x46, 0x29, 0x5f, 0x4e, 0x3b, 0xfd, 0x0a, 0x1b, 0xb0, 0x44, 0x7c, 0x2b, 0x85, 0xf4, 0x24, 0x49, 0x2d, 0x3e, 0xc0, 0x47, 0xf9, 0xc1, 0xc4, 0xdd, 0x99, 0xfd, 0xfb, 0xb4, 0xe0, 0x0a, 0x70, 0xbd, 0xc7, 0x89, 0x8f, 0xc7, 0xb5, 0xdc, 0x88, 0x51, 0xfd, 0x92, 0xf4, 0x9c, 0xa8, 0x25, 0xbb, 0x05, 0x76, 0xe8, 0x35, 0x92, 0x1f, 0x3b, 0x8f, 0xcb, 0xde, 0x01, 0x71, 0xcb, 0x30, 0x54, 0xdd, 0x96, 0xda, 0x77, 0x5b, 0xad, 0x29, 0x0b, 0x53, 0xe0, 0x7d, 0x86, 0xba, 0x64, 0x09, 0xe2, 0xf0, 0x25, 0xd4, 0x92, 0xe9, 0x5d, 0x03, 0xba, 0x8c, 0x66, 0x5b, 0x9f, 0x58, 0xcd, 0x02, 0x5d, 0x4d, 0xa7, 0x85, 0xd8 ],
+const [ 0x57, 0xd7, 0x3f, 0x3b, 0xdc, 0xaa, 0xdf, 0x51, 0xfd, 0x61, 0xaa, 0x65, 0xa0, 0x1d, 0xc7, 0x56, 0x38, 0x54, 0x6d, 0xcc, 0xdd, 0x89, 0x9a, 0x1d, 0xa2, 0x5a, 0x08, 0x6d, 0x23, 0xc0, 0x5d, 0x1a, 0x5d, 0x93, 0xa1, 0x57, 0xc3, 0x4c, 0xf6, 0x16, 0x8e, 0x0f, 0x83, 0x2c, 0x54, 0xe9, 0xb2, 0xaf, 0xdc, 0x56, 0x9b, 0xa3, 0x31, 0x06, 0xc0, 0xd6, 0xf5, 0xe0, 0xfa, 0x09, 0xf8, 0x48, 0xb3, 0x50, 0x09, 0x9d, 0x56, 0xbc, 0x0c, 0x06, 0x04, 0x36, 0x4d, 0x6f, 0x89, 0xae, 0x14, 0xce, 0x8e, 0x76, 0x7a, 0xab, 0x0f, 0xe8, 0x7a, 0xdf, 0x10, 0x4f, 0x4b, 0x9c, 0x8c, 0x05, 0xed, 0xad, 0xaf, 0xd8, 0x03, 0xff, 0x45, 0xb2, 0xe0, 0x61, 0x71, 0x7a, 0xe4, 0x88, 0xa2, 0x35, 0x09, 0x56, 0xc3, 0x71, 0xb9, 0x5c, 0xb2, 0xe3, 0xe3, 0x9d, 0xf4, 0x4f, 0x4d, 0x94, 0xa7, 0xa8, 0x2c, 0x79, 0xb7, 0x79 ],
+const [ 0x0c, 0x84, 0x04, 0xfe, 0x10, 0x87, 0x0f, 0xda, 0xc0, 0xe8, 0xd2, 0x1c, 0x99, 0xc7, 0x3d, 0x04, 0xa7, 0x8b, 0x6d, 0x4c, 0x8f, 0xd3, 0xcf, 0xb8, 0xd3, 0xae, 0x87, 0xee, 0x52, 0x0e, 0x13, 0x88, 0x0e, 0x7a, 0x2b, 0x68, 0x32, 0x04, 0xec, 0x4b, 0x54, 0x7b, 0x36, 0xa1, 0xf7, 0xe1, 0x53, 0x9d, 0x54, 0x1f, 0xd9, 0x88, 0x5a, 0xf8, 0xd1, 0x5a, 0xf3, 0x3c, 0x18, 0x8b, 0x89, 0x3e, 0x06, 0x27, 0xc9, 0x87, 0x4e, 0x21, 0xa6, 0xcc, 0x25, 0xe9, 0xa1, 0x1e, 0xa7, 0x40, 0x48, 0x61, 0x76, 0x4c, 0xfd, 0xff, 0xa4, 0xe7, 0xf9, 0xde, 0xd3, 0x3d, 0x91, 0x8f, 0x9a, 0x96, 0xb7, 0xc8, 0x2b, 0x70, 0xc3, 0x14, 0x33, 0xd1, 0x74, 0xc9, 0x02, 0xdb, 0x31, 0x3a, 0xec, 0xa1, 0x95, 0x2f, 0xef, 0x39, 0x2b, 0x92, 0x96, 0x13, 0x76, 0x6b, 0x1c, 0x88, 0x35, 0x0f, 0xd5, 0xb6, 0xe4, 0x93, 0xca, 0x8c ],
+const [ 0xfe, 0x1c, 0x33, 0xca, 0xde, 0xc6, 0x93, 0xcf, 0xa5, 0x32, 0x50, 0xd9, 0x06, 0xd3, 0x5d, 0x1e, 0x2d, 0xb8, 0xdf, 0x43, 0x00, 0xbe, 0x8f, 0x2a, 0xa5, 0x05, 0x60, 0x0b, 0x44, 0xa0, 0x63, 0xc6, 0x0e, 0x91, 0xe7, 0x77, 0x7e, 0xf4, 0xe4, 0x4b, 0xde, 0x7a, 0x9a, 0x93, 0x0e, 0x19, 0x75, 0x17, 0x81, 0x02, 0x34, 0xad, 0x88, 0xd4, 0x4a, 0x0a, 0xd3, 0x0f, 0x84, 0xd7, 0x34, 0xcb, 0xed, 0x08, 0xa7, 0xaa, 0xef, 0x69, 0x90, 0x0b, 0xba, 0x79, 0x43, 0x80, 0xea, 0x7c, 0xc9, 0x83, 0x63, 0xcc, 0xe2, 0x64, 0x80, 0x70, 0x46, 0x86, 0x6e, 0xef, 0x30, 0xcb, 0xd2, 0x66, 0x1d, 0x4d, 0xb2, 0xd9, 0xd1, 0x4f, 0x92, 0xc7, 0x9c, 0x73, 0xdd, 0x01, 0xdb, 0x2d, 0x87, 0xbc, 0xc1, 0x77, 0xf1, 0xe4, 0x58, 0xc6, 0x0d, 0xb3, 0xc2, 0x3d, 0xc2, 0x83, 0xc5, 0x21, 0x92, 0xe0, 0x87, 0x8e, 0x7a, 0xe2 ],
+const [ 0x02, 0x30, 0x04, 0xdf, 0xf8, 0x9f, 0x08, 0x20, 0x89, 0x2b, 0xe1, 0x5f, 0xb9, 0x1d, 0xc4, 0xc4, 0x98, 0x93, 0x6b, 0xfa, 0xb9, 0x23, 0x20, 0xee, 0xe6, 0xc1, 0x17, 0xd4, 0x12, 0xe3, 0x00, 0x6c, 0x8f, 0xe3, 0xdd, 0x83, 0x82, 0xa4, 0x11, 0xbc, 0x93, 0x78, 0xba, 0x90, 0xe9, 0x41, 0x41, 0x94, 0x55, 0xd7, 0x30, 0xfa, 0xcd, 0xaa, 0x43, 0x5b, 0x1d, 0xa9, 0xc1, 0xb4, 0xd9, 0x62, 0x0c, 0xae, 0x96, 0x6a, 0x77, 0x22, 0x59, 0xff, 0x59, 0xdc, 0x50, 0xec, 0x60, 0x9f, 0xc0, 0xad, 0x27, 0x6a, 0x3f, 0xd4, 0x0a, 0xfa, 0x23, 0xab, 0x39, 0x90, 0x3a, 0x1b, 0x0b, 0xf4, 0xbc, 0xcc, 0x95, 0xba, 0x7d, 0x8e, 0x7c, 0xc4, 0x67, 0xf8, 0x07, 0x08, 0x28, 0x4e, 0x78, 0x93, 0x28, 0xa8, 0x9d, 0xce, 0xbe, 0x51, 0xa2, 0x01, 0xa3, 0x6e, 0x29, 0x15, 0xa7, 0xe0, 0x9c, 0x9e, 0xa2, 0x6b, 0xc2, 0x19 ],
+const [ 0x0d, 0x61, 0x2e, 0x19, 0x53, 0xe7, 0xcf, 0xde, 0x52, 0x42, 0xfa, 0xe7, 0xd5, 0x1c, 0x81, 0x52, 0xd2, 0xa4, 0xa7, 0xe4, 0x4d, 0xe1, 0x28, 0xfb, 0x7a, 0x46, 0x7a, 0xc4, 0x22, 0x86, 0x53, 0xae, 0x47, 0xaa, 0x6b, 0x1f, 0x0b, 0x60, 0x83, 0x65, 0xce, 0x96, 0xa6, 0xef, 0x97, 0x47, 0xaf, 0xbd, 0xb5, 0x95, 0x0b, 0x15, 0xa6, 0x19, 0xc0, 0x78, 0x37, 0x77, 0xae, 0xd4, 0xed, 0x35, 0x15, 0xfb, 0xa4, 0xcd, 0x58, 0x54, 0x76, 0x00, 0x01, 0xd0, 0xde, 0x6e, 0x04, 0x20, 0x1d, 0x64, 0x48, 0x26, 0xdd, 0xf5, 0x63, 0xa9, 0x15, 0x4c, 0xa6, 0x4c, 0x2c, 0x40, 0x59, 0xc1, 0x61, 0x29, 0x47, 0x3a, 0x6a, 0xf2, 0x7e, 0x20, 0x5b, 0x70, 0x50, 0x08, 0xca, 0xf2, 0x9d, 0xe3, 0x31, 0x1a, 0x55, 0x74, 0x93, 0xeb, 0x38, 0x08, 0x63, 0x22, 0xe0, 0x61, 0xa1, 0xca, 0x02, 0xf3, 0x46, 0x0b, 0xf1, 0x53 ],
+const [ 0x62, 0x90, 0x81, 0x31, 0xc6, 0x88, 0x71, 0x18, 0x35, 0x17, 0x73, 0x48, 0x43, 0x4f, 0xdd, 0x10, 0x16, 0x94, 0x17, 0x88, 0x76, 0x5b, 0x50, 0x75, 0x24, 0x30, 0x71, 0x6e, 0x6d, 0xfe, 0x4f, 0x3d, 0xfe, 0x8b, 0x25, 0x88, 0xfa, 0x42, 0x41, 0xb1, 0x4a, 0x35, 0xfd, 0xfa, 0x35, 0x62, 0xf1, 0xed, 0x30, 0x35, 0x67, 0xfb, 0xf7, 0x4f, 0x0f, 0x63, 0xdc, 0x86, 0xf5, 0x55, 0x5f, 0x2d, 0xaf, 0x57, 0x00, 0x95, 0xdb, 0xe9, 0x51, 0xd3, 0xc9, 0x64, 0x4f, 0xc4, 0x74, 0x28, 0xf2, 0x4f, 0xb7, 0xf6, 0x03, 0xea, 0xbd, 0x9b, 0x2e, 0x60, 0xba, 0xcf, 0x58, 0xd1, 0xd8, 0x5c, 0x33, 0xfa, 0x75, 0x83, 0x0f, 0xb6, 0x8b, 0x9b, 0xf3, 0xc5, 0x6f, 0xfb, 0xec, 0xcd, 0xbf, 0x1a, 0xa5, 0x9e, 0x95, 0xf5, 0x38, 0xba, 0x01, 0xb1, 0x44, 0x15, 0xb7, 0x82, 0x40, 0x19, 0x04, 0xcb, 0x0e, 0xed, 0x07, 0x87 ],
+const [ 0x47, 0x45, 0x10, 0x0c, 0xec, 0x04, 0x06, 0xcf, 0xfa, 0x14, 0x63, 0x50, 0xee, 0x12, 0x21, 0x33, 0x30, 0xd1, 0x92, 0x12, 0x3a, 0xf4, 0xa1, 0xba, 0xfd, 0xbc, 0x5c, 0x98, 0x80, 0x1e, 0xaf, 0x6e, 0xcb, 0x19, 0x72, 0x4a, 0x03, 0x46, 0xa7, 0xb9, 0xd6, 0xb1, 0xfc, 0x38, 0x1a, 0xe7, 0x98, 0xeb, 0xb0, 0x50, 0x13, 0x92, 0xaf, 0xbf, 0xc6, 0xb8, 0xbe, 0x48, 0x46, 0x2d, 0xc2, 0x52, 0x2b, 0xb7, 0xba, 0xec, 0x16, 0x05, 0xe6, 0x65, 0xf2, 0xe4, 0x2f, 0x16, 0x79, 0xb6, 0xc3, 0x83, 0xfa, 0x1f, 0x00, 0xa3, 0x5a, 0x01, 0x93, 0x7b, 0x5a, 0xab, 0xe1, 0xf2, 0x17, 0x4d, 0xa6, 0xe0, 0xd7, 0xaf, 0xdb, 0x68, 0x02, 0x23, 0xde, 0x88, 0x6f, 0xb9, 0xcd, 0xee, 0xe1, 0xb1, 0x32, 0x0d, 0xd2, 0x36, 0xe6, 0x71, 0x6f, 0x49, 0x2f, 0x4f, 0xe3, 0xfb, 0x2c, 0x61, 0xd8, 0xdf, 0x73, 0xf0, 0x3b, 0xbf ],
+const [ 0xfc, 0x07, 0x23, 0xc3, 0xf8, 0x4d, 0xe1, 0x17, 0x8d, 0x14, 0x37, 0x5c, 0x33, 0x07, 0xf0, 0xba, 0xbd, 0xbb, 0x20, 0x86, 0x81, 0x3f, 0x69, 0x70, 0xb8, 0xf4, 0x77, 0xfe, 0x28, 0x9e, 0xcd, 0x39, 0x00, 0xbc, 0xc4, 0xa6, 0x03, 0x15, 0xd0, 0x77, 0xe8, 0x94, 0x06, 0x03, 0x01, 0x55, 0xdb, 0x74, 0x1c, 0x00, 0x2f, 0xbf, 0xa7, 0x56, 0x8a, 0xda, 0x17, 0x09, 0xa5, 0x29, 0x8a, 0xd1, 0x2c, 0x39, 0xaa, 0xbc, 0xc2, 0xb0, 0xd5, 0xc6, 0x46, 0x84, 0x7c, 0xa9, 0x54, 0x6c, 0xc9, 0xf6, 0x0f, 0x94, 0x85, 0x65, 0x1e, 0x95, 0x38, 0x69, 0xf5, 0xa4, 0x92, 0x08, 0x56, 0x09, 0x09, 0xea, 0x17, 0xd4, 0xc4, 0xb0, 0x25, 0xcb, 0xb8, 0x87, 0xc9, 0xa6, 0x11, 0xfc, 0x2a, 0x7f, 0xd3, 0x12, 0x14, 0x84, 0xc1, 0x91, 0xf7, 0xef, 0x7e, 0xa2, 0x33, 0x38, 0xf2, 0x99, 0x92, 0x88, 0xef, 0x12, 0x16, 0x72 ],
+const [ 0x5a, 0x40, 0x29, 0x8e, 0x32, 0x3c, 0xe9, 0x75, 0x49, 0xd4, 0xc8, 0x20, 0xb0, 0xa7, 0x7c, 0xbd, 0xef, 0xea, 0xf6, 0xca, 0x9b, 0xad, 0x94, 0x7a, 0x2b, 0x60, 0x98, 0x5a, 0x07, 0x95, 0xd9, 0x34, 0xe2, 0x08, 0xb8, 0x33, 0x4a, 0xdc, 0x56, 0x49, 0x7d, 0x27, 0x04, 0xce, 0x7f, 0xb1, 0xfb, 0x6a, 0x69, 0xf9, 0x4e, 0x34, 0x04, 0x79, 0x1c, 0x1b, 0x96, 0x2b, 0x0a, 0x86, 0xfc, 0x4c, 0xf0, 0x37, 0xf9, 0x60, 0xd3, 0x75, 0xce, 0x76, 0x14, 0x6a, 0x0b, 0xad, 0xe6, 0xca, 0xa4, 0xf7, 0x05, 0xb5, 0x47, 0x1d, 0xa6, 0xdf, 0xed, 0x04, 0xa9, 0xee, 0xb0, 0x2e, 0x16, 0x23, 0xdc, 0x83, 0xc7, 0x3d, 0x48, 0x52, 0x62, 0x9a, 0xe7, 0x93, 0x8b, 0xa0, 0x9a, 0x6f, 0x57, 0x5b, 0x48, 0x02, 0x03, 0x67, 0x31, 0x5f, 0xe6, 0x11, 0x7f, 0xd4, 0xa4, 0xb9, 0x1e, 0x70, 0xa5, 0x7b, 0xce, 0xc3, 0xc5, 0x0e ],
+const [ 0x99, 0x95, 0x8a, 0xa4, 0x59, 0x60, 0x46, 0x57, 0xc7, 0xbf, 0x6e, 0x4c, 0xdf, 0xcc, 0x87, 0x85, 0xf0, 0xab, 0xf0, 0x6f, 0xfe, 0x63, 0x6b, 0x5b, 0x64, 0xec, 0xd9, 0x31, 0xbd, 0x8a, 0x45, 0x63, 0x05, 0x59, 0x24, 0x21, 0xfc, 0x28, 0xdb, 0xcc, 0xcb, 0x8a, 0x82, 0xac, 0xea, 0x2b, 0xe8, 0xe5, 0x41, 0x61, 0xd7, 0xa7, 0x8e, 0x03, 0x99, 0xa6, 0x06, 0x7e, 0xba, 0xca, 0x3f, 0x25, 0x10, 0x27, 0x4d, 0xc9, 0xf9, 0x2f, 0x2c, 0x8a, 0xe4, 0x26, 0x5e, 0xec, 0x13, 0xd7, 0xd4, 0x2e, 0x9f, 0x86, 0x12, 0xd7, 0xbc, 0x25, 0x8f, 0x91, 0x3e, 0xcb, 0x5a, 0x3a, 0x5c, 0x61, 0x03, 0x39, 0xb4, 0x9f, 0xb9, 0x0e, 0x90, 0x37, 0xb0, 0x2d, 0x68, 0x4f, 0xc6, 0x0d, 0xa8, 0x35, 0x65, 0x7c, 0xb2, 0x4e, 0xab, 0x35, 0x27, 0x50, 0xc8, 0xb4, 0x63, 0xb1, 0xa8, 0x49, 0x46, 0x60, 0xd3, 0x6c, 0x3a, 0xb2 ],
+const [ 0xaa, 0xc4, 0x25, 0x63, 0x39, 0xf6, 0x37, 0x7a, 0x4f, 0xe2, 0x25, 0xd5, 0x0e, 0x74, 0x42, 0x4c, 0x80, 0xe0, 0xf9, 0x6d, 0x85, 0xd1, 0x62, 0xc4, 0x10, 0xc3, 0x13, 0x5a, 0x93, 0xad, 0x39, 0x7b, 0xb8, 0xe4, 0xe7, 0xbc, 0x52, 0x3c, 0xad, 0x3d, 0x93, 0x70, 0x6d, 0x2c, 0x7f, 0xc4, 0x6a, 0x8a, 0xa0, 0xe8, 0xa2, 0x32, 0xfc, 0x20, 0x5e, 0x17, 0x44, 0xa2, 0x07, 0xcd, 0x4e, 0x3f, 0x3b, 0x4b, 0xc5, 0x46, 0x20, 0xef, 0x20, 0xa6, 0xf8, 0xc2, 0xd0, 0x52, 0xf6, 0xfe, 0xbe, 0xea, 0x50, 0xcd, 0xf4, 0x97, 0x96, 0x54, 0x9a, 0x37, 0x42, 0xf0, 0x25, 0xba, 0x90, 0xbf, 0xcb, 0xcb, 0x90, 0x63, 0x3a, 0xb3, 0x79, 0x02, 0x89, 0x7b, 0x40, 0x91, 0x6f, 0x51, 0x69, 0x53, 0xb3, 0x2e, 0x1e, 0x9c, 0xe3, 0xb5, 0x7e, 0xdb, 0x49, 0x5d, 0x37, 0xd7, 0x1b, 0xd2, 0x57, 0x39, 0xf2, 0x99, 0x5f, 0x4b ],
+const [ 0xea, 0x72, 0x40, 0x52, 0x99, 0x80, 0x07, 0x6d, 0x3b, 0x02, 0x8a, 0x08, 0x3e, 0xbc, 0x4e, 0x24, 0xef, 0xda, 0xa0, 0x6c, 0x9c, 0x84, 0xd7, 0x6b, 0xf5, 0xb2, 0xd9, 0xfd, 0xb8, 0x42, 0xe1, 0x03, 0x8e, 0x48, 0x7f, 0x5b, 0x30, 0xa5, 0xe0, 0x10, 0xcd, 0xdb, 0x4f, 0xcd, 0xb0, 0x1f, 0xfc, 0x98, 0x1e, 0xb0, 0xfc, 0xbc, 0x7d, 0x68, 0x92, 0x07, 0xbc, 0x90, 0xad, 0x36, 0xee, 0xf9, 0xb1, 0xae, 0x38, 0x48, 0x7a, 0x6d, 0xee, 0x92, 0x9f, 0x3f, 0xf9, 0x29, 0xf3, 0x35, 0x7c, 0xb5, 0x52, 0x53, 0xb7, 0x86, 0x9a, 0x89, 0x2b, 0x28, 0xf7, 0xe5, 0xfe, 0x38, 0x64, 0x06, 0xa2, 0x77, 0x6e, 0xd4, 0xb2, 0x1d, 0x3b, 0x6e, 0x1c, 0x70, 0xcc, 0x64, 0x85, 0x94, 0x7f, 0x27, 0xe9, 0xa5, 0xd8, 0xbd, 0x82, 0x03, 0x80, 0xb9, 0xec, 0xed, 0x8e, 0x6b, 0x86, 0x52, 0x06, 0x54, 0x1b, 0xe3, 0x9f, 0xdc ],
+const [ 0x93, 0xb7, 0xef, 0x0e, 0x47, 0x0d, 0xdf, 0xac, 0x6a, 0xef, 0x93, 0xc0, 0xdc, 0xd3, 0x7b, 0x8f, 0x1c, 0x4b, 0xaf, 0x5e, 0xad, 0xd9, 0x78, 0xe3, 0xbf, 0x05, 0x12, 0xfa, 0x0b, 0xae, 0xb0, 0x99, 0xff, 0x9e, 0xc1, 0x06, 0x1b, 0x61, 0x72, 0x47, 0x9b, 0x56, 0x74, 0xdb, 0x56, 0x06, 0xff, 0xa7, 0xe6, 0xb5, 0x17, 0x33, 0x09, 0x37, 0x0e, 0x16, 0x47, 0x05, 0x4a, 0xaf, 0xd5, 0x90, 0x48, 0x16, 0xba, 0xd5, 0xe1, 0x52, 0x30, 0x32, 0xcc, 0xcd, 0x4d, 0x78, 0x65, 0x05, 0xe2, 0x41, 0xac, 0x83, 0xa4, 0x84, 0x91, 0x11, 0x89, 0x66, 0x6f, 0x28, 0x75, 0x53, 0xd6, 0xa8, 0x16, 0x4e, 0x8d, 0xcb, 0x0c, 0x85, 0xd7, 0x5c, 0x4e, 0x29, 0xf6, 0x24, 0xc9, 0x7c, 0xee, 0xa6, 0x4a, 0x2c, 0x8b, 0x0c, 0x9d, 0xdf, 0xa5, 0x60, 0xf7, 0x0f, 0xa3, 0xff, 0x91, 0x18, 0x3e, 0x4b, 0x96, 0x8f, 0x88, 0xa1 ],
+const [ 0x21, 0x06, 0x34, 0x43, 0xbf, 0x02, 0xff, 0xe9, 0xf8, 0x13, 0xdc, 0x66, 0x88, 0x92, 0x0d, 0x03, 0x60, 0x41, 0xa2, 0xa3, 0xa6, 0x3a, 0x99, 0x56, 0xfc, 0x25, 0x4a, 0x2c, 0x05, 0xae, 0x03, 0x47, 0x25, 0x37, 0xef, 0x34, 0x89, 0xc9, 0x3c, 0x7c, 0x68, 0x51, 0x7c, 0x75, 0x88, 0x09, 0x4c, 0x5e, 0x03, 0x34, 0x34, 0xab, 0x4b, 0x0e, 0xcf, 0x9e, 0x6c, 0x03, 0x2c, 0x17, 0x91, 0x1f, 0x73, 0xad, 0xca, 0xc6, 0xcc, 0xfd, 0x0c, 0xa5, 0x7c, 0x42, 0x7a, 0xe8, 0x51, 0x27, 0xe2, 0xad, 0x41, 0xd9, 0x8b, 0xb9, 0x4e, 0x5f, 0x2e, 0x6a, 0xad, 0x2e, 0x42, 0xed, 0x26, 0xf8, 0x7c, 0xb1, 0xbe, 0xc6, 0x97, 0x1c, 0x94, 0x46, 0x51, 0x7c, 0x09, 0x66, 0xb6, 0x40, 0x23, 0x21, 0xa0, 0x68, 0x34, 0x99, 0x7f, 0x3a, 0xb6, 0x67, 0x56, 0x37, 0x7a, 0x2f, 0x06, 0x4d, 0x02, 0x77, 0xcf, 0x4e, 0x2b, 0xb9 ],
+const [ 0x97, 0x24, 0xc0, 0xd5, 0xc9, 0x89, 0xe5, 0xad, 0xaf, 0xcd, 0x75, 0x27, 0xfe, 0xe2, 0x69, 0xea, 0x14, 0xc0, 0xae, 0xc3, 0xdd, 0xb6, 0x25, 0x96, 0xf3, 0xfd, 0xee, 0x9b, 0x09, 0x93, 0xe6, 0xc6, 0x89, 0x46, 0x6e, 0x87, 0x7c, 0x0f, 0x6f, 0xb4, 0xab, 0xa2, 0x9b, 0xc4, 0x03, 0x43, 0xf5, 0x3d, 0x3e, 0xdb, 0x93, 0x6f, 0xc0, 0x4b, 0xa2, 0x63, 0xbf, 0x00, 0xac, 0x0f, 0xa7, 0xc8, 0x16, 0xcb, 0xbd, 0xe4, 0xed, 0x09, 0x02, 0x5e, 0xe2, 0x40, 0x5a, 0x9d, 0x92, 0x29, 0xed, 0x36, 0x0b, 0x2e, 0xce, 0x05, 0x8c, 0x20, 0xdb, 0x7d, 0x8d, 0x28, 0xe4, 0x3c, 0xff, 0x00, 0x0f, 0xe2, 0xd5, 0x62, 0x7a, 0x24, 0xc3, 0xc1, 0x23, 0x1c, 0x46, 0x38, 0x05, 0xe3, 0xe4, 0xc0, 0x84, 0x62, 0xb5, 0xa5, 0x0b, 0x65, 0x22, 0x3b, 0xf4, 0xf1, 0xed, 0xcd, 0xa8, 0xd8, 0x72, 0xd6, 0x07, 0x8a, 0x2c, 0x73 ],
+const [ 0x12, 0x35, 0x3b, 0xca, 0x6b, 0x0f, 0x3d, 0x54, 0x5e, 0xc4, 0xb4, 0x70, 0xc6, 0x92, 0x72, 0xf7, 0x2b, 0xb5, 0x58, 0x97, 0x93, 0xe6, 0xca, 0x76, 0x9a, 0x22, 0x60, 0x18, 0xc5, 0xac, 0xde, 0x83, 0x14, 0x55, 0x67, 0xa1, 0xd6, 0xfb, 0xed, 0xe5, 0xc1, 0x50, 0xec, 0x31, 0x42, 0xdc, 0x58, 0xf8, 0x12, 0x46, 0xd4, 0xa0, 0x0a, 0xcf, 0x24, 0x2a, 0x38, 0x1f, 0xe5, 0x14, 0x32, 0x44, 0x7b, 0x7e, 0xaa, 0xf8, 0x4c, 0x8d, 0x43, 0x22, 0x2c, 0x0d, 0xa3, 0xa0, 0x17, 0x5a, 0xca, 0x44, 0x26, 0x80, 0xa2, 0x1c, 0xbc, 0xa1, 0xd7, 0xf7, 0x00, 0x97, 0xe8, 0x24, 0x91, 0xdb, 0x7f, 0x7d, 0x75, 0xa5, 0xfe, 0xa5, 0x52, 0x55, 0x5a, 0x8d, 0xe0, 0x12, 0x2c, 0x3d, 0x9e, 0xb1, 0x05, 0xd1, 0xc4, 0xd8, 0x02, 0xc1, 0x79, 0x63, 0xa1, 0x66, 0x47, 0x06, 0xd3, 0xba, 0xcc, 0x34, 0x53, 0x60, 0xb2, 0x40 ],
+const [ 0xdf, 0x07, 0x38, 0x17, 0xd8, 0x68, 0x72, 0x93, 0x25, 0x7d, 0x7e, 0xd1, 0x81, 0x68, 0x03, 0xaf, 0xe2, 0x92, 0xd7, 0x79, 0xf3, 0x4e, 0x14, 0xb0, 0xc5, 0xba, 0x6e, 0x0a, 0xc1, 0xe6, 0xc3, 0xb9, 0xe2, 0x39, 0xf4, 0xf0, 0x21, 0x10, 0xf4, 0xa4, 0x30, 0xa7, 0x1e, 0x90, 0x6a, 0x3d, 0xcc, 0x7b, 0x0b, 0x73, 0x25, 0xbd, 0x9c, 0xf6, 0x36, 0x00, 0xb2, 0x5d, 0x45, 0x44, 0xd8, 0x55, 0x61, 0x26, 0xca, 0xfb, 0x3e, 0x61, 0xe4, 0x89, 0x40, 0x95, 0xd9, 0x35, 0xd6, 0x47, 0xa8, 0x56, 0x09, 0x29, 0xcc, 0xc9, 0x55, 0x9c, 0xb3, 0x93, 0xb7, 0x74, 0x72, 0xc7, 0x07, 0xfb, 0xb7, 0xab, 0x88, 0x38, 0xff, 0x16, 0xbe, 0x71, 0x09, 0x1c, 0x7f, 0xee, 0x8a, 0xed, 0x4d, 0x00, 0x22, 0xfb, 0xe3, 0x42, 0x8f, 0x5b, 0x0e, 0x1f, 0x21, 0x6e, 0xbe, 0x94, 0x6d, 0xc0, 0x5d, 0x37, 0x46, 0x30, 0x5f, 0x79 ],
+const [ 0xcd, 0x3f, 0x17, 0x35, 0x5a, 0x1e, 0x25, 0x4b, 0x98, 0x21, 0x27, 0x61, 0x41, 0xa8, 0x50, 0xf0, 0xb7, 0x1c, 0xb3, 0xcf, 0x48, 0x24, 0xa8, 0x03, 0xb0, 0x1c, 0x71, 0xd8, 0xdf, 0xc3, 0x1d, 0x31, 0xfd, 0x33, 0xad, 0x1c, 0xac, 0x17, 0x76, 0xa9, 0x8d, 0x18, 0xc6, 0xfd, 0x05, 0x98, 0xca, 0xa2, 0x41, 0xa3, 0xaf, 0x21, 0x77, 0x22, 0x08, 0xd3, 0x6f, 0x52, 0x70, 0xf4, 0x43, 0x75, 0x70, 0xf9, 0x63, 0xc8, 0xa3, 0x23, 0xdb, 0xb4, 0x17, 0x55, 0xd9, 0x48, 0xf7, 0x23, 0x69, 0xe7, 0x67, 0x2b, 0x84, 0x3e, 0xb0, 0xa8, 0x49, 0x79, 0x9d, 0x44, 0x8a, 0xb7, 0x25, 0x2e, 0x8a, 0xbb, 0x49, 0x6d, 0x05, 0xe4, 0x40, 0x74, 0x71, 0x5f, 0xd2, 0xf6, 0x84, 0x9b, 0x02, 0xfb, 0xf6, 0xfd, 0xef, 0x34, 0x88, 0xd6, 0xfc, 0x8b, 0x45, 0x92, 0x2f, 0xff, 0x08, 0x32, 0xd7, 0xaf, 0x3e, 0xfc, 0x72, 0x34 ],
+const [ 0x93, 0x4d, 0xc1, 0xef, 0x76, 0x99, 0x3a, 0xa8, 0x20, 0x61, 0xcf, 0x67, 0xaa, 0xac, 0x77, 0x14, 0xf1, 0x2e, 0x25, 0xaa, 0x8f, 0x6f, 0x54, 0x84, 0x0a, 0x2a, 0xe3, 0xd8, 0x4a, 0xf3, 0x24, 0x81, 0x51, 0x1d, 0x30, 0x01, 0x26, 0xdb, 0x7d, 0xc6, 0x12, 0xa5, 0xb2, 0xac, 0x0f, 0xde, 0xb9, 0xc4, 0x7e, 0xb3, 0x16, 0x54, 0x18, 0x46, 0x78, 0x1e, 0x27, 0x0c, 0x8e, 0xe5, 0xf6, 0x73, 0x1c, 0x2e, 0x86, 0xc9, 0x4e, 0x44, 0x82, 0x59, 0x4c, 0x7e, 0x75, 0xd7, 0x0e, 0xc4, 0x3b, 0xfe, 0x72, 0x50, 0xb6, 0x77, 0x8c, 0xb2, 0xc2, 0xfd, 0x3d, 0x17, 0x6a, 0xbf, 0x07, 0xca, 0x5c, 0x05, 0x1f, 0xfb, 0x9a, 0x17, 0xc4, 0xc0, 0x73, 0x5b, 0xd0, 0x59, 0xb2, 0xbd, 0x8d, 0xb8, 0x15, 0x53, 0xc9, 0x41, 0x00, 0x41, 0x2d, 0xce, 0x73, 0xdb, 0xca, 0xf6, 0x3a, 0x0a, 0xf5, 0x8f, 0x63, 0xf1, 0x55, 0x71 ],
+const [ 0xc8, 0x43, 0x94, 0x08, 0x64, 0x57, 0xd8, 0xfa, 0x90, 0x0a, 0x57, 0xf1, 0x8e, 0xa5, 0x0a, 0x93, 0xbe, 0x16, 0xf0, 0x6f, 0xc2, 0x8b, 0x55, 0x32, 0xde, 0x40, 0x54, 0x1d, 0xa5, 0x95, 0x9b, 0xb6, 0xd2, 0x64, 0x6e, 0xbe, 0x74, 0x91, 0xef, 0x64, 0x4e, 0xe3, 0x9c, 0xb8, 0x7d, 0x12, 0x19, 0x62, 0x5b, 0x21, 0x30, 0x94, 0xa4, 0xed, 0x16, 0x3d, 0xd7, 0x07, 0xef, 0x80, 0xdf, 0xbf, 0x95, 0x64, 0xf3, 0x81, 0x95, 0xcd, 0xbb, 0x65, 0x7b, 0xab, 0xb4, 0x01, 0x50, 0x71, 0xd5, 0x82, 0x60, 0xc9, 0x73, 0xfb, 0x41, 0x85, 0x62, 0xfc, 0x10, 0xd9, 0x5d, 0x67, 0xfe, 0xc8, 0xa7, 0x7f, 0x0b, 0xdd, 0xf3, 0x42, 0x12, 0x1b, 0x82, 0xf9, 0x06, 0x36, 0x8b, 0x0d, 0x7b, 0x04, 0xdf, 0x1c, 0x68, 0x2e, 0xcd, 0x4c, 0x2b, 0x2b, 0x43, 0xdf, 0xcd, 0x6f, 0x37, 0x08, 0x88, 0xdf, 0x45, 0xfd, 0x86, 0x89 ],
+const [ 0x36, 0xbd, 0xa8, 0xd3, 0x3b, 0x3b, 0xc1, 0x0f, 0x36, 0x7c, 0xaf, 0x71, 0xc5, 0xed, 0x38, 0x7f, 0xe5, 0xf1, 0x49, 0x3c, 0x1d, 0x3b, 0xd2, 0xaa, 0xf9, 0x7a, 0xd7, 0x8c, 0xba, 0x3c, 0xc5, 0x70, 0x4c, 0x0c, 0x02, 0xed, 0x78, 0xde, 0xc7, 0x2a, 0x5b, 0xae, 0x32, 0x9f, 0x17, 0x63, 0x97, 0x20, 0xc8, 0xf9, 0x18, 0x17, 0xba, 0xdf, 0x75, 0x11, 0xd9, 0x9e, 0x25, 0x7c, 0x68, 0xbc, 0xa5, 0xae, 0xf6, 0xe0, 0x10, 0x2a, 0x8e, 0x36, 0xf0, 0x1f, 0x2f, 0x15, 0x53, 0x32, 0x7b, 0xe0, 0x22, 0x7d, 0xb3, 0x2a, 0xaf, 0xd8, 0xe3, 0x1d, 0x8d, 0x57, 0x5a, 0x1c, 0xa4, 0x14, 0x5d, 0xa7, 0x84, 0x2e, 0x1d, 0x7f, 0xfa, 0x11, 0xe6, 0x0b, 0xe1, 0xf8, 0x98, 0xfb, 0x3b, 0xb1, 0x5b, 0x2b, 0x81, 0xa0, 0x8f, 0xca, 0x37, 0x07, 0x02, 0xbb, 0xc2, 0x85, 0x66, 0x3b, 0x7e, 0xdc, 0x02, 0xc5, 0x0c, 0xf7 ],
+const [ 0x37, 0x22, 0xea, 0xa4, 0x33, 0x83, 0x0a, 0xbd, 0xbc, 0xaa, 0x91, 0x77, 0xe3, 0x73, 0xba, 0xb0, 0x5f, 0xcb, 0x8f, 0xd8, 0x2f, 0xc3, 0xaf, 0xa5, 0x81, 0xe3, 0x4f, 0x08, 0xd3, 0xc0, 0x7f, 0x5f, 0x58, 0xd0, 0xae, 0xec, 0x9d, 0x7e, 0x71, 0x86, 0x6c, 0x7a, 0x80, 0x8e, 0xf1, 0x53, 0x01, 0x25, 0x1b, 0x47, 0x0a, 0x9c, 0x45, 0x5a, 0x61, 0x2c, 0x16, 0xa5, 0x86, 0xe8, 0xa5, 0xf1, 0xf3, 0xef, 0xe1, 0x84, 0xa2, 0xe6, 0x31, 0x3b, 0xd0, 0xa6, 0x57, 0xd9, 0x01, 0x31, 0x9a, 0x9f, 0x44, 0xeb, 0x24, 0x1d, 0xb8, 0x07, 0xa9, 0x47, 0x4f, 0x3f, 0x49, 0xcb, 0xd2, 0xc8, 0xb8, 0xa2, 0x25, 0x85, 0x9c, 0xe5, 0xcd, 0x7b, 0x36, 0xe3, 0xaf, 0x85, 0x45, 0x70, 0x1a, 0x48, 0x27, 0x80, 0x08, 0x6a, 0x42, 0xf4, 0xa1, 0xff, 0xa2, 0xb3, 0x01, 0x44, 0xe3, 0xfd, 0x3b, 0x90, 0x52, 0xfc, 0x9e, 0x87 ],
+const [ 0x03, 0x07, 0x4e, 0x71, 0x4d, 0x5e, 0xef, 0xdf, 0x5b, 0x71, 0x43, 0x81, 0xd8, 0x0e, 0x69, 0x4e, 0xf3, 0x7c, 0x26, 0x47, 0xb3, 0x74, 0xd8, 0xa3, 0x8a, 0x6d, 0xac, 0x2a, 0x2e, 0x1d, 0x11, 0xdf, 0xa4, 0x3c, 0x6d, 0xe1, 0x9d, 0x8b, 0x0e, 0x93, 0x06, 0x15, 0x63, 0xfb, 0xdb, 0xb4, 0x6c, 0x68, 0x3c, 0xd8, 0x6f, 0x58, 0xc2, 0x84, 0xed, 0x98, 0x13, 0x99, 0xd4, 0xad, 0xb4, 0x57, 0xf6, 0x73, 0x1f, 0x21, 0xba, 0x04, 0x16, 0x80, 0x11, 0xdb, 0x36, 0x6b, 0xac, 0x3a, 0xcf, 0xc6, 0x6d, 0xc8, 0xf3, 0x28, 0x1b, 0x7f, 0xcd, 0xe1, 0x59, 0xc5, 0x34, 0x3c, 0xd9, 0xd9, 0x80, 0x01, 0xcd, 0x71, 0x9d, 0x3e, 0x9e, 0xa2, 0x5e, 0x47, 0xe1, 0xff, 0x13, 0xfc, 0x87, 0x05, 0x5d, 0x4a, 0x53, 0xb7, 0x41, 0xf5, 0x92, 0x85, 0x7c, 0x94, 0x06, 0x72, 0x16, 0xdd, 0x23, 0x76, 0x3a, 0x22, 0x7e, 0x21 ],
+const [ 0x73, 0x9f, 0x46, 0x00, 0x34, 0x24, 0x9e, 0x80, 0x5a, 0xff, 0x66, 0x5d, 0x62, 0x48, 0xa5, 0x94, 0x25, 0x06, 0x95, 0x83, 0x5a, 0xa2, 0x4c, 0xfa, 0x5d, 0x9c, 0x9b, 0x96, 0x2f, 0x7d, 0x37, 0x4a, 0xbd, 0x0d, 0x16, 0x3f, 0x65, 0xc5, 0x1c, 0xde, 0xb6, 0x87, 0xf7, 0x2b, 0x77, 0x8d, 0x48, 0x54, 0xeb, 0xa0, 0x03, 0x89, 0x54, 0x8a, 0x18, 0x0f, 0xb6, 0xcd, 0x53, 0x90, 0xdd, 0x95, 0x80, 0xb6, 0xa1, 0xec, 0xd4, 0xf8, 0x69, 0x2d, 0x88, 0xb3, 0xee, 0xbb, 0xc7, 0x7c, 0x42, 0xf2, 0xca, 0xb5, 0x10, 0x5e, 0x42, 0x5e, 0x25, 0x2b, 0xf6, 0x2e, 0x2f, 0xdd, 0xad, 0xe2, 0xc5, 0x42, 0x4e, 0xd6, 0xa8, 0xa4, 0x46, 0xd2, 0x49, 0x42, 0x2a, 0x26, 0x8b, 0x02, 0x9d, 0xf9, 0xc9, 0x60, 0x75, 0xde, 0x1b, 0xaa, 0x19, 0xa8, 0xd5, 0x6f, 0x2d, 0x80, 0x51, 0x35, 0x72, 0x34, 0xef, 0x6a, 0xe7, 0xd2 ],
+const [ 0x08, 0x2e, 0x7b, 0x4c, 0xde, 0x89, 0x14, 0xbf, 0x07, 0xc2, 0x88, 0x44, 0x1b, 0xe6, 0x43, 0xe4, 0x08, 0xf6, 0xcb, 0x5c, 0xa9, 0x32, 0xf6, 0x7e, 0x9b, 0x97, 0x5b, 0xd5, 0x4c, 0xa7, 0x06, 0x88, 0x54, 0x68, 0x70, 0x80, 0x09, 0xaf, 0xae, 0xcd, 0x4d, 0x9e, 0xe8, 0x46, 0xab, 0x6c, 0x0d, 0x70, 0xa3, 0x64, 0xc5, 0xa2, 0x41, 0x31, 0xa7, 0x66, 0xf5, 0x58, 0xad, 0x21, 0x9e, 0x06, 0xe4, 0xf7, 0xe8, 0x0c, 0x68, 0xe9, 0xd8, 0x28, 0x90, 0x40, 0xa5, 0x86, 0x66, 0x2f, 0xca, 0x86, 0x5a, 0xb4, 0x59, 0xc0, 0x37, 0xbf, 0x92, 0x46, 0x55, 0x96, 0xb4, 0x28, 0x11, 0x78, 0x13, 0x3e, 0x7a, 0x80, 0x6b, 0x21, 0x4d, 0xcd, 0x74, 0x7b, 0x24, 0xe0, 0xb6, 0x81, 0xea, 0x45, 0x9f, 0xbd, 0x92, 0x76, 0xd3, 0x11, 0x08, 0xfc, 0xc3, 0xf9, 0x68, 0xd7, 0x81, 0x10, 0x6f, 0x20, 0xd3, 0xd6, 0x2f, 0xed ],
+const [ 0x89, 0x25, 0x25, 0xa0, 0xf0, 0x2a, 0xae, 0x7f, 0x22, 0x64, 0xcb, 0x02, 0x46, 0x32, 0xf1, 0x1e, 0x8a, 0xdb, 0xdb, 0xec, 0xb7, 0xd0, 0xc7, 0x08, 0x08, 0x32, 0xe2, 0x37, 0x3c, 0x94, 0x01, 0x4c, 0xea, 0x02, 0x91, 0x4c, 0x15, 0x42, 0xd1, 0xd0, 0x00, 0x59, 0x3f, 0xab, 0x43, 0x52, 0x4f, 0xcd, 0x1f, 0x3a, 0x63, 0x67, 0x0f, 0x6f, 0xf8, 0x50, 0x9f, 0x1b, 0x1d, 0xa8, 0x81, 0xfb, 0x2a, 0xbb, 0xde, 0x65, 0xae, 0x27, 0xea, 0x89, 0xa9, 0x42, 0xbb, 0xf7, 0xfc, 0xb6, 0x5b, 0x61, 0x1d, 0x6e, 0x1c, 0xa2, 0x0f, 0xb6, 0x2b, 0x00, 0x92, 0x9d, 0x68, 0xae, 0x97, 0x9e, 0x75, 0x95, 0xf6, 0x80, 0x0d, 0x55, 0x63, 0x7b, 0x98, 0x86, 0x9f, 0x9c, 0xfc, 0x43, 0xeb, 0x6b, 0xb5, 0xe9, 0xc2, 0xca, 0x28, 0x1c, 0xc7, 0x20, 0x34, 0x0b, 0xfd, 0xb7, 0x0b, 0xf5, 0x36, 0x63, 0x40, 0xed, 0xce, 0x65 ],
+const [ 0x8b, 0x7f, 0xdf, 0x79, 0x2a, 0x90, 0x21, 0x8f, 0x91, 0x99, 0x8b, 0x08, 0x47, 0x56, 0xf3, 0x2f, 0xf8, 0x14, 0x88, 0x46, 0x6b, 0xcd, 0x66, 0xce, 0xb4, 0x95, 0x67, 0x02, 0xab, 0x34, 0x3c, 0xa5, 0x9c, 0x15, 0xbd, 0xfd, 0x40, 0x5f, 0x7e, 0x20, 0xec, 0x61, 0xa3, 0x6e, 0x09, 0x33, 0xf5, 0x5f, 0xc4, 0x9a, 0x35, 0x7f, 0x06, 0x2d, 0xb0, 0xb6, 0xa7, 0xb6, 0x13, 0xcd, 0xdf, 0xdb, 0x81, 0x2e, 0xfd, 0xfe, 0xe3, 0xeb, 0x5b, 0x61, 0x7f, 0x02, 0x91, 0x8e, 0xcd, 0xe0, 0xe9, 0xf6, 0x85, 0x23, 0x13, 0xd8, 0xfd, 0xa4, 0x1a, 0x64, 0xb2, 0xb5, 0x97, 0x21, 0x24, 0xa7, 0x25, 0x8c, 0xe8, 0x90, 0x14, 0x02, 0xf8, 0x4a, 0x62, 0xdf, 0x4d, 0xbf, 0xe6, 0xe8, 0xb0, 0x64, 0xcf, 0xe6, 0xcd, 0x04, 0x4d, 0x94, 0x89, 0xbf, 0x8e, 0xbb, 0x95, 0x52, 0xec, 0x9c, 0x43, 0x99, 0x65, 0x8e, 0x99, 0x52 ],
+const [ 0x6e, 0x4a, 0xbd, 0x41, 0x4d, 0xca, 0x21, 0xa6, 0xad, 0x43, 0x31, 0x46, 0x98, 0x62, 0x73, 0xe2, 0xda, 0x95, 0x2e, 0xf6, 0x13, 0xcd, 0x1f, 0x9a, 0x0a, 0x83, 0x6c, 0xa6, 0x44, 0xf9, 0xde, 0x19, 0xd6, 0xc2, 0x4a, 0xbc, 0x77, 0x84, 0x50, 0x02, 0xd9, 0xfd, 0x48, 0x33, 0x3a, 0x44, 0x7a, 0xc9, 0x36, 0x51, 0x8d, 0x1b, 0xdf, 0xc0, 0x43, 0x38, 0x0f, 0xd2, 0x63, 0x16, 0xfd, 0xb5, 0xf6, 0xec, 0x0f, 0x05, 0xb5, 0xdc, 0xef, 0x92, 0xc3, 0xd5, 0xe1, 0x64, 0x98, 0xb8, 0x54, 0xfc, 0x3d, 0xb9, 0xb6, 0xdd, 0xbf, 0x09, 0x8d, 0x4b, 0xde, 0xb2, 0xc4, 0x53, 0x05, 0xc2, 0x42, 0x0b, 0x7f, 0xab, 0xc2, 0x1b, 0xe7, 0xea, 0xde, 0x7c, 0xe0, 0xe7, 0x6c, 0x80, 0x07, 0x1c, 0x0e, 0x13, 0x26, 0x7a, 0x05, 0x40, 0xab, 0x08, 0x46, 0xf7, 0x58, 0xce, 0xd0, 0x0d, 0x3b, 0xf1, 0x3c, 0x84, 0xe1, 0x1f ],
+const [ 0xb6, 0xac, 0xbe, 0x5d, 0xf0, 0x14, 0x80, 0x61, 0x41, 0x43, 0xc9, 0x47, 0x90, 0x97, 0x4c, 0x82, 0xd0, 0x46, 0x35, 0x21, 0x24, 0xf5, 0x6a, 0x02, 0x46, 0x86, 0x10, 0x42, 0x29, 0x31, 0x52, 0xf7, 0xdd, 0xd6, 0x5d, 0x22, 0xb4, 0x91, 0xaf, 0xdf, 0xa3, 0x90, 0x92, 0xdf, 0xea, 0x21, 0xe3, 0x18, 0xf7, 0x0f, 0x18, 0xbb, 0x88, 0x2f, 0x82, 0x67, 0x11, 0x36, 0xce, 0x9c, 0x5d, 0xcd, 0xd2, 0x72, 0x77, 0xe8, 0x87, 0x8b, 0xcb, 0x53, 0x51, 0x46, 0x89, 0x8d, 0x87, 0x35, 0x4a, 0xda, 0x2f, 0xd2, 0xf6, 0x94, 0x09, 0x6d, 0xe5, 0xc2, 0xd0, 0x69, 0x44, 0xec, 0xbc, 0xa8, 0xbb, 0x2d, 0x4b, 0x44, 0x4c, 0x89, 0x41, 0x80, 0x7f, 0x81, 0xed, 0xfe, 0xbc, 0xe5, 0xaf, 0x32, 0xf8, 0xea, 0xb7, 0x16, 0x94, 0x7c, 0x0f, 0x1f, 0x81, 0xd5, 0xdc, 0x70, 0xa9, 0x4f, 0xe1, 0x4f, 0x8a, 0x76, 0x44, 0xd5 ],
+const [ 0xdc, 0x05, 0x8f, 0x90, 0x9e, 0x71, 0x70, 0xbe, 0xe5, 0x6c, 0x4d, 0xfd, 0xe8, 0x62, 0xb4, 0x31, 0x4f, 0x68, 0x31, 0x4a, 0x97, 0x17, 0xcc, 0xbb, 0xb7, 0x9b, 0xd4, 0x2d, 0x04, 0x07, 0xdb, 0x75, 0x52, 0xeb, 0x02, 0xc4, 0x5c, 0x29, 0x77, 0x1e, 0x66, 0x04, 0x3b, 0x0e, 0x20, 0x7a, 0x29, 0x97, 0xce, 0xd4, 0x34, 0x6d, 0xa6, 0x7b, 0xf0, 0x66, 0x79, 0x0d, 0x54, 0x2b, 0x96, 0xb0, 0xbe, 0x33, 0xec, 0xa7, 0x37, 0xf2, 0x6e, 0x23, 0xf8, 0x4d, 0xbc, 0x5b, 0x2e, 0x52, 0xff, 0xde, 0xfb, 0x26, 0x14, 0x28, 0xbd, 0x3e, 0xee, 0x74, 0x92, 0xd2, 0x35, 0xd2, 0x1c, 0x8f, 0x33, 0x79, 0x81, 0x8d, 0xf1, 0x5e, 0xb6, 0x80, 0x9d, 0x06, 0xfe, 0x32, 0x2f, 0x98, 0xad, 0x31, 0x4d, 0x36, 0x32, 0xc4, 0x6b, 0x8d, 0x54, 0x24, 0x36, 0xab, 0xbc, 0xe9, 0x33, 0x11, 0xb4, 0xc3, 0xa3, 0x0a, 0x2e, 0x6a ],
+const [ 0x48, 0xca, 0x2f, 0xb5, 0xb7, 0xe4, 0xf4, 0x71, 0xa2, 0x09, 0x11, 0xaf, 0x6a, 0x66, 0x15, 0x8e, 0x45, 0xae, 0xf7, 0x00, 0xec, 0x02, 0x62, 0xce, 0x94, 0x13, 0x50, 0xdc, 0x20, 0x8a, 0xda, 0xaf, 0x95, 0xa8, 0x4e, 0x2c, 0xce, 0x29, 0x83, 0xa2, 0x71, 0x6f, 0x69, 0x0b, 0x21, 0xdc, 0xe4, 0x8f, 0xf5, 0x80, 0xdb, 0x4a, 0x29, 0xf4, 0x8c, 0x4f, 0x14, 0x85, 0x22, 0xed, 0x5a, 0x95, 0x89, 0x31, 0x63, 0x3f, 0x81, 0xab, 0x0c, 0x3a, 0xf1, 0x75, 0x9c, 0x00, 0x7e, 0x72, 0xf9, 0x2f, 0x5d, 0xd4, 0x1c, 0x2f, 0x65, 0xe1, 0xc2, 0x15, 0x69, 0xf6, 0x64, 0xc7, 0xc4, 0xcc, 0x6a, 0x61, 0x35, 0xfa, 0x9c, 0xd8, 0xee, 0xbb, 0xd9, 0xde, 0xe7, 0xf2, 0x0b, 0x05, 0x78, 0x6b, 0x5a, 0x26, 0x27, 0x64, 0xa0, 0x04, 0xbf, 0x4c, 0x1d, 0x2d, 0xa2, 0xca, 0x6d, 0x21, 0x5f, 0x01, 0xb6, 0xb6, 0x87, 0x13 ],
+const [ 0x7e, 0x8b, 0xcb, 0x42, 0xe9, 0xc0, 0x01, 0x5e, 0x96, 0xf4, 0xf8, 0x02, 0x52, 0x0a, 0x15, 0xcc, 0xcf, 0x3f, 0xb2, 0x80, 0x54, 0x0e, 0x71, 0x08, 0xb2, 0x51, 0xcf, 0xb9, 0x7a, 0xa8, 0xfc, 0xd8, 0x6d, 0x1e, 0xea, 0x5d, 0x34, 0x0a, 0xa3, 0xf6, 0x52, 0x34, 0xe1, 0x4f, 0x56, 0x39, 0xd8, 0x91, 0x55, 0x31, 0x57, 0x29, 0x97, 0x8e, 0x0f, 0xca, 0x91, 0x47, 0x32, 0xb5, 0x13, 0x37, 0x41, 0x38, 0xc3, 0xc0, 0x1f, 0x74, 0xca, 0xb3, 0x69, 0x64, 0xcd, 0x74, 0x0a, 0x1b, 0x1f, 0x59, 0x09, 0x4d, 0x35, 0x54, 0xa6, 0x11, 0x5a, 0xd2, 0xa6, 0xe5, 0xa3, 0xe2, 0xeb, 0xf3, 0x26, 0x9a, 0x47, 0x93, 0x67, 0xb6, 0x92, 0x10, 0x13, 0x83, 0xfa, 0xaf, 0xf1, 0xfc, 0x9b, 0xed, 0x15, 0x32, 0x50, 0x09, 0x57, 0xf1, 0xc8, 0xc2, 0x03, 0xa0, 0xdc, 0x62, 0xd2, 0x69, 0x1f, 0xfb, 0x19, 0x9a, 0xb7, 0xf1 ],
+const [ 0x7d, 0x70, 0xd5, 0xd8, 0x67, 0x65, 0x18, 0xe8, 0xf4, 0xcc, 0xfb, 0x36, 0x60, 0xbf, 0xc1, 0x4e, 0x20, 0xae, 0xa6, 0xc7, 0x75, 0xa6, 0x16, 0xb3, 0x42, 0xd2, 0x1d, 0x3a, 0x1b, 0x42, 0x1f, 0x81, 0x9e, 0xeb, 0xc9, 0xd1, 0x06, 0xef, 0x47, 0xf5, 0xfd, 0x1f, 0xb7, 0xe3, 0xb2, 0xbe, 0xde, 0x9f, 0x2c, 0x88, 0x1a, 0x5d, 0xde, 0xf3, 0x98, 0xe6, 0x7b, 0xb5, 0xc7, 0x3c, 0x0b, 0x86, 0x0d, 0x81, 0x3f, 0x27, 0xb8, 0x15, 0x01, 0xa3, 0x37, 0xff, 0x50, 0xd5, 0x8a, 0x8e, 0x4b, 0x2a, 0xf7, 0x3f, 0x8b, 0xa9, 0xff, 0xe2, 0xb6, 0x30, 0x90, 0xf9, 0x51, 0x00, 0x7c, 0x61, 0xd6, 0x7b, 0x2a, 0x34, 0x07, 0x2d, 0x8c, 0xed, 0x81, 0x0a, 0x50, 0xcd, 0x94, 0xf6, 0x5b, 0x7e, 0x52, 0x8b, 0x73, 0xf7, 0xe6, 0x16, 0x3b, 0x9f, 0x28, 0xe2, 0x65, 0xb5, 0x6e, 0xba, 0x23, 0xef, 0xa4, 0xa9, 0xde, 0x61 ],
+const [ 0x20, 0xa0, 0xf8, 0x52, 0x50, 0xa9, 0x56, 0x15, 0xb7, 0xa4, 0x0f, 0x25, 0x13, 0x2a, 0xf0, 0x70, 0xaa, 0x38, 0x8d, 0x86, 0xdf, 0x77, 0x7b, 0xfb, 0x03, 0xc0, 0xbf, 0x0d, 0x6d, 0xdf, 0x87, 0x87, 0xcd, 0x97, 0x18, 0xe6, 0xbd, 0xe7, 0x08, 0xb9, 0x99, 0x8c, 0xad, 0x4e, 0x91, 0xc7, 0xd5, 0x8a, 0xfc, 0x60, 0xb7, 0x19, 0xef, 0xeb, 0x2a, 0xc8, 0x0f, 0x4a, 0x15, 0x2e, 0xa3, 0x73, 0x27, 0x92, 0xee, 0x74, 0xc8, 0x09, 0xbb, 0xb4, 0x4f, 0xdf, 0x39, 0x7b, 0x75, 0x38, 0x09, 0xb4, 0x09, 0xf7, 0x96, 0xf2, 0xe6, 0xdf, 0xa5, 0xb2, 0x23, 0xf8, 0x2d, 0xe0, 0x89, 0x35, 0x68, 0x9c, 0x4a, 0x53, 0x2a, 0x3d, 0xef, 0x04, 0x72, 0x96, 0x93, 0x4d, 0x3e, 0x79, 0x4f, 0x2d, 0xa4, 0x7a, 0xf5, 0x7f, 0x1f, 0xf5, 0x01, 0x21, 0x27, 0x53, 0xcc, 0x56, 0x04, 0x88, 0x03, 0x69, 0xe3, 0xe0, 0x58, 0x94 ],
+const [ 0xe3, 0x7e, 0x9d, 0xa1, 0xdd, 0xfe, 0x11, 0xa2, 0xff, 0x6a, 0x95, 0x02, 0x5d, 0x19, 0x70, 0xfa, 0x1c, 0x29, 0x97, 0xbb, 0x79, 0x74, 0xd0, 0x01, 0x0c, 0xc0, 0x17, 0xec, 0x4e, 0x36, 0x41, 0x0c, 0x5a, 0x16, 0xdf, 0xba, 0xf0, 0xa8, 0x65, 0xaf, 0xbf, 0x76, 0x8c, 0xcf, 0xe4, 0xb8, 0xf4, 0x46, 0xae, 0x10, 0x0e, 0xd6, 0xa4, 0x77, 0x39, 0x6f, 0xc9, 0x77, 0x2b, 0x01, 0x1e, 0x9c, 0x93, 0x8e, 0x69, 0x25, 0xfc, 0x83, 0x35, 0xfe, 0xf5, 0x48, 0x1a, 0xf3, 0x6f, 0x16, 0x3e, 0x1e, 0x66, 0x09, 0x1c, 0xa1, 0xc4, 0x76, 0x84, 0x9b, 0x82, 0x7e, 0xe3, 0x54, 0x10, 0xe3, 0xc5, 0xbb, 0xf7, 0x1b, 0x98, 0x13, 0xbd, 0xa3, 0xb3, 0xe9, 0x08, 0x96, 0x97, 0x49, 0x07, 0x7e, 0x74, 0x31, 0x0e, 0x6a, 0xef, 0x46, 0x80, 0x41, 0x22, 0xc6, 0xf2, 0x55, 0xe4, 0xbe, 0x8d, 0x3b, 0x4b, 0x7d, 0xb4, 0xdb ],
+const [ 0x4b, 0x7a, 0xb7, 0x13, 0x76, 0xd8, 0x3e, 0xdc, 0x41, 0x49, 0xb7, 0x4a, 0xb1, 0x0b, 0x7c, 0x1b, 0x1b, 0x6f, 0xa9, 0xce, 0x97, 0x7f, 0x2d, 0x63, 0xb2, 0xe3, 0x21, 0x62, 0x63, 0x06, 0x59, 0x1e, 0x41, 0x74, 0x39, 0x3b, 0xf2, 0x87, 0xca, 0x6e, 0xe7, 0x42, 0x0d, 0x84, 0x46, 0x7d, 0x90, 0xa6, 0x28, 0x42, 0x3e, 0xdb, 0x05, 0x78, 0x7b, 0xce, 0x6c, 0xbe, 0x71, 0xd2, 0xf8, 0x9a, 0xa4, 0x23, 0x7f, 0xd3, 0xcd, 0x6e, 0x8c, 0x1b, 0xe5, 0x94, 0x10, 0xf1, 0x80, 0xac, 0x54, 0xc6, 0x5c, 0x47, 0x32, 0x5f, 0x3a, 0xf7, 0x85, 0x7a, 0xec, 0x12, 0xde, 0xb4, 0xb0, 0xb3, 0x79, 0xaa, 0xbc, 0x02, 0x6f, 0x5f, 0x1a, 0xb5, 0x2c, 0xde, 0xb6, 0xd7, 0x24, 0x20, 0xb6, 0xc8, 0xc2, 0x2f, 0x09, 0x86, 0xa1, 0x8c, 0x43, 0x2a, 0xff, 0xce, 0xa8, 0xb6, 0x6f, 0x8d, 0x86, 0x0d, 0xcd, 0x7e, 0xc9, 0x43 ],
+const [ 0x80, 0x6e, 0x91, 0x11, 0xc7, 0x31, 0xbe, 0x67, 0x70, 0x7d, 0x49, 0xb9, 0xe4, 0x24, 0x8e, 0x82, 0x03, 0x96, 0x08, 0xdf, 0xc6, 0xfa, 0x16, 0x45, 0x22, 0x7e, 0xff, 0x6f, 0x30, 0xeb, 0x34, 0x9b, 0x8c, 0x7c, 0xd6, 0xf6, 0xfb, 0xf0, 0x78, 0x55, 0x50, 0xde, 0x26, 0x25, 0x90, 0x49, 0xa6, 0xa5, 0x54, 0x74, 0xfd, 0x53, 0x6f, 0xf7, 0x36, 0xa3, 0xd1, 0x13, 0x5e, 0xf7, 0xab, 0x43, 0xd3, 0xcc, 0xd4, 0x13, 0xbf, 0x31, 0x6c, 0x35, 0xdf, 0x7e, 0xbf, 0xd2, 0x89, 0x42, 0x6b, 0x1e, 0xed, 0x7d, 0xc6, 0x2f, 0x9b, 0x10, 0x7a, 0x0f, 0x45, 0x71, 0x72, 0x10, 0xc6, 0xa3, 0xfa, 0x5f, 0x64, 0x66, 0x21, 0xdc, 0x52, 0xab, 0x62, 0x29, 0x79, 0x4a, 0x84, 0x01, 0x79, 0xf7, 0xbf, 0xcc, 0xea, 0x73, 0x20, 0x70, 0xe7, 0xff, 0x2f, 0x69, 0xcd, 0x16, 0xce, 0x1c, 0x40, 0x5b, 0x64, 0x68, 0x6f, 0xd1 ],
+const [ 0x85, 0xa4, 0x38, 0x18, 0x52, 0x05, 0xf7, 0x73, 0xb7, 0xb3, 0x9d, 0xb2, 0xa7, 0x1e, 0xe8, 0x6a, 0xee, 0x34, 0x1f, 0x9b, 0x22, 0x85, 0xa2, 0xed, 0xd7, 0xa5, 0xc5, 0x39, 0x13, 0xd2, 0xde, 0x4b, 0x02, 0xd7, 0x9d, 0xe7, 0xea, 0x30, 0x9c, 0x09, 0x60, 0x6f, 0x37, 0x71, 0xbd, 0xdf, 0x9e, 0x5f, 0xcc, 0x66, 0x28, 0x9c, 0xc5, 0xb0, 0xeb, 0xb9, 0x7f, 0x89, 0x89, 0x9b, 0xe1, 0x8b, 0x4c, 0x38, 0x9a, 0xfa, 0x76, 0x9b, 0x11, 0xec, 0xd2, 0x2e, 0x9f, 0xad, 0x8f, 0x38, 0xfd, 0x61, 0x4e, 0xa5, 0xf8, 0xeb, 0x7a, 0x06, 0x6c, 0x0e, 0xd8, 0xd8, 0x6f, 0xd2, 0x5f, 0x09, 0xcd, 0x2a, 0x49, 0xb8, 0xb5, 0xd3, 0x6a, 0x3d, 0xb1, 0x7f, 0xc1, 0x69, 0xdb, 0x33, 0x4d, 0x0e, 0x4f, 0xee, 0x21, 0xc2, 0xdc, 0x8b, 0xbb, 0xe1, 0xff, 0xe8, 0x92, 0xd1, 0x11, 0x48, 0xee, 0x8a, 0xbf, 0xf6, 0xfc, 0x55 ],
+const [ 0x18, 0x91, 0x5f, 0x38, 0x11, 0xcc, 0x77, 0xd3, 0xd9, 0xe4, 0x1d, 0x54, 0x3f, 0x3b, 0xbd, 0xc8, 0x27, 0xf5, 0x78, 0x1c, 0xdd, 0xff, 0x19, 0x3d, 0xa9, 0x4f, 0x4b, 0x7d, 0xa4, 0x6d, 0x0a, 0x39, 0xc9, 0x32, 0x58, 0xb8, 0x4f, 0xcf, 0x31, 0x57, 0x37, 0x12, 0xc0, 0xe3, 0x21, 0xe5, 0xd3, 0x47, 0x63, 0x18, 0x8d, 0x67, 0x5c, 0x60, 0x5a, 0x4b, 0x06, 0x9f, 0x28, 0x80, 0xcb, 0x65, 0xd5, 0xbb, 0x9a, 0xb7, 0xe3, 0xc0, 0x39, 0x10, 0x73, 0x82, 0xdd, 0xa6, 0x71, 0x8c, 0xf8, 0xee, 0x0c, 0x9f, 0x52, 0x62, 0x69, 0x9d, 0x5b, 0x82, 0x98, 0xa5, 0xc0, 0x19, 0xc7, 0x80, 0x3c, 0xc1, 0xb5, 0x3c, 0xb1, 0xa9, 0x6a, 0x16, 0x77, 0x96, 0x26, 0x9e, 0xf3, 0x28, 0x97, 0x15, 0x6c, 0x5f, 0x4e, 0x1a, 0x1b, 0x5d, 0x74, 0x86, 0x81, 0x6e, 0xb9, 0x94, 0xfe, 0x45, 0x8e, 0x45, 0x9e, 0x89, 0x94, 0x02 ],
+const [ 0x48, 0xdd, 0x90, 0x54, 0xdc, 0x77, 0x03, 0x79, 0x35, 0x57, 0xe4, 0x92, 0xfc, 0x0f, 0xd0, 0xd4, 0x5d, 0xb0, 0xde, 0x0e, 0xc4, 0x86, 0x83, 0xf1, 0xe4, 0x02, 0xb3, 0xaf, 0xfe, 0xf8, 0x49, 0xc9, 0x60, 0x0b, 0xa9, 0x21, 0x2c, 0x65, 0xa4, 0x57, 0x5a, 0xab, 0x9c, 0x52, 0x00, 0x2f, 0xe8, 0x1d, 0xd1, 0x68, 0x79, 0xf5, 0xe4, 0xa0, 0xbe, 0xa0, 0xb8, 0xed, 0xc6, 0x00, 0x74, 0x62, 0xa5, 0xe7, 0x73, 0x86, 0x18, 0x2d, 0xff, 0x05, 0x6c, 0x00, 0x5d, 0xa6, 0x9b, 0x7c, 0x0b, 0x7d, 0xb9, 0x7b, 0x45, 0x62, 0x8e, 0xaf, 0xcd, 0xa2, 0x85, 0xee, 0xec, 0xf4, 0xc5, 0xcc, 0xb4, 0xae, 0x9d, 0x6f, 0x89, 0x38, 0x25, 0x9f, 0xe0, 0xc1, 0x22, 0x1d, 0x45, 0x32, 0x2b, 0x36, 0xa3, 0x60, 0x0a, 0x97, 0xc0, 0x86, 0x65, 0x63, 0x07, 0xf2, 0x9e, 0x83, 0x8a, 0xfe, 0xf7, 0x3e, 0x47, 0x42, 0xfa, 0x09 ],
+const [ 0x39, 0x78, 0xb2, 0x4f, 0x0b, 0xd0, 0x82, 0x9e, 0x22, 0xc0, 0x59, 0x66, 0x27, 0xd9, 0xd6, 0xd8, 0x58, 0xf1, 0xc6, 0x9b, 0x8c, 0x19, 0x48, 0x67, 0x71, 0xcf, 0x30, 0xd0, 0x19, 0x75, 0xaa, 0x5f, 0xb5, 0x02, 0x20, 0xe7, 0xa0, 0xf8, 0x5d, 0x16, 0x9f, 0x96, 0xf2, 0x4b, 0x67, 0x4e, 0xd8, 0xa7, 0x5f, 0x79, 0x58, 0x67, 0xa8, 0x4a, 0x28, 0x71, 0x5b, 0x00, 0xd7, 0x2c, 0x11, 0x60, 0x6a, 0x95, 0xa9, 0x63, 0x48, 0x90, 0x45, 0x2c, 0x53, 0x7b, 0x96, 0x3c, 0x58, 0x09, 0x5a, 0xe9, 0xa9, 0x4e, 0x22, 0x0c, 0x08, 0x16, 0x59, 0xfb, 0xc7, 0x7b, 0x82, 0xb7, 0x2e, 0xb7, 0xc1, 0x66, 0x1d, 0x36, 0x9d, 0x03, 0xf2, 0xf0, 0x04, 0x54, 0xad, 0xf5, 0x8f, 0x1c, 0x53, 0x49, 0x08, 0x93, 0x90, 0xf3, 0x2a, 0x13, 0x9f, 0x51, 0xa7, 0x14, 0x6f, 0xae, 0x70, 0x5a, 0xfe, 0x16, 0x30, 0x6d, 0x09, 0x69 ],
+const [ 0x67, 0x54, 0x1f, 0x77, 0xf4, 0xe4, 0x0d, 0x14, 0x30, 0x35, 0x46, 0x25, 0x05, 0xde, 0x14, 0xa0, 0x21, 0x24, 0xb9, 0x92, 0xec, 0x1d, 0x00, 0x64, 0xbd, 0x15, 0x18, 0x5d, 0x4d, 0x30, 0xa2, 0x69, 0x6c, 0x51, 0x09, 0x19, 0xf2, 0x3b, 0x12, 0xea, 0xf9, 0xf6, 0xb4, 0xca, 0x49, 0x75, 0x29, 0xd8, 0x14, 0x75, 0x45, 0x6c, 0xe4, 0xa8, 0x07, 0x57, 0xd1, 0x13, 0x6e, 0x6c, 0xf7, 0xb4, 0x8d, 0x3f, 0x27, 0x69, 0xe2, 0x2c, 0xdd, 0x0d, 0xe4, 0x9b, 0x72, 0xe4, 0xdb, 0x83, 0x93, 0x39, 0xf4, 0x2d, 0xf2, 0x45, 0x95, 0x3b, 0x3b, 0x53, 0xee, 0xe8, 0x4a, 0x22, 0xd1, 0x91, 0x9b, 0x8b, 0xc3, 0x75, 0x02, 0x63, 0x53, 0xb9, 0x9c, 0xa3, 0xaa, 0xaf, 0x05, 0xc6, 0x64, 0x57, 0xcb, 0x73, 0x9e, 0x26, 0x23, 0x5c, 0x50, 0x07, 0xdb, 0x66, 0xde, 0xa0, 0x90, 0x0a, 0xe9, 0xd6, 0x21, 0xfb, 0x6b, 0x93 ],
+const [ 0x78, 0x2a, 0xc1, 0x6b, 0xcd, 0x74, 0x4e, 0xc0, 0x16, 0xff, 0xb6, 0xb0, 0x14, 0xe0, 0xc8, 0x98, 0x3d, 0xfd, 0xe2, 0x31, 0xfa, 0x72, 0xc3, 0x12, 0x12, 0x34, 0x9a, 0x77, 0x66, 0xf4, 0x62, 0x40, 0xe0, 0x47, 0x72, 0x3d, 0xa6, 0x03, 0x50, 0xa8, 0x93, 0xec, 0xc7, 0xf3, 0xe7, 0x90, 0x39, 0xc5, 0x3d, 0x6f, 0x36, 0x3f, 0xbe, 0x5f, 0x4c, 0x83, 0x95, 0x2f, 0x21, 0x77, 0xa2, 0x8b, 0xc0, 0xc6, 0x73, 0x1f, 0x31, 0x28, 0x70, 0x00, 0x4c, 0xe4, 0x55, 0x47, 0xce, 0x93, 0xe6, 0xff, 0xad, 0x26, 0xde, 0x41, 0xa9, 0x2a, 0x28, 0x9d, 0x24, 0x4b, 0x51, 0xbc, 0x33, 0x17, 0x3e, 0x44, 0xf5, 0x05, 0x1a, 0xfc, 0x24, 0xb6, 0x93, 0x31, 0xe9, 0x7a, 0x46, 0x58, 0xf5, 0x16, 0x77, 0xf4, 0xcd, 0xc5, 0x06, 0xba, 0x65, 0x7c, 0x9e, 0xf3, 0xf1, 0x72, 0x30, 0x23, 0xf8, 0xe0, 0xa0, 0xe8, 0xaa, 0x05 ],
+const [ 0x7b, 0x2f, 0x5c, 0x27, 0x41, 0x33, 0x8d, 0x25, 0xd8, 0xf9, 0xd4, 0xbb, 0x0f, 0xa7, 0x18, 0x49, 0x9b, 0xa9, 0x60, 0xc6, 0x5e, 0xeb, 0x39, 0x9f, 0xe9, 0x4b, 0x59, 0xc2, 0x3f, 0x4e, 0x81, 0xf5, 0xdb, 0x11, 0xa8, 0x6d, 0xf5, 0x83, 0x55, 0x9c, 0x02, 0xd2, 0x4d, 0x4a, 0x7a, 0x23, 0x6e, 0xe7, 0xdd, 0x86, 0xdb, 0x20, 0xf8, 0x29, 0x59, 0xb0, 0x65, 0xcc, 0xf9, 0x79, 0x51, 0x74, 0xf8, 0xd3, 0x81, 0x64, 0xe3, 0x24, 0x97, 0x49, 0xfe, 0xb1, 0x92, 0xb5, 0xe7, 0xb3, 0x95, 0xce, 0x77, 0xae, 0xe9, 0x48, 0xe9, 0xfe, 0x44, 0x90, 0x3e, 0xb2, 0x4c, 0x4a, 0xdf, 0x9e, 0x57, 0xfe, 0x85, 0xac, 0x75, 0x0e, 0x56, 0x73, 0xb0, 0xec, 0x51, 0x0b, 0x92, 0x89, 0xeb, 0x1f, 0xe8, 0x11, 0xfa, 0x43, 0xc6, 0xd5, 0xd3, 0x88, 0xcb, 0x89, 0xaf, 0x4e, 0xa6, 0xaf, 0x54, 0x5a, 0xd9, 0x53, 0xf1, 0x29 ],
+const [ 0x89, 0x17, 0xaa, 0x6e, 0x1c, 0xd3, 0x5a, 0xf3, 0x0e, 0xb5, 0xc7, 0xac, 0x20, 0x0e, 0x54, 0x83, 0x5d, 0x4a, 0x07, 0x77, 0xa0, 0x6a, 0x2f, 0xa7, 0x56, 0xb4, 0x4a, 0xac, 0x85, 0xa8, 0x25, 0x2c, 0x0e, 0x37, 0x45, 0xac, 0x2f, 0x30, 0x86, 0xa6, 0x4b, 0xfb, 0x02, 0xdc, 0xee, 0x89, 0x34, 0xeb, 0x0c, 0x8b, 0x5e, 0x23, 0x89, 0xe2, 0x27, 0x96, 0xfe, 0x57, 0x89, 0x6f, 0xbb, 0x8d, 0xea, 0x86, 0x08, 0x33, 0x89, 0x31, 0xb1, 0x7e, 0x1c, 0x5c, 0xc1, 0xd7, 0xb8, 0xdc, 0x8d, 0xd1, 0xf0, 0x00, 0xf4, 0x5d, 0x41, 0x69, 0xe6, 0x41, 0xae, 0x1c, 0x23, 0xc6, 0xa7, 0xd6, 0x45, 0xb1, 0x2f, 0xa0, 0x01, 0x75, 0x3e, 0xa2, 0xaa, 0xa7, 0x64, 0x3c, 0xf6, 0xb2, 0xb0, 0x53, 0x05, 0xcc, 0xd0, 0xe9, 0x9f, 0x29, 0x79, 0xf1, 0xbe, 0x6e, 0x0a, 0x61, 0x4c, 0x68, 0x6c, 0x88, 0x2d, 0xfe, 0x3c, 0xa2 ],
+const [ 0x1c, 0x68, 0x5e, 0x17, 0x89, 0x0e, 0xe0, 0x79, 0xee, 0x85, 0xce, 0xf5, 0xed, 0x70, 0x93, 0x56, 0xf4, 0x19, 0x9e, 0x65, 0x7a, 0xaa, 0xc0, 0xbc, 0x85, 0xa1, 0xd5, 0xd5, 0x70, 0x7e, 0xa6, 0x66, 0xeb, 0xbe, 0x0e, 0xf1, 0x43, 0x0d, 0x5c, 0x96, 0xe4, 0xb8, 0xf9, 0x2d, 0x1c, 0x61, 0x4b, 0x91, 0x21, 0xf6, 0xd8, 0x3e, 0x56, 0xe4, 0xaf, 0x1f, 0xca, 0x87, 0x04, 0xa1, 0x01, 0xe5, 0x1a, 0x0c, 0xf8, 0x9d, 0x66, 0x13, 0x63, 0x1a, 0xf1, 0xaa, 0x39, 0x0c, 0xfe, 0x17, 0x72, 0x19, 0xed, 0x4c, 0x10, 0xcf, 0x5f, 0x74, 0x5c, 0xde, 0x9b, 0xcc, 0x72, 0x84, 0x30, 0xb4, 0xff, 0x48, 0xdc, 0x06, 0x4a, 0xeb, 0xad, 0xa6, 0x71, 0x9c, 0x66, 0x5a, 0xf5, 0x6b, 0x24, 0xdc, 0x79, 0x00, 0x41, 0x2e, 0xc7, 0x8d, 0x79, 0x2e, 0x14, 0x01, 0x4b, 0x6a, 0x85, 0x7f, 0xa2, 0x35, 0xf2, 0x0e, 0xb5, 0xfb ],
+const [ 0x97, 0x06, 0xd7, 0x37, 0x0b, 0x66, 0xbf, 0xa7, 0x8a, 0xbb, 0x8b, 0x25, 0xa9, 0xd6, 0x14, 0x3a, 0x9a, 0xad, 0xca, 0xa4, 0xf6, 0x0c, 0x9b, 0xaa, 0xb9, 0x87, 0x17, 0xac, 0x8f, 0xb3, 0xd2, 0xfe, 0x4e, 0x96, 0x0a, 0xf7, 0xc3, 0x5b, 0x8a, 0x44, 0xb1, 0x4a, 0xce, 0x82, 0x17, 0xf8, 0x68, 0x0d, 0xb2, 0xbb, 0xa3, 0x12, 0xc3, 0x61, 0x65, 0xec, 0x12, 0x22, 0x5a, 0xad, 0x33, 0xd2, 0x4e, 0xfa, 0x08, 0x5c, 0xdb, 0x1d, 0x87, 0x6b, 0x45, 0x55, 0xbd, 0x6a, 0xa2, 0x70, 0x13, 0xaf, 0x3e, 0x9c, 0xd1, 0xf3, 0x3d, 0x7b, 0xe0, 0x06, 0x82, 0x75, 0xd4, 0xc0, 0xd0, 0x52, 0x2a, 0x3b, 0x2f, 0x08, 0xcd, 0x3f, 0x92, 0xd1, 0xdf, 0xfe, 0xb6, 0x81, 0xb7, 0x02, 0x4d, 0x17, 0x26, 0x63, 0x5c, 0x92, 0xff, 0x3d, 0xe2, 0x06, 0xd6, 0x61, 0xba, 0xee, 0x07, 0x4b, 0xc2, 0xc4, 0xfb, 0x55, 0x3d, 0xcf ],
+const [ 0xff, 0x84, 0x68, 0xcf, 0x11, 0xd6, 0x19, 0x0c, 0xae, 0x4a, 0x1e, 0x16, 0x87, 0x1a, 0xe0, 0x81, 0x72, 0x14, 0xfd, 0x44, 0x1a, 0x88, 0x9b, 0xbd, 0xf5, 0x64, 0xfd, 0xf5, 0x77, 0x9e, 0x54, 0x26, 0x86, 0xd2, 0xd7, 0x7a, 0x2d, 0x2d, 0x15, 0x16, 0x94, 0x89, 0x8a, 0x57, 0x30, 0xd9, 0x71, 0x5b, 0x37, 0xc8, 0xda, 0xc4, 0x57, 0x9d, 0xfc, 0xb8, 0xa7, 0x62, 0xcc, 0x2c, 0xde, 0x45, 0xcf, 0x63, 0xc3, 0x3e, 0x2c, 0xb1, 0xe4, 0xf2, 0x05, 0x85, 0x8b, 0xd8, 0x07, 0xa7, 0xee, 0x9a, 0x40, 0xbd, 0xa6, 0xbe, 0x31, 0x14, 0x62, 0x85, 0x25, 0x9d, 0xdd, 0x13, 0xc1, 0x36, 0x0d, 0xd1, 0xdb, 0x2b, 0x9e, 0x10, 0x90, 0xfd, 0x9e, 0xef, 0x90, 0x62, 0x7a, 0x7e, 0xbd, 0x8c, 0x29, 0x23, 0xf5, 0xae, 0xa7, 0x3d, 0x2b, 0xbd, 0xa5, 0x08, 0xbd, 0x74, 0x7f, 0xc1, 0x01, 0x9a, 0x6e, 0x0a, 0x21, 0x87 ],
+const [ 0x32, 0xe5, 0xa9, 0xf3, 0xc3, 0xf9, 0x57, 0x6a, 0x21, 0xdb, 0xfe, 0xd0, 0x17, 0xb9, 0x61, 0xf1, 0x18, 0xcd, 0x23, 0xf3, 0x80, 0x8f, 0x2c, 0x2b, 0x1d, 0x29, 0x4e, 0x35, 0xee, 0x2b, 0x28, 0x43, 0x2a, 0x80, 0x4b, 0xb5, 0x84, 0xa1, 0x9c, 0xea, 0xae, 0x08, 0xfa, 0x56, 0x1c, 0xe8, 0x20, 0xd5, 0x0a, 0x1b, 0xcc, 0x3f, 0xc0, 0x5b, 0x21, 0x3d, 0x15, 0xb6, 0x49, 0x5b, 0x32, 0x3c, 0x60, 0x5e, 0x98, 0xfb, 0x8d, 0xd7, 0x65, 0x2d, 0x72, 0xf8, 0xd2, 0xaf, 0xc7, 0xa7, 0x01, 0xb5, 0x41, 0xd1, 0xf6, 0xbd, 0xb9, 0x01, 0xe3, 0xc1, 0x8a, 0x31, 0xa8, 0xb1, 0x3b, 0xe0, 0x9a, 0x20, 0x5e, 0x64, 0x83, 0x3e, 0xb7, 0x82, 0xeb, 0x06, 0xa1, 0x3c, 0x96, 0xb8, 0xae, 0xea, 0x4e, 0x8a, 0x8e, 0x8c, 0xe3, 0x9a, 0x32, 0x5f, 0x6f, 0x28, 0x30, 0xae, 0xde, 0x02, 0x6a, 0xeb, 0xae, 0x3f, 0xeb, 0xfe ],
+const [ 0x4b, 0xf8, 0x41, 0xec, 0x0a, 0x42, 0x11, 0xb0, 0x5f, 0x9a, 0x45, 0xa1, 0x27, 0xbb, 0xbb, 0xf6, 0x43, 0x4e, 0x86, 0x42, 0x91, 0x0e, 0x8a, 0xb1, 0x1b, 0x2a, 0x46, 0x8e, 0x8f, 0xea, 0xf0, 0x09, 0xf0, 0x96, 0xc7, 0x38, 0x8a, 0x94, 0xa5, 0x5b, 0x2b, 0xd0, 0xd3, 0x64, 0x90, 0x61, 0x22, 0xb7, 0x1e, 0x69, 0x37, 0x2e, 0xd3, 0x3c, 0x27, 0x60, 0x7b, 0xc5, 0x44, 0x23, 0x27, 0x26, 0x36, 0x4f, 0xdb, 0x9f, 0x4d, 0xc5, 0x87, 0xb1, 0x15, 0xb0, 0x38, 0x83, 0x2b, 0x0b, 0x90, 0x84, 0x50, 0x64, 0x74, 0x52, 0xbc, 0xdf, 0x04, 0xdb, 0xb4, 0x7d, 0xd0, 0xc2, 0x5f, 0x9e, 0x48, 0x04, 0xd6, 0xc5, 0x75, 0xdb, 0x7a, 0x9c, 0xe7, 0xe2, 0x8a, 0x38, 0xef, 0x7a, 0xf5, 0x9d, 0x0e, 0x6d, 0x6c, 0x85, 0xac, 0xd2, 0xbc, 0x5d, 0x0d, 0x31, 0x5b, 0x91, 0x82, 0xe7, 0x40, 0x09, 0xdc, 0xcb, 0xf8, 0xf4 ],
+const [ 0x63, 0x39, 0x74, 0xba, 0x73, 0x5a, 0x5e, 0x57, 0xd1, 0xe8, 0x04, 0xbc, 0xdd, 0x4d, 0x72, 0xd4, 0xa9, 0xe9, 0xdf, 0x0f, 0xb9, 0xbf, 0x8d, 0xb2, 0x07, 0x6e, 0xf1, 0x71, 0x4a, 0x64, 0x14, 0x3f, 0x78, 0x4e, 0x39, 0x65, 0x8a, 0xd2, 0xc0, 0xd1, 0x7f, 0x81, 0x4a, 0xb1, 0xa3, 0x07, 0x1e, 0x41, 0x11, 0xa5, 0xcc, 0xe1, 0x77, 0xe2, 0x10, 0x6b, 0x19, 0x7d, 0xf8, 0xc3, 0x19, 0xa5, 0x49, 0xb0, 0xf5, 0x6c, 0x20, 0xea, 0x51, 0x7a, 0xd5, 0x74, 0xf7, 0xfe, 0x24, 0x2b, 0x1c, 0xeb, 0x8f, 0xa0, 0xe5, 0x60, 0xfe, 0x23, 0x29, 0x67, 0xa9, 0x20, 0x79, 0xe3, 0x37, 0xaf, 0x5d, 0xc4, 0x27, 0x66, 0xe1, 0x7d, 0x70, 0x71, 0x50, 0xb8, 0x64, 0xe5, 0x40, 0x48, 0xda, 0x52, 0xce, 0x5f, 0x8c, 0x98, 0x2b, 0x01, 0xbe, 0xfb, 0x58, 0xb8, 0x21, 0x79, 0x2d, 0x8a, 0xf6, 0x5a, 0xa0, 0x28, 0x76, 0x0a ],
+const [ 0xea, 0x52, 0x64, 0x80, 0xa0, 0x96, 0xa4, 0xd8, 0x93, 0x06, 0xb3, 0xcf, 0x86, 0xef, 0xf7, 0x42, 0xab, 0x46, 0xe4, 0xe9, 0xad, 0x99, 0x1e, 0xe7, 0xf3, 0x44, 0xdd, 0x9f, 0x24, 0xe8, 0x96, 0xca, 0xe6, 0x19, 0xd8, 0xc6, 0xec, 0x57, 0x74, 0x31, 0x2f, 0x40, 0xe0, 0xb7, 0x7b, 0x03, 0xdd, 0x28, 0x2e, 0x18, 0x58, 0xce, 0x3d, 0x2f, 0x8e, 0xfd, 0x77, 0x66, 0x74, 0xeb, 0x0e, 0xbe, 0x56, 0xc2, 0x53, 0xd0, 0xbe, 0xf4, 0xc1, 0xbc, 0x97, 0xcf, 0x3d, 0x63, 0x92, 0x51, 0x9c, 0xd6, 0xc9, 0x3d, 0x66, 0x0d, 0xa3, 0x6e, 0xd9, 0xdd, 0xf7, 0x6c, 0x31, 0x24, 0x74, 0x3d, 0x27, 0x47, 0x40, 0x7e, 0xb8, 0xde, 0xdf, 0xb2, 0x27, 0xad, 0x57, 0xd9, 0x45, 0xd7, 0x91, 0x45, 0xf0, 0x4e, 0x03, 0xa9, 0xda, 0x8e, 0x8c, 0x73, 0x8c, 0x8b, 0x9f, 0x5b, 0xaa, 0xe7, 0xa4, 0x3c, 0x78, 0x69, 0x9b, 0x23 ],
+const [ 0xf6, 0xea, 0xc4, 0xc4, 0x09, 0x9c, 0x32, 0x32, 0xdf, 0x01, 0x8f, 0xb3, 0xc8, 0x37, 0x52, 0x7b, 0x80, 0x21, 0xa1, 0xa2, 0x0c, 0xbb, 0x5d, 0x1b, 0xe5, 0xaa, 0x5e, 0xe5, 0x58, 0x18, 0x00, 0x85, 0x2d, 0xbe, 0xde, 0xb3, 0x87, 0x42, 0xdd, 0x54, 0x0b, 0xc4, 0x6d, 0xa8, 0x44, 0xb4, 0x0b, 0xc5, 0x46, 0xe6, 0x0a, 0x44, 0x92, 0xe8, 0x94, 0x3a, 0x3a, 0x93, 0xec, 0x6a, 0x46, 0xe0, 0xf5, 0xb8, 0x55, 0xfd, 0xf8, 0xe1, 0x88, 0xa0, 0xa2, 0x6a, 0x9b, 0x9c, 0x4c, 0xd6, 0x55, 0xb2, 0x80, 0x1c, 0x23, 0xa9, 0xb8, 0x58, 0x00, 0xa0, 0x68, 0xc1, 0x97, 0xa4, 0x3f, 0xdb, 0xac, 0x7e, 0xaa, 0xee, 0xb8, 0xce, 0x9b, 0xb6, 0xd3, 0x5e, 0x88, 0x5c, 0xd7, 0xb0, 0xb6, 0xa5, 0xc3, 0xd9, 0xb7, 0x6a, 0x5d, 0x92, 0x32, 0x48, 0x1c, 0x8d, 0xe2, 0x98, 0x44, 0x05, 0xe1, 0xa1, 0x53, 0x99, 0x27, 0x0d ],
+const [ 0xc9, 0xf9, 0x02, 0xc8, 0xc0, 0x2c, 0x5b, 0x24, 0xbb, 0x54, 0xe2, 0xdb, 0xf5, 0xc9, 0x57, 0x3b, 0xd4, 0x6b, 0xef, 0x39, 0xcc, 0xf1, 0x54, 0x62, 0x81, 0x7e, 0xee, 0x15, 0x2b, 0x75, 0x61, 0xf0, 0x3f, 0x8f, 0x57, 0x88, 0x4c, 0x2b, 0x7f, 0x5d, 0x22, 0xe5, 0xd6, 0x0d, 0x3a, 0x69, 0x25, 0xc7, 0x52, 0x8a, 0xca, 0x03, 0x58, 0x8e, 0xbc, 0x70, 0x89, 0xcc, 0xca, 0x2e, 0xda, 0x7a, 0x23, 0x3e, 0x97, 0xc0, 0x1b, 0x37, 0x4a, 0x10, 0x2c, 0x3a, 0xde, 0xba, 0x3b, 0x27, 0x04, 0xbb, 0x1d, 0x11, 0xd6, 0xd6, 0x5a, 0xf0, 0xba, 0xe7, 0x31, 0x96, 0x8a, 0x73, 0xdc, 0xe5, 0xf2, 0x83, 0x15, 0x3e, 0x19, 0xb3, 0xd8, 0x3c, 0x83, 0x86, 0x6b, 0xa3, 0x36, 0xfc, 0x9c, 0x93, 0x1b, 0x67, 0x4a, 0x02, 0xa8, 0x7a, 0x26, 0x69, 0xbc, 0xa3, 0xbb, 0xbc, 0xca, 0x9b, 0xac, 0xa0, 0x3a, 0x3b, 0x3d, 0xd9 ],
+const [ 0xc1, 0x49, 0x0a, 0xe9, 0x57, 0x98, 0x28, 0xb2, 0xd6, 0xd2, 0x93, 0x5f, 0x41, 0x7e, 0x0d, 0xbd, 0xff, 0xf5, 0xd4, 0x24, 0xde, 0x5e, 0xc5, 0x05, 0x57, 0xdd, 0xc7, 0xc3, 0x14, 0x08, 0x67, 0xc4, 0xaf, 0x9b, 0xc0, 0xc7, 0xbd, 0x6c, 0x9e, 0x78, 0x0b, 0xa1, 0xe3, 0x41, 0x27, 0x20, 0x29, 0x64, 0x22, 0x47, 0xa8, 0x47, 0x95, 0xde, 0x5a, 0x0e, 0xe2, 0x49, 0x5e, 0x6f, 0xbc, 0x02, 0x9b, 0xc2, 0xea, 0x47, 0xa5, 0x58, 0x47, 0x10, 0xe4, 0x0e, 0x0e, 0x44, 0xf3, 0x22, 0x54, 0x2c, 0x46, 0x45, 0xd6, 0x28, 0x10, 0xf1, 0xf5, 0xa1, 0x63, 0xfc, 0xff, 0x3e, 0x99, 0x6e, 0xb0, 0x5b, 0xf4, 0x90, 0xf9, 0xb7, 0x81, 0x45, 0xff, 0x6c, 0x42, 0x9d, 0x67, 0x25, 0x8b, 0xa8, 0xd1, 0x8b, 0xad, 0x88, 0xa2, 0x00, 0xd2, 0xca, 0x07, 0x90, 0x28, 0xf7, 0x37, 0x24, 0x42, 0x65, 0xf8, 0xf9, 0xbb, 0x53 ],
+const [ 0x45, 0xfc, 0xbd, 0xb9, 0x3a, 0xcd, 0x83, 0x00, 0xdd, 0xb8, 0x80, 0x12, 0xce, 0xb5, 0x59, 0x50, 0xf4, 0xda, 0x61, 0x14, 0x5a, 0xdb, 0x0d, 0x4c, 0x3d, 0xcd, 0xa8, 0x68, 0x63, 0x2f, 0x47, 0x77, 0xae, 0x2a, 0x00, 0x8c, 0xf0, 0x18, 0x57, 0x67, 0x01, 0x44, 0xf9, 0x51, 0x0f, 0xf0, 0xad, 0x48, 0x36, 0x9d, 0x87, 0x5c, 0x50, 0x86, 0x5e, 0x59, 0x0f, 0x6e, 0x81, 0xa6, 0x49, 0x9b, 0xa6, 0x6d, 0x92, 0x23, 0x23, 0xfc, 0x10, 0x66, 0x61, 0x6c, 0x8b, 0xdc, 0x8d, 0x80, 0xc4, 0x11, 0x90, 0xcf, 0x08, 0xed, 0x42, 0x26, 0x04, 0x39, 0xda, 0x28, 0xdb, 0x5f, 0xaa, 0x37, 0x76, 0x71, 0x09, 0x98, 0x1c, 0x6d, 0x90, 0xd1, 0x42, 0xc0, 0x89, 0x56, 0xa4, 0x08, 0xa4, 0x65, 0x94, 0x1e, 0xec, 0x2f, 0x92, 0x54, 0xfa, 0x38, 0x1e, 0xfb, 0x68, 0x00, 0xca, 0x29, 0x89, 0xe3, 0x93, 0xb9, 0x57, 0x3e ],
+const [ 0xb9, 0xe9, 0x44, 0xe0, 0xb4, 0x2d, 0x0f, 0xf4, 0x54, 0xf7, 0xf8, 0xaa, 0x24, 0xf0, 0x0e, 0x9e, 0xe0, 0x39, 0x05, 0x8c, 0xe4, 0x09, 0x41, 0x11, 0xe3, 0x97, 0x31, 0xb6, 0xdc, 0x3a, 0xde, 0x2a, 0x4a, 0xce, 0xc4, 0xcf, 0x9c, 0x5b, 0xe0, 0x78, 0xe4, 0xf1, 0x0a, 0x72, 0xd3, 0xd6, 0x85, 0xc1, 0xe5, 0xe4, 0xd5, 0xab, 0xd9, 0x2c, 0xd0, 0x7b, 0x64, 0xdf, 0xf8, 0x7f, 0x26, 0x6f, 0x08, 0x53, 0xdd, 0xf1, 0xcd, 0x61, 0xd9, 0xc6, 0x37, 0xa9, 0xb0, 0x7a, 0xb0, 0xbe, 0x32, 0xec, 0xac, 0x11, 0x9f, 0xaf, 0x82, 0x72, 0x18, 0xb1, 0x7a, 0xd4, 0x54, 0x1a, 0x27, 0x51, 0x94, 0x77, 0xf7, 0x6e, 0xd9, 0x18, 0x08, 0x9f, 0x54, 0xb6, 0x3d, 0x0e, 0x1e, 0x5a, 0x92, 0x98, 0x29, 0x79, 0xac, 0x18, 0x77, 0x64, 0xb5, 0xe9, 0x89, 0xe0, 0x66, 0xa6, 0x1b, 0x10, 0x65, 0x34, 0x0e, 0x9c, 0xd2, 0x03 ],
+const [ 0x2a, 0xc0, 0xbb, 0x05, 0x24, 0xc2, 0x2b, 0x90, 0x2d, 0xe3, 0x4c, 0xe6, 0x4e, 0x61, 0x72, 0xd1, 0xb2, 0x07, 0x4e, 0x15, 0x9f, 0x51, 0x7a, 0xb1, 0xab, 0xd1, 0x52, 0x62, 0x2c, 0xd1, 0x06, 0x69, 0xf0, 0x3a, 0xed, 0x8e, 0x2e, 0xb5, 0x1c, 0x65, 0xbd, 0x0f, 0x38, 0xd0, 0x84, 0xe2, 0x88, 0xc5, 0x32, 0x72, 0x4e, 0x51, 0x2f, 0xd5, 0x58, 0xdd, 0xd2, 0x57, 0xd2, 0xb1, 0xd4, 0x1c, 0x5e, 0xb6, 0x04, 0x07, 0x67, 0x80, 0x3d, 0xdb, 0xb1, 0x8b, 0x95, 0xa0, 0x35, 0xc5, 0xd8, 0x49, 0x2d, 0x4d, 0x35, 0x93, 0x6b, 0x7b, 0x36, 0x30, 0xee, 0x20, 0xf6, 0x25, 0xb7, 0x0f, 0x8e, 0x71, 0xd9, 0xdc, 0xd0, 0xef, 0xd0, 0xe3, 0x38, 0x7d, 0x13, 0x8c, 0x1f, 0x5e, 0xed, 0xce, 0x32, 0xdd, 0x88, 0xf2, 0x23, 0x33, 0x4b, 0x9a, 0x9e, 0xab, 0x65, 0x01, 0x7f, 0x04, 0xaa, 0x84, 0x42, 0x17, 0x9f, 0x62 ],
+const [ 0xf5, 0xaf, 0xf2, 0x83, 0xb3, 0xaa, 0xa4, 0xc7, 0x1b, 0x13, 0xc5, 0x90, 0x77, 0x1d, 0x8b, 0xd3, 0x35, 0x8d, 0x76, 0x98, 0x8e, 0xcd, 0x1e, 0xae, 0x65, 0x3c, 0x2f, 0x9d, 0x72, 0xc9, 0xb2, 0xdc, 0x9f, 0xc0, 0x8e, 0x44, 0xb2, 0xe3, 0x4e, 0xc5, 0x2d, 0xbd, 0x24, 0x58, 0x72, 0x33, 0x2e, 0x34, 0x2b, 0x5c, 0xf9, 0x45, 0xe9, 0x93, 0x44, 0xda, 0x0b, 0xca, 0x06, 0x9e, 0xe2, 0x21, 0xb2, 0xc9, 0x13, 0xb7, 0xb9, 0x97, 0x3c, 0xbf, 0x50, 0xfa, 0xda, 0xd7, 0x75, 0x8b, 0x6a, 0x96, 0x2c, 0xc7, 0xce, 0x64, 0x0f, 0x78, 0xf3, 0x8f, 0x05, 0x71, 0xb1, 0x9b, 0x52, 0x7e, 0xf2, 0xd9, 0xd0, 0x9b, 0x17, 0x3b, 0x7b, 0x64, 0x97, 0x66, 0x33, 0xcd, 0xe9, 0x09, 0xbe, 0x13, 0xa5, 0x6d, 0x0d, 0xf3, 0xe6, 0x4e, 0xc0, 0x19, 0xf2, 0xea, 0xec, 0xdb, 0x1d, 0x57, 0x1b, 0x27, 0xea, 0x19, 0x94, 0xba ],
+const [ 0xc0, 0xbb, 0x12, 0xa5, 0xda, 0x62, 0x83, 0x63, 0xa7, 0x1f, 0x1f, 0x5c, 0x9c, 0xe7, 0x15, 0xce, 0x89, 0x95, 0xe6, 0x07, 0x14, 0x8d, 0x77, 0x2b, 0x66, 0x9f, 0x65, 0x32, 0x24, 0x2f, 0x98, 0x30, 0xa1, 0x93, 0x1b, 0xd9, 0x52, 0xbd, 0x2a, 0x44, 0x82, 0x1a, 0x8d, 0xef, 0x46, 0xb9, 0x25, 0x04, 0xb4, 0xb0, 0xc5, 0xda, 0x50, 0xbc, 0x43, 0xbf, 0xc7, 0x27, 0xce, 0xf5, 0xe0, 0xef, 0x81, 0xfa, 0xaf, 0x24, 0x39, 0x0c, 0x0c, 0x92, 0xa4, 0xed, 0x43, 0xa0, 0x9b, 0xe4, 0x0d, 0x78, 0xb2, 0x04, 0xbf, 0x68, 0x0d, 0xb0, 0xc2, 0x88, 0x75, 0x5f, 0x43, 0x9e, 0xaa, 0x9d, 0x2b, 0x3e, 0xfb, 0x53, 0x52, 0x36, 0x15, 0x47, 0xef, 0x29, 0x19, 0xe6, 0x54, 0x79, 0xf1, 0x42, 0xd8, 0x6a, 0xe3, 0x57, 0x14, 0x85, 0x66, 0x92, 0x52, 0x3b, 0x35, 0x94, 0x42, 0xcb, 0xa3, 0x33, 0xef, 0x66, 0x2e, 0xc1 ],
+const [ 0x85, 0x4b, 0x32, 0x86, 0x62, 0x73, 0xc6, 0xeb, 0x11, 0x0e, 0x38, 0x0b, 0x8f, 0x3b, 0xfd, 0x16, 0x9c, 0xc8, 0x7a, 0x6f, 0x61, 0x49, 0xc7, 0x5e, 0x56, 0x67, 0xb3, 0x05, 0x63, 0x7b, 0x08, 0x95, 0x46, 0x5c, 0x10, 0xc1, 0x34, 0x74, 0x57, 0x73, 0xc3, 0x1a, 0xb3, 0xbe, 0x07, 0x1c, 0x82, 0x15, 0xfb, 0x9a, 0x33, 0xba, 0x23, 0x1b, 0x08, 0x78, 0x70, 0xda, 0x19, 0x95, 0x64, 0x61, 0x9d, 0x03, 0x76, 0x59, 0x65, 0xd6, 0xb8, 0xa1, 0xa9, 0xfb, 0xb7, 0x9d, 0x07, 0x26, 0xa3, 0xd1, 0xc9, 0x0c, 0xb0, 0xae, 0x67, 0xd3, 0xbb, 0xab, 0x4c, 0xc6, 0x31, 0x98, 0xdd, 0x4e, 0x2d, 0x2f, 0xb8, 0x1d, 0xe0, 0xed, 0x39, 0xad, 0x36, 0x20, 0x43, 0xe9, 0xb6, 0x40, 0x3d, 0x2a, 0xab, 0x82, 0x5a, 0x64, 0x81, 0xab, 0x1e, 0xa2, 0x71, 0x22, 0x1e, 0xaf, 0x61, 0x4a, 0x07, 0x16, 0x05, 0x0e, 0xe1, 0x4d ],
+const [ 0x99, 0x49, 0x44, 0x22, 0x46, 0x0e, 0xc8, 0x58, 0xa2, 0x43, 0x94, 0xf6, 0x03, 0xb1, 0xd9, 0xb9, 0x40, 0xa2, 0x4a, 0xd9, 0xc6, 0xa3, 0xd1, 0xe9, 0xe8, 0x87, 0x81, 0xfe, 0x77, 0xaf, 0xcd, 0x13, 0x93, 0x89, 0xf7, 0xac, 0xc0, 0x57, 0xcb, 0xba, 0x3d, 0x32, 0x8c, 0xbf, 0x91, 0x4e, 0x2f, 0x32, 0x66, 0x7f, 0xc7, 0x25, 0x9a, 0xfc, 0x41, 0x25, 0x94, 0x64, 0x51, 0x62, 0xd4, 0xfe, 0xac, 0x10, 0xce, 0x45, 0x78, 0x0c, 0xf9, 0xa4, 0x00, 0xc3, 0x23, 0x7e, 0xad, 0x50, 0x07, 0x71, 0x32, 0xe4, 0x21, 0xdc, 0x06, 0x6b, 0xc1, 0x9e, 0x17, 0x6c, 0x5f, 0x21, 0xbd, 0x31, 0x2e, 0x98, 0xec, 0x29, 0xf3, 0x84, 0xaf, 0x8a, 0x18, 0x7d, 0xd1, 0x3a, 0xfc, 0x2f, 0xdd, 0xf0, 0x8e, 0xa3, 0x4a, 0x97, 0x1a, 0xc0, 0xef, 0xf3, 0x63, 0x11, 0xbd, 0x86, 0xf1, 0xc8, 0xac, 0xb5, 0xac, 0x03, 0xf6, 0x27 ],
+const [ 0xd8, 0xef, 0xcb, 0x41, 0x6f, 0x23, 0x7c, 0x7e, 0x05, 0xbe, 0xd9, 0x21, 0x2c, 0x54, 0x30, 0x11, 0xc3, 0x9e, 0x6a, 0x5f, 0x25, 0xd7, 0xe2, 0xcb, 0xa0, 0x65, 0x78, 0x8a, 0x29, 0xbc, 0xe1, 0x46, 0x4d, 0x80, 0x41, 0x67, 0x6b, 0xe9, 0xfb, 0x91, 0x21, 0x6c, 0xc7, 0x6d, 0x04, 0x98, 0x06, 0xad, 0x94, 0x3e, 0x53, 0x4a, 0x6f, 0xd4, 0x5b, 0x10, 0xc4, 0x1b, 0xee, 0x5d, 0x0b, 0x00, 0x56, 0x26, 0xf3, 0xc0, 0xe7, 0x3a, 0x9c, 0x50, 0xd7, 0xcb, 0x07, 0xfc, 0x50, 0x2a, 0xcb, 0x4e, 0xc4, 0xd2, 0x09, 0x31, 0x81, 0xa8, 0xa1, 0x56, 0x85, 0x81, 0xa6, 0xd7, 0x93, 0xe5, 0x10, 0x1b, 0x86, 0x13, 0xb1, 0xf9, 0xe6, 0x44, 0x6b, 0x20, 0xb9, 0x34, 0x9f, 0xb6, 0x9b, 0xdf, 0xe8, 0x3f, 0x11, 0x88, 0x0a, 0xc1, 0x1b, 0x00, 0x25, 0x25, 0x08, 0x25, 0x2f, 0xe1, 0x8e, 0xa9, 0xa0, 0xd4, 0x1a, 0x15 ],
+const [ 0x1a, 0x02, 0x23, 0x26, 0x1a, 0xb4, 0x37, 0xa4, 0xac, 0x17, 0x01, 0xb4, 0x78, 0x07, 0x76, 0xc4, 0x3f, 0x0f, 0x89, 0x49, 0xb3, 0xe7, 0xa1, 0x61, 0x8c, 0x3b, 0x4a, 0xb6, 0xd8, 0xae, 0x2a, 0xa6, 0x92, 0x1f, 0x38, 0xa2, 0x77, 0x2b, 0x28, 0xd4, 0x15, 0xf3, 0x29, 0x05, 0x25, 0x1f, 0xd3, 0xbd, 0x1a, 0x23, 0x5b, 0xac, 0xfa, 0xc0, 0x0a, 0x48, 0x6d, 0xce, 0xed, 0xb8, 0x14, 0x3a, 0xcd, 0xf1, 0x1b, 0x4b, 0x61, 0x1f, 0x12, 0x29, 0xc3, 0x46, 0xf8, 0x9f, 0x21, 0x29, 0x99, 0x20, 0xb5, 0x6b, 0x1b, 0x08, 0xf7, 0xf4, 0xd3, 0x25, 0x11, 0x96, 0x5d, 0x76, 0x93, 0xf0, 0xeb, 0x32, 0x68, 0x93, 0xdd, 0x0c, 0x09, 0x64, 0x92, 0xb6, 0xf0, 0x42, 0x7e, 0xa4, 0x50, 0xe8, 0x7d, 0x12, 0x03, 0x14, 0x67, 0x48, 0xc3, 0xe9, 0xe5, 0x1d, 0x9e, 0x91, 0x83, 0xba, 0xa4, 0x28, 0x06, 0xa0, 0xe3, 0xd5 ],
+const [ 0xfa, 0xa6, 0xce, 0x40, 0xd9, 0x31, 0xf3, 0xc0, 0xcb, 0x45, 0x38, 0xa8, 0x2a, 0x22, 0xf0, 0xd4, 0xf3, 0x22, 0x1f, 0x02, 0x7b, 0x99, 0xd3, 0xd8, 0x5d, 0xff, 0xb7, 0x29, 0xb7, 0x51, 0xe5, 0x74, 0x96, 0xb4, 0xfc, 0xad, 0xae, 0x5c, 0x72, 0x40, 0x4f, 0xac, 0x2c, 0x54, 0x94, 0x9e, 0x4c, 0x4c, 0xde, 0x66, 0x4b, 0x94, 0x80, 0x52, 0x47, 0x9a, 0xbc, 0xf5, 0x9e, 0x1a, 0xef, 0x84, 0xbb, 0x9f, 0x08, 0x80, 0x30, 0x47, 0x3e, 0x95, 0x05, 0xc6, 0x03, 0xc3, 0x50, 0xad, 0x33, 0xbb, 0x06, 0xed, 0x92, 0x8c, 0x11, 0x96, 0x75, 0x7e, 0xa3, 0xe5, 0xbf, 0x3e, 0xc9, 0x7e, 0x0f, 0x3c, 0x43, 0xf6, 0x38, 0x52, 0x93, 0x94, 0xf2, 0xa6, 0x54, 0x59, 0xcf, 0xd1, 0xcd, 0x3d, 0x70, 0x41, 0xc6, 0xbc, 0xf8, 0xdb, 0x9a, 0x91, 0xc1, 0xe5, 0x8e, 0xc2, 0x4e, 0x24, 0x61, 0xdc, 0x81, 0x41, 0x25, 0x80 ],
+const [ 0x28, 0xb1, 0x8b, 0x86, 0x2c, 0xe9, 0x54, 0x1e, 0xd6, 0xda, 0xf8, 0x11, 0x99, 0xf9, 0xa3, 0x31, 0x13, 0x3b, 0x0e, 0xa3, 0xe4, 0x8f, 0xf4, 0x86, 0xc1, 0xac, 0xc6, 0xd5, 0xc4, 0x0e, 0x9f, 0x8f, 0x06, 0x3b, 0x7a, 0x15, 0x70, 0x4b, 0xa3, 0xd3, 0xce, 0xa7, 0x6b, 0x22, 0x25, 0x11, 0x20, 0x6d, 0x47, 0xe5, 0x3c, 0x93, 0xa4, 0x9e, 0xdd, 0x8d, 0x63, 0x9b, 0x75, 0x51, 0xb2, 0x24, 0xc3, 0xf6, 0x5a, 0xa8, 0x02, 0x18, 0x96, 0x48, 0x60, 0x7e, 0x25, 0x9a, 0xb1, 0xfa, 0x9e, 0xa6, 0x65, 0x91, 0x04, 0x35, 0xb7, 0xdc, 0x9a, 0x4c, 0x28, 0xae, 0xf8, 0xf3, 0x2c, 0xf8, 0x5f, 0x3a, 0x23, 0xe9, 0x4a, 0x7e, 0x8a, 0x59, 0x45, 0xe9, 0x73, 0x67, 0x02, 0x38, 0x32, 0x61, 0xaa, 0xc1, 0x5a, 0xe5, 0x71, 0xb4, 0xe8, 0x46, 0x6d, 0xa1, 0xbd, 0x31, 0xa8, 0x3a, 0x52, 0x91, 0x74, 0x5b, 0xa7, 0xaf ],
+const [ 0x80, 0xf2, 0x01, 0x52, 0xd1, 0x2b, 0x0a, 0x59, 0x93, 0xa2, 0xb1, 0x7d, 0x1f, 0x55, 0xcf, 0xc0, 0xc0, 0x78, 0x96, 0x1e, 0xd0, 0x0c, 0xd1, 0xc2, 0x1d, 0xb3, 0x6d, 0x7a, 0x92, 0xc3, 0x39, 0x69, 0x13, 0x99, 0xea, 0xfc, 0xa8, 0x30, 0x62, 0x1f, 0xde, 0xf2, 0x32, 0xb0, 0x6a, 0xcd, 0x5d, 0x33, 0x10, 0x8a, 0x5f, 0xc8, 0xc3, 0x5a, 0x6d, 0x5b, 0x0e, 0xb2, 0xff, 0x1b, 0xb2, 0x59, 0x8c, 0x2d, 0x91, 0xc0, 0x94, 0xa1, 0xca, 0x91, 0xe4, 0xa5, 0x26, 0x8a, 0x16, 0xf8, 0xb3, 0x8c, 0x57, 0xa2, 0xae, 0xef, 0x6d, 0xe3, 0xa6, 0x19, 0xf8, 0x69, 0xdf, 0x4f, 0xf7, 0xc5, 0xf5, 0xca, 0x8f, 0x20, 0xc1, 0x0e, 0x08, 0x2a, 0x80, 0x77, 0x19, 0x54, 0x32, 0x15, 0x65, 0x3f, 0x41, 0xba, 0x45, 0x74, 0x63, 0x50, 0xc8, 0x55, 0xc1, 0x70, 0xf8, 0x54, 0x59, 0x31, 0x5f, 0x62, 0xa1, 0x3e, 0xca, 0xaa ],
+const [ 0xb1, 0x13, 0x89, 0xc7, 0xdc, 0x20, 0xff, 0xd0, 0xc4, 0xa5, 0xf8, 0x87, 0xf2, 0x57, 0x6b, 0xdc, 0x30, 0x2c, 0x7d, 0x2a, 0xf7, 0x08, 0x9a, 0x01, 0x27, 0x99, 0xc5, 0x28, 0xfa, 0x7f, 0x2c, 0xe2, 0x3b, 0xb1, 0x00, 0x71, 0xb3, 0x1c, 0x83, 0xd9, 0xe5, 0x8d, 0x63, 0xe6, 0xfb, 0xd0, 0x46, 0x70, 0xff, 0x1a, 0xa6, 0xde, 0x4e, 0xa4, 0xdf, 0xe9, 0x4a, 0x99, 0x86, 0xa3, 0x50, 0x32, 0xfd, 0xb7, 0xea, 0x1f, 0x44, 0xf2, 0x45, 0x2a, 0x12, 0x02, 0xe5, 0x17, 0x25, 0x7e, 0x97, 0xce, 0xd6, 0x27, 0xa7, 0xbc, 0xf0, 0x6e, 0x54, 0x76, 0xc2, 0x36, 0x81, 0x9f, 0x73, 0xda, 0xad, 0x0d, 0x96, 0x72, 0x25, 0x27, 0xfe, 0x52, 0x78, 0x91, 0xd4, 0xd4, 0x2c, 0x0c, 0xe6, 0x58, 0xaf, 0x97, 0x42, 0x88, 0x90, 0xda, 0x04, 0xe1, 0xef, 0xc5, 0x6c, 0x6f, 0x33, 0x75, 0x34, 0xd7, 0xfb, 0x57, 0x20, 0x9b ],
+const [ 0x57, 0xe1, 0xd3, 0xff, 0x5f, 0xc4, 0x78, 0x5f, 0x93, 0x70, 0xdf, 0x2e, 0x5a, 0xbf, 0x45, 0x45, 0x79, 0x75, 0x2e, 0xa9, 0x34, 0xd2, 0xa9, 0xba, 0xb5, 0x68, 0xd5, 0xae, 0xb2, 0x2b, 0xa4, 0x3e, 0x4b, 0xc7, 0xdf, 0x9f, 0x31, 0x36, 0x6b, 0xb4, 0x0d, 0x91, 0xca, 0x82, 0x20, 0x26, 0xe4, 0xe4, 0x26, 0xcc, 0x08, 0x80, 0x81, 0x73, 0x2e, 0xf9, 0x93, 0xff, 0x7f, 0x67, 0x6c, 0x57, 0x17, 0x04, 0xa5, 0xb8, 0x09, 0x27, 0x8b, 0x50, 0xa3, 0x77, 0x81, 0x08, 0xf4, 0x58, 0x9f, 0xa1, 0x8c, 0xaa, 0x9f, 0x02, 0x83, 0xb3, 0xfa, 0xd0, 0xbd, 0x59, 0x4e, 0x40, 0x6b, 0x95, 0x03, 0x29, 0xd5, 0x24, 0x2e, 0x5e, 0x58, 0x80, 0xb5, 0x3a, 0xaa, 0x0e, 0xb5, 0x7c, 0x66, 0x99, 0x20, 0x55, 0xc4, 0xff, 0xab, 0xc0, 0xa7, 0x2a, 0xe7, 0x12, 0xde, 0x42, 0xad, 0xd2, 0xa3, 0x21, 0xc0, 0xca, 0x68, 0x08 ],
+const [ 0x6b, 0x8d, 0xb9, 0xac, 0xdf, 0xd2, 0x41, 0x50, 0x80, 0x8a, 0x92, 0x36, 0x85, 0x96, 0x55, 0x71, 0x81, 0xd4, 0x45, 0xe5, 0xa0, 0x4e, 0x91, 0x11, 0x2d, 0xb2, 0x81, 0x2b, 0x58, 0x03, 0x5d, 0x72, 0x37, 0x8d, 0x8b, 0xc0, 0x0a, 0x1e, 0xf7, 0x5e, 0xc3, 0x73, 0xb8, 0x1d, 0xc6, 0xf1, 0xf0, 0xa2, 0xed, 0x96, 0xf3, 0x02, 0xcf, 0x2e, 0xac, 0x8f, 0x42, 0xca, 0x3d, 0xf1, 0x1e, 0x6e, 0xe6, 0x78, 0x44, 0x0a, 0x28, 0xb0, 0xdf, 0xab, 0x2a, 0x36, 0xea, 0xf3, 0x5b, 0xcb, 0xf3, 0xc7, 0x59, 0xa7, 0x1e, 0x47, 0x12, 0x0f, 0x6c, 0x03, 0x29, 0x2a, 0x3d, 0x6b, 0x9b, 0x11, 0x14, 0x88, 0xa2, 0x25, 0x9b, 0xea, 0xd9, 0xa5, 0xe7, 0xe2, 0xa1, 0x80, 0xfc, 0xf1, 0xc4, 0x67, 0x94, 0x7f, 0x59, 0x27, 0x1c, 0xd0, 0xe8, 0x36, 0x00, 0x35, 0xce, 0x8b, 0x28, 0x7f, 0xe2, 0xb3, 0xc3, 0xb9, 0x58, 0x22 ],
+const [ 0x13, 0x8e, 0xfc, 0x83, 0x2c, 0x64, 0x51, 0x3d, 0x11, 0xb9, 0x87, 0x3c, 0x6f, 0xd4, 0xd8, 0xa6, 0x5d, 0xbf, 0x36, 0x70, 0x92, 0xa8, 0x26, 0xdd, 0xd5, 0x87, 0xd1, 0x41, 0xb4, 0x01, 0x58, 0x0b, 0x79, 0x8c, 0x69, 0x02, 0x5a, 0xd5, 0x10, 0xcf, 0xf0, 0x5f, 0xcf, 0xbc, 0xeb, 0x6c, 0xf0, 0xbb, 0x03, 0x20, 0x1a, 0xaa, 0x32, 0xe4, 0x23, 0xd5, 0x20, 0x09, 0x25, 0xbd, 0xdf, 0xad, 0xd4, 0x18, 0xd8, 0xe3, 0x0e, 0x18, 0x05, 0x0e, 0xb4, 0xf0, 0x61, 0x8e, 0xb9, 0x95, 0x9d, 0x9f, 0x78, 0xc1, 0x15, 0x7d, 0x4b, 0x3e, 0x02, 0xcd, 0x59, 0x61, 0xf1, 0x38, 0xaf, 0xd5, 0x74, 0x59, 0x93, 0x99, 0x17, 0xd9, 0x14, 0x4c, 0x95, 0xd8, 0xe6, 0xa9, 0x4c, 0x8f, 0x6d, 0x4e, 0xef, 0x34, 0x18, 0xc1, 0x7b, 0x1e, 0xf0, 0xb4, 0x6c, 0x2a, 0x71, 0x88, 0x30, 0x5d, 0x98, 0x11, 0xdc, 0xcb, 0x3d, 0x99 ],
+];
+
+const hmac_sha256_keys = const [
+const [ 0x6f, 0x35, 0x62, 0x8d, 0x65, 0x81, 0x34, 0x35, 0x53, 0x4b, 0x5d, 0x67, 0xfb, 0xdb, 0x54, 0xcb, 0x33, 0x40, 0x3d, 0x04, 0xe8, 0x43, 0x10, 0x3e, 0x63, 0x99, 0xf8, 0x06, 0xcb, 0x5d, 0xf9, 0x5f, 0xeb, 0xbd, 0xd6, 0x12, 0x36, 0xf3, 0x32, 0x45 ],
+const [ 0x17, 0xb5, 0x28, 0x58, 0xe3, 0xe1, 0x35, 0xbe, 0x44, 0x40, 0xd7, 0xdf, 0x0c, 0xa9, 0x96, 0xf4, 0x1c, 0xcb, 0x78, 0xb7, 0xd8, 0xcc, 0x19, 0x24, 0xd8, 0x30, 0xfe, 0x81, 0xe0, 0xfd, 0x27, 0x9c, 0x13, 0x1c, 0xe3, 0x54, 0x63, 0x03, 0xe9, 0x5a ],
+const [ 0x7c, 0x67, 0x41, 0x0e, 0x0a, 0x9e, 0x3d, 0x7a, 0xe4, 0xf3, 0xd0, 0x4e, 0xff, 0x1c, 0x27, 0x16, 0x89, 0x1e, 0x82, 0x1c, 0x6e, 0xc1, 0xdc, 0x82, 0x21, 0x42, 0xce, 0x8d, 0x99, 0x49, 0xb1, 0x44, 0x9a, 0x1a, 0x03, 0x3a, 0x35, 0x0f, 0x0b, 0xa8 ],
+const [ 0xb2, 0xc4, 0x50, 0x12, 0x8d, 0x07, 0x44, 0x42, 0x1c, 0x3f, 0x31, 0xfa, 0xb3, 0x7b, 0xbc, 0xdf, 0xb5, 0xa2, 0xff, 0x2f, 0xb7, 0x06, 0xd1, 0xf7, 0xe2, 0x3c, 0x48, 0x86, 0x99, 0x2c, 0x7d, 0x21, 0x5c, 0x64, 0x8f, 0xf8, 0xed, 0xb2, 0xeb, 0x59 ],
+const [ 0xa7, 0x74, 0x43, 0x21, 0xd7, 0x39, 0x38, 0xb8, 0xee, 0xa1, 0x37, 0x54, 0x90, 0x90, 0x29, 0x88, 0x1b, 0xbd, 0x72, 0x74, 0x39, 0xfe, 0x27, 0x31, 0xb1, 0xc6, 0x7b, 0x70, 0x83, 0xeb, 0x7b, 0x5d, 0x33, 0xad, 0xfc, 0xca, 0x65, 0xf5, 0xd1, 0x89 ],
+const [ 0x79, 0x5a, 0x0b, 0xa9, 0xb0, 0x29, 0x84, 0xcf, 0xce, 0x5e, 0x73, 0x95, 0xfb, 0x94, 0xd9, 0x8f, 0xcf, 0x12, 0xae, 0x5d, 0xb8, 0xa0, 0x6e, 0x23, 0x9c, 0x9a, 0xd4, 0x39, 0xbf, 0x42, 0xe5, 0x23, 0xe6, 0x5a, 0x31, 0xc3, 0xbd, 0xf3, 0x56, 0xcd ],
+const [ 0xaa, 0x41, 0xb5, 0x22, 0x2e, 0xfd, 0xea, 0x88, 0x2c, 0xbe, 0xbd, 0x11, 0xd3, 0x43, 0x00, 0x0e, 0xc2, 0xff, 0x6b, 0x2f, 0x7b, 0xbf, 0xa7, 0x46, 0x15, 0x8e, 0xa5, 0x4f, 0x32, 0xd5, 0x34, 0xae, 0x31, 0xc7, 0xd3, 0xb7, 0xa5, 0xfc, 0xc3, 0x73 ],
+const [ 0xaa, 0xa4, 0x49, 0x92, 0x3f, 0x0c, 0xd3, 0xe6, 0xa7, 0xe7, 0x4d, 0x9c, 0x56, 0xa7, 0xeb, 0x6a, 0x3b, 0x4c, 0x3d, 0xea, 0x97, 0xe6, 0xa8, 0x40, 0x0e, 0x55, 0x17, 0xfc, 0xff, 0x54, 0xee, 0x42, 0x11, 0xb6, 0x40, 0x28, 0x0e, 0xee, 0x41, 0x5f ],
+const [ 0x6c, 0x13, 0xd7, 0x4e, 0xd0, 0x04, 0xee, 0x92, 0xad, 0xb4, 0x4b, 0x75, 0x5b, 0xe9, 0x2e, 0x84, 0x40, 0x43, 0x47, 0x04, 0xa1, 0xc2, 0x27, 0x90, 0xb7, 0x88, 0xf5, 0x04, 0x06, 0xe0, 0x62, 0x9a, 0xea, 0x80, 0xde, 0x53, 0x73, 0x0b, 0x0d, 0x99 ],
+const [ 0x12, 0x54, 0x1d, 0x81, 0xc6, 0x95, 0x82, 0x21, 0xc4, 0x4a, 0x95, 0x8e, 0xcd, 0x7f, 0x48, 0xc0, 0x8a, 0x89, 0xa8, 0x68, 0x7d, 0x30, 0x6c, 0x2f, 0x38, 0x14, 0xc9, 0x3e, 0xcd, 0x49, 0x8e, 0x04, 0x85, 0x45, 0x6c, 0x33, 0xd5, 0xfc, 0x95, 0x0c ],
+const [ 0xa1, 0xe8, 0xcf, 0x95, 0xc6, 0xd7, 0x29, 0x50, 0x76, 0x61, 0xfc, 0xc6, 0x87, 0x15, 0x69, 0x22, 0xc8, 0x97, 0x56, 0x45, 0xe5, 0xf3, 0x6e, 0xba, 0x8a, 0x30, 0x69, 0xec, 0xcb, 0x29, 0x8e, 0x96, 0xc4, 0x98, 0x76, 0x7c, 0x7c, 0x74, 0x12, 0x59 ],
+const [ 0xc7, 0xe5, 0xed, 0xe1, 0x52, 0xc5, 0x0a, 0x93, 0x5e, 0x76, 0xb5, 0x99, 0x79, 0xe0, 0x86, 0x38, 0xa0, 0x9c, 0xff, 0xfd, 0x01, 0xac, 0x70, 0x08, 0x05, 0x6a, 0x18, 0xab, 0x8e, 0xbf, 0x8d, 0x34, 0x7e, 0x95, 0x5e, 0x06, 0x78, 0x8f, 0xf6, 0xef ],
+const [ 0x6a, 0xb3, 0x7b, 0xe6, 0x4f, 0x4b, 0x1e, 0x03, 0x2c, 0x5a, 0x43, 0xdc, 0x03, 0xe4, 0xaf, 0xb6, 0x5c, 0x6a, 0xb1, 0x32, 0x9f, 0xbc, 0xa9, 0xc4, 0xc1, 0x0f, 0xc7, 0x66, 0x22, 0x4f, 0x15, 0x8e, 0xb6, 0xb7, 0xb8, 0x5d, 0x64, 0x9e, 0x73, 0x19 ],
+const [ 0x78, 0x5a, 0x11, 0x89, 0x38, 0x18, 0x24, 0xa8, 0x13, 0x1e, 0x88, 0x5b, 0xa4, 0xb2, 0x3c, 0x2e, 0x94, 0xe3, 0xdf, 0xdc, 0x03, 0x65, 0x2c, 0xc3, 0x2a, 0x9c, 0xc1, 0x96, 0x3f, 0xf7, 0x24, 0x52, 0x99, 0x7f, 0x07, 0x73, 0x15, 0xb0, 0xcb, 0x67 ],
+const [ 0x39, 0x45, 0x75, 0xdd, 0xed, 0x53, 0x10, 0x00, 0xe7, 0x76, 0xae, 0x4a, 0xdc, 0x64, 0xc4, 0xaf, 0xfb, 0x5b, 0x22, 0x0a, 0xc5, 0xa9, 0x6e, 0xbf, 0x1f, 0x72, 0xd1, 0x9f, 0xa6, 0xae, 0xf0, 0x0c, 0x42, 0x71, 0x1e, 0x5d, 0xfe, 0x6f, 0xcf, 0x84 ],
+const [ 0x14, 0xd4, 0x5c, 0xa2, 0xa3, 0xd4, 0x97, 0x7d, 0xab, 0x2b, 0x7d, 0x44, 0x2c, 0x6f, 0x9e, 0x57, 0xce, 0x34, 0x8e, 0x0a, 0x6a, 0x80, 0x8b, 0xb3, 0xcc, 0x7f, 0x60, 0x02, 0xb8, 0x77, 0x89, 0x91, 0x2a, 0xfd, 0x98, 0xbc, 0xe2, 0x6a, 0xd8, 0xb3 ],
+const [ 0x2a, 0x04, 0x66, 0xdd, 0x51, 0x5d, 0x2f, 0x48, 0xfe, 0xc5, 0xe7, 0x8e, 0x22, 0xbb, 0x22, 0xc6, 0x06, 0xb0, 0x9e, 0x81, 0x84, 0x69, 0x1c, 0x51, 0x77, 0xa4, 0x6e, 0x8c, 0x70, 0xfe, 0xd2, 0x4d, 0xab, 0x14, 0x7e, 0xbc, 0x41, 0xe9, 0x7c, 0x8f ],
+const [ 0x3a, 0x41, 0x82, 0xaf, 0x8c, 0x39, 0x14, 0xd1, 0xdf, 0x57, 0xb6, 0x32, 0x1f, 0xa5, 0xde, 0xc6, 0x87, 0x48, 0xad, 0x74, 0x6e, 0x03, 0x69, 0xbb, 0x64, 0xfc, 0x2d, 0x9b, 0x7d, 0xc3, 0xdf, 0xb3, 0xed, 0x90, 0x63, 0xa7, 0xd5, 0xcc, 0x0e, 0xc4 ],
+const [ 0x56, 0xe8, 0xad, 0xa1, 0xeb, 0xc8, 0x70, 0x6b, 0x94, 0xf9, 0x9b, 0xf2, 0x29, 0x03, 0x65, 0x22, 0x2f, 0x66, 0x19, 0xa7, 0xfc, 0x31, 0x61, 0x15, 0x1c, 0xd0, 0xc5, 0x66, 0xf4, 0x26, 0x6f, 0xaa, 0xa5, 0xdc, 0x31, 0xfa, 0x34, 0xf8, 0xc9, 0xae ],
+const [ 0x1e, 0x6d, 0x00, 0xb3, 0x86, 0xbb, 0xbf, 0xb7, 0xf4, 0x40, 0x01, 0xc5, 0x91, 0x54, 0x48, 0xa5, 0x16, 0x95, 0x4d, 0x7a, 0x2a, 0xe8, 0xf4, 0xe9, 0xea, 0xba, 0x80, 0x7d, 0xc9, 0x8c, 0x03, 0x4a, 0x9a, 0xae, 0x19, 0xd1, 0xeb, 0x4a, 0xd6, 0x24 ],
+const [ 0xe2, 0x12, 0x7a, 0x48, 0xf6, 0x15, 0xee, 0xaf, 0xb9, 0x27, 0xee, 0x53, 0x22, 0x2f, 0x50, 0x04, 0xd1, 0x1d, 0xd2, 0xd3, 0xa2, 0x2e, 0x53, 0x77, 0x82, 0x6b, 0x43, 0xf0, 0x81, 0x74, 0x58, 0x6a, 0x29, 0x7b, 0x82, 0x63, 0x0e, 0x93, 0x22, 0x10 ],
+const [ 0xee, 0x0a, 0x81, 0xa8, 0xbd, 0x52, 0xc9, 0xb1, 0x42, 0x20, 0x83, 0x52, 0x2d, 0x37, 0xf8, 0x07, 0x18, 0x96, 0xba, 0x62, 0x5f, 0xfa, 0x22, 0xad, 0x32, 0xa4, 0xfd, 0xd1, 0xe8, 0x5c, 0x83, 0x77, 0x96, 0xb6, 0x89, 0x6c, 0xe1, 0x94, 0xf7, 0x4a ],
+const [ 0xd4, 0x25, 0x46, 0x94, 0xca, 0x38, 0x67, 0x64, 0x04, 0xcc, 0x2c, 0xd6, 0xa4, 0x44, 0xf6, 0x1e, 0x23, 0x0c, 0x18, 0x8a, 0x9f, 0x92, 0xd4, 0xad, 0x76, 0x92, 0x87, 0xbc, 0x13, 0x97, 0x20, 0x38, 0x08, 0xbf, 0xd6, 0xcd, 0x5d, 0xbe, 0x1b, 0x7b ],
+const [ 0x61, 0xb8, 0x3d, 0x7f, 0xf9, 0xb8, 0x2b, 0x32, 0xa8, 0x92, 0x25, 0xea, 0xcd, 0x7c, 0x9c, 0x25, 0x80, 0x7c, 0x8d, 0xba, 0xc8, 0xcf, 0x56, 0x61, 0x0e, 0x88, 0xc8, 0x75, 0xd2, 0x79, 0x7d, 0xf9, 0x9d, 0x56, 0x6b, 0xda, 0x37, 0x18, 0xba, 0x73 ],
+const [ 0xad, 0xf1, 0x3d, 0x80, 0xee, 0xf1, 0x35, 0xf3, 0xcb, 0xfe, 0x63, 0xac, 0x19, 0xe8, 0x67, 0x9b, 0x98, 0xc0, 0x1d, 0xfd, 0x26, 0x3d, 0x72, 0xdb, 0x33, 0x5e, 0x76, 0xd4, 0x75, 0x51, 0xb3, 0x1d, 0xdd, 0x94, 0xbe, 0xc6, 0xc9, 0x5a, 0x0b, 0x3f ],
+const [ 0xf8, 0x70, 0xe2, 0x6d, 0xd4, 0x7b, 0x20, 0xd3, 0x86, 0xf6, 0x3d, 0x12, 0x45, 0x8c, 0x46, 0xd7, 0x95, 0xfe, 0x07, 0x90, 0xbd, 0xc8, 0x1d, 0x2e, 0x7c, 0x02, 0x53, 0x29, 0xf8, 0x84, 0x2b, 0xc5, 0xf7, 0x4d, 0xba, 0x95, 0x51, 0x26, 0xb9, 0x3d ],
+const [ 0xcd, 0x4f, 0x85, 0xa0, 0x44, 0xea, 0xf7, 0xc5, 0xa9, 0x85, 0x0d, 0x0d, 0x70, 0x8f, 0x09, 0x05, 0x04, 0x9d, 0xc2, 0x77, 0x18, 0x67, 0x9a, 0x8f, 0x37, 0x13, 0xaf, 0x3c, 0xa3, 0xb7, 0x56, 0xd9, 0x5c, 0x19, 0xc5, 0x0d, 0x7f, 0xb9, 0x0f, 0xf0 ],
+const [ 0xe6, 0xe9, 0x7a, 0x28, 0x6f, 0x57, 0x58, 0x55, 0xce, 0xc8, 0xa0, 0xf4, 0xd0, 0x63, 0x27, 0x92, 0x9d, 0x41, 0xf8, 0x1d, 0x3f, 0xda, 0xf9, 0xf6, 0x5e, 0xbd, 0xcc, 0x47, 0x4d, 0x85, 0xf4, 0x97, 0x4b, 0x08, 0x39, 0x9c, 0x02, 0xd1, 0x4d, 0x50 ],
+const [ 0xd7, 0x63, 0xc6, 0x36, 0x07, 0x63, 0x56, 0x1e, 0xd2, 0xbf, 0x47, 0x74, 0x90, 0x80, 0x54, 0x9b, 0x6e, 0x2d, 0xb8, 0x75, 0x14, 0xe1, 0xee, 0x1c, 0x85, 0xa0, 0xbb, 0xd3, 0x46, 0xeb, 0x6e, 0x3c, 0xc2, 0x92, 0x67, 0xcb, 0xed, 0xca, 0xd6, 0x7a ],
+const [ 0xa4, 0xb5, 0x40, 0x97, 0x1d, 0x9b, 0xdb, 0x20, 0xb4, 0x7e, 0x82, 0x82, 0xca, 0xc8, 0x41, 0xa8, 0x6f, 0xd9, 0x4f, 0xff, 0x27, 0xb4, 0xee, 0xcf, 0xee, 0xf8, 0x93, 0xcb, 0x7b, 0x13, 0x47, 0xe7, 0xc2, 0xb2, 0x4d, 0x69, 0xbc, 0x7b, 0x05, 0x43 ],
+const [ 0x97, 0x79, 0xd9, 0x12, 0x06, 0x42, 0x79, 0x7f, 0x17, 0x47, 0x02, 0x5d, 0x5b, 0x22, 0xb7, 0xac, 0x60, 0x7c, 0xab, 0x08, 0xe1, 0x75, 0x8f, 0x2f, 0x3a, 0x46, 0xc8, 0xbe, 0x1e, 0x25, 0xc5, 0x3b, 0x8c, 0x6a, 0x8f, 0x58, 0xff, 0xef, 0xa1, 0x76 ],
+const [ 0x09, 0x67, 0x5f, 0x2d, 0xcc, 0x47, 0x83, 0xb5, 0x99, 0xf1, 0x8f, 0xb7, 0x65, 0x58, 0x36, 0x68, 0xa0, 0xfd, 0x8a, 0xe4, 0x09, 0x6f, 0x6f, 0xcd, 0xc6, 0x0d, 0x4f, 0x35, 0xb4, 0x13, 0x0f, 0xbe, 0xfc, 0xd5, 0x42, 0xff, 0xe7, 0x45, 0x9d, 0x2a ],
+const [ 0xcf, 0xd4, 0xa4, 0x49, 0x10, 0xc9, 0xe5, 0x67, 0x50, 0x7a, 0xbb, 0x6c, 0xed, 0xe4, 0xfe, 0x60, 0x1a, 0x7a, 0x27, 0x65, 0xc9, 0x75, 0x5a, 0xa2, 0xcf, 0x6b, 0xa4, 0x81, 0x42, 0x23, 0x81, 0x1a, 0x26, 0xa8, 0xa1, 0xef, 0x49, 0x9c, 0xeb, 0xd9 ],
+const [ 0x54, 0x48, 0x99, 0x8f, 0x9d, 0x8f, 0x98, 0x53, 0x4a, 0xdd, 0xf0, 0xc8, 0xba, 0x63, 0x1c, 0x49, 0x6b, 0xf8, 0xa8, 0x00, 0x6c, 0xbb, 0x46, 0xad, 0x15, 0xfa, 0x1f, 0xa2, 0xf5, 0x53, 0x67, 0x12, 0x0c, 0x19, 0x34, 0x8c, 0x3a, 0xfa, 0x90, 0xc3 ],
+const [ 0x9d, 0xa0, 0xc1, 0x14, 0x68, 0x2f, 0x82, 0xc1, 0xd1, 0xe9, 0xb5, 0x44, 0x30, 0x58, 0x0b, 0x9c, 0x56, 0x94, 0x89, 0xca, 0x16, 0xb9, 0x2e, 0xe1, 0x04, 0x98, 0xd5, 0x5d, 0x7c, 0xad, 0x5d, 0xb5, 0xe6, 0x52, 0x06, 0x34, 0x39, 0x31, 0x1e, 0x04 ],
+const [ 0xaa, 0xaf, 0xd0, 0x8f, 0xd8, 0x9b, 0xeb, 0xe2, 0x39, 0xab, 0x65, 0xbb, 0x19, 0x0b, 0x86, 0xd4, 0x9c, 0x5d, 0x39, 0xfa, 0xa5, 0x0b, 0x11, 0x09, 0xf7, 0xdc, 0x8b, 0x17, 0x9b, 0xc6, 0x93, 0xf0, 0x81, 0x04, 0x49, 0xc3, 0x6a, 0x68, 0x04, 0x1a ],
+const [ 0xb0, 0x6f, 0x7c, 0xa7, 0xa5, 0xdd, 0x8b, 0xaf, 0x2c, 0xa9, 0x40, 0x81, 0x1e, 0xda, 0xd8, 0x7a, 0x33, 0xda, 0x66, 0x6d, 0xc4, 0x27, 0xbc, 0xf4, 0xd5, 0x4a, 0x8e, 0x03, 0x52, 0x0d, 0xd5, 0xc3, 0x99, 0xe9, 0x72, 0x9d, 0x39, 0xbe, 0x14, 0x94 ],
+const [ 0x2d, 0xff, 0x35, 0xc2, 0xfe, 0x50, 0x39, 0x12, 0x3d, 0x4c, 0x5d, 0x9f, 0xeb, 0x7d, 0x51, 0x67, 0xe3, 0xe9, 0x59, 0xb3, 0x18, 0x41, 0xab, 0xec, 0x1e, 0x5b, 0x18, 0xb0, 0xec, 0xe2, 0xef, 0x25, 0xe0, 0x4d, 0x1f, 0x8d, 0x03, 0x0d, 0x9b, 0x1b ],
+const [ 0x97, 0x94, 0xcf, 0x76, 0xae, 0xef, 0x22, 0x96, 0x3f, 0xa4, 0x0a, 0x09, 0xa8, 0x6b, 0xf0, 0xe2, 0xba, 0x9f, 0x54, 0xf3, 0x0f, 0x43, 0xbf, 0xf0, 0x9d, 0x44, 0xf9, 0xd2, 0x8c, 0xfd, 0x7b, 0x7a, 0x45, 0x00, 0x27, 0x97, 0xcc, 0x14, 0x37, 0xc9 ],
+const [ 0xc1, 0xd6, 0x08, 0x14, 0x37, 0x6a, 0xae, 0x39, 0xc4, 0x11, 0x12, 0x46, 0x35, 0x34, 0x85, 0x95, 0x8f, 0x95, 0x55, 0x8f, 0xa3, 0x8f, 0xfc, 0x14, 0xe4, 0xa0, 0x98, 0x1d, 0x76, 0x24, 0x9b, 0x9f, 0x87, 0x63, 0xc4, 0xb3, 0xe2, 0xce, 0x4e, 0xf5 ],
+const [ 0xca, 0x5f, 0x3e, 0xb9, 0x30, 0x86, 0x04, 0xf9, 0xfc, 0xc2, 0xaf, 0x1c, 0x6a, 0x31, 0x75, 0xcd, 0x8a, 0x75, 0x04, 0x55, 0x93, 0xb4, 0x73, 0xbd, 0x7a, 0xe3, 0x79, 0x33, 0xc3, 0x45, 0xdd, 0xb0, 0x98, 0x2e, 0x2d, 0xd7, 0x18, 0x0d, 0xb3, 0x1f ],
+const [ 0x80, 0x8d, 0x7a, 0xa9, 0xab, 0xa6, 0xa4, 0x0d, 0x1b, 0xc4, 0x3e, 0x9b, 0x93, 0x2e, 0xc8, 0xe9, 0x27, 0x3b, 0x89, 0x2f, 0xfc, 0x0a, 0x76, 0x9e, 0x4f, 0x72, 0x55, 0xf3, 0xb8, 0x3c, 0x22, 0x4b, 0xb0, 0x90, 0xb2, 0x39, 0x52, 0xae, 0x96, 0x16 ],
+const [ 0xd8, 0xb9, 0x94, 0xbb, 0x8d, 0xf0, 0x2d, 0x78, 0x03, 0xca, 0x2e, 0x09, 0xd6, 0x01, 0xb9, 0x18, 0xd6, 0xb5, 0xbd, 0xe9, 0x0b, 0x61, 0x1b, 0xeb, 0xf7, 0x0e, 0x07, 0x8d, 0x1a, 0xc7, 0xb1, 0x52, 0xbc, 0x4c, 0x25, 0x28, 0xe6, 0x0b, 0x70, 0xf6 ],
+const [ 0xa8, 0x9b, 0xba, 0xa8, 0x6a, 0x33, 0x99, 0x51, 0xdd, 0xcd, 0x37, 0x79, 0x9e, 0x21, 0xb5, 0xd1, 0x68, 0x8e, 0x4a, 0xbe, 0xdb, 0xc7, 0x2d, 0xaf, 0x7c, 0xc9, 0xb5, 0xad, 0xfe, 0x10, 0xbe, 0x34, 0xc0, 0x0a, 0x50, 0x41, 0x96, 0xcc, 0x7b, 0xac ],
+const [ 0xa9, 0x56, 0x0f, 0xd6, 0x17, 0x46, 0xd7, 0xf9, 0x86, 0xb6, 0x91, 0xf0, 0x70, 0xc9, 0x20, 0x25, 0x6a, 0x53, 0x5c, 0x21, 0xa6, 0x4a, 0xb5, 0xa2, 0xbd, 0x77, 0x1a, 0xee, 0xab, 0x71, 0x19, 0x68, 0x1b, 0xcc, 0x47, 0x61, 0xe6, 0x8e, 0xe2, 0x30 ],
+const [ 0xf9, 0x87, 0xeb, 0x83, 0xa3, 0xfd, 0x6d, 0x94, 0xeb, 0xf3, 0x62, 0x6b, 0x7d, 0x34, 0xfe, 0xc2, 0x3e, 0xe0, 0x6c, 0x63, 0xdf, 0xb4, 0x07, 0x8c, 0xb3, 0x8b, 0xcc, 0x97, 0xbd, 0x25, 0x0f, 0xda, 0x0e, 0x28, 0x6e, 0xcd, 0x4e, 0x64, 0x04, 0x6a, 0x98, 0x5b, 0xdf, 0xda, 0x8b ],
+const [ 0xef, 0x25, 0x71, 0x32, 0xb7, 0xbe, 0x12, 0x4e, 0xa0, 0x88, 0x6d, 0x58, 0x77, 0x65, 0xe8, 0xe7, 0x03, 0x57, 0x95, 0x9c, 0xf3, 0x9e, 0xbf, 0x62, 0x14, 0x20, 0xc3, 0xf3, 0xc7, 0x0e, 0x21, 0x9f, 0xb3, 0xc5, 0xd3, 0x49, 0xb7, 0xf2, 0xde, 0xb2, 0x22, 0xfa, 0x26, 0xfa, 0x27 ],
+const [ 0x2c, 0xb8, 0xe2, 0x69, 0x72, 0x6b, 0x75, 0xe3, 0xa6, 0x25, 0x85, 0x41, 0x25, 0x1f, 0x6e, 0x3c, 0x51, 0x84, 0xc5, 0xe6, 0x87, 0x8d, 0xec, 0xea, 0x51, 0xea, 0xe3, 0x15, 0xdc, 0x65, 0x61, 0x15, 0xac, 0xc2, 0x24, 0x81, 0x8e, 0xe9, 0x85, 0x1a, 0xce, 0x47, 0x4f, 0x51, 0xab ],
+const [ 0x1e, 0xea, 0x90, 0x6c, 0xa1, 0x14, 0x32, 0x65, 0x57, 0x50, 0xa4, 0xe1, 0xaf, 0x21, 0xeb, 0x1e, 0x03, 0x46, 0x5c, 0x6d, 0x6f, 0x3b, 0x0f, 0xd8, 0xe2, 0x03, 0x91, 0x07, 0x75, 0x25, 0xd9, 0x65, 0xfc, 0xf5, 0x7d, 0x7e, 0xdb, 0x14, 0x26, 0xab, 0x1c, 0x3a, 0x42, 0xf2, 0xbe ],
+const [ 0xb2, 0xf1, 0xad, 0xfb, 0xbd, 0xe4, 0xdd, 0x9a, 0x96, 0x74, 0x16, 0x6e, 0xe0, 0x8c, 0x2f, 0x43, 0x41, 0x07, 0x24, 0x75, 0xb9, 0xb8, 0x0b, 0x10, 0x32, 0xad, 0x4a, 0x36, 0x58, 0xb4, 0x08, 0xc1, 0xaa, 0x1f, 0xe1, 0x2a, 0xd1, 0xc5, 0xde, 0xaa, 0x31, 0x49, 0xa4, 0x9e, 0xbf ],
+const [ 0xa2, 0x61, 0x72, 0x06, 0xe2, 0xb3, 0x82, 0x07, 0x8f, 0xdd, 0xb0, 0xaf, 0x37, 0x43, 0xa6, 0x9a, 0x5a, 0x74, 0x84, 0xee, 0xcf, 0xff, 0x6c, 0xd9, 0x62, 0x88, 0x44, 0x3b, 0xc2, 0x1a, 0xb7, 0x9f, 0x9b, 0xbf, 0x7d, 0x70, 0xff, 0x4e, 0xdd, 0x6a, 0x0a, 0x85, 0x70, 0x4e, 0xc6 ],
+const [ 0x7a, 0xf1, 0x97, 0xb7, 0x8a, 0x27, 0x03, 0x8b, 0x0c, 0xec, 0x12, 0x80, 0x01, 0xce, 0x6b, 0xb7, 0xdc, 0x02, 0xc0, 0x25, 0x89, 0x56, 0xf6, 0x2e, 0xad, 0x67, 0x86, 0x76, 0x30, 0x14, 0x23, 0xf4, 0xf9, 0x32, 0x9d, 0x48, 0xf8, 0x81, 0x05, 0x4e, 0x6a, 0xdf, 0x12, 0xf3, 0x58 ],
+const [ 0x96, 0xab, 0x1d, 0x64, 0xac, 0xad, 0x8c, 0xf6, 0x96, 0x51, 0xc1, 0x3e, 0x4e, 0xb4, 0x2d, 0x73, 0x82, 0xe3, 0x80, 0x19, 0xf3, 0xa9, 0x27, 0x77, 0x1b, 0xa6, 0x13, 0x4c, 0x12, 0xa1, 0xbd, 0xbe, 0xb2, 0x20, 0x67, 0x93, 0xfa, 0x35, 0xa4, 0xa3, 0xb0, 0x9a, 0x1a, 0x8d, 0x4a ],
+const [ 0x58, 0x2c, 0x13, 0xa6, 0xc4, 0xd4, 0x97, 0xe4, 0xed, 0xf6, 0x9b, 0xde, 0x35, 0xbe, 0xaa, 0xba, 0xba, 0x1b, 0x06, 0x8e, 0xd1, 0x68, 0xaf, 0x20, 0xb0, 0x4c, 0xc2, 0xf0, 0x6a, 0xdf, 0x04, 0x78, 0x21, 0x0e, 0xbf, 0xb2, 0x76, 0x40, 0xcd, 0xdb, 0x45, 0x3a, 0xf2, 0x77, 0x90 ],
+const [ 0xba, 0xf1, 0xd8, 0xaa, 0x12, 0xf5, 0xea, 0x62, 0x64, 0xd1, 0x22, 0x93, 0x85, 0x93, 0xa8, 0xd6, 0x77, 0xc8, 0x2a, 0x37, 0xeb, 0xed, 0x7b, 0x43, 0x04, 0x26, 0x80, 0x62, 0x5e, 0x33, 0x4c, 0x67, 0x4f, 0x9f, 0x8a, 0x66, 0x6c, 0x3a, 0x1b, 0xc5, 0x4f, 0xca, 0x01, 0x96, 0x98 ],
+const [ 0x73, 0x5d, 0x94, 0x3c, 0xc9, 0x3f, 0x78, 0x30, 0x50, 0xc7, 0xcc, 0xb0, 0x9a, 0xcc, 0x5a, 0x6f, 0x60, 0xaf, 0x4e, 0xfb, 0xc8, 0x91, 0x97, 0x93, 0xe7, 0xc3, 0x90, 0x38, 0x85, 0x7e, 0xe0, 0x06, 0x21, 0xd5, 0x9f, 0xc5, 0x35, 0xe7, 0xba, 0xbc, 0xbc, 0x59, 0x98, 0xc5, 0xf0 ],
+const [ 0xc7, 0x82, 0x59, 0x71, 0x41, 0xb5, 0x21, 0x35, 0xe3, 0x4d, 0x24, 0x0d, 0xf6, 0x7b, 0x9b, 0xdc, 0x27, 0x4f, 0x2d, 0x41, 0xe6, 0x86, 0x6e, 0x0f, 0x0d, 0xa3, 0xa6, 0xfe, 0xc2, 0x41, 0xd3, 0xa0, 0x9e, 0xa7, 0xf1, 0x96, 0x0f, 0x9d, 0x78, 0x03, 0xfa, 0x7e, 0x27, 0x41, 0xa5 ],
+const [ 0x49, 0x85, 0x84, 0xe3, 0x64, 0xf6, 0x32, 0x18, 0x4b, 0xf2, 0x6a, 0x25, 0x3d, 0x0e, 0x81, 0xe1, 0x46, 0x73, 0x09, 0x63, 0xb7, 0x85, 0xea, 0xc1, 0xd5, 0xc2, 0xb5, 0x1d, 0xce, 0xec, 0x34, 0xe3, 0xf1, 0x6a, 0x46, 0x4c, 0x1d, 0xec, 0xe9, 0x27, 0x7a, 0x4e, 0x99, 0xd8, 0x68 ],
+const [ 0xe4, 0x29, 0x84, 0x64, 0xa0, 0x45, 0x7d, 0xcf, 0x98, 0xef, 0x09, 0xcc, 0x00, 0xd9, 0x22, 0x38, 0xd0, 0x6d, 0x9a, 0x75, 0x74, 0xb4, 0x67, 0x69, 0xc5, 0x77, 0x3e, 0xc9, 0x39, 0xa4, 0x63, 0x97, 0x56, 0xf2, 0xbf, 0xe9, 0x6d, 0xc8, 0x33, 0xed, 0x84, 0x5c, 0x2c, 0x2a, 0x94 ],
+const [ 0x28, 0xae, 0x9e, 0x32, 0x79, 0x11, 0xb7, 0x68, 0x98, 0xaf, 0x1f, 0xa0, 0xde, 0x56, 0x06, 0x9e, 0x0d, 0x8b, 0x67, 0xbd, 0x28, 0x13, 0x82, 0x8f, 0x87, 0xb8, 0x8d, 0xc4, 0x2a, 0x49, 0xa7, 0x4d, 0x4e, 0xe3, 0x0d, 0xc1, 0x3e, 0x6f, 0x90, 0xff, 0x6c, 0x6c, 0x47, 0x15, 0xc0 ],
+const [ 0x91, 0x17, 0xcf, 0x3c, 0xe9, 0xf5, 0xc6, 0xe1, 0x97, 0x52, 0xbf, 0x0b, 0x1c, 0xf8, 0x6a, 0x78, 0xce, 0x3a, 0xdb, 0xba, 0x87, 0xda, 0xe1, 0x39, 0x9a, 0x2a, 0x93, 0x7b, 0x0b, 0x72, 0x2b, 0xa3, 0xff, 0x92, 0x18, 0x38, 0x71, 0xe8, 0x4e, 0x28, 0x27, 0x74, 0xe1, 0x0d, 0xe4 ],
+const [ 0x36, 0x3b, 0x32, 0xac, 0xcf, 0xa5, 0x93, 0xe4, 0x54, 0xcc, 0x3e, 0xc8, 0x3b, 0x9d, 0x77, 0x5a, 0x0d, 0xd0, 0x27, 0xb0, 0x17, 0xca, 0x2f, 0xf8, 0x63, 0xc1, 0xfc, 0xb9, 0xe6, 0x21, 0x5b, 0x5c, 0xfb, 0x2e, 0x8f, 0xea, 0x10, 0xeb, 0xa2, 0x17, 0x9f, 0x3b, 0xf8, 0x80, 0x61 ],
+const [ 0x13, 0x4a, 0x50, 0xab, 0xff, 0xc9, 0x4d, 0x85, 0x40, 0xd7, 0xec, 0x93, 0x9b, 0x7a, 0x28, 0xb1, 0x09, 0x16, 0xe5, 0x05, 0xad, 0x90, 0x84, 0x3d, 0x08, 0xb4, 0xb5, 0x17, 0x70, 0xd4, 0x8c, 0x27, 0xbe, 0xb2, 0xd8, 0xd5, 0x48, 0xa1, 0xb0, 0xa5, 0x0f, 0xe6, 0x4e, 0xbb, 0x39 ],
+const [ 0xc8, 0x3e, 0xad, 0x9a, 0x13, 0x1a, 0x1d, 0x7d, 0x12, 0x6b, 0x88, 0x64, 0x22, 0x21, 0xec, 0xe7, 0xd3, 0xa6, 0xdd, 0xd6, 0x01, 0x6e, 0xcc, 0x6f, 0x40, 0xd0, 0x89, 0xd4, 0x7e, 0x14, 0x07, 0xbc, 0xe3, 0xcd, 0x60, 0x68, 0xfc, 0x69, 0x18, 0xd9, 0x19, 0x06, 0xa6, 0x40, 0xf3 ],
+const [ 0x43, 0x0a, 0x7d, 0xbd, 0x62, 0xb3, 0xb3, 0xcb, 0x6a, 0x4b, 0x20, 0x24, 0xbd, 0x79, 0x60, 0x48, 0xea, 0x60, 0x99, 0x0d, 0x82, 0x22, 0xf9, 0x42, 0x28, 0xa2, 0x60, 0x93, 0xe8, 0x8f, 0x59, 0xac, 0xca, 0x9e, 0x4f, 0xa2, 0xa6, 0x16, 0xfe, 0x8e, 0x39, 0x92, 0x27, 0x7b, 0x79 ],
+const [ 0x49, 0x53, 0x40, 0x8b, 0xe3, 0xdd, 0xde, 0x42, 0x52, 0x1e, 0xb6, 0x25, 0xa3, 0x7a, 0xf0, 0xd2, 0xcf, 0x9e, 0xd1, 0x84, 0xf5, 0xb6, 0x27, 0xe5, 0xe7, 0xe0, 0xe8, 0x24, 0xe8, 0xe1, 0x16, 0x48, 0xb4, 0x18, 0xe5, 0xc4, 0xc1, 0xb0, 0x20, 0x4b, 0xc5, 0x19, 0xc9, 0xe5, 0x78 ],
+const [ 0xda, 0x6d, 0x09, 0x68, 0x26, 0x10, 0xd2, 0x3a, 0x66, 0x6a, 0xb7, 0xf6, 0x31, 0x47, 0xa1, 0xf0, 0x5d, 0xb8, 0xb3, 0xcf, 0xc2, 0xc1, 0x2d, 0xe3, 0x41, 0x52, 0x90, 0xb9, 0x06, 0x78, 0x03, 0xec, 0x09, 0xd5, 0xf5, 0x3d, 0xdb, 0x4e, 0x04, 0xe6, 0x9f, 0x03, 0x1d, 0x2c, 0x56 ],
+const [ 0x22, 0xf6, 0xc7, 0xdd, 0xb0, 0xe4, 0x6e, 0xcf, 0x62, 0x7a, 0xeb, 0xd9, 0xff, 0xad, 0x6f, 0x36, 0x68, 0x2e, 0xf5, 0xc9, 0x87, 0x91, 0xd2, 0x5e, 0x82, 0xaf, 0x8d, 0x33, 0x34, 0x49, 0xf0, 0xb7, 0xdd, 0xee, 0x5f, 0x91, 0x18, 0x1e, 0x69, 0xe4, 0x0e, 0xaf, 0x9d, 0xd1, 0xea ],
+const [ 0x2e, 0x2b, 0x99, 0x92, 0x90, 0xc9, 0xb4, 0xa3, 0x76, 0x0c, 0x4b, 0xf7, 0x67, 0xae, 0x44, 0xb2, 0x8a, 0x8d, 0x12, 0x46, 0x15, 0x52, 0xcd, 0x39, 0x09, 0x50, 0x88, 0x29, 0x1d, 0xaf, 0xdf, 0x0d, 0xf7, 0xc9, 0xcf, 0xbd, 0xa2, 0xd4, 0xcb, 0xb5, 0x3d, 0xc2, 0x0b, 0x15, 0xf0 ],
+const [ 0x08, 0x9a, 0xa3, 0x7f, 0x72, 0xb2, 0x96, 0x2c, 0x18, 0xfa, 0x4e, 0x98, 0x58, 0xeb, 0xac, 0x2f, 0xc1, 0x65, 0x5f, 0xf4, 0x1b, 0xa3, 0x07, 0x15, 0xa7, 0x6d, 0x9a, 0xc3, 0xa8, 0x8f, 0x07, 0x40, 0x21, 0x8b, 0x1a, 0x3a, 0xe1, 0x8b, 0xa0, 0x57, 0xbd, 0x99, 0xcb, 0x11, 0x1d ],
+const [ 0x4e, 0x1a, 0xd1, 0x05, 0x4c, 0x00, 0xb6, 0xcd, 0xd0, 0x26, 0x77, 0x39, 0xc8, 0xc9, 0x29, 0x94, 0xa4, 0xaf, 0x4b, 0xf3, 0x73, 0xba, 0x06, 0x6c, 0x48, 0xbc, 0xb4, 0x83, 0xe3, 0x8d, 0xa0, 0xe5, 0x8d, 0x5b, 0x0c, 0x59, 0x44, 0x42, 0x79, 0xf3, 0x18, 0x1c, 0x22, 0x8a, 0xd5 ],
+const [ 0x36, 0xe8, 0x12, 0x83, 0x55, 0xa3, 0xdc, 0x7a, 0xb3, 0xfc, 0xb2, 0x8f, 0xe9, 0x3c, 0x8e, 0x69, 0x50, 0x66, 0x33, 0x4f, 0x66, 0x10, 0xb3, 0x98, 0x73, 0x72, 0x33, 0x62, 0x6c, 0xbd, 0xf2, 0x87, 0x17, 0xae, 0x88, 0xcd, 0x70, 0x62, 0x6c, 0x5d, 0x4c, 0x6c, 0xb9, 0x77, 0x3c ],
+const [ 0xff, 0x46, 0x9d, 0x80, 0xd2, 0xdb, 0xef, 0x99, 0x9d, 0x7d, 0x48, 0x15, 0xd1, 0x23, 0xcf, 0x50, 0xee, 0x9c, 0x2c, 0x23, 0xfa, 0x2e, 0x9a, 0xab, 0x2c, 0x7e, 0x3d, 0x4c, 0xe8, 0xaf, 0xb7, 0xf5, 0xf0, 0xce, 0xf6, 0xa5, 0xd8, 0x6e, 0x4f, 0x2e, 0xba, 0x8f, 0xd1, 0x39, 0x2c ],
+const [ 0x93, 0xfd, 0x8e, 0x20, 0x8a, 0x1d, 0x60, 0x52, 0x38, 0x86, 0x11, 0xbe, 0xb9, 0xf0, 0x47, 0xfe, 0x91, 0xe3, 0x3a, 0xfd, 0x4b, 0xcd, 0x74, 0xae, 0x61, 0x52, 0xd5, 0xfe, 0x5c, 0xe3, 0xd9, 0x07, 0x3c, 0x92, 0x1e, 0x86, 0x1a, 0x24, 0x20, 0x8f, 0x0c, 0x68, 0x47, 0x7f, 0x49 ],
+const [ 0xf1, 0x89, 0xba, 0xee, 0xec, 0x50, 0x7e, 0x94, 0x5f, 0x0c, 0x4d, 0x62, 0x8a, 0x0d, 0x05, 0x48, 0xee, 0xdf, 0xd2, 0x54, 0xb1, 0x1f, 0xaf, 0x25, 0x45, 0x8e, 0x29, 0xa3, 0x45, 0x64, 0x66, 0xed, 0x9f, 0xe7, 0x67, 0x93, 0xf8, 0x3b, 0x8a, 0x06, 0x4c, 0x7c, 0x53, 0x4c, 0xd5 ],
+const [ 0xb7, 0x63, 0x26, 0x3d, 0xc4, 0xfc, 0x62, 0xb2, 0x27, 0xcd, 0x3f, 0x6b, 0x4e, 0x9e, 0x35, 0x8c, 0x21, 0xca, 0x03, 0x6c, 0xe3, 0x96, 0xab, 0x92, 0x59, 0xc1, 0xbe, 0xdd, 0x2f, 0x5c, 0xd9, 0x02, 0x97, 0xdc, 0x70, 0x3c, 0x33, 0x6e, 0xca, 0x3e, 0x35, 0x8a, 0x4d, 0x6d, 0xc5 ],
+const [ 0x9f, 0xe4, 0x2d, 0xfa, 0xc9, 0x2a, 0x4a, 0x13, 0x6f, 0xa7, 0xc9, 0xf6, 0xe3, 0x31, 0xb5, 0xd3, 0xa6, 0x1a, 0xa7, 0x30, 0x35, 0xb5, 0x3a, 0x8d, 0x25, 0x17, 0xbe, 0x43, 0x72, 0x1b, 0x31, 0xb2, 0x15, 0xa9, 0x6b, 0x9b, 0xd4, 0x37, 0x98, 0xcb, 0x5e, 0x8f, 0xeb, 0xfa, 0x97 ],
+const [ 0x98, 0xff, 0xf7, 0xb5, 0xf7, 0x73, 0x26, 0xc2, 0x44, 0x71, 0xbb, 0x9c, 0x31, 0x74, 0x90, 0xbe, 0x1f, 0xeb, 0xad, 0x28, 0xe2, 0xe8, 0x25, 0xaf, 0xc4, 0x1c, 0x3b, 0x97, 0xcc, 0x03, 0xc9, 0x63, 0x40, 0x5c, 0xe3, 0xec, 0x68, 0xdc, 0xb7, 0xb1, 0x95, 0x23, 0xb7, 0x6e, 0x62 ],
+const [ 0x8d, 0x64, 0x9e, 0x5c, 0xcb, 0xb8, 0xbb, 0x00, 0x32, 0xcd, 0xdd, 0xbb, 0xe4, 0x4e, 0xd0, 0xb5, 0xbb, 0xbd, 0xe7, 0x8a, 0x30, 0xc0, 0xf8, 0x43, 0x7b, 0xbc, 0xa9, 0x85, 0xfc, 0xa5, 0xea, 0x08, 0xda, 0x15, 0xc3, 0x4b, 0xea, 0x9b, 0x50, 0x86, 0xd2, 0x55, 0x0a, 0xe1, 0x6e ],
+const [ 0x57, 0x95, 0x8d, 0x7e, 0x4c, 0x73, 0xfa, 0x60, 0x6e, 0xf4, 0x05, 0xd7, 0x7e, 0xa4, 0x97, 0x7a, 0xc9, 0x6b, 0x88, 0x13, 0xfc, 0x12, 0x10, 0x48, 0x3a, 0x03, 0x7e, 0x7b, 0x6c, 0x50, 0x2c, 0xee, 0xd8, 0xf7, 0xb2, 0x2b, 0xf6, 0x65, 0x5a, 0xa3, 0x7e, 0x38, 0xd4, 0x95, 0xc6 ],
+const [ 0x6d, 0x32, 0xba, 0x0c, 0x06, 0x37, 0x74, 0xbf, 0x8d, 0x06, 0x21, 0xb2, 0x08, 0xd7, 0x20, 0x95, 0xf6, 0x84, 0xfa, 0xa3, 0x3c, 0xa6, 0xf3, 0xdc, 0x62, 0xfb, 0xdf, 0x95, 0xff, 0x0c, 0x37, 0x33, 0x72, 0x0c, 0x6c, 0x34, 0xd3, 0x02, 0x7b, 0x6f, 0x2a, 0x2b, 0xc2, 0x9c, 0xde ],
+const [ 0x6b, 0x97, 0x47, 0x8f, 0xda, 0xfd, 0x3a, 0x85, 0xd0, 0xd9, 0xb3, 0x39, 0x97, 0x1a, 0x70, 0xc2, 0xfd, 0x24, 0xd5, 0x42, 0xab, 0xd3, 0xe2, 0x0e, 0xb2, 0xbd, 0x63, 0x0f, 0x67, 0xb8, 0x66, 0x68, 0x71, 0x9d, 0xf2, 0x58, 0x20, 0x4b, 0xf6, 0x62, 0x01, 0xee, 0x80, 0xac, 0xaf ],
+const [ 0x89, 0xc7, 0x7d, 0x79, 0xde, 0x98, 0xdf, 0x18, 0xf0, 0xcf, 0x29, 0xa9, 0x31, 0x6d, 0x6d, 0xc4, 0x6b, 0x61, 0xeb, 0x7a, 0xf7, 0xf1, 0xe2, 0xde, 0x2f, 0x5c, 0xa6, 0xc5, 0x25, 0xbe, 0xf3, 0xc9, 0x96, 0x33, 0x81, 0x94, 0x19, 0x3f, 0xd8, 0x5b, 0x9c, 0x6e, 0x66, 0xa8, 0x11 ],
+const [ 0x08, 0xcc, 0xe7, 0xd7, 0xf3, 0xcc, 0xea, 0x02, 0x12, 0xcf, 0x02, 0x99, 0xf2, 0x7f, 0x3d, 0x3f, 0x39, 0x3a, 0x97, 0xd3, 0xdd, 0x71, 0xca, 0xf1, 0x95, 0x4e, 0x67, 0xbc, 0x8d, 0x9a, 0x26, 0xdb, 0x5e, 0xdd, 0x7a, 0xc2, 0x3d, 0xc7, 0x69, 0x33, 0x72, 0xce, 0x9b, 0x04, 0x0d ],
+const [ 0x1a, 0x2e, 0x86, 0xf6, 0xab, 0x2d, 0xb2, 0x35, 0xe5, 0xd7, 0xf0, 0x0c, 0xf4, 0x38, 0x68, 0x0f, 0xe5, 0xb4, 0x42, 0xdc, 0xb1, 0xf8, 0xc3, 0xae, 0x77, 0x30, 0xb9, 0x2f, 0x09, 0x7a, 0x1a, 0x8e, 0xaa, 0x9b, 0xe8, 0xd2, 0x16, 0xf2, 0x57, 0x6e, 0xc3, 0xaa, 0x32, 0x15, 0x67 ],
+const [ 0x32, 0x70, 0xb4, 0xe4, 0x8d, 0x57, 0x5f, 0x03, 0x12, 0x65, 0x9a, 0x62, 0x02, 0xad, 0xbc, 0x4e, 0x87, 0x7d, 0x69, 0x29, 0x8d, 0xe4, 0x09, 0x0e, 0xd4, 0x72, 0x78, 0xb4, 0x43, 0x3f, 0xff, 0x95, 0x80, 0x2e, 0x84, 0x4f, 0xbd, 0x73, 0xfd, 0x4a, 0xd5, 0x53, 0x2b, 0x9b, 0x97 ],
+const [ 0xc7, 0x04, 0xd5, 0x79, 0x35, 0x39, 0xef, 0x39, 0x09, 0xbd, 0xaa, 0x7c, 0x29, 0xe9, 0xc0, 0xa0, 0xc4, 0x41, 0x81, 0x4c, 0x37, 0xbc, 0xd0, 0x62, 0x32, 0x5f, 0x6e, 0x2e, 0x16, 0x10, 0x7b, 0xe4, 0xa2, 0xaa, 0x39, 0x49, 0xcf, 0x4d, 0x14, 0xb0, 0xf8, 0xf8, 0xdf, 0x28, 0x3e ],
+const [ 0x5b, 0x2c, 0xce, 0xd4, 0x70, 0x45, 0xbc, 0xa4, 0x75, 0x12, 0xfe, 0x22, 0x6c, 0x1f, 0x41, 0x5e, 0xf1, 0x27, 0xa2, 0x09, 0xbf, 0x88, 0x5b, 0x8a, 0x76, 0xf5, 0xa2, 0x4f, 0x9c, 0x6b, 0xce, 0x61, 0xe1, 0x66, 0xbc, 0x3c, 0xa7, 0x54, 0x71, 0xdd, 0xc1, 0x4a, 0x00, 0x1c, 0x7b ],
+const [ 0x0d, 0x4d, 0xd3, 0x5f, 0x90, 0xf0, 0xa1, 0x0d, 0x7d, 0x80, 0x30, 0xe9, 0x91, 0x94, 0x46, 0xf3, 0xd5, 0xe2, 0x53, 0x24, 0x72, 0xbc, 0xef, 0x0c, 0xc5, 0xdb, 0x84, 0xba, 0xb6, 0x5c, 0x48, 0xdc, 0x46, 0x08, 0x6f, 0x27, 0x68, 0xd8, 0x9e, 0xf9, 0x12, 0xb8, 0xa2, 0x3d, 0x93 ],
+const [ 0x5e, 0xf9, 0x46, 0xb6, 0x4f, 0xf8, 0x0e, 0x4d, 0xf8, 0xee, 0x98, 0xa3, 0x57, 0xf0, 0x7c, 0x82, 0x5c, 0x3a, 0xcc, 0x43, 0x4d, 0x0f, 0x99, 0x40, 0x69, 0xc0, 0xb8, 0x8c, 0xcc, 0x0a, 0xc5, 0xe1, 0x92, 0xa4, 0x69, 0xd9, 0x3f, 0x19, 0xd9, 0x61, 0x5f, 0xd4, 0x9f, 0x6b, 0x69 ],
+const [ 0x79, 0xf8, 0x77, 0x34, 0xc4, 0x6c, 0x5a, 0x11, 0xd8, 0x6a, 0xed, 0xea, 0xd2, 0x2e, 0xd3, 0xea, 0x01, 0x57, 0x7a, 0xd4, 0xec, 0xdf, 0x42, 0x96, 0x96, 0x50, 0xe1, 0x20, 0x00, 0x35, 0x06, 0x76, 0xf0, 0xcf, 0x3c, 0x04, 0xf1, 0x0a, 0x11, 0x33, 0x9b, 0xaf, 0x78, 0x39, 0x14, 0xdb, 0x6d, 0x35, 0xd7, 0xb0, 0xd7, 0x7b, 0xb4, 0x4a, 0xb2, 0x2c, 0x18, 0xf5, 0x6d, 0x0b, 0x8f, 0x9d, 0x91, 0x8b ],
+const [ 0xea, 0xe2, 0x55, 0xd9, 0xe0, 0x83, 0x26, 0x8f, 0x89, 0x64, 0x29, 0xce, 0x36, 0x64, 0x55, 0x02, 0xaf, 0xf9, 0xdb, 0xea, 0xca, 0x71, 0x59, 0xf9, 0x3c, 0x7d, 0x51, 0xfd, 0xae, 0xef, 0xdb, 0xfe, 0x14, 0xc3, 0x96, 0x69, 0x3a, 0x5c, 0xe4, 0x6e, 0x9f, 0x11, 0x57, 0xa6, 0x87, 0xe8, 0x66, 0xf9, 0x4c, 0xa1, 0x65, 0xbf, 0xf5, 0xf7, 0xb4, 0x25, 0x09, 0x22, 0x36, 0xd2, 0xa6, 0xa0, 0x04, 0xcb ],
+const [ 0x42, 0x52, 0x1b, 0xc3, 0xf1, 0x68, 0xb2, 0xb3, 0x43, 0x4c, 0xb4, 0xe4, 0x4d, 0x92, 0xf5, 0x26, 0xb4, 0x1c, 0x5f, 0x10, 0xbf, 0xe0, 0xa0, 0xe6, 0xb0, 0xeb, 0x20, 0xc0, 0x55, 0xa6, 0x36, 0xe9, 0xda, 0x59, 0x9b, 0x86, 0xe1, 0xed, 0x1f, 0x78, 0xd4, 0xf6, 0x9a, 0x83, 0x7a, 0xf1, 0x26, 0xaf, 0xc9, 0xc9, 0x8b, 0xee, 0xfc, 0xa1, 0xfb, 0x00, 0xe5, 0xcd, 0x00, 0x94, 0x83, 0x21, 0xb2, 0xb0 ],
+const [ 0x81, 0xb5, 0xf1, 0x2a, 0x64, 0xf3, 0xc3, 0x47, 0x90, 0x25, 0x49, 0xa1, 0xfa, 0xbd, 0x39, 0xea, 0x1d, 0x9e, 0xfe, 0xab, 0xed, 0x38, 0x51, 0x88, 0x0d, 0xf4, 0x0d, 0xc5, 0x41, 0xd2, 0x3f, 0x09, 0x26, 0x50, 0x7d, 0x62, 0x21, 0x8f, 0x7a, 0x8a, 0x95, 0xb1, 0xd7, 0x69, 0x59, 0x85, 0x3b, 0xda, 0x69, 0x66, 0xa5, 0xb2, 0xdb, 0x60, 0x01, 0xff, 0x15, 0x95, 0xfa, 0x8d, 0x3e, 0xdf, 0x10, 0xaf ],
+const [ 0x34, 0xf5, 0xd2, 0x8d, 0x58, 0x36, 0x4d, 0xa4, 0xb9, 0x5a, 0x48, 0xc0, 0x7e, 0x01, 0xb0, 0xa9, 0x9c, 0x5a, 0xce, 0x17, 0x3f, 0xf2, 0xc9, 0x21, 0x6b, 0xc9, 0x6d, 0xf8, 0xe3, 0xab, 0x2a, 0xd5, 0x4a, 0xbd, 0x60, 0x30, 0x88, 0x57, 0xda, 0x33, 0x6f, 0x11, 0x98, 0x6e, 0x9f, 0x21, 0xd1, 0xcc, 0xa6, 0xe4, 0x38, 0xc6, 0x6c, 0xba, 0x7f, 0xd6, 0xcf, 0x17, 0x19, 0x2f, 0x8a, 0xd7, 0x45, 0xab ],
+const [ 0xce, 0xc8, 0x28, 0x0c, 0x87, 0x17, 0x0f, 0x1d, 0x48, 0x36, 0xcd, 0xd7, 0x7a, 0xbb, 0x2a, 0x34, 0x41, 0x0b, 0x8d, 0x53, 0x51, 0xd9, 0x6d, 0x1a, 0x03, 0xe9, 0x09, 0x20, 0xa7, 0x1a, 0x59, 0xca, 0x1c, 0xa3, 0x44, 0xb4, 0x9f, 0x9d, 0x13, 0x52, 0xe1, 0xc2, 0x26, 0xd7, 0x5c, 0x74, 0xe5, 0x55, 0xe6, 0x01, 0xfa, 0x26, 0x87, 0x25, 0xbe, 0x8c, 0x88, 0xd0, 0xf0, 0x94, 0xcc, 0x2a, 0xad, 0x40 ],
+const [ 0x9f, 0x65, 0xa4, 0x26, 0x10, 0x6d, 0xb9, 0x9d, 0xcb, 0x21, 0x30, 0xbe, 0x14, 0x83, 0x92, 0x41, 0xd4, 0xa9, 0x2c, 0x8b, 0xec, 0xc1, 0x08, 0xd2, 0xc9, 0x52, 0x1b, 0x82, 0x38, 0xc5, 0xc0, 0xdf, 0x7c, 0x23, 0x65, 0xec, 0x9f, 0x20, 0x84, 0x8c, 0x05, 0x59, 0xd6, 0xe8, 0x47, 0xda, 0xc3, 0x10, 0x3e, 0xe3, 0x1c, 0xe5, 0x5d, 0xec, 0x0c, 0x36, 0x44, 0xe6, 0x4c, 0x29, 0x93, 0xc4, 0x97, 0xdd ],
+const [ 0x2e, 0xdc, 0x66, 0xbc, 0xca, 0x9f, 0x99, 0xee, 0x13, 0x66, 0x99, 0x2f, 0xd0, 0xf0, 0xf9, 0x54, 0xd3, 0xd4, 0xc5, 0xca, 0x21, 0x15, 0xc2, 0xd0, 0x53, 0xf6, 0xf8, 0xe3, 0x3c, 0x0f, 0x6e, 0x7a, 0xcc, 0xa1, 0x35, 0xf4, 0x34, 0x27, 0xa7, 0xcf, 0x4b, 0x2d, 0xf1, 0x1a, 0x31, 0x65, 0xcf, 0x2d, 0x32, 0xf8, 0x97, 0x97, 0xed, 0x1a, 0x79, 0x58, 0xb5, 0xe1, 0x05, 0x51, 0x37, 0x57, 0xed, 0xf8 ],
+const [ 0xf9, 0x87, 0xeb, 0x83, 0xa3, 0xfd, 0x6d, 0x94, 0xeb, 0xf3, 0x62, 0x6b, 0x7d, 0x34, 0xfe, 0xc2, 0x3e, 0xe0, 0x6c, 0x63, 0xdf, 0xb4, 0x07, 0x8c, 0xb3, 0x8b, 0xcc, 0x97, 0xbd, 0x25, 0x0f, 0xda, 0x0e, 0x28, 0x6e, 0xcd, 0x4e, 0x64, 0x04, 0x6a, 0x98, 0x5b, 0xdf, 0xda, 0x8b, 0x01, 0xb3, 0x4d, 0x9d, 0xc0, 0xcf, 0x2a, 0xb3, 0xbf, 0x51, 0x68, 0xef, 0x64, 0x96, 0x3b, 0xc9, 0x18, 0xf5, 0xf4 ],
+const [ 0x5a, 0x35, 0xa2, 0x90, 0x9a, 0xad, 0xd2, 0x78, 0xb8, 0x10, 0xb1, 0x01, 0xed, 0x44, 0xe1, 0x54, 0x8d, 0xda, 0xf9, 0xba, 0x8c, 0x88, 0x2b, 0xb1, 0x42, 0xd9, 0x24, 0x3f, 0x6b, 0x23, 0x34, 0x86, 0x72, 0xba, 0xaf, 0x99, 0xef, 0x63, 0x93, 0x8e, 0x6e, 0x0b, 0x6a, 0xd4, 0x72, 0xb9, 0x72, 0xc7, 0xb9, 0xc2, 0xfc, 0x82, 0xc2, 0x3c, 0x12, 0xf4, 0x8d, 0xb4, 0x5c, 0x37, 0xa2, 0x24, 0x45, 0x1c ],
+const [ 0x96, 0xda, 0x74, 0x67, 0x79, 0xee, 0x44, 0x16, 0x51, 0xfb, 0x9c, 0xcd, 0x2d, 0xa6, 0x21, 0xef, 0xf4, 0x09, 0x11, 0x11, 0xf8, 0xfb, 0x79, 0x5c, 0xce, 0x92, 0xa8, 0x33, 0x5e, 0xe7, 0xe3, 0x16, 0x36, 0x19, 0x5a, 0xc7, 0x24, 0x95, 0x5b, 0xab, 0x03, 0x94, 0xc6, 0x72, 0xd5, 0xe5, 0xc1, 0xfb, 0x12, 0xec, 0xac, 0x71, 0x40, 0xeb, 0x58, 0xbb, 0xc4, 0x80, 0x73, 0x13, 0xf8, 0x6f, 0x47, 0xf4 ],
+const [ 0x43, 0xaa, 0xe2, 0x62, 0x14, 0x59, 0xa8, 0xd5, 0xb5, 0xcc, 0x91, 0x94, 0x45, 0xf3, 0xda, 0xbc, 0x01, 0x65, 0xd1, 0x36, 0xba, 0x01, 0xe5, 0x81, 0x87, 0xd5, 0xff, 0xb2, 0xb7, 0x3f, 0x15, 0xb9, 0x09, 0x51, 0xfc, 0xe5, 0x20, 0x7a, 0x7d, 0xab, 0x31, 0x63, 0xac, 0xa3, 0xff, 0x18, 0x75, 0xd3, 0x09, 0x68, 0x78, 0x30, 0x01, 0x8e, 0x17, 0x62, 0x81, 0x11, 0xcc, 0xc8, 0xfa, 0xe8, 0xc0, 0xbc ],
+const [ 0xfa, 0x23, 0x5e, 0xf9, 0xf4, 0x8a, 0x66, 0x6e, 0x2e, 0x55, 0xdb, 0xc4, 0x48, 0xef, 0x93, 0x4d, 0xe0, 0xd2, 0x2e, 0xf5, 0xc0, 0xec, 0xed, 0xc7, 0x55, 0x48, 0xc8, 0xb3, 0x64, 0xea, 0xba, 0x8e, 0xf8, 0xfb, 0x60, 0x5a, 0x9f, 0x26, 0xc2, 0xc8, 0xd5, 0x41, 0x71, 0xfb, 0xc1, 0x30, 0xd2, 0x8f, 0x1f, 0x06, 0xb9, 0xda, 0x7e, 0x6e, 0x39, 0x71, 0xab, 0x4a, 0xbb, 0xee, 0x6d, 0x99, 0x4e, 0xf1 ],
+const [ 0xbf, 0x24, 0x8c, 0x7c, 0x61, 0x01, 0xe6, 0xe0, 0x28, 0x1c, 0x89, 0x55, 0xe5, 0xcc, 0x02, 0x8d, 0x98, 0xe5, 0x68, 0x8d, 0x3f, 0x36, 0xd7, 0x54, 0xf0, 0x56, 0x20, 0xbd, 0x26, 0xa1, 0xbf, 0xa6, 0x59, 0x7d, 0x0e, 0x52, 0xd1, 0xe2, 0xb8, 0x0c, 0xbb, 0x19, 0x6f, 0x0d, 0x7d, 0xc3, 0xe2, 0xa0, 0x47, 0x1e, 0xe9, 0x84, 0xea, 0x84, 0x03, 0x92, 0xee, 0x34, 0x03, 0x9f, 0xde, 0x55, 0x06, 0xa4 ],
+const [ 0x8b, 0x4c, 0x9c, 0x27, 0x83, 0x24, 0x0e, 0x19, 0x12, 0x8f, 0xcc, 0x27, 0x54, 0xc4, 0x7d, 0x68, 0xd6, 0xac, 0xb3, 0x36, 0x59, 0x99, 0xcd, 0x85, 0xd3, 0x35, 0x1c, 0x74, 0xb7, 0xb9, 0x44, 0x22, 0x76, 0x5f, 0xe5, 0xc3, 0x46, 0x19, 0x7b, 0xf3, 0x22, 0x83, 0x83, 0x49, 0x12, 0x16, 0xe0, 0x30, 0xac, 0x9f, 0x7c, 0xf2, 0xdb, 0xf0, 0x32, 0x16, 0xdf, 0xd6, 0xec, 0xec, 0x95, 0x4b, 0x08, 0x66 ],
+const [ 0xa5, 0xfd, 0x99, 0xca, 0x57, 0xc1, 0xfe, 0xc8, 0x15, 0x9a, 0x79, 0x87, 0x92, 0x42, 0x6d, 0x29, 0x6f, 0xa1, 0xb1, 0x7d, 0x53, 0x92, 0x41, 0xde, 0x3d, 0xea, 0x33, 0x58, 0x19, 0xb7, 0xed, 0x0d, 0x92, 0xc5, 0x96, 0xd7, 0x28, 0x67, 0xca, 0x2f, 0x82, 0x73, 0x92, 0x4e, 0x05, 0x8f, 0x93, 0x91, 0xa5, 0xab, 0x85, 0x22, 0xfb, 0xcf, 0xe7, 0xd5, 0x98, 0x17, 0xf1, 0x50, 0x9a, 0xfc, 0xcb, 0x6f ],
+const [ 0x30, 0xbc, 0x3e, 0x32, 0x1a, 0x89, 0x78, 0xe2, 0x35, 0xfa, 0x1b, 0x55, 0x00, 0x64, 0xb8, 0x2e, 0xaa, 0x0c, 0x10, 0x75, 0x25, 0xea, 0xcc, 0x82, 0x7c, 0xad, 0x6f, 0x1d, 0x66, 0xff, 0x88, 0xe3, 0x1b, 0x09, 0x2c, 0xec, 0x66, 0x3a, 0xa3, 0xaa, 0xfc, 0x44, 0x62, 0x14, 0x0c, 0x68, 0x39, 0x04, 0x17, 0xf4, 0xce, 0xde, 0x02, 0x0a, 0x4a, 0x73, 0x6a, 0xa2, 0x52, 0x25, 0x37, 0xd2, 0x39, 0x4b ],
+const [ 0xc1, 0x89, 0xce, 0x53, 0x34, 0xf6, 0x70, 0xed, 0x28, 0x15, 0x60, 0x7b, 0xa9, 0x54, 0x9f, 0x07, 0x68, 0x2e, 0x11, 0xf7, 0x02, 0x59, 0xde, 0xe3, 0x85, 0x40, 0x19, 0xa4, 0x31, 0xb3, 0xa0, 0xad, 0x7b, 0xdd, 0x43, 0x9f, 0x58, 0x77, 0x28, 0x17, 0xb7, 0x3c, 0x6d, 0xca, 0x4f, 0x9d, 0x10, 0xd5, 0x9c, 0xb5, 0x0c, 0x4e, 0x24, 0x7f, 0xc5, 0x1f, 0xff, 0x47, 0xa6, 0x14, 0x96, 0x5e, 0x09, 0x32 ],
+const [ 0x08, 0x5e, 0xcb, 0x69, 0x49, 0x2d, 0xea, 0xa7, 0x04, 0xe2, 0x5a, 0xee, 0xab, 0xb7, 0xb7, 0x79, 0x5f, 0xdc, 0xc8, 0x07, 0xb3, 0x25, 0x5f, 0x2f, 0xb3, 0x00, 0x81, 0xf4, 0x25, 0xa9, 0xc7, 0x99, 0x0e, 0xa1, 0x04, 0xb7, 0x78, 0x5c, 0x28, 0x8c, 0x73, 0x39, 0x65, 0x96, 0x5a, 0xb8, 0x90, 0x60, 0x57, 0xe8, 0xc9, 0x9d, 0x29, 0x1e, 0x5e, 0x73, 0x25, 0xec, 0xed, 0x19, 0x7b, 0x51, 0xc9, 0xa4 ],
+const [ 0xf5, 0xa0, 0x7e, 0x37, 0x41, 0xf0, 0x31, 0x74, 0xc6, 0xef, 0xcb, 0x1f, 0x9f, 0x18, 0x6d, 0x1f, 0x23, 0x3b, 0x36, 0x70, 0x73, 0xc5, 0x6e, 0x81, 0x4f, 0x42, 0x04, 0xdb, 0x2e, 0x20, 0x3b, 0x04, 0x8d, 0xb6, 0xa0, 0xa3, 0x87, 0x85, 0x3f, 0xe4, 0xa6, 0xbd, 0x16, 0x1e, 0xf9, 0x03, 0xca, 0xb4, 0x66, 0x71, 0x99, 0x39, 0x42, 0xde, 0x90, 0xd7, 0x1f, 0x60, 0xfe, 0xf1, 0xe5, 0x10, 0x28, 0x07 ],
+const [ 0x88, 0x7c, 0x37, 0xf1, 0xf0, 0x99, 0x20, 0xba, 0x51, 0x88, 0x59, 0x34, 0xaf, 0x50, 0xa4, 0xb0, 0x65, 0xe9, 0xe2, 0x16, 0x0e, 0x97, 0x1e, 0xd8, 0xa6, 0x76, 0xcd, 0x26, 0xed, 0x55, 0x54, 0x61, 0x0c, 0xc7, 0xcb, 0xd1, 0x7b, 0x78, 0x01, 0x9a, 0x22, 0xbe, 0xc0, 0xec, 0xbf, 0x70, 0x52, 0x7b, 0x87, 0xfb, 0x43, 0x2f, 0x10, 0xb2, 0x69, 0x1c, 0x6e, 0x66, 0x22, 0xb4, 0x9d, 0x37, 0xdd, 0x3b ],
+const [ 0xe9, 0x06, 0x1e, 0xf9, 0xb2, 0x98, 0xe4, 0x7a, 0xf4, 0xbf, 0xe3, 0x59, 0x03, 0xd2, 0x2e, 0x2e, 0xa4, 0xce, 0xdb, 0x85, 0xc5, 0x3e, 0x5a, 0xe1, 0x6b, 0x5e, 0x05, 0x01, 0xeb, 0x7f, 0xf7, 0x61, 0x5d, 0xad, 0x22, 0x04, 0x4e, 0x90, 0x9c, 0x71, 0xb5, 0x90, 0x3a, 0xfc, 0x28, 0x3c, 0x60, 0x46, 0x50, 0xed, 0x17, 0x07, 0x9b, 0xa6, 0x60, 0x0b, 0x30, 0x3f, 0xc9, 0x7b, 0x28, 0xc3, 0x3d, 0x5e ],
+const [ 0x78, 0xba, 0xb2, 0xc4, 0x0d, 0x60, 0xd0, 0x77, 0x0c, 0x5d, 0x2b, 0xaf, 0xc4, 0x55, 0x26, 0x59, 0x42, 0xb0, 0xd9, 0x32, 0x17, 0x4a, 0xfe, 0x25, 0x5b, 0x6c, 0x0e, 0xd4, 0xf1, 0xfc, 0xa7, 0x75, 0x0d, 0xf0, 0x31, 0xdf, 0xf4, 0x08, 0xc1, 0xe4, 0x03, 0xbd, 0x3d, 0xe2, 0xf3, 0x75, 0xc2, 0x95, 0x5b, 0xf8, 0x42, 0x2f, 0x76, 0x27, 0x72, 0xab, 0x27, 0xec, 0xe3, 0x5e, 0x3a, 0x6d, 0x6e, 0xcf ],
+const [ 0xa2, 0xf1, 0x63, 0x5f, 0x23, 0x9f, 0x03, 0xbe, 0x85, 0x3b, 0x26, 0xae, 0xe7, 0xb8, 0x03, 0x5a, 0x5f, 0x26, 0x7b, 0xf0, 0xeb, 0xd7, 0xa8, 0xeb, 0xab, 0xc0, 0xb8, 0x98, 0x4d, 0x21, 0xfc, 0xd3, 0xc8, 0x69, 0x3c, 0x12, 0x4d, 0x54, 0x4e, 0xa6, 0x7a, 0x56, 0xe6, 0x3d, 0xd2, 0x3c, 0xb0, 0xaa, 0x6a, 0x11, 0x9c, 0xe9, 0xe4, 0x3e, 0x7a, 0x5d, 0xa1, 0xf6, 0xc6, 0x5d, 0x33, 0xd1, 0xc5, 0xef ],
+const [ 0x69, 0xf5, 0x33, 0x83, 0x67, 0x71, 0xa3, 0xcc, 0x00, 0x87, 0xfc, 0x2f, 0xce, 0x7c, 0x42, 0x31, 0x8f, 0x24, 0xc7, 0x6a, 0xcb, 0xf8, 0xf1, 0x39, 0xb8, 0x69, 0x3d, 0xb6, 0x5a, 0x74, 0x84, 0xe8, 0xee, 0x77, 0x7e, 0x39, 0x89, 0x43, 0x84, 0x26, 0xfd, 0x72, 0x9a, 0x3b, 0xfc, 0xfb, 0xac, 0x3f, 0x80, 0x03, 0x18, 0xac, 0x69, 0xf6, 0x6d, 0x62, 0x68, 0xd7, 0x72, 0x9b, 0x1d, 0xd4, 0x6b, 0x22 ],
+const [ 0x2d, 0xaf, 0x08, 0xcd, 0xc0, 0x15, 0xbf, 0x36, 0x1f, 0x66, 0xbe, 0x9c, 0xfc, 0xdd, 0x6a, 0xa7, 0xf1, 0x00, 0x3d, 0xb6, 0x6f, 0xc9, 0x5e, 0x23, 0xf7, 0x04, 0x75, 0xc8, 0x8c, 0xf8, 0xbd, 0xc2, 0x68, 0x49, 0x5b, 0x74, 0xee, 0x1d, 0xee, 0xcf, 0xe0, 0x7e, 0x67, 0xd1, 0xd2, 0x00, 0x1b, 0x4c, 0xde, 0xa3, 0x16, 0xe9, 0x9a, 0xfa, 0xb2, 0x6c, 0x47, 0x8d, 0x69, 0x3a, 0x4b, 0x7d, 0xe8, 0x18 ],
+const [ 0x65, 0xe3, 0x5c, 0x88, 0xeb, 0xfc, 0x4c, 0x42, 0x5d, 0x03, 0x62, 0xc5, 0xcd, 0x12, 0x5b, 0xa4, 0x0a, 0x0a, 0xa7, 0x65, 0x16, 0x34, 0x78, 0x40, 0xda, 0x28, 0x1a, 0x24, 0x19, 0xee, 0x82, 0xfb, 0xa3, 0x64, 0x29, 0x2f, 0xcb, 0xdf, 0x1b, 0x6d, 0x1a, 0x15, 0x4a, 0xa9, 0x45, 0x3b, 0x29, 0x62, 0x5d, 0x6a, 0x76, 0x27, 0x46, 0x47, 0x57, 0x5a, 0x6a, 0xe3, 0xa9, 0x34, 0xae, 0xe0, 0x95, 0x09 ],
+const [ 0x84, 0xd5, 0x82, 0x4f, 0x5b, 0x0d, 0xeb, 0x22, 0xf4, 0x47, 0x65, 0x78, 0xe8, 0xd0, 0xdd, 0x19, 0x2b, 0xdb, 0x87, 0xf9, 0x30, 0x19, 0x23, 0x6a, 0x54, 0x89, 0x7e, 0x90, 0x79, 0x92, 0x3b, 0x15, 0xf1, 0x4f, 0xd3, 0x1f, 0x9f, 0x2a, 0xdb, 0x7f, 0x58, 0xac, 0x86, 0x2c, 0x8f, 0x93, 0x6a, 0xef, 0x32, 0x25, 0x87, 0x5f, 0xcf, 0xc5, 0x85, 0x10, 0xfb, 0xc4, 0x3d, 0x08, 0xf4, 0x79, 0x7b, 0x72 ],
+const [ 0x83, 0x3b, 0x09, 0xf3, 0xa7, 0xe4, 0x11, 0x10, 0xf3, 0x5a, 0xe3, 0x3a, 0xce, 0xf5, 0xc9, 0xa7, 0x6e, 0xa9, 0x31, 0x19, 0x54, 0x81, 0x54, 0xfb, 0x15, 0x48, 0x15, 0xac, 0x60, 0x89, 0x2c, 0x1b, 0x3d, 0xbb, 0x83, 0x94, 0x93, 0xb5, 0xe0, 0xd9, 0xed, 0x68, 0xc5, 0x75, 0x7d, 0xcc, 0x95, 0x4d, 0x62, 0x1b, 0xf7, 0x78, 0x26, 0x3e, 0x7f, 0x50, 0x8b, 0x84, 0x8c, 0xc9, 0x87, 0x9a, 0x6c, 0x02 ],
+const [ 0x5e, 0xfd, 0x2d, 0x24, 0xa0, 0x34, 0xc9, 0xcb, 0x77, 0x8e, 0x67, 0x30, 0xc3, 0x73, 0x9a, 0x2e, 0x48, 0xab, 0xdf, 0xdb, 0x0e, 0x2c, 0x22, 0x03, 0x07, 0x30, 0x83, 0xd5, 0xf3, 0x8b, 0x59, 0xdb, 0x81, 0x3c, 0x77, 0x30, 0xb7, 0x42, 0xaf, 0xed, 0x93, 0xb1, 0x95, 0xe4, 0xf3, 0x04, 0x85, 0x91, 0xb2, 0xb5, 0xe8, 0x4d, 0x14, 0x0b, 0xb2, 0xc5, 0x64, 0x34, 0x2f, 0xab, 0xdb, 0x93, 0x00, 0xab ],
+const [ 0x99, 0x28, 0x68, 0x50, 0x4d, 0x25, 0x64, 0xc4, 0xfb, 0x47, 0xbc, 0xbd, 0x4a, 0xe4, 0x82, 0xd8, 0xfb, 0x0e, 0x8e, 0x56, 0xd7, 0xb8, 0x18, 0x64, 0xe6, 0x19, 0x86, 0xa0, 0xe2, 0x56, 0x82, 0xda, 0xeb, 0x5b, 0x50, 0x17, 0x7c, 0x09, 0x5e, 0xdc, 0x9e, 0x97, 0x1d, 0xa9, 0x5c, 0x32, 0x10, 0xc3, 0x76, 0xe7, 0x23, 0x36, 0x5a, 0xc3, 0x3d, 0x1b, 0x4f, 0x39, 0x18, 0x17, 0xf4, 0xc3, 0x51, 0x24 ],
+const [ 0xce, 0xab, 0x39, 0x8e, 0x41, 0x07, 0x48, 0x3e, 0xde, 0x64, 0xce, 0x10, 0x7c, 0x92, 0x70, 0xe6, 0x02, 0x27, 0x78, 0xb6, 0x1f, 0x6a, 0x25, 0x8d, 0x3b, 0x70, 0x45, 0xd4, 0xad, 0x85, 0x06, 0xd3, 0x2e, 0xce, 0x0a, 0x73, 0x8d, 0x2c, 0xb9, 0x48, 0xa5, 0x62, 0xdb, 0xce, 0x8d, 0x7b, 0x66, 0xf3, 0x0e, 0x66, 0x94, 0xd6, 0x5a, 0xe4, 0x39, 0xcf, 0xfa, 0xa4, 0x54, 0xaf, 0x09, 0xab, 0xe4, 0x49 ],
+const [ 0x6a, 0x61, 0x55, 0xdc, 0x4d, 0x59, 0xc6, 0xbf, 0x46, 0xca, 0xa3, 0xde, 0x09, 0x66, 0x63, 0x26, 0xda, 0x30, 0x8c, 0x51, 0xa2, 0x3e, 0x6e, 0xc3, 0x42, 0xbd, 0x12, 0xb2, 0x27, 0x37, 0x6e, 0x8a, 0x1f, 0x11, 0xda, 0x90, 0x6b, 0x58, 0xc8, 0xc5, 0x15, 0xbd, 0xaf, 0x0d, 0x84, 0xdd, 0x48, 0x90, 0x4d, 0xc6, 0xfd, 0x61, 0x4c, 0xb7, 0x9f, 0x5e, 0xf4, 0x28, 0x57, 0x57, 0xe3, 0x0a, 0xdf, 0x72 ],
+const [ 0xce, 0x97, 0xde, 0xd4, 0x7e, 0x10, 0x1a, 0x6d, 0x0a, 0xa1, 0x04, 0x11, 0x38, 0x09, 0x35, 0x86, 0x04, 0x65, 0x24, 0xf5, 0x43, 0x45, 0xec, 0x9e, 0x86, 0x05, 0x50, 0xc9, 0x41, 0x5b, 0xfc, 0x00, 0x2d, 0x2c, 0x0d, 0x7b, 0xea, 0xa4, 0xd4, 0xdc, 0xe9, 0x85, 0xd7, 0x1d, 0x89, 0xbf, 0x19, 0xc6, 0x80, 0x42, 0x9c, 0x63, 0x7d, 0x10, 0x23, 0x35, 0x0c, 0x96, 0x3c, 0x28, 0xb9, 0x3c, 0x7e, 0x05 ],
+const [ 0x55, 0x4e, 0x34, 0x45, 0x37, 0xa0, 0x96, 0x59, 0x92, 0x0c, 0x19, 0xb4, 0x0f, 0x28, 0x50, 0xb0, 0x72, 0x35, 0xc3, 0xc7, 0x20, 0x99, 0x93, 0xa6, 0xde, 0x90, 0x5c, 0x82, 0xdb, 0x1e, 0x5f, 0xaf, 0xf1, 0x48, 0xe1, 0x6f, 0x28, 0x83, 0xce, 0x08, 0x7c, 0x6d, 0xa2, 0x19, 0xe0, 0xbb, 0x89, 0x2d, 0x82, 0x72, 0xc5, 0x91, 0x51, 0x5b, 0x51, 0x63, 0xbd, 0xb0, 0xc4, 0xec, 0xbd, 0x1c, 0x77, 0x30 ],
+const [ 0x76, 0xd8, 0xe0, 0x34, 0x20, 0x11, 0xd2, 0xbc, 0xa9, 0x53, 0xb2, 0x6e, 0xe2, 0x00, 0xe5, 0x66, 0x85, 0xb7, 0x21, 0xd5, 0x0e, 0xd4, 0xdd, 0xa7, 0xcd, 0x3a, 0x05, 0x63, 0x3a, 0x50, 0xf1, 0x53, 0x88, 0x49, 0x98, 0xe6, 0x7d, 0xa9, 0x01, 0x52, 0x80, 0x04, 0xfb, 0x7d, 0xf4, 0x09, 0x0e, 0x1e, 0xc4, 0xc0, 0xb1, 0x1f, 0x3f, 0x10, 0xbd, 0x47, 0x27, 0x84, 0x22, 0x15, 0x04, 0x4f, 0xd9, 0xef ],
+const [ 0x73, 0x1e, 0xc9, 0xf3, 0x65, 0xf2, 0x8f, 0x1c, 0xb9, 0xc4, 0xeb, 0xcf, 0x89, 0xd8, 0x64, 0x87, 0x32, 0xa6, 0xdf, 0xa9, 0x58, 0xd2, 0xc0, 0x15, 0x2b, 0x5e, 0x52, 0xfa, 0xe8, 0x1f, 0x69, 0xee, 0xa2, 0x6d, 0x46, 0x3e, 0x42, 0x1f, 0xba, 0x82, 0xcd, 0xb7, 0x8f, 0x75, 0xe5, 0xd9, 0x23, 0x04, 0x93, 0x02, 0x56, 0xa5, 0x43, 0x76, 0xa6, 0xea, 0x10, 0x7a, 0x99, 0x56, 0x42, 0xc4, 0x5c, 0x6f ],
+const [ 0xcc, 0x38, 0x82, 0x65, 0x23, 0xa9, 0x09, 0x7e, 0x0f, 0x7d, 0x07, 0x5a, 0x3a, 0x03, 0x9a, 0x70, 0xca, 0x1e, 0x2b, 0x55, 0x90, 0xa6, 0x44, 0x3e, 0x82, 0x0b, 0xa1, 0xc1, 0x6c, 0x3b, 0x89, 0xdb, 0xe2, 0xc6, 0x5f, 0x37, 0x79, 0x40, 0x74, 0xad, 0x37, 0xe8, 0x1f, 0x0a, 0x47, 0x86, 0x10, 0x0f, 0xf1, 0x9a, 0xe1, 0xbc, 0xca, 0xb2, 0xee, 0xce, 0x28, 0x1c, 0x67, 0x86, 0xd9, 0xbd, 0xa3, 0xac ],
+const [ 0x62, 0xc1, 0xd1, 0x49, 0x56, 0x7f, 0x05, 0xa0, 0xb7, 0x6c, 0x4f, 0xd3, 0x2d, 0x1f, 0x36, 0x5d, 0x17, 0x0c, 0xb1, 0x65, 0xcf, 0xb3, 0x8f, 0x92, 0x2f, 0x17, 0x16, 0x22, 0x54, 0x72, 0xeb, 0x36, 0xa1, 0x27, 0x32, 0x70, 0x07, 0xf8, 0xf5, 0xc0, 0x84, 0x79, 0xca, 0x7b, 0xea, 0xc4, 0xb0, 0xae, 0xe2, 0x6f, 0x3b, 0xb1, 0x30, 0xbb, 0xf1, 0xff, 0x39, 0x0e, 0xf3, 0x44, 0xc2, 0xa4, 0xe0, 0xb8 ],
+const [ 0xaf, 0x81, 0xe3, 0x27, 0x52, 0x5f, 0x3a, 0x91, 0x04, 0xb7, 0x28, 0x29, 0x59, 0xa0, 0xf6, 0x60, 0x0f, 0xad, 0x7e, 0xfa, 0xe7, 0x70, 0x9b, 0xb8, 0xb3, 0x3c, 0xde, 0x34, 0xb1, 0x2f, 0x83, 0x0c, 0x17, 0x70, 0xa3, 0x42, 0xef, 0xb6, 0xab, 0xe3, 0x25, 0x0a, 0x0c, 0xe7, 0xdf, 0xcd, 0x34, 0x59, 0x0c, 0xfc, 0xbe, 0xb8, 0x40, 0xb3, 0xe5, 0x9c, 0xbf, 0xf0, 0x3f, 0x9c, 0xd8, 0x9a, 0xa8, 0x70 ],
+const [ 0x17, 0xa5, 0xba, 0xec, 0xf9, 0x16, 0x63, 0x44, 0x33, 0xdc, 0xf1, 0x33, 0xdd, 0xc2, 0xdc, 0xdf, 0xcf, 0x4a, 0x68, 0x0e, 0x08, 0x89, 0x28, 0x98, 0x51, 0x38, 0xc0, 0x1d, 0x1d, 0x09, 0xee, 0xf3, 0xb4, 0x37, 0xcc, 0x62, 0x90, 0x61, 0x4f, 0x14, 0x07, 0x98, 0x14, 0xc7, 0x2b, 0xb7, 0x5c, 0x45, 0xef, 0xf2, 0x55, 0x96, 0x8b, 0xb2, 0x9b, 0x74, 0x21, 0xa1, 0xfe, 0xff, 0xa0, 0x00, 0x86, 0xb2 ],
+const [ 0xe0, 0x9a, 0xd7, 0xd2, 0xff, 0x8d, 0x55, 0x9a, 0x26, 0xe0, 0x45, 0x4b, 0xcb, 0xff, 0xf8, 0x44, 0xe8, 0xd2, 0x41, 0x5b, 0x07, 0x87, 0x2b, 0xc5, 0x9c, 0x93, 0xe7, 0x36, 0x98, 0xf3, 0x08, 0x48, 0x3b, 0xb8, 0xf3, 0x21, 0x2a, 0xc2, 0x90, 0x50, 0xc1, 0xcc, 0x46, 0xf9, 0xaa, 0xa9, 0x27, 0x32, 0xaf, 0xcc, 0x67, 0xac, 0xcc, 0x0e, 0x13, 0x96, 0x89, 0xac, 0xff, 0xbe, 0x87, 0x8f, 0x01, 0xfa ],
+const [ 0xfd, 0x01, 0x3d, 0x61, 0x5c, 0x6c, 0xa9, 0x59, 0x03, 0x0a, 0x52, 0x0e, 0x14, 0x88, 0x08, 0xa0, 0x7e, 0x27, 0xd3, 0x8a, 0x21, 0x56, 0x34, 0xd5, 0x34, 0x86, 0xae, 0x8b, 0xe4, 0x3a, 0x85, 0x6f, 0x3e, 0x5d, 0xc6, 0xeb, 0x4f, 0xd9, 0x87, 0x4a, 0x8a, 0x65, 0x70, 0x27, 0x6a, 0x9e, 0x7b, 0x25, 0x58, 0x5a, 0xf7, 0xe1, 0xce, 0x39, 0xd3, 0x25, 0xbd, 0x7d, 0x19, 0x5f, 0x2c, 0x1b, 0xb9, 0x51 ],
+const [ 0x62, 0xe3, 0xa7, 0x35, 0xed, 0xcd, 0x87, 0xfc, 0xa0, 0xdd, 0x1d, 0x27, 0x97, 0xcc, 0x0e, 0x57, 0x41, 0x60, 0xda, 0x9a, 0xc2, 0x3f, 0x60, 0xe3, 0x95, 0x01, 0xa5, 0xb7, 0x76, 0x88, 0xd1, 0x28, 0x7f, 0x94, 0x7a, 0x07, 0x91, 0x92, 0x25, 0x56, 0xf5, 0xb5, 0x0a, 0xfc, 0x43, 0x48, 0x18, 0xbc, 0x83, 0x43, 0x39, 0x68, 0x93, 0x1c, 0xd7, 0x52, 0xc9, 0xdf, 0x9f, 0x04, 0xd8, 0x81, 0x85, 0x31 ],
+const [ 0xab, 0xc9, 0xcc, 0xdf, 0xbd, 0x92, 0xb6, 0x91, 0x9a, 0x5d, 0x6c, 0x6b, 0x5a, 0x76, 0x5a, 0x39, 0x66, 0x2e, 0xd9, 0x00, 0x80, 0xd3, 0x54, 0x92, 0x04, 0xdf, 0xaa, 0x5f, 0x6d, 0x70, 0xd4, 0x8e, 0x1a, 0xf8, 0xc8, 0x4d, 0x53, 0x36, 0x9d, 0x65, 0x87, 0x65, 0xef, 0x11, 0xd7, 0xb3, 0x85, 0x10, 0xd9, 0xf4, 0x31, 0xf9, 0x95, 0x98, 0xf8, 0xcf, 0xd4, 0xda, 0x73, 0xd5, 0x9b, 0x3b, 0x75, 0xa3 ],
+const [ 0x07, 0xc3, 0x58, 0xed, 0x1d, 0xf3, 0xb0, 0x6d, 0x47, 0xb5, 0xec, 0x76, 0x3a, 0xfa, 0x07, 0xa6, 0x67, 0x7c, 0xa3, 0xa7, 0x22, 0x52, 0x4e, 0x61, 0x03, 0xc1, 0x05, 0x6d, 0x8c, 0x56, 0xf6, 0xcd, 0x0d, 0x31, 0x8a, 0xdb, 0xc5, 0xa4, 0xa3, 0x80, 0x4a, 0xfd, 0x23, 0xa6, 0x2b, 0x9f, 0xad, 0xf0, 0xd3, 0x58, 0xaf, 0xa8, 0xb0, 0xee, 0xa0, 0xf9, 0x95, 0xfb, 0x86, 0x5e, 0x5d, 0xfb, 0xbc, 0x5a, 0xd2, 0xa4, 0xf2, 0x6a, 0xcd, 0x76 ],
+const [ 0xab, 0x8d, 0xfb, 0xa4, 0x41, 0x4e, 0x69, 0x86, 0x51, 0x3a, 0x97, 0x67, 0xaf, 0x5e, 0xae, 0xd9, 0x72, 0x08, 0x11, 0xc4, 0xb3, 0x80, 0x40, 0xb9, 0x91, 0xf3, 0xfd, 0x82, 0x78, 0xb0, 0xad, 0xfe, 0xa4, 0x97, 0x00, 0x2c, 0xe0, 0xcd, 0xd4, 0x85, 0x94, 0xb5, 0x57, 0x8f, 0xfe, 0x1c, 0x6c, 0xaf, 0xc0, 0xb4, 0x51, 0x3e, 0x9b, 0xc4, 0x7e, 0xe0, 0x7a, 0x1d, 0xd0, 0x11, 0xb2, 0x50, 0xe6, 0x01, 0x88, 0x1e, 0xcc, 0xa2, 0xf4, 0x30 ],
+const [ 0xfc, 0x68, 0xbe, 0x1e, 0x46, 0xa7, 0xed, 0x0d, 0x42, 0x93, 0xc6, 0xeb, 0xab, 0x8d, 0x75, 0x46, 0xa7, 0xb6, 0xe9, 0x5d, 0x49, 0x5f, 0x7d, 0x31, 0x5a, 0xc1, 0xd8, 0xdf, 0x59, 0xee, 0x11, 0x2c, 0xc0, 0x08, 0x17, 0x62, 0x89, 0xb1, 0x51, 0x5b, 0xf1, 0xc2, 0x81, 0xdb, 0x7c, 0x40, 0xee, 0x23, 0x39, 0x8c, 0xc2, 0xc2, 0x47, 0xd9, 0xb1, 0xaf, 0x98, 0xe3, 0xdb, 0x95, 0xf5, 0xdf, 0xf4, 0x6e, 0x42, 0xad, 0xa2, 0x53, 0x04, 0x55 ],
+const [ 0x6e, 0x9c, 0xe3, 0x4b, 0x4f, 0xbc, 0x78, 0xea, 0x92, 0xd3, 0xd1, 0x45, 0x92, 0xe1, 0xc0, 0x72, 0x5b, 0xd0, 0x53, 0xd7, 0x0f, 0x4c, 0x59, 0x9b, 0x89, 0xd4, 0x21, 0x5a, 0x3f, 0x11, 0x85, 0x1d, 0x6d, 0x67, 0x27, 0x89, 0x70, 0xcb, 0xfb, 0x56, 0x6f, 0xd4, 0x06, 0x03, 0x41, 0x14, 0x65, 0xc8, 0x8b, 0xa8, 0x90, 0xcd, 0x29, 0x0e, 0xe0, 0x99, 0xd0, 0x37, 0x4f, 0xcd, 0xf1, 0xdd, 0x80, 0x12, 0xe0, 0x17, 0xff, 0x50, 0x35, 0x2b ],
+const [ 0x91, 0xe8, 0x7e, 0x19, 0xa4, 0xa4, 0xaf, 0x9b, 0x20, 0x68, 0xf8, 0x42, 0xe6, 0x24, 0xda, 0x9a, 0x21, 0xe5, 0x7c, 0x40, 0xcc, 0x4d, 0x4d, 0xf5, 0x75, 0x41, 0xeb, 0xf1, 0x40, 0xe1, 0x44, 0x79, 0x2e, 0xbd, 0xfb, 0xb4, 0x9f, 0x45, 0x0d, 0xbb, 0x16, 0x82, 0xb4, 0xef, 0x3d, 0x04, 0x8b, 0x8f, 0x29, 0x1c, 0xf3, 0x8a, 0xde, 0x4b, 0xb6, 0x91, 0x16, 0xf9, 0xeb, 0x71, 0x3e, 0x6a, 0x1a, 0xa0, 0xc2, 0xef, 0xa0, 0x15, 0x8a, 0x59 ],
+const [ 0x1a, 0xbf, 0x71, 0x69, 0x8a, 0x7d, 0x52, 0xb4, 0x1c, 0xaa, 0x5c, 0x26, 0x55, 0x8d, 0x46, 0xe8, 0xcf, 0x27, 0xa4, 0x90, 0xd2, 0x70, 0x16, 0x8c, 0x23, 0xe4, 0xc0, 0xc4, 0x21, 0x3e, 0xfa, 0x7b, 0x0d, 0x84, 0x48, 0x76, 0xaa, 0x43, 0x8c, 0x61, 0x06, 0x1c, 0x7a, 0x6e, 0x97, 0x7f, 0x4d, 0x3f, 0x89, 0xb7, 0xb8, 0x06, 0x57, 0x27, 0x20, 0xeb, 0x99, 0xd3, 0x08, 0xae, 0x1d, 0x22, 0xcd, 0x8d, 0x38, 0xe2, 0x93, 0x68, 0x5e, 0x8c ],
+const [ 0xf8, 0xdf, 0xf7, 0xf4, 0x1b, 0x7e, 0x3e, 0xf6, 0xd5, 0x58, 0xdc, 0xd8, 0x3d, 0x34, 0x4d, 0xb5, 0x55, 0x1d, 0x41, 0x0e, 0xec, 0xb5, 0xa0, 0xbc, 0xc2, 0xcc, 0xcb, 0x29, 0xee, 0x31, 0x25, 0xc0, 0x7d, 0xc8, 0xd2, 0xa2, 0x5c, 0xdd, 0xbe, 0x9b, 0x78, 0xb8, 0xe1, 0x54, 0x23, 0x72, 0xc2, 0xca, 0xba, 0x07, 0x3a, 0xfe, 0x84, 0xab, 0x7b, 0xef, 0xde, 0x62, 0x50, 0xc5, 0x95, 0xcb, 0xa7, 0x4f, 0x94, 0x3c, 0x4c, 0xaf, 0xbf, 0x14 ],
+const [ 0x9f, 0xb4, 0xd6, 0xfc, 0xd6, 0x97, 0xd4, 0x52, 0x2d, 0xc7, 0xe3, 0x86, 0xab, 0x41, 0xdd, 0x9f, 0x8a, 0x63, 0x79, 0x06, 0xe0, 0xfe, 0x12, 0x3b, 0x7f, 0xac, 0xab, 0xc7, 0x19, 0x64, 0x31, 0x72, 0xa8, 0x4b, 0xff, 0xb5, 0x0c, 0xcd, 0xa8, 0x72, 0xf6, 0xed, 0xf0, 0xe3, 0x06, 0xd9, 0x1b, 0xd1, 0x30, 0xc2, 0x6b, 0x06, 0x64, 0xea, 0xe4, 0x04, 0x6e, 0xff, 0x52, 0xf7, 0x1b, 0xa7, 0x8d, 0xe9, 0x9d, 0x5c, 0xfc, 0x35, 0x30, 0x7a ],
+const [ 0xce, 0x3a, 0x2b, 0xec, 0x5c, 0xa0, 0x0b, 0x54, 0x4e, 0x8d, 0x39, 0x2e, 0xd3, 0x09, 0xe9, 0xee, 0x5d, 0x48, 0xd1, 0x85, 0xed, 0xdd, 0x8b, 0x33, 0x90, 0x2a, 0x3b, 0x9d, 0x29, 0x1b, 0x71, 0x1f, 0x72, 0x14, 0x51, 0x63, 0x3e, 0x27, 0xf1, 0x33, 0x01, 0x8b, 0x02, 0x8b, 0x91, 0x49, 0xb3, 0xf3, 0x2e, 0x39, 0xd2, 0x0b, 0xc1, 0x2d, 0x34, 0x68, 0x61, 0x6c, 0x58, 0x9e, 0x1b, 0x62, 0x47, 0x9e, 0xf3, 0x95, 0xbe, 0x43, 0x26, 0xdb ],
+const [ 0xb1, 0x27, 0xe4, 0x81, 0x9e, 0x17, 0x2c, 0xa0, 0x98, 0x68, 0xc2, 0x86, 0x36, 0xdf, 0xa6, 0x3b, 0x2e, 0xef, 0xd1, 0xea, 0xd2, 0x2d, 0xd3, 0xf0, 0xdb, 0x04, 0xbb, 0x33, 0x66, 0xaa, 0x37, 0xb5, 0x3c, 0x52, 0xfc, 0x69, 0x56, 0xa4, 0x68, 0x45, 0xa1, 0x6a, 0x66, 0x98, 0xfe, 0x8c, 0x93, 0x9e, 0x8d, 0x3e, 0x9f, 0x51, 0x2b, 0x78, 0xf5, 0x83, 0x39, 0xa6, 0x9e, 0x2a, 0xa0, 0xa2, 0x62, 0xfb, 0x11, 0xdf, 0x31, 0x3a, 0x92, 0xe7 ],
+const [ 0xa0, 0x4b, 0x62, 0x05, 0xd7, 0xe7, 0x12, 0xaf, 0xf2, 0x8a, 0x8d, 0x52, 0x0a, 0x79, 0x54, 0x7e, 0x41, 0xe4, 0x28, 0x00, 0x00, 0x19, 0x70, 0xb3, 0x83, 0xf8, 0xdc, 0x99, 0x98, 0xa7, 0x48, 0x2a, 0xa3, 0x87, 0xe3, 0xec, 0xe6, 0x66, 0x90, 0x44, 0xff, 0xf6, 0x8c, 0x8c, 0xb2, 0x7d, 0x51, 0x65, 0xe9, 0xcf, 0xbb, 0x4f, 0xf9, 0x7a, 0x6a, 0x77, 0x27, 0x40, 0x67, 0xcf, 0x6b, 0xca, 0x0a, 0x64, 0x74, 0x9a, 0x1b, 0xed, 0xeb, 0x42 ],
+const [ 0xbe, 0xeb, 0xa7, 0x95, 0x99, 0x95, 0x35, 0x8a, 0x1c, 0x23, 0x8d, 0xc2, 0xf4, 0x57, 0xf3, 0xc0, 0xaa, 0x6f, 0x47, 0x37, 0x2f, 0x5f, 0x34, 0x71, 0xb8, 0x5f, 0xab, 0xf1, 0xcb, 0xa5, 0x90, 0x58, 0x9a, 0x74, 0xb3, 0x85, 0x91, 0x55, 0x01, 0x00, 0x2b, 0xa5, 0xfc, 0x99, 0x09, 0x4f, 0x68, 0x4c, 0x45, 0xdb, 0x47, 0x68, 0x04, 0xa8, 0x08, 0xf1, 0x4a, 0x75, 0xfc, 0x42, 0x13, 0x26, 0x09, 0xf6, 0x9f, 0xc5, 0xa2, 0x09, 0x0d, 0xc8 ],
+const [ 0xe7, 0x74, 0x7f, 0x39, 0xb1, 0xc6, 0xc0, 0x15, 0x7a, 0x91, 0x28, 0xc0, 0x12, 0x39, 0x1e, 0x51, 0x48, 0x20, 0x0e, 0xd5, 0x00, 0x6a, 0x19, 0x39, 0x86, 0x04, 0x0a, 0x6a, 0x22, 0xe4, 0x8c, 0xba, 0xed, 0x92, 0x9b, 0x86, 0xe2, 0xe7, 0x39, 0x15, 0x38, 0x14, 0x62, 0xc4, 0xf0, 0xe7, 0x41, 0x60, 0xaa, 0x4a, 0xa4, 0xd4, 0xbc, 0x0d, 0xae, 0x04, 0x85, 0xe5, 0xcb, 0xf8, 0xff, 0xb4, 0xe9, 0x3d, 0x94, 0x0a, 0xe6, 0x88, 0x33, 0xec ],
+const [ 0x2f, 0x95, 0xc1, 0xd1, 0xd9, 0x4d, 0xb8, 0xce, 0x7b, 0xda, 0xfc, 0x8a, 0xf1, 0xb7, 0xe4, 0x8f, 0xef, 0xd9, 0x6b, 0x7a, 0xe8, 0xf7, 0x33, 0xf7, 0x2f, 0x29, 0xca, 0xed, 0x5d, 0xb4, 0x2d, 0xf6, 0xf2, 0x24, 0x8a, 0x12, 0x3f, 0x9c, 0x4a, 0x9c, 0x83, 0x6b, 0x4f, 0x7d, 0x54, 0xdf, 0x7a, 0x9f, 0x40, 0x5e, 0x71, 0xa5, 0xb5, 0xb2, 0x9f, 0xd9, 0x1e, 0xa5, 0x7c, 0x65, 0x4f, 0xce, 0x0e, 0xc7, 0x23, 0xaa, 0xb0, 0x7f, 0x63, 0xef ],
+const [ 0xad, 0xdf, 0xd6, 0x00, 0x41, 0x6f, 0x85, 0x11, 0xf3, 0xf0, 0x7b, 0x03, 0xdf, 0x22, 0x48, 0xb6, 0xbc, 0xec, 0x04, 0x70, 0x03, 0xf4, 0x93, 0x17, 0x54, 0x6c, 0x26, 0xa4, 0x17, 0x2f, 0x05, 0xd4, 0x5f, 0x0c, 0x8d, 0x20, 0x13, 0x61, 0x74, 0xf0, 0x4f, 0xec, 0x55, 0x0c, 0x08, 0xdf, 0x68, 0x53, 0xef, 0x32, 0x90, 0xaf, 0x98, 0x3d, 0x9c, 0x48, 0xdc, 0x86, 0xc6, 0xf8, 0x7c, 0xd8, 0x80, 0x00, 0x06, 0x95, 0x71, 0xf9, 0xfd, 0x4c ],
+const [ 0x05, 0x8f, 0x60, 0x4e, 0x53, 0x05, 0x1a, 0x0f, 0x85, 0x50, 0xde, 0x16, 0xb7, 0x24, 0x5f, 0xda, 0xd3, 0xda, 0x63, 0x9a, 0x6c, 0xc3, 0xc8, 0x4e, 0xea, 0xbc, 0xc5, 0xdd, 0xe8, 0x02, 0x73, 0x90, 0xda, 0x48, 0x8c, 0xc7, 0xf3, 0x07, 0x72, 0xeb, 0x46, 0x16, 0x73, 0xa3, 0x2b, 0x7a, 0x4b, 0x4b, 0xe4, 0x7f, 0xea, 0xa2, 0x80, 0x08, 0x78, 0xc2, 0x00, 0x23, 0x97, 0x56, 0xb9, 0xe0, 0xe8, 0x07, 0xf9, 0x64, 0xd0, 0x37, 0xed, 0x39 ],
+const [ 0x98, 0x6e, 0x0d, 0x3c, 0x3e, 0x76, 0x45, 0xe4, 0x93, 0xd3, 0x59, 0x62, 0x29, 0x1d, 0x97, 0x9d, 0xdf, 0x09, 0xe8, 0xa6, 0x10, 0xd5, 0xa7, 0x3d, 0x0a, 0xe7, 0xb3, 0x97, 0xc2, 0xb1, 0xc3, 0x5e, 0xc6, 0xd7, 0xfa, 0xfa, 0x72, 0x94, 0xbc, 0x0f, 0x67, 0x5a, 0xbf, 0x46, 0x39, 0xb8, 0x65, 0x51, 0x68, 0x81, 0x49, 0x29, 0x92, 0x2b, 0x17, 0x9a, 0xe6, 0x75, 0xa2, 0x02, 0xdc, 0x4c, 0x30, 0x56, 0x23, 0xf0, 0x18, 0x65, 0xdb, 0x53 ],
+const [ 0x7a, 0x41, 0xca, 0x87, 0x76, 0xa3, 0xdd, 0xe0, 0xf5, 0xc7, 0xd0, 0x29, 0xf2, 0x8a, 0x9b, 0xcd, 0x3c, 0x4d, 0xaa, 0xd2, 0xcc, 0xf9, 0xd6, 0x04, 0x56, 0x3f, 0x95, 0x50, 0x1e, 0x25, 0x6d, 0x6e, 0x0d, 0xbe, 0xaf, 0xc3, 0x04, 0x38, 0x61, 0x85, 0x70, 0x1d, 0x7c, 0x20, 0x1f, 0xd2, 0x58, 0xd8, 0x52, 0x64, 0x64, 0xb0, 0x13, 0x83, 0x1a, 0x8b, 0xc8, 0xcf, 0x32, 0x92, 0x09, 0x53, 0x16, 0xd5, 0xaf, 0x4f, 0x97, 0x35, 0x2d, 0x3b ],
+const [ 0xee, 0x36, 0xe5, 0x78, 0x4f, 0xcb, 0x43, 0x42, 0x7b, 0xe0, 0x72, 0xaa, 0xa9, 0x68, 0xea, 0x52, 0xbf, 0x3b, 0x73, 0xf5, 0x5d, 0x0b, 0x45, 0xfb, 0x1d, 0x99, 0x6d, 0x4a, 0x19, 0x28, 0x72, 0x5e, 0xae, 0x32, 0x39, 0x9c, 0x80, 0x5b, 0x26, 0xe3, 0xbe, 0xa3, 0x84, 0x65, 0xa8, 0xdf, 0x27, 0xb5, 0x4e, 0x6a, 0x4f, 0x20, 0x9a, 0x18, 0xd0, 0x41, 0x90, 0x6b, 0x70, 0xd0, 0xd5, 0x0a, 0x91, 0xbb, 0x6e, 0x6e, 0x10, 0x78, 0xcb, 0xdf ],
+const [ 0x27, 0xe1, 0xdc, 0xa4, 0x97, 0x8d, 0x2a, 0x05, 0xd3, 0xf9, 0xca, 0xbc, 0x29, 0xcb, 0x18, 0xc7, 0x6a, 0x21, 0x0b, 0x4e, 0xee, 0x82, 0x5d, 0x37, 0xd9, 0x15, 0xec, 0xf5, 0x9d, 0x10, 0x61, 0xa0, 0xc0, 0x74, 0x0f, 0x4b, 0xe0, 0xf8, 0x1e, 0x92, 0xf4, 0x42, 0xe8, 0x72, 0xd4, 0x5d, 0xa3, 0x5e, 0xfc, 0x68, 0x41, 0x8e, 0x8c, 0x8b, 0x94, 0x9b, 0x94, 0x30, 0xb6, 0x49, 0x8f, 0x6f, 0xa8, 0xa3, 0x2d, 0xc9, 0x39, 0x4e, 0x56, 0x1a ],
+const [ 0xb4, 0x15, 0x31, 0x4e, 0x15, 0x17, 0x01, 0xa5, 0x03, 0xb6, 0x2a, 0x5c, 0x8b, 0x5d, 0xba, 0x5a, 0xc3, 0x57, 0x23, 0x5a, 0x53, 0x3f, 0xe2, 0xf6, 0x34, 0xb8, 0x5f, 0x04, 0xb8, 0x5f, 0x14, 0x26, 0xcb, 0xfe, 0xf2, 0x9d, 0x78, 0x03, 0x00, 0x5e, 0xaf, 0x30, 0x46, 0x68, 0x45, 0x93, 0xe9, 0x54, 0x3c, 0xb9, 0x97, 0x2e, 0x45, 0x1f, 0x25, 0x83, 0x83, 0xe9, 0x77, 0xbb, 0x92, 0xd6, 0xa1, 0xa9, 0xc8, 0x74, 0x4b, 0x61, 0xba, 0x90 ],
+const [ 0xe0, 0x4e, 0x97, 0x31, 0x74, 0x2a, 0x76, 0x74, 0x45, 0x24, 0x7f, 0xba, 0x97, 0x01, 0xae, 0x17, 0xfc, 0x9a, 0xcc, 0x45, 0x1b, 0x8c, 0x4f, 0xf3, 0xaf, 0x30, 0x7c, 0x5f, 0xd3, 0xce, 0xce, 0x27, 0x7c, 0x0d, 0x9b, 0x5d, 0x47, 0xae, 0xf5, 0xd9, 0x75, 0x7a, 0xcf, 0xd3, 0x33, 0x79, 0x60, 0xb1, 0x1f, 0x65, 0xcd, 0x1d, 0x09, 0x5e, 0x02, 0x5b, 0xf6, 0xdf, 0xe0, 0xd9, 0x6b, 0xf1, 0x9e, 0x08, 0xe8, 0x9f, 0x69, 0x6b, 0xb2, 0xa9 ],
+const [ 0xbc, 0x37, 0x32, 0xe9, 0x01, 0x76, 0x8f, 0xc9, 0xb9, 0x83, 0x03, 0xd5, 0x99, 0x11, 0x0b, 0xe8, 0x23, 0x6c, 0x51, 0x51, 0x78, 0x00, 0x22, 0x79, 0x6d, 0x1b, 0x22, 0xc6, 0xe0, 0xf4, 0x3f, 0xbe, 0x4d, 0xeb, 0xe3, 0x70, 0x9c, 0x12, 0x6e, 0x0f, 0x3d, 0xed, 0xe3, 0xe1, 0x77, 0x76, 0xe1, 0x57, 0xfd, 0x64, 0xd6, 0x7e, 0xc3, 0xad, 0x6f, 0x96, 0x0f, 0x4a, 0x53, 0xff, 0xd3, 0x3a, 0x10, 0x5d, 0x3a, 0xc9, 0x55, 0xf4, 0x81, 0x12 ],
+const [ 0xd2, 0x22, 0x98, 0x32, 0xe4, 0x00, 0x06, 0x14, 0xfa, 0xc6, 0xdb, 0x5c, 0x0a, 0x23, 0x5e, 0x49, 0x21, 0x7f, 0xa4, 0xa9, 0xa8, 0x31, 0xf9, 0xaa, 0xe7, 0xf2, 0x82, 0xee, 0xc7, 0x91, 0x20, 0xdd, 0xdc, 0xe9, 0x96, 0x3f, 0xa2, 0x11, 0xef, 0x0a, 0x07, 0xd2, 0x1a, 0x78, 0x2a, 0x5e, 0xd8, 0x5d, 0x63, 0x3e, 0xd8, 0xb8, 0x83, 0x8d, 0x1f, 0x88, 0x5d, 0x64, 0xae, 0xe1, 0x85, 0x95, 0x5f, 0x3e, 0x57, 0x9c, 0x11, 0x19, 0x3b, 0xd2 ],
+const [ 0x04, 0x38, 0x99, 0xaf, 0x30, 0x14, 0x24, 0xed, 0x13, 0xd0, 0x00, 0x66, 0xc0, 0xc3, 0x7a, 0x44, 0x85, 0x91, 0xf2, 0x73, 0x71, 0xa2, 0x84, 0xb3, 0x14, 0xd2, 0xe7, 0xec, 0x86, 0x6a, 0x94, 0xc1, 0xab, 0x50, 0x2b, 0x67, 0xb4, 0x7a, 0x13, 0xb8, 0xe9, 0xa8, 0x61, 0x83, 0xa6, 0x53, 0xfc, 0x27, 0xa4, 0xe0, 0xfe, 0x60, 0x7a, 0x1a, 0x5d, 0x60, 0x64, 0xdf, 0xca, 0x22, 0x42, 0x19, 0xd9, 0xfb, 0xe4, 0xf1, 0x63, 0x72, 0x84, 0x3f ],
+const [ 0xb5, 0xfe, 0xe4, 0x66, 0xf1, 0x06, 0xd7, 0xa5, 0x26, 0xd4, 0x68, 0x46, 0x8a, 0x16, 0x98, 0x12, 0x51, 0x81, 0x5a, 0x02, 0x20, 0x73, 0xa4, 0x02, 0xc4, 0xd7, 0xc5, 0xf6, 0x24, 0x4a, 0xf9, 0xfb, 0x74, 0x7b, 0x3b, 0xef, 0xac, 0xd8, 0x5a, 0x33, 0x39, 0x67, 0x4f, 0xaf, 0xf2, 0xf1, 0xce, 0x17, 0x4d, 0x66, 0x1b, 0x6d, 0xd3, 0x7d, 0x1f, 0xc8, 0xd1, 0x9b, 0xbb, 0x53, 0x51, 0xf6, 0x5c, 0x98, 0x48, 0xfa, 0xd0, 0xff, 0x11, 0xec ],
+const [ 0xfd, 0x01, 0x3d, 0x61, 0x5c, 0x6c, 0xa9, 0x59, 0x03, 0x0a, 0x52, 0x0e, 0x14, 0x88, 0x08, 0xa0, 0x7e, 0x27, 0xd3, 0x8a, 0x21, 0x56, 0x34, 0xd5, 0x34, 0x86, 0xae, 0x8b, 0xe4, 0x3a, 0x85, 0x6f, 0x3e, 0x5d, 0xc6, 0xeb, 0x4f, 0xd9, 0x87, 0x4a, 0x8a, 0x65, 0x70, 0x27, 0x6a, 0x9e, 0x7b, 0x25, 0x58, 0x5a, 0xf7, 0xe1, 0xce, 0x39, 0xd3, 0x25, 0xbd, 0x7d, 0x19, 0x5f, 0x2c, 0x1b, 0xb9, 0x51, 0x22, 0x11, 0x88, 0x09, 0xc7, 0xfb ],
+const [ 0x05, 0x91, 0x5a, 0x68, 0xf1, 0x69, 0x38, 0xd7, 0xc6, 0xc5, 0xd4, 0x32, 0x69, 0x04, 0xe0, 0xf3, 0xb8, 0x9a, 0xcf, 0x4d, 0x70, 0x63, 0xe0, 0x1a, 0x4e, 0x38, 0x58, 0x15, 0x75, 0xbf, 0x0e, 0x49, 0x10, 0x87, 0x2d, 0xc9, 0x38, 0x54, 0x36, 0xa2, 0x18, 0xb7, 0x44, 0x0e, 0x4f, 0xe2, 0x94, 0xea, 0x95, 0xbb, 0x44, 0x6a, 0xa2, 0x2f, 0x5b, 0x0c, 0x4c, 0xc9, 0x0a, 0xca, 0xef, 0x83, 0x32, 0x94, 0x11, 0xdc, 0x25, 0xfd, 0x46, 0x2a ],
+const [ 0xb0, 0x5f, 0x0e, 0x3b, 0xbb, 0x12, 0xb9, 0x35, 0x1c, 0x46, 0x5a, 0xd5, 0xef, 0xf3, 0x1e, 0x65, 0xe5, 0x59, 0x56, 0xc5, 0xf4, 0xe4, 0xca, 0x68, 0x4d, 0x53, 0x50, 0x9f, 0x8f, 0x19, 0x9d, 0x1a, 0x3a, 0x03, 0x5a, 0xab, 0x66, 0x1c, 0x7b, 0x4e, 0xb5, 0xce, 0xcc, 0x67, 0x86, 0x49, 0xcc, 0x4a, 0x6b, 0x29, 0xbf, 0x00, 0xde, 0x52, 0xff, 0x49, 0x2f, 0x1f, 0x93, 0xdd, 0xc1, 0xbd, 0x02, 0xf7, 0x76, 0xd1, 0x69, 0x14, 0x68, 0x61 ],
+const [ 0x37, 0x14, 0x70, 0x78, 0x39, 0xda, 0xf7, 0x91, 0x22, 0xc7, 0x82, 0x41, 0x63, 0x51, 0x38, 0x5e, 0x88, 0xa8, 0x1d, 0x31, 0xc9, 0xf6, 0x41, 0xd8, 0xdc, 0xe5, 0x38, 0xe9, 0x0e, 0x63, 0xc9, 0x58, 0x92, 0xa2, 0xea, 0x9b, 0x19, 0x62, 0xed, 0x0b, 0xa3, 0x72, 0xf4, 0x8e, 0x94, 0x74, 0xaa, 0x73, 0x0a, 0xe2, 0x35, 0x9d, 0x6e, 0x4e, 0x66, 0xe4, 0x49, 0xee, 0x33, 0xb8, 0x59, 0x57, 0x68, 0x07, 0xe5, 0x89, 0x99, 0x61, 0x4d, 0x2c ],
+const [ 0xc0, 0x9e, 0x29, 0x07, 0x1c, 0x40, 0x5d, 0x5e, 0x82, 0x0d, 0x34, 0x5a, 0x46, 0xdb, 0xbf, 0x1e, 0x0f, 0x82, 0x02, 0xe9, 0x2d, 0xe3, 0xed, 0x3e, 0x2d, 0x29, 0x8e, 0x43, 0xaa, 0x4f, 0x84, 0x68, 0x66, 0xe3, 0xb7, 0x48, 0x99, 0x09, 0x46, 0xd4, 0x88, 0xc2, 0xc1, 0xae, 0x5a, 0x6e, 0x99, 0xd3, 0x27, 0x90, 0xd4, 0x7d, 0x53, 0xd2, 0x05, 0x48, 0x1a, 0x49, 0x7c, 0x93, 0x6b, 0xf9, 0xba, 0x29, 0xfa, 0x9c, 0x28, 0x21, 0x91, 0x9f ],
+const [ 0xbc, 0xe5, 0x0c, 0xdf, 0xff, 0x84, 0x38, 0x85, 0xd4, 0xf3, 0x64, 0xd6, 0x9f, 0x93, 0xbf, 0x58, 0xa2, 0x32, 0x2c, 0x70, 0x7b, 0x82, 0xe8, 0x78, 0xee, 0xc9, 0x6d, 0x11, 0xe5, 0xdb, 0x97, 0xbb, 0xb5, 0x46, 0x06, 0xa3, 0xa3, 0xcc, 0xc3, 0xbb, 0xa7, 0x16, 0x26, 0x10, 0x70, 0xa6, 0xf7, 0x59, 0xa7, 0x0e, 0xd3, 0xcb, 0x78, 0x5f, 0xd1, 0x35, 0x4f, 0xe5, 0x66, 0x48, 0xdf, 0x11, 0x86, 0x36, 0x69, 0xb7, 0x0c, 0x80, 0x3b, 0x7a ],
+const [ 0x0c, 0xb3, 0x5a, 0x02, 0xdd, 0xc8, 0xc7, 0xfb, 0x7c, 0x93, 0xae, 0xab, 0x77, 0xb9, 0x31, 0x81, 0x18, 0xb0, 0xfd, 0x44, 0x95, 0x24, 0x20, 0x9d, 0x87, 0x9a, 0x1c, 0xd6, 0x9d, 0x54, 0x39, 0xe1, 0x92, 0x74, 0x1f, 0x9c, 0x5c, 0x64, 0xa3, 0x53, 0xa7, 0x74, 0xe2, 0x86, 0x81, 0xc5, 0x8c, 0xed, 0x57, 0x67, 0x83, 0xba, 0x20, 0xbe, 0xa5, 0x1e, 0xd8, 0x2a, 0xe5, 0x0e, 0x30, 0xe6, 0xa1, 0x47, 0x84, 0x31, 0x30, 0x90, 0x0d, 0xac ],
+const [ 0xcd, 0xdf, 0x76, 0xf9, 0x85, 0xd6, 0x79, 0x7c, 0x9f, 0xe3, 0x83, 0x0c, 0x21, 0x05, 0x67, 0xc5, 0x09, 0x4f, 0xb9, 0x79, 0x34, 0x3f, 0xd5, 0xa1, 0x80, 0x4c, 0x23, 0x9a, 0x2e, 0xbe, 0x9a, 0x0e, 0x8a, 0xc2, 0x83, 0xb0, 0xcd, 0xbe, 0x80, 0x2c, 0x42, 0xe2, 0xcc, 0x5d, 0xa8, 0x00, 0xc4, 0xc1, 0xd8, 0x9d, 0xa7, 0x2b, 0xa7, 0x48, 0x9a, 0xb8, 0x0e, 0x2a, 0xef, 0x04, 0x88, 0xdf, 0xa6, 0x9e, 0xbc, 0x84, 0x34, 0xb9, 0x5c, 0x11 ],
+const [ 0x73, 0x1b, 0xdc, 0x9f, 0xb2, 0x19, 0xf3, 0x66, 0x7c, 0x9a, 0x13, 0x5e, 0xcf, 0x34, 0xc7, 0xf5, 0x2c, 0xf6, 0x38, 0xc3, 0x9c, 0x55, 0x4f, 0x1e, 0xf1, 0x69, 0x1a, 0xe8, 0x4e, 0x5a, 0x71, 0xac, 0xe9, 0x15, 0xd9, 0xe9, 0x10, 0x43, 0xa8, 0xae, 0x6a, 0x7b, 0x6a, 0x67, 0x80, 0xb6, 0x84, 0xf7, 0x7b, 0x04, 0x17, 0x07, 0x2f, 0x7e, 0x27, 0x9d, 0x59, 0x7c, 0xfd, 0xf0, 0x25, 0x08, 0xc9, 0x7b, 0xf4, 0x92, 0x8c, 0x50, 0x5b, 0xe5 ],
+const [ 0x85, 0x80, 0x6f, 0xf2, 0xa6, 0x42, 0xf7, 0x29, 0xd2, 0x8d, 0xed, 0x07, 0x34, 0xae, 0xf4, 0xf6, 0xa3, 0xf0, 0xbb, 0x32, 0x77, 0x1e, 0x77, 0x72, 0x9b, 0x43, 0x91, 0xca, 0xe4, 0xb4, 0x9b, 0xd0, 0xa1, 0x50, 0x89, 0xfe, 0x74, 0x07, 0x1e, 0x57, 0x60, 0x99, 0xa4, 0x4d, 0x22, 0xa0, 0xe0, 0xe3, 0xc5, 0xd1, 0x45, 0x0f, 0x71, 0x7f, 0x68, 0x62, 0x84, 0x60, 0xb4, 0xea, 0xe3, 0x94, 0x5f, 0x58, 0x93, 0xe3, 0x9c, 0x5e, 0x83, 0x47 ],
+const [ 0xf1, 0x37, 0x94, 0xe5, 0xea, 0x5e, 0x27, 0x50, 0x7a, 0x7b, 0xad, 0x63, 0x8f, 0x8e, 0xb8, 0xb8, 0x6c, 0xa5, 0xad, 0x73, 0xb5, 0xa1, 0x74, 0x24, 0xc6, 0x3c, 0x74, 0xef, 0x49, 0x4b, 0xbf, 0xea, 0x08, 0x41, 0x89, 0xc6, 0xff, 0xf5, 0xdf, 0xb2, 0xb6, 0xa5, 0x96, 0x7c, 0xce, 0x3a, 0x81, 0xf9, 0xd9, 0xcd, 0xe7, 0xa8, 0x6f, 0x6b, 0x33, 0x92, 0x7e, 0x15, 0xee, 0x74, 0xe1, 0x0b, 0xeb, 0x20, 0x34, 0x4b, 0xc1, 0x21, 0xe7, 0x54 ],
+const [ 0xe3, 0xd0, 0xc3, 0xab, 0xde, 0xf0, 0x69, 0xe6, 0xe4, 0xfa, 0x35, 0x01, 0x57, 0x97, 0xbd, 0x8a, 0x9d, 0x64, 0xbc, 0x9b, 0x75, 0xf2, 0x0b, 0x02, 0x8b, 0x12, 0xcc, 0xa0, 0x4a, 0x4f, 0xe8, 0x0f, 0xf1, 0xbb, 0xbd, 0x88, 0xe9, 0xef, 0x10, 0x03, 0x56, 0x4d, 0x49, 0x9f, 0xec, 0x88, 0xdf, 0x45, 0x03, 0x67, 0x11, 0x88, 0xee, 0xc5, 0xd7, 0xd0, 0x89, 0xdd, 0x18, 0xb8, 0x12, 0xc4, 0x1d, 0xb4, 0x3a, 0x37, 0x46, 0xf7, 0x7b, 0x97 ],
+const [ 0x51, 0xbb, 0xdf, 0x37, 0x12, 0x4c, 0xee, 0x0c, 0xd5, 0x83, 0x0e, 0x9d, 0x8f, 0x4b, 0x0e, 0xcf, 0xa4, 0x4c, 0x8b, 0x1b, 0xb8, 0x6a, 0x64, 0x33, 0xc1, 0x8f, 0x6e, 0xe9, 0x61, 0xab, 0x69, 0x4d, 0x74, 0xf9, 0x33, 0x16, 0xe5, 0x83, 0x3c, 0x44, 0xc5, 0xe8, 0x3a, 0x03, 0x9e, 0x5d, 0x1e, 0xd1, 0x04, 0xf2, 0x46, 0xe3, 0x6e, 0x17, 0xf4, 0xc5, 0x44, 0x5e, 0xff, 0x42, 0x39, 0x82, 0xc8, 0x83, 0xdb, 0xa9, 0x70, 0x7b, 0x68, 0xe6 ],
+const [ 0xe9, 0x57, 0x51, 0xc9, 0x9e, 0x14, 0xbe, 0xd0, 0xdd, 0x9b, 0xa1, 0x02, 0xf4, 0x8e, 0x5e, 0x44, 0x05, 0x19, 0xc5, 0x32, 0x08, 0xe0, 0x3a, 0xb7, 0x13, 0x36, 0x13, 0xda, 0xd9, 0x90, 0x42, 0xdb, 0x72, 0x39, 0x34, 0x7f, 0x5a, 0x47, 0xf9, 0xa8, 0xbb, 0xcd, 0xa4, 0x28, 0xef, 0x52, 0xf5, 0xd7, 0x40, 0x82, 0x35, 0xe4, 0xf3, 0x24, 0x62, 0x68, 0x86, 0x4c, 0x8c, 0x41, 0x35, 0xd2, 0x7f, 0x1d, 0xc3, 0x02, 0xa2, 0xd5, 0x76, 0x95 ],
+const [ 0x9d, 0xd1, 0x0a, 0x4c, 0x71, 0x37, 0x76, 0x70, 0x0f, 0x7e, 0x7e, 0x0a, 0x71, 0x0a, 0x01, 0x4b, 0x92, 0x3b, 0xf2, 0x28, 0x23, 0x4d, 0xaf, 0x5e, 0x80, 0x7c, 0x8e, 0xb3, 0xe2, 0x6c, 0xb9, 0x7f, 0xd6, 0xc9, 0x3d, 0x6c, 0xee, 0x2a, 0x5d, 0x7a, 0xb6, 0x3c, 0x2c, 0x46, 0xe9, 0x1c, 0x5b, 0x8b, 0xe5, 0x04, 0x4f, 0xe9, 0x5d, 0x2a, 0x76, 0xe5, 0x4e, 0xe5, 0xdc, 0x32, 0x34, 0x12, 0xf9, 0x2f, 0x7d, 0xb6, 0xce, 0xb0, 0x3e, 0xe5 ],
+const [ 0x36, 0xbb, 0xb5, 0x99, 0x25, 0xc6, 0x43, 0x21, 0x39, 0xc7, 0xcd, 0x1b, 0xbc, 0x2b, 0x1b, 0x05, 0xc4, 0x01, 0x0e, 0x09, 0x64, 0x5f, 0x79, 0x7e, 0x23, 0x01, 0x31, 0xb2, 0xad, 0x34, 0x68, 0xe7, 0xc9, 0xf2, 0x36, 0x9b, 0x8b, 0x4f, 0x79, 0x0d, 0xcb, 0x14, 0xdf, 0xfc, 0xd6, 0xa9, 0x41, 0xb2, 0x62, 0x38, 0x33, 0x41, 0xc8, 0x0f, 0xd9, 0x0d, 0x6d, 0x46, 0xfc, 0x8a, 0x81, 0xa2, 0x5c, 0x47, 0xed, 0xba, 0x48, 0x2c, 0x86, 0x58 ],
+const [ 0xff, 0xa6, 0x3e, 0xbb, 0xa8, 0x23, 0x9b, 0x68, 0x96, 0xbb, 0xec, 0x6a, 0xf1, 0xc7, 0xb8, 0x7b, 0x9c, 0x69, 0x25, 0x7a, 0x0d, 0x14, 0x6c, 0x0d, 0x5c, 0x4e, 0x8b, 0x8a, 0x99, 0xb4, 0x3a, 0x18, 0x63, 0x3f, 0x1f, 0x11, 0xb6, 0xc7, 0x45, 0xab, 0x05, 0xc5, 0xcb, 0xd8, 0x89, 0x5d, 0xd9, 0x6a, 0xd8, 0x9c, 0xd8, 0x7b, 0xb9, 0xfe, 0xe3, 0x0c, 0x37, 0x33, 0x78, 0xec, 0xf4, 0x22, 0x74, 0xdc, 0xc0, 0x2f, 0x3e, 0xf0, 0x6a, 0xb9 ],
+const [ 0x30, 0xbe, 0x32, 0x6c, 0x2f, 0xff, 0xf6, 0xd0, 0x31, 0xaf, 0xfd, 0xab, 0x0a, 0x27, 0xd5, 0xa8, 0xcb, 0xfc, 0x4b, 0xa9, 0xde, 0xc6, 0x26, 0xad, 0x52, 0x26, 0x15, 0xf7, 0x73, 0x07, 0xe5, 0x6d, 0x9e, 0x23, 0xf7, 0x3e, 0x53, 0xc9, 0xf2, 0xc7, 0x8c, 0xde, 0xb5, 0xb8, 0x4d, 0x23, 0x90, 0x72, 0x7d, 0xb5, 0xb3, 0xb4, 0xf4, 0xda, 0xe6, 0x77, 0xd5, 0xfa, 0x7b, 0x16, 0x1e, 0xec, 0x81, 0xb2, 0x7d, 0x74, 0x3b, 0xd5, 0x66, 0x09 ],
+const [ 0x19, 0xfb, 0x88, 0x77, 0x5a, 0x51, 0x7b, 0xfe, 0xde, 0xb2, 0xcd, 0xe7, 0xc9, 0x45, 0x5c, 0xa5, 0x8d, 0x40, 0xd1, 0x50, 0xb0, 0xa4, 0x7f, 0xfb, 0xd0, 0x28, 0x8e, 0x42, 0xe4, 0x72, 0x58, 0x22, 0xc4, 0x8d, 0x13, 0x0e, 0xec, 0x98, 0xb1, 0x3e, 0x7c, 0xbb, 0x04, 0x4b, 0x84, 0x60, 0x26, 0xf9, 0x7f, 0x9f, 0x18, 0x53, 0x1d, 0xf9, 0xa9, 0xfe, 0x46, 0x4a, 0x99, 0xc7, 0x5b, 0xf9, 0xff, 0x7e, 0xbf, 0x72, 0xe8, 0x07, 0x96, 0xd6 ],
+const [ 0x81, 0x5c, 0x2a, 0x91, 0x1a, 0xaf, 0x0f, 0x84, 0x98, 0x70, 0x61, 0x10, 0xa9, 0x5e, 0x6f, 0x9c, 0x26, 0xc3, 0xef, 0x52, 0xa3, 0xb1, 0x37, 0x81, 0x44, 0x8c, 0xb0, 0x3f, 0xd2, 0xc8, 0x87, 0x52, 0x0d, 0xf4, 0xa5, 0x51, 0x44, 0xf8, 0xe2, 0x06, 0x24, 0x9b, 0x75, 0x17, 0xce, 0x48, 0xaf, 0xe5, 0x2c, 0x11, 0xea, 0xb5, 0x84, 0xf4, 0xbc, 0x0e, 0x4d, 0x5d, 0x70, 0x61, 0x42, 0xed, 0xb6, 0xf0, 0xb6, 0x7a, 0x99, 0xe8, 0x27, 0x57, 0xb2, 0xd0, 0x15, 0xd5 ],
+const [ 0x48, 0x09, 0xf3, 0x1e, 0x93, 0x42, 0x3c, 0xab, 0xf4, 0x4c, 0xdd, 0xca, 0xd2, 0x3d, 0xa7, 0xd7, 0xae, 0xe7, 0x34, 0xd3, 0x11, 0xfc, 0x7b, 0xab, 0xc2, 0x76, 0xa1, 0xbd, 0x3d, 0x35, 0x13, 0x98, 0x61, 0xea, 0xd1, 0x03, 0x69, 0x35, 0x0d, 0x42, 0x1d, 0x0a, 0xf4, 0x94, 0x49, 0x59, 0xcc, 0x00, 0x6f, 0xee, 0x3f, 0x51, 0xb9, 0x96, 0xf6, 0x60, 0x31, 0x83, 0x6a, 0x91, 0x34, 0xf1, 0xf7, 0xa0, 0x24, 0x0a, 0x33, 0x9e, 0x5e, 0x07, 0x7d, 0x36, 0x6c, 0x99 ],
+const [ 0x1c, 0xe3, 0xf5, 0xbc, 0xe2, 0xb1, 0x76, 0xbf, 0x89, 0xeb, 0x70, 0x15, 0x00, 0x5e, 0xd1, 0xff, 0x51, 0x77, 0xa4, 0x74, 0x6c, 0xf8, 0xed, 0x72, 0x26, 0xef, 0xd4, 0x93, 0x81, 0xe9, 0x06, 0xe0, 0x2e, 0x63, 0x59, 0xe9, 0x50, 0x81, 0xaf, 0x16, 0x83, 0x03, 0x1c, 0x38, 0x1d, 0x74, 0x4b, 0x63, 0xb4, 0xa4, 0x1d, 0x00, 0xe0, 0x59, 0x94, 0x1e, 0x41, 0x42, 0xf0, 0x09, 0xc4, 0x2c, 0x17, 0x1e, 0x23, 0x78, 0x3a, 0xdd, 0xab, 0xcd, 0xb6, 0x40, 0x42, 0x0a ],
+const [ 0xc8, 0xfc, 0xf6, 0xfc, 0xfb, 0xf4, 0x98, 0xb3, 0x3d, 0x3e, 0xcf, 0x12, 0x58, 0x8a, 0x59, 0x6d, 0x9f, 0xec, 0xc7, 0x9e, 0xd4, 0x33, 0x84, 0xfa, 0x49, 0x76, 0x13, 0x84, 0x46, 0xef, 0x98, 0x61, 0xab, 0x0c, 0x9a, 0x8c, 0xd6, 0xc4, 0x07, 0xcb, 0xc7, 0x28, 0x78, 0xe2, 0x82, 0x3a, 0xb7, 0x06, 0xb5, 0x01, 0x7f, 0x94, 0x9b, 0xdd, 0x82, 0x03, 0x20, 0x19, 0xb0, 0x18, 0x46, 0xbf, 0xb7, 0x58, 0xc7, 0xb0, 0xc6, 0xc3, 0xfc, 0xf3, 0x97, 0xbf, 0xfd, 0x4e ],
+const [ 0x89, 0x85, 0xc5, 0xdb, 0xc6, 0x72, 0x5a, 0x4e, 0x1c, 0xa2, 0x6f, 0x56, 0x67, 0xd6, 0xda, 0x49, 0x38, 0xa8, 0xd5, 0x42, 0xca, 0xb6, 0x9a, 0x69, 0x38, 0x02, 0x30, 0x75, 0xee, 0x99, 0x84, 0x6f, 0x5d, 0x73, 0xbb, 0xb8, 0xf4, 0x9b, 0xc7, 0x4d, 0x4b, 0x8f, 0x38, 0x4a, 0xa1, 0xea, 0x55, 0xad, 0x88, 0x40, 0x6c, 0x5d, 0xdf, 0x4a, 0x66, 0x6b, 0x01, 0x43, 0x9e, 0x97, 0x3c, 0x91, 0xf4, 0x16, 0x85, 0xa8, 0x1d, 0x92, 0x69, 0x2c, 0x3d, 0x73, 0x47, 0x55 ],
+const [ 0xe2, 0x43, 0xc4, 0x80, 0xff, 0x1d, 0xe3, 0x5f, 0xf7, 0xbb, 0xb7, 0x19, 0x63, 0xe1, 0x45, 0xb2, 0x0d, 0xc4, 0x3b, 0x31, 0xaf, 0xc1, 0xd4, 0xf4, 0xfe, 0x4f, 0xfc, 0x46, 0xe7, 0x33, 0xb5, 0x34, 0x19, 0xf3, 0xb9, 0x9c, 0xc3, 0x8c, 0x60, 0x86, 0x9f, 0x67, 0xc5, 0xb7, 0x2f, 0x8a, 0x24, 0x84, 0x47, 0x0c, 0x87, 0xe5, 0xcb, 0xcb, 0xa2, 0xca, 0xba, 0x61, 0xfb, 0xb2, 0x6b, 0x53, 0x4e, 0x79, 0x17, 0x8c, 0x2f, 0x71, 0x98, 0x0a, 0xf1, 0xb5, 0x70, 0xd8 ],
+const [ 0x22, 0x93, 0x33, 0x6d, 0x9f, 0xd4, 0x85, 0x70, 0xe6, 0x51, 0x5a, 0x4d, 0x7c, 0x49, 0x85, 0xda, 0xf0, 0xe1, 0x23, 0x0d, 0x6b, 0x6b, 0xd0, 0x65, 0x89, 0xe7, 0x1b, 0x85, 0x67, 0xca, 0x37, 0x23, 0xfe, 0xff, 0xf3, 0x20, 0xaf, 0x2c, 0xeb, 0xf8, 0x1e, 0x36, 0x00, 0x5d, 0x44, 0x07, 0x07, 0x1f, 0xc0, 0x8f, 0xbe, 0x4f, 0x6e, 0x08, 0x04, 0xa4, 0x3b, 0x7f, 0x49, 0x1d, 0x38, 0x90, 0x43, 0xe8, 0xed, 0x71, 0xe2, 0x83, 0xef, 0x32, 0x87, 0x21, 0xb5, 0x42 ],
+const [ 0xd3, 0x0c, 0x4a, 0x44, 0xe6, 0x42, 0x9b, 0xb5, 0xa3, 0x19, 0x25, 0x27, 0x63, 0xda, 0x22, 0xb8, 0x59, 0x3b, 0x78, 0x84, 0xc4, 0xca, 0x91, 0x24, 0x69, 0x8f, 0x67, 0x74, 0x41, 0xed, 0xde, 0x99, 0x6f, 0xca, 0x57, 0x43, 0x74, 0xf0, 0x82, 0x30, 0xa6, 0xb2, 0x73, 0xf2, 0xdf, 0xd2, 0xf9, 0xf1, 0x72, 0xa2, 0x2b, 0xb3, 0x63, 0x6a, 0x43, 0x5b, 0xd7, 0x0a, 0xb0, 0x70, 0xc9, 0xe0, 0x66, 0xe0, 0xff, 0xec, 0x79, 0x45, 0x3c, 0x32, 0xea, 0x66, 0xb8, 0x60 ],
+const [ 0xcf, 0xf5, 0x86, 0xfb, 0x91, 0xa1, 0xe9, 0xd4, 0x3c, 0x36, 0xa7, 0x6a, 0x4d, 0xce, 0xb9, 0xe1, 0x23, 0xdf, 0x15, 0x67, 0x03, 0x24, 0xd1, 0xc7, 0x5f, 0xdb, 0x8c, 0x3b, 0x58, 0x31, 0x0a, 0x82, 0x81, 0xfb, 0x1e, 0x33, 0xe6, 0xa6, 0xcd, 0x51, 0x4d, 0x71, 0xb0, 0x1f, 0xbb, 0xd9, 0x9a, 0x36, 0x3a, 0x55, 0x7b, 0xd4, 0xda, 0x44, 0x84, 0x77, 0xf6, 0x24, 0x8c, 0xab, 0xb8, 0x04, 0xb3, 0x20, 0xdf, 0x3c, 0x45, 0xff, 0xc0, 0x5b, 0xe1, 0x7e, 0x8b, 0x61 ],
+const [ 0xec, 0xe4, 0x04, 0x41, 0xa1, 0x68, 0xc8, 0x3e, 0x0e, 0x35, 0x6e, 0x68, 0x77, 0x88, 0x08, 0x1f, 0x07, 0xf4, 0xb2, 0x99, 0x72, 0x6c, 0x5f, 0x8f, 0xd8, 0x9f, 0xd8, 0x36, 0xed, 0x84, 0x01, 0x71, 0x57, 0x35, 0x5e, 0x45, 0x57, 0x00, 0xd7, 0x8d, 0xac, 0xbb, 0xb8, 0xef, 0xb4, 0x59, 0xfc, 0x0e, 0xd5, 0xbb, 0xcb, 0x01, 0x1b, 0xc8, 0x41, 0x05, 0x22, 0xc0, 0x71, 0x6e, 0x37, 0xcd, 0xaa, 0xe4, 0xba, 0xdc, 0xf9, 0xcb, 0xc6, 0xaa, 0xee, 0x03, 0x15, 0x22 ],
+const [ 0xa3, 0xa9, 0xc5, 0x59, 0x95, 0xea, 0x04, 0xd6, 0xac, 0x3a, 0x93, 0xee, 0x57, 0x9f, 0x6e, 0x7c, 0x96, 0x6a, 0xb5, 0xed, 0xaf, 0x18, 0x01, 0x47, 0x23, 0x77, 0xf8, 0x6a, 0xe0, 0x0a, 0x1f, 0x97, 0xb8, 0xad, 0xf0, 0x2e, 0x12, 0x7c, 0x2d, 0xbc, 0xdf, 0xf2, 0x73, 0x34, 0xd0, 0x4e, 0x12, 0x7d, 0xc6, 0x3b, 0x1c, 0x2d, 0x8b, 0xaf, 0xbc, 0x95, 0xbf, 0x14, 0xc9, 0xfd, 0x15, 0xa6, 0x9b, 0x30, 0xbf, 0x1c, 0x1e, 0x3c, 0x26, 0x8a, 0x24, 0x73, 0xdf, 0x86 ],
+const [ 0xcc, 0xf7, 0xc4, 0xe2, 0xa8, 0xe7, 0xa2, 0x7c, 0x7b, 0xc5, 0x44, 0x22, 0x21, 0x4c, 0x88, 0x0e, 0x7c, 0x25, 0x82, 0xd0, 0x68, 0x0b, 0x13, 0x95, 0xf0, 0x2d, 0xbd, 0xa8, 0xc2, 0xd3, 0xb5, 0x39, 0xe0, 0x45, 0x3a, 0x5e, 0x99, 0xe9, 0x26, 0x57, 0xb8, 0xab, 0xc3, 0x16, 0xfb, 0xa1, 0xdf, 0xff, 0xc6, 0xef, 0x23, 0xec, 0x19, 0xe9, 0xa0, 0x74, 0xc0, 0x78, 0xab, 0x6d, 0xc9, 0xbf, 0xeb, 0xaf, 0x3b, 0xfe, 0xb0, 0x1b, 0x05, 0xb6, 0x86, 0xdc, 0x35, 0x0e ],
+const [ 0x8a, 0x81, 0xd2, 0xad, 0x65, 0x58, 0x5e, 0x1e, 0x13, 0x83, 0x78, 0x3f, 0xaa, 0x17, 0xf4, 0x60, 0xc3, 0x95, 0x60, 0xab, 0x73, 0x0f, 0x95, 0x65, 0x7d, 0x8c, 0x8c, 0x71, 0xc5, 0xae, 0x73, 0x16, 0x08, 0x92, 0x00, 0x02, 0xcb, 0xf8, 0x06, 0x8e, 0x91, 0xa4, 0x46, 0x43, 0x51, 0x04, 0x87, 0x9d, 0x27, 0x12, 0xe9, 0x10, 0x4a, 0x7c, 0x76, 0x49, 0x3e, 0x02, 0xfa, 0xb6, 0x4b, 0x20, 0x14, 0x48, 0x2d, 0xee, 0x8e, 0x78, 0x0d, 0x44, 0xea, 0x88, 0xb0, 0x21 ],
+const [ 0x82, 0x81, 0xad, 0xdf, 0x98, 0x35, 0xf1, 0x30, 0x8b, 0xe6, 0x80, 0xdf, 0xae, 0x2d, 0xde, 0x6c, 0x52, 0xa5, 0x8b, 0x69, 0x8c, 0x9e, 0xe3, 0xd3, 0x39, 0x16, 0x43, 0xa2, 0x40, 0xe5, 0x6d, 0x9f, 0x17, 0x37, 0x2e, 0x76, 0x89, 0x3f, 0x3e, 0x0c, 0xb6, 0x2a, 0x67, 0x12, 0x5b, 0x52, 0xe9, 0xdb, 0x53, 0xb5, 0x1e, 0x6a, 0x5e, 0xa5, 0x5a, 0xd0, 0x22, 0xc1, 0x15, 0xb5, 0x6f, 0x23, 0x4c, 0x34, 0xc7, 0xdb, 0x24, 0xec, 0x1e, 0x9c, 0xd1, 0x53, 0xde, 0xb6 ],
+const [ 0x18, 0x3b, 0x4c, 0xda, 0x5c, 0x02, 0x82, 0xda, 0xb6, 0x2a, 0xa4, 0xe4, 0x8a, 0x19, 0xd3, 0xa5, 0xa0, 0x0a, 0xab, 0x55, 0x24, 0x04, 0x6e, 0x45, 0xf1, 0x08, 0x5e, 0xb7, 0x0f, 0x8f, 0x6a, 0xf3, 0x79, 0x34, 0x0d, 0x97, 0x24, 0xad, 0x74, 0x2f, 0x3e, 0xff, 0xdf, 0x05, 0xb3, 0xf2, 0x49, 0x3b, 0xf6, 0xc3, 0x4b, 0x16, 0xfe, 0x1a, 0x3e, 0x9d, 0x8f, 0x3b, 0xa0, 0x63, 0xba, 0x80, 0xb8, 0xa1, 0xa7, 0x07, 0x7d, 0x87, 0x92, 0xa8, 0xb5, 0xd4, 0x14, 0x2a ],
+const [ 0xfe, 0xe6, 0x03, 0x25, 0x85, 0x82, 0xe3, 0xa3, 0xe8, 0xfe, 0xb8, 0x86, 0x59, 0x9d, 0x4a, 0xc4, 0x05, 0xa1, 0x63, 0x4c, 0x32, 0x0e, 0x85, 0xea, 0x8a, 0xb0, 0xdc, 0x6b, 0xb6, 0x5f, 0x72, 0x01, 0x2f, 0x82, 0xa2, 0xe9, 0x51, 0xd2, 0xcf, 0x4a, 0xb2, 0x61, 0x56, 0x61, 0xb1, 0xda, 0xc0, 0xdb, 0x52, 0x0a, 0x3d, 0x82, 0x49, 0x9f, 0x4e, 0x1c, 0x54, 0x30, 0xc1, 0x90, 0xce, 0x7e, 0xe2, 0x4b, 0x82, 0xfa, 0xf0, 0xe2, 0xbd, 0x87, 0xce, 0xf9, 0xa7, 0x80 ],
+const [ 0x83, 0x2f, 0x87, 0xd5, 0x96, 0x44, 0x9a, 0xec, 0xa6, 0x56, 0xe0, 0xe0, 0xb4, 0xae, 0x92, 0xdc, 0xd1, 0x6a, 0x66, 0x88, 0x90, 0x20, 0xa9, 0xd2, 0xbb, 0xc4, 0x8e, 0xee, 0x45, 0xcc, 0xc6, 0x9b, 0x80, 0x91, 0x50, 0xa9, 0x90, 0xf9, 0x93, 0xb8, 0x20, 0x53, 0xaa, 0x42, 0x53, 0x82, 0xff, 0xdc, 0xfd, 0x5e, 0x1b, 0xb8, 0x14, 0x57, 0xbc, 0x6f, 0x61, 0x5c, 0x28, 0xfd, 0x7b, 0xfb, 0xc2, 0x0d, 0xf6, 0xc9, 0xdb, 0x78, 0xd8, 0x04, 0xca, 0x08, 0x4c, 0x77 ],
+const [ 0x92, 0xa0, 0xe0, 0x13, 0x15, 0xef, 0xb0, 0xb3, 0x47, 0x66, 0x65, 0x81, 0x56, 0x0b, 0x44, 0xbc, 0x58, 0x2a, 0xb6, 0x3e, 0x8f, 0x8e, 0xa6, 0x51, 0xec, 0xf7, 0x2b, 0xc3, 0xd3, 0xc9, 0x67, 0x3d, 0x1e, 0x02, 0xaf, 0xd0, 0x64, 0x6e, 0xeb, 0xd1, 0x7b, 0x1e, 0x40, 0xe7, 0x3b, 0x16, 0xed, 0x62, 0x85, 0x46, 0x73, 0xce, 0x84, 0xbc, 0xf9, 0xc8, 0x33, 0x17, 0xee, 0x11, 0x20, 0x3f, 0xf0, 0xe1, 0x6f, 0x53, 0xed, 0x7e, 0x21, 0xe3, 0x88, 0x0c, 0x97, 0x60 ],
+const [ 0xce, 0x4c, 0x92, 0x6c, 0x09, 0x22, 0xba, 0x36, 0x26, 0x9a, 0x20, 0xd6, 0x0d, 0xcf, 0x08, 0xd4, 0x3a, 0x1c, 0xea, 0x12, 0x0f, 0x26, 0x6a, 0xf7, 0x6f, 0x1c, 0x8a, 0xcd, 0x88, 0x3d, 0x1f, 0x68, 0xf0, 0x9b, 0x82, 0x09, 0xf4, 0x1f, 0x87, 0x82, 0x2d, 0xce, 0xb3, 0x9a, 0x54, 0x4a, 0xa9, 0xb2, 0x56, 0x9c, 0xe6, 0xa9, 0xab, 0x30, 0xae, 0xfe, 0xe4, 0x21, 0x46, 0x34, 0x84, 0xb8, 0x64, 0x7b, 0x11, 0x2f, 0xe4, 0x8c, 0x6b, 0xba, 0xbc, 0xd5, 0x5c, 0xc8 ],
+const [ 0x06, 0x49, 0xb5, 0x82, 0xdb, 0xc5, 0x98, 0x16, 0xa8, 0x04, 0x2c, 0xac, 0x30, 0xce, 0xe6, 0x77, 0x2a, 0x0e, 0xd8, 0xcb, 0xe8, 0xe0, 0x7b, 0xd5, 0x38, 0xec, 0xab, 0x8a, 0x88, 0xf3, 0xf3, 0xdd, 0x4d, 0xa7, 0x0b, 0x35, 0xa5, 0xc0, 0x9f, 0x1e, 0x3a, 0x4c, 0x52, 0x3e, 0x6a, 0x46, 0x03, 0x8c, 0xa6, 0x6b, 0x4f, 0xbc, 0x18, 0x49, 0x57, 0xfd, 0x89, 0x99, 0xc3, 0xe7, 0x81, 0xce, 0x07, 0xaf, 0xb0, 0xee, 0xe4, 0x9e, 0x8c, 0xa1, 0x32, 0xc1, 0x3c, 0x88 ],
+const [ 0x3d, 0x70, 0x94, 0xe0, 0x05, 0xea, 0xf0, 0xb1, 0x23, 0x1c, 0xf6, 0x05, 0x36, 0xf7, 0x68, 0xe6, 0x2f, 0x79, 0xda, 0xe8, 0x63, 0x74, 0x66, 0x0b, 0xde, 0x91, 0xa2, 0xe2, 0xfa, 0x94, 0xcf, 0xf5, 0x31, 0xe2, 0x53, 0x65, 0x30, 0x40, 0x6a, 0xce, 0x2c, 0xdd, 0x18, 0x71, 0x79, 0x93, 0x62, 0x93, 0x59, 0x6a, 0xbd, 0x20, 0x12, 0x5e, 0xc7, 0x94, 0x43, 0x62, 0x35, 0x1b, 0x77, 0xa4, 0x0c, 0xf7, 0xfb, 0x13, 0x15, 0x23, 0xed, 0x1f, 0x8a, 0x36, 0x96, 0xbf ],
+const [ 0x74, 0xd7, 0x2b, 0xe7, 0xfc, 0x8f, 0x4f, 0xd5, 0x66, 0xf8, 0x63, 0xef, 0x53, 0xbd, 0xb3, 0x61, 0x13, 0x7c, 0xb6, 0xd9, 0x6b, 0x79, 0xef, 0xdd, 0x95, 0x94, 0x11, 0x61, 0x89, 0x78, 0x66, 0x99, 0x7b, 0x16, 0x71, 0x0c, 0xa5, 0x52, 0xd3, 0xea, 0x46, 0xfb, 0x6b, 0x9f, 0xeb, 0x01, 0xc1, 0xa8, 0xed, 0xe2, 0xa5, 0xa5, 0x3b, 0x66, 0x13, 0xb0, 0x59, 0x8c, 0x5a, 0xee, 0xa9, 0xc4, 0x7d, 0x63, 0xea, 0x5e, 0xda, 0x0b, 0xfe, 0x43, 0x09, 0x26, 0xf0, 0xe3 ],
+const [ 0x94, 0x86, 0x9f, 0xf7, 0xb6, 0x16, 0x4a, 0x24, 0xe8, 0x9a, 0xb7, 0x34, 0xf2, 0x03, 0x22, 0x42, 0x1b, 0xd3, 0x15, 0x81, 0x54, 0x81, 0x39, 0xc6, 0xb4, 0x1f, 0x6d, 0x46, 0x24, 0x3a, 0x15, 0xa0, 0x5c, 0x02, 0xb4, 0x1e, 0x0e, 0xaa, 0xbe, 0x37, 0x60, 0x12, 0xa7, 0x59, 0xa0, 0xa4, 0x40, 0xe6, 0x33, 0x7c, 0x43, 0x7d, 0xcf, 0xcb, 0x2c, 0x7a, 0xeb, 0x7d, 0x4b, 0xc0, 0x73, 0x19, 0x18, 0xb6, 0xbf, 0xe9, 0xc6, 0x8f, 0xc6, 0x5c, 0x1b, 0xcf, 0x8f, 0xa8 ],
+const [ 0xfb, 0xca, 0x58, 0x6e, 0xdf, 0xa5, 0x76, 0x45, 0x03, 0x7b, 0x6b, 0x3c, 0xd7, 0x0f, 0xc3, 0x41, 0xe4, 0xd4, 0xec, 0x97, 0xaf, 0x4b, 0x3d, 0xcb, 0xe1, 0x8b, 0x36, 0xe9, 0xa6, 0x21, 0x0a, 0xef, 0x53, 0x1b, 0x5a, 0x82, 0x4b, 0x60, 0x44, 0xe0, 0x23, 0x43, 0x9c, 0x16, 0x04, 0x57, 0x79, 0x73, 0x51, 0x84, 0xf4, 0x3c, 0x8a, 0x5a, 0x2c, 0xa1, 0x71, 0xa6, 0x8e, 0xf0, 0x6b, 0x43, 0x53, 0x09, 0x28, 0x33, 0x49, 0x12, 0x86, 0xee, 0xd7, 0x6c, 0xb3, 0xfa ],
+const [ 0x62, 0x42, 0x48, 0x76, 0x9d, 0xc2, 0x74, 0x2a, 0x13, 0xe6, 0xb6, 0x9b, 0x5e, 0x72, 0x12, 0xca, 0x45, 0x9b, 0x36, 0xbf, 0x86, 0xbe, 0x5d, 0xd8, 0xd3, 0x52, 0x73, 0x60, 0x1a, 0x1c, 0x7a, 0x63, 0x09, 0xa1, 0x2c, 0xc1, 0xd2, 0xe1, 0xe2, 0x82, 0x2b, 0x42, 0xb4, 0x69, 0x99, 0xcb, 0xe2, 0xcc, 0xef, 0x92, 0x73, 0xa3, 0x11, 0x78, 0x1b, 0xde, 0xfe, 0x13, 0x62, 0xfc, 0x0e, 0xec, 0x03, 0xd9, 0x78, 0xeb, 0x92, 0xc7, 0x16, 0x0f, 0x62, 0xe1, 0x6d, 0x62 ],
+const [ 0x25, 0xcd, 0xcc, 0x9c, 0xb0, 0x14, 0x78, 0x4d, 0xbb, 0xdb, 0xb1, 0x3f, 0x56, 0xff, 0xaa, 0x63, 0xfa, 0x23, 0x4c, 0x91, 0x6f, 0x02, 0x36, 0x7d, 0xec, 0x03, 0x03, 0xe8, 0x81, 0x0f, 0xcb, 0x13, 0xb2, 0x9f, 0xec, 0x79, 0x65, 0x19, 0x0a, 0xbd, 0xfe, 0x5c, 0x54, 0xe2, 0xc8, 0x99, 0x09, 0xba, 0x97, 0x66, 0x3b, 0xa1, 0xab, 0x0d, 0xd4, 0x6b, 0xd8, 0x2a, 0xd6, 0x9a, 0xe4, 0x75, 0xe7, 0xd4, 0x31, 0xdc, 0x0c, 0x95, 0x9b, 0xd5, 0xb5, 0x22, 0xa4, 0xf2 ],
+const [ 0x3a, 0xc1, 0x05, 0xa2, 0xbd, 0x07, 0x05, 0x6d, 0x3e, 0x1c, 0x3b, 0xa5, 0x47, 0x35, 0x9d, 0xba, 0x94, 0xe8, 0xf7, 0x9a, 0x6c, 0x32, 0xdd, 0xd5, 0x32, 0xbe, 0xe4, 0xff, 0x37, 0x64, 0x12, 0x57, 0xd2, 0xf1, 0x92, 0xa5, 0xb3, 0x26, 0xac, 0x69, 0x74, 0x03, 0xf5, 0x31, 0x71, 0x45, 0xc3, 0x4b, 0xda, 0x2d, 0xe4, 0x9c, 0x06, 0x83, 0x90, 0xd0, 0x0a, 0xdb, 0x9b, 0xb4, 0x8b, 0x17, 0xef, 0xdf, 0xd0, 0x2d, 0x3a, 0x98, 0x1b, 0x2a, 0xe4, 0xf4, 0x3a, 0x77 ],
+const [ 0xb8, 0xd9, 0xd6, 0x74, 0xcb, 0x62, 0x3d, 0x7a, 0x44, 0x94, 0x11, 0xfe, 0xf5, 0x09, 0x55, 0x89, 0x92, 0xb7, 0xf6, 0xe3, 0x14, 0xc6, 0x4f, 0x85, 0x5c, 0x9f, 0xf2, 0x51, 0x19, 0x46, 0xa6, 0x81, 0xeb, 0xe9, 0xac, 0xde, 0xc9, 0xb9, 0x47, 0x32, 0xa0, 0xf8, 0x7b, 0xff, 0x3c, 0x53, 0x14, 0x71, 0x6c, 0x73, 0xea, 0x92, 0x61, 0xcf, 0x64, 0xbd, 0x58, 0xc4, 0x3b, 0x55, 0x79, 0xe7, 0x80, 0xb6, 0xfe, 0x9a, 0xe1, 0x6c, 0x97, 0xdd, 0x28, 0xa4, 0x0d, 0x67 ],
+const [ 0xc3, 0x9c, 0xe5, 0x40, 0x7c, 0x0c, 0x03, 0xdd, 0xfe, 0xbe, 0x82, 0xdc, 0xca, 0x40, 0x8c, 0x52, 0xf2, 0x6b, 0x64, 0x02, 0x7e, 0x38, 0xed, 0xd0, 0x0d, 0xd5, 0x70, 0x79, 0xc0, 0xf8, 0x9a, 0x82, 0x53, 0x74, 0xc4, 0x6e, 0x8d, 0x0a, 0x78, 0x34, 0xdb, 0x81, 0x30, 0xf0, 0x38, 0xf8, 0x60, 0xd9, 0x4f, 0x7c, 0xb7, 0x73, 0xe4, 0xd6, 0xa2, 0x06, 0x70, 0xa6, 0x13, 0x4e, 0x0b, 0xb6, 0x80, 0x74, 0x8f, 0x88, 0x2e, 0x3d, 0xfb, 0x31, 0xaf, 0x82, 0x15, 0x6a ],
+const [ 0x31, 0x86, 0x08, 0xb2, 0x13, 0x04, 0x6a, 0x3b, 0xad, 0xd1, 0x65, 0x5c, 0x51, 0x13, 0x5c, 0x7e, 0x14, 0x92, 0xc6, 0xce, 0xbc, 0x0f, 0x2f, 0x36, 0xe0, 0xd7, 0x7f, 0x8b, 0x4a, 0x98, 0x7f, 0x08, 0xa0, 0x72, 0x99, 0xfb, 0x44, 0x51, 0xe0, 0xbe, 0x78, 0x7b, 0x50, 0xe9, 0xc6, 0x65, 0x56, 0xc6, 0x9f, 0xcb, 0x93, 0x05, 0x42, 0xff, 0xdd, 0xb1, 0xdf, 0x82, 0x86, 0x63, 0xfc, 0xd1, 0xe1, 0xb6, 0x19, 0x81, 0x03, 0xfa, 0x8f, 0x8e, 0xc7, 0x2d, 0xbe, 0xf1 ],
+const [ 0x81, 0x57, 0x43, 0x23, 0xc9, 0x73, 0x54, 0x07, 0x19, 0xd1, 0x92, 0x83, 0x3d, 0xdb, 0x51, 0xf1, 0x3a, 0x52, 0xdc, 0xba, 0xe2, 0x94, 0xae, 0xbe, 0xa5, 0x1b, 0xe5, 0xf6, 0xaa, 0x47, 0xf3, 0x57, 0x1f, 0x5d, 0x97, 0xfa, 0xcd, 0xcf, 0x0c, 0x7b, 0xef, 0xbe, 0x80, 0x9f, 0x44, 0xbd, 0xc7, 0x39, 0x63, 0xd8, 0x51, 0x4e, 0x4f, 0xd5, 0x59, 0x77, 0x4b, 0xb9, 0x60, 0x87, 0xef, 0x8e, 0xda, 0x6e, 0x7c, 0x64, 0x27, 0x5d, 0x6d, 0x96, 0xc4, 0x2b, 0x4e, 0x4e ],
+const [ 0x44, 0xf7, 0x1c, 0x23, 0x17, 0xcd, 0xe5, 0x21, 0x51, 0xc8, 0x42, 0x60, 0xd1, 0xd3, 0xc0, 0x4a, 0x28, 0xcc, 0x15, 0xce, 0x5b, 0x38, 0x02, 0xb2, 0xe5, 0x35, 0x7e, 0x2b, 0xfc, 0xaf, 0x10, 0xab, 0x15, 0xd7, 0x7d, 0xfa, 0xaa, 0xd1, 0xa3, 0x88, 0x3b, 0xad, 0xa5, 0x02, 0x93, 0x99, 0x48, 0x23, 0x4c, 0x55, 0x9d, 0xcd, 0x95, 0xe7, 0xe1, 0x58, 0x33, 0x8f, 0xa1, 0x2a, 0xc6, 0xfd, 0x21, 0x87, 0x4e, 0xc2, 0xff, 0xab, 0xed, 0x05, 0x14, 0x16, 0xef, 0x77 ],
+const [ 0x7e, 0xde, 0xeb, 0x6b, 0x63, 0xc3, 0xb9, 0xc8, 0x36, 0xc4, 0x84, 0x3b, 0xa4, 0x6b, 0xfe, 0xbd, 0x8c, 0xa9, 0xa6, 0xe2, 0x05, 0xc7, 0xed, 0x68, 0xa2, 0x9f, 0x97, 0x10, 0xf5, 0x0c, 0x65, 0xac, 0x51, 0x9f, 0xf1, 0x7a, 0xd4, 0x94, 0xd9, 0xb0, 0xa5, 0x04, 0x1f, 0x58, 0x7b, 0x5c, 0xd0, 0x5e, 0x5f, 0x0d, 0xe4, 0xe8, 0xb2, 0x85, 0x66, 0xe5, 0x71, 0x5f, 0xd5, 0xe9, 0xb8, 0xd6, 0xc9, 0x38, 0x85, 0x80, 0xd9, 0x21, 0xbf, 0x39, 0xbd, 0x8d, 0x77, 0x5c ],
+const [ 0x6e, 0x1b, 0x66, 0x3e, 0x80, 0x8a, 0x69, 0x86, 0xf2, 0x99, 0x56, 0xb7, 0xb9, 0x70, 0x80, 0x66, 0x69, 0x6f, 0x9d, 0xfe, 0x0d, 0x7b, 0xcd, 0xb5, 0x56, 0x96, 0xd8, 0xbe, 0xf9, 0xb3, 0xb7, 0xc0, 0x52, 0xc8, 0x57, 0x88, 0x4d, 0x24, 0x99, 0xfb, 0x86, 0x03, 0x9d, 0x4e, 0xaf, 0x60, 0x40, 0x79, 0x33, 0x0a, 0xe3, 0xe8, 0x18, 0xfa, 0x6f, 0x74, 0x2a, 0xe4, 0x95, 0x93, 0x56, 0x0c, 0x5b, 0xcb, 0x54, 0x5b, 0xd4, 0x6d, 0x89, 0xb2, 0x2e, 0x7f, 0x2b, 0x7e ],
+const [ 0x20, 0x8f, 0x91, 0xcc, 0xc8, 0x79, 0x65, 0xd3, 0x65, 0xcc, 0x32, 0x5d, 0x32, 0x62, 0xb6, 0x42, 0x77, 0xf6, 0x11, 0x2b, 0x0b, 0x93, 0x71, 0xa4, 0x17, 0x4c, 0xee, 0x72, 0x1c, 0x2e, 0xb3, 0x26, 0x38, 0x73, 0x5f, 0xf2, 0xa5, 0xf8, 0xab, 0xbc, 0x82, 0xf2, 0x4c, 0x71, 0xd6, 0xdc, 0x1b, 0x9c, 0xd2, 0xb4, 0x73, 0x37, 0x56, 0x66, 0xda, 0xc0, 0xb7, 0x89, 0xe4, 0x90, 0xc0, 0x49, 0x55, 0x69, 0xf6, 0xa4, 0x86, 0x4e, 0x20, 0xda, 0x0a, 0x97, 0x07, 0x1e ],
+const [ 0x91, 0x57, 0x94, 0xa6, 0xc6, 0x54, 0x0f, 0x1c, 0xe9, 0x95, 0x8c, 0x27, 0x84, 0xce, 0xfc, 0xc1, 0x37, 0x72, 0x19, 0x8c, 0xab, 0xd4, 0xfa, 0x17, 0xc8, 0x8d, 0xe4, 0x5c, 0x28, 0x1d, 0x64, 0x8d, 0xcb, 0xd5, 0x9a, 0x10, 0x0c, 0xf4, 0xd8, 0xc8, 0xd3, 0x10, 0x6c, 0x96, 0x0d, 0xb7, 0xb9, 0x1f, 0x59, 0x57, 0x8d, 0xd0, 0x04, 0x5b, 0xae, 0x20, 0x38, 0x97, 0xb6, 0x15, 0x70, 0xe6, 0x21, 0x0a, 0x2f, 0x11, 0xa5, 0xaf, 0xf2, 0xf3, 0xc2, 0x51, 0x63, 0xdb ],
+const [ 0xb1, 0xa9, 0x5a, 0xa8, 0x0b, 0xac, 0x5a, 0xcb, 0x7a, 0x18, 0x33, 0x2f, 0xc0, 0x30, 0x67, 0x60, 0x06, 0x10, 0xf3, 0x76, 0xd9, 0x9e, 0x77, 0xa2, 0x72, 0xbe, 0x96, 0x06, 0x3a, 0xc5, 0xa0, 0xca, 0x8d, 0x31, 0x6e, 0x6c, 0xbe, 0x97, 0x8e, 0x57, 0x5c, 0xdc, 0xa1, 0xb8, 0xb4, 0xa8, 0x00, 0x8d, 0x97, 0x18, 0xa6, 0xfe, 0x5e, 0xb3, 0x4a, 0xf1, 0x2a, 0xa0, 0xcb, 0xd9, 0x71, 0x16, 0xd1, 0xce, 0xb6, 0x13, 0xb2, 0xe3, 0x97, 0x51, 0x92, 0xb4, 0x0d, 0x76 ],
+const [ 0x9e, 0x4b, 0xa7, 0xd7, 0x2b, 0x76, 0xed, 0xee, 0x6a, 0x6f, 0x29, 0x0e, 0xd3, 0x18, 0xbe, 0xdb, 0x0a, 0xd8, 0x8c, 0x84, 0x11, 0xf9, 0xc4, 0x49, 0xbd, 0x4f, 0xfb, 0x3a, 0x66, 0x1b, 0x7e, 0x41, 0xe3, 0x2e, 0xe6, 0x62, 0xb5, 0x52, 0xec, 0x42, 0x83, 0xe5, 0x7e, 0xe6, 0xc7, 0xc7, 0x12, 0xbe, 0xc6, 0x77, 0x3a, 0xe2, 0xc5, 0x78, 0x78, 0x9b, 0x7a, 0xfa, 0x54, 0x25, 0xc1, 0xb6, 0xad, 0xb3, 0x90, 0x1a, 0x4d, 0xb4, 0x2d, 0xa6, 0xc0, 0x55, 0x9e, 0x96 ],
+const [ 0x8f, 0xa1, 0x2b, 0xc0, 0x17, 0xbf, 0xeb, 0x6c, 0x89, 0x40, 0x20, 0xe4, 0x20, 0xc5, 0xf7, 0x6f, 0x90, 0x80, 0xe8, 0x73, 0x3b, 0x99, 0x8e, 0xf3, 0xa7, 0xd0, 0xb6, 0x56, 0x30, 0x63, 0xb6, 0x6a, 0xfa, 0x32, 0x00, 0xa8, 0x2a, 0x21, 0xf6, 0xba, 0x56, 0xbe, 0x00, 0x3a, 0x39, 0x24, 0xdc, 0xbd, 0xac, 0x1f, 0x36, 0x10, 0xd2, 0x90, 0x79, 0xc1, 0x92, 0x13, 0xe4, 0xe1, 0x4a, 0xe0, 0xe0, 0x09, 0xc1, 0xef, 0x91, 0x9b, 0x5e, 0x60, 0xab, 0x4a, 0x98, 0x19 ],
+const [ 0xc1, 0x8b, 0xc2, 0x8d, 0x49, 0x6b, 0xee, 0xdb, 0x25, 0xca, 0x42, 0xd1, 0xb2, 0x17, 0xbc, 0x81, 0x89, 0x1d, 0x4c, 0x2b, 0xbb, 0x35, 0x38, 0x0e, 0x5b, 0xb9, 0xbf, 0x7e, 0x3d, 0xbb, 0xfd, 0x37, 0xfe, 0xf7, 0x0e, 0xf1, 0x44, 0x07, 0x76, 0x34, 0x47, 0xd6, 0xc0, 0x6e, 0x91, 0x57, 0x66, 0x43, 0x02, 0x77, 0xf1, 0x24, 0x16, 0x50, 0x61, 0x23, 0x6b, 0x9f, 0xcf, 0x05, 0x7d, 0x78, 0x51, 0x99, 0xb4, 0x38, 0x1e, 0x49, 0xa2, 0xbc, 0xf3, 0xef, 0x85, 0xd0 ],
+const [ 0xdf, 0xd4, 0xfa, 0xa6, 0xb9, 0xeb, 0xff, 0xf6, 0xeb, 0x33, 0xd4, 0xb5, 0x36, 0xf3, 0xf1, 0x87, 0x85, 0xfc, 0x33, 0xe8, 0x2d, 0xdf, 0x39, 0x08, 0x73, 0x5d, 0x0f, 0xd9, 0x4f, 0x1f, 0x09, 0x66, 0x6f, 0xa8, 0xf2, 0x66, 0x7f, 0x87, 0x66, 0x11, 0xa8, 0xd1, 0x7d, 0x32, 0x56, 0xce, 0xaa, 0x7e, 0x3f, 0xf3, 0xe2, 0x24, 0xa1, 0x10, 0x00, 0xa5, 0xca, 0xcb, 0x68, 0xe6, 0xde, 0x4d, 0xea, 0x84, 0xd5, 0x3b, 0xea, 0x67, 0xc3, 0xe8, 0xbe, 0x9a, 0x5c, 0xc9 ],
+const [ 0xc9, 0x6c, 0x04, 0xa3, 0xbb, 0x08, 0x16, 0xfc, 0x47, 0xe0, 0x59, 0x13, 0xa7, 0x15, 0xfb, 0xac, 0x9a, 0x3a, 0xd0, 0x9d, 0xb7, 0x5b, 0x48, 0xe8, 0x01, 0x3d, 0x9f, 0x27, 0xbb, 0xe8, 0x53, 0x2d, 0x7e, 0x63, 0xdb, 0xea, 0x88, 0xbf, 0x96, 0x8f, 0x57, 0x56, 0x02, 0xf3, 0x77, 0x55, 0x2e, 0x35, 0x98, 0x78, 0x72, 0xa4, 0xe3, 0x15, 0x5d, 0xdb, 0x8e, 0x5c, 0xef, 0x30, 0xae, 0xdd, 0x08, 0x50, 0x4d, 0x4b, 0x21, 0x23, 0xbd, 0x7f, 0x3a, 0xf6, 0x2b, 0xbf ],
+const [ 0x93, 0x19, 0x83, 0x84, 0x32, 0xca, 0x09, 0x69, 0x60, 0xe2, 0x19, 0x6a, 0x06, 0x39, 0x81, 0x34, 0xea, 0x06, 0xe4, 0xe8, 0x79, 0x9b, 0xa4, 0x70, 0xc5, 0x4f, 0x05, 0x12, 0xca, 0xbb, 0x90, 0x45, 0xf5, 0x29, 0xb6, 0xc4, 0xe7, 0x49, 0xb6, 0xe2, 0x76, 0x26, 0xc1, 0x1d, 0xf4, 0x59, 0x5b, 0xf5, 0xb4, 0x7c, 0x04, 0xff, 0xcb, 0xe2, 0x18, 0x35, 0x14, 0x85, 0xf4, 0x90, 0x77, 0x40, 0x5a, 0xd9, 0x6a, 0x3f, 0x17, 0xbc, 0xb7, 0xb3, 0xe2, 0x1e, 0x80, 0xca ],
+const [ 0x29, 0x14, 0xda, 0x23, 0xe8, 0x6a, 0x60, 0x3c, 0xda, 0x1e, 0xed, 0xe1, 0x53, 0xbe, 0x24, 0x31, 0xc2, 0x94, 0x7c, 0xda, 0xee, 0xd6, 0xa1, 0xea, 0x80, 0x1d, 0x18, 0xe2, 0xc2, 0x18, 0x22, 0x0c, 0xa6, 0x82, 0xe4, 0x0f, 0x0a, 0x51, 0xc4, 0xc1, 0x3a, 0x31, 0x16, 0x3c, 0xb7, 0x30, 0xf8, 0x34, 0x37, 0xbb, 0x7a, 0x88, 0xec, 0xc9, 0x03, 0x16, 0x09, 0x56, 0xf0, 0xd4, 0x83, 0x13, 0x7d, 0x1d, 0x14, 0x5c, 0xe9, 0x48, 0x86, 0x6a, 0xd5, 0x7f, 0x2e, 0xca ],
+const [ 0x4b, 0x7a, 0xb1, 0x33, 0xef, 0xe9, 0x9e, 0x02, 0xfc, 0x89, 0xa2, 0x84, 0x09, 0xee, 0x18, 0x7d, 0x57, 0x9e, 0x77, 0x4f, 0x4c, 0xba, 0x6f, 0xc2, 0x23, 0xe1, 0x35, 0x04, 0xe3, 0x51, 0x1b, 0xef, 0x8d, 0x4f, 0x63, 0x8b, 0x9a, 0xca, 0x55, 0xd4, 0xa4, 0x3b, 0x8f, 0xbd, 0x64, 0xcf, 0x9d, 0x74, 0xdc, 0xc8, 0xc9, 0xe8, 0xd5, 0x20, 0x34, 0x89, 0x8c, 0x70, 0x26, 0x4e, 0xa9, 0x11, 0xa3, 0xfd, 0x70, 0x81, 0x3f, 0xa7, 0x3b, 0x08, 0x33, 0x71, 0x28, 0x9b ],
+];
+
+const hmac_sha256_macs = const [
+'05d1243e6465ed9620c9aec1c351a186',
+'c4061427764f979468ac422891dea9ca',
+'1a0d427e79a7bdca7b11579339d0ff77',
+'f0d7c63677033ada0b502a4e95b20e43',
+'f6302c5fd7c8495e233b5d6129f361da',
+'fbecae19c2ce766d286c8ce70133b669',
+'cec1ed7aa0f1cbd6b7f667a079a88577',
+'ae73b3740a7a8a07223635faaef0ba71',
+'4304f9864598f801c6aa1a692aabb8be',
+'edad94e7c30813be7c5ac58df418d8a8',
+'d78d7d266cf83add4355e7395b63adfd',
+'b7de3be2fae6ab41aa6386b8460223c6',
+'380eaf65a9be83322508498748504b50',
+'b452d180b9cacc10cb012f48dd19e4cd',
+'3f6417a99d7186bc36e6d0d61467360d',
+'28f1b663213043c4d4fb312bd36d85fbe62c8008ce82aabc',
+'7c2e5f1fdbda3c153536ec7136091eba0ba525b950bfc84f',
+'dd3334fabe8d0d51084c1e99a2a7fa8548c4cbbeec854fb4',
+'bddd77019ee3e2a16e65713089b23f0ef13e5f3ae6da5052',
+'7794f8fe7ace77512eb98a5459aaebe28ae1e8c62832b5d2',
+'d0119cf3ad1dd9e917ab325c0b85927819ed606084542944',
+'335ee9a4c96bfcfc38c76f7ace6c84adfd0a57a94efc23b2',
+'5adf1391c94a60602cefe1bcc610060de90a4b7b8822db1b',
+'312cd3f6c27e3ece5ed08f1020c815277f7e98bc3bcd0248',
+'a80b1a06ed13f5579a785f7965ab180908a07f152ea81e2e',
+'68934f2d0de64c4e4eede0b1d867630da790c111371458d5',
+'de9a7e21d30725d253fc4d09a3fd21530d788795d672c057',
+'61a0693f740c3b121238cc904e98c671563d506780960a00',
+'014d599f9490a22b69824f8cce92f30c0542cea92b621a10',
+'431d287099550ba9e523dd1308b0514cdc5faddb04ebc4c1',
+'769f00d3e6a6cc1fb426a14a4f76c6462e6149726e0dee0ec0cf97a16605ac8b',
+'6b142d4dfe217f1881aa0e6483b271dd5d43f70b85605953a0fef272ddde46ca',
+'20153bf8ea2953c48251ebcc4161f8b6e28499e5c76c24014cff4a9e2f62d25c',
+'7e8cba9dd9f06ebdd7f92e0f1a67c7f4df52693c212bdd84f67370b351533c6c',
+'cdeacfcebf46cc9d7e4d4175e5d8d267c23a64cde83e867e5001ecf26fbd30d2',
+'0c19ab5d4ee7b64396eff7b2ca9efa5ca7369c1a1ed14952445d2fb5ece9473a',
+'a9c9d3993fe7ec4c2033ccf3b73b3407cd999d67455b43a75d6ba97efda3be63',
+'468d8498d46afe74a0ffb541b847bac724faeabd48c41322bf534b284c4e9fe0',
+'29973999c4ec891154b83ebe5b0201cf29205d68e7be2c1d59bbc81658d6668e',
+'50db0ecb5b31524a6914264930abccae0da07f01a2bbb9408207156f8e8a340c',
+'a5772a3da86365b46638f1e97037fc0d8351d2e19ed929f85448ebf4e8379a8e',
+'5f1b8de0e3b07da6f9ce1a494be5712e54ac16080bb4f6d5373620d86d5ea5c7',
+'8e44d685fa79395b4761cab89688e37509e69ad007a2794c8c0b4152b67036ea',
+'905d55da5d290d023f6940fcb904c50e70181c95000eb1e6a33aa01077692736',
+'9045dd3fa6e8f2ef7c57b03932d244186caa1bc1d4b694c47e1f2901d9eba193',
+'0b3b220ee7a4fdcb0d17a5c8b595b981',
+'a17d0e0f021184a3937222de81be627c',
+'da4571749322008e73dd436a13c5f11d',
+'20cccc1ea0a8a89b3bc5fe3d5a9c2b24',
+'5eeec5bd9583ce715d613d4c04a702f9',
+'64d5ad7697a29529ca3ca4ff65e7d735',
+'c4fdcba979357f639cc6d89e7970943a',
+'ea411f749902bb0d2fa36e07e694da8c',
+'7a699c1ce4e323fe1b9ff6dea2038aa8',
+'e2a380effe8de7d29948c5d9d7bb39a9',
+'54e871ae687626fee5669ce20cc48041',
+'eb5b96d2f51d56464b95da4927ec5a64',
+'020d5aca34d8c7066ef5d8c9b3429669',
+'0d700ca9ffc418b29fc8e316acbc1abb',
+'6696e3812da4807f05b84a29ad9143ae',
+'4cd095ce641f217f8b5f355152eed00b1d9fd721a08dc5a0',
+'646abbd426255d2e369b7ac9eb3c3af19c7185ecd28bd82c',
+'3d731839c004ecef8ab60fafd811d0bbe6e306f7cc802bdd',
+'0a4f17a280f9017f1435cb8a11738fda4f14e3f222f06b86',
+'5007afb09312d144091f2b35618c26714bab8784d8be35b8',
+'08c4699d15dcaef9e99556ece73793e006c86d25c8be3fc7',
+'66a57a169d8d0ba263dd954b342919f4622592eed20c1981',
+'7959e5367720f3af55ae91843397134032ee73de6a8db8ac',
+'d39eefe024ce0b545d77ce327f0731c5581095ca734c21fb',
+'3accf0eec5b26ea6c936323b42636e5899f4bfe7e7cbdf3a',
+'55adbc7d757e6904448ebdbae5a8773a1781f952f5bdeec0',
+'22950977bf0f3fb8f4fc53ad2ea2c91d936aa98d06ce067e',
+'646031963fc8bf827a30924763dca11b589358e7029daf1b',
+'00aafb9109999ccf61f6689b7405ad2fa54129c3bc4e67b8',
+'1c8b29577349cf99f80ca11477f401f61e0b1a4d6974fc61',
+'737301dea93db6bcbadd7bf796693961317ca680b380416f12f466f06526b36b',
+'7786c155d10c741b63ec650b7b1aa3bfd71ac71881ad06ae98fb082f17e0caa0',
+'c02c6022ee0de099e3027850be95a29ce800118ed3a97757dd8ab9e60f69a005',
+'13e0834e4dd72a2ef7872249bf895da4432329c6e8ade8665d702ba33bb677b0',
+'cd251e66c421bad1b37cfebfa3c04ef30b8be4e5526b10fc48fd5bc5d6f04bb4',
+'9d283d8e8e473a16162d186e96355b1885370e83954dbd08622dbe64f0aac695',
+'6ab8f69868b4c87fdec9a031045b34b66660212f687a83d561bc4f9caad59fff',
+'4746e6f151caf29b3534b2f493f7cc1308fa119116d251481572a1b53a8a1b3a',
+'2c723282159ceabc5b367b95cd807f249f1dff7f9ebf5ba179a43081454e1b05',
+'22de07c3055a8935b52bb2c85a9a6b7ffd4038b5db4069c07e9e86ee1b171d25',
+'dd1a8105ab753d83d90ab39adbc748940fefda05bedea7eeebdbdf54b02d9ae1',
+'441c7fdaa40e50bf1eba073509769b1c0942f3a16e1e183435819d3b5f8538cd',
+'15c62ce7a3bfd5b3b3856d6f47cb19bb7030dc469e35a27807511f81ea83091c',
+'d5596bcc39af2782df1cd9fc8c37a8f96789275422f511280971d8429a8cb661',
+'223dfaf583140a769c805c33f1f30bfb2f0926b088f55439dfeb4f5a9ceeedf1',
+'b5b0c43028e81628dce82517fa36aa29',
+'b84003c417a472fd2935341962744330',
+'e1c3c6d90820511c8d685c73bb757ee2',
+'5f840796e0d35c807b3d715727432e68',
+'5a33b8f7cdba999ed61fab3869b8f1e9',
+'aedb7ea80734d1a65723da4f3ba18f86',
+'9f19ab5e517e884cc1b1d3124ec9ca50',
+'03243d10c48609e8f4182638c23516a2',
+'03364863690c439b306a2967daa2418c',
+'d360c381d230d21cf828782ae5e389f1',
+'3df86c710d782309023d65fccdb91db4',
+'83467cdf51f59916b492c5aba554c606',
+'0d88a7f3a8369888b4c3223499412256',
+'84ac389ad6e42798a97784941bb76fa4',
+'fc38c3bddbc320bf7373834f3c83ac67',
+'2c2bc8c87017f204c958abd9aab2beb6ac67781d8d9d804c',
+'d722b57c48128b37ba38770cbf4660697757bab95c00c484',
+'3d6305ad9dcb3a50105b92f331009a3cb03ca7ec36882fcc',
+'35fa859b3e4a793b2329652cc61f9f68816fed67fa402e1b',
+'aaed7dbe184423f0b4c9ff72dcf4557ec123b49682fc24c3',
+'51ac4d2b5923a5df8ec48c14ec514a0629f8e385a9ea4985',
+'20dc2be5c7f0b2fa8eaf026c152a09cadbdb82e52538b393',
+'da713e318a9e5b4b4f1dfe0a2af0837d70fde54442f264ff',
+'5ebf7b7d25b0ff498322e4264bda56f7512e9d4ce3c9d51e',
+'4f0a78dbbe767218eaeac0400656c4b4b23f908a9e7f4708',
+'e6e7baded94fd4042c2d3ccb586d8ca983e8033e4ccffc68',
+'d9eafa06a75b5b671be1b1f1e6296f17f71ff467417b7837',
+'e7928a55a3e4274394d81988a08196e07d5a5df047140690',
+'b4c5612cb1c1dc4333450daae500cdbcfe3ee1e3ef7a0d61',
+'3d0a38dfe4a8801ab9f9dc1446c535d792393ea8d763db4d',
+'2f8321f416b9bb249f113b13fc12d70e1668dc332839c10daa5717896cb70ddf',
+'2d3a760595f3fb19293cc6d23651222a9f5a4f02284457a9c1ed4c43ac993ca5',
+'6dc2b05619ad5458ee3de70b0c1649b3788e1a5312e8924b5486905506970881',
+'837ecd647e03fe8df9a92c32dcbc87d0734851ffbc17376e03218cce9cbe974f',
+'9cd24a0efa26c107738f5335526b57d8c93e54fef8c1babbbbb2d42f3a1d03c6',
+'1cbd4f923d683ca38aca6cd0ad81151062fd642b155b2a950eb551ca8216b0ca',
+'4f2501d2a88cb13046a6549f90e4ea924773408bb684025b5126a8fc21f48670',
+'83b1403389173568588e5b6b8cf9da180408c79f91d054ac5cd99de0b728ff66',
+'2f1a4c2bde7c8bdd7d8a9b6315b19ac654266120c652fc24ab19e00ac11c5461',
+'579d35cef5b6f8468c8285829861e93587c8dee5791208406a7f4bfafb70abfd',
+'810d7bda3421589a7dd60597447edf2b987f1e7283f3c65890248712c80969c1',
+'055ee0ade716231bcaa0a7d18161004127a37e7aa12773433a376073474d3d58',
+'eb5aaa4ee702ff7b5324bc72c98fe87df6d9cc342b053ebce6cbf27fdea0eabf',
+'26db47a48a10b9b0b697b793f5c0231aa35fe192c9d063d7b03a55e3c302850a',
+'0e445d77789a6947da70848dc4da5dc9c125869bb6945b04304bde93829a75d9',
+'b3a189a17e8d9e986cd31bbe01b49fb3',
+'7aea0e2d93e9a6a3004117ad4a4a72a3',
+'04c8f6ebcbf13fdd2ab1e5c5c25bc7ec',
+'c7e82b7b2478c319194fed944fb7c772',
+'589afd7086a58d77f046c59a419504a1',
+'8cbd8f921c55d36e5b7db27f7891def1',
+'1c649a21afe336c72c4593cb3d3c9462',
+'9ca6f24c476e59b5b068c37b0383ff4b',
+'48fc1d0123e5c7f686d74f5903323f9b',
+'41fe6d923bfb13fcec839d3c272383a6',
+'b6aa4e0beccfdd37588699435e2d40de',
+'98323e25ea0635d6abe384e8960f373c',
+'591d11b2bd18f982bccb6b3a44f760a3',
+'3d4a25554afa0abd26f72377c7180e19',
+'2d2ac1291e545de46a42ce6c435518f8',
+'08e3a1718c6d1cdef2c0c67660f7c1e8a45963e5ffed54a7',
+'b579eaf7706976152b1622c17fc47c5db3802aa3f46f6a3e',
+'53f3436a128fd497c5cd1a534558d6a6bdb5f086efabc6fc',
+'5a841e55fb2250c431fa397f1d0ec858b2c4a08e40dc897c',
+'dbeefbe2f550671d7fcd3d5bd66d19ce9faf5e6b29308ef8',
+'95beb7fcb2b8d049adef7e0f33a7792c8d71e10b71ad3efa',
+'2f8d11fe7f6c07bdd0d33dfcb3fc7dec51fe2048d1e8db44',
+'f51032cef423d7846270d8bb43f7d8426e392fd92b753a57',
+'a87d01c705415dea8cb9f0e2b6663b629f88a5ce793ea8a3',
+'97f3b4e61b5885dc4c7f69f79a07d7a40c2d1d2e3936b91b',
+'1fc68ed1bad0898d691970b530b54cef7c2733a7f1ffd276',
+'10ab06d732cdf46a1711dfab98e136c4e6ed856ea0678efd',
+'aaf4fc8d00177a99d1c895d72b3a63e7ce15f1bc3946f338',
+'edfc7a2815d6779681590f3855e668f2c2d44e64c773e711',
+'ac38d22527983468cc48efbf64cbe1307022327207fb7f94',
+'49ae1c4a7a570fde47f7517ab18898b1b991d03cfcf8c45bb3615b5f755da682',
+'37f9f32918308210849dfebf8dd456804babd6845af07218f9d9be9df9743d55',
+'5c258ba6241f65c2ee5356bb47332236baea227857e29506165861a4c7379c51',
+'3c5a9ac2a0fa2f58825233ff676bedf93d8845a409a42a05a9ae5218cea14680',
+'f15a210fca2cefc4d92bf14ff572d021463bcc28f60d034e87222dc6076eaffe',
+'6c63bed6c6082bfb085cf2426ef3d0dea97acd717a57ff0aa624d0b803f2ea14',
+'d08563dad7c32c02b305b87fad504918fd566c433e98a1367a3dbbadb26e9b64',
+'5717fc337916d66b4e292e69d507b1c81663d8140536670f3e70e33b04c83ac3',
+'3e0212e7982f43fc303d5e8457d2ab630aa257302ac489c74976cc5678823931',
+'d965907e6d0f926a7ea719464b1034a5879c865a00d4df0342b2d4f4bde0976c',
+'9c22961d48d0651bd592fd369129e44822ee22d35c142dcb6b60a725bf177c85',
+'a6109ba372c4564f4ed8c875619ff5bb64d503225197ee9259dd50264eb1f4ea',
+'c580c8e0f6a1f36403322f7b0ae3d06dd2dfd16ebc6dddd205704e97dc2998e2',
+'a51f5988a8f0f3992f549ea7f8c370a06d5ae8d65880067997536385d632b206',
+'974752b18d0dcbf29cc6104295e041259622cb7733cff63dbcf6808b15a5ad45',
+'7966440df79b13e95c41346eb792f3ec',
+'d7baa0117d008af786c2bacb38b9d386',
+'7588b290c3adf86198354e3eee4fc06f',
+'99066156163139a8735711534c022937',
+'0bfa572019e6d0f987f79b03ad67ad09',
+'ec8356beca9d87dce7d010de113b9fd5',
+'b7a1d83414cbbde7a7738c7e77cbfe3b',
+'495f4ccb0530c7b1f03f3285faaae818',
+'836034775fc41e033c56ecf21d1874aa',
+'43385c80a077720fbb417848e4fa0138',
+'9014a5bb17057eb39ab9fe59436e6c9f',
+'e4c09bb7f5ee13351baf8f4fe7386711',
+'a43a35e87ddb24ac3420c60c99090ba8',
+'d02c59ac11fc434a37eded33245701bb',
+'c6d5ed018b85568d03fce635a1332e1b',
+'f914c842b78c3b91fe6626272c04f6bfa39c586d4823ce0e',
+'c68f215b059881c9f97117b3c6d9d6deea2e0945e3e1972d',
+'3d516a213a6b8c7e3434138238ca5e339fc21038fb7bfd21',
+'94c47b509bd0c9b7aa95289a00a8a54efd425481307e9ebc',
+'9bd70f0386405c04d1bfcaa538b4099abea343c5c4379482',
+'59526ab645c2c0f464a48e411d111abe9aea19edced55383',
+'8ce0b5dde0328c9de6d4acf84ff61b3f7d01f9e9e8e36b91',
+'549afd1666a491b7ee9ccf6db2a33b2e3c2a21cfa69a1b17',
+'0cbfe6e817d297b69d5bd7740bb0e5172d86cf870a9c4da4',
+'ed1fb08b8473af53d2fe4c607e5ab9639cdd11f728462294',
+'4cb070e34b3a2ecb460670ffdd457f23c9a1174bccd35f25',
+'e5d5cd2e163ec1c883388f5f01980d3bbee914586ddd5b0e',
+'64ae3ccfaa118acc556ac50e53cd9fdf7d7e3f4b785b2e20',
+'0d2e37440adeb6836d7f47d9c516124ebbd64abd435d4c98',
+'95b0a9f0ed9fc80581407664300488f5223720148618b1b9',
+'514bd18495f6de0e237054b8e3ba1a74c3fada4279ad6b8550f3a14712c528df',
+'ca0053d51f6cf6f9998ff1e0db00b90e82c7b18cb5377acc8ebe9afe20da1c3d',
+'5131ce486de164491b4bbc84e7e461a874a2cfdd769355584a063e306960acac',
+'665344e5618e0c1fb8758d049409a484fa69b89b009746067ea036bfa0ee8a37',
+'42680195f431e71b592899686af630e15996dc718cc29030163d677688a33021',
+'2ca1bb808448eb29085286594de21e254fb3416f9ab01e99ea33ca83c1d14dc3',
+'988d4a6fa87f8138d754c5de9d176c45eaccf8eb8ca1799d87c8f04a966b6f4c',
+'ee6492a669e22bcf19bbdfc45495cd0efa9c2f2ef5d42831e3f13a545cbcd6a1',
+'9611e838fb1d816a0ff9cd269217d93258c34df9e26b74476fe4da0f7dee2335',
+'0bb4127d89d9073ea425c303adc3f9db39e40adac23ea61fba8b6e251d79390f',
+'109ebb4cb2ad746762b6652fc63b99019857ae89acfe9807648c3cfa151fed42',
+'b53db6bf0c8317586ae6c1a1e2857f241bf55dddd1b423578c6949d4bf014611',
+'4a34bd4dfeef7fa1dc739280f16a3fe1281a51311c10a920ab43d406d4ae3370',
+'4de7bab7fe9a0a9bf7b51a7cdf7d929f2b1c6ff4575fd527baba1efdf4254890',
+'4f1ee7cb36c58803a8721d4ac8c4cf8cae5d8832392eed2a96dc59694252801b',
+];
diff --git a/mojo/public/dart/third_party/crypto/test/sha1_long_test_vectors.dart b/mojo/public/dart/third_party/crypto/test/sha1_long_test_vectors.dart
new file mode 100644
index 0000000..cc0d9e6
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/test/sha1_long_test_vectors.dart
@@ -0,0 +1,142 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of sha1_test;
+
+// Standard test vectors from:
+//   http://csrc.nist.gov/groups/STM/cavp/documents/shs/shabytetestvectors.zip
+
+const sha1_long_inputs = const [
+const [ 0x7c, 0x9c, 0x67, 0x32, 0x3a, 0x1d, 0xf1, 0xad, 0xbf, 0xe5, 0xce, 0xb4, 0x15, 0xea, 0xef, 0x01, 0x55, 0xec, 0xe2, 0x82, 0x0f, 0x4d, 0x50, 0xc1, 0xec, 0x22, 0xcb, 0xa4, 0x92, 0x8a, 0xc6, 0x56, 0xc8, 0x3f, 0xe5, 0x85, 0xdb, 0x6a, 0x78, 0xce, 0x40, 0xbc, 0x42, 0x75, 0x7a, 0xba, 0x7e, 0x5a, 0x3f, 0x58, 0x24, 0x28, 0xd6, 0xca, 0x68, 0xd0, 0xc3, 0x97, 0x83, 0x36, 0xa6, 0xef, 0xb7, 0x29, 0x61, 0x3e, 0x8d, 0x99, 0x79, 0x01, 0x62, 0x04, 0xbf, 0xd9, 0x21, 0x32, 0x2f, 0xdd, 0x52, 0x22, 0x18, 0x35, 0x54, 0x44, 0x7d, 0xe5, 0xe6, 0xe9, 0xbb, 0xe6, 0xed, 0xf7, 0x6d, 0x7b, 0x71, 0xe1, 0x8d, 0xc2, 0xe8, 0xd6, 0xdc, 0x89, 0xb7, 0x39, 0x83, 0x64, 0xf6, 0x52, 0xfa, 0xfc, 0x73, 0x43, 0x29, 0xaa, 0xfa, 0x3d, 0xcd, 0x45, 0xd4, 0xf3, 0x1e, 0x38, 0x8e, 0x4f, 0xaf, 0xd7, 0xfc, 0x64, 0x95, 0xf3, 0x7c, 0xa5, 0xcb, 0xab, 0x7f, 0x54, 0xd5, 0x86, 0x46, 0x3d, 0xa4, 0xbf, 0xea, 0xa3, 0xba, 0xe0, 0x9f, 0x7b, 0x8e, 0x92, 0x39, 0xd8, 0x32, 0xb4, 0xf0, 0xa7, 0x33, 0xaa, 0x60, 0x9c, 0xc1, 0xf8, 0xd4 ],
+const [ 0x6c, 0xb7, 0x0d, 0x19, 0xc0, 0x96, 0x20, 0x0f, 0x92, 0x49, 0xd2, 0xdb, 0xc0, 0x42, 0x99, 0xb0, 0x08, 0x5e, 0xb0, 0x68, 0x25, 0x75, 0x60, 0xbe, 0x3a, 0x30, 0x7d, 0xbd, 0x74, 0x1a, 0x33, 0x78, 0xeb, 0xfa, 0x03, 0xfc, 0xca, 0x61, 0x08, 0x83, 0xb0, 0x7f, 0x7f, 0xea, 0x56, 0x3a, 0x86, 0x65, 0x71, 0x82, 0x24, 0x72, 0xda, 0xde, 0x8a, 0x0b, 0xec, 0x4b, 0x98, 0x20, 0x2d, 0x47, 0xa3, 0x44, 0x31, 0x29, 0x76, 0xa7, 0xbc, 0xb3, 0x96, 0x44, 0x27, 0xea, 0xcb, 0x5b, 0x05, 0x25, 0xdb, 0x22, 0x06, 0x65, 0x99, 0xb8, 0x1b, 0xe4, 0x1e, 0x5a, 0xda, 0xf1, 0x57, 0xd9, 0x25, 0xfa, 0xc0, 0x4b, 0x06, 0xeb, 0x6e, 0x01, 0xde, 0xb7, 0x53, 0xba, 0xbf, 0x33, 0xbe, 0x16, 0x16, 0x2b, 0x21, 0x4e, 0x8d, 0xb0, 0x17, 0x21, 0x2f, 0xaf, 0xa5, 0x12, 0xcd, 0xc8, 0xc0, 0xd0, 0xa1, 0x5c, 0x10, 0xf6, 0x32, 0xe8, 0xf4, 0xf4, 0x77, 0x92, 0xc6, 0x4d, 0x3f, 0x02, 0x60, 0x04, 0xd1, 0x73, 0xdf, 0x50, 0xcf, 0x0a, 0xa7, 0x97, 0x60, 0x66, 0xa7, 0x9a, 0x8d, 0x78, 0xde, 0xee, 0xec, 0x95, 0x1d, 0xab, 0x7c, 0xc9, 0x0f, 0x68, 0xd1, 0x6f, 0x78, 0x66, 0x71, 0xfe, 0xba, 0x0b, 0x7d, 0x26, 0x9d, 0x92, 0x94, 0x1c, 0x4f, 0x02, 0xf4, 0x32, 0xaa, 0x5c, 0xe2, 0xaa, 0xb6, 0x19, 0x4d, 0xcc, 0x6f, 0xd3, 0xae, 0x36, 0xc8, 0x43, 0x32, 0x74, 0xef, 0x6b, 0x1b, 0xd0, 0xd3, 0x14, 0x63, 0x6b, 0xe4, 0x7b, 0xa3, 0x8d, 0x19, 0x48, 0x34, 0x3a, 0x38, 0xbf, 0x94, 0x06, 0x52, 0x3a, 0x0b, 0x2a, 0x8c, 0xd7, 0x8e, 0xd6, 0x26, 0x6e, 0xe3, 0xc9, 0xb5, 0xc6, 0x06, 0x20, 0xb3, 0x08, 0xcc, 0x6b, 0x3a, 0x73, 0xc6, 0x06, 0x0d, 0x52, 0x68, 0xa7, 0xd8, 0x2b, 0x6a, 0x33, 0xb9, 0x3a, 0x6f, 0xd6, 0xfe, 0x1d, 0xe5, 0x52, 0x31, 0xd1, 0x2c, 0x97 ],
+const [ 0x64, 0x87, 0x97, 0x2d, 0x88, 0xd0, 0xdd, 0x39, 0x0d, 0x8d, 0x09, 0xd1, 0x34, 0x86, 0x0f, 0x26, 0x3f, 0x88, 0xdf, 0x7a, 0x34, 0x12, 0x45, 0x7a, 0xdf, 0x51, 0x0d, 0xcf, 0x16, 0x4e, 0x6c, 0xf0, 0x41, 0x67, 0x9b, 0x3a, 0x19, 0xfc, 0xc5, 0x42, 0xaf, 0x6a, 0x23, 0x6a, 0xb0, 0x3d, 0x66, 0xb2, 0xe8, 0xa1, 0x55, 0xd1, 0x06, 0x1a, 0xb7, 0x85, 0x9f, 0x75, 0x73, 0x27, 0x75, 0xff, 0xf6, 0x82, 0xf8, 0xf4, 0xd5, 0xe5, 0x0d, 0x3a, 0xb3, 0x77, 0x0f, 0x4f, 0x66, 0xcb, 0x13, 0x81, 0x55, 0xb4, 0x71, 0x5d, 0x24, 0x5b, 0x80, 0x69, 0x94, 0x8e, 0xa0, 0x16, 0xa4, 0x5b, 0x7e, 0xf0, 0xfd, 0xde, 0x93, 0x18, 0x8c, 0x57, 0xee, 0xf4, 0x71, 0x7f, 0x34, 0x25, 0x18, 0x1d, 0xe5, 0xb9, 0xa5, 0xd4, 0xe0, 0xa2, 0x96, 0x3f, 0x2a, 0x67, 0xa3, 0x40, 0xeb, 0x1a, 0xe9, 0x94, 0xb9, 0x8a, 0x48, 0xab, 0x19, 0xb9, 0x0a, 0xb7, 0x43, 0x91, 0xc5, 0x04, 0x26, 0xd2, 0x82, 0x87, 0xac, 0x4f, 0x1e, 0xb9, 0x3f, 0x5a, 0xf1, 0xa6, 0x8c, 0x7d, 0xae, 0x40, 0x87, 0x6b, 0x8a, 0xfa, 0xaf, 0x35, 0xa1, 0x92, 0x93, 0xc1, 0x95, 0x2e, 0x95, 0x79, 0x78, 0xab, 0xee, 0x40, 0xec, 0x32, 0xf2, 0xaa, 0x88, 0x0c, 0x95, 0x6c, 0x7e, 0xb7, 0x2f, 0x11, 0x7b, 0x39, 0x7c, 0xef, 0xcf, 0xb4, 0xe7, 0x5a, 0xce, 0x3b, 0x08, 0x17, 0x76, 0xe4, 0x6b, 0x13, 0x52, 0x1e, 0x93, 0x55, 0x9d, 0x45, 0x3e, 0x32, 0xab, 0x74, 0xeb, 0xc0, 0x85, 0x9b, 0x9a, 0x8d, 0xd4, 0xd1, 0xd3, 0x90, 0x00, 0xeb, 0xe9, 0x5f, 0x98, 0x4d, 0x80, 0xa3, 0xf5, 0x00, 0x4d, 0xc9, 0x1a, 0x05, 0x1d, 0xfb, 0xdf, 0xe9, 0x19, 0x4f, 0x4f, 0x9a, 0x48, 0x3e, 0x4e, 0x79, 0x55, 0x57, 0x7f, 0xb0, 0x93, 0x34, 0x64, 0xc6, 0x3e, 0xae, 0xc7, 0x71, 0x04, 0x4d, 0x59, 0xab, 0xc3, 0x02, 0x9a, 0x07, 0x95, 0x19, 0xf8, 0x46, 0x0a, 0x69, 0x3b, 0x25, 0xb4, 0xce, 0x20, 0x7a, 0xe9, 0xd9, 0x44, 0x7f, 0xc4, 0xc5, 0x44, 0x6e, 0x6d, 0xad, 0x23, 0x4e, 0x9a, 0xfd, 0xec, 0x0c, 0x56, 0x27, 0x98, 0xcd, 0x02, 0x97, 0x31, 0x83, 0x99, 0xe8, 0x38, 0xbe, 0x38, 0x58, 0x45, 0xc6, 0xdd, 0x79, 0xed, 0xe6, 0x6e, 0x2a, 0xe8, 0x0a, 0xfe, 0xc6, 0x73, 0x8d, 0x4d, 0x9b, 0xf4, 0x4c, 0x8d, 0x9e, 0xdd, 0xff, 0x6c, 0x5c, 0xd2, 0xc9, 0x4e, 0x34, 0x0e, 0x0d, 0xda, 0xc4, 0x03, 0x84, 0xb9, 0xa1, 0x40, 0x8c, 0x9a, 0x4b, 0x98, 0xc3, 0x7a, 0x60, 0x81, 0xd5, 0x22, 0x0f, 0xba, 0x92, 0xf1, 0xd0, 0x31, 0x44, 0xdb ],
+const [ 0xbd, 0x74, 0xe7, 0xf6, 0x07, 0xcd, 0x7d, 0x90, 0x5e, 0x90, 0x17, 0x5d, 0x67, 0x65, 0x0a, 0x6d, 0xc2, 0xf8, 0xa4, 0xe2, 0xd4, 0xab, 0x12, 0x49, 0xca, 0x88, 0x81, 0x2b, 0xda, 0x79, 0x84, 0xde, 0xcc, 0xbb, 0xb6, 0xa1, 0xba, 0x90, 0xa0, 0xe9, 0x14, 0x34, 0xdd, 0xf5, 0xe6, 0x13, 0x7b, 0xa8, 0x5e, 0x39, 0xa5, 0x98, 0x89, 0x0a, 0x7f, 0x63, 0x5d, 0x33, 0x52, 0x42, 0xfc, 0xe0, 0xe9, 0xe0, 0x37, 0x30, 0x3b, 0x6c, 0x51, 0xe5, 0x4a, 0xec, 0x06, 0x61, 0x4a, 0xd5, 0xcc, 0xce, 0x06, 0xd9, 0x59, 0x9c, 0x80, 0x01, 0x65, 0x30, 0xd7, 0xfb, 0xb1, 0xda, 0x6e, 0xb5, 0x48, 0x08, 0x4b, 0x2b, 0x05, 0xba, 0xbd, 0x7d, 0x55, 0x36, 0x42, 0x44, 0x3e, 0xfd, 0xa7, 0x26, 0xa1, 0xfd, 0x71, 0xa8, 0xbc, 0x08, 0x7c, 0x44, 0xf2, 0x85, 0xe2, 0xbc, 0xcf, 0x66, 0x1e, 0xad, 0x47, 0x5a, 0x72, 0x67, 0x3e, 0x43, 0x86, 0xfc, 0x4e, 0xea, 0x51, 0x97, 0xc4, 0xf1, 0x3c, 0x0f, 0xeb, 0x0a, 0x85, 0xbc, 0x8e, 0x67, 0xe2, 0x8a, 0xb8, 0x72, 0x68, 0x4b, 0xbe, 0xbd, 0xaa, 0x52, 0x7f, 0x3c, 0x25, 0x3d, 0xeb, 0xb2, 0xdc, 0x12, 0xc2, 0x69, 0x3f, 0x8e, 0x9e, 0x26, 0x51, 0xb9, 0x34, 0x5c, 0x0a, 0xbe, 0xd7, 0xa0, 0xfa, 0xfa, 0x3e, 0x5d, 0x30, 0x53, 0x86, 0xc9, 0x5a, 0xcb, 0x7a, 0x17, 0x2e, 0x54, 0x13, 0xef, 0x08, 0xe7, 0x3b, 0x1b, 0xd4, 0xd0, 0xd6, 0x83, 0x2e, 0x4c, 0x03, 0x5b, 0xc8, 0x55, 0x9f, 0x9b, 0x0c, 0xbd, 0x0c, 0xaf, 0x03, 0x7a, 0x30, 0x70, 0x76, 0x41, 0xc0, 0x54, 0x53, 0x56, 0xbe, 0xe1, 0x51, 0xa2, 0x40, 0x68, 0xd7, 0x06, 0x74, 0xef, 0x1b, 0xef, 0xe1, 0x6f, 0x87, 0x2a, 0xef, 0x40, 0x60, 0xfa, 0xaa, 0xd1, 0xa9, 0x68, 0xc3, 0x9c, 0x45, 0xdb, 0xd7, 0x59, 0x5d, 0xe8, 0xf4, 0x72, 0x01, 0x6b, 0x5a, 0xb8, 0x12, 0xd7, 0x7e, 0x54, 0x5f, 0xca, 0x55, 0x00, 0x0e, 0xe5, 0xce, 0x77, 0x3e, 0xda, 0xa1, 0x29, 0xea, 0xc6, 0x47, 0x34, 0x10, 0xc2, 0x49, 0x90, 0x13, 0xb4, 0xbe, 0x89, 0x5f, 0x6c, 0x0f, 0x73, 0x4b, 0xec, 0xfe, 0x99, 0x43, 0x06, 0xe7, 0x76, 0x26, 0x2d, 0x45, 0x28, 0xed, 0x85, 0x77, 0x21, 0x8e, 0x3c, 0xc5, 0x20, 0x1f, 0x1d, 0x9e, 0x5f, 0x3f, 0x62, 0x23, 0x0e, 0xb2, 0xca, 0xea, 0x01, 0x4b, 0xec, 0xfb, 0xa6, 0x0f, 0xcb, 0x1f, 0x39, 0x97, 0xaa, 0x5b, 0x3b, 0xb6, 0x22, 0xb7, 0x20, 0x5c, 0x71, 0x43, 0x48, 0xba, 0x15, 0x5c, 0x30, 0xa7, 0x9a, 0x2c, 0xea, 0x43, 0xb0, 0x70, 0xca, 0xda, 0x80, 0x7e, 0x63, 0x0b, 0x40, 0x86, 0xb1, 0x29, 0x05, 0x18, 0x98, 0xe1, 0xd9, 0xe6, 0x8d, 0x1d, 0x0e, 0xcc, 0x94, 0x29, 0xd2, 0x0d, 0x6a, 0x14, 0x03, 0xe0, 0x03, 0x5a, 0x44, 0x2b, 0x37, 0xbf, 0x50, 0x8e, 0xb8, 0x7e, 0x8e, 0xa3, 0x47, 0xa3, 0xe6, 0x84, 0x27, 0xb6, 0xd4, 0x8e, 0xd2, 0x99, 0xba, 0x65, 0xec, 0xb3, 0x7b, 0x38, 0x75, 0x4f, 0x45, 0x47, 0x42, 0x3e, 0xae, 0xa2, 0xae, 0xc4, 0x03, 0x33, 0x8d, 0xb2, 0xdc, 0xfe, 0x61, 0xcf, 0xf4, 0xa8, 0xd1, 0x7c, 0x38, 0x36, 0x56, 0x98, 0x1e, 0x18, 0x38, 0xa2, 0x38, 0x66, 0xb9, 0x1d, 0x09, 0x69, 0x8f, 0x39, 0x17, 0x5d, 0x98, 0xaf, 0x41, 0x75, 0xca, 0xed, 0x53 ],
+const [ 0xa5, 0x26, 0x38, 0xf0, 0xef, 0xb1, 0x9b, 0xff, 0x5e, 0xc9, 0x5f, 0xcd, 0xe4, 0xac, 0x9a, 0xab, 0xd9, 0x5e, 0x14, 0xd2, 0xe5, 0xf8, 0x4c, 0x55, 0x1f, 0x43, 0xbc, 0x53, 0x76, 0x85, 0x5e, 0x71, 0x51, 0x9b, 0x6f, 0x87, 0x72, 0x48, 0x73, 0x9a, 0x20, 0xcd, 0x79, 0x0b, 0x85, 0xba, 0xa0, 0x0d, 0x55, 0x03, 0xda, 0x5c, 0xb0, 0x56, 0xf0, 0x2d, 0x4a, 0xac, 0xc7, 0x60, 0xc9, 0x1f, 0xe1, 0xfd, 0x6e, 0xfb, 0x26, 0xde, 0xf8, 0x17, 0xe5, 0xa9, 0xc5, 0x66, 0x16, 0x02, 0x3b, 0xc9, 0xe2, 0xfe, 0x66, 0x27, 0x65, 0xda, 0xe2, 0xc0, 0xb2, 0xed, 0xfc, 0xbe, 0x17, 0xdb, 0x14, 0x0d, 0xa3, 0x0c, 0x46, 0x6d, 0xe6, 0x5c, 0x49, 0xc6, 0xf8, 0x14, 0x96, 0xbb, 0xbd, 0x1a, 0xcd, 0x81, 0x66, 0x64, 0x55, 0xf2, 0x3b, 0xb2, 0x43, 0xdd, 0x98, 0x7d, 0x7e, 0xa1, 0x36, 0x2a, 0x20, 0xfa, 0xac, 0x84, 0x1f, 0x1a, 0x36, 0x69, 0x2c, 0xfc, 0xb4, 0xc3, 0xdb, 0xf5, 0xf6, 0xbb, 0x05, 0x8c, 0x36, 0x29, 0x6b, 0x8b, 0xe6, 0x4e, 0x9b, 0x56, 0xad, 0xc5, 0x18, 0x7c, 0xac, 0xb7, 0xb5, 0x8c, 0x05, 0x4f, 0x42, 0x2a, 0x9e, 0x6d, 0x6a, 0x61, 0x22, 0x9f, 0xdc, 0x3b, 0x49, 0x4d, 0xa9, 0x8f, 0x5a, 0x33, 0xed, 0x1b, 0xee, 0x14, 0xb2, 0xd2, 0xf6, 0xad, 0x11, 0x77, 0xff, 0xe9, 0x9a, 0x6b, 0xb5, 0x53, 0xf7, 0xc4, 0xa6, 0xd0, 0xcb, 0x9e, 0x49, 0x8e, 0xe0, 0xb6, 0x3f, 0x38, 0x82, 0x35, 0xd8, 0x6c, 0x26, 0xc9, 0xd9, 0x6e, 0x50, 0xfa, 0x7d, 0x1e, 0xb3, 0xbc, 0xb9, 0x27, 0x99, 0x40, 0xc4, 0x7a, 0x85, 0x10, 0xd7, 0xfb, 0x17, 0x5b, 0x32, 0x79, 0x31, 0x8d, 0x5f, 0xe4, 0x58, 0x23, 0xba, 0xba, 0x5d, 0xbe, 0x31, 0xc3, 0x3c, 0x76, 0x49, 0xfe, 0x44, 0x70, 0x61, 0xdb, 0x78, 0xb3, 0x3b, 0xaa, 0x36, 0x37, 0xb8, 0x54, 0x16, 0x3f, 0xe3, 0x49, 0x15, 0xe9, 0x31, 0xb9, 0xf3, 0x04, 0x08, 0x07, 0xd9, 0x21, 0x7d, 0x7b, 0x3f, 0xed, 0x62, 0x37, 0x0d, 0xbe, 0x80, 0x6c, 0x00, 0x6b, 0x21, 0xcd, 0x50, 0x61, 0xd2, 0x44, 0x90, 0xf3, 0x66, 0xe4, 0xd5, 0xf2, 0x3e, 0x20, 0x1a, 0x7e, 0xc8, 0x3a, 0xe3, 0x1b, 0x46, 0xfe, 0x21, 0x08, 0xd1, 0xaf, 0x56, 0xcc, 0x9d, 0x42, 0xf9, 0x11, 0x7e, 0xca, 0x1c, 0xb5, 0xab, 0x34, 0x4c, 0x1f, 0xc3, 0x34, 0xb9, 0xcf, 0x0d, 0x7f, 0x97, 0x39, 0x04, 0x3b, 0xc3, 0xd4, 0x13, 0xb3, 0xaa, 0x6e, 0x9d, 0x50, 0x67, 0xc2, 0x40, 0xc5, 0x2b, 0x4c, 0x5b, 0x89, 0xe2, 0x5c, 0xcd, 0x8a, 0x13, 0x6a, 0x00, 0x20, 0x08, 0xa9, 0x27, 0x3f, 0x30, 0xde, 0xc3, 0xf2, 0xc1, 0x73, 0x6c, 0x04, 0xa1, 0xc7, 0xce, 0x00, 0x87, 0xc9, 0xf2, 0x5d, 0x5e, 0xc5, 0xbf, 0xf2, 0xea, 0x7e, 0xc0, 0xb0, 0xad, 0x7c, 0x27, 0x8f, 0x0c, 0xa7, 0x12, 0xc9, 0xae, 0x15, 0x0e, 0x47, 0x25, 0x21, 0xd9, 0x58, 0xd0, 0xbd, 0x6d, 0xa9, 0xff, 0x09, 0x39, 0x72, 0x59, 0x24, 0xb2, 0xed, 0x7b, 0x41, 0x0a, 0x0c, 0xe2, 0xfe, 0x3f, 0x6b, 0x0b, 0xf2, 0x58, 0x84, 0xd8, 0x85, 0xec, 0x22, 0x36, 0x05, 0xe3, 0x18, 0xfd, 0xf6, 0x80, 0x32, 0x18, 0xa9, 0xa0, 0x6c, 0xe5, 0x10, 0x3c, 0x62, 0xde, 0xd0, 0x35, 0x08, 0x7a, 0x98, 0x51, 0x9b, 0x4e, 0xb1, 0x80, 0xd7, 0x78, 0xd7, 0x65, 0x6b, 0x3d, 0x48, 0x11, 0xaa, 0xf1, 0x1a, 0x12, 0x83, 0x17, 0xd1, 0xac, 0xb3, 0xca, 0x31, 0x66, 0x39, 0x5c, 0x51, 0xc9, 0x0a, 0x3c, 0xf1, 0x64, 0x07, 0x1d, 0x0d, 0x13, 0x2c, 0x54, 0xb3, 0x81, 0x0a, 0x82, 0x11, 0xec, 0x77, 0x74, 0xd2, 0x28, 0x84, 0x47, 0xab, 0xe7, 0xaf, 0xd0, 0x30, 0x37, 0x5a, 0x3b, 0xed, 0x4c, 0x7c, 0xf1, 0xb2, 0x80, 0x97, 0xc0, 0x2e, 0x98, 0xea, 0x36, 0xbf, 0x49, 0xe7, 0x4d, 0x89, 0xfb, 0xe7, 0x4e, 0xc6, 0xcc, 0x1d, 0xef, 0x5c, 0xd8, 0xc8, 0xbe, 0xb5, 0xb8, 0xad, 0xc3, 0xcb, 0x48, 0xc5, 0x61, 0x82, 0xad, 0x33, 0x7e, 0x3b, 0x97, 0x78, 0xe4, 0xa6, 0xc4 ],
+const [ 0x89, 0x2a, 0xf4, 0xc0, 0x53, 0x68, 0xaa, 0x92, 0x42, 0xac, 0xed, 0xd8, 0x7d, 0x0f, 0xc6, 0x8d, 0xe4, 0x83, 0xab, 0x59, 0x52, 0x0a, 0xea, 0x62, 0x1f, 0x26, 0x4b, 0x65, 0xea, 0x90, 0xf0, 0x05, 0x95, 0x2c, 0x81, 0x63, 0x90, 0x3d, 0x86, 0xee, 0x5b, 0xd6, 0x14, 0x7d, 0x46, 0x91, 0xac, 0x9b, 0x7c, 0x82, 0x60, 0x21, 0x3f, 0x6e, 0x37, 0x0b, 0x75, 0x39, 0xd3, 0x84, 0x64, 0x9e, 0x51, 0x43, 0xba, 0x23, 0x71, 0x1a, 0xd0, 0x4b, 0xf7, 0xcc, 0x2f, 0x0d, 0x51, 0x20, 0x54, 0x85, 0x79, 0x33, 0xb0, 0xea, 0x1d, 0x12, 0xf3, 0xc0, 0xfe, 0x88, 0x8a, 0x4e, 0x96, 0x35, 0x66, 0x53, 0xfd, 0xe0, 0x00, 0xf5, 0x0d, 0x0f, 0x9a, 0xfa, 0xc5, 0xd4, 0xc7, 0x3a, 0xeb, 0xe9, 0x2d, 0x54, 0xf5, 0xff, 0x8a, 0xa1, 0x2a, 0x54, 0xf5, 0x66, 0x05, 0x84, 0x67, 0x4e, 0xda, 0xa1, 0x79, 0x17, 0xbb, 0x85, 0x6f, 0x8b, 0x9d, 0x67, 0x76, 0xb2, 0xb7, 0xad, 0x2a, 0x46, 0x2b, 0x01, 0x5b, 0x67, 0xe8, 0xa7, 0x11, 0x90, 0xcf, 0x0e, 0xcd, 0xca, 0x15, 0xa5, 0x12, 0x1f, 0xe8, 0xef, 0x24, 0x52, 0x55, 0xda, 0x10, 0xcd, 0x69, 0x4d, 0xec, 0xdb, 0x96, 0x00, 0x60, 0x17, 0x59, 0x90, 0x66, 0x25, 0x1a, 0xd3, 0x4d, 0x9f, 0x54, 0x69, 0x04, 0x52, 0xf5, 0x93, 0x95, 0xab, 0x08, 0x48, 0xf0, 0x6c, 0x91, 0x86, 0xea, 0xa3, 0xb8, 0xe7, 0x85, 0xdd, 0x2a, 0x74, 0x72, 0x97, 0xbd, 0xbd, 0xd4, 0xf5, 0x53, 0x2a, 0x47, 0xb7, 0x00, 0x8c, 0x21, 0x68, 0x6f, 0xf7, 0xf8, 0xd8, 0x81, 0xd4, 0x64, 0xcd, 0x38, 0x32, 0x05, 0xf6, 0xd4, 0x5d, 0xc8, 0x20, 0x3b, 0xb2, 0x67, 0xac, 0x9e, 0xb1, 0x2f, 0x41, 0x5a, 0x54, 0x06, 0xbe, 0x1c, 0x9f, 0xac, 0x73, 0x49, 0x79, 0x41, 0x90, 0x9d, 0xba, 0x08, 0xdd, 0x12, 0x85, 0x6a, 0xac, 0x03, 0xd8, 0x3e, 0x0d, 0x91, 0x61, 0x47, 0x40, 0x46, 0x94, 0xfe, 0x70, 0xf8, 0xfa, 0x92, 0x9e, 0xf0, 0xcc, 0x2e, 0xdb, 0x4c, 0xc0, 0x7a, 0xba, 0xa2, 0x23, 0x64, 0x05, 0xe6, 0x28, 0x20, 0xaf, 0x8e, 0x80, 0x6d, 0x0a, 0xf3, 0x2a, 0x1b, 0x3a, 0xfb, 0x8d, 0xca, 0xea, 0xf5, 0xc4, 0xf4, 0x3d, 0xc4, 0x39, 0x2e, 0x07, 0x40, 0x75, 0xaa, 0x3e, 0xd9, 0x36, 0x01, 0xab, 0x7e, 0xc2, 0x2f, 0xe5, 0xbd, 0x7c, 0xdf, 0x80, 0x2b, 0xb5, 0xea, 0x82, 0x06, 0xc4, 0x1a, 0x16, 0x19, 0x59, 0x33, 0x85, 0xe0, 0x0e, 0x34, 0x61, 0xed, 0x3f, 0xda, 0x04, 0x8a, 0x1c, 0x66, 0x39, 0xa0, 0xfc, 0xa0, 0x38, 0xd7, 0xf5, 0x1c, 0xd8, 0xff, 0xa9, 0xbc, 0x00, 0xaf, 0x62, 0x76, 0x5e, 0x2b, 0x62, 0x57, 0x5c, 0x8b, 0x74, 0xc8, 0x50, 0x1a, 0xc7, 0x11, 0xf3, 0xfd, 0xfc, 0x1b, 0x15, 0x15, 0x7e, 0x7a, 0x8f, 0x26, 0x12, 0xaa, 0x78, 0x38, 0xaf, 0x99, 0x9c, 0x3d, 0x8f, 0x66, 0x29, 0xf5, 0x86, 0x69, 0xac, 0x0f, 0x93, 0x73, 0x3c, 0x91, 0xb5, 0x57, 0xf5, 0x79, 0xff, 0xa9, 0xa9, 0xa4, 0xef, 0xc5, 0xd1, 0xf0, 0xfc, 0x13, 0xca, 0x9e, 0x6e, 0x8a, 0x3e, 0xfa, 0x72, 0x73, 0xe0, 0x3d, 0x6e, 0x70, 0x5c, 0xb2, 0x92, 0xbc, 0x8d, 0x18, 0xb0, 0xb4, 0xf1, 0x48, 0x4d, 0x97, 0x5b, 0x17, 0xf8, 0x8a, 0xe8, 0x7e, 0xda, 0xdf, 0x34, 0xf8, 0x8f, 0x96, 0xce, 0x2c, 0x34, 0x24, 0xe9, 0xcc, 0xc1, 0x74, 0x54, 0xbd, 0x99, 0x2c, 0xac, 0x78, 0x60, 0x31, 0xd0, 0xb0, 0x0d, 0x6d, 0x95, 0x35, 0x40, 0xd0, 0xbb, 0x18, 0xd5, 0x94, 0x20, 0x10, 0xb9, 0xc6, 0x34, 0x1c, 0xfc, 0x02, 0xad, 0x6a, 0x28, 0x7e, 0x7c, 0x78, 0xd2, 0x49, 0xff, 0x79, 0x6e, 0xd5, 0x78, 0xfa, 0x68, 0xb4, 0xbe, 0xc5, 0x70, 0x9f, 0x32, 0x05, 0x15, 0xbc, 0xf5, 0xac, 0x95, 0x21, 0x58, 0x12, 0xf3, 0x94, 0x94, 0xde, 0x4b, 0x94, 0xbc, 0x2a, 0x63, 0x9e, 0xef, 0xe2, 0x82, 0xa9, 0xd2, 0x6d, 0x85, 0xf3, 0x3d, 0x90, 0x2f, 0xff, 0x35, 0x8f, 0xc1, 0xde, 0x1b, 0x95, 0xca, 0xaf, 0x22, 0x55, 0x41, 0x62, 0x07, 0xf2, 0xd1, 0xc1, 0xfc, 0x1c, 0x74, 0xb0, 0xe5, 0x7d, 0x43, 0xb3, 0xc6, 0x53, 0x8d, 0xb2, 0x7c, 0x5e, 0x26, 0xf9, 0xac, 0xfc, 0x01, 0x83, 0xfa, 0x93, 0x01, 0x78, 0x7b, 0x2f, 0x0d, 0xf4, 0x6c, 0x6c, 0x63, 0x0a, 0x24, 0x97, 0x2e, 0x09, 0x47, 0x10, 0x5a, 0xfd, 0x3d, 0xf2, 0xa7, 0x79, 0xe2, 0xf6, 0xfc, 0x94, 0x7f, 0x95, 0xff, 0x32, 0xfa, 0x6d, 0xe2, 0x85, 0x49, 0xe6, 0x7f, 0xd3, 0x2c, 0x15, 0xa8, 0x79, 0x1c, 0xe1, 0xb8, 0x30, 0x7e, 0x64, 0x6e, 0x8f, 0x1d, 0x94, 0xfc, 0xd1, 0xd7, 0x22, 0x5a, 0xd9, 0x97, 0xa2, 0xe0, 0x73, 0x83, 0xed, 0x14, 0xdd, 0x76, 0xc3, 0xc1, 0x86, 0xb0, 0xb5, 0x49, 0x15, 0xcc ],
+const [ 0xa5, 0x04, 0x5d, 0x24, 0xd0, 0x75, 0x78, 0xca, 0x31, 0x98, 0x7d, 0xb3, 0xd2, 0xe2, 0x5e, 0x12, 0xea, 0x38, 0xbb, 0x1d, 0xa7, 0xa8, 0xbd, 0x64, 0x2a, 0x57, 0x42, 0x61, 0xd4, 0xba, 0x3a, 0x50, 0xc0, 0x09, 0x50, 0x41, 0x90, 0xf1, 0xce, 0x6b, 0x6d, 0x8a, 0xba, 0xc3, 0x49, 0x88, 0x45, 0xcd, 0x67, 0xb5, 0x67, 0xb2, 0x1e, 0x9f, 0xc3, 0x94, 0xda, 0x8d, 0xd0, 0x1e, 0x63, 0xb8, 0x3a, 0x5f, 0x62, 0xb8, 0x86, 0xd8, 0x21, 0x3d, 0xf6, 0xd3, 0x92, 0xff, 0xac, 0xf7, 0x93, 0xf8, 0x11, 0x1a, 0x70, 0xd0, 0x78, 0x56, 0xa9, 0x99, 0xff, 0x5f, 0xf6, 0xbc, 0xb6, 0x13, 0x89, 0x33, 0x04, 0x53, 0x93, 0xf9, 0x46, 0x12, 0x09, 0xbf, 0xb8, 0xab, 0xa8, 0xe1, 0x99, 0x78, 0x37, 0x98, 0x8a, 0xa0, 0x0c, 0x71, 0x38, 0x30, 0xd1, 0xfe, 0x3a, 0x6e, 0x88, 0xcb, 0x3d, 0x6a, 0xcd, 0x93, 0x5e, 0xd5, 0x5b, 0xb4, 0xd7, 0x16, 0xd2, 0xe1, 0xde, 0x9b, 0xb8, 0x17, 0xca, 0x6d, 0xbd, 0xd2, 0x78, 0x08, 0x43, 0x80, 0xed, 0x69, 0x1d, 0x36, 0x3c, 0x68, 0x97, 0xa2, 0xaa, 0x48, 0xb7, 0x41, 0x11, 0x8d, 0xc3, 0xd1, 0x82, 0x0d, 0x03, 0x0a, 0x2e, 0x4a, 0xc8, 0x89, 0x87, 0xff, 0xae, 0x0d, 0xa2, 0xf9, 0x1d, 0xe5, 0xe0, 0x28, 0x16, 0xa9, 0xcd, 0xf6, 0x2c, 0x29, 0x48, 0xd7, 0xd0, 0xa3, 0xe5, 0x22, 0xd2, 0x39, 0x8f, 0x1f, 0x25, 0xa1, 0x72, 0x61, 0xe3, 0x1f, 0x18, 0x56, 0x90, 0xb0, 0xd1, 0x1c, 0xa3, 0x88, 0x59, 0x96, 0x42, 0xbf, 0xb5, 0xc0, 0x4e, 0x48, 0x5e, 0x3f, 0x9f, 0x22, 0xa1, 0x3d, 0x91, 0xd2, 0x46, 0x73, 0xbf, 0x10, 0x70, 0x87, 0x0e, 0xc1, 0xc4, 0x99, 0xee, 0x25, 0xcd, 0x19, 0xdc, 0x52, 0x9f, 0xdb, 0x2b, 0xe1, 0xbb, 0x6d, 0x05, 0xe7, 0x33, 0xa8, 0xad, 0x27, 0x0f, 0x85, 0x06, 0x85, 0xee, 0x32, 0x59, 0xbe, 0xf1, 0x65, 0x53, 0x57, 0xd4, 0xf1, 0x4d, 0xd3, 0x5e, 0x97, 0xd1, 0x29, 0xfc, 0x1e, 0x59, 0x75, 0xa9, 0xa5, 0x59, 0xee, 0x10, 0x39, 0x80, 0x18, 0xf5, 0xa3, 0x3b, 0x3b, 0xd1, 0x83, 0x7c, 0x13, 0xbc, 0xa3, 0xb9, 0xc9, 0x90, 0x85, 0x37, 0x22, 0x4c, 0x3e, 0x88, 0xf7, 0xb6, 0x87, 0x53, 0xe5, 0x45, 0x12, 0x53, 0x45, 0x3d, 0x1a, 0xa2, 0x5e, 0x1c, 0x3e, 0x38, 0xda, 0x35, 0x8f, 0xae, 0x77, 0x9b, 0xe8, 0x48, 0xff, 0x40, 0x7e, 0x33, 0x7a, 0x5e, 0xb7, 0x0b, 0xa2, 0x16, 0x40, 0xa1, 0x97, 0x58, 0x5a, 0xfa, 0xd4, 0x02, 0x74, 0x9b, 0x62, 0x4c, 0xff, 0x03, 0x4b, 0x63, 0x7e, 0x7a, 0x52, 0x54, 0xdc, 0x09, 0xe1, 0x2c, 0x03, 0xca, 0x43, 0x5d, 0xaa, 0x62, 0x13, 0x64, 0x6e, 0xcb, 0xf5, 0xa9, 0x25, 0x57, 0x84, 0xa7, 0x6f, 0xf1, 0x8b, 0x4c, 0x8d, 0xa6, 0x77, 0xa3, 0x77, 0x65, 0x0c, 0xb0, 0x28, 0x03, 0x58, 0x9c, 0x3d, 0x82, 0xe5, 0x12, 0xbe, 0x93, 0x33, 0xe8, 0x3c, 0x59, 0x65, 0x02, 0x1c, 0x70, 0x3b, 0x73, 0x32, 0x2e, 0x40, 0xe6, 0x92, 0x29, 0x45, 0x3d, 0xa2, 0xf9, 0x0d, 0x77, 0x74, 0x3f, 0x4a, 0xd7, 0x53, 0xe6, 0xc8, 0x42, 0x9c, 0xa8, 0xe9, 0xea, 0xd0, 0xd4, 0x51, 0x29, 0xe6, 0x4f, 0xe2, 0xaf, 0xe6, 0xd9, 0xeb, 0xe0, 0xb3, 0x92, 0x9c, 0x78, 0x28, 0xbd, 0xbe, 0x71, 0x67, 0xc3, 0xa1, 0x26, 0x6e, 0x7b, 0x55, 0xb8, 0xec, 0xa8, 0x1c, 0xb1, 0x52, 0xc4, 0x20, 0xe7, 0x2c, 0xfc, 0x62, 0xa4, 0xb2, 0x7b, 0xf3, 0x03, 0x9a, 0xeb, 0x66, 0x9d, 0x31, 0x39, 0x85, 0x65, 0xaa, 0x99, 0x43, 0xd1, 0xb6, 0xcb, 0xf2, 0x3b, 0x55, 0x9c, 0xb6, 0x86, 0xeb, 0xaf, 0x3a, 0x04, 0x96, 0x7d, 0xa1, 0x97, 0xbf, 0x9b, 0xc0, 0x17, 0xef, 0x3c, 0x8a, 0xf4, 0xe4, 0xf6, 0xcb, 0x1d, 0xe5, 0xc9, 0x1a, 0x20, 0x52, 0x5d, 0x08, 0x92, 0x7f, 0x8b, 0x9e, 0xb1, 0xc2, 0x1f, 0x07, 0x48, 0xcb, 0xdc, 0x89, 0xd3, 0x34, 0xc1, 0xba, 0xe4, 0x59, 0x8b, 0xf0, 0xc5, 0x6a, 0x7b, 0xf9, 0x5f, 0xbf, 0x59, 0x0c, 0x5a, 0x6b, 0xb9, 0x00, 0x86, 0x13, 0x7d, 0xbc, 0x7a, 0x01, 0x9b, 0xef, 0x7b, 0x74, 0x21, 0x01, 0x9f, 0x3a, 0x76, 0x49, 0x31, 0x81, 0xe2, 0x80, 0x58, 0xeb, 0x50, 0x75, 0xf4, 0xe0, 0x53, 0x03, 0xc9, 0x28, 0x68, 0x40, 0xdf, 0xb9, 0x7b, 0xf8, 0x28, 0xcd, 0xac, 0x5a, 0x64, 0x38, 0x52, 0xf0, 0x42, 0xf9, 0x40, 0xd5, 0xc8, 0x0f, 0x48, 0x22, 0xf4, 0x8e, 0xfe, 0xa9, 0xa4, 0xf1, 0xbe, 0xe6, 0xb3, 0xb2, 0xf1, 0x32, 0x65, 0x18, 0x8b, 0x3a, 0x05, 0x51, 0xd8, 0xb0, 0xcc, 0xc0, 0x79, 0x40, 0x05, 0x98, 0xaa, 0xc6, 0x6f, 0xaa, 0xc6, 0xbe, 0xe3, 0x7b, 0x0c, 0xfb, 0x36, 0x9a, 0xa3, 0x9d, 0x61, 0x30, 0xdc, 0x3d, 0xdf, 0xd9, 0xb8, 0x6a, 0x57, 0xb2, 0xaa, 0x59, 0x7b, 0xb4, 0x9d, 0xd8, 0x30, 0x40, 0x39, 0x84, 0xef, 0xfa, 0x62, 0x3c, 0x6b, 0xdb, 0x02, 0xd5, 0x74, 0x82, 0x09, 0x0f, 0x1b, 0xcb, 0xb2, 0xc8, 0x17, 0xa3, 0x07, 0x70, 0x67, 0x1b, 0xa7, 0xbd, 0x39, 0xbb, 0xc7, 0xa0, 0x0b, 0x18, 0x77, 0x77, 0x10, 0xa8, 0x26, 0x84, 0xd5, 0xd6, 0x69, 0x9e, 0x24, 0x52, 0xf8, 0x26, 0x29, 0xab, 0xf9, 0x3d, 0xd3, 0x1f, 0x82, 0x34, 0x7d, 0xb2, 0x59, 0x44, 0xce, 0x7d, 0xfe, 0x80, 0xdd, 0x49, 0xeb, 0x07, 0x99, 0x5c, 0x1a, 0x7e, 0x69, 0x93, 0xc8, 0xbe, 0x0f, 0xb1, 0x79, 0xc9, 0xd2, 0xf7, 0x3c, 0x03, 0xdc, 0xf5, 0x30, 0x9f, 0xe1, 0x9f, 0x47 ],
+const [ 0x91, 0x2e, 0x0d, 0xc2, 0x5b, 0x52, 0x54, 0x0f, 0x4d, 0x33, 0xd2, 0x6f, 0xdc, 0xba, 0xdd, 0xb4, 0x20, 0xf5, 0x57, 0x01, 0x41, 0xbc, 0xcb, 0x8c, 0x2c, 0x94, 0xb8, 0xa3, 0x8a, 0xd3, 0x2d, 0xed, 0xf2, 0x05, 0x96, 0xf3, 0x5d, 0x8f, 0xd6, 0xde, 0xdb, 0x92, 0x96, 0x82, 0x85, 0x12, 0xdc, 0x9c, 0xb3, 0x58, 0xdf, 0x58, 0x6f, 0x94, 0x1a, 0x17, 0x29, 0xc7, 0x9f, 0x6e, 0xac, 0xe0, 0xae, 0x72, 0x50, 0x25, 0x86, 0x33, 0x71, 0xd5, 0x7b, 0x86, 0x21, 0x0c, 0x49, 0x08, 0x1a, 0xe6, 0xa8, 0x5f, 0xf6, 0xe7, 0x20, 0xc3, 0xa3, 0x9b, 0x1f, 0xbe, 0x11, 0x79, 0x49, 0x2f, 0x2d, 0x0d, 0x0f, 0x95, 0x13, 0x57, 0x83, 0x8a, 0x7f, 0x6e, 0x6a, 0x8e, 0x85, 0x68, 0x93, 0x06, 0x83, 0x7e, 0x68, 0x84, 0x53, 0x6c, 0xc3, 0x49, 0xc5, 0x17, 0x03, 0x09, 0x4c, 0x72, 0x5e, 0xee, 0xf7, 0xa2, 0x79, 0xdf, 0xa3, 0x61, 0x35, 0x01, 0x70, 0xa0, 0xcc, 0x7e, 0x71, 0x70, 0x1e, 0x86, 0xa8, 0x22, 0x45, 0x94, 0x31, 0xad, 0x6f, 0xf3, 0xbd, 0x51, 0xed, 0x80, 0x42, 0x7a, 0x87, 0xb1, 0xf1, 0xe7, 0x13, 0xd6, 0x69, 0x0b, 0x46, 0x9f, 0x2a, 0xb4, 0xc9, 0xdf, 0x4c, 0xea, 0x8f, 0x8f, 0x71, 0x1a, 0x67, 0x16, 0xf8, 0x74, 0xcd, 0xc8, 0x73, 0x91, 0x06, 0xac, 0x5b, 0x59, 0x6c, 0x82, 0x03, 0x24, 0x06, 0x04, 0xcb, 0x1f, 0x5b, 0x6d, 0x96, 0xf2, 0x88, 0x38, 0x7e, 0x9f, 0x91, 0x2a, 0xc6, 0xad, 0xf5, 0x92, 0x0f, 0x87, 0x85, 0xd0, 0xcf, 0x1f, 0x75, 0x14, 0x00, 0xd6, 0xb4, 0x68, 0x15, 0xa0, 0x79, 0xf1, 0x32, 0x63, 0x1f, 0x71, 0x9c, 0xa1, 0x32, 0x11, 0x6f, 0x57, 0xca, 0x5e, 0x8f, 0x25, 0x17, 0x91, 0xe0, 0xae, 0x3e, 0x13, 0xba, 0x42, 0x63, 0x40, 0x97, 0xbb, 0x07, 0x6c, 0x0f, 0xa4, 0x95, 0x23, 0x07, 0xa1, 0x37, 0xb5, 0x25, 0x0a, 0xee, 0xf2, 0x87, 0xda, 0xe2, 0x33, 0xb4, 0xc8, 0xf7, 0x9a, 0xd2, 0xb3, 0xa0, 0x9a, 0x1a, 0x43, 0xf8, 0xb9, 0x8a, 0xce, 0x0f, 0x94, 0xd9, 0x78, 0x81, 0x24, 0xb0, 0x9f, 0x4e, 0x41, 0x17, 0x76, 0xe5, 0x64, 0x2e, 0xef, 0x82, 0xb1, 0x1d, 0xdf, 0xba, 0x35, 0x4d, 0x5d, 0x55, 0x6c, 0xd9, 0x6a, 0x5b, 0x06, 0x3f, 0xd8, 0x71, 0xea, 0x5c, 0x64, 0x66, 0x7c, 0x97, 0x26, 0x0a, 0x1b, 0x5c, 0x2b, 0x3f, 0xee, 0xcc, 0x60, 0x52, 0xe1, 0xb2, 0xb1, 0x8b, 0xea, 0xb9, 0x73, 0x02, 0x91, 0xdd, 0xff, 0xb5, 0xaf, 0x20, 0xa0, 0xd8, 0x76, 0x7e, 0xb0, 0x6c, 0xb1, 0x22, 0xfd, 0x13, 0x4d, 0xda, 0x72, 0x23, 0x19, 0xc9, 0xf3, 0xf9, 0xca, 0x5c, 0x88, 0x90, 0x42, 0x7f, 0xbe, 0x52, 0x12, 0x10, 0x4a, 0x2d, 0x3d, 0x93, 0xf0, 0xea, 0x3f, 0x28, 0xa3, 0xba, 0x4d, 0xbb, 0xee, 0x12, 0xdf, 0x7b, 0x92, 0xb9, 0x6c, 0x8d, 0x71, 0x20, 0x74, 0x01, 0xaa, 0xf1, 0xc4, 0x05, 0x06, 0xea, 0xf6, 0x58, 0x93, 0xec, 0x37, 0x02, 0x8e, 0x4f, 0x4d, 0x43, 0x86, 0x79, 0xd8, 0xc9, 0xbf, 0xaf, 0xd7, 0x25, 0xd5, 0x2a, 0x6f, 0x80, 0xa1, 0x6e, 0xe8, 0x8a, 0x60, 0xd7, 0xf9, 0xb4, 0x12, 0x75, 0x45, 0x9f, 0x21, 0x1a, 0x25, 0xd4, 0x43, 0xb0, 0xa8, 0xb5, 0xa1, 0xd0, 0xd8, 0xb4, 0x39, 0x91, 0x3f, 0xc2, 0x81, 0x9e, 0xaa, 0x0a, 0x4d, 0x8c, 0x2d, 0xe0, 0xf2, 0x6a, 0x67, 0xf4, 0xac, 0x99, 0x07, 0xcc, 0x3d, 0xde, 0x8f, 0x71, 0xd7, 0xb5, 0x59, 0x68, 0x3c, 0xe8, 0xd7, 0xe3, 0x24, 0x61, 0x1e, 0x39, 0xdf, 0x3c, 0xa6, 0x94, 0x3b, 0x21, 0x4b, 0xe9, 0xa8, 0xd1, 0x98, 0x2e, 0x9a, 0xfe, 0x45, 0xc7, 0x2f, 0x60, 0xfe, 0x41, 0x12, 0x05, 0x67, 0x42, 0x9f, 0xe9, 0x5c, 0xc0, 0x48, 0xc6, 0x7d, 0x72, 0x37, 0x2d, 0xea, 0x84, 0x34, 0xd6, 0x4b, 0x8f, 0xca, 0x35, 0x14, 0xc8, 0xa5, 0x4d, 0x07, 0x78, 0x3f, 0xc9, 0xfa, 0xac, 0xbc, 0x49, 0xda, 0x2d, 0x12, 0xfa, 0xf0, 0xb2, 0x6c, 0x69, 0x63, 0x55, 0xd1, 0x99, 0xfe, 0x44, 0x00, 0x53, 0x34, 0xb9, 0x9f, 0xbd, 0x61, 0x2c, 0x95, 0x2e, 0x53, 0xc7, 0xb5, 0x41, 0x09, 0x1a, 0x9c, 0x28, 0xba, 0x10, 0xdc, 0x43, 0x1a, 0x21, 0x5a, 0xf1, 0xd8, 0xca, 0xf4, 0xa7, 0x6b, 0x3a, 0x67, 0x3f, 0x0e, 0x4f, 0x70, 0x92, 0x09, 0xc0, 0x32, 0x48, 0x33, 0x9c, 0xd8, 0xef, 0xb5, 0xf3, 0x7b, 0x4b, 0x10, 0xd2, 0x46, 0xed, 0x62, 0x75, 0xd8, 0x07, 0xe5, 0xb9, 0xe9, 0x7f, 0xb8, 0xd0, 0x31, 0x42, 0xe2, 0x38, 0x85, 0xdb, 0x94, 0xee, 0x44, 0x44, 0xae, 0xdf, 0xf1, 0xfc, 0x85, 0x9f, 0x21, 0x59, 0xe3, 0x5d, 0x98, 0x20, 0x50, 0x17, 0xaf, 0x53, 0x90, 0x0a, 0xf9, 0x4a, 0x6d, 0x6d, 0x25, 0x05, 0xb7, 0x5e, 0x26, 0xc1, 0x88, 0x1d, 0x92, 0xc9, 0xcc, 0x78, 0x48, 0x8f, 0x01, 0x86, 0x56, 0xfb, 0x3c, 0x98, 0x1a, 0x03, 0x6d, 0x6d, 0xa7, 0x7c, 0xe3, 0xa5, 0x69, 0x30, 0x13, 0x78, 0x0d, 0x30, 0x95, 0xa8, 0x9b, 0x6c, 0x6f, 0xb4, 0xe5, 0x80, 0x96, 0x4f, 0x25, 0xd1, 0xb2, 0x10, 0xe2, 0xd9, 0x22, 0x6b, 0x13, 0xbf, 0x40, 0xe0, 0x87, 0x2b, 0xe6, 0x72, 0x84, 0x58, 0x31, 0x5b, 0xaf, 0x6b, 0x84, 0xfe, 0x2b, 0x03, 0xd0, 0x1d, 0x05, 0x11, 0x13, 0x4c, 0xd0, 0xea, 0x1f, 0xa6, 0x8c, 0x9a, 0x9d, 0xbe, 0xcd, 0x7b, 0x51, 0xd9, 0x19, 0x07, 0xa0, 0x5a, 0x91, 0xeb, 0x4f, 0x7d, 0xd3, 0x5c, 0x8d, 0x48, 0x20, 0xae, 0x34, 0xbf, 0xba, 0x23, 0x4c, 0x58, 0x90, 0x01, 0xd1, 0xae, 0x1d, 0xe7, 0xb5, 0x79, 0x8e, 0x60, 0x29, 0xbe, 0x23, 0xb9, 0x19, 0x43, 0xd7, 0x10, 0xf5, 0x46, 0x43, 0xae, 0xb7, 0x6e, 0xc0, 0x97, 0x22, 0x02, 0xcc, 0x5e, 0x47, 0x59, 0xaf, 0x3e, 0x4e, 0x92, 0x5e, 0x67, 0x73, 0x85, 0x9f, 0x96, 0x4f, 0xf8, 0x6e, 0xe8, 0x59, 0x17, 0x9f, 0xf0, 0xac, 0x1e, 0xc6, 0x07, 0x0b, 0x59, 0x54, 0xe3, 0x22, 0x4e, 0x02, 0x6c, 0x0e, 0x39, 0x73, 0xca, 0x20, 0xb8, 0x14, 0xc3, 0xde, 0xc8, 0x48, 0x44, 0x4b, 0xf0, 0xc2, 0x3d, 0x69, 0xbc, 0x31, 0xb2, 0xfb, 0x6d, 0x23, 0x10, 0x8f, 0xef, 0x23, 0xbd, 0xbc, 0x0b, 0x25, 0xf2, 0xa9, 0xde, 0x25, 0xcd, 0xce ],
+const [ 0x22, 0x98, 0x09, 0x6d, 0x8a, 0x02, 0x22, 0x5d, 0x4a, 0x5a, 0x91, 0xe9, 0x5b, 0x43, 0xbe, 0xe7, 0x0f, 0x5a, 0x23, 0xf9, 0x52, 0x69, 0xb1, 0x60, 0x2f, 0xde, 0x6f, 0x11, 0x96, 0x7b, 0x65, 0x0b, 0x5c, 0x4e, 0xb8, 0xe7, 0x83, 0xe4, 0x16, 0xb1, 0xbc, 0xba, 0x54, 0xf6, 0x2a, 0xf4, 0x56, 0x1e, 0x69, 0x51, 0x30, 0xfc, 0xcf, 0x5f, 0x8a, 0xa4, 0xf1, 0xeb, 0x49, 0x7d, 0x69, 0xbc, 0x6c, 0x97, 0xd7, 0x81, 0x33, 0x3e, 0x26, 0x07, 0x87, 0xcf, 0x11, 0xaf, 0x96, 0xca, 0xe5, 0x20, 0xbe, 0x29, 0x88, 0x39, 0xac, 0xf0, 0xba, 0x49, 0xc5, 0x06, 0x9b, 0x83, 0xc4, 0x43, 0x6d, 0xac, 0xa5, 0xca, 0x9c, 0x17, 0xc3, 0x99, 0xfb, 0xd3, 0x3d, 0x5e, 0x51, 0x23, 0x9d, 0x8c, 0x14, 0x2e, 0xbc, 0xaf, 0x74, 0xf8, 0xe0, 0xfd, 0x9c, 0x91, 0x28, 0x2d, 0x34, 0x8d, 0x2a, 0x8c, 0x2a, 0xb3, 0xda, 0x4d, 0xb2, 0xfa, 0xae, 0x20, 0x8b, 0xb1, 0xff, 0x07, 0x84, 0xfd, 0xb3, 0x65, 0x40, 0x88, 0x19, 0x58, 0x36, 0x78, 0x14, 0x49, 0xfb, 0x9e, 0x7c, 0xc2, 0xc4, 0xf0, 0xc1, 0x7f, 0x27, 0x3a, 0xd1, 0xc7, 0x21, 0x10, 0x3c, 0xfd, 0x5d, 0x07, 0x96, 0x72, 0xb3, 0x25, 0x1e, 0x7d, 0xf0, 0x95, 0x9c, 0xce, 0xd5, 0x9f, 0x90, 0xff, 0x62, 0xd8, 0x88, 0x6c, 0x54, 0x96, 0xd2, 0x45, 0xec, 0xa7, 0x53, 0xe1, 0xf2, 0x43, 0xb7, 0x55, 0xfa, 0x3e, 0xcb, 0x46, 0xe6, 0x82, 0x26, 0xfb, 0xac, 0xbd, 0x0f, 0xb6, 0x59, 0x57, 0x9b, 0x45, 0x56, 0xa7, 0x16, 0xd4, 0xea, 0x66, 0xa4, 0x05, 0x01, 0x64, 0x28, 0x43, 0x2c, 0x79, 0x65, 0x53, 0xe8, 0xbf, 0x64, 0x2b, 0x23, 0xfe, 0x15, 0x08, 0xfc, 0x68, 0x38, 0xbb, 0xcb, 0x87, 0x7e, 0x43, 0x61, 0x73, 0xec, 0xa1, 0x91, 0x48, 0x81, 0xe8, 0xef, 0xd7, 0x18, 0x94, 0xd7, 0x9c, 0x90, 0x1c, 0xb1, 0xf1, 0x29, 0xcb, 0x74, 0x80, 0x31, 0xcb, 0x69, 0xfe, 0xe1, 0x83, 0x32, 0x17, 0x82, 0x23, 0x0a, 0xa4, 0xd3, 0x7c, 0x4e, 0x24, 0xaf, 0x16, 0x3d, 0x6a, 0xeb, 0x7c, 0xfc, 0x93, 0x7e, 0xdb, 0xdc, 0x3b, 0xe4, 0xcb, 0xe0, 0xf1, 0xc4, 0x6d, 0x7a, 0xe7, 0xd0, 0xb6, 0x96, 0xee, 0xec, 0x0a, 0xd9, 0xa2, 0x93, 0x0d, 0x2b, 0xe2, 0x77, 0xb6, 0x73, 0x84, 0x68, 0xa5, 0xa1, 0x46, 0x77, 0xb6, 0xf2, 0x07, 0x5b, 0xd6, 0x6f, 0x37, 0x14, 0x15, 0xb8, 0x8c, 0xce, 0xfd, 0xff, 0xf6, 0x07, 0x22, 0x57, 0xd6, 0xf4, 0xfb, 0x2f, 0x6b, 0x21, 0xf0, 0x19, 0x8c, 0x59, 0xb4, 0xd1, 0x9d, 0xc5, 0xd5, 0x7a, 0xbc, 0x57, 0x92, 0x2a, 0x3b, 0x6a, 0xec, 0xa9, 0x53, 0xa2, 0x00, 0x76, 0x16, 0x1a, 0x93, 0x0b, 0xa6, 0xbe, 0xef, 0x62, 0xa5, 0xf5, 0xee, 0xb8, 0xec, 0x84, 0x54, 0x91, 0x80, 0xaf, 0x61, 0xfc, 0xc1, 0xa0, 0xa7, 0x18, 0xe5, 0x0d, 0x1a, 0xd7, 0xa5, 0x16, 0x66, 0x02, 0x36, 0x6c, 0x85, 0x7e, 0x7b, 0xb8, 0x90, 0xcd, 0x79, 0x3b, 0xd5, 0xd7, 0x0b, 0xb1, 0x2b, 0xeb, 0xd7, 0x7c, 0x82, 0x01, 0x80, 0xfe, 0xbe, 0x42, 0x1e, 0x47, 0xc6, 0xca, 0xeb, 0xf0, 0xd7, 0xac, 0x3e, 0x46, 0x1f, 0x36, 0xbe, 0xac, 0x87, 0x77, 0xcf, 0x3a, 0xd0, 0xff, 0x51, 0xaa, 0xe1, 0xe6, 0x8a, 0x75, 0x5f, 0x10, 0x60, 0x39, 0x7f, 0xae, 0xcc, 0x5e, 0x18, 0x08, 0x8b, 0xf9, 0xfd, 0x7b, 0x17, 0xf0, 0x89, 0xbd, 0xd5, 0x60, 0x7b, 0x69, 0x90, 0x3b, 0x04, 0xb7, 0x26, 0x36, 0x1f, 0x8a, 0x81, 0xe2, 0x21, 0xb1, 0xc9, 0x18, 0x91, 0x66, 0xd8, 0x9b, 0x39, 0x1b, 0xef, 0xf9, 0x7d, 0x77, 0xa7, 0xb2, 0xec, 0x9b, 0x2a, 0x9c, 0x15, 0xa9, 0xa2, 0x86, 0x9c, 0x87, 0xf2, 0x1c, 0x8d, 0xe0, 0xa5, 0x0b, 0xef, 0x6c, 0x23, 0x65, 0x9d, 0x72, 0x2b, 0x46, 0x51, 0x8b, 0x7d, 0xb8, 0x02, 0xa8, 0xd7, 0xd4, 0x70, 0x56, 0x23, 0x2a, 0xfd, 0x41, 0xef, 0x63, 0xbe, 0xf7, 0x1d, 0x25, 0xd2, 0xef, 0xdc, 0x37, 0xf2, 0xca, 0xd7, 0xe6, 0x4a, 0xd8, 0xac, 0xa7, 0x87, 0xde, 0x9f, 0xfd, 0x32, 0x17, 0x90, 0x9d, 0x3c, 0x78, 0x2a, 0xd1, 0xda, 0x38, 0x5e, 0x1a, 0x93, 0x90, 0x0f, 0x19, 0x96, 0xc0, 0x0f, 0xaf, 0x52, 0x52, 0x4b, 0x64, 0x41, 0xa2, 0x42, 0x05, 0x04, 0x9e, 0xbc, 0x91, 0xb5, 0xcb, 0xb8, 0x57, 0x79, 0x89, 0xa6, 0x58, 0x54, 0x97, 0xd6, 0xf2, 0x42, 0xd9, 0x31, 0xc0, 0x83, 0x59, 0x27, 0xbc, 0x36, 0x8d, 0xe8, 0xa6, 0x29, 0xd8, 0xd7, 0xaa, 0xf0, 0x52, 0x3b, 0x3d, 0x34, 0xcc, 0x38, 0x48, 0x4e, 0x0f, 0xff, 0x88, 0x14, 0x65, 0x41, 0x34, 0xf3, 0x5b, 0xe9, 0xe1, 0x3f, 0xc4, 0x0a, 0xa4, 0xc6, 0x01, 0x16, 0x76, 0xab, 0x80, 0x52, 0xdc, 0x72, 0x83, 0x86, 0xc7, 0x57, 0x23, 0xf9, 0xb8, 0xe4, 0x94, 0x9c, 0x29, 0xc2, 0xaa, 0x86, 0x29, 0xd0, 0x9c, 0xa0, 0x46, 0x72, 0x09, 0xa2, 0xaf, 0x2c, 0x38, 0x3e, 0x9a, 0x6f, 0xa4, 0x9a, 0xe4, 0xb2, 0xb8, 0x04, 0xf7, 0xc5, 0xd7, 0xe2, 0xf1, 0x62, 0x9f, 0xe7, 0x03, 0x06, 0x6f, 0x8d, 0x16, 0xfe, 0x26, 0xbf, 0xb5, 0xc5, 0x2e, 0xd5, 0x27, 0x8d, 0xba, 0xc6, 0xdb, 0x1c, 0x4b, 0x99, 0x0a, 0xd9, 0x79, 0x1d, 0x97, 0x27, 0xf0, 0xda, 0x3a, 0xf1, 0xb9, 0x47, 0xdd, 0x86, 0xbb, 0x3e, 0x46, 0xa8, 0x81, 0xac, 0xf7, 0xdf, 0x3d, 0x8d, 0x52, 0x14, 0x0d, 0x18, 0x01, 0x5a, 0x7e, 0x36, 0x95, 0x0f, 0x4f, 0x39, 0x6d, 0x24, 0x77, 0xcb, 0xda, 0xb9, 0x68, 0x24, 0x80, 0xed, 0x96, 0x81, 0x00, 0xf4, 0x33, 0xd1, 0xd4, 0x6a, 0x3d, 0xb1, 0x7a, 0xe6, 0xbb, 0x9a, 0xd4, 0xd3, 0x44, 0x59, 0xcf, 0x7b, 0xc0, 0xc0, 0x43, 0x65, 0x73, 0x9c, 0x1a, 0xe1, 0x37, 0xe7, 0xb5, 0xe1, 0x08, 0x3e, 0x8b, 0x0a, 0xc6, 0x95, 0x13, 0x0b, 0x37, 0x29, 0xe5, 0x2e, 0x4c, 0xb6, 0x1c, 0x2c, 0xa5, 0xea, 0xfe, 0x46, 0x56, 0x1a, 0xdf, 0x91, 0xec, 0x35, 0x42, 0x92, 0xab, 0xf6, 0x42, 0x0a, 0x1a, 0x5d, 0x30, 0x13, 0xc2, 0x5f, 0x7e, 0x6c, 0x32, 0xdd, 0xdb, 0x12, 0x46, 0xd3, 0xa0, 0x10, 0xa9, 0xd2, 0x6b, 0x97, 0x99, 0xb0, 0x09, 0x51, 0xea, 0x7e, 0x9a, 0xf3, 0x4e, 0xba, 0xef, 0x12, 0xd3, 0xc6, 0x37, 0x37, 0xad, 0x99, 0xdb, 0x35, 0x36, 0xb5, 0xa6, 0xba, 0x33, 0x58, 0x29, 0x25, 0x59, 0xf7, 0x5e, 0x97, 0x10, 0xe8, 0x8b, 0x4d, 0x76, 0x5f, 0x69, 0x2d, 0xa7, 0x9b, 0x86, 0x9e, 0x3c, 0x61, 0xe8, 0x9d, 0x11, 0xaa, 0xf3, 0x0e, 0x4c, 0x99, 0x8d, 0x4f, 0x9a, 0xaf, 0x7f, 0x13, 0xbc, 0x42, 0x1e, 0x6e, 0x43, 0x2b, 0x2c, 0x2c, 0x97, 0xc0, 0xf9, 0x67, 0x3e, 0x02, 0xcd, 0x59, 0x5b, 0x17, 0x8a, 0x6e, 0x75, 0xfa, 0x8e, 0x9d, 0x7a, 0x71, 0xd7, 0xf9, 0x04, 0x3f, 0x6a, 0x83, 0xda, 0x9b, 0xf5, 0x43, 0xba, 0xe2, 0xb3, 0x97, 0x56, 0x89, 0x90, 0xca, 0x9c, 0x55, 0x8e, 0xe8, 0x3a, 0xce, 0x67 ],
+const [ 0xfa, 0x15, 0xcc, 0x7f, 0x0d, 0xe2, 0x94, 0xd7, 0x34, 0x1b, 0x1f, 0xd7, 0x93, 0x26, 0xc8, 0xbe, 0x78, 0xe6, 0x78, 0x22, 0x34, 0x3c, 0x19, 0x92, 0x2a, 0xce, 0x4e, 0x79, 0x25, 0x07, 0x61, 0x45, 0xef, 0x5f, 0x7d, 0xc9, 0x1f, 0xdc, 0x1d, 0xe0, 0x32, 0xd8, 0xc4, 0x54, 0xdd, 0x06, 0xef, 0xfe, 0xa2, 0xb0, 0x47, 0x2e, 0xa2, 0x42, 0x1c, 0x4d, 0xb2, 0x0c, 0x0f, 0xc0, 0xb0, 0x44, 0x0e, 0x10, 0x18, 0x4a, 0x86, 0x48, 0xd2, 0x30, 0xd3, 0x9f, 0x4e, 0x7a, 0xfc, 0x57, 0xd3, 0x22, 0x9d, 0xe5, 0x14, 0xe0, 0x24, 0x52, 0x05, 0xa8, 0x40, 0xe1, 0xec, 0x73, 0x97, 0xf2, 0xbb, 0x42, 0xb8, 0x26, 0x9d, 0x60, 0x50, 0xc4, 0xcf, 0xe8, 0xa0, 0x5c, 0xb1, 0x88, 0x2e, 0xaa, 0x1d, 0x84, 0xbb, 0xbc, 0xf7, 0xfe, 0x76, 0x57, 0x05, 0x74, 0x6f, 0x98, 0x01, 0x8a, 0x4e, 0xd7, 0xed, 0x0a, 0x45, 0xd0, 0xa7, 0x29, 0x43, 0x05, 0xbd, 0x0c, 0x6b, 0x5e, 0x82, 0x8a, 0xc4, 0x13, 0x62, 0x34, 0x32, 0xcb, 0x72, 0x92, 0xa5, 0x06, 0x4b, 0xb0, 0x90, 0xb8, 0x19, 0xd9, 0x9d, 0x36, 0xef, 0xa3, 0x9f, 0x56, 0x5e, 0x2c, 0xc7, 0xd2, 0x45, 0xa2, 0x1c, 0xee, 0xea, 0x09, 0x25, 0x5b, 0x4a, 0x38, 0xe8, 0x5a, 0xae, 0x25, 0x19, 0x25, 0x7f, 0x63, 0x8b, 0x8a, 0x5b, 0xe9, 0xea, 0xd9, 0x68, 0x15, 0xac, 0x00, 0xe9, 0xf1, 0x45, 0xf5, 0x0f, 0xb4, 0x9a, 0x54, 0x11, 0x8c, 0xb9, 0x4a, 0x7f, 0x9a, 0xc7, 0xb1, 0xd3, 0x3e, 0x39, 0x7c, 0x49, 0x96, 0x48, 0x56, 0xf0, 0x41, 0x9e, 0x86, 0x01, 0x69, 0x56, 0x16, 0x70, 0x00, 0x23, 0x34, 0xc2, 0x49, 0xcf, 0xd8, 0x1e, 0x9b, 0xe8, 0xa7, 0xa6, 0x62, 0xb6, 0x18, 0x08, 0x66, 0x6f, 0xd5, 0x4f, 0x50, 0xae, 0x64, 0x00, 0x6a, 0x22, 0x06, 0x62, 0xa6, 0x83, 0xdf, 0x1d, 0xe2, 0xcb, 0x58, 0x06, 0x6a, 0xa2, 0xc2, 0x3a, 0xbe, 0x1a, 0x3c, 0x6a, 0x96, 0x9c, 0xd6, 0x75, 0x24, 0x23, 0xf6, 0x3c, 0x99, 0xa7, 0xfb, 0xb2, 0xea, 0xdd, 0x21, 0x32, 0xd4, 0x1d, 0xa4, 0x16, 0x1e, 0xa3, 0x29, 0x85, 0x1e, 0xfb, 0x59, 0x8c, 0x7e, 0xb7, 0xcf, 0x70, 0x40, 0x63, 0x34, 0x43, 0x00, 0xbb, 0xa8, 0xb6, 0x79, 0x1b, 0x64, 0x2e, 0x4b, 0x36, 0x9e, 0x1a, 0xfc, 0x0b, 0xad, 0x83, 0x3c, 0x15, 0x6e, 0xe4, 0x6d, 0xc2, 0xe6, 0x3d, 0x62, 0x27, 0x29, 0x63, 0x67, 0xf2, 0x7a, 0x9a, 0x82, 0xa0, 0xb3, 0x65, 0xf9, 0xf0, 0xe8, 0x9d, 0x14, 0x97, 0x47, 0xc1, 0x24, 0x35, 0x42, 0x8d, 0xc4, 0x88, 0xf1, 0xce, 0x5f, 0xdf, 0xb1, 0x74, 0xf3, 0xd2, 0x12, 0xe9, 0x14, 0x31, 0xf0, 0xa1, 0x33, 0x3a, 0xdf, 0xf3, 0x20, 0x0f, 0xcd, 0x27, 0xce, 0x67, 0xe2, 0xd0, 0x57, 0x83, 0xab, 0x5c, 0x3f, 0x64, 0x78, 0xe9, 0xfd, 0x3b, 0x02, 0x5a, 0xb7, 0x21, 0x51, 0xaa, 0x4e, 0x08, 0xdd, 0x81, 0x9a, 0xf1, 0xf4, 0x05, 0xf7, 0x60, 0x5b, 0xf3, 0x00, 0x0d, 0x38, 0xee, 0x9a, 0xdd, 0x2f, 0x17, 0x35, 0x10, 0xcc, 0xdd, 0x4e, 0xbc, 0x21, 0x17, 0x38, 0x7a, 0xb0, 0x50, 0x1d, 0x5f, 0x8b, 0x61, 0x40, 0x2e, 0xb9, 0x46, 0x84, 0xcb, 0xdc, 0x2a, 0x32, 0xf3, 0x11, 0xc4, 0xf7, 0x2b, 0x18, 0xe6, 0x2c, 0xf6, 0xb5, 0x53, 0x5a, 0x4b, 0x55, 0xd2, 0xfe, 0x46, 0xf5, 0x80, 0x89, 0x1e, 0x40, 0x6a, 0xab, 0x57, 0xf7, 0x5b, 0xd1, 0x39, 0x96, 0xf3, 0xed, 0x80, 0x35, 0xf9, 0x75, 0x55, 0xac, 0xf2, 0xae, 0x7d, 0xfa, 0xf3, 0x2a, 0xd1, 0xe8, 0xb3, 0x8f, 0xee, 0xe9, 0xe4, 0x9b, 0x2d, 0x45, 0xc4, 0x65, 0xd6, 0x76, 0xef, 0xe6, 0x90, 0xd2, 0x77, 0xb7, 0x1c, 0x6b, 0x36, 0x1c, 0x43, 0x34, 0x63, 0x42, 0x0d, 0x65, 0x64, 0xc5, 0x34, 0x20, 0xe3, 0x75, 0xd8, 0x54, 0x24, 0x5a, 0x74, 0xe2, 0x96, 0xf6, 0x11, 0xfe, 0xa8, 0xc9, 0xba, 0xd8, 0xdd, 0x1b, 0x2f, 0x7c, 0x23, 0xf5, 0xde, 0xf7, 0x61, 0x71, 0x0e, 0xbc, 0x4f, 0x33, 0x5e, 0x46, 0x8a, 0x38, 0x6e, 0xfe, 0xe8, 0xcf, 0xdc, 0x5e, 0x08, 0xe4, 0x72, 0x57, 0x2e, 0x84, 0x9d, 0xf0, 0x4e, 0x9e, 0x21, 0x31, 0x67, 0x07, 0x0c, 0x3f, 0x13, 0xc1, 0xe8, 0xc8, 0x5b, 0x7d, 0x35, 0xa1, 0xcf, 0x5e, 0x17, 0xae, 0xd7, 0x00, 0x4b, 0x03, 0x44, 0xb9, 0x5f, 0x48, 0x2a, 0x1f, 0x23, 0x62, 0xf2, 0xca, 0x5b, 0x50, 0xab, 0x5b, 0xb6, 0x52, 0xa1, 0xbc, 0x04, 0x51, 0x31, 0xaa, 0xa3, 0x7b, 0xdb, 0x71, 0x3a, 0x2e, 0x99, 0xf7, 0xaa, 0x17, 0x6f, 0xfc, 0x42, 0x9b, 0x44, 0xa0, 0x33, 0x75, 0xf0, 0x26, 0x43, 0xa1, 0x96, 0xf7, 0xc5, 0x79, 0x34, 0xea, 0xc8, 0x1f, 0x78, 0xc2, 0x8f, 0x1a, 0xd6, 0xf9, 0x41, 0x44, 0xd7, 0xbc, 0xe2, 0xe3, 0xb4, 0x36, 0x82, 0x16, 0x23, 0x11, 0xb4, 0x73, 0x71, 0x3a, 0x42, 0xee, 0xd1, 0xe5, 0x1f, 0xfc, 0xf4, 0xd2, 0x9d, 0xf9, 0xd9, 0xce, 0xe0, 0xc7, 0xe7, 0x7c, 0x93, 0xb9, 0x39, 0x55, 0xd9, 0xaf, 0x39, 0xee, 0x87, 0x82, 0x70, 0x79, 0x90, 0xa2, 0x9c, 0x8f, 0xc1, 0xfd, 0x03, 0x2d, 0xae, 0x23, 0x08, 0xfc, 0xec, 0xa8, 0xfc, 0xd5, 0x80, 0xca, 0x36, 0x84, 0x98, 0x54, 0x66, 0xcc, 0x79, 0xc3, 0x26, 0xac, 0xb9, 0xa6, 0xd2, 0xe1, 0xae, 0x4b, 0x9a, 0xac, 0x26, 0x97, 0xd5, 0xd5, 0x58, 0x36, 0x98, 0xf0, 0x1b, 0xf5, 0x88, 0xdf, 0x56, 0x6b, 0xec, 0x98, 0xb8, 0xdf, 0x07, 0x29, 0xa9, 0x66, 0xa4, 0xf9, 0x80, 0x4c, 0xf2, 0x50, 0xf6, 0xb5, 0x92, 0x19, 0xda, 0x84, 0xef, 0xe7, 0x07, 0x7c, 0xce, 0x37, 0x94, 0xa5, 0x26, 0xf5, 0x4a, 0xf2, 0x31, 0x41, 0x5b, 0x20, 0xc3, 0x72, 0x50, 0xe1, 0xdb, 0x5b, 0x44, 0x3a, 0x77, 0xce, 0x50, 0x2a, 0xad, 0x5f, 0x46, 0x8c, 0xf8, 0x6a, 0xa2, 0x3e, 0xd0, 0x58, 0xbd, 0x83, 0x7d, 0x1d, 0x44, 0xa6, 0x2c, 0x05, 0xe9, 0xe1, 0x43, 0xb1, 0x58, 0x7c, 0xf2, 0x5c, 0x6d, 0x39, 0x0a, 0x64, 0xa4, 0xf0, 0x13, 0x05, 0xd1, 0x77, 0x99, 0x67, 0x11, 0xc4, 0xc6, 0xdb, 0x00, 0x56, 0x36, 0x61, 0x2c, 0xd1, 0x06, 0x6f, 0xca, 0xe8, 0x2e, 0xed, 0xa8, 0x7f, 0x11, 0x84, 0x63, 0x11, 0x53, 0x18, 0xda, 0x50, 0xeb, 0x93, 0xe2, 0x0c, 0x79, 0xe5, 0x3c, 0x56, 0xd9, 0x49, 0xc4, 0xe5, 0xf8, 0xc9, 0xea, 0xb9, 0xe6, 0x04, 0x66, 0xfd, 0x2d, 0x2f, 0x28, 0x32, 0x62, 0x5a, 0x8e, 0x8a, 0xf9, 0xf4, 0xda, 0x92, 0x5d, 0x92, 0xe3, 0x14, 0x41, 0xec, 0x0b, 0x3c, 0x30, 0x28, 0x70, 0xf9, 0x6c, 0x5c, 0x67, 0xa6, 0xf5, 0x4e, 0x26, 0xea, 0xe8, 0x7e, 0xc0, 0xdd, 0x0a, 0x66, 0x57, 0x6c, 0xa5, 0x00, 0x8c, 0xfe, 0x93, 0x89, 0x3b, 0x58, 0x98, 0x85, 0x66, 0xbd, 0xf5, 0x03, 0x6e, 0x5a, 0x39, 0x22, 0x89, 0xe2, 0x5b, 0xd4, 0x70, 0x76, 0x06, 0xe2, 0x58, 0xc7, 0x34, 0x30, 0x24, 0x7e, 0xfe, 0x43, 0xd9, 0xdc, 0xb2, 0x00, 0x52, 0x9d, 0x27, 0xb6, 0x35, 0x23, 0x4d, 0x5f, 0x25, 0xd0, 0x08, 0x23, 0x39, 0xb4, 0x3f, 0x1e, 0xad, 0x68, 0x30, 0x63, 0xd8, 0x39, 0x06, 0x41, 0x5e, 0x89, 0xad, 0xc5, 0xa7, 0x73, 0xe5, 0x7f, 0x90, 0xae, 0x95, 0x89, 0x60, 0xb4, 0x62, 0xc6, 0xfd, 0x23, 0x81, 0x68, 0x60, 0x63, 0xc9, 0xb5, 0x46, 0x89, 0x0d, 0x0a, 0x28, 0x7b, 0xa8, 0x20, 0x6e, 0x55, 0x59, 0x8e, 0xe0, 0x0c, 0x52, 0x8f, 0x5d, 0x52, 0x8b, 0x06, 0xcf, 0xb9, 0x5c, 0xbf, 0x5e, 0x1a, 0x4b, 0xf8, 0xe4, 0x38, 0x23, 0x20, 0xa1, 0xa1, 0x46, 0xde, 0x31, 0xd5, 0x43, 0x55, 0xba, 0xaa, 0xab, 0xa7, 0x6a, 0xef, 0x21, 0xb7, 0x21, 0x50, 0xb1, 0x34 ],
+const [ 0xb7, 0x18, 0xc9, 0x68, 0xe8, 0xff, 0xe4, 0xea, 0x28, 0x2f, 0xc3, 0x3f, 0x96, 0xda, 0x23, 0x3b, 0x8a, 0x8a, 0xb6, 0xdd, 0xd5, 0x57, 0x81, 0x24, 0x4a, 0x5d, 0x82, 0x23, 0x7d, 0x6d, 0x97, 0x58, 0xca, 0x03, 0x9b, 0x3a, 0x99, 0x78, 0xd2, 0x11, 0xe1, 0x79, 0x87, 0x0a, 0xeb, 0xb8, 0xf3, 0x8b, 0x59, 0xe1, 0x61, 0xc4, 0x66, 0xd0, 0x90, 0x87, 0x6f, 0x01, 0x59, 0x59, 0xb3, 0x48, 0x91, 0xc9, 0x57, 0xc2, 0x31, 0x00, 0xad, 0x0b, 0xb4, 0x9a, 0xb5, 0xb1, 0xc1, 0xb4, 0xe4, 0xe9, 0x0a, 0x46, 0x25, 0x81, 0x74, 0xb4, 0x1e, 0x16, 0x78, 0x9f, 0xb4, 0x87, 0xc9, 0x01, 0xd1, 0xa9, 0x37, 0x79, 0x64, 0x3d, 0xd3, 0xe3, 0xaa, 0x1f, 0x54, 0x2c, 0xad, 0xc0, 0xb9, 0x64, 0x0a, 0xd5, 0x30, 0x15, 0xf6, 0x51, 0x37, 0xd4, 0x83, 0x91, 0x01, 0x15, 0x20, 0xd7, 0x1b, 0x44, 0x5f, 0xfa, 0x4f, 0x11, 0xfc, 0x5c, 0xc9, 0x0b, 0x1a, 0x1b, 0x78, 0x70, 0xcf, 0x8c, 0xb7, 0x43, 0xe3, 0xe5, 0x2d, 0xa0, 0xd5, 0x39, 0xf1, 0x4d, 0x1f, 0xaa, 0xf2, 0x91, 0xbb, 0xda, 0x97, 0x49, 0xe6, 0xa2, 0xa2, 0x38, 0x24, 0x07, 0x5a, 0x9f, 0x84, 0x69, 0xe9, 0x0d, 0x25, 0xfe, 0x03, 0x79, 0xf9, 0x7f, 0xc8, 0x8e, 0xc9, 0x21, 0xec, 0x46, 0x7a, 0xc7, 0x15, 0xba, 0x8e, 0x76, 0x84, 0x39, 0xee, 0x09, 0xf8, 0x97, 0xe6, 0x26, 0xcf, 0xc7, 0x71, 0x70, 0x6f, 0xac, 0xb7, 0xfe, 0xe4, 0x2d, 0xd4, 0x0d, 0xca, 0x88, 0xdb, 0xf1, 0x6e, 0xe8, 0x1a, 0x52, 0x30, 0x39, 0xa0, 0x94, 0x2c, 0x3b, 0xfd, 0x97, 0x19, 0xd5, 0x49, 0xa1, 0x70, 0xad, 0x68, 0x98, 0xd1, 0xf5, 0x8b, 0x75, 0xa4, 0x88, 0xfa, 0xf5, 0xfc, 0x35, 0x12, 0x91, 0xc0, 0x5a, 0x89, 0xb1, 0x0c, 0xb5, 0xfa, 0x1d, 0xd5, 0x78, 0x9d, 0xb4, 0xcc, 0x9b, 0x55, 0x60, 0x85, 0x76, 0xf1, 0x49, 0xd9, 0x8f, 0xab, 0x49, 0x89, 0xb1, 0xf5, 0xa1, 0x23, 0x3e, 0x76, 0xea, 0x2a, 0xc5, 0x4f, 0x4e, 0x71, 0xd7, 0xa2, 0xf7, 0xc8, 0x17, 0x55, 0xc8, 0xda, 0x91, 0x13, 0x4b, 0x56, 0x4d, 0x94, 0xeb, 0x4d, 0x23, 0x1f, 0x64, 0xdc, 0xd0, 0x4d, 0x77, 0x0a, 0x4a, 0x0f, 0xe2, 0xf3, 0x51, 0xf2, 0x8f, 0x27, 0x47, 0xa2, 0x0c, 0x4d, 0x41, 0xad, 0x3b, 0x0c, 0x5e, 0x8a, 0x4b, 0x2b, 0x58, 0xda, 0xe6, 0xf6, 0x58, 0xed, 0xac, 0xe4, 0x0f, 0x88, 0xe1, 0x78, 0x02, 0xe6, 0x62, 0x65, 0x25, 0xfc, 0xde, 0xf5, 0xac, 0x02, 0x42, 0xab, 0x1e, 0x2e, 0x75, 0x28, 0xab, 0xc3, 0x46, 0x4b, 0xbf, 0x4a, 0xa3, 0x9c, 0xd7, 0x1f, 0x0b, 0xeb, 0x94, 0x30, 0x45, 0x34, 0x0d, 0x02, 0x53, 0xc6, 0x6a, 0xf5, 0xa2, 0xa4, 0xaf, 0xc8, 0x83, 0x2c, 0xd5, 0x5f, 0xdf, 0xf6, 0x1f, 0xc4, 0x25, 0xff, 0xab, 0x6d, 0x88, 0x07, 0x48, 0xbd, 0x68, 0x37, 0x87, 0xcc, 0x0d, 0x07, 0x15, 0x6b, 0x9b, 0x5f, 0x47, 0x63, 0x42, 0xfc, 0xf7, 0xfe, 0xb6, 0x16, 0x8f, 0xc9, 0xdf, 0x40, 0x63, 0x97, 0xd1, 0x8f, 0x44, 0xc9, 0xfe, 0xfe, 0x51, 0xcd, 0xaa, 0x11, 0x11, 0xe5, 0xa0, 0xb9, 0xbf, 0x2a, 0x24, 0x78, 0xe5, 0xd0, 0x28, 0xc5, 0x2d, 0xab, 0xc3, 0xb2, 0x73, 0xf2, 0xde, 0xcc, 0x1e, 0x44, 0x31, 0x43, 0xb1, 0xe8, 0x6e, 0x4b, 0x9d, 0x59, 0xbb, 0xc1, 0x5a, 0x02, 0x66, 0x12, 0xb5, 0x46, 0xd4, 0x59, 0x6c, 0xc3, 0xbb, 0xc7, 0xf8, 0xd8, 0x91, 0x48, 0xaa, 0x64, 0x45, 0x63, 0xf9, 0xd1, 0x2c, 0x62, 0x1b, 0x52, 0x3e, 0xb4, 0xd2, 0x68, 0x82, 0x8f, 0x89, 0xab, 0xc7, 0xda, 0x9f, 0xc7, 0x95, 0x49, 0x03, 0xc5, 0x63, 0xca, 0x01, 0x8c, 0x0a, 0x20, 0x5b, 0xa7, 0x7a, 0xcd, 0x9c, 0x48, 0xac, 0x36, 0xa9, 0x8d, 0xd8, 0x02, 0x99, 0x03, 0xe7, 0xc3, 0xc6, 0x69, 0x2b, 0xd8, 0x24, 0xb6, 0x4e, 0x92, 0xd2, 0x5d, 0x88, 0x95, 0xef, 0xcf, 0x15, 0x81, 0xaf, 0x41, 0xe7, 0xd2, 0xae, 0xb0, 0x98, 0x05, 0x84, 0x23, 0xa2, 0xfd, 0x99, 0x31, 0xd2, 0xa4, 0x3b, 0xc2, 0xfa, 0xd5, 0xed, 0x1a, 0xe7, 0x7a, 0x02, 0x13, 0x92, 0xf1, 0x6b, 0xa9, 0x9a, 0xb5, 0xce, 0xbc, 0xf2, 0x3a, 0xd8, 0x12, 0xd7, 0x18, 0xd3, 0x9c, 0x06, 0x6c, 0x7b, 0xfa, 0x2b, 0x7b, 0x0d, 0x40, 0x9c, 0x99, 0xa2, 0xfb, 0x47, 0x4a, 0xbb, 0x6f, 0xea, 0xa6, 0x1d, 0x23, 0x82, 0x02, 0xdf, 0xa0, 0x05, 0xcc, 0xc1, 0x75, 0x53, 0xb7, 0xbf, 0x7e, 0x6a, 0x18, 0xe6, 0x66, 0xda, 0x90, 0x67, 0x6b, 0x7a, 0xec, 0xea, 0x61, 0x58, 0x49, 0x24, 0xfa, 0xf6, 0x7c, 0xac, 0x44, 0xb3, 0xb1, 0x0a, 0x73, 0x87, 0x51, 0x11, 0xe1, 0xf3, 0x2a, 0x70, 0x53, 0x38, 0xca, 0x83, 0x7e, 0xc8, 0x2b, 0x6f, 0xca, 0xfa, 0x96, 0x6d, 0x55, 0x01, 0xc1, 0x66, 0x3b, 0x1f, 0x3b, 0xc1, 0x15, 0x16, 0x09, 0x79, 0xbf, 0xe0, 0x92, 0x72, 0x5f, 0x9f, 0xb8, 0x0d, 0xa2, 0xd7, 0x48, 0xfa, 0x49, 0xdb, 0x94, 0x4d, 0xe5, 0x85, 0x5e, 0xd4, 0xde, 0x2a, 0xf8, 0xa8, 0xba, 0xcd, 0xaa, 0x03, 0x9c, 0x93, 0x54, 0x51, 0x0b, 0x77, 0x54, 0x8a, 0xf5, 0x3f, 0xaa, 0xbe, 0xf4, 0xaf, 0x5a, 0xf2, 0xcf, 0xfc, 0x12, 0x2a, 0x44, 0x84, 0x0d, 0xc7, 0x05, 0xbb, 0x37, 0x13, 0x00, 0x69, 0x92, 0x1b, 0xe3, 0x13, 0xd8, 0xbd, 0xe0, 0xb6, 0x62, 0x01, 0xae, 0xbc, 0x48, 0xad, 0xd0, 0x28, 0xca, 0x13, 0x19, 0x14, 0xef, 0x2e, 0x70, 0x5d, 0x6b, 0xed, 0xd1, 0x9d, 0xc6, 0xcf, 0x94, 0x59, 0xbb, 0xb0, 0xf2, 0x7c, 0xdf, 0xe3, 0xc5, 0x04, 0x83, 0x80, 0x8f, 0xfc, 0xda, 0xff, 0xbe, 0xaa, 0x5f, 0x06, 0x2e, 0x09, 0x71, 0x80, 0xf0, 0x7a, 0x40, 0xef, 0x4a, 0xb6, 0xed, 0x03, 0xfe, 0x07, 0xed, 0x6b, 0xcf, 0xb8, 0xaf, 0xeb, 0x42, 0xc9, 0x7e, 0xaf, 0xa2, 0xe8, 0xa8, 0xdf, 0x46, 0x9d, 0xe0, 0x73, 0x17, 0xc5, 0xe1, 0x49, 0x4c, 0x41, 0x54, 0x74, 0x78, 0xef, 0xf4, 0xd8, 0xc7, 0xd9, 0xf0, 0xf4, 0x84, 0xad, 0x90, 0xfe, 0xdf, 0x6e, 0x1c, 0x35, 0xee, 0x68, 0xfa, 0x73, 0xf1, 0x69, 0x16, 0x01, 0xda, 0x2e, 0x87, 0xb0, 0x0d, 0x1c, 0x6f, 0x25, 0x64, 0x31, 0x22, 0x75, 0x76, 0x39, 0x8b, 0xf2, 0x19, 0x45, 0xcc, 0x44, 0x25, 0x59, 0x25, 0xbb, 0x7b, 0x65, 0x17, 0xe3, 0x46, 0x76, 0xc9, 0x59, 0x81, 0x2e, 0xaa, 0xde, 0xba, 0x72, 0x58, 0xaa, 0x15, 0x62, 0xc1, 0x02, 0x93, 0x8e, 0x88, 0x0d, 0x94, 0x66, 0xaa, 0xe4, 0x9b, 0xf3, 0x61, 0xe8, 0x52, 0xc5, 0x48, 0x58, 0xce, 0x2d, 0xc0, 0x23, 0x13, 0xac, 0x93, 0xfa, 0xdb, 0xaa, 0xd8, 0xaa, 0x93, 0x6b, 0x17, 0xa9, 0xa7, 0x40, 0xad, 0xee, 0xff, 0xfa, 0x71, 0x06, 0xca, 0xa4, 0x97, 0x65, 0x7a, 0x72, 0xd5, 0xfa, 0x0f, 0xf4, 0xc5, 0x06, 0x99, 0x8f, 0x8b, 0x2d, 0xf8, 0x2e, 0xb7, 0xce, 0xe7, 0x35, 0x6d, 0x90, 0x39, 0xb7, 0xc3, 0x3d, 0x61, 0xe8, 0x6a, 0xd4, 0x38, 0xd5, 0x91, 0xd9, 0xfb, 0x52, 0x06, 0xf0, 0x93, 0x34, 0x9e, 0xaa, 0x1a, 0xc1, 0xd8, 0x9f, 0x9a, 0x65, 0xbd, 0xbd, 0x18, 0xa7, 0x0a, 0xdf, 0xd1, 0x5a, 0x91, 0xa1, 0xc3, 0x18, 0xdd, 0x73, 0x6f, 0xec, 0x15, 0xed, 0xde, 0x4f, 0x22, 0x63, 0xe2, 0x56, 0x14, 0xb8, 0x9e, 0x29, 0xc2, 0x77, 0x48, 0xb7, 0xb1, 0x1f, 0x2e, 0xa8, 0x38, 0xbf, 0xf7, 0x93, 0xe1, 0xc3, 0x2c, 0x72, 0x11, 0x0e, 0xf7, 0x53, 0xec, 0x49, 0x2a, 0x50, 0x73, 0x7a, 0x82, 0xc0, 0xef, 0xd8, 0x2e, 0xaf, 0x93, 0xde, 0x8b, 0x8c, 0x5d, 0x9e, 0x32, 0x22, 0x3d, 0x58, 0x34, 0xca, 0x79, 0x4b, 0xa4, 0xde, 0x50, 0xcb, 0x56, 0x70, 0xde, 0x94, 0xe7, 0x3c, 0x3f, 0x5e, 0xfd, 0xdc, 0xf7, 0xb1, 0xd0, 0x3b, 0x91, 0xfb, 0xea, 0x4c, 0x87, 0xe0, 0x2b, 0xfc, 0x62, 0xd1, 0x0f, 0x65, 0x22, 0xe0, 0x34, 0x44, 0xe0, 0xd2, 0x16, 0xad, 0xb2, 0x76, 0x1d, 0xfd, 0xcf, 0x36, 0xdb, 0x11, 0xf4, 0xec, 0x8e, 0xb5, 0x06, 0xf7, 0xed, 0x5f, 0xf8, 0x8d, 0x21, 0x1e, 0xef, 0x52, 0x11, 0xcd, 0xa4, 0x2a, 0xe2, 0x8c, 0x0a, 0x4c, 0xbe, 0x71, 0x32, 0x99, 0xd5, 0x7a, 0x6b, 0x2b, 0xa2, 0xc6, 0xad, 0x30, 0x70, 0x05, 0x38, 0xf9, 0x1c, 0x2e, 0x78, 0x4e, 0x1c, 0x70, 0x2c, 0x05, 0xc0, 0x6a, 0xc7, 0xd3, 0xb8, 0x9e, 0x16, 0x61, 0xd7, 0x23, 0x24, 0xa2, 0x17 ],
+const [ 0x32, 0x24, 0x5d, 0xf5, 0x14, 0xf6, 0xc2, 0x73, 0xd2, 0x52, 0x27, 0x1a, 0x98, 0x09, 0x29, 0xe5, 0x0a, 0x7c, 0xb0, 0xe7, 0x7b, 0x05, 0xc7, 0xd4, 0x60, 0x92, 0xab, 0xc3, 0x04, 0x93, 0x21, 0x32, 0x7d, 0x17, 0x0d, 0x4b, 0xde, 0x31, 0x41, 0x66, 0xae, 0xa1, 0x93, 0xce, 0x99, 0xb0, 0x32, 0xc8, 0x66, 0x5c, 0x3a, 0xd1, 0x29, 0xb5, 0x85, 0x28, 0xba, 0x87, 0xc5, 0x8c, 0x65, 0x39, 0xcf, 0x47, 0xe3, 0xf5, 0x3a, 0x6b, 0x89, 0x0a, 0x29, 0x5c, 0xc0, 0x8e, 0x65, 0x8e, 0xb5, 0x47, 0xaf, 0x90, 0x52, 0xcc, 0x54, 0x4a, 0x6c, 0xe7, 0x01, 0x83, 0x3e, 0x3e, 0xd9, 0xa6, 0x16, 0x32, 0xc5, 0xc5, 0x4e, 0x08, 0x0b, 0xde, 0x7e, 0x46, 0x23, 0x5d, 0xf0, 0x60, 0xc6, 0xe3, 0x54, 0x94, 0x47, 0x46, 0xb5, 0x13, 0x26, 0xd9, 0xac, 0x61, 0xe3, 0xed, 0xd4, 0xfe, 0x10, 0x97, 0x7d, 0x46, 0xaa, 0xb4, 0xa5, 0x96, 0xa9, 0x2b, 0x24, 0xb0, 0xd6, 0x72, 0x26, 0x61, 0xdd, 0x54, 0xde, 0x61, 0xa3, 0xf1, 0x79, 0x7a, 0xd9, 0x06, 0x51, 0xec, 0xd2, 0x6e, 0x64, 0x11, 0x91, 0xe9, 0x04, 0x3d, 0x27, 0x1d, 0xd0, 0xe8, 0x3c, 0xda, 0xe2, 0x0f, 0xeb, 0xa2, 0x4a, 0xd7, 0xd3, 0x69, 0xbb, 0x74, 0x6a, 0x99, 0x85, 0x49, 0x95, 0x59, 0xc3, 0x50, 0x76, 0x0f, 0xd6, 0xbd, 0x85, 0x23, 0x12, 0xde, 0xe3, 0x07, 0xb6, 0x46, 0xeb, 0x74, 0x22, 0x2a, 0x09, 0xf6, 0x44, 0x0b, 0xcf, 0xaa, 0x54, 0x95, 0x45, 0x46, 0xc1, 0xc8, 0x81, 0x5b, 0x6b, 0x55, 0x78, 0xd7, 0x12, 0x4b, 0x14, 0xce, 0x0e, 0xf2, 0x87, 0x7a, 0x41, 0xf7, 0xde, 0x80, 0x4b, 0xca, 0xd9, 0x74, 0xfc, 0x45, 0xfa, 0xa0, 0x0f, 0x8e, 0xdc, 0x01, 0x15, 0x3e, 0xc6, 0x93, 0xaf, 0xc3, 0x80, 0xcf, 0x00, 0x03, 0x65, 0x71, 0x62, 0x41, 0xba, 0x7e, 0x58, 0x45, 0x3e, 0x86, 0xc5, 0xb7, 0x02, 0x26, 0x5b, 0xcd, 0x7b, 0xd2, 0x55, 0x26, 0xd6, 0xd1, 0x69, 0xf5, 0x8b, 0x89, 0xf8, 0x61, 0x35, 0xfd, 0x89, 0x2c, 0xa1, 0x94, 0x75, 0x93, 0x25, 0x1c, 0xe3, 0x76, 0x33, 0x0e, 0xf7, 0xb9, 0x2d, 0x14, 0x47, 0xea, 0x7b, 0xc8, 0x8f, 0x24, 0xdc, 0xbf, 0xa5, 0x33, 0xf9, 0xc6, 0xaf, 0xf8, 0x40, 0x6b, 0x93, 0x0f, 0xef, 0xc0, 0xaf, 0xb0, 0x6f, 0x5b, 0xcb, 0xd3, 0xe4, 0xa1, 0x4b, 0x98, 0x02, 0x45, 0xa9, 0xe5, 0x22, 0x0b, 0x23, 0x51, 0x95, 0xd2, 0xb1, 0x41, 0x38, 0xd1, 0x3a, 0x50, 0x48, 0x21, 0x07, 0xf5, 0x78, 0x7b, 0x78, 0x60, 0x41, 0x44, 0xf6, 0xa4, 0x7a, 0xc6, 0x28, 0x1b, 0x28, 0xc1, 0x6a, 0x06, 0x97, 0x22, 0x7b, 0x75, 0xaa, 0x12, 0x75, 0x67, 0x6f, 0x32, 0x03, 0x31, 0xf6, 0x25, 0xce, 0x24, 0x64, 0x50, 0x38, 0x6a, 0x43, 0xdd, 0x4d, 0x31, 0x1c, 0x06, 0xf6, 0x0c, 0x48, 0x90, 0x70, 0x95, 0x03, 0x95, 0xfd, 0x58, 0xc2, 0x87, 0xda, 0xec, 0xc7, 0x72, 0x70, 0x63, 0xf2, 0x81, 0xce, 0xe5, 0xda, 0xc4, 0x57, 0x97, 0x1c, 0x30, 0xb8, 0xc1, 0xf3, 0xe8, 0x1e, 0x31, 0x09, 0xbb, 0xa5, 0xda, 0x8d, 0xed, 0x13, 0xc1, 0x86, 0x3a, 0xc6, 0x1a, 0x67, 0x18, 0xeb, 0xad, 0xe3, 0x3d, 0xf1, 0x7f, 0x02, 0x61, 0x3d, 0xaf, 0x75, 0x45, 0x20, 0x9e, 0x27, 0xf4, 0x06, 0x52, 0x14, 0x48, 0xf0, 0x1d, 0x5e, 0xb1, 0x24, 0x79, 0x9d, 0x32, 0x22, 0x37, 0x77, 0xac, 0xdb, 0xd9, 0x72, 0x5f, 0x1e, 0x3c, 0x05, 0xae, 0x53, 0x7a, 0xf5, 0x22, 0x6b, 0x0e, 0xdf, 0xb2, 0x17, 0x39, 0x10, 0x42, 0x38, 0xa5, 0x9d, 0x69, 0x97, 0x49, 0xb1, 0x77, 0xd7, 0x8c, 0x21, 0xb7, 0xa8, 0xad, 0x46, 0xf1, 0x3d, 0x62, 0x0b, 0x33, 0xff, 0xbf, 0x45, 0xd1, 0x83, 0x5a, 0x43, 0xab, 0xb9, 0xad, 0xa6, 0xae, 0x67, 0xbb, 0x73, 0x9e, 0xd6, 0xf7, 0x67, 0x12, 0xcc, 0x61, 0x8b, 0xc0, 0xb9, 0xf2, 0x08, 0xfa, 0x35, 0x3a, 0x3b, 0x79, 0xaa, 0x48, 0x0c, 0x5a, 0x4e, 0xca, 0x7c, 0x66, 0x55, 0x75, 0x7e, 0x96, 0x64, 0xa7, 0x08, 0xd6, 0x48, 0x4b, 0x69, 0x0a, 0xe8, 0xfe, 0xdd, 0x4f, 0x78, 0x6f, 0x5f, 0x83, 0xf0, 0x0c, 0xbe, 0x07, 0xbd, 0xdb, 0xf3, 0xc3, 0xb6, 0xa5, 0xb2, 0x6b, 0x51, 0x5a, 0x3f, 0x01, 0x17, 0xb1, 0x83, 0x9c, 0x55, 0x0f, 0x5f, 0x67, 0x15, 0xaa, 0x40, 0xec, 0x4c, 0xee, 0xf4, 0x93, 0x55, 0x20, 0xbc, 0x65, 0x9e, 0x41, 0xa2, 0x16, 0xa2, 0x35, 0x0c, 0x43, 0x17, 0x24, 0x92, 0xf8, 0x68, 0x21, 0x0d, 0x75, 0x65, 0x09, 0xf0, 0x32, 0x3a, 0xae, 0xdc, 0x20, 0x9d, 0x35, 0x6e, 0x32, 0x4c, 0xbd, 0x5c, 0x1c, 0xb7, 0x42, 0xc0, 0x5b, 0xf9, 0xc0, 0xb3, 0x75, 0x0d, 0x9b, 0x1e, 0x82, 0x3f, 0x3e, 0xcd, 0xeb, 0xe0, 0x02, 0xc5, 0x72, 0x3e, 0x52, 0xd8, 0x72, 0xd4, 0x0e, 0x76, 0x68, 0xbd, 0x2c, 0xc6, 0xb3, 0x6f, 0xa5, 0xf5, 0x98, 0xa5, 0x8f, 0xcf, 0x89, 0x9d, 0x86, 0x8c, 0xa7, 0x84, 0x51, 0xec, 0x85, 0x2f, 0xc3, 0x86, 0x2f, 0x0b, 0xde, 0x5c, 0x6b, 0x57, 0x3f, 0xb4, 0x3e, 0x90, 0xb6, 0x23, 0xb2, 0x2d, 0x34, 0xeb, 0xd7, 0x8d, 0xea, 0x87, 0x08, 0x2e, 0xaf, 0x83, 0x6f, 0x1f, 0xa2, 0x91, 0xcc, 0xb8, 0x11, 0xda, 0x71, 0x88, 0x9a, 0x92, 0x91, 0x8f, 0x90, 0xcf, 0xbb, 0xad, 0xa1, 0x9b, 0xa2, 0x5b, 0xb5, 0x47, 0x1f, 0x99, 0x18, 0x03, 0x79, 0x27, 0xdc, 0xac, 0xe3, 0xf8, 0x79, 0xe5, 0x46, 0xe4, 0xb7, 0x69, 0x41, 0x9d, 0xce, 0xa0, 0x6f, 0xe4, 0xcb, 0x70, 0xe8, 0xfd, 0x35, 0x55, 0x0a, 0x60, 0xf1, 0xb4, 0x79, 0xb1, 0x63, 0x6c, 0x64, 0xf2, 0xd6, 0xaf, 0x0a, 0xf8, 0x1e, 0x10, 0x7d, 0x1b, 0x7b, 0xdc, 0xa6, 0x32, 0xc1, 0xae, 0x8a, 0xbf, 0xb6, 0x3e, 0xcb, 0x66, 0xbc, 0x7a, 0x72, 0xa4, 0xb0, 0xd8, 0xeb, 0xbd, 0x11, 0xea, 0x51, 0xf6, 0x65, 0x33, 0xed, 0x05, 0xd8, 0x39, 0xf9, 0xc6, 0x27, 0xdb, 0xa9, 0x2f, 0xbc, 0xe5, 0x6c, 0x86, 0x1b, 0xe2, 0x6f, 0xd1, 0x7c, 0x31, 0x62, 0x8f, 0xb9, 0x5b, 0x80, 0xa5, 0x6b, 0xa4, 0xc9, 0x9b, 0x50, 0xe0, 0x92, 0x08, 0xf1, 0x88, 0x40, 0x4b, 0x81, 0x0d, 0x51, 0x7c, 0x07, 0x6c, 0x9c, 0xa3, 0xc0, 0x03, 0xd9, 0x27, 0xbe, 0xa3, 0x63, 0x89, 0xd6, 0xe6, 0x3d, 0x51, 0xb9, 0xc3, 0x53, 0x49, 0x61, 0x5f, 0x03, 0xea, 0xaf, 0x26, 0xdc, 0x14, 0x52, 0x1b, 0xa6, 0x02, 0xea, 0x6c, 0xa2, 0x7c, 0x6d, 0x4a, 0x13, 0x4e, 0xca, 0xf7, 0xfc, 0xfa, 0xcd, 0x21, 0x2c, 0xaa, 0x43, 0x6e, 0x78, 0x68, 0x5e, 0x58, 0x48, 0x91, 0x5b, 0x3b, 0x55, 0x87, 0x61, 0xac, 0xb0, 0xa7, 0xad, 0x0d, 0x07, 0x7b, 0xec, 0x5e, 0x24, 0x30, 0xe8, 0x56, 0xb6, 0x4a, 0x67, 0xb3, 0x54, 0x96, 0x50, 0xce, 0xbf, 0x60, 0x10, 0x72, 0x67, 0xe7, 0x3c, 0xee, 0x31, 0x0e, 0x78, 0x69, 0x78, 0x54, 0x97, 0x76, 0x52, 0x06, 0x04, 0xe9, 0x14, 0xb4, 0x60, 0xe8, 0x18, 0xe1, 0x6c, 0x45, 0xbd, 0xfe, 0x2a, 0x0b, 0xb0, 0x9a, 0x3f, 0x56, 0x6a, 0xd3, 0x9c, 0x68, 0xfa, 0x10, 0x5d, 0xfa, 0x05, 0xf2, 0xf1, 0xd0, 0x0b, 0x87, 0x7c, 0x90, 0xeb, 0xc1, 0x79, 0xd4, 0xaa, 0x27, 0xa4, 0x7e, 0x70, 0xcb, 0x17, 0x4c, 0xd3, 0x7c, 0xb3, 0xac, 0x58, 0x3c, 0xc1, 0xd1, 0x37, 0xf5, 0xd9, 0x06, 0x5f, 0x67, 0x03, 0x42, 0xba, 0x65, 0x1d, 0xfd, 0xb2, 0x41, 0x7d, 0x43, 0xf4, 0x85, 0xd7, 0x07, 0x74, 0xe3, 0x60, 0xb9, 0xb1, 0x6f, 0x33, 0x1b, 0x3a, 0x0c, 0xf4, 0x50, 0x71, 0x24, 0xb4, 0x35, 0x8f, 0x9d, 0x15, 0xf5, 0xe8, 0x08, 0xaf, 0xd8, 0x71, 0x1b, 0xb2, 0x5c, 0x7f, 0x61, 0xcc, 0x87, 0xd1, 0x30, 0x4d, 0x7b, 0xd1, 0xdc, 0x89, 0x4b, 0x17, 0x2a, 0x7d, 0x0d, 0x2f, 0x07, 0xb6, 0x31, 0x9c, 0x7a, 0x6f, 0x11, 0x1c, 0xd8, 0xfa, 0xc8, 0x2e, 0x37, 0x61, 0x48, 0xd2, 0x24, 0x4c, 0xa7, 0x90, 0x99, 0x25, 0xba, 0xbb, 0x29, 0x7b, 0xe5, 0xf7, 0x7e, 0xa4, 0x31, 0xf9, 0x05, 0xa7, 0x9f, 0x8e, 0xe8, 0x59, 0xbd, 0xdf, 0x3d, 0xc5, 0x76, 0xf3, 0x7d, 0xd1, 0x2e, 0x75, 0x37, 0x1f, 0x0f, 0xb8, 0x05, 0x32, 0x9d, 0xf8, 0xc0, 0xd2, 0x91, 0xe3, 0xf0, 0xb1, 0xe4, 0x57, 0x86, 0x4e, 0x2a, 0x6e, 0xce, 0x1a, 0x21, 0xb8, 0x9f, 0xda, 0x8a, 0xc7, 0xd5, 0x4c, 0x37, 0xf1, 0x00, 0x0d, 0x66, 0x51, 0x5e, 0xba, 0x4d, 0x0f, 0x07, 0x55, 0xf6, 0xe1, 0x68, 0xeb, 0x4d, 0xd2, 0xf2, 0x74, 0x78, 0x43, 0x13, 0xfb, 0x66, 0x2f, 0x66, 0xff, 0xab, 0xb3, 0x27, 0x18, 0x8b, 0xcd, 0xe9, 0xde, 0x54, 0x64, 0x8b, 0x06, 0xf2, 0x88, 0x68, 0xce, 0xbd, 0xfc, 0xce, 0x9c, 0x95, 0xf1, 0xb2, 0xe1, 0x31, 0x15, 0xa1, 0x44, 0xb4, 0xcc, 0xfa, 0xfd, 0x81, 0xbd, 0x5b, 0x7e, 0x51, 0x91, 0x59, 0x59, 0x83, 0xf7, 0x74, 0x5e, 0xb3, 0xec, 0x49, 0x03, 0x8d, 0x39, 0x0a, 0x0a, 0xe3, 0x3d, 0x2c, 0x5d, 0xfe, 0xec, 0x5f, 0x3d, 0x32, 0x18, 0xc3, 0x9b, 0xb5, 0xf0, 0x59, 0xc6, 0xb2, 0xc6, 0xb8, 0x47, 0x98, 0x15, 0x01, 0x09, 0xb8, 0xc2 ],
+const [ 0x9f, 0x07, 0xe6, 0xb7, 0xea, 0x8b, 0x6d, 0x2b, 0xb3, 0x01, 0xd6, 0xce, 0x70, 0x19, 0xe0, 0xf2, 0x7a, 0xd5, 0x5a, 0xbb, 0xb7, 0x99, 0xe6, 0xd4, 0x76, 0x81, 0xfe, 0x60, 0x9a, 0xf6, 0x34, 0x34, 0xfb, 0x84, 0xbe, 0x43, 0x09, 0xe6, 0x31, 0x59, 0xb3, 0x63, 0x8d, 0x0d, 0x87, 0x5e, 0x7a, 0xf1, 0x1a, 0x28, 0xd1, 0x0b, 0xaa, 0x18, 0x5e, 0x89, 0x02, 0xde, 0xe5, 0xb0, 0x9e, 0x14, 0x62, 0x16, 0x10, 0x16, 0x95, 0x11, 0xa2, 0x14, 0xbe, 0x6f, 0x3d, 0x65, 0xa6, 0x67, 0x89, 0x1e, 0xde, 0xd0, 0x56, 0xe4, 0x4b, 0x91, 0x3b, 0xfe, 0xe3, 0x59, 0x7c, 0xae, 0xb1, 0x90, 0x31, 0xc2, 0x1f, 0x8d, 0xa5, 0x66, 0x74, 0x09, 0xfd, 0x3c, 0x9c, 0xd3, 0x1a, 0xaf, 0x28, 0xc6, 0xc0, 0x84, 0x95, 0xf9, 0xf7, 0xb1, 0xd1, 0x35, 0xb1, 0x73, 0xfb, 0xac, 0xae, 0x9b, 0x6a, 0xe7, 0x9d, 0x28, 0xf2, 0x01, 0x84, 0x1b, 0x62, 0x13, 0x61, 0x87, 0x51, 0xef, 0x12, 0xe8, 0x1b, 0x11, 0x72, 0xb5, 0x26, 0xd2, 0xc5, 0x39, 0x6a, 0xdf, 0x56, 0x9e, 0x30, 0xea, 0x5e, 0x4b, 0x19, 0x9f, 0x28, 0x70, 0x63, 0xda, 0x73, 0xde, 0x68, 0x17, 0x18, 0x1d, 0x67, 0x2a, 0xec, 0xb8, 0x87, 0x30, 0xe8, 0xdc, 0x19, 0xc5, 0x87, 0x21, 0x1e, 0x77, 0x70, 0xa8, 0x09, 0x7b, 0x55, 0x66, 0xc6, 0x9f, 0x1b, 0xbf, 0xfa, 0x80, 0x3b, 0x57, 0x8d, 0xfd, 0x68, 0x25, 0x66, 0xeb, 0x72, 0xc9, 0x75, 0x0a, 0x6a, 0x1f, 0xf7, 0x38, 0x07, 0x14, 0xf5, 0xe5, 0x48, 0xb8, 0x0e, 0xc7, 0x5b, 0x95, 0x77, 0xcf, 0xbe, 0x40, 0x40, 0x5b, 0xa4, 0x2d, 0xd9, 0xad, 0x9a, 0xc7, 0xd4, 0x9c, 0x6a, 0xc0, 0xec, 0x89, 0x3f, 0xa6, 0x47, 0x95, 0x0b, 0xb8, 0xf8, 0x11, 0x26, 0xf7, 0xc8, 0x37, 0x38, 0x80, 0x36, 0x17, 0x58, 0x18, 0xbc, 0xd3, 0x75, 0x09, 0x54, 0x0f, 0xf5, 0x2d, 0x3b, 0xa4, 0x9d, 0x48, 0xf5, 0x94, 0xb1, 0x9a, 0x91, 0x43, 0x5c, 0xb5, 0x2e, 0xe4, 0x51, 0x8d, 0xbe, 0x31, 0xb3, 0xce, 0x0a, 0x5f, 0x33, 0x72, 0xf7, 0x51, 0x78, 0x92, 0x07, 0x0c, 0xc3, 0x7c, 0x22, 0x6b, 0xd3, 0x07, 0x97, 0x13, 0x06, 0x23, 0x5e, 0xaa, 0xc2, 0xb4, 0xa0, 0x44, 0x13, 0xa1, 0x78, 0x1e, 0x95, 0x27, 0xfc, 0x8f, 0x95, 0x74, 0x77, 0x3b, 0x73, 0x71, 0xf9, 0x8a, 0x4a, 0xdf, 0x12, 0x59, 0xd3, 0xa5, 0xda, 0xef, 0x87, 0x68, 0x34, 0x32, 0x04, 0x5d, 0x54, 0x1a, 0xb2, 0x5b, 0x7f, 0x67, 0xa6, 0x35, 0x12, 0x8f, 0xc7, 0x46, 0xc6, 0xfb, 0x2f, 0x4d, 0x32, 0x72, 0xd4, 0x7c, 0x92, 0xd6, 0x67, 0xcb, 0xc6, 0x0e, 0x7c, 0x92, 0x9e, 0x43, 0xec, 0x57, 0x54, 0x4f, 0x77, 0xe4, 0x5a, 0x72, 0xae, 0x9d, 0x56, 0x47, 0x11, 0x11, 0x6c, 0xf7, 0x74, 0xcf, 0xbb, 0xad, 0xa7, 0x7b, 0x2a, 0x4a, 0x55, 0x21, 0x64, 0x59, 0x2d, 0xc8, 0x21, 0x45, 0x40, 0x4b, 0xa8, 0xc9, 0xaa, 0x64, 0x91, 0xa9, 0x75, 0x0a, 0xd0, 0xa0, 0xba, 0xfd, 0xef, 0x99, 0x09, 0x9f, 0x9b, 0x22, 0x0b, 0x05, 0x62, 0x1d, 0x66, 0x4e, 0xbb, 0xb8, 0xe1, 0x33, 0x47, 0xa0, 0xc9, 0xe0, 0x56, 0x72, 0x93, 0x02, 0xad, 0x73, 0xc2, 0x22, 0x87, 0x80, 0x0c, 0x31, 0xd9, 0x48, 0xb8, 0x64, 0xda, 0xb8, 0x4a, 0x42, 0xc3, 0xb7, 0x62, 0xfb, 0xd3, 0x14, 0xe2, 0xfb, 0x97, 0xbc, 0x4f, 0xbf, 0x68, 0x31, 0x7a, 0xe7, 0x35, 0x37, 0x5f, 0x8d, 0x83, 0xd1, 0x4d, 0xd6, 0xb1, 0x6b, 0x47, 0xc6, 0x81, 0x59, 0xab, 0x59, 0xd4, 0x80, 0x11, 0xcf, 0xb5, 0x53, 0x76, 0x47, 0x99, 0x02, 0x9a, 0x8f, 0xe5, 0xed, 0xa6, 0x3b, 0xb1, 0x5f, 0x12, 0xf4, 0xcc, 0x79, 0xc6, 0x13, 0x00, 0x6c, 0x7f, 0x6f, 0x97, 0xec, 0x75, 0x72, 0x1d, 0xe1, 0x3b, 0x73, 0x68, 0x5f, 0xe6, 0x3f, 0xd6, 0xd8, 0x71, 0xf9, 0xd6, 0x90, 0x60, 0x25, 0xaa, 0x52, 0xa4, 0xff, 0x6b, 0x62, 0xbf, 0x11, 0x4d, 0xb2, 0x28, 0x04, 0x24, 0x58, 0xf1, 0xb7, 0x27, 0x40, 0xa7, 0x8e, 0xf4, 0x1e, 0x7a, 0x0d, 0xd5, 0xa7, 0x9d, 0xa5, 0x42, 0x01, 0xf0, 0xcd, 0xa7, 0x78, 0xdd, 0x55, 0x67, 0x72, 0x7f, 0xf7, 0x20, 0xa5, 0x0a, 0x30, 0x31, 0x87, 0x67, 0x4e, 0x79, 0x06, 0x1e, 0xc9, 0x62, 0x7a, 0x79, 0xd6, 0x1e, 0xd8, 0xe7, 0x3a, 0x31, 0x28, 0x9e, 0x5c, 0x30, 0x39, 0x84, 0x9f, 0xc8, 0x93, 0x50, 0xee, 0x01, 0xad, 0xec, 0x99, 0xc4, 0x60, 0x1e, 0x5f, 0x9c, 0x9c, 0x68, 0xcc, 0xb9, 0x5a, 0x2d, 0xc5, 0x3a, 0xd1, 0x14, 0x61, 0xac, 0xed, 0xb2, 0xfa, 0xcd, 0xfd, 0x63, 0x84, 0x96, 0xac, 0x78, 0x1e, 0x79, 0x32, 0x98, 0xe7, 0xe8, 0xcb, 0x60, 0x13, 0x16, 0x68, 0x4d, 0x3e, 0x01, 0xa5, 0xdc, 0xff, 0xb0, 0xfc, 0xef, 0xc1, 0xb9, 0x38, 0x73, 0xce, 0x07, 0x2c, 0x40, 0xad, 0xda, 0xa4, 0x40, 0xae, 0x0f, 0x9c, 0xd4, 0xc3, 0xa2, 0xb0, 0x73, 0x91, 0x71, 0xd4, 0x95, 0xc7, 0x43, 0x45, 0xcf, 0xaf, 0x08, 0xc0, 0x3f, 0x03, 0x63, 0xf1, 0x2a, 0x01, 0x65, 0x2e, 0xe4, 0xc1, 0x9c, 0x65, 0xf0, 0xc7, 0x4c, 0x53, 0x69, 0xd5, 0xfc, 0xf7, 0xa0, 0x02, 0x34, 0x47, 0x07, 0x10, 0x86, 0x21, 0x4e, 0xfb, 0xcb, 0x84, 0xcb, 0xce, 0xaf, 0x00, 0x1f, 0xba, 0x70, 0x6b, 0x17, 0x69, 0xe2, 0xd6, 0xd0, 0x90, 0xb7, 0xbf, 0x1f, 0xc4, 0xfd, 0x89, 0x2f, 0x8e, 0xe8, 0x29, 0x6c, 0xc1, 0xd2, 0x21, 0xa0, 0x0b, 0x80, 0xb2, 0x5c, 0xcb, 0xa7, 0x4d, 0x9a, 0x22, 0xae, 0x4c, 0xa0, 0x4d, 0xb6, 0xdf, 0x28, 0x32, 0xd8, 0x49, 0xbd, 0x38, 0xad, 0x4c, 0x68, 0x5c, 0x14, 0xe1, 0x8c, 0x82, 0x2f, 0x2d, 0x0f, 0x08, 0xaf, 0xb1, 0xba, 0xa1, 0x52, 0xc1, 0xe3, 0x61, 0xa9, 0x37, 0x49, 0x14, 0x1f, 0x68, 0x3f, 0xd4, 0x37, 0x57, 0x0d, 0xdb, 0x15, 0x29, 0x93, 0x95, 0x40, 0xd9, 0x2f, 0xf9, 0xa6, 0x2d, 0xe1, 0x1a, 0xe1, 0xe9, 0xad, 0xf9, 0xb8, 0x42, 0x41, 0x9e, 0xe9, 0x95, 0xd8, 0x67, 0x26, 0x59, 0x5e, 0x9f, 0x5d, 0x53, 0xd5, 0x52, 0x3c, 0x08, 0xf7, 0x60, 0xf5, 0x78, 0x1d, 0xd1, 0x3e, 0x09, 0x5f, 0x68, 0x9c, 0xc2, 0xfd, 0x7b, 0xe2, 0xb9, 0xfe, 0x02, 0xf4, 0xcf, 0x16, 0xed, 0xd1, 0x9a, 0xcd, 0xbb, 0xd1, 0xa3, 0xde, 0x48, 0x2b, 0xd2, 0xdd, 0xe6, 0xb9, 0x26, 0x1d, 0xb0, 0x00, 0xa9, 0xd1, 0x1b, 0x6b, 0xa4, 0x71, 0xce, 0xd7, 0x0f, 0x60, 0xb4, 0x54, 0x4b, 0xcb, 0x4f, 0x2a, 0x14, 0xd4, 0x4f, 0x1b, 0xb1, 0xf0, 0x63, 0xe8, 0x6d, 0x8d, 0x4f, 0x17, 0x4b, 0xf9, 0x3f, 0xf2, 0xf6, 0x7f, 0x5a, 0xd3, 0xf7, 0xd3, 0x9b, 0x9f, 0x2a, 0xb0, 0xdc, 0x91, 0x73, 0xbf, 0x34, 0x39, 0xad, 0xbb, 0x83, 0xc4, 0xe3, 0xd3, 0x4b, 0x7d, 0xc3, 0x4f, 0xc2, 0x94, 0x4f, 0x77, 0x25, 0x1e, 0xd6, 0xb0, 0x4e, 0x5e, 0x23, 0xe9, 0x89, 0x43, 0xf4, 0x35, 0xa4, 0x31, 0xae, 0xb9, 0x45, 0x05, 0x4e, 0xc9, 0x80, 0x53, 0xa3, 0x4e, 0xa9, 0xf1, 0xbb, 0x6b, 0x67, 0xba, 0x9b, 0x60, 0x0a, 0x8c, 0x32, 0xae, 0x1f, 0x93, 0x90, 0x7c, 0x41, 0xca, 0x54, 0x39, 0x32, 0xbe, 0x63, 0x83, 0x2a, 0x96, 0xe0, 0x47, 0x6e, 0x50, 0x58, 0x2a, 0x25, 0x4d, 0x3c, 0x28, 0x67, 0x10, 0x95, 0x7b, 0x98, 0x43, 0xf3, 0xbf, 0xf4, 0xfa, 0xa6, 0x53, 0x6a, 0x3c, 0x31, 0x02, 0xae, 0xc0, 0xfc, 0xe3, 0x8a, 0xf4, 0x49, 0x7d, 0x75, 0x43, 0x69, 0x2f, 0x66, 0x98, 0x30, 0xd0, 0xea, 0x1e, 0xa6, 0x92, 0x75, 0x4b, 0xff, 0x2c, 0xf5, 0x1c, 0xce, 0x38, 0xad, 0xa2, 0x75, 0xd9, 0x41, 0xbd, 0xe0, 0xa2, 0x0d, 0x28, 0x73, 0xb3, 0xbb, 0xb5, 0x40, 0x25, 0x15, 0xda, 0x7e, 0xa9, 0x17, 0x6d, 0x36, 0x6b, 0x49, 0xac, 0x40, 0x3d, 0x4c, 0x80, 0x6e, 0xf1, 0xb2, 0x03, 0x07, 0x06, 0x13, 0x3f, 0x77, 0x88, 0x5c, 0x39, 0x44, 0x31, 0x6b, 0x2e, 0x44, 0xd4, 0xd9, 0x1c, 0x0e, 0xfc, 0x17, 0x84, 0xae, 0xd0, 0xbd, 0x6e, 0x9d, 0x39, 0x1e, 0xaf, 0xf0, 0x47, 0x20, 0x67, 0xcf, 0xd1, 0x4b, 0xcd, 0x29, 0x5c, 0x1f, 0x2f, 0xa6, 0x3e, 0xab, 0x34, 0xdd, 0x04, 0x5b, 0x65, 0xc8, 0x10, 0x12, 0xeb, 0x74, 0x87, 0x78, 0x9a, 0xfd, 0x6a, 0x96, 0x2f, 0xba, 0x02, 0xa0, 0xd6, 0xb5, 0x82, 0x11, 0xf0, 0x5e, 0xe8, 0xfd, 0x12, 0x80, 0x24, 0xa3, 0x51, 0x73, 0x7c, 0x43, 0xbd, 0x94, 0x2f, 0x2f, 0x2b, 0xf2, 0x58, 0x23, 0x38, 0x4a, 0x16, 0xd9, 0x8a, 0x36, 0xea, 0xd9, 0x59, 0xa1, 0x60, 0x8f, 0x2e, 0x7e, 0xf2, 0x9f, 0xeb, 0xb9, 0x29, 0x7d, 0x0c, 0x6e, 0x05, 0x38, 0x2c, 0x5a, 0x9f, 0x96, 0xcb, 0x8f, 0x0d, 0x66, 0x4e, 0x6b, 0x86, 0x12, 0x47, 0xca, 0xc6, 0x74, 0xf7, 0x7b, 0xb4, 0xea, 0x12, 0xf1, 0x43, 0xad, 0xc1, 0x3b, 0x96, 0x5e, 0xed, 0x37, 0x67, 0xe2, 0xbb, 0x02, 0xa9, 0x70, 0x53, 0xb2, 0x6c, 0xe8, 0xe6, 0x48, 0x02, 0x67, 0xef, 0xe0, 0x60, 0x18, 0xb9, 0x2b, 0xc6, 0x4d, 0x21, 0x1f, 0xa3, 0xce, 0x9d, 0xed, 0xb3, 0x70, 0x7d, 0x34, 0x6a, 0xea, 0x71, 0x74, 0x95, 0xe5, 0x4c, 0xc5, 0x3f, 0x52, 0x07, 0xc9, 0xd1, 0x00, 0x09, 0xdf, 0x7e, 0x6e, 0xa5, 0x99, 0xde, 0xde, 0xe5, 0x71, 0xd9, 0xaa, 0x86, 0xb7, 0xc7, 0xdb, 0x43, 0xce, 0xd5, 0xf8, 0x57, 0x98, 0xab, 0x1c, 0x3d, 0x2f, 0x4c, 0x4b, 0xba, 0xd6, 0x3d, 0x06, 0x1d, 0x2f, 0xe9, 0x1d, 0xc6, 0xae, 0x44, 0xc5, 0xe5, 0x4d, 0xaf, 0xea, 0x84, 0x81, 0x1c, 0xc7, 0xc8, 0x6d, 0x72, 0xb3, 0x73, 0x56, 0x33, 0x3e, 0xae, 0x58, 0x5c, 0x7c, 0x06, 0x57, 0x8c, 0xa1, 0xb4, 0x38, 0x69, 0xce, 0x21, 0x50, 0x3f, 0x2b, 0xa9, 0x1c, 0xeb, 0x36, 0x9f, 0x33, 0xf8, 0x5b, 0x92, 0x7a, 0x07, 0xc4, 0xcf, 0x97, 0x74, 0x72, 0x27 ],
+const [ 0x25, 0xa4, 0x3f, 0xd8, 0xbf, 0x24, 0x1d, 0x67, 0xda, 0xb9, 0xe3, 0xc1, 0x06, 0xcd, 0x27, 0xb7, 0x1f, 0xd4, 0x5a, 0x87, 0xb9, 0x25, 0x4a, 0x53, 0xc1, 0x08, 0xea, 0xd1, 0x62, 0x10, 0x56, 0x45, 0x26, 0xab, 0x12, 0xac, 0x5e, 0xf7, 0x92, 0x3a, 0xc3, 0xd7, 0x00, 0x07, 0x5d, 0x47, 0x39, 0x06, 0xa4, 0xec, 0x19, 0x36, 0xe6, 0xef, 0xf8, 0x1c, 0xe8, 0x0c, 0x74, 0x70, 0xd0, 0xe6, 0x71, 0x17, 0x42, 0x9e, 0x5f, 0x51, 0xca, 0xa3, 0xbc, 0x34, 0x7a, 0xcc, 0xd9, 0x59, 0xd4, 0xa4, 0xe0, 0xd5, 0xea, 0x05, 0x16, 0x6a, 0xc3, 0xe8, 0x5e, 0xff, 0x01, 0x7b, 0xff, 0x4e, 0xc1, 0x74, 0xa6, 0xdd, 0xc3, 0xa5, 0xaf, 0x2f, 0xcb, 0xd1, 0xa0, 0x3b, 0x46, 0xbf, 0xf6, 0x1d, 0x31, 0x8c, 0x25, 0x0c, 0x37, 0x45, 0xda, 0x8c, 0x19, 0xb6, 0x83, 0xe4, 0x53, 0x7c, 0x11, 0xd3, 0xfd, 0x62, 0xfc, 0x7f, 0xef, 0xea, 0x88, 0xae, 0x28, 0x29, 0x48, 0x38, 0x71, 0xd8, 0xe0, 0xbd, 0x3d, 0xa9, 0x0e, 0x93, 0xd4, 0xd7, 0xec, 0x02, 0xb0, 0x01, 0x6f, 0xb4, 0x27, 0x38, 0x34, 0x67, 0x4b, 0x57, 0x7c, 0xe5, 0x0f, 0x92, 0x75, 0x36, 0xab, 0x52, 0xbb, 0x14, 0x41, 0x41, 0x1e, 0x9f, 0xc0, 0xa0, 0xa6, 0x52, 0x09, 0xe1, 0xd4, 0x36, 0x50, 0x72, 0x2b, 0x55, 0xc5, 0xd7, 0xef, 0x72, 0x74, 0xfb, 0x2d, 0xf7, 0x6a, 0xc8, 0xfb, 0x2f, 0x1a, 0xf5, 0x01, 0xb5, 0xff, 0x1f, 0x38, 0x2d, 0x82, 0x1c, 0xf2, 0x31, 0x1d, 0x8c, 0x1b, 0x8e, 0xc1, 0xb0, 0xbe, 0xb1, 0x75, 0x80, 0xca, 0x5c, 0x41, 0xf7, 0x17, 0x9e, 0x4a, 0xb2, 0xa4, 0x01, 0x3e, 0xb9, 0x23, 0x05, 0xf2, 0x9d, 0xb7, 0xcd, 0x4a, 0xc3, 0xfc, 0x19, 0x5a, 0xff, 0x48, 0x74, 0xca, 0x64, 0x30, 0xaf, 0x7f, 0x5b, 0x4e, 0x8d, 0x77, 0xf3, 0x42, 0xc0, 0xf5, 0x78, 0xf7, 0x14, 0xdf, 0x47, 0x28, 0xeb, 0x64, 0xe0, 0x22, 0xe9, 0xe1, 0x3d, 0xcb, 0xf0, 0x06, 0x63, 0xe3, 0x4f, 0x35, 0x36, 0x8a, 0x36, 0x2a, 0x91, 0x02, 0x6e, 0xe1, 0x96, 0xb7, 0x46, 0xb4, 0x43, 0x7c, 0xd1, 0xc5, 0x46, 0x18, 0x4e, 0x9b, 0x13, 0x01, 0xe8, 0x10, 0x33, 0x67, 0xa0, 0x6a, 0xdf, 0x74, 0x87, 0xc8, 0xcd, 0xd3, 0x30, 0xc0, 0x4a, 0x6f, 0x65, 0x46, 0x89, 0x7d, 0x19, 0xcf, 0x3b, 0xbc, 0x9e, 0xb7, 0x5f, 0xfb, 0x18, 0xe0, 0x5c, 0xdd, 0x32, 0x9d, 0x4d, 0xd9, 0x0f, 0xce, 0x9c, 0x84, 0x84, 0x4c, 0xd2, 0x13, 0x84, 0x87, 0xad, 0x1b, 0xdb, 0x6d, 0x74, 0x9c, 0x1f, 0x8e, 0x87, 0x3e, 0xe4, 0x7e, 0x3a, 0xda, 0x30, 0x7b, 0xe3, 0x3c, 0x2f, 0x50, 0x32, 0x28, 0x27, 0x79, 0xc1, 0x9a, 0xad, 0x88, 0xec, 0x52, 0x1a, 0xc8, 0xe3, 0x90, 0x39, 0x1f, 0xfd, 0x1d, 0x42, 0x39, 0x50, 0x8a, 0x0c, 0xe2, 0x7e, 0xbc, 0x7e, 0xb4, 0xd1, 0xa9, 0x47, 0xf3, 0x8b, 0x5c, 0xce, 0xb5, 0x77, 0x3f, 0x6c, 0x46, 0xc4, 0x99, 0xda, 0xca, 0x13, 0x56, 0xe5, 0x24, 0xcf, 0x07, 0x69, 0x17, 0xbd, 0x29, 0x7c, 0xab, 0xd4, 0xaa, 0xea, 0xd3, 0x4e, 0xa9, 0xe2, 0x4c, 0xff, 0x7e, 0xee, 0xc8, 0xe6, 0xfa, 0x28, 0x4c, 0x02, 0xef, 0xac, 0xd7, 0x66, 0xf3, 0x49, 0x44, 0x90, 0x62, 0x7c, 0x71, 0xf7, 0xa2, 0x9e, 0xa1, 0xe3, 0xab, 0x5c, 0x1f, 0x81, 0xc6, 0x68, 0x25, 0x37, 0x94, 0x6e, 0xfb, 0x35, 0x53, 0x4a, 0x63, 0x4d, 0x5d, 0x78, 0x35, 0x04, 0xf1, 0xcb, 0x47, 0xe9, 0x36, 0x62, 0x8f, 0x25, 0x7d, 0xd9, 0x8c, 0x54, 0xc7, 0xbc, 0xe1, 0x93, 0x87, 0x41, 0x44, 0xda, 0xa9, 0x36, 0x96, 0x8d, 0xd2, 0x38, 0x53, 0x4d, 0xea, 0x26, 0x2d, 0x14, 0xd8, 0xd5, 0xf4, 0x81, 0x8c, 0x05, 0xb9, 0x70, 0x43, 0x94, 0x33, 0xce, 0x06, 0xf2, 0x62, 0xac, 0x74, 0xd5, 0x71, 0x91, 0xc2, 0x2e, 0xe1, 0x15, 0x00, 0x5b, 0xe4, 0xab, 0x9e, 0x9e, 0x07, 0xbf, 0x2e, 0xce, 0x14, 0x01, 0x6b, 0x4c, 0x37, 0x00, 0x7b, 0x39, 0x5f, 0xfa, 0x71, 0xe6, 0xe7, 0xf2, 0x16, 0x8c, 0x76, 0x04, 0xe9, 0x3e, 0x24, 0xf6, 0x64, 0x1b, 0xde, 0x0f, 0x81, 0xc8, 0x0b, 0x2c, 0x7d, 0x1e, 0x6f, 0x10, 0xdc, 0x1f, 0x50, 0xfc, 0xad, 0x2f, 0xd8, 0x7f, 0x0f, 0x81, 0xbb, 0x90, 0xf4, 0xcf, 0x1a, 0xda, 0x25, 0x4e, 0xa6, 0x57, 0x87, 0xe1, 0x08, 0x20, 0x9c, 0x8c, 0x81, 0x84, 0x4c, 0x2c, 0xcd, 0x57, 0xe6, 0x66, 0x4e, 0x8c, 0x62, 0xde, 0x66, 0x07, 0xe9, 0xa9, 0x25, 0xac, 0x97, 0x04, 0x24, 0xbc, 0x7f, 0x46, 0xb0, 0x61, 0xef, 0x13, 0x2b, 0x87, 0xf6, 0xd3, 0xb0, 0xee, 0x24, 0x62, 0xf6, 0x7d, 0x91, 0x09, 0x77, 0xda, 0x20, 0xae, 0xd1, 0x37, 0x05, 0x47, 0x6c, 0x6f, 0x85, 0x95, 0x5d, 0x51, 0xfd, 0x0e, 0x8a, 0x3b, 0x26, 0x1b, 0x0f, 0xec, 0x97, 0x83, 0xe1, 0x93, 0x8c, 0x27, 0xb1, 0x2b, 0xe5, 0xf1, 0x14, 0x0b, 0x72, 0x07, 0xe0, 0xb9, 0x6d, 0x44, 0xd9, 0x00, 0x48, 0xe8, 0x8d, 0x42, 0xaa, 0x8e, 0x7c, 0x0f, 0xb4, 0x5f, 0x7c, 0xf5, 0x88, 0x86, 0x5c, 0x9a, 0x0c, 0xe3, 0xc8, 0x09, 0xeb, 0x04, 0x6c, 0x4a, 0xdd, 0x51, 0x5d, 0x35, 0x29, 0x86, 0xb4, 0x87, 0x68, 0x67, 0x7c, 0x36, 0x8b, 0xaf, 0xce, 0x02, 0x1f, 0x49, 0x3a, 0x4d, 0xd0, 0xc2, 0x69, 0x2c, 0x2c, 0xff, 0x01, 0xbe, 0xaa, 0x2b, 0xc9, 0xbd, 0xeb, 0xf4, 0x0e, 0x52, 0x3f, 0xf7, 0x45, 0x2e, 0x6b, 0x78, 0xf1, 0xd6, 0xaa, 0x57, 0xc7, 0x3e, 0xf1, 0x3f, 0x10, 0x9a, 0x77, 0x21, 0x50, 0x71, 0x75, 0xe1, 0x25, 0xf3, 0x2a, 0x4f, 0x71, 0x8c, 0x23, 0x58, 0xbb, 0xb9, 0xb9, 0x7e, 0xd3, 0x1b, 0xdb, 0x85, 0xb5, 0xca, 0x0e, 0x6f, 0xb0, 0xeb, 0xb1, 0xab, 0xc8, 0x85, 0x86, 0x8a, 0x58, 0x90, 0x6e, 0xf2, 0xfc, 0x4f, 0x74, 0x56, 0xad, 0xe0, 0x0d, 0xe5, 0x2e, 0x12, 0x9e, 0x02, 0xa8, 0x76, 0x3f, 0xf5, 0x91, 0xb9, 0xbf, 0xe0, 0xd1, 0x30, 0xe8, 0xf4, 0x28, 0xb5, 0x04, 0xe4, 0xca, 0xb2, 0xa0, 0x9a, 0x4d, 0x7b, 0x8f, 0x2a, 0xc5, 0xe1, 0x32, 0x04, 0x2e, 0x04, 0xf7, 0x6d, 0x0a, 0x68, 0x20, 0x30, 0x4a, 0x4b, 0xc6, 0x90, 0x72, 0x36, 0x1d, 0x82, 0xf9, 0xd3, 0xf9, 0x19, 0xee, 0xfe, 0x91, 0x42, 0xe2, 0x1e, 0x83, 0xb1, 0x01, 0xb6, 0x19, 0x1b, 0x82, 0x37, 0xcb, 0xa6, 0x42, 0x19, 0x05, 0x9e, 0xab, 0x29, 0x2a, 0x69, 0xdb, 0x25, 0xd8, 0xbd, 0x02, 0x86, 0x6e, 0x10, 0x0c, 0x9d, 0xcb, 0x50, 0x81, 0xe1, 0x59, 0xd5, 0xa9, 0x88, 0x4b, 0x94, 0xf3, 0x54, 0x22, 0x95, 0x97, 0xb0, 0x76, 0xa7, 0x7b, 0xfb, 0xf3, 0x52, 0x54, 0x24, 0xa2, 0x0d, 0x0d, 0x77, 0x69, 0xb1, 0x6c, 0xb6, 0xd6, 0x2e, 0xf3, 0x6c, 0x18, 0x7c, 0x04, 0x7e, 0x4e, 0xd5, 0x49, 0x03, 0x05, 0x22, 0x53, 0x55, 0xfb, 0xb3, 0x81, 0x68, 0x29, 0x32, 0x24, 0x5b, 0x01, 0xda, 0xe0, 0x4d, 0xf5, 0xe4, 0x56, 0x72, 0x38, 0x42, 0xff, 0x66, 0xc8, 0x90, 0x5b, 0xc1, 0xac, 0x48, 0x4c, 0xeb, 0x7a, 0x35, 0xbc, 0x32, 0x1d, 0x2a, 0x86, 0x19, 0xd5, 0xf3, 0x94, 0xf3, 0x7f, 0x8c, 0x45, 0xb1, 0x17, 0x91, 0x11, 0xf9, 0x7b, 0xf6, 0x6f, 0x78, 0x72, 0xf8, 0xf6, 0x78, 0xec, 0x53, 0xc3, 0xb5, 0x8c, 0xb6, 0x1c, 0x6c, 0x63, 0x74, 0x52, 0xb6, 0xff, 0x7c, 0xec, 0x14, 0xa4, 0x8b, 0x01, 0x4b, 0xd9, 0xa0, 0xe6, 0x72, 0x26, 0xb1, 0x0a, 0x49, 0x1d, 0x9c, 0x1d, 0xcc, 0x97, 0x60, 0x78, 0x08, 0x40, 0x8d, 0xb9, 0x2e, 0x56, 0xf9, 0xad, 0xe6, 0xad, 0xb5, 0x74, 0xe5, 0xf7, 0x3f, 0xdf, 0xc2, 0x42, 0xf9, 0x1d, 0x05, 0xc2, 0xda, 0x97, 0x82, 0xd1, 0x64, 0x18, 0xe5, 0x34, 0xd6, 0x31, 0x8d, 0xa0, 0xa2, 0xdc, 0x9e, 0x7c, 0x21, 0x5f, 0x51, 0xe9, 0x86, 0x73, 0x8f, 0x00, 0x11, 0xa6, 0xbf, 0x5a, 0x85, 0xfe, 0xdc, 0xd6, 0xdb, 0xdf, 0xca, 0x96, 0x38, 0x2e, 0xea, 0x4b, 0x1d, 0xb7, 0xec, 0xb3, 0xdd, 0xcc, 0xe4, 0x60, 0x55, 0x2f, 0xa0, 0xba, 0xd7, 0x33, 0x39, 0x47, 0x67, 0x1d, 0xe9, 0x2a, 0x2a, 0xd0, 0x1c, 0xea, 0x1b, 0xaa, 0xca, 0x75, 0x00, 0xa9, 0x03, 0x65, 0x9d, 0xd2, 0xcc, 0x81, 0x27, 0xd3, 0x29, 0x87, 0xfb, 0xe7, 0x7b, 0x29, 0x90, 0xfa, 0x0c, 0x55, 0xaa, 0x0e, 0xe9, 0xb9, 0xd1, 0xdd, 0xf0, 0x87, 0x02, 0xbf, 0x29, 0x75, 0xa4, 0xcf, 0x5a, 0x09, 0xbd, 0x49, 0xd5, 0x13, 0x66, 0x37, 0x95, 0x7b, 0x7d, 0x4d, 0x89, 0x3c, 0x99, 0x11, 0x30, 0xb1, 0x43, 0x3f, 0x66, 0x10, 0x63, 0x6b, 0x7e, 0x34, 0xf8, 0xe8, 0x90, 0x9f, 0x0c, 0xe9, 0x14, 0xbf, 0xe8, 0xe6, 0xb0, 0x70, 0x84, 0x41, 0x4f, 0xc3, 0x41, 0x2a, 0x73, 0xfd, 0xda, 0xc0, 0xcc, 0xe3, 0x98, 0x78, 0x09, 0x35, 0xc6, 0xc3, 0xee, 0x79, 0x65, 0xeb, 0xa7, 0xf9, 0x21, 0x3e, 0x5c, 0x0f, 0x83, 0x6f, 0x05, 0xa0, 0x67, 0x39, 0x80, 0xe7, 0xb1, 0x45, 0xe0, 0x74, 0x3c, 0x4e, 0x09, 0x74, 0x13, 0x83, 0x7a, 0x32, 0xe4, 0x2d, 0x69, 0xde, 0xb1, 0x91, 0x15, 0x8e, 0xc9, 0x18, 0x58, 0x82, 0xf7, 0xad, 0x7b, 0xac, 0xf9, 0x67, 0x4f, 0x6f, 0x33, 0x68, 0x79, 0xa8, 0xa5, 0x05, 0x0e, 0xeb, 0x1b, 0x27, 0x60, 0x0f, 0xa3, 0xf0, 0x17, 0xec, 0x44, 0xa2, 0x83, 0x63, 0xed, 0xbd, 0x30, 0x9f, 0xac, 0x68, 0xbb, 0x9b, 0x20, 0x12, 0xe5, 0xe4, 0x31, 0x59, 0xe6, 0xa1, 0xfe, 0x2b, 0x04, 0xd0, 0x17, 0x2b, 0x63, 0xd2, 0xed, 0x56, 0x1f, 0x2a, 0x87, 0xe6, 0x98, 0x82, 0x76, 0x76, 0x0d, 0xee, 0x0a, 0x68, 0x6d, 0x75, 0xc6, 0x84, 0x69, 0xce, 0x12, 0xe1, 0xce, 0x67, 0x30, 0x09, 0x12, 0xac, 0x71, 0x58, 0x2c, 0x85, 0xa9, 0xa5, 0xa9, 0x20, 0xe0, 0x25, 0xfd, 0xf2, 0x4a, 0x8b, 0x17, 0xf8, 0x7a, 0x74, 0x38, 0x43, 0xd2, 0x03, 0x04, 0xb3, 0x3e, 0xc8, 0xda, 0x03, 0x22, 0xe7, 0x61, 0x05, 0x90, 0x76, 0x63, 0x2f, 0xbf, 0x26, 0xdf, 0x57, 0xb8, 0x26, 0x59, 0xbb, 0x53, 0x44, 0x75, 0x44, 0x62, 0x56, 0xc4, 0x0c, 0x2c, 0xd8, 0xde, 0x1d, 0x1d, 0xd6, 0xb1, 0x7c, 0xbb, 0x0d, 0x18, 0x66, 0xdc, 0x4d, 0xb0, 0xd9, 0x16, 0x21, 0xe7, 0x56, 0x78, 0xb2, 0x55, 0xe6, 0x77, 0xe9, 0x50, 0x5b, 0x2b, 0xd4, 0xba, 0xd8, 0xbc, 0x4b, 0x1e, 0x93, 0x17, 0xd3, 0xfb, 0xda, 0xe5, 0xc2, 0x60, 0x54, 0xbd, 0xa4, 0xb9, 0x8a, 0x98, 0xde, 0xe9, 0xa5, 0x86, 0x91, 0x99, 0x79, 0xa0, 0xc1, 0xcf, 0xc3, 0x3e, 0xb7, 0xc2, 0xaf, 0x6a, 0xa3, 0xed ],
+const [ 0xc2, 0x9a, 0x1a, 0xb0, 0x20, 0xe6, 0x43, 0x4a, 0x50, 0xa2, 0x71, 0xe5, 0x52, 0x5a, 0x47, 0xa2, 0x9b, 0x44, 0x7a, 0x76, 0x16, 0x2e, 0xee, 0xc5, 0x69, 0xb5, 0x1c, 0x33, 0x79, 0xb8, 0xb7, 0xb7, 0x30, 0x0c, 0x8f, 0xf1, 0x7e, 0x71, 0xb5, 0xbd, 0x9d, 0xc5, 0xe0, 0x08, 0x9a, 0x78, 0x0f, 0xe2, 0x11, 0x40, 0x70, 0xd5, 0x38, 0x0e, 0x81, 0x75, 0x1e, 0x40, 0x75, 0x39, 0x35, 0x18, 0xd9, 0x89, 0x0f, 0x6d, 0x77, 0x18, 0x65, 0xa0, 0x7b, 0x74, 0x5d, 0xd2, 0xd4, 0xdc, 0x0c, 0x54, 0xdd, 0x51, 0x3a, 0x5f, 0x3d, 0xef, 0x66, 0x06, 0x0c, 0x7e, 0x0a, 0x68, 0x37, 0x45, 0x21, 0x2a, 0x25, 0x1e, 0xe5, 0x25, 0x9a, 0xd0, 0xdd, 0x5b, 0xdc, 0x98, 0x17, 0x30, 0x15, 0x09, 0xb3, 0xd7, 0xf9, 0x17, 0xa1, 0x0a, 0xa8, 0x6e, 0xaa, 0xfe, 0xd6, 0x08, 0xb5, 0x96, 0x29, 0xfe, 0x43, 0xd7, 0xe2, 0x9e, 0x3d, 0x9c, 0xc0, 0xbf, 0xef, 0x8a, 0x21, 0x51, 0x54, 0x47, 0x6b, 0x38, 0x94, 0xe7, 0xaa, 0x5b, 0xcb, 0xa7, 0x7b, 0xf7, 0x0c, 0xde, 0x28, 0x3a, 0xa6, 0x30, 0x14, 0x0d, 0xa5, 0x05, 0x5a, 0x31, 0x9c, 0x39, 0xb1, 0x8d, 0xa2, 0x16, 0x93, 0xc6, 0x9b, 0x7f, 0x9e, 0x11, 0xb9, 0x6d, 0x3a, 0x45, 0x42, 0xa0, 0x7c, 0x35, 0x93, 0x8e, 0x4a, 0x3c, 0x65, 0xa0, 0xc0, 0x19, 0x4f, 0x9d, 0xd3, 0xfd, 0x8c, 0x66, 0x34, 0xe3, 0xff, 0xe5, 0x77, 0x20, 0x74, 0x40, 0x75, 0x3b, 0x29, 0x52, 0xef, 0xfe, 0x8d, 0x5b, 0x74, 0xcd, 0x47, 0xf6, 0x84, 0x37, 0x7a, 0x4c, 0xf5, 0xcb, 0x47, 0x88, 0x96, 0x2d, 0x94, 0x8b, 0x13, 0x69, 0x0c, 0xe0, 0x18, 0x86, 0x67, 0xf2, 0xb9, 0x5f, 0xec, 0x7c, 0x12, 0xae, 0x34, 0x42, 0x2a, 0x6a, 0x30, 0xff, 0x1e, 0x53, 0x6e, 0x9e, 0x7b, 0xcb, 0x97, 0xac, 0xeb, 0xe7, 0x3d, 0x0e, 0x14, 0xc6, 0xd3, 0xef, 0xbd, 0x21, 0xfd, 0xfd, 0x32, 0x24, 0x0b, 0xd5, 0xea, 0x7c, 0xbf, 0xbb, 0x68, 0xb2, 0x57, 0x8f, 0x5f, 0xb7, 0xc7, 0xfc, 0x19, 0xc0, 0x47, 0xf3, 0x19, 0x53, 0x0d, 0x58, 0x00, 0xa2, 0x5c, 0xfb, 0xad, 0x19, 0xbd, 0xc9, 0xa8, 0x33, 0x8d, 0x44, 0xc1, 0x91, 0xb7, 0x30, 0xf4, 0x4d, 0xc3, 0x8f, 0x90, 0x8c, 0x10, 0xd0, 0x99, 0x52, 0x5d, 0x44, 0x6a, 0x9b, 0x8e, 0xd1, 0x9e, 0xa7, 0xad, 0xea, 0x31, 0x95, 0x30, 0xbe, 0xe3, 0x33, 0x7a, 0xb0, 0xdd, 0x15, 0xa4, 0x08, 0x97, 0xe4, 0x7c, 0xe8, 0xf9, 0xf9, 0xce, 0x81, 0xc1, 0x2a, 0xe3, 0x86, 0x24, 0xe4, 0x48, 0xe1, 0xb8, 0x7b, 0xd0, 0xa6, 0x91, 0xbd, 0xdc, 0x45, 0xaa, 0xcd, 0xda, 0x03, 0x87, 0x2f, 0x0c, 0xab, 0x19, 0x1f, 0x8b, 0x80, 0xe2, 0x27, 0x8b, 0x77, 0x5a, 0xf0, 0xe0, 0xa3, 0x90, 0x59, 0xc2, 0xf1, 0x14, 0xc6, 0xcd, 0x15, 0x15, 0xba, 0x4b, 0xc4, 0xc7, 0xa9, 0xb6, 0x24, 0x07, 0x07, 0x79, 0x81, 0x42, 0xa5, 0xf7, 0x41, 0x93, 0x3d, 0xce, 0x1a, 0x2b, 0x4c, 0x5d, 0x82, 0xf6, 0x1f, 0x84, 0x67, 0x7c, 0x31, 0xaa, 0x21, 0x05, 0xb4, 0x05, 0xa5, 0x00, 0x6e, 0x15, 0xfb, 0xa5, 0xc6, 0x72, 0xf2, 0xda, 0x1f, 0xc8, 0x12, 0x53, 0x64, 0x20, 0xd2, 0xfe, 0xe4, 0x61, 0x0b, 0x9e, 0x61, 0x16, 0xad, 0xb5, 0x63, 0x71, 0xb1, 0xa8, 0xd2, 0x90, 0x4e, 0x1e, 0xc4, 0x00, 0x70, 0xa9, 0x94, 0x80, 0x66, 0xa8, 0x34, 0x07, 0xda, 0x6c, 0xc4, 0x08, 0x07, 0x99, 0x63, 0xf4, 0x26, 0xcf, 0x45, 0x01, 0x29, 0x8a, 0x05, 0x2a, 0xac, 0x47, 0x3d, 0x76, 0x29, 0xe9, 0x55, 0x7e, 0x6b, 0x5a, 0x98, 0x29, 0x45, 0x75, 0x8d, 0xbb, 0x83, 0x24, 0x84, 0x0e, 0x21, 0xc5, 0x6f, 0x1e, 0xbb, 0xd3, 0xf3, 0xcc, 0x45, 0xc2, 0xbf, 0xdb, 0xfc, 0x2a, 0x1d, 0x3f, 0x9c, 0x28, 0xc6, 0x97, 0xd4, 0x02, 0xfb, 0xf8, 0xf7, 0x09, 0xd1, 0xec, 0xf4, 0xc4, 0xcd, 0xba, 0x88, 0x4a, 0xb0, 0xe8, 0xb2, 0xf0, 0x94, 0xff, 0x68, 0x24, 0x38, 0x8e, 0x88, 0x99, 0x99, 0x71, 0x11, 0xa5, 0xc2, 0x53, 0x93, 0xe7, 0xe4, 0x72, 0xe4, 0x2c, 0xa9, 0xa2, 0x15, 0x93, 0xc6, 0x95, 0xa4, 0xf0, 0xd0, 0x59, 0xf3, 0x6f, 0x50, 0x22, 0xf9, 0x7a, 0x19, 0x4a, 0x38, 0xdc, 0xd9, 0x96, 0xef, 0x26, 0xef, 0xbb, 0x90, 0x51, 0x7c, 0x21, 0x74, 0xa6, 0xbd, 0xe6, 0xce, 0xdb, 0x98, 0x26, 0xde, 0x7f, 0x74, 0x7a, 0x67, 0x98, 0x4e, 0xbe, 0x62, 0x8a, 0x09, 0x18, 0xf4, 0x3a, 0x06, 0x35, 0x9e, 0x74, 0xf5, 0xd6, 0xb4, 0x8a, 0xeb, 0x8c, 0x10, 0x3e, 0xb4, 0xbf, 0x07, 0xe2, 0x6a, 0xf5, 0x9c, 0xbe, 0x46, 0x51, 0xf4, 0xb2, 0xb7, 0x5a, 0x0a, 0x1d, 0xb1, 0xff, 0xa4, 0xfd, 0x48, 0xd7, 0x86, 0x57, 0x7d, 0xad, 0xe5, 0xd9, 0x58, 0x3b, 0x1e, 0xbe, 0x37, 0x36, 0xa8, 0xf2, 0x65, 0x8b, 0x47, 0x76, 0xee, 0xe9, 0x83, 0x07, 0xb2, 0x7f, 0x59, 0xfa, 0xb9, 0x07, 0x30, 0x6b, 0xc6, 0x03, 0x0f, 0x96, 0x2f, 0x46, 0x0c, 0x85, 0xeb, 0xb7, 0x08, 0xec, 0xed, 0x52, 0x99, 0x51, 0xb0, 0x6f, 0x48, 0x6f, 0x14, 0x47, 0xfd, 0xdd, 0x68, 0xb4, 0xb7, 0xeb, 0xc8, 0x38, 0x80, 0xcd, 0xa9, 0x41, 0xa1, 0xfb, 0xb2, 0xab, 0x12, 0xd7, 0xce, 0x87, 0x34, 0x90, 0x7f, 0x1b, 0xc2, 0x47, 0x75, 0x29, 0x05, 0x71, 0x5f, 0x75, 0x48, 0x7d, 0x01, 0x81, 0x8c, 0xb6, 0x86, 0x9b, 0x7d, 0x6a, 0x18, 0x19, 0xa4, 0x4c, 0xaf, 0xe4, 0xdd, 0x17, 0x26, 0x33, 0x0c, 0x74, 0x94, 0x99, 0x0c, 0x1e, 0xd9, 0x42, 0xe8, 0x44, 0x77, 0x7a, 0x4e, 0x2f, 0xa4, 0x6e, 0x40, 0x24, 0x9d, 0x37, 0x0d, 0x8c, 0x3c, 0x14, 0x80, 0x52, 0xcd, 0xf7, 0x57, 0x8d, 0x1e, 0x44, 0xf6, 0x5f, 0xd5, 0xd5, 0x5d, 0x1c, 0x06, 0x41, 0x58, 0xaf, 0x05, 0x5e, 0xf5, 0x3a, 0x79, 0x04, 0x3b, 0xfd, 0xb2, 0x14, 0x19, 0x79, 0x3d, 0xb9, 0x9d, 0xd5, 0xb5, 0xee, 0x67, 0x80, 0xdb, 0x41, 0x5c, 0x18, 0xe9, 0xd6, 0x9f, 0x8b, 0x24, 0xae, 0xbd, 0x7c, 0xb1, 0x29, 0x27, 0xe8, 0xa9, 0xca, 0xe6, 0x09, 0x70, 0x3b, 0x8a, 0x7a, 0x42, 0x91, 0x63, 0x9d, 0x0e, 0xd0, 0xf4, 0x3a, 0x88, 0xb2, 0xa5, 0x68, 0x7a, 0xa4, 0xb8, 0xb1, 0x5a, 0x12, 0x7e, 0x71, 0x22, 0xe4, 0xcb, 0x7f, 0x5c, 0x49, 0xa7, 0x0f, 0x7c, 0xb3, 0x46, 0xd7, 0x73, 0x23, 0x3b, 0x71, 0x81, 0xa6, 0xe8, 0x01, 0x4b, 0x1f, 0x39, 0x17, 0x2d, 0x48, 0x92, 0xd7, 0xd1, 0xf4, 0x05, 0x57, 0x01, 0x97, 0xc9, 0x48, 0xb9, 0x07, 0xe7, 0xd9, 0x81, 0x84, 0x37, 0xd8, 0xf9, 0xf7, 0x8b, 0x1a, 0xb6, 0x77, 0x2a, 0x1e, 0x4c, 0x11, 0x80, 0xed, 0xac, 0xc9, 0x13, 0x44, 0xb1, 0xdc, 0xb9, 0xf5, 0xf5, 0x48, 0x09, 0x8b, 0xe9, 0x8e, 0x0f, 0x2d, 0x25, 0xb7, 0x44, 0xc5, 0xfc, 0x95, 0xbc, 0x61, 0x54, 0x4b, 0xa2, 0xd9, 0xb4, 0x10, 0xe2, 0xb2, 0x9f, 0x2f, 0x25, 0x42, 0x21, 0x52, 0x02, 0x15, 0xa7, 0x01, 0x72, 0x90, 0x14, 0x66, 0x85, 0xd4, 0x10, 0x53, 0x54, 0xe5, 0xa3, 0x86, 0x37, 0x0c, 0x04, 0x2b, 0x38, 0x79, 0xab, 0xa2, 0xc7, 0x2d, 0xad, 0x83, 0xaf, 0x17, 0x49, 0xdf, 0x48, 0x7d, 0xbe, 0xc9, 0xee, 0x9e, 0x60, 0x15, 0xb3, 0x96, 0xeb, 0x60, 0x51, 0x81, 0x17, 0x51, 0x63, 0xe3, 0x6d, 0x1d, 0xd4, 0x48, 0x58, 0x51, 0x97, 0x27, 0x7f, 0xcc, 0x98, 0x0c, 0x52, 0x0a, 0xf3, 0xf6, 0xe3, 0xa9, 0x65, 0xfe, 0xf8, 0x25, 0xff, 0x3a, 0x5e, 0xe7, 0x22, 0xe1, 0x80, 0x7e, 0xa7, 0xb0, 0x38, 0x2c, 0x5e, 0x8c, 0xe4, 0xa4, 0xba, 0x68, 0xbd, 0x12, 0xca, 0x69, 0x64, 0x5c, 0x6b, 0x48, 0xbe, 0xa7, 0xbd, 0xf9, 0x02, 0x1e, 0xd3, 0x8a, 0x10, 0xee, 0xaf, 0x4d, 0x05, 0x95, 0x6d, 0x39, 0x0c, 0x5d, 0xbe, 0x8e, 0x77, 0x23, 0x98, 0xb8, 0x0e, 0x5d, 0x2c, 0x76, 0xa6, 0x5c, 0x19, 0x3b, 0xf6, 0xce, 0xdf, 0xd5, 0xa7, 0x86, 0x96, 0x4c, 0xaa, 0x80, 0xe0, 0x0d, 0xce, 0x1f, 0x1c, 0x47, 0x92, 0xba, 0xdc, 0x96, 0x37, 0x57, 0x99, 0xdf, 0x1a, 0xb6, 0xa6, 0x7b, 0x41, 0x92, 0x63, 0x97, 0x34, 0x23, 0xb3, 0xda, 0x0e, 0xe7, 0xb0, 0x49, 0xd3, 0xa2, 0x9d, 0x68, 0x04, 0xa4, 0x1b, 0xa2, 0x71, 0x4a, 0xa0, 0xeb, 0x4f, 0xc7, 0x26, 0xa4, 0x8a, 0x24, 0x20, 0xbf, 0x5d, 0x86, 0xb2, 0x23, 0x1f, 0xb0, 0x21, 0x52, 0x60, 0xc8, 0x89, 0x49, 0x34, 0x5e, 0xce, 0xa8, 0xcf, 0xaa, 0xd4, 0x12, 0x52, 0x15, 0xf3, 0xd7, 0xe5, 0xfc, 0xa5, 0xd0, 0x06, 0xb0, 0x82, 0x8b, 0x20, 0xc1, 0x6f, 0xa8, 0x60, 0x7c, 0x12, 0x83, 0xc4, 0xb2, 0x89, 0x14, 0x75, 0xbb, 0x5b, 0x13, 0x56, 0xbb, 0xae, 0x5f, 0xdd, 0x24, 0xbb, 0xa0, 0x22, 0x7c, 0x80, 0x2b, 0x35, 0x61, 0xb4, 0x27, 0xb5, 0xca, 0x00, 0xee, 0x9e, 0x8f, 0x6c, 0xb6, 0x63, 0x2c, 0x18, 0x71, 0x3d, 0xc2, 0x2c, 0xf2, 0xc2, 0x5e, 0x11, 0x50, 0xb9, 0x7e, 0xe2, 0x8f, 0x2d, 0xd1, 0x1d, 0x7d, 0xc0, 0x3f, 0x9f, 0xdb, 0x42, 0x29, 0xcf, 0xbd, 0x82, 0xf2, 0x19, 0x34, 0x64, 0xbe, 0x9e, 0x29, 0x34, 0x79, 0x29, 0x8c, 0x3a, 0x1c, 0x65, 0xaf, 0x8f, 0x2b, 0x4e, 0xec, 0x2f, 0x82, 0xe6, 0x8e, 0x4e, 0x52, 0x29, 0xef, 0xf0, 0x67, 0x42, 0xdd, 0xb4, 0xac, 0xff, 0x42, 0xf0, 0xf0, 0x83, 0x04, 0x03, 0xea, 0x3b, 0x2b, 0xe7, 0x7b, 0x13, 0x42, 0x06, 0x34, 0xe9, 0xff, 0x4f, 0x18, 0x41, 0x26, 0x88, 0xa3, 0x3b, 0xaa, 0xe6, 0x0b, 0xc3, 0x15, 0xdb, 0xc5, 0x08, 0x2b, 0x2f, 0x4b, 0x2f, 0xca, 0x52, 0x1d, 0x48, 0x15, 0xf1, 0x05, 0x81, 0xd2, 0xc7, 0xa0, 0x99, 0x0f, 0xb6, 0x1a, 0x98, 0x0c, 0x16, 0x39, 0xbe, 0x55, 0x4d, 0x9d, 0xb9, 0x2f, 0x9f, 0x46, 0x1b, 0x35, 0x48, 0x56, 0x0a, 0x43, 0xc8, 0x18, 0x39, 0x93, 0x7f, 0x42, 0x18, 0x26, 0x79, 0x77, 0x48, 0x66, 0x8b, 0x10, 0x52, 0x09, 0x9f, 0x1c, 0x98, 0x38, 0x4c, 0xa5, 0x8c, 0xf1, 0xaa, 0x36, 0x1f, 0xaa, 0x64, 0x99, 0x7d, 0x37, 0x0e, 0xe5, 0xf7, 0xed, 0xb9, 0xb9, 0x40, 0x08, 0xc5, 0xc2, 0xdd, 0x4a, 0xf7, 0x83, 0xd7, 0xe5, 0xcb, 0x55, 0xb3, 0x9b, 0x0c, 0xac, 0xa3, 0x24, 0xa1, 0x9d, 0xfe, 0xd0, 0xaa, 0x9d, 0xee, 0x6d, 0xcc, 0x8c, 0x69, 0x6b, 0xc8, 0xf2, 0x62, 0x3e, 0x53, 0x88, 0x40, 0x04, 0x22, 0xfa, 0x8f, 0x68, 0x44, 0xeb, 0xf5, 0xc6, 0xb4, 0x39, 0x68, 0x90, 0x2f, 0x83, 0x9f, 0xf0, 0x43, 0xe9, 0xc6, 0xae, 0xa9, 0x13, 0x76, 0x55, 0xd4, 0x75, 0xe4, 0x91, 0xca, 0xd1, 0x59, 0xdc, 0x33, 0xfd, 0xe2, 0x59, 0xaf, 0xe6, 0x48, 0x00, 0x6d, 0xd5, 0x42, 0xfc, 0xfa, 0xf1, 0xea, 0x51, 0x56, 0x06, 0x6e, 0xc2, 0x4d, 0x84, 0x08, 0xf2, 0x04, 0xcb, 0x30, 0xc9, 0xd3, 0xa5, 0x10, 0x19, 0x52, 0x14, 0x38, 0x82, 0xb7, 0x4f, 0x93, 0x93, 0x5f, 0x07, 0x99, 0x31, 0xaa, 0xee, 0xc7, 0x3d, 0x0c, 0x7a, 0x4c, 0x71, 0x61, 0xe6, 0x06, 0x8b, 0x81, 0x7b, 0xac, 0xae, 0x15, 0x0d, 0x4d, 0x05, 0xa9, 0xc8, 0xf9, 0xa9, 0x02, 0x2d, 0xbe, 0xc5, 0xb1, 0x57, 0xd6, 0xf8, 0xe8, 0x83, 0x1e, 0xfa, 0x8d, 0xcf, 0xca, 0x83, 0x8d, 0x42, 0x57, 0x68, 0x73, 0x0d, 0xc2, 0x07, 0x39, 0x10 ],
+const [ 0xc3, 0xec, 0x01, 0xc7, 0x55, 0x38, 0x5f, 0x27, 0x02, 0x0d, 0x88, 0xed, 0x2c, 0x57, 0x8e, 0x73, 0x18, 0x5c, 0x6d, 0x51, 0x4c, 0x91, 0x92, 0xd1, 0x3c, 0xb2, 0x9e, 0xa4, 0x26, 0x11, 0x67, 0xd3, 0x3b, 0x2f, 0x3f, 0xf8, 0xff, 0x89, 0x7a, 0xad, 0xf2, 0xb4, 0x2a, 0x45, 0x70, 0xac, 0x2d, 0xba, 0xd6, 0x6a, 0x6a, 0xe7, 0xe6, 0xb4, 0x57, 0xf7, 0x6d, 0x39, 0xbf, 0x1e, 0x22, 0xdd, 0xc2, 0x87, 0xd2, 0x52, 0x1d, 0x8d, 0xba, 0xe8, 0xab, 0x2d, 0x35, 0xa6, 0x2c, 0xbb, 0x97, 0x99, 0x46, 0xd5, 0x58, 0x6c, 0xc9, 0x96, 0x75, 0x39, 0x37, 0x0b, 0x13, 0x9f, 0x84, 0xeb, 0x65, 0x15, 0x1a, 0x82, 0xd1, 0x7d, 0x20, 0xef, 0x4e, 0xfd, 0xfc, 0x8f, 0x11, 0x0a, 0x16, 0xb9, 0x68, 0xc5, 0xdf, 0xac, 0xe6, 0x8b, 0x13, 0xc5, 0xc0, 0xc7, 0x3b, 0xf6, 0x77, 0x0b, 0x75, 0x73, 0xb7, 0x60, 0x77, 0xae, 0x80, 0xda, 0xd2, 0x86, 0x83, 0x6f, 0x74, 0xbb, 0xcf, 0x08, 0x71, 0xa6, 0xac, 0xd9, 0x03, 0x27, 0xc7, 0xee, 0xcf, 0xde, 0x90, 0x07, 0x69, 0x9e, 0xe1, 0xa6, 0x1b, 0x1e, 0xe0, 0x66, 0xe2, 0xf2, 0x26, 0x8e, 0xba, 0xba, 0x21, 0xe6, 0x1b, 0x9a, 0xb6, 0xca, 0xc4, 0xea, 0x2b, 0x7c, 0xb7, 0x2e, 0x45, 0xbf, 0x85, 0x48, 0xad, 0xa1, 0xcb, 0xec, 0x98, 0x98, 0xfd, 0x55, 0xa7, 0xd0, 0x62, 0x36, 0x0c, 0xc4, 0x60, 0xf4, 0xef, 0x0c, 0xfa, 0x12, 0x10, 0x75, 0x97, 0xed, 0xad, 0x57, 0x05, 0xa9, 0xa6, 0x23, 0xbd, 0x6b, 0xdf, 0x3c, 0x69, 0xc8, 0xe6, 0x08, 0xa3, 0x7e, 0xd6, 0x46, 0x00, 0x62, 0x7b, 0xa2, 0x4d, 0x9a, 0xb6, 0x86, 0x18, 0x0c, 0x23, 0x34, 0x73, 0x16, 0xfa, 0x12, 0xf4, 0x80, 0x33, 0x44, 0x00, 0xaf, 0xee, 0x80, 0x49, 0x1b, 0x11, 0x1e, 0x96, 0x03, 0x33, 0x6f, 0xc3, 0x5f, 0xb9, 0x50, 0x08, 0x16, 0x3e, 0xff, 0x7e, 0x71, 0x39, 0x2d, 0xde, 0xcf, 0xd9, 0x54, 0x8c, 0x9b, 0x34, 0x4a, 0xd5, 0x7c, 0xa1, 0x17, 0x75, 0xcb, 0x62, 0x04, 0x5d, 0x4a, 0x87, 0xf4, 0xb3, 0x13, 0x0e, 0xf7, 0x19, 0xce, 0x4f, 0x1d, 0x32, 0x27, 0x98, 0x88, 0x62, 0x80, 0x14, 0xc5, 0xd6, 0xe2, 0xf1, 0x5d, 0xc5, 0x3a, 0xc1, 0xa6, 0xf5, 0xc2, 0x21, 0xdf, 0x80, 0xbd, 0x99, 0x7c, 0xd8, 0x67, 0xc4, 0xbf, 0x09, 0x2c, 0xb1, 0x88, 0x3e, 0x18, 0x88, 0x6e, 0x87, 0x8f, 0x71, 0x0e, 0xd9, 0x3e, 0xb1, 0xa3, 0x57, 0x51, 0x16, 0xd8, 0xcf, 0xe6, 0x96, 0xda, 0x88, 0xc2, 0x33, 0xb0, 0x3b, 0x43, 0x22, 0xcf, 0x5f, 0x96, 0x2b, 0xe9, 0xa9, 0x2a, 0x53, 0x07, 0xd4, 0x65, 0xb9, 0xd7, 0x9e, 0x95, 0xbe, 0x47, 0x13, 0x29, 0x68, 0x52, 0x0d, 0x21, 0x09, 0x1a, 0xfc, 0xc3, 0x1b, 0x38, 0xe3, 0x90, 0x6f, 0x50, 0xa3, 0x76, 0x87, 0xe8, 0x7c, 0x47, 0x40, 0x7a, 0xd1, 0x6a, 0xb3, 0xc7, 0x2b, 0xd1, 0x5e, 0x6f, 0x81, 0x2a, 0x7f, 0xbf, 0xb7, 0x5a, 0xc1, 0xca, 0x64, 0x27, 0x1a, 0xbb, 0xd8, 0x34, 0xf4, 0x69, 0x5e, 0x33, 0x8b, 0x2c, 0xbe, 0x56, 0x96, 0xf0, 0x06, 0x06, 0x29, 0x87, 0x8a, 0xd8, 0xda, 0x44, 0x2a, 0xbd, 0x23, 0xc5, 0xd3, 0x79, 0x07, 0x10, 0x49, 0x56, 0xf8, 0xe2, 0x23, 0x19, 0xf9, 0x43, 0x17, 0x35, 0x00, 0x5e, 0x77, 0x3f, 0x9e, 0x90, 0xfc, 0xa2, 0xe1, 0xbf, 0xc3, 0x94, 0x7a, 0xed, 0x95, 0x48, 0x1b, 0x0c, 0x6b, 0x65, 0x23, 0x14, 0x31, 0xb8, 0x7d, 0x54, 0xcb, 0x25, 0xc5, 0x05, 0x56, 0xe4, 0xad, 0x25, 0xb0, 0xea, 0xa0, 0x83, 0x3a, 0xa4, 0xa5, 0x16, 0xdc, 0xeb, 0x85, 0x92, 0x4a, 0x35, 0x30, 0x3d, 0x86, 0x08, 0x5d, 0xff, 0xa7, 0xb5, 0x71, 0xb9, 0xd8, 0x42, 0xa2, 0xd8, 0xa3, 0xa8, 0x5c, 0x2a, 0x70, 0x3f, 0xe3, 0xf0, 0x48, 0x76, 0x3b, 0x34, 0xdf, 0xc7, 0x45, 0x5d, 0xd2, 0xea, 0x2a, 0x00, 0x2d, 0x49, 0xfc, 0xf9, 0x30, 0xb5, 0x9b, 0xbb, 0x53, 0x57, 0xd6, 0xe4, 0x87, 0xe9, 0xd3, 0x15, 0xbf, 0x26, 0xb1, 0x00, 0xaf, 0x7e, 0x6b, 0xc2, 0xd3, 0x0f, 0x00, 0x74, 0xb4, 0xd1, 0xd1, 0xfc, 0x67, 0x10, 0x4a, 0x29, 0x56, 0x20, 0xc4, 0x00, 0x43, 0x4c, 0xaa, 0x50, 0x89, 0x0f, 0xdb, 0x8d, 0xa5, 0x87, 0x50, 0xda, 0xf6, 0x26, 0xff, 0x68, 0xc1, 0xab, 0xff, 0xff, 0x78, 0x50, 0xec, 0xda, 0x3c, 0x45, 0x8d, 0xb8, 0xa0, 0x5e, 0xb4, 0x30, 0xb0, 0x09, 0x66, 0x45, 0x32, 0x82, 0x3c, 0x3a, 0x2b, 0x4a, 0x09, 0xa8, 0xa5, 0xd5, 0xbd, 0xcd, 0xb0, 0x82, 0x8a, 0x27, 0xa7, 0xd1, 0x45, 0x41, 0xb4, 0xd1, 0x0e, 0xce, 0x96, 0xd7, 0x33, 0xf4, 0xa2, 0x75, 0x52, 0xea, 0x08, 0xaa, 0xbe, 0xc5, 0x58, 0x57, 0x24, 0x8f, 0x45, 0xf2, 0x6f, 0x9a, 0xa8, 0x7e, 0xe8, 0x13, 0xc8, 0xbb, 0xa2, 0xda, 0xd8, 0x9a, 0x15, 0x91, 0xc1, 0xf3, 0x09, 0xf4, 0x22, 0x7a, 0xb6, 0x68, 0x95, 0xf0, 0x29, 0xd6, 0x35, 0x96, 0xe9, 0xb9, 0x5d, 0xe7, 0xdb, 0x76, 0xb2, 0x86, 0x63, 0xed, 0x63, 0x76, 0xcc, 0x4d, 0xaf, 0x89, 0xea, 0x2c, 0xa8, 0x1b, 0xfd, 0xd7, 0x37, 0xff, 0xd9, 0xe6, 0x61, 0xba, 0x44, 0x14, 0xc8, 0xef, 0xa0, 0x4e, 0x75, 0x1b, 0xca, 0x0a, 0xd4, 0x83, 0x41, 0xda, 0x00, 0x6a, 0x8b, 0x41, 0x41, 0x86, 0xd4, 0xc5, 0xd4, 0xb5, 0xd9, 0x45, 0xea, 0xed, 0x04, 0x8d, 0xf2, 0x71, 0xd8, 0x28, 0x1b, 0x4b, 0x90, 0x75, 0x15, 0xf6, 0x03, 0xfe, 0x18, 0x5b, 0xcb, 0x04, 0x28, 0xff, 0xa6, 0x5f, 0x97, 0x7a, 0x1c, 0x85, 0xcb, 0x2b, 0x63, 0xe8, 0x42, 0x2a, 0x7f, 0x85, 0xd2, 0x7e, 0xad, 0xb9, 0x36, 0x90, 0x02, 0x57, 0xc6, 0xe0, 0x50, 0xf9, 0x86, 0xf7, 0x49, 0x93, 0x62, 0x9d, 0xe7, 0x4e, 0xb8, 0x4b, 0x0b, 0x93, 0x17, 0xe3, 0x64, 0x65, 0x47, 0x9f, 0x92, 0xf5, 0x89, 0x47, 0x8b, 0x70, 0x1f, 0xa8, 0x3e, 0x1c, 0x0f, 0x41, 0x77, 0xa3, 0x25, 0x3f, 0x03, 0xaf, 0x37, 0xac, 0x14, 0xb6, 0xac, 0xe3, 0xe7, 0x18, 0x3f, 0x47, 0xa3, 0x67, 0x01, 0x34, 0x85, 0x05, 0x9d, 0x36, 0x3a, 0xf5, 0xe0, 0x79, 0x8c, 0xeb, 0x79, 0x81, 0x41, 0xa5, 0xfd, 0x1b, 0x40, 0x7e, 0x2e, 0x94, 0xf6, 0x41, 0x7c, 0x28, 0xf8, 0x3b, 0xcc, 0xbd, 0xea, 0x94, 0x79, 0xd2, 0x9f, 0xdf, 0x98, 0xb2, 0x81, 0xef, 0x81, 0xed, 0x34, 0xec, 0x8b, 0x08, 0x76, 0xa7, 0x16, 0x74, 0x4a, 0x2b, 0xcf, 0xbd, 0x55, 0x95, 0x2f, 0x04, 0x88, 0x25, 0x45, 0xaf, 0xff, 0x94, 0xb6, 0x5f, 0x29, 0xa8, 0x02, 0x22, 0x2a, 0x07, 0x08, 0xeb, 0x7d, 0x49, 0xcd, 0x3f, 0xde, 0x50, 0x79, 0x30, 0x67, 0xdc, 0xa2, 0x8f, 0xf9, 0x5a, 0xcd, 0x5e, 0xdd, 0xfd, 0x32, 0x84, 0xab, 0x10, 0xc0, 0xc4, 0x6b, 0x8b, 0x61, 0xf0, 0xfb, 0xe4, 0x7f, 0x5a, 0xb1, 0x27, 0xc7, 0x8c, 0x40, 0x49, 0x2d, 0x39, 0xe0, 0xba, 0x30, 0x73, 0xa9, 0x39, 0x5f, 0x1d, 0x40, 0xec, 0x1c, 0xa4, 0xb6, 0xb0, 0xa0, 0xea, 0xad, 0xae, 0x3f, 0x83, 0xbd, 0x2f, 0xed, 0x24, 0x16, 0xb1, 0x02, 0x58, 0x66, 0x39, 0x3a, 0x75, 0xfd, 0xec, 0x00, 0xcf, 0x2f, 0xd9, 0xec, 0x2b, 0xf9, 0x1a, 0x8a, 0x77, 0xe8, 0x1b, 0x5d, 0xb8, 0x37, 0x39, 0x23, 0x43, 0x37, 0x8f, 0x5b, 0x30, 0xf4, 0x0c, 0x05, 0x0c, 0x16, 0xc9, 0xa9, 0xce, 0x05, 0x9a, 0x9a, 0x0c, 0x51, 0xe4, 0x7c, 0x6f, 0x50, 0xae, 0x04, 0x65, 0x09, 0xfa, 0xff, 0x15, 0x50, 0x55, 0x96, 0x98, 0x33, 0xad, 0xd0, 0x66, 0x95, 0x63, 0x58, 0x0e, 0x19, 0xa1, 0x81, 0x2b, 0x42, 0xee, 0x87, 0x93, 0xd8, 0xff, 0x18, 0xd1, 0x8d, 0xd0, 0x12, 0xd6, 0xe0, 0xf4, 0x8f, 0xeb, 0x42, 0x2a, 0x1f, 0xea, 0x77, 0x30, 0x54, 0xae, 0x40, 0xdc, 0x84, 0xc8, 0x37, 0x68, 0xca, 0x73, 0xfa, 0x0e, 0x4e, 0xcb, 0x8b, 0xd4, 0xc6, 0x39, 0xf7, 0xaa, 0x3d, 0x32, 0x36, 0xb2, 0x13, 0x21, 0x53, 0xdf, 0x46, 0xa1, 0xcd, 0xc1, 0xef, 0xf0, 0x3c, 0x9f, 0x10, 0xa0, 0x37, 0xc7, 0x8c, 0x90, 0x76, 0x22, 0x77, 0x1b, 0x34, 0x0b, 0x90, 0x8f, 0xd7, 0x61, 0x0c, 0xe1, 0xd3, 0xdb, 0x96, 0x9f, 0xcc, 0x9c, 0x93, 0x25, 0xfb, 0x08, 0xaa, 0x14, 0xd2, 0xd5, 0x84, 0x00, 0xe3, 0x65, 0xd0, 0x69, 0xfe, 0x53, 0x8b, 0xed, 0x99, 0x4c, 0x7e, 0xbb, 0x75, 0x20, 0x08, 0x4b, 0x7f, 0x18, 0x1d, 0x4d, 0xf5, 0x8b, 0x8f, 0xdf, 0xc9, 0xac, 0x8c, 0x02, 0x4a, 0xa6, 0x69, 0x4f, 0x01, 0xeb, 0x9d, 0xe6, 0xd9, 0xc8, 0x11, 0xa8, 0x84, 0x3e, 0x97, 0xa6, 0x19, 0x0d, 0xb7, 0xd8, 0x02, 0x11, 0xb2, 0x13, 0x15, 0xd1, 0xc1, 0x35, 0x01, 0x56, 0x9e, 0xa3, 0xec, 0x39, 0x45, 0xf5, 0x5a, 0x00, 0xfc, 0xef, 0x51, 0xab, 0x91, 0xb3, 0xbb, 0x89, 0xe3, 0x36, 0x0b, 0x50, 0xa3, 0xf1, 0x23, 0x6d, 0x5c, 0xd9, 0x75, 0x99, 0xb1, 0x90, 0x69, 0xad, 0xe7, 0xdd, 0xff, 0xb7, 0xa3, 0x5a, 0xb6, 0x4d, 0xf4, 0x6c, 0xac, 0x21, 0x93, 0x78, 0x06, 0xd6, 0x6a, 0x54, 0x92, 0x12, 0x54, 0xfc, 0xab, 0xd5, 0x24, 0x87, 0x5e, 0x09, 0xe8, 0x59, 0xcb, 0x5a, 0x6f, 0x99, 0xcd, 0x47, 0x08, 0xe6, 0xdd, 0x79, 0x8d, 0x45, 0x33, 0x54, 0xa0, 0x5e, 0x2f, 0xcd, 0x35, 0xe9, 0xf8, 0x7b, 0x51, 0x63, 0x63, 0xf0, 0x10, 0x05, 0x16, 0x49, 0xed, 0xf6, 0xed, 0x04, 0x3e, 0xc0, 0x9c, 0x12, 0xfe, 0x01, 0x96, 0x2d, 0xcf, 0x63, 0x2e, 0x6c, 0x3f, 0xcd, 0xfc, 0x15, 0x4b, 0xdb, 0x83, 0xb2, 0x22, 0x8c, 0x10, 0x67, 0x2b, 0x3b, 0xe5, 0x82, 0x48, 0xd1, 0x97, 0x54, 0x5d, 0x38, 0xb5, 0x40, 0x0c, 0x13, 0xaa, 0x11, 0xc3, 0xac, 0xe5, 0x90, 0xf9, 0x2d, 0x37, 0x57, 0xb4, 0x14, 0x7c, 0xe0, 0x4f, 0xe1, 0x7d, 0xe1, 0x7a, 0x11, 0x15, 0xdc, 0x82, 0x50, 0x93, 0xf1, 0xd3, 0xeb, 0x60, 0xf8, 0xbb, 0x84, 0xe2, 0xcc, 0x70, 0x09, 0x9f, 0xe9, 0x55, 0xe7, 0xa6, 0x3a, 0x79, 0x7a, 0x2b, 0x2c, 0x60, 0xc8, 0x71, 0x07, 0x07, 0x70, 0xed, 0x7e, 0x22, 0xdd, 0xa8, 0x85, 0xa8, 0xbf, 0xe5, 0x62, 0x91, 0xbc, 0x04, 0x07, 0xdf, 0x62, 0xa6, 0x9f, 0xdb, 0x61, 0x12, 0x67, 0xa1, 0xf7, 0xd7, 0xbf, 0xde, 0xab, 0xb3, 0x81, 0xd9, 0x3e, 0xb4, 0x91, 0xb0, 0xdf, 0x9d, 0xb5, 0xe4, 0x9e, 0x8b, 0xa7, 0x18, 0x23, 0xd8, 0x69, 0x16, 0xa0, 0x40, 0xd9, 0x13, 0x04, 0x42, 0x85, 0x34, 0x72, 0xc9, 0xc0, 0x51, 0xf1, 0x0c, 0xf6, 0xf8, 0x65, 0xb3, 0x3c, 0xb5, 0xbe, 0x3b, 0x2b, 0x90, 0x6f, 0x9b, 0xef, 0xd8, 0x21, 0x28, 0x9b, 0x1f, 0xa9, 0xb6, 0xbf, 0x86, 0x38, 0x00, 0x3d, 0x3b, 0xd2, 0x4a, 0x58, 0x3f, 0x02, 0x44, 0x0e, 0x6d, 0xcb, 0x32, 0xa8, 0xb8, 0xe1, 0x4a, 0x8f, 0xb4, 0x1a, 0x5d, 0x61, 0x58, 0x1f, 0xba, 0x44, 0x02, 0x67, 0x50, 0x7b, 0xbb, 0x66, 0x12, 0x37, 0xbc, 0x01, 0xa0, 0xaf, 0x32, 0x46, 0x23, 0x72, 0x3f, 0x5a, 0x78, 0xfc, 0x41, 0xb2, 0x92, 0x88, 0x56, 0x86, 0x19, 0x26, 0x20, 0x83, 0x57, 0x0d, 0xc5, 0xc1, 0x55, 0x32, 0x3a, 0xf4, 0x41, 0x1a, 0xc2, 0xe6, 0x13, 0xec, 0xb1, 0x25, 0x71, 0xca, 0x76, 0xf8, 0xcf, 0x61, 0xd8, 0x98, 0xda, 0xbf, 0x80, 0x9d, 0x17, 0x65, 0xb8, 0xb7, 0xc7, 0x9e, 0x72, 0x9e, 0x0f, 0x0f, 0x8c, 0x4c, 0x55, 0x8e, 0x52, 0x69, 0xed, 0x38, 0x45, 0x07, 0xf5, 0xbd, 0x1b, 0x8f, 0x7d, 0xff, 0x06, 0xfb, 0xec, 0xdc, 0x39, 0x46, 0x9e, 0x47, 0xa9, 0x21, 0xd2, 0x9e, 0x10, 0xe8, 0xc4, 0x37, 0x38, 0xd4, 0x16, 0x3d, 0x76, 0x72, 0x74, 0xba, 0x74, 0x54, 0x78, 0xf4, 0x34, 0x06, 0xcb, 0xfd, 0x52, 0x43, 0x8e, 0x86, 0x8a, 0x69, 0xf8, 0xf4, 0x79, 0x2b, 0x40, 0xb6, 0xa8, 0x86, 0xbd, 0xd5, 0xc6, 0xf6, 0x4c, 0xcc, 0x35, 0xe9, 0xf2, 0x9b, 0xc9, 0x74, 0xc2, 0x17, 0xcc, 0x45, 0x01, 0x84, 0x45, 0xd9, 0x89, 0x65, 0x79, 0xef, 0x6b, 0x93, 0xb3, 0x3c, 0xd8, 0x8d, 0x41, 0x60 ],
+const [ 0x78, 0x10, 0xae, 0xd4, 0xd4, 0x2c, 0x06, 0x06, 0xd0, 0xc1, 0xf7, 0x69, 0x43, 0xd0, 0xc6, 0x3f, 0x38, 0xd2, 0x61, 0xcd, 0xaa, 0x62, 0x44, 0xb5, 0x8c, 0x36, 0x99, 0x7f, 0x0d, 0x53, 0xa3, 0x79, 0x19, 0x81, 0x5c, 0xc1, 0x23, 0xfd, 0x5d, 0xa0, 0x22, 0x6f, 0xff, 0x19, 0xd9, 0x1b, 0xc0, 0xc2, 0x5c, 0x5b, 0xe8, 0xd3, 0xd0, 0x4d, 0x6c, 0x7d, 0x72, 0xc9, 0x12, 0x7d, 0xdb, 0x96, 0xd6, 0xf0, 0x82, 0xdd, 0x8c, 0x69, 0x82, 0xdd, 0xc8, 0x41, 0x9d, 0xe1, 0xfb, 0x2e, 0x81, 0x6f, 0xde, 0x17, 0x4b, 0xc3, 0x14, 0x27, 0x4a, 0x7c, 0x0b, 0x21, 0x05, 0x94, 0x23, 0xf3, 0x7f, 0x95, 0x12, 0x8d, 0xb9, 0x0a, 0x87, 0xf3, 0x79, 0x34, 0x0d, 0x91, 0x4a, 0xff, 0x32, 0xd0, 0xc4, 0x34, 0xe9, 0xe6, 0x0d, 0xf0, 0x2e, 0xf2, 0xa0, 0x55, 0xe8, 0x48, 0x4d, 0x7f, 0x13, 0x09, 0x81, 0xba, 0x1e, 0xf8, 0xc8, 0xf2, 0x92, 0x88, 0x90, 0x6b, 0xf5, 0x3a, 0x30, 0xb2, 0xee, 0x25, 0x29, 0xd3, 0xaa, 0xd6, 0xab, 0xcc, 0x7d, 0x5b, 0x5b, 0x42, 0xcd, 0x9b, 0x53, 0x73, 0x2c, 0xe9, 0x6a, 0x6c, 0xc4, 0xd8, 0xb6, 0x7b, 0xf8, 0x50, 0x50, 0xe8, 0x48, 0xe1, 0x57, 0xe0, 0x75, 0x58, 0x38, 0xb2, 0xe6, 0x90, 0x2c, 0x3e, 0x4b, 0x8b, 0x02, 0xa9, 0x80, 0xc1, 0x1e, 0x56, 0xb4, 0xb8, 0xc2, 0x12, 0xca, 0xd5, 0x8c, 0x8f, 0xff, 0x72, 0x40, 0x14, 0xce, 0x31, 0xc8, 0x72, 0x11, 0x8f, 0x79, 0x3a, 0x68, 0xbc, 0x98, 0x2d, 0xde, 0xaa, 0x1d, 0xf4, 0xca, 0x63, 0xb6, 0x12, 0xf4, 0xa1, 0x0f, 0x16, 0xf9, 0x98, 0x51, 0x15, 0xf1, 0x17, 0xe9, 0x57, 0x4e, 0xcf, 0x8a, 0x51, 0x07, 0xf2, 0x75, 0xd3, 0xf7, 0x01, 0xf8, 0x83, 0x80, 0xdf, 0x34, 0x8a, 0x73, 0x29, 0x24, 0x8d, 0x34, 0xca, 0xdb, 0xdf, 0x19, 0xc9, 0x0d, 0xf5, 0x14, 0x66, 0xd1, 0x1a, 0x92, 0x66, 0xa5, 0x63, 0xa2, 0xab, 0xb3, 0xe6, 0x5a, 0x07, 0x53, 0x27, 0x76, 0x52, 0xd0, 0xd3, 0x43, 0xba, 0x6f, 0xb1, 0xbc, 0x5b, 0xad, 0xd5, 0xf2, 0x10, 0xc9, 0x17, 0xb1, 0x88, 0x82, 0xc3, 0x60, 0x9c, 0x22, 0x92, 0x29, 0xdf, 0xbb, 0xd9, 0x5a, 0x77, 0xb1, 0x01, 0x0b, 0x2c, 0x78, 0x37, 0x02, 0xbf, 0x9f, 0x64, 0xd3, 0x7d, 0x0e, 0x60, 0x4b, 0x13, 0x8c, 0x63, 0x0f, 0xa4, 0x84, 0xbc, 0x81, 0x19, 0x08, 0xc5, 0xe3, 0xb9, 0x16, 0x16, 0xbf, 0xf9, 0x1a, 0xf9, 0x86, 0x95, 0xb5, 0x1e, 0x77, 0xdf, 0xbd, 0x90, 0xc2, 0x57, 0x85, 0xe8, 0xee, 0x7d, 0x5e, 0xc1, 0x78, 0xe3, 0x5d, 0x6b, 0xbd, 0x86, 0x5f, 0xe4, 0x19, 0x5e, 0x4b, 0x03, 0x51, 0x34, 0x97, 0xf7, 0x2e, 0xb4, 0x0e, 0xf0, 0x6b, 0xc3, 0xd0, 0x1c, 0xd2, 0x13, 0x9a, 0xd5, 0xa1, 0xf4, 0x47, 0x19, 0x32, 0x6d, 0x97, 0x3a, 0xdb, 0x8b, 0x30, 0xd6, 0x14, 0xf9, 0xe2, 0x0a, 0xd7, 0xd1, 0x2f, 0xe3, 0x4d, 0xb2, 0x0b, 0x15, 0xa6, 0x13, 0xe0, 0xf0, 0x48, 0xd6, 0xd5, 0x8f, 0x2d, 0x20, 0x50, 0x53, 0x86, 0x69, 0xb9, 0x90, 0xa5, 0xcf, 0x82, 0x85, 0x19, 0xb0, 0x64, 0x92, 0x1b, 0x77, 0xeb, 0xa5, 0x29, 0xb6, 0x34, 0xf6, 0xf0, 0x76, 0xf6, 0xf4, 0x6f, 0xcb, 0xbf, 0x7e, 0x5a, 0xab, 0x80, 0x57, 0xbc, 0xff, 0x4c, 0xd4, 0xe1, 0xfb, 0x5d, 0xd8, 0x73, 0xab, 0x58, 0x02, 0xe3, 0xcf, 0xd1, 0x25, 0x0a, 0xe9, 0x12, 0xf9, 0x11, 0x94, 0x18, 0x10, 0x8e, 0x17, 0xdf, 0x0b, 0xef, 0x3a, 0xe0, 0x0d, 0x1c, 0x59, 0xd7, 0x70, 0x58, 0xb6, 0xc9, 0xb7, 0x68, 0x13, 0x46, 0xc4, 0xf8, 0x81, 0xec, 0x4c, 0x3a, 0x73, 0x2c, 0x87, 0xd0, 0x16, 0x51, 0x2c, 0xec, 0xe5, 0xbd, 0x9c, 0xb6, 0x78, 0x76, 0x5d, 0xee, 0x9c, 0xe2, 0xcb, 0xd2, 0xa9, 0xcf, 0x0a, 0x42, 0x10, 0xb6, 0x3f, 0x22, 0x34, 0x41, 0x00, 0x00, 0x7b, 0x0a, 0x09, 0xf6, 0xa4, 0xa6, 0x30, 0xd2, 0x5b, 0xe2, 0x9b, 0x75, 0x0a, 0x4c, 0x30, 0x79, 0xf3, 0xf6, 0x4d, 0x17, 0x7c, 0x76, 0xb9, 0x47, 0xc9, 0x31, 0xdb, 0x28, 0x90, 0xda, 0x2a, 0xa3, 0x29, 0x35, 0xe5, 0x4b, 0xe5, 0x21, 0x04, 0x88, 0xa1, 0xd5, 0x6e, 0xf5, 0x9b, 0x6a, 0x6c, 0x06, 0x84, 0x9a, 0x5e, 0xee, 0xd6, 0xc7, 0xad, 0xc0, 0x67, 0x3e, 0x00, 0xd4, 0x3f, 0xbe, 0xb3, 0x6c, 0xa6, 0x34, 0x85, 0x97, 0x82, 0xc9, 0x90, 0x56, 0xe0, 0x1e, 0x7f, 0xfe, 0xd1, 0xd6, 0xfb, 0xdd, 0x77, 0x56, 0x66, 0x20, 0x5f, 0xc8, 0xcc, 0xf4, 0x11, 0x66, 0x16, 0xec, 0xe6, 0xf5, 0x81, 0xa3, 0x1a, 0x8f, 0x4f, 0xa2, 0x22, 0xa6, 0xbd, 0x84, 0x40, 0x46, 0x34, 0x58, 0x54, 0x9a, 0xc3, 0x46, 0xf5, 0xb2, 0xcd, 0x76, 0xc0, 0x83, 0xff, 0x2d, 0xf0, 0x30, 0x85, 0x39, 0x30, 0x88, 0x7e, 0x90, 0xad, 0xcf, 0xad, 0x34, 0x6e, 0xc1, 0x71, 0x59, 0xe8, 0xd4, 0xf7, 0xca, 0xcd, 0xbe, 0xae, 0x89, 0x26, 0x37, 0xfb, 0xb5, 0xa1, 0x00, 0x2f, 0xb1, 0x2c, 0x24, 0xb6, 0x83, 0xc2, 0x7e, 0x90, 0x7a, 0x85, 0x7b, 0x06, 0x14, 0x0e, 0x21, 0x95, 0x1e, 0x01, 0x50, 0x2f, 0x1d, 0xe4, 0x48, 0xa3, 0xed, 0x31, 0x6c, 0x59, 0xa8, 0xa9, 0x46, 0x42, 0xca, 0xec, 0xca, 0x0f, 0x92, 0x47, 0xdf, 0xa1, 0xab, 0xcd, 0x1b, 0xc1, 0x0b, 0xa9, 0xce, 0x12, 0x1c, 0xb2, 0x43, 0x43, 0x19, 0x40, 0x42, 0x89, 0xbb, 0x3e, 0xd9, 0x4d, 0x16, 0x81, 0x5d, 0x22, 0xbd, 0x58, 0xab, 0xf9, 0x2d, 0x65, 0xb3, 0x98, 0x69, 0xab, 0x38, 0x48, 0xe1, 0xe7, 0xd1, 0xce, 0x98, 0x24, 0x34, 0x9d, 0x86, 0x8a, 0xb3, 0x4a, 0x3c, 0x77, 0x07, 0x40, 0xc6, 0xd1, 0x4d, 0xb5, 0xd5, 0x9a, 0x4e, 0xdd, 0x1e, 0xc4, 0x03, 0x5d, 0xfd, 0x47, 0x59, 0x02, 0x5e, 0x72, 0x31, 0xb3, 0xdd, 0x7e, 0xab, 0xa4, 0x2c, 0x69, 0xa4, 0xcd, 0xb5, 0x02, 0x7d, 0x9b, 0x81, 0x40, 0x1e, 0xe5, 0x59, 0xd7, 0x3b, 0x21, 0x2b, 0x0d, 0xd6, 0xd8, 0xaf, 0xca, 0x06, 0x57, 0x49, 0xef, 0xf6, 0xa8, 0x32, 0xe9, 0x30, 0xc0, 0xd3, 0x86, 0x1c, 0xfa, 0x71, 0x07, 0xc3, 0xc4, 0x0f, 0x76, 0xd9, 0x98, 0x90, 0x3a, 0xfb, 0x2f, 0x1d, 0xe8, 0x35, 0xf1, 0xc6, 0x5c, 0xc7, 0xaf, 0x6c, 0x09, 0x29, 0x94, 0xde, 0x8d, 0x4c, 0x59, 0x42, 0x88, 0x23, 0xb9, 0xb7, 0xaf, 0x62, 0x25, 0x38, 0x1c, 0x86, 0xb8, 0xc3, 0xe8, 0x15, 0x6d, 0xbb, 0xfc, 0x27, 0x90, 0x8c, 0x24, 0x25, 0x72, 0x8d, 0x66, 0xd1, 0x61, 0x2a, 0x91, 0x86, 0xd7, 0x42, 0x18, 0xc1, 0xf2, 0xce, 0x21, 0xe1, 0x24, 0xc4, 0xda, 0x2b, 0x2c, 0x3b, 0x0c, 0x11, 0x45, 0xcf, 0xf2, 0xb4, 0x9d, 0x47, 0x4b, 0xa7, 0x08, 0x75, 0xae, 0xf6, 0xf6, 0x5e, 0x1e, 0x67, 0xa3, 0x9b, 0xde, 0xff, 0x8d, 0xff, 0x86, 0xc8, 0x2b, 0x7a, 0x57, 0xd2, 0xdc, 0x3d, 0xcc, 0x78, 0x1e, 0x1f, 0x71, 0xe4, 0x00, 0x40, 0xf8, 0xd6, 0xda, 0xec, 0x8a, 0xa0, 0x3b, 0xc2, 0x5b, 0x76, 0x23, 0x15, 0x81, 0xe4, 0x72, 0x92, 0x06, 0xa0, 0xa1, 0x23, 0x3c, 0x82, 0xb0, 0x14, 0x50, 0xd1, 0x5f, 0x75, 0x22, 0xc0, 0xa1, 0xbf, 0x54, 0x38, 0x4e, 0xba, 0xa2, 0xd8, 0x18, 0x9d, 0x71, 0x3b, 0xc0, 0x77, 0xaa, 0x79, 0x8a, 0xcf, 0xc8, 0xf0, 0xee, 0x87, 0x30, 0x44, 0x90, 0x07, 0xc1, 0xa4, 0x72, 0x97, 0xad, 0x4f, 0x68, 0x0b, 0x87, 0x57, 0xcd, 0xa6, 0x9d, 0xa5, 0x75, 0x39, 0x87, 0x3e, 0xe2, 0x8b, 0x00, 0xc5, 0xbb, 0xfd, 0xf5, 0x40, 0x79, 0x6e, 0xdc, 0x1f, 0x64, 0x5d, 0x47, 0x7a, 0xbe, 0x4d, 0xb9, 0x9a, 0x3e, 0x6e, 0xb8, 0xbb, 0xc0, 0x79, 0x23, 0x10, 0x3a, 0xdc, 0xc6, 0x08, 0xf2, 0x17, 0x2c, 0xd0, 0xee, 0x66, 0xb4, 0x19, 0xac, 0xa0, 0xe7, 0x1b, 0x14, 0x5f, 0x09, 0xd9, 0xab, 0x61, 0xee, 0xa7, 0x09, 0x2e, 0x10, 0xea, 0x8d, 0xfb, 0xde, 0x20, 0x4f, 0xcf, 0x56, 0x20, 0x56, 0xe4, 0xd5, 0xa2, 0x0c, 0x50, 0x2e, 0x01, 0xee, 0xe4, 0xfa, 0x40, 0x88, 0x55, 0x30, 0x4c, 0xa1, 0x99, 0xf6, 0x80, 0xb3, 0x94, 0xb6, 0x6e, 0x9e, 0xf4, 0x73, 0xdd, 0x9c, 0x5a, 0x5e, 0x0e, 0x78, 0xba, 0xa4, 0x44, 0xfb, 0x04, 0x8b, 0x82, 0xa8, 0x04, 0xbd, 0x97, 0xa9, 0x87, 0xe3, 0x58, 0x08, 0xbf, 0x76, 0x2d, 0x22, 0xe8, 0xd2, 0xcf, 0x59, 0x2c, 0x8d, 0x4f, 0x0a, 0xc4, 0x06, 0x5b, 0xbf, 0x61, 0x41, 0xbd, 0xa5, 0xca, 0xf2, 0x24, 0x40, 0xc6, 0xd7, 0x27, 0x5d, 0x3c, 0x4b, 0x87, 0x48, 0x99, 0x19, 0xb4, 0x40, 0x72, 0x8e, 0x93, 0x28, 0x6b, 0xd2, 0x7f, 0x7f, 0x57, 0x78, 0x8e, 0x92, 0xa0, 0x53, 0x15, 0xf0, 0xe9, 0x8b, 0x6e, 0x1f, 0xf3, 0xf1, 0xf8, 0x8d, 0xbd, 0x90, 0x60, 0xc9, 0xf0, 0x84, 0x1f, 0xf3, 0x79, 0x10, 0x44, 0x72, 0x78, 0xea, 0x74, 0xe4, 0x59, 0xd9, 0x2f, 0x5b, 0x40, 0x82, 0x54, 0xc6, 0xab, 0x7f, 0xe8, 0xad, 0x53, 0xb2, 0x13, 0x22, 0x53, 0xd9, 0x6b, 0xf4, 0x8b, 0x62, 0x76, 0x25, 0x47, 0x80, 0x69, 0x9e, 0x1c, 0x7e, 0x36, 0x22, 0x13, 0x54, 0xc6, 0x81, 0x0a, 0x78, 0x83, 0x0e, 0x56, 0xf6, 0x1a, 0x52, 0xad, 0xc3, 0x7f, 0x02, 0x44, 0x4e, 0x31, 0x2f, 0x34, 0x59, 0xbf, 0xbd, 0x22, 0x07, 0x8b, 0x16, 0x1f, 0x36, 0xce, 0x1f, 0xcd, 0x0e, 0xdc, 0x6c, 0xc3, 0xda, 0xaa, 0xb0, 0x33, 0x17, 0x8d, 0x77, 0xca, 0xcb, 0x44, 0x17, 0xd8, 0x19, 0x39, 0xe3, 0xb1, 0x11, 0x04, 0xa3, 0x53, 0xcd, 0x31, 0x41, 0x49, 0xb9, 0x43, 0xc5, 0xcf, 0x32, 0xf8, 0x83, 0x36, 0x53, 0xcf, 0x93, 0x8a, 0x0b, 0xc8, 0x82, 0x73, 0x73, 0x6b, 0x47, 0x59, 0x5f, 0x0b, 0x79, 0xcb, 0x34, 0x4c, 0xbf, 0x22, 0xf9, 0xe3, 0x87, 0x61, 0xb0, 0x9d, 0xfb, 0x60, 0xe6, 0xa3, 0x30, 0x2a, 0x89, 0xfc, 0xa1, 0xa3, 0xfa, 0x53, 0xdd, 0x6e, 0x63, 0xfb, 0x7c, 0x0d, 0x4b, 0x30, 0x57, 0x4a, 0x67, 0xa0, 0xf9, 0xd6, 0xb3, 0x2a, 0x50, 0x31, 0xc2, 0xe5, 0xa8, 0xc9, 0x52, 0x64, 0xdb, 0x66, 0x24, 0x38, 0xc1, 0xc5, 0x0b, 0xb7, 0xee, 0x83, 0x42, 0xfc, 0x9d, 0x3e, 0x02, 0x2f, 0xe7, 0xf6, 0x54, 0x07, 0x39, 0xb9, 0x25, 0x8c, 0x04, 0x7f, 0x98, 0x22, 0xb6, 0x53, 0xa0, 0xc3, 0xea, 0xb3, 0xcd, 0x8c, 0xdb, 0x3a, 0x66, 0x7b, 0x1f, 0x7c, 0xb9, 0x77, 0x92, 0x32, 0xaf, 0x90, 0x90, 0x97, 0xa3, 0x89, 0x67, 0x11, 0x74, 0x93, 0x0b, 0x14, 0xd9, 0x5c, 0x0c, 0x43, 0xf5, 0x48, 0xc6, 0xd9, 0x2c, 0xfe, 0xd8, 0x48, 0x34, 0x27, 0xd7, 0x20, 0x6f, 0x72, 0x43, 0x31, 0x78, 0xdc, 0xb9, 0xf4, 0xfc, 0x2e, 0x6b, 0x27, 0xcb, 0xc7, 0xce, 0xb8, 0x2e, 0x9b, 0x92, 0xe4, 0x7c, 0x7c, 0xd7, 0xa0, 0xe8, 0x99, 0x9e, 0x38, 0x9d, 0x44, 0x7d, 0x36, 0x0d, 0xf8, 0x98, 0x85, 0x85, 0x9a, 0xcc, 0xd6, 0x05, 0xff, 0x2d, 0x43, 0x50, 0xaf, 0xb3, 0x32, 0x3f, 0xe8, 0x30, 0x7d, 0x5a, 0xe6, 0x85, 0xd0, 0xa9, 0x62, 0x16, 0x52, 0xc8, 0x59, 0x7b, 0x87, 0x3a, 0x0e, 0x79, 0x75, 0xff, 0x52, 0x30, 0x05, 0x69, 0x03, 0x95, 0xad, 0x2b, 0xd3, 0x23, 0x4c, 0xb3, 0x4a, 0xce, 0x55, 0xba, 0x0f, 0x39, 0x30, 0x19, 0x63, 0x28, 0xdd, 0xde, 0xee, 0x38, 0xdb, 0x9f, 0xbe, 0xce, 0x48, 0x0e, 0x8d, 0x4d, 0x49, 0xce, 0x42, 0x8c, 0xac, 0x85, 0xbb, 0x87, 0xcc, 0x33, 0xca, 0x54, 0xb5, 0xc2, 0x7d, 0x59, 0x89, 0xde, 0xa3, 0xbd, 0x23, 0x06, 0x8b, 0x1c, 0xf9, 0xe3, 0x0f, 0x7f, 0x47, 0xd9, 0xd1, 0x8b, 0x6a, 0xdd, 0xc5, 0xf8, 0x89, 0x86, 0xf0, 0x45, 0x7b, 0x66, 0x6f, 0xaa, 0xe5, 0x9a, 0xba, 0x4f, 0xa3, 0xa0, 0x2a, 0xbb, 0x6a, 0x69, 0xb9, 0x8f, 0xab, 0xaf, 0x0a, 0x74, 0xba, 0x89, 0xa9, 0x52, 0x2f, 0x3d, 0x93, 0xc3, 0x8d, 0x55, 0xf9, 0xc7, 0x21, 0xf5, 0x41, 0xb9, 0x2d, 0x6b, 0x4e, 0x81, 0x46, 0x08, 0x01, 0x0c, 0xfb, 0x2e, 0xff, 0xf9, 0xb7, 0xab, 0xb5, 0x95, 0xe9, 0x45, 0x9a, 0x0a, 0x61, 0x96, 0xb4, 0xd3, 0xfd, 0x1b, 0x5e, 0x73, 0x86, 0x87, 0x48, 0x67, 0xd5, 0x5d, 0xbf, 0x59, 0x3a, 0xbd, 0x2f, 0x96, 0x1e, 0x7e, 0xe6, 0xc2, 0xe6, 0x7e, 0x1a, 0xcb, 0x1b, 0x36, 0x2e, 0x1b, 0xc8, 0x92, 0x31, 0x12, 0x24, 0xff, 0xa8, 0xb3, 0x71, 0xc5, 0x8d, 0x9d, 0x24, 0x97, 0x97, 0x3d, 0x46, 0x68, 0xbc, 0x43, 0x1a, 0x81, 0xf5, 0x52, 0x00, 0xd1, 0x41, 0xfc, 0x99, 0x84, 0xec, 0xed, 0x2c, 0xd7, 0x11, 0x66, 0x49, 0x2a, 0x5e, 0xee, 0xac, 0x56, 0x17, 0x44, 0x63, 0x42, 0x5d, 0x97, 0x34, 0xb1, 0xb1, 0xf9, 0x39, 0x5e, 0xb4, 0x12, 0xcd, 0x4b, 0x30, 0x11, 0xac, 0x56, 0x5c, 0xe8, 0x55, 0x0d, 0x5c, 0xb9, 0xb3 ],
+const [ 0x6b, 0x50, 0xd7, 0x0e, 0xb3, 0xd9, 0x58, 0x73, 0x0f, 0x65, 0x0f, 0x7f, 0x99, 0xf9, 0xfb, 0x04, 0x6d, 0x94, 0x2f, 0x98, 0x5a, 0x11, 0x29, 0x97, 0xdd, 0x4e, 0x60, 0x67, 0x4f, 0x8e, 0x1c, 0x00, 0x5d, 0x1c, 0x8a, 0xab, 0xb9, 0x32, 0x10, 0x09, 0x0f, 0x18, 0xde, 0x58, 0x3b, 0x90, 0xc6, 0xf2, 0xb9, 0x72, 0x4d, 0x16, 0x5c, 0x94, 0x02, 0xeb, 0x43, 0xec, 0x0e, 0xc2, 0x0a, 0xf9, 0x0d, 0x9c, 0x3d, 0x5e, 0x1c, 0xec, 0x12, 0xd1, 0x33, 0x9e, 0x57, 0x33, 0xb6, 0x57, 0xa9, 0x00, 0x46, 0xff, 0xe7, 0xea, 0xdd, 0x7d, 0xe6, 0xc1, 0x1a, 0xc1, 0x66, 0x96, 0xd9, 0x08, 0x45, 0x20, 0x07, 0x5b, 0xf3, 0x5f, 0xb5, 0x59, 0x26, 0x7e, 0x6a, 0x37, 0xcf, 0xfe, 0xbe, 0x05, 0x4c, 0x11, 0x24, 0x33, 0xdf, 0x44, 0x08, 0x53, 0x5f, 0x61, 0x1a, 0x20, 0x2d, 0x94, 0xe9, 0xc0, 0x6a, 0xcc, 0xb3, 0x46, 0x67, 0x64, 0x7b, 0x7b, 0x5d, 0x03, 0x5d, 0xde, 0x5f, 0xc1, 0x1f, 0xe9, 0x8c, 0x8b, 0x08, 0x96, 0x89, 0xc8, 0xf5, 0x22, 0x2f, 0x3c, 0xa9, 0x11, 0x80, 0x2d, 0x65, 0x72, 0xe0, 0xc5, 0xb8, 0x64, 0x82, 0xb8, 0x99, 0xd9, 0x20, 0x27, 0xb3, 0x9a, 0xef, 0xc3, 0x00, 0x8c, 0xd2, 0x35, 0x99, 0x31, 0xcd, 0xbe, 0xcd, 0x71, 0xbd, 0x1a, 0x70, 0x9b, 0x47, 0xab, 0x75, 0xa7, 0x0f, 0xd3, 0xc0, 0xbe, 0x2a, 0xa2, 0x35, 0xfc, 0xd5, 0xb1, 0x15, 0x74, 0x67, 0x4d, 0x8a, 0x74, 0x84, 0xd8, 0x80, 0x0b, 0x94, 0x6d, 0xb7, 0xc9, 0x73, 0xc3, 0x16, 0xc6, 0x6a, 0x54, 0x43, 0xe5, 0x5f, 0xbe, 0x70, 0x5a, 0x48, 0x69, 0x78, 0x6a, 0xe6, 0x6a, 0x2a, 0x72, 0xaf, 0xa7, 0xe4, 0x2b, 0x0c, 0x3c, 0x65, 0x2c, 0xc4, 0x1e, 0xdc, 0xb1, 0xb8, 0xfe, 0x44, 0x9a, 0xd2, 0x71, 0xf4, 0xb7, 0x38, 0x4d, 0x72, 0x42, 0xc5, 0x56, 0x89, 0xad, 0xb9, 0x1a, 0x9b, 0x9f, 0xaf, 0x19, 0x38, 0x39, 0xd0, 0x29, 0xee, 0x9d, 0x47, 0x19, 0x63, 0xb1, 0xf4, 0x95, 0xa2, 0x20, 0x65, 0x49, 0xb3, 0xa2, 0x02, 0x4a, 0x6e, 0x7e, 0x87, 0xb1, 0x90, 0x4d, 0xb8, 0x89, 0x0f, 0x00, 0x50, 0xeb, 0xab, 0x24, 0x3a, 0x67, 0xc6, 0x65, 0x03, 0xa6, 0x75, 0x51, 0x90, 0x4e, 0xd7, 0x5f, 0x0c, 0x26, 0xa6, 0x30, 0x25, 0x7b, 0x0b, 0x14, 0x78, 0xc2, 0xb7, 0xd0, 0x49, 0x7e, 0x2f, 0x9f, 0x78, 0x64, 0x67, 0x76, 0xb0, 0xbd, 0x93, 0x8c, 0xe2, 0x0d, 0x3a, 0x1a, 0xf2, 0xf2, 0x8c, 0x5f, 0xb0, 0x4e, 0xf5, 0xe8, 0x09, 0xa8, 0xf2, 0x0e, 0x7f, 0xd0, 0x24, 0xc0, 0xd6, 0xc2, 0xa3, 0x83, 0x10, 0xcd, 0x94, 0xb6, 0x9c, 0xf5, 0xfe, 0x1b, 0xcb, 0x95, 0xd9, 0x93, 0x83, 0x49, 0x68, 0x29, 0x37, 0x0a, 0xc9, 0x52, 0x16, 0x9b, 0xcb, 0x73, 0x83, 0x25, 0xff, 0xa4, 0xc6, 0x1e, 0x12, 0xb4, 0x01, 0x6e, 0x59, 0x6d, 0x65, 0xd5, 0xae, 0x19, 0xa5, 0x87, 0x7b, 0x45, 0xab, 0x1a, 0x14, 0xc4, 0x8b, 0xa2, 0x4a, 0xf7, 0xb5, 0x1b, 0x3d, 0x4c, 0x6e, 0x07, 0x71, 0x05, 0x81, 0x57, 0x24, 0x3b, 0x31, 0x8f, 0xdf, 0x22, 0x73, 0x26, 0x4c, 0x8e, 0x5a, 0x2b, 0x47, 0xb6, 0xd3, 0x2f, 0x37, 0x38, 0x92, 0x5e, 0x9f, 0x5e, 0x4c, 0xef, 0xf0, 0xa0, 0x27, 0xbf, 0xa2, 0x6a, 0x6f, 0x38, 0x82, 0x1f, 0x8a, 0x78, 0x4e, 0x5d, 0x2e, 0xaf, 0x7f, 0x83, 0xd1, 0xc9, 0x66, 0x70, 0x61, 0x4e, 0x7a, 0x8e, 0x36, 0x86, 0xf1, 0x10, 0x45, 0xe0, 0x8d, 0x77, 0x96, 0x94, 0xb9, 0x5b, 0xf8, 0x88, 0xd4, 0x68, 0xf3, 0x71, 0xcd, 0xa7, 0xfe, 0x3a, 0xf0, 0xfe, 0xf2, 0xa9, 0xff, 0xfb, 0xbf, 0x40, 0x85, 0xcd, 0x5d, 0x61, 0x67, 0x93, 0x06, 0xb6, 0xbc, 0xda, 0xa3, 0xd0, 0xde, 0x60, 0x84, 0x0e, 0xc1, 0x1e, 0x53, 0xc1, 0x84, 0x86, 0x4b, 0x8d, 0x46, 0x0a, 0xa5, 0x13, 0x3b, 0xdd, 0x53, 0xcc, 0xff, 0xfd, 0xf1, 0x38, 0x2a, 0x71, 0xf9, 0x39, 0x24, 0xcf, 0x36, 0xb9, 0x3b, 0x02, 0x7b, 0x93, 0xf2, 0x4a, 0x94, 0xb1, 0x9c, 0x84, 0x7d, 0x72, 0x2a, 0xac, 0xd2, 0x4e, 0x42, 0xa0, 0x87, 0xbc, 0x91, 0x27, 0xd9, 0x53, 0x61, 0x31, 0x84, 0x30, 0x6e, 0x61, 0x37, 0x99, 0xf5, 0xc8, 0x45, 0xdf, 0x0f, 0xf4, 0x9d, 0x89, 0x3d, 0x29, 0xfc, 0xae, 0x44, 0xee, 0x61, 0xa3, 0x3b, 0xcb, 0xc2, 0xd7, 0xe2, 0x52, 0xfd, 0xfa, 0x35, 0x5c, 0x11, 0x65, 0x41, 0x95, 0x8e, 0xb6, 0x37, 0x3b, 0x4a, 0xba, 0xbf, 0x22, 0x56, 0x91, 0x8e, 0xfc, 0x30, 0x0c, 0x3b, 0xd7, 0x3a, 0x5a, 0x4e, 0xe7, 0x6b, 0xe4, 0x9b, 0x86, 0x45, 0x75, 0xce, 0x79, 0x07, 0x9e, 0x46, 0x75, 0x23, 0x59, 0x27, 0xe1, 0xf2, 0xec, 0xaa, 0xde, 0xa7, 0x10, 0xb8, 0x85, 0x82, 0x53, 0xb8, 0x6f, 0x46, 0xbb, 0xa5, 0x7b, 0xec, 0xac, 0x63, 0xcb, 0x99, 0x0b, 0x53, 0x10, 0xce, 0xa4, 0x25, 0x08, 0xde, 0xc9, 0xed, 0x45, 0xa6, 0x3c, 0x79, 0x2f, 0x78, 0x50, 0xe2, 0x4c, 0x58, 0x4a, 0x62, 0xbf, 0x6b, 0x0d, 0x65, 0x0f, 0xac, 0xf7, 0xe3, 0x2a, 0xe1, 0x06, 0xec, 0xaa, 0xce, 0x3f, 0x85, 0x56, 0xa8, 0x50, 0xb2, 0xec, 0xcc, 0x74, 0xd4, 0x1e, 0xb1, 0x97, 0x35, 0xda, 0x1b, 0xbb, 0xe2, 0xce, 0x92, 0x9a, 0xb9, 0x2c, 0x13, 0x8c, 0xc2, 0xaa, 0x05, 0xac, 0xc3, 0xce, 0x6e, 0x36, 0x0e, 0x68, 0x67, 0x34, 0x9e, 0x60, 0xce, 0x5a, 0x62, 0xb1, 0x3a, 0x2e, 0xd9, 0xb6, 0x34, 0x6c, 0xdf, 0xa5, 0xa4, 0xa8, 0xc7, 0x59, 0x89, 0x35, 0xa9, 0x54, 0xed, 0x46, 0xfd, 0x04, 0x19, 0x53, 0x69, 0x45, 0x05, 0xbe, 0xd8, 0x28, 0x12, 0xb7, 0xcc, 0xf2, 0xfb, 0x5d, 0xf5, 0x68, 0x09, 0x25, 0x02, 0x4a, 0x87, 0x80, 0xb7, 0x1e, 0x76, 0xb8, 0x40, 0x2e, 0x82, 0x1b, 0xc5, 0xd4, 0x34, 0x5c, 0x3e, 0xf5, 0x68, 0x36, 0x89, 0xcc, 0x02, 0x52, 0xb9, 0xe9, 0xdd, 0x6b, 0xb2, 0x79, 0x04, 0xb0, 0xf3, 0xc7, 0x25, 0x6a, 0xb2, 0x03, 0x42, 0xde, 0x2e, 0x43, 0xaa, 0x75, 0x41, 0xc7, 0x28, 0x1a, 0x34, 0x81, 0x7a, 0xe4, 0xd8, 0xd4, 0x04, 0xf5, 0xd2, 0x9d, 0xc6, 0xa2, 0x37, 0x70, 0x8c, 0xd4, 0x59, 0x24, 0x64, 0xad, 0xe0, 0x91, 0x55, 0x6f, 0x1c, 0x98, 0x4e, 0x9a, 0x99, 0x64, 0x5d, 0x55, 0xf4, 0xf0, 0x21, 0x0f, 0xee, 0xc9, 0x82, 0x66, 0xbf, 0x16, 0x9f, 0x48, 0xad, 0xd5, 0x08, 0x58, 0xdc, 0x67, 0x2e, 0x93, 0x68, 0x4f, 0x18, 0x33, 0xb1, 0x37, 0x57, 0xd3, 0xf6, 0x33, 0x3b, 0xd5, 0x26, 0x4a, 0x47, 0x01, 0xf2, 0x33, 0xe3, 0x6e, 0x27, 0x5c, 0x51, 0xa6, 0x3b, 0x31, 0xe2, 0x05, 0x25, 0x9a, 0x6a, 0x62, 0x72, 0xc5, 0xf1, 0xf2, 0x96, 0x27, 0xab, 0x68, 0x80, 0xbd, 0x2b, 0x61, 0x71, 0x98, 0xd3, 0x00, 0x0d, 0x98, 0x8f, 0xd5, 0xb3, 0x78, 0xc3, 0x04, 0x0a, 0x0a, 0x81, 0xa3, 0xdc, 0xc4, 0x00, 0x63, 0x28, 0x7c, 0x49, 0x73, 0x72, 0x70, 0x34, 0xa1, 0x5e, 0x89, 0x93, 0xc3, 0x7d, 0xe1, 0xad, 0x55, 0x67, 0x82, 0xee, 0x63, 0x0a, 0x71, 0xdc, 0xaa, 0x41, 0xeb, 0x4d, 0xfa, 0xa9, 0xee, 0xd7, 0xde, 0xb0, 0xfb, 0x89, 0x7f, 0xee, 0x1b, 0xd8, 0xc6, 0xb9, 0x20, 0xdc, 0xc1, 0xf3, 0x2d, 0xbd, 0x48, 0x27, 0x78, 0x68, 0xe0, 0xd4, 0x4f, 0x86, 0xdf, 0x09, 0x59, 0xae, 0xd1, 0x32, 0x1f, 0xd9, 0x1b, 0x32, 0xca, 0x17, 0xde, 0xb2, 0x2e, 0x81, 0x1e, 0xb8, 0x08, 0x6f, 0x24, 0x7b, 0x84, 0xeb, 0x20, 0x76, 0x03, 0x65, 0x13, 0xbb, 0x1a, 0xa8, 0xec, 0x8a, 0xde, 0x0c, 0xf1, 0x22, 0x5f, 0xed, 0x61, 0xd7, 0x72, 0x5d, 0x58, 0x65, 0xb4, 0x16, 0xf2, 0x84, 0xcb, 0xb2, 0xb3, 0xbc, 0xef, 0x1f, 0x27, 0x7b, 0xaa, 0x4d, 0xc5, 0x65, 0xdb, 0x29, 0x19, 0xeb, 0x01, 0xcf, 0x23, 0x1f, 0xb6, 0xfb, 0xfa, 0xc6, 0x7a, 0xc1, 0xb4, 0xaf, 0xb2, 0x7f, 0x8a, 0x44, 0xf0, 0x0f, 0x38, 0x5f, 0x75, 0x41, 0xa3, 0x5f, 0xf5, 0x88, 0xbe, 0x7a, 0x9a, 0xf3, 0xae, 0x55, 0x4b, 0x5f, 0x2d, 0xd1, 0x2d, 0xec, 0x2c, 0x28, 0x6a, 0xad, 0xbc, 0x3a, 0x32, 0xa4, 0x2e, 0x21, 0x00, 0xed, 0x79, 0x0b, 0x1f, 0x39, 0xdd, 0x49, 0x6c, 0x7e, 0xc6, 0xa3, 0x5d, 0xed, 0xf3, 0xef, 0x42, 0x25, 0xd7, 0xe2, 0xcb, 0xa6, 0x40, 0x25, 0xcb, 0x88, 0x36, 0xab, 0x3b, 0x6d, 0x26, 0x43, 0x82, 0xb4, 0x40, 0x69, 0xf4, 0xef, 0x1d, 0x62, 0x98, 0x97, 0xa5, 0x88, 0x2e, 0xff, 0x30, 0xe2, 0x70, 0x87, 0xeb, 0xf7, 0x99, 0x12, 0x7e, 0xe4, 0x24, 0xba, 0xeb, 0xad, 0xd6, 0xc2, 0xb9, 0xd1, 0xfe, 0xcb, 0x53, 0x21, 0xfc, 0x4b, 0xab, 0xd1, 0x00, 0x3c, 0x22, 0xd0, 0x14, 0x11, 0xac, 0x55, 0x5d, 0xee, 0x2f, 0xbb, 0x9d, 0x18, 0x2d, 0x8e, 0xfd, 0xab, 0xa3, 0xe6, 0x0a, 0x8b, 0x31, 0xf3, 0xfd, 0x9c, 0x7a, 0xda, 0x3f, 0x36, 0xce, 0xbf, 0x2c, 0xd3, 0x07, 0x23, 0x18, 0x0b, 0xb0, 0x71, 0x8f, 0xc3, 0x6d, 0xd3, 0xe1, 0xa1, 0x96, 0x4a, 0xde, 0xc3, 0x26, 0xfe, 0xdf, 0xb0, 0xd4, 0xd3, 0x06, 0x8e, 0x7f, 0x3c, 0xc6, 0x96, 0xcf, 0x54, 0xa5, 0xc6, 0x1a, 0x2b, 0x40, 0xd5, 0x84, 0x5d, 0x90, 0x6c, 0x6b, 0xea, 0x6d, 0x93, 0x02, 0x41, 0x50, 0x6a, 0x3b, 0x9e, 0x5d, 0x19, 0xeb, 0x96, 0xa1, 0x09, 0x29, 0xf1, 0x98, 0x55, 0xf6, 0xb7, 0xf2, 0x7b, 0x24, 0x8d, 0x96, 0x58, 0x70, 0x42, 0xe8, 0x53, 0xf2, 0xa6, 0x47, 0xd8, 0xb7, 0x9b, 0xda, 0x08, 0xac, 0x6e, 0x8d, 0xae, 0xbd, 0x67, 0x56, 0x75, 0x3f, 0x9e, 0xbd, 0x59, 0x8b, 0x11, 0x9b, 0x5c, 0xec, 0xf4, 0x22, 0x7a, 0xbc, 0x48, 0x1d, 0xde, 0xc9, 0xaf, 0x79, 0x56, 0xfe, 0x7f, 0x05, 0x05, 0x3f, 0x15, 0x76, 0x58, 0x94, 0x6c, 0xae, 0x3b, 0x8a, 0xee, 0x3e, 0x8c, 0xd6, 0x89, 0x29, 0xcf, 0x3c, 0x06, 0xeb, 0x24, 0xaf, 0x96, 0xb9, 0x77, 0xba, 0xae, 0x0b, 0xf7, 0x1e, 0x15, 0x58, 0xc9, 0xbd, 0x3c, 0x20, 0xfd, 0xb6, 0xcd, 0x30, 0xc1, 0xd2, 0x86, 0x22, 0xd4, 0x1f, 0x48, 0x23, 0x3e, 0xda, 0x6b, 0xf9, 0x3f, 0x92, 0x55, 0x44, 0x85, 0x8b, 0x4b, 0x03, 0xa1, 0x61, 0x86, 0x5b, 0xbc, 0xed, 0x8a, 0x94, 0x86, 0x6c, 0xb3, 0x65, 0x70, 0xde, 0x11, 0x71, 0x1b, 0xad, 0x76, 0x11, 0x10, 0x8f, 0xcc, 0x54, 0xb1, 0xad, 0xac, 0x44, 0x70, 0x05, 0x2d, 0x6b, 0x3e, 0x0d, 0xfa, 0x96, 0x46, 0x99, 0xa8, 0xd9, 0xdc, 0xfe, 0x46, 0xd3, 0xb0, 0x78, 0x35, 0x33, 0x48, 0xc9, 0x3a, 0x7b, 0xad, 0x23, 0xd1, 0x05, 0x64, 0x48, 0xc4, 0x43, 0x9f, 0xf0, 0xfd, 0x4a, 0xb5, 0x6b, 0x98, 0x92, 0xd0, 0x87, 0x3d, 0xf7, 0xe5, 0xb4, 0xad, 0x04, 0xea, 0x66, 0x9a, 0x71, 0x43, 0xbb, 0xbc, 0xea, 0x7d, 0x5e, 0x21, 0x13, 0x3e, 0xab, 0xc5, 0xc8, 0x7c, 0x14, 0x62, 0xa9, 0xee, 0xc3, 0x89, 0xd6, 0xc0, 0x80, 0xf2, 0xf7, 0x8b, 0xd6, 0x11, 0x80, 0x84, 0x71, 0xe9, 0x33, 0xf4, 0xcb, 0x25, 0xe6, 0xe8, 0x08, 0x65, 0x86, 0x29, 0x1e, 0xd6, 0x5c, 0x6e, 0x38, 0x05, 0x8f, 0xd1, 0x5d, 0xf5, 0xea, 0x80, 0x4c, 0x6f, 0xe0, 0xb5, 0xab, 0x99, 0xcd, 0xe8, 0x61, 0xca, 0x7f, 0x43, 0x41, 0x9d, 0xf5, 0x56, 0xe8, 0x44, 0x66, 0x0c, 0xe8, 0x1f, 0x86, 0xdd, 0x26, 0x8d, 0x04, 0x46, 0x80, 0x03, 0x57, 0x76, 0xb3, 0x5b, 0xba, 0x4b, 0x7c, 0x6e, 0x75, 0x7c, 0xfe, 0xe4, 0x5f, 0x18, 0x64, 0x4b, 0xa1, 0x2f, 0xc7, 0x67, 0xbc, 0xce, 0x52, 0xc9, 0xce, 0x31, 0xa4, 0xa3, 0x11, 0x35, 0x75, 0xdb, 0xa4, 0x0c, 0x7d, 0x5e, 0x8e, 0x34, 0x91, 0xb7, 0x00, 0xaa, 0x10, 0xe0, 0xda, 0x5b, 0x7d, 0x58, 0x71, 0xdb, 0x6d, 0x75, 0x8f, 0x59, 0xa4, 0xfc, 0xbc, 0xd3, 0x7b, 0xef, 0xbc, 0x86, 0x85, 0xa6, 0x59, 0xa9, 0x71, 0x21, 0x63, 0x5a, 0x32, 0x9d, 0xf4, 0xd9, 0x5e, 0x65, 0xf8, 0xf4, 0xd4, 0xeb, 0xed, 0xc2, 0xa2, 0x17, 0xe8, 0x94, 0x26, 0xdf, 0xd9, 0x29, 0x73, 0x18, 0x0f, 0x21, 0xf5, 0x8c, 0xff, 0xb4, 0x59, 0x4c, 0x41, 0xa4, 0xa7, 0x48, 0xdb, 0x70, 0xb1, 0x1c, 0xc2, 0xcb, 0xb1, 0x2d, 0x9e, 0x4c, 0x2e, 0xf5, 0xce, 0x67, 0x1f, 0x9b, 0xac, 0x9c, 0x53, 0xc7, 0x12, 0xee, 0x10, 0xb4, 0x1d, 0x97, 0xfb, 0x87, 0x30, 0xfa, 0x37, 0xdf, 0x3c, 0xd9, 0xd1, 0xad, 0x3f, 0xc8, 0x5c, 0x46, 0x0b, 0xe2, 0xd8, 0xb6, 0x49, 0xba, 0xd9, 0x57, 0xbd, 0x95, 0xe5, 0xa3, 0xcc, 0xd6, 0x1d, 0x47, 0x3b, 0xb9, 0x1f, 0x78, 0x39, 0x44, 0x2c, 0x8a, 0xa0, 0x7b, 0x86, 0xbf, 0x78, 0xd4, 0x1c, 0x5d, 0xbd, 0xea, 0x69, 0x03, 0x61, 0x75, 0x9a, 0x3c, 0x95, 0x7a, 0xef, 0x55, 0x45, 0xbf, 0x63, 0x6c, 0xe1, 0x82, 0x8f, 0xca, 0x63, 0x6a, 0xcc, 0x73, 0x8e, 0xbe, 0x98, 0xfa, 0x73, 0xd5, 0x3b, 0x9a, 0x3a, 0xce, 0xaa, 0x83, 0x1f, 0x81, 0xab, 0x72, 0xbb, 0xb4, 0x3a, 0x84, 0x85, 0x93, 0x2b, 0x4c, 0x98, 0x5a, 0x12, 0x23, 0xb7, 0x55, 0x60, 0xbf, 0x8e, 0x0a, 0xce, 0x08, 0x3a, 0xb5, 0xff, 0x26, 0x0c, 0xf4, 0x60, 0xdf, 0x8a, 0xc4, 0x54, 0x20, 0xb7, 0xac, 0x8e, 0xd9, 0x95, 0x38, 0xbd, 0x0e, 0xe7, 0xa9, 0x6f, 0x2c, 0x3b, 0xeb, 0x2f, 0x99, 0x28, 0xc7, 0xf1, 0x8e, 0xd5, 0x5a, 0xb1, 0x29, 0xba, 0xc6, 0x56, 0xbe, 0xab, 0x27, 0xdc, 0x6f, 0x12, 0xc9, 0xb2, 0xfc, 0x7c, 0x98, 0x61, 0xdc, 0x57, 0xd7, 0x6f ],
+const [ 0x43, 0xb1, 0xac, 0x9c, 0x15, 0xfc, 0xc2, 0xb0, 0x16, 0x8a, 0xa9, 0x86, 0x2d, 0xb0, 0x30, 0x44, 0x41, 0xce, 0x0c, 0x56, 0x59, 0xdb, 0x1f, 0xa8, 0x02, 0x44, 0xfa, 0x18, 0xf2, 0xf7, 0xa0, 0x2b, 0xea, 0xba, 0x8c, 0xfe, 0xe1, 0xc2, 0xf6, 0x80, 0x5e, 0x81, 0x53, 0xdf, 0x26, 0xbf, 0x1b, 0x40, 0x17, 0xec, 0xce, 0xb3, 0x54, 0xb5, 0x39, 0x66, 0xa2, 0xd5, 0xf6, 0x19, 0x12, 0x2e, 0x32, 0xd1, 0xe1, 0x18, 0xb2, 0xd1, 0x9c, 0xf9, 0x18, 0xc6, 0x87, 0x16, 0x63, 0x42, 0x40, 0xa8, 0xb6, 0x6b, 0xa0, 0x33, 0x5a, 0xf5, 0xe2, 0x13, 0x05, 0x4d, 0x07, 0x57, 0x5d, 0x17, 0x78, 0xd3, 0xb8, 0xdb, 0xee, 0x71, 0x26, 0xfb, 0x8f, 0xc8, 0xb1, 0xe9, 0x5a, 0xf0, 0xe3, 0x96, 0xc4, 0x94, 0x89, 0x2e, 0xa3, 0x48, 0xb7, 0x02, 0x4c, 0x1d, 0x0c, 0xc6, 0xf8, 0x73, 0x37, 0xfc, 0x6d, 0x0f, 0xba, 0xb0, 0xda, 0x6e, 0xee, 0x66, 0x02, 0x58, 0x48, 0x51, 0x9c, 0xb8, 0xda, 0xc5, 0xfa, 0xaa, 0x1d, 0xef, 0xea, 0xd6, 0xed, 0xc4, 0xda, 0xfd, 0xd5, 0x37, 0x3f, 0xd1, 0x8d, 0xaf, 0x37, 0x0a, 0xc1, 0xb8, 0x6c, 0xb6, 0x14, 0xf8, 0x3c, 0xd0, 0x65, 0x66, 0x18, 0x15, 0x51, 0xb6, 0x2a, 0x13, 0xf9, 0x17, 0x3b, 0x83, 0x05, 0x21, 0xd3, 0xd8, 0xe9, 0x09, 0xa2, 0x18, 0x66, 0x18, 0x1e, 0xeb, 0x54, 0x5b, 0x6e, 0xf2, 0xa0, 0x9b, 0x87, 0x59, 0x91, 0x8f, 0x95, 0xb0, 0x4f, 0x51, 0x9c, 0xf6, 0xa5, 0x0f, 0x5f, 0xf7, 0x06, 0x03, 0x81, 0xd9, 0xce, 0xa5, 0xea, 0xf1, 0xcb, 0x1f, 0x6c, 0xdb, 0xfc, 0x01, 0xa6, 0xc9, 0x98, 0x36, 0x29, 0x1b, 0x52, 0x37, 0xda, 0x30, 0xdc, 0x7e, 0x98, 0x7c, 0xaa, 0x3e, 0x1e, 0xdb, 0xf8, 0x51, 0x2a, 0x25, 0x0e, 0x71, 0xdf, 0x03, 0xc3, 0xac, 0x67, 0x01, 0x40, 0x12, 0xde, 0xe4, 0x06, 0xb1, 0x6b, 0x3d, 0x33, 0xc3, 0xb0, 0x3e, 0x00, 0x25, 0x65, 0xcd, 0x8f, 0x0b, 0x3f, 0xd7, 0xe4, 0xf3, 0x17, 0xe7, 0x31, 0xd7, 0x48, 0xf7, 0x56, 0xa7, 0x59, 0x86, 0xa8, 0xf6, 0xdc, 0xea, 0xf1, 0xf4, 0x95, 0xe8, 0xb9, 0x9c, 0xdf, 0x82, 0xc4, 0x2e, 0x4c, 0x10, 0xdc, 0xe0, 0x8c, 0x92, 0xd1, 0xd0, 0x90, 0x45, 0xbd, 0x3e, 0xee, 0x74, 0x8c, 0xf8, 0x88, 0x91, 0xbc, 0x15, 0x69, 0x84, 0x62, 0xe6, 0xef, 0x43, 0x6e, 0x2a, 0x2f, 0xa3, 0x2f, 0x81, 0x95, 0x6e, 0x1a, 0x24, 0xcb, 0xb5, 0xc7, 0xd2, 0xdc, 0x67, 0x3c, 0x0e, 0x9a, 0x23, 0x6e, 0x87, 0x3d, 0x4b, 0x05, 0xd8, 0x4c, 0x5a, 0x60, 0x71, 0xc1, 0x77, 0xd9, 0xd5, 0x68, 0x4a, 0x4a, 0x07, 0x88, 0x0e, 0xd0, 0x3e, 0xc5, 0xe7, 0xce, 0xe0, 0x45, 0x76, 0x35, 0xae, 0x12, 0xab, 0x03, 0x3c, 0xbf, 0xdb, 0x0a, 0xa5, 0x4f, 0x13, 0xf3, 0x7c, 0x52, 0xab, 0x82, 0x06, 0x51, 0x1e, 0x1c, 0xa6, 0x6c, 0x19, 0x86, 0x98, 0x42, 0xd1, 0xef, 0xe2, 0x11, 0x9a, 0x31, 0x88, 0x1e, 0xb6, 0x54, 0x00, 0x58, 0x6a, 0x53, 0xe5, 0x38, 0x57, 0x23, 0xf0, 0xeb, 0x08, 0xf2, 0x23, 0xb3, 0xc8, 0xad, 0x47, 0x8b, 0xb6, 0xc4, 0x99, 0x0a, 0x1b, 0x31, 0xc1, 0x89, 0xfa, 0xb7, 0x03, 0x88, 0xe9, 0x67, 0xb9, 0x4e, 0x20, 0x69, 0x01, 0xd0, 0xd0, 0xf9, 0xb3, 0xd4, 0xb6, 0xb0, 0x96, 0x56, 0xef, 0x05, 0xd3, 0x2b, 0x0e, 0x13, 0xa9, 0xe4, 0x6c, 0x9d, 0x63, 0xf5, 0xbf, 0x4f, 0x87, 0x17, 0xee, 0x46, 0x51, 0xea, 0x24, 0xd3, 0x5f, 0xdf, 0x24, 0x7c, 0xae, 0x55, 0xdc, 0x44, 0xc5, 0x02, 0x3c, 0x2d, 0x30, 0x95, 0x48, 0xfa, 0x30, 0x99, 0x6c, 0x39, 0xb1, 0x9d, 0x10, 0x81, 0x7c, 0x92, 0x6d, 0xf9, 0xae, 0x74, 0x9f, 0x19, 0x69, 0x2d, 0xfb, 0xb5, 0xc9, 0xb6, 0xa2, 0x37, 0x1a, 0x7f, 0x56, 0x2c, 0x48, 0x11, 0x8d, 0x02, 0x96, 0xf2, 0xc4, 0x0f, 0x93, 0xc8, 0x16, 0xd6, 0x4b, 0xc2, 0x0d, 0x86, 0xba, 0x34, 0xb8, 0xc4, 0x86, 0x81, 0xfe, 0xaa, 0xed, 0x3e, 0x31, 0x10, 0xfb, 0x94, 0xe7, 0x0a, 0x01, 0xe6, 0x05, 0xb1, 0x44, 0xb4, 0x1c, 0x27, 0xf2, 0xc0, 0xf9, 0xd5, 0x5a, 0x6f, 0x77, 0xf7, 0x5b, 0x71, 0x98, 0x5b, 0x1d, 0xa4, 0xd4, 0x65, 0x00, 0x36, 0xb1, 0x57, 0xd2, 0x0b, 0x94, 0xcf, 0x45, 0x5e, 0xd7, 0x92, 0xa0, 0xaa, 0x1b, 0x87, 0xb4, 0xcb, 0xe0, 0x07, 0x12, 0x60, 0x53, 0x54, 0x7b, 0x75, 0x66, 0x66, 0x98, 0x5f, 0x26, 0xee, 0xeb, 0xe6, 0x4a, 0x95, 0x06, 0xaa, 0x07, 0x84, 0xfb, 0xbf, 0x2c, 0x2a, 0x13, 0x9b, 0x6a, 0x39, 0xc3, 0x32, 0xf3, 0xf2, 0xdb, 0x5f, 0x48, 0xa3, 0x01, 0x86, 0x4b, 0x6e, 0x5e, 0x78, 0x9c, 0x4b, 0x97, 0x96, 0x22, 0x50, 0xff, 0x3a, 0xe8, 0x31, 0x0b, 0x52, 0x2b, 0x03, 0x06, 0x4e, 0xb1, 0x45, 0x05, 0x3d, 0x5c, 0x20, 0x1e, 0x32, 0xfe, 0xee, 0xd5, 0xed, 0x6f, 0xfa, 0xd7, 0xb7, 0xdd, 0x86, 0xeb, 0x8e, 0x64, 0x13, 0x25, 0x82, 0xde, 0xdc, 0x5c, 0x5f, 0xfd, 0xa4, 0xdf, 0x8c, 0x97, 0xb1, 0x64, 0x33, 0x40, 0x19, 0x41, 0xa2, 0x1e, 0x3c, 0xdf, 0xf2, 0xf9, 0x92, 0x6b, 0xe6, 0x92, 0xa7, 0xce, 0x15, 0x36, 0x63, 0xe0, 0x4c, 0x92, 0x8f, 0xd8, 0x2e, 0xc9, 0x95, 0x08, 0x1d, 0xc4, 0x87, 0xc7, 0x5e, 0xca, 0x63, 0xae, 0x77, 0x50, 0x96, 0x07, 0xdc, 0x12, 0xbe, 0x82, 0xcb, 0x62, 0xb4, 0x2a, 0x75, 0xc0, 0xca, 0x98, 0x5e, 0xac, 0x51, 0x66, 0x06, 0xb8, 0x5f, 0xe7, 0xc9, 0xe1, 0xcf, 0x15, 0x04, 0x1f, 0x88, 0xcb, 0x79, 0x3b, 0x03, 0x35, 0xf5, 0xe1, 0x07, 0x84, 0x30, 0xf6, 0xb7, 0xe6, 0xf4, 0x2b, 0xcf, 0xb5, 0x81, 0xd3, 0x2b, 0xee, 0x31, 0xf2, 0x89, 0xe6, 0x58, 0x96, 0x8f, 0x38, 0x6e, 0x6a, 0x10, 0x02, 0x70, 0x88, 0x8b, 0x51, 0x83, 0x8f, 0xf4, 0xd9, 0xdb, 0xf5, 0xb7, 0xea, 0xdb, 0x9f, 0xfb, 0x9f, 0x7d, 0xaf, 0x23, 0x59, 0xf5, 0x9e, 0x9b, 0x6b, 0x91, 0x8a, 0xd1, 0x17, 0xe4, 0xd1, 0x81, 0xba, 0x23, 0xde, 0x36, 0x43, 0xcf, 0x43, 0x0e, 0xe9, 0x94, 0x08, 0xbd, 0x1e, 0x72, 0x43, 0xd4, 0xbe, 0x1a, 0xe9, 0x44, 0x8d, 0x9b, 0xe4, 0x1d, 0xe0, 0x3d, 0x66, 0x9c, 0x9a, 0xad, 0x7c, 0x65, 0x5a, 0x5b, 0xe6, 0x0d, 0xf3, 0x21, 0x26, 0xdb, 0x1d, 0x25, 0xd7, 0xd0, 0x6a, 0x00, 0x40, 0xe4, 0x7b, 0x20, 0x29, 0x93, 0x73, 0x6a, 0xed, 0x98, 0xac, 0x24, 0xd1, 0xf9, 0xa9, 0x13, 0x94, 0x43, 0x4c, 0xe0, 0x48, 0x17, 0x49, 0xc1, 0x60, 0xe5, 0xdb, 0x55, 0x09, 0xf8, 0xb6, 0xcf, 0xbe, 0xb3, 0x3c, 0x56, 0x16, 0x1a, 0xf3, 0xac, 0xe1, 0x94, 0x37, 0x0e, 0x74, 0xee, 0x2c, 0x5c, 0x41, 0xa4, 0xf7, 0x7a, 0xab, 0x5c, 0x2e, 0xf6, 0x18, 0xb4, 0x8c, 0xeb, 0x47, 0x3d, 0xea, 0x25, 0xe4, 0xc7, 0x6a, 0x85, 0x59, 0xe0, 0xf6, 0xa7, 0xe8, 0x97, 0xe9, 0xc3, 0xf6, 0x86, 0x0b, 0xd1, 0xaa, 0x0f, 0xc3, 0xf1, 0xb7, 0xe5, 0x88, 0x09, 0x76, 0xce, 0x99, 0xb0, 0x38, 0xa8, 0xee, 0x4b, 0xda, 0xaa, 0x6e, 0x75, 0x9a, 0xed, 0x62, 0xa5, 0x28, 0x2b, 0x2a, 0x0a, 0x01, 0xc6, 0x2e, 0xba, 0xf8, 0x0c, 0x18, 0x0c, 0x15, 0xb9, 0x41, 0x42, 0xa3, 0xbd, 0x68, 0x6c, 0x85, 0x40, 0xaa, 0x89, 0xc9, 0xe4, 0xae, 0xee, 0x80, 0x4a, 0x21, 0xec, 0xcc, 0xd7, 0x62, 0xad, 0x3a, 0xb8, 0x7e, 0x5f, 0x52, 0x23, 0x5e, 0x94, 0x6d, 0xe0, 0x3f, 0xe9, 0xc7, 0x09, 0x63, 0xe6, 0xd5, 0x0e, 0x06, 0x26, 0xd9, 0xfb, 0x94, 0xb8, 0xb3, 0xfe, 0x19, 0xc4, 0xfa, 0x24, 0xf9, 0x72, 0x4b, 0x63, 0xe1, 0x07, 0xe1, 0xdd, 0xfd, 0x52, 0x66, 0x63, 0x6c, 0x46, 0x09, 0x38, 0xf1, 0xe8, 0xd1, 0x18, 0xeb, 0x6c, 0x31, 0x79, 0x87, 0x9a, 0xdc, 0x11, 0x34, 0x77, 0xda, 0x98, 0x57, 0x22, 0xdc, 0xcf, 0x40, 0xfc, 0xcd, 0xc1, 0x5d, 0x0b, 0xa9, 0x49, 0xae, 0xa1, 0x92, 0xd4, 0x79, 0x38, 0x21, 0x68, 0x3f, 0xa1, 0xfa, 0xe6, 0xee, 0x5e, 0xa3, 0x8c, 0x58, 0x4c, 0x96, 0xbd, 0xe4, 0x85, 0x94, 0x05, 0x84, 0x84, 0x3d, 0x58, 0xe7, 0x8a, 0xde, 0x9a, 0xef, 0x41, 0x8a, 0x65, 0x65, 0x9f, 0x6c, 0x06, 0xec, 0x0e, 0x5b, 0xc8, 0x33, 0xca, 0xaf, 0x76, 0x6f, 0x8a, 0x53, 0x1b, 0x09, 0x62, 0x1c, 0x0c, 0x93, 0xe8, 0x59, 0x28, 0x01, 0x96, 0xac, 0x5f, 0x16, 0x6f, 0x18, 0x71, 0x1c, 0xe5, 0x5a, 0xf8, 0xd8, 0xfb, 0x7d, 0xa9, 0xbd, 0xa7, 0xa9, 0xd7, 0x60, 0x7a, 0x3c, 0x38, 0x2c, 0x82, 0x1b, 0xec, 0x57, 0x70, 0x4b, 0xbb, 0x14, 0xf6, 0xbb, 0x9f, 0x0b, 0x73, 0x64, 0x82, 0x06, 0xd2, 0x94, 0x48, 0xed, 0xaf, 0x87, 0x10, 0xf4, 0xbc, 0x38, 0xb7, 0x13, 0x64, 0x76, 0x9e, 0xb7, 0xae, 0x3a, 0xae, 0xb7, 0x63, 0x38, 0x99, 0x89, 0x73, 0xb4, 0x62, 0xb6, 0x95, 0x97, 0x1f, 0x8b, 0x2e, 0xc2, 0xfe, 0x11, 0x74, 0xa2, 0x86, 0x40, 0xd3, 0x05, 0x1f, 0x70, 0x90, 0x2c, 0xd5, 0x10, 0xac, 0x21, 0x59, 0x9a, 0x0b, 0x4b, 0x48, 0xc6, 0xd5, 0x3f, 0xb0, 0xff, 0x1d, 0xd9, 0xd1, 0x13, 0xc0, 0x8c, 0x20, 0x2e, 0x90, 0xf6, 0x92, 0x09, 0xb2, 0xb7, 0x16, 0x5f, 0x45, 0x84, 0x63, 0xa1, 0x44, 0x77, 0xf5, 0xea, 0xae, 0xa9, 0x52, 0x35, 0xe4, 0x03, 0x92, 0xce, 0x52, 0x51, 0x1e, 0x06, 0x51, 0x98, 0xb8, 0x2b, 0x4c, 0xaa, 0xbc, 0xb7, 0x22, 0xf7, 0xa5, 0xc8, 0xcc, 0xa6, 0xd2, 0xd0, 0x40, 0xe5, 0x8b, 0x8e, 0x95, 0x7d, 0x3f, 0x3d, 0x67, 0xa9, 0x0f, 0x0b, 0x7d, 0x28, 0x91, 0xcc, 0xa9, 0x91, 0xcd, 0xf0, 0xf0, 0xe7, 0x8c, 0xb2, 0xeb, 0x6d, 0xd3, 0x93, 0x6d, 0xbb, 0xaa, 0x07, 0x67, 0x12, 0x21, 0x6e, 0x08, 0xed, 0x95, 0x45, 0x28, 0xd8, 0x30, 0x9e, 0xe6, 0x85, 0xaf, 0xcd, 0x90, 0x1d, 0x68, 0x65, 0xc4, 0xd4, 0x8b, 0x63, 0xd5, 0xc0, 0xa8, 0xa8, 0x70, 0xeb, 0x71, 0xad, 0x80, 0xa7, 0xc2, 0x72, 0x4e, 0x21, 0xde, 0xb7, 0xed, 0x39, 0xfc, 0x6f, 0xd5, 0x91, 0x02, 0x72, 0xce, 0xe4, 0x90, 0x72, 0x10, 0x9a, 0x40, 0x30, 0xa8, 0x99, 0x2c, 0xef, 0x1d, 0x5d, 0xb1, 0x29, 0x54, 0x4b, 0x73, 0x82, 0xb1, 0x42, 0xa1, 0xfa, 0x7f, 0x74, 0x7b, 0x66, 0x92, 0x74, 0x11, 0x21, 0x2a, 0x8f, 0x4d, 0xff, 0x1b, 0x60, 0x33, 0x82, 0x2b, 0x9f, 0x68, 0x51, 0xbc, 0x3a, 0xf1, 0xe5, 0xab, 0xa7, 0x3e, 0x86, 0x77, 0x78, 0x67, 0x76, 0xa6, 0x30, 0xb5, 0x6c, 0x64, 0x55, 0x64, 0x43, 0x6e, 0xc6, 0xa7, 0xf4, 0x2e, 0x4f, 0xed, 0xc2, 0x27, 0x7b, 0x63, 0xb4, 0x94, 0xa9, 0xba, 0x48, 0x4c, 0x62, 0x2a, 0x66, 0xe9, 0xea, 0xb7, 0x93, 0x29, 0x15, 0xb3, 0x67, 0x95, 0x5c, 0x84, 0x41, 0x60, 0x30, 0xa7, 0x39, 0x91, 0x8f, 0xf5, 0x56, 0x65, 0xd4, 0x25, 0x02, 0xee, 0xd3, 0x93, 0xba, 0x01, 0x25, 0x3f, 0x0a, 0x4f, 0xc1, 0x19, 0xb9, 0xd2, 0xcc, 0x7c, 0x41, 0x6b, 0xb3, 0xf8, 0x81, 0xc9, 0x76, 0x54, 0xb6, 0x8c, 0x47, 0xd3, 0xa8, 0xaa, 0x53, 0xb7, 0x21, 0x12, 0xe0, 0x04, 0xa3, 0x90, 0x98, 0x86, 0x5a, 0xf1, 0x24, 0x15, 0x50, 0x67, 0xfd, 0x18, 0xe0, 0x2f, 0x7f, 0x48, 0x6d, 0x70, 0x40, 0xb7, 0x54, 0x67, 0x9f, 0x10, 0x1e, 0xc1, 0xa0, 0x20, 0xfb, 0x48, 0xf7, 0x95, 0x6c, 0xc2, 0x62, 0x06, 0x3f, 0x16, 0x3c, 0x34, 0xc0, 0xb1, 0x50, 0x90, 0x2e, 0x28, 0xeb, 0xfd, 0x6c, 0x1f, 0x35, 0xd6, 0xf9, 0x69, 0xc0, 0x33, 0x22, 0x71, 0x62, 0x68, 0x76, 0xd8, 0x40, 0xcf, 0x7b, 0x5f, 0x2c, 0xc8, 0x9f, 0x08, 0x31, 0xfd, 0x71, 0x78, 0x6b, 0xeb, 0x11, 0xa0, 0x1c, 0x9e, 0xe5, 0x9c, 0xfd, 0xbb, 0x8e, 0xdb, 0xd2, 0xc4, 0x1b, 0x81, 0x41, 0x98, 0x7c, 0x09, 0xe4, 0x39, 0x39, 0x2f, 0x9d, 0xd2, 0x64, 0x0d, 0x2a, 0xf9, 0xcc, 0x84, 0xf9, 0x31, 0x73, 0xdd, 0x3d, 0xb3, 0x42, 0xb0, 0x41, 0x6e, 0xfc, 0x05, 0xfc, 0x4c, 0x71, 0xba, 0xe7, 0xb7, 0xf4, 0x25, 0x0b, 0x5c, 0x0e, 0xf9, 0x5e, 0x2e, 0x74, 0x6e, 0x4f, 0xae, 0x37, 0x9c, 0xa0, 0x6a, 0x3b, 0x28, 0x74, 0xc4, 0xea, 0x23, 0xa9, 0xf5, 0x29, 0x2f, 0x67, 0x52, 0x8b, 0xe4, 0xf9, 0xcd, 0xc5, 0x72, 0xdc, 0xbe, 0x63, 0x87, 0x16, 0xe4, 0xb9, 0x73, 0xc9, 0xa6, 0x1b, 0x8a, 0x08, 0x9f, 0x51, 0xc9, 0xe9, 0x5a, 0x45, 0xbd, 0xdc, 0x5a, 0xff, 0xa1, 0x3b, 0x5e, 0xd3, 0xc7, 0x22, 0xe3, 0xd9, 0x39, 0x80, 0xe9, 0x9e, 0x9f, 0x6e, 0xfa, 0x19, 0x63, 0xc0, 0x69, 0xe1, 0x14, 0xda, 0xd8, 0x9d, 0x08, 0xc6, 0xfc, 0xbb, 0x46, 0x83, 0xa5, 0x65, 0xa2, 0x9f, 0xf8, 0xb0, 0x2a, 0x08, 0xff, 0x17, 0xc1, 0x1f, 0x65, 0x29, 0x0a, 0x0e, 0x7a, 0x7e, 0x88, 0x5b, 0x7d, 0xef, 0x03, 0xbe, 0x1b, 0x06, 0x2d, 0x30, 0x33, 0xb4, 0x85, 0x45, 0xdc, 0x42, 0x7c, 0xbb, 0xa9, 0x8a, 0xd6, 0x53, 0x2c, 0x67, 0x54, 0xdf, 0xb8, 0x6a, 0x90, 0x9d, 0x6b, 0xcf, 0x28, 0xc3, 0x6c, 0xaf, 0x1e, 0x5b, 0x72, 0x77, 0x7f, 0x51, 0x86, 0x98, 0x43, 0xcb, 0x09, 0x80, 0x75, 0xb8, 0xf8, 0xca, 0x94, 0xac, 0x6f, 0xb1, 0x38, 0xeb, 0x6c, 0xcb, 0xf8, 0xc4, 0xd6, 0xf4, 0x8c, 0x20, 0xbe, 0x87, 0x2f, 0x5a, 0xe4, 0xd5, 0x47, 0x51, 0x7d, 0xcf, 0x48, 0xbc, 0x33, 0x06, 0xd6, 0xbe, 0x6e, 0xd6, 0x2a, 0xbb, 0xd2, 0xdd, 0xb6, 0x69, 0x09, 0xb2, 0x0c, 0x2a, 0xc2, 0xd4, 0xfc, 0x99, 0xf9, 0xe1, 0xfc, 0x62, 0x79, 0x09, 0xce, 0x58, 0xa0, 0xc1, 0x5c, 0xc1, 0x63, 0xbc, 0xe7, 0xf4, 0x91, 0x17, 0x60, 0x27, 0x5c, 0xd4, 0x16, 0x82, 0x15, 0x89, 0x92, 0x78, 0x37, 0x59, 0xbf, 0x56, 0xa7, 0x24, 0x4f, 0x1c, 0x3a, 0xfb, 0x59, 0x8d, 0x78, 0xd7, 0x47, 0x82, 0xa0, 0x8a, 0xef, 0x83, 0xec, 0xf5, 0x00, 0x98, 0x15, 0x7c, 0xa0, 0x5d, 0x1a, 0xb7, 0x53, 0x55, 0x3e, 0x6a, 0x1f, 0x80, 0x4f, 0xb8, 0xee, 0x30, 0x2e, 0x93, 0x33, 0x18, 0x8c, 0x77, 0xd0, 0xa6, 0xf2, 0x58, 0x38, 0x93, 0x04, 0xd9, 0xd0, 0xb8, 0x06, 0xbe, 0x9c, 0x23, 0x9f, 0xa4, 0x17, 0x6a, 0xdd, 0xef, 0x62, 0x3f, 0x7a, 0x05, 0xa1 ],
+const [ 0x0a, 0x72, 0xca, 0x03, 0xc9, 0x97, 0x7d, 0xcd, 0x01, 0x69, 0xda, 0x7a, 0xf1, 0xfa, 0x3f, 0x3f, 0x02, 0xe3, 0x74, 0x17, 0x58, 0x86, 0xde, 0x21, 0xa7, 0x96, 0xf5, 0x43, 0x48, 0xda, 0xf8, 0x14, 0x8c, 0x2d, 0xdf, 0xf9, 0x50, 0xca, 0x91, 0x8e, 0xd1, 0xc6, 0x57, 0x47, 0xc2, 0xde, 0x90, 0x57, 0x9c, 0x73, 0xa7, 0xd0, 0x36, 0xd3, 0x43, 0x0c, 0x95, 0xba, 0xbd, 0x4d, 0x05, 0x19, 0xd7, 0xa0, 0x68, 0x15, 0xab, 0x07, 0xcf, 0x53, 0xe1, 0xd6, 0x47, 0x73, 0x25, 0x5e, 0xf6, 0xda, 0xd8, 0xc9, 0x66, 0xb5, 0x06, 0x45, 0x20, 0x3a, 0x99, 0x65, 0x7d, 0x31, 0xcc, 0xc3, 0xb9, 0xb4, 0xe2, 0xeb, 0x49, 0x33, 0x17, 0x74, 0x6e, 0xbb, 0xd7, 0x70, 0x0b, 0x77, 0x2e, 0x07, 0xb4, 0x77, 0x80, 0x5e, 0x07, 0xb0, 0x7a, 0xbe, 0x3f, 0x44, 0x48, 0xf2, 0x06, 0x04, 0x08, 0xf0, 0x8b, 0x33, 0x7f, 0xbc, 0xd5, 0x8d, 0x0b, 0x8a, 0x57, 0x88, 0xd9, 0x23, 0xc4, 0xda, 0x58, 0x89, 0x24, 0x3b, 0xee, 0xde, 0x28, 0x6c, 0xe9, 0x82, 0xba, 0x78, 0xb8, 0x7c, 0xd9, 0x3a, 0x5b, 0x1b, 0xa4, 0x1f, 0x18, 0xdc, 0xb4, 0x2e, 0x70, 0x8f, 0xaf, 0x45, 0x51, 0xb6, 0x1a, 0xa5, 0x8d, 0x2e, 0x6f, 0xb0, 0x8b, 0x11, 0x70, 0xf2, 0x3d, 0xda, 0xba, 0x5f, 0x51, 0xca, 0x9d, 0xdb, 0xac, 0x8b, 0x2b, 0x00, 0x14, 0x14, 0x8f, 0x1b, 0x2c, 0xcc, 0xa1, 0x77, 0xa6, 0xf2, 0xb7, 0xdf, 0xb4, 0x3c, 0xbd, 0x5e, 0xbf, 0xbe, 0x88, 0x49, 0x5c, 0x0e, 0x67, 0x7f, 0x7c, 0xa6, 0xfb, 0xf0, 0xe2, 0x89, 0x49, 0x5c, 0xdb, 0x2a, 0x0e, 0x5d, 0x29, 0x89, 0x52, 0xa8, 0x40, 0x9f, 0x40, 0x90, 0xb5, 0xfc, 0x35, 0xcc, 0xf3, 0xaf, 0x17, 0x79, 0x30, 0x66, 0xe8, 0x63, 0x9f, 0xd6, 0x9b, 0x80, 0xe7, 0x5d, 0x26, 0xbd, 0xd5, 0xe6, 0xd8, 0xfd, 0x4d, 0x0e, 0xed, 0x5f, 0x87, 0x85, 0x60, 0xc0, 0x78, 0xb6, 0x00, 0x82, 0x8d, 0xaa, 0xc6, 0x8b, 0x9f, 0x29, 0x66, 0x90, 0x24, 0x23, 0x24, 0x93, 0xa2, 0x4f, 0xe9, 0xaa, 0x6a, 0x12, 0x96, 0x03, 0x82, 0xa2, 0x98, 0x25, 0xe3, 0x6b, 0xbd, 0x78, 0xe4, 0xb2, 0x45, 0x08, 0xf7, 0x78, 0x3d, 0x86, 0x93, 0xa1, 0x08, 0x90, 0x71, 0x55, 0x3f, 0x31, 0xfb, 0xa7, 0xbb, 0xac, 0x02, 0x74, 0xef, 0x75, 0xaf, 0x8e, 0x7b, 0x81, 0xbc, 0x1a, 0xff, 0xbf, 0xe3, 0x37, 0x2d, 0xe7, 0x97, 0xe1, 0x23, 0x72, 0xf3, 0x14, 0xf7, 0xe9, 0xf0, 0x34, 0x93, 0x63, 0xda, 0xac, 0xc3, 0x4a, 0x05, 0xd6, 0x8c, 0x5d, 0xbc, 0x1b, 0xc0, 0xfb, 0x7a, 0x5b, 0xcf, 0x9e, 0x5d, 0x8e, 0xe0, 0xa6, 0xd7, 0xac, 0x20, 0x58, 0xa7, 0xcb, 0x5a, 0x26, 0x07, 0x87, 0xc9, 0x30, 0x27, 0xa7, 0x2a, 0x0c, 0xdb, 0xfe, 0x14, 0xc2, 0x90, 0x8e, 0x8c, 0x1b, 0x85, 0xf4, 0xd5, 0x1c, 0x38, 0x00, 0x85, 0xcd, 0x1e, 0xa3, 0xde, 0x3f, 0x96, 0x0e, 0x5a, 0xcc, 0x20, 0x18, 0x88, 0xa1, 0xca, 0xe0, 0x17, 0x7a, 0xec, 0xb4, 0x30, 0xad, 0x15, 0x32, 0x0a, 0x6a, 0x45, 0xad, 0xb8, 0x41, 0x5d, 0xd3, 0x45, 0xe4, 0xd3, 0x8c, 0x02, 0x2f, 0xaa, 0x25, 0x1f, 0x65, 0xa2, 0xad, 0x79, 0xbd, 0xac, 0x9f, 0xb3, 0x1d, 0xa0, 0xc2, 0x88, 0x25, 0x32, 0x4e, 0x5f, 0x6f, 0x23, 0x50, 0x20, 0x15, 0xb4, 0x4f, 0x47, 0x74, 0x60, 0x30, 0x37, 0x30, 0xca, 0x57, 0xd0, 0x79, 0xf5, 0x0f, 0x43, 0x8c, 0xb3, 0x2c, 0x25, 0x7c, 0x60, 0xef, 0xc3, 0x32, 0xcf, 0x29, 0xb6, 0xb2, 0x85, 0xa3, 0xb7, 0xa1, 0x25, 0xbe, 0xb4, 0x04, 0x2c, 0x57, 0x23, 0x4b, 0xde, 0xed, 0x96, 0x8e, 0x81, 0x06, 0x8f, 0x16, 0xc8, 0xce, 0x96, 0x1f, 0x92, 0x02, 0x8a, 0xdc, 0xd5, 0x0c, 0x35, 0xbc, 0xd4, 0x70, 0x22, 0xec, 0x99, 0x66, 0xb3, 0x1d, 0x9f, 0xc8, 0x6e, 0x87, 0xcf, 0x2f, 0x98, 0x2e, 0xad, 0x5a, 0x05, 0x64, 0xd4, 0xcf, 0x2e, 0x8f, 0xa0, 0xc4, 0x84, 0x2c, 0x2a, 0x3f, 0x04, 0x14, 0x79, 0x7d, 0x0c, 0xfe, 0xf6, 0x91, 0x6d, 0x46, 0x21, 0x4d, 0xc1, 0xed, 0x83, 0x65, 0xff, 0xe0, 0xe3, 0xd2, 0x4c, 0x7d, 0xbd, 0x75, 0x14, 0x53, 0xf0, 0xfd, 0x5a, 0x29, 0xb7, 0x0a, 0x4c, 0x42, 0xda, 0x92, 0x1b, 0xe0, 0x26, 0x85, 0x09, 0x07, 0x1a, 0xac, 0xc4, 0x83, 0xe3, 0xd7, 0xf2, 0x2d, 0x8b, 0x37, 0x0d, 0x69, 0x6d, 0x09, 0x71, 0xf3, 0xec, 0x74, 0xb3, 0xdc, 0x64, 0xb5, 0x35, 0xcf, 0x61, 0x79, 0xf7, 0x99, 0x0f, 0x8a, 0xb0, 0xe8, 0xf2, 0xae, 0x1e, 0x53, 0xd7, 0xcd, 0x9a, 0x9b, 0x0b, 0x51, 0xef, 0x31, 0xca, 0xd2, 0x6c, 0xf8, 0xfa, 0xf3, 0x38, 0x4b, 0x1a, 0x87, 0xe6, 0x42, 0x75, 0xf9, 0x49, 0x31, 0x9b, 0xea, 0x8a, 0x72, 0x11, 0x1b, 0x77, 0x65, 0x48, 0x8e, 0x1e, 0xb4, 0xcc, 0xe8, 0x9b, 0xdc, 0xbe, 0x1a, 0x2e, 0xe9, 0x84, 0x40, 0x91, 0x80, 0xbf, 0xc9, 0x88, 0x23, 0x7d, 0xd9, 0xb9, 0xb1, 0xb1, 0xeb, 0xbe, 0x2c, 0xe0, 0xbb, 0x79, 0xbf, 0x1c, 0x63, 0xa7, 0x00, 0x36, 0xc4, 0xb8, 0x72, 0x30, 0x27, 0xdf, 0x4e, 0xf1, 0x24, 0x65, 0x83, 0x3c, 0xc4, 0x42, 0xfb, 0xe3, 0xe2, 0xee, 0x20, 0x38, 0xd7, 0x75, 0x9f, 0xc5, 0x56, 0xca, 0x6b, 0x3d, 0x94, 0x5d, 0x06, 0xb2, 0xac, 0xef, 0xfc, 0x07, 0x43, 0xa5, 0xb0, 0xa9, 0x67, 0x5c, 0x5a, 0x7a, 0xbd, 0x3d, 0x51, 0x0e, 0xdc, 0x91, 0x86, 0x1a, 0xf4, 0xd6, 0x51, 0x29, 0xb3, 0x12, 0x71, 0x91, 0x69, 0x67, 0x4e, 0xa6, 0x6a, 0xe8, 0x80, 0x2d, 0xb4, 0xab, 0x95, 0x14, 0xd1, 0x1f, 0x0f, 0x60, 0xff, 0xa0, 0xad, 0x66, 0x8f, 0x49, 0xec, 0x3e, 0x8b, 0x0a, 0xcc, 0x75, 0x9b, 0xfa, 0xd7, 0x02, 0x29, 0xee, 0x60, 0x7b, 0xc4, 0x4a, 0x09, 0x89, 0xc2, 0x17, 0x88, 0x9a, 0x2a, 0x56, 0xaa, 0xd5, 0xd1, 0x94, 0x97, 0x53, 0xc2, 0xbf, 0x59, 0x8c, 0xe3, 0x38, 0x98, 0x0f, 0xd6, 0x29, 0xa7, 0x77, 0x1e, 0x19, 0xc5, 0x9a, 0x83, 0xbe, 0x9c, 0x03, 0xb7, 0x12, 0x0e, 0xa3, 0x39, 0xa9, 0x31, 0xc3, 0x7a, 0x41, 0x98, 0x3d, 0x3f, 0x9b, 0xd5, 0xec, 0x46, 0x89, 0x3b, 0x61, 0x2c, 0x49, 0xe9, 0xd7, 0x8e, 0x11, 0x04, 0x69, 0x6f, 0xeb, 0x43, 0x83, 0xd9, 0xc3, 0xb1, 0x97, 0xc7, 0xbe, 0xae, 0x11, 0x43, 0xce, 0x37, 0x8c, 0xcc, 0x84, 0x68, 0x46, 0xfa, 0x25, 0x3f, 0xd1, 0x65, 0xff, 0xa3, 0x0c, 0xc2, 0xfd, 0xa5, 0x52, 0x4f, 0x7a, 0x05, 0xf1, 0x72, 0x53, 0xf8, 0xde, 0x9c, 0x40, 0x28, 0xa7, 0x74, 0x64, 0xfd, 0xa8, 0x32, 0x22, 0x1b, 0x82, 0x48, 0x33, 0x2c, 0xc9, 0x48, 0xf5, 0xdf, 0xfd, 0x02, 0x06, 0x30, 0xbc, 0xec, 0x12, 0xeb, 0x35, 0xc8, 0xe9, 0x6b, 0xe0, 0x80, 0xd5, 0xa8, 0x6d, 0x55, 0x2a, 0x71, 0xfa, 0x38, 0x1e, 0xf5, 0x88, 0x78, 0xdb, 0x88, 0xb0, 0x9e, 0xd3, 0xa4, 0x92, 0x96, 0x54, 0x2e, 0x0f, 0x0f, 0x5c, 0xfb, 0x38, 0x23, 0xae, 0x93, 0x05, 0x3b, 0x25, 0x35, 0x4b, 0x2d, 0x49, 0x1b, 0xe8, 0xa8, 0x20, 0xfe, 0x40, 0xd2, 0x47, 0xdd, 0xee, 0x2f, 0x40, 0xfb, 0xb3, 0xc5, 0x0e, 0x27, 0xb2, 0x7e, 0xff, 0x3f, 0xe0, 0xcd, 0xca, 0xf7, 0xb6, 0x94, 0xd9, 0xd7, 0x29, 0x46, 0xe8, 0x83, 0xdb, 0x49, 0xcf, 0x3f, 0x93, 0x9e, 0x9c, 0xb2, 0xeb, 0xc3, 0xe5, 0xea, 0x48, 0xd8, 0x5d, 0xa1, 0x0f, 0x02, 0xa4, 0xbf, 0x16, 0x0d, 0x64, 0x20, 0x59, 0x55, 0x99, 0x96, 0xef, 0xe6, 0x30, 0x32, 0x3c, 0xe2, 0xd4, 0xbf, 0x67, 0x23, 0x05, 0x90, 0x0e, 0x22, 0x6a, 0x7c, 0x39, 0x17, 0x68, 0x26, 0x8d, 0x62, 0xf3, 0x82, 0xc3, 0x2a, 0xa4, 0x94, 0x58, 0x44, 0x0c, 0x7b, 0x85, 0x56, 0x49, 0xaf, 0x71, 0x3c, 0xd6, 0x87, 0xa6, 0xaa, 0xa8, 0xfe, 0xc1, 0x13, 0x76, 0xb6, 0x6e, 0xca, 0x58, 0x3d, 0x94, 0x68, 0x93, 0x90, 0xcd, 0x6d, 0xb3, 0xdd, 0x19, 0x2a, 0xdb, 0x8d, 0xd3, 0xde, 0x5a, 0x82, 0xe4, 0x1f, 0x7e, 0x9d, 0x36, 0x7b, 0xad, 0x84, 0x6c, 0x60, 0xb1, 0xa2, 0xd0, 0x39, 0x54, 0x6f, 0x8c, 0xda, 0x2d, 0xf1, 0x1e, 0x1e, 0xb9, 0x83, 0x06, 0xce, 0xae, 0xd5, 0xc1, 0xc5, 0x8b, 0x34, 0xfb, 0x52, 0x74, 0x0b, 0x01, 0xde, 0x3d, 0xaa, 0x75, 0xcf, 0xc5, 0x47, 0x45, 0xac, 0x85, 0x42, 0xdd, 0x81, 0x68, 0xae, 0x9c, 0x85, 0xdd, 0x0c, 0x85, 0xfa, 0x2b, 0x59, 0x38, 0x55, 0x06, 0x4c, 0x20, 0x9f, 0x5f, 0xd9, 0xed, 0x1b, 0x80, 0xf9, 0x45, 0x29, 0x57, 0xad, 0xb6, 0x6a, 0x12, 0x40, 0xf0, 0x25, 0xed, 0xcd, 0x31, 0xe9, 0x48, 0x02, 0x00, 0x74, 0xfd, 0x23, 0x1e, 0xd4, 0xf0, 0x52, 0xba, 0xcc, 0xe8, 0x0d, 0xe4, 0x79, 0x9d, 0xf8, 0x44, 0x35, 0x12, 0xdd, 0x0c, 0xbc, 0x24, 0xf1, 0x2b, 0x8e, 0x63, 0x59, 0xc4, 0x94, 0x22, 0xec, 0xde, 0x05, 0xca, 0x3b, 0x5d, 0x8b, 0x74, 0xce, 0x31, 0xa2, 0xb6, 0xb1, 0xcd, 0x41, 0xbc, 0x30, 0xda, 0xbd, 0x9b, 0xde, 0x2d, 0xea, 0xe3, 0xdc, 0xf7, 0x83, 0x73, 0x57, 0x3c, 0xcc, 0x92, 0x53, 0x87, 0x75, 0x3b, 0xa7, 0xdb, 0xc2, 0xb7, 0x49, 0xec, 0xe9, 0x72, 0xcc, 0x8f, 0xbc, 0x07, 0x27, 0x70, 0x87, 0x9d, 0xb8, 0x03, 0x3c, 0x76, 0x89, 0xbd, 0xcd, 0xc5, 0xd1, 0x83, 0xda, 0xc0, 0xbe, 0x63, 0x8c, 0xf7, 0x71, 0x82, 0xc1, 0xe4, 0x4b, 0x55, 0x69, 0xc3, 0x67, 0x14, 0x2f, 0xa4, 0x67, 0x6c, 0x5d, 0xbe, 0x74, 0x75, 0xf9, 0x06, 0x80, 0xe3, 0x34, 0x00, 0xce, 0x80, 0x06, 0xd5, 0xb5, 0xda, 0x12, 0xa7, 0xa1, 0x38, 0xcf, 0x21, 0x5a, 0xd3, 0xe9, 0x52, 0x89, 0x43, 0xe5, 0xbb, 0x78, 0x38, 0x05, 0xa6, 0x19, 0x6a, 0x6b, 0xba, 0x4a, 0xd3, 0x80, 0xcd, 0x57, 0x1b, 0x97, 0xf9, 0xc0, 0x54, 0xce, 0xf2, 0x3d, 0xe7, 0x35, 0x96, 0x00, 0xce, 0x33, 0xc6, 0x3a, 0x04, 0x25, 0x75, 0xe0, 0x3a, 0x47, 0xfe, 0xaf, 0xcc, 0xd8, 0xbb, 0x6e, 0xf3, 0x79, 0xd3, 0x73, 0x3c, 0xd7, 0x53, 0x68, 0x39, 0x89, 0x81, 0x4f, 0x76, 0x3c, 0x6d, 0xc4, 0xae, 0x0d, 0xc8, 0x82, 0x3f, 0x36, 0xf9, 0x29, 0xdc, 0xed, 0x6e, 0x3f, 0x82, 0x89, 0x30, 0x74, 0xad, 0xe7, 0xbb, 0x2a, 0xcb, 0x0c, 0x0c, 0x34, 0xf1, 0x0b, 0xfb, 0xde, 0xcd, 0x29, 0xcb, 0x2e, 0xdc, 0x40, 0x00, 0x6a, 0xdc, 0x61, 0x70, 0xda, 0x85, 0xbd, 0x9d, 0xcf, 0x74, 0xc6, 0x42, 0xe5, 0x68, 0x91, 0x2c, 0x84, 0xb0, 0x7f, 0x4b, 0xad, 0xe4, 0x1c, 0x09, 0xf3, 0xd4, 0x47, 0xda, 0xc7, 0xbe, 0x94, 0x15, 0xf9, 0xc4, 0xee, 0x02, 0x7c, 0x9c, 0x81, 0x34, 0x6a, 0x8a, 0xd7, 0x19, 0x47, 0x8b, 0x40, 0xcf, 0x8a, 0xd3, 0x78, 0x39, 0x59, 0x7a, 0x84, 0x53, 0x95, 0x73, 0xdd, 0xc2, 0x16, 0xbd, 0xd0, 0xb0, 0x38, 0xdd, 0x25, 0xd6, 0x96, 0x8b, 0xff, 0xda, 0x15, 0xac, 0x03, 0xdc, 0x25, 0x80, 0xbc, 0x4c, 0x43, 0x1d, 0x3e, 0xfe, 0xc2, 0x1c, 0x0a, 0x80, 0xcc, 0x92, 0x32, 0xab, 0xa4, 0x42, 0xbe, 0x78, 0x2d, 0x10, 0x4d, 0x15, 0xb0, 0xb9, 0x00, 0x38, 0xda, 0xc2, 0x93, 0xb4, 0x04, 0xae, 0xcd, 0x4a, 0xb8, 0x74, 0x1b, 0xc1, 0x70, 0x30, 0x78, 0x38, 0xa0, 0x19, 0x8f, 0xbc, 0xf7, 0xb3, 0x24, 0x16, 0xe2, 0x46, 0xb0, 0xe6, 0x53, 0x8e, 0x4b, 0xf6, 0xc0, 0xb4, 0xcf, 0xc8, 0x6e, 0x7d, 0x3b, 0x71, 0xef, 0xc2, 0x55, 0xaa, 0xea, 0x20, 0x94, 0x25, 0x1a, 0xf0, 0x3c, 0x1d, 0x99, 0x79, 0xcb, 0x31, 0x5f, 0x65, 0x94, 0x72, 0x05, 0x72, 0xaa, 0xbb, 0xcf, 0x6a, 0xff, 0x41, 0xea, 0x55, 0xcd, 0x6a, 0xf2, 0xed, 0x35, 0xe3, 0xb8, 0x52, 0x27, 0xed, 0x41, 0xff, 0x81, 0xf7, 0x12, 0xfd, 0x7b, 0x72, 0xaa, 0x56, 0x42, 0xe1, 0x51, 0xcd, 0xe3, 0x2f, 0x10, 0xcc, 0x6b, 0x46, 0x01, 0x9e, 0x4c, 0xdd, 0xc9, 0xde, 0x03, 0x91, 0x62, 0x30, 0xf8, 0x38, 0x1e, 0x2f, 0xa6, 0x72, 0xe8, 0xa6, 0xfb, 0x80, 0xcd, 0x02, 0x02, 0x5a, 0xbc, 0x07, 0xbf, 0xfb, 0x8a, 0xc3, 0x5b, 0x00, 0x39, 0xc0, 0x81, 0x71, 0x7a, 0x7e, 0x07, 0xdf, 0x70, 0x20, 0xd1, 0xaf, 0xb7, 0x66, 0xf2, 0xb5, 0xa5, 0xdb, 0x15, 0x05, 0xd0, 0x50, 0x1c, 0x05, 0xd0, 0x88, 0x06, 0xc7, 0x46, 0x35, 0x16, 0x96, 0x1d, 0x23, 0x31, 0xcf, 0x0f, 0xb4, 0x89, 0xf3, 0x6b, 0x8c, 0x78, 0xf9, 0x16, 0x8d, 0xae, 0xe9, 0xd0, 0x06, 0x8f, 0xa6, 0xb9, 0x27, 0xd7, 0x0b, 0x14, 0xb9, 0x80, 0x3a, 0x4a, 0x0c, 0xe5, 0x31, 0x32, 0x30, 0x27, 0x9f, 0x8f, 0x67, 0xd0, 0xf5, 0xdb, 0xdb, 0xb6, 0xbf, 0x43, 0x8d, 0x23, 0x35, 0xf2, 0x8e, 0x32, 0x0d, 0x92, 0x71, 0x7c, 0x94, 0x10, 0x00, 0xf4, 0xfd, 0xa0, 0x2e, 0x10, 0xf9, 0x02, 0x4d, 0x2a, 0x88, 0x03, 0x81, 0x25, 0x0e, 0x46, 0x75, 0x53, 0xa9, 0x44, 0x4c, 0x96, 0xc2, 0x92, 0xdb, 0xc6, 0xe2, 0x63, 0x15, 0x53, 0xc7, 0x4d, 0xc6, 0x2c, 0xb8, 0x50, 0x85, 0xdf, 0x15, 0x14, 0xe3, 0x01, 0x32, 0x72, 0xe9, 0xd0, 0x65, 0x36, 0xc2, 0x17, 0x5e, 0x23, 0xb4, 0x52, 0xb7, 0x38, 0x55, 0x13, 0xcc, 0x32, 0xfb, 0xa4, 0xcd, 0x52, 0x74, 0xee, 0x12, 0x60, 0xf7, 0x99, 0xae, 0xf0, 0x5b, 0x75, 0x46, 0xe4, 0x87, 0x19, 0x24, 0x32, 0x2a, 0xca, 0x87, 0xe8, 0xac, 0x9e, 0x3d, 0x6d, 0x64, 0xe0, 0x74, 0x09, 0x0b, 0xb7, 0xce, 0xa7, 0x70, 0x03, 0xb3, 0xda, 0x6e, 0x88, 0xeb, 0x1f, 0x1b, 0x4e, 0x6c, 0x62, 0x43, 0x47, 0x70, 0xc3, 0x15, 0x33, 0xcb, 0x99, 0x1b, 0xc1, 0x7c, 0xb7, 0x70, 0xf7, 0x82, 0xef, 0x2d, 0xd3, 0xf1, 0xd5, 0x24, 0x33, 0x44, 0xc5, 0xd1, 0xf2, 0xf5, 0x28, 0x8d, 0x54, 0x4b, 0xf2, 0x05, 0xa4, 0x74, 0x6f, 0xeb, 0x1b, 0xd3, 0x40, 0xeb, 0x04, 0x9b, 0xa1, 0xe1, 0x1e, 0x9d, 0xed, 0x49, 0x42, 0x5e, 0x63, 0xf6, 0x45, 0x6d, 0x2a, 0x08, 0x20, 0xf3, 0x93, 0x18, 0x4e, 0x8c, 0x9f, 0xb5, 0x76, 0x55, 0xc1, 0x14, 0x4a, 0x47, 0xe4, 0x03, 0xaf, 0xc3, 0xb0, 0x1f, 0x1e, 0x6d, 0x09, 0x47, 0x4a, 0x3e, 0xd9, 0x50, 0x03, 0xd5, 0x10, 0xfa, 0x5a, 0x0e, 0xe9, 0x23, 0x06, 0xd6, 0x6e, 0x3b, 0x06, 0x3e, 0x3e, 0xf8, 0x88, 0xce, 0x8e, 0x4b, 0x0a, 0x1b, 0x6e, 0x92, 0xbf, 0x9b, 0x4d, 0x0f, 0x34, 0xb9, 0xc0, 0x99, 0x33, 0x25, 0x7f, 0x91, 0xe8, 0x6e, 0xb0, 0x18, 0x42, 0xd2, 0x69, 0x7f, 0x9c, 0x55, 0x70, 0xff, 0x9d, 0x10, 0x45, 0xab, 0x5c, 0xcc, 0x62, 0xa2, 0xc8, 0xcf, 0xc1, 0x89, 0x48, 0xf6, 0x9f, 0x39, 0x9e, 0x04, 0x80, 0xb4, 0x11, 0x3a, 0x73, 0x5e, 0xcb, 0x28, 0x97, 0x6a, 0x80, 0xc2, 0xde, 0x92, 0x50, 0xb6, 0x11, 0x0b, 0xef, 0xfd, 0x14, 0xb8, 0x03, 0xb0, 0x6c, 0x9e, 0xcd, 0x1e, 0xfe, 0x98, 0x0c, 0x1b, 0x19, 0x4b, 0x1e, 0x9b, 0xb7, 0x5d, 0x69, 0x7f, 0x00, 0xe2, 0xf9 ],
+const [ 0x09, 0xeb, 0xb3, 0x46, 0x3b, 0x01, 0xb2, 0xc4, 0x92, 0xca, 0x2b, 0x1f, 0x6a, 0xc7, 0xe6, 0x14, 0x5e, 0xb4, 0x06, 0x46, 0x53, 0x72, 0x30, 0xd5, 0xb9, 0x45, 0xef, 0x33, 0x0d, 0x3f, 0x57, 0x33, 0xa2, 0xfc, 0xe9, 0x63, 0xa2, 0x90, 0xb7, 0x9c, 0x4f, 0xbe, 0xc9, 0xd7, 0x8f, 0x6b, 0xbe, 0x42, 0xa8, 0x51, 0xb6, 0x94, 0x48, 0xf8, 0x70, 0x9d, 0xc8, 0xe2, 0xb0, 0x21, 0xb1, 0x06, 0xe4, 0xe6, 0x80, 0x81, 0x06, 0x0c, 0xa6, 0x87, 0xc4, 0x9d, 0xd3, 0x9f, 0xdf, 0x65, 0x74, 0x10, 0xd1, 0x04, 0x7b, 0x96, 0xb2, 0x41, 0x5e, 0x5a, 0x5c, 0xa1, 0x62, 0x21, 0xce, 0x39, 0x19, 0xc4, 0xce, 0xc0, 0x29, 0xe0, 0xd3, 0xe8, 0x50, 0xce, 0x21, 0xee, 0xa5, 0xd6, 0x36, 0x70, 0x21, 0x9f, 0x65, 0x80, 0x5d, 0xea, 0xc1, 0xf6, 0x9d, 0x80, 0x3c, 0x0a, 0x0e, 0x69, 0x10, 0x22, 0x4c, 0x5f, 0x5e, 0xe8, 0x27, 0x83, 0x15, 0xa0, 0xa7, 0x4e, 0x16, 0xb9, 0x4e, 0xc9, 0x96, 0xa1, 0x9c, 0x01, 0xc3, 0xde, 0xd9, 0xb5, 0xaa, 0x5b, 0x0e, 0x53, 0x58, 0xff, 0x55, 0x23, 0x3f, 0x84, 0x52, 0xc1, 0xdc, 0x87, 0x02, 0xd0, 0x97, 0xdb, 0xb3, 0xed, 0xeb, 0x23, 0x54, 0xe2, 0xc6, 0xa0, 0xef, 0x1c, 0x33, 0x47, 0x74, 0x60, 0x36, 0x17, 0xb8, 0xb9, 0xf7, 0xa9, 0xbd, 0xb5, 0x23, 0x09, 0x34, 0xd0, 0x90, 0xc4, 0x40, 0x31, 0x20, 0x42, 0x7d, 0x94, 0xe7, 0x56, 0x41, 0x88, 0x90, 0x14, 0x22, 0xda, 0xfc, 0xe3, 0xb8, 0x51, 0x2d, 0xd3, 0xa4, 0x9b, 0x63, 0x30, 0xd0, 0x88, 0x84, 0x57, 0xf9, 0x76, 0xc1, 0xc8, 0x6b, 0x0d, 0x77, 0x7d, 0x0c, 0x2c, 0x53, 0x7a, 0x9c, 0x22, 0xba, 0xa6, 0x3b, 0x22, 0x68, 0xd9, 0x2c, 0xf1, 0x57, 0x36, 0xd8, 0xe2, 0xe2, 0xbb, 0x16, 0x04, 0x2a, 0x16, 0xa9, 0x9a, 0xb9, 0xba, 0x0a, 0xcb, 0x65, 0x33, 0x69, 0x9b, 0x77, 0xb6, 0xee, 0x1a, 0x0d, 0xfd, 0x44, 0xdb, 0xbd, 0x52, 0x58, 0xa8, 0x7b, 0xe9, 0x5e, 0x74, 0xbd, 0x72, 0x16, 0x91, 0xdd, 0xef, 0x4d, 0x24, 0xbe, 0xc3, 0xa6, 0xd5, 0xb2, 0x0c, 0x9a, 0xcb, 0x9b, 0x33, 0xbe, 0xd7, 0x51, 0xc2, 0x44, 0xef, 0x44, 0x75, 0xc5, 0xdf, 0x63, 0x93, 0x3e, 0x3b, 0x3c, 0x7e, 0x58, 0x98, 0x64, 0x89, 0xec, 0xfb, 0x19, 0x0b, 0xc6, 0x92, 0x26, 0xb2, 0xa9, 0xa2, 0x07, 0x19, 0x94, 0xc1, 0x4e, 0x9c, 0x44, 0x45, 0x45, 0x6b, 0xfa, 0xfc, 0xd5, 0xdd, 0x7e, 0x1e, 0xa6, 0x07, 0x64, 0x7f, 0x88, 0x8e, 0x8e, 0x09, 0x12, 0xb9, 0xf2, 0x6a, 0x88, 0xca, 0x9d, 0x0a, 0x02, 0x8f, 0xf8, 0x40, 0xcb, 0x34, 0x4b, 0xc5, 0x08, 0x5b, 0x7f, 0x69, 0x9a, 0x6e, 0x28, 0x04, 0x45, 0x34, 0xc3, 0xb0, 0x11, 0xa3, 0x3b, 0x35, 0xf0, 0xf6, 0xb3, 0xc5, 0xa2, 0xff, 0x7f, 0xea, 0xd6, 0xbd, 0x73, 0xbc, 0x92, 0x31, 0x61, 0x57, 0xd4, 0x6e, 0xdd, 0x8c, 0x7a, 0xf0, 0x43, 0xd7, 0x5f, 0x2e, 0xfc, 0x91, 0xc7, 0x72, 0xfc, 0x67, 0xfd, 0xe9, 0x8f, 0x0b, 0x3a, 0xf6, 0x56, 0x29, 0xc9, 0xcc, 0x8c, 0x9d, 0x69, 0x3c, 0x8e, 0xe3, 0xf3, 0xcb, 0x9b, 0xcf, 0x3c, 0x08, 0xd8, 0x7e, 0x3d, 0x1d, 0x97, 0x8c, 0x71, 0xa3, 0xd8, 0x87, 0x7f, 0xbb, 0x10, 0xa4, 0x19, 0x5a, 0x2a, 0xb1, 0x24, 0xe4, 0xcc, 0x4b, 0x19, 0xfd, 0xdb, 0x51, 0xab, 0x9c, 0x41, 0x99, 0xaa, 0x60, 0xee, 0xe1, 0x27, 0x28, 0x1c, 0x08, 0xd9, 0xde, 0xd8, 0x7e, 0xbf, 0x93, 0xbe, 0xf9, 0x07, 0xd1, 0x04, 0x69, 0x2f, 0x2c, 0xba, 0x2f, 0x6a, 0x1b, 0x4f, 0x89, 0x45, 0x06, 0x58, 0x51, 0x8a, 0xa0, 0x8d, 0xe8, 0x64, 0x77, 0x14, 0x6d, 0xc5, 0xca, 0x03, 0x32, 0x05, 0x9a, 0x20, 0x70, 0xcc, 0x03, 0xeb, 0x39, 0x31, 0xcd, 0xde, 0xaf, 0x23, 0x3f, 0xf3, 0x74, 0x08, 0x33, 0x67, 0x61, 0xa5, 0x70, 0xbd, 0x7b, 0x3e, 0x33, 0x07, 0x22, 0xfe, 0x0f, 0x61, 0x8c, 0x99, 0xf7, 0xbe, 0x72, 0x2f, 0x9a, 0xe7, 0x09, 0x74, 0xef, 0xc0, 0x34, 0x0e, 0x10, 0xcd, 0xf8, 0x3e, 0x4b, 0xf6, 0x30, 0xc3, 0x76, 0x87, 0x82, 0xfb, 0x84, 0x7b, 0x91, 0x4c, 0x56, 0xfa, 0x74, 0xc2, 0xd3, 0x20, 0x68, 0xf9, 0x3b, 0x00, 0xc1, 0x3e, 0xb8, 0xe9, 0x27, 0xf1, 0x37, 0xe8, 0xfe, 0x2d, 0x75, 0x8d, 0x26, 0xac, 0x5d, 0xf2, 0xe5, 0xe4, 0x91, 0xfa, 0x21, 0x76, 0x47, 0xd7, 0xd3, 0xc9, 0x56, 0xcf, 0xb8, 0xf2, 0x90, 0x3f, 0x4a, 0xd8, 0x53, 0xe0, 0xee, 0x95, 0x5b, 0x49, 0x6f, 0x1f, 0xda, 0xb5, 0xab, 0x27, 0xcb, 0x07, 0x8c, 0x41, 0x83, 0x0b, 0x3a, 0x46, 0x89, 0xff, 0x8f, 0xf6, 0xa7, 0x52, 0xcc, 0xe2, 0x41, 0xab, 0x8a, 0x8a, 0xe6, 0x2d, 0xf3, 0xc2, 0x25, 0xfa, 0x31, 0x5a, 0xa2, 0xf5, 0x27, 0xfd, 0x69, 0xcd, 0x5f, 0x5a, 0x81, 0x37, 0x44, 0x82, 0xc5, 0x7a, 0x92, 0x91, 0xef, 0x31, 0x0a, 0x91, 0xf6, 0x4c, 0x6a, 0x9b, 0x9a, 0x59, 0x9c, 0x3f, 0x3c, 0x02, 0x2e, 0x27, 0xf4, 0xd6, 0x02, 0xf6, 0xde, 0x4c, 0x47, 0x76, 0xb4, 0x04, 0xa7, 0xf3, 0xa2, 0x51, 0xc2, 0xe2, 0x55, 0xf5, 0xdc, 0xc7, 0x56, 0x2b, 0xd2, 0x55, 0x96, 0xeb, 0x53, 0xd6, 0x4a, 0x69, 0x4c, 0xcd, 0xf8, 0xdf, 0xa4, 0xda, 0xd2, 0x8c, 0x2a, 0xdf, 0x44, 0xfc, 0xcc, 0x61, 0xc9, 0x8b, 0x09, 0x31, 0x02, 0x25, 0xa9, 0x4b, 0x09, 0x4f, 0xab, 0xfe, 0x03, 0x6b, 0x7f, 0x4d, 0xf4, 0x37, 0x75, 0x96, 0xd8, 0x98, 0x76, 0x71, 0xef, 0x96, 0xf2, 0xdb, 0x58, 0xa7, 0x19, 0x94, 0xe1, 0x30, 0x4e, 0xc5, 0x1e, 0x49, 0xd8, 0xe6, 0xb8, 0xc1, 0xdb, 0xdf, 0x08, 0x61, 0x87, 0x6d, 0xe4, 0x75, 0x90, 0xc8, 0xb9, 0x89, 0xde, 0x83, 0xda, 0x71, 0x85, 0xb3, 0x18, 0x8c, 0xf7, 0x53, 0x93, 0x49, 0x79, 0xe7, 0xd0, 0xe9, 0xd3, 0x60, 0x0b, 0x87, 0x4c, 0x40, 0xce, 0x56, 0xd5, 0xfe, 0xc2, 0x2b, 0x85, 0xac, 0xc6, 0x3b, 0x45, 0xd7, 0x3e, 0x25, 0xcd, 0xaf, 0xad, 0x33, 0xcf, 0x67, 0x87, 0xdc, 0x71, 0xdf, 0x40, 0x8e, 0x01, 0x81, 0xa9, 0xab, 0xe4, 0x69, 0x7c, 0xd2, 0xd0, 0xc8, 0x35, 0x5f, 0x3c, 0x8a, 0x24, 0x35, 0x14, 0x36, 0xc1, 0xbb, 0xb0, 0x16, 0x3f, 0x24, 0x07, 0x99, 0x64, 0xf4, 0x20, 0xf5, 0x97, 0xbf, 0xca, 0x10, 0x3b, 0x34, 0x8d, 0xa1, 0x3b, 0x5b, 0xe0, 0x92, 0xe6, 0x1b, 0x9c, 0xaa, 0xfe, 0xff, 0xb1, 0x68, 0x0b, 0x3a, 0x18, 0x32, 0xf5, 0xe8, 0x09, 0xaf, 0xd2, 0x96, 0x6d, 0x71, 0xfd, 0x05, 0x96, 0xd7, 0x68, 0x2b, 0x2e, 0x31, 0x33, 0x7b, 0x6d, 0x26, 0x7d, 0x66, 0x8f, 0x53, 0x7a, 0x22, 0x86, 0x35, 0xc5, 0xaa, 0xec, 0x49, 0xf8, 0x06, 0x3b, 0x71, 0x7b, 0xcc, 0x40, 0x9a, 0x99, 0xe7, 0xcd, 0x9c, 0xd9, 0x97, 0xaf, 0x61, 0x8b, 0xb9, 0xdf, 0x4a, 0xa1, 0x49, 0xfd, 0xce, 0xc0, 0x25, 0xf9, 0x65, 0x97, 0x13, 0x14, 0xa4, 0x70, 0x06, 0x07, 0xa9, 0x04, 0x9d, 0x81, 0xb9, 0x94, 0xed, 0xd7, 0x28, 0x35, 0x80, 0xf7, 0x79, 0x6c, 0x9d, 0x9f, 0xc7, 0xfa, 0xca, 0xcc, 0x64, 0xf9, 0x90, 0x74, 0xbf, 0x28, 0x7e, 0x77, 0x8b, 0x84, 0x71, 0xd4, 0x1d, 0x18, 0x12, 0x18, 0x16, 0x15, 0x9f, 0x1d, 0x43, 0x25, 0xef, 0xf0, 0xc1, 0xfd, 0xb0, 0x13, 0x65, 0x31, 0xf4, 0xe5, 0x5a, 0x4d, 0xec, 0x5e, 0x0c, 0x21, 0xf2, 0xff, 0x45, 0x5c, 0xcd, 0x09, 0x96, 0x5d, 0x31, 0xee, 0xf9, 0x45, 0x86, 0x05, 0xb4, 0x51, 0xea, 0x81, 0x81, 0x67, 0x79, 0xa4, 0xeb, 0xee, 0xcc, 0x30, 0xfb, 0xe3, 0xbf, 0x1f, 0x14, 0x29, 0x78, 0x93, 0x1c, 0x21, 0xa5, 0x10, 0xdc, 0x7b, 0x04, 0xe9, 0xaa, 0x4c, 0x29, 0xf8, 0x45, 0x60, 0x7c, 0x92, 0x00, 0xd1, 0x81, 0xba, 0x23, 0xd8, 0x5c, 0x95, 0x8e, 0xe4, 0x94, 0x1f, 0x9f, 0xe9, 0x17, 0x1b, 0x56, 0xfb, 0x7e, 0x50, 0xb7, 0x1b, 0x93, 0xf2, 0x70, 0x51, 0x10, 0x5f, 0xbc, 0xfb, 0xaa, 0x0c, 0x87, 0x64, 0x4e, 0xbe, 0xd3, 0x98, 0xab, 0xfd, 0x5a, 0x77, 0xf0, 0xc5, 0x75, 0x09, 0xd7, 0x80, 0x3c, 0x11, 0xe2, 0x31, 0xef, 0xe5, 0xe4, 0xf2, 0x95, 0x7c, 0xc4, 0xa0, 0xe2, 0xc9, 0x7e, 0xd5, 0x5e, 0x47, 0x6a, 0x16, 0xc4, 0xd6, 0xc1, 0x4e, 0xa8, 0xc5, 0x5d, 0x7b, 0x5d, 0x30, 0xc0, 0xa8, 0x16, 0x8c, 0x58, 0x1b, 0x4b, 0x80, 0x02, 0xcf, 0x5f, 0xf6, 0xcc, 0x25, 0x7f, 0x73, 0xff, 0xd6, 0xcd, 0xa3, 0x5d, 0x2c, 0xbe, 0x39, 0xa7, 0x72, 0xc0, 0xf6, 0x62, 0xa9, 0x21, 0x06, 0xdb, 0x7c, 0x2c, 0x93, 0x69, 0x76, 0x95, 0x95, 0xf2, 0x73, 0x17, 0xe7, 0xb0, 0x54, 0x5b, 0xa0, 0x35, 0xf7, 0x1c, 0xa0, 0xad, 0x67, 0x89, 0x69, 0x64, 0x4f, 0xea, 0x31, 0x88, 0xb5, 0x87, 0x35, 0x2f, 0xe4, 0xc5, 0x4f, 0x9b, 0xaa, 0x93, 0xcb, 0xbd, 0xc4, 0x04, 0x77, 0xf9, 0x97, 0x3d, 0xf9, 0x29, 0x21, 0x92, 0x65, 0xe4, 0x2e, 0xec, 0x0f, 0x00, 0xcf, 0x6e, 0x9e, 0x55, 0x08, 0x58, 0x62, 0xc4, 0xc9, 0x2b, 0xe8, 0x79, 0x1f, 0x0e, 0xcb, 0x6c, 0xac, 0x70, 0xcc, 0x2e, 0x55, 0xef, 0x25, 0xe2, 0x3a, 0x78, 0x1b, 0x89, 0xeb, 0xb0, 0xd3, 0x84, 0xd9, 0x93, 0x66, 0x53, 0x0a, 0x5b, 0x37, 0xa3, 0x11, 0xa4, 0x85, 0x88, 0x3e, 0xcd, 0x3c, 0x07, 0x12, 0xa1, 0x11, 0xd7, 0xf5, 0x37, 0xcd, 0x68, 0x2b, 0x16, 0xe9, 0x25, 0x05, 0x9d, 0x5c, 0xf7, 0x54, 0xa3, 0xb1, 0x0a, 0x23, 0x5a, 0x5c, 0xd3, 0xa6, 0x79, 0x4e, 0x52, 0x6d, 0x9a, 0xc7, 0x94, 0xdd, 0xe0, 0x6c, 0x7d, 0xe1, 0xde, 0x99, 0xc4, 0xdd, 0xb4, 0xf8, 0x3f, 0xe4, 0x7b, 0x53, 0x61, 0x2a, 0xe4, 0xa6, 0x01, 0xbc, 0x1b, 0x79, 0x5c, 0x6e, 0xf2, 0x6c, 0x5e, 0x15, 0x3b, 0x14, 0x1d, 0xf7, 0x75, 0x05, 0xa7, 0x80, 0xac, 0x30, 0xfd, 0x37, 0x9a, 0x70, 0x5f, 0xf0, 0x12, 0x5f, 0xca, 0x42, 0x9f, 0x6e, 0xc0, 0x3b, 0x68, 0x35, 0x47, 0x53, 0x56, 0x07, 0x34, 0x9f, 0x79, 0xca, 0xa9, 0x47, 0xa8, 0x05, 0xdd, 0x3a, 0x68, 0x3b, 0x1b, 0x20, 0x10, 0x78, 0x0e, 0x91, 0x2a, 0x29, 0x3b, 0x84, 0x1b, 0x30, 0xcf, 0x0a, 0x07, 0x38, 0x9b, 0x3c, 0xef, 0x46, 0x5d, 0x71, 0x1c, 0x91, 0x41, 0xb5, 0xc1, 0x94, 0xa7, 0x77, 0xdc, 0x61, 0x27, 0x82, 0x5d, 0x38, 0xd2, 0x2f, 0x8a, 0x58, 0xbb, 0xd8, 0xa2, 0x15, 0xb7, 0x8f, 0xc0, 0x2b, 0x60, 0x10, 0x03, 0x52, 0x60, 0xf5, 0xec, 0x13, 0xec, 0x29, 0x07, 0xd9, 0x8e, 0x9f, 0xce, 0x4b, 0x28, 0x44, 0xca, 0xd9, 0x36, 0x32, 0xfb, 0x95, 0x53, 0x26, 0x7a, 0x45, 0xff, 0x34, 0x5d, 0xb6, 0x9f, 0xb9, 0xdb, 0x53, 0xc5, 0x92, 0xb1, 0xf5, 0xb2, 0x8b, 0xc3, 0xfd, 0x19, 0x1a, 0x07, 0xa1, 0x26, 0x4e, 0x9f, 0x83, 0xbf, 0x02, 0x45, 0x88, 0x0a, 0x56, 0xec, 0xe7, 0x2f, 0x60, 0xa4, 0x80, 0x5f, 0x1e, 0xbf, 0x70, 0x15, 0xaf, 0x32, 0xe2, 0x9b, 0xc3, 0x3e, 0x27, 0xd1, 0x51, 0x4f, 0x0a, 0x2a, 0x88, 0x24, 0x5d, 0xf7, 0x07, 0x30, 0xd8, 0xe8, 0x50, 0x40, 0x24, 0xcf, 0x7a, 0x5f, 0x32, 0xa8, 0x27, 0xf6, 0xd1, 0xd7, 0xb6, 0x38, 0x80, 0xb0, 0xba, 0xbd, 0x80, 0x3c, 0xaa, 0x6d, 0x2e, 0x3a, 0xda, 0xa0, 0x90, 0x65, 0xa9, 0x84, 0x2e, 0xf5, 0xfc, 0xbe, 0x23, 0x68, 0xec, 0x54, 0x73, 0x82, 0xbc, 0xca, 0x9f, 0x93, 0x0e, 0x8b, 0x77, 0xf8, 0x56, 0x8b, 0x30, 0xe4, 0x8e, 0x2b, 0xb6, 0x61, 0x2c, 0x5d, 0x43, 0x91, 0x51, 0x08, 0x31, 0x3a, 0x43, 0xae, 0x0d, 0x81, 0x1d, 0x4c, 0xec, 0xf6, 0xc5, 0x81, 0x02, 0xd1, 0x1f, 0xf3, 0x70, 0x7b, 0x80, 0xef, 0x5e, 0x51, 0x66, 0x4f, 0x4a, 0xa4, 0x66, 0xa1, 0x9f, 0x04, 0x65, 0x85, 0x8a, 0xbe, 0x0b, 0x57, 0x09, 0xa3, 0x75, 0x0e, 0x45, 0x0b, 0x2a, 0x64, 0x21, 0x1a, 0x51, 0x38, 0x13, 0x42, 0x21, 0x30, 0x33, 0x09, 0x98, 0xa2, 0x91, 0x0d, 0x70, 0xb5, 0xcc, 0x45, 0x4f, 0xc3, 0xe0, 0x89, 0x3e, 0x02, 0x40, 0x55, 0x5c, 0x64, 0x25, 0xca, 0xd3, 0xbb, 0x25, 0xf5, 0x0c, 0x21, 0x07, 0x54, 0x1f, 0x97, 0xd6, 0x96, 0x8e, 0xec, 0x34, 0xa3, 0x32, 0xe1, 0xf1, 0xdc, 0x75, 0x8a, 0xdc, 0xa4, 0xc2, 0xf7, 0xd9, 0x1f, 0x3a, 0x14, 0x34, 0x39, 0xa9, 0xce, 0x35, 0xeb, 0xb8, 0x77, 0xf5, 0xba, 0x64, 0x6c, 0x6f, 0x80, 0xae, 0xf5, 0xda, 0x6e, 0x94, 0x6c, 0x37, 0x52, 0x41, 0xa2, 0x26, 0x16, 0x81, 0x7e, 0xfd, 0x89, 0x77, 0xe7, 0x1b, 0x63, 0x92, 0xe4, 0x7a, 0x83, 0xbd, 0x02, 0x84, 0x7a, 0xd6, 0xf7, 0x28, 0x4d, 0x62, 0x84, 0x2c, 0x77, 0x7f, 0xa0, 0xc5, 0x2e, 0x19, 0xd2, 0x65, 0xe7, 0x61, 0xdf, 0xd4, 0x1c, 0x7b, 0xa5, 0x82, 0x4d, 0x77, 0x47, 0x1c, 0x45, 0x83, 0x8a, 0x5d, 0x9e, 0x5f, 0x7f, 0x27, 0x87, 0x11, 0x63, 0xd2, 0xc5, 0xd9, 0xc3, 0xc4, 0xf8, 0x67, 0xe3, 0x41, 0x20, 0x4c, 0x61, 0x85, 0x5f, 0xaf, 0x16, 0x10, 0x01, 0x41, 0x3d, 0x42, 0xb9, 0x73, 0xd7, 0x27, 0x2d, 0xe6, 0x4e, 0x94, 0xb5, 0x22, 0x58, 0x73, 0x60, 0x8c, 0x1e, 0x5b, 0x39, 0x92, 0x9e, 0x64, 0xc8, 0x29, 0x4d, 0x39, 0xdb, 0x79, 0x01, 0x6e, 0x86, 0xd6, 0x0f, 0x14, 0x68, 0xf3, 0xb0, 0x8b, 0x30, 0x52, 0xaa, 0x98, 0x60, 0xff, 0x2c, 0xb7, 0x51, 0x7e, 0xf9, 0xb3, 0x77, 0x02, 0xc8, 0x73, 0xe7, 0xe0, 0xeb, 0x17, 0x16, 0x42, 0x30, 0x44, 0xe4, 0x20, 0x05, 0xbb, 0xd9, 0x6c, 0xdf, 0x31, 0xae, 0x8d, 0xdc, 0x5b, 0x0f, 0x0f, 0xa7, 0x48, 0x9f, 0x99, 0x9c, 0xf3, 0x3d, 0x1f, 0x2c, 0x19, 0x86, 0x58, 0x83, 0x48, 0x9a, 0x73, 0x69, 0x39, 0x23, 0x06, 0x66, 0x5f, 0x94, 0x47, 0x2a, 0xc0, 0xaf, 0x7e, 0x2b, 0x04, 0x4a, 0xba, 0x90, 0xcb, 0x52, 0xc3, 0x4e, 0x44, 0x10, 0x51, 0x91, 0xfc, 0xab, 0x7b, 0x5d, 0xf3, 0xef, 0x72, 0x75, 0xf5, 0x4c, 0x6f, 0x7c, 0x27, 0x22, 0xea, 0x5a, 0xe1, 0x3c, 0x0d, 0xe1, 0xbb, 0x9a, 0x68, 0xb1, 0xeb, 0x73, 0xe6, 0x58, 0xce, 0x7a, 0x00, 0xbe, 0xc4, 0x61, 0x30, 0xc1, 0x41, 0x9b, 0xa9, 0x1c, 0x21, 0x67, 0x45, 0x8d, 0x3c, 0x0a, 0xbf, 0x37, 0x3b, 0x5b, 0x22, 0x45, 0xaa, 0x85, 0x81, 0xd0, 0x4e, 0x09, 0xe9, 0x02, 0xb8, 0x02, 0x94, 0x7c, 0x1a, 0xad, 0x5f, 0xf6, 0x5a, 0x28, 0x7e, 0x25, 0x65, 0x7a, 0x6f, 0xe2, 0xc6, 0xd4, 0x2c, 0x88, 0x77, 0x17, 0xa5, 0x9e, 0xf6, 0x95, 0x6d, 0xb6, 0x9c, 0x1c, 0xb4, 0x94, 0x2b, 0x31, 0x75, 0x93, 0xa6, 0x99, 0xf0, 0x45, 0x65, 0x1e, 0x5b, 0x5a, 0x68, 0x8f, 0xd5, 0xc3, 0xec, 0x09, 0x9b, 0x17, 0x3c, 0x75, 0x7e, 0x35, 0xca, 0x52, 0x95, 0x2b, 0x7e, 0xb5, 0x2f, 0x56, 0x4e, 0x8d, 0x0b, 0xcb, 0x0f, 0x2c, 0xcc, 0xf6, 0x8a, 0x03, 0xa7, 0x81, 0xd3, 0xad, 0x5f, 0x77, 0xd6, 0x30, 0x73, 0xaa, 0x33, 0x7f, 0x96, 0x52, 0x4c, 0x43, 0x5f, 0xf6, 0x9b, 0xda, 0x42, 0x90, 0x4a, 0xa0, 0xbf, 0xec, 0xfd, 0x6e, 0xd9, 0x51, 0xf3, 0x61, 0xca, 0x63, 0x4d, 0xdd, 0xf5, 0x48, 0xad, 0xd1, 0x1c, 0x0a, 0x03, 0x3c, 0xd3, 0x3c, 0xa4, 0xf0, 0x34, 0xe1, 0x9d, 0x96, 0xd5, 0x89, 0x46, 0xf2, 0xf7, 0xbd, 0x1a, 0x68, 0x00, 0x9d, 0xc5, 0xbf, 0x2c, 0xc8, 0x7f, 0x26, 0x7f, 0x7c, 0x99, 0x74, 0xfe, 0xff, 0x55, 0xb4, 0x1e, 0x3d, 0xfb, 0xe1, 0x7d, 0xb2, 0x29, 0xee, 0xd0, 0x8a, 0x6b, 0x09, 0x1c, 0x07, 0x0b, 0x21, 0x2a, 0x24, 0x2b, 0xa6, 0x35, 0x78, 0x10, 0x90, 0xe5, 0x5c, 0xc1, 0xa2, 0x81, 0x50, 0xd1, 0xf0, 0x60, 0x9b ],
+const [ 0x46, 0xcb, 0x5d, 0x39, 0x1e, 0x75, 0x11, 0x46, 0xba, 0x97, 0x00, 0xb4, 0xfd, 0x5f, 0x36, 0xae, 0x7d, 0xda, 0x17, 0x58, 0xd8, 0xfe, 0x50, 0xfb, 0x47, 0xed, 0x0d, 0x62, 0x75, 0x78, 0x6d, 0x84, 0x91, 0xe2, 0x32, 0x63, 0xa1, 0xe7, 0xbe, 0x33, 0x1a, 0xfd, 0x3b, 0xbf, 0xae, 0xda, 0x19, 0x09, 0x66, 0x36, 0xbd, 0x30, 0xf0, 0xd2, 0x77, 0x97, 0x3a, 0xb9, 0xb5, 0x44, 0x40, 0xc6, 0x77, 0x86, 0x22, 0x66, 0x03, 0xdb, 0x79, 0x9f, 0xda, 0x10, 0xeb, 0x52, 0xea, 0xaa, 0xfd, 0xbd, 0x05, 0x85, 0x29, 0x43, 0x92, 0xbb, 0x31, 0x70, 0x83, 0xc7, 0xb2, 0x38, 0x87, 0xeb, 0xfc, 0x7f, 0x80, 0xcf, 0x21, 0xdf, 0x37, 0x6a, 0x4c, 0xa5, 0x4e, 0x25, 0x54, 0x1c, 0x77, 0x3e, 0x91, 0x0f, 0xe4, 0x6b, 0xef, 0x89, 0xff, 0xc1, 0x40, 0xdf, 0x5a, 0xd3, 0xd7, 0xf0, 0xe9, 0x1e, 0x52, 0xac, 0x6f, 0xa5, 0xb7, 0xd3, 0x36, 0xd8, 0xc3, 0xff, 0x03, 0xba, 0x7e, 0xe5, 0x49, 0x43, 0x13, 0xd8, 0x9d, 0x03, 0xdf, 0x8f, 0x6a, 0x09, 0xc8, 0x27, 0xe6, 0x03, 0xd0, 0x6b, 0x44, 0xa7, 0xe9, 0x54, 0x2c, 0x51, 0x0c, 0xcc, 0x68, 0xed, 0x85, 0xb7, 0xe0, 0x17, 0x91, 0x34, 0xc8, 0x81, 0x2a, 0x20, 0x18, 0x95, 0x22, 0xdd, 0x3c, 0x5c, 0x6f, 0x51, 0x0d, 0x9f, 0xc6, 0x31, 0x01, 0x4c, 0x6b, 0x7f, 0x9e, 0x1a, 0x47, 0x51, 0x35, 0x70, 0x3b, 0xd5, 0xcc, 0x84, 0xb4, 0x92, 0x5c, 0xc0, 0x7f, 0xf0, 0x3d, 0x69, 0xdf, 0xfb, 0xde, 0x82, 0xdd, 0x64, 0xb9, 0xee, 0xe0, 0xc8, 0x86, 0xd6, 0x7d, 0x35, 0xaf, 0x4a, 0x90, 0xeb, 0x05, 0x2b, 0x8c, 0x5f, 0xb1, 0x48, 0x0f, 0x86, 0x6d, 0xc7, 0xba, 0x4f, 0xf4, 0xc7, 0x3f, 0x72, 0xb6, 0x43, 0xbb, 0x68, 0xd1, 0x39, 0x47, 0xba, 0x3d, 0x0c, 0xc9, 0x7f, 0x46, 0x28, 0x11, 0x20, 0x40, 0xe4, 0x21, 0x5f, 0x76, 0xac, 0xcb, 0x98, 0x63, 0x5f, 0x82, 0x46, 0x25, 0xf6, 0x6a, 0xc8, 0x2e, 0x67, 0xb1, 0x66, 0x3d, 0xc8, 0x22, 0x8f, 0x8c, 0xb8, 0xf7, 0x64, 0x4b, 0xfb, 0xef, 0x7b, 0x4e, 0x64, 0xa1, 0xdc, 0x03, 0xf8, 0x10, 0x50, 0xa6, 0x50, 0x7f, 0xdc, 0xb8, 0x3f, 0x87, 0x88, 0xad, 0xb5, 0x66, 0x64, 0xe5, 0xe3, 0x9a, 0xcd, 0xdd, 0xa0, 0xaf, 0xed, 0xa7, 0x0c, 0x55, 0x81, 0x97, 0x73, 0xb5, 0xdf, 0x40, 0x74, 0x05, 0x37, 0x9e, 0x62, 0x5a, 0x19, 0x95, 0xea, 0xbe, 0x37, 0x9a, 0xf6, 0x83, 0x6d, 0xb1, 0xd2, 0xd7, 0xfe, 0x97, 0x8d, 0x98, 0x21, 0x40, 0xa3, 0x69, 0xbc, 0x84, 0xd8, 0x05, 0x6f, 0x15, 0x67, 0xd3, 0xd4, 0xb4, 0x5c, 0xbb, 0x05, 0xa4, 0x3f, 0x39, 0x5f, 0x5f, 0xf2, 0xaf, 0x86, 0x89, 0xdc, 0x00, 0xa9, 0x22, 0x48, 0x5a, 0x08, 0xff, 0x07, 0x53, 0xb3, 0x7b, 0x5d, 0x38, 0x94, 0x6a, 0x1b, 0xa1, 0xaf, 0x4e, 0x08, 0x49, 0xa9, 0xce, 0x85, 0x1d, 0x87, 0x63, 0x71, 0x93, 0xb9, 0x55, 0x4b, 0x3d, 0x57, 0xe6, 0x96, 0x9e, 0xaa, 0xcc, 0x82, 0x3c, 0xee, 0xe5, 0xc8, 0xf6, 0x56, 0x27, 0xd6, 0x98, 0x51, 0xd6, 0x2c, 0xad, 0x0c, 0xf9, 0x06, 0x95, 0x38, 0x0e, 0x3b, 0xd7, 0x0d, 0xfd, 0x65, 0xb8, 0x8f, 0x4b, 0x42, 0x0c, 0x10, 0x90, 0x5a, 0x4c, 0xf6, 0x2b, 0xe2, 0xe9, 0xbe, 0x34, 0xe1, 0xe0, 0x41, 0xb2, 0x91, 0x8f, 0x36, 0x0e, 0x08, 0xc6, 0xf9, 0xc8, 0x17, 0x22, 0x8b, 0x69, 0x73, 0x96, 0xd9, 0xb9, 0x12, 0x4b, 0x41, 0x31, 0xd8, 0xaa, 0x52, 0xb3, 0x73, 0xb7, 0xd3, 0x79, 0x84, 0xa0, 0x07, 0x4c, 0xff, 0x95, 0x30, 0xf6, 0xd4, 0xdb, 0x52, 0xf9, 0xcf, 0x1c, 0x39, 0x81, 0xbc, 0x02, 0xbd, 0x98, 0xd0, 0x04, 0x45, 0x99, 0x44, 0x7f, 0x8a, 0xe7, 0x43, 0x08, 0x9e, 0xde, 0x06, 0x01, 0x2c, 0x0a, 0x3e, 0x6a, 0x01, 0x97, 0xb2, 0xfa, 0xcb, 0x09, 0x29, 0x6e, 0x21, 0x2e, 0x8a, 0x22, 0xc4, 0x50, 0x42, 0xde, 0x25, 0xae, 0xe6, 0xf2, 0x27, 0x2e, 0x19, 0x85, 0x25, 0x4c, 0xb1, 0x2a, 0x37, 0x56, 0x15, 0xb4, 0xb1, 0xdb, 0xe9, 0x4c, 0xed, 0x61, 0xee, 0xc0, 0x4b, 0x56, 0x23, 0x1e, 0x75, 0x49, 0x31, 0x82, 0xe8, 0x5a, 0x05, 0x2c, 0xb0, 0xef, 0xbf, 0xd5, 0x72, 0xa9, 0xcb, 0x43, 0xb0, 0x97, 0x4d, 0x1c, 0x49, 0xa9, 0xc3, 0xf8, 0x3f, 0x67, 0xe6, 0xb9, 0xbd, 0xe2, 0xd0, 0x1f, 0x59, 0xeb, 0x64, 0x97, 0x96, 0x84, 0xeb, 0x54, 0xad, 0x94, 0xfb, 0xa1, 0x8d, 0xdf, 0x9d, 0x76, 0x20, 0x34, 0xae, 0x49, 0xd0, 0xe8, 0x86, 0x26, 0x4a, 0x84, 0xd8, 0x02, 0x81, 0xbb, 0xd9, 0x4d, 0xf6, 0x9f, 0xa5, 0xc6, 0x38, 0x14, 0xde, 0x93, 0xa6, 0x84, 0x96, 0x91, 0x7c, 0xd4, 0x6f, 0xe9, 0x0e, 0x97, 0x00, 0xe4, 0x4e, 0x82, 0x7b, 0x00, 0x94, 0x20, 0x8d, 0x43, 0x9f, 0xc7, 0x86, 0xcf, 0xd7, 0xcb, 0xba, 0xb7, 0xd4, 0xf1, 0x27, 0x11, 0x24, 0x27, 0x58, 0x4c, 0x49, 0x72, 0x89, 0xc4, 0x02, 0x27, 0x0b, 0x94, 0xcc, 0x5e, 0xea, 0xab, 0xa7, 0xa4, 0xce, 0x23, 0x1d, 0xf0, 0x1f, 0xce, 0x81, 0xd9, 0x6c, 0x11, 0x75, 0x05, 0x0e, 0xf5, 0xae, 0xe5, 0x08, 0x7b, 0xfc, 0x9f, 0x32, 0x30, 0x84, 0x4c, 0x97, 0x02, 0x50, 0x64, 0x1b, 0x52, 0x0b, 0x76, 0x61, 0x4a, 0x05, 0x1d, 0xeb, 0x71, 0x7e, 0x2f, 0x83, 0x7c, 0x20, 0x37, 0xda, 0x68, 0xcd, 0x26, 0x70, 0xc5, 0x9b, 0x45, 0xb3, 0x55, 0x1d, 0x6e, 0x6b, 0xd5, 0xe5, 0x7c, 0x55, 0x1b, 0x46, 0x00, 0x0e, 0x61, 0x5f, 0x36, 0x33, 0xe1, 0x54, 0x37, 0xc7, 0xa2, 0xdf, 0x6f, 0xd5, 0x91, 0x08, 0x52, 0x56, 0xd3, 0x30, 0x4b, 0x54, 0x5a, 0x54, 0xf5, 0x50, 0xb6, 0x90, 0x8e, 0xe2, 0x2e, 0xe2, 0xa9, 0x9f, 0x10, 0x31, 0x22, 0x3f, 0x45, 0x8e, 0x57, 0x00, 0x28, 0xb9, 0x95, 0x45, 0x99, 0xe7, 0xd1, 0x83, 0x4c, 0xc2, 0x99, 0x5d, 0x67, 0xb2, 0x4a, 0x0e, 0x4d, 0x5b, 0x82, 0x08, 0xb4, 0x67, 0xd8, 0xda, 0xfe, 0x85, 0xcb, 0x57, 0xc6, 0xb1, 0xf9, 0xf5, 0xb9, 0xb7, 0x92, 0x73, 0xa7, 0xf2, 0x0b, 0xbf, 0xd9, 0x5a, 0x17, 0x16, 0xa6, 0xbe, 0xd3, 0x6d, 0x41, 0x4d, 0x40, 0x10, 0xd5, 0x5b, 0xf7, 0x89, 0xd4, 0x62, 0x18, 0xc3, 0x8c, 0x47, 0x84, 0x6f, 0xfb, 0xdf, 0x4c, 0xa7, 0xe4, 0xb2, 0x69, 0xd1, 0x22, 0xff, 0xad, 0xc7, 0x3d, 0x00, 0xf9, 0x35, 0x3b, 0x6e, 0xb1, 0x42, 0xb8, 0x48, 0x6d, 0x72, 0x39, 0xd1, 0xf1, 0xca, 0xbe, 0xd8, 0x60, 0x36, 0x96, 0x3b, 0xac, 0x29, 0x77, 0xae, 0x51, 0x83, 0xce, 0xb9, 0x43, 0xb7, 0x54, 0x00, 0x24, 0x2d, 0xe2, 0xc7, 0xbb, 0xe5, 0x86, 0xb5, 0xa2, 0x5e, 0xd6, 0xd8, 0x3e, 0xb6, 0x84, 0xea, 0xf4, 0x12, 0x33, 0xd3, 0x9a, 0x40, 0x89, 0x6e, 0x2c, 0x9b, 0x86, 0x90, 0xc1, 0x2f, 0x14, 0x47, 0xbd, 0x1e, 0xdf, 0x5f, 0x47, 0x43, 0x66, 0x2b, 0xfe, 0x14, 0x53, 0x82, 0xe7, 0xcd, 0x07, 0x07, 0xaa, 0xcb, 0x7a, 0xad, 0xff, 0x35, 0x42, 0x7b, 0x63, 0xe2, 0xf1, 0x8d, 0x0f, 0x77, 0xa4, 0x5c, 0x2a, 0xd0, 0xd9, 0x3f, 0x3e, 0xa2, 0x81, 0x31, 0xe9, 0x5e, 0x57, 0xd4, 0xd5, 0x58, 0x6f, 0xb6, 0xe9, 0x28, 0x12, 0xd3, 0xc1, 0x50, 0xc9, 0x5c, 0x5c, 0x20, 0xb8, 0xb7, 0x15, 0xd7, 0x2d, 0xc7, 0xd5, 0x0b, 0x79, 0x6d, 0x86, 0x4b, 0xff, 0x4f, 0xcb, 0x02, 0x8a, 0xd8, 0xee, 0x9e, 0xe4, 0x80, 0x1a, 0xf2, 0xa4, 0x4d, 0xca, 0xd9, 0x47, 0x99, 0x81, 0x1d, 0x82, 0x17, 0xbc, 0x97, 0xd7, 0x11, 0x24, 0x97, 0x67, 0xf3, 0x09, 0x86, 0x07, 0x0d, 0x0c, 0xc9, 0x95, 0x95, 0x1b, 0xe9, 0x8d, 0xeb, 0xa3, 0xf1, 0xd7, 0x21, 0x00, 0x18, 0xe3, 0xbb, 0x39, 0xa0, 0xf8, 0xb3, 0xea, 0xfe, 0xc9, 0xc1, 0x81, 0x3b, 0x4a, 0xd9, 0xad, 0x9a, 0xc1, 0xf4, 0x14, 0x7b, 0x20, 0x13, 0x45, 0x7f, 0x92, 0x81, 0xed, 0xed, 0x54, 0x59, 0x4d, 0x55, 0xc6, 0x49, 0xeb, 0x73, 0xc2, 0x95, 0x88, 0x55, 0x2c, 0x5f, 0x53, 0xc0, 0xca, 0x25, 0x5c, 0xd1, 0x56, 0x8b, 0x4b, 0xe0, 0xd2, 0x5b, 0x52, 0xa9, 0x1c, 0xca, 0x60, 0xae, 0xc2, 0xfd, 0x98, 0xd7, 0x17, 0xcb, 0x01, 0x5c, 0x87, 0xc5, 0x7f, 0xe4, 0x27, 0x73, 0x02, 0xef, 0x90, 0xe1, 0xfd, 0x71, 0xee, 0x5a, 0x1a, 0xbf, 0x54, 0x74, 0x2c, 0xaf, 0x53, 0x4d, 0x64, 0xfb, 0xca, 0x13, 0xc9, 0xe7, 0xff, 0xca, 0xe2, 0x24, 0xef, 0x49, 0xb5, 0xf3, 0xe3, 0x86, 0xf6, 0x8e, 0x44, 0x14, 0x78, 0xc3, 0xb0, 0xea, 0xe7, 0xe2, 0x4d, 0x66, 0xb9, 0xd9, 0x5e, 0x92, 0x62, 0x9e, 0x14, 0xa5, 0xc7, 0xcd, 0xa6, 0xcd, 0xf6, 0x93, 0xa4, 0x2b, 0x14, 0xca, 0x88, 0x1f, 0x96, 0x65, 0x8e, 0xc7, 0xb5, 0x0f, 0xc5, 0xc2, 0x1b, 0x0f, 0x66, 0x3a, 0xe3, 0x6f, 0x65, 0x21, 0xc0, 0x5d, 0x47, 0xba, 0x7c, 0xd1, 0x33, 0x5c, 0xa5, 0x70, 0x4b, 0x73, 0x83, 0xb1, 0x3d, 0xc7, 0x4c, 0x3e, 0x14, 0x01, 0x9b, 0x9d, 0x55, 0x6b, 0x1f, 0x0f, 0x47, 0xf7, 0x90, 0xb8, 0x92, 0x83, 0xe8, 0x01, 0x0b, 0x5b, 0xcf, 0x3b, 0xcf, 0xff, 0x57, 0x85, 0x8f, 0x27, 0xe9, 0xef, 0x2a, 0x05, 0x80, 0xdf, 0x81, 0xca, 0x14, 0xb4, 0x87, 0x6b, 0x5a, 0xaa, 0x97, 0xa5, 0xaa, 0xfd, 0x0b, 0x3f, 0x40, 0x52, 0x0a, 0x8f, 0xa8, 0x52, 0xa1, 0x3f, 0x74, 0x98, 0x15, 0x51, 0x30, 0xcd, 0x78, 0x61, 0x98, 0x11, 0x7b, 0x2a, 0x08, 0x9d, 0x83, 0x4c, 0x33, 0xa7, 0xff, 0x4d, 0x18, 0x86, 0xf8, 0xdd, 0x32, 0x17, 0xe9, 0x5e, 0xef, 0x5f, 0xd2, 0xa3, 0x64, 0x72, 0x88, 0xf8, 0x3f, 0x93, 0x4f, 0x63, 0xfd, 0x9c, 0xaa, 0x2a, 0x5d, 0xa1, 0x72, 0x95, 0x14, 0xd0, 0x26, 0xf5, 0xc2, 0x9b, 0x82, 0xe5, 0x25, 0x1a, 0x53, 0xd0, 0x8c, 0xaa, 0x89, 0xb4, 0x8f, 0xdb, 0x8e, 0x25, 0xfe, 0x89, 0xd6, 0x94, 0x17, 0x48, 0xb8, 0xd1, 0xfc, 0x06, 0x7c, 0xcf, 0x64, 0xeb, 0xb5, 0xa8, 0x90, 0x84, 0xd1, 0xe0, 0x81, 0x21, 0xee, 0xee, 0x68, 0x7b, 0xef, 0xf8, 0x5e, 0x9a, 0xcf, 0xdf, 0x55, 0xf6, 0x36, 0x7b, 0x4e, 0xdd, 0x4a, 0x28, 0xcd, 0x14, 0xc8, 0x81, 0x8a, 0xc1, 0x53, 0x6b, 0x6a, 0x88, 0x0c, 0x56, 0xad, 0xf5, 0x62, 0xbf, 0x69, 0x1a, 0x2c, 0xf9, 0x37, 0x79, 0xf5, 0x2e, 0x2c, 0x24, 0x96, 0xa1, 0x0b, 0x22, 0x0b, 0x35, 0xb8, 0x15, 0x7f, 0x33, 0xf0, 0x1a, 0xa9, 0x48, 0x38, 0xf1, 0x5b, 0xcd, 0x13, 0x5e, 0x58, 0x4b, 0x78, 0xce, 0x67, 0x3f, 0x83, 0x3e, 0xa5, 0x1a, 0x6b, 0x59, 0x1f, 0x8c, 0xb4, 0xe0, 0xa0, 0x02, 0xa6, 0x4f, 0xc8, 0x6e, 0xfd, 0xbe, 0x5e, 0x46, 0xe2, 0x05, 0xe7, 0xcf, 0x1a, 0x23, 0x78, 0x9b, 0x7e, 0xe1, 0xc8, 0x50, 0xab, 0xb2, 0x89, 0xac, 0xfa, 0xde, 0xf9, 0xc6, 0xb3, 0xdf, 0xb4, 0x97, 0x7d, 0x0b, 0xcc, 0xb8, 0x19, 0x74, 0x1b, 0x6d, 0x50, 0x0d, 0xd8, 0xe3, 0x2a, 0x0e, 0x69, 0xb6, 0x61, 0x99, 0x78, 0xb6, 0x15, 0x9d, 0x49, 0xeb, 0xc1, 0xfb, 0x4b, 0xd7, 0x6e, 0xe7, 0xed, 0xfa, 0x27, 0x91, 0xb2, 0x9c, 0xac, 0x05, 0x88, 0xc6, 0x6b, 0x50, 0x56, 0x92, 0xab, 0xe5, 0xd4, 0xa4, 0x0b, 0x3f, 0x9f, 0xf9, 0x2b, 0xc7, 0x8d, 0xe0, 0xa9, 0xf7, 0x3d, 0x45, 0x4f, 0xc0, 0xf3, 0x35, 0x8a, 0x29, 0xa3, 0x9f, 0x1e, 0x3a, 0x4c, 0x58, 0x19, 0x18, 0x88, 0x62, 0x05, 0x71, 0x60, 0x6e, 0x62, 0x1a, 0x64, 0x9f, 0x54, 0xf7, 0xfc, 0x91, 0x98, 0x1c, 0xf9, 0x9a, 0xbc, 0x31, 0x6f, 0x50, 0x90, 0x1b, 0xc7, 0x4b, 0xd8, 0xd9, 0x10, 0x2c, 0x43, 0xab, 0x96, 0xdd, 0xa1, 0x7a, 0xb6, 0x1b, 0x50, 0x74, 0xf0, 0x32, 0xf7, 0xf7, 0x3e, 0x08, 0x77, 0xb0, 0xa4, 0x5d, 0x1f, 0x04, 0x09, 0x51, 0x20, 0xae, 0x45, 0x27, 0x40, 0xaa, 0x7b, 0x48, 0xd2, 0x52, 0xa9, 0x8b, 0xe5, 0xc8, 0x7d, 0xb3, 0xbc, 0x93, 0x6b, 0x3a, 0x7e, 0x8d, 0xfc, 0x4d, 0x2f, 0xfc, 0x69, 0x17, 0xdf, 0xff, 0x68, 0x42, 0x21, 0x2c, 0x46, 0xbb, 0xbf, 0x77, 0x36, 0xb6, 0xac, 0x55, 0xe9, 0xf3, 0x3a, 0x22, 0x5e, 0x3f, 0x8d, 0xc0, 0xfc, 0x3d, 0x50, 0x82, 0xde, 0x66, 0xa6, 0x48, 0x6e, 0x4f, 0x64, 0xeb, 0x35, 0x2a, 0x7d, 0xdb, 0xf1, 0x90, 0xbe, 0x06, 0xe8, 0x7e, 0xbb, 0xfc, 0x7d, 0x9d, 0x09, 0x51, 0x01, 0xc6, 0xad, 0x43, 0xcb, 0xc5, 0xd5, 0x9d, 0x8b, 0x5d, 0xc6, 0xdc, 0xdb, 0x8d, 0x16, 0x8f, 0x17, 0x12, 0x1b, 0x04, 0x6f, 0x2d, 0xa3, 0x20, 0x3a, 0xa6, 0xe5, 0x8f, 0x8d, 0x11, 0xb8, 0x1e, 0x0d, 0x50, 0x03, 0x64, 0x01, 0x59, 0x75, 0xa8, 0xac, 0x3a, 0x76, 0xff, 0xd9, 0x5a, 0x5d, 0xb5, 0xb7, 0x01, 0xe3, 0xee, 0xe7, 0x1a, 0xd7, 0x8d, 0xd4, 0x38, 0x14, 0x55, 0x43, 0xd8, 0xb1, 0x4e, 0x2b, 0xe6, 0x77, 0x6b, 0xc6, 0x82, 0x98, 0x69, 0xe8, 0x03, 0x9d, 0xfa, 0x90, 0x3c, 0xa1, 0x23, 0xbc, 0xff, 0xbd, 0xe3, 0x82, 0xe0, 0xc3, 0x15, 0x5d, 0x3b, 0x2f, 0x97, 0xc5, 0x79, 0x5a, 0xac, 0x02, 0x8e, 0xf1, 0x9f, 0x41, 0xc6, 0xa6, 0xaa, 0xe8, 0xc2, 0x25, 0x15, 0x27, 0xbd, 0x4a, 0xa2, 0xcf, 0x15, 0x91, 0x29, 0x68, 0x06, 0xce, 0x80, 0x7e, 0xb8, 0x1e, 0x9d, 0x3b, 0x7c, 0x1d, 0xff, 0x3b, 0x52, 0x59, 0x4a, 0x9b, 0xb0, 0x07, 0x31, 0x53, 0x7e, 0xf5, 0x98, 0xc6, 0x65, 0xc0, 0xfa, 0x98, 0x49, 0x47, 0x09, 0xc0, 0x14, 0x5f, 0x95, 0xde, 0xb6, 0xc9, 0xaf, 0xce, 0x6a, 0x61, 0x0e, 0x7d, 0x3a, 0x97, 0xb2, 0xfb, 0xc5, 0x23, 0xc6, 0xd2, 0x40, 0xf5, 0xcb, 0x97, 0xbb, 0x6b, 0xf3, 0xbe, 0xa5, 0xc7, 0xcb, 0xb2, 0x93, 0xe0, 0x1d, 0x26, 0x3d, 0x18, 0x15, 0xa5, 0xc9, 0x8d, 0xa2, 0x71, 0x4d, 0x94, 0x1f, 0x8a, 0x8f, 0x63, 0x33, 0x0d, 0x0f, 0x0d, 0xf6, 0xbf, 0x47, 0xb4, 0x55, 0xea, 0x31, 0xf9, 0xb7, 0x68, 0x0a, 0xb8, 0xe1, 0xfd, 0x56, 0xf3, 0x16, 0xea, 0x24, 0x0b, 0x83, 0xbe, 0x93, 0x36, 0xdb, 0x70, 0x95, 0x2d, 0x3f, 0xab, 0xf3, 0x25, 0x60, 0x69, 0x91, 0x01, 0xe7, 0xc3, 0xf4, 0xc6, 0x15, 0x07, 0x01, 0x4f, 0xa6, 0x0c, 0x07, 0x42, 0xfc, 0xc2, 0x00, 0x42, 0x79, 0x0d, 0x14, 0x66, 0x2d, 0xd4, 0x5f, 0xea, 0xb1, 0x55, 0xf4, 0x25, 0x52, 0xbb, 0x22, 0xbb, 0x72, 0xf2, 0xf6, 0x14, 0x2c, 0xba, 0x00, 0x0d, 0x37, 0xfa, 0x5a, 0xed, 0x0d, 0x57, 0xe7, 0x9a, 0x4c, 0x06, 0xd9, 0x0d, 0x5c, 0xde, 0x76, 0x03, 0x52, 0xb2, 0x1b, 0xf5, 0x14, 0xdd, 0x81, 0x4b, 0xbe, 0x1e, 0x3f, 0xcd, 0x45, 0xa7, 0x90, 0x5a, 0x5b, 0x70, 0x57, 0xdc, 0x92, 0xd1, 0x60, 0x7b, 0xc3, 0x50, 0xe9, 0x11, 0xb1, 0xb8, 0x61, 0xde, 0xea, 0x6b, 0x6f, 0x7e, 0xee, 0xf8, 0x36, 0x17, 0x93, 0xf0, 0xd8, 0xd7, 0xa8, 0xf6, 0x38, 0x9e, 0xd9, 0x16, 0x05, 0xf7, 0xd2, 0x58, 0xf4, 0x4d, 0xa8, 0x94, 0x4c, 0x5c, 0x74, 0x87, 0xa8, 0xe5, 0x41, 0x27, 0xf8, 0xa6, 0x28, 0x34, 0xca, 0x89, 0xb9, 0x10, 0xc8, 0x1c, 0x9d, 0xd0, 0x81, 0x41, 0x7a, 0x93, 0x6c, 0x27, 0x17, 0x12, 0x29, 0x78, 0xc1, 0x79, 0x0b, 0xd4, 0xed, 0x76, 0xd4, 0x7f, 0x1e, 0x8f, 0xbf, 0x56, 0x09, 0xb8, 0xc4, 0x08, 0xf7, 0x25, 0x17, 0x82, 0x6c, 0x5d, 0xf2, 0xab, 0x06, 0x90, 0x94, 0x52, 0xa7, 0x2a, 0x8a, 0x64, 0xd7, 0xa8, 0x2d, 0x63, 0x63, 0xaa, 0x6c, 0x13, 0x4a, 0x4a, 0xcb, 0x77, 0xda, 0xad, 0xac, 0xfb, 0x17, 0xd7, 0xcd, 0xf3, 0x5c, 0xc4, 0x13, 0x44, 0x45, 0xb4, 0x86, 0x61, 0xcb, 0xc6, 0x9c, 0x7a, 0xb1, 0xc8, 0xba, 0xf0, 0x20, 0x4e, 0xf8, 0x0b, 0x8e, 0x01, 0x25, 0xef, 0xe4, 0x3a, 0x0b, 0xcc, 0xdf, 0xd0, 0xf3, 0x56, 0xb6, 0x2e, 0x6c, 0x75, 0xfe, 0xa8, 0x49, 0x3d, 0xcb, 0x0f, 0xe9, 0x20, 0x19, 0x82, 0xbb, 0x62, 0x6a, 0x88, 0x00, 0xce, 0xb0, 0x5c, 0xd3, 0xa8, 0x6c, 0x88, 0x67, 0xe2, 0x18, 0xb5, 0x91, 0x92, 0xc3, 0xc2, 0x86, 0xa4, 0xfb, 0x13, 0xe5, 0xcc, 0xef, 0x2c, 0xf8, 0xbf, 0xd5, 0x7e, 0x37, 0xa3, 0x8a, 0x80, 0x0d, 0xc4, 0x78, 0x02, 0xdf, 0x88, 0xbd, 0xbf, 0x4b, 0xa5, 0x8a, 0x31, 0xad, 0x91, 0xc8, 0xa9, 0xe8, 0x3b, 0x02, 0x9e, 0x63, 0xf8, 0x7f, 0x45, 0x51, 0xc0, 0xae, 0x63, 0x36, 0x9a, 0xc8, 0x60, 0xa6 ],
+const [ 0xec, 0x2f, 0x78, 0x52, 0xd0, 0xa6, 0xe6, 0xd1, 0x3f, 0xd4, 0x22, 0x02, 0x33, 0xa0, 0x0d, 0x9c, 0x9c, 0x06, 0x3d, 0x24, 0xf6, 0x5e, 0x3b, 0x56, 0x20, 0xe1, 0xef, 0xc6, 0x6c, 0x69, 0x58, 0xc7, 0xf3, 0x78, 0x81, 0x8c, 0x2b, 0x7c, 0xb0, 0x8d, 0xbb, 0x51, 0xe0, 0x2c, 0x8d, 0x08, 0x71, 0x99, 0x25, 0xe7, 0x1f, 0xf3, 0x32, 0xb0, 0x31, 0xb0, 0x63, 0x27, 0xf2, 0x3e, 0x7c, 0xce, 0x65, 0xea, 0xa9, 0xf3, 0x35, 0x02, 0x12, 0xec, 0xeb, 0x36, 0xaf, 0xa2, 0x63, 0x44, 0x5e, 0x4c, 0x81, 0xd5, 0x33, 0x7d, 0x20, 0xa1, 0x0f, 0x61, 0x4b, 0xda, 0x74, 0x43, 0xb0, 0xc8, 0x97, 0x53, 0x51, 0xb1, 0xb7, 0xa7, 0x7d, 0xfb, 0xae, 0x7f, 0xff, 0x94, 0xc6, 0xcd, 0x95, 0x92, 0xcd, 0xf5, 0xa4, 0x17, 0x6c, 0xd1, 0x29, 0x78, 0xb4, 0xf8, 0xf3, 0x9e, 0xfa, 0x40, 0x10, 0xac, 0xe5, 0x81, 0x85, 0xe1, 0xc5, 0x9c, 0x42, 0xc1, 0x26, 0xbc, 0x54, 0x6f, 0xa6, 0xdc, 0x5d, 0x5e, 0x03, 0x8a, 0x41, 0x28, 0x78, 0xea, 0x23, 0xbe, 0x4a, 0xfd, 0x90, 0xc2, 0x9e, 0x23, 0xf9, 0x31, 0x8d, 0xdf, 0x67, 0x45, 0x7a, 0xdb, 0x6a, 0x9a, 0xa3, 0x2c, 0x52, 0x8f, 0xf7, 0xd6, 0xa2, 0xef, 0x28, 0x93, 0xc2, 0xd1, 0x00, 0xd0, 0xf4, 0xbc, 0xf8, 0xf9, 0x89, 0x0f, 0x07, 0xf6, 0x55, 0xa0, 0xb8, 0xf6, 0x60, 0xa4, 0x7f, 0x6b, 0xde, 0xcf, 0x4d, 0x55, 0x62, 0xbc, 0x62, 0xc4, 0x4e, 0x8e, 0x63, 0x98, 0x8e, 0xd8, 0xac, 0x8c, 0x86, 0xba, 0xe7, 0x73, 0x48, 0x4d, 0xdd, 0xc1, 0x0b, 0x41, 0x8d, 0x4c, 0xd9, 0xc5, 0x7b, 0x54, 0x87, 0xa7, 0x4b, 0xc1, 0xea, 0xbd, 0x8e, 0xad, 0x48, 0x83, 0xdc, 0x22, 0x0d, 0x05, 0x23, 0x25, 0xbf, 0x00, 0x3e, 0xf3, 0x34, 0x44, 0xca, 0x8a, 0x03, 0x5c, 0x35, 0x6b, 0x38, 0x71, 0x17, 0x9f, 0x4c, 0x6c, 0xc6, 0xf8, 0x54, 0x5b, 0x25, 0x99, 0x78, 0x16, 0xbc, 0xb8, 0xa7, 0x22, 0x0e, 0xa3, 0x89, 0xd5, 0x26, 0x01, 0xb5, 0xbb, 0x74, 0x5b, 0x25, 0x39, 0xd7, 0xdb, 0xe6, 0x70, 0xfb, 0x53, 0x14, 0x64, 0xe5, 0x80, 0x06, 0x5e, 0xcc, 0x91, 0xc6, 0x8f, 0x2b, 0xe3, 0xc4, 0xf5, 0x14, 0x0f, 0xcb, 0x83, 0xc7, 0x26, 0x33, 0x7c, 0x83, 0x3b, 0x59, 0x20, 0x9c, 0x22, 0x4c, 0x8a, 0xce, 0x78, 0xc9, 0xd9, 0xd1, 0xe3, 0x6a, 0x8e, 0x2d, 0x9b, 0x1a, 0x35, 0x50, 0x2a, 0xcc, 0x48, 0xde, 0x70, 0x6d, 0x50, 0x48, 0xe9, 0x16, 0x4d, 0xa0, 0x33, 0x87, 0x58, 0xac, 0xca, 0xd1, 0x87, 0x39, 0x17, 0x52, 0x11, 0xb1, 0xa9, 0xe6, 0xb2, 0xf0, 0xc2, 0x5c, 0x51, 0x54, 0x15, 0x27, 0xe1, 0x13, 0xce, 0x56, 0x85, 0xd2, 0xd3, 0xc7, 0xf7, 0x73, 0x49, 0x97, 0x2a, 0x2e, 0x5b, 0xdc, 0x2e, 0xe3, 0x36, 0x97, 0x55, 0xae, 0x58, 0xe4, 0x94, 0xbd, 0x0b, 0x74, 0x2b, 0x5e, 0x2c, 0x3d, 0x88, 0x5c, 0x31, 0x70, 0x69, 0x8c, 0x6b, 0xac, 0x42, 0xa3, 0x87, 0x71, 0xde, 0x4a, 0x5b, 0xd7, 0x48, 0x75, 0xe0, 0x80, 0xec, 0xf0, 0x7a, 0xcb, 0xfa, 0x3a, 0x80, 0x4a, 0x0b, 0x97, 0xf8, 0x77, 0x07, 0x61, 0xa2, 0xa2, 0x46, 0x9f, 0x39, 0x2e, 0xf5, 0xd9, 0xf5, 0xfd, 0xbc, 0x2a, 0x54, 0x29, 0x9d, 0x96, 0x1a, 0xf5, 0x20, 0x9e, 0x96, 0x03, 0xad, 0x12, 0x28, 0xc7, 0x39, 0x27, 0x00, 0x3b, 0x25, 0xc9, 0x28, 0xd4, 0x62, 0x32, 0xc5, 0xb5, 0xda, 0xbc, 0x9a, 0x24, 0x0b, 0xf3, 0xcd, 0x3a, 0xf5, 0xef, 0xee, 0xde, 0x37, 0xe1, 0x35, 0xf4, 0x75, 0xeb, 0x0b, 0xd1, 0xfc, 0x35, 0xcc, 0xf2, 0xa9, 0x3d, 0xcc, 0xee, 0x07, 0x6e, 0x98, 0xaa, 0xb7, 0xf5, 0x7e, 0xcc, 0x15, 0xd0, 0x4f, 0x72, 0x18, 0x27, 0x63, 0x23, 0x7a, 0xe0, 0xde, 0x06, 0x19, 0x6e, 0x32, 0x51, 0x9e, 0xe9, 0xe5, 0x05, 0x5c, 0x64, 0x95, 0xd9, 0x7b, 0x7b, 0x39, 0x73, 0x55, 0x2b, 0xa9, 0xde, 0x20, 0xe7, 0x61, 0x39, 0xce, 0xe7, 0x81, 0xac, 0x31, 0xc4, 0x19, 0xa1, 0x63, 0x42, 0xa4, 0x30, 0x65, 0x6c, 0xd2, 0xda, 0x06, 0xe7, 0x8b, 0x7b, 0x06, 0x80, 0x30, 0x7a, 0x7c, 0x07, 0x24, 0x43, 0x75, 0x60, 0x8b, 0xf7, 0xde, 0xd7, 0x51, 0x61, 0xa4, 0xb4, 0x6e, 0x2d, 0x19, 0x0f, 0x69, 0x54, 0x9a, 0xe6, 0x1b, 0xdb, 0x6f, 0x6d, 0xb6, 0xbd, 0xf2, 0xa5, 0x06, 0x26, 0xf3, 0x30, 0xf6, 0xe1, 0x5c, 0x64, 0x55, 0x14, 0x11, 0x9e, 0xda, 0x2b, 0x1a, 0xd9, 0x66, 0x12, 0x04, 0x7f, 0x8a, 0xa7, 0x84, 0x7e, 0x49, 0x6f, 0x5e, 0x9f, 0x1f, 0x87, 0x85, 0x14, 0x42, 0xde, 0x84, 0x4f, 0x27, 0xa2, 0x1c, 0x1b, 0x48, 0xf8, 0x2f, 0xe5, 0x25, 0xf0, 0xdd, 0x5a, 0x88, 0xb8, 0xec, 0x38, 0x0e, 0x10, 0x6d, 0x5d, 0xe3, 0xfd, 0x9c, 0x25, 0xcd, 0xc2, 0x09, 0xf2, 0x6c, 0x0c, 0xf5, 0x0c, 0xc0, 0x6d, 0xff, 0xac, 0xeb, 0x0b, 0x00, 0x53, 0x38, 0x9a, 0x33, 0x60, 0x5d, 0x87, 0x99, 0xe2, 0xfd, 0x76, 0x9b, 0xab, 0x71, 0xef, 0xf2, 0xa6, 0xc8, 0x54, 0xc4, 0x6a, 0x0c, 0x17, 0x0f, 0x0e, 0xc7, 0x29, 0x4b, 0x3f, 0xc6, 0xb6, 0x4b, 0x91, 0x1d, 0x0f, 0x65, 0x13, 0x6c, 0xe8, 0xd2, 0x26, 0x60, 0xc3, 0x57, 0x8f, 0x7c, 0xac, 0x25, 0xca, 0x19, 0x27, 0xff, 0xa1, 0xab, 0x67, 0x9a, 0xfe, 0x47, 0xc0, 0x49, 0xfe, 0x62, 0x5f, 0xda, 0x46, 0xdc, 0x39, 0xba, 0x9a, 0x3d, 0x41, 0x60, 0xac, 0x3e, 0xde, 0xe9, 0x31, 0x8b, 0x9c, 0x00, 0x3a, 0xc7, 0x22, 0x01, 0xc2, 0xd0, 0x64, 0x5e, 0x83, 0x45, 0x19, 0x41, 0x0f, 0x46, 0x70, 0x73, 0x1b, 0x7b, 0xfe, 0x7c, 0x1e, 0x58, 0xfb, 0x0c, 0x1b, 0x9f, 0xaf, 0x99, 0xba, 0x26, 0x27, 0x4a, 0x9e, 0xda, 0x2c, 0x14, 0xf3, 0x04, 0x76, 0x23, 0x46, 0xcb, 0x1c, 0x7b, 0x9a, 0xfa, 0x4f, 0xdf, 0xb8, 0x04, 0x48, 0xf1, 0xc6, 0x46, 0x7f, 0x9c, 0x1b, 0x8b, 0x1e, 0xaf, 0x52, 0xd5, 0xb5, 0xca, 0x9d, 0x5b, 0x2f, 0x7e, 0x5c, 0xce, 0x05, 0xb0, 0xef, 0xe0, 0xb1, 0x3e, 0xc8, 0x07, 0x66, 0xe6, 0xc4, 0x7e, 0xfe, 0x63, 0xbb, 0x8e, 0x34, 0xd8, 0x56, 0x0b, 0x13, 0x72, 0x20, 0x21, 0xae, 0x49, 0xe0, 0x51, 0x12, 0x88, 0x27, 0xb6, 0x79, 0xce, 0x25, 0x8d, 0xc0, 0xd4, 0xc0, 0xf4, 0x1b, 0x4f, 0xe8, 0xf2, 0x08, 0x18, 0x24, 0xb8, 0x81, 0x8a, 0x71, 0x26, 0x76, 0x2b, 0x4d, 0x91, 0x7a, 0x8f, 0x0f, 0xc4, 0xbd, 0x7a, 0x79, 0x44, 0x3a, 0x45, 0x90, 0xd9, 0x31, 0x83, 0xab, 0x49, 0xd8, 0xe4, 0xcb, 0x67, 0x4e, 0x59, 0x2a, 0x4c, 0xd0, 0x78, 0x17, 0xe5, 0x2f, 0x23, 0x00, 0xae, 0x81, 0x64, 0xd1, 0xbc, 0x17, 0x9c, 0x7d, 0x01, 0xb0, 0xdd, 0xd9, 0xcc, 0xec, 0x94, 0xb1, 0x8f, 0x04, 0x6b, 0x16, 0xe5, 0xb7, 0x6d, 0xf5, 0xd3, 0x88, 0x6b, 0xee, 0x4e, 0x26, 0x9f, 0x62, 0xfe, 0x2c, 0x90, 0xce, 0x42, 0x0a, 0x35, 0x58, 0x74, 0x43, 0x5d, 0xa8, 0x6e, 0xda, 0x4f, 0xf9, 0x4d, 0x06, 0xad, 0x70, 0x75, 0x2d, 0x9e, 0xac, 0xd5, 0x10, 0x2b, 0x9e, 0x6c, 0x44, 0xea, 0x9b, 0x0b, 0xe1, 0xda, 0xaf, 0x5d, 0x7e, 0x8f, 0x35, 0x26, 0x5c, 0x8f, 0xa4, 0xc8, 0xe1, 0xfb, 0xac, 0x0b, 0x48, 0x72, 0x82, 0x1d, 0x98, 0x32, 0x78, 0xd8, 0xd2, 0x80, 0xd0, 0x44, 0x6f, 0x4b, 0xd2, 0x5d, 0x09, 0x0c, 0x1c, 0x16, 0x59, 0xf0, 0x3a, 0x9d, 0x61, 0x39, 0x76, 0xe1, 0xea, 0xe1, 0xf1, 0x52, 0x31, 0x81, 0xf3, 0xe7, 0xde, 0x72, 0x80, 0x66, 0x35, 0x32, 0x2c, 0xe0, 0x90, 0x09, 0x30, 0x7a, 0x0d, 0xec, 0xbc, 0x74, 0x84, 0xa1, 0x8f, 0x63, 0xbc, 0x24, 0xc6, 0xc1, 0xde, 0x4a, 0xf1, 0xa8, 0x29, 0xa4, 0x6c, 0xdb, 0xe8, 0xa6, 0xed, 0x06, 0xa1, 0x08, 0x59, 0x47, 0x90, 0x6d, 0xdc, 0xec, 0x53, 0x43, 0x38, 0x7f, 0xe7, 0xea, 0x5d, 0x00, 0xd3, 0x18, 0x3b, 0x71, 0xa3, 0x7c, 0xd4, 0x98, 0x98, 0xa1, 0x95, 0x00, 0x9e, 0x16, 0xe6, 0x41, 0x7e, 0xcc, 0x00, 0x81, 0x55, 0xbf, 0xfe, 0x3b, 0x45, 0xd8, 0x37, 0x3f, 0x6a, 0x12, 0xcc, 0xfa, 0x10, 0xdd, 0x7d, 0xf8, 0x23, 0xc0, 0xc1, 0xa7, 0xe6, 0x41, 0x15, 0x5e, 0xe8, 0x09, 0x94, 0x9d, 0x35, 0x44, 0xc8, 0x97, 0xc9, 0x47, 0xc0, 0xed, 0x4a, 0x75, 0x62, 0xbd, 0xf6, 0x63, 0x03, 0xdb, 0xda, 0x3a, 0x35, 0x5e, 0x44, 0x5d, 0xe0, 0x5f, 0x7c, 0x4c, 0x95, 0xfd, 0xaf, 0xc9, 0x1e, 0xa4, 0x2c, 0x39, 0x5a, 0x90, 0xd3, 0x4c, 0x48, 0x8c, 0xc9, 0xe0, 0x61, 0x00, 0x71, 0x23, 0x2b, 0x2a, 0x98, 0xf8, 0x0b, 0xac, 0xf0, 0x9d, 0x5a, 0x47, 0xc0, 0x8a, 0xbc, 0xe6, 0xd9, 0x9c, 0xad, 0xde, 0xcc, 0x72, 0x5d, 0x74, 0x5a, 0x18, 0xbe, 0xa0, 0x2c, 0xe2, 0xdb, 0x10, 0xc5, 0x9b, 0x6b, 0x70, 0xb4, 0xdf, 0xa6, 0xe9, 0x0e, 0xc6, 0x57, 0xe7, 0x1b, 0xc3, 0x33, 0x20, 0x50, 0xcb, 0x69, 0xd2, 0x7d, 0xb9, 0x7a, 0x4b, 0x48, 0xf1, 0x4b, 0xaf, 0xda, 0x43, 0x79, 0xf6, 0xd8, 0x13, 0xec, 0x34, 0x95, 0xb7, 0xaf, 0x1d, 0x86, 0x21, 0xfe, 0xc8, 0xf6, 0xbe, 0xa1, 0xb3, 0xfa, 0x9d, 0x79, 0x08, 0xa8, 0xd4, 0x59, 0x1e, 0x84, 0x20, 0x17, 0x43, 0x3b, 0xcb, 0xe2, 0xb9, 0x94, 0xd3, 0xd5, 0xfe, 0xa3, 0x48, 0xcd, 0x50, 0x40, 0xf6, 0x78, 0x71, 0xb7, 0x44, 0xaf, 0xa8, 0xc1, 0x5c, 0x06, 0x08, 0xb3, 0x8c, 0xa1, 0xf4, 0xf6, 0xec, 0x49, 0xe3, 0xb7, 0x42, 0xbe, 0x61, 0xdf, 0x22, 0x4f, 0x57, 0x46, 0x5a, 0xa9, 0x8b, 0x23, 0x8d, 0xed, 0x6a, 0xc8, 0x1d, 0x05, 0x06, 0x8c, 0x4e, 0x37, 0x5b, 0x08, 0xa9, 0xfa, 0xd6, 0x86, 0x9f, 0x09, 0x18, 0xb6, 0x6f, 0xb7, 0xf7, 0xa3, 0x4a, 0x82, 0xc5, 0xe6, 0xb4, 0xea, 0xd5, 0x19, 0x2d, 0x84, 0x3c, 0x8f, 0x11, 0x4a, 0xd5, 0x42, 0xbd, 0x35, 0x88, 0x0d, 0xf3, 0x0e, 0xcb, 0x1c, 0x80, 0x81, 0x68, 0xa0, 0x1b, 0x73, 0x81, 0xc7, 0x91, 0x95, 0xd2, 0xeb, 0x1f, 0x39, 0x37, 0x0a, 0x1f, 0x65, 0x6e, 0x76, 0xe8, 0x26, 0x1d, 0xcd, 0xef, 0x27, 0x17, 0x2c, 0x32, 0x82, 0xdb, 0xa0, 0xd6, 0xd6, 0x5e, 0xdd, 0x0e, 0x9a, 0x0a, 0x33, 0x40, 0xb1, 0x06, 0xbd, 0x63, 0x3e, 0xb8, 0xdc, 0xac, 0xb9, 0x88, 0xe3, 0x69, 0x43, 0xe7, 0x14, 0x2d, 0x36, 0x90, 0xcc, 0x2d, 0x01, 0x0e, 0xfa, 0xea, 0x33, 0x7f, 0xd5, 0x10, 0xd5, 0x97, 0xcf, 0x9e, 0xfd, 0xe8, 0xc4, 0x48, 0xa0, 0x60, 0x78, 0x1a, 0xa8, 0x13, 0x40, 0x5d, 0x46, 0x3a, 0xff, 0xbe, 0x8a, 0x7c, 0x54, 0xad, 0x31, 0x6d, 0x12, 0x04, 0xbe, 0x55, 0xf1, 0xe9, 0xcc, 0x32, 0x83, 0xf5, 0xa2, 0x00, 0x69, 0x96, 0x08, 0x37, 0xc6, 0xb1, 0x59, 0x96, 0xf4, 0x8c, 0xda, 0x1f, 0x76, 0xec, 0x4a, 0x63, 0x2e, 0x7a, 0xba, 0xff, 0xd0, 0x6b, 0x9f, 0x67, 0x97, 0x60, 0x26, 0xe2, 0x37, 0x8b, 0xc7, 0xd6, 0x12, 0x14, 0x1d, 0x46, 0xae, 0xbb, 0xf5, 0x99, 0x67, 0xbe, 0xa5, 0x9d, 0x61, 0xfd, 0x9f, 0xcb, 0xc1, 0x5c, 0x45, 0xcd, 0x1d, 0x69, 0xff, 0x3d, 0x30, 0x3f, 0x8b, 0xb0, 0xd3, 0xaa, 0x95, 0xf3, 0x29, 0x8b, 0x88, 0x94, 0x19, 0x7e, 0xa3, 0xa4, 0x01, 0xbb, 0x4f, 0xbc, 0xa8, 0x3a, 0xb0, 0x3e, 0x75, 0x1b, 0x7a, 0xdd, 0xdf, 0x44, 0x06, 0x60, 0x25, 0x4c, 0xa5, 0xa2, 0x3f, 0x98, 0x34, 0xde, 0x14, 0xc3, 0xf0, 0x29, 0xed, 0x43, 0x8c, 0x40, 0x2a, 0x4a, 0x81, 0x84, 0x34, 0xeb, 0xa6, 0x43, 0xb2, 0x7e, 0x00, 0x39, 0x00, 0x45, 0xdb, 0x57, 0xdc, 0x50, 0x19, 0xc3, 0x63, 0x9d, 0xcb, 0x1f, 0x3d, 0x84, 0xfe, 0x0e, 0x14, 0x52, 0xd7, 0xf4, 0x4a, 0x35, 0xe3, 0xfe, 0xeb, 0x58, 0xa8, 0x63, 0xe0, 0x4e, 0x80, 0xe9, 0x66, 0xb4, 0xa7, 0xaa, 0xbf, 0x12, 0x92, 0x18, 0x27, 0x03, 0x82, 0x3f, 0x0a, 0x96, 0x5a, 0x4a, 0x74, 0xf3, 0xad, 0x49, 0xc9, 0x42, 0x1c, 0x31, 0xb6, 0xc8, 0xdf, 0x24, 0x67, 0x53, 0xa1, 0xf3, 0xfb, 0xd9, 0x91, 0xe2, 0x35, 0x5c, 0xb6, 0xab, 0x74, 0x10, 0x82, 0xc5, 0xe5, 0xc0, 0xab, 0xe5, 0xf7, 0x6e, 0x36, 0xc6, 0x0f, 0x3a, 0xd5, 0x26, 0x7e, 0x85, 0x72, 0x11, 0xb0, 0x55, 0x0c, 0x61, 0xa5, 0xfb, 0xc2, 0x86, 0xa5, 0xf4, 0x2d, 0x83, 0x30, 0x0e, 0xf3, 0x39, 0x35, 0xcb, 0x99, 0xe8, 0x84, 0x0a, 0x99, 0xf3, 0x84, 0xe4, 0xb5, 0xe3, 0x29, 0xd5, 0x8a, 0xaf, 0x21, 0x1c, 0x68, 0x3b, 0x4e, 0x64, 0x61, 0x1e, 0x79, 0xa3, 0xa0, 0xa8, 0x45, 0x43, 0xfd, 0x24, 0x61, 0x80, 0xce, 0x5a, 0x02, 0x11, 0xff, 0x58, 0x91, 0x0a, 0x65, 0x72, 0xa0, 0x01, 0x4f, 0x88, 0x23, 0x6f, 0x5e, 0x87, 0xdd, 0x5a, 0x97, 0x32, 0x18, 0x31, 0xb7, 0x23, 0x99, 0xf8, 0xc6, 0x0c, 0xd3, 0xa4, 0xef, 0x43, 0x5b, 0xc9, 0x8f, 0x7e, 0x9c, 0x72, 0x8c, 0xdb, 0xcc, 0x50, 0xe8, 0x23, 0x1f, 0x18, 0x96, 0x4f, 0x3a, 0x26, 0x8c, 0x4b, 0xea, 0x66, 0x19, 0xfb, 0x16, 0x74, 0x79, 0x7c, 0xf2, 0x02, 0xa7, 0xac, 0x76, 0x7b, 0x72, 0xec, 0x0f, 0xe5, 0xd3, 0x24, 0x94, 0x0c, 0x7e, 0x08, 0x7b, 0xdd, 0xb7, 0x9a, 0x4d, 0x10, 0x67, 0xf0, 0x57, 0x0a, 0x6f, 0x38, 0xa3, 0x01, 0x3c, 0xf9, 0x26, 0x61, 0x9b, 0x9c, 0x3b, 0x6e, 0xcf, 0x2a, 0x50, 0x2b, 0xe2, 0x57, 0xdf, 0x7b, 0x38, 0xc0, 0xa1, 0x87, 0x6a, 0x71, 0xfe, 0x5f, 0x51, 0xaa, 0xc7, 0xe4, 0x60, 0xe3, 0x27, 0xe5, 0x37, 0x0d, 0xd7, 0x88, 0x76, 0x1b, 0x92, 0xec, 0xcf, 0xc1, 0xc9, 0x0c, 0x60, 0x7b, 0x97, 0xe7, 0x3f, 0xd2, 0xf7, 0xde, 0x56, 0xdb, 0x35, 0x5d, 0x71, 0x00, 0xa2, 0xbd, 0x95, 0x02, 0x8c, 0x69, 0x94, 0x3f, 0x6d, 0x40, 0xde, 0x31, 0x63, 0x3b, 0x9a, 0x38, 0xe0, 0x50, 0xf5, 0x99, 0xa3, 0x96, 0xba, 0xc6, 0xe7, 0xa9, 0x24, 0xe0, 0xda, 0x50, 0xf0, 0x7a, 0x50, 0x5d, 0xb5, 0xa0, 0xb9, 0xd5, 0x78, 0x17, 0x50, 0x51, 0x7b, 0xe7, 0x96, 0xa4, 0x57, 0x17, 0xff, 0xbe, 0x4a, 0xb8, 0xeb, 0xd1, 0xd2, 0x25, 0xd7, 0xb2, 0x7b, 0x88, 0xd5, 0x81, 0xf5, 0xa0, 0x39, 0x8c, 0x69, 0xc2, 0x96, 0x71, 0x0d, 0x1e, 0xe9, 0x83, 0xf7, 0x44, 0x13, 0x6f, 0x2f, 0xe7, 0x8d, 0x20, 0x07, 0xe0, 0x57, 0xdf, 0xaf, 0x75, 0x31, 0xbf, 0x04, 0xdc, 0x0e, 0x38, 0xa9, 0xfb, 0xc6, 0x12, 0x59, 0x72, 0x0b, 0x84, 0x7b, 0xdb, 0x9e, 0x9e, 0xf7, 0x50, 0xc2, 0xe4, 0x49, 0x2e, 0xf2, 0x3c, 0xd4, 0x19, 0xcf, 0x0a, 0x78, 0x41, 0x5c, 0x99, 0x66, 0xe3, 0x6d, 0xbd, 0x33, 0x12, 0x5d, 0xb6, 0x2c, 0xb7, 0x00, 0x58, 0xea, 0xd7, 0xd8, 0x69, 0x26, 0x14, 0x8c, 0x4b, 0xce, 0x77, 0x95, 0xda, 0x57, 0x6c, 0x3b, 0x98, 0x56, 0x0e, 0xc0, 0x08, 0x4a, 0xa5, 0xdb, 0x57, 0xbc, 0x6d, 0x68, 0x41, 0x8b, 0x9a, 0x5d, 0x33, 0x81, 0x98, 0x00, 0xad, 0x29, 0x97, 0x57, 0xeb, 0xe5, 0x47, 0xe0, 0xc4, 0x3b, 0xe0, 0x83, 0xd2, 0x70, 0x66, 0xc5, 0xd3, 0x58, 0x2b, 0x3e, 0x4f, 0x6c, 0x95, 0x4d, 0x7c, 0x1d, 0x21, 0x0a, 0x5e, 0x68, 0xa8, 0x7c, 0x32, 0xab, 0xe2, 0x0d, 0x0d, 0xb7, 0x28, 0x3a, 0xc1, 0x26, 0x7e, 0x8f, 0x00, 0xef, 0xd0, 0xd3, 0xc4, 0x37, 0x7c, 0x80, 0xed, 0x6a, 0x11, 0x76, 0x2c, 0x8b, 0x56, 0xef, 0x21, 0xc8, 0x8f, 0xb6, 0xc0, 0x52, 0xfb, 0x94, 0xf9, 0x6b, 0xa1, 0x0b, 0x98, 0xc1, 0x4d, 0x47, 0x6a, 0xfa, 0xd5, 0x52, 0xa1, 0x90, 0xa0, 0x87, 0x79, 0xdf, 0x69, 0x49, 0x1c, 0x7c, 0x41, 0xf5, 0xc3, 0xc9, 0xd3, 0x14, 0x1f, 0xc6, 0xec, 0xd6, 0xf7, 0x2a, 0x3b, 0xbc, 0x12, 0xb3, 0x55, 0x94, 0x57, 0xba, 0xfb, 0xaa, 0x33, 0x0a, 0xa0, 0x3d, 0x3b, 0xf2, 0x26, 0x30, 0x13, 0x99, 0xe9, 0x02, 0x8e, 0x92, 0xfe, 0x00, 0x16, 0xb0, 0xbd, 0xb9, 0x4f, 0x1c, 0x7c, 0xb3, 0xf7, 0xa4, 0x9e, 0x5c, 0x11, 0x56, 0xcd, 0x43, 0x42, 0x4e, 0x83, 0x88, 0x7b, 0xcc, 0xcf, 0x92, 0xd8, 0x8a, 0x56, 0xff, 0xc8, 0x4c, 0x98, 0xe1, 0x6f, 0xb8, 0x74, 0x27, 0x48, 0x68, 0xee, 0x59, 0x0f, 0x3e, 0x31, 0x89, 0xde, 0xf7, 0xd0, 0x86, 0x96, 0x03, 0x51, 0x52, 0x80, 0x94, 0xec, 0xd6, 0x34, 0xf6, 0x90, 0xd5, 0xba, 0x1e, 0x27, 0x1f, 0xf0, 0x85, 0x1b, 0x07, 0x2b, 0x37, 0x19, 0x16, 0x21, 0x26, 0x15, 0x01, 0x07, 0xc5, 0x8e, 0xd9, 0xf6, 0xd2, 0x13, 0x82, 0x93, 0x73, 0x06, 0x66, 0xef, 0x85, 0xa0, 0x6a, 0xac, 0x31, 0x35, 0x22, 0x62, 0xc0, 0xb9, 0x40, 0x40, 0xb0, 0x84, 0x53, 0xf7, 0x07, 0x52, 0xae, 0xd3, 0xe7, 0x8e, 0xa5, 0x2b, 0x63, 0xd0, 0x00, 0xfc, 0x91, 0xa4, 0xa9, 0xd1, 0xe0, 0x8d, 0xa8, 0xe6, 0xac, 0x49, 0x51, 0x8c, 0x10, 0x57, 0xbc, 0xcf, 0xfc, 0xb7, 0x76, 0x57, 0x87, 0xf1, 0x76, 0x8c, 0x86, 0x58, 0x53, 0xfe, 0x5d, 0x90, 0xb4, 0x03, 0x15, 0x4e, 0x07, 0xa2, 0xaf, 0x5f, 0x76, 0xaf, 0xb8, 0xec, 0x16, 0x38, 0x1e, 0xfc, 0x62, 0x20, 0x42, 0x3a, 0xe9, 0x0a, 0x4e, 0xf9, 0x43, 0x78, 0xc9 ],
+const [ 0x0b, 0x6e, 0xde, 0xb5, 0xf0, 0x6b, 0x22, 0x77, 0x3d, 0x0a, 0xf7, 0x27, 0xdd, 0x59, 0xbd, 0xf5, 0x52, 0xa1, 0x30, 0x00, 0x4c, 0xa4, 0x97, 0xbd, 0x7a, 0x23, 0x3d, 0x9d, 0xa0, 0xa3, 0x25, 0xea, 0xea, 0x71, 0xfa, 0xf2, 0x80, 0xe4, 0x45, 0x68, 0x5a, 0xe2, 0xe3, 0x07, 0x56, 0xa5, 0xb5, 0x78, 0x87, 0xbf, 0x99, 0x76, 0xd0, 0x5c, 0x99, 0x30, 0xb2, 0xc8, 0x63, 0xef, 0x63, 0x31, 0xf9, 0xf8, 0x20, 0xad, 0xaa, 0xb4, 0xc3, 0x7f, 0x41, 0x0e, 0x98, 0x96, 0x7c, 0x1d, 0x6d, 0x56, 0xc0, 0x03, 0xe8, 0x9b, 0x0a, 0x15, 0x1e, 0xfb, 0x29, 0x3c, 0x60, 0x4c, 0x2b, 0x9a, 0x58, 0x66, 0x15, 0x71, 0x56, 0x2a, 0xd7, 0x41, 0xe4, 0xc4, 0x7e, 0x31, 0xa0, 0x2c, 0xac, 0xb0, 0x4b, 0xf3, 0x45, 0x5c, 0x1d, 0x3c, 0x6c, 0x23, 0x5b, 0x09, 0xae, 0xa8, 0x2c, 0xb8, 0x7c, 0xe8, 0xa9, 0xcd, 0xdf, 0x1d, 0x33, 0xf1, 0x67, 0xe3, 0x09, 0x3b, 0x65, 0x99, 0x19, 0xaf, 0x59, 0x0a, 0x17, 0x04, 0xae, 0x4c, 0xcd, 0xab, 0xa5, 0xe9, 0xb2, 0x0c, 0x90, 0x3d, 0xbd, 0x13, 0x40, 0x1f, 0x7b, 0xeb, 0xc0, 0xc4, 0x60, 0x09, 0x44, 0xdf, 0x5b, 0x6d, 0x5c, 0x0d, 0xac, 0x24, 0x6d, 0x71, 0xfa, 0x12, 0x62, 0x9b, 0xa0, 0xee, 0x9f, 0xaf, 0x49, 0x8e, 0x36, 0xc3, 0xbc, 0x65, 0x5e, 0x88, 0xf9, 0x4a, 0x21, 0x2d, 0x84, 0x7a, 0x54, 0x80, 0x01, 0xe1, 0xcc, 0x57, 0x01, 0x95, 0xcf, 0x2e, 0x1c, 0xa4, 0xc9, 0x11, 0x40, 0x0f, 0x40, 0xbd, 0x48, 0x16, 0x0a, 0x02, 0xd0, 0xb6, 0xbe, 0x6b, 0x48, 0x71, 0x68, 0x21, 0x48, 0x4d, 0x81, 0x0d, 0x23, 0x1f, 0x1e, 0x3d, 0xbf, 0x09, 0x67, 0x89, 0xa4, 0x42, 0x4b, 0x76, 0x52, 0x15, 0x72, 0x5a, 0xd8, 0x2d, 0x73, 0xc1, 0xa2, 0x0f, 0x48, 0x10, 0x93, 0xe8, 0xff, 0x68, 0x54, 0x89, 0xb1, 0xcd, 0xeb, 0xb0, 0xb8, 0x88, 0x8f, 0x89, 0x1d, 0xc9, 0xba, 0x74, 0x50, 0x91, 0x81, 0x09, 0x1c, 0xcf, 0x21, 0x59, 0xd9, 0xca, 0xda, 0x77, 0xe4, 0xbe, 0x00, 0x38, 0x4c, 0xca, 0x4f, 0x36, 0xce, 0x09, 0x7f, 0x1b, 0x04, 0x00, 0x18, 0x1c, 0xd9, 0x38, 0x88, 0xc3, 0x40, 0x2b, 0x72, 0xf2, 0x26, 0x65, 0x4a, 0x25, 0xa4, 0xe3, 0x1f, 0xf7, 0x7a, 0xbf, 0xb7, 0xe8, 0xb9, 0x0f, 0xe1, 0x5d, 0xbf, 0x0a, 0x07, 0xe8, 0x68, 0x6c, 0x03, 0xca, 0x83, 0x1c, 0x33, 0xb6, 0x83, 0x0c, 0xd0, 0xd8, 0x77, 0x61, 0x7b, 0x16, 0x3d, 0xd5, 0x19, 0x96, 0xf2, 0x59, 0xe1, 0x80, 0xac, 0xfe, 0xb3, 0x05, 0x6c, 0x15, 0xac, 0xa0, 0x4e, 0x95, 0xf7, 0x9b, 0x03, 0xbe, 0xe6, 0xd6, 0x81, 0xfc, 0x41, 0xc4, 0xf9, 0x0e, 0xde, 0xb6, 0x0a, 0x67, 0x71, 0x5c, 0x34, 0xd5, 0xa6, 0x88, 0x8f, 0x60, 0x6d, 0x36, 0xbd, 0x75, 0x95, 0xca, 0x1d, 0x44, 0x9d, 0x98, 0x41, 0x66, 0xc7, 0xa9, 0xa3, 0xc3, 0x6d, 0xbc, 0x93, 0xb3, 0x98, 0x8c, 0x74, 0x63, 0xcf, 0x51, 0x28, 0x7b, 0x2d, 0x89, 0xc9, 0xfd, 0xb7, 0xf8, 0x9a, 0x70, 0xec, 0xee, 0x3d, 0x3f, 0x9d, 0xc8, 0x26, 0x5c, 0xfe, 0xb9, 0x4f, 0x28, 0xfe, 0xcb, 0x2d, 0x97, 0xd4, 0x20, 0xe4, 0x8f, 0xda, 0x7e, 0xb7, 0x92, 0x9f, 0x0b, 0xc2, 0x9d, 0x37, 0x54, 0xeb, 0x50, 0xd6, 0x94, 0x16, 0x4e, 0x9e, 0x34, 0x98, 0xe7, 0xb4, 0x8e, 0xee, 0xf5, 0x99, 0xf6, 0xb0, 0x03, 0xb8, 0xfb, 0xc0, 0xb5, 0x3b, 0xea, 0xc7, 0x64, 0x23, 0x94, 0xe2, 0x08, 0x98, 0x51, 0x98, 0x5b, 0x7d, 0x45, 0x10, 0x3b, 0x48, 0xe2, 0x80, 0x50, 0x11, 0xae, 0xe9, 0xf0, 0xe8, 0x47, 0x02, 0x3f, 0x6c, 0xa4, 0x71, 0x9b, 0x9a, 0x9d, 0x41, 0x37, 0xe2, 0xae, 0x91, 0x05, 0x80, 0xf8, 0x89, 0xda, 0x09, 0x88, 0x93, 0xcd, 0x44, 0xdc, 0xc7, 0xe0, 0x3c, 0xa3, 0xa6, 0xe2, 0x93, 0xc5, 0x0c, 0x93, 0x19, 0xa3, 0x60, 0x0a, 0x9d, 0xa0, 0x0e, 0x54, 0x04, 0xe0, 0x37, 0x5e, 0x98, 0x50, 0xa7, 0x14, 0xa2, 0xe6, 0x07, 0xcb, 0x3a, 0x2a, 0x53, 0xdc, 0x5e, 0xf5, 0x8f, 0x92, 0x42, 0x78, 0xb6, 0x47, 0xe7, 0x81, 0xf4, 0xc9, 0xef, 0xfa, 0x14, 0x03, 0xb0, 0xb2, 0x3c, 0xd9, 0x87, 0x61, 0xd8, 0x53, 0x6e, 0xe6, 0xd4, 0xfe, 0xd1, 0xd2, 0x0e, 0x8f, 0x9e, 0x2a, 0x0b, 0xca, 0x9c, 0x69, 0xe9, 0xa2, 0xfd, 0xc5, 0x94, 0xa2, 0x36, 0xb3, 0x3d, 0x8b, 0x0e, 0xad, 0x08, 0x3f, 0xf5, 0x33, 0x05, 0xdd, 0x98, 0x10, 0x62, 0x2e, 0xb2, 0xde, 0xdf, 0x40, 0x25, 0xcc, 0x81, 0x50, 0x49, 0x9f, 0x8b, 0xed, 0x84, 0xf7, 0xaa, 0x5b, 0x1b, 0xd4, 0x70, 0x36, 0x47, 0x58, 0x03, 0x57, 0x8c, 0xcf, 0x17, 0xfc, 0x46, 0xec, 0x19, 0x22, 0x85, 0x55, 0xad, 0x36, 0x1a, 0x63, 0x5b, 0xed, 0xf2, 0x22, 0x85, 0x71, 0xa3, 0xa0, 0x9d, 0xbd, 0x45, 0x64, 0x95, 0x4a, 0x83, 0x3c, 0x96, 0xeb, 0xf1, 0x3c, 0xf4, 0xf5, 0xa1, 0x03, 0x62, 0xa4, 0xf1, 0x40, 0x62, 0xba, 0xa6, 0x75, 0x00, 0x69, 0x3f, 0xfb, 0xc0, 0x73, 0x83, 0x47, 0xd5, 0x90, 0x5d, 0x6b, 0x93, 0x10, 0xe9, 0xdf, 0x27, 0xc1, 0xcf, 0x82, 0x86, 0x13, 0xd0, 0xdc, 0xa3, 0x7a, 0x9e, 0xa6, 0xe5, 0x14, 0xf1, 0x8c, 0xd8, 0x8c, 0xd7, 0x31, 0x23, 0x3e, 0x4b, 0x74, 0xba, 0x9c, 0x0a, 0xf2, 0x54, 0xd0, 0xa2, 0xcb, 0x20, 0xa3, 0xcc, 0xaa, 0xb3, 0x9d, 0xfb, 0xff, 0x45, 0x6d, 0x35, 0x8f, 0x1e, 0x8c, 0x22, 0x2f, 0x4b, 0x1e, 0x63, 0xcc, 0x95, 0x19, 0x24, 0xaf, 0xb4, 0xa8, 0xf5, 0xff, 0xbf, 0xd2, 0xd5, 0x88, 0xe7, 0x57, 0x90, 0xba, 0x65, 0xda, 0x4c, 0xf5, 0xb1, 0x45, 0x5e, 0x04, 0xf5, 0x6a, 0x62, 0xe7, 0xc1, 0xe6, 0x8a, 0xd5, 0x00, 0x4b, 0x36, 0x81, 0x2b, 0x7e, 0xc5, 0x9d, 0xbc, 0x5d, 0xab, 0x9c, 0xe6, 0xa5, 0xc4, 0xbd, 0x83, 0x13, 0xe9, 0x45, 0x4e, 0xca, 0xc0, 0x0b, 0x52, 0xf5, 0xd8, 0x3a, 0xa2, 0xad, 0xf5, 0x53, 0x4b, 0x1d, 0xa8, 0x71, 0x87, 0xe4, 0x23, 0xd1, 0x33, 0xba, 0x4c, 0x91, 0x83, 0x57, 0x10, 0xb8, 0xf5, 0x91, 0xfa, 0x77, 0x83, 0xc4, 0x04, 0xaf, 0x1d, 0x76, 0xad, 0xb2, 0x56, 0x3b, 0x4b, 0x4e, 0x5e, 0xd7, 0xa3, 0x08, 0x30, 0xa3, 0xb7, 0xa5, 0x0c, 0x32, 0xdf, 0xef, 0x28, 0x33, 0x1b, 0xb5, 0xa3, 0x99, 0xa8, 0x14, 0xba, 0xfa, 0xd1, 0xf5, 0x3e, 0x35, 0x08, 0xd7, 0x45, 0x58, 0x35, 0xcf, 0x21, 0xc1, 0x4e, 0xcc, 0x8e, 0x83, 0x28, 0x20, 0x2f, 0x0b, 0x8d, 0x3c, 0x3c, 0x03, 0x8e, 0xbb, 0x75, 0x76, 0x1a, 0xa3, 0x5a, 0x35, 0xd0, 0xe7, 0x9d, 0x7a, 0x12, 0x30, 0xd8, 0xcc, 0x5b, 0xdc, 0x7c, 0x22, 0xd2, 0x47, 0x09, 0x4b, 0x1f, 0x4a, 0x85, 0x8d, 0x7d, 0x02, 0x27, 0x8d, 0x10, 0xd3, 0x53, 0x6e, 0x7a, 0xac, 0xcb, 0x3d, 0xa9, 0x8c, 0x23, 0x8d, 0xf2, 0x45, 0x75, 0x5e, 0x64, 0x80, 0x57, 0x44, 0x56, 0x01, 0x0a, 0xc5, 0x43, 0x2c, 0xf4, 0x02, 0xd8, 0xc8, 0x50, 0x9a, 0x4a, 0x04, 0x25, 0xcb, 0xed, 0xb7, 0x74, 0xda, 0x03, 0xec, 0xb6, 0xb5, 0xd1, 0x9e, 0x86, 0xd8, 0xf9, 0xc0, 0x9a, 0x6d, 0x03, 0x81, 0xf7, 0xb7, 0x3d, 0xcd, 0x65, 0xb0, 0xc5, 0x17, 0x21, 0xf1, 0xe4, 0x56, 0xd3, 0xd3, 0x9d, 0x4d, 0xbf, 0xd4, 0x86, 0x10, 0x3f, 0x3c, 0xd7, 0xc4, 0x71, 0x00, 0xc1, 0xa6, 0x2d, 0xe6, 0x01, 0x4f, 0x3a, 0xea, 0xb4, 0x36, 0xc1, 0xe0, 0x6d, 0x76, 0x01, 0x5c, 0x85, 0xd1, 0x45, 0xcf, 0xb2, 0xf5, 0x13, 0xf2, 0xdb, 0xff, 0xa7, 0x68, 0x2b, 0x3e, 0xa0, 0x9f, 0x65, 0x39, 0xf8, 0xf7, 0x77, 0xf3, 0x39, 0x26, 0x51, 0x6d, 0xee, 0xdb, 0xf7, 0x6d, 0x58, 0xa1, 0xd5, 0x7e, 0x63, 0x06, 0x54, 0x38, 0xd8, 0xfd, 0xaa, 0xc1, 0xd4, 0x82, 0xf6, 0x94, 0x79, 0x7c, 0x8c, 0x81, 0xe3, 0xe7, 0x8d, 0xf5, 0x5e, 0x32, 0xbc, 0x7c, 0xd6, 0xe6, 0x8c, 0x84, 0x8f, 0x89, 0x7e, 0x64, 0x16, 0xc2, 0xa9, 0x9d, 0x77, 0xbe, 0x9a, 0x5f, 0xb0, 0xd1, 0x5f, 0x4f, 0x66, 0x61, 0xdf, 0x87, 0xd7, 0x00, 0x6d, 0xde, 0x10, 0xd8, 0x9c, 0x6a, 0x5f, 0x4c, 0x54, 0x44, 0x0c, 0xdc, 0x25, 0x8b, 0x44, 0x49, 0xdc, 0xac, 0x56, 0xfa, 0x54, 0xe0, 0x22, 0x9f, 0x8f, 0xf6, 0xcd, 0x14, 0x05, 0x52, 0xba, 0x88, 0x3c, 0x36, 0xb6, 0xde, 0x99, 0x40, 0x73, 0x53, 0x76, 0x34, 0x38, 0x62, 0x75, 0xfc, 0xd6, 0xe5, 0x13, 0xed, 0xde, 0x7c, 0x80, 0x4c, 0x11, 0x32, 0xae, 0x11, 0x18, 0x5e, 0xa7, 0xea, 0x76, 0xc8, 0x25, 0x83, 0xba, 0x0d, 0x5c, 0x05, 0xf9, 0x45, 0x1b, 0xdd, 0x7b, 0xe2, 0x13, 0xbe, 0xb5, 0xdb, 0x76, 0xe9, 0x77, 0x0b, 0xc5, 0xac, 0x67, 0xd4, 0xe3, 0x28, 0xae, 0x07, 0x6d, 0x58, 0xf1, 0x08, 0x4e, 0x4f, 0x83, 0x2d, 0x8d, 0xc1, 0xd9, 0x68, 0x6a, 0xc5, 0x3e, 0x26, 0xaa, 0xd9, 0xc7, 0x76, 0x2f, 0x27, 0x8a, 0x6e, 0xcb, 0x07, 0x0b, 0xca, 0x56, 0xc4, 0xf7, 0xd7, 0xfe, 0xa3, 0x15, 0x90, 0xdf, 0x21, 0x79, 0x06, 0xd4, 0x7d, 0xfb, 0x05, 0x8c, 0x76, 0xe7, 0xf4, 0xe0, 0x56, 0xf6, 0xfd, 0x63, 0x2f, 0x7d, 0x6e, 0x3b, 0x65, 0xe5, 0x5f, 0x30, 0x6c, 0x5b, 0x96, 0x03, 0xd3, 0xc8, 0xa7, 0x01, 0x82, 0x04, 0x5f, 0xd7, 0x40, 0x47, 0x63, 0xa8, 0x78, 0xe0, 0x15, 0x5d, 0x3c, 0x29, 0xb7, 0x3d, 0x8a, 0xba, 0xd3, 0xbd, 0xce, 0xdd, 0xda, 0x99, 0xa9, 0x42, 0x0b, 0x23, 0xf1, 0xf4, 0x96, 0xdb, 0xf9, 0x8c, 0x02, 0x41, 0x12, 0xa5, 0xcc, 0xe7, 0x51, 0x8f, 0x51, 0xca, 0x93, 0x48, 0xed, 0xe2, 0xbf, 0xa7, 0x65, 0xf8, 0x4b, 0xdb, 0x82, 0xb8, 0x02, 0x14, 0xff, 0x07, 0x04, 0x80, 0xa6, 0x97, 0x0e, 0x79, 0xb5, 0xb8, 0xfb, 0xfd, 0x86, 0x71, 0x8b, 0x5e, 0x6f, 0xcf, 0x64, 0x3a, 0xe8, 0x7d, 0x56, 0xae, 0xeb, 0x95, 0xe3, 0xc7, 0xa1, 0xb6, 0xff, 0x39, 0x3a, 0x57, 0x14, 0x54, 0x1c, 0x5a, 0x49, 0x33, 0x41, 0xe4, 0x04, 0x37, 0xda, 0x6d, 0xad, 0xb4, 0x39, 0x13, 0xb6, 0xe9, 0xed, 0x34, 0xd8, 0x36, 0x2f, 0x3b, 0x9f, 0x89, 0x7d, 0xba, 0x28, 0x1a, 0x84, 0xba, 0x2a, 0x58, 0x43, 0x4f, 0x33, 0x22, 0x6e, 0x6f, 0x34, 0x3b, 0x10, 0x03, 0x40, 0xf8, 0x75, 0x3f, 0x91, 0x3c, 0x47, 0x2f, 0xcc, 0xa6, 0xf7, 0x93, 0x85, 0x09, 0x5e, 0xed, 0x06, 0x1d, 0xa5, 0xd8, 0x4c, 0x74, 0x62, 0x9b, 0x53, 0xaf, 0x03, 0xfe, 0x94, 0xf1, 0x70, 0x5d, 0xcb, 0x94, 0xec, 0xfa, 0xfd, 0x1b, 0x3c, 0x97, 0xba, 0x68, 0x0c, 0x45, 0xa0, 0x30, 0x8e, 0x77, 0x20, 0xab, 0x64, 0x5a, 0x85, 0x90, 0xc0, 0x69, 0x31, 0x40, 0xca, 0x3c, 0x2a, 0x41, 0x42, 0xa0, 0xd6, 0xef, 0x66, 0xed, 0x03, 0x6e, 0x16, 0x94, 0x2a, 0xe3, 0x36, 0xf8, 0xf5, 0xe4, 0x54, 0x7f, 0xfe, 0x2d, 0x8a, 0xe8, 0xda, 0x94, 0xa6, 0xdf, 0x56, 0x3f, 0x89, 0xce, 0x00, 0x14, 0xcd, 0xf7, 0xea, 0x71, 0xab, 0xc0, 0xaa, 0x1d, 0x1b, 0x4d, 0xa5, 0x7f, 0x3c, 0x54, 0x8e, 0x0e, 0xf7, 0x2d, 0x29, 0x09, 0xdf, 0x29, 0x55, 0x68, 0x5c, 0x25, 0x49, 0x12, 0x09, 0x5f, 0x1e, 0x50, 0x5a, 0x88, 0x8e, 0x82, 0x82, 0x1a, 0xfb, 0x11, 0x94, 0xeb, 0xb2, 0xa4, 0xe8, 0x03, 0x72, 0x97, 0xc0, 0xaa, 0x28, 0xa9, 0x2b, 0xc6, 0xfd, 0xf4, 0x2a, 0x64, 0x92, 0x23, 0x12, 0x95, 0x8a, 0xdf, 0x31, 0x7b, 0x4a, 0x8a, 0xb4, 0xa3, 0xfc, 0x30, 0xc8, 0x95, 0xda, 0xba, 0x00, 0xaa, 0xa9, 0x65, 0xf7, 0x1e, 0x83, 0x73, 0x36, 0x66, 0xda, 0x21, 0x58, 0xc4, 0xba, 0xd8, 0x6c, 0x18, 0x4e, 0xa7, 0x9a, 0xf9, 0xa6, 0xf1, 0x0a, 0x04, 0xb7, 0x63, 0x01, 0x74, 0xa4, 0x29, 0x4d, 0xf4, 0x3c, 0x62, 0xe4, 0xb1, 0xc3, 0xd1, 0xc8, 0xb2, 0xf5, 0xd5, 0x2d, 0x6c, 0x48, 0x9b, 0xde, 0x91, 0x72, 0x92, 0xdd, 0x2a, 0x2b, 0x1f, 0x49, 0xe5, 0x34, 0x93, 0x85, 0xb0, 0x98, 0x5a, 0x97, 0x86, 0x32, 0x74, 0xce, 0x89, 0x6f, 0x2a, 0xa8, 0x52, 0x55, 0xf9, 0xf2, 0x85, 0xc4, 0xd3, 0x31, 0xa8, 0xfc, 0x87, 0x41, 0x35, 0x60, 0x7d, 0x3c, 0xed, 0x7a, 0xa6, 0x9e, 0x70, 0x3e, 0xb3, 0xa6, 0x0b, 0x93, 0x85, 0xff, 0xd1, 0x0f, 0xe5, 0x9f, 0xed, 0x02, 0x76, 0xf0, 0x36, 0xb7, 0xe7, 0x2d, 0x04, 0xf6, 0x6d, 0x0f, 0x42, 0xcd, 0x71, 0xaa, 0xc5, 0x91, 0x86, 0x91, 0xdc, 0x1f, 0x9d, 0x41, 0x29, 0x67, 0x7c, 0xbd, 0xaf, 0x2c, 0x6c, 0x75, 0x2b, 0x05, 0x32, 0x6c, 0xa8, 0xa8, 0x41, 0x9a, 0x4e, 0x67, 0x2e, 0x90, 0x7b, 0xfb, 0x64, 0x5a, 0x15, 0x81, 0x19, 0xa9, 0x1e, 0xc2, 0x81, 0x32, 0x88, 0xb7, 0x41, 0x51, 0x4b, 0x4d, 0x26, 0xf2, 0xb6, 0x65, 0x17, 0xb1, 0x02, 0x1f, 0x48, 0x40, 0x2d, 0x58, 0xb1, 0x09, 0x06, 0x71, 0xbf, 0x15, 0x84, 0x52, 0x49, 0x2d, 0x5b, 0xaf, 0xc5, 0x3f, 0xd1, 0x8a, 0xbc, 0x03, 0xce, 0xfa, 0x7b, 0xdd, 0x33, 0x2a, 0x0c, 0x06, 0x6d, 0xa4, 0x64, 0xe7, 0x4a, 0xd0, 0xde, 0xc5, 0x0b, 0xb7, 0xe8, 0xa3, 0xba, 0x0d, 0xfc, 0x64, 0xbe, 0x6f, 0xd3, 0x31, 0xac, 0xe9, 0xd5, 0x1a, 0x60, 0xbb, 0xd3, 0x00, 0x4d, 0x5d, 0xf8, 0xb2, 0x11, 0xc0, 0xfd, 0x56, 0x4c, 0xd7, 0x9d, 0x0b, 0xb3, 0x56, 0x49, 0xcc, 0x60, 0xba, 0x1c, 0x97, 0x6c, 0x89, 0x11, 0xcf, 0xc0, 0xdb, 0x74, 0xe0, 0x28, 0x19, 0x96, 0x21, 0xaa, 0x05, 0xc5, 0xfe, 0x15, 0xfa, 0x7b, 0x56, 0xdc, 0x75, 0xd6, 0x22, 0x25, 0xd5, 0x48, 0x58, 0x1e, 0x5f, 0x90, 0x0f, 0x90, 0x85, 0xe9, 0xe3, 0xb6, 0x68, 0x81, 0x9b, 0x4f, 0x9b, 0x2c, 0x09, 0xf2, 0x2a, 0x5a, 0x32, 0xa2, 0xdb, 0x47, 0xaf, 0xa2, 0xb3, 0x71, 0x53, 0x8a, 0xbc, 0x4f, 0x0e, 0x9b, 0x06, 0x40, 0x11, 0x50, 0xec, 0xc2, 0x33, 0x35, 0x98, 0xe4, 0x94, 0xfc, 0xca, 0xfe, 0x80, 0xce, 0xd4, 0x9f, 0x96, 0xdf, 0xea, 0xc7, 0x29, 0x45, 0x98, 0x56, 0xe6, 0x0a, 0x94, 0xc5, 0xb7, 0x80, 0xb6, 0x14, 0xe8, 0xd4, 0x45, 0x03, 0x89, 0xe6, 0x74, 0x85, 0x13, 0x58, 0x2c, 0x72, 0x4e, 0xe6, 0x0c, 0x7c, 0x71, 0xf5, 0xaf, 0x64, 0x8b, 0x6e, 0x2d, 0x6e, 0x23, 0xcc, 0xe4, 0x12, 0x1b, 0x74, 0x78, 0xf4, 0xdb, 0x45, 0x18, 0x16, 0xab, 0x71, 0x03, 0x4c, 0x5f, 0x8b, 0x4b, 0xf1, 0x3a, 0xe1, 0xd9, 0xd9, 0x0d, 0x0b, 0xb2, 0x86, 0x9f, 0xc4, 0x79, 0x9f, 0x51, 0xf9, 0x34, 0x9d, 0x02, 0x20, 0x53, 0xc8, 0x31, 0xcb, 0xee, 0x62, 0x61, 0x7d, 0x4e, 0x22, 0xc2, 0xbc, 0xaf, 0xe4, 0x0d, 0x67, 0x44, 0x9e, 0xb0, 0x4a, 0x7c, 0x96, 0x2b, 0xf0, 0x84, 0xd2, 0xba, 0xb8, 0x0d, 0xd0, 0x34, 0x2b, 0x4f, 0x78, 0x33, 0x8d, 0x4d, 0x4f, 0x75, 0xb2, 0x5b, 0xed, 0x82, 0x14, 0xde, 0xb1, 0x8f, 0x22, 0x54, 0xb3, 0xa3, 0xda, 0x94, 0xfa, 0xf8, 0x99, 0x56, 0xf0, 0xa4, 0x32, 0xf5, 0x12, 0x78, 0x3e, 0x74, 0xec, 0x29, 0xb4, 0xc0, 0x45, 0xad, 0xba, 0x34, 0x97, 0xe8, 0xba, 0x62, 0xc2, 0x88, 0xb7, 0x11, 0x00, 0x2e, 0xe2, 0x82, 0x1c, 0xce, 0x68, 0xf8, 0xdf, 0x58, 0x8f, 0x76, 0xcc, 0x98, 0x01, 0xcb, 0x0d, 0x5b, 0x67, 0xcc, 0xac, 0xd3, 0x3a, 0xe1, 0x06, 0x3c, 0xd6, 0xc3, 0x7d, 0xc0, 0xd1, 0x83, 0x6e, 0x98, 0x8a, 0xcf, 0x63, 0x75, 0x05, 0x71, 0x89, 0x1e, 0xf6, 0x18, 0x64, 0x5a, 0x1b, 0x5b, 0xc1, 0x10, 0xcf, 0xfb, 0xec, 0xad, 0xdd, 0x68, 0x24, 0xc6, 0x92, 0x87, 0x4c, 0xff, 0x16, 0xb3, 0xe3, 0x2b, 0xfc, 0x02, 0x36, 0xb4, 0x17, 0xc9, 0xd4, 0x3d, 0x8f, 0x62, 0x43, 0x87, 0x35, 0x2c, 0xf1, 0x91, 0x14, 0xd4, 0x6d, 0x04, 0x48, 0xd3, 0xd7, 0xcd, 0x14, 0x38, 0x96, 0x0c, 0x2e, 0xa8, 0x48, 0x2d, 0x5d, 0xa3, 0xff, 0x54, 0x46, 0x08, 0xaa, 0xff, 0x83, 0xdc, 0xd1, 0xe7, 0xf6, 0x47, 0x86, 0x27, 0x5d, 0xdf, 0x98, 0x9f, 0x26, 0x2a, 0x09, 0x9b, 0x84, 0x5d, 0xc2, 0xb0, 0xc2, 0x6a, 0x86, 0xe7, 0xd8, 0x3a, 0x25, 0x1e, 0x3c, 0x37, 0xf2, 0xaa, 0xfa, 0x0e, 0x76, 0x41, 0x07, 0xb3, 0x66, 0x18, 0xd2, 0xa5, 0xd3, 0x48, 0x1d, 0x73, 0xa1, 0x76, 0x0b, 0x7f, 0x3a, 0xb3, 0x7a, 0x02, 0x83, 0xa1, 0x92, 0x50, 0x10, 0xd7, 0x9e, 0x5e, 0x94, 0x87, 0x1b, 0x81, 0x9b, 0x5e, 0x0f, 0x78, 0x7b, 0xac, 0x9d, 0xad, 0x87, 0xc5, 0xd5, 0xb8, 0x87, 0xa7, 0xd1, 0x25, 0x65, 0xdd, 0xfd, 0x77, 0x29, 0xa3, 0xb6, 0x6c, 0x27, 0x4a, 0x17, 0x83, 0x77, 0xde, 0x0f, 0xbc, 0xa6, 0x07, 0xb7, 0x9f, 0xab, 0x2d, 0xe3, 0x7f, 0x1d, 0xdf, 0xf8, 0x00, 0xa3, 0x76, 0xfd, 0xd7, 0xab, 0xf5, 0xf4, 0xd1, 0x5f, 0x34, 0x6a, 0x17, 0xd4, 0x3e, 0x4d, 0xb0, 0x85, 0xf7, 0xfe, 0x47, 0x01, 0x02, 0xa7, 0x2f, 0xe0, 0xe1, 0xcf, 0xa4, 0xfb, 0x5e, 0x2b, 0x54, 0xdd, 0x2a, 0xb7, 0x1e, 0x74, 0xc5, 0x06, 0x19, 0x0c, 0x9d, 0xd6, 0xd8, 0x7f, 0x7a, 0xe8, 0xec, 0xa5, 0x19, 0x0f, 0xab, 0x12, 0x17, 0x86, 0x30, 0x01, 0x12, 0x86, 0xa3, 0x8b, 0x0a, 0x18, 0xbb, 0x1d, 0x0d, 0x29, 0x80, 0x28, 0x13, 0xdc, 0x56, 0x1a, 0x27, 0x24, 0x37, 0x8e, 0xc7, 0x91, 0x40, 0xbf, 0x8e, 0x6a, 0x6f, 0x43, 0x10, 0xfd, 0xab, 0xf6, 0x06, 0x33, 0x04, 0x34, 0xab, 0x67, 0x3d, 0x4b, 0x65, 0x78, 0x87, 0x2f, 0xa8, 0x1d, 0x90, 0x70, 0x17, 0x79, 0xbc, 0x6a, 0xed, 0xf0, 0xb2, 0xbc, 0x9c, 0x38, 0x1b, 0xfb, 0xb4, 0xb3, 0xa6, 0xa7, 0x05, 0xfc, 0x50, 0x5d, 0x08, 0xc0, 0xe2, 0x4f, 0x7b, 0xcf, 0xbb, 0xf2, 0x4c, 0x72, 0xcf, 0xf6, 0xb8, 0x00, 0xf0, 0x7b, 0xb4, 0xac, 0x4d, 0x82, 0x8c, 0xa1, 0x38, 0xa1, 0xca, 0x51, 0x2c, 0xfc, 0x59, 0x09, 0x0e, 0x70, 0xea ],
+const [ 0xb0, 0x51, 0x7c, 0xc1, 0xd4, 0x6a, 0xe7, 0x9e, 0x22, 0x0c, 0x9e, 0xe7, 0x3a, 0x2a, 0x54, 0xd6, 0x7e, 0x6d, 0xa0, 0xf2, 0x68, 0x34, 0xf6, 0x32, 0x22, 0xd9, 0xd6, 0x65, 0x50, 0x36, 0x43, 0xd1, 0x30, 0x67, 0x77, 0x1b, 0xe6, 0xd2, 0xd5, 0x67, 0x11, 0x65, 0x1f, 0xbf, 0xa2, 0x1f, 0xe9, 0xb9, 0xee, 0xd2, 0x4e, 0x54, 0x02, 0x27, 0xe1, 0x24, 0x36, 0xe2, 0xe6, 0xaf, 0x05, 0x67, 0xc3, 0x16, 0x1b, 0x7d, 0xb1, 0xf8, 0xb0, 0x53, 0xb7, 0x93, 0x15, 0xc1, 0xd9, 0x2c, 0x8c, 0xcf, 0x8d, 0xb1, 0x5d, 0x7b, 0x6e, 0x9e, 0x26, 0xb7, 0x34, 0x1d, 0x73, 0xb2, 0xe4, 0x71, 0x8e, 0x58, 0x44, 0x94, 0x99, 0x1c, 0x92, 0x1f, 0xd9, 0xf5, 0x75, 0x6b, 0x55, 0xa6, 0x34, 0xf6, 0xa0, 0x43, 0x26, 0x08, 0xf3, 0xf1, 0x6a, 0x96, 0x7e, 0xed, 0xd7, 0x66, 0x00, 0xd0, 0x36, 0x74, 0x96, 0x11, 0xaf, 0x95, 0xd0, 0xcb, 0x82, 0x5a, 0x0a, 0xc0, 0xf8, 0x37, 0xfa, 0x9f, 0x98, 0xe4, 0x85, 0x82, 0x9d, 0x04, 0xd7, 0xbb, 0xa8, 0x05, 0xb2, 0xd0, 0xb3, 0x47, 0x06, 0xc4, 0x46, 0x80, 0xc3, 0x98, 0xed, 0x5f, 0xeb, 0x12, 0xe9, 0x6f, 0xeb, 0xbd, 0x26, 0x3f, 0x2b, 0x31, 0x6d, 0xc0, 0xe4, 0x94, 0xdb, 0xee, 0x32, 0x61, 0x92, 0xb2, 0x6a, 0x68, 0xae, 0x07, 0xad, 0x17, 0x7b, 0x5d, 0xbd, 0xf7, 0xe5, 0x3a, 0x10, 0x79, 0x2f, 0x27, 0x23, 0xf3, 0xe8, 0xca, 0x11, 0xe6, 0x1b, 0x50, 0x64, 0x82, 0xc7, 0x0e, 0x2b, 0x6c, 0x8e, 0x67, 0x4d, 0xbe, 0xb1, 0xf0, 0x1c, 0x50, 0x3c, 0xd2, 0x2d, 0x36, 0x7e, 0x70, 0x68, 0x89, 0xbc, 0x4a, 0x5b, 0x6b, 0x27, 0x21, 0xd3, 0x45, 0x0a, 0x5d, 0xae, 0x53, 0x48, 0xab, 0xeb, 0x63, 0x06, 0xea, 0x03, 0xd9, 0xa5, 0x48, 0x7c, 0xf7, 0xf3, 0xa8, 0xbb, 0x5b, 0xa2, 0x48, 0x1a, 0xc9, 0xf9, 0xa0, 0x3a, 0x2b, 0xc9, 0x8d, 0x9b, 0xd6, 0xa3, 0xae, 0x69, 0x0f, 0x48, 0x0e, 0x99, 0xce, 0x61, 0x04, 0x35, 0xc2, 0x70, 0x58, 0xf4, 0x94, 0x07, 0xa7, 0x0e, 0x70, 0x38, 0x09, 0x4e, 0xc2, 0x4c, 0xf0, 0x69, 0x3d, 0xb7, 0x54, 0x8e, 0x22, 0x4c, 0x0d, 0x3e, 0xbf, 0xae, 0x80, 0x5e, 0x36, 0x07, 0x7d, 0x8b, 0x7f, 0xfc, 0x68, 0xad, 0xb0, 0xe0, 0x97, 0xcf, 0x7c, 0x27, 0xfc, 0x2e, 0xfa, 0x1e, 0x04, 0x8f, 0xa8, 0xda, 0xbe, 0xd6, 0xb0, 0x6e, 0x40, 0xd5, 0x6a, 0x62, 0x47, 0x62, 0x21, 0x60, 0x1d, 0xac, 0x1a, 0x2f, 0xc0, 0xcf, 0xd2, 0xe6, 0x40, 0xa5, 0x88, 0x59, 0x69, 0xdf, 0xfb, 0xd8, 0xa2, 0x55, 0x75, 0x19, 0x15, 0x9b, 0x08, 0x72, 0x10, 0xd5, 0x18, 0x4b, 0xab, 0xcc, 0x1a, 0xd4, 0xac, 0x41, 0x9a, 0xf3, 0xa7, 0x81, 0x83, 0x81, 0x6a, 0x39, 0x9b, 0xb5, 0x98, 0x8c, 0x4d, 0xe0, 0x93, 0x63, 0xab, 0x5b, 0x9f, 0x04, 0xb3, 0xbe, 0x45, 0xe7, 0xd1, 0x53, 0xf6, 0xc4, 0xa6, 0xcb, 0xf1, 0xf1, 0x08, 0x2f, 0x67, 0xeb, 0x4a, 0x19, 0xdc, 0x33, 0xbd, 0x23, 0xd0, 0x5b, 0x76, 0xa0, 0x9f, 0x60, 0x52, 0x8a, 0xa6, 0x3a, 0x38, 0xbc, 0xa7, 0xb2, 0x9e, 0x61, 0x6e, 0x74, 0x4f, 0xad, 0xb5, 0x65, 0x6b, 0xcb, 0x46, 0x36, 0xaf, 0x16, 0x5f, 0x3a, 0xf6, 0x8b, 0x5a, 0x74, 0x00, 0x7e, 0x8d, 0xf5, 0x73, 0x8d, 0x70, 0x65, 0x1f, 0xd3, 0xfd, 0xdf, 0x86, 0x5e, 0x5d, 0x02, 0x9c, 0xe2, 0xc0, 0x44, 0xcb, 0xae, 0x8d, 0x8a, 0x3a, 0xe0, 0xbb, 0xf6, 0x4f, 0xd5, 0x7e, 0x00, 0x73, 0xe4, 0x27, 0xc9, 0x15, 0x4c, 0x45, 0xab, 0xf1, 0x6a, 0x11, 0x15, 0x92, 0x30, 0x09, 0x96, 0x15, 0xd2, 0xda, 0x37, 0x31, 0xc2, 0x83, 0x0e, 0x74, 0xdf, 0xb8, 0x10, 0xcf, 0xea, 0x84, 0x27, 0x55, 0x39, 0x33, 0x85, 0x40, 0xaf, 0x6f, 0x37, 0x35, 0xeb, 0xa9, 0xfd, 0xc9, 0xc0, 0xbb, 0x59, 0x43, 0xe5, 0xcb, 0xe6, 0xa3, 0xee, 0x72, 0xeb, 0xe4, 0x7b, 0x1d, 0x30, 0x7f, 0xb0, 0xb4, 0x10, 0x30, 0xe5, 0x7a, 0xd0, 0xfc, 0x9e, 0x35, 0x2f, 0x73, 0xbd, 0x8e, 0x3e, 0x33, 0xf6, 0xba, 0x72, 0xad, 0x84, 0x5a, 0xf8, 0x2c, 0x1a, 0xa0, 0x48, 0x13, 0x1d, 0xb4, 0xfd, 0x65, 0x10, 0x56, 0xe4, 0x8b, 0x50, 0xc4, 0x53, 0x52, 0x01, 0xde, 0xbc, 0x34, 0x48, 0x88, 0x81, 0xd8, 0xba, 0x50, 0x0a, 0xdc, 0x15, 0x51, 0x16, 0xd1, 0x2e, 0x56, 0x4e, 0x87, 0x2b, 0x43, 0x20, 0x8b, 0xf2, 0xb1, 0xca, 0xef, 0xe2, 0xd9, 0xb5, 0x49, 0xc0, 0xb3, 0x05, 0xfe, 0xf4, 0x5f, 0x6e, 0xc1, 0xf5, 0xc3, 0x49, 0x56, 0x02, 0x76, 0xe7, 0x9c, 0x13, 0xdc, 0x25, 0xca, 0x0f, 0x93, 0x40, 0xf9, 0x3f, 0x0e, 0xeb, 0xe3, 0x03, 0x80, 0x9f, 0xea, 0xc3, 0xfc, 0x33, 0x5c, 0x29, 0xda, 0xac, 0xf5, 0x8d, 0x5c, 0x56, 0xa5, 0xb1, 0x92, 0x14, 0x94, 0xaf, 0x7a, 0xf4, 0x64, 0x2f, 0x6c, 0x06, 0xb6, 0xdd, 0xb5, 0x6f, 0xef, 0x1b, 0x83, 0xb9, 0x3c, 0xf2, 0x01, 0x6d, 0xd3, 0x4f, 0xc2, 0xe4, 0x7c, 0x6c, 0x63, 0x5a, 0x50, 0x8c, 0x6c, 0x44, 0xc1, 0xeb, 0x78, 0xe3, 0xdb, 0xf5, 0x96, 0x1a, 0xca, 0xb6, 0xee, 0x7d, 0x9b, 0x92, 0xa8, 0xaa, 0x47, 0x36, 0x09, 0xdc, 0xed, 0xce, 0xdf, 0xbd, 0x5f, 0x78, 0x20, 0x7c, 0xe0, 0xf9, 0xce, 0x20, 0x2c, 0xb0, 0x1d, 0x1c, 0xb9, 0xc8, 0xd8, 0x23, 0x3d, 0xb1, 0x01, 0x3d, 0x70, 0xd0, 0xb8, 0x1b, 0x13, 0x75, 0x5d, 0xa7, 0x31, 0x0e, 0xf9, 0xe0, 0xa5, 0x9b, 0xda, 0xe5, 0xdc, 0x62, 0x7e, 0x4f, 0xdc, 0xe4, 0xb3, 0xc4, 0x85, 0x0f, 0xfb, 0xca, 0x17, 0xb5, 0x35, 0xd8, 0xf5, 0x3d, 0x7a, 0xb3, 0xa9, 0x99, 0x46, 0xf8, 0x27, 0x78, 0xd8, 0xf4, 0x56, 0xbc, 0xdb, 0xbc, 0xcc, 0x2e, 0x45, 0x7a, 0xd9, 0x70, 0x80, 0x06, 0xc8, 0x34, 0xc8, 0xb6, 0x61, 0xac, 0xd4, 0x76, 0xb3, 0x41, 0xb8, 0x1b, 0x10, 0x88, 0x0a, 0xf4, 0x58, 0x72, 0x43, 0xa2, 0x7b, 0xc3, 0x69, 0x2a, 0x39, 0xc5, 0xeb, 0x49, 0x2c, 0x3d, 0xcd, 0x08, 0x09, 0x9e, 0x04, 0x8f, 0x23, 0x7d, 0x24, 0x3e, 0x30, 0x45, 0x38, 0xfa, 0x50, 0x2c, 0xf1, 0xc5, 0x4b, 0x65, 0x04, 0x92, 0x1a, 0x97, 0xcd, 0x57, 0xaa, 0x8f, 0x38, 0x63, 0xdc, 0x32, 0xe1, 0xf2, 0xd0, 0xb5, 0x7a, 0xff, 0x63, 0x10, 0x6e, 0x59, 0xf6, 0xaf, 0xc3, 0xf9, 0x72, 0x6b, 0x45, 0x93, 0x88, 0xba, 0xe1, 0x6b, 0x3e, 0x22, 0x4f, 0x6a, 0xa7, 0xf4, 0xf4, 0x71, 0xf1, 0x36, 0x06, 0xed, 0xa6, 0xe1, 0xf1, 0xac, 0x2b, 0x4d, 0xf9, 0xef, 0x8d, 0xe9, 0x21, 0xc0, 0x7c, 0x2f, 0x4c, 0x85, 0x98, 0xd7, 0xa3, 0xd6, 0xec, 0x4b, 0x36, 0x8c, 0xb8, 0x5c, 0xe6, 0x1a, 0x74, 0x33, 0x82, 0x21, 0x11, 0x8a, 0x30, 0x3e, 0x82, 0x1c, 0x0f, 0x27, 0x7b, 0x59, 0x1a, 0xf6, 0x79, 0x5f, 0x50, 0xc4, 0x02, 0x26, 0x12, 0x7a, 0x2e, 0xfa, 0xcc, 0xe4, 0x66, 0x2f, 0xd7, 0x07, 0x6c, 0x10, 0x9e, 0xb5, 0x9b, 0x18, 0x00, 0x5e, 0x71, 0x65, 0xf6, 0x29, 0x4a, 0x69, 0x76, 0x43, 0x6e, 0xe3, 0x97, 0x77, 0x4e, 0x0d, 0xf5, 0x00, 0x0b, 0x17, 0x57, 0x9b, 0x38, 0xd5, 0x8f, 0xe0, 0xe1, 0xb5, 0xa2, 0xd1, 0xcc, 0xf3, 0x29, 0xb4, 0xfe, 0x10, 0xf7, 0x1e, 0x81, 0x80, 0xfc, 0x51, 0x65, 0xa3, 0x69, 0xc7, 0x05, 0xf6, 0x15, 0x0f, 0x8c, 0x8b, 0x20, 0xd8, 0xb7, 0xb6, 0xd6, 0x4c, 0xdc, 0x0a, 0xd6, 0x9f, 0x2b, 0x83, 0x73, 0xe7, 0x34, 0x05, 0x5a, 0x2e, 0xa9, 0x05, 0x75, 0xc5, 0x65, 0x86, 0x10, 0xdc, 0xae, 0x48, 0x3b, 0x50, 0xb7, 0x3c, 0x6f, 0xc4, 0x69, 0x3a, 0x74, 0xf3, 0x63, 0xf6, 0x81, 0x44, 0x40, 0x31, 0xa6, 0xa0, 0x18, 0x2c, 0x67, 0x80, 0x49, 0x62, 0xaa, 0x4a, 0x77, 0x76, 0xd3, 0xdd, 0xd1, 0x6b, 0x2d, 0x6a, 0x96, 0x13, 0x8c, 0x87, 0xd8, 0xca, 0x30, 0x7e, 0x81, 0x64, 0xed, 0xeb, 0x93, 0x63, 0x89, 0x86, 0xb4, 0x6d, 0x66, 0x3d, 0xe9, 0xfe, 0x60, 0x86, 0xa2, 0x5b, 0xf9, 0xf3, 0xf7, 0xc7, 0xb4, 0x06, 0x31, 0xf8, 0xbe, 0x48, 0x8c, 0xcc, 0xd3, 0x95, 0x3b, 0x39, 0x60, 0xba, 0xad, 0x82, 0xe5, 0x42, 0x0f, 0xb1, 0x9e, 0x8c, 0x12, 0x41, 0x62, 0x21, 0xee, 0x1b, 0xcb, 0x45, 0xa7, 0xc4, 0x97, 0xcc, 0x8e, 0xd4, 0x4e, 0x2f, 0x0c, 0xaa, 0x25, 0xdf, 0x9b, 0x5e, 0x23, 0xd9, 0x15, 0xf7, 0x82, 0x7b, 0x31, 0xde, 0x58, 0x96, 0x4a, 0x93, 0x77, 0xc4, 0x63, 0x9f, 0x91, 0xfc, 0x69, 0xca, 0xa0, 0x63, 0xb7, 0x8d, 0x84, 0x65, 0xe0, 0xca, 0xee, 0x05, 0xa8, 0xbb, 0x7e, 0x71, 0x53, 0x29, 0x28, 0xda, 0x23, 0xde, 0xdc, 0x82, 0x1c, 0x5c, 0x66, 0x17, 0x0a, 0xcf, 0x93, 0x3f, 0xc5, 0x41, 0x95, 0x74, 0xb4, 0x0d, 0xa8, 0x12, 0x90, 0x96, 0xf6, 0xae, 0x6a, 0x38, 0xb8, 0xaa, 0xf0, 0x7f, 0x9f, 0x06, 0xec, 0x97, 0x72, 0x79, 0x0d, 0x04, 0xf8, 0xc1, 0xea, 0x93, 0x18, 0x37, 0x44, 0x91, 0x3f, 0xa6, 0x8b, 0x3a, 0x02, 0x5d, 0xa4, 0x74, 0x05, 0x83, 0xea, 0xbe, 0x1b, 0xab, 0x73, 0x63, 0xae, 0xa8, 0x94, 0xf3, 0x62, 0xa3, 0xa7, 0xf3, 0xf5, 0x6b, 0x0b, 0xd4, 0x6a, 0x0b, 0x6d, 0x22, 0x66, 0xa2, 0x46, 0xfe, 0xda, 0x6f, 0xa5, 0xce, 0xe2, 0x2c, 0x2f, 0x33, 0xed, 0x9d, 0x64, 0x3c, 0x1f, 0x68, 0x24, 0xd9, 0xf3, 0x27, 0x71, 0x92, 0x25, 0xbc, 0x76, 0x78, 0xcf, 0xe4, 0xc8, 0x5c, 0xd2, 0x10, 0xed, 0x40, 0x77, 0x70, 0x1b, 0x0b, 0x56, 0x50, 0x41, 0x81, 0x77, 0xa7, 0x4c, 0x71, 0xb8, 0xed, 0xa3, 0x30, 0x6e, 0x2e, 0xf3, 0x47, 0x4f, 0x5d, 0x32, 0x69, 0x90, 0xea, 0xde, 0xa8, 0x4a, 0x96, 0x86, 0xe8, 0x22, 0x87, 0x8c, 0x93, 0x29, 0x97, 0x29, 0x8e, 0x01, 0xf2, 0xb1, 0x6c, 0x42, 0xe0, 0x19, 0xe2, 0x1b, 0xdf, 0xb6, 0x7b, 0x3d, 0xf5, 0x47, 0x8d, 0xf4, 0x44, 0x36, 0x6c, 0x97, 0xdf, 0x1b, 0xdd, 0x23, 0xdc, 0x82, 0xce, 0x23, 0xab, 0xee, 0x44, 0xd3, 0xa6, 0x1e, 0x94, 0x84, 0xe8, 0x8e, 0xd6, 0x42, 0x63, 0x41, 0x97, 0xb5, 0x2d, 0xbe, 0xce, 0x45, 0x1b, 0x59, 0x11, 0x81, 0x91, 0xb3, 0x09, 0xc2, 0x98, 0x84, 0x24, 0x0b, 0x31, 0x98, 0x89, 0x34, 0xea, 0x18, 0x51, 0x48, 0xae, 0x0b, 0xf4, 0x2b, 0xe1, 0x1c, 0x01, 0x80, 0xad, 0x9e, 0x13, 0xc9, 0x96, 0xcd, 0x00, 0xd0, 0x55, 0x57, 0x53, 0x47, 0xe3, 0x1b, 0xfd, 0xab, 0xd4, 0x30, 0x47, 0x6e, 0xe6, 0x29, 0x0b, 0x54, 0xda, 0x97, 0x24, 0x1e, 0x82, 0xd0, 0x23, 0x66, 0x1c, 0xef, 0x43, 0xca, 0xde, 0x1c, 0xa0, 0x4c, 0xd2, 0x0e, 0xa3, 0xf9, 0xe4, 0xcd, 0xc1, 0xc9, 0x3a, 0xbd, 0x65, 0xc7, 0xc3, 0xd8, 0x2a, 0x71, 0x13, 0x3b, 0x4e, 0x62, 0x6e, 0xe4, 0x64, 0x2e, 0x22, 0xba, 0x48, 0x8e, 0x1a, 0xcd, 0x58, 0xbd, 0xb1, 0xe0, 0xe1, 0x21, 0xc4, 0x25, 0xd8, 0x2e, 0x0b, 0x47, 0xcb, 0x88, 0xa9, 0xad, 0x16, 0x67, 0x01, 0xfe, 0x5a, 0x40, 0xcc, 0xe0, 0x2b, 0xa2, 0x68, 0x06, 0x09, 0x5e, 0x73, 0x69, 0x92, 0xea, 0x99, 0xd5, 0xf5, 0x07, 0xaa, 0xa8, 0xaa, 0xa2, 0xf0, 0xd7, 0x61, 0xf8, 0xbf, 0x31, 0x38, 0xfe, 0x4d, 0xe8, 0x30, 0x00, 0xc4, 0x4d, 0xe2, 0x88, 0x96, 0xdb, 0x6e, 0x81, 0x11, 0x77, 0xb5, 0x9c, 0x33, 0xf6, 0xc8, 0xf3, 0xbf, 0xe0, 0x9f, 0xed, 0x90, 0x73, 0x0f, 0x61, 0x2e, 0xeb, 0xf6, 0xfe, 0x9f, 0x01, 0xb9, 0xea, 0x80, 0xb2, 0xf0, 0xa9, 0x54, 0x41, 0x5f, 0x41, 0x1b, 0x7f, 0x29, 0x9b, 0x27, 0x4a, 0x40, 0x2d, 0x2b, 0x54, 0x20, 0xd6, 0x95, 0x26, 0xbd, 0x09, 0x1d, 0x64, 0xb9, 0x2e, 0x9e, 0x52, 0xdb, 0x45, 0x25, 0x97, 0xbd, 0xcd, 0x48, 0x41, 0xc4, 0xe4, 0xba, 0x0a, 0x55, 0xaf, 0x1c, 0xd9, 0x46, 0xfc, 0x15, 0x8c, 0x93, 0x26, 0xa4, 0xf5, 0x53, 0x39, 0xb5, 0x22, 0xea, 0x57, 0xf3, 0xe2, 0x7f, 0x5b, 0xde, 0x84, 0xb1, 0xbb, 0x1d, 0xe2, 0x85, 0xb3, 0x15, 0x9f, 0xa3, 0xa0, 0xba, 0xac, 0xc3, 0xaa, 0xa5, 0x11, 0x62, 0xa5, 0x68, 0xea, 0xb9, 0x39, 0x1e, 0xaf, 0xef, 0x41, 0x46, 0xb9, 0x8e, 0x72, 0xd1, 0x02, 0x34, 0x3d, 0x79, 0x2d, 0x8b, 0xf6, 0x55, 0xc6, 0x7a, 0x35, 0xaa, 0xca, 0x9d, 0x7d, 0x05, 0x6a, 0xf3, 0x1b, 0x86, 0x0c, 0xd7, 0x51, 0x7f, 0x93, 0x32, 0xb4, 0x3e, 0xe0, 0xee, 0xd3, 0x26, 0x98, 0xae, 0x19, 0x05, 0x28, 0xbc, 0xf5, 0xa1, 0x07, 0x42, 0x37, 0x94, 0x3b, 0xbe, 0xbe, 0x5a, 0x1f, 0xb0, 0x50, 0xa9, 0x63, 0x95, 0xc9, 0x00, 0x54, 0x19, 0x78, 0x83, 0x5e, 0x89, 0xc6, 0x06, 0xcf, 0x87, 0x18, 0x68, 0xdd, 0x01, 0xf7, 0x22, 0xeb, 0x64, 0x6f, 0x1f, 0x08, 0x0c, 0xb4, 0xcf, 0xb9, 0x00, 0x0c, 0x77, 0xf8, 0xdc, 0xe8, 0xcb, 0x7c, 0x0e, 0x54, 0xbe, 0x3b, 0x45, 0x92, 0x99, 0x2e, 0x27, 0x02, 0x4a, 0x54, 0x43, 0x46, 0xff, 0xf9, 0x46, 0xa2, 0xf4, 0x38, 0x71, 0xa9, 0x89, 0xbf, 0x4a, 0x16, 0x98, 0xd2, 0x92, 0xf8, 0x05, 0x93, 0x78, 0x12, 0x97, 0x80, 0x0c, 0x81, 0x06, 0x3d, 0xf6, 0x9f, 0x55, 0x94, 0x68, 0x28, 0x61, 0xba, 0x51, 0x9b, 0xbb, 0xd3, 0xd4, 0xe3, 0xb3, 0xb9, 0xf8, 0x37, 0xb5, 0xf9, 0xa1, 0x3f, 0xd9, 0x1f, 0xbf, 0x78, 0xb5, 0x34, 0xc5, 0xd9, 0x76, 0x84, 0x5d, 0xb7, 0x2f, 0xa5, 0x59, 0xe6, 0x70, 0xb4, 0xed, 0x21, 0x1b, 0xe2, 0x1c, 0xab, 0x73, 0x2f, 0x71, 0x37, 0x76, 0x76, 0xef, 0x06, 0x6d, 0xaa, 0x4a, 0x4f, 0xc1, 0x5f, 0x58, 0xe3, 0x10, 0x8c, 0xc2, 0x11, 0x80, 0x8f, 0xff, 0xc7, 0x53, 0x71, 0x83, 0xfb, 0xbc, 0x6c, 0x33, 0x49, 0xf1, 0xaa, 0x1d, 0xde, 0x82, 0x50, 0x66, 0x94, 0xe9, 0xbb, 0x83, 0x5e, 0x62, 0x09, 0xac, 0xe7, 0xfd, 0xdc, 0x8e, 0x76, 0xf1, 0x5a, 0x41, 0x15, 0x33, 0x79, 0x79, 0xf2, 0x47, 0x79, 0x00, 0x05, 0x57, 0xb2, 0x64, 0xf3, 0x82, 0x8f, 0xed, 0x33, 0x76, 0xdb, 0xd1, 0x6f, 0x41, 0x3b, 0xab, 0x2d, 0x64, 0xfc, 0x2a, 0xae, 0x29, 0x0f, 0x06, 0x16, 0x37, 0x52, 0x39, 0xce, 0x64, 0x12, 0x6b, 0x27, 0xca, 0xcd, 0xae, 0x40, 0x1d, 0x3c, 0x6b, 0x29, 0x3c, 0x90, 0x9c, 0x48, 0x05, 0xfd, 0x3c, 0xfc, 0x6e, 0x75, 0xfc, 0x81, 0xd1, 0xb6, 0x38, 0x14, 0x88, 0x86, 0x29, 0x57, 0xba, 0x3d, 0x5c, 0xf6, 0x74, 0x85, 0x63, 0x8b, 0xfc, 0x5e, 0xca, 0xbf, 0x62, 0x65, 0x4d, 0xb2, 0x57, 0x55, 0x47, 0x9e, 0x42, 0xce, 0x6e, 0xb7, 0x91, 0x55, 0xbe, 0x55, 0x4d, 0x9d, 0xb3, 0x54, 0xf2, 0x04, 0xbb, 0xbb, 0x7d, 0x61, 0xeb, 0x9d, 0xc6, 0xfd, 0xf1, 0x3d, 0x10, 0xdf, 0x4a, 0x75, 0xdf, 0x4d, 0xb5, 0x59, 0x0a, 0x8f, 0xe7, 0x17, 0x10, 0xf6, 0x80, 0x22, 0xaf, 0x1d, 0x3e, 0x8f, 0xb3, 0x6f, 0x70, 0xbf, 0x0d, 0xe9, 0xae, 0x3e, 0x24, 0x21, 0xc8, 0xeb, 0x70, 0x88, 0xfc, 0x59, 0x44, 0xec, 0x6c, 0x76, 0xeb, 0x41, 0xcf, 0x6a, 0xf7, 0xa0, 0x66, 0xc2, 0xd6, 0x90, 0x31, 0xce, 0xa6, 0x85, 0x64, 0x47, 0x4a, 0xa6, 0x15, 0x35, 0xbe, 0xd3, 0x37, 0x10, 0xa7, 0xe7, 0xcb, 0x26, 0x2f, 0x3a, 0x55, 0x3c, 0x0f, 0x6b, 0x8d, 0x78, 0xed, 0x5c, 0x58, 0x7f, 0xe9, 0x7d, 0xf6, 0xda, 0x73, 0x4e, 0x7d, 0x9e, 0x5f, 0x1f, 0x86, 0x4c, 0x3b, 0x1a, 0x26, 0xf6, 0xe0, 0x84, 0x20, 0xa3, 0x47, 0x40, 0x58, 0xf5, 0x9e, 0x95, 0x8b, 0x09, 0x9b, 0x31, 0x3e, 0x9f, 0x11, 0x6d, 0xf4, 0x7b, 0xc1, 0xd2, 0xa4, 0x0b, 0x72, 0xdc, 0x6a, 0x49, 0x44, 0xff, 0x7d, 0xe3, 0x41, 0xe8, 0x61, 0x99, 0x35, 0x05, 0x5e, 0xe7, 0xbf, 0x47, 0x30, 0xe5, 0xa9, 0x27, 0x00, 0x6b, 0x75, 0xe7, 0x93, 0x78, 0x38, 0x1a, 0xc2, 0xd5, 0xac, 0x66, 0x2a, 0xf5, 0x80, 0x89, 0x24, 0x20, 0xf2, 0x9a, 0xf8, 0xd1, 0xa0, 0x91, 0x4d, 0x5c, 0x9b, 0x0a, 0xe4, 0xd3, 0xbe, 0x46, 0x86, 0x2b, 0x3e, 0x73, 0x3b, 0x9b, 0x81, 0x2d, 0xbd, 0x45, 0x34, 0x44, 0x2c, 0x18, 0x98, 0xc0, 0x03, 0xf5, 0x1c, 0x22, 0x4b, 0x10, 0x31, 0xed, 0x0f, 0x9a, 0x5a, 0x65, 0x0f, 0x9d, 0x82, 0x97, 0xb8, 0x27, 0x93, 0x99, 0x54, 0xaa, 0x44, 0x13, 0x7f, 0xa3, 0x33, 0xfe, 0xda, 0x7a, 0x33, 0xac, 0x03, 0xa9, 0xe7, 0x09, 0xc4, 0x21, 0x90, 0x20, 0x8a, 0xe9, 0x23, 0xe1, 0x19, 0x09, 0x9f, 0x21, 0x7f, 0xa6, 0x9d, 0xe2, 0x46, 0x6e, 0x28, 0xd5, 0xee, 0x37, 0xd0, 0x1d, 0x9b, 0xe2, 0xfa, 0x56, 0x0a, 0x86, 0x7a, 0xd6, 0xc9, 0xcb, 0x64, 0x32, 0xa8, 0x93, 0x1e, 0x04, 0x6b, 0xe0, 0xba, 0xec, 0xc1, 0xf2, 0x83, 0xd5, 0x7a, 0xaf, 0xd6, 0x7a, 0xf4, 0x48, 0x34, 0x28, 0xd6, 0x1a, 0x94, 0xc5, 0x01, 0xd2, 0xfe, 0x11, 0xc4, 0xd5, 0x55, 0x2c, 0x4f, 0xdf, 0x75, 0x59, 0x6b, 0xe9, 0x7e, 0x01, 0x68, 0x51, 0x6e, 0xfb, 0x56, 0x35, 0xf6, 0x0a, 0x78, 0x1f, 0x86, 0xa7, 0xf5, 0xe8, 0xab, 0x01, 0xd1, 0xd6, 0x9a, 0x43, 0x1c, 0x08, 0x0d, 0x15, 0x69, 0x14, 0x4d, 0x65, 0x82, 0xee, 0x90, 0x67, 0x5a, 0x0c, 0x86, 0xda, 0x43, 0xc7, 0x2f, 0x8e, 0x61, 0x05, 0xef, 0x23, 0x5f, 0x15, 0xe4, 0x13, 0x60, 0xda, 0x77, 0xf3, 0x39, 0x2c, 0x31, 0xf5, 0xdd, 0x7b, 0xd1, 0xb2, 0x18, 0xb5, 0x9b, 0x26, 0x81, 0x6a, 0xf2, 0xfc, 0xaa, 0x2f, 0x29, 0x0c, 0x99, 0x40, 0x97, 0x23, 0x7c, 0x69, 0xe9, 0x02, 0x98, 0x26, 0xbc, 0xa9, 0x83, 0x09, 0x6c, 0xd5, 0x93, 0x5c, 0x26, 0xc7, 0x96, 0x08, 0x45, 0x47, 0xc3, 0xb5, 0xdb, 0xe9, 0xf1, 0x33, 0x8d, 0x8f, 0x07, 0x18, 0xa5, 0x2f, 0xb4, 0xab, 0x62, 0xd6, 0x60, 0x01, 0x92, 0xed, 0x62, 0x66, 0x63, 0xbc, 0x73, 0xff, 0x77, 0x2c, 0x62, 0xad, 0x36, 0xd1, 0x0a, 0x33, 0x68, 0x27, 0x82, 0x9c, 0x03, 0x1c, 0x93, 0xd7, 0x41, 0xcf, 0x6f, 0xa5, 0xf6, 0x98, 0x9f, 0xb5, 0x21, 0x48, 0x3e, 0x0c, 0xc1, 0xb2, 0x65, 0xab, 0xea, 0x6a, 0xe6, 0x6c, 0x17, 0xcc, 0x3d, 0x2e, 0xc2, 0x40, 0xc3, 0x31, 0x32, 0xbd, 0x25, 0xc3, 0x95, 0x8c, 0x15, 0x1d, 0x4e, 0x4f, 0x3f, 0x88, 0x90, 0x41, 0x7f, 0xc4, 0x2c, 0xbf, 0x51, 0xa9, 0xa7, 0x08, 0x89, 0x0f, 0x90, 0x41, 0x44, 0xec, 0x10, 0xbc, 0x1e, 0xbc, 0xc3, 0x79, 0xa5, 0x26, 0xc6, 0xed, 0x0e, 0xdc, 0x12, 0x03, 0x27, 0xc3, 0x08, 0x61, 0x8d, 0x54, 0x4c, 0xec, 0x1f, 0x42, 0xd7, 0x8e, 0xb2, 0x5c, 0x48, 0x37, 0x07, 0xb6, 0x7b, 0x21, 0xfa ],
+const [ 0x5e, 0x9d, 0x7b, 0x80, 0x3f, 0x8a, 0x40, 0xca, 0xdd, 0x83, 0x20, 0x0a, 0xbc, 0x49, 0xe7, 0xae, 0x24, 0x56, 0x35, 0xa7, 0xd1, 0xc2, 0xd1, 0x6d, 0xec, 0x67, 0x40, 0x44, 0x3a, 0x44, 0x97, 0xbf, 0x94, 0x1f, 0x8d, 0x82, 0x97, 0x6e, 0xd4, 0x4b, 0x9c, 0x78, 0xaa, 0x34, 0xea, 0xb8, 0xab, 0x32, 0x2b, 0x82, 0xe9, 0xe2, 0x1d, 0xe9, 0x3e, 0x85, 0x8a, 0xdf, 0xe1, 0x48, 0x7a, 0x9e, 0x38, 0xca, 0xa7, 0x47, 0xed, 0xd8, 0x31, 0xc9, 0x44, 0x7b, 0x93, 0x05, 0xac, 0x34, 0xd6, 0x30, 0x94, 0x86, 0x05, 0x78, 0x7f, 0xb5, 0xe0, 0xea, 0x5b, 0xce, 0xd4, 0x93, 0x0e, 0xe7, 0x2b, 0xe5, 0x53, 0xa8, 0x81, 0x5d, 0xc4, 0x0a, 0x77, 0x63, 0x37, 0x5f, 0xab, 0x72, 0x4e, 0x93, 0xe7, 0x78, 0x4a, 0xb1, 0x98, 0x80, 0x20, 0xa8, 0x82, 0x8e, 0xcf, 0x50, 0xb3, 0xca, 0xf0, 0xa8, 0xb5, 0xe1, 0x8f, 0x62, 0x08, 0xa9, 0x39, 0xa1, 0xcf, 0x04, 0x56, 0x01, 0xca, 0x06, 0xba, 0xd8, 0x84, 0x5a, 0x76, 0xbb, 0xce, 0xe1, 0xf4, 0x44, 0x6b, 0x9d, 0x43, 0x13, 0x0d, 0xce, 0xaf, 0x13, 0x81, 0x5a, 0x95, 0xfe, 0x26, 0x72, 0x75, 0x24, 0xa3, 0x73, 0x49, 0x68, 0xd9, 0x0a, 0x15, 0x8b, 0x17, 0x9c, 0xc0, 0xad, 0x8d, 0xe5, 0x22, 0x10, 0x04, 0xdf, 0x5e, 0x20, 0xcc, 0xe5, 0x72, 0xb0, 0xf5, 0x18, 0x0c, 0x87, 0xc2, 0x02, 0xa0, 0x1b, 0x5a, 0x79, 0xb7, 0x9c, 0xc1, 0xc6, 0x8a, 0x34, 0x07, 0x07, 0xcf, 0x8e, 0xbf, 0xd2, 0xd3, 0x95, 0xb3, 0x1b, 0xc9, 0x7e, 0xd6, 0x58, 0x61, 0x08, 0x7a, 0xe2, 0x9d, 0x02, 0xc3, 0x9f, 0xe1, 0x0e, 0x5c, 0xde, 0x49, 0xa6, 0x68, 0x82, 0x3e, 0x5c, 0xbc, 0x63, 0x4c, 0x66, 0x4b, 0xf1, 0x2e, 0x59, 0xe1, 0x1b, 0x2b, 0x35, 0x15, 0x6f, 0xa6, 0xa2, 0x79, 0x82, 0xf0, 0x79, 0x13, 0x92, 0x60, 0x86, 0x11, 0x6a, 0xa6, 0x8d, 0xb8, 0x86, 0x5c, 0x8a, 0x9e, 0x78, 0xde, 0x3d, 0x19, 0x8a, 0x5c, 0xe6, 0xf7, 0xa5, 0x2d, 0x4e, 0x6f, 0x71, 0x66, 0x06, 0x58, 0xbe, 0xac, 0xf3, 0x99, 0x23, 0x46, 0x0b, 0xe1, 0xe4, 0x76, 0x59, 0x98, 0x19, 0x0a, 0x47, 0x15, 0x0d, 0x2e, 0x1c, 0x11, 0xe5, 0x84, 0xc4, 0x5b, 0x82, 0x77, 0xd0, 0xce, 0xa8, 0xcc, 0xbd, 0x81, 0x5f, 0x79, 0x79, 0x3d, 0x99, 0xbb, 0x23, 0x34, 0x16, 0x63, 0x12, 0xef, 0x85, 0x70, 0x1a, 0x89, 0xec, 0xe3, 0x0a, 0x1b, 0x49, 0xcf, 0x79, 0x77, 0x7a, 0xb0, 0xc3, 0x19, 0x5a, 0xfd, 0x4e, 0x5a, 0x2d, 0x01, 0x12, 0xe7, 0x3e, 0xe6, 0x58, 0x72, 0xc6, 0x13, 0xc1, 0xa7, 0x10, 0xb8, 0x8b, 0x62, 0xdb, 0xa6, 0x10, 0x1f, 0x00, 0x65, 0x8f, 0xb2, 0x54, 0x80, 0x2f, 0x38, 0xd0, 0x24, 0x41, 0x4d, 0xef, 0xe9, 0xc6, 0x7f, 0x58, 0xf0, 0x31, 0x03, 0xbd, 0x2e, 0x6e, 0xa7, 0x03, 0x07, 0x22, 0x08, 0xa3, 0x1f, 0x35, 0x05, 0x50, 0x6d, 0x8e, 0x73, 0xda, 0x91, 0x1d, 0x12, 0x52, 0x67, 0x1f, 0xc0, 0x6f, 0xdc, 0x9d, 0xed, 0x30, 0x00, 0x36, 0x4f, 0xc3, 0x5d, 0x1f, 0xd7, 0xa6, 0x88, 0x68, 0xe3, 0x0c, 0xf5, 0x81, 0xb5, 0x82, 0x0f, 0xfc, 0x24, 0xd2, 0x88, 0x94, 0x91, 0x27, 0xee, 0x6f, 0x1d, 0x73, 0x80, 0xa0, 0x19, 0x0e, 0x3f, 0xf0, 0xbf, 0xa0, 0x48, 0xde, 0x1f, 0x40, 0x60, 0xe4, 0x5b, 0xdd, 0xd1, 0xfc, 0x17, 0xdd, 0x75, 0x63, 0x2c, 0x05, 0x10, 0x9d, 0x9c, 0x99, 0xe2, 0xb9, 0xcb, 0xc4, 0x7d, 0xd6, 0xec, 0x39, 0xd5, 0xe6, 0xb9, 0x1b, 0x96, 0xb2, 0x67, 0x1b, 0xba, 0x1f, 0xd9, 0xe0, 0x5a, 0xaf, 0x14, 0xab, 0xc4, 0x4a, 0xf3, 0x3b, 0xcf, 0x3f, 0x1b, 0xee, 0x6b, 0x86, 0x32, 0x2a, 0x7c, 0x48, 0x4c, 0xfb, 0xe9, 0xa0, 0xa6, 0xfd, 0xef, 0xa4, 0x97, 0x7d, 0xbc, 0x9f, 0xc3, 0xdb, 0x39, 0xa1, 0x92, 0x32, 0x27, 0x3a, 0xe1, 0x3b, 0x6d, 0x82, 0xf7, 0x6f, 0xb0, 0x5c, 0xba, 0x6c, 0x25, 0xfc, 0x22, 0x9a, 0xa3, 0xa7, 0xef, 0x0e, 0xfd, 0xba, 0x97, 0xaf, 0x8e, 0xee, 0x83, 0x97, 0x15, 0xda, 0x7a, 0xbc, 0xc4, 0xba, 0x5e, 0xcf, 0x93, 0x6e, 0x16, 0x64, 0xda, 0xc6, 0xcb, 0x54, 0x1f, 0xfc, 0x57, 0x5f, 0x2c, 0x82, 0xfa, 0x16, 0x65, 0xfe, 0x4f, 0xf9, 0x59, 0x94, 0x7f, 0xdc, 0x97, 0x63, 0xb5, 0x8f, 0xc3, 0x52, 0xd2, 0xbd, 0xe9, 0x0c, 0x61, 0x15, 0x10, 0x49, 0xcd, 0xa8, 0x13, 0x50, 0xd1, 0x92, 0xac, 0xb9, 0x31, 0xdd, 0xd2, 0x78, 0xa8, 0xa2, 0x45, 0x17, 0x21, 0x71, 0x67, 0x43, 0x2a, 0xf3, 0x4d, 0x8a, 0xa5, 0xce, 0x16, 0x63, 0xc0, 0xc9, 0x7b, 0x6f, 0x28, 0x31, 0xa8, 0xfe, 0x7a, 0x7b, 0x4a, 0xd5, 0xfb, 0x2a, 0xea, 0x2f, 0x88, 0xf4, 0x79, 0x01, 0xd0, 0x20, 0x2c, 0x82, 0xc0, 0x32, 0x8a, 0xeb, 0x3f, 0xca, 0xc3, 0x7b, 0x1c, 0xca, 0x43, 0xbf, 0x44, 0xb7, 0x87, 0x10, 0x39, 0x62, 0x2f, 0x5d, 0xbf, 0xc7, 0x55, 0x2b, 0xd9, 0x35, 0x1e, 0xd9, 0xf3, 0xaf, 0x8e, 0x29, 0x61, 0x93, 0xa1, 0xfc, 0x08, 0x79, 0x97, 0x5d, 0x5b, 0x5e, 0x8f, 0xc1, 0x8a, 0x02, 0x57, 0x8d, 0xf5, 0x8e, 0x83, 0xd9, 0xe7, 0x7a, 0xbc, 0x74, 0x81, 0xae, 0x5b, 0x28, 0xf4, 0xe7, 0x37, 0x3f, 0xf4, 0x5d, 0xba, 0x45, 0x69, 0xa3, 0x3b, 0x10, 0x67, 0xce, 0x87, 0xfe, 0x60, 0xd9, 0xc1, 0x7e, 0x98, 0x48, 0x6d, 0xd2, 0xda, 0x0c, 0xc7, 0x13, 0x6a, 0xa7, 0x59, 0x75, 0x3a, 0x90, 0xcc, 0xcc, 0x60, 0xd9, 0xff, 0x4f, 0xc8, 0x0f, 0x56, 0x9c, 0x26, 0x62, 0x55, 0xfd, 0x2f, 0x05, 0x6d, 0xea, 0x09, 0xd8, 0x15, 0xcf, 0x00, 0x45, 0x1d, 0x0f, 0x7a, 0x67, 0x3f, 0x48, 0x2d, 0x72, 0xf8, 0xd9, 0x8f, 0x4f, 0x96, 0xa1, 0x8e, 0x86, 0x91, 0x0a, 0x82, 0x61, 0x1e, 0x46, 0x60, 0x4f, 0x02, 0xd9, 0x30, 0x86, 0xa4, 0x58, 0xc1, 0xec, 0x67, 0x70, 0x9b, 0x38, 0x36, 0x29, 0x35, 0x54, 0x61, 0x6c, 0x68, 0x06, 0xa7, 0xc4, 0x24, 0xd0, 0x94, 0x61, 0x62, 0x15, 0x0d, 0x62, 0x59, 0x7c, 0x29, 0x54, 0xf5, 0x9a, 0x42, 0xf5, 0x85, 0xcb, 0x4c, 0x3e, 0xb4, 0x60, 0x66, 0xa1, 0xba, 0x00, 0xaf, 0x90, 0xd3, 0x48, 0x5b, 0x3e, 0xf0, 0xb5, 0x06, 0xa9, 0xad, 0xc4, 0x47, 0xd8, 0x84, 0x57, 0x89, 0x61, 0x40, 0x5b, 0x16, 0x2f, 0xb4, 0xa8, 0x75, 0x82, 0xac, 0x28, 0xf6, 0x37, 0x24, 0x3c, 0x8b, 0x4a, 0xb8, 0x5b, 0xd9, 0x99, 0x5c, 0xfd, 0x8f, 0xeb, 0x4d, 0xb7, 0xf7, 0x30, 0x48, 0xa7, 0xcb, 0x0b, 0xf9, 0x12, 0x49, 0x8d, 0xb6, 0x4c, 0x89, 0x44, 0x6d, 0xd8, 0x0f, 0x74, 0xdb, 0xd1, 0x9d, 0xa4, 0xff, 0x88, 0x4a, 0x5c, 0xcf, 0x6f, 0xd8, 0x2e, 0x29, 0x36, 0x43, 0xf3, 0x0c, 0x33, 0x96, 0x57, 0x08, 0x07, 0x02, 0x98, 0xf3, 0x7f, 0x31, 0x8a, 0xde, 0xb8, 0xd8, 0xdf, 0x47, 0x87, 0x8c, 0xa5, 0x91, 0x17, 0xd6, 0x10, 0xb1, 0xd4, 0x89, 0x7a, 0x29, 0x88, 0x53, 0xa8, 0x3a, 0xc4, 0x93, 0x4f, 0x55, 0x82, 0x6a, 0xd6, 0xd4, 0x08, 0x15, 0x5e, 0xe7, 0x10, 0x7a, 0x00, 0xd1, 0x25, 0x00, 0x55, 0x54, 0x50, 0xa4, 0x3c, 0x69, 0xf4, 0x4a, 0xd7, 0x35, 0xf7, 0x50, 0xd7, 0x39, 0x22, 0x69, 0xfa, 0xc9, 0xcb, 0xa9, 0xd1, 0xbf, 0xb1, 0xdc, 0xc7, 0x70, 0x27, 0x1c, 0x5f, 0xdf, 0x75, 0xa3, 0xbd, 0x31, 0x7b, 0xdd, 0x68, 0x61, 0x97, 0xc1, 0x4e, 0x35, 0xc9, 0x62, 0x09, 0x71, 0x15, 0xc1, 0x60, 0x4a, 0x29, 0xe6, 0x11, 0x1d, 0x40, 0x2f, 0xce, 0x61, 0x46, 0xe7, 0x85, 0xdb, 0x3d, 0x1a, 0xe4, 0x10, 0xdf, 0xa8, 0x1d, 0x00, 0x85, 0x99, 0xe6, 0x11, 0x47, 0xb0, 0xc4, 0x4a, 0x65, 0x43, 0x8a, 0xc1, 0xe6, 0x4a, 0x1c, 0x57, 0x7e, 0xb5, 0x79, 0xa2, 0xb5, 0x03, 0xf9, 0x2b, 0x46, 0x10, 0xd3, 0xda, 0xc5, 0x2e, 0xe1, 0xae, 0x85, 0x78, 0xa8, 0xb1, 0xb9, 0x63, 0x93, 0x2c, 0xd9, 0x96, 0x7f, 0x17, 0x48, 0xfc, 0x7c, 0xd3, 0x33, 0x17, 0xd2, 0x1c, 0xbc, 0x97, 0x43, 0x39, 0x58, 0x2b, 0x90, 0x75, 0x75, 0x97, 0x3f, 0xd3, 0x61, 0x07, 0x9a, 0xfe, 0x67, 0xa2, 0xfb, 0x7f, 0x3b, 0x63, 0x47, 0x32, 0x98, 0x24, 0xb9, 0xfb, 0x27, 0xfc, 0xe1, 0xb5, 0xa3, 0xcb, 0xec, 0x6b, 0x3b, 0x13, 0x25, 0xcb, 0x37, 0x0a, 0xbc, 0xd7, 0xdf, 0xed, 0xc6, 0xde, 0x98, 0x96, 0x86, 0xab, 0x51, 0x51, 0xeb, 0xfc, 0x1d, 0xec, 0x59, 0x36, 0x21, 0x0d, 0xad, 0x56, 0xb1, 0xc8, 0x7b, 0x2b, 0xb6, 0x71, 0x99, 0xc3, 0x53, 0xaf, 0xe2, 0x23, 0xc8, 0xd2, 0x34, 0x3a, 0x96, 0x67, 0xbb, 0x18, 0xe4, 0x09, 0x72, 0x5c, 0x21, 0x7a, 0xe6, 0xeb, 0xeb, 0xf2, 0x3e, 0xe8, 0x2f, 0xb6, 0x78, 0xe0, 0x92, 0xed, 0xf5, 0x44, 0x10, 0xaf, 0x38, 0x1d, 0xe3, 0x60, 0xeb, 0xfb, 0xa7, 0x3c, 0x22, 0x2e, 0xbb, 0x32, 0xe4, 0x39, 0xea, 0xf6, 0xe8, 0x84, 0x4b, 0x52, 0x9c, 0x51, 0x65, 0xbd, 0x6b, 0xf1, 0x97, 0x2e, 0x40, 0x38, 0xb8, 0x32, 0x46, 0x2e, 0xfa, 0x3d, 0xf3, 0x07, 0x14, 0x3d, 0x44, 0x56, 0xa0, 0x75, 0x4a, 0x7d, 0xc1, 0x89, 0xe5, 0x68, 0x0a, 0xd5, 0xd0, 0x7b, 0x9b, 0x03, 0xdd, 0xc8, 0x8d, 0xdd, 0x82, 0x86, 0x91, 0x5f, 0x95, 0xbe, 0xd3, 0x11, 0x54, 0x48, 0x25, 0x94, 0xa8, 0xf6, 0x59, 0x7a, 0xab, 0x0f, 0xee, 0x5b, 0x67, 0xff, 0xf0, 0x24, 0xe1, 0x4c, 0x19, 0xb3, 0x56, 0xcc, 0x3c, 0xa1, 0xc4, 0x16, 0xe4, 0x5f, 0xac, 0x36, 0x38, 0x85, 0x16, 0xa5, 0x21, 0x66, 0xd7, 0x78, 0xaf, 0xe8, 0x0f, 0xd7, 0xb9, 0x93, 0xf5, 0xb1, 0xc4, 0xe7, 0xd7, 0xae, 0x26, 0xf3, 0x5c, 0x65, 0x6c, 0x23, 0x0d, 0xd0, 0xf8, 0x5a, 0x13, 0xfc, 0xef, 0x40, 0x42, 0x05, 0x52, 0xde, 0x57, 0x42, 0x6a, 0x68, 0x7e, 0xbd, 0x6a, 0x59, 0x18, 0xe6, 0x50, 0xc5, 0xba, 0x88, 0x0c, 0xeb, 0x79, 0xfb, 0xe4, 0x0b, 0x65, 0x9c, 0x17, 0x77, 0x53, 0x7a, 0xc0, 0xeb, 0xe0, 0x52, 0xfe, 0x21, 0xb2, 0xbe, 0x52, 0xa1, 0x01, 0xa9, 0x48, 0xd7, 0x56, 0x06, 0x5a, 0x67, 0x93, 0xc1, 0x11, 0xc5, 0x34, 0xf6, 0x6d, 0x00, 0xd4, 0x62, 0x87, 0xde, 0xf3, 0x17, 0x75, 0x2e, 0xf6, 0x73, 0x6e, 0x5a, 0x6f, 0x52, 0x2e, 0x3c, 0x9f, 0x83, 0x9c, 0x32, 0x3a, 0x79, 0xab, 0x75, 0x69, 0x43, 0x7e, 0xa6, 0x15, 0xbf, 0xcf, 0xaa, 0x63, 0x0a, 0x91, 0xb8, 0x7b, 0x3a, 0xd4, 0xb0, 0x8e, 0x50, 0xea, 0xaf, 0x17, 0x68, 0xc8, 0xe0, 0x61, 0x33, 0xae, 0x95, 0x49, 0xa7, 0x0b, 0x96, 0x45, 0xf5, 0x9b, 0xb8, 0xa5, 0xbc, 0xd2, 0xb2, 0x19, 0x7c, 0x7d, 0x2d, 0x74, 0x4d, 0xa7, 0x1a, 0xaf, 0xd1, 0xb9, 0x48, 0x31, 0x67, 0xe6, 0x36, 0x4d, 0xa1, 0xc6, 0x26, 0x0d, 0xf9, 0x41, 0x72, 0x2e, 0xbf, 0xaf, 0x23, 0x6b, 0x56, 0x3d, 0xc0, 0xff, 0xa0, 0x93, 0x64, 0x65, 0xb7, 0xb4, 0x13, 0x62, 0xde, 0x25, 0x4e, 0x45, 0xb7, 0x51, 0xe5, 0x6e, 0xb6, 0x2c, 0x0d, 0x0d, 0xd5, 0x17, 0xb2, 0x2c, 0x89, 0x04, 0x0f, 0xf0, 0xf5, 0xda, 0x7b, 0x1b, 0x5e, 0x1b, 0x86, 0xd6, 0xe0, 0xc4, 0x44, 0xae, 0x5f, 0x74, 0xe9, 0xdc, 0xc0, 0xd1, 0x96, 0xc9, 0x58, 0x27, 0x73, 0xd1, 0xa4, 0x53, 0xfe, 0x47, 0x3b, 0xe0, 0xa3, 0xba, 0x02, 0x6f, 0x8c, 0x77, 0x9f, 0x5c, 0xba, 0x4f, 0x30, 0x9e, 0x55, 0x9b, 0x3c, 0xef, 0x40, 0x7d, 0xe9, 0x2e, 0xf1, 0x68, 0x70, 0x01, 0x80, 0xe2, 0xcf, 0xbe, 0xfd, 0x88, 0xbe, 0x8c, 0x07, 0x53, 0xe3, 0xc5, 0x9a, 0x1b, 0x49, 0x9f, 0x29, 0x59, 0x0f, 0x0c, 0xed, 0x31, 0x5d, 0xde, 0x7c, 0xb0, 0x9c, 0x2f, 0x9d, 0x52, 0xe7, 0x00, 0x5b, 0xc7, 0xbc, 0x20, 0x58, 0xf6, 0xf8, 0x50, 0x64, 0x43, 0x02, 0xa4, 0x4e, 0x0d, 0x46, 0x2c, 0xfa, 0x7b, 0xe5, 0xd4, 0xb4, 0x79, 0xaa, 0x89, 0xc4, 0xfd, 0x41, 0x9d, 0x43, 0x8f, 0xa3, 0x6d, 0x2d, 0x08, 0xd5, 0x41, 0xb7, 0x9a, 0xd2, 0x73, 0xe2, 0x10, 0xc6, 0xd4, 0x50, 0x57, 0x7c, 0x4b, 0x56, 0x3e, 0x1a, 0xbf, 0x54, 0x7a, 0x0c, 0x37, 0x41, 0xed, 0x3e, 0x40, 0x8a, 0x28, 0x8e, 0x90, 0x1d, 0x2e, 0x81, 0xe8, 0xc0, 0x7a, 0x34, 0x3f, 0xa8, 0x44, 0x96, 0x1c, 0x47, 0x01, 0xd5, 0x44, 0x65, 0x29, 0x16, 0x95, 0x72, 0x3c, 0x69, 0x32, 0x1b, 0x07, 0xfc, 0xe0, 0x1b, 0x24, 0x8f, 0xb0, 0x54, 0xc0, 0x27, 0xdf, 0x1e, 0xa0, 0x07, 0xfa, 0xdf, 0x66, 0xdc, 0x45, 0xdc, 0x11, 0x38, 0x5e, 0x4e, 0xc4, 0x41, 0x1e, 0xb9, 0xc8, 0xab, 0xc0, 0x79, 0xd3, 0xe3, 0x45, 0x9d, 0x8b, 0x8d, 0x16, 0xf9, 0x46, 0x31, 0xec, 0x77, 0x14, 0x31, 0xed, 0xae, 0xff, 0xff, 0x18, 0xb6, 0x91, 0x8c, 0xe2, 0x3a, 0x97, 0x04, 0x21, 0xce, 0x25, 0xb8, 0x2a, 0x83, 0xda, 0x5c, 0x36, 0xb9, 0x65, 0x72, 0x0b, 0x35, 0x48, 0x06, 0xd8, 0x74, 0xdc, 0x9c, 0x60, 0x3e, 0x96, 0x67, 0x5a, 0x7e, 0x88, 0xbb, 0x18, 0x50, 0x2b, 0xc5, 0x68, 0x5c, 0x5b, 0x7a, 0xb8, 0x63, 0xa3, 0xcd, 0x7d, 0x17, 0xbb, 0x25, 0xd5, 0x30, 0x4f, 0x0e, 0x6a, 0xbc, 0x02, 0x2e, 0x9a, 0xb6, 0xb3, 0x7c, 0xd6, 0xdb, 0xff, 0xac, 0x48, 0xb9, 0x07, 0xed, 0xb9, 0x09, 0x73, 0xd7, 0xb1, 0x3e, 0xb7, 0x9f, 0xe0, 0x5e, 0x94, 0x8e, 0xbc, 0x11, 0xe2, 0xb1, 0x6c, 0xf8, 0x8e, 0xd1, 0xe5, 0x3f, 0xdf, 0xa5, 0x53, 0x76, 0xfd, 0x47, 0xba, 0x9c, 0xb3, 0xe5, 0xdd, 0x7d, 0x74, 0xb9, 0x5f, 0x3f, 0x9c, 0x3b, 0x28, 0x37, 0xf9, 0x95, 0x0a, 0x01, 0x8a, 0x57, 0xa4, 0xcf, 0x86, 0x6c, 0x87, 0x01, 0xa0, 0x4d, 0x98, 0xf6, 0x8a, 0x74, 0xb6, 0x22, 0xb8, 0x14, 0x9c, 0x61, 0x66, 0x07, 0x08, 0x8b, 0xdc, 0x07, 0x1d, 0x49, 0xf1, 0x22, 0x05, 0x27, 0xce, 0x68, 0xdc, 0xea, 0xf4, 0xe7, 0xc9, 0x23, 0x81, 0xd9, 0x6e, 0x04, 0xae, 0x1b, 0x83, 0x73, 0x9d, 0xe1, 0xbd, 0x5d, 0x52, 0xa9, 0xf5, 0x4d, 0xff, 0x6d, 0x86, 0x3d, 0x84, 0x1d, 0xf7, 0xac, 0x36, 0x4c, 0xda, 0xf0, 0xdf, 0x2a, 0xf3, 0xce, 0x07, 0xb2, 0x9d, 0x48, 0x72, 0x24, 0x6a, 0xb6, 0xea, 0xb6, 0x0a, 0x18, 0x3f, 0x86, 0x6e, 0xab, 0x8b, 0xd4, 0x2c, 0xba, 0xba, 0x6e, 0x26, 0xb7, 0x4a, 0x6b, 0x67, 0x8a, 0x50, 0x1c, 0x4d, 0x29, 0xbc, 0x40, 0xed, 0x69, 0xdd, 0x77, 0xb3, 0x14, 0x28, 0xfa, 0x49, 0x3b, 0x35, 0x88, 0xba, 0xcd, 0x0a, 0xa4, 0xd8, 0x69, 0x9c, 0xfd, 0xdb, 0x71, 0x93, 0x2e, 0x4a, 0x60, 0x4e, 0xa7, 0x1f, 0x5d, 0x27, 0xeb, 0x26, 0x10, 0xf8, 0xfd, 0xa6, 0xb4, 0xde, 0x14, 0x43, 0x6d, 0x3c, 0x96, 0x23, 0xdc, 0x03, 0x44, 0x50, 0xf1, 0x31, 0xb2, 0x5d, 0x01, 0x98, 0xfb, 0x4d, 0x19, 0xe1, 0xb2, 0xb0, 0x91, 0xd0, 0x1c, 0x0f, 0xe4, 0xca, 0x9c, 0x8a, 0xbf, 0x94, 0x6e, 0xc0, 0x57, 0x5d, 0x98, 0xef, 0x00, 0xff, 0x1e, 0x5c, 0xfc, 0x82, 0x76, 0xf6, 0x90, 0xe1, 0x3b, 0x36, 0x5d, 0x11, 0x26, 0x49, 0xee, 0x40, 0x39, 0x71, 0x8e, 0x5b, 0x3d, 0xa9, 0x5c, 0xd2, 0x6f, 0x88, 0xa1, 0x9f, 0x77, 0x67, 0x60, 0x85, 0x99, 0xc6, 0x2f, 0x95, 0x2f, 0xec, 0x46, 0xf7, 0x57, 0xce, 0xd6, 0xe7, 0xe9, 0x32, 0x9c, 0xfe, 0xac, 0x14, 0xb5, 0xb3, 0xc9, 0x49, 0xb4, 0x21, 0x7f, 0x62, 0xf2, 0x0b, 0x19, 0xd3, 0x25, 0x1d, 0x1d, 0x55, 0x34, 0x74, 0xc7, 0x88, 0x4a, 0x61, 0xb5, 0xdd, 0x2a, 0x6a, 0xe4, 0xb3, 0xc2, 0x92, 0xdb, 0xc0, 0x02, 0xdb, 0x26, 0xb3, 0xee, 0x08, 0x06, 0x17, 0xf2, 0xa7, 0x67, 0x7b, 0x76, 0x4f, 0x12, 0xd0, 0xb3, 0x27, 0x24, 0x12, 0xc5, 0xa7, 0xbf, 0x2b, 0x01, 0xa3, 0xff, 0x14, 0x88, 0x85, 0x30, 0x3d, 0x1c, 0xda, 0x3e, 0x2f, 0x33, 0x10, 0x6c, 0x70, 0x4a, 0x7d, 0x49, 0xa6, 0x7c, 0xa4, 0xe1, 0x00, 0x53, 0xb4, 0x30, 0xd2, 0xde, 0x52, 0xdc, 0x7f, 0x04, 0x98, 0x23, 0x9c, 0x17, 0x5e, 0x11, 0x52, 0xad, 0xb8, 0xf7, 0x04, 0xab, 0xbf, 0x1a, 0x32, 0xa2, 0x95, 0xa8, 0x9e, 0x5f, 0xa3, 0xf0, 0xad, 0xbd, 0x25, 0xd1, 0x0f, 0xbe, 0xe9, 0x73, 0xa2, 0xda, 0x53, 0x36, 0x94, 0x97, 0xa5, 0xe8, 0xc9, 0x5a, 0x7d, 0x3b, 0x7c, 0x7d, 0xa0, 0x76, 0x28, 0xa1, 0xf5, 0x6a, 0xa9, 0x46, 0xd5, 0xa8, 0x9e, 0x99, 0x82, 0xf1, 0x13, 0x8c, 0xf4, 0xee, 0x5d, 0x2c, 0xdc, 0x21, 0x44, 0x30, 0xe3, 0x1c, 0x68, 0xcd, 0x32, 0xf1, 0xdd, 0xd2, 0x38, 0xe9, 0x19, 0xf0, 0xa7, 0x79, 0x10, 0x59, 0xc0, 0x71, 0x9d, 0x8e, 0xd1, 0x77, 0x24, 0x71, 0xfc, 0xb4, 0x76, 0xa2, 0x39, 0xcd, 0xf4, 0x08, 0x9e, 0x15, 0xf8, 0xae, 0xdf, 0x01, 0x70, 0xd1, 0x11, 0xdc, 0xcc, 0x37, 0xb3, 0xbb, 0x1b, 0xc2, 0xee, 0xb4, 0x70, 0x44, 0x1c, 0x4b, 0x8b, 0x95, 0x88, 0x2d, 0xb5, 0xe3, 0x74, 0x21, 0xec, 0x4a, 0x61, 0x3b, 0x40, 0xa4, 0x8a, 0x52, 0x7d, 0xa3, 0xb2, 0xb5, 0x0a, 0x1d, 0x1f, 0x1a, 0x11, 0xa6, 0xe7, 0xd7, 0xe0, 0x64, 0x6a, 0x55, 0x90, 0x1f, 0x20, 0xc1, 0xe4, 0x98, 0x95, 0x04, 0x73, 0x1c, 0xb1, 0xf6, 0x0a, 0x58, 0x3d, 0xce, 0x4c, 0x6f, 0xa3, 0xde, 0x9b, 0x4a, 0xf5, 0x7d, 0x3c, 0x30, 0x31, 0x44, 0xb5, 0x96, 0xc4, 0x7d, 0x7a, 0x38, 0x4c, 0xd8, 0xc9, 0x68, 0xa2, 0x60, 0xd3, 0xa6, 0x18, 0xae, 0x1c, 0x72, 0xff, 0x5c, 0x24, 0x5e, 0x6d, 0xbd, 0x47, 0x67, 0x3d, 0xcb, 0xe2, 0x85, 0x56, 0x61, 0xb7, 0x81, 0x31, 0xab, 0x93, 0x07, 0x95, 0xda, 0x2e, 0xfc, 0xa5, 0x1c, 0x52, 0x11, 0x1d, 0xcb, 0x3f, 0x99, 0xd9, 0xe4, 0x4f, 0x98, 0x97, 0xbc, 0xd6, 0x1c, 0xfd, 0xee, 0x4c, 0xd0, 0xde, 0x98, 0xae, 0xce, 0xb9, 0xc7, 0x21, 0xb5, 0x82, 0x2f, 0xd9, 0xfb, 0xa5, 0x20, 0x39, 0x85, 0x49, 0xb5, 0x3b, 0x75, 0xd1, 0x4f, 0x13, 0x44, 0xa9, 0x41, 0x0f, 0x10, 0x3f, 0xcd, 0xc2, 0x37, 0x4f, 0x50, 0x61, 0x24, 0x64, 0xb9, 0x6d, 0x69, 0x9c, 0x3f, 0x92, 0x0e, 0xab, 0x54, 0xd0, 0x29, 0x22, 0xd4, 0xd8, 0xaf, 0xf2, 0x83, 0xb9, 0x8a, 0x2b, 0xb6, 0xbb, 0xec, 0x0a, 0x50, 0x8b, 0xe2, 0x33, 0xf0, 0x99, 0x2c, 0x3b, 0x69, 0xbf, 0x4c, 0x69, 0x73, 0x23, 0xdd, 0xbe, 0xa0, 0x5e, 0x26, 0x32, 0x91, 0xde, 0xef, 0x41, 0x69, 0x88, 0x93, 0xa6, 0x82, 0xa2, 0x57, 0x67, 0x5f, 0xf1, 0xfa, 0x11, 0xe2, 0x1e, 0x8e, 0x45, 0xbf, 0x5f, 0x86, 0x73, 0x31, 0x53, 0x0f, 0xe6, 0xec, 0x2d, 0xa4, 0x01, 0x52, 0x14, 0xdc, 0xc8, 0xe9, 0xca, 0x87, 0xa2, 0x0d, 0x8c, 0xfa, 0x5c, 0xe2, 0x3a, 0xa7, 0x72, 0x8d, 0xb8, 0xf1, 0x8a, 0xa4, 0x94, 0x3e, 0x42, 0xe2, 0xe9, 0x4d, 0x2b, 0x20, 0x83, 0xca, 0x15, 0x80, 0x43, 0x1f, 0x8e, 0xec, 0xc5, 0x8e, 0xa5, 0xbf, 0x41, 0x7c, 0xf4, 0xc1, 0xaf, 0x10, 0xdd, 0x59, 0x2f, 0xfd, 0x13, 0xfe, 0xa7, 0x9c, 0x5c, 0xef, 0xae, 0x3e, 0x96, 0x24, 0xa9, 0xc0, 0xf8, 0x84, 0x33, 0x60, 0x9b, 0x58, 0xc3, 0xce, 0x39, 0x00, 0x88, 0x87, 0x34, 0xe4, 0x98, 0x5e, 0xda, 0xae, 0x4a, 0x5b, 0xe7, 0xb7, 0xe0, 0xc9, 0x4b, 0xbe, 0x6a, 0x8b, 0x2e, 0xe0, 0xe7, 0xaf, 0x32, 0xc4, 0xac ],
+const [ 0x54, 0xad, 0x09, 0xea, 0xd6, 0x15, 0x40, 0x36, 0x63, 0x64, 0xb6, 0xf3, 0x11, 0xe3, 0xd9, 0xe3, 0x73, 0x6c, 0x71, 0xc3, 0x1b, 0xda, 0x3b, 0x69, 0x5c, 0xbe, 0xd4, 0x0f, 0x55, 0x54, 0xd9, 0xef, 0x2a, 0xb5, 0x4d, 0x10, 0x95, 0x4d, 0x3b, 0x5f, 0x9e, 0x90, 0x9c, 0x01, 0xa6, 0xe9, 0x7a, 0xe8, 0xaa, 0xf3, 0x56, 0xa4, 0xc6, 0xec, 0xc8, 0x7c, 0xf8, 0x67, 0x65, 0xbe, 0x27, 0x40, 0xe5, 0x53, 0x64, 0xd5, 0x86, 0x96, 0x6f, 0x73, 0xab, 0x67, 0x7d, 0x0f, 0xc9, 0x7a, 0x38, 0x37, 0x83, 0xf5, 0x08, 0x48, 0x14, 0x3b, 0x91, 0xe0, 0xee, 0x02, 0x7d, 0x96, 0xa0, 0xac, 0x7b, 0xe9, 0xfd, 0xd4, 0x87, 0x77, 0x7b, 0x27, 0x6d, 0x70, 0xd9, 0x75, 0x88, 0x49, 0x05, 0x07, 0xd0, 0xb5, 0x3c, 0x34, 0x14, 0xd1, 0x73, 0x2f, 0x83, 0x9e, 0xf6, 0x23, 0x71, 0xb5, 0x4f, 0x82, 0x58, 0x36, 0x69, 0x9a, 0x1d, 0x02, 0xf5, 0x69, 0x95, 0x2a, 0x0d, 0xb2, 0x48, 0xa7, 0x17, 0x50, 0x75, 0x4b, 0xed, 0xcb, 0x56, 0xf7, 0x3b, 0x29, 0xa4, 0x0f, 0x28, 0x06, 0x5e, 0x2b, 0x38, 0xe7, 0xc7, 0x0f, 0x70, 0xcc, 0xae, 0xde, 0xbc, 0x04, 0xf1, 0x8a, 0x8f, 0x45, 0x44, 0x8f, 0xc9, 0xfc, 0x2f, 0xe1, 0xdd, 0xe2, 0x56, 0x22, 0x33, 0xd0, 0xfd, 0x19, 0xcb, 0xd4, 0xcb, 0x60, 0x24, 0x84, 0xce, 0x5c, 0x5c, 0x92, 0xc0, 0x72, 0x98, 0xa1, 0x89, 0x78, 0xa6, 0x57, 0x04, 0x6a, 0xe1, 0xb4, 0x06, 0x5f, 0x55, 0xa2, 0x9d, 0xbb, 0x24, 0xcd, 0x95, 0xa5, 0x29, 0xb4, 0x41, 0xbc, 0xda, 0x01, 0x78, 0x05, 0x73, 0x15, 0xdd, 0x28, 0x51, 0xe8, 0x63, 0xdd, 0x9b, 0x10, 0x11, 0xa1, 0x28, 0x1f, 0x03, 0xad, 0x9d, 0x32, 0xb2, 0x28, 0xd6, 0xc7, 0x75, 0x9c, 0x88, 0xcf, 0x47, 0xa7, 0x24, 0x05, 0xca, 0xf3, 0xfe, 0x7d, 0x8c, 0x67, 0xae, 0x80, 0x89, 0x9f, 0xb6, 0x97, 0xf2, 0x9a, 0x66, 0xe6, 0x2d, 0xb3, 0xfd, 0xbb, 0x1d, 0xd3, 0x11, 0x67, 0xa3, 0xe4, 0x31, 0x4d, 0x65, 0x89, 0xc8, 0x38, 0xce, 0x0c, 0x44, 0xf2, 0x56, 0x98, 0x78, 0x12, 0x03, 0xa8, 0x3f, 0x15, 0x2f, 0xbf, 0x63, 0xb0, 0x8d, 0x5a, 0xbd, 0x65, 0x67, 0x22, 0x9d, 0x55, 0x29, 0x67, 0x6c, 0x55, 0x23, 0xca, 0x8f, 0x43, 0x8b, 0x39, 0x8f, 0x9b, 0xc1, 0x21, 0x77, 0x45, 0xd7, 0xde, 0x7e, 0xb1, 0x51, 0x77, 0xe6, 0x26, 0x29, 0x88, 0x24, 0x57, 0x17, 0x7f, 0x41, 0x38, 0x0f, 0x0b, 0x80, 0x0f, 0x0a, 0xd2, 0x41, 0xce, 0x09, 0x63, 0x25, 0xa0, 0x57, 0x6b, 0x73, 0xc2, 0x0f, 0x2b, 0xbb, 0x94, 0xdf, 0x29, 0xb9, 0xf0, 0x0b, 0x26, 0x7b, 0xba, 0xb5, 0x51, 0xc6, 0xb8, 0x5b, 0xba, 0xb7, 0xa4, 0xa1, 0x09, 0xa6, 0x80, 0x51, 0x70, 0x4f, 0x2a, 0xa0, 0xde, 0x34, 0x30, 0xb3, 0x76, 0x3d, 0xe5, 0x61, 0x3f, 0xa2, 0xb5, 0x3b, 0x1d, 0x0a, 0xb5, 0xc9, 0x00, 0xf5, 0x7e, 0x17, 0x5b, 0x57, 0x3c, 0x70, 0xd8, 0x85, 0x02, 0x6a, 0x4a, 0x55, 0x61, 0x23, 0xe2, 0x81, 0x38, 0xc9, 0xa7, 0x4d, 0xcd, 0x60, 0x20, 0x6a, 0x1d, 0xbf, 0x53, 0x19, 0x71, 0xdc, 0xf4, 0x94, 0x32, 0x4a, 0xd6, 0xa9, 0xfe, 0x00, 0xa5, 0xa8, 0xfb, 0x5c, 0xd7, 0x7f, 0x6c, 0x68, 0xe0, 0x24, 0x82, 0x5b, 0xa5, 0x33, 0x74, 0x63, 0x34, 0xd9, 0xd2, 0xa1, 0xb2, 0xf0, 0x16, 0x75, 0x94, 0x6b, 0x7c, 0xfd, 0x13, 0xf5, 0x13, 0xd8, 0xd9, 0xd5, 0x14, 0x30, 0x01, 0x15, 0x73, 0xf7, 0x3e, 0xe3, 0xb5, 0x70, 0x5a, 0x37, 0x01, 0xf2, 0xe3, 0xb6, 0x79, 0xe9, 0x21, 0xd7, 0xcb, 0x1d, 0x4a, 0x44, 0x02, 0x37, 0xf9, 0x83, 0xa3, 0x81, 0xdd, 0xd5, 0xf5, 0xed, 0xae, 0x5e, 0xa0, 0x59, 0x66, 0x87, 0x79, 0x11, 0xad, 0xa1, 0x9d, 0x95, 0x95, 0xcb, 0xbd, 0x9d, 0x87, 0x15, 0xb8, 0x5b, 0x7e, 0xe5, 0x6f, 0x00, 0x72, 0x9a, 0xd5, 0x81, 0x18, 0x70, 0x45, 0x9b, 0xc8, 0xa3, 0x19, 0x15, 0xbe, 0xd8, 0x78, 0x45, 0x86, 0xb8, 0x6f, 0xd5, 0xb2, 0xde, 0x43, 0xc7, 0xce, 0xf3, 0x06, 0xb7, 0x96, 0x17, 0x69, 0x60, 0x66, 0x83, 0xd1, 0x62, 0xf1, 0x6d, 0xad, 0x43, 0x36, 0x2c, 0x06, 0xb3, 0xb0, 0x9d, 0x57, 0x14, 0xcd, 0xc5, 0xa0, 0x39, 0xa2, 0xb8, 0xb6, 0x6e, 0xdd, 0xb9, 0xdd, 0xb9, 0xfb, 0xa2, 0x98, 0x60, 0xbb, 0x87, 0xc0, 0xab, 0xd2, 0x96, 0xd4, 0xeb, 0xe0, 0x41, 0x90, 0xbb, 0xa3, 0xa0, 0xc1, 0x86, 0x6a, 0x10, 0x57, 0x4a, 0xcd, 0x21, 0xbc, 0x9b, 0x9c, 0xaf, 0x64, 0xea, 0x15, 0x4e, 0xa6, 0x07, 0x5a, 0xec, 0xca, 0xe5, 0x22, 0xb1, 0x63, 0x9e, 0xae, 0x2a, 0xdf, 0xb6, 0xff, 0xa7, 0x5c, 0xa4, 0x46, 0xe1, 0xbd, 0x8e, 0x9c, 0xe0, 0xfd, 0x55, 0xf3, 0x1c, 0xc4, 0xd1, 0x4c, 0xe3, 0x38, 0x5e, 0x2b, 0xfa, 0x16, 0x97, 0x48, 0x87, 0x01, 0x61, 0x88, 0x2e, 0x1a, 0x2c, 0x2b, 0x7b, 0xd0, 0x75, 0x47, 0x80, 0xfa, 0x8f, 0x75, 0xbf, 0x23, 0xa4, 0xca, 0x4a, 0x24, 0xf7, 0x09, 0x28, 0xf9, 0x6b, 0x16, 0xfb, 0xcd, 0x49, 0xae, 0xe0, 0x57, 0x3e, 0x56, 0x97, 0x69, 0xa3, 0x91, 0xe4, 0xc6, 0x01, 0x56, 0x34, 0x35, 0xd5, 0xc1, 0x84, 0xd3, 0x90, 0x09, 0x7f, 0xad, 0xe2, 0xb2, 0xe6, 0x8e, 0x38, 0x04, 0x35, 0x16, 0x84, 0xbb, 0x84, 0x0c, 0x3c, 0x00, 0xab, 0xf5, 0xa5, 0x98, 0xa9, 0xe6, 0x51, 0x5c, 0x47, 0x96, 0xe6, 0xe9, 0xf8, 0xb7, 0x22, 0x98, 0x04, 0x87, 0x1c, 0xb1, 0xe5, 0xa2, 0xcd, 0xdb, 0xf1, 0x1a, 0xce, 0xd7, 0x3a, 0xc9, 0x63, 0x6e, 0xb3, 0xe6, 0xb9, 0xa8, 0x94, 0xd7, 0x6c, 0x3f, 0xff, 0x46, 0x4c, 0x53, 0xe3, 0x77, 0x61, 0x5f, 0x21, 0xd9, 0x2d, 0x6c, 0xed, 0xdb, 0x30, 0x85, 0x77, 0x00, 0xb2, 0x6a, 0xcb, 0x36, 0xbc, 0x89, 0xf6, 0x64, 0x68, 0x29, 0x6b, 0x42, 0x5a, 0xe9, 0xa5, 0x6d, 0x8f, 0x69, 0x0d, 0xbb, 0x56, 0x47, 0x1d, 0xcb, 0x9b, 0x4d, 0xc6, 0xe1, 0x6b, 0xe8, 0x0f, 0xf1, 0xb5, 0xdc, 0x00, 0xfa, 0x4e, 0x37, 0xbe, 0x96, 0x38, 0x83, 0xf7, 0xce, 0x24, 0x40, 0x80, 0x32, 0x35, 0x92, 0x3d, 0x2a, 0x07, 0x36, 0x42, 0x87, 0xf0, 0xba, 0x37, 0x5d, 0x86, 0xee, 0x01, 0x15, 0x61, 0x96, 0x9f, 0xbe, 0x22, 0x61, 0x51, 0xa4, 0xb3, 0x1f, 0x00, 0x24, 0xd1, 0x2e, 0xda, 0xbe, 0xc8, 0x35, 0x3d, 0x6c, 0x7e, 0x15, 0xd6, 0x32, 0xb3, 0x1d, 0x0a, 0xf7, 0x87, 0x7e, 0x94, 0x93, 0x3d, 0xfe, 0x70, 0x29, 0x3e, 0xf0, 0xf8, 0xb7, 0x61, 0x63, 0x4e, 0xeb, 0x69, 0x9a, 0xf9, 0x39, 0xd0, 0xbc, 0xd3, 0x2a, 0xc3, 0xcd, 0x22, 0xf7, 0x6d, 0xdd, 0x05, 0x56, 0x78, 0x7f, 0x12, 0x94, 0xd1, 0x7d, 0x3d, 0xe4, 0xac, 0xca, 0xfb, 0xf7, 0xc9, 0xb8, 0xa8, 0xcc, 0xf5, 0x6b, 0x26, 0xca, 0xd3, 0x8e, 0xc8, 0x0c, 0xdc, 0x44, 0x6e, 0xfc, 0xa5, 0x62, 0xf1, 0x23, 0x60, 0xdb, 0xc1, 0x3f, 0xa6, 0x7c, 0xcc, 0x96, 0x74, 0xd9, 0xa2, 0x8b, 0x73, 0x87, 0xd7, 0x6f, 0x7c, 0x8b, 0xa9, 0x99, 0x5b, 0x13, 0xe3, 0xb9, 0xd3, 0x64, 0x02, 0x69, 0xe3, 0x14, 0x95, 0x05, 0x48, 0x79, 0xea, 0xbd, 0x43, 0x61, 0xe6, 0xe8, 0x9c, 0x03, 0x35, 0x9b, 0xe7, 0x36, 0xa4, 0x7b, 0x06, 0xe1, 0xca, 0xcf, 0xef, 0xb3, 0xee, 0xda, 0xb0, 0x14, 0x25, 0x67, 0xb0, 0x5b, 0xbb, 0xa5, 0x37, 0x41, 0xd4, 0x35, 0x30, 0x95, 0x53, 0x82, 0x2e, 0x32, 0xfb, 0x51, 0xae, 0x2f, 0xd4, 0x99, 0x9c, 0x55, 0xd1, 0x94, 0x18, 0xd6, 0xaf, 0x16, 0x79, 0x3b, 0x20, 0x1e, 0x92, 0x9f, 0x29, 0xaa, 0x35, 0x1b, 0xc9, 0xd0, 0xf6, 0x81, 0xdb, 0x0b, 0x31, 0x4d, 0x3d, 0xd3, 0x4f, 0xd8, 0x32, 0x70, 0x44, 0xcf, 0x05, 0x0f, 0x5c, 0xe4, 0xf0, 0x16, 0x38, 0xc3, 0x3b, 0xb5, 0x13, 0x48, 0xa8, 0xbd, 0x4b, 0xef, 0x0f, 0xb6, 0x1c, 0x8c, 0x46, 0x2c, 0xae, 0x3c, 0x43, 0x49, 0x52, 0x9b, 0x85, 0xa9, 0x08, 0x37, 0xb0, 0x69, 0x46, 0x45, 0x77, 0x81, 0xf4, 0x93, 0xbe, 0x54, 0xbb, 0xbe, 0x00, 0x86, 0x7f, 0xa5, 0xef, 0x0e, 0x2a, 0x1d, 0x5b, 0x8c, 0xac, 0xe7, 0x55, 0xdc, 0x40, 0xdf, 0x94, 0xeb, 0xf0, 0x75, 0x18, 0xc9, 0x5b, 0x61, 0x0c, 0x00, 0xb6, 0x93, 0xf1, 0x25, 0x11, 0x69, 0xf9, 0xac, 0xdb, 0x25, 0xb1, 0x00, 0xa9, 0x9e, 0xe3, 0xd4, 0x33, 0x36, 0xbb, 0xb3, 0x9f, 0x0b, 0x28, 0xdf, 0x03, 0x72, 0x85, 0x58, 0x25, 0xa1, 0x79, 0x3b, 0x85, 0xab, 0x1c, 0x4d, 0x9d, 0xb2, 0x5b, 0xd8, 0x67, 0x57, 0x9d, 0xb6, 0x20, 0x76, 0xa7, 0xab, 0x4c, 0x11, 0xbc, 0xf8, 0xfa, 0x89, 0x09, 0x2c, 0x49, 0x14, 0x41, 0x3e, 0x2b, 0x6b, 0x85, 0xd9, 0x69, 0xc3, 0x86, 0xf7, 0xe7, 0xff, 0xed, 0xb1, 0x2a, 0x24, 0xfb, 0x55, 0x17, 0x0d, 0x6c, 0xba, 0xfd, 0x60, 0xa2, 0xd0, 0xd6, 0xc0, 0xff, 0x7b, 0xca, 0x44, 0x93, 0xa2, 0xf5, 0x28, 0xf7, 0x83, 0x6a, 0xc3, 0x78, 0x49, 0x78, 0xb9, 0x78, 0xe0, 0x2c, 0x72, 0x12, 0x08, 0x16, 0xcb, 0xfd, 0xa8, 0x50, 0x0b, 0xb3, 0x65, 0xbd, 0x18, 0xd2, 0x74, 0x8f, 0xeb, 0xc2, 0xac, 0x0c, 0x41, 0x98, 0xe0, 0x91, 0x93, 0x3a, 0x6b, 0xd7, 0x49, 0xc4, 0x0c, 0x75, 0x2b, 0x2b, 0xf5, 0xa6, 0x18, 0x21, 0x1e, 0x4d, 0xfa, 0x38, 0xdf, 0x36, 0xf9, 0x49, 0xbe, 0x9f, 0xef, 0x17, 0x86, 0xf7, 0x1c, 0x30, 0x99, 0xe5, 0x1c, 0x14, 0x86, 0x8c, 0x15, 0x99, 0xde, 0x0e, 0x35, 0x8e, 0x44, 0x4e, 0x5c, 0x9f, 0xc4, 0xfb, 0x15, 0x78, 0x66, 0xca, 0xcb, 0x2e, 0x02, 0x02, 0x3a, 0xda, 0x55, 0x3e, 0x23, 0x87, 0x55, 0x6e, 0x44, 0x4e, 0xc2, 0x20, 0x87, 0xbf, 0xfe, 0xfe, 0x7a, 0x83, 0x1e, 0x97, 0xff, 0x40, 0x41, 0x62, 0x45, 0xbd, 0x20, 0xff, 0xf6, 0x47, 0xe7, 0xc1, 0xb2, 0x53, 0x44, 0x6a, 0xbd, 0x64, 0xbd, 0x35, 0xf4, 0x2f, 0x46, 0x1a, 0x06, 0xfd, 0x13, 0x4d, 0xe0, 0x52, 0xab, 0x08, 0x69, 0xcc, 0x3e, 0x8a, 0x70, 0x4d, 0x38, 0x60, 0xe2, 0x5d, 0x16, 0xe3, 0x41, 0xc9, 0x78, 0x02, 0x51, 0x90, 0x78, 0x41, 0x15, 0x00, 0x3b, 0x02, 0xf9, 0x1d, 0xc5, 0x03, 0x51, 0x42, 0x12, 0x29, 0x02, 0x0b, 0x62, 0x7c, 0x7f, 0x71, 0xd4, 0x72, 0xf8, 0x37, 0x36, 0x70, 0xce, 0x86, 0x1c, 0x8e, 0x49, 0xd4, 0x2f, 0x9b, 0x8d, 0x0a, 0xc8, 0x61, 0xca, 0xe5, 0xbe, 0x29, 0xb4, 0x9c, 0x7c, 0x82, 0x33, 0xc4, 0x56, 0x3f, 0x5b, 0x71, 0x1d, 0xbf, 0x9e, 0x9f, 0xf0, 0x71, 0x40, 0xd0, 0x56, 0x96, 0x0c, 0xf6, 0x8a, 0x49, 0x46, 0x92, 0x16, 0xbd, 0xe0, 0x1e, 0xa3, 0xc7, 0xf0, 0xa9, 0x10, 0x9c, 0x62, 0xc1, 0xc1, 0xdb, 0xea, 0x95, 0x3a, 0xce, 0x3d, 0x5b, 0xec, 0xed, 0x81, 0xf0, 0x4e, 0xa3, 0x02, 0xbe, 0x30, 0x55, 0x26, 0xe3, 0x4d, 0xa1, 0xa3, 0x90, 0x1f, 0xe3, 0xef, 0xae, 0xf7, 0xfe, 0xf9, 0xc8, 0x4c, 0x59, 0x16, 0x25, 0x53, 0x27, 0x3e, 0x34, 0xd1, 0xec, 0x78, 0x2e, 0x2e, 0x3c, 0x93, 0xf6, 0xca, 0xc6, 0x17, 0x44, 0x94, 0x92, 0x7b, 0x02, 0xd8, 0x87, 0x98, 0xf6, 0x58, 0x30, 0x5e, 0xa2, 0x9f, 0xc0, 0xc6, 0x68, 0x92, 0x53, 0x07, 0xf2, 0x48, 0x76, 0x0d, 0xd1, 0x1b, 0xea, 0x27, 0x64, 0xff, 0xa5, 0x00, 0xfc, 0x13, 0x1a, 0xd0, 0x3d, 0x76, 0xba, 0xd3, 0xc8, 0x5c, 0xbb, 0xfb, 0x17, 0x61, 0x18, 0xe2, 0xa7, 0x1d, 0xd9, 0x02, 0x5d, 0xf8, 0x94, 0x28, 0x23, 0x3f, 0x34, 0x26, 0xd2, 0x78, 0xf9, 0xc8, 0x54, 0xf3, 0xc0, 0x0a, 0x0a, 0xa2, 0x85, 0x88, 0x6b, 0x2a, 0x26, 0x36, 0xee, 0x3a, 0x69, 0x51, 0x2a, 0x1c, 0x41, 0x96, 0x3c, 0x8a, 0x4d, 0xb1, 0x6a, 0xc2, 0xa2, 0xf8, 0x06, 0xdd, 0xca, 0x59, 0x94, 0x5c, 0x0c, 0x91, 0x2f, 0x04, 0xee, 0x9f, 0x28, 0xec, 0xf9, 0x79, 0xf1, 0xd4, 0xbc, 0xfd, 0x39, 0xb8, 0x14, 0x2a, 0x59, 0xa5, 0xaa, 0x90, 0xef, 0xcc, 0xbc, 0x05, 0xc8, 0xd5, 0x21, 0x9a, 0x04, 0x75, 0x87, 0xce, 0x74, 0x43, 0x00, 0x01, 0x47, 0xc7, 0xbd, 0x2b, 0xe6, 0xd4, 0x18, 0xcd, 0x1c, 0x18, 0xd8, 0x28, 0x7a, 0xf2, 0xb1, 0xae, 0xfa, 0x83, 0x0b, 0xb6, 0xe2, 0x08, 0x05, 0x73, 0xeb, 0x67, 0xb8, 0x27, 0xa3, 0x07, 0xc0, 0x94, 0x10, 0xe5, 0xf9, 0xb3, 0x96, 0xe5, 0x86, 0xa9, 0x1a, 0x66, 0x18, 0xf7, 0x68, 0x18, 0x6c, 0xf1, 0xd2, 0x12, 0x16, 0x71, 0x1a, 0x1f, 0x7e, 0xcc, 0x93, 0x59, 0x28, 0x05, 0x82, 0xfa, 0x38, 0x41, 0xca, 0x6e, 0x35, 0x7b, 0xc9, 0xad, 0x0d, 0x79, 0x7d, 0xc7, 0x59, 0xff, 0xeb, 0xc0, 0xe3, 0x42, 0xc1, 0x9f, 0x65, 0x9f, 0x3a, 0xc2, 0x94, 0x8d, 0x42, 0x74, 0x5d, 0xd1, 0xdb, 0xc2, 0x6f, 0xf1, 0xbf, 0x8a, 0xf9, 0xea, 0x46, 0xd4, 0xb5, 0x25, 0x8b, 0x65, 0x25, 0xa8, 0xca, 0x92, 0x1d, 0x8a, 0x0d, 0x53, 0x81, 0xa9, 0x08, 0x98, 0x50, 0x9f, 0x41, 0xe0, 0xe1, 0xf1, 0x74, 0x07, 0x6d, 0x8a, 0x35, 0x5f, 0xce, 0x68, 0xd7, 0x03, 0x86, 0x96, 0x8d, 0x68, 0x03, 0x5a, 0xcf, 0x35, 0x22, 0xaf, 0xff, 0x55, 0xf1, 0xf5, 0x4d, 0x4a, 0xb9, 0xe8, 0xd8, 0xc4, 0x3c, 0xcf, 0x15, 0x72, 0x3b, 0xf5, 0x75, 0x18, 0x3b, 0x5d, 0x42, 0xe2, 0x89, 0xb2, 0xca, 0xf8, 0x7c, 0x7d, 0xc0, 0x52, 0xfa, 0x9b, 0xdf, 0xce, 0x3d, 0xed, 0xd0, 0x7f, 0xd7, 0x51, 0x4e, 0x48, 0xf4, 0xd1, 0x88, 0xaa, 0xe0, 0x1b, 0xc7, 0xdb, 0xc9, 0x31, 0x50, 0x18, 0xc5, 0x62, 0x8c, 0x3b, 0x17, 0x79, 0x66, 0x90, 0xae, 0x34, 0xf5, 0xe5, 0xee, 0xf8, 0x5b, 0xe0, 0xb3, 0xc2, 0xed, 0x96, 0x93, 0x61, 0x94, 0x58, 0x64, 0xe3, 0x72, 0xd0, 0xfe, 0x4d, 0xc9, 0x4e, 0x42, 0x8f, 0x19, 0x5c, 0x5c, 0xb6, 0x89, 0x98, 0x44, 0x64, 0x88, 0xc3, 0x8b, 0x7d, 0xb4, 0x15, 0x54, 0x24, 0xfb, 0xd3, 0xa1, 0xe6, 0x00, 0x24, 0xd0, 0x34, 0xc0, 0x21, 0x65, 0x17, 0x75, 0x2b, 0x09, 0x1f, 0xbb, 0x81, 0xd3, 0x9d, 0xf1, 0x11, 0xc7, 0x11, 0xe2, 0x8f, 0x9c, 0xe6, 0xa4, 0xc5, 0xc3, 0x5d, 0xc1, 0x2a, 0xa4, 0xc8, 0x95, 0xb5, 0x2b, 0xf8, 0xf7, 0xf3, 0x83, 0xf8, 0x1c, 0x58, 0x21, 0xfc, 0xb7, 0xd3, 0x05, 0x94, 0x65, 0xa4, 0x3c, 0x25, 0x49, 0x72, 0xaa, 0x9a, 0xf3, 0x98, 0x06, 0x57, 0x87, 0xc1, 0x26, 0x6e, 0x1b, 0xb4, 0x7d, 0x16, 0x60, 0x71, 0xe2, 0x59, 0x85, 0x7c, 0x92, 0x0c, 0x58, 0x79, 0x79, 0x04, 0xaf, 0xf9, 0xad, 0x87, 0x06, 0x94, 0x3c, 0x01, 0x69, 0x38, 0x27, 0xf8, 0x95, 0xc0, 0xae, 0x42, 0x5a, 0xc8, 0xce, 0x76, 0x43, 0xc0, 0x09, 0xa0, 0x79, 0x40, 0x65, 0x39, 0xe5, 0x9b, 0xb7, 0x56, 0x95, 0xb7, 0x21, 0x1f, 0x61, 0x1c, 0xda, 0x83, 0xce, 0x4a, 0x2d, 0x2a, 0x32, 0x50, 0xc5, 0xab, 0x19, 0x9a, 0x27, 0x00, 0xe8, 0x0b, 0x80, 0x37, 0xc0, 0x4c, 0xa1, 0x69, 0xa5, 0x63, 0x48, 0xf0, 0xe0, 0x87, 0xa1, 0xd5, 0xa1, 0x32, 0x0c, 0x88, 0xe9, 0x79, 0x21, 0xd4, 0xa7, 0x99, 0xf1, 0x11, 0x22, 0xd2, 0x8f, 0x9c, 0x96, 0x78, 0xd0, 0x84, 0x22, 0x47, 0x4e, 0x86, 0xe1, 0xf7, 0xb3, 0x3c, 0x58, 0x10, 0x34, 0x91, 0x10, 0x00, 0x5b, 0x78, 0x83, 0x6a, 0x0a, 0xde, 0x3d, 0xc2, 0xbd, 0xdc, 0x3b, 0x17, 0x0f, 0x32, 0x97, 0x2f, 0x80, 0xf1, 0x67, 0xd9, 0x75, 0x77, 0xe2, 0x7f, 0x80, 0xa0, 0xc4, 0xfb, 0xe2, 0x3b, 0xf4, 0xab, 0x4e, 0xbb, 0x64, 0xc8, 0xf0, 0x2f, 0x39, 0xf3, 0xae, 0x75, 0x2d, 0x11, 0xae, 0xaa, 0x31, 0x59, 0x18, 0xe4, 0x56, 0xab, 0x1d, 0x24, 0xed, 0x24, 0x38, 0x86, 0xed, 0xef, 0xb3, 0xbb, 0x96, 0x5e, 0x6e, 0xb9, 0x54, 0x39, 0xdc, 0xb1, 0xe6, 0x56, 0x4e, 0x42, 0xbf, 0x69, 0x74, 0xec, 0xad, 0x1e, 0x20, 0xc7, 0xb8, 0x65, 0x4e, 0x75, 0x4d, 0x0d, 0x62, 0x55, 0x9c, 0x95, 0xb0, 0xf9, 0x3e, 0x3f, 0x41, 0xdb, 0x1b, 0x65, 0xd4, 0x4b, 0x8b, 0x10, 0x24, 0xac, 0xbb, 0xc7, 0x69, 0xe0, 0x53, 0xa5, 0x21, 0x01, 0x55, 0xaf, 0x10, 0x52, 0x48, 0x64, 0x86, 0x75, 0x97, 0x95, 0xe0, 0xde, 0x34, 0x76, 0x51, 0x87, 0x80, 0xf6, 0xe3, 0xe5, 0x6f, 0x4c, 0xb8, 0x1c, 0xe7, 0xd2, 0x96, 0x6f, 0x6a, 0x17, 0xa3, 0xfa, 0xf5, 0x2f, 0x6c, 0xa3, 0x28, 0x4e, 0x2c, 0x4e, 0xa6, 0x96, 0x4c, 0x50, 0xbf, 0x2c, 0x26, 0x26, 0x4d, 0x91, 0x0e, 0x68, 0xdb, 0x30, 0x93, 0xf8, 0x0d, 0x33, 0x02, 0x7f, 0x3c, 0x9b, 0x2c, 0x1a, 0x60, 0x90, 0x69, 0x50, 0x33, 0xf5, 0xdd, 0x48, 0x93, 0x40, 0xfa, 0x38, 0x28, 0x89, 0x46, 0x21, 0x48, 0xe0, 0x5f, 0xba, 0x17, 0xe4, 0x3c, 0xa9, 0xf3, 0x92, 0xb5, 0xf9, 0x0f, 0x5a, 0x46, 0xc9, 0x5d, 0x78, 0x10, 0x41, 0xb2, 0x81, 0x20, 0xcb, 0x25, 0x3c, 0xf4, 0x7f, 0xb8, 0xb4, 0x3b, 0xde, 0x3a, 0x8b, 0xdd, 0xc4, 0x6b, 0x91, 0x3b, 0x98, 0x62, 0x95, 0xb8, 0xc6, 0x2c, 0x7c, 0x78, 0x6f, 0xb6, 0x90, 0x68, 0x5f, 0xec, 0x1a, 0x7e, 0x3f, 0x23, 0x32, 0x42, 0x0b, 0xb4, 0xd6, 0x8d, 0xc7, 0xea, 0x3a, 0x90, 0x6e, 0x1f, 0x5f, 0x19, 0x2c, 0x21, 0xe7, 0x12, 0xcc, 0xdb, 0x28, 0x4a, 0x74, 0x31, 0x7f, 0x79, 0x90, 0x2b, 0xe6, 0x7e, 0x0c, 0x56, 0xc9, 0xea, 0xc6, 0x67, 0x16, 0xc2, 0x43, 0x22, 0x94, 0x81, 0xa1, 0x7a, 0x75, 0x5d, 0xcc, 0xfa, 0x2e, 0xcb, 0xf5, 0x63, 0x86, 0x45, 0x40, 0x97, 0xed, 0x4b, 0xbd, 0xb5, 0x10, 0xa8, 0x9a, 0x86, 0xaa, 0xf6, 0x97, 0x18, 0x9d, 0x64, 0xb9, 0xa8, 0x41, 0xb7, 0x43, 0xc5, 0xfc, 0x8f, 0xe2, 0xb3, 0x13, 0xec, 0x28, 0x0e, 0xbf, 0xf0, 0x3b, 0xaf, 0x84, 0xe7, 0xcf, 0xd4, 0xbe, 0x84, 0x51, 0x7a, 0x7d, 0x6d, 0x65, 0x0e, 0x92, 0xfb, 0x93, 0x45, 0xea, 0x3a, 0x3d, 0x49, 0x1b, 0x38, 0xd5, 0x15, 0x3d, 0x7c, 0x4d, 0x22, 0xfb, 0xd4, 0xce, 0x43, 0xe9, 0x54, 0xac, 0xcd, 0x19, 0x9b, 0x9a, 0xfc, 0xe9, 0x58, 0x1a, 0x92, 0x1e, 0x0d, 0x38, 0xc1, 0x37, 0x13, 0x78, 0x4b, 0xfb, 0xdf, 0x0d, 0xe8, 0x55, 0x83, 0x4b, 0xe8, 0x61, 0x77, 0x5f, 0x19, 0xc7, 0x9a, 0x3e, 0xeb, 0x48, 0x74, 0xdb, 0xd2, 0x96, 0xbe, 0x9d, 0xec, 0x69, 0x24, 0x10, 0xe4, 0xcf, 0x49, 0xdb, 0x16, 0xc3, 0x0c, 0xf2, 0xf4, 0x02, 0x0a, 0x0c, 0xa8, 0x1a, 0x63, 0x58, 0xfb, 0xc4, 0xc2, 0x6b, 0x75, 0x73, 0x97, 0x7d, 0xc5, 0x2d, 0xa7, 0xd6, 0x64, 0x9a, 0xc7, 0x83, 0x76, 0x5b, 0xe4, 0x4d, 0xf1, 0x9c, 0x47, 0xec, 0x00, 0xed, 0x17, 0x77, 0xaa, 0x4d, 0x20, 0x1f, 0xaf, 0x88, 0xd2, 0x1d, 0xb2, 0xc4, 0x8d, 0xe9, 0x9d, 0x56, 0x1c, 0xad, 0x42, 0xda, 0x7f, 0xf9, 0x3e, 0x82, 0xed, 0xb8, 0x23, 0xae, 0x19, 0x63, 0xd6, 0xbd, 0xb5, 0x74, 0x35, 0x23, 0x34, 0x1e, 0xfd, 0xbc, 0xd5, 0x3b, 0xeb, 0x61, 0xdd, 0x86, 0x22, 0xb8, 0x23, 0x0a, 0xcd, 0x50, 0xd2, 0xda, 0x05, 0xed, 0x6b, 0x03, 0xf5, 0x20, 0x09, 0xbf, 0x3c, 0x1b, 0xe9, 0xeb, 0x92, 0xc4, 0x29, 0xbb, 0xaf, 0x08, 0xd0, 0xad, 0x69, 0x72, 0x0f, 0xbb, 0x1c, 0xfc, 0xc7, 0xd5, 0x4e, 0x25, 0x4a, 0x8e, 0x93, 0x43, 0x66, 0x16, 0xaf, 0x1b, 0xa0, 0x68, 0xfb, 0xaf, 0xbd, 0xc4, 0x0a, 0x57, 0x87, 0x60, 0x8b, 0x13, 0xcd, 0x5b, 0x71, 0x20, 0xac, 0xf2, 0x52, 0xc9, 0x0d, 0xf6, 0x0d, 0x80, 0x6f, 0x7d, 0xb0, 0x2d, 0xe7, 0xd9, 0x99, 0xc6, 0x64, 0xc6, 0xdb, 0x20, 0x38, 0xe7, 0xe3, 0x05, 0xd4, 0x74, 0x5b, 0x86, 0xd3, 0x2d, 0x4e, 0x92, 0x3b, 0x92, 0x8d, 0xc8, 0xff, 0x55, 0x52, 0x8a, 0xc8, 0x10, 0x24, 0x53, 0xf4, 0x34, 0xfa, 0x4a, 0xdf, 0x41, 0xa3, 0x17, 0x62, 0x3d, 0x65, 0xf5, 0x9a, 0x5f, 0xe5, 0x08, 0xeb, 0x0b, 0x46, 0xf2, 0x44, 0x03, 0x95, 0xa1, 0xa4, 0xdb, 0x65, 0x6a, 0xdd, 0xad, 0xb6, 0x5c, 0x98, 0x0f, 0x1c, 0xce, 0x99 ],
+const [ 0x04, 0xc8, 0x73, 0xc0, 0x5d, 0xaf, 0x29, 0x99, 0x23, 0xa2, 0xbf, 0xce, 0xe1, 0x93, 0xaa, 0x10, 0x4f, 0xe9, 0x07, 0x17, 0x19, 0x30, 0x83, 0xf1, 0xe2, 0x0f, 0x79, 0x9a, 0x89, 0x7a, 0x5b, 0xcc, 0xab, 0x28, 0x53, 0x18, 0x69, 0x48, 0x2a, 0x36, 0x6b, 0x70, 0x68, 0x9a, 0x24, 0xd6, 0xbd, 0x47, 0x58, 0xc2, 0x9f, 0xe8, 0xdc, 0x43, 0x35, 0x1d, 0x9e, 0x22, 0x74, 0x13, 0xe5, 0x14, 0x88, 0x57, 0xd9, 0x33, 0x75, 0xec, 0x45, 0xaf, 0xfe, 0x9b, 0x9c, 0xc1, 0xc6, 0x8a, 0x3a, 0xe1, 0xb5, 0x10, 0xed, 0x39, 0x9d, 0xc8, 0xb4, 0x59, 0x1d, 0xe4, 0xc6, 0x2c, 0xc6, 0xc4, 0xd6, 0x2b, 0x7d, 0xc8, 0x96, 0xd0, 0x20, 0x62, 0x7a, 0x4e, 0x6d, 0x6f, 0xbe, 0x7f, 0x1f, 0xc7, 0xaa, 0x1e, 0x59, 0x12, 0x15, 0x36, 0x48, 0xde, 0x28, 0xda, 0x05, 0xef, 0x64, 0x17, 0xb8, 0xd6, 0xe6, 0x27, 0x03, 0xc6, 0xea, 0xe7, 0x9e, 0xa2, 0x8f, 0x8c, 0x3e, 0x5a, 0xda, 0x91, 0xbc, 0x78, 0xfc, 0xf3, 0x73, 0xf6, 0xd8, 0xa1, 0xea, 0x53, 0xc0, 0x2e, 0xb3, 0xe6, 0x7f, 0xca, 0x92, 0x71, 0x9d, 0x70, 0xe2, 0xf9, 0xde, 0x61, 0x35, 0xd5, 0x0c, 0xd0, 0x3b, 0x06, 0xf6, 0xdf, 0xe5, 0xc6, 0xb9, 0xca, 0xc9, 0x63, 0x3e, 0x62, 0xc9, 0x4e, 0x04, 0xbe, 0xef, 0x6f, 0x20, 0x2d, 0x9c, 0xbc, 0x82, 0x6e, 0xe2, 0x0a, 0x79, 0x24, 0x2e, 0x23, 0x7a, 0x84, 0x2a, 0x18, 0x1d, 0x51, 0xe1, 0xd9, 0x68, 0x0a, 0x25, 0x02, 0x50, 0x62, 0x2d, 0xf8, 0x7d, 0xf0, 0x83, 0x35, 0x4e, 0x28, 0x1e, 0xe0, 0x1d, 0x8a, 0xca, 0xa1, 0xc4, 0x19, 0xd1, 0xb3, 0x5f, 0x0f, 0xd4, 0x3b, 0x54, 0xcf, 0xfa, 0xd8, 0x91, 0x1b, 0x4d, 0x7b, 0x15, 0x87, 0x60, 0x79, 0xb2, 0x2d, 0x35, 0xde, 0x11, 0xa3, 0x5f, 0x05, 0xf6, 0x2a, 0x64, 0x65, 0xc5, 0x28, 0x65, 0xae, 0x46, 0xd9, 0x01, 0x15, 0xa5, 0x41, 0x76, 0xeb, 0xbd, 0x65, 0x09, 0x75, 0x95, 0xba, 0xa9, 0xf8, 0x2b, 0xde, 0xcf, 0x13, 0x71, 0x86, 0xa8, 0x51, 0x96, 0xb8, 0x76, 0xff, 0x86, 0x3a, 0x34, 0x3b, 0xb4, 0x4a, 0x78, 0x4e, 0x17, 0x8f, 0x9e, 0x3c, 0x72, 0x50, 0x23, 0x99, 0xd9, 0xe4, 0x4f, 0x9d, 0x71, 0x69, 0x17, 0x7b, 0x77, 0xb9, 0x41, 0xef, 0x84, 0x9a, 0xc9, 0x16, 0x0f, 0x35, 0x84, 0x83, 0x33, 0xca, 0x03, 0x8f, 0xb2, 0xa1, 0xba, 0xf0, 0x3b, 0x44, 0x61, 0x8e, 0xe8, 0xeb, 0x9b, 0x92, 0x0b, 0x38, 0xd6, 0xbf, 0x2a, 0x24, 0x72, 0x05, 0x48, 0x3a, 0x25, 0x53, 0x66, 0x03, 0x9e, 0xae, 0x4a, 0xc1, 0x68, 0x80, 0x7f, 0x5f, 0x12, 0x32, 0x9d, 0xa9, 0x8d, 0xfc, 0xcb, 0xb9, 0xd5, 0xfc, 0x81, 0xb1, 0xd3, 0x86, 0x93, 0xb0, 0x83, 0xbc, 0x6b, 0xfe, 0x52, 0x5e, 0x95, 0x8a, 0xca, 0xe3, 0x82, 0x97, 0x70, 0xc8, 0x85, 0xb2, 0xed, 0x28, 0x22, 0xe7, 0x6d, 0x8d, 0x88, 0x34, 0x45, 0x06, 0x5c, 0x3e, 0xd8, 0x79, 0xb8, 0x43, 0xbb, 0x3b, 0x74, 0x50, 0x17, 0xde, 0xa4, 0xb4, 0x4f, 0x4a, 0x61, 0xb4, 0xe3, 0x0f, 0xcd, 0x80, 0x95, 0xfa, 0x51, 0x66, 0xca, 0xe7, 0x29, 0x46, 0x32, 0xd5, 0x23, 0x46, 0xab, 0x40, 0xa3, 0xc6, 0x63, 0xab, 0xeb, 0x97, 0x3d, 0x7c, 0x99, 0x67, 0x77, 0x0c, 0x71, 0x80, 0x89, 0xff, 0x5d, 0xb3, 0x50, 0xd1, 0xb2, 0x8e, 0x6b, 0xb2, 0xb5, 0xd6, 0xe6, 0x94, 0x5e, 0x31, 0x15, 0x82, 0x5c, 0x22, 0xc3, 0x33, 0x58, 0x3a, 0x8d, 0xdf, 0x7e, 0x8d, 0x88, 0x51, 0x3a, 0x64, 0x2a, 0x3e, 0x3f, 0x31, 0x67, 0xd5, 0xce, 0xc8, 0x1a, 0x97, 0x35, 0xcb, 0xa7, 0x69, 0x96, 0x66, 0xde, 0xe7, 0xe9, 0x3d, 0x23, 0xfc, 0x44, 0xa3, 0xcc, 0xaf, 0x5a, 0x0d, 0xcb, 0x40, 0x43, 0xc6, 0x8d, 0x74, 0x7b, 0xe4, 0x22, 0x2d, 0x2c, 0x7a, 0x9d, 0x3d, 0xb0, 0x0f, 0xbe, 0x7c, 0x51, 0x4f, 0xce, 0x19, 0x54, 0x01, 0xcb, 0x2d, 0x37, 0x39, 0xc5, 0x96, 0x36, 0xcf, 0x88, 0x02, 0x14, 0x0f, 0x7b, 0x4a, 0x17, 0xb2, 0xc8, 0x02, 0x55, 0x0e, 0xbd, 0x4e, 0x2e, 0x89, 0x73, 0xf6, 0x1a, 0x53, 0xad, 0xbd, 0xa5, 0x55, 0x02, 0xef, 0xb7, 0x64, 0x3f, 0x3a, 0x19, 0xbb, 0x07, 0xbe, 0x35, 0xa8, 0xbc, 0x67, 0x1d, 0x85, 0xa3, 0x7b, 0xcf, 0xea, 0x42, 0x6f, 0xb8, 0x21, 0x0d, 0xff, 0x76, 0xda, 0x42, 0x7e, 0xe2, 0x20, 0x12, 0x6a, 0x4e, 0x8c, 0x01, 0x43, 0x0b, 0xb9, 0x8f, 0x9d, 0x2f, 0xf7, 0x18, 0x75, 0x94, 0x44, 0xf9, 0xc1, 0x24, 0x78, 0xf4, 0x4a, 0x54, 0xbf, 0xd6, 0xbe, 0xef, 0x4c, 0x56, 0x01, 0x15, 0x4c, 0x41, 0xc5, 0x83, 0x19, 0xd4, 0x5a, 0x15, 0xb1, 0x69, 0xc7, 0x88, 0x66, 0x57, 0x19, 0x85, 0xd7, 0x13, 0xfb, 0xdb, 0x1e, 0x9b, 0x87, 0x0d, 0x4b, 0x14, 0x5c, 0x0c, 0x12, 0xb1, 0xf1, 0x45, 0xc0, 0xd8, 0x29, 0xde, 0x73, 0x80, 0x27, 0x3d, 0x8b, 0xde, 0x63, 0xcb, 0x5c, 0x40, 0xfd, 0xf7, 0x25, 0x39, 0x52, 0x7d, 0x46, 0xfe, 0xce, 0xe8, 0xad, 0x10, 0x01, 0x55, 0x92, 0x1b, 0xf4, 0x7b, 0x64, 0x1e, 0xbd, 0xe8, 0x03, 0xcd, 0x51, 0x8d, 0x2f, 0x34, 0x9a, 0x7d, 0x41, 0x9c, 0xc9, 0xf2, 0x18, 0xb2, 0xee, 0x91, 0x57, 0xe6, 0xc5, 0xef, 0xce, 0x12, 0xd3, 0x53, 0x35, 0x5c, 0xb2, 0xbe, 0x20, 0x5d, 0xaa, 0x28, 0x2f, 0x83, 0x81, 0x0d, 0x85, 0xb3, 0x93, 0x28, 0x7c, 0x33, 0x25, 0x7f, 0x97, 0xc8, 0xf6, 0x9f, 0xb9, 0x1b, 0x17, 0x29, 0x94, 0x61, 0xfd, 0x8d, 0x63, 0x3b, 0xd5, 0x16, 0xdc, 0xdb, 0x17, 0x27, 0x60, 0x69, 0x5e, 0xc4, 0x76, 0xa5, 0x77, 0x53, 0x77, 0xcd, 0xb7, 0xa4, 0x8b, 0xc1, 0x92, 0x30, 0xd3, 0x65, 0x6a, 0x9e, 0xe8, 0x47, 0xa5, 0x8c, 0x85, 0x82, 0x02, 0x8b, 0x80, 0xe2, 0x2d, 0x6b, 0xff, 0x48, 0x91, 0xba, 0xe8, 0x50, 0x6d, 0x87, 0x99, 0x32, 0x2a, 0x6b, 0xda, 0xe6, 0xec, 0xcb, 0x0f, 0x8c, 0x67, 0x57, 0xb3, 0x0a, 0xf4, 0xd6, 0x01, 0xf7, 0xe3, 0x26, 0xf4, 0xb8, 0x13, 0x7e, 0x72, 0xe8, 0xc1, 0xf7, 0xc4, 0xfe, 0x9e, 0x4b, 0x4a, 0x29, 0x24, 0xdc, 0x6d, 0x7f, 0x29, 0xf8, 0xd4, 0x57, 0xb5, 0x5b, 0xdb, 0xf3, 0x11, 0xf5, 0x41, 0x63, 0x20, 0xee, 0x20, 0xa5, 0xf2, 0xe8, 0x23, 0x11, 0x97, 0x84, 0xf3, 0xf5, 0x31, 0x27, 0xf2, 0x7c, 0x4d, 0xfe, 0x2c, 0xd4, 0x74, 0x3f, 0x8b, 0x8f, 0xfc, 0xb2, 0x4a, 0x4a, 0x24, 0x71, 0xab, 0x8d, 0x61, 0xec, 0xed, 0xf3, 0xf2, 0x2f, 0x78, 0x8b, 0xba, 0x68, 0x5c, 0x7d, 0x4f, 0xa3, 0xf9, 0xf1, 0x4f, 0xd9, 0xff, 0x2c, 0xf3, 0x29, 0x9a, 0xfc, 0xe6, 0x65, 0xe6, 0x57, 0x57, 0xd0, 0xa9, 0x3f, 0x4d, 0x26, 0x41, 0xe8, 0x3a, 0xdd, 0xdb, 0x1d, 0xd4, 0xab, 0xe6, 0xe0, 0x20, 0x48, 0xc8, 0x51, 0xcf, 0x75, 0xcf, 0xd1, 0xce, 0x3d, 0x6a, 0x66, 0x19, 0x7b, 0x99, 0x61, 0xd0, 0x9c, 0xa2, 0x3f, 0x8c, 0xa6, 0x06, 0xce, 0xf3, 0x79, 0xb3, 0x91, 0x8a, 0x56, 0x7b, 0x64, 0xcb, 0x9d, 0xc5, 0x63, 0x78, 0xdb, 0x82, 0x09, 0x2e, 0x03, 0x63, 0x95, 0x3d, 0xfc, 0x49, 0xb2, 0xb7, 0x5c, 0xfe, 0x56, 0xc7, 0x74, 0x22, 0xeb, 0x44, 0x8c, 0x68, 0xad, 0x86, 0x6f, 0x02, 0x53, 0x79, 0x2b, 0x59, 0xf1, 0xef, 0x12, 0x02, 0x1d, 0x3b, 0x04, 0xed, 0x51, 0xfb, 0xf1, 0xe0, 0x90, 0x35, 0x99, 0x24, 0x4c, 0xa6, 0x96, 0x7f, 0x88, 0x56, 0x9d, 0x62, 0x3a, 0x70, 0x01, 0x62, 0xf3, 0x51, 0x78, 0xec, 0xc1, 0xdf, 0x22, 0x35, 0x55, 0x1c, 0xc7, 0x71, 0x61, 0xfb, 0x61, 0x45, 0x44, 0x72, 0xda, 0x7e, 0xe9, 0xd0, 0x16, 0x03, 0xec, 0x51, 0x34, 0x08, 0xff, 0xef, 0x11, 0x85, 0x8d, 0x7c, 0x0e, 0xe7, 0x9d, 0xee, 0x14, 0x05, 0xf8, 0xfa, 0xd5, 0x55, 0x8e, 0xe4, 0x54, 0x60, 0x16, 0x95, 0xa7, 0x73, 0xf5, 0xee, 0xfb, 0x98, 0x61, 0x5c, 0xda, 0xc4, 0xc6, 0xac, 0xa9, 0x52, 0x68, 0x21, 0x75, 0xb0, 0x4b, 0xc4, 0xef, 0x59, 0x50, 0xfc, 0xb4, 0x03, 0xa0, 0x5e, 0xd2, 0x19, 0x4d, 0xc6, 0x88, 0x6b, 0x37, 0xa7, 0x4e, 0x25, 0x2d, 0x9f, 0x15, 0xfd, 0x55, 0x4f, 0xd0, 0xb1, 0xce, 0x69, 0x33, 0xb1, 0x93, 0x0a, 0xbb, 0x18, 0xa3, 0x4b, 0xee, 0xe1, 0x5f, 0x13, 0xe4, 0x58, 0x33, 0x2f, 0x06, 0xce, 0x78, 0xa4, 0x16, 0x91, 0x99, 0x43, 0x70, 0x1c, 0x75, 0x7f, 0x8f, 0x8a, 0x05, 0x7c, 0xd2, 0x51, 0x3f, 0x68, 0x80, 0x2c, 0x3a, 0x0e, 0x0b, 0x59, 0x92, 0xa8, 0x91, 0x05, 0x0e, 0xf5, 0xa8, 0x05, 0x80, 0x8c, 0x5b, 0xc6, 0xed, 0x70, 0x70, 0x87, 0xee, 0xe4, 0xed, 0xc5, 0x56, 0x81, 0xda, 0xf7, 0x15, 0x85, 0x47, 0x7c, 0x5d, 0x6e, 0x91, 0xd2, 0x03, 0xc8, 0xe2, 0x08, 0x27, 0x43, 0xf7, 0x76, 0x17, 0x08, 0x26, 0xab, 0x71, 0x4d, 0x9f, 0xa7, 0x88, 0x27, 0xf2, 0x4b, 0x09, 0xa0, 0xd1, 0x0d, 0xdf, 0x0a, 0x17, 0xf0, 0x53, 0x93, 0x0a, 0xb4, 0x78, 0x19, 0xdd, 0x49, 0xc6, 0x3f, 0x7a, 0x8a, 0x05, 0xc0, 0x7e, 0x28, 0x6d, 0x03, 0x84, 0xe4, 0x0b, 0xf0, 0xa6, 0x02, 0x66, 0x03, 0x41, 0xfa, 0x63, 0x9e, 0xf9, 0x70, 0x66, 0xa4, 0xfd, 0x66, 0xba, 0x43, 0x8c, 0xb1, 0x33, 0x11, 0xb9, 0xa9, 0x11, 0x5b, 0x6b, 0x25, 0x28, 0xb9, 0xa7, 0xa7, 0x3e, 0xe6, 0x12, 0xd3, 0xb5, 0xcf, 0xb1, 0x26, 0x6a, 0xea, 0xf4, 0xe4, 0xdc, 0xc9, 0xf3, 0x52, 0x91, 0xef, 0xf7, 0x26, 0xb5, 0xe2, 0x3c, 0x3c, 0x05, 0x82, 0xf5, 0x8a, 0xeb, 0x98, 0x91, 0x56, 0xea, 0xb2, 0x3d, 0xa6, 0x3d, 0x2f, 0xaa, 0xf9, 0xbb, 0x96, 0x10, 0x34, 0xfe, 0x2c, 0x73, 0xdf, 0xc4, 0xc5, 0x25, 0x91, 0x95, 0xda, 0x8c, 0xa9, 0xa7, 0xdc, 0x25, 0x3f, 0xfe, 0xc8, 0xc9, 0x5b, 0xd7, 0xfc, 0x2f, 0x64, 0x47, 0x49, 0xb3, 0xdb, 0x20, 0x49, 0x55, 0x49, 0x14, 0xf2, 0x05, 0x75, 0x1d, 0x6c, 0x1e, 0xdb, 0x1c, 0x20, 0x30, 0x5a, 0xc0, 0x12, 0x02, 0x2d, 0xa9, 0x70, 0xd7, 0x1c, 0xcd, 0x6b, 0xf1, 0xf3, 0x1b, 0x45, 0x54, 0x34, 0x5f, 0xab, 0xcc, 0x09, 0x66, 0x46, 0x31, 0x7c, 0x62, 0x8d, 0xea, 0xea, 0x8f, 0xdd, 0xb0, 0xb5, 0x17, 0xcb, 0x94, 0x3a, 0x34, 0xb9, 0x44, 0x03, 0x94, 0xa7, 0x8a, 0x3d, 0x01, 0x4c, 0x15, 0x6c, 0x41, 0x65, 0x7c, 0x5d, 0x3b, 0x4e, 0x80, 0x5c, 0x5c, 0xcf, 0x92, 0xa8, 0x39, 0x38, 0x95, 0x24, 0x76, 0xb0, 0xe4, 0x4f, 0xe6, 0xca, 0x97, 0x76, 0xf3, 0x59, 0x02, 0x29, 0x41, 0x86, 0x7f, 0xeb, 0x8e, 0x1f, 0x6e, 0x2d, 0xdd, 0x32, 0x79, 0x7e, 0xd3, 0xdb, 0x1d, 0xfc, 0x61, 0x5a, 0x65, 0x0e, 0xa3, 0x68, 0xf9, 0x55, 0x08, 0xcc, 0x58, 0xdf, 0xb4, 0x29, 0x62, 0x9e, 0x22, 0x1a, 0x19, 0x19, 0x0e, 0x80, 0xa8, 0x62, 0x92, 0x1b, 0xa5, 0x48, 0x8f, 0x58, 0x93, 0xcd, 0x4e, 0x6a, 0xab, 0xdb, 0x67, 0x9c, 0xdc, 0x32, 0xe2, 0xe6, 0x10, 0xa5, 0x9d, 0xbe, 0xb1, 0x86, 0xed, 0x30, 0x6b, 0x5f, 0x88, 0x31, 0x34, 0xe2, 0xa3, 0x31, 0x8a, 0x23, 0x57, 0xef, 0xfc, 0x05, 0x49, 0x91, 0xec, 0xf2, 0x8a, 0xf4, 0x93, 0xd0, 0xbc, 0x41, 0x46, 0x30, 0x77, 0xc1, 0xf7, 0xc8, 0xeb, 0xf2, 0xfe, 0x23, 0xc6, 0xda, 0x1a, 0x97, 0x58, 0x9b, 0xb2, 0x78, 0xf4, 0x48, 0x61, 0x8b, 0x9a, 0xf7, 0xb2, 0xbd, 0xd4, 0x17, 0x28, 0x15, 0xde, 0x04, 0x82, 0xe8, 0x09, 0xd9, 0x3c, 0x4c, 0x61, 0x86, 0x59, 0xce, 0x8e, 0x22, 0x60, 0x68, 0xf8, 0x82, 0xa5, 0xad, 0x2f, 0x0a, 0xc9, 0x47, 0x89, 0xc3, 0x84, 0xa3, 0x0d, 0xae, 0xa2, 0xeb, 0x8f, 0x58, 0x4c, 0x35, 0x1d, 0xaf, 0x89, 0xfa, 0x9a, 0x14, 0x05, 0xc9, 0xa9, 0xb1, 0x10, 0x3c, 0xcd, 0x0d, 0xe9, 0x2c, 0xce, 0xdd, 0x3d, 0x21, 0x5e, 0x1e, 0xeb, 0x0c, 0xfc, 0x60, 0x0a, 0x39, 0x19, 0x65, 0x2d, 0x7f, 0x79, 0xea, 0xe5, 0xba, 0xdd, 0xc5, 0x88, 0x7b, 0xdf, 0x30, 0x31, 0xfd, 0x1d, 0x65, 0x08, 0x5b, 0x99, 0x6b, 0xc4, 0x01, 0x60, 0x2f, 0x6e, 0x60, 0x6a, 0xd6, 0x67, 0xe7, 0xc2, 0x52, 0xac, 0x2e, 0xe6, 0x33, 0x59, 0x74, 0x71, 0xc0, 0x6c, 0x4b, 0xf7, 0x47, 0xcc, 0x92, 0x31, 0xb1, 0x8a, 0xa4, 0x5a, 0x59, 0x66, 0xcf, 0xd8, 0x1f, 0x95, 0x08, 0x1f, 0xb8, 0xc1, 0xdc, 0xd3, 0x48, 0x52, 0xaa, 0x2c, 0x32, 0xec, 0x10, 0x9f, 0x2e, 0x38, 0xa3, 0xbb, 0x9d, 0xe8, 0xe3, 0x51, 0x1a, 0xf5, 0x6e, 0xd7, 0x52, 0x2b, 0x73, 0x0e, 0x15, 0xe8, 0x6a, 0xe3, 0xad, 0x21, 0x02, 0x93, 0x6e, 0xa5, 0x5b, 0x13, 0x8e, 0xa6, 0x76, 0xaf, 0x37, 0x75, 0xea, 0xf1, 0xdb, 0x8d, 0xd8, 0xc4, 0xc8, 0xd3, 0x20, 0xd9, 0xfc, 0x1c, 0xd5, 0x4a, 0x3a, 0xf0, 0xef, 0x7e, 0x5d, 0x8e, 0x40, 0x4c, 0xed, 0x2f, 0xaa, 0x63, 0xf0, 0x8f, 0x8e, 0xe9, 0x02, 0xaa, 0x87, 0x62, 0xa8, 0xc3, 0x59, 0xd4, 0xe2, 0xab, 0x24, 0x28, 0xff, 0x40, 0xde, 0xd4, 0xb5, 0x34, 0xff, 0xb7, 0x71, 0x10, 0x7e, 0x44, 0xec, 0x78, 0xfd, 0xe3, 0xff, 0xb0, 0x41, 0x94, 0xb8, 0x5f, 0xe4, 0xd6, 0xad, 0x93, 0x4e, 0xc7, 0x90, 0x06, 0xe1, 0x8c, 0x04, 0xa0, 0x74, 0xf3, 0xaf, 0x3c, 0x03, 0x57, 0x91, 0xaf, 0xa4, 0xc5, 0x94, 0x06, 0xbd, 0x5c, 0x64, 0x10, 0x75, 0xfa, 0x80, 0x1d, 0x68, 0x15, 0x92, 0x04, 0x9f, 0xe6, 0xfc, 0x6b, 0xbf, 0xcd, 0xb3, 0x42, 0x80, 0xf1, 0x50, 0x91, 0x61, 0x27, 0x64, 0x74, 0x9b, 0x15, 0x0c, 0x63, 0x53, 0x97, 0xc6, 0xb7, 0x13, 0x61, 0x83, 0x6a, 0x7b, 0xe6, 0xfe, 0x1f, 0x34, 0x79, 0x4b, 0x62, 0x26, 0xb2, 0xb3, 0x30, 0xeb, 0x14, 0xbf, 0xba, 0x83, 0xec, 0x93, 0x66, 0x49, 0x7c, 0x7d, 0x17, 0x25, 0x59, 0xce, 0xae, 0x04, 0x12, 0xe9, 0xd1, 0x85, 0x12, 0x99, 0xeb, 0xf5, 0xc8, 0xa8, 0x73, 0x7e, 0x05, 0xad, 0x72, 0x9b, 0xa5, 0x25, 0x3f, 0xcf, 0x71, 0xc5, 0x8d, 0x97, 0x44, 0x0f, 0xa8, 0x9d, 0x6d, 0x24, 0xfc, 0x2e, 0x55, 0xd9, 0xd7, 0xee, 0x62, 0x0c, 0x70, 0xcb, 0x1a, 0x39, 0x27, 0x2f, 0x8c, 0x48, 0x0e, 0x7a, 0xeb, 0xa9, 0xa9, 0xaf, 0x7d, 0xa3, 0xf2, 0x6d, 0xb3, 0xe9, 0xa0, 0x22, 0x9a, 0x6f, 0xa9, 0x7b, 0x72, 0x7b, 0x06, 0x1f, 0x9b, 0xff, 0xb6, 0x9c, 0xb9, 0x26, 0x05, 0xa1, 0x10, 0x2d, 0x0e, 0x6f, 0x30, 0x74, 0x7f, 0x8a, 0xd7, 0xd5, 0x9c, 0xb4, 0x13, 0x34, 0x87, 0x1b, 0xa7, 0x57, 0xbe, 0xd2, 0xb0, 0xf8, 0xe5, 0x7e, 0x88, 0x19, 0xc6, 0x52, 0xeb, 0x98, 0x96, 0x3d, 0x58, 0x03, 0x79, 0x61, 0xba, 0xad, 0x49, 0xc8, 0x48, 0x02, 0x93, 0x52, 0xaa, 0x17, 0xe3, 0xf2, 0x5d, 0x86, 0x42, 0x1a, 0x58, 0x78, 0xfc, 0x74, 0xf0, 0x03, 0xa7, 0xd3, 0xf9, 0xb7, 0x60, 0x69, 0x2e, 0x73, 0x58, 0x3a, 0xd3, 0x7d, 0x90, 0xd0, 0x98, 0xd2, 0xe0, 0x31, 0xc1, 0xbb, 0x3e, 0x0e, 0x84, 0xa1, 0x3d, 0x3d, 0xb2, 0x22, 0xd4, 0x6a, 0x9a, 0x65, 0x61, 0x09, 0x2b, 0xaa, 0xed, 0x8e, 0x58, 0x25, 0xb2, 0xe1, 0xc1, 0x0c, 0xda, 0x0c, 0x8f, 0xef, 0x8a, 0x37, 0x9f, 0x48, 0x1f, 0xd7, 0xe4, 0x53, 0xb8, 0x22, 0x06, 0x1f, 0xf4, 0xc6, 0x4f, 0xe5, 0xfd, 0xda, 0xc8, 0x9a, 0xc5, 0x15, 0x9f, 0xc0, 0x8f, 0x3e, 0xcc, 0x81, 0xb2, 0xe3, 0xf4, 0xfe, 0x99, 0x4e, 0x8e, 0xe5, 0x0f, 0xb5, 0x44, 0x41, 0xb9, 0xb1, 0x9c, 0x97, 0xe4, 0xf1, 0xd7, 0x2e, 0x82, 0x30, 0x1a, 0xae, 0x6e, 0x64, 0xcb, 0xed, 0xf8, 0x39, 0x3e, 0x05, 0x9d, 0xbd, 0x91, 0xaa, 0x16, 0x5d, 0xd4, 0xba, 0x95, 0x10, 0x6d, 0x16, 0x4b, 0xd2, 0xbb, 0xb1, 0x2d, 0x54, 0xfa, 0xe6, 0xf8, 0xf2, 0x67, 0x0f, 0x72, 0xe5, 0xa4, 0x53, 0xf3, 0xba, 0x5d, 0xbf, 0x25, 0x02, 0x2c, 0x98, 0x08, 0x4c, 0xba, 0xf0, 0x39, 0x50, 0x28, 0x78, 0x73, 0x6d, 0xad, 0x95, 0x56, 0x56, 0x80, 0xb6, 0x67, 0x08, 0xf8, 0xe4, 0x59, 0xff, 0xf1, 0x9b, 0x8b, 0xa9, 0x73, 0xd8, 0xd1, 0x1b, 0x8e, 0x73, 0x77, 0x03, 0x88, 0xaf, 0x83, 0xdd, 0x3b, 0x10, 0x3b, 0x6a, 0xb8, 0x6c, 0xe7, 0x5e, 0x30, 0x45, 0xd8, 0x59, 0x15, 0x56, 0xa9, 0x19, 0x7c, 0x6c, 0xc5, 0xee, 0xc6, 0x77, 0x29, 0x6e, 0x7f, 0xe1, 0x6c, 0x69, 0x86, 0x1e, 0xfc, 0x20, 0x6e, 0x85, 0xaa, 0xb1, 0x25, 0x5e, 0x69, 0xd6, 0xd3, 0x3c, 0x52, 0xcf, 0x05, 0x8d, 0xec, 0x9d, 0x0b, 0x6f, 0xab, 0x71, 0x9e, 0xc5, 0xb6, 0x64, 0xc7, 0x8a, 0xed, 0x68, 0xfc, 0x66, 0x2b, 0x7f, 0x8b, 0x7f, 0xc8, 0x2b, 0x3c, 0x92, 0x63, 0x25, 0x31, 0x42, 0xde, 0x51, 0x12, 0xb0, 0xa9, 0xf2, 0x67, 0x4b, 0x44, 0x1b, 0x45, 0xea, 0xff, 0x66, 0x2d, 0x18, 0x05, 0xe7, 0x31, 0xae, 0x98, 0x63, 0x58, 0xa8, 0x9e, 0xbe, 0x44, 0x31, 0x5d, 0xb3, 0x12, 0x00, 0x83, 0xc8, 0x82, 0xe7, 0x69, 0x80, 0x58, 0xa9, 0x98, 0xd2, 0x02, 0x0d, 0x8d, 0xda, 0x7a, 0x30, 0xb9, 0xcf, 0x6e, 0x1f, 0xcc, 0x35, 0x9f, 0xa5, 0x33, 0x53, 0x87, 0x62, 0xdf, 0xe8, 0x3e, 0x1d, 0x49, 0x1a, 0x9e, 0x5c, 0xb3, 0xaf, 0xa6, 0x31, 0xb0, 0x7f, 0x1c, 0x56, 0xe6, 0x29, 0x76, 0x7c, 0x13, 0x06, 0xfb, 0xe1, 0x4e, 0x5b, 0x26, 0x21, 0x90, 0xd3, 0x4b, 0x4e, 0x72, 0x2c, 0x7c, 0x42, 0x38, 0x30, 0xae, 0x34, 0x0f, 0xe7, 0x18, 0x8a, 0x93, 0x0b, 0xdc, 0xee, 0x94, 0xbc, 0xe9, 0xa4, 0x1a, 0x75, 0x20, 0x1b, 0xa6, 0x3f, 0xb6, 0xc2, 0xbb, 0x24, 0xd9, 0x1c, 0x9d, 0xe7, 0x96, 0x17, 0x59, 0xf2, 0xfa, 0x9a, 0x05, 0x90, 0x77, 0x5d, 0x49, 0x5c, 0x8a, 0xfd, 0x1f, 0xfa, 0x9b, 0x50, 0xd6, 0x04, 0x25, 0xf6, 0x5d, 0x47, 0x16, 0x30, 0xbe, 0x30, 0x79, 0xf5, 0xe9, 0x81, 0x52, 0x43, 0xb3, 0x48, 0xc9, 0xb4, 0x1e, 0x12, 0x8b, 0x51, 0xdb, 0x5c, 0x6e, 0xaa, 0x0d, 0x4a, 0x54, 0x27, 0x50, 0x9c, 0x51, 0x99, 0xfa, 0xdd, 0x10, 0x14, 0xa1, 0xdd, 0x72, 0x01, 0xdd, 0x62, 0x79, 0x6f, 0x4e, 0x1b, 0x65, 0xaa, 0xe1, 0xd5, 0x1c, 0x0f, 0x50, 0xf1, 0xcf, 0x1e, 0xe8, 0x16, 0xdb, 0xd1, 0x8f, 0x23, 0xed, 0x2c, 0x05, 0x68, 0x6a, 0x16, 0x6a, 0x15, 0x0e, 0x67, 0x01, 0xf2, 0xd3, 0x42, 0x33, 0x51, 0x14, 0xa5, 0xd7, 0x42, 0xf2, 0x3e, 0xb0, 0x05, 0xf7, 0x81, 0x37, 0xc5, 0xf9, 0xf7, 0x9b, 0x83, 0x41, 0xd9, 0x07, 0x50, 0xed, 0xdd, 0x23, 0xbf, 0x93, 0x50, 0xdd, 0x9a, 0x27, 0x65, 0x69, 0xd4, 0x1f, 0xcd, 0x86, 0xbf, 0xd4, 0x87, 0x04, 0x7f, 0x2c, 0xfa, 0x83, 0xbf, 0x76, 0x41, 0x7d, 0xa2, 0x95, 0xc6, 0x87, 0xfc, 0x61, 0x12, 0xd3, 0xc3, 0x4a, 0xe3, 0xfa, 0xc0, 0x3f, 0x7f, 0xf8, 0x8a, 0xce, 0x49, 0x78, 0xb5, 0x8c, 0x92, 0x53, 0x47, 0xb7, 0xb1, 0x53, 0x6b, 0x1a, 0x56, 0x3c, 0x6a, 0x31, 0x1b, 0x0d, 0xd6, 0x8e, 0x5c, 0x83, 0x09, 0x7b, 0x49, 0xdf, 0xce, 0xe1, 0x39, 0xe9, 0x5d, 0x68, 0x42, 0x35, 0x8d, 0xe0, 0x06, 0xa5, 0x45, 0xe0, 0xcf, 0x2f, 0x33, 0xac, 0xdf, 0xe0, 0xc1, 0x5c, 0x01, 0x21, 0x45, 0x3b, 0x64, 0x3a, 0x78, 0x6e, 0xa9, 0x14, 0x2a, 0xd6, 0x3b, 0x43, 0x34, 0x37, 0xdf, 0x43, 0xad, 0x99, 0x8c, 0x02, 0x61, 0xee, 0x7c, 0x9f, 0x7e, 0xf6, 0x83, 0x72, 0x91, 0x60, 0xa0, 0x4c, 0xb1, 0x32, 0xd2, 0x00, 0xfa, 0x6a, 0x2c, 0x22, 0x3e, 0xe5, 0x2c, 0x0e, 0xf6, 0x81, 0x49, 0x2c, 0x7f, 0x7f, 0xcb, 0x73, 0x83, 0x2b, 0xdf, 0x2c, 0xb5, 0xbe, 0xeb, 0xf9, 0xc1, 0x83, 0x1f, 0x15, 0x82, 0x39, 0x4d, 0xdd, 0x76, 0xb9, 0xfa, 0x90, 0x70, 0xd8, 0xb5, 0x53, 0x8d, 0x8f, 0xa7, 0x78, 0x69, 0x59, 0x6c, 0xff, 0x93, 0xdd, 0x21, 0x5d, 0x3e, 0xcd, 0xbe, 0x7d, 0x39, 0x0e, 0xa6, 0x05, 0x21, 0x19, 0x7d, 0xda, 0xd5, 0xa1, 0x3a, 0xe6, 0x2a, 0x76, 0x7d, 0x19, 0xe0, 0xa9, 0x22, 0xad, 0xd5, 0xf1, 0x16, 0xaf, 0x79, 0x4d, 0x69, 0xbb, 0x82, 0xeb, 0xa5, 0x07, 0xe1, 0x49, 0x5f, 0xa2, 0xf4, 0x9a, 0x0b, 0xfe, 0xfd, 0x6b, 0x15, 0xad, 0xd3, 0x86, 0x2d, 0x68, 0xd7, 0x16, 0xe2, 0x55, 0x2a, 0x0d, 0x72, 0x8a, 0x1d, 0xc3, 0xe0, 0xcd, 0xe9, 0xdf, 0x48, 0x9d, 0xa1, 0x7b, 0x70, 0x77, 0x64, 0x83, 0x9f, 0x52, 0xd7, 0x5e, 0xb2, 0x6c, 0xd2, 0xd1, 0x6c, 0x48, 0x5a, 0x20, 0x0e, 0xf7, 0xd0, 0x76, 0x27, 0x98, 0x67, 0x86, 0xae, 0x1b, 0xdc, 0x73, 0x4e, 0x4a, 0x61, 0xed, 0x01, 0x09, 0xda, 0x9e, 0xe0, 0xdc, 0x4b, 0xc4, 0x3a, 0xab, 0x91, 0x1f, 0xe3, 0xc2, 0x51, 0x0d, 0xce, 0x1c, 0x2f, 0xf4, 0xde, 0xe1, 0x40, 0xe0, 0xfa ],
+const [ 0x13, 0xc1, 0x23, 0xac, 0x37, 0x91, 0x46, 0xd0, 0x66, 0x76, 0x7a, 0xc0, 0x2b, 0xa4, 0xbc, 0xda, 0x80, 0xfb, 0xf8, 0xa4, 0xe4, 0xce, 0xc5, 0xb0, 0xad, 0xe8, 0x4f, 0xc3, 0xa0, 0xd1, 0x94, 0x35, 0xbf, 0x4d, 0xd4, 0x9b, 0x62, 0x26, 0x42, 0xa4, 0x89, 0x2b, 0x00, 0x41, 0x71, 0x79, 0x4a, 0x09, 0x65, 0xf9, 0xf2, 0xdb, 0xd7, 0x2a, 0x0c, 0xc5, 0xaf, 0x21, 0xea, 0x24, 0xe3, 0xce, 0x4b, 0x0d, 0x48, 0x80, 0xcf, 0xec, 0xa8, 0xab, 0xae, 0x6b, 0x14, 0xea, 0xaa, 0x96, 0x7b, 0x40, 0x42, 0x3c, 0x7c, 0xa3, 0x29, 0x98, 0x79, 0xbb, 0xf6, 0x30, 0xed, 0xe7, 0x1d, 0xfe, 0xff, 0x81, 0x1e, 0xce, 0x57, 0x63, 0xfc, 0xe7, 0x30, 0xa9, 0xf1, 0xed, 0xae, 0xb9, 0x60, 0x06, 0x72, 0x81, 0x0b, 0x3c, 0x6d, 0x00, 0x86, 0x23, 0xf1, 0x08, 0xec, 0xbb, 0x0e, 0x42, 0xd0, 0x97, 0x1b, 0x72, 0x76, 0x3f, 0x93, 0xfc, 0x43, 0xd4, 0x23, 0xa8, 0x73, 0xf2, 0x00, 0xa2, 0x0a, 0xda, 0x7e, 0xc5, 0x0d, 0xd1, 0xdf, 0x18, 0xf1, 0xc3, 0x68, 0x99, 0x54, 0x2c, 0xbb, 0x3a, 0xeb, 0x39, 0x60, 0x2a, 0xbc, 0x2a, 0xa5, 0x55, 0x8d, 0xfa, 0xa8, 0x2e, 0x9c, 0x42, 0xb2, 0xac, 0x90, 0x5b, 0xc6, 0x92, 0xb0, 0xc2, 0x7a, 0xf4, 0x53, 0xc1, 0x06, 0xf7, 0x97, 0x4c, 0x9b, 0xd8, 0x56, 0x2a, 0xf6, 0x30, 0x56, 0x55, 0x34, 0x76, 0xc0, 0xa2, 0xe8, 0xc5, 0xd4, 0xa4, 0x6b, 0xdf, 0xda, 0xce, 0x73, 0x73, 0x5c, 0xd9, 0xe7, 0x9b, 0x92, 0x65, 0xf2, 0xa9, 0x1e, 0xe3, 0x57, 0x23, 0xfa, 0xb2, 0x04, 0x0c, 0xae, 0x88, 0xe9, 0x65, 0xc6, 0x14, 0x0a, 0xf4, 0x83, 0xe2, 0xd3, 0x44, 0xd1, 0x7e, 0xac, 0xed, 0x79, 0xdc, 0xce, 0x15, 0x98, 0xf7, 0x55, 0x37, 0x50, 0xb9, 0x96, 0x24, 0xbd, 0x1b, 0xb2, 0x47, 0x2a, 0x8d, 0x6c, 0x2c, 0x85, 0x98, 0x37, 0x44, 0x11, 0xc2, 0x93, 0xe2, 0x5b, 0xb2, 0x9a, 0x8a, 0x6f, 0x94, 0xd6, 0x6b, 0x4b, 0xbf, 0x56, 0x2a, 0x94, 0x95, 0x01, 0xe1, 0x88, 0xab, 0x2a, 0x68, 0x34, 0x2b, 0x64, 0xd3, 0xe7, 0x76, 0x97, 0x3b, 0xe6, 0x0d, 0x53, 0xc2, 0x61, 0xb1, 0x65, 0xd1, 0xa6, 0xc9, 0xa8, 0xa4, 0x95, 0x05, 0x1e, 0x09, 0x54, 0x41, 0x3f, 0x64, 0x44, 0xac, 0x91, 0xf7, 0x33, 0x29, 0x79, 0x60, 0xd3, 0xf5, 0x51, 0x63, 0x6a, 0x8a, 0xba, 0xea, 0xcc, 0xc4, 0x34, 0x4a, 0x87, 0x43, 0xec, 0xc8, 0x5d, 0x10, 0xd4, 0x5c, 0xf7, 0x83, 0xf9, 0xb5, 0xd7, 0x64, 0x12, 0x7c, 0x8f, 0x50, 0x54, 0xdd, 0x30, 0x5e, 0x8e, 0x44, 0x06, 0x03, 0x71, 0x64, 0x82, 0x33, 0x2f, 0x7e, 0x78, 0xc9, 0x49, 0xe0, 0x8b, 0x29, 0xa1, 0xac, 0xe5, 0x24, 0xd7, 0xda, 0x2b, 0x1c, 0xd2, 0x80, 0xaf, 0x68, 0x9d, 0x51, 0xe8, 0xf9, 0x75, 0x64, 0x20, 0x3e, 0x20, 0x38, 0x6d, 0x46, 0x80, 0xf4, 0xe2, 0x25, 0x67, 0xf3, 0x06, 0x98, 0xad, 0x7f, 0x85, 0xec, 0x80, 0xdd, 0x26, 0x1b, 0xfc, 0x8b, 0xfd, 0x39, 0xfb, 0xc5, 0xe2, 0x0e, 0x2f, 0x4d, 0x22, 0x05, 0x6e, 0x6c, 0x74, 0x45, 0x4c, 0x34, 0x2e, 0x1d, 0xef, 0x09, 0xb8, 0xa5, 0x1f, 0x60, 0x41, 0xa2, 0x9d, 0xc5, 0xb2, 0xab, 0xb6, 0x23, 0xe0, 0x8a, 0x17, 0x40, 0x06, 0xe5, 0xe3, 0x87, 0x72, 0x1e, 0x03, 0x0a, 0x7e, 0x77, 0xbe, 0xc7, 0xc2, 0x7a, 0x89, 0x2a, 0x88, 0x98, 0x20, 0xd4, 0x80, 0x10, 0xd5, 0x9b, 0xb6, 0x12, 0x28, 0xd2, 0xc0, 0x24, 0x99, 0xca, 0x3c, 0xc6, 0xba, 0x98, 0x7a, 0x51, 0x88, 0x19, 0x75, 0x25, 0xfb, 0x34, 0x08, 0x03, 0xdc, 0x5f, 0x5e, 0xb8, 0xd7, 0x65, 0xab, 0xfc, 0xd1, 0x66, 0x19, 0x99, 0x7c, 0x1f, 0x06, 0xd0, 0x28, 0x6b, 0x6c, 0xf8, 0xdc, 0x0a, 0xa0, 0x68, 0xa5, 0xa2, 0x40, 0x97, 0x2e, 0x03, 0x66, 0x82, 0x91, 0xaf, 0x22, 0x4e, 0x6d, 0x9a, 0x28, 0x2f, 0x39, 0x2e, 0xc5, 0x88, 0xd7, 0x92, 0x18, 0x54, 0x6c, 0x2c, 0x7e, 0xc4, 0x70, 0x65, 0x4e, 0x29, 0x01, 0xac, 0xc7, 0x15, 0x7d, 0xbd, 0x46, 0xbd, 0x4f, 0x23, 0xbc, 0xa2, 0x09, 0xfb, 0x60, 0x71, 0xb4, 0xfc, 0xa1, 0x27, 0x63, 0xb4, 0x5f, 0x78, 0x0f, 0x14, 0x5a, 0x72, 0x9e, 0x2f, 0xeb, 0x5e, 0x45, 0x3f, 0xf2, 0xe7, 0x10, 0xe9, 0x0f, 0x7e, 0xbf, 0xc2, 0x15, 0xfc, 0xd4, 0x11, 0xbb, 0x89, 0xea, 0xd7, 0x95, 0xbd, 0x48, 0x0c, 0x43, 0x06, 0xb6, 0x2c, 0xe9, 0x4a, 0x90, 0xf2, 0xdf, 0xcd, 0x18, 0x63, 0xa9, 0x54, 0x10, 0x0f, 0x29, 0x8b, 0x89, 0x94, 0x13, 0xa4, 0xf6, 0x63, 0xa2, 0x41, 0x84, 0xc7, 0x89, 0x94, 0xae, 0x23, 0x2d, 0xc4, 0x0b, 0x7b, 0x11, 0x93, 0x6b, 0x35, 0x91, 0x3f, 0x23, 0x21, 0xd4, 0xa5, 0xa5, 0xb8, 0xfc, 0xac, 0x54, 0xa1, 0x9f, 0xe1, 0x96, 0x7a, 0x7b, 0x5f, 0x2a, 0xd4, 0x65, 0xf2, 0xbc, 0x7f, 0x83, 0x7c, 0xb6, 0x09, 0xbb, 0x97, 0x5a, 0x81, 0x6b, 0x7b, 0x0e, 0x80, 0x5b, 0x23, 0xf6, 0x6b, 0xf0, 0xab, 0xc8, 0xf2, 0xa2, 0xfd, 0xdc, 0xdc, 0xaf, 0xac, 0x83, 0x07, 0x11, 0x20, 0x9a, 0xaa, 0xae, 0xf4, 0x5f, 0xde, 0xd0, 0x9c, 0x83, 0x5d, 0xd4, 0x4b, 0x80, 0x89, 0x26, 0x13, 0x2c, 0xb0, 0x6d, 0x4f, 0x8e, 0x8e, 0x02, 0x3e, 0xf1, 0x13, 0xa7, 0xf0, 0x38, 0x67, 0x76, 0x66, 0x71, 0x2c, 0x17, 0xf5, 0xad, 0x03, 0x36, 0xeb, 0x0e, 0x51, 0x34, 0x75, 0x21, 0x43, 0x1d, 0xc0, 0x6e, 0x0f, 0xdb, 0x5f, 0x4e, 0x7d, 0xa9, 0xed, 0xfd, 0xa7, 0xca, 0xf3, 0xf0, 0xfc, 0x7a, 0x0b, 0x69, 0x8b, 0x25, 0x46, 0x48, 0x7f, 0xd7, 0xcc, 0x24, 0xe5, 0xf4, 0xc2, 0x9a, 0xb6, 0x29, 0x71, 0xe5, 0x11, 0xa2, 0xa4, 0xaf, 0xc8, 0x7d, 0x51, 0x27, 0x1e, 0x7f, 0x7c, 0x54, 0xcf, 0x06, 0x59, 0xa9, 0x51, 0x3f, 0xb1, 0xd9, 0x5a, 0x99, 0x86, 0xed, 0xa2, 0x7a, 0xfa, 0x93, 0xea, 0x30, 0x6d, 0xb9, 0x3d, 0x2a, 0xe6, 0x5a, 0x76, 0x68, 0xb4, 0x98, 0x02, 0x30, 0x55, 0x0c, 0xe7, 0x03, 0x96, 0x5a, 0x05, 0xcf, 0xfc, 0x08, 0x9c, 0x66, 0x63, 0x90, 0x0f, 0x2f, 0xe5, 0xb3, 0xe8, 0x1b, 0xfd, 0x11, 0x1b, 0xdb, 0xec, 0xf7, 0x8f, 0x51, 0x5c, 0x78, 0xda, 0x44, 0x44, 0xbf, 0x4d, 0x57, 0x0b, 0xa3, 0x30, 0x3c, 0xf0, 0x7c, 0x4e, 0x25, 0xa9, 0x35, 0xb5, 0x7b, 0x4a, 0xa3, 0xb7, 0xd3, 0x69, 0x15, 0x34, 0x1e, 0x80, 0x2d, 0x1c, 0x1f, 0x92, 0xee, 0x2f, 0x23, 0x12, 0x15, 0x07, 0xec, 0x00, 0xad, 0x59, 0xee, 0x55, 0xde, 0x78, 0xbe, 0xa1, 0x06, 0x1a, 0xc7, 0xf3, 0x0b, 0x5f, 0x3f, 0xf9, 0xef, 0x0f, 0x59, 0x68, 0xa4, 0x23, 0xbc, 0x9e, 0x22, 0x88, 0x35, 0x87, 0xb8, 0x1f, 0xa8, 0xbd, 0x9f, 0x08, 0x4d, 0xf3, 0xd5, 0x20, 0x18, 0x93, 0x28, 0xc8, 0x79, 0xa6, 0x91, 0xe9, 0x46, 0xf5, 0xc4, 0x35, 0xf6, 0x6d, 0x05, 0xaf, 0x0f, 0xc8, 0x3d, 0x6d, 0xe1, 0x6a, 0x4d, 0x9c, 0x75, 0x89, 0xa2, 0xc6, 0xc1, 0x91, 0x0a, 0x50, 0x1d, 0xc7, 0xc6, 0x47, 0xfb, 0x2c, 0xe0, 0x5c, 0xd2, 0xa4, 0xbf, 0x2c, 0x5b, 0x57, 0xf8, 0xc5, 0x00, 0x58, 0x67, 0x66, 0x92, 0x85, 0x7f, 0x87, 0x3a, 0xae, 0xde, 0x19, 0xb2, 0xf9, 0x24, 0x0f, 0xb4, 0x84, 0x06, 0x1d, 0xb3, 0x4d, 0x9e, 0xc0, 0xca, 0x4f, 0x05, 0x7e, 0xf2, 0xee, 0x24, 0x6f, 0x77, 0x95, 0xc7, 0xfc, 0xad, 0x9e, 0xf3, 0xe7, 0xdf, 0x72, 0x7a, 0x8c, 0x88, 0xf1, 0xcc, 0x66, 0xc5, 0x14, 0x10, 0xd4, 0x0b, 0xd0, 0x74, 0x1d, 0x15, 0x3e, 0xc1, 0xb2, 0x21, 0xfa, 0x32, 0xb4, 0x5c, 0xc9, 0x86, 0xb6, 0x9b, 0x7e, 0x54, 0xc4, 0x4b, 0x1e, 0x9f, 0xa4, 0xab, 0x42, 0xaa, 0x5b, 0x39, 0xbd, 0x0d, 0xf4, 0x69, 0x7f, 0x09, 0x7c, 0x9d, 0xb9, 0x19, 0x51, 0x52, 0x42, 0xc9, 0x9d, 0x97, 0x3a, 0xcb, 0x1d, 0xc4, 0xed, 0x48, 0x27, 0x68, 0xf9, 0x74, 0xeb, 0x83, 0xb4, 0x65, 0xf9, 0xf6, 0xc8, 0x25, 0x03, 0x37, 0x20, 0x06, 0xe4, 0x49, 0x08, 0x35, 0xe2, 0xec, 0x8f, 0x92, 0x30, 0x11, 0x30, 0xbf, 0xb7, 0x90, 0xb2, 0x77, 0x17, 0x1d, 0x4d, 0x22, 0xe8, 0x79, 0x0e, 0xa6, 0x45, 0xe5, 0x7d, 0x7f, 0x8b, 0xdc, 0x7c, 0x12, 0x5e, 0x01, 0x72, 0x3e, 0xed, 0x57, 0xa9, 0x35, 0x77, 0xb0, 0xf5, 0x8a, 0x0f, 0x68, 0x97, 0x8b, 0x9c, 0x52, 0x60, 0xd0, 0x23, 0xf3, 0x1a, 0x14, 0x49, 0xee, 0x23, 0x44, 0x13, 0xc0, 0x5b, 0xd6, 0xf1, 0xad, 0x40, 0x5c, 0xfb, 0xfa, 0x58, 0x59, 0x7a, 0x5d, 0xd0, 0x53, 0xaa, 0xb2, 0x62, 0x29, 0xbe, 0xef, 0x7c, 0xa7, 0x25, 0x5a, 0x9e, 0x58, 0x0c, 0xfa, 0x03, 0x9b, 0x24, 0x4b, 0x85, 0xf9, 0xa5, 0x36, 0xbb, 0xb6, 0x93, 0x3f, 0x64, 0xa6, 0x40, 0x01, 0x08, 0x42, 0x12, 0xd7, 0xdc, 0xfb, 0x86, 0xdd, 0xe7, 0xcf, 0x75, 0x17, 0x63, 0x19, 0x96, 0xef, 0x66, 0xad, 0x45, 0xe5, 0xc1, 0x24, 0x82, 0x82, 0x28, 0x75, 0x3d, 0x8d, 0x94, 0xc6, 0xd1, 0x82, 0xe6, 0x81, 0xce, 0x40, 0xcd, 0xa9, 0xfb, 0x02, 0xe9, 0x6f, 0x9b, 0x90, 0x31, 0x00, 0xf0, 0xb7, 0x92, 0xa2, 0xfe, 0xf6, 0xd8, 0xff, 0x91, 0x7a, 0xd2, 0xc0, 0x81, 0x4d, 0xb1, 0x5e, 0x35, 0xca, 0xb2, 0x35, 0x66, 0x54, 0xfd, 0xdb, 0x25, 0x47, 0xcc, 0xaf, 0x20, 0x2f, 0xcf, 0xb5, 0x21, 0x38, 0xd0, 0xa1, 0xd7, 0xe6, 0x93, 0x31, 0xd9, 0x06, 0x00, 0xc0, 0xe8, 0xe5, 0x83, 0x19, 0x74, 0xbf, 0xb4, 0x89, 0x62, 0x7a, 0x33, 0x38, 0x0d, 0x94, 0xd6, 0xb8, 0x8b, 0x5b, 0x07, 0xdf, 0x31, 0x5c, 0x67, 0xd2, 0x59, 0x1d, 0xb8, 0x63, 0x62, 0x0f, 0xf9, 0x9d, 0xf9, 0xbe, 0xd2, 0x9c, 0x97, 0x4b, 0x33, 0xa3, 0x4b, 0x1c, 0x39, 0x68, 0xba, 0xd2, 0x51, 0xb2, 0x64, 0x7b, 0x9f, 0x26, 0x29, 0x09, 0xa1, 0x5e, 0x0b, 0x04, 0x0f, 0x3c, 0x35, 0x7b, 0x06, 0x7e, 0x3d, 0x40, 0x66, 0x92, 0xa6, 0x55, 0x79, 0xab, 0xa9, 0xa1, 0xd5, 0x14, 0x34, 0xe7, 0x83, 0xc5, 0x34, 0xf9, 0x60, 0x34, 0x10, 0x29, 0xc4, 0x6d, 0x75, 0x01, 0x62, 0x65, 0x59, 0x34, 0x6f, 0x8b, 0x3a, 0xd3, 0x07, 0xa1, 0xa7, 0xc4, 0xcc, 0xca, 0x02, 0x71, 0xd0, 0xe4, 0x84, 0xbd, 0xb5, 0x17, 0x81, 0x3c, 0x12, 0xae, 0xee, 0xa3, 0x19, 0x26, 0x20, 0x7d, 0x77, 0x85, 0xd6, 0x20, 0x7c, 0xee, 0x7a, 0xe0, 0x7c, 0x71, 0xa4, 0x82, 0x75, 0x27, 0xe0, 0xf4, 0xf1, 0x7f, 0xb1, 0x3b, 0x2e, 0xd3, 0xd6, 0xac, 0x7d, 0x3f, 0xcb, 0x5f, 0xe8, 0xb2, 0x93, 0xe1, 0x17, 0x45, 0xb5, 0x29, 0x75, 0xcc, 0x85, 0xcd, 0x8e, 0xab, 0xa4, 0x76, 0xbb, 0xec, 0xca, 0x92, 0x02, 0x8e, 0xc3, 0x48, 0x38, 0x1f, 0xb8, 0xb1, 0x68, 0x8d, 0xb0, 0x45, 0x79, 0x39, 0x56, 0x93, 0x0a, 0x4d, 0xfd, 0x36, 0xa1, 0x50, 0xe1, 0x04, 0x05, 0xf7, 0xb0, 0x88, 0xe8, 0x3e, 0x49, 0xb3, 0xc9, 0xb8, 0xc3, 0xce, 0x19, 0x23, 0xb1, 0xb3, 0x9d, 0x40, 0xa4, 0x3d, 0x13, 0xe2, 0xf2, 0xfd, 0x18, 0x44, 0xb6, 0x2e, 0x49, 0x9f, 0x18, 0xeb, 0xa9, 0xfc, 0xcf, 0xa0, 0x43, 0x47, 0xe4, 0xbf, 0x10, 0xa6, 0xb8, 0xb4, 0x1a, 0x09, 0x48, 0x1a, 0xe2, 0x01, 0xb0, 0x2f, 0xff, 0xd5, 0xee, 0x85, 0x09, 0xd3, 0xe9, 0xfb, 0xb5, 0xe4, 0xb2, 0xec, 0x41, 0x63, 0x09, 0xa6, 0x13, 0x2f, 0x23, 0x1e, 0x9d, 0xff, 0xaa, 0xe2, 0x83, 0xf6, 0x06, 0x4e, 0x00, 0x78, 0xdb, 0x03, 0x86, 0x3b, 0xd2, 0x95, 0xa4, 0xa1, 0x9d, 0x84, 0x2d, 0x45, 0x35, 0x6e, 0x97, 0xd3, 0x66, 0x82, 0xa1, 0x1e, 0x8e, 0x38, 0x38, 0x6c, 0xa2, 0x3f, 0x9c, 0x14, 0x71, 0xb7, 0xbf, 0x4c, 0x2d, 0xa1, 0xee, 0x3c, 0x27, 0x94, 0xb2, 0x57, 0xda, 0xb1, 0xf9, 0xea, 0x2b, 0xd9, 0x71, 0xf5, 0xef, 0x1d, 0x35, 0x3b, 0xae, 0x75, 0xab, 0x95, 0xa6, 0xb5, 0xac, 0x8b, 0x13, 0xbe, 0xe6, 0x25, 0xae, 0xf1, 0x7f, 0xff, 0x74, 0xea, 0xfb, 0x9c, 0xa8, 0x6a, 0x60, 0xfc, 0x1b, 0x94, 0x98, 0x71, 0xab, 0x5d, 0x16, 0xae, 0x0a, 0x3e, 0xbd, 0x21, 0xc1, 0x2b, 0xfd, 0x83, 0x74, 0xc9, 0x3f, 0xad, 0x67, 0xdc, 0x83, 0xad, 0x41, 0xfe, 0x47, 0x19, 0x10, 0x97, 0xab, 0xa3, 0x8e, 0x09, 0xd4, 0xee, 0xa3, 0x2b, 0x8e, 0xa0, 0x2a, 0xf9, 0x35, 0xb9, 0xf8, 0x8a, 0xd5, 0x23, 0x1a, 0x42, 0x90, 0x89, 0x5f, 0x48, 0x40, 0x6d, 0x17, 0x3a, 0x5e, 0x75, 0x19, 0x20, 0x23, 0x06, 0x0b, 0x9f, 0xec, 0x14, 0xdd, 0x70, 0xe3, 0x39, 0x97, 0x10, 0xdc, 0x04, 0x55, 0xb8, 0x7d, 0x93, 0x8f, 0x8f, 0xa2, 0x64, 0x9e, 0x1f, 0xff, 0x68, 0x7c, 0x05, 0x08, 0x59, 0xcc, 0xed, 0x0d, 0x4e, 0x1a, 0xbe, 0xaa, 0x8d, 0x63, 0x12, 0x5e, 0xa0, 0xd8, 0xe9, 0x7a, 0xab, 0xdf, 0x9e, 0x3d, 0xfc, 0x5b, 0x1a, 0x3d, 0xe4, 0x2d, 0x47, 0x08, 0xc5, 0xfb, 0xc7, 0x0c, 0x6d, 0x2f, 0xe7, 0xb4, 0xa2, 0x43, 0xce, 0xd4, 0xfe, 0x3d, 0xfb, 0x47, 0xfe, 0x75, 0xee, 0xd7, 0x55, 0x9e, 0x24, 0x5c, 0x86, 0x04, 0x49, 0x28, 0xb1, 0x13, 0xaa, 0xa3, 0xad, 0x19, 0xe9, 0x33, 0x58, 0x4d, 0xf4, 0x5f, 0x2b, 0x0f, 0x37, 0x33, 0x12, 0x71, 0x11, 0xe6, 0x7a, 0xf7, 0x85, 0xba, 0xab, 0x9b, 0x33, 0x24, 0x58, 0x14, 0x86, 0x2d, 0x74, 0x58, 0x2e, 0x18, 0x48, 0x60, 0xd1, 0x45, 0xc3, 0x2b, 0xfd, 0x55, 0x11, 0x05, 0x62, 0x8f, 0x6f, 0x09, 0x3e, 0x82, 0x3d, 0xe5, 0x18, 0xec, 0x54, 0xdd, 0xb1, 0xdb, 0x9b, 0x13, 0x38, 0x12, 0xd5, 0x05, 0xbd, 0xae, 0xbd, 0x57, 0xe8, 0x0a, 0x55, 0xd3, 0xeb, 0xdf, 0x7b, 0xae, 0xb5, 0xb0, 0xbd, 0x0c, 0x68, 0x65, 0x6e, 0xc7, 0x0e, 0x36, 0xf9, 0x6c, 0x88, 0xca, 0x76, 0x87, 0xc6, 0xa0, 0x7b, 0x21, 0x3e, 0xaf, 0x35, 0x86, 0x96, 0x49, 0xb7, 0x4c, 0xa4, 0x45, 0x91, 0x90, 0x99, 0x5d, 0xa5, 0x83, 0x79, 0xd5, 0x36, 0x26, 0xcf, 0x5e, 0x42, 0x51, 0x9e, 0x39, 0x12, 0xfa, 0x9a, 0x9f, 0x0f, 0xb4, 0x98, 0x61, 0xd7, 0x76, 0x44, 0xcc, 0x90, 0x9e, 0x12, 0xcf, 0x7d, 0x35, 0x77, 0x60, 0xce, 0x75, 0x58, 0x1b, 0xbd, 0x88, 0xc3, 0x2c, 0xd6, 0x93, 0xdd, 0x70, 0x96, 0xf3, 0x1b, 0xd7, 0x38, 0xc7, 0xb5, 0x0d, 0xcc, 0xae, 0x58, 0x59, 0x89, 0xd2, 0x1c, 0xc5, 0x64, 0x25, 0xb5, 0x7f, 0xe2, 0xea, 0xed, 0x7f, 0x2a, 0x78, 0x52, 0x6a, 0x5e, 0x3a, 0x2b, 0xb6, 0x2b, 0xfb, 0xb1, 0x10, 0x9f, 0x60, 0x7c, 0xfa, 0x3b, 0xb6, 0x3c, 0xb9, 0x4a, 0xee, 0xa9, 0x6e, 0x71, 0xe6, 0xbd, 0x83, 0x86, 0xeb, 0x20, 0x48, 0xa5, 0x7b, 0xe4, 0xde, 0x81, 0x4f, 0x72, 0x55, 0xf9, 0x99, 0xc4, 0x11, 0xec, 0x8a, 0xd5, 0x72, 0x4d, 0x17, 0x56, 0xb4, 0x7a, 0xfd, 0xa3, 0x13, 0xc9, 0x02, 0xf5, 0x33, 0x64, 0x7e, 0xd9, 0xc0, 0x58, 0x1b, 0xe1, 0x51, 0xe8, 0xd9, 0x99, 0x93, 0x27, 0x55, 0xbc, 0xa3, 0xc6, 0x4a, 0xa8, 0xbb, 0x2a, 0x58, 0x10, 0x11, 0xc1, 0x04, 0xf1, 0xfc, 0x97, 0x01, 0xc7, 0x59, 0x24, 0xae, 0x00, 0x2d, 0x69, 0xdf, 0xb1, 0x8c, 0x3b, 0xe0, 0x88, 0xb9, 0xde, 0xb7, 0x02, 0x8e, 0xd5, 0xaa, 0xdd, 0x1e, 0xf9, 0x01, 0xd1, 0x9a, 0xc9, 0x0d, 0x7b, 0x71, 0x01, 0x69, 0x9a, 0xbb, 0x6e, 0x80, 0x7d, 0xd8, 0x00, 0x4f, 0xbc, 0x54, 0x21, 0x6d, 0x27, 0x0e, 0x45, 0x48, 0xfc, 0x9a, 0xc2, 0xb1, 0x5d, 0xe3, 0xe3, 0x9b, 0x00, 0x15, 0x37, 0x1f, 0x29, 0xba, 0x2f, 0xc4, 0xd5, 0x23, 0xe8, 0xfe, 0x38, 0x09, 0x46, 0xf4, 0x6a, 0x74, 0x42, 0x86, 0x5e, 0xdc, 0x85, 0x8f, 0x13, 0x8e, 0x35, 0x67, 0x0e, 0x52, 0x0f, 0xad, 0x07, 0x4b, 0xb6, 0x43, 0xe3, 0x1e, 0x4a, 0x99, 0xe2, 0x57, 0x3d, 0x2f, 0x1a, 0x08, 0x62, 0x55, 0x24, 0xb2, 0x47, 0x36, 0x15, 0x69, 0xc5, 0x14, 0xaf, 0x34, 0xd5, 0xd5, 0xd9, 0xb3, 0xa5, 0xbf, 0x4d, 0x04, 0xec, 0x80, 0x91, 0xe6, 0x7a, 0x71, 0x28, 0x1f, 0x13, 0x1b, 0x09, 0x1c, 0x7d, 0xfb, 0x50, 0xd8, 0xd8, 0x82, 0x34, 0xff, 0x2e, 0x60, 0x39, 0x52, 0x4b, 0x02, 0xa6, 0x4d, 0xcf, 0x59, 0x3a, 0x07, 0x81, 0xde, 0x1b, 0x5b, 0xe6, 0xd3, 0x0f, 0x45, 0x13, 0xcb, 0xee, 0x8e, 0xbf, 0x6c, 0x58, 0xac, 0x9c, 0x74, 0xa3, 0xe4, 0xe8, 0xfa, 0x17, 0xb1, 0x3e, 0xf7, 0x5e, 0x69, 0xb3, 0x04, 0x36, 0x1e, 0x1e, 0x65, 0x69, 0xc2, 0xb7, 0x47, 0xff, 0x8f, 0xe4, 0x46, 0xb2, 0xa6, 0x4f, 0x32, 0xa2, 0xf7, 0x3c, 0x13, 0x4a, 0x60, 0x1a, 0x6a, 0xb3, 0x19, 0x57, 0xba, 0xe7, 0x4f, 0x79, 0x47, 0xa9, 0x0f, 0x6b, 0x1e, 0x63, 0x66, 0x14, 0x55, 0x60, 0xc7, 0x2e, 0x94, 0x3b, 0xac, 0x56, 0xd5, 0x98, 0x80, 0x5f, 0x67, 0x11, 0xbd, 0xec, 0x39, 0x74, 0x52, 0x3e, 0x55, 0x2b, 0x47, 0x4a, 0xab, 0xfb, 0xa3, 0x0f, 0x10, 0xf2, 0x8e, 0x26, 0x86, 0x9a, 0xb3, 0x9b, 0xbe, 0x73, 0xe8, 0xfb, 0xdb, 0xa0, 0x11, 0xae, 0x79, 0xe1, 0x41, 0x87, 0xee, 0xc1, 0x23, 0x9a, 0xcf, 0x11, 0x99, 0x4e, 0xb7, 0x94, 0xa2, 0xb3, 0x43, 0xfc, 0x81, 0x15, 0x61, 0x15, 0x1c, 0xd1, 0xcb, 0x41, 0xa2, 0x67, 0xce, 0x24, 0x70, 0xd1, 0x50, 0xa0, 0x36, 0x13, 0x11, 0x04, 0x55, 0x14, 0x31, 0x80, 0x8c, 0xac, 0xf3, 0xdd, 0xd4, 0xfe, 0xc0, 0x6a, 0x88, 0x08, 0x6f, 0x3a, 0xc9, 0x78, 0xc3, 0x8c, 0x21, 0xc1, 0x35, 0x8b, 0x66, 0x6f, 0xf4, 0x38, 0xe2, 0xb7, 0x2b, 0xa4, 0xb0, 0x53, 0x82, 0x62, 0x69, 0x8d, 0xe7, 0x3c, 0x01, 0x99, 0x8e, 0x25, 0xeb, 0x27, 0x36, 0x6f, 0x84, 0x39, 0xaf, 0x3e, 0xae, 0x32, 0x99, 0x3d, 0xbb, 0x30, 0x6e, 0x8f, 0x8e, 0x9c, 0xc3, 0x09, 0xfc, 0x00, 0xca, 0x9e, 0x78, 0x18, 0x1c, 0x1a, 0xf0, 0x2b, 0xb5, 0x14, 0xf2, 0x9b, 0x40, 0x1d, 0x13, 0xbc, 0x96, 0x3e, 0x91, 0xe2, 0x81, 0xa2, 0x37, 0xbe, 0xc5, 0x8f, 0x81, 0xea, 0x61, 0x9b, 0x01, 0xc2, 0x12, 0x1c, 0x01, 0x76, 0x19, 0xe0, 0x6a, 0x5d, 0x3e, 0x1e, 0xe5, 0x8c, 0x15, 0xad, 0x3f, 0xa8, 0x80, 0x74, 0x12, 0xf8, 0x75, 0x22, 0xa2, 0xbe, 0x01, 0x1f, 0x05, 0xc8, 0x8d, 0xc2, 0x87, 0x42, 0x61, 0xc4, 0x4c, 0xce, 0x66, 0xf4, 0x37, 0xd7, 0x30, 0x2d, 0x0b, 0x21, 0x3b, 0x85, 0xd0, 0xa5, 0x75, 0xc8, 0x79, 0x9d, 0xfd, 0x25, 0xc3, 0xdb, 0x2b, 0x26, 0x60, 0x5e, 0xd0, 0xe6, 0x55, 0x27, 0xbf, 0x7e, 0xa1, 0x49, 0x8c, 0xc0, 0x1f, 0x40, 0x93, 0x28, 0xad, 0x83, 0x3c, 0x0f, 0x8e, 0x5d, 0x7e, 0x22, 0x0d, 0xf8, 0xa2, 0x13, 0x63, 0xbb, 0x4a, 0x8e, 0xdb, 0xd5, 0xb1, 0x6f, 0x34, 0x1a, 0x34, 0x32, 0x47, 0x0f, 0x12, 0xaa, 0xea, 0x40, 0x70, 0xf6, 0x13, 0xda, 0xa0, 0xb2, 0x41, 0x75, 0xa2, 0x6a, 0x17, 0x32, 0xeb, 0x54, 0x4a, 0x06, 0x66, 0x3e, 0xbe, 0x55, 0xb9, 0xc5, 0xec, 0xc3, 0xc9, 0xc8, 0x87, 0x47, 0x80, 0x1c, 0x5f, 0x81, 0xce, 0x81, 0x85, 0x4d, 0xed, 0xd5, 0xb0, 0x98, 0xea, 0x88, 0xdf, 0x72, 0x61, 0x50, 0x40, 0x65, 0x88, 0x1e, 0x51, 0x05, 0x6e, 0x50, 0x45, 0xc9, 0x85, 0x28, 0xa9, 0x19, 0x5f, 0x7d, 0x47, 0xa8, 0xb5, 0xb0, 0x4b, 0x04, 0xad, 0xe2, 0xa4, 0x6c, 0x5c, 0x64, 0xad, 0xe1, 0x8a, 0x6f, 0x0d, 0x7f, 0xb6, 0x16, 0xdc, 0x0e, 0x5a, 0x78, 0x07, 0xd5, 0x71, 0x3a, 0xf5, 0xae, 0x35, 0x35, 0x6a, 0x60, 0x2d, 0x6b, 0xac, 0x28, 0x67, 0x40, 0xe5, 0x99, 0x03, 0xe7, 0xc9, 0xa7, 0xf1, 0x1a, 0x78, 0xfe, 0xfa, 0x0e, 0xa6, 0x98, 0x05, 0xa6, 0xf9, 0x8e, 0x93, 0xe7, 0xb2, 0x2e, 0x8d, 0xac, 0x90, 0x4f, 0x3f, 0x9a, 0xf1, 0xe1, 0xa4, 0x57, 0x3b, 0xc8, 0xe4, 0xf7, 0x7a, 0xeb, 0x1b, 0xb7, 0x4b, 0x87, 0x5c, 0xee, 0xf8, 0xca, 0xf6, 0x40, 0xe4, 0x9d, 0xf5, 0x15, 0x2a, 0xc1, 0xec, 0x49, 0x81, 0x1d, 0xf2, 0x26, 0x63, 0x56, 0xeb, 0x8f, 0x6e, 0xa1, 0x09, 0x7d, 0x0a, 0xd5, 0x92, 0xb0, 0x4c, 0xc5, 0xe3, 0x9e, 0x1a, 0xcc, 0xb5, 0xb0, 0x90, 0xa9, 0x9f, 0xad, 0xa3, 0x8d, 0xdc, 0x76, 0x04, 0x73, 0x4f, 0xf5, 0x47, 0xb0, 0xc4, 0x50, 0x45, 0xcb, 0x79, 0x62, 0xbf, 0x8e, 0xdd, 0x6b, 0x44, 0x5d, 0x97, 0x06, 0x54, 0xc7, 0xca, 0x5c, 0xc5, 0x5b, 0x97, 0x98, 0x66, 0xbd, 0xe4, 0x9b, 0xe3, 0xf9, 0x5c, 0xf0, 0xe8, 0x16, 0xb7, 0x02, 0x89, 0xef, 0x3c, 0x8c, 0xe2, 0x3e, 0x84, 0x52, 0xfa, 0xfa, 0x80, 0x0f, 0xee, 0xe3, 0xbe, 0xae, 0x4b, 0x5b, 0xe7, 0xbc, 0xbb, 0x77, 0x8d, 0x1e, 0xe4, 0x56, 0x23, 0xff, 0x8d, 0xb1, 0x4d, 0x0d, 0x02, 0xb4, 0x5b, 0xe5, 0xba, 0x0c, 0x0f, 0xcb, 0x38, 0x42, 0xa7, 0x9f, 0x2f, 0x47, 0x17, 0x0c, 0xe9, 0x50, 0x97, 0x03, 0xe9, 0xe3, 0x5d, 0x68, 0xd0, 0x32, 0xac, 0x0b, 0x7d, 0xa9, 0x0d, 0xd9, 0x78, 0xc3, 0xdd, 0x54, 0x91, 0x21, 0x07, 0x40, 0xc4, 0xdd, 0x13, 0x9f, 0x60, 0x1c, 0x60, 0xe0, 0x69, 0xe2, 0xad, 0x54, 0x3a, 0x2b, 0xde, 0xe1, 0x6e, 0x37, 0xfd, 0xfa, 0x01, 0x25, 0x80, 0xce, 0xb3, 0xc3, 0xca, 0xc0, 0xad, 0xa5, 0xf4, 0x18, 0x67, 0x74, 0xcc, 0xf8, 0xc9, 0x89, 0x1e, 0x91, 0x91, 0xba, 0x33, 0x96, 0xf4, 0x74, 0x98, 0xf1, 0x88, 0x0b, 0x20, 0xb6, 0x61, 0x4d, 0x2c, 0x55, 0x7a, 0x5d, 0x2a, 0x13, 0x57, 0xbf, 0x5c, 0xbb ],
+const [ 0x59, 0x5f, 0x40, 0xb0, 0x57, 0xef, 0x2d, 0x4f, 0x87, 0x74, 0xa2, 0x28, 0x99, 0xac, 0xf2, 0x8d, 0xa1, 0x29, 0xfa, 0x40, 0x6d, 0x53, 0x0c, 0x94, 0x16, 0xb0, 0x2c, 0xce, 0xd6, 0x63, 0x7f, 0xd1, 0x19, 0xf3, 0x00, 0xfb, 0xd7, 0x4e, 0x75, 0x4a, 0x20, 0x0e, 0xa2, 0xc3, 0xf9, 0xfa, 0xbc, 0x14, 0x66, 0xd0, 0x20, 0x78, 0xc8, 0x42, 0x45, 0xdb, 0x69, 0x3e, 0xef, 0x3f, 0x56, 0x72, 0xa6, 0x5e, 0x6d, 0x10, 0x67, 0x90, 0xb6, 0xce, 0x99, 0xf0, 0xf7, 0x32, 0x42, 0xba, 0x82, 0x0c, 0x7b, 0xf8, 0x52, 0x44, 0x22, 0x5e, 0x56, 0xd5, 0xce, 0x72, 0x0d, 0x1a, 0x08, 0xf0, 0x53, 0x49, 0xb8, 0x6c, 0x7b, 0x3d, 0xdd, 0x39, 0x9d, 0x78, 0x81, 0x8a, 0x31, 0x68, 0xed, 0xd7, 0xdd, 0xe9, 0x19, 0x82, 0x8c, 0x0c, 0x66, 0xbb, 0xc0, 0x16, 0x8f, 0xa1, 0x29, 0xcc, 0xdd, 0xa9, 0x76, 0xee, 0x9b, 0x44, 0x6b, 0x02, 0xca, 0xbc, 0x34, 0x52, 0x16, 0x5f, 0xf9, 0x38, 0x08, 0xe0, 0xb2, 0x99, 0x7c, 0xfa, 0x3d, 0xb0, 0x56, 0x56, 0xad, 0x0d, 0x71, 0xaf, 0xe6, 0xdd, 0xd8, 0x34, 0x67, 0x6b, 0x39, 0x2e, 0x66, 0xe7, 0x96, 0xe2, 0x22, 0x67, 0x3e, 0xb9, 0x75, 0x2b, 0xfc, 0x9e, 0xa8, 0x25, 0x8e, 0xa8, 0x8c, 0xb8, 0x58, 0xf9, 0xc6, 0xc1, 0x5a, 0xe6, 0x6b, 0xd4, 0x60, 0x58, 0xcd, 0xc8, 0x78, 0x71, 0x94, 0x75, 0xa9, 0x73, 0x10, 0xbc, 0xe2, 0xde, 0xcd, 0xc8, 0x31, 0xd9, 0x68, 0x94, 0x35, 0xd3, 0xa2, 0xad, 0xd6, 0x6a, 0xb3, 0x3a, 0x33, 0x8c, 0xe1, 0x39, 0xdc, 0xdc, 0x50, 0x0b, 0x42, 0x57, 0x1c, 0x33, 0x6c, 0x37, 0xa5, 0x5b, 0xeb, 0x17, 0x2a, 0x97, 0x0f, 0x59, 0x9a, 0xee, 0x5b, 0xc5, 0xa6, 0x17, 0x37, 0x72, 0x1b, 0x80, 0xe5, 0xea, 0x6f, 0x95, 0xb6, 0x89, 0x99, 0x3e, 0x7e, 0x26, 0x26, 0xa9, 0x45, 0xf6, 0x8a, 0x4b, 0x3f, 0xac, 0xb4, 0x21, 0xff, 0xe5, 0xe5, 0x3c, 0xe7, 0xc4, 0xc1, 0x7c, 0xe3, 0xd9, 0xa7, 0x9c, 0x57, 0x48, 0x3e, 0x6e, 0x55, 0x27, 0x50, 0x68, 0x14, 0x27, 0xdc, 0x60, 0x9d, 0x77, 0x66, 0x94, 0xc8, 0xe5, 0x92, 0xed, 0x67, 0x47, 0xf1, 0x85, 0xc1, 0x19, 0x1b, 0x66, 0x42, 0x67, 0xfe, 0x95, 0x70, 0xee, 0x75, 0x4f, 0x21, 0x7e, 0x1d, 0x92, 0xeb, 0xa2, 0x64, 0xdf, 0xdd, 0x83, 0xe2, 0x3f, 0x6c, 0x0a, 0xed, 0x84, 0xb0, 0x45, 0x67, 0xd1, 0xd1, 0x0c, 0xdb, 0x5c, 0xbc, 0xe4, 0xc8, 0x73, 0x1a, 0x23, 0x3d, 0xbd, 0x82, 0x55, 0xa6, 0xc3, 0xed, 0xdf, 0xe6, 0xae, 0x6b, 0xe2, 0xa6, 0x52, 0x15, 0x62, 0xec, 0x6c, 0x43, 0xa8, 0xef, 0x28, 0xff, 0xe4, 0x2a, 0xe7, 0xb9, 0x17, 0xaf, 0x3e, 0x3c, 0x30, 0xbe, 0x42, 0xe0, 0x75, 0x96, 0x03, 0x01, 0x25, 0x8b, 0x56, 0xb1, 0x5c, 0x59, 0xd8, 0xaa, 0x36, 0xb8, 0x2f, 0x86, 0x37, 0x30, 0x93, 0x33, 0xeb, 0x2f, 0x8e, 0xa1, 0xc9, 0x59, 0xff, 0xbd, 0x5d, 0x1f, 0x65, 0xa3, 0xa7, 0x93, 0x5a, 0x0f, 0xbe, 0x7a, 0x5e, 0x15, 0xb8, 0xa3, 0xd6, 0x13, 0xce, 0x78, 0x54, 0xe3, 0xbc, 0xd3, 0x19, 0x55, 0x67, 0x13, 0xd9, 0xdc, 0xc2, 0x6e, 0xbe, 0x87, 0xf2, 0x89, 0xaf, 0x33, 0xb1, 0x45, 0xd1, 0x00, 0xf0, 0xdc, 0x4e, 0x01, 0xc0, 0x2e, 0x56, 0x38, 0x72, 0x55, 0x64, 0xc1, 0xfd, 0x7f, 0xc3, 0x4d, 0xa1, 0xfd, 0x50, 0xd2, 0xca, 0x97, 0x81, 0x81, 0x37, 0x23, 0xa6, 0xf9, 0x5b, 0x56, 0x6f, 0xba, 0x04, 0xd9, 0xaf, 0xdc, 0x3a, 0x9f, 0x5f, 0x01, 0x6a, 0x77, 0xe6, 0x88, 0xc4, 0xdd, 0x98, 0x03, 0xe1, 0x16, 0x7c, 0xeb, 0xa9, 0x7c, 0x52, 0x93, 0x74, 0x16, 0xd4, 0x5b, 0x6f, 0x6b, 0x3d, 0x26, 0x42, 0x98, 0x08, 0x0e, 0xef, 0xa1, 0xfa, 0x56, 0xfd, 0x05, 0x62, 0x9f, 0xd7, 0x95, 0xa0, 0x5f, 0x6f, 0x85, 0xe4, 0x90, 0x26, 0xc4, 0x38, 0xa5, 0xf0, 0x89, 0xc1, 0xc2, 0xb3, 0x2f, 0x41, 0x2c, 0xf1, 0x42, 0xe1, 0xff, 0xa7, 0xda, 0x2e, 0x1f, 0x75, 0x27, 0x61, 0x70, 0xfe, 0x4e, 0xe3, 0x4a, 0x92, 0x73, 0x10, 0x27, 0x0b, 0x17, 0x3c, 0x9f, 0xf4, 0xa5, 0xf3, 0x97, 0xf1, 0x47, 0x85, 0xb5, 0x5a, 0xfe, 0xc2, 0x17, 0x2a, 0xf2, 0x03, 0x44, 0x18, 0x07, 0x6a, 0x62, 0x03, 0xb0, 0x6a, 0xaa, 0x93, 0x08, 0x89, 0x1a, 0x1e, 0x1f, 0x64, 0x69, 0xc8, 0x91, 0xf4, 0x40, 0xef, 0x5e, 0x11, 0xa7, 0xc6, 0xf5, 0x34, 0xbe, 0x3f, 0x92, 0x81, 0xad, 0x2f, 0xca, 0x05, 0xdd, 0xad, 0x65, 0x3c, 0x69, 0xba, 0x6b, 0xd6, 0xcf, 0x28, 0x81, 0xba, 0xec, 0xb4, 0x76, 0x4c, 0x27, 0x76, 0x1a, 0xeb, 0xec, 0x7b, 0x4f, 0xbe, 0x5c, 0xb0, 0x62, 0xb1, 0x42, 0x01, 0x9b, 0xba, 0x49, 0xc3, 0x12, 0x61, 0x6d, 0x4f, 0xc5, 0x7f, 0xb0, 0xf0, 0xe8, 0x46, 0x0e, 0x00, 0x7c, 0x81, 0xb2, 0x4d, 0x23, 0x1d, 0x6a, 0xc2, 0x33, 0xe9, 0x59, 0x43, 0x09, 0x9a, 0xec, 0xd8, 0xa0, 0x12, 0x0f, 0x0e, 0x62, 0xe2, 0xa0, 0x9a, 0x3d, 0x0d, 0x23, 0x40, 0xfa, 0x0f, 0xb8, 0xf3, 0xca, 0x1d, 0x4b, 0x3e, 0x22, 0xaf, 0x0b, 0xe2, 0xc9, 0x3c, 0x1d, 0xc1, 0x30, 0x44, 0x91, 0xfa, 0x01, 0x94, 0x95, 0x56, 0xfa, 0xc6, 0xe8, 0xe3, 0xfc, 0x07, 0x92, 0xde, 0x5f, 0x1d, 0xd3, 0xd6, 0x89, 0xa8, 0x59, 0x0f, 0xbf, 0xa7, 0xb5, 0x25, 0x3a, 0x3f, 0x10, 0xf1, 0x7e, 0xb8, 0x1a, 0xb0, 0xe7, 0xc9, 0x44, 0x62, 0x85, 0x15, 0x2f, 0x71, 0x2a, 0xf5, 0x64, 0x93, 0xc0, 0x78, 0x45, 0xf1, 0xe0, 0xa8, 0x44, 0x89, 0xa1, 0x0f, 0x52, 0xd1, 0xae, 0x7a, 0x9a, 0x9d, 0x9c, 0xfd, 0x70, 0x42, 0x7a, 0x37, 0x84, 0xfc, 0xa9, 0xd7, 0x5c, 0x8d, 0xee, 0x5f, 0x01, 0x27, 0xc5, 0x29, 0xf8, 0x8c, 0xf8, 0xa7, 0x73, 0x74, 0x71, 0xee, 0xc9, 0x2f, 0x4c, 0x76, 0x24, 0x8b, 0x31, 0x1b, 0x79, 0xf8, 0xe1, 0x68, 0xbe, 0xea, 0x0e, 0x15, 0x57, 0x7f, 0x70, 0xce, 0xd1, 0x62, 0x15, 0x37, 0xd2, 0xef, 0xf9, 0x2c, 0x50, 0x98, 0xd6, 0x4d, 0x02, 0x87, 0x3d, 0xba, 0x14, 0x84, 0xe6, 0x1b, 0x1f, 0x1a, 0x45, 0xe4, 0x58, 0xf5, 0x5d, 0xd7, 0x08, 0x8f, 0xd9, 0xca, 0x3c, 0x0c, 0x59, 0xaa, 0xbd, 0x62, 0x0a, 0xc0, 0x42, 0xbc, 0x79, 0x33, 0xe5, 0x21, 0xa9, 0xce, 0xd4, 0x50, 0x63, 0x04, 0x49, 0xef, 0xcd, 0x31, 0xbc, 0xe5, 0x3e, 0x23, 0x57, 0x05, 0x51, 0xd9, 0xaa, 0xec, 0x38, 0x8a, 0xa0, 0x2c, 0x53, 0xea, 0xb1, 0xaa, 0x01, 0xa8, 0x5a, 0x44, 0xb7, 0x3b, 0xca, 0xb7, 0x4f, 0xde, 0xdf, 0xc0, 0xa2, 0xd9, 0x50, 0x82, 0x58, 0x03, 0x2c, 0x28, 0xff, 0x85, 0x83, 0xcb, 0x5b, 0xe0, 0x62, 0x96, 0xfd, 0x32, 0x05, 0x28, 0x17, 0xb5, 0x49, 0x39, 0x8f, 0x88, 0x60, 0x81, 0x52, 0xb2, 0xc8, 0xd5, 0xeb, 0x64, 0x7e, 0x94, 0x54, 0x7e, 0x6f, 0x41, 0x0c, 0x55, 0x2f, 0x71, 0x69, 0xb3, 0xed, 0xe8, 0x30, 0x20, 0xa7, 0xff, 0x63, 0x60, 0x9a, 0x49, 0x5a, 0x3d, 0xfd, 0x75, 0x15, 0x87, 0xee, 0x76, 0xd1, 0x58, 0xad, 0xe2, 0xd9, 0x9c, 0x08, 0x98, 0x9f, 0xd1, 0x16, 0xa6, 0x0b, 0x0c, 0x28, 0x6a, 0x13, 0x3d, 0xfd, 0xf7, 0x8c, 0xb3, 0x35, 0xb9, 0x40, 0xe3, 0x08, 0x5d, 0x40, 0x65, 0x38, 0xeb, 0x7c, 0x3f, 0x44, 0x35, 0x90, 0x66, 0xdf, 0x75, 0xe1, 0x82, 0xa0, 0x32, 0xe9, 0xf2, 0xfb, 0x63, 0xcf, 0x10, 0x70, 0xd7, 0x3b, 0xb6, 0x02, 0xd4, 0x68, 0x01, 0xeb, 0xff, 0x7b, 0x54, 0x8e, 0x7b, 0x13, 0xa0, 0xad, 0x55, 0x21, 0xe3, 0xdc, 0x20, 0xfa, 0xef, 0x36, 0xdc, 0xaa, 0x6d, 0x4e, 0x1d, 0x8b, 0x21, 0x69, 0x69, 0x17, 0x70, 0xea, 0xe1, 0xfb, 0x1f, 0x0d, 0x23, 0x6c, 0x5d, 0xd8, 0x70, 0xbe, 0x04, 0x4f, 0x0a, 0x33, 0x1c, 0xe8, 0xe0, 0x11, 0xa1, 0x3e, 0x6d, 0xf7, 0x85, 0x09, 0xde, 0x70, 0xf9, 0x4e, 0x73, 0xc9, 0xe9, 0xd3, 0x27, 0x20, 0xc5, 0xd6, 0x93, 0xbe, 0x87, 0xfe, 0x10, 0xa7, 0xf2, 0x92, 0x1c, 0x6e, 0x17, 0xe9, 0xff, 0x4e, 0x1e, 0x22, 0xae, 0x77, 0x43, 0x15, 0xef, 0xa6, 0x1f, 0x88, 0xbe, 0xf8, 0x29, 0xa7, 0xef, 0x00, 0x7c, 0xae, 0x16, 0x17, 0xdb, 0xe9, 0xa4, 0xf3, 0xf2, 0xde, 0x52, 0x7c, 0xde, 0xc9, 0xc3, 0xda, 0xf0, 0x48, 0x64, 0xd3, 0xae, 0x58, 0x98, 0x54, 0x1b, 0x80, 0x12, 0x4d, 0x39, 0x4c, 0x81, 0xc2, 0xcb, 0xfd, 0x73, 0x20, 0x5f, 0x7f, 0x73, 0xcd, 0x8c, 0x9b, 0x75, 0x02, 0x79, 0x6e, 0x75, 0xdd, 0x9e, 0x1a, 0x5a, 0xb2, 0xcf, 0xbb, 0x20, 0xa3, 0x76, 0x9d, 0x36, 0x70, 0x20, 0xac, 0x25, 0x90, 0x3b, 0x2b, 0x73, 0x80, 0x1d, 0xa9, 0xc7, 0x5b, 0x49, 0x31, 0x4d, 0xab, 0xee, 0xc2, 0x5c, 0x7e, 0xb1, 0xfe, 0x57, 0xbd, 0xac, 0x26, 0xd1, 0xba, 0xb7, 0x46, 0xf4, 0x08, 0xe6, 0xad, 0x23, 0x8f, 0x53, 0xa0, 0xde, 0xdf, 0x1d, 0x50, 0xe6, 0xc5, 0xb0, 0x09, 0xa2, 0x1c, 0x47, 0xab, 0xc2, 0xe6, 0xb0, 0x5e, 0x22, 0x9c, 0x4f, 0x82, 0xf1, 0xc2, 0x66, 0xe5, 0x12, 0xbd, 0x94, 0x39, 0xc2, 0xe9, 0x9b, 0xc5, 0x7c, 0xe7, 0x66, 0x5a, 0x19, 0x34, 0x4a, 0x89, 0x3c, 0x00, 0x8c, 0x13, 0xed, 0x3d, 0x23, 0xa1, 0x84, 0xf6, 0xc0, 0xb5, 0xc9, 0xe2, 0x0c, 0xe1, 0x59, 0x39, 0x30, 0x37, 0x4c, 0xc6, 0x9b, 0x00, 0x14, 0x3e, 0xff, 0xb1, 0xa8, 0xd0, 0x9d, 0x1a, 0xe3, 0xfd, 0xc3, 0xe1, 0x26, 0xaa, 0x93, 0x2f, 0x45, 0x73, 0x05, 0xa9, 0xa1, 0x43, 0x30, 0xa2, 0x91, 0x21, 0xc5, 0x8e, 0x07, 0x4d, 0xdc, 0xba, 0x70, 0x8c, 0xf3, 0x3b, 0xdb, 0xc0, 0x33, 0x25, 0x5e, 0xbb, 0xf6, 0xfd, 0xb5, 0x55, 0x87, 0x70, 0x2d, 0xbc, 0x28, 0x44, 0xc1, 0x0c, 0x5a, 0x90, 0x82, 0x20, 0x58, 0x28, 0x3c, 0xa7, 0xe5, 0x5c, 0x56, 0x7a, 0x47, 0xe2, 0xfa, 0x2d, 0x94, 0x10, 0x76, 0xe3, 0x2c, 0x4e, 0xe2, 0x67, 0x87, 0xcc, 0x03, 0x79, 0x31, 0x70, 0x70, 0x66, 0x12, 0x13, 0xf3, 0xdc, 0xf3, 0xec, 0x32, 0xfb, 0x3e, 0x4c, 0x8f, 0xaf, 0x05, 0x8c, 0x4c, 0x3e, 0x46, 0x44, 0xf3, 0x1d, 0x6e, 0xbe, 0xf5, 0x08, 0x1b, 0xab, 0x91, 0x51, 0x26, 0x14, 0xf7, 0x79, 0xe1, 0x93, 0xae, 0xfd, 0x9d, 0xc2, 0x33, 0x72, 0x70, 0xf4, 0xe3, 0xd4, 0x35, 0x23, 0x1a, 0x1c, 0xd3, 0x2a, 0x9d, 0x10, 0xc3, 0x34, 0x35, 0x5f, 0xcc, 0x75, 0x9d, 0xed, 0x11, 0x18, 0x9e, 0x6c, 0x4e, 0x78, 0x79, 0x2c, 0x5f, 0x92, 0x85, 0x34, 0x02, 0xbb, 0x19, 0x91, 0xdd, 0x8e, 0xac, 0xee, 0xc3, 0x29, 0x3b, 0x65, 0x33, 0x99, 0xec, 0x95, 0x21, 0x92, 0xf0, 0xf5, 0xf9, 0x63, 0xad, 0x67, 0xe2, 0x2a, 0x1d, 0x11, 0x40, 0x44, 0x71, 0x68, 0x7c, 0x08, 0xfb, 0x8d, 0x07, 0xb5, 0x4a, 0xdd, 0x9c, 0xa8, 0x97, 0xc4, 0xc6, 0xd3, 0x60, 0xd1, 0xa3, 0x6a, 0x52, 0x10, 0xe7, 0xdf, 0x6c, 0x94, 0x23, 0x11, 0x62, 0x53, 0x48, 0xc1, 0x3f, 0x37, 0x67, 0x45, 0x4f, 0x71, 0xba, 0x80, 0x3c, 0x11, 0xe8, 0x11, 0x77, 0xd3, 0x85, 0xcb, 0xd9, 0x3c, 0xd8, 0x65, 0x8b, 0xe6, 0xe2, 0x73, 0x23, 0x19, 0x9b, 0x95, 0x0f, 0x9a, 0x7f, 0xef, 0x37, 0xc8, 0x49, 0xd9, 0xde, 0xe4, 0xff, 0xd7, 0xc9, 0xb1, 0x2e, 0xcb, 0xa4, 0x3d, 0x77, 0x69, 0xa1, 0xfe, 0x4a, 0xec, 0x62, 0x20, 0xf2, 0x07, 0x19, 0x1e, 0xd2, 0x1f, 0xee, 0x90, 0xee, 0xb7, 0xa1, 0x44, 0xad, 0x2c, 0x70, 0x8f, 0xdd, 0xa2, 0x3b, 0xe5, 0xf7, 0x3e, 0xe6, 0xa8, 0xa4, 0x96, 0xff, 0x3e, 0x81, 0x65, 0xa0, 0x66, 0x1f, 0x84, 0x97, 0xcc, 0x4f, 0x15, 0xc5, 0xdb, 0x9c, 0x01, 0xc4, 0xd2, 0x18, 0xa6, 0xcd, 0x1a, 0x5c, 0xc9, 0xd8, 0xd7, 0xca, 0xd2, 0x04, 0xbd, 0x15, 0x38, 0x3a, 0x24, 0x04, 0x3a, 0x0d, 0x5f, 0x72, 0xd0, 0xe5, 0x4a, 0x9a, 0xe1, 0x5d, 0x23, 0x91, 0xb6, 0xe9, 0x9b, 0x14, 0xaf, 0xbc, 0x2c, 0x84, 0x34, 0xe9, 0xac, 0x2f, 0xef, 0xc8, 0x23, 0xd1, 0x38, 0x9b, 0xda, 0x5b, 0xd1, 0x71, 0xb4, 0xf2, 0xd4, 0x4b, 0xc1, 0x3b, 0xe9, 0x7e, 0x11, 0xd6, 0xbc, 0x58, 0xc6, 0x28, 0xaf, 0x06, 0x6d, 0x5e, 0xcc, 0xb5, 0x8f, 0xae, 0xfd, 0xf8, 0x82, 0xe0, 0x7f, 0x6a, 0x85, 0x0e, 0x94, 0x94, 0x0d, 0xa8, 0x78, 0x11, 0x59, 0xba, 0x97, 0xef, 0x4c, 0x72, 0xfd, 0x59, 0x7c, 0xdd, 0x0e, 0x73, 0x87, 0xf1, 0x77, 0x86, 0xa6, 0xd0, 0x64, 0x5d, 0x84, 0x4b, 0xf4, 0xef, 0x50, 0xa5, 0xe9, 0x3e, 0x10, 0x9a, 0xa5, 0x7e, 0x39, 0xa0, 0x52, 0x7a, 0x7d, 0x6d, 0x60, 0x34, 0xe5, 0xb9, 0x34, 0xcb, 0x1f, 0x45, 0x1e, 0xa2, 0x19, 0x1c, 0x8c, 0xbf, 0xcf, 0x19, 0x7e, 0x71, 0x61, 0xa9, 0x3a, 0x36, 0x68, 0xd2, 0x41, 0xdb, 0x8a, 0x75, 0x81, 0xe5, 0x4c, 0xd0, 0xcc, 0x30, 0x28, 0x46, 0x89, 0xd6, 0xe0, 0x63, 0xaa, 0x52, 0x11, 0x1b, 0xde, 0xe6, 0x0b, 0x52, 0x07, 0x3a, 0xe0, 0xa2, 0xee, 0x45, 0xbb, 0x58, 0x35, 0x70, 0x73, 0xbf, 0x8e, 0xf9, 0x60, 0xa2, 0x2b, 0x96, 0x6e, 0x0c, 0x76, 0x5c, 0x6f, 0x52, 0x01, 0xde, 0xb6, 0x53, 0xc0, 0x99, 0xe1, 0xff, 0x76, 0x90, 0xf6, 0x16, 0x6d, 0x33, 0xb2, 0x32, 0x6a, 0x85, 0x1d, 0x08, 0xe0, 0x7e, 0x62, 0xeb, 0x64, 0xae, 0xde, 0x92, 0x61, 0x24, 0x77, 0x1a, 0x0d, 0x8e, 0x2f, 0x4e, 0x9b, 0xa2, 0xf8, 0x27, 0xb3, 0xbc, 0xcb, 0x8f, 0x1f, 0xc8, 0xf4, 0x6a, 0xc7, 0x62, 0xb0, 0xd7, 0xdf, 0x3c, 0xf9, 0xb3, 0x5f, 0xc0, 0xa1, 0x60, 0xb3, 0xf7, 0x9e, 0xc4, 0xb4, 0xaa, 0xa5, 0x94, 0xd8, 0xc7, 0xfa, 0xd2, 0xa5, 0x05, 0x86, 0x94, 0x6c, 0xcb, 0x2a, 0x08, 0x33, 0x4f, 0x53, 0xb5, 0xf3, 0xfb, 0xce, 0x03, 0x04, 0x14, 0xde, 0xfe, 0xd5, 0x9d, 0x8c, 0x57, 0xe0, 0x79, 0x3f, 0xab, 0xdd, 0xd1, 0x8c, 0x08, 0x36, 0xb5, 0x4f, 0xae, 0xbc, 0x06, 0xfb, 0x12, 0x98, 0x93, 0x2e, 0x29, 0x84, 0x82, 0x89, 0xe2, 0x3b, 0xf2, 0xbe, 0xf5, 0x2d, 0xde, 0xea, 0xdb, 0x78, 0x44, 0x26, 0x1d, 0x14, 0x87, 0x58, 0xd2, 0x4d, 0x13, 0x50, 0x63, 0x77, 0x3f, 0x10, 0x92, 0xdd, 0x77, 0x6a, 0xbb, 0xfa, 0x9a, 0xd1, 0x59, 0xec, 0xa1, 0x69, 0xcb, 0x25, 0x82, 0x60, 0x59, 0x64, 0x53, 0x81, 0x72, 0xe3, 0xb3, 0x06, 0x37, 0xd2, 0x66, 0xae, 0x3e, 0x05, 0x3f, 0x10, 0x8f, 0xea, 0x43, 0x2f, 0xf3, 0xbd, 0x0b, 0x4e, 0x6f, 0xff, 0x6a, 0x06, 0x0b, 0x24, 0x50, 0x95, 0xd7, 0x8c, 0xee, 0x79, 0x30, 0xb4, 0x1b, 0x3e, 0x40, 0xae, 0xf7, 0x94, 0xc4, 0xce, 0xce, 0xa4, 0x12, 0xa7, 0x3f, 0xa4, 0x5a, 0x35, 0x9d, 0xa9, 0x2c, 0x5c, 0x95, 0xbd, 0x3a, 0x91, 0x11, 0x32, 0x60, 0xd8, 0x5d, 0x36, 0xe1, 0xee, 0x88, 0xa7, 0xf4, 0xc7, 0x0e, 0x28, 0x7f, 0x3b, 0xb3, 0x74, 0x22, 0xfc, 0xb2, 0xf2, 0x77, 0xcb, 0x17, 0x8a, 0x98, 0xeb, 0x6a, 0xb8, 0xe2, 0xd6, 0x8d, 0xde, 0xf9, 0x30, 0xe7, 0xdf, 0x0c, 0xf9, 0xc3, 0xe9, 0x5b, 0x06, 0xf2, 0x92, 0xf6, 0xb2, 0xb8, 0x27, 0xc7, 0xd1, 0xe6, 0x40, 0xd2, 0xe5, 0x43, 0x98, 0xbc, 0x95, 0x30, 0x1c, 0x8a, 0x5a, 0x8c, 0x42, 0xac, 0x7c, 0xd6, 0x9c, 0x3a, 0x3d, 0x91, 0xad, 0x7d, 0x53, 0xed, 0xfb, 0xb1, 0x9c, 0xa3, 0x65, 0x09, 0x0e, 0x21, 0xb7, 0xf4, 0xed, 0xe7, 0x7c, 0x9f, 0x40, 0x31, 0x14, 0xbb, 0x85, 0xd6, 0x06, 0x80, 0xa4, 0x70, 0x97, 0xf2, 0x22, 0xbd, 0x9b, 0x63, 0x97, 0x45, 0x8b, 0x39, 0x62, 0x3d, 0xd8, 0xf1, 0x9b, 0xac, 0x7f, 0x64, 0x49, 0xcc, 0xde, 0x49, 0xd5, 0xb3, 0xc5, 0xfc, 0xbf, 0x32, 0xd1, 0x7e, 0x90, 0xfe, 0xf5, 0xbc, 0x10, 0x0d, 0x5a, 0x14, 0xb8, 0x43, 0x69, 0x15, 0x6a, 0x4e, 0x26, 0x86, 0x60, 0xcf, 0xbf, 0xaa, 0x63, 0xba, 0x64, 0xc3, 0x3d, 0xff, 0x5a, 0xd5, 0x70, 0x6a, 0x4b, 0xac, 0x28, 0xc7, 0xe1, 0x20, 0x6f, 0x4b, 0x93, 0x98, 0xa0, 0x2f, 0xbe, 0xcd, 0x1e, 0x9e, 0xf7, 0xd1, 0x45, 0xd1, 0xa0, 0x4f, 0xa1, 0x79, 0xb9, 0x14, 0x5e, 0x5d, 0xf9, 0xce, 0x00, 0x44, 0x1d, 0x14, 0x55, 0x15, 0x81, 0xa7, 0xa7, 0x3d, 0xed, 0xf8, 0x35, 0x51, 0xb1, 0xea, 0xe5, 0xf4, 0xf4, 0xd8, 0x33, 0xfc, 0x49, 0xda, 0x6d, 0xd0, 0x83, 0x44, 0x22, 0x14, 0xcb, 0x70, 0xd8, 0x89, 0xef, 0xbe, 0xfd, 0x2e, 0xfd, 0xd8, 0x20, 0xac, 0x11, 0x3b, 0x61, 0xf0, 0x6b, 0xf3, 0x26, 0x1a, 0xc4, 0xa5, 0x10, 0x96, 0xe2, 0xd3, 0x2e, 0x88, 0x6b, 0x5c, 0x70, 0x6e, 0xf7, 0x42, 0x5e, 0x01, 0x68, 0xb0, 0x09, 0x5b, 0x7e, 0x3c, 0x42, 0x5f, 0xa6, 0x69, 0x0b, 0x56, 0x13, 0x70, 0x4b, 0xd6, 0x10, 0x40, 0xc6, 0xe8, 0x95, 0xc3, 0x4b, 0x69, 0x18, 0x63, 0x2f, 0xb1, 0xa5, 0xcd, 0xfb, 0x73, 0x31, 0xf4, 0x62, 0xe4, 0x2c, 0x59, 0x76, 0x20, 0x55, 0x8b, 0x1b, 0xc9, 0xd2, 0xe9, 0xbb, 0xf1, 0x80, 0xaf, 0x3b, 0x3a, 0x88, 0x31, 0x2e, 0x3b, 0x33, 0x61, 0x49, 0x26, 0xff, 0x97, 0x17, 0xa8, 0xf2, 0x92, 0xee, 0x11, 0x2e, 0xba, 0x22, 0xb5, 0xc6, 0xa7, 0x78, 0x92, 0xd0, 0xe7, 0xde, 0x33, 0xbb, 0xfc, 0x59, 0xd4, 0xe3, 0xa5, 0x3e, 0xc6, 0x63, 0x5f, 0xa5, 0x15, 0x2a, 0x2a, 0x1b, 0x69, 0x52, 0x90, 0x97, 0x2a, 0xad, 0xe4, 0xb0, 0xe7, 0xa0, 0xc8, 0x0c, 0xf9, 0x34, 0xf1, 0x1c, 0x63, 0x6a, 0x2f, 0x06, 0xfd, 0xcf, 0xa7, 0xe3, 0xd2, 0x51, 0x63, 0x2b, 0xc6, 0x51, 0x0e, 0x6d, 0x7c, 0xf9, 0xf8, 0x44, 0x76, 0xd0, 0x61, 0x86, 0x7e, 0x8b, 0xf3, 0xbe, 0x45, 0x27, 0x90, 0xdd, 0x4b, 0x34, 0x4e, 0x2c, 0xfe, 0x74, 0xc0, 0x85, 0x26, 0xa4, 0x78, 0xc3, 0x80, 0x9a, 0xc9, 0x77, 0xa9, 0x90, 0xd2, 0xdd, 0x3e, 0xc0, 0xb7, 0x0e, 0x42, 0x31, 0x32, 0x76, 0xc0, 0xd0, 0x4b, 0x89, 0xb1, 0xc2, 0x63, 0xb2, 0x1f, 0xf9, 0x77, 0x8c, 0x8b, 0x05, 0xa3, 0x55, 0x8d, 0x2d, 0xe5, 0xa0, 0xba, 0xbf, 0x24, 0x49, 0xca, 0xa4, 0x71, 0xae, 0xfb, 0x37, 0x8c, 0x1c, 0xb0, 0x58, 0xaa, 0x88, 0x5e, 0xbb, 0x75, 0x80, 0xa8, 0x86, 0x55, 0x61, 0xc9, 0x1c, 0xee, 0xc9, 0x33, 0x33, 0xea, 0x4f, 0x75, 0x2d, 0xf8, 0x72, 0x62, 0xa5, 0x14, 0xd0, 0x70, 0x48, 0x0a, 0x99, 0x5e, 0xe6, 0x35, 0x42, 0x1a, 0xc8, 0x8d, 0x7e, 0xe1, 0x45, 0xe1, 0x6a, 0xa8, 0x90, 0x60, 0x07, 0xbb, 0xd4, 0x5e, 0xee, 0xa4, 0x83, 0x55, 0x3f, 0x4e, 0xeb, 0x2a, 0xdb, 0x6a, 0x0a, 0xb2, 0xd3, 0x12, 0xa3, 0x75, 0x20, 0xac, 0x91, 0xb2, 0x94, 0x12, 0x5c, 0xa3, 0x10, 0xf0, 0x0a, 0x01, 0xf8, 0x6d, 0x37, 0xcb, 0xe4, 0x0d, 0x68, 0x44, 0x98, 0xd5, 0x9d, 0x3b, 0x37, 0xb1, 0x25, 0x8e, 0xb3, 0x14, 0xb6, 0xf1, 0x88, 0xde, 0xbd, 0xec, 0xaa, 0x82, 0xf3, 0x23, 0xbb, 0x68, 0x31, 0xda, 0x82, 0x90, 0x85, 0xb8, 0x99, 0x79, 0x85, 0xcb, 0x65, 0x41, 0xe3, 0xcd, 0x4b, 0x0d, 0x42, 0xa6, 0x21, 0xab, 0x48, 0x31, 0xe3, 0x76, 0xf5, 0x43, 0xa8, 0x7a, 0x33, 0xea, 0xd4, 0xd9, 0xae, 0xf2, 0x8e, 0x6e, 0xe5, 0xae, 0x75, 0xaf, 0x82, 0xf5, 0x8e, 0xd8, 0xe6, 0x6a, 0x81, 0x46, 0x09, 0x00, 0x06, 0x20, 0x81, 0xbe, 0x9a, 0x3d, 0xe0, 0xc0, 0x76, 0x42, 0x43, 0x7f, 0xc1, 0x0b, 0x28, 0x52, 0x05, 0x4d, 0x80, 0x34, 0xe0, 0x79, 0x06, 0xc7, 0xfc, 0xe3, 0xce, 0x99, 0x40, 0x23, 0x21, 0xa6, 0x48, 0xbb, 0x88, 0x1f, 0x13, 0xfb, 0x27, 0x6a, 0xfc, 0x22, 0x4c, 0x6a, 0xec, 0xc6, 0x48, 0x00, 0xcd, 0x76, 0x7e, 0xd2, 0x42, 0x9d, 0xb9, 0x4b, 0x95, 0xa9, 0xc3, 0xe3, 0xf1, 0x6d, 0x33, 0xa0, 0xd1, 0xc4, 0x86, 0xdc, 0xb8, 0x78, 0x71, 0x4a, 0x23, 0x62, 0x76, 0x34, 0xbb, 0xd2, 0xb6, 0x06, 0xd0, 0x31, 0x06, 0x10, 0x03, 0xe4, 0x44, 0x88, 0x42, 0x74, 0xec, 0xce, 0xfa, 0xec, 0xe6, 0xf4, 0x87, 0x83, 0xa2, 0x7e, 0xf0, 0x7b, 0x67, 0x66, 0xd1, 0x49, 0xe8, 0x64, 0x98, 0xf6, 0x19, 0x6c, 0xf4, 0xc5, 0x40, 0x77, 0x8b, 0x16, 0x4f, 0x86, 0xec, 0x8a, 0x71, 0xe4, 0xc4, 0x68, 0xe3, 0xac, 0x54, 0x40, 0x05, 0x8c, 0x22, 0xce, 0xb1, 0xc8, 0xef, 0x20, 0xcb, 0x82, 0xea, 0xfb, 0x19, 0x38, 0x23, 0x7c, 0x55, 0x8e, 0x42, 0xfb, 0x81, 0x4e, 0x79, 0x34, 0x7b, 0xad, 0xb7, 0xa9, 0xd1, 0xd0, 0x1f, 0x42, 0xd6, 0x8e, 0xb8, 0x37, 0xf6, 0x78, 0x66, 0x2f, 0x46, 0x16, 0x19, 0xaa, 0x5f, 0x74, 0x44, 0x9c, 0x6d, 0xdd, 0x91, 0x5a, 0x83, 0xe7, 0xd3, 0xba, 0x32, 0xb0, 0x3b, 0x76, 0x59, 0x66, 0xd0, 0xd2, 0x3e, 0x0d, 0x19, 0x7f, 0xde, 0x7c, 0x1c, 0xbe, 0x82, 0xa9, 0x8d, 0xc9, 0x93, 0x27, 0x3f, 0x6e, 0xaf, 0xed, 0xde, 0xfd, 0xfc, 0x59, 0xe0, 0x64, 0xbd, 0x75, 0xb9, 0x99, 0x23, 0x78, 0x4e, 0x38, 0x65, 0x90, 0xad, 0x6e, 0x13, 0xde, 0xfb, 0x15, 0xa7, 0xc2, 0xad, 0x20, 0x5d, 0x5a, 0xfc, 0x3a, 0x44, 0x45, 0x92, 0xaa, 0x95, 0xad, 0x8a, 0x7a, 0x44, 0x84, 0x97, 0xd8, 0xd6, 0x0d, 0x83, 0xbc, 0x72, 0x9f, 0xdc, 0xcb, 0x3a, 0xa6, 0xea, 0x7c, 0xdc, 0xea, 0xe3, 0x79, 0x63, 0x14, 0x62, 0x48, 0x54, 0x6e, 0x16, 0x2a, 0xf6, 0xea, 0xb7, 0x43, 0xf1, 0x66, 0x3f, 0xfc, 0x1a, 0x2e, 0x56, 0xa6, 0x8e, 0xc2, 0x0e, 0x60, 0xfe, 0xda, 0xd0, 0x3a, 0x49, 0xa8, 0x97, 0x9a, 0x50, 0x5d, 0x5b, 0xdf, 0x06, 0xee, 0xd1, 0x45, 0xc6, 0x18, 0x51, 0x08, 0xea, 0xa2, 0x17, 0xcd, 0x99, 0xe2, 0xaf, 0x3d, 0xe0, 0x82, 0xab, 0xf3, 0x04, 0x84, 0x97, 0x98, 0x17, 0x84, 0x2f, 0x4c, 0xca, 0x3d, 0xcf, 0x48, 0x82, 0x4f, 0x2a, 0xc2, 0xae, 0x40, 0x3f, 0x11, 0x57, 0xc0, 0x89, 0x12, 0xf8, 0x31, 0x76, 0xca, 0x91, 0x66, 0x1b, 0x4d, 0xf7, 0xab, 0x26, 0xde, 0x6e, 0x06, 0x14, 0x57, 0x79, 0xbd, 0xa4, 0xcc, 0xf1, 0x18, 0x8b, 0x6b, 0x55, 0x68, 0x69, 0xa6, 0x61, 0x48, 0xfc, 0x95, 0xe2, 0x23, 0x93, 0x95, 0xc8, 0xf7, 0xc6, 0x36, 0x7d, 0x58, 0x65, 0x54, 0x75, 0xb7 ],
+const [ 0x21, 0x5c, 0x37, 0x32, 0x0f, 0xbd, 0xd5, 0x52, 0x00, 0x37, 0xbc, 0xe5, 0xb0, 0x2b, 0x12, 0x87, 0x1b, 0x34, 0x5b, 0xbd, 0x84, 0x16, 0x9d, 0x87, 0xbc, 0xf1, 0xc1, 0x34, 0xa1, 0xbb, 0x3d, 0x7a, 0xe5, 0xec, 0xf0, 0xc6, 0x11, 0x7b, 0x4d, 0xd1, 0xc9, 0x0a, 0xbc, 0x74, 0x51, 0x5e, 0x3d, 0xbd, 0x50, 0x11, 0x4f, 0x42, 0xd4, 0x8b, 0x10, 0xb5, 0x97, 0x2e, 0xa5, 0xb9, 0x81, 0xd1, 0xdc, 0xf4, 0x6d, 0x70, 0x10, 0x66, 0x30, 0x21, 0x4e, 0xf9, 0xd7, 0x4a, 0xb5, 0x59, 0x31, 0x12, 0x23, 0x05, 0x8e, 0x15, 0x0e, 0xa7, 0xc5, 0x5c, 0xaf, 0xa1, 0x7c, 0x8c, 0x66, 0xe8, 0xa3, 0x5d, 0x5a, 0x15, 0x42, 0x4e, 0x60, 0xb9, 0x75, 0x98, 0x1e, 0xf1, 0xb4, 0x60, 0x70, 0x3b, 0x58, 0x30, 0x0a, 0x88, 0x5b, 0xa8, 0x5f, 0x93, 0x60, 0x71, 0xc2, 0x70, 0xf3, 0x73, 0xcb, 0x68, 0x11, 0x48, 0xfd, 0x04, 0xeb, 0xf0, 0xa5, 0x68, 0xe7, 0xc6, 0x05, 0xe2, 0xe8, 0xb2, 0xb2, 0xc3, 0xcf, 0xa1, 0x3b, 0x6e, 0x42, 0x32, 0x0b, 0xae, 0xac, 0xb2, 0x91, 0x4d, 0x84, 0x4b, 0x9e, 0xe2, 0xd3, 0x78, 0x0e, 0xea, 0xf0, 0xbc, 0xaa, 0x1a, 0x8e, 0x94, 0x4d, 0xf4, 0xf9, 0xaa, 0x46, 0x99, 0x9d, 0x4b, 0xfe, 0xde, 0xc8, 0x1b, 0xdb, 0xa1, 0xb1, 0x08, 0x63, 0x5e, 0xb8, 0x7c, 0xa5, 0xfd, 0xef, 0xd7, 0xd4, 0xee, 0xda, 0x1c, 0x36, 0x78, 0x73, 0xea, 0x3c, 0x4e, 0x71, 0xaf, 0xf3, 0x64, 0xca, 0x18, 0x9b, 0x00, 0x77, 0xcc, 0x94, 0x14, 0x77, 0x59, 0x82, 0xcb, 0x16, 0x6e, 0xa9, 0x62, 0x6f, 0x4c, 0x99, 0x39, 0x30, 0x77, 0x10, 0x2a, 0x9d, 0xb1, 0x1c, 0x19, 0xd8, 0x28, 0x80, 0xcc, 0x5f, 0xef, 0x59, 0xfd, 0xd6, 0xab, 0x01, 0xae, 0x07, 0x8f, 0x34, 0xbd, 0x27, 0x8a, 0x71, 0xb8, 0x5a, 0xbe, 0xa3, 0xf2, 0x7a, 0x35, 0x01, 0xd7, 0x14, 0xcf, 0x33, 0x7c, 0xb4, 0x7f, 0xb6, 0x7b, 0x63, 0xb7, 0x81, 0xfd, 0x6d, 0x21, 0xe9, 0x18, 0x68, 0x90, 0xc2, 0x5c, 0x71, 0x36, 0xc7, 0xa8, 0xb9, 0x17, 0x3c, 0x42, 0x41, 0xbd, 0xd1, 0x27, 0xe1, 0x2e, 0xca, 0xa0, 0x8f, 0x1b, 0x5d, 0x16, 0xde, 0x5a, 0x5b, 0x27, 0xc5, 0x97, 0x13, 0xfa, 0xa2, 0x46, 0x74, 0xcf, 0x7e, 0xdb, 0x71, 0xda, 0x93, 0x3e, 0xaa, 0x51, 0x0b, 0x79, 0x48, 0xc4, 0x0b, 0xb4, 0x28, 0xad, 0xf0, 0x64, 0x3d, 0x48, 0xd9, 0xbf, 0x2f, 0xa4, 0x65, 0x73, 0x48, 0xfa, 0xbe, 0x97, 0x91, 0x3f, 0xd6, 0xe2, 0x38, 0xf5, 0xf0, 0x1b, 0x35, 0x46, 0x63, 0xd0, 0x2d, 0x53, 0x9a, 0x4b, 0x97, 0xca, 0x60, 0xc2, 0x1d, 0xb6, 0x5a, 0xce, 0x45, 0x9c, 0xd5, 0x1e, 0x50, 0xc3, 0xc3, 0x6d, 0x63, 0xd3, 0xff, 0xb1, 0xe4, 0xa2, 0xd9, 0x96, 0x27, 0x4a, 0xce, 0x2a, 0x4a, 0x7f, 0x97, 0xda, 0x5d, 0x1f, 0x66, 0x9d, 0xc6, 0x0b, 0x6c, 0x6f, 0xe4, 0x36, 0x9e, 0x01, 0xf3, 0xfb, 0xb9, 0xaf, 0x30, 0xb4, 0x83, 0xb2, 0x3d, 0x88, 0x54, 0x97, 0xc6, 0x84, 0xd6, 0xef, 0x65, 0xed, 0x09, 0x49, 0xc3, 0xd5, 0x8a, 0x5d, 0x01, 0xed, 0x14, 0x8a, 0x56, 0x9a, 0x47, 0x83, 0xf9, 0x4b, 0xa8, 0x45, 0x41, 0x09, 0xea, 0x4c, 0x0a, 0x50, 0x6c, 0x06, 0x5c, 0x1d, 0x02, 0x88, 0x47, 0x48, 0xf8, 0x80, 0x11, 0x14, 0x54, 0x6a, 0x94, 0x05, 0x5c, 0x07, 0xe1, 0xf1, 0x58, 0x0b, 0x29, 0x5a, 0x99, 0x16, 0xde, 0xfb, 0xba, 0xe6, 0x15, 0xa1, 0x26, 0xcb, 0x2f, 0x3c, 0xda, 0x5b, 0xb8, 0x36, 0x6d, 0x66, 0x8f, 0x03, 0x4d, 0x2d, 0x47, 0xfa, 0x4b, 0xce, 0xce, 0x63, 0x5a, 0x03, 0x4c, 0xd1, 0x93, 0x0c, 0x4e, 0xb2, 0x7d, 0xea, 0x24, 0x24, 0x8c, 0xce, 0x87, 0x0a, 0xe7, 0xd1, 0x80, 0x5f, 0x6e, 0xe5, 0x85, 0xcb, 0xfc, 0x0c, 0xe4, 0x74, 0xe9, 0xc8, 0x65, 0x17, 0xd4, 0xd2, 0x2a, 0x57, 0x9f, 0x0e, 0xdb, 0x55, 0xba, 0xbf, 0x00, 0x80, 0xa5, 0xf8, 0xae, 0xaf, 0xb0, 0x53, 0x66, 0x6d, 0x06, 0xe4, 0x3a, 0x93, 0xe9, 0x70, 0x31, 0x1d, 0x3f, 0xdb, 0xed, 0x36, 0x4e, 0xe0, 0x8b, 0x95, 0xc4, 0x05, 0xcb, 0x0c, 0xfa, 0xcd, 0x71, 0x5e, 0x79, 0x2f, 0xeb, 0x52, 0xbe, 0x47, 0x33, 0x05, 0x3a, 0x4c, 0xf7, 0x84, 0x9d, 0xc2, 0xf8, 0x9a, 0x54, 0xf0, 0xb0, 0xe7, 0x50, 0x95, 0x37, 0x32, 0x0a, 0xd7, 0x67, 0x01, 0xc4, 0x7c, 0x3f, 0x66, 0x11, 0x5c, 0x85, 0x1b, 0x97, 0x16, 0xaf, 0xd1, 0x14, 0x03, 0x04, 0xc6, 0x9f, 0x68, 0xff, 0x96, 0x31, 0xf0, 0xf4, 0x53, 0x63, 0x59, 0xf5, 0xd7, 0x79, 0x6d, 0xf7, 0x59, 0xa0, 0x34, 0x31, 0x3f, 0x74, 0x68, 0xc5, 0x33, 0xc5, 0x29, 0xa2, 0x79, 0x9b, 0xf2, 0xa9, 0x80, 0x77, 0xcc, 0x0f, 0xb7, 0xdc, 0xc1, 0x02, 0xa1, 0x0e, 0x94, 0x8f, 0x2c, 0x1a, 0xaf, 0xc3, 0x3f, 0x16, 0x5d, 0x10, 0x92, 0xaa, 0x39, 0xf3, 0xc2, 0xd0, 0xe7, 0xd4, 0xa5, 0xd7, 0x01, 0x2e, 0xdb, 0xae, 0x54, 0xef, 0xa5, 0x5f, 0x4d, 0x22, 0xfa, 0xda, 0xae, 0xcb, 0xd8, 0xf4, 0x85, 0x12, 0xd9, 0xaf, 0x5f, 0xa4, 0x06, 0xbc, 0xb9, 0x57, 0xef, 0x3e, 0xb7, 0x0d, 0xfc, 0xd1, 0x19, 0xda, 0xfe, 0xcb, 0x6a, 0x69, 0x09, 0xc2, 0x7a, 0x9b, 0x86, 0x4e, 0x0f, 0x72, 0x84, 0x0f, 0xd8, 0x2e, 0x4f, 0xf2, 0xa2, 0xb5, 0x44, 0xb1, 0xce, 0x38, 0xe3, 0x99, 0x03, 0x14, 0x26, 0x90, 0x20, 0xf6, 0x11, 0x56, 0x75, 0x43, 0x8b, 0x0b, 0x32, 0xb7, 0x6c, 0xf2, 0x1f, 0x4c, 0xd7, 0x74, 0x8e, 0x5d, 0xca, 0x68, 0x8f, 0x0b, 0xf3, 0x91, 0x62, 0xe0, 0xc6, 0x68, 0x32, 0xb2, 0xcc, 0x1c, 0x00, 0xca, 0x3e, 0xd8, 0xdd, 0x46, 0xd2, 0x44, 0x5c, 0xbc, 0xd5, 0x4e, 0x47, 0x20, 0x7a, 0x2a, 0x91, 0xe8, 0x72, 0x97, 0x8c, 0x6d, 0xbc, 0x65, 0x5c, 0x95, 0xbf, 0x34, 0xac, 0xaf, 0x96, 0x7e, 0x9f, 0x9e, 0xab, 0xd8, 0x09, 0x3a, 0x87, 0x74, 0xe0, 0xf3, 0xe8, 0xeb, 0xed, 0xb8, 0x14, 0x39, 0xc7, 0x17, 0x6e, 0x09, 0x02, 0xa5, 0x47, 0x34, 0xa4, 0xa0, 0xf6, 0x84, 0xd8, 0xd3, 0x2b, 0xbd, 0xe7, 0xba, 0x80, 0xde, 0x63, 0xe7, 0x51, 0xa4, 0xa6, 0xa4, 0xce, 0x50, 0x7b, 0xda, 0x4e, 0xaa, 0x1a, 0x31, 0xe7, 0x46, 0x5a, 0x79, 0x3b, 0x06, 0x22, 0x49, 0x94, 0xe0, 0x20, 0xe5, 0x34, 0xe1, 0xbe, 0x65, 0xe6, 0x72, 0x52, 0x14, 0xd9, 0xdb, 0x95, 0x17, 0xae, 0x05, 0x57, 0x4f, 0xd0, 0x84, 0x71, 0x80, 0x04, 0xd4, 0xfa, 0xb2, 0x41, 0xe3, 0xbe, 0xd7, 0xc1, 0xd0, 0xeb, 0xaf, 0x58, 0xf3, 0x0e, 0xe9, 0x05, 0x1d, 0x3e, 0x8b, 0xc7, 0x21, 0x97, 0x93, 0xb1, 0x93, 0xeb, 0xde, 0x41, 0xcf, 0xb3, 0x4a, 0xee, 0x3d, 0x4c, 0x18, 0x00, 0xd4, 0x60, 0x94, 0xa4, 0xdd, 0xa2, 0xf7, 0x40, 0xfa, 0xbe, 0x8c, 0x04, 0x66, 0x8f, 0x12, 0xc2, 0x7e, 0x93, 0x62, 0xff, 0x81, 0x9d, 0x51, 0x4a, 0x94, 0xca, 0xd8, 0xcc, 0x09, 0xb6, 0x72, 0x21, 0xe0, 0xf0, 0xc6, 0x66, 0x8e, 0xab, 0x86, 0x93, 0xfe, 0xb6, 0x97, 0x0b, 0xd6, 0xae, 0x72, 0x72, 0xfb, 0x72, 0xca, 0xbf, 0x57, 0xd7, 0x6f, 0x92, 0xda, 0x9d, 0x72, 0xc7, 0xbe, 0xa2, 0x8a, 0x4b, 0x10, 0x56, 0xb6, 0x2e, 0x6c, 0x6f, 0x24, 0xfa, 0x08, 0xde, 0x52, 0x44, 0xf3, 0x01, 0x73, 0x80, 0x9f, 0x1a, 0x14, 0x1a, 0x9e, 0x00, 0xff, 0xc2, 0xa9, 0x14, 0x5f, 0x07, 0xe6, 0x77, 0x26, 0x27, 0x6b, 0x7a, 0xac, 0x25, 0xfe, 0x56, 0x98, 0x1d, 0x1e, 0x1e, 0x04, 0xd5, 0x48, 0xf1, 0xdc, 0x94, 0x73, 0x74, 0x87, 0x37, 0xdd, 0x7f, 0xca, 0x81, 0x09, 0x17, 0xe9, 0xb3, 0x08, 0x9d, 0x0f, 0x5c, 0xf9, 0x44, 0xef, 0x73, 0xcc, 0xc9, 0xac, 0xa3, 0x4b, 0x5e, 0xf6, 0xe6, 0x5a, 0xe7, 0x77, 0x55, 0x7d, 0x68, 0x6d, 0x3f, 0x9c, 0xbe, 0x98, 0x78, 0x03, 0x8e, 0x56, 0xf3, 0xad, 0x7c, 0x0d, 0x93, 0xc2, 0x9d, 0xc9, 0x3f, 0x5e, 0x2e, 0x26, 0x35, 0x94, 0x86, 0x71, 0xa0, 0xb3, 0x49, 0x0a, 0x6c, 0xc7, 0xdf, 0x0c, 0x59, 0x63, 0x24, 0x30, 0x4e, 0x9e, 0x61, 0xef, 0xf1, 0x5c, 0x7c, 0xe7, 0x74, 0xcf, 0x6b, 0x80, 0xb1, 0x3d, 0xee, 0xcf, 0x7a, 0x03, 0x7e, 0xbb, 0x2a, 0xda, 0x80, 0x5e, 0x80, 0x59, 0xbf, 0xae, 0xae, 0xbb, 0x19, 0x5c, 0xac, 0xe3, 0x79, 0xfc, 0xd2, 0x9d, 0x05, 0x67, 0xa6, 0x27, 0x98, 0x5d, 0xf3, 0xf0, 0x72, 0x6f, 0x1b, 0x9f, 0x2e, 0x1c, 0xad, 0x57, 0xf5, 0x3b, 0x3a, 0x39, 0xf2, 0x99, 0x65, 0x2b, 0x05, 0xe2, 0x3a, 0xd8, 0xbc, 0xc5, 0xc1, 0xf8, 0x7f, 0x53, 0xd2, 0xd2, 0x0a, 0xa8, 0x2a, 0xff, 0x21, 0xce, 0xbf, 0x70, 0x7e, 0xde, 0x51, 0xb3, 0x0f, 0x68, 0x42, 0x71, 0x5e, 0x15, 0xa7, 0x3c, 0x51, 0x8b, 0x9f, 0x87, 0x13, 0x91, 0xe4, 0xf6, 0x52, 0x74, 0x9f, 0xd9, 0xab, 0xa9, 0x81, 0xf3, 0x62, 0xb3, 0x0f, 0x7f, 0x57, 0x48, 0x3d, 0x75, 0x35, 0xaf, 0x3f, 0x09, 0xed, 0x6c, 0x9c, 0x74, 0x63, 0x1f, 0x84, 0xf8, 0x66, 0xaa, 0x63, 0x1e, 0xe6, 0x92, 0xb6, 0x43, 0x61, 0xa8, 0x1e, 0x52, 0x9f, 0xe8, 0xb2, 0xd3, 0x9f, 0xa1, 0x9a, 0x25, 0xd1, 0xd6, 0xda, 0x07, 0x86, 0xe4, 0x6b, 0x5e, 0xa4, 0x66, 0x90, 0x32, 0x9e, 0x56, 0x67, 0xf9, 0xa3, 0x75, 0xbe, 0x18, 0x16, 0xec, 0x29, 0xa7, 0x3f, 0x33, 0x51, 0x74, 0x40, 0x32, 0x8f, 0x4b, 0x4a, 0xa6, 0xba, 0x75, 0x10, 0xc7, 0x3d, 0x7f, 0x7c, 0x28, 0x6c, 0x3d, 0xa1, 0xde, 0x18, 0x0d, 0xf2, 0xe4, 0x60, 0x60, 0xb1, 0xbe, 0xcb, 0x77, 0xaa, 0x5d, 0x94, 0x6b, 0x20, 0x43, 0x45, 0x70, 0x08, 0xe7, 0x87, 0x5a, 0x75, 0x5b, 0x39, 0x61, 0x54, 0x2c, 0xbf, 0x21, 0x59, 0x8a, 0x9d, 0xe5, 0x39, 0xa8, 0x44, 0x24, 0x1a, 0x66, 0x2b, 0x4c, 0x47, 0x2e, 0x22, 0xbf, 0x29, 0x1b, 0xe4, 0x1b, 0x73, 0x61, 0xeb, 0xbf, 0x9c, 0xe9, 0x88, 0x8b, 0x92, 0x3b, 0x32, 0xe6, 0xad, 0xa1, 0x1f, 0x06, 0xe1, 0x89, 0x11, 0x6c, 0x39, 0x2c, 0x73, 0xad, 0x80, 0x6d, 0xa4, 0x78, 0x41, 0x04, 0x93, 0xd5, 0xf3, 0xdb, 0x8c, 0xab, 0x6d, 0xb8, 0x51, 0x85, 0xa0, 0x1d, 0x6d, 0x95, 0x84, 0x6d, 0xc5, 0xfa, 0x53, 0x4f, 0x70, 0x3e, 0xf6, 0x57, 0xc8, 0x23, 0xbc, 0xe4, 0xc1, 0x9f, 0x52, 0x44, 0x7a, 0x25, 0xf0, 0x1f, 0x12, 0x26, 0xd0, 0x12, 0xbd, 0xd8, 0xe4, 0x9a, 0x17, 0x36, 0xc8, 0x34, 0xb8, 0x48, 0xf6, 0xc2, 0x08, 0xa4, 0x39, 0x31, 0x54, 0x35, 0x64, 0x59, 0x22, 0x3b, 0x43, 0x24, 0xc2, 0x93, 0xd2, 0xf3, 0x26, 0x39, 0xad, 0x3d, 0xf4, 0x0b, 0xc8, 0x79, 0xd8, 0xcf, 0x60, 0x3f, 0x1f, 0x78, 0x31, 0xaa, 0x82, 0xa5, 0xea, 0x00, 0x3f, 0x6b, 0xde, 0x95, 0x6f, 0x54, 0xfc, 0xec, 0x93, 0xa7, 0x01, 0x20, 0x70, 0xea, 0xec, 0x82, 0x1d, 0xa6, 0xb2, 0x84, 0x5a, 0x6a, 0x34, 0xd6, 0x23, 0x12, 0x6e, 0xce, 0x85, 0x49, 0xf1, 0x0d, 0xb1, 0x4d, 0x93, 0x60, 0x4f, 0xf3, 0x65, 0xe4, 0x14, 0xea, 0xe5, 0x6e, 0x97, 0x43, 0x75, 0x29, 0x60, 0x31, 0x0c, 0x81, 0x42, 0x0e, 0x2c, 0x40, 0xec, 0x9f, 0x14, 0xf7, 0xba, 0x99, 0x36, 0xa0, 0xd1, 0x64, 0xeb, 0x81, 0x6a, 0x1e, 0x66, 0x54, 0x6e, 0xe3, 0xe6, 0xa4, 0x44, 0x4c, 0x30, 0x7a, 0xe6, 0x35, 0x3d, 0x39, 0x3b, 0xc4, 0x30, 0xc7, 0xa1, 0xa7, 0x8b, 0xed, 0xc8, 0x9c, 0xa1, 0x01, 0xc7, 0x37, 0x4f, 0xc2, 0x69, 0xe0, 0xe7, 0x83, 0xc8, 0x1b, 0x6d, 0x8c, 0x1e, 0x0c, 0x06, 0xbd, 0xd7, 0x3a, 0xad, 0x74, 0xeb, 0x93, 0x28, 0xb1, 0x6a, 0xb0, 0x3a, 0x78, 0x59, 0x5b, 0x1b, 0x77, 0xbc, 0x4e, 0x25, 0xe9, 0xf4, 0x3e, 0xd0, 0xba, 0x4b, 0x18, 0xe0, 0xec, 0xce, 0x8b, 0xdd, 0x39, 0x5b, 0xc6, 0xc4, 0xfa, 0xfa, 0x83, 0xfc, 0x47, 0x70, 0x44, 0x8b, 0x60, 0x12, 0xdc, 0x8a, 0x4b, 0xd8, 0x32, 0xd6, 0xbf, 0xb2, 0x42, 0x09, 0x41, 0x1f, 0x64, 0xa9, 0x8d, 0xfb, 0xd1, 0x9f, 0x37, 0x98, 0x63, 0xea, 0x92, 0x11, 0x9c, 0x94, 0xd1, 0xdb, 0xea, 0xe5, 0x6c, 0x9d, 0x29, 0xd8, 0xc6, 0x42, 0x6a, 0xcb, 0x0c, 0x4c, 0xf3, 0x7a, 0x60, 0x6b, 0x87, 0x2e, 0x37, 0x4e, 0xe7, 0x32, 0xff, 0xb9, 0x98, 0x87, 0x06, 0xd8, 0xe7, 0xd8, 0x97, 0xd3, 0x2b, 0xb0, 0x66, 0xa2, 0x4a, 0xeb, 0x2d, 0x23, 0x7e, 0x6b, 0x98, 0x69, 0x59, 0x0c, 0x5f, 0x57, 0x07, 0xd9, 0xb1, 0x6e, 0xd4, 0x80, 0xd9, 0xe4, 0xed, 0x03, 0x1c, 0xf6, 0x6b, 0xb1, 0xe0, 0x7f, 0x8d, 0x55, 0x14, 0xc8, 0x45, 0xad, 0xcb, 0xa2, 0xf7, 0x1d, 0x2a, 0xb2, 0x7d, 0xa5, 0x85, 0x0d, 0x6e, 0x11, 0xc5, 0x05, 0xa0, 0x6f, 0x0d, 0x42, 0xeb, 0xc6, 0x9d, 0x14, 0x30, 0x05, 0xf6, 0x07, 0x9a, 0x3a, 0x3e, 0xb8, 0x24, 0x04, 0xe7, 0xe8, 0x5c, 0x4b, 0x8c, 0xcf, 0x66, 0x2e, 0x1b, 0xb2, 0x43, 0x3d, 0x39, 0xb8, 0x54, 0xe9, 0xe2, 0xfa, 0x19, 0x38, 0x50, 0xd9, 0x3f, 0xbe, 0x1f, 0x94, 0xda, 0xc8, 0xae, 0x1a, 0xef, 0xda, 0xc8, 0x1c, 0x35, 0x5c, 0x84, 0x67, 0x1c, 0x90, 0x69, 0x71, 0x0f, 0xc7, 0xd6, 0x31, 0xf6, 0xd5, 0xa1, 0x34, 0x00, 0xc2, 0xff, 0xee, 0x9f, 0xc2, 0xa4, 0x4e, 0xd4, 0x67, 0x2b, 0x95, 0xac, 0x16, 0xb7, 0x67, 0x0b, 0xb8, 0xdb, 0x22, 0xa8, 0xb1, 0xb7, 0x70, 0x59, 0x16, 0x64, 0x18, 0x91, 0x1a, 0x93, 0x1a, 0x26, 0xca, 0x70, 0xfa, 0x58, 0xfb, 0xcd, 0x5c, 0x10, 0x80, 0x7c, 0xd1, 0x65, 0xa0, 0xfc, 0xf1, 0x64, 0xc7, 0x59, 0xaa, 0x11, 0x7b, 0x4d, 0xd7, 0xa9, 0x92, 0xab, 0x14, 0x2a, 0xa2, 0xfd, 0xd1, 0x15, 0xba, 0x6c, 0xa6, 0x73, 0x4f, 0xe1, 0xe6, 0x16, 0x79, 0x6a, 0x77, 0x21, 0x60, 0xdf, 0xe1, 0xcb, 0xf0, 0xc5, 0xa4, 0x5f, 0xd5, 0x72, 0xcf, 0x87, 0xa3, 0x72, 0xce, 0xcb, 0x54, 0x2a, 0x84, 0x55, 0xf8, 0xbb, 0x9a, 0xf7, 0xa8, 0x2a, 0x16, 0x6f, 0xbc, 0xbd, 0x2f, 0xe9, 0x3e, 0xa8, 0x5f, 0xc5, 0x9e, 0xe8, 0xbb, 0x9b, 0xa6, 0x70, 0x80, 0x7c, 0xb1, 0x83, 0xee, 0x7b, 0x18, 0x61, 0x59, 0x6c, 0xee, 0x25, 0x7d, 0xec, 0xed, 0xee, 0x12, 0xa2, 0xaf, 0x3d, 0xa0, 0xc4, 0x22, 0x9e, 0x95, 0xdc, 0x36, 0x8b, 0x95, 0xcc, 0xd8, 0x8d, 0x11, 0x0f, 0x24, 0xa4, 0x1b, 0x43, 0xd6, 0xe9, 0x78, 0xe4, 0x02, 0x72, 0xf7, 0x5b, 0x06, 0x76, 0x02, 0x37, 0xbc, 0xb1, 0x73, 0xba, 0xf4, 0x0a, 0xa9, 0x97, 0x21, 0x74, 0xda, 0xfa, 0x52, 0x12, 0xaa, 0xc9, 0x64, 0x9e, 0xfd, 0x29, 0x76, 0x0b, 0x0a, 0x45, 0x9e, 0x69, 0xb2, 0x4b, 0xda, 0x0a, 0x0f, 0xb6, 0x4a, 0xe3, 0x4f, 0xd3, 0x9c, 0x34, 0xc3, 0x7e, 0xc7, 0x6c, 0x33, 0x2d, 0xfc, 0x47, 0x75, 0x31, 0xd9, 0x39, 0x3d, 0x38, 0xe1, 0x0f, 0x37, 0x15, 0x29, 0xd4, 0x53, 0xc4, 0x53, 0xf1, 0x61, 0xa8, 0xc0, 0x99, 0xdd, 0x18, 0x02, 0x64, 0x0c, 0x1a, 0x90, 0x3a, 0x48, 0x6e, 0xbe, 0x73, 0x97, 0xcf, 0xec, 0x3c, 0x83, 0x75, 0xfd, 0x3d, 0x26, 0xde, 0x0b, 0x79, 0x85, 0xce, 0x58, 0x75, 0x1f, 0x95, 0x88, 0x9c, 0xc5, 0x90, 0x0e, 0xe2, 0xab, 0xf2, 0xe5, 0xa8, 0xc0, 0xc4, 0x80, 0xdf, 0x3b, 0x2b, 0x03, 0x71, 0x76, 0xea, 0xb3, 0xdc, 0x00, 0x27, 0xab, 0x20, 0xee, 0x72, 0xd2, 0xdc, 0x71, 0x03, 0x09, 0xb4, 0xae, 0x43, 0xa9, 0xf5, 0xc9, 0x8f, 0x2c, 0x7c, 0x43, 0x38, 0x2a, 0xd4, 0x87, 0xce, 0x88, 0x9e, 0xbf, 0x9e, 0xec, 0x36, 0xec, 0x79, 0x73, 0x93, 0x36, 0xb7, 0xa7, 0x6f, 0x80, 0x7c, 0xab, 0xa8, 0x40, 0x3a, 0xb9, 0xe7, 0x8e, 0x77, 0xcf, 0x7f, 0x7b, 0xd1, 0xa4, 0x98, 0xa3, 0x3f, 0xe1, 0x8c, 0x06, 0x99, 0x8e, 0x91, 0x13, 0x5b, 0xca, 0x99, 0x06, 0xa6, 0xc0, 0x76, 0x74, 0x87, 0xd6, 0x42, 0x24, 0x7c, 0x27, 0xfe, 0x21, 0x34, 0x34, 0x79, 0x0d, 0x97, 0xd6, 0x73, 0xb8, 0x06, 0x78, 0x03, 0xf2, 0xe4, 0x82, 0x36, 0x9d, 0x55, 0x18, 0xf9, 0x06, 0x45, 0x05, 0x39, 0x75, 0xad, 0xf2, 0x48, 0x02, 0x11, 0xdc, 0x83, 0xab, 0x4e, 0xc5, 0x32, 0xa4, 0x92, 0xa9, 0xaf, 0xee, 0xac, 0xb3, 0xcb, 0x2b, 0x86, 0xb1, 0x6d, 0xb1, 0xef, 0xc6, 0x7c, 0xdd, 0x9e, 0x5e, 0xff, 0xa9, 0x74, 0x67, 0x83, 0x81, 0x02, 0xbf, 0xbd, 0x53, 0x4b, 0xe8, 0x71, 0xe6, 0xcb, 0x03, 0x93, 0x6c, 0xb8, 0xfc, 0xab, 0x5a, 0x87, 0x02, 0x7e, 0x77, 0xb2, 0x3a, 0xea, 0x33, 0xb9, 0xb4, 0x12, 0x3b, 0x67, 0x9e, 0xbb, 0x4a, 0x56, 0xb7, 0xf6, 0x42, 0xb5, 0x07, 0x00, 0x7b, 0x49, 0xce, 0x66, 0x5b, 0xb2, 0xba, 0x6c, 0x27, 0xf0, 0x5c, 0xb0, 0x18, 0x25, 0xdd, 0x0b, 0xb2, 0x9c, 0xed, 0xb8, 0x51, 0x0b, 0xfd, 0xb8, 0x05, 0x15, 0xae, 0x74, 0x9f, 0x13, 0x89, 0xa5, 0x0c, 0x14, 0xf0, 0x71, 0xe2, 0x22, 0x54, 0xd6, 0x39, 0xc8, 0xa9, 0x4c, 0xbc, 0xd1, 0x17, 0xa6, 0x00, 0x51, 0xf3, 0x3a, 0x14, 0xea, 0xed, 0x41, 0x59, 0x48, 0x8b, 0x81, 0x93, 0xee, 0xd6, 0x29, 0x41, 0x35, 0x53, 0xfc, 0x2a, 0x91, 0x34, 0xb1, 0x39, 0x17, 0xd0, 0x9a, 0x8a, 0x3c, 0x51, 0x85, 0xc5, 0xe0, 0xac, 0xe0, 0xab, 0x8b, 0xd7, 0x20, 0xee, 0xf6, 0x36, 0x63, 0x46, 0xcd, 0x56, 0x53, 0xc1, 0xb3, 0xdd, 0x4e, 0x5b, 0x87, 0xc1, 0xc5, 0xce, 0xe5, 0xb9, 0xe2, 0xab, 0xf0, 0xf1, 0x6e, 0xaa, 0x4f, 0x02, 0xf1, 0x3e, 0x76, 0x21, 0x1b, 0x6d, 0x27, 0x96, 0x62, 0xdf, 0x38, 0x71, 0xed, 0x35, 0x96, 0x78, 0xb1, 0x9c, 0x8a, 0x63, 0xda, 0xa1, 0x3b, 0x4c, 0x6c, 0x47, 0x75, 0x61, 0x2a, 0x56, 0xa8, 0xdc, 0xb7, 0xf7, 0x34, 0x35, 0xfb, 0x7e, 0xe3, 0x95, 0xc8, 0x87, 0xb7, 0x8f, 0xbd, 0x44, 0xe7, 0x0b, 0x6b, 0x15, 0x24, 0x82, 0xb7, 0x59, 0x20, 0x71, 0x7f, 0x85, 0x51, 0x07, 0x81, 0x73, 0xf3, 0x21, 0x78, 0xfc, 0x4c, 0x79, 0x87, 0xc8, 0x33, 0x1a, 0xdb, 0x65, 0xd3, 0x18, 0x8d, 0x97, 0xad, 0x7d, 0xc5, 0xef, 0xdc, 0x86, 0x25, 0x9f, 0x9d, 0x10, 0x65, 0x8d, 0x0e, 0x4d, 0x3a, 0xa6, 0x36, 0xbb, 0x7d, 0x75, 0x46, 0x57, 0x89, 0xf4, 0x1e, 0x0e, 0xe5, 0xa2, 0x13, 0x74, 0x23, 0xd5, 0xf0, 0xb8, 0x07, 0x52, 0x3a, 0xd8, 0xec, 0x1b, 0xb9, 0x11, 0x64, 0x88, 0x33, 0x9a, 0x1f, 0x99, 0x7b, 0x91, 0x0e, 0x8b, 0xab, 0x36, 0xc7, 0xa9, 0xad, 0x57, 0x2c, 0x65, 0x00, 0x0b, 0x47, 0xa7, 0xb8, 0xa3, 0x79, 0x65, 0xc7, 0xde, 0xd4, 0x74, 0x7c, 0x5c, 0xc5, 0x9e, 0x49, 0x55, 0xf6, 0xf4, 0xc9, 0x8b, 0x72, 0x65, 0x01, 0x7d, 0x0b, 0x90, 0xe7, 0xde, 0xf9, 0xd7, 0x20, 0x45, 0xc3, 0xb5, 0x0e, 0x26, 0x63, 0x51, 0x0a, 0x01, 0xa5, 0x53, 0xee, 0xd9, 0xd0, 0xf6, 0xd7, 0xe8, 0x88, 0x5e, 0x29, 0x91, 0xf3, 0x2d, 0xd3, 0x96, 0x1b, 0x51, 0xd4, 0x8b, 0x93, 0x1f, 0xfe, 0x8b, 0x5e, 0xa6, 0xf9, 0x29, 0x0c, 0x3d, 0x8c, 0xa9, 0x26, 0x5f, 0x18, 0x71, 0xcc, 0xb9, 0x65, 0xba, 0x9d, 0x80, 0xa1, 0x8b, 0xd7, 0x08, 0xa6, 0xe8, 0xbf, 0x93, 0x7c, 0x47, 0x44, 0x67, 0x1f, 0x43, 0xdf, 0x23, 0x82, 0x94, 0xbd, 0x52, 0xd3, 0x3f, 0x20, 0x41, 0x01, 0x0a, 0x03, 0x0e, 0x7c, 0x33, 0xfd, 0x02, 0x3c, 0x61, 0x67, 0x20, 0x04, 0xdb, 0xc1, 0xfe, 0xe8, 0xf8, 0x52, 0xd4, 0x0d, 0xd7, 0x0f, 0xd3, 0xb0, 0x4f, 0xbe, 0xb8, 0x69, 0x29, 0x5b, 0xa0, 0xb1, 0x8d, 0xbb, 0x1e, 0xa3, 0xbb, 0x6f, 0x8b, 0xff, 0xfc, 0xeb, 0x9d, 0x74, 0xd7, 0xe8, 0x3b, 0x1f, 0x87, 0x06, 0x90, 0x4f, 0xad, 0xb6, 0x5f, 0x8b, 0x43, 0x57, 0x96, 0xd6, 0xd1, 0x9f, 0x25, 0x31, 0xe3, 0x3d, 0x10, 0x62, 0xba, 0xbc, 0xc3, 0xf4, 0x42, 0xab, 0xa7, 0x7f, 0x44, 0xfb, 0xf2, 0x29, 0xdd, 0xa8, 0xc3, 0x6d, 0x2f, 0x9c, 0x6e, 0x1b, 0x56, 0xd0, 0x14, 0xa0, 0x9d, 0xb4, 0x78, 0x88, 0xf2, 0xd1, 0x0d, 0x41, 0x98, 0xac, 0x54, 0x22, 0x1c, 0xee, 0x64, 0xab, 0x8a, 0xc3, 0xca, 0x0f, 0xe0, 0x80, 0x94, 0xef, 0xc3, 0x88, 0xa9, 0x69, 0x71, 0x70, 0x5c, 0x51, 0xf7, 0x61, 0x40, 0xbe, 0xa4, 0xbe, 0x3d, 0xc9, 0xbd, 0x07, 0xe3, 0x91, 0x72, 0xfe, 0xff, 0x83, 0x11, 0x08, 0x6c, 0xd8, 0x7a, 0xd5, 0x2c, 0x5e, 0xd3, 0x43, 0xb7, 0x7c, 0x7d, 0x80, 0x93, 0x70, 0x46, 0x6f, 0x25, 0xdc, 0xe0, 0x4e, 0xc7, 0x81, 0x92, 0x95, 0x1b, 0x4a, 0x2d, 0x21, 0x9e, 0x8c, 0x42, 0x91, 0x80, 0x8c, 0x92, 0xf1, 0xb3, 0x42, 0xc6, 0x96, 0x42, 0x5c, 0x60, 0x48, 0xe4, 0x86, 0xf2, 0xa7, 0xd1, 0xe9, 0x8d, 0xc7, 0xd4, 0xf1, 0x7d, 0x1e, 0xa1, 0x54, 0x33, 0xa0, 0x6a, 0x50, 0x83, 0x28, 0xad, 0x34, 0x10, 0x1a, 0x50, 0x21, 0x04, 0x46, 0xef, 0x12, 0x04, 0x10, 0x75, 0x1a, 0x63, 0xce, 0xe9, 0xed, 0x95, 0x72, 0x8b, 0xa2, 0xe7, 0x69, 0x20, 0xb7, 0x6e, 0xc3, 0x8a, 0x56, 0x3d, 0x93, 0x9b, 0xd6, 0xdb, 0x99, 0x2b, 0x85, 0xf5, 0x1e, 0x68, 0xa5, 0x4f, 0x20, 0x6e, 0xb4, 0x00, 0xaf, 0x18, 0xf1, 0xdf, 0x97, 0x15, 0x1b, 0x39, 0x3f, 0x3e, 0x7c, 0xc5, 0xd1, 0x26, 0x26, 0xd9, 0x9b, 0xf3, 0x7d, 0xdd, 0xb6, 0x6d, 0xf5, 0x01, 0xe5, 0x55, 0x1d, 0x2b, 0xbf, 0xf8, 0xdd, 0x33, 0x11, 0x04, 0xfb, 0x53, 0x7e, 0x99, 0xe4, 0xd9, 0x68, 0xa3, 0xaa, 0x1f, 0x14, 0x68, 0x49, 0xbd, 0x08, 0x5d, 0x2e, 0xfd, 0xb8, 0x3e, 0xfa, 0x90, 0x62, 0x5d, 0x83, 0x7f, 0x37, 0x3b, 0x1b, 0x64, 0xbb, 0x55, 0x16, 0xd9, 0x6e, 0x40, 0x86, 0x31, 0xac, 0xf8, 0x49, 0x66, 0xd2, 0x76, 0x46, 0x53, 0xa2, 0x80, 0xf3, 0x23, 0xe9, 0xc5, 0x1b, 0x0a, 0x5e, 0x29, 0xde, 0x33, 0xce, 0x5e, 0xf9, 0xf9, 0x76, 0xb4, 0x47, 0x59, 0xb1, 0x32, 0x88, 0xa7, 0xd3, 0xe5, 0x62, 0x81, 0x54, 0x78, 0xa5, 0x02, 0x31, 0x05, 0xd3, 0x37, 0x8f, 0x2b, 0xe0, 0xd7, 0xa1, 0x61, 0x36, 0x2e, 0xcd, 0x89, 0xfc, 0x5b, 0x0a, 0xc9, 0x98, 0xbb, 0x8d, 0x96, 0x72, 0xa5, 0xa4, 0x11, 0xfb, 0x58, 0xe2, 0x97, 0xef, 0x31, 0x7c, 0x93, 0xd7, 0x22, 0xf3, 0x97, 0xd1, 0x5f, 0xf3, 0xac, 0x93, 0x5a, 0x7c, 0xe6, 0xae, 0xf2, 0x3f, 0x3b, 0x10, 0xe7, 0x4b, 0x94, 0xcd, 0x92, 0xe8, 0x25, 0x1f, 0xd3, 0xc3, 0xfa, 0xab, 0x4a, 0x4c, 0xd3, 0x05, 0xca, 0x5d, 0x32, 0x77, 0x0a, 0x1c, 0xb2, 0xfe, 0x9e, 0x22, 0x9a, 0x96, 0x26, 0xdd, 0xb2, 0xb7, 0xc6, 0x32, 0x56, 0x20, 0xd6, 0x67, 0xc8, 0xd3, 0xda, 0x41, 0xcb, 0x61, 0xb4, 0x69, 0x6d, 0x67, 0x18, 0x14, 0x24, 0x59, 0x41, 0xe3, 0x1c, 0x7e, 0xe2, 0x08, 0xd0, 0x3c, 0x60, 0xab, 0xd8, 0x96, 0x3e, 0x8c, 0x01, 0xf3, 0xd9, 0xe9, 0xa3, 0x21, 0x55, 0xa2, 0x2f, 0x99, 0xd7, 0x9b, 0x08, 0x05 ],
+const [ 0xf9, 0xee, 0x55, 0xf8, 0x7a, 0xe8, 0x34, 0x3e, 0x45, 0xf0, 0x1f, 0xb2, 0x85, 0x95, 0x3c, 0x75, 0x2c, 0x15, 0xa1, 0xd8, 0x92, 0x73, 0x14, 0x14, 0x5e, 0xcb, 0x14, 0x3c, 0xaa, 0xe3, 0x1e, 0x6f, 0x62, 0x02, 0x29, 0x52, 0xed, 0x05, 0x73, 0xbd, 0x10, 0xaf, 0x7f, 0xb5, 0x0f, 0x41, 0x5e, 0x9b, 0x15, 0x4a, 0x2f, 0xa2, 0xd5, 0xc1, 0xe2, 0x87, 0x72, 0x51, 0x41, 0x7c, 0x9c, 0xf4, 0x30, 0x65, 0xfd, 0xc3, 0x33, 0x46, 0xd3, 0x0d, 0x32, 0xfc, 0xde, 0xa6, 0x79, 0x2c, 0x7c, 0x81, 0x03, 0x7a, 0x13, 0x81, 0xf8, 0xfb, 0xaf, 0x8d, 0x74, 0xec, 0xec, 0xe3, 0x8a, 0xa4, 0x17, 0xae, 0x89, 0xc7, 0x90, 0xda, 0x7d, 0xbd, 0x72, 0x27, 0xf9, 0x62, 0x76, 0x7c, 0x14, 0xff, 0x15, 0x7f, 0xb2, 0x7a, 0xed, 0x62, 0x05, 0xc9, 0x66, 0xff, 0x53, 0xac, 0x95, 0x28, 0xf9, 0x9c, 0x61, 0x38, 0xb0, 0xfe, 0xe4, 0xee, 0x0f, 0x9d, 0x14, 0x7c, 0x51, 0x57, 0xa2, 0xda, 0x59, 0x17, 0x22, 0x60, 0xf3, 0x03, 0x6d, 0x94, 0x5d, 0xf6, 0x43, 0x41, 0x06, 0x30, 0x35, 0xc9, 0x95, 0x4c, 0xc2, 0xbb, 0x2d, 0x73, 0xc1, 0xa8, 0xef, 0xd0, 0xff, 0x33, 0xc1, 0x43, 0x28, 0x68, 0x4e, 0x5a, 0xeb, 0x4f, 0x4e, 0x7d, 0x59, 0xc0, 0x08, 0x68, 0x8e, 0x78, 0x15, 0xdf, 0x94, 0x6d, 0x66, 0x9c, 0x84, 0x5f, 0x89, 0x8d, 0xee, 0xb0, 0x27, 0x3c, 0x7b, 0x75, 0xd2, 0x8f, 0xd1, 0xcd, 0xfd, 0xb1, 0xb7, 0x72, 0x4c, 0x50, 0x7a, 0x8d, 0x0f, 0x09, 0x8f, 0xcf, 0x09, 0x20, 0x79, 0xbd, 0x75, 0x75, 0xee, 0x4b, 0x4b, 0xb3, 0x35, 0xad, 0xbf, 0xcb, 0xd2, 0x6a, 0x0a, 0xa1, 0x65, 0xb2, 0x6e, 0x04, 0xd0, 0xf1, 0x74, 0xe4, 0x98, 0xa4, 0x79, 0xbf, 0x8e, 0x6c, 0x68, 0x5d, 0xae, 0x60, 0xc9, 0xbd, 0x47, 0xa8, 0xfb, 0x4f, 0x5c, 0x48, 0xbd, 0x64, 0x4a, 0x39, 0xf4, 0xe2, 0xac, 0xbe, 0xa8, 0x3c, 0x7c, 0xf5, 0x4f, 0xa1, 0x7b, 0xac, 0x4e, 0x74, 0xd2, 0x77, 0xbd, 0xfd, 0xf9, 0xff, 0x6a, 0x5e, 0xd8, 0x9d, 0x21, 0xc8, 0x2c, 0x28, 0x2b, 0xee, 0x2d, 0x0b, 0x15, 0xba, 0x6e, 0x9a, 0xb3, 0x3f, 0x04, 0xa6, 0x63, 0xf0, 0xea, 0x4e, 0x96, 0x0f, 0xa4, 0x19, 0x8d, 0x68, 0x23, 0x42, 0x61, 0x3e, 0xe9, 0x53, 0x46, 0x86, 0x6d, 0xf5, 0x10, 0x53, 0xc1, 0x07, 0xf7, 0x92, 0x72, 0xed, 0x97, 0xf7, 0xb0, 0x2b, 0x3b, 0x37, 0xae, 0x32, 0x5a, 0x78, 0x4c, 0x79, 0x62, 0x05, 0xf4, 0xd0, 0xb5, 0x47, 0xc1, 0xf2, 0xf1, 0xf1, 0xe7, 0x59, 0x75, 0x7a, 0x4f, 0x56, 0x21, 0xd0, 0x81, 0x60, 0x5c, 0x4b, 0xc7, 0xad, 0x5c, 0xdf, 0x8f, 0xff, 0xa2, 0x97, 0x12, 0xc1, 0xc3, 0x3e, 0x33, 0x52, 0x6e, 0x5f, 0xaa, 0xa1, 0xab, 0x71, 0x61, 0xfa, 0x61, 0x4b, 0x1e, 0x1f, 0x1b, 0xde, 0x63, 0x9b, 0x0b, 0x22, 0x93, 0x53, 0x50, 0x51, 0x55, 0x5e, 0x74, 0x54, 0x3d, 0x16, 0x39, 0x7a, 0xaa, 0x6f, 0x95, 0x70, 0xea, 0x88, 0xfb, 0x6e, 0xa5, 0x80, 0xdc, 0xae, 0x78, 0x8b, 0x6e, 0x22, 0xe0, 0x45, 0xac, 0x66, 0x5a, 0x46, 0x9e, 0xf4, 0xc8, 0xf6, 0xda, 0x97, 0x17, 0xa2, 0x4b, 0x22, 0x1f, 0xd0, 0x31, 0x61, 0xca, 0xd0, 0x69, 0x50, 0x79, 0x94, 0xef, 0x8b, 0xa3, 0xc2, 0xa1, 0x06, 0xbf, 0x06, 0x45, 0xfe, 0x65, 0xad, 0xce, 0x2f, 0xb0, 0x70, 0xdb, 0x48, 0xe6, 0x8d, 0x81, 0x9c, 0x5b, 0x1d, 0x4a, 0x1a, 0x92, 0xa1, 0x7d, 0x7f, 0xa6, 0xde, 0xa0, 0xca, 0xe8, 0xeb, 0x3c, 0xf0, 0xca, 0x88, 0xe0, 0xd2, 0xfc, 0xb1, 0x68, 0x6c, 0xd4, 0x73, 0x7f, 0x4f, 0xf3, 0xff, 0x63, 0x51, 0x26, 0xfd, 0xe9, 0x83, 0x8a, 0x22, 0xc0, 0x63, 0xf4, 0x05, 0xf9, 0x53, 0x8f, 0x2e, 0xc7, 0x4a, 0xc7, 0x70, 0x84, 0xca, 0x66, 0x7a, 0xf5, 0x12, 0xfd, 0xa8, 0xcf, 0x94, 0x86, 0x1f, 0x7a, 0xa9, 0x47, 0x18, 0x14, 0x84, 0xfa, 0x7c, 0xb9, 0x64, 0x2a, 0xb2, 0x02, 0x0e, 0xe0, 0xb4, 0xcb, 0x7b, 0x7f, 0x69, 0x3a, 0xce, 0xed, 0x2f, 0xfd, 0x89, 0xf3, 0xb6, 0xd2, 0xff, 0xe7, 0x15, 0x4d, 0x0d, 0x88, 0x17, 0xd6, 0x05, 0x29, 0xd6, 0xf1, 0xeb, 0x12, 0x8c, 0xc2, 0xe4, 0x23, 0xa5, 0xd0, 0xeb, 0xba, 0x19, 0x09, 0xc6, 0xd7, 0xf8, 0x06, 0x38, 0x7e, 0x47, 0x91, 0x79, 0x5d, 0x0a, 0x64, 0xe3, 0xaf, 0xa2, 0x34, 0xee, 0x60, 0x59, 0xee, 0x5e, 0x72, 0x3c, 0x41, 0xbb, 0x9f, 0x29, 0x5c, 0x02, 0x40, 0x28, 0xf9, 0x9a, 0x6d, 0xfe, 0x9a, 0x89, 0x66, 0x00, 0x12, 0xe8, 0x31, 0x26, 0x48, 0x94, 0x85, 0x60, 0x38, 0x27, 0xe7, 0x2d, 0x3a, 0x27, 0x13, 0x69, 0x87, 0x7d, 0x9d, 0x66, 0xf9, 0x28, 0xd8, 0x3f, 0x12, 0x32, 0xf7, 0x69, 0x40, 0xe3, 0x72, 0x8b, 0x5f, 0x36, 0xac, 0x90, 0x80, 0x89, 0xd2, 0xfa, 0xe9, 0x98, 0x06, 0x79, 0x5d, 0xac, 0xbd, 0xbc, 0x9d, 0x10, 0x65, 0x87, 0x2e, 0xc5, 0x4c, 0x06, 0x5d, 0x76, 0xbd, 0x61, 0x81, 0xae, 0x6c, 0x90, 0x80, 0x49, 0x13, 0x71, 0x94, 0x29, 0x5e, 0x17, 0x4f, 0x2a, 0x05, 0x65, 0xdd, 0x57, 0x37, 0xdc, 0x8a, 0x5e, 0x3f, 0xb2, 0x83, 0x41, 0x62, 0x24, 0xe1, 0x4f, 0x06, 0x0d, 0xe3, 0x53, 0x1a, 0xb6, 0x7b, 0x0b, 0xb1, 0xf0, 0x0d, 0xdb, 0xf0, 0x60, 0x73, 0xc3, 0x2b, 0x1b, 0x44, 0x8f, 0x4b, 0x73, 0x56, 0x4d, 0x73, 0x10, 0x81, 0x04, 0xe3, 0x42, 0xa6, 0xa3, 0x1c, 0x95, 0xf0, 0x38, 0x44, 0xa6, 0x5a, 0x62, 0xcd, 0x36, 0x72, 0x09, 0x52, 0x7d, 0x5c, 0x4c, 0xc1, 0xc0, 0x19, 0xbb, 0xbf, 0x26, 0x0a, 0xc7, 0x48, 0xc8, 0xaf, 0x76, 0x96, 0x07, 0xb5, 0x5c, 0x45, 0x22, 0x30, 0xc6, 0xb4, 0x08, 0x25, 0x38, 0xae, 0x6a, 0x4b, 0x1a, 0x4a, 0x15, 0x12, 0xae, 0x0f, 0x7f, 0xe5, 0x45, 0x5c, 0x9f, 0xac, 0xb3, 0x07, 0x02, 0x96, 0x00, 0x45, 0x1c, 0x15, 0x60, 0xca, 0xdc, 0x2a, 0x65, 0x31, 0x83, 0xe2, 0x74, 0x9d, 0xb5, 0x21, 0x76, 0xa1, 0xd0, 0x9e, 0xcf, 0x5d, 0x7e, 0x2f, 0x94, 0xea, 0x86, 0x47, 0xf8, 0xf9, 0xe8, 0xbc, 0x08, 0xb6, 0x28, 0xce, 0x99, 0xf3, 0xea, 0x66, 0x7e, 0x82, 0xbf, 0x9b, 0xfe, 0xe2, 0x3f, 0x7a, 0x85, 0x1f, 0x58, 0x07, 0x99, 0xf3, 0xe5, 0x7f, 0x10, 0x31, 0x82, 0xe0, 0x80, 0x63, 0x9f, 0xab, 0xf8, 0xb2, 0xd4, 0xe9, 0xed, 0x07, 0x74, 0x6c, 0x77, 0x70, 0x65, 0x57, 0xbe, 0xc5, 0x2f, 0xe1, 0xae, 0x8b, 0x52, 0x55, 0xf3, 0x18, 0xdd, 0x5d, 0x21, 0xf8, 0x3c, 0x81, 0x32, 0x90, 0x52, 0xeb, 0x36, 0x01, 0xc8, 0x6d, 0x46, 0x50, 0xa4, 0xc5, 0xba, 0xc3, 0x1d, 0x1f, 0x9c, 0x8e, 0xad, 0xdb, 0x5c, 0xae, 0x69, 0x91, 0xc4, 0x16, 0x8e, 0x52, 0x2f, 0x09, 0x5c, 0x31, 0xf6, 0xc7, 0x27, 0x02, 0x2c, 0x6b, 0xab, 0x62, 0x8b, 0x14, 0xa0, 0xf8, 0xad, 0x43, 0x8e, 0xfa, 0x80, 0x84, 0xe3, 0xf2, 0xf4, 0x51, 0x43, 0xc2, 0xf6, 0x33, 0x1f, 0xe5, 0xa2, 0x2a, 0x89, 0xf9, 0xb4, 0x4f, 0x46, 0x7a, 0x40, 0xb8, 0x25, 0xd1, 0xa4, 0x9c, 0x90, 0x8d, 0xba, 0xb7, 0x61, 0xf0, 0x52, 0xf0, 0xf7, 0xad, 0xdf, 0x3a, 0x88, 0xf0, 0x70, 0xb8, 0xb8, 0x9f, 0xe2, 0x24, 0x6b, 0xdf, 0x54, 0x71, 0xd8, 0xdb, 0xdc, 0xaf, 0xe0, 0xc1, 0x78, 0x30, 0x9d, 0x0c, 0x48, 0xe9, 0x3d, 0x09, 0xfa, 0x1a, 0x11, 0x94, 0x85, 0x32, 0xe1, 0x23, 0x1a, 0xed, 0x83, 0x07, 0x57, 0xbf, 0xab, 0xee, 0xbf, 0x75, 0x05, 0xab, 0x67, 0x1a, 0x81, 0x3a, 0xf1, 0x17, 0xef, 0xfe, 0xbe, 0x9f, 0xcb, 0x4e, 0x60, 0x4a, 0x5a, 0x30, 0x4e, 0x00, 0xf6, 0x64, 0xdc, 0x19, 0xa5, 0xa5, 0x6a, 0xc2, 0xf1, 0x2b, 0xdb, 0xa3, 0xf4, 0x74, 0x49, 0xbf, 0xb3, 0x44, 0xf6, 0x9b, 0xad, 0xeb, 0x86, 0xa2, 0xb3, 0xc6, 0x6c, 0xc8, 0xf9, 0x08, 0xa3, 0x6e, 0x6e, 0xba, 0x9e, 0x85, 0x49, 0x01, 0x81, 0xf7, 0xe4, 0xa0, 0x91, 0x42, 0xce, 0xbd, 0xe9, 0x66, 0x1c, 0xe8, 0x70, 0x02, 0xff, 0x59, 0x07, 0xba, 0x9c, 0x79, 0x07, 0xdb, 0x17, 0xa5, 0xea, 0x42, 0xf1, 0x2e, 0x48, 0x7a, 0x95, 0xa4, 0x06, 0x24, 0x2d, 0x54, 0xca, 0x9c, 0xba, 0x0f, 0xb1, 0xd9, 0x64, 0x2d, 0x45, 0x95, 0x0e, 0xd2, 0xa9, 0xae, 0x2e, 0x70, 0x17, 0xcd, 0xdc, 0x8d, 0x8d, 0x45, 0x29, 0xc7, 0xc2, 0x3e, 0xb1, 0x15, 0x5f, 0x12, 0x74, 0x4f, 0x6c, 0xf7, 0xe1, 0xf1, 0x08, 0xdf, 0x34, 0x1c, 0x5e, 0x9c, 0x02, 0xdd, 0xd4, 0x48, 0x12, 0xb2, 0x85, 0xe4, 0x6f, 0x4a, 0xf2, 0x3f, 0xbb, 0x8d, 0xf4, 0x19, 0xc6, 0xdc, 0xf6, 0x89, 0x60, 0x9a, 0x60, 0x9c, 0x6b, 0xeb, 0x56, 0x3f, 0x34, 0xbb, 0xa3, 0x5f, 0x03, 0x03, 0xf0, 0x4e, 0xf0, 0x47, 0x3a, 0x69, 0xf9, 0x64, 0x83, 0xf8, 0x52, 0x88, 0xc7, 0x55, 0xfc, 0x82, 0x31, 0x51, 0x99, 0x3c, 0x8f, 0xd3, 0x7f, 0x85, 0x04, 0xc2, 0x0b, 0x14, 0xfc, 0x25, 0x37, 0xca, 0x65, 0x89, 0x6f, 0x38, 0x1d, 0xa3, 0xa1, 0x61, 0xa6, 0x37, 0x94, 0xc1, 0x21, 0x39, 0x7a, 0x8e, 0x7a, 0x31, 0xc8, 0x3d, 0xe0, 0xe4, 0x45, 0x48, 0x78, 0x30, 0x61, 0x2f, 0x52, 0x38, 0xc9, 0xbd, 0x9c, 0xc1, 0x38, 0x8c, 0x15, 0xdc, 0x90, 0xcb, 0xc5, 0xc6, 0x29, 0x3f, 0xec, 0x0c, 0x69, 0x88, 0x38, 0xf2, 0x95, 0xa6, 0x3a, 0x16, 0xe6, 0xbb, 0x1b, 0x51, 0xe0, 0x12, 0x8b, 0xde, 0xdf, 0x61, 0xfb, 0xbe, 0xf3, 0x4b, 0x0c, 0x5a, 0xed, 0x29, 0x47, 0x6b, 0xba, 0x0a, 0x0e, 0x17, 0xf0, 0xf8, 0xd2, 0x5c, 0xa7, 0x7e, 0x87, 0xb2, 0x8a, 0x67, 0x55, 0xec, 0x2e, 0xc7, 0x91, 0x60, 0xa2, 0x40, 0xeb, 0x47, 0x47, 0x7e, 0xe9, 0x67, 0xe1, 0x04, 0x94, 0xef, 0xef, 0x2b, 0x71, 0xa2, 0x38, 0x67, 0xb2, 0x37, 0xa7, 0xcd, 0xae, 0x00, 0x58, 0xd2, 0x8f, 0xcb, 0xf3, 0x56, 0x4a, 0x06, 0x39, 0xe1, 0xd5, 0x26, 0xdc, 0x2c, 0x94, 0x49, 0x94, 0xe3, 0x14, 0x19, 0x6f, 0xa9, 0xfb, 0xf4, 0x69, 0x5d, 0x3f, 0x4b, 0x3c, 0x9b, 0x97, 0x48, 0x79, 0x86, 0x2f, 0xb4, 0xd8, 0xc5, 0xa0, 0x17, 0xcc, 0xcc, 0x1f, 0x21, 0x5b, 0x5d, 0xf4, 0x48, 0x2d, 0x4e, 0x2f, 0xb3, 0xe3, 0x8c, 0x96, 0x57, 0xaa, 0x60, 0xe1, 0x60, 0x0f, 0xf1, 0x2a, 0xd2, 0x15, 0x0b, 0x9f, 0x70, 0x84, 0x1e, 0x7a, 0xdd, 0x85, 0x8a, 0x33, 0x01, 0x6c, 0x19, 0xf3, 0xae, 0xd5, 0xcd, 0x4d, 0x83, 0xf2, 0xdd, 0x29, 0x11, 0x23, 0xfa, 0x00, 0x3d, 0xc7, 0xd6, 0x4f, 0xe5, 0x53, 0xe7, 0x45, 0xc7, 0xa1, 0x69, 0xbf, 0x9e, 0x8a, 0xa2, 0x77, 0x8d, 0xb6, 0x69, 0x78, 0xc1, 0xb3, 0xe9, 0xd6, 0x53, 0x45, 0xa3, 0x9b, 0x6b, 0xfd, 0xb2, 0x04, 0xab, 0x0d, 0x53, 0xee, 0xcb, 0x5b, 0xa4, 0x8b, 0x80, 0xd4, 0xac, 0x59, 0xa3, 0x03, 0x9c, 0x55, 0x8f, 0xe2, 0x54, 0x6c, 0xcb, 0xf0, 0x29, 0x32, 0xe9, 0x83, 0xe6, 0xd6, 0xad, 0x60, 0x10, 0x56, 0x72, 0x89, 0x6f, 0xef, 0xca, 0x56, 0xc9, 0xd8, 0x65, 0xc7, 0xf1, 0x2f, 0x34, 0x19, 0x01, 0x34, 0xcd, 0x97, 0xe3, 0xb5, 0x12, 0xb3, 0x16, 0xc9, 0x0d, 0x55, 0xae, 0xc1, 0x1f, 0x73, 0x9d, 0x5c, 0x5a, 0xe2, 0x32, 0x3a, 0x2b, 0x6c, 0xdf, 0x93, 0x3c, 0x22, 0x3f, 0x29, 0x98, 0xf3, 0x57, 0x7b, 0x11, 0x7e, 0x1d, 0x3c, 0xdf, 0x25, 0x36, 0x03, 0x89, 0x63, 0x04, 0x44, 0x09, 0x5f, 0xe0, 0x7f, 0x2b, 0xc1, 0xa4, 0xb7, 0x36, 0xc4, 0x6d, 0x26, 0xce, 0x8c, 0x9f, 0x2f, 0x19, 0xbb, 0x29, 0x94, 0x21, 0x3f, 0x0a, 0xe9, 0x79, 0x6d, 0x14, 0x49, 0x24, 0x54, 0xef, 0x47, 0xb2, 0x4b, 0x62, 0x27, 0xac, 0xcd, 0xce, 0x4f, 0x32, 0x87, 0xfb, 0xf8, 0xe3, 0xae, 0x17, 0x29, 0xfd, 0x96, 0xfc, 0xe6, 0xc5, 0x81, 0xb2, 0xa5, 0x2a, 0xb5, 0x35, 0x01, 0xa5, 0xd1, 0x78, 0xb2, 0x63, 0x60, 0xa9, 0xbd, 0xa6, 0xaf, 0xb7, 0xe8, 0x69, 0xdc, 0x12, 0x71, 0x43, 0x30, 0xb2, 0xff, 0x8d, 0xae, 0x5a, 0xd9, 0xc7, 0xec, 0x1e, 0x56, 0x38, 0x22, 0x23, 0x95, 0xd5, 0x81, 0xa6, 0x6d, 0x64, 0xc6, 0x3f, 0xa7, 0xe1, 0x0e, 0x67, 0x6b, 0x21, 0xec, 0x39, 0xf9, 0xb5, 0xb9, 0x75, 0x9a, 0x11, 0x2b, 0xca, 0xd5, 0xee, 0x29, 0x55, 0xe5, 0xec, 0xde, 0x65, 0x6b, 0x7c, 0x0d, 0x81, 0x61, 0xfd, 0xa4, 0xac, 0x4f, 0x25, 0x93, 0xe7, 0xc1, 0xa3, 0xde, 0xf8, 0xf8, 0x02, 0xf1, 0x6a, 0xe0, 0xd1, 0x35, 0xd5, 0x42, 0x01, 0xe0, 0x5f, 0x3b, 0x8e, 0x11, 0x83, 0xed, 0x62, 0x1c, 0x11, 0x74, 0x76, 0x22, 0x76, 0x1b, 0x3a, 0xe6, 0x3e, 0xd0, 0x37, 0xdb, 0xd7, 0xd6, 0xf2, 0x82, 0x98, 0xba, 0x14, 0xf2, 0x01, 0x88, 0xc9, 0xb8, 0x45, 0x3e, 0x66, 0xe2, 0x05, 0x81, 0x4e, 0x57, 0x5f, 0x8f, 0x16, 0x6a, 0x27, 0x75, 0xe7, 0xae, 0x74, 0x82, 0x24, 0x0b, 0x5f, 0xfb, 0x4d, 0x11, 0x07, 0x10, 0x24, 0x8d, 0xd9, 0x0f, 0x0e, 0x5a, 0x0e, 0xd8, 0xbb, 0x7a, 0x74, 0x91, 0x09, 0x65, 0x72, 0x9b, 0x26, 0xa1, 0x46, 0xc4, 0xf5, 0x93, 0x92, 0xbe, 0xb4, 0x95, 0x17, 0xd0, 0xdb, 0x49, 0xc0, 0xcb, 0x47, 0x2c, 0xe2, 0x40, 0x97, 0x6e, 0xc2, 0xf0, 0xd7, 0x01, 0x58, 0x84, 0x5c, 0xf0, 0x52, 0x7e, 0xee, 0xf2, 0x5c, 0x70, 0x2d, 0x3f, 0x9f, 0x6b, 0x2d, 0xa2, 0x87, 0xbb, 0x64, 0xcf, 0xca, 0xd1, 0xc6, 0xf8, 0xa6, 0x81, 0x2e, 0x9b, 0x6a, 0x6e, 0x00, 0x9e, 0x37, 0xc2, 0x0c, 0x9d, 0x08, 0x22, 0xb6, 0x83, 0xf0, 0xe1, 0x54, 0x57, 0xa3, 0x73, 0xd8, 0x59, 0x38, 0x25, 0xaf, 0x4e, 0x2d, 0x0c, 0xe9, 0x18, 0xac, 0x3b, 0x99, 0x89, 0x0c, 0x39, 0x7f, 0x79, 0x9b, 0xb3, 0xe4, 0x16, 0x9b, 0x6d, 0xc6, 0x7c, 0x8a, 0x7e, 0x35, 0x86, 0xa7, 0xbd, 0xfd, 0xe3, 0xb1, 0x77, 0x85, 0x6c, 0xf2, 0x63, 0xf7, 0xb4, 0x7c, 0xd7, 0xa1, 0xe1, 0xb3, 0x3b, 0x9c, 0xbb, 0x0b, 0xbf, 0xab, 0x03, 0x13, 0x49, 0x65, 0x06, 0xb3, 0xb1, 0x97, 0x72, 0xb1, 0x31, 0xe4, 0x67, 0x7a, 0x17, 0xae, 0xd1, 0x20, 0xbd, 0x3a, 0xf6, 0x9f, 0xbb, 0x0e, 0x4b, 0x64, 0x5b, 0x9e, 0x8c, 0x10, 0x4e, 0x28, 0x0b, 0x79, 0x9d, 0xdd, 0x49, 0xf1, 0xe2, 0x41, 0xc3, 0xcc, 0xb7, 0xd4, 0x0e, 0x1c, 0x6f, 0xf2, 0x26, 0xbf, 0x04, 0xf8, 0x04, 0x9c, 0x51, 0xa8, 0x6e, 0x29, 0x81, 0xcf, 0x13, 0x31, 0xc8, 0x24, 0xd7, 0xd4, 0x51, 0x74, 0x6c, 0xcf, 0x77, 0xfc, 0x22, 0xfd, 0x37, 0x17, 0x00, 0x1e, 0xe5, 0x19, 0x13, 0xd8, 0x1f, 0x7a, 0x06, 0xfb, 0x00, 0x37, 0xf3, 0x09, 0x95, 0x75, 0x79, 0xf6, 0x95, 0x67, 0x0f, 0x2c, 0x4c, 0x73, 0x97, 0xd2, 0xd9, 0x90, 0x37, 0x4e, 0x99, 0xf3, 0x64, 0x08, 0xe3, 0xea, 0x3f, 0x71, 0xf6, 0x08, 0x25, 0x45, 0x2f, 0x82, 0x81, 0x0d, 0x80, 0xd9, 0xe5, 0xe7, 0x1d, 0xb9, 0x5a, 0x89, 0x78, 0x22, 0xf4, 0x84, 0x70, 0xc5, 0xa9, 0xc6, 0xc5, 0xb1, 0x62, 0x63, 0xd0, 0x2e, 0x53, 0x95, 0x71, 0xe9, 0x88, 0x01, 0x48, 0x52, 0xc1, 0x3b, 0x28, 0x43, 0x80, 0x8d, 0xc8, 0xe2, 0x60, 0xf4, 0xbc, 0xc8, 0xa8, 0x6c, 0xa4, 0x63, 0x20, 0x6d, 0xa4, 0x98, 0x24, 0xb6, 0x14, 0xad, 0xf6, 0x49, 0x78, 0x67, 0x59, 0xb7, 0xb2, 0x6f, 0x5b, 0x9d, 0x76, 0xfa, 0x72, 0x6f, 0xff, 0xa9, 0xca, 0x74, 0x00, 0xae, 0xde, 0x12, 0xde, 0x31, 0x46, 0x4c, 0x1c, 0xf2, 0xcf, 0x89, 0x17, 0x2f, 0xd1, 0x97, 0xf3, 0xc8, 0xbd, 0xef, 0xd5, 0xa1, 0xf6, 0x3b, 0x52, 0x48, 0xe2, 0x15, 0x28, 0xd8, 0x40, 0x12, 0x2c, 0x1d, 0xbc, 0xff, 0x84, 0xf8, 0xc0, 0x6a, 0x16, 0x05, 0x8e, 0x65, 0x40, 0x7c, 0x8c, 0x86, 0xca, 0x55, 0xde, 0x32, 0x19, 0xb0, 0x3a, 0x1b, 0xa5, 0x73, 0xf8, 0x08, 0xad, 0x35, 0x69, 0xd5, 0x29, 0x5b, 0x6a, 0xba, 0x00, 0x80, 0x39, 0xd0, 0x7b, 0x1b, 0x87, 0xd0, 0xf9, 0x5b, 0xce, 0x1e, 0xe5, 0x56, 0xe4, 0x07, 0xe6, 0x63, 0xd1, 0x47, 0x55, 0xc4, 0xde, 0xcf, 0xf4, 0x89, 0xee, 0xc5, 0xdd, 0xb0, 0x11, 0xcb, 0xb8, 0x91, 0x57, 0x84, 0x31, 0x7a, 0xe2, 0x54, 0xaa, 0x96, 0x3f, 0x68, 0x2c, 0x13, 0xf7, 0xf7, 0xa4, 0x83, 0x60, 0xc7, 0x4c, 0x83, 0xb9, 0xf2, 0x67, 0x9b, 0x76, 0xea, 0x31, 0x66, 0xd9, 0xbb, 0x16, 0xf3, 0xc2, 0x90, 0x22, 0x6a, 0xc8, 0x79, 0xb9, 0xf3, 0x88, 0x6b, 0x88, 0xd3, 0x3d, 0x89, 0xbb, 0xd8, 0x92, 0xa1, 0x70, 0xf8, 0xb4, 0xfa, 0x6c, 0x35, 0xaa, 0x4d, 0x0d, 0xc4, 0xe9, 0x11, 0x80, 0x6d, 0x23, 0xfb, 0x34, 0x35, 0x61, 0xc6, 0x8f, 0x3b, 0x51, 0x30, 0xdf, 0xe0, 0xe1, 0x45, 0x93, 0x2a, 0x0c, 0xdf, 0xab, 0x6b, 0xf4, 0x6e, 0x6d, 0x1d, 0x32, 0xf5, 0x5a, 0x11, 0x6a, 0x55, 0x60, 0xc9, 0x22, 0xce, 0x51, 0x22, 0xd4, 0xc3, 0x94, 0x35, 0x41, 0xbd, 0x1b, 0x80, 0x09, 0xb3, 0x94, 0x41, 0x79, 0x89, 0xe4, 0x23, 0xa4, 0xd6, 0xd1, 0x1c, 0xb5, 0xea, 0xfe, 0x96, 0x83, 0x10, 0x1d, 0xcd, 0x66, 0x10, 0x60, 0x78, 0x4a, 0xf8, 0x30, 0xab, 0x01, 0x1c, 0x22, 0xfc, 0xde, 0x5c, 0x27, 0xe5, 0x7f, 0xa5, 0x03, 0x69, 0xea, 0xbb, 0x00, 0xfa, 0xdc, 0x35, 0xe3, 0x9b, 0x5d, 0xc9, 0x1f, 0x42, 0x98, 0xc9, 0x49, 0x80, 0xea, 0xee, 0xcc, 0x63, 0x39, 0x55, 0xde, 0x9c, 0x87, 0xc7, 0xb2, 0xdd, 0xc6, 0x3d, 0xef, 0x85, 0xee, 0xa3, 0x62, 0x7f, 0x4e, 0xdd, 0xef, 0x67, 0x1f, 0x08, 0xce, 0xef, 0x5f, 0x02, 0xf4, 0x82, 0xdd, 0x2c, 0xce, 0x27, 0x90, 0x6e, 0x35, 0xa7, 0x2c, 0x7c, 0x9f, 0xf2, 0xf7, 0x58, 0x92, 0xbf, 0xd9, 0x19, 0x5f, 0x73, 0xb3, 0xea, 0x0c, 0x44, 0xf2, 0x55, 0x92, 0x9e, 0x64, 0xc2, 0x49, 0xc5, 0x4a, 0x3a, 0xa0, 0xbd, 0xae, 0x71, 0x11, 0x67, 0xf7, 0x04, 0x54, 0xec, 0xba, 0xff, 0xd3, 0x5e, 0xd3, 0xa2, 0x5f, 0x9d, 0xb5, 0x65, 0x21, 0x78, 0xfe, 0x39, 0xd3, 0x15, 0x4f, 0x11, 0x30, 0x93, 0x5a, 0xa1, 0xa8, 0xed, 0x3c, 0x65, 0x59, 0x22, 0x0e, 0xe6, 0x3b, 0x93, 0xb6, 0x39, 0x9a, 0xac, 0x03, 0xc8, 0xca, 0xc6, 0xfa, 0x55, 0x16, 0x4c, 0x6a, 0x3b, 0xf9, 0x1d, 0xc7, 0xf7, 0x91, 0x32, 0x34, 0xe8, 0x50, 0x81, 0xe2, 0x53, 0xf5, 0x21, 0x99, 0xaa, 0xba, 0xae, 0x94, 0x0e, 0xcf, 0xef, 0x92, 0x12, 0x08, 0xb6, 0x2a, 0xc2, 0xd3, 0x08, 0x5f, 0xe4, 0x6c, 0x7e, 0x74, 0x7d, 0x54, 0xeb, 0x02, 0x97, 0xff, 0x3f, 0x47, 0x42, 0xcc, 0xac, 0xc1, 0xd9, 0x3b, 0x07, 0xfb, 0x86, 0x5b, 0x70, 0xa8, 0x08, 0x81, 0x35, 0xee, 0xb4, 0x3f, 0xf4, 0x04, 0xba, 0x94, 0x00, 0xff, 0xaa, 0x61, 0x06, 0xe9, 0x37, 0x1c, 0xf1, 0x14, 0x3a, 0xc8, 0x0a, 0xad, 0xfa, 0x25, 0x64, 0x94, 0xaa, 0x24, 0x77, 0x6b, 0x33, 0x9d, 0x0b, 0xee, 0x34, 0x44, 0x58, 0x82, 0x47, 0xda, 0x6b, 0x10, 0x87, 0xa0, 0xcb, 0x13, 0x4f, 0x11, 0x5d, 0xf0, 0x44, 0xd0, 0x85, 0x87, 0x95, 0xe0, 0x8e, 0x07, 0x81, 0x13, 0x4c, 0x06, 0x1a, 0xc5, 0xff, 0xd1, 0x49, 0xc9, 0x7b, 0x00, 0x13, 0xa4, 0x86, 0x4e, 0x1a, 0xf9, 0x82, 0xa8, 0x67, 0x45, 0x4c, 0x84, 0x66, 0xcd, 0x63, 0x74, 0x32, 0xd4, 0x4d, 0xfb, 0x13, 0x10, 0x36, 0x9f, 0x46, 0x5f, 0xdb, 0x3f, 0xfc, 0xb7, 0xa6, 0xa7, 0xa4, 0x5b, 0x1a, 0x62, 0x6d, 0x55, 0x72, 0xcf, 0x07, 0x20, 0x85, 0x78, 0xaa, 0xa5, 0xed, 0x9e, 0x5a, 0x69, 0x68, 0x19, 0x69, 0x04, 0x7e, 0x5f, 0x3d, 0xd5, 0x65, 0xe2, 0x54, 0xf4, 0x21, 0x9f, 0x84, 0x68, 0xef, 0xf3, 0x88, 0x9a, 0xe4, 0xb1, 0xb8, 0x0a, 0xd2, 0x73, 0x18, 0x41, 0x6b, 0x2d, 0x94, 0x07, 0xa9, 0x08, 0x8a, 0xd5, 0x6d, 0x6d, 0x89, 0x8d, 0x66, 0x5f, 0x59, 0x69, 0x34, 0x0f, 0x3b, 0x31, 0xcd, 0xaa, 0x71, 0xb2, 0x20, 0x76, 0x01, 0x6b, 0xf9, 0x1d, 0xb7, 0x89, 0x25, 0x49, 0x69, 0x16, 0xd6, 0x70, 0x7e, 0x6d, 0x49, 0xf2, 0xb1, 0xf1, 0xa5, 0x61, 0x13, 0xfe, 0x27, 0x1f, 0x4f, 0x20, 0x7c, 0x2f, 0x32, 0x83, 0x6e, 0x45, 0x6b, 0xab, 0xc3, 0x1f, 0x8f, 0x65, 0x62, 0x18, 0x60, 0xfe, 0xb8, 0xfb, 0x4e, 0xb2, 0x5a, 0x15, 0x3e, 0x67, 0xec, 0x8e, 0x8b, 0x9c, 0x41, 0xf9, 0x4a, 0x9c, 0xc3, 0x29, 0xd3, 0xf7, 0x16, 0x46, 0x7d, 0x32, 0xf8, 0x21, 0xa8, 0xbe, 0x6c, 0xc5, 0x01, 0x27, 0x17, 0x4f, 0x01, 0x8e, 0xea, 0xff, 0xb7, 0x59, 0x01, 0x8e, 0xc8, 0x29, 0xcb, 0xc2, 0xb4, 0x0c, 0x6c, 0x41, 0x5a, 0xf5, 0x5f, 0xa3, 0xbf, 0x69, 0x60, 0xca, 0x0b, 0x7a, 0x89, 0x76, 0xd4, 0xf9, 0xbb, 0x14, 0x9f, 0xe8, 0x3f, 0xd7, 0xa4, 0x2e, 0xad, 0x0a, 0xd2, 0x8e, 0x0d, 0xa5, 0x13, 0xda, 0x3d, 0x1e, 0xd1, 0x64, 0x93, 0x81, 0xb9, 0xb6, 0xc2, 0xc3, 0xbf, 0x83, 0x02, 0x54, 0x62, 0xdd, 0x6b, 0xf3, 0x31, 0xa7, 0xa2, 0xc6, 0x8e, 0x4e, 0xb8, 0xaa, 0xb2, 0xb4, 0x4f, 0xc8, 0xf1, 0x6d, 0xff, 0x69, 0x3f, 0x2e, 0xf8, 0x0b, 0xf4, 0x82, 0xe8, 0xb3, 0xcc, 0xbf, 0x1f, 0x86, 0x32, 0x39, 0xf1, 0x93, 0xbe, 0xb5, 0x5b, 0xf4, 0xfc, 0x21, 0xea, 0x15, 0x6f, 0x82, 0xd9, 0x53, 0xd5, 0x2d, 0x79, 0xc9, 0xad, 0x3a, 0xd6, 0x66, 0xf7, 0x36, 0x98, 0x43, 0x3b, 0x18, 0x27, 0x34, 0xcc, 0x76, 0x13, 0x9e, 0x4e, 0xf9, 0xb2, 0x88, 0x76, 0x0f, 0x0b, 0xf4, 0x11, 0xdf, 0xf2, 0x6f, 0x48, 0x82, 0x75, 0xe7, 0x22, 0x70, 0x77, 0xbd, 0x4a, 0x38, 0x9b, 0x1b, 0x13, 0x75, 0x64, 0x88, 0xb9, 0xfd, 0x9a, 0xb9, 0xea, 0x5b, 0xef, 0xaa, 0x84, 0x80, 0xe2, 0xee, 0xa1, 0xb5, 0xe4, 0x44, 0xd1, 0xd4, 0xb9, 0x6a, 0xa6, 0xb8, 0x22, 0x36, 0x76, 0xf2, 0xb9, 0xe2, 0x5c, 0xbd, 0x1c, 0xa8, 0x80, 0x35, 0x4d, 0x8e, 0x98, 0xc3, 0x59, 0x84, 0xaf, 0xdc, 0x38, 0xac, 0x25, 0xeb, 0xf5, 0xf9, 0xf8, 0x8b, 0x0f, 0xfb, 0x41, 0xfa, 0x1e, 0xf9, 0x02, 0xca, 0xb9, 0x41, 0x1e, 0xda, 0x98, 0xbc, 0xa9, 0x85, 0xf6, 0xc5, 0x62, 0x19, 0x39, 0x3b, 0x7e, 0x8b, 0xd5, 0xd5, 0xa8, 0x69, 0x6e, 0xb6, 0x45, 0x0f, 0x3d, 0x42, 0xfc, 0x1e, 0xb4, 0x2f, 0x76, 0x2a, 0x65, 0xdf, 0x62, 0xb3, 0x20, 0xed, 0xbd, 0x57, 0x5b, 0x06, 0x50, 0x45, 0xd7, 0xfa, 0x7a, 0xf5, 0x81, 0x12, 0x2f, 0x17, 0x97, 0xa5, 0x41, 0xc9, 0x0b, 0xe6, 0xde, 0x0c, 0x2c, 0x00, 0x5b, 0x79, 0x83, 0x65, 0x2f, 0x30, 0xfb, 0x62, 0x43, 0x12, 0x46, 0xf8, 0x69, 0x30, 0x7b, 0xe7, 0x29, 0x82, 0x04, 0x0b, 0xc4, 0xdd, 0xb7, 0xeb, 0x73, 0x1f, 0x43, 0x90, 0xf0, 0xad, 0xce, 0x93, 0x37, 0x1f, 0xdc, 0x7a, 0x8e, 0x39, 0x73, 0x45, 0xc3, 0x1d, 0x7d, 0x43, 0xb5, 0xc0, 0x6d, 0x2a, 0x15, 0x9b, 0x25, 0x67, 0x6e, 0xa3, 0x17, 0xb3, 0x63, 0x7a, 0xab, 0xe7, 0x39, 0xe7, 0xe1, 0x11, 0x95, 0x84, 0x38, 0xc7, 0x86, 0xb6, 0xce, 0xbb, 0xc5, 0xe2, 0xc8, 0x90, 0x3c, 0xde, 0xf4, 0xec, 0xc6, 0xa6, 0xad, 0xcf, 0x36, 0x51, 0x00, 0x23, 0x9a, 0x43, 0x0d, 0x94, 0xc1, 0xa3, 0xaf, 0xa1, 0xfa, 0x10, 0x5f, 0xf3, 0x1f, 0x8f, 0x55, 0xee, 0xd2, 0xc8, 0xf1, 0x87, 0x07, 0x73, 0x5a, 0x55, 0xc3, 0x0d, 0x65, 0xea, 0x22, 0xcf, 0xb8, 0x63, 0x9f, 0xe0, 0x2f, 0x3e, 0x90, 0xca, 0x7e, 0x6c, 0xf0, 0x2b, 0x18, 0xa7, 0x61, 0xad, 0x50, 0x06, 0x71, 0x37, 0xbe, 0xcf, 0x1d, 0x65, 0xe5, 0x8c, 0x94, 0x36, 0x12, 0x61, 0x3d, 0x05, 0x87, 0x9c, 0xfa, 0xbb ],
+const [ 0xc8, 0xc1, 0x07, 0x93, 0x0a, 0xc3, 0xec, 0x65, 0x4f, 0x04, 0x39, 0x92, 0xcf, 0xae, 0xff, 0x31, 0x55, 0x2d, 0x8a, 0xb7, 0x96, 0x37, 0x4b, 0x18, 0xc1, 0x09, 0x16, 0x2f, 0x57, 0xf4, 0x8e, 0x60, 0x3d, 0x19, 0xdd, 0x7c, 0x10, 0x71, 0xa8, 0xe4, 0xb8, 0x10, 0x41, 0xf2, 0x40, 0xaa, 0x1f, 0x94, 0xe4, 0x56, 0x8c, 0x3a, 0x6c, 0x92, 0x9e, 0xf3, 0xb9, 0x87, 0x68, 0xd2, 0x9e, 0x8f, 0x71, 0x97, 0xf1, 0xf5, 0x66, 0x8b, 0xe1, 0xfc, 0x0b, 0xac, 0x89, 0x22, 0x77, 0x0a, 0xc6, 0xa5, 0x81, 0x71, 0x46, 0x47, 0x76, 0x48, 0xe2, 0x4e, 0x0d, 0xb9, 0x2e, 0xd0, 0x9c, 0x13, 0x4e, 0x2d, 0x8b, 0x6c, 0x0b, 0xdd, 0x09, 0x8a, 0x26, 0x6c, 0xff, 0x04, 0xeb, 0xc2, 0x42, 0xa4, 0x0a, 0xa8, 0x0d, 0x10, 0xa3, 0x88, 0xae, 0xa9, 0xa0, 0x74, 0x7f, 0xb4, 0x47, 0x6a, 0x18, 0xb8, 0x0f, 0xd7, 0xc3, 0x26, 0xb3, 0x59, 0x31, 0x3f, 0x86, 0xc9, 0x6b, 0x33, 0x06, 0x79, 0x0a, 0x86, 0xb3, 0xba, 0xab, 0xb8, 0x22, 0xa2, 0x9e, 0x25, 0x4d, 0x0c, 0xde, 0x2a, 0x2d, 0xdf, 0x46, 0x89, 0x8b, 0x94, 0x01, 0x0f, 0x13, 0xf2, 0x43, 0x74, 0xaa, 0x1c, 0x36, 0x82, 0x01, 0xce, 0x38, 0x79, 0x6a, 0xe4, 0x43, 0xb3, 0xeb, 0x1c, 0xac, 0x84, 0x91, 0x1c, 0x11, 0x64, 0x07, 0xb7, 0x8d, 0x50, 0x67, 0x6c, 0x2d, 0x6d, 0x50, 0x2f, 0xa8, 0xef, 0x39, 0x6d, 0x4a, 0x39, 0x05, 0x4a, 0x32, 0x45, 0xd7, 0x2d, 0xbd, 0x47, 0x27, 0x7e, 0x42, 0x8d, 0x16, 0xae, 0x00, 0xaa, 0xfe, 0x78, 0x54, 0xd3, 0x4e, 0x67, 0x30, 0x89, 0x95, 0x99, 0xc8, 0x79, 0xdc, 0xc2, 0x8e, 0xa0, 0x39, 0x73, 0x61, 0xb2, 0xa1, 0x9d, 0x01, 0xbd, 0xfe, 0x51, 0xc7, 0x09, 0x81, 0xc9, 0x93, 0x44, 0x3a, 0xac, 0x05, 0xdb, 0xe6, 0x8e, 0xf0, 0xab, 0x08, 0xb6, 0x0b, 0xd9, 0x3b, 0x25, 0xea, 0xfe, 0xc6, 0xd4, 0x2d, 0x88, 0x71, 0x3c, 0xf8, 0x5d, 0x97, 0x1b, 0xa3, 0xc1, 0x7d, 0x76, 0xb2, 0x79, 0xe2, 0xda, 0x07, 0x30, 0xd7, 0xe8, 0x56, 0x1b, 0xd1, 0x11, 0xda, 0xd9, 0xfd, 0x9d, 0x46, 0x9d, 0xd3, 0xf2, 0xff, 0x8e, 0xee, 0x13, 0x88, 0x6e, 0x1b, 0x67, 0x3d, 0x7a, 0xb0, 0xbc, 0x45, 0x92, 0x1f, 0x8b, 0xc2, 0x9a, 0xca, 0x7d, 0x4a, 0x20, 0x19, 0x2f, 0x9b, 0x3f, 0xca, 0x32, 0x8a, 0xc3, 0x89, 0x57, 0x3d, 0x8d, 0xc1, 0x29, 0x9a, 0x3a, 0xb1, 0xba, 0xff, 0xff, 0xc2, 0xa3, 0x34, 0xd7, 0x18, 0x46, 0x9e, 0xe1, 0x67, 0x56, 0xb5, 0x03, 0x08, 0x9a, 0xb8, 0xd4, 0x4c, 0xed, 0x9f, 0xb9, 0x10, 0x8a, 0x51, 0x4e, 0x91, 0x86, 0x17, 0x07, 0x82, 0x9e, 0x50, 0x17, 0x5c, 0x33, 0x67, 0x90, 0xf6, 0x93, 0x03, 0xcc, 0x55, 0x7a, 0x7d, 0x0d, 0xc5, 0xd9, 0x97, 0x60, 0x28, 0xd5, 0x6b, 0xc7, 0x8f, 0x13, 0xa1, 0x96, 0x07, 0x33, 0xe5, 0x1e, 0xb6, 0x9a, 0x98, 0x89, 0x26, 0x75, 0xc6, 0x05, 0xe0, 0xfa, 0x59, 0x25, 0x3d, 0xf1, 0x8c, 0x83, 0x79, 0x74, 0xa2, 0xab, 0x09, 0xf3, 0xd7, 0x34, 0x2e, 0x7b, 0x97, 0x30, 0xcb, 0x37, 0xee, 0xc7, 0x74, 0x37, 0x40, 0x1e, 0xc7, 0x70, 0x3a, 0x7e, 0xff, 0x04, 0x08, 0xb2, 0xc6, 0xc4, 0xc8, 0xb0, 0x4b, 0xf3, 0x3f, 0x7c, 0x95, 0x4d, 0xcb, 0x4a, 0x17, 0x48, 0x99, 0xe3, 0x84, 0x9a, 0x18, 0x49, 0xe4, 0xfb, 0xae, 0x9e, 0xe8, 0x2c, 0xa9, 0x42, 0x7a, 0x38, 0x78, 0x3c, 0x99, 0xfa, 0x1b, 0xdb, 0x64, 0xdf, 0xd8, 0x9c, 0x74, 0xee, 0x30, 0x4f, 0x6f, 0x05, 0x11, 0x76, 0xda, 0x65, 0x4d, 0xee, 0x2f, 0x70, 0x4b, 0xd1, 0x30, 0xb2, 0xfd, 0x9a, 0x7a, 0x1f, 0x11, 0x8a, 0x5d, 0x9b, 0x6c, 0x4b, 0xeb, 0xc0, 0xd4, 0xd4, 0x4f, 0xdb, 0xec, 0x8c, 0x61, 0x37, 0x66, 0xb2, 0x77, 0x9f, 0x74, 0xfc, 0x7d, 0x1e, 0x7f, 0x7e, 0x48, 0x09, 0x1c, 0xce, 0x27, 0x3f, 0x3c, 0x66, 0xbb, 0xb0, 0xa2, 0x49, 0x09, 0x1c, 0x9b, 0xea, 0xce, 0x1d, 0xe9, 0x49, 0x12, 0x68, 0x00, 0x5f, 0x00, 0x50, 0x75, 0xbc, 0xf5, 0x8c, 0xb3, 0x6f, 0xd7, 0x39, 0xf0, 0x26, 0xa8, 0x23, 0x5f, 0x96, 0x5b, 0x40, 0xa7, 0x1d, 0xe6, 0x7d, 0x95, 0xa6, 0x98, 0xbd, 0x0d, 0xce, 0xad, 0x1f, 0x47, 0x45, 0x20, 0x80, 0x38, 0x76, 0xc0, 0x42, 0x4d, 0x6a, 0x86, 0x4b, 0x5f, 0xe9, 0x26, 0x50, 0xe4, 0xe3, 0xe4, 0x53, 0x62, 0x0f, 0xa9, 0x6a, 0x2a, 0xd2, 0x56, 0xc3, 0x42, 0x62, 0x58, 0xe5, 0xa3, 0x2b, 0x7d, 0x38, 0xa4, 0x72, 0x05, 0xc8, 0xb7, 0x38, 0xfd, 0x46, 0x53, 0x61, 0xc8, 0x50, 0x31, 0x15, 0xff, 0xf1, 0xbb, 0x67, 0x7b, 0x6c, 0xc2, 0x34, 0xaf, 0x35, 0x6f, 0x4e, 0x3b, 0x41, 0x7c, 0xda, 0xbf, 0x7f, 0xa3, 0xf7, 0xed, 0xa7, 0x57, 0xa1, 0xe3, 0x32, 0xb3, 0xd4, 0xb7, 0xa9, 0xb0, 0xf4, 0x53, 0x23, 0x9a, 0x6c, 0x83, 0x0a, 0xc5, 0x96, 0x4c, 0x1d, 0x7c, 0xdb, 0x80, 0xbb, 0x3a, 0x1b, 0x8f, 0x5e, 0x1d, 0x4e, 0xa0, 0x66, 0x97, 0x6c, 0xe0, 0x18, 0x67, 0x8b, 0x1a, 0xe6, 0xc7, 0x47, 0x89, 0xf0, 0xe7, 0x67, 0xea, 0xcc, 0x9b, 0xbe, 0xd4, 0x82, 0x50, 0x4e, 0x4c, 0xdb, 0x45, 0xb4, 0x95, 0xdc, 0xf8, 0xc0, 0x45, 0x8d, 0xde, 0x63, 0x9e, 0xff, 0x56, 0xce, 0x1a, 0x8c, 0xe0, 0xd8, 0x48, 0x61, 0x8a, 0xa0, 0xd7, 0x3a, 0xac, 0x74, 0xf0, 0x6d, 0xd5, 0xf2, 0xca, 0x2a, 0x05, 0x6d, 0x78, 0x01, 0x1d, 0x93, 0x05, 0xa4, 0x93, 0x4c, 0xc2, 0xef, 0x6a, 0xe5, 0xdf, 0x25, 0x62, 0x6d, 0x39, 0x7d, 0x6c, 0x5f, 0x73, 0xdd, 0x60, 0x82, 0x48, 0xe5, 0xf2, 0x0e, 0x1f, 0x2f, 0xe3, 0x10, 0xe0, 0xd5, 0x74, 0x0f, 0x07, 0x34, 0x20, 0xf0, 0xf7, 0xf0, 0x8a, 0x17, 0x90, 0x39, 0xb5, 0xcf, 0x03, 0x4c, 0x73, 0xec, 0xe5, 0x3c, 0x20, 0xaf, 0x83, 0xf2, 0x8f, 0xe9, 0x76, 0x72, 0x45, 0x63, 0x77, 0x61, 0xe5, 0x7e, 0x74, 0xc4, 0xec, 0x17, 0xe3, 0x0b, 0x9e, 0xad, 0x56, 0x4e, 0x41, 0xc6, 0x4f, 0xd6, 0x88, 0x8e, 0x56, 0xdf, 0x52, 0xc2, 0x4a, 0x9c, 0x95, 0xcc, 0xf5, 0x7c, 0x94, 0x30, 0xe2, 0xac, 0x59, 0x26, 0x73, 0xdd, 0x5f, 0x88, 0x2e, 0x47, 0x8f, 0xef, 0x58, 0xee, 0x6d, 0x1a, 0xc5, 0x24, 0x94, 0x8f, 0xee, 0x4f, 0x60, 0x84, 0x44, 0xec, 0xea, 0xff, 0xc4, 0xd4, 0x39, 0x3d, 0xcc, 0xbe, 0xb6, 0x51, 0x2d, 0x06, 0xe1, 0x0d, 0x81, 0xad, 0x43, 0x25, 0xbf, 0xa0, 0xa3, 0x92, 0x0c, 0x3d, 0x7d, 0x35, 0xd4, 0x13, 0xb0, 0xbd, 0x1a, 0xe9, 0x77, 0xca, 0x0c, 0x02, 0x9a, 0x52, 0xdb, 0xa0, 0xe6, 0x45, 0xc9, 0xc7, 0xda, 0x6c, 0x84, 0x43, 0xa3, 0x97, 0xb2, 0xed, 0x4b, 0xf7, 0xcd, 0x29, 0x2d, 0xc9, 0x31, 0xb3, 0xac, 0x34, 0x73, 0x9c, 0x24, 0x75, 0xf5, 0x8f, 0x21, 0x39, 0xb7, 0x59, 0xcf, 0x4a, 0x70, 0xa8, 0xb2, 0x6e, 0xde, 0x13, 0x97, 0x8d, 0x5a, 0x5b, 0xcb, 0x11, 0xaf, 0xf1, 0x8a, 0x92, 0x2c, 0xb8, 0xba, 0xb3, 0xf8, 0x0b, 0xda, 0x47, 0xa6, 0x02, 0x35, 0xb9, 0x09, 0xf1, 0x5b, 0xaa, 0x4a, 0x32, 0xd1, 0xdb, 0x37, 0x25, 0x08, 0x4e, 0xde, 0x74, 0x8c, 0xa8, 0x5b, 0x9c, 0x7e, 0xda, 0xee, 0xa9, 0x44, 0x00, 0x51, 0x40, 0x7f, 0x89, 0x48, 0xe3, 0x3d, 0x99, 0x79, 0x71, 0x71, 0xab, 0x7e, 0xec, 0xa0, 0x7b, 0x39, 0x7f, 0xdc, 0x23, 0x67, 0xc0, 0xf6, 0x84, 0x78, 0x32, 0xf0, 0xe7, 0x9f, 0x0e, 0xb1, 0xe4, 0x25, 0x43, 0xfc, 0x84, 0x02, 0xbb, 0xa3, 0xa2, 0xae, 0xe0, 0xf8, 0x97, 0x35, 0x5f, 0x85, 0x16, 0x8a, 0x2b, 0xfd, 0x54, 0x1d, 0xc6, 0x72, 0x6c, 0xaf, 0xbc, 0xc7, 0x03, 0x65, 0x70, 0x69, 0x27, 0x1c, 0x1a, 0x3a, 0x7d, 0xfd, 0x11, 0xce, 0x9c, 0x51, 0x46, 0xda, 0xb4, 0x96, 0x11, 0xe9, 0x73, 0xd2, 0x31, 0x51, 0x29, 0x27, 0x0e, 0x66, 0x2a, 0xa8, 0x40, 0xed, 0x74, 0x6b, 0x55, 0xd4, 0x91, 0xdf, 0xcf, 0x20, 0xbf, 0x60, 0x6d, 0x26, 0x4f, 0x09, 0xac, 0xfe, 0x4b, 0xca, 0x8c, 0x35, 0x5b, 0xba, 0x97, 0xc2, 0xe9, 0xae, 0x20, 0x3b, 0x84, 0x0a, 0xc9, 0x49, 0x82, 0xd7, 0x48, 0x5a, 0xea, 0x16, 0x6a, 0x95, 0x91, 0x54, 0x57, 0x13, 0x82, 0x7f, 0x19, 0x4c, 0xa3, 0xf8, 0x58, 0xcf, 0x96, 0xe9, 0x67, 0x37, 0xde, 0xd9, 0x85, 0x5a, 0x43, 0x7e, 0x5c, 0xc3, 0x77, 0xd2, 0xce, 0x63, 0xf9, 0x69, 0xf1, 0x83, 0x3a, 0x01, 0x58, 0xfd, 0xff, 0x5b, 0x95, 0xac, 0x06, 0x49, 0xfb, 0x21, 0xec, 0x09, 0xa9, 0x97, 0x4e, 0xd1, 0xc4, 0x29, 0x2f, 0xab, 0x03, 0x43, 0x99, 0x83, 0x71, 0x57, 0x87, 0x7e, 0x6e, 0xd1, 0x03, 0x8e, 0xf7, 0x4c, 0x8c, 0x44, 0x28, 0x06, 0xba, 0xe5, 0xff, 0x91, 0x25, 0xbf, 0x63, 0xcc, 0x82, 0xbd, 0x65, 0x12, 0x0f, 0x3a, 0xc5, 0xb1, 0x32, 0x13, 0xb8, 0x9e, 0x5c, 0x00, 0xe8, 0x67, 0x34, 0x24, 0xbd, 0x68, 0xf2, 0xe2, 0xdb, 0x42, 0x08, 0xf3, 0xec, 0x89, 0x08, 0xb5, 0x9f, 0xbd, 0xc2, 0xc6, 0xf0, 0x7c, 0xac, 0xd2, 0xab, 0xf5, 0x88, 0xa9, 0x2b, 0xa0, 0x40, 0x95, 0x68, 0x2d, 0x15, 0xea, 0x31, 0xba, 0xf8, 0xde, 0xb5, 0x48, 0x38, 0x9b, 0x48, 0x70, 0x5e, 0x93, 0x64, 0x52, 0x56, 0x14, 0xee, 0xcf, 0xcf, 0x1c, 0xbb, 0xf8, 0xe3, 0x6e, 0x53, 0xc5, 0xfb, 0xe5, 0xf5, 0x0b, 0xed, 0x09, 0xdb, 0xa8, 0x68, 0xe0, 0xbe, 0x00, 0x92, 0x07, 0x9d, 0xae, 0xef, 0x00, 0xbb, 0x73, 0x85, 0xce, 0xe7, 0x72, 0x3e, 0xbf, 0xff, 0xa0, 0x8d, 0x8a, 0xb7, 0x76, 0x54, 0x99, 0x97, 0xe9, 0x06, 0xa8, 0x43, 0x9b, 0x09, 0x8f, 0xff, 0x53, 0x5e, 0x5c, 0x72, 0xab, 0x83, 0xa5, 0xaa, 0x08, 0x98, 0x1d, 0x61, 0xcf, 0xc2, 0x64, 0x7f, 0xd6, 0xcd, 0x24, 0xe0, 0x19, 0x15, 0x59, 0x56, 0xaf, 0xa6, 0xf0, 0xf2, 0xfc, 0xa2, 0x94, 0x7f, 0x27, 0xe3, 0xc5, 0x50, 0xce, 0xe2, 0x2a, 0x3c, 0xf9, 0xd7, 0x28, 0xe6, 0x4d, 0x22, 0xb3, 0x42, 0x83, 0xea, 0x64, 0x54, 0x18, 0x04, 0xcc, 0x3b, 0x45, 0x16, 0x09, 0x6f, 0x31, 0xfc, 0x96, 0x47, 0x66, 0x6a, 0x68, 0xbe, 0x81, 0xd3, 0x36, 0x76, 0x2e, 0x8a, 0x18, 0xfd, 0x54, 0x28, 0x53, 0x50, 0x8d, 0x2d, 0x73, 0x9d, 0xd9, 0xea, 0x9b, 0x4d, 0x93, 0x9e, 0x1a, 0x42, 0xa4, 0xdf, 0x3e, 0x5d, 0xf6, 0x3b, 0x6d, 0x44, 0x2c, 0x20, 0x71, 0x62, 0x90, 0xf9, 0x14, 0x2f, 0x4c, 0x9a, 0xed, 0xb1, 0xde, 0xde, 0x79, 0x43, 0xc6, 0x8e, 0x6e, 0x95, 0x81, 0x85, 0x4b, 0xf4, 0xbb, 0x12, 0x34, 0xcb, 0xc1, 0x9e, 0xfd, 0x6a, 0x35, 0x8f, 0x85, 0x07, 0x05, 0x6c, 0x45, 0x02, 0x9d, 0x41, 0x28, 0x6e, 0x5c, 0x45, 0x9d, 0xcc, 0x45, 0xba, 0xeb, 0x19, 0xf8, 0x15, 0xc6, 0x0c, 0xe0, 0x5f, 0x1f, 0x99, 0xad, 0xdb, 0x40, 0xb9, 0x05, 0xe9, 0x17, 0x6d, 0x76, 0x2a, 0xd2, 0x00, 0xb0, 0xe5, 0xad, 0x8d, 0xf1, 0xa9, 0x08, 0xc2, 0xc0, 0x34, 0xbd, 0xe3, 0xde, 0x94, 0xb0, 0x12, 0x7a, 0x8c, 0xa8, 0xcd, 0xa4, 0x39, 0x5d, 0xb8, 0x04, 0xf5, 0xd2, 0x9d, 0xcc, 0x7c, 0xe4, 0xb1, 0xeb, 0x4e, 0x23, 0x19, 0x84, 0x54, 0xe2, 0xac, 0x9e, 0xc5, 0x8a, 0xfb, 0x1d, 0x4b, 0x34, 0x8e, 0xf1, 0x62, 0x76, 0x71, 0x8d, 0x01, 0x7c, 0xf0, 0x9a, 0x7d, 0x5b, 0x9e, 0xed, 0xaa, 0xa3, 0x9c, 0xb7, 0x43, 0x33, 0x17, 0xfc, 0x8c, 0x52, 0x13, 0x47, 0x35, 0xfb, 0x67, 0x9b, 0x82, 0x77, 0x09, 0xac, 0xa9, 0x32, 0x8c, 0x4f, 0x7c, 0xc7, 0xe7, 0x30, 0x47, 0x5d, 0x78, 0xc3, 0xfc, 0x36, 0x49, 0x7d, 0x8d, 0x85, 0x91, 0x43, 0x9a, 0x80, 0x7e, 0x23, 0x4c, 0xb7, 0x31, 0x42, 0x81, 0xa4, 0x0b, 0x15, 0x29, 0x83, 0x27, 0xd4, 0xef, 0x64, 0x27, 0x2c, 0x1d, 0x7e, 0x34, 0x35, 0xb9, 0xc6, 0x40, 0xa3, 0xf4, 0xc0, 0x8e, 0x40, 0xc6, 0x95, 0x75, 0x9a, 0xd2, 0x67, 0x61, 0xf8, 0x8f, 0xe1, 0x1a, 0x93, 0xa9, 0x12, 0x49, 0x03, 0xa5, 0x7b, 0x38, 0xf8, 0xc5, 0x66, 0xd9, 0x2a, 0x2b, 0x7a, 0x0a, 0x93, 0x40, 0x8d, 0x17, 0xdb, 0x57, 0xb9, 0x80, 0x14, 0x8e, 0xb2, 0xfd, 0xa7, 0xf5, 0x56, 0xc0, 0x8e, 0xf3, 0x86, 0xfa, 0xc4, 0xe5, 0x35, 0xa0, 0xfa, 0x07, 0xbe, 0x6f, 0x8c, 0x98, 0x7b, 0x2e, 0xb3, 0x39, 0x93, 0x33, 0xfc, 0x97, 0x13, 0x28, 0xf9, 0x49, 0x41, 0x0f, 0x36, 0xfc, 0x2d, 0x84, 0x6e, 0xcd, 0x88, 0x42, 0xff, 0xf6, 0xb9, 0xe9, 0x9c, 0xad, 0x2e, 0xff, 0x42, 0x49, 0xf0, 0x34, 0x6d, 0xa7, 0x7b, 0xea, 0x8b, 0xcc, 0xcc, 0xf4, 0xb1, 0xcb, 0xbb, 0x9e, 0x8d, 0xe9, 0x8b, 0xee, 0x9c, 0x00, 0xc0, 0x2a, 0x9c, 0x21, 0x30, 0x9a, 0x45, 0x7d, 0x5d, 0x8f, 0x34, 0x86, 0x02, 0xa5, 0x28, 0x51, 0xec, 0x44, 0x70, 0x3f, 0x0b, 0x6d, 0xa4, 0xdc, 0xc9, 0xb3, 0x94, 0x07, 0x9a, 0x87, 0x7e, 0x54, 0xd5, 0xb9, 0x84, 0xae, 0xc2, 0x3c, 0x5c, 0x41, 0xf4, 0x2a, 0x4a, 0x97, 0xd9, 0x07, 0x4b, 0x00, 0x8f, 0x4a, 0x93, 0x38, 0xf9, 0x19, 0x3a, 0x44, 0x13, 0x55, 0x33, 0x9d, 0x82, 0xd6, 0x7d, 0x90, 0x70, 0xf8, 0x9d, 0xe5, 0x96, 0x56, 0x4b, 0xbf, 0x9a, 0xd5, 0x6c, 0xc3, 0x9c, 0xe5, 0x40, 0x7c, 0x0c, 0x03, 0xdd, 0xfe, 0xbe, 0x82, 0xdc, 0xca, 0x40, 0x8c, 0x52, 0xf2, 0x6b, 0x64, 0x02, 0x7e, 0x38, 0xed, 0xd0, 0x0d, 0xd5, 0x70, 0x79, 0xc0, 0xf8, 0x9a, 0x82, 0x53, 0x74, 0xc4, 0x6e, 0x8d, 0x0a, 0x78, 0x34, 0xdb, 0x81, 0x30, 0xf0, 0x38, 0xf8, 0x60, 0xd9, 0x4f, 0x7c, 0xb7, 0x73, 0xe4, 0xd6, 0xa2, 0x06, 0x70, 0xa6, 0x13, 0x4e, 0x0b, 0xb6, 0x80, 0x74, 0x8f, 0x88, 0x2e, 0x3d, 0xfb, 0x31, 0xaf, 0x82, 0x15, 0x6a, 0xaa, 0xe0, 0x54, 0xe5, 0xda, 0xb0, 0xfc, 0xdd, 0x59, 0x39, 0x8b, 0xf1, 0x1f, 0x25, 0x54, 0x32, 0xc5, 0x32, 0x6a, 0x7b, 0x8f, 0x2a, 0xbf, 0x01, 0xaa, 0x15, 0x8d, 0x2a, 0xb2, 0xad, 0xf5, 0xa3, 0x78, 0x12, 0xe7, 0xad, 0x01, 0xbf, 0x41, 0xb7, 0xd2, 0xbd, 0x3b, 0x32, 0x6a, 0x16, 0x02, 0xa1, 0x11, 0x8d, 0xa3, 0xef, 0xd0, 0x8c, 0x2b, 0x06, 0xc1, 0x5e, 0x0c, 0x9d, 0x89, 0x9e, 0xc3, 0x51, 0x22, 0xf0, 0xb8, 0xf8, 0xde, 0xef, 0x66, 0x32, 0xa8, 0x66, 0xbb, 0x40, 0x8d, 0xc2, 0xc2, 0x1a, 0x7c, 0xc7, 0x7f, 0xbb, 0x4a, 0x83, 0x1b, 0xc0, 0xf9, 0x80, 0x41, 0x31, 0x3a, 0x3e, 0xc7, 0x9f, 0x30, 0xe0, 0x91, 0x6f, 0x77, 0x26, 0xb2, 0x75, 0x65, 0x9b, 0xd5, 0xc5, 0x90, 0x10, 0xdc, 0xc5, 0x90, 0x48, 0xc6, 0x87, 0x06, 0xf5, 0xd6, 0x56, 0xdd, 0xe3, 0xf1, 0x8f, 0xcf, 0x74, 0x49, 0xb3, 0x2b, 0x4c, 0x38, 0xb9, 0xd6, 0x4d, 0x6e, 0xa9, 0x90, 0xc6, 0x4f, 0x66, 0x79, 0xe7, 0x97, 0xcb, 0xd4, 0x79, 0x40, 0xfa, 0x0a, 0xcc, 0xa5, 0xf1, 0xf2, 0xf0, 0xe7, 0x5f, 0x4f, 0x27, 0x90, 0xb5, 0x9b, 0x9b, 0x76, 0x7f, 0x03, 0x4d, 0xe3, 0xf5, 0xb2, 0x4e, 0xf2, 0xcd, 0x52, 0x31, 0x3c, 0x54, 0xd0, 0xc0, 0xb4, 0xbd, 0x60, 0xee, 0xd0, 0xb9, 0xc2, 0x0d, 0xea, 0x48, 0xc3, 0x41, 0xe5, 0xce, 0x06, 0x35, 0x13, 0x69, 0x04, 0x0c, 0x56, 0x82, 0x52, 0x9b, 0x86, 0xa2, 0x23, 0xd5, 0x13, 0x87, 0x0d, 0x86, 0xec, 0x78, 0x10, 0x45, 0x9f, 0xd5, 0xd4, 0xa3, 0xc1, 0xf2, 0x32, 0xa9, 0x90, 0x25, 0xf6, 0x82, 0xd7, 0x1e, 0xe3, 0x74, 0x12, 0x77, 0xf8, 0x15, 0xd3, 0x8c, 0xf2, 0xbb, 0x64, 0x8d, 0x12, 0x34, 0xae, 0xd2, 0x20, 0xb7, 0x59, 0x6e, 0xb0, 0x1b, 0x35, 0x06, 0xa4, 0x47, 0xd9, 0xe4, 0xf2, 0xea, 0x8a, 0x47, 0xa8, 0x6c, 0x5e, 0xfd, 0x2d, 0x24, 0xa0, 0x34, 0xc9, 0xcb, 0x77, 0x8e, 0x67, 0x30, 0xc3, 0x73, 0x9a, 0x2e, 0x48, 0xab, 0xdf, 0xdb, 0x0e, 0x2c, 0x22, 0x03, 0x07, 0x30, 0x83, 0xd5, 0xf3, 0x8b, 0x59, 0xdb, 0x81, 0x3c, 0x77, 0x30, 0xb7, 0x42, 0xaf, 0xed, 0x93, 0xb1, 0x95, 0xe4, 0xf3, 0x04, 0x85, 0x91, 0xb2, 0xb5, 0xe8, 0x4d, 0x14, 0x0b, 0xb2, 0xc5, 0x64, 0x34, 0x2f, 0xab, 0xdb, 0x93, 0x00, 0xab, 0xc4, 0x5b, 0x61, 0xa1, 0xde, 0x5d, 0xad, 0x09, 0x02, 0x1e, 0x23, 0xb6, 0x05, 0x2d, 0xea, 0xc8, 0xe0, 0xb3, 0x53, 0xd8, 0x0e, 0x4c, 0x5f, 0x75, 0x36, 0x15, 0x81, 0xd4, 0x0a, 0x07, 0xa4, 0xc3, 0x6f, 0x83, 0x70, 0xdf, 0xde, 0x2d, 0xc9, 0x07, 0x0a, 0xfe, 0x99, 0x10, 0xc3, 0x95, 0xd0, 0xba, 0x1a, 0xce, 0xa9, 0xe3, 0xc6, 0x96, 0x2e, 0xfb, 0xc6, 0xfe, 0xfe, 0xb8, 0x48, 0x8e, 0x4e, 0x0b, 0xca, 0xdb, 0x2e, 0x52, 0x7f, 0x5b, 0x0d, 0xcf, 0xf4, 0x79, 0x80, 0x59, 0xf3, 0xe5, 0x3f, 0x51, 0xa8, 0x2e, 0x70, 0xd8, 0x02, 0x92, 0x29, 0x3f, 0x5c, 0x15, 0x30, 0xbf, 0x5d, 0xd0, 0x05, 0x6b, 0x1c, 0x8c, 0x22, 0x62, 0x88, 0x8f, 0x81, 0x49, 0x08, 0xb6, 0x5f, 0xf9, 0x5e, 0xc4, 0x40, 0x74, 0xd1, 0xfa, 0x33, 0x1e, 0x8b, 0xe8, 0x57, 0x2a, 0x40, 0x82, 0x9e, 0x52, 0x10, 0x76, 0xd1, 0xcb, 0xaf, 0xbd, 0xd4, 0x78, 0xc3, 0x70, 0x2c, 0x5e, 0x8d, 0xde, 0xbe, 0x58, 0xcc, 0xdb, 0xd9, 0x0b, 0xde, 0x5b, 0x77, 0x1d, 0x29, 0x3f, 0xc0, 0xa2, 0xb9, 0x6e, 0xd0, 0xd7, 0x2a, 0x28, 0xba, 0x13, 0xc9, 0x97, 0xcd, 0xfa, 0xf6, 0xa7, 0x16, 0xf4, 0xcd, 0x18, 0x25, 0xde, 0x05, 0xd2, 0x14, 0xff, 0x17, 0x78, 0xc6, 0x3d, 0xa3, 0x3f, 0x6d, 0x90, 0x10, 0x01, 0x4f, 0xb8, 0x74, 0x8d, 0xc9, 0x2b, 0xb3, 0x42, 0x94, 0x52, 0xea, 0xdc, 0x47, 0xf4, 0x0e, 0x8d, 0x1d, 0xf3, 0xd0, 0x50, 0xf9, 0x36, 0xc4, 0x7a, 0xa7, 0xe6, 0xc3, 0x91, 0x65, 0xdd, 0x8e, 0x62, 0xa2, 0x5b, 0xb3, 0x4e, 0x05, 0xfb, 0xb5, 0xe5, 0xb1, 0xe6, 0x67, 0xb6, 0xc8, 0x47, 0x99, 0x64, 0x2d, 0xff, 0xf6, 0xfd, 0x8f, 0x99, 0x2d, 0x88, 0xa3, 0x80, 0x4f, 0xdd, 0xb0, 0x6f, 0x78, 0xba, 0x51, 0x2a, 0xb2, 0x12, 0x77, 0x6c, 0x16, 0xa8, 0xad, 0x20, 0x35, 0xdd, 0xa0, 0xd3, 0xb6, 0xc6, 0xde, 0x6a, 0x40, 0x82, 0xde, 0x10, 0x9a, 0xcb, 0x41, 0x73, 0x10, 0xca, 0x57, 0x30, 0x19, 0x30, 0xe5, 0x8b, 0x38, 0x82, 0x25, 0x64, 0x20, 0xb4, 0x0f, 0x67, 0x1b, 0xfa, 0xd7, 0x82, 0xac, 0xdb, 0xb7, 0x9c, 0x73, 0x87, 0xee, 0x84, 0x52, 0x6a, 0x09, 0x27, 0xce, 0x01, 0x61, 0x07, 0xb8, 0xed, 0xe5, 0xe8, 0x0c, 0x46, 0x19, 0xcc, 0x19, 0x31, 0x5f, 0x22, 0xe2, 0xb5, 0x76, 0x3b, 0xc5, 0xca, 0x40, 0xfd, 0x5a, 0xb3, 0xc8, 0xdb, 0x9e, 0x8e, 0x83, 0x05, 0x51, 0x2a, 0xd6, 0xdb, 0x9c, 0x18, 0xd9, 0xa8, 0xf7, 0x05, 0x5b, 0x8d, 0x4a, 0x47, 0x26, 0xbb, 0x52, 0xb5, 0x83, 0xe5, 0x47, 0xbc, 0x01, 0xf6, 0xbc, 0xaf, 0x73, 0xff, 0xc6, 0x5f, 0x38, 0x73, 0x60, 0xec, 0xbf, 0x96, 0x0e, 0xda, 0x49, 0x33, 0xc1, 0x67, 0xf1, 0x8d, 0xfb, 0x1c, 0xea, 0x99, 0x33, 0xa3, 0x09, 0x6a, 0x7b, 0xd8, 0x83, 0xed, 0x60, 0x22, 0xf7, 0xd6, 0x12, 0x04, 0xaf, 0xda, 0xc5, 0xef, 0x23, 0x1f, 0x56, 0x5b, 0xbe, 0xf1, 0x32, 0x16, 0xe5, 0xb6, 0x74, 0xdb, 0x36, 0x24, 0x4d, 0x26, 0x0d, 0xb1, 0xa9, 0x47, 0x4d, 0x4b, 0x0f, 0xb5, 0x5d, 0x4a, 0xc9, 0xa6, 0x70, 0xa3, 0x46, 0xdc, 0x0a, 0x5e, 0xbc, 0xc2, 0xc0, 0x4a, 0x11, 0xb7, 0x3f, 0xef, 0xfc, 0xaa, 0x8f, 0xc4, 0x68, 0xe7, 0x99, 0xa2, 0x19, 0x30, 0xe7, 0x79, 0x91, 0x10, 0xac, 0x42, 0x35, 0x6c, 0x04, 0x34, 0xac, 0x5b, 0x7c, 0x3b, 0x88, 0x38, 0xd5, 0xa6, 0x28, 0xf5, 0x05, 0x1f, 0xdc, 0xb1, 0x7f, 0xe1, 0x4b, 0x8d, 0xb4, 0x25, 0x12, 0xbc, 0xda, 0xdd, 0xae, 0xda, 0xec, 0xa5, 0x9c, 0x7f, 0xf2, 0xf7, 0xbe, 0x13, 0x82, 0x9e, 0x01, 0xe4, 0x87, 0x6d, 0x3d, 0x75, 0x41, 0x30, 0x5d, 0x1a, 0x8d, 0xe3, 0xbf, 0xc1, 0x67, 0x22, 0xde, 0x13, 0xad, 0xe1, 0x2e, 0xbc, 0x25, 0x5d, 0x47, 0x06, 0xc2, 0x52, 0x46, 0xad, 0x23, 0x6f, 0x70, 0xef, 0x5d, 0x07, 0x19, 0xe2, 0xfa, 0x09, 0xc5, 0x0a, 0x42, 0x32, 0x8c, 0x2b, 0xb9, 0x81, 0xc3, 0x5c, 0xe8, 0xec, 0xd8, 0x5d, 0x60, 0x51, 0x7e, 0x2a, 0xfd, 0xaf, 0x0a, 0xd0, 0x68, 0x96, 0x1d, 0x80, 0xdf, 0xdc, 0x84, 0xe2, 0x39, 0x92, 0x5c, 0xab, 0x24, 0x36, 0x7a, 0x72, 0xb2, 0x2a, 0x0a, 0xc0, 0x14, 0x65, 0x75, 0x66, 0xa5, 0x69, 0x89, 0x13, 0x2a, 0x75, 0xd4, 0x25, 0x57, 0xfb, 0x50, 0xc0, 0x96, 0x54, 0x46, 0x1d, 0x05, 0xb3, 0x6c, 0x25, 0xbd, 0x58, 0x50, 0x3f, 0x5a, 0x06, 0xfa, 0x66, 0xb8, 0xb6, 0xcd, 0x7e, 0xfa, 0x8d, 0xaf, 0xe8, 0xd1, 0x0c, 0x6a, 0x54, 0xfb, 0x87, 0x51, 0xd6, 0x09, 0xd8, 0x26, 0x3d, 0x66, 0x54, 0x3b, 0xa0, 0x95, 0xfe, 0xd8, 0x39, 0xba, 0xfb, 0xdd, 0x76, 0x5c, 0x46, 0xa8, 0x4e, 0x69, 0xa5, 0x39, 0xd2, 0x7a, 0xdc, 0x94, 0x04, 0x59, 0x20, 0x67, 0xeb, 0xc1, 0xce, 0xed, 0xe7, 0x64, 0x5d, 0x12, 0x43, 0x32, 0x92, 0xd8, 0x09, 0xd9, 0xf2, 0xf9, 0x1a, 0x88, 0x7d, 0xce, 0x7d, 0xf9, 0x99, 0x6f, 0xf8, 0xae, 0x4d, 0x1c, 0xdd, 0x7b, 0xaf, 0xdc, 0x27, 0x44, 0xa0, 0x63, 0xc5, 0x08, 0xb6, 0x39, 0x36, 0x1e, 0x7a, 0x19, 0x56, 0xbf, 0xd4, 0x98, 0x78, 0xc5, 0xc3, 0x07, 0xb4, 0xb2, 0x51, 0x99, 0x83, 0xf4, 0xc7, 0xc9, 0x89, 0x68, 0x1d, 0xf6, 0xb1, 0x1c, 0xb4, 0x50, 0x7f, 0x59, 0x48, 0xf8, 0xa2, 0xe1, 0x20, 0x63, 0xc9, 0x75, 0x87, 0x00, 0xb8, 0x9a, 0x80, 0x1a, 0x9b, 0x9d, 0xb6, 0xff, 0x9a, 0xd5, 0xb2, 0x62, 0xad, 0x28, 0x50, 0xfe, 0xb2, 0xd0, 0x74, 0x7c, 0xbd, 0x5f, 0xf9, 0x97, 0xaf, 0x01, 0xea, 0x7e, 0x0a, 0x02, 0xf5, 0x79, 0x03, 0x90, 0x1c, 0xd0, 0xd9, 0xc1, 0xae, 0xe9, 0x66, 0xd8, 0x76, 0xb0, 0xf4, 0xc4, 0x32, 0x3b, 0x51, 0xe9, 0x47, 0xaf, 0x26, 0x23, 0xb2, 0x5d, 0x84, 0x08, 0x42, 0x31, 0xc0, 0x6e, 0x04, 0x4d, 0x81, 0x2e, 0xff, 0xf1, 0x17, 0x27, 0x22, 0x9e, 0x0e, 0x85, 0x7b, 0x7b, 0x03, 0x43, 0xaa, 0xf7, 0xb7, 0xee, 0x94, 0xb0, 0x62, 0xac, 0x5c, 0x94, 0x4a, 0x7e, 0x8f, 0x45, 0x93, 0xc2, 0x9e, 0xc2, 0x59, 0xfc, 0x92, 0x45, 0xfc, 0xd5, 0xfb, 0x67, 0xbb, 0x64, 0x29, 0x8a, 0x85, 0xad, 0x9f, 0x78, 0x0b, 0x67, 0xc5, 0x48, 0x1a, 0x03, 0xdd, 0x82, 0x28, 0xe9, 0x38, 0x83, 0x2d, 0x05, 0xaa, 0x22, 0xb4, 0x82, 0x3b, 0x93, 0x31, 0xd5, 0x1f, 0x8c, 0x95, 0xfe, 0xe9, 0xa7, 0x20, 0x0a, 0xfb, 0x08, 0x76, 0xdd, 0x41, 0x3f, 0xf6, 0x2e, 0x1f, 0x6f, 0x47, 0xd3, 0xa7, 0xb0, 0x33, 0x3f, 0x10, 0xb3, 0xb9, 0x49, 0x63, 0xa5, 0x5d, 0x2f, 0x78, 0x55, 0xc3, 0xda, 0x21, 0x98, 0x7c, 0x63, 0xa5, 0xed, 0x20, 0xd7, 0x70, 0x5d, 0x9d, 0x37, 0x08, 0xa5, 0xce, 0xc3, 0x43, 0x97, 0x50, 0x78, 0xb8, 0xbe, 0x91, 0xd8, 0x73, 0x41, 0x29, 0xe9, 0xed, 0x09, 0x6e, 0x80, 0x3b, 0x26, 0x42, 0xbf, 0x85, 0x6f, 0x30, 0xdd, 0xba, 0x69, 0xb8, 0x25, 0x82, 0x6b, 0xe6, 0x42, 0x74, 0xff, 0x2a, 0xb9, 0x8a, 0x8a, 0x63, 0xb7, 0xd1, 0x30, 0x3d, 0x0d, 0x65, 0xf2, 0xbd, 0x79, 0x9d, 0x19, 0x1a, 0x27, 0x83, 0xd8, 0xcf, 0x77, 0x87, 0x2d, 0xee, 0x01, 0x74, 0x08, 0xb7, 0xd7, 0xa2, 0xaf, 0x69, 0x09, 0x6e, 0x61, 0x58, 0x6f, 0xe7, 0x39, 0x40, 0xa2, 0xca, 0x56, 0xd9, 0x4c, 0xb1, 0x39, 0xab, 0xa2, 0x87, 0x6e, 0x24, 0x2e, 0x3f, 0x6f, 0xe8, 0xd2, 0xc5, 0xc5, 0x68, 0x0a, 0x35, 0x70, 0xb6, 0x71, 0x4c, 0x89, 0x98, 0x87, 0x1c, 0x26, 0xdb, 0xb1, 0x03, 0x7e, 0xe9, 0x81, 0xdd, 0x4e, 0x9e, 0x38, 0x79, 0x7b, 0x58, 0x89, 0x4a, 0xf8, 0x4d, 0xa0, 0x5f, 0xea, 0x22, 0x63, 0x95, 0x0a, 0xb9, 0xf8, 0x0c, 0x4b, 0x4a, 0x87, 0xd7, 0xbe, 0xb5, 0x41, 0xf8, 0xb2, 0x16, 0xa1, 0x8b, 0x1f, 0x9a, 0xf1, 0x41, 0x45, 0x92, 0x11, 0x10, 0x90, 0xc6, 0x74, 0x29, 0xbf, 0x0c, 0x6b, 0x2b, 0x45, 0x19, 0xa6, 0x96, 0xef, 0x96, 0xf7, 0x82, 0xc8, 0x77, 0x5a, 0x91, 0x3a, 0x88, 0x33, 0x22, 0x75, 0x48, 0xd6, 0xc7, 0x15, 0xfb, 0x4c, 0xfa ],
+const [ 0xb0, 0x02, 0x50, 0xcc, 0x95, 0x2f, 0x6d, 0xc3, 0x04, 0x26, 0x00, 0xe5, 0x4b, 0x89, 0x6d, 0x17, 0x8c, 0x84, 0x84, 0xf5, 0xbf, 0xbb, 0xa9, 0x6a, 0xfa, 0x81, 0x32, 0x7d, 0xf0, 0x4b, 0x11, 0x6e, 0xb9, 0x64, 0xb3, 0x02, 0xd1, 0xe2, 0x28, 0x1b, 0x62, 0xd8, 0x83, 0x8b, 0xc6, 0xcd, 0x84, 0x2a, 0x47, 0x6d, 0x74, 0x27, 0x2a, 0x7f, 0x51, 0x9b, 0xed, 0x17, 0x2b, 0x64, 0xcc, 0x0d, 0xce, 0x30, 0x8a, 0xad, 0xa1, 0xd8, 0x6d, 0xb0, 0xce, 0xf0, 0x8b, 0x6c, 0xa3, 0x9c, 0x44, 0x47, 0x39, 0xa4, 0x10, 0x71, 0x53, 0xcb, 0x7b, 0xd3, 0x88, 0x5d, 0x6d, 0x42, 0xa5, 0x08, 0xaf, 0xf9, 0x4d, 0xec, 0xab, 0x46, 0xe2, 0xf5, 0x73, 0x83, 0xa9, 0x69, 0x05, 0x48, 0x28, 0xbd, 0xce, 0xdf, 0xd3, 0xad, 0x6c, 0xf8, 0xe8, 0x8c, 0xb8, 0x9e, 0x98, 0xd8, 0x04, 0x6a, 0x67, 0x11, 0xa1, 0xf7, 0xd5, 0xcb, 0xa5, 0x95, 0x3e, 0x03, 0xea, 0x42, 0xff, 0xaf, 0x5a, 0xd6, 0xda, 0x98, 0x6a, 0x7d, 0x9c, 0x6c, 0xe5, 0x6a, 0xfc, 0x0f, 0xeb, 0xca, 0xc7, 0x33, 0x39, 0xf7, 0x3a, 0x28, 0xab, 0xef, 0xaf, 0xf5, 0xfe, 0x04, 0x7d, 0xa7, 0xdb, 0xd5, 0x19, 0xe9, 0x11, 0x7c, 0x81, 0xd5, 0x23, 0x09, 0xda, 0x0a, 0x02, 0x30, 0x57, 0xff, 0x1b, 0x3e, 0x5e, 0x97, 0x94, 0x51, 0xe6, 0xf5, 0xd3, 0xc9, 0x24, 0x91, 0x41, 0xfa, 0x66, 0x8b, 0x4d, 0x23, 0x3f, 0x40, 0xb3, 0xa4, 0xe4, 0x1c, 0xfe, 0x6b, 0xd6, 0xaf, 0x4b, 0xb0, 0xc1, 0x02, 0x51, 0xe2, 0xa4, 0x2b, 0x9e, 0xe1, 0x33, 0x1f, 0x23, 0x6d, 0x7a, 0xc8, 0xf3, 0xdf, 0xc2, 0x57, 0x48, 0x16, 0xb8, 0xdc, 0xc7, 0xb5, 0xcc, 0x13, 0x05, 0x8c, 0xd8, 0x81, 0x49, 0x53, 0x02, 0xc0, 0x94, 0x9e, 0xe3, 0x18, 0xde, 0x0d, 0xe9, 0x4f, 0xa3, 0xc3, 0xf9, 0xc1, 0x9e, 0x1a, 0x59, 0xb3, 0xd5, 0x95, 0xce, 0xe4, 0xd5, 0x17, 0x01, 0x65, 0x3f, 0x52, 0x27, 0xab, 0x83, 0x81, 0xe1, 0xe3, 0xec, 0x5a, 0x61, 0x85, 0xdd, 0x3e, 0xcf, 0x2c, 0x5a, 0xb4, 0xeb, 0xa5, 0xc9, 0x15, 0xf3, 0x45, 0xfa, 0x89, 0xc7, 0x80, 0x66, 0x31, 0x4b, 0xb8, 0xb4, 0xa6, 0x0d, 0x53, 0x82, 0xa3, 0x28, 0x10, 0x61, 0xfe, 0x68, 0x9b, 0x21, 0xdd, 0xae, 0x5f, 0x50, 0x26, 0x96, 0x9b, 0xfd, 0x37, 0x58, 0xb8, 0xc1, 0xd8, 0xec, 0xda, 0x01, 0x6d, 0x72, 0xb5, 0x6d, 0x71, 0xd0, 0xa2, 0xcc, 0x1f, 0x9d, 0xf1, 0xfc, 0x72, 0x3e, 0x81, 0x34, 0x50, 0x4e, 0x8f, 0x8d, 0x02, 0x44, 0xcc, 0xc1, 0xe8, 0x4f, 0xb2, 0x32, 0x6b, 0x85, 0x17, 0x2e, 0x32, 0x3d, 0x03, 0x71, 0x99, 0xb9, 0xbf, 0xeb, 0x5f, 0x09, 0x2e, 0xc4, 0x9e, 0x2b, 0x60, 0x9e, 0x01, 0x77, 0x65, 0x1a, 0x31, 0x3b, 0x5f, 0x9d, 0x90, 0xa2, 0xdb, 0x54, 0x2a, 0xda, 0x62, 0x75, 0xe9, 0x75, 0x4a, 0xc8, 0x08, 0x10, 0xd2, 0x67, 0xc9, 0x33, 0x6f, 0xc2, 0x6b, 0x79, 0x60, 0xe5, 0x56, 0xf1, 0x88, 0xfe, 0x9a, 0xc3, 0x7d, 0x19, 0x97, 0x17, 0xdd, 0x2f, 0xfd, 0x32, 0xe1, 0x5f, 0xf8, 0xe2, 0x34, 0x7b, 0xa4, 0x1d, 0x05, 0xc6, 0xc7, 0xe5, 0x5b, 0xfc, 0xbf, 0x6e, 0xa8, 0x93, 0xb9, 0x83, 0xa2, 0x41, 0x24, 0x26, 0x4e, 0xbe, 0x66, 0x77, 0x5d, 0xcb, 0xcd, 0xd7, 0xbc, 0x73, 0xc8, 0x4c, 0x67, 0x91, 0x57, 0x27, 0x7e, 0x92, 0xc0, 0xe5, 0x9a, 0x7c, 0x84, 0x54, 0x61, 0x2f, 0x91, 0xf7, 0x58, 0xec, 0xb9, 0xaa, 0xf9, 0x13, 0x63, 0x89, 0x06, 0x31, 0x80, 0x0f, 0x1c, 0x39, 0xc1, 0x7b, 0x8b, 0x12, 0x07, 0x78, 0x65, 0x52, 0x1c, 0xfc, 0xd5, 0x4a, 0xa0, 0x71, 0xb2, 0x42, 0x46, 0x13, 0x54, 0x05, 0x40, 0x99, 0xa7, 0xa1, 0xf7, 0x17, 0x7d, 0x68, 0x00, 0x23, 0x29, 0x3a, 0x4b, 0x37, 0x49, 0x07, 0x9e, 0x56, 0xe3, 0x8f, 0x42, 0xf2, 0xb4, 0x6c, 0xfd, 0x0e, 0xc4, 0x53, 0x40, 0xa0, 0x3e, 0x97, 0xa0, 0x39, 0x7f, 0xee, 0x8a, 0xe7, 0x6d, 0x78, 0x33, 0x5b, 0x0a, 0xfd, 0xcf, 0x47, 0x49, 0x77, 0x03, 0x0a, 0x20, 0xd0, 0x9c, 0x8f, 0xde, 0xec, 0x81, 0x72, 0xbf, 0xea, 0xe6, 0x65, 0xbd, 0xa7, 0xc3, 0xd3, 0xaa, 0x84, 0x85, 0xc3, 0x7c, 0x6a, 0x03, 0xfe, 0xe8, 0x0b, 0xb3, 0x74, 0x32, 0x6a, 0x1e, 0xdc, 0x43, 0x9d, 0x91, 0x9b, 0xfc, 0xd1, 0x16, 0xe7, 0xca, 0x90, 0xa2, 0x2c, 0x7a, 0x3f, 0x90, 0xae, 0x4f, 0xeb, 0x4e, 0x71, 0x52, 0x45, 0x57, 0x56, 0xea, 0xea, 0x61, 0x86, 0xac, 0xe8, 0xd7, 0x13, 0x74, 0x7e, 0x89, 0xdd, 0xb5, 0x24, 0xa3, 0xb3, 0x0d, 0xcb, 0xdb, 0xbb, 0x1d, 0x66, 0xef, 0x14, 0x97, 0xa9, 0x4f, 0xb9, 0x98, 0x11, 0x16, 0xa9, 0x39, 0x24, 0x3f, 0x45, 0x61, 0xfa, 0x16, 0xf9, 0xdd, 0xfc, 0xec, 0x1e, 0xb2, 0xec, 0x0f, 0x1f, 0xb1, 0x26, 0xfa, 0xdb, 0x4d, 0x25, 0xc8, 0x4b, 0xaa, 0x48, 0xef, 0x65, 0xf6, 0xd6, 0x2a, 0x40, 0xfc, 0x41, 0xb7, 0x78, 0xf6, 0xa7, 0xc3, 0xd4, 0xa3, 0x9e, 0x23, 0x26, 0x9a, 0x31, 0x44, 0x73, 0xde, 0x26, 0x65, 0x54, 0xb2, 0x83, 0x03, 0x9c, 0xaf, 0x50, 0x95, 0x3b, 0x13, 0x9d, 0x7a, 0x63, 0x5c, 0xc7, 0x30, 0xe9, 0x16, 0xf8, 0xc6, 0xed, 0xf1, 0xed, 0x94, 0xbd, 0x16, 0xfc, 0x29, 0xf7, 0xbb, 0x55, 0x85, 0xee, 0xf5, 0x88, 0x89, 0x4f, 0xce, 0x47, 0xab, 0x05, 0x98, 0x6d, 0xee, 0x59, 0x81, 0x40, 0x12, 0x5e, 0x67, 0xf3, 0x07, 0x8c, 0xed, 0x70, 0xa8, 0xab, 0xce, 0x54, 0xa6, 0xf3, 0x71, 0x3a, 0xc2, 0x71, 0xbe, 0x3c, 0x40, 0xac, 0x31, 0xb7, 0x98, 0x89, 0x2c, 0x4f, 0x6e, 0x6c, 0x92, 0x33, 0xc4, 0xa0, 0x91, 0xa2, 0x6f, 0xf9, 0xbf, 0xaf, 0xc7, 0xb7, 0x69, 0x41, 0xa3, 0xae, 0x27, 0x5d, 0x85, 0xa4, 0xb4, 0xa8, 0x11, 0xfb, 0xfd, 0x27, 0xc4, 0x90, 0x78, 0x4a, 0xe2, 0xe2, 0xb7, 0x29, 0xb0, 0x77, 0x3d, 0x0d, 0xe4, 0x7b, 0x90, 0x32, 0x5a, 0xab, 0x90, 0xcb, 0x08, 0x71, 0x06, 0x47, 0x34, 0x50, 0x80, 0xd3, 0xe4, 0x83, 0x5d, 0x20, 0x97, 0xe1, 0x24, 0x66, 0x32, 0x04, 0x1a, 0xa9, 0x3d, 0xaa, 0x13, 0x3b, 0x4f, 0x5b, 0x88, 0x82, 0xc7, 0x4d, 0xea, 0xfb, 0xbd, 0x84, 0x36, 0x7f, 0x39, 0x3d, 0xca, 0xc5, 0xa2, 0x8d, 0x77, 0x29, 0x79, 0x46, 0xd7, 0xab, 0x47, 0x1a, 0xe0, 0x3b, 0xd3, 0x03, 0xba, 0x34, 0x99, 0xe2, 0xce, 0x26, 0x78, 0x66, 0x20, 0xd8, 0xab, 0x2f, 0xde, 0x8d, 0xfa, 0x33, 0x39, 0x87, 0x31, 0x61, 0x73, 0xca, 0xd2, 0x85, 0x39, 0x22, 0x07, 0x6c, 0x34, 0x67, 0xda, 0x48, 0xdb, 0x00, 0xa8, 0x55, 0x8b, 0xa6, 0xd3, 0xbd, 0xd9, 0x6a, 0xb8, 0xba, 0x27, 0xfa, 0xe1, 0xfa, 0x75, 0x20, 0x7b, 0x47, 0x7a, 0x8b, 0x0a, 0x67, 0xf3, 0xd2, 0x5b, 0x41, 0x3c, 0xb6, 0xba, 0x42, 0x1d, 0xa8, 0x66, 0xff, 0xe6, 0x8b, 0x42, 0x1c, 0xbe, 0xba, 0xcd, 0x6c, 0x38, 0x4d, 0x54, 0x59, 0x27, 0x98, 0x67, 0x87, 0xb4, 0xf5, 0x89, 0xb4, 0xad, 0xc4, 0x2b, 0xe3, 0x20, 0xaf, 0xdc, 0xb9, 0x29, 0x33, 0xba, 0x27, 0x08, 0x5b, 0x2c, 0x49, 0x76, 0xcf, 0xd3, 0x8e, 0x3a, 0x0e, 0xbd, 0x1a, 0xf7, 0xf8, 0xdc, 0x68, 0x48, 0x8f, 0xb7, 0x34, 0x0e, 0xfe, 0x60, 0x98, 0x09, 0xdb, 0xa6, 0x75, 0xa6, 0xa9, 0x8b, 0x14, 0x18, 0xa1, 0xf9, 0x0d, 0xaa, 0xb2, 0xb0, 0x68, 0x54, 0xc6, 0x83, 0x03, 0x8c, 0x47, 0xc4, 0x33, 0x5e, 0xe1, 0xfd, 0xae, 0xbf, 0x8a, 0xe0, 0xa9, 0x1f, 0xc0, 0x81, 0x3d, 0x3d, 0x12, 0xc3, 0x0f, 0x3f, 0xe2, 0x10, 0x30, 0x02, 0x69, 0x4e, 0x42, 0xaf, 0xfc, 0x0e, 0xdd, 0x8f, 0x8d, 0x06, 0x31, 0x20, 0x74, 0xc1, 0xec, 0x68, 0x70, 0x95, 0x5e, 0x89, 0xe8, 0xd6, 0xda, 0x96, 0x77, 0x49, 0x60, 0xa5, 0xa8, 0xdb, 0x7a, 0x25, 0xfe, 0x93, 0x64, 0x72, 0x38, 0xc6, 0x6f, 0xa7, 0xd2, 0x8a, 0xa7, 0xb4, 0xcf, 0x6c, 0xb4, 0xb0, 0xb6, 0x66, 0xfe, 0x70, 0xdb, 0x0b, 0x15, 0x58, 0xdf, 0x05, 0x4f, 0x71, 0x7a, 0xc1, 0xb3, 0xbc, 0x78, 0x69, 0x15, 0xc6, 0x02, 0x13, 0x83, 0x7d, 0x1f, 0x38, 0xe0, 0x42, 0x7b, 0x67, 0xcf, 0x3f, 0x66, 0x3a, 0xd3, 0xfb, 0x1f, 0x8a, 0xb4, 0x2b, 0x53, 0xdf, 0x24, 0xcc, 0xe1, 0x2a, 0xa2, 0x6e, 0xe0, 0xb7, 0x9f, 0xd3, 0xe3, 0x5d, 0xdf, 0xb8, 0x7b, 0xf8, 0x23, 0xf3, 0xfe, 0x19, 0x05, 0xbe, 0x87, 0xfb, 0x23, 0x53, 0x3e, 0xb9, 0x7f, 0xb9, 0xda, 0xbf, 0x26, 0xdd, 0x64, 0x7e, 0x10, 0xe4, 0x3d, 0x65, 0x48, 0xc0, 0x62, 0x0c, 0x4c, 0x01, 0xef, 0xb2, 0xb7, 0xee, 0xe2, 0xe9, 0x1d, 0xd5, 0x22, 0x90, 0x37, 0x9f, 0xc0, 0x02, 0x40, 0xa7, 0x7c, 0x8d, 0x9e, 0xcd, 0x8b, 0x26, 0xc5, 0xc6, 0x97, 0x5a, 0x59, 0xb6, 0x08, 0x88, 0x92, 0x00, 0x82, 0x4e, 0xe5, 0x5c, 0xae, 0x41, 0xe1, 0x2b, 0x3e, 0xe1, 0x57, 0x08, 0x2b, 0xcc, 0xbd, 0xa0, 0x41, 0x31, 0xd4, 0xc3, 0xde, 0x88, 0x89, 0xbb, 0xf7, 0x80, 0x19, 0xdc, 0x5b, 0x39, 0x79, 0x5c, 0x3c, 0xb4, 0xf5, 0x65, 0xeb, 0x88, 0x17, 0x69, 0xe3, 0xd6, 0xca, 0xb6, 0x09, 0x7e, 0xbf, 0x4a, 0x32, 0x93, 0x10, 0xe8, 0xe6, 0x0d, 0x24, 0x6b, 0x64, 0xbe, 0xd2, 0x5b, 0xe5, 0x88, 0xc9, 0xbe, 0x25, 0xcc, 0x2f, 0x30, 0x20, 0x25, 0x88, 0x36, 0x19, 0x57, 0xda, 0xd0, 0xe1, 0x82, 0x0e, 0x4d, 0x56, 0x9c, 0x9a, 0x63, 0x2a, 0x1d, 0x5d, 0x7f, 0xe6, 0xfc, 0xca, 0x5a, 0x2e, 0xdb, 0x49, 0xcd, 0x46, 0x7f, 0xda, 0xe6, 0xd5, 0x82, 0xfc, 0x3b, 0xe9, 0x4c, 0xcd, 0x7e, 0x3c, 0x3f, 0x72, 0x52, 0xb6, 0x32, 0xb9, 0x5d, 0x32, 0x21, 0xfd, 0x9f, 0x85, 0x22, 0x4b, 0x02, 0xbc, 0x9b, 0xc2, 0x32, 0xa6, 0xb3, 0x40, 0xae, 0x93, 0x06, 0x3b, 0x20, 0x5a, 0x9d, 0xec, 0xea, 0xa1, 0x1d, 0xb3, 0x01, 0x58, 0x3e, 0xb7, 0xfe, 0x87, 0x7f, 0xcd, 0x72, 0x4a, 0x19, 0x9b, 0x7a, 0x19, 0x31, 0xfd, 0x94, 0x4d, 0x51, 0xa7, 0xb1, 0xe0, 0x19, 0x0c, 0x8c, 0x75, 0x32, 0x7f, 0x39, 0x98, 0x84, 0x98, 0x01, 0x46, 0xa9, 0xda, 0x6d, 0xb0, 0xa1, 0x92, 0xa1, 0x3c, 0xc7, 0x02, 0xeb, 0xcd, 0x03, 0xbf, 0x9c, 0x44, 0x42, 0x58, 0x17, 0x47, 0x23, 0x38, 0x27, 0x41, 0xf3, 0xce, 0x96, 0xa9, 0xdc, 0xeb, 0xfb, 0x88, 0x59, 0x6b, 0xd3, 0x35, 0xed, 0x17, 0xd3, 0x63, 0x15, 0xca, 0x7d, 0x5e, 0x7b, 0xd3, 0xf2, 0x92, 0x6c, 0x9b, 0x07, 0x4d, 0x8c, 0x88, 0x9a, 0xc6, 0xc9, 0x20, 0x27, 0x5d, 0x8d, 0x72, 0x96, 0x24, 0x38, 0xb1, 0x57, 0x9f, 0xcd, 0x23, 0xb1, 0xc8, 0xeb, 0x39, 0x57, 0x56, 0x00, 0x00, 0x3d, 0x3f, 0xb9, 0xb8, 0xa9, 0x7c, 0xbd, 0xc1, 0x8d, 0x0c, 0x9a, 0xbf, 0x14, 0x3b, 0xff, 0xf6, 0x7b, 0x24, 0x2d, 0xf6, 0x22, 0x75, 0xa8, 0x7d, 0xe3, 0x72, 0x32, 0x99, 0xa2, 0x3d, 0xf9, 0x0d, 0x25, 0x54, 0x10, 0xf6, 0x26, 0x5b, 0x1c, 0xae, 0xa7, 0x1c, 0x50, 0xf1, 0x86, 0xcc, 0x9b, 0x3e, 0x51, 0x8f, 0x1f, 0x80, 0x5b, 0x3f, 0xe6, 0xee, 0x10, 0x69, 0xd0, 0x30, 0x85, 0x99, 0xd0, 0xc3, 0x54, 0xd8, 0x58, 0x9e, 0xa6, 0x72, 0x12, 0x16, 0x91, 0xfd, 0xd1, 0xff, 0xa5, 0x96, 0xc7, 0x14, 0xc1, 0x6e, 0xf8, 0x99, 0x2b, 0x86, 0xee, 0x3e, 0xe0, 0xb6, 0xaf, 0x47, 0x29, 0xf4, 0xec, 0xea, 0x6f, 0xd3, 0x7b, 0xf8, 0x50, 0x4a, 0x08, 0xc0, 0xf3, 0xb7, 0x07, 0x31, 0x98, 0x23, 0xec, 0x3e, 0x73, 0xc8, 0x9f, 0x87, 0xba, 0xd0, 0x2a, 0x35, 0xfd, 0x60, 0xb5, 0x25, 0xb6, 0xd5, 0xb5, 0x4a, 0x21, 0x4e, 0x60, 0x4c, 0x4d, 0x6a, 0x64, 0x75, 0x73, 0x53, 0xd8, 0xce, 0x88, 0xfb, 0x73, 0x85, 0x0e, 0xa5, 0xfc, 0x92, 0x2f, 0xa8, 0x01, 0x9a, 0x0c, 0x6f, 0xcc, 0x14, 0x53, 0xc5, 0x93, 0xaa, 0x0f, 0x4f, 0xef, 0xe2, 0xc5, 0x5a, 0x8f, 0xfd, 0xbc, 0xd8, 0x2e, 0x20, 0x9c, 0xa4, 0xc2, 0xb1, 0x3b, 0x0e, 0xf7, 0x04, 0xb3, 0x93, 0xdb, 0x37, 0xb8, 0xec, 0xdb, 0x5a, 0x28, 0x4b, 0xee, 0xd3, 0xe4, 0xe1, 0x10, 0x01, 0xdf, 0xa3, 0xf2, 0x20, 0x74, 0x4e, 0xf0, 0x6d, 0xfd, 0xa8, 0x43, 0x8a, 0xa1, 0x09, 0x78, 0x23, 0x6d, 0x1b, 0x20, 0xd2, 0xa6, 0xde, 0xca, 0x40, 0x5e, 0xef, 0x2e, 0x8e, 0x46, 0x09, 0xab, 0xf3, 0xc3, 0xcc, 0xf4, 0xa6, 0x44, 0xbd, 0x06, 0xfe, 0xd2, 0x8f, 0x5d, 0xd7, 0xe9, 0xa1, 0x67, 0x39, 0x86, 0xc7, 0x39, 0x34, 0x81, 0x4d, 0x81, 0x0e, 0x1d, 0x39, 0xbb, 0xa1, 0xde, 0xd1, 0xa8, 0xfe, 0x9a, 0x5d, 0xfc, 0x56, 0xd3, 0x2e, 0x57, 0x1b, 0x44, 0xdf, 0x77, 0x62, 0xba, 0xdb, 0xac, 0x8c, 0x25, 0x1f, 0x8c, 0x25, 0xef, 0x42, 0xe7, 0x0c, 0x8c, 0xb2, 0xfe, 0xd4, 0x53, 0x40, 0xef, 0x6b, 0x8c, 0xdf, 0x74, 0xf9, 0xca, 0xa8, 0xcd, 0x0b, 0x7b, 0x22, 0xfb, 0xf1, 0xbd, 0xc1, 0x2f, 0x64, 0x73, 0xac, 0x82, 0x6d, 0x98, 0xc3, 0xe6, 0x82, 0xd4, 0xe1, 0x5d, 0xf1, 0x4d, 0x5e, 0x69, 0x82, 0xc0, 0xd9, 0xc3, 0x57, 0xd0, 0x34, 0x4f, 0x18, 0x9e, 0xdf, 0x50, 0x4d, 0x99, 0x5a, 0xd9, 0x0b, 0x98, 0xf5, 0x84, 0xd3, 0x26, 0xdb, 0x65, 0xb7, 0x1c, 0x4e, 0x41, 0xbe, 0x76, 0x34, 0xfc, 0x8a, 0x5f, 0xd3, 0x51, 0x38, 0x8e, 0xd9, 0xc6, 0x88, 0xd5, 0x9f, 0xde, 0x3e, 0xf7, 0xae, 0x90, 0xc8, 0xbb, 0x83, 0xf8, 0x20, 0x3e, 0x8f, 0x4d, 0xf4, 0x8d, 0x82, 0x13, 0x05, 0x73, 0xc9, 0x91, 0xcd, 0x90, 0x55, 0x86, 0x64, 0xab, 0x9f, 0x18, 0xa4, 0x4a, 0xe9, 0x0d, 0x8c, 0x7f, 0xc6, 0x3d, 0xe2, 0x04, 0xdc, 0x47, 0x1c, 0x8a, 0xe9, 0x84, 0x81, 0x4f, 0x04, 0x39, 0x8c, 0xef, 0x26, 0x11, 0x91, 0x7c, 0xe8, 0xca, 0xa2, 0xd0, 0x8e, 0x2e, 0xb4, 0x22, 0x45, 0x45, 0xfe, 0xd8, 0xa9, 0xc9, 0xa2, 0x9c, 0x8a, 0xda, 0x8f, 0xb2, 0xf0, 0xf3, 0xa6, 0x89, 0x5c, 0x1d, 0x1c, 0x90, 0x51, 0x62, 0x1f, 0x4a, 0x13, 0x85, 0xbc, 0xa5, 0xaf, 0xf0, 0x00, 0x88, 0x3b, 0xee, 0x5d, 0xab, 0x5f, 0x1a, 0x50, 0xab, 0x15, 0x18, 0x41, 0x5e, 0xac, 0x82, 0xab, 0x64, 0x13, 0x25, 0x7c, 0xfe, 0x54, 0x6e, 0xbf, 0x23, 0x5f, 0x1f, 0x78, 0xd1, 0x09, 0x46, 0xcf, 0xa2, 0x54, 0x70, 0x71, 0x9f, 0xf1, 0x1a, 0x34, 0x58, 0x03, 0x68, 0xfa, 0x35, 0x26, 0x1a, 0xd7, 0x07, 0xb0, 0xbb, 0x76, 0xe2, 0x37, 0x1b, 0xb8, 0x2f, 0x53, 0x00, 0x9f, 0xfd, 0xa4, 0x19, 0x6b, 0x98, 0x17, 0x33, 0x02, 0x5d, 0x66, 0xaf, 0x95, 0xcc, 0xde, 0x34, 0x81, 0xdf, 0x65, 0xa1, 0x73, 0x9a, 0xbb, 0x46, 0xd0, 0xe4, 0x00, 0x53, 0x54, 0x95, 0x77, 0x90, 0xf9, 0xd0, 0x89, 0x4f, 0x1a, 0x93, 0x0d, 0xa0, 0xd8, 0x8c, 0xc6, 0xc3, 0xbd, 0x2f, 0x2d, 0xe3, 0x9f, 0x05, 0x71, 0x01, 0xc7, 0x47, 0xbd, 0x2e, 0x53, 0xab, 0xb9, 0xfd, 0xd9, 0x7e, 0x53, 0x38, 0x4d, 0xf3, 0xbf, 0xd2, 0x25, 0xbb, 0xbc, 0x1d, 0xba, 0xd5, 0x1a, 0x3d, 0xf2, 0xa8, 0x79, 0xdd, 0x1c, 0x4f, 0x53, 0x20, 0x1b, 0x34, 0x3d, 0xda, 0xc7, 0xe0, 0x69, 0x01, 0x90, 0x11, 0x70, 0x5e, 0x65, 0x0d, 0x4e, 0x88, 0xd4, 0x37, 0xae, 0x13, 0x72, 0xe0, 0x69, 0x05, 0x7d, 0x5f, 0x49, 0x89, 0xc0, 0x64, 0x12, 0xe8, 0xb7, 0x89, 0xc3, 0xb4, 0xf4, 0x2a, 0x19, 0x47, 0xc1, 0x77, 0x55, 0x6c, 0x07, 0xc7, 0x3f, 0x5b, 0x6e, 0x30, 0x6b, 0xeb, 0xc6, 0x54, 0xbb, 0x03, 0xa6, 0x7d, 0x25, 0x51, 0x52, 0xed, 0xb6, 0x3f, 0xe2, 0x6f, 0xd7, 0x23, 0xa1, 0x32, 0xd0, 0xb6, 0xb4, 0xd7, 0x8a, 0xc8, 0xfc, 0xc9, 0x99, 0x32, 0x3d, 0xcd, 0x79, 0x0b, 0x7f, 0xda, 0x18, 0x1f, 0xb4, 0x2a, 0x95, 0x9c, 0x9c, 0x91, 0x48, 0x0f, 0xe6, 0x0e, 0x02, 0x8f, 0x98, 0xa0, 0x96, 0x38, 0xb0, 0x5a, 0x98, 0xdc, 0x0b, 0xba, 0x64, 0xf4, 0x87, 0x37, 0x62, 0xdd, 0x65, 0x19, 0x89, 0x41, 0xf1, 0x8d, 0x22, 0xd3, 0x64, 0xf9, 0xcf, 0x3f, 0x09, 0x8d, 0xcb, 0x60, 0x9f, 0x1b, 0x73, 0xb4, 0xff, 0x28, 0x06, 0x0e, 0xfe, 0x43, 0xa9, 0x8b, 0x95, 0x95, 0xae, 0xc7, 0x3f, 0xba, 0x15, 0x51, 0xa3, 0xcf, 0x53, 0x5c, 0x73, 0xcc, 0x53, 0xb7, 0x94, 0x14, 0xbb, 0xff, 0x7f, 0x4b, 0x70, 0x13, 0xe7, 0x68, 0x5c, 0xc8, 0x9c, 0x0b, 0x6f, 0xde, 0xaf, 0x10, 0xe3, 0x33, 0xd7, 0x64, 0xc5, 0x37, 0x13, 0x17, 0xb1, 0xa0, 0x91, 0xb3, 0xdd, 0x5f, 0xcf, 0xcd, 0x58, 0xd2, 0x00, 0xd9, 0x94, 0x3b, 0xb1, 0x43, 0x23, 0x71, 0xac, 0xbb, 0xbe, 0xd5, 0x1c, 0xd0, 0x8b, 0x88, 0xf3, 0xc0, 0xa0, 0xdb, 0x89, 0x8e, 0xc3, 0x07, 0x85, 0x56, 0x73, 0x1f, 0x01, 0xde, 0x2d, 0x42, 0xe9, 0x6d, 0xe8, 0x15, 0xa4, 0xe0, 0xe2, 0x70, 0xf7, 0xfa, 0x9e, 0x58, 0x26, 0xfc, 0x2d, 0x2e, 0x5c, 0x75, 0xae, 0x25, 0x4c, 0x5c, 0x11, 0xfa, 0x19, 0x5c, 0x20, 0xdf, 0x73, 0x6f, 0xbf, 0xb8, 0x04, 0xae, 0x72, 0x89, 0x0a, 0x68, 0x21, 0x2f, 0x45, 0x71, 0x18, 0x4f, 0x13, 0xbc, 0x52, 0x8d, 0xda, 0x2c, 0xf7, 0xfe, 0xa6, 0xa8, 0x23, 0xdf, 0x13, 0x6e, 0xe9, 0x87, 0x6e, 0xa9, 0x98, 0x9a, 0x17, 0x45, 0x3c, 0x80, 0x29, 0x02, 0x68, 0x15, 0x5d, 0xc7, 0x33, 0xa2, 0x2c, 0x3a, 0x81, 0x0d, 0x34, 0x8d, 0x84, 0x4c, 0xdd, 0x9a, 0x82, 0x1f, 0x3c, 0x33, 0xd8, 0xff, 0x38, 0xb3, 0x3f, 0x51, 0xeb, 0xd9, 0x4e, 0xe0, 0x4b, 0xd7, 0x40, 0x8a, 0x09, 0xa5, 0xf8, 0x3a, 0xb9, 0x9b, 0x42, 0x16, 0x34, 0x3f, 0x5c, 0xf9, 0x3a, 0x5c, 0xb5, 0x23, 0x5c, 0x54, 0xf4, 0x2f, 0x19, 0xb6, 0x3c, 0x46, 0x48, 0x13, 0xae, 0x93, 0xb6, 0x0e, 0x30, 0xf6, 0x0f, 0xb3, 0x6d, 0xfd, 0x02, 0x0a, 0x1d, 0x10, 0xa0, 0xeb, 0x87, 0xeb, 0x05, 0x13, 0x44, 0x52, 0x3b, 0x78, 0x45, 0xff, 0x5b, 0xda, 0x18, 0xe0, 0xf5, 0x9b, 0x66, 0x7f, 0xb2, 0xd0, 0xc1, 0xc2, 0x38, 0x98, 0x9c, 0xd4, 0x4e, 0xad, 0x9b, 0x63, 0x41, 0x38, 0x0e, 0x0c, 0x86, 0xea, 0xb8, 0x13, 0xa0, 0x48, 0xd4, 0x58, 0x45, 0x46, 0x5a, 0x86, 0xbc, 0x18, 0x7e, 0x8e, 0x89, 0x45, 0x79, 0x54, 0x4c, 0xfd, 0x8d, 0xa7, 0xe7, 0xac, 0x43, 0x77, 0xdf, 0xcf, 0xf8, 0x42, 0x05, 0x07, 0x97, 0xd0, 0x55, 0x6b, 0xa8, 0x20, 0x1e, 0x23, 0x8a, 0xa2, 0x63, 0x33, 0xfc, 0xa7, 0x81, 0x94, 0xe3, 0x15, 0x13, 0x89, 0x47, 0x5f, 0x13, 0x30, 0x9e, 0xb4, 0x42, 0x57, 0x4d, 0x77, 0xc9, 0x92, 0x6c, 0xf0, 0x20, 0x8a, 0xc9, 0x41, 0x2f, 0x98, 0x30, 0x9b, 0xb3, 0x93, 0xea, 0xb1, 0xe4, 0xe6, 0x84, 0x6d, 0x55, 0xe5, 0xd2, 0xe2, 0x1b, 0x61, 0x32, 0x83, 0x31, 0x79, 0x15, 0x92, 0x1b, 0xb4, 0xbc, 0xdb, 0xca, 0x4d, 0x40, 0xa1, 0xc0, 0xce, 0xd5, 0xd9, 0x74, 0xe0, 0x4f, 0x96, 0xf8, 0x62, 0xe6, 0xc5, 0xd9, 0xb8, 0x36, 0x1a, 0x47, 0x66, 0x8a, 0x4a, 0x75, 0xdd, 0x59, 0x7b, 0x43, 0x94, 0x11, 0xf8, 0x1b, 0x5b, 0x14, 0x2a, 0x18, 0xed, 0x00, 0xc4, 0x6e, 0xc4, 0x34, 0x3d, 0x06, 0x31, 0x90, 0x83, 0x68, 0xab, 0x7b, 0xee, 0xde, 0x68, 0x2b, 0x72, 0xd6, 0x2a, 0x21, 0x1a, 0x89, 0x5c, 0xf2, 0xb1, 0xda, 0x5d, 0x4d, 0xc2, 0x81, 0x1c, 0x3a, 0xc4, 0x68, 0xe5, 0xa0, 0x8e, 0x55, 0x7a, 0x0a, 0x11, 0xca, 0x66, 0xaa, 0x45, 0x2a, 0x8e, 0x9f, 0x64, 0x1c, 0x09, 0x73, 0x57, 0x34, 0x31, 0xe8, 0x6d, 0xd1, 0xfa, 0xf4, 0x53, 0x41, 0x83, 0x0a, 0x41, 0x2c, 0xeb, 0x9b, 0x71, 0x2f, 0x66, 0xdd, 0xd5, 0xc7, 0x90, 0xcb, 0x09, 0x71, 0x01, 0x6d, 0x87, 0x0f, 0x21, 0x59, 0x1a, 0x8e, 0x3d, 0x7a, 0x95, 0xc6, 0xdb, 0x10, 0xc4, 0xa1, 0x4b, 0xf8, 0xa3, 0x80, 0x7f, 0x2e, 0xce, 0xda, 0x1d, 0x90, 0x39, 0x26, 0xd1, 0xe4, 0x21, 0xfc, 0xe8, 0x1d, 0x42, 0x77, 0x1b, 0xda, 0x4b, 0xdd, 0xa8, 0x30, 0x8f, 0x82, 0xa8, 0xa9, 0xfd, 0xe9, 0x9c, 0x8c, 0x52, 0x2d, 0x49, 0x5f, 0x8d, 0x9f, 0xc6, 0xab, 0xa3, 0xb1, 0xd3, 0xff, 0x75, 0x13, 0x6c, 0x37, 0xff, 0x1b, 0x9e, 0xfe, 0xd2, 0x6a, 0x9a, 0x92, 0xc4, 0xcd, 0x08, 0xc8, 0xe6, 0x61, 0x9d, 0x4f, 0xb6, 0xfb, 0xf0, 0x38, 0x96, 0xc6, 0x89, 0xb6, 0x7d, 0x2e, 0x3b, 0x23, 0xed, 0xfd, 0xb5, 0x44, 0x25, 0xc4, 0x53, 0xce, 0x97, 0x7d, 0x3a, 0x29, 0x9c, 0x6e, 0xa3, 0x73, 0x67, 0x51, 0x77, 0xc8, 0x37, 0xb1, 0x1d, 0xc1, 0xd1, 0x97, 0x8f, 0x3a, 0x2e, 0x66, 0xb4, 0x59, 0x71, 0x04, 0xea, 0xcc, 0x1c, 0x3a, 0xe1, 0x51, 0x82, 0x5e, 0xb0, 0x7c, 0x80, 0x2f, 0x22, 0xb5, 0x68, 0x00, 0x51, 0x80, 0x3e, 0x19, 0x77, 0x01, 0x27, 0x5a, 0x00, 0xbf, 0x1e, 0x21, 0xe4, 0xa8, 0xe9, 0x6e, 0x33, 0x55, 0x4b, 0x45, 0xf2, 0x90, 0x7c, 0x54, 0x25, 0x13, 0xd6, 0xd6, 0x2d, 0x93, 0xd1, 0xb7, 0x54, 0xfd, 0x31, 0xf9, 0xa7, 0x00, 0x7e, 0x56, 0x04, 0xcb, 0xb5, 0x27, 0x73, 0x18, 0x3d, 0x84, 0xb9, 0x69, 0x1c, 0xad, 0x2b, 0x91, 0x6b, 0xa8, 0xc1, 0x77, 0x07, 0x2c, 0x6b, 0x17, 0x8a, 0xbe, 0xa8, 0xc9, 0x7a, 0x1a, 0x54, 0xc6, 0xc0, 0xd4, 0xc1, 0xe8, 0x5b, 0x3f, 0x0a, 0xb1, 0x55, 0x8e, 0xa4, 0x8f, 0xf6, 0x39, 0x36, 0x5e, 0x39, 0xa3, 0xab, 0x2f, 0x7c, 0xf9, 0x85, 0x48, 0x7b, 0x5d, 0x74, 0x6c, 0x7f, 0x44, 0x27, 0x5c, 0xd3, 0x1c, 0x62, 0x9d, 0x78, 0x33, 0x51, 0x7c, 0x19, 0xd4, 0x1c, 0x50, 0x41, 0xb3, 0xbb, 0xff, 0xcc, 0x8a, 0x0c, 0xc3, 0x9c, 0x05, 0x22, 0x2e, 0x8d, 0xdc, 0xe0, 0x6c, 0xaa, 0x3e, 0xc7, 0xc9, 0xa1, 0x76, 0x0d, 0x72, 0x74, 0xc9, 0xef, 0x80, 0x72, 0x9d, 0x48, 0x32, 0x66, 0xe1, 0x61, 0x7a, 0x0e, 0xa8, 0x0b, 0xbc, 0xce, 0x17, 0xeb, 0xd2, 0xa6, 0x82, 0x16, 0x53, 0x62, 0xd2, 0xde, 0x15, 0x10, 0x2a, 0xeb, 0xf0, 0xb7, 0xca, 0x8d, 0xc5, 0x46, 0x33, 0x50, 0xbf, 0xcb, 0x8b, 0xd1, 0xd9, 0xe5, 0x44, 0xd1, 0xa1, 0x7c, 0xf9, 0x88, 0x3b, 0xaf, 0x98, 0x3b, 0xa8, 0x0e, 0xc6, 0x11, 0x49, 0x0a, 0x7f, 0x23, 0x9e, 0xa9, 0xfd, 0xd2, 0x54, 0x7f, 0xdc, 0x5d, 0x7f, 0xd9, 0x7b, 0xb3, 0x24, 0x3b, 0xa5, 0x85, 0xfa, 0x0d, 0x71, 0xa0, 0x71, 0x91, 0x66, 0x7a, 0xf4, 0x18, 0xe3, 0x0a, 0x6b, 0x76, 0xbe, 0xdd, 0x05, 0xb3, 0x2c, 0x67, 0x34, 0x03, 0xe1, 0x97, 0xf9, 0xf8, 0x78, 0xae, 0x61, 0xf7, 0x14, 0x50, 0x50, 0xe9, 0x48, 0xdb, 0x7d, 0x32, 0x34, 0xf9, 0xbe, 0xe7, 0xf1, 0x71, 0x86, 0x3b, 0x30, 0x43, 0xab, 0x3b, 0x1d, 0xf3, 0x6d, 0xbc, 0x8a, 0x25, 0xb5, 0x91, 0x49, 0x6a, 0x9a, 0x01, 0xd9, 0x5a, 0x29, 0x78, 0x46, 0xe3, 0x66, 0x7c, 0x4a, 0xe0, 0x8e, 0xe3, 0xb8, 0xed, 0x9f, 0x43, 0x1a, 0x7a, 0x1a, 0xab, 0x99, 0x1f, 0x08, 0x90, 0x1e, 0x2f, 0x3b, 0x0a, 0xb7, 0x90, 0xd6, 0x41, 0x3c, 0xca, 0x10, 0x21, 0x32, 0x5d, 0x34, 0x56, 0xef, 0x58, 0xec, 0x74, 0xff, 0x27, 0xc0, 0x75, 0xc7, 0xad, 0xda, 0x69, 0x68, 0x93, 0x0c, 0x69, 0xe7, 0xdf, 0x14, 0xcd, 0x8a, 0xc8, 0x1e, 0x9f, 0x85, 0xc8, 0x8a, 0x4f, 0xd5, 0xf4, 0xf0, 0xa7, 0x6d, 0x89, 0x61, 0x02, 0x90, 0xc7, 0xf0, 0xb9, 0x7e, 0x02, 0x71, 0xdf, 0x52, 0xf6, 0x81, 0x2e, 0x2b, 0x5b, 0xc7, 0x40, 0x8a, 0xb9, 0x79, 0x03, 0xfb, 0x7e, 0x21, 0x67, 0xf8, 0x4e, 0xa1, 0x59, 0x0a, 0x9a, 0x74, 0xf5, 0x31, 0x74, 0x38, 0xf7, 0x86, 0xa1, 0x69, 0x73, 0x1f, 0xf0, 0x70, 0xc7, 0x33, 0xcb, 0xdc, 0xcd, 0x7e, 0x0c, 0xef, 0x55, 0xe7, 0x12, 0x5c, 0xd2, 0x61, 0x13, 0x4f, 0x53, 0x0f, 0xb3, 0xae, 0xb5, 0xab, 0xd6, 0x9e, 0x17, 0x28, 0xb3, 0x4a, 0x8f, 0x96, 0x2b, 0xe0, 0x1b, 0x47, 0x58, 0xdb, 0xdb, 0x30, 0x68, 0x88, 0x7d, 0x91, 0xac, 0xc3, 0xf8, 0xd9, 0xec, 0x02, 0x7d, 0xc4, 0xfe, 0x96, 0xaa, 0xc6, 0x96, 0x2d, 0x02, 0xac, 0x60, 0x9a, 0x9a, 0x81, 0x4c, 0xd9, 0x14, 0xae, 0x2a, 0x4d, 0xd1, 0x66, 0x76, 0x4d, 0x63, 0x41, 0x75, 0xdf, 0x41, 0x27, 0x81, 0xc3, 0xbf, 0x70, 0xa0, 0xb4, 0x3d, 0x49, 0x5c, 0xea, 0x9e, 0x5a, 0xcf, 0xe3, 0xfc, 0xa6, 0xfe, 0x63, 0x99, 0xb2, 0x68, 0xba, 0x19, 0xe9, 0xde, 0x45, 0xef, 0x3f, 0x94, 0x37, 0x16, 0x15, 0x79, 0x99, 0x01, 0x5c, 0xc4, 0x90, 0xd4, 0xfe, 0xcf, 0xdf, 0xd4, 0x79, 0x29, 0xac, 0x1c, 0xcd, 0xe7, 0x87, 0x93, 0x99, 0x3a, 0xa8, 0x1a, 0x81, 0x47, 0x78, 0x0a, 0xd2, 0x32, 0x54, 0xdd, 0x69, 0x7c, 0x8d, 0x2b, 0xd1, 0x90, 0xb3, 0xd9, 0xab, 0x98, 0x13, 0x8d, 0x53, 0x95, 0x7e, 0x64, 0xc0, 0xaf, 0x4c, 0xe8, 0xac, 0xc9, 0xa1, 0x3c, 0xf5, 0x59, 0xef, 0x9a, 0x44, 0x77, 0xbc, 0x00, 0xec, 0x34, 0xa6, 0x25, 0x15, 0x2c, 0xa4, 0xb2, 0x19, 0x5f, 0x8e, 0xaf, 0x2e, 0x3c, 0xe0, 0x3b, 0x46, 0xff, 0xbb, 0x81 ],
+const [ 0xfc, 0xee, 0x0a, 0x4b, 0x78, 0x17, 0xf8, 0x84, 0x02, 0x16, 0x63, 0x50, 0xbb, 0xda, 0x8a, 0xc2, 0xf4, 0xbe, 0x6e, 0xa3, 0xe6, 0x69, 0x2c, 0x72, 0xa3, 0xf2, 0x89, 0xa9, 0x4d, 0x48, 0xcf, 0x42, 0x86, 0xd2, 0xd8, 0x7a, 0x27, 0x52, 0x68, 0xd5, 0x35, 0x0f, 0xc0, 0x62, 0x11, 0x33, 0x6f, 0x40, 0xee, 0x72, 0x6c, 0x61, 0x88, 0xec, 0x62, 0x8e, 0x14, 0x55, 0x4b, 0xab, 0x72, 0x53, 0x40, 0x3d, 0xaa, 0x27, 0x8f, 0x29, 0x96, 0x90, 0x0f, 0xbe, 0xdc, 0xec, 0xb0, 0xf6, 0x20, 0xa1, 0x56, 0xf9, 0x77, 0xbb, 0xe8, 0xe3, 0x1e, 0xd7, 0xa3, 0xc7, 0x6c, 0x3f, 0xb5, 0xf4, 0x05, 0x56, 0x07, 0x77, 0x51, 0x37, 0x5a, 0xe1, 0x2c, 0x99, 0x95, 0x4a, 0xdf, 0xf6, 0x5d, 0x95, 0x4f, 0xec, 0xe7, 0xf6, 0x75, 0xe3, 0x0a, 0xb2, 0x0e, 0xf0, 0x99, 0x26, 0x94, 0xf9, 0xef, 0x0b, 0x6c, 0x1a, 0xcb, 0xf8, 0x61, 0x48, 0x5f, 0x28, 0x51, 0x34, 0xa3, 0x7e, 0x26, 0x72, 0xef, 0xc6, 0x08, 0xdb, 0xc9, 0x3e, 0xd2, 0x30, 0xfc, 0x55, 0xc2, 0x00, 0xea, 0xb2, 0x74, 0xcb, 0x22, 0x78, 0x11, 0x67, 0x35, 0xc9, 0xc4, 0xa3, 0xc6, 0x89, 0x6d, 0x2b, 0xe1, 0x64, 0x9a, 0xab, 0x8e, 0x12, 0xb3, 0x37, 0xa5, 0xd9, 0x74, 0xeb, 0xe3, 0x54, 0xa0, 0xce, 0x3e, 0x74, 0xf4, 0xfc, 0x76, 0xc4, 0x5a, 0x05, 0xed, 0xf1, 0x60, 0x90, 0xb8, 0x89, 0xe8, 0x44, 0xf6, 0x03, 0x21, 0xe8, 0x60, 0x00, 0xb6, 0xc8, 0x22, 0xd0, 0x45, 0x5b, 0xea, 0x38, 0x12, 0x24, 0x3e, 0x72, 0xfd, 0xd6, 0x12, 0x76, 0xb1, 0xbb, 0x9a, 0x78, 0x1f, 0x56, 0x5d, 0xb2, 0x2b, 0x48, 0x8b, 0x63, 0xa4, 0x70, 0x90, 0x18, 0x7a, 0x56, 0xe9, 0x2a, 0x2b, 0xca, 0x36, 0x88, 0x7f, 0xc8, 0x91, 0xb6, 0x75, 0x9f, 0x1f, 0x16, 0x7d, 0x52, 0xe4, 0x67, 0xe7, 0x3f, 0xdc, 0x8b, 0x9c, 0xfe, 0x47, 0x8d, 0x0c, 0x8c, 0x44, 0xe2, 0x67, 0xa9, 0xa1, 0xef, 0x10, 0x7e, 0xf2, 0xcc, 0x4f, 0x83, 0xe0, 0x48, 0x46, 0xa0, 0xc4, 0x2d, 0x26, 0x93, 0x75, 0xc5, 0xa2, 0x91, 0x5d, 0x9c, 0xa4, 0x30, 0xd3, 0x88, 0x3f, 0x84, 0xa5, 0xe7, 0xe6, 0x88, 0xf3, 0x28, 0xdb, 0xc0, 0x44, 0x8d, 0xe9, 0x1d, 0xd3, 0x2e, 0x56, 0x21, 0x2a, 0x42, 0x14, 0x43, 0xf2, 0x9a, 0x37, 0x95, 0x0a, 0x6e, 0xac, 0xa4, 0xd6, 0x5c, 0x27, 0xa0, 0xda, 0xae, 0x5d, 0xbd, 0x87, 0xdc, 0x74, 0xd8, 0x54, 0x51, 0xb7, 0x5e, 0x11, 0x72, 0x8f, 0x6a, 0x78, 0xdd, 0xae, 0x2d, 0x06, 0xee, 0x8e, 0x93, 0x09, 0x88, 0x1a, 0x23, 0xf9, 0x12, 0xab, 0x28, 0x0b, 0xbf, 0x35, 0x0e, 0x04, 0x13, 0xc3, 0x0e, 0x4b, 0xa3, 0x20, 0x0e, 0x43, 0x1c, 0xd7, 0xc2, 0xd7, 0x86, 0x5e, 0x18, 0x57, 0xca, 0x8f, 0xd3, 0x82, 0x72, 0x57, 0x75, 0xe4, 0xb1, 0xb2, 0x63, 0x62, 0xa3, 0xd7, 0x44, 0x13, 0xd5, 0xaf, 0xaa, 0x51, 0x08, 0x8c, 0xf4, 0x10, 0x32, 0x18, 0x73, 0x6f, 0xc6, 0x8c, 0xcb, 0x8d, 0x35, 0x22, 0x9c, 0x9e, 0xb5, 0xcc, 0x62, 0x3e, 0x41, 0x26, 0x9a, 0x04, 0xe1, 0xa9, 0x27, 0x5b, 0x2b, 0x22, 0xf3, 0x8d, 0x0a, 0x63, 0xd9, 0x21, 0xbe, 0x39, 0xc3, 0x67, 0x24, 0x9e, 0x0f, 0x51, 0x38, 0x2f, 0x38, 0x84, 0xd8, 0xe0, 0xb2, 0xaf, 0xcb, 0xee, 0x15, 0x1c, 0x01, 0x15, 0x7e, 0x85, 0x1c, 0x04, 0x32, 0x28, 0x30, 0x0e, 0x85, 0x1d, 0xc7, 0x22, 0xfb, 0xe8, 0x29, 0xfd, 0xac, 0x4b, 0xda, 0x9e, 0xed, 0x5e, 0x63, 0xfa, 0x2c, 0xe1, 0x55, 0xf2, 0x1c, 0xd0, 0x8c, 0x82, 0x13, 0x38, 0xb1, 0x3b, 0xb0, 0x4a, 0x02, 0xf3, 0xc0, 0xad, 0x56, 0xbb, 0x62, 0x19, 0x5b, 0x11, 0x6a, 0x22, 0x23, 0x57, 0x04, 0x51, 0xdf, 0x84, 0x9a, 0x79, 0xea, 0x1a, 0xf7, 0x48, 0x09, 0x58, 0xac, 0x1d, 0xf1, 0xb0, 0xb2, 0x19, 0x09, 0x7b, 0x52, 0x79, 0x72, 0xec, 0x42, 0x23, 0x45, 0x42, 0x11, 0x7e, 0x1b, 0x42, 0xc4, 0x87, 0xd3, 0xe5, 0xc2, 0x22, 0x8f, 0x4e, 0xed, 0xad, 0x00, 0xfe, 0x12, 0xdb, 0xe4, 0x4b, 0x83, 0xc0, 0xcc, 0x0e, 0x02, 0x28, 0x23, 0x9d, 0xe1, 0x2d, 0x6c, 0xf9, 0x68, 0x09, 0xcb, 0x48, 0x77, 0x28, 0xc7, 0x85, 0x6c, 0x82, 0x4e, 0x76, 0x47, 0x27, 0xf9, 0xde, 0x0d, 0x1b, 0x92, 0xf5, 0x6a, 0x65, 0xd4, 0x15, 0x99, 0x63, 0x71, 0xb6, 0x89, 0x60, 0x5a, 0x9c, 0x38, 0x68, 0x3a, 0x4f, 0x63, 0x5b, 0x43, 0xcc, 0x62, 0x41, 0x2e, 0x7a, 0x4e, 0xdd, 0x7d, 0x5f, 0x64, 0x85, 0x04, 0x94, 0xae, 0x31, 0xa7, 0xf6, 0xe0, 0xd1, 0x65, 0x1f, 0x80, 0xe4, 0x96, 0x95, 0x49, 0x46, 0x70, 0x40, 0xd2, 0x49, 0xd0, 0x22, 0x6b, 0x08, 0x38, 0x42, 0x47, 0xf8, 0x13, 0xe9, 0xe1, 0xc0, 0x41, 0x11, 0x98, 0x4b, 0xcf, 0x1b, 0x9c, 0x1b, 0x06, 0xc0, 0x0e, 0xe0, 0xa8, 0x4a, 0x63, 0x49, 0x76, 0x04, 0x0a, 0x1a, 0xf5, 0xef, 0x4e, 0x7f, 0x72, 0xb6, 0x7d, 0x9f, 0x44, 0xe4, 0x4a, 0x75, 0x51, 0x55, 0x70, 0xdb, 0xd4, 0xea, 0x98, 0xe8, 0x5d, 0x81, 0x7d, 0x7c, 0x19, 0x25, 0x4e, 0x19, 0x53, 0x81, 0x54, 0xf5, 0x3b, 0x9b, 0xd4, 0x4d, 0xe6, 0xbf, 0x37, 0xfb, 0x97, 0xb8, 0x68, 0x4b, 0x3d, 0x47, 0x7e, 0x0b, 0x3c, 0xcd, 0x9b, 0xe1, 0x70, 0x4b, 0x13, 0xe2, 0x6f, 0x8c, 0xd1, 0x5f, 0x0f, 0xa1, 0xf7, 0x02, 0x29, 0x8e, 0xc5, 0x1a, 0x9c, 0x43, 0xbc, 0x34, 0x94, 0xce, 0x03, 0xeb, 0x0c, 0xce, 0x09, 0x01, 0x91, 0x2b, 0x6c, 0xae, 0x49, 0x04, 0x1a, 0x37, 0x35, 0xe9, 0xb6, 0xc3, 0xb3, 0x4b, 0x3d, 0x6b, 0x47, 0x30, 0xe9, 0x90, 0x9a, 0x2b, 0x55, 0x71, 0xc3, 0x8c, 0xe3, 0xfc, 0xc6, 0xd4, 0x5b, 0xe5, 0x5a, 0x6c, 0xd4, 0xf6, 0xf0, 0x96, 0xd8, 0xa6, 0xf0, 0xa3, 0xc3, 0xec, 0x46, 0x67, 0x6c, 0x55, 0x1d, 0xea, 0x07, 0x55, 0xea, 0x60, 0x4a, 0xda, 0xad, 0x5b, 0xcf, 0x27, 0x74, 0x40, 0xba, 0xe0, 0x20, 0xf7, 0x9b, 0x61, 0x6b, 0xe7, 0x96, 0x54, 0x2a, 0x22, 0xc1, 0x83, 0xd0, 0xdc, 0xcd, 0xea, 0x34, 0x22, 0xe9, 0x11, 0x94, 0xc9, 0xe3, 0x99, 0xd9, 0xa4, 0x90, 0x14, 0x1c, 0xfa, 0x6f, 0x1a, 0x6a, 0x36, 0x89, 0x99, 0xc4, 0xe1, 0x9b, 0x6c, 0x6a, 0xce, 0x77, 0x2f, 0x5a, 0x94, 0xa8, 0x52, 0x13, 0x41, 0x55, 0x6d, 0x9e, 0x4d, 0x68, 0xd3, 0xcf, 0xcd, 0xee, 0x6a, 0xc9, 0xe9, 0xc1, 0xba, 0xc0, 0x90, 0x65, 0x43, 0x03, 0x6b, 0x31, 0x14, 0x39, 0x0f, 0xaf, 0x99, 0xea, 0x76, 0x45, 0xb5, 0x42, 0xb0, 0x14, 0x10, 0x12, 0xd6, 0x20, 0xb3, 0x18, 0x40, 0xb1, 0xd2, 0x80, 0xf7, 0xfa, 0xe8, 0xaa, 0x6d, 0xf9, 0x0a, 0x2e, 0x6c, 0x9e, 0x74, 0x1e, 0x4d, 0x2f, 0x69, 0x8b, 0x6a, 0xeb, 0x3a, 0x4a, 0xd6, 0xee, 0xa4, 0xf7, 0x4b, 0x54, 0x5e, 0x3b, 0x63, 0xa1, 0xf3, 0x4b, 0x0b, 0x61, 0xce, 0xb1, 0x35, 0x0b, 0x93, 0x4f, 0xce, 0x2b, 0xb6, 0xa1, 0xf0, 0xc0, 0x46, 0x42, 0x58, 0xe3, 0x09, 0xb2, 0x1a, 0xaa, 0xce, 0x56, 0x93, 0x4c, 0xff, 0xc0, 0xa0, 0x86, 0x76, 0x31, 0x0d, 0x3d, 0x91, 0x5c, 0x51, 0x64, 0x89, 0x6d, 0x78, 0x20, 0xff, 0x4a, 0x60, 0x2a, 0xd8, 0x19, 0x28, 0x76, 0x4b, 0x02, 0xe6, 0x12, 0x38, 0x36, 0x98, 0x50, 0xbc, 0x30, 0x5e, 0x27, 0x02, 0x3b, 0xe6, 0xd7, 0x5c, 0x34, 0x27, 0xcc, 0x92, 0x91, 0x52, 0xc5, 0x7a, 0xa2, 0x05, 0x35, 0xc8, 0x17, 0xc2, 0xe9, 0x28, 0xc3, 0xa1, 0xec, 0x8a, 0x9f, 0x41, 0xa8, 0xbd, 0x12, 0x04, 0x4d, 0x40, 0x6f, 0x7c, 0x77, 0x55, 0xc0, 0x20, 0x0b, 0x56, 0xc2, 0x44, 0x61, 0x4c, 0x30, 0x48, 0xa9, 0xbe, 0x44, 0x0f, 0x87, 0xc7, 0x7c, 0xb2, 0x01, 0x6b, 0x9a, 0x76, 0x9b, 0x2b, 0xee, 0xfc, 0xc0, 0xd7, 0xd7, 0xb8, 0x64, 0xa4, 0x88, 0xa4, 0xe8, 0x7f, 0x08, 0x36, 0x3e, 0xa0, 0x7c, 0x8f, 0x4d, 0x61, 0xa9, 0xf5, 0x97, 0x51, 0xb5, 0x83, 0x19, 0x84, 0x2d, 0x1f, 0x72, 0x2e, 0x4d, 0xad, 0x48, 0x70, 0x7b, 0x82, 0xe8, 0x72, 0x14, 0x1c, 0x2c, 0xb2, 0x6b, 0x10, 0xa2, 0x9c, 0x0f, 0x43, 0xea, 0x5a, 0x4d, 0x5d, 0x60, 0xed, 0xf6, 0x7b, 0xfc, 0x7d, 0x63, 0x25, 0x76, 0xed, 0xb5, 0x7f, 0xad, 0xb3, 0x61, 0xc3, 0x49, 0xe7, 0xed, 0xee, 0x9f, 0x99, 0xf4, 0xba, 0xd6, 0x68, 0x70, 0xcd, 0x48, 0x50, 0x39, 0x30, 0x2b, 0xc4, 0xc8, 0x02, 0x71, 0xfd, 0x41, 0x6e, 0xec, 0x91, 0xb1, 0xda, 0xb6, 0x47, 0x93, 0x61, 0xd0, 0x2a, 0x9a, 0x84, 0x09, 0xdc, 0xaa, 0x1c, 0x22, 0x2d, 0x27, 0x93, 0x2f, 0xec, 0x73, 0x54, 0x40, 0xfe, 0xb2, 0x80, 0x41, 0xac, 0xd1, 0xe3, 0x1f, 0x41, 0xc6, 0x26, 0x2d, 0xd5, 0x19, 0x46, 0xc5, 0x64, 0xa3, 0x45, 0x32, 0x23, 0x96, 0x1f, 0xcd, 0x13, 0xbd, 0xff, 0x67, 0xd6, 0x05, 0xb3, 0xe7, 0xc2, 0x3d, 0x5d, 0x34, 0x34, 0x1a, 0x6c, 0x56, 0x26, 0x7e, 0xcb, 0xd8, 0x04, 0xf9, 0x58, 0x70, 0xbc, 0x91, 0x98, 0xe2, 0x15, 0xbe, 0xa9, 0x21, 0x41, 0xb9, 0x78, 0xb7, 0xb5, 0xf6, 0x34, 0x68, 0x38, 0xef, 0x02, 0x12, 0x3a, 0x24, 0xf2, 0xd8, 0x68, 0x60, 0x31, 0x7f, 0x7d, 0x3d, 0x81, 0x18, 0x5b, 0xea, 0xe7, 0xe0, 0x5a, 0x2c, 0xa3, 0x64, 0xe0, 0xa3, 0x65, 0xe9, 0x32, 0x4f, 0xbe, 0x0a, 0x89, 0x53, 0xd5, 0xa3, 0x69, 0xf8, 0x5b, 0xee, 0x2e, 0xf4, 0xc1, 0xec, 0xe8, 0xed, 0xa8, 0x07, 0x68, 0x39, 0x99, 0xf5, 0x9b, 0xe8, 0xf6, 0xdf, 0x17, 0x04, 0x30, 0xc3, 0xf4, 0x17, 0x3b, 0x17, 0xdd, 0xee, 0x3f, 0xaf, 0x66, 0x9d, 0x91, 0xe0, 0xa0, 0xc3, 0xe1, 0xe6, 0xec, 0x0f, 0xb5, 0x83, 0x0c, 0x03, 0x16, 0xe9, 0x80, 0xf8, 0x88, 0xda, 0x0f, 0x63, 0x40, 0x0e, 0xa4, 0x56, 0x92, 0xd5, 0x5b, 0x4a, 0xa9, 0xfd, 0xdc, 0x1b, 0x7a, 0xf6, 0xe8, 0x54, 0xfa, 0x34, 0x31, 0xad, 0x8f, 0xd5, 0x6f, 0xd2, 0xc5, 0x84, 0xb0, 0x66, 0x43, 0x9d, 0xef, 0x48, 0xfd, 0x91, 0xe9, 0x15, 0xab, 0x8d, 0x2c, 0xee, 0x79, 0x56, 0x71, 0x7b, 0x00, 0x78, 0x2b, 0x2f, 0x75, 0x9f, 0x60, 0xce, 0x20, 0x45, 0xb8, 0x2d, 0x10, 0x8d, 0xd4, 0x3a, 0x0e, 0x6f, 0xe0, 0x3b, 0xcf, 0x16, 0x6c, 0x5b, 0x6e, 0x86, 0x77, 0x62, 0x19, 0x82, 0xcd, 0xc4, 0x0a, 0xad, 0x94, 0xdd, 0xb8, 0xef, 0x21, 0x7b, 0x4f, 0x1a, 0x10, 0x9d, 0x5e, 0xce, 0x93, 0x7a, 0xd0, 0x9a, 0x0a, 0xc5, 0x1e, 0x63, 0xd4, 0x30, 0xc3, 0x0a, 0x65, 0x2f, 0xef, 0x49, 0x99, 0xfe, 0x7f, 0xde, 0x48, 0xe5, 0x2d, 0xec, 0x1b, 0xbb, 0x04, 0x9e, 0x9e, 0xa9, 0x18, 0x0d, 0x96, 0x30, 0x73, 0x64, 0x94, 0x6d, 0x52, 0x42, 0xca, 0x9c, 0x92, 0x5f, 0x1e, 0xdc, 0x65, 0x73, 0x7d, 0x31, 0x49, 0x53, 0x72, 0xcf, 0x3b, 0x5d, 0xf7, 0x96, 0x27, 0x17, 0x8b, 0xd9, 0xa4, 0x13, 0x84, 0x63, 0xde, 0x16, 0xa7, 0xbc, 0xd3, 0x78, 0xf6, 0xa8, 0xc3, 0xce, 0xc9, 0xf1, 0xe1, 0xc7, 0x20, 0x66, 0x4f, 0x54, 0x38, 0x24, 0x49, 0x0c, 0x5c, 0x14, 0xa1, 0xce, 0xfe, 0xb5, 0x6b, 0xa8, 0x06, 0x1c, 0xf9, 0xf7, 0x6a, 0x39, 0x0a, 0xd0, 0xff, 0x5b, 0x3e, 0x9f, 0x8f, 0xf6, 0xcd, 0x0e, 0x2b, 0xa5, 0x79, 0x29, 0xc2, 0x6b, 0xc1, 0xbf, 0xf3, 0x3e, 0x58, 0x0b, 0x20, 0xc6, 0xd5, 0x93, 0xc4, 0x62, 0xac, 0x51, 0x06, 0x6c, 0x5d, 0x11, 0x8e, 0xbe, 0xeb, 0x1a, 0x97, 0x74, 0x90, 0x10, 0x45, 0xf4, 0xaf, 0x19, 0x39, 0x2c, 0x0a, 0x3f, 0x64, 0x1b, 0x35, 0x16, 0x18, 0x93, 0x4b, 0x9e, 0x65, 0x3d, 0xdf, 0x6a, 0xa2, 0xdd, 0x35, 0x02, 0x4a, 0xd7, 0xb2, 0x87, 0x0a, 0xf3, 0x92, 0x95, 0x17, 0x5d, 0xd9, 0x6d, 0xc5, 0xf0, 0x8c, 0x54, 0x56, 0xb3, 0x20, 0x36, 0x0f, 0xa4, 0x33, 0x8f, 0x92, 0xb5, 0x7a, 0x8c, 0x67, 0x15, 0xfb, 0x6d, 0xdc, 0xb0, 0x7c, 0x2d, 0x0f, 0xf9, 0x3b, 0x65, 0x49, 0xe7, 0xdf, 0x6e, 0x8d, 0x3d, 0xaf, 0xc5, 0x71, 0x0f, 0x02, 0xb4, 0x2d, 0x82, 0xf6, 0x2f, 0xf2, 0xd3, 0x65, 0xfd, 0x7d, 0x9b, 0x15, 0x18, 0xeb, 0x51, 0x2f, 0x55, 0xcf, 0x10, 0xf3, 0x47, 0x82, 0x9a, 0xa9, 0x61, 0xba, 0x9e, 0xdb, 0x5c, 0x5e, 0x36, 0xc1, 0xd8, 0x99, 0xb4, 0xfd, 0x46, 0x2e, 0x9e, 0x89, 0x05, 0x0b, 0xf7, 0xed, 0xcb, 0x20, 0xc0, 0xb5, 0x47, 0x71, 0xbf, 0x22, 0x05, 0x6a, 0x7f, 0x20, 0x91, 0x73, 0x98, 0x78, 0xdf, 0xc5, 0x30, 0x47, 0xea, 0x7c, 0xc2, 0xaf, 0x9c, 0xed, 0x1f, 0xcc, 0xee, 0x39, 0xb2, 0xe9, 0x50, 0x23, 0x07, 0xf4, 0x4b, 0x1e, 0x8f, 0x30, 0x65, 0xaa, 0x9d, 0x2a, 0x45, 0xe1, 0xb5, 0xee, 0x17, 0x4d, 0x06, 0x7a, 0x32, 0xfd, 0x35, 0x73, 0xf8, 0xd8, 0x5c, 0x17, 0xfe, 0x31, 0x53, 0x73, 0x6e, 0x9b, 0x2e, 0xd6, 0xa9, 0xfe, 0x06, 0x85, 0x30, 0xea, 0xfd, 0xb0, 0xc4, 0x2c, 0x7c, 0xa5, 0xcc, 0x9f, 0xbf, 0x44, 0xf8, 0x45, 0x94, 0xb3, 0x24, 0x96, 0x5f, 0x53, 0x7f, 0x18, 0x62, 0xf2, 0xec, 0x30, 0x3b, 0x42, 0xa8, 0x38, 0xae, 0x89, 0x2d, 0xd1, 0xa5, 0x9b, 0x57, 0x7b, 0x75, 0x06, 0xc6, 0x63, 0x63, 0x8c, 0x83, 0x7b, 0x67, 0xd6, 0xe6, 0xd0, 0x30, 0x66, 0xb7, 0x19, 0x67, 0xce, 0x93, 0x8b, 0x38, 0x1f, 0x91, 0xf5, 0x0f, 0xa5, 0x26, 0x08, 0x9f, 0xd1, 0x46, 0xf6, 0x29, 0x77, 0xcc, 0x40, 0xfb, 0x3a, 0x1c, 0xc8, 0x37, 0x44, 0x07, 0x2e, 0xd5, 0x3a, 0xef, 0x59, 0xeb, 0x6e, 0x2b, 0x54, 0x2c, 0x57, 0xac, 0x5c, 0xaf, 0x3f, 0xe1, 0x37, 0xf3, 0x3c, 0xd9, 0xc7, 0x1f, 0x61, 0xa8, 0xde, 0x8e, 0x35, 0x0b, 0x54, 0x8a, 0x64, 0x4f, 0x57, 0x58, 0xb5, 0x6e, 0x03, 0x76, 0x3c, 0x7c, 0x32, 0x20, 0xd1, 0x41, 0x96, 0x18, 0xc1, 0x28, 0x05, 0xa7, 0xc3, 0x58, 0x13, 0xdf, 0x2d, 0x20, 0xe6, 0x24, 0x67, 0x98, 0x46, 0xeb, 0xa0, 0x85, 0xf4, 0xc0, 0xc1, 0x7e, 0x3d, 0x8e, 0x9f, 0x4d, 0xce, 0x1b, 0x75, 0x98, 0xca, 0xd2, 0x91, 0xc1, 0x1a, 0xc5, 0x4d, 0x0a, 0x05, 0xf2, 0x41, 0xfd, 0x00, 0xc5, 0xb7, 0x0b, 0xc7, 0xdf, 0x5f, 0x73, 0xac, 0x16, 0x45, 0x65, 0x2f, 0xbd, 0xff, 0x67, 0xd0, 0x25, 0x2b, 0xf9, 0x21, 0x63, 0x19, 0x74, 0x1f, 0x54, 0xc4, 0x38, 0xc2, 0xdf, 0x07, 0x06, 0xd3, 0x7a, 0x0d, 0xab, 0xfe, 0xf0, 0x0a, 0xdf, 0x28, 0x61, 0x28, 0x6c, 0x03, 0x8a, 0xc5, 0x93, 0xdf, 0x46, 0xdb, 0xab, 0xc3, 0x55, 0xbf, 0x0b, 0xbc, 0x5d, 0x0f, 0x2a, 0x75, 0x2e, 0xe5, 0x05, 0x08, 0x4a, 0x51, 0xc1, 0x14, 0xa5, 0x07, 0x92, 0x10, 0xa9, 0x54, 0xdb, 0xde, 0x7d, 0x57, 0x97, 0xa3, 0x87, 0x6d, 0xf7, 0xd7, 0x30, 0xed, 0x4c, 0x98, 0xe7, 0x16, 0x28, 0x44, 0x68, 0x45, 0xc0, 0x46, 0x3e, 0x6b, 0x95, 0x30, 0x86, 0xbf, 0x54, 0x0b, 0xf7, 0xb0, 0xfa, 0xea, 0x1f, 0x1e, 0x3b, 0xc6, 0xef, 0xc9, 0x25, 0x85, 0x7a, 0x0a, 0x01, 0x5c, 0xfa, 0xc1, 0x7a, 0x57, 0x14, 0x8e, 0x01, 0x36, 0x5d, 0x44, 0x6f, 0x7b, 0x1c, 0x9a, 0xec, 0xc1, 0x52, 0x24, 0x10, 0x4f, 0xf7, 0x82, 0x49, 0xed, 0x87, 0xd8, 0x7d, 0xf7, 0xbd, 0x7e, 0xf0, 0xaf, 0x9e, 0xf8, 0x67, 0xd7, 0xba, 0x28, 0x8e, 0x80, 0xaf, 0xc2, 0x97, 0x1d, 0xee, 0x01, 0x24, 0xdb, 0xc2, 0x98, 0x67, 0x35, 0x8e, 0xec, 0x87, 0xc2, 0x56, 0x80, 0x46, 0x52, 0x80, 0xb0, 0xe2, 0x3a, 0xdc, 0xa3, 0x38, 0xec, 0xe3, 0x7b, 0x2f, 0xcb, 0x3c, 0xce, 0x54, 0x3d, 0x85, 0x5a, 0xc2, 0x01, 0x4f, 0xf4, 0x45, 0xc3, 0x6a, 0xc2, 0xbf, 0xed, 0x64, 0xaa, 0xca, 0xc1, 0x4c, 0x0a, 0x9e, 0xa5, 0xbb, 0xaa, 0x36, 0xbd, 0x16, 0xef, 0xae, 0xbf, 0x0d, 0x51, 0xf0, 0x03, 0x67, 0x0e, 0x8f, 0xda, 0x02, 0x20, 0xf3, 0x21, 0x15, 0x6d, 0xb7, 0x16, 0xb9, 0x3f, 0x4f, 0x6a, 0xa8, 0xf3, 0xee, 0x97, 0x44, 0xf5, 0xa6, 0x73, 0xdb, 0xec, 0xd2, 0x05, 0x29, 0x31, 0xb1, 0x98, 0x1e, 0x86, 0x53, 0x0f, 0xe2, 0x05, 0xb9, 0x78, 0x17, 0x56, 0x38, 0xe4, 0x5e, 0x25, 0x1e, 0x75, 0x1c, 0xd3, 0x98, 0xb8, 0x7e, 0x6c, 0xd3, 0x35, 0xba, 0xda, 0x62, 0x45, 0x98, 0x58, 0xe0, 0x24, 0x32, 0x29, 0xd6, 0x47, 0xf7, 0x89, 0xde, 0xf0, 0xf6, 0xe4, 0x09, 0xff, 0x5a, 0x46, 0x7f, 0x0b, 0x30, 0x13, 0x65, 0xb1, 0x71, 0xf8, 0x04, 0x2c, 0x3c, 0x21, 0x27, 0x26, 0x63, 0xac, 0xc4, 0xce, 0x29, 0x5e, 0xdf, 0x2b, 0x4a, 0x95, 0xac, 0xb0, 0x3c, 0x7e, 0xf4, 0x10, 0xb5, 0x88, 0xb9, 0x54, 0x6d, 0x19, 0x1d, 0x2a, 0x25, 0x7f, 0x80, 0x80, 0xe8, 0x29, 0xe9, 0x51, 0x91, 0x17, 0xa7, 0xbf, 0x8d, 0x8f, 0x38, 0x63, 0xe2, 0x12, 0x69, 0xe1, 0x70, 0x8e, 0xbf, 0xbf, 0x77, 0xd5, 0x16, 0x77, 0x5a, 0x4e, 0x88, 0xca, 0xa3, 0xea, 0x90, 0x58, 0x46, 0x5a, 0x6f, 0x6e, 0x2a, 0x80, 0xcf, 0x1f, 0xe5, 0x23, 0xa7, 0x96, 0xc8, 0xe6, 0x5e, 0xaa, 0x1b, 0x7b, 0x33, 0xb3, 0xa9, 0x14, 0xdc, 0x9c, 0x80, 0x1a, 0x6d, 0x3a, 0xf2, 0x22, 0x7c, 0xdc, 0xdf, 0x1d, 0x83, 0x24, 0x37, 0xce, 0x85, 0x15, 0xba, 0x82, 0xf5, 0x6c, 0x02, 0xfb, 0xd3, 0x34, 0xc4, 0xad, 0x18, 0x95, 0x53, 0x2d, 0x54, 0xed, 0x65, 0xe6, 0x96, 0x22, 0x1a, 0x0e, 0x8c, 0x36, 0x3a, 0xd8, 0xeb, 0x1b, 0xbe, 0xeb, 0x11, 0xc9, 0x93, 0x14, 0xea, 0x8f, 0x9a, 0x37, 0x10, 0xa6, 0xf3, 0x8c, 0x36, 0x0c, 0x7b, 0x07, 0xc6, 0x8f, 0x93, 0x18, 0xc9, 0x28, 0x24, 0x95, 0x08, 0x8b, 0xe0, 0xf5, 0x70, 0xfc, 0xca, 0xbe, 0xbb, 0x64, 0xf8, 0x40, 0x4d, 0xa4, 0x97, 0x84, 0x5c, 0x29, 0x31, 0x80, 0x54, 0xc1, 0x2b, 0x8c, 0x7a, 0xad, 0x92, 0x1a, 0xcf, 0xf7, 0x17, 0xa1, 0x37, 0x06, 0x57, 0xda, 0xda, 0x6f, 0x60, 0x2f, 0xcb, 0x0e, 0x71, 0x71, 0xe8, 0x56, 0x02, 0xc9, 0x01, 0xe5, 0x04, 0xf1, 0x3c, 0x5b, 0x6a, 0xa3, 0xb7, 0x6d, 0xe8, 0x52, 0x70, 0x35, 0xfb, 0x19, 0x62, 0xcc, 0x29, 0xf1, 0xf1, 0x1b, 0x8a, 0x26, 0x88, 0xee, 0x87, 0x0c, 0x81, 0x4a, 0xe2, 0xee, 0x45, 0x01, 0xf7, 0x47, 0xb4, 0x83, 0x41, 0x34, 0xc7, 0xf7, 0x1f, 0x2a, 0x73, 0x8b, 0xd8, 0xe4, 0xd1, 0x08, 0xdd, 0xa0, 0x7d, 0xa9, 0x4f, 0x8b, 0x3c, 0x2d, 0xc1, 0x7a, 0xe1, 0x2b, 0x3f, 0xda, 0x71, 0xa6, 0x8f, 0xea, 0x85, 0xe1, 0xb6, 0x28, 0xf0, 0x74, 0xbf, 0x08, 0xa2, 0xa0, 0xb7, 0xec, 0xcc, 0xe0, 0xfc, 0x51, 0x45, 0xc0, 0xb8, 0x46, 0x2d, 0xf2, 0xa8, 0x23, 0xd0, 0x9f, 0x22, 0x77, 0xcc, 0xfb, 0x56, 0x42, 0x77, 0x1c, 0xd4, 0x65, 0x7b, 0x0c, 0x4e, 0x56, 0xc3, 0x1d, 0x9f, 0x18, 0x9b, 0x7c, 0x0d, 0x6b, 0x12, 0x09, 0xcb, 0x40, 0xa3, 0x66, 0xc2, 0x6f, 0x15, 0x4e, 0x92, 0xac, 0xa0, 0x29, 0xd3, 0xb8, 0x51, 0xdd, 0xa0, 0xd4, 0xb0, 0xe6, 0x56, 0x7b, 0x9f, 0xa9, 0x99, 0x50, 0x85, 0x05, 0x98, 0x56, 0xac, 0x2c, 0x92, 0x5f, 0xe8, 0xb1, 0x9a, 0xc7, 0x7a, 0xe2, 0x97, 0x61, 0x33, 0x57, 0x8e, 0xb2, 0xdd, 0xcb, 0x24, 0x5d, 0xd6, 0x2b, 0x5e, 0xdf, 0xfe, 0xed, 0xac, 0x7c, 0xd3, 0xa3, 0x26, 0x79, 0xdb, 0xd0, 0x15, 0x8c, 0x43, 0xfa, 0xb5, 0x91, 0xc5, 0x00, 0x39, 0x7e, 0xcf, 0xae, 0x10, 0x99, 0xe1, 0x8f, 0x67, 0xe9, 0x36, 0x02, 0xef, 0xea, 0xa8, 0x90, 0xe0, 0x85, 0xce, 0x7d, 0x3e, 0x3e, 0x67, 0x9d, 0x5b, 0xb0, 0xfb, 0x69, 0x9d, 0x36, 0xbf, 0x52, 0x81, 0xec, 0xba, 0x56, 0xe0, 0xd6, 0x26, 0xd0, 0x71, 0x5e, 0x19, 0x94, 0x90, 0x04, 0x64, 0x3b, 0x3d, 0x51, 0xbb, 0xbc, 0x68, 0x0c, 0x17, 0x3d, 0x6c, 0xb1, 0x59, 0x28, 0xd9, 0x1f, 0x30, 0x80, 0x76, 0x91, 0x3c, 0x76, 0x86, 0xcf, 0x74, 0x37, 0x4b, 0xa6, 0xc5, 0x09, 0xc9, 0x95, 0xfb, 0x96, 0xcc, 0xc9, 0xe5, 0x87, 0x2c, 0x4c, 0xb4, 0x55, 0x50, 0x79, 0xa5, 0x5c, 0xf1, 0xb3, 0xe0, 0x32, 0x20, 0x56, 0x9f, 0x36, 0x8b, 0xee, 0x92, 0x6c, 0xfc, 0xa7, 0x83, 0x88, 0x22, 0x05, 0x36, 0x48, 0x94, 0xd5, 0x93, 0x07, 0x13, 0x64, 0x06, 0x90, 0x0f, 0xee, 0x27, 0x30, 0x6d, 0x59, 0x96, 0x0f, 0x88, 0x23, 0x29, 0xbf, 0x76, 0x9a, 0x4a, 0x16, 0x8c, 0x4b, 0x9a, 0x39, 0x24, 0xbc, 0xdb, 0xfa, 0x9d, 0x5e, 0x0c, 0x64, 0xa4, 0xbd, 0xd5, 0x93, 0xb2, 0xfa, 0x26, 0xca, 0xd6, 0x7b, 0x1c, 0xbf, 0xb5, 0xe1, 0x24, 0x39, 0xcf, 0x3a, 0x62, 0xdd, 0x04, 0x78, 0x54, 0x45, 0x56, 0x23, 0xb2, 0x53, 0xf0, 0x4a, 0x99, 0xc5, 0x68, 0xbf, 0xe9, 0x09, 0x41, 0x84, 0xec, 0x52, 0xb4, 0x80, 0x38, 0xeb, 0xaf, 0x76, 0xd6, 0xcc, 0x1f, 0x38, 0xa3, 0x6b, 0x6b, 0x18, 0xf7, 0xd4, 0x40, 0xa0, 0x85, 0xfc, 0x94, 0x83, 0x82, 0x52, 0xe5, 0xd2, 0x0a, 0x98, 0xc2, 0x73, 0xbf, 0xf1, 0x8d, 0xd0, 0xb3, 0x3b, 0x7f, 0xcc, 0x88, 0x9e, 0xec, 0xfb, 0xd5, 0x65, 0xc9, 0x12, 0xcc, 0x0d, 0x6b, 0x9c, 0x1a, 0x9c, 0x91, 0xef, 0x0f, 0x35, 0xa5, 0x5f, 0xff, 0xe8, 0x3f, 0xb1, 0xe8, 0xce, 0xeb, 0xd3, 0x54, 0x56, 0x2c, 0xca, 0x81, 0xda, 0xc1, 0xeb, 0xc0, 0x76, 0x26, 0x4e, 0x1b, 0x19, 0x5e, 0x80, 0x3a, 0xdc, 0xf0, 0x78, 0x88, 0x93, 0x30, 0xcc, 0x91, 0xa2, 0xbf, 0x25, 0xae, 0x13, 0x55, 0xf1, 0xe5, 0xe5, 0xbe, 0x57, 0x0b, 0xa6, 0x23, 0x70, 0x2b, 0x44, 0x8b, 0xb4, 0x2c, 0x20, 0xa1, 0xb2, 0xad, 0x64, 0xb8, 0x05, 0x34, 0x97, 0x0c, 0x83, 0x88, 0x6e, 0x4b, 0xb7, 0x5b, 0xe5, 0x54, 0x92, 0x2c, 0x8f, 0x3e, 0x5d, 0x6c, 0x2a, 0x9c, 0xf2, 0xe0, 0x77, 0xff, 0x2c, 0x46, 0x49, 0xbd, 0x9c, 0x3b, 0xdb, 0xf1, 0x7d, 0x5c, 0x66, 0xc3, 0xea, 0xac, 0xf3, 0xea, 0x4f, 0x36, 0x6e, 0x6f, 0x1e, 0xf3, 0xfd, 0xb3, 0xc3, 0xed, 0x90, 0xb3, 0xd9, 0xa5, 0xb8, 0x8b, 0x9e, 0xb2, 0xbc, 0x39, 0xa4, 0xac, 0xea, 0xa4, 0xca, 0x48, 0x2b, 0xdd, 0x6b, 0xc4, 0xda, 0xa4, 0xd5, 0x86, 0xd6, 0x2e, 0xfd, 0x00, 0xd6, 0x25, 0x71, 0xd6, 0xfd, 0xf1, 0x8d, 0x43, 0xaf, 0x36, 0xf2, 0xb9, 0xa2, 0x9d, 0x34, 0xc7, 0x38, 0xd8, 0xd3, 0x40, 0x0c, 0xe0, 0x6d, 0x9a, 0xca, 0x81, 0x31, 0x94, 0x45, 0x19, 0x97, 0x1b, 0xc3, 0x9d, 0x4e, 0x6f, 0x9b, 0xdc, 0x76, 0x82, 0x03, 0x08, 0x10, 0xa1, 0x23, 0x72, 0xb3, 0x55, 0x6e, 0x95, 0x80, 0x8c, 0x31, 0x56, 0x58, 0xf4, 0x6c, 0x8a, 0x4c, 0xa8, 0xe2, 0xb9, 0x54, 0x0e, 0x6c, 0x21, 0x44, 0xff, 0x92, 0xfe, 0xfd, 0x29, 0x5c, 0x09, 0xe0, 0xb2, 0x66, 0x3f, 0x89, 0x1e, 0x33, 0xe3, 0xb9, 0x73, 0xc3, 0xc6, 0x93, 0x9b, 0x68, 0xc6, 0x0c, 0x09, 0xd5, 0x95, 0x9d, 0xa0, 0x78, 0xbc, 0x3a, 0xd0, 0x0a, 0xdf, 0x88, 0x02, 0x64, 0x42, 0x4b, 0x36, 0x94, 0x8c, 0x1d, 0xea, 0x30, 0xcb, 0x66, 0x3e, 0xea, 0xb9, 0x88, 0x57, 0x65, 0x3e, 0x5a, 0x01, 0x47, 0x35, 0xd8, 0x98, 0x90, 0x73, 0x19, 0x28, 0x2a, 0x05, 0x81, 0xd3, 0xc0, 0xba, 0x37, 0x73, 0xd4, 0xe2, 0xd9, 0x81, 0x0c, 0x54, 0x6f, 0x36, 0xcd, 0xb6, 0x9e, 0xef, 0x0b, 0xf8, 0x1f, 0xd6, 0x60, 0x22, 0x6f, 0xbf, 0x5b, 0x50, 0xc7, 0x50, 0x1a, 0xfa, 0x4e, 0x65, 0x1b, 0x79, 0x8e, 0xb2, 0x4f, 0xc7, 0x24, 0xab, 0x70, 0x87, 0xbc, 0xa0, 0x95, 0x45, 0x3d, 0x2d, 0x04, 0xfe, 0x41, 0xd1, 0x47, 0xe3, 0xc8, 0xdd, 0x82, 0x5a, 0x2d, 0x90, 0x03, 0x46, 0x59, 0x80, 0x1b, 0x88, 0x36, 0x3b, 0x2c, 0xc6, 0x66, 0x2f, 0x04, 0x6a, 0x36, 0xc7, 0x69, 0xee, 0xcd, 0xd7, 0xf5, 0x58, 0xaa, 0x3a, 0x25, 0x00, 0x4d, 0xba, 0xac, 0x99, 0x33, 0x2f, 0x0d, 0x6f, 0x08, 0xeb, 0x68, 0xee, 0x19, 0x56, 0x94, 0x64, 0x08, 0xd6, 0x6f, 0x08, 0xc3, 0xf2, 0x72, 0x3a, 0xb6, 0xb6, 0x89, 0x0c, 0x40, 0x59, 0x21, 0x02, 0x64, 0x1d, 0x82, 0x16, 0xc2, 0x77, 0x5f, 0xff, 0xc5, 0x70, 0xab, 0xb3, 0x1d, 0x4b, 0xaf, 0x2b, 0x70, 0x68, 0x5a, 0x66, 0x4c, 0x68, 0xd8, 0xb0, 0x61, 0x92, 0x66, 0x24, 0xed, 0x75, 0x64, 0x70, 0x77, 0xcf, 0xab, 0xd8, 0xc0, 0xae, 0x22, 0x7e, 0xf7, 0xd5, 0x8c, 0xe0, 0x2c, 0x61, 0xa4, 0xa2, 0x07, 0xad, 0x6c, 0x8e, 0xba, 0x72, 0xc2, 0xd9, 0x34, 0x33, 0x34, 0xa7, 0x97, 0xd8, 0x15, 0xd2, 0xed, 0x99, 0xd0, 0xe7, 0x17, 0x1d, 0x7d, 0x72, 0x05, 0xe3, 0xb2, 0x7c, 0x2d, 0xe2, 0x9c, 0x51, 0x35, 0x6c, 0x4e, 0x87, 0xf3, 0x58, 0x58, 0x3b, 0x98, 0x60, 0x9c, 0x9e, 0x28, 0xc8, 0x5d, 0xb1, 0x2e, 0x41, 0x99, 0x4c, 0xad, 0x0c, 0x99, 0x65, 0x59, 0x62, 0xc6, 0x8f, 0x07, 0x14, 0xbe, 0xc1, 0x63, 0x6f, 0xa7, 0x59, 0xe1, 0x62, 0xc4, 0x60, 0xf6, 0xe3, 0x45, 0x10, 0x87, 0x8e, 0x64, 0x93, 0xa2, 0x8f, 0xad, 0x0e, 0x6c, 0xc3, 0x9d, 0xde, 0x5a, 0x1a, 0x6f, 0x22, 0xa4, 0x40, 0x33, 0x79, 0xf7, 0x7c, 0x20, 0x0d, 0x6b, 0xd8, 0x2b, 0xd0, 0xb4, 0x82, 0xd9, 0x05, 0x9c, 0x72, 0x51, 0x03, 0xb1, 0x4d, 0xb5, 0x35, 0x3a, 0x89, 0xb2, 0x66, 0x70, 0xd3, 0x56, 0x3b, 0xeb, 0xad, 0x22, 0x01, 0x5b, 0x5c, 0x61, 0xa9, 0x78, 0x01, 0xb8, 0x11, 0x3c, 0x06, 0xfd, 0x86, 0x4f, 0xbb, 0x4c, 0x86, 0xc3, 0x41, 0x58, 0xca, 0x01, 0xa8, 0x00, 0x84, 0x03, 0x54, 0x23, 0xe5, 0xc4, 0xa5, 0xb4, 0xe2, 0xf5, 0xd7, 0x11, 0x38, 0xf2, 0x26, 0x90, 0xad, 0xf4, 0x36, 0x5b, 0x99, 0x88, 0xb3, 0x7f, 0xa6, 0x40, 0x34, 0x3f, 0xd4, 0xa8, 0x66, 0xae, 0xc0, 0x7b, 0x66, 0x7d, 0x25, 0x17, 0x6e, 0x11, 0xa3, 0x2f, 0xb4, 0xd8, 0xbf, 0xc0 ],
+const [ 0xa2, 0x49, 0x53, 0xa8, 0x00, 0xe0, 0xb7, 0x3b, 0x45, 0x54, 0xd4, 0xbe, 0x70, 0xf6, 0xc1, 0xba, 0x76, 0x38, 0x3e, 0xbe, 0x38, 0xca, 0x47, 0xa6, 0xb2, 0x02, 0xe9, 0x1d, 0x75, 0x81, 0x55, 0x61, 0x57, 0x14, 0x33, 0x47, 0x69, 0xd8, 0x38, 0x7e, 0x29, 0xa2, 0xfb, 0x17, 0xf9, 0x9d, 0x04, 0x45, 0xd0, 0x35, 0x26, 0x62, 0x30, 0x34, 0x10, 0x33, 0x58, 0x2b, 0x1e, 0x6d, 0xba, 0x14, 0x75, 0x78, 0xaf, 0x35, 0x4e, 0x72, 0x6a, 0x48, 0x92, 0x77, 0x2a, 0xd8, 0xa8, 0x20, 0xb4, 0xee, 0x8a, 0x49, 0x01, 0xed, 0x1f, 0x18, 0x34, 0xbb, 0xc5, 0x3b, 0xcf, 0x21, 0x2c, 0x70, 0x25, 0x75, 0x6b, 0x4b, 0x13, 0x76, 0x4d, 0x34, 0xeb, 0x77, 0xec, 0xaf, 0xb1, 0xc0, 0x82, 0xe0, 0x8a, 0x31, 0x7b, 0x4e, 0x71, 0x28, 0xcf, 0xe7, 0x2c, 0xa5, 0x8e, 0x44, 0x7e, 0xac, 0xbd, 0x2f, 0x9f, 0xeb, 0x60, 0x62, 0xe9, 0x9d, 0xd8, 0x92, 0xd4, 0xae, 0x6f, 0xac, 0x24, 0x20, 0x32, 0x5f, 0x61, 0xad, 0xff, 0xda, 0x88, 0xae, 0xde, 0xd7, 0x00, 0x3b, 0x94, 0xd8, 0xcf, 0x94, 0x76, 0xb0, 0x0e, 0xbf, 0x7c, 0x46, 0x9a, 0x73, 0x96, 0x96, 0x0d, 0x35, 0x43, 0xf8, 0xed, 0xc1, 0x5f, 0xa5, 0x23, 0xab, 0x3c, 0x77, 0xae, 0x46, 0xf5, 0xf0, 0x98, 0xc5, 0xff, 0x7e, 0x29, 0xa0, 0x01, 0xfd, 0x5c, 0x3a, 0xe6, 0x7e, 0x8f, 0xc0, 0x30, 0x47, 0x7e, 0x54, 0x8f, 0x1b, 0x72, 0x6b, 0xb2, 0xbb, 0xb6, 0x73, 0x5d, 0xac, 0x4b, 0xba, 0xbc, 0x3b, 0xdc, 0x8b, 0xf7, 0xbf, 0xf4, 0x9a, 0x06, 0x1e, 0x6f, 0xa1, 0xc7, 0x92, 0x2f, 0x4c, 0x4d, 0xad, 0x10, 0x53, 0x7b, 0x9b, 0x1d, 0xe5, 0xd2, 0xa8, 0x04, 0x4d, 0x88, 0x01, 0xc7, 0xd0, 0xda, 0xbf, 0xb5, 0xd4, 0xa3, 0x21, 0x99, 0x48, 0x2c, 0x19, 0x31, 0x3f, 0x46, 0x0b, 0xe1, 0xde, 0x96, 0xd1, 0xa9, 0x79, 0x31, 0x02, 0x55, 0xf9, 0x69, 0x74, 0xf3, 0x81, 0xe6, 0xff, 0x8a, 0x51, 0xf8, 0x84, 0x09, 0xea, 0x2b, 0x2e, 0x7e, 0x72, 0x1c, 0xf8, 0x88, 0x5b, 0x8c, 0x70, 0x0f, 0x40, 0xb3, 0xba, 0x32, 0x0f, 0xd6, 0xd7, 0x81, 0x6d, 0x1c, 0x28, 0x6d, 0x56, 0x9e, 0x2d, 0xfc, 0x04, 0xbd, 0x93, 0xc2, 0x13, 0xb8, 0x6e, 0x0c, 0xe2, 0x7e, 0xc3, 0x5e, 0x3c, 0xc0, 0x49, 0x20, 0x38, 0x4b, 0x70, 0x94, 0x5d, 0x95, 0xa3, 0x0b, 0x0a, 0x95, 0xca, 0x59, 0x15, 0xd8, 0x14, 0x86, 0xb3, 0xd2, 0xf3, 0xc6, 0x98, 0x72, 0x68, 0xab, 0x5f, 0xf9, 0x80, 0x9a, 0x2b, 0x0b, 0x1f, 0x7c, 0x8f, 0x06, 0xfc, 0xb5, 0xab, 0x94, 0xed, 0x5a, 0x98, 0x7c, 0x65, 0x9e, 0x07, 0xbe, 0x3a, 0x8e, 0x24, 0xde, 0xac, 0xff, 0xc1, 0x80, 0xa4, 0xc4, 0xb0, 0x35, 0x39, 0x24, 0x70, 0x95, 0x78, 0x8b, 0x0d, 0x8e, 0x65, 0x7f, 0x41, 0xfb, 0x3d, 0xd6, 0xdf, 0x78, 0xfe, 0x26, 0x71, 0x75, 0x29, 0x7e, 0x20, 0x8a, 0xc7, 0x53, 0xd5, 0x0a, 0xaa, 0xbd, 0x9e, 0xdb, 0xf5, 0xe4, 0x53, 0x85, 0xdf, 0xb4, 0x79, 0x88, 0xb3, 0xd9, 0x66, 0xf3, 0x1b, 0xe7, 0xa6, 0x32, 0x9f, 0xd8, 0x9e, 0x28, 0x69, 0xbc, 0x6f, 0x7e, 0x4b, 0xac, 0x1e, 0x3a, 0x03, 0x00, 0xf1, 0x93, 0xbd, 0xc2, 0x1c, 0x03, 0xd9, 0x62, 0x9c, 0x9f, 0xef, 0xaa, 0x64, 0xa4, 0x10, 0xf5, 0xb7, 0x52, 0x4f, 0x9c, 0xd5, 0xfd, 0x80, 0xb2, 0xd9, 0x61, 0x40, 0xf1, 0xe2, 0x36, 0x36, 0xf3, 0x71, 0x04, 0x98, 0xa6, 0x12, 0x39, 0xf0, 0xfa, 0x3f, 0x79, 0x20, 0xdc, 0x81, 0x35, 0xa3, 0x68, 0xd8, 0x7f, 0x17, 0x5a, 0x5d, 0x1c, 0xf8, 0xc6, 0x26, 0xdb, 0xaf, 0x0a, 0x6a, 0x26, 0xcb, 0x00, 0xe5, 0xd7, 0x8e, 0x78, 0x7e, 0x4d, 0xab, 0xe5, 0x28, 0xbe, 0x4e, 0x56, 0x06, 0xce, 0x5d, 0xa8, 0xd2, 0x61, 0xfd, 0xfa, 0x7f, 0xae, 0x59, 0x62, 0x1d, 0x96, 0x9f, 0xde, 0xfe, 0x33, 0x4a, 0x8e, 0x17, 0xb3, 0xa7, 0x20, 0xa8, 0x67, 0x92, 0x8b, 0x20, 0x17, 0x81, 0x00, 0x3b, 0x99, 0xc5, 0x1d, 0x6d, 0xa1, 0x0c, 0x65, 0x83, 0xdb, 0x29, 0xed, 0x88, 0x37, 0x18, 0x57, 0xe5, 0x85, 0x3c, 0x04, 0xcd, 0x41, 0xec, 0x86, 0xd8, 0xb0, 0x2e, 0x54, 0xee, 0x2c, 0xc2, 0xc2, 0x67, 0xbb, 0x63, 0x30, 0x70, 0xe7, 0x49, 0x81, 0xb1, 0xca, 0xf2, 0xcf, 0x2d, 0x69, 0x22, 0x5c, 0x69, 0x43, 0x29, 0xcc, 0xd0, 0x29, 0x64, 0x92, 0x56, 0x4f, 0x06, 0xa9, 0x5c, 0xa4, 0x18, 0x84, 0xd3, 0x5f, 0xbf, 0x47, 0xa5, 0xda, 0xbe, 0x37, 0x50, 0xa4, 0x3b, 0x6f, 0xd4, 0xd2, 0xc6, 0xd6, 0xd0, 0x95, 0x97, 0x4d, 0xe8, 0x12, 0x17, 0x2d, 0x69, 0x6d, 0xa3, 0xf0, 0x30, 0x27, 0x8c, 0x2e, 0xc8, 0xab, 0x62, 0xcc, 0xd2, 0x23, 0x72, 0x70, 0xaa, 0x90, 0x8d, 0x37, 0x47, 0x1a, 0x0b, 0xab, 0x63, 0xa4, 0x10, 0xef, 0xdc, 0xa4, 0x0e, 0x3d, 0x5b, 0x32, 0x8b, 0x93, 0x33, 0x5f, 0x25, 0xa8, 0x8c, 0xc7, 0xd3, 0x25, 0xc0, 0x6a, 0x6d, 0x12, 0x05, 0xb7, 0x6f, 0x8e, 0x4d, 0xea, 0xfa, 0xc4, 0x6a, 0x98, 0x1b, 0x1a, 0x76, 0x88, 0x50, 0xab, 0x72, 0xc5, 0x48, 0xf8, 0x2d, 0xf1, 0xeb, 0xda, 0x67, 0xdc, 0x9a, 0xbc, 0x37, 0x56, 0xb8, 0x06, 0xaa, 0x41, 0x69, 0xdc, 0xad, 0xea, 0x99, 0x09, 0x2d, 0x99, 0x41, 0x36, 0x7c, 0x66, 0xe5, 0x60, 0xf7, 0x4f, 0x62, 0x89, 0xe6, 0x88, 0xe6, 0xad, 0xa3, 0x12, 0x40, 0xf7, 0xff, 0x8f, 0x5a, 0x35, 0xe1, 0x55, 0x03, 0x8a, 0x30, 0xc1, 0xf2, 0x62, 0xf3, 0xcd, 0x08, 0xab, 0xb7, 0xe5, 0xd6, 0x43, 0x31, 0xf7, 0x5f, 0xac, 0x25, 0xca, 0x1f, 0x07, 0x87, 0x90, 0x4c, 0x40, 0xdf, 0xbe, 0x5b, 0x86, 0xf2, 0x1b, 0xc6, 0xfe, 0x9e, 0x17, 0x0d, 0xb8, 0x06, 0x5f, 0xfb, 0xe2, 0xef, 0xae, 0x2a, 0x3b, 0x6a, 0xe6, 0xc9, 0xcb, 0xb4, 0x5f, 0x9d, 0xd2, 0x5a, 0x7f, 0x46, 0xfe, 0xa0, 0x8b, 0xc4, 0xe0, 0x24, 0xbc, 0x39, 0xa1, 0xbf, 0x96, 0xf0, 0xf1, 0xac, 0x75, 0x9f, 0x41, 0xec, 0x69, 0xe9, 0x32, 0xe8, 0x43, 0x27, 0x4d, 0x59, 0xf0, 0x68, 0xf4, 0x65, 0x06, 0xb6, 0x98, 0x0a, 0x9d, 0x9c, 0x2d, 0xc0, 0x60, 0xe5, 0xdb, 0x5a, 0xe4, 0xa5, 0xf7, 0x2e, 0x38, 0x7e, 0x31, 0x75, 0xbd, 0x1c, 0x0f, 0xf5, 0x37, 0x02, 0x9a, 0xdd, 0x25, 0x89, 0x57, 0xf0, 0x4e, 0x25, 0x78, 0xe5, 0x9d, 0xeb, 0x54, 0x0e, 0x2e, 0x50, 0x15, 0x39, 0xa9, 0x34, 0xb0, 0xd4, 0xcf, 0x1f, 0x1b, 0x54, 0x52, 0xca, 0xba, 0xd7, 0xea, 0xe1, 0x1a, 0x07, 0xa5, 0x07, 0xe1, 0x42, 0x7f, 0x1b, 0x05, 0xf9, 0x32, 0xb9, 0x3d, 0x56, 0x4f, 0x04, 0xb5, 0x22, 0x8e, 0xa3, 0x06, 0xe5, 0x62, 0x0a, 0x65, 0x4f, 0xd1, 0xfb, 0x1a, 0xd6, 0x83, 0x4c, 0x35, 0xa1, 0x19, 0xea, 0x7c, 0xa5, 0xc0, 0x1e, 0xa7, 0x0e, 0x05, 0x0f, 0xd0, 0xe0, 0xeb, 0x89, 0x25, 0xde, 0x3a, 0xfc, 0xe0, 0xab, 0x1b, 0xc8, 0x79, 0x2f, 0xe2, 0xb7, 0x19, 0x3c, 0x2b, 0xcb, 0x53, 0x71, 0x28, 0x3b, 0x0f, 0x5f, 0x39, 0xb8, 0xc6, 0xeb, 0xbd, 0xf4, 0xf5, 0xf3, 0x29, 0x65, 0xcb, 0x35, 0x57, 0x47, 0x25, 0x6c, 0x20, 0xe0, 0xbd, 0xbb, 0x2c, 0x07, 0x9e, 0x4f, 0x09, 0xe7, 0xdc, 0x41, 0x7b, 0x01, 0x81, 0xb9, 0x13, 0x70, 0xca, 0x59, 0x03, 0x71, 0x94, 0xd9, 0x31, 0x22, 0x11, 0xee, 0x8a, 0x8a, 0xbf, 0x71, 0x99, 0xda, 0x9b, 0xbd, 0x58, 0xf2, 0x92, 0x59, 0x46, 0x27, 0x38, 0xd7, 0xb9, 0x44, 0xbc, 0xfb, 0x76, 0xce, 0x1c, 0x20, 0x7f, 0x8d, 0x95, 0xd8, 0x2c, 0x47, 0x5e, 0xd3, 0x7d, 0xcf, 0x95, 0x02, 0xaf, 0x3f, 0x7a, 0xfb, 0x0d, 0x81, 0xdb, 0xa0, 0x09, 0x14, 0xcf, 0xfb, 0x8b, 0x0c, 0xa7, 0x6d, 0x89, 0x5b, 0x22, 0x08, 0xd8, 0x50, 0xe0, 0x39, 0x42, 0x5d, 0x19, 0xaa, 0xd8, 0x1d, 0x8f, 0x66, 0x89, 0x95, 0xc1, 0x3f, 0xf4, 0xbb, 0x62, 0x6d, 0x7b, 0x34, 0x09, 0x77, 0x99, 0x62, 0x2a, 0x57, 0x75, 0x9e, 0x45, 0xd9, 0xb7, 0xc2, 0x5d, 0x44, 0x9a, 0xeb, 0xac, 0x3c, 0x42, 0x7d, 0x95, 0xe7, 0x51, 0x67, 0xda, 0x4f, 0xb5, 0xa8, 0x0f, 0x07, 0xc3, 0x12, 0x4f, 0x12, 0x8a, 0x4d, 0x2d, 0x00, 0x61, 0x20, 0xed, 0x5a, 0xc3, 0xec, 0xf5, 0x40, 0x5d, 0x79, 0x7e, 0x51, 0x64, 0xf5, 0x8f, 0xcb, 0x2c, 0x3a, 0x2c, 0xf3, 0xf7, 0x50, 0xcb, 0xb8, 0x0b, 0x33, 0x07, 0x93, 0x07, 0xd6, 0x98, 0xb1, 0x76, 0x67, 0x83, 0x54, 0xa5, 0xd5, 0x8e, 0x77, 0xb2, 0x90, 0xf7, 0xb1, 0xe6, 0x90, 0x65, 0x5b, 0x44, 0x98, 0x1f, 0xf5, 0x62, 0xbc, 0x7c, 0xc6, 0x78, 0x21, 0x9b, 0xc3, 0xb7, 0x04, 0x53, 0xb2, 0xdc, 0xfd, 0x6d, 0x8f, 0x04, 0x85, 0x11, 0x2f, 0xc2, 0xb7, 0x7f, 0x23, 0x6f, 0x53, 0x00, 0xdf, 0xc1, 0x08, 0x1b, 0x1c, 0x9f, 0xf3, 0x0b, 0x7a, 0x34, 0x63, 0x71, 0x6a, 0x43, 0xdf, 0x47, 0x4b, 0xba, 0x6a, 0x15, 0xd3, 0x89, 0x05, 0x67, 0xb1, 0xb4, 0x76, 0x7e, 0x70, 0xa7, 0x48, 0x46, 0x9f, 0xcb, 0x13, 0x88, 0x2f, 0x56, 0xfd, 0x61, 0x1c, 0x67, 0x81, 0xf3, 0x50, 0x52, 0x6f, 0x5a, 0xc4, 0x38, 0x34, 0xe1, 0xe8, 0xdc, 0x5c, 0x76, 0x45, 0xb1, 0x55, 0x5c, 0x60, 0x38, 0x76, 0x20, 0xe2, 0x88, 0x3f, 0xce, 0xf7, 0x2e, 0xe3, 0x64, 0xf4, 0x38, 0x03, 0x87, 0x3c, 0x8d, 0xbd, 0x75, 0x64, 0x80, 0xe5, 0x3b, 0x95, 0xa4, 0x92, 0x28, 0x32, 0xe1, 0xdd, 0x81, 0xbb, 0xc7, 0xe5, 0x76, 0xf2, 0x23, 0x17, 0x55, 0x3c, 0xd0, 0xac, 0xfe, 0x49, 0xd0, 0x72, 0x97, 0xf7, 0x9b, 0xd0, 0x81, 0x74, 0xb7, 0x04, 0x8a, 0xa3, 0x89, 0xb0, 0x64, 0xc2, 0x6b, 0x95, 0x56, 0x49, 0xff, 0x9e, 0x31, 0x15, 0xc2, 0x20, 0x86, 0xc5, 0xe4, 0x60, 0x16, 0x65, 0x57, 0x56, 0x8a, 0x4a, 0x26, 0xb0, 0x64, 0x3c, 0x08, 0x1a, 0x36, 0xdb, 0x35, 0xbd, 0x11, 0x3b, 0x78, 0x05, 0x41, 0xd2, 0x85, 0xa8, 0x37, 0x94, 0x8e, 0xe4, 0xc7, 0x5c, 0x11, 0x08, 0x94, 0x8e, 0xf4, 0x35, 0xc8, 0xfa, 0xd3, 0x66, 0x08, 0x04, 0x99, 0xae, 0xa7, 0x02, 0x4d, 0xc1, 0x19, 0xe6, 0x2f, 0xb6, 0xab, 0x1d, 0x04, 0x0b, 0x72, 0xb7, 0xae, 0xea, 0x81, 0xc7, 0xff, 0xaa, 0x5f, 0x0d, 0xcf, 0x99, 0xb9, 0xd2, 0x4c, 0xf9, 0x53, 0x14, 0x92, 0x48, 0x44, 0xe3, 0x7c, 0xc5, 0x63, 0x0b, 0xb9, 0x2f, 0xfd, 0xf3, 0x22, 0xd0, 0xc9, 0xc5, 0x4a, 0xba, 0x1d, 0xcf, 0x57, 0x51, 0x61, 0x2a, 0x11, 0x09, 0xc5, 0x99, 0x39, 0x71, 0x2f, 0xb3, 0x1c, 0x71, 0x77, 0x45, 0x68, 0xcf, 0xd7, 0xf2, 0x3d, 0xf8, 0x9d, 0x1c, 0x87, 0xfe, 0x23, 0x08, 0x8c, 0xdd, 0x01, 0x3c, 0xc1, 0x02, 0x81, 0x2c, 0xe2, 0x0e, 0x54, 0x16, 0x41, 0xd7, 0x83, 0x2b, 0x5f, 0xaf, 0xa8, 0xef, 0xb9, 0xea, 0x5d, 0xe2, 0xe4, 0x9a, 0xf5, 0x60, 0xdc, 0x9d, 0x6a, 0xc6, 0x9a, 0xda, 0x97, 0xd6, 0xe4, 0xc7, 0xa7, 0x5d, 0x69, 0x2f, 0xce, 0x12, 0x0d, 0x32, 0x37, 0xc2, 0x82, 0x8d, 0x3d, 0xaa, 0x18, 0x1b, 0xdd, 0x25, 0xd6, 0x9c, 0x6b, 0x87, 0xc9, 0xb6, 0x85, 0x48, 0x9c, 0x39, 0x46, 0x65, 0x69, 0xa7, 0xbb, 0x03, 0xcf, 0xf4, 0x9b, 0x55, 0x45, 0x8a, 0x32, 0xc1, 0xad, 0x90, 0x9f, 0x3e, 0x2d, 0x6c, 0x3f, 0x01, 0x3a, 0x86, 0x69, 0x58, 0xf5, 0x4f, 0x5c, 0xd6, 0xbb, 0x83, 0x75, 0xb0, 0xf7, 0xab, 0xa6, 0x67, 0x3b, 0xe5, 0x23, 0xa7, 0x90, 0xe7, 0x5e, 0x70, 0x0a, 0x42, 0x36, 0x73, 0x9f, 0xe4, 0x6b, 0xbf, 0x38, 0xe1, 0x56, 0x9c, 0x09, 0x73, 0xd7, 0xb7, 0x1e, 0x3f, 0x8e, 0x80, 0x37, 0xd9, 0x4e, 0xd1, 0xd6, 0x8b, 0xce, 0xd0, 0x96, 0x52, 0xa2, 0x16, 0xbe, 0x2a, 0x6a, 0x11, 0x16, 0x8b, 0x4a, 0xa6, 0xfa, 0x34, 0x9a, 0x1b, 0xac, 0x27, 0xde, 0x35, 0xef, 0xf5, 0xf8, 0x9d, 0xd1, 0x3b, 0x9c, 0x88, 0xc8, 0x6d, 0x05, 0x97, 0x00, 0xd2, 0xe6, 0xfc, 0xf4, 0xd0, 0xa4, 0xdf, 0x3c, 0x6a, 0xc2, 0x00, 0xa5, 0x07, 0x9d, 0x9d, 0x87, 0x75, 0x59, 0x96, 0x53, 0x2d, 0x1b, 0xcf, 0x6c, 0xd9, 0x78, 0xd6, 0x38, 0x13, 0x2e, 0xc6, 0x76, 0x70, 0x12, 0x6b, 0xd2, 0xbd, 0x4a, 0xa6, 0xb6, 0x88, 0xbc, 0x13, 0x64, 0xe3, 0xc6, 0xea, 0x42, 0x64, 0x30, 0x23, 0x74, 0x70, 0x5f, 0xde, 0xb0, 0xb9, 0xcb, 0x01, 0x4e, 0x06, 0xb3, 0x23, 0x9f, 0x33, 0x0f, 0xa9, 0x80, 0x78, 0xc6, 0x2e, 0x2f, 0xee, 0x21, 0x29, 0x5d, 0x4e, 0x7f, 0xc9, 0x84, 0xfc, 0x4b, 0x24, 0x7a, 0x45, 0x2c, 0x91, 0x47, 0xe5, 0x7b, 0x52, 0x34, 0xcd, 0xfa, 0x77, 0x24, 0x23, 0xc3, 0xfe, 0x27, 0x89, 0x7e, 0x3f, 0x4d, 0xa2, 0xd7, 0x88, 0xb8, 0xd2, 0x30, 0x04, 0xf5, 0x46, 0x92, 0xe1, 0x8d, 0x35, 0xea, 0xb1, 0xd6, 0x65, 0x72, 0x11, 0x0f, 0xf0, 0x6d, 0x89, 0xac, 0x48, 0x17, 0xb4, 0xef, 0x79, 0xdc, 0xa1, 0xb8, 0xae, 0xc8, 0x78, 0x9e, 0xf7, 0x3f, 0x61, 0x3e, 0x49, 0xee, 0xa1, 0xd3, 0xc7, 0x01, 0x06, 0x08, 0x3f, 0x96, 0x86, 0x0a, 0xf8, 0x72, 0x23, 0xe0, 0xab, 0xf3, 0x12, 0xff, 0xcf, 0x46, 0x1b, 0x19, 0x19, 0xda, 0x43, 0x37, 0x44, 0x15, 0xa9, 0x07, 0x0e, 0x45, 0xae, 0x77, 0x83, 0xd9, 0x58, 0x82, 0x7d, 0xd1, 0xf9, 0x4a, 0x6c, 0x73, 0x0b, 0x68, 0x53, 0x40, 0x5f, 0x80, 0x13, 0x26, 0x77, 0x18, 0xec, 0xf7, 0x30, 0xaa, 0x41, 0x1a, 0xa3, 0xf7, 0x9b, 0x81, 0x4e, 0x9f, 0xf1, 0xda, 0x6f, 0xef, 0x27, 0x0a, 0xb1, 0xfa, 0xd4, 0xd7, 0x0a, 0xeb, 0x48, 0xe4, 0xe4, 0x99, 0xce, 0xe3, 0x7b, 0x5c, 0x2e, 0x06, 0x86, 0x20, 0x76, 0xb6, 0x19, 0xb7, 0xfa, 0x88, 0xca, 0x74, 0x9a, 0x6d, 0x13, 0xf5, 0x43, 0x29, 0xf7, 0x40, 0xb9, 0x06, 0xe8, 0x12, 0x93, 0xc9, 0xe9, 0x73, 0x87, 0xe5, 0xf0, 0x8e, 0xe7, 0xef, 0x8e, 0xc0, 0x6c, 0x52, 0xd1, 0xef, 0x33, 0x44, 0x6a, 0x1d, 0x05, 0xf8, 0x0b, 0x3c, 0xdb, 0x15, 0x13, 0x44, 0xa1, 0x68, 0x6d, 0x84, 0x3b, 0xd5, 0xb5, 0x35, 0xc6, 0x94, 0x9d, 0x55, 0x20, 0x9a, 0x90, 0xb3, 0xaa, 0x54, 0x95, 0x46, 0x4c, 0x9b, 0x75, 0xc2, 0xba, 0xe5, 0x20, 0x6d, 0xf6, 0xb8, 0x4d, 0x2f, 0x17, 0x65, 0x61, 0xe9, 0x48, 0xf2, 0x92, 0x08, 0x13, 0x58, 0x4c, 0x5a, 0xe0, 0xef, 0xd3, 0x20, 0xb8, 0x26, 0x2b, 0x64, 0x4f, 0x77, 0x35, 0x8d, 0x42, 0x9a, 0x1a, 0x30, 0x9d, 0xf9, 0xec, 0x29, 0xa0, 0x65, 0x8b, 0xeb, 0xc3, 0x07, 0xc6, 0x14, 0xf7, 0x99, 0xc3, 0x45, 0x2f, 0xd6, 0xa1, 0x30, 0x1f, 0x2e, 0x5b, 0xf2, 0x43, 0xbf, 0xf0, 0xa4, 0x24, 0x81, 0xc1, 0x2c, 0xd7, 0xc0, 0x3a, 0x59, 0xc6, 0xd0, 0xb4, 0x30, 0xb3, 0xfc, 0x9a, 0x80, 0xf9, 0xbf, 0xcb, 0xbd, 0x15, 0x37, 0x40, 0x0a, 0x66, 0xd6, 0xef, 0x98, 0x31, 0x5b, 0xef, 0x2f, 0xe8, 0x00, 0xdc, 0x0a, 0xac, 0xf5, 0x7d, 0xe8, 0x10, 0x0e, 0xa4, 0x60, 0x20, 0xb9, 0x56, 0x75, 0xa2, 0x32, 0x2c, 0x6a, 0x9b, 0xfa, 0xf9, 0xd8, 0x15, 0x85, 0xad, 0xfd, 0x20, 0x32, 0x7a, 0x57, 0x17, 0x81, 0x35, 0x71, 0x24, 0x81, 0xfe, 0xfe, 0x06, 0x87, 0x23, 0x24, 0x12, 0x25, 0x42, 0x1a, 0x78, 0x5a, 0xae, 0xf5, 0xc8, 0x07, 0x14, 0xbf, 0xb5, 0xa2, 0x5f, 0xca, 0x18, 0x2e, 0xd8, 0x43, 0x38, 0x6b, 0x92, 0x0a, 0x48, 0x4a, 0x05, 0xc1, 0x31, 0xa3, 0xf9, 0x24, 0x92, 0x2a, 0xa6, 0x98, 0x05, 0xa0, 0x19, 0x06, 0xa5, 0x46, 0xd9, 0xe9, 0xcd, 0x97, 0xcb, 0xa6, 0x22, 0x36, 0x53, 0x1d, 0xd3, 0x26, 0xbc, 0x7d, 0x1f, 0x39, 0xda, 0x5c, 0x18, 0xcb, 0xed, 0x07, 0xa7, 0xaf, 0xc9, 0x16, 0xd1, 0x6a, 0x34, 0x44, 0x38, 0x9f, 0x90, 0x7e, 0xe5, 0xcb, 0xba, 0x3a, 0x44, 0x33, 0x31, 0x0a, 0x70, 0x1a, 0x7b, 0x71, 0xb1, 0x36, 0xc4, 0xf5, 0x44, 0x65, 0xc9, 0x75, 0x5a, 0x9d, 0xf4, 0xbd, 0x62, 0x21, 0xc8, 0x58, 0x8b, 0xfb, 0x80, 0xa5, 0x85, 0xa6, 0xf3, 0x2e, 0x88, 0x0b, 0xbb, 0x34, 0x98, 0xaf, 0x96, 0x8f, 0x07, 0x2a, 0x0c, 0xb5, 0x3b, 0xdb, 0x53, 0x18, 0xb2, 0xda, 0x6f, 0xb5, 0x42, 0x2e, 0x9d, 0xe9, 0xa6, 0x40, 0xf2, 0x87, 0x36, 0x90, 0x40, 0x29, 0xf6, 0xa7, 0x39, 0xc3, 0xd2, 0x4d, 0xd7, 0x7e, 0x28, 0xfb, 0xfb, 0xc3, 0x87, 0x93, 0x54, 0x95, 0xb7, 0x4f, 0x82, 0x25, 0xf9, 0xf7, 0x7b, 0xa0, 0x8f, 0x58, 0x2e, 0x4c, 0x7f, 0xf1, 0x67, 0xd3, 0x95, 0xef, 0xf3, 0xdf, 0xa7, 0x5c, 0x04, 0xe6, 0x1c, 0x93, 0xd7, 0x48, 0xaf, 0xf7, 0x93, 0x97, 0x71, 0xe4, 0x75, 0x35, 0x0d, 0xe6, 0x2a, 0x25, 0x50, 0x29, 0x7c, 0x1b, 0xe9, 0x31, 0x31, 0xd5, 0x6d, 0xcb, 0x30, 0xae, 0x9e, 0x44, 0xe6, 0x71, 0xec, 0xd8, 0xe8, 0x6b, 0x3c, 0x6d, 0xda, 0xc4, 0xe9, 0x82, 0x8f, 0x0f, 0x08, 0x62, 0x71, 0x1f, 0xf1, 0x9d, 0x24, 0x1c, 0xfb, 0xb8, 0x66, 0xd7, 0x86, 0x24, 0x3a, 0x5b, 0x3f, 0x6d, 0x45, 0xc5, 0x9f, 0xb4, 0x78, 0x55, 0xb5, 0x5f, 0xef, 0xc4, 0x26, 0x0f, 0x19, 0xd8, 0x72, 0xd2, 0x1a, 0x37, 0x78, 0x9b, 0x6d, 0x79, 0x3d, 0xef, 0xce, 0x80, 0xe9, 0xe0, 0x57, 0x0c, 0x12, 0x3f, 0xe9, 0x8a, 0x3d, 0x0e, 0xcd, 0x2d, 0xa2, 0x34, 0x9b, 0x40, 0x30, 0x74, 0x5b, 0xbb, 0xd1, 0xa0, 0xeb, 0x14, 0xef, 0x0a, 0xa1, 0x57, 0x37, 0x3c, 0x30, 0x79, 0x9d, 0xe9, 0xd0, 0xea, 0xa0, 0x23, 0x99, 0x69, 0xcf, 0xcd, 0x30, 0x1c, 0x8c, 0x54, 0xa6, 0xe0, 0x10, 0x9a, 0x9d, 0xde, 0xaf, 0x33, 0xad, 0x5f, 0x5d, 0xd4, 0x06, 0xe1, 0x72, 0x08, 0x56, 0x69, 0xaa, 0x25, 0xed, 0x1c, 0x70, 0x7f, 0x1f, 0x09, 0x5c, 0xdb, 0xe9, 0x4a, 0xfa, 0x27, 0xd8, 0x4b, 0xcd, 0x68, 0x27, 0x69, 0x93, 0xf3, 0x27, 0xbf, 0xcb, 0xe0, 0xe4, 0x3c, 0x75, 0xbc, 0x06, 0xf9, 0x19, 0x7e, 0xf5, 0xca, 0x0a, 0xbc, 0x41, 0x14, 0xec, 0x1f, 0x40, 0xde, 0x74, 0x15, 0xf9, 0x2a, 0x6f, 0xc5, 0x40, 0x85, 0x06, 0x48, 0x23, 0xdd, 0x40, 0x16, 0x85, 0x93, 0xc8, 0xbe, 0x09, 0xd1, 0xf1, 0xdb, 0x32, 0x1e, 0xf7, 0x43, 0xc8, 0x2f, 0x88, 0x81, 0x7d, 0x00, 0x82, 0x86, 0xd0, 0x24, 0xff, 0x9b, 0x32, 0x5a, 0x8f, 0x9a, 0x67, 0x60, 0xc4, 0x5e, 0x30, 0x0c, 0xf4, 0x78, 0x27, 0x98, 0x3a, 0x23, 0xea, 0x3e, 0xbe, 0x7b, 0x7b, 0x04, 0x36, 0xe9, 0xe7, 0xda, 0xad, 0xe2, 0x26, 0xe2, 0x83, 0xd1, 0x43, 0x0f, 0xb6, 0x51, 0xbd, 0xf1, 0x5f, 0xa0, 0x2c, 0xcf, 0x80, 0x50, 0x27, 0xf7, 0xfc, 0x40, 0x66, 0x52, 0xe7, 0xcb, 0x24, 0x3b, 0x00, 0x3f, 0xc7, 0x91, 0x7c, 0x91, 0xc3, 0x0b, 0x06, 0x4f, 0xbc, 0xcc, 0x03, 0xd5, 0xeb, 0x38, 0x1a, 0xc4, 0xc2, 0x05, 0xf4, 0xb0, 0xd3, 0x95, 0x40, 0x19, 0xee, 0x83, 0xfb, 0x9d, 0x89, 0x7c, 0xee, 0x6b, 0x65, 0x50, 0x78, 0xfb, 0x6f, 0x48, 0x8d, 0xfd, 0xe5, 0xbb, 0xff, 0x8f, 0xb9, 0xdc, 0xfc, 0xb2, 0x3a, 0xd6, 0xd9, 0xff, 0xf1, 0x1b, 0x0d, 0x96, 0xc9, 0xf8, 0x81, 0x58, 0x74, 0x6e, 0x07, 0x56, 0x09, 0x3d, 0x27, 0x88, 0xf2, 0x41, 0x22, 0xc3, 0x05, 0x01, 0x31, 0xe5, 0xf1, 0x86, 0x0e, 0x53, 0xdc, 0x69, 0xb5, 0xa5, 0x4a, 0x30, 0x6c, 0x9f, 0x41, 0xdb, 0x01, 0x63, 0xab, 0xb9, 0x53, 0xe6, 0xfb, 0x80, 0x13, 0xa1, 0x13, 0x9d, 0xcc, 0x89, 0x65, 0xc9, 0x21, 0x40, 0x59, 0xdd, 0x57, 0x8d, 0xef, 0xe7, 0x13, 0x0a, 0xa6, 0x7d, 0x64, 0x1c, 0x9c, 0x51, 0x03, 0x28, 0xf6, 0x06, 0xda, 0x04, 0x82, 0x42, 0xc4, 0xac, 0x9b, 0x05, 0x94, 0x37, 0x4e, 0x39, 0x58, 0x09, 0xbb, 0x8a, 0xdf, 0x49, 0xbd, 0x77, 0x78, 0x96, 0xcd, 0xa9, 0xfd, 0xf5, 0x23, 0x84, 0x10, 0x0e, 0x1f, 0xfd, 0xa5, 0x99, 0xe8, 0xab, 0xc1, 0x13, 0x53, 0x20, 0x80, 0xb5, 0x06, 0x79, 0x5d, 0xa6, 0xdd, 0x34, 0xae, 0x70, 0x8c, 0x42, 0x6e, 0xb1, 0x86, 0x5d, 0x3f, 0x13, 0x1e, 0x9c, 0xaf, 0x7d, 0xec, 0x45, 0xbb, 0x8b, 0x73, 0xe2, 0x92, 0x3c, 0x00, 0x97, 0x9b, 0xeb, 0xd5, 0xb2, 0xb8, 0x81, 0x87, 0x84, 0xcd, 0xe8, 0xa5, 0x70, 0x7c, 0xc3, 0x9a, 0x41, 0x33, 0x5c, 0xd5, 0xc0, 0x69, 0xdd, 0x27, 0x87, 0x24, 0xc4, 0x6c, 0x10, 0xbf, 0x91, 0x6d, 0x11, 0xea, 0xc1, 0x05, 0x0c, 0xf2, 0x00, 0x83, 0x21, 0x43, 0x9b, 0x50, 0x28, 0x2b, 0x34, 0xd2, 0xfc, 0xe0, 0xb9, 0x8f, 0x19, 0xc5, 0x97, 0x96, 0x6a, 0xe9, 0x2a, 0x1b, 0x5c, 0xd0, 0x78, 0x61, 0x37, 0x77, 0x20, 0xdd, 0xae, 0x92, 0x8d, 0x98, 0xb5, 0x18, 0x6f, 0xd5, 0x92, 0x01, 0x6c, 0xf4, 0x37, 0x4f, 0x12, 0x96, 0xcf, 0x4b, 0x11, 0x02, 0x97, 0x11, 0xa7, 0xc7, 0xef, 0x4e, 0x5b, 0xa3, 0xb1, 0x49, 0xee, 0xa4, 0xc1, 0x20, 0x8f, 0x8d, 0xe5, 0x54, 0x4e, 0x7b, 0xd7, 0x88, 0xd3, 0xc8, 0x99, 0x86, 0x50, 0x30, 0x09, 0x83, 0xb4, 0x32, 0xb5, 0xa4, 0x22, 0xb9, 0xf0, 0xc1, 0xa1, 0xfc, 0x26, 0x68, 0x15, 0xa3, 0x6c, 0x25, 0x6e, 0x2b, 0x5b, 0x00, 0x1f, 0x8b, 0x1f, 0x48, 0xd1, 0x18, 0xcb, 0x8f, 0x59, 0xa6, 0xef, 0xf6, 0xe8, 0xf0, 0x6d, 0xab, 0x82, 0x3a, 0x88, 0xaf, 0xb2, 0x34, 0x3e, 0xdd, 0x7b, 0x22, 0xd8, 0x28, 0x91, 0x3a, 0xbf, 0x24, 0xca, 0x4d, 0x91, 0xc8, 0xcf, 0xaa, 0x74, 0x72, 0x17, 0x40, 0xab, 0x2b, 0x16, 0x02, 0x67, 0x2c, 0xb1, 0x90, 0xdf, 0xa2, 0xf6, 0x13, 0xa2, 0xaf, 0x0a, 0x68, 0x2c, 0xb1, 0x62, 0x82, 0xb8, 0xc6, 0x36, 0x09, 0x56, 0x90, 0x33, 0x47, 0x3d, 0x35, 0x71, 0x45, 0x62, 0xaa, 0xa4, 0x31, 0x4a, 0x32, 0x96, 0x03, 0x1c, 0x21, 0xd5, 0x61, 0xfa, 0xe6, 0xa8, 0xbf, 0x91, 0x48, 0x48, 0xca, 0xef, 0xf0, 0x4d, 0x07, 0x95, 0x28, 0x67, 0xb7, 0xce, 0xe2, 0x4e, 0xff, 0x3f, 0xfc, 0xfc, 0x45, 0xbe, 0xc2, 0x19, 0xdd, 0x68, 0xb5, 0xb7, 0xe5, 0xed, 0x8b, 0x3f, 0x6d, 0x2f, 0x76, 0xab, 0xdc, 0x0c, 0xa9, 0xf6, 0x8e, 0x77, 0x19, 0xd1, 0xc2, 0xce, 0x80, 0x98, 0xb4, 0x67, 0xa8, 0x84, 0x06, 0x6d, 0xe6, 0x22, 0x64, 0xea, 0xe4, 0x04, 0x68, 0x24, 0xa4, 0xb6, 0xbb, 0x2d, 0xc2, 0xf3, 0x7e, 0xb6, 0xfa, 0x19, 0xe8, 0x24, 0xe9, 0xdb, 0x30, 0xe6, 0x18, 0x36, 0xad, 0x05, 0x36, 0xa6, 0x3c, 0xfc, 0xa5, 0x99, 0xe2, 0xcb, 0x39, 0x24, 0xb2, 0x47, 0x3c, 0xf5, 0xf1, 0xb4, 0xb5, 0x89, 0x79, 0x95, 0xe9, 0x9f, 0x5b, 0xc3, 0x23, 0xec, 0xc8, 0xbd, 0xb1, 0x10, 0x32, 0x3f, 0x2f, 0xc9, 0xae, 0x16, 0x08, 0x66, 0x9d, 0x32, 0x39, 0x7f, 0x8b, 0xfd, 0x58, 0xe4, 0x57, 0xeb, 0xd5, 0xd3, 0x94, 0x52, 0x81, 0x6e, 0x30, 0x7d, 0x4c, 0x6b, 0x53, 0xfc, 0x53, 0x0e, 0x8a, 0x3d, 0x1a, 0x54, 0x25, 0x61, 0x15, 0x72, 0xde, 0x48, 0x6e, 0x7d, 0xbb, 0xee, 0x02, 0x6b, 0x35, 0xfb, 0xad, 0x3a, 0x99, 0x95, 0xc7, 0x6f, 0xaf, 0x79, 0xee, 0xc2, 0x9a, 0x4a, 0x06, 0x18, 0xff, 0x28, 0x7f, 0xb1, 0x69, 0x85, 0xd6, 0xa3, 0xec, 0x34, 0x5f, 0x87, 0x09, 0xc3, 0x41, 0x72, 0xd2, 0x0b, 0xc2, 0x27, 0x4e, 0x05, 0xc5, 0x8a, 0x1f, 0xe0, 0x90, 0x58, 0x62, 0x50, 0xd3, 0x16, 0xd7, 0x28, 0xe6, 0x47, 0x42, 0x2b, 0x53, 0xe2, 0x11, 0x1f, 0x94, 0x03, 0x3e, 0x24, 0x1e, 0xe1, 0x77, 0x44, 0x9e, 0x00, 0x7d, 0x4b, 0x82, 0xa8, 0xca, 0xd9, 0xbb, 0x95, 0x76, 0xb5, 0xc1, 0xf0, 0x5b, 0x64, 0xd8, 0x7e, 0x78, 0xfb, 0x93, 0x18, 0x93, 0x31, 0x96, 0x5b, 0x22, 0xb8, 0x9f, 0xa0, 0x6c, 0xce, 0xc8, 0x2e, 0xec, 0x0f, 0x06, 0xaf, 0xf6, 0x8d, 0xf6, 0xe1, 0x9d, 0x22, 0xd9, 0x8e, 0xd3, 0x05, 0xdc, 0xbe, 0xd2, 0x9c, 0x9e, 0x2b, 0xbb, 0x91, 0xec, 0xf5, 0x7d, 0x28, 0xcf, 0x97, 0xf9, 0xd0, 0xc8, 0x1a, 0x64, 0xf8, 0x5a, 0x89, 0xec, 0x23, 0xc9, 0xa4, 0x9e, 0x3f, 0x22, 0xd8, 0x87, 0x32, 0x7b, 0x6f, 0x19, 0xb7, 0x7c, 0x05, 0xd1, 0x68, 0x1e, 0x3b, 0x17, 0x1b, 0xb3, 0xaf, 0x66, 0x72, 0x27, 0x2b, 0xac, 0xae, 0x85, 0x1c, 0xf4, 0xc4, 0xbc, 0x46, 0x42, 0xb3, 0xa4, 0xb7, 0xbe, 0x14, 0x3c, 0xf9, 0x15, 0xf3, 0x36, 0x8c, 0x1d, 0xdd, 0xb5, 0x93, 0xb8, 0x3a, 0x55, 0xce, 0xfa, 0xde, 0x6c, 0xc8, 0x8e, 0xda, 0x8f, 0x52, 0x55, 0x98, 0x58, 0x2f, 0x51, 0x27, 0x67, 0x11, 0xc2, 0xd3, 0xa7, 0xc5, 0x8e, 0xf9, 0xd2, 0xaa, 0xe6, 0x19, 0x38, 0x67, 0x27, 0x2d, 0xbc, 0xdd, 0xfe, 0x39, 0x1f, 0x5b, 0xd0, 0x24, 0x81, 0x11, 0x59, 0xc6, 0x24, 0xc8, 0x93, 0x42, 0x74, 0xd0, 0xd9, 0x96, 0x44, 0x39, 0x4c, 0x70, 0x5b, 0x46, 0x76, 0x44, 0x2f, 0x1e, 0x2d, 0x9b, 0xf0, 0xc5, 0xba, 0xae, 0xc8, 0x4b, 0x3b, 0x33, 0x62, 0x43, 0x46, 0x77, 0xa9, 0x77, 0xcf, 0xad, 0xd2, 0xda, 0x4c, 0x85, 0x9c, 0xbe, 0x16, 0x01, 0xd6, 0x47, 0x13, 0x85, 0x22, 0x20, 0x92, 0x2d, 0xfa, 0x6c, 0x76, 0x62, 0xf0, 0x00, 0x97, 0xb0, 0x3a, 0xcf, 0x65, 0xd2, 0x6d, 0xa5, 0xcf, 0x0f, 0x89, 0x19, 0x63, 0xca, 0x36, 0xbd, 0xb6, 0x54, 0x4d, 0x97, 0x06, 0x04, 0x9a, 0xd5, 0x1e, 0x8a, 0xe1, 0xbc, 0x7a, 0x80, 0x1e, 0xe2, 0xac, 0x42, 0x11, 0x9d, 0xfe, 0x00, 0xfa, 0xbb, 0x59, 0x11, 0xa2, 0x73, 0x65, 0x8a, 0x9a, 0x9c, 0xf2, 0x10, 0xc7, 0x1d, 0x97, 0xea, 0x1f, 0xa5, 0x98, 0x5a, 0xad, 0x9c, 0x0d, 0x2e, 0xdb, 0x59, 0x41, 0x92, 0xf0, 0x95, 0x59, 0x28, 0xd8, 0x1f, 0x36, 0x5b, 0x24, 0xd2, 0x9c, 0xf0, 0x51, 0xc5, 0x93, 0xdd, 0x4d, 0xc1, 0x0d, 0x5f, 0x37, 0xf8, 0xca, 0x47, 0x66, 0xf3, 0x79, 0x94, 0xae, 0xcd, 0x20, 0x47, 0xde, 0x9f, 0xbd, 0x73, 0x8d, 0x3b, 0x2e, 0x94, 0x17, 0x1d, 0x4e, 0x21, 0xe2, 0x9e, 0x61, 0x65, 0xe6, 0x6b, 0xb2, 0x8a, 0x6c, 0x36, 0x7a, 0xf7, 0x15, 0xab, 0x04, 0xdc, 0x1f, 0xa6, 0x0f, 0x0a, 0xe4, 0xa3, 0x74, 0x09, 0xa3, 0x76, 0x08, 0x64, 0x83, 0x3c, 0xc4, 0x48, 0xd5, 0x91, 0x23, 0x4d, 0x9a, 0x03, 0xcc, 0x94, 0x45, 0xc7, 0x71, 0x12, 0xc2, 0xab, 0xf7, 0x2b, 0xb6, 0x4c, 0xd7, 0x83, 0x09, 0x89, 0xc4, 0x11, 0xa2, 0x37, 0x8e, 0x75, 0x71, 0x16, 0x46, 0x8b, 0xb3, 0x04, 0xa3, 0x40, 0x71, 0x71, 0xa4, 0xa4, 0x4a, 0x13, 0x77, 0x41, 0x73, 0xdb, 0x9a, 0xac, 0xfc, 0x27, 0x40, 0x59, 0x55 ],
+const [ 0xf7, 0xa5, 0x09, 0x8b, 0x2a, 0x4d, 0x92, 0xa7, 0xe7, 0x1e, 0x46, 0x58, 0xb4, 0x58, 0xf4, 0x7a, 0x0b, 0x5e, 0x04, 0x27, 0xad, 0xb9, 0x67, 0xda, 0x3a, 0x60, 0xce, 0xd4, 0xff, 0x36, 0x1a, 0xbf, 0x0f, 0xd5, 0x14, 0x92, 0x95, 0x8a, 0x5f, 0xb4, 0x68, 0xa0, 0xab, 0x64, 0xe0, 0xe2, 0x2a, 0x58, 0xe9, 0x5b, 0x48, 0xa4, 0x55, 0x60, 0x97, 0xde, 0x77, 0xd1, 0x08, 0x80, 0xed, 0x9b, 0x61, 0x8d, 0xbd, 0x81, 0xeb, 0x78, 0xa4, 0x1d, 0x6b, 0x41, 0xaa, 0x21, 0x54, 0xe1, 0xfa, 0xe3, 0x3b, 0xe8, 0xf1, 0x19, 0x8b, 0x65, 0x75, 0xe0, 0x7a, 0x06, 0x88, 0x04, 0x3c, 0x80, 0x1c, 0x7b, 0x76, 0x31, 0x29, 0x32, 0xf5, 0x04, 0xfe, 0x0d, 0xa0, 0x96, 0xd5, 0x29, 0xab, 0x97, 0xa9, 0x64, 0x0e, 0x72, 0x4c, 0x1f, 0x36, 0x30, 0xb4, 0x42, 0xfa, 0x99, 0x95, 0x81, 0xd0, 0x9d, 0x36, 0xde, 0x41, 0xf3, 0x7d, 0x6f, 0x9a, 0x00, 0x4b, 0x62, 0xe5, 0xfa, 0x10, 0x3e, 0x17, 0x4d, 0x96, 0x6b, 0x8b, 0x3e, 0x21, 0xf5, 0xaf, 0xce, 0xba, 0x8d, 0xfe, 0xe1, 0xc8, 0xd1, 0x2e, 0x9f, 0xe0, 0xcd, 0xaa, 0x1b, 0xde, 0xc1, 0x42, 0x32, 0x35, 0x24, 0x21, 0xb7, 0x83, 0xea, 0x00, 0xcd, 0x69, 0x03, 0x9a, 0x93, 0x99, 0x24, 0x60, 0x07, 0x30, 0xc9, 0x6d, 0x24, 0x47, 0x7b, 0xbc, 0x4e, 0xc4, 0x4e, 0x99, 0xf0, 0x76, 0xaf, 0x55, 0x64, 0x62, 0x5c, 0x3e, 0x13, 0x57, 0xb4, 0xce, 0xdd, 0xc9, 0x31, 0x23, 0xbb, 0xdc, 0x33, 0xaf, 0xa2, 0xbe, 0xff, 0x31, 0xab, 0x3a, 0x07, 0xe4, 0x72, 0x8a, 0x6c, 0xf6, 0xbb, 0x6d, 0xc1, 0x3b, 0x5c, 0x7a, 0x12, 0x23, 0x57, 0xb4, 0x24, 0xea, 0x46, 0x5e, 0xff, 0x0e, 0xfc, 0x11, 0xaa, 0x06, 0x69, 0x0b, 0x36, 0x31, 0xbe, 0xca, 0xfd, 0x0d, 0xd2, 0xda, 0x2c, 0xa9, 0xc4, 0xeb, 0x7f, 0x5d, 0xe3, 0x26, 0x4c, 0xb8, 0xca, 0xc1, 0xc3, 0xba, 0xcf, 0xd1, 0x74, 0x43, 0x9f, 0x60, 0x12, 0xcc, 0x22, 0xc0, 0x76, 0x55, 0xa5, 0x1e, 0xe6, 0x9e, 0x37, 0x5a, 0x98, 0x9a, 0x53, 0x17, 0x72, 0x21, 0xc0, 0x0e, 0x14, 0xe5, 0xb6, 0xa7, 0x18, 0xa7, 0x42, 0xca, 0x98, 0xab, 0xeb, 0xf2, 0xf1, 0x69, 0x96, 0x84, 0xc7, 0x85, 0xa7, 0x60, 0x4a, 0x01, 0x69, 0xb5, 0xb7, 0xb2, 0xb0, 0x19, 0x21, 0xf0, 0xbd, 0xd9, 0x71, 0x92, 0x61, 0x8d, 0xac, 0x1a, 0x66, 0xf0, 0x74, 0x2c, 0x2a, 0xef, 0xd2, 0x45, 0x8d, 0x00, 0x32, 0xa9, 0x0d, 0xb5, 0xaf, 0x9d, 0x30, 0x91, 0x91, 0xd7, 0x23, 0x1a, 0x14, 0x33, 0xa0, 0x2f, 0x6c, 0xa7, 0x14, 0x9c, 0x05, 0x79, 0x02, 0xec, 0x0f, 0xaf, 0xa2, 0x7f, 0x3a, 0xc8, 0xcf, 0xdc, 0xbe, 0xa9, 0x20, 0x47, 0x9f, 0xda, 0x54, 0x97, 0x2f, 0xf2, 0xf3, 0x42, 0xd4, 0x50, 0x32, 0xba, 0x0b, 0x0c, 0x17, 0xfc, 0xad, 0x2d, 0xdf, 0x65, 0x72, 0x1d, 0x9d, 0xc8, 0xb3, 0x5a, 0x23, 0xbf, 0x74, 0x6d, 0x25, 0x3e, 0xa1, 0x20, 0x9c, 0x6e, 0x98, 0xec, 0x69, 0xb8, 0xe8, 0xb1, 0x3b, 0x1f, 0x58, 0xaa, 0xb2, 0xd4, 0x2c, 0x9f, 0xc5, 0x04, 0xa3, 0x5c, 0x61, 0xf5, 0xc4, 0x63, 0x52, 0x51, 0x5a, 0xde, 0x67, 0xc2, 0x3e, 0xd7, 0xd1, 0xbe, 0xd4, 0xab, 0xcd, 0xa5, 0xd8, 0xbc, 0x83, 0x09, 0x5b, 0x67, 0x2d, 0x4c, 0x08, 0x36, 0x7b, 0x71, 0xac, 0x56, 0x36, 0x2c, 0xf6, 0x4b, 0x25, 0x3b, 0x7b, 0xe2, 0x2d, 0xf9, 0xfc, 0x67, 0xbb, 0x31, 0xec, 0x19, 0x67, 0x30, 0x2d, 0xdb, 0xd1, 0x1e, 0x1b, 0x2c, 0xcf, 0x8e, 0xcb, 0x59, 0xcb, 0x53, 0x94, 0xf1, 0x66, 0x95, 0xcf, 0x7a, 0x61, 0x25, 0xdc, 0x62, 0xbe, 0x0e, 0x66, 0x39, 0x22, 0x6d, 0xe7, 0x1d, 0x7e, 0x82, 0x6e, 0x75, 0xee, 0x06, 0xa0, 0xe2, 0xe2, 0xbf, 0xfc, 0x72, 0x7b, 0x53, 0x64, 0x17, 0x38, 0x5a, 0xd9, 0x58, 0xd1, 0xb6, 0x87, 0x47, 0x63, 0x27, 0x01, 0xb3, 0xce, 0x1a, 0xcd, 0x9e, 0x5b, 0xc2, 0x23, 0xf1, 0xa3, 0x6a, 0xf2, 0x6f, 0xac, 0x0a, 0x24, 0xe8, 0x54, 0x18, 0x23, 0xaf, 0xf3, 0xa0, 0x9c, 0x4e, 0x3c, 0x97, 0x83, 0x77, 0x64, 0x6d, 0x57, 0x3e, 0x87, 0xe1, 0xa7, 0x86, 0x47, 0x19, 0xd5, 0xb9, 0xb6, 0xf2, 0x1a, 0xbd, 0x76, 0x95, 0xca, 0x23, 0x1e, 0x4b, 0xd9, 0xa1, 0xe0, 0x92, 0x9f, 0xc2, 0x69, 0x70, 0xd8, 0xdc, 0x09, 0x07, 0xef, 0x43, 0x14, 0x6a, 0x7c, 0xbc, 0x88, 0xaf, 0x0b, 0x34, 0xef, 0x45, 0x1f, 0xb2, 0x87, 0x88, 0x76, 0x8b, 0xa1, 0x93, 0x8f, 0xd5, 0x47, 0x55, 0x6a, 0x1d, 0x21, 0xe8, 0x8f, 0x5d, 0x9a, 0x1d, 0x51, 0x28, 0x3e, 0x5c, 0x54, 0x28, 0x66, 0xab, 0x4d, 0xca, 0x18, 0x0c, 0x09, 0x38, 0x29, 0x0c, 0xb1, 0x88, 0xa4, 0x99, 0x4c, 0x32, 0x70, 0x14, 0x85, 0xc8, 0x2c, 0xa7, 0xae, 0xe1, 0x5e, 0xd9, 0x06, 0x57, 0xcd, 0x5f, 0x37, 0xb2, 0x2b, 0x35, 0x23, 0xe3, 0xf7, 0xee, 0xe0, 0x36, 0xa2, 0x49, 0x01, 0x82, 0xf1, 0x04, 0x18, 0xa2, 0xa2, 0xf5, 0x79, 0x29, 0x52, 0x56, 0x40, 0x52, 0x9e, 0x61, 0x95, 0x36, 0x89, 0x1d, 0x2e, 0x42, 0x1d, 0x77, 0x16, 0xe7, 0x56, 0x94, 0xad, 0x93, 0x3b, 0x66, 0xf1, 0xe1, 0x4e, 0x7d, 0xfb, 0x0d, 0x26, 0x20, 0xcc, 0xaa, 0x5b, 0x9d, 0x4a, 0x97, 0xa2, 0xdd, 0x86, 0x2f, 0x39, 0x3b, 0x40, 0xc0, 0x86, 0x96, 0xad, 0x3e, 0xfb, 0xa5, 0x78, 0x39, 0x3c, 0x8b, 0x06, 0x0d, 0x84, 0xac, 0xfe, 0x59, 0x45, 0xbe, 0x09, 0xb2, 0x0e, 0x23, 0xd6, 0x98, 0xb2, 0x76, 0x62, 0xa8, 0xa7, 0x64, 0x76, 0x14, 0xac, 0xbd, 0x71, 0x51, 0xae, 0xca, 0x47, 0x0f, 0xed, 0xe2, 0xca, 0x6e, 0x5b, 0x38, 0x28, 0x6f, 0x44, 0xf7, 0xb5, 0xa8, 0x34, 0x91, 0xeb, 0x3d, 0x16, 0x53, 0xaf, 0x0b, 0x99, 0x3e, 0xd6, 0x26, 0xd8, 0x12, 0xe8, 0x86, 0x39, 0xab, 0x24, 0xfd, 0x95, 0x90, 0xc4, 0x6c, 0x9a, 0xca, 0x82, 0x37, 0x6e, 0xf2, 0x5a, 0xf6, 0x95, 0x8e, 0x92, 0x6e, 0x15, 0x9e, 0xf8, 0xbf, 0xd8, 0x71, 0x6b, 0xde, 0x51, 0xbd, 0x9c, 0x46, 0x63, 0xef, 0x16, 0xeb, 0x7e, 0xc0, 0x7c, 0x70, 0x0b, 0x09, 0x12, 0x99, 0x0a, 0xd8, 0x7f, 0x03, 0xf9, 0xc3, 0xd2, 0x13, 0xf8, 0x7c, 0xc2, 0x2c, 0x2c, 0xa6, 0x3a, 0x25, 0x61, 0xe7, 0x15, 0xfa, 0xf3, 0x3f, 0x26, 0xc1, 0xee, 0x98, 0x7b, 0xe0, 0x74, 0x9e, 0xe2, 0x7e, 0x5f, 0xd0, 0xad, 0x37, 0x28, 0xd7, 0xb3, 0x14, 0x08, 0x17, 0x97, 0xba, 0x5c, 0x85, 0x4d, 0xe1, 0x4e, 0xb8, 0xd9, 0x08, 0xb2, 0x42, 0x5a, 0x67, 0x2e, 0x40, 0x48, 0x26, 0x9e, 0x30, 0xfa, 0xcc, 0xb6, 0x03, 0x6b, 0xfa, 0xe9, 0x73, 0x3d, 0x59, 0x8a, 0x97, 0xfe, 0xd1, 0x32, 0xb5, 0xab, 0xfc, 0x61, 0x57, 0x72, 0xda, 0x68, 0xa1, 0xbc, 0xc6, 0x86, 0xe1, 0x6b, 0xa8, 0x51, 0x68, 0x60, 0x6d, 0x57, 0x99, 0x41, 0xb4, 0x06, 0x3f, 0x79, 0xca, 0xc9, 0x24, 0x80, 0xd9, 0x74, 0xdf, 0x5c, 0x5c, 0xe2, 0xed, 0x68, 0xd6, 0xdc, 0x03, 0x54, 0xc4, 0x3d, 0xa3, 0x6d, 0xd0, 0x54, 0xee, 0x1e, 0x47, 0x8a, 0xb9, 0xb7, 0xcd, 0x45, 0xe2, 0x6e, 0x50, 0x0c, 0xe4, 0xa4, 0x3a, 0xeb, 0xaa, 0x69, 0xeb, 0x19, 0xa1, 0x41, 0x66, 0xd8, 0x11, 0x28, 0x4a, 0x9d, 0xad, 0xd5, 0x05, 0x71, 0x69, 0x3c, 0x44, 0x97, 0x8b, 0x56, 0xad, 0x6f, 0x05, 0x24, 0xd1, 0x9a, 0x02, 0xf2, 0x5c, 0x5f, 0xbf, 0xd9, 0x8f, 0x4d, 0x9c, 0x87, 0xf1, 0x22, 0x73, 0x43, 0x41, 0xec, 0x28, 0x2b, 0xae, 0x6e, 0x81, 0xc0, 0x4b, 0xc5, 0x38, 0xa5, 0xbd, 0x4c, 0x4f, 0xa4, 0x36, 0xbc, 0xa4, 0xf2, 0xa8, 0x98, 0xc5, 0xb4, 0x32, 0xc8, 0x05, 0xc1, 0xdf, 0x83, 0xd0, 0xaa, 0x8f, 0x73, 0x3b, 0xf8, 0x35, 0x14, 0xdf, 0xb4, 0x43, 0x5e, 0xe8, 0x2d, 0x63, 0xa3, 0x69, 0xf5, 0x68, 0xba, 0xf3, 0x2d, 0x84, 0x5d, 0x65, 0x02, 0xbb, 0xd0, 0x05, 0x78, 0x97, 0xc3, 0xd0, 0x67, 0x1e, 0x7a, 0x0f, 0xc2, 0x01, 0x2b, 0x2b, 0x1f, 0x16, 0xa8, 0xc2, 0x74, 0x08, 0x3d, 0xfa, 0x1f, 0x4e, 0xdc, 0x16, 0x2a, 0x59, 0x77, 0x47, 0xcc, 0x12, 0xae, 0xc4, 0x33, 0x83, 0xaa, 0x1c, 0x80, 0xd4, 0x49, 0xcb, 0x14, 0x7a, 0x7b, 0x0c, 0x0a, 0xab, 0xec, 0xef, 0x04, 0x15, 0xe3, 0xab, 0x2b, 0xcf, 0x6a, 0x35, 0x71, 0x90, 0xaf, 0x12, 0x1a, 0x1f, 0xaa, 0x69, 0x7a, 0x0a, 0x00, 0x5c, 0x00, 0x9b, 0x27, 0x98, 0x73, 0x08, 0xcb, 0x2b, 0x7c, 0xea, 0x71, 0x97, 0x65, 0xf0, 0x5b, 0x24, 0x20, 0xd5, 0xab, 0x7a, 0x8b, 0x8f, 0xcb, 0x6e, 0xf2, 0xca, 0x0b, 0x1d, 0xd5, 0x94, 0x8c, 0x37, 0xec, 0x5a, 0x5e, 0x9e, 0x69, 0x13, 0xe5, 0x30, 0x7d, 0xbb, 0x81, 0xe0, 0x1d, 0x03, 0x6d, 0x0c, 0x06, 0x47, 0xe8, 0x0b, 0xff, 0xc0, 0x93, 0x05, 0x5e, 0xfb, 0x1b, 0x07, 0xcd, 0x89, 0x17, 0x56, 0x4e, 0xf9, 0x34, 0x04, 0x7d, 0x03, 0x8f, 0xc2, 0x15, 0x06, 0x62, 0xf5, 0xb6, 0xb5, 0xe3, 0x0c, 0xe6, 0x0c, 0x69, 0x10, 0x55, 0x8a, 0xd1, 0x7c, 0x65, 0x9a, 0x20, 0x50, 0xe9, 0x52, 0x69, 0x61, 0x2d, 0x5f, 0xf2, 0xf3, 0x38, 0x40, 0x92, 0x89, 0x4d, 0xb3, 0x5d, 0xfc, 0xb8, 0x6d, 0x84, 0xcb, 0xc7, 0x0e, 0x76, 0xb2, 0x16, 0x54, 0x4b, 0x7e, 0x0f, 0x8f, 0x63, 0x1f, 0xb2, 0x55, 0x4a, 0xff, 0x92, 0x76, 0xdf, 0x92, 0x20, 0x32, 0xb6, 0x2f, 0x2c, 0xaa, 0xba, 0x1e, 0xa9, 0x95, 0x17, 0xf2, 0xb1, 0x34, 0x57, 0x18, 0xc9, 0x88, 0xca, 0xb1, 0x65, 0xc2, 0x2c, 0x9d, 0xaf, 0xfb, 0x82, 0xd8, 0x84, 0x25, 0x45, 0x0a, 0xbf, 0x42, 0xc2, 0x59, 0xbb, 0xd4, 0xc1, 0x82, 0x13, 0x94, 0x65, 0x28, 0xac, 0x66, 0x53, 0x6c, 0xf6, 0x8d, 0x16, 0xbd, 0x6e, 0x1b, 0xc3, 0xf1, 0x68, 0xac, 0xd8, 0x95, 0x0b, 0x54, 0x6a, 0x82, 0x9d, 0xd6, 0x80, 0xb1, 0x01, 0x17, 0xba, 0x51, 0x7d, 0xd2, 0x36, 0x16, 0xc1, 0x8c, 0xb3, 0xd3, 0x25, 0xcb, 0xf7, 0x4b, 0x33, 0x83, 0x6f, 0x45, 0x65, 0xd1, 0x16, 0xde, 0x2f, 0xeb, 0x97, 0x23, 0x40, 0x58, 0xb6, 0xdf, 0x06, 0x5c, 0xec, 0xb2, 0x70, 0xb7, 0x51, 0x63, 0xf7, 0x8f, 0xc0, 0x77, 0xdf, 0xaa, 0x35, 0x03, 0xba, 0xe0, 0x79, 0xbe, 0x2f, 0xd0, 0x02, 0x5a, 0xf9, 0xd3, 0x14, 0x15, 0x32, 0x2e, 0x2d, 0x8b, 0xd2, 0x8c, 0xa0, 0xce, 0x73, 0xab, 0x80, 0xb8, 0x57, 0x55, 0xbf, 0x80, 0xab, 0x92, 0x97, 0x8c, 0x0d, 0x1c, 0x29, 0x86, 0x4d, 0x13, 0x65, 0xb2, 0x70, 0xf2, 0x29, 0x7f, 0xfb, 0xc2, 0xad, 0x5c, 0x6e, 0x8d, 0x1e, 0xcc, 0x0e, 0x16, 0x89, 0xbd, 0xe7, 0xc7, 0xfb, 0x16, 0x12, 0xeb, 0xe7, 0x8f, 0x34, 0x1d, 0xc7, 0xc5, 0x47, 0x00, 0x06, 0x8e, 0x9d, 0x31, 0x1e, 0x89, 0x21, 0x7a, 0xfe, 0xfa, 0xe1, 0x49, 0xae, 0xd5, 0xc9, 0x60, 0x35, 0x19, 0xb1, 0xcd, 0xbb, 0x5f, 0x9b, 0x1d, 0xeb, 0xb3, 0x35, 0xcd, 0x9b, 0xa2, 0xa6, 0x01, 0xaf, 0x94, 0x86, 0x78, 0x3a, 0x5d, 0x2e, 0xc0, 0xe7, 0x0e, 0x33, 0xa6, 0x98, 0x11, 0x2d, 0xf1, 0x4c, 0x75, 0xbd, 0x50, 0x46, 0x86, 0xce, 0x90, 0x6c, 0xa1, 0x1a, 0x12, 0xed, 0x46, 0xf0, 0x7d, 0x26, 0x6f, 0x35, 0xb0, 0xc7, 0x20, 0xaa, 0xfb, 0x31, 0x40, 0x6c, 0x8e, 0x23, 0xa7, 0xc1, 0x31, 0x96, 0x78, 0x11, 0x36, 0xe5, 0xb1, 0x33, 0xac, 0x31, 0x00, 0xeb, 0xd6, 0x04, 0xd9, 0xb0, 0xdc, 0x34, 0xc5, 0xb2, 0xbf, 0x0b, 0xfd, 0x1b, 0x92, 0xa4, 0x37, 0x95, 0xe8, 0x98, 0xc0, 0x0d, 0x89, 0xdb, 0xcb, 0xb7, 0x69, 0xe0, 0x09, 0x53, 0xda, 0x04, 0x79, 0xae, 0x00, 0x29, 0x82, 0x6b, 0x85, 0xa1, 0x3f, 0x03, 0x8f, 0x4f, 0x1a, 0x0b, 0xef, 0x08, 0x9c, 0xb6, 0x9c, 0x3f, 0x83, 0x9a, 0x5f, 0xe2, 0x15, 0xb7, 0xcf, 0x7f, 0xb5, 0xb5, 0x80, 0xab, 0xb4, 0x6d, 0x78, 0xa4, 0x69, 0xab, 0xe2, 0x35, 0x84, 0x32, 0x07, 0xda, 0x9f, 0x01, 0x79, 0x25, 0x16, 0xd5, 0x91, 0x60, 0x19, 0xef, 0x1c, 0x74, 0xff, 0x17, 0x52, 0x0a, 0xdd, 0xe1, 0x08, 0xef, 0x58, 0x2f, 0x26, 0xbd, 0xb7, 0xf7, 0x5a, 0xb8, 0x3d, 0x47, 0x0e, 0xf6, 0xb5, 0x86, 0x98, 0xc3, 0x4e, 0xfc, 0xb1, 0x43, 0xa9, 0x95, 0x29, 0x59, 0x31, 0xe1, 0xd9, 0xc8, 0xab, 0x60, 0xd8, 0x98, 0x0d, 0xfd, 0xf2, 0xbc, 0x94, 0xd8, 0x55, 0xf1, 0x11, 0x48, 0x8e, 0xe9, 0x84, 0x21, 0xb4, 0xa9, 0xeb, 0x32, 0xe3, 0x30, 0x5c, 0x12, 0xec, 0x59, 0x52, 0x1d, 0x4b, 0x02, 0x45, 0xb9, 0x5a, 0x6e, 0x7d, 0xde, 0xc4, 0xe8, 0x27, 0xd5, 0x3b, 0xa9, 0xa9, 0x3f, 0x6e, 0xfc, 0x33, 0x5a, 0x35, 0xa0, 0x96, 0x80, 0x0f, 0x6e, 0x5a, 0xf0, 0xcf, 0x3b, 0x0a, 0xd1, 0x92, 0x00, 0xd3, 0x74, 0xf4, 0x39, 0x4e, 0xda, 0x84, 0x8a, 0x99, 0x76, 0x75, 0xa8, 0xac, 0x33, 0x96, 0x77, 0xea, 0xb9, 0x84, 0x70, 0xf7, 0xec, 0x1d, 0x46, 0xca, 0xb6, 0x39, 0xc9, 0x03, 0x07, 0x95, 0x0a, 0x7e, 0x1a, 0x10, 0xc0, 0x28, 0xf9, 0x1a, 0xea, 0x11, 0x43, 0x69, 0xb6, 0xc3, 0x2d, 0xed, 0xa2, 0xd3, 0xc7, 0x07, 0xe1, 0xb5, 0x81, 0xf6, 0x00, 0xd4, 0xed, 0x92, 0xc9, 0xe2, 0xc6, 0x3c, 0x68, 0x6d, 0x32, 0x15, 0xcc, 0xb4, 0x44, 0x6e, 0x50, 0xb8, 0xc5, 0x80, 0x9b, 0x96, 0x34, 0x5d, 0xc4, 0x13, 0x0b, 0x27, 0xba, 0x79, 0x44, 0x80, 0xe4, 0xa2, 0x1c, 0x41, 0x04, 0x52, 0x17, 0x6f, 0x61, 0xca, 0x44, 0x6b, 0x25, 0x99, 0xc2, 0x68, 0x04, 0xb6, 0x83, 0x22, 0x1e, 0xcc, 0x50, 0xce, 0x27, 0xd5, 0x0d, 0x4c, 0xc5, 0xea, 0x3f, 0xa4, 0x39, 0x59, 0xcb, 0xb0, 0x42, 0xf9, 0x00, 0x16, 0x3e, 0xba, 0xd8, 0x7a, 0x93, 0x80, 0x7b, 0xf1, 0x4d, 0x32, 0x05, 0xb8, 0x09, 0x0d, 0x89, 0x26, 0x11, 0x3f, 0x56, 0xdf, 0xc8, 0xb1, 0x79, 0x4b, 0x49, 0x24, 0x83, 0x46, 0x4b, 0x7f, 0x8c, 0x19, 0x48, 0x67, 0x77, 0xa9, 0xde, 0x11, 0x78, 0xef, 0x75, 0x54, 0xd4, 0xa8, 0x22, 0x03, 0xe8, 0x4e, 0xcb, 0x79, 0x6d, 0x46, 0x8c, 0x75, 0xfa, 0x5b, 0x5a, 0x29, 0xca, 0x6b, 0xe6, 0x8d, 0xc0, 0x60, 0xc4, 0xf9, 0xa8, 0x62, 0xcd, 0xf3, 0xc0, 0x4c, 0xc2, 0x46, 0x77, 0x5c, 0x32, 0x54, 0x74, 0x2e, 0x9d, 0xac, 0xda, 0xeb, 0xd9, 0xdf, 0xcb, 0xbe, 0xb5, 0x90, 0x2b, 0x87, 0xdd, 0xcb, 0xa6, 0xd4, 0xfd, 0x98, 0xf4, 0x0d, 0x29, 0xcf, 0x5b, 0xee, 0x7d, 0x2d, 0x76, 0x3a, 0x00, 0xa8, 0x36, 0xae, 0xce, 0x00, 0x26, 0x34, 0x77, 0x97, 0xf3, 0x5a, 0xa2, 0x82, 0x2b, 0x02, 0xf6, 0xe0, 0x45, 0x5b, 0x3a, 0x6a, 0xe2, 0x10, 0xba, 0x4c, 0x52, 0xbf, 0xed, 0x34, 0x5a, 0xac, 0x56, 0xa8, 0x34, 0xb7, 0xa8, 0x9c, 0xd8, 0x8b, 0x2d, 0x44, 0x7a, 0x19, 0x68, 0x27, 0x54, 0x45, 0xfa, 0x75, 0xa5, 0xde, 0xc2, 0x9a, 0xfa, 0xd4, 0x48, 0x13, 0xac, 0xa5, 0x5c, 0x80, 0xaa, 0x19, 0xfa, 0xfb, 0x78, 0x2f, 0x71, 0xa9, 0x78, 0x57, 0xc4, 0x8e, 0x69, 0xe1, 0x51, 0xa6, 0x2d, 0xb6, 0xb0, 0x31, 0xcf, 0x46, 0xde, 0x4e, 0xc4, 0xc1, 0x9b, 0xcb, 0x71, 0x8a, 0x10, 0x3c, 0xee, 0xe9, 0xb5, 0x4a, 0x0a, 0x00, 0x72, 0x4e, 0x8f, 0x00, 0x05, 0x1f, 0xc7, 0x9c, 0xa3, 0x27, 0x3e, 0xbe, 0xe2, 0xbd, 0xca, 0x79, 0xd6, 0xaf, 0xc9, 0x40, 0x7a, 0x1d, 0xaa, 0x55, 0x52, 0x8e, 0xaf, 0x83, 0x4f, 0x3d, 0xf0, 0x10, 0xf3, 0xb4, 0xa4, 0xee, 0xb5, 0x9c, 0x9c, 0x31, 0xa7, 0xd4, 0x10, 0xc6, 0x56, 0xc0, 0x9e, 0x61, 0xf2, 0xe4, 0x90, 0xb7, 0xaf, 0xb1, 0x5e, 0xee, 0x6a, 0x9e, 0x73, 0x51, 0x90, 0x7b, 0x34, 0x49, 0x3c, 0x02, 0x3f, 0x88, 0x9f, 0xb0, 0xf0, 0x88, 0xa5, 0xd3, 0x2a, 0x34, 0xd5, 0xe3, 0x54, 0xe5, 0x7a, 0x15, 0xa1, 0x8f, 0x00, 0x2e, 0x95, 0x3d, 0xa0, 0x95, 0xc5, 0xba, 0x40, 0xad, 0xde, 0x91, 0x94, 0x61, 0xe8, 0x38, 0x8a, 0x01, 0xcc, 0x89, 0xe5, 0x4c, 0x14, 0x71, 0x27, 0xce, 0xf3, 0xec, 0xb5, 0x6c, 0x85, 0x31, 0x36, 0x3d, 0x57, 0x29, 0x3c, 0x9b, 0x2a, 0x26, 0x26, 0x7a, 0xf4, 0xd2, 0x45, 0xf9, 0x28, 0x66, 0x3d, 0x37, 0x37, 0x1c, 0xae, 0x68, 0x57, 0xe6, 0x14, 0x28, 0x83, 0x60, 0xec, 0x0e, 0xc3, 0x03, 0x19, 0x85, 0xad, 0x9c, 0x85, 0xd7, 0x2c, 0xfd, 0x0b, 0x8b, 0x80, 0xf3, 0x95, 0xf1, 0x86, 0x78, 0x81, 0xfb, 0x3a, 0x29, 0x4a, 0x4e, 0x7a, 0xfa, 0x64, 0x99, 0x0d, 0x28, 0x67, 0x26, 0xe3, 0x6f, 0x70, 0xaf, 0x9e, 0x7e, 0xc4, 0x72, 0x52, 0xa8, 0xb7, 0x87, 0x89, 0xdc, 0xcd, 0x72, 0x8b, 0xd7, 0x1e, 0xf5, 0xdc, 0x98, 0xff, 0x28, 0x05, 0x14, 0xde, 0xcb, 0x97, 0x2c, 0x6e, 0xda, 0x6e, 0xdc, 0x05, 0x62, 0x33, 0xb5, 0x42, 0x94, 0x24, 0x8d, 0xf2, 0x17, 0x18, 0x75, 0x34, 0xa3, 0xbd, 0xeb, 0xdc, 0xcc, 0x25, 0x51, 0x16, 0x1b, 0x81, 0x9e, 0x4c, 0x63, 0x2c, 0x54, 0x49, 0x52, 0xeb, 0xb2, 0x9e, 0x47, 0x73, 0x2a, 0x44, 0x63, 0x2b, 0x15, 0x84, 0xe3, 0x34, 0xa6, 0x14, 0xad, 0xa7, 0x1c, 0x83, 0x28, 0x1d, 0x3c, 0xd6, 0x51, 0x75, 0xff, 0x74, 0x0c, 0xd1, 0x88, 0x3f, 0xb7, 0xe2, 0x58, 0x04, 0x05, 0x66, 0xc5, 0x15, 0x0a, 0xee, 0xa8, 0x34, 0x92, 0xe5, 0x57, 0xb3, 0xb7, 0xce, 0xd3, 0xda, 0xb3, 0xcd, 0x42, 0x89, 0xf2, 0x69, 0x9f, 0x1e, 0x6c, 0x90, 0xb0, 0x99, 0x31, 0xdb, 0x38, 0xff, 0x45, 0x14, 0x6f, 0xfc, 0xaf, 0xf6, 0xaf, 0xcb, 0xcd, 0x33, 0x70, 0x5b, 0xea, 0xbc, 0x76, 0xaa, 0x12, 0x3c, 0x49, 0x75, 0x25, 0xe5, 0xe6, 0x14, 0x2b, 0x70, 0xb4, 0xa0, 0xe7, 0x5f, 0xb9, 0x56, 0xaf, 0x86, 0x0e, 0x40, 0x7b, 0xc9, 0x90, 0x12, 0x3b, 0x27, 0xd9, 0x52, 0x6e, 0xf8, 0x6f, 0xbb, 0xf0, 0x72, 0x3a, 0xe4, 0x13, 0x72, 0x3c, 0x1d, 0xf2, 0x7a, 0x7c, 0x99, 0x02, 0xf5, 0x43, 0xd3, 0xea, 0xc3, 0x8b, 0x2a, 0x95, 0xf1, 0xb5, 0xce, 0x85, 0xc8, 0x7a, 0xe0, 0x6a, 0x0a, 0x24, 0xd5, 0xf3, 0x78, 0xfe, 0x1c, 0xe4, 0x97, 0x09, 0x00, 0x69, 0xb4, 0xf0, 0xcf, 0xa9, 0x26, 0x3e, 0x3c, 0x9f, 0xd3, 0xcf, 0x02, 0x25, 0xf6, 0x84, 0xca, 0x52, 0x1f, 0x3b, 0x4f, 0x06, 0x7b, 0xff, 0xc0, 0xc3, 0x55, 0x7b, 0x66, 0xbf, 0xdd, 0xb5, 0x86, 0x37, 0x28, 0xf9, 0x89, 0x05, 0x79, 0x12, 0x5a, 0x75, 0xbf, 0xc1, 0x10, 0x55, 0x5e, 0x67, 0xcd, 0x4b, 0x32, 0x05, 0xe5, 0x6c, 0xd1, 0x66, 0x43, 0x09, 0x11, 0x9b, 0x09, 0xcc, 0xcb, 0xa8, 0x77, 0x04, 0xde, 0x7d, 0x0e, 0x3e, 0x76, 0x28, 0xf5, 0x15, 0x8e, 0x48, 0x9b, 0x4b, 0xb3, 0xc5, 0x9e, 0x18, 0x0b, 0xbe, 0xec, 0xc1, 0x97, 0xc3, 0x28, 0x6d, 0xb5, 0x45, 0x4f, 0x35, 0xe9, 0x4a, 0x9b, 0x7a, 0xdc, 0x65, 0xa7, 0x7b, 0xa5, 0xe6, 0xd5, 0x26, 0x48, 0x4e, 0xed, 0x2f, 0x7c, 0x06, 0x06, 0x60, 0xb2, 0x50, 0xaa, 0x30, 0x52, 0x7d, 0x35, 0x96, 0x48, 0x61, 0x7e, 0x1f, 0xbf, 0x04, 0xb9, 0x3f, 0x2c, 0x9a, 0x9c, 0xe4, 0x8f, 0xb5, 0xc1, 0x51, 0xf6, 0xba, 0x4c, 0x2a, 0x42, 0x91, 0xcd, 0xcb, 0x2d, 0xa1, 0x68, 0xde, 0x8c, 0xfc, 0x33, 0x2d, 0xd2, 0xd6, 0xdf, 0xb4, 0xd6, 0x3c, 0x9b, 0xfb, 0xd6, 0x03, 0x35, 0xa3, 0xbb, 0xfe, 0x82, 0x3e, 0x9e, 0x74, 0x01, 0x64, 0x8c, 0xd0, 0xbb, 0x03, 0x86, 0x9b, 0x6d, 0xf6, 0xcc, 0xa8, 0xe9, 0xd9, 0x5c, 0x8e, 0xba, 0x1c, 0xb5, 0x5b, 0x07, 0x57, 0xe0, 0x87, 0xba, 0xdd, 0xb1, 0x27, 0xe0, 0x94, 0x4b, 0x63, 0x53, 0x04, 0xe2, 0x2a, 0x97, 0xad, 0xc5, 0x25, 0x03, 0x9e, 0x9b, 0xe9, 0x21, 0x43, 0xec, 0x70, 0x57, 0x7f, 0xe4, 0xca, 0xc6, 0xfa, 0x54, 0x10, 0x72, 0xbd, 0xfa, 0x9a, 0xa3, 0xfc, 0x02, 0x71, 0x8c, 0x32, 0xcc, 0x07, 0x2b, 0x74, 0xf0, 0x26, 0x70, 0xfe, 0x80, 0x27, 0xa1, 0x13, 0x8d, 0x64, 0xfd, 0x04, 0xec, 0xf0, 0xa0, 0x8e, 0x39, 0x85, 0xa6, 0x68, 0x1d, 0xbd, 0x93, 0x1d, 0xcd, 0x85, 0xf3, 0x18, 0xd3, 0xcf, 0x3d, 0xfd, 0x11, 0x88, 0xfd, 0x40, 0x03, 0xca, 0x32, 0xf0, 0x44, 0x52, 0xf5, 0xd3, 0x54, 0x34, 0x5c, 0xb8, 0x98, 0xcd, 0x9e, 0x09, 0xa2, 0xfa, 0x78, 0xa0, 0xb3, 0x87, 0xcf, 0xdb, 0x7e, 0xeb, 0x96, 0xf3, 0x2f, 0x32, 0xf2, 0x89, 0xac, 0x3a, 0x9c, 0x82, 0x1b, 0x22, 0x88, 0x15, 0xa4, 0x00, 0xc4, 0x22, 0x78, 0xd2, 0xa2, 0xc6, 0x12, 0xb8, 0x19, 0x2c, 0xbd, 0x60, 0x69, 0xa6, 0x56, 0xc1, 0xfe, 0xfc, 0x53, 0x0c, 0x97, 0x04, 0x04, 0xdf, 0xa7, 0x72, 0x19, 0xbc, 0xfb, 0xf2, 0x65, 0xbb, 0x9e, 0x74, 0xe1, 0x7b, 0xfa, 0xc7, 0xf4, 0x5e, 0x3f, 0x6a, 0xf1, 0xf6, 0x09, 0x9f, 0xe2, 0xba, 0x3d, 0xc0, 0x84, 0xfe, 0x33, 0xd6, 0x92, 0x22, 0x1b, 0x68, 0x46, 0x09, 0x99, 0x91, 0x1e, 0xcc, 0xb3, 0x55, 0xdc, 0xb0, 0xed, 0x35, 0xd0, 0x56, 0xb2, 0x01, 0x59, 0x32, 0xf6, 0xee, 0xaa, 0x3e, 0x1a, 0xe9, 0xca, 0xf0, 0x10, 0x2a, 0xde, 0x69, 0xbf, 0x0b, 0xab, 0xef, 0xa9, 0x1b, 0x57, 0x9d, 0xcb, 0x6e, 0x6f, 0x59, 0xc4, 0x38, 0x2f, 0x07, 0x3a, 0x9a, 0xfd, 0xfc, 0x7a, 0xbc, 0x36, 0xb6, 0x5e, 0x1c, 0x2d, 0xca, 0x74, 0x26, 0x71, 0x1d, 0x5c, 0x04, 0x4f, 0x57, 0x72, 0xb7, 0x98, 0x95, 0xae, 0x67, 0xa5, 0x5f, 0xc8, 0xf7, 0x97, 0xd9, 0x9f, 0xdd, 0xe3, 0x3d, 0xdb, 0x31, 0x0f, 0x88, 0xd1, 0x03, 0xb6, 0x74, 0xa8, 0xf2, 0xd2, 0xa7, 0xba, 0xfa, 0x3b, 0x2a, 0x3d, 0x8e, 0x6a, 0x1c, 0x23, 0xe7, 0x83, 0xa8, 0x3e, 0x9b, 0x93, 0x34, 0xa8, 0x71, 0x15, 0xdb, 0x62, 0x74, 0xbc, 0x1e, 0x3b, 0x46, 0x6c, 0xd6, 0xf4, 0xb7, 0x89, 0x6d, 0xa1, 0x96, 0x75, 0x4e, 0x52, 0xc8, 0x54, 0x9a, 0xf3, 0x96, 0x13, 0x1d, 0x71, 0x4b, 0xa8, 0x80, 0x1f, 0xff, 0x9b, 0xc0, 0x57, 0xae, 0xc5, 0xdf, 0x64, 0x8d, 0x58, 0xd9, 0x9f, 0x9d, 0x1f, 0xd9, 0xd9, 0x80, 0x07, 0xad, 0xf9, 0x8c, 0xdf, 0x77, 0xe6, 0x1e, 0x5c, 0xa6, 0xa8, 0x30, 0x60, 0x25, 0xca, 0x2e, 0x7b, 0xd2, 0x02, 0x06, 0xb3, 0x32, 0x14, 0x7f, 0x80, 0x63, 0xf3, 0xcb, 0x1b, 0x52, 0x29, 0x5f, 0xf8, 0x2e, 0x7a, 0x02, 0x91, 0x1c, 0xc4, 0x24, 0x66, 0x2c, 0x2a, 0x72, 0x42, 0x8b, 0x71, 0xa7, 0xbf, 0xfb, 0xaa, 0xa5, 0x0c, 0x81, 0x12, 0xc4, 0xee, 0x5d, 0x36, 0x6a, 0x05, 0x3f, 0x5b, 0xdc, 0x51, 0xb8, 0x1c, 0x53, 0xf5, 0xef, 0x55, 0x53, 0x3a, 0x95, 0x40, 0x38, 0xd6, 0x1b, 0xde, 0x12, 0x6f, 0x22, 0x99, 0xb2, 0x5b, 0x33, 0x27, 0x05, 0xaa, 0xb0, 0xb1, 0xa1, 0x66, 0x0a, 0x35, 0x9e, 0x19, 0x35, 0x29, 0xa7, 0x90, 0x59, 0x61, 0x50, 0xdf, 0xcb, 0x32, 0xaa, 0xa5, 0x3b, 0xd8, 0x16, 0x91, 0x2f, 0x15, 0x56, 0x25, 0xb0, 0x1b, 0xea, 0xba, 0x42, 0xac, 0x99, 0xc5, 0x1a, 0x80, 0x4e, 0x58, 0x8c, 0xe7, 0x25, 0xec, 0xc3, 0xaf, 0xc6, 0x5d, 0xb4, 0x48, 0xf2, 0x36, 0x54, 0x26, 0x5b, 0x2f, 0x09, 0x67, 0xb9, 0xf4, 0x5f, 0xb6, 0x1a, 0x28, 0xfd, 0x6f, 0x79, 0xaa, 0xd7, 0x03, 0x93, 0x17, 0xa5, 0x9f, 0xf6, 0x90, 0x93, 0x08, 0x5b, 0xbd, 0x3a, 0xca, 0x35, 0x11, 0xcf, 0x91, 0x8a, 0x50, 0x9a, 0xd7, 0x02, 0x4f, 0xaa, 0xbf, 0x3e, 0xfc, 0xc8, 0x41, 0x6a, 0x9d, 0xa9, 0x88, 0x16, 0x5d, 0x68, 0x98, 0x41, 0x04, 0x33, 0x34, 0xb7, 0x06, 0x44, 0xff, 0x9e, 0xbf, 0x12, 0xe1, 0x4b, 0xfd, 0xc9, 0xac, 0x5a, 0xbf, 0xf8, 0x00, 0xfd, 0x3c, 0x8a, 0x6c, 0x94, 0x27, 0xf8, 0xd5, 0x7e, 0x32, 0xbd, 0x1c, 0x2f, 0xd1, 0x09, 0xfb, 0x83, 0x40, 0xb9, 0x30, 0x52, 0xc7, 0x87, 0xde, 0x45, 0x3d, 0x7e, 0x30, 0xe8, 0xcb, 0xb2, 0x3f, 0x00, 0xf2, 0x2d, 0x36, 0x1e, 0xcf, 0x2c, 0xb4, 0x74, 0x9e, 0x8c, 0x71, 0xe8, 0x7e, 0x7f, 0x25, 0x67, 0x73, 0x83, 0xa5, 0x7c, 0xb1, 0x95, 0x4f, 0x21, 0x18, 0xa1, 0xa9, 0xd5, 0xfb, 0x3e, 0x45, 0xee, 0x25, 0x98, 0xe8, 0x31, 0x1e, 0xad, 0xea, 0xa0, 0xaa, 0xbd, 0xe0, 0x93, 0x93, 0xfb, 0x79, 0x0a, 0xa8, 0x89, 0xa6, 0x42, 0x06, 0xa3, 0xfe, 0x86, 0x96, 0x1b, 0x60, 0x48, 0xd7, 0x05, 0xda, 0x70, 0xde, 0xb3, 0xc9, 0xf4, 0x9b, 0xe4, 0x42, 0xa9, 0x5d, 0x38, 0xb1, 0x59, 0x98, 0xe7, 0xc0, 0x15, 0xe7, 0xb3, 0x7b, 0xcc, 0x4d, 0x1b, 0xb1, 0x1d, 0xc0, 0xd2, 0x9d, 0x6a, 0xe8, 0x6f, 0xc5, 0x2e, 0x24, 0x66, 0x23, 0x90, 0xce, 0x37, 0x83, 0x38, 0xc0, 0xe5, 0x2c, 0x61, 0x16, 0xaa, 0xc2, 0x2f, 0x36, 0xe9, 0x6b, 0x43, 0x0e, 0x64, 0x31, 0x8e, 0x9d, 0xaf, 0xa8, 0x62, 0xb5, 0xe5, 0xd0, 0xcf, 0xff, 0x99, 0x3c, 0x2c, 0x3f, 0x0f, 0x74, 0xf4, 0xd9, 0xac, 0x99, 0xd4, 0x95, 0xac, 0x47, 0x01, 0x9f, 0x13, 0xbf, 0xcf, 0xd2, 0xe6, 0x46, 0x80, 0x35, 0x9a, 0xc8, 0x59, 0xc6, 0xcd, 0xc1, 0xfc, 0x77, 0x34, 0x5e, 0xf1, 0x77, 0xd5, 0xdf, 0x86, 0xb2, 0x76, 0x3f, 0xd9, 0x9b, 0x55, 0x17, 0x33, 0x29, 0x19, 0xc0, 0x97, 0x1f, 0x09, 0xb7, 0x9b, 0x91, 0x7c, 0x46, 0x77, 0xa4, 0x90, 0x61, 0x5c, 0x95, 0x1f, 0xcf, 0x07, 0xfd, 0xef, 0x8a, 0x95, 0x53, 0x29, 0x67, 0x99, 0xb2, 0x0d, 0xf9, 0x6c, 0xdc, 0xe3, 0xb3, 0xc4, 0x80, 0x35, 0x4e, 0x88, 0xb8, 0x3b, 0x6a, 0xe3, 0xd6, 0x97, 0x78, 0x98, 0x60, 0x43, 0xd7, 0x95, 0x59, 0xc7, 0x3d, 0xca, 0xc2, 0xaf, 0x59, 0x3b, 0x61, 0x3c, 0xb7, 0x54, 0xc1, 0x5a, 0xe3, 0x7d, 0x7a, 0xd2, 0xd1, 0xef, 0xb2, 0xc1, 0x7c, 0xc6, 0xe4, 0x49, 0xce, 0x57, 0xe1, 0x86, 0xc0, 0xc3, 0x14, 0xc3, 0xc2, 0xcd, 0x09, 0xee, 0x5d, 0xe8, 0x31, 0x4a, 0x17, 0x94, 0xdf, 0x64, 0x97, 0xeb, 0x97, 0x48, 0x09, 0x77, 0x88, 0xf4, 0xc4, 0x47, 0x57, 0x0d, 0x2a, 0x42, 0x1e, 0xd1, 0xd0, 0xbb, 0xb5, 0x4d, 0xe0, 0x45, 0x30, 0xd0, 0xbb, 0xc8, 0xa8, 0x9f, 0xe2, 0xd4, 0x3f, 0xea, 0x16, 0x36, 0x5e, 0xff, 0xbe, 0xc9, 0x41, 0xbe, 0x8a, 0x8f, 0xb6, 0x4d, 0x56, 0x00, 0x21, 0x0d, 0x51, 0xa2, 0xc4, 0xcc, 0x5e, 0xda, 0x3d, 0x3c, 0xba, 0x02, 0x50, 0xa3, 0xdf, 0xbb, 0xe7, 0xd5, 0xa9, 0x85, 0x57, 0x60, 0xb8, 0x8d, 0xe5, 0x06, 0x15, 0xc5, 0x89, 0x70, 0x18, 0x3a, 0xf2, 0x20, 0x89, 0xa3, 0xc9, 0xa8, 0x05, 0x35, 0x3a, 0x19, 0xa3, 0xbf, 0xb1, 0xbf, 0xd8, 0xf2, 0xe1, 0x0b, 0x98, 0x00, 0x0b, 0xd1, 0xbe, 0x6a, 0x7d, 0xb4, 0xae, 0x12, 0x59, 0xde, 0x39, 0x98, 0x97, 0xf4, 0xc1, 0xe3, 0x4d, 0x48, 0x9d, 0xfe, 0x2e, 0x51, 0xbe, 0x26, 0x51, 0x59, 0x93, 0x21, 0x35, 0x76, 0x2b, 0xd1, 0x01, 0xbb, 0x9a, 0x08, 0x10, 0xaf, 0x9d, 0x9e, 0xac, 0xfe, 0x81, 0xc1, 0x1a, 0x6f, 0x40, 0x8d, 0xd8, 0x16, 0xee, 0xdc, 0x22, 0xcb, 0x53, 0x60, 0xba, 0xdb, 0xda, 0xef, 0xe9, 0xfd, 0xaa, 0x1d, 0xc1, 0x87, 0x12, 0x10, 0xa6, 0xe1, 0x2a, 0x90, 0x0d, 0x3a, 0xb7, 0x5e, 0x82, 0x7b, 0x50, 0xc7, 0xf0, 0x79, 0xbf, 0x78, 0x1d, 0x6f ],
+const [ 0xca, 0xa5, 0xcc, 0x5d, 0x0d, 0x87, 0x68, 0x0e, 0xaf, 0xc2, 0x94, 0x29, 0xba, 0xc5, 0x5c, 0x9e, 0x33, 0x16, 0x7d, 0x48, 0x57, 0x89, 0xc7, 0xc1, 0x24, 0xb5, 0xc5, 0x7a, 0x1b, 0xa8, 0xa0, 0x0b, 0x45, 0xda, 0x41, 0xc7, 0x74, 0x60, 0xb6, 0x94, 0xcb, 0x62, 0xd7, 0xfa, 0x80, 0xcf, 0x29, 0x79, 0xe1, 0x4f, 0x02, 0x20, 0x95, 0x7a, 0xee, 0x5b, 0x25, 0x47, 0x52, 0x0d, 0xbb, 0xc7, 0x4f, 0xde, 0x29, 0x13, 0xe9, 0xd7, 0x2c, 0x83, 0x69, 0x2c, 0xf2, 0x20, 0xff, 0x58, 0xdb, 0x5c, 0xac, 0x6f, 0x7d, 0x01, 0x5f, 0xb0, 0xea, 0x68, 0x5f, 0x5a, 0x35, 0xeb, 0xe8, 0xc2, 0x32, 0x9c, 0x19, 0xa1, 0x7e, 0x38, 0x0e, 0xb2, 0xbf, 0x56, 0x49, 0x7d, 0x2d, 0xe4, 0x56, 0x6d, 0x52, 0xd4, 0xae, 0x29, 0x0d, 0x13, 0xdd, 0x21, 0xdd, 0xbb, 0xe0, 0x67, 0x5c, 0x89, 0xd1, 0xc1, 0x0a, 0x91, 0xc6, 0xfc, 0x4c, 0x30, 0xf6, 0x83, 0xb5, 0x43, 0x1d, 0x30, 0x83, 0x96, 0x22, 0x61, 0x6d, 0xa0, 0xf7, 0x4f, 0x9c, 0x6d, 0xc2, 0x9b, 0xf7, 0xdb, 0x3a, 0x2a, 0xa3, 0x09, 0x53, 0x33, 0xca, 0x0d, 0x1d, 0x96, 0x9c, 0xe5, 0xe9, 0x70, 0x94, 0xb0, 0xaf, 0xec, 0xfd, 0x1f, 0xac, 0x5c, 0xb4, 0x26, 0x4f, 0x88, 0x2f, 0xf7, 0x56, 0x45, 0xbe, 0x30, 0x35, 0x4a, 0x11, 0x53, 0xb7, 0x40, 0xfb, 0x78, 0xe7, 0x18, 0x75, 0x3e, 0x31, 0xa1, 0xe6, 0x07, 0xc5, 0x5a, 0xa2, 0x65, 0x3c, 0x85, 0xb0, 0xcf, 0x7e, 0x7c, 0xd0, 0x99, 0xe3, 0x48, 0xbc, 0x23, 0x98, 0x70, 0xaf, 0x50, 0x45, 0x0f, 0x24, 0x39, 0xec, 0x29, 0xe0, 0x23, 0x15, 0x3f, 0x32, 0xaf, 0x28, 0x21, 0x7a, 0x51, 0x1a, 0x04, 0xe8, 0x03, 0x4b, 0xd4, 0x86, 0x3b, 0xaf, 0xcc, 0x79, 0x1a, 0x2d, 0x43, 0x84, 0xe6, 0x44, 0xc9, 0xcd, 0xba, 0xf4, 0x72, 0xe4, 0x7c, 0xdc, 0x72, 0x01, 0x10, 0xa0, 0xea, 0x8d, 0xcb, 0x8d, 0x02, 0xe4, 0x2b, 0x80, 0x38, 0x5a, 0xc5, 0x03, 0xf8, 0x7c, 0x7e, 0xba, 0x6c, 0x98, 0xfe, 0xfe, 0x95, 0x7f, 0x62, 0xc7, 0x9b, 0x89, 0x31, 0xcf, 0x61, 0xda, 0x92, 0xf4, 0x5d, 0xe4, 0xbc, 0xde, 0xa7, 0x2d, 0xad, 0xe3, 0x4f, 0x52, 0x1f, 0x27, 0xf4, 0x4d, 0xb8, 0x08, 0x92, 0xf3, 0x81, 0xb9, 0x9c, 0xc0, 0x99, 0x2c, 0x4b, 0xd7, 0x2b, 0x36, 0x35, 0x45, 0x9d, 0xee, 0x21, 0x86, 0x0a, 0x56, 0x1a, 0x4a, 0xf3, 0x3d, 0xc2, 0x79, 0x31, 0x63, 0xe9, 0x74, 0x2e, 0xdf, 0x5e, 0x9e, 0x55, 0xbe, 0x05, 0x1b, 0xc7, 0xed, 0x2a, 0xd7, 0x50, 0x59, 0x15, 0xca, 0x99, 0x54, 0xdf, 0x7b, 0x9f, 0x3b, 0x84, 0xc3, 0x63, 0x55, 0x38, 0xd4, 0xe4, 0xff, 0xff, 0x79, 0x4a, 0x06, 0x78, 0xa0, 0x64, 0x55, 0xf9, 0x15, 0x54, 0xd0, 0xe1, 0x90, 0x89, 0x7f, 0x2a, 0xf2, 0xee, 0xef, 0x3e, 0xcc, 0x61, 0xd5, 0x0c, 0x21, 0x67, 0xf5, 0x5a, 0x6d, 0x1e, 0x42, 0x5d, 0xe5, 0x73, 0x47, 0x87, 0x01, 0x94, 0xc5, 0xa0, 0x38, 0xa9, 0x9e, 0x18, 0x0a, 0xbf, 0xf1, 0x9c, 0x44, 0x04, 0x87, 0xe7, 0x80, 0x3a, 0x6e, 0xdb, 0xeb, 0x66, 0xe3, 0xd0, 0x4b, 0xc8, 0x76, 0x2c, 0x40, 0x10, 0x68, 0x33, 0xc9, 0xcf, 0x58, 0x21, 0x0b, 0x2c, 0x1e, 0x76, 0x4e, 0xd8, 0xf8, 0x92, 0x49, 0x44, 0xe4, 0x81, 0x9f, 0x11, 0x4c, 0x18, 0xa9, 0xc8, 0xe8, 0x41, 0x76, 0xcb, 0xe1, 0x93, 0x10, 0x8b, 0x32, 0x26, 0x01, 0xfc, 0x54, 0xa5, 0x16, 0x46, 0x1a, 0xa4, 0x63, 0xbe, 0xda, 0x34, 0x87, 0x14, 0xcd, 0xb5, 0x32, 0xcd, 0xb8, 0xec, 0xe4, 0xf4, 0xcc, 0x56, 0xf7, 0x0d, 0xcb, 0xbb, 0xdf, 0x4b, 0x6d, 0x05, 0xb1, 0x03, 0x02, 0x53, 0xe2, 0x5f, 0x58, 0x4a, 0x51, 0x57, 0xdf, 0xab, 0x88, 0xdd, 0x0b, 0x2b, 0x3f, 0x58, 0xfa, 0x7f, 0x22, 0x54, 0x57, 0xb6, 0xd5, 0x78, 0x7e, 0xcb, 0x34, 0xb8, 0xe1, 0x7b, 0xdf, 0xcc, 0xaa, 0x54, 0xf6, 0xe0, 0xa2, 0x0f, 0x21, 0x8d, 0x51, 0x1f, 0xd4, 0x08, 0x67, 0x8a, 0xd1, 0x99, 0x5a, 0xf8, 0xee, 0x4f, 0x51, 0x09, 0x18, 0xf3, 0x41, 0xec, 0x98, 0x3a, 0x55, 0x2e, 0x95, 0x3e, 0x94, 0xcf, 0xda, 0x2f, 0xbe, 0x9b, 0xda, 0x46, 0x76, 0xb7, 0xf1, 0xfb, 0xa6, 0x7b, 0xed, 0x78, 0x20, 0x7f, 0xcd, 0x4d, 0x81, 0xf9, 0xc9, 0x65, 0x5b, 0x46, 0x92, 0x39, 0x93, 0xc6, 0xda, 0x43, 0x07, 0xed, 0x17, 0xb6, 0x74, 0x97, 0x84, 0x6c, 0x98, 0x9c, 0x69, 0x20, 0x93, 0xa5, 0x9d, 0xdd, 0x93, 0x3e, 0x49, 0xb6, 0xb0, 0x2c, 0xee, 0xb8, 0x15, 0x00, 0xaa, 0x1d, 0x61, 0xec, 0xb7, 0xc2, 0x4d, 0xd6, 0x34, 0xdc, 0x8e, 0xab, 0x28, 0xe6, 0xfd, 0xf6, 0xc4, 0xde, 0xf5, 0xb1, 0xe8, 0xb0, 0xfc, 0x5a, 0xe9, 0xf3, 0xa6, 0x4a, 0x92, 0xd3, 0xb7, 0x43, 0x68, 0x4e, 0x88, 0x48, 0x32, 0xa4, 0xac, 0xb1, 0xb9, 0x08, 0xd2, 0x7e, 0xcd, 0x9c, 0xed, 0xec, 0x88, 0x9c, 0x93, 0x46, 0xd7, 0xd9, 0xa3, 0xfe, 0x35, 0x6a, 0x2b, 0xfc, 0xba, 0x9e, 0x89, 0x36, 0x55, 0x35, 0xd0, 0x81, 0x56, 0xcf, 0x6d, 0xa6, 0x2f, 0xa4, 0x0a, 0xb9, 0x7b, 0x76, 0xb2, 0xa6, 0x3f, 0xc4, 0x36, 0x0d, 0x70, 0x41, 0xd0, 0x50, 0xb6, 0x84, 0x07, 0xea, 0x70, 0x01, 0xd2, 0x02, 0xf8, 0x38, 0x00, 0x3f, 0x28, 0x2c, 0xd7, 0xdf, 0x1d, 0x17, 0xfc, 0x03, 0x3a, 0x5c, 0x93, 0x4d, 0x70, 0xbd, 0xa6, 0xad, 0xbd, 0xce, 0xcb, 0x78, 0xf3, 0xa9, 0x01, 0xbb, 0xbb, 0xe4, 0xdc, 0xce, 0xd9, 0xc0, 0xe2, 0x2c, 0xb2, 0xa3, 0x34, 0x81, 0x0b, 0xc9, 0x71, 0x05, 0x13, 0x36, 0xd7, 0x09, 0xa4, 0xef, 0xab, 0xcf, 0xc6, 0x69, 0xdb, 0x9f, 0x75, 0x42, 0xe3, 0x17, 0xa4, 0x2f, 0xed, 0xc3, 0x81, 0x36, 0x3c, 0xee, 0xfb, 0x1d, 0xca, 0xb7, 0x81, 0x22, 0x30, 0x67, 0x0d, 0xec, 0xc7, 0x01, 0x62, 0xc2, 0x0d, 0x1b, 0x92, 0xfb, 0x4a, 0xed, 0xc2, 0xb5, 0x73, 0xa8, 0x31, 0xca, 0x4e, 0x09, 0x77, 0x00, 0xd7, 0x2d, 0x0b, 0x80, 0xe3, 0xa7, 0x08, 0x8a, 0x03, 0xd0, 0x31, 0x66, 0xab, 0x5e, 0x32, 0x9e, 0x93, 0x38, 0x29, 0x6a, 0x5e, 0x89, 0x64, 0x6c, 0x7a, 0x13, 0x6c, 0x9d, 0x47, 0xc7, 0x43, 0x88, 0x7b, 0x92, 0xeb, 0xb6, 0xc5, 0x79, 0x27, 0x69, 0xb0, 0xe8, 0x86, 0x8d, 0xcb, 0x47, 0x9c, 0xeb, 0x07, 0xcf, 0x93, 0xa0, 0x60, 0x9c, 0xe3, 0xcd, 0xbf, 0x03, 0x5d, 0x91, 0x1f, 0x25, 0x6e, 0x34, 0xef, 0xc4, 0xa2, 0xa5, 0xb8, 0x56, 0x67, 0x27, 0x00, 0x58, 0x14, 0x47, 0x6e, 0xe5, 0x29, 0x11, 0x2f, 0x87, 0xd8, 0x83, 0x97, 0x4d, 0xc5, 0x42, 0x0c, 0x1e, 0x0b, 0x8c, 0x20, 0x4c, 0x7f, 0x6e, 0xfd, 0x6c, 0x38, 0x37, 0x06, 0x66, 0x4f, 0x2c, 0xbb, 0xc8, 0xe3, 0x7d, 0xdd, 0x60, 0x60, 0x78, 0xd3, 0x09, 0x01, 0xfd, 0x4d, 0xc5, 0x94, 0x32, 0x27, 0x0c, 0x7e, 0x77, 0x90, 0x64, 0xfe, 0x9d, 0x6b, 0x32, 0xb6, 0x52, 0xf5, 0xd0, 0x67, 0xe0, 0xa9, 0xdf, 0xfc, 0x18, 0x61, 0xdf, 0xca, 0x88, 0xbd, 0xfd, 0x16, 0xf5, 0xc8, 0x2b, 0xd7, 0x05, 0xd9, 0x76, 0xbe, 0x3b, 0xb8, 0x94, 0x74, 0x28, 0x02, 0xbd, 0x23, 0xe0, 0xcf, 0xbd, 0x37, 0xac, 0x91, 0x46, 0x66, 0xfe, 0x40, 0x8a, 0xed, 0xaa, 0xb4, 0x09, 0x1d, 0x52, 0x52, 0xa8, 0x17, 0x22, 0xea, 0x04, 0xd4, 0xbe, 0xe0, 0x05, 0x68, 0x79, 0x8a, 0xb6, 0x87, 0xc8, 0xda, 0x54, 0x48, 0xf6, 0x3d, 0xa5, 0x29, 0x19, 0xc2, 0x8a, 0x53, 0x44, 0x7f, 0xd8, 0x20, 0xfe, 0x31, 0x64, 0xdb, 0xf3, 0x22, 0x5d, 0xc7, 0xea, 0x50, 0xdf, 0x62, 0xf7, 0xcb, 0xc4, 0xea, 0xf2, 0x5f, 0xbe, 0x21, 0x27, 0x73, 0xa3, 0x4e, 0x4f, 0x31, 0x07, 0x84, 0xc0, 0xe7, 0x10, 0x26, 0xe0, 0xad, 0x86, 0xab, 0xdf, 0x49, 0x2a, 0x9f, 0xa6, 0x4f, 0x49, 0xea, 0x0a, 0x8d, 0x90, 0x55, 0x46, 0xa5, 0x22, 0x4a, 0xa8, 0xfc, 0xe8, 0xdb, 0x8a, 0xd3, 0x28, 0x07, 0x84, 0xb4, 0x5a, 0x38, 0xe0, 0x10, 0x37, 0x0f, 0x4e, 0x26, 0x12, 0x64, 0xd9, 0x26, 0x6b, 0x89, 0x1a, 0x97, 0xc2, 0xcf, 0xac, 0xf6, 0xa9, 0x4c, 0xe0, 0xa0, 0x1d, 0xdb, 0xb1, 0xf2, 0x16, 0x63, 0xfa, 0xae, 0x5d, 0x5d, 0xe6, 0xa0, 0x9e, 0x90, 0xa8, 0x82, 0xbe, 0x1f, 0x6d, 0x1e, 0x6e, 0xc6, 0x8f, 0xb2, 0x01, 0x61, 0x0c, 0x98, 0x7a, 0xae, 0x36, 0x26, 0xea, 0x53, 0xac, 0xd4, 0xf9, 0x23, 0x88, 0x9c, 0xc2, 0x9d, 0xda, 0xa7, 0xe4, 0xb5, 0x56, 0x25, 0xd5, 0xd8, 0x49, 0x7d, 0x7a, 0x2a, 0xd2, 0xa6, 0xf5, 0x12, 0x4e, 0xd4, 0xbf, 0xf8, 0x14, 0x58, 0xf6, 0x4d, 0x63, 0xc1, 0xf8, 0xcc, 0x98, 0x48, 0x30, 0x00, 0xa4, 0x6b, 0x30, 0x07, 0xbe, 0xd7, 0x00, 0x95, 0x55, 0x8b, 0xb6, 0x3c, 0x49, 0x3b, 0x47, 0xea, 0x5a, 0xf2, 0x9d, 0xb3, 0xe1, 0xfc, 0xea, 0xd0, 0xbe, 0x03, 0x3b, 0xe8, 0x91, 0x78, 0x50, 0x8f, 0x2d, 0x35, 0xab, 0x0d, 0x49, 0x60, 0xe7, 0x60, 0x79, 0x92, 0x4b, 0x84, 0x5d, 0x38, 0x9f, 0xf1, 0x18, 0x3a, 0x3e, 0x66, 0x04, 0xdb, 0x6d, 0xe5, 0xa5, 0xe1, 0xeb, 0xfe, 0xdb, 0xf5, 0xca, 0x51, 0x5b, 0x4c, 0x7c, 0x4f, 0x5f, 0x87, 0x31, 0x40, 0x9d, 0xd8, 0x61, 0x8a, 0x76, 0x67, 0xa4, 0x30, 0x71, 0xf4, 0xca, 0x99, 0xe7, 0xbd, 0x28, 0x93, 0x00, 0xa2, 0x30, 0x97, 0xde, 0x87, 0x45, 0x4f, 0x17, 0xfa, 0xcd, 0x55, 0x69, 0x15, 0x87, 0x3e, 0xa9, 0xa6, 0x1e, 0xd7, 0xfd, 0x8e, 0xff, 0xae, 0x4b, 0x67, 0x68, 0xd4, 0xf1, 0x6a, 0xc2, 0xe2, 0xb7, 0x8f, 0x31, 0x3a, 0x01, 0xf5, 0x69, 0x8f, 0x4a, 0x85, 0xc3, 0xa8, 0xcd, 0xd3, 0x90, 0x60, 0x85, 0x44, 0xad, 0xf2, 0x58, 0x76, 0x58, 0x73, 0x90, 0xdc, 0x41, 0xa0, 0x8a, 0xa9, 0xe4, 0xda, 0xb2, 0xf0, 0x17, 0x6f, 0xaf, 0x09, 0xdf, 0x1b, 0xda, 0x36, 0x88, 0xcf, 0xf5, 0x86, 0xf5, 0xb0, 0x1a, 0xfa, 0x34, 0x63, 0xf1, 0xe7, 0x55, 0x88, 0x26, 0x9b, 0x7d, 0x84, 0x1a, 0x43, 0x36, 0x84, 0xd9, 0x0d, 0x09, 0xbf, 0x4d, 0x89, 0x4f, 0xfb, 0xb1, 0x55, 0x44, 0x52, 0x47, 0xf9, 0x5d, 0x36, 0x4e, 0x10, 0xdc, 0xb3, 0x2f, 0xa9, 0xa1, 0xf4, 0xf7, 0xec, 0x43, 0x09, 0x09, 0x01, 0x5f, 0xe7, 0x15, 0x2d, 0x30, 0xb0, 0x44, 0x3e, 0x60, 0x35, 0xb5, 0x2a, 0x1e, 0xba, 0x2d, 0xf3, 0x71, 0xf9, 0x0a, 0xcd, 0xcc, 0x69, 0x79, 0x83, 0xe2, 0xbf, 0xe9, 0x17, 0xbb, 0xb5, 0xc0, 0xa9, 0x08, 0x0b, 0x4c, 0x99, 0xb4, 0xcc, 0xfc, 0xf0, 0xbb, 0xd3, 0xd0, 0xfc, 0x3f, 0x8d, 0x0e, 0x3b, 0xd9, 0x01, 0x37, 0x7b, 0x2d, 0x0d, 0x39, 0x3e, 0xc1, 0xf2, 0xe6, 0x63, 0x0f, 0x13, 0xa5, 0x03, 0xd8, 0xf9, 0x67, 0x9a, 0xbc, 0x9b, 0xdd, 0x67, 0x08, 0xdc, 0xe9, 0x15, 0xcf, 0x56, 0x52, 0x9a, 0x3c, 0x56, 0xbb, 0x60, 0x26, 0x27, 0xd6, 0xa2, 0xe5, 0x94, 0xd5, 0x1a, 0x64, 0xa8, 0x21, 0xd9, 0x78, 0xb8, 0x4f, 0x76, 0x70, 0xa4, 0x50, 0x6a, 0xee, 0x59, 0xe7, 0xbb, 0xf5, 0x9a, 0x60, 0xd8, 0x42, 0x01, 0x80, 0xc4, 0xe0, 0x40, 0xb8, 0x77, 0xf7, 0xad, 0x9d, 0x82, 0xe5, 0xfe, 0x9d, 0xf1, 0x8f, 0x50, 0xea, 0x75, 0xf9, 0x6f, 0xbb, 0xc3, 0x15, 0x51, 0xb4, 0x37, 0xd9, 0xe3, 0xa2, 0xbd, 0x94, 0x09, 0x6c, 0xf1, 0x82, 0xdf, 0x47, 0x85, 0x9e, 0x46, 0x28, 0xe3, 0xb7, 0x9c, 0x7f, 0x14, 0xc6, 0xca, 0x22, 0xe1, 0x7f, 0x84, 0x87, 0x38, 0x26, 0xcc, 0x37, 0xd1, 0xa4, 0xb8, 0x7f, 0x10, 0xda, 0x76, 0x69, 0x2e, 0x35, 0x8d, 0xeb, 0x94, 0x83, 0x65, 0x5d, 0x87, 0x05, 0x0a, 0x30, 0x0a, 0xc5, 0x2d, 0xde, 0x00, 0x29, 0x6c, 0x1d, 0x92, 0xc9, 0xd3, 0x58, 0xd0, 0x7e, 0xa2, 0x5f, 0x9b, 0xbb, 0x50, 0x5e, 0xc2, 0x21, 0xd1, 0x0c, 0x6b, 0x4d, 0x15, 0x24, 0xb5, 0xf5, 0xd1, 0x19, 0x9b, 0x33, 0x81, 0x06, 0x1c, 0x20, 0xae, 0xe3, 0x98, 0xa5, 0x6c, 0xff, 0x7e, 0x8e, 0x28, 0xaa, 0x24, 0xe0, 0xa0, 0x32, 0xf6, 0x6d, 0x33, 0x12, 0xd3, 0xa5, 0x5b, 0x65, 0xb4, 0xaf, 0x78, 0xa1, 0x8f, 0xb9, 0xcf, 0x81, 0x7b, 0x8c, 0xd2, 0x43, 0x14, 0x63, 0xa2, 0x14, 0x21, 0xfd, 0xd2, 0xc9, 0x74, 0xf1, 0x6e, 0xcf, 0x12, 0x42, 0x3b, 0x65, 0x94, 0x33, 0x41, 0x08, 0xcd, 0x5c, 0x87, 0x2f, 0xad, 0xfe, 0x1e, 0x39, 0x65, 0x94, 0x60, 0xa4, 0xcc, 0xaa, 0x7a, 0x7f, 0x02, 0xf2, 0x28, 0x22, 0x53, 0x95, 0xc0, 0x1c, 0x5e, 0xc7, 0x72, 0x6d, 0x76, 0x9e, 0xce, 0xf6, 0x48, 0x24, 0x86, 0x2d, 0xbe, 0xab, 0x76, 0x15, 0x24, 0x60, 0xe1, 0x6e, 0x8a, 0x23, 0xfe, 0x28, 0x69, 0x96, 0xb3, 0x1e, 0x89, 0x74, 0xa0, 0x01, 0x21, 0x25, 0x5f, 0x92, 0x41, 0x8f, 0x0a, 0x15, 0x6d, 0x2e, 0xfe, 0x02, 0x8a, 0x67, 0xdf, 0xfd, 0xff, 0x19, 0xdd, 0x08, 0x14, 0x76, 0x35, 0xf8, 0x9d, 0x11, 0xfa, 0x25, 0xdd, 0x37, 0x15, 0x66, 0xa5, 0x83, 0x8b, 0x3d, 0xbc, 0xad, 0xfe, 0x4e, 0x83, 0xa3, 0x77, 0x16, 0xd9, 0xdb, 0x62, 0xd9, 0x3d, 0xe7, 0xda, 0xdc, 0x32, 0x4a, 0x27, 0xd5, 0xe8, 0x8a, 0x85, 0xa0, 0x18, 0x86, 0x27, 0x33, 0x30, 0x0a, 0x7c, 0xd4, 0xb0, 0xa1, 0xb1, 0x8a, 0xd4, 0xaa, 0x77, 0xd1, 0x73, 0xae, 0x06, 0x91, 0x27, 0xf1, 0x62, 0x51, 0xae, 0x47, 0xdd, 0xa8, 0x90, 0x29, 0xdd, 0xf5, 0x02, 0x08, 0xdf, 0x50, 0x0b, 0xe1, 0xbc, 0xc1, 0xe5, 0x12, 0x2b, 0xaf, 0xa6, 0x6c, 0x88, 0x9b, 0x20, 0x89, 0xd4, 0x0e, 0x05, 0x60, 0xfc, 0xcf, 0x4f, 0x16, 0x5e, 0x5a, 0xde, 0x18, 0x89, 0x8e, 0x63, 0x66, 0x44, 0xa6, 0x7e, 0x32, 0xd3, 0x6a, 0x23, 0xa9, 0x75, 0xa6, 0x42, 0x11, 0x31, 0xdc, 0xa7, 0x14, 0xd2, 0x36, 0x1f, 0x5b, 0x31, 0xbe, 0xdc, 0x5f, 0xb2, 0xd1, 0x1a, 0x7c, 0x11, 0xd1, 0x03, 0x48, 0x5f, 0x1b, 0xd0, 0x22, 0x47, 0x39, 0x32, 0x0e, 0x96, 0x58, 0xf0, 0xc0, 0xfb, 0xfc, 0xd1, 0xf6, 0x0a, 0xf2, 0xbc, 0x0b, 0x87, 0x87, 0x1e, 0xc9, 0xe2, 0xf7, 0x8c, 0x80, 0xfe, 0x28, 0xaa, 0x54, 0x36, 0x98, 0x4b, 0xdb, 0xa2, 0x94, 0xd9, 0xe8, 0x96, 0xac, 0xf8, 0xa1, 0x6c, 0x63, 0x66, 0xd8, 0x84, 0x2b, 0x25, 0x98, 0x88, 0x90, 0xdd, 0xfd, 0xf5, 0xb3, 0x7c, 0x49, 0xd7, 0xfa, 0x1f, 0x35, 0xd4, 0x06, 0x35, 0x85, 0x6b, 0xe5, 0xe1, 0xdf, 0x7e, 0x89, 0xa1, 0xdd, 0x0e, 0x79, 0x2e, 0x61, 0x47, 0xc7, 0xa3, 0x29, 0xbc, 0x42, 0xe0, 0xa3, 0xf3, 0xec, 0x31, 0x02, 0x24, 0xaf, 0x2b, 0x91, 0x3e, 0x4b, 0xd7, 0x47, 0x2b, 0x93, 0x13, 0x9c, 0x55, 0xd9, 0x34, 0x9c, 0x69, 0xa7, 0xf0, 0x3a, 0x5b, 0xb0, 0x7c, 0xe6, 0xaa, 0x05, 0xf1, 0x62, 0xe5, 0x8c, 0xf4, 0xd1, 0x6e, 0xaf, 0x96, 0x11, 0x7e, 0x51, 0x79, 0x4a, 0x69, 0x06, 0x35, 0xc7, 0x23, 0x83, 0xf9, 0x05, 0x03, 0x53, 0x76, 0x0a, 0xc8, 0xcc, 0xf8, 0xf8, 0xda, 0x42, 0xd6, 0xe2, 0xd2, 0x7a, 0x0d, 0xde, 0x3b, 0x61, 0x28, 0x5c, 0x9a, 0xfe, 0x63, 0xb6, 0xad, 0xa6, 0x0f, 0x08, 0xf1, 0x6f, 0x38, 0x41, 0x66, 0xe7, 0x86, 0x7a, 0x96, 0x05, 0x61, 0x87, 0xd4, 0x5f, 0x58, 0xcc, 0xc2, 0x9e, 0xc4, 0x52, 0x16, 0x2f, 0xa8, 0x1b, 0x9d, 0x3c, 0xdc, 0xb2, 0x80, 0xdb, 0x6b, 0x05, 0xc6, 0x85, 0x39, 0x77, 0x1a, 0xc9, 0xe9, 0x32, 0xce, 0x41, 0xfd, 0xba, 0x21, 0xc6, 0x3f, 0xc8, 0xbd, 0xe0, 0x60, 0x55, 0x84, 0x80, 0xe0, 0xf5, 0x8c, 0xf2, 0x2d, 0x66, 0x68, 0x0d, 0x0f, 0x69, 0xaa, 0xad, 0x43, 0xd0, 0xa5, 0x63, 0x67, 0xd9, 0x78, 0x6a, 0x16, 0xba, 0x48, 0xdd, 0x53, 0x7d, 0xcc, 0x28, 0x2b, 0x0e, 0x0f, 0xbd, 0x96, 0x93, 0x71, 0x08, 0x9f, 0xfb, 0xef, 0xa4, 0xc4, 0xda, 0xa5, 0xcf, 0xa0, 0x74, 0x91, 0x1b, 0xc7, 0x17, 0x9a, 0x67, 0xf2, 0xaf, 0xd1, 0x0e, 0x5c, 0x94, 0xf6, 0x5e, 0x6b, 0xa6, 0x3e, 0x4c, 0x93, 0x9c, 0x53, 0x65, 0x78, 0x99, 0x9d, 0x08, 0x52, 0x00, 0xc0, 0xd3, 0x96, 0x8a, 0x66, 0x5b, 0xd3, 0x96, 0x3e, 0x20, 0xd9, 0xc0, 0x45, 0xc0, 0x21, 0xb4, 0x44, 0x6a, 0x69, 0x45, 0x99, 0x96, 0x9f, 0xb9, 0x3b, 0xf3, 0x00, 0x67, 0xf9, 0xa1, 0x81, 0x85, 0x02, 0xa1, 0x6e, 0x3b, 0xaa, 0x8a, 0x51, 0xfb, 0x6b, 0x7d, 0x15, 0x15, 0x2a, 0x5a, 0x6b, 0x86, 0xbc, 0x34, 0x6d, 0x11, 0xa9, 0x03, 0x81, 0x92, 0x30, 0x99, 0x81, 0x8e, 0x8b, 0xd8, 0x19, 0x0e, 0x74, 0x21, 0x70, 0xae, 0xe7, 0x0f, 0x0a, 0xf1, 0x2a, 0x66, 0xed, 0xd7, 0x0b, 0x46, 0x02, 0xb2, 0x69, 0xa5, 0xbf, 0x35, 0xf5, 0xfc, 0x03, 0xce, 0x3a, 0x3f, 0x41, 0x36, 0xdb, 0x13, 0xe1, 0x46, 0x1c, 0x3c, 0xe3, 0x0c, 0xa4, 0x54, 0xc6, 0x1e, 0x82, 0xc3, 0xa8, 0x2e, 0x6d, 0xeb, 0xae, 0xdf, 0x50, 0xa3, 0xa6, 0xd7, 0x06, 0xe7, 0xeb, 0x15, 0x61, 0xcd, 0x89, 0x85, 0x72, 0xbb, 0xa2, 0xd2, 0x04, 0xd8, 0x11, 0x7c, 0x6a, 0xc0, 0x4c, 0x2a, 0x7b, 0x7c, 0x8f, 0x41, 0xda, 0xb1, 0x37, 0xb5, 0x7b, 0x17, 0x6c, 0x20, 0x62, 0x2d, 0x02, 0x11, 0xae, 0x2c, 0xa1, 0xa6, 0xd7, 0x39, 0x24, 0x5d, 0x34, 0xde, 0x40, 0x27, 0xc0, 0xbb, 0x66, 0xbe, 0x1d, 0x79, 0xea, 0x39, 0xd9, 0x00, 0x64, 0xde, 0xf1, 0xea, 0x57, 0x37, 0x93, 0x37, 0x10, 0x68, 0x28, 0x42, 0xd1, 0xbf, 0x92, 0xf3, 0x2f, 0x8d, 0xb2, 0x37, 0xb9, 0x34, 0x2e, 0xad, 0xda, 0x82, 0x71, 0xa3, 0x01, 0x3d, 0xf3, 0x40, 0xfe, 0xff, 0xba, 0x02, 0xb0, 0x44, 0x21, 0x6c, 0xdd, 0xc2, 0xd8, 0xf8, 0x61, 0xf9, 0x2c, 0x53, 0x8b, 0x0a, 0x88, 0xc9, 0xc4, 0xcc, 0x3c, 0xfe, 0x71, 0x1d, 0x7e, 0xe0, 0x1b, 0x76, 0xae, 0xd9, 0xcd, 0xc3, 0xdf, 0x49, 0xbe, 0x71, 0x92, 0x33, 0x30, 0xc8, 0xc4, 0x37, 0x98, 0x7b, 0x2c, 0xc0, 0xff, 0x7d, 0xbe, 0x7e, 0xa8, 0x17, 0x73, 0x17, 0xf3, 0x38, 0x4c, 0x19, 0x81, 0x0c, 0x95, 0x34, 0x99, 0xcf, 0x67, 0xa6, 0xcb, 0xe4, 0x70, 0xf6, 0xd3, 0x21, 0xf6, 0xe5, 0xc0, 0x6e, 0x1a, 0xa2, 0x55, 0x8e, 0x5a, 0x3d, 0xaf, 0x3c, 0x5a, 0x5e, 0x28, 0x7a, 0xe4, 0x37, 0x7c, 0x26, 0x2d, 0xb7, 0x2a, 0xce, 0x5a, 0x00, 0x1d, 0xc5, 0x42, 0x1c, 0x8c, 0x76, 0x76, 0xeb, 0x1f, 0xf9, 0x7f, 0x60, 0x53, 0xe4, 0x66, 0xed, 0x1f, 0x64, 0x7a, 0x3c, 0xd8, 0x8c, 0x4d, 0x20, 0x52, 0xec, 0x00, 0xcb, 0x48, 0x66, 0xc0, 0x41, 0xfd, 0x3d, 0x91, 0x0d, 0x24, 0x6f, 0x4a, 0x32, 0xfd, 0x45, 0xe1, 0x64, 0xc2, 0x28, 0xe9, 0x78, 0x41, 0xb6, 0x59, 0x1a, 0xca, 0x15, 0x8f, 0xbe, 0x4b, 0x87, 0x95, 0xd9, 0xba, 0x3f, 0xa2, 0x50, 0xb3, 0x74, 0xe4, 0x30, 0x63, 0xb3, 0x7c, 0xa1, 0xa4, 0x79, 0xcb, 0x15, 0x69, 0x01, 0xec, 0xc5, 0x5d, 0x5b, 0x81, 0x5e, 0xc7, 0xbe, 0xb3, 0xf7, 0xb1, 0x1f, 0x74, 0x47, 0x49, 0x02, 0x07, 0x15, 0x87, 0x91, 0xc3, 0xef, 0x10, 0xeb, 0x14, 0x1f, 0x5b, 0xbe, 0xc2, 0xdb, 0x12, 0x18, 0x76, 0xbc, 0xbb, 0x7a, 0x7a, 0x72, 0x97, 0x2f, 0xc0, 0xb5, 0xca, 0xdb, 0x26, 0x7e, 0xbd, 0x57, 0xf8, 0x78, 0xc1, 0xbc, 0xb6, 0xb1, 0xf5, 0xbe, 0x18, 0x96, 0x69, 0x3c, 0x50, 0x1e, 0x83, 0x14, 0x8f, 0x45, 0xa2, 0x3c, 0xca, 0xbc, 0x02, 0x0f, 0xbe, 0xdf, 0xe0, 0xe4, 0x32, 0xe7, 0xde, 0xe5, 0x7c, 0x61, 0xa8, 0x1f, 0x46, 0xdf, 0xd8, 0xd5, 0x92, 0xed, 0x17, 0x1a, 0xfc, 0x46, 0x85, 0x9f, 0x3f, 0x48, 0x5c, 0xc9, 0xfb, 0xa6, 0xd0, 0x06, 0xb6, 0x5d, 0x39, 0x62, 0x20, 0xe9, 0x73, 0x55, 0x9b, 0xb8, 0x85, 0xdf, 0xfa, 0xdf, 0x82, 0xd7, 0x89, 0x0c, 0xad, 0x81, 0x4e, 0xbb, 0xe0, 0x5e, 0x8f, 0xad, 0x2f, 0x48, 0x95, 0x96, 0xc8, 0xbe, 0xaf, 0x17, 0x1d, 0x7c, 0x79, 0xeb, 0x46, 0x4e, 0x5d, 0x65, 0xa0, 0x27, 0x5b, 0x1a, 0xbb, 0x6d, 0x06, 0xdb, 0x73, 0x98, 0xcf, 0xe6, 0x5c, 0xfb, 0x86, 0x5c, 0x64, 0xe1, 0x1e, 0xf6, 0xb3, 0xdc, 0xb1, 0xf4, 0xd6, 0x5a, 0xc3, 0x57, 0x1d, 0x79, 0xcb, 0x50, 0x41, 0x1d, 0xf0, 0xf8, 0x4a, 0x3f, 0x10, 0x41, 0xb0, 0x88, 0x06, 0x2d, 0xc1, 0x1e, 0x2d, 0x3e, 0x42, 0xbe, 0x20, 0x2d, 0x59, 0x0b, 0xc4, 0xdf, 0xab, 0x25, 0x89, 0x94, 0xc1, 0x7e, 0xec, 0x62, 0xb0, 0xe9, 0x41, 0xe2, 0xf9, 0xf4, 0xaf, 0x29, 0xae, 0x78, 0x7c, 0xf9, 0xd6, 0x6e, 0x8a, 0x39, 0x13, 0x04, 0x22, 0xa3, 0x82, 0xf1, 0xf1, 0xbd, 0xe3, 0x05, 0x50, 0x0a, 0xfa, 0x04, 0xc9, 0x81, 0x34, 0xb4, 0xd6, 0x3e, 0x8e, 0x35, 0xeb, 0x78, 0xb3, 0x91, 0xb7, 0xb3, 0x64, 0x94, 0xa8, 0x36, 0x1d, 0xde, 0xad, 0xc0, 0xf6, 0x36, 0x3f, 0x77, 0xc7, 0x21, 0xa2, 0x21, 0x8f, 0xb3, 0x68, 0x96, 0x17, 0xa6, 0x38, 0x75, 0xd2, 0xa9, 0xcd, 0x17, 0x08, 0xfa, 0x41, 0xc1, 0x33, 0x37, 0x8c, 0x1e, 0xaa, 0x72, 0x48, 0xec, 0x7c, 0x83, 0xb7, 0xf5, 0x9f, 0xa2, 0x06, 0x41, 0x4a, 0x35, 0xd3, 0x8a, 0x9f, 0xe6, 0xee, 0xf0, 0x8d, 0xf9, 0x5c, 0xee, 0xf5, 0xdc, 0xa2, 0x8d, 0x0b, 0x00, 0x40, 0xd7, 0x00, 0xe8, 0x7b, 0x8f, 0xde, 0x80, 0x5f, 0x1f, 0xb3, 0xaf, 0x05, 0xd2, 0xf1, 0x2f, 0x12, 0x43, 0x15, 0x9d, 0x80, 0x16, 0x87, 0xcc, 0xa1, 0xe5, 0xc1, 0x5f, 0x60, 0x7d, 0xb4, 0x97, 0xcb, 0x4b, 0x67, 0x69, 0xce, 0x11, 0xe2, 0xd4, 0x41, 0xdd, 0x4a, 0x71, 0x26, 0x3c, 0x4d, 0x4c, 0x2b, 0xab, 0xc1, 0xf2, 0x77, 0x4e, 0x87, 0xcb, 0xa2, 0xe5, 0xb6, 0xaa, 0x05, 0xfb, 0xf5, 0xa3, 0x35, 0x60, 0x29, 0x1d, 0xca, 0xda, 0x51, 0x27, 0x65, 0x18, 0xad, 0x10, 0xf1, 0xe7, 0x26, 0x31, 0x28, 0xa9, 0xea, 0x0e, 0x59, 0x02, 0x57, 0x9e, 0x69, 0xd4, 0x1a, 0xe6, 0x19, 0x6e, 0x98, 0xcd, 0x86, 0x00, 0x8d, 0x2b, 0xf6, 0x52, 0xf2, 0x23, 0xd1, 0xb6, 0x25, 0xb3, 0xee, 0x3c, 0x44, 0x89, 0x10, 0x24, 0xd9, 0x18, 0xb1, 0x99, 0xbd, 0xec, 0xfe, 0x9c, 0x36, 0x3a, 0x22, 0x3e, 0x63, 0xbc, 0xc7, 0x12, 0xda, 0xbb, 0xda, 0xe2, 0x8f, 0x6e, 0x8f, 0xa1, 0xf8, 0x82, 0xa6, 0xa1, 0x6e, 0xfa, 0xec, 0x06, 0xd7, 0x39, 0x04, 0x7b, 0x82, 0x5d, 0x67, 0x23, 0x52, 0xcf, 0xaa, 0xd2, 0x1f, 0x18, 0x00, 0x7e, 0x59, 0xf7, 0xff, 0xf0, 0xee, 0xb0, 0xa7, 0xbf, 0x6e, 0xa6, 0xa0, 0x7f, 0x6e, 0x2c, 0xc3, 0x36, 0x2a, 0x99, 0xdc, 0x0f, 0x6e, 0x9a, 0xae, 0x53, 0xb6, 0xcd, 0x38, 0x94, 0x94, 0x8b, 0x37, 0x2c, 0x52, 0x05, 0xec, 0xe6, 0xd8, 0x92, 0x1f, 0xfa, 0xd1, 0x47, 0x64, 0x3f, 0x0a, 0xc9, 0x9d, 0x9c, 0x1a, 0x5f, 0xc0, 0xbf, 0x48, 0x4b, 0xdb, 0x12, 0xa9, 0x5b, 0x55, 0xeb, 0x89, 0xbb, 0x76, 0x04, 0x0c, 0x0d, 0x29, 0x2a, 0x15, 0xbb, 0x01, 0x39, 0x67, 0x8c, 0x7b, 0x47, 0x0b, 0x76, 0x83, 0x20, 0xf1, 0xb4, 0x39, 0xf3, 0xda, 0x18, 0xf4, 0x4a, 0x74, 0xa1, 0x87, 0x3f, 0xc7, 0x50, 0xc4, 0xed, 0xd1, 0x38, 0x3f, 0x26, 0x6d, 0xd5, 0x55, 0x64, 0x7a, 0x9e, 0x6c, 0x01, 0x38, 0xdd, 0x7b, 0xaa, 0xf5, 0xbf, 0xce, 0x11, 0xea, 0xa7, 0x03, 0xe2, 0x60, 0xc8, 0x59, 0xf9, 0x17, 0xf3, 0x2a, 0xd2, 0xe7, 0xad, 0xb5, 0x40, 0xa8, 0x85, 0x21, 0x62, 0x50, 0xa5, 0xbf, 0xd3, 0x5b, 0xa6, 0x90, 0x22, 0x70, 0xa9, 0x07, 0x82, 0x41, 0xa3, 0x0f, 0xc2, 0xb3, 0xf8, 0x50, 0x7f, 0x3f, 0x4c, 0xae, 0x98, 0x97, 0x95, 0x13, 0xe2, 0x8d, 0x75, 0x6f, 0x1d, 0x31, 0xc8, 0xfd, 0x27, 0x3a, 0x79, 0xc7, 0x70, 0xa8, 0x99, 0x6c, 0xae, 0xa7, 0xb2, 0x21, 0xd2, 0xb5, 0x58, 0xf6, 0x3a, 0x07, 0x02, 0x5b, 0x28, 0x29, 0x18, 0xe2, 0x73, 0xe6, 0x4d, 0x46, 0x7c, 0x67, 0x2f, 0xad, 0x64, 0x9f, 0xfc, 0x2a, 0x7c, 0xe6, 0xb8, 0x86, 0xfd, 0xe3, 0x7c, 0x40, 0xfa, 0xb0, 0x11, 0xd2, 0x92, 0x39, 0xbe, 0x36, 0x6a, 0xe5, 0x5d, 0xa9, 0x5b, 0x79, 0xb4, 0xaf, 0x67, 0x39, 0x03, 0x57, 0xf2, 0x50, 0xda, 0xc0, 0x2e, 0x71, 0x2d, 0xdc, 0xd8, 0xbf, 0xaa, 0x74, 0x22, 0xea, 0x4a, 0x6c, 0xf0, 0x9b, 0x27, 0x49, 0x46, 0x13, 0x8d, 0xf0, 0x01, 0x0f, 0x53, 0xb0, 0xc6, 0xee, 0x6c, 0x83, 0x39, 0x15, 0xb9, 0x91, 0x6f, 0x93, 0x21, 0xf6, 0xa5, 0x01, 0xe4, 0xc5, 0x32, 0xac, 0x2c, 0x4d, 0xba, 0xf7, 0xe6, 0x9b, 0xa5, 0xfa, 0xcf, 0x40, 0xcf, 0x6f, 0xd2, 0x54, 0x81, 0xcf, 0x91, 0xba, 0xa1, 0xb8, 0x42, 0xa6, 0x25, 0x92, 0xbc, 0x5d, 0xcd, 0x72, 0xd1, 0x3c, 0x12, 0x3e, 0xdf, 0xfc, 0x5a, 0x13, 0xa2, 0x34, 0x6d, 0xe3, 0x4c, 0x1f, 0x2c, 0x63, 0xd8, 0xa0, 0x81, 0x24, 0x9b, 0x83, 0x92, 0xff, 0x1c, 0x06, 0x3a, 0xb7, 0x25, 0x98, 0xb9, 0xda, 0x1a, 0xe0, 0xaa, 0xe8, 0x8a, 0x01, 0x36, 0xb7, 0x04, 0x1d, 0x88, 0x16, 0x2c, 0x18, 0x80, 0xb1, 0x0d, 0x9e, 0xac, 0x35, 0xb1, 0x67, 0x74, 0xb4, 0xef, 0xb9, 0x94, 0x4a, 0x85, 0x2f, 0xd0, 0x01, 0x67, 0xba, 0xe2, 0xf2, 0x56, 0xe5, 0xb8, 0xad, 0xb3, 0x5d, 0xdc, 0xdb, 0x96, 0xb0, 0x34, 0x22, 0x1b, 0x55, 0xeb, 0x49, 0xfc, 0xed, 0xaf, 0x9d, 0x65, 0xc8, 0x1d, 0x93, 0x03, 0xab, 0x79, 0xae, 0x5f, 0xd0, 0xa3, 0xa3, 0x6a, 0x2f, 0x46, 0xbc, 0x58, 0xfc, 0x53, 0x7a, 0xb2, 0x71, 0xae, 0x7e, 0xa7, 0xcd, 0x27, 0xa9, 0xa4, 0x9d, 0xab, 0x83, 0x24, 0x3a, 0xbb, 0xd9, 0xc8, 0x93, 0x1e, 0xab, 0xaa, 0x2c, 0xd3, 0x45, 0xef, 0x67, 0x4a, 0xab, 0x9b, 0x03, 0xd4, 0x3a, 0xa9, 0xe2, 0x57, 0x8d, 0x5c, 0x0f, 0x46, 0x9e, 0xd0, 0xff, 0xd0, 0x2d, 0xd4, 0x17, 0x58, 0x66, 0xfc, 0x6f, 0x26, 0xbe, 0xf1, 0xd6, 0x5c, 0x1e, 0x0c, 0x16, 0x2b, 0x43, 0x23, 0x79, 0x46, 0x65, 0xa3, 0x8b, 0x97, 0x16, 0xdf, 0x22, 0x32, 0x6e, 0xa8, 0x9c, 0x87, 0x65, 0x1e, 0x68, 0xdb, 0x80, 0xc5, 0xc8, 0xf9, 0xb0, 0xdc, 0xd4, 0x24, 0x77, 0xea, 0xc3, 0x51, 0x4c, 0x99, 0x66, 0x93, 0x41, 0xc7, 0xf5, 0xd7, 0xe3, 0xdb, 0x0e, 0xd1, 0x61, 0x55, 0xfb, 0x36, 0xf1, 0xaa, 0x34, 0x2c, 0x70, 0x4e, 0x24, 0xff, 0x48, 0x12, 0x30, 0x15, 0x97, 0xb0, 0xf6, 0x24, 0x8e, 0xa4, 0xd2, 0xa2, 0x17, 0x3e, 0xa7, 0x7d, 0xba, 0xf6, 0xdc, 0x0d, 0xc1, 0xff, 0xa4, 0x47, 0x9a, 0x1f, 0x83, 0x33, 0x7e, 0xbd, 0x0e, 0xa0, 0x50, 0x3c, 0xf2, 0x16, 0xc8, 0x87, 0x37, 0x0c, 0xd0, 0xed, 0xc6, 0x5b, 0x2e, 0x30, 0x29, 0xf3, 0x64, 0xd8, 0x93, 0xcc, 0xd4, 0xcd, 0x20, 0x20, 0x28, 0x25, 0x5d, 0xd8, 0xf1, 0x3b, 0x0b, 0x44, 0x8e, 0x01, 0x20, 0x0e, 0x50, 0x97, 0x0f, 0x71, 0xdc, 0x1c, 0x49, 0xa6, 0xd0, 0xc4, 0x04, 0x9f, 0xa9, 0x2a, 0x3b, 0xf8, 0xe4, 0xe8, 0xf6, 0x2b, 0x63, 0x66, 0xcb, 0x03, 0x13, 0xef, 0xa5, 0x53, 0xcc, 0x0a, 0xc4, 0xe7, 0x78, 0x07, 0x05, 0xbb, 0x78, 0xd8, 0x64, 0x6b, 0x43, 0x22, 0xbf, 0xeb, 0x50, 0x94, 0xdd, 0x78, 0x37, 0x78, 0xae, 0xce, 0x13, 0x87, 0xd4, 0x9c, 0x2a, 0x02, 0x63, 0x35, 0xd0, 0xfe, 0xe5, 0x88, 0x88, 0x00, 0xa2, 0x52, 0x6d, 0xc9, 0x1e, 0x92, 0xd0, 0x73, 0xe2, 0x3e, 0x23, 0xbd, 0x7f, 0x34, 0x15, 0xa4, 0xd1, 0x73, 0xff, 0x33, 0x81, 0x8b, 0x7f, 0x9b, 0xcd, 0x52, 0x62, 0x86, 0x8c, 0xd9, 0xc8, 0xa9, 0x6c, 0x9e, 0x82, 0x98, 0x7f, 0x03, 0xbf, 0xdf, 0xf6, 0xff, 0xe8, 0x4e, 0x2c, 0x14, 0xc8, 0x94, 0xe6, 0x81, 0xf0, 0x10, 0xd9, 0xb8, 0x5a, 0xe3, 0x6c, 0x12, 0x4c, 0x4a, 0xc0, 0xc2, 0x7f, 0x2b, 0xed, 0x08, 0x81, 0xed, 0x8f, 0xa7, 0x58, 0x8d, 0x82, 0x98, 0x68, 0xee, 0xe9, 0x00, 0x97, 0x71, 0x75, 0x60, 0xae, 0xc6, 0xe4, 0x0b, 0x02, 0x02, 0xc7, 0xde, 0x55, 0xf1, 0x89, 0x2b ],
+const [ 0x14, 0x1f, 0xd0, 0xb3, 0xd1, 0x11, 0xb5, 0x10, 0xdd, 0xcb, 0x31, 0xde, 0xe8, 0x87, 0xa3, 0xd4, 0x63, 0x46, 0x1a, 0x95, 0xef, 0x72, 0x68, 0x7a, 0x15, 0xc1, 0x78, 0x92, 0x37, 0x5c, 0xe1, 0xe7, 0xc6, 0x41, 0xba, 0x03, 0xb6, 0xe5, 0xb1, 0xb3, 0x2f, 0x1e, 0x57, 0x0b, 0x86, 0x41, 0xbe, 0xaa, 0x6b, 0x87, 0x46, 0x40, 0x64, 0xb6, 0xb4, 0x4d, 0x7a, 0xfd, 0x84, 0x2b, 0x31, 0x1f, 0x81, 0x4e, 0xbe, 0xd4, 0x92, 0xcb, 0x75, 0x6c, 0xd7, 0x17, 0x81, 0xb5, 0xf4, 0x11, 0xd7, 0x1f, 0xad, 0x43, 0x6d, 0x1e, 0xb4, 0x65, 0xa6, 0xd0, 0xbe, 0x23, 0x11, 0xe0, 0xdc, 0x21, 0x54, 0xaa, 0x09, 0x3b, 0x63, 0x9f, 0xff, 0x11, 0xf6, 0xeb, 0x50, 0xc3, 0x39, 0x56, 0xb1, 0xf9, 0xc5, 0x68, 0x99, 0x27, 0xcf, 0xd1, 0x0b, 0x0f, 0x9f, 0x08, 0xaf, 0x87, 0x44, 0x31, 0x28, 0x7c, 0x87, 0x44, 0xa2, 0x37, 0x1d, 0x6c, 0xaa, 0xdf, 0x21, 0xad, 0x43, 0x3f, 0xc1, 0xca, 0x36, 0xca, 0x37, 0x66, 0xa9, 0xdc, 0xfb, 0x69, 0xf3, 0x43, 0x36, 0xa5, 0xaf, 0xfe, 0x7a, 0xba, 0x0f, 0x44, 0xb1, 0x36, 0x74, 0xc9, 0x54, 0x01, 0x3b, 0x3c, 0xde, 0xf9, 0xd9, 0x14, 0x7f, 0xd9, 0x2a, 0x8c, 0x14, 0x5f, 0x06, 0xec, 0x57, 0xae, 0x16, 0x0b, 0x53, 0xf1, 0xe5, 0x12, 0x1c, 0x41, 0x3a, 0x82, 0xbc, 0xc9, 0xa6, 0x79, 0x70, 0x27, 0x59, 0x31, 0x15, 0x16, 0x39, 0xc9, 0xdd, 0x4a, 0x36, 0x48, 0x46, 0x9c, 0xd7, 0xdf, 0x4d, 0x67, 0x19, 0x6e, 0xde, 0x32, 0x7a, 0x4a, 0x90, 0x8f, 0x51, 0x3e, 0x8f, 0x42, 0x60, 0xcf, 0xd9, 0xa6, 0xac, 0xc4, 0xae, 0x4d, 0x8d, 0xe6, 0x41, 0xe7, 0x01, 0x05, 0xb4, 0x65, 0x45, 0x3b, 0x43, 0x5e, 0xa7, 0x75, 0xc0, 0xb1, 0x96, 0x2e, 0x3f, 0x6c, 0xfb, 0x7e, 0x12, 0xec, 0xcc, 0x54, 0xf8, 0x46, 0xdd, 0xff, 0x91, 0xe6, 0xfa, 0xf4, 0x15, 0x76, 0x34, 0xcb, 0x46, 0x02, 0x78, 0x8a, 0xa3, 0x59, 0x66, 0x26, 0xdf, 0xb6, 0x5f, 0x47, 0x91, 0x9f, 0xe0, 0x4c, 0x2d, 0x0e, 0x0f, 0x8f, 0x33, 0xcf, 0x94, 0xea, 0xa6, 0x29, 0xaa, 0x7a, 0xc0, 0xc0, 0x76, 0xa2, 0xe4, 0xba, 0x97, 0x53, 0xd4, 0x21, 0xfe, 0x8b, 0x24, 0x88, 0x00, 0x1c, 0xef, 0xf2, 0xa9, 0xaf, 0xc8, 0xef, 0x54, 0x08, 0xf3, 0x08, 0x78, 0x8c, 0xd6, 0x5d, 0xc5, 0x00, 0xaa, 0x8d, 0x70, 0x93, 0x76, 0xd6, 0xcb, 0x1f, 0x3e, 0x7e, 0x18, 0xac, 0x77, 0x71, 0x9f, 0x36, 0xbf, 0x2b, 0xfe, 0xb0, 0xcb, 0xd8, 0xc1, 0x48, 0xa1, 0xba, 0x32, 0xed, 0x07, 0xcc, 0x72, 0x0e, 0x3b, 0xa5, 0xc9, 0xa5, 0xe4, 0x9e, 0x3b, 0x75, 0x49, 0x37, 0x5c, 0x8f, 0xc1, 0xb7, 0x65, 0x1b, 0x6a, 0x13, 0x86, 0x55, 0x1e, 0x11, 0x7e, 0xd6, 0xa3, 0xad, 0x6a, 0x15, 0x22, 0xbc, 0xda, 0x2d, 0xdb, 0xcf, 0x2a, 0xe1, 0x16, 0x5a, 0x10, 0xdd, 0x5d, 0x16, 0x71, 0x3e, 0xe8, 0xa3, 0x79, 0x55, 0x59, 0x72, 0xea, 0xa8, 0xaa, 0xe2, 0xb4, 0x3a, 0x63, 0xa9, 0xc7, 0x0d, 0x10, 0x76, 0x25, 0xe4, 0xf2, 0xd5, 0x3b, 0x4d, 0xf5, 0x52, 0x71, 0xdf, 0xe2, 0xe1, 0x00, 0xc1, 0xd6, 0x7d, 0x03, 0x6c, 0xf3, 0x10, 0xd2, 0xb1, 0x55, 0x93, 0x8b, 0xfd, 0x47, 0x76, 0xf1, 0xdc, 0xb7, 0x42, 0x7a, 0xbc, 0xe8, 0x7d, 0xa3, 0xf4, 0x67, 0xce, 0x87, 0x04, 0x40, 0x61, 0xb0, 0x1e, 0x71, 0x8d, 0x2d, 0xe6, 0x9f, 0xb4, 0xe4, 0x77, 0x08, 0x6b, 0x2a, 0xa6, 0xb9, 0xdb, 0x91, 0x8a, 0x01, 0x67, 0x01, 0x3c, 0x25, 0x90, 0x0b, 0xdb, 0x55, 0x15, 0x79, 0xd3, 0xdf, 0x5e, 0x2a, 0x5f, 0xa3, 0x1a, 0x1d, 0x4d, 0xc7, 0x28, 0xcb, 0x02, 0xac, 0xb3, 0xba, 0xbd, 0x20, 0xa2, 0x4f, 0x20, 0xd5, 0x2f, 0xe4, 0xec, 0x11, 0xd5, 0x1a, 0x0c, 0xa8, 0x70, 0x70, 0xd5, 0x28, 0xa0, 0x15, 0x8c, 0x53, 0x6e, 0xfb, 0x28, 0xd2, 0x32, 0x2d, 0x5a, 0x27, 0xb4, 0x62, 0xcb, 0xe4, 0x91, 0xd2, 0xa5, 0x1a, 0xe0, 0x48, 0x54, 0x15, 0x16, 0x79, 0x8e, 0x46, 0x27, 0x94, 0x90, 0x81, 0xee, 0x1a, 0xab, 0x69, 0xcf, 0xf0, 0x00, 0x28, 0x9b, 0xb3, 0x88, 0x63, 0xb3, 0x4b, 0x57, 0x6c, 0x71, 0xc3, 0x21, 0xba, 0xc3, 0x57, 0xfd, 0x97, 0x19, 0xcf, 0x69, 0x19, 0x82, 0x0c, 0x8e, 0x53, 0x11, 0xe1, 0xc6, 0xcc, 0x86, 0x24, 0x5c, 0x31, 0x2a, 0x04, 0x93, 0x46, 0xfb, 0x9c, 0xe9, 0x22, 0x09, 0xc9, 0x9c, 0x9c, 0x20, 0x39, 0x6e, 0x01, 0xa7, 0xc5, 0xa5, 0x08, 0xc8, 0x01, 0x57, 0x07, 0xd2, 0x11, 0xe4, 0x66, 0xdb, 0xbe, 0xc4, 0x54, 0xa9, 0xc9, 0x83, 0xba, 0xd3, 0x7e, 0x09, 0x6d, 0x23, 0x8d, 0x1f, 0xa8, 0x3f, 0x16, 0x2f, 0xb9, 0x88, 0x03, 0x4b, 0xfa, 0x43, 0x9a, 0x71, 0x03, 0xf7, 0x52, 0x0e, 0x1e, 0x15, 0xe6, 0xc0, 0xfc, 0xde, 0xa9, 0x60, 0xa6, 0x82, 0x19, 0x40, 0xb5, 0x85, 0xb6, 0xb1, 0xc6, 0x67, 0x15, 0xc9, 0x29, 0x84, 0x30, 0x63, 0xd9, 0x39, 0x00, 0x66, 0xb1, 0x48, 0x4e, 0x4b, 0xdc, 0x7e, 0xc6, 0xd9, 0x8e, 0x93, 0x4d, 0x33, 0xf1, 0x51, 0x94, 0x15, 0x63, 0xf8, 0xed, 0x5b, 0xde, 0xe2, 0x5e, 0xc3, 0xb7, 0x63, 0xf4, 0xf3, 0x8c, 0xf3, 0x5a, 0xbe, 0x78, 0x8f, 0xaa, 0xa3, 0x88, 0x5c, 0x83, 0x96, 0x73, 0x8e, 0x5c, 0x04, 0x85, 0x88, 0x18, 0x11, 0xdd, 0x44, 0xda, 0x24, 0xd8, 0xf6, 0x1a, 0xa5, 0xcd, 0xec, 0xf9, 0x05, 0xfb, 0xb9, 0xd1, 0xff, 0xbf, 0x92, 0x11, 0x1e, 0x0b, 0xf8, 0x48, 0x80, 0x13, 0x98, 0x7f, 0xd9, 0x49, 0x6f, 0xcc, 0xba, 0x8c, 0x31, 0x24, 0x14, 0x9c, 0xec, 0x71, 0xf8, 0xd2, 0xe8, 0xe4, 0xa0, 0x0e, 0xd3, 0x8d, 0xb3, 0xf0, 0x1a, 0x29, 0xc5, 0x4b, 0x9a, 0x3b, 0x1d, 0xd6, 0x78, 0x5e, 0xbc, 0x25, 0x4d, 0xd9, 0x9b, 0xd8, 0x87, 0x74, 0x33, 0x13, 0x0c, 0x8a, 0x42, 0x2e, 0x20, 0x60, 0xcd, 0xad, 0x88, 0xb5, 0x61, 0x72, 0xef, 0x9a, 0x9f, 0x31, 0x8a, 0x84, 0xf8, 0x25, 0xf8, 0xa0, 0xb4, 0x01, 0x6c, 0x66, 0x39, 0x2a, 0x0d, 0x71, 0x8a, 0x23, 0x9d, 0x8e, 0x0e, 0x48, 0x59, 0x13, 0x93, 0xc0, 0x21, 0x72, 0x92, 0xad, 0xd9, 0x0d, 0xb4, 0xa5, 0x0f, 0x4c, 0x96, 0x66, 0xde, 0xed, 0xc9, 0xc5, 0x12, 0x9c, 0x1e, 0xe8, 0x8c, 0xc4, 0x20, 0xb5, 0xe9, 0xa4, 0xe1, 0x8a, 0x5e, 0xa5, 0xfa, 0x2f, 0xe6, 0xeb, 0xcd, 0x09, 0xa0, 0x2a, 0x0d, 0x90, 0x72, 0xbb, 0x81, 0x03, 0xf3, 0xef, 0x04, 0x5a, 0x88, 0xa3, 0xd1, 0x7c, 0xcd, 0x14, 0xfd, 0xb2, 0x36, 0xf5, 0x45, 0x5b, 0xf6, 0xbf, 0x0a, 0xe2, 0x1f, 0x49, 0x9a, 0xee, 0x0b, 0x98, 0xb1, 0xd8, 0xfc, 0xf8, 0x40, 0x62, 0xff, 0x4b, 0x6c, 0xa6, 0x16, 0xa2, 0xda, 0x4c, 0x95, 0x0a, 0x2a, 0x00, 0xcd, 0xa9, 0xc1, 0x23, 0xe8, 0x09, 0xcc, 0xc1, 0x14, 0xb3, 0x81, 0xc4, 0xe4, 0x00, 0xa8, 0x67, 0xf2, 0x2c, 0x5b, 0xed, 0xca, 0xac, 0x0a, 0x92, 0x03, 0xc1, 0xc2, 0xc2, 0xaf, 0x4e, 0xae, 0x89, 0xf6, 0xe7, 0xde, 0x4b, 0xfd, 0x2a, 0x47, 0xb5, 0x0d, 0x52, 0x0b, 0xf3, 0xf1, 0x09, 0xfb, 0x23, 0x9f, 0x7e, 0x5a, 0x0a, 0x1b, 0xb8, 0xe4, 0x06, 0x99, 0x2a, 0x0f, 0x44, 0xe2, 0x87, 0x91, 0x33, 0xf8, 0xd7, 0x22, 0x39, 0xfd, 0xcb, 0x83, 0xa4, 0x51, 0x4d, 0xbf, 0xe3, 0xfb, 0x5c, 0xb1, 0xf6, 0x4a, 0x17, 0xc6, 0x23, 0xbb, 0x17, 0x05, 0xeb, 0x1e, 0x02, 0x4c, 0x3c, 0xf5, 0x5d, 0xdc, 0xe8, 0x1d, 0xa2, 0x17, 0x56, 0xb0, 0x93, 0x89, 0x78, 0x29, 0xcd, 0x26, 0xfc, 0xc9, 0xa0, 0xd2, 0xc7, 0x3a, 0x1e, 0x27, 0x9f, 0x73, 0x72, 0x72, 0x27, 0xdb, 0x74, 0xfe, 0x11, 0xb1, 0x7a, 0x96, 0x8f, 0xab, 0x70, 0x45, 0x0a, 0xdd, 0x2b, 0x60, 0x17, 0xdd, 0xfa, 0xc6, 0xa7, 0x25, 0x7e, 0x67, 0x7d, 0xb8, 0xbc, 0x03, 0xe6, 0x09, 0x71, 0x34, 0xa4, 0x18, 0xa5, 0xaf, 0x2b, 0xde, 0x83, 0xc7, 0x10, 0xeb, 0x68, 0x33, 0xbe, 0x4e, 0x3a, 0x10, 0x6b, 0xb5, 0xfb, 0x2a, 0x4a, 0xd5, 0x9e, 0x77, 0x02, 0x0c, 0x19, 0xe4, 0x60, 0x45, 0xbb, 0x54, 0x48, 0x1d, 0xc0, 0xe6, 0xf2, 0x44, 0x23, 0x77, 0x53, 0x25, 0xb3, 0x69, 0xd8, 0xc9, 0x69, 0xa2, 0x5a, 0xf8, 0xf9, 0xd7, 0x4f, 0xa2, 0xa7, 0x0a, 0x3d, 0x7e, 0x5c, 0x51, 0x75, 0xf1, 0xf9, 0xda, 0xfd, 0x31, 0xeb, 0x2c, 0xce, 0xaa, 0x00, 0xaf, 0x3f, 0xa1, 0x78, 0x6f, 0xc2, 0x17, 0x60, 0x1d, 0xce, 0xf0, 0x1b, 0x57, 0x1c, 0x54, 0x42, 0x28, 0x16, 0x56, 0xae, 0xd3, 0x8d, 0xd3, 0xd2, 0xcc, 0xaa, 0x9d, 0x4e, 0x08, 0x27, 0xd9, 0xc2, 0x76, 0xbe, 0xa6, 0xe0, 0xce, 0xe2, 0x00, 0xc6, 0x89, 0xae, 0xe3, 0x8a, 0x30, 0x1b, 0xb3, 0x16, 0xda, 0x75, 0xdb, 0x36, 0xf1, 0x10, 0xb5, 0xef, 0x34, 0x37, 0xaa, 0x13, 0x02, 0x65, 0x9a, 0x12, 0xd5, 0xb8, 0x7d, 0x13, 0x0d, 0xa2, 0x4b, 0x43, 0xef, 0xe2, 0x1a, 0x6d, 0xed, 0xb2, 0x86, 0xcc, 0x27, 0x42, 0x56, 0x1d, 0x33, 0x66, 0x5d, 0xf7, 0x19, 0x8b, 0x9d, 0x5f, 0xa2, 0xf0, 0xb3, 0x98, 0xd3, 0x13, 0x6f, 0x38, 0xb4, 0x69, 0xc2, 0x81, 0x56, 0x51, 0xdd, 0xed, 0x13, 0x4b, 0x97, 0x0b, 0x18, 0x65, 0x0f, 0x8a, 0x21, 0xf7, 0x93, 0x93, 0x84, 0x90, 0xc1, 0x5d, 0x71, 0x30, 0xec, 0xfb, 0x78, 0xb8, 0xc2, 0x78, 0x4b, 0x9e, 0x2b, 0x25, 0xc6, 0xe5, 0x74, 0x32, 0x2c, 0x4d, 0xac, 0x7c, 0xb4, 0xc7, 0x4e, 0xa6, 0x44, 0x2b, 0x21, 0x6b, 0x7c, 0x2d, 0x5d, 0x32, 0xf6, 0x8e, 0x0f, 0xe3, 0xcc, 0x8f, 0xbe, 0xfa, 0x5b, 0xab, 0x4f, 0xda, 0x47, 0x85, 0x26, 0x63, 0xc0, 0x20, 0x8e, 0xc6, 0x03, 0x4e, 0x5b, 0x98, 0x23, 0x6b, 0xce, 0x26, 0x09, 0x4a, 0xb8, 0x09, 0xb9, 0x70, 0xe2, 0xfa, 0xd8, 0x80, 0xad, 0xe7, 0x6b, 0xf7, 0xf6, 0x46, 0xe2, 0x19, 0x3c, 0xa9, 0x55, 0x2c, 0x05, 0x92, 0x0d, 0xe3, 0x7d, 0x89, 0x46, 0x1d, 0x61, 0x6d, 0x33, 0xd0, 0x1b, 0x08, 0x43, 0x3f, 0x2f, 0xe5, 0xa3, 0x74, 0xd5, 0x66, 0x04, 0xea, 0xe7, 0x11, 0x9e, 0x8a, 0xfe, 0x2b, 0x75, 0xd8, 0xd9, 0x88, 0xdb, 0x6f, 0xfe, 0xa1, 0x36, 0xab, 0xa3, 0xe7, 0x03, 0xa5, 0xce, 0x57, 0x1b, 0x64, 0xbc, 0x4f, 0x35, 0x51, 0x80, 0xa0, 0xad, 0xec, 0xec, 0xe4, 0x84, 0xbe, 0xb4, 0x12, 0xa7, 0x8e, 0xd1, 0x4f, 0x74, 0xd8, 0x24, 0x07, 0x7a, 0x7b, 0x5c, 0x3d, 0x80, 0xb2, 0x19, 0x1f, 0xc9, 0x45, 0x51, 0xde, 0x97, 0x01, 0xf4, 0xbc, 0xee, 0x65, 0xcb, 0x67, 0x9a, 0x9e, 0xa6, 0x85, 0x74, 0xb6, 0xb6, 0x90, 0xe0, 0x08, 0x38, 0xe4, 0x9a, 0xf7, 0x53, 0x16, 0xb3, 0xdf, 0x44, 0x88, 0xd6, 0x4c, 0xb8, 0x3a, 0xd0, 0x6a, 0x79, 0xe3, 0x4f, 0xbd, 0x4d, 0x41, 0xea, 0x12, 0x1c, 0xad, 0x62, 0xb6, 0x50, 0xf2, 0x28, 0xe5, 0x81, 0x5f, 0x1f, 0x85, 0x52, 0x1b, 0xa2, 0x15, 0x96, 0xb9, 0xc9, 0xe0, 0xb8, 0x0c, 0xe8, 0x76, 0x59, 0x3d, 0x59, 0x5c, 0x3a, 0x1a, 0x7c, 0x03, 0x5d, 0xb1, 0xfb, 0xf7, 0x67, 0x1e, 0x53, 0x59, 0x49, 0xa1, 0x90, 0x8f, 0x1f, 0xf4, 0x57, 0x3a, 0x58, 0xdb, 0x2a, 0x68, 0x18, 0xfc, 0xe8, 0x0c, 0xda, 0xf1, 0x93, 0xab, 0x5a, 0x9c, 0x56, 0x57, 0xb2, 0xba, 0xc7, 0xe1, 0xc3, 0xbb, 0x69, 0x4b, 0xd6, 0xd2, 0x75, 0x7c, 0x83, 0x48, 0xda, 0x37, 0xd3, 0x15, 0x82, 0x4e, 0xa1, 0xb1, 0xd7, 0x13, 0x46, 0x28, 0x86, 0x10, 0x75, 0x6d, 0x82, 0xf8, 0x63, 0xf0, 0x4d, 0xdd, 0x2b, 0x72, 0x73, 0xa2, 0x72, 0x18, 0x57, 0xb4, 0x46, 0xbf, 0x31, 0xf5, 0x4c, 0x90, 0x58, 0xf9, 0x1b, 0xd4, 0xbd, 0x75, 0xe3, 0x09, 0xb8, 0xf4, 0x52, 0x35, 0x08, 0xcc, 0xb8, 0x7a, 0x15, 0x51, 0x69, 0xeb, 0x77, 0x48, 0x63, 0x9e, 0xbc, 0x9f, 0x30, 0x02, 0x66, 0x5b, 0x0e, 0x73, 0x34, 0xd1, 0x4e, 0x0c, 0xa3, 0x19, 0xfa, 0xbd, 0xb3, 0xc0, 0xba, 0x9d, 0xee, 0xbd, 0xf8, 0x81, 0xa7, 0xa6, 0x43, 0xcd, 0x80, 0x24, 0xf1, 0x8a, 0x2f, 0xa5, 0x09, 0xb9, 0x81, 0x50, 0x60, 0xe7, 0x9e, 0x3e, 0x01, 0x02, 0x90, 0xe7, 0xd2, 0x6b, 0xff, 0xda, 0x75, 0x4c, 0x3e, 0xb2, 0x6d, 0x2c, 0x8c, 0x45, 0x82, 0xc1, 0x93, 0x1e, 0x66, 0x05, 0x35, 0x2e, 0x98, 0x8c, 0x88, 0xbe, 0x89, 0x14, 0x1f, 0xa8, 0xfe, 0x5e, 0x8c, 0xc7, 0xb5, 0x3c, 0x22, 0xac, 0x4b, 0xec, 0x00, 0x92, 0x5d, 0xa4, 0x4b, 0x94, 0xee, 0x6e, 0xba, 0x1e, 0x08, 0x36, 0x58, 0xa2, 0xa6, 0x21, 0x85, 0x8c, 0xd2, 0x21, 0x3e, 0x77, 0x0b, 0xc7, 0x9f, 0xa1, 0xe9, 0x58, 0xa6, 0x9c, 0x04, 0x22, 0x3a, 0x47, 0x11, 0x10, 0x6c, 0xfd, 0x4e, 0x7d, 0xfc, 0x0c, 0x21, 0x46, 0x1f, 0x69, 0xfb, 0x23, 0x7f, 0xa2, 0x83, 0x37, 0x84, 0x13, 0xf1, 0xe5, 0xd2, 0x5d, 0xb7, 0xe6, 0x13, 0x14, 0x67, 0x98, 0xf6, 0xb8, 0xd1, 0x99, 0x77, 0xe7, 0x6b, 0x95, 0x62, 0xd0, 0xf7, 0x5c, 0x12, 0xeb, 0x5f, 0x38, 0x7f, 0xe8, 0xe4, 0x7d, 0x78, 0xe5, 0x77, 0x61, 0x2c, 0xe3, 0x67, 0x0e, 0xef, 0x7b, 0x3d, 0xf6, 0x3b, 0xcd, 0xe5, 0x67, 0xf5, 0xba, 0x0e, 0x5f, 0xf2, 0x53, 0xd2, 0xa1, 0xba, 0x90, 0x9a, 0x08, 0x8c, 0x46, 0x3c, 0x1c, 0xa2, 0x53, 0x67, 0xe3, 0xb5, 0x1b, 0x41, 0xfa, 0xc4, 0x39, 0x4e, 0xe3, 0x12, 0x6e, 0x94, 0xa1, 0x6e, 0xdd, 0xfd, 0x82, 0xb6, 0x7b, 0xfc, 0x3d, 0x9e, 0xc1, 0x73, 0x3c, 0xae, 0xa4, 0xd5, 0x3b, 0x8a, 0xc6, 0x88, 0x12, 0x76, 0xee, 0x8d, 0xcf, 0x19, 0xb6, 0x62, 0x08, 0x81, 0x83, 0x27, 0x70, 0x68, 0xba, 0x01, 0xa7, 0xb6, 0x31, 0xbc, 0x57, 0x47, 0xe4, 0xb4, 0x7c, 0xed, 0xea, 0xf5, 0x03, 0xb9, 0xa7, 0xa1, 0x97, 0x76, 0x42, 0x92, 0xb8, 0x77, 0x59, 0x41, 0x0d, 0x93, 0xf4, 0xe6, 0xfb, 0x6d, 0xb8, 0xe1, 0x76, 0xf9, 0x5e, 0x59, 0x17, 0x3b, 0x63, 0x23, 0x6f, 0x52, 0x00, 0xe5, 0x9c, 0xb6, 0x5c, 0x7b, 0x19, 0xbe, 0x01, 0x99, 0xdb, 0x65, 0x8c, 0xb2, 0x99, 0x4d, 0xa9, 0x19, 0x6b, 0x04, 0x3f, 0x67, 0x96, 0x87, 0xe8, 0x1c, 0xa6, 0x04, 0xa4, 0x89, 0xbe, 0xe4, 0xce, 0xed, 0x2d, 0x09, 0x4f, 0xde, 0x41, 0x54, 0x11, 0xea, 0x60, 0x6b, 0xb7, 0x7f, 0x54, 0xb9, 0x8b, 0x08, 0xe7, 0xb6, 0xb7, 0x59, 0xb0, 0x68, 0xb9, 0x4d, 0x2c, 0x2a, 0x11, 0xad, 0x11, 0xac, 0x3c, 0x54, 0xde, 0x3b, 0xe6, 0x91, 0xb7, 0x42, 0x5c, 0xcd, 0x70, 0x11, 0x40, 0x6e, 0xe8, 0xde, 0x80, 0xfb, 0x98, 0x09, 0x88, 0x80, 0x6b, 0xa5, 0xb7, 0x34, 0xd0, 0x33, 0x10, 0x59, 0x0e, 0xb0, 0x33, 0x64, 0xd9, 0xd3, 0x8b, 0x5e, 0x22, 0x90, 0xc8, 0x8a, 0x33, 0xe0, 0x90, 0x48, 0xfa, 0xc4, 0x71, 0x39, 0xa5, 0x87, 0x1b, 0xa4, 0x70, 0x44, 0xcc, 0x18, 0xbb, 0xa9, 0x0b, 0x53, 0x60, 0xfa, 0x99, 0x63, 0x43, 0x59, 0xa5, 0x0b, 0x2b, 0x44, 0x3f, 0x68, 0xd0, 0x5f, 0x0f, 0xd4, 0x35, 0x74, 0x47, 0x0b, 0x37, 0xb8, 0xd6, 0x8d, 0x66, 0x50, 0xdf, 0x43, 0x15, 0x13, 0x69, 0x64, 0xad, 0x92, 0x58, 0x9a, 0x47, 0x55, 0x9c, 0x61, 0x79, 0x68, 0xa8, 0xb0, 0x6f, 0x17, 0x25, 0xdc, 0x3e, 0xf5, 0xe8, 0xb9, 0x76, 0x23, 0x22, 0x02, 0xf6, 0xce, 0xd7, 0xfb, 0x05, 0xfa, 0x92, 0x54, 0x9e, 0x7e, 0x56, 0x51, 0x0a, 0x50, 0xd7, 0x28, 0xb5, 0x03, 0xea, 0xab, 0x3a, 0x8e, 0x3b, 0x26, 0xc0, 0x4f, 0x3e, 0x8b, 0x89, 0x50, 0x68, 0xcc, 0xc8, 0xc8, 0x9e, 0x89, 0xb3, 0xe5, 0xee, 0xeb, 0xda, 0xc8, 0x7d, 0xd0, 0xb7, 0xd2, 0xc0, 0x28, 0x86, 0x1e, 0xef, 0x9e, 0x57, 0x4e, 0xb7, 0x7c, 0x61, 0x8b, 0x30, 0xc8, 0x99, 0xc7, 0x0e, 0xb3, 0x83, 0x45, 0x1b, 0x35, 0x48, 0x5c, 0xe5, 0xf1, 0x0a, 0x78, 0xb3, 0x5e, 0x74, 0x61, 0xbe, 0x28, 0x95, 0xc0, 0x9e, 0xd4, 0xee, 0xdf, 0x03, 0xa4, 0xc9, 0xb0, 0xa5, 0xba, 0xcd, 0x11, 0x7e, 0x7f, 0xd0, 0x4e, 0x36, 0x46, 0xec, 0xe7, 0xdf, 0x2d, 0xd5, 0x94, 0xe2, 0x44, 0x69, 0x87, 0x39, 0xf2, 0x89, 0xf1, 0xdf, 0x94, 0x28, 0xc7, 0x85, 0x66, 0xa1, 0xc6, 0x87, 0xa7, 0x4e, 0xb5, 0x1e, 0xf8, 0x56, 0xea, 0xd7, 0x06, 0xc6, 0x0f, 0x44, 0x68, 0xe4, 0x26, 0xf1, 0xcb, 0xc0, 0xcb, 0x99, 0x4c, 0x0b, 0xb9, 0x9a, 0x25, 0x2c, 0x90, 0xa7, 0x8c, 0x91, 0xd6, 0xbd, 0xd8, 0x43, 0x3b, 0x58, 0xe6, 0xbe, 0x21, 0xe6, 0xbb, 0xff, 0x5b, 0x7c, 0x6a, 0xde, 0x35, 0xc8, 0x38, 0x9e, 0xb5, 0x47, 0xff, 0xc3, 0x21, 0xb7, 0xd0, 0x23, 0xc1, 0xd0, 0xdc, 0x40, 0xe6, 0x2f, 0x95, 0xd5, 0x2c, 0x93, 0x10, 0xaf, 0xfb, 0x4b, 0xae, 0xbe, 0x54, 0xef, 0xfb, 0x6c, 0xca, 0x4f, 0xd6, 0x2d, 0xce, 0xa9, 0xd3, 0x58, 0x30, 0x1f, 0xdd, 0x35, 0xe3, 0x67, 0x20, 0x57, 0x01, 0xc5, 0x26, 0x2c, 0x0e, 0x36, 0x3f, 0xd2, 0x81, 0xee, 0x27, 0x2c, 0x80, 0x05, 0xe3, 0x36, 0xec, 0x6e, 0xec, 0x95, 0x9d, 0x28, 0x8f, 0x73, 0xef, 0xb8, 0x94, 0x89, 0x7d, 0xd6, 0x1e, 0x7d, 0x2c, 0x67, 0xd2, 0x6f, 0x6c, 0xab, 0x3b, 0xcf, 0xba, 0xb8, 0x6d, 0x71, 0x69, 0x27, 0xe9, 0xe3, 0xa3, 0x0d, 0xc1, 0xfe, 0xab, 0x2d, 0xfd, 0xbb, 0x64, 0x6b, 0x3c, 0x48, 0x17, 0x84, 0x9f, 0x5b, 0x71, 0xfd, 0xe2, 0xc7, 0xcb, 0x59, 0xcc, 0x4d, 0xaf, 0x8f, 0xca, 0xb4, 0x97, 0xbb, 0xd7, 0x1b, 0xf7, 0x14, 0x9e, 0x8f, 0x7e, 0x1e, 0xe3, 0xd9, 0x99, 0x21, 0x1f, 0x99, 0x3a, 0xd9, 0x6a, 0x99, 0xd7, 0x6f, 0x9e, 0x5b, 0xb5, 0xa8, 0xba, 0xf4, 0x66, 0x5d, 0x84, 0x1d, 0x91, 0x2b, 0x73, 0x88, 0xf1, 0x6b, 0xcb, 0x70, 0xa0, 0x64, 0x0a, 0x74, 0x96, 0xc0, 0x83, 0xa5, 0x6c, 0x3d, 0x49, 0xde, 0x66, 0xa5, 0x4e, 0x54, 0xb1, 0x00, 0xcc, 0x6d, 0xe9, 0x08, 0xe4, 0xd6, 0xdf, 0xdd, 0x86, 0xd0, 0x98, 0xfa, 0x90, 0xca, 0x99, 0x68, 0x3a, 0x35, 0x61, 0x31, 0xb1, 0x94, 0x38, 0x18, 0x02, 0xd2, 0x27, 0x87, 0x3a, 0xd9, 0x48, 0xc9, 0xcb, 0x60, 0x40, 0x79, 0x32, 0x04, 0x09, 0x3b, 0xd7, 0x9b, 0xf5, 0xaa, 0x35, 0xc5, 0xef, 0x91, 0x3a, 0xc3, 0x04, 0x5d, 0xf1, 0x8d, 0x23, 0xd2, 0x5e, 0x1e, 0x21, 0xfe, 0xaa, 0x13, 0x00, 0x6b, 0x80, 0x74, 0x71, 0x99, 0xb6, 0xd2, 0x97, 0xab, 0x30, 0x92, 0x0e, 0x61, 0x01, 0x88, 0x2c, 0x46, 0xd4, 0xc8, 0x87, 0x2b, 0x8b, 0xb8, 0xb7, 0xd3, 0x25, 0x6a, 0x5d, 0xf0, 0xe5, 0x29, 0x64, 0x4e, 0xb0, 0x52, 0x86, 0x4f, 0xb8, 0x66, 0x12, 0x97, 0x57, 0x5c, 0xed, 0x08, 0x3d, 0x3c, 0xd7, 0xf1, 0xce, 0xe9, 0xf0, 0x82, 0xc6, 0x3e, 0x7b, 0x84, 0x1f, 0x5d, 0xe1, 0x47, 0x34, 0x44, 0xf9, 0xdb, 0x26, 0xa2, 0x86, 0x82, 0x7f, 0xe8, 0x02, 0x66, 0x15, 0xa2, 0x9a, 0x88, 0x32, 0x08, 0x79, 0xf9, 0xf1, 0xd0, 0x49, 0x4c, 0xeb, 0x47, 0xf7, 0x4b, 0x13, 0xa0, 0xb7, 0xe9, 0xdf, 0x8c, 0x49, 0x78, 0xa9, 0x0b, 0x7a, 0x1c, 0x54, 0x81, 0xed, 0x80, 0x32, 0x0c, 0x1b, 0xc7, 0x25, 0x15, 0x99, 0xc6, 0x05, 0x25, 0x9a, 0x70, 0x42, 0xfa, 0xb4, 0x91, 0xcb, 0xdb, 0xe7, 0xc0, 0x2e, 0x28, 0xdb, 0x8e, 0x00, 0x35, 0x69, 0x04, 0x7f, 0x58, 0x5d, 0x4d, 0x76, 0x41, 0x7a, 0xaf, 0x61, 0x8a, 0xbf, 0xc0, 0xd2, 0x8f, 0xe9, 0xd6, 0x13, 0x80, 0x39, 0xbf, 0x0d, 0xb5, 0x77, 0xb2, 0x68, 0x41, 0x37, 0x86, 0xf4, 0xc9, 0x5b, 0x22, 0x48, 0x97, 0xd9, 0x35, 0xa9, 0xea, 0xbf, 0x27, 0x2d, 0x90, 0x74, 0x4f, 0x1f, 0xb7, 0x40, 0x66, 0xa6, 0x01, 0x0e, 0x3b, 0xa2, 0xd6, 0x71, 0xa9, 0xd7, 0xfe, 0xe6, 0xc6, 0x4d, 0x6f, 0x59, 0x5e, 0xf6, 0x63, 0xea, 0xa0, 0x92, 0xae, 0xf0, 0x16, 0xd0, 0x4f, 0x3e, 0xdb, 0xb6, 0x45, 0xa6, 0x08, 0x42, 0xa4, 0xbc, 0x6f, 0x52, 0xe7, 0xdc, 0x8c, 0xc1, 0x88, 0x6f, 0xb8, 0xd3, 0xce, 0x69, 0xa0, 0xd3, 0xe7, 0x16, 0xf6, 0xfa, 0x36, 0x17, 0x66, 0x93, 0xee, 0xa8, 0xcc, 0x5d, 0xe0, 0x24, 0xa4, 0x31, 0x91, 0xca, 0xc1, 0xe4, 0x90, 0xc1, 0x43, 0x6f, 0x06, 0x5a, 0xc3, 0x4d, 0x8f, 0x96, 0xd0, 0x25, 0x48, 0xe8, 0x9f, 0xa9, 0x2a, 0x3b, 0xfe, 0xbe, 0x96, 0x37, 0x8a, 0xdd, 0x30, 0xc0, 0x22, 0xb9, 0xf1, 0xc0, 0x9b, 0x22, 0x78, 0x27, 0xb5, 0x29, 0xa1, 0x30, 0x4e, 0x85, 0x59, 0xe5, 0xd6, 0x35, 0xb1, 0xe5, 0x03, 0x67, 0x31, 0x65, 0xc6, 0x99, 0x6e, 0x75, 0x7d, 0xfe, 0xde, 0x84, 0x6a, 0x23, 0xec, 0x27, 0x64, 0xd2, 0x48, 0x16, 0xcc, 0x37, 0x81, 0x77, 0xc3, 0x41, 0xd5, 0x60, 0x9a, 0x4b, 0x48, 0x97, 0x8a, 0xfc, 0xf3, 0x9c, 0xa6, 0x6b, 0x9f, 0xe9, 0x0d, 0x87, 0x92, 0x78, 0x64, 0xb7, 0xa9, 0x86, 0x84, 0xbd, 0xa7, 0x97, 0x6f, 0xe0, 0xcd, 0xba, 0x89, 0x4a, 0xab, 0x0e, 0x05, 0xaf, 0x35, 0x85, 0x9d, 0x2f, 0x19, 0xe8, 0x86, 0x7e, 0x50, 0x1b, 0xa3, 0x42, 0xf3, 0xa3, 0xf9, 0xbc, 0x51, 0x65, 0x63, 0xab, 0x3e, 0xb0, 0x86, 0x6d, 0xae, 0x7e, 0x08, 0x68, 0x82, 0xf7, 0xfd, 0xa8, 0xa1, 0x37, 0xa2, 0xc9, 0x4b, 0x51, 0x4e, 0x18, 0xaa, 0x94, 0xa5, 0xf5, 0xaa, 0x0d, 0x0f, 0x7c, 0x0b, 0x4c, 0x69, 0x64, 0xb5, 0x6b, 0xfa, 0x26, 0x4b, 0x4d, 0xa8, 0x62, 0x02, 0x24, 0x6b, 0x7f, 0xb4, 0x36, 0x03, 0x93, 0x30, 0xe0, 0xe6, 0x82, 0xd5, 0xdb, 0x7d, 0x69, 0x5f, 0xbe, 0x8f, 0x3d, 0x00, 0xc4, 0xfe, 0xaf, 0xb3, 0xd0, 0xb1, 0x53, 0xcd, 0xae, 0xd1, 0x02, 0xd4, 0x9c, 0x38, 0x7d, 0x95, 0x09, 0x26, 0x52, 0x71, 0x9c, 0x36, 0x04, 0xf8, 0x78, 0x91, 0x66, 0xb9, 0xbf, 0x62, 0x48, 0x57, 0x54, 0x8a, 0x55, 0xe0, 0xe6, 0x94, 0x3c, 0x5b, 0x2a, 0xeb, 0x0e, 0xa0, 0x67, 0x4a, 0xe7, 0x6d, 0x38, 0x75, 0xd1, 0xb5, 0x8e, 0x27, 0xe5, 0x3b, 0xf4, 0x4b, 0xb4, 0x60, 0x17, 0x6e, 0xe5, 0x39, 0x85, 0x75, 0x1f, 0xe5, 0xb5, 0x8b, 0x29, 0x1e, 0x48, 0x5e, 0x4f, 0x0d, 0x8e, 0x8b, 0x08, 0x63, 0x4c, 0x56, 0xd7, 0xa5, 0xbc, 0x9f, 0x6f, 0xc7, 0xd6, 0x12, 0x1a, 0xfd, 0xce, 0x9d, 0x5b, 0xce, 0xde, 0x27, 0xd2, 0x6a, 0x45, 0x7f, 0x61, 0x3d, 0x90, 0x92, 0x8d, 0xc4, 0x18, 0xe2, 0x27, 0xa0, 0xcc, 0x33, 0x2b, 0xe9, 0x30, 0x87, 0xe8, 0xc4, 0xa6, 0x4d, 0x61, 0x38, 0xed, 0xd6, 0xf4, 0x3d, 0xe7, 0x08, 0x39, 0x16, 0x9f, 0x56, 0x2d, 0xe1, 0x8a, 0xf0, 0x90, 0x6d, 0x0d, 0x36, 0x8b, 0x4b, 0x40, 0x73, 0x96, 0x28, 0xf2, 0xc8, 0x99, 0x5a, 0xed, 0x66, 0x51, 0xb8, 0x7a, 0x00, 0xf6, 0xaf, 0x28, 0x81, 0x1b, 0x92, 0xca, 0xfa, 0xd5, 0x32, 0xbf, 0xde, 0x1f, 0xaf, 0x76, 0x71, 0x7d, 0x8d, 0x30, 0x7e, 0xe0, 0x0a, 0x08, 0x48, 0xca, 0xaf, 0x31, 0xc4, 0xb2, 0x26, 0x80, 0x05, 0xaa, 0x4b, 0x2a, 0xf8, 0x3f, 0x85, 0xce, 0x51, 0xa1, 0x57, 0xb6, 0xc5, 0x04, 0x32, 0x5a, 0x7a, 0x45, 0x8e, 0x25, 0xbc, 0xd1, 0x39, 0x7c, 0xf1, 0xc3, 0xee, 0xfd, 0xcf, 0x4c, 0x29, 0x04, 0xcc, 0x58, 0x3a, 0x74, 0xd6, 0x6e, 0x98, 0xb4, 0x45, 0xd8, 0x79, 0xf7, 0x0e, 0x05, 0x9f, 0xc1, 0x39, 0x2b, 0x75, 0xa7, 0x95, 0x30, 0x5a, 0x56, 0xaa, 0xcb, 0x3d, 0xd6, 0xef, 0xe7, 0x6a, 0x10, 0x3d, 0x48, 0xa3, 0x8e, 0x84, 0x70, 0x73, 0x83, 0xbd, 0xc4, 0xbf, 0x0b, 0x1f, 0xeb, 0x9e, 0xb3, 0x96, 0x77, 0x6b, 0x3c, 0x71, 0xc7, 0x18, 0x9c, 0x5a, 0x2b, 0xc4, 0x46, 0x8c, 0x4a, 0x90, 0xab, 0x40, 0xc1, 0xaf, 0x01, 0x68, 0x0d, 0xbd, 0x43, 0xa0, 0xab, 0x52, 0x79, 0x62, 0x7d, 0xd6, 0x39, 0x79, 0x70, 0x97, 0x6e, 0xb8, 0x5c, 0x18, 0x58, 0xeb, 0x2c, 0xad, 0xd4, 0x0e, 0x3e, 0x44, 0xde, 0xbd, 0x0d, 0x86, 0x54, 0xec, 0x0d, 0x1f, 0xfc, 0xd8, 0xd6, 0x59, 0xc9, 0x3d, 0x85, 0xf0, 0x5a, 0xca, 0x5f, 0x22, 0xc4, 0xd2, 0xb8, 0x05, 0x91, 0x44, 0x14, 0x1d, 0x09, 0xdd, 0x8b, 0x2e, 0xb0, 0x9c, 0x72, 0x4f, 0x0f, 0x77, 0x37, 0x40, 0xb7, 0x4c, 0x8d, 0xfd, 0x84, 0x1a, 0xc9, 0x93, 0x1f, 0x71, 0x8c, 0x33, 0xc6, 0x27, 0xa3, 0x85, 0x50, 0x4d, 0x2b, 0x3e, 0x6b, 0x61, 0xf9, 0xf5, 0x29, 0xc5, 0x39, 0x33, 0xbb, 0x70, 0x54, 0xc9, 0x7c, 0xe4, 0x18, 0x66, 0x31, 0x60, 0x13, 0x68, 0x8e, 0x56, 0x3f, 0xf3, 0xfd, 0x1f, 0xe5, 0x40, 0x9c, 0xee, 0xbb, 0x38, 0x84, 0x03, 0x4f, 0x42, 0x51, 0x21, 0xa9, 0x59, 0xdf, 0x41, 0x2c, 0x61, 0x51, 0x88, 0xbe, 0xbb, 0x58, 0x77, 0x29, 0x17, 0xb2, 0x62, 0xc0, 0x89, 0xf0, 0x23, 0x45, 0xe0, 0x7d, 0x0f, 0x0a, 0x33, 0xdc, 0x29, 0x57, 0xbc, 0x31, 0x96, 0x0c, 0xe9, 0x03, 0x51, 0x87, 0xb1, 0x40, 0x20, 0xc8, 0x25, 0x81, 0xc7, 0xd3, 0x47, 0x90, 0x7b, 0x56, 0x1e, 0x28, 0x99, 0x8c, 0x0a, 0xfb, 0x98, 0x61, 0x56, 0xf9, 0x3d, 0xd7, 0x0c, 0xd0, 0x0d, 0xa8, 0x0d, 0xaf, 0x08, 0x2d, 0x60, 0x50, 0x94, 0x7e, 0xcb, 0x35, 0xb8, 0xdb, 0xa0, 0x32, 0x8a, 0x4b, 0xda, 0x2b, 0xeb, 0x82, 0x68, 0x1f, 0x71, 0x08, 0xc9, 0x65, 0xa5, 0x98, 0xd9, 0x36, 0x6f, 0xc7, 0xeb, 0x6c, 0xce, 0xe6, 0x17, 0x89, 0xcc, 0x28, 0xd6, 0xfb, 0xb2, 0x08, 0xcc, 0x9f, 0x78, 0xe5, 0xe4, 0x83, 0x7f, 0xef, 0xa2, 0xf0, 0x83, 0x47, 0xb5, 0xa8, 0xcb, 0x62, 0xcc, 0x6c, 0xa2, 0xaf, 0xab, 0xc1, 0x0b, 0x79, 0x7e, 0xf4, 0xb1, 0x0e, 0x6d, 0x5c, 0x1d, 0x21, 0x70, 0xdf, 0x2b, 0x6d, 0x65, 0xb7, 0xbf, 0x9b, 0x60, 0x76, 0xb4, 0x66, 0x42, 0x48, 0x15, 0xfd, 0x8d, 0x79, 0x90, 0xa8, 0x76, 0x37, 0x27, 0xaf, 0x3c, 0x98, 0x29, 0x78, 0xb9, 0xdf, 0x61, 0xef, 0x37, 0xfb, 0x8d, 0x2a, 0x84, 0x50, 0x12, 0x4e, 0x49, 0xba, 0xed, 0xac, 0x97, 0xcf, 0xed, 0x30, 0xc3, 0x65, 0x1f, 0xfc, 0x74, 0x55, 0x8a, 0x50, 0xfa, 0x7e, 0x1d, 0xad, 0xe1, 0x0c, 0xe6, 0x3a, 0xc6, 0xfa, 0x85, 0x66, 0x6a, 0xd5, 0xdf, 0xcf, 0x05, 0xc3, 0x17, 0x63, 0xdd, 0xc5, 0xba, 0xc4, 0x16, 0x39, 0x39, 0xf1, 0xcc, 0xa3, 0x9d, 0x24, 0x5f, 0xac, 0x76, 0xf6, 0x0e, 0x6b, 0x14, 0xc9, 0xc8, 0xe4, 0xfa, 0x67, 0x3e, 0xce, 0x90, 0xe7, 0x3d, 0x9a, 0x18, 0xd1, 0x3b, 0xb0, 0xe3, 0x82, 0x30, 0xfc, 0xc5, 0xd1, 0xa7, 0xa9, 0xc6, 0xf2, 0x14, 0x2c, 0x1a, 0x9b, 0x68, 0x85, 0x54, 0x66, 0xe3, 0xc1, 0xd6, 0x77, 0x29, 0xc4, 0x8c, 0x5e, 0x99, 0x45, 0xda, 0x3e, 0xda, 0x1a, 0xd2, 0x2f, 0xb6, 0xb6, 0xab, 0xe2, 0x2c, 0xf0, 0x6e, 0x84, 0xc0, 0x06, 0xf3, 0xe4, 0x16, 0xe1, 0x0c, 0xd7, 0xbf, 0x9a, 0x00, 0xdc, 0x53, 0x3e, 0x3b, 0xfc, 0xc0, 0xce, 0x43, 0xf4, 0xe1, 0x8a, 0xee, 0x96, 0x53, 0x6f, 0xd3, 0x6d, 0x84, 0xff, 0xfe, 0xa0, 0x0c, 0x40, 0xe8, 0x18, 0x41, 0x07, 0xa6, 0xe5, 0x05, 0x76, 0x60, 0xde, 0xe3, 0xc4, 0x05, 0x88, 0x5b, 0x3c, 0x3d, 0x3a, 0x79, 0x89, 0x9f, 0x7e, 0xad, 0x30, 0x25, 0xb9, 0xd6, 0x5e, 0xdc, 0x0f, 0xa0, 0xe4, 0xe0, 0x81, 0x10, 0x80, 0x88, 0x58, 0x5d, 0x5e, 0xde, 0xc7, 0x02, 0xde, 0x52, 0xcc, 0x11, 0x98, 0xaf, 0x57, 0xca, 0x9e, 0x4d, 0xae, 0x6c, 0x00, 0x89, 0x10, 0x4b, 0x96, 0x72, 0x98, 0x23, 0xf9, 0xc5, 0x65, 0xac, 0xd3, 0x1c, 0xf8, 0x6e, 0x59, 0x62, 0xdd, 0xd7, 0x15, 0x8a, 0x8e, 0x8b, 0xe9, 0x80, 0x94, 0xfb, 0x51, 0x60, 0xef, 0x39, 0xe8, 0xe7, 0xb8, 0x0b, 0x2e, 0x27, 0x05, 0x3e, 0x88, 0x7e, 0x0d, 0x3c, 0x88, 0xc8, 0x8d, 0xe1, 0x6f, 0xd4, 0x6a, 0x8b, 0xf0, 0x15, 0x97, 0x70, 0x37, 0x9a, 0x39, 0x35, 0x2a, 0x40, 0x09, 0xbc, 0xef, 0x27, 0xfa, 0x3d, 0xae, 0x62, 0x1d, 0x98, 0x98, 0xf3, 0xc1, 0xe9, 0x28, 0xf6, 0xde, 0x5d, 0xa8, 0x1c, 0xb4, 0x45, 0xf8, 0x5b, 0xaf, 0x69, 0x8b, 0xe4, 0x8e, 0x9f, 0xb2, 0x56, 0xc4, 0x9c, 0x1d, 0x31, 0x1e, 0x09, 0x9e, 0x8d, 0xa7, 0xda, 0x31, 0x0c, 0xc9, 0xdb, 0x3a, 0x0d, 0xb4, 0x8b, 0x0d, 0x22, 0x04, 0x2e, 0xb3, 0xc5, 0x9d, 0x1e, 0xec, 0x46, 0xda, 0x62, 0x70, 0x08, 0xe8, 0x81, 0x7a, 0xed, 0x6c, 0x98, 0x87, 0x0f, 0x6c, 0xab, 0x5b, 0xb1, 0x6c, 0x39, 0x46, 0x75, 0xd7, 0x13, 0xa5, 0xcf, 0xa1, 0x6e, 0xab, 0xb9, 0x2b, 0x36, 0x62, 0xa8, 0x67, 0xa5, 0xec, 0xbf, 0x3c, 0x15, 0x0f, 0x43, 0x2c, 0x12, 0xf1, 0x50, 0x34, 0xb4, 0x1f, 0xca, 0xf3, 0x2b, 0xd4, 0x95, 0x0f, 0x9c, 0x79, 0x09 ],
+const [ 0xb8, 0x5e, 0x29, 0x87, 0x5f, 0x6e, 0x2a, 0x2a, 0xc2, 0xa2, 0xb8, 0x47, 0x53, 0x76, 0xea, 0xec, 0xfa, 0xff, 0x0f, 0x76, 0xad, 0x2f, 0xe6, 0xfa, 0x41, 0x55, 0x12, 0xe4, 0x80, 0xe3, 0xc8, 0xde, 0x7b, 0x74, 0xcb, 0xf4, 0x22, 0x0d, 0x9a, 0xf5, 0x11, 0xa3, 0xe7, 0x1c, 0xad, 0xde, 0x4c, 0xef, 0x70, 0x1d, 0x3a, 0x68, 0x81, 0xba, 0x32, 0x53, 0x88, 0x8f, 0x37, 0xf7, 0xc0, 0xb9, 0x83, 0xf8, 0x4e, 0x9b, 0x79, 0x7c, 0xd1, 0x26, 0xdb, 0x8d, 0x3a, 0x58, 0x3d, 0xbf, 0xde, 0x03, 0xb9, 0x12, 0xc9, 0xd0, 0xe5, 0x19, 0x55, 0x83, 0x02, 0x5c, 0xfc, 0x81, 0x76, 0xfc, 0x6b, 0x8f, 0x7d, 0x95, 0xd7, 0xdc, 0x1b, 0x68, 0x94, 0x42, 0x55, 0xba, 0xe4, 0xc9, 0xa0, 0x77, 0x0d, 0x6d, 0x9a, 0x1b, 0xae, 0x21, 0xf8, 0xd2, 0x52, 0x13, 0xbf, 0xde, 0x46, 0x32, 0xb8, 0x3a, 0xa8, 0xee, 0x1d, 0x7d, 0xc1, 0x3e, 0x99, 0x00, 0x95, 0xe8, 0x70, 0x43, 0xb7, 0xfd, 0xf9, 0x8d, 0x62, 0xa2, 0x55, 0xd3, 0xc6, 0x16, 0x5b, 0xdb, 0xa0, 0xf1, 0xd2, 0xa2, 0x0d, 0xaa, 0xe3, 0xfa, 0xa0, 0x5c, 0xcd, 0x77, 0xb2, 0xca, 0xdb, 0x8c, 0xf9, 0xa0, 0x94, 0xf2, 0x5d, 0xfc, 0x31, 0x49, 0x06, 0x2c, 0x54, 0x02, 0xba, 0xba, 0xf6, 0x7c, 0x66, 0xa5, 0xa1, 0x6d, 0xfa, 0xf2, 0xe0, 0x84, 0x7a, 0x63, 0xf5, 0x4d, 0x52, 0x87, 0xc9, 0x54, 0xeb, 0xf3, 0x29, 0x8d, 0x7b, 0xce, 0x2e, 0xf3, 0x21, 0x93, 0xfd, 0x70, 0x31, 0x12, 0xb1, 0xfd, 0xcd, 0xb8, 0x96, 0x0a, 0xb5, 0x11, 0x98, 0x20, 0x5f, 0x8b, 0xfb, 0xc5, 0x4b, 0x7d, 0x4c, 0xa0, 0x91, 0x67, 0x97, 0xdd, 0xbc, 0x7c, 0xda, 0xd3, 0xda, 0x5d, 0xba, 0xe4, 0xd4, 0x28, 0x75, 0xa5, 0xfc, 0xb1, 0x18, 0x3f, 0xe5, 0x0f, 0xf2, 0x16, 0x77, 0x5b, 0x48, 0xa8, 0x42, 0xb4, 0x4a, 0xb7, 0x13, 0x86, 0x46, 0xaa, 0xc5, 0x0c, 0x1c, 0x31, 0x5a, 0x14, 0xf2, 0x28, 0x4b, 0x03, 0x28, 0xbe, 0x1b, 0x18, 0x8e, 0xd6, 0x32, 0xf5, 0xd5, 0xad, 0xe9, 0x5b, 0x44, 0xbd, 0xe2, 0x35, 0xac, 0xe2, 0x9a, 0xd8, 0x9e, 0xbc, 0x41, 0x89, 0xdb, 0x54, 0xc9, 0x3f, 0x0c, 0x02, 0x3d, 0xab, 0xb4, 0x8e, 0x54, 0x76, 0x62, 0x95, 0x46, 0xca, 0x2b, 0x2e, 0xde, 0x13, 0x57, 0xce, 0xd0, 0x07, 0x5b, 0x69, 0x4e, 0xe4, 0x08, 0xda, 0xd6, 0xf8, 0x01, 0x85, 0x4e, 0x67, 0x72, 0x3b, 0x52, 0x29, 0xff, 0x5e, 0xcd, 0x52, 0xfb, 0x45, 0xc6, 0x96, 0xdb, 0xe1, 0x7d, 0x0c, 0xea, 0xa1, 0xb7, 0x32, 0x3e, 0x94, 0x56, 0x32, 0xea, 0xce, 0x2c, 0x63, 0x75, 0x0c, 0x11, 0x13, 0x8b, 0x9b, 0x33, 0x84, 0xf3, 0x75, 0xae, 0x34, 0xc1, 0xae, 0x5d, 0x61, 0xcd, 0x0e, 0xef, 0xcd, 0x63, 0x00, 0x3d, 0xbf, 0x3c, 0xaa, 0xda, 0x4a, 0xad, 0x5e, 0xec, 0xd1, 0x1f, 0x31, 0x3b, 0xcb, 0xbf, 0xe9, 0x88, 0xc4, 0x77, 0x1d, 0x20, 0xa4, 0x1c, 0x97, 0xb1, 0x34, 0xe9, 0xfd, 0x5b, 0xde, 0x2c, 0xb1, 0x0a, 0xb5, 0x3f, 0xf5, 0x04, 0xb5, 0xba, 0x53, 0xbe, 0x4b, 0xe7, 0x3c, 0xf4, 0x18, 0x76, 0xef, 0xf8, 0xf2, 0x72, 0x9c, 0x4b, 0x2b, 0x74, 0xc9, 0x6a, 0x16, 0x17, 0xf6, 0xea, 0xc8, 0xab, 0x7c, 0xc7, 0x1c, 0x2e, 0xbb, 0xfa, 0xfa, 0x78, 0x74, 0x49, 0xd8, 0xb5, 0x74, 0x63, 0x80, 0x18, 0x73, 0x2c, 0x14, 0xce, 0x3b, 0x56, 0x50, 0x31, 0x0d, 0x31, 0x10, 0x3f, 0x40, 0xc4, 0x12, 0x4a, 0x2b, 0x1c, 0xfc, 0xf0, 0x45, 0xe4, 0xa1, 0x4e, 0x8b, 0x36, 0x80, 0x71, 0x22, 0xb1, 0x8d, 0x0d, 0x3e, 0xcc, 0x35, 0x72, 0x42, 0x69, 0x9c, 0xbb, 0x29, 0xae, 0x29, 0x49, 0x24, 0x10, 0x44, 0x70, 0x84, 0xb0, 0x5e, 0x6f, 0xdb, 0xeb, 0x32, 0xa6, 0x5e, 0x2c, 0x4b, 0x03, 0x8e, 0x05, 0xc7, 0xbe, 0x18, 0x7f, 0x5a, 0x46, 0xf9, 0xae, 0x96, 0x7b, 0xe5, 0x88, 0x69, 0x1d, 0xea, 0xf7, 0xe7, 0x84, 0x51, 0x2c, 0x49, 0x92, 0xc5, 0x37, 0x36, 0xe7, 0xb7, 0xd4, 0x42, 0x53, 0x00, 0x88, 0xb5, 0x91, 0xc8, 0xed, 0x8d, 0x32, 0xa7, 0x4a, 0xc6, 0xd7, 0x0b, 0x67, 0xd8, 0xa3, 0xda, 0xa0, 0x82, 0xf0, 0x58, 0x37, 0xc6, 0x41, 0x4a, 0xef, 0x35, 0x78, 0x5c, 0xd6, 0x6c, 0x4a, 0xc0, 0x62, 0xdf, 0xef, 0x18, 0xbf, 0xd5, 0x1e, 0x96, 0x68, 0xb4, 0x38, 0x61, 0xf5, 0x7f, 0xc4, 0x3b, 0x33, 0x9d, 0x1b, 0x62, 0x7a, 0xdc, 0x64, 0xb3, 0x3b, 0xb5, 0xc3, 0x15, 0xd9, 0xd2, 0xce, 0x15, 0xba, 0xcd, 0x41, 0xce, 0x9d, 0x3b, 0xf2, 0x0c, 0x2e, 0xe9, 0x07, 0xb1, 0xd7, 0x65, 0x66, 0x57, 0xda, 0xc0, 0x6d, 0x36, 0x9d, 0x93, 0xe4, 0x48, 0x44, 0x40, 0x2f, 0xac, 0x85, 0x7a, 0xc8, 0x49, 0xb8, 0x08, 0xed, 0xb3, 0x2e, 0xc5, 0x96, 0x52, 0xc4, 0xec, 0xaa, 0xc1, 0xb8, 0x92, 0x72, 0x74, 0xbb, 0x74, 0x4e, 0x9e, 0x47, 0xf3, 0xa7, 0x51, 0x32, 0x5d, 0x24, 0xe7, 0x84, 0x6e, 0x21, 0xa2, 0x86, 0x17, 0x5d, 0x8f, 0x1b, 0x7d, 0xf2, 0xb0, 0x53, 0x45, 0x8b, 0x59, 0x3e, 0x0f, 0xd1, 0xdb, 0xfe, 0x40, 0x26, 0x60, 0x20, 0x05, 0x96, 0x16, 0x2d, 0x95, 0x0a, 0x90, 0x7b, 0xb6, 0xbf, 0x69, 0x49, 0x82, 0xf7, 0x2a, 0x0b, 0x6b, 0xef, 0x6d, 0x03, 0x7d, 0x10, 0x43, 0x11, 0xe3, 0x69, 0xd4, 0xcc, 0xad, 0x5d, 0x45, 0xd1, 0xd0, 0x99, 0xdf, 0x5c, 0x6e, 0x4a, 0x6d, 0x15, 0x58, 0x8c, 0xe5, 0x2c, 0xd2, 0x25, 0x4b, 0xa7, 0x96, 0x73, 0xd3, 0xfb, 0x1b, 0xa3, 0x46, 0xda, 0x16, 0x24, 0xa6, 0x4d, 0x42, 0x5b, 0x15, 0x02, 0x5c, 0x99, 0xf3, 0xe7, 0x72, 0x4a, 0x47, 0xf8, 0x5e, 0x6f, 0x60, 0x54, 0x8e, 0x4e, 0xbc, 0x97, 0x06, 0x67, 0x28, 0x64, 0xa7, 0xab, 0x29, 0x41, 0xb1, 0xe9, 0x9b, 0xa8, 0x87, 0x89, 0x98, 0x5a, 0xb2, 0x7c, 0x9b, 0xf7, 0x29, 0x73, 0xe5, 0xcc, 0xcf, 0x4f, 0x20, 0xec, 0x3e, 0xd9, 0x43, 0x82, 0xc3, 0xb4, 0xb5, 0x65, 0xa9, 0x90, 0xb5, 0xed, 0xbb, 0x9f, 0xf9, 0x06, 0x04, 0x4d, 0x95, 0x82, 0xd9, 0x2c, 0x1f, 0xb4, 0x1a, 0x2d, 0x11, 0x3a, 0xb4, 0x16, 0x6e, 0x1a, 0x6a, 0x30, 0xa9, 0x11, 0xd6, 0x40, 0xc2, 0x27, 0xaa, 0xb9, 0xb2, 0x87, 0x3c, 0x30, 0x09, 0x8e, 0x42, 0x10, 0xd6, 0x22, 0xd9, 0x8f, 0xc7, 0x45, 0xcd, 0xe1, 0x91, 0xe9, 0x14, 0xab, 0x92, 0x06, 0x9b, 0xba, 0xb5, 0xeb, 0x46, 0xf5, 0x97, 0xd2, 0x32, 0x90, 0xe8, 0xb6, 0x3d, 0x83, 0x13, 0x69, 0xc8, 0x3b, 0x21, 0xe1, 0xbb, 0x8f, 0xda, 0xd2, 0xca, 0xf5, 0x2e, 0x83, 0xf7, 0xf6, 0xd4, 0xda, 0x58, 0xdf, 0x31, 0xb8, 0x1b, 0xba, 0x7b, 0x8d, 0xc7, 0x7c, 0x1e, 0x23, 0xc4, 0x80, 0x5f, 0xbe, 0x1e, 0x34, 0x3f, 0x67, 0x86, 0x13, 0xa2, 0x85, 0x9a, 0xd3, 0xb0, 0xad, 0x66, 0xdf, 0x7c, 0xbb, 0x2a, 0x07, 0xe3, 0x22, 0x5d, 0x76, 0xb8, 0x80, 0xf3, 0xe5, 0x1e, 0x76, 0xdc, 0x0f, 0x34, 0xb6, 0xcd, 0x65, 0xf8, 0x5d, 0x42, 0x02, 0x65, 0x84, 0xc4, 0xe1, 0xdf, 0x11, 0x67, 0x4e, 0xd1, 0xd3, 0x98, 0x9a, 0x95, 0xcf, 0x15, 0x13, 0x94, 0xd4, 0x3d, 0x33, 0xae, 0x56, 0x8a, 0x18, 0xdc, 0x79, 0x5c, 0x34, 0x13, 0x6b, 0xf8, 0x46, 0x6c, 0xf7, 0xd0, 0x89, 0x83, 0x57, 0x05, 0x2b, 0x1c, 0x4a, 0x2a, 0x00, 0x0d, 0x67, 0x4b, 0x78, 0x58, 0xb1, 0x2d, 0xcf, 0x97, 0x6b, 0xd8, 0x83, 0x9d, 0x2e, 0x53, 0x0b, 0x5a, 0x38, 0xaf, 0xc6, 0xff, 0x07, 0x46, 0x32, 0x63, 0x27, 0x45, 0x5e, 0xa5, 0x48, 0x68, 0xa2, 0x14, 0x93, 0x05, 0x8d, 0x4b, 0x3e, 0x4c, 0x1f, 0xa0, 0x5e, 0xcd, 0x38, 0xc0, 0xfd, 0x3b, 0x51, 0x93, 0x6d, 0x6f, 0x6a, 0x66, 0xdb, 0xaf, 0x43, 0x48, 0x27, 0x31, 0xcf, 0xb4, 0xf4, 0xdb, 0xe6, 0x71, 0xfb, 0x4d, 0x3a, 0xb7, 0xa4, 0x21, 0x8c, 0x93, 0xd7, 0x71, 0x20, 0x8c, 0x0f, 0x9a, 0x6e, 0x87, 0xb1, 0x40, 0x1a, 0xe8, 0x9d, 0x93, 0x26, 0xfa, 0x02, 0xd0, 0x67, 0x91, 0x76, 0x0a, 0x35, 0xee, 0x46, 0x2a, 0x67, 0xe2, 0x0a, 0x35, 0x7f, 0x37, 0x7d, 0xcd, 0x21, 0x4b, 0x8c, 0xfb, 0xca, 0xfe, 0xad, 0x2b, 0xbe, 0xce, 0x72, 0x78, 0x42, 0x41, 0x5e, 0x2a, 0x0c, 0x84, 0xf7, 0x7d, 0xf8, 0x51, 0x1c, 0xa5, 0xfc, 0x15, 0x99, 0x0e, 0x5e, 0x53, 0xf9, 0xe8, 0x24, 0x43, 0x9c, 0xe3, 0xcd, 0xc0, 0x09, 0x37, 0x3e, 0x61, 0x84, 0xe8, 0xff, 0xe5, 0xe4, 0x48, 0xa7, 0xd4, 0x9f, 0xbd, 0x95, 0x63, 0x27, 0xc4, 0xe1, 0x98, 0x79, 0x36, 0x92, 0xb0, 0xf2, 0xcb, 0x12, 0xbe, 0x65, 0xdc, 0xdf, 0x94, 0x6c, 0x6d, 0x82, 0xe6, 0xfb, 0x6a, 0xc5, 0xad, 0x3b, 0x31, 0x21, 0xca, 0x95, 0x51, 0x76, 0xec, 0x0c, 0x91, 0xff, 0xb3, 0xd1, 0x35, 0x84, 0x16, 0x11, 0x7c, 0xd1, 0x02, 0x12, 0x6d, 0x68, 0x43, 0x7e, 0xd3, 0x73, 0xa8, 0xff, 0x87, 0xfc, 0x62, 0x0b, 0xed, 0x60, 0xae, 0x02, 0xc1, 0x01, 0xb4, 0x76, 0x14, 0x3c, 0xae, 0xc9, 0x91, 0x9b, 0x4c, 0xfe, 0x05, 0x4b, 0x57, 0xc9, 0x1f, 0xd0, 0x96, 0xe8, 0x74, 0xf7, 0xee, 0xb6, 0xc5, 0x0c, 0xcc, 0xfe, 0x85, 0x4e, 0xc8, 0x0d, 0x96, 0xa0, 0x82, 0x0b, 0x54, 0x81, 0xd0, 0x8b, 0xd4, 0x3e, 0x1c, 0x60, 0x6d, 0x66, 0x07, 0xb2, 0x78, 0x7f, 0x52, 0x52, 0x55, 0xf7, 0xff, 0x4b, 0xaf, 0x5e, 0xb3, 0xba, 0x00, 0xd2, 0x5f, 0xdf, 0x57, 0xba, 0x1f, 0x73, 0x59, 0xb7, 0x63, 0x3c, 0x85, 0xd7, 0x4c, 0xe0, 0xbd, 0x0c, 0x59, 0xf7, 0x02, 0xdd, 0x42, 0x63, 0x80, 0x5c, 0x24, 0xe4, 0xca, 0x58, 0xdf, 0xe7, 0x66, 0xd3, 0xbc, 0x9f, 0x8c, 0xb6, 0x54, 0x57, 0x2b, 0xc4, 0xad, 0x07, 0x2d, 0xcd, 0xa5, 0x25, 0xfc, 0x24, 0x94, 0xbd, 0x45, 0x53, 0x2d, 0xc4, 0xfc, 0x0c, 0xa5, 0xaa, 0xa0, 0x63, 0x18, 0x2e, 0xc0, 0x3b, 0x28, 0x76, 0xbe, 0xfe, 0xe7, 0x5f, 0xd3, 0x92, 0xf7, 0x12, 0x53, 0x88, 0xef, 0xd8, 0x32, 0x96, 0x01, 0x2f, 0xc8, 0x47, 0xda, 0x1d, 0xd1, 0xf1, 0xca, 0xc4, 0xb8, 0xe8, 0x25, 0x37, 0x15, 0xf1, 0xe9, 0x8c, 0x74, 0xf9, 0xa0, 0x32, 0x58, 0x07, 0x88, 0x85, 0x7f, 0x70, 0xf2, 0xa0, 0x68, 0x4a, 0xe8, 0x72, 0x13, 0x22, 0x12, 0x15, 0x08, 0xf2, 0xdb, 0x5a, 0x9a, 0x4d, 0xcf, 0xa9, 0x6d, 0xdd, 0x47, 0x08, 0x36, 0x0f, 0x49, 0x79, 0xc2, 0x0d, 0xaa, 0x89, 0x3a, 0xed, 0x75, 0x26, 0xa5, 0x27, 0x91, 0xb1, 0xae, 0x4d, 0x9d, 0x54, 0xa7, 0xf6, 0x1f, 0x96, 0xcf, 0xfc, 0xde, 0x2c, 0xd0, 0xe7, 0x8c, 0x12, 0x8c, 0xa8, 0xa8, 0xdb, 0x19, 0x8b, 0xa3, 0x46, 0x0a, 0x67, 0x42, 0x11, 0xf1, 0x17, 0x43, 0x12, 0x22, 0x2e, 0x43, 0x83, 0xb9, 0xe7, 0xdf, 0x9e, 0xde, 0x5b, 0x1a, 0x6a, 0x47, 0xf7, 0xfe, 0xd4, 0xff, 0x2c, 0x87, 0x01, 0x66, 0x68, 0xbc, 0xe3, 0x7a, 0x46, 0x1f, 0x0a, 0x54, 0x02, 0x47, 0xbd, 0xf5, 0x2f, 0xcc, 0x4a, 0x43, 0xac, 0x63, 0x9a, 0x4f, 0xd4, 0x4a, 0x08, 0xd9, 0xf5, 0xe7, 0x73, 0x16, 0x03, 0xac, 0x92, 0xb1, 0x8e, 0x3d, 0x88, 0x0f, 0xf2, 0xd5, 0xb9, 0xd7, 0xce, 0xe6, 0xdb, 0xb2, 0xb7, 0xff, 0x50, 0x4f, 0x2d, 0xf3, 0xb3, 0xab, 0xcd, 0x38, 0xb1, 0x8f, 0xc9, 0x8d, 0x1a, 0x5a, 0x96, 0xdf, 0x37, 0x00, 0xe4, 0x6e, 0x5f, 0x53, 0xd3, 0x2c, 0xc5, 0x81, 0x64, 0x65, 0x94, 0xde, 0x2d, 0xa5, 0x3e, 0xe4, 0x52, 0xd7, 0x10, 0x78, 0xb0, 0xaa, 0x0b, 0x6f, 0x5b, 0x39, 0xef, 0x51, 0x4b, 0xea, 0x98, 0x5d, 0x52, 0x96, 0x8d, 0xcd, 0x51, 0xeb, 0xd7, 0x5b, 0xac, 0x0f, 0x0f, 0x03, 0xfb, 0x86, 0xbb, 0x0b, 0x03, 0x56, 0xdb, 0x41, 0xe4, 0x69, 0xbe, 0x84, 0x93, 0x32, 0x1a, 0x85, 0x8b, 0x94, 0x5c, 0xcf, 0xc0, 0xff, 0x3d, 0x05, 0xd5, 0xdc, 0x96, 0x6b, 0x8e, 0x2b, 0x75, 0xa8, 0x88, 0x6a, 0x70, 0xcb, 0x28, 0xb9, 0x39, 0x8b, 0xd1, 0x3d, 0x73, 0xd3, 0x5a, 0xc2, 0xc4, 0x7e, 0xbf, 0xa4, 0x2c, 0x5f, 0x16, 0xef, 0x95, 0x84, 0xc5, 0xc5, 0xab, 0xbb, 0xf3, 0x00, 0xed, 0x56, 0x3c, 0x19, 0x04, 0x2c, 0xa9, 0x49, 0x54, 0xe0, 0xdf, 0xed, 0xd2, 0x66, 0x96, 0x2f, 0x15, 0xc2, 0x4d, 0xe3, 0xaf, 0x13, 0x3c, 0xaf, 0xbd, 0xd1, 0x8b, 0x6f, 0xbd, 0x53, 0xc1, 0xd7, 0xa0, 0x94, 0x7f, 0x5a, 0x20, 0x36, 0x6e, 0x4b, 0x54, 0xc7, 0x76, 0x43, 0x82, 0x44, 0x31, 0xc2, 0x34, 0xdb, 0x9f, 0x19, 0x8e, 0xf5, 0x1b, 0x87, 0xde, 0x74, 0x8d, 0xa2, 0x75, 0x39, 0xe2, 0xf8, 0xb6, 0xea, 0xb9, 0xf7, 0x6c, 0xf2, 0x5f, 0x0a, 0x61, 0xc9, 0xfe, 0x05, 0x2c, 0x75, 0x11, 0xc3, 0x4a, 0x51, 0x1b, 0x0d, 0x70, 0x0d, 0x99, 0xbe, 0x20, 0xf6, 0x35, 0x25, 0x7b, 0x77, 0x3c, 0xab, 0x56, 0xe0, 0x52, 0xb6, 0x8f, 0x67, 0x65, 0xcd, 0xa1, 0x6d, 0xdf, 0xfc, 0x77, 0x02, 0x20, 0x7a, 0x7e, 0xaa, 0x2b, 0x89, 0xfe, 0x61, 0x9f, 0x9e, 0xaa, 0xde, 0xea, 0xc2, 0x76, 0x15, 0xb9, 0x38, 0xa8, 0xff, 0xb2, 0x60, 0x32, 0x9d, 0x66, 0xdb, 0x3f, 0x3b, 0x81, 0xf0, 0x0c, 0xf2, 0x44, 0x2e, 0xf9, 0x70, 0x36, 0x53, 0xe0, 0xfc, 0x16, 0x6d, 0xa5, 0xb4, 0x13, 0x3f, 0x0e, 0x19, 0x40, 0xe6, 0xd5, 0xce, 0x42, 0xbd, 0xfc, 0x9d, 0x4b, 0x7d, 0x61, 0xbb, 0x4d, 0xa9, 0x92, 0x4d, 0x67, 0x29, 0xe2, 0x2a, 0xa4, 0x34, 0xbd, 0xe3, 0xe4, 0x74, 0x38, 0x01, 0x1a, 0x65, 0xec, 0x8d, 0xb8, 0xff, 0x05, 0xd6, 0x68, 0x94, 0x96, 0x6e, 0xfd, 0xfb, 0x30, 0x76, 0xa9, 0xee, 0xb2, 0x1b, 0x70, 0xb1, 0x62, 0x61, 0xdc, 0xf4, 0x3d, 0x20, 0xf3, 0xfb, 0x8c, 0x4b, 0x66, 0xfc, 0xb8, 0x78, 0x0b, 0xc9, 0x5f, 0x9d, 0x8d, 0xae, 0xa7, 0x18, 0x63, 0x9d, 0xd3, 0xf3, 0xfe, 0x88, 0x14, 0x65, 0x47, 0x0f, 0xa1, 0x9c, 0x48, 0x5b, 0x09, 0xb9, 0x29, 0x4a, 0xc8, 0x1d, 0x5f, 0xcc, 0x19, 0xe3, 0x20, 0x8d, 0x0c, 0xad, 0x1a, 0xd4, 0xd8, 0xa4, 0x64, 0xab, 0x72, 0xba, 0xb5, 0x40, 0x5f, 0x33, 0xd4, 0x8b, 0xc6, 0x63, 0x4f, 0x31, 0xc9, 0xb9, 0x70, 0xa8, 0x15, 0xfc, 0x6d, 0x9c, 0xb8, 0xd5, 0xdf, 0x92, 0x34, 0x8e, 0x75, 0xcc, 0xd1, 0x19, 0xea, 0x6c, 0x37, 0x54, 0x34, 0xdc, 0x3b, 0x8b, 0xff, 0x6c, 0xfa, 0x3e, 0x59, 0x3d, 0x24, 0x25, 0xaf, 0x5f, 0x9b, 0x72, 0xf8, 0x36, 0x3d, 0x56, 0x30, 0x22, 0xfd, 0xc6, 0x08, 0x5e, 0x39, 0x7f, 0xdc, 0x29, 0x48, 0x48, 0xe5, 0x24, 0x52, 0x77, 0xb0, 0xfc, 0x64, 0xb6, 0xce, 0x48, 0xc3, 0x07, 0xce, 0xb5, 0x81, 0x06, 0x68, 0x60, 0x4f, 0x6e, 0xfb, 0x83, 0x92, 0xdf, 0x3a, 0x54, 0xb9, 0xdf, 0x21, 0x2a, 0xcd, 0x1e, 0x2f, 0xe2, 0x49, 0xfe, 0xcf, 0x81, 0x2d, 0x52, 0x17, 0x1a, 0x4e, 0x66, 0xb4, 0xf3, 0xf0, 0x41, 0x25, 0xe3, 0x96, 0x26, 0x28, 0xfe, 0x19, 0x61, 0x72, 0x75, 0xf8, 0x40, 0xa3, 0xb7, 0xef, 0x5f, 0x79, 0xdc, 0xcb, 0x28, 0x44, 0x44, 0x7c, 0x9b, 0x9a, 0x7b, 0x6c, 0x4b, 0x4b, 0x60, 0x0f, 0xa9, 0x97, 0x87, 0xbc, 0x85, 0x9f, 0xdb, 0xbb, 0xd2, 0x1a, 0x88, 0x9f, 0xaa, 0x49, 0x18, 0xd5, 0x92, 0x2d, 0xdb, 0x7e, 0xfe, 0xf7, 0x8d, 0x7a, 0x18, 0xc0, 0x33, 0xc5, 0xbd, 0x7a, 0x46, 0x07, 0xc8, 0x27, 0x13, 0x66, 0x94, 0x49, 0x62, 0x9f, 0xbc, 0x99, 0x56, 0x55, 0x25, 0xfb, 0x94, 0xa9, 0x3f, 0xb2, 0xa7, 0x0a, 0x87, 0xd0, 0xa4, 0x4e, 0x51, 0xf1, 0x09, 0x02, 0xc4, 0x29, 0xeb, 0xff, 0x26, 0x3b, 0x51, 0x3e, 0x5a, 0x0c, 0xdb, 0xee, 0xa6, 0x57, 0xa7, 0xc3, 0xba, 0xa1, 0x74, 0x90, 0xee, 0x70, 0x08, 0x18, 0xcc, 0xb8, 0xd0, 0x22, 0xce, 0x96, 0xc7, 0xcb, 0x68, 0x40, 0x98, 0x20, 0x49, 0x3d, 0x07, 0xec, 0xdf, 0xd1, 0x8d, 0xcf, 0x19, 0xbc, 0x42, 0x90, 0x70, 0x24, 0x01, 0xb4, 0x28, 0xcf, 0xc6, 0x50, 0xd3, 0x95, 0x5a, 0x1b, 0x18, 0x15, 0x33, 0xc7, 0xb2, 0xa8, 0x95, 0x92, 0xbb, 0x93, 0xfe, 0x18, 0x2b, 0x81, 0xc1, 0x6b, 0x9c, 0x30, 0xf1, 0x65, 0x50, 0x6a, 0x80, 0x3d, 0x74, 0x37, 0xa8, 0x59, 0xa6, 0x51, 0x8a, 0x63, 0xb6, 0xd8, 0x16, 0x9f, 0xa9, 0x47, 0x2a, 0x7c, 0x04, 0xa7, 0xfe, 0x69, 0x47, 0x02, 0xbf, 0xe9, 0xb7, 0x1b, 0x7a, 0xea, 0x60, 0x5c, 0x3c, 0x53, 0x5b, 0x10, 0x78, 0xdc, 0x4d, 0xd2, 0xa8, 0x22, 0x30, 0x45, 0x37, 0xfb, 0x56, 0x06, 0x9f, 0x06, 0xaa, 0xdf, 0xcf, 0x87, 0x3a, 0x3e, 0xcf, 0x72, 0xf2, 0xe5, 0xa6, 0xc6, 0xaa, 0xe2, 0x7c, 0x1c, 0x64, 0xc2, 0xfc, 0x80, 0xce, 0x02, 0xfc, 0x7f, 0x0f, 0xc6, 0x60, 0x81, 0xbf, 0xcd, 0x3b, 0x5a, 0x37, 0xa5, 0x38, 0x1b, 0x0c, 0x1b, 0x39, 0x2e, 0xd6, 0xf6, 0x3d, 0xa2, 0x36, 0xe5, 0x87, 0xc3, 0x17, 0xb5, 0xfd, 0xee, 0x33, 0xc7, 0xce, 0xa3, 0xd9, 0xc2, 0x57, 0xdc, 0xee, 0x85, 0x48, 0x9d, 0x33, 0x60, 0x02, 0xcd, 0xc5, 0x83, 0x44, 0x44, 0xea, 0xb6, 0x07, 0x25, 0x0a, 0x4b, 0xa6, 0x6e, 0xfc, 0x51, 0x42, 0xcd, 0x84, 0x0b, 0x65, 0xb6, 0x19, 0xa1, 0xe5, 0xb2, 0xeb, 0x14, 0x0c, 0xfa, 0x24, 0x77, 0xf5, 0x44, 0x6e, 0x5d, 0x39, 0xdd, 0xb6, 0x8e, 0xcc, 0xf8, 0x30, 0xfe, 0x21, 0x46, 0x9c, 0xff, 0x95, 0xc6, 0xc7, 0xb5, 0x0a, 0xdf, 0x54, 0xca, 0xd2, 0xac, 0xbc, 0x64, 0xd0, 0x97, 0x94, 0x54, 0xd9, 0x29, 0x0f, 0x91, 0x60, 0x20, 0xc3, 0xe4, 0x53, 0xc2, 0xb0, 0xe4, 0x40, 0x72, 0x7e, 0x25, 0xbc, 0x81, 0x06, 0xad, 0x05, 0x46, 0x14, 0xa7, 0xe6, 0x71, 0x6b, 0x5c, 0xdb, 0x9c, 0x0a, 0x5e, 0x76, 0x23, 0xae, 0x06, 0x01, 0x36, 0x98, 0x21, 0x65, 0x2c, 0x90, 0xe7, 0x4b, 0x1a, 0x2a, 0x2d, 0x80, 0xa5, 0x48, 0xdb, 0x9e, 0x14, 0xe0, 0x9f, 0xe9, 0xaa, 0x00, 0xe3, 0x77, 0x32, 0x0f, 0xfd, 0x94, 0xdb, 0x55, 0xa6, 0x64, 0x46, 0xbe, 0xae, 0xca, 0xde, 0xda, 0xee, 0x89, 0x68, 0x29, 0x7d, 0xa9, 0xda, 0x96, 0x27, 0x1d, 0x71, 0x41, 0x1a, 0xa2, 0xfe, 0x81, 0xe3, 0xea, 0x81, 0x2a, 0x99, 0xfa, 0xf8, 0x0b, 0x58, 0xd1, 0x79, 0xbb, 0xf1, 0x4a, 0x7f, 0x96, 0xe0, 0x43, 0x82, 0x02, 0x7f, 0xff, 0xca, 0xf7, 0x79, 0xc9, 0x84, 0xbe, 0x80, 0xda, 0x16, 0xf8, 0x43, 0x7d, 0xb0, 0xe3, 0x9a, 0x71, 0x23, 0xd9, 0x04, 0x8f, 0xf7, 0x19, 0x54, 0xac, 0xb7, 0xca, 0xa7, 0xc1, 0x90, 0x3d, 0x99, 0x4a, 0x1b, 0x73, 0xb9, 0xeb, 0x76, 0xdf, 0x3a, 0x59, 0x99, 0x6c, 0xeb, 0x78, 0xe7, 0xc2, 0x69, 0xc1, 0x04, 0xc5, 0x92, 0xe7, 0xe7, 0x5f, 0x3e, 0xba, 0x30, 0x80, 0x2a, 0x4b, 0xbb, 0x63, 0x35, 0x51, 0x75, 0x12, 0xcf, 0xcb, 0x6e, 0x2c, 0xae, 0xe7, 0x30, 0xe6, 0xc2, 0x23, 0x50, 0x50, 0x6c, 0xb2, 0x42, 0xda, 0xeb, 0x21, 0x71, 0x16, 0x17, 0x3a, 0x8f, 0xbf, 0x51, 0x29, 0x2a, 0xfb, 0xba, 0xdd, 0x81, 0xdd, 0xa3, 0xb1, 0x95, 0x2e, 0x45, 0x4c, 0x83, 0x6d, 0xb2, 0xc5, 0x10, 0x14, 0x0c, 0x0b, 0x86, 0x1d, 0xf5, 0x85, 0xbf, 0xc5, 0x46, 0xf5, 0x7f, 0x90, 0x04, 0xa2, 0x07, 0x8d, 0x90, 0xb6, 0xe6, 0xdb, 0x1d, 0xe5, 0x13, 0x6c, 0x67, 0x4f, 0x39, 0x09, 0xa3, 0xa8, 0x52, 0x96, 0xb1, 0x96, 0x77, 0x98, 0x99, 0x5a, 0xf6, 0xf4, 0x35, 0xb3, 0xa6, 0xf9, 0x2b, 0xff, 0x77, 0xa1, 0x1f, 0xa4, 0x4d, 0x14, 0x26, 0xae, 0x0f, 0x6e, 0x7d, 0xba, 0xfa, 0xc2, 0x7b, 0x12, 0x3c, 0x5f, 0xc4, 0x19, 0xbe, 0x52, 0xc0, 0xea, 0x41, 0x2c, 0x4b, 0x3c, 0xac, 0x05, 0xae, 0x89, 0xa4, 0xc0, 0xce, 0x6f, 0x5e, 0x91, 0xa4, 0x56, 0xb1, 0xbd, 0xed, 0x53, 0x70, 0xa1, 0x23, 0x4c, 0xf6, 0xf6, 0xab, 0x5d, 0x02, 0x53, 0x50, 0x7b, 0xc6, 0xf3, 0xf0, 0x57, 0x3a, 0xb9, 0x75, 0x85, 0xb6, 0x71, 0x07, 0xde, 0xc0, 0x59, 0x81, 0x23, 0x23, 0xe0, 0x21, 0xe3, 0x41, 0xad, 0x83, 0x9e, 0xa9, 0xe3, 0xd0, 0x2a, 0xec, 0xa4, 0x33, 0x56, 0xad, 0xd4, 0x8c, 0xce, 0xf8, 0x1f, 0x69, 0x3e, 0xd5, 0x3d, 0x32, 0xba, 0x1c, 0x74, 0xa3, 0x5e, 0x8a, 0x5f, 0x7f, 0x31, 0x15, 0xef, 0x83, 0x4f, 0x7d, 0xaf, 0x99, 0x48, 0x24, 0x4c, 0x4f, 0xc3, 0x1f, 0x54, 0x87, 0x67, 0x8d, 0x3e, 0x70, 0xfb, 0x27, 0xab, 0xb5, 0xcb, 0x19, 0xeb, 0xf4, 0x4e, 0x11, 0xc3, 0x71, 0x07, 0x95, 0x6d, 0x0c, 0xa9, 0x99, 0xe1, 0x70, 0x7e, 0x51, 0x53, 0x8e, 0x09, 0x44, 0xfd, 0x4a, 0xeb, 0xa2, 0x1e, 0x73, 0x03, 0xd7, 0x43, 0xf9, 0xd9, 0x60, 0xc5, 0x5a, 0x3d, 0xdd, 0x93, 0x5e, 0x2b, 0x68, 0x31, 0x04, 0xf2, 0x26, 0x01, 0xbc, 0x95, 0x1b, 0xc2, 0xd6, 0x72, 0x43, 0x56, 0x3b, 0x21, 0xde, 0xc8, 0x5b, 0x9f, 0x0b, 0x8d, 0x66, 0xac, 0x98, 0x0a, 0xbf, 0x71, 0x19, 0x57, 0xae, 0x66, 0x37, 0x43, 0x55, 0x73, 0x4b, 0x98, 0xe5, 0x56, 0x2c, 0xa0, 0x11, 0x44, 0x44, 0xe7, 0xc3, 0xd3, 0xea, 0x43, 0x0e, 0x17, 0xec, 0x12, 0x65, 0x0b, 0x6a, 0xc3, 0x0a, 0x33, 0xeb, 0x98, 0xc8, 0x80, 0xaa, 0xa9, 0xe5, 0x74, 0x31, 0x2d, 0x53, 0x86, 0x29, 0xf5, 0x26, 0xc8, 0x71, 0x39, 0x4b, 0xc7, 0x6d, 0x97, 0x76, 0xb3, 0xa1, 0x59, 0x5c, 0xc0, 0x7e, 0xf7, 0x23, 0xcb, 0x7b, 0xdc, 0x16, 0x41, 0x68, 0x6d, 0x9e, 0x3d, 0xff, 0x48, 0x6d, 0xf0, 0xbd, 0xc9, 0xfd, 0x46, 0xf0, 0xd3, 0x39, 0xc6, 0x10, 0xcd, 0x7a, 0xbb, 0x52, 0xea, 0xb4, 0x91, 0x7b, 0xae, 0xf2, 0x81, 0xf2, 0xae, 0xff, 0x71, 0x1a, 0x97, 0x66, 0x15, 0xde, 0x71, 0x9d, 0x5b, 0x8e, 0x25, 0x7e, 0x06, 0xe9, 0x3d, 0xf6, 0x98, 0x7b, 0xec, 0x01, 0x76, 0x29, 0x4e, 0xd6, 0x47, 0x0a, 0xf0, 0x5e, 0x9d, 0x78, 0x93, 0xeb, 0xd7, 0x67, 0x2d, 0x27, 0x46, 0xf6, 0x31, 0x4b, 0x8e, 0x44, 0x10, 0x91, 0x4f, 0x85, 0x00, 0xeb, 0x05, 0x55, 0xfc, 0xf5, 0x2d, 0x4b, 0x0c, 0x28, 0xaa, 0xd2, 0xc6, 0x51, 0x66, 0x34, 0x15, 0x42, 0x3c, 0xf8, 0x39, 0xc8, 0x16, 0x6e, 0x0f, 0xdd, 0x52, 0x88, 0x93, 0x1e, 0x6b, 0xeb, 0xa3, 0x7f, 0xd5, 0x46, 0x06, 0x3d, 0x28, 0xe3, 0xac, 0x14, 0x81, 0x7c, 0x37, 0xb3, 0x25, 0x4f, 0xbb, 0x6d, 0x68, 0x74, 0xc2, 0x31, 0xce, 0x6f, 0x94, 0xbc, 0x6f, 0x02, 0xb5, 0x0d, 0xa0, 0x45, 0xae, 0x19, 0xcf, 0xf8, 0x10, 0xc1, 0xaf, 0x17, 0xb7, 0x01, 0x96, 0xaf, 0x4c, 0x6a, 0x23, 0xf1, 0x0d, 0xd2, 0x23, 0x84, 0xd1, 0x4a, 0xb5, 0x20, 0x46, 0x50, 0xad, 0x59, 0x7e, 0x46, 0x37, 0xb8, 0xaa, 0x23, 0xbd, 0x10, 0x25, 0x69, 0x0a, 0x0f, 0xb4, 0x57, 0xaf, 0x14, 0x0c, 0x5f, 0xa5, 0x40, 0x94, 0xda, 0x35, 0xd0, 0x6d, 0xfb, 0x15, 0xaa, 0xb0, 0x01, 0xd4, 0x35, 0xf6, 0xb1, 0x77, 0x6e, 0x1e, 0x04, 0x65, 0x39, 0x4a, 0x1d, 0x80, 0xf4, 0x2b, 0x7d, 0x95, 0x52, 0x7f, 0x7a, 0xf6, 0x67, 0xd7, 0xed, 0x65, 0xff, 0x9e, 0x2c, 0x34, 0x34, 0x57, 0x38, 0xab, 0x40, 0x26, 0x37, 0xaa, 0x8f, 0x92, 0x24, 0x8f, 0x19, 0x89, 0xc5, 0x5a, 0xee, 0xa4, 0xdd, 0x10, 0x12, 0xad, 0xa4, 0x5d, 0x8c, 0x5f, 0x74, 0x7c, 0xba, 0x6c, 0xc5, 0x5c, 0xe7, 0xc5, 0x5b, 0xfb, 0x1f, 0x15, 0xbe, 0x16, 0x42, 0x8e, 0xeb, 0x05, 0x58, 0xe9, 0x49, 0xe1, 0x24, 0xa8, 0xde, 0xe7, 0xfc, 0x9f, 0xc3, 0x21, 0xd8, 0xb2, 0xd5, 0x43, 0xa8, 0xe0, 0xae, 0xd3, 0xeb, 0x81, 0xd4, 0x8c, 0x7d, 0xcb, 0x2f, 0x05, 0xb0, 0x9b, 0xc1, 0x8e, 0x9f, 0x73, 0x91, 0x5a, 0xbf, 0xbe, 0xe8, 0xe4, 0xb7, 0x5c, 0xc0, 0x8b, 0x72, 0x5a, 0x7a, 0x7f, 0x72, 0x01, 0xcf, 0xe1, 0x67, 0x13, 0x09, 0x26, 0x00, 0x51, 0x73, 0xbd, 0x01, 0x40, 0x0e, 0xf1, 0x96, 0x2d, 0x85, 0x10, 0xe6, 0x6f, 0x63, 0xcd, 0xec, 0xec, 0x84, 0xe3, 0x82, 0xdf, 0xc9, 0xfb, 0xbf, 0xd8, 0x10, 0xd0, 0x83, 0x04, 0x64, 0x91, 0x50, 0xae, 0x70, 0x87, 0x5c, 0x06, 0x3a, 0xf7, 0xe4, 0x21, 0x0e, 0x4a, 0xc2, 0x42, 0xb7, 0x6b, 0x42, 0x58, 0xf6, 0x71, 0x32, 0xc7, 0x2c, 0x7e, 0x38, 0x6b, 0x5a, 0xe6, 0x69, 0xda, 0x4b, 0x94, 0x16, 0xea, 0x10, 0xaa, 0xe9, 0x74, 0xad, 0x68, 0x31, 0x57, 0x12, 0x4f, 0x7b, 0xbf, 0x4d, 0x86, 0x62, 0xa7, 0xfd, 0x7c, 0xa8, 0x9c, 0x0a, 0xcf, 0x85, 0xc4, 0x93, 0x6d, 0x3e, 0x20, 0x28, 0xf9, 0xfa, 0x0e, 0x3a, 0x70, 0xd2, 0x12, 0xcf, 0x0c, 0x27, 0xd5, 0x7a, 0x68, 0x38, 0x6e, 0x8b, 0xe6, 0xf3, 0xe1, 0x83, 0x4e, 0x0c, 0xe5, 0xcb, 0xb7, 0x4d, 0xeb, 0xa5, 0xab, 0x2d, 0x5b, 0x62, 0x86, 0xa3, 0x21, 0xd6, 0x1f, 0x3c, 0x68, 0x09, 0xaa, 0x6c, 0xa5, 0x2f, 0xdd, 0x21, 0xd8, 0xda, 0x52, 0x9e, 0x0f, 0x6f, 0x2d, 0x87, 0x2b, 0xd6, 0xfe, 0x38, 0xe6, 0x76, 0xe9, 0x5b, 0x15, 0x61, 0x04, 0xba, 0x2b, 0xcb, 0x00, 0x51, 0xff, 0xc1, 0x0c, 0xa8, 0xcf, 0x18, 0xf6, 0x60, 0x84, 0xa3, 0x93, 0x0b, 0x37, 0xa9, 0x62, 0x41, 0xf5, 0x95, 0x6c, 0xf0, 0xbf, 0xf0, 0x6e, 0xf3, 0xd5, 0x8d, 0x3a, 0xe6, 0x35, 0x03, 0x5b, 0x39, 0x5e, 0x60, 0xf8, 0x84, 0x59, 0x1c, 0xfb, 0x1a, 0xfa, 0x4c, 0x71, 0xe1, 0x64, 0x18, 0x34, 0x61, 0xcb, 0x6f, 0xc8, 0x1a, 0x7e, 0xfa, 0x84, 0x1b, 0x24, 0x4e, 0xf2, 0xd0, 0x45, 0x65, 0x78, 0x1c, 0x0d, 0x4f, 0x37, 0xa7, 0x4d, 0x25, 0x33, 0x7a, 0xc3, 0x3f, 0xb4, 0xc9, 0x9b, 0xa6, 0xed, 0x0f, 0x35, 0xcc, 0xdc, 0x61, 0x29, 0x7b, 0x71, 0xfb, 0x89, 0x0c, 0xf2, 0x20, 0x66, 0xd9, 0x9e, 0x21, 0x95, 0xf5, 0x91, 0xbb, 0xb2, 0x1a, 0xe7, 0xa5, 0x66, 0xe2, 0x24, 0x6a, 0xe6, 0x3a, 0xd4, 0x75, 0xbc, 0x14, 0x6e, 0x6a, 0xca, 0x5d, 0x7e, 0xbd, 0x8c, 0x2f, 0x03, 0x7d, 0x9d, 0x47, 0x16, 0x70, 0x7d, 0xb9, 0xcd, 0x65, 0x91, 0xe2, 0x5f, 0xc6, 0x6b, 0x9f, 0x89, 0x6d, 0x4c, 0xbc, 0x30, 0xb8, 0xe7, 0xb0, 0x47, 0xe0, 0x68, 0x87, 0xf3, 0x86, 0xb5, 0x1f, 0xed, 0x8f, 0xf4, 0x97, 0x29, 0x32, 0x4d, 0x05, 0xb5, 0x4f, 0xf1, 0x67, 0xe3, 0x03, 0x5b, 0xdd, 0xaa, 0x79, 0xd6, 0x15, 0x4a, 0x03, 0x3f, 0x06, 0x2f, 0x69, 0x0c, 0xe1, 0x18, 0x81, 0x8d, 0x44, 0x78, 0xff, 0x72, 0xb1, 0x1c, 0x8f, 0x8e, 0x40, 0x0f, 0x21, 0xda, 0x90, 0xbb, 0x84, 0xbd, 0x03, 0x50, 0x37, 0x8a, 0x2b, 0x6a, 0x7c, 0x4b, 0x7f, 0xee, 0xad, 0xbd, 0x53, 0x34, 0xd3, 0x9b, 0x07, 0x6c, 0x75, 0x1f, 0x7e, 0x3a, 0xae, 0xc7, 0xd1, 0xa4, 0x82, 0x55, 0x45, 0x2e, 0x72, 0x19, 0x7b, 0x43, 0x4e, 0x72, 0xe7, 0xd7, 0x4b, 0x93, 0x83, 0x4b, 0x56, 0x83, 0xc5, 0x91, 0xa7, 0x67, 0xce, 0x90, 0x98, 0x04, 0xe4, 0xca, 0xb8, 0x80, 0x22, 0x3c, 0x1b, 0x68, 0x6e, 0x85, 0xf5, 0xf8, 0xac, 0x4b, 0x67, 0x96, 0x31, 0xdb, 0x99, 0x9f, 0x7b, 0x0f, 0x09, 0x66, 0x1f, 0x75, 0x23, 0x7a, 0x02, 0xad, 0x11, 0x28, 0xcc, 0x13, 0xd4, 0x41, 0x9a, 0x9f, 0x94, 0x1e, 0xf4, 0x09, 0x34, 0xe0, 0xfe, 0x30, 0x2a, 0xfc, 0xf2, 0xbc, 0x8e, 0xf8, 0xcd, 0x02, 0x70, 0x6f, 0x49, 0x29, 0x6f, 0x5b, 0x0c, 0x8b, 0x87, 0x94, 0x1f, 0x5e, 0x2b, 0x93, 0xa1, 0x94, 0x94, 0x7c, 0xbd, 0xff, 0x58, 0x5c, 0xd9, 0xb9, 0x3e, 0xae, 0x10, 0xc3, 0x51, 0x25, 0xe3, 0xec, 0x33, 0xa5, 0x2b, 0xf5, 0xb4, 0x92, 0x52, 0xf2, 0xa3, 0x4e, 0xc3, 0xf3, 0xe5, 0xfd, 0x9f, 0xe4, 0xc3, 0x8c, 0xb2, 0xb2, 0x88, 0xf1, 0xa5, 0xb0, 0x4c, 0xb4, 0x75, 0x38, 0x0b, 0xae, 0x24, 0x95, 0xfa, 0x11, 0xae, 0x20, 0x1a, 0xa8, 0x3e, 0xaa, 0x0d, 0x60, 0xa2, 0x1a, 0x29, 0x08, 0xfc, 0x57, 0xcb, 0x55, 0xbb, 0x69, 0xed, 0x29, 0xca, 0xdb, 0xfb, 0x14, 0x07, 0x63, 0xe3, 0x1c, 0xf7, 0xc5, 0x6c, 0xb9, 0xb8, 0xf4, 0xc8, 0x24, 0x37, 0x7a, 0x6c, 0xd1, 0xa3, 0x1b, 0x1f, 0x3a, 0x21, 0xb5, 0x51, 0xdf, 0xc1, 0x6b, 0xaf, 0x8b, 0xb0, 0x02, 0xf4, 0xd8, 0xb0, 0x8b, 0x02, 0xf5, 0xc6, 0x43, 0x31, 0xa7, 0x32, 0xb7, 0xe7, 0x8e, 0xa4, 0x2c, 0x69, 0xaa, 0xad, 0x3d, 0xf0, 0x1e, 0x74, 0xc6, 0x00, 0x33, 0xaa, 0x01, 0xf5, 0x9f, 0xc0, 0xef, 0xdf, 0x08, 0x57, 0xfa, 0x8f, 0xc4, 0xf8, 0xd8, 0xf2, 0xe3, 0x05, 0xb2, 0x9e, 0x6f, 0xef, 0x86, 0xab, 0xf2, 0xaa, 0xca, 0xc4, 0x39, 0x5e, 0x52, 0x7d, 0x58, 0x60, 0x73, 0xe7, 0xee, 0x60, 0x69, 0x63, 0xaa, 0xe4, 0xf6, 0xb3, 0x0e, 0xf5, 0x4c, 0x57, 0x73, 0x17, 0x2d, 0x16, 0x4e, 0x7f, 0x51, 0xdb, 0xb1, 0x81, 0x08, 0xc2, 0x15, 0x48, 0x20, 0x73, 0x56, 0xc9, 0x09, 0xaf, 0xff, 0xf9, 0x37, 0x28, 0xc8, 0x3e, 0xc8, 0x96, 0x5d, 0x24, 0x67, 0x07, 0x61, 0x52, 0x70, 0x76, 0xb3, 0xbc, 0x54, 0xa0, 0xf0, 0x1a, 0x40, 0x13, 0x39, 0x98, 0xf9, 0x88, 0x36, 0xcf, 0x0b, 0x72, 0x5a, 0xf4, 0x22, 0xd7, 0x69, 0x4f, 0xb8, 0x5f, 0x38, 0xef, 0xf0, 0xab, 0xb5, 0x9d, 0xc2, 0xe7, 0x26, 0x0e, 0x59, 0xa3, 0xb6, 0x5d, 0xb9, 0xde, 0x2d, 0xb8, 0xa5, 0x64, 0xff, 0x59, 0xc0, 0x5b, 0x88, 0xb7, 0xf2, 0x18, 0x96, 0xfe, 0x0d, 0x37, 0x28, 0xbd, 0xb1, 0xea, 0x75, 0xdf, 0x6d, 0x91, 0x30, 0xdd, 0x26 ],
+const [ 0xff, 0x5b, 0xe1, 0xec, 0xa7, 0xd4, 0x5e, 0xff, 0x12, 0xe9, 0x64, 0x5d, 0xdf, 0x05, 0xc1, 0x73, 0x5b, 0x97, 0x3b, 0xb8, 0xb0, 0x6f, 0x6c, 0x32, 0x59, 0x6b, 0xd1, 0x3c, 0xd9, 0x54, 0x1d, 0x86, 0xad, 0x03, 0xd3, 0x5d, 0x7f, 0xc8, 0x13, 0x2d, 0x9c, 0x0c, 0xb4, 0x44, 0xa8, 0x34, 0x94, 0xd8, 0x91, 0xc9, 0x2c, 0x4c, 0xc1, 0xd6, 0x68, 0xaf, 0x98, 0x92, 0xb5, 0x86, 0x19, 0x3f, 0x5b, 0xcb, 0xe3, 0x52, 0x0d, 0x35, 0x63, 0xd4, 0xbe, 0xba, 0x49, 0x08, 0xb7, 0x53, 0x38, 0x4e, 0xe7, 0xff, 0xc2, 0x47, 0x7a, 0x0a, 0x93, 0x3a, 0xad, 0x8f, 0xec, 0xb7, 0xe0, 0x3c, 0x54, 0x7a, 0xec, 0x55, 0x8a, 0x91, 0xb8, 0xfb, 0xbd, 0xc2, 0x07, 0xaf, 0xff, 0x27, 0x94, 0x12, 0xf8, 0x1b, 0x61, 0xee, 0xd7, 0x5a, 0x4c, 0x7a, 0x8e, 0x63, 0xe3, 0xda, 0x3f, 0x21, 0x79, 0xe6, 0xf1, 0xcb, 0x7a, 0x2c, 0x88, 0x09, 0xfb, 0x38, 0xf4, 0x58, 0x95, 0x13, 0xa8, 0xaf, 0x74, 0x09, 0x4e, 0x63, 0xab, 0xaf, 0xb9, 0x48, 0xca, 0x25, 0x1b, 0x19, 0xb3, 0x99, 0x78, 0x19, 0xa9, 0x0c, 0x5a, 0xfb, 0xaa, 0x59, 0xc7, 0xff, 0xff, 0x73, 0x70, 0x5f, 0x11, 0xee, 0x2b, 0xe9, 0x7e, 0xc1, 0xa3, 0xed, 0x6c, 0x4a, 0x4e, 0x59, 0x1e, 0x92, 0xa0, 0x23, 0xc5, 0xd3, 0x7f, 0xe7, 0x98, 0x37, 0xf6, 0xd2, 0x26, 0xe3, 0x2d, 0xbe, 0xeb, 0x34, 0x99, 0x9e, 0x22, 0x48, 0x70, 0x1d, 0xdb, 0xc1, 0x60, 0x82, 0x4d, 0xc5, 0x80, 0xd7, 0x6d, 0x49, 0x87, 0x4a, 0xc0, 0x90, 0x3c, 0xd3, 0x6d, 0xee, 0x2d, 0x17, 0x96, 0xd2, 0xa4, 0x8d, 0xe8, 0x04, 0xd7, 0xdf, 0x71, 0x2a, 0x5f, 0x93, 0xb2, 0x91, 0xeb, 0xea, 0xf6, 0x2a, 0x36, 0x08, 0xe2, 0xd3, 0x36, 0x56, 0x4c, 0xd8, 0x97, 0x25, 0x51, 0xba, 0x67, 0x94, 0xa1, 0x2f, 0x13, 0xb3, 0x1e, 0x69, 0x92, 0xe8, 0xa6, 0x9b, 0xe0, 0x92, 0x2c, 0xba, 0xae, 0xed, 0x0e, 0x81, 0x58, 0x36, 0xa2, 0xb7, 0x17, 0x0f, 0x12, 0xb4, 0x78, 0x24, 0x6b, 0x22, 0x0c, 0x0f, 0xf0, 0x01, 0x61, 0x79, 0xb4, 0xed, 0x32, 0x82, 0x68, 0xa4, 0xdb, 0x63, 0x71, 0xc3, 0x0f, 0x52, 0x3e, 0xd0, 0xcd, 0xa7, 0xd8, 0x7d, 0x90, 0x3c, 0xba, 0x2b, 0xc7, 0x19, 0xe4, 0xae, 0x84, 0x51, 0x2b, 0x50, 0x78, 0x27, 0xd3, 0x18, 0x1f, 0x75, 0x5f, 0x4c, 0x38, 0x4f, 0xa8, 0x34, 0x78, 0xe3, 0x2d, 0x21, 0x7f, 0xa3, 0xaa, 0xae, 0x0b, 0xa7, 0xec, 0x46, 0x6c, 0x4c, 0xe3, 0xe6, 0x38, 0x22, 0xf9, 0x24, 0x3f, 0x05, 0xa2, 0x71, 0xc1, 0x89, 0x34, 0x9b, 0xdf, 0x9c, 0xfa, 0x96, 0x50, 0x66, 0x83, 0x7b, 0x55, 0x74, 0x40, 0xd1, 0xef, 0x16, 0x4f, 0x0c, 0x4f, 0x05, 0x91, 0x53, 0x8e, 0x49, 0x02, 0x86, 0x9e, 0x5a, 0x4a, 0x80, 0x81, 0x86, 0x8f, 0x99, 0xb8, 0x92, 0x8e, 0x6f, 0xff, 0xa4, 0xea, 0xe7, 0x37, 0x61, 0xc3, 0x6e, 0xa4, 0x52, 0x8b, 0x85, 0x58, 0x8c, 0x15, 0x7c, 0xef, 0x90, 0xef, 0x7d, 0x7d, 0x70, 0xf2, 0xcd, 0xc5, 0x33, 0x17, 0x4f, 0xac, 0x7b, 0x8d, 0x4a, 0xed, 0x65, 0x08, 0x6b, 0x0d, 0xb1, 0x5b, 0x0e, 0x92, 0x23, 0x49, 0xb9, 0x70, 0x28, 0x98, 0xe9, 0xc4, 0xbd, 0x68, 0x12, 0xc4, 0x8d, 0xc3, 0xe1, 0xf6, 0x59, 0x75, 0xc4, 0xa1, 0x9d, 0x1e, 0xac, 0x82, 0x71, 0x85, 0x12, 0xbf, 0xad, 0x2f, 0x38, 0x21, 0x50, 0x31, 0xb1, 0x7d, 0x23, 0x42, 0x23, 0x73, 0x99, 0x14, 0x4c, 0x5b, 0xfa, 0xe5, 0x43, 0x7d, 0xc0, 0x51, 0x00, 0x80, 0x42, 0x6a, 0x1f, 0x26, 0x8f, 0x0a, 0xe1, 0x36, 0x9d, 0x68, 0x74, 0xb9, 0xa3, 0xea, 0x74, 0x68, 0xc3, 0x3a, 0xb1, 0x66, 0xec, 0x9c, 0x33, 0x2b, 0xff, 0x7f, 0x7b, 0xc0, 0x30, 0x51, 0x0c, 0x32, 0xb0, 0x98, 0x2a, 0x41, 0x89, 0x3f, 0xe2, 0x58, 0xc9, 0x2d, 0x4a, 0xc2, 0xe2, 0x1d, 0x0a, 0x1a, 0x51, 0xa9, 0x1b, 0x03, 0x7e, 0xa7, 0xcf, 0x1a, 0xe3, 0xb9, 0x12, 0x29, 0x71, 0x20, 0xef, 0x9e, 0x2f, 0xd1, 0x56, 0x3b, 0x25, 0xcb, 0x1c, 0x0e, 0x78, 0xa7, 0x43, 0xa4, 0xd6, 0x71, 0x7c, 0x7a, 0x14, 0xb6, 0xea, 0xb4, 0x16, 0xde, 0x29, 0x11, 0xf0, 0xbc, 0x8f, 0x1f, 0x4a, 0x64, 0xb1, 0xab, 0x09, 0x3d, 0x29, 0x7c, 0x2c, 0x57, 0x97, 0x41, 0xf3, 0xfe, 0xe6, 0xc7, 0x47, 0x8f, 0xd1, 0x6f, 0x56, 0x8a, 0xa5, 0xe0, 0x7e, 0xe9, 0x48, 0xf9, 0x6c, 0xb0, 0x7a, 0x09, 0x85, 0xc6, 0x5b, 0x43, 0x84, 0x03, 0x2d, 0x6c, 0x65, 0x8a, 0x5c, 0xd7, 0x83, 0x59, 0xbb, 0x93, 0xfd, 0x1e, 0x11, 0xe3, 0x5d, 0x4c, 0xd4, 0xee, 0x7c, 0x6f, 0x34, 0xb8, 0xa0, 0xbd, 0x5c, 0x51, 0xe8, 0xed, 0xf4, 0x4d, 0xea, 0x4c, 0xea, 0x73, 0x9a, 0x0d, 0x72, 0xba, 0x6e, 0xe0, 0x4b, 0x71, 0xbf, 0xc7, 0x44, 0xbd, 0x73, 0x25, 0x00, 0x48, 0xd9, 0x18, 0xf6, 0x38, 0xd4, 0x09, 0xbb, 0x5e, 0x3c, 0x82, 0x84, 0xb0, 0x81, 0x3f, 0xe7, 0xfa, 0x91, 0x87, 0xe1, 0xd0, 0xfc, 0xbd, 0x1d, 0xc7, 0x56, 0x32, 0x73, 0xe5, 0xde, 0x3d, 0xb0, 0x55, 0x5c, 0x8e, 0x95, 0x5f, 0x50, 0xbf, 0x22, 0x98, 0x48, 0x2c, 0x14, 0x56, 0x92, 0x05, 0xac, 0x67, 0x13, 0xa1, 0xb2, 0x03, 0x77, 0x15, 0xba, 0xfe, 0x8b, 0x06, 0xa6, 0x42, 0xe6, 0xbb, 0x6c, 0x7d, 0xcf, 0x76, 0x19, 0x17, 0x5b, 0x05, 0x16, 0x67, 0xd6, 0x94, 0xaa, 0x26, 0x64, 0xc5, 0xc1, 0x24, 0xe8, 0x03, 0xec, 0x39, 0x25, 0x13, 0xa8, 0x7f, 0x24, 0xeb, 0xe3, 0xbe, 0xd5, 0xc8, 0xbc, 0x28, 0xf8, 0x7b, 0x8b, 0x47, 0x3e, 0x03, 0x21, 0x33, 0xac, 0x61, 0x51, 0x08, 0x41, 0xa8, 0xaf, 0x97, 0xd8, 0x54, 0x97, 0x5c, 0x50, 0xdc, 0x71, 0xb1, 0xe9, 0x8b, 0x34, 0x40, 0xf1, 0x8b, 0x29, 0xbe, 0xa1, 0x43, 0xf2, 0xd7, 0x42, 0xe3, 0xca, 0x64, 0x93, 0x3c, 0x0e, 0xe4, 0x6f, 0xd6, 0xfd, 0x2a, 0xab, 0x3c, 0xbc, 0x53, 0x3e, 0x9b, 0x9c, 0xfb, 0xa4, 0x8b, 0xa0, 0xb1, 0x84, 0x2d, 0x3a, 0xa7, 0x90, 0x76, 0x56, 0xae, 0xac, 0xca, 0x99, 0x62, 0x53, 0xcd, 0xeb, 0xa2, 0x37, 0x76, 0x33, 0x44, 0x28, 0x65, 0x61, 0x06, 0x37, 0x76, 0xb2, 0xc7, 0x1b, 0x96, 0x2f, 0xf7, 0xd4, 0xd5, 0x78, 0x4c, 0x8e, 0xbd, 0xbf, 0xb6, 0xc7, 0xe2, 0x17, 0x96, 0xb4, 0xbb, 0xef, 0x2b, 0xe1, 0xb0, 0xd9, 0x4c, 0x19, 0x74, 0x91, 0x5d, 0x85, 0x95, 0x3a, 0x7c, 0x17, 0x52, 0xea, 0xfb, 0x2a, 0xac, 0x69, 0x13, 0x62, 0xc0, 0x36, 0xd6, 0xda, 0x53, 0xcb, 0x66, 0x7e, 0xaf, 0x22, 0x65, 0xb5, 0xae, 0x78, 0xac, 0x44, 0x14, 0x51, 0x40, 0x6f, 0x21, 0xbc, 0x81, 0x60, 0x67, 0xd8, 0xa5, 0xcd, 0xda, 0x97, 0x65, 0xd6, 0x26, 0xc2, 0xf6, 0x2c, 0x45, 0x3e, 0x3b, 0x78, 0x50, 0x8d, 0x39, 0xfb, 0x95, 0x97, 0xcb, 0x71, 0xeb, 0xab, 0x97, 0x3c, 0x42, 0xc1, 0x40, 0xbe, 0x7e, 0x02, 0xde, 0x07, 0x86, 0x8a, 0xab, 0xb0, 0x97, 0x6c, 0xfe, 0x06, 0xdf, 0xf6, 0x7e, 0x6c, 0x47, 0x37, 0x8f, 0xfa, 0x90, 0xbf, 0x11, 0x6a, 0xa1, 0xa6, 0x4a, 0x35, 0x1f, 0xd0, 0x20, 0xf9, 0x3f, 0x6e, 0x8c, 0x1e, 0xd8, 0xc8, 0x4b, 0xb9, 0xbd, 0x3b, 0xd7, 0xb0, 0x49, 0x7d, 0x95, 0x20, 0x3b, 0x29, 0x50, 0xfb, 0xc4, 0x77, 0xe6, 0xf6, 0xdf, 0x4a, 0x41, 0xa2, 0xe1, 0x71, 0x89, 0xd8, 0x51, 0x26, 0x98, 0x5b, 0xf9, 0xdb, 0xaf, 0xb9, 0x3d, 0x37, 0x67, 0x72, 0xac, 0x5b, 0xea, 0x5c, 0xd5, 0x69, 0x62, 0x46, 0x5c, 0x47, 0xb2, 0xdc, 0x4d, 0xa0, 0x65, 0xcb, 0xaf, 0x2c, 0xe3, 0x25, 0x5d, 0x32, 0xeb, 0x06, 0x11, 0x4b, 0x3d, 0x78, 0xc2, 0x68, 0x97, 0x94, 0x30, 0x16, 0xe3, 0xea, 0xbd, 0x01, 0xaf, 0x23, 0x7e, 0xb7, 0xdd, 0xe5, 0x92, 0xaf, 0x9c, 0xf7, 0xb2, 0x8a, 0x97, 0xa6, 0x0a, 0x98, 0x6c, 0x67, 0x47, 0x9e, 0x5f, 0xbd, 0xf2, 0xd7, 0x50, 0x5d, 0xfc, 0x38, 0xea, 0x91, 0x9a, 0xf8, 0x1e, 0xda, 0x53, 0x50, 0xcf, 0xd9, 0x56, 0x80, 0xcf, 0x6f, 0x12, 0x12, 0x0b, 0x24, 0x01, 0x62, 0x02, 0xc5, 0xc4, 0x5e, 0x7c, 0x51, 0x75, 0x8b, 0x78, 0x17, 0x39, 0x49, 0x66, 0x18, 0x14, 0x57, 0x96, 0xb2, 0x02, 0x99, 0xf1, 0x80, 0x43, 0x19, 0xe7, 0x7c, 0xf6, 0x4d, 0xa8, 0x66, 0xe9, 0x98, 0x97, 0x6a, 0xb0, 0x12, 0xfb, 0xfd, 0xf4, 0x8c, 0xf8, 0x08, 0x0e, 0xcf, 0xbf, 0x48, 0xd4, 0x25, 0x01, 0xf4, 0xb3, 0x1b, 0xa9, 0xa1, 0xff, 0x84, 0xca, 0x64, 0x86, 0xc1, 0xd6, 0x36, 0x6b, 0x40, 0x12, 0x9c, 0x32, 0x43, 0x46, 0x87, 0x17, 0xe3, 0xb9, 0x78, 0xa4, 0x54, 0x5c, 0xe9, 0x82, 0x6a, 0x46, 0xe9, 0x90, 0x5c, 0x60, 0x06, 0x32, 0xc9, 0x62, 0x6f, 0xec, 0xf8, 0xfe, 0x5a, 0x2f, 0x64, 0x5a, 0xa4, 0x72, 0x78, 0xc4, 0xb7, 0x85, 0x97, 0xa2, 0xb1, 0x22, 0x5f, 0xa7, 0xc3, 0xc6, 0x2f, 0x4d, 0xd6, 0xbe, 0xe6, 0x7f, 0x75, 0x85, 0xee, 0x95, 0xe7, 0x4d, 0x7a, 0x86, 0x9b, 0xdc, 0x0b, 0x59, 0xca, 0x99, 0x39, 0xdd, 0x57, 0xe7, 0xb0, 0x9a, 0xfa, 0xb1, 0x79, 0x07, 0x9d, 0x46, 0x7b, 0xfe, 0x06, 0x68, 0x41, 0x6c, 0xb7, 0x9f, 0xfd, 0x4d, 0x12, 0xd4, 0xcd, 0xd8, 0xc1, 0x1a, 0x3e, 0xf6, 0x55, 0xcf, 0x0f, 0xf9, 0x2d, 0xe4, 0x37, 0x8b, 0x9a, 0x79, 0x28, 0xe4, 0x40, 0xad, 0x56, 0x41, 0xc0, 0xb4, 0xf3, 0x91, 0x94, 0x2a, 0xfd, 0x71, 0x3a, 0xa6, 0x7b, 0x5a, 0x94, 0x93, 0x04, 0x19, 0x8f, 0x3b, 0x80, 0x80, 0x03, 0x25, 0x33, 0x5c, 0xda, 0xa1, 0xf7, 0xa7, 0x75, 0xa1, 0xc8, 0xfe, 0x4b, 0xca, 0x86, 0x55, 0xd3, 0xcb, 0xf7, 0xe9, 0xa5, 0xee, 0x0c, 0x76, 0xdc, 0xec, 0x65, 0xaa, 0xbe, 0x06, 0x16, 0xda, 0x9f, 0x51, 0xac, 0xf5, 0x02, 0x52, 0x6b, 0xb6, 0x02, 0xca, 0xda, 0x1d, 0xf0, 0xd3, 0x82, 0x1f, 0x3e, 0x2c, 0xf2, 0x9d, 0x9b, 0xd2, 0x06, 0x93, 0x60, 0xd0, 0x69, 0x92, 0x2b, 0x57, 0x59, 0x70, 0xc9, 0x11, 0xaa, 0x3e, 0x5a, 0xb3, 0x0e, 0x7a, 0xaf, 0xd2, 0x93, 0x86, 0xf7, 0xf7, 0x6d, 0x59, 0x9b, 0xf5, 0xf6, 0x75, 0x66, 0x7a, 0xf3, 0x18, 0xe9, 0xe5, 0x19, 0xb7, 0x1e, 0x57, 0xd0, 0xa8, 0x4b, 0x0d, 0x36, 0x1f, 0x29, 0xed, 0x67, 0x5b, 0x46, 0x5e, 0xfc, 0x21, 0xa8, 0x5d, 0xd1, 0x6a, 0xb3, 0xce, 0x0c, 0x59, 0x4d, 0x0f, 0x5a, 0x6f, 0x3f, 0xd3, 0x7c, 0x02, 0xde, 0x2e, 0x03, 0xeb, 0xec, 0xec, 0x57, 0x80, 0xb9, 0x27, 0xfe, 0xc2, 0x8d, 0x19, 0x1b, 0xd7, 0x4a, 0x2e, 0x35, 0xba, 0x4e, 0x5d, 0x3a, 0x31, 0x97, 0xb9, 0xc4, 0xff, 0x2a, 0x43, 0x9a, 0x5b, 0xb5, 0x03, 0x7a, 0xa2, 0x73, 0x57, 0x16, 0x49, 0x50, 0x8a, 0x5c, 0x15, 0x4e, 0xa8, 0xfa, 0x8e, 0x27, 0x91, 0x22, 0xb1, 0x34, 0x4d, 0x8a, 0xe5, 0x8d, 0x9f, 0xb8, 0x30, 0x72, 0xdd, 0x7c, 0xab, 0xe9, 0xfe, 0xbe, 0x33, 0xa9, 0xf5, 0x79, 0x62, 0x37, 0x3e, 0x08, 0xbd, 0x4f, 0xb6, 0xa1, 0x2f, 0x85, 0xaf, 0x1f, 0xb7, 0x2c, 0x44, 0x04, 0x5d, 0x77, 0xea, 0xbe, 0x6a, 0xde, 0x48, 0x29, 0xd8, 0xc3, 0x49, 0x56, 0x08, 0x56, 0x6f, 0x8b, 0xb3, 0xb6, 0x6a, 0x8a, 0x23, 0x59, 0xe9, 0x16, 0xa3, 0xad, 0xb0, 0xb4, 0x34, 0xff, 0xea, 0xaf, 0x81, 0x9d, 0xc1, 0x5e, 0x15, 0x37, 0x2d, 0xa9, 0xcc, 0x8b, 0x09, 0xca, 0x87, 0x42, 0x6c, 0x51, 0x24, 0x14, 0x36, 0x6b, 0xae, 0x33, 0xe9, 0x63, 0xd0, 0xe7, 0xbb, 0x69, 0x90, 0x75, 0xe9, 0x93, 0x3a, 0x46, 0x4d, 0x21, 0x99, 0x45, 0x33, 0x05, 0x6d, 0x89, 0x69, 0xa3, 0x1a, 0x34, 0x95, 0xd5, 0x9e, 0x9b, 0xcb, 0x32, 0xc5, 0xa7, 0x5f, 0x90, 0xa0, 0x7b, 0xf8, 0xc7, 0x33, 0x56, 0xe6, 0xb8, 0x6e, 0xbb, 0xb6, 0x8e, 0x5f, 0xd0, 0x03, 0x44, 0xa5, 0x05, 0x8f, 0x68, 0x28, 0xf5, 0x92, 0x1e, 0x07, 0x91, 0x51, 0x67, 0xd2, 0x7b, 0xf3, 0xa3, 0xfa, 0xb0, 0x90, 0x55, 0x85, 0x6a, 0x8c, 0x27, 0x06, 0x45, 0x23, 0x2e, 0xcd, 0xa0, 0x44, 0x6e, 0x5b, 0x46, 0xa3, 0xa1, 0x19, 0x4e, 0x0a, 0x34, 0x49, 0x3f, 0xef, 0x93, 0x3c, 0x78, 0x4c, 0xa6, 0xc5, 0xcf, 0xab, 0x9b, 0xef, 0x79, 0x80, 0xe7, 0xeb, 0x2a, 0xbc, 0x87, 0x4c, 0x7c, 0x9f, 0x8c, 0x77, 0x95, 0xce, 0xd6, 0x54, 0x04, 0xa5, 0x20, 0x4a, 0xed, 0xce, 0x3d, 0x6b, 0x66, 0x13, 0xa0, 0xeb, 0x20, 0x70, 0x22, 0xd7, 0x4a, 0x6d, 0x00, 0x03, 0xb2, 0xab, 0x23, 0x45, 0x2e, 0xbc, 0xa5, 0xe0, 0x3a, 0x37, 0x90, 0x43, 0xe2, 0x0c, 0xe9, 0xf4, 0xe3, 0x16, 0xed, 0xc7, 0x0d, 0xef, 0x9a, 0x53, 0xeb, 0x08, 0x71, 0xa6, 0xa6, 0xf9, 0x7b, 0x38, 0x27, 0x15, 0x8a, 0x1e, 0x7c, 0x42, 0xc1, 0x80, 0x7d, 0x08, 0x56, 0x4d, 0xaf, 0xe7, 0x97, 0x2d, 0x68, 0xee, 0x2b, 0xb8, 0x34, 0x89, 0x9b, 0xe5, 0x78, 0x9b, 0x11, 0xc5, 0x55, 0xcc, 0x5f, 0x71, 0xcf, 0x25, 0x42, 0x41, 0x2f, 0xda, 0xe8, 0x3e, 0xa5, 0x66, 0xb1, 0xda, 0x32, 0xdd, 0x33, 0xdf, 0xc5, 0x7e, 0x80, 0xa6, 0xa5, 0x88, 0xab, 0x89, 0x0e, 0x50, 0x88, 0x9a, 0x1f, 0x8f, 0xb4, 0x96, 0xf4, 0x00, 0xd5, 0x14, 0x0f, 0x2b, 0x23, 0x02, 0xfc, 0x7b, 0x28, 0x52, 0x34, 0x97, 0xc3, 0xf1, 0x43, 0xef, 0x73, 0xf9, 0x26, 0x95, 0xd2, 0x27, 0xf7, 0x4f, 0x60, 0x8f, 0xcc, 0xea, 0x82, 0x8e, 0xdc, 0xd1, 0xcb, 0x01, 0xe3, 0xde, 0x79, 0xb4, 0xc8, 0x6f, 0x43, 0x1e, 0x7d, 0xbd, 0x52, 0x4b, 0x28, 0x69, 0x8d, 0x19, 0x80, 0x58, 0x19, 0xa7, 0x79, 0xc1, 0x20, 0x0b, 0x23, 0x84, 0xd2, 0x43, 0xcf, 0xbe, 0xaa, 0x6e, 0x75, 0x9a, 0xf3, 0x3d, 0x52, 0x6a, 0x8a, 0xa4, 0xd5, 0xf6, 0xe5, 0xd5, 0xbc, 0x13, 0x54, 0x6e, 0x7b, 0x78, 0x87, 0xf1, 0xdd, 0xce, 0x51, 0x76, 0xed, 0x06, 0xab, 0x9c, 0x17, 0xef, 0xfc, 0xc5, 0x8b, 0x08, 0x98, 0x83, 0xe2, 0x93, 0x86, 0x4d, 0x04, 0xea, 0x86, 0x77, 0x49, 0x16, 0x52, 0x61, 0xde, 0x9e, 0x25, 0xee, 0x6b, 0x9d, 0x7a, 0x37, 0xf2, 0x17, 0x16, 0x81, 0xfb, 0x8d, 0x48, 0x6d, 0xee, 0xcf, 0x70, 0x6f, 0xc0, 0x12, 0xbe, 0x81, 0xd1, 0x42, 0x3c, 0x19, 0x15, 0x9a, 0x0f, 0x58, 0x73, 0x71, 0xfa, 0x84, 0x6a, 0x57, 0x23, 0xb8, 0xfa, 0x60, 0x1a, 0xda, 0xc2, 0xc0, 0x17, 0xce, 0x66, 0x98, 0x83, 0xe9, 0x33, 0x10, 0xba, 0xa9, 0x06, 0xa6, 0x10, 0xa3, 0x69, 0xc6, 0x12, 0xbc, 0x00, 0x9a, 0x0e, 0x9c, 0x24, 0x23, 0xd5, 0x60, 0xcd, 0x89, 0xbf, 0x8f, 0xb5, 0xaf, 0xf0, 0x50, 0xba, 0x0b, 0xda, 0xda, 0x84, 0xb5, 0x03, 0x2b, 0x69, 0xbd, 0x08, 0xfd, 0x8d, 0xc2, 0xe3, 0xf6, 0x4e, 0xc0, 0x69, 0x1f, 0xdf, 0x2a, 0x16, 0x97, 0x32, 0x39, 0x0d, 0x89, 0x1c, 0x83, 0x5b, 0x5b, 0xb4, 0xcf, 0x7c, 0x28, 0xfc, 0x28, 0x20, 0x71, 0xc3, 0x30, 0x2f, 0x0f, 0xc9, 0xb7, 0x0a, 0x6c, 0x25, 0x8c, 0x14, 0xf3, 0xe4, 0x93, 0x71, 0xc5, 0xf3, 0x18, 0x0d, 0xae, 0x3f, 0x63, 0xe0, 0x57, 0x1a, 0x8d, 0x71, 0xbd, 0xe1, 0x92, 0x99, 0xe1, 0xdb, 0xa6, 0x8a, 0xc2, 0x65, 0xcd, 0x0f, 0x88, 0x4c, 0xa6, 0x16, 0x02, 0x7b, 0x87, 0x6b, 0x52, 0xd6, 0xcf, 0xc6, 0xe7, 0x65, 0x78, 0x08, 0xac, 0xb5, 0xec, 0xc2, 0x7f, 0x7b, 0x1a, 0xf7, 0xe5, 0x7b, 0xc8, 0x23, 0xfc, 0xa8, 0x2b, 0x7b, 0xb1, 0x8d, 0xb5, 0x77, 0x32, 0xeb, 0x2e, 0x8e, 0xa7, 0xa4, 0x06, 0x40, 0x1d, 0xd7, 0xea, 0x5a, 0xc2, 0x4d, 0x95, 0x76, 0x58, 0x14, 0xe9, 0xc1, 0xe4, 0x69, 0x3e, 0x01, 0xa6, 0xdc, 0xfa, 0xd6, 0x4e, 0xae, 0x61, 0x3f, 0x6d, 0x7e, 0xaf, 0x61, 0x2a, 0x24, 0x64, 0x84, 0x36, 0xde, 0xe0, 0x5f, 0x02, 0xaa, 0x2f, 0x95, 0x2f, 0xf2, 0x26, 0x7f, 0x46, 0x6e, 0xaf, 0x2c, 0xa9, 0x47, 0x61, 0xa6, 0xc9, 0x78, 0x54, 0x77, 0x9a, 0x7a, 0x33, 0x6c, 0x44, 0x20, 0x92, 0x99, 0x1c, 0xc0, 0x82, 0x9d, 0xd2, 0x93, 0x63, 0x28, 0xeb, 0x5e, 0xfa, 0xba, 0x72, 0x52, 0xc4, 0xad, 0xeb, 0x31, 0x89, 0x75, 0x89, 0xb3, 0x33, 0x27, 0xa1, 0x28, 0xe1, 0x38, 0x5d, 0x5e, 0x38, 0x87, 0xb5, 0xc5, 0xf9, 0x9e, 0x9b, 0xd1, 0xd9, 0x35, 0x76, 0xa0, 0x8d, 0xf8, 0xd2, 0xdd, 0x24, 0x8b, 0x56, 0xe4, 0x99, 0xca, 0xf6, 0x27, 0xa9, 0x55, 0x6a, 0xd0, 0xe2, 0x4c, 0xde, 0xa8, 0xfd, 0x57, 0xeb, 0x37, 0x6d, 0xea, 0xc6, 0x2d, 0x38, 0xc7, 0xb7, 0x00, 0x06, 0xc4, 0xcd, 0xd7, 0x77, 0xce, 0xd1, 0xa7, 0xba, 0x2e, 0x78, 0x9b, 0x5c, 0x0b, 0xdc, 0xba, 0x5d, 0x30, 0x2d, 0xc4, 0x89, 0x10, 0xa4, 0x5c, 0x05, 0x07, 0xb9, 0x6c, 0x29, 0xe3, 0x96, 0xc6, 0x8d, 0xa3, 0xcb, 0x07, 0x67, 0x7f, 0x43, 0xc1, 0x14, 0x28, 0x77, 0xd9, 0xf4, 0x50, 0xe1, 0x2d, 0x7b, 0x6d, 0xb4, 0x7a, 0x85, 0xba, 0xca, 0x7e, 0xea, 0x7f, 0xde, 0x59, 0x53, 0x93, 0xfb, 0x39, 0x4c, 0x1f, 0x34, 0x36, 0x9a, 0xa4, 0x96, 0x7b, 0xce, 0x40, 0x5b, 0xa7, 0x1a, 0x2d, 0x60, 0x73, 0x64, 0x8a, 0xda, 0x94, 0x99, 0x5e, 0x44, 0xe3, 0x44, 0xda, 0x9c, 0xbb, 0x5f, 0xde, 0xce, 0xa2, 0x68, 0xbf, 0x71, 0x2c, 0xb8, 0x48, 0xb1, 0x1d, 0x11, 0xfe, 0x8c, 0xce, 0x76, 0xa8, 0x42, 0xd2, 0x3f, 0x0f, 0x06, 0xd8, 0x6c, 0x03, 0xfa, 0xd3, 0x3a, 0x9e, 0x5a, 0x59, 0xf4, 0xcd, 0xf7, 0x49, 0x0c, 0x0b, 0xe8, 0xb1, 0x6a, 0x70, 0x7c, 0xef, 0x04, 0xeb, 0x73, 0x16, 0xaf, 0xcc, 0x6d, 0x93, 0x34, 0x85, 0xa2, 0x10, 0xa7, 0xb1, 0xd4, 0x98, 0xf4, 0x55, 0x82, 0xfc, 0xbb, 0x66, 0x5f, 0x76, 0x5e, 0x8c, 0x02, 0x8d, 0x58, 0x26, 0xdf, 0x38, 0xd0, 0x8e, 0x76, 0x46, 0x6d, 0x9e, 0xca, 0xfd, 0x6d, 0x73, 0x15, 0x02, 0xf1, 0x70, 0xba, 0x79, 0x9b, 0x86, 0x7b, 0x6c, 0x5b, 0xb3, 0xec, 0x71, 0x86, 0xc9, 0x27, 0x87, 0x29, 0x71, 0xc2, 0x42, 0x9c, 0x6f, 0xfe, 0x28, 0x5a, 0x28, 0x41, 0x5a, 0x0f, 0x61, 0xc7, 0x77, 0xf3, 0x49, 0x94, 0xbd, 0x57, 0xba, 0xad, 0x71, 0x7d, 0xbc, 0x87, 0x81, 0xad, 0x4b, 0xc0, 0x69, 0x85, 0x5a, 0x0d, 0x53, 0x91, 0x17, 0x74, 0x82, 0x1c, 0x71, 0xbb, 0xf0, 0x45, 0xd7, 0x20, 0x36, 0x55, 0x43, 0x4a, 0xad, 0x4f, 0x78, 0x80, 0xd3, 0xc9, 0x88, 0x19, 0xf0, 0xfb, 0x98, 0x33, 0xf9, 0x16, 0xe7, 0xa8, 0xb4, 0xd7, 0x0d, 0x3e, 0x1d, 0x5b, 0x81, 0x1e, 0x09, 0x35, 0x5e, 0x88, 0x09, 0xbe, 0x67, 0xc4, 0x91, 0xac, 0x48, 0x5c, 0x59, 0xe6, 0x1f, 0x88, 0x04, 0x97, 0x3a, 0xea, 0x00, 0x81, 0x22, 0x7b, 0xad, 0x95, 0xd9, 0xc6, 0xc1, 0xc0, 0x61, 0x54, 0xeb, 0x07, 0x7d, 0x67, 0xb6, 0xd6, 0xbc, 0xeb, 0xb1, 0x95, 0xb2, 0xa9, 0xcd, 0x7d, 0x89, 0xbe, 0x06, 0xaa, 0xb9, 0x4b, 0x45, 0x71, 0x13, 0x6f, 0x85, 0xf3, 0x04, 0x72, 0x35, 0xf2, 0x18, 0x43, 0xde, 0xe4, 0xbd, 0x25, 0x06, 0x46, 0x4a, 0xa5, 0x54, 0x33, 0x3f, 0xcf, 0xf5, 0x35, 0xce, 0xa1, 0x3d, 0x5b, 0x9b, 0xc0, 0x92, 0x8c, 0xc1, 0x6a, 0x86, 0x1a, 0x15, 0xac, 0x43, 0x9a, 0xae, 0xd5, 0x2c, 0xf4, 0xa5, 0x2a, 0xc1, 0xb6, 0x19, 0xdb, 0xc3, 0xae, 0x76, 0x36, 0x99, 0xb7, 0xf7, 0x1b, 0xf3, 0xd3, 0x6a, 0xb0, 0xad, 0x7a, 0x34, 0x55, 0xf6, 0x32, 0x94, 0xdb, 0xb1, 0x60, 0x2c, 0xf0, 0x1b, 0x5e, 0xbd, 0xde, 0xaf, 0xcd, 0x32, 0x76, 0x47, 0x2d, 0xe0, 0x46, 0x83, 0xab, 0x0c, 0x13, 0x6e, 0x39, 0xad, 0x83, 0x5f, 0xe4, 0x74, 0x19, 0x1e, 0x62, 0x0a, 0x66, 0x48, 0xeb, 0x99, 0x7e, 0xf5, 0x4b, 0x8d, 0xaa, 0x97, 0x34, 0x9c, 0x5c, 0x26, 0xd8, 0x03, 0x68, 0x7a, 0xb7, 0x13, 0x70, 0xf8, 0xb6, 0xed, 0xa0, 0x70, 0x72, 0x8a, 0x9c, 0x46, 0xd3, 0xfe, 0xb7, 0xd0, 0xe4, 0xfd, 0x66, 0x00, 0xe2, 0x9e, 0xf4, 0x43, 0x93, 0x5f, 0x77, 0xa8, 0xd8, 0x69, 0x02, 0x45, 0x86, 0x16, 0x1c, 0xd7, 0x72, 0xb1, 0x71, 0xa8, 0xcb, 0x7d, 0xc8, 0xb6, 0xad, 0xf8, 0x35, 0x11, 0xf2, 0x60, 0x90, 0x85, 0x4c, 0x77, 0x25, 0x79, 0x91, 0x84, 0xad, 0x17, 0x55, 0x9a, 0x7e, 0xad, 0xbe, 0x1c, 0xfe, 0x53, 0x94, 0x81, 0x5d, 0xcf, 0x98, 0x55, 0x84, 0xb5, 0x17, 0x80, 0x48, 0xd3, 0xbe, 0xcb, 0xe4, 0xcb, 0xb0, 0xa0, 0xa6, 0x02, 0xd6, 0x11, 0xe8, 0xb9, 0x76, 0x1d, 0x42, 0x7a, 0x08, 0x2e, 0xfe, 0xb6, 0x45, 0xe5, 0xcc, 0xac, 0x80, 0x1a, 0xb7, 0x8c, 0x39, 0x1f, 0x58, 0xdd, 0xf0, 0x45, 0x4a, 0x1c, 0x37, 0xa2, 0xde, 0xa6, 0x0b, 0x11, 0x0f, 0xd8, 0x64, 0x79, 0xb8, 0x74, 0x0b, 0x53, 0x04, 0x46, 0xac, 0x66, 0x26, 0x08, 0x2c, 0xd5, 0x4b, 0x84, 0x3c, 0x5c, 0xcd, 0xf8, 0x2f, 0xd7, 0xaa, 0xbe, 0x08, 0x04, 0x34, 0x2c, 0xd8, 0x89, 0x0a, 0xba, 0x47, 0x39, 0x46, 0x62, 0x70, 0x93, 0xf8, 0x4d, 0xf2, 0x8b, 0xd4, 0xab, 0x43, 0x8e, 0x27, 0xe3, 0x48, 0xc0, 0x10, 0xec, 0x23, 0x88, 0xec, 0xfa, 0x4d, 0x4e, 0x12, 0x5e, 0xe4, 0x83, 0xc1, 0xa7, 0x46, 0xe2, 0x56, 0x0e, 0xde, 0xf6, 0xc2, 0x11, 0x3e, 0xdd, 0x3c, 0x5d, 0x6e, 0x4b, 0x33, 0xf1, 0x84, 0xd2, 0x87, 0x81, 0x75, 0x60, 0xf8, 0x18, 0x2b, 0x09, 0xdf, 0x02, 0xd8, 0x06, 0x1c, 0xe9, 0x89, 0xfe, 0x4f, 0x3e, 0xfe, 0x85, 0x4b, 0xdb, 0xb9, 0xe3, 0xc7, 0xe6, 0x55, 0x16, 0x57, 0xf8, 0x19, 0x1a, 0x9b, 0x7e, 0xcd, 0x67, 0xb6, 0x60, 0xcc, 0xbc, 0x02, 0xe1, 0x5b, 0x1b, 0x03, 0xc7, 0x39, 0x14, 0x99, 0xbb, 0x78, 0x47, 0x79, 0xf2, 0x8a, 0x25, 0xdd, 0x0d, 0x9f, 0xf6, 0x7b, 0x3e, 0x2f, 0x20, 0xb4, 0xad, 0xd2, 0xa6, 0x0f, 0x1a, 0x58, 0xef, 0xe5, 0xc3, 0x16, 0xc9, 0x5e, 0x88, 0x7e, 0xad, 0x9c, 0x4d, 0xf3, 0x45, 0x35, 0xa0, 0xdb, 0x2b, 0xe7, 0x9b, 0xf5, 0xf4, 0x87, 0x0c, 0xec, 0x6d, 0x3b, 0xd4, 0x2d, 0x24, 0xe9, 0x8d, 0xf6, 0x2a, 0xef, 0x70, 0xb0, 0x18, 0x15, 0x75, 0x7f, 0x50, 0xbf, 0xbb, 0x17, 0x85, 0x68, 0x2b, 0xd1, 0x7e, 0x4b, 0x59, 0xfe, 0x16, 0x63, 0xaa, 0x7b, 0x88, 0x96, 0xbc, 0x86, 0xe9, 0x2e, 0x02, 0xcf, 0xf6, 0x88, 0xaf, 0xd2, 0x10, 0x10, 0xd6, 0x65, 0x85, 0x6d, 0xcf, 0x8d, 0x11, 0xf8, 0xdc, 0x96, 0xa5, 0x73, 0x0c, 0x63, 0x66, 0xf8, 0x60, 0x02, 0xf9, 0x2f, 0x2d, 0x83, 0xfe, 0xc4, 0xc1, 0x0b, 0xda, 0x18, 0x49, 0x24, 0xba, 0x37, 0xf3, 0x57, 0xd5, 0x0b, 0x4f, 0xfd, 0xf1, 0xcf, 0xfb, 0x52, 0x28, 0xc5, 0x7f, 0xcb, 0xec, 0x2c, 0x76, 0xaa, 0x49, 0x6d, 0xef, 0xcf, 0x6a, 0x95, 0x12, 0xd1, 0x5f, 0x07, 0x07, 0x4d, 0x1d, 0x73, 0x13, 0x7e, 0xc6, 0x02, 0x04, 0x0e, 0x2b, 0xd3, 0xd0, 0x2c, 0x90, 0xab, 0x79, 0xdf, 0xaf, 0xe8, 0x33, 0x9a, 0xff, 0xb7, 0xc9, 0x10, 0x35, 0x87, 0x3d, 0x49, 0x0b, 0xbe, 0xaf, 0xf6, 0x41, 0xaa, 0x7f, 0x02, 0xe2, 0xba, 0xb6, 0x69, 0xc9, 0xee, 0xa2, 0x4d, 0x63, 0x8c, 0xc1, 0x47, 0xb7, 0x15, 0xe1, 0xfb, 0xa3, 0x77, 0x84, 0xef, 0x68, 0x84, 0x89, 0x9d, 0x69, 0xa3, 0x09, 0xc6, 0x2f, 0xc5, 0x80, 0x0a, 0xb1, 0x9b, 0x2d, 0xb6, 0xd2, 0x07, 0xbb, 0xdd, 0x2c, 0xd0, 0x20, 0xaa, 0x0c, 0x99, 0xc6, 0xf4, 0xbd, 0x14, 0xe8, 0x13, 0x0a, 0x73, 0x40, 0xf2, 0xfe, 0x1f, 0xdf, 0x66, 0xee, 0xad, 0x5c, 0xbe, 0xba, 0x0e, 0x30, 0x9c, 0x4f, 0x05, 0x61, 0x03, 0x70, 0xde, 0x5e, 0xb0, 0xb7, 0x5e, 0x2a, 0xae, 0xd6, 0xf6, 0xbd, 0x25, 0x23, 0x3b, 0xa8, 0x73, 0x54, 0x9b, 0xf7, 0x7d, 0x86, 0x48, 0x5b, 0x47, 0x85, 0x79, 0x89, 0xc3, 0x47, 0xd2, 0xdd, 0xe7, 0xb9, 0x20, 0x43, 0x02, 0xbf, 0x4a, 0x57, 0x50, 0x75, 0x85, 0xcb, 0xcc, 0xbc, 0xc6, 0x09, 0x45, 0xf2, 0x7d, 0x1a, 0xb4, 0x00, 0x80, 0xc7, 0xcd, 0x9a, 0x45, 0xfe, 0xd4, 0xc2, 0x55, 0x77, 0xb2, 0x8e, 0xfd, 0x96, 0x48, 0x2c, 0x47, 0x94, 0x03, 0x23, 0x29, 0xda, 0xb1, 0xdb, 0xfb, 0xad, 0x93, 0x60, 0x2e, 0x10, 0xb3, 0x63, 0x3c, 0xe6, 0x77, 0x82, 0xdb, 0x58, 0x77, 0xc9, 0x76, 0x76, 0x8c, 0x78, 0xdd, 0x21, 0x29, 0x06, 0x3c, 0x28, 0xef, 0x67, 0x4a, 0xb1, 0x7b, 0x8b, 0xc2, 0xdb, 0x83, 0x27, 0x17, 0xa1, 0x21, 0xb7, 0x64, 0x02, 0x6e, 0xc4, 0xa1, 0x5e, 0x53, 0x62, 0x1d, 0x24, 0x9c, 0xfe, 0x28, 0xaa, 0x4e, 0x56, 0x10, 0x5c, 0x3b, 0xc9, 0x50, 0x19, 0xd3, 0xd1, 0x03, 0xda, 0x3d, 0xce, 0x9f, 0x95, 0xa7, 0x05, 0xdf, 0x61, 0xda, 0xe8, 0x01, 0xda, 0x11, 0x98, 0x32, 0xc7, 0x0b, 0xa8, 0x47, 0xfa, 0x5f, 0x24, 0xad, 0x78, 0x10, 0xd1, 0xa3, 0xda, 0x61, 0xb7, 0xa6, 0xf3, 0xea, 0xdd, 0x2d, 0xb3, 0xec, 0x54, 0x97, 0x4b, 0xe2, 0x76, 0x62, 0x92, 0x58, 0x70, 0x9d, 0xa8, 0x00, 0xfe, 0xa0, 0xd9, 0x03, 0x76, 0xfa, 0xc4, 0x95, 0x08, 0xab, 0xbc, 0xcc, 0x44, 0x94, 0x6e, 0xb2, 0xdc, 0x2b, 0xc4, 0x99, 0xac, 0x73, 0x0a, 0xae, 0xf7, 0x2c, 0x50, 0xd1, 0xf4, 0x46, 0x0f, 0xa4, 0x89, 0x9c, 0x0f, 0xe2, 0x56, 0xdf, 0x87, 0xf3, 0xf5, 0xd0, 0x87, 0xbd, 0x80, 0xb3, 0x93, 0xbc, 0x54, 0x00, 0x90, 0x55, 0x15, 0x5b, 0xe5, 0x67, 0xf3, 0xc6, 0xda, 0x24, 0x2b, 0x16, 0x43, 0x1f, 0xd0, 0xa3, 0x63, 0xa5, 0xcb, 0x44, 0x0b, 0x51, 0x21, 0x7b, 0x02, 0xdb, 0x74, 0xec, 0xa9, 0x31, 0xcd, 0x14, 0xdf, 0xc9, 0x98, 0x37, 0x23, 0x35, 0xf0, 0x9a, 0xf8, 0xf8, 0x1d, 0xf3, 0x8e, 0x98, 0x5b, 0x1e, 0x9e, 0xf4, 0xdd, 0x11, 0x96, 0xd8, 0x12, 0x12, 0xf6, 0xcf, 0x27, 0x28, 0xfa, 0x38, 0xcd, 0xcf, 0x79, 0x9c, 0x3c, 0xef, 0x0d, 0x3f, 0x78, 0x0f, 0x74, 0xf5, 0xd3, 0xc6, 0x36, 0x37, 0xb3, 0x73, 0x88, 0x76, 0x95, 0x2e, 0x71, 0xaf, 0x52, 0xff, 0x2b, 0x40, 0xa1, 0x4d, 0xcc, 0xfa, 0xde, 0x99, 0x26, 0x77, 0x0a, 0x6c, 0xeb, 0xae, 0x12, 0x8d, 0x15, 0xc4, 0x54, 0x78, 0x84, 0x26, 0x5f, 0x0c, 0xe9, 0xd4, 0xfa, 0x84, 0xe4, 0x00, 0x69, 0xa8, 0x69, 0xd7, 0xeb, 0x44, 0x68, 0x9f, 0x87, 0xda, 0xad, 0x02, 0x08, 0x94, 0x05, 0xa9, 0x47, 0x7c, 0xa2, 0x0d, 0xa8, 0xef, 0xc0, 0x8a, 0xe7, 0x4f, 0x89, 0xb6, 0x15, 0xf9, 0x36, 0xf0, 0xdd, 0x77, 0x78, 0x3c, 0x0c, 0xf6, 0x16, 0x4e, 0x51, 0xfa, 0xd7, 0xe4, 0x40, 0x50, 0xa2, 0x59, 0x9d, 0x45, 0xe4, 0x77, 0xd8, 0x15, 0x32, 0x8e, 0xd4, 0xa6, 0x30, 0xc2, 0xec, 0x76, 0xb1, 0xa9, 0x38, 0xd2, 0x1f, 0x16, 0x0c, 0x4a, 0x1e, 0x2f, 0xc2, 0x61, 0x6c, 0xc6, 0xba, 0x89, 0x0b, 0xe6, 0x9e, 0x4e, 0xa3, 0xab, 0xeb, 0xd1, 0x22, 0x57, 0xad, 0x78, 0xa5, 0xa3, 0x8a, 0xe4, 0x9b, 0x53, 0x01, 0x23, 0x27, 0x0d, 0xf4, 0x27, 0xc7, 0x6b, 0x64, 0x77, 0x34, 0x4f, 0x7d, 0x25, 0x89, 0x77, 0xd2, 0x00, 0xa6, 0x51, 0xe9, 0x0a, 0xd7, 0x10, 0xfa, 0x2d, 0xb1, 0xff, 0xf4, 0x29, 0x3d, 0x15, 0xc1, 0xd1, 0x59, 0xca, 0xcb, 0x77, 0x5a, 0x2a, 0xbf, 0xa5, 0xf6, 0x28, 0x91, 0x0e, 0x62, 0x34, 0xc0, 0xc3, 0xb7, 0x10, 0xdb, 0xaa, 0x9a, 0xdf, 0x44, 0x2d, 0x1c, 0x7f, 0x34, 0x2f, 0xdf, 0x18, 0xff, 0x44, 0x7b, 0xf5, 0x99, 0x21, 0x1f, 0x93, 0x59, 0x51, 0x7c, 0xf8, 0xfe, 0x2a, 0xde, 0x46, 0xf0, 0x00, 0x9c, 0x90, 0xc8, 0x98, 0xb3, 0xec, 0x11, 0xdf, 0xae, 0xca, 0x50, 0xdc, 0xc9, 0x84, 0x43, 0xe4, 0x55, 0x36, 0x67, 0x0d, 0x5e, 0xcf, 0xbc, 0xe5, 0x8c, 0x68, 0xcc, 0x63, 0x47, 0xd5, 0xea, 0x1d, 0x1e, 0x7a, 0xb8, 0xbc, 0x6a, 0x60, 0xec, 0xad, 0x2e, 0x89, 0x53, 0x1a, 0x42, 0x80, 0x16, 0x19, 0xb1, 0x33, 0x3c, 0x23, 0x5f, 0x05, 0x70, 0xc7, 0xef, 0x20, 0x04, 0x9f, 0xe3, 0x08, 0x37, 0x84, 0x05, 0x76, 0xb3, 0xfe, 0x06, 0x63, 0x5a, 0xfe, 0x66, 0x63, 0x42, 0xd0, 0x93, 0x34, 0xfe, 0x4b, 0x55, 0x97, 0x20, 0x4b, 0x69, 0x5e, 0xfb, 0x61, 0x6d, 0xc7, 0xae, 0xc8, 0xfc, 0x08, 0x5e, 0x9b, 0x19, 0x2b, 0xc2, 0x46, 0xd1, 0x1c, 0xe5, 0x3b, 0x1c, 0x01, 0x27, 0xe6, 0x05, 0xc9, 0x85, 0xe2, 0x0a, 0x08, 0x1b, 0x6d, 0xc6, 0x02, 0xe7, 0x19, 0xcd, 0x05, 0xd0, 0xc5, 0xd8, 0xfd, 0xe7, 0xcc, 0x22, 0x42, 0xec, 0x7c, 0x11, 0xb4, 0x14, 0xca, 0x19, 0x0a, 0x09, 0x43, 0xde, 0x67, 0x33, 0x46, 0x98, 0x2e, 0x36, 0x71, 0xbc, 0x18, 0xbc, 0x59, 0xd9, 0x84, 0x74, 0x7e, 0xbf, 0x0e, 0x5b, 0x7e, 0xe7, 0x62, 0x3a, 0x88, 0x0f, 0x53, 0x6f, 0x14, 0x25, 0x27, 0xf1, 0xd1, 0x66, 0x35, 0x8f, 0xdf, 0xc7, 0xb3, 0x78, 0x3f, 0x94, 0xc9, 0x00, 0x88, 0x57, 0xe9, 0xa1, 0xdb, 0xfb, 0x63, 0x40, 0x18, 0x31, 0x34, 0xb2, 0x52, 0x13, 0x1f, 0x7f, 0x81, 0x07, 0x00, 0xe6, 0x77, 0xe7, 0x5c, 0x21, 0x16, 0x5f, 0x3c, 0xea, 0xbf, 0x96, 0x3c, 0x3d, 0x0d, 0x10, 0xdf, 0x60, 0xc4, 0xd3, 0x25, 0x21, 0x04, 0xc8, 0x60, 0x5f, 0xc3, 0x65, 0x43, 0xcb, 0x7a, 0x89, 0x3c, 0xf0, 0x1d, 0xa7, 0x04, 0x71, 0x51, 0x27, 0x74, 0x92, 0xda, 0x09, 0x9a, 0xfa, 0x52, 0xcc, 0x0c, 0xb8, 0x21, 0x8e, 0x7c, 0x83, 0xa9, 0x74, 0x8d, 0x46, 0xc1, 0x4c, 0xe5, 0xdc, 0x65, 0x71, 0x83, 0x17, 0xab, 0xef, 0x53, 0x08, 0xf9, 0xe8, 0x00, 0x7a, 0x76, 0x37, 0x0a, 0xc0, 0xbe, 0x52, 0x18, 0xb1, 0xda, 0x75, 0x8f, 0xf0, 0x6f, 0xfd, 0x63, 0x71, 0x35, 0x12, 0x2e, 0x38, 0xab, 0x88, 0x7f, 0x64, 0x0a, 0x07, 0x74, 0x6d, 0x77, 0x6a, 0x8b, 0xaa, 0x7c, 0x66, 0xb5, 0x16, 0xb9, 0x6c, 0xac, 0x53, 0xd7, 0xd0, 0x87, 0xef, 0xbe, 0x2a, 0x8c, 0xe7, 0x08, 0xfd, 0x45, 0x69, 0xb5, 0x96, 0xd6, 0xde, 0x20, 0x37, 0x8d, 0x28, 0x31, 0x75, 0xbb, 0x28, 0xd5, 0xdf, 0xc2, 0x84, 0xab, 0xe0, 0x70, 0xa7, 0x01, 0xe7, 0x8b, 0x09, 0xfe, 0xc4, 0xad, 0xb0, 0x20, 0x56, 0x52 ],
+const [ 0x9c, 0xef, 0x28, 0x54, 0xf7, 0x87, 0x9c, 0x83, 0x0b, 0xa8, 0x61, 0xf6, 0xa9, 0x2e, 0xf7, 0x02, 0x5f, 0xb9, 0x8a, 0xec, 0xf1, 0x52, 0x0f, 0xac, 0x07, 0x51, 0x90, 0xf0, 0x24, 0x7d, 0xc4, 0x64, 0xd7, 0x76, 0xe3, 0x31, 0x35, 0x50, 0xb8, 0xc3, 0x86, 0x81, 0xf8, 0xd0, 0x3f, 0xfd, 0xd2, 0x96, 0x31, 0x9f, 0xc7, 0x64, 0xff, 0xcb, 0xbc, 0x5b, 0xd5, 0x52, 0x4e, 0x76, 0x57, 0x95, 0x65, 0xc8, 0xd8, 0xee, 0x0c, 0x05, 0xcd, 0x4b, 0x80, 0x44, 0x81, 0x1c, 0x86, 0x03, 0x0a, 0x70, 0x02, 0x6c, 0x7b, 0x5a, 0xc6, 0xd7, 0x5b, 0x9a, 0xa8, 0x8f, 0x56, 0x79, 0xd7, 0xd9, 0x33, 0xf5, 0x6f, 0x32, 0x06, 0x1e, 0x4a, 0xd9, 0xa7, 0xc0, 0x1a, 0x8d, 0x62, 0x42, 0xb4, 0x98, 0xf0, 0xce, 0xaf, 0x0c, 0xa6, 0xb3, 0x2e, 0x4d, 0xed, 0x07, 0xfa, 0xcf, 0xf2, 0x90, 0xd4, 0x21, 0x9f, 0xe5, 0x09, 0x2b, 0xc9, 0xd0, 0x46, 0xb4, 0xab, 0xf7, 0xae, 0x27, 0x93, 0xbb, 0x2a, 0x96, 0xdb, 0x61, 0x00, 0xff, 0x1b, 0x6f, 0xa8, 0xce, 0x9d, 0x59, 0xdb, 0xa4, 0x11, 0x5d, 0xec, 0x57, 0x82, 0xac, 0x5b, 0x3a, 0x89, 0xca, 0xa8, 0x9e, 0xc1, 0x37, 0x65, 0x98, 0x7a, 0x4f, 0x8f, 0x05, 0xb2, 0x6f, 0x1e, 0xcc, 0x41, 0x59, 0xdb, 0x63, 0x53, 0xda, 0x72, 0x95, 0x1b, 0xaa, 0xc8, 0x82, 0xc6, 0x93, 0x8e, 0xe7, 0xae, 0xd5, 0x17, 0x9f, 0xd1, 0xca, 0x66, 0x6a, 0x81, 0xc6, 0x8c, 0xee, 0x5d, 0x41, 0x31, 0xfb, 0x7f, 0x38, 0x70, 0x13, 0xf7, 0xd0, 0xe8, 0x2a, 0x78, 0x3d, 0x0f, 0xaa, 0x52, 0xe2, 0xca, 0xba, 0xa0, 0xb9, 0x3b, 0xc0, 0xc3, 0xf6, 0xda, 0x24, 0x0f, 0xe7, 0xc8, 0x58, 0xc3, 0x1f, 0x60, 0x15, 0x3f, 0xd3, 0x0e, 0xe7, 0x71, 0x84, 0x64, 0xeb, 0x91, 0xde, 0x6a, 0xd7, 0x0e, 0xe1, 0x36, 0x3c, 0xc8, 0x3e, 0xbd, 0x08, 0x7f, 0x04, 0xe9, 0x4f, 0x8b, 0x7b, 0xec, 0x4b, 0xce, 0x50, 0xd3, 0xa1, 0xe8, 0xf3, 0x5e, 0xe5, 0xa9, 0x3e, 0x0f, 0x61, 0xcc, 0x57, 0x81, 0x12, 0xe2, 0xd7, 0xfb, 0xf4, 0x8c, 0x2c, 0x45, 0x80, 0xed, 0x3c, 0xba, 0x72, 0x5f, 0x4a, 0x9f, 0xcf, 0x65, 0x1e, 0xb3, 0x27, 0xe2, 0x60, 0x07, 0x17, 0x88, 0x46, 0x10, 0x13, 0x92, 0x6f, 0xfb, 0x62, 0xb6, 0x0e, 0x40, 0x6a, 0x55, 0x4a, 0x7a, 0x2e, 0xf6, 0xe5, 0x76, 0x15, 0xf2, 0x1c, 0x8a, 0xed, 0x70, 0xcf, 0x28, 0x2f, 0x94, 0xe2, 0xb2, 0x85, 0xf4, 0xe3, 0x90, 0x89, 0x4c, 0xed, 0x81, 0xd0, 0x72, 0xcc, 0x2e, 0x27, 0x8c, 0x61, 0x05, 0x1c, 0x80, 0x48, 0x44, 0xc1, 0xac, 0xb9, 0x54, 0xac, 0xd8, 0xac, 0x59, 0x42, 0x68, 0x41, 0x07, 0x36, 0xd6, 0x5e, 0xb7, 0x4c, 0x60, 0x9a, 0xba, 0x63, 0xfe, 0x5a, 0xed, 0xb2, 0x97, 0x39, 0x8d, 0x52, 0x74, 0xae, 0x4d, 0xfc, 0xf5, 0xe9, 0xa6, 0x15, 0x83, 0xfd, 0x6f, 0xe7, 0xc5, 0x44, 0xad, 0x32, 0x17, 0xff, 0xac, 0xe3, 0x38, 0x3e, 0x4f, 0x23, 0x42, 0x00, 0xa4, 0x93, 0xe0, 0x9a, 0xbb, 0xd6, 0xbb, 0x5d, 0xb9, 0x51, 0x35, 0x73, 0x28, 0x2e, 0x5a, 0x0a, 0x91, 0xa7, 0x13, 0xb5, 0x4d, 0x81, 0x9d, 0x0e, 0x98, 0xd6, 0x3a, 0xa1, 0xe7, 0x18, 0x27, 0x05, 0x7c, 0x53, 0xcd, 0x4c, 0x37, 0xb2, 0x3b, 0x9e, 0xaf, 0x45, 0xd4, 0x20, 0x81, 0x01, 0x45, 0x1a, 0xe8, 0x09, 0xbb, 0x5a, 0x8e, 0x2c, 0x52, 0xd3, 0xa2, 0xae, 0xd0, 0x8a, 0x2b, 0x4b, 0x93, 0xb3, 0x9c, 0x79, 0xc8, 0x16, 0xa8, 0xee, 0xde, 0xb8, 0x57, 0x62, 0x3a, 0xb8, 0x5a, 0x96, 0x2d, 0x77, 0x9c, 0x95, 0x23, 0xfb, 0x19, 0x39, 0x1d, 0x96, 0xf3, 0xf2, 0x61, 0xc2, 0xc2, 0xc3, 0x6f, 0x50, 0x2c, 0x8d, 0x38, 0xc2, 0xb7, 0x90, 0x8b, 0xf5, 0xda, 0x2f, 0xd0, 0x03, 0x5a, 0xf3, 0xf8, 0x67, 0xd4, 0xd3, 0xb4, 0x62, 0x95, 0xb3, 0xe5, 0x9e, 0xb2, 0x2a, 0x54, 0x12, 0x56, 0x88, 0xa4, 0x25, 0x56, 0x18, 0x85, 0x16, 0x0b, 0xa2, 0x2a, 0x9b, 0x60, 0x34, 0xfc, 0xc8, 0x2a, 0x22, 0x90, 0x33, 0xb8, 0x4c, 0xd6, 0x56, 0xab, 0x9f, 0x94, 0x34, 0x08, 0xdf, 0x13, 0x40, 0x8c, 0xa3, 0x19, 0x7a, 0x40, 0xa1, 0x16, 0xdb, 0x4d, 0x2b, 0xa2, 0xf3, 0x10, 0xfa, 0x27, 0xd1, 0x71, 0x2b, 0xdb, 0x23, 0x71, 0x87, 0xf2, 0x9e, 0x03, 0x07, 0x11, 0xa0, 0x1d, 0x97, 0x05, 0x14, 0x0e, 0x1b, 0xb5, 0x97, 0x12, 0xb0, 0x55, 0xd8, 0x24, 0x34, 0xdd, 0x45, 0x13, 0x08, 0xba, 0xe4, 0xd8, 0x14, 0xc3, 0x7e, 0x27, 0x0c, 0x6e, 0x03, 0x44, 0xf2, 0x44, 0x2a, 0x18, 0xdd, 0x92, 0x58, 0x84, 0xf8, 0x62, 0xc3, 0xf5, 0xcd, 0xa9, 0xd7, 0x39, 0xc4, 0xc2, 0xd9, 0x91, 0xe6, 0x1b, 0xca, 0x07, 0xe7, 0x2f, 0x8e, 0x01, 0x64, 0xb4, 0x4d, 0x17, 0x69, 0x15, 0x1a, 0x22, 0x36, 0x22, 0xd2, 0x95, 0x43, 0x07, 0x47, 0x11, 0x81, 0x7a, 0x9e, 0x33, 0xe3, 0x39, 0xf6, 0xb1, 0x1d, 0xb4, 0x4b, 0xa5, 0xac, 0x06, 0x99, 0x28, 0x16, 0x2a, 0x44, 0x23, 0x73, 0x6c, 0xb7, 0x62, 0x2c, 0x1d, 0x4b, 0xea, 0x03, 0x8b, 0x6b, 0x8d, 0x53, 0x31, 0xf7, 0xbb, 0x99, 0x2a, 0xe5, 0x9b, 0x34, 0xec, 0x2e, 0x5a, 0x69, 0x32, 0xe8, 0xc4, 0xaa, 0x3a, 0xaf, 0x11, 0x18, 0x31, 0x4a, 0x01, 0x46, 0xec, 0x8c, 0x2b, 0x40, 0xd8, 0x77, 0x91, 0xcc, 0x34, 0xa8, 0x79, 0xef, 0x7d, 0xef, 0x78, 0xb3, 0x2a, 0x3d, 0xd0, 0x28, 0x9a, 0xc3, 0xfc, 0xa9, 0x4b, 0x58, 0x88, 0x60, 0x4c, 0x1b, 0x26, 0x0d, 0xf5, 0x5a, 0xff, 0x02, 0xd5, 0xb3, 0x47, 0x72, 0xec, 0x79, 0x14, 0xec, 0x1a, 0x5a, 0x70, 0x23, 0xd8, 0x3e, 0xac, 0xf0, 0x26, 0x71, 0xf8, 0x9a, 0xc4, 0x05, 0x31, 0x54, 0xa5, 0x72, 0xfa, 0x07, 0xa1, 0x80, 0x0e, 0x52, 0x6a, 0x67, 0xd5, 0xd0, 0xc1, 0x34, 0x35, 0x99, 0xea, 0x6e, 0xaa, 0x0b, 0x5d, 0xfa, 0x99, 0xca, 0xbe, 0x3c, 0xe1, 0x05, 0x0f, 0x7f, 0xb4, 0xfb, 0x25, 0x97, 0xa5, 0xbe, 0x58, 0xc4, 0x01, 0x37, 0x7f, 0xda, 0x63, 0x6b, 0x1c, 0x9f, 0x83, 0xfc, 0xd3, 0x75, 0x4f, 0xf3, 0x21, 0x39, 0x3d, 0xbc, 0x4a, 0x6a, 0xdf, 0x72, 0x93, 0x8e, 0xb8, 0x5e, 0xb2, 0xd1, 0x4e, 0xba, 0x83, 0xf0, 0x80, 0xba, 0xfc, 0x55, 0x1a, 0xcd, 0x63, 0x84, 0xa7, 0x20, 0xbe, 0xb5, 0x86, 0x63, 0x8c, 0xc2, 0x40, 0xd1, 0xb2, 0x44, 0x19, 0x6a, 0xb8, 0xf9, 0xe5, 0x83, 0x35, 0x6a, 0x1d, 0x81, 0x88, 0xca, 0x32, 0xe2, 0xc9, 0x20, 0x21, 0x7d, 0x00, 0xa9, 0x48, 0x0a, 0x94, 0x77, 0x78, 0xe4, 0x06, 0x5f, 0x4b, 0x0e, 0xde, 0x12, 0xb8, 0x74, 0xe6, 0x8a, 0xe4, 0x74, 0x97, 0xa8, 0x3b, 0x9d, 0xd1, 0x1b, 0xc0, 0xb7, 0xcf, 0x83, 0xa1, 0x03, 0x59, 0xd6, 0x0f, 0xc4, 0x3b, 0x03, 0x4c, 0xfd, 0xf7, 0xd6, 0x06, 0x7d, 0xb7, 0x1c, 0xe3, 0x19, 0x85, 0x07, 0x5d, 0x39, 0xbe, 0xd4, 0xd0, 0x96, 0xc4, 0xaa, 0xd1, 0x41, 0xf4, 0xc6, 0xc2, 0xe8, 0xd8, 0xd5, 0xa3, 0x55, 0x9d, 0xa1, 0x2b, 0x37, 0xc7, 0xf0, 0x18, 0x25, 0x23, 0xa9, 0xc3, 0xe0, 0xfd, 0x39, 0xf7, 0xd8, 0x94, 0x35, 0x03, 0xf2, 0xcb, 0x41, 0x0e, 0x89, 0x21, 0x30, 0xab, 0xb3, 0xe3, 0x6d, 0xae, 0xc5, 0xa1, 0x99, 0x3d, 0x19, 0xde, 0x75, 0x2a, 0x0e, 0x0b, 0x03, 0x80, 0x51, 0xb7, 0xe8, 0x5b, 0x5b, 0x00, 0x15, 0xfd, 0x3b, 0x4d, 0xa6, 0x1f, 0x96, 0x3f, 0x0a, 0x85, 0xec, 0xe4, 0x65, 0xd5, 0x1c, 0x2e, 0x32, 0xa9, 0x2b, 0xa4, 0x2d, 0xe3, 0x41, 0x58, 0x70, 0x41, 0xf4, 0x19, 0xdc, 0x31, 0xc9, 0xe9, 0xba, 0xe6, 0xf8, 0xb2, 0xa2, 0xab, 0x70, 0x34, 0x9c, 0x77, 0x1b, 0x42, 0x86, 0xc2, 0x63, 0x2e, 0xb6, 0x98, 0xf5, 0x82, 0xe0, 0xec, 0xc5, 0xf0, 0x39, 0x2e, 0x52, 0x8c, 0xdc, 0x20, 0x2b, 0x39, 0x6d, 0xe5, 0xb2, 0x61, 0xfd, 0x5a, 0x20, 0xea, 0x2e, 0xaa, 0xc9, 0x65, 0x98, 0x1d, 0xa2, 0x88, 0x6b, 0x31, 0x00, 0xde, 0x55, 0xec, 0xa2, 0xbd, 0xa6, 0x70, 0xf2, 0x79, 0xb2, 0xd0, 0x88, 0xd7, 0x76, 0x22, 0xf0, 0xc4, 0x7f, 0xd6, 0xad, 0x47, 0x08, 0x46, 0x7d, 0xb5, 0x63, 0x8d, 0xdf, 0x24, 0x9a, 0x9d, 0xd3, 0x21, 0x55, 0x8c, 0xe1, 0xa6, 0xfe, 0x2f, 0x5c, 0x46, 0x24, 0xea, 0xe8, 0xab, 0x1d, 0xc6, 0x3a, 0x42, 0xf0, 0xc4, 0x1f, 0x35, 0x72, 0x72, 0xc0, 0x9a, 0xae, 0xbb, 0x24, 0xea, 0x8a, 0x03, 0xf6, 0xb4, 0xa8, 0x74, 0x89, 0x92, 0x8b, 0x92, 0x19, 0x5d, 0xfb, 0x16, 0x54, 0x9d, 0xaa, 0xf9, 0x18, 0x43, 0x17, 0xcf, 0x7f, 0x9b, 0xb3, 0x56, 0x19, 0x7c, 0x43, 0x4f, 0x78, 0xc2, 0x85, 0x8c, 0xf2, 0xfd, 0x16, 0x4b, 0xa2, 0x6b, 0x93, 0xc2, 0xb0, 0x24, 0xfe, 0xfb, 0xd2, 0x95, 0x64, 0xe2, 0x13, 0x2f, 0xbd, 0x9d, 0xd4, 0x60, 0x14, 0x1b, 0x10, 0xc3, 0xe8, 0xf0, 0xe4, 0x94, 0xd1, 0x60, 0x4e, 0x66, 0x67, 0xb9, 0x35, 0x18, 0x5f, 0xe7, 0xa9, 0x05, 0xf7, 0x42, 0x6d, 0x7b, 0x95, 0xaa, 0xb2, 0x6f, 0xaa, 0xd6, 0x26, 0x6e, 0xdd, 0xe9, 0x2d, 0xd7, 0x66, 0x46, 0x6e, 0x48, 0xb7, 0xa6, 0x92, 0x56, 0x62, 0x68, 0x48, 0x81, 0x37, 0x28, 0x8d, 0x66, 0xac, 0x92, 0x2a, 0x37, 0x83, 0x78, 0x7e, 0x69, 0xa6, 0x23, 0x7d, 0xac, 0x56, 0xe7, 0xf9, 0x20, 0x84, 0xfa, 0x21, 0xc6, 0x7f, 0x87, 0x47, 0x35, 0xd0, 0xfd, 0xe6, 0x8e, 0x62, 0xad, 0xe3, 0xb1, 0xe7, 0x94, 0x13, 0xb1, 0x76, 0x75, 0xfe, 0x86, 0x79, 0x2c, 0xe2, 0x02, 0xc6, 0x3e, 0xfb, 0x07, 0x0c, 0xb4, 0x02, 0xf6, 0x71, 0x2a, 0xf4, 0x6a, 0x79, 0x23, 0x14, 0x27, 0x2a, 0x9f, 0x33, 0x4d, 0x6e, 0xf0, 0x2f, 0xd2, 0xb8, 0xc9, 0xba, 0x2e, 0xea, 0x98, 0x5c, 0x58, 0x77, 0x15, 0xbb, 0xf2, 0xc4, 0x1b, 0x1b, 0xc0, 0xd5, 0xb8, 0x21, 0x5f, 0x25, 0x80, 0xdc, 0x34, 0xd5, 0x26, 0x06, 0xa2, 0x09, 0x4d, 0x86, 0x80, 0x90, 0x9b, 0x3a, 0xca, 0xc3, 0x0f, 0xf4, 0x96, 0xaf, 0x95, 0xc2, 0x4a, 0x76, 0xd8, 0x73, 0x0d, 0xf2, 0x58, 0x56, 0x7b, 0x9c, 0xbc, 0x45, 0x9d, 0xac, 0x69, 0xe2, 0x18, 0x82, 0x53, 0x21, 0xa4, 0x45, 0x13, 0x07, 0xc0, 0xca, 0x3b, 0xb1, 0xa5, 0xb7, 0xe6, 0x97, 0x78, 0xe8, 0x93, 0x12, 0xc3, 0x11, 0x33, 0x1c, 0x26, 0xa5, 0x80, 0x57, 0x4a, 0xf7, 0x91, 0x52, 0x17, 0xa0, 0xab, 0x07, 0x27, 0x20, 0x5b, 0xa8, 0x7a, 0xc8, 0xc1, 0x9b, 0x6b, 0xd7, 0x2f, 0xc3, 0xe2, 0xe3, 0xf3, 0x01, 0xcc, 0x7a, 0x70, 0xfa, 0xc8, 0x0a, 0x74, 0x1b, 0x23, 0xfe, 0xc5, 0xdb, 0x07, 0x2a, 0xfd, 0x40, 0xef, 0x69, 0x98, 0xa5, 0x5e, 0x84, 0x4c, 0xba, 0xd1, 0x56, 0x99, 0xcc, 0xf2, 0x2e, 0xa0, 0x47, 0x0e, 0x75, 0x38, 0x79, 0xc9, 0x91, 0x3f, 0x98, 0x11, 0x08, 0x2e, 0x07, 0x50, 0xe9, 0xf0, 0xd5, 0xe6, 0x68, 0xf5, 0x87, 0xd6, 0xc8, 0x82, 0x17, 0xbf, 0x7e, 0x4b, 0x3c, 0x0f, 0x93, 0x43, 0xec, 0x73, 0x4a, 0xb3, 0x1f, 0x92, 0x03, 0x89, 0xd7, 0xfa, 0x5f, 0xf3, 0x5d, 0x5a, 0xa5, 0x2d, 0xcd, 0xf3, 0x64, 0x98, 0xd4, 0x49, 0x5a, 0x0b, 0xb9, 0x1e, 0x95, 0x6d, 0x9a, 0xa0, 0xd8, 0x84, 0xf9, 0xe2, 0x40, 0x08, 0x77, 0x89, 0x27, 0xfc, 0xde, 0xc8, 0x49, 0x3e, 0x65, 0x8e, 0x25, 0x5c, 0x30, 0xfd, 0xa7, 0xa9, 0x17, 0x1f, 0x03, 0x90, 0xa8, 0xd4, 0xe4, 0x29, 0x6f, 0x0f, 0xc6, 0x0a, 0x75, 0x42, 0xa0, 0x60, 0x06, 0x17, 0xc7, 0x3e, 0xb7, 0x61, 0x0f, 0x34, 0xa8, 0x52, 0x33, 0x24, 0x07, 0xee, 0x77, 0x51, 0xd5, 0xbf, 0x8b, 0xb9, 0xed, 0xcb, 0xb3, 0xa5, 0x42, 0xc3, 0x25, 0x7e, 0x68, 0x7d, 0xb2, 0xe2, 0x56, 0xa4, 0xa9, 0xf7, 0x6a, 0xaf, 0xf9, 0xff, 0xad, 0x0f, 0x95, 0x2d, 0x59, 0xad, 0x1d, 0xb7, 0x98, 0x93, 0xba, 0x2d, 0x8f, 0xe9, 0x4a, 0x09, 0x9b, 0x24, 0xbd, 0x87, 0xda, 0x7a, 0xbe, 0xb7, 0xee, 0x99, 0x96, 0xd0, 0xfd, 0x98, 0x4e, 0xc7, 0xfc, 0x2e, 0x14, 0x20, 0x2e, 0x22, 0xe1, 0x05, 0xe7, 0x02, 0x58, 0x95, 0x96, 0x18, 0xf0, 0x7e, 0x02, 0x9a, 0x55, 0xce, 0xd4, 0x21, 0x0c, 0x06, 0x56, 0x5c, 0x56, 0x70, 0x7a, 0x06, 0x58, 0xb3, 0x1e, 0x15, 0x78, 0xa5, 0x8e, 0x35, 0x0a, 0x60, 0x4b, 0x74, 0x2c, 0x98, 0x0b, 0x3f, 0xee, 0x2c, 0x00, 0x8d, 0xb7, 0xfa, 0x5d, 0x5a, 0xe4, 0xf8, 0x17, 0x57, 0xb1, 0x81, 0xe8, 0xe0, 0x5d, 0xec, 0x9a, 0x2e, 0x89, 0x63, 0x82, 0xce, 0xe2, 0xf2, 0x4b, 0x51, 0xff, 0xdf, 0xf5, 0x46, 0x8c, 0x3a, 0x1c, 0x65, 0xa9, 0xb4, 0x7e, 0x0d, 0x8d, 0xb5, 0xb8, 0xf1, 0x6f, 0xa8, 0x50, 0x0e, 0xa6, 0x9a, 0xf8, 0xe0, 0x0f, 0x03, 0x11, 0xd5, 0xaf, 0xe3, 0x6f, 0x02, 0x99, 0x11, 0x5c, 0x14, 0x12, 0xd0, 0xdf, 0x8a, 0xf4, 0xa4, 0x3e, 0x22, 0x50, 0x64, 0xc1, 0x91, 0x57, 0x8f, 0xb9, 0x77, 0x7b, 0xe3, 0xc1, 0x92, 0xd1, 0x2c, 0x44, 0x32, 0xba, 0x5b, 0x3f, 0xed, 0xc2, 0xd7, 0x48, 0x93, 0xc8, 0x18, 0xd0, 0x65, 0x60, 0x71, 0xa5, 0x81, 0x75, 0x2d, 0xba, 0xa1, 0x33, 0xde, 0x2b, 0x05, 0x23, 0xf2, 0x7c, 0xae, 0x98, 0x87, 0x22, 0xcd, 0x4b, 0x81, 0x44, 0x7b, 0x42, 0xd9, 0xc2, 0xaa, 0xf6, 0x37, 0x77, 0x5c, 0xb4, 0xc4, 0xbb, 0x13, 0x44, 0x39, 0x2c, 0x88, 0xc9, 0x3d, 0xaf, 0x9f, 0xe8, 0xed, 0xb1, 0x9b, 0x2c, 0xbc, 0xb3, 0x8e, 0xa9, 0x7d, 0x05, 0x14, 0xe0, 0xbe, 0xd1, 0x41, 0xe3, 0x58, 0x5c, 0xd8, 0xba, 0x44, 0x89, 0xbe, 0x04, 0xb0, 0x9f, 0xae, 0xe1, 0x52, 0x4b, 0x2d, 0x10, 0xfd, 0xe9, 0xc1, 0x55, 0x72, 0xff, 0x5e, 0x1e, 0x78, 0x0a, 0x21, 0x65, 0x2f, 0x7e, 0x41, 0xd8, 0xa1, 0x08, 0x42, 0x38, 0x9a, 0x16, 0x6b, 0xff, 0xba, 0x99, 0x7b, 0x45, 0xc8, 0x09, 0x98, 0xe4, 0x49, 0xaa, 0x88, 0xdb, 0x51, 0x0f, 0x23, 0xf0, 0x9a, 0xdc, 0x08, 0x9a, 0xd3, 0xd0, 0x90, 0x1d, 0x3a, 0x02, 0x00, 0xf7, 0x6d, 0x6a, 0x03, 0x7b, 0x7d, 0xa4, 0x57, 0xbc, 0x45, 0xf1, 0xc6, 0xac, 0xfa, 0x7f, 0x58, 0x85, 0x03, 0xea, 0xc7, 0x68, 0x0a, 0x02, 0x33, 0x44, 0x53, 0xcf, 0x17, 0xfa, 0x4c, 0xd2, 0x7c, 0xbf, 0x66, 0x8e, 0x6c, 0xc1, 0x24, 0x47, 0xaa, 0x0d, 0x71, 0x0a, 0xa0, 0xb0, 0x37, 0xed, 0x99, 0x1c, 0x2d, 0x98, 0x30, 0xce, 0xf1, 0x04, 0x08, 0x2e, 0x56, 0x83, 0xbe, 0xb7, 0xff, 0x01, 0x1c, 0x57, 0x2d, 0x89, 0x90, 0x19, 0xd5, 0x0b, 0xdc, 0x01, 0xf6, 0x5c, 0x0e, 0x37, 0x29, 0x7e, 0xb3, 0x69, 0x7a, 0x22, 0x48, 0x6a, 0x76, 0x6b, 0xf1, 0x1f, 0x85, 0xf5, 0x6e, 0x9b, 0x7a, 0x16, 0x4a, 0x89, 0x69, 0x63, 0x55, 0xca, 0xb8, 0x76, 0x55, 0x60, 0x79, 0xef, 0xf9, 0x8b, 0xf7, 0xb9, 0x0e, 0x31, 0x8f, 0x8f, 0xf5, 0x83, 0xc2, 0xbe, 0x55, 0xde, 0x88, 0x2c, 0x0d, 0xef, 0xe6, 0x99, 0x6d, 0x1b, 0xc2, 0x25, 0xa5, 0x1e, 0xf7, 0x12, 0x7d, 0xf2, 0xa5, 0xcc, 0x47, 0xf2, 0xca, 0x26, 0x12, 0x3f, 0x17, 0xe7, 0x21, 0x63, 0xfc, 0x85, 0x9c, 0x34, 0x06, 0x30, 0x84, 0xfb, 0x6a, 0x12, 0xec, 0xd6, 0xe2, 0xd6, 0x67, 0x5b, 0xb7, 0x67, 0xbd, 0x7e, 0x1f, 0xfa, 0xe2, 0xb5, 0xca, 0x4e, 0x28, 0x5a, 0xb8, 0x32, 0xb3, 0x50, 0x4d, 0x49, 0x2d, 0xe9, 0xa7, 0x0a, 0xbc, 0x07, 0x2f, 0x0a, 0x31, 0x82, 0x6e, 0x7e, 0x83, 0xca, 0x23, 0xfb, 0x7b, 0xce, 0x92, 0x81, 0xb0, 0x1c, 0x1e, 0xb8, 0xb6, 0x49, 0x1a, 0x79, 0x93, 0x93, 0xdd, 0x90, 0x72, 0xc5, 0x14, 0xc1, 0x9c, 0x5b, 0x5d, 0x09, 0xa3, 0xe7, 0x11, 0x25, 0xe0, 0xb3, 0x60, 0x59, 0x20, 0xa8, 0xa4, 0x6a, 0x9b, 0x6e, 0xef, 0xec, 0x26, 0xd5, 0xe6, 0xc4, 0xa9, 0x74, 0xd3, 0xe5, 0xd2, 0x90, 0xf5, 0x5d, 0x0b, 0x3f, 0x1b, 0x95, 0xaa, 0xcc, 0x71, 0xd4, 0x68, 0x5e, 0x99, 0x06, 0x15, 0xd5, 0xfd, 0xbc, 0x8a, 0xf5, 0x64, 0x73, 0xde, 0xc6, 0xc4, 0x19, 0xdd, 0x3a, 0x57, 0xcd, 0xb5, 0x11, 0xf1, 0xe7, 0xf3, 0xfa, 0x91, 0x38, 0xae, 0xfb, 0x36, 0x93, 0x02, 0x12, 0xf4, 0x8b, 0xc1, 0x1d, 0x46, 0x7f, 0x64, 0xf7, 0xa6, 0xd4, 0x48, 0xe4, 0x5b, 0x82, 0x17, 0x2f, 0x93, 0xd2, 0x83, 0x11, 0xb1, 0x66, 0x3b, 0xd5, 0xe8, 0x79, 0x17, 0x3a, 0x09, 0x68, 0x96, 0x19, 0x99, 0x71, 0x8b, 0x47, 0x27, 0xbb, 0x13, 0xbd, 0xdc, 0x97, 0xca, 0xf6, 0x54, 0x06, 0x3f, 0x99, 0xac, 0x7b, 0xa5, 0x58, 0xdd, 0xe2, 0xcb, 0x18, 0x48, 0xe0, 0x4e, 0x52, 0x92, 0x5d, 0x0d, 0xb9, 0xb1, 0x40, 0xdd, 0x1d, 0x47, 0x79, 0x7e, 0x8f, 0x2f, 0x45, 0xce, 0xc6, 0x56, 0xad, 0x3d, 0xc1, 0xcd, 0x50, 0x81, 0xae, 0x1c, 0x63, 0x8b, 0x0b, 0xd8, 0xf6, 0xb9, 0x0b, 0x78, 0x79, 0x4d, 0x3b, 0x64, 0x7e, 0x1e, 0x65, 0x4f, 0xc1, 0x8d, 0xb4, 0xc7, 0x65, 0xbb, 0x1a, 0x0a, 0x80, 0xf9, 0xef, 0x1c, 0xda, 0x80, 0xdb, 0x16, 0xf2, 0x63, 0xf5, 0xc1, 0x42, 0xc1, 0x2c, 0x63, 0xc4, 0x3f, 0xe7, 0xd9, 0xb5, 0xb5, 0xe8, 0xe6, 0x99, 0x28, 0x76, 0xcb, 0x7f, 0xf9, 0xbb, 0x18, 0x86, 0x5b, 0x6b, 0xc1, 0xa0, 0x0a, 0xa6, 0x74, 0x96, 0x3b, 0x20, 0x2a, 0x4d, 0xce, 0x7f, 0xfd, 0x47, 0xcb, 0x04, 0x39, 0x6c, 0x0c, 0x6e, 0xb5, 0x0b, 0x37, 0x1b, 0x64, 0x1c, 0xf0, 0x71, 0x27, 0xc8, 0x4c, 0x7c, 0xe5, 0x2b, 0x88, 0xd8, 0xde, 0x58, 0xfb, 0xd2, 0x3c, 0x9d, 0x49, 0xca, 0xeb, 0x09, 0xda, 0xdc, 0xab, 0x2c, 0x8a, 0xbf, 0x64, 0x1e, 0xa2, 0xec, 0xb9, 0xc3, 0x08, 0x03, 0xdf, 0x4c, 0xb2, 0x6b, 0xb0, 0x01, 0x60, 0x39, 0xfb, 0x3e, 0x8b, 0x54, 0x1f, 0xbc, 0x98, 0xd6, 0xd8, 0x12, 0x52, 0xb5, 0x58, 0x7c, 0x97, 0xa2, 0x9a, 0xda, 0x51, 0x31, 0xf3, 0xfc, 0xa9, 0x3b, 0xea, 0x1c, 0x77, 0x81, 0x49, 0xac, 0xfc, 0x91, 0x74, 0x53, 0xd3, 0xee, 0xfa, 0x32, 0x25, 0x6b, 0x6a, 0x6b, 0x1d, 0xd8, 0x68, 0xe4, 0x9b, 0xe0, 0xff, 0x48, 0x2d, 0x32, 0x39, 0x4f, 0x3b, 0xdf, 0xed, 0x40, 0x81, 0x03, 0xd9, 0xb4, 0xc2, 0xa8, 0xf0, 0x9c, 0xbb, 0xe7, 0xf5, 0x85, 0x57, 0x50, 0x49, 0x1b, 0x21, 0x8d, 0x02, 0xec, 0xfe, 0x41, 0x3c, 0x6f, 0x1c, 0x36, 0xb4, 0x45, 0x26, 0xb8, 0x93, 0xbe, 0xba, 0x3c, 0x87, 0x9f, 0x1c, 0x46, 0x18, 0x23, 0x2c, 0x89, 0x3a, 0x3f, 0x95, 0x4f, 0x1e, 0x2a, 0x48, 0x1b, 0x4e, 0x1d, 0x29, 0x8d, 0xf9, 0x58, 0x07, 0x87, 0x8b, 0x65, 0xd2, 0x8e, 0x81, 0xa0, 0x08, 0x73, 0x7c, 0xf7, 0x71, 0x32, 0x94, 0xef, 0x0c, 0x1a, 0xee, 0xe7, 0x49, 0x2e, 0x91, 0xa1, 0x78, 0xcc, 0x75, 0xfe, 0x82, 0x8c, 0xdd, 0x09, 0xd7, 0x6b, 0xe7, 0x37, 0xa7, 0x29, 0x62, 0xee, 0x55, 0xef, 0xdf, 0x43, 0x29, 0x35, 0x0b, 0x08, 0x45, 0xe3, 0x3c, 0x06, 0xda, 0xb6, 0x49, 0x87, 0x9b, 0xe6, 0x9f, 0x18, 0x72, 0x06, 0x91, 0x8c, 0x72, 0x2b, 0xf0, 0x44, 0x0e, 0x50, 0xdc, 0xae, 0x88, 0xf9, 0xd9, 0x0c, 0xac, 0x17, 0x26, 0x77, 0xbd, 0x2c, 0x4a, 0x23, 0xb0, 0xaf, 0xef, 0xe4, 0x98, 0xb2, 0xf3, 0xf1, 0x62, 0xc2, 0xbd, 0xe9, 0xc2, 0x0f, 0xcd, 0x13, 0x6d, 0xcd, 0x97, 0xea, 0x89, 0xd9, 0x92, 0xd9, 0x61, 0xa0, 0x8c, 0x43, 0x5e, 0x3d, 0x40, 0xc6, 0x33, 0xe1, 0x2a, 0xc1, 0x57, 0x78, 0x9a, 0x13, 0xb8, 0x89, 0x08, 0x26, 0xae, 0x5e, 0xa7, 0x2d, 0x2d, 0x66, 0x3c, 0xa9, 0x40, 0xd7, 0x31, 0x32, 0xb2, 0x97, 0xe5, 0x74, 0x0e, 0x5d, 0x47, 0x78, 0xcb, 0x14, 0xa3, 0x25, 0xc0, 0x80, 0xbc, 0x06, 0xde, 0x23, 0x1a, 0x4d, 0x1d, 0x62, 0xa5, 0x18, 0xb7, 0xe4, 0x73, 0xf4, 0x95, 0x3b, 0xdf, 0x9f, 0x06, 0xc6, 0xdb, 0x13, 0xb7, 0xd5, 0x87, 0xbf, 0xe0, 0x0f, 0x02, 0x18, 0xbb, 0x11, 0x7f, 0x50, 0x3a, 0x58, 0x9c, 0x65, 0xf9, 0x61, 0xf0, 0x5e, 0x72, 0x0e, 0xe3, 0xd2, 0x70, 0x4c, 0xc3, 0xa9, 0xc6, 0xf3, 0x14, 0x26, 0x40, 0xee, 0x27, 0x26, 0xda, 0x9b, 0xee, 0xa2, 0x30, 0x74, 0x0e, 0x7b, 0x36, 0xf0, 0x36, 0x77, 0x29, 0xa4, 0xaf, 0x86, 0xc5, 0xae, 0x35, 0x4b, 0xb9, 0x53, 0x06, 0xd7, 0x58, 0xe7, 0x38, 0xb8, 0x91, 0xed, 0x4f, 0x32, 0x21, 0x80, 0x0f, 0xcc, 0x07, 0xf2, 0x8f, 0x0f, 0x38, 0xb2, 0x8f, 0x8a, 0x95, 0x73, 0x0b, 0x19, 0x1a, 0x8a, 0x11, 0x67, 0x58, 0x98, 0xcf, 0xb2, 0x25, 0x6a, 0xf0, 0xce, 0x92, 0x1d, 0x29, 0x6d, 0x1d, 0x86, 0x0e, 0x9d, 0x28, 0xd1, 0x2b, 0x92, 0xaa, 0x67, 0x50, 0xa6, 0x25, 0x16, 0x2c, 0x9e, 0xd8, 0x6c, 0x1d, 0x2f, 0x35, 0x63, 0x47, 0xc1, 0x95, 0x44, 0xe4, 0x72, 0x2b, 0xc5, 0xda, 0x5e, 0x36, 0x74, 0x93, 0x1e, 0x7b, 0x59, 0x09, 0x8e, 0xf3, 0xd7, 0x20, 0xd3, 0xc1, 0xd4, 0x39, 0x9d, 0x66, 0x1a, 0x04, 0xaa, 0x38, 0xfc, 0x95, 0x8c, 0x11, 0x3c, 0xbb, 0xab, 0x44, 0x2c, 0x8d, 0x8d, 0xd5, 0x14, 0x45, 0x55, 0xe9, 0xd4, 0x52, 0x8a, 0x7b, 0xca, 0xa8, 0x1a, 0x51, 0xf6, 0x5b, 0x9f, 0x2e, 0x5c, 0x6c, 0xe0, 0x4a, 0xaa, 0xe3, 0x9b, 0xff, 0x1b, 0x1d, 0x82, 0xc5, 0x9b, 0x68, 0x83, 0x60, 0x2c, 0xcd, 0x4c, 0x58, 0x88, 0x2d, 0x0f, 0xaa, 0x08, 0x90, 0x82, 0xbd, 0xc4, 0xb9, 0x2b, 0x97, 0xfc, 0xfe, 0xda, 0x51, 0xb7, 0x56, 0x77, 0xc8, 0xa9, 0xb4, 0xfd, 0x96, 0x5a, 0x93, 0xc7, 0x41, 0x85, 0xd2, 0x0b, 0xb1, 0xbe, 0xc3, 0xa4, 0xe8, 0x58, 0x7f, 0x14, 0xed, 0x86, 0x7c, 0xc9, 0x09, 0xc0, 0x61, 0x9f, 0x36, 0x69, 0x18, 0xa7, 0xd5, 0xae, 0x25, 0x27, 0x9f, 0xb1, 0x37, 0xe1, 0xde, 0xe7, 0xfd, 0x98, 0xdd, 0xbe, 0x3b, 0xd1, 0x9d, 0x84, 0x1d, 0xd7, 0xc9, 0x84, 0xcb, 0x01, 0xec, 0x72, 0x3d, 0x37, 0xe2, 0x09, 0x51, 0xb3, 0x8d, 0xf2, 0x1b, 0x05, 0xc9, 0xe8, 0x7c, 0x5a, 0xa1, 0x1a, 0xf6, 0xfd, 0xc3, 0xd0, 0xbe, 0x1e, 0x31, 0x52, 0x13, 0xd3, 0x3a, 0x06, 0xcf, 0x5c, 0xa9, 0xd8, 0x3c, 0xab, 0x3c, 0xde, 0x28, 0x24, 0x57, 0x3c, 0x3c, 0xa1, 0xfa, 0x46, 0x89, 0xb9, 0xf1, 0xe5, 0x64, 0x42, 0x4a, 0x3c, 0x74, 0x14, 0x0c, 0x8b, 0x09, 0x10, 0x26, 0x53, 0xaf, 0x61, 0xa6, 0xbb, 0x04, 0x02, 0x2b, 0x32, 0xc6, 0x80, 0x9d, 0x56, 0x30, 0x02, 0x1b, 0x14, 0x87, 0x86, 0x35, 0x11, 0xf0, 0x6d, 0x5c, 0x49, 0x84, 0x3a, 0x96, 0xf7, 0xa6, 0x97, 0x77, 0xb4, 0x94, 0x99, 0x4c, 0xe2, 0x3d, 0x44, 0x99, 0x4b, 0x53, 0x52, 0xc6, 0x06, 0xa0, 0x30, 0x15, 0x9b, 0x9d, 0x4a, 0xd7, 0x66, 0x41, 0x88, 0xe0, 0x41, 0x17, 0x18, 0x38, 0x5d, 0x93, 0x6f, 0x13, 0x71, 0xa6, 0x8a, 0x03, 0x17, 0x90, 0x7a, 0x6d, 0x72, 0xf6, 0x1f, 0x3a, 0x15, 0x34, 0x34, 0xce, 0x20, 0xf4, 0x8b, 0x3e, 0xac, 0x00, 0x9a, 0xbd, 0x6a, 0x54, 0x37, 0x58, 0x86, 0x78, 0xa0, 0xe4, 0xd2, 0x0c, 0xbe, 0x34, 0x20, 0xa4, 0xab, 0x8f, 0xef, 0xd7, 0x71, 0x60, 0x4b, 0x93, 0x15, 0x30, 0xee, 0xb3, 0xd4, 0xd2, 0xab, 0xd4, 0xac, 0xdd, 0x0d, 0x64, 0x1e, 0x60, 0x3b, 0xfb, 0x33, 0xd0, 0x1e, 0xef, 0xbd, 0x45, 0xc6, 0x23, 0xdf, 0xe6, 0x0a, 0x1f, 0xcf, 0xa2, 0x6f, 0x66, 0xdb, 0x22, 0x4c, 0x03, 0xaa, 0xfb, 0x2b, 0x66, 0xc5, 0x27, 0x71, 0x6e, 0x55, 0xb6, 0x42, 0xc7, 0x2f, 0xc1, 0x9f, 0x76, 0x0d, 0xa0, 0xd1, 0xb2, 0x1e, 0x5c, 0x0b, 0xf6, 0xc2, 0x67, 0x4b, 0x54, 0x8e, 0x8b, 0x81, 0x0c, 0x97, 0x21, 0xf3, 0x5d, 0xed, 0x83, 0xe0, 0x9b, 0x65, 0xc4, 0x63, 0x82, 0x9c, 0x9e, 0x9b, 0xca, 0x38, 0xab, 0x09, 0xfb, 0x71, 0xd8, 0x39, 0x83, 0xd1, 0x18, 0xa5, 0x06, 0x37, 0x55, 0xd6, 0xf5, 0x22, 0xac, 0xcc, 0x62, 0x2c, 0xd9, 0xa0, 0x13, 0xd5, 0xf0, 0x68, 0xd5, 0x82, 0x4f, 0x5b, 0x12, 0xc6, 0xd0, 0x36, 0xa6, 0xdf, 0x43, 0xde, 0xef, 0x84, 0x1b, 0x46, 0x23, 0xde, 0x67, 0x93, 0xe7, 0xd4, 0x04, 0x7e, 0x1d, 0x8b, 0x11, 0xfa, 0xfd, 0x2d, 0xa4, 0x17, 0x67, 0xea, 0xbb, 0x27, 0x77, 0x3d, 0x76, 0x1f, 0x5b, 0x71, 0x83, 0x40, 0x61, 0x63, 0xd9, 0xf6, 0x54, 0x89, 0xa9, 0x00, 0x09, 0x33, 0x91, 0xd1, 0x35, 0x11, 0x14, 0x36, 0x81, 0xf6, 0x47, 0x3a, 0xe1, 0xdb, 0xcc, 0x47, 0x21, 0x27, 0x04, 0x8d, 0xc1, 0x2e, 0x81, 0xa7, 0x02, 0xf7, 0xba, 0x7c, 0x41, 0x42, 0x03, 0x64, 0x84, 0xc9, 0xbc, 0x8d, 0x53, 0xc7, 0xc8, 0x9c, 0xc9, 0xb7, 0x41, 0x97, 0xea, 0x5e, 0x69, 0x02, 0x37, 0x0b, 0xe4, 0x48, 0x80, 0x1e, 0x25, 0x5d, 0xfa, 0xc7, 0x27, 0xa2, 0x91, 0x10, 0x5d, 0x09, 0x7f, 0x1e, 0xeb, 0x79, 0x1e, 0xb3, 0x16, 0x74, 0xfa, 0xf8, 0xf9, 0xf7, 0x2b, 0x7a, 0x7a, 0xa1, 0xe2, 0x72, 0x7d, 0x18, 0x41, 0x49, 0x58, 0xa9, 0x70, 0x5b, 0x86, 0x2e, 0xed, 0xfc, 0x9f, 0x35, 0x23, 0xb8, 0x87, 0x5e, 0x3f, 0xdf, 0xe6, 0x05, 0x3f, 0x42, 0xd9, 0x21, 0x4b, 0x37, 0xe8, 0x6c, 0x49, 0xe3, 0x37, 0xc5, 0xac, 0xb8, 0x00, 0xd2, 0x8c, 0x3c, 0x40, 0xe9, 0xfc, 0x0c, 0xb1, 0x31, 0x98, 0x21, 0xf9, 0x04, 0x5d, 0x53, 0x21, 0x98, 0xbe, 0x1b, 0x48, 0xdf, 0xf3, 0x9d, 0x99, 0xab, 0x95, 0xe6, 0x7a, 0x16, 0x68, 0x72, 0x06, 0x21, 0x78, 0xf1, 0xbe, 0x9b, 0x67, 0x4a, 0x7b, 0x45, 0x05, 0xe1, 0xa8, 0x33, 0x21, 0x16, 0xad, 0x75, 0x9f, 0x0e, 0xae, 0xf7, 0xcb, 0xb5, 0x76, 0xa6, 0xed, 0x03, 0xae, 0xd4, 0x1e, 0x7f, 0x53, 0xde, 0x59, 0x02, 0x67, 0x0c, 0xd5, 0xbe, 0xe6, 0xb8, 0x92, 0x7e, 0xfb, 0xb3, 0x32, 0x2f, 0x74, 0xe4, 0x0b, 0xa0, 0x74, 0x32, 0x7a, 0x86, 0x67, 0xa5, 0x7a, 0xc3, 0x3b, 0xc7, 0x75, 0xe8, 0xce, 0x51, 0x5a, 0xf8, 0xa2, 0x03, 0xef, 0x6f, 0xd8, 0xd4, 0x69, 0x82, 0x5c, 0x4b, 0x3a, 0xa9, 0x5d, 0x2d, 0x2a, 0x5b, 0x00, 0x58, 0xa9, 0x18, 0x55, 0xef, 0x63, 0xad, 0x8a, 0xb7, 0x16, 0xb4, 0x5e, 0xc1, 0xa0, 0x5a, 0xd9, 0x4a, 0x5d, 0x65, 0x3a, 0xdf, 0xaf, 0x75, 0x32, 0xc5, 0xde, 0x89, 0x4f, 0x97, 0x23, 0xc6, 0xbb, 0x31, 0xff, 0x74, 0x26, 0xcd, 0xd1, 0x4a, 0x01, 0x6c, 0xa8, 0xeb, 0xed, 0x78, 0x56, 0xb0, 0x73, 0xa7, 0xc6, 0xa8, 0xf5, 0x22, 0x8f, 0xdd, 0xe4, 0xe7, 0xc8, 0xd9, 0x34, 0x6b, 0x1f, 0x69, 0x0d, 0x84, 0x25, 0xa1, 0xc4, 0x87, 0xec, 0x20, 0x09, 0xad, 0xd4, 0x96, 0x62, 0xbc, 0xa2, 0x83, 0xd8, 0xe3, 0xd2, 0x41, 0xef, 0xe5, 0x2f, 0x44, 0xdc, 0x7a, 0xa0, 0xa1, 0xf3, 0xf2, 0x45, 0xcd, 0x5f, 0x1b, 0xc2, 0xa7, 0x15, 0x65, 0xdb, 0xb9, 0x0b, 0x44, 0x42, 0xbb, 0xa4, 0xd6, 0xac, 0x59, 0x6f, 0xc6, 0x2a, 0x37, 0x12, 0x70, 0xb7, 0x31, 0x81, 0x45, 0x0d, 0xe7, 0x74, 0x71, 0xbe, 0x79, 0x17, 0xbc, 0x7f, 0x8f, 0x03, 0xae, 0xc7, 0x9d, 0x6d, 0xf7, 0x99, 0x65, 0x9d, 0x0e, 0x9d, 0xbd, 0xa2, 0x17, 0x76, 0x92, 0x45, 0x0a, 0x50, 0x2d, 0x3b, 0x12, 0xb8, 0xb5, 0x9f, 0x33, 0xb1, 0xf5, 0x9f, 0x30, 0x04, 0x60, 0x75, 0xac, 0xd7, 0x52, 0x99, 0x8f, 0x81, 0x99, 0x34, 0xab, 0x9d, 0x34, 0xd8, 0xa0, 0x5d, 0x5a, 0x6f, 0xfc, 0x22, 0xbf, 0x72, 0xa7, 0x49, 0x12, 0x5c, 0x7f, 0x47, 0xca, 0x5d, 0x3f, 0xf8, 0x22, 0x52, 0xa5, 0x34, 0x62, 0xf5, 0xd4, 0xa4, 0x61, 0x51, 0xf7, 0xd3, 0x48, 0x7a, 0x27, 0x88, 0x98, 0x7a, 0x8f, 0x54, 0x6f, 0x8e, 0xcd, 0x67, 0x07, 0x93, 0x9c, 0xa7, 0x7f, 0xbb, 0xb0, 0x04, 0xde, 0x84, 0xe2, 0x05, 0x55, 0xeb, 0x8d, 0xa7, 0xc4, 0xdc, 0x38, 0x68, 0x80, 0xee, 0x75, 0x9f, 0x54, 0x4d, 0x08, 0x0e, 0xc5, 0xf7, 0x4c, 0xba, 0x9a, 0x2c, 0xd3, 0xfb, 0x9c, 0x1f, 0x4d, 0xcf, 0x9b, 0xf2, 0xab, 0x73, 0xb1, 0xe1, 0x84, 0x35, 0xcb, 0xbe, 0xb7, 0x84, 0x64, 0x9d, 0x52, 0x49, 0x94, 0xd0, 0xb2, 0x7a, 0x4a, 0x16, 0xec, 0xeb, 0xd5, 0x0f, 0x6c, 0x68, 0xaa, 0xf3, 0xdc, 0x02, 0x61, 0x84, 0x48, 0xa6, 0x00, 0x41, 0x7f, 0xf4, 0x7c, 0xdd, 0xbc, 0x4d, 0x7d, 0xef, 0x85, 0x2e, 0x62, 0xeb, 0xd4, 0xbd, 0x85, 0x51, 0x75, 0xa2, 0xc0, 0x24, 0xaf, 0x18, 0x30, 0x9e, 0x26, 0x44, 0x38, 0x22, 0x00, 0xc5, 0xc9, 0x72, 0x47, 0x8c, 0xe1, 0x22, 0x8e, 0xee, 0x52, 0x4d, 0xd8, 0xf7, 0xc5, 0x86, 0xb5, 0x02, 0xfe, 0x11, 0xae, 0x86, 0x62, 0x54, 0xe3, 0x33, 0xb6, 0x88, 0xf3, 0x3e, 0x29, 0xb4, 0x1c, 0xf9, 0x95, 0xdc, 0xa4, 0xa6, 0x02, 0x75, 0x77, 0x8d, 0x6c, 0x1d, 0x11, 0x4c, 0xc6, 0x89, 0x9e, 0x6f, 0x3e, 0xbf, 0x60, 0x40, 0xc3, 0x85, 0x52, 0xe0, 0xc4, 0x19, 0x0b, 0x97, 0x3b, 0x22, 0xe4, 0x69, 0xeb, 0xe7, 0x5d, 0xea, 0xe5, 0xbf, 0xbd, 0x53, 0x51, 0xc8, 0xf9, 0xd4, 0x6b, 0xdc, 0xd7, 0x2c, 0xcc, 0xc1, 0x53, 0x78, 0xeb, 0xa0, 0x42, 0x48, 0xe3, 0xb9, 0x35, 0xf8, 0x77, 0x54, 0xa0, 0x3e, 0x53, 0xfb, 0x3c, 0xff, 0x94, 0xe6, 0xa9, 0x67, 0x8b, 0xb7, 0x58, 0x38, 0xbe, 0x68, 0xa8, 0x62, 0x30, 0x81, 0x4f, 0xd5, 0xe3, 0x8e, 0xfc, 0x93, 0x9a, 0xd0, 0x3b, 0x09, 0xe3, 0x33, 0x98, 0x9f, 0x55, 0x80, 0x07, 0x8e, 0x17, 0xd4, 0x83, 0xf1, 0xa2, 0x51, 0xf6, 0x20, 0xc7, 0x13, 0x59, 0x39, 0xf3, 0x65, 0x1c, 0xff, 0xb2, 0x35, 0xc8, 0xe8, 0x72, 0xc6, 0xe3, 0x71, 0x8a, 0xa5, 0x14, 0xb5, 0x7a, 0xde, 0x87, 0x3e, 0x74, 0x6f, 0x93, 0x1b, 0x1c, 0xfd, 0x9a, 0x32, 0x8d, 0xc6, 0x31, 0xd8, 0x9c, 0xd7, 0x81, 0x9f, 0x60, 0x7f, 0xed, 0x6f, 0xf2, 0x03, 0xf6, 0xd9, 0x71, 0x93, 0x5b, 0xa7, 0x49, 0x7d, 0x84, 0xb8, 0xb5, 0xa1, 0x20, 0x0b, 0x83, 0x25, 0x0e, 0x19, 0x18, 0x6a, 0x79, 0x68, 0xb3, 0x3e, 0x48, 0x5d, 0xf6, 0x53, 0xb5, 0x52, 0xa2, 0xef, 0x3b, 0xe8, 0xa2, 0xe6, 0xb6, 0x9e, 0x4b, 0xc6, 0xc6, 0xa3, 0xe2, 0x51, 0x74, 0xe9, 0x5e, 0x30, 0x18, 0x7b, 0x70, 0xe5, 0x7a, 0x10, 0xc1, 0x02, 0x37, 0xe0, 0x7b, 0x98, 0x66, 0xb6, 0x0a, 0xf3, 0x7c, 0x47, 0x24, 0x84, 0x6d, 0xc2, 0x06, 0x1f, 0x14, 0xa8, 0x01, 0x67, 0xd5, 0xde, 0x36, 0x86, 0x81, 0x01, 0x9e, 0x21, 0x79, 0xf9, 0x4d, 0x8a, 0x17, 0xd1, 0xf7, 0x38, 0x49, 0xc5, 0xb3, 0x75, 0x7f, 0x9d, 0xff, 0x57, 0xc8, 0x3a, 0x04, 0xf1, 0x37, 0x6f, 0x1c, 0xca, 0x8c, 0x12, 0x92, 0x8f, 0x10, 0x52, 0xa9, 0x04, 0xc1, 0x4a, 0xdf, 0x40, 0xaf, 0xd7, 0x72, 0x1a, 0xa6, 0xa7, 0x24, 0xdf, 0x0d, 0x93, 0x3b, 0x46, 0x0e, 0x2f, 0xcd, 0xa5, 0xf8, 0x9f, 0x3a, 0x64, 0xe1, 0xac, 0xfa, 0xb2, 0x8f, 0x17, 0x99, 0x78, 0x99 ],
+const [ 0x1d, 0x91, 0xb8, 0x6a, 0xcc, 0x6e, 0xa1, 0x70, 0xbf, 0xcf, 0x18, 0x7f, 0x77, 0x3b, 0x57, 0x7b, 0x95, 0xe2, 0x9d, 0x36, 0xfb, 0x30, 0x77, 0x9d, 0x2e, 0xa2, 0x3e, 0x2f, 0xfe, 0xd9, 0xe1, 0xb4, 0x6a, 0xed, 0xe4, 0x2b, 0xbe, 0x03, 0xa9, 0x04, 0xfe, 0x22, 0xef, 0x8f, 0x87, 0x42, 0x98, 0xb5, 0xf4, 0xa6, 0xaf, 0xe6, 0x3f, 0x6c, 0xa9, 0x52, 0x28, 0x63, 0xeb, 0x5c, 0xdb, 0x1c, 0x8d, 0x4b, 0xcd, 0x44, 0x5e, 0x43, 0xe7, 0x30, 0x28, 0x75, 0xe6, 0xba, 0x35, 0x92, 0x02, 0x4c, 0x11, 0x85, 0xcd, 0x3a, 0x92, 0x61, 0x5f, 0x55, 0x16, 0x98, 0xb0, 0xbd, 0x0c, 0x6f, 0x45, 0xf6, 0xb6, 0xae, 0x0f, 0x3e, 0x2c, 0x9c, 0x90, 0x1e, 0xa5, 0x2a, 0x3f, 0x40, 0xf2, 0x6f, 0x2e, 0x80, 0x4b, 0x54, 0xea, 0x45, 0x4e, 0x91, 0xa2, 0x12, 0x45, 0xd8, 0x8c, 0x58, 0xa8, 0x4f, 0x85, 0x8f, 0xe3, 0x44, 0xf8, 0x84, 0x58, 0x1d, 0x00, 0xf5, 0xa8, 0x8d, 0xd1, 0x5b, 0x2e, 0x0e, 0x54, 0x07, 0xcd, 0x8b, 0x11, 0x70, 0xec, 0x5c, 0x52, 0xcc, 0xbe, 0x78, 0x85, 0xdd, 0xc7, 0xe6, 0xe3, 0x0e, 0x9c, 0x75, 0x4f, 0xbe, 0xea, 0xad, 0x81, 0xdc, 0xb9, 0x05, 0x63, 0xb4, 0xf2, 0x57, 0xbb, 0x08, 0x1f, 0x90, 0x0b, 0x63, 0x73, 0xac, 0xb5, 0xaa, 0x0a, 0xe2, 0x63, 0xf4, 0x71, 0x1b, 0xa6, 0x9b, 0x69, 0xa9, 0xde, 0x94, 0xe8, 0x36, 0x59, 0xfb, 0x61, 0xfa, 0xbf, 0xf2, 0x45, 0x32, 0xad, 0xac, 0xca, 0xcd, 0xa0, 0xc5, 0xeb, 0x68, 0x15, 0xd5, 0xb0, 0x7c, 0xee, 0x44, 0xaf, 0xd6, 0x18, 0x60, 0xd3, 0x48, 0x6b, 0xac, 0x5c, 0x9f, 0xd1, 0x7b, 0x27, 0xd4, 0xab, 0xbe, 0x30, 0x87, 0x70, 0x1b, 0x55, 0xa8, 0x97, 0x3f, 0x5d, 0x78, 0xb8, 0x74, 0x38, 0xb0, 0xee, 0x76, 0x88, 0xff, 0x7f, 0x82, 0x61, 0xba, 0xbf, 0xb1, 0x4d, 0xd0, 0x31, 0x84, 0x94, 0xfc, 0xf0, 0xc0, 0xba, 0x3e, 0x4d, 0x7c, 0x48, 0x8b, 0xba, 0x78, 0xd0, 0xc4, 0xe7, 0xb0, 0x2b, 0xe5, 0x2a, 0x31, 0x05, 0x7f, 0x24, 0x2c, 0x9c, 0x68, 0xa2, 0x49, 0xc4, 0xb0, 0xc1, 0x3d, 0x2f, 0xd8, 0x56, 0x9f, 0xeb, 0x3f, 0x8c, 0xf7, 0x2c, 0xdd, 0xcf, 0x19, 0x4c, 0x33, 0xe9, 0xb1, 0x10, 0x82, 0x6b, 0x1e, 0x2d, 0x3c, 0x4f, 0x84, 0x0a, 0xb8, 0xdb, 0x1c, 0xc8, 0x29, 0xc9, 0xcf, 0x80, 0xd1, 0xa4, 0x04, 0xcb, 0x72, 0x75, 0xb6, 0x88, 0x06, 0x9f, 0xc9, 0xd9, 0xaf, 0x08, 0x9e, 0x6f, 0xf1, 0x79, 0xe5, 0x08, 0x1f, 0x48, 0xb2, 0x35, 0x13, 0x34, 0xd3, 0x61, 0x22, 0x90, 0x62, 0x0f, 0x50, 0xa4, 0x96, 0x63, 0xbf, 0x50, 0xde, 0xe4, 0x6e, 0xf2, 0x31, 0x80, 0x20, 0x8a, 0x9f, 0xd1, 0x99, 0x1c, 0x2d, 0x9e, 0x10, 0x56, 0xdf, 0xa5, 0xe2, 0x73, 0x16, 0x97, 0x84, 0x5f, 0x1c, 0x65, 0xbb, 0x1c, 0xfe, 0xba, 0x0f, 0x64, 0x9a, 0xc8, 0x7d, 0x90, 0xf8, 0x48, 0x6c, 0xb8, 0xde, 0xbc, 0xe2, 0x1c, 0x9e, 0xf8, 0xf8, 0xc2, 0x33, 0xe0, 0x8b, 0x61, 0x8c, 0x73, 0x35, 0x7e, 0x28, 0x09, 0x7b, 0xd5, 0xe3, 0xd8, 0x48, 0xfa, 0x10, 0xbd, 0x9b, 0x40, 0xc7, 0x3a, 0x7c, 0xda, 0x80, 0xbb, 0x34, 0x40, 0xe1, 0x1d, 0xbd, 0xd5, 0xd5, 0x70, 0x78, 0xc6, 0xde, 0xfc, 0x1e, 0x35, 0xac, 0x83, 0xf9, 0x97, 0xee, 0xc6, 0x54, 0x5a, 0x68, 0x4a, 0x30, 0xcb, 0x46, 0x5c, 0x38, 0x38, 0xb0, 0x53, 0xf7, 0x51, 0x9e, 0x15, 0x49, 0xd4, 0xee, 0xdd, 0x0f, 0x6a, 0xb4, 0x3b, 0x27, 0xcc, 0xd1, 0x5c, 0x9c, 0x29, 0xc7, 0x8b, 0x19, 0xcc, 0xcb, 0xf8, 0xa4, 0xfa, 0x1c, 0xb8, 0x88, 0x19, 0x94, 0x0e, 0x93, 0x18, 0x7c, 0xe9, 0x82, 0x0a, 0xa5, 0xad, 0xba, 0x14, 0xb4, 0x36, 0x39, 0x8a, 0xbe, 0x1b, 0xcb, 0x55, 0x15, 0x2f, 0x81, 0x98, 0x61, 0x4e, 0x5f, 0x93, 0xf2, 0x56, 0x55, 0xc7, 0x54, 0x73, 0x71, 0x5a, 0x24, 0xa0, 0x52, 0xbe, 0x23, 0x6a, 0xe0, 0x8e, 0x89, 0xf7, 0x3a, 0xb8, 0x9c, 0x48, 0xf0, 0xe1, 0x80, 0xbb, 0x73, 0x05, 0x51, 0xd4, 0xc9, 0x5e, 0x6f, 0x3c, 0x85, 0x88, 0x19, 0x0a, 0xf7, 0xe2, 0x3e, 0x42, 0xa0, 0x37, 0x8f, 0x9b, 0xe8, 0x9e, 0xd9, 0x86, 0x14, 0x9e, 0x92, 0x6b, 0x72, 0x96, 0xb2, 0x36, 0xd6, 0x5c, 0xc4, 0x12, 0x4a, 0x25, 0x3c, 0x74, 0x02, 0xa5, 0x0b, 0x5c, 0x8e, 0x77, 0x71, 0xd8, 0x53, 0xbe, 0x12, 0xc9, 0x3c, 0x0d, 0x4d, 0xe9, 0xad, 0x84, 0xc9, 0x0d, 0xb9, 0x3c, 0x50, 0xa8, 0x94, 0xe6, 0xe1, 0x91, 0x4b, 0xae, 0x00, 0x06, 0xb2, 0x66, 0x51, 0xf0, 0x9e, 0xe0, 0x65, 0x68, 0x55, 0x9b, 0xd4, 0x7b, 0x43, 0xa2, 0x8c, 0x2a, 0xef, 0xb2, 0x68, 0xb5, 0x2d, 0x9b, 0x05, 0x1a, 0x94, 0xe8, 0xd1, 0xd8, 0x32, 0xc2, 0x64, 0xf8, 0x7f, 0x12, 0x14, 0x4e, 0x90, 0xe6, 0xc3, 0xfd, 0x8d, 0x16, 0xfc, 0x39, 0x65, 0x27, 0x3f, 0x51, 0xc0, 0x6f, 0x98, 0xec, 0x36, 0x7a, 0x76, 0x92, 0xbe, 0xad, 0xbb, 0x6f, 0x69, 0x29, 0x10, 0x54, 0x50, 0xf3, 0x7b, 0xff, 0xca, 0x51, 0x33, 0x9c, 0xe3, 0x77, 0xb3, 0x8c, 0x0a, 0x62, 0x0d, 0x64, 0x0a, 0x05, 0x81, 0x39, 0x3c, 0xa3, 0x4e, 0x1b, 0xfa, 0x7c, 0xc8, 0xdf, 0x56, 0xab, 0xab, 0x22, 0x0c, 0x4f, 0xaf, 0x8a, 0xb6, 0xe9, 0x5c, 0x4f, 0x3f, 0x05, 0x20, 0xfa, 0x9a, 0x1d, 0x9f, 0x6d, 0xb4, 0xba, 0x4a, 0x24, 0xa7, 0xdc, 0x33, 0xba, 0x30, 0x9c, 0x1f, 0xaf, 0x63, 0x10, 0xdd, 0x68, 0x9d, 0x6f, 0xd7, 0x77, 0xbb, 0x75, 0xe7, 0x1d, 0x89, 0x09, 0x6c, 0x0d, 0x7d, 0x1e, 0x9c, 0x73, 0xa6, 0xd7, 0x1c, 0x35, 0xdf, 0xee, 0xce, 0x79, 0x48, 0x56, 0xea, 0x67, 0xf7, 0x1f, 0x50, 0x30, 0xea, 0x9b, 0x1c, 0x4f, 0x40, 0xbf, 0x7b, 0x0f, 0xa9, 0xcb, 0xbe, 0x4d, 0x1c, 0x2e, 0xad, 0x7f, 0xc8, 0xa3, 0x1e, 0xf5, 0x4c, 0xa1, 0xc6, 0x5f, 0x2a, 0xf2, 0x4e, 0x90, 0x79, 0xa1, 0xa9, 0x81, 0xdb, 0x1a, 0xa6, 0x99, 0xaf, 0x8d, 0xc1, 0x2b, 0x88, 0x93, 0x3f, 0x41, 0xdd, 0x14, 0x7a, 0x98, 0x02, 0x68, 0x79, 0xeb, 0x56, 0xbc, 0xc3, 0x74, 0xbf, 0xb8, 0x75, 0xb1, 0x53, 0x5f, 0x93, 0x64, 0x58, 0x36, 0x9c, 0xdd, 0x6f, 0xa8, 0x61, 0x7b, 0x0c, 0xa9, 0x16, 0x71, 0x29, 0x9a, 0xaa, 0xc6, 0x3c, 0x6c, 0x54, 0xa0, 0x66, 0x09, 0x6f, 0xc1, 0xed, 0xef, 0x87, 0x52, 0xec, 0x1e, 0xb4, 0xdf, 0x49, 0x35, 0x26, 0xa4, 0xe8, 0xd8, 0x02, 0x07, 0x1e, 0x54, 0x6d, 0x65, 0x69, 0x86, 0xe5, 0x11, 0x5e, 0xf9, 0xd8, 0x9a, 0xe2, 0x4e, 0x6f, 0x4d, 0x9d, 0xe1, 0xab, 0xfb, 0xac, 0xa9, 0xb4, 0xfd, 0x96, 0x60, 0x6e, 0x74, 0x82, 0xe4, 0x4c, 0xd5, 0xa7, 0xde, 0x69, 0xa6, 0x03, 0xa1, 0xd5, 0x82, 0x50, 0x55, 0x2c, 0x63, 0x34, 0x54, 0x6e, 0x21, 0xb8, 0xd4, 0x0a, 0x35, 0xfb, 0xc7, 0x3c, 0xc3, 0x28, 0xff, 0x99, 0xd8, 0xa5, 0x96, 0xe9, 0xf0, 0x8d, 0x8d, 0x34, 0xbb, 0x61, 0xb3, 0x20, 0x20, 0xfa, 0xc8, 0x7a, 0x83, 0xc2, 0xe3, 0x12, 0x43, 0x24, 0x11, 0xcc, 0x87, 0x41, 0x3f, 0xf4, 0x3b, 0xe5, 0x5a, 0xd2, 0x55, 0xb9, 0xb4, 0x7e, 0x5d, 0xba, 0xaa, 0xf6, 0x2c, 0xe9, 0x84, 0x6e, 0xf4, 0x44, 0x9c, 0xe7, 0x80, 0xf6, 0xc3, 0x03, 0xbd, 0xcb, 0xe0, 0x18, 0x7a, 0xe6, 0xda, 0x83, 0x6c, 0xb6, 0xb8, 0x3f, 0x75, 0x26, 0x07, 0xb6, 0x25, 0x14, 0x7c, 0xd6, 0x82, 0x05, 0xdb, 0x68, 0x04, 0x17, 0x17, 0x9d, 0xe4, 0x37, 0xbb, 0xea, 0x97, 0x93, 0x88, 0x16, 0x95, 0x52, 0x60, 0x92, 0x5e, 0x83, 0x63, 0x08, 0xbf, 0x54, 0x57, 0x36, 0x51, 0x85, 0x4d, 0xfd, 0x44, 0x1c, 0x81, 0xb5, 0x5a, 0x59, 0x83, 0xc4, 0x36, 0xec, 0x94, 0x6f, 0xd7, 0x66, 0x53, 0xf0, 0x60, 0xee, 0x99, 0xc8, 0x1a, 0x35, 0xa1, 0x56, 0xbb, 0xac, 0x6c, 0xa9, 0xe9, 0xf4, 0x63, 0x93, 0xfa, 0x95, 0x3f, 0xfe, 0xfe, 0xf4, 0x26, 0x83, 0xff, 0x7f, 0x16, 0x39, 0x87, 0x2b, 0x87, 0xcb, 0x63, 0x20, 0x4c, 0xce, 0xa7, 0xb2, 0xbb, 0x51, 0xf2, 0x94, 0x0d, 0xb5, 0xf3, 0x48, 0x08, 0xbf, 0x2c, 0xda, 0xdb, 0xeb, 0xf6, 0xce, 0x49, 0x03, 0xc6, 0x57, 0x09, 0xf1, 0xae, 0xca, 0x6d, 0xd2, 0x27, 0x51, 0x43, 0x4b, 0x0d, 0xe4, 0xf9, 0x20, 0xeb, 0x75, 0x04, 0x02, 0x79, 0x6b, 0x81, 0xa9, 0x63, 0x52, 0x1d, 0x23, 0x4c, 0xd1, 0x33, 0x6c, 0x13, 0xdc, 0x35, 0x3e, 0x55, 0x2a, 0x4d, 0x2a, 0x33, 0xea, 0x44, 0xe8, 0x55, 0xb2, 0xa2, 0xec, 0x2e, 0xb8, 0x17, 0x39, 0x82, 0x44, 0x19, 0x7a, 0x26, 0x65, 0xcf, 0x4f, 0x08, 0xe4, 0x2e, 0xe5, 0x6f, 0x76, 0x62, 0xc9, 0x83, 0x35, 0x6f, 0xfe, 0x0f, 0x51, 0x18, 0x4d, 0x86, 0x03, 0x00, 0xdc, 0x44, 0xc3, 0x0f, 0x02, 0x17, 0xbb, 0x17, 0x5a, 0xfe, 0x7b, 0xb7, 0x16, 0x30, 0xee, 0x80, 0x96, 0x60, 0x8d, 0x57, 0x3a, 0x40, 0xd2, 0x1a, 0x74, 0x44, 0xf0, 0x87, 0x21, 0xa8, 0xc1, 0x59, 0x19, 0xb4, 0x00, 0xb3, 0x04, 0x3f, 0xb8, 0xc2, 0x70, 0x72, 0xfc, 0x9f, 0x21, 0xce, 0xd9, 0x72, 0xa8, 0x70, 0x89, 0xdd, 0x38, 0x94, 0xe9, 0x98, 0xb4, 0x59, 0x2e, 0x58, 0x0c, 0xc4, 0xd3, 0xf6, 0xca, 0x06, 0xd5, 0xcd, 0xe8, 0x02, 0x23, 0x64, 0xe5, 0x0a, 0x50, 0x4d, 0x18, 0xe9, 0x8c, 0x4c, 0x43, 0x27, 0xd2, 0xbc, 0x6b, 0x88, 0x63, 0x2f, 0xe7, 0xd6, 0x72, 0x55, 0xb8, 0xe0, 0x21, 0x1f, 0x18, 0xc3, 0xac, 0x23, 0x55, 0x68, 0xe4, 0x43, 0xe0, 0x4e, 0xe0, 0x89, 0xa1, 0x8a, 0xef, 0x56, 0x8e, 0x0c, 0xd0, 0xbc, 0x7c, 0x23, 0x26, 0x28, 0x35, 0x44, 0x26, 0x44, 0xca, 0x07, 0x93, 0x1b, 0x2b, 0x72, 0xec, 0x7f, 0xf4, 0x7a, 0xe4, 0xa7, 0x8a, 0xc7, 0x12, 0x1d, 0x67, 0xb8, 0xea, 0xd8, 0xb2, 0xa7, 0xec, 0xa4, 0x13, 0x6e, 0x1b, 0xcb, 0xc5, 0x29, 0xb1, 0xee, 0xed, 0x3e, 0x11, 0x34, 0x2a, 0x9b, 0xfd, 0xa7, 0x6d, 0x3f, 0x09, 0xda, 0x0b, 0xfc, 0x4f, 0xcf, 0x10, 0x7b, 0x65, 0x19, 0xd7, 0x80, 0x8c, 0x3e, 0xd7, 0x6f, 0x2a, 0x5f, 0xc0, 0x10, 0x7b, 0x1b, 0xc7, 0x8f, 0x83, 0xb0, 0x3d, 0xc7, 0x47, 0x63, 0x67, 0xbf, 0x3c, 0x23, 0x8a, 0x75, 0x00, 0x69, 0x45, 0xdb, 0x48, 0x62, 0x23, 0x20, 0x1a, 0x50, 0x71, 0x30, 0x3c, 0x2e, 0x4d, 0x7e, 0xec, 0x92, 0x00, 0x01, 0xd1, 0xd8, 0x8e, 0x7c, 0x32, 0x7d, 0x8b, 0x03, 0x66, 0xc9, 0x2f, 0xbb, 0x8b, 0xb1, 0xad, 0xe1, 0x7b, 0xfb, 0xc1, 0x0e, 0xfc, 0xa3, 0x88, 0xb9, 0x37, 0x7e, 0x95, 0xfd, 0x6c, 0x1d, 0x41, 0x9c, 0xe3, 0xf4, 0x42, 0x45, 0x26, 0xbb, 0x80, 0x12, 0x6d, 0x15, 0x24, 0x55, 0x5a, 0x70, 0xf1, 0x94, 0xe6, 0x2c, 0xd7, 0xd2, 0x9c, 0xff, 0xc5, 0x10, 0x05, 0x98, 0xc0, 0x14, 0x63, 0x82, 0x32, 0x69, 0xa1, 0x4c, 0x84, 0xa7, 0x8b, 0xe7, 0xee, 0xf5, 0x3b, 0x4f, 0x8e, 0xcb, 0xd3, 0x6d, 0xb8, 0xfd, 0x72, 0x3d, 0x8e, 0xf5, 0x60, 0x2c, 0xd0, 0x3f, 0x8c, 0xc4, 0xf5, 0x4c, 0x39, 0x8a, 0x7a, 0x6f, 0xf4, 0x27, 0x7a, 0x2c, 0xc9, 0xc7, 0x7f, 0xb2, 0xb6, 0xbf, 0x98, 0xa6, 0x60, 0x72, 0xab, 0x22, 0x05, 0x75, 0x0d, 0xfe, 0xb2, 0xf1, 0x50, 0x4e, 0xb6, 0x49, 0x5c, 0x2b, 0x56, 0xfd, 0xc1, 0xb7, 0xc2, 0xcf, 0x4c, 0x5b, 0x48, 0x24, 0xd9, 0x53, 0xc8, 0xac, 0x67, 0x6d, 0x68, 0x45, 0x72, 0x0d, 0x88, 0x1d, 0x7d, 0x75, 0xf9, 0x17, 0xee, 0x43, 0x69, 0x71, 0x1e, 0x3b, 0x22, 0xa3, 0xb1, 0x47, 0xf5, 0x8a, 0x23, 0xbc, 0x70, 0xc5, 0xa4, 0xdf, 0x58, 0x60, 0x26, 0xa8, 0x53, 0xaf, 0xb4, 0xc6, 0xe4, 0x7d, 0x05, 0xe2, 0x9c, 0x67, 0x51, 0x28, 0x8f, 0x82, 0x63, 0x04, 0x06, 0x44, 0xf0, 0x29, 0x73, 0xa1, 0x27, 0xd8, 0xaa, 0x74, 0x89, 0x5f, 0x4d, 0x21, 0xfb, 0xe0, 0x88, 0x78, 0x19, 0x53, 0xff, 0xdd, 0xce, 0xce, 0x05, 0xa6, 0x21, 0x04, 0x0f, 0xc5, 0x52, 0x0d, 0x68, 0xa7, 0x26, 0x65, 0x26, 0x5c, 0x7f, 0x36, 0x5c, 0xf7, 0x2f, 0xda, 0x91, 0x38, 0x0e, 0x9b, 0x71, 0x68, 0x4b, 0xbe, 0xc3, 0x85, 0xff, 0xc1, 0x9b, 0x9f, 0x08, 0xe0, 0xd1, 0x82, 0x14, 0xde, 0xb1, 0x95, 0xfc, 0x01, 0xf4, 0x02, 0x54, 0x5f, 0xf0, 0x17, 0x40, 0x58, 0x0b, 0xed, 0x88, 0x64, 0x75, 0x47, 0xef, 0x0f, 0x17, 0xbc, 0xc1, 0x41, 0xc6, 0x19, 0xac, 0xc3, 0xbd, 0x01, 0xd0, 0xff, 0x4a, 0xd6, 0x19, 0x07, 0xc7, 0xdd, 0xcd, 0xd9, 0xcc, 0x9c, 0x61, 0xe2, 0xa3, 0x87, 0x91, 0xc0, 0xfc, 0xdc, 0xb0, 0x4c, 0xe2, 0xcc, 0x3c, 0xd8, 0xee, 0xdb, 0xb5, 0xb5, 0xbb, 0x89, 0xaf, 0xf9, 0x99, 0x32, 0x27, 0x7e, 0x86, 0x33, 0x13, 0x2e, 0x5a, 0x4e, 0x3c, 0x7e, 0x41, 0x50, 0x50, 0x39, 0x6e, 0xf0, 0x33, 0x7f, 0x0e, 0xfb, 0x97, 0x0d, 0x7b, 0xae, 0xcc, 0xbf, 0xb3, 0x63, 0xd9, 0x52, 0x08, 0x71, 0xcb, 0x6f, 0x19, 0x4d, 0x4d, 0xe5, 0x00, 0xf5, 0x79, 0x37, 0xcd, 0x8e, 0xee, 0x56, 0x34, 0x4b, 0x23, 0xaf, 0x82, 0x92, 0xfb, 0x68, 0xd5, 0x5a, 0x99, 0xe7, 0x8d, 0xd8, 0x75, 0x95, 0xfe, 0x5a, 0xaf, 0xe1, 0x67, 0x73, 0xa4, 0x87, 0x28, 0x58, 0xc0, 0x12, 0x2f, 0x8a, 0x93, 0x9f, 0xb4, 0xb5, 0x26, 0xe5, 0x26, 0xd8, 0x8f, 0x72, 0x65, 0xa7, 0xc3, 0x37, 0x31, 0x2e, 0xac, 0x47, 0xe3, 0xb6, 0x7b, 0xdc, 0x5a, 0xec, 0x40, 0x9b, 0x39, 0x40, 0xb7, 0x19, 0x50, 0x8c, 0x65, 0x9d, 0x57, 0xf6, 0xe4, 0x28, 0xe2, 0x17, 0x7c, 0xb2, 0x91, 0x5d, 0xf3, 0xb7, 0x87, 0xad, 0xa5, 0xf2, 0x1e, 0x4d, 0xd7, 0x69, 0xd9, 0x02, 0x48, 0xa9, 0x9b, 0x75, 0x09, 0x53, 0x16, 0xdb, 0x8f, 0xd7, 0x85, 0xd5, 0x07, 0x80, 0x9e, 0x95, 0xe9, 0xb1, 0xc2, 0x43, 0xd0, 0x6e, 0x78, 0x9f, 0x89, 0x1d, 0x19, 0xe7, 0x69, 0x8e, 0xcd, 0xfb, 0xe4, 0x3a, 0xb5, 0xbf, 0x5c, 0xc8, 0x6a, 0xc1, 0x37, 0xd6, 0xa7, 0x1c, 0x34, 0xf5, 0x42, 0x9c, 0xff, 0xf5, 0x61, 0x22, 0x03, 0x64, 0xea, 0x4a, 0x7f, 0x51, 0x3b, 0x4c, 0xdc, 0x55, 0x1c, 0x20, 0x3e, 0xd5, 0xf1, 0xe6, 0x59, 0x81, 0x35, 0x84, 0x86, 0x20, 0x23, 0x91, 0x15, 0x90, 0xb6, 0x72, 0xe5, 0x08, 0xd4, 0xc2, 0x33, 0xa1, 0xc6, 0xf8, 0xb0, 0x15, 0xec, 0x43, 0xd6, 0xc6, 0xaf, 0xb9, 0x7b, 0x02, 0xb6, 0xb1, 0xa7, 0x85, 0x5d, 0x6d, 0xa3, 0x3f, 0x63, 0xfd, 0x52, 0x58, 0xe2, 0x5f, 0xc4, 0x72, 0x85, 0xeb, 0x09, 0x2e, 0xf5, 0xef, 0x43, 0xf1, 0x94, 0x96, 0xff, 0xe8, 0x6e, 0x0e, 0xc6, 0x49, 0x6d, 0xe9, 0xee, 0xdc, 0xcc, 0xc4, 0xb6, 0xbb, 0xcd, 0x27, 0x93, 0x56, 0xaf, 0xad, 0xc4, 0xb9, 0xda, 0x65, 0x2c, 0x12, 0x5e, 0x77, 0x61, 0x6d, 0x9b, 0x0b, 0x01, 0xc3, 0x41, 0x66, 0x45, 0x33, 0x7c, 0x56, 0xd8, 0x8f, 0x68, 0xd1, 0xe9, 0x1a, 0xcb, 0xd9, 0x7f, 0x90, 0x03, 0xa2, 0x0c, 0x67, 0x3d, 0xf7, 0x46, 0x55, 0xe8, 0xda, 0x32, 0x12, 0x6a, 0x6b, 0x81, 0x5f, 0x11, 0x0b, 0x20, 0x47, 0x4c, 0xc0, 0x0b, 0xa5, 0x1b, 0xdb, 0x62, 0xe6, 0xc4, 0xd9, 0xbe, 0x10, 0xc8, 0x88, 0xc5, 0x03, 0x15, 0x6b, 0xfc, 0x00, 0x7d, 0x5e, 0xdd, 0x67, 0x67, 0x7d, 0x2a, 0xc5, 0xc4, 0x43, 0x80, 0x0d, 0x45, 0xef, 0x2f, 0x26, 0xcb, 0x2c, 0x49, 0xa6, 0x20, 0xf0, 0xf9, 0xde, 0xe4, 0xa5, 0x16, 0x16, 0xca, 0x87, 0xf8, 0x19, 0x04, 0x4d, 0x8b, 0xf5, 0xfb, 0x0b, 0xa1, 0xfc, 0x44, 0x57, 0x8d, 0x0e, 0xcf, 0xab, 0xed, 0x1b, 0x62, 0x0a, 0xc7, 0xe3, 0x46, 0xe6, 0xd8, 0x00, 0x41, 0x42, 0x28, 0x27, 0xc4, 0x14, 0xe2, 0xab, 0x64, 0xed, 0x63, 0x42, 0x8e, 0xdb, 0x91, 0x0c, 0x77, 0x8f, 0x6e, 0xd1, 0x53, 0xbb, 0xed, 0x8b, 0xc7, 0xbe, 0x04, 0x24, 0xa0, 0x83, 0x02, 0x80, 0xc5, 0xa6, 0x23, 0xbe, 0x6a, 0xd9, 0x61, 0xbb, 0x87, 0x87, 0x8e, 0xd8, 0x89, 0xb7, 0xa0, 0xfe, 0x47, 0x32, 0x4c, 0xdf, 0x37, 0xe8, 0xd6, 0x7e, 0xe2, 0x90, 0x27, 0xf1, 0x95, 0x8f, 0x20, 0x65, 0x5a, 0x1b, 0x2e, 0x64, 0x26, 0xa0, 0x1e, 0x53, 0x54, 0x62, 0x33, 0x3f, 0x52, 0x65, 0x76, 0xd9, 0x9b, 0x8a, 0x4e, 0xbe, 0xe5, 0xfa, 0x50, 0xfc, 0x9b, 0xc7, 0x58, 0xd2, 0x8d, 0xd1, 0xd9, 0xb8, 0xe7, 0xe7, 0x71, 0x9f, 0x5f, 0x2f, 0xc1, 0x7a, 0xb3, 0xc8, 0x7b, 0xfd, 0x53, 0xad, 0xbc, 0xa5, 0x5a, 0xdd, 0x9d, 0xf8, 0xc3, 0xb9, 0x05, 0x0e, 0xda, 0xad, 0xc1, 0x50, 0xf0, 0x12, 0xd6, 0x80, 0x53, 0x53, 0x15, 0xfa, 0x7e, 0x4f, 0xf1, 0x39, 0x8c, 0xff, 0x8e, 0x9c, 0xf3, 0x59, 0x1a, 0x6a, 0x6e, 0x74, 0x60, 0x15, 0x3b, 0xec, 0x9a, 0xbb, 0x87, 0x88, 0x87, 0xf2, 0x27, 0x1a, 0xbe, 0xc5, 0x88, 0xa7, 0x42, 0xfa, 0xe9, 0xc8, 0x56, 0x97, 0xc7, 0x50, 0x93, 0xa4, 0x99, 0x2f, 0x37, 0x31, 0xbe, 0x97, 0xc0, 0x9b, 0xb4, 0x5d, 0xba, 0x0c, 0x8a, 0xa1, 0xd5, 0x41, 0x98, 0xb1, 0x3a, 0x90, 0x6d, 0x2b, 0x1f, 0x29, 0x09, 0x62, 0x99, 0x9c, 0x4d, 0x03, 0xb2, 0x9b, 0xaf, 0xf9, 0xbc, 0x01, 0x32, 0x8d, 0xe5, 0x14, 0x96, 0xd2, 0x0b, 0x07, 0xcb, 0x40, 0xd1, 0xc4, 0xac, 0x9f, 0xf2, 0xe8, 0xea, 0x27, 0xd5, 0x0e, 0x46, 0xe5, 0x62, 0x50, 0x04, 0x60, 0x15, 0x0b, 0x9c, 0x7d, 0x50, 0xe3, 0xb2, 0xa0, 0xf6, 0x07, 0x48, 0x14, 0x35, 0xb6, 0x33, 0xad, 0xa3, 0x03, 0xcb, 0xab, 0x8d, 0xd5, 0xe7, 0xe2, 0x8b, 0x31, 0x09, 0x18, 0x58, 0xbc, 0xd5, 0xaf, 0xe1, 0x7b, 0xc8, 0x84, 0x9c, 0xde, 0x26, 0x16, 0x1b, 0xfd, 0x34, 0xeb, 0xe1, 0x21, 0xa8, 0x2f, 0x74, 0x86, 0x5e, 0x9f, 0xb4, 0x5f, 0x4c, 0xa5, 0x6a, 0x1b, 0xb8, 0xc4, 0x24, 0xe7, 0xa8, 0x37, 0x41, 0x74, 0x9b, 0xd5, 0x48, 0xfa, 0x76, 0x38, 0x7e, 0x7d, 0xc1, 0x1e, 0xb7, 0x4f, 0x13, 0x0f, 0x6c, 0xd6, 0xcb, 0x41, 0x0e, 0x8f, 0x01, 0xb8, 0x9a, 0x53, 0xbd, 0xb1, 0x6e, 0xd9, 0x66, 0x41, 0x5b, 0x7d, 0x7d, 0x3a, 0xfb, 0x3f, 0x8b, 0x4e, 0x44, 0x0f, 0x57, 0x77, 0x5e, 0x48, 0x5d, 0x96, 0xb2, 0x7a, 0x7c, 0x5a, 0x44, 0x6c, 0xef, 0x63, 0x42, 0x61, 0x7e, 0xa7, 0xdd, 0x9b, 0xf5, 0x15, 0x57, 0x1e, 0xd6, 0x79, 0x5d, 0xb6, 0x4b, 0xa0, 0x98, 0x3b, 0x5e, 0xbc, 0x7f, 0x14, 0x6c, 0x09, 0x6f, 0xfa, 0xd7, 0xb1, 0xfd, 0xfe, 0xfc, 0xee, 0x8b, 0xce, 0x65, 0x6e, 0x19, 0x34, 0x3f, 0xfb, 0x5e, 0xdf, 0x0e, 0x5b, 0x17, 0x66, 0x9f, 0x75, 0xa0, 0x8a, 0x3e, 0xb6, 0xc1, 0xbc, 0x2a, 0xb3, 0xca, 0xdf, 0x46, 0x10, 0xe2, 0x4e, 0x11, 0xa0, 0x9c, 0x21, 0xd8, 0xcd, 0xcb, 0xac, 0x2b, 0x3b, 0x98, 0x49, 0x8d, 0xa8, 0xd1, 0x58, 0x6f, 0x17, 0x84, 0x83, 0x60, 0x2d, 0xcd, 0x47, 0x7e, 0xdb, 0xec, 0xaf, 0x30, 0x3d, 0x9a, 0x63, 0x17, 0xc2, 0x9e, 0xe2, 0x41, 0x8e, 0x9b, 0x0c, 0xa0, 0x1c, 0x2c, 0xe3, 0xbb, 0x28, 0x32, 0x92, 0xa4, 0xcc, 0x6d, 0xaf, 0x2a, 0xe9, 0x4a, 0xbd, 0x4f, 0xc8, 0xfc, 0xf5, 0xfd, 0x01, 0xce, 0x46, 0xf4, 0x9c, 0xb8, 0x9a, 0x07, 0x77, 0x30, 0x5b, 0x88, 0xe7, 0x42, 0x35, 0x01, 0xa2, 0xe3, 0x1e, 0x24, 0xdd, 0x83, 0x94, 0x05, 0xb1, 0xe1, 0x26, 0x87, 0xc3, 0x23, 0x36, 0x14, 0x24, 0x26, 0xfd, 0x92, 0x76, 0x13, 0xd0, 0x92, 0x51, 0x33, 0xa1, 0xca, 0xe5, 0x04, 0xc8, 0xc5, 0xe0, 0x8c, 0x04, 0xd9, 0x92, 0xed, 0xbc, 0x5a, 0x4e, 0x3a, 0x8b, 0x0d, 0x14, 0x89, 0xfc, 0xdf, 0x6e, 0x49, 0x92, 0xd7, 0x98, 0xd6, 0x0c, 0x4a, 0xe3, 0x4b, 0xe6, 0x4e, 0x5b, 0x98, 0x23, 0x70, 0xa8, 0xd4, 0x4a, 0xaa, 0x32, 0xd4, 0xaf, 0x8f, 0x89, 0xfc, 0xf3, 0xc9, 0x03, 0x55, 0xce, 0xc5, 0xa7, 0xe0, 0x0c, 0xad, 0x49, 0x2a, 0xd6, 0x97, 0xf7, 0x21, 0x33, 0xfc, 0x94, 0x26, 0xcf, 0x6b, 0xc3, 0x63, 0xfa, 0x7e, 0x07, 0x5f, 0xf3, 0x0e, 0x28, 0xcf, 0x67, 0xa3, 0xd8, 0xb0, 0x35, 0x2e, 0x96, 0x92, 0x74, 0xfb, 0xd3, 0x37, 0xb7, 0xe1, 0x53, 0x5c, 0x8f, 0xbc, 0xd7, 0xd7, 0x52, 0x1d, 0xf9, 0xe2, 0x1b, 0x3f, 0x57, 0xb7, 0x12, 0x3d, 0xf3, 0x5d, 0xee, 0x83, 0xda, 0xc1, 0xb8, 0x82, 0x04, 0x08, 0xd1, 0xa9, 0x7c, 0x24, 0x36, 0x90, 0xc0, 0xa5, 0x03, 0x76, 0x6b, 0xd2, 0x36, 0xed, 0x11, 0xf9, 0xb6, 0xd4, 0x6b, 0x03, 0x94, 0x86, 0xb4, 0x4b, 0x90, 0x51, 0x52, 0xb1, 0xdf, 0x2a, 0xb9, 0xea, 0x2b, 0x9e, 0x8d, 0x1a, 0xdc, 0x0c, 0x06, 0xa4, 0x96, 0x12, 0x99, 0x40, 0x02, 0x45, 0xd5, 0x4f, 0xd2, 0x25, 0x8b, 0x6c, 0xff, 0x50, 0x31, 0x44, 0x55, 0xf5, 0x88, 0xa7, 0x32, 0x8c, 0x7d, 0xdf, 0x8b, 0xc4, 0x4d, 0x40, 0x2f, 0xbd, 0xed, 0x00, 0x50, 0x78, 0xa9, 0x49, 0x3f, 0x8c, 0x0b, 0x8d, 0x77, 0x1a, 0xfe, 0x1a, 0xdd, 0x02, 0x33, 0xee, 0x46, 0x57, 0xc4, 0xcc, 0x3a, 0x11, 0x18, 0x8f, 0xf8, 0x02, 0x06, 0xbf, 0xb9, 0x0c, 0x3d, 0x62, 0x39, 0x90, 0xe3, 0x14, 0x74, 0x29, 0x7c, 0x5a, 0xad, 0x9b, 0x0e, 0x34, 0xb5, 0x06, 0x82, 0xf1, 0x6a, 0x60, 0x4e, 0x47, 0x7e, 0x21, 0x51, 0xa3, 0x7a, 0x40, 0xfe, 0xbe, 0x02, 0x5f, 0xbd, 0x71, 0x5a, 0x43, 0x8e, 0xca, 0x29, 0x86, 0xf0, 0x5f, 0x7d, 0x90, 0x01, 0xe2, 0x10, 0xc3, 0xe6, 0xf6, 0xca, 0xf6, 0x6d, 0x41, 0x86, 0x25, 0xf1, 0xc3, 0x19, 0x66, 0x7f, 0x66, 0x90, 0x1f, 0x36, 0xd6, 0xba, 0x77, 0xf4, 0x92, 0xe7, 0x0a, 0x2f, 0x44, 0xee, 0xe1, 0x20, 0x4e, 0x75, 0xa1, 0x27, 0xa5, 0x6c, 0x02, 0x6b, 0xe2, 0xdb, 0x83, 0xc1, 0x96, 0xde, 0x5d, 0xcf, 0xde, 0xed, 0xb5, 0x71, 0x38, 0x61, 0x15, 0x5b, 0x95, 0x34, 0x1d, 0x00, 0xb0, 0x09, 0x76, 0xb3, 0x9d, 0x6c, 0x08, 0x0c, 0xa5, 0x5a, 0x6d, 0x8e, 0x51, 0x04, 0xa5, 0x86, 0xc5, 0xd0, 0x0b, 0x36, 0x4f, 0xa1, 0x87, 0x33, 0x40, 0x58, 0x06, 0x0c, 0xfb, 0x9b, 0x27, 0x2c, 0x4b, 0xd5, 0x37, 0x02, 0xfa, 0x7d, 0x60, 0x5f, 0x9f, 0x9c, 0x1d, 0x1f, 0xb7, 0x89, 0xf1, 0x0b, 0xf7, 0xf7, 0x59, 0xfe, 0xe1, 0x32, 0xff, 0x47, 0x96, 0xa6, 0x30, 0x4f, 0xeb, 0xa1, 0x90, 0x7c, 0xbe, 0x5a, 0x0d, 0x54, 0x8b, 0x31, 0x11, 0xe6, 0x3a, 0x38, 0xfc, 0x65, 0x3b, 0xf3, 0xd1, 0x17, 0xd5, 0x5c, 0x2f, 0x6d, 0xbb, 0x2a, 0x84, 0x74, 0xe1, 0x53, 0x7d, 0x6c, 0x8d, 0xd0, 0xc1, 0xb5, 0xb1, 0xa0, 0xde, 0xf3, 0x78, 0x0f, 0x83, 0x6a, 0x1f, 0x38, 0xf1, 0xaa, 0x06, 0xc9, 0xac, 0x71, 0x07, 0x06, 0x76, 0xcd, 0x06, 0x11, 0x7d, 0x81, 0xc9, 0x68, 0xd4, 0xaa, 0x0a, 0xaf, 0x20, 0xa2, 0xcb, 0xb0, 0x94, 0x25, 0xea, 0xa0, 0x1f, 0xb2, 0xf5, 0xa3, 0xe3, 0x34, 0x3f, 0x93, 0xea, 0xe2, 0x34, 0xfd, 0x14, 0x64, 0xe9, 0x6d, 0x54, 0x37, 0xf8, 0xec, 0x1c, 0x52, 0x8a, 0xc6, 0x16, 0x0a, 0xb5, 0x91, 0x15, 0x33, 0x09, 0x6a, 0x4b, 0x88, 0x65, 0x82, 0xbc, 0x4d, 0x0f, 0xda, 0xf2, 0x32, 0x04, 0x4a, 0xf3, 0x7b, 0x8d, 0xc8, 0x70, 0x5e, 0x13, 0xe7, 0x3f, 0xac, 0x34, 0x9e, 0x0c, 0xb4, 0x17, 0x4b, 0x4b, 0x65, 0xfc, 0xf7, 0x70, 0xb2, 0x17, 0xdc, 0x63, 0x3b, 0x9e, 0x24, 0x2e, 0x29, 0x21, 0xf4, 0xf9, 0x59, 0x1a, 0xa9, 0x39, 0xbe, 0xc5, 0x62, 0x24, 0x00, 0x31, 0xbe, 0x68, 0x69, 0x97, 0xe7, 0x1c, 0x02, 0xec, 0xcf, 0xf7, 0xf9, 0xb2, 0xb9, 0xc0, 0x46, 0x13, 0xfc, 0x05, 0x8e, 0x30, 0x03, 0x10, 0x48, 0xb7, 0x99, 0x17, 0x1e, 0xb3, 0x63, 0xb3, 0x96, 0xa9, 0xae, 0x93, 0xf1, 0xe0, 0x6c, 0x72, 0x54, 0x00, 0x78, 0x46, 0x25, 0xdf, 0x22, 0xbb, 0xb8, 0x97, 0xe7, 0xdf, 0x2b, 0xdc, 0x80, 0x1f, 0x8e, 0x8c, 0x1f, 0x72, 0x47, 0x88, 0xf5, 0xd4, 0xb5, 0xc3, 0xf7, 0xf6, 0x14, 0x98, 0xe2, 0x34, 0xa1, 0x61, 0x7c, 0xc7, 0xfe, 0x45, 0x1d, 0x3c, 0xd7, 0x51, 0x6f, 0x24, 0xc6, 0xca, 0x72, 0x0e, 0x74, 0xc2, 0xc3, 0xb2, 0x02, 0xea, 0x1d, 0x6f, 0xa7, 0xa7, 0x20, 0xf8, 0x9a, 0x68, 0x51, 0x4a, 0x32, 0x36, 0x63, 0xe1, 0x4b, 0x8d, 0xb5, 0x2b, 0xed, 0x6a, 0x1b, 0x3d, 0x28, 0xa5, 0xe1, 0xc5, 0x42, 0x81, 0x0d, 0x3f, 0x15, 0x82, 0xe5, 0x6c, 0xb2, 0x7e, 0xb1, 0x00, 0x4a, 0xf7, 0xc2, 0x9b, 0x4f, 0xa8, 0xb3, 0xfb, 0xd6, 0x5e, 0xef, 0x70, 0x40, 0x09, 0x73, 0x90, 0x19, 0x13, 0xd6, 0x2b, 0x40, 0xf0, 0x86, 0x82, 0x48, 0xf7, 0x54, 0xb3, 0x1f, 0x70, 0x33, 0x78, 0xed, 0xee, 0x3c, 0x11, 0x3f, 0xdf, 0xf6, 0x7f, 0x65, 0x61, 0xd5, 0xf3, 0x18, 0x57, 0x00, 0x86, 0x61, 0xbc, 0x57, 0x2a, 0xb6, 0x38, 0xb5, 0xe1, 0x65, 0xf1, 0x72, 0x2d, 0x36, 0xa4, 0x2d, 0xc7, 0x4b, 0xf4, 0xc8, 0x93, 0x4c, 0x02, 0xb3, 0xd4, 0xc1, 0x3d, 0x6e, 0x9d, 0xbf, 0x7c, 0x49, 0x88, 0xc7, 0x4a, 0x6f, 0xa9, 0xeb, 0x80, 0x22, 0xc5, 0x32, 0x1a, 0x48, 0xc0, 0x3e, 0x43, 0x27, 0x55, 0x2c, 0xb2, 0x6d, 0x0a, 0xbc, 0x39, 0x73, 0x62, 0xb2, 0x9b, 0xc2, 0x54, 0x7c, 0x9f, 0xd7, 0xfc, 0x14, 0x62, 0x23, 0x91, 0x28, 0xf1, 0x56, 0x97, 0x79, 0x17, 0xdd, 0x55, 0x81, 0x74, 0xa9, 0x8a, 0x58, 0xcf, 0x33, 0x5c, 0xd8, 0xae, 0xbd, 0x91, 0x00, 0x23, 0xda, 0x01, 0x96, 0xe8, 0x30, 0x4b, 0x10, 0xae, 0x7d, 0xc8, 0xb5, 0xb3, 0xd8, 0xbd, 0x00, 0x93, 0x3a, 0xd5, 0x45, 0x60, 0x3c, 0xce, 0x96, 0xf4, 0x22, 0x72, 0xe8, 0x86, 0x19, 0xc9, 0x72, 0x7c, 0xbd, 0x8d, 0x56, 0x80, 0xde, 0xde, 0x83, 0xd6, 0x84, 0x37, 0xda, 0xed, 0x30, 0xa1, 0x90, 0x34, 0x65, 0x26, 0xd3, 0x2e, 0x67, 0x89, 0xb0, 0xc9, 0x43, 0x34, 0x34, 0xec, 0x0f, 0x72, 0xd1, 0x4f, 0x73, 0xde, 0x04, 0x8f, 0x69, 0x1c, 0x35, 0x82, 0x40, 0xc6, 0xdf, 0xc8, 0xe7, 0xa9, 0xf0, 0xa2, 0x68, 0x32, 0x73, 0x07, 0xb3, 0x23, 0x6c, 0xf5, 0x9d, 0x8a, 0x03, 0x06, 0x28, 0xf4, 0xe5, 0x43, 0x05, 0xde, 0xe8, 0x3c, 0x57, 0x6c, 0xee, 0x59, 0xba, 0x5e, 0x0b, 0x6b, 0x84, 0x3f, 0xea, 0x86, 0x4b, 0xdf, 0x6c, 0x13, 0xa7, 0x04, 0x93, 0x21, 0x38, 0x5d, 0x9f, 0xfc, 0xeb, 0xb7, 0x76, 0x01, 0x7a, 0x73, 0x49, 0xb0, 0x32, 0x38, 0x75, 0x03, 0xf9, 0xe5, 0xa7, 0xfe, 0x8f, 0xca, 0x44, 0x88, 0x14, 0x17, 0x08, 0x79, 0xcb, 0x94, 0xed, 0xf4, 0x1d, 0x93, 0x4e, 0xf7, 0xe1, 0x24, 0x4c, 0x30, 0xda, 0x87, 0x71, 0x13, 0x81, 0xe7, 0x93, 0x29, 0x05, 0x45, 0xfb, 0xab, 0x91, 0xb2, 0xc7, 0x4f, 0xcd, 0xc1, 0x8d, 0x62, 0xa7, 0x3c, 0x41, 0x17, 0x53, 0x16, 0x59, 0x1f, 0x90, 0xa1, 0x2e, 0x79, 0x2e, 0x01, 0xa6, 0x8c, 0xcd, 0xe1, 0x10, 0x73, 0xe7, 0x64, 0x4f, 0x98, 0x11, 0x5e, 0x3b, 0x84, 0x7d, 0xc5, 0x44, 0xf5, 0xc4, 0x62, 0x59, 0x31, 0xe2, 0xcc, 0x08, 0x9b, 0x82, 0x97, 0xe6, 0x84, 0x7d, 0xc9, 0x31, 0x43, 0x9d, 0x8d, 0xb4, 0x88, 0xa6, 0x2c, 0xeb, 0xed, 0x97, 0x38, 0x68, 0xce, 0x2d, 0x0b, 0x75, 0x5b, 0xa9, 0x70, 0xfb, 0xeb, 0xd3, 0x9f, 0xa2, 0x94, 0x3f, 0x6f, 0x3a, 0xf8, 0xcf, 0xc7, 0x5a, 0x61, 0x79, 0x55, 0x46, 0x11, 0x4a, 0x83, 0x16, 0xd3, 0xab, 0xa7, 0x15, 0xd6, 0xe4, 0x7a, 0x68, 0xbb, 0xde, 0xcc, 0xf0, 0xed, 0x2d, 0x76, 0x71, 0x31, 0x4d, 0x8f, 0xf3, 0x7e, 0x2c, 0xe3, 0x68, 0x0e, 0xe9, 0xa0, 0x90, 0xb5, 0xdc, 0x53, 0x1a, 0x72, 0xd6, 0x13, 0x0c, 0x44, 0xaa, 0xfc, 0x64, 0x3e, 0xec, 0xe0, 0xff, 0xde, 0xf8, 0x38, 0xbb, 0x9b, 0x36, 0x61, 0xd9, 0xbd, 0x9d, 0x05, 0xa5, 0x71, 0x76, 0xd7, 0x58, 0x1d, 0x63, 0x83, 0x3d, 0xf1, 0x9f, 0xe4, 0x13, 0xbf, 0x87, 0x78, 0xb3, 0x0c, 0x5a, 0x12, 0xf2, 0x67, 0x3d, 0xcf, 0xc9, 0xf9, 0x82, 0x4b, 0xb3, 0x5e, 0x29, 0x15, 0x57, 0xb3, 0xa7, 0x60, 0x67, 0xf0, 0xe7, 0xfb, 0xc8, 0x78, 0x8f, 0x83, 0xf3, 0xef, 0x84, 0xd7, 0x9b, 0x4c, 0xb0, 0xcc, 0x90, 0x2f, 0x03, 0x22, 0xe3, 0x74, 0xb7, 0xb7, 0x4b, 0x08, 0xd9, 0xfb, 0xc7, 0xfb, 0x05, 0xa4, 0x85, 0xd7, 0x71, 0xa3, 0x03, 0x31, 0x2c, 0x56, 0x74, 0x7d, 0xa8, 0xff, 0x65, 0x27, 0x77, 0x75, 0xa0, 0xdf, 0x52, 0x19, 0x50, 0x34, 0x5f, 0x0c, 0x67, 0x64, 0xb4, 0x9f, 0x3d, 0x72, 0x17, 0x0b, 0x79, 0x7a, 0x07, 0x63, 0x35, 0x42, 0x01, 0xc6, 0x5d, 0x11, 0xfc, 0xd9, 0x58, 0xc4, 0x36, 0x74, 0xeb, 0x1e, 0x32, 0x9c, 0x5a, 0x60, 0x01, 0xb2, 0xd0, 0x19, 0xc2, 0xe9, 0x00, 0x40, 0x65, 0xfe, 0x0d, 0x80, 0xb4, 0x23, 0xa7, 0xd3, 0x93, 0x3c, 0x78, 0x52, 0x86, 0x4d, 0xbe, 0x4c, 0x75, 0x33, 0x39, 0x95, 0xac, 0x93, 0x47, 0x20, 0x26, 0x11, 0x4e, 0xd0, 0x0b, 0xc2, 0x5a, 0x8c, 0x77, 0xe3, 0x07, 0x92, 0x7d, 0xcb, 0xa2, 0x0d, 0x6c, 0x1e, 0x8b, 0xe9, 0x50, 0x44, 0xdd, 0xe6, 0xbc, 0x19, 0x51, 0xeb, 0xc7, 0xe6, 0x60, 0x9e, 0x55, 0x91, 0xa8, 0x31, 0x98, 0x10, 0x91, 0x7e, 0xd6, 0x23, 0x30, 0x57, 0x6c, 0x43, 0x6c, 0x17, 0x13, 0xd5, 0x5f, 0x7d, 0x62, 0xa4, 0xff, 0xbb, 0x94, 0x8e, 0xfd, 0xc9, 0x8c, 0x7e, 0xed, 0xff, 0x16, 0x9a, 0xa8, 0xe3, 0x70, 0xbd, 0xee, 0x40, 0x09, 0x27, 0x50, 0x78, 0x88, 0x73, 0x4d, 0x1a, 0x10, 0xca, 0xbc, 0xb7, 0xc2, 0x57, 0x6a, 0xf2, 0x84, 0xfa, 0x03, 0xd7, 0x01, 0x41, 0x36, 0x6e, 0xf1, 0x94, 0x14, 0x8f, 0x9b, 0xaf, 0xb9, 0xf7, 0x98, 0x56, 0x2f, 0x9c, 0xd9, 0x43, 0x8f, 0x3e, 0xec, 0x64, 0x69, 0x3f, 0x7a, 0x43, 0x66, 0xb4, 0x15, 0xc6, 0x2c, 0xbc, 0x30, 0x18, 0x82, 0x11, 0x6f, 0xe7, 0xb5, 0xdc, 0x22, 0xd0, 0x3a, 0xce, 0x0c, 0x17, 0x94, 0x6c, 0x68, 0x9c, 0x79, 0xaa, 0x2e, 0x0a, 0x30, 0xbc, 0x92, 0x52, 0x3d, 0x29, 0xcd, 0x58, 0x40, 0x21, 0x21, 0xeb, 0x1b, 0x10, 0x17, 0xfb, 0x53, 0x73, 0x0c, 0x06, 0xb9, 0xeb, 0xeb, 0xd4, 0x49, 0x8f, 0x3c, 0x64, 0x52, 0x87, 0x5e, 0x26, 0xd7, 0xd7, 0x10, 0x6b, 0x35, 0x78, 0x37, 0x19, 0x07, 0xad, 0xdb, 0xa3, 0x47, 0x94, 0x72, 0x38, 0xb6, 0xfb, 0x61, 0x3b, 0x7d, 0x76, 0xc0, 0xf4, 0x14, 0xae, 0x5d, 0x85, 0x63, 0xfc, 0x04, 0x1f, 0x27, 0x37, 0xfe, 0x75, 0x98, 0xca, 0xd8, 0x71, 0x49, 0x09, 0x66, 0x26, 0x4f, 0xc5, 0x06, 0x07, 0xa5, 0x1d, 0x29, 0x56, 0xcf, 0x98, 0x10, 0xdf, 0xbe, 0x71, 0xd4, 0xe5, 0xf4, 0x32, 0xa9, 0x5d, 0xe8, 0x84, 0x63, 0x5a, 0xac, 0x46, 0x3a, 0xc9, 0xcd, 0xdc, 0xca, 0x5e, 0x7b, 0xca, 0x5e, 0xce, 0xe9, 0x81, 0x6d, 0x3f, 0xf7, 0x78, 0x65, 0xfc, 0x0f, 0x7f, 0xa8, 0x6e, 0x4c, 0x51, 0xd4, 0x48, 0xe2, 0x68, 0x48, 0x01, 0xba, 0x15, 0xe4, 0x87, 0x5c, 0xcf, 0x0f, 0x32, 0x12, 0xcc, 0xff, 0xf6, 0x4a, 0xce, 0x35, 0xde, 0x3d, 0x40, 0x46, 0xb5, 0xce, 0x81, 0xe1, 0x06, 0xb5, 0x80, 0x0e, 0x48, 0xdc, 0x89, 0xb4, 0x52, 0x09, 0x5e, 0x5e, 0x15, 0xbe, 0x8a, 0x3e, 0x89, 0x5e, 0xf2, 0x73, 0xe8, 0x90, 0xad, 0x87, 0x1b, 0xe8, 0x15, 0x3c, 0x71, 0xc5, 0x1e, 0x88, 0x97, 0x75, 0xe7, 0xde, 0xc5, 0xa0, 0x8f, 0xaf, 0x35, 0xe3, 0x4a, 0x31, 0xd9, 0xbb, 0xb4, 0x5f, 0x4d, 0xa5, 0x65, 0x41, 0x0b, 0x83, 0xc5, 0x6d, 0xde, 0x42, 0x21, 0xce, 0x99, 0xba ],
+const [ 0xa2, 0x4a, 0x4c, 0xc2, 0x9e, 0x44, 0xd5, 0x03, 0x86, 0xc9, 0xca, 0xda, 0x21, 0xd7, 0x41, 0xd3, 0x5c, 0xf8, 0xaa, 0x71, 0x3c, 0x6a, 0x5f, 0x72, 0x16, 0x7e, 0x7c, 0x55, 0x02, 0x3e, 0xf0, 0x1a, 0x8d, 0x52, 0xd4, 0x49, 0xae, 0x25, 0xfc, 0x35, 0xfc, 0x43, 0xcc, 0x82, 0x1d, 0x06, 0x4d, 0xe5, 0x82, 0x71, 0x80, 0x2b, 0x51, 0x5c, 0xf3, 0x7d, 0xa3, 0xd1, 0x91, 0xe2, 0xf0, 0xb7, 0xbe, 0x05, 0xc7, 0xad, 0xa4, 0x39, 0xc3, 0x39, 0xc7, 0xba, 0xba, 0x22, 0xe0, 0x35, 0x37, 0x1a, 0xe8, 0x8b, 0x2b, 0xa0, 0x73, 0xd3, 0xdf, 0x25, 0x3f, 0x9e, 0x2d, 0x6e, 0x0d, 0x7e, 0xf0, 0x39, 0xaf, 0xc9, 0xb9, 0x23, 0x63, 0x9a, 0xc4, 0xc9, 0x5f, 0x19, 0x2a, 0x2e, 0xad, 0xfc, 0x57, 0x5d, 0x39, 0x4e, 0xbf, 0x4f, 0x29, 0x6f, 0xcd, 0x0e, 0x6c, 0x5d, 0x1c, 0x1b, 0x96, 0x31, 0xea, 0x0d, 0xeb, 0xed, 0xca, 0x7c, 0xb9, 0x74, 0x98, 0x1d, 0xec, 0xda, 0xb2, 0x2e, 0xdc, 0xde, 0x65, 0x15, 0x69, 0xb5, 0xa6, 0x44, 0x4a, 0x0a, 0x03, 0x5f, 0xa2, 0x42, 0xd9, 0xa1, 0xd4, 0x04, 0xc6, 0x7c, 0x99, 0xf9, 0x61, 0x7f, 0x50, 0xd0, 0x29, 0x7d, 0x95, 0x86, 0xbc, 0xec, 0x14, 0xe4, 0x4a, 0x8b, 0x9f, 0x49, 0x48, 0x48, 0x7f, 0xa9, 0x69, 0x60, 0x08, 0xd6, 0xca, 0xc8, 0x71, 0xfe, 0x6c, 0xcc, 0xe2, 0x75, 0xe8, 0xf6, 0xcd, 0xb5, 0x5e, 0x31, 0x82, 0xa4, 0xaf, 0x2e, 0xfe, 0x15, 0xec, 0x07, 0x04, 0x90, 0x0e, 0x22, 0x70, 0x56, 0xe7, 0x59, 0xc7, 0xa0, 0x58, 0x57, 0x12, 0x28, 0xc5, 0x45, 0xed, 0xea, 0xc6, 0xa7, 0xdb, 0x2c, 0x1f, 0x80, 0xdc, 0xbc, 0xf3, 0xbd, 0x42, 0x79, 0x34, 0xd0, 0xc0, 0x14, 0x5e, 0x9c, 0xc4, 0x18, 0x65, 0x91, 0x06, 0x28, 0xeb, 0x18, 0x61, 0x88, 0xb7, 0x31, 0xe3, 0xe0, 0x63, 0x5a, 0x20, 0x3c, 0x54, 0xb4, 0xcb, 0x56, 0xf0, 0x61, 0x87, 0x18, 0x0a, 0x30, 0xfa, 0x5d, 0xa1, 0x7c, 0x23, 0xf8, 0xcb, 0x51, 0xee, 0xf7, 0xec, 0xd1, 0x06, 0x29, 0x2b, 0xd6, 0xeb, 0xdd, 0x27, 0xd9, 0x44, 0xed, 0xe5, 0x13, 0x76, 0xfb, 0x0e, 0xe1, 0x75, 0xfb, 0x57, 0x6d, 0xdb, 0xf1, 0x40, 0x8b, 0x37, 0xfc, 0x01, 0xe1, 0xa7, 0x94, 0xc1, 0x4b, 0xa9, 0x10, 0x0a, 0x7e, 0x2e, 0x6b, 0x7a, 0xeb, 0xf0, 0x47, 0xbb, 0xe6, 0x06, 0x32, 0xb5, 0x07, 0xb5, 0x29, 0x01, 0xd0, 0x8a, 0x5a, 0xa1, 0x91, 0xa5, 0x2e, 0xef, 0x89, 0x58, 0x87, 0xd4, 0x4e, 0xf1, 0x47, 0x3a, 0x6f, 0xd3, 0x11, 0xc4, 0x57, 0xcc, 0x53, 0xbc, 0x74, 0xa2, 0x84, 0x4d, 0x99, 0xef, 0xaa, 0xf2, 0xa1, 0x2f, 0x20, 0x2e, 0x56, 0x18, 0x96, 0x7e, 0x91, 0x2a, 0x59, 0x8c, 0xa2, 0x86, 0xd5, 0xa5, 0xf1, 0x03, 0x58, 0x6d, 0xe6, 0x7f, 0x18, 0xd1, 0x07, 0x73, 0x78, 0x3e, 0x60, 0xca, 0x87, 0x10, 0x28, 0xf4, 0xc9, 0x4e, 0xa1, 0x36, 0x3b, 0x94, 0x40, 0x44, 0x91, 0x50, 0x0e, 0x11, 0xc2, 0x31, 0x4e, 0xe6, 0xc6, 0xdd, 0x60, 0xb2, 0x9e, 0xe3, 0xe5, 0xa1, 0x96, 0xf0, 0x24, 0xef, 0xc7, 0x45, 0xad, 0xff, 0xdf, 0x68, 0x3b, 0xa7, 0x25, 0x1a, 0xdf, 0xce, 0xb7, 0x8a, 0x5b, 0x3a, 0x16, 0xc8, 0xcc, 0xa3, 0xe5, 0x7c, 0x8d, 0x0c, 0xee, 0xd8, 0x57, 0x53, 0x66, 0xcb, 0xad, 0x06, 0x72, 0x78, 0x77, 0x78, 0xea, 0xe6, 0xed, 0x14, 0x5c, 0xf9, 0xb6, 0xf2, 0x54, 0xa1, 0x51, 0xa8, 0xda, 0x51, 0xb5, 0x63, 0x3d, 0xb3, 0x34, 0x36, 0x0f, 0x9a, 0xa5, 0xb1, 0x71, 0x38, 0xc2, 0xb6, 0x91, 0x91, 0xcf, 0x88, 0x70, 0x2f, 0x7d, 0x25, 0xe9, 0x17, 0x0d, 0xd6, 0xef, 0xfd, 0xb8, 0x04, 0x16, 0xb4, 0x4f, 0x4d, 0x54, 0xe8, 0x1f, 0xd7, 0x09, 0x0f, 0x17, 0xe4, 0x3e, 0x9d, 0x2d, 0xa7, 0x2a, 0x77, 0xfd, 0x57, 0xfb, 0xab, 0xb3, 0x81, 0xd3, 0x5e, 0x2c, 0xa2, 0x10, 0x06, 0x58, 0xf5, 0xd0, 0xd9, 0xe3, 0x8a, 0xb4, 0x84, 0x14, 0x98, 0xe5, 0x21, 0xf5, 0x14, 0x55, 0x63, 0xb4, 0x82, 0x48, 0x14, 0x49, 0x0c, 0x12, 0xc2, 0x59, 0xd1, 0x22, 0xb5, 0x5a, 0x7f, 0x3f, 0x24, 0xf9, 0x24, 0x12, 0xa8, 0xb8, 0x41, 0xe5, 0xf0, 0xdc, 0x21, 0xaa, 0xb7, 0x86, 0x68, 0x3f, 0xf3, 0x20, 0xef, 0xf0, 0x4f, 0xfa, 0xcf, 0x3e, 0xdc, 0x35, 0xbc, 0xde, 0x03, 0xe1, 0x95, 0x05, 0xbf, 0x62, 0x38, 0xe3, 0x09, 0x18, 0x9b, 0x6d, 0x93, 0x3f, 0x19, 0x60, 0xb8, 0x13, 0x09, 0x83, 0xb3, 0x38, 0x95, 0x2c, 0x10, 0x5a, 0xca, 0x05, 0x61, 0x11, 0xeb, 0x10, 0x32, 0x07, 0x0b, 0xe9, 0x3f, 0x5c, 0xda, 0x4c, 0xe4, 0x49, 0xc0, 0xd6, 0xd4, 0x04, 0x28, 0x10, 0x0e, 0xe4, 0x1f, 0xa9, 0x0d, 0xc6, 0x1d, 0x03, 0x3f, 0xaf, 0x22, 0xf2, 0xb9, 0xb3, 0x05, 0xc0, 0x29, 0x15, 0x09, 0x74, 0x0c, 0xaf, 0xb2, 0x53, 0x21, 0x94, 0xd7, 0xa8, 0x1d, 0xf5, 0xf7, 0xc1, 0xa0, 0x41, 0xd1, 0x3a, 0x68, 0x90, 0x2e, 0x7e, 0xc5, 0x42, 0x02, 0x8a, 0x4c, 0xe3, 0xb3, 0xf4, 0xd0, 0x52, 0xb9, 0x2c, 0x8e, 0x23, 0x67, 0x03, 0xa8, 0x41, 0x08, 0x69, 0xd5, 0xd8, 0x2e, 0x7b, 0x56, 0x72, 0x47, 0xbd, 0x2c, 0x60, 0x71, 0xa3, 0x88, 0x5b, 0x90, 0x57, 0x83, 0x6b, 0x9d, 0xb6, 0x0f, 0x08, 0x41, 0x9b, 0x2d, 0x7f, 0xa2, 0x61, 0x61, 0x98, 0x7d, 0xa3, 0x63, 0x76, 0x75, 0x46, 0x18, 0xbe, 0xaa, 0xba, 0xc0, 0xfc, 0x8e, 0x7c, 0x71, 0x42, 0xf4, 0xe0, 0xc4, 0x12, 0x6a, 0x0d, 0xce, 0x7d, 0xc9, 0x49, 0x52, 0x8d, 0x0a, 0x77, 0x34, 0xe1, 0x5b, 0xdd, 0x31, 0x97, 0x72, 0x2b, 0xce, 0x6f, 0x22, 0xb9, 0x8e, 0x2c, 0x2c, 0x11, 0x68, 0x3e, 0x57, 0xad, 0x78, 0x9f, 0xc3, 0x02, 0xf5, 0xfb, 0x7a, 0xbd, 0x63, 0x13, 0x48, 0x4c, 0x0a, 0x63, 0xcd, 0xa0, 0xa6, 0x02, 0xd0, 0x31, 0x60, 0xcb, 0xd6, 0x43, 0xfd, 0xba, 0xf3, 0x68, 0x56, 0x98, 0xe1, 0x47, 0x08, 0xdb, 0x4f, 0x9b, 0x6c, 0xc8, 0x7b, 0x7f, 0xca, 0xda, 0x03, 0xe8, 0xc9, 0x67, 0xf9, 0x73, 0x2a, 0x81, 0x35, 0x61, 0xb6, 0x1b, 0xef, 0xdf, 0x75, 0x6c, 0x8d, 0x8b, 0x21, 0x99, 0xb9, 0x35, 0xda, 0x8e, 0xb7, 0xe2, 0x1b, 0x2c, 0xf5, 0x17, 0xed, 0xaa, 0xe4, 0x54, 0x5b, 0x35, 0x07, 0xde, 0x25, 0xda, 0x4a, 0xc1, 0xb9, 0xa6, 0x94, 0x16, 0x5e, 0x0c, 0x9f, 0x82, 0xb3, 0x86, 0x08, 0xff, 0x58, 0x7f, 0xa2, 0xdf, 0xeb, 0x71, 0x10, 0x0e, 0x36, 0x4b, 0x93, 0x97, 0xa6, 0x15, 0x20, 0x69, 0xff, 0xd6, 0xb6, 0x5c, 0x4f, 0xb6, 0xee, 0x6f, 0x21, 0x60, 0xd4, 0x53, 0xf2, 0xaa, 0xf5, 0x2e, 0xe9, 0x78, 0xb9, 0x99, 0xc2, 0xdd, 0xf3, 0xea, 0x0c, 0x84, 0xb7, 0xb9, 0x94, 0x4f, 0x6c, 0x9d, 0x21, 0x3d, 0x21, 0x37, 0x61, 0x91, 0x25, 0x72, 0x24, 0x31, 0xd1, 0x08, 0xc8, 0x4c, 0xa9, 0x49, 0xf4, 0x3f, 0xa4, 0x18, 0x8a, 0xba, 0xc7, 0x36, 0xd6, 0x1e, 0xf8, 0xc3, 0x0c, 0x2a, 0x12, 0x01, 0xf1, 0xd7, 0x35, 0x5c, 0xd8, 0x80, 0x60, 0xa7, 0xd0, 0x46, 0x41, 0xa9, 0x1c, 0xb3, 0x4b, 0xd8, 0xe3, 0x9e, 0x0a, 0x64, 0x29, 0x4e, 0xb3, 0x77, 0xfe, 0xe2, 0x00, 0xbc, 0xf5, 0xef, 0x3a, 0x1e, 0xd8, 0x6c, 0x97, 0xd2, 0x9a, 0xcb, 0xc7, 0x97, 0x8d, 0x69, 0xca, 0x3c, 0xd5, 0x28, 0x04, 0x63, 0x1d, 0x5a, 0x93, 0x86, 0x89, 0xe2, 0xe0, 0x37, 0xeb, 0x95, 0x74, 0xac, 0x39, 0xe7, 0x0e, 0x7a, 0x3f, 0xc3, 0xf2, 0xa1, 0x91, 0xba, 0x83, 0xc9, 0xc4, 0x60, 0x14, 0xcb, 0xdd, 0xf3, 0xfc, 0x73, 0x0a, 0x3e, 0xe8, 0x85, 0x90, 0xbd, 0x76, 0xfd, 0x05, 0x02, 0xff, 0x9b, 0xbf, 0x57, 0xb3, 0x9f, 0x8c, 0xa5, 0xec, 0xd2, 0xa3, 0x95, 0xbc, 0xc5, 0xdb, 0xf4, 0xc8, 0x5d, 0x1b, 0x5c, 0x5a, 0x8f, 0x12, 0x11, 0xb1, 0x69, 0x28, 0x29, 0x9c, 0x52, 0xb4, 0xf0, 0x47, 0x92, 0x6f, 0x8a, 0x54, 0x15, 0x29, 0xda, 0x2d, 0x6b, 0xba, 0xa3, 0x99, 0x14, 0x3c, 0xed, 0x8e, 0xfb, 0x77, 0xab, 0x47, 0x40, 0x9d, 0x9a, 0x95, 0x3a, 0x38, 0x6c, 0x7a, 0xbd, 0x60, 0x26, 0xf4, 0x98, 0x31, 0xc7, 0x17, 0x62, 0x7c, 0x2a, 0x5e, 0x77, 0xbd, 0x2d, 0x43, 0x3d, 0x4d, 0x13, 0x0d, 0xac, 0xd9, 0x27, 0xea, 0x0d, 0x13, 0xa2, 0x3d, 0x01, 0xa7, 0xcf, 0x39, 0xc6, 0x71, 0x6d, 0xaf, 0xb6, 0xed, 0x55, 0x24, 0x10, 0xef, 0x5d, 0x27, 0xfb, 0x94, 0x7b, 0xe2, 0xc8, 0x78, 0x2e, 0xee, 0x78, 0x29, 0x19, 0x6c, 0x7e, 0xdc, 0xf1, 0x51, 0xc6, 0x5f, 0x9a, 0x01, 0xf5, 0x4f, 0x8d, 0x20, 0xf3, 0x8b, 0x7d, 0xa4, 0xa7, 0xe8, 0x3a, 0x2f, 0x01, 0x27, 0xd5, 0x9d, 0x3e, 0x24, 0x05, 0xd8, 0x67, 0x4f, 0xc9, 0xf4, 0x1b, 0x60, 0x4f, 0x78, 0x8f, 0x47, 0x15, 0xf9, 0xd3, 0x62, 0x4e, 0xee, 0x57, 0xf3, 0x87, 0xbf, 0xad, 0xd1, 0x8a, 0x1f, 0x90, 0x5e, 0x83, 0x9c, 0x26, 0xb8, 0x61, 0x74, 0x82, 0x34, 0x7f, 0xab, 0x6d, 0x08, 0x84, 0x5a, 0x66, 0x47, 0x88, 0x4a, 0xe7, 0x13, 0x78, 0xc1, 0xea, 0x0e, 0xbb, 0x9c, 0xac, 0x11, 0x15, 0x9e, 0xb1, 0x21, 0xcc, 0x08, 0x08, 0x9e, 0x0a, 0x6a, 0xd0, 0xbe, 0x83, 0xb8, 0xfb, 0x3a, 0x57, 0xa0, 0x52, 0x47, 0x3a, 0x1b, 0xb9, 0xc8, 0xd2, 0x43, 0xb5, 0xc2, 0x60, 0x64, 0x2b, 0x10, 0xa3, 0x55, 0x6b, 0x58, 0xfa, 0x09, 0x6c, 0x3d, 0xc8, 0x61, 0x59, 0xd6, 0x1c, 0x44, 0x4d, 0x5f, 0x92, 0xf2, 0x5c, 0x2f, 0x74, 0x95, 0xd2, 0xea, 0x25, 0x1a, 0xbf, 0xf8, 0xc0, 0x3e, 0xb3, 0x36, 0xfc, 0xec, 0xc6, 0xeb, 0x53, 0xc6, 0xdb, 0xfd, 0x63, 0x02, 0x26, 0x65, 0x94, 0x77, 0xec, 0xe0, 0xfb, 0xf7, 0x8a, 0xe7, 0x7e, 0xe0, 0xb9, 0xe2, 0x39, 0xee, 0x10, 0x99, 0x21, 0x53, 0xcb, 0xeb, 0xe7, 0x0a, 0xca, 0xc2, 0x20, 0x68, 0xdd, 0x46, 0xa2, 0xf4, 0x3e, 0x51, 0x31, 0x78, 0x5f, 0x23, 0x5b, 0x58, 0xe6, 0x58, 0xa0, 0x23, 0xf6, 0x17, 0xd6, 0x68, 0xb1, 0x8b, 0xcc, 0xcb, 0xfb, 0x97, 0x2e, 0x57, 0x80, 0xc5, 0xa8, 0x16, 0xf8, 0x80, 0x4e, 0xdf, 0xaa, 0x84, 0x3c, 0x70, 0x2e, 0x92, 0x79, 0xbd, 0x78, 0x68, 0x22, 0x87, 0x12, 0xf0, 0xc4, 0x2f, 0xa9, 0xb8, 0x09, 0xcd, 0xcb, 0xa2, 0x97, 0x7d, 0xef, 0xdd, 0x35, 0xf9, 0xb6, 0x13, 0x2f, 0x6d, 0x70, 0xe4, 0xfc, 0x86, 0xe2, 0x94, 0x1f, 0xcc, 0x47, 0x00, 0x4b, 0x33, 0x94, 0xd7, 0xca, 0xec, 0x00, 0x06, 0x20, 0x81, 0xc4, 0x74, 0xeb, 0x21, 0x1f, 0xf0, 0x0d, 0x39, 0x9e, 0x68, 0x0d, 0x44, 0x9a, 0x5b, 0xbb, 0xe3, 0x02, 0x90, 0x13, 0x30, 0x5b, 0x09, 0x64, 0x4f, 0x04, 0x33, 0xb2, 0x47, 0xbf, 0x5f, 0x58, 0x10, 0x6d, 0x75, 0xf1, 0xee, 0x19, 0xe7, 0x79, 0xfd, 0x38, 0xe5, 0xb0, 0x0c, 0x2f, 0xd0, 0xbf, 0xae, 0x16, 0xf0, 0x1e, 0x8f, 0xbc, 0x69, 0xb5, 0x05, 0xeb, 0x6b, 0x42, 0xe7, 0xed, 0xaa, 0xfa, 0xa2, 0x4e, 0x0e, 0x73, 0x89, 0xe4, 0xab, 0xc1, 0x6d, 0x0d, 0xf3, 0xe0, 0x6e, 0x38, 0x2a, 0x52, 0x10, 0xa7, 0x1b, 0x08, 0x92, 0x73, 0x0a, 0x86, 0x7b, 0xd0, 0xe9, 0x43, 0x75, 0x92, 0xcf, 0x4e, 0x5e, 0xf0, 0xa5, 0x37, 0x9d, 0x88, 0x23, 0x2d, 0xb2, 0xa4, 0xfb, 0x64, 0x11, 0xbc, 0x53, 0xba, 0x31, 0x3c, 0x79, 0x99, 0xe0, 0x86, 0xd2, 0x1f, 0xd9, 0x3b, 0x14, 0x7c, 0x98, 0xb7, 0xb5, 0x9c, 0x6d, 0xda, 0xa4, 0x07, 0xd0, 0x0e, 0x36, 0x05, 0xf4, 0x85, 0x63, 0x05, 0x9f, 0xc3, 0x32, 0x3f, 0x38, 0x5d, 0x72, 0x99, 0x22, 0x00, 0xab, 0xc7, 0x48, 0xb4, 0x54, 0xb7, 0xf9, 0x62, 0x46, 0x2c, 0xf7, 0x94, 0x71, 0xa9, 0xca, 0x7d, 0xce, 0x90, 0x5a, 0x39, 0x94, 0x8b, 0xbd, 0x56, 0xaf, 0x2b, 0x4e, 0x92, 0x6e, 0xcf, 0xff, 0xe6, 0x7c, 0xc8, 0xf0, 0xc4, 0x11, 0xba, 0x40, 0x9e, 0x69, 0x45, 0x23, 0xa7, 0x76, 0xe5, 0x34, 0xdd, 0xd2, 0x17, 0x0d, 0x47, 0xf7, 0xbe, 0x15, 0x7b, 0xb2, 0xc4, 0x9a, 0x64, 0xd5, 0x04, 0x20, 0x42, 0x2d, 0x68, 0xf8, 0xf2, 0xb3, 0x4e, 0x14, 0x70, 0x06, 0x31, 0x19, 0x9a, 0x19, 0x85, 0xb6, 0x37, 0x29, 0xe2, 0x35, 0x37, 0xf3, 0x65, 0x4f, 0x3c, 0x23, 0x54, 0x45, 0x5a, 0x0f, 0x00, 0x2c, 0x1b, 0xa5, 0xf0, 0x88, 0xc7, 0xa2, 0x3b, 0x1d, 0xe2, 0x06, 0x36, 0x02, 0xf5, 0xc4, 0x4f, 0xf7, 0x92, 0xbd, 0x39, 0xf8, 0x92, 0xef, 0x4a, 0x13, 0xa1, 0xea, 0x21, 0x76, 0xfd, 0x84, 0x8b, 0xcc, 0x7a, 0xce, 0xa8, 0xca, 0xca, 0x47, 0x49, 0x04, 0xfb, 0x4f, 0x9d, 0x06, 0x41, 0xde, 0x0d, 0xa0, 0xf6, 0x75, 0x64, 0x81, 0xdf, 0x55, 0x33, 0x07, 0xb1, 0xf0, 0x74, 0x56, 0xd3, 0x9d, 0x6d, 0xa8, 0x66, 0x8f, 0xd7, 0xe4, 0x83, 0x08, 0x40, 0x71, 0xc3, 0xca, 0xae, 0x4c, 0x05, 0xcf, 0x85, 0x58, 0x6b, 0x39, 0xaa, 0xf6, 0xa6, 0x8c, 0xe9, 0xd6, 0x74, 0x1b, 0x94, 0x0d, 0x66, 0xc0, 0x6d, 0x67, 0xe7, 0xd0, 0xc6, 0xfe, 0x7a, 0x4e, 0xe7, 0x0b, 0x43, 0x5f, 0xb0, 0xfd, 0xc9, 0xfe, 0x80, 0xc8, 0xfa, 0xf1, 0x55, 0x80, 0x70, 0xfc, 0x34, 0x26, 0xf2, 0x54, 0xcb, 0xc2, 0x3e, 0x56, 0x55, 0xb1, 0x05, 0x79, 0xbe, 0x41, 0x38, 0x82, 0x07, 0x7b, 0x82, 0xf7, 0xed, 0x40, 0x16, 0xd5, 0xc5, 0x98, 0xaa, 0x85, 0xab, 0x46, 0xc3, 0x0d, 0xdb, 0xa0, 0x34, 0x84, 0x5f, 0x9d, 0xe1, 0xc8, 0xeb, 0x30, 0xc9, 0x73, 0x05, 0xd4, 0x44, 0x0a, 0x68, 0x68, 0x88, 0x78, 0xab, 0x3e, 0x72, 0xbb, 0x1e, 0x6f, 0x84, 0xde, 0xf5, 0x71, 0x2a, 0x27, 0xa8, 0xeb, 0x41, 0x91, 0x99, 0xc7, 0xd9, 0x7c, 0xf8, 0x89, 0x3a, 0xa4, 0xe3, 0xe0, 0x26, 0x50, 0xd2, 0x7b, 0x5e, 0xcc, 0x33, 0x1e, 0x68, 0x18, 0x51, 0xf5, 0x8e, 0xe2, 0x7a, 0x28, 0x2a, 0xb2, 0x61, 0xaf, 0x21, 0x65, 0xc1, 0x68, 0xae, 0xdc, 0x43, 0x67, 0x61, 0xf5, 0xa2, 0x8d, 0x67, 0xba, 0x0d, 0x5c, 0x0b, 0xd9, 0xcd, 0x09, 0x7d, 0x55, 0x27, 0xd3, 0xd2, 0x7a, 0x84, 0x94, 0x4d, 0x16, 0xcf, 0x96, 0xdd, 0xe6, 0x1f, 0xa7, 0xe6, 0x4f, 0x96, 0x70, 0x44, 0x4e, 0x89, 0x02, 0x8e, 0xb2, 0xe0, 0xb2, 0x97, 0x89, 0xc0, 0x27, 0x3b, 0xd8, 0x68, 0xb1, 0x58, 0x8f, 0x59, 0xdc, 0x1a, 0xbb, 0xba, 0x46, 0x7c, 0xfe, 0xfa, 0xad, 0x0b, 0x3c, 0xb7, 0x4c, 0xed, 0x98, 0xdf, 0x68, 0x23, 0x9f, 0x15, 0x26, 0x0b, 0xc2, 0x56, 0x9f, 0x29, 0x0a, 0xdc, 0x36, 0x26, 0x07, 0x42, 0x2a, 0x19, 0x0a, 0xea, 0x67, 0x06, 0x94, 0x9c, 0xa2, 0xa4, 0x0d, 0x6f, 0xa4, 0x64, 0xb9, 0xed, 0xe6, 0xae, 0xe9, 0x72, 0x5f, 0x6e, 0x6e, 0xd5, 0x9a, 0xcf, 0x53, 0x4a, 0x0b, 0x46, 0xcc, 0x87, 0xa3, 0xd3, 0x69, 0x26, 0xa2, 0x84, 0x8f, 0x4b, 0xad, 0x3a, 0x29, 0x86, 0x20, 0xaf, 0x9b, 0xfb, 0xa5, 0xb8, 0xf7, 0xc0, 0x06, 0xc8, 0x74, 0x86, 0x3f, 0xb6, 0x1c, 0x7c, 0xd8, 0xc0, 0xc4, 0x70, 0x71, 0xcf, 0x41, 0x37, 0x9f, 0xfd, 0xd9, 0x50, 0xf6, 0x54, 0xf8, 0xc4, 0x67, 0xd8, 0x24, 0x50, 0xcd, 0xc8, 0x33, 0xc6, 0xc2, 0x22, 0xbc, 0xb1, 0xb7, 0x65, 0xcb, 0x38, 0x44, 0x9a, 0xd9, 0x45, 0xbc, 0x95, 0xfb, 0xe6, 0x05, 0x79, 0x59, 0xf3, 0xa6, 0x7a, 0xe2, 0xf1, 0x22, 0xe7, 0x3e, 0x36, 0x85, 0x67, 0x04, 0x4e, 0x3c, 0x83, 0x2e, 0x9e, 0x29, 0x64, 0xca, 0x47, 0xf7, 0xde, 0xf2, 0x4d, 0xab, 0xae, 0xfd, 0xf9, 0x7c, 0x00, 0xf7, 0x7b, 0xe5, 0x35, 0x4f, 0xd4, 0xf8, 0xe2, 0xd0, 0xf3, 0xf5, 0x1c, 0xd2, 0x1e, 0x1b, 0xf3, 0xb2, 0x94, 0xbe, 0x3c, 0x7f, 0x71, 0x9a, 0x94, 0xf6, 0xd1, 0x67, 0xa1, 0xb1, 0x38, 0xae, 0x9b, 0x9b, 0x32, 0xda, 0x0b, 0xa7, 0x36, 0x92, 0xd3, 0xc2, 0xd0, 0x46, 0x6f, 0x06, 0x00, 0x08, 0x7a, 0x30, 0xdd, 0x9e, 0x74, 0x54, 0x7d, 0xd5, 0xc2, 0xcf, 0x19, 0x18, 0xf6, 0x7e, 0x6d, 0x40, 0x51, 0x2d, 0x5e, 0xae, 0x86, 0x52, 0xdf, 0x97, 0xc1, 0xfc, 0x15, 0xa0, 0xe8, 0x06, 0xb9, 0xab, 0x21, 0x90, 0xbf, 0xf0, 0x94, 0xaf, 0x35, 0x4f, 0x72, 0x64, 0x6d, 0xe4, 0x36, 0xcb, 0x5e, 0xdd, 0x2b, 0x95, 0x48, 0x88, 0x2e, 0xb8, 0x97, 0xb0, 0xb5, 0x65, 0x0a, 0x2a, 0x10, 0x3b, 0x14, 0xab, 0xef, 0xba, 0x83, 0xdd, 0x25, 0xfa, 0x5f, 0xb1, 0xab, 0x9d, 0x15, 0xf6, 0xe8, 0x02, 0xd4, 0x2b, 0x2f, 0xbb, 0x38, 0x91, 0x8a, 0x42, 0x26, 0x85, 0xb6, 0xe7, 0xf7, 0x0d, 0x6e, 0x0d, 0xd8, 0xb1, 0xed, 0x96, 0x70, 0x8c, 0xae, 0x9c, 0xc4, 0xa2, 0x76, 0x62, 0x58, 0x74, 0x94, 0x8a, 0x97, 0xd2, 0x67, 0x88, 0x75, 0xf1, 0x22, 0x56, 0x53, 0xbd, 0xcc, 0x69, 0x23, 0x70, 0x8b, 0xe5, 0xcc, 0x64, 0x21, 0x0d, 0xd0, 0x25, 0xb7, 0xfd, 0x2c, 0xcb, 0xda, 0x9b, 0x80, 0x87, 0xc3, 0xcb, 0x6f, 0x7b, 0xdb, 0xe2, 0x49, 0xcf, 0x7e, 0x5e, 0xe7, 0x01, 0xff, 0xd4, 0xd7, 0x7c, 0xed, 0x29, 0xba, 0x6d, 0x95, 0x05, 0xe9, 0xd2, 0xc8, 0x85, 0x5f, 0xd3, 0xdf, 0x30, 0xd3, 0x56, 0xfb, 0x2d, 0x24, 0xce, 0x92, 0xb3, 0xfa, 0x53, 0x27, 0xc0, 0xab, 0xf8, 0x58, 0x0e, 0x5b, 0x59, 0x1e, 0x43, 0x68, 0x73, 0x51, 0x67, 0x05, 0xb9, 0x6a, 0x9c, 0x24, 0x64, 0x8d, 0x09, 0x9a, 0x0a, 0xc7, 0x18, 0x7d, 0x72, 0x94, 0xe1, 0xd1, 0xa7, 0xa4, 0xe6, 0x64, 0x4b, 0xde, 0x00, 0xf7, 0x2e, 0xa6, 0x99, 0x9e, 0x1f, 0x5b, 0x1c, 0x6a, 0x02, 0x24, 0xaa, 0x44, 0x23, 0xed, 0x0f, 0x1c, 0xca, 0xac, 0xf4, 0x44, 0x10, 0xe9, 0x55, 0x16, 0xf0, 0x7d, 0x36, 0xdd, 0xa1, 0x9a, 0x92, 0xf3, 0x23, 0x0b, 0x95, 0x26, 0x19, 0xbd, 0x0b, 0x60, 0xd6, 0x7f, 0x17, 0x88, 0xba, 0x06, 0x28, 0xa3, 0xbf, 0x34, 0x29, 0x3f, 0x4f, 0x9a, 0xf8, 0x11, 0x59, 0x3b, 0x1a, 0xdd, 0xa3, 0x92, 0xad, 0x96, 0x62, 0xd7, 0x9d, 0xc7, 0x08, 0x7f, 0x1b, 0x31, 0x5d, 0x02, 0x4b, 0xb5, 0xd1, 0xe0, 0x3d, 0x75, 0x10, 0xe6, 0x1f, 0x37, 0xd8, 0xad, 0xb1, 0x0a, 0x07, 0x65, 0xf9, 0x2b, 0xf9, 0xd0, 0x37, 0x29, 0x10, 0x91, 0x1b, 0x48, 0x94, 0xa7, 0x36, 0x23, 0xbe, 0x35, 0xaf, 0x96, 0x0f, 0x84, 0x37, 0xdb, 0xe6, 0x4a, 0x3e, 0xf3, 0x52, 0x2d, 0x67, 0x48, 0x25, 0x83, 0x3a, 0x90, 0x4a, 0x5c, 0x1a, 0xf4, 0x58, 0xc2, 0x76, 0x72, 0x66, 0x3f, 0x43, 0x80, 0x22, 0xa0, 0xa9, 0xf2, 0x1d, 0xf9, 0xfc, 0x1d, 0x69, 0xe9, 0xef, 0x3d, 0x66, 0x1f, 0x04, 0x14, 0xd9, 0x1d, 0x47, 0xd4, 0x3e, 0x3c, 0x3c, 0x3f, 0x60, 0xf1, 0x16, 0x0d, 0x26, 0x4e, 0x29, 0x8e, 0xb0, 0xcc, 0xa2, 0x90, 0xa2, 0x47, 0x76, 0x83, 0xc0, 0x4a, 0x98, 0xdb, 0xbc, 0x8d, 0x6f, 0xb6, 0x4b, 0xbc, 0x87, 0xbf, 0x7e, 0x7a, 0x87, 0x52, 0x50, 0xa6, 0x63, 0xe1, 0x7c, 0xdd, 0xd2, 0x96, 0x91, 0x40, 0x03, 0x39, 0x47, 0x77, 0x8b, 0x55, 0x14, 0xf6, 0xa3, 0x96, 0xfb, 0x7e, 0x90, 0x76, 0xa5, 0xe7, 0x62, 0x18, 0xb2, 0x1e, 0xe1, 0x74, 0x51, 0x6a, 0xc5, 0xb5, 0x0e, 0xf3, 0x25, 0xdf, 0xec, 0x84, 0x32, 0xb5, 0xb4, 0x90, 0x25, 0xda, 0x8c, 0x73, 0x76, 0x36, 0xcb, 0xfb, 0x4f, 0x9b, 0x0c, 0x27, 0x40, 0xa9, 0x82, 0x2e, 0x34, 0xef, 0x8b, 0xc3, 0xa4, 0x52, 0x87, 0x98, 0x0a, 0xb3, 0xea, 0x21, 0x99, 0xcc, 0x90, 0x9a, 0x2b, 0x5b, 0x51, 0x4b, 0x7b, 0x83, 0xd6, 0x0b, 0x94, 0x6f, 0xaa, 0x03, 0x89, 0x38, 0x94, 0xb4, 0x67, 0x09, 0x25, 0x3c, 0x68, 0x81, 0x8d, 0xd4, 0x69, 0x58, 0xb3, 0x9e, 0x9e, 0x46, 0x84, 0x9e, 0x85, 0x20, 0x8a, 0x05, 0x18, 0x45, 0xc1, 0xb6, 0x47, 0x38, 0xa7, 0x03, 0xa5, 0x8e, 0x93, 0xb7, 0x62, 0x0b, 0x47, 0x5a, 0x79, 0x08, 0xc8, 0xb0, 0x2a, 0x17, 0x6e, 0x83, 0xab, 0xea, 0x37, 0xa2, 0x1b, 0x71, 0x60, 0x2a, 0xb7, 0x43, 0x37, 0x04, 0x50, 0x3f, 0x2b, 0xaf, 0xfd, 0x73, 0x25, 0x40, 0x0d, 0x3d, 0x1b, 0xa7, 0x3f, 0xaf, 0xe2, 0x33, 0x36, 0x38, 0x43, 0x59, 0x27, 0x81, 0x52, 0xb1, 0xd5, 0x96, 0xfb, 0x41, 0xbf, 0x46, 0xde, 0xfe, 0x97, 0xcc, 0x5d, 0x90, 0xf7, 0xaf, 0xf2, 0x56, 0x50, 0xe6, 0xc6, 0xaa, 0x23, 0x40, 0x80, 0x66, 0x73, 0x03, 0x5b, 0xa6, 0x7a, 0xd3, 0x7c, 0xd0, 0x9b, 0xd6, 0x82, 0xd2, 0x98, 0x16, 0x5e, 0xab, 0x05, 0x27, 0x65, 0x2d, 0xfc, 0x09, 0xa3, 0x01, 0x13, 0x4f, 0x73, 0xeb, 0x8b, 0x81, 0x4d, 0x4f, 0xca, 0xc0, 0xde, 0xf5, 0x0b, 0xa8, 0x5e, 0x09, 0x55, 0x7b, 0x1e, 0x66, 0xa9, 0x7b, 0x60, 0x14, 0x80, 0x97, 0x6c, 0x0e, 0x75, 0x4a, 0xe0, 0x49, 0x3e, 0xc1, 0x48, 0xf3, 0xe0, 0x3c, 0xee, 0xf8, 0x23, 0xb6, 0xf4, 0xcb, 0x44, 0xc8, 0x9f, 0x63, 0xeb, 0xcb, 0xf6, 0x84, 0x5c, 0x3d, 0x8c, 0x3f, 0xf1, 0x65, 0x9a, 0xbc, 0xc8, 0x3a, 0x50, 0x37, 0xb9, 0x82, 0x6d, 0x49, 0x8b, 0x37, 0x0e, 0x69, 0x67, 0x2e, 0xc3, 0xb2, 0x8c, 0xfb, 0xe8, 0xe7, 0x45, 0x0f, 0x33, 0xb4, 0x18, 0x23, 0x89, 0x36, 0x41, 0xda, 0x16, 0xbe, 0x5f, 0xa1, 0x9c, 0xd2, 0x6c, 0xda, 0x0b, 0x75, 0xf2, 0x3b, 0x53, 0xa9, 0x7c, 0x70, 0x76, 0x31, 0x4b, 0x08, 0xe1, 0x9b, 0x4b, 0x8e, 0xfc, 0x7e, 0x46, 0xf6, 0x00, 0x01, 0x56, 0x3c, 0x09, 0x9c, 0xa0, 0x47, 0x6c, 0x23, 0x3f, 0x13, 0x4a, 0x00, 0x7f, 0x0f, 0x65, 0xbf, 0x4c, 0xc4, 0x33, 0xd1, 0xea, 0xb8, 0x31, 0x89, 0xe6, 0x92, 0x7a, 0x6b, 0x4c, 0x7e, 0x98, 0xa6, 0x1a, 0xd3, 0x9a, 0xdf, 0xf5, 0xf4, 0x66, 0x30, 0x1b, 0x74, 0x51, 0x71, 0x99, 0x7d, 0xed, 0xb6, 0xbe, 0x72, 0x22, 0x18, 0xcf, 0xd3, 0x81, 0xb9, 0xfc, 0x61, 0xd4, 0x02, 0x93, 0x83, 0xfa, 0x2f, 0x74, 0xe9, 0xf2, 0x0e, 0xc5, 0x6f, 0x35, 0x03, 0xe6, 0x44, 0x49, 0x50, 0xa7, 0x4b, 0x93, 0x93, 0xb9, 0xc1, 0x6d, 0x90, 0x63, 0x21, 0x78, 0x31, 0x76, 0x44, 0x33, 0xcb, 0x83, 0xcd, 0xcd, 0xa3, 0x4b, 0xc4, 0x38, 0xb1, 0x77, 0x81, 0x7f, 0xa4, 0x8a, 0xcc, 0x59, 0x26, 0x13, 0x42, 0xfe, 0x60, 0x27, 0xfb, 0x39, 0xc1, 0x0e, 0x69, 0xbf, 0xfb, 0x3d, 0x83, 0xbf, 0x4f, 0x84, 0x23, 0xba, 0x0b, 0x89, 0xad, 0x95, 0x51, 0x75, 0xf2, 0xed, 0x19, 0xed, 0x54, 0xaa, 0x79, 0x44, 0x2a, 0xd7, 0x25, 0xef, 0x66, 0xb1, 0x32, 0x39, 0x75, 0xfd, 0x1f, 0x38, 0x66, 0x9f, 0x15, 0xff, 0x4f, 0x69, 0x6e, 0x15, 0xec, 0x31, 0x75, 0x26, 0x8a, 0x26, 0x6c, 0xf9, 0x23, 0x64, 0xd4, 0xa2, 0xcb, 0xc5, 0xe8, 0xf9, 0x4a, 0xfa, 0x6b, 0x4a, 0x0b, 0xdb, 0xa3, 0x4e, 0x35, 0xfc, 0xa6, 0x5a, 0x17, 0x81, 0xd4, 0xd7, 0xc9, 0x33, 0xa5, 0xf2, 0x10, 0xd3, 0xa5, 0x94, 0x83, 0xae, 0xbc, 0x95, 0xec, 0x71, 0xb3, 0x2d, 0xf1, 0x3f, 0xf4, 0xab, 0xf4, 0x01, 0x91, 0x69, 0x37, 0xfd, 0x88, 0xff, 0x44, 0xab, 0x46, 0xb7, 0x8c, 0xc3, 0x69, 0x41, 0x4e, 0x9b, 0xca, 0xa8, 0xba, 0xb0, 0xbb, 0x85, 0x57, 0x82, 0x8d, 0x73, 0xa2, 0xa6, 0x56, 0xc2, 0xf8, 0x16, 0xf0, 0x70, 0xb5, 0xcb, 0x45, 0x54, 0x9e, 0x8e, 0xca, 0x9d, 0x7c, 0x0b, 0x4a, 0x7b, 0x0a, 0x27, 0xe5, 0x1c, 0x11, 0x93, 0x58, 0xda, 0xd2, 0xa1, 0x7f, 0xb3, 0xa4, 0x57, 0x18, 0xf9, 0xde, 0xc3, 0xc9, 0x4a, 0xf7, 0x8d, 0x65, 0xc3, 0xec, 0xd3, 0x6b, 0x71, 0xe2, 0x30, 0xcf, 0x08, 0x0d, 0x1e, 0xfd, 0xd8, 0xd0, 0x7f, 0x1c, 0xfc, 0x26, 0x76, 0x8f, 0xd5, 0x40, 0x7b, 0xc2, 0xb7, 0x70, 0xaf, 0x23, 0xe1, 0x45, 0x6c, 0x6e, 0xb3, 0xf8, 0x21, 0x2e, 0x1b, 0x06, 0x5d, 0x81, 0x51, 0x1f, 0x29, 0x1b, 0xc4, 0x3f, 0x9b, 0x8d, 0x54, 0x1b, 0xa8, 0xc7, 0xc1, 0xbe, 0x3a, 0xdc, 0x63, 0x74, 0x82, 0x06, 0x1c, 0xe7, 0x90, 0xea, 0x8c, 0x88, 0x21, 0x1d, 0x83, 0x30, 0xb8, 0xe6, 0xbc, 0x07, 0xf0, 0x46, 0xc8, 0xa6, 0x10, 0x35, 0x48, 0x78, 0xe0, 0x2f, 0x5f, 0x66, 0xbb, 0xef, 0x67, 0xb3, 0xe6, 0x7b, 0xe3, 0x24, 0x20, 0x60, 0xb5, 0x65, 0x7a, 0x3f, 0x92, 0xa8, 0x69, 0x88, 0xb2, 0x8f, 0x1a, 0x86, 0xcc, 0x4c, 0x05, 0x9c, 0x41, 0x07, 0xc5, 0xce, 0x98, 0x7f, 0x27, 0x82, 0x2a, 0xf5, 0x81, 0x88, 0x1e, 0x46, 0x45, 0x59, 0x98, 0x57, 0xd5, 0x9c, 0x2e, 0xb5, 0x99, 0xef, 0x9c, 0x7d, 0x50, 0xe3, 0xb8, 0x7a, 0xa3, 0x48, 0xa8, 0x8e, 0x00, 0xac, 0x52, 0x53, 0xa5, 0x1e, 0x14, 0x01, 0xfb, 0x38, 0xb5, 0x93, 0x26, 0x5c, 0x9c, 0x25, 0xda, 0x3d, 0x40, 0xa1, 0x70, 0xa1, 0xe0, 0x9a, 0x39, 0x66, 0x74, 0x78, 0x12, 0xc3, 0xe3, 0xd6, 0x38, 0xd1, 0x76, 0x28, 0x5e, 0x4a, 0x8d, 0xa1, 0xfd, 0x90, 0x91, 0x54, 0xec, 0xf1, 0x29, 0x99, 0x30, 0x29, 0xb1, 0xb2, 0x15, 0x28, 0xe8, 0xae, 0x7e, 0x16, 0xe8, 0x8e, 0x79, 0x95, 0x5c, 0xa7, 0x16, 0x46, 0xed, 0x47, 0x7a, 0x8e, 0xfd, 0x9b, 0x2f, 0x9a, 0x98, 0xd0, 0xbe, 0xa0, 0xa7, 0x79, 0x80, 0x68, 0x67, 0x31, 0xb1, 0x0c, 0x1a, 0x81, 0xc6, 0xfc, 0xfd, 0x04, 0x00, 0x44, 0x79, 0xc8, 0x42, 0x12, 0x9d, 0xf8, 0x20, 0x72, 0xcc, 0xb8, 0x38, 0x5d, 0xb3, 0x51, 0xc5, 0xf2, 0x7e, 0x8e, 0x71, 0x03, 0x4c, 0x66, 0x6b, 0xd3, 0xe0, 0xda, 0xba, 0x1e, 0x99, 0x21, 0xd1, 0x5a, 0xa4, 0x03, 0x63, 0x3d, 0x70, 0x83, 0x78, 0x7f, 0x62, 0xc0, 0xc1, 0xe1, 0xcb, 0x1d, 0x28, 0x6e, 0x17, 0xa0, 0xac, 0x01, 0x47, 0x98, 0x6c, 0x07, 0xa1, 0x83, 0x01, 0x86, 0xa5, 0x2e, 0x11, 0x5f, 0x44, 0x1e, 0x21, 0xd0, 0x4d, 0x2f, 0xab, 0x3c, 0x28, 0x7b, 0x71, 0x2f, 0xc6, 0x7d, 0x10, 0x9d, 0xd8, 0x77, 0xd8, 0x6a, 0x3f, 0x10, 0xdb, 0x2f, 0xc4, 0x42, 0x44, 0x3c, 0x0a, 0x73, 0xeb, 0xd9, 0xc0, 0xe2, 0x26, 0xd2, 0x1b, 0x45, 0xe1, 0x32, 0x84, 0xb1, 0xf1, 0x4e, 0x8e, 0xb9, 0xa5, 0x05, 0x2a, 0xda, 0x9e, 0x47, 0x1e, 0x17, 0xe1, 0xd4, 0xb3, 0xe0, 0x2b, 0x46, 0xae, 0x38, 0x85, 0x52, 0x82, 0x17, 0x17, 0x4b, 0xc4, 0x0d, 0x41, 0xe7, 0xdf, 0x29, 0xe8, 0x46, 0x09, 0x19, 0x0e, 0x30, 0x76, 0x92, 0xa6, 0x9f, 0xcb, 0xf3, 0xa6, 0x7d, 0xd5, 0x25, 0x5d, 0xae, 0x7b, 0xc5, 0x07, 0x51, 0xf1, 0x85, 0x9f, 0x43, 0x2f, 0xcf, 0xf4, 0xe5, 0xa2, 0xac, 0xff, 0x20, 0x21, 0xe5, 0x74, 0xa6, 0x22, 0x68, 0x97, 0x7a, 0x2e, 0xec, 0x51, 0xb2, 0x92, 0xd8, 0x83, 0x7c, 0x58, 0x61, 0x9a, 0x5f, 0x75, 0xf3, 0x64, 0xc3, 0x44, 0xd3, 0x22, 0xb4, 0x33, 0x02, 0xde, 0xe3, 0xbd, 0x64, 0xfe, 0xed, 0x98, 0x21, 0x1a, 0xe0, 0x2f, 0x4c, 0x0b, 0xfc, 0x52, 0xc3, 0x44, 0xb6, 0x2c, 0x56, 0x66, 0x03, 0x76, 0x2b, 0x0e, 0xd2, 0xeb, 0x60, 0xf1, 0xda, 0xfc, 0xf3, 0x2c, 0x97, 0xc4, 0xdf, 0xd5, 0x8f, 0x3e, 0x88, 0xd6, 0xda, 0xb6, 0x59, 0xfb, 0xe1, 0x7d, 0xac, 0x49, 0x66, 0xe1, 0xea, 0x92, 0xc5, 0x5c, 0xf3, 0x46, 0x79, 0x0c, 0xc0, 0x8c, 0xe1, 0x63, 0x47, 0x91, 0x44, 0x20, 0x9e, 0x20, 0x14, 0x7e, 0x64, 0x74, 0x6f, 0xab, 0x5d, 0x4a, 0xeb, 0x7b, 0x5c, 0x3a, 0x93, 0x5e, 0x66, 0x46, 0x2d, 0x90, 0x14, 0xb4, 0xbf, 0x8f, 0x39, 0x19, 0x51, 0xd2, 0xc5, 0xb7, 0xf3, 0xb8, 0xe9, 0x08, 0x02, 0xbf, 0x7c, 0x9b, 0xa8, 0xf6, 0x9e, 0x1f, 0xa2, 0xb5, 0x9b, 0xbe, 0x46, 0x8b, 0x12, 0xac, 0xc4, 0x78, 0x56, 0xff, 0xac, 0x5c, 0x14, 0xc1, 0xb0, 0xb0, 0x36, 0x43, 0xac, 0x74, 0x08, 0xb5, 0xe3, 0x68, 0x99, 0xf4, 0x8b, 0x7f, 0x65, 0xa3, 0x8d, 0x91, 0x30, 0x7d, 0x86, 0x50, 0x35, 0xe9, 0x11, 0x7d, 0x80, 0xcf, 0x48, 0x5c, 0x99, 0xab, 0x88, 0x65, 0x62, 0xe0, 0x75, 0x3c, 0x42, 0x4e, 0x3e, 0xe3, 0x83, 0x26, 0x23, 0x2f, 0xf9, 0xfd, 0x34, 0x78, 0xe5, 0x20, 0x5b, 0x95, 0x18, 0x28, 0x9c, 0x07, 0x5c, 0xce, 0x9c, 0x75, 0x0f, 0x00, 0x60, 0x59, 0x11, 0x34, 0x58, 0xf8, 0xe1, 0xfc, 0x9c, 0x97, 0x02, 0xda, 0x75, 0xec, 0xa4, 0x56, 0x1f, 0xd3, 0x80, 0x4f, 0xcd, 0x42, 0x04, 0x8f, 0xee, 0x7f, 0xb0, 0xa2, 0xaf, 0x90, 0xc0, 0xe7, 0xc1, 0xf4, 0x0b, 0xe7, 0x5c, 0x90, 0x2b, 0xe6, 0x84, 0xec, 0xde, 0xb8, 0x8b, 0x9f, 0xac, 0xd6, 0xd7, 0x08, 0xca, 0xb1, 0xe5, 0x3f, 0x3f, 0x46, 0x8e, 0x4b, 0x45, 0xf3, 0x89, 0x96, 0xf2, 0x89, 0x32, 0x9e, 0x17, 0xa2, 0x89, 0xec, 0x69, 0x35, 0x7e, 0x4a, 0xde, 0x67, 0x6c, 0x31, 0x5a, 0xa4, 0xe3, 0x81, 0x8b, 0xef, 0xaa, 0x74, 0x11, 0x76, 0x04, 0xd5, 0xe3, 0x6a, 0x33, 0x6d, 0xee, 0x0d, 0x3b, 0xbf, 0xff, 0x0d, 0xe8, 0xf5, 0xe2, 0x10, 0x12, 0x19, 0xcc, 0x90, 0x20, 0x88, 0xf6, 0xe9, 0xcb, 0xa4, 0x8b, 0xb0, 0x25, 0xca, 0xc4, 0x47, 0xd9, 0x84, 0x51, 0xae, 0xb4, 0xff, 0xfc, 0x9c, 0x64, 0xbf, 0x89, 0xcf, 0x80, 0x91, 0xe0, 0xa0, 0xc9, 0xc1, 0x6e, 0xda, 0xb0, 0x8e, 0xc8, 0xcc, 0x18, 0xdb, 0x91, 0x9d, 0x5c, 0x27, 0x9f, 0xe0, 0x94, 0xbf, 0x59, 0x68, 0x14, 0x32, 0x63, 0x5e, 0x36, 0x06, 0x7e, 0x90, 0x5a, 0xa9, 0xa9, 0x0c, 0x2a, 0xaa, 0x8c, 0xee, 0x23, 0x29, 0x17, 0x76, 0x51, 0x8d, 0x67, 0x5e, 0x59, 0x75, 0xe9, 0x6a, 0xbd, 0xf0, 0xc1, 0x40, 0x5c, 0xf0, 0x6d, 0x7a, 0x38, 0xfc, 0xa5, 0xfa, 0x7c, 0x26, 0x86, 0x7d, 0xbe, 0x3d, 0xf0, 0x73, 0x81, 0x43, 0x2d, 0x0f, 0xfe, 0x21, 0xd3, 0x9a, 0x24, 0x9a, 0xeb, 0x0c, 0xdd, 0x7e, 0x52, 0xdd, 0x93, 0x20, 0x60, 0x19, 0xf3, 0x09, 0xc8, 0xb3, 0xf0, 0xee, 0xbf, 0x1b, 0x0b, 0xe0, 0x61, 0x12, 0xd2, 0xc3, 0x50, 0xbe, 0xa7, 0x01, 0x9e, 0xf9, 0xc3, 0x80, 0xed, 0xef, 0x7b, 0xd1, 0xd4, 0xe8, 0xc1, 0xaa, 0x85, 0x62, 0xed, 0x96, 0xad, 0x63, 0xbe, 0xeb, 0x9c, 0x0d, 0x9b, 0xfc, 0xa6, 0x73, 0x1f, 0x91, 0xc9, 0xab, 0xd5, 0x94, 0x90, 0x25, 0x40, 0x0d, 0x36, 0x3a, 0x1f, 0x51, 0x0f, 0x08, 0xee, 0x75, 0x24, 0x7e, 0xb0, 0x09, 0x1d, 0xb3, 0xec, 0x03, 0x65, 0x7c, 0xf6, 0xfa, 0x88, 0x3d, 0x6f, 0x95, 0xe0, 0xff, 0x0f, 0x42, 0x70, 0xc3, 0xa2, 0x2b, 0x10, 0x16, 0x51, 0x66, 0xcb, 0xe6, 0x23, 0x6b, 0x85, 0x94, 0xc4, 0xcc, 0xe0, 0x4a, 0x84, 0x20, 0x61, 0x8f, 0xa2, 0x40, 0xcf, 0x19, 0xcb, 0xb7, 0xdc, 0xe2, 0xde, 0x73, 0x08, 0x7e, 0xf2, 0xc1, 0xc1, 0xab, 0x9a, 0x78, 0xcf, 0x2a, 0x68, 0x73, 0xef, 0xcd, 0xaf, 0x45, 0xbe, 0xd2, 0x8d, 0x29, 0xd9, 0x6f, 0x29, 0x38, 0x43, 0xae, 0x3a, 0xdf, 0x07, 0x7b, 0xc9, 0x8f, 0x1e, 0xfb, 0x37, 0xb6, 0x92, 0x20, 0x81, 0xef, 0xe4, 0x7b, 0xc3, 0x75, 0xac, 0x51, 0xfb, 0xde, 0x7f, 0xf0, 0x10, 0x06, 0x15, 0x43, 0x13, 0x49, 0xab, 0xa5, 0xc4, 0xf5, 0xa7, 0xf3, 0x58, 0xfe, 0x7b, 0xe5, 0x79, 0xf4, 0xcb, 0x9e, 0x8f, 0x33, 0xd2, 0x81, 0x3e, 0x5a, 0x02, 0x47, 0x2f, 0xfe, 0xea, 0x4e, 0x14, 0x9f, 0x5d, 0x34, 0xe6, 0xda, 0xd1, 0xa5, 0x71, 0xe1, 0x05, 0x71, 0x13, 0x29, 0xe7, 0xe2, 0xc1, 0x62, 0xb4, 0x4c, 0x4a, 0xac, 0x61, 0xe5, 0xe0, 0x08, 0x3a, 0xd7, 0xd4, 0x0c, 0xc9, 0x94, 0xa1, 0xdc, 0xf9, 0x6a, 0x2c, 0x55, 0x7b, 0x57, 0x4a, 0x8b, 0x69, 0x1e, 0x83, 0x76, 0x29, 0x9a, 0x16, 0xe8, 0x95, 0x53, 0x3c, 0xc2, 0x58, 0x4f, 0xb1, 0x68, 0x9b, 0x2b, 0x71, 0x72, 0xe2, 0x6a, 0xbf, 0xa5, 0x30, 0x0c, 0x6c, 0x21, 0x72, 0x62, 0x56, 0xdb, 0x1a, 0x22, 0x2f, 0x4e, 0x0b, 0xb7, 0x80, 0x6e, 0xb5, 0xda, 0xed, 0xde, 0x81, 0x66, 0xba, 0x62, 0x6f, 0x68, 0x8e, 0x97, 0xfd, 0x76, 0x77, 0xe2, 0x4c, 0x43, 0x2f, 0xa6, 0x7e, 0x70, 0x9e, 0xba, 0x62, 0xa4, 0x9f, 0x1a, 0x53, 0xde, 0x07, 0xdc, 0x5d, 0x0a, 0xe4, 0x66, 0xa2, 0xd3, 0x02, 0xdf, 0xfc, 0xb9, 0xb4, 0xe3, 0xe4, 0x63, 0xd0, 0x7b, 0x93, 0x36, 0xfc, 0x4c, 0x66, 0x26, 0x28, 0x0e, 0x87, 0xcc, 0x5c, 0x40, 0xca, 0xb9, 0xb4, 0x1a, 0xd5, 0x0b, 0xa9, 0xc4, 0x84, 0x3e, 0x91, 0xc5, 0x8c, 0x44, 0x69, 0xbe, 0x5e, 0xd7, 0xd3 ],
+const [ 0x0e, 0x2f, 0xce, 0x9e, 0x12, 0x3c, 0x9e, 0x83, 0xa8, 0xed, 0x6f, 0xa9, 0xaa, 0xc8, 0x79, 0xf9, 0xb1, 0x12, 0xc0, 0xf7, 0x7c, 0x9f, 0x96, 0x3e, 0x91, 0xe8, 0x61, 0x2a, 0x26, 0x5e, 0x9e, 0xd4, 0x41, 0xfe, 0x26, 0x43, 0x1f, 0x26, 0xb0, 0xe0, 0xd3, 0xa7, 0x98, 0x2b, 0x2f, 0x1b, 0xdf, 0xad, 0xe7, 0x79, 0x72, 0x2d, 0xf4, 0xe6, 0xaf, 0x27, 0x37, 0xce, 0x25, 0x7a, 0x5f, 0x34, 0x9b, 0x61, 0x0c, 0x46, 0x54, 0xa4, 0x34, 0x35, 0x92, 0x10, 0xc7, 0x43, 0x59, 0x24, 0x8e, 0x1e, 0x75, 0x0d, 0x59, 0x6c, 0xbf, 0xd5, 0x59, 0xa7, 0x9b, 0xd7, 0xcb, 0x2b, 0xc5, 0x76, 0xd6, 0x8d, 0x4e, 0x0e, 0xb7, 0x2f, 0xe1, 0x2b, 0x1b, 0x11, 0x4b, 0xf9, 0xcc, 0xea, 0x3a, 0xfc, 0x90, 0x78, 0x45, 0x01, 0x4f, 0x14, 0x2d, 0x55, 0x73, 0x89, 0x63, 0x34, 0x94, 0x26, 0xca, 0x84, 0x55, 0x12, 0xbd, 0xc4, 0x89, 0xe0, 0x54, 0x3f, 0x9b, 0x63, 0xe3, 0x85, 0x2c, 0xc4, 0xc4, 0x1b, 0xfd, 0xd1, 0x57, 0x72, 0x10, 0x98, 0x46, 0x16, 0x0a, 0x35, 0x0e, 0x28, 0xdc, 0xe8, 0xbb, 0x0e, 0xa2, 0x6b, 0xf2, 0x69, 0xcb, 0x82, 0x35, 0x47, 0x7b, 0xd3, 0x63, 0x9b, 0x2d, 0xf8, 0x7e, 0xea, 0x9d, 0xd3, 0xb1, 0x46, 0xe5, 0x21, 0x92, 0x80, 0xe6, 0x52, 0xa4, 0x9a, 0xe9, 0x99, 0x20, 0x7b, 0x86, 0x3f, 0xf5, 0xe6, 0xc6, 0x3c, 0x0d, 0xad, 0x84, 0x08, 0xd2, 0x22, 0x19, 0xaf, 0xf1, 0xcf, 0x38, 0x24, 0x5d, 0x67, 0x16, 0xd7, 0x98, 0xfc, 0xce, 0x89, 0x2e, 0x71, 0x05, 0x5f, 0x82, 0x33, 0xc9, 0x36, 0xcc, 0x24, 0xbf, 0x37, 0x63, 0xd8, 0x7e, 0xab, 0x38, 0x04, 0x36, 0x10, 0xa3, 0x33, 0x95, 0x6c, 0x63, 0xbb, 0xeb, 0xe1, 0xe0, 0xf0, 0x8c, 0x82, 0xb2, 0x97, 0x76, 0x65, 0x67, 0x9e, 0x33, 0xf9, 0x81, 0x0a, 0x01, 0x9a, 0xbf, 0x30, 0x31, 0x63, 0x9e, 0x28, 0xcd, 0x44, 0x1e, 0x7f, 0x7d, 0x54, 0xc9, 0x2c, 0xab, 0x68, 0xf2, 0xc5, 0xe6, 0xe4, 0x3b, 0xf3, 0x84, 0xd1, 0x5a, 0x24, 0x8c, 0x30, 0x1c, 0x7f, 0xd3, 0x8e, 0xa9, 0x1d, 0x64, 0xd9, 0x0b, 0x76, 0x25, 0x72, 0xea, 0x19, 0xb8, 0x83, 0x99, 0xa1, 0xa0, 0x93, 0x57, 0xe4, 0xa5, 0x58, 0xce, 0x6d, 0x79, 0xcc, 0xe0, 0x2d, 0x9b, 0x83, 0xa3, 0x6d, 0x7c, 0x3b, 0xaa, 0x07, 0xe1, 0xb5, 0x87, 0xd6, 0x88, 0xc3, 0x8d, 0x6b, 0x0e, 0xa3, 0xdb, 0x01, 0x10, 0x8b, 0x96, 0xb3, 0x91, 0x85, 0x75, 0xed, 0x9b, 0x7d, 0x83, 0x21, 0x29, 0x98, 0x20, 0xbb, 0x45, 0xc8, 0x49, 0x56, 0x6e, 0x9e, 0x1a, 0x30, 0x3c, 0x5f, 0x91, 0xdb, 0x47, 0x59, 0x95, 0x36, 0x44, 0x77, 0x37, 0x9c, 0x71, 0x14, 0x37, 0x5b, 0x34, 0x0d, 0xca, 0x68, 0xfe, 0x1a, 0x9a, 0x51, 0x76, 0x5e, 0x0f, 0x72, 0xd4, 0x3c, 0xcd, 0x6c, 0x8a, 0x6d, 0x7e, 0xd3, 0x2a, 0x4f, 0xd1, 0x27, 0x84, 0x80, 0xc2, 0x06, 0x0e, 0xac, 0x1d, 0x9f, 0x8a, 0xa3, 0x3d, 0x6a, 0xe2, 0xaf, 0x1a, 0x17, 0x57, 0x24, 0x83, 0xc4, 0xda, 0x38, 0xa7, 0x72, 0xba, 0x15, 0xda, 0xba, 0x80, 0x2d, 0x96, 0xbc, 0x18, 0xce, 0xc0, 0x59, 0x31, 0xf6, 0x2d, 0xa2, 0xe5, 0x68, 0x65, 0x8f, 0x9d, 0xff, 0xa7, 0xf5, 0x2f, 0x43, 0x2d, 0xb2, 0x4a, 0x3a, 0xb0, 0x2a, 0x14, 0x81, 0x2f, 0xf8, 0x11, 0x9a, 0xed, 0xdd, 0x47, 0x88, 0xb9, 0xfc, 0xa0, 0x99, 0x71, 0x4a, 0x8f, 0x84, 0xc9, 0x40, 0xf6, 0xb3, 0x49, 0xd3, 0x48, 0xe2, 0x95, 0xa5, 0xeb, 0xe9, 0xf1, 0x7d, 0xe0, 0xd6, 0x04, 0xf5, 0xa5, 0x3f, 0xdc, 0x72, 0x5a, 0xd7, 0x33, 0x59, 0x24, 0x3e, 0xf1, 0x80, 0xcf, 0x1e, 0xf2, 0xe3, 0xb7, 0x73, 0x08, 0x99, 0xe8, 0x2a, 0x44, 0x06, 0x84, 0xee, 0x71, 0x51, 0x65, 0x3f, 0xe2, 0x18, 0x04, 0xc4, 0x6e, 0x63, 0x99, 0xe2, 0xb8, 0xd7, 0x84, 0x8d, 0xb4, 0x2d, 0xec, 0x5e, 0x66, 0xe2, 0xa6, 0xe6, 0xed, 0x2f, 0x58, 0x43, 0xc1, 0x3b, 0xde, 0xf0, 0x39, 0x90, 0xec, 0xe2, 0x50, 0xcb, 0xf5, 0xd0, 0xa8, 0x98, 0x4c, 0xd2, 0xcf, 0xde, 0x8a, 0x2d, 0xc2, 0x37, 0x2f, 0x6d, 0xaf, 0xa3, 0x8c, 0xb5, 0xff, 0x7d, 0xe0, 0x54, 0x94, 0xae, 0xc1, 0x98, 0x4f, 0x20, 0xbd, 0xe7, 0xd6, 0x76, 0x42, 0x0b, 0x94, 0xfa, 0xbb, 0xce, 0x01, 0xd6, 0xfc, 0xc7, 0x23, 0x88, 0xe0, 0x73, 0x55, 0x90, 0x30, 0x88, 0x47, 0x6b, 0xc7, 0x85, 0x46, 0xc5, 0xf4, 0x8e, 0xbd, 0xeb, 0x20, 0x77, 0xfc, 0x7f, 0xb1, 0x1f, 0x39, 0x6f, 0x2e, 0xff, 0xd4, 0x27, 0xa3, 0x02, 0xe0, 0x06, 0x47, 0x97, 0xde, 0x0f, 0x5c, 0x05, 0xcb, 0xe2, 0x57, 0x00, 0x5e, 0xea, 0x41, 0x79, 0x8b, 0xd7, 0x5d, 0xba, 0x4b, 0x4f, 0x0b, 0xb1, 0x9f, 0xe0, 0xec, 0x8c, 0xd2, 0x3a, 0x47, 0x87, 0xff, 0x9b, 0xab, 0x02, 0xd4, 0x8a, 0xd6, 0xd7, 0x95, 0xc8, 0xd6, 0xea, 0x64, 0x84, 0x6e, 0x02, 0xbf, 0xce, 0xbb, 0xd7, 0x4a, 0x4e, 0x17, 0x6c, 0xcf, 0x36, 0x3e, 0x9e, 0x83, 0x75, 0xb0, 0xfd, 0x8b, 0x2e, 0x56, 0xdc, 0xbe, 0x68, 0x67, 0xa4, 0xad, 0x07, 0x8d, 0x6e, 0xe0, 0xfb, 0x44, 0xd0, 0x63, 0xb7, 0x83, 0xf6, 0x82, 0xe4, 0x9f, 0xf5, 0xd0, 0x57, 0x6c, 0x5d, 0x6e, 0x41, 0xa5, 0x0d, 0x89, 0xa6, 0x8e, 0x4c, 0x25, 0x11, 0xd7, 0x15, 0x19, 0x85, 0xc4, 0xb1, 0x5b, 0xb6, 0x8b, 0x8c, 0x7e, 0x79, 0xfe, 0x41, 0x79, 0x7a, 0x69, 0xf7, 0xaa, 0x2d, 0xbe, 0xf0, 0x1b, 0x07, 0xef, 0x5f, 0x03, 0xed, 0x9c, 0x7a, 0x90, 0xed, 0xee, 0xd1, 0xe3, 0x2c, 0xc3, 0xde, 0x5d, 0x1f, 0x0b, 0xdd, 0x19, 0xfe, 0x71, 0xde, 0xb9, 0x76, 0x3f, 0x18, 0x66, 0x9f, 0x7b, 0x80, 0x12, 0x2d, 0x56, 0x9a, 0x00, 0xea, 0xc8, 0x8f, 0x87, 0x64, 0x74, 0x81, 0x13, 0xe2, 0xd1, 0x1b, 0x6c, 0x9d, 0x8b, 0x6c, 0x3b, 0x2d, 0x27, 0xf5, 0xca, 0x42, 0xe7, 0x00, 0x0b, 0x94, 0xed, 0x34, 0xdc, 0x1d, 0xa2, 0x67, 0x89, 0x85, 0x59, 0xb3, 0x92, 0xde, 0x30, 0xcc, 0xaf, 0x91, 0x37, 0x90, 0x12, 0x98, 0xd5, 0xe0, 0xec, 0xee, 0x67, 0xaf, 0x32, 0x44, 0x29, 0x58, 0xa1, 0xf6, 0x5a, 0x35, 0x00, 0x3d, 0x9b, 0x6d, 0xa5, 0xa6, 0x99, 0x0d, 0x3a, 0xc3, 0xeb, 0x5b, 0xc1, 0x20, 0x3e, 0x67, 0xd6, 0x78, 0xaf, 0xe2, 0x34, 0x29, 0x78, 0x33, 0x7b, 0xe6, 0xcf, 0xc8, 0x31, 0xac, 0x0b, 0xaa, 0x06, 0xf7, 0x09, 0x55, 0x5c, 0x35, 0xce, 0xc6, 0x06, 0x7b, 0x6d, 0xd5, 0x50, 0x77, 0x2b, 0xc5, 0x40, 0xa6, 0xe2, 0x1a, 0x1c, 0xc6, 0xa3, 0xaa, 0x2c, 0x8f, 0x9f, 0xf7, 0xc1, 0x9e, 0x48, 0xbc, 0x77, 0xb2, 0xb3, 0xc6, 0xb6, 0x1a, 0x41, 0x05, 0x7f, 0x6e, 0x7e, 0xe3, 0x65, 0x7e, 0x49, 0xd4, 0xd9, 0x88, 0x36, 0x2f, 0xab, 0xae, 0x30, 0x3c, 0xce, 0xa6, 0x63, 0x8e, 0x5c, 0xb4, 0x59, 0x93, 0xd9, 0xd5, 0x62, 0x69, 0xbc, 0x3d, 0x3a, 0xf3, 0x2b, 0x04, 0xe6, 0x2d, 0x07, 0x1d, 0xdf, 0xbc, 0x28, 0x87, 0x72, 0xca, 0xea, 0xc7, 0x67, 0x10, 0xe8, 0x95, 0xe1, 0x34, 0x07, 0xd6, 0x85, 0x56, 0xb7, 0xca, 0xde, 0xe6, 0x75, 0x87, 0x00, 0xb8, 0x94, 0xa6, 0x6c, 0x5a, 0x3e, 0x3c, 0x34, 0xa5, 0xb6, 0x0c, 0x60, 0x92, 0xdf, 0xfa, 0x8f, 0x4f, 0x02, 0xc3, 0xe2, 0x92, 0xcc, 0xec, 0x15, 0x2e, 0x96, 0xf8, 0xef, 0xe4, 0xea, 0xde, 0xdd, 0x7b, 0x42, 0xba, 0xda, 0x12, 0x12, 0xc3, 0x91, 0xb6, 0x09, 0x7d, 0xc6, 0x30, 0x94, 0x30, 0xf2, 0x20, 0xa5, 0x98, 0x2d, 0x50, 0xb2, 0xde, 0x51, 0x42, 0x00, 0xc7, 0x5d, 0x0b, 0x21, 0x2c, 0x17, 0x64, 0xbc, 0xaa, 0xf6, 0xff, 0x8c, 0x9a, 0x3e, 0x17, 0xab, 0x43, 0x6d, 0x4b, 0x11, 0x4f, 0xd6, 0xac, 0x57, 0x7c, 0x8c, 0x15, 0xc1, 0x94, 0x81, 0xbb, 0x7c, 0x9f, 0xef, 0x04, 0x24, 0x57, 0xf7, 0x9d, 0x8a, 0xdc, 0x89, 0xc7, 0xb3, 0xa9, 0x83, 0xf1, 0x24, 0xc7, 0x1d, 0x8c, 0x5c, 0x40, 0x84, 0x1b, 0xa3, 0xd7, 0xc5, 0x89, 0x02, 0xf6, 0xed, 0xc0, 0x93, 0xe8, 0x6e, 0x77, 0xfb, 0x48, 0xc5, 0x4b, 0x34, 0xba, 0x5a, 0x12, 0x90, 0xd9, 0xa8, 0x6c, 0xfa, 0x70, 0x9d, 0x9a, 0x7f, 0xec, 0x44, 0x94, 0x0e, 0x11, 0xa1, 0x55, 0x7c, 0xed, 0xdd, 0x7a, 0xcb, 0x0a, 0xa3, 0x0b, 0xac, 0xe8, 0xc9, 0x99, 0x42, 0xaa, 0x33, 0x89, 0x29, 0x10, 0xf4, 0xaf, 0xb7, 0xa5, 0xb7, 0x1f, 0x82, 0x3a, 0x5e, 0x3f, 0x22, 0x92, 0xe8, 0x21, 0x38, 0x5f, 0x98, 0x10, 0xaf, 0x6d, 0x53, 0x69, 0x41, 0x1e, 0x4b, 0xad, 0x3d, 0x16, 0xda, 0xd3, 0x88, 0x37, 0xb0, 0xe3, 0xe2, 0xd0, 0x31, 0xc0, 0x6b, 0x11, 0x19, 0x45, 0x66, 0xc3, 0x62, 0x94, 0x3c, 0x36, 0x67, 0xab, 0xc4, 0x7a, 0x49, 0x39, 0xc1, 0xd1, 0x92, 0xaf, 0xad, 0x65, 0x18, 0x99, 0xb5, 0x37, 0x25, 0x2f, 0x04, 0x58, 0xd4, 0x27, 0x44, 0x5b, 0xbe, 0xce, 0x62, 0x0a, 0xd6, 0x57, 0x92, 0x58, 0x92, 0x73, 0x94, 0x97, 0x4c, 0x22, 0x35, 0xeb, 0xe7, 0xc8, 0x18, 0xff, 0xb5, 0x83, 0xb6, 0xf6, 0x98, 0xbc, 0xa4, 0xa5, 0x68, 0xfc, 0x15, 0xff, 0x95, 0x01, 0x9f, 0xd0, 0x0e, 0x12, 0x42, 0xaf, 0x61, 0x8f, 0xa6, 0x2d, 0x23, 0xcc, 0xa4, 0x53, 0x92, 0x1f, 0x08, 0x4c, 0x79, 0x38, 0x95, 0x5e, 0x54, 0xb1, 0x4a, 0x1f, 0xb5, 0xe6, 0xe4, 0xe5, 0xe6, 0x07, 0xa4, 0x7e, 0xd0, 0x6c, 0x52, 0x21, 0x1b, 0x28, 0x82, 0xa5, 0x97, 0xe0, 0x16, 0xf1, 0xdb, 0xde, 0x04, 0xb4, 0x2c, 0x61, 0x5a, 0x56, 0xa0, 0x37, 0x7f, 0x2e, 0x82, 0x8e, 0xbb, 0xf5, 0xf9, 0x08, 0xf9, 0x7a, 0xe5, 0x0d, 0xcc, 0x98, 0x0a, 0x65, 0xb1, 0x65, 0x70, 0x06, 0x94, 0xad, 0x09, 0x2a, 0x95, 0x9f, 0x95, 0xa5, 0x0b, 0xc5, 0xc3, 0x76, 0xc9, 0x3a, 0x99, 0x9c, 0xa1, 0x17, 0x15, 0x2b, 0x27, 0x2e, 0x15, 0x9e, 0xb7, 0xfb, 0x74, 0x6f, 0xba, 0xd7, 0x76, 0xe5, 0x24, 0x6f, 0x66, 0x2e, 0x41, 0x75, 0x7d, 0xad, 0xb2, 0x95, 0x06, 0x95, 0xb3, 0xab, 0xc0, 0xb7, 0x9f, 0x33, 0x84, 0x98, 0xb5, 0x00, 0x27, 0xc7, 0x1c, 0x32, 0xa2, 0x6d, 0x25, 0x62, 0x70, 0x26, 0xd1, 0x1f, 0x38, 0x0f, 0x93, 0x9e, 0xac, 0x21, 0x56, 0xad, 0xb1, 0xbd, 0xc2, 0xe9, 0xc0, 0x87, 0xbb, 0x31, 0x8c, 0x78, 0x2b, 0x5a, 0xe5, 0x2f, 0x02, 0x24, 0xdc, 0x88, 0x7b, 0x6d, 0x28, 0x70, 0xa0, 0xa5, 0xc8, 0xf8, 0x10, 0x82, 0xea, 0xa8, 0x00, 0xf5, 0x0c, 0x15, 0x80, 0x5c, 0x61, 0xb5, 0xff, 0xf9, 0x76, 0xf3, 0x12, 0xa3, 0x15, 0x7f, 0x71, 0xbb, 0x6a, 0xe8, 0x42, 0x62, 0x64, 0x6c, 0x9b, 0xe9, 0x5e, 0x0f, 0x42, 0x89, 0xff, 0xea, 0xb7, 0x55, 0x5e, 0xc6, 0x74, 0x6c, 0x6a, 0xe9, 0x73, 0x73, 0x8a, 0x30, 0xf1, 0x43, 0x80, 0x5e, 0x72, 0xde, 0x93, 0xb4, 0x05, 0xa8, 0xed, 0xc2, 0xc9, 0xd4, 0x42, 0x7c, 0xb0, 0x1c, 0xb2, 0x90, 0x83, 0xb5, 0xf1, 0xf7, 0x26, 0x82, 0xa5, 0xca, 0x1e, 0x88, 0x0f, 0x58, 0x50, 0xa2, 0xee, 0x75, 0x0b, 0x75, 0xa0, 0x15, 0x49, 0xa7, 0x8b, 0x19, 0x32, 0x4c, 0xbb, 0x68, 0xe2, 0xa1, 0xcc, 0x42, 0x6c, 0xfd, 0x0b, 0xd1, 0x1f, 0x04, 0xd8, 0x01, 0x08, 0x1e, 0x4f, 0x92, 0xb7, 0x28, 0x27, 0x6c, 0x46, 0x69, 0xd9, 0x32, 0x98, 0xc7, 0x05, 0x19, 0xdf, 0x3a, 0x12, 0xfb, 0x61, 0x82, 0x16, 0xa7, 0x7b, 0x15, 0xf5, 0x7c, 0xe6, 0x5c, 0xcc, 0x36, 0x39, 0x1e, 0x90, 0x07, 0xaf, 0x3d, 0xf2, 0xea, 0x2b, 0xa0, 0x86, 0x34, 0x79, 0x70, 0x25, 0x6b, 0xd7, 0x87, 0x90, 0x5c, 0xb4, 0x25, 0x55, 0x68, 0xb7, 0xe5, 0xf7, 0x1f, 0x03, 0xf0, 0x49, 0x10, 0xba, 0x71, 0x1b, 0xde, 0xbf, 0x49, 0x18, 0x97, 0xc1, 0x03, 0xef, 0x42, 0x75, 0x0a, 0xb1, 0xb7, 0x22, 0x19, 0x7a, 0xb4, 0x63, 0xf4, 0x54, 0x2c, 0x29, 0x56, 0x58, 0xe2, 0xff, 0x2a, 0x17, 0x37, 0x92, 0xfd, 0x38, 0x40, 0x70, 0xb4, 0x62, 0x1c, 0x10, 0x7a, 0x5c, 0x85, 0x13, 0xfd, 0x72, 0xa4, 0xc9, 0xda, 0x1b, 0x2a, 0xf7, 0x55, 0xda, 0x9c, 0xd7, 0x4e, 0x62, 0xee, 0x61, 0x71, 0xfd, 0x54, 0xc9, 0xac, 0x2e, 0x55, 0x49, 0xe6, 0x95, 0x21, 0x20, 0xee, 0x14, 0x24, 0xdb, 0xb1, 0x30, 0xdb, 0xd3, 0xb1, 0xba, 0xe7, 0xf7, 0xb2, 0xae, 0x60, 0xcb, 0xb6, 0x5b, 0x6b, 0xb1, 0x2c, 0xc4, 0x0f, 0x68, 0x65, 0x47, 0x44, 0xd2, 0x47, 0x7c, 0x4d, 0xfa, 0x45, 0x60, 0x48, 0x55, 0x8f, 0xb3, 0x04, 0x48, 0x85, 0x9e, 0x12, 0xeb, 0x72, 0x99, 0x1f, 0x0d, 0x77, 0x8c, 0x81, 0x78, 0xc5, 0x34, 0x0f, 0x75, 0x0f, 0xc9, 0x36, 0x93, 0x40, 0xde, 0x49, 0xa5, 0x69, 0x88, 0x19, 0x0a, 0xfd, 0xc2, 0xc6, 0x31, 0x40, 0x10, 0xd4, 0x5b, 0xfd, 0x63, 0x81, 0xa3, 0x77, 0x3d, 0x56, 0x3c, 0xa3, 0x15, 0xfd, 0xfb, 0x94, 0xfd, 0x52, 0x15, 0x37, 0x82, 0xbc, 0x29, 0x40, 0xd4, 0xbe, 0x81, 0x64, 0x27, 0xc9, 0x95, 0xc9, 0x58, 0x55, 0xd0, 0xbb, 0xd4, 0x30, 0x97, 0xa0, 0xb6, 0x15, 0x88, 0x2e, 0x2f, 0x80, 0xff, 0xdb, 0x2b, 0xc1, 0xdf, 0x95, 0x31, 0x4f, 0x8f, 0xb4, 0x8b, 0x60, 0x42, 0x2d, 0xa8, 0xb6, 0x7c, 0x08, 0xbe, 0xbc, 0xd2, 0x14, 0xb3, 0xd1, 0xf1, 0xd9, 0x3e, 0xe4, 0xe1, 0xce, 0x4a, 0x41, 0x8b, 0xcc, 0x9b, 0xaa, 0x79, 0xc3, 0xb3, 0xaa, 0xde, 0xac, 0xf7, 0x26, 0xd6, 0xbe, 0x0e, 0x35, 0xee, 0xe5, 0x8a, 0x32, 0xe7, 0x70, 0xca, 0x0f, 0xb7, 0x09, 0x1e, 0xeb, 0xd1, 0xeb, 0x2d, 0xe7, 0xa6, 0x4f, 0x94, 0x36, 0x6c, 0x27, 0xd0, 0x74, 0x1e, 0x0f, 0x5e, 0x39, 0xc4, 0x81, 0x20, 0xed, 0xf4, 0x48, 0x03, 0xde, 0x99, 0x37, 0xdf, 0x8f, 0xf3, 0x1a, 0x9f, 0x54, 0xdf, 0xed, 0xa1, 0x1b, 0x59, 0x4c, 0x60, 0x8d, 0x3f, 0x2b, 0x50, 0x56, 0x57, 0xc7, 0x09, 0xc0, 0x94, 0xdc, 0xa8, 0x87, 0x95, 0x19, 0x72, 0xe9, 0x6f, 0xd1, 0xbb, 0xfc, 0xac, 0xf3, 0x07, 0x44, 0x94, 0x3c, 0x6e, 0x85, 0xab, 0xab, 0x45, 0xd6, 0x7a, 0x36, 0xfa, 0xf7, 0x92, 0xbb, 0x40, 0xe4, 0xcf, 0x39, 0x6c, 0xaa, 0xda, 0x40, 0x1f, 0x7a, 0xf1, 0xa6, 0x26, 0xfc, 0xeb, 0x7c, 0x9e, 0xe5, 0x76, 0x40, 0x5c, 0xcc, 0xa4, 0x54, 0x8c, 0x3a, 0xa6, 0xaf, 0x97, 0x00, 0xd7, 0xd3, 0x4b, 0xcd, 0xfc, 0xff, 0x36, 0xff, 0xc9, 0xa5, 0x52, 0xba, 0xa8, 0x1e, 0xe8, 0x37, 0xb7, 0x9d, 0xae, 0x5f, 0x0f, 0x62, 0x32, 0x99, 0x4c, 0x30, 0x7c, 0xe0, 0x4a, 0x00, 0xef, 0x18, 0x2c, 0xf7, 0x71, 0xa2, 0xa3, 0x96, 0xcc, 0x2e, 0x6d, 0x31, 0x53, 0xd0, 0x1b, 0xa2, 0xc8, 0x57, 0x18, 0x3e, 0x7d, 0xda, 0xe7, 0x08, 0xba, 0x93, 0xac, 0x25, 0x5f, 0xf0, 0xee, 0x90, 0xca, 0xe8, 0x9b, 0x0f, 0xfb, 0x8c, 0x4c, 0x66, 0xf6, 0xde, 0xcb, 0xca, 0x69, 0xe5, 0xd3, 0x98, 0x8f, 0x01, 0x16, 0x47, 0x54, 0x7d, 0x84, 0x9c, 0xba, 0x63, 0xcb, 0x1c, 0x7b, 0x94, 0x1a, 0xc7, 0xf0, 0x17, 0x2b, 0x03, 0x31, 0xb2, 0x80, 0xd7, 0x7e, 0xb7, 0xed, 0x59, 0xde, 0x21, 0x56, 0x6a, 0x05, 0xdf, 0xba, 0xa0, 0x7b, 0x70, 0x70, 0x84, 0xfb, 0xb0, 0xb1, 0xfe, 0x1a, 0xf2, 0x57, 0x0d, 0x29, 0x4e, 0xe4, 0xbb, 0x5b, 0x3d, 0xc6, 0x51, 0x2b, 0x63, 0xda, 0xc7, 0xf8, 0xab, 0x2e, 0x7e, 0xf2, 0x99, 0x0b, 0x32, 0x3a, 0xdc, 0x33, 0x2a, 0x45, 0x23, 0x67, 0xb1, 0x82, 0x32, 0x2c, 0xca, 0x3c, 0x35, 0xcf, 0x20, 0xc1, 0x54, 0xa7, 0x3c, 0xc4, 0x87, 0x9a, 0xfa, 0x00, 0xac, 0xe2, 0x3e, 0x1e, 0xd7, 0x11, 0xe3, 0xd9, 0xe9, 0x53, 0xf4, 0x60, 0x64, 0xf4, 0x1f, 0xfb, 0x7d, 0x22, 0x66, 0xf2, 0x73, 0xf3, 0x18, 0xab, 0x20, 0xaa, 0x00, 0x12, 0xce, 0x36, 0xdc, 0x3d, 0x4b, 0xfb, 0x11, 0x51, 0x40, 0xd5, 0x9c, 0x9f, 0xbe, 0x5a, 0x4c, 0x13, 0x1a, 0x60, 0x2e, 0xcf, 0xfb, 0xc0, 0x49, 0x13, 0xb1, 0x59, 0x8c, 0x60, 0xc8, 0x57, 0x05, 0xdd, 0xdd, 0xb5, 0x54, 0xf9, 0xb1, 0x00, 0x5e, 0x52, 0x7c, 0x5e, 0x46, 0xd6, 0x84, 0xd0, 0x99, 0x27, 0xed, 0xb4, 0xc8, 0x44, 0xd3, 0x8e, 0xdc, 0x67, 0x96, 0x07, 0x65, 0x29, 0x75, 0x36, 0xb3, 0xec, 0x5f, 0x1f, 0x49, 0x7a, 0x05, 0x79, 0x8f, 0xea, 0x34, 0xb5, 0xc7, 0xc4, 0x62, 0x3b, 0x42, 0x65, 0x87, 0xf7, 0xd4, 0xa4, 0x2e, 0x14, 0x85, 0xb5, 0xcb, 0x07, 0x89, 0x4e, 0x4f, 0xd0, 0x73, 0x09, 0xfa, 0x7c, 0xa5, 0x0a, 0x70, 0xef, 0x0b, 0xe1, 0x10, 0xe0, 0x09, 0xb1, 0x81, 0x25, 0xb1, 0x92, 0x8d, 0x31, 0x3a, 0x35, 0x33, 0xdb, 0xad, 0xc7, 0xf7, 0x61, 0xe2, 0x17, 0x7d, 0xac, 0xab, 0xfa, 0x56, 0xd5, 0x4f, 0xef, 0x1a, 0xe9, 0x3a, 0xff, 0xb7, 0xe9, 0xf2, 0xe7, 0x08, 0x15, 0x4d, 0x79, 0xaa, 0x6a, 0xe2, 0x40, 0x0b, 0x6a, 0xbd, 0x63, 0xc3, 0x1b, 0x57, 0xcb, 0x28, 0x52, 0xc5, 0x88, 0x1c, 0x31, 0x2f, 0x71, 0x2a, 0xef, 0x84, 0x0b, 0xd2, 0xd7, 0x6c, 0xad, 0x20, 0x94, 0x7e, 0xe1, 0x84, 0xab, 0xb4, 0x0c, 0xdd, 0x49, 0x1b, 0x52, 0xd7, 0x3f, 0xcf, 0xb4, 0x77, 0x4b, 0x27, 0x7b, 0xf4, 0x99, 0x2d, 0xda, 0xc9, 0x89, 0x51, 0xcf, 0x08, 0xb3, 0x5e, 0x4a, 0xf1, 0x29, 0xac, 0x91, 0xc3, 0xfb, 0x98, 0xe3, 0xd2, 0x01, 0x31, 0x5b, 0xda, 0xd4, 0x34, 0x18, 0x93, 0x1e, 0x3b, 0x9b, 0x85, 0x14, 0x31, 0x70, 0x1e, 0x40, 0x09, 0x11, 0x02, 0x84, 0xaf, 0x07, 0xa2, 0x5c, 0x3f, 0x52, 0x10, 0x63, 0x76, 0x0b, 0x12, 0x19, 0x66, 0x48, 0x75, 0xe3, 0x6d, 0x40, 0xa3, 0x53, 0x67, 0xb0, 0x78, 0xaa, 0x23, 0x7d, 0x52, 0x9b, 0x14, 0x9a, 0x67, 0x52, 0x49, 0x2c, 0x5c, 0xb5, 0x9f, 0xec, 0x13, 0xea, 0x36, 0xcd, 0xc4, 0x19, 0x21, 0xe0, 0x4f, 0x73, 0x62, 0x74, 0xd0, 0x73, 0x15, 0x81, 0x74, 0x63, 0xeb, 0x47, 0x8c, 0x23, 0xda, 0x32, 0xe0, 0x26, 0x13, 0x01, 0x46, 0xbd, 0x35, 0x27, 0x73, 0x98, 0xc0, 0x71, 0x10, 0x89, 0xcc, 0xea, 0x11, 0x8c, 0xfb, 0xfc, 0x42, 0x05, 0xac, 0xd7, 0x22, 0x48, 0x71, 0x17, 0xf5, 0x5e, 0xc4, 0xa0, 0x15, 0x07, 0xf5, 0xcd, 0x89, 0xfb, 0x67, 0xcb, 0xd8, 0x75, 0xfc, 0x3f, 0x1f, 0xf2, 0xce, 0x2f, 0x62, 0x36, 0x20, 0x1f, 0x20, 0x91, 0x94, 0x7a, 0x2a, 0x60, 0x9e, 0x34, 0xb5, 0xd6, 0x38, 0xae, 0xad, 0xfd, 0xd7, 0xda, 0x4c, 0xf7, 0x9e, 0x9f, 0xec, 0x8a, 0xd2, 0x7f, 0x19, 0xdc, 0x8f, 0x77, 0xeb, 0x7a, 0xb9, 0x26, 0x92, 0x9f, 0x34, 0x32, 0x33, 0xb4, 0x58, 0xe8, 0xf3, 0x13, 0x9f, 0x22, 0x51, 0x10, 0xa1, 0x6e, 0xb8, 0x3a, 0x43, 0x6c, 0x54, 0xde, 0x2b, 0x78, 0x26, 0xcd, 0x77, 0x89, 0x53, 0x5f, 0xae, 0x59, 0xc2, 0xb8, 0xf6, 0xc7, 0xe5, 0x4a, 0x88, 0x79, 0xd7, 0x9b, 0x62, 0xc5, 0xa8, 0x49, 0x3b, 0xd2, 0xf5, 0x4b, 0xbc, 0xfa, 0xbb, 0x79, 0xed, 0x73, 0x6c, 0x4f, 0xee, 0x2f, 0x43, 0xee, 0xe7, 0x00, 0xd5, 0x63, 0x41, 0x00, 0xea, 0x2c, 0x17, 0x30, 0x8a, 0xf8, 0xe7, 0x5f, 0x5b, 0xaf, 0x8e, 0x4e, 0x2a, 0xb2, 0x73, 0x11, 0xc7, 0x64, 0x02, 0xb8, 0x16, 0xe9, 0x5c, 0x2f, 0x63, 0x2e, 0x4c, 0x63, 0xf6, 0x29, 0x7e, 0xa6, 0xe7, 0x62, 0xeb, 0x55, 0x34, 0xb2, 0x98, 0xb8, 0x11, 0x4a, 0x80, 0x29, 0x7f, 0xf8, 0xce, 0x79, 0x20, 0xa6, 0x50, 0x8f, 0x4a, 0x24, 0x29, 0x52, 0x5a, 0x27, 0xc6, 0xca, 0x4b, 0x91, 0x13, 0x81, 0x87, 0xf2, 0xee, 0x30, 0xfc, 0x4f, 0xdc, 0x97, 0x73, 0x23, 0xfa, 0xad, 0x1d, 0xa4, 0x37, 0xf9, 0x6f, 0x47, 0xc1, 0x40, 0x30, 0x86, 0xbd, 0x60, 0xd1, 0xe1, 0x3b, 0x7c, 0xfc, 0x23, 0x69, 0x59, 0x6f, 0xe6, 0x06, 0x08, 0x0b, 0x59, 0x1a, 0xc6, 0x28, 0x41, 0xe5, 0x20, 0x2c, 0x3e, 0x15, 0x5b, 0x5c, 0x50, 0x3c, 0x12, 0xf2, 0x99, 0x80, 0x21, 0x6f, 0x65, 0x95, 0xc2, 0x32, 0x67, 0xe8, 0xf6, 0x4a, 0x45, 0x1d, 0x27, 0x89, 0x58, 0xbc, 0x0b, 0xd9, 0xad, 0x27, 0xcb, 0xd3, 0x4f, 0xd0, 0x65, 0x8e, 0xc8, 0xa8, 0x4f, 0xb5, 0xe5, 0xdb, 0x5d, 0xdd, 0xba, 0xba, 0xe4, 0x15, 0xe6, 0xf8, 0x20, 0xbe, 0x18, 0x1a, 0xd3, 0x9d, 0xd2, 0x29, 0x2f, 0x2e, 0x6d, 0xaa, 0xf6, 0x3b, 0x5e, 0xd0, 0xe0, 0xae, 0xb7, 0xef, 0x3d, 0xa4, 0xf1, 0x34, 0xdb, 0xc2, 0xe8, 0x94, 0x2a, 0xcc, 0x27, 0x02, 0x9e, 0x73, 0x66, 0xe5, 0x55, 0x6f, 0x51, 0xc9, 0xfa, 0xce, 0x8b, 0x54, 0xe9, 0x8c, 0xf3, 0x7c, 0x93, 0x63, 0x26, 0xf8, 0x24, 0xe4, 0x45, 0xf4, 0x64, 0xc7, 0xf8, 0x09, 0xdb, 0x80, 0xb2, 0x6c, 0x39, 0x13, 0x37, 0x66, 0xf5, 0x28, 0x5c, 0x04, 0x33, 0x62, 0x0e, 0x0f, 0xeb, 0xed, 0x96, 0x3e, 0x48, 0x56, 0x1b, 0xab, 0x4e, 0xa0, 0x69, 0x84, 0xc0, 0x94, 0xf1, 0x03, 0x41, 0x58, 0x10, 0xa0, 0xb9, 0x43, 0x94, 0x85, 0xfa, 0xf0, 0x7c, 0x42, 0xa4, 0x91, 0xff, 0xc2, 0x45, 0x86, 0xd0, 0x7d, 0xc5, 0x2f, 0xa1, 0xf0, 0x02, 0xfe, 0xe6, 0x4a, 0xb7, 0xd0, 0xdb, 0x69, 0xa2, 0x7d, 0xc8, 0x04, 0xe6, 0xad, 0x83, 0x2a, 0xae, 0xee, 0x37, 0xeb, 0x13, 0x04, 0x65, 0x55, 0x40, 0x80, 0x28, 0xa2, 0xd3, 0x95, 0xbd, 0xaf, 0x87, 0x26, 0x42, 0xb0, 0x10, 0x23, 0xbe, 0x23, 0x47, 0x16, 0x62, 0x02, 0x87, 0xf9, 0x0f, 0x3d, 0x57, 0x4b, 0x18, 0x67, 0x49, 0x63, 0x48, 0xaf, 0x22, 0x03, 0x27, 0x13, 0x3a, 0x30, 0x79, 0xd0, 0x26, 0x41, 0x08, 0x1d, 0x95, 0x37, 0xa3, 0x18, 0x78, 0x4c, 0x67, 0x01, 0x66, 0xcf, 0x3d, 0xa6, 0x3e, 0x2e, 0xa4, 0x1e, 0x0e, 0x55, 0xb1, 0xba, 0x33, 0x36, 0x53, 0x39, 0xc2, 0xa9, 0xdc, 0x3b, 0x27, 0x77, 0xbd, 0xf9, 0x0c, 0xb1, 0x91, 0x32, 0x7d, 0x47, 0x5e, 0x69, 0x49, 0xd5, 0x17, 0x4d, 0xab, 0xc0, 0x65, 0x79, 0x29, 0x82, 0xa6, 0x5d, 0xbd, 0x42, 0x37, 0x7c, 0x33, 0xa8, 0xee, 0xd9, 0xd2, 0xef, 0xeb, 0xab, 0x3e, 0x3c, 0x91, 0x58, 0x9d, 0x2e, 0xcf, 0xa1, 0xf9, 0xb6, 0xa4, 0x1a, 0xe5, 0x29, 0xe2, 0xde, 0x64, 0x93, 0x32, 0x80, 0x06, 0x4f, 0x58, 0x45, 0x54, 0xd4, 0xb8, 0x90, 0x6e, 0xd2, 0x19, 0x9d, 0xf3, 0x7e, 0xaa, 0x72, 0x21, 0x29, 0x42, 0x13, 0x3e, 0x18, 0xec, 0xf6, 0x36, 0x90, 0xa3, 0xb6, 0x85, 0x30, 0x5a, 0x0b, 0x57, 0x84, 0x40, 0xfa, 0xee, 0xd6, 0x41, 0x49, 0x45, 0x47, 0xd0, 0x36, 0xf3, 0x1f, 0xe4, 0x69, 0x51, 0x62, 0x40, 0x26, 0xdf, 0xa4, 0xf8, 0xc7, 0xe4, 0x1d, 0x31, 0x6a, 0x55, 0x00, 0x28, 0xe7, 0xf8, 0x09, 0x76, 0x05, 0xc9, 0x55, 0x92, 0xed, 0x9d, 0x77, 0x97, 0xde, 0x05, 0xc8, 0x47, 0x23, 0x75, 0xfe, 0x50, 0x42, 0xa6, 0x01, 0xcf, 0x77, 0x38, 0xfa, 0x13, 0x60, 0x9c, 0xac, 0xa3, 0xfa, 0x31, 0x07, 0x82, 0xcc, 0xad, 0xfa, 0xb1, 0x62, 0xbf, 0x8a, 0xf6, 0xfd, 0xf3, 0x21, 0xdc, 0x89, 0xd5, 0x28, 0xfb, 0xcf, 0x59, 0xd7, 0x79, 0xec, 0x7a, 0x4c, 0xd1, 0x02, 0x22, 0xdb, 0xd3, 0x2d, 0x4a, 0xa6, 0xed, 0xb9, 0x62, 0x6d, 0xa8, 0x92, 0xf3, 0xa7, 0x75, 0xfb, 0x83, 0xd1, 0xaa, 0x83, 0xb9, 0x06, 0xc8, 0x35, 0xc1, 0xd0, 0xff, 0x10, 0xf2, 0x3e, 0xf4, 0xb7, 0xae, 0x36, 0xc1, 0x69, 0x8a, 0x0d, 0x3d, 0x32, 0xaf, 0x55, 0x7f, 0x63, 0x81, 0xf6, 0x9d, 0x41, 0x7e, 0x81, 0xb9, 0xfa, 0x68, 0xc0, 0x3f, 0xdd, 0xa6, 0x92, 0x68, 0xc9, 0xe8, 0xf5, 0x03, 0xe6, 0x0a, 0x65, 0x74, 0x94, 0x3b, 0x65, 0xfd, 0xa1, 0x5e, 0x5b, 0x3c, 0xbf, 0xb0, 0xa0, 0xf5, 0x35, 0xab, 0xd8, 0x12, 0xd4, 0x2b, 0x7f, 0xe8, 0x2d, 0xd0, 0xc5, 0xbc, 0x01, 0xa3, 0x9c, 0x86, 0xf9, 0xfc, 0x0f, 0xf4, 0x97, 0xa3, 0xd5, 0xb2, 0x6d, 0x35, 0x26, 0xe9, 0x8d, 0xc9, 0xcd, 0x06, 0x40, 0xd4, 0x7f, 0xbc, 0xfb, 0x4a, 0x6b, 0x4c, 0x8e, 0x06, 0x12, 0x04, 0x9f, 0x6c, 0x59, 0x05, 0x57, 0x4d, 0xdc, 0x4a, 0x5b, 0x0a, 0x86, 0xe6, 0xfe, 0xfd, 0x5f, 0x8d, 0xb5, 0x14, 0xa4, 0x56, 0xcb, 0xbf, 0x1d, 0xbf, 0x55, 0x0d, 0xab, 0xf2, 0x69, 0x12, 0x21, 0x47, 0x8b, 0x8b, 0x54, 0x09, 0x68, 0xc5, 0x76, 0x7d, 0xc7, 0xba, 0x9f, 0x20, 0xbc, 0x7d, 0xad, 0x31, 0x1e, 0xd9, 0x4e, 0x6f, 0x3c, 0x35, 0x5b, 0x24, 0xcc, 0xbb, 0x68, 0x62, 0x24, 0xba, 0x99, 0x8d, 0xad, 0x48, 0xb7, 0x19, 0x94, 0x2b, 0x82, 0x95, 0xc2, 0xfa, 0x49, 0xe9, 0x0f, 0x7f, 0xb9, 0xdc, 0xb2, 0x60, 0xf3, 0xd9, 0xfc, 0xfe, 0xe1, 0xf2, 0x47, 0x9e, 0xc9, 0x25, 0x29, 0xc7, 0x22, 0xde, 0xed, 0xea, 0xa7, 0xbe, 0x43, 0x49, 0xab, 0x9b, 0x36, 0x11, 0xac, 0xc8, 0x5f, 0xc9, 0x2a, 0x96, 0x58, 0xf0, 0xb9, 0x1a, 0x74, 0xe2, 0x56, 0x31, 0xad, 0xfc, 0xf7, 0xc2, 0xde, 0x00, 0x66, 0x43, 0x33, 0xbb, 0x4e, 0x7f, 0xdd, 0xe5, 0x96, 0x96, 0x0a, 0x48, 0xef, 0x45, 0x14, 0x25, 0xa9, 0x67, 0xf8, 0xd3, 0xcb, 0xbc, 0x0b, 0xa9, 0x62, 0xea, 0xe8, 0x1e, 0x19, 0xc1, 0xad, 0x2f, 0x0a, 0xc3, 0x67, 0x01, 0xd4, 0xe4, 0xca, 0xc8, 0xee, 0x8e, 0x26, 0xe7, 0x3b, 0xe8, 0x96, 0x59, 0xde, 0x58, 0x7b, 0x4f, 0x4f, 0x47, 0x28, 0x1a, 0xae, 0x24, 0xdf, 0x4c, 0x58, 0xab, 0xfd, 0x1a, 0xb9, 0x67, 0x71, 0x05, 0x61, 0x75, 0x72, 0xba, 0x59, 0x8c, 0x72, 0x36, 0xb7, 0x3a, 0x4d, 0x2d, 0x70, 0x70, 0xc7, 0xad, 0x6e, 0x41, 0x35, 0xff, 0xe2, 0xe7, 0x7a, 0xce, 0xdc, 0x07, 0x35, 0x8a, 0x19, 0x36, 0x39, 0x0f, 0x1b, 0xbb, 0x3e, 0x82, 0x7f, 0x96, 0xd6, 0x7c, 0x8c, 0xc2, 0xa2, 0x6b, 0x08, 0xb8, 0xc5, 0x35, 0x4f, 0x34, 0x99, 0x1e, 0xa6, 0x3b, 0xa1, 0xeb, 0xcc, 0x5d, 0xbf, 0x47, 0xd2, 0x38, 0xa7, 0x67, 0x2d, 0x3d, 0x94, 0xea, 0x0a, 0xb7, 0x3a, 0x03, 0xe1, 0x08, 0xfb, 0xd9, 0x4d, 0x36, 0x5d, 0x2e, 0x1b, 0xa7, 0xbc, 0x3f, 0xa0, 0x29, 0x3c, 0xec, 0x50, 0x36, 0x02, 0x19, 0x8d, 0x75, 0xa4, 0x54, 0xbd, 0x83, 0xdd, 0xb8, 0x9f, 0xf4, 0x86, 0x11, 0xdf, 0x95, 0xc1, 0x41, 0xe8, 0xf4, 0x78, 0xe2, 0xf9, 0x23, 0x06, 0x2c, 0x7b, 0xb8, 0x33, 0x19, 0x92, 0x18, 0x66, 0xc8, 0xf2, 0xf6, 0x16, 0x1f, 0xf4, 0x16, 0x82, 0xb5, 0xe8, 0x57, 0xa2, 0xef, 0xad, 0xf0, 0x5d, 0x69, 0x80, 0xfa, 0xfc, 0x97, 0x12, 0x2f, 0xdf, 0xac, 0xdd, 0xf1, 0x6e, 0xba, 0xb7, 0x8e, 0x53, 0x1b, 0xa8, 0xc2, 0xe7, 0x11, 0xf9, 0x7d, 0xe9, 0xa9, 0x8d, 0xe7, 0x76, 0xe5, 0x75, 0xa1, 0x35, 0x19, 0xbe, 0x4e, 0xd3, 0x96, 0x8d, 0x53, 0xaf, 0x86, 0x6f, 0xda, 0xd6, 0x17, 0xea, 0x1d, 0x31, 0xdc, 0x58, 0xe1, 0xfd, 0x70, 0xf5, 0x40, 0x7c, 0x5c, 0x36, 0xac, 0xea, 0x3a, 0x5c, 0x31, 0xb3, 0x1b, 0x4a, 0xfa, 0xe3, 0x27, 0x93, 0x17, 0xde, 0x83, 0xd8, 0x7e, 0x51, 0x78, 0x51, 0x4f, 0x68, 0xd1, 0xa9, 0x5c, 0x42, 0x84, 0x0f, 0xe8, 0xa2, 0x95, 0x8a, 0xaf, 0xe7, 0x38, 0x8c, 0x27, 0x3e, 0x36, 0xcb, 0x06, 0x16, 0x91, 0x4c, 0x04, 0xd4, 0x6b, 0xc0, 0xe2, 0xc8, 0x24, 0x14, 0xab, 0x60, 0xc3, 0x44, 0x3a, 0x9c, 0x97, 0x70, 0xfc, 0xc2, 0x1e, 0x31, 0xf7, 0x53, 0x25, 0x2d, 0x0b, 0x3d, 0x31, 0xe9, 0x78, 0x52, 0x1e, 0xdf, 0xa1, 0xf9, 0x06, 0xd1, 0x10, 0x24, 0x64, 0x5c, 0xb9, 0x82, 0x79, 0xd0, 0x83, 0xf5, 0xef, 0x3f, 0x04, 0x46, 0xbd, 0xd4, 0x8c, 0x18, 0x4a, 0x66, 0x66, 0x1a, 0xd5, 0x4d, 0x5a, 0x81, 0x14, 0x75, 0x76, 0xb6, 0x1b, 0xb1, 0x0f, 0x4b, 0x80, 0x51, 0x02, 0x34, 0xbd, 0xf6, 0x3f, 0x34, 0xd5, 0xa5, 0x89, 0x95, 0x3b, 0x1b, 0x77, 0x1c, 0xef, 0x60, 0xbf, 0x3c, 0xea, 0x9f, 0xb3, 0x8a, 0xbc, 0x35, 0x0c, 0x71, 0x74, 0x08, 0xe7, 0x27, 0xc0, 0x1a, 0x0d, 0xdf, 0x55, 0x5e, 0x77, 0x41, 0x91, 0xca, 0x12, 0x17, 0x5f, 0xad, 0xbf, 0x49, 0x5c, 0x43, 0x9e, 0x0b, 0x38, 0x86, 0x8c, 0x55, 0x5e, 0x48, 0xea, 0x93, 0xd7, 0x7f, 0xa1, 0x9f, 0x6b, 0xe0, 0x62, 0xec, 0x0a, 0xaf, 0x33, 0x04, 0x6b, 0xd5, 0x27, 0x34, 0xf3, 0x33, 0x6c, 0x85, 0xd8, 0x36, 0x8b, 0xef, 0x86, 0xab, 0xec, 0xca, 0x42, 0xd5, 0x99, 0x85, 0x0d, 0xbd, 0x43, 0x9a, 0xcb, 0xca, 0x8a, 0xc1, 0xa4, 0x91, 0x79, 0x65, 0xab, 0xee, 0x50, 0x54, 0xbd, 0x54, 0x87, 0xba, 0xac, 0x61, 0x0f, 0x50, 0x9d, 0xb6, 0xdb, 0xd1, 0xaf, 0x05, 0x9f, 0xae, 0xde, 0x6b, 0xd8, 0x02, 0x26, 0x01, 0x0c, 0xc8, 0xeb, 0xae, 0x53, 0x4c, 0x98, 0x3f, 0x16, 0xdf, 0x87, 0xb9, 0x17, 0xcf, 0x21, 0xed, 0xb1, 0x96, 0x46, 0x4e, 0x62, 0x52, 0xef, 0x00, 0x86, 0x75, 0x11, 0x31, 0x65, 0xbe, 0xc5, 0xac, 0x70, 0x68, 0xa7, 0xab, 0xc8, 0xa1, 0x7b, 0xed, 0x00, 0x3d, 0x17, 0x09, 0x24, 0xac, 0x7d, 0x02, 0xfa, 0x29, 0x47, 0x1b, 0x87, 0x35, 0x48, 0xed, 0xd5, 0x44, 0x70, 0xb6, 0xf4, 0xb6, 0xf0, 0xf4, 0x3f, 0x08, 0x9f, 0x33, 0xe0, 0x4c, 0x9c, 0x23, 0x97, 0xd6, 0x35, 0xed, 0xb7, 0x39, 0x08, 0xc7, 0x71, 0x72, 0x68, 0xc7, 0x54, 0x62, 0x03, 0xf4, 0x15, 0x82, 0xc1, 0xa3, 0x8c, 0xd2, 0xef, 0x01, 0x00, 0x12, 0x9c, 0xec, 0xa4, 0x35, 0x43, 0x07, 0x61, 0x13, 0xab, 0x0d, 0xd6, 0x5e, 0x0c, 0x65, 0x9e, 0xd7, 0x73, 0xf7, 0xd1, 0xc1, 0x67, 0x3f, 0xcd, 0x96, 0xcd, 0x9f, 0x36, 0xfa, 0x09, 0xfa, 0x3b, 0xed, 0x66, 0x7e, 0x1b, 0x44, 0xb8, 0xc1, 0xe8, 0x5a, 0x40, 0x10, 0x8c, 0x03, 0xcf, 0x04, 0x09, 0xc1, 0x2e, 0x55, 0x05, 0x3b, 0xbe, 0xf3, 0x85, 0xea, 0x5c, 0x53, 0xf9, 0x16, 0x87, 0x07, 0x79, 0x01, 0xc5, 0x92, 0x4e, 0x62, 0x42, 0x7a, 0xb4, 0x14, 0xbb, 0x9f, 0xde, 0x10, 0x9a, 0xca, 0x3b, 0x99, 0x63, 0x89, 0xf8, 0xb6, 0x4e, 0x3b, 0xc6, 0xe5, 0x36, 0x67, 0xdd, 0x0e, 0xb1, 0x52, 0x40, 0xb6, 0x81, 0xd0, 0x43, 0x75, 0x2b, 0x5a, 0x4b, 0xaa, 0xe5, 0x61, 0xd6, 0x6d, 0xb5, 0xe2, 0xbb, 0xc5, 0xd8, 0x3b, 0xb2, 0x1b, 0x61, 0x3d, 0x16, 0xef, 0x22, 0x82, 0xea, 0xca, 0xcf, 0x00, 0x1b, 0x74, 0x61, 0xdf, 0x04, 0x66, 0xb9, 0x88, 0x37, 0x82, 0x86, 0xff, 0x7b, 0x02, 0x68, 0x72, 0x11, 0xaf, 0x56, 0x12, 0x3c, 0x53, 0x3d, 0x21, 0x00, 0x70, 0xe9, 0x4c, 0x29, 0x32, 0x29, 0x3c, 0x8f, 0xa3, 0x2e, 0x68, 0x99, 0x1e, 0x35, 0x2d, 0x00, 0x06, 0x66, 0x20, 0xd5, 0xb7, 0xfb, 0xa3, 0xc6, 0xbd, 0xa4, 0xb6, 0x9d, 0x45, 0x2a, 0x10, 0x09, 0xd0, 0x53, 0x6f, 0xa1, 0x2f, 0x07, 0x2c, 0x26, 0xab, 0xb0, 0x12, 0x08, 0x84, 0xe7, 0x70, 0x2c, 0x9d, 0x4c, 0x6d, 0xed, 0x75, 0xb5, 0x9c, 0x61, 0x59, 0x8c, 0xd0, 0xdd, 0xd8, 0x72, 0x32, 0xbb, 0x78, 0x28, 0x90, 0x5a, 0xa7, 0xb0, 0xf8, 0x67, 0xf4, 0xaf, 0x86, 0x5b, 0x7f, 0x16, 0x7a, 0x45, 0xae, 0x01, 0x8d, 0xca, 0x22, 0xe0, 0x86, 0x6a, 0xea, 0xd4, 0x08, 0x05, 0xf6, 0x5c, 0xae, 0x9d, 0xce, 0x30, 0x5a, 0x5d, 0x84, 0x6d, 0xc9, 0xda, 0xe6, 0xf3, 0x6b, 0x9a, 0xf9, 0x0b, 0x72, 0xd3, 0xa3, 0x4e, 0x29, 0x74, 0xa8, 0xc2, 0x88, 0x69, 0xd8, 0x45, 0x05, 0x1b, 0x86, 0x2f, 0xac, 0x37, 0x3b, 0x33, 0x72, 0xb1, 0xac, 0x86, 0xc7, 0x08, 0xea, 0x43, 0x6a, 0xcb, 0xd9, 0x0f, 0x81, 0x5c, 0xe3, 0xf9, 0xe9, 0xf4, 0xed, 0xa3, 0xcb, 0xe7, 0x8a, 0xa7, 0x70, 0x2a, 0x6f, 0x34, 0x56, 0x12, 0x28, 0xf8, 0x83, 0x5e, 0x09, 0x43, 0x19, 0x78, 0x66, 0x69, 0x2b, 0xf8, 0x07, 0x68, 0xcf, 0x6a, 0xd6, 0xca, 0x74, 0x51, 0xdb, 0xcd, 0x76, 0x6c, 0x6a, 0xc2, 0xf0, 0x37, 0x9b, 0xb3, 0xd2, 0xb5, 0xfb, 0x48, 0x33, 0x6d, 0x81, 0xeb, 0xe8, 0xb2, 0xc4, 0x2b, 0x55, 0x28, 0x6a, 0x5e, 0x83, 0x84, 0xe4, 0x8b, 0x73, 0x93, 0x59, 0x87, 0xb2, 0x7e, 0xdf, 0x5d, 0x2e, 0x4c, 0xf1, 0xf3, 0x48, 0xa8, 0x1e, 0xeb, 0x2a, 0xe5, 0xfe, 0xc8, 0x5b, 0x3f, 0x6a, 0x52, 0x90, 0x64, 0xec, 0x3b, 0xc6, 0x33, 0x75, 0x02, 0x8d, 0xc3, 0x4e, 0x18, 0xa7, 0xa7, 0x51, 0x42, 0xd1, 0x70, 0x59, 0x3e, 0xe1, 0x74, 0xf7, 0xa9, 0x11, 0xce, 0x67, 0x20, 0x9b, 0xa6, 0xc2, 0xa6, 0x86, 0xb3, 0x74, 0x45, 0xbf, 0xfd, 0xf1, 0xf8, 0x6b, 0xe8, 0xa4, 0xc9, 0x7c, 0x6e, 0x28, 0x37, 0x82, 0xac, 0xbb, 0xda, 0xc4, 0xa0, 0xf0, 0x4a, 0x90, 0x31, 0xa4, 0x3c, 0xcf, 0x6f, 0x32, 0xee, 0xdc, 0x1d, 0xeb, 0xc6, 0x97, 0x6d, 0xc0, 0x36, 0xb5, 0x0a, 0x42, 0xe2, 0x5a, 0x5b, 0xcd, 0x05, 0xe9, 0x07, 0xff, 0x10, 0x1b, 0xb4, 0x6f, 0x95, 0x4e, 0x15, 0x9c, 0x64, 0x20, 0x23, 0x24, 0xf4, 0x3d, 0xaa, 0x37, 0x04, 0x75, 0x08, 0x4a, 0x81, 0x12, 0x31, 0x10, 0xab, 0x68, 0xf7, 0xa6, 0x74, 0xad, 0x89 ],
+const [ 0xb3, 0xf1, 0x97, 0xb9, 0x84, 0x41, 0xa1, 0xef, 0x2b, 0xb3, 0x53, 0xf6, 0xf7, 0xea, 0x1c, 0x97, 0x5d, 0x1b, 0xa5, 0xe6, 0xf5, 0x09, 0xfa, 0xcf, 0xc5, 0x33, 0xea, 0xf2, 0xc2, 0x4b, 0xb0, 0xb1, 0x94, 0xeb, 0xd3, 0x86, 0x9a, 0x84, 0x4a, 0x9a, 0x2e, 0x97, 0xe4, 0x94, 0x2a, 0x27, 0xe7, 0xaf, 0xaa, 0x6e, 0xf7, 0x10, 0x14, 0xcf, 0x3a, 0x56, 0x56, 0x0c, 0xba, 0x72, 0x6f, 0xb9, 0x0b, 0xb9, 0x31, 0xf0, 0x2d, 0x37, 0x45, 0x47, 0xb3, 0x47, 0x6f, 0xff, 0x25, 0x61, 0x13, 0x7e, 0xa4, 0x32, 0xf9, 0xff, 0xcc, 0xf2, 0x4d, 0x89, 0xdf, 0xf2, 0xea, 0x1d, 0x1f, 0x74, 0xd8, 0x34, 0x7b, 0xc0, 0x12, 0x69, 0x6e, 0x74, 0x8d, 0x72, 0x25, 0x1c, 0x77, 0x54, 0xe0, 0x02, 0xbc, 0xd7, 0x9a, 0x48, 0xcf, 0x38, 0xec, 0x33, 0xa7, 0x1f, 0x2f, 0xca, 0x08, 0xd0, 0xe1, 0xa0, 0x03, 0xa5, 0x49, 0xee, 0xc0, 0xbc, 0x5e, 0xe4, 0x7b, 0xed, 0xe6, 0x41, 0xcd, 0xff, 0xdb, 0x22, 0x2d, 0x1b, 0x12, 0x17, 0xb6, 0x80, 0x1f, 0x7c, 0x2b, 0x79, 0x73, 0x07, 0x38, 0x8c, 0xc7, 0x9d, 0xfa, 0xf5, 0xbe, 0x6a, 0xc2, 0x53, 0xc5, 0x30, 0x16, 0xa0, 0x3e, 0xdf, 0xf9, 0x66, 0xdf, 0x67, 0x6d, 0x30, 0x54, 0xca, 0x35, 0x3f, 0x2c, 0x75, 0xdf, 0x7f, 0xf2, 0xd0, 0x02, 0xba, 0x9a, 0x14, 0xc5, 0x0a, 0x20, 0x5d, 0xa0, 0x94, 0x6b, 0x00, 0x67, 0x73, 0x77, 0x1e, 0x84, 0xf3, 0xb3, 0x79, 0x83, 0x00, 0xa8, 0x87, 0xd5, 0xde, 0xdc, 0xc5, 0xcd, 0x1a, 0xf6, 0x4e, 0xef, 0xc0, 0x22, 0xac, 0x6a, 0xce, 0xb7, 0xee, 0xe3, 0xe9, 0x18, 0xfa, 0x74, 0x4f, 0xd8, 0x25, 0xf5, 0x0d, 0x21, 0x01, 0x7a, 0x72, 0x56, 0x76, 0x1c, 0xc3, 0xf7, 0x15, 0xfd, 0x30, 0xc5, 0xa8, 0x86, 0x07, 0x27, 0x0e, 0xf3, 0x28, 0xcd, 0x46, 0x12, 0xb9, 0x93, 0xc9, 0x47, 0x1a, 0xa8, 0x1d, 0xd4, 0x1b, 0xef, 0xa7, 0x57, 0x6d, 0xa5, 0xc1, 0x94, 0x57, 0x45, 0x0c, 0x75, 0xaa, 0xa8, 0x07, 0x4f, 0xf7, 0x71, 0xe1, 0x67, 0xff, 0xa8, 0x8c, 0xb5, 0x6b, 0xa5, 0x13, 0xe8, 0xbe, 0x30, 0x2d, 0xaa, 0x87, 0xe6, 0x12, 0x24, 0xdb, 0xdf, 0x8d, 0xc5, 0x02, 0x8d, 0x53, 0x3f, 0x71, 0xe7, 0x93, 0xd3, 0xf8, 0xc7, 0xce, 0xcf, 0x3d, 0x91, 0xe9, 0x55, 0x69, 0x16, 0x81, 0x5d, 0x21, 0xb8, 0x7e, 0xfd, 0xb8, 0xce, 0xeb, 0xe9, 0xa3, 0x4a, 0x05, 0x36, 0x2d, 0x99, 0x91, 0x63, 0x6c, 0xca, 0x73, 0x99, 0x73, 0xf3, 0x7d, 0x32, 0xc9, 0xd0, 0x85, 0x79, 0x1a, 0xae, 0xba, 0xb0, 0x2d, 0x87, 0x38, 0x58, 0x16, 0x6f, 0xd9, 0xac, 0xad, 0x2e, 0x4e, 0x6f, 0x3e, 0x2f, 0x6f, 0xe7, 0x82, 0x99, 0xd0, 0x2a, 0xce, 0xbb, 0x95, 0x98, 0x8b, 0xad, 0x87, 0xa9, 0xe6, 0x34, 0x67, 0xe9, 0xc8, 0xe7, 0x82, 0x40, 0x09, 0x90, 0x85, 0x77, 0xe1, 0xd5, 0x93, 0xf8, 0x9f, 0x18, 0x95, 0xd5, 0x9d, 0x9b, 0xd1, 0x0c, 0x73, 0xe8, 0xbf, 0x0a, 0x6b, 0x70, 0x17, 0x6d, 0x35, 0x72, 0x2f, 0x0e, 0xdc, 0x1e, 0x84, 0x3f, 0xf9, 0xfb, 0x96, 0x51, 0x27, 0x86, 0xfa, 0x5a, 0xb6, 0x1c, 0xaa, 0x34, 0xa4, 0x19, 0x9f, 0xc9, 0xc8, 0x42, 0xa2, 0x8e, 0x51, 0x60, 0x5f, 0x4e, 0x6f, 0x2e, 0xbb, 0x29, 0x50, 0x75, 0x67, 0xdc, 0x4e, 0x76, 0xb5, 0x43, 0x67, 0x88, 0xab, 0x1c, 0xed, 0x02, 0x57, 0x0d, 0x7e, 0x5b, 0x61, 0xe9, 0x37, 0x90, 0xe7, 0x2f, 0x25, 0xc6, 0x84, 0xd3, 0xfc, 0x31, 0xb2, 0x41, 0x0c, 0x34, 0x53, 0xa0, 0x70, 0xca, 0x8a, 0x53, 0x89, 0x24, 0xcf, 0xc6, 0xab, 0x94, 0x43, 0x67, 0x15, 0xa9, 0x40, 0xf2, 0x27, 0x9c, 0x35, 0xf2, 0xcf, 0xea, 0xb1, 0x85, 0x45, 0x43, 0xbd, 0x5f, 0xf8, 0xa3, 0x6f, 0x11, 0xc8, 0xbf, 0xbc, 0x8b, 0x75, 0xa2, 0x8e, 0xe0, 0x57, 0x98, 0x16, 0x4a, 0x50, 0x4b, 0x64, 0x6e, 0x00, 0x2c, 0x35, 0xe1, 0x37, 0x14, 0x0c, 0xea, 0xb0, 0x2b, 0x84, 0x8a, 0xfc, 0x0a, 0xe4, 0xb9, 0xbc, 0x1c, 0xf4, 0xf3, 0x13, 0x4a, 0x0f, 0xf3, 0x5b, 0xd7, 0x7a, 0xbf, 0x17, 0x88, 0xf4, 0xe4, 0x29, 0x09, 0x8e, 0x03, 0x46, 0x8c, 0xbd, 0x8c, 0xa6, 0xb3, 0xae, 0xca, 0x00, 0xb0, 0xd9, 0x20, 0xb5, 0xab, 0xd9, 0x92, 0x4c, 0x63, 0x7b, 0x86, 0x1e, 0x19, 0x15, 0xcc, 0x52, 0xaa, 0x19, 0xdd, 0x0c, 0xfb, 0xe9, 0x60, 0xe2, 0x99, 0xed, 0xf3, 0x90, 0xa1, 0xe4, 0x27, 0xec, 0xde, 0x77, 0xcc, 0x1c, 0x32, 0x14, 0x70, 0x06, 0x37, 0xf9, 0x22, 0x08, 0x25, 0x8f, 0x7c, 0xe9, 0xf7, 0xfa, 0xe0, 0x10, 0xc9, 0xee, 0x01, 0xf4, 0x85, 0xc4, 0xa5, 0xd4, 0xbe, 0xcd, 0xaa, 0xa8, 0xdc, 0xe6, 0x47, 0x57, 0x7a, 0x4c, 0x95, 0x2a, 0x0c, 0xb2, 0x4e, 0x81, 0xc5, 0x91, 0xd4, 0xc5, 0xb8, 0xc0, 0x75, 0x9d, 0x3d, 0x44, 0xed, 0x65, 0x96, 0x69, 0x2c, 0xdc, 0xd2, 0x12, 0x5a, 0x1c, 0xf2, 0x4d, 0x19, 0xd0, 0x4b, 0x2a, 0x0a, 0xa1, 0x2b, 0xce, 0x92, 0xf1, 0xbf, 0xc3, 0xde, 0xcc, 0x34, 0x92, 0x24, 0x1b, 0x1d, 0x94, 0x2c, 0x1b, 0x15, 0x05, 0x10, 0x0e, 0xa5, 0x5a, 0x40, 0x31, 0x68, 0xd4, 0xc8, 0xed, 0x6c, 0x56, 0xd6, 0x51, 0xdc, 0x74, 0x76, 0xc0, 0xdc, 0xcc, 0xa1, 0xe7, 0xb5, 0x99, 0x76, 0xf2, 0x32, 0x85, 0xc7, 0x00, 0x4a, 0xbf, 0xd7, 0xd4, 0xfe, 0x4e, 0x62, 0xcd, 0x85, 0xa5, 0xde, 0x18, 0xa7, 0x77, 0x01, 0x24, 0x67, 0xcc, 0x83, 0x56, 0xe4, 0x55, 0x25, 0xff, 0x81, 0xfc, 0xf2, 0x8b, 0x44, 0xc0, 0xc5, 0xfb, 0x7c, 0xc0, 0x0b, 0x95, 0xa7, 0x95, 0xca, 0xd9, 0x92, 0xe5, 0xe3, 0xb8, 0xc2, 0x35, 0x94, 0x01, 0x13, 0xff, 0x40, 0x1c, 0x9f, 0x05, 0x73, 0xfa, 0xe1, 0xe4, 0x21, 0x4c, 0x1b, 0xec, 0x2e, 0xf3, 0xf4, 0x2f, 0x33, 0xb8, 0x66, 0xd8, 0x80, 0x3e, 0xd7, 0xbf, 0x5d, 0x34, 0x86, 0x3a, 0x96, 0xcf, 0x29, 0x35, 0x36, 0x78, 0xd5, 0x85, 0x92, 0xc2, 0x1d, 0x79, 0x89, 0x9e, 0x7e, 0xb2, 0x0b, 0xd2, 0xfb, 0x35, 0xd8, 0xa7, 0x04, 0xbf, 0x8a, 0xe2, 0x9c, 0x59, 0xd6, 0xf6, 0xbb, 0x2b, 0x0f, 0x78, 0xf1, 0x95, 0xeb, 0xd3, 0x4d, 0x7c, 0x8a, 0x3d, 0x7d, 0xe2, 0xb4, 0xea, 0x36, 0xba, 0x63, 0x7f, 0xd7, 0xfa, 0x81, 0xc9, 0x49, 0xf1, 0xf2, 0xaf, 0x29, 0xdb, 0xd5, 0x65, 0x29, 0xb3, 0x07, 0xe3, 0xb3, 0x48, 0xe9, 0x96, 0xd0, 0x93, 0x64, 0x55, 0x49, 0x48, 0x2a, 0x96, 0x0c, 0xab, 0x3e, 0xe2, 0xd0, 0xa5, 0xb6, 0x86, 0xfc, 0x17, 0xc0, 0x8c, 0xc5, 0x6e, 0xe3, 0xe9, 0x97, 0x78, 0x87, 0xf8, 0xb7, 0x76, 0xb8, 0x27, 0x26, 0x72, 0x27, 0xf1, 0xc8, 0xd2, 0x71, 0x0c, 0xc5, 0x2e, 0xa4, 0xe3, 0x30, 0x5f, 0x00, 0x46, 0xe7, 0xd8, 0xfa, 0x60, 0xba, 0x3a, 0x87, 0xea, 0xcf, 0x22, 0x96, 0x9f, 0x44, 0x45, 0xde, 0xf0, 0x17, 0xc0, 0xdb, 0xf8, 0x43, 0xa9, 0x13, 0xb2, 0x2c, 0xea, 0x9e, 0x6a, 0x3d, 0x4f, 0xe5, 0x71, 0xd0, 0xdd, 0xaa, 0x15, 0x4e, 0x66, 0x49, 0xd0, 0x97, 0x5a, 0x3d, 0xc0, 0xa4, 0xe0, 0xe5, 0x57, 0x6b, 0x25, 0x88, 0x54, 0x02, 0xf4, 0x98, 0xf2, 0x08, 0x88, 0x33, 0x5f, 0x41, 0x9e, 0xef, 0x6f, 0x80, 0xce, 0xd7, 0x92, 0xca, 0x1a, 0xb1, 0x04, 0xb8, 0xc8, 0x83, 0x43, 0x1d, 0x6d, 0x55, 0xc6, 0xe9, 0x4b, 0x37, 0xec, 0x4d, 0xdc, 0x86, 0x33, 0x20, 0xaf, 0x6c, 0xaa, 0x82, 0x73, 0xa6, 0xa9, 0xbf, 0x52, 0x8a, 0xbf, 0x76, 0x80, 0x48, 0xec, 0xfa, 0x13, 0x70, 0x10, 0xf8, 0x15, 0xb4, 0xa4, 0x5a, 0xd7, 0xf0, 0xa8, 0x6c, 0x89, 0x67, 0xdc, 0x3d, 0x08, 0x4f, 0x33, 0x49, 0xf7, 0x91, 0x85, 0x54, 0x11, 0xca, 0x84, 0x99, 0xbd, 0x95, 0xf1, 0x24, 0xe3, 0x0c, 0x10, 0x7d, 0xff, 0x8c, 0x59, 0x86, 0x74, 0xb9, 0x70, 0xa6, 0x22, 0xc2, 0x57, 0x27, 0x3a, 0xe7, 0xe3, 0xdd, 0x51, 0x38, 0x6c, 0x09, 0xb4, 0x9f, 0xc9, 0x7c, 0xfc, 0x20, 0x7b, 0x00, 0xe2, 0x60, 0x29, 0xf3, 0x54, 0x64, 0x4d, 0x35, 0xc8, 0x9c, 0x2c, 0x45, 0xd0, 0x20, 0x0b, 0xa6, 0xee, 0x39, 0xa0, 0x88, 0xaa, 0x23, 0xc7, 0xa4, 0xe3, 0x11, 0x76, 0x68, 0x63, 0x72, 0xf3, 0x54, 0xb6, 0x73, 0x44, 0xa4, 0x3b, 0xc5, 0xe8, 0x2f, 0x7b, 0xa0, 0xc4, 0x8f, 0xba, 0x08, 0x60, 0x82, 0xcc, 0x4f, 0x53, 0x90, 0x2a, 0xdb, 0xfc, 0xee, 0x45, 0x29, 0x73, 0xa3, 0x1a, 0x12, 0xbf, 0xe9, 0x07, 0x4d, 0x4a, 0xd6, 0xdd, 0x36, 0x92, 0x3b, 0x36, 0xcd, 0x20, 0xcd, 0x09, 0x02, 0xbe, 0x82, 0x7b, 0x30, 0xe5, 0x3e, 0xf8, 0xe7, 0x75, 0xaf, 0x83, 0xee, 0xa8, 0x75, 0x4a, 0x88, 0x49, 0x87, 0x7e, 0xf7, 0x21, 0xd2, 0x61, 0x3f, 0xb3, 0x23, 0xa1, 0x2c, 0x29, 0x46, 0xe4, 0x96, 0x8d, 0x70, 0xa4, 0xe4, 0x3c, 0xda, 0x3d, 0xcf, 0x98, 0xaf, 0x44, 0x69, 0xfe, 0x28, 0x1b, 0x5d, 0xf8, 0xf5, 0xc2, 0x78, 0xb3, 0xe0, 0xf0, 0x68, 0xb3, 0xad, 0x63, 0xc4, 0xc5, 0x44, 0x74, 0x4d, 0x35, 0x12, 0xee, 0x74, 0x42, 0xac, 0x20, 0x1c, 0xcf, 0xb5, 0x31, 0xa0, 0x5b, 0x03, 0xb4, 0x18, 0x33, 0xfd, 0x7c, 0xd8, 0xe6, 0x47, 0xb2, 0x3a, 0xfa, 0xa2, 0x24, 0x9e, 0xdd, 0x0d, 0xe0, 0xae, 0x1e, 0x30, 0x02, 0xe7, 0xdd, 0xfb, 0xca, 0x55, 0x81, 0x8b, 0xf2, 0x9d, 0xa9, 0x4d, 0x3e, 0x41, 0x64, 0x65, 0x54, 0x20, 0xa4, 0x51, 0xce, 0x3c, 0xf0, 0xc9, 0x8e, 0xc0, 0x5a, 0xea, 0x51, 0x42, 0xb1, 0x94, 0x87, 0x45, 0xf7, 0x11, 0x63, 0x02, 0x15, 0xf7, 0x2e, 0x68, 0xce, 0x4f, 0xe0, 0x61, 0xf2, 0xf6, 0xf1, 0x57, 0xd4, 0x44, 0x6d, 0xf7, 0xfd, 0xec, 0x47, 0x34, 0x22, 0x23, 0xef, 0x8f, 0x54, 0x05, 0x26, 0x96, 0x77, 0x34, 0x12, 0xab, 0xf5, 0xc2, 0x8d, 0x07, 0xb4, 0x51, 0xc3, 0xff, 0x45, 0x78, 0xfc, 0x85, 0x5e, 0x69, 0xb6, 0xf1, 0x8a, 0xd1, 0xf7, 0x02, 0x1f, 0x00, 0xe1, 0x1f, 0x70, 0x4a, 0x87, 0xe3, 0x45, 0xad, 0xff, 0xd9, 0x88, 0xb4, 0xb9, 0x84, 0x41, 0x9a, 0x0e, 0xa3, 0xc5, 0xb3, 0x1c, 0xb2, 0x29, 0x08, 0xd2, 0xb4, 0xfd, 0x41, 0x47, 0x30, 0x37, 0xc9, 0x50, 0x7a, 0x6e, 0x2c, 0x51, 0x33, 0x49, 0xc4, 0x53, 0x13, 0x36, 0x94, 0x57, 0xe6, 0x5f, 0x74, 0xea, 0xd5, 0xda, 0x6f, 0xfa, 0xe7, 0x1f, 0x69, 0xe8, 0xc8, 0xc0, 0x04, 0xde, 0xc8, 0x54, 0xc5, 0x63, 0x26, 0xb4, 0x73, 0x2d, 0x8f, 0x6b, 0xc0, 0x36, 0xe2, 0x67, 0x2c, 0x12, 0x36, 0xf5, 0x25, 0x7f, 0x1e, 0xec, 0x73, 0x3e, 0x2c, 0x27, 0xd3, 0x21, 0xb3, 0x39, 0xe2, 0x66, 0xd1, 0x5d, 0x3d, 0x43, 0xad, 0xac, 0xe7, 0xc2, 0xfe, 0x93, 0xeb, 0xcf, 0xcd, 0x83, 0x42, 0x8f, 0x7b, 0xea, 0xf6, 0xf4, 0x05, 0x63, 0x88, 0x8f, 0x87, 0x29, 0x90, 0xa5, 0xff, 0xd2, 0xa3, 0x84, 0x54, 0x3a, 0x79, 0x17, 0x97, 0xbd, 0x4f, 0xb9, 0x88, 0xa9, 0x8b, 0x47, 0x5c, 0xf2, 0x9f, 0x79, 0xbd, 0x28, 0x2f, 0x72, 0x13, 0xa7, 0x76, 0x95, 0x02, 0x0e, 0xe6, 0x9b, 0x33, 0xf2, 0x0e, 0xe2, 0x58, 0xd3, 0xc1, 0x08, 0x6a, 0x4e, 0x75, 0xb9, 0x35, 0x95, 0xe9, 0xc5, 0x17, 0x1d, 0x0b, 0x76, 0x05, 0x96, 0x18, 0x20, 0xce, 0x20, 0x05, 0xf9, 0xa4, 0xbc, 0x1e, 0x2b, 0xd8, 0x00, 0xed, 0x28, 0xe5, 0x10, 0x5d, 0x3e, 0xb0, 0xc9, 0x1f, 0x6b, 0x0e, 0x3f, 0x4d, 0x72, 0x87, 0x6a, 0x4d, 0x2e, 0x5a, 0x1c, 0xf9, 0x27, 0xc0, 0x36, 0xfc, 0x63, 0x75, 0x1c, 0x7f, 0x7f, 0x75, 0x66, 0x06, 0xfe, 0x03, 0xd9, 0x94, 0xe0, 0xf0, 0x95, 0x16, 0x76, 0x1a, 0x8f, 0xfe, 0x76, 0x33, 0x42, 0x2f, 0x4b, 0xc4, 0xa2, 0x19, 0xae, 0x71, 0x52, 0x25, 0x7a, 0x7e, 0x16, 0x53, 0xbc, 0x92, 0x8b, 0x21, 0x0a, 0xbb, 0x16, 0xb0, 0x17, 0xb3, 0x1a, 0x22, 0x84, 0x62, 0x6e, 0x46, 0xf8, 0xa3, 0x0e, 0x77, 0x72, 0x4b, 0x10, 0xc1, 0xde, 0x68, 0xda, 0x46, 0xe7, 0xc6, 0x93, 0xe0, 0x0d, 0xb8, 0xd7, 0x08, 0xf7, 0x14, 0xaf, 0xf7, 0x0a, 0x80, 0xc0, 0x0a, 0x3a, 0xec, 0xc2, 0x6b, 0x20, 0x60, 0x34, 0xee, 0x4d, 0xf8, 0x4e, 0x39, 0xdf, 0x2d, 0x38, 0x28, 0x52, 0x55, 0x79, 0x70, 0x98, 0x6d, 0xb2, 0x82, 0x6b, 0x17, 0x8c, 0xb2, 0xe2, 0xdf, 0xef, 0x98, 0x42, 0xc2, 0x75, 0xb6, 0x17, 0xf1, 0x1e, 0x5c, 0x84, 0xd2, 0x45, 0xc9, 0xd8, 0x48, 0xd2, 0x93, 0x61, 0x34, 0xb2, 0x49, 0x85, 0x3c, 0x84, 0x56, 0x0e, 0xcb, 0x95, 0x28, 0xc6, 0x58, 0x0f, 0x92, 0x44, 0xec, 0x6d, 0x6f, 0x05, 0xde, 0x32, 0x89, 0xbf, 0xe1, 0xdb, 0xb9, 0xf1, 0x42, 0x12, 0x4f, 0xbf, 0x6a, 0x24, 0xb3, 0xfd, 0xaa, 0xb5, 0x4d, 0x8a, 0x38, 0xb3, 0xa3, 0xdf, 0x74, 0x88, 0xc1, 0xe7, 0x70, 0x94, 0xde, 0x12, 0xb0, 0xda, 0x3c, 0xa5, 0x2e, 0xf9, 0x50, 0x54, 0xa1, 0x5f, 0x23, 0x12, 0xff, 0xb9, 0xf8, 0x28, 0x41, 0xad, 0x2f, 0x84, 0x66, 0xcc, 0x69, 0x54, 0xba, 0xc2, 0xed, 0xd4, 0x58, 0xd0, 0x4b, 0x64, 0xee, 0x7d, 0x3f, 0xde, 0xc0, 0x88, 0xd7, 0x26, 0xf0, 0x20, 0xd8, 0x03, 0xfc, 0x57, 0x5f, 0x2d, 0x88, 0xd5, 0xc4, 0xa7, 0x5e, 0xc9, 0xc3, 0x4e, 0xb3, 0x26, 0xde, 0xb3, 0xac, 0x0b, 0xfd, 0x26, 0x20, 0x82, 0x58, 0x13, 0xa0, 0x6e, 0x96, 0x92, 0xb4, 0xbf, 0x36, 0x39, 0x68, 0xe8, 0x2f, 0x34, 0x07, 0x93, 0xd3, 0x98, 0x27, 0x93, 0xf9, 0xf5, 0xe5, 0x1a, 0x5b, 0x2b, 0x72, 0x2c, 0x3d, 0x7e, 0xcf, 0x53, 0x50, 0xec, 0xd4, 0x95, 0xd5, 0xbd, 0x77, 0xa3, 0x05, 0x5d, 0x4b, 0x53, 0xb1, 0x67, 0x47, 0x50, 0x26, 0x02, 0xc9, 0x10, 0x53, 0x70, 0xda, 0x07, 0x2e, 0xe4, 0xb4, 0x1b, 0x53, 0x94, 0x82, 0x57, 0xee, 0x10, 0x66, 0xe3, 0xdc, 0xd2, 0xc0, 0x34, 0x0d, 0x16, 0xae, 0x80, 0x2d, 0xec, 0xcf, 0x75, 0x83, 0x8b, 0x4d, 0x2a, 0x19, 0xe8, 0x1a, 0x56, 0x1d, 0x87, 0x79, 0xc0, 0x87, 0x91, 0xc1, 0xf6, 0xfc, 0x28, 0x5d, 0x42, 0xf2, 0xf7, 0x18, 0xda, 0x16, 0x0d, 0x98, 0x57, 0xea, 0xeb, 0x27, 0x68, 0xb3, 0xdb, 0xba, 0xc8, 0x92, 0x84, 0x2b, 0x6d, 0xf1, 0xbc, 0xca, 0x03, 0x20, 0x9d, 0x14, 0x98, 0x40, 0xdb, 0xc2, 0x99, 0x61, 0x54, 0x06, 0xfd, 0xe7, 0xe9, 0x11, 0xc0, 0x32, 0x8d, 0xd8, 0x93, 0x7e, 0x9b, 0x18, 0xd2, 0x07, 0x6d, 0x97, 0xb6, 0x71, 0x2a, 0xae, 0xcc, 0x68, 0xdf, 0x04, 0xa5, 0x84, 0xd2, 0x9c, 0xcf, 0x6f, 0x13, 0x12, 0x05, 0x49, 0x53, 0x21, 0xa3, 0x4b, 0xf9, 0x69, 0x5d, 0xab, 0x73, 0x6f, 0x2f, 0xc0, 0xca, 0xe6, 0x97, 0x67, 0x7a, 0x2d, 0x03, 0xa5, 0x80, 0x18, 0x85, 0x8e, 0xb4, 0xf3, 0xce, 0x65, 0x59, 0xc4, 0x5a, 0x04, 0xf3, 0xd1, 0xe8, 0x7e, 0x58, 0x62, 0x2d, 0x04, 0x0a, 0xc8, 0xc9, 0x05, 0xc4, 0x9e, 0x7a, 0x99, 0x53, 0x4f, 0x90, 0x20, 0xa7, 0xd9, 0xa1, 0x26, 0x2a, 0xd0, 0x7d, 0x8b, 0x51, 0xa5, 0x64, 0xe0, 0x70, 0x28, 0x77, 0x13, 0xd2, 0x4c, 0x6d, 0x4f, 0x09, 0x2a, 0x87, 0x1e, 0x83, 0x49, 0xc6, 0xd1, 0x5e, 0x1d, 0x5b, 0x21, 0x7d, 0xcd, 0x5f, 0x16, 0xdc, 0x3a, 0xc4, 0x28, 0x20, 0x3c, 0x8c, 0xa5, 0x73, 0x2e, 0x38, 0x52, 0x8e, 0xae, 0x84, 0x55, 0x17, 0x9e, 0x51, 0x52, 0x2e, 0x6e, 0xe3, 0xd5, 0x43, 0x9e, 0x4c, 0xf0, 0x2a, 0x7e, 0x28, 0x25, 0x71, 0x39, 0x8b, 0x85, 0xf1, 0x11, 0x38, 0x1a, 0xa3, 0xec, 0x14, 0x83, 0xb5, 0x10, 0xda, 0xde, 0xdd, 0x2b, 0x0f, 0xeb, 0xee, 0x96, 0x39, 0x6d, 0xa9, 0xda, 0x4c, 0xd4, 0xd5, 0x74, 0x65, 0x1a, 0x92, 0xd5, 0xba, 0xeb, 0xea, 0xad, 0xd1, 0x08, 0xa9, 0x69, 0xf1, 0xed, 0x6e, 0xfa, 0xd7, 0xb2, 0x03, 0xd9, 0xa9, 0x2f, 0xea, 0x48, 0x30, 0x63, 0x38, 0xda, 0x41, 0x17, 0xa7, 0x35, 0x7c, 0xbe, 0xe6, 0x17, 0x3a, 0xa0, 0x33, 0x97, 0xc0, 0x37, 0x2c, 0xae, 0xb9, 0xd9, 0xe2, 0xf5, 0xe3, 0x98, 0x30, 0xb0, 0x08, 0x67, 0x4b, 0x0c, 0x30, 0x7e, 0x99, 0xa5, 0x15, 0xff, 0xc7, 0x4b, 0xd7, 0xd9, 0x16, 0x06, 0xf1, 0xec, 0xf5, 0x57, 0x6c, 0x6f, 0xd5, 0xc1, 0x52, 0x8f, 0x39, 0x88, 0x66, 0x59, 0x0c, 0xb9, 0x12, 0xda, 0x38, 0x6a, 0xa1, 0x85, 0x74, 0x43, 0xae, 0xd5, 0x5d, 0x3e, 0xdc, 0x33, 0xc9, 0xaa, 0xc8, 0x19, 0x58, 0x76, 0x3c, 0x78, 0x4c, 0xac, 0xa6, 0x57, 0x9a, 0x3c, 0xc8, 0xbd, 0x40, 0xfb, 0xb0, 0xd2, 0xda, 0xeb, 0xeb, 0x41, 0x70, 0xbd, 0xf6, 0xe0, 0x93, 0x94, 0xf5, 0x93, 0xa8, 0x0c, 0xa7, 0x6e, 0x83, 0x7b, 0x9a, 0x19, 0x38, 0x77, 0x9b, 0x79, 0x2d, 0x98, 0x71, 0x8c, 0x74, 0x7e, 0xcb, 0x95, 0x58, 0x16, 0x76, 0x7a, 0x36, 0x1a, 0xd3, 0x6a, 0x8f, 0xd7, 0x89, 0xc2, 0x5a, 0x33, 0x77, 0x32, 0x9f, 0xee, 0xed, 0x1c, 0x41, 0x28, 0x1b, 0x3c, 0x1c, 0x24, 0xc9, 0x8e, 0x4f, 0x4b, 0x49, 0x6c, 0xdb, 0x74, 0xaa, 0xf7, 0x6e, 0x62, 0x2f, 0xb9, 0x79, 0x8e, 0xff, 0x89, 0x88, 0x27, 0x1e, 0xae, 0xd3, 0x58, 0x9c, 0x47, 0x10, 0xc9, 0x0d, 0xea, 0x8c, 0x68, 0x39, 0x8b, 0x7a, 0x69, 0x14, 0x9f, 0x8b, 0x8b, 0xf0, 0x82, 0xbf, 0x9e, 0xf1, 0x16, 0x7a, 0x42, 0xc1, 0xae, 0xda, 0xf1, 0x86, 0x2a, 0x48, 0x40, 0x11, 0x63, 0x4d, 0x61, 0x58, 0xc9, 0xa7, 0xed, 0x27, 0x4a, 0x9d, 0xe0, 0x12, 0x76, 0x8f, 0xe6, 0xae, 0xe1, 0xd1, 0xd5, 0x01, 0xc9, 0xba, 0x7a, 0x36, 0xf9, 0xf7, 0x98, 0x95, 0xed, 0x25, 0x2e, 0xb3, 0x37, 0xa0, 0xf9, 0xe6, 0x22, 0x95, 0x3a, 0xfc, 0x94, 0x5f, 0xb9, 0x2d, 0x39, 0x10, 0x0a, 0x4d, 0xdd, 0x4d, 0x0f, 0x47, 0x1a, 0x60, 0xbe, 0xc6, 0x34, 0x88, 0x24, 0x35, 0x41, 0x93, 0xaa, 0xea, 0x8d, 0xaf, 0x98, 0x9e, 0x3c, 0x7e, 0xd7, 0x21, 0x31, 0x68, 0xfb, 0x4b, 0x2f, 0x35, 0x81, 0x36, 0x3e, 0xdb, 0x54, 0xaa, 0x51, 0x94, 0x96, 0xd9, 0x25, 0x34, 0x9e, 0x4d, 0x6c, 0xba, 0x3d, 0x1e, 0x2b, 0x25, 0x46, 0x68, 0x61, 0x89, 0x4d, 0xfc, 0xe9, 0x61, 0xae, 0x56, 0xa1, 0x27, 0xd2, 0xd0, 0xcc, 0x22, 0xad, 0x15, 0xb5, 0x80, 0x8b, 0xd7, 0x96, 0xa4, 0x0d, 0xc5, 0xb7, 0xc1, 0x6e, 0xb7, 0xda, 0xa8, 0x0b, 0x2c, 0xd7, 0xde, 0x23, 0xf7, 0x84, 0xf2, 0xdb, 0x35, 0xd7, 0x0d, 0x85, 0x82, 0x4f, 0xcb, 0x21, 0x6d, 0x8f, 0x49, 0x24, 0x29, 0x4d, 0x80, 0x79, 0x85, 0x6a, 0xd1, 0xc6, 0x1d, 0x62, 0xe0, 0xf0, 0xd2, 0xe7, 0xa6, 0xe1, 0x79, 0xc9, 0xc2, 0x89, 0xd0, 0x19, 0x10, 0x22, 0xb6, 0x8e, 0x7d, 0xb9, 0x9b, 0x27, 0x1a, 0xea, 0x35, 0x12, 0x6f, 0xeb, 0x74, 0xcd, 0x11, 0xcc, 0xb9, 0x8b, 0x77, 0xfc, 0x43, 0xd9, 0x09, 0x10, 0xe9, 0x81, 0x7a, 0xc0, 0x0f, 0xaf, 0x58, 0x32, 0xd3, 0x52, 0xe1, 0x7c, 0x87, 0xc5, 0x19, 0x64, 0x64, 0xaf, 0x19, 0x69, 0x7c, 0x28, 0xaa, 0x08, 0xf1, 0x1d, 0x12, 0x38, 0x65, 0xf5, 0x2e, 0x37, 0xb1, 0x74, 0xc1, 0x88, 0xda, 0xe0, 0x0c, 0x3d, 0x41, 0x63, 0x9f, 0x72, 0x19, 0xb1, 0x6e, 0x1a, 0x1e, 0xea, 0x27, 0xfe, 0x84, 0xc2, 0xc3, 0x02, 0x2e, 0xdf, 0x5c, 0xaa, 0x21, 0x83, 0x3e, 0xde, 0x38, 0x6a, 0x40, 0xea, 0x19, 0xf6, 0x55, 0xc9, 0x67, 0x89, 0x5e, 0xa3, 0x3a, 0x32, 0x42, 0x94, 0xcc, 0x8d, 0x41, 0xaf, 0x75, 0xe4, 0x85, 0x43, 0xd9, 0x9a, 0xfa, 0x5c, 0x60, 0xca, 0x60, 0x8d, 0xe6, 0x2b, 0x9f, 0xed, 0xb4, 0x37, 0x5a, 0x60, 0xaf, 0x8c, 0xc6, 0x18, 0xd0, 0x92, 0xbd, 0x5b, 0xd4, 0x5e, 0x0e, 0x86, 0x35, 0xd6, 0x18, 0x52, 0x58, 0x16, 0x97, 0x56, 0x08, 0x13, 0xbd, 0xcd, 0x23, 0x7e, 0x85, 0x9a, 0x93, 0xec, 0x44, 0x89, 0x80, 0x33, 0x80, 0xd8, 0xc4, 0x17, 0x06, 0xf6, 0xa0, 0x26, 0x37, 0x8a, 0xad, 0xe0, 0xa3, 0xb7, 0x15, 0x1b, 0xd9, 0x9e, 0x02, 0xa6, 0x7c, 0x25, 0x57, 0x2d, 0x9a, 0xf7, 0x9f, 0x5c, 0x3a, 0xcd, 0x42, 0x47, 0x34, 0xeb, 0xff, 0x0a, 0x46, 0xed, 0x96, 0xac, 0x63, 0xc3, 0xc5, 0x4a, 0x4e, 0xfb, 0x76, 0x71, 0x68, 0x3e, 0x37, 0xcb, 0xc7, 0x1e, 0xea, 0xfe, 0x87, 0x0f, 0xbe, 0xd1, 0x65, 0xb2, 0x5e, 0x91, 0x89, 0x5a, 0x68, 0xb3, 0xa4, 0xc9, 0x20, 0xba, 0x3b, 0x3a, 0x66, 0x5b, 0x43, 0xa5, 0xe5, 0xdf, 0xed, 0x3e, 0x8e, 0xca, 0xc3, 0x3e, 0x45, 0xba, 0xf4, 0xe7, 0xd9, 0x91, 0xec, 0xc2, 0x3a, 0xd6, 0x28, 0x2c, 0xe6, 0x59, 0x49, 0x10, 0xa5, 0x16, 0x67, 0xf6, 0x76, 0x5c, 0xa7, 0x3d, 0xc9, 0x2f, 0x10, 0xa4, 0xee, 0xea, 0x9a, 0x10, 0xce, 0x29, 0x88, 0x89, 0xd9, 0xe5, 0xf8, 0x85, 0x3f, 0xe1, 0xb9, 0x69, 0x63, 0x45, 0x5c, 0x4d, 0x8d, 0x89, 0x8e, 0xff, 0xde, 0x95, 0xa5, 0x4b, 0x8a, 0x27, 0x78, 0x7a, 0x41, 0x74, 0x74, 0x19, 0xee, 0x12, 0xec, 0xfc, 0xa4, 0x15, 0xb1, 0x82, 0xd5, 0x79, 0xe3, 0x19, 0xc6, 0xc0, 0x06, 0x05, 0x3f, 0xdb, 0x58, 0x5e, 0x87, 0x4e, 0x62, 0x58, 0x90, 0x90, 0xce, 0xc8, 0x6e, 0xb0, 0x78, 0xe3, 0x0d, 0x3e, 0xc8, 0x48, 0x24, 0x69, 0x3e, 0x41, 0x65, 0x65, 0x4e, 0x45, 0xf7, 0x10, 0x6f, 0xc2, 0x25, 0xd4, 0x6f, 0x1a, 0x58, 0xcf, 0x09, 0xeb, 0x42, 0x31, 0xb9, 0x94, 0x5d, 0xe6, 0xcf, 0xf5, 0x94, 0x76, 0xc3, 0x76, 0x3f, 0x29, 0xc8, 0x4a, 0x55, 0x6e, 0xa3, 0xf5, 0xdd, 0x7d, 0xbe, 0x0b, 0xa6, 0x3c, 0x78, 0x3b, 0x38, 0x5f, 0xc0, 0x8d, 0x0a, 0xd4, 0xe2, 0xe8, 0xf6, 0x5e, 0xa0, 0xd7, 0xe9, 0x80, 0x85, 0x8c, 0xdf, 0x9c, 0x76, 0x26, 0x0f, 0x5c, 0x8a, 0x2f, 0x62, 0x51, 0x1c, 0x69, 0x2a, 0xda, 0x1e, 0xca, 0x11, 0x48, 0xaf, 0xc5, 0x4f, 0x3f, 0xf0, 0xcb, 0x21, 0x5f, 0x14, 0x12, 0x76, 0x24, 0xb7, 0x95, 0xeb, 0x0b, 0x71, 0x5c, 0xf9, 0xf7, 0xaa, 0xfd, 0x6d, 0xd2, 0xb0, 0x63, 0x19, 0x77, 0x06, 0xce, 0xca, 0xd0, 0x00, 0x1b, 0x7a, 0x3b, 0x8c, 0x46, 0xc6, 0x33, 0x53, 0x2d, 0xa2, 0x2c, 0x01, 0x96, 0x4b, 0xbe, 0xe0, 0x74, 0x7d, 0x06, 0xac, 0x66, 0xe7, 0x4a, 0xa3, 0x81, 0xdc, 0xdb, 0xdb, 0x4f, 0x4b, 0x40, 0xd8, 0x17, 0xf1, 0x90, 0x5e, 0x5f, 0xcd, 0x20, 0x84, 0xb0, 0xd4, 0x5e, 0x0a, 0x99, 0xe7, 0xfd, 0xec, 0xf6, 0x02, 0x53, 0x37, 0x73, 0xb6, 0xff, 0x1c, 0x4b, 0xd9, 0xce, 0x43, 0x56, 0x7c, 0xe0, 0x62, 0x42, 0x1d, 0x06, 0x0d, 0x20, 0x1e, 0x6f, 0xd0, 0x23, 0x76, 0x84, 0x7b, 0xa5, 0xa7, 0x10, 0xbd, 0x6b, 0xf0, 0xa4, 0xf4, 0x2a, 0xc3, 0x3a, 0x44, 0x4a, 0x79, 0x18, 0xe6, 0xe9, 0x45, 0xf7, 0xc3, 0x23, 0x66, 0x65, 0x42, 0x91, 0xa1, 0x68, 0x5e, 0x0f, 0xef, 0x64, 0xfb, 0xc3, 0x73, 0x3e, 0x7a, 0x5b, 0xae, 0xc2, 0x8b, 0x95, 0xf6, 0x42, 0x42, 0x05, 0x24, 0x80, 0x6e, 0x13, 0x8e, 0xcf, 0x26, 0x43, 0x35, 0x74, 0xa4, 0xb9, 0x3f, 0x52, 0x57, 0xfc, 0xa7, 0xc7, 0x33, 0xfa, 0x33, 0xd1, 0x4c, 0x4c, 0xa6, 0x75, 0xa3, 0xbc, 0x37, 0x61, 0x3f, 0x04, 0x43, 0xd0, 0x80, 0xd9, 0x3f, 0xae, 0xb1, 0x28, 0xf0, 0xfc, 0xdc, 0xa0, 0xde, 0x77, 0xe2, 0x70, 0x06, 0x74, 0xca, 0x52, 0xcf, 0x0f, 0x5a, 0xc8, 0x3f, 0x84, 0xe4, 0xa5, 0x6f, 0xdd, 0x63, 0xd0, 0x3c, 0xce, 0xc7, 0x45, 0x40, 0xdd, 0x8c, 0x5c, 0x01, 0xc5, 0x91, 0x4e, 0x67, 0x1d, 0x28, 0xf5, 0x74, 0x35, 0x69, 0xd3, 0x2f, 0x41, 0xcd, 0x56, 0xe1, 0xb9, 0xf8, 0x5a, 0x84, 0xff, 0xd5, 0xf0, 0x79, 0x43, 0xe8, 0x5e, 0x79, 0xa4, 0xe0, 0x67, 0xce, 0x97, 0x6c, 0xcc, 0xc3, 0x8d, 0x50, 0x12, 0x59, 0xd0, 0xb8, 0x86, 0x3b, 0xae, 0xcc, 0x7f, 0xf4, 0xda, 0x84, 0xe3, 0x60, 0x0f, 0xbe, 0xec, 0x60, 0xf6, 0x8e, 0x2c, 0xd2, 0x4a, 0xd5, 0xcf, 0xc1, 0x3a, 0x15, 0x21, 0xd8, 0x0f, 0x83, 0x50, 0x1d, 0x0e, 0x5e, 0x72, 0xdc, 0xa0, 0x80, 0xc9, 0xe0, 0xb0, 0x33, 0x46, 0xe9, 0x55, 0x45, 0x4d, 0x5b, 0xb1, 0x5f, 0xb8, 0x34, 0x19, 0x92, 0x1e, 0x40, 0x75, 0x33, 0x55, 0x90, 0xea, 0xe9, 0x35, 0x28, 0xb7, 0x04, 0x9f, 0xf8, 0x5d, 0x10, 0xbe, 0x0e, 0x03, 0xaa, 0x8d, 0x09, 0x18, 0x93, 0x9a, 0xd1, 0x3a, 0x03, 0x09, 0x85, 0x57, 0x40, 0xdb, 0xb5, 0x12, 0x6e, 0x71, 0xd2, 0x68, 0xa9, 0x4b, 0xe2, 0x93, 0x51, 0x16, 0x78, 0x2e, 0xa5, 0xe6, 0xe4, 0x9b, 0x94, 0xc0, 0xa7, 0xa2, 0xcf, 0x5b, 0x2a, 0x5a, 0x23, 0x27, 0xaf, 0x4d, 0x06, 0x8f, 0x87, 0xd7, 0x70, 0x7b, 0x85, 0xcf, 0xec, 0x1a, 0xb4, 0x69, 0xee, 0xde, 0x45, 0x5b, 0x67, 0xc8, 0xcb, 0x3f, 0x97, 0xe5, 0xab, 0x39, 0x22, 0x19, 0xcd, 0xd9, 0x67, 0x1b, 0x98, 0x43, 0x0d, 0xc1, 0x1e, 0x8d, 0xde, 0x7e, 0x93, 0x68, 0xd9, 0x29, 0x04, 0x03, 0x82, 0xff, 0x45, 0x2c, 0x7d, 0xec, 0x2c, 0xb9, 0x5b, 0x06, 0xfc, 0x26, 0xb4, 0x5a, 0x24, 0x7f, 0x76, 0xec, 0x2a, 0x80, 0x7c, 0xf9, 0xe2, 0xfc, 0x63, 0x7f, 0xe3, 0x7b, 0x99, 0x00, 0x3b, 0x27, 0xb6, 0x82, 0x62, 0xe9, 0x10, 0xda, 0x6d, 0xcf, 0x89, 0x2a, 0x84, 0xb1, 0xac, 0xa9, 0x96, 0x14, 0xf9, 0xa2, 0x4b, 0x4e, 0x7c, 0xc0, 0x3b, 0xeb, 0xa5, 0x88, 0x5d, 0x50, 0x53, 0x27, 0xc2, 0x9e, 0x32, 0x6e, 0x83, 0xd9, 0x47, 0x1b, 0xf8, 0x4a, 0xc9, 0x5a, 0x2a, 0x21, 0x33, 0x8b, 0x8b, 0x5f, 0x97, 0x46, 0xe5, 0xf3, 0x35, 0x9c, 0x91, 0x23, 0x4c, 0xa0, 0xe9, 0x2e, 0x30, 0x27, 0xff, 0x30, 0x9d, 0xcb, 0x90, 0x45, 0x4b, 0x36, 0x33, 0xf1, 0xc2, 0x9d, 0xd6, 0xc0, 0x70, 0x8a, 0x6b, 0x29, 0xf9, 0xdf, 0xdf, 0xb8, 0xce, 0x18, 0x4c, 0x6d, 0x01, 0xd0, 0x6f, 0x5f, 0x58, 0x86, 0x5c, 0xa4, 0xa0, 0xa2, 0x70, 0x75, 0x43, 0xb3, 0x88, 0x8e, 0x1d, 0xfb, 0x70, 0xd4, 0x8c, 0x2d, 0x9f, 0x3a, 0xc6, 0x75, 0x21, 0xe5, 0x70, 0xb9, 0xd4, 0x8f, 0x6c, 0x1f, 0xd7, 0x29, 0xf2, 0xcf, 0x40, 0xc4, 0xe2, 0xfa, 0x0d, 0xb1, 0x58, 0x1b, 0x5e, 0xe7, 0x81, 0x7c, 0xe1, 0xa6, 0xae, 0xfc, 0x8d, 0x5a, 0xa7, 0x11, 0x93, 0xc2, 0x42, 0x09, 0x91, 0x51, 0x34, 0x95, 0x09, 0xd5, 0x26, 0x87, 0x13, 0x56, 0x0c, 0xdb, 0x4e, 0x41, 0xb2, 0xf4, 0x1c, 0xc6, 0x97, 0x29, 0x0f, 0x7e, 0xff, 0x80, 0x9e, 0x51, 0x44, 0xb9, 0x1d, 0x97, 0x6d, 0x8f, 0xec, 0x7d, 0x01, 0x3a, 0xee, 0xaa, 0x1e, 0x38, 0x3c, 0x23, 0xc5, 0x4d, 0x1b, 0x6c, 0x78, 0xc9, 0x2c, 0xf1, 0x07, 0x09, 0xe3, 0xa4, 0xa7, 0x40, 0x3a, 0xe6, 0x44, 0x78, 0xa7, 0xab, 0x18, 0xd3, 0x4b, 0xd9, 0x7d, 0x17, 0x6c, 0xf2, 0xff, 0x69, 0x25, 0xf3, 0xb6, 0x59, 0x5c, 0x7c, 0xd3, 0x1f, 0xf5, 0x30, 0x78, 0x24, 0x45, 0x5f, 0xcd, 0xc5, 0xca, 0xe3, 0x50, 0x53, 0x19, 0x47, 0x6c, 0x5e, 0x17, 0x2f, 0x4e, 0x33, 0x6c, 0xf3, 0xf4, 0xa3, 0x35, 0x8e, 0x86, 0x06, 0xf9, 0xb7, 0xea, 0x80, 0xdf, 0x4d, 0x93, 0x83, 0x1e, 0xf8, 0x99, 0x95, 0xb4, 0x0e, 0x0f, 0x54, 0x5b, 0xb3, 0x91, 0xb7, 0xb9, 0x45, 0x1c, 0x96, 0xd7, 0xf7, 0x22, 0x6d, 0xd4, 0xbb, 0xde, 0x5d, 0xdb, 0x66, 0xe6, 0x73, 0x52, 0x0e, 0xff, 0x2d, 0x54, 0xb7, 0x34, 0x3a, 0x62, 0x2f, 0x2a, 0x82, 0x55, 0x37, 0xae, 0x66, 0x97, 0xe3, 0x90, 0x49, 0x93, 0x44, 0xb4, 0x4f, 0x6a, 0x44, 0x66, 0x64, 0xe8, 0xd0, 0xee, 0x81, 0xb6, 0x3d, 0x64, 0x2a, 0xd1, 0xe4, 0xc6, 0x3c, 0x3a, 0x10, 0x48, 0xe5, 0xf0, 0x1b, 0xeb, 0xf4, 0x1b, 0xd3, 0x51, 0x53, 0x8a, 0x22, 0xd0, 0xd1, 0x5f, 0xef, 0xc5, 0x25, 0x09, 0x3f, 0x2b, 0x30, 0x73, 0xa0, 0x6c, 0x83, 0x7b, 0xc7, 0x76, 0x21, 0xa6, 0x78, 0x12, 0x86, 0x12, 0xa6, 0x71, 0xe8, 0xac, 0xdc, 0x08, 0xbc, 0xa2, 0xdb, 0x9f, 0x7c, 0x1c, 0x85, 0xa4, 0xa8, 0x27, 0xf9, 0xc4, 0x0b, 0xf1, 0x00, 0xbd, 0x3f, 0x3c, 0xa8, 0x6d, 0x73, 0x0d, 0x2e, 0x2f, 0x6c, 0xa4, 0x21, 0x68, 0xca, 0xb1, 0xc5, 0x5d, 0x8d, 0xc5, 0xb6, 0x48, 0xd7, 0x07, 0xcd, 0xaa, 0xf3, 0x28, 0x47, 0xe2, 0x97, 0x99, 0x24, 0xff, 0x66, 0xfb, 0xce, 0xd3, 0xb9, 0xd7, 0xfb, 0x48, 0x9f, 0x8f, 0xd4, 0xf8, 0x23, 0x94, 0x57, 0xf7, 0xcd, 0xda, 0xfa, 0xf3, 0x6b, 0x89, 0x91, 0x80, 0x10, 0xf6, 0x71, 0xad, 0x5e, 0xd1, 0xd6, 0xdb, 0x01, 0xa0, 0x82, 0xcf, 0x7c, 0x6b, 0xa7, 0x05, 0x28, 0xb9, 0x07, 0x47, 0x79, 0xbc, 0x5a, 0x7f, 0x84, 0xc9, 0xf0, 0xca, 0xbe, 0x0b, 0x97, 0xcd, 0x07, 0x77, 0xbf, 0x4c, 0xe7, 0x02, 0xdc, 0xf8, 0x17, 0x12, 0x0c, 0x89, 0x43, 0x33, 0xfa, 0x0d, 0x0e, 0x0c, 0x02, 0x80, 0x57, 0x91, 0x96, 0x9c, 0xba, 0x7a, 0xe0, 0xf2, 0x5a, 0xf3, 0xa8, 0x3a, 0xde, 0x95, 0x79, 0xe8, 0xba, 0x95, 0xff, 0x00, 0xb0, 0x3b, 0xb4, 0x2a, 0x96, 0x96, 0xbc, 0x09, 0x59, 0x6f, 0x0c, 0xc9, 0x42, 0x7b, 0xd2, 0xf7, 0x78, 0xd4, 0x11, 0x96, 0xc7, 0xaa, 0x8c, 0x6f, 0x9f, 0x36, 0xe6, 0xa8, 0x60, 0xf0, 0x07, 0x98, 0xd4, 0x02, 0xc2, 0xda, 0xfd, 0xfc, 0xb4, 0xa0, 0x12, 0xc9, 0x6f, 0x4a, 0xc4, 0xe2, 0xd8, 0x38, 0xc5, 0xc1, 0xcd, 0xdc, 0x8b, 0x99, 0x0b, 0x13, 0x52, 0x44, 0x4f, 0xb5, 0x60, 0x7d, 0xbc, 0x6a, 0x8c, 0x4f, 0x7d, 0xc0, 0x01, 0xcd, 0xab, 0x7b, 0x40, 0x04, 0x71, 0x2d, 0x64, 0x2e, 0x6e, 0x06, 0xaa, 0x29, 0x5a, 0xec, 0x30, 0x27, 0xed, 0xce, 0xfd, 0xa6, 0xfc, 0x36, 0x42, 0xa3, 0xe6, 0x1e, 0xdf, 0x0a, 0x2e, 0x05, 0x29, 0x72, 0x69, 0x42, 0xeb, 0x07, 0x5b, 0x97, 0xab, 0xc7, 0x5d, 0x09, 0x2e, 0xf2, 0x01, 0xef, 0x3e, 0xbb, 0xf9, 0x4a, 0xaa, 0x44, 0x35, 0x54, 0x8f, 0xc9, 0x4c, 0x5c, 0xd6, 0x1c, 0x1d, 0xd0, 0xfe, 0x51, 0xb6, 0x9c, 0x1b, 0xba, 0x75, 0xb2, 0x1f, 0x16, 0x6c, 0xea, 0x59, 0x05, 0x0a, 0x0d, 0x3b, 0xbf, 0xf8, 0x2c, 0x60, 0x06, 0x42, 0x37, 0xce, 0x59, 0xb7, 0xcb, 0x78, 0x6b, 0x92, 0x4a, 0x07, 0xd3, 0x5a, 0x31, 0xd9, 0x05, 0x06, 0xa6, 0x4a, 0x81, 0x65, 0x51, 0x33, 0x4a, 0xbd, 0x6d, 0xb1, 0x9a, 0xb3, 0x1f, 0x28, 0xd4, 0x6a, 0x06, 0x87, 0xba, 0xef, 0x13, 0xcd, 0xe0, 0xd5, 0x9b, 0xcc, 0x60, 0x1c, 0xaa, 0x2c, 0xd0, 0x58, 0x9b, 0xb4, 0x71, 0x0e, 0xe5, 0xc5, 0xa9, 0x62, 0x38, 0x27, 0xb4, 0xef, 0xc9, 0x09, 0x96, 0xf7, 0xea, 0x42, 0x54, 0xbc, 0xdd, 0xdd, 0x63, 0x2d, 0xea, 0xd5, 0x61, 0xc5, 0xaf, 0x1d, 0x03, 0xb1, 0xb8, 0xe3, 0x4f, 0x31, 0x4f, 0x16, 0x0b, 0x40, 0x95, 0x26, 0x75, 0x77, 0xd2, 0x0b, 0x34, 0x2f, 0x0a, 0x88, 0x8f, 0xe6, 0xd1, 0xb1, 0xdd, 0xe4, 0x5f, 0xab, 0x3c, 0x1d, 0xe7, 0xb3, 0x86, 0x5a, 0x25, 0x61, 0x81, 0x94, 0x37, 0x2e, 0x56, 0xa0, 0xad, 0x35, 0x45, 0x12, 0xe3, 0x36, 0x96, 0x5b, 0x8f, 0xe0, 0xd3, 0x34, 0x96, 0x50, 0x34, 0x40, 0x24, 0xd5, 0x5b, 0xec, 0xfb, 0xf6, 0x41, 0x9b, 0x0b, 0xb6, 0x71, 0x00, 0x43, 0x16, 0x74, 0xca, 0xa8, 0xdc, 0x8c, 0x87, 0xa4, 0x93, 0xa5, 0xc2, 0xa0, 0xd3, 0x88, 0x6f, 0xd5, 0xc2, 0x52, 0x8a, 0x5e, 0xdb, 0x24, 0xfa, 0x92, 0xee, 0x1d, 0xbb, 0x92, 0x68, 0x85, 0x3c, 0x1e, 0xd5, 0x4b, 0x06, 0xad, 0xa3, 0xb2, 0x9f, 0xbc, 0x29, 0x47, 0xae, 0x66, 0xe8, 0x16, 0x5f, 0x35, 0x10, 0x1d, 0x09, 0x38, 0x46, 0x01, 0x0f, 0x55, 0xa4, 0x00, 0x04, 0xe1, 0x01, 0x27, 0x12, 0x6e, 0x73, 0xc5, 0x9c, 0xe4, 0x13, 0x1f, 0x22, 0xd4, 0x00, 0x65, 0x65, 0x08, 0xa7, 0xe5, 0xcc, 0x5f, 0x41, 0x7f, 0x07, 0xd8, 0x9c, 0x59, 0xf2, 0xec, 0x1f, 0xd4, 0xbc, 0x21, 0x09, 0xbe, 0x48, 0xdc, 0xf9, 0xc9, 0xd3, 0x76, 0xb3, 0x3b, 0xd8, 0x93, 0x21, 0xe8, 0x30, 0xaf, 0x98, 0x5d, 0x7e, 0xfa, 0x5d, 0x5f, 0xca, 0x66, 0x68, 0x94, 0x6c, 0xfe, 0x67, 0x7f, 0x2c, 0x79, 0x06, 0xb2, 0xa7, 0x0f, 0x6e, 0x3e, 0xf5, 0x8b, 0x0b, 0x6f, 0x88, 0xa2, 0x93, 0xb6, 0x57, 0x83, 0x44, 0xe7, 0x3c, 0xaf, 0x6d, 0xa4, 0x9b, 0x0b, 0x2f, 0x19, 0x45, 0x33, 0x85, 0xeb, 0x9c, 0x12, 0x82, 0x6a, 0xf7, 0xb0, 0xda, 0x0e, 0x48, 0x4a, 0xa4, 0x21, 0xfc, 0xa8, 0x5e, 0xb9, 0x22, 0xab, 0x32, 0xe9, 0xd0, 0x26, 0x77, 0x38, 0xc2, 0xee, 0x7b, 0x52, 0x45, 0x35, 0x80, 0xfe, 0x53, 0x13, 0x04, 0x50, 0x00, 0x66, 0x46, 0x20, 0x15, 0xdc, 0x05, 0xbb, 0xfa, 0x4e, 0x8b, 0xd7, 0xd9, 0x50, 0xea, 0xcd, 0x00, 0x06, 0x86, 0x02, 0x87, 0x39, 0xd3, 0xa6, 0x33, 0xa9, 0x60, 0xa2, 0x9b, 0xa5, 0x15, 0xcb, 0x89, 0xda, 0xb9, 0x5c, 0xa3, 0x69, 0xb6, 0xa3, 0x4b, 0x3c, 0x21, 0xfa, 0xc3, 0x99, 0xf5, 0xf9, 0x95, 0xf7, 0x9f, 0xea, 0x32, 0x11, 0xc0, 0x7d, 0xd9, 0x3a, 0x2e, 0xbe, 0xba, 0xf0, 0x3c, 0x43, 0x5c, 0xb3, 0x3b, 0xaa, 0x3c, 0x18, 0x40, 0x43, 0xb7, 0x19, 0x28, 0x09, 0x29, 0xaf, 0xda, 0xd7, 0x57, 0xa3, 0xcc, 0xd8, 0x0a, 0xa0, 0xc9, 0x40, 0xfd, 0x8e, 0xf1, 0x39, 0xf9, 0x1b, 0x01, 0x20, 0x3f, 0x9a, 0xd4, 0xf2, 0x26, 0x11, 0x2a, 0x01, 0x05, 0x8d, 0xa9, 0xec, 0x53, 0xb9, 0x21, 0xcd, 0x0d, 0xaf, 0x14, 0xb4, 0x58, 0x0e, 0x76, 0x55, 0x68, 0x4d, 0xb1, 0xfd, 0xa0, 0x4f, 0xec, 0xcb, 0xfb, 0x37, 0x8d, 0x1c, 0xaa, 0x7d, 0xfc, 0x47, 0xff, 0x42, 0xaa, 0x8b, 0x89, 0xe0, 0x53, 0x45, 0x81, 0xc6, 0x80, 0x66, 0x64, 0x83, 0x4f, 0x25, 0xe2, 0x20, 0x76, 0xf1, 0xf7, 0xb3, 0x86, 0xaa ],
+const [ 0x16, 0x00, 0xa3, 0x49, 0x99, 0x0d, 0xf4, 0x2a, 0xba, 0x9f, 0xa0, 0x3f, 0x70, 0xde, 0xff, 0x0f, 0x75, 0xae, 0x35, 0xc1, 0xa8, 0x82, 0xb4, 0x8c, 0xaf, 0x75, 0x02, 0x6e, 0xe0, 0x97, 0xbd, 0x21, 0x62, 0x84, 0xdc, 0x4b, 0x8f, 0x3c, 0x37, 0xf5, 0x9d, 0x2e, 0x4a, 0x3e, 0x7e, 0x96, 0x35, 0x50, 0x04, 0x09, 0x08, 0x94, 0x49, 0x4e, 0x3e, 0x22, 0x4e, 0x70, 0x87, 0x7c, 0xe2, 0x11, 0xcb, 0x7b, 0xc6, 0x01, 0x6b, 0x89, 0x0e, 0x10, 0xca, 0x11, 0xca, 0x20, 0x0c, 0x34, 0xe6, 0x7e, 0x1d, 0xbe, 0x4f, 0x72, 0xf5, 0x58, 0x57, 0x14, 0x1b, 0xff, 0x5b, 0x62, 0x68, 0xb4, 0xa3, 0x90, 0x0e, 0x75, 0x89, 0x9f, 0xd9, 0x6d, 0xde, 0x31, 0xb4, 0x68, 0x89, 0x9c, 0x6e, 0x89, 0x71, 0x3d, 0xbe, 0x3f, 0x9e, 0x0f, 0x85, 0x75, 0x9b, 0x7b, 0x54, 0x09, 0x1e, 0x72, 0x2e, 0x80, 0xea, 0xba, 0x8f, 0xf8, 0xf5, 0x85, 0xac, 0x5d, 0xc6, 0x48, 0xfd, 0xe0, 0x22, 0xca, 0xf9, 0xa5, 0xe7, 0x7c, 0x21, 0xbc, 0x38, 0x08, 0x3f, 0x53, 0xda, 0x2c, 0xf0, 0x2a, 0xde, 0xc9, 0x60, 0x47, 0x81, 0x37, 0x55, 0xea, 0x50, 0xdc, 0x6f, 0xc3, 0x90, 0xfd, 0xae, 0x63, 0xdc, 0xd3, 0x34, 0xf1, 0x10, 0xe2, 0x4c, 0x1e, 0x66, 0x86, 0xac, 0x5a, 0xdf, 0xcf, 0xf7, 0x49, 0xe5, 0x8e, 0x86, 0x70, 0x2e, 0xb0, 0x68, 0x35, 0xe3, 0xcb, 0xa7, 0x06, 0x02, 0xf7, 0xcd, 0xd8, 0x01, 0xdf, 0xa7, 0xd3, 0xb4, 0x18, 0x49, 0x4b, 0x70, 0xb1, 0x52, 0xf3, 0x71, 0x0b, 0x72, 0x4d, 0x79, 0xea, 0x29, 0x65, 0xba, 0xcd, 0xd1, 0xbf, 0xf6, 0x7b, 0xde, 0x8e, 0xe5, 0xdf, 0x65, 0x26, 0xd7, 0x15, 0xdb, 0xb4, 0x9a, 0xc5, 0x20, 0x2d, 0x9e, 0xb0, 0xbb, 0x84, 0x57, 0x88, 0x68, 0x20, 0xe3, 0x05, 0xd0, 0x8d, 0xed, 0x35, 0x97, 0x72, 0xd1, 0x14, 0x9b, 0xc3, 0x00, 0x5c, 0x7b, 0x37, 0xa7, 0x9e, 0x57, 0xfd, 0x8b, 0x92, 0xd7, 0xab, 0x37, 0xac, 0x6f, 0x77, 0x5a, 0xef, 0xe1, 0xa9, 0x6b, 0x06, 0x03, 0x50, 0x8e, 0x91, 0xc2, 0x34, 0xbb, 0xbd, 0x67, 0x0d, 0x1d, 0x17, 0x19, 0xf2, 0xb8, 0xa2, 0xa3, 0x14, 0x4f, 0x26, 0x78, 0xac, 0x85, 0xcc, 0xf4, 0x32, 0x42, 0xe8, 0xe5, 0xd0, 0x58, 0x16, 0x4a, 0x16, 0x67, 0x88, 0x5b, 0xef, 0xfe, 0x9e, 0xc9, 0xd4, 0x02, 0xb7, 0x46, 0x3f, 0x54, 0x48, 0x48, 0x63, 0xae, 0x2b, 0x0a, 0x1a, 0xce, 0x39, 0xd4, 0x1f, 0xd7, 0x1a, 0x7d, 0x7d, 0xf4, 0x5c, 0x2e, 0x47, 0x3e, 0xc3, 0x68, 0x8a, 0xe0, 0xe0, 0x49, 0x80, 0x78, 0xe5, 0x0b, 0x06, 0xc1, 0xb8, 0xcd, 0x50, 0x70, 0x46, 0x96, 0xdc, 0x5b, 0x1a, 0x97, 0xa4, 0xe0, 0x2e, 0xb0, 0x98, 0x85, 0x01, 0x36, 0x4b, 0xdc, 0xe9, 0xf4, 0xed, 0xaa, 0xab, 0x6f, 0x79, 0x47, 0x49, 0x6f, 0x2f, 0x48, 0x1b, 0xba, 0x45, 0x5c, 0x21, 0x23, 0xda, 0x74, 0x98, 0xc3, 0x2b, 0x27, 0xcb, 0x87, 0x09, 0x54, 0x2c, 0xeb, 0x8b, 0x09, 0xa3, 0x04, 0x00, 0xa3, 0x26, 0xc4, 0x27, 0x37, 0x8a, 0x7a, 0xa3, 0x31, 0x99, 0x98, 0xa9, 0x3b, 0x64, 0xb9, 0xfc, 0x61, 0xdb, 0xe2, 0x1b, 0x72, 0x9a, 0x08, 0xb8, 0xa9, 0x06, 0xd3, 0x6d, 0x8c, 0x99, 0xa2, 0xab, 0x15, 0x7a, 0xcf, 0xf3, 0x10, 0x51, 0x34, 0x48, 0xc4, 0x59, 0xee, 0xe4, 0xd5, 0xb7, 0x60, 0x2a, 0x69, 0x0a, 0x7b, 0xdc, 0x8a, 0x43, 0x3d, 0x8e, 0xcc, 0xb7, 0x78, 0x5a, 0x2f, 0x72, 0xd5, 0xd6, 0x46, 0xce, 0x18, 0x43, 0x99, 0x45, 0xa6, 0x07, 0x49, 0x84, 0x44, 0x5e, 0xf2, 0xc0, 0x21, 0x4c, 0xd5, 0x4d, 0x17, 0xd6, 0x37, 0x6d, 0x2e, 0x71, 0x04, 0x66, 0x62, 0xbb, 0xb8, 0xd7, 0xa6, 0x69, 0x7f, 0x4b, 0x28, 0x80, 0x9b, 0x0f, 0xd7, 0xc9, 0x07, 0x41, 0x23, 0x7e, 0x5a, 0x2a, 0x03, 0x4a, 0xed, 0xce, 0x3d, 0x71, 0x40, 0xc0, 0xe2, 0x4a, 0x9a, 0x3b, 0x17, 0xf6, 0xf0, 0x6f, 0x1b, 0x4c, 0x08, 0x19, 0x86, 0x13, 0xdf, 0x56, 0xcf, 0x74, 0x47, 0xb9, 0x11, 0xae, 0xd4, 0x9b, 0x0f, 0x0c, 0xf9, 0xb2, 0x75, 0x15, 0x6f, 0xe6, 0x61, 0x02, 0xd6, 0x5f, 0x21, 0x75, 0x9f, 0xe3, 0x3f, 0x67, 0x29, 0x5f, 0xba, 0x62, 0x2a, 0xc3, 0x97, 0xf1, 0x51, 0x13, 0x98, 0x56, 0x2a, 0xbb, 0x4c, 0x7a, 0x41, 0x24, 0x48, 0x2a, 0x8a, 0x84, 0xb3, 0x7f, 0x00, 0xfa, 0x08, 0x9e, 0x8d, 0xda, 0x17, 0xa2, 0x2a, 0x46, 0x4d, 0xd7, 0x47, 0xfe, 0x36, 0x29, 0x6d, 0x78, 0x40, 0xdc, 0x22, 0x34, 0xc2, 0x7d, 0x0d, 0x4a, 0x3c, 0x18, 0x5a, 0x45, 0xe1, 0xab, 0x60, 0x33, 0x52, 0xdb, 0x81, 0xfd, 0xad, 0xe6, 0x52, 0xf5, 0xc6, 0xd9, 0xfc, 0xae, 0xb4, 0x03, 0xe3, 0x10, 0x90, 0xa9, 0x85, 0xab, 0x79, 0xfb, 0xa4, 0x4c, 0xdb, 0x47, 0xa7, 0xce, 0xf1, 0x6d, 0x3e, 0x33, 0x89, 0x93, 0x45, 0xf4, 0x08, 0x19, 0xeb, 0x94, 0xad, 0xcf, 0x13, 0x7b, 0x1a, 0x66, 0xfa, 0x02, 0x10, 0x25, 0x1a, 0xcb, 0x7a, 0xdd, 0x4f, 0x53, 0xad, 0x1f, 0x39, 0xca, 0xee, 0xac, 0xe1, 0x22, 0x34, 0x2d, 0x9f, 0x66, 0x30, 0x25, 0x3b, 0x4d, 0x8b, 0x23, 0x52, 0x0f, 0x6f, 0x3c, 0xfb, 0x77, 0x48, 0xb8, 0xab, 0x39, 0xcc, 0x0c, 0x56, 0x87, 0x39, 0x09, 0xd7, 0xdf, 0xdd, 0x52, 0x92, 0x27, 0xdc, 0x13, 0x58, 0xfb, 0x2e, 0xf0, 0x8b, 0x46, 0xe7, 0x3c, 0x82, 0x0f, 0xbb, 0x6c, 0x2e, 0x96, 0xc1, 0xcb, 0xfe, 0xa0, 0x77, 0x6f, 0x01, 0x0f, 0x07, 0x6b, 0x4b, 0xb5, 0xc8, 0x46, 0x99, 0x6a, 0x08, 0xac, 0x38, 0x5c, 0x09, 0x64, 0x22, 0xa7, 0x49, 0x82, 0x6b, 0x26, 0x06, 0xde, 0xdb, 0x88, 0x02, 0xc4, 0xdd, 0xa6, 0x84, 0xed, 0x97, 0x13, 0x9f, 0xae, 0x5b, 0xf5, 0xb6, 0x70, 0x3e, 0x14, 0x40, 0x60, 0x06, 0x31, 0xc9, 0x68, 0x4a, 0x99, 0x39, 0x5d, 0xd4, 0xfa, 0x59, 0x7a, 0x4a, 0x74, 0x93, 0x0d, 0x0e, 0xf3, 0xfa, 0x70, 0x62, 0xbd, 0x8a, 0x3b, 0xd0, 0x47, 0xb0, 0xb8, 0xc9, 0x4d, 0x0d, 0x97, 0x8c, 0x21, 0x77, 0xe3, 0x49, 0x44, 0x40, 0x35, 0x86, 0x33, 0xbb, 0x28, 0xc3, 0x83, 0xfd, 0x0c, 0x59, 0x30, 0xe1, 0xdf, 0xa8, 0x33, 0x4f, 0x79, 0x71, 0x52, 0xbd, 0x06, 0x81, 0x3c, 0xf5, 0xb9, 0x90, 0xd5, 0x19, 0xbf, 0x68, 0xcf, 0xe5, 0x72, 0x4a, 0x7a, 0x35, 0xd0, 0x8d, 0xdd, 0xc7, 0x2b, 0x88, 0x05, 0x41, 0x21, 0xb2, 0x9d, 0x76, 0xcf, 0x08, 0xbf, 0xe5, 0x42, 0xaf, 0x0a, 0x82, 0x2e, 0xdb, 0xf5, 0xba, 0xe3, 0xef, 0x62, 0xb1, 0x7c, 0xe6, 0x77, 0xce, 0x5a, 0xf1, 0xa9, 0x79, 0xd1, 0x61, 0x19, 0x23, 0x20, 0xc8, 0x24, 0x87, 0xa7, 0x5b, 0x35, 0x30, 0x54, 0x9b, 0xde, 0x3c, 0x5f, 0x35, 0x28, 0x5f, 0x37, 0x26, 0x27, 0x2b, 0xbc, 0x22, 0xd1, 0x8e, 0xae, 0x37, 0x10, 0x9c, 0x65, 0xae, 0x15, 0x8e, 0xc3, 0x32, 0xf0, 0x0b, 0x68, 0x34, 0x5d, 0xa7, 0x24, 0x8d, 0xe1, 0xaa, 0xb2, 0x65, 0x16, 0x12, 0xa3, 0x54, 0x43, 0xdb, 0x98, 0xc8, 0x30, 0x7d, 0xb4, 0xa7, 0x39, 0xb7, 0x51, 0x35, 0xa0, 0x8b, 0xf2, 0x37, 0x28, 0x8a, 0x79, 0x59, 0xdf, 0x51, 0x9b, 0xcd, 0x3b, 0x54, 0x90, 0x35, 0x68, 0xda, 0x0f, 0xc3, 0xe1, 0x49, 0x79, 0x9e, 0x3e, 0xa4, 0x55, 0x88, 0x4c, 0x52, 0xfc, 0xbf, 0x63, 0x21, 0x95, 0x20, 0xf4, 0x8a, 0x44, 0x92, 0x62, 0x37, 0x9f, 0xa2, 0x13, 0xc2, 0x62, 0x6b, 0xc6, 0xc0, 0x63, 0xb9, 0x27, 0xfe, 0xc8, 0x6e, 0xa0, 0x0a, 0x77, 0x24, 0x73, 0xf5, 0xce, 0x13, 0x06, 0x58, 0x95, 0x35, 0x7d, 0x95, 0x30, 0xa9, 0x8e, 0x5f, 0x19, 0x56, 0x91, 0x7d, 0x8e, 0xd0, 0xd7, 0xca, 0x87, 0x7f, 0x3d, 0x81, 0xeb, 0xfe, 0x01, 0xb7, 0x03, 0xc1, 0xd4, 0x29, 0x2f, 0xfb, 0x30, 0x38, 0xd8, 0xbe, 0xeb, 0x32, 0xa5, 0x64, 0x0d, 0xd3, 0xf2, 0x2f, 0xdf, 0x0c, 0x7e, 0x2c, 0x44, 0x02, 0x63, 0x5d, 0x4c, 0x5a, 0x4c, 0x16, 0x07, 0xb4, 0xe2, 0xa8, 0x97, 0x75, 0x87, 0x3d, 0x89, 0xca, 0x47, 0x03, 0x66, 0xea, 0x0b, 0x8d, 0x84, 0x9b, 0x10, 0x76, 0x22, 0xf7, 0x98, 0x47, 0xb4, 0x70, 0xe0, 0x9a, 0x7c, 0x12, 0x51, 0x80, 0x5a, 0x08, 0xfa, 0x21, 0xe5, 0x62, 0x3e, 0xa2, 0xba, 0x15, 0xca, 0x4c, 0x15, 0x43, 0xcb, 0xea, 0x9e, 0xbd, 0x5d, 0x72, 0x85, 0xc7, 0x46, 0xe8, 0xd0, 0x1b, 0xe4, 0x80, 0xf4, 0x30, 0x64, 0x03, 0xa3, 0xbb, 0x35, 0x73, 0xe6, 0x77, 0xbc, 0xf2, 0x6b, 0x21, 0x4a, 0xe0, 0x20, 0xc7, 0x4b, 0x44, 0x01, 0x43, 0xc0, 0x6d, 0x2d, 0x03, 0xef, 0xd9, 0x40, 0x0b, 0x58, 0x55, 0xdd, 0x3c, 0xec, 0x66, 0x8a, 0xd6, 0x7a, 0xe8, 0xc1, 0x3c, 0x6a, 0xf5, 0x43, 0xf7, 0xad, 0x08, 0xb0, 0xfe, 0xf4, 0x62, 0x55, 0x34, 0x20, 0xad, 0x45, 0x33, 0xfa, 0xe0, 0xab, 0x48, 0x25, 0x62, 0x5e, 0xbe, 0x51, 0x72, 0xb6, 0x60, 0xb0, 0xc6, 0x9f, 0x39, 0xae, 0x72, 0xeb, 0x9e, 0xdd, 0x0c, 0xed, 0x6f, 0x2e, 0x0e, 0x43, 0x99, 0x67, 0x7b, 0xf3, 0xdf, 0xd1, 0xc6, 0xba, 0xdb, 0x31, 0xef, 0xa0, 0x3f, 0xfa, 0xef, 0xd0, 0x61, 0xc1, 0x56, 0xa7, 0xf7, 0xf1, 0x33, 0x0b, 0x1e, 0xc0, 0x34, 0xfe, 0xa2, 0x62, 0x0e, 0x72, 0x79, 0x7c, 0x1f, 0x5f, 0x90, 0xdb, 0x52, 0x14, 0xcb, 0x66, 0x44, 0xcb, 0x47, 0x51, 0xa5, 0x7f, 0xe2, 0x94, 0xe0, 0x02, 0xfd, 0x9c, 0xfe, 0x4a, 0x80, 0x40, 0xc7, 0x0b, 0x1f, 0xf6, 0x2b, 0x8c, 0xdc, 0x47, 0xe1, 0xb3, 0xcd, 0x80, 0x4e, 0x61, 0x20, 0xab, 0xa8, 0x06, 0x5c, 0xbd, 0x5b, 0x6c, 0xe9, 0x11, 0xac, 0xd7, 0xd3, 0x15, 0x9c, 0x50, 0xcb, 0x44, 0x0f, 0x3e, 0x6f, 0x54, 0x2d, 0x36, 0xcb, 0xb0, 0x09, 0x14, 0x1f, 0x28, 0x80, 0x4b, 0xe2, 0xe7, 0x65, 0x79, 0x08, 0xa6, 0xdb, 0x3f, 0x81, 0x20, 0x01, 0x4f, 0x02, 0xc6, 0xd5, 0xc6, 0x07, 0xb3, 0x52, 0xbd, 0x19, 0xe2, 0xdc, 0x1a, 0x4c, 0x9f, 0xde, 0xac, 0x0d, 0x3b, 0xb2, 0x78, 0x1a, 0x04, 0xc1, 0x4d, 0xd2, 0x74, 0xeb, 0x9f, 0xaf, 0xa9, 0x29, 0x92, 0x11, 0x15, 0x70, 0x54, 0x3d, 0x77, 0xd9, 0xb0, 0xa5, 0x0a, 0x00, 0xe0, 0x6a, 0xfc, 0xa9, 0xa3, 0x1f, 0x21, 0xaa, 0x90, 0xd0, 0xe9, 0x05, 0xaa, 0x42, 0x90, 0x54, 0x34, 0x7d, 0x94, 0x6a, 0xc7, 0x88, 0x6c, 0x37, 0xa1, 0x74, 0x77, 0xec, 0x40, 0x9b, 0x33, 0x60, 0x30, 0x2a, 0xaf, 0xb2, 0x21, 0xdd, 0x43, 0x31, 0x3c, 0x0a, 0x7e, 0x78, 0xb7, 0xe1, 0x60, 0xdd, 0xa7, 0xf2, 0xc9, 0x0d, 0x16, 0xf0, 0x32, 0xf0, 0x56, 0xb4, 0x9b, 0xd3, 0x94, 0x84, 0xc4, 0xc5, 0xb0, 0x96, 0xa0, 0x41, 0x4d, 0xd0, 0x07, 0x0e, 0x24, 0xd2, 0xab, 0x64, 0x9d, 0x36, 0x4d, 0x50, 0xa0, 0x16, 0x31, 0x59, 0xa8, 0xcf, 0xcf, 0x64, 0x1a, 0x05, 0xcb, 0xd5, 0xd6, 0xe8, 0x27, 0xf7, 0x0b, 0xb5, 0xb8, 0x9e, 0x4f, 0x7f, 0xd6, 0x0b, 0xef, 0x2f, 0x58, 0x0f, 0x83, 0xca, 0xc0, 0x74, 0xc6, 0xf2, 0xb2, 0x98, 0xa5, 0xb0, 0xab, 0x5b, 0x96, 0x70, 0xef, 0x3b, 0x2b, 0x4d, 0xc3, 0xbe, 0xe7, 0x8f, 0xdd, 0x11, 0x50, 0x72, 0x19, 0xee, 0x45, 0x2a, 0x6d, 0xc2, 0x92, 0x23, 0x1f, 0x10, 0xc2, 0x8d, 0x35, 0x10, 0x35, 0x18, 0x2e, 0x9d, 0x72, 0xfc, 0xef, 0x4e, 0xbd, 0x3d, 0x00, 0xe2, 0xed, 0x2d, 0xf8, 0xe1, 0x78, 0x32, 0x36, 0x80, 0xd0, 0xc9, 0xd2, 0xc5, 0xf2, 0xcb, 0xd3, 0xed, 0x3b, 0xf0, 0xa3, 0x0b, 0x7e, 0x91, 0xc0, 0xf1, 0x55, 0xb2, 0xb3, 0x53, 0xb4, 0x3f, 0x46, 0x2a, 0xc4, 0x96, 0xf2, 0x57, 0xee, 0x46, 0x97, 0x89, 0x35, 0x16, 0x70, 0x60, 0xca, 0x4a, 0x45, 0xd3, 0xda, 0x21, 0xe2, 0xcf, 0xab, 0xa2, 0xc9, 0x20, 0xe7, 0x98, 0x24, 0x95, 0x38, 0xdc, 0xfd, 0x5f, 0x14, 0xd2, 0xb1, 0xbb, 0xdb, 0x36, 0xa2, 0xd1, 0x1f, 0x19, 0x2d, 0xdb, 0x42, 0x26, 0xdc, 0x89, 0x47, 0x2a, 0xdc, 0xa4, 0xe2, 0xd4, 0xb1, 0xf3, 0xd1, 0xb9, 0x28, 0x5b, 0x6f, 0x9a, 0x8d, 0x49, 0x87, 0xea, 0x1f, 0x55, 0x66, 0x8b, 0xc1, 0x1f, 0x34, 0xd9, 0xf2, 0x7d, 0x84, 0xe9, 0xff, 0xd9, 0x29, 0x12, 0x77, 0xd4, 0x4b, 0xad, 0xe0, 0x2f, 0xbb, 0x1a, 0xa8, 0xec, 0x84, 0x04, 0x5f, 0xb0, 0xc3, 0xe5, 0x23, 0x6c, 0xb8, 0xcc, 0x5b, 0x3c, 0x1c, 0x5e, 0xa8, 0x90, 0xb5, 0x1a, 0x18, 0x89, 0x29, 0xe2, 0x9d, 0xa6, 0x10, 0xb7, 0xbe, 0x9f, 0x4c, 0xc5, 0x8d, 0x91, 0x9d, 0x9f, 0xd9, 0x5c, 0x70, 0xcb, 0xa4, 0x49, 0xf8, 0x81, 0xd7, 0xf1, 0x80, 0xb0, 0x35, 0x5a, 0x00, 0x42, 0x8e, 0x62, 0xee, 0xa1, 0x35, 0x61, 0x56, 0x7a, 0xb4, 0x0a, 0x2d, 0xc1, 0xbd, 0x92, 0xe3, 0xf5, 0x64, 0x15, 0x37, 0xa5, 0x8c, 0x35, 0x4f, 0x33, 0x9f, 0x04, 0x08, 0xd8, 0x83, 0x24, 0x8b, 0xe8, 0xc9, 0x2c, 0x21, 0x57, 0x27, 0x4e, 0x48, 0x7d, 0x28, 0x37, 0x06, 0x16, 0x22, 0x37, 0x7d, 0x8d, 0x69, 0xa2, 0xc0, 0x7a, 0xc2, 0x76, 0xe5, 0x69, 0x1a, 0x3d, 0x5b, 0xdd, 0x78, 0x35, 0x7e, 0x94, 0x31, 0xaf, 0x69, 0x0d, 0x5b, 0xb5, 0x0b, 0x48, 0x83, 0xef, 0x7e, 0xcd, 0xa3, 0xc8, 0x93, 0xef, 0x4e, 0xcc, 0xb2, 0x52, 0x2e, 0x54, 0xe1, 0xab, 0xb0, 0x66, 0x22, 0xc7, 0xfe, 0xd7, 0x02, 0xcf, 0x2e, 0xb2, 0x6f, 0xca, 0xb8, 0xde, 0xca, 0x63, 0x2e, 0xfa, 0x3d, 0xec, 0x27, 0x8c, 0x4f, 0xa4, 0x7d, 0x5b, 0xb5, 0x35, 0xb8, 0x19, 0x6b, 0x81, 0xc9, 0x45, 0x04, 0x9e, 0xfc, 0x50, 0x3f, 0x1f, 0x28, 0xff, 0xda, 0x96, 0x28, 0x10, 0xab, 0x57, 0x8f, 0x20, 0xec, 0x7e, 0x98, 0xcc, 0xd7, 0x33, 0x5c, 0x17, 0x73, 0x2c, 0x48, 0x0b, 0xad, 0x74, 0xcd, 0xa4, 0xaa, 0x6b, 0x59, 0xe9, 0x5c, 0x0f, 0x87, 0x5c, 0x53, 0x79, 0x93, 0x94, 0xd6, 0xaa, 0x10, 0x29, 0x33, 0x88, 0xdd, 0xd0, 0x53, 0x24, 0x55, 0xc7, 0x91, 0x3e, 0xc6, 0x74, 0xcc, 0x0b, 0x24, 0x49, 0xbb, 0x36, 0xff, 0xea, 0x81, 0x24, 0xb3, 0x92, 0x82, 0x7c, 0xdf, 0xb3, 0x74, 0xe7, 0x18, 0xdc, 0xb9, 0x14, 0xde, 0xe0, 0xec, 0x00, 0xce, 0x35, 0xba, 0x74, 0x1a, 0x9a, 0xf3, 0xcf, 0x37, 0xfc, 0xe0, 0x05, 0xd5, 0x9b, 0xd8, 0xe8, 0x14, 0x69, 0x0e, 0xa6, 0xf5, 0xb2, 0xad, 0x93, 0x0e, 0x02, 0x27, 0x29, 0x83, 0x44, 0xc9, 0x4d, 0x31, 0x27, 0x94, 0xd4, 0x2c, 0xc6, 0x48, 0x46, 0x6c, 0x87, 0xc1, 0xe2, 0xc3, 0x43, 0x86, 0xe2, 0x12, 0xa8, 0xa0, 0x00, 0xbd, 0xdc, 0xa8, 0x38, 0x5c, 0x63, 0x24, 0xd0, 0xb4, 0x43, 0x14, 0x96, 0xe5, 0x66, 0xc7, 0x69, 0xe4, 0x3f, 0xf3, 0xfa, 0x2c, 0xb1, 0x05, 0xd4, 0xb1, 0x2c, 0xb6, 0x9a, 0x16, 0x19, 0xdf, 0x90, 0x1f, 0x78, 0x8e, 0x5d, 0x69, 0xc7, 0x59, 0x10, 0x59, 0x26, 0xf2, 0x60, 0x52, 0xba, 0xfc, 0x38, 0x2b, 0x4f, 0x1d, 0x73, 0xe0, 0x41, 0x55, 0xe4, 0x87, 0x9c, 0x8e, 0x99, 0x86, 0x82, 0x74, 0x60, 0x04, 0xcd, 0x86, 0x8b, 0x9d, 0xf6, 0x6d, 0xf1, 0x5a, 0x36, 0x8d, 0x35, 0xe0, 0xea, 0xdb, 0x4b, 0xe7, 0x3c, 0xee, 0x37, 0xee, 0x00, 0x58, 0x18, 0x2d, 0xdc, 0x36, 0x66, 0xcc, 0xac, 0x06, 0x78, 0x52, 0x24, 0xb9, 0x49, 0x60, 0xb7, 0x09, 0x7b, 0x9f, 0xb8, 0x0d, 0x9c, 0xf7, 0xc0, 0x0b, 0xa9, 0x02, 0x4f, 0x8d, 0xd0, 0xc0, 0xb6, 0xb7, 0x7a, 0x8c, 0x34, 0xd7, 0x89, 0x4e, 0x5f, 0x3e, 0xde, 0xf3, 0xc5, 0x4f, 0x1f, 0x1a, 0xd4, 0xd5, 0xb7, 0x10, 0xf7, 0x9a, 0x1e, 0xff, 0x02, 0x35, 0x5a, 0x62, 0xd0, 0x23, 0xc6, 0xbc, 0x2a, 0x19, 0x12, 0x8a, 0xeb, 0x99, 0x8b, 0x76, 0x62, 0xc4, 0x9c, 0xcd, 0xf8, 0x6f, 0x95, 0x33, 0x13, 0x78, 0xac, 0x96, 0x3a, 0x5a, 0x42, 0x60, 0x79, 0x00, 0x67, 0xf1, 0x07, 0xd7, 0x9f, 0x4c, 0x26, 0x27, 0xe6, 0x10, 0x4b, 0xa3, 0xf3, 0xab, 0x7f, 0x3f, 0xba, 0xca, 0x05, 0x41, 0x34, 0x13, 0x3d, 0x9b, 0x62, 0x17, 0xc8, 0x78, 0x90, 0x82, 0xed, 0x15, 0xd7, 0x95, 0x3b, 0xd2, 0xe5, 0xd7, 0x70, 0x89, 0x01, 0x07, 0x9a, 0x1e, 0x49, 0x54, 0x7c, 0x57, 0x3e, 0xd1, 0x33, 0xee, 0x83, 0x23, 0x1a, 0xe5, 0xe2, 0x7c, 0xea, 0x1a, 0x90, 0xce, 0x26, 0x1b, 0xb2, 0x38, 0xb6, 0x3b, 0x1f, 0xc5, 0xd1, 0xe6, 0x68, 0x55, 0x21, 0x31, 0x16, 0xdb, 0x22, 0xb5, 0x32, 0xc9, 0xcc, 0x9e, 0x0b, 0xc9, 0x71, 0xff, 0x33, 0xae, 0xe8, 0x69, 0xcb, 0xaa, 0xeb, 0xbb, 0x00, 0xc1, 0xbe, 0x3b, 0xd6, 0x7d, 0x11, 0xe6, 0x25, 0xe4, 0x28, 0x05, 0xe0, 0xa7, 0x39, 0x01, 0x9d, 0x9c, 0x16, 0x78, 0x52, 0x6e, 0x0b, 0x90, 0x5d, 0x94, 0x0a, 0x8c, 0xc8, 0x7f, 0x05, 0x9d, 0xca, 0x18, 0x9c, 0xfa, 0x91, 0x69, 0xf8, 0x32, 0x3e, 0x9a, 0xf7, 0xc1, 0x32, 0x20, 0x89, 0xe2, 0x88, 0x31, 0x5a, 0xa5, 0xe2, 0x7b, 0xb1, 0x41, 0x69, 0x15, 0x98, 0xab, 0x0f, 0xb6, 0x3d, 0x68, 0x18, 0x25, 0x98, 0x9f, 0xd8, 0xf0, 0x4e, 0x72, 0xbe, 0x61, 0xd5, 0x8e, 0x91, 0xae, 0xd9, 0x01, 0xfa, 0x70, 0xdf, 0x4d, 0x43, 0x56, 0x29, 0xba, 0x5e, 0x1b, 0xd9, 0xf0, 0x29, 0xb5, 0x59, 0xc4, 0xf0, 0xd0, 0xf9, 0x53, 0x33, 0x7a, 0xda, 0x4d, 0xaa, 0x20, 0x0c, 0x94, 0x87, 0xb9, 0xf3, 0x06, 0xfb, 0x41, 0xef, 0x96, 0xfb, 0x69, 0x3b, 0xa2, 0x44, 0x8d, 0x16, 0x81, 0x9d, 0xe6, 0x21, 0x5b, 0x5c, 0x01, 0x09, 0x3d, 0x2b, 0x6f, 0x65, 0x6c, 0x0c, 0xbf, 0xe2, 0xfa, 0x9b, 0xa9, 0x9d, 0x98, 0x93, 0x8c, 0xd0, 0xab, 0x94, 0x1b, 0xb1, 0xa2, 0x24, 0x52, 0x97, 0x86, 0xf3, 0xb0, 0x5f, 0xd2, 0x63, 0xa0, 0x0e, 0x86, 0x47, 0x38, 0xb7, 0x77, 0xeb, 0x25, 0xa0, 0xe9, 0x56, 0xe6, 0xa0, 0x5f, 0xcb, 0x39, 0xcb, 0xb2, 0x96, 0xd3, 0x52, 0x61, 0x05, 0x54, 0xa4, 0x28, 0xb4, 0x7a, 0xd9, 0xd4, 0x0d, 0x95, 0x51, 0x55, 0x10, 0x3b, 0x98, 0x15, 0x50, 0x3c, 0x8d, 0x88, 0x3e, 0xd8, 0xc4, 0x05, 0xaa, 0x30, 0x28, 0xd4, 0x87, 0xfb, 0xe5, 0x88, 0xef, 0x7a, 0x85, 0x8e, 0x67, 0xae, 0x58, 0x07, 0x63, 0xc8, 0x1a, 0xd3, 0x0d, 0xe1, 0xd0, 0xee, 0x42, 0xeb, 0xf3, 0x00, 0xdd, 0xe8, 0xd0, 0x2f, 0x39, 0x5a, 0x2f, 0x38, 0xf1, 0xfa, 0x33, 0xbe, 0xea, 0xac, 0x81, 0xe2, 0x94, 0xb3, 0xa4, 0x13, 0x6c, 0x21, 0xb1, 0x27, 0xc6, 0x92, 0x26, 0xab, 0xc9, 0x1a, 0x18, 0x78, 0xbb, 0x7c, 0x8e, 0x87, 0x7f, 0x9d, 0x28, 0x07, 0x5b, 0x38, 0x04, 0xac, 0xff, 0xd2, 0xe1, 0x49, 0xc3, 0xf1, 0x85, 0xa1, 0x31, 0x89, 0x5d, 0x7b, 0xc3, 0xb7, 0x64, 0xf4, 0xed, 0xb1, 0x45, 0x19, 0x5e, 0xfe, 0xc4, 0xb5, 0x84, 0xe2, 0x5a, 0x68, 0x4e, 0x1d, 0x1f, 0xf9, 0x35, 0xd5, 0xee, 0xed, 0x7d, 0xd0, 0xc3, 0x59, 0xb8, 0xe6, 0x67, 0xf4, 0x8d, 0xb6, 0x50, 0x70, 0xb7, 0x99, 0xc2, 0x0b, 0x50, 0xd4, 0x3b, 0x61, 0x50, 0x12, 0x0e, 0x84, 0x51, 0x11, 0x4e, 0x4e, 0x95, 0x9b, 0xed, 0xf6, 0x49, 0xb8, 0x25, 0xe2, 0x0b, 0x22, 0x17, 0xbc, 0xab, 0xf9, 0xb3, 0xc8, 0x2e, 0xb8, 0xd7, 0x75, 0x19, 0x68, 0xbb, 0x32, 0xec, 0x13, 0x8c, 0x82, 0xec, 0x7c, 0x57, 0x53, 0x25, 0x0d, 0x29, 0x8c, 0xb0, 0x11, 0x75, 0xe5, 0x32, 0x23, 0xb5, 0xfb, 0xa5, 0xe6, 0x54, 0xa4, 0x5b, 0xf7, 0xcc, 0x7f, 0x3f, 0x20, 0x0c, 0xd0, 0x5f, 0xcf, 0x1c, 0x8b, 0xa7, 0xc6, 0x03, 0xaf, 0xef, 0x13, 0xe9, 0xd5, 0x39, 0x43, 0x79, 0x09, 0x33, 0xd3, 0x89, 0xd8, 0x04, 0xe7, 0xfd, 0xaa, 0x44, 0x3e, 0xe8, 0x53, 0x4c, 0x66, 0xf5, 0xe4, 0xb1, 0x2c, 0x06, 0xc7, 0x0b, 0x57, 0x1a, 0x0b, 0xfb, 0x96, 0x74, 0xfc, 0x6c, 0xb6, 0xfa, 0xf7, 0x18, 0x18, 0xdb, 0x7c, 0x4e, 0x63, 0x74, 0x85, 0xf3, 0x76, 0x75, 0x16, 0xc8, 0xa1, 0x3f, 0x16, 0xea, 0x14, 0x91, 0x5d, 0x9f, 0x97, 0x64, 0x0e, 0x4f, 0x7c, 0x13, 0x27, 0xd1, 0xd2, 0xbf, 0x56, 0xe9, 0xdc, 0xf2, 0x0f, 0x0e, 0xc2, 0x82, 0xdb, 0x70, 0x85, 0xb9, 0xf3, 0x39, 0x38, 0xb2, 0x0d, 0x13, 0x6e, 0x06, 0x76, 0xeb, 0xef, 0xa9, 0x61, 0xf5, 0xaf, 0x0e, 0x7f, 0xf1, 0x00, 0x92, 0xcf, 0xac, 0x06, 0x17, 0xb8, 0xc9, 0x6b, 0xef, 0x55, 0xc1, 0x55, 0xfd, 0x10, 0x29, 0x95, 0x16, 0x72, 0x34, 0x22, 0xad, 0x39, 0x78, 0xc5, 0xb0, 0xab, 0xf5, 0x15, 0xad, 0x2b, 0x53, 0xa6, 0x39, 0x0a, 0x6b, 0x7e, 0x92, 0x9f, 0x09, 0xc8, 0x83, 0x9a, 0xf0, 0xcd, 0x88, 0x95, 0x1f, 0x1f, 0x33, 0xec, 0x53, 0x17, 0xce, 0xcf, 0xcd, 0x82, 0x42, 0x95, 0x55, 0x98, 0x38, 0x53, 0x7f, 0x2e, 0x7d, 0xae, 0x2d, 0x2c, 0xab, 0xed, 0x55, 0x40, 0x06, 0x53, 0x05, 0xd4, 0xa4, 0xab, 0xa4, 0x3e, 0xd1, 0x24, 0x7a, 0x37, 0xb1, 0x5f, 0x73, 0x8f, 0x27, 0xc7, 0x1f, 0x1f, 0xf6, 0x21, 0xfe, 0xfe, 0x26, 0x63, 0xfb, 0xf8, 0xaa, 0xca, 0x36, 0x3b, 0x3f, 0x27, 0x06, 0x54, 0x97, 0x7a, 0x3f, 0x5a, 0xb7, 0xc1, 0xb0, 0x69, 0x9e, 0x12, 0xf0, 0x52, 0x27, 0xe8, 0x5b, 0x91, 0x30, 0xbb, 0x57, 0x80, 0xfc, 0xd3, 0xdc, 0xca, 0xd6, 0x5d, 0x33, 0x21, 0xf7, 0xbf, 0xfd, 0x34, 0xaa, 0x29, 0x78, 0xdb, 0xae, 0x6c, 0xfe, 0x95, 0xdc, 0x10, 0xce, 0x35, 0x09, 0xa0, 0x0f, 0xd8, 0x2e, 0x49, 0x12, 0x1a, 0xc7, 0xa4, 0xd8, 0x8a, 0x78, 0xcf, 0xd4, 0x5b, 0xf6, 0xc2, 0xf1, 0x5c, 0x25, 0xe0, 0xd7, 0x2a, 0x7e, 0xcd, 0x6a, 0xa3, 0xb4, 0x80, 0x94, 0x9f, 0x97, 0x99, 0x45, 0xdb, 0x38, 0xf4, 0xb8, 0x36, 0x4e, 0x7e, 0xf7, 0x20, 0xd8, 0x47, 0xa1, 0x4f, 0x04, 0xd9, 0xeb, 0xb3, 0x50, 0xc9, 0xe5, 0xad, 0xef, 0x8b, 0xff, 0x7c, 0x6e, 0x8a, 0xcb, 0xf8, 0x97, 0x78, 0x04, 0x82, 0x96, 0xe3, 0xd0, 0x3b, 0x5a, 0x0a, 0x42, 0x74, 0x3e, 0xee, 0x23, 0x66, 0xe9, 0xac, 0xf2, 0x23, 0x72, 0x09, 0x29, 0xcd, 0xc8, 0x4f, 0xc2, 0x06, 0x52, 0x58, 0xfa, 0xa7, 0xd2, 0xe8, 0x55, 0xb5, 0x8f, 0x40, 0xe2, 0x91, 0xb3, 0xef, 0xc0, 0x6e, 0xf2, 0xec, 0xe1, 0x08, 0x6c, 0xe2, 0x0e, 0x94, 0xd5, 0xcb, 0x2b, 0xf2, 0xd3, 0xc0, 0xbd, 0x2a, 0xa7, 0x0f, 0xa9, 0x16, 0x10, 0x8f, 0x3e, 0x5c, 0x6c, 0x30, 0x76, 0xa0, 0x21, 0xd6, 0x79, 0xf7, 0x3b, 0x68, 0x63, 0x9e, 0x57, 0x23, 0x47, 0xec, 0xbf, 0x35, 0x74, 0x85, 0xd6, 0x87, 0xf7, 0xd1, 0xb7, 0xda, 0x61, 0xac, 0x19, 0x15, 0xca, 0x5f, 0x76, 0xdd, 0x15, 0xcf, 0x6c, 0x67, 0x76, 0xf5, 0x63, 0x8a, 0x32, 0x8e, 0x70, 0x19, 0xa6, 0x14, 0x79, 0x6f, 0x8b, 0xec, 0x9a, 0x4b, 0x78, 0xe1, 0xc8, 0xdf, 0xa8, 0xd1, 0xb4, 0x23, 0xfe, 0xa6, 0xf2, 0x6f, 0x46, 0x88, 0x5b, 0x49, 0xbe, 0x52, 0xb0, 0x7c, 0xd5, 0x42, 0x80, 0x6a, 0x32, 0xf4, 0x4b, 0xa2, 0xf8, 0x91, 0xe7, 0xb5, 0x49, 0x44, 0x23, 0x46, 0x09, 0xed, 0xab, 0x61, 0xe4, 0x1a, 0x2b, 0x0e, 0x92, 0x33, 0xb7, 0x25, 0x59, 0xf4, 0x6b, 0x63, 0xd4, 0x20, 0x4e, 0xbe, 0xf4, 0x74, 0x7c, 0xf6, 0x44, 0xda, 0x85, 0x6d, 0x71, 0xe0, 0x10, 0x38, 0x09, 0x68, 0xc4, 0x76, 0x83, 0xa1, 0x68, 0xe0, 0x80, 0x36, 0x48, 0xa2, 0x50, 0xc5, 0xdb, 0x6a, 0xb8, 0x92, 0xa4, 0xbe, 0xf2, 0x7d, 0x56, 0x92, 0xf6, 0x31, 0x3b, 0x1a, 0xf8, 0x9f, 0xd6, 0xdd, 0x32, 0xab, 0xc8, 0x0b, 0xe3, 0x24, 0xf0, 0x10, 0x98, 0xfa, 0xd6, 0x69, 0xaa, 0xab, 0x4a, 0xb6, 0x08, 0xff, 0x48, 0x11, 0x36, 0xf5, 0x1f, 0x9f, 0x96, 0xfd, 0xd2, 0x64, 0xe7, 0x67, 0xbf, 0x5c, 0x0b, 0x1c, 0x7e, 0xc7, 0x0d, 0x8c, 0x0c, 0xc4, 0x62, 0xe7, 0x29, 0x21, 0x6f, 0x90, 0xfe, 0x72, 0x4c, 0xcf, 0x03, 0x60, 0xc8, 0xc6, 0x20, 0x44, 0xad, 0xa6, 0x13, 0xf5, 0x45, 0x22, 0x11, 0xdd, 0x1c, 0x24, 0xb0, 0x53, 0x08, 0xbf, 0x04, 0x25, 0x67, 0x66, 0x08, 0x73, 0xa8, 0x5b, 0x40, 0xc4, 0x0d, 0x69, 0x9d, 0x53, 0xae, 0xd6, 0xa1, 0xaa, 0xc2, 0x94, 0xc3, 0x72, 0x1a, 0xb7, 0x15, 0x8a, 0xee, 0x2c, 0x24, 0x56, 0xdc, 0xa7, 0x20, 0x5a, 0x2e, 0xdd, 0x3d, 0x07, 0x5c, 0xf4, 0x58, 0xd4, 0xd1, 0x37, 0xde, 0x91, 0xf2, 0x0f, 0xea, 0xf8, 0x5d, 0x2e, 0xad, 0x86, 0x6e, 0x0e, 0x13, 0x89, 0x08, 0x9a, 0xa3, 0x79, 0x92, 0x2b, 0xa8, 0x8b, 0x3f, 0xb5, 0x8e, 0x84, 0x93, 0x43, 0x8e, 0xcb, 0x23, 0xa0, 0x8e, 0xc3, 0x9c, 0x57, 0x42, 0x57, 0x06, 0xde, 0x98, 0xd7, 0x4a, 0x0f, 0x53, 0x02, 0xf2, 0xd7, 0xf5, 0x64, 0x31, 0x32, 0xe3, 0xe2, 0x23, 0x57, 0xc4, 0x93, 0x55, 0x2f, 0x2a, 0xd1, 0x88, 0x0c, 0x74, 0x90, 0xb2, 0x98, 0xf3, 0xef, 0x46, 0x0c, 0x4b, 0x0d, 0xb5, 0xa2, 0x1c, 0x1e, 0x35, 0x4c, 0xe2, 0xbe, 0xc1, 0xa6, 0x1a, 0x84, 0x61, 0x29, 0xa7, 0xdb, 0xab, 0xa2, 0x73, 0x0d, 0x8a, 0xe3, 0x59, 0xa1, 0x3e, 0xb9, 0x43, 0xe7, 0xa4, 0x1e, 0x8f, 0xd1, 0xb8, 0xaf, 0xb8, 0x04, 0x58, 0x60, 0x32, 0x2f, 0x4b, 0x6e, 0x95, 0x9c, 0x81, 0x95, 0xfe, 0x05, 0x9c, 0x84, 0xb2, 0xa8, 0xb0, 0x8e, 0x05, 0x9d, 0x47, 0xa2, 0x7b, 0x68, 0xa9, 0x7d, 0x2c, 0xcb, 0x5a, 0x1e, 0x6d, 0xde, 0xe3, 0x7a, 0xac, 0x61, 0xd5, 0x72, 0x9c, 0x50, 0x0c, 0x02, 0x93, 0xb8, 0x31, 0xbb, 0x30, 0xca, 0x82, 0x73, 0x40, 0x2d, 0xd6, 0x3b, 0xe2, 0x99, 0xdb, 0x91, 0xea, 0xa2, 0xa3, 0xd7, 0x84, 0xd1, 0x5f, 0x04, 0x1a, 0xf9, 0x6a, 0x9a, 0x77, 0xc8, 0x89, 0xd8, 0x2c, 0x9d, 0x71, 0x30, 0x32, 0x99, 0x89, 0xfb, 0xd2, 0xf9, 0xf2, 0x6c, 0xc2, 0xa3, 0xc5, 0xc2, 0x91, 0xfe, 0x9b, 0xc2, 0x44, 0x07, 0x53, 0x65, 0x42, 0xa2, 0x0f, 0xce, 0x6d, 0x2d, 0x80, 0x7e, 0x92, 0x5b, 0x64, 0xcb, 0x03, 0x40, 0x4c, 0x8e, 0x82, 0xa8, 0xa3, 0x1d, 0x61, 0xad, 0xec, 0x79, 0xe8, 0x89, 0x4b, 0xc8, 0xf7, 0xa8, 0x47, 0x05, 0xec, 0x02, 0xce, 0xf6, 0xc7, 0xa7, 0x79, 0x5e, 0x8d, 0x9b, 0x12, 0x75, 0xea, 0xe5, 0x54, 0x95, 0x19, 0xe3, 0xf1, 0x36, 0x09, 0xe0, 0xda, 0x1c, 0xb8, 0xe8, 0xba, 0xcf, 0xe3, 0xdb, 0xc3, 0x4c, 0xe2, 0xc1, 0xae, 0xfa, 0xce, 0x5d, 0xfd, 0xdf, 0xe4, 0x05, 0x84, 0x14, 0x2e, 0xb1, 0x27, 0x76, 0x60, 0x51, 0xe5, 0x9f, 0x00, 0x64, 0x16, 0x15, 0xc9, 0xc6, 0xf0, 0xc0, 0x52, 0xc9, 0x50, 0xa2, 0xeb, 0x88, 0xb8, 0xc2, 0xc7, 0x78, 0x93, 0x69, 0x61, 0x40, 0xc1, 0x91, 0x18, 0xcb, 0x4f, 0x9b, 0x1c, 0x9b, 0x86, 0x40, 0x8e, 0x60, 0x28, 0xca, 0xe3, 0xc9, 0xf6, 0x84, 0x8a, 0x9a, 0x75, 0x6f, 0xce, 0xff, 0xf2, 0x36, 0xfd, 0x1f, 0xc4, 0x64, 0xca, 0xf5, 0xd1, 0xd5, 0xf0, 0x5b, 0x54, 0x6a, 0x18, 0x68, 0xdd, 0x01, 0xfd, 0xfc, 0x99, 0xa5, 0xce, 0x99, 0xd3, 0x01, 0xd4, 0x75, 0xbb, 0x1b, 0x54, 0xcd, 0x66, 0x3f, 0xb7, 0x7b, 0x17, 0x38, 0xe8, 0xcb, 0xbd, 0xc7, 0xfe, 0x8b, 0xbc, 0x4d, 0x1b, 0x61, 0xf0, 0xcb, 0x93, 0x62, 0xef, 0x0c, 0x51, 0xdf, 0x8f, 0x21, 0x77, 0x82, 0xa9, 0x0e, 0x45, 0x9a, 0x1c, 0xc3, 0x3c, 0xb4, 0x14, 0x4e, 0x83, 0x6b, 0x8c, 0x4e, 0x89, 0x81, 0x11, 0xab, 0xec, 0x2e, 0xc9, 0x84, 0x9a, 0xb7, 0xb5, 0x69, 0x36, 0x43, 0x33, 0xcb, 0xbd, 0xeb, 0xc7, 0xb0, 0x69, 0x10, 0x1a, 0xab, 0xd5, 0xf1, 0x43, 0x0c, 0x63, 0x7c, 0x46, 0x54, 0xdb, 0x65, 0xda, 0xec, 0x54, 0x76, 0x70, 0x16, 0x58, 0x26, 0x70, 0x23, 0x43, 0x6c, 0xc6, 0xe7, 0xec, 0xd5, 0x9d, 0x6a, 0x87, 0xd5, 0x6a, 0xe0, 0xca, 0x5a, 0x2d, 0xdb, 0x4f, 0xa7, 0xf4, 0xc0, 0x3a, 0x60, 0xa0, 0x77, 0x1b, 0xe1, 0xeb, 0x67, 0x16, 0xd4, 0xaa, 0xa2, 0x41, 0x03, 0x50, 0x5c, 0x4d, 0x6a, 0xb4, 0xa2, 0x69, 0x91, 0x14, 0x49, 0x63, 0x19, 0x59, 0x24, 0x10, 0x94, 0x9c, 0x7a, 0xef, 0x9a, 0xea, 0xb6, 0x09, 0x19, 0x44, 0x61, 0x1b, 0xec, 0xea, 0x4e, 0xf7, 0xaf, 0xda, 0x14, 0x28, 0xd2, 0x93, 0xc1, 0xd5, 0xed, 0x1e, 0xcd, 0xe8, 0x53, 0x4f, 0x4d, 0x6e, 0xea, 0x49, 0x69, 0x41, 0x3a, 0x40, 0x10, 0xe5, 0xc3, 0x83, 0xeb, 0xb1, 0x94, 0xb9, 0x8f, 0x2f, 0x19, 0x6a, 0xf6, 0xc5, 0x35, 0xc2, 0x30, 0x94, 0x90, 0x92, 0x56, 0xa0, 0x33, 0x98, 0xc0, 0x31, 0x52, 0x00, 0x77, 0x7a, 0x68, 0x2a, 0xed, 0x79, 0x8a, 0xae, 0xec, 0x1e, 0xf4, 0x9e, 0xcd, 0xaf, 0xe9, 0x0b, 0xea, 0x6b, 0xba, 0xca, 0x56, 0x6e, 0x24, 0x77, 0xcb, 0xd4, 0xde, 0xbb, 0xe3, 0x21, 0x73, 0xcb, 0x8b, 0xe1, 0x4e, 0x31, 0xb5, 0x8b, 0x13, 0xcf, 0x4e, 0xab, 0x36, 0x21, 0x70, 0x40, 0xc6, 0xc2, 0xd8, 0x63, 0x89, 0x32, 0x9a, 0x2a, 0x4e, 0xd6, 0x13, 0xcc, 0x7f, 0x40, 0x20, 0x06, 0xf6, 0xb1, 0x8d, 0xbd, 0x11, 0xdc, 0xd1, 0xe4, 0x09, 0xed, 0xf8, 0xa0, 0x7f, 0xca, 0xe0, 0xaa, 0x58, 0x99, 0xa8, 0xf6, 0xcb, 0x82, 0x66, 0x92, 0xb8, 0xb6, 0x18, 0xd0, 0x3c, 0xb0, 0xde, 0xa7, 0x82, 0xbb, 0x66, 0x57, 0xdc, 0xb4, 0xa7, 0x4c, 0x12, 0x11, 0xd2, 0x45, 0xfa, 0x22, 0x85, 0xb5, 0x48, 0x97, 0x42, 0x69, 0xa8, 0x43, 0x21, 0x6c, 0x0a, 0x1f, 0xc1, 0x28, 0x3d, 0x92, 0x84, 0xcd, 0xc0, 0xef, 0xfc, 0xf7, 0xd5, 0x40, 0xa0, 0x8b, 0xd6, 0x42, 0xc4, 0xe1, 0xcc, 0xb0, 0xc8, 0x29, 0x3e, 0xc4, 0x8f, 0x07, 0x47, 0xfc, 0x32, 0x81, 0xeb, 0x1a, 0xf6, 0x1b, 0xab, 0x6e, 0x7c, 0x40, 0x57, 0x57, 0x38, 0xe4, 0x24, 0x08, 0x24, 0x68, 0xff, 0x88, 0xb6, 0xbe, 0x20, 0xfc, 0x0f, 0xcd, 0xe1, 0x29, 0x75, 0x17, 0xd1, 0x35, 0x03, 0x99, 0x04, 0xad, 0x9f, 0xf2, 0xae, 0xcd, 0x2d, 0xc8, 0xf0, 0xfb, 0x02, 0x68, 0xf2, 0x94, 0x9c, 0xac, 0x32, 0xeb, 0x90, 0x22, 0x1c, 0x8f, 0xc3, 0x6a, 0xda, 0xcd, 0xdd, 0xe0, 0x6d, 0x76, 0xfb, 0x7c, 0xfd, 0xe3, 0xa5, 0xf6, 0x6d, 0x35, 0xff, 0x2d, 0x33, 0xe1, 0x43, 0xc9, 0x67, 0x6d, 0x6e, 0x1f, 0x19, 0x74, 0x3a, 0x56, 0xe8, 0xf0, 0x4d, 0xc8, 0xd0, 0xb9, 0xb0, 0xab, 0x44, 0x48, 0x82, 0xf1, 0x7d, 0xc1, 0xee, 0x6c, 0x11, 0x31, 0x5a, 0x36, 0xc7, 0x13, 0xe1, 0x50, 0xaa, 0x1a, 0x04, 0x89, 0x5c, 0x2a, 0x9c, 0xa2, 0xad, 0xa7, 0x13, 0xaf, 0x6c, 0xf3, 0xd4, 0xc0, 0x7e, 0x32, 0x00, 0xc1, 0x2c, 0x51, 0x63, 0x9f, 0xc1, 0x46, 0xa6, 0xad, 0x55, 0x99, 0xc6, 0x45, 0xe4, 0x23, 0xc5, 0xb2, 0xa3, 0x16, 0x9f, 0x4d, 0x93, 0x3d, 0x7f, 0xe7, 0x56, 0x85, 0x33, 0x67, 0x42, 0xbd, 0xdd, 0xb4, 0xb4, 0x9a, 0xec, 0xd6, 0xa6, 0xfe, 0x4b, 0x58, 0x84, 0x79, 0xd8, 0xf0, 0x3c, 0x11, 0x18, 0x62, 0x95, 0x3e, 0x29, 0xa1, 0xc1, 0x39, 0xf8, 0x37, 0x35, 0x76, 0xb4, 0xe8, 0xb8, 0x6f, 0x82, 0x92, 0xba, 0xa4, 0x72, 0x58, 0xe8, 0xe0, 0xb1, 0xff, 0xfd, 0xbd, 0x01, 0x98, 0xdb, 0x6a, 0x67, 0x60, 0xda, 0xac, 0x23, 0xe4, 0x60, 0x23, 0xe5, 0x69, 0xb2, 0xcf, 0x3e, 0x8a, 0x09, 0xd3, 0x55, 0x23, 0xe9, 0x78, 0xdb, 0x6e, 0xae, 0x74, 0x41, 0x6c, 0x68, 0x6d, 0x28, 0x87, 0xe8, 0xb9, 0x19, 0x75, 0x1b, 0x68, 0x76, 0x5f, 0x97, 0x84, 0xb0, 0x43, 0x74, 0x97, 0xbb, 0x97, 0x5d, 0x6e, 0xbf, 0x2f, 0xe6, 0x1d, 0x11, 0x60, 0x20, 0x43, 0x61, 0x66, 0x6c, 0x8f, 0x35, 0x03, 0x8c, 0x83, 0x96, 0x69, 0x00, 0x78, 0x08, 0x5a, 0x8f, 0xe3, 0xc0, 0x8e, 0x24, 0xd6, 0x12, 0x55, 0xdb, 0xca, 0x29, 0x7d, 0x5c, 0x9b, 0xfa, 0x76, 0x68, 0xd4, 0x7a, 0xb4, 0xb1, 0x2d, 0x0f, 0x55, 0xef, 0x52, 0x45, 0x04, 0x30, 0xe6, 0xc3, 0x1d, 0x6f, 0xc8, 0x7d, 0x11, 0x69, 0x95, 0x2b, 0x0d, 0xac, 0x6e, 0xf9, 0xd6, 0xf1, 0xfb, 0x80, 0xf8, 0xab, 0xaf, 0xf5, 0x1f, 0xe0, 0x4e, 0xa0, 0xc5, 0x38, 0xad, 0x90, 0x0d, 0x54, 0xba, 0x8e, 0xef, 0x60, 0xbb, 0x4f, 0x96, 0xec, 0xdb, 0xee, 0x06, 0xf7, 0xe2, 0x99, 0x02, 0x4d, 0x44, 0x8a, 0x2d, 0x14, 0x5d, 0x38, 0x6f, 0xa1, 0xfb, 0xcf, 0x9a, 0x90, 0x1d, 0xde, 0x4e, 0x13, 0xfa, 0x50, 0x1a, 0x8a, 0x45, 0x9e, 0xe3, 0x54, 0xb0, 0x43, 0x8a, 0xe5, 0xaf, 0x6f, 0xc9, 0x19, 0x7e, 0xff, 0x5e, 0xc8, 0x65, 0xad, 0x6c, 0x9b, 0x3b, 0x84, 0x1e, 0x1e, 0x29, 0x98, 0x8d, 0x16, 0xb0, 0xf3, 0xe4, 0x14, 0xed, 0xd2, 0xc2, 0x4a, 0x1c, 0x12, 0xdf, 0x9e, 0x5c, 0xe5, 0xf3, 0xfd, 0xb1, 0xc9, 0xd3, 0xf2, 0x4f, 0xbb, 0xdd, 0x77, 0x16, 0xa7, 0x97, 0x0b, 0x59, 0x24, 0x93, 0x04, 0xe3, 0x5e, 0x96, 0x27, 0x3c, 0x53, 0xf8, 0x76, 0x28, 0x43, 0x4e, 0x49, 0x71, 0x61, 0x47, 0xa0, 0xe6, 0xcf, 0xd4, 0xb8, 0xa4, 0xc9, 0x8c, 0xdc, 0x94, 0x21, 0x4e, 0x7e, 0x35, 0xeb, 0x28, 0x86, 0x9c, 0x79, 0x77, 0xea, 0xb9, 0x8a, 0x50, 0x7f, 0xdb, 0xbe, 0x1f, 0x0f, 0x76, 0x4d, 0x8e, 0xab, 0x25, 0xf9, 0xa9, 0x42, 0xeb, 0x41, 0x3f, 0x73, 0xbe, 0xd8, 0x8b, 0xa0, 0x46, 0x55, 0x13, 0x44, 0xe2, 0x2c, 0xd1, 0x86, 0xec, 0xdd, 0x91, 0x0e, 0x3e, 0x6b, 0x9a, 0x17, 0xf4, 0x10, 0x90, 0xc5, 0x74, 0x2f, 0x99, 0xb9, 0xac, 0x8a, 0xbf, 0xe4, 0x9b, 0xb5, 0x96, 0x98, 0x13, 0xcb, 0x1e, 0xe5, 0xbd, 0x5f, 0xea, 0x22, 0x5d, 0xb5, 0x82, 0xca, 0x57, 0x32, 0x07, 0x8a, 0x73, 0x12, 0x15, 0x97, 0xdd, 0x59, 0xed, 0x45, 0x70, 0x0c, 0xd4, 0xd6, 0x33, 0xa0, 0xb6, 0x8f, 0x24, 0xb3, 0x0f, 0x12, 0x35, 0xfa, 0x0c, 0xe7, 0x95, 0x7b, 0xed, 0x5c, 0x30, 0xfc, 0xad, 0x8f, 0x79, 0xbb, 0xe5, 0xc9, 0x67, 0x5f, 0xee, 0x0d, 0xbd, 0x2f, 0x45, 0xf1, 0x8f, 0x82, 0x34, 0xad, 0x02, 0x76, 0xaf, 0x72, 0x53, 0xe5, 0x7d, 0xfd, 0x1b, 0x95, 0x98, 0x6b, 0xd1, 0xaf, 0xd5, 0x4f, 0x90, 0x73, 0xc7, 0x02, 0x1a, 0x29, 0xe1, 0x3a, 0x1e, 0x5b, 0xdc, 0xde, 0xb6, 0x41, 0x58, 0x19, 0x34, 0x7d, 0xc6, 0xae, 0x1e, 0x09, 0x85, 0x8b, 0x77, 0x6d, 0x4b, 0xa0, 0x40, 0x35, 0xc7, 0xf1, 0x3f, 0xa2, 0x85, 0xea, 0xff, 0xa0, 0x11, 0xf3, 0x18, 0xf8, 0x5f, 0x45, 0xb0, 0xc7, 0x6a, 0xfc, 0x42, 0x2f, 0x1c, 0x6d, 0x9f, 0x4c, 0x6e, 0xb9, 0x32, 0x69, 0xd0, 0xa3, 0x87, 0x74, 0xcb, 0x9e, 0x0f, 0xb0, 0xe5 ],
+const [ 0xa4, 0x89, 0xcc, 0x5f, 0x00, 0xc1, 0x83, 0x5d, 0xda, 0xf2, 0xf0, 0x58, 0x67, 0x10, 0x85, 0x07, 0x52, 0xab, 0xe6, 0x8d, 0x00, 0x1f, 0x4e, 0x4e, 0x18, 0x0b, 0x2f, 0x00, 0x43, 0x04, 0x18, 0x05, 0x30, 0x8a, 0xdc, 0xf8, 0xdc, 0x3a, 0xf1, 0x86, 0x10, 0x46, 0x16, 0x7f, 0x2b, 0x23, 0x38, 0x2c, 0x21, 0x81, 0x97, 0xe4, 0xc4, 0x80, 0x25, 0xda, 0x42, 0x21, 0x2e, 0x39, 0xef, 0xfa, 0x3e, 0x73, 0x45, 0x2f, 0x40, 0xd5, 0x29, 0x9d, 0xe3, 0x60, 0x70, 0x58, 0x42, 0xd4, 0xa2, 0x58, 0xc3, 0x0d, 0xfe, 0x6f, 0x3f, 0x92, 0xbe, 0x7e, 0x64, 0x6c, 0x9c, 0xe9, 0x58, 0x34, 0x94, 0x48, 0x9f, 0x70, 0xec, 0x60, 0x3f, 0x20, 0x72, 0x51, 0x22, 0x93, 0x05, 0x10, 0xbb, 0x7f, 0x56, 0x18, 0xed, 0x51, 0xf0, 0x5d, 0x28, 0xc2, 0x76, 0x82, 0xd5, 0xab, 0x2c, 0x4b, 0xf4, 0x1a, 0xb9, 0x55, 0x03, 0xa5, 0x2c, 0x05, 0x22, 0xfe, 0x3c, 0xbe, 0x76, 0xc8, 0xd4, 0x57, 0xcb, 0xa9, 0xcf, 0xcc, 0x7d, 0xa1, 0x00, 0x33, 0x98, 0x9a, 0x75, 0xf2, 0x3e, 0x40, 0xfc, 0x30, 0x49, 0x12, 0xe7, 0x89, 0x32, 0xb9, 0x0d, 0x06, 0x32, 0x99, 0x11, 0x4c, 0xa6, 0xa7, 0xe7, 0x13, 0xb8, 0x7a, 0x93, 0xda, 0x3c, 0xa4, 0x34, 0xd9, 0xd8, 0x42, 0x42, 0x38, 0x68, 0xd2, 0x14, 0x7e, 0xa0, 0x45, 0xa5, 0x4c, 0xf3, 0x55, 0x97, 0x4b, 0xb4, 0x19, 0x78, 0x63, 0x7c, 0xd7, 0x45, 0x2e, 0xcb, 0x19, 0x2c, 0xac, 0xf2, 0x03, 0x96, 0x38, 0x30, 0xe3, 0x65, 0xba, 0x1b, 0x0a, 0x7a, 0x1f, 0x41, 0xdb, 0x7b, 0x06, 0x10, 0x21, 0xd3, 0xbc, 0xf3, 0xa6, 0xfa, 0x6b, 0xbe, 0x01, 0xf6, 0x8e, 0x4c, 0xaf, 0x22, 0xa8, 0x66, 0x65, 0x2e, 0x36, 0xe7, 0xa5, 0x67, 0xe2, 0x1e, 0x90, 0x38, 0xf9, 0x74, 0xfb, 0xf1, 0x1f, 0x4f, 0xc4, 0xc8, 0x42, 0x36, 0x66, 0x1e, 0xcc, 0x35, 0xcc, 0x03, 0x1d, 0x83, 0x63, 0xfb, 0x38, 0x62, 0x73, 0x02, 0xbc, 0x47, 0xaf, 0xcf, 0x17, 0x3b, 0x0b, 0x56, 0xf6, 0x81, 0xcd, 0x90, 0xff, 0x79, 0xe7, 0x7e, 0xc3, 0xc4, 0x84, 0x6c, 0xee, 0xa9, 0xe1, 0x73, 0xc1, 0xb7, 0x5e, 0x41, 0xc3, 0xac, 0xd5, 0x1d, 0xb3, 0x96, 0x2a, 0x25, 0xc0, 0x38, 0x23, 0xda, 0xfd, 0xaf, 0x7a, 0xdf, 0x0f, 0x56, 0x31, 0xfe, 0x28, 0xe6, 0x26, 0x6c, 0x3a, 0xe2, 0xe7, 0x4e, 0x64, 0x32, 0xc7, 0x7b, 0xb1, 0x0d, 0x32, 0x84, 0x01, 0x1d, 0x3d, 0xf2, 0x47, 0xde, 0x81, 0xce, 0xf5, 0x48, 0x2a, 0x67, 0xb5, 0xad, 0x4b, 0x4f, 0x5a, 0xe4, 0x75, 0xa7, 0x16, 0xa7, 0x87, 0x9c, 0xed, 0x3a, 0xc7, 0x32, 0x69, 0x4d, 0x32, 0x41, 0x90, 0x24, 0x11, 0xbc, 0x13, 0xf5, 0xcd, 0x39, 0xc8, 0x92, 0x04, 0xae, 0x5a, 0x47, 0xdc, 0x79, 0x40, 0x06, 0x98, 0xa4, 0xeb, 0xc1, 0x69, 0x66, 0x44, 0x18, 0x86, 0xed, 0x55, 0x34, 0x7e, 0x5a, 0x46, 0xf3, 0xcd, 0x0e, 0x8c, 0x45, 0xae, 0x24, 0x5d, 0xd6, 0x31, 0x3e, 0x67, 0xed, 0x8d, 0x85, 0xc1, 0x94, 0xb7, 0xeb, 0x22, 0xf9, 0x34, 0xb4, 0x51, 0x14, 0x2b, 0x34, 0xdc, 0x8a, 0xbe, 0xda, 0x0d, 0xd1, 0x9a, 0x6d, 0x1a, 0x95, 0xcd, 0x96, 0x9c, 0x5b, 0xd9, 0x9f, 0x42, 0x65, 0x06, 0x7a, 0xc7, 0xd5, 0xfc, 0x05, 0x21, 0x15, 0x90, 0x8c, 0xfc, 0x75, 0xdf, 0x8f, 0x66, 0x16, 0x99, 0xc6, 0xcc, 0x08, 0xa0, 0x63, 0x25, 0xaf, 0xd2, 0x97, 0x6d, 0x6b, 0x22, 0x57, 0x55, 0x77, 0xee, 0x60, 0x39, 0x12, 0x8d, 0x79, 0x52, 0xdd, 0x27, 0xf8, 0x2d, 0x85, 0xc9, 0x87, 0x5b, 0xa1, 0xb8, 0x28, 0x6b, 0xde, 0x06, 0x77, 0x15, 0x59, 0x64, 0x2f, 0xb8, 0x4c, 0x37, 0xf0, 0x07, 0xed, 0xee, 0x40, 0xfe, 0x93, 0x92, 0xcf, 0x1c, 0x1b, 0x9e, 0xff, 0xcc, 0x8a, 0x12, 0xa3, 0x24, 0xf3, 0xc3, 0x07, 0xd1, 0x9c, 0xf5, 0x32, 0x52, 0x5c, 0x2b, 0x67, 0x65, 0x47, 0x3e, 0xf2, 0xbf, 0x8e, 0xad, 0x21, 0x00, 0xa0, 0x34, 0x90, 0xe6, 0x95, 0xa0, 0xa9, 0xc1, 0xcd, 0xe1, 0x6c, 0x27, 0xd4, 0x61, 0x6c, 0xe8, 0x89, 0x94, 0x1a, 0x44, 0x80, 0xd1, 0x46, 0x5c, 0xa4, 0x60, 0xe3, 0xe7, 0x21, 0xd4, 0x0b, 0x26, 0x81, 0x9a, 0x43, 0x1a, 0x14, 0xd3, 0xff, 0xf4, 0x96, 0x5f, 0x69, 0xcd, 0x0c, 0x3a, 0x5e, 0x97, 0xef, 0x0c, 0xb9, 0x54, 0x8c, 0xfb, 0xd5, 0x86, 0xab, 0xc4, 0x4d, 0xe6, 0x6f, 0x0a, 0x06, 0x58, 0x7d, 0xee, 0x70, 0x1f, 0x60, 0xdf, 0x08, 0x4d, 0x2d, 0xb3, 0x22, 0x7e, 0x62, 0xf7, 0xe5, 0xc6, 0x14, 0x84, 0x97, 0xe8, 0x4a, 0x53, 0x1b, 0xc9, 0xa4, 0x93, 0xb7, 0x24, 0x40, 0xf8, 0x1b, 0x7e, 0xdd, 0x55, 0x9f, 0x5d, 0x41, 0x6d, 0xcd, 0xb5, 0xd9, 0x07, 0x1f, 0xa3, 0xa0, 0x40, 0x09, 0x5d, 0x41, 0x25, 0x3a, 0x6a, 0x80, 0x81, 0x20, 0x0e, 0xd6, 0xf4, 0xaa, 0x09, 0x5b, 0x45, 0x51, 0x81, 0xea, 0xf9, 0x59, 0x3c, 0x7f, 0x25, 0x54, 0x12, 0xe3, 0x80, 0xe9, 0xa2, 0x8c, 0xbc, 0xd3, 0x45, 0xbe, 0x17, 0x2c, 0x40, 0xf7, 0x2d, 0xec, 0x3e, 0x8a, 0x10, 0xad, 0xfd, 0x8a, 0x9a, 0xb1, 0x47, 0xe9, 0x02, 0x25, 0x24, 0xe1, 0xae, 0xa7, 0x4e, 0x93, 0x48, 0x07, 0xe5, 0xef, 0x14, 0x4a, 0x64, 0xd3, 0x81, 0xf5, 0xd4, 0x77, 0xfe, 0x88, 0x3f, 0x08, 0x0e, 0x48, 0x68, 0x93, 0x9f, 0x41, 0xb9, 0x25, 0x98, 0x8c, 0x7d, 0x31, 0xb1, 0xce, 0x4f, 0x31, 0x87, 0x01, 0xd2, 0x90, 0xf0, 0x77, 0xa3, 0xc8, 0x8b, 0x1b, 0x8c, 0xc8, 0x9c, 0xfb, 0xfb, 0x98, 0x17, 0x03, 0xb2, 0x3f, 0xfb, 0x0b, 0xbf, 0xe5, 0xe1, 0x15, 0xaf, 0x35, 0xd5, 0xcf, 0xff, 0x05, 0x64, 0x60, 0xd3, 0x39, 0xf6, 0x60, 0xea, 0xe4, 0x5f, 0x28, 0xd2, 0xb1, 0xb0, 0x4d, 0x58, 0x82, 0x53, 0x67, 0x43, 0x56, 0x57, 0x17, 0x42, 0x70, 0x08, 0x48, 0x22, 0xb6, 0xc3, 0xb4, 0x44, 0x57, 0x08, 0xaa, 0x4f, 0xb0, 0xd1, 0x0f, 0x22, 0x71, 0x22, 0xa4, 0x0d, 0xfb, 0xe2, 0x86, 0x40, 0x0d, 0xe9, 0xfb, 0x83, 0xa0, 0x5a, 0x6b, 0x28, 0x0f, 0x33, 0xad, 0x3e, 0x7b, 0x22, 0x85, 0x08, 0x6e, 0x9b, 0x6a, 0xae, 0xbe, 0x27, 0x8c, 0x31, 0xb5, 0xff, 0x15, 0xa4, 0x6e, 0xd9, 0xaf, 0x9a, 0x82, 0x02, 0x47, 0xdb, 0xe5, 0xad, 0x11, 0x5b, 0x0a, 0x8b, 0xcd, 0x6c, 0x4e, 0x9b, 0x48, 0x32, 0x93, 0x44, 0x25, 0x57, 0x2b, 0xa1, 0xdd, 0x01, 0xf9, 0x1c, 0x05, 0x01, 0xd2, 0x3e, 0xd0, 0x4e, 0x29, 0xc5, 0xd4, 0xb1, 0xec, 0xf7, 0x11, 0xc1, 0xa9, 0x37, 0x2f, 0x12, 0xf5, 0xd6, 0x07, 0xaa, 0x0e, 0x2b, 0x65, 0xb4, 0xbf, 0xe6, 0x0c, 0x79, 0x84, 0xa1, 0xfb, 0x8b, 0xef, 0xb8, 0xef, 0x43, 0x4a, 0x5b, 0x29, 0x6e, 0x7e, 0xe1, 0x71, 0x44, 0x34, 0x5f, 0x5b, 0x9a, 0x39, 0x7a, 0xc9, 0x58, 0x27, 0x79, 0xb1, 0x2c, 0x42, 0x9f, 0x21, 0x80, 0xa0, 0xb7, 0x80, 0xaa, 0x8d, 0xf0, 0x16, 0x63, 0x2d, 0xeb, 0xcf, 0x7b, 0x63, 0x13, 0x3b, 0xcb, 0xf2, 0x2d, 0xda, 0x6a, 0xe2, 0x2f, 0x97, 0x24, 0x26, 0x56, 0x92, 0x27, 0x7b, 0x73, 0x22, 0x00, 0x93, 0x86, 0x1b, 0xc6, 0x73, 0x8d, 0x4c, 0x95, 0x1a, 0x9e, 0x4c, 0x3e, 0x63, 0x34, 0x77, 0x3d, 0x2c, 0xc7, 0x33, 0xec, 0xb8, 0x9f, 0x78, 0xf6, 0x52, 0xe9, 0x8f, 0x0d, 0x33, 0x0b, 0x19, 0xe0, 0xa6, 0x35, 0x54, 0x47, 0x6a, 0x38, 0x9a, 0xc1, 0x58, 0x9c, 0x2a, 0x21, 0x45, 0xec, 0x2b, 0x84, 0x2a, 0x55, 0xee, 0x86, 0x83, 0x70, 0x74, 0xb6, 0xf4, 0x5b, 0x30, 0x47, 0x32, 0x0e, 0x0d, 0x08, 0x21, 0xec, 0xb3, 0x96, 0x3a, 0x99, 0x06, 0xcf, 0x30, 0x0c, 0xf0, 0x8b, 0xd3, 0xe5, 0x61, 0x87, 0x34, 0x00, 0x94, 0xa2, 0x0a, 0x4a, 0x93, 0x4c, 0x54, 0xd3, 0xfd, 0x3b, 0x40, 0x25, 0x07, 0x5f, 0x4c, 0xd5, 0xc1, 0x19, 0xab, 0x57, 0x9b, 0xa8, 0xea, 0x16, 0x27, 0xe4, 0xd3, 0xc4, 0x20, 0x2e, 0x92, 0xef, 0xac, 0xa7, 0x16, 0xd6, 0xde, 0xa0, 0xba, 0x7a, 0x7f, 0x52, 0x25, 0xf8, 0x0e, 0xcf, 0x6e, 0x15, 0x05, 0x39, 0x84, 0x1b, 0x5e, 0x32, 0xce, 0xe4, 0x56, 0x93, 0x0e, 0x34, 0x71, 0x61, 0x8b, 0x4c, 0xbe, 0xfd, 0x6f, 0xbb, 0x5c, 0x9a, 0x6e, 0x78, 0x3d, 0xf4, 0xa8, 0x2e, 0x2a, 0x40, 0xd1, 0xd7, 0x07, 0x5e, 0x8f, 0x8c, 0x59, 0x56, 0x23, 0x9b, 0x05, 0x02, 0x4c, 0xdb, 0x5a, 0x08, 0x68, 0x3c, 0x52, 0x0c, 0xdd, 0xa2, 0x15, 0x23, 0xb7, 0xf4, 0xbf, 0x8a, 0x93, 0x6f, 0x63, 0x98, 0xbb, 0x41, 0x50, 0xf1, 0x92, 0x53, 0x93, 0xfd, 0x33, 0x66, 0xbd, 0x98, 0x55, 0x61, 0xe6, 0x0b, 0x72, 0xe9, 0xf1, 0x3b, 0x28, 0x33, 0x12, 0x21, 0xdf, 0x16, 0x8e, 0x7a, 0xac, 0x65, 0xc2, 0xc0, 0x75, 0x7b, 0x67, 0x58, 0x56, 0x17, 0x14, 0x0d, 0x44, 0x6b, 0x04, 0xbd, 0xf0, 0x6f, 0x1a, 0x52, 0xee, 0x7b, 0x22, 0xf4, 0x17, 0x15, 0x5a, 0x7e, 0x2c, 0x08, 0x31, 0x2e, 0xbc, 0xb6, 0x4e, 0xa0, 0x47, 0xae, 0xd4, 0xfd, 0xa3, 0x81, 0xe5, 0x70, 0x9f, 0xd2, 0x65, 0xd9, 0xe7, 0xad, 0x00, 0xc6, 0x27, 0x1a, 0x6e, 0x9f, 0x73, 0xf1, 0xf5, 0x20, 0xe7, 0xef, 0x30, 0x0c, 0x8a, 0x0a, 0x10, 0x20, 0x78, 0x02, 0x20, 0x46, 0x41, 0x39, 0x0d, 0x0c, 0x8c, 0xc4, 0x65, 0x54, 0x00, 0xc2, 0x9f, 0x4d, 0x64, 0xec, 0x5c, 0xa2, 0x04, 0x6e, 0xec, 0xf1, 0x57, 0xf6, 0x14, 0x7e, 0xe0, 0x0a, 0x0e, 0x29, 0x52, 0x9e, 0xd2, 0x9d, 0xf7, 0xe6, 0x94, 0xcb, 0x52, 0x69, 0x8e, 0x97, 0x04, 0x57, 0xff, 0xd0, 0xec, 0x1c, 0x74, 0x66, 0x92, 0x35, 0x46, 0xd7, 0xc6, 0x42, 0x64, 0xeb, 0x84, 0x5d, 0x52, 0xa1, 0x1b, 0xab, 0x72, 0x69, 0x8e, 0x30, 0x83, 0x93, 0x3b, 0xe8, 0x67, 0x08, 0xba, 0x13, 0x29, 0x38, 0x08, 0xd0, 0x3e, 0x53, 0xe5, 0xed, 0x0b, 0xbc, 0x7a, 0xfe, 0xa8, 0xbb, 0x3f, 0xac, 0xe4, 0x72, 0x1c, 0x50, 0x89, 0x12, 0xcf, 0xc1, 0xe1, 0x4e, 0x8d, 0x69, 0x78, 0x10, 0xec, 0x9f, 0x24, 0x6b, 0x00, 0x31, 0x43, 0xd2, 0xc4, 0x3f, 0x44, 0x87, 0xbc, 0x50, 0x69, 0x55, 0xd9, 0x9f, 0xca, 0x82, 0x9d, 0xb6, 0x9e, 0x00, 0x7f, 0x3e, 0xb6, 0xe3, 0x91, 0x16, 0x4a, 0x18, 0x60, 0xa2, 0xf8, 0x53, 0x1c, 0x66, 0x0a, 0x49, 0xf9, 0xd3, 0xf8, 0x20, 0xd4, 0x60, 0x2d, 0x23, 0x1a, 0xdd, 0x0e, 0xbb, 0xe6, 0x04, 0x39, 0x9a, 0x69, 0x52, 0x0a, 0x3a, 0x8f, 0x15, 0x64, 0x86, 0xdf, 0xc5, 0xae, 0xd7, 0xa4, 0x97, 0x1b, 0x21, 0x4a, 0x50, 0x2f, 0x6f, 0x0a, 0x57, 0x7f, 0x8c, 0xca, 0x0f, 0xb8, 0x03, 0x3e, 0x63, 0xe2, 0x4a, 0x54, 0xa3, 0xe6, 0x3b, 0xcf, 0x8e, 0x4e, 0xc3, 0x31, 0xb0, 0x4d, 0xde, 0xdf, 0xee, 0xff, 0xc3, 0x80, 0x5f, 0xf1, 0x5b, 0xa6, 0x5d, 0xe4, 0xf8, 0xb0, 0xdc, 0xce, 0x44, 0xef, 0xfb, 0x22, 0x78, 0x07, 0xd9, 0x51, 0xce, 0x98, 0xaa, 0x91, 0x38, 0x1e, 0x0a, 0xdd, 0x52, 0x16, 0x90, 0x3d, 0x95, 0x63, 0xa7, 0x47, 0xce, 0xef, 0x99, 0xe6, 0xcf, 0x95, 0xed, 0x5a, 0x65, 0x3f, 0xf3, 0x80, 0x8a, 0x4b, 0x9d, 0x54, 0xdb, 0x34, 0x90, 0xb4, 0x4c, 0x6e, 0x7b, 0x67, 0x1a, 0x91, 0xa8, 0x5d, 0x01, 0xba, 0xd1, 0x38, 0xb0, 0x2e, 0x34, 0x0c, 0x7a, 0x41, 0xe9, 0x63, 0x4e, 0x77, 0x74, 0x85, 0xe9, 0xe8, 0x97, 0xf6, 0x4a, 0xe9, 0x6a, 0x3f, 0x66, 0xe8, 0xad, 0xf1, 0x1e, 0x98, 0x5c, 0xe8, 0x6e, 0x4f, 0x84, 0xcd, 0xe7, 0xac, 0x56, 0xde, 0x5f, 0x7c, 0x79, 0xf2, 0xe7, 0xde, 0xa5, 0xb7, 0xfd, 0xa6, 0x6e, 0x3f, 0x03, 0x00, 0x5d, 0xbb, 0xf0, 0x56, 0x45, 0x86, 0x46, 0x73, 0xd4, 0x65, 0x44, 0xe8, 0x69, 0x0d, 0x5c, 0xae, 0x25, 0xe5, 0xe7, 0x0e, 0x45, 0x0e, 0x18, 0xbe, 0xaf, 0xa1, 0x2e, 0x4d, 0xca, 0x37, 0xee, 0xc0, 0x93, 0xaf, 0x51, 0x7e, 0xee, 0x2b, 0x7a, 0x69, 0x39, 0x5c, 0xea, 0x4e, 0x27, 0x00, 0xf7, 0x7f, 0xcc, 0xa8, 0x7a, 0xbe, 0xf4, 0xbf, 0xc9, 0x5d, 0xb9, 0xc8, 0xe5, 0xa4, 0x55, 0xe7, 0xf4, 0x73, 0x34, 0xa3, 0xf1, 0x28, 0x4e, 0xea, 0xa2, 0xc3, 0xb3, 0x55, 0xca, 0x49, 0x67, 0xae, 0xa1, 0x66, 0x71, 0xb0, 0x81, 0x55, 0x2f, 0x0d, 0xe2, 0x05, 0xec, 0xb6, 0x88, 0x74, 0xb4, 0x56, 0xfb, 0x5f, 0x67, 0x1f, 0x38, 0x1e, 0x0d, 0xca, 0xa6, 0xca, 0x69, 0xd9, 0x4b, 0xa0, 0xd1, 0x20, 0x40, 0xaa, 0x3d, 0x83, 0x62, 0x9c, 0x9d, 0x01, 0x4b, 0xfc, 0x70, 0xf2, 0x81, 0x85, 0x92, 0x8c, 0xec, 0xce, 0x55, 0xac, 0x8e, 0x27, 0xd4, 0xd4, 0x6e, 0xc3, 0x84, 0x6f, 0xd5, 0x1d, 0x0c, 0x5d, 0xbd, 0x94, 0x57, 0xab, 0x87, 0x58, 0xe7, 0xa2, 0xec, 0x8a, 0x6c, 0x04, 0x36, 0x9f, 0x95, 0x92, 0xb0, 0x06, 0x26, 0xd1, 0x5b, 0x0a, 0x4b, 0x0e, 0xe2, 0xf9, 0x2b, 0xa0, 0xd0, 0x86, 0xc1, 0x6d, 0x01, 0x6c, 0xe7, 0xb0, 0x56, 0x54, 0xb4, 0xf9, 0xad, 0xf9, 0x08, 0x75, 0x11, 0x8a, 0x65, 0x6f, 0x2d, 0x50, 0x01, 0x17, 0x07, 0x90, 0x19, 0x82, 0xeb, 0xb3, 0x87, 0xf3, 0xa4, 0xa4, 0x97, 0x59, 0xf3, 0x7a, 0x17, 0x18, 0x39, 0x57, 0xad, 0x0c, 0x77, 0x8f, 0x6e, 0xcb, 0x78, 0x0d, 0xab, 0x2b, 0x4d, 0xf3, 0x0e, 0x05, 0xfa, 0x81, 0xe6, 0x38, 0x6f, 0x38, 0xc0, 0xf0, 0xba, 0x3f, 0x37, 0x28, 0x7a, 0x05, 0x0d, 0x6d, 0x97, 0x28, 0x7a, 0xe5, 0x30, 0x96, 0xc3, 0x91, 0xd5, 0xf2, 0x0f, 0xcf, 0xf7, 0x39, 0x77, 0x23, 0x9c, 0xa5, 0x5c, 0x36, 0x57, 0xd1, 0xfd, 0x1f, 0x78, 0x1f, 0x48, 0xe2, 0x80, 0x57, 0xf1, 0x36, 0xd8, 0x90, 0xc2, 0x8c, 0xc2, 0x54, 0x32, 0x4c, 0x8f, 0xff, 0x38, 0x62, 0x13, 0x68, 0x61, 0xf9, 0x56, 0xc3, 0x21, 0x86, 0x8c, 0xc6, 0x66, 0x09, 0x47, 0x0b, 0x73, 0x90, 0xec, 0xb6, 0xec, 0xfc, 0x63, 0x57, 0x2d, 0x07, 0x13, 0x12, 0xe0, 0x86, 0x0e, 0xfd, 0xcf, 0xec, 0x88, 0xc9, 0xf6, 0x10, 0x8e, 0xa5, 0xdd, 0x30, 0xf5, 0x5f, 0x25, 0x35, 0x90, 0xcc, 0x60, 0x38, 0xa6, 0x6b, 0x26, 0x46, 0xa2, 0x45, 0x65, 0x60, 0x0d, 0x17, 0xf8, 0xc6, 0xba, 0xb3, 0x7b, 0x76, 0x40, 0xa4, 0x5e, 0xef, 0xad, 0x11, 0x39, 0x3a, 0x79, 0xe4, 0x5f, 0x2b, 0xb9, 0x2a, 0xb6, 0xe5, 0x95, 0xbd, 0xc6, 0x9c, 0xfc, 0x21, 0x0f, 0x9f, 0x97, 0xad, 0xa0, 0x95, 0xfb, 0xeb, 0xe5, 0x06, 0x22, 0x41, 0xc1, 0x1e, 0x1c, 0xd0, 0xdc, 0xae, 0x02, 0x9c, 0x3f, 0x74, 0x2c, 0xed, 0x1e, 0x9c, 0xa3, 0xf6, 0xf4, 0x86, 0xd9, 0xb5, 0xd6, 0xca, 0x98, 0x1a, 0x00, 0x7a, 0x39, 0x6b, 0xb5, 0xa7, 0x16, 0xe7, 0x46, 0x26, 0x42, 0xaa, 0x70, 0x93, 0x77, 0xd0, 0xea, 0x97, 0x4f, 0xdd, 0x3f, 0x67, 0xb7, 0x5d, 0xda, 0x8d, 0xa1, 0xc7, 0x5f, 0xeb, 0xfa, 0xa7, 0x42, 0xfd, 0xdc, 0xfc, 0x92, 0x5e, 0x04, 0xdf, 0x15, 0x8e, 0x86, 0x66, 0x9a, 0xf2, 0xbf, 0xc8, 0x8b, 0x1c, 0x8c, 0xc2, 0xc2, 0x4d, 0xb9, 0x39, 0x9d, 0x38, 0xbd, 0x20, 0x55, 0x09, 0xa4, 0x9c, 0x8b, 0xa6, 0x4c, 0x66, 0x24, 0x35, 0xd4, 0x72, 0x57, 0xde, 0x52, 0xce, 0x04, 0xd2, 0xc4, 0xcc, 0x48, 0x8c, 0x4a, 0x63, 0x4e, 0x57, 0x92, 0xd3, 0x68, 0x10, 0x93, 0x88, 0x5e, 0x2d, 0x7e, 0x41, 0x06, 0xfe, 0xf1, 0x71, 0x14, 0x33, 0x6e, 0xe5, 0x34, 0x9f, 0x0d, 0xa8, 0x56, 0x3b, 0x6d, 0x24, 0x49, 0x6e, 0xf0, 0x89, 0x8c, 0x8b, 0x28, 0x73, 0x61, 0x9c, 0x8c, 0xc7, 0x22, 0x5e, 0x70, 0xdd, 0xd8, 0x8c, 0x34, 0xe5, 0x0a, 0x60, 0xbb, 0x83, 0xd3, 0x58, 0x1e, 0xbd, 0x37, 0x36, 0xa2, 0x17, 0xb7, 0x4a, 0xe8, 0xfc, 0x23, 0xf3, 0x64, 0x60, 0xb0, 0x64, 0x10, 0xa4, 0x4b, 0xa4, 0x62, 0xba, 0x2c, 0xd8, 0x7b, 0x89, 0xad, 0xc5, 0xa1, 0x93, 0x5d, 0x91, 0xef, 0xd5, 0x50, 0xc9, 0x4b, 0xee, 0xba, 0xa9, 0x99, 0x84, 0xbc, 0x97, 0x2e, 0xe4, 0x7e, 0xf0, 0x88, 0xe8, 0x7e, 0x07, 0x3c, 0x1e, 0x28, 0x6b, 0x2f, 0x26, 0xa6, 0x69, 0x09, 0x5c, 0xf9, 0xd2, 0xe7, 0xb8, 0x49, 0xff, 0x51, 0xf2, 0x79, 0x11, 0x6b, 0xe9, 0xff, 0x7d, 0x6f, 0x45, 0xf3, 0xc9, 0x5a, 0x5b, 0x65, 0x90, 0xe6, 0x52, 0xf4, 0xcc, 0xb9, 0x84, 0x9c, 0x55, 0xdc, 0x27, 0xd0, 0xa4, 0x6e, 0x2d, 0xc9, 0xdd, 0x9a, 0x68, 0x1d, 0x0d, 0xc6, 0xf2, 0x93, 0xaf, 0x0d, 0xcc, 0x36, 0x76, 0xf0, 0xc5, 0xa8, 0x46, 0x48, 0x9e, 0xb9, 0x83, 0x7f, 0x6b, 0x38, 0x8f, 0x00, 0x3c, 0x0a, 0x8e, 0xec, 0xfd, 0x78, 0x6d, 0x0f, 0x9b, 0xcd, 0x22, 0x12, 0x69, 0x21, 0x35, 0xf2, 0xc1, 0x70, 0x7f, 0xb1, 0xee, 0xef, 0x32, 0x4b, 0x49, 0x9f, 0x19, 0xeb, 0xa3, 0x22, 0x21, 0x5f, 0xe3, 0xce, 0x19, 0xc9, 0xf0, 0x00, 0xb6, 0x98, 0xd2, 0xb2, 0xda, 0xb7, 0x14, 0x50, 0x15, 0x04, 0x6c, 0xc8, 0x6d, 0x04, 0x9e, 0xe1, 0x5a, 0xd5, 0x9d, 0xcd, 0x15, 0x64, 0xf3, 0x01, 0x12, 0xe0, 0x64, 0x44, 0xcb, 0x6e, 0xce, 0x06, 0xc0, 0x1e, 0x54, 0xf4, 0xbc, 0x1d, 0xbb, 0xc9, 0x59, 0x2d, 0x14, 0x67, 0xc6, 0x53, 0x9c, 0x26, 0xc8, 0xcf, 0xe0, 0x6c, 0xff, 0x51, 0x25, 0x7e, 0x6b, 0x6a, 0x06, 0x95, 0x2f, 0x41, 0x5f, 0x35, 0x94, 0x87, 0x6a, 0xba, 0x50, 0xad, 0x28, 0x34, 0x09, 0x54, 0x03, 0x74, 0x15, 0x05, 0xb1, 0x67, 0x84, 0x22, 0x5b, 0xa3, 0x60, 0x1c, 0xff, 0x40, 0x33, 0xe7, 0x13, 0xe9, 0xca, 0xab, 0x6b, 0x32, 0x39, 0xbd, 0x5c, 0x2c, 0x1f, 0xcd, 0x22, 0x38, 0x2b, 0x61, 0x7f, 0x18, 0xdf, 0x82, 0xa5, 0x4c, 0x94, 0xb4, 0x56, 0x9b, 0xbf, 0x2c, 0x4a, 0xf0, 0x72, 0x3e, 0xd1, 0x67, 0x26, 0x15, 0xb9, 0xa8, 0xb7, 0xa6, 0x72, 0x74, 0xb0, 0xe6, 0x70, 0x7d, 0xc9, 0x3b, 0xd1, 0x7b, 0xae, 0x31, 0x40, 0x7c, 0x02, 0x6f, 0x19, 0x7b, 0xa4, 0xe9, 0xcd, 0x35, 0x31, 0x57, 0x89, 0x38, 0xca, 0xe5, 0x12, 0x3d, 0x17, 0x2c, 0xf4, 0xb7, 0x8b, 0x61, 0xdb, 0xac, 0xea, 0xcc, 0x41, 0xc4, 0x09, 0x7c, 0x49, 0xa0, 0xd6, 0x3a, 0xeb, 0x6c, 0x97, 0xbb, 0x52, 0xb8, 0x77, 0x1a, 0x82, 0x83, 0x3e, 0x85, 0x3e, 0x99, 0x60, 0x36, 0x29, 0x20, 0x39, 0xa4, 0x2b, 0x6d, 0x97, 0xfb, 0x16, 0x1c, 0x79, 0xca, 0x8a, 0x5f, 0x16, 0xfc, 0x16, 0x96, 0x21, 0x0a, 0x9f, 0x20, 0x4c, 0x6f, 0x06, 0x71, 0x0b, 0x5b, 0x05, 0x65, 0x9a, 0xab, 0x5a, 0xd4, 0x41, 0x19, 0x28, 0x67, 0xd7, 0xb0, 0x9a, 0xaa, 0x85, 0x84, 0xc9, 0x62, 0xcc, 0x9f, 0xe0, 0x20, 0xc9, 0x3e, 0x7e, 0x16, 0xb8, 0x3e, 0x5b, 0x2a, 0xb8, 0xd1, 0x2f, 0x49, 0xcd, 0x75, 0xcf, 0xfe, 0x2b, 0x27, 0x99, 0x43, 0xb2, 0xd3, 0x13, 0x97, 0xb5, 0x10, 0xcf, 0x50, 0xff, 0x0a, 0x92, 0x33, 0x18, 0xbf, 0xb4, 0x42, 0xc4, 0x6f, 0xca, 0xd5, 0xcd, 0x4d, 0x83, 0xec, 0x02, 0x7b, 0xd0, 0xc4, 0x80, 0x35, 0x48, 0xa8, 0x30, 0x4d, 0xca, 0x0a, 0x91, 0xd7, 0x64, 0xd2, 0xb8, 0x25, 0x73, 0xf6, 0x95, 0xf6, 0x0c, 0x4b, 0x77, 0xea, 0x9b, 0x9b, 0xd2, 0x39, 0xca, 0xf7, 0x41, 0xa5, 0xa5, 0x4e, 0xc7, 0xad, 0xfb, 0x3f, 0x5a, 0x04, 0x07, 0x2c, 0xa2, 0x41, 0x4f, 0x90, 0xfe, 0xd8, 0xcd, 0x92, 0xc8, 0x49, 0x4d, 0xda, 0xda, 0x97, 0x16, 0xa3, 0x50, 0xfc, 0xcc, 0x11, 0x90, 0xdb, 0x95, 0xc5, 0x88, 0xf6, 0x7b, 0xb0, 0x37, 0xe1, 0x12, 0x24, 0x6f, 0xb7, 0x5a, 0x31, 0xd9, 0x0b, 0xe6, 0x2e, 0x39, 0x21, 0x3e, 0x96, 0xf3, 0x5e, 0x83, 0x16, 0xcf, 0xfe, 0x51, 0xe3, 0xf9, 0x05, 0xe9, 0x51, 0x4c, 0x78, 0x90, 0xa2, 0xcf, 0xcc, 0x32, 0x1b, 0x80, 0x9f, 0x4b, 0x5e, 0x51, 0xa6, 0x08, 0xf3, 0x71, 0xe7, 0xa9, 0x28, 0xcc, 0x28, 0x29, 0x1b, 0xd5, 0xa7, 0x21, 0x15, 0x83, 0x0b, 0xea, 0x19, 0x99, 0x9b, 0x01, 0xbd, 0x2b, 0xae, 0xb0, 0x39, 0x5e, 0x62, 0xeb, 0xbe, 0x6f, 0x91, 0x79, 0x09, 0xf7, 0x01, 0x54, 0x37, 0x6d, 0xdb, 0x51, 0xdb, 0xec, 0x5f, 0x03, 0x4e, 0x36, 0xd5, 0xdd, 0x46, 0xfa, 0xc7, 0x98, 0xaa, 0x52, 0x6d, 0xd4, 0xa5, 0x90, 0x69, 0x02, 0xfa, 0x3a, 0xb5, 0x81, 0x97, 0x53, 0xd9, 0x07, 0x6c, 0xdc, 0x61, 0x43, 0x7d, 0x9b, 0x8e, 0xc1, 0x36, 0x1b, 0x4c, 0x0d, 0xff, 0xf4, 0x64, 0x1b, 0x11, 0x4c, 0xf3, 0xe6, 0x88, 0x9e, 0x1b, 0x58, 0xb9, 0xbb, 0xf8, 0x6a, 0xc5, 0x0e, 0xd5, 0x8c, 0x6f, 0x23, 0xa0, 0x47, 0x2a, 0x6b, 0x9c, 0x21, 0x76, 0x39, 0x56, 0xc1, 0x6d, 0x11, 0xda, 0x53, 0x99, 0x22, 0x26, 0x2e, 0x09, 0x11, 0xdf, 0xb4, 0xa4, 0xf8, 0x43, 0x7a, 0xbd, 0xaf, 0x5f, 0xaa, 0xe7, 0x4a, 0x82, 0xa5, 0x0a, 0xe2, 0xf1, 0xec, 0xb6, 0x99, 0xdc, 0x40, 0xb8, 0xd8, 0x91, 0x08, 0xeb, 0xdb, 0xf0, 0xf4, 0x51, 0x70, 0x1f, 0xe0, 0x62, 0xfb, 0x7f, 0xfb, 0xa4, 0xbe, 0xde, 0x28, 0x7c, 0x57, 0xee, 0xa4, 0x44, 0x8a, 0xf5, 0xe9, 0x9d, 0x41, 0xc7, 0xd3, 0x07, 0xd1, 0xf2, 0x02, 0xaf, 0x7f, 0x38, 0x7f, 0x87, 0x43, 0x42, 0xa2, 0x9c, 0xcc, 0x92, 0x33, 0xa5, 0xc3, 0xba, 0xcf, 0xd7, 0x54, 0xcb, 0x8d, 0x01, 0xeb, 0x11, 0xe2, 0xd4, 0x3b, 0xfd, 0xc2, 0x82, 0x85, 0x63, 0x08, 0x8c, 0x17, 0xe6, 0x18, 0xd4, 0x13, 0xb0, 0xc3, 0xfa, 0x71, 0x66, 0x6b, 0xe5, 0x47, 0x5a, 0x67, 0xa0, 0x48, 0x03, 0xa8, 0x68, 0x8b, 0xab, 0x9d, 0x03, 0x8f, 0x68, 0x55, 0x53, 0x7b, 0x4d, 0xe4, 0x2a, 0xaa, 0xe1, 0x07, 0x60, 0x66, 0xd0, 0x0b, 0x23, 0xf4, 0xe1, 0xea, 0x8f, 0xd2, 0x28, 0xb8, 0x7e, 0x3c, 0x7d, 0x3d, 0xa2, 0xf4, 0x2d, 0xe4, 0xd1, 0x43, 0xef, 0xd4, 0x9f, 0x3b, 0x19, 0x5c, 0x32, 0x40, 0x13, 0x94, 0x52, 0xc7, 0x0c, 0x41, 0xc0, 0x5c, 0xed, 0xfa, 0xc9, 0xea, 0x8b, 0x89, 0x1a, 0x37, 0x21, 0x94, 0xd6, 0xae, 0xfd, 0x7d, 0xe6, 0x61, 0x79, 0x86, 0x91, 0x4e, 0x2d, 0x39, 0x4c, 0xe1, 0x63, 0x07, 0xd3, 0xbb, 0xcb, 0x2f, 0x78, 0xb2, 0x71, 0xe1, 0xbb, 0x19, 0xeb, 0xa3, 0x1c, 0x41, 0xd7, 0xf5, 0x2d, 0x3f, 0x85, 0x30, 0xeb, 0xf0, 0xf0, 0xb4, 0x4e, 0x3b, 0xf3, 0x42, 0x1f, 0x96, 0xb9, 0xa7, 0x0a, 0xcc, 0x76, 0x9b, 0xf4, 0xfd, 0x54, 0xe8, 0x8f, 0xe6, 0xb1, 0xcf, 0x2b, 0x62, 0x87, 0xa7, 0xcf, 0x31, 0x2b, 0xc7, 0x88, 0xf9, 0x3b, 0xa6, 0x01, 0x8a, 0xd1, 0x41, 0x54, 0x66, 0xfd, 0xbd, 0x20, 0x81, 0x73, 0x4e, 0xdc, 0x45, 0x80, 0x57, 0x6a, 0xd9, 0x43, 0xd3, 0xef, 0xa3, 0x19, 0xf3, 0xe3, 0x0c, 0x59, 0x08, 0x64, 0x83, 0x42, 0xa4, 0xd0, 0xc4, 0x31, 0xfc, 0x92, 0x5a, 0x17, 0x91, 0x3c, 0x62, 0x2b, 0x10, 0xd7, 0x93, 0xdc, 0x76, 0x76, 0x7b, 0x0a, 0x77, 0x12, 0x0b, 0x75, 0x21, 0x91, 0x56, 0x76, 0xbd, 0x28, 0x96, 0xed, 0xf6, 0xe3, 0x70, 0x7a, 0x3d, 0x82, 0x79, 0xf0, 0x6b, 0x87, 0xf8, 0x06, 0xa8, 0x8d, 0xee, 0x50, 0x8c, 0xdb, 0x53, 0x6e, 0x85, 0x39, 0xa3, 0x84, 0x79, 0x03, 0x99, 0xea, 0xac, 0x7b, 0x3a, 0x24, 0xe3, 0x63, 0x16, 0x14, 0xca, 0xcc, 0xcb, 0x6e, 0x93, 0x29, 0xca, 0x6d, 0xe0, 0xa7, 0x5e, 0xc4, 0xe3, 0xc1, 0xea, 0xd8, 0xc3, 0x0e, 0x72, 0x2c, 0x42, 0x5e, 0x5c, 0x1c, 0x9e, 0x06, 0x78, 0xcf, 0xb4, 0x78, 0x3f, 0x67, 0x6b, 0x17, 0x58, 0x7a, 0x50, 0x49, 0x61, 0xc6, 0x7e, 0xcd, 0xeb, 0x20, 0xc1, 0x4f, 0xc6, 0xae, 0xfb, 0x39, 0x80, 0x56, 0xc6, 0xcd, 0x28, 0x76, 0x5a, 0x71, 0x57, 0xd6, 0xb2, 0x49, 0x72, 0xdb, 0xea, 0x0b, 0x29, 0xfd, 0xec, 0x0f, 0x43, 0x7a, 0x4b, 0xa6, 0x9e, 0x4c, 0x6f, 0xad, 0x71, 0x59, 0xf3, 0x62, 0xd5, 0xeb, 0x4b, 0x76, 0x84, 0x5f, 0xaa, 0x63, 0xe0, 0x21, 0x22, 0xff, 0x37, 0xd8, 0x0e, 0x51, 0x45, 0xdd, 0xad, 0xa4, 0xfa, 0xf2, 0x0f, 0xdb, 0x7e, 0x31, 0x35, 0x04, 0x73, 0x42, 0x74, 0x30, 0x7a, 0xd1, 0x1a, 0x81, 0xf8, 0x3f, 0x54, 0x84, 0x1a, 0x98, 0x4f, 0xc1, 0x16, 0xc6, 0x9e, 0x91, 0xb4, 0x04, 0xdc, 0x30, 0x0e, 0x95, 0x92, 0x13, 0x93, 0xb5, 0x5a, 0x7c, 0x52, 0xd0, 0x45, 0x4b, 0x76, 0xf2, 0x7b, 0x17, 0x0c, 0x7f, 0x21, 0x7d, 0x0d, 0x24, 0x80, 0xb8, 0x98, 0x0d, 0x63, 0x72, 0x7f, 0x58, 0xc0, 0xda, 0x05, 0xca, 0x9b, 0xf7, 0xe6, 0xc1, 0x28, 0x3c, 0x98, 0x6a, 0x30, 0x5c, 0xd1, 0x34, 0xb5, 0x60, 0x49, 0x85, 0xd9, 0xf6, 0xc1, 0xab, 0xfc, 0x0c, 0x44, 0x15, 0x25, 0x9d, 0xad, 0xc3, 0xa3, 0xcb, 0x69, 0xfb, 0xf4, 0x2f, 0x7e, 0x3e, 0xe5, 0x6d, 0xcc, 0x7a, 0xfb, 0x0b, 0x93, 0x81, 0x12, 0x83, 0x36, 0xba, 0x44, 0x96, 0x3f, 0x16, 0x0c, 0xe4, 0xa2, 0x46, 0xab, 0xba, 0x46, 0x2c, 0xcb, 0x2b, 0xc1, 0x8f, 0x63, 0x62, 0x64, 0x12, 0xda, 0x36, 0x77, 0x67, 0x6f, 0xff, 0xc5, 0xc0, 0xd8, 0xa8, 0x5c, 0x86, 0x29, 0x06, 0x8e, 0x4e, 0xf8, 0x68, 0x3b, 0x09, 0xbf, 0x70, 0x53, 0x7a, 0x81, 0x21, 0x96, 0xee, 0xb1, 0x38, 0x9e, 0x27, 0x4f, 0xc0, 0x20, 0x99, 0x54, 0xe1, 0x6f, 0xd9, 0x50, 0xf9, 0x41, 0x52, 0x52, 0xee, 0xb6, 0x3a, 0x08, 0xc2, 0x96, 0xc4, 0x27, 0x67, 0xda, 0x97, 0x0d, 0xd5, 0x6f, 0x80, 0xa6, 0x5b, 0x36, 0x63, 0x8c, 0x32, 0x4f, 0x78, 0x72, 0x58, 0x97, 0xb3, 0xc2, 0x9b, 0x6f, 0x84, 0x85, 0xf4, 0xc0, 0xc1, 0x84, 0x17, 0x3c, 0xe1, 0xac, 0x48, 0xe6, 0x6a, 0xb7, 0x70, 0xd4, 0xac, 0x09, 0x70, 0x33, 0xb0, 0xd8, 0xb5, 0x8d, 0x6c, 0x90, 0x0d, 0x47, 0x38, 0x76, 0xb9, 0x6e, 0x86, 0x8b, 0xc3, 0xb3, 0xcd, 0xb3, 0x92, 0xb3, 0xc6, 0x16, 0xbb, 0x7c, 0xdb, 0xc7, 0x1a, 0x4d, 0xdd, 0xa4, 0x22, 0x9e, 0xf5, 0x7d, 0x71, 0x60, 0xdd, 0x78, 0xa7, 0x86, 0x4f, 0xb3, 0x79, 0xc4, 0xbe, 0x2c, 0x01, 0x97, 0x45, 0xde, 0x58, 0x85, 0xdd, 0x2d, 0x67, 0xa6, 0xd2, 0x84, 0xfa, 0x63, 0x78, 0x3d, 0x16, 0x7e, 0x1a, 0xc1, 0x8d, 0x53, 0x33, 0xf0, 0xcf, 0x5d, 0xe0, 0xc3, 0x03, 0xfb, 0x96, 0x2f, 0x57, 0x74, 0x10, 0x4d, 0x94, 0x39, 0x8c, 0xb9, 0xf5, 0x6b, 0x37, 0x38, 0x39, 0x9d, 0xe6, 0x9d, 0xf7, 0xdb, 0x06, 0xed, 0x32, 0xeb, 0xd6, 0xc1, 0x2d, 0xd2, 0xd4, 0xec, 0x80, 0x9b, 0x74, 0x5e, 0x6c, 0x53, 0x18, 0x48, 0x6c, 0x58, 0x3d, 0x81, 0x0c, 0xd4, 0xf2, 0x29, 0xfe, 0x84, 0x8f, 0x8c, 0x6b, 0xbe, 0xa3, 0x48, 0x87, 0xb2, 0x2e, 0xb3, 0x68, 0xf0, 0x11, 0x77, 0x18, 0x2a, 0xc2, 0x7f, 0xe9, 0x3b, 0x44, 0x17, 0x08, 0x69, 0x57, 0x4e, 0x55, 0xe7, 0xec, 0x9f, 0x72, 0x9e, 0xdb, 0xd1, 0x1a, 0x2e, 0xd8, 0x1c, 0xb5, 0x2f, 0xa4, 0x8d, 0x29, 0xbc, 0x80, 0xac, 0xf2, 0x32, 0xe7, 0x5b, 0x75, 0x35, 0x7c, 0x01, 0x91, 0xf4, 0x42, 0xe8, 0x78, 0xae, 0x0b, 0xe4, 0xbd, 0x76, 0x33, 0x36, 0xae, 0x33, 0x8d, 0xaf, 0xe3, 0xea, 0x9e, 0x19, 0x17, 0x40, 0x09, 0xd2, 0x37, 0x3a, 0x4b, 0xba, 0xb9, 0x48, 0xa8, 0x4f, 0x2f, 0x82, 0x65, 0x17, 0x1c, 0x31, 0x38, 0x3f, 0x06, 0x91, 0xfd, 0x81, 0xcc, 0xd5, 0xaa, 0x4b, 0x3a, 0x6c, 0x85, 0x1d, 0xdb, 0x83, 0x95, 0x32, 0x0e, 0xcb, 0x56, 0x64, 0x5c, 0x7c, 0xb1, 0x4a, 0x09, 0x9a, 0x2a, 0xa3, 0xe9, 0x77, 0x5c, 0xf7, 0x75, 0x79, 0xa2, 0x7b, 0x1e, 0x1d, 0x18, 0x36, 0xe2, 0x3c, 0xc2, 0x62, 0x1c, 0x8d, 0x0a, 0x15, 0xa0, 0x6c, 0x70, 0x20, 0x07, 0xd9, 0x7d, 0x37, 0x48, 0xc4, 0xf8, 0x53, 0x89, 0x88, 0x5d, 0x55, 0x34, 0xb5, 0x8b, 0xec, 0x4c, 0x12, 0xbd, 0xb8, 0x02, 0xe2, 0xbb, 0xb0, 0x83, 0x67, 0x52, 0xc1, 0x15, 0xa5, 0x01, 0xb7, 0x62, 0x68, 0xf5, 0x61, 0x13, 0x88, 0x38, 0xf0, 0xa1, 0x6c, 0x25, 0xa1, 0x68, 0xcd, 0x1f, 0x9c, 0xfe, 0xbc, 0x82, 0x1b, 0xc2, 0xe7, 0xda, 0xce, 0xb8, 0x18, 0x53, 0x7f, 0x94, 0xfe, 0x71, 0xf2, 0x14, 0x30, 0x01, 0x0f, 0x93, 0x6f, 0x50, 0x42, 0xdc, 0x2b, 0x9a, 0x23, 0x3c, 0x49, 0xc5, 0x52, 0xdb, 0x24, 0x4f, 0xa5, 0x4b, 0xd2, 0x86, 0x86, 0x62, 0xa8, 0xf7, 0x96, 0x45, 0x00, 0x28, 0x97, 0xc6, 0x39, 0x8a, 0x88, 0xf0, 0x00, 0xa9, 0x11, 0xdf, 0xce, 0xa6, 0x22, 0xd6, 0xb2, 0xe7, 0xd8, 0x8b, 0x51, 0x0d, 0xa0, 0xc5, 0x2b, 0x26, 0x9e, 0x29, 0x20, 0x24, 0x50, 0x51, 0x32, 0x8f, 0x6e, 0x1f, 0x8c, 0x76, 0x15, 0x51, 0xc4, 0xab, 0x25, 0x55, 0x5d, 0x30, 0xe8, 0x5e, 0x90, 0xec, 0xf4, 0xb7, 0x4b, 0xa2, 0x52, 0x58, 0x7b, 0x24, 0xdf, 0xb7, 0x87, 0xc4, 0xf3, 0xe0, 0x1c, 0x0c, 0x41, 0xc8, 0x30, 0xaf, 0xfe, 0xde, 0x41, 0xbe, 0x46, 0xe4, 0xde, 0x1f, 0xbb, 0xfd, 0x69, 0x3c, 0x6f, 0x07, 0x1b, 0xf8, 0x04, 0x2a, 0x48, 0xe7, 0x11, 0xb1, 0xe5, 0xbe, 0xc8, 0x19, 0x47, 0x08, 0xd6, 0x68, 0x2d, 0x1b, 0x8b, 0xc1, 0x01, 0x4b, 0x3b, 0x34, 0x5b, 0x5d, 0xe4, 0xda, 0xc7, 0x3f, 0x10, 0x22, 0xc8, 0xf6, 0xfd, 0x66, 0x1d, 0xd7, 0xfc, 0xc2, 0x42, 0xfa, 0x17, 0x25, 0x3a, 0xec, 0xf6, 0xa8, 0x8c, 0xa4, 0x04, 0x1f, 0x8c, 0xb8, 0xcd, 0xee, 0xdb, 0xd1, 0xaa, 0x1f, 0x31, 0x5d, 0xa1, 0xb1, 0x5a, 0x83, 0x87, 0x32, 0x7f, 0x5c, 0x67, 0x90, 0xa7, 0x60, 0x28, 0x2c, 0x7d, 0x1e, 0x69, 0x30, 0x54, 0x31, 0xb0, 0x23, 0x68, 0x6f, 0xc4, 0xba, 0x67, 0x63, 0x57, 0xf1, 0x30, 0xfe, 0xe8, 0x5b, 0xda, 0x89, 0xe8, 0xb6, 0xf8, 0xde, 0x1c, 0xc3, 0x1b, 0xd8, 0x42, 0x55, 0x99, 0x08, 0xf7, 0xa7, 0x8d, 0xa9, 0xd8, 0xf2, 0x1f, 0xd6, 0xe8, 0x3f, 0x06, 0xfb, 0x32, 0x7a, 0x4b, 0x8a, 0xaf, 0xc9, 0x4f, 0xef, 0x69, 0x1c, 0x0f, 0xc5, 0xe1, 0x04, 0xa7, 0x4a, 0xae, 0xc8, 0x15, 0x10, 0x68, 0xb6, 0x40, 0xf6, 0xc4, 0xb7, 0x39, 0x57, 0x00, 0x26, 0xc0, 0x81, 0x82, 0xe2, 0x0a, 0x69, 0xbc, 0xa2, 0xc1, 0x9d, 0x52, 0x89, 0x4d, 0x79, 0x7f, 0xfb, 0x52, 0x9e, 0xb5, 0xae, 0x79, 0xa0, 0x83, 0x04, 0x74, 0xff, 0xbc, 0x98, 0x3c, 0x59, 0xd6, 0x16, 0x9d, 0xdd, 0x90, 0x51, 0xf5, 0x03, 0xd7, 0x8f, 0x39, 0x7a, 0xeb, 0x27, 0x38, 0x62, 0xbe, 0x4f, 0x24, 0xbc, 0x9d, 0x2f, 0x4e, 0x1f, 0x11, 0x3a, 0x31, 0xac, 0x08, 0xbd, 0xb2, 0x44, 0x30, 0xb8, 0xa6, 0xf8, 0xa4, 0xee, 0x95, 0xc0, 0xca, 0x38, 0xbd, 0x70, 0x7b, 0x1e, 0x5a, 0xe9, 0x65, 0xa8, 0x25, 0x8c, 0xae, 0x72, 0x1b, 0xf5, 0xda, 0xff, 0x7f, 0xe5, 0xef, 0x4f, 0x22, 0x7f, 0xd7, 0xb4, 0xe2, 0xb8, 0x05, 0xe1, 0x71, 0x09, 0x5c, 0x44, 0x58, 0x66, 0x4c, 0x96, 0x3b, 0x74, 0x3e, 0xb0, 0x5e, 0xf7, 0x32, 0xa0, 0x68, 0x89, 0xa6, 0xfc, 0x67, 0x92, 0xba, 0x76, 0x15, 0x74, 0x93, 0xb1, 0x5a, 0x06, 0xfd, 0x53, 0x11, 0x44, 0x54, 0x5c, 0x0f, 0x45, 0xa4, 0xb6, 0x61, 0x6d, 0x0f, 0x0c, 0xd6, 0xe3, 0x6f, 0xe0, 0xbe, 0x45, 0x3d, 0xd8, 0xf0, 0x9b, 0xb2, 0x59, 0x12, 0x8a, 0x2b, 0x57, 0x14, 0xcb, 0xd2, 0x6c, 0xfe, 0xdb, 0x7b, 0x27, 0xec, 0xf3, 0xcc, 0xa6, 0x56, 0x3a, 0xa1, 0x67, 0x95, 0x3a, 0xae, 0x5b, 0xa3, 0x90, 0x67, 0x3c, 0x23, 0xe8, 0x1c, 0x21, 0xa1, 0x29, 0x69, 0x50, 0x1a, 0xed, 0xcd, 0x53, 0xbf, 0x34, 0x99, 0x4e, 0xf6, 0x59, 0x0c, 0x8f, 0xa2, 0x45, 0xbc, 0x67, 0xa4, 0xe2, 0x37, 0x38, 0xa2, 0xd2, 0xeb, 0xd0, 0x06, 0x62, 0x43, 0xf5, 0x4a, 0xb9, 0x13, 0x41, 0x74, 0x56, 0x36, 0x31, 0xdc, 0xb9, 0x76, 0x78, 0x35, 0x5f, 0xab, 0x99, 0xcb, 0xf4, 0x27, 0xb4, 0x0a, 0xc5, 0x52, 0xa0, 0x40, 0x74, 0x92, 0x3b, 0xa4, 0xef, 0x6e, 0xfe, 0x96, 0xa2, 0xf2, 0xd5, 0x28, 0xec, 0x55, 0x2d, 0xde, 0xd0, 0xd9, 0x4e, 0xb2, 0xee, 0xf3, 0xeb, 0x5b, 0xb1, 0xac, 0xf7, 0xcf, 0xc9, 0x47, 0xbb, 0x07, 0xdc, 0x24, 0x26, 0x02, 0x78, 0xe4, 0x64, 0x0c, 0x4d, 0xce, 0xb2, 0x40, 0x99, 0x71, 0x70, 0x4c, 0xe3, 0x8b, 0x77, 0x74, 0xec, 0x2a, 0xae, 0xda, 0xe3, 0x11, 0xd8, 0xfc, 0xd8, 0x5d, 0xb0, 0x7e, 0x73, 0x69, 0x38, 0x2a, 0xe6, 0xee, 0x4e, 0x35, 0x20, 0x6f, 0x80, 0xc3, 0x43, 0xd4, 0x21, 0xae, 0x59, 0x55, 0x9c, 0x83, 0x43, 0x99, 0x09, 0xce, 0xf1, 0x1f, 0xfe, 0x98, 0xd9, 0xde, 0xa8, 0x2d, 0xa1, 0x28, 0x1a, 0x23, 0x1f, 0xd4, 0xe4, 0x97, 0x84, 0x9c, 0xe8, 0xba, 0xd4, 0xc4, 0x69, 0x8d, 0x9a, 0xfd, 0x65, 0xe8, 0xd9, 0x88, 0x25, 0xc1, 0x45, 0x9e, 0x12, 0xab, 0xb3, 0x10, 0xca, 0x9d, 0xcf, 0x2b, 0x73, 0xf5, 0x0d, 0xde, 0x50, 0xbc, 0xe2, 0x1f, 0x91, 0x2c, 0x33, 0x8a, 0x70, 0x6f, 0x0e, 0x4b, 0x79, 0xaa, 0x98, 0x3f, 0x29, 0x3a, 0x46, 0x56, 0xbb, 0x3e, 0x50, 0x3c, 0x3f, 0x55, 0x63, 0x38, 0xec, 0xa9, 0x97, 0x54, 0xb7, 0x2c, 0xa0, 0xbe, 0x25, 0x21, 0x48, 0x6e, 0x5d, 0xdf, 0x1d, 0x09, 0x81, 0xd1, 0x66, 0x05, 0x3e, 0xc2, 0x5c, 0x0f, 0xa2, 0x57, 0x97, 0xa9, 0x2e, 0xdd, 0xc7, 0x18, 0x2d, 0x45, 0xa4, 0x7d, 0x44, 0x6d, 0x28, 0x42, 0x49, 0xa2, 0xfb, 0xb7, 0x58, 0x62, 0x2f, 0xfd, 0x24, 0x66, 0x2d, 0x24, 0x8c, 0xe0, 0xef, 0x90, 0x6f, 0x01, 0x70, 0xa1, 0xc0, 0xbe, 0x61, 0x93, 0xdd, 0xd4, 0x1e, 0xa2, 0x1c, 0x09, 0xe0, 0x72, 0xa7, 0xb5, 0x34, 0xaf, 0x8b, 0x82, 0xac, 0xf0, 0x0b, 0x70, 0xd4, 0xe2, 0x3a, 0x1c, 0x67, 0xa2, 0xc9, 0x41, 0xc3, 0x6a, 0x1d, 0x7f, 0x9b, 0x70, 0xa4, 0x5b, 0xec, 0x0b, 0x6a, 0x88, 0x32, 0x18, 0xe7, 0x65, 0xdb, 0x9c, 0x1c, 0xc6, 0xfc, 0xab, 0xde, 0xf7, 0x43, 0x88, 0x71, 0xfe, 0x2d, 0x0d, 0x58, 0x21, 0x78, 0x4d, 0x6c, 0xa8, 0xdc, 0x79, 0x2c, 0xe4, 0xf6, 0x00, 0x54, 0x70, 0x85, 0xfa, 0xb1, 0xb7, 0xd8, 0xc7, 0x33, 0xb6, 0x87, 0xf3, 0x44, 0x04, 0x62, 0x5d, 0x58, 0x0f, 0xa7, 0x99, 0xc5, 0xa8, 0x78, 0x92, 0xd6, 0xc2, 0x8b, 0x74, 0x1a, 0x76, 0x24, 0xc9, 0x02, 0x4b, 0x40, 0xe2, 0xab, 0xb5, 0x13, 0x78, 0xf9, 0xdb, 0xb5, 0x93, 0xe5, 0x9d, 0x19, 0xab, 0x18, 0xd6, 0x3e, 0x0d, 0xb8, 0xde, 0xa9, 0x81, 0x82, 0x54, 0x12, 0x2a, 0x19, 0x1a, 0x5e, 0xad, 0x9d, 0xa0, 0xcd, 0x96, 0x80, 0x66, 0x75, 0xf7, 0x95, 0xbc, 0xef, 0x51, 0x6a, 0xcd, 0x50, 0xb8, 0xd8, 0xdb, 0x5a, 0x33, 0xd8, 0xcc, 0xf4, 0x62, 0x98, 0xe6, 0xd8, 0x63, 0xcf, 0xd7, 0x8c, 0xf5, 0x4d, 0xf8, 0x93, 0xde, 0xd6, 0xd2, 0xe4, 0x8b, 0x30, 0xe2, 0x9b, 0xf7, 0x7b, 0x99, 0xef, 0xce, 0xc1, 0xa7, 0x64, 0xd1, 0xce, 0x79, 0x41, 0x7c, 0x42, 0x00, 0x45, 0xe6, 0xe4, 0xb5, 0x96, 0xea, 0x39, 0xda, 0xfa, 0x84, 0x56, 0x02, 0x49, 0x7d, 0xf2, 0xd3, 0x23, 0x4b, 0xbf, 0x0b, 0xde, 0x33, 0xfb, 0xc1, 0xc2, 0xb0, 0x41, 0xee, 0x79, 0x18, 0xa6, 0x2b, 0xc1, 0x7d, 0x01, 0xbc, 0x64, 0xd1, 0x8a, 0xce, 0x6a, 0x4e, 0xa7, 0xfd, 0x8d, 0x15, 0x02, 0x19, 0xed, 0x16, 0xdf ],
+const [ 0xe0, 0x22, 0x1d, 0x19, 0xcf, 0x61, 0x7e, 0xd8, 0x27, 0xd8, 0xd8, 0xcb, 0x8d, 0x2c, 0x8e, 0xd8, 0x1b, 0x9b, 0x33, 0x54, 0xa8, 0x32, 0xf1, 0xd1, 0x4a, 0x40, 0x2b, 0x37, 0x1a, 0x0a, 0x61, 0x17, 0x37, 0xc0, 0x54, 0x3b, 0x0e, 0xb0, 0x6b, 0x82, 0xd8, 0xba, 0x56, 0xeb, 0x63, 0x04, 0xf1, 0xef, 0x16, 0xef, 0x6b, 0x14, 0x30, 0x49, 0xa7, 0xbf, 0x50, 0xc4, 0xe2, 0x49, 0x3a, 0xa6, 0x97, 0x56, 0xd8, 0xc3, 0x9f, 0x62, 0x7f, 0xa8, 0x9d, 0x9d, 0x74, 0x1a, 0x99, 0xf9, 0xaf, 0xbf, 0xeb, 0x81, 0xde, 0x1a, 0x5b, 0xec, 0xad, 0xbd, 0x86, 0x72, 0x45, 0xb9, 0x84, 0xde, 0x12, 0x5a, 0xc7, 0xe5, 0xca, 0x11, 0x46, 0xb6, 0xab, 0xb2, 0xdb, 0xd2, 0x04, 0xdf, 0xea, 0x1e, 0xf6, 0xc4, 0x44, 0x36, 0x7c, 0x06, 0x4b, 0x05, 0xa9, 0xf5, 0x56, 0x93, 0x31, 0x09, 0x57, 0x1d, 0x2b, 0x8c, 0xbb, 0x6b, 0x15, 0x94, 0x91, 0x5e, 0x19, 0x34, 0xef, 0xc9, 0x8e, 0xf3, 0x91, 0x81, 0xc2, 0x7d, 0xc4, 0xb8, 0xf7, 0x99, 0x82, 0x86, 0xab, 0x5b, 0xdf, 0xc9, 0x1d, 0x9b, 0xa4, 0x2f, 0x0c, 0xa6, 0x39, 0x91, 0xc2, 0x32, 0xc8, 0x83, 0x51, 0x98, 0x9f, 0x29, 0x1d, 0x3d, 0xd6, 0x4c, 0x9a, 0x51, 0x32, 0xac, 0x57, 0xbd, 0x4a, 0x98, 0x3c, 0x56, 0xe8, 0xbd, 0x10, 0x57, 0xb2, 0x3c, 0x3d, 0x0e, 0x0a, 0xff, 0xd8, 0xd5, 0x32, 0x4c, 0xdc, 0x44, 0xb4, 0x9a, 0xb6, 0xa5, 0x01, 0xa4, 0x07, 0xa8, 0x58, 0xbd, 0xa5, 0x59, 0xe9, 0x63, 0xe3, 0x4e, 0x3b, 0x16, 0x12, 0x25, 0xcb, 0x6b, 0x47, 0x2e, 0xf6, 0x5c, 0x5f, 0x64, 0x18, 0xe2, 0x41, 0xa2, 0xf6, 0xc6, 0x63, 0x13, 0x59, 0xb3, 0x90, 0xeb, 0xfc, 0x91, 0xe8, 0x54, 0xa8, 0x0e, 0x28, 0xab, 0x9e, 0x7d, 0x2b, 0xed, 0x35, 0xe4, 0xb1, 0x6c, 0xc4, 0x50, 0x60, 0xc7, 0xc2, 0x6c, 0x08, 0x18, 0x2c, 0x52, 0x2b, 0x6f, 0x27, 0xa1, 0xbd, 0x80, 0xe7, 0xd0, 0x28, 0x98, 0xcf, 0xc2, 0x93, 0xd6, 0xda, 0x9a, 0x64, 0x97, 0x39, 0xd0, 0x03, 0x32, 0x3e, 0x85, 0xe1, 0xe6, 0x78, 0x13, 0xba, 0x10, 0x20, 0xe9, 0x17, 0xa1, 0xb3, 0x96, 0x16, 0xd0, 0xe1, 0x23, 0x6d, 0x0c, 0xa6, 0xa6, 0xad, 0x35, 0xb7, 0x14, 0xc4, 0x0b, 0x1f, 0x57, 0xc6, 0xe7, 0x2a, 0xa0, 0xed, 0xa9, 0x82, 0xff, 0xde, 0xf1, 0x98, 0x31, 0x2d, 0x92, 0x45, 0xb9, 0x24, 0x43, 0xb2, 0x32, 0xc0, 0x98, 0x75, 0xe3, 0xfd, 0x31, 0xfc, 0x94, 0x53, 0x32, 0x2f, 0xa0, 0x81, 0xf2, 0x51, 0x4c, 0x89, 0xf8, 0x27, 0x57, 0xfc, 0x23, 0x5d, 0xd2, 0x77, 0x28, 0x25, 0x32, 0x6e, 0x42, 0x21, 0xa4, 0x28, 0x24, 0x83, 0xa0, 0x0b, 0x33, 0x73, 0xc1, 0x1a, 0xf2, 0xb1, 0xd4, 0xbc, 0xbd, 0x7b, 0x2f, 0xbf, 0xbb, 0xb1, 0x44, 0x9c, 0x0e, 0x37, 0x75, 0xfd, 0x4c, 0x9b, 0x2a, 0x7c, 0x33, 0xf7, 0x21, 0xae, 0x98, 0x19, 0x06, 0x60, 0xa1, 0xe2, 0x44, 0x20, 0x34, 0xec, 0x1a, 0x00, 0xaf, 0x6f, 0xf1, 0x96, 0xda, 0x66, 0xed, 0x47, 0x1a, 0xed, 0xc2, 0xc6, 0xe7, 0xee, 0xc9, 0xd7, 0x7f, 0xfc, 0x53, 0x59, 0xdc, 0x7f, 0x3d, 0x83, 0xe4, 0x12, 0xc4, 0x6e, 0xe1, 0x29, 0x9b, 0xd3, 0x30, 0xf7, 0x3b, 0x17, 0x3d, 0x8f, 0x7b, 0x84, 0xaf, 0x49, 0x60, 0xda, 0xdf, 0x67, 0x36, 0x06, 0x8f, 0xf8, 0xdf, 0x31, 0xd9, 0xfd, 0x6c, 0xfc, 0x65, 0xcb, 0xea, 0x0a, 0xdf, 0xb0, 0x7e, 0xc0, 0xa8, 0xd9, 0xb5, 0x48, 0xcc, 0x73, 0x15, 0xdc, 0x35, 0x11, 0xf8, 0x41, 0x1e, 0x4e, 0x9a, 0x91, 0xca, 0xb3, 0x70, 0x3e, 0x75, 0xdb, 0xbb, 0x54, 0x8b, 0xd4, 0x5e, 0xfe, 0x18, 0xc9, 0xec, 0x4c, 0x7f, 0xde, 0x06, 0x33, 0x70, 0x5c, 0xe4, 0xd6, 0x14, 0x0e, 0x31, 0x03, 0x8a, 0xeb, 0x1c, 0x01, 0x97, 0xf4, 0xac, 0x89, 0x99, 0x60, 0x53, 0x12, 0xbd, 0xf7, 0xc7, 0x52, 0x72, 0xbc, 0x0d, 0x01, 0x1e, 0xce, 0xd6, 0xe0, 0x0f, 0x90, 0x0f, 0xfa, 0xb4, 0x08, 0xb4, 0x29, 0x0d, 0x85, 0xe5, 0xdd, 0x60, 0x85, 0x3b, 0x19, 0x2e, 0xd5, 0x5c, 0xbe, 0x65, 0xfa, 0xcd, 0x0c, 0xd7, 0xd0, 0x08, 0x66, 0xeb, 0x71, 0xcf, 0x55, 0x92, 0x58, 0xbf, 0xd0, 0x7d, 0xc7, 0x28, 0xbb, 0x8e, 0x65, 0x1c, 0xad, 0x8c, 0x2c, 0xc6, 0xf6, 0x1a, 0x82, 0xfd, 0xe1, 0xea, 0xa6, 0x19, 0x36, 0x2e, 0x4e, 0x06, 0x03, 0x4f, 0x8f, 0x97, 0x9c, 0xe2, 0xfc, 0x1c, 0xe1, 0xd8, 0x12, 0x36, 0xbf, 0xf4, 0xd4, 0xea, 0xfa, 0x83, 0xb2, 0xf5, 0x29, 0x47, 0xaf, 0x5f, 0x02, 0xb4, 0xc3, 0x53, 0xd7, 0x5f, 0x7e, 0x2e, 0x61, 0xb3, 0xef, 0xd6, 0xbd, 0xe5, 0xc4, 0x4d, 0xb4, 0x2b, 0xb2, 0x86, 0x3f, 0x29, 0x18, 0x77, 0x4a, 0xac, 0xdf, 0x6f, 0xb9, 0x9b, 0xa4, 0xaa, 0xa9, 0x2b, 0x19, 0x23, 0xf8, 0x51, 0xa8, 0xa9, 0x07, 0x7d, 0x5a, 0x35, 0xbe, 0x85, 0xf8, 0x7b, 0xd1, 0xdf, 0x70, 0xbf, 0x42, 0x14, 0x79, 0xea, 0x28, 0x71, 0x7a, 0xdd, 0xae, 0x00, 0xa8, 0x05, 0x5e, 0xb7, 0x6f, 0x2f, 0xa0, 0xee, 0x14, 0x9e, 0x7d, 0x17, 0x98, 0x5b, 0xa9, 0xa9, 0xdf, 0xcd, 0xc1, 0x5d, 0x12, 0x89, 0xd1, 0x9d, 0x41, 0x6b, 0x19, 0x39, 0x4d, 0xe6, 0x11, 0x5d, 0x05, 0x98, 0xaa, 0xc0, 0x8f, 0x22, 0xd7, 0x1d, 0x0a, 0x36, 0x4c, 0xe7, 0x71, 0xf2, 0x85, 0x39, 0xc2, 0x6c, 0x0b, 0x0c, 0x60, 0x8e, 0xf3, 0xac, 0xb6, 0x24, 0xa7, 0x6d, 0x1e, 0x33, 0xe9, 0x99, 0x01, 0x8c, 0x14, 0xae, 0x3f, 0xa2, 0xa5, 0xc6, 0xd1, 0x99, 0xfb, 0x57, 0xad, 0x9f, 0x5b, 0x1c, 0xe9, 0x7f, 0x37, 0x53, 0x24, 0x73, 0xb0, 0x29, 0x22, 0x3a, 0x59, 0x73, 0xb6, 0x6b, 0x3e, 0x9e, 0xe5, 0x09, 0x25, 0xe9, 0x48, 0x57, 0x13, 0xd1, 0xb2, 0xee, 0x12, 0xcd, 0x13, 0x0c, 0x32, 0x3c, 0x9c, 0x2f, 0xce, 0x9c, 0x24, 0xe3, 0x10, 0xfc, 0xcb, 0xd8, 0xb7, 0xb4, 0xdd, 0x37, 0x18, 0x53, 0xf9, 0x36, 0x63, 0xd9, 0x72, 0xeb, 0x28, 0x27, 0xf5, 0x5d, 0x1a, 0xb3, 0x6c, 0xe1, 0x12, 0x80, 0x23, 0xa4, 0x57, 0x4e, 0x29, 0x84, 0x1c, 0x0e, 0xfa, 0x24, 0x4a, 0x98, 0x5a, 0x3f, 0x80, 0xa0, 0x84, 0x3c, 0x58, 0xe6, 0x84, 0x03, 0xed, 0xae, 0xe2, 0x10, 0x9a, 0x70, 0x80, 0xc5, 0x04, 0xd0, 0xc5, 0x05, 0x5a, 0xd0, 0xfb, 0xfe, 0xdb, 0x45, 0xf6, 0x46, 0x99, 0x88, 0xf7, 0x2a, 0x7d, 0x6d, 0xd0, 0x43, 0x8c, 0x79, 0x48, 0x4a, 0x68, 0x4f, 0xc0, 0x2c, 0x1a, 0x6c, 0x17, 0x61, 0x0e, 0x14, 0xcc, 0x7a, 0x5f, 0x8c, 0x62, 0xfa, 0x56, 0x8a, 0x09, 0x67, 0x2d, 0xea, 0x7a, 0xa1, 0x18, 0xa2, 0x23, 0x72, 0x86, 0xf8, 0x84, 0x65, 0xa3, 0xf3, 0xd9, 0xdc, 0x22, 0x0f, 0xf9, 0x5d, 0x3b, 0x34, 0x7e, 0x2d, 0xef, 0xe9, 0x26, 0x20, 0x93, 0xc6, 0x79, 0xaf, 0x8c, 0x27, 0xac, 0x4b, 0x58, 0x28, 0xc6, 0xf1, 0xce, 0xcd, 0x01, 0xff, 0xa6, 0x80, 0x73, 0x46, 0x3b, 0xc1, 0xed, 0x60, 0x90, 0x19, 0x24, 0x43, 0x91, 0x4f, 0x0e, 0x17, 0x9c, 0xdf, 0x8f, 0x45, 0x40, 0xa8, 0x55, 0xd1, 0x45, 0xe5, 0x01, 0xe9, 0xec, 0x5e, 0x87, 0xbe, 0x77, 0xe0, 0xd7, 0x92, 0xec, 0xea, 0xbd, 0x12, 0x17, 0xa9, 0x05, 0xe7, 0xce, 0x26, 0xe4, 0x88, 0x79, 0xbf, 0x93, 0x52, 0xd1, 0xd4, 0x3d, 0xda, 0xe7, 0xc2, 0x1b, 0x82, 0x68, 0x15, 0xde, 0x4a, 0x20, 0xf9, 0x4d, 0xe9, 0xbe, 0xf2, 0x2f, 0x1d, 0xd7, 0xcd, 0x6b, 0x3f, 0x2d, 0xd7, 0x6e, 0x1a, 0x30, 0x4c, 0xcd, 0xfd, 0xc5, 0x12, 0x2b, 0x0f, 0x47, 0xa7, 0x5e, 0xe3, 0xcb, 0x59, 0xcd, 0x4c, 0xa9, 0xb5, 0x1c, 0x73, 0x38, 0x41, 0x0c, 0x26, 0xd8, 0x6e, 0x9c, 0x73, 0x36, 0xc8, 0x75, 0x76, 0xcb, 0x70, 0x84, 0x6f, 0xa6, 0xcc, 0xe9, 0x17, 0x6c, 0x7d, 0x10, 0x35, 0x9d, 0x91, 0x1d, 0x6c, 0x18, 0xfa, 0x8e, 0x57, 0xe2, 0x3f, 0x1b, 0xd8, 0x23, 0x72, 0xe1, 0xac, 0x71, 0x62, 0xc0, 0x43, 0x51, 0x11, 0x02, 0xcf, 0xfb, 0x69, 0x3d, 0x9c, 0x5e, 0x2a, 0x7a, 0x9f, 0x64, 0x27, 0x96, 0x51, 0x77, 0xb2, 0xe9, 0xbe, 0x44, 0x55, 0x26, 0xd8, 0xbf, 0xc3, 0x82, 0x12, 0x67, 0x0d, 0x19, 0x2a, 0xcb, 0x19, 0x8d, 0x46, 0x4d, 0x51, 0xf0, 0x43, 0x26, 0x98, 0xe4, 0x4a, 0xaa, 0x82, 0x00, 0xa4, 0xcd, 0xc4, 0x76, 0xcf, 0xe7, 0xe9, 0xf3, 0xd1, 0xb4, 0x47, 0xc7, 0xcc, 0x9f, 0x32, 0x46, 0xd3, 0x40, 0x6f, 0x6e, 0xfc, 0x23, 0xeb, 0xca, 0xb6, 0xcb, 0xad, 0x95, 0x5d, 0xf6, 0x0a, 0x23, 0x0c, 0x23, 0x18, 0x7d, 0xb3, 0x52, 0x65, 0x4c, 0x69, 0x0b, 0xe8, 0xf8, 0x03, 0xa1, 0x37, 0x10, 0xe5, 0xb8, 0xfb, 0xed, 0x18, 0x05, 0xa1, 0x92, 0x9d, 0x55, 0x53, 0xd7, 0x01, 0xd1, 0x27, 0xc7, 0x32, 0x80, 0x96, 0x46, 0x91, 0x0d, 0x2f, 0xf7, 0x48, 0xcb, 0x8c, 0x5c, 0xde, 0xf6, 0x86, 0x3f, 0x09, 0x3c, 0xa5, 0x51, 0xc3, 0x7b, 0xda, 0x12, 0x9f, 0xcd, 0x71, 0xf0, 0x5e, 0xc2, 0x41, 0xb3, 0xbd, 0xec, 0x26, 0x18, 0x92, 0xa1, 0xb1, 0xbc, 0x17, 0xfc, 0x1d, 0x3c, 0x86, 0x25, 0x85, 0x9b, 0xe6, 0xd2, 0x55, 0xe4, 0x24, 0x0e, 0xff, 0x10, 0x65, 0x3a, 0xef, 0x29, 0x9b, 0x51, 0xc0, 0xb0, 0x56, 0x70, 0xb0, 0x3d, 0xde, 0x95, 0x51, 0x65, 0x7e, 0xa6, 0x82, 0xe0, 0x22, 0xb6, 0x9e, 0xeb, 0x25, 0x85, 0xf3, 0xec, 0x64, 0x45, 0x76, 0x55, 0x97, 0xa4, 0xb4, 0xca, 0xe1, 0x06, 0x0c, 0x86, 0xa5, 0x12, 0x1c, 0xfb, 0x9c, 0x71, 0x79, 0xb8, 0x24, 0xd2, 0xa3, 0x90, 0xdb, 0x32, 0x38, 0xf9, 0x6d, 0x5a, 0x67, 0xb2, 0xaa, 0xa9, 0xa8, 0xa9, 0xdc, 0x13, 0xaa, 0x1b, 0x57, 0x6a, 0x8d, 0xfd, 0x51, 0xdc, 0x52, 0x9b, 0xf4, 0xbe, 0x90, 0x7f, 0xb2, 0x88, 0x68, 0x94, 0xd9, 0x20, 0xba, 0x8b, 0x67, 0x5b, 0x99, 0x7e, 0x1f, 0xc1, 0xfd, 0xd3, 0xdc, 0x90, 0xb8, 0x64, 0x26, 0x04, 0xac, 0xdc, 0x03, 0xd6, 0x3a, 0x64, 0x0f, 0x02, 0xfe, 0x80, 0xcf, 0xce, 0xb9, 0x33, 0x43, 0x08, 0x8e, 0x6a, 0xba, 0x8f, 0x72, 0x98, 0xea, 0x15, 0xde, 0x9d, 0x40, 0x22, 0xc6, 0xec, 0x75, 0x5c, 0xcf, 0xed, 0x62, 0x07, 0xbd, 0xa0, 0x15, 0xc8, 0x2a, 0x84, 0x24, 0xae, 0x7e, 0xb7, 0x41, 0x72, 0x1b, 0x5e, 0x0f, 0xfe, 0xd8, 0x47, 0x35, 0x2d, 0xb1, 0xcd, 0xb0, 0xd2, 0xbd, 0xfc, 0x6d, 0xfb, 0x60, 0xf6, 0x17, 0x77, 0xc1, 0x95, 0x2e, 0x95, 0x7e, 0x52, 0x59, 0x2f, 0x9f, 0x66, 0xfd, 0xe7, 0xc9, 0x2f, 0x0e, 0xb1, 0xb4, 0xd4, 0x25, 0x92, 0xdf, 0x2c, 0xd3, 0xa7, 0x83, 0xdc, 0x36, 0x68, 0xc5, 0xc0, 0xc9, 0x2e, 0x2f, 0x8d, 0x80, 0xf3, 0x61, 0xb4, 0x15, 0x59, 0x04, 0x89, 0x9c, 0xee, 0x00, 0xa4, 0x5e, 0xaf, 0xef, 0x87, 0xe4, 0xcb, 0xd1, 0x82, 0x52, 0xa9, 0x01, 0xd4, 0xf7, 0x2b, 0x68, 0x13, 0x21, 0x35, 0xf0, 0xce, 0x36, 0x69, 0x3b, 0x70, 0x00, 0x35, 0x96, 0x67, 0x49, 0x10, 0x28, 0x86, 0xa8, 0x00, 0x6f, 0xa8, 0x9a, 0x60, 0xee, 0x97, 0xd4, 0xe0, 0x1f, 0x2c, 0xd8, 0xcd, 0xaf, 0xb7, 0xc7, 0x93, 0xea, 0xa0, 0x76, 0x80, 0x75, 0x4f, 0xc3, 0xca, 0x3b, 0x4a, 0x2a, 0xd4, 0xa9, 0x9d, 0x93, 0xad, 0x1e, 0x7f, 0x6e, 0xd9, 0x9d, 0x32, 0x02, 0x55, 0xc6, 0x2b, 0x02, 0xd5, 0x04, 0x73, 0x62, 0x50, 0x07, 0x4d, 0x68, 0xbe, 0x75, 0x19, 0x06, 0x21, 0xdc, 0x78, 0x67, 0xc2, 0xec, 0xb1, 0xc8, 0xbd, 0xe3, 0x54, 0x89, 0xbf, 0x48, 0x1d, 0x84, 0x0f, 0xdc, 0x1a, 0x9d, 0xcb, 0xce, 0x10, 0x9a, 0x75, 0x2e, 0x1c, 0x36, 0xae, 0xa4, 0x96, 0x70, 0x40, 0x62, 0x3a, 0x29, 0x62, 0x57, 0x8a, 0xee, 0x38, 0xa5, 0x6e, 0x13, 0x9a, 0x56, 0x1e, 0x01, 0x16, 0x4a, 0x41, 0xd0, 0x38, 0x74, 0x57, 0x19, 0x08, 0x47, 0x54, 0x05, 0xd5, 0x6a, 0x8d, 0xaa, 0x31, 0xb3, 0xd8, 0x98, 0x3d, 0x53, 0xef, 0xae, 0x27, 0x4e, 0x16, 0x33, 0xf0, 0x2f, 0xfe, 0x22, 0x73, 0xf9, 0xe8, 0xc4, 0xa3, 0x60, 0x0d, 0x84, 0x14, 0x39, 0x3e, 0x00, 0xbd, 0x30, 0xc8, 0x5c, 0xfc, 0xb9, 0x9a, 0xdb, 0xda, 0x49, 0xaa, 0xb0, 0x91, 0xc5, 0x94, 0x11, 0x4b, 0x3b, 0x84, 0x8e, 0x2d, 0xd0, 0x57, 0xa1, 0x94, 0xf9, 0xfd, 0x86, 0x9e, 0xee, 0x22, 0x4c, 0xed, 0x5c, 0x0d, 0x2d, 0xa7, 0x5a, 0xc8, 0x1b, 0xc1, 0x9f, 0x81, 0x9b, 0x7e, 0xf2, 0x30, 0xd6, 0x32, 0xe1, 0x7a, 0xed, 0x4c, 0xb6, 0xd5, 0x8e, 0x93, 0xa7, 0xee, 0xc5, 0xb0, 0x4d, 0x48, 0x14, 0xed, 0x58, 0x25, 0xc5, 0x3c, 0x80, 0xa9, 0x7f, 0x7b, 0xbf, 0x3d, 0x18, 0xf6, 0xbd, 0x32, 0xaa, 0x2e, 0x8c, 0xa6, 0xe9, 0xd9, 0x95, 0xac, 0xb3, 0x29, 0xd2, 0xa7, 0xe9, 0x51, 0x3e, 0xf7, 0x7e, 0x46, 0x8a, 0xd8, 0xcd, 0xc2, 0x12, 0x86, 0x30, 0x8f, 0x0f, 0xa6, 0xce, 0x02, 0x0e, 0xe1, 0xb4, 0xc6, 0xa1, 0xd2, 0x28, 0xda, 0x54, 0x22, 0x39, 0xdd, 0xe2, 0xf1, 0x9b, 0x8a, 0xa9, 0x78, 0xb2, 0x7f, 0x5c, 0xed, 0xed, 0x42, 0xf8, 0xa7, 0x55, 0x85, 0xf9, 0x83, 0x66, 0xa9, 0xcd, 0x86, 0x1d, 0x82, 0x89, 0xc4, 0x52, 0x5a, 0xdb, 0x80, 0x48, 0x38, 0x3f, 0x94, 0x83, 0x62, 0x76, 0x14, 0xd9, 0x20, 0x35, 0x2e, 0xcc, 0xc3, 0x1a, 0x54, 0x17, 0xe6, 0xe3, 0x9e, 0x87, 0xf4, 0xe2, 0x69, 0x0c, 0xea, 0xac, 0x45, 0x10, 0x5e, 0x12, 0x0e, 0x07, 0xc1, 0x52, 0x58, 0x48, 0xe1, 0x8e, 0x10, 0x1b, 0xb1, 0x7c, 0x61, 0x13, 0x4d, 0x60, 0xd5, 0x9e, 0x39, 0x37, 0xbd, 0xda, 0xe9, 0x35, 0xd2, 0xaa, 0x87, 0x72, 0x1c, 0x0a, 0xf0, 0xe1, 0x13, 0x9f, 0x00, 0x81, 0x05, 0x92, 0x0f, 0xd7, 0xb7, 0x9f, 0xbb, 0x9b, 0x4f, 0x69, 0xe8, 0xb2, 0x71, 0x11, 0x06, 0x5c, 0xa9, 0x06, 0x93, 0xaf, 0x09, 0x1f, 0xe0, 0x44, 0x13, 0xe7, 0x17, 0x30, 0xd9, 0x38, 0x7d, 0x35, 0x62, 0x0b, 0xf5, 0x3a, 0x50, 0x8e, 0xc6, 0xf9, 0xc0, 0x77, 0x9d, 0xf8, 0x72, 0x98, 0xd6, 0xba, 0x2a, 0xb4, 0xf7, 0x36, 0x55, 0x92, 0x7d, 0x88, 0xf0, 0x4f, 0xdc, 0xe7, 0xa6, 0xf8, 0xc1, 0xd7, 0x38, 0x59, 0x9a, 0x9f, 0x22, 0x0f, 0x58, 0xfe, 0x7c, 0xe5, 0x73, 0x1a, 0x1e, 0x5d, 0x2f, 0xb9, 0x07, 0x8c, 0x1f, 0xb3, 0x00, 0x2b, 0xe7, 0xa8, 0x7c, 0xec, 0x45, 0xee, 0xc3, 0x0a, 0x53, 0xcd, 0x4f, 0x24, 0x06, 0xef, 0x76, 0x4b, 0xfb, 0x12, 0x4a, 0x5a, 0x73, 0x00, 0xbe, 0x85, 0x9c, 0xc1, 0x0a, 0x35, 0x12, 0x0f, 0x50, 0x14, 0xa5, 0x0a, 0x7f, 0x63, 0x5d, 0x2d, 0x78, 0x94, 0xbb, 0x81, 0x6f, 0x15, 0x42, 0x10, 0x94, 0x6a, 0x36, 0x9d, 0xf3, 0x7e, 0xa4, 0x92, 0x99, 0x3b, 0xa2, 0x3a, 0xf9, 0x58, 0xd8, 0x30, 0x8e, 0x72, 0x3f, 0x18, 0xc1, 0x5f, 0x29, 0x8c, 0x0c, 0xbf, 0x82, 0x59, 0x60, 0xd3, 0x55, 0xec, 0xc4, 0x93, 0x91, 0x07, 0x40, 0xfa, 0x0e, 0xb9, 0xf9, 0xa5, 0xcb, 0x8c, 0x9d, 0x9c, 0x7a, 0x00, 0x01, 0x70, 0x3e, 0x38, 0x09, 0x86, 0xb3, 0xf4, 0xc9, 0xb2, 0x2f, 0xbf, 0xe9, 0x07, 0x47, 0x6a, 0x4e, 0xee, 0x95, 0xb8, 0xf6, 0x76, 0xb9, 0x5b, 0x24, 0xeb, 0x9e, 0x1f, 0xbe, 0xaa, 0xff, 0x66, 0xf3, 0x33, 0x29, 0xd4, 0x20, 0x80, 0x02, 0x4b, 0xf5, 0x96, 0x4a, 0x1a, 0xd4, 0x59, 0x21, 0x71, 0x79, 0xa4, 0xc9, 0x19, 0xe0, 0x99, 0xae, 0x61, 0x63, 0x36, 0xa3, 0x5c, 0x24, 0x29, 0x6f, 0x49, 0xaa, 0xe6, 0x88, 0x53, 0xcf, 0xf6, 0x1e, 0x7b, 0xd9, 0x92, 0x5b, 0xd2, 0xe7, 0x70, 0xea, 0xeb, 0x8f, 0xdd, 0xb6, 0x90, 0xc5, 0x0c, 0xf4, 0xb4, 0xfe, 0xae, 0x63, 0xa9, 0x96, 0xc2, 0xd2, 0x93, 0x6f, 0xaf, 0xe4, 0x1d, 0xdc, 0x90, 0x10, 0x6a, 0xbd, 0xcf, 0xeb, 0x4f, 0xeb, 0xf5, 0xaa, 0xbf, 0xd6, 0xc0, 0xe2, 0x86, 0x6c, 0x77, 0x93, 0x3a, 0x3d, 0x7a, 0x65, 0x6f, 0xdd, 0x1d, 0x31, 0x2b, 0x8a, 0xb6, 0xc3, 0x9a, 0x0f, 0xf5, 0xdf, 0x02, 0xe8, 0x74, 0x81, 0xf8, 0xa7, 0x8f, 0x69, 0xd5, 0x97, 0x76, 0xd7, 0x64, 0x9e, 0x80, 0x94, 0xdd, 0x68, 0xc3, 0x31, 0x17, 0xc1, 0xe1, 0x93, 0xf9, 0x43, 0x24, 0xb0, 0x32, 0x32, 0xce, 0x93, 0x29, 0xa4, 0xaa, 0xa6, 0x37, 0xe5, 0xe7, 0x30, 0x15, 0x19, 0x26, 0x1d, 0x90, 0x23, 0xd2, 0xfe, 0x84, 0xc6, 0xb0, 0x50, 0x07, 0x0a, 0xb7, 0x01, 0xe5, 0xe2, 0x21, 0x30, 0x4d, 0x0b, 0xc2, 0x35, 0xc9, 0x37, 0x99, 0xe1, 0x73, 0x6b, 0xa5, 0x06, 0x67, 0xa6, 0xf9, 0x3a, 0x74, 0xc3, 0x13, 0xd9, 0x17, 0xa0, 0x6a, 0x49, 0xa9, 0x80, 0x46, 0x82, 0xd7, 0xae, 0xd4, 0xcd, 0x53, 0x64, 0x7a, 0xcb, 0xc9, 0xea, 0x68, 0xba, 0x15, 0x02, 0x70, 0xf4, 0xb3, 0x84, 0x17, 0xb8, 0x76, 0x46, 0xec, 0x2d, 0x7d, 0x3e, 0x18, 0xa4, 0x64, 0xeb, 0x37, 0x1e, 0xb7, 0xf0, 0x66, 0x0e, 0xac, 0x03, 0x9d, 0x60, 0x11, 0x05, 0x40, 0xb9, 0x83, 0x72, 0xf0, 0x01, 0xe1, 0xfc, 0xa7, 0x1f, 0x00, 0x73, 0x04, 0x03, 0xa0, 0xe8, 0xe3, 0xea, 0x9f, 0x12, 0x31, 0xdd, 0x6d, 0xf1, 0xff, 0x7b, 0xc0, 0xb0, 0xd4, 0xf9, 0x89, 0xd0, 0x48, 0x67, 0x26, 0x83, 0xce, 0x35, 0xd9, 0x56, 0xd2, 0xf5, 0x79, 0x13, 0x04, 0x62, 0x67, 0xe6, 0xf3, 0xa2, 0xc4, 0xbe, 0xdd, 0xc8, 0xe1, 0xf6, 0xc5, 0x9d, 0xf7, 0x35, 0xc7, 0xa0, 0x19, 0x93, 0xa9, 0x4b, 0x66, 0xfd, 0xb2, 0x98, 0x83, 0xda, 0xbf, 0xc4, 0x49, 0xee, 0x93, 0x53, 0xba, 0x7f, 0x6f, 0x54, 0x3a, 0xb7, 0xe2, 0xe6, 0xfc, 0x4a, 0xe3, 0xfb, 0xba, 0x59, 0x1d, 0x5c, 0xa9, 0x95, 0x8a, 0xee, 0xac, 0xa7, 0x43, 0x33, 0xc7, 0xd0, 0x97, 0x13, 0xd7, 0xcc, 0x5a, 0xdd, 0x81, 0xfd, 0x7f, 0x89, 0x69, 0xc5, 0xea, 0x40, 0xa4, 0x34, 0x7f, 0x1e, 0x6f, 0xe3, 0x7f, 0x36, 0x21, 0x1f, 0x14, 0xd6, 0x5e, 0x4a, 0x2a, 0x0d, 0x8e, 0x7f, 0x81, 0x6b, 0x8d, 0x75, 0x00, 0x08, 0xa4, 0xa6, 0x4d, 0xc7, 0xb9, 0xb0, 0x9a, 0xdc, 0xc2, 0xfb, 0xc2, 0x8c, 0x80, 0x9c, 0x94, 0x34, 0x69, 0x79, 0x6e, 0x8d, 0xe6, 0xae, 0x0f, 0x2e, 0xbe, 0x30, 0xa6, 0x53, 0xd2, 0xb0, 0x2e, 0xdc, 0x0c, 0xc3, 0xfe, 0x99, 0x92, 0x3f, 0x9c, 0xc4, 0x3f, 0xe8, 0xd3, 0xcf, 0x53, 0x4c, 0x05, 0x61, 0x69, 0xeb, 0xc2, 0x9b, 0xaa, 0x9b, 0x98, 0x9f, 0x41, 0x2b, 0x2d, 0x53, 0x0e, 0x47, 0x8c, 0x62, 0x9f, 0x9b, 0xbd, 0x84, 0x5c, 0x3c, 0x98, 0x00, 0x01, 0x43, 0xda, 0x6f, 0x52, 0xbb, 0x79, 0xc2, 0x0a, 0xbd, 0x35, 0x86, 0x14, 0xd9, 0x70, 0x67, 0xfd, 0xb8, 0x3f, 0xf3, 0xaa, 0x00, 0xc1, 0xa1, 0x46, 0x78, 0xb0, 0x12, 0x7f, 0x6d, 0x35, 0x96, 0xf2, 0x54, 0x01, 0xf2, 0xe3, 0xb0, 0x99, 0x61, 0x32, 0x36, 0xf1, 0xd8, 0x8a, 0x2f, 0x3d, 0x8e, 0xdc, 0x1f, 0x04, 0xbc, 0x0c, 0xa4, 0x76, 0xa1, 0xea, 0xa0, 0xff, 0xca, 0x63, 0x9a, 0x1c, 0x90, 0xf9, 0x62, 0x6e, 0xe2, 0x70, 0xf4, 0x0d, 0x45, 0xca, 0x9f, 0x1e, 0x18, 0x76, 0x67, 0xa8, 0x1d, 0xc5, 0xa7, 0xa3, 0x35, 0x9d, 0xfb, 0x52, 0x6b, 0x71, 0x5c, 0xd3, 0x34, 0x70, 0x8d, 0xf5, 0xf5, 0xfd, 0xb7, 0x49, 0xc6, 0x60, 0x50, 0x7c, 0x76, 0xbb, 0x40, 0xe3, 0xcf, 0x3f, 0x47, 0x58, 0x1b, 0x9f, 0x99, 0x45, 0xe7, 0xc5, 0xcc, 0xfe, 0x06, 0xc5, 0xf4, 0x54, 0xd9, 0x0f, 0x0d, 0x67, 0xce, 0xe8, 0x99, 0xbb, 0x27, 0x1b, 0x89, 0x8e, 0xfd, 0xeb, 0x61, 0x69, 0x84, 0x4d, 0x98, 0xf6, 0x90, 0x54, 0x3d, 0x11, 0x58, 0xed, 0xe1, 0x21, 0x7a, 0xcc, 0xb0, 0xa9, 0x40, 0xa6, 0xe1, 0x1a, 0x22, 0xa1, 0x51, 0xec, 0x8c, 0x09, 0x6a, 0xec, 0xe1, 0x44, 0x4a, 0xd8, 0xbf, 0x08, 0x21, 0x29, 0x85, 0xcb, 0xdb, 0x30, 0x12, 0x7b, 0x00, 0x64, 0xd0, 0x70, 0xd8, 0xfb, 0xf2, 0x9f, 0xd2, 0xb7, 0xf9, 0x10, 0x26, 0x03, 0x7d, 0x92, 0xba, 0x3e, 0x2a, 0xad, 0x43, 0x57, 0x09, 0xd8, 0xac, 0x9a, 0x00, 0xec, 0xbb, 0xc9, 0x9d, 0xd9, 0xf2, 0x6f, 0x0f, 0x97, 0xb3, 0x71, 0x75, 0x60, 0xa8, 0xe6, 0x5c, 0x1d, 0x62, 0x28, 0x82, 0x1e, 0x40, 0x2b, 0xe0, 0x0d, 0x93, 0x0e, 0xe8, 0x25, 0xff, 0xf0, 0x0c, 0x9f, 0x25, 0x05, 0x7f, 0x6d, 0x7e, 0xe9, 0x3f, 0x2b, 0x8a, 0x34, 0x53, 0x53, 0x2b, 0x4e, 0x51, 0xb0, 0x4b, 0x85, 0x24, 0x15, 0xc5, 0x5c, 0x0c, 0x4e, 0x83, 0x26, 0xe6, 0x57, 0xe4, 0xd4, 0xae, 0xcc, 0x60, 0x0c, 0x42, 0xa1, 0x6e, 0x7b, 0x69, 0x13, 0xa5, 0x6b, 0x13, 0xde, 0x22, 0x98, 0xe3, 0xb1, 0x2b, 0x3f, 0xea, 0xdf, 0x11, 0x79, 0xb6, 0x57, 0x5b, 0xc7, 0x8b, 0xd6, 0x20, 0xee, 0xf0, 0x5b, 0xb5, 0x05, 0x6d, 0xdc, 0x89, 0xcc, 0x94, 0x37, 0x4c, 0x3f, 0x3e, 0x6b, 0x57, 0x6b, 0x17, 0x08, 0x48, 0x81, 0x5d, 0xe4, 0xec, 0x29, 0xe4, 0x10, 0x63, 0x18, 0x5e, 0x0a, 0x7e, 0xe5, 0xd9, 0x34, 0x6c, 0x18, 0x89, 0x85, 0x96, 0x85, 0xc8, 0x7f, 0xc7, 0xd8, 0x5b, 0x61, 0x90, 0x70, 0xf7, 0x9d, 0xeb, 0x71, 0x03, 0x8c, 0x1e, 0x14, 0xa0, 0x61, 0xe2, 0x42, 0xe7, 0x5c, 0xc5, 0x62, 0x71, 0x40, 0xcd, 0x6f, 0x1d, 0x06, 0x5e, 0x4d, 0x0d, 0xd3, 0x5d, 0x5d, 0xf2, 0x28, 0x96, 0x4f, 0x8a, 0x58, 0x5b, 0x37, 0x67, 0x40, 0x6e, 0xe3, 0xf1, 0x32, 0x22, 0x6c, 0xae, 0x32, 0xbc, 0x0c, 0xc1, 0x65, 0x1f, 0x2f, 0xb1, 0xc6, 0xa9, 0xcd, 0x6c, 0x1b, 0x58, 0xf6, 0x8c, 0x28, 0x31, 0xaf, 0xd8, 0x22, 0xe2, 0xfc, 0x0e, 0x66, 0xa6, 0x3e, 0xe0, 0x6b, 0x69, 0xbf, 0x3c, 0xf5, 0x2d, 0x8c, 0xd0, 0x8c, 0xac, 0x83, 0xce, 0x2d, 0x3e, 0xac, 0xec, 0x3f, 0xfe, 0xcd, 0xb0, 0xc8, 0x28, 0x38, 0xea, 0xe1, 0xc6, 0xe8, 0x82, 0x68, 0x8c, 0xcc, 0x73, 0xf4, 0x00, 0x63, 0x18, 0x0e, 0xde, 0x89, 0xa7, 0x9e, 0xba, 0x91, 0xfb, 0xa3, 0xe7, 0x93, 0x96, 0x27, 0x98, 0x07, 0xe6, 0x73, 0x45, 0x93, 0xc7, 0x7f, 0x50, 0x22, 0x4a, 0xac, 0xe9, 0x36, 0xb4, 0xb5, 0x2f, 0x7f, 0xca, 0xe3, 0x97, 0xac, 0x4c, 0x81, 0x92, 0x81, 0xc0, 0x90, 0x6a, 0x2a, 0x70, 0xbc, 0x6d, 0xcf, 0xb6, 0x8e, 0x4e, 0x68, 0x77, 0xe2, 0xc8, 0xd3, 0xee, 0x9c, 0x84, 0x23, 0xab, 0x97, 0x3d, 0x3c, 0xdb, 0xde, 0x22, 0x9d, 0xc9, 0x1f, 0x7c, 0x7c, 0xa5, 0x5c, 0x90, 0x18, 0x85, 0xe4, 0xc7, 0x4b, 0xa9, 0x82, 0x0c, 0x5e, 0x03, 0xf4, 0x76, 0x22, 0xf6, 0x9e, 0x27, 0x3c, 0x5f, 0x80, 0x74, 0xc1, 0xd2, 0x66, 0x46, 0x03, 0x26, 0x5e, 0xbf, 0xaa, 0x33, 0x6f, 0x21, 0x06, 0xda, 0x88, 0xec, 0xa3, 0x46, 0xb7, 0x47, 0x1e, 0x72, 0x9b, 0xa1, 0x38, 0xeb, 0x1c, 0x98, 0x29, 0xd8, 0x59, 0x1a, 0x37, 0x37, 0xe2, 0xca, 0x86, 0x69, 0x28, 0xa5, 0x32, 0xf1, 0x32, 0xe5, 0x9b, 0x79, 0x91, 0x25, 0x00, 0x15, 0x95, 0xc7, 0x50, 0xcc, 0xc1, 0x93, 0x3c, 0x55, 0x7d, 0xa0, 0x91, 0x1e, 0x0b, 0x78, 0xc5, 0x93, 0xbc, 0x77, 0xcf, 0x9c, 0x64, 0x74, 0x3c, 0x67, 0x0b, 0xa4, 0x80, 0x69, 0xe5, 0xba, 0x8a, 0x9f, 0x85, 0x53, 0x9b, 0x1a, 0x4d, 0x92, 0x57, 0xba, 0x29, 0x07, 0x1d, 0x3a, 0x7d, 0xd6, 0x94, 0x6c, 0x5b, 0x15, 0x86, 0xc6, 0xfa, 0x75, 0xf2, 0x1e, 0x63, 0x25, 0x5c, 0xb2, 0x6e, 0xf3, 0x68, 0x6b, 0xed, 0xb5, 0xa7, 0x63, 0x27, 0xe7, 0xb1, 0xa4, 0x88, 0x95, 0x74, 0x33, 0x96, 0x7c, 0xcb, 0x4d, 0x27, 0x6c, 0x53, 0xf0, 0xd1, 0xf0, 0x7a, 0x9d, 0xa3, 0x31, 0xd8, 0x5d, 0x12, 0x18, 0xc3, 0x02, 0x36, 0xb3, 0x1d, 0xaf, 0x37, 0xda, 0x71, 0x9a, 0x02, 0x12, 0x3e, 0x11, 0x40, 0xb1, 0x93, 0xbb, 0x88, 0x43, 0xdc, 0x21, 0xd3, 0x2d, 0xfc, 0x6c, 0x31, 0x90, 0x9c, 0x70, 0xbb, 0x70, 0xc2, 0xea, 0xc9, 0x16, 0xa5, 0x06, 0x65, 0xb2, 0xc0, 0x25, 0xff, 0x45, 0x25, 0xdc, 0x62, 0xbe, 0x14, 0x40, 0xe6, 0x63, 0xcc, 0x61, 0xe7, 0x73, 0xa1, 0x14, 0x77, 0x0a, 0x4f, 0xf6, 0x50, 0x44, 0x8e, 0xad, 0x0c, 0xa5, 0xe6, 0x71, 0x99, 0xb9, 0xc5, 0xcc, 0xe7, 0xf7, 0xcf, 0x9d, 0xe3, 0xeb, 0x75, 0x63, 0xa9, 0x95, 0xc9, 0xb8, 0xf5, 0x0c, 0x90, 0x1c, 0xdb, 0x66, 0x99, 0xf4, 0xb9, 0xdc, 0x4e, 0xd2, 0x69, 0x2a, 0x89, 0xf7, 0xbb, 0x35, 0xa9, 0x17, 0x22, 0xf0, 0xe4, 0x5c, 0xad, 0x80, 0xdf, 0xad, 0x39, 0x9f, 0x7b, 0x2f, 0xe6, 0x3e, 0xf2, 0x0c, 0xc7, 0x6e, 0x24, 0x74, 0xde, 0x80, 0x2b, 0xe2, 0x47, 0x6b, 0x35, 0xa1, 0xb3, 0x6f, 0x93, 0x8e, 0x18, 0xf8, 0x0d, 0x1f, 0xa7, 0xc5, 0x79, 0xa4, 0xff, 0x49, 0x8c, 0xcd, 0xa0, 0x52, 0xef, 0x6d, 0xa2, 0xe8, 0x95, 0x7d, 0xa7, 0x78, 0x4d, 0x64, 0x0e, 0x32, 0x93, 0x76, 0x69, 0xaf, 0xac, 0xba, 0x31, 0xd7, 0xf2, 0xf0, 0xb9, 0x02, 0x6c, 0xd2, 0x61, 0x5d, 0xa1, 0x9b, 0x0c, 0x90, 0xae, 0xc6, 0xd4, 0x9d, 0x97, 0x18, 0xfc, 0x0b, 0xdb, 0xe0, 0x25, 0x45, 0x4b, 0x7e, 0xc5, 0x3d, 0x1b, 0x22, 0xd6, 0x54, 0x3a, 0xd6, 0xcb, 0x7e, 0xdf, 0xbf, 0xc8, 0xa1, 0x65, 0x9f, 0x12, 0x3f, 0x58, 0x9f, 0xc5, 0x55, 0xd0, 0x4c, 0xc5, 0x83, 0xfd, 0xdf, 0xf6, 0x6c, 0x04, 0xc1, 0xb0, 0x60, 0x09, 0x4e, 0x6d, 0x39, 0x8d, 0xda, 0xc5, 0x82, 0xfb, 0xf1, 0x9d, 0xdf, 0x7d, 0xe3, 0x9b, 0xa8, 0x14, 0x80, 0xdd, 0xd8, 0xe8, 0x21, 0xea, 0x26, 0xdd, 0xe8, 0xe8, 0x71, 0x66, 0x48, 0x10, 0x61, 0x9e, 0xc7, 0x60, 0x4c, 0x95, 0x02, 0x8f, 0x56, 0xe7, 0xf2, 0x46, 0xdd, 0x94, 0x6f, 0x8d, 0x14, 0x0b, 0xf2, 0x84, 0xed, 0x88, 0x9f, 0x53, 0x3d, 0xa0, 0x83, 0x63, 0x1b, 0x1b, 0x1a, 0xcf, 0x88, 0x01, 0x14, 0x15, 0x56, 0xf7, 0x58, 0x12, 0x42, 0xcc, 0x4a, 0x2d, 0x64, 0x50, 0x49, 0xd2, 0xc9, 0x65, 0x7c, 0x22, 0x5e, 0x58, 0xcf, 0xe8, 0x0f, 0x71, 0x38, 0xcf, 0x31, 0xc8, 0x3f, 0xd3, 0x1d, 0x5b, 0xbd, 0xf6, 0x1e, 0x5e, 0xe4, 0x34, 0x8e, 0xd2, 0x7f, 0xb8, 0x3b, 0x59, 0x7b, 0x50, 0x10, 0x49, 0xa7, 0x1f, 0xf1, 0xff, 0xb8, 0x92, 0xe6, 0x76, 0x90, 0x95, 0x7c, 0x18, 0xc0, 0x06, 0x68, 0xd3, 0x4b, 0x69, 0x6e, 0x70, 0xad, 0xde, 0x81, 0x20, 0x1b, 0x51, 0x2c, 0x58, 0x0d, 0xf1, 0x30, 0xdf, 0xfa, 0xe3, 0x6f, 0x26, 0x62, 0x37, 0x08, 0xd7, 0x12, 0x1b, 0xc4, 0xb0, 0xa4, 0x4e, 0xb1, 0x92, 0x45, 0xd8, 0x0c, 0xd5, 0xbb, 0xf9, 0x64, 0xdf, 0xa6, 0x5f, 0xfd, 0xf5, 0x05, 0x9b, 0x73, 0x50, 0xfd, 0xd6, 0x9f, 0x74, 0xd6, 0xc0, 0xbe, 0xbd, 0x47, 0xca, 0xd0, 0x3b, 0xf3, 0x95, 0x3f, 0xc0, 0x33, 0xaa, 0xc1, 0x36, 0x16, 0x6b, 0x7f, 0x36, 0xa6, 0x4a, 0x77, 0xd7, 0x6d, 0x38, 0x1f, 0xc4, 0x38, 0x60, 0x4b, 0x92, 0x1b, 0x16, 0x50, 0x50, 0xb5, 0x0a, 0x6a, 0x5f, 0xb5, 0xc2, 0x5b, 0x84, 0x9d, 0x47, 0x55, 0x3b, 0xc7, 0x1e, 0x1a, 0x4e, 0xa5, 0x79, 0x62, 0xa7, 0x4c, 0xaf, 0x7d, 0x62, 0x34, 0xea, 0x39, 0x27, 0x39, 0x1f, 0x06, 0xb7, 0xe6, 0x44, 0x58, 0xc4, 0xf3, 0xbd, 0x4d, 0x06, 0x0c, 0x17, 0x90, 0x8b, 0xd5, 0xf8, 0x7d, 0x4f, 0x2a, 0x56, 0x86, 0x0c, 0xab, 0xe8, 0xd5, 0x53, 0x78, 0xda, 0x32, 0xdc, 0x39, 0xc5, 0x28, 0x1b, 0x62, 0xde, 0x63, 0x13, 0xb5, 0x6e, 0x5d, 0x6f, 0x08, 0x82, 0x3a, 0xcf, 0x48, 0xe3, 0xf0, 0x60, 0xbe, 0x48, 0xaa, 0xaf, 0x91, 0xcb, 0x6f, 0xbf, 0x8c, 0x9a, 0xfe, 0x59, 0x22, 0xef, 0xfd, 0xa3, 0xaf, 0x42, 0x53, 0xf4, 0x01, 0xbd, 0xd3, 0xe7, 0x17, 0xf0, 0x1a, 0xae, 0x28, 0xc6, 0xba, 0xa9, 0xe8, 0xb7, 0x98, 0x37, 0x06, 0x40, 0x92, 0xcd, 0xf9, 0x90, 0x65, 0x45, 0xfc, 0x85, 0xce, 0x78, 0x57, 0xd6, 0xf0, 0x0e, 0xe1, 0x92, 0xf6, 0x95, 0xc3, 0xc9, 0xf9, 0xd1, 0x7e, 0x88, 0x24, 0x53, 0x30, 0x0b, 0x16, 0x4d, 0x13, 0x2f, 0x87, 0xa5, 0x46, 0x26, 0x2f, 0x48, 0xd0, 0x6e, 0xe3, 0xc1, 0xe2, 0x04, 0x02, 0x0a, 0x5c, 0xd5, 0x0f, 0xa2, 0x93, 0x75, 0x9f, 0xdf, 0x51, 0x13, 0x76, 0x86, 0x1e, 0xad, 0xed, 0x99, 0xbe, 0x80, 0x97, 0x70, 0xfb, 0xc3, 0x23, 0x0b, 0xa5, 0x94, 0x84, 0xa7, 0xd6, 0x33, 0x50, 0x8f, 0x7a, 0x6e, 0x66, 0x35, 0x0f, 0x5c, 0xd4, 0x81, 0xaa, 0x4e, 0xf8, 0x69, 0x3b, 0x03, 0xe5, 0xc2, 0x11, 0x1b, 0x07, 0x56, 0xa1, 0xce, 0x0b, 0x36, 0x83, 0xde, 0xf9, 0x52, 0xbd, 0xca, 0xa3, 0x46, 0x44, 0x45, 0x43, 0x77, 0xc0, 0xe6, 0x60, 0x5f, 0x90, 0x21, 0xf1, 0x25, 0x0e, 0x76, 0xc5, 0x71, 0x14, 0xe8, 0x22, 0x7e, 0xbf, 0xb1, 0xad, 0x71, 0x72, 0x34, 0x89, 0xe9, 0x1e, 0x33, 0xc3, 0xd7, 0xc1, 0x42, 0xee, 0x90, 0x2d, 0x7c, 0x0a, 0x20, 0x0b, 0x74, 0xab, 0xe1, 0x1f, 0x6f, 0x57, 0x4d, 0xce, 0xd0, 0x2f, 0x11, 0xdd, 0xd3, 0xd1, 0x62, 0x7b, 0x7e, 0x7e, 0x94, 0x82, 0xd5, 0x78, 0xe9, 0xfa, 0x4e, 0xae, 0xa7, 0xdf, 0x84, 0x9b, 0x6d, 0x23, 0x2f, 0x6c, 0xc6, 0xf7, 0x54, 0x61, 0xff, 0x47, 0xb9, 0x75, 0x36, 0x83, 0x9c, 0x41, 0xb4, 0xa5, 0xa4, 0x1e, 0x7d, 0x70, 0x18, 0x8a, 0x24, 0xf5, 0x4f, 0xcd, 0xe4, 0x5c, 0x68, 0xdc, 0xed, 0xe1, 0x3b, 0x7d, 0xfc, 0x1d, 0x8e, 0xac, 0x2e, 0x87, 0x8d, 0x3d, 0x16, 0x3a, 0x74, 0xc4, 0x0d, 0xf9, 0x8f, 0xb2, 0xc9, 0x70, 0x64, 0xc0, 0x32, 0xbc, 0x2f, 0x91, 0x70, 0x2e, 0x8e, 0x92, 0x49, 0x4c, 0x7e, 0x26, 0xaa, 0x19, 0x86, 0x00, 0x83, 0x97, 0x32, 0xcf, 0xd8, 0x89, 0xc3, 0x21, 0x16, 0x7d, 0x25, 0x81, 0xa3, 0x0a, 0x21, 0xe3, 0xb8, 0x57, 0xd4, 0x43, 0x73, 0xdc, 0x60, 0x88, 0x28, 0x6d, 0xe1, 0xae, 0xf9, 0x74, 0xa3, 0x24, 0xa6, 0x7e, 0x92, 0x73, 0xa6, 0xf9, 0xf1, 0x21, 0x76, 0x3b, 0x4f, 0xd5, 0x31, 0xc7, 0xb7, 0xbb, 0x61, 0xcc, 0x28, 0x2a, 0x14, 0xef, 0x44, 0x85, 0x33, 0x4a, 0x4c, 0x5f, 0x10, 0xb5, 0x4c, 0xe2, 0x3e, 0x44, 0x93, 0x71, 0xa5, 0x11, 0x66, 0x8c, 0xd5, 0x3b, 0xf6, 0xf4, 0x9b, 0x2e, 0x8f, 0x10, 0xd2, 0x25, 0x11, 0x90, 0x7c, 0xee, 0xa4, 0x50, 0x12, 0xed, 0xa8, 0x7f, 0x18, 0x64, 0xeb, 0x00, 0xf3, 0xf2, 0x1f, 0x10, 0xff, 0x59, 0x8b, 0x2a, 0xdd, 0x84, 0x00, 0x27, 0x0a, 0xc8, 0x0f, 0xaa, 0xb6, 0x6a, 0x79, 0xbb, 0xd3, 0x61, 0xe7, 0xb2, 0x6c, 0x5e, 0xdb, 0x57, 0x38, 0x0a, 0xe7, 0x47, 0x6f, 0x8e, 0x1d, 0x9a, 0xdc, 0x59, 0xc6, 0xc2, 0x34, 0x1d, 0x57, 0xb6, 0xa6, 0x1b, 0xa0, 0x51, 0xb3, 0xa1, 0x47, 0xf4, 0x40, 0xd1, 0x75, 0x73, 0xe9, 0xa3, 0xcf, 0x2f, 0x99, 0x2e, 0xa8, 0x7f, 0x57, 0x23, 0x74, 0x55, 0x63, 0x9a, 0x80, 0x1e, 0x82, 0x11, 0xe1, 0xe9, 0x96, 0xb1, 0xab, 0xcc, 0x71, 0xd4, 0x63, 0x83, 0xeb, 0xc5, 0xb6, 0x5b, 0x32, 0xc6, 0x6a, 0x4f, 0x62, 0x58, 0x96, 0x70, 0x56, 0xb6, 0x0e, 0x8a, 0xbd, 0xa3, 0x22, 0x04, 0x70, 0x65, 0x88, 0x08, 0x03, 0x12, 0x96, 0xe4, 0x99, 0x0a, 0xb4, 0xb0, 0xfd, 0xc5, 0x12, 0x31, 0xef, 0xcf, 0x96, 0xfe, 0xbc, 0x10, 0x19, 0xe1, 0x12, 0x51, 0xd2, 0x80, 0x11, 0xfc, 0x12, 0x3d, 0xa5, 0x23, 0x32, 0x5a, 0x14, 0xc4, 0xca, 0x61, 0xd3, 0x4c, 0x24, 0xc3, 0x9e, 0x59, 0xf1, 0xbf, 0xc7, 0xc4, 0x3a, 0x85, 0xcf, 0xdf, 0x99, 0x9c, 0x33, 0xfb, 0xa8, 0x81, 0x88, 0x2e, 0xba, 0x91, 0xca, 0x53, 0xc9, 0x28, 0xf2, 0x51, 0xb0, 0x0b, 0xc6, 0xa1, 0x9a, 0x03, 0xf5, 0x0a, 0xbb, 0xcb, 0x63, 0xaf, 0x3e, 0x2c, 0xc2, 0x4c, 0x7e, 0x67, 0x62, 0xbd, 0x78, 0xd3, 0x4a, 0xc0, 0x81, 0xc7, 0x87, 0xfb, 0x34, 0xba, 0xc4, 0x41, 0xaf, 0xa9, 0x1b, 0x11, 0xff, 0xba, 0x2b, 0x5f, 0xd8, 0x1e, 0x6b, 0x97, 0x89, 0x3b, 0xbd, 0xe0, 0x30, 0x0b, 0x47, 0x9e, 0x2a, 0xbf, 0x7e, 0x3a, 0xce, 0xa9, 0x83, 0x25, 0x5b, 0x58, 0xb3, 0x1a, 0x2e, 0x05, 0x7a, 0xa4, 0x39, 0x2e, 0x67, 0xe1, 0xb0, 0x80, 0x86, 0x85, 0x05, 0xfa, 0xea, 0x21, 0x17, 0x50, 0x89, 0xa6, 0xa7, 0x8d, 0x4d, 0x25, 0x0b, 0xfd, 0x67, 0xd8, 0x26, 0x4a, 0xe7, 0x66, 0x97, 0xe5, 0x89, 0x63, 0x31, 0xa7, 0xd2, 0x16, 0xab, 0xb9, 0x5c, 0x80, 0x99, 0xb1, 0x6f, 0x99, 0x9b, 0xfd, 0xd0, 0xdd, 0xd5, 0x85, 0xde, 0x07, 0x9f, 0x8c, 0xda, 0x1d, 0x7d, 0xd7, 0x87, 0xac, 0x51, 0x12, 0xf3, 0x55, 0xcf, 0x6f, 0x94, 0x88, 0x32, 0x90, 0x96, 0x90, 0x2d, 0xa7, 0x74, 0xd0, 0x25, 0xdc, 0xc6, 0x4c, 0x9d, 0xef, 0x5a, 0x6b, 0xf2, 0x1e, 0x85, 0xfb, 0x48, 0x49, 0xbb, 0x75, 0xc4, 0x54, 0x5e, 0x82, 0xfc, 0xcd, 0xd4, 0xbf, 0xab, 0xce, 0xdc, 0xbd, 0xaa, 0x25, 0x22, 0x4d, 0x1b, 0xb3, 0x11, 0xfa, 0xe7, 0x12, 0xe8, 0xd6, 0x6c, 0x7b, 0x10, 0x7a, 0x6f, 0xe6, 0xad, 0x48, 0x58, 0x72, 0x73, 0xf3, 0x9e, 0x08, 0xba, 0x42, 0x80, 0x3b, 0xd5, 0x10, 0xf6, 0x73, 0xa0, 0x98, 0xe7, 0x4b, 0x59, 0xef, 0x9c, 0x37, 0xb1, 0xd2, 0x75, 0x6a, 0x22, 0xa2, 0xda, 0xf7, 0x82, 0xad, 0x75, 0x36, 0xd9, 0xaf, 0x9e, 0x69, 0x70, 0x99, 0x17, 0x9f, 0x2a, 0x90, 0xfa, 0xd9, 0x17, 0x39, 0xef, 0x6c, 0x47, 0x34, 0xa2, 0xa6, 0xdc, 0xe6, 0x75, 0xb4, 0x63, 0x7c, 0x72, 0xc3, 0x65, 0x2c, 0x83, 0x66, 0x38, 0xbe, 0xe5, 0x38, 0x1b, 0x4c, 0xda, 0xc2, 0x83, 0x46, 0x9e, 0x9f, 0xaf, 0xb8, 0x9d, 0xdd, 0x82, 0xd0, 0xe3, 0xa7, 0x92, 0x9b, 0xd4, 0x21, 0x7d, 0x0f, 0x1d, 0x94, 0x7c, 0x4e, 0xea, 0xcb, 0x3a, 0x29, 0x5a, 0xbd, 0xe6, 0xe3, 0x2f, 0x6c, 0x86, 0x38, 0xcb, 0x0c, 0x8f, 0x9e, 0x58, 0x68, 0xb3, 0xcb, 0x46, 0x82, 0xfb, 0x77, 0xfa, 0x79, 0x15, 0x63, 0xc4, 0xb0, 0xef, 0x9a, 0x12, 0x2d, 0x85, 0xf7, 0xe4, 0x3f, 0xf7, 0xe7, 0x80, 0x64, 0xde, 0x70, 0x67, 0x69, 0xe0, 0x73, 0x87, 0xd3, 0x82, 0x2e, 0xb2, 0x7e, 0x3e, 0x04, 0x4f, 0x84, 0xd6, 0x81, 0x50, 0x60, 0xe7, 0x99, 0x64, 0x54, 0xc1, 0x30, 0x6d, 0x08, 0x76, 0xe0, 0x34, 0x73, 0x31, 0xf6, 0x5b, 0xfe, 0xc9, 0xbd, 0x94, 0xe7, 0x96, 0x00, 0x11, 0xe4, 0x84, 0xca, 0x3c, 0x0a, 0x65, 0x70, 0xa7, 0xec, 0x8c, 0xd1, 0x46, 0x07, 0x97, 0xdd, 0xdc, 0x5e, 0x8c, 0x54, 0xb3, 0x61, 0x28, 0xd0, 0x90, 0x13, 0x73, 0x06, 0xe6, 0x6c, 0x98, 0x49, 0x4a, 0xfc, 0xf4, 0x50, 0x27, 0xd2, 0x6d, 0x38, 0xb3, 0x9c, 0x05, 0xcc, 0x21, 0x10, 0xae, 0x05, 0x19, 0x8a, 0x61, 0xcd, 0x65, 0xf6, 0x6a, 0x08, 0xed, 0xf0, 0x06, 0xd5, 0xe5, 0x2a, 0x2f, 0x11, 0x45, 0x0e, 0xb7, 0x1e, 0x79, 0xa5, 0x94, 0xe2, 0x5a, 0xb8, 0x7b, 0x12, 0x5e, 0x35, 0xb0, 0xb0, 0x0b, 0xd3, 0x1c, 0xd2, 0xb2, 0xf9, 0xa0, 0xa6, 0x59, 0xdd, 0xa9, 0xb3, 0xf9, 0xe9, 0x04, 0x61, 0xea, 0x62, 0xf4, 0xbc, 0x9b, 0x4b, 0x82, 0x75, 0x86, 0x87, 0x15, 0x29, 0x63, 0x3f, 0x42, 0xe6, 0x9c, 0x83, 0xe5, 0xec, 0x02, 0x34, 0x71, 0xb0, 0xbe, 0x21, 0x84, 0x27, 0x8a, 0x70, 0xbf, 0x40, 0x21, 0x40, 0xd4, 0xb3, 0xf3, 0x8c, 0xe0, 0xf9, 0x1e, 0x52, 0xfc, 0x9b, 0x9a, 0xf5, 0x0e, 0xb0, 0xb3, 0xe1, 0xe6, 0xa1, 0xbd, 0x6d, 0x86, 0x30, 0x03, 0x05, 0xc0, 0xb9, 0x00, 0x88, 0x07, 0xb7, 0xd2, 0xef, 0x7f, 0x89, 0xeb, 0x30, 0x56, 0x77, 0x0a, 0x61, 0x57, 0xf0, 0x69, 0x21, 0xbc, 0x15, 0x38, 0x34, 0x44, 0x7c, 0x4b, 0x6d, 0x86, 0x2d, 0x10, 0xd1, 0x85, 0xf1, 0xc3, 0xf9, 0x84, 0xcd, 0xe5, 0xb8, 0x1c, 0xc9, 0xea, 0xfe, 0x8b, 0xf5, 0x32, 0xfc, 0x4f, 0xae, 0x3a, 0x89, 0xf4, 0x1e, 0x14, 0xc5, 0x2a, 0x02, 0x14, 0xfc, 0x1a, 0xb0, 0xcd, 0xcd ],
+const [ 0xd2, 0x79, 0x94, 0x41, 0xab, 0xcc, 0x3b, 0xa3, 0xbd, 0x2a, 0xa7, 0x15, 0x89, 0x9e, 0xff, 0x2f, 0x18, 0xa1, 0x2c, 0x45, 0x3c, 0x48, 0x3e, 0x3a, 0x18, 0xbb, 0x0c, 0x99, 0xe2, 0xe9, 0x1b, 0xe1, 0xe8, 0x7a, 0xc2, 0x21, 0xd1, 0x05, 0x8b, 0xc5, 0x26, 0x84, 0xdb, 0xb0, 0x11, 0x05, 0xd6, 0x8b, 0x64, 0xa2, 0x7d, 0x5c, 0xdc, 0xb2, 0x19, 0x5a, 0xa8, 0x41, 0xdd, 0x00, 0x25, 0xbe, 0xc7, 0x60, 0xec, 0xf4, 0xc7, 0xba, 0x0e, 0x3c, 0x23, 0x4d, 0x9e, 0xf0, 0x1a, 0x6d, 0x70, 0x22, 0xc8, 0xd6, 0x21, 0x8e, 0x49, 0x40, 0x57, 0xce, 0x21, 0x33, 0x4a, 0xcd, 0xdb, 0x1d, 0x84, 0x7e, 0xf1, 0xa2, 0xe5, 0xce, 0xec, 0x33, 0xe9, 0xd7, 0xcc, 0xe2, 0x2e, 0x56, 0xaa, 0x74, 0x30, 0x5f, 0x9c, 0xb8, 0x57, 0x4f, 0xd9, 0x18, 0x35, 0x03, 0x1e, 0x6e, 0x08, 0x47, 0x50, 0x19, 0x87, 0x91, 0x62, 0x4f, 0xdb, 0xf0, 0x79, 0xb4, 0xeb, 0x3f, 0x4e, 0x2c, 0xdc, 0x9e, 0xd4, 0xee, 0xd8, 0x23, 0x1c, 0xdb, 0x0f, 0xcc, 0x75, 0x0d, 0xfc, 0xb8, 0xd7, 0xb2, 0xea, 0x97, 0x82, 0x1b, 0xb6, 0x60, 0xe2, 0x10, 0xd6, 0x42, 0xb6, 0x67, 0x9a, 0xdc, 0x71, 0xd5, 0xb2, 0xb0, 0xe0, 0x03, 0xf1, 0xd5, 0x0e, 0xe4, 0x51, 0xed, 0x65, 0x47, 0x36, 0x57, 0x15, 0xa8, 0xf7, 0xa6, 0xba, 0x4c, 0x9a, 0x51, 0x39, 0x8d, 0xdf, 0xab, 0xea, 0x72, 0x81, 0x16, 0xfd, 0x82, 0xb8, 0x74, 0x16, 0xda, 0x02, 0xdf, 0x3b, 0x7e, 0x23, 0x9a, 0xf0, 0xed, 0x6a, 0x47, 0xa0, 0xf8, 0x37, 0x5a, 0x3f, 0xd3, 0xba, 0xcd, 0x2e, 0x6d, 0xfd, 0x16, 0x5f, 0xfd, 0x25, 0x56, 0xb9, 0xdd, 0xf5, 0xd3, 0xbe, 0x9c, 0x93, 0xa8, 0x6b, 0x4f, 0x8f, 0xbb, 0x5f, 0x27, 0x21, 0xf0, 0x40, 0x49, 0xb2, 0x9c, 0x5b, 0xd9, 0x9e, 0x3d, 0x8a, 0x58, 0x39, 0x68, 0x5b, 0x31, 0x10, 0x02, 0x6e, 0x8e, 0x71, 0xb3, 0x1f, 0x70, 0x2d, 0x98, 0x65, 0xff, 0x9c, 0x38, 0xfa, 0x1f, 0xe2, 0xba, 0xbd, 0x43, 0x71, 0x55, 0x54, 0x86, 0xcf, 0x07, 0x15, 0xf8, 0x9a, 0x8a, 0x27, 0x35, 0xc9, 0x84, 0xe4, 0x3d, 0x34, 0xfe, 0x82, 0x7f, 0x57, 0x17, 0xf3, 0x37, 0x52, 0xf9, 0x09, 0xfa, 0x35, 0x0d, 0xde, 0x8f, 0x7b, 0x6b, 0x73, 0x01, 0xd4, 0x95, 0x97, 0xf2, 0x28, 0x64, 0x0b, 0x32, 0xd8, 0x42, 0xe3, 0x91, 0x47, 0x9a, 0x2f, 0xf1, 0x99, 0x8d, 0xdb, 0x9f, 0xba, 0xe7, 0xd4, 0xe3, 0xa2, 0x51, 0x6c, 0xd5, 0xd8, 0xc8, 0x00, 0x73, 0x35, 0x4d, 0xd8, 0xf1, 0xeb, 0xde, 0x4e, 0x50, 0xc6, 0xa6, 0x33, 0x32, 0xb1, 0x71, 0x6e, 0xed, 0x7b, 0x62, 0xe6, 0xde, 0xdb, 0xe8, 0xa3, 0x00, 0xb2, 0xee, 0x30, 0xbc, 0x91, 0x52, 0x43, 0x03, 0x7b, 0x99, 0x9f, 0x9b, 0xec, 0xe1, 0x3a, 0xb6, 0x19, 0x16, 0x9b, 0xc9, 0x7a, 0x69, 0x87, 0x9b, 0x86, 0xfe, 0xdc, 0x9d, 0xbe, 0xe5, 0xbd, 0x79, 0xec, 0x4c, 0xef, 0xed, 0xad, 0xf3, 0x83, 0xda, 0x2d, 0xe0, 0xb6, 0x98, 0x32, 0x53, 0x15, 0x8d, 0x5c, 0xfc, 0xe5, 0xfe, 0xab, 0x6c, 0xc1, 0x24, 0x41, 0xca, 0x85, 0x83, 0x69, 0xc7, 0x6b, 0x77, 0xd9, 0xd3, 0x74, 0x10, 0x34, 0x92, 0x0a, 0x1f, 0xd3, 0x89, 0xe3, 0x91, 0xc5, 0x1e, 0x28, 0xfc, 0x14, 0xbf, 0xd7, 0x78, 0x4a, 0x61, 0x66, 0xb0, 0x34, 0x2c, 0xa9, 0x39, 0xe6, 0x74, 0xf5, 0x22, 0xff, 0xec, 0x86, 0xcc, 0x2f, 0x16, 0x1e, 0xfb, 0xf6, 0xfe, 0xef, 0x2e, 0xae, 0x28, 0xbb, 0x2c, 0xcb, 0xc7, 0x3a, 0xe0, 0x62, 0x2f, 0xbc, 0x66, 0xe8, 0x8d, 0x0f, 0x66, 0x3d, 0xd6, 0xa3, 0xa1, 0xe8, 0xfd, 0xec, 0xc9, 0xa5, 0x69, 0x08, 0x96, 0x1d, 0xa6, 0xa2, 0x16, 0xf4, 0x5b, 0x16, 0x45, 0x08, 0x7c, 0xd5, 0xdd, 0xf8, 0xc0, 0x0c, 0x6f, 0xe4, 0x56, 0x80, 0xb3, 0x74, 0xd4, 0xbc, 0x1d, 0x1c, 0x70, 0x6f, 0xb0, 0x9e, 0x72, 0x10, 0x17, 0xd0, 0xe9, 0xc3, 0xf2, 0x9f, 0x9d, 0x80, 0x6e, 0x54, 0x46, 0x72, 0x18, 0x16, 0xfb, 0x9d, 0xf3, 0xb0, 0xed, 0xc4, 0xc7, 0x95, 0x55, 0x8a, 0xbd, 0x21, 0xab, 0xd7, 0x29, 0x22, 0x19, 0x7d, 0xa7, 0x97, 0x2f, 0x1c, 0x69, 0xb8, 0xd8, 0x43, 0xcf, 0x36, 0x8d, 0xd7, 0x38, 0xc3, 0xc8, 0xb9, 0x19, 0xd5, 0xbc, 0xa3, 0x4c, 0xa7, 0x43, 0x53, 0xaa, 0x81, 0x18, 0xec, 0xdb, 0x3a, 0x46, 0x99, 0x6d, 0xfb, 0xe0, 0x73, 0x24, 0x45, 0xf3, 0xa5, 0x91, 0x36, 0xb9, 0xcd, 0xe6, 0x08, 0x0f, 0xa6, 0x09, 0xda, 0x29, 0xe5, 0xe7, 0xb3, 0x85, 0x60, 0x0b, 0xc4, 0x1d, 0x75, 0x6f, 0xed, 0xe1, 0xaa, 0x92, 0x83, 0x64, 0x91, 0xca, 0x51, 0xd6, 0xef, 0xdc, 0xdc, 0x32, 0x1c, 0xca, 0xec, 0xb8, 0xad, 0xec, 0x47, 0x9e, 0x51, 0x42, 0xc0, 0x03, 0xf9, 0x09, 0x70, 0x24, 0x3c, 0x8c, 0x44, 0xd2, 0xf9, 0x3d, 0xb8, 0x24, 0x3e, 0x04, 0xe1, 0x69, 0x68, 0xd7, 0xb1, 0x60, 0x8c, 0x8b, 0x77, 0xac, 0x16, 0xea, 0xa5, 0x82, 0xb0, 0x05, 0xd6, 0xa5, 0x66, 0xcc, 0x0f, 0x94, 0x07, 0xdb, 0x45, 0x01, 0xce, 0x97, 0x20, 0x86, 0x41, 0x7a, 0xff, 0x94, 0x5a, 0xab, 0x3c, 0xac, 0xe5, 0xd2, 0xb1, 0xd1, 0x29, 0x2a, 0x7b, 0x3d, 0xca, 0xd8, 0xfd, 0x53, 0xee, 0x7b, 0x28, 0xd5, 0x9f, 0x04, 0xfa, 0x57, 0x71, 0xc8, 0x45, 0xf3, 0x64, 0xd3, 0xb2, 0x3f, 0x0b, 0x7f, 0x05, 0x7c, 0xee, 0x46, 0xa3, 0x10, 0x2e, 0xd5, 0x51, 0x37, 0x67, 0x61, 0x3e, 0xf5, 0xda, 0x3e, 0x44, 0x4f, 0xcc, 0xae, 0x6b, 0xba, 0x29, 0xf7, 0xaf, 0xd4, 0x6d, 0xb8, 0x03, 0x52, 0xc4, 0x7c, 0x95, 0x39, 0x70, 0x90, 0x54, 0x52, 0x6c, 0x12, 0xb0, 0xd7, 0x4f, 0x4b, 0xa0, 0x73, 0x72, 0x3f, 0xea, 0x6a, 0x55, 0x81, 0x9f, 0x13, 0x3f, 0x4c, 0xe4, 0x8f, 0x25, 0xd0, 0xf8, 0xb5, 0xcd, 0xca, 0x73, 0x4c, 0x34, 0x57, 0xcc, 0x7d, 0x2c, 0x0a, 0x1e, 0x87, 0x49, 0x3c, 0x2c, 0xb5, 0xfe, 0xa3, 0xa2, 0x8e, 0x04, 0x27, 0x9e, 0x4b, 0xfb, 0xf0, 0x6e, 0x8e, 0x54, 0xc4, 0x9c, 0x50, 0x6e, 0x90, 0x27, 0x1b, 0xff, 0x44, 0x14, 0x7a, 0xb6, 0xe4, 0x25, 0xaf, 0x1f, 0xdc, 0xe9, 0xa3, 0xc6, 0x95, 0xf5, 0x23, 0x9f, 0x45, 0x70, 0x48, 0xa5, 0x0b, 0xd5, 0x37, 0xc2, 0x3b, 0xf4, 0x0b, 0xef, 0xf7, 0x3a, 0x10, 0x9c, 0xff, 0x33, 0x32, 0x52, 0xc9, 0x4d, 0xb5, 0x97, 0xd5, 0xdf, 0x26, 0x12, 0x3b, 0x69, 0x91, 0xef, 0x86, 0x1e, 0xf4, 0x85, 0xc4, 0x9f, 0xf4, 0x36, 0xde, 0x0a, 0xcf, 0x97, 0x26, 0x33, 0x92, 0xd1, 0x2f, 0x31, 0x8c, 0x48, 0xe1, 0x1d, 0x02, 0x7a, 0xcc, 0x16, 0x24, 0x29, 0xbd, 0x88, 0x40, 0xbc, 0x8f, 0xae, 0x36, 0xe3, 0x44, 0x56, 0x2c, 0x7a, 0x55, 0xe5, 0x82, 0xb0, 0x45, 0x9a, 0x08, 0x68, 0x7c, 0x17, 0x6f, 0xdf, 0x53, 0x1d, 0xfe, 0x8f, 0x6c, 0x97, 0x86, 0x54, 0x44, 0xda, 0x98, 0xce, 0x0b, 0x2b, 0xf5, 0x06, 0xb3, 0x81, 0x46, 0x54, 0x47, 0x8d, 0x0e, 0x80, 0x7e, 0xf8, 0xdc, 0x27, 0x90, 0xec, 0xc5, 0x60, 0x48, 0xd5, 0x11, 0xa0, 0x5a, 0x69, 0x35, 0xdb, 0xf8, 0xe6, 0x02, 0xec, 0xa0, 0x9a, 0x1b, 0x37, 0x38, 0xa9, 0xac, 0x8d, 0x5c, 0x0b, 0x59, 0x50, 0xf7, 0xd4, 0x75, 0xd7, 0x10, 0xb8, 0x75, 0x13, 0xe7, 0xce, 0xa4, 0x73, 0x41, 0x94, 0x18, 0x06, 0x00, 0x34, 0xe4, 0xe0, 0xf6, 0x05, 0x8f, 0xbe, 0xfb, 0x55, 0xc5, 0xed, 0x3d, 0x66, 0x4d, 0x67, 0xd8, 0xb6, 0x3b, 0x40, 0xa7, 0x83, 0x67, 0x40, 0x59, 0x8f, 0x1d, 0xd2, 0xc7, 0x21, 0x16, 0x1c, 0x84, 0x4c, 0xa7, 0x70, 0xb6, 0x73, 0x39, 0xe3, 0x25, 0x0d, 0xf9, 0x3b, 0x92, 0xa6, 0xd1, 0x0f, 0x4a, 0x26, 0x96, 0x29, 0xfb, 0x56, 0x83, 0x2f, 0xc5, 0xa0, 0xe6, 0x83, 0x94, 0x17, 0x19, 0x67, 0xae, 0xb7, 0xb4, 0x65, 0x88, 0xed, 0x01, 0xee, 0xde, 0x5a, 0xb0, 0x41, 0x02, 0xd4, 0xcc, 0x8e, 0x75, 0xad, 0xee, 0x5b, 0xb4, 0x38, 0xb1, 0x28, 0x54, 0x8a, 0x65, 0x4e, 0x51, 0x7e, 0x08, 0x2d, 0xa4, 0xfc, 0x72, 0x86, 0x13, 0x7a, 0xcf, 0x26, 0x4d, 0xc2, 0x52, 0xc5, 0x36, 0xf6, 0x28, 0x2d, 0x80, 0xd2, 0xab, 0x9f, 0x7b, 0x32, 0xd9, 0x72, 0x2e, 0xd4, 0x04, 0xfd, 0xa6, 0x5e, 0xca, 0xb7, 0x8e, 0xa3, 0x48, 0x9d, 0x00, 0x22, 0x8b, 0xd4, 0x9b, 0xcf, 0x47, 0x90, 0xd6, 0x17, 0xcc, 0x34, 0x93, 0x1e, 0x35, 0xbb, 0xf8, 0x4b, 0xe3, 0x56, 0x7a, 0x06, 0x2a, 0x56, 0x3a, 0xc0, 0x49, 0x4d, 0x95, 0x34, 0xa0, 0x70, 0xf6, 0xed, 0x1d, 0x40, 0xef, 0x09, 0xf8, 0x6a, 0x89, 0x3c, 0xa0, 0xeb, 0xd8, 0x18, 0xf5, 0x77, 0xd2, 0x8b, 0xb7, 0x1c, 0x61, 0xa9, 0x3e, 0x23, 0xb6, 0xab, 0x6c, 0x37, 0xe1, 0x38, 0xe1, 0xc9, 0x9e, 0xe4, 0x6d, 0xb2, 0x72, 0xf7, 0xcb, 0x1a, 0xf7, 0x6f, 0x8c, 0x99, 0x74, 0x48, 0x51, 0x9d, 0xb1, 0xfa, 0x3d, 0x0c, 0x0a, 0x44, 0xaa, 0x2a, 0xc1, 0x28, 0x1b, 0xbc, 0x99, 0x37, 0x72, 0x6e, 0xa0, 0x0e, 0x64, 0x72, 0x4c, 0x21, 0x29, 0x6a, 0xc9, 0xb7, 0x78, 0x88, 0x92, 0x36, 0xb2, 0xf3, 0x3f, 0xa1, 0x5e, 0x6d, 0x9d, 0x5f, 0xd5, 0x34, 0x04, 0x3e, 0x3e, 0x25, 0xe5, 0xb7, 0xbd, 0x27, 0xa3, 0x74, 0xe8, 0xc7, 0xa4, 0x0f, 0x7b, 0x20, 0xa7, 0x1d, 0x4c, 0xfe, 0x58, 0x6b, 0x81, 0x43, 0x21, 0x87, 0x00, 0x89, 0x44, 0x82, 0x27, 0x08, 0x27, 0xf5, 0xbe, 0xba, 0xee, 0x42, 0x29, 0xbe, 0x4f, 0x1c, 0xe2, 0xfb, 0xa2, 0x4a, 0x27, 0x05, 0x38, 0xa7, 0xf0, 0x44, 0xee, 0x6e, 0x24, 0x53, 0x02, 0xb4, 0x0c, 0xa6, 0x25, 0x36, 0x08, 0x70, 0xd1, 0x55, 0x81, 0xc3, 0xdc, 0x5f, 0x1e, 0xf9, 0x4e, 0x10, 0x3b, 0x54, 0x70, 0x59, 0x97, 0xe1, 0x25, 0x5f, 0x4c, 0xa2, 0x7d, 0xc7, 0x05, 0xeb, 0x88, 0x31, 0x6b, 0x0d, 0x68, 0x02, 0xe0, 0x32, 0xaa, 0x67, 0x70, 0x88, 0xd7, 0x97, 0x04, 0xa2, 0x45, 0x58, 0xd9, 0x1b, 0x33, 0xc4, 0x31, 0x7c, 0x15, 0x4d, 0x49, 0x5f, 0x2d, 0xff, 0x8a, 0xd5, 0x5b, 0x05, 0x03, 0x06, 0x36, 0x6f, 0x17, 0x17, 0x5b, 0x32, 0x73, 0x51, 0x06, 0x70, 0x44, 0x7f, 0xdf, 0xfa, 0xa6, 0x97, 0x16, 0x14, 0x5f, 0x9d, 0xb1, 0x78, 0xcd, 0xc5, 0x25, 0x9d, 0x1d, 0xd8, 0x24, 0x38, 0xbe, 0xd8, 0xb7, 0x04, 0x15, 0xe7, 0x8c, 0xbe, 0x73, 0x65, 0x91, 0x74, 0x44, 0x59, 0xc2, 0x00, 0x89, 0x12, 0x3e, 0xd0, 0x88, 0x0e, 0xa1, 0xe8, 0xc1, 0x1a, 0x8e, 0x29, 0x25, 0xbb, 0x8b, 0xd3, 0x83, 0xcd, 0x12, 0x49, 0x43, 0x6a, 0xe4, 0x14, 0x56, 0x0d, 0xa1, 0x2b, 0x6d, 0xf7, 0x96, 0x71, 0x69, 0xd2, 0xd6, 0x80, 0x13, 0x95, 0x8c, 0xa5, 0x0e, 0xa7, 0x8f, 0x2b, 0x0a, 0x47, 0x37, 0xdd, 0x39, 0x2b, 0x70, 0xc6, 0x07, 0x67, 0x0c, 0x3b, 0x06, 0x91, 0x5e, 0x1c, 0x27, 0x23, 0x04, 0x56, 0x30, 0x20, 0x04, 0xac, 0x6a, 0xfb, 0x1b, 0xb8, 0x9a, 0xb4, 0x51, 0x2c, 0x33, 0x44, 0xd1, 0x5e, 0xca, 0x3b, 0xf8, 0x04, 0xca, 0xa8, 0xac, 0x3b, 0x69, 0x39, 0xef, 0xcf, 0xdb, 0xa3, 0xb3, 0xb6, 0xc5, 0x44, 0xf0, 0xdd, 0xf4, 0x07, 0xf5, 0x28, 0x4f, 0x89, 0xfc, 0xb4, 0x0a, 0x7a, 0x00, 0x5f, 0x1d, 0x45, 0xd3, 0x8a, 0xf5, 0xf3, 0x6b, 0x1d, 0x69, 0x4c, 0x7c, 0xcc, 0xef, 0x40, 0x4d, 0x99, 0x10, 0x86, 0xc4, 0x9a, 0x19, 0x83, 0xc2, 0xfd, 0x14, 0x6d, 0xb7, 0x49, 0xf6, 0xb0, 0x6d, 0xe6, 0x1a, 0x91, 0x28, 0xe0, 0xee, 0x11, 0xf1, 0xe8, 0xed, 0x14, 0x2f, 0x9c, 0xcd, 0xc2, 0x77, 0x08, 0xf9, 0x2e, 0xa5, 0x6c, 0x41, 0x35, 0x2c, 0x3f, 0xd0, 0xaa, 0xaa, 0x75, 0x5f, 0xb0, 0xc0, 0xfe, 0xa9, 0x66, 0x20, 0x8f, 0x1f, 0xca, 0xe7, 0xa4, 0xdc, 0xd7, 0x2e, 0xc6, 0xdb, 0xf1, 0xdb, 0x09, 0x68, 0x83, 0xbd, 0xda, 0xd4, 0xe7, 0xd9, 0xf7, 0x6d, 0x86, 0xfe, 0xbf, 0xad, 0x40, 0xa0, 0xac, 0xb2, 0x0e, 0xe3, 0x1e, 0xee, 0xe5, 0xf5, 0x5a, 0x20, 0xde, 0xa1, 0xd2, 0x83, 0x95, 0x21, 0xa7, 0x45, 0xce, 0x34, 0x6c, 0x3a, 0x5f, 0x71, 0x2d, 0xd2, 0x4a, 0xdb, 0xaf, 0x49, 0x29, 0xb5, 0xfa, 0x1d, 0xcf, 0x98, 0x15, 0xc5, 0x2c, 0xc2, 0x11, 0xa0, 0x71, 0xb1, 0x48, 0x2c, 0x75, 0xf1, 0xe7, 0x78, 0x57, 0x32, 0xaa, 0xdc, 0x66, 0x9d, 0xe7, 0xe7, 0x3d, 0x68, 0xce, 0x99, 0x32, 0xa8, 0xef, 0xd2, 0xf2, 0x67, 0xfd, 0x0b, 0x65, 0xf7, 0xd1, 0x44, 0xd8, 0x85, 0xb1, 0x3d, 0x5a, 0xf1, 0xd3, 0xe9, 0x66, 0xde, 0x1d, 0x20, 0xc3, 0x05, 0x2f, 0x94, 0xa9, 0xce, 0xa3, 0x06, 0x25, 0x21, 0x93, 0xba, 0xbe, 0x79, 0x5c, 0x28, 0x59, 0x3b, 0xa2, 0xf4, 0x5a, 0x47, 0x95, 0x20, 0x0c, 0xcc, 0x72, 0x81, 0x43, 0x60, 0x4c, 0x6f, 0x40, 0x50, 0x0c, 0xc1, 0xd4, 0x34, 0xb7, 0xf9, 0xc9, 0xc7, 0xef, 0xbb, 0x7d, 0xf6, 0xbd, 0x84, 0xd0, 0x37, 0x8d, 0x98, 0x40, 0x1c, 0x7a, 0x3c, 0x53, 0x28, 0xcc, 0x26, 0x36, 0xe1, 0xbf, 0x32, 0xa3, 0x26, 0x87, 0x56, 0x07, 0xc3, 0x90, 0xd8, 0xe5, 0x43, 0x0a, 0xbe, 0x75, 0x06, 0xa5, 0x87, 0x92, 0x93, 0x99, 0x18, 0xd3, 0x2e, 0xea, 0xf9, 0xf7, 0xae, 0xea, 0xc1, 0x86, 0x89, 0xff, 0xcf, 0xb5, 0x31, 0xa6, 0x3b, 0x8a, 0xa3, 0xb8, 0x0c, 0x42, 0x3c, 0xed, 0xac, 0xf0, 0xcf, 0x9e, 0x99, 0x66, 0xf6, 0xcf, 0x5c, 0x58, 0xa5, 0x6c, 0xbf, 0xbf, 0x05, 0xd3, 0x3b, 0x7c, 0x7f, 0x93, 0xb0, 0x3e, 0x16, 0x73, 0x59, 0xa5, 0xfb, 0xb7, 0xfe, 0xa8, 0x5b, 0x9e, 0x6b, 0x34, 0x7c, 0x2f, 0x22, 0x15, 0x08, 0x35, 0x4d, 0x1a, 0xa9, 0x89, 0xf6, 0x74, 0xd5, 0x8f, 0x7a, 0x60, 0xec, 0x03, 0x3b, 0x06, 0x80, 0xf6, 0x96, 0xa0, 0xf3, 0x13, 0x15, 0xde, 0x48, 0x27, 0xe5, 0x89, 0x33, 0xe1, 0x8a, 0x68, 0x72, 0xd6, 0xd1, 0x60, 0x60, 0xc7, 0x06, 0xde, 0xc8, 0x27, 0x68, 0x7a, 0xf7, 0xd8, 0xda, 0xd4, 0x15, 0x36, 0xdb, 0xc2, 0xb5, 0x56, 0xb8, 0xae, 0xaa, 0x8f, 0x00, 0x39, 0x1c, 0x3a, 0x39, 0x24, 0xdc, 0xb7, 0xd1, 0x71, 0xf5, 0xb1, 0x58, 0xc5, 0x84, 0xa2, 0xec, 0x11, 0xc9, 0x99, 0xf4, 0x71, 0x7d, 0x3b, 0x11, 0x55, 0x66, 0x07, 0x51, 0xde, 0x2a, 0xdf, 0xa6, 0x8b, 0x61, 0xc4, 0x97, 0x14, 0xed, 0xe2, 0x36, 0x96, 0x8e, 0xcc, 0x52, 0xf1, 0xb1, 0x08, 0xed, 0x6e, 0x89, 0xce, 0xf0, 0xa6, 0x61, 0x0d, 0x1e, 0x9f, 0x31, 0xaf, 0x47, 0x37, 0x6f, 0x1e, 0xbe, 0xc6, 0x27, 0x07, 0x0d, 0xff, 0x4e, 0x5e, 0xe6, 0x17, 0x54, 0xa2, 0x5d, 0x2a, 0xf8, 0x62, 0x55, 0xda, 0x60, 0x00, 0x38, 0x39, 0x69, 0xb5, 0xec, 0xe9, 0x3c, 0xd5, 0x02, 0x81, 0x22, 0x54, 0x30, 0x33, 0x99, 0x8a, 0x01, 0xac, 0xa7, 0x33, 0xcb, 0x3c, 0x6e, 0xba, 0xe2, 0x37, 0x01, 0xb7, 0x0b, 0x9b, 0x76, 0xb6, 0x33, 0xf2, 0x3c, 0x3a, 0x61, 0x7a, 0xaf, 0x01, 0xea, 0x84, 0xea, 0x8a, 0xe4, 0x1a, 0xdc, 0xd5, 0xdc, 0xe4, 0x9f, 0x6a, 0xcc, 0x4d, 0x04, 0x9c, 0x47, 0xe1, 0x73, 0x0f, 0xf7, 0xf9, 0xf2, 0x78, 0x49, 0x9b, 0x83, 0xa4, 0x67, 0x9c, 0xb3, 0xbc, 0x67, 0x07, 0x70, 0xc7, 0xc1, 0xc3, 0x1b, 0x70, 0x07, 0x6f, 0xde, 0x09, 0xd0, 0x91, 0x40, 0xd1, 0xf6, 0xf0, 0xf6, 0x72, 0x01, 0x3e, 0xfc, 0xce, 0xe2, 0xfa, 0xe5, 0xfb, 0xe5, 0x95, 0x70, 0x8c, 0xe1, 0xd4, 0x5b, 0x13, 0xb1, 0x75, 0x7c, 0xe4, 0xe8, 0x15, 0x0d, 0x1b, 0xc1, 0x51, 0x48, 0xe0, 0x55, 0x2c, 0x34, 0xe9, 0x11, 0xb0, 0xbe, 0x41, 0x66, 0xd9, 0x0b, 0x48, 0xc2, 0xae, 0x0d, 0xfc, 0xc0, 0xb1, 0x54, 0x76, 0x9c, 0x79, 0x27, 0xb7, 0xe9, 0x9e, 0xd4, 0xa5, 0x86, 0xd5, 0x44, 0x51, 0xce, 0x5c, 0xd2, 0x7b, 0x0f, 0x99, 0x5d, 0x58, 0x3d, 0xfe, 0x9c, 0x93, 0xe8, 0x2f, 0xb2, 0x91, 0x6c, 0x67, 0x03, 0xf9, 0x68, 0x18, 0x45, 0x74, 0x71, 0xd1, 0xda, 0xb1, 0x07, 0x65, 0x5d, 0xad, 0xc7, 0x4a, 0x7b, 0x31, 0xe3, 0x3f, 0x04, 0x9c, 0xd0, 0x31, 0x41, 0xe2, 0x3e, 0x60, 0x89, 0xd5, 0x4d, 0xbe, 0x0f, 0xa3, 0xfe, 0x97, 0xfe, 0xa0, 0xe7, 0x77, 0xc8, 0x46, 0x2c, 0x49, 0xba, 0x7a, 0xaa, 0xbc, 0xd5, 0x11, 0x75, 0xeb, 0xd9, 0x93, 0x85, 0x3c, 0xa2, 0x3f, 0xac, 0x88, 0xb7, 0x4f, 0xcb, 0x7d, 0x21, 0x7d, 0x46, 0x41, 0x79, 0xc5, 0xb5, 0x58, 0x45, 0x6d, 0xdd, 0xc8, 0x85, 0x43, 0xde, 0x7b, 0x88, 0x26, 0xad, 0xe4, 0x04, 0xc7, 0xc5, 0xe6, 0x66, 0xb1, 0x1a, 0xf1, 0x67, 0x87, 0x4f, 0x6e, 0xe0, 0x8d, 0x28, 0x5d, 0xdf, 0x6a, 0x42, 0x3c, 0xfa, 0x2d, 0x02, 0x2b, 0xe3, 0x8d, 0xcb, 0x4f, 0x3d, 0x75, 0x74, 0x74, 0xae, 0xc0, 0xf9, 0xf6, 0x36, 0x41, 0x70, 0xe1, 0xbf, 0x06, 0x3f, 0x57, 0xf5, 0xdd, 0x8d, 0x32, 0x57, 0x18, 0xf6, 0xeb, 0x8e, 0x8e, 0x83, 0xbb, 0xfe, 0xe2, 0xd9, 0xff, 0x9c, 0x08, 0xb0, 0xe1, 0xff, 0x04, 0x87, 0x35, 0xb9, 0xf5, 0x96, 0xa1, 0xe7, 0x53, 0x05, 0x01, 0x07, 0x75, 0x5b, 0x09, 0x0a, 0x56, 0x39, 0x2c, 0xaa, 0x98, 0x48, 0xbd, 0xfe, 0xc9, 0x70, 0x55, 0x4c, 0xe6, 0x4b, 0x74, 0x1e, 0x1d, 0xd9, 0x6b, 0x98, 0xd7, 0x75, 0x79, 0x08, 0xf6, 0x07, 0x34, 0xbf, 0x5b, 0x7c, 0x2a, 0x20, 0xac, 0x73, 0xc9, 0xf6, 0x54, 0x39, 0x7c, 0x0b, 0xcb, 0xf8, 0x17, 0xf6, 0x17, 0x2b, 0x75, 0x34, 0x93, 0x55, 0x5f, 0x7a, 0xef, 0xf3, 0xb0, 0x4a, 0x78, 0xaf, 0xb7, 0xc5, 0x99, 0xd6, 0xdd, 0xc0, 0xa2, 0x0c, 0x88, 0x19, 0xc9, 0x3f, 0x3f, 0x4b, 0x6f, 0xd9, 0x0e, 0x41, 0xa4, 0x3a, 0x2c, 0x68, 0xec, 0x65, 0xdb, 0x08, 0x43, 0xf9, 0x90, 0xd4, 0x60, 0x64, 0x54, 0xc0, 0x37, 0x53, 0x6a, 0x12, 0xc1, 0x6c, 0x32, 0xbc, 0xff, 0x40, 0x4d, 0xe9, 0x3d, 0x7b, 0x02, 0xd6, 0x94, 0x5e, 0xe0, 0xe3, 0xb2, 0x70, 0xa5, 0xea, 0xde, 0x70, 0x5f, 0xcf, 0x36, 0x8d, 0xd1, 0x58, 0x3b, 0xda, 0x18, 0x3f, 0x90, 0xfc, 0x8f, 0x86, 0xff, 0x25, 0xef, 0x0b, 0xbd, 0x47, 0xbb, 0x5c, 0xef, 0x81, 0xdb, 0xcc, 0x6c, 0xde, 0x86, 0xc7, 0xc5, 0x3e, 0x66, 0x62, 0x83, 0x94, 0xf7, 0x36, 0xaf, 0x52, 0x31, 0x6f, 0x98, 0x22, 0x66, 0x20, 0xd0, 0xd7, 0x6d, 0xda, 0x78, 0xa3, 0x00, 0x7c, 0xbd, 0x8a, 0x63, 0x4c, 0xa3, 0x16, 0x46, 0x47, 0x02, 0x4d, 0xed, 0xb6, 0xcd, 0xe0, 0x8e, 0x02, 0x9a, 0xa5, 0xfb, 0xc9, 0x5f, 0x47, 0x80, 0x31, 0x7a, 0x3d, 0x0f, 0x7d, 0xf5, 0xf8, 0x9a, 0xde, 0x07, 0x61, 0xc1, 0x8b, 0xde, 0x82, 0xad, 0x13, 0x9b, 0x83, 0x3c, 0xf2, 0x9f, 0xd9, 0x5e, 0x63, 0x05, 0xba, 0xbf, 0x76, 0x6f, 0xd4, 0xa6, 0x62, 0x06, 0x3e, 0x1d, 0x1c, 0xbc, 0xaf, 0x52, 0x29, 0xd5, 0xee, 0x3d, 0xb0, 0xa5, 0x89, 0x83, 0xd3, 0x9b, 0xca, 0x9a, 0x3f, 0x7e, 0xe7, 0x2e, 0x02, 0xf7, 0x79, 0xc4, 0x9e, 0x50, 0x2f, 0x9e, 0x5b, 0x7b, 0xc4, 0xde, 0xe1, 0x56, 0x2e, 0xee, 0x05, 0x2d, 0x19, 0x1e, 0xe4, 0x80, 0x93, 0x8f, 0x2e, 0x07, 0x09, 0x51, 0xc5, 0xf4, 0x72, 0xc8, 0x87, 0x78, 0xca, 0x54, 0x67, 0x88, 0xc2, 0x30, 0xc3, 0xe1, 0xb6, 0x9b, 0xf2, 0x4a, 0xdf, 0x36, 0x1c, 0x19, 0xca, 0xae, 0x4e, 0xf8, 0x08, 0x9a, 0xcd, 0xe9, 0x28, 0xa7, 0xab, 0x88, 0xe2, 0xf2, 0x99, 0x90, 0x95, 0xb5, 0xfc, 0xa1, 0xf4, 0x26, 0x43, 0x41, 0xfb, 0x9c, 0x77, 0x20, 0x29, 0xf4, 0x13, 0xa0, 0xe9, 0x33, 0x17, 0x94, 0x51, 0x6c, 0x58, 0x48, 0x0e, 0xe5, 0x1a, 0xc3, 0x9f, 0x75, 0xe0, 0x48, 0xc2, 0x30, 0x83, 0x23, 0x2c, 0x47, 0x82, 0xa2, 0x7d, 0x29, 0x99, 0x61, 0x73, 0xee, 0x95, 0xca, 0x5e, 0xf6, 0x66, 0xdd, 0xd4, 0xcd, 0x76, 0x2d, 0xa5, 0x52, 0x39, 0x2b, 0x11, 0x19, 0x06, 0xa7, 0x39, 0x0d, 0x25, 0x94, 0xd4, 0x5a, 0x29, 0x0c, 0x23, 0x8a, 0x7f, 0x94, 0x27, 0xed, 0x48, 0xa0, 0x11, 0x3f, 0x64, 0x5a, 0xfa, 0x85, 0xcf, 0x9f, 0xd4, 0x38, 0x31, 0x4a, 0xa1, 0xa5, 0xb0, 0xb6, 0xe3, 0x94, 0x09, 0x7e, 0x53, 0x28, 0xdf, 0x87, 0xd5, 0x06, 0x53, 0x41, 0xac, 0xb9, 0xd4, 0x29, 0xea, 0x56, 0x38, 0x93, 0x2b, 0x5b, 0x0c, 0xa6, 0x83, 0xdd, 0x29, 0xa8, 0xb5, 0xe3, 0x88, 0x7c, 0xa6, 0x0d, 0x58, 0x68, 0x11, 0x79, 0x4d, 0x1c, 0x7b, 0xe6, 0x3a, 0xf0, 0x6a, 0x1a, 0xe2, 0x6e, 0xd2, 0x82, 0x0c, 0x10, 0xd0, 0x19, 0xd5, 0x4a, 0x9a, 0x8a, 0x4a, 0xcb, 0xb7, 0x99, 0x36, 0x01, 0x6b, 0xbf, 0x39, 0xdb, 0x76, 0x14, 0x1a, 0xd2, 0xfe, 0x73, 0x5e, 0x2a, 0xc9, 0xd8, 0x1a, 0x75, 0xaf, 0x0c, 0x05, 0x5a, 0x4f, 0x85, 0xd1, 0x94, 0x02, 0x87, 0xbc, 0x3d, 0x0d, 0x90, 0x62, 0x4d, 0x1b, 0xf3, 0xd5, 0x5e, 0xea, 0xc3, 0xef, 0xb2, 0x44, 0xf2, 0xe7, 0x76, 0x31, 0xba, 0x23, 0x48, 0x6b, 0x3c, 0x4d, 0xf8, 0x12, 0x68, 0xa9, 0x8b, 0xa1, 0x1c, 0xa6, 0x86, 0x21, 0x90, 0xb3, 0x69, 0x9c, 0xf1, 0x53, 0x79, 0xd5, 0x4c, 0x74, 0xc2, 0x36, 0xae, 0xfd, 0x5d, 0x0a, 0x8a, 0xa6, 0xef, 0xec, 0x5a, 0x0c, 0x72, 0x7f, 0x89, 0x05, 0x38, 0x60, 0x91, 0x30, 0x2c, 0x59, 0x61, 0xd1, 0x5c, 0xd8, 0x01, 0xdc, 0xb4, 0x9f, 0x78, 0x50, 0x0c, 0xbc, 0xee, 0xc6, 0x66, 0xbc, 0x0e, 0x4a, 0x70, 0x1c, 0xae, 0x69, 0x51, 0x00, 0xb2, 0x8b, 0xa1, 0x27, 0x2d, 0x84, 0xb9, 0x1f, 0xca, 0x65, 0x2e, 0xb5, 0x6b, 0x98, 0x98, 0xb0, 0x0f, 0x2c, 0x98, 0xbf, 0xf9, 0x6d, 0x19, 0xaf, 0x0f, 0xb8, 0xd5, 0xe1, 0x80, 0x8d, 0x1b, 0xfc, 0xa9, 0xe6, 0xd0, 0xdf, 0x3a, 0xc7, 0xb5, 0xda, 0x94, 0x17, 0xe7, 0x1d, 0x76, 0xae, 0xac, 0x70, 0xd9, 0xaf, 0x6c, 0x25, 0x18, 0x18, 0xfe, 0x4b, 0x54, 0x97, 0x26, 0x25, 0x17, 0xa0, 0x5b, 0xdb, 0x37, 0xbc, 0xcd, 0x6e, 0xfe, 0x24, 0xa6, 0xf1, 0x87, 0x8e, 0x90, 0xf7, 0x6b, 0x47, 0x78, 0x48, 0x9e, 0x82, 0x92, 0xd8, 0x93, 0xf0, 0x9e, 0xf9, 0xa7, 0x90, 0x69, 0xcf, 0xbc, 0xc9, 0x96, 0x04, 0x24, 0xb6, 0x9e, 0xbe, 0xc2, 0xc1, 0x16, 0xce, 0x6b, 0x73, 0x31, 0x2b, 0x92, 0x8a, 0x85, 0x9e, 0x25, 0x4c, 0x12, 0xbe, 0xb2, 0x1c, 0x80, 0x1f, 0xce, 0x4b, 0xa8, 0xc7, 0xb7, 0x30, 0x56, 0xe1, 0x38, 0x7b, 0x4d, 0xb6, 0xcd, 0xc6, 0x8c, 0xd8, 0x08, 0x6d, 0xd0, 0xa0, 0x33, 0xa0, 0x5a, 0xdb, 0x37, 0xb6, 0xf2, 0xc1, 0xbd, 0xc4, 0x2c, 0x27, 0x92, 0x6f, 0xea, 0xf5, 0x50, 0xfe, 0x22, 0xd9, 0x3b, 0xb4, 0xe2, 0x3d, 0x69, 0x5c, 0x91, 0x77, 0x26, 0x25, 0x77, 0x40, 0x96, 0xb0, 0x80, 0x68, 0x9c, 0x68, 0x3c, 0xc8, 0xfb, 0x12, 0x2b, 0x77, 0xbb, 0xa4, 0x38, 0x41, 0xcf, 0x5b, 0x83, 0x54, 0xf4, 0x08, 0x63, 0x3d, 0xdc, 0xab, 0xac, 0x13, 0x8c, 0x42, 0x2d, 0xf2, 0x03, 0xe3, 0x7d, 0xab, 0x1c, 0x09, 0xf8, 0xba, 0xb5, 0x2c, 0x04, 0x79, 0x11, 0x94, 0x99, 0x93, 0x7b, 0x6e, 0x00, 0xba, 0x2c, 0x20, 0xda, 0x9d, 0x6f, 0xda, 0x65, 0x14, 0x03, 0x6d, 0xfb, 0x9e, 0xc1, 0x61, 0xdb, 0x0e, 0x7e, 0x41, 0x2c, 0x81, 0x33, 0x3a, 0x3f, 0x93, 0x5c, 0xe5, 0x15, 0xd3, 0x9d, 0x60, 0x21, 0x74, 0xab, 0xa3, 0x4e, 0x45, 0x6a, 0x11, 0x44, 0xe3, 0x53, 0x4e, 0xe7, 0x2c, 0x19, 0x51, 0x21, 0xf8, 0x8c, 0xba, 0xe2, 0x04, 0xbd, 0x65, 0x65, 0x2f, 0x63, 0x3f, 0xb4, 0xe9, 0x7d, 0x58, 0x6e, 0xe8, 0x39, 0x3a, 0xc8, 0x1c, 0x15, 0x7a, 0xd2, 0xe6, 0x44, 0x8c, 0xfc, 0x85, 0x53, 0xdb, 0xd8, 0xd1, 0x0c, 0x19, 0x21, 0x2b, 0x9b, 0xd4, 0xfd, 0xb4, 0xef, 0x4b, 0x7f, 0xbd, 0x63, 0x7f, 0x70, 0x7f, 0x9e, 0x8d, 0x4f, 0x0c, 0xb7, 0x3a, 0x96, 0x86, 0x9d, 0xd0, 0x3f, 0x8f, 0xb7, 0x29, 0x87, 0x00, 0xc7, 0x09, 0xf2, 0xde, 0x14, 0xb1, 0x8f, 0x8a, 0xc8, 0xb0, 0x7d, 0x37, 0x97, 0xfd, 0xae, 0xa1, 0xa1, 0x43, 0xeb, 0xfd, 0x9a, 0x7c, 0x18, 0x2b, 0x28, 0xc1, 0xba, 0x33, 0x8c, 0x60, 0xb6, 0xef, 0x85, 0x30, 0x5b, 0x05, 0x71, 0x21, 0xa3, 0x19, 0xb6, 0x17, 0xb6, 0x40, 0x60, 0xf9, 0xb0, 0xb7, 0x0c, 0x04, 0xa4, 0xd5, 0x04, 0x66, 0xe1, 0x3e, 0xab, 0x08, 0x74, 0x5a, 0x1c, 0xab, 0xee, 0x05, 0x0e, 0x36, 0x67, 0x88, 0xfb, 0x4e, 0xc2, 0xc8, 0x81, 0x28, 0x33, 0xbe, 0x08, 0x9b, 0xff, 0x27, 0xa5, 0x7a, 0x83, 0x7d, 0x3e, 0x20, 0x78, 0x25, 0xef, 0x4c, 0x75, 0xea, 0xad, 0x30, 0xb5, 0xaa, 0x29, 0xc4, 0x1b, 0x4f, 0xf7, 0x60, 0x73, 0x01, 0xf0, 0x8a, 0xfb, 0x9b, 0xd5, 0x0d, 0x22, 0x5b, 0x35, 0x4b, 0x8f, 0xdd, 0x90, 0xd3, 0x65, 0x4a, 0xbc, 0x36, 0xc6, 0xcd, 0x88, 0x17, 0x96, 0x46, 0xa0, 0x82, 0x81, 0x43, 0xb0, 0x7f, 0x3f, 0x2c, 0xcc, 0xe6, 0x16, 0xbd, 0x10, 0x74, 0xa1, 0xb9, 0x83, 0x1f, 0xd1, 0xdd, 0x41, 0xa7, 0x31, 0x13, 0xda, 0x6e, 0x6e, 0xe9, 0xf5, 0x89, 0x16, 0x41, 0x39, 0x17, 0xa0, 0x4a, 0x6d, 0xd1, 0xad, 0xaf, 0xdd, 0xe3, 0x8d, 0x0e, 0x00, 0xfb, 0x05, 0xab, 0x59, 0x9f, 0x4f, 0x66, 0x9b, 0xc3, 0x63, 0xea, 0x10, 0x9b, 0x75, 0x28, 0x3b, 0xae, 0xbf, 0x04, 0xbd, 0x2c, 0x80, 0x4d, 0x75, 0x81, 0x45, 0xf3, 0xeb, 0x2a, 0x67, 0x74, 0xef, 0xc7, 0xd5, 0x98, 0x7d, 0x72, 0x13, 0x5e, 0xe4, 0x50, 0x83, 0x36, 0x27, 0x65, 0xe4, 0x70, 0xa4, 0xad, 0x18, 0xf5, 0xf3, 0x68, 0x2a, 0x35, 0x11, 0xb5, 0x8f, 0x60, 0xbe, 0x62, 0xac, 0xd9, 0x23, 0x03, 0x99, 0xe8, 0xb8, 0x41, 0x25, 0xaf, 0x65, 0x75, 0x1a, 0x5f, 0xe8, 0x76, 0xc2, 0xab, 0x76, 0xae, 0xa9, 0x7d, 0xa5, 0x74, 0xa5, 0xe8, 0x89, 0x96, 0x14, 0x5f, 0x1d, 0x34, 0x65, 0x24, 0xe5, 0xd5, 0xda, 0x02, 0xd2, 0xb4, 0x8b, 0x3f, 0x66, 0x5b, 0xaf, 0xcd, 0x18, 0x73, 0x17, 0xc0, 0xfa, 0xdb, 0xfb, 0x05, 0x99, 0xf7, 0xf9, 0x50, 0x25, 0x4b, 0x5b, 0x56, 0xd2, 0x48, 0x99, 0x3d, 0x7d, 0x65, 0x1e, 0x50, 0x93, 0x72, 0x4f, 0xf8, 0x2f, 0x29, 0xca, 0xe7, 0x82, 0x07, 0xeb, 0x97, 0x78, 0x5a, 0x95, 0xf3, 0x98, 0x9a, 0x2f, 0x54, 0x2d, 0xfc, 0xec, 0xae, 0xa3, 0x45, 0x50, 0x0c, 0x33, 0xdc, 0xf0, 0x39, 0xc3, 0x24, 0x79, 0xc0, 0x07, 0x08, 0xf3, 0x17, 0xed, 0xd8, 0x47, 0x18, 0x38, 0x53, 0xff, 0xb0, 0x6a, 0x05, 0x4e, 0xdb, 0xe8, 0xd3, 0x50, 0xd0, 0x59, 0xd4, 0x92, 0x78, 0x4f, 0x62, 0xd5, 0x25, 0x29, 0x71, 0x0f, 0x81, 0x38, 0x20, 0xb3, 0xc5, 0x20, 0x8e, 0x32, 0x2b, 0x81, 0xef, 0xc2, 0xa5, 0xd7, 0xdf, 0x5e, 0xcf, 0x9f, 0xf5, 0x0e, 0x22, 0xbc, 0x9c, 0x68, 0x6b, 0x18, 0x1e, 0x57, 0x7c, 0x8e, 0x02, 0x1b, 0x22, 0x08, 0x98, 0x91, 0x57, 0xe4, 0xd2, 0xb5, 0xb8, 0x9d, 0x55, 0x65, 0x39, 0xa7, 0xd0, 0x68, 0x17, 0x9a, 0x8d, 0xae, 0x0e, 0x93, 0x46, 0xd9, 0xcd, 0xd7, 0x39, 0xfd, 0xa7, 0xba, 0x7e, 0xa4, 0x8b, 0xc0, 0x99, 0x16, 0x36, 0x01, 0x4c, 0xd7, 0xa7, 0xd2, 0xaf, 0x70, 0xd3, 0xa1, 0x82, 0x72, 0x9b, 0x21, 0xc1, 0xb9, 0xfb, 0xa8, 0x79, 0xee, 0x84, 0xd5, 0xdb, 0x4f, 0x0c, 0x75, 0x8e, 0xb3, 0xa4, 0xa7, 0x4a, 0xc8, 0xca, 0x3f, 0xa3, 0xa0, 0xe0, 0x69, 0x22, 0x6c, 0xdd, 0x8f, 0x9a, 0x87, 0x43, 0x7c, 0xb9, 0xb6, 0x51, 0xc1, 0xde, 0xae, 0x79, 0x57, 0x2a, 0xd6, 0x14, 0x87, 0xda, 0x4f, 0x55, 0x07, 0xd4, 0x32, 0x7b, 0x66, 0x7f, 0x18, 0x4b, 0xa9, 0xd8, 0xe0, 0xbe, 0x37, 0xc3, 0xac, 0xf7, 0xf2, 0x9e, 0x2d, 0x77, 0xa7, 0x1c, 0x21, 0x94, 0xa8, 0x51, 0x19, 0x27, 0xb7, 0x09, 0x80, 0x86, 0x26, 0x5e, 0xd9, 0xb2, 0x3d, 0x8a, 0x48, 0xd1, 0xdc, 0xf9, 0x54, 0xde, 0x61, 0xa3, 0xeb, 0x9f, 0xcc, 0x98, 0xa6, 0xd7, 0x22, 0xdc, 0x4f, 0xbe, 0x0f, 0x76, 0xa1, 0xae, 0xce, 0xc4, 0x4e, 0x1f, 0x4e, 0x11, 0x47, 0xd5, 0x8d, 0x69, 0x37, 0x58, 0x48, 0xac, 0x50, 0xa5, 0xd7, 0xe2, 0x4b, 0x23, 0x53, 0xce, 0xaa, 0xd8, 0xf9, 0xc6, 0x41, 0xdd, 0xd3, 0xc2, 0xf4, 0x0f, 0x95, 0xb2, 0xc2, 0x08, 0xc5, 0x15, 0x03, 0x4e, 0x1e, 0xc7, 0xed, 0xc9, 0x37, 0x1a, 0x5d, 0x7b, 0x60, 0x29, 0xd5, 0x6b, 0xcc, 0x69, 0xc0, 0xe2, 0xf6, 0x81, 0xfe, 0xda, 0x3d, 0x5c, 0x9c, 0xb4, 0xd1, 0x7c, 0xe3, 0x29, 0xd3, 0x91, 0x95, 0x83, 0xb8, 0x4a, 0x73, 0x0d, 0xef, 0x6b, 0x02, 0xc8, 0xc3, 0x20, 0x8f, 0x5f, 0x82, 0x90, 0x71, 0x5d, 0xdf, 0xb6, 0x8e, 0x9e, 0x95, 0x6c, 0x21, 0x03, 0x4d, 0xc9, 0xba, 0x6a, 0xc2, 0xad, 0x86, 0xde, 0x23, 0x9a, 0xd0, 0x0a, 0xb9, 0xc6, 0xc8, 0xf4, 0xc9, 0x6e, 0x83, 0xe8, 0xbc, 0x6c, 0x44, 0xb1, 0x7d, 0x0c, 0xfa, 0x10, 0x23, 0x1c, 0x09, 0x66, 0xd0, 0x42, 0x4d, 0xb4, 0xd8, 0x93, 0x5c, 0xc5, 0x26, 0x60, 0x0c, 0xaa, 0xdc, 0x53, 0x36, 0x67, 0x3a, 0xbb, 0xb9, 0xec, 0xc1, 0x25, 0xc1, 0x47, 0x98, 0x2c, 0x49, 0x17, 0x2e, 0x92, 0xde, 0x44, 0x21, 0x8f, 0xa6, 0xed, 0x5f, 0x68, 0xa2, 0xa2, 0x8b, 0x44, 0x30, 0xd4, 0xa2, 0x3c, 0xd4, 0x89, 0xde, 0xb1, 0x37, 0x54, 0xda, 0xe2, 0x70, 0x85, 0xf8, 0xbd, 0x83, 0x9d, 0x00, 0xf6, 0x27, 0x05, 0x09, 0x57, 0xcd, 0xff, 0x9d, 0x57, 0xdd, 0xdc, 0x18, 0xed, 0x43, 0x70, 0x51, 0xa6, 0x2a, 0xc3, 0x7c, 0xf6, 0x07, 0x09, 0x4f, 0xcb, 0xda, 0xd4, 0x64, 0x68, 0xb1, 0x89, 0xdf, 0x71, 0x6d, 0x10, 0x50, 0x42, 0xc8, 0xd0, 0xdb, 0x85, 0x97, 0xdb, 0x96, 0x04, 0x4d, 0x65, 0x32, 0xbb, 0xc1, 0x7b, 0xde, 0x32, 0x31, 0xf2, 0x68, 0x0a, 0x86, 0x9d, 0xa5, 0xd5, 0xd9, 0xc3, 0x14, 0x2b, 0x37, 0xcf, 0xbe, 0xfa, 0xa1, 0x4a, 0x60, 0x1d, 0x57, 0x07, 0xcc, 0x30, 0x57, 0x9d, 0x8d, 0xa3, 0x20, 0x1a, 0xca, 0x0e, 0xbb, 0xf6, 0x6d, 0xc4, 0xfc, 0x46, 0x83, 0xab, 0x06, 0x32, 0xe6, 0x4b, 0x0d, 0xa9, 0x1a, 0x24, 0x60, 0x54, 0x76, 0x45, 0xa6, 0xc8, 0x84, 0x1a, 0x67, 0xff, 0xaa, 0x86, 0xcf, 0x09, 0x09, 0x31, 0xaf, 0xff, 0xa5, 0x24, 0xc5, 0x39, 0xc6, 0x93, 0x3d, 0xc0, 0x9f, 0xf9, 0x77, 0x06, 0x2e, 0x6b, 0x0b, 0xd5, 0x63, 0x25, 0x0b, 0x86, 0x84, 0x6a, 0x88, 0x73, 0xd0, 0x8b, 0x57, 0xaf, 0x63, 0x45, 0x14, 0xf4, 0x59, 0x4f, 0x68, 0xdc, 0x36, 0x34, 0x88, 0x54, 0x86, 0x5f, 0xfe, 0x4e, 0xc0, 0x74, 0xac, 0xb7, 0x70, 0xe7, 0x0e, 0xa9, 0x95, 0xc7, 0xbf, 0xe1, 0x48, 0xda, 0x3f, 0x73, 0x9f, 0xef, 0xf3, 0xbc, 0xd1, 0x70, 0x6d, 0x99, 0x9b, 0x37, 0xee, 0xd6, 0xe2, 0xa2, 0x29, 0xea, 0x99, 0xea, 0x4a, 0xe1, 0xe5, 0xb0, 0x37, 0x99, 0x7f, 0xd9, 0x16, 0x31, 0x5b, 0x9c, 0x0f, 0xbf, 0x87, 0xd9, 0x53, 0x41, 0x55, 0xad, 0x5d, 0xd7, 0xbc, 0x43, 0x78, 0x2f, 0xfc, 0xed, 0x81, 0x40, 0x81, 0x73, 0xee, 0x3b, 0x0a, 0xab, 0x0f, 0xbe, 0x0a, 0x49, 0x94, 0x4b, 0x4e, 0xf9, 0x50, 0xfa, 0xe1, 0xab, 0x3c, 0x6a, 0x2d, 0x2e, 0xbf, 0xfd, 0x62, 0x01, 0x2c, 0x45, 0x1c, 0x66, 0x8d, 0xb9, 0x40, 0xb7, 0x9f, 0xad, 0x26, 0xfd, 0x1d, 0x81, 0xfe, 0xbf, 0x41, 0x18, 0x6c, 0x18, 0x89, 0x8b, 0x76, 0x0c, 0xb7, 0x1f, 0xa0, 0x1c, 0x1b, 0x75, 0x55, 0x18, 0x14, 0x01, 0x89, 0x35, 0xd5, 0xbd, 0x9d, 0x60, 0x65, 0x1f, 0x83, 0xd1, 0xe9, 0x48, 0x22, 0xe2, 0x26, 0x7e, 0xfc, 0x22, 0x42, 0xdc, 0x0e, 0xa5, 0xca, 0x48, 0xf7, 0x9f, 0xfa, 0xa6, 0x5d, 0x31, 0x38, 0x4b, 0x8d, 0x83, 0xe1, 0xb5, 0x61, 0x13, 0x48, 0x79, 0x67, 0x4d, 0xfc, 0x7c, 0x3f, 0x5b, 0x4a, 0x66, 0x45, 0x3e, 0x03, 0x54, 0x71, 0x1e, 0x80, 0xce, 0x7b, 0xde, 0xe2, 0xf8, 0x42, 0xf4, 0x9e, 0x0c, 0x6e, 0x78, 0x3a, 0x07, 0x54, 0x7a, 0x51, 0xa3, 0x1b, 0x99, 0xdd, 0x86, 0x1d, 0xd1, 0xb6, 0xb9, 0x90, 0x95, 0x55, 0x5b, 0x66, 0x1e, 0xde, 0x97, 0x71, 0x02, 0x5e, 0xd3, 0xcb, 0x08, 0x50, 0x2a, 0x75, 0x3b, 0x67, 0x1d, 0x3e, 0x3d, 0x87, 0x85, 0xe7, 0xde, 0x14, 0xcc, 0x84, 0xed, 0x70, 0x5d, 0x25, 0x4f, 0xbf, 0x59, 0xb6, 0x4d, 0xee, 0x8c, 0x24, 0x32, 0xf3, 0x9f, 0xc2, 0x16, 0x56, 0x8f, 0xea, 0xf5, 0xf0, 0x5e, 0xe7, 0x04, 0xf3, 0x08, 0x12, 0x44, 0x2a, 0xb8, 0x3c, 0x57, 0x82, 0x3c, 0x4c, 0x93, 0xca, 0xb6, 0x29, 0x55, 0xb7, 0x95, 0xdb, 0x97, 0x2b, 0xc4, 0xed, 0xc5, 0xb6, 0x21, 0x15, 0xcd, 0x5e, 0x31, 0x17, 0x76, 0x9b, 0x12, 0xe6, 0xf2, 0xa6, 0xb1, 0x0c, 0xb6, 0xf3, 0x3d, 0x4d, 0x89, 0xfc, 0xdb, 0x87, 0xdb, 0x41, 0x9b, 0xdd, 0x59, 0x8d, 0xaa, 0x14, 0xbe, 0x7a, 0xca, 0x3d, 0xec, 0x37, 0x00, 0x95, 0x3b, 0x89, 0x8c, 0xa9, 0x11, 0x10, 0x1e, 0xbe, 0xb3, 0xcc, 0x47, 0x6f, 0x5a, 0xe0, 0x2e, 0x98, 0x8a, 0x95, 0x84, 0x73, 0x9f, 0xa1, 0xba, 0x01, 0xa9, 0xaa, 0x71, 0xac, 0x79, 0x06, 0x32, 0x2a, 0xfc, 0xc5, 0x5f, 0xa4, 0xc8, 0xf1, 0x69, 0x18, 0xf5, 0x14, 0x44, 0xfc, 0x2e, 0xfb, 0x18, 0x24, 0x07, 0xba, 0x3a, 0xe5, 0x91, 0xf0, 0x5a, 0x7b, 0x2d, 0x4c, 0xfe, 0xa8, 0x9d, 0x50, 0x2f, 0x9e, 0x61, 0x55, 0x71, 0x1f, 0x40, 0xd0, 0xf9, 0xe3, 0x25, 0xd3, 0x1b, 0x3a, 0x2c, 0xd7, 0x02, 0xf2, 0xfd, 0xb8, 0xa3, 0x7b, 0x59, 0x01, 0xf3, 0x49, 0xf2, 0x6a, 0x58, 0x7a, 0x80, 0x9f, 0x5e, 0xb9, 0x11, 0x43, 0xac, 0x62, 0xa0, 0x35, 0x36, 0xe6, 0xea, 0x12, 0xb4, 0x72, 0x7d, 0xfb, 0x52, 0xcb, 0x12, 0x98, 0xa9, 0x7d, 0x1c, 0x5c, 0xee, 0x34, 0xa1, 0x0b, 0x69, 0x6a, 0x49, 0x7a, 0x29, 0x42, 0xb5, 0x97, 0xf7, 0xb4, 0x11, 0xa8, 0x88, 0xeb, 0xed, 0xd8, 0xf7, 0xeb, 0x48, 0xef, 0x72, 0x77, 0xee, 0x61, 0x33, 0x32, 0x05, 0x8a, 0xb1, 0x04, 0xe2, 0x38, 0x18, 0xbf, 0x21, 0x6a, 0xf7, 0x03, 0xf4, 0x57, 0x39, 0x5f, 0xbb, 0xb2, 0x57, 0xb8, 0xd5, 0x2d, 0xcc, 0xef, 0xb6, 0x3c, 0xc8, 0xbe, 0x3a, 0x1b, 0x28, 0xe3, 0x39, 0x12, 0xa6, 0x81, 0x5c, 0xf8, 0x4d, 0xc3, 0x2f, 0xf6, 0x31, 0xc2, 0x77, 0x8d, 0x5c, 0xa9, 0xc5, 0xda, 0x0b, 0x17, 0x4b, 0x19, 0x1b, 0xc4, 0xef, 0x69, 0xbe, 0x68, 0x9e, 0xce, 0x72, 0xd8, 0xe3, 0x7c, 0x34, 0x72, 0xb8, 0x53, 0xf0, 0xbc, 0x9c, 0xa6, 0x3d, 0x48, 0xe5, 0x40, 0x47, 0xdb, 0x58, 0xa9, 0x0c, 0xcd, 0xf7, 0xa5, 0xcc, 0xb3, 0x1a, 0xfe, 0xba, 0x3c, 0xc1, 0x83, 0xf8, 0x59, 0x29, 0x51, 0xc2, 0xa1, 0x9d, 0x51, 0xea, 0xf3, 0x8f, 0x02, 0x84, 0x5d, 0xe7, 0x79, 0xe2, 0x3c, 0x9b, 0xa6, 0xc3, 0xa5, 0x80, 0xd8, 0xc7, 0x04, 0x60, 0x83, 0x26, 0x03, 0x4c, 0x42, 0xa2, 0xae, 0x33, 0x18, 0xba, 0xd4, 0xb4, 0xfb, 0x21, 0xb0, 0x31, 0x93, 0x6e, 0xc8, 0x25, 0x3f, 0x15, 0x16, 0xb7, 0x59, 0x96, 0x66, 0x8f, 0xbb, 0xf4, 0xff, 0xe8, 0x81, 0x69, 0x85, 0xe6, 0x11, 0x58, 0x1e, 0x2a, 0x59, 0x83, 0xd4, 0xa5, 0x58, 0x7e, 0x3b, 0xa9, 0xe0, 0x64, 0x53, 0x46, 0x9a, 0xc8, 0xaf, 0xd3, 0x4a, 0xee, 0xd7, 0xcb, 0x54, 0x3b, 0xec, 0xdb, 0x80, 0xeb, 0x8a, 0x38, 0xfa, 0x02, 0xf2, 0x36, 0x9d, 0x85, 0x69, 0x17, 0x70, 0xe9, 0xdb, 0x20, 0x71, 0xcc, 0xc4, 0xf3, 0x92, 0xe3, 0x51, 0x18, 0x02, 0x34, 0xc2, 0xdd, 0xad, 0x85, 0x12, 0x60, 0x06, 0x14, 0xda, 0xea, 0x04, 0x88, 0x73, 0x7e, 0x6a, 0x28, 0x5a, 0xb2, 0x4c, 0x4b, 0xd9, 0xbe, 0xcf, 0x0f, 0xe4, 0xd3, 0x30, 0x4e, 0x42, 0xae, 0x08, 0xce, 0xed, 0x6c, 0xce, 0xb8, 0xba, 0xa0, 0x9d, 0x4c, 0x3c, 0xa3, 0x37, 0xd2, 0xe6, 0x2b, 0x4b, 0xd4, 0x71, 0x1f, 0xf3, 0x8a, 0x7d, 0xaa, 0x81, 0x96, 0x7b, 0x8f, 0x7b, 0xf2, 0xca, 0xbc, 0xe4, 0x26, 0x20, 0x21, 0xbd, 0xbe, 0x2c, 0xc2, 0xcc, 0xfb, 0x7a, 0x0b, 0x9c, 0xc9, 0x96, 0x64, 0xc5, 0xf1, 0x74, 0x06, 0x6d, 0x90, 0x0f, 0x0d, 0x0f, 0xc8, 0x51, 0xce, 0x7c, 0xb5, 0x33, 0x6a, 0x1f, 0xa2, 0x25, 0xa4, 0x84, 0x7d, 0xb0, 0xef, 0x1c, 0x89, 0x5a, 0xcb, 0x3a, 0x53, 0xca, 0x52, 0x62, 0xe7, 0x2c, 0x0e, 0xc3, 0x43, 0xd7, 0x0e, 0x02, 0x0c, 0x2d, 0x39, 0x39, 0x80, 0xc3, 0xe2, 0x40, 0xac, 0xc3, 0x9c, 0x2b, 0xdf, 0x8e, 0x4f, 0x13, 0x5e, 0xa5, 0x8b, 0x1a, 0x59, 0xc9, 0x1d, 0xa9, 0x1e ],
+const [ 0x9c, 0x4a, 0xe2, 0x21, 0x7c, 0x92, 0x8d, 0xd5, 0x86, 0x48, 0x36, 0xbe, 0x5d, 0x4e, 0xc2, 0x81, 0x21, 0x14, 0x71, 0xaa, 0x44, 0x1a, 0x59, 0x4b, 0x99, 0xb0, 0x13, 0xe5, 0xae, 0x01, 0xb4, 0x8c, 0x5c, 0x4f, 0xfe, 0x47, 0x9c, 0x80, 0xd8, 0xb6, 0x9c, 0xda, 0xfc, 0xf7, 0x13, 0x0b, 0xf0, 0xc9, 0xd1, 0x6c, 0x37, 0xf2, 0x9a, 0x86, 0xc8, 0xdf, 0x34, 0xd6, 0xbf, 0x8b, 0xbf, 0xcd, 0x53, 0xa2, 0x45, 0x1b, 0x08, 0xe5, 0x92, 0x2d, 0x25, 0xd0, 0x46, 0xf4, 0x69, 0x7a, 0x28, 0xe9, 0xfa, 0xbe, 0xbd, 0x4e, 0x9e, 0x98, 0x1a, 0xb6, 0x2d, 0xd1, 0xf6, 0xc7, 0x47, 0xdf, 0x03, 0x3f, 0x42, 0x07, 0x7f, 0x35, 0x66, 0xc4, 0x05, 0xa2, 0x5d, 0x6c, 0xaa, 0x1f, 0xe5, 0x11, 0x45, 0xf0, 0xc8, 0xa5, 0x0e, 0x42, 0x0e, 0x62, 0x6b, 0xb1, 0x71, 0x69, 0x06, 0x0d, 0x11, 0xaa, 0x23, 0x5e, 0x69, 0x03, 0x31, 0x25, 0x82, 0xac, 0x9e, 0xe5, 0x66, 0xd2, 0xf0, 0xe2, 0xd8, 0x82, 0x12, 0x29, 0x42, 0xc9, 0xeb, 0xd0, 0xef, 0x1a, 0x35, 0x7f, 0x7a, 0xef, 0x8d, 0x30, 0x87, 0xb3, 0xc6, 0x32, 0xb0, 0xe0, 0x83, 0x74, 0xc3, 0x65, 0x05, 0x00, 0x2a, 0x4a, 0x41, 0xc6, 0xaa, 0x96, 0x36, 0x9b, 0x51, 0x71, 0x7d, 0x81, 0xa9, 0x86, 0x22, 0x29, 0x32, 0xab, 0xb2, 0xb6, 0x0f, 0xc4, 0x95, 0xc4, 0x00, 0xe4, 0x9e, 0xa9, 0x90, 0xb6, 0xe1, 0xfa, 0x90, 0x1c, 0xc5, 0x52, 0xc3, 0x15, 0x5a, 0x4e, 0xdb, 0xe4, 0xec, 0xdc, 0xa4, 0x6f, 0xd8, 0xb6, 0x80, 0xe5, 0x9e, 0x29, 0x13, 0xa3, 0x38, 0x1b, 0x3f, 0x59, 0xaa, 0x4c, 0x53, 0x68, 0xdb, 0xdc, 0x7f, 0x8f, 0xa3, 0x0e, 0x8c, 0xc7, 0x25, 0x4b, 0xc9, 0x6b, 0x5f, 0x6a, 0x49, 0x9c, 0xff, 0x2e, 0x4b, 0xe4, 0x78, 0x10, 0xfa, 0x19, 0x56, 0x3f, 0x57, 0x85, 0xce, 0xe6, 0x73, 0x43, 0x9a, 0xad, 0xe1, 0xec, 0x04, 0x82, 0x6b, 0x74, 0x40, 0x99, 0x04, 0x4e, 0xfe, 0xb1, 0xfe, 0xd7, 0x40, 0x9a, 0x7d, 0xf1, 0x69, 0xf4, 0x2c, 0xee, 0x97, 0x39, 0x2e, 0xb1, 0x33, 0xfe, 0x58, 0x0f, 0xc7, 0x75, 0x9d, 0x7b, 0x0f, 0x37, 0xc9, 0xe3, 0x52, 0x40, 0x73, 0xd5, 0xf2, 0x3b, 0x2c, 0xe6, 0x43, 0x01, 0xfd, 0x54, 0x99, 0x5c, 0x11, 0xea, 0xa5, 0x10, 0xae, 0x24, 0x01, 0x1c, 0x6a, 0x94, 0x09, 0x3d, 0x9b, 0x84, 0xed, 0xb4, 0x0f, 0xdd, 0x04, 0x49, 0xfd, 0x48, 0x63, 0x90, 0x3c, 0x92, 0xaf, 0x6b, 0xb3, 0x55, 0x2f, 0xd0, 0x11, 0xd5, 0x25, 0xcc, 0xbe, 0x28, 0x5f, 0xc8, 0x11, 0x9a, 0x09, 0x0c, 0xc3, 0x4f, 0xc5, 0x81, 0xa3, 0x2a, 0xfe, 0xbb, 0x8c, 0xee, 0x78, 0x36, 0x94, 0xa3, 0x2c, 0xe0, 0x87, 0x3c, 0x54, 0xd8, 0x94, 0x76, 0xc2, 0x76, 0x45, 0x03, 0x75, 0x8b, 0xb5, 0xe8, 0x6e, 0xea, 0xfd, 0x24, 0xc0, 0x27, 0xef, 0x92, 0xe7, 0x9e, 0x07, 0x10, 0x5a, 0xb7, 0x9e, 0xe1, 0x64, 0x69, 0x61, 0x50, 0x2f, 0xfd, 0x02, 0x96, 0x22, 0x15, 0x2d, 0xfe, 0x6c, 0xec, 0xbe, 0x47, 0xe1, 0xdf, 0x31, 0x4a, 0x06, 0x2d, 0x59, 0xdd, 0x67, 0xfb, 0x55, 0xf6, 0x31, 0x9b, 0xc1, 0x14, 0xfc, 0x0d, 0x29, 0xda, 0xe9, 0xc6, 0xc3, 0xfd, 0xed, 0xb1, 0x5d, 0x61, 0x6c, 0x74, 0x94, 0x7f, 0x0a, 0xf4, 0x47, 0x0a, 0xbe, 0x1b, 0x4b, 0xd2, 0x28, 0xd9, 0x60, 0xe8, 0x24, 0x68, 0x64, 0x03, 0x9f, 0xd5, 0xc7, 0x22, 0xa9, 0xbc, 0x3f, 0x73, 0xcc, 0x53, 0xbd, 0x74, 0x9c, 0xa9, 0x9f, 0x58, 0x90, 0x30, 0x27, 0xac, 0x10, 0x7a, 0x2c, 0x3a, 0xcf, 0x40, 0x0f, 0x2e, 0x5b, 0xa8, 0xf1, 0x77, 0xf3, 0xc7, 0x23, 0x70, 0x98, 0x65, 0xde, 0xc0, 0x66, 0x01, 0x35, 0x7f, 0x25, 0x15, 0x47, 0x9a, 0x1c, 0x9c, 0xb9, 0x78, 0x25, 0xd0, 0x64, 0xdd, 0x07, 0x38, 0x4a, 0x0f, 0xff, 0xe2, 0xcf, 0x38, 0xa0, 0xee, 0x26, 0x0c, 0xde, 0x4c, 0x09, 0xab, 0x65, 0xc5, 0xad, 0xc9, 0x2f, 0x40, 0xf5, 0x0c, 0x55, 0x3e, 0xe6, 0xb5, 0x25, 0xa8, 0x5b, 0x83, 0x76, 0xca, 0xf9, 0xd4, 0x38, 0x9f, 0x66, 0x0e, 0x4f, 0x4f, 0xb6, 0x3d, 0xa2, 0xf6, 0x26, 0xfe, 0x6e, 0xa7, 0x0d, 0x9b, 0xe1, 0xb1, 0x0f, 0x77, 0xe4, 0x20, 0x94, 0xad, 0x38, 0x87, 0x78, 0xf4, 0xc4, 0xfd, 0x05, 0xc6, 0x2d, 0x66, 0x1e, 0xc1, 0xa8, 0xf4, 0xbc, 0x4d, 0x0c, 0xed, 0x9f, 0x7f, 0x2c, 0xae, 0x3d, 0x3d, 0x63, 0xf0, 0xff, 0xa3, 0x70, 0x4a, 0xac, 0xa6, 0x84, 0xf7, 0x25, 0xf7, 0x9a, 0xda, 0x54, 0x2a, 0x07, 0xbf, 0x5f, 0x18, 0x52, 0xe4, 0x21, 0x82, 0x45, 0xb8, 0xda, 0xf7, 0x44, 0xe2, 0x25, 0xf7, 0xde, 0x85, 0x2b, 0x58, 0xa2, 0xc2, 0x17, 0xe9, 0x34, 0x7f, 0xca, 0x56, 0xa0, 0x67, 0xcf, 0x4b, 0xed, 0x32, 0x91, 0xdc, 0xf6, 0x27, 0xcb, 0x25, 0x75, 0xdf, 0x41, 0x2d, 0x61, 0x4b, 0xae, 0x11, 0x7a, 0xf9, 0xfd, 0x5e, 0x22, 0x92, 0xbb, 0xbe, 0x6e, 0xa8, 0xcd, 0xd7, 0x7d, 0xae, 0x5e, 0x70, 0x08, 0x48, 0x1c, 0xd5, 0x3b, 0xc6, 0xa4, 0x7d, 0xc3, 0xea, 0x3a, 0xeb, 0x29, 0xf2, 0xbe, 0xd2, 0x5e, 0xd2, 0xdb, 0x7c, 0x97, 0xc2, 0x82, 0x6c, 0x5a, 0xf8, 0x97, 0x43, 0xd9, 0xb7, 0xea, 0xe0, 0x80, 0x88, 0x68, 0xcb, 0xca, 0xc8, 0x93, 0xd4, 0x58, 0x62, 0x2f, 0xf7, 0x44, 0xde, 0x3e, 0x83, 0xb3, 0x9b, 0x2f, 0x7c, 0xa9, 0x58, 0x53, 0x3d, 0x22, 0xf9, 0x90, 0x61, 0x5e, 0x88, 0x59, 0xe4, 0x7c, 0x7b, 0xdd, 0x86, 0x4a, 0x35, 0x7f, 0x70, 0x5c, 0xcf, 0x87, 0x1a, 0x5b, 0x17, 0x17, 0x6c, 0xa0, 0xd9, 0x60, 0x24, 0x01, 0x5e, 0x15, 0x77, 0xeb, 0x33, 0x20, 0xfb, 0xb2, 0x2b, 0x95, 0xc4, 0x24, 0xa7, 0xe4, 0xcd, 0x64, 0x15, 0x52, 0x9a, 0xf6, 0xb7, 0xaa, 0x1c, 0x16, 0xa6, 0x2f, 0xd5, 0x4e, 0x16, 0xd6, 0x3d, 0x47, 0xdb, 0xb2, 0x63, 0xe0, 0x2d, 0xb0, 0xd7, 0x7d, 0xa8, 0x84, 0xc8, 0xa1, 0x96, 0xe3, 0x6a, 0xc0, 0x71, 0xf3, 0x9a, 0x4e, 0xa4, 0x00, 0xc5, 0x1c, 0x92, 0x70, 0x06, 0xe4, 0xd9, 0xf9, 0x8e, 0x23, 0xd8, 0x11, 0x49, 0x26, 0x6f, 0xa6, 0xbf, 0x68, 0x05, 0x10, 0x38, 0x1b, 0xd0, 0x44, 0x23, 0x05, 0x50, 0x4a, 0xb8, 0x8d, 0x1d, 0xf1, 0xdd, 0x16, 0xe3, 0xc1, 0x46, 0x8b, 0xab, 0x31, 0xe1, 0x3b, 0x5c, 0x1a, 0x71, 0xe8, 0x81, 0x6c, 0x78, 0x1a, 0x4c, 0x20, 0x5b, 0xb9, 0xdb, 0x6d, 0xc1, 0xdb, 0xbb, 0x3f, 0x3c, 0xdb, 0xab, 0xe5, 0x2b, 0xab, 0xa2, 0x09, 0xdf, 0x6b, 0x13, 0xe6, 0xfc, 0x3a, 0x6f, 0xb5, 0x22, 0x4c, 0xec, 0x68, 0xcd, 0x3c, 0x85, 0x9b, 0x7a, 0xa4, 0x41, 0xc8, 0x0c, 0xec, 0xb9, 0xba, 0x6d, 0x5f, 0xd4, 0x44, 0x78, 0x84, 0xd6, 0x32, 0x17, 0xab, 0x99, 0x80, 0xa8, 0xc6, 0x19, 0xca, 0xa6, 0x7a, 0x37, 0x04, 0x85, 0x76, 0xb6, 0x6b, 0xdd, 0x04, 0x8a, 0xbb, 0xcb, 0xdd, 0x52, 0xa3, 0x95, 0x42, 0x23, 0x76, 0x8c, 0x48, 0x87, 0x23, 0x37, 0x74, 0xc5, 0x67, 0xad, 0x87, 0x63, 0x41, 0x43, 0x9b, 0xea, 0xa7, 0x67, 0x6f, 0xe9, 0x77, 0xcc, 0x00, 0x3c, 0xb0, 0xc8, 0x59, 0x8e, 0xe2, 0xfa, 0xab, 0x1d, 0xe3, 0x2f, 0xa0, 0xbd, 0xc4, 0x86, 0xed, 0x20, 0x03, 0xd3, 0x27, 0x54, 0x02, 0x42, 0xd7, 0x8d, 0xb8, 0x3d, 0xd0, 0x25, 0xa7, 0x8f, 0xc0, 0xe1, 0x0e, 0xc9, 0x06, 0x76, 0x5f, 0xe4, 0xc3, 0x4c, 0xf3, 0x29, 0x34, 0x81, 0xfd, 0x4e, 0x3f, 0x31, 0xbd, 0xe2, 0x4b, 0xf5, 0xf6, 0xeb, 0x55, 0xa9, 0xa1, 0xcd, 0x40, 0x73, 0xe3, 0x6d, 0x6d, 0x00, 0x3d, 0x97, 0x8c, 0x11, 0x03, 0x9d, 0xb2, 0x37, 0x0f, 0x41, 0xab, 0xda, 0xb6, 0xd5, 0x91, 0x80, 0xfb, 0xa1, 0x9d, 0x4c, 0x03, 0x85, 0x3e, 0xc5, 0xc9, 0xe0, 0x68, 0xda, 0x13, 0xb0, 0x2f, 0x22, 0xa5, 0xfa, 0x94, 0x68, 0xb4, 0x6c, 0x9f, 0x66, 0x9d, 0x41, 0xae, 0xd1, 0xd7, 0x65, 0x0c, 0x96, 0x26, 0xd9, 0xc5, 0x64, 0x12, 0x5a, 0xb9, 0x6a, 0x98, 0x3d, 0xf0, 0x62, 0x1f, 0x9e, 0x2d, 0xce, 0xae, 0xb9, 0xc6, 0x81, 0x5b, 0x98, 0xb2, 0x62, 0x07, 0xef, 0xe4, 0x6d, 0x48, 0x44, 0xd7, 0xfa, 0xa7, 0x52, 0x6b, 0x42, 0x0c, 0xb0, 0xef, 0x1f, 0x76, 0xae, 0x7f, 0x13, 0xef, 0x80, 0x90, 0x8c, 0xc0, 0x9e, 0xc9, 0x66, 0xe1, 0x6a, 0x15, 0xb2, 0xb3, 0x13, 0xf6, 0xb6, 0xf1, 0xba, 0x1c, 0x34, 0xe4, 0xd4, 0x36, 0xf0, 0xd7, 0xd0, 0x08, 0x6c, 0xcb, 0xf9, 0xbd, 0xf6, 0x6c, 0x9d, 0x7f, 0xe4, 0x43, 0x6f, 0x46, 0x1f, 0x2c, 0x2a, 0xed, 0xde, 0x0b, 0x77, 0x8b, 0xb4, 0xbb, 0x11, 0x00, 0xcd, 0x47, 0x27, 0xce, 0x75, 0x5d, 0x02, 0x2b, 0xd9, 0xff, 0xe7, 0x54, 0x12, 0x7c, 0x3f, 0x23, 0x5f, 0x9f, 0xf5, 0xe4, 0xb2, 0x26, 0x20, 0x65, 0x6f, 0x75, 0xe2, 0x4c, 0x70, 0x8c, 0x8f, 0xad, 0x4c, 0x37, 0x12, 0xdc, 0xd9, 0x84, 0x8d, 0x80, 0xef, 0x7a, 0x40, 0xe9, 0x6f, 0x08, 0xac, 0xa4, 0x84, 0x3c, 0xf8, 0x4c, 0x29, 0xb6, 0x93, 0xa2, 0xec, 0x5b, 0x1b, 0xe0, 0xf1, 0x4e, 0x7e, 0x4b, 0x39, 0x1c, 0x5f, 0x08, 0x24, 0x36, 0xbb, 0x30, 0x35, 0xa5, 0xcc, 0x27, 0x16, 0xf9, 0x2d, 0x29, 0xdc, 0x82, 0x40, 0x25, 0x8b, 0xc3, 0xcd, 0xcf, 0xdd, 0x24, 0xeb, 0xf1, 0x3f, 0xe7, 0x24, 0x01, 0x1d, 0x5d, 0xd4, 0xf9, 0x5f, 0x5a, 0xd2, 0x63, 0x34, 0xe6, 0x52, 0xb3, 0x0e, 0x35, 0x0a, 0xda, 0xee, 0xda, 0x94, 0x18, 0xe1, 0x37, 0x14, 0x12, 0xca, 0x38, 0x1a, 0x24, 0x63, 0x41, 0xca, 0xf8, 0x7f, 0x64, 0x3a, 0x58, 0x92, 0xd8, 0x1b, 0x40, 0x72, 0xa6, 0x9c, 0x38, 0x5f, 0xa6, 0x8b, 0xe0, 0x42, 0xaa, 0xbd, 0xcd, 0x32, 0xf9, 0xb1, 0x93, 0x3c, 0xff, 0x70, 0x23, 0x64, 0x42, 0xb7, 0x58, 0xe7, 0x98, 0x58, 0xcc, 0xc3, 0x98, 0xde, 0xf0, 0x79, 0x4e, 0x70, 0x5c, 0x12, 0x33, 0xf8, 0x63, 0x60, 0x5b, 0x84, 0xeb, 0x86, 0xf1, 0xec, 0x7b, 0xbb, 0xe1, 0xb5, 0x96, 0x4a, 0xd4, 0x35, 0x48, 0xdd, 0x61, 0xf8, 0xfe, 0xfc, 0x81, 0x63, 0x9b, 0xd1, 0x44, 0x97, 0xc7, 0x2e, 0xc3, 0x98, 0x8a, 0xd1, 0x56, 0xaf, 0x1b, 0xe6, 0x07, 0x0c, 0xf2, 0xcd, 0x46, 0xb0, 0x24, 0x1e, 0xde, 0x8a, 0xf0, 0xea, 0x27, 0xe0, 0x95, 0x44, 0x7d, 0xf1, 0x67, 0x00, 0xf2, 0xd9, 0x22, 0xbb, 0x40, 0xb4, 0x7e, 0x1c, 0x02, 0x06, 0x04, 0x58, 0x23, 0x5b, 0x1f, 0xfc, 0x96, 0x2a, 0x76, 0xe7, 0x47, 0xff, 0x79, 0x95, 0x52, 0xd9, 0x3a, 0xa4, 0x74, 0xd1, 0x7f, 0x90, 0xbe, 0xfd, 0x15, 0xc2, 0x91, 0x94, 0x67, 0xc9, 0xc6, 0x53, 0x4f, 0xe7, 0x2d, 0x1f, 0x2b, 0xcf, 0x39, 0xeb, 0x34, 0xad, 0xf9, 0xdc, 0x0b, 0x67, 0x4a, 0xab, 0x95, 0x22, 0x4c, 0x4c, 0x09, 0x09, 0x12, 0xcd, 0x47, 0x49, 0x9e, 0x80, 0x6c, 0x60, 0x0c, 0x5c, 0xa3, 0x98, 0x0d, 0xa1, 0x3e, 0xce, 0x97, 0xbb, 0x05, 0x78, 0xdb, 0x69, 0xcd, 0xe7, 0x78, 0x1e, 0x4d, 0xc9, 0xee, 0xa8, 0x2e, 0xf1, 0x55, 0x0f, 0x61, 0x5b, 0x4f, 0xc0, 0xb5, 0x6a, 0x3b, 0xea, 0xa9, 0x75, 0xab, 0x29, 0x7e, 0x82, 0x18, 0x62, 0x91, 0x51, 0xd5, 0xee, 0xe8, 0x9d, 0x42, 0xfa, 0x0b, 0x9e, 0x42, 0x2d, 0x15, 0xd2, 0xef, 0x8c, 0x0a, 0xfd, 0x8c, 0x9b, 0x6b, 0x6f, 0xba, 0xc5, 0x08, 0x85, 0xef, 0xfe, 0x16, 0x72, 0x25, 0xa7, 0x81, 0x3f, 0xcf, 0xb2, 0x84, 0x11, 0x11, 0x06, 0x76, 0xab, 0x30, 0x25, 0xe7, 0x33, 0x48, 0x0c, 0xeb, 0x39, 0x3d, 0x5b, 0xb6, 0xf5, 0xf3, 0xb5, 0x69, 0xd0, 0xc2, 0x6a, 0x2c, 0x27, 0x24, 0x53, 0x7d, 0x4b, 0xb1, 0xfe, 0xc7, 0xcc, 0x4e, 0x0b, 0x37, 0xf7, 0xa1, 0xd6, 0xcb, 0x9d, 0xc8, 0x57, 0xac, 0x16, 0x4a, 0x46, 0xbd, 0x86, 0x4d, 0x82, 0x74, 0x5f, 0x0a, 0xb3, 0xe9, 0x27, 0x7f, 0x2e, 0x2c, 0x7c, 0x63, 0x1a, 0xdc, 0x55, 0x5f, 0xd1, 0xf5, 0x8a, 0x7b, 0x89, 0xea, 0x97, 0xd7, 0x34, 0xf4, 0x9d, 0x9b, 0xa5, 0xa9, 0xa9, 0x30, 0xf3, 0xd0, 0x39, 0xb1, 0x22, 0x74, 0xfc, 0x9c, 0x00, 0x37, 0xda, 0xce, 0x4e, 0xe9, 0x34, 0xae, 0x20, 0x59, 0x6d, 0xa8, 0x87, 0x6b, 0xa9, 0xdd, 0x6c, 0x6b, 0xd4, 0x18, 0xbf, 0xa1, 0xe7, 0x04, 0xd2, 0x26, 0x66, 0x9d, 0xff, 0xf6, 0x2d, 0xe5, 0x91, 0x45, 0x6d, 0xd8, 0xe2, 0x17, 0xf2, 0xa1, 0xc0, 0x0b, 0xa7, 0x0e, 0x15, 0x77, 0x5b, 0x42, 0xc7, 0xba, 0xc5, 0xaa, 0xde, 0xce, 0xc6, 0x32, 0xe5, 0x1d, 0xef, 0xb8, 0x92, 0x96, 0x43, 0xc0, 0xa9, 0xff, 0x3e, 0x6a, 0x1d, 0x8d, 0x16, 0xa2, 0x78, 0xb2, 0x40, 0x97, 0x7e, 0x36, 0x36, 0x6e, 0x0d, 0x89, 0x78, 0x37, 0x48, 0x58, 0xd0, 0x20, 0xf5, 0x5e, 0xdb, 0xe8, 0x22, 0x7d, 0xc5, 0x97, 0x0f, 0x0d, 0x54, 0x6d, 0x48, 0x74, 0x28, 0x18, 0x12, 0xf6, 0x41, 0x2a, 0x08, 0xcf, 0xc1, 0xc9, 0x06, 0x7f, 0xf3, 0xa8, 0x46, 0x66, 0x8d, 0x37, 0xc9, 0x90, 0x32, 0x17, 0xf9, 0xd2, 0x3b, 0xd1, 0x8c, 0x16, 0xb7, 0xc7, 0xab, 0xf3, 0xb0, 0x6b, 0x54, 0x81, 0xb1, 0xae, 0xfd, 0x6b, 0x84, 0xbc, 0x7a, 0x45, 0x40, 0xe6, 0x20, 0x20, 0x84, 0xdf, 0x2b, 0x5c, 0xfd, 0x2c, 0x5d, 0xbe, 0x2e, 0xd6, 0xe8, 0xc2, 0x70, 0x62, 0x8e, 0x33, 0x37, 0x02, 0x07, 0xf8, 0x98, 0x0d, 0xa3, 0x31, 0x08, 0xad, 0x30, 0x83, 0x67, 0xd8, 0x1e, 0xaf, 0x3d, 0x81, 0xe1, 0x6a, 0x43, 0x0f, 0x97, 0x69, 0x25, 0x0e, 0xeb, 0xbb, 0x86, 0x24, 0x39, 0x5b, 0x44, 0x47, 0xf3, 0x06, 0xfe, 0x2e, 0x43, 0x4a, 0xd4, 0x05, 0xf1, 0xe0, 0x6e, 0x65, 0x88, 0x3b, 0x40, 0x83, 0xb4, 0x61, 0x0c, 0xa8, 0xef, 0xfa, 0xa8, 0xe1, 0x5c, 0xa6, 0x01, 0xf7, 0xf3, 0x94, 0x60, 0xa1, 0xdf, 0x51, 0xec, 0xf9, 0x24, 0xdd, 0x71, 0x2d, 0x85, 0x04, 0x5f, 0x77, 0xa5, 0xeb, 0x16, 0x4f, 0x6c, 0xea, 0x60, 0xdf, 0xac, 0x99, 0x3f, 0xb7, 0x05, 0x2e, 0xea, 0xc2, 0x06, 0x06, 0x12, 0x78, 0x94, 0x81, 0x69, 0x56, 0x90, 0x13, 0x65, 0x8b, 0xb4, 0x98, 0x41, 0xf5, 0xbe, 0xe8, 0x46, 0x4b, 0xd1, 0xac, 0x48, 0x9c, 0x18, 0x70, 0x73, 0xf8, 0xac, 0xf9, 0x48, 0x6d, 0xb8, 0xd8, 0xe2, 0x35, 0xdb, 0x3f, 0x7e, 0x2d, 0xcd, 0x14, 0x3a, 0x89, 0x46, 0x44, 0x1d, 0xc6, 0x1b, 0x5a, 0x58, 0xe1, 0xaa, 0x50, 0xcb, 0xc7, 0x79, 0xa4, 0xcb, 0x0c, 0x1a, 0xaf, 0x23, 0xdf, 0x52, 0x33, 0x58, 0x3e, 0x7a, 0x33, 0x32, 0x66, 0x24, 0x07, 0x77, 0x8e, 0x02, 0xaf, 0xfa, 0xd4, 0x04, 0x68, 0xd4, 0x78, 0xc1, 0x7d, 0xf2, 0x48, 0x18, 0x60, 0xd0, 0x5b, 0x17, 0xf9, 0x83, 0x02, 0x1b, 0x3e, 0xfd, 0xfc, 0x39, 0x04, 0x8d, 0xe9, 0xdd, 0x14, 0xa5, 0x01, 0xb1, 0x82, 0xe0, 0x06, 0xc1, 0x3a, 0x43, 0x77, 0xdc, 0xdc, 0xc4, 0x07, 0x3d, 0xca, 0x08, 0x4e, 0x6b, 0x7f, 0x71, 0xbd, 0x5d, 0x22, 0x58, 0xd7, 0xe2, 0x5a, 0x97, 0x9e, 0x40, 0x65, 0x4b, 0x4c, 0x1b, 0x64, 0xd8, 0x44, 0x99, 0xf9, 0x2d, 0x48, 0xc4, 0x14, 0x49, 0xec, 0x30, 0x0a, 0xfd, 0x4b, 0xdd, 0xe8, 0xf4, 0xf8, 0x5e, 0x06, 0xf2, 0x38, 0x3b, 0xdf, 0x59, 0x6e, 0x95, 0x1f, 0xf1, 0xd6, 0x08, 0xfe, 0xe8, 0x76, 0xd6, 0xcd, 0x18, 0x52, 0x41, 0xce, 0x89, 0xe0, 0x38, 0x49, 0x37, 0xbb, 0x36, 0xdc, 0x15, 0x9b, 0x68, 0x13, 0x51, 0x85, 0x0e, 0x39, 0xda, 0x3f, 0x23, 0x6d, 0x20, 0x07, 0x40, 0xf8, 0x1b, 0x84, 0xbe, 0xdd, 0x8e, 0xfd, 0x1b, 0xb2, 0x8d, 0xc9, 0x9e, 0xaf, 0x3d, 0x07, 0x3e, 0x05, 0xdb, 0x8f, 0xc1, 0x70, 0xff, 0x28, 0x21, 0x10, 0x22, 0xfb, 0x33, 0x75, 0x5e, 0x47, 0x8a, 0xf9, 0x76, 0x57, 0x9a, 0x52, 0x16, 0xb1, 0x19, 0x67, 0x5c, 0x91, 0xab, 0x63, 0x96, 0x95, 0xbd, 0x08, 0x4e, 0xba, 0xb1, 0x47, 0x84, 0x87, 0x3c, 0x0d, 0x3a, 0x88, 0x0d, 0x5f, 0x36, 0xfe, 0xb0, 0xa9, 0x03, 0xd5, 0xb1, 0x53, 0x39, 0xd6, 0x04, 0x96, 0xfe, 0x1e, 0xa4, 0x8e, 0xcd, 0xcf, 0x7b, 0x90, 0x76, 0x05, 0x82, 0xbd, 0x66, 0x0c, 0x29, 0xd7, 0x29, 0xd0, 0xf9, 0x54, 0x2d, 0x94, 0x78, 0xb1, 0xc9, 0xe7, 0x4d, 0x09, 0x7d, 0xd4, 0xa4, 0xe6, 0x7c, 0x5a, 0xd4, 0x57, 0x67, 0x1c, 0x3f, 0x43, 0x5c, 0x58, 0x7a, 0xfc, 0x2f, 0x1d, 0xaf, 0x17, 0xf7, 0xb9, 0x3f, 0x7c, 0xcd, 0x71, 0xab, 0xb9, 0xd0, 0x76, 0xb4, 0x9c, 0x6d, 0x14, 0xc1, 0x00, 0xdd, 0x2b, 0x82, 0xe7, 0xee, 0xe3, 0xd3, 0xc9, 0x07, 0x9c, 0xe3, 0x2c, 0x66, 0x24, 0x95, 0x75, 0xad, 0x2d, 0x26, 0xfe, 0x9d, 0xfe, 0x11, 0x68, 0x21, 0x68, 0x2f, 0x33, 0x8e, 0xfc, 0x23, 0x8b, 0x29, 0x7b, 0xf5, 0x65, 0xea, 0x8e, 0xfd, 0xcb, 0x7f, 0xb7, 0x03, 0x74, 0x94, 0x88, 0xa4, 0x98, 0x52, 0x13, 0xf7, 0x02, 0x25, 0xa1, 0x71, 0x67, 0xc3, 0xa7, 0x06, 0xf6, 0x6a, 0xf5, 0x91, 0x30, 0x68, 0x31, 0x76, 0xfa, 0xe1, 0x84, 0x86, 0xf1, 0xcd, 0x93, 0x23, 0xfd, 0x40, 0xb1, 0xa4, 0x29, 0xee, 0x52, 0xfb, 0xb2, 0xee, 0xc3, 0x94, 0x5d, 0xbe, 0x19, 0x81, 0x0e, 0x88, 0x68, 0xd5, 0x97, 0xa3, 0x35, 0x4d, 0xce, 0x5d, 0x2d, 0x36, 0xe2, 0xf8, 0x17, 0x8a, 0xef, 0xf2, 0x07, 0x5d, 0xcf, 0x8a, 0xd4, 0x77, 0x34, 0x7f, 0xcd, 0x43, 0xf3, 0x1b, 0xa8, 0xe8, 0xa3, 0x70, 0xbb, 0xb5, 0x67, 0xe2, 0x6f, 0xc2, 0x08, 0xe5, 0xf1, 0xd4, 0x47, 0x08, 0x2a, 0x82, 0x71, 0x33, 0xf2, 0x96, 0x33, 0x2c, 0x80, 0xb6, 0xb0, 0x60, 0x25, 0x44, 0xd1, 0xe1, 0x3b, 0x82, 0xdc, 0xab, 0x58, 0xfa, 0x49, 0x2b, 0xc7, 0x1d, 0xd1, 0x02, 0x38, 0x2a, 0xc7, 0x06, 0xb6, 0x51, 0xab, 0x89, 0xda, 0x19, 0xfd, 0xdf, 0x3e, 0xff, 0x4f, 0x1a, 0x35, 0x5f, 0x9e, 0x18, 0xb9, 0x98, 0xe2, 0xc0, 0xa5, 0x6c, 0xe4, 0x88, 0x25, 0xa5, 0x50, 0x3a, 0x6a, 0xfe, 0x0b, 0xf9, 0xa2, 0x40, 0xc6, 0x7f, 0x27, 0xac, 0xd4, 0xa8, 0xf6, 0x99, 0x38, 0x34, 0x64, 0x5e, 0x03, 0xc8, 0x0c, 0x72, 0xdd, 0x37, 0x0c, 0xd2, 0xe1, 0x00, 0x71, 0xa3, 0xae, 0x18, 0xef, 0x19, 0xba, 0xe9, 0xd6, 0x97, 0xea, 0x9a, 0x41, 0x18, 0x60, 0x91, 0x90, 0xcd, 0x95, 0x36, 0x19, 0x07, 0xa7, 0xfa, 0x1b, 0x58, 0xf4, 0x99, 0xf3, 0xf5, 0xe7, 0x9b, 0x93, 0x5f, 0x12, 0x21, 0x2f, 0x43, 0x7d, 0xde, 0x39, 0x9e, 0x3e, 0x64, 0x90, 0x24, 0x4a, 0xa1, 0xf5, 0xe3, 0x8b, 0xa9, 0xbe, 0x24, 0x33, 0xb6, 0xce, 0x92, 0x4f, 0x6c, 0xc4, 0x9e, 0x9f, 0x62, 0x73, 0x21, 0xa5, 0xdf, 0x93, 0x43, 0xfc, 0xe1, 0xb5, 0x9d, 0xeb, 0x64, 0x7d, 0x9a, 0x3a, 0xe0, 0x0b, 0x23, 0x44, 0x14, 0xba, 0x7b, 0x4e, 0x02, 0x0d, 0x67, 0x17, 0x3b, 0xe6, 0x93, 0xb0, 0x5c, 0xf9, 0x31, 0x8e, 0xd9, 0x81, 0xe3, 0xde, 0xf9, 0x31, 0xdb, 0x18, 0x22, 0x6e, 0x40, 0xd7, 0x57, 0xbb, 0xd4, 0xe8, 0xff, 0x75, 0xd5, 0xa1, 0xe8, 0xc0, 0x21, 0x74, 0x8b, 0xc1, 0x9d, 0xc4, 0x92, 0x0e, 0xd6, 0xf6, 0x97, 0x62, 0xe9, 0xcc, 0x2f, 0x96, 0xa1, 0xee, 0x27, 0xcc, 0xe0, 0xca, 0x0d, 0xee, 0x40, 0x9e, 0xf2, 0x57, 0xf9, 0xd3, 0x6f, 0xcf, 0x06, 0x8d, 0xe6, 0xbd, 0x83, 0x80, 0x0a, 0x98, 0x5a, 0x05, 0xa2, 0x9f, 0x1e, 0x6d, 0x8a, 0xca, 0x37, 0x95, 0xfa, 0x00, 0x40, 0xba, 0x0a, 0x8a, 0xad, 0x8f, 0x76, 0xc8, 0xb1, 0x8d, 0x9f, 0x22, 0x5f, 0x8b, 0xd3, 0x42, 0x0f, 0x8e, 0xce, 0x80, 0x03, 0xe2, 0x81, 0x9e, 0x4a, 0x6a, 0x12, 0xb6, 0xe5, 0x34, 0x23, 0x70, 0x29, 0x50, 0x57, 0x78, 0x64, 0xe3, 0x12, 0x30, 0xc3, 0x77, 0x81, 0xa2, 0x73, 0x95, 0xdb, 0xb8, 0x07, 0x96, 0xe6, 0xaf, 0x1a, 0xb6, 0xbc, 0xc9, 0x35, 0x6a, 0xcf, 0x42, 0xf3, 0xf4, 0x2b, 0x86, 0x62, 0x34, 0xfb, 0xa1, 0xad, 0xc1, 0x4f, 0xf7, 0xf8, 0x38, 0x1c, 0x35, 0x8c, 0xd4, 0x84, 0x87, 0x34, 0x3f, 0x58, 0x0c, 0xe6, 0xa8, 0xdc, 0x87, 0xa6, 0x16, 0xca, 0x57, 0xa8, 0xfc, 0x99, 0xa9, 0xb5, 0x0d, 0xfe, 0xec, 0xcf, 0x51, 0xb4, 0x85, 0x18, 0x79, 0x79, 0xc4, 0xf0, 0x70, 0x59, 0x17, 0x5e, 0x32, 0x2e, 0x7e, 0xb1, 0xe1, 0x68, 0x3f, 0x67, 0x16, 0x0a, 0xdb, 0x4d, 0x75, 0xf5, 0x40, 0xe8, 0x84, 0x69, 0x40, 0x14, 0xbd, 0xc9, 0x42, 0xeb, 0xe1, 0x9e, 0x38, 0xe8, 0x90, 0xdf, 0xd1, 0x4c, 0x17, 0x70, 0xef, 0xc1, 0x89, 0xe8, 0x5b, 0x3e, 0x11, 0x97, 0xb8, 0x2a, 0x86, 0xc8, 0xb5, 0xc4, 0x40, 0x43, 0x87, 0xc2, 0x2a, 0x16, 0x97, 0x38, 0x19, 0x95, 0x77, 0xbc, 0x5c, 0xa0, 0x1b, 0xc8, 0x95, 0x24, 0x46, 0x60, 0xc7, 0xe4, 0x42, 0xf4, 0xaf, 0x7a, 0xd4, 0x87, 0x58, 0x98, 0x6f, 0x11, 0xea, 0x94, 0xa8, 0x22, 0xc2, 0x24, 0xea, 0xc9, 0xc8, 0x66, 0x6b, 0xb4, 0xfd, 0x23, 0x5e, 0x98, 0x54, 0x54, 0x6b, 0xd4, 0xc3, 0xe5, 0x5c, 0x51, 0x99, 0xba, 0x19, 0xac, 0x12, 0xf0, 0xd6, 0x97, 0x29, 0x65, 0x8b, 0x7c, 0xad, 0x7a, 0xa4, 0x64, 0x97, 0x17, 0xfa, 0x18, 0x9b, 0xf0, 0x03, 0x85, 0xfd, 0x07, 0x45, 0x65, 0xa6, 0x72, 0x11, 0x1c, 0x77, 0x5f, 0x6d, 0xe0, 0xdd, 0x55, 0x52, 0x1d, 0xa6, 0xbd, 0x18, 0x18, 0x13, 0xa0, 0x2e, 0xd2, 0x2e, 0xb2, 0x0e, 0x2f, 0x5d, 0x90, 0x70, 0x57, 0x38, 0x46, 0xbe, 0x5d, 0x98, 0x14, 0xc9, 0x1f, 0xf0, 0x72, 0xba, 0x6d, 0xe1, 0x51, 0x4b, 0x6d, 0x08, 0xa4, 0x37, 0x3d, 0x1b, 0x1f, 0xee, 0xdb, 0x34, 0x3e, 0x8e, 0x42, 0x6c, 0x8a, 0x0f, 0xd6, 0xac, 0x18, 0xbd, 0x02, 0xc0, 0x52, 0xec, 0x20, 0xad, 0xf9, 0xe7, 0x99, 0x45, 0x6b, 0x29, 0x4d, 0xf8, 0x22, 0xd0, 0x35, 0xed, 0x7e, 0x4e, 0x46, 0x52, 0xc4, 0x62, 0x99, 0xf0, 0x66, 0x47, 0xca, 0x02, 0x85, 0x2b, 0x9e, 0x47, 0xb4, 0xe2, 0xe8, 0x56, 0xff, 0xdc, 0xad, 0x32, 0x2c, 0x54, 0x86, 0x1e, 0x40, 0xcb, 0x46, 0xb2, 0x45, 0xb5, 0xdd, 0x2f, 0x4b, 0x72, 0x7c, 0x10, 0xad, 0x7f, 0xfa, 0xe1, 0x95, 0xee, 0x77, 0x54, 0xc2, 0x13, 0x3f, 0x92, 0x89, 0x81, 0xf0, 0xcf, 0x1a, 0x35, 0xe0, 0x21, 0x05, 0x10, 0xb9, 0x92, 0xfd, 0x8b, 0x66, 0x74, 0xdb, 0xa6, 0x33, 0xf4, 0xe6, 0x21, 0x2f, 0xf2, 0x51, 0xef, 0xd5, 0x10, 0x05, 0xe8, 0xec, 0x09, 0xa1, 0xbe, 0xac, 0x45, 0xbf, 0x32, 0x22, 0xaa, 0x7a, 0x87, 0xd6, 0xb4, 0x2d, 0x37, 0xaa, 0xc8, 0x7c, 0xe6, 0x05, 0xc5, 0x99, 0x94, 0x31, 0xdd, 0xc0, 0x16, 0x02, 0xa3, 0x04, 0xc7, 0xb9, 0x64, 0x4e, 0x7b, 0x27, 0xbb, 0xa3, 0xb4, 0x16, 0x60, 0xa5, 0x19, 0xe4, 0x41, 0x5d, 0x23, 0x71, 0xd4, 0x37, 0x1a, 0x3c, 0xab, 0x4e, 0x40, 0xc8, 0x49, 0xea, 0x4c, 0x45, 0x34, 0x47, 0x19, 0x6c, 0x4b, 0x99, 0xa0, 0xab, 0x5a, 0x4c, 0x24, 0x82, 0xec, 0x90, 0xac, 0x2d, 0x60, 0x15, 0xb6, 0x83, 0x3f, 0x13, 0x2a, 0x1e, 0xcd, 0x8e, 0x8d, 0xbc, 0xde, 0xd8, 0x77, 0xe5, 0xeb, 0x57, 0x47, 0xce, 0x65, 0x88, 0x15, 0x7e, 0x49, 0x44, 0xe8, 0x2f, 0xf5, 0x43, 0x29, 0xf7, 0x3a, 0xde, 0x58, 0xa7, 0xb2, 0x19, 0xfe, 0xf4, 0x54, 0xe0, 0xe3, 0xd4, 0x45, 0x91, 0x80, 0x2b, 0xf1, 0xbb, 0xb7, 0xa7, 0x5b, 0x26, 0xc2, 0xe8, 0xb1, 0x13, 0x6a, 0xe5, 0x24, 0xc4, 0x79, 0x8b, 0xf7, 0x3f, 0x71, 0xa7, 0xd5, 0x50, 0x7e, 0x05, 0x67, 0xcd, 0xaa, 0xd9, 0x26, 0x1d, 0x50, 0x5f, 0x6e, 0xfb, 0xd3, 0xbf, 0xd4, 0x78, 0x8f, 0x33, 0xba, 0x3f, 0x10, 0x6b, 0x21, 0x1d, 0x82, 0x31, 0xbe, 0xc1, 0x69, 0x49, 0x4f, 0xc0, 0x93, 0x9b, 0x2f, 0xdc, 0x4a, 0x94, 0x28, 0x85, 0xce, 0xc9, 0x89, 0xa0, 0x02, 0xdd, 0x79, 0x88, 0x65, 0xa5, 0x8b, 0x52, 0x44, 0x8b, 0x93, 0x56, 0x2e, 0x30, 0xb7, 0xea, 0xa9, 0x56, 0xc9, 0x71, 0x23, 0xfc, 0xd4, 0x95, 0x2b, 0xca, 0xf4, 0xd0, 0xe1, 0xb0, 0x6b, 0x31, 0xab, 0xcb, 0xf2, 0x5d, 0x2a, 0x88, 0x4d, 0xd4, 0x6d, 0x0b, 0x22, 0x75, 0x64, 0xd2, 0x0b, 0x45, 0x97, 0x95, 0xea, 0x6c, 0x17, 0x71, 0x7d, 0x80, 0xb5, 0x46, 0x32, 0x06, 0x73, 0x5e, 0x3c, 0x36, 0x38, 0x4f, 0xe6, 0xff, 0xc8, 0x22, 0x27, 0x4b, 0xf2, 0xb4, 0x77, 0x84, 0x0c, 0x5d, 0xe2, 0x57, 0x9c, 0xd0, 0x5b, 0xb8, 0x58, 0x42, 0x52, 0x26, 0x51, 0xcf, 0x89, 0x30, 0x6b, 0x19, 0x23, 0x38, 0x10, 0x32, 0xfe, 0x77, 0x25, 0xbc, 0x42, 0x41, 0x3d, 0x4e, 0x3a, 0x8a, 0x0d, 0x1a, 0x63, 0xaa, 0x21, 0xcd, 0xc3, 0x5d, 0xcd, 0xb7, 0x7c, 0x0e, 0x65, 0x2c, 0xa1, 0x55, 0xb0, 0x2a, 0x48, 0xbe, 0x9b, 0x3b, 0xe1, 0xcc, 0x2b, 0x9d, 0xc6, 0x3d, 0xb5, 0xa1, 0x13, 0x90, 0x51, 0x51, 0xb7, 0xc5, 0x8c, 0x55, 0xcb, 0x64, 0x5d, 0x18, 0x23, 0xc0, 0x5b, 0x26, 0x23, 0x7d, 0x2c, 0xd9, 0xd4, 0x50, 0x41, 0x34, 0x37, 0x06, 0xc0, 0x0f, 0xda, 0xc8, 0xc2, 0x74, 0xa8, 0x9d, 0xbf, 0x4a, 0x05, 0x30, 0x46, 0x30, 0x1b, 0xd4, 0xf2, 0xac, 0x6e, 0xc5, 0x99, 0x85, 0xb7, 0xb0, 0xc6, 0x6d, 0xef, 0x76, 0x6a, 0xe3, 0xaa, 0x2e, 0xce, 0x58, 0xa6, 0x69, 0xcc, 0x91, 0xa4, 0xb9, 0x3f, 0x4c, 0x76, 0x74, 0xb8, 0x26, 0x5a, 0xb5, 0x73, 0xbc, 0x86, 0xa4, 0x89, 0x11, 0x04, 0xf7, 0x66, 0x30, 0xc0, 0xb9, 0x7e, 0x12, 0xe0, 0x4a, 0x3c, 0xc1, 0x53, 0xa8, 0x3b, 0xbe, 0xad, 0xec, 0xb9, 0xa0, 0x32, 0x18, 0x49, 0xff, 0x30, 0x0f, 0xc7, 0x90, 0x93, 0xe5, 0x91, 0x91, 0xb3, 0x59, 0xf4, 0x68, 0x70, 0xa0, 0xe5, 0x87, 0x81, 0x65, 0xf2, 0x92, 0x09, 0x0d, 0x78, 0xc4, 0x6b, 0x3f, 0x15, 0x8f, 0x60, 0xa4, 0x60, 0x82, 0x47, 0xeb, 0xd8, 0x70, 0xbc, 0x11, 0x1b, 0xcf, 0x6b, 0xdf, 0x59, 0x5e, 0x26, 0xb4, 0x07, 0x0b, 0x36, 0x84, 0xd8, 0x13, 0xef, 0x21, 0xe9, 0x6b, 0x88, 0xb9, 0x3b, 0x5f, 0x29, 0xa0, 0x67, 0x79, 0x44, 0x50, 0x8d, 0xa4, 0x29, 0xaf, 0x8e, 0x91, 0xd5, 0x90, 0x7b, 0x5a, 0x0b, 0x7b, 0x4d, 0x65, 0xa7, 0xb1, 0xd6, 0x8c, 0x2e, 0x6b, 0xf7, 0x7a, 0xa9, 0x63, 0x14, 0x58, 0xb4, 0x95, 0xc5, 0xaa, 0xd2, 0x47, 0xce, 0x73, 0x03, 0x47, 0x52, 0xa0, 0x99, 0x74, 0x43, 0xa3, 0x47, 0x7f, 0x1d, 0x5f, 0x7b, 0xf3, 0xd4, 0x44, 0xed, 0x73, 0x0a, 0xbb, 0x78, 0x43, 0x86, 0xc4, 0x2a, 0x0b, 0xe2, 0xdd, 0x97, 0xd7, 0x83, 0x27, 0x72, 0x61, 0xcf, 0xc4, 0x5e, 0x93, 0x99, 0x83, 0x01, 0x48, 0xe0, 0xbf, 0x5a, 0x53, 0xba, 0x84, 0x55, 0xc2, 0x8b, 0xf4, 0x9d, 0x64, 0x7a, 0xe9, 0xb2, 0x88, 0x26, 0xdc, 0x3b, 0x08, 0x94, 0x06, 0x9d, 0x86, 0x6d, 0xc4, 0xcc, 0xf6, 0x66, 0x40, 0x62, 0x5c, 0xff, 0x4e, 0xee, 0xd7, 0x70, 0x94, 0x8e, 0xdf, 0xe0, 0xee, 0xc0, 0xcb, 0xd9, 0x11, 0x75, 0x96, 0xf9, 0x6e, 0x67, 0xe2, 0xea, 0x59, 0xad, 0x3d, 0x94, 0x6a, 0x8c, 0xa4, 0x90, 0x23, 0x91, 0x45, 0xe0, 0xd4, 0xdc, 0x89, 0xde, 0xbc, 0xbf, 0x52, 0x73, 0x71, 0x88, 0x82, 0x89, 0x82, 0x9a, 0xbc, 0xc3, 0x5a, 0xc3, 0x6e, 0x6b, 0x67, 0xc9, 0x0f, 0xac, 0x7c, 0x46, 0xa5, 0x01, 0x74, 0xb6, 0x8b, 0xed, 0x19, 0xcf, 0x71, 0xed, 0x44, 0x11, 0xa4, 0xab, 0x45, 0x9d, 0x90, 0x74, 0x84, 0x4a, 0x83, 0xec, 0x69, 0xf6, 0xb3, 0x00, 0x7a, 0x1a, 0x83, 0x1d, 0xc3, 0xa1, 0x02, 0x9f, 0x7b, 0xfb, 0xb4, 0x8d, 0xe4, 0x6d, 0x96, 0x83, 0x73, 0xab, 0x5c, 0xef, 0x31, 0xa8, 0xfd, 0x80, 0x61, 0xad, 0x71, 0xdc, 0x63, 0xa9, 0xb9, 0x92, 0xd8, 0xc8, 0x21, 0x4f, 0x07, 0x46, 0xc2, 0x54, 0x80, 0x86, 0x4a, 0x27, 0xfe, 0x5e, 0x00, 0x89, 0x92, 0xb5, 0x02, 0xa9, 0xfe, 0x51, 0xd1, 0x97, 0x5f, 0xea, 0x10, 0xfb, 0x10, 0x83, 0x89, 0x07, 0xca, 0xfa, 0x71, 0xaa, 0x10, 0xdd, 0xed, 0x07, 0xca, 0x7f, 0xd5, 0x25, 0x30, 0x4b, 0xb7, 0xe8, 0xe9, 0x59, 0x1f, 0x40, 0x74, 0x3f, 0x15, 0xa0, 0xc8, 0x2a, 0xe8, 0xb2, 0x37, 0x2d, 0x2a, 0x49, 0x98, 0xd8, 0xfc, 0x97, 0xa5, 0x0d, 0x8c, 0xa0, 0xa2, 0x0f, 0xdb, 0xee, 0x40, 0xdc, 0xc4, 0x86, 0xc0, 0xbd, 0x3a, 0x1c, 0x5b, 0x1b, 0xd1, 0x83, 0xe2, 0x94, 0x7f, 0x67, 0xa2, 0x4e, 0xa4, 0x3e, 0x8a, 0x8b, 0x49, 0x7c, 0x90, 0x7e, 0xa5, 0x06, 0x50, 0x5e, 0xe6, 0xea, 0xf6, 0xb8, 0x2e, 0x4d, 0x5f, 0x09, 0xdb, 0xa5, 0x7b, 0x8c, 0x0b, 0x28, 0xf6, 0x51, 0x5f, 0x83, 0x17, 0x8f, 0x00, 0xd0, 0xe8, 0x3b, 0xe0, 0xc2, 0x97, 0xd9, 0x43, 0x23, 0x1c, 0x93, 0x7d, 0x81, 0x1c, 0x88, 0xfd, 0x24, 0x0d, 0x66, 0x8a, 0x43, 0x9c, 0x3b, 0xcd, 0x77, 0x4b, 0x88, 0x10, 0x6f, 0x5f, 0x98, 0x45, 0xe6, 0xf9, 0x0f, 0x4a, 0xd2, 0x83, 0xc6, 0x6b, 0xde, 0x4d, 0xd6, 0x29, 0x1b, 0x78, 0xf3, 0x39, 0xf2, 0x14, 0xfc, 0xd0, 0x5e, 0x85, 0xcf, 0x1e, 0x58, 0x2b, 0x62, 0x18, 0x92, 0x42, 0x10, 0x7b, 0x67, 0x06, 0x30, 0x0e, 0x12, 0x1b, 0xec, 0x27, 0x1f, 0x2d, 0x51, 0x70, 0x20, 0xd4, 0xa2, 0xeb, 0xa1, 0xba, 0xf2, 0x34, 0x5e, 0xff, 0xf1, 0x07, 0xb3, 0xdc, 0x07, 0x01, 0x53, 0x87, 0x9f, 0xab, 0x3d, 0x57, 0xc6, 0xb4, 0xec, 0x29, 0xf4, 0x7e, 0xce, 0x02, 0x29, 0xdd, 0xf8, 0xf6, 0x3c, 0x1b, 0x18, 0x48, 0x70, 0x3f, 0xab, 0xd2, 0x49, 0x8e, 0x70, 0xa7, 0x9e, 0x53, 0x1c, 0xf8, 0xee, 0xdc, 0x4f, 0x34, 0xf8, 0xc5, 0xc7, 0x73, 0x85, 0x79, 0xd4, 0x15, 0x89, 0xf5, 0x0b, 0xa6, 0x6a, 0xcf, 0x3f, 0x05, 0xa0, 0x77, 0xad, 0xc6, 0x7e, 0xbe, 0x77, 0xd4, 0x4f, 0x94, 0x54, 0x5b, 0xa5, 0x16, 0x85, 0xe5, 0xee, 0xc8, 0x0b, 0xc3, 0x48, 0x1e, 0x17, 0xae, 0x97, 0x42, 0xc2, 0xae, 0xd4, 0x11, 0xfe, 0x3b, 0xa8, 0x66, 0xcc, 0xa2, 0x39, 0x9c, 0xb0, 0xab, 0x44, 0x4e, 0x62, 0x79, 0x6c, 0x61, 0xc7, 0xb1, 0xd1, 0x45, 0x1f, 0xdf, 0xe5, 0x77, 0x80, 0x15, 0x7b, 0x4b, 0x83, 0xd5, 0x21, 0xe8, 0x3d, 0x30, 0xb0, 0x94, 0x71, 0x30, 0x21, 0x32, 0x03, 0x74, 0xa2, 0x08, 0xb0, 0x1a, 0xe9, 0xc6, 0xfd, 0xe2, 0xc9, 0xc4, 0x6d, 0x8f, 0x03, 0x8c, 0xf7, 0x91, 0x5e, 0x98, 0xb7, 0xe2, 0xfa, 0x5d, 0xe4, 0x2e, 0xe1, 0x88, 0x02, 0x36, 0xdf, 0x87, 0x59, 0x76, 0x94, 0x4b, 0xa5, 0x05, 0xc7, 0x4c, 0x0f, 0xbe, 0xfd, 0xce, 0x5c, 0x9d, 0x4a, 0x63, 0x65, 0x6b, 0x68, 0xb2, 0xc7, 0x9e, 0x06, 0x76, 0xdb, 0x7b, 0x62, 0xca, 0xe9, 0x7d, 0x1a, 0xa3, 0x98, 0xfa, 0x40, 0x9e, 0xa9, 0x04, 0xac, 0xfc, 0xe5, 0x8e, 0x96, 0xea, 0x54, 0xcf, 0x64, 0x06, 0xb0, 0xec, 0xc0, 0x20, 0x19, 0xd1, 0xee, 0x3d, 0x0a, 0x5f, 0x5c, 0xe2, 0x8c, 0xcd, 0x7b, 0x8f, 0xaa, 0x48, 0xce, 0x89, 0x24, 0xdd, 0x41, 0xdc, 0x68, 0x99, 0xbb, 0xa1, 0xbd, 0xef, 0xf6, 0x7d, 0xc2, 0x59, 0x8f, 0x6a, 0x17, 0x42, 0x59, 0xba, 0x5a, 0x24, 0xf7, 0x59, 0x55, 0xee, 0xaa, 0x52, 0x75, 0xa8, 0x67, 0x94, 0x7e, 0x59, 0x2d, 0xf7, 0x7e, 0x29, 0x95, 0x7a, 0x00, 0xc3, 0xab, 0xce, 0x81, 0xfd, 0xfc, 0x19, 0x28, 0xbb, 0xf0, 0xf4, 0xb1, 0x10, 0x5a, 0xb5, 0xab, 0xa7, 0x4e, 0xf4, 0xe3, 0x62, 0x33, 0x48, 0x20, 0x40, 0x18, 0x52, 0x10, 0x84, 0x4c, 0xfd, 0x83, 0x14, 0x28, 0x03, 0xd7, 0x1f, 0x30, 0xb4, 0xb3, 0x02, 0x5b, 0xf3, 0xf9, 0x6d, 0xae, 0x81, 0xf5, 0xc1, 0x0f, 0x7e, 0xdb, 0xbd, 0x59, 0x2c, 0x70, 0x5a, 0xac, 0xf7, 0x07, 0xf3, 0x07, 0xb2, 0xaf, 0xa9, 0x18, 0x24, 0xab, 0x06, 0x52, 0xc3, 0x22, 0xe1, 0x41, 0xbf, 0x18, 0x81, 0x1a, 0x42, 0x9d, 0x05, 0x97, 0xf7, 0x44, 0x02, 0x01, 0xc9, 0xd7, 0x6f, 0x8e, 0xed, 0x49, 0xbe, 0xee, 0x22, 0xec, 0x4c, 0x21, 0x37, 0xe4, 0xfb, 0x8b, 0xce, 0xdc, 0x1d, 0x4a, 0x61, 0xf8, 0x95, 0xc7, 0x82, 0x0a, 0x38, 0x8b, 0x67, 0x08, 0x7a, 0x55, 0xa5, 0xbe, 0x46, 0x69, 0x3c, 0xc0, 0x2d, 0x2a, 0xd4, 0xa3, 0xc3, 0xeb, 0x46, 0x6c, 0x46, 0x03, 0x5e, 0x49, 0x81, 0x1f, 0xe0, 0x7f, 0xf0, 0xdd, 0xc8, 0xa4, 0x25, 0x96, 0xd6, 0x0e, 0x6a, 0x7a, 0x4a, 0x8b, 0xa8, 0xe3, 0xed, 0x52, 0x88, 0xe3, 0x50, 0x3a, 0xd7, 0x1f, 0x58, 0x2a, 0x2f, 0xe1, 0xfa, 0xd1, 0xd4, 0x68, 0x44, 0x97, 0xdc, 0x83, 0x9d, 0xd3, 0x93, 0x5e, 0x4d, 0x3e, 0x1d, 0x9b, 0x40, 0xa8, 0x5d, 0xa4, 0x06, 0xe9, 0x16, 0x40, 0x1f, 0x1b, 0x50, 0x65, 0x76, 0x06, 0xfe, 0x4e, 0x2b, 0xdc, 0xdd, 0xcc, 0x95, 0x27, 0x9f, 0xe1, 0x88, 0xff, 0x49, 0x8b, 0xd3, 0x80, 0xda, 0xde, 0x0d, 0x7b, 0x2d, 0x55, 0x92, 0x6c, 0x20, 0x6a, 0xc8, 0xac, 0xf6, 0x64, 0xa7, 0xe8, 0xfa, 0x71, 0x78, 0xd2, 0x65, 0xf4, 0xdc, 0x16, 0x82, 0x20, 0x11, 0x90, 0x10, 0xc6, 0x71, 0xbc, 0xe8, 0x6b, 0x3b, 0x6e, 0xe0, 0x9e, 0x96, 0xc3, 0xee, 0x89, 0xd3, 0x57, 0x91, 0xc5, 0xf3, 0xb8, 0x6c, 0x73, 0x69, 0x1b, 0x34, 0x88, 0x21, 0x4e, 0xcd, 0x68, 0xc0, 0xee, 0xb0, 0xb7, 0x2e, 0xda, 0x90, 0x6b, 0x52, 0xe7, 0x3d, 0x26, 0x1c, 0xd6, 0xc8, 0xc4, 0xc9, 0x83, 0xe8, 0x2f, 0x62, 0x5e, 0x9c, 0x7b, 0x86, 0x1f, 0x12, 0x2f, 0x6a, 0xb6, 0xc8, 0xe0, 0x1e, 0x81, 0xf1, 0x05, 0x12, 0xc2, 0x1a, 0x06, 0xd8, 0x50, 0x0d, 0x96, 0x2b, 0x8d, 0xf6, 0x43, 0x31, 0x97, 0xc4, 0x4b, 0xfd, 0xc3, 0xd2, 0xb2, 0x58, 0x47, 0xc7, 0x91, 0xc1, 0x36, 0xbb, 0xb1, 0xb2, 0xb2, 0x9b, 0x58, 0x25, 0x5d, 0xce, 0x63, 0x57, 0x10, 0x18, 0x95, 0xcc, 0xd0, 0xbf, 0x2f, 0x93, 0xfd, 0xed, 0xc1, 0xcb, 0xcd, 0x56, 0x3f, 0x66, 0xf9, 0x1a, 0x57, 0x2d, 0xb6, 0xed, 0x02, 0x04, 0xe7, 0x75, 0x5a, 0x70, 0x91, 0xf3, 0xab, 0x56, 0x8f, 0x26, 0xcc, 0x06, 0x87, 0x6d, 0xb0, 0x77, 0x1c, 0x2b, 0x38, 0xd4, 0x65, 0x6f, 0x4b, 0x38, 0x9e, 0xd5, 0x29, 0xb7, 0x1e, 0xa7, 0xfc, 0x9d, 0x89, 0x48, 0xb1, 0xfa, 0x47, 0xd3, 0x05, 0x5e, 0x35, 0xff, 0xe3, 0xe1, 0x9a, 0x46, 0xed, 0x66, 0x5c, 0x46, 0x59, 0x21, 0x74, 0x67, 0xfe, 0x57, 0x9f, 0xbe, 0xae, 0x65, 0x56, 0x31, 0xc7, 0x04, 0x01, 0xdc, 0x05, 0xcb, 0x68, 0xb4, 0x9a, 0xf6, 0x6a, 0x6a, 0x81, 0x65, 0xf1, 0x93, 0x0f, 0xe8, 0x25, 0x05, 0xcb, 0xb9, 0xe0, 0x84, 0x7f, 0x4a, 0x62, 0x9e, 0x8f, 0x41, 0x47, 0xd3, 0x8a, 0xc1, 0xb6, 0xf9, 0xff, 0xec, 0xda, 0xdf, 0x92, 0xa6, 0x96, 0x31, 0x4e, 0x9b, 0x74, 0x9b, 0x3d, 0x83, 0xdf, 0x31, 0x36, 0xa5, 0x93, 0x0f, 0xf7, 0x99, 0x51, 0x3c, 0x74, 0x53, 0xd7, 0xd5, 0x6e, 0x5d, 0x0f, 0x67, 0x46, 0x64, 0x87, 0x9c, 0x14, 0xf6, 0x21, 0x1a, 0xf4, 0x8a, 0x0c, 0xa8, 0xa0, 0xc1, 0xf2, 0x92, 0x44, 0xeb, 0x73, 0x4f, 0x8d, 0xcd, 0xd3, 0x62, 0x03, 0xa2, 0xef, 0x7e, 0x9a, 0x5f, 0x76, 0xed, 0x83, 0x3b, 0x55, 0x33, 0x48, 0x6f, 0x73, 0xee, 0x18, 0x3a, 0x9f, 0x00, 0x60, 0x29, 0xc7, 0xf0, 0x9b, 0x95, 0x6a, 0x8e, 0x6a, 0x6d, 0x4f, 0xd6, 0xe7, 0x36, 0x78, 0x17, 0x36, 0x4f, 0x52, 0x55, 0x5e, 0x7a, 0x2e, 0xeb, 0x57, 0x98, 0xf4, 0x74, 0x65, 0xb4, 0x16, 0xec, 0xa4, 0x43, 0xc4, 0x13, 0xe3, 0xaa, 0x5f, 0x12, 0xb5, 0x01, 0x2f, 0x61, 0xc6, 0x17, 0x58, 0xe8, 0x6c, 0xb6, 0x0a, 0x65, 0x7e, 0x28, 0xf9, 0x0d, 0x69, 0xf9, 0x0d, 0x76, 0x80, 0xff, 0x5a, 0xb4, 0x94, 0x98, 0x52, 0xc3, 0xc5, 0x33, 0x39, 0x25, 0x97, 0x12, 0xda, 0xcb, 0x49, 0x4e, 0x79, 0x39, 0x62, 0x1b, 0x08, 0xe6, 0x8c, 0x4d, 0x9e, 0xe1, 0xa5, 0x1b, 0x24, 0xba, 0x14, 0x23, 0x52, 0xa0, 0x59, 0xaf, 0xda, 0xc7, 0xe8, 0x37, 0xe2, 0x0d, 0x38, 0x27, 0xb8, 0xdc, 0x17, 0xe1, 0xc1, 0x52, 0x40, 0x06, 0xb3, 0x9f, 0x2f, 0xf2, 0x04, 0xaf, 0x34, 0x85, 0xa3, 0x0a, 0xc7, 0x29, 0xe5, 0xf8, 0x1b, 0x10, 0xc2, 0xe8, 0xf6, 0xbe, 0x41, 0x12, 0xbf, 0xc8, 0x31, 0x5c, 0xd9, 0xdb, 0x1a, 0x7a, 0x2f, 0xff, 0x73, 0x5a, 0x10, 0x1d, 0x15, 0xbf, 0x3e, 0xbf, 0xf0, 0x2c, 0x41, 0x18, 0xfd, 0x03, 0x01, 0x44, 0x73, 0xee, 0x94, 0xd1, 0x3e, 0x7e, 0x55, 0x7d, 0xad, 0x12, 0x36, 0x41, 0x6b, 0xfb, 0x57, 0x8f, 0xb0, 0xdd, 0xd7, 0xd9, 0xb8, 0x58, 0xea, 0x52, 0x75, 0xe8, 0x2b, 0xf8, 0x81, 0x0a, 0x34, 0xd2, 0x56, 0xa1, 0x6c, 0x76, 0xc1, 0x97, 0x21, 0xcf, 0x94, 0xc7, 0xd7, 0x1d, 0x9c, 0x1b, 0xdf, 0x3d, 0xd2, 0xf1, 0x2b, 0x2b, 0xd5, 0xc4, 0x60, 0xc5, 0x98, 0x08, 0x2d, 0xd2, 0x58, 0x55, 0xdc, 0x42, 0xd2, 0xc8, 0x26, 0xb7, 0xb2, 0xa7, 0x4c, 0x45, 0x4e, 0x43, 0x63, 0x76, 0x94, 0x23, 0xef, 0x92, 0x41, 0x5e, 0xb4, 0x1d, 0x55, 0x49, 0xc9, 0xa0, 0xc3, 0x52, 0xee, 0xad, 0x6c, 0x2c, 0x1f, 0x1d, 0x4e, 0x2d, 0x6a, 0x9c, 0xf9, 0xf4, 0xfd, 0x68, 0x43, 0x4e, 0x83, 0x55, 0x3d, 0x5b, 0xb1, 0x15, 0x66, 0xec, 0x1b, 0xb6, 0x1e, 0x30, 0x4d, 0x6c, 0x5d, 0x90, 0x17, 0x91, 0xa4, 0xd7, 0x28, 0xea, 0x34, 0x96, 0xde, 0x2c, 0x7f, 0xc7, 0x5d ],
+const [ 0x19, 0x8a, 0x69, 0x6d, 0xe9, 0x89, 0x61, 0xe3, 0xad, 0x0f, 0x95, 0x33, 0x39, 0x35, 0x0b, 0x58, 0x71, 0xd8, 0x7a, 0x41, 0x54, 0x92, 0x67, 0x6d, 0x3a, 0xe8, 0x8e, 0xb8, 0x59, 0xc5, 0x83, 0x75, 0x8e, 0x28, 0x99, 0xbc, 0x5b, 0x19, 0x03, 0x05, 0x2c, 0xe1, 0x39, 0xf6, 0xde, 0x7a, 0x9e, 0x7a, 0x81, 0x45, 0x5f, 0x13, 0x5d, 0xfb, 0x9e, 0x71, 0x34, 0xe6, 0xd0, 0x43, 0xc7, 0x51, 0x63, 0x4d, 0x9b, 0x3d, 0xa4, 0xbb, 0xfd, 0x55, 0xe1, 0xb5, 0x44, 0x24, 0xca, 0x33, 0x56, 0x86, 0x1d, 0x13, 0x6e, 0x5c, 0x83, 0x69, 0x1c, 0x84, 0xb5, 0x16, 0x8d, 0x09, 0xe2, 0x9c, 0x0c, 0x96, 0x55, 0x30, 0xc9, 0x31, 0x53, 0x11, 0xd9, 0x25, 0x42, 0x19, 0x7f, 0x40, 0x11, 0x91, 0xaa, 0x3f, 0xd3, 0x4a, 0xbe, 0x87, 0xad, 0xe9, 0x97, 0x16, 0xf3, 0x83, 0xcc, 0xb8, 0x8e, 0x6a, 0x30, 0x7e, 0xa1, 0x46, 0x9f, 0x6c, 0x6c, 0x67, 0xf7, 0x72, 0x70, 0x59, 0x64, 0x9e, 0xd3, 0xb9, 0xe1, 0x8f, 0x07, 0x48, 0xfb, 0x2d, 0xa7, 0x3e, 0xd8, 0x97, 0xa1, 0xe1, 0x79, 0x5d, 0x9a, 0x55, 0x3c, 0xf0, 0x8e, 0xb6, 0xa5, 0x56, 0xb7, 0x64, 0x5d, 0x22, 0xb1, 0x9e, 0x7b, 0xa4, 0xdb, 0x53, 0x03, 0x5d, 0x00, 0x34, 0xac, 0xb5, 0x37, 0x0e, 0xe7, 0xf1, 0x07, 0x57, 0x1c, 0x5f, 0xcf, 0x07, 0x37, 0xd3, 0x65, 0xa9, 0x63, 0x57, 0xfe, 0xb1, 0x15, 0x1f, 0x4e, 0x10, 0x4d, 0xbb, 0xf0, 0x06, 0x19, 0x90, 0x07, 0x37, 0x5a, 0x89, 0x26, 0x02, 0xca, 0x0a, 0x6d, 0x0e, 0x3e, 0x26, 0xf5, 0x25, 0x29, 0x11, 0x6f, 0x46, 0x62, 0xd8, 0x07, 0xf5, 0x27, 0x4f, 0x8f, 0xd6, 0x61, 0x4b, 0xd9, 0x7a, 0x29, 0x12, 0x64, 0x79, 0x8c, 0x10, 0x3b, 0xc1, 0x8b, 0xcc, 0x1b, 0x2d, 0x66, 0x1a, 0xd4, 0x5a, 0x1b, 0x91, 0xf1, 0xb6, 0x29, 0x3f, 0x9b, 0xd9, 0x99, 0x9c, 0xbb, 0x19, 0x3f, 0xbd, 0x5f, 0x58, 0x3e, 0xca, 0x5f, 0x21, 0xca, 0xb2, 0x40, 0xf4, 0x32, 0x1d, 0x58, 0xdd, 0x1d, 0xa3, 0x33, 0x4b, 0x13, 0x3b, 0x36, 0x20, 0x40, 0xf6, 0x82, 0x05, 0x75, 0xed, 0x1c, 0x00, 0x70, 0x77, 0x4a, 0x48, 0x5d, 0xa0, 0x40, 0x58, 0x9d, 0xd7, 0xfb, 0x42, 0xc5, 0xe7, 0x6e, 0x46, 0xea, 0x29, 0xdc, 0xa3, 0x1c, 0xf7, 0x85, 0xad, 0x30, 0x63, 0x84, 0x20, 0xc3, 0x29, 0xf8, 0xb4, 0x7b, 0xe3, 0x62, 0xf1, 0x90, 0x7c, 0x4e, 0x45, 0x8b, 0xe7, 0x36, 0x54, 0x4e, 0x11, 0xa3, 0x8f, 0x55, 0x14, 0x95, 0x08, 0x3b, 0xad, 0x25, 0x84, 0x80, 0xf0, 0x69, 0xd2, 0x89, 0x3a, 0x98, 0x5c, 0xe8, 0x68, 0x6e, 0xfc, 0xde, 0x46, 0xd2, 0x11, 0x1e, 0x4a, 0xb7, 0xd1, 0xd4, 0x83, 0x40, 0xe1, 0xe6, 0xcc, 0x27, 0x23, 0x7a, 0x45, 0x5f, 0xcf, 0xb8, 0x04, 0xf8, 0xc5, 0xd1, 0x07, 0x44, 0x21, 0x40, 0x6d, 0x38, 0x10, 0x50, 0xe6, 0x14, 0xe3, 0xde, 0x69, 0x47, 0x62, 0x60, 0x25, 0x8c, 0x63, 0x26, 0xb9, 0x5a, 0x9b, 0xe0, 0xa7, 0x7b, 0xb3, 0x61, 0x06, 0xfa, 0x9e, 0xa2, 0x78, 0x43, 0x2b, 0x0a, 0x5c, 0x86, 0xd6, 0xec, 0x45, 0x5c, 0xe4, 0x52, 0xaa, 0xad, 0xaf, 0xf9, 0xdf, 0xd1, 0x3e, 0x9c, 0x43, 0xf5, 0x18, 0x75, 0xbc, 0xc1, 0x5a, 0x02, 0x60, 0x38, 0x08, 0x05, 0x75, 0xdf, 0xa1, 0xce, 0x9c, 0x21, 0xf6, 0xbc, 0x49, 0xf2, 0x3b, 0x02, 0x76, 0xb3, 0x5f, 0xa7, 0x99, 0x55, 0x99, 0xd1, 0xd3, 0xc2, 0x44, 0x42, 0x6a, 0x78, 0xec, 0x23, 0x79, 0x77, 0xa9, 0x00, 0xe6, 0x5e, 0xab, 0x15, 0x95, 0xd1, 0x17, 0xc8, 0xdb, 0x1d, 0x12, 0x76, 0x36, 0x1f, 0x1a, 0x72, 0x3b, 0x62, 0x9d, 0x4b, 0xcf, 0x87, 0xc4, 0x4e, 0x9a, 0xea, 0x90, 0x4c, 0xb9, 0x82, 0x29, 0x9e, 0xb3, 0x09, 0x73, 0x65, 0xaf, 0x5d, 0xe1, 0x16, 0xe4, 0x27, 0x8e, 0x37, 0x50, 0xba, 0x8a, 0x63, 0xad, 0x3e, 0x71, 0x94, 0xa1, 0x0d, 0x43, 0xa2, 0x35, 0x5d, 0x6f, 0x06, 0x88, 0x20, 0x31, 0xe4, 0xc5, 0x28, 0x1e, 0x49, 0x52, 0x8f, 0xfe, 0xb1, 0x4a, 0x56, 0xd9, 0xcc, 0x2e, 0x4c, 0x55, 0x81, 0xd7, 0x31, 0x3f, 0x34, 0xaf, 0x1c, 0x67, 0x44, 0x21, 0x1a, 0xb1, 0xd8, 0x4e, 0x18, 0x69, 0xdc, 0x02, 0x03, 0xd7, 0x46, 0xe6, 0x2d, 0x13, 0x9e, 0xf7, 0xf3, 0x1b, 0xbd, 0x36, 0x9d, 0x23, 0xd5, 0xa1, 0x85, 0x2c, 0xb1, 0x63, 0x7c, 0xd8, 0x3e, 0x48, 0x69, 0x7d, 0x4b, 0x73, 0x33, 0x78, 0x8d, 0x53, 0xe1, 0xc4, 0xe6, 0xd3, 0x00, 0xcb, 0xe6, 0xd1, 0x45, 0x7b, 0x93, 0xd2, 0x74, 0x9d, 0x65, 0xf4, 0x80, 0x62, 0x95, 0x24, 0xf4, 0x3f, 0x98, 0x90, 0x91, 0xfb, 0xe6, 0x5f, 0x39, 0x07, 0xff, 0xa0, 0x0c, 0x0d, 0xb0, 0x81, 0xd0, 0xcb, 0x92, 0xc2, 0x96, 0x22, 0xd5, 0x69, 0x9a, 0x6a, 0x3b, 0xb6, 0x6c, 0x09, 0x67, 0x59, 0x4d, 0x44, 0x58, 0xe3, 0xdc, 0x55, 0x31, 0x7b, 0xf2, 0xbd, 0x3b, 0xd2, 0xca, 0xdb, 0x2c, 0x59, 0x65, 0xbe, 0xaa, 0xb1, 0x2c, 0x38, 0x0b, 0x62, 0xd8, 0x33, 0x5f, 0xd1, 0x8f, 0x48, 0xb0, 0x6c, 0x4f, 0x8e, 0x88, 0x28, 0x90, 0xb0, 0xb4, 0x2d, 0x25, 0x43, 0x48, 0xcf, 0x64, 0x56, 0xe3, 0xc1, 0x86, 0x4a, 0x34, 0x85, 0x51, 0xe4, 0xbd, 0x27, 0xf4, 0xa0, 0xd7, 0x2b, 0x32, 0x48, 0xf7, 0xc4, 0xc2, 0xc6, 0x2f, 0x47, 0xf6, 0x37, 0xf8, 0xde, 0x9c, 0x40, 0x2e, 0x81, 0x22, 0xa5, 0x5c, 0x22, 0xfd, 0x17, 0x3a, 0x28, 0x4a, 0x4e, 0x74, 0x1f, 0xb6, 0x58, 0xad, 0xae, 0x9c, 0x31, 0xc4, 0xc9, 0x6e, 0x93, 0x56, 0x27, 0x56, 0x0f, 0x84, 0xf7, 0x1d, 0x5d, 0xf6, 0xcf, 0x4b, 0xf1, 0x1f, 0xe5, 0x90, 0xce, 0xc3, 0x81, 0x62, 0x9f, 0xb7, 0xb2, 0xe8, 0x04, 0xe9, 0x41, 0x17, 0x2a, 0xa0, 0xe3, 0x1b, 0x9e, 0x04, 0xb2, 0xf8, 0x63, 0xe0, 0xde, 0x71, 0x42, 0xa7, 0xa0, 0x29, 0x61, 0xb5, 0x70, 0x08, 0x17, 0xd8, 0x78, 0xe0, 0xff, 0x0f, 0x48, 0x50, 0x4b, 0x91, 0xcb, 0xe9, 0x5b, 0x11, 0x7a, 0x90, 0x8f, 0x41, 0xcf, 0x23, 0x59, 0x95, 0xfd, 0x60, 0x96, 0x49, 0xde, 0x02, 0x1e, 0xa5, 0x2d, 0x2c, 0x99, 0x80, 0xf5, 0x0b, 0x95, 0x03, 0x49, 0xb8, 0xd6, 0xaf, 0x36, 0x5b, 0xed, 0xa1, 0xf6, 0x96, 0x0d, 0x15, 0x66, 0x21, 0x19, 0x2a, 0xbb, 0xb1, 0x01, 0xe5, 0x70, 0x1f, 0x4f, 0x77, 0x82, 0xc6, 0xfd, 0xc3, 0xe0, 0x2d, 0x8a, 0x1b, 0x1d, 0xe6, 0x4d, 0x4a, 0x69, 0xb5, 0x08, 0xd8, 0xbf, 0xf5, 0xc0, 0x89, 0x60, 0x38, 0xcc, 0x27, 0x7f, 0x2e, 0x2d, 0x81, 0x3e, 0xc8, 0x1d, 0xb4, 0xd9, 0x9c, 0xea, 0xa9, 0x21, 0x8c, 0x05, 0xdf, 0x2d, 0xa2, 0x56, 0x6b, 0x4c, 0x3f, 0xd3, 0x3d, 0x3d, 0x75, 0x51, 0xa4, 0xa3, 0xb1, 0x9a, 0x15, 0xb3, 0x9d, 0xbf, 0x28, 0x30, 0x44, 0xb0, 0xe3, 0x99, 0x78, 0x09, 0x3b, 0xa1, 0x70, 0x2f, 0xd8, 0xdf, 0xb6, 0x9c, 0x19, 0xc7, 0x41, 0x77, 0x58, 0xd9, 0xdd, 0x68, 0x6f, 0x18, 0xd4, 0xaa, 0x7a, 0xbe, 0xc7, 0x62, 0xdf, 0x2e, 0xdd, 0x2f, 0x8c, 0x2a, 0x20, 0x02, 0x80, 0x46, 0x23, 0x30, 0x8d, 0x9c, 0xe8, 0xc5, 0x5c, 0xc2, 0x02, 0x1c, 0xb1, 0xf9, 0xf7, 0xac, 0xf0, 0xa7, 0xe8, 0x25, 0xe1, 0x08, 0x74, 0xbc, 0xb0, 0x20, 0xd9, 0xc2, 0x38, 0xf4, 0x5c, 0x7c, 0x80, 0xf9, 0xec, 0x2f, 0x86, 0xcd, 0x02, 0x7a, 0x3c, 0x25, 0xcb, 0xe8, 0xd1, 0x07, 0x89, 0xc6, 0x31, 0x39, 0x37, 0x32, 0xcf, 0xf9, 0x6b, 0x75, 0xa2, 0xee, 0x81, 0x93, 0x6d, 0x5f, 0xf6, 0x20, 0x44, 0xa3, 0x12, 0x54, 0x4c, 0xd8, 0xca, 0x62, 0xc2, 0xd8, 0xe4, 0x06, 0x3f, 0x69, 0x5c, 0x5d, 0x3a, 0xb4, 0x07, 0xfa, 0xce, 0xf9, 0x76, 0x36, 0xbd, 0x80, 0x1d, 0xc7, 0xb6, 0xd3, 0xb4, 0x95, 0xd3, 0x2a, 0xde, 0xc9, 0x66, 0x27, 0x09, 0x26, 0xf5, 0xc3, 0x95, 0x9c, 0x83, 0x89, 0x38, 0x1a, 0x11, 0x02, 0xa1, 0xa5, 0x65, 0x70, 0x5b, 0xa7, 0x0a, 0xbe, 0xf5, 0x89, 0x98, 0xb8, 0x60, 0x83, 0x36, 0x78, 0x98, 0xb3, 0x5c, 0x20, 0x86, 0x6d, 0xde, 0xcf, 0x26, 0xd3, 0x26, 0xcd, 0xe5, 0xa5, 0xc0, 0x09, 0x4d, 0x5a, 0x1d, 0xc6, 0xe3, 0x6f, 0x90, 0x91, 0x50, 0xff, 0x9d, 0x76, 0xc0, 0x94, 0x73, 0x73, 0x88, 0x3d, 0xb7, 0x2d, 0x0b, 0xe0, 0x83, 0xe2, 0xde, 0xd2, 0xaf, 0x9f, 0x2a, 0xa5, 0x4f, 0xb3, 0x52, 0x41, 0x7c, 0x63, 0xd6, 0x36, 0x58, 0xdf, 0x78, 0x51, 0x4c, 0x75, 0x9d, 0x6e, 0x94, 0x05, 0xf5, 0x8c, 0xfe, 0xb5, 0x5e, 0x27, 0xee, 0xe5, 0x06, 0xc2, 0xa6, 0x66, 0xd0, 0xc3, 0xc4, 0xe6, 0xfa, 0x83, 0x0c, 0xaf, 0xfc, 0xa6, 0x68, 0x92, 0xb3, 0xa8, 0x2d, 0x1d, 0xbe, 0xb9, 0xa0, 0x15, 0x29, 0xcb, 0xb9, 0x20, 0x48, 0xe9, 0x27, 0xc1, 0xe6, 0xca, 0x93, 0x89, 0xa0, 0xa6, 0x29, 0x8c, 0x8b, 0x48, 0x55, 0x13, 0x1d, 0x65, 0xca, 0x90, 0x4a, 0x2c, 0xc9, 0xd7, 0xed, 0x1e, 0xa0, 0x8a, 0x6a, 0x20, 0x71, 0xd5, 0x91, 0xce, 0x34, 0x5c, 0xc6, 0x13, 0xff, 0x72, 0x5f, 0xf6, 0x85, 0x8c, 0x4e, 0xb7, 0xde, 0xf5, 0x00, 0x1b, 0x86, 0xc3, 0x85, 0x04, 0xa7, 0x09, 0xf0, 0x44, 0x9b, 0x4e, 0x01, 0xb3, 0xac, 0x3e, 0x01, 0x80, 0x1f, 0xa0, 0xee, 0xc4, 0x72, 0x88, 0xd8, 0x5d, 0xe1, 0xce, 0x8b, 0xf9, 0x2f, 0xbe, 0x6e, 0x71, 0xa2, 0x11, 0xab, 0x59, 0x50, 0x1d, 0x90, 0xd5, 0x99, 0x48, 0x36, 0xad, 0xf5, 0xc2, 0x60, 0xa4, 0xf0, 0x74, 0xa5, 0x06, 0x72, 0x33, 0xd2, 0x81, 0x44, 0x3a, 0x8a, 0x35, 0xd0, 0xd7, 0x2f, 0x0e, 0x28, 0x64, 0x06, 0x52, 0x4a, 0x79, 0x95, 0x76, 0xa3, 0x60, 0x50, 0x36, 0xd1, 0xc9, 0x75, 0xe5, 0xad, 0xbf, 0x35, 0x01, 0x89, 0xdb, 0x14, 0x0a, 0xb6, 0xb8, 0x92, 0x94, 0x4a, 0xa6, 0x0b, 0x9c, 0x1f, 0xa3, 0xdc, 0x18, 0x1f, 0x87, 0xc7, 0xd1, 0xbf, 0x7e, 0x99, 0x75, 0xca, 0xbb, 0x09, 0xe8, 0x60, 0x6b, 0xe4, 0xdc, 0x3e, 0xe8, 0x67, 0xa1, 0x40, 0x30, 0xec, 0x3e, 0x23, 0x95, 0xca, 0xc0, 0x90, 0xb6, 0x76, 0xd2, 0x56, 0xad, 0xee, 0x8e, 0xf8, 0x8a, 0x57, 0x93, 0x67, 0x01, 0xe4, 0x58, 0x10, 0x5f, 0xfb, 0xc0, 0x19, 0xc2, 0x93, 0xee, 0xe8, 0x8a, 0xe1, 0x5a, 0xe6, 0x0b, 0x33, 0x24, 0x82, 0x84, 0x1c, 0xa9, 0x78, 0x55, 0xd1, 0x55, 0x53, 0x6c, 0xd3, 0xb8, 0x30, 0x01, 0xce, 0xdb, 0xc6, 0x83, 0xc1, 0xd4, 0xa3, 0xd2, 0x60, 0x98, 0xb8, 0xae, 0xb7, 0x11, 0x18, 0x70, 0x0f, 0x70, 0xfd, 0xf7, 0x15, 0xc5, 0x0c, 0xe6, 0x39, 0xcc, 0xda, 0x0d, 0x55, 0x0a, 0xae, 0x24, 0x8f, 0x19, 0x89, 0xbf, 0x80, 0x41, 0x63, 0x7e, 0x96, 0x48, 0xb8, 0x84, 0xb6, 0x8a, 0x43, 0x2b, 0x26, 0x4c, 0x0a, 0xf6, 0xab, 0x4d, 0x9a, 0xc8, 0xee, 0x9e, 0x94, 0x53, 0x24, 0xb4, 0x68, 0xd2, 0xee, 0xbc, 0x61, 0xfb, 0x7e, 0x2e, 0xe2, 0x2f, 0xfc, 0xa5, 0xef, 0xf5, 0x28, 0xee, 0xee, 0xa6, 0x40, 0x5e, 0xaf, 0x6a, 0x24, 0x69, 0xab, 0x62, 0xb8, 0x71, 0x89, 0x27, 0x8a, 0xdc, 0xe7, 0x74, 0xb5, 0x69, 0x56, 0x1f, 0x05, 0xc4, 0xa6, 0x4e, 0x5b, 0x58, 0x65, 0xe7, 0x53, 0x64, 0xa2, 0x48, 0x25, 0x51, 0xf6, 0x39, 0xc9, 0x43, 0xc6, 0x1e, 0x5f, 0xee, 0xc2, 0x72, 0xcd, 0xab, 0xb1, 0x70, 0xaa, 0xca, 0x71, 0x13, 0x5b, 0x2a, 0x39, 0x41, 0x7b, 0x08, 0x22, 0x43, 0x81, 0x15, 0xe6, 0x79, 0x9c, 0xcb, 0xe7, 0x4c, 0xe2, 0x00, 0x73, 0x63, 0xaa, 0xbc, 0x46, 0x1a, 0x36, 0x48, 0x50, 0x30, 0x96, 0x87, 0xb9, 0xbf, 0xc8, 0x89, 0x23, 0x72, 0x24, 0x5e, 0x2f, 0xf2, 0xf8, 0x28, 0x42, 0xa1, 0x6f, 0x74, 0x89, 0x8b, 0xb7, 0xcb, 0x3a, 0x9a, 0x62, 0x83, 0x1d, 0x09, 0x0d, 0xdb, 0x4c, 0x1a, 0x40, 0x48, 0x37, 0x0c, 0x96, 0x09, 0xea, 0x47, 0x1e, 0x01, 0x93, 0xdb, 0x00, 0xc6, 0x3e, 0x28, 0x64, 0xf6, 0xe4, 0xde, 0x8f, 0xca, 0xa4, 0x29, 0x4f, 0xed, 0x50, 0x25, 0x9a, 0x8e, 0x2b, 0x98, 0x72, 0xb4, 0xf1, 0xe0, 0x0b, 0xd1, 0x18, 0x2a, 0x30, 0x9b, 0x56, 0xe5, 0xe3, 0x17, 0x63, 0x77, 0x44, 0xf6, 0x00, 0x2e, 0xb4, 0x25, 0x38, 0x79, 0x39, 0xa0, 0xe6, 0x58, 0x24, 0x87, 0x77, 0x11, 0xf2, 0x73, 0xf1, 0x25, 0x71, 0x0a, 0x34, 0x82, 0x24, 0xd1, 0x81, 0xfa, 0xe7, 0x42, 0x38, 0xf4, 0xd6, 0x1f, 0xe6, 0x61, 0x6c, 0x05, 0x7e, 0xf2, 0xe8, 0x44, 0xe7, 0x88, 0xf5, 0xee, 0xb7, 0xed, 0x89, 0x2e, 0x3f, 0xc1, 0x0e, 0xdb, 0xc7, 0xb7, 0xc0, 0x4d, 0x1a, 0x01, 0x56, 0x70, 0x46, 0x08, 0xe4, 0x16, 0x9d, 0x61, 0x00, 0x92, 0xff, 0xfc, 0x24, 0x82, 0x5c, 0x9f, 0x53, 0xec, 0x74, 0x93, 0xff, 0x8d, 0xe1, 0x9e, 0x2b, 0x6d, 0x58, 0x31, 0xcd, 0xb7, 0x2c, 0xe1, 0x76, 0xc8, 0x13, 0x1b, 0x34, 0x86, 0x2d, 0x14, 0xb8, 0xf3, 0x42, 0x00, 0xb4, 0x02, 0x4c, 0x84, 0x87, 0xa9, 0x35, 0x6d, 0x1c, 0x37, 0xe1, 0xa2, 0x0f, 0xe8, 0x6f, 0x57, 0x12, 0xb6, 0xbc, 0x84, 0x90, 0x73, 0x29, 0x96, 0x90, 0x15, 0x9f, 0x64, 0xdb, 0x51, 0xd0, 0x64, 0x61, 0x6b, 0xbf, 0x1f, 0xd9, 0x4c, 0x82, 0xe2, 0xa8, 0xd5, 0x46, 0xb7, 0x04, 0x73, 0x95, 0x93, 0x59, 0xf3, 0xd4, 0xd1, 0xeb, 0x98, 0x10, 0xdf, 0xbe, 0x6b, 0xfa, 0x38, 0xb3, 0xd3, 0x2f, 0x92, 0xf3, 0x65, 0xbd, 0x58, 0x90, 0xfd, 0xe3, 0x5a, 0x6a, 0x0e, 0x19, 0xc4, 0x50, 0x36, 0x50, 0x4c, 0x68, 0x16, 0x7b, 0xb0, 0xd1, 0x60, 0x4e, 0x60, 0x86, 0x31, 0x46, 0x77, 0x86, 0xa2, 0xe9, 0xf0, 0x32, 0x9a, 0x4f, 0x17, 0xf6, 0xe6, 0xe1, 0x3d, 0x2b, 0x8b, 0x61, 0xb0, 0x3c, 0x5a, 0x2b, 0xeb, 0x08, 0xc6, 0xba, 0x09, 0x88, 0xf3, 0x6d, 0x80, 0xb2, 0x0f, 0x8b, 0x0b, 0x9d, 0xe5, 0x86, 0xe8, 0xe5, 0xaf, 0x7c, 0x44, 0x51, 0x2c, 0x03, 0xf4, 0xb3, 0xf3, 0x26, 0x65, 0x10, 0x07, 0xab, 0xd6, 0x01, 0xab, 0x98, 0xc4, 0x59, 0x78, 0xf5, 0xa6, 0x08, 0xac, 0xd2, 0xdb, 0x40, 0xc5, 0x8c, 0xe1, 0xd6, 0x4f, 0x4d, 0xc7, 0xea, 0xfa, 0xd2, 0xe5, 0xca, 0xef, 0x71, 0xca, 0x14, 0x64, 0x5a, 0x76, 0x1b, 0x6e, 0x1d, 0xca, 0x8c, 0x17, 0x6c, 0x3c, 0x52, 0xb1, 0x22, 0xcf, 0xb6, 0x6a, 0x85, 0x43, 0xcb, 0x20, 0xc8, 0x88, 0x09, 0x76, 0xd5, 0x79, 0x38, 0x27, 0x49, 0xc7, 0x90, 0x9a, 0xbf, 0x33, 0x1e, 0xb7, 0x51, 0x01, 0x69, 0xfa, 0x5c, 0xa9, 0x56, 0xc5, 0x84, 0xcf, 0x49, 0xfb, 0xf8, 0x75, 0x8d, 0xca, 0xf7, 0x70, 0xf6, 0xc8, 0x94, 0x18, 0xc4, 0x42, 0xb6, 0x44, 0xcb, 0xd0, 0x62, 0x76, 0xd1, 0x2d, 0x3d, 0x52, 0x38, 0x46, 0x4c, 0x55, 0xdd, 0x91, 0xff, 0xc3, 0x3f, 0xa0, 0x6e, 0xe1, 0xe4, 0xf6, 0xe2, 0x65, 0xf8, 0x19, 0x97, 0x2b, 0x38, 0xe9, 0xc0, 0x29, 0x0e, 0x2f, 0xcc, 0xa5, 0xfd, 0x79, 0xe8, 0xa5, 0x40, 0x26, 0xc5, 0xa8, 0xae, 0xbd, 0x9b, 0x93, 0xe1, 0x83, 0x6e, 0xee, 0x97, 0x4c, 0x90, 0x50, 0x58, 0x91, 0x67, 0x18, 0x5a, 0xc3, 0x70, 0x5e, 0xa1, 0xdf, 0x84, 0x2a, 0x6a, 0x43, 0x5a, 0xe3, 0xca, 0xc0, 0x4e, 0x0a, 0x93, 0xf0, 0x60, 0x28, 0x77, 0xc9, 0x80, 0x04, 0x70, 0x73, 0x09, 0x1a, 0x5f, 0x57, 0x8b, 0x49, 0xf3, 0x79, 0xcd, 0xcc, 0xcc, 0x07, 0x12, 0x6b, 0xe0, 0x32, 0x9c, 0xf2, 0x1e, 0x3c, 0x6f, 0xe3, 0x52, 0xd2, 0x57, 0x68, 0x49, 0x9d, 0x2c, 0x8b, 0x35, 0x14, 0x55, 0xa9, 0x52, 0x94, 0x8b, 0x24, 0xca, 0xb2, 0xdf, 0x59, 0xd7, 0xd0, 0xff, 0xd2, 0x27, 0xee, 0xb5, 0xbc, 0x84, 0xc3, 0xb0, 0x9b, 0xb4, 0x0c, 0x87, 0x3c, 0x9e, 0x25, 0xfb, 0xeb, 0xaf, 0xd6, 0x7d, 0xe7, 0x7c, 0x6f, 0xf0, 0x13, 0xa9, 0x17, 0xaf, 0xee, 0x09, 0x61, 0xd2, 0xc5, 0x06, 0x20, 0xad, 0x28, 0x44, 0x7d, 0x9a, 0x9a, 0x81, 0x46, 0xf9, 0x8c, 0xc0, 0x89, 0x74, 0x8d, 0xa6, 0x62, 0x88, 0xbb, 0x24, 0x11, 0x40, 0x7d, 0x56, 0x4f, 0x44, 0x74, 0xab, 0xe3, 0x13, 0xae, 0x47, 0x70, 0x8d, 0x1d, 0xa5, 0x91, 0xb4, 0x48, 0x81, 0x27, 0xb3, 0x41, 0xf5, 0xf2, 0x20, 0xd7, 0xe2, 0x5f, 0x7e, 0x0c, 0x91, 0xa1, 0x06, 0xca, 0x9a, 0x03, 0xa7, 0xd1, 0x05, 0x7d, 0x4b, 0xf4, 0xb0, 0x85, 0x5c, 0x85, 0xf0, 0x27, 0x86, 0x0e, 0x7b, 0x58, 0xbf, 0x41, 0x86, 0x88, 0x85, 0x32, 0x2a, 0x76, 0x67, 0xc4, 0x0c, 0x48, 0xc7, 0x61, 0x3d, 0xdb, 0xde, 0xef, 0x5f, 0x58, 0x01, 0xff, 0x0a, 0x08, 0x22, 0x47, 0x6e, 0x69, 0x99, 0x52, 0x39, 0x81, 0x25, 0x76, 0xbb, 0x72, 0x2d, 0x07, 0x47, 0x4f, 0x4c, 0xca, 0xdd, 0x2e, 0x0d, 0xac, 0x07, 0x7e, 0xf3, 0xb4, 0x01, 0x9b, 0xbd, 0x37, 0x1c, 0xa0, 0xe7, 0x4b, 0x64, 0x7d, 0x74, 0x7d, 0x81, 0x49, 0xeb, 0xc7, 0xdb, 0xd9, 0xa0, 0xbc, 0x02, 0x91, 0x34, 0x06, 0x4c, 0x7a, 0x5f, 0x12, 0xc0, 0x95, 0xed, 0x0a, 0x32, 0x6f, 0x07, 0x04, 0xb0, 0xf6, 0xb4, 0x79, 0x1d, 0x8b, 0xa0, 0xf8, 0x1c, 0x58, 0x1b, 0x1b, 0x30, 0xe4, 0x64, 0xbb, 0x21, 0xe4, 0x28, 0x60, 0xa1, 0x55, 0x46, 0xfb, 0x2f, 0xc7, 0xd5, 0xd8, 0x3c, 0xfc, 0x68, 0xce, 0x8c, 0xb1, 0x90, 0xb9, 0xe0, 0xbc, 0xa3, 0x2a, 0xd2, 0x57, 0xbc, 0x5c, 0x00, 0xbc, 0x03, 0x6a, 0x6c, 0xf2, 0x2f, 0xc0, 0x23, 0xe6, 0x49, 0xcf, 0x1d, 0xbd, 0xb2, 0x06, 0x65, 0x69, 0x67, 0xfd, 0x79, 0x7a, 0x84, 0xf3, 0xf4, 0x37, 0x07, 0x7a, 0x6a, 0xee, 0xd7, 0x71, 0x94, 0x88, 0x05, 0x33, 0xad, 0x60, 0x51, 0x0e, 0x1b, 0x56, 0xf0, 0xf7, 0x52, 0x1f, 0x8c, 0x7b, 0xf6, 0xdf, 0x8d, 0xf9, 0x3f, 0xf9, 0x97, 0x0f, 0xa2, 0x25, 0x53, 0x52, 0xae, 0xc4, 0x73, 0x42, 0x34, 0x71, 0xf0, 0x7d, 0xaa, 0xd9, 0x96, 0x32, 0xd1, 0xcc, 0xc3, 0xd9, 0x96, 0x94, 0x6c, 0x21, 0x36, 0x85, 0x60, 0x2a, 0xa6, 0xd5, 0xd1, 0xf5, 0x32, 0xae, 0x10, 0x19, 0x64, 0x82, 0x98, 0xb7, 0x27, 0x9f, 0x4e, 0xaf, 0x2c, 0x03, 0x07, 0x14, 0x8d, 0x71, 0x4b, 0xde, 0xb1, 0xc4, 0x59, 0xdf, 0x6f, 0x84, 0x6a, 0xf9, 0x76, 0xb7, 0x3a, 0x8d, 0xec, 0xf9, 0xc5, 0x36, 0x55, 0xcf, 0x4e, 0xb8, 0xb7, 0x39, 0xa6, 0x33, 0xfb, 0x86, 0xab, 0x9d, 0x97, 0x6c, 0x0f, 0x6e, 0x6a, 0x58, 0x5b, 0x9d, 0xe7, 0x03, 0x33, 0xcc, 0x76, 0x46, 0xdb, 0xc0, 0x17, 0x2f, 0xfa, 0x13, 0x49, 0x54, 0x9e, 0x2d, 0x2a, 0x67, 0x81, 0x70, 0xdf, 0x0b, 0x8b, 0xb3, 0x36, 0xe6, 0x97, 0xf2, 0x8a, 0xf8, 0x7a, 0x43, 0xe8, 0x2b, 0x41, 0x0c, 0x6f, 0x2b, 0xbb, 0x74, 0xfd, 0x77, 0x38, 0x17, 0x08, 0xb9, 0x8f, 0xfe, 0xc9, 0x53, 0x66, 0xce, 0xa0, 0x3a, 0xad, 0x3f, 0xb4, 0x07, 0x6c, 0xd0, 0xda, 0x4b, 0xbf, 0xba, 0xb8, 0x23, 0x1e, 0x22, 0x2a, 0x0d, 0xe2, 0x92, 0xe4, 0xfa, 0x05, 0xaa, 0x59, 0xa5, 0x2a, 0x13, 0xdc, 0x22, 0xdd, 0xb5, 0x05, 0xba, 0x1b, 0x2a, 0x57, 0xf6, 0x15, 0x72, 0x1f, 0xfa, 0x31, 0xe8, 0x9f, 0x14, 0x52, 0x74, 0x6c, 0x95, 0x59, 0x03, 0x15, 0xe0, 0xec, 0x34, 0x05, 0xc0, 0x76, 0x54, 0xab, 0xff, 0x6e, 0x8d, 0xd8, 0x34, 0xdd, 0x5a, 0x68, 0xdc, 0x1a, 0x3e, 0x24, 0xac, 0xd8, 0xb6, 0xe7, 0x26, 0x63, 0x6c, 0x00, 0x6b, 0x27, 0xad, 0xd8, 0x50, 0x72, 0x1d, 0xd5, 0xb3, 0x7b, 0xaa, 0x7d, 0x10, 0xa2, 0xbe, 0xdf, 0x4f, 0xf9, 0xb9, 0x2e, 0xe0, 0x04, 0x9e, 0xb0, 0x0a, 0xbd, 0x0c, 0xd6, 0x80, 0xdb, 0x71, 0xad, 0x36, 0x54, 0x7a, 0x75, 0x72, 0x21, 0xce, 0x8e, 0x26, 0x41, 0xfb, 0x9c, 0x7d, 0x00, 0xb0, 0xe3, 0xb4, 0x79, 0x2e, 0xf3, 0x2b, 0x5a, 0xf9, 0x8a, 0xbc, 0xe7, 0xd3, 0xb6, 0x4b, 0x42, 0xea, 0x3a, 0x9e, 0xe9, 0x51, 0x33, 0x6f, 0x80, 0xad, 0xfb, 0xc0, 0xd1, 0x31, 0x4e, 0x6f, 0x11, 0xcc, 0xab, 0x0a, 0x64, 0xa0, 0xfd, 0xe4, 0xa4, 0xb7, 0x7b, 0x69, 0x5e, 0xf1, 0xcd, 0xae, 0x1e, 0x41, 0x70, 0x4d, 0xed, 0x19, 0x5b, 0x6f, 0x17, 0x23, 0xe3, 0x2a, 0x32, 0x32, 0xdc, 0x0e, 0x5b, 0x78, 0x01, 0xfa, 0xc3, 0xf9, 0x96, 0x34, 0x6b, 0x3f, 0x4b, 0xb9, 0x2b, 0x50, 0x64, 0xd2, 0xf9, 0xdd, 0x17, 0xe8, 0x68, 0xbc, 0x35, 0x99, 0x6f, 0x99, 0x0d, 0x0c, 0x6c, 0xe8, 0x8e, 0x81, 0x68, 0x1d, 0xab, 0x2c, 0x9d, 0x20, 0x04, 0x43, 0x35, 0xfb, 0xc2, 0x56, 0x55, 0xd6, 0xc2, 0xdf, 0x5a, 0x26, 0xf7, 0x1a, 0x63, 0x21, 0x09, 0x16, 0x0f, 0x75, 0x42, 0x0c, 0x88, 0x39, 0xab, 0xf1, 0xc0, 0x24, 0x72, 0x47, 0xfa, 0xfd, 0x8f, 0x38, 0x8d, 0x52, 0xa7, 0xe5, 0xe4, 0x6d, 0x31, 0xfc, 0xca, 0x84, 0xd7, 0x88, 0xe4, 0x30, 0x1f, 0x0e, 0x7f, 0x20, 0x4a, 0xd5, 0x8d, 0x0f, 0x7d, 0x85, 0xe9, 0xf3, 0x1e, 0xf4, 0xe3, 0x78, 0x81, 0x3c, 0xf8, 0xac, 0xc4, 0x11, 0xe1, 0xfc, 0xf7, 0x51, 0xd0, 0x5f, 0x80, 0xdd, 0xf6, 0xd1, 0xbe, 0xa8, 0x48, 0x03, 0xed, 0x0d, 0x83, 0x51, 0x4a, 0x66, 0x6d, 0xf4, 0x77, 0xda, 0x5e, 0x79, 0x20, 0x76, 0x00, 0x71, 0xdf, 0x7f, 0x53, 0x6b, 0x5d, 0x07, 0xf4, 0x1f, 0xbb, 0xbf, 0x9e, 0xec, 0x30, 0x0c, 0xf1, 0x85, 0xf3, 0x5d, 0x72, 0xe7, 0x5b, 0xbb, 0xd4, 0x8e, 0x44, 0xa2, 0x76, 0xe8, 0xb6, 0x0f, 0x2c, 0x0a, 0xc1, 0xda, 0x42, 0xa2, 0xab, 0x46, 0xbe, 0x2c, 0x4e, 0xd7, 0xe6, 0x69, 0xbb, 0x63, 0x02, 0x0d, 0x23, 0x6c, 0x63, 0xb8, 0xf8, 0xad, 0xa4, 0x28, 0x4f, 0xf3, 0x30, 0xad, 0x89, 0x2e, 0x04, 0xdd, 0x32, 0xc8, 0xb7, 0x88, 0x29, 0x35, 0xb7, 0xef, 0x01, 0xcc, 0xd5, 0x30, 0xa8, 0xd5, 0x04, 0x05, 0x46, 0xe3, 0x5d, 0xae, 0x68, 0x64, 0x67, 0x2c, 0x5e, 0x76, 0x96, 0xb0, 0xe1, 0xfc, 0x11, 0x53, 0xfa, 0xf1, 0xb8, 0x07, 0x1f, 0xfd, 0x66, 0xce, 0x9e, 0x46, 0x73, 0x2a, 0x3f, 0x89, 0x7e, 0xd4, 0x24, 0x69, 0x69, 0xb0, 0xf5, 0x07, 0xa4, 0x01, 0x3a, 0xd2, 0xaf, 0xda, 0x08, 0xa1, 0xda, 0xd5, 0xe0, 0xff, 0x50, 0x06, 0xd4, 0xc5, 0x53, 0x32, 0xeb, 0xef, 0xc9, 0x3d, 0xc7, 0xa8, 0xf8, 0xe2, 0x85, 0xa7, 0x8e, 0xa7, 0xe5, 0xbe, 0xe4, 0x0f, 0xab, 0xb0, 0x83, 0x11, 0x45, 0x44, 0xe8, 0xc9, 0xad, 0x97, 0x84, 0x6e, 0x91, 0xb6, 0x07, 0x84, 0xb2, 0x6c, 0xde, 0x52, 0x8a, 0x59, 0xfa, 0x97, 0x31, 0x44, 0xd4, 0x79, 0x81, 0xb3, 0xae, 0xbe, 0x79, 0xb8, 0x1b, 0x3e, 0xdf, 0x0d, 0xc1, 0x98, 0x29, 0x63, 0x5e, 0x25, 0x9e, 0xf8, 0x09, 0x2a, 0xb9, 0x68, 0xbb, 0x52, 0xce, 0xc5, 0x0d, 0x5b, 0xef, 0xe9, 0x43, 0x0f, 0x11, 0x0b, 0x8a, 0x76, 0x6b, 0x91, 0x7e, 0x4a, 0x1f, 0x25, 0xef, 0xab, 0x1c, 0x0b, 0xe5, 0x14, 0x43, 0xb2, 0xe1, 0x8e, 0xc9, 0x89, 0x66, 0x23, 0xdc, 0x13, 0xb8, 0x96, 0x89, 0x3e, 0xe4, 0x51, 0xdd, 0xf1, 0x00, 0x9f, 0x4a, 0xe4, 0xb4, 0x1b, 0x4d, 0xb4, 0xfa, 0x69, 0x4e, 0x37, 0x21, 0x23, 0xc8, 0x0d, 0x18, 0x16, 0xa9, 0x77, 0xe9, 0xaf, 0xfc, 0x6c, 0x84, 0xb0, 0xc5, 0xea, 0xbe, 0x27, 0x2c, 0x8b, 0x99, 0xa1, 0xde, 0x58, 0xc6, 0x9b, 0xb1, 0xe1, 0x68, 0x39, 0x87, 0x8e, 0x1b, 0x3b, 0x74, 0x30, 0x35, 0x2c, 0x23, 0xdb, 0x4c, 0xdc, 0x75, 0xf8, 0xf8, 0x11, 0x6c, 0x96, 0xd9, 0x7a, 0x48, 0x01, 0xdc, 0xe4, 0xef, 0x96, 0xbb, 0xb0, 0x92, 0xd5, 0xc3, 0x85, 0x8e, 0xb8, 0xda, 0x42, 0x90, 0x43, 0xc0, 0x37, 0xfd, 0x5d, 0x95, 0x94, 0x91, 0xde, 0x9c, 0x21, 0x46, 0xe9, 0x3e, 0x30, 0x77, 0x7c, 0x52, 0xd1, 0x45, 0x45, 0x9b, 0x44, 0x3a, 0xb8, 0x92, 0xb4, 0x2c, 0x5e, 0x66, 0x22, 0x64, 0x70, 0x42, 0x9f, 0x00, 0xa4, 0xce, 0xbe, 0x96, 0x47, 0xf8, 0x49, 0x1a, 0x8c, 0xf4, 0x33, 0x02, 0x24, 0x81, 0xce, 0xa7, 0x0e, 0x6f, 0x3e, 0xef, 0xb1, 0x5e, 0x2e, 0x29, 0x28, 0xc8, 0xc1, 0x38, 0xdd, 0x42, 0xcb, 0xf4, 0x59, 0xfe, 0x42, 0xcd, 0x5a, 0x95, 0xef, 0xb2, 0x26, 0x03, 0x69, 0x31, 0x20, 0xf3, 0x44, 0xdf, 0x99, 0x3e, 0x86, 0xfa, 0xe8, 0xae, 0x5a, 0x4d, 0xbd, 0x07, 0x09, 0x54, 0xb2, 0x48, 0x25, 0xa1, 0x23, 0x2e, 0x08, 0x7e, 0x40, 0xfa, 0x7d, 0xd4, 0x60, 0x74, 0xbc, 0x4b, 0x99, 0x30, 0x9c, 0xb3, 0x8d, 0x10, 0x04, 0xa3, 0x86, 0x0a, 0xa2, 0x5f, 0xc6, 0x2b, 0xe0, 0xff, 0x18, 0xdc, 0x14, 0xce, 0xab, 0x65, 0xf7, 0xf1, 0x20, 0xaf, 0x59, 0x49, 0xe2, 0x4e, 0x13, 0x9a, 0xb6, 0xbe, 0x3c, 0xec, 0x93, 0xed, 0xa0, 0x31, 0xb3, 0xfa, 0x6d, 0x29, 0xea, 0x3d, 0x30, 0x83, 0x37, 0x87, 0x00, 0x45, 0x99, 0xab, 0xf9, 0x6d, 0x23, 0x3d, 0xed, 0xd8, 0x53, 0x99, 0x55, 0x64, 0xa0, 0x27, 0x8e, 0x52, 0x52, 0xde, 0x42, 0xee, 0x96, 0x07, 0x24, 0x71, 0xd2, 0x44, 0xe0, 0x26, 0x36, 0xd0, 0x51, 0xcc, 0x94, 0x08, 0xf5, 0x3c, 0x71, 0x2b, 0x9f, 0x4b, 0x5c, 0x5e, 0x6c, 0xf2, 0x7e, 0xf3, 0xf8, 0xac, 0x73, 0xea, 0xd2, 0x20, 0x58, 0xb8, 0x2d, 0x00, 0x25, 0x48, 0xd8, 0x31, 0x3d, 0x40, 0x70, 0x2c, 0x44, 0x85, 0xd4, 0xa4, 0x31, 0x01, 0xd9, 0x69, 0xa4, 0xa4, 0x3f, 0x8c, 0x79, 0xa8, 0xe4, 0xc4, 0x9d, 0x1a, 0x38, 0x10, 0x20, 0x96, 0xf1, 0x9e, 0x8c, 0x52, 0x00, 0xec, 0x76, 0x5d, 0xc3, 0x2d, 0x52, 0x29, 0x7c, 0xee, 0x8c, 0x48, 0x02, 0xf9, 0xd4, 0x73, 0xb6, 0x79, 0xb9, 0xd0, 0xb9, 0x60, 0x79, 0x75, 0x5c, 0x06, 0x17, 0x28, 0xd8, 0x12, 0xaf, 0x68, 0x40, 0x9e, 0x07, 0xb2, 0xb3, 0x96, 0x66, 0xfd, 0xd6, 0x61, 0xa9, 0x87, 0x81, 0xc4, 0x93, 0xd3, 0xb9, 0x03, 0x65, 0xf2, 0xdf, 0x49, 0xae, 0x03, 0x26, 0x49, 0x65, 0xf6, 0x4b, 0x26, 0x35, 0x95, 0x80, 0x90, 0x18, 0xc4, 0xa9, 0x31, 0x27, 0x07, 0xca, 0x47, 0xb1, 0x46, 0xc0, 0x92, 0x8a, 0xcd, 0x30, 0x70, 0xa5, 0x97, 0xbe, 0x47, 0xe5, 0xcc, 0x7f, 0x23, 0x31, 0x88, 0xb0, 0xa0, 0xc7, 0xde, 0xa8, 0x0b, 0xd2, 0x1d, 0x0b, 0xc4, 0x3e, 0x51, 0x41, 0xe6, 0xcb, 0x0d, 0x26, 0x2a, 0x60, 0x68, 0x03, 0x09, 0xa3, 0x46, 0xbe, 0x21, 0xc6, 0xd9, 0x4d, 0xda, 0xa3, 0x67, 0x70, 0x49, 0x0c, 0x4d, 0xa0, 0x55, 0x5c, 0x44, 0x42, 0x18, 0x52, 0xe3, 0x21, 0x88, 0x20, 0x65, 0x1b, 0x56, 0xbe, 0xad, 0x1b, 0x16, 0x84, 0x87, 0x47, 0xa1, 0xf8, 0x31, 0x7a, 0xb7, 0xe5, 0x1a, 0xf4, 0xe9, 0xad, 0xe9, 0x50, 0xb6, 0xdf, 0xc1, 0xb7, 0xf5, 0x0c, 0xc3, 0x54, 0x73, 0xd7, 0xd5, 0x07, 0xdc, 0x4c, 0xa2, 0x5e, 0xdf, 0x73, 0xe2, 0xc1, 0x8d, 0x24, 0xdc, 0xec, 0x02, 0x1c, 0x29, 0xa3, 0x48, 0x51, 0xba, 0xa0, 0x78, 0x83, 0x1d, 0xd1, 0x22, 0x14, 0xfb, 0xc0, 0xef, 0x19, 0xe6, 0x53, 0x85, 0xb1, 0x51, 0xb5, 0xab, 0x96, 0xe0, 0x94, 0xae, 0xf1, 0xe3, 0x8d, 0x03, 0x73, 0x1d, 0xe4, 0x2d, 0xa1, 0xc9, 0x79, 0xe2, 0x6f, 0xdf, 0xf7, 0x69, 0x11, 0x93, 0x4f, 0x46, 0x0e, 0x1e, 0x65, 0x19, 0x96, 0xc2, 0x08, 0xc4, 0x15, 0x08, 0x28, 0xcc, 0x08, 0x4d, 0x43, 0x02, 0x10, 0x7c, 0x21, 0x62, 0x44, 0x1d, 0xc1, 0x3b, 0xcc, 0x8f, 0x93, 0x90, 0xac, 0x91, 0xe8, 0xbe, 0xdd, 0x08, 0xa6, 0x60, 0xa2, 0xfc, 0x40, 0x70, 0x19, 0xe3, 0xe5, 0xaf, 0x10, 0x22, 0xf8, 0x46, 0x1b, 0xd1, 0xc1, 0xad, 0xe3, 0xbe, 0x62, 0xcc, 0xc1, 0xb5, 0x0c, 0x60, 0x8c, 0xff, 0x72, 0xa1, 0xaf, 0x29, 0x7e, 0x22, 0x7e, 0x07, 0x43, 0xf8, 0xca, 0xf7, 0x34, 0x1e, 0xb2, 0x6a, 0x93, 0x18, 0xbd, 0xa1, 0x2c, 0xd7, 0x26, 0xb5, 0x42, 0xdd, 0x77, 0xda, 0xca, 0xa1, 0x59, 0xe4, 0xd7, 0x35, 0xab, 0x0b, 0x56, 0x26, 0xd1, 0xeb, 0xfb, 0xa4, 0x4f, 0xcf, 0x7b, 0xe2, 0x96, 0x2e, 0xfc, 0xc0, 0x1d, 0x76, 0xc9, 0xa8, 0xb4, 0x09, 0x4b, 0xb5, 0x16, 0x85, 0x35, 0x1b, 0xbd, 0x49, 0xfe, 0xc3, 0xfa, 0x35, 0x94, 0x35, 0x44, 0xb0, 0x4f, 0xbb, 0xd1, 0xf0, 0x23, 0xc3, 0x63, 0x76, 0x1b, 0x86, 0x65, 0xd7, 0x02, 0xe7, 0x36, 0xc2, 0x63, 0x9e, 0xc5, 0x3f, 0xb5, 0x95, 0x5e, 0x35, 0xcf, 0x92, 0xc3, 0x2f, 0xa2, 0x17, 0x7f, 0x5f, 0x26, 0x87, 0x77, 0xe4, 0x95, 0x89, 0xc2, 0x48, 0xd8, 0xb1, 0xba, 0x4d, 0x3e, 0x5e, 0x53, 0xe9, 0x74, 0xde, 0xac, 0x8f, 0xb2, 0xd9, 0xe4, 0xb0, 0x32, 0xec, 0x2f, 0x82, 0xe6, 0x94, 0x29, 0x00, 0x6a, 0x4e, 0x6a, 0x32, 0x38, 0xfc, 0x5a, 0xae, 0x1b, 0x8b, 0x46, 0x5f, 0xe6, 0xd3, 0xb4, 0x85, 0x65, 0xbe, 0xf4, 0xfd, 0x94, 0xad, 0xf8, 0xc3, 0x0f, 0x17, 0x66, 0xb5, 0xca, 0x73, 0xea, 0x99, 0x02, 0x59, 0xd1, 0x62, 0x73, 0xe4, 0xd4, 0xaf, 0xcc, 0x5a, 0x31, 0x95, 0x60, 0x0f, 0x01, 0x9e, 0x1e, 0x86, 0xc5, 0x11, 0xc3, 0xda, 0x42, 0x74, 0x4e, 0x5c, 0x8f, 0x50, 0xb4, 0x7e, 0x6c, 0x34, 0xd6, 0xf0, 0xd5, 0xfc, 0xb0, 0x08, 0xd7, 0x53, 0xd3, 0x67, 0xa3, 0x77, 0x15, 0xda, 0xe1, 0x3d, 0x87, 0x7e, 0x46, 0x54, 0xa7, 0x28, 0x69, 0xcd, 0xd7, 0x03, 0xd2, 0xdb, 0x0e, 0x7b, 0x54, 0xd8, 0xce, 0x5a, 0x9e, 0x89, 0x56, 0x31, 0x0c, 0xa3, 0x18, 0xfa, 0xc3, 0x8e, 0x6d, 0xfb, 0xfc, 0x68, 0x88, 0xee, 0xa0, 0x4d, 0xa8, 0x5e, 0x16, 0xd6, 0x92, 0x54, 0x58, 0xdf, 0x3f, 0x33, 0x4d, 0x8e, 0xd2, 0xe1, 0x53, 0x91, 0xcd, 0x27, 0x1a, 0xa6, 0x83, 0x5b, 0xb9, 0x61, 0xd1, 0x3c, 0xfb, 0x2a, 0x09, 0x1d, 0xfa, 0x85, 0x2f, 0x46, 0xf0, 0x96, 0x68, 0x97, 0x49, 0xe4, 0xaf, 0x6e, 0xfd, 0x5d, 0xca, 0xcb, 0x1c, 0x9a, 0x7c, 0xb2, 0xab, 0x65, 0xfd, 0xd1, 0xae, 0x78, 0xa7, 0x63, 0x86, 0x88, 0xf2, 0x54, 0x7d, 0x82, 0xa2, 0xa6, 0xa0, 0x15, 0x3f, 0x13, 0xcd, 0x70, 0xc6, 0xf4, 0x0c, 0x4d, 0x9e, 0x61, 0x22, 0x2e, 0xcd, 0x9a, 0x64, 0xe6, 0x6c, 0xa5, 0xca, 0x5c, 0x58, 0x39, 0x44, 0x8c, 0x2b, 0xdb, 0x51, 0xce, 0x6b, 0x47, 0xcd, 0x5b, 0x01, 0x11, 0x0a, 0x0d, 0xec, 0x8c, 0x23, 0x66, 0x36, 0xeb, 0x8d, 0xd4, 0x27, 0xa6, 0xef, 0x33, 0xba, 0x20, 0x34, 0x94, 0x4d, 0x86, 0xde, 0x3d, 0x9c, 0xfa, 0x9d, 0xf1, 0xf0, 0xf1, 0x20, 0x71, 0x94, 0xd9, 0x2b, 0x42, 0x89, 0x00, 0xea, 0xb1, 0x7a, 0xb1, 0x85, 0x15, 0xf2, 0xa0, 0xf4, 0x54, 0xcd, 0x87, 0x15, 0xa8, 0xed, 0x12, 0xfb, 0xa3, 0x2e, 0xf9, 0x89, 0x71, 0x9b, 0x6b, 0x40, 0x5e, 0xe2, 0xb3, 0x56, 0x97, 0x05, 0x16, 0x08, 0x35, 0x53, 0xfa, 0x31, 0x77, 0x97, 0x4e, 0x1a, 0x4f, 0x8f, 0x25, 0x94, 0x21, 0x9f, 0xa4, 0x44, 0xc7, 0xc7, 0x1f, 0x3f, 0xd8, 0xd3, 0x7f, 0xd7, 0x2a, 0xd1, 0xe7, 0xb4, 0x95, 0xc8, 0x97, 0x26, 0xfa, 0xa7, 0x10, 0xb9, 0x84, 0x7c, 0x78, 0x0a, 0x2e, 0xe6, 0x41, 0xda, 0x86, 0xcd, 0x06, 0x61, 0xb0, 0x50, 0xb5, 0xe4, 0xad, 0xff, 0xf3, 0x8a, 0xde, 0x4b, 0xbc, 0x6c, 0xc3, 0x3a, 0x4a, 0xeb, 0x09, 0x60, 0x39, 0x46, 0xc4, 0x0a, 0xe8, 0x6c, 0xf9, 0xbc, 0x22, 0x0e, 0x5f, 0xde, 0xfe, 0xf9, 0x66, 0xb2, 0x03, 0xa3, 0x79, 0x89, 0x90, 0x03, 0x80, 0x37, 0x7b, 0xa6, 0xaa, 0xc4, 0xf9, 0x00, 0x69, 0x64, 0xbe, 0x00, 0xbe, 0xa9, 0x65, 0xe7, 0xb6, 0xf8, 0x11, 0x59, 0x35, 0x3a, 0x55, 0xb4, 0xf2, 0xd3, 0x51, 0xa2, 0xc3, 0xd8, 0x1e, 0xea, 0x1b, 0x7c, 0x6d, 0x8c, 0xd0, 0xcc, 0x6a, 0x0c, 0x22, 0x9d, 0xe7, 0x0e, 0xfa, 0xc2, 0xb6, 0x23, 0x6f, 0x82, 0x56, 0xe3, 0x8e, 0x49, 0xd3, 0x3c, 0x5b, 0x9d, 0xe7, 0x09, 0x13, 0x54, 0x65, 0xe6, 0xb4, 0x04, 0xd7, 0x43, 0xbf, 0xbc, 0x66, 0xb8, 0x3d, 0xf1, 0xfb, 0x98, 0x00, 0xbb, 0xa4, 0xc9, 0x2b, 0x42, 0x39, 0xd3, 0xf5, 0x72, 0x3f, 0x36, 0xa9, 0xf7, 0x0c, 0x01, 0xf1, 0x65, 0x2c, 0xa0, 0x55, 0xb6, 0x04, 0xf6, 0xff, 0xfa, 0xb5, 0xac, 0xc1, 0x4a, 0x44, 0xc8, 0x59, 0xfe, 0xf7, 0x81, 0xf3, 0x20, 0x02, 0x51, 0xef, 0x20, 0x62, 0x4d, 0xe5, 0xc8, 0x0a, 0xb2, 0xe6, 0x73, 0x3d, 0xc0, 0x05, 0x7a, 0x3b, 0xcb, 0x16, 0xf0, 0x1f, 0x8f, 0xb6, 0x8f, 0x08, 0xc4, 0x8c, 0xf1, 0x77, 0xf2, 0xce, 0x04, 0xf8, 0x87, 0x06, 0xb8, 0x05, 0x27, 0x16, 0xfa, 0x27, 0x43, 0x79, 0xe6, 0x5e, 0xed, 0xcd, 0x38, 0xc3, 0xea, 0x8e, 0x04, 0x6c, 0x09, 0x25, 0xa8, 0x90, 0xb4, 0x21, 0xfe, 0xeb, 0xc5, 0xc4, 0xd6, 0x64, 0x9b, 0xc1, 0xa3, 0xee, 0x6c, 0x44, 0x74, 0xac, 0xdc, 0x33, 0x26, 0x58, 0xcf, 0xb3, 0xd8, 0xe5, 0x7c, 0xef, 0xa0, 0x63, 0xc4, 0x15, 0x7c, 0x24, 0xc1, 0xa0, 0x8c, 0x1d, 0xa1, 0xdd, 0x7e, 0x8e, 0xb5, 0xa8, 0x49, 0xe6, 0xc5, 0x77, 0x1e, 0xe1, 0xa7, 0x9b, 0x9b, 0xf3, 0x0f, 0xc2, 0x43, 0xe9, 0xa9, 0xbf, 0x2b, 0xce, 0x65, 0x8e, 0xf5, 0x0b, 0x13, 0x92, 0x02, 0xd3, 0x2f, 0x22, 0xe4, 0xbe, 0xfe, 0x44, 0x12, 0xb4, 0xda, 0xb8, 0xe0, 0x0d, 0xc9, 0x39, 0xae, 0xf6, 0x55, 0xff, 0x5f, 0x17, 0x98, 0x88, 0x0d, 0x73, 0x97, 0x98, 0xfa, 0x8f, 0xd1, 0x7f, 0xca, 0xd6, 0x17, 0x9a, 0xf0, 0x3c, 0x9d, 0x1c, 0x67, 0x22, 0x52, 0x0e, 0xa2, 0x79, 0x6d, 0x95, 0xc5, 0x2b, 0x48, 0x74, 0x15, 0xb6, 0x72, 0xd1, 0xad, 0x1a, 0x00, 0x3c, 0x74, 0xf6, 0x23, 0xed, 0x4b, 0xee, 0x00, 0x4d, 0x8b, 0x4f, 0xbb, 0xb9, 0xae, 0xf6, 0xd5, 0x82, 0x4c, 0x6e, 0xb9, 0x38, 0x4a, 0x58, 0x91, 0x28, 0x4e, 0x10, 0x5e, 0x23, 0x75, 0x8d, 0x48, 0x81, 0x49, 0x89, 0x32, 0x66, 0xed, 0xe2, 0x92, 0x44, 0x9b, 0x41, 0x80, 0xa1, 0x51, 0xf9, 0x0d, 0x1b, 0xc6, 0x32, 0xd5, 0xa9, 0xa3, 0x46, 0xd8, 0x23, 0xf0, 0x6b, 0x85, 0x05, 0xcc, 0x93, 0x18, 0x70, 0x62, 0x90, 0x26, 0x71, 0x18, 0x7c, 0x76, 0x86, 0x09, 0x58, 0x13, 0x5e, 0xb6, 0xf3, 0x9f, 0xe1, 0xf8, 0x0d, 0xea, 0x70, 0x3a, 0xbd, 0xc4, 0x6e, 0xe4, 0x10, 0x0f, 0xff, 0x1a, 0xf3, 0x18, 0x0f, 0xa7, 0x53, 0x27, 0x97, 0x34, 0x82, 0x54, 0x1b, 0xbe, 0xdd, 0x9d, 0x78, 0x47, 0xac, 0x36, 0xdc, 0xcb, 0x49, 0x20, 0x16, 0x75, 0x85, 0xfd, 0x10, 0x13, 0x47, 0x23, 0x99, 0xc8, 0x76, 0xef, 0x68, 0x00, 0x19, 0x5b, 0x5e, 0xa9, 0xbd, 0xd3, 0x0c, 0xa1, 0x17, 0x45, 0x75, 0x6a, 0xeb, 0x78, 0x15, 0x25, 0x2d, 0x9e, 0x22, 0xbe, 0x65, 0x2c, 0x11, 0x64, 0x58, 0xe9, 0x5c, 0x3c, 0xe4, 0x45, 0x83, 0x56, 0x2c, 0xed, 0x51, 0xe0, 0xf5, 0x9c, 0x60, 0x99, 0x50, 0x34, 0xdf, 0x89, 0x7a, 0x0d, 0x93, 0xf0, 0x00, 0x8d, 0x1c, 0x7c, 0x26, 0xf9, 0x7a, 0xbe, 0x8a, 0x8a, 0xcf, 0xdf, 0x05, 0xc4, 0x66, 0x8f, 0xd2, 0x03, 0xf5, 0x3f, 0xf2, 0x57, 0x1f, 0x90, 0xce, 0x91, 0x3d, 0x0b, 0x1f, 0x9e, 0x5e, 0x12, 0x0b, 0x14, 0x8c, 0x16, 0x90, 0x0b, 0x52, 0x0b, 0x26, 0x2e, 0x7b, 0x19, 0xa0, 0x12, 0x1b, 0x95, 0x54, 0xc6, 0xd4, 0x2f, 0x7b, 0xab, 0x52, 0x6d, 0xdb, 0x85, 0x18, 0x58, 0xa3, 0xd3, 0x7f, 0x75, 0x96, 0x5c, 0xfb, 0xf6, 0x6b, 0x0b, 0xa1, 0x32, 0x74, 0xfc, 0xe6, 0x53, 0x7f, 0xd7, 0xaa, 0x4e, 0xfa, 0x5d, 0x75, 0x19, 0x5a, 0x40, 0x00, 0x18, 0xbd, 0x38, 0xf7, 0xd8, 0xcd, 0x53, 0xfd, 0xff, 0xe8, 0x8d, 0xf1, 0x83, 0x7f, 0xa0, 0x6f, 0x1b, 0xbc, 0x1d, 0x9a, 0xf3, 0x68, 0xbc, 0x19, 0xa4, 0x0b, 0xf0, 0x60, 0x63, 0x55, 0xbf, 0x31, 0x78, 0xbc, 0xd1, 0x62, 0xf3, 0x67, 0xc7, 0xe0, 0x9a, 0x4b, 0xce, 0xf4, 0x25, 0x94, 0x73, 0xc5, 0xae, 0x46, 0xb9, 0x1f, 0x63, 0x24, 0x68, 0x72, 0x7e, 0xd1, 0xa9, 0x1e, 0x77, 0x35, 0xd0, 0xed, 0x77, 0x22, 0x79, 0xe1, 0x11, 0x37, 0xd6, 0x31, 0x2d, 0x05, 0x47, 0x8e, 0x44, 0x71, 0x2b, 0xaa, 0xd3, 0x59, 0xf7, 0xfb, 0x09, 0x7b, 0x85, 0xbd, 0xc3, 0x92, 0xae, 0x36, 0xbb, 0xc1, 0x1a, 0x3d, 0xfc, 0x35, 0x57, 0xfd, 0x9a, 0x07, 0x29, 0xf7, 0x9f, 0x5f, 0x21, 0x46, 0x48, 0xdf, 0x71, 0x27, 0x72, 0x3f, 0xff, 0xb8, 0x4f, 0x34, 0xb8, 0x00, 0x5d, 0x97, 0x27, 0x30, 0x99, 0xc3, 0x46, 0x28, 0xf0, 0x3f, 0x94, 0x3d, 0xf6, 0x9d, 0x67, 0x3a, 0xda, 0xa1, 0x84, 0xa4, 0x9a, 0xa6, 0xed, 0x43, 0x73, 0x3e, 0xfa, 0xdd, 0x9c, 0x19, 0xab, 0x45, 0x33, 0x28, 0x3d, 0x95, 0x78, 0x01, 0xfb, 0xb7, 0x39, 0x86, 0x57, 0x2a, 0x8d, 0xc1, 0x39, 0x02, 0xc5, 0x13, 0x97, 0x31, 0xa0, 0x8e, 0x46, 0x06, 0xbe, 0x9f, 0x10, 0xf3, 0x57, 0xf0, 0x06, 0x93, 0x2d, 0x8c, 0x17, 0xeb, 0xbf, 0x45, 0xe2, 0xf1, 0xc0, 0x53, 0xc9, 0x4a, 0xc7, 0x3d, 0x47, 0x58, 0x48, 0xfd, 0x83, 0x74, 0xc3, 0x5f, 0x25, 0x78, 0x3b, 0xaa, 0x68, 0x81, 0xea, 0x82, 0x70, 0xf3, 0x33, 0x0d, 0xdf, 0xbd, 0xd8, 0x55, 0xa3, 0xde, 0x6d, 0xed, 0x11, 0x28, 0x0d, 0xd8, 0x38, 0x43, 0x4b, 0xa6, 0x6f, 0xf6, 0x6b, 0xe0, 0x31, 0xa2, 0xd3, 0xa6, 0x2b, 0x0f, 0xbc, 0x97, 0x92, 0x6b, 0x2d, 0xf1, 0xba, 0x90, 0x2a, 0xf9, 0xe5, 0x86, 0x29, 0x9e, 0x59, 0x49, 0xc5, 0x59, 0xb5, 0xcc, 0xb6, 0x57, 0x84, 0x3d, 0x01, 0xda, 0x13, 0x8b, 0x6c, 0xdd, 0x80, 0x26, 0x35, 0xf7, 0x14, 0x06, 0x03, 0x81, 0xd2, 0xee, 0x1d, 0xfb, 0x50, 0xf2, 0xda, 0xac, 0xc6, 0x37, 0x59, 0x89, 0x65, 0xfa, 0x71, 0x58, 0xea, 0xd3, 0xeb, 0x15, 0x72, 0x3b, 0xef, 0x95, 0x90, 0x4d, 0xbd, 0x69, 0x9d, 0xc9, 0x9e, 0x05, 0x4f, 0x5e, 0x19, 0x22, 0x8d, 0x29, 0x69, 0x60, 0x82, 0x79, 0x2f, 0x30, 0xf1, 0xd5, 0x65, 0xf1, 0xc8, 0x40, 0x93, 0x59, 0xf7, 0xbb, 0x45, 0x17, 0x82, 0x0c, 0xbc, 0xb6, 0xd5, 0xbe, 0xe4, 0xc5, 0x59, 0x69, 0x86, 0x35, 0x44, 0x33, 0xbf, 0x02, 0xb5, 0x97, 0xb1, 0x16, 0x00, 0x65, 0x78, 0x6a, 0x46, 0x0a, 0x5f, 0x6e, 0x4a ],
+const [ 0xd2, 0xf6, 0x1e, 0x1a, 0x3e, 0x37, 0x0e, 0x78, 0xdb, 0x7a, 0x35, 0x6c, 0xff, 0x4e, 0x3e, 0x0a, 0x40, 0x80, 0x0a, 0xb9, 0x36, 0xd7, 0x9b, 0x89, 0x82, 0x01, 0x31, 0xc6, 0x0e, 0xce, 0xb2, 0xcd, 0x97, 0x9c, 0x4f, 0x1e, 0x69, 0x13, 0x65, 0xb3, 0x6a, 0x12, 0xa1, 0x90, 0x5a, 0xe8, 0x68, 0x9c, 0x59, 0xc8, 0x76, 0xaf, 0xaa, 0x77, 0xc5, 0xec, 0xb6, 0x48, 0xb0, 0x51, 0x54, 0x4a, 0x58, 0x8c, 0x47, 0xc0, 0x47, 0x10, 0x08, 0xd1, 0x53, 0x69, 0xc7, 0x81, 0xc5, 0xcc, 0xac, 0xe0, 0xbb, 0xf3, 0x62, 0x81, 0xcb, 0x28, 0xd6, 0x2e, 0xe9, 0x9f, 0x3c, 0xda, 0x8b, 0x08, 0x54, 0xd7, 0x0b, 0x65, 0xeb, 0x4a, 0x4c, 0x19, 0xa4, 0xdb, 0xa0, 0x42, 0xf8, 0xb1, 0xe9, 0x49, 0x7c, 0x9d, 0xff, 0xb8, 0x62, 0x95, 0x52, 0x4b, 0x43, 0x65, 0xd1, 0x49, 0x1c, 0xa1, 0x0a, 0x14, 0x96, 0xde, 0x92, 0xff, 0x8a, 0x21, 0xa7, 0x61, 0xc4, 0x98, 0x14, 0xe8, 0x07, 0x88, 0x55, 0x2f, 0x52, 0x87, 0xfc, 0x92, 0x62, 0xeb, 0x53, 0x41, 0x78, 0x82, 0x43, 0x93, 0x5c, 0x84, 0x74, 0x9d, 0xa2, 0xc5, 0xb6, 0x04, 0x2c, 0x2f, 0xa0, 0x0f, 0xf0, 0x70, 0x76, 0x00, 0xfb, 0xf0, 0x50, 0xa5, 0xb6, 0x06, 0x79, 0x2a, 0x69, 0x6b, 0x16, 0x31, 0xfd, 0xef, 0x08, 0x24, 0x06, 0x6a, 0x13, 0xca, 0x01, 0xf6, 0x3f, 0x19, 0xd9, 0x5b, 0x7e, 0x4c, 0xb1, 0xcb, 0x90, 0x35, 0xdd, 0xd0, 0x24, 0xd3, 0x31, 0x82, 0x40, 0x27, 0x7f, 0xfd, 0xe2, 0x44, 0x5b, 0x12, 0xe8, 0xa6, 0x21, 0x3d, 0x2d, 0xc4, 0x3a, 0xd7, 0xf5, 0xe8, 0x9a, 0x8d, 0x8b, 0x3f, 0x8d, 0x11, 0x28, 0x2c, 0xb4, 0x0f, 0x17, 0xe2, 0x4a, 0x63, 0x17, 0x32, 0xac, 0x89, 0x01, 0xa1, 0x19, 0x55, 0xaa, 0xbe, 0xb6, 0xe4, 0x0b, 0xb3, 0xd5, 0xd2, 0x9f, 0x19, 0x76, 0xad, 0x0d, 0x11, 0x0e, 0xaa, 0x07, 0x90, 0x88, 0x97, 0x72, 0xfa, 0x8a, 0x11, 0xc7, 0xf3, 0xf9, 0xf7, 0xb9, 0x72, 0xbf, 0x1f, 0x18, 0x16, 0xcc, 0x47, 0xf5, 0xbe, 0x5a, 0x4e, 0x07, 0x54, 0x76, 0xa4, 0x4d, 0xe9, 0xbc, 0xff, 0xf5, 0x07, 0x62, 0x4f, 0x7d, 0x42, 0x78, 0xf5, 0x18, 0x11, 0x6d, 0x2f, 0x53, 0xdc, 0xd6, 0xd7, 0xf8, 0x56, 0x6b, 0x4e, 0x32, 0x0d, 0x52, 0xb3, 0xf3, 0x40, 0xa1, 0x58, 0x93, 0xf0, 0x1e, 0x76, 0xba, 0x39, 0x49, 0x1f, 0x7f, 0xe3, 0x9c, 0x75, 0xd1, 0x35, 0x11, 0x1a, 0x16, 0x09, 0xe5, 0xe7, 0x13, 0x26, 0x9b, 0xe1, 0x0c, 0xc9, 0x45, 0x68, 0x2c, 0x85, 0xff, 0xb2, 0x27, 0x4d, 0xbc, 0x78, 0x1d, 0xd0, 0x45, 0xef, 0xc2, 0x05, 0x7e, 0xfa, 0xbc, 0x06, 0xeb, 0x9e, 0x4c, 0x21, 0x74, 0xb6, 0x31, 0x2c, 0x65, 0xe8, 0xc9, 0x1a, 0xb9, 0xd7, 0x7a, 0xcc, 0x98, 0x9a, 0x50, 0x29, 0x1e, 0x6e, 0xe7, 0x71, 0x5e, 0xa7, 0x8c, 0xce, 0xa7, 0xed, 0x9f, 0x2d, 0x06, 0xa4, 0x3b, 0x4b, 0x0b, 0xac, 0x1a, 0x13, 0xd0, 0x4b, 0xb2, 0x27, 0x38, 0x67, 0xa4, 0xbd, 0x75, 0xf9, 0x57, 0xac, 0xcd, 0xbe, 0xe0, 0xc6, 0x9d, 0x30, 0x26, 0x69, 0x9e, 0xb4, 0x43, 0x51, 0x67, 0x15, 0x2d, 0xb0, 0x33, 0x31, 0x95, 0x81, 0xe5, 0xf2, 0x0f, 0x19, 0x49, 0x80, 0x74, 0xff, 0x9d, 0xb5, 0x84, 0xfd, 0x50, 0xd2, 0xd0, 0x77, 0x09, 0x70, 0xd8, 0xfc, 0xeb, 0xb9, 0x70, 0x1b, 0x18, 0xd7, 0x68, 0x78, 0x73, 0xad, 0x6b, 0x1f, 0xab, 0xc5, 0x28, 0x17, 0x75, 0x8a, 0xb0, 0x3b, 0x18, 0xb8, 0x1f, 0x45, 0x2f, 0x10, 0x7f, 0x2c, 0xaa, 0x50, 0xe9, 0xb0, 0x17, 0x62, 0xed, 0x32, 0x20, 0xd4, 0x35, 0xca, 0x54, 0x88, 0x64, 0x94, 0x2a, 0xad, 0x44, 0x4a, 0x42, 0xed, 0x21, 0x18, 0xef, 0xe8, 0x70, 0xab, 0xf3, 0xe2, 0xb5, 0x8c, 0x89, 0xb8, 0xa3, 0xac, 0xa9, 0x19, 0x84, 0x40, 0x87, 0xf2, 0xdb, 0xce, 0x5d, 0x2a, 0x48, 0x88, 0x6a, 0x90, 0xad, 0xda, 0x3a, 0x12, 0x8f, 0x3f, 0x29, 0x2f, 0xbf, 0x58, 0x23, 0xaf, 0x39, 0x3f, 0xad, 0x91, 0x4c, 0x19, 0x29, 0x45, 0xfb, 0xea, 0x55, 0x1b, 0xa4, 0xae, 0x16, 0xfc, 0xdf, 0xa5, 0x74, 0x58, 0xa9, 0xee, 0xe5, 0x5f, 0xc2, 0x57, 0xce, 0x74, 0x53, 0x74, 0x47, 0xde, 0xd4, 0xee, 0x1f, 0xc1, 0x2d, 0x1e, 0x1f, 0x4d, 0x1b, 0xda, 0x93, 0x36, 0xd6, 0x8f, 0x07, 0x64, 0xf1, 0x90, 0x4f, 0xeb, 0x81, 0xae, 0xca, 0x3d, 0x81, 0x09, 0xe7, 0x9f, 0x75, 0x26, 0xe7, 0xd9, 0x4e, 0x41, 0xe5, 0x32, 0x8e, 0xe4, 0x14, 0x9b, 0xac, 0xb8, 0x49, 0x2b, 0xba, 0x9c, 0xb9, 0xcb, 0x45, 0xf4, 0x03, 0x33, 0x7d, 0x43, 0x71, 0x15, 0x95, 0xfd, 0x7a, 0x97, 0x6d, 0x96, 0x8c, 0x07, 0x6f, 0xdf, 0x09, 0xca, 0xb7, 0x92, 0x90, 0x96, 0x76, 0x2b, 0x7d, 0xe2, 0x98, 0xfa, 0xb3, 0x9a, 0xa4, 0x77, 0x99, 0x16, 0xe4, 0xd5, 0x62, 0x4d, 0xc7, 0xda, 0x92, 0x46, 0x83, 0xed, 0xbd, 0xd0, 0xfe, 0x71, 0x92, 0x73, 0xef, 0x51, 0x19, 0xa6, 0x40, 0xdc, 0x39, 0x42, 0xb8, 0xd4, 0x7d, 0x37, 0xd6, 0xc1, 0x18, 0x7e, 0x00, 0x8b, 0x26, 0x4f, 0xdd, 0x48, 0x34, 0x93, 0xff, 0x53, 0x03, 0x9c, 0xc5, 0x9e, 0x89, 0x14, 0x7f, 0x49, 0x39, 0x33, 0xd4, 0x73, 0x84, 0x35, 0x61, 0x50, 0xa0, 0x0c, 0xa3, 0x7b, 0x88, 0x52, 0x17, 0x8e, 0x44, 0x81, 0x9f, 0xf1, 0x6a, 0x66, 0x28, 0xef, 0xe5, 0xd3, 0x8a, 0x0f, 0xf5, 0x95, 0xaf, 0xa1, 0x77, 0xa5, 0xf8, 0x97, 0x67, 0xa3, 0xdc, 0x96, 0xa3, 0x7f, 0xd3, 0x4d, 0xf1, 0x7a, 0x72, 0x06, 0x44, 0x4d, 0xd7, 0x7a, 0x3b, 0xa7, 0x47, 0xea, 0xeb, 0xdd, 0x16, 0x6b, 0xde, 0xdd, 0xc7, 0x82, 0x5b, 0x65, 0x75, 0xf0, 0xe8, 0x72, 0x72, 0xcf, 0x0e, 0xfa, 0x2d, 0xde, 0x5c, 0xdd, 0x59, 0x1a, 0xaf, 0x1a, 0x4b, 0x8e, 0xb0, 0x3e, 0xa4, 0x6b, 0x9d, 0x23, 0x31, 0x5b, 0x4d, 0xd6, 0x0f, 0x13, 0x6e, 0xd9, 0x13, 0x27, 0x12, 0x8b, 0x68, 0x23, 0x6a, 0xe4, 0x7a, 0xd7, 0xd0, 0x65, 0x13, 0xf2, 0x0b, 0x4f, 0xc4, 0xd3, 0xcf, 0x14, 0x87, 0x9b, 0x84, 0x0b, 0xa2, 0x87, 0x48, 0x67, 0xcf, 0x7d, 0x37, 0x6a, 0x99, 0xe4, 0xea, 0xd6, 0x09, 0xb9, 0x3d, 0xa5, 0x82, 0xdf, 0x56, 0xf9, 0xea, 0xb7, 0xe3, 0x56, 0x0a, 0xf1, 0xa2, 0x0f, 0x38, 0xa2, 0x27, 0xfe, 0x33, 0x96, 0xda, 0x78, 0x4e, 0xe7, 0x3f, 0x80, 0xd1, 0xce, 0x7a, 0x3b, 0x9c, 0xba, 0x12, 0xa5, 0x0d, 0x9f, 0xf5, 0x81, 0x24, 0x91, 0xbc, 0x96, 0xe5, 0x91, 0x31, 0x18, 0xfe, 0xa7, 0x0e, 0x65, 0xaa, 0x31, 0x08, 0xf2, 0xd5, 0x7a, 0x0c, 0x84, 0x81, 0x8e, 0xc9, 0xa3, 0x68, 0x4d, 0x6e, 0x4b, 0xe3, 0xbf, 0xb5, 0xe6, 0x0a, 0xa7, 0x20, 0x77, 0x1d, 0x5b, 0x82, 0x18, 0x23, 0xd2, 0xc2, 0xa6, 0xd0, 0xff, 0xdc, 0xbb, 0xac, 0x5d, 0x28, 0xdc, 0x72, 0xcc, 0xdf, 0xf4, 0xb6, 0x9b, 0xdb, 0x01, 0xcb, 0xe6, 0x9e, 0x0e, 0xe4, 0x22, 0x96, 0x61, 0x79, 0xf6, 0xa0, 0xf5, 0xed, 0x4c, 0xca, 0x2b, 0x6d, 0xa9, 0x5d, 0xbc, 0x1b, 0xb9, 0x1b, 0xf2, 0x6c, 0x2f, 0xc5, 0x18, 0xce, 0xcc, 0xe0, 0x2f, 0x8f, 0xbc, 0xb9, 0xe2, 0xfa, 0x29, 0xa7, 0xbc, 0xc3, 0x0b, 0x90, 0x99, 0xa5, 0x3d, 0xae, 0x5a, 0x49, 0xd6, 0x93, 0xdd, 0x6a, 0xb6, 0x6b, 0x2d, 0x37, 0x5f, 0x82, 0xf5, 0xf8, 0x07, 0x06, 0x3b, 0xf5, 0xeb, 0x0d, 0x4a, 0x93, 0xe5, 0xd9, 0xf0, 0xc1, 0x41, 0x5b, 0xea, 0x92, 0xcd, 0xf7, 0x9d, 0x2b, 0x2f, 0x87, 0x07, 0xe0, 0x7b, 0xa2, 0xf4, 0x9a, 0x05, 0x1e, 0x75, 0x7c, 0x74, 0xd3, 0x8e, 0xc6, 0x18, 0xa2, 0x2f, 0xf9, 0x7e, 0xb7, 0x65, 0x3c, 0x41, 0x0a, 0xd2, 0xfe, 0x22, 0x2c, 0x5b, 0xdd, 0x5b, 0x40, 0x20, 0xc6, 0x31, 0x47, 0xb1, 0x5e, 0xc9, 0xa2, 0x7f, 0xa1, 0x3c, 0xd1, 0x90, 0xc9, 0xed, 0x81, 0x77, 0x72, 0x1b, 0xc6, 0x84, 0xfb, 0xb2, 0xa5, 0x38, 0x2f, 0x67, 0xd5, 0xfb, 0x25, 0x03, 0xc6, 0x11, 0x64, 0xff, 0xe3, 0xcb, 0x4b, 0x52, 0x15, 0xfa, 0xb1, 0x87, 0x88, 0xa9, 0xc8, 0x12, 0xb1, 0x0c, 0x47, 0xe4, 0x90, 0xb3, 0xc8, 0x3d, 0x32, 0x03, 0x6e, 0xc2, 0x7b, 0xe7, 0xcc, 0xcf, 0x22, 0xc3, 0x02, 0x0e, 0xfd, 0xaa, 0x29, 0x49, 0x7f, 0xd0, 0xf2, 0x7c, 0x7f, 0x42, 0x89, 0x2f, 0x3a, 0xd4, 0xc0, 0x02, 0x9c, 0x5b, 0x69, 0x8a, 0xbb, 0x1d, 0x03, 0x5b, 0xa5, 0x86, 0x9a, 0x66, 0x5b, 0x1d, 0xe8, 0x86, 0x1d, 0xb6, 0xc0, 0x55, 0xe8, 0xe8, 0xad, 0x44, 0x3e, 0xc1, 0xd6, 0xeb, 0x25, 0xb9, 0x24, 0x9d, 0x72, 0xe5, 0xa7, 0x40, 0x47, 0x6d, 0x36, 0x5b, 0xdb, 0x40, 0x56, 0x71, 0x79, 0x06, 0x5e, 0x8e, 0xcc, 0x57, 0xd8, 0x1f, 0x59, 0x2a, 0x29, 0x06, 0x4d, 0x90, 0x75, 0xee, 0x79, 0xa2, 0xbd, 0xdc, 0x9b, 0xb7, 0x4a, 0x07, 0xdf, 0xdb, 0x4f, 0xea, 0xa5, 0x7d, 0xca, 0x97, 0x85, 0x68, 0xab, 0x4e, 0x90, 0xf5, 0x38, 0x4e, 0xd9, 0x7e, 0xb0, 0xeb, 0x35, 0x15, 0x2e, 0xe1, 0x3e, 0x76, 0xd1, 0xe8, 0x9e, 0x3b, 0x1a, 0x89, 0x8a, 0x4f, 0x95, 0x2f, 0x8c, 0xa5, 0xbc, 0x81, 0x86, 0x2a, 0x18, 0xef, 0xf4, 0xf8, 0xa9, 0x8b, 0x71, 0xcc, 0x88, 0x1b, 0x7d, 0xba, 0xcb, 0x6c, 0x7d, 0x1f, 0xa9, 0xe9, 0x03, 0xd8, 0xdf, 0x6b, 0x50, 0xb1, 0x51, 0x53, 0x17, 0x20, 0xf5, 0xd7, 0x84, 0x34, 0xed, 0x99, 0x7d, 0xc8, 0xf3, 0x7e, 0x28, 0xfc, 0xfa, 0xbd, 0xad, 0xe6, 0x12, 0x36, 0x3d, 0x84, 0x8d, 0x06, 0x53, 0xf5, 0x60, 0x58, 0x39, 0xe9, 0xcc, 0x7d, 0xcf, 0x57, 0x3d, 0x40, 0x88, 0x6e, 0x72, 0x73, 0xb5, 0xcd, 0xde, 0xce, 0x06, 0xf6, 0x4e, 0xfa, 0x4d, 0x00, 0xcd, 0xe8, 0x86, 0x8d, 0xc4, 0x67, 0x15, 0xfc, 0x66, 0xf6, 0x4e, 0xe0, 0x4b, 0xd6, 0x3a, 0xb0, 0x5b, 0x64, 0x98, 0xc0, 0xee, 0xa6, 0x23, 0x6f, 0x32, 0x24, 0x13, 0xa2, 0xcc, 0xf9, 0xe6, 0x72, 0xc2, 0x29, 0x60, 0x22, 0x98, 0x35, 0xd1, 0x54, 0xb9, 0xed, 0x96, 0x7c, 0x19, 0x86, 0xe2, 0x94, 0x19, 0xec, 0xbf, 0x12, 0xab, 0x59, 0x4f, 0x17, 0xb6, 0x27, 0x58, 0xe9, 0xbc, 0xe3, 0xff, 0xa3, 0xba, 0xa2, 0xd4, 0x2b, 0x4f, 0x98, 0x0f, 0x65, 0x21, 0xe6, 0x19, 0xa6, 0x7d, 0xb4, 0x4f, 0x6c, 0x3d, 0x80, 0x02, 0x4c, 0xef, 0xb5, 0xc2, 0x2b, 0x33, 0x80, 0xdc, 0xb1, 0x65, 0xdf, 0x21, 0xfb, 0x7c, 0xfb, 0xe9, 0x90, 0x32, 0xb7, 0x58, 0x97, 0x66, 0x89, 0xe0, 0x47, 0xbe, 0x89, 0x07, 0x9e, 0x90, 0xc7, 0x6b, 0x56, 0x03, 0xe2, 0x03, 0x15, 0x71, 0xd6, 0xa7, 0xe4, 0x10, 0x16, 0xd3, 0xe2, 0xd2, 0xdb, 0xa8, 0x39, 0x89, 0xbb, 0x33, 0x52, 0x4f, 0x7d, 0xf2, 0x45, 0x25, 0x2c, 0x94, 0x94, 0xda, 0x6a, 0x01, 0x18, 0x2f, 0x07, 0x9a, 0x3b, 0x38, 0xd2, 0xc2, 0x68, 0x05, 0xaf, 0x9d, 0xc0, 0x82, 0xea, 0x17, 0x0f, 0x9c, 0xcb, 0x29, 0xfe, 0xa5, 0x6b, 0x58, 0x8a, 0xfa, 0xc5, 0x7e, 0xb4, 0xe3, 0x10, 0xcc, 0x7a, 0xba, 0x4d, 0x10, 0x07, 0x50, 0x1c, 0x34, 0x27, 0x8c, 0xd3, 0x07, 0xfd, 0x55, 0xd1, 0x41, 0xf8, 0xb2, 0x10, 0xc1, 0x03, 0x30, 0xfa, 0x18, 0xfc, 0x85, 0x7e, 0x4b, 0x68, 0x72, 0x62, 0xd5, 0x65, 0xee, 0xdb, 0xec, 0xdf, 0x80, 0x5b, 0x05, 0x07, 0xed, 0xaa, 0x9a, 0x01, 0x13, 0x38, 0x2b, 0xdd, 0x15, 0xb2, 0x83, 0xc9, 0xb8, 0xd3, 0x3c, 0x85, 0x0d, 0x7d, 0x85, 0x17, 0x51, 0x08, 0x23, 0xbf, 0x11, 0xda, 0xb6, 0x2d, 0x91, 0x37, 0x3e, 0xf2, 0x6f, 0x5b, 0xdd, 0x35, 0x84, 0xc6, 0xdf, 0xa7, 0x0b, 0xd8, 0xf7, 0xb9, 0x05, 0x9d, 0xcb, 0x0c, 0xdc, 0xea, 0xb3, 0x28, 0x46, 0xa9, 0xbe, 0x72, 0x6c, 0x71, 0xf7, 0x58, 0x4c, 0x5a, 0xe6, 0xcf, 0x5b, 0x0f, 0x59, 0xff, 0x6f, 0x24, 0x64, 0x3c, 0xdd, 0xaa, 0xa6, 0x39, 0xde, 0x01, 0xce, 0x78, 0x38, 0xee, 0x5e, 0x05, 0x1a, 0xed, 0xaf, 0x64, 0x47, 0xc9, 0x35, 0xc8, 0x76, 0x69, 0x05, 0x86, 0xf9, 0xed, 0x94, 0xc8, 0x9e, 0xfa, 0xc2, 0x86, 0xd3, 0x51, 0x17, 0xb2, 0x0d, 0xa7, 0x4c, 0xb3, 0x6a, 0xb1, 0x0d, 0x15, 0x95, 0x7e, 0xfd, 0x7f, 0xea, 0x09, 0xfb, 0xe5, 0xda, 0x0f, 0xa4, 0xfe, 0x91, 0x1e, 0x18, 0xf9, 0xd7, 0xef, 0x01, 0x6c, 0x34, 0xf5, 0xd2, 0x8d, 0x58, 0x36, 0x4d, 0xa4, 0xb9, 0x5a, 0x48, 0xc0, 0x7e, 0x01, 0xb0, 0xa9, 0x9c, 0x5a, 0xce, 0x17, 0x3f, 0xf2, 0xc9, 0x21, 0x6b, 0xc9, 0x6d, 0xf8, 0xe3, 0xab, 0x2a, 0xd5, 0x4a, 0xbd, 0x60, 0x30, 0x88, 0x57, 0xda, 0x33, 0x6f, 0x11, 0x98, 0x6e, 0x9f, 0x21, 0xd1, 0xcc, 0xa6, 0xe4, 0x38, 0xc6, 0x6c, 0xba, 0x7f, 0xd6, 0xcf, 0x17, 0x19, 0x2f, 0x8a, 0xd7, 0x45, 0xab, 0x5b, 0xd2, 0x48, 0x05, 0x65, 0xb1, 0xf9, 0x48, 0xd3, 0x00, 0x83, 0x87, 0xbe, 0x84, 0x67, 0xcf, 0x50, 0xce, 0xc0, 0x5a, 0x2a, 0x10, 0xcb, 0x05, 0x04, 0x30, 0xa6, 0x04, 0x93, 0x1b, 0x58, 0xd5, 0xb0, 0x5c, 0x12, 0x72, 0xb6, 0xed, 0xb5, 0xcb, 0x2c, 0x4c, 0x93, 0x73, 0xa4, 0xd2, 0x7a, 0x9a, 0xe2, 0x41, 0xef, 0x3b, 0x41, 0x9c, 0xb7, 0x96, 0x53, 0x3b, 0x9c, 0xe1, 0xc8, 0x1e, 0x6d, 0x3b, 0x91, 0x82, 0x47, 0xe1, 0x45, 0xb2, 0x13, 0xa4, 0xc3, 0x20, 0x50, 0x9b, 0x19, 0xb4, 0x13, 0x15, 0xa4, 0x64, 0x4b, 0xd1, 0x79, 0x05, 0x4a, 0x72, 0x04, 0x60, 0x81, 0x2d, 0xef, 0x89, 0x8b, 0xc5, 0x45, 0x6c, 0x6e, 0xb9, 0xd8, 0xa9, 0x1d, 0xbc, 0xe0, 0xa2, 0x41, 0x65, 0xe4, 0xd1, 0x38, 0x28, 0xde, 0x60, 0x5e, 0x85, 0x9a, 0xf3, 0x8c, 0x7f, 0x5f, 0xc9, 0xdf, 0x50, 0xd1, 0x03, 0xbb, 0x5b, 0x16, 0x43, 0x0f, 0x62, 0x38, 0x79, 0xda, 0xf9, 0xca, 0xfa, 0xee, 0x3a, 0xcf, 0xd3, 0xf4, 0xbb, 0xd7, 0x5c, 0xb0, 0xbd, 0x6b, 0x10, 0x86, 0xa6, 0xab, 0x9b, 0x3d, 0xb2, 0x36, 0x35, 0x04, 0xe5, 0x4a, 0x2f, 0xb2, 0x44, 0x2d, 0xcb, 0x52, 0x44, 0xcb, 0x51, 0xdf, 0x83, 0xa0, 0x5f, 0x4c, 0xb6, 0xd8, 0x81, 0xc7, 0xe2, 0xb5, 0x01, 0x3f, 0xd0, 0x32, 0x01, 0x24, 0xbb, 0xe6, 0xc6, 0x6e, 0x4b, 0x2a, 0x57, 0xe0, 0xc7, 0x7e, 0x47, 0x8e, 0x86, 0x29, 0xcf, 0x9d, 0xa6, 0x20, 0x20, 0x4a, 0x01, 0x29, 0xf6, 0x2d, 0x5d, 0x40, 0x71, 0xbf, 0xe3, 0x3a, 0x21, 0x1b, 0xd3, 0xa8, 0x5f, 0x01, 0x75, 0xfe, 0xe4, 0x20, 0x53, 0xf5, 0x94, 0x95, 0xa5, 0x2d, 0x9b, 0xaf, 0x0d, 0x17, 0xbb, 0xf5, 0x84, 0x12, 0xe4, 0x6a, 0x94, 0xd4, 0x06, 0x0f, 0xc9, 0x0c, 0x23, 0xaa, 0x62, 0x45, 0xa8, 0xc6, 0x4b, 0x0e, 0xfd, 0xfb, 0x50, 0x58, 0x5b, 0x6f, 0x8b, 0x1f, 0xde, 0x9d, 0x1e, 0x4d, 0xdb, 0x55, 0x28, 0xdb, 0x73, 0x04, 0xf1, 0x39, 0x68, 0x36, 0x68, 0xf0, 0x30, 0x59, 0xd0, 0x86, 0x48, 0xc4, 0xb6, 0xa1, 0xcb, 0xf8, 0x26, 0x70, 0x43, 0x25, 0x1e, 0x47, 0xbf, 0xf0, 0x43, 0x89, 0x26, 0x73, 0xd3, 0xcb, 0xca, 0x85, 0xdb, 0x36, 0x40, 0x3c, 0xaa, 0x2d, 0x70, 0xb1, 0x85, 0x30, 0xe8, 0x03, 0x9c, 0x01, 0x76, 0x9f, 0x3d, 0x05, 0xf5, 0xbe, 0x48, 0xec, 0x67, 0x2f, 0xe3, 0x95, 0x44, 0x56, 0x6e, 0x2b, 0x12, 0x75, 0xba, 0x95, 0x36, 0x2a, 0x75, 0x0d, 0x0a, 0x39, 0xe9, 0x0e, 0x2f, 0x8c, 0xe7, 0x74, 0x25, 0x78, 0xfd, 0xdf, 0x18, 0x42, 0xef, 0x58, 0xfd, 0xe2, 0x65, 0x37, 0xde, 0x06, 0xe2, 0x43, 0x72, 0x5a, 0xf5, 0x1c, 0xf1, 0x07, 0xb3, 0xd6, 0x26, 0x79, 0x64, 0xe7, 0xc6, 0x66, 0x7d, 0x43, 0x00, 0x0c, 0xcf, 0xc5, 0x55, 0xba, 0xfd, 0xd1, 0xaa, 0x91, 0x33, 0x38, 0x9c, 0x8c, 0x15, 0x5b, 0x13, 0xbe, 0xf6, 0x94, 0x1a, 0xdb, 0x4b, 0xd1, 0xee, 0xfa, 0x5f, 0x82, 0x54, 0x99, 0x48, 0xb6, 0x30, 0xe2, 0x19, 0x80, 0x54, 0x2d, 0x59, 0xa0, 0x96, 0xc5, 0xb4, 0x5f, 0x25, 0xef, 0xf1, 0xbb, 0x1d, 0x28, 0x24, 0xc4, 0x58, 0xaf, 0x25, 0x46, 0x88, 0x43, 0x40, 0xa8, 0x82, 0x2e, 0x2e, 0x14, 0xdd, 0x82, 0x44, 0xd9, 0xbc, 0xa3, 0xeb, 0x0d, 0xe8, 0x05, 0x50, 0x76, 0x22, 0x37, 0x5d, 0xab, 0xb7, 0x21, 0xe7, 0x76, 0x54, 0x8a, 0x29, 0x7d, 0x1c, 0xdd, 0x71, 0x21, 0xf8, 0x2c, 0x19, 0xa7, 0x2e, 0x75, 0xb9, 0x95, 0x36, 0x24, 0x9b, 0x5f, 0xc9, 0xda, 0x6f, 0x43, 0x3a, 0x6d, 0x40, 0x72, 0x09, 0x30, 0xa7, 0x70, 0xb6, 0x74, 0x3f, 0xbd, 0xd3, 0x4e, 0x58, 0xb5, 0x5d, 0x9b, 0xf0, 0xb5, 0x4c, 0x42, 0xdf, 0x7f, 0x69, 0xb9, 0x51, 0xe0, 0x60, 0xcb, 0x79, 0x90, 0x16, 0x98, 0x84, 0x59, 0x3c, 0xdd, 0xcc, 0x7b, 0x25, 0x75, 0x4f, 0x50, 0xd4, 0x20, 0x5f, 0x2c, 0x5a, 0x84, 0x9b, 0x87, 0x5f, 0x71, 0x1d, 0x5e, 0xfe, 0x69, 0xf5, 0xd6, 0xd6, 0x60, 0xd6, 0x23, 0x5d, 0xc0, 0x10, 0xa8, 0x78, 0xb0, 0xbe, 0x5f, 0x49, 0x96, 0x41, 0x7c, 0x48, 0xda, 0xed, 0x4d, 0x96, 0xee, 0x01, 0x65, 0x8e, 0x8b, 0xdd, 0xf9, 0x9c, 0x3d, 0x6f, 0x8a, 0x52, 0x21, 0xef, 0xc4, 0xb8, 0xed, 0xcc, 0xa7, 0xe4, 0x32, 0xe6, 0xe4, 0xcb, 0xde, 0xfd, 0x8a, 0x57, 0x05, 0x69, 0xe1, 0xba, 0xe1, 0x0c, 0x96, 0x01, 0x17, 0x86, 0x19, 0xec, 0x3b, 0xa7, 0x44, 0xfd, 0x97, 0x2a, 0x3d, 0xcf, 0x28, 0xa0, 0x9d, 0xa9, 0xea, 0xaa, 0xd2, 0x53, 0x56, 0x6b, 0xc2, 0x28, 0x28, 0x3d, 0xb0, 0x6d, 0x65, 0xa3, 0x64, 0xe1, 0x9d, 0x80, 0x86, 0x95, 0x6d, 0x86, 0x4c, 0xfe, 0x49, 0xf0, 0x55, 0x49, 0x78, 0x74, 0xd4, 0xee, 0x60, 0x73, 0xf0, 0x88, 0x04, 0x74, 0x6b, 0xe4, 0xcb, 0xd0, 0x82, 0x58, 0x83, 0xae, 0x15, 0x56, 0xa5, 0x32, 0x08, 0x40, 0xdb, 0xf2, 0xe9, 0x7e, 0xbf, 0xaa, 0xd3, 0xcf, 0xe6, 0x30, 0x92, 0xdc, 0x1d, 0xaa, 0x07, 0x13, 0xf2, 0xfe, 0xce, 0xb2, 0x77, 0x8a, 0x1f, 0x22, 0x42, 0x16, 0xf2, 0x87, 0xb8, 0x06, 0x67, 0x95, 0x8c, 0xd4, 0x64, 0xa5, 0x82, 0xbe, 0x80, 0x08, 0x79, 0xbc, 0x20, 0x9b, 0xa8, 0xb5, 0xdf, 0x9b, 0x28, 0xf2, 0x34, 0xbb, 0xb2, 0xd3, 0x4f, 0x74, 0xab, 0xc1, 0x43, 0x9d, 0x5d, 0x63, 0x6a, 0x3b, 0x88, 0x15, 0x05, 0x9a, 0x19, 0x96, 0x24, 0x9d, 0x39, 0x00, 0xc6, 0x52, 0x89, 0xfe, 0x40, 0xc9, 0xac, 0x39, 0xe3, 0x27, 0x07, 0x13, 0xd9, 0xf6, 0xc4, 0x98, 0x50, 0xbf, 0x1d, 0xb1, 0xdb, 0xdb, 0xd7, 0x9b, 0x14, 0x86, 0x0c, 0x98, 0x87, 0x35, 0x2e, 0xe5, 0xcb, 0x2a, 0x49, 0xeb, 0xf2, 0x45, 0x88, 0xb9, 0x24, 0x1d, 0xfb, 0xb2, 0x86, 0x4f, 0x97, 0x83, 0x60, 0x16, 0x7f, 0x59, 0x80, 0x1c, 0x82, 0x50, 0xd9, 0x90, 0xe4, 0x2e, 0x70, 0x79, 0x61, 0x51, 0x79, 0x4a, 0x6f, 0xe6, 0xbc, 0xb6, 0xc4, 0x5c, 0x3e, 0xc5, 0x18, 0x18, 0x1e, 0x28, 0x2c, 0x6b, 0xbd, 0xca, 0x0b, 0xc1, 0x21, 0xa7, 0x8f, 0x1b, 0x9c, 0xe1, 0x28, 0xbf, 0xa8, 0x10, 0xd9, 0x2d, 0x16, 0xda, 0x83, 0x56, 0x68, 0xc5, 0x66, 0x09, 0x7b, 0x48, 0xe5, 0xae, 0x69, 0x28, 0x89, 0x36, 0xad, 0x02, 0x49, 0x52, 0x88, 0x23, 0x09, 0xe3, 0xa4, 0xa0, 0x60, 0xb2, 0xf8, 0xa4, 0x9e, 0x62, 0xeb, 0x04, 0x0e, 0xa3, 0xbc, 0x19, 0x78, 0xa8, 0x21, 0xce, 0xea, 0xda, 0x2e, 0xf8, 0xb8, 0xce, 0x79, 0xe6, 0xc2, 0x74, 0x7c, 0x39, 0xf5, 0x92, 0x3a, 0xf6, 0x15, 0x71, 0x26, 0xda, 0xb9, 0xd7, 0x40, 0xee, 0x97, 0x34, 0x81, 0x5b, 0x01, 0x20, 0x79, 0x7e, 0xb0, 0x05, 0x37, 0x3f, 0xc1, 0x19, 0x69, 0x9f, 0xfd, 0x90, 0xc4, 0x91, 0x5d, 0x0f, 0xa6, 0x0b, 0xcd, 0x63, 0xfa, 0x5c, 0x31, 0x73, 0x5d, 0xc0, 0xa6, 0x73, 0x7e, 0x32, 0x0a, 0x5b, 0xcb, 0x81, 0xbe, 0x98, 0x4a, 0xa6, 0xaa, 0x01, 0xc4, 0x55, 0x82, 0x0c, 0x29, 0xd2, 0x48, 0x42, 0x30, 0x06, 0x13, 0xf0, 0x3e, 0xd2, 0x0e, 0x20, 0x89, 0xa3, 0xc3, 0xc7, 0x7d, 0x47, 0x9a, 0x40, 0x5f, 0xff, 0x9c, 0xf9, 0x30, 0xd5, 0x7d, 0x6d, 0xd4, 0x2f, 0xda, 0x52, 0x73, 0xa5, 0xbf, 0x13, 0x20, 0x10, 0x6c, 0x80, 0xb8, 0xe3, 0x59, 0xc5, 0x0d, 0xbf, 0x77, 0x98, 0x44, 0x41, 0xb9, 0xb7, 0x7c, 0x1f, 0xd3, 0x92, 0xb1, 0x73, 0x42, 0x44, 0xdf, 0x56, 0x8c, 0xc8, 0x6a, 0xb1, 0xc9, 0x6a, 0xbd, 0x50, 0x62, 0x7b, 0x31, 0x38, 0x19, 0x49, 0x31, 0x3b, 0x49, 0x4f, 0x9d, 0xc9, 0x6f, 0xa8, 0x6b, 0x09, 0xea, 0xca, 0x94, 0x28, 0xff, 0x70, 0x2e, 0xf2, 0x20, 0xd8, 0xd5, 0x9f, 0x6e, 0x2f, 0x50, 0xef, 0x7c, 0x4a, 0x72, 0x79, 0x56, 0x96, 0x3d, 0x3f, 0xc2, 0x52, 0x4e, 0x87, 0xc5, 0xfb, 0x75, 0xe6, 0x69, 0x08, 0xa3, 0x9e, 0xbe, 0xd8, 0x09, 0x2a, 0x1f, 0xe9, 0x7e, 0x16, 0xb6, 0x4a, 0x21, 0x14, 0x43, 0x53, 0x40, 0x4d, 0x18, 0x93, 0x79, 0xf5, 0x68, 0x0a, 0x1f, 0x22, 0xc2, 0x98, 0xe0, 0xde, 0xd9, 0xb6, 0xa4, 0x7a, 0x86, 0x64, 0xb7, 0x26, 0x10, 0x62, 0x2b, 0xbf, 0xaa, 0xa3, 0x78, 0xe8, 0x3d, 0xff, 0x66, 0x5c, 0x68, 0x28, 0x2d, 0x83, 0xc6, 0xdf, 0xda, 0x43, 0x6f, 0x68, 0xf4, 0x18, 0xc1, 0x3b, 0x60, 0x67, 0x60, 0xfc, 0x82, 0x0f, 0x7b, 0xad, 0xa5, 0x42, 0x51, 0x23, 0x9d, 0x93, 0xf4, 0xb6, 0xaa, 0x4f, 0x4d, 0x3d, 0xa0, 0x11, 0x61, 0x3a, 0x45, 0x91, 0xd2, 0x51, 0xfb, 0xbd, 0xa9, 0xff, 0x9f, 0x0b, 0x52, 0x88, 0xb0, 0x0d, 0xe8, 0x31, 0xb4, 0x46, 0xb4, 0xb0, 0xd7, 0x3c, 0xf0, 0xe1, 0xd6, 0xce, 0xd0, 0xba, 0x1b, 0xc8, 0xc3, 0x81, 0x2a, 0xb5, 0xf6, 0x3c, 0x3b, 0xf4, 0x19, 0x6a, 0x28, 0x0e, 0x67, 0xf0, 0x8a, 0x47, 0xe0, 0x56, 0x1f, 0x73, 0xd9, 0x33, 0x70, 0x0b, 0xb7, 0xe6, 0xb0, 0x80, 0xf8, 0x87, 0xe6, 0xcf, 0x73, 0x1e, 0x4f, 0x56, 0xe0, 0x12, 0xfd, 0xe6, 0x9a, 0xe4, 0xc5, 0x19, 0xa4, 0x1c, 0x58, 0xe6, 0xea, 0x84, 0xb0, 0x72, 0xca, 0x95, 0xae, 0x29, 0xd3, 0x2f, 0x01, 0x0e, 0xcd, 0x8d, 0x49, 0x4f, 0xf9, 0x77, 0x7c, 0x1d, 0x9a, 0xb9, 0x89, 0xba, 0xb3, 0xd5, 0x3c, 0xd4, 0x13, 0xf5, 0x62, 0x11, 0x8f, 0x23, 0x2d, 0xeb, 0x8f, 0xbc, 0xda, 0xbe, 0xcc, 0x22, 0x90, 0x1f, 0x57, 0xb2, 0x8c, 0x70, 0xde, 0xf6, 0x7b, 0xb1, 0x2b, 0x1b, 0x27, 0x99, 0xed, 0xa5, 0x56, 0xe6, 0xbb, 0x61, 0xef, 0xf1, 0x56, 0x9b, 0x5f, 0x85, 0x2e, 0x92, 0x3b, 0xf1, 0x28, 0x29, 0x27, 0x5c, 0x9f, 0xdf, 0xf6, 0x59, 0xa9, 0x01, 0x13, 0xbc, 0x9b, 0x1f, 0x1f, 0xab, 0xcf, 0xbc, 0xdb, 0xf8, 0xa4, 0x49, 0x49, 0xae, 0xc7, 0x55, 0x0e, 0xe9, 0xb1, 0xfe, 0x1b, 0xeb, 0x71, 0xab, 0x8c, 0x6d, 0xac, 0xfd, 0xd0, 0x33, 0xe2, 0x02, 0x0b, 0xe3, 0xf2, 0xac, 0xb8, 0x17, 0xe1, 0x82, 0x93, 0xb1, 0xd7, 0x96, 0xb6, 0x6f, 0x6a, 0xb7, 0x02, 0xbf, 0x1f, 0xe7, 0xc0, 0xd4, 0x2e, 0x10, 0x88, 0xf9, 0x86, 0xf2, 0x62, 0x25, 0x11, 0x60, 0x2c, 0xd0, 0x39, 0xac, 0x3c, 0x06, 0xab, 0x60, 0x46, 0xba, 0x5b, 0x2e, 0x7f, 0x5c, 0xc8, 0x2a, 0x02, 0xae, 0x81, 0x37, 0x73, 0xd3, 0xe8, 0xbf, 0xe3, 0xa8, 0x36, 0xa8, 0xf4, 0x58, 0xbf, 0x83, 0x3e, 0x2b, 0x78, 0x06, 0xf1, 0x9f, 0xb6, 0xbc, 0xbb, 0xba, 0x38, 0xfb, 0xec, 0x9e, 0x68, 0x17, 0xd8, 0x5e, 0xde, 0xd5, 0x7c, 0x10, 0x26, 0x22, 0x65, 0x24, 0xc3, 0x05, 0xce, 0xf4, 0x73, 0xd3, 0x09, 0x9b, 0xb5, 0xa2, 0x20, 0x0b, 0x89, 0xff, 0xbb, 0x5a, 0x77, 0xe4, 0x44, 0x5d, 0xd2, 0xe4, 0x4a, 0x78, 0x3e, 0xa9, 0x23, 0xb4, 0x70, 0xa0, 0xd6, 0x12, 0x35, 0xf3, 0x38, 0x20, 0xb6, 0xb8, 0x54, 0xc9, 0xfa, 0x68, 0x10, 0x71, 0xac, 0x92, 0x0e, 0x42, 0x1f, 0xd0, 0xd1, 0xc0, 0x8f, 0xfb, 0x21, 0xa4, 0xaa, 0x9b, 0xb0, 0xe7, 0x4e, 0xa1, 0xfd, 0x1d, 0x95, 0x59, 0x79, 0x04, 0x0f, 0x9a, 0xe9, 0x5d, 0x4e, 0x40, 0x0b, 0xfa, 0xa8, 0xdb, 0x7c, 0x19, 0x38, 0xa9, 0xd9, 0xf0, 0x26, 0xc2, 0x24, 0x89, 0x28, 0x93, 0x6a, 0xd0, 0x49, 0x8d, 0xa3, 0xeb, 0xea, 0x1e, 0xda, 0xc9, 0x06, 0xe1, 0x8e, 0xfe, 0xba, 0x12, 0x57, 0xce, 0x04, 0x44, 0xcd, 0x87, 0xcb, 0x56, 0xa5, 0x15, 0x1f, 0xa3, 0x1d, 0xd0, 0xc3, 0x79, 0x9b, 0x98, 0xe8, 0xcd, 0x90, 0x24, 0x3c, 0x2c, 0xa3, 0x97, 0x23, 0xf5, 0x0c, 0x54, 0x44, 0xc6, 0x3d, 0x14, 0x48, 0x34, 0xc8, 0x36, 0xde, 0xbf, 0x7d, 0x56, 0x03, 0x04, 0xd2, 0x20, 0x80, 0x35, 0x89, 0x66, 0xb4, 0xc7, 0x8c, 0x71, 0x93, 0x6a, 0x1c, 0x95, 0xef, 0x3e, 0x2a, 0x08, 0xf7, 0x44, 0x05, 0xf5, 0xfd, 0x13, 0x36, 0xcb, 0x7c, 0xcc, 0xa8, 0xdb, 0x59, 0x4f, 0x0d, 0x22, 0x69, 0xaf, 0x7c, 0x63, 0x34, 0xe4, 0x5f, 0x7a, 0xf8, 0xc0, 0x8c, 0xec, 0xf1, 0x25, 0xb2, 0xc2, 0xd8, 0x74, 0xf7, 0x98, 0xaa, 0x48, 0xdf, 0xf1, 0xaa, 0x65, 0x70, 0xcd, 0xa9, 0xeb, 0x94, 0x7e, 0x85, 0xd0, 0xbe, 0xb7, 0xf0, 0x8c, 0xd0, 0xe6, 0x72, 0x16, 0x3d, 0xc3, 0xb1, 0x10, 0x6a, 0x29, 0xf1, 0x3e, 0x5b, 0x26, 0xd7, 0x3d, 0x8b, 0x4e, 0x72, 0x72, 0x1b, 0x54, 0x7c, 0x40, 0x2f, 0xdb, 0xdc, 0x7e, 0x96, 0x89, 0x70, 0x28, 0xa9, 0x5d, 0x0a, 0x54, 0x75, 0x43, 0xb8, 0x68, 0x1c, 0xe6, 0x49, 0x8b, 0x78, 0xc6, 0x0c, 0x59, 0x02, 0x8a, 0xdb, 0xdb, 0xf2, 0x97, 0x58, 0xb6, 0xa8, 0xe1, 0x77, 0xa2, 0x4b, 0x01, 0x3d, 0x1e, 0xb0, 0x89, 0xc7, 0x63, 0x7d, 0x94, 0x8d, 0x96, 0x8e, 0xa1, 0xe8, 0x41, 0x97, 0xa1, 0xd2, 0x04, 0x0b, 0x4e, 0xed, 0x88, 0x3d, 0xbf, 0xc8, 0xb5, 0xc6, 0x39, 0x5d, 0x25, 0x26, 0x49, 0xde, 0xd8, 0xae, 0x0f, 0xb1, 0x29, 0x9d, 0xdd, 0xb9, 0x00, 0x89, 0x01, 0xd7, 0x4a, 0x00, 0xde, 0xb0, 0xa6, 0x70, 0x42, 0xb1, 0x61, 0x44, 0xf3, 0x51, 0xa5, 0x50, 0x8b, 0x96, 0xed, 0x6f, 0x86, 0xdb, 0xbc, 0x6a, 0x9a, 0xd0, 0x8f, 0x1c, 0x47, 0xc2, 0x10, 0xd4, 0xae, 0x1d, 0x8c, 0xfb, 0xa6, 0x2f, 0xa7, 0xf7, 0x0d, 0x2e, 0x4f, 0x4e, 0x5c, 0x7d, 0xee, 0x0f, 0x7e, 0x2b, 0xe4, 0x6e, 0xe3, 0xbd, 0x34, 0xae, 0xd0, 0x2d, 0x7d, 0x44, 0xf9, 0x32, 0x2d, 0x39, 0x51, 0xc2, 0xf1, 0xd0, 0x21, 0xd5, 0x70, 0x69, 0x57, 0x6d, 0x38, 0xa5, 0x21, 0xd3, 0xf8, 0xcb, 0xbb, 0x23, 0xf1, 0x6a, 0x86, 0x0a, 0xa7, 0x40, 0x59, 0xcf, 0xdc, 0x5b, 0x1b, 0x90, 0xbe, 0x7e, 0x92, 0xcf, 0x60, 0xc6, 0x76, 0x2d, 0x67, 0x8d, 0xca, 0x74, 0x06, 0x8f, 0x6c, 0xdb, 0x2c, 0x4b, 0xea, 0x86, 0xfb, 0xad, 0x97, 0x4d, 0x7d, 0xe9, 0xde, 0xbe, 0x92, 0xaa, 0xd7, 0x65, 0x2d, 0x6c, 0x18, 0x4b, 0xc0, 0x26, 0xce, 0xbc, 0xf5, 0x2d, 0x0c, 0x4d, 0x9f, 0x55, 0x62, 0x1e, 0xf0, 0x59, 0xb2, 0x5d, 0xec, 0x7d, 0x3f, 0x0b, 0x1d, 0x71, 0x07, 0x03, 0x89, 0x79, 0x53, 0x38, 0xe1, 0xcb, 0x8c, 0x3e, 0xfb, 0x38, 0x50, 0x0c, 0x82, 0x0f, 0xc5, 0x00, 0xed, 0x3f, 0x2d, 0x23, 0xad, 0xbb, 0xbb, 0xaf, 0xab, 0x23, 0xa5, 0xce, 0xf1, 0xa0, 0x7b, 0xa5, 0xa7, 0x10, 0xb7, 0x91, 0x42, 0x63, 0x95, 0xb0, 0xf8, 0x44, 0x25, 0xa4, 0x77, 0xfc, 0x9e, 0x93, 0xd6, 0x94, 0xf5, 0x72, 0xcc, 0x3a, 0xae, 0x84, 0x20, 0xe7, 0xf3, 0x1d, 0x60, 0x3e, 0xe3, 0xac, 0xd6, 0xb6, 0x2c, 0xf8, 0xb8, 0xfb, 0xdc, 0xaa, 0x9f, 0x92, 0x74, 0x0c, 0x3a, 0xbc, 0x3e, 0x10, 0x44, 0x9e, 0xe1, 0x94, 0xb3, 0x9e, 0x33, 0xe4, 0x33, 0x10, 0x4e, 0x81, 0xd2, 0x12, 0xe6, 0x21, 0xfd, 0xb4, 0xda, 0xf6, 0xab, 0x5d, 0x08, 0x33, 0xd8, 0x6a, 0x66, 0xcd, 0x35, 0x17, 0x4f, 0x7e, 0x1e, 0xa3, 0x1a, 0x10, 0xcc, 0xaf, 0xf1, 0xd8, 0xcc, 0xe8, 0xe0, 0x81, 0xaf, 0xe5, 0x2d, 0x0b, 0x04, 0x52, 0xe8, 0x12, 0x83, 0x4f, 0xc2, 0x54, 0x8b, 0x13, 0x23, 0x6e, 0xcf, 0xd5, 0x76, 0xe6, 0x4c, 0xec, 0xc8, 0x6e, 0x7e, 0x35, 0x91, 0x67, 0xd3, 0xb5, 0xd1, 0xa5, 0x60, 0x7f, 0x5f, 0x72, 0xd2, 0xd8, 0x7e, 0xd5, 0xa8, 0x9a, 0xb2, 0x14, 0xa0, 0xd6, 0xd2, 0x77, 0x6f, 0xbd, 0x5d, 0x4f, 0xb5, 0xc1, 0x11, 0x37, 0x30, 0xf7, 0xba, 0x9a, 0x30, 0xc0, 0x49, 0x75, 0x4b, 0xa8, 0x25, 0x5e, 0x51, 0x8e, 0xc6, 0xc6, 0x83, 0x06, 0x7f, 0x7b, 0xff, 0xfb, 0x9b, 0x70, 0x7f, 0x99, 0xac, 0xc1, 0x43, 0x69, 0x20, 0xf2, 0x4c, 0xbe, 0x15, 0x78, 0xcb, 0x51, 0x6f, 0x7a, 0xd9, 0x28, 0x27, 0xd8, 0x68, 0xbc, 0xe5, 0x6d, 0x7a, 0x5a, 0xd2, 0x91, 0x91, 0xca, 0xa7, 0xe2, 0x66, 0x2f, 0x0b, 0x45, 0xdd, 0x2e, 0x1b, 0x27, 0x39, 0x52, 0x4a, 0x09, 0x8c, 0xaf, 0x6b, 0x3b, 0x72, 0xc6, 0x0c, 0xe7, 0xff, 0xa9, 0x06, 0x52, 0xf6, 0x60, 0x52, 0x5f, 0x3c, 0x8a, 0x1e, 0x55, 0x8c, 0x47, 0x20, 0xe1, 0x6b, 0x56, 0x2b, 0x5f, 0x5f, 0x7b, 0x00, 0x55, 0x5c, 0x24, 0x66, 0x40, 0x7f, 0x4b, 0x7d, 0x94, 0xff, 0x9e, 0x4f, 0xfe, 0x60, 0xde, 0xa8, 0xec, 0xe9, 0x85, 0x28, 0x4f, 0x59, 0xab, 0x96, 0x9f, 0xd6, 0x2a, 0x77, 0x20, 0x26, 0x01, 0xdf, 0x65, 0x21, 0xf6, 0x88, 0x12, 0x66, 0x80, 0x21, 0xe6, 0x4e, 0xe3, 0xe8, 0xf8, 0x1e, 0x9d, 0x7b, 0x40, 0x81, 0x01, 0xeb, 0x5a, 0x35, 0x22, 0x13, 0x87, 0x04, 0xf2, 0x28, 0xf5, 0xf6, 0xab, 0x91, 0x40, 0xc5, 0x6e, 0xf8, 0x38, 0x91, 0x2a, 0xa1, 0xe5, 0xd5, 0xc0, 0xfa, 0xc8, 0x9a, 0x65, 0x74, 0x64, 0xea, 0x47, 0x92, 0xfd, 0x88, 0x73, 0x3f, 0xa0, 0xde, 0xf6, 0x65, 0x63, 0x37, 0x42, 0xbb, 0xee, 0x2e, 0xd4, 0xdf, 0x3a, 0x66, 0x14, 0xa4, 0x99, 0x7c, 0x7d, 0xad, 0xf7, 0x3a, 0xfd, 0x3b, 0x5f, 0x0e, 0x9f, 0x43, 0xc1, 0xba, 0x67, 0xc4, 0xf2, 0x4c, 0x7d, 0x57, 0xf4, 0x51, 0x8f, 0x08, 0x78, 0x46, 0x70, 0x64, 0xa1, 0x4f, 0x05, 0xd3, 0x0b, 0x2c, 0x61, 0x28, 0x0c, 0x68, 0x2f, 0x77, 0x39, 0xd3, 0x50, 0x26, 0x2c, 0x33, 0xc6, 0x47, 0x85, 0x37, 0xd1, 0x25, 0x2f, 0xac, 0x57, 0x1d, 0xe5, 0xf3, 0x89, 0xb0, 0xf4, 0xb3, 0xc4, 0xd6, 0x42, 0xcb, 0xb5, 0x94, 0x8f, 0x8b, 0xc1, 0xd0, 0xfb, 0x23, 0xa4, 0x65, 0xc8, 0x5b, 0x58, 0x73, 0x62, 0x85, 0x38, 0xf8, 0x9c, 0xb0, 0x65, 0xa5, 0x3d, 0x1f, 0x69, 0xea, 0xbb, 0xfa, 0x1a, 0x54, 0x46, 0x42, 0xc1, 0x18, 0x08, 0x0a, 0x7c, 0xf0, 0xac, 0xe5, 0xe1, 0x25, 0x1d, 0x9b, 0xe4, 0xed, 0x90, 0x20, 0xfb, 0xf8, 0xc4, 0xc6, 0x80, 0x46, 0x88, 0xb1, 0x56, 0x3b, 0x7f, 0x8b, 0xcf, 0xf5, 0x20, 0x7a, 0xcd, 0xdd, 0x00, 0x4f, 0x28, 0x7c, 0x54, 0x01, 0x50, 0x91, 0xb1, 0x59, 0x34, 0x60, 0x17, 0xee, 0x62, 0x4c, 0x2e, 0x54, 0x6f, 0xa8, 0xcf, 0x91, 0x99, 0xcb, 0xc6, 0xd0, 0xab, 0x62, 0xd7, 0x5a, 0x21, 0x0b, 0xff, 0xc1, 0x8d, 0x1f, 0xfb, 0x5e, 0x39, 0xce, 0x0f, 0xfe, 0x0e, 0x72, 0x00, 0xd9, 0xb4, 0x1d, 0x62, 0xc4, 0xfb, 0x74, 0x1a, 0xa7, 0x7a, 0xc1, 0x1b, 0x30, 0x76, 0x43, 0x73, 0xc9, 0x05, 0xc9, 0x8b, 0xc8, 0x72, 0x7f, 0xaa, 0xe6, 0xe4, 0x07, 0xbc, 0xf3, 0x3b, 0xcb, 0x52, 0xc8, 0x3b, 0x92, 0xe9, 0x7c, 0xec, 0x52, 0x6f, 0xdb, 0x40, 0x45, 0x03, 0x13, 0xf7, 0x3f, 0xfd, 0xb1, 0xc0, 0x3f, 0x2e, 0xcc, 0xa1, 0x44, 0x69, 0x80, 0x98, 0x62, 0x41, 0x9f, 0x83, 0x14, 0x15, 0xa2, 0x3d, 0xd4, 0x4a, 0xe6, 0x0a, 0xe9, 0xd8, 0x15, 0x35, 0x81, 0x08, 0xe1, 0xf7, 0xff, 0x7c, 0xf9, 0x9b, 0x96, 0x6f, 0x35, 0xe0, 0x17, 0x3e, 0x14, 0x9f, 0x07, 0x27, 0x69, 0xad, 0xf5, 0x51, 0x51, 0x03, 0x0a, 0x0d, 0x68, 0x1c, 0xe2, 0x5c, 0x3d, 0x9f, 0x9a, 0xb1, 0x03, 0x3e, 0x2b, 0xf8, 0x89, 0xde, 0xf6, 0xd6, 0x6c, 0xf8, 0xa0, 0x33, 0x8b, 0x3f, 0x1f, 0xf6, 0xbb, 0x83, 0x15, 0x0f, 0xbc, 0xd5, 0x5d, 0xbb, 0x6c, 0xec, 0xe4, 0x03, 0x3b, 0xc7, 0xbb, 0x86, 0xdf, 0x94, 0x6a, 0x79, 0x49, 0xd1, 0x86, 0xec, 0xd7, 0xb1, 0x86, 0x4f, 0xcb, 0xc1, 0xd2, 0x34, 0xfc, 0xcb, 0x1d, 0x57, 0xcb, 0xfa, 0xf5, 0xdb, 0x59, 0x40, 0x98, 0xd6, 0xf7, 0xf5, 0x0a, 0x10, 0xde, 0xc1, 0x64, 0x08, 0x21, 0xbb, 0x6f, 0x38, 0xdf, 0xd2, 0x71, 0x9a, 0xbd, 0x6d, 0x47, 0x6b, 0x93, 0x4e, 0xb4, 0x2f, 0x66, 0xbc, 0xf9, 0xf5, 0x97, 0xe1, 0xa6, 0xdc, 0x59, 0x71, 0xaf, 0xd6, 0x68, 0x8c, 0xc2, 0xac, 0xf9, 0xe6, 0xd8, 0x43, 0xec, 0x25, 0x0b, 0x1d, 0x49, 0x8a, 0xa7, 0x22, 0xea, 0xd4, 0x83, 0xa1, 0x75, 0x61, 0x92, 0x92, 0x8e, 0x97, 0xb5, 0x1e, 0x4a, 0x82, 0xd3, 0x61, 0xe6, 0xbe, 0x2c, 0x6e, 0xb9, 0x98, 0xea, 0x93, 0x67, 0x70, 0xf9, 0xdf, 0x58, 0x62, 0x19, 0xe2, 0x68, 0x25, 0x32, 0xb4, 0xe0, 0x32, 0xe7, 0x39, 0xa6, 0x29, 0x6d, 0xa2, 0xb0, 0x71, 0x9e, 0x37, 0xbe, 0x1f, 0x49, 0x54, 0x49, 0x1a, 0xcd, 0xb2, 0xb6, 0x7c, 0xe6, 0xe8, 0xd0, 0x3b, 0xc6, 0x32, 0x75, 0x08, 0x68, 0x70, 0x8f, 0x77, 0x21, 0x72, 0x47, 0x61, 0x78, 0x72, 0x75, 0x87, 0x37, 0xe2, 0x5a, 0x77, 0xc2, 0x69, 0x91, 0xb4, 0xa8, 0x28, 0x43, 0x11, 0x78, 0x41, 0x9b, 0x5e, 0xd6, 0x9a, 0x79, 0x46, 0xcd, 0xde, 0x6b, 0x78, 0x67, 0xc5, 0xd9, 0x05, 0x7b, 0x96, 0x7f, 0x09, 0xc7, 0xea, 0x20, 0x8e, 0x3e, 0xb2, 0x79, 0xad, 0xa3, 0x7b, 0x75, 0xf6, 0x57, 0xf1, 0x9f, 0x13, 0x70, 0xa2, 0xdc, 0xa7, 0x0a, 0x05, 0x5a, 0x7c, 0xe2, 0xbb, 0xc4, 0xde, 0x21, 0x14, 0xb8, 0x42, 0x75, 0xd5, 0x7a, 0x2c, 0x66, 0x39, 0xea, 0x4f, 0xe8, 0x35, 0xb3, 0xf5, 0x2c, 0x00, 0xc6, 0xa1, 0xbc, 0xd3, 0x07, 0xf3, 0xc7, 0xee, 0x45, 0xcd, 0xb9, 0xdb, 0x70, 0xb4, 0x0f, 0xf6, 0x06, 0x79, 0x6a, 0x2d, 0xcf, 0x18, 0xe2, 0x05, 0xca, 0xe0, 0x9c, 0xdd, 0x67, 0xd4, 0x9f, 0x77, 0xf6, 0x52, 0xe3, 0xb4, 0x60, 0xf2, 0xab, 0x9f, 0x15, 0xb1, 0x15, 0xad, 0x45, 0x4f, 0xf0, 0x44, 0x53, 0xf5, 0xcd, 0x79, 0x87, 0x1b, 0x59, 0x1e, 0x03, 0xa9, 0xea, 0xfc, 0xf8, 0x5c, 0x57, 0x5d, 0x19, 0x6c, 0x0d, 0xce, 0x50, 0x6c, 0x5f, 0x22, 0xb0, 0x71, 0x1e, 0xba, 0xac, 0x76, 0x6a, 0x04, 0x86, 0xff, 0xc7, 0x42, 0x0a, 0xfd, 0x74, 0x8d, 0x7b, 0xf2, 0xf8, 0x19, 0xce, 0x55, 0xfd, 0xba, 0x16, 0x38, 0x61, 0xa7, 0x40, 0x28, 0x8b, 0x7f, 0x00, 0x55, 0xfb, 0x89, 0x0b, 0xf3, 0x25, 0x40, 0x87, 0xdf, 0x80, 0x0f, 0xbf, 0x86, 0xda, 0x59, 0x1c, 0x03, 0xee, 0xbc, 0x51, 0x87, 0x38, 0x97, 0xd5, 0xfe, 0x08, 0xc9, 0x96, 0xef, 0xd6, 0xbc, 0xec, 0xa4, 0xd5, 0xa3, 0xcb, 0x8c, 0xca, 0xff, 0x3e, 0xdd, 0x1f, 0x68, 0x10, 0x7d, 0x33, 0x8a, 0xcc, 0x23, 0xf5, 0x6e, 0xe9, 0xba, 0xb1, 0xfb, 0x3e, 0x06, 0x2a, 0xbc, 0xbc, 0x89, 0xe8, 0xe3, 0x5b, 0xa8, 0xd3, 0x8e, 0x55, 0x0a, 0x01, 0x4a, 0x93, 0x41, 0xcd, 0xd5, 0x64, 0xac, 0x29, 0x29, 0x75, 0x9b, 0x35, 0xb5, 0xfe, 0xb5, 0x10, 0xee, 0x39, 0x97, 0xed, 0x06, 0x18, 0xbe, 0x6a, 0xfb, 0x37, 0xa7, 0x1e, 0xd4, 0x10, 0x34, 0x71, 0x28, 0x6e, 0x52, 0xb1, 0xdf, 0x24, 0xd9, 0x62, 0x3c, 0xfe, 0xb4, 0xd5, 0x1c, 0xf8, 0x41, 0xfc, 0x78, 0xae, 0xfa, 0x7c, 0x31, 0x14, 0x56, 0x04, 0x0d, 0x67, 0xea, 0xdd, 0xfc, 0x63, 0xd4, 0xc3, 0xa1, 0xb7, 0x59, 0xf4, 0x0d, 0xb6, 0xcd, 0x86, 0xce, 0x4f, 0xb3, 0xfd, 0x28, 0x3f, 0x26, 0x1d, 0xa2, 0x85, 0x78, 0xfd, 0xc5, 0x16, 0x18, 0x5d, 0x20, 0xd3, 0xb9, 0x39, 0x8f, 0xb8, 0xb0, 0x9f, 0xbd, 0x56, 0x9e, 0xbd, 0xe8, 0x83, 0x50, 0x3e, 0xe4, 0x50, 0xe3, 0xd7, 0x63, 0x3b, 0x2c, 0x1c, 0x73, 0xa6, 0x57, 0x99, 0x48, 0x88, 0xcd, 0x1e, 0x3c, 0x63, 0x5c, 0x5a, 0x14, 0x76, 0x92, 0xab, 0x85, 0x33, 0x69, 0x35, 0xf7, 0xf3, 0x2a, 0x32, 0x88, 0xe9, 0x8b, 0x88, 0x54, 0x54, 0x1a, 0xa1, 0xf4, 0xf9, 0xdf, 0x77, 0x44, 0xd1, 0x3d, 0xee, 0x69, 0xff, 0x1a, 0x67, 0x13, 0x04, 0x40, 0x92, 0x00, 0x36, 0x02, 0x83, 0xc2, 0x6f, 0x22, 0x09, 0xc1, 0x02, 0xf2, 0x3b, 0x83, 0xf3, 0xba, 0x53, 0x2b, 0x67, 0x5a, 0xc0, 0x40, 0x59, 0x30, 0x76, 0xb0, 0x8f, 0x3c, 0x89, 0x15, 0xcc, 0x82, 0xfa, 0x36, 0x48, 0xb0, 0xd1, 0xd1, 0x5d, 0x01, 0x6b, 0x98, 0x83, 0x61, 0x16, 0x79, 0x7e, 0xd2, 0xdb, 0x22, 0xd6, 0x0e, 0x9b, 0xc5, 0x88, 0x6e, 0x5e, 0x18, 0xfb, 0x0a, 0xe7, 0xa1, 0x35, 0x22, 0x8c, 0x30, 0x4f, 0xbd, 0x44, 0xad, 0x26, 0x8f, 0x02, 0x13, 0x54, 0x20, 0x41, 0xbd, 0x5f, 0x2b, 0xe0, 0xe1, 0x2f, 0x44, 0x31, 0x5a, 0xc6, 0xbe, 0x4d, 0xaa, 0x2b, 0xcc, 0xaa, 0x3f, 0xa7, 0xe6, 0xef, 0xf5, 0x34, 0x6f, 0x06, 0xdd, 0x33, 0x94, 0x73, 0x3d, 0x5d, 0x77, 0xe5, 0xd7, 0xfc, 0x8d, 0x0b, 0x6e, 0x5b, 0x44, 0xa9, 0x87, 0x7b, 0xea, 0xeb, 0x6d, 0x07, 0xca, 0xf9, 0x77, 0x8a, 0x98, 0xcb, 0x8d, 0xe0, 0x0f, 0x3f, 0xe9, 0xeb, 0xd8, 0x69, 0x1b, 0x87, 0xae, 0x2a, 0x50, 0xbf, 0xc0, 0x04, 0xd3, 0x41, 0x56, 0x2c, 0xd4, 0x0f, 0xb8, 0xe1, 0x69, 0x78, 0x4c, 0xfd, 0xd2, 0x47, 0xfe, 0xca, 0x01, 0x3a, 0xe4, 0x16, 0x5a, 0xb5, 0x22, 0x8a, 0xb7, 0xb8, 0x0c, 0x37, 0xaf, 0x0f, 0x8b, 0x72, 0x18, 0xc8, 0xc2, 0xe2, 0xca, 0xea, 0xf1, 0xd7, 0xa6, 0x64, 0x99, 0xdd, 0xd7, 0x44, 0xe1, 0x92, 0x58, 0x29, 0x38, 0xb4, 0xb6, 0xfb, 0x3c, 0x7e, 0x18, 0xd9, 0xda, 0x35, 0x7c, 0x53, 0xb7, 0xfe, 0x43, 0xda, 0xcf, 0xf2, 0xf0, 0x74, 0x5d, 0x74, 0x2d, 0xb5, 0xfa, 0xc2, 0x0f, 0xea, 0x08, 0xcb, 0x9a, 0x97, 0x51, 0x41, 0x88, 0x24, 0xec, 0xee, 0x46, 0xd3, 0x61, 0x4b, 0x40, 0xf5, 0x0c, 0x4f, 0x5e, 0x5e, 0xc7, 0x85, 0xce, 0x16, 0xc3, 0x61, 0x05, 0x51, 0xb7, 0xd4, 0x00, 0xa1, 0x3d, 0x1e, 0xd0, 0x6b, 0x78, 0xe4, 0x55, 0x98, 0xfb, 0x82, 0x4a, 0x8c, 0xe6, 0xa2, 0x81, 0x5c, 0x52, 0x0e, 0x70, 0x3b, 0xf0, 0xc2, 0xed, 0x36, 0xec, 0x46, 0x36, 0x22, 0x18, 0x3a, 0x34, 0xd2, 0x46, 0x32, 0x01, 0x8d, 0xf5, 0xc5, 0xa7, 0xbe, 0x31, 0xe1, 0x2b, 0xee, 0xb4, 0x61, 0xca, 0xf0, 0x51, 0xe2, 0x82, 0x5b, 0x93, 0xd2, 0xd4, 0x3e, 0xa1, 0xc9, 0xc9, 0x0e, 0x64, 0x1d, 0x33, 0xe3, 0xec, 0xb1, 0x35, 0xe4, 0x10, 0x0d, 0x05, 0x00, 0x55, 0xb4, 0xf1, 0xe0, 0x12, 0xb1, 0xa0, 0x19, 0xd1, 0x74, 0x9b, 0xa5, 0xf7, 0xdc, 0x0b, 0x94, 0xa8, 0x95, 0xc5, 0xff, 0xe5, 0xa4, 0x83, 0x3e, 0xf7 ],
+const [ 0x9b, 0x5f, 0x37, 0xf5, 0xdc, 0xed, 0xd9, 0x6d, 0x9b, 0x7f, 0xf6, 0xd8, 0x52, 0xb7, 0x7e, 0xf9, 0x04, 0x98, 0x31, 0x1d, 0x24, 0xdf, 0xa9, 0x06, 0xb2, 0x97, 0x9b, 0x28, 0xa7, 0xe8, 0x5a, 0x18, 0x93, 0x30, 0x9c, 0x41, 0x85, 0x55, 0x81, 0xd9, 0x2b, 0x59, 0xd1, 0x13, 0x3a, 0x2e, 0x85, 0x96, 0x10, 0xcc, 0x8a, 0x2f, 0x99, 0x82, 0xc1, 0xc2, 0x6f, 0x89, 0x4a, 0x87, 0x45, 0xdf, 0x02, 0x72, 0x85, 0x52, 0x4a, 0xf3, 0x38, 0xdb, 0x0b, 0xe0, 0x27, 0x2e, 0xf7, 0xb0, 0x3f, 0x8f, 0x11, 0xe9, 0x3a, 0xe7, 0x6f, 0xdb, 0x7c, 0x17, 0x3e, 0x8f, 0x3b, 0x8c, 0x08, 0xfb, 0xe3, 0x14, 0x32, 0x77, 0xb9, 0xf0, 0xc9, 0x75, 0xbe, 0x2a, 0x7e, 0x6c, 0xd6, 0x29, 0xee, 0x15, 0x29, 0x82, 0x27, 0xda, 0xca, 0x11, 0x68, 0x8c, 0x97, 0x49, 0x29, 0x54, 0x60, 0xc8, 0x5b, 0xec, 0x4b, 0x2e, 0xf1, 0x0e, 0x76, 0x30, 0x9f, 0x2d, 0xdf, 0xe8, 0xe2, 0x64, 0x81, 0x6f, 0x40, 0xac, 0xc0, 0xae, 0xd1, 0x51, 0x07, 0x71, 0xfe, 0xa7, 0xb0, 0xbd, 0x89, 0xf9, 0x24, 0x64, 0xce, 0xc2, 0x43, 0xd6, 0x48, 0x1f, 0x06, 0x3a, 0x56, 0x85, 0x62, 0xbe, 0x3f, 0xaf, 0x70, 0x2b, 0x74, 0xdb, 0xcc, 0xbc, 0x16, 0x36, 0x3b, 0x30, 0xb8, 0x95, 0x90, 0x1e, 0x66, 0x65, 0xd0, 0x89, 0xe6, 0xe5, 0x94, 0xb4, 0x3d, 0x93, 0xaf, 0x37, 0x76, 0xe3, 0x11, 0x53, 0x9e, 0x37, 0xeb, 0x83, 0x13, 0x0c, 0x14, 0x53, 0xff, 0x71, 0xac, 0x75, 0x1f, 0xbe, 0xff, 0x12, 0xc9, 0x82, 0xab, 0x5e, 0x2d, 0xbd, 0x06, 0x6f, 0xdb, 0x50, 0xba, 0x4f, 0x85, 0xb1, 0xb2, 0x50, 0x06, 0xe3, 0x3a, 0x9f, 0xa4, 0xa6, 0x61, 0x1c, 0x92, 0xeb, 0xa2, 0x69, 0xb9, 0x8a, 0xc4, 0x41, 0xb9, 0x37, 0xff, 0x0c, 0x2a, 0xb3, 0x60, 0xb0, 0x27, 0x3f, 0x6f, 0xa9, 0x0d, 0x56, 0x0e, 0x5c, 0x80, 0x9b, 0xa4, 0xa8, 0xaf, 0x11, 0x7b, 0xbf, 0xd9, 0x8a, 0x67, 0x34, 0x11, 0x62, 0xa9, 0x55, 0x3e, 0x6c, 0x12, 0xba, 0x65, 0x2d, 0x6c, 0x1e, 0x2b, 0x48, 0x15, 0x6e, 0x95, 0x3a, 0xed, 0x20, 0x13, 0x47, 0x72, 0xc6, 0xbd, 0xb4, 0x2a, 0xe3, 0xdc, 0x37, 0x42, 0xfd, 0xac, 0xac, 0x74, 0xf3, 0x60, 0x09, 0x2e, 0x91, 0x67, 0x94, 0xf0, 0x62, 0xee, 0x54, 0xf5, 0xc5, 0xa6, 0xc5, 0x17, 0x43, 0xc7, 0xd0, 0xed, 0x20, 0x55, 0xf9, 0x36, 0x30, 0xa2, 0xdb, 0x7a, 0xec, 0x14, 0xd1, 0xee, 0xc5, 0x28, 0xf7, 0x99, 0xb9, 0xb7, 0x51, 0xb5, 0x23, 0x78, 0x49, 0x58, 0xd7, 0xc7, 0x5f, 0x53, 0x6e, 0xa4, 0x1c, 0x5a, 0xdf, 0xff, 0x47, 0x66, 0x50, 0x33, 0x5c, 0x58, 0x2b, 0xd0, 0x3a, 0xdf, 0x73, 0x9d, 0x1c, 0x9b, 0x59, 0xdd, 0xca, 0x83, 0x0a, 0xd2, 0x11, 0x84, 0xcc, 0x80, 0x70, 0x6a, 0x49, 0xb3, 0x14, 0x04, 0x2a, 0x43, 0x07, 0x83, 0xe8, 0x97, 0xa4, 0x24, 0xdf, 0x68, 0x4e, 0x0f, 0xa5, 0xc7, 0x61, 0x7e, 0x99, 0x62, 0x69, 0x21, 0xbf, 0x03, 0x92, 0xc2, 0xcb, 0x59, 0x60, 0x25, 0x7b, 0xfb, 0xa0, 0x32, 0x2a, 0xaa, 0x9f, 0x55, 0xa3, 0xd6, 0x99, 0x26, 0x33, 0x64, 0x74, 0x45, 0x02, 0xaf, 0xae, 0x88, 0xa2, 0xcd, 0x95, 0x59, 0xe9, 0x13, 0xb6, 0x59, 0xfc, 0xdb, 0x97, 0x4a, 0xad, 0x84, 0xa9, 0x2b, 0x07, 0xbb, 0x78, 0xa4, 0x26, 0xf9, 0x25, 0xa5, 0x4d, 0x4d, 0x16, 0x4b, 0x32, 0x5c, 0xec, 0x03, 0x9c, 0xa6, 0xb5, 0xf1, 0x30, 0x0b, 0x63, 0x93, 0x88, 0x8d, 0x7e, 0xa1, 0x86, 0x57, 0x15, 0x38, 0xe8, 0xff, 0xfa, 0x38, 0x1c, 0x08, 0x2f, 0xeb, 0x55, 0xab, 0x9b, 0xe7, 0xde, 0xd6, 0x01, 0x35, 0xaf, 0x76, 0x33, 0xb2, 0x3e, 0xf2, 0x83, 0xb6, 0x97, 0xf7, 0x7b, 0xf4, 0xaf, 0x7b, 0xce, 0xa1, 0xf5, 0xfc, 0x8d, 0xd9, 0x2b, 0x09, 0x9e, 0x3e, 0x74, 0x04, 0x6b, 0xe2, 0xae, 0x26, 0xd7, 0x67, 0x01, 0xc3, 0x76, 0x64, 0xb8, 0xd0, 0xfd, 0x0b, 0x50, 0xa2, 0xf7, 0x09, 0xcf, 0xf8, 0xba, 0xae, 0x58, 0x3c, 0x9a, 0x4e, 0xfb, 0x06, 0x5c, 0xe7, 0xd1, 0xe2, 0xee, 0x03, 0x49, 0x53, 0x55, 0xe0, 0xbd, 0x18, 0xe6, 0xcf, 0x49, 0xad, 0xb9, 0xda, 0xdc, 0x15, 0x5b, 0xa9, 0x8f, 0xd7, 0xc3, 0xa7, 0x36, 0x47, 0x87, 0x60, 0x35, 0x06, 0x50, 0x2d, 0x96, 0xcc, 0x8c, 0x14, 0x58, 0x65, 0x62, 0xea, 0x09, 0xfa, 0xeb, 0xba, 0x97, 0x92, 0x9f, 0x6b, 0x63, 0xd8, 0x0d, 0x9c, 0x97, 0x1f, 0xd0, 0xd3, 0xba, 0xa3, 0xbe, 0xd7, 0x81, 0x12, 0x62, 0x5a, 0xe8, 0x4b, 0xad, 0xdb, 0x82, 0x65, 0xe8, 0xcb, 0x0d, 0xf3, 0xed, 0xef, 0x4a, 0x86, 0x97, 0x05, 0x0c, 0x74, 0x77, 0xaa, 0x8e, 0xd8, 0xc8, 0x7b, 0x09, 0xda, 0xa5, 0x7b, 0x86, 0x31, 0x7a, 0xb5, 0xf1, 0xe6, 0xb9, 0x22, 0x70, 0x5a, 0xce, 0xcc, 0xf3, 0x8a, 0x54, 0x34, 0x0b, 0x92, 0x89, 0xf1, 0xff, 0x70, 0xff, 0x9b, 0x1d, 0x0b, 0x95, 0xe7, 0x4e, 0x74, 0xa6, 0x13, 0xed, 0x6b, 0x80, 0x85, 0xd9, 0x25, 0x18, 0xaf, 0xc9, 0x4c, 0xfc, 0x35, 0xe0, 0x48, 0x88, 0x52, 0x82, 0xbd, 0x5d, 0x78, 0x65, 0x54, 0x0f, 0x36, 0xeb, 0xbf, 0x1e, 0x5f, 0xaf, 0xf7, 0x28, 0x69, 0x5d, 0xc8, 0x5c, 0x13, 0xc8, 0x90, 0x32, 0x4a, 0x36, 0x44, 0x59, 0x4e, 0xfe, 0xb3, 0xf1, 0x11, 0x56, 0x0f, 0xfb, 0xe0, 0x66, 0xa9, 0x0e, 0x44, 0xa1, 0xfc, 0x4b, 0x2b, 0x54, 0xed, 0x93, 0x43, 0x7f, 0x51, 0xf7, 0xa7, 0xe5, 0xb0, 0x6f, 0xbd, 0x5f, 0x48, 0xcf, 0x5e, 0x75, 0x55, 0xf8, 0x38, 0x2f, 0x90, 0x4b, 0x71, 0x29, 0xf6, 0x64, 0x8d, 0xe6, 0xca, 0x04, 0x92, 0x66, 0xdd, 0x4e, 0x6a, 0xfb, 0x0d, 0x37, 0x88, 0x58, 0x0c, 0x38, 0xcf, 0xeb, 0x63, 0x45, 0xaf, 0x6d, 0xb6, 0x03, 0x91, 0xb7, 0x49, 0x36, 0x75, 0xd7, 0xc3, 0x78, 0xd9, 0x63, 0x32, 0x31, 0xdd, 0x0d, 0x50, 0xc3, 0xa6, 0x78, 0x05, 0x05, 0x00, 0x4a, 0x2c, 0xf3, 0x47, 0x83, 0x9a, 0xa4, 0x87, 0x0d, 0x5c, 0x7c, 0xe2, 0x93, 0x41, 0xa2, 0x32, 0x97, 0x99, 0xb4, 0xf0, 0xbf, 0x3b, 0xba, 0x55, 0x70, 0xcd, 0x59, 0xbe, 0x9e, 0x3f, 0x4a, 0x55, 0xe3, 0x99, 0x0a, 0xee, 0xce, 0xf7, 0xd2, 0x2f, 0x7d, 0xd1, 0xc9, 0xf4, 0x6e, 0x80, 0x79, 0xf1, 0x92, 0xfe, 0x7f, 0x9a, 0xa3, 0xee, 0x87, 0x3f, 0xb8, 0xdc, 0x78, 0x7c, 0x17, 0xc5, 0xec, 0xd0, 0x4a, 0xda, 0xe3, 0x8c, 0x75, 0x81, 0xb8, 0xef, 0xe6, 0x9d, 0x54, 0x8f, 0xee, 0x0f, 0xa1, 0xfa, 0xef, 0x7d, 0x41, 0x9e, 0xb7, 0x51, 0x81, 0xe6, 0x0c, 0x05, 0x88, 0xa6, 0x88, 0x9f, 0xd5, 0xb9, 0xa8, 0x77, 0xe8, 0xe9, 0x1f, 0x40, 0x3e, 0x0e, 0x70, 0x46, 0x83, 0x7a, 0xbb, 0xf5, 0x04, 0x95, 0xd7, 0x9b, 0x63, 0xc5, 0xa2, 0x6f, 0x8e, 0x91, 0x95, 0xd1, 0xf1, 0x05, 0x9c, 0xd3, 0xeb, 0x58, 0x24, 0xf9, 0x7f, 0xcc, 0x75, 0x3d, 0x4d, 0xd6, 0x42, 0x56, 0xc0, 0x7f, 0x7e, 0x3a, 0x88, 0x0a, 0x72, 0xe2, 0x4b, 0xd7, 0x0d, 0x4d, 0x97, 0x87, 0x7b, 0xc7, 0x1c, 0x61, 0xf9, 0x6b, 0x18, 0xf4, 0xe7, 0xe7, 0x12, 0xfe, 0x1e, 0x7f, 0xcb, 0x8d, 0x85, 0x55, 0x72, 0x64, 0xdf, 0xe7, 0x17, 0xa0, 0xe7, 0xd9, 0x62, 0x9c, 0x9f, 0xf5, 0x85, 0x11, 0xe5, 0x70, 0x6f, 0x82, 0x47, 0x6e, 0x42, 0xd7, 0x18, 0xc9, 0x08, 0x48, 0xc3, 0x0e, 0xa2, 0x7c, 0x60, 0xc9, 0x00, 0xf2, 0x85, 0x03, 0x98, 0xa1, 0x5f, 0x08, 0x10, 0xdb, 0x01, 0x6e, 0x3e, 0x77, 0xfb, 0x52, 0x53, 0x2f, 0x2f, 0xe5, 0x53, 0x47, 0xe0, 0x28, 0xc9, 0x70, 0x0c, 0xf3, 0xb8, 0xeb, 0xfc, 0x3c, 0xd4, 0xf1, 0x19, 0x96, 0xf2, 0x53, 0x01, 0xf8, 0xbe, 0x5e, 0xda, 0xc0, 0xac, 0x01, 0xe7, 0xf7, 0x31, 0x32, 0x58, 0xd7, 0x32, 0x8d, 0x67, 0x8a, 0xbd, 0x3e, 0xa0, 0x35, 0xf7, 0x22, 0x80, 0x35, 0x55, 0x29, 0x42, 0xa9, 0x0f, 0xff, 0xf6, 0x30, 0xd2, 0xeb, 0xd3, 0xf4, 0xb6, 0xf7, 0xce, 0xe7, 0x6f, 0x51, 0x6c, 0x4c, 0xc7, 0xf1, 0xd4, 0x7a, 0x4c, 0x7c, 0x28, 0xdc, 0x45, 0x68, 0x15, 0x3d, 0xeb, 0x62, 0xa9, 0x42, 0xd6, 0xec, 0x65, 0x38, 0xb6, 0x4b, 0x94, 0x10, 0x43, 0xa0, 0xdb, 0xa8, 0x77, 0x55, 0x10, 0x4d, 0xfa, 0xba, 0x4f, 0x7d, 0xde, 0xf0, 0x4b, 0xf1, 0x8c, 0x07, 0xe3, 0xdb, 0xfe, 0x63, 0xf6, 0x6c, 0x2f, 0x64, 0x77, 0x99, 0xd0, 0x46, 0xc4, 0x1f, 0x3d, 0x45, 0x33, 0xc4, 0xaf, 0x05, 0xee, 0xe0, 0xb3, 0x32, 0x02, 0x1d, 0xdb, 0x63, 0xb2, 0x7b, 0xb3, 0x45, 0x11, 0x97, 0xf6, 0xf5, 0xd0, 0x2c, 0x02, 0xad, 0x54, 0xda, 0x8a, 0xa3, 0x0b, 0x26, 0x8b, 0x2e, 0x01, 0xc3, 0x81, 0x2b, 0xae, 0x10, 0xda, 0x9f, 0x13, 0xe1, 0xab, 0x9e, 0x05, 0x82, 0xa2, 0x6b, 0xc8, 0xf9, 0x3c, 0xe0, 0xdf, 0x8c, 0x37, 0x10, 0x23, 0x83, 0x4b, 0x2c, 0x13, 0x2f, 0x15, 0xa3, 0x6b, 0x2b, 0x54, 0x8d, 0xf8, 0xe2, 0x57, 0x4a, 0xaa, 0x51, 0xb6, 0x66, 0xeb, 0x0f, 0x41, 0xc0, 0x2f, 0x8a, 0x36, 0xec, 0xcc, 0x93, 0xb7, 0xd5, 0x0d, 0x1d, 0x7a, 0xa7, 0x81, 0x41, 0xc3, 0xec, 0x99, 0x86, 0x8f, 0xf5, 0x72, 0x60, 0x12, 0x7b, 0xf0, 0xf6, 0x64, 0x86, 0x0c, 0x28, 0x78, 0x8e, 0x6f, 0xd1, 0x4d, 0xe0, 0x3f, 0x49, 0x68, 0x44, 0x39, 0x2f, 0x81, 0xdd, 0x00, 0x65, 0x7d, 0x50, 0xb4, 0x5b, 0x9c, 0x29, 0xc7, 0x91, 0xf4, 0x7a, 0x0c, 0x57, 0x1e, 0xc4, 0x11, 0xd8, 0x2f, 0x1b, 0xaf, 0x56, 0xe9, 0x86, 0xdf, 0xb7, 0x33, 0xa5, 0xcf, 0x41, 0xc7, 0x96, 0x36, 0xa2, 0x2b, 0x18, 0xe4, 0x33, 0xe2, 0xf1, 0x9d, 0x7d, 0xe3, 0x8e, 0x27, 0xfd, 0x4a, 0xea, 0xa2, 0x24, 0x4e, 0xb1, 0x18, 0xa2, 0x73, 0xa4, 0x55, 0xe4, 0x00, 0x3f, 0xf9, 0xdb, 0xb4, 0x99, 0xcb, 0x00, 0xb5, 0x8d, 0x50, 0x95, 0xc9, 0x17, 0x9d, 0x2d, 0xc8, 0x00, 0x69, 0x6e, 0x52, 0xbe, 0x66, 0x16, 0xbd, 0x96, 0xd2, 0x3c, 0x51, 0x03, 0x48, 0xd9, 0xb8, 0x5b, 0xdd, 0x86, 0xb0, 0xb0, 0x68, 0x87, 0x03, 0xf4, 0x21, 0x09, 0xb9, 0x61, 0x6e, 0xa8, 0x8c, 0x18, 0xf9, 0x34, 0x9c, 0x09, 0x06, 0xb5, 0x64, 0x12, 0x04, 0xac, 0xed, 0x6b, 0x61, 0x9c, 0x41, 0x41, 0xa3, 0xc9, 0x23, 0xa1, 0xb5, 0x40, 0xfd, 0x98, 0x7e, 0x17, 0x1a, 0x99, 0xb8, 0xf6, 0x15, 0x1e, 0x00, 0xd7, 0x92, 0x92, 0x29, 0x09, 0x2b, 0x6f, 0xd6, 0x7b, 0xae, 0xa4, 0x48, 0x37, 0x85, 0x39, 0x74, 0x2d, 0x75, 0x35, 0x59, 0x32, 0x8c, 0xc0, 0x90, 0x48, 0x54, 0x85, 0x25, 0x20, 0x4d, 0x5a, 0xa5, 0xdd, 0x9a, 0x23, 0x78, 0x1b, 0xfb, 0xf3, 0x71, 0x30, 0xfb, 0x75, 0xa4, 0xb1, 0x6b, 0x8b, 0x78, 0x39, 0x0e, 0x34, 0xfd, 0x65, 0x96, 0xb3, 0x7f, 0x23, 0xcf, 0xee, 0x5b, 0x2d, 0x1b, 0x14, 0x11, 0xd0, 0x1e, 0x82, 0x9b, 0xf2, 0xba, 0xe8, 0xfd, 0x53, 0x3e, 0xa7, 0x1e, 0x13, 0xda, 0x7e, 0xd6, 0x75, 0x57, 0x66, 0x48, 0xe2, 0x04, 0xba, 0x72, 0x31, 0xf4, 0x9b, 0x02, 0x25, 0x66, 0x93, 0x6b, 0x37, 0x85, 0x78, 0x39, 0x96, 0x52, 0x94, 0xa1, 0x6d, 0xde, 0x02, 0x5d, 0x64, 0xbc, 0x5b, 0xb7, 0x69, 0xb6, 0x93, 0xe3, 0xb0, 0xbf, 0x1d, 0x91, 0xf8, 0x29, 0x56, 0xc3, 0x11, 0x18, 0x20, 0xdc, 0x9b, 0x37, 0xcd, 0xfa, 0x10, 0xa9, 0x40, 0x86, 0x05, 0x43, 0x4e, 0x0a, 0xac, 0xf8, 0x6a, 0x42, 0x9e, 0x94, 0x82, 0x75, 0xd7, 0xae, 0x24, 0x05, 0x02, 0xd7, 0xe5, 0x46, 0xf8, 0x18, 0x03, 0x8c, 0x83, 0x9c, 0x49, 0x88, 0x67, 0xa9, 0x33, 0xd4, 0xa3, 0xd5, 0x53, 0xcc, 0xf4, 0x76, 0xf3, 0xa0, 0x9b, 0x5a, 0xfc, 0xa7, 0x60, 0xb8, 0x17, 0xf6, 0xd7, 0x67, 0x11, 0x32, 0xe2, 0x4e, 0x84, 0xa2, 0x77, 0x1c, 0xb4, 0x88, 0xa3, 0x39, 0xb7, 0xb2, 0xcf, 0xfc, 0xd9, 0x4c, 0x43, 0x1e, 0x3e, 0xf8, 0xe8, 0x6e, 0xc9, 0x21, 0x52, 0xc7, 0x3d, 0x8b, 0xfd, 0x3f, 0xa2, 0x2f, 0xd7, 0xa2, 0xeb, 0x47, 0xff, 0x1f, 0xd5, 0xa5, 0xcd, 0x40, 0x12, 0x48, 0x12, 0x20, 0xa7, 0x31, 0xa1, 0xd8, 0x93, 0x73, 0x0e, 0x3a, 0xb1, 0x8a, 0xb5, 0xc2, 0xdf, 0xed, 0xfe, 0xc9, 0x60, 0xe7, 0xe0, 0xfc, 0x7f, 0xa2, 0xa4, 0x0d, 0x75, 0x85, 0xec, 0xa8, 0x8d, 0xbf, 0xf3, 0xa9, 0x86, 0x24, 0x16, 0x8c, 0x39, 0x39, 0x94, 0x24, 0x7c, 0x8a, 0x92, 0x90, 0x45, 0x44, 0x62, 0x6c, 0x13, 0xff, 0x04, 0x44, 0x89, 0xdc, 0xed, 0x4e, 0x5c, 0xd0, 0x08, 0x58, 0x70, 0x3f, 0xfb, 0xff, 0x3e, 0xcd, 0xab, 0x22, 0x79, 0x71, 0x02, 0x96, 0xf1, 0xcb, 0xf0, 0x1b, 0xb7, 0xb7, 0xaf, 0x8f, 0x82, 0x22, 0x4c, 0x62, 0x51, 0x1c, 0x63, 0x4a, 0x52, 0x2f, 0x2a, 0x38, 0x03, 0xef, 0xb0, 0x8a, 0x97, 0xd3, 0x67, 0x82, 0x9b, 0x43, 0xe1, 0xf7, 0xd9, 0xf2, 0xd7, 0x4a, 0x7d, 0x6e, 0x6f, 0x9c, 0x76, 0xf6, 0xbe, 0x3e, 0x1f, 0x8b, 0x8c, 0x69, 0x1f, 0x49, 0x58, 0x30, 0x8e, 0xf8, 0x9c, 0xb2, 0x59, 0xdf, 0x53, 0x94, 0xe7, 0xd8, 0xb7, 0xaf, 0xfc, 0xaa, 0x4f, 0x05, 0xde, 0x92, 0x29, 0xfa, 0xb7, 0x23, 0x65, 0xc1, 0x3b, 0x51, 0xf3, 0x14, 0x8a, 0xc8, 0x9c, 0x28, 0x58, 0x82, 0x47, 0xe0, 0x4b, 0x98, 0x75, 0x41, 0xa4, 0x58, 0x0f, 0x26, 0x22, 0x99, 0x61, 0x34, 0x23, 0x4b, 0x66, 0x11, 0x0d, 0x52, 0x46, 0xd1, 0xec, 0x95, 0x1d, 0xb1, 0x5d, 0x51, 0xfe, 0x08, 0xaa, 0xb4, 0x38, 0x7a, 0x36, 0xa7, 0xd7, 0x6f, 0x1c, 0xeb, 0x6e, 0xc3, 0x13, 0x67, 0x14, 0xc0, 0x95, 0xc0, 0xad, 0x49, 0x40, 0x2b, 0x6b, 0x57, 0x7c, 0x7f, 0x94, 0xaa, 0x5e, 0x8f, 0x85, 0xb8, 0xcc, 0xb6, 0xf7, 0xea, 0xe2, 0xb3, 0x81, 0x07, 0x95, 0xb7, 0x5e, 0xf0, 0x96, 0xbd, 0x71, 0x8f, 0x79, 0x1a, 0x86, 0x0a, 0x17, 0x55, 0xdb, 0x3c, 0x31, 0x38, 0xdf, 0x65, 0x56, 0x27, 0x39, 0x20, 0x06, 0xb1, 0x0c, 0x96, 0x17, 0x65, 0x79, 0xf2, 0x58, 0xe7, 0x66, 0x15, 0x75, 0x43, 0x7e, 0x8a, 0x1a, 0x80, 0x79, 0xbc, 0x5b, 0x79, 0x9e, 0x66, 0x54, 0xe8, 0x86, 0x4c, 0x0c, 0xc4, 0x22, 0x29, 0xa0, 0xcd, 0x00, 0xe8, 0x9d, 0x65, 0xc9, 0x16, 0xad, 0xa1, 0x0f, 0x98, 0x76, 0xa0, 0x45, 0x99, 0xbf, 0x1b, 0x0f, 0xc7, 0xd4, 0x3e, 0xbd, 0xbf, 0x2c, 0xb6, 0x11, 0xc5, 0x4a, 0x0c, 0x49, 0xb9, 0xe1, 0x31, 0x59, 0x46, 0x3b, 0x5a, 0x79, 0x5d, 0xdb, 0x0d, 0xdf, 0xe2, 0x62, 0x7c, 0xce, 0xa5, 0xaf, 0x13, 0xcf, 0x93, 0x4a, 0x4d, 0x3f, 0x2e, 0x03, 0xcb, 0x09, 0x3a, 0xd6, 0xa7, 0xb5, 0xb9, 0x12, 0x06, 0xa2, 0x1a, 0xbb, 0xec, 0x8f, 0xae, 0x2c, 0x55, 0x60, 0x5b, 0x00, 0x81, 0x1f, 0x94, 0x33, 0x8f, 0x42, 0x88, 0x85, 0x4d, 0x2c, 0x9a, 0x1f, 0x4f, 0xf6, 0x12, 0x79, 0x3e, 0x6e, 0x12, 0x7b, 0x73, 0x60, 0xcb, 0xe3, 0xc4, 0x15, 0xf0, 0xe6, 0x9e, 0x1a, 0x6b, 0x1a, 0x55, 0x42, 0x50, 0x93, 0xb7, 0xee, 0x0f, 0x4c, 0xe7, 0x8c, 0xed, 0xc9, 0x69, 0x5e, 0xb5, 0xfb, 0x79, 0x7d, 0xaa, 0x64, 0xa1, 0x1d, 0xc1, 0x7c, 0x8a, 0x12, 0x0d, 0x52, 0x13, 0x94, 0x7b, 0x76, 0xa0, 0x3f, 0xbf, 0x17, 0xb4, 0x5d, 0x8e, 0x69, 0xc3, 0x68, 0x0e, 0x49, 0x41, 0xcb, 0x8b, 0x24, 0xff, 0xe9, 0x6b, 0x15, 0xb7, 0x60, 0x64, 0x4d, 0xe6, 0x8f, 0xec, 0xb8, 0xd9, 0x56, 0xf1, 0xde, 0x0b, 0x1c, 0xcb, 0x07, 0xae, 0x17, 0x6f, 0xa2, 0x88, 0xc7, 0xe5, 0xe7, 0x00, 0xc4, 0xfc, 0xbc, 0x79, 0xba, 0x3c, 0xd5, 0xde, 0xb2, 0x1c, 0x20, 0x7e, 0x93, 0x75, 0x60, 0x1b, 0xe8, 0x37, 0x17, 0x3d, 0xe3, 0x5b, 0xaa, 0xcc, 0xa2, 0x18, 0xc0, 0xde, 0xb2, 0x5a, 0xeb, 0xce, 0xd2, 0x70, 0x8a, 0x8e, 0xf9, 0x04, 0xee, 0x3e, 0x9a, 0x51, 0xbb, 0xfd, 0x26, 0x90, 0x91, 0xff, 0xd3, 0xb3, 0xec, 0xdf, 0x9c, 0x56, 0x49, 0x37, 0x88, 0xf3, 0x8b, 0x6f, 0x30, 0x55, 0x9c, 0xd2, 0x7b, 0x4f, 0x57, 0xe7, 0xad, 0xad, 0xa6, 0xfe, 0xa0, 0x6b, 0xe7, 0x09, 0x50, 0x25, 0x95, 0xad, 0x9e, 0xcf, 0x24, 0x99, 0x4d, 0xa6, 0x2c, 0x17, 0x51, 0x66, 0xca, 0xe0, 0x49, 0xbe, 0x44, 0x35, 0x4a, 0x01, 0xeb, 0x2b, 0xde, 0x1e, 0x46, 0x47, 0x4c, 0xd2, 0x6c, 0x4a, 0x1a, 0x1c, 0xb2, 0x4e, 0xd1, 0xf2, 0x86, 0x12, 0x00, 0x32, 0x9b, 0x93, 0x83, 0xdb, 0x47, 0xdc, 0x05, 0x7d, 0x29, 0x1e, 0xc4, 0xee, 0x0e, 0x03, 0x94, 0x3f, 0x15, 0x40, 0x27, 0xee, 0x12, 0x6a, 0x8b, 0x5d, 0x31, 0x0a, 0xf4, 0x83, 0xdc, 0xf3, 0xbc, 0xe2, 0xde, 0xd3, 0xa8, 0xb9, 0xc8, 0x09, 0x6d, 0x7a, 0x93, 0xb6, 0x73, 0x7e, 0x88, 0x17, 0xd8, 0xf8, 0x5d, 0x12, 0xb8, 0x28, 0xa1, 0x0e, 0xac, 0xd1, 0x5a, 0x08, 0x90, 0xec, 0xec, 0xe3, 0x8a, 0x9e, 0x3c, 0x00, 0x47, 0x68, 0x16, 0x0f, 0x88, 0x9e, 0xcc, 0x25, 0xde, 0x1a, 0x20, 0x0e, 0xb1, 0x31, 0x64, 0xe4, 0x87, 0xe6, 0xe0, 0xe0, 0x83, 0x5e, 0x74, 0x71, 0x2c, 0x94, 0x7f, 0x8b, 0x71, 0x4e, 0xff, 0x42, 0xe9, 0x50, 0xf9, 0x97, 0x5f, 0xcf, 0x1b, 0x92, 0x8d, 0x28, 0xa0, 0x91, 0x28, 0xd2, 0x74, 0xdf, 0x1d, 0x91, 0x98, 0x88, 0x1b, 0xed, 0xc9, 0x6c, 0x51, 0xe3, 0x5c, 0x93, 0x79, 0xda, 0x6d, 0xc0, 0x15, 0xd9, 0x38, 0x49, 0xf8, 0xf6, 0xc7, 0x25, 0x09, 0x12, 0xce, 0x47, 0x44, 0xc3, 0xd3, 0x2a, 0x01, 0x92, 0x91, 0xae, 0x79, 0x67, 0x9f, 0x22, 0x86, 0x41, 0x4d, 0xa2, 0xaa, 0x2a, 0xcf, 0xa3, 0x53, 0x6b, 0x9d, 0xcc, 0x5d, 0xfc, 0x19, 0x08, 0xd9, 0x3e, 0x72, 0xd9, 0x0d, 0xec, 0xc9, 0xef, 0xbb, 0x4f, 0x93, 0xf9, 0xa7, 0xb2, 0x3f, 0xbb, 0x53, 0x16, 0x18, 0x60, 0x0d, 0x27, 0x6c, 0x12, 0x2b, 0x6e, 0xee, 0xc9, 0x96, 0xc7, 0x59, 0x60, 0x85, 0x16, 0x56, 0xee, 0x8b, 0x36, 0xa0, 0x53, 0xd4, 0x32, 0x66, 0x11, 0xac, 0xb8, 0xf1, 0x5e, 0x40, 0xca, 0x86, 0x77, 0xa9, 0xb7, 0x8e, 0x36, 0x26, 0x4a, 0xf4, 0xe7, 0xa9, 0x41, 0xcf, 0x58, 0x96, 0x00, 0x41, 0x2f, 0xc7, 0x87, 0x9e, 0x80, 0xd3, 0xa2, 0xd1, 0x9f, 0x90, 0x5f, 0xfc, 0x33, 0xd6, 0xc5, 0x5f, 0x8c, 0x86, 0xc3, 0x7b, 0x37, 0xcb, 0x67, 0x77, 0xcf, 0xa0, 0x51, 0xc2, 0x15, 0x93, 0x66, 0xfa, 0x43, 0xc8, 0xc9, 0x0d, 0x9e, 0x40, 0x07, 0x9e, 0x4b, 0x5b, 0x91, 0xaa, 0x63, 0x9c, 0x70, 0x6b, 0x4a, 0xad, 0x34, 0x7c, 0x3c, 0xa3, 0x2d, 0x3f, 0x28, 0x82, 0xde, 0x7c, 0xc2, 0x04, 0xaf, 0x4a, 0xd4, 0x96, 0xe2, 0x33, 0xd4, 0xa4, 0xc8, 0x93, 0xbc, 0x16, 0x35, 0x41, 0x16, 0x1b, 0x31, 0x71, 0x56, 0x25, 0xf0, 0xd9, 0x6d, 0x35, 0x05, 0x13, 0x9b, 0x58, 0xd2, 0x43, 0x85, 0x71, 0x43, 0xf9, 0x87, 0x3a, 0xbc, 0x59, 0x4b, 0x86, 0x4f, 0x79, 0x9b, 0xc9, 0x33, 0x0a, 0x73, 0xd9, 0x71, 0x3b, 0x5b, 0xf6, 0xe1, 0xda, 0xf3, 0x09, 0x55, 0xbc, 0xd0, 0x29, 0x14, 0x60, 0x86, 0x63, 0x8a, 0xcf, 0x06, 0xbb, 0x3d, 0xc6, 0x2b, 0x6e, 0x03, 0x17, 0x8f, 0x7a, 0x73, 0x4d, 0xa3, 0x60, 0x99, 0x8f, 0xff, 0x29, 0xee, 0xc7, 0xf6, 0xa7, 0x86, 0x03, 0x6e, 0xfd, 0x8c, 0x1b, 0xee, 0x62, 0xec, 0x94, 0xf9, 0x21, 0x4f, 0xc4, 0x9b, 0xe4, 0x4c, 0x37, 0x41, 0x33, 0xdc, 0x52, 0xce, 0x38, 0x0f, 0x36, 0xea, 0xc5, 0xfe, 0xe7, 0x9d, 0x98, 0x01, 0xae, 0x1e, 0xdd, 0x22, 0xbb, 0xe5, 0xf4, 0xd1, 0x0f, 0x07, 0x75, 0xd9, 0x99, 0xc3, 0x71, 0x92, 0x9f, 0x58, 0xfb, 0x58, 0x60, 0x1a, 0xe7, 0x3d, 0xf8, 0xc5, 0xd2, 0xfb, 0x83, 0x11, 0x63, 0x2d, 0x85, 0x87, 0xcf, 0xbe, 0x8a, 0x92, 0xa3, 0xa1, 0x09, 0xd9, 0xbe, 0xc2, 0x8e, 0xcc, 0x9c, 0x3d, 0x18, 0x7d, 0xdb, 0xcf, 0xc0, 0xb2, 0xf7, 0x89, 0x9c, 0x38, 0x59, 0xcc, 0xe3, 0x7a, 0x90, 0x71, 0x52, 0x52, 0xde, 0x48, 0xce, 0x1e, 0xf6, 0xc4, 0x4a, 0x17, 0x04, 0xf4, 0xeb, 0xde, 0xee, 0xb5, 0x6a, 0x58, 0xd9, 0x27, 0xbb, 0xbc, 0xf0, 0x5d, 0xec, 0xea, 0x60, 0x59, 0x4f, 0xff, 0xa7, 0x37, 0xdb, 0x26, 0x0f, 0xa8, 0xd0, 0xb1, 0x75, 0xa2, 0x9a, 0x68, 0x4f, 0x56, 0xf8, 0x20, 0xee, 0x63, 0x5d, 0x90, 0x00, 0x49, 0x97, 0x61, 0x58, 0x20, 0xae, 0x84, 0xf2, 0x8a, 0x0f, 0xc8, 0x31, 0xe6, 0xe9, 0xac, 0x6c, 0xc6, 0xd8, 0x71, 0xa9, 0xa3, 0xc1, 0x74, 0xa8, 0xd0, 0xfd, 0xbb, 0x24, 0xad, 0xb9, 0xce, 0x55, 0x1d, 0x9c, 0xc8, 0xb9, 0x3a, 0xab, 0xad, 0x14, 0x47, 0x6a, 0xfe, 0xb6, 0xe5, 0x44, 0x8b, 0xfc, 0x8a, 0x2d, 0x89, 0x19, 0x30, 0x86, 0xe4, 0x16, 0x4a, 0x41, 0xd7, 0x18, 0xfc, 0x45, 0xb9, 0xe2, 0x8b, 0x14, 0x1a, 0x9a, 0x13, 0xab, 0x0e, 0xd0, 0x78, 0xaa, 0xc9, 0xbc, 0x9e, 0xb4, 0x6c, 0xc7, 0xdd, 0x19, 0x1f, 0x4e, 0xaf, 0xb2, 0x60, 0xa2, 0xac, 0x0d, 0x9a, 0x53, 0xb9, 0xca, 0xfa, 0xae, 0x7c, 0x45, 0x7e, 0x84, 0x13, 0x76, 0x4f, 0x2d, 0x05, 0x15, 0x50, 0xcd, 0x78, 0x01, 0xf7, 0xd6, 0xa5, 0xe2, 0x5c, 0xce, 0x8a, 0x0d, 0x8f, 0x53, 0xde, 0xa9, 0x2f, 0x5c, 0x4a, 0x10, 0x38, 0xc1, 0xd6, 0x78, 0x1d, 0xfe, 0xa2, 0xd3, 0x17, 0x34, 0xd6, 0xf4, 0xbc, 0x70, 0xdb, 0xf2, 0xd3, 0x30, 0xcc, 0xd1, 0x67, 0x23, 0x27, 0x5f, 0x1a, 0x31, 0xc9, 0x5d, 0xbc, 0xbb, 0x19, 0xdf, 0x1c, 0x24, 0x83, 0xf6, 0x1e, 0x90, 0x28, 0x8b, 0x0e, 0xeb, 0xd3, 0x8e, 0x34, 0x2e, 0x2f, 0x51, 0xa9, 0xdd, 0x38, 0x2e, 0x69, 0xd4, 0xf0, 0x70, 0xa8, 0x44, 0x53, 0x71, 0x6a, 0xf9, 0x8c, 0xff, 0x4e, 0xde, 0x69, 0x04, 0xaa, 0xc2, 0x0d, 0x66, 0xdd, 0x5c, 0xe5, 0x2d, 0xe1, 0x8d, 0xdd, 0xe4, 0x20, 0xe6, 0xd3, 0x41, 0x89, 0x6a, 0x4b, 0x08, 0xe2, 0x95, 0x65, 0x2c, 0x60, 0x9d, 0x0d, 0x37, 0x75, 0xf7, 0x72, 0xed, 0xe9, 0x1d, 0xb9, 0x2c, 0x2c, 0x8f, 0xf2, 0x17, 0xeb, 0x17, 0x4b, 0x74, 0xe1, 0x52, 0x83, 0x51, 0xf0, 0x6c, 0xa2, 0xee, 0x70, 0x2b, 0xe8, 0xd7, 0xc7, 0x2f, 0x03, 0x51, 0x39, 0x78, 0x85, 0xf7, 0x02, 0x28, 0x94, 0xa5, 0xa2, 0x8a, 0xe3, 0x95, 0x79, 0x54, 0xe2, 0xc8, 0x93, 0x29, 0x32, 0xa8, 0xc5, 0x62, 0x5c, 0xeb, 0xf9, 0x0e, 0xc2, 0xba, 0xc6, 0x37, 0xd6, 0x13, 0x44, 0x68, 0x89, 0x6c, 0x1e, 0x6b, 0x07, 0x99, 0xe8, 0x57, 0xa1, 0xef, 0xb3, 0xcb, 0x0a, 0xaa, 0xdf, 0x74, 0xc7, 0x8c, 0x31, 0xd5, 0xe1, 0xc7, 0x25, 0x47, 0xdd, 0x1d, 0x86, 0x3e, 0xed, 0x46, 0x3b, 0xcf, 0x68, 0x92, 0x64, 0x6f, 0x78, 0xcf, 0xa6, 0xfe, 0x13, 0x6d, 0xc2, 0x04, 0x2c, 0xe0, 0x6d, 0x3a, 0x2a, 0x46, 0x5c, 0x4c, 0x99, 0x4a, 0x9e, 0xdd, 0x1f, 0x48, 0x2e, 0xcb, 0xb2, 0xb2, 0xc9, 0xb5, 0x09, 0xb2, 0xfd, 0xbb, 0x50, 0x10, 0x83, 0x85, 0x20, 0x57, 0xce, 0x87, 0xae, 0x33, 0xe4, 0x83, 0x43, 0x1e, 0x6d, 0x4f, 0xec, 0x3b, 0x09, 0xd8, 0x72, 0x82, 0xe7, 0x67, 0x8c, 0x1e, 0x94, 0x23, 0x54, 0x13, 0x10, 0xd8, 0xf8, 0x24, 0x27, 0xf6, 0xb2, 0xf4, 0xfe, 0xdd, 0xfa, 0x6b, 0xed, 0x57, 0xfa, 0x5b, 0x8c, 0x66, 0x42, 0x64, 0x11, 0x41, 0xbd, 0x15, 0xd9, 0x99, 0xe3, 0x53, 0x44, 0x20, 0x31, 0xff, 0xc6, 0x4c, 0xd6, 0xd3, 0x3b, 0x58, 0xb0, 0x8d, 0x7b, 0x8d, 0x76, 0x50, 0x2f, 0xbf, 0x37, 0x47, 0xe3, 0x1a, 0x03, 0x8b, 0x5c, 0x1f, 0xe8, 0x47, 0x2b, 0xe9, 0x20, 0x1a, 0x82, 0xb5, 0x88, 0xbc, 0x47, 0xa1, 0x54, 0xe5, 0x67, 0xb4, 0x01, 0x6a, 0x6d, 0x1f, 0x8c, 0xa9, 0x53, 0xc2, 0xe2, 0x28, 0x97, 0xf2, 0x97, 0x79, 0x92, 0x7a, 0xda, 0x61, 0x06, 0xdf, 0xa9, 0x39, 0xf6, 0xe9, 0x41, 0x93, 0xba, 0x5e, 0xd9, 0x21, 0x52, 0x11, 0x8f, 0xd3, 0xfb, 0x1b, 0xa3, 0x40, 0x00, 0x69, 0xe3, 0x47, 0xd3, 0x77, 0x66, 0xf6, 0x5c, 0x5a, 0x7d, 0xaa, 0x91, 0x04, 0xe7, 0x78, 0x47, 0xc4, 0x44, 0xcc, 0x47, 0x0c, 0xcc, 0x50, 0xa5, 0x77, 0x41, 0x10, 0x4d, 0x0a, 0x22, 0xdb, 0xdf, 0xbb, 0x22, 0xec, 0xbd, 0x2f, 0xd9, 0xca, 0x62, 0xc8, 0xb8, 0x6c, 0xf5, 0xdf, 0x42, 0xa1, 0x1d, 0x4e, 0x79, 0xaf, 0x18, 0x32, 0x97, 0x3a, 0x07, 0xef, 0xff, 0x68, 0x8c, 0x74, 0x73, 0x43, 0x97, 0xc0, 0x87, 0x5f, 0x7d, 0xa4, 0x56, 0xbc, 0x4b, 0xcb, 0x73, 0xed, 0x59, 0xf9, 0x23, 0x7a, 0x22, 0x90, 0xc9, 0x84, 0x52, 0x58, 0xa1, 0xa7, 0x21, 0x7f, 0xb1, 0x25, 0xe0, 0xdf, 0xfd, 0x40, 0xd1, 0x80, 0xfb, 0xe7, 0x3c, 0x5e, 0x46, 0x95, 0xbf, 0x6c, 0x96, 0x77, 0xe6, 0xd8, 0xf0, 0xcd, 0xfc, 0x91, 0x1a, 0x92, 0x20, 0x07, 0x52, 0x5f, 0x9b, 0x32, 0x3f, 0x8d, 0x70, 0xd5, 0x28, 0x9a, 0x35, 0x04, 0x64, 0xcd, 0x22, 0xe4, 0x12, 0x1d, 0x68, 0xb2, 0x0a, 0x50, 0xc3, 0x06, 0x13, 0x60, 0x53, 0x59, 0x56, 0x22, 0xa8, 0xc5, 0x12, 0x29, 0x1c, 0x0d, 0x92, 0xe9, 0x65, 0xdd, 0x5c, 0x18, 0x6a, 0x53, 0xac, 0x5a, 0x56, 0xbd, 0x20, 0x1c, 0xeb, 0xa5, 0xb5, 0xc0, 0x1a, 0x0b, 0xf2, 0xfb, 0xd0, 0xf1, 0x63, 0x7c, 0x12, 0x1d, 0x49, 0xcf, 0x4c, 0x1a, 0x90, 0x80, 0xe6, 0x80, 0x01, 0x83, 0x19, 0x75, 0xb9, 0xd3, 0x01, 0x74, 0xda, 0x5a, 0xf3, 0x4d, 0x80, 0x11, 0x10, 0x6d, 0xf7, 0x68, 0x1a, 0x60, 0x2b, 0xe8, 0x87, 0x94, 0x5f, 0x17, 0xd4, 0x60, 0x22, 0x9c, 0x1c, 0x44, 0x7f, 0xa3, 0xe9, 0x73, 0x75, 0x83, 0x4a, 0x8e, 0xa7, 0x9e, 0x26, 0xb3, 0x53, 0x89, 0xcf, 0xb6, 0x88, 0x6e, 0xda, 0xae, 0x94, 0xae, 0x2f, 0xb4, 0xbc, 0xca, 0x5c, 0xe7, 0x31, 0x83, 0x2f, 0xb4, 0x3f, 0x40, 0x83, 0x54, 0xc6, 0xb1, 0x5a, 0x95, 0xee, 0xb2, 0x2c, 0xde, 0x17, 0x72, 0x7f, 0x6d, 0x0f, 0xd4, 0xb8, 0xe4, 0x88, 0x15, 0x31, 0x04, 0xc9, 0xb0, 0x8b, 0xb8, 0xa3, 0x7e, 0x46, 0x55, 0xa7, 0x22, 0x8e, 0x20, 0x96, 0xa4, 0x58, 0x11, 0x19, 0x5c, 0xae, 0xd6, 0xb2, 0x12, 0x47, 0x1b, 0xf3, 0x63, 0x5b, 0x09, 0xee, 0x66, 0xb5, 0x0c, 0xec, 0x90, 0x0a, 0xda, 0x62, 0xd5, 0x89, 0xb1, 0x20, 0x10, 0xb3, 0xdf, 0xcc, 0xa5, 0x6d, 0x88, 0x8f, 0x65, 0x54, 0xa4, 0x0e, 0xb2, 0x50, 0x47, 0x9c, 0xe3, 0x6c, 0x25, 0xad, 0xea, 0xe5, 0x55, 0x8e, 0x33, 0x80, 0x55, 0x54, 0xd0, 0x21, 0x4f, 0x13, 0xd4, 0x9a, 0x9a, 0x50, 0xfc, 0xc1, 0x84, 0xb8, 0x95, 0xc5, 0x4f, 0x12, 0x99, 0xc2, 0x79, 0x72, 0x1c, 0x92, 0x41, 0xaf, 0xe6, 0xe7, 0x66, 0x18, 0x62, 0x96, 0x32, 0x63, 0xb7, 0x36, 0xb7, 0xe6, 0x34, 0xea, 0x59, 0x0a, 0xf1, 0x7b, 0x8c, 0xfc, 0xb3, 0xaa, 0xdf, 0xa5, 0x11, 0xc4, 0x3a, 0xdd, 0xd5, 0x76, 0x63, 0xdb, 0xa5, 0xe3, 0xc7, 0xf0, 0xe3, 0xf4, 0x78, 0x76, 0xd1, 0xef, 0x72, 0x03, 0xf9, 0x4c, 0x22, 0xe2, 0xcc, 0xc4, 0x29, 0xc3, 0x89, 0xaa, 0x5d, 0xb1, 0x60, 0x7e, 0x10, 0x45, 0xd8, 0xc0, 0x96, 0x19, 0x6e, 0x02, 0x01, 0x80, 0x7e, 0x41, 0x2f, 0x74, 0x67, 0x75, 0x07, 0xd0, 0xeb, 0x67, 0xff, 0xc0, 0xd4, 0xc3, 0xe1, 0x75, 0xdd, 0x6e, 0xd0, 0x1d, 0xcf, 0x19, 0x86, 0x12, 0xeb, 0x17, 0xdf, 0x51, 0x88, 0x6b, 0x9b, 0x2f, 0xfd, 0x26, 0x5f, 0x47, 0xc1, 0xf0, 0xfe, 0xb7, 0xd1, 0xe4, 0xf7, 0x8c, 0x52, 0xa1, 0x3f, 0x7a, 0x78, 0x9d, 0x40, 0xd1, 0xa6, 0xbd, 0x21, 0xac, 0xd7, 0x23, 0x48, 0x6b, 0x3c, 0x48, 0x1d, 0x64, 0x26, 0x4a, 0x11, 0xd6, 0x27, 0x87, 0xe0, 0x1e, 0x74, 0x6a, 0x12, 0x2e, 0x8e, 0x85, 0xc8, 0x3a, 0x22, 0xe0, 0xb5, 0xb4, 0x2d, 0x91, 0x6b, 0x7b, 0x63, 0x8d, 0xd8, 0x50, 0xd2, 0xbe, 0x10, 0x89, 0xc3, 0x56, 0x4d, 0x09, 0xe1, 0x62, 0x33, 0x6f, 0x9d, 0xa2, 0x59, 0x8e, 0xd0, 0x98, 0x06, 0x1e, 0xa2, 0xdf, 0x38, 0xb0, 0xac, 0xbe, 0xeb, 0xe8, 0x59, 0xfd, 0x97, 0xe6, 0x92, 0xf7, 0xfb, 0x05, 0x9a, 0xf1, 0x19, 0xc8, 0x36, 0xaa, 0x82, 0x11, 0x12, 0x33, 0xd3, 0x94, 0x60, 0x01, 0x80, 0x8c, 0xc2, 0x41, 0xd0, 0xac, 0x6a, 0x6b, 0x29, 0x59, 0x7f, 0x1a, 0x8e, 0x16, 0xc3, 0x1b, 0x66, 0x40, 0x74, 0xc4, 0x7f, 0xfb, 0x70, 0x87, 0x52, 0x6c, 0x9c, 0xc7, 0x89, 0x29, 0x85, 0xe9, 0xbe, 0xed, 0x48, 0xaf, 0x86, 0x91, 0xb0, 0xc1, 0xae, 0x37, 0x9f, 0x8d, 0xc4, 0xc9, 0xaf, 0x51, 0xd9, 0xa2, 0x18, 0x76, 0x86, 0x8a, 0xd5, 0x20, 0x2d, 0xe8, 0x02, 0x03, 0x81, 0x33, 0x89, 0x78, 0x49, 0xaa, 0xfd, 0xd0, 0x61, 0x45, 0xc6, 0xe8, 0x01, 0xeb, 0x7f, 0xfd, 0x41, 0xe5, 0x9c, 0xc2, 0xdd, 0x93, 0x50, 0xb0, 0x36, 0x5d, 0xae, 0x9e, 0x9a, 0xed, 0x0e, 0x91, 0xc5, 0x9b, 0xb2, 0xd5, 0xa8, 0x29, 0xa9, 0x4d, 0x69, 0xb1, 0xf4, 0x07, 0xaa, 0xdb, 0xe8, 0x13, 0x0e, 0x53, 0xd3, 0x96, 0xf9, 0x7b, 0xe2, 0x1a, 0x98, 0x5d, 0x42, 0x28, 0x22, 0xe3, 0x86, 0x19, 0x5d, 0x4a, 0x49, 0x29, 0x63, 0xd4, 0x14, 0xcd, 0xa6, 0xbd, 0x82, 0x47, 0x32, 0x71, 0xa1, 0x77, 0x32, 0xfc, 0x9c, 0xf4, 0xb6, 0xc2, 0x97, 0x5b, 0xb3, 0x70, 0xdb, 0xe7, 0x4b, 0x32, 0x33, 0x42, 0x4f, 0x27, 0x95, 0x9b, 0x03, 0x12, 0x05, 0xf9, 0x21, 0x52, 0xb7, 0xcf, 0x20, 0x14, 0x74, 0xd0, 0xb5, 0xc7, 0x3e, 0x04, 0x9b, 0xd0, 0x37, 0x1c, 0x90, 0x7f, 0xbf, 0x03, 0xa0, 0x42, 0xdd, 0xb5, 0xa5, 0x19, 0xe0, 0x54, 0x0f, 0x4a, 0x46, 0x79, 0xe1, 0x56, 0xdc, 0xc8, 0xfc, 0x2b, 0x27, 0xc7, 0xa0, 0x9b, 0x03, 0xf0, 0x30, 0x0d, 0x8a, 0x04, 0x35, 0x73, 0x37, 0xa3, 0xa6, 0x7c, 0x4b, 0x1a, 0x67, 0x0a, 0x70, 0x7c, 0x0f, 0xe6, 0x9d, 0xf4, 0xee, 0xb3, 0x39, 0x59, 0x4f, 0x20, 0x83, 0x03, 0xfa, 0x62, 0x31, 0xdd, 0xfd, 0xe2, 0x57, 0xbc, 0xac, 0x32, 0x8b, 0xef, 0xe7, 0x46, 0x47, 0x18, 0x9b, 0xe1, 0x8f, 0x3a, 0x8b, 0x4d, 0xd3, 0x12, 0x51, 0x4f, 0x16, 0xab, 0x9f, 0x5a, 0x50, 0x2d, 0xcb, 0x03, 0x11, 0xf5, 0x8b, 0xb5, 0x68, 0xeb, 0xfd, 0xa6, 0x03, 0x10, 0xea, 0x09, 0x97, 0x57, 0x4b, 0x86, 0x83, 0xb6, 0x0c, 0xe7, 0xb0, 0x7c, 0x11, 0x14, 0xbb, 0xe5, 0x77, 0x41, 0x56, 0xec, 0x1c, 0x66, 0xeb, 0x60, 0x61, 0xef, 0x83, 0x3a, 0x2e, 0xb5, 0xe7, 0x2e, 0x37, 0x2e, 0x04, 0x80, 0x7e, 0xe0, 0x94, 0x19, 0x19, 0x1c, 0xfb, 0xda, 0x36, 0xe8, 0x6f, 0x30, 0x5c, 0x3d, 0x5c, 0xe9, 0xf4, 0x73, 0x07, 0x46, 0x07, 0xf9, 0x71, 0x51, 0x49, 0x49, 0x7e, 0x70, 0x57, 0x1b, 0x56, 0x3b, 0x3d, 0xd9, 0x0c, 0x8b, 0x3b, 0x54, 0x7e, 0xd3, 0xc9, 0xb5, 0x7c, 0xb4, 0xd8, 0xb6, 0x2c, 0xcb, 0x5b, 0x12, 0xac, 0xce, 0x06, 0x39, 0xfa, 0xd7, 0x55, 0x49, 0x11, 0xff, 0xd1, 0x3a, 0x55, 0x2f, 0x8f, 0x58, 0x31, 0x33, 0xf9, 0xf7, 0xff, 0x10, 0xd0, 0x62, 0x28, 0x98, 0x72, 0x14, 0x8c, 0x3b, 0x59, 0x2b, 0x24, 0x20, 0xe5, 0x19, 0xe5, 0x75, 0x5b, 0x9d, 0xe8, 0x03, 0x2d, 0xf2, 0xc9, 0x05, 0x7c, 0x46, 0x4d, 0x3a, 0xdb, 0x6d, 0x47, 0x39, 0x56, 0xd7, 0xbc, 0x05, 0xb3, 0xbf, 0x45, 0xe1, 0xf7, 0xa6, 0xb5, 0x65, 0x2c, 0x00, 0xfc, 0xd2, 0x62, 0x2d, 0x4b, 0xa3, 0xf4, 0xaa, 0x79, 0x64, 0x0c, 0x89, 0xa6, 0xc7, 0x69, 0x1e, 0x1e, 0xf5, 0x60, 0xfc, 0x7f, 0x22, 0x21, 0x20, 0x1f, 0x64, 0x3c, 0x6b, 0xa8, 0xc5, 0x64, 0x56, 0x05, 0x97, 0x72, 0xe1, 0x82, 0x07, 0xad, 0xcc, 0x2e, 0xf5, 0x48, 0x0a, 0x84, 0x03, 0x2c, 0x73, 0x4b, 0xec, 0xf8, 0xb9, 0xbb, 0x18, 0x46, 0x9d, 0xe1, 0x6d, 0x31, 0x62, 0x45, 0x67, 0x14, 0x82, 0xc9, 0x6b, 0x93, 0xa1, 0xd4, 0x58, 0xe0, 0xbf, 0xb0, 0x60, 0x37, 0xb1, 0x31, 0x16, 0xab, 0xd2, 0x98, 0xc7, 0x25, 0xf6, 0xb6, 0x0e, 0xaa, 0x9f, 0x55, 0xa3, 0xdc, 0x74, 0xd3, 0x74, 0xc4, 0xee, 0x10, 0xf7, 0xce, 0x55, 0x8b, 0xbe, 0x15, 0xeb, 0xc7, 0x4c, 0xe1, 0x67, 0xf4, 0x27, 0x6e, 0xa4, 0xcb, 0x2e, 0xf0, 0x9b, 0xba, 0x2d, 0xd3, 0x8f, 0x41, 0xaf, 0x47, 0x87, 0x9c, 0x13, 0xfc, 0x01, 0xa2, 0xe2, 0x2a, 0xe5, 0xed, 0x60, 0xd5, 0xb8, 0x3b, 0x61, 0x4f, 0x12, 0x14, 0x5e, 0xfe, 0x52, 0xad, 0xc8, 0x5f, 0x90, 0x0d, 0x9c, 0x4b, 0xd3, 0x6e, 0x38, 0x7a, 0x84, 0xe6, 0x6d, 0x45, 0x23, 0x46, 0xd5, 0xb0, 0x39, 0x43, 0x67, 0xa7, 0x8e, 0xd3, 0x48, 0x88, 0x9b, 0xda, 0xe4, 0xe2, 0x42, 0x06, 0x3e, 0x7d, 0xbd, 0xf7, 0x84, 0x9a, 0xd5, 0xa4, 0xe7, 0x7b, 0x54, 0xfa, 0xaa, 0x26, 0xbc, 0xc6, 0x78, 0x67, 0x39, 0xd4, 0xfa, 0x14, 0xd5, 0x58, 0xa9, 0x94, 0xeb, 0x8e, 0xe1, 0xa2, 0xde, 0x9e, 0x37, 0x4f, 0x0a, 0xc2, 0x0d, 0x46, 0xfb, 0xaa, 0x64, 0x54, 0xdd, 0x20, 0xf1, 0x28, 0x34, 0xe8, 0x72, 0x57, 0xce, 0xea, 0x42, 0xa3, 0xf5, 0x93, 0x2b, 0x7c, 0xe9, 0x78, 0x7c, 0xc7, 0x8d, 0x3c, 0x5c, 0xdf, 0x60, 0xb4, 0x5e, 0xd9, 0xaf, 0x4a, 0x56, 0x0d, 0x09, 0x9f, 0x6a, 0xd1, 0xf4, 0x75, 0x6c, 0x88, 0xde, 0xcb, 0x67, 0xdc, 0x56, 0x49, 0x77, 0x47, 0x7c, 0xdf, 0xde, 0xd8, 0xb6, 0xaa, 0x55, 0x34, 0xa5, 0x17, 0xa0, 0xdb, 0x58, 0x4a, 0x65, 0xac, 0xbf, 0xc1, 0x3e, 0xac, 0x62, 0x34, 0x0d, 0x03, 0x52, 0xc0, 0x90, 0x47, 0x60, 0x45, 0x35, 0xfd, 0x8e, 0x0d, 0x2f, 0x5d, 0xc3, 0xae, 0xc9, 0x56, 0xc3, 0x31, 0xfa, 0xd2, 0x5d, 0x73, 0x3a, 0x3b, 0xe7, 0xcc, 0x95, 0x3e, 0xe7, 0xef, 0xfe, 0xcf, 0x13, 0x11, 0xe5, 0x6d, 0x7c, 0x4e, 0x0c, 0xa7, 0x06, 0x48, 0x96, 0xdf, 0x1b, 0x11, 0x61, 0x4e, 0xa0, 0x4b, 0x95, 0x48, 0x28, 0x8d, 0x7d, 0xc1, 0x68, 0x09, 0x96, 0x11, 0xec, 0x6c, 0xe6, 0xf4, 0x08, 0x06, 0x8f, 0xd5, 0x10, 0x2b, 0xa4, 0x4c, 0xcb, 0xd9, 0x3b, 0xe5, 0x26, 0x9a, 0xc4, 0x23, 0x26, 0xac, 0x99, 0xc4, 0x20, 0x60, 0xd6, 0x47, 0x2c, 0xc0, 0x6a, 0xac, 0xd7, 0x74, 0x6e, 0x7b, 0x18, 0xe7, 0xb6, 0x07, 0x86, 0xa5, 0xa6, 0xf4, 0xc7, 0x08, 0x47, 0xf7, 0x4c, 0x13, 0x9a, 0xdd, 0x3b, 0x9e, 0x2d, 0xcf, 0xad, 0xb3, 0xeb, 0xd4, 0x1a, 0x39, 0x38, 0x97, 0x11, 0xcf, 0x3e, 0x6b, 0x2d, 0xfb, 0x81, 0x8c, 0x44, 0x84, 0xba, 0xa7, 0xe1, 0x1c, 0xe2, 0x9d, 0xf5, 0x42, 0x8d, 0x85, 0xc9, 0x67, 0x79, 0xf0, 0x37, 0x50, 0x67, 0x70, 0x1a, 0xbb, 0x29, 0x5b, 0x03, 0x45, 0xfd, 0xcc, 0x2e, 0x8b, 0x19, 0xeb, 0xb4, 0x90, 0x87, 0x6e, 0x01, 0x5f, 0x33, 0x60, 0x89, 0xf1, 0x43, 0x21, 0xb7, 0x50, 0xa6, 0xaf, 0x26, 0xfd, 0xf0, 0x23, 0x14, 0x8f, 0x65, 0x7f, 0x14, 0x9e, 0x53, 0xa6, 0x02, 0xdf, 0xa6, 0xac, 0x3c, 0x90, 0xb6, 0x50, 0x0f, 0x17, 0x63, 0xc7, 0x70, 0xe6, 0x64, 0xbc, 0xed, 0xa1, 0xdc, 0x94, 0xe3, 0x83, 0x2e, 0xf6, 0xf0, 0xfe, 0x13, 0x8b, 0xab, 0xa1, 0xea, 0x02, 0x93, 0x3f, 0x4f, 0x58, 0x46, 0x4e, 0xee, 0x56, 0xf4, 0x8d, 0x99, 0x5b, 0x12, 0xea, 0x99, 0x5b, 0x53, 0xa2, 0x42, 0x28, 0xd4, 0xaa, 0xcb, 0xf0, 0x96, 0x4e, 0x5c, 0x07, 0x32, 0x18, 0x67, 0xe7, 0xc8, 0xf3, 0x3c, 0x76, 0x39, 0x90, 0xd8, 0x87, 0x96, 0x09, 0xfe, 0xa2, 0xd8, 0xc4, 0x8a, 0x08, 0xd1, 0x9b, 0x01, 0xf2, 0x62, 0x39, 0x6c, 0x1a, 0xef, 0xc7, 0x67, 0x7c, 0x10, 0xc9, 0x75, 0x5e, 0x89, 0x42, 0x96, 0x8e, 0x7d, 0x1f, 0x1c, 0xeb, 0xde, 0xd2, 0xba, 0x26, 0x28, 0x3e, 0xde, 0xca, 0x4f, 0xd3, 0x40, 0x7a, 0xf5, 0xfa, 0xbb, 0x7a, 0xe1, 0xb3, 0x5d, 0x72, 0xad, 0x7c, 0xba, 0x6e, 0xbe, 0x76, 0x85, 0x28, 0x7a, 0xc3, 0x61, 0x8a, 0xb4, 0x32, 0xf4, 0x6f, 0x6b, 0x1e, 0x3d, 0xaa, 0xb5, 0x93, 0x28, 0x49, 0xf6, 0xb3, 0x60, 0x1b, 0x55, 0x58, 0x65, 0x6f, 0x71, 0xfb, 0xde, 0x1f, 0x4f, 0xd5, 0x30, 0xcd, 0x98, 0x43, 0x4f, 0x6d, 0x01, 0x6f, 0xd5, 0x03, 0x0a, 0x2d, 0x51, 0xae, 0xeb, 0x23, 0xe1, 0xe6, 0xcb, 0x2d, 0x03, 0x02, 0x34, 0x00, 0xa8, 0xfd, 0xc4, 0x0d, 0x8a, 0x79, 0x25, 0xa8, 0xc0, 0x04, 0x3f, 0x69, 0x8f, 0x9b, 0xab, 0xd2, 0x84, 0x6c, 0x6b, 0x33, 0xbf, 0xe0, 0xd9, 0xcb, 0x92, 0xd9, 0xde, 0x30, 0x4b, 0x39, 0x64, 0xf1, 0x4d, 0xa3, 0x0e, 0x79, 0x66, 0x85, 0x26, 0x36, 0x5c, 0x56, 0xd7, 0xfb, 0xc9, 0x1c, 0x9c, 0xa3, 0x29, 0x32, 0xf8, 0xf8, 0x32, 0x48, 0x68, 0xd3, 0x64, 0xab, 0x96, 0x84, 0xe0, 0xc7, 0xcf, 0x73, 0x7d, 0xea, 0xb7, 0x08, 0x19, 0x4a, 0x3b, 0xc9, 0x2d, 0x4a, 0xc8, 0xc2, 0xa4, 0xf9, 0xba, 0x2a, 0xee, 0xdb, 0x18, 0x43, 0x50, 0xed, 0x7e, 0x82, 0x7e, 0xe3, 0x5a, 0xf0, 0x6b, 0xb4, 0x5b, 0xd0, 0x60, 0x58, 0x27, 0x82, 0x4c, 0xd0, 0x4d, 0xa7, 0x5b, 0x68, 0x7a, 0x86, 0xc9, 0x39, 0xef, 0xaf, 0xf9, 0xf1, 0x32, 0xdd, 0xc1, 0xd7, 0x04, 0x21, 0x08, 0x09, 0x94, 0x3d, 0x94, 0x08, 0xf2, 0x4e, 0x1d, 0x77, 0xc6, 0xaf, 0xa6, 0x20, 0x42, 0x19, 0x0d, 0x38, 0x55, 0x0f, 0xe0, 0xe4, 0x22, 0x79, 0x72, 0xfc, 0xb0, 0x8f, 0x2e, 0x0e, 0xe3, 0xf8, 0x2c, 0xa6, 0xab, 0x33, 0x02, 0xcc, 0x7b, 0x37, 0xdd, 0xcf, 0xfd, 0x56, 0xd0, 0x41, 0x04, 0x67, 0x6b, 0x43, 0xc2, 0x24, 0x90, 0x03, 0x3b, 0xd1, 0x82, 0x82, 0xf9, 0x1f, 0x3f, 0x9b, 0x01, 0x4f, 0x10, 0x41, 0x07, 0x9a, 0x5e, 0x08, 0xde, 0xd1, 0xc7, 0xe6, 0x32, 0x41, 0x71, 0x3b, 0x79, 0xd9, 0x9e, 0x10, 0x27, 0x8f, 0x81, 0x9c, 0x21, 0xff, 0x51, 0x0d, 0x75, 0x55, 0x9b, 0x85, 0x48, 0x6e, 0xdc, 0x62, 0x10, 0x3a, 0x4f, 0xc2, 0x03, 0x65, 0x04, 0x46, 0xce, 0x36, 0x32, 0x17, 0x8b, 0xb7, 0xce, 0x27, 0xed, 0x16, 0x5c, 0xba, 0xbe, 0x4b, 0x06, 0x24, 0x8c, 0xfb, 0xeb, 0xd4, 0x9f, 0x9c, 0xb9, 0x91, 0x2e, 0xdb, 0x7e, 0x04, 0xd2, 0x3a, 0xbb, 0x77, 0x3a, 0xfe, 0xbb, 0xdc, 0x21, 0x48, 0x22, 0x11, 0x7d, 0x82, 0xc9, 0x62, 0xf9, 0xfc, 0xc9, 0x50, 0xa6, 0xd7, 0xd6, 0x90, 0xed, 0x23, 0xcf, 0x57, 0xc9, 0x44, 0x92, 0xd5, 0x33, 0x9a, 0x15, 0xff, 0xdd, 0x61, 0xb3, 0x92, 0x22, 0xd5, 0xc3, 0x55, 0x3d, 0x9a, 0x6f, 0x9e, 0xba, 0x5c, 0xc4, 0x17, 0x2b, 0xb3, 0x05, 0xc2, 0x1c, 0x49, 0x45, 0x3b, 0x49, 0x3e, 0x34, 0x3e, 0x0e, 0xcb, 0x3a, 0x68, 0x1e, 0x26, 0xc2, 0x42, 0x78, 0xa6, 0xd9, 0x7b, 0x97, 0x28, 0xf7, 0x75, 0xe9, 0xb1, 0x1c, 0x04, 0x83, 0x55, 0x1f, 0x72, 0x13, 0x57, 0x43, 0xc6, 0x16, 0x91, 0x0c, 0x45, 0x4b, 0x16, 0x51, 0x3a, 0x67, 0x17, 0x91, 0xf3, 0x0a, 0x03, 0x8b, 0x0c, 0xf2, 0xf2, 0x08, 0xf0, 0x6f, 0x44, 0xfc, 0x9c, 0x16, 0x85, 0xcd, 0xa6, 0xba, 0x94, 0xf3, 0x7e, 0x98, 0x05, 0xc1, 0xf5, 0xd2, 0xc3, 0x82, 0xfb, 0x1f, 0xfa, 0xc8, 0xad, 0xc0, 0x34, 0x01, 0x8f, 0xb6, 0xc2, 0x4b, 0x15, 0x32, 0x5d, 0x8a, 0x69, 0x4d, 0x0d, 0xb7, 0x68, 0xf9, 0x4a, 0x7b, 0xed, 0x37, 0x61, 0xfc, 0x53, 0x8b, 0x1a, 0xf7, 0x35, 0xad, 0x98, 0x0f, 0x78, 0x82, 0x80, 0x64, 0x8c, 0x4a, 0x5e, 0x68, 0xee, 0x1b, 0x44, 0xee, 0xf2, 0x8e, 0xb4, 0x84, 0xbf, 0xb8, 0xbf, 0x03, 0x9b, 0x5c, 0x6f, 0x64, 0x69, 0x5e, 0x63, 0xd5 ],
+const [ 0x5e, 0xdb, 0x47, 0xd0, 0x7e, 0x85, 0x6a, 0x3d, 0xee, 0x51, 0xf6, 0x0a, 0x72, 0x3f, 0xf8, 0xde, 0xa7, 0xcd, 0x06, 0xc7, 0xf2, 0x1c, 0xd3, 0x7f, 0xb6, 0x4e, 0x00, 0xee, 0xca, 0x32, 0x34, 0xef, 0x2a, 0x23, 0x6e, 0x57, 0xec, 0x2d, 0x9a, 0x34, 0x76, 0x72, 0x63, 0x52, 0xef, 0xcc, 0x49, 0x04, 0xf3, 0xb4, 0xf3, 0x20, 0x8b, 0x63, 0xc6, 0x4c, 0x5c, 0x36, 0xb6, 0x78, 0x1e, 0x57, 0x5c, 0xac, 0x50, 0x9a, 0x49, 0x04, 0x2a, 0xa5, 0x9b, 0xf9, 0xd4, 0x54, 0xce, 0xe1, 0xd5, 0x5c, 0xd4, 0xb9, 0xce, 0x2e, 0x67, 0x23, 0x68, 0x1e, 0x9e, 0xab, 0x8b, 0xc4, 0xbe, 0x4e, 0xd1, 0xa2, 0x53, 0x3d, 0x3a, 0x08, 0x80, 0xde, 0x21, 0x35, 0x94, 0x14, 0x6e, 0xbf, 0xdd, 0xc0, 0x0e, 0x35, 0xc1, 0x88, 0xa0, 0x02, 0x0a, 0xd7, 0x71, 0x94, 0x82, 0x24, 0xab, 0xbe, 0xc0, 0x78, 0xc9, 0x5b, 0x41, 0x2a, 0x4e, 0x35, 0xbb, 0xed, 0xb7, 0x25, 0xad, 0x0e, 0xae, 0x7b, 0x3b, 0xf6, 0x80, 0x9f, 0x39, 0xf6, 0xd1, 0xf9, 0x86, 0x44, 0x8f, 0x0f, 0x9b, 0x40, 0x24, 0xed, 0x63, 0xfc, 0xf0, 0xca, 0x4e, 0xfc, 0xf6, 0xe8, 0xa1, 0x3a, 0xd5, 0xbc, 0x10, 0x6d, 0xfb, 0x4f, 0x8e, 0x8b, 0x15, 0xe4, 0x64, 0x8d, 0xc9, 0xdb, 0x80, 0x72, 0xa8, 0xd5, 0x10, 0x86, 0x5e, 0x19, 0x50, 0xe4, 0x2c, 0x37, 0xa0, 0x3a, 0x99, 0xeb, 0xda, 0xcc, 0x64, 0x43, 0xe2, 0xbc, 0xbc, 0x04, 0x7f, 0x88, 0xb3, 0x4b, 0x69, 0xd4, 0xf1, 0x70, 0xa3, 0x6a, 0xa5, 0x2f, 0x0a, 0x7f, 0xc2, 0x0a, 0x2f, 0x38, 0x67, 0xe9, 0x62, 0x6c, 0x9e, 0x04, 0x0f, 0xac, 0x4a, 0x02, 0x4e, 0x80, 0x5b, 0x62, 0xb5, 0xf4, 0x44, 0x1b, 0x70, 0x53, 0xaf, 0x7f, 0x94, 0x33, 0x6f, 0x65, 0xb1, 0xb1, 0xb6, 0x87, 0xa7, 0xfe, 0x88, 0x29, 0xba, 0x1b, 0x6f, 0xfc, 0xe8, 0xe0, 0x71, 0x41, 0x79, 0x43, 0x3f, 0x31, 0xd9, 0xd7, 0xaf, 0x9d, 0xa3, 0x93, 0x6c, 0xd2, 0xfe, 0xd5, 0xec, 0xbf, 0x2c, 0xa6, 0xa3, 0x5a, 0x60, 0x40, 0x77, 0x3f, 0xd0, 0xce, 0x73, 0x9a, 0x0c, 0x72, 0xbf, 0x48, 0x8e, 0x8c, 0xd0, 0x39, 0x92, 0x3a, 0xdc, 0x19, 0x28, 0x1b, 0x91, 0x2f, 0x87, 0x59, 0x06, 0x85, 0xa4, 0xe6, 0xf2, 0x49, 0x03, 0x05, 0x1c, 0x73, 0xcd, 0x0d, 0x12, 0xa8, 0x24, 0x69, 0x1e, 0x5e, 0xb3, 0xe4, 0x76, 0x42, 0x89, 0x24, 0xb3, 0xd6, 0x27, 0x73, 0x84, 0x5f, 0xd7, 0xc6, 0xa4, 0xfe, 0x40, 0xf7, 0x09, 0x1d, 0x38, 0x56, 0x5f, 0x0c, 0xd9, 0x60, 0xb4, 0xec, 0xd7, 0xce, 0x75, 0xcd, 0x10, 0xd2, 0x99, 0x13, 0x65, 0x9d, 0x1c, 0x1e, 0xc9, 0x24, 0xaf, 0x2a, 0x97, 0x24, 0xae, 0x73, 0x29, 0x63, 0x52, 0x9d, 0xa6, 0x3a, 0x28, 0x54, 0x1b, 0x50, 0xc1, 0x30, 0xce, 0xa8, 0xab, 0xdb, 0xcf, 0xde, 0xa1, 0x75, 0xcf, 0xad, 0xff, 0x37, 0x35, 0xb5, 0x79, 0x57, 0x6f, 0x7b, 0x0b, 0x2c, 0x86, 0xb2, 0x33, 0x93, 0xf6, 0xb9, 0x5f, 0x91, 0xbc, 0x64, 0xa1, 0x3a, 0xb0, 0xff, 0xaa, 0xd1, 0x15, 0x90, 0xf6, 0x30, 0x6f, 0x5d, 0x44, 0x6a, 0x94, 0xae, 0x49, 0xb0, 0x06, 0xd4, 0xa5, 0x71, 0x80, 0x6a, 0x16, 0xc5, 0xcf, 0xdb, 0xec, 0x0c, 0xe3, 0x25, 0xbd, 0xd2, 0x26, 0xdc, 0x59, 0xf7, 0x0d, 0x71, 0x00, 0x0c, 0xec, 0xb4, 0xd3, 0xff, 0x0e, 0x98, 0x89, 0xfb, 0x05, 0x36, 0x63, 0x8a, 0x3f, 0x15, 0x62, 0xfd, 0xda, 0xa9, 0xb7, 0x0d, 0xb9, 0x19, 0x7b, 0xc2, 0xd8, 0x46, 0xa0, 0x94, 0xdc, 0x08, 0x28, 0xd1, 0xef, 0xba, 0x94, 0x3e, 0xca, 0xfa, 0xa0, 0x01, 0x13, 0xaa, 0x2d, 0xbe, 0xea, 0x3a, 0x7f, 0x01, 0xbf, 0x2a, 0xa8, 0xdc, 0x66, 0xca, 0x44, 0xd1, 0x6d, 0x45, 0x67, 0xf1, 0xad, 0xdd, 0xd4, 0x46, 0x1f, 0x78, 0x70, 0x6f, 0xf1, 0x5c, 0xf6, 0x8a, 0xd9, 0x37, 0xeb, 0x57, 0xaa, 0x62, 0xd5, 0x99, 0x25, 0x66, 0xa8, 0xc0, 0x11, 0xc0, 0x81, 0xc6, 0x8e, 0xe1, 0x96, 0x57, 0xa6, 0x79, 0x6d, 0x34, 0x25, 0xf5, 0x4d, 0xd9, 0xaa, 0x46, 0xf3, 0x5e, 0xff, 0xe5, 0x85, 0x9b, 0xa6, 0x14, 0xcc, 0x8f, 0xb4, 0x66, 0x9d, 0x03, 0xe3, 0x81, 0x98, 0x6a, 0xe2, 0x23, 0x16, 0x0c, 0xef, 0x63, 0x5c, 0x63, 0xa8, 0x3a, 0x15, 0xc5, 0x1e, 0x41, 0xff, 0x44, 0x2c, 0xbc, 0xe4, 0xd3, 0x07, 0xd8, 0xcc, 0xaa, 0x15, 0x31, 0x71, 0xeb, 0x03, 0x97, 0xf3, 0x85, 0x12, 0x12, 0xcd, 0x58, 0xb1, 0x23, 0x08, 0x9b, 0x51, 0x4d, 0xae, 0x7b, 0x75, 0xd4, 0x82, 0x05, 0x08, 0xc5, 0xee, 0x46, 0xf4, 0x36, 0x3d, 0xb1, 0xf0, 0xcf, 0x0a, 0xc1, 0x99, 0x8a, 0xf8, 0xdf, 0xc5, 0xb6, 0xa4, 0x85, 0x14, 0x42, 0xd8, 0xa4, 0xc8, 0x38, 0x02, 0x43, 0xd6, 0x88, 0xe4, 0x69, 0x3c, 0x07, 0x8c, 0x3e, 0x96, 0xb7, 0x87, 0x6d, 0xec, 0x49, 0x52, 0xcc, 0xcf, 0xe0, 0x11, 0x3f, 0xa4, 0x18, 0x83, 0xda, 0x3f, 0x47, 0x36, 0x45, 0xb4, 0x03, 0xf7, 0x65, 0x69, 0xe4, 0x8d, 0x38, 0x70, 0x8a, 0xa7, 0x01, 0x14, 0xe2, 0x12, 0xa6, 0xb2, 0xa6, 0x2f, 0x56, 0xcb, 0x23, 0xa5, 0x6e, 0x56, 0x3f, 0x53, 0x9e, 0x5b, 0xba, 0x89, 0x48, 0xbd, 0xb4, 0x77, 0x28, 0x58, 0x70, 0xe5, 0x3a, 0x4b, 0x57, 0x25, 0xd8, 0x97, 0x40, 0x46, 0x23, 0xea, 0xee, 0x8b, 0xa5, 0xb5, 0xda, 0x1b, 0x35, 0x84, 0x33, 0xfa, 0x1a, 0x8f, 0x24, 0x38, 0x73, 0x8c, 0x55, 0x69, 0xd6, 0xc8, 0xb4, 0x55, 0x37, 0x76, 0x75, 0xf0, 0x0b, 0x47, 0x57, 0x8c, 0xae, 0x3b, 0x2a, 0x4d, 0x02, 0xb6, 0x8e, 0xdd, 0x5a, 0xd6, 0xfd, 0x62, 0x96, 0x04, 0x0c, 0xad, 0x8f, 0xc9, 0xed, 0xb4, 0xb5, 0xe3, 0x39, 0x43, 0xf6, 0x99, 0xec, 0xee, 0xe2, 0x4b, 0xb2, 0x4a, 0x0d, 0x4d, 0x61, 0x5d, 0xb5, 0xf6, 0xc6, 0x52, 0xa5, 0xf3, 0xa4, 0x71, 0x59, 0xe1, 0xfa, 0x4f, 0x63, 0x1c, 0x85, 0x42, 0x0e, 0xd1, 0x86, 0x18, 0x40, 0x5b, 0xc5, 0x09, 0xa5, 0xcc, 0xd6, 0xe9, 0x09, 0xc9, 0x9b, 0xa3, 0x06, 0x9c, 0x0a, 0xe2, 0xe0, 0x84, 0x30, 0x11, 0xad, 0x4f, 0x76, 0x86, 0xb9, 0x2b, 0x24, 0xfa, 0x28, 0xba, 0x23, 0x3d, 0xdd, 0x64, 0x07, 0x27, 0x9b, 0xf1, 0x4d, 0xd2, 0x6a, 0x57, 0xe0, 0x06, 0x3d, 0xd0, 0xe2, 0xf5, 0xd1, 0x30, 0xaa, 0x29, 0xd8, 0x76, 0x09, 0xba, 0x57, 0xa1, 0xd2, 0xc4, 0x4d, 0xc5, 0x99, 0x18, 0x95, 0x5d, 0xba, 0x32, 0x0d, 0xe3, 0x9e, 0x6c, 0xf8, 0x9e, 0x39, 0x71, 0xa1, 0xbc, 0xd7, 0xf3, 0x42, 0xa0, 0x19, 0xa1, 0x23, 0x7d, 0x3a, 0x53, 0x06, 0x24, 0x97, 0x88, 0xc3, 0x1a, 0x6f, 0x13, 0x30, 0xee, 0xe7, 0x11, 0x43, 0xc9, 0x51, 0x1e, 0x7b, 0x47, 0xad, 0xc9, 0x7b, 0x85, 0x70, 0x45, 0xf9, 0x7c, 0x85, 0x61, 0xd6, 0x8d, 0x92, 0xb9, 0x8e, 0x5c, 0x7c, 0x2e, 0xd3, 0xe2, 0x2d, 0x95, 0x75, 0xbe, 0x95, 0xac, 0x85, 0xcc, 0xee, 0x52, 0xba, 0xf9, 0x45, 0xf7, 0x13, 0x56, 0x36, 0x51, 0xbe, 0x6b, 0xf7, 0x50, 0x39, 0xcd, 0x98, 0x55, 0xb7, 0xf3, 0x88, 0x9f, 0xc5, 0x45, 0x5c, 0x05, 0x2d, 0x76, 0xcc, 0xeb, 0x1b, 0x14, 0xfe, 0x6f, 0x7e, 0x5d, 0x08, 0xe3, 0xb1, 0x55, 0xb0, 0x80, 0x5b, 0x15, 0x75, 0x58, 0x94, 0x66, 0xd4, 0x8d, 0x49, 0x8e, 0xc4, 0xc1, 0xe1, 0x6a, 0x83, 0xcd, 0x20, 0xbd, 0x94, 0xb6, 0x4c, 0xc8, 0x09, 0xdd, 0x8f, 0x1b, 0xfe, 0x75, 0x9d, 0xaa, 0x66, 0x3a, 0x96, 0x23, 0x0a, 0x60, 0x2e, 0x7f, 0xce, 0xca, 0x0b, 0xd8, 0x36, 0x7d, 0x6f, 0x7a, 0x2a, 0x54, 0x16, 0x3c, 0xf6, 0xf5, 0x62, 0x11, 0x95, 0x03, 0xb5, 0xda, 0x2f, 0x96, 0x1e, 0x7e, 0xe0, 0xe8, 0x39, 0x3d, 0xbb, 0x51, 0x50, 0x41, 0x0f, 0x75, 0xc6, 0x76, 0xe8, 0xbc, 0xb6, 0x9c, 0xd9, 0x02, 0xd7, 0x9b, 0xf9, 0x90, 0xa3, 0x16, 0x2c, 0x4b, 0xb8, 0x42, 0xa4, 0x2c, 0x7e, 0xf9, 0xa7, 0xf0, 0x0a, 0x0a, 0x92, 0x11, 0x42, 0xd4, 0x1e, 0xf4, 0x42, 0x13, 0xe2, 0x64, 0xff, 0xf9, 0x19, 0x3f, 0x2a, 0x81, 0xa6, 0x6f, 0x58, 0x00, 0x55, 0x1c, 0x5f, 0xfc, 0x64, 0x20, 0x03, 0x42, 0x42, 0xbc, 0xd2, 0x33, 0x96, 0x89, 0x4c, 0x5f, 0x83, 0xb1, 0x47, 0x55, 0x2a, 0x5e, 0x92, 0xb8, 0x71, 0x73, 0xd9, 0x96, 0x03, 0x7b, 0xc8, 0xf6, 0x99, 0xde, 0x73, 0xb0, 0x77, 0x5b, 0xf6, 0x82, 0x39, 0xb2, 0x58, 0x5f, 0xcf, 0xa1, 0xb6, 0x0a, 0xc7, 0x12, 0x9d, 0xe4, 0xca, 0x93, 0xb7, 0x03, 0x6a, 0x06, 0xaa, 0x83, 0x1b, 0x9a, 0x3d, 0x21, 0x7e, 0xfa, 0xbd, 0x05, 0xe6, 0xc4, 0x9f, 0xe0, 0x15, 0x3c, 0x66, 0x37, 0x46, 0x42, 0xc7, 0xff, 0x71, 0x81, 0x0b, 0x69, 0xca, 0xea, 0xb6, 0xff, 0x8a, 0x61, 0x66, 0xf0, 0xf3, 0xb5, 0xfd, 0xa8, 0x8e, 0xd6, 0x02, 0xa4, 0xb8, 0x42, 0x45, 0x85, 0x5c, 0xc1, 0xc2, 0x63, 0x02, 0x52, 0xc8, 0x63, 0x09, 0x65, 0x5b, 0x8c, 0x30, 0x4a, 0xd6, 0xd6, 0x5c, 0xea, 0xd5, 0x84, 0x95, 0xb5, 0x51, 0xb4, 0x51, 0xdb, 0x0d, 0x35, 0xf5, 0xbf, 0x31, 0x98, 0x99, 0xa9, 0x35, 0x8a, 0x0b, 0xba, 0x01, 0x61, 0x17, 0x26, 0x53, 0xf4, 0x06, 0x9d, 0x60, 0xb0, 0x65, 0x0a, 0xbe, 0xe8, 0x08, 0x80, 0x81, 0x6d, 0x4e, 0x71, 0xa5, 0x5f, 0xa5, 0x22, 0xac, 0x42, 0x51, 0x5b, 0x87, 0x54, 0x6a, 0x63, 0xba, 0x1e, 0x24, 0x2c, 0xbc, 0x4a, 0x54, 0xca, 0x9c, 0xb4, 0x2f, 0x29, 0xea, 0xc4, 0x54, 0x00, 0xd5, 0xfa, 0x0d, 0x01, 0x91, 0xca, 0xd1, 0x53, 0xfc, 0xab, 0x0e, 0x41, 0x80, 0x6b, 0x26, 0x34, 0x3b, 0xc5, 0xb7, 0xde, 0x5d, 0x35, 0x20, 0xb9, 0xd2, 0x0b, 0x41, 0xb0, 0x22, 0xbf, 0x82, 0x1b, 0x95, 0x84, 0x16, 0xf1, 0x9a, 0x1f, 0x81, 0x39, 0x69, 0xfa, 0x57, 0xc2, 0xe8, 0x74, 0x47, 0x14, 0xcb, 0x7c, 0x59, 0xa6, 0x00, 0x5e, 0x74, 0x52, 0x4a, 0xdc, 0x23, 0x05, 0x2c, 0x81, 0x98, 0xbb, 0x08, 0x32, 0xf2, 0xab, 0x88, 0x06, 0xbb, 0xbe, 0x3d, 0x58, 0xb5, 0x46, 0x86, 0x1a, 0xd6, 0xed, 0xb4, 0x6b, 0x91, 0xeb, 0x6b, 0x6c, 0x57, 0x7d, 0x4b, 0x50, 0x5e, 0x92, 0xd0, 0xb3, 0xa1, 0xc7, 0x77, 0x2d, 0x28, 0x95, 0x23, 0x26, 0x89, 0xc9, 0xbe, 0xec, 0xaf, 0x35, 0x23, 0x02, 0xda, 0xa6, 0x3c, 0xbc, 0xe7, 0x16, 0x67, 0x08, 0xd2, 0x22, 0x1f, 0x8f, 0x79, 0xbe, 0xd8, 0xfd, 0xa2, 0x27, 0x2a, 0x9c, 0x40, 0x19, 0x32, 0x28, 0xf2, 0x43, 0x36, 0xdf, 0xcd, 0xf8, 0x87, 0xd7, 0x5b, 0x27, 0xac, 0x94, 0xe3, 0x8d, 0xbc, 0xda, 0xeb, 0x29, 0x0c, 0xc0, 0xfc, 0xf0, 0x0a, 0x06, 0xa5, 0xc3, 0x69, 0xa8, 0xc2, 0x9e, 0x7f, 0xb3, 0xff, 0x12, 0xeb, 0x58, 0x97, 0xf5, 0x7a, 0x3f, 0x62, 0x58, 0x4c, 0x1e, 0x0e, 0xb9, 0x32, 0x89, 0xac, 0x7a, 0x5b, 0x0c, 0x6f, 0x92, 0x30, 0x77, 0xb1, 0x83, 0x7c, 0x79, 0x37, 0x8c, 0xd0, 0x70, 0xb6, 0x1f, 0x26, 0x80, 0x96, 0x95, 0xc4, 0xe2, 0xf5, 0x21, 0x63, 0x7f, 0xef, 0x02, 0x91, 0xbe, 0x1d, 0xfd, 0x54, 0x9a, 0x5b, 0x0b, 0x10, 0xf7, 0xcf, 0x4f, 0xaa, 0x36, 0x27, 0x4a, 0xee, 0x07, 0x21, 0x52, 0x2e, 0x7e, 0x51, 0x40, 0x2c, 0x6a, 0x1f, 0x6a, 0x3b, 0xe2, 0x0f, 0xd1, 0xa0, 0x20, 0x45, 0x9b, 0x3e, 0x93, 0x48, 0xc3, 0x73, 0x2f, 0x06, 0x0f, 0x3d, 0x08, 0x18, 0x42, 0xa1, 0x1f, 0x48, 0x93, 0x4d, 0x7b, 0x50, 0x5f, 0x7c, 0x7c, 0xe5, 0x1b, 0x1a, 0x6d, 0xf4, 0x8c, 0x28, 0x58, 0x2c, 0x3a, 0x63, 0x1e, 0xbc, 0x22, 0x20, 0xc6, 0x5e, 0xab, 0x7b, 0x16, 0x94, 0xdb, 0xb0, 0x60, 0x31, 0xcb, 0xc9, 0x9f, 0x1c, 0x58, 0x7a, 0xc3, 0x51, 0x1c, 0x49, 0x48, 0x28, 0x9d, 0xf1, 0x0d, 0xda, 0xc3, 0x09, 0x64, 0x41, 0x90, 0xe1, 0x65, 0xdf, 0x0b, 0xad, 0x89, 0x22, 0x7d, 0xe5, 0x74, 0xe6, 0xe0, 0xeb, 0x11, 0x3c, 0x95, 0xef, 0xe4, 0x6a, 0x55, 0x10, 0x9c, 0x33, 0x6a, 0xc3, 0xe8, 0x58, 0x1f, 0x79, 0x8c, 0x5e, 0x75, 0x7c, 0xb4, 0x92, 0x17, 0x1a, 0x88, 0x4b, 0x90, 0x06, 0x00, 0x6f, 0xbc, 0xfb, 0xfa, 0x38, 0x7c, 0xa2, 0x8a, 0x38, 0xae, 0xb6, 0x91, 0x9b, 0x5d, 0x66, 0x91, 0xad, 0x34, 0xfb, 0xbf, 0x9c, 0x39, 0xba, 0x5a, 0x7e, 0xb8, 0x0c, 0x3c, 0x95, 0x7c, 0xdc, 0xaf, 0xd2, 0x45, 0x41, 0x81, 0x99, 0x77, 0x5d, 0x5b, 0xc4, 0x10, 0x85, 0x4e, 0xea, 0xdc, 0xa1, 0xaf, 0xe1, 0xec, 0xd6, 0x25, 0x81, 0x44, 0x63, 0x00, 0xab, 0xd4, 0xc9, 0xcc, 0x8a, 0xaa, 0x2f, 0x26, 0x19, 0x65, 0x04, 0xcf, 0xe6, 0xed, 0xe6, 0xff, 0x15, 0x61, 0xc3, 0xfc, 0xa7, 0x51, 0x3e, 0xea, 0xfd, 0x2e, 0x54, 0xe5, 0x97, 0xfe, 0x3f, 0x4d, 0x22, 0x54, 0x9a, 0x61, 0xb2, 0x80, 0xc7, 0x10, 0x4c, 0x03, 0x8e, 0x0b, 0xa7, 0x46, 0x06, 0x1f, 0x33, 0x8b, 0xb9, 0xc2, 0x5b, 0x23, 0x03, 0xec, 0x07, 0xe1, 0xbb, 0x28, 0x66, 0xd0, 0x15, 0xea, 0xea, 0x21, 0xc7, 0x23, 0x94, 0x67, 0x6b, 0x13, 0x71, 0x07, 0x25, 0x5e, 0x65, 0xe9, 0x85, 0x63, 0x27, 0x74, 0xaf, 0xc9, 0x8d, 0xba, 0xb9, 0x5a, 0x0a, 0xef, 0x54, 0x15, 0x75, 0x20, 0xaf, 0x7e, 0x0b, 0x21, 0x98, 0x39, 0xb8, 0xc8, 0xe5, 0xd7, 0x92, 0x58, 0x12, 0xf0, 0xa6, 0x40, 0x2b, 0x72, 0xf8, 0x06, 0xec, 0x38, 0xc5, 0x7e, 0x28, 0xdf, 0x0b, 0x3f, 0x67, 0xd5, 0x4c, 0x57, 0xd3, 0xb2, 0x8e, 0x3e, 0x55, 0xcc, 0xa6, 0x09, 0xfb, 0x05, 0xb6, 0xe0, 0x9d, 0xe8, 0xf5, 0xb2, 0xc0, 0xf5, 0xae, 0x27, 0xba, 0x38, 0x8c, 0xd7, 0x17, 0x21, 0x14, 0xb9, 0x3c, 0x8f, 0x73, 0xde, 0x4a, 0x2e, 0x7a, 0x5f, 0x45, 0x03, 0xe7, 0x94, 0x76, 0x45, 0xe6, 0x86, 0x0d, 0x6f, 0xd7, 0xa7, 0x0b, 0x93, 0x52, 0xc1, 0x5f, 0xf1, 0x68, 0x2d, 0x4f, 0xc8, 0x2c, 0x45, 0x1a, 0x6c, 0x73, 0x1b, 0xdc, 0x99, 0xd7, 0x6c, 0xb1, 0x07, 0x02, 0xcf, 0x1d, 0x3e, 0x29, 0x32, 0xac, 0xac, 0xd6, 0x87, 0xd5, 0xf5, 0xeb, 0xbb, 0x24, 0x8a, 0xe4, 0xe8, 0x99, 0x7d, 0x5c, 0xcb, 0x4b, 0x94, 0xd2, 0x78, 0x50, 0x9c, 0xae, 0x4c, 0xe1, 0xff, 0x7f, 0x24, 0xba, 0x99, 0x87, 0xcc, 0xc0, 0xc8, 0x79, 0xbb, 0xe6, 0xc2, 0x81, 0xfd, 0x51, 0x2c, 0x85, 0x70, 0xbb, 0xe8, 0xab, 0x33, 0x15, 0x2e, 0x1b, 0x5c, 0x70, 0xde, 0x06, 0xe9, 0x1d, 0x14, 0xe7, 0xfa, 0x13, 0xfd, 0x08, 0x3d, 0x92, 0xea, 0x48, 0xa9, 0x06, 0xa3, 0x1d, 0x6f, 0x2e, 0xfe, 0xd5, 0x2d, 0x7d, 0xb0, 0x21, 0x65, 0xc1, 0x62, 0xd3, 0x2f, 0x02, 0x08, 0xe7, 0x2a, 0xad, 0x6e, 0xc0, 0xb8, 0xf2, 0x13, 0xb5, 0x6b, 0x6a, 0x3b, 0xcc, 0xba, 0xfd, 0x40, 0xc5, 0xf9, 0x03, 0x29, 0x5b, 0x88, 0xa9, 0x7d, 0xc6, 0x4a, 0x96, 0x5a, 0x84, 0x58, 0xcf, 0xc1, 0x59, 0xf7, 0xd8, 0x34, 0x95, 0xc8, 0x1d, 0x83, 0x95, 0x3f, 0x90, 0xe3, 0x8c, 0x56, 0x92, 0x40, 0x84, 0x83, 0x17, 0xd4, 0x9f, 0xe7, 0x05, 0xf9, 0xa3, 0xc8, 0xde, 0x3b, 0xb5, 0x41, 0x9f, 0xb2, 0x65, 0x38, 0xe8, 0x8f, 0xeb, 0x91, 0x5c, 0xf4, 0xb0, 0xa1, 0x4b, 0x09, 0x11, 0xe6, 0x8f, 0x4c, 0x5f, 0xf5, 0xb3, 0x28, 0x2a, 0xb3, 0x5b, 0xca, 0xbf, 0xc8, 0xdf, 0x30, 0xef, 0x51, 0x3a, 0x82, 0x12, 0xd5, 0x23, 0xa6, 0x4c, 0x7b, 0x79, 0x0f, 0x0f, 0x7a, 0xe4, 0xd5, 0xe1, 0xd0, 0xba, 0x0b, 0x60, 0x37, 0x1f, 0x4d, 0x83, 0x55, 0x71, 0x98, 0x22, 0x33, 0xe3, 0x5e, 0xb9, 0xf0, 0x67, 0xda, 0x69, 0xb7, 0xd2, 0xa2, 0x3f, 0xee, 0x3a, 0x7b, 0xb9, 0xb0, 0xa3, 0x70, 0x86, 0x7e, 0xdb, 0x26, 0x8e, 0x31, 0xa3, 0x6a, 0x32, 0x33, 0x0f, 0x0c, 0xd5, 0xef, 0x30, 0xf0, 0x9b, 0x86, 0xf0, 0x62, 0x70, 0xc4, 0x3c, 0xaa, 0x4d, 0x52, 0x69, 0xe0, 0xb6, 0x2d, 0xd0, 0x02, 0x88, 0x56, 0xbc, 0x44, 0xf1, 0xcc, 0x87, 0xa7, 0xc0, 0xb7, 0xff, 0xcd, 0xdf, 0xe6, 0x0e, 0x0c, 0x1d, 0x7b, 0x9b, 0xc1, 0x31, 0xe5, 0xab, 0xe7, 0xfc, 0x0f, 0xcc, 0xe8, 0x0f, 0xd7, 0xb3, 0xb2, 0x6d, 0xc2, 0x24, 0x0e, 0x92, 0xee, 0x12, 0x2d, 0xb4, 0x48, 0x08, 0x84, 0x48, 0xfe, 0xc7, 0xdb, 0xc8, 0x38, 0x31, 0xa0, 0xb4, 0x03, 0x65, 0x80, 0xd7, 0x8d, 0x2c, 0x39, 0xcb, 0x98, 0x94, 0xa9, 0xbf, 0x29, 0xda, 0x2b, 0x78, 0x80, 0x8d, 0x24, 0x96, 0x4d, 0xf1, 0xd9, 0x19, 0x21, 0xa2, 0x84, 0x23, 0x23, 0x79, 0xa6, 0xff, 0x04, 0xb3, 0x9e, 0x63, 0x35, 0x50, 0x7b, 0xf2, 0x57, 0xba, 0x0f, 0x05, 0xf3, 0xa7, 0x44, 0xab, 0x6b, 0x40, 0xb4, 0xef, 0x30, 0x83, 0x73, 0x59, 0x36, 0xe6, 0x2f, 0xb7, 0xa5, 0x3d, 0x7c, 0x1c, 0xd2, 0xdd, 0x69, 0x2a, 0x6d, 0x02, 0x57, 0x8d, 0xfc, 0x6e, 0x0b, 0xc8, 0x87, 0x53, 0x01, 0x34, 0x95, 0x73, 0x03, 0x45, 0x58, 0x86, 0xfb, 0x10, 0x25, 0xdc, 0x06, 0x0a, 0x27, 0x43, 0xc9, 0x13, 0x53, 0x2b, 0x08, 0xb3, 0x9e, 0x08, 0x74, 0xa3, 0x6e, 0xf8, 0xc5, 0x8f, 0x4f, 0xa6, 0x09, 0x1a, 0xe8, 0x6e, 0x3c, 0x23, 0x2d, 0xc2, 0x18, 0x46, 0xd6, 0xcc, 0x2e, 0xa6, 0x0f, 0x54, 0x36, 0xea, 0x71, 0xe5, 0xa4, 0x86, 0x31, 0x2b, 0x7c, 0x3c, 0x97, 0xa0, 0x66, 0xe2, 0xb2, 0x68, 0x05, 0x65, 0x4b, 0x78, 0x85, 0x0e, 0x17, 0xfe, 0x73, 0x04, 0x30, 0xfd, 0xd2, 0x13, 0xc6, 0x38, 0x6b, 0xab, 0x12, 0x52, 0x64, 0x2c, 0x8c, 0x33, 0x14, 0x60, 0x5e, 0xae, 0x16, 0x49, 0x18, 0x60, 0x9c, 0x1e, 0xa5, 0xdb, 0x06, 0x90, 0x7e, 0x04, 0xb4, 0x51, 0x1d, 0xb9, 0x18, 0xd7, 0xb5, 0xb7, 0x0f, 0x5e, 0x20, 0xbb, 0x71, 0x2c, 0x19, 0xe8, 0xe6, 0x18, 0xab, 0x69, 0xfc, 0x4d, 0xe9, 0x57, 0x77, 0x4c, 0xe0, 0xdd, 0xe9, 0x30, 0xca, 0x9a, 0x82, 0x36, 0x85, 0x46, 0x28, 0x7c, 0x43, 0x99, 0xca, 0x09, 0x82, 0x68, 0xf2, 0x0e, 0x3f, 0x12, 0x9a, 0x6b, 0x66, 0x1a, 0x41, 0x75, 0x8e, 0x15, 0x3e, 0xf7, 0xe3, 0xc7, 0x53, 0x77, 0x63, 0x89, 0x85, 0xba, 0x4e, 0xed, 0x2b, 0x8a, 0xd7, 0xa5, 0x46, 0xb6, 0x20, 0xa1, 0x10, 0x5b, 0x65, 0x78, 0xd8, 0x62, 0x78, 0x09, 0x0c, 0x4a, 0x6d, 0x62, 0x98, 0x27, 0x96, 0xe1, 0x6e, 0xeb, 0xb2, 0x98, 0x66, 0xe5, 0x61, 0xf6, 0x49, 0x87, 0xdb, 0xa4, 0x28, 0x6c, 0xe2, 0xae, 0xf3, 0x9a, 0xf5, 0xe3, 0x47, 0x04, 0xc7, 0x7e, 0x86, 0x53, 0xef, 0x06, 0x2d, 0xe5, 0xe1, 0x72, 0x62, 0x16, 0x1d, 0x91, 0xcd, 0xbf, 0xa6, 0xa9, 0xa9, 0xfd, 0xb6, 0x5f, 0x1b, 0x34, 0xb0, 0xd6, 0xc2, 0x53, 0x56, 0x1b, 0x8f, 0x59, 0x3c, 0xc1, 0xd7, 0x18, 0x7c, 0xc8, 0xa6, 0x38, 0xac, 0xc4, 0x57, 0x80, 0x0d, 0x3a, 0x61, 0x51, 0x05, 0x4e, 0x74, 0x73, 0xd0, 0x9b, 0xc5, 0x15, 0x72, 0x63, 0xa6, 0x0e, 0xf0, 0xe8, 0x59, 0x69, 0xbf, 0x19, 0x26, 0x21, 0x7d, 0x71, 0xab, 0x29, 0xdf, 0x1d, 0x74, 0xaf, 0xeb, 0x5d, 0xcb, 0xa2, 0x67, 0x2c, 0xd1, 0x72, 0x91, 0x23, 0xce, 0x17, 0x10, 0x9b, 0xc6, 0x54, 0x2b, 0x12, 0x4d, 0x3d, 0x39, 0xd0, 0x9b, 0xf7, 0x58, 0xc9, 0xe3, 0xbf, 0x62, 0xc6, 0xe1, 0x2d, 0x1d, 0xc0, 0xb3, 0xba, 0xb2, 0x8c, 0xe9, 0x81, 0x61, 0xbe, 0xdf, 0x42, 0x72, 0xc7, 0x4b, 0xac, 0x6f, 0x60, 0x12, 0xdc, 0x90, 0x2c, 0x60, 0x21, 0x77, 0x98, 0xf7, 0x02, 0x1d, 0x07, 0xc7, 0x82, 0x0d, 0x2c, 0xbf, 0xa2, 0xd0, 0xb6, 0xe4, 0x28, 0xa8, 0x33, 0xa0, 0x9f, 0x81, 0x2e, 0x5c, 0x9f, 0x24, 0x9b, 0x51, 0x4e, 0xae, 0x76, 0x9a, 0x27, 0x40, 0xa6, 0x8e, 0xfa, 0xf9, 0x27, 0x4e, 0x34, 0x21, 0x68, 0x9a, 0x61, 0xa7, 0xf2, 0xe9, 0xef, 0xce, 0x4b, 0xb8, 0x35, 0x23, 0x1a, 0x22, 0xb4, 0xb2, 0x8b, 0xb1, 0x9c, 0x79, 0xf5, 0x74, 0x92, 0x1d, 0xbb, 0x51, 0xb0, 0xdc, 0x70, 0x9d, 0xcd, 0xc3, 0x3e, 0xea, 0xff, 0x21, 0x88, 0x20, 0x5f, 0x3b, 0xce, 0xd0, 0x0c, 0x41, 0xd1, 0xc4, 0x73, 0x81, 0xf8, 0xdb, 0xcd, 0xdb, 0xf3, 0x14, 0xe8, 0x75, 0x9e, 0xe8, 0x2b, 0xb0, 0x28, 0xdd, 0xd5, 0x5a, 0x74, 0x58, 0x85, 0x25, 0xbf, 0xb2, 0xff, 0x57, 0x84, 0x8f, 0x2d, 0xc4, 0x9c, 0x6b, 0x64, 0xf9, 0xaa, 0x76, 0xe9, 0xbb, 0xb6, 0xa2, 0xb4, 0xb0, 0x18, 0xfa, 0x73, 0x5b, 0x98, 0x35, 0xd2, 0x4e, 0xd3, 0x8b, 0xfa, 0x9a, 0xe1, 0xc7, 0x57, 0x8b, 0x34, 0x9e, 0x9f, 0x92, 0xc3, 0x3f, 0x10, 0x83, 0x68, 0x2b, 0xf9, 0x00, 0x87, 0x47, 0x7b, 0x35, 0xf1, 0x2f, 0x91, 0xc7, 0x08, 0xce, 0x4e, 0x06, 0x23, 0x2c, 0x66, 0x6a, 0x34, 0x86, 0xf0, 0x3d, 0xa8, 0xa4, 0x6a, 0x95, 0x8e, 0x67, 0xfe, 0x85, 0xfc, 0xa2, 0x03, 0x94, 0xae, 0x2a, 0xc7, 0x6e, 0xf1, 0x31, 0x8c, 0xda, 0xbf, 0xcf, 0xd0, 0xec, 0x2c, 0xe2, 0xd2, 0x7c, 0x01, 0x18, 0x51, 0xd7, 0xa6, 0x4a, 0x97, 0xb3, 0x45, 0x0c, 0xb6, 0x69, 0x2c, 0x82, 0x12, 0x5e, 0x73, 0x75, 0x1f, 0xc2, 0xdf, 0xa5, 0x6c, 0x7e, 0x07, 0x61, 0xe1, 0x67, 0xb5, 0x56, 0x45, 0xb8, 0x8f, 0xa5, 0x02, 0xbf, 0xf7, 0x38, 0x2d, 0xd6, 0x2f, 0x55, 0xc1, 0x95, 0xc1, 0x73, 0x2b, 0x46, 0x1e, 0x4d, 0x0c, 0x99, 0x85, 0x36, 0x3a, 0x9a, 0x26, 0xac, 0x08, 0xdf, 0x88, 0x2f, 0xc7, 0x06, 0x28, 0x54, 0x8c, 0x5f, 0x63, 0x15, 0x34, 0xe5, 0x95, 0x6b, 0xa6, 0x73, 0x83, 0x1f, 0x58, 0x34, 0xf6, 0xdc, 0x15, 0x5c, 0xa9, 0x8a, 0xfd, 0x15, 0x65, 0xd7, 0xcd, 0xbc, 0x6b, 0x16, 0x60, 0x4e, 0x12, 0x4d, 0x76, 0x1d, 0xb1, 0x89, 0xb5, 0xc8, 0xbf, 0x75, 0xed, 0x69, 0x39, 0x2b, 0xa0, 0x10, 0x44, 0x4a, 0xc2, 0x71, 0x14, 0x49, 0xbd, 0xd9, 0x0c, 0x0b, 0xb8, 0x67, 0x27, 0xb3, 0x19, 0x78, 0x96, 0xb9, 0x48, 0x63, 0xab, 0x3e, 0xb6, 0x67, 0xf5, 0x9c, 0x1f, 0xe1, 0xad, 0x42, 0x0c, 0xc2, 0x50, 0xbf, 0x9b, 0x41, 0x8e, 0x1c, 0x82, 0xcd, 0x63, 0x6f, 0x52, 0x46, 0x84, 0xad, 0xf9, 0x6c, 0xfc, 0xc0, 0x8b, 0x98, 0x17, 0xd9, 0x42, 0xaa, 0x7f, 0x08, 0xc3, 0x42, 0xa5, 0x0a, 0xa2, 0x33, 0x62, 0x62, 0x29, 0x34, 0xdf, 0xab, 0x55, 0xd9, 0xb2, 0x2c, 0x22, 0xc2, 0x49, 0xad, 0x08, 0x13, 0x8c, 0x89, 0xc6, 0x23, 0xbe, 0x05, 0x5e, 0x79, 0xa4, 0xe0, 0x61, 0xf4, 0xea, 0x2b, 0x6c, 0x49, 0xc2, 0x5b, 0xf3, 0xb3, 0xce, 0x9d, 0x3d, 0xe5, 0x40, 0x69, 0xb0, 0x44, 0x40, 0x5a, 0x4f, 0x53, 0x8e, 0x3d, 0x81, 0x6e, 0x68, 0x68, 0x14, 0xbc, 0xae, 0x4d, 0x81, 0x5f, 0x44, 0x4e, 0x72, 0xed, 0xb8, 0xd3, 0x81, 0x24, 0x24, 0x9a, 0x43, 0xd9, 0x56, 0x4f, 0x85, 0x32, 0x2f, 0x5d, 0xd5, 0x15, 0x49, 0x03, 0x45, 0xe0, 0xdc, 0xaa, 0x6b, 0x5b, 0xe3, 0x76, 0xac, 0xeb, 0x7a, 0x1b, 0xbb, 0x08, 0x8b, 0xf2, 0x5c, 0xf0, 0xa9, 0x4c, 0x6e, 0x9d, 0x3c, 0x06, 0x28, 0xf5, 0xdf, 0x5d, 0xa3, 0x42, 0x06, 0x04, 0x98, 0xe1, 0xe4, 0x74, 0x6c, 0x3e, 0x8c, 0x84, 0x69, 0x00, 0x56, 0x39, 0x4f, 0x80, 0x84, 0xdf, 0x0b, 0x80, 0x25, 0x58, 0xc6, 0x1a, 0x3a, 0xb5, 0x21, 0xf6, 0x18, 0x03, 0xbf, 0xc0, 0x0d, 0x67, 0x05, 0xd9, 0x46, 0x6e, 0x1d, 0x4d, 0xf0, 0x9e, 0x41, 0x06, 0x9e, 0x51, 0x36, 0x3f, 0xeb, 0xc3, 0x16, 0x3b, 0x60, 0x69, 0x53, 0x36, 0x98, 0x84, 0xf9, 0x9c, 0xa1, 0xf7, 0x33, 0x79, 0xa6, 0x55, 0x11, 0x30, 0xcb, 0x3f, 0x88, 0x71, 0x59, 0xed, 0xbb, 0x65, 0x1b, 0x0a, 0x78, 0x2b, 0x08, 0xc5, 0x06, 0x88, 0x21, 0x25, 0x1e, 0xda, 0x9d, 0x9c, 0x37, 0x4e, 0x44, 0xe0, 0x07, 0x53, 0x19, 0xf6, 0x46, 0x4f, 0x3b, 0x8f, 0xb5, 0x90, 0x0d, 0x98, 0x5f, 0x85, 0x95, 0x0d, 0x1e, 0x2e, 0x22, 0x0e, 0x62, 0xd1, 0x32, 0x34, 0x2e, 0xef, 0x92, 0x25, 0x63, 0x76, 0xc7, 0x66, 0x41, 0x38, 0xad, 0x71, 0x2b, 0x9c, 0x5e, 0x08, 0xaa, 0x93, 0x55, 0xc8, 0xb5, 0xce, 0xd4, 0x01, 0x30, 0x2f, 0x82, 0xc5, 0xb2, 0x7d, 0x59, 0x3f, 0x8b, 0x5b, 0xbf, 0x46, 0x06, 0x7b, 0xf3, 0x32, 0xeb, 0x0f, 0xab, 0xef, 0x48, 0x80, 0xfc, 0x50, 0x71, 0x63, 0x79, 0xa5, 0x46, 0xa9, 0x9f, 0x8f, 0xb4, 0x15, 0x71, 0x13, 0x7f, 0xf4, 0x5f, 0xee, 0x3e, 0x08, 0x6c, 0x28, 0xa7, 0xc5, 0x90, 0xec, 0x0c, 0xc0, 0x5b, 0x97, 0x26, 0x64, 0xdc, 0x0f, 0x12, 0xe6, 0xc1, 0x56, 0x99, 0x7c, 0xbf, 0x5f, 0xb4, 0xca, 0x35, 0x20, 0x4f, 0x9d, 0x0c, 0xe8, 0x4e, 0xdc, 0xe1, 0xf3, 0xce, 0xbc, 0x66, 0x3c, 0xad, 0x32, 0x05, 0x92, 0x4c, 0xae, 0xc7, 0xee, 0x93, 0x06, 0x75, 0x04, 0x36, 0xb0, 0xfd, 0x18, 0x37, 0x35, 0x16, 0x13, 0xad, 0xe2, 0x27, 0xd6, 0xc3, 0xc1, 0x65, 0xce, 0x03, 0xc8, 0x3c, 0xc8, 0xd5, 0x4f, 0xf1, 0x07, 0x42, 0xc8, 0x85, 0x94, 0xfe, 0xaa, 0xdc, 0xd6, 0xa6, 0xae, 0x1f, 0x62, 0x46, 0x3e, 0x5e, 0x14, 0x1e, 0x2a, 0x7a, 0x5f, 0xa6, 0x9e, 0x42, 0xe1, 0xcf, 0x51, 0xdc, 0x3b, 0x8c, 0xfe, 0x67, 0x1f, 0x91, 0x18, 0xde, 0xab, 0x5a, 0xba, 0x3f, 0xf5, 0x70, 0xdd, 0xed, 0xe7, 0xe8, 0xcd, 0x53, 0x4d, 0x2c, 0xde, 0xcb, 0x2c, 0xfe, 0x5a, 0xbe, 0x55, 0xb9, 0xbf, 0x0c, 0x3b, 0xda, 0x27, 0xae, 0x02, 0xc0, 0x08, 0x9a, 0xd8, 0xb0, 0x1d, 0xe6, 0x88, 0x1c, 0xa4, 0x31, 0x4c, 0x25, 0xca, 0x3f, 0xe3, 0x5e, 0x64, 0xe3, 0xe4, 0xd3, 0xdf, 0x22, 0x52, 0x4a, 0x7a, 0x95, 0x70, 0xc8, 0xb2, 0x0f, 0xd7, 0x57, 0xfe, 0x80, 0xc5, 0x07, 0xbd, 0x19, 0xb8, 0x33, 0x6d, 0xb1, 0x3c, 0x05, 0x1d, 0x68, 0x01, 0x3c, 0x25, 0x8a, 0x30, 0x2d, 0x14, 0xb6, 0xff, 0x08, 0xea, 0x3f, 0x84, 0x5d, 0x88, 0xd2, 0xc6, 0xdf, 0x64, 0x59, 0x1a, 0x67, 0x81, 0x20, 0xad, 0x3c, 0x9f, 0x36, 0x5d, 0x91, 0xaf, 0x17, 0xcd, 0x4f, 0x89, 0x87, 0xb8, 0x15, 0xe1, 0xc1, 0x85, 0x7d, 0x77, 0xd1, 0x1c, 0xa2, 0x8f, 0x3f, 0xf9, 0xdf, 0xa1, 0xed, 0x7e, 0xd9, 0x51, 0x42, 0x8e, 0xbf, 0xa1, 0x88, 0x57, 0xd0, 0x66, 0x93, 0x6f, 0x1e, 0xf9, 0xa4, 0x23, 0x92, 0x2e, 0x8d, 0x0c, 0x31, 0x8a, 0x15, 0xe3, 0x9d, 0xb0, 0x9d, 0x95, 0xdf, 0x1d, 0x04, 0x9a, 0x63, 0x15, 0xc9, 0x83, 0x44, 0xdd, 0x6f, 0xd3, 0xcb, 0x2b, 0x26, 0x10, 0x32, 0xdb, 0xa7, 0x1a, 0xad, 0xe3, 0x60, 0xbb, 0xab, 0x89, 0xd1, 0x7e, 0x58, 0xd4, 0x36, 0xc5, 0x67, 0x40, 0x66, 0x16, 0x10, 0xb5, 0xfb, 0xb6, 0x54, 0xba, 0xb3, 0x79, 0x88, 0xe7, 0x16, 0xd8, 0x11, 0x98, 0x59, 0x44, 0x6d, 0xe9, 0x83, 0xba, 0x73, 0xde, 0xce, 0x98, 0xdb, 0xe1, 0x50, 0xaf, 0x00, 0x72, 0xda, 0x99, 0xe5, 0x1a, 0x21, 0x4c, 0x76, 0xa0, 0x1b, 0xf0, 0x11, 0x80, 0xac, 0xee, 0x45, 0x99, 0x82, 0x4a, 0xda, 0x26, 0x3e, 0x32, 0x11, 0xef, 0xd4, 0xd7, 0x2c, 0xc1, 0x34, 0x7b, 0x31, 0x1b, 0x2a, 0xcb, 0xec, 0x2a, 0x82, 0x70, 0x33, 0xf7, 0x71, 0xe1, 0x6e, 0xe0, 0x30, 0x7b, 0x56, 0x45, 0xea, 0xd3, 0xfc, 0x83, 0xd8, 0x4b, 0x0d, 0x26, 0xab, 0xe3, 0x55, 0x5a, 0x2a, 0x52, 0x83, 0xa3, 0x1c, 0x56, 0x2c, 0xce, 0x68, 0x48, 0x12, 0x28, 0x7b, 0xf3, 0xa5, 0xed, 0xea, 0xa6, 0xca, 0x03, 0x58, 0x88, 0xdc, 0xe8, 0x9b, 0x2c, 0xf0, 0xea, 0x1a, 0x65, 0x5e, 0x96, 0x79, 0x5c, 0x7d, 0x72, 0x79, 0xdf, 0xad, 0xef, 0x19, 0xfc, 0x9b, 0x99, 0x02, 0xcf, 0xc0, 0x91, 0x21, 0x98, 0x2b, 0x3d, 0x96, 0x10, 0x81, 0x3e, 0xcd, 0xfe, 0x42, 0xa2, 0xea, 0x05, 0x4d, 0x5b, 0x6b, 0xc0, 0xa7, 0xf0, 0x08, 0x11, 0x78, 0x73, 0xde, 0xb5, 0x56, 0xb3, 0xcd, 0x1c, 0xc6, 0xb2, 0x1f, 0x78, 0x00, 0x5a, 0x6a, 0x15, 0xf3, 0x6b, 0xb7, 0xe8, 0x89, 0xb8, 0xe3, 0x6a, 0x2c, 0x93, 0x46, 0xa7, 0x89, 0x86, 0x93, 0x91, 0x94, 0x44, 0xff, 0x9b, 0xcc, 0xde, 0xa6, 0x83, 0xc0, 0x3a, 0x2a, 0x6f, 0xd2, 0xc2, 0x9d, 0x3c, 0x3b, 0x59, 0xa1, 0x13, 0x4f, 0x93, 0xcd, 0x3d, 0x02, 0x25, 0x53, 0x38, 0xac, 0x9a, 0xe0, 0x0a, 0x09, 0x48, 0xc4, 0xd5, 0x84, 0x83, 0x53, 0xac, 0xb5, 0x10, 0x8b, 0xa5, 0x28, 0xdc, 0xf7, 0x2f, 0x60, 0xee, 0xd2, 0xa6, 0x1b, 0x9b, 0x70, 0x25, 0xd8, 0xf9, 0xda, 0x9c, 0x97, 0x96, 0xb9, 0x22, 0xe0, 0x69, 0x75, 0x8c, 0x06, 0x08, 0x9d, 0x3e, 0xad, 0x1c, 0x8a, 0x41, 0x8a, 0x12, 0x3f, 0x96, 0x6a, 0x14, 0x94, 0xca, 0x76, 0x38, 0x94, 0xcb, 0xb5, 0xf7, 0x23, 0xfa, 0xd2, 0xe0, 0xe4, 0x81, 0x20, 0x8d, 0x59, 0xe7, 0xdb, 0xd7, 0x4c, 0xe2, 0xb1, 0x46, 0x6e, 0x6c, 0x80, 0xcb, 0x3f, 0x18, 0x62, 0xb2, 0x2d, 0xa7, 0xe7, 0xd2, 0x00, 0xd6, 0xa1, 0x07, 0x75, 0x7b, 0xe6, 0xe2, 0x29, 0xd0, 0xd1, 0x9e, 0xb9, 0x0f, 0x8a, 0x56, 0x28, 0x3f, 0xc7, 0x76, 0x81, 0x4d, 0x93, 0x70, 0xbd, 0x5e, 0x4f, 0xb0, 0xe6, 0x64, 0xf6, 0xd1, 0x7d, 0xef, 0xa5, 0x11, 0x1a, 0x47, 0x5a, 0x02, 0x52, 0xb7, 0xfb, 0x83, 0xdd, 0x2b, 0x9b, 0xef, 0xf8, 0xfe, 0xfa, 0x94, 0x09, 0x0d, 0x4a, 0x67, 0x82, 0x10, 0x39, 0xf5, 0x07, 0x2a, 0x2b, 0x9d, 0xd3, 0xbe, 0xc7, 0xfd, 0x58, 0x85, 0xb6, 0xaa, 0x25, 0xdd, 0xa7, 0x24, 0x0d, 0x64, 0x97, 0x09, 0x86, 0xc6, 0x4f, 0x88, 0x4f, 0xd3, 0x2e, 0x19, 0x56, 0xd5, 0x28, 0x6b, 0xd8, 0x20, 0x0f, 0x9e, 0xca, 0xea, 0x11, 0xb3, 0x78, 0x5d, 0x83, 0x41, 0x6c, 0xeb, 0xdd, 0x69, 0x91, 0xe2, 0x05, 0x0b, 0x98, 0x40, 0xd0, 0x3a, 0x9b, 0xc8, 0xc6, 0xee, 0x00, 0x55, 0x25, 0xf9, 0xa1, 0x6f, 0x29, 0x3d, 0x29, 0x1c, 0x8b, 0x1b, 0xc1, 0xf8, 0x47, 0x2f, 0xed, 0x88, 0xa3, 0x3a, 0xb0, 0xcc, 0x6d, 0x5f, 0xf7, 0x13, 0x84, 0x93, 0x35, 0x13, 0x9a, 0x4f, 0x4a, 0x39, 0x37, 0x87, 0xa9, 0x3e, 0x01, 0xe0, 0xba, 0xfb, 0x3c, 0x1e, 0x7d, 0x7e, 0x8d, 0xdb, 0x71, 0x5d, 0x03, 0x7f, 0xb4, 0x4a, 0x57, 0x6c, 0x6b, 0xe8, 0x73, 0x79, 0x64, 0xde, 0x32, 0xa2, 0xfa, 0x29, 0x67, 0xfe, 0x39, 0xb6, 0x20, 0xf1, 0x43, 0x30, 0x2c, 0xa2, 0xf2, 0x17, 0xda, 0xaf, 0xbf, 0x12, 0x04, 0x20, 0xe3, 0x86, 0x4c, 0x9a, 0xbc, 0x67, 0xa6, 0xd5, 0x71, 0x4e, 0x17, 0x50, 0xd9, 0xcc, 0xbc, 0x44, 0x99, 0xff, 0x0d, 0xd6, 0x8d, 0x62, 0x63, 0x90, 0x6a, 0xe9, 0xb8, 0x12, 0xa1, 0x4e, 0xae, 0x05, 0x86, 0xa5, 0xd3, 0x51, 0xb1, 0x37, 0x24, 0x90, 0xa4, 0x8d, 0xd0, 0xc2, 0xaf, 0xcb, 0x3e, 0x42, 0x11, 0x40, 0x50, 0xf9, 0x60, 0x3a, 0xea, 0xd1, 0x2b, 0x1f, 0xae, 0x6c, 0xdd, 0xb9, 0x0a, 0x17, 0xe4, 0xd2, 0x75, 0xf9, 0x13, 0x01, 0xf5, 0x90, 0x45, 0xc3, 0xe5, 0x5f, 0x44, 0xcd, 0xf5, 0xe0, 0xe9, 0xa1, 0x72, 0xc0, 0x84, 0x60, 0xc8, 0x4b, 0x7d, 0xdf, 0x45, 0x26, 0x3c, 0xfc, 0x1f, 0x3c, 0x47, 0x33, 0xb9, 0xfa, 0xaa, 0x6c, 0x22, 0xbf, 0x9c, 0x17, 0xde, 0x8e, 0x5f, 0x7b, 0xea, 0x07, 0x68, 0x4b, 0xfa, 0x95, 0xc0, 0x7b, 0x05, 0xe8, 0xaa, 0x51, 0x03, 0xa6, 0x86, 0xbf, 0xf6, 0x5d, 0xf5, 0xf0, 0x27, 0xbd, 0x3e, 0x21, 0xb2, 0x04, 0xf1, 0xb2, 0x44, 0xb9, 0xca, 0x7d, 0x24, 0x9d, 0xd7, 0x66, 0x70, 0xdf, 0xdd, 0x33, 0xaa, 0x8f, 0xf9, 0x9f, 0x73, 0x55, 0x83, 0xa9, 0x95, 0x63, 0x37, 0x32, 0x47, 0xa8, 0x97, 0xc7, 0xad, 0x46, 0x8b, 0xbc, 0x9f, 0x47, 0x4b, 0x7a, 0xab, 0x8b, 0x7e, 0x19, 0x5d, 0x05, 0xa4, 0x32, 0xbd, 0x28, 0xb1, 0xee, 0x1a, 0x9b, 0xfa, 0x63, 0x06, 0x34, 0x55, 0x21, 0xa2, 0x24, 0x7c, 0x07, 0x1c, 0x6f, 0xb3, 0x5c, 0x75, 0xa0, 0xab, 0x1b, 0x88, 0xba, 0xa5, 0x8d, 0x48, 0x71, 0xda, 0x1d, 0x49, 0x9a, 0x1b, 0x69, 0x82, 0xe1, 0xb5, 0x95, 0x51, 0xba, 0x97, 0xe4, 0xbf, 0x9a, 0xb7, 0x89, 0x06, 0x66, 0xb1, 0xba, 0x50, 0x2c, 0xb1, 0x07, 0xc2, 0x11, 0x94, 0xea, 0xb9, 0x8a, 0x4a, 0x9f, 0x53, 0xcf, 0x7f, 0x35, 0x32, 0x8d, 0x7a, 0xe6, 0x7c, 0xdb, 0x45, 0xa4, 0x26, 0x70, 0x0e, 0xf4, 0x73, 0x13, 0xcd, 0xff, 0xb7, 0x52, 0x27, 0xe6, 0x61, 0x77, 0x92, 0x57, 0x38, 0xb8, 0xbb, 0x5e, 0xe5, 0xae, 0x25, 0x7d, 0xb2, 0x09, 0x12, 0xfe, 0x91, 0x81, 0xa6, 0x88, 0x60, 0x10, 0x4a, 0xf1, 0x6b, 0x5e, 0x4f, 0x53, 0x33, 0x7d, 0xd3, 0x62, 0x6e, 0xd6, 0xe9, 0xfc, 0x4e, 0x63, 0xf4, 0x02, 0x06, 0x1f, 0x54, 0x67, 0x8b, 0xbb, 0x45, 0x86, 0x97, 0x93, 0x03, 0xb9, 0xf4, 0xe0, 0x33, 0x27, 0xf7, 0x2f, 0x7e, 0xdd, 0x4b, 0x12, 0x7f, 0x21, 0xef, 0x15, 0xdf, 0x02, 0x82, 0xf3, 0xbe, 0x34, 0xbf, 0x0a, 0x55, 0x1b, 0x44, 0x0d, 0xda, 0x26, 0x97, 0xf9, 0xa4, 0x5e, 0x6a, 0x4a, 0x90, 0x3f, 0x1e, 0x6e, 0xa3, 0xc6, 0x87, 0x7a, 0xf1, 0xcb, 0xef, 0x1c, 0xbd, 0x91, 0x5d, 0xd0, 0xe1, 0x9c, 0x17, 0x57, 0x71, 0xc2, 0x65, 0x66, 0x9b, 0x85, 0x98, 0x9b, 0xd1, 0xa0, 0x4b, 0xb4, 0x2b, 0xe0, 0xe9, 0x03, 0x06, 0x35, 0x6f, 0x1d, 0xf2, 0x09, 0x73, 0xd3, 0xcb, 0xd0, 0x66, 0x63, 0x25, 0xe1, 0x16, 0xef, 0xed, 0x84, 0x76, 0x2d, 0x4e, 0x4c, 0xa2, 0x61, 0xd2, 0xa7, 0x1e, 0x88, 0xca, 0xb3, 0x5e, 0xd6, 0xef, 0x53, 0x8c, 0x63, 0x49, 0x83, 0x85, 0x22, 0x50, 0xe8, 0x25, 0x12, 0x52, 0xab, 0xc4, 0xb8, 0x14, 0x88, 0x00, 0xcc, 0xbc, 0x22, 0xbd, 0x33, 0xee, 0x9a, 0x6b, 0x2d, 0x36, 0x5f, 0x88, 0xd0, 0xa6, 0x48, 0x65, 0xb5, 0xc0, 0xe0, 0x2c, 0xf1, 0x96, 0x01, 0x22, 0x46, 0x2f, 0xa4, 0x2a, 0x9b, 0x2d, 0xf7, 0x8b, 0xaa, 0xad, 0xb0, 0xf2, 0xf9, 0x6f, 0xa1, 0xbb, 0x0b, 0x37, 0x8d, 0x6c, 0xd7, 0x72, 0x3b, 0x82, 0x79, 0x1d, 0xc8, 0x71, 0x28, 0xe3, 0x41, 0xe6, 0x68, 0x85, 0x72, 0x4f, 0x80, 0x7f, 0xf8, 0x9d, 0x2f, 0xe9, 0x9e, 0x48, 0x9b, 0x9b, 0xe6, 0x94, 0x8a, 0x94, 0xe5, 0x14, 0xd4, 0x9d, 0x54, 0x6c, 0x19, 0x29, 0xe5, 0x5a, 0xaf, 0x80, 0xd3, 0xf8, 0xde, 0x1c, 0xbd, 0x3b, 0x50, 0x53, 0xb4, 0xc0, 0xc3, 0x37, 0x93, 0xc8, 0x01, 0xbb, 0x8e, 0x81, 0x12, 0x17, 0x0e, 0x87, 0xb0, 0x6d, 0xbd, 0xaa, 0xfb, 0xac, 0xdc, 0xf2, 0x6e, 0xb5, 0xdd, 0xe0, 0x12, 0xbc, 0x2e, 0xf7, 0xf1, 0xf1, 0x53, 0x7b, 0xce, 0x60, 0x37, 0x79, 0x13, 0x16, 0xc4, 0x07, 0x0b, 0x86, 0xb1, 0xcd, 0x51, 0x2b, 0x9b, 0xc4, 0x89, 0x6e, 0x58, 0x3e, 0x4d, 0xc9, 0x88, 0x27, 0x6a, 0x2d, 0x6c, 0x8a, 0x4d, 0xa1, 0xfc, 0x56, 0xb8, 0x2d, 0x33, 0x63, 0xba, 0xf6, 0xae, 0xb0, 0xdd, 0xaa, 0x75, 0xef, 0xa1, 0x1e, 0x19, 0x43, 0x29, 0x36, 0xff, 0x48, 0x35, 0x06, 0xfb, 0x54, 0x50, 0x36, 0x20, 0xfc, 0x4b, 0xab, 0xd7, 0xda, 0xe9, 0x63, 0x2f, 0x8e, 0xdc, 0xa1, 0x74, 0x03, 0xf0, 0x4b, 0x03, 0xf4, 0x87, 0x90, 0x5c, 0xae, 0x45, 0xcd, 0x79, 0x17, 0x0c, 0xb2, 0x5f, 0xef, 0x2b, 0xa1, 0xf2, 0x56, 0xd2, 0x56, 0x0d, 0x8e, 0xca, 0xcd, 0xd2, 0x03, 0x62, 0x60, 0x3f, 0x88, 0xad, 0x31, 0x02, 0xe4, 0xea, 0xc7, 0x8f, 0x8d, 0x44, 0xfc, 0x6f, 0xb3, 0xbc, 0x16, 0xdb, 0x80, 0x63, 0x34, 0x89, 0x9f, 0xcc, 0xec, 0xc6, 0xfb, 0xc1, 0x32, 0xc5, 0xc9, 0x35, 0x7b, 0x37, 0xc8, 0x7a, 0x23, 0x1b, 0xc7, 0xb4, 0x0c, 0xd8, 0x69, 0x8e, 0x89, 0x89, 0x25, 0x2b, 0x7a, 0x98, 0x90, 0x60, 0xb8, 0x8e, 0xdf, 0x20, 0xb3, 0x29, 0xa7, 0x37, 0x59, 0xb0, 0xe8, 0x3b, 0x3a, 0x83, 0x4a, 0xc0, 0xea, 0xf6, 0xa6, 0xcc, 0xa7, 0x5f, 0xc8, 0x8b, 0x3c, 0x6e, 0x74, 0x43, 0x25, 0xbd, 0xa6, 0x89, 0xf4, 0xa8, 0x1e, 0xb6, 0xf4, 0x5f, 0x1c, 0x95, 0x0b, 0x39, 0x69, 0x5e, 0xe5, 0x4c, 0x96, 0xe8, 0x4e, 0x3a, 0x88, 0x1a, 0xe0, 0x4d, 0x35, 0xa3, 0xdf, 0xc7, 0xa8, 0xea, 0x61, 0x73, 0x4b, 0x48, 0xb2, 0x80, 0x65, 0x76, 0xf6, 0x8f, 0xe2, 0x41, 0x10, 0x0b, 0x53, 0x85, 0xc3, 0xb9, 0x35, 0x58, 0x17, 0x90, 0x76, 0x86, 0xff, 0xca, 0x35, 0x3e, 0x38, 0x3b, 0xca, 0x0a, 0x74, 0xe2, 0x06, 0x04, 0xb8, 0xbe, 0xbb, 0x48, 0x03, 0xe2, 0x7f, 0xa5, 0x30, 0xcc, 0xae, 0x98, 0x1d, 0xf3, 0xae, 0x7a, 0x0d, 0x9f, 0x77, 0xf8, 0x4b, 0xfd, 0x52, 0xc4, 0x11, 0x73, 0xe0, 0x8a, 0xa7, 0x31, 0x5f, 0x26, 0xcf, 0x09, 0x29, 0x14, 0x61, 0x80, 0x7d, 0x27, 0x33, 0x25, 0x82, 0x7e, 0x3b, 0x21, 0x89, 0xb5, 0xf8, 0x10, 0x93, 0x58, 0x0d, 0x0f, 0x13, 0x9d, 0x30, 0x16, 0xf5, 0x52, 0x42, 0x89, 0xde, 0x14, 0xbf, 0x09, 0xb6, 0xc2, 0x59, 0x90, 0x64, 0x31, 0xe0, 0xbd, 0xd8, 0x21, 0x65, 0x6c, 0x4f, 0x70, 0x9f, 0x8a, 0xd2, 0x8e, 0x8e, 0x28, 0x00, 0x31, 0x5d, 0xcd, 0x0e, 0x4a, 0x8d, 0x11, 0x0c, 0x37, 0x50, 0x67, 0x6a, 0x3a, 0x33, 0x3b, 0xba, 0x2a, 0x00, 0x3d, 0xb7, 0x68, 0xe3, 0xfc, 0x87, 0x15, 0xcb, 0xb6, 0x3d, 0x82, 0x13, 0x6e, 0xa2, 0xe8, 0x62, 0x40, 0x35, 0x5a, 0xd0, 0xf2, 0x70, 0xf7, 0x4a, 0xcb, 0x4d, 0x64, 0x37, 0xa8, 0x09, 0x7a, 0x5b, 0x4c, 0x28, 0x3b, 0xfc, 0xf8, 0xb9, 0x0b, 0x44, 0x3b, 0xdb, 0x1d, 0xe7, 0x0c, 0x80, 0x2b, 0x06, 0x16, 0x71, 0x6a, 0x52, 0x53, 0x93, 0xbd, 0x74, 0xdc, 0x68, 0x28, 0xad, 0x00, 0xd8, 0x88, 0xb9, 0x93, 0x32, 0x82, 0xfa, 0x88, 0x6e, 0xba, 0xd2, 0xc3, 0xb5, 0x45, 0x51, 0x28, 0x23, 0x60, 0x10, 0xf8, 0xcb, 0x62, 0x5c, 0x5d, 0xfb, 0xef, 0x97, 0x43, 0xc2, 0x6f, 0xdc, 0x6a, 0xb0, 0xbe, 0xe2, 0xb9, 0xdd, 0x25, 0x23, 0xd6, 0x2c, 0x8a, 0x3d, 0xf3, 0xd1, 0xe3, 0x98, 0xeb, 0x11, 0xf1, 0x49, 0x8d, 0x49, 0x2a, 0x36, 0x37, 0x32, 0xf7, 0x7b, 0xa8, 0x63, 0x1f, 0x0d, 0x0f, 0x18, 0x83, 0x9d, 0x67, 0x31, 0x0d, 0xc0, 0x07, 0x7e, 0xe3, 0x4c, 0x75, 0x39, 0xe0, 0x05, 0x7c, 0xd4, 0x44, 0x79, 0x7e, 0xf6, 0xaa, 0x28, 0x0b, 0xc0, 0x3b, 0xe8, 0xb1, 0x54, 0x22, 0x88, 0x16, 0x98, 0x3f, 0xb4, 0x45, 0x37, 0x20, 0x18, 0x46, 0xe9, 0x2d, 0xc9, 0xf1, 0xf5, 0x22, 0xe0, 0x03, 0xf4, 0xc3, 0x68, 0x72, 0xd7, 0xcb, 0x7a, 0xfe, 0x2b, 0x25, 0xa6, 0x09, 0x9c, 0x5e, 0x95, 0xa8, 0xb8, 0x5b, 0xed, 0xfa, 0xf6, 0x47, 0x75, 0xb9, 0xf7, 0xd0, 0x7a, 0x0e, 0x0b, 0x93, 0x71, 0xaa, 0xf7, 0xd4, 0xdd, 0x12, 0xf6, 0x73, 0x73, 0x3a, 0xfd, 0x1b, 0x7c, 0x56, 0x43, 0xbd, 0x7c, 0xed, 0x01, 0x3d, 0x11, 0x2f, 0x76, 0x6b, 0x1d, 0x88, 0x2f, 0x34, 0x27, 0x75, 0x85, 0x1a, 0xff, 0x97, 0x67, 0xe1, 0xa1, 0x06, 0x5a, 0x8b, 0x5c, 0xe7, 0xbd, 0x87, 0x34, 0x41, 0x52, 0x26, 0x84, 0x0c, 0xfa, 0x4e, 0xe8, 0x8b, 0xc0, 0x72, 0x59, 0xdc, 0x19, 0xc1, 0x9a, 0xce, 0x6a, 0x9e, 0xd4, 0xf2, 0xcb, 0x51, 0x7d, 0xf5, 0x0b, 0xfc, 0x7d, 0x2c, 0xf4, 0xd0, 0x94, 0x71, 0xd0, 0x80, 0xf6, 0x2e, 0x2c, 0xf6, 0x39, 0xb7, 0xdb, 0x46, 0x71, 0xdd, 0x3e, 0xe0, 0x9a, 0xc0, 0xc3, 0x09, 0x36, 0xe4, 0xac, 0x8c, 0x36, 0x87, 0x12, 0xac, 0x1e, 0x32, 0x29, 0x5e, 0x65, 0x8f, 0xc5, 0xb5, 0x1a, 0x7a, 0x1d, 0x9e, 0xce, 0x5a, 0xcf, 0xcd, 0xad, 0xb2, 0x25, 0xf7, 0xee, 0xf3, 0x97, 0x42, 0x6e, 0x95, 0x91, 0xfa, 0x97, 0x65, 0x76, 0x85, 0x87, 0x21, 0xe4, 0x99, 0x6e, 0x42, 0x3a, 0xac, 0x38, 0x19, 0x57, 0xac, 0x6d, 0x1d, 0xa5, 0xf1, 0x55, 0x84, 0x57, 0x70, 0x5f, 0x10, 0xee, 0x31, 0xc3, 0x2c, 0x02, 0x03, 0x67, 0x37, 0x3f, 0x6e, 0x00, 0x20, 0xae, 0xe9, 0x79, 0x33, 0x35, 0x4d, 0x98, 0x32, 0x62, 0x8a, 0xdf, 0xa8, 0x64, 0x98, 0xb0, 0x7a, 0x5a, 0xb1, 0xb5, 0xbf, 0xd1, 0xbe, 0x7f, 0xd1, 0x87, 0x0f, 0x6d, 0xa4, 0x75, 0x4e, 0xd0, 0x57, 0x0d, 0xb6, 0x4c, 0x09, 0xc1, 0x80, 0x82, 0xee, 0xc4, 0x9e, 0xeb, 0xa2, 0x14, 0xac, 0x07, 0xbd, 0xb8, 0x24, 0xb8, 0xa7, 0x46, 0xd1, 0xe8, 0xae, 0xa9, 0x86, 0x72, 0x55, 0x21, 0x0f ],
+const [ 0xbb, 0xa0, 0x96, 0x78, 0x75, 0xc4, 0x74, 0x3a, 0x54, 0xf5, 0xb6, 0x37, 0x53, 0x52, 0xca, 0xb3, 0xf6, 0x62, 0xf2, 0x79, 0x2e, 0x60, 0x47, 0xcd, 0x7d, 0xd6, 0xfd, 0xa1, 0x5a, 0x6e, 0xe8, 0x0c, 0xd7, 0x04, 0x3f, 0xf7, 0x81, 0xff, 0xa1, 0x1a, 0x88, 0xe2, 0x55, 0x27, 0x20, 0x1e, 0xd6, 0x44, 0x26, 0x2b, 0x8f, 0xbf, 0x07, 0xd6, 0xe3, 0xfd, 0xde, 0xdd, 0x70, 0xb4, 0xdc, 0xb9, 0x95, 0x5a, 0xed, 0xbb, 0x31, 0xde, 0x98, 0x5a, 0xae, 0x95, 0x27, 0xcc, 0x3f, 0x77, 0x09, 0xd3, 0x65, 0x8b, 0x74, 0xda, 0xb8, 0xa0, 0x4f, 0x40, 0xe4, 0x3e, 0x4e, 0xf4, 0xf2, 0xdc, 0x5f, 0x42, 0xc9, 0x53, 0x45, 0xec, 0xf4, 0x93, 0x82, 0x7d, 0xa5, 0x95, 0x7b, 0xda, 0xfa, 0x91, 0xd7, 0x1a, 0x80, 0x70, 0x28, 0x97, 0xf6, 0x84, 0xcd, 0x45, 0x53, 0x77, 0x17, 0x43, 0x0a, 0x81, 0xaa, 0xb0, 0x8c, 0xde, 0x26, 0xc0, 0x0e, 0x80, 0x07, 0x0f, 0x8d, 0x01, 0xca, 0x35, 0x10, 0xdb, 0x52, 0x9a, 0x2e, 0xdb, 0x89, 0x8c, 0xcf, 0xd3, 0x4a, 0x8e, 0x37, 0x90, 0x7f, 0xf3, 0x40, 0x0b, 0x86, 0xac, 0xe6, 0xe3, 0xda, 0x5f, 0x09, 0x0b, 0xef, 0xb9, 0x6f, 0xc0, 0x5d, 0x04, 0x09, 0xbf, 0x41, 0xfc, 0x77, 0xb4, 0xe0, 0xde, 0xcd, 0xf5, 0x8e, 0xc3, 0x98, 0x70, 0xcf, 0x2c, 0x1c, 0xe3, 0xbb, 0xde, 0xe0, 0x4b, 0xa7, 0xf0, 0x6d, 0x9e, 0x01, 0x22, 0x52, 0xbc, 0x7c, 0x70, 0x6b, 0xa3, 0x6d, 0xe7, 0x63, 0xe3, 0x75, 0xb8, 0x78, 0x53, 0x61, 0x8b, 0x7e, 0x01, 0x4e, 0x15, 0x27, 0x6f, 0x11, 0xed, 0x81, 0xfc, 0xd6, 0x9b, 0xc0, 0xa0, 0x06, 0xf2, 0x3e, 0xdc, 0x6f, 0xa1, 0xc0, 0xf1, 0x9f, 0x04, 0xfb, 0x51, 0x90, 0x40, 0x57, 0x53, 0x8b, 0x8e, 0xf2, 0x2a, 0x46, 0xd7, 0xe8, 0x18, 0x50, 0x82, 0xd2, 0xdf, 0xae, 0x8a, 0x8c, 0x79, 0xc7, 0xd3, 0x3c, 0x08, 0x7d, 0xbe, 0x8f, 0x10, 0x9d, 0xfb, 0x46, 0xe4, 0x79, 0x9e, 0xf2, 0x5e, 0xd3, 0x75, 0xfb, 0xd3, 0xfd, 0x99, 0xe7, 0x46, 0x3f, 0x44, 0xd9, 0xdc, 0x79, 0xe2, 0x58, 0x90, 0x09, 0x6b, 0x52, 0x28, 0xef, 0xef, 0x61, 0x68, 0x2f, 0x73, 0x4c, 0x85, 0x77, 0xfb, 0xd1, 0xdd, 0x02, 0xe8, 0xa2, 0xe4, 0xbc, 0x84, 0xad, 0x62, 0xa7, 0xdc, 0xa0, 0xdc, 0x7d, 0xce, 0xad, 0x4f, 0x97, 0x62, 0x8b, 0x25, 0x0d, 0x5e, 0xbd, 0x61, 0x1f, 0x14, 0x16, 0x1d, 0xd4, 0x7f, 0x7d, 0x36, 0xe0, 0x8e, 0xee, 0x46, 0xcb, 0xc0, 0xc1, 0xd2, 0x50, 0xf1, 0x2f, 0xc5, 0x04, 0x74, 0x12, 0x1d, 0x38, 0x61, 0xec, 0xe5, 0x1f, 0x30, 0x2b, 0x63, 0x34, 0x87, 0xab, 0x92, 0xd6, 0x51, 0x7d, 0xd3, 0x35, 0x10, 0xe7, 0xdf, 0x72, 0x74, 0xab, 0x00, 0x02, 0x2c, 0x8c, 0x81, 0x54, 0xfc, 0x0f, 0x62, 0xb3, 0x10, 0x7f, 0x51, 0x6d, 0x90, 0x33, 0xd6, 0x35, 0x74, 0x14, 0xce, 0xc6, 0x9a, 0x59, 0x1a, 0xc9, 0x15, 0x95, 0x98, 0xf9, 0xc9, 0xf4, 0x52, 0x85, 0x35, 0xc1, 0xf6, 0xb5, 0x8f, 0x2c, 0x87, 0xd1, 0x16, 0x4b, 0x51, 0x3f, 0xa4, 0x5e, 0x22, 0xeb, 0x82, 0x57, 0xb7, 0xec, 0x81, 0x9a, 0x75, 0x64, 0x46, 0x01, 0x5a, 0xa7, 0xe6, 0x23, 0x32, 0xa0, 0xb3, 0xd6, 0x0e, 0x71, 0x55, 0xf2, 0xf2, 0x5a, 0x1c, 0x58, 0xce, 0xdc, 0x94, 0x33, 0xaf, 0x1e, 0x5a, 0x7e, 0x37, 0x8f, 0x2f, 0xc7, 0x4b, 0xcd, 0x4b, 0x32, 0x0b, 0xc6, 0xf3, 0xc0, 0x07, 0x1d, 0x4e, 0xd1, 0xaf, 0xcf, 0x75, 0xe8, 0x0c, 0x16, 0xc9, 0xaf, 0xae, 0x8d, 0x89, 0x3b, 0xe6, 0x95, 0xa4, 0x90, 0x35, 0xf8, 0xcb, 0x68, 0x03, 0xcd, 0xcb, 0x30, 0x94, 0x9c, 0x1a, 0x54, 0x39, 0xc2, 0xaf, 0xbc, 0xc3, 0x16, 0x17, 0x97, 0x3d, 0xcc, 0xc6, 0x57, 0xdb, 0x9a, 0xab, 0xfc, 0x2d, 0x1a, 0x07, 0x96, 0x98, 0x70, 0x7e, 0x05, 0x07, 0x2c, 0x6f, 0x04, 0xde, 0x72, 0x81, 0x66, 0x30, 0x58, 0x7e, 0x9e, 0x31, 0x8f, 0x65, 0x85, 0xee, 0x46, 0xba, 0x58, 0x3b, 0x4b, 0x21, 0x00, 0xed, 0x73, 0x2b, 0x97, 0x4a, 0x3d, 0x70, 0x27, 0xbe, 0xb2, 0xde, 0xb5, 0xd0, 0x8f, 0x50, 0x7e, 0x53, 0xa6, 0x62, 0x80, 0xe1, 0x82, 0x84, 0x3c, 0x85, 0x4a, 0x4e, 0xbb, 0xb8, 0xe7, 0x14, 0xcf, 0x8f, 0x69, 0xb9, 0x9b, 0x32, 0xa7, 0xc8, 0x55, 0x90, 0x26, 0xc0, 0x4b, 0x51, 0x3d, 0xb0, 0x24, 0x0c, 0x76, 0x04, 0x69, 0xbb, 0x36, 0x9f, 0x44, 0x6c, 0xa1, 0x2a, 0x87, 0x39, 0xb8, 0xab, 0xef, 0x79, 0xc4, 0x59, 0xab, 0x38, 0xf8, 0xaf, 0x18, 0xe5, 0x52, 0xbf, 0xcf, 0x4b, 0xc2, 0xc9, 0xe1, 0xc3, 0x8e, 0x0c, 0x61, 0xa7, 0xf5, 0xdc, 0x23, 0x09, 0x13, 0xf5, 0xc4, 0xa5, 0x04, 0x0f, 0xea, 0x15, 0x4c, 0xb2, 0xcd, 0x44, 0x76, 0x4c, 0xf7, 0x25, 0xfc, 0x81, 0x48, 0xa5, 0x67, 0xc2, 0x3c, 0xde, 0xb7, 0x21, 0x71, 0x8d, 0x05, 0x63, 0x63, 0xc6, 0x67, 0x57, 0x7a, 0xe6, 0x14, 0x67, 0x48, 0xca, 0xc9, 0x6d, 0x0b, 0x3e, 0x6b, 0xc8, 0x7a, 0xb8, 0xed, 0xae, 0xbe, 0x47, 0x74, 0xc3, 0xbe, 0xc6, 0xb9, 0xeb, 0x9f, 0x55, 0xaf, 0x5d, 0x8b, 0x0a, 0x67, 0xfa, 0xb2, 0xe3, 0x30, 0xdc, 0x8f, 0xff, 0x02, 0x31, 0x6d, 0x0e, 0x1d, 0x4a, 0x29, 0x07, 0xed, 0xef, 0x39, 0x19, 0x31, 0xf6, 0xed, 0xe3, 0x5c, 0x14, 0xf5, 0xe7, 0x3b, 0xf2, 0x24, 0x3c, 0xd9, 0x83, 0x74, 0x84, 0xa0, 0x96, 0x49, 0x1e, 0xc0, 0xa7, 0xfa, 0x9d, 0xd5, 0xfb, 0x8d, 0x78, 0xc4, 0xec, 0xc2, 0x02, 0xe5, 0x81, 0x54, 0x9d, 0x68, 0x41, 0x7b, 0x2b, 0xf1, 0x49, 0xb5, 0xc6, 0x86, 0x9d, 0xc6, 0xb1, 0xab, 0xbc, 0xfd, 0x8e, 0xcb, 0x77, 0xba, 0xd1, 0xda, 0x02, 0x2d, 0x74, 0x39, 0x4c, 0x60, 0xed, 0xda, 0x8c, 0x78, 0x5d, 0xa4, 0x1c, 0x38, 0x0a, 0x19, 0x8b, 0xc6, 0x0f, 0x36, 0xee, 0xb2, 0x52, 0x9a, 0x76, 0x34, 0xb7, 0xeb, 0x48, 0xb5, 0x93, 0x76, 0x88, 0x91, 0x64, 0x15, 0xb7, 0x1c, 0xbf, 0x56, 0x40, 0xe3, 0x89, 0xd9, 0x4d, 0x34, 0x6a, 0xfa, 0xdf, 0xe0, 0x7f, 0xb0, 0x1e, 0x3f, 0x4f, 0xb5, 0xee, 0x75, 0x01, 0xe8, 0xc2, 0xf4, 0xcc, 0xef, 0xb5, 0x42, 0xae, 0x20, 0xd7, 0xfd, 0x61, 0xa2, 0xc4, 0x1c, 0x8b, 0xcf, 0x7c, 0x77, 0x35, 0xdd, 0x6e, 0x8a, 0x7e, 0xbe, 0xd6, 0x75, 0x90, 0x44, 0x49, 0x48, 0xd4, 0x89, 0x8e, 0x7e, 0x62, 0x8e, 0xb0, 0xc7, 0xbc, 0x22, 0x51, 0x0b, 0xbb, 0x06, 0x41, 0xab, 0xc9, 0x4e, 0x50, 0x0a, 0x51, 0x0a, 0x60, 0x4c, 0x74, 0x26, 0xbe, 0x5d, 0xfe, 0x8f, 0xb2, 0x35, 0x98, 0x97, 0x54, 0x5b, 0x3f, 0x9b, 0xa2, 0xa8, 0xf4, 0xe3, 0xd0, 0x4e, 0xb5, 0xc9, 0xdf, 0x19, 0xad, 0x1e, 0x71, 0xf4, 0xa8, 0xc9, 0xdc, 0xae, 0xc9, 0xb1, 0x7d, 0xfe, 0x7f, 0xde, 0x4f, 0xc5, 0xb5, 0xdb, 0xbb, 0x94, 0x49, 0x5e, 0xb2, 0x6e, 0xc0, 0x2a, 0xfa, 0xcf, 0x38, 0x35, 0xc5, 0xec, 0x9d, 0x06, 0x88, 0x3d, 0x20, 0x62, 0x0a, 0x39, 0xe5, 0x27, 0xbc, 0x61, 0xfc, 0x78, 0x48, 0x7f, 0x93, 0x1a, 0x6c, 0x30, 0x6a, 0x1e, 0x09, 0xa0, 0x87, 0xc1, 0x77, 0x95, 0x2a, 0x90, 0x1c, 0xaf, 0x03, 0xd0, 0x3d, 0xee, 0xa3, 0x1c, 0x13, 0x74, 0x31, 0x50, 0x22, 0x8c, 0x5e, 0xa6, 0xc6, 0xec, 0x9a, 0x1f, 0x0f, 0x37, 0x89, 0x25, 0xce, 0xc6, 0xb0, 0x6e, 0xf0, 0xa8, 0x75, 0x23, 0x0b, 0xe7, 0x46, 0x42, 0x37, 0x0d, 0x18, 0x41, 0x1f, 0xe7, 0x13, 0xf4, 0x58, 0x89, 0x8b, 0xb0, 0xf1, 0x92, 0x33, 0xb1, 0x4b, 0xb2, 0x8d, 0xb9, 0x2a, 0x69, 0xa5, 0xfa, 0x0d, 0x11, 0xff, 0x36, 0xbb, 0x1e, 0xce, 0x25, 0x1f, 0xa5, 0x66, 0x17, 0x55, 0x1b, 0xf4, 0xda, 0x05, 0x60, 0x6d, 0xde, 0xf0, 0xfb, 0xc4, 0x97, 0xc8, 0xa8, 0x60, 0x23, 0x45, 0x10, 0xcd, 0x2d, 0x75, 0xd7, 0xb2, 0x11, 0x54, 0xdb, 0x03, 0x40, 0x9c, 0xbb, 0x77, 0xe7, 0xde, 0x97, 0x3d, 0xcb, 0xd2, 0x17, 0xeb, 0x77, 0xec, 0xaf, 0xb7, 0x9a, 0x2f, 0x21, 0xe9, 0xab, 0x46, 0x43, 0x90, 0xce, 0xd1, 0x02, 0x74, 0xfb, 0xfd, 0xa7, 0x4d, 0x5d, 0x57, 0x59, 0x32, 0xf8, 0xe2, 0xe3, 0x54, 0x8f, 0x66, 0xb8, 0xec, 0xc5, 0x0c, 0x34, 0x72, 0x82, 0x28, 0x25, 0x10, 0x98, 0x56, 0x8a, 0x56, 0xa7, 0xc8, 0x9b, 0x2f, 0x3e, 0xde, 0x09, 0x14, 0x42, 0xf7, 0x86, 0x7f, 0x94, 0x88, 0x88, 0xa3, 0xee, 0x6b, 0x4a, 0x5a, 0x0e, 0x79, 0x14, 0x5f, 0x17, 0x5a, 0xbd, 0xbd, 0x34, 0x9c, 0x6e, 0x87, 0x7e, 0x03, 0xa8, 0xca, 0x20, 0x20, 0x89, 0xc0, 0xb8, 0x25, 0x4b, 0x46, 0x01, 0xf8, 0x0d, 0x90, 0xb0, 0x86, 0xd6, 0x1c, 0x9b, 0x5a, 0xd7, 0xe4, 0x20, 0x6e, 0xf0, 0xd8, 0xc5, 0x41, 0x76, 0x8b, 0x1c, 0x29, 0x34, 0x2d, 0xea, 0xeb, 0xaf, 0xb9, 0x87, 0x89, 0xaf, 0x6f, 0x88, 0x5b, 0xfa, 0x85, 0x9c, 0x61, 0x63, 0x1a, 0xb4, 0xd8, 0x03, 0x6b, 0x67, 0x0b, 0xc7, 0x49, 0x94, 0x6c, 0x2b, 0xcb, 0x49, 0xe3, 0x44, 0x40, 0xe3, 0x66, 0x04, 0x67, 0x77, 0xca, 0xba, 0xe3, 0x71, 0xd9, 0xd8, 0xe9, 0x7b, 0xa4, 0xf9, 0x3c, 0xa1, 0x1b, 0x22, 0x5b, 0xb2, 0xda, 0x48, 0xf8, 0xe9, 0x46, 0x13, 0xad, 0xcc, 0xd9, 0xe2, 0xeb, 0x55, 0xba, 0x0f, 0x33, 0x50, 0x91, 0x74, 0x88, 0x04, 0x99, 0x2e, 0x24, 0x15, 0xf7, 0xa0, 0x6a, 0xa9, 0x4a, 0xbb, 0x1c, 0xca, 0x83, 0x7d, 0xce, 0x0c, 0xf7, 0xb8, 0x9a, 0x6f, 0xb2, 0x15, 0x16, 0x86, 0x0e, 0x58, 0x83, 0xd9, 0x85, 0xe6, 0x47, 0x89, 0xc4, 0x84, 0x9e, 0x32, 0x00, 0x61, 0x8c, 0x15, 0x8d, 0x57, 0x16, 0x77, 0xad, 0x6e, 0xb1, 0x44, 0xa6, 0xa2, 0xfb, 0xf8, 0x17, 0xe6, 0xa9, 0xbf, 0x8b, 0x68, 0xc0, 0xdb, 0x4f, 0x17, 0x09, 0x47, 0x81, 0x63, 0xbe, 0x9a, 0x6a, 0x43, 0x8a, 0x2d, 0x0e, 0x7d, 0xb1, 0x80, 0x00, 0x22, 0x8a, 0xda, 0x7b, 0x57, 0x36, 0x30, 0xaf, 0x5b, 0x8c, 0x48, 0x59, 0xc6, 0x53, 0x1f, 0x96, 0x0f, 0xb4, 0x87, 0xf9, 0x51, 0xee, 0x14, 0xdb, 0x4f, 0x4c, 0x39, 0xf2, 0xb5, 0x55, 0xaf, 0x26, 0xa1, 0x42, 0x16, 0x9f, 0x61, 0xb5, 0xdf, 0x23, 0x7f, 0xa7, 0x69, 0x9f, 0xfa, 0xa2, 0x6a, 0x03, 0xd7, 0x31, 0x91, 0x53, 0xd8, 0x96, 0x6a, 0xfb, 0x8c, 0xba, 0x81, 0x64, 0x88, 0x6a, 0xca, 0xc4, 0xf3, 0xbf, 0x40, 0x3a, 0x48, 0xde, 0xcd, 0x1a, 0x57, 0xe2, 0x6a, 0x86, 0x8d, 0x17, 0x87, 0x3e, 0x76, 0x69, 0xad, 0xb8, 0x80, 0x1c, 0x62, 0x74, 0x02, 0xbd, 0x4d, 0x8a, 0x7c, 0x58, 0x9a, 0x85, 0x21, 0xeb, 0xa0, 0x73, 0x92, 0x1b, 0xc1, 0x3d, 0xed, 0x26, 0x92, 0x35, 0x06, 0x19, 0x3c, 0xee, 0xf4, 0x43, 0x23, 0x50, 0xd0, 0xe9, 0xc5, 0xeb, 0xb9, 0x3b, 0xe4, 0x8c, 0x1b, 0x87, 0xe7, 0x0e, 0x31, 0xad, 0x7e, 0x73, 0xc9, 0xd3, 0x85, 0x34, 0x48, 0x59, 0x2b, 0xd4, 0xed, 0x0f, 0x53, 0xbb, 0x5a, 0xa6, 0x3a, 0x42, 0x50, 0x65, 0x5a, 0x0b, 0xba, 0x1d, 0x8f, 0x93, 0xed, 0x5f, 0x79, 0x0a, 0x2e, 0xec, 0x21, 0x62, 0x74, 0x6d, 0xdf, 0xa6, 0x70, 0x65, 0x7b, 0x8d, 0xcb, 0x63, 0x92, 0x4f, 0xaf, 0x7c, 0x3b, 0xb7, 0x88, 0xf8, 0xeb, 0x79, 0x0c, 0x4c, 0x96, 0xc7, 0x79, 0x49, 0x17, 0x1f, 0x1d, 0x92, 0xd2, 0x67, 0x1c, 0x53, 0x98, 0x3b, 0x6e, 0x30, 0xcb, 0x86, 0x27, 0x7c, 0xc2, 0x4f, 0xfb, 0xac, 0x6e, 0xd6, 0x01, 0x0b, 0x3e, 0xe0, 0xb7, 0xaf, 0x41, 0x4f, 0x47, 0xab, 0x8b, 0xf5, 0x08, 0x86, 0xd9, 0xaa, 0x48, 0xec, 0x78, 0x9c, 0x49, 0xa4, 0x62, 0xe7, 0x89, 0xc2, 0xab, 0x66, 0x46, 0x1e, 0x1b, 0xc8, 0x42, 0x04, 0x1d, 0xe6, 0xc4, 0x2d, 0xd7, 0x53, 0xdf, 0xee, 0x9b, 0x35, 0xf6, 0xb0, 0x7e, 0x54, 0x80, 0xa0, 0x46, 0x71, 0x09, 0xa8, 0x8a, 0xd9, 0x79, 0x9d, 0x14, 0x3a, 0x99, 0xba, 0x8a, 0xb4, 0xd3, 0x4d, 0x4e, 0x33, 0x3a, 0xb0, 0xa2, 0xfd, 0xca, 0x7b, 0x10, 0x87, 0xf0, 0xf8, 0x09, 0x8d, 0x4d, 0xd7, 0xcc, 0x61, 0xb7, 0x23, 0x89, 0x84, 0x80, 0x75, 0xc6, 0x73, 0xfb, 0x68, 0x03, 0xc3, 0x3d, 0x4c, 0x99, 0x70, 0x21, 0x1f, 0xe8, 0x73, 0x8f, 0xb9, 0xb1, 0x92, 0xfd, 0x46, 0xc1, 0x7c, 0x35, 0xf9, 0xd0, 0x15, 0x59, 0xff, 0xa8, 0x0f, 0x25, 0xb2, 0x8a, 0xba, 0x75, 0x10, 0xcd, 0x1d, 0x07, 0x6b, 0xc8, 0x45, 0x81, 0x61, 0xf2, 0xdd, 0xb6, 0x0f, 0x48, 0xff, 0x25, 0x82, 0xef, 0x4a, 0xc2, 0x6e, 0x1b, 0x35, 0xfa, 0x23, 0x2f, 0xa2, 0xf1, 0xbc, 0x26, 0xb7, 0x0e, 0x9a, 0x31, 0xe9, 0xb9, 0x11, 0xa1, 0x59, 0x63, 0x60, 0x08, 0x64, 0xc7, 0xe7, 0x9b, 0x75, 0x70, 0x94, 0xdb, 0x1e, 0x7c, 0x9f, 0x75, 0x68, 0x9f, 0x77, 0x66, 0x67, 0x6b, 0xfc, 0x62, 0x11, 0xce, 0xee, 0x77, 0x50, 0xdc, 0xa5, 0xee, 0x55, 0xce, 0x03, 0x72, 0x30, 0x4b, 0xa8, 0x74, 0x9d, 0xe7, 0x64, 0xcd, 0x21, 0xea, 0xf2, 0xa5, 0x56, 0x52, 0xe3, 0x94, 0x83, 0x1b, 0xd8, 0x08, 0x70, 0xbd, 0xf4, 0xe7, 0x79, 0xf7, 0x91, 0x75, 0xe0, 0xcb, 0x32, 0x77, 0x68, 0xca, 0xb9, 0x99, 0x1f, 0x91, 0xdb, 0x0d, 0x7b, 0x94, 0xd0, 0x75, 0xa8, 0x1a, 0x4f, 0x03, 0x21, 0x89, 0xb9, 0xde, 0x7e, 0xe4, 0x95, 0xc8, 0x8c, 0x92, 0x3c, 0xff, 0xa3, 0x61, 0xd5, 0x60, 0x34, 0xca, 0x84, 0xd2, 0xa2, 0x77, 0xdf, 0xe2, 0x53, 0x02, 0xa2, 0xab, 0x06, 0x00, 0xa3, 0xf9, 0x67, 0x3e, 0x08, 0xae, 0xe0, 0x4a, 0xb7, 0x64, 0xb3, 0x35, 0x0e, 0x53, 0x46, 0x98, 0xd5, 0x75, 0xbd, 0xd5, 0x70, 0xe9, 0xce, 0x9f, 0x59, 0x96, 0xd1, 0xbd, 0xce, 0x10, 0x17, 0x0a, 0xc7, 0xbf, 0x7d, 0xc1, 0x2b, 0x3e, 0x41, 0xf7, 0x43, 0x01, 0x14, 0x69, 0x6f, 0x3b, 0x70, 0x78, 0x18, 0xfe, 0x2b, 0x72, 0xe5, 0xa4, 0x4d, 0x13, 0x32, 0x6f, 0x1f, 0x4c, 0xbe, 0x6c, 0x84, 0x42, 0xa3, 0x9d, 0x8c, 0x9a, 0x8c, 0x56, 0x47, 0xf4, 0x22, 0xe8, 0xd7, 0xb5, 0xc7, 0x7d, 0xc9, 0x0a, 0x87, 0x43, 0xa6, 0x2a, 0x4b, 0xcd, 0xc4, 0xdb, 0x50, 0xb6, 0x62, 0x37, 0xd8, 0x87, 0xf4, 0xb0, 0x20, 0xda, 0xbc, 0x52, 0x91, 0xc0, 0x9a, 0x48, 0x3a, 0x61, 0x25, 0xa2, 0x7e, 0xe2, 0xfa, 0x55, 0x0a, 0x8c, 0x55, 0x83, 0x0b, 0x2a, 0xde, 0xfd, 0x9d, 0xb2, 0xc5, 0x07, 0x86, 0x28, 0x10, 0x5b, 0x24, 0xc0, 0x34, 0x70, 0xa4, 0x43, 0xe3, 0xfb, 0x75, 0xb3, 0x26, 0xb7, 0xfc, 0x32, 0xab, 0x61, 0x8a, 0x20, 0x60, 0x07, 0x8b, 0x84, 0x41, 0x83, 0x00, 0xad, 0x6d, 0x43, 0x2f, 0x19, 0x80, 0x4b, 0x98, 0x95, 0x1d, 0x7c, 0x2c, 0xa6, 0xca, 0x16, 0xba, 0x28, 0x01, 0x7c, 0xaa, 0x35, 0x83, 0x37, 0xed, 0x48, 0xf0, 0x3e, 0x34, 0xa2, 0x95, 0x74, 0x60, 0xed, 0x85, 0x73, 0x3a, 0x20, 0xeb, 0x88, 0x65, 0xa2, 0x9e, 0xfe, 0x91, 0xb2, 0xf6, 0xa0, 0xf0, 0x06, 0xdf, 0x79, 0xee, 0xb2, 0x2b, 0xde, 0x1d, 0x4c, 0x2d, 0xaf, 0x6e, 0x4e, 0x83, 0xd9, 0xa7, 0xbb, 0x33, 0x1f, 0x11, 0x06, 0xfa, 0x1b, 0x71, 0x2f, 0xe0, 0x7f, 0x3a, 0x2f, 0x10, 0xa1, 0x01, 0x96, 0xe7, 0x37, 0x31, 0x73, 0x4b, 0x5e, 0x00, 0x74, 0x3e, 0xe2, 0xa2, 0x4e, 0xb2, 0xb9, 0xbc, 0x5f, 0x9f, 0xd0, 0x1b, 0x92, 0x54, 0x0b, 0xa6, 0x84, 0x0b, 0x87, 0x91, 0xe5, 0xbf, 0x22, 0xd4, 0x20, 0x42, 0x3d, 0xdc, 0x3e, 0x8a, 0xc0, 0x80, 0x07, 0x4b, 0x5f, 0x36, 0x6b, 0xcc, 0x1c, 0x87, 0x21, 0xf3, 0x0d, 0xc0, 0x8e, 0xa1, 0x60, 0xeb, 0xe8, 0x46, 0x9c, 0xfd, 0x9b, 0xac, 0x29, 0x51, 0xec, 0x17, 0x13, 0x55, 0xdc, 0x90, 0x0b, 0x84, 0x4f, 0x7e, 0xaf, 0x94, 0x6d, 0x76, 0x0b, 0xf0, 0x49, 0x54, 0x5f, 0x68, 0xc0, 0x8b, 0x22, 0x27, 0xa5, 0xb9, 0x48, 0xe6, 0x1b, 0x7f, 0xc1, 0x60, 0x41, 0x8f, 0x42, 0x06, 0x15, 0x06, 0x47, 0xf3, 0x92, 0xfd, 0x59, 0x22, 0x1c, 0x5a, 0x8c, 0xdf, 0x1e, 0xec, 0x4d, 0x7b, 0xf2, 0xb8, 0x5a, 0x44, 0x01, 0x8d, 0x12, 0xb4, 0x2b, 0xdf, 0xef, 0xe9, 0x69, 0xd2, 0x51, 0x55, 0xb0, 0x94, 0x7d, 0xb7, 0x19, 0xf0, 0xe5, 0x4a, 0x40, 0x20, 0xaa, 0x3c, 0xe9, 0xe3, 0x5f, 0x61, 0xea, 0xd0, 0x10, 0x29, 0x45, 0xea, 0x82, 0xd0, 0x94, 0x74, 0xbd, 0xd4, 0xaa, 0x07, 0xc8, 0xac, 0x77, 0xe1, 0xb4, 0xb7, 0x2c, 0x80, 0xdb, 0x73, 0xa0, 0x70, 0x6a, 0xef, 0xf2, 0x61, 0x1d, 0x83, 0x71, 0x7c, 0x4a, 0xbe, 0xb8, 0xf7, 0x21, 0xa0, 0x1d, 0xe7, 0x32, 0x09, 0x4d, 0x56, 0x30, 0x72, 0x30, 0x96, 0xf4, 0xdb, 0x13, 0xd4, 0xc4, 0x04, 0x05, 0xf0, 0xd6, 0xe0, 0x81, 0x8d, 0x10, 0x47, 0x4e, 0x64, 0x12, 0xeb, 0xa4, 0xdd, 0x76, 0x8d, 0x90, 0xe0, 0x56, 0x71, 0x99, 0xe8, 0x0f, 0x0f, 0xa4, 0x5a, 0x45, 0x0b, 0x15, 0x16, 0x28, 0x67, 0x37, 0x4b, 0xf5, 0xf8, 0xde, 0x8f, 0xbf, 0x16, 0x4b, 0x2f, 0x6f, 0x98, 0x4f, 0xc3, 0x0a, 0x00, 0xb4, 0x06, 0x32, 0xf2, 0xd8, 0xe5, 0xf0, 0xeb, 0x9b, 0xd6, 0xb0, 0x2f, 0x7b, 0x6b, 0x8d, 0x03, 0xfe, 0x27, 0xcf, 0x1d, 0x51, 0x90, 0xb2, 0x59, 0x2e, 0x85, 0x6a, 0xad, 0x02, 0xd2, 0x63, 0x5f, 0x50, 0x02, 0xcd, 0x75, 0x50, 0x75, 0x58, 0x6e, 0xdd, 0xb2, 0x3c, 0x2f, 0x8e, 0xfd, 0x7d, 0x40, 0x22, 0x2d, 0x6d, 0x38, 0x21, 0xb8, 0x72, 0x76, 0xc0, 0x10, 0x09, 0x12, 0x05, 0x32, 0x0b, 0x13, 0x2d, 0x7b, 0x30, 0xe3, 0x4b, 0xbe, 0xd1, 0x00, 0x31, 0x95, 0xf2, 0xf3, 0x93, 0xf4, 0x7f, 0x86, 0x6a, 0x04, 0xd6, 0x32, 0x97, 0x2e, 0x86, 0xd7, 0xc9, 0x75, 0x56, 0xb0, 0xa0, 0x0a, 0x8a, 0x85, 0x13, 0x1a, 0x61, 0x22, 0x0f, 0xeb, 0xe2, 0x09, 0x60, 0x27, 0xd8, 0x64, 0xd5, 0x78, 0x1c, 0x3d, 0x9f, 0x54, 0x12, 0xf1, 0xfb, 0x1b, 0x76, 0xe2, 0x11, 0x5f, 0x59, 0x6d, 0x1b, 0x82, 0x66, 0x1c, 0xc9, 0x87, 0x6a, 0x1c, 0xe4, 0x22, 0x14, 0xf1, 0x33, 0x11, 0xf9, 0x68, 0x9b, 0xaf, 0xda, 0xcd, 0x89, 0xc7, 0x2a, 0x5f, 0x95, 0xa6, 0xcb, 0x01, 0x5f, 0x74, 0x19, 0x32, 0xbd, 0xc4, 0x29, 0x3f, 0x19, 0x69, 0x52, 0xb7, 0x14, 0x8b, 0xed, 0x20, 0x6f, 0xfb, 0x5a, 0xe8, 0x2c, 0xc4, 0x44, 0x9f, 0xf0, 0x03, 0x25, 0x63, 0xac, 0xf8, 0x0c, 0x9b, 0x7c, 0x5c, 0x9e, 0xe8, 0xd0, 0xf5, 0x5a, 0x58, 0xc9, 0x69, 0x22, 0xdd, 0xe6, 0x50, 0xf7, 0xfe, 0xdf, 0x8c, 0x05, 0xcd, 0xd1, 0xdd, 0xdf, 0x19, 0x9c, 0xb0, 0x0b, 0xe4, 0x89, 0x38, 0xc1, 0x17, 0x31, 0xc0, 0xf0, 0x75, 0x9a, 0x40, 0x82, 0xce, 0xa2, 0x2e, 0xe1, 0x75, 0xa1, 0x96, 0xba, 0xf4, 0x4a, 0x6d, 0x01, 0xfd, 0xd2, 0x23, 0x35, 0xa4, 0x55, 0x77, 0xe5, 0xcc, 0x75, 0x8f, 0x73, 0xdf, 0x44, 0x48, 0x18, 0xc3, 0x64, 0xcb, 0x28, 0x09, 0x6c, 0x61, 0x97, 0x67, 0x8e, 0x88, 0xbd, 0x68, 0x77, 0x46, 0x56, 0x62, 0x77, 0xbd, 0xcd, 0xa9, 0xe2, 0x00, 0xba, 0x02, 0xb6, 0x25, 0xa9, 0x5a, 0x7d, 0x9b, 0x1d, 0xb8, 0x75, 0xbe, 0xd4, 0x71, 0xef, 0xa9, 0x4d, 0x9b, 0xf5, 0x4b, 0x88, 0xc3, 0x2f, 0xbe, 0x0d, 0xe3, 0x08, 0xd3, 0x2f, 0x8e, 0x0c, 0xf2, 0x92, 0x6e, 0x94, 0x21, 0xeb, 0xf0, 0xa6, 0x62, 0x07, 0x3e, 0x17, 0x42, 0x0f, 0x6e, 0xf2, 0xaf, 0x0a, 0xf8, 0x1e, 0x0a, 0xa3, 0x6e, 0x3a, 0x7d, 0x2c, 0x67, 0xcc, 0x8f, 0xe4, 0xbd, 0x9b, 0xf5, 0x75, 0xf8, 0x59, 0xab, 0xc1, 0x09, 0x85, 0x44, 0xde, 0x3c, 0x90, 0x7f, 0x5f, 0x68, 0x3f, 0x1a, 0xd6, 0x68, 0x50, 0xeb, 0x97, 0xcf, 0x60, 0x2c, 0xbe, 0xd8, 0x0c, 0x17, 0x73, 0x9c, 0x57, 0xb3, 0x6c, 0x88, 0x4b, 0xed, 0xb4, 0x0d, 0xe4, 0xea, 0xab, 0x99, 0x29, 0x9c, 0x4f, 0xc7, 0x9c, 0x93, 0xb9, 0xd3, 0xd4, 0x16, 0xea, 0x50, 0x69, 0x73, 0xc8, 0x1d, 0x10, 0x93, 0x64, 0x95, 0x07, 0xd1, 0x7e, 0x06, 0xb4, 0x0c, 0x4b, 0x64, 0x89, 0xfb, 0x76, 0x3f, 0x2a, 0xc1, 0x64, 0xf3, 0xd2, 0xc2, 0xbc, 0x1f, 0xf3, 0xb4, 0x27, 0x58, 0x1c, 0xf9, 0x54, 0x1e, 0x20, 0x2c, 0x40, 0x0e, 0x75, 0xfa, 0xb4, 0x5a, 0xda, 0x33, 0x0f, 0x77, 0x3c, 0x20, 0x45, 0x15, 0xdb, 0x18, 0x28, 0x54, 0xa9, 0x4e, 0xe6, 0x35, 0xf2, 0xed, 0xd3, 0x4e, 0x42, 0x67, 0x69, 0xc3, 0x84, 0x09, 0x8d, 0x71, 0x67, 0xd4, 0x14, 0x6c, 0x06, 0x88, 0x86, 0xac, 0xc7, 0x01, 0x22, 0x03, 0x83, 0xc6, 0x22, 0x52, 0xe8, 0xe0, 0x40, 0xfd, 0x1c, 0xe8, 0x78, 0x9c, 0xa3, 0x64, 0x10, 0xf4, 0x83, 0x54, 0xd6, 0x25, 0xa6, 0x07, 0xa9, 0x24, 0x7f, 0x33, 0x3a, 0x6c, 0xf1, 0x45, 0x14, 0xf1, 0x6c, 0xf6, 0xda, 0x56, 0x59, 0x1f, 0xd0, 0x5f, 0xb8, 0xce, 0x9d, 0xa9, 0x07, 0x99, 0x50, 0x99, 0x66, 0x32, 0xa0, 0x92, 0xfa, 0x3c, 0x78, 0x6b, 0x8f, 0x5d, 0xb3, 0x20, 0x81, 0x95, 0x24, 0xc7, 0xdc, 0xce, 0xd9, 0xc6, 0xc2, 0xb4, 0xa0, 0x44, 0x0d, 0xc6, 0xcb, 0xdd, 0x36, 0xad, 0x31, 0x9a, 0x76, 0xcd, 0x75, 0x20, 0x2a, 0x1b, 0x8b, 0x27, 0x7c, 0x2e, 0x77, 0x2e, 0x40, 0x98, 0x58, 0x6d, 0x1c, 0x76, 0xa6, 0x0c, 0xec, 0x46, 0xb8, 0x92, 0x64, 0xf9, 0x89, 0xa0, 0xf7, 0x49, 0xbb, 0xdf, 0xf8, 0x4d, 0xdc, 0x37, 0x00, 0x4b, 0xe9, 0x42, 0x8f, 0xcd, 0x10, 0x00, 0xf6, 0xf7, 0xba, 0xcc, 0x74, 0x17, 0xc9, 0x8e, 0x9f, 0x7e, 0x1e, 0x33, 0x05, 0x8f, 0x5f, 0x5a, 0x14, 0x15, 0xf7, 0x50, 0x37, 0xda, 0x5e, 0x3f, 0x42, 0x75, 0x9a, 0xa2, 0x10, 0x63, 0x06, 0xfc, 0x6a, 0x59, 0x52, 0xca, 0x2b, 0xd9, 0xcb, 0xb6, 0xa2, 0x04, 0xdc, 0x0d, 0x38, 0xaf, 0xd5, 0x73, 0x53, 0xb8, 0xec, 0xd6, 0x7a, 0x9a, 0x82, 0xa0, 0xb9, 0x40, 0xa7, 0x31, 0x47, 0x17, 0xdf, 0x8c, 0x66, 0x67, 0x26, 0x50, 0x8b, 0xe3, 0x33, 0xeb, 0xbf, 0x7f, 0xfa, 0x0a, 0x45, 0x81, 0x74, 0x53, 0x7d, 0xdb, 0xa2, 0x57, 0x08, 0xb8, 0xd0, 0xc2, 0x2d, 0x55, 0x17, 0xd5, 0x7b, 0x12, 0x25, 0x17, 0xb0, 0xc9, 0x41, 0x47, 0xda, 0x5e, 0x89, 0x94, 0xbc, 0x97, 0x7e, 0x11, 0x73, 0x2e, 0xc3, 0x63, 0x5a, 0x25, 0x22, 0xbc, 0x2a, 0x5a, 0xd0, 0x0e, 0x66, 0x5b, 0xf2, 0x78, 0xf6, 0x7b, 0x5f, 0x05, 0x11, 0x26, 0xa8, 0x95, 0x61, 0x71, 0x56, 0x1b, 0x62, 0xf5, 0x72, 0x09, 0x0c, 0xde, 0x4b, 0x09, 0xb1, 0x3f, 0x73, 0xee, 0x28, 0xa9, 0x0b, 0xea, 0x2b, 0xfb, 0x40, 0x01, 0xfe, 0x7b, 0x16, 0xbd, 0x51, 0x26, 0x65, 0x24, 0x68, 0x45, 0x20, 0xe7, 0x79, 0x41, 0xdd, 0xdc, 0x56, 0xb8, 0x92, 0xae, 0x4b, 0xd0, 0x9d, 0xd4, 0x4a, 0xcc, 0x08, 0xbf, 0x45, 0xdd, 0x0a, 0x58, 0xdc, 0x3a, 0xd1, 0xa9, 0x38, 0x72, 0x7e, 0xda, 0x37, 0x01, 0x72, 0x60, 0xc9, 0x22, 0xc8, 0x71, 0x9a, 0xe5, 0x22, 0xbb, 0xf1, 0x81, 0xa9, 0x55, 0xd8, 0xeb, 0x4f, 0xf6, 0x7d, 0xa8, 0x58, 0x65, 0xd8, 0xdf, 0x18, 0x30, 0x8e, 0xb2, 0xfe, 0xa1, 0x15, 0xce, 0xd1, 0xee, 0x19, 0x41, 0x3a, 0xb0, 0x1f, 0x8d, 0x83, 0x96, 0x69, 0xfa, 0x9e, 0x5b, 0x19, 0x30, 0x69, 0xf5, 0x99, 0x04, 0x30, 0x10, 0x39, 0x93, 0x73, 0xba, 0x1a, 0x8d, 0xea, 0x60, 0x4c, 0xd4, 0xc7, 0xf9, 0x33, 0x46, 0x3b, 0x81, 0x2f, 0xd6, 0x3b, 0xa9, 0x7b, 0xe2, 0x84, 0xcd, 0x56, 0xc1, 0xdd, 0x26, 0x61, 0x9b, 0x9c, 0x41, 0x49, 0x7d, 0x6b, 0xaf, 0xa5, 0xac, 0x4c, 0xff, 0x22, 0x3a, 0xdb, 0xe9, 0xdd, 0xd8, 0xd3, 0xcc, 0x10, 0xeb, 0xd4, 0x5b, 0xf1, 0xe2, 0x64, 0x92, 0xd7, 0xc6, 0x33, 0xf0, 0x9f, 0x12, 0xa3, 0xe0, 0x4e, 0xc6, 0x87, 0x78, 0xf7, 0xb7, 0x2b, 0x65, 0xe0, 0x29, 0x96, 0x26, 0xe0, 0x9f, 0x0b, 0x79, 0x0b, 0xf2, 0xd6, 0x13, 0x92, 0xa1, 0x45, 0x94, 0xe4, 0x68, 0xf4, 0xba, 0x19, 0x14, 0x4d, 0xd5, 0x91, 0x95, 0x50, 0x7b, 0xd8, 0x55, 0x90, 0x7c, 0xcd, 0xc8, 0x7e, 0x18, 0x04, 0x45, 0xea, 0x70, 0x68, 0x14, 0xc7, 0x3b, 0x25, 0xc8, 0x2f, 0xba, 0xc5, 0xce, 0xa7, 0xee, 0x98, 0x47, 0xa3, 0x08, 0x5a, 0x13, 0x4d, 0x21, 0x10, 0x2e, 0x82, 0x2b, 0x33, 0x40, 0x1d, 0x28, 0x10, 0x6f, 0x79, 0x9a, 0x6f, 0x78, 0x31, 0x3a, 0x73, 0xfe, 0x2a, 0xec, 0xc1, 0x22, 0xd4, 0xf3, 0xe4, 0x53, 0xac, 0x61, 0xf1, 0x67, 0x06, 0xd2, 0x66, 0xeb, 0x09, 0x5a, 0x58, 0xb8, 0xfb, 0xbc, 0xce, 0xc7, 0xbf, 0xdd, 0x68, 0x47, 0x9b, 0x78, 0x44, 0xec, 0x3f, 0x12, 0x21, 0x89, 0x03, 0x31, 0xc5, 0xe1, 0x71, 0xc9, 0x9d, 0xbb, 0x03, 0xf7, 0xa4, 0x34, 0x2d, 0xf1, 0x85, 0x59, 0x9e, 0x3e, 0x04, 0xf5, 0xc4, 0x22, 0x9a, 0xa8, 0x8e, 0x5d, 0x5f, 0x39, 0x75, 0x15, 0x2e, 0x2d, 0xbd, 0x10, 0x03, 0x99, 0xf8, 0x26, 0xa7, 0x34, 0xcd, 0xf6, 0x90, 0xb0, 0xf7, 0xd9, 0x02, 0x4b, 0x90, 0x14, 0x7b, 0xa1, 0x90, 0x52, 0x4e, 0xc4, 0x91, 0x51, 0x8e, 0x8e, 0xd5, 0xdb, 0x2d, 0x36, 0x89, 0xf8, 0x65, 0x22, 0x4b, 0x62, 0x57, 0xfc, 0xeb, 0x39, 0xf3, 0x08, 0x6e, 0xf8, 0x17, 0xb5, 0x59, 0xa8, 0xfb, 0x72, 0x2c, 0x53, 0xcc, 0xc2, 0x2c, 0xbc, 0x97, 0x93, 0x65, 0x4d, 0x69, 0xcc, 0xf0, 0x51, 0xb5, 0x25, 0x72, 0x63, 0xf5, 0x3b, 0xe5, 0x26, 0x94, 0xe4, 0x9b, 0x37, 0x0c, 0xbf, 0x7f, 0x60, 0x4c, 0x10, 0x9f, 0x0f, 0x5c, 0xcb, 0xe7, 0x06, 0x43, 0xef, 0x2f, 0x53, 0x29, 0x15, 0x79, 0x83, 0xb9, 0x49, 0x73, 0x13, 0xc9, 0x18, 0x44, 0x27, 0x3d, 0xea, 0x84, 0x7e, 0x28, 0x93, 0x8c, 0xa6, 0x35, 0x24, 0xf1, 0x6c, 0x46, 0x07, 0x4b, 0x97, 0x5a, 0x4b, 0x3b, 0xd6, 0xb4, 0x3c, 0xac, 0xf6, 0x3a, 0x37, 0x58, 0x58, 0x1b, 0xbc, 0x8e, 0xa3, 0xb4, 0xc5, 0x33, 0xb6, 0xb5, 0x56, 0x08, 0xe1, 0x7f, 0x56, 0x2a, 0x54, 0xd1, 0x9d, 0xdf, 0xd7, 0xa4, 0x4e, 0x8f, 0xbc, 0x53, 0x67, 0x11, 0x12, 0xff, 0x96, 0x29, 0x1c, 0x32, 0x4f, 0x4e, 0x02, 0xc2, 0x1b, 0xb0, 0xc5, 0xf9, 0x33, 0x79, 0x78, 0xf2, 0x4d, 0x53, 0xae, 0x46, 0xb6, 0x2b, 0x2f, 0xe9, 0xa1, 0x35, 0xef, 0x4e, 0xbf, 0x31, 0x40, 0xd2, 0x0f, 0xec, 0x46, 0x57, 0xf8, 0x09, 0xab, 0x2f, 0x95, 0x01, 0x95, 0x3d, 0x50, 0x69, 0xd5, 0x56, 0xb2, 0x74, 0x62, 0xed, 0x79, 0xb8, 0x05, 0xf0, 0xeb, 0x35, 0x55, 0xed, 0x6b, 0x93, 0xe6, 0x79, 0x4a, 0xab, 0xbe, 0xd2, 0xdf, 0x49, 0x08, 0xc3, 0xda, 0x30, 0x0d, 0xc8, 0xd5, 0x5f, 0x5f, 0x73, 0x2c, 0x93, 0x57, 0x0e, 0x0f, 0x0d, 0xc2, 0x82, 0xd5, 0x95, 0xd8, 0x78, 0x93, 0xbf, 0x6e, 0xbd, 0xee, 0x6d, 0x6c, 0xeb, 0x2d, 0x95, 0x80, 0x46, 0x93, 0x45, 0x14, 0xe4, 0xeb, 0xe4, 0x7e, 0x11, 0x64, 0xba, 0x77, 0xf1, 0x9f, 0xb3, 0xcf, 0x67, 0x07, 0x5f, 0x5f, 0x36, 0x61, 0x3e, 0x3e, 0x66, 0xa3, 0x3b, 0x38, 0xea, 0x0a, 0x76, 0x7b, 0x7f, 0x67, 0x46, 0x94, 0xd7, 0xba, 0x7f, 0x9a, 0xf7, 0x01, 0xf0, 0xa9, 0xde, 0x52, 0x30, 0x92, 0x67, 0x28, 0x9b, 0xd1, 0x70, 0xfb, 0x97, 0xc0, 0x3c, 0x13, 0x1c, 0x0a, 0x16, 0x9d, 0x73, 0x61, 0x37, 0xff, 0x3d, 0x74, 0xea, 0x69, 0xb8, 0x1b, 0xee, 0xac, 0x3e, 0xd5, 0x1c, 0x50, 0x0e, 0x75, 0x49, 0xe0, 0x4f, 0x18, 0x6e, 0x89, 0x52, 0x5a, 0x07, 0xe4, 0x18, 0xca, 0xb8, 0x0f, 0x14, 0x9b, 0x36, 0x02, 0x31, 0x9c, 0x65, 0x20, 0x17, 0x6a, 0xbe, 0x0d, 0xaa, 0xe3, 0xf4, 0xc0, 0xd4, 0xdf, 0xd7, 0xd9, 0x85, 0x1b, 0x78, 0x34, 0xf8, 0x76, 0x8e, 0xbe, 0x37, 0x60, 0x18, 0x87, 0xe1, 0x8f, 0x44, 0x19, 0x2b, 0xf3, 0x90, 0x09, 0x25, 0xed, 0x2f, 0xcb, 0x3f, 0xbc, 0xae, 0xca, 0x0b, 0x38, 0xd7, 0xb8, 0x44, 0xc2, 0xd6, 0x23, 0x10, 0x7b, 0x9a, 0x4a, 0x82, 0xb4, 0x7e, 0x2e, 0x63, 0xa6, 0x29, 0xec, 0x32, 0x63, 0xb2, 0x49, 0x69, 0x0d, 0x08, 0x8f, 0x02, 0x46, 0x92, 0x98, 0x3a, 0xe7, 0x12, 0x28, 0x95, 0xf5, 0xcf, 0x80, 0x22, 0xd1, 0xf3, 0x2f, 0x00, 0xae, 0x32, 0x2c, 0x21, 0x48, 0xac, 0x22, 0x4e, 0xd4, 0x15, 0x0b, 0x6b, 0x32, 0x13, 0x00, 0xfd, 0x6a, 0xe7, 0x4f, 0xe9, 0x56, 0x50, 0xcf, 0x7e, 0x9c, 0xac, 0x70, 0xb6, 0xe0, 0x61, 0x16, 0xb9, 0x37, 0x7b, 0xa8, 0xa3, 0xde, 0x97, 0x63, 0x87, 0x2c, 0xff, 0x75, 0xb4, 0xc5, 0x16, 0xc7, 0x37, 0x11, 0xf7, 0x1a, 0xa1, 0xec, 0x59, 0x55, 0x0a, 0x9f, 0xb6, 0x1d, 0x55, 0x0f, 0xac, 0xa7, 0xb6, 0x35, 0xa3, 0xca, 0x72, 0xce, 0xb0, 0x59, 0xe6, 0x54, 0xb9, 0xaf, 0xcb, 0x2c, 0xda, 0x8b, 0xb8, 0x21, 0x08, 0x1f, 0xe8, 0x11, 0xf4, 0x63, 0x3e, 0xe6, 0x32, 0xaf, 0x86, 0xc8, 0x9b, 0x89, 0xfe, 0x92, 0xf0, 0xbc, 0x15, 0x82, 0xc0, 0xaa, 0x72, 0x34, 0x8b, 0xe2, 0x38, 0xd1, 0x27, 0xf5, 0x89, 0x84, 0x63, 0x86, 0x49, 0x2d, 0xeb, 0xa1, 0x24, 0x5a, 0x6b, 0x4e, 0xd2, 0x73, 0xf7, 0x65, 0x99, 0x34, 0xab, 0xa3, 0x14, 0x60, 0x8e, 0xfe, 0x34, 0xb4, 0xbc, 0x36, 0x84, 0x1a, 0xc5, 0xad, 0xb1, 0x20, 0x50, 0x78, 0x49, 0xa8, 0x04, 0xb6, 0xc3, 0xe1, 0xa8, 0x20, 0xc0, 0x76, 0x88, 0xe2, 0x90, 0x05, 0x1b, 0xaa, 0xf8, 0xd2, 0xe4, 0xfe, 0x32, 0xbd, 0x96, 0xd2, 0x36, 0x71, 0x7b, 0x5a, 0x38, 0xdf, 0x16, 0x1d, 0x72, 0xeb, 0x08, 0x4b, 0x23, 0x64, 0x30, 0x50, 0xd8, 0x3a, 0x16, 0xa9, 0xea, 0xeb, 0x8a, 0xf6, 0x48, 0x3f, 0x88, 0x51, 0x76, 0x35, 0x5f, 0xdf, 0xd6, 0x3d, 0x12, 0xa4, 0x27, 0xa7, 0xff, 0x9c, 0x4b, 0x5c, 0xbe, 0x07, 0x4d, 0xcc, 0x4c, 0x04, 0xa2, 0x27, 0x69, 0x61, 0xaf, 0xd0, 0x3e, 0xb2, 0x8c, 0x0f, 0x43, 0xa0, 0x08, 0x06, 0x60, 0x84, 0xed, 0xe6, 0x53, 0x35, 0x85, 0x62, 0x51, 0x1d, 0x5c, 0x64, 0xf0, 0x93, 0x48, 0xff, 0x44, 0x65, 0xa7, 0xa6, 0x48, 0xb3, 0xe8, 0x9b, 0x80, 0x04, 0x4d, 0xa9, 0xdd, 0x93, 0xee, 0x16, 0xe1, 0xea, 0x02, 0xd4, 0x03, 0xb2, 0x5a, 0xf7, 0x55, 0xca, 0x2e, 0x6c, 0x64, 0x96, 0x1c, 0xe7, 0x60, 0x9a, 0x6e, 0x1d, 0x7d, 0x47, 0x9c, 0x34, 0x98, 0x14, 0x11, 0x77, 0x1e, 0xd1, 0x32, 0x4f, 0x2a, 0x38, 0x9d, 0x6e, 0xed, 0xc6, 0xae, 0x4e, 0x53, 0xc9, 0x48, 0xda, 0xe3, 0xb9, 0xd2, 0x6b, 0xe8, 0xcb, 0x7f, 0xf5, 0xce, 0xc4, 0xd3, 0x83, 0xce, 0x0b, 0x63, 0xe0, 0xce, 0x03, 0xdc, 0x97, 0x82, 0x97, 0x46, 0x1e, 0xd8, 0x17, 0x8a, 0x4f, 0x93, 0x42, 0x32, 0x17, 0x35, 0xa4, 0x71, 0x72, 0x23, 0x22, 0x63, 0x97, 0x04, 0xd3, 0x95, 0x6f, 0x6a, 0x11, 0xc8, 0x4c, 0xb4, 0xd0, 0xf2, 0xd8, 0x33, 0x2f, 0x86, 0x4c, 0x8b, 0x4d, 0xf5, 0xe2, 0x5c, 0x5e, 0x75, 0x8c, 0x22, 0xfe, 0x01, 0xe6, 0x5a, 0xc4, 0xa1, 0x69, 0xe7, 0x1b, 0xeb, 0xe2, 0xb3, 0x4d, 0xca, 0x23, 0x99, 0xe1, 0x7e, 0xf9, 0x83, 0x27, 0xe4, 0x5e, 0xcf, 0x11, 0xf8, 0xef, 0xf8, 0x44, 0x98, 0xa0, 0x72, 0x6f, 0x8b, 0xae, 0xd5, 0xdc, 0xc1, 0xd5, 0x3e, 0x45, 0xdc, 0xc4, 0xf2, 0xe8, 0xf0, 0xce, 0x45, 0xdd, 0x87, 0xe2, 0xbb, 0xa8, 0xe9, 0xbd, 0x6c, 0x0b, 0x9a, 0x5e, 0xad, 0x1e, 0x23, 0xba, 0xec, 0xa1, 0x15, 0xb2, 0xdc, 0x90, 0x4c, 0x42, 0xd3, 0xf8, 0x71, 0xfb, 0x70, 0x0a, 0xc2, 0xb3, 0x80, 0x6d, 0x16, 0x7b, 0x22, 0xd9, 0x1b, 0xd1, 0x2a, 0xe2, 0xe3, 0x17, 0xc4, 0x11, 0x9f, 0x44, 0x5a, 0x39, 0xaa, 0xda, 0xb7, 0x08, 0xc9, 0x18, 0x6c, 0xdd, 0xb1, 0x70, 0x72, 0xd9, 0xc9, 0x3b, 0x12, 0x39, 0x32, 0xac, 0x02, 0xe3, 0x05, 0x02, 0xd1, 0x3e, 0xdb, 0x02, 0x84, 0x47, 0x93, 0xa5, 0x82, 0xe2, 0x4f, 0x0e, 0xad, 0x6d, 0xc0, 0xbe, 0xd2, 0x9b, 0xa4, 0x0b, 0x43, 0x80, 0x8c, 0xce, 0xc2, 0xe8, 0xe3, 0x5d, 0xa1, 0xed, 0x2c, 0xb9, 0x28, 0xc9, 0x8b, 0x08, 0x37, 0xe8, 0x87, 0x45, 0x2c, 0x42, 0x0e, 0x36, 0x07, 0xe7, 0xb9, 0x9e, 0xcd, 0xdb, 0x52, 0xb5, 0x2a, 0x25, 0x94, 0xd5, 0x59, 0x23, 0x31, 0x76, 0x49, 0x20, 0x1a, 0x5c, 0xf8, 0x28, 0xfa, 0x0f, 0x23, 0x1b, 0x03, 0x8c, 0x22, 0x01, 0xee, 0x3a, 0x0e, 0x9d, 0x3d, 0x1f, 0x24, 0x45, 0xc4, 0x54, 0x6e, 0xf1, 0x67, 0xb6, 0xa0, 0x91, 0x25, 0xdf, 0x40, 0xa4, 0x56, 0x55, 0x09, 0x06, 0x30, 0x00, 0x92, 0x09, 0x90, 0xe2, 0x2b, 0xc8, 0xf8, 0x02, 0x07, 0xb8, 0xd3, 0xa9, 0xa1, 0x80, 0x01, 0xd1, 0x58, 0x0b, 0x8f, 0xdb, 0x5c, 0xdb, 0xc6, 0x80, 0xce, 0xa0, 0x68, 0x0a, 0x23, 0x09, 0x36, 0xc4, 0xca, 0xda, 0xb5, 0xaf, 0x0e, 0x3f, 0x32, 0x76, 0x3d, 0x5f, 0x04, 0xa4, 0x0a, 0x35, 0x11, 0x15, 0x30, 0x9b, 0x94, 0xaa, 0x58, 0xa8, 0x1d, 0x41, 0x3d, 0x3c, 0xd9, 0xe5, 0x0e, 0xd9, 0x13, 0x41, 0x14, 0xb5, 0xfb, 0x5b, 0x94, 0x0d, 0xa6, 0x7f, 0xf7, 0xbb, 0x57, 0x78, 0x28, 0x0b, 0xfd, 0x07, 0x3e, 0xcb, 0xfc, 0x8d, 0x5b, 0xa1, 0x30, 0x0b, 0xd3, 0xa2, 0x2f, 0x4c, 0x91, 0x1f, 0xcf, 0x61, 0xb7, 0xc2, 0xe9, 0x4e, 0x85, 0xda, 0x5c, 0x03, 0x7c, 0xf4, 0x54, 0x8e, 0xc3, 0xab, 0xcc, 0x8e, 0xc9, 0xc1, 0x51, 0xeb, 0x2c, 0x6e, 0x09, 0xc4, 0xda, 0xf7, 0xf5, 0xa9, 0x76, 0x83, 0x73, 0x0b, 0xfd, 0x2b, 0x07, 0xf0, 0xa9, 0x50, 0x5a, 0xeb, 0x15, 0x31, 0x83, 0x4c, 0xa3, 0xbc, 0x86, 0x94, 0x1b, 0xa5, 0x1a, 0x2c, 0x94, 0xb6, 0xb0, 0x56, 0x98, 0x66, 0xb0, 0x63, 0x83, 0xac, 0x06, 0x27, 0x2c, 0x15, 0xdd, 0xaa, 0xc7, 0x15, 0xaa, 0x20, 0x0a, 0x9a, 0x6d, 0x1b, 0x8f, 0xe7, 0x34, 0x00, 0x7a, 0xa0, 0xe0, 0xb7, 0x5b, 0x21, 0x2b, 0xa7, 0x56, 0x14, 0xea, 0xe2, 0x81, 0x43, 0x90, 0x9c, 0x8d, 0xaa, 0xf4, 0xe2, 0xa9, 0xd1, 0x54, 0x89, 0xa3, 0x59, 0x99, 0x64, 0x50, 0xd4, 0xdc, 0xba, 0x2f, 0xda, 0x2a, 0xf6, 0x49, 0x59, 0x84, 0xa1, 0x5b, 0x2c, 0x2a, 0x8e, 0x37, 0xef, 0x1a, 0x54, 0x68, 0x12, 0xd3, 0x01, 0x15, 0x2d, 0x5e, 0x0d, 0x28, 0x93, 0x8f, 0x8d, 0xae, 0x2a, 0x89, 0xa9, 0x81, 0x7a, 0x80, 0x50, 0x25, 0x03, 0xc3, 0x2b, 0xf1, 0xd4, 0xf9, 0xcf, 0x6f, 0x59, 0xaa, 0x36, 0x05, 0x75, 0x02, 0x70, 0xd4, 0xd0, 0xd2, 0x96, 0xe0, 0x73, 0xd8, 0x00, 0x71, 0x92, 0x40, 0xb7, 0xba, 0xa8, 0x6a, 0x2d, 0xb9, 0xca, 0xee, 0x2c, 0x5e, 0x34, 0xde, 0x0d, 0xef, 0x29, 0x4b, 0x2a, 0xab, 0xfa, 0x0a, 0x96, 0xae, 0x64, 0xb7, 0x0b, 0x14, 0x1e, 0xfb, 0x23, 0x61, 0xb3, 0x0b, 0xcb, 0x21, 0x8e, 0x71, 0xf5, 0xcb, 0x53, 0x0f, 0x8e, 0xeb, 0x76, 0x61, 0xb0, 0x80, 0x06, 0x02, 0x18, 0xa3, 0xc9, 0x72, 0xda, 0x6a, 0x8e, 0x16, 0x53, 0x0c, 0xbf, 0x80, 0x60, 0x46, 0x36, 0xf1, 0xcd, 0xfd, 0x51, 0x1c, 0x11, 0x24, 0x49, 0x2d, 0x38, 0xe0, 0xbf, 0x0a, 0x20, 0xea, 0x98, 0xd9, 0xe8, 0x36, 0x0b, 0xc2, 0xa6, 0xd2, 0xf8, 0xf6, 0x58, 0x10, 0x7c, 0xf0, 0x1e, 0xe7, 0xc2, 0xfb, 0xa6, 0x97, 0x1c, 0xf4, 0xe7, 0x8c, 0x52, 0x51, 0x12, 0x85, 0x3a, 0x62, 0xc5, 0xf5, 0x88, 0xd7, 0x82, 0xa9, 0xe8, 0x83, 0x61, 0xac, 0x4a, 0x5f, 0x01, 0x68, 0x7d, 0xd2, 0xc4, 0x0d, 0x00, 0x2f, 0x3c, 0x37, 0x15, 0x80, 0xe0, 0xcb, 0x16, 0x82, 0x04, 0x21, 0x0c, 0xf0, 0x08, 0x69, 0x7e, 0x04, 0xcf, 0x47, 0x87, 0x3c, 0x72, 0xc1, 0x2b, 0x5a, 0x36, 0x5b, 0xeb, 0xae, 0xbc, 0x80, 0x97, 0x97, 0x78, 0x24, 0x64, 0x48, 0x64, 0xa8, 0x3f, 0xc8, 0xf6, 0xfe, 0x60, 0x3c, 0x4f, 0x0d, 0x21, 0x69, 0xb5, 0x57, 0x11, 0x75, 0x43, 0xd9, 0x44, 0xed, 0xdf, 0x32, 0xee, 0x0d, 0x6d, 0x08, 0x30, 0x3b, 0x42, 0xa8, 0x32, 0xd4, 0xdc, 0xec, 0x72, 0x2b, 0xd0, 0x62, 0x5c, 0xcf, 0x03, 0xaa, 0x1a, 0x0d, 0x1d, 0x20, 0xad, 0xb6, 0x3b, 0xbc, 0x3d, 0x23, 0xe5, 0x36, 0xad, 0x75, 0x3f, 0x6d, 0x73, 0x21, 0x83, 0x09, 0xa7, 0xad, 0xae, 0x5f, 0x59, 0xb4, 0x7a, 0x96, 0x28, 0x30, 0x8d, 0x08, 0x10, 0xf9, 0xf0, 0xeb, 0x84, 0x88, 0xc2, 0x31, 0xbd, 0x01, 0x2e, 0xac, 0x51, 0x71, 0x9a, 0x76, 0x07, 0x53, 0x21, 0x90, 0xea, 0x5a, 0x44, 0xc9, 0x9c, 0x6a, 0xdc, 0xe2, 0xed, 0xe7, 0x53, 0xef, 0xac, 0x33, 0x14, 0x00, 0xbe, 0x72, 0x40, 0x01, 0x6c, 0x91, 0xa3, 0xdf, 0x01, 0x86, 0xe6, 0xed, 0x95, 0xd9, 0x06, 0x85, 0x24, 0x63, 0x05, 0xf2, 0xe3, 0x56, 0xdf, 0x8d, 0xd3, 0x7d, 0xbf, 0x27, 0x96, 0xc5, 0x73, 0xa7, 0x82, 0xfd, 0x1d, 0xf4, 0xf4, 0xda, 0x2c, 0x16, 0xe6, 0x3e, 0x8b, 0x98, 0xc4, 0xb9, 0x18, 0x30, 0x7c, 0x51, 0x58, 0xa2, 0xd5, 0x7e, 0x69, 0xe1, 0x01, 0x79, 0x38, 0x77, 0x75, 0xb6, 0xf4, 0x28, 0xf8, 0xaf, 0xc2, 0xd2, 0xfa, 0xe4, 0xb2, 0x98, 0x28, 0x20, 0xf1, 0x3f, 0x3d, 0xfd, 0x41, 0xd8, 0x1b, 0xaa, 0xa7, 0xa0, 0x1a, 0xec, 0x63, 0x24, 0xa0, 0x63, 0x25, 0xa9, 0xf2, 0x0f, 0x7e, 0xca, 0x49, 0x13, 0x95, 0x63, 0x29, 0xb8, 0x1b, 0xae, 0xee, 0xb4, 0x81, 0xac, 0xa8, 0xad, 0x68, 0xc7, 0x28, 0xf9, 0x59, 0xb5, 0x5b, 0xa8, 0xb6, 0x9f, 0xd7, 0xc4, 0xf0, 0x83, 0xb4, 0xd7, 0xfb, 0xd7, 0x9d, 0xae, 0xff, 0x6f, 0x26, 0x5d, 0x51, 0xa0, 0x60, 0x83, 0xa1, 0xa6, 0xac, 0xcf, 0x75, 0x43, 0xcc, 0xc3, 0xd6, 0xa9, 0x40, 0xb8, 0x48, 0x9a, 0xcf, 0x23, 0x00, 0xce, 0x64, 0x16, 0x52, 0x95, 0x1b, 0x0a, 0x69, 0xbd, 0x9c, 0xdb, 0x3a, 0xb6, 0xa8, 0x14, 0xba, 0xf4, 0xf1, 0x6d, 0x4f, 0x95, 0x2f, 0x92, 0x85, 0x44, 0x70, 0x26, 0x03, 0x5d, 0xaf, 0x08, 0xbd, 0x51, 0xa9, 0xd5, 0x6b, 0x4d, 0xec, 0xae, 0x39, 0x16, 0x31, 0x3b, 0xc0, 0x38, 0xeb, 0xef, 0x35, 0x5f, 0x20, 0x8e, 0xe0, 0x05, 0x78, 0xed, 0xd0, 0x4d, 0x94, 0xfa, 0xce, 0x2f, 0xa0, 0xfb, 0x8f, 0xd6, 0x2c, 0x1b, 0x2e, 0x46, 0x37, 0x22, 0xd9, 0x42, 0x8d, 0x84, 0xca, 0x6d, 0x54, 0x9d, 0x78, 0xaf, 0xe1, 0x3b, 0x0f, 0xda, 0xd0, 0x5d, 0x1e, 0x8e, 0x53, 0x3a, 0x90, 0x5a, 0xca, 0x85, 0xde, 0x23, 0x94, 0xf0, 0x83, 0xca, 0x25, 0xef, 0xaf, 0x09, 0x59, 0xbe, 0x3f, 0x9e, 0x08, 0xa5, 0xed, 0xac, 0xdb, 0x7b, 0xc4, 0x5e, 0x5e, 0x69, 0xd8, 0xcd, 0x56, 0xf0, 0x33, 0x24, 0x54, 0x2d, 0x12, 0x02, 0x8a, 0x5c, 0x52, 0x1f, 0xde, 0x9c, 0x25, 0x33, 0x3d, 0xf1, 0x09, 0x13, 0x32, 0x8f, 0xfb, 0x1d, 0xb7, 0x56, 0xe7, 0xd7, 0x4b, 0x99, 0x64, 0xd3, 0x44, 0x23, 0x9e, 0xd6, 0x67, 0x7c, 0x93, 0x38, 0xb6, 0x68, 0x83, 0x8e, 0x89, 0xb1, 0xa1, 0x87, 0xe0, 0x26, 0x0f, 0x14, 0xf8, 0xe4, 0x09, 0xcc, 0x1c, 0xd4, 0x61, 0x8e, 0xbe, 0x75, 0x2b, 0x68, 0xc6, 0xdc, 0xb9, 0xb7, 0x2a, 0xf9, 0xca, 0x90, 0xbf, 0x1b, 0xfe, 0x5f, 0x4f, 0xb6, 0x8d, 0xce, 0xeb, 0x65, 0x39, 0xe9, 0x82, 0x2b, 0x81, 0x7f, 0xb3, 0xfe, 0x18, 0xcb, 0xe0, 0x86, 0x95, 0x53, 0x84, 0x22, 0x6c, 0x11, 0xc6, 0x2c, 0x1d, 0xd1, 0x4e, 0x7e, 0xab, 0xda, 0x57, 0x34, 0x50, 0xd0, 0x05, 0xb4, 0x6f, 0xd9, 0xf9, 0xec, 0xca, 0xff, 0x24, 0xdb, 0xf5, 0xd6, 0xd8, 0x53, 0x0b, 0x5e, 0x25, 0xfd, 0x9f, 0x2a, 0x62, 0x9d, 0xf5, 0xc2, 0x0a, 0x97, 0x72, 0x47, 0xca, 0xb3, 0x52, 0x55, 0xd7, 0x1d, 0x99, 0x2d, 0x85, 0xb0, 0x4c, 0x14, 0x16, 0x73, 0xe0, 0xf6, 0xcf, 0x64, 0xf3, 0x4f, 0x52, 0x75, 0x3a, 0x4c, 0x27, 0xd5, 0xbb, 0x2d, 0x9c, 0x70, 0x3c, 0xed, 0xcf, 0xb9, 0xfb, 0x25, 0x09, 0xa7, 0x9f, 0x2e, 0x4d, 0xfd, 0x6f, 0x85, 0x31, 0xcf, 0xc2, 0x74, 0xed, 0x42, 0xb6, 0xef, 0xb2, 0x93, 0x25, 0xbd, 0x3d, 0x5b, 0xd5, 0xd8, 0xab, 0x11, 0xef, 0x15, 0x8f, 0xd0, 0xb3, 0x07, 0x42, 0x5a, 0x69, 0x21, 0x7a, 0x5e, 0x9b, 0x1c, 0x1e, 0xf6, 0x81, 0x98, 0x59, 0x74, 0xbd, 0x06, 0xee, 0x5e, 0x49, 0xc5, 0xcb, 0xb7, 0xad, 0x8b, 0xe0, 0x80, 0x75, 0x07, 0x31, 0x7f, 0xe2, 0xc5, 0x2a, 0x3f, 0xe0, 0x51, 0x33, 0x58, 0x38, 0x9f, 0x85, 0xf0, 0x07, 0xaa, 0x3c, 0x82, 0x6f, 0x5c, 0xad, 0xdf, 0x8c, 0xae, 0xf9, 0x72, 0xa9, 0x10, 0xe3, 0xc7, 0xb4, 0x0b, 0xde, 0x4f, 0xf0, 0x25, 0x6a, 0x5d, 0xea, 0x05, 0xa1, 0x75, 0xae, 0xd7, 0x0d, 0xc6, 0x3a, 0xf2, 0xbd, 0xf5, 0x33, 0xb8, 0x98, 0x1c, 0xd7, 0xbe, 0xf1, 0x13, 0x33, 0x2e, 0x5b, 0xee, 0x96, 0x69, 0xbe, 0xc6, 0x45, 0xf0, 0xaa, 0xbd, 0x70, 0x84, 0xec, 0x3c, 0x65, 0x8c, 0x5f, 0x7f, 0x04, 0xb8, 0x05, 0x54, 0x73, 0xe4, 0x56, 0x1f, 0x13, 0x3f, 0xd8, 0x22, 0xb2, 0xac, 0xf0, 0xfb, 0x02, 0x68, 0xf8, 0x6e, 0x49, 0xed, 0x91, 0x65, 0x5b ],
+const [ 0x52, 0xa7, 0x68, 0x55, 0xb4, 0x15, 0xa3, 0x57, 0xd6, 0x74, 0x78, 0x42, 0x14, 0x01, 0x41, 0xdc, 0xa7, 0x5e, 0x25, 0x7d, 0x1c, 0x37, 0x31, 0xcf, 0x04, 0x26, 0xaa, 0xd2, 0xee, 0xd4, 0xa2, 0x23, 0x92, 0x62, 0xca, 0x7d, 0x4f, 0x07, 0x87, 0x80, 0xd8, 0xfa, 0x48, 0xb1, 0x2a, 0x92, 0x16, 0xc3, 0xc1, 0xab, 0x6d, 0x15, 0x0b, 0x4d, 0x4a, 0x7b, 0x1d, 0x88, 0x85, 0x41, 0xa5, 0xa2, 0x61, 0x6d, 0x1f, 0x75, 0x62, 0x45, 0x4c, 0x12, 0x5e, 0x11, 0xe0, 0xaa, 0xd7, 0x22, 0x7b, 0xaf, 0x88, 0x13, 0xdb, 0x36, 0x3e, 0x4f, 0x50, 0xa0, 0xe9, 0xd3, 0x70, 0x79, 0xf3, 0x36, 0x0b, 0xa0, 0xd0, 0xe6, 0x62, 0xa8, 0xd7, 0xb4, 0x93, 0x7f, 0x50, 0x93, 0x58, 0x4d, 0xce, 0x9c, 0xf1, 0x9f, 0xbf, 0x56, 0x5f, 0xc5, 0x41, 0x35, 0xd3, 0x78, 0x37, 0x60, 0x66, 0xc1, 0x9c, 0xb7, 0x0a, 0x16, 0x18, 0x15, 0xc1, 0xc5, 0xd1, 0xd2, 0x0d, 0x96, 0x84, 0x8d, 0xa7, 0xab, 0xd4, 0x28, 0x73, 0xac, 0xe2, 0x13, 0xb4, 0x21, 0x1d, 0xce, 0x7d, 0x1f, 0x5c, 0xa9, 0x68, 0x27, 0x2a, 0xcf, 0x89, 0x4b, 0x60, 0x82, 0xa5, 0x92, 0xfa, 0xa8, 0xa0, 0x9e, 0x23, 0x87, 0x35, 0x8c, 0x92, 0xcd, 0xea, 0x1c, 0x19, 0xd3, 0x42, 0x12, 0x7b, 0x22, 0x34, 0xdc, 0x7f, 0x37, 0xdc, 0x74, 0x42, 0x83, 0x71, 0x88, 0xd1, 0xb6, 0x77, 0xd9, 0xf7, 0x3d, 0x35, 0xe1, 0x54, 0x09, 0x6a, 0xb8, 0xaf, 0x93, 0x3c, 0x38, 0x8e, 0x1d, 0x71, 0x60, 0x03, 0x3a, 0xe1, 0xf6, 0xc8, 0x90, 0x2b, 0x70, 0x8e, 0xdd, 0xa8, 0x15, 0x93, 0x38, 0x9d, 0x60, 0x73, 0x9a, 0xb5, 0xa5, 0x40, 0x9c, 0xae, 0xf6, 0xd4, 0x82, 0x52, 0x48, 0x66, 0x79, 0xa9, 0xd2, 0x5c, 0x1d, 0x6d, 0xb6, 0x60, 0x3e, 0xbe, 0xe3, 0xb6, 0xe4, 0x17, 0x3a, 0xcd, 0x90, 0x81, 0xf0, 0x14, 0xc5, 0x06, 0x33, 0x0e, 0xc7, 0x69, 0x10, 0xa9, 0xa3, 0x14, 0x94, 0xcc, 0x6f, 0x52, 0x31, 0x2f, 0xd3, 0xbe, 0x64, 0x6f, 0xc9, 0xfc, 0x95, 0x62, 0xa0, 0xa6, 0x3f, 0xa8, 0x47, 0x89, 0x50, 0x82, 0xc8, 0x12, 0xd3, 0xe7, 0x13, 0x03, 0xcc, 0xd5, 0xfd, 0x6a, 0x63, 0xe6, 0x88, 0xd4, 0x45, 0x23, 0x65, 0xbe, 0x48, 0x1c, 0xb7, 0x4c, 0x4e, 0x39, 0x1a, 0x3e, 0x6b, 0x4b, 0xe4, 0x1f, 0x4a, 0x66, 0xab, 0xbf, 0xcc, 0xf3, 0x07, 0xe4, 0xf3, 0x01, 0x98, 0x3d, 0xff, 0xdc, 0x4b, 0x97, 0xd6, 0xe1, 0xda, 0x53, 0xa9, 0x90, 0x92, 0x18, 0xd5, 0xe3, 0x59, 0xc5, 0x07, 0xde, 0xef, 0xaa, 0xa4, 0x68, 0x74, 0xf7, 0x68, 0x59, 0x2b, 0x74, 0x4d, 0xd4, 0x7d, 0x73, 0xae, 0xd7, 0x41, 0x04, 0xac, 0x10, 0x3a, 0x67, 0xd1, 0xf3, 0xe1, 0xc7, 0xf3, 0x09, 0x65, 0x25, 0x5b, 0x8b, 0xf1, 0x92, 0x27, 0x2f, 0x2d, 0xa1, 0xed, 0x42, 0x07, 0x1c, 0xa1, 0xf7, 0xb3, 0xf6, 0xb9, 0xff, 0xf0, 0x81, 0x8e, 0x59, 0x8e, 0xe1, 0x06, 0x6c, 0x2d, 0xc1, 0x70, 0x53, 0x47, 0x44, 0xaf, 0x78, 0x71, 0x3e, 0x9b, 0x64, 0xdd, 0xa5, 0xa4, 0xd5, 0x24, 0x42, 0xb9, 0x11, 0x42, 0xac, 0x68, 0x7b, 0xe2, 0x77, 0x46, 0x64, 0xdd, 0xa9, 0x91, 0x23, 0xfd, 0x6d, 0x14, 0x68, 0x06, 0x0c, 0x4b, 0xcd, 0xf7, 0x18, 0xc8, 0xae, 0x8d, 0xeb, 0xd5, 0x3b, 0x09, 0x50, 0x5b, 0xcb, 0x33, 0x7f, 0x02, 0x74, 0x9f, 0x4f, 0x9a, 0xd8, 0x2f, 0xa7, 0xba, 0x41, 0xd9, 0x35, 0xa6, 0xf1, 0xaa, 0x63, 0x76, 0xb3, 0x0b, 0x87, 0x75, 0xb6, 0x44, 0x5a, 0xc8, 0x9b, 0x3e, 0xac, 0x50, 0xcd, 0x8d, 0x56, 0xd1, 0x11, 0xad, 0x6f, 0x53, 0x5e, 0x8c, 0xc3, 0xc8, 0xee, 0x49, 0x80, 0xf0, 0x95, 0x3c, 0x33, 0x7a, 0x52, 0x36, 0xf3, 0x6c, 0x24, 0x0a, 0xdc, 0xc4, 0x1e, 0x4c, 0xc0, 0x5f, 0xbe, 0x58, 0x18, 0x1b, 0x7b, 0x96, 0x41, 0x39, 0x9d, 0xfd, 0xe5, 0x05, 0x51, 0xd6, 0xb7, 0xb8, 0xfd, 0xc3, 0x63, 0x9d, 0xd1, 0xff, 0xc4, 0x73, 0x9f, 0xe7, 0x58, 0x13, 0xec, 0xba, 0xf2, 0x52, 0x47, 0x9d, 0xaf, 0x29, 0xd9, 0xe2, 0x2b, 0x13, 0x3e, 0x89, 0xf5, 0xb7, 0x93, 0x07, 0x40, 0xc7, 0xd0, 0x47, 0xdb, 0x28, 0x58, 0xef, 0x63, 0x53, 0xcf, 0xe4, 0xb7, 0xfb, 0x2c, 0x10, 0xac, 0xf0, 0x0f, 0x63, 0x02, 0x43, 0x54, 0x17, 0x97, 0xab, 0xe8, 0x39, 0xdb, 0x27, 0xdb, 0x65, 0x84, 0xe5, 0xb7, 0xd1, 0x83, 0x63, 0x11, 0x8c, 0x36, 0xd4, 0x5d, 0x08, 0xdf, 0xc5, 0x07, 0xd7, 0x55, 0x00, 0xbf, 0xb2, 0xf9, 0xb0, 0x14, 0xbf, 0xec, 0xc7, 0x44, 0x14, 0x7f, 0x9d, 0x52, 0x77, 0xeb, 0xd9, 0x5a, 0x67, 0x43, 0x95, 0x22, 0x61, 0xa6, 0xbd, 0xf1, 0x5c, 0xb9, 0xb8, 0xa4, 0x96, 0x54, 0x4b, 0xfe, 0x92, 0x7c, 0xba, 0x40, 0x61, 0x92, 0x30, 0xf9, 0x22, 0xc9, 0x60, 0x20, 0xc5, 0xde, 0x6d, 0x60, 0x14, 0x03, 0x07, 0xb3, 0xf3, 0x1c, 0xd8, 0x32, 0xe6, 0x2d, 0x1e, 0x2c, 0xd5, 0x13, 0x99, 0x75, 0x0c, 0x73, 0xa7, 0x00, 0x86, 0xf1, 0xae, 0xb0, 0x6b, 0xa2, 0xba, 0x6c, 0xd7, 0xc3, 0x67, 0x72, 0xdd, 0xab, 0x02, 0xed, 0xcc, 0xfe, 0xeb, 0xc9, 0xb0, 0x24, 0x3d, 0xc6, 0x1c, 0xf9, 0xb1, 0xcb, 0x27, 0xc6, 0xc0, 0x7e, 0xb5, 0x71, 0x08, 0x11, 0xf8, 0xf0, 0xf1, 0x5e, 0x36, 0x03, 0x90, 0x37, 0xcc, 0x23, 0xcc, 0xf7, 0x73, 0xb5, 0xbf, 0x5d, 0xc2, 0x84, 0x5f, 0x9b, 0xf4, 0x6e, 0x5d, 0xa9, 0xec, 0x5e, 0x4d, 0xdf, 0x76, 0x7a, 0x08, 0xc3, 0xd0, 0x9d, 0x4e, 0x20, 0x69, 0x07, 0xb0, 0x58, 0xe8, 0x53, 0xad, 0xfa, 0x70, 0xaa, 0x1c, 0x97, 0x22, 0x37, 0xca, 0xd2, 0xe4, 0xda, 0x63, 0xb7, 0x61, 0x21, 0x96, 0x4e, 0x51, 0x74, 0x74, 0x6f, 0xfb, 0x8f, 0x19, 0xd7, 0xf8, 0x36, 0x8f, 0x7c, 0x39, 0x23, 0xef, 0x1e, 0x4c, 0x44, 0xc9, 0x1f, 0xda, 0x23, 0xc6, 0x94, 0x75, 0xa6, 0x8c, 0x9c, 0x90, 0xf8, 0xe2, 0xf1, 0xcf, 0xc7, 0x15, 0xbc, 0x82, 0xb0, 0x9a, 0xae, 0x6c, 0xf7, 0xf4, 0x4c, 0xc8, 0x7c, 0xd9, 0x8a, 0x8e, 0xea, 0x90, 0x9c, 0xf2, 0x32, 0x9d, 0x09, 0x2d, 0x38, 0xa0, 0x01, 0x81, 0xcb, 0x7b, 0xf0, 0x77, 0xdb, 0xb3, 0x53, 0x6c, 0xe6, 0x19, 0xcb, 0x4b, 0xb4, 0xa9, 0x6f, 0x9c, 0x44, 0xb2, 0x67, 0xbe, 0x06, 0x37, 0xb7, 0x70, 0x4b, 0x95, 0x58, 0x97, 0xf9, 0x67, 0x8d, 0x3b, 0x83, 0xa7, 0x74, 0xd2, 0x18, 0x16, 0xdb, 0xc1, 0x1b, 0xdd, 0x56, 0x20, 0xd4, 0x74, 0x8e, 0xbd, 0x65, 0xc3, 0xdc, 0x64, 0xff, 0x87, 0x17, 0x5e, 0x55, 0xf8, 0xaa, 0x38, 0x51, 0xa9, 0xe9, 0xc6, 0x06, 0xaf, 0xa5, 0x66, 0xe7, 0x05, 0xfd, 0x89, 0x36, 0x2f, 0x78, 0x70, 0xbf, 0x1e, 0x51, 0x34, 0xc5, 0x54, 0x12, 0x09, 0x3d, 0x48, 0x64, 0xc3, 0x3a, 0x0c, 0x26, 0x9a, 0xa9, 0x2d, 0xbc, 0x2a, 0x3e, 0xdb, 0xaa, 0xbe, 0xae, 0x49, 0x61, 0xcd, 0x1f, 0x57, 0x58, 0xc5, 0xdc, 0x6f, 0x5f, 0x08, 0x4e, 0xac, 0x31, 0x34, 0x28, 0x42, 0x48, 0xa8, 0xe1, 0x1a, 0xf5, 0x44, 0x67, 0xbc, 0xaf, 0x6f, 0x12, 0x72, 0xac, 0x5f, 0xd6, 0xaa, 0xae, 0x95, 0xbe, 0x9d, 0x20, 0xa6, 0x95, 0x2e, 0x61, 0x41, 0xe6, 0x15, 0x60, 0x6e, 0x28, 0x3c, 0x69, 0x14, 0x32, 0x69, 0x3e, 0xbe, 0xf5, 0x1e, 0x6a, 0x9e, 0x69, 0xbe, 0xd2, 0xd3, 0xc8, 0xf0, 0x8d, 0xe7, 0xfb, 0x48, 0xf5, 0x9c, 0x51, 0x25, 0xfe, 0xe8, 0x77, 0xd5, 0xc7, 0x3e, 0xa5, 0x00, 0x6f, 0x0f, 0x15, 0x43, 0x2a, 0x91, 0xb9, 0x1b, 0x94, 0xbf, 0x2d, 0x05, 0x45, 0xa1, 0xeb, 0xe3, 0xa5, 0xcd, 0xbe, 0xa2, 0x01, 0x2e, 0x79, 0x1a, 0xdf, 0x04, 0xe8, 0x35, 0x8f, 0x2c, 0x07, 0x54, 0x03, 0xa2, 0x72, 0xee, 0xe1, 0x44, 0x1d, 0x7a, 0xd5, 0xd8, 0x45, 0x90, 0x2c, 0x51, 0xa6, 0x4b, 0x9f, 0x4e, 0xef, 0xf1, 0x6c, 0xe4, 0x73, 0xd6, 0xac, 0x9d, 0x21, 0x7d, 0xe0, 0xc0, 0xb6, 0x01, 0xcd, 0xd3, 0x31, 0xb3, 0x8a, 0x5f, 0x87, 0x05, 0xd7, 0xf3, 0x99, 0xa7, 0xb0, 0x6b, 0x63, 0xef, 0x22, 0x72, 0x76, 0x7e, 0x5e, 0x46, 0xa8, 0x21, 0x0c, 0xbc, 0x0a, 0xf5, 0xe1, 0x83, 0x1a, 0xcf, 0x74, 0xac, 0x3a, 0xda, 0x4d, 0x6a, 0x61, 0x82, 0x3f, 0x17, 0x11, 0x91, 0xf9, 0x78, 0x89, 0x98, 0xd7, 0x42, 0x3b, 0x91, 0xfe, 0xdd, 0x80, 0xc2, 0xa7, 0x67, 0x8b, 0xe5, 0xbb, 0xfc, 0x9b, 0x85, 0xa1, 0x35, 0x75, 0xab, 0x53, 0xee, 0x12, 0xba, 0xb8, 0x4d, 0x95, 0x98, 0x2e, 0x00, 0x80, 0x0e, 0x65, 0xc5, 0x26, 0x72, 0x74, 0x30, 0x64, 0x83, 0x26, 0xa9, 0x8c, 0x94, 0x95, 0xb4, 0xa2, 0xed, 0xfb, 0x75, 0xcb, 0x6e, 0xc4, 0x73, 0x02, 0x75, 0xe8, 0x9c, 0x0d, 0x02, 0x77, 0x89, 0xaf, 0x19, 0x76, 0x04, 0x20, 0x68, 0xe9, 0xc7, 0xba, 0x2a, 0x31, 0x87, 0xf5, 0x4b, 0x98, 0x31, 0x95, 0xcd, 0x2b, 0x74, 0x22, 0x6a, 0xc8, 0x7f, 0x99, 0x7b, 0x77, 0x0c, 0x61, 0x18, 0xfd, 0x9d, 0x80, 0x81, 0xaf, 0x05, 0x0f, 0xbc, 0x85, 0x2b, 0xeb, 0x80, 0x6f, 0x0b, 0xae, 0x52, 0xec, 0xfd, 0xde, 0xee, 0xd8, 0x3a, 0x64, 0xe8, 0x85, 0x9c, 0x3f, 0x93, 0x0e, 0xa5, 0x79, 0x22, 0xe8, 0xc3, 0x5a, 0x0d, 0xba, 0xd2, 0xdd, 0xb7, 0x6f, 0xe3, 0x60, 0x4d, 0x89, 0x3c, 0x9f, 0xf1, 0xb8, 0xa0, 0xe3, 0x18, 0xab, 0xd0, 0x77, 0x30, 0x26, 0x51, 0x5c, 0x87, 0x55, 0x70, 0x3d, 0x68, 0x60, 0x84, 0xa5, 0x87, 0x3f, 0x73, 0x70, 0x9e, 0xd0, 0x77, 0x80, 0x59, 0x26, 0x22, 0xb1, 0x70, 0x24, 0xa0, 0x0e, 0x12, 0x4b, 0x3d, 0x45, 0x8a, 0xd1, 0x26, 0x58, 0x1d, 0xf3, 0x74, 0x96, 0x31, 0x8c, 0x66, 0xca, 0xb5, 0xe5, 0xee, 0xb2, 0xbc, 0xcf, 0x70, 0xb2, 0x6b, 0xef, 0xc6, 0xca, 0x16, 0x5a, 0x87, 0xc6, 0xa6, 0x62, 0x89, 0xb4, 0x3e, 0xaf, 0xa4, 0x9b, 0x1e, 0x91, 0xb9, 0x6a, 0xc7, 0x94, 0xf3, 0x2f, 0x5f, 0x55, 0x4d, 0x89, 0x58, 0x95, 0x55, 0x60, 0x4d, 0x8c, 0x2f, 0xd3, 0x2c, 0x7f, 0xdc, 0x72, 0x9a, 0x95, 0xbd, 0xae, 0x93, 0xe7, 0x52, 0x8d, 0x51, 0xd6, 0x48, 0xa3, 0x70, 0xa1, 0xb3, 0x3d, 0x4f, 0x37, 0x98, 0xdf, 0xb9, 0x49, 0xae, 0xf1, 0xc5, 0xa4, 0x65, 0xb5, 0xfa, 0xbe, 0x28, 0x7c, 0xb7, 0x8e, 0xdf, 0x1a, 0xd2, 0xa1, 0xb9, 0x97, 0x80, 0x6b, 0x28, 0x27, 0x75, 0xdb, 0x2d, 0x5c, 0x4c, 0x32, 0xd5, 0x9b, 0x28, 0x14, 0x04, 0xcd, 0x9c, 0xdf, 0x71, 0x56, 0xc8, 0x3d, 0xf2, 0x4b, 0xc5, 0xf5, 0xfa, 0xdf, 0x44, 0x07, 0x5f, 0x1f, 0x71, 0xf7, 0x61, 0xe0, 0x1e, 0x69, 0xe9, 0xf5, 0x1d, 0xee, 0x0e, 0xa5, 0xed, 0x1e, 0xdd, 0x5c, 0x9a, 0xe7, 0x5a, 0xa0, 0xde, 0x24, 0xc2, 0x47, 0x8c, 0x71, 0x13, 0xe7, 0x2e, 0x3e, 0xce, 0x8f, 0xed, 0x23, 0xfc, 0xb4, 0xb2, 0x73, 0x6f, 0x6e, 0x8b, 0x14, 0x4a, 0xe5, 0x50, 0x8e, 0xc4, 0x05, 0x86, 0x61, 0x28, 0x7a, 0x83, 0x9c, 0x20, 0xd8, 0xd3, 0xab, 0x34, 0x19, 0xdb, 0x71, 0x8e, 0x4d, 0xbc, 0x97, 0x00, 0x8d, 0x7b, 0x23, 0x48, 0x31, 0x5e, 0x4c, 0x92, 0x43, 0x99, 0x8c, 0x3e, 0x33, 0x29, 0xf8, 0xe4, 0xcb, 0x01, 0xcd, 0x95, 0x66, 0x64, 0x4b, 0x64, 0x5d, 0x92, 0xc6, 0x25, 0xc3, 0xa6, 0xfa, 0x75, 0x52, 0xbf, 0x9f, 0xfb, 0xa4, 0x5e, 0x3d, 0xed, 0xa7, 0x0f, 0x42, 0xd5, 0x4b, 0x4c, 0x52, 0x95, 0x7d, 0x9e, 0xde, 0xa8, 0x59, 0x05, 0xf8, 0xac, 0x9b, 0x9a, 0x65, 0x1d, 0x57, 0x73, 0xf4, 0x64, 0xeb, 0xc7, 0x0f, 0x10, 0x31, 0x52, 0x90, 0x63, 0xf9, 0xfb, 0xd6, 0x10, 0xb6, 0xb5, 0x17, 0x43, 0x77, 0xa3, 0xf7, 0xe2, 0x19, 0x7f, 0x5a, 0x12, 0xbb, 0x3c, 0x77, 0xfe, 0x73, 0xea, 0x2f, 0xd4, 0x3f, 0xdb, 0x9c, 0x0f, 0x3f, 0x04, 0xec, 0xfc, 0x21, 0xa5, 0x70, 0x77, 0xdc, 0x2d, 0xf0, 0xf6, 0xa1, 0x58, 0x42, 0xca, 0x0e, 0x9a, 0x1a, 0xa1, 0xa6, 0xc0, 0x24, 0x4e, 0x7e, 0xd5, 0x50, 0xcd, 0x38, 0x42, 0x6e, 0x81, 0x35, 0x3a, 0xfa, 0xc1, 0x07, 0x55, 0x39, 0x93, 0x25, 0x7b, 0x85, 0xb7, 0xe3, 0x04, 0xe4, 0xe8, 0xa1, 0x1d, 0xe0, 0x5e, 0x42, 0x6e, 0x93, 0x97, 0xe0, 0xfa, 0x02, 0x57, 0xbd, 0x46, 0xac, 0xee, 0x7d, 0xbd, 0x62, 0xb9, 0x93, 0x53, 0x58, 0xeb, 0xfa, 0x69, 0x7d, 0x8d, 0x25, 0xf0, 0x08, 0xc4, 0x38, 0xd2, 0x53, 0x53, 0x78, 0x8d, 0xed, 0x60, 0x00, 0x21, 0xeb, 0x7b, 0xb7, 0x2d, 0x7e, 0xdc, 0x7e, 0x55, 0xcb, 0xec, 0xae, 0xe6, 0xf6, 0x08, 0xc1, 0xbd, 0x80, 0x81, 0x4f, 0x65, 0xd4, 0xe7, 0x3d, 0x7f, 0x1c, 0x87, 0x31, 0x67, 0x59, 0x32, 0x48, 0x14, 0xb3, 0x40, 0x0c, 0x40, 0x0d, 0xd5, 0xa0, 0xc9, 0xdd, 0x63, 0x3e, 0x58, 0x3b, 0x70, 0xe4, 0x40, 0x38, 0x9a, 0x49, 0xa9, 0x70, 0xd8, 0x16, 0xed, 0xe3, 0x02, 0x53, 0x42, 0x00, 0x94, 0x1f, 0x9a, 0x03, 0xaf, 0xa5, 0xc7, 0x81, 0x60, 0x4b, 0xe3, 0x41, 0x25, 0x2c, 0xef, 0x4e, 0xad, 0xc9, 0xba, 0x4a, 0xe0, 0xfb, 0x04, 0x05, 0x1f, 0x2d, 0xe4, 0x4f, 0xcd, 0xc7, 0x67, 0x0a, 0x0e, 0xed, 0x7a, 0x83, 0xce, 0x6a, 0x0a, 0x02, 0x06, 0xe7, 0x69, 0x9f, 0x3a, 0x61, 0xf4, 0x58, 0x47, 0xda, 0xf3, 0x61, 0x5b, 0x4e, 0xc0, 0xbb, 0x45, 0xe8, 0x2c, 0x08, 0xef, 0x76, 0x1e, 0x9e, 0x28, 0x1b, 0x7d, 0xda, 0xa7, 0x43, 0x50, 0xb6, 0x4d, 0xdc, 0x24, 0x9e, 0xab, 0xc4, 0xae, 0x80, 0xc4, 0x7d, 0xb2, 0x23, 0x14, 0x28, 0x24, 0xb9, 0xd1, 0xb1, 0x8c, 0xb7, 0x70, 0x47, 0xaf, 0xe4, 0x6b, 0x0f, 0x6b, 0xb0, 0x42, 0x19, 0xe3, 0xc8, 0xc0, 0x93, 0xdc, 0xe7, 0x7f, 0x3c, 0x67, 0xef, 0xae, 0x1c, 0xc1, 0x38, 0x12, 0x73, 0x77, 0x28, 0x4b, 0xef, 0xcd, 0x04, 0x59, 0x21, 0x61, 0x05, 0x5e, 0x32, 0x0c, 0xaf, 0xa5, 0xd2, 0x09, 0x5e, 0xe4, 0x72, 0x59, 0x22, 0xbe, 0xb3, 0x65, 0xcc, 0x8c, 0x1e, 0xe6, 0x49, 0x5d, 0x15, 0x02, 0x2f, 0x3b, 0x09, 0xb7, 0x96, 0xb1, 0xee, 0x7d, 0x29, 0x8a, 0xec, 0x27, 0x7d, 0xda, 0x58, 0x0b, 0xa1, 0x43, 0xe2, 0x62, 0xf6, 0x71, 0x10, 0xf2, 0x40, 0xe7, 0xeb, 0xea, 0xfe, 0xfe, 0xf8, 0x0d, 0xf7, 0x2a, 0x69, 0x12, 0x16, 0x80, 0x95, 0x4b, 0x77, 0x75, 0xa6, 0x86, 0xc2, 0xe9, 0x91, 0x31, 0xb8, 0x64, 0x4c, 0xc1, 0x0b, 0x9f, 0x3b, 0x54, 0x73, 0x46, 0xeb, 0x94, 0xfe, 0xfc, 0x02, 0xdf, 0xa8, 0xa0, 0x76, 0xa6, 0x2b, 0xce, 0xfe, 0x13, 0x18, 0xa9, 0xc6, 0xef, 0x27, 0xd8, 0x67, 0xc2, 0xcb, 0xcf, 0x16, 0x3c, 0x0a, 0x50, 0x1b, 0xd3, 0x8c, 0x31, 0x86, 0xae, 0xf2, 0x5f, 0x1d, 0xc2, 0x69, 0x23, 0x98, 0x3b, 0x7e, 0xa4, 0x11, 0x1d, 0x34, 0xae, 0xb6, 0x2b, 0x53, 0xb1, 0xc1, 0x08, 0x04, 0x0d, 0xaa, 0x9c, 0x9b, 0x8c, 0x9a, 0xb9, 0xb4, 0x30, 0x24, 0xfe, 0x81, 0x30, 0x30, 0xfc, 0x62, 0x3d, 0x37, 0x98, 0xb6, 0x09, 0xb6, 0xb0, 0xf2, 0x0a, 0xdc, 0x02, 0xf0, 0x7c, 0x86, 0x49, 0x89, 0xa5, 0x6e, 0xa8, 0x65, 0x5c, 0x9f, 0x4c, 0x12, 0xcc, 0x2d, 0x4e, 0x54, 0x76, 0x22, 0xd6, 0xbc, 0x75, 0xbb, 0x86, 0x7c, 0x06, 0xd5, 0x16, 0x7a, 0x47, 0xa2, 0x3b, 0xa3, 0x3f, 0xa0, 0xce, 0x82, 0x1f, 0xcc, 0x2a, 0x11, 0xc7, 0x13, 0xd6, 0xcf, 0x8c, 0x09, 0x64, 0x12, 0x39, 0xdd, 0x98, 0x9f, 0x53, 0x8d, 0xcd, 0x78, 0xa2, 0x56, 0x95, 0xf5, 0xec, 0x6f, 0xa0, 0x16, 0x04, 0xf6, 0xdf, 0x18, 0x04, 0x2b, 0xe8, 0x46, 0xd6, 0xdc, 0x9d, 0x12, 0xf9, 0x20, 0x08, 0x64, 0x81, 0x48, 0x8a, 0x32, 0x60, 0x13, 0x35, 0x51, 0xe5, 0x21, 0x76, 0x8b, 0x82, 0xaa, 0xf7, 0xf1, 0xd2, 0x70, 0xc3, 0x72, 0xda, 0xf2, 0xac, 0xad, 0x90, 0xe3, 0xea, 0x04, 0x99, 0xda, 0x04, 0xf2, 0x57, 0x4b, 0xf4, 0x9e, 0x23, 0xb6, 0x86, 0xb0, 0xd7, 0x1e, 0x01, 0x63, 0x90, 0xbd, 0x09, 0xdb, 0xb2, 0xf6, 0xc4, 0xba, 0x2c, 0x8b, 0x3c, 0xee, 0xfd, 0x10, 0x04, 0xcc, 0xf7, 0xa0, 0x1f, 0x63, 0xc2, 0xce, 0x1d, 0x0a, 0x25, 0xde, 0x87, 0x3c, 0x81, 0x36, 0x7d, 0xa6, 0x9e, 0x0f, 0x9e, 0x7d, 0xaa, 0x70, 0x28, 0x15, 0x7f, 0x5d, 0x60, 0xb0, 0x25, 0x4c, 0x35, 0x94, 0x98, 0xd8, 0x20, 0x60, 0xcb, 0xb9, 0x4e, 0x9f, 0xec, 0xf4, 0x01, 0x9e, 0xea, 0x4f, 0x34, 0x7b, 0x35, 0x08, 0x7e, 0x7f, 0xc5, 0xc6, 0x38, 0xad, 0x5d, 0xd0, 0xe2, 0x9b, 0x11, 0x7d, 0xc3, 0x81, 0x06, 0xec, 0xd0, 0x90, 0x79, 0xf4, 0xcf, 0x85, 0x02, 0x5e, 0xbc, 0x7d, 0x1a, 0x52, 0x6c, 0x0b, 0xdc, 0x10, 0x70, 0x88, 0x08, 0xe1, 0x3c, 0xaa, 0x4d, 0x4c, 0x89, 0x58, 0xc8, 0x8c, 0xf7, 0xbd, 0xc8, 0x42, 0xf7, 0x9c, 0xd4, 0x68, 0xe8, 0xe3, 0xef, 0x86, 0x80, 0x82, 0x1a, 0x28, 0x6e, 0x7d, 0x1b, 0x8f, 0x3d, 0x40, 0x7d, 0xa7, 0x7c, 0x34, 0xd8, 0x39, 0x1c, 0x8f, 0x52, 0x62, 0x19, 0x70, 0x66, 0x44, 0x5d, 0x2b, 0xe4, 0xfb, 0xe1, 0xe1, 0x39, 0xd2, 0x15, 0x55, 0xf1, 0xb7, 0x82, 0xfa, 0x7a, 0xed, 0xad, 0x51, 0x2b, 0x01, 0x3f, 0x71, 0x84, 0xff, 0x64, 0xe7, 0xb8, 0xe5, 0x71, 0xc1, 0x68, 0x58, 0xc9, 0xe6, 0xb2, 0x96, 0x01, 0xa9, 0x6a, 0xac, 0x42, 0x9d, 0xa7, 0xe9, 0xef, 0xaa, 0x82, 0x92, 0x88, 0x60, 0x1a, 0xd7, 0xcf, 0x8c, 0xdc, 0x06, 0x29, 0x09, 0x01, 0xff, 0x46, 0xd9, 0x57, 0xe8, 0x04, 0x74, 0x45, 0x22, 0x91, 0x60, 0x09, 0x7b, 0xd0, 0x02, 0x45, 0xa5, 0xff, 0xb4, 0xba, 0xe7, 0x96, 0x18, 0x53, 0x12, 0x72, 0xab, 0x65, 0xb7, 0x32, 0x9d, 0x35, 0x97, 0xe2, 0xe0, 0xbb, 0x5b, 0xd7, 0x7f, 0xa5, 0x85, 0xd9, 0x31, 0x9f, 0xa7, 0x88, 0x2e, 0xd2, 0xd2, 0xf8, 0x41, 0xaa, 0x52, 0x9f, 0x1e, 0xdd, 0x98, 0x71, 0xf7, 0xa9, 0x78, 0x49, 0x4a, 0x5d, 0x95, 0x8b, 0xfd, 0x1a, 0x19, 0x07, 0xac, 0xdb, 0xa9, 0x21, 0x42, 0xb3, 0x98, 0x2f, 0xc6, 0x56, 0x5a, 0x23, 0x78, 0xdb, 0x3c, 0x6a, 0x1d, 0xc0, 0x53, 0x14, 0x97, 0x2f, 0xb2, 0x34, 0xb8, 0x7f, 0xe0, 0x8a, 0x58, 0xfe, 0x8a, 0x5f, 0xa5, 0xee, 0x74, 0xb1, 0xbb, 0xcd, 0xb5, 0x90, 0x75, 0xda, 0x24, 0xc8, 0x82, 0xd4, 0x0e, 0xc0, 0xbb, 0x05, 0x2a, 0xa2, 0xb3, 0x7f, 0xce, 0xbc, 0x90, 0xa6, 0x62, 0x27, 0x1a, 0xee, 0x16, 0xa6, 0x12, 0xe6, 0xd0, 0xd0, 0xc5, 0x76, 0x68, 0x72, 0xe1, 0x64, 0x18, 0x2f, 0x86, 0x1d, 0x2e, 0x69, 0xa0, 0xb3, 0x04, 0x65, 0x75, 0x22, 0x32, 0xa9, 0x7a, 0xd7, 0x02, 0xa9, 0x6b, 0x73, 0x25, 0xa3, 0x9a, 0xcc, 0xa4, 0xc8, 0x88, 0x34, 0x19, 0x9c, 0xb2, 0xff, 0x1e, 0x9f, 0xad, 0x3f, 0x06, 0x2d, 0x75, 0xd2, 0xcb, 0xa3, 0x03, 0x9f, 0x48, 0xc3, 0x1d, 0x1c, 0xa8, 0x5a, 0x72, 0x14, 0x1f, 0x1f, 0xe6, 0xa7, 0xd8, 0xdf, 0x2b, 0x92, 0x2e, 0xd7, 0x91, 0xb0, 0x1e, 0x62, 0x1f, 0xc1, 0xfc, 0xd4, 0xe2, 0x6b, 0x66, 0xa5, 0x85, 0x7e, 0x77, 0xd2, 0x22, 0x7c, 0x3c, 0x80, 0x58, 0x59, 0x6c, 0xe2, 0x9e, 0x7f, 0x53, 0x5e, 0xd6, 0x15, 0x10, 0xeb, 0x26, 0x81, 0x00, 0xbe, 0x03, 0x2b, 0x7a, 0x25, 0x8e, 0x84, 0xbd, 0xb3, 0x24, 0x48, 0x26, 0x9d, 0x30, 0x00, 0xa7, 0x64, 0x44, 0xca, 0x74, 0xb4, 0x69, 0x5c, 0xff, 0x8d, 0xb3, 0x47, 0x27, 0xa0, 0x18, 0x79, 0xac, 0xfc, 0x81, 0x06, 0xe7, 0xe9, 0x22, 0x28, 0xb8, 0x14, 0x07, 0x84, 0xbf, 0xed, 0xf0, 0xae, 0xcf, 0x4e, 0x5f, 0xf0, 0x9f, 0x5d, 0xef, 0x47, 0xc3, 0xb3, 0xe7, 0xaf, 0xdb, 0xbe, 0x0f, 0xa0, 0x0b, 0x63, 0xc3, 0xd9, 0xab, 0xe8, 0x45, 0x5c, 0x3f, 0x12, 0x58, 0xba, 0xa9, 0x8a, 0x0a, 0x90, 0x9d, 0x85, 0xd1, 0x52, 0x56, 0xa4, 0xd9, 0x47, 0x87, 0x19, 0x9d, 0xd5, 0x95, 0x0c, 0xb5, 0xff, 0x03, 0x3d, 0xee, 0x2c, 0x2e, 0xea, 0xa0, 0x2a, 0x3a, 0xf3, 0x3c, 0x72, 0x4c, 0x3c, 0x25, 0xae, 0xf9, 0x53, 0xc1, 0x78, 0xff, 0x53, 0xcf, 0x65, 0x33, 0x08, 0xfb, 0x42, 0xbb, 0x53, 0xaf, 0x9d, 0x7d, 0xd0, 0x2d, 0x88, 0xd7, 0xb7, 0xdb, 0x99, 0x91, 0x00, 0xdd, 0x35, 0x10, 0xcb, 0xe9, 0x0e, 0xcc, 0xfe, 0x57, 0xeb, 0x04, 0x30, 0x78, 0xa8, 0xb0, 0xc6, 0x29, 0x7d, 0xb7, 0x5b, 0xa8, 0x83, 0x62, 0x66, 0xa6, 0x73, 0x10, 0x16, 0x9d, 0xb1, 0x2c, 0x81, 0x63, 0x8a, 0x5d, 0xfe, 0x00, 0xba, 0xfc, 0xcf, 0xbd, 0x32, 0xcb, 0x04, 0x7d, 0x18, 0xe4, 0x9b, 0x50, 0x0e, 0xef, 0xec, 0x46, 0xb7, 0x98, 0x45, 0x81, 0x77, 0x41, 0xd1, 0x8e, 0x7b, 0xf3, 0xbe, 0xf6, 0xfa, 0x9b, 0x9e, 0x0f, 0xba, 0x73, 0x0e, 0x18, 0xd5, 0xbe, 0x96, 0x85, 0xbd, 0xb8, 0xd1, 0x98, 0x7e, 0xcd, 0xce, 0x31, 0x43, 0x09, 0xb5, 0xe7, 0x1c, 0xd0, 0xae, 0x57, 0xfe, 0xcf, 0xfe, 0xbc, 0x0c, 0x32, 0x73, 0xc1, 0x14, 0x17, 0x03, 0x93, 0x5d, 0x43, 0xb0, 0x39, 0xa0, 0x14, 0xaf, 0x28, 0x54, 0xb7, 0xc8, 0x12, 0x2e, 0x9b, 0x00, 0x00, 0xe9, 0x26, 0x76, 0xa0, 0x43, 0xa6, 0x8b, 0xe0, 0x48, 0x8a, 0x45, 0xbb, 0xd2, 0xd2, 0xf6, 0x53, 0x51, 0xc4, 0x18, 0x41, 0xc8, 0xe1, 0x7c, 0x29, 0x18, 0x17, 0xa4, 0x91, 0x81, 0x38, 0x6d, 0xf3, 0x66, 0xab, 0xf0, 0x10, 0x50, 0x62, 0xab, 0x88, 0x36, 0x0b, 0xdc, 0xa8, 0xfc, 0x8b, 0x2e, 0x83, 0x39, 0xa8, 0x97, 0x44, 0x3d, 0x05, 0x81, 0xc2, 0x53, 0x54, 0x28, 0x55, 0x43, 0xc7, 0x43, 0xe9, 0x1b, 0xc7, 0xe6, 0x50, 0x2f, 0xe9, 0xa7, 0xdd, 0x5f, 0x1e, 0x00, 0x2e, 0x98, 0x2a, 0xf4, 0x49, 0x9e, 0x57, 0xf5, 0xeb, 0x08, 0x6a, 0x06, 0x1c, 0x8c, 0xd6, 0x1d, 0x07, 0x7c, 0x30, 0xcb, 0x09, 0x91, 0xe3, 0x1e, 0x08, 0xe8, 0x25, 0xc7, 0x06, 0x4a, 0x29, 0x78, 0xf5, 0xb0, 0x96, 0x90, 0xcd, 0x06, 0x39, 0xfa, 0xdd, 0x30, 0xf6, 0x52, 0x5e, 0x4b, 0x05, 0x4a, 0x4e, 0x35, 0x5b, 0x4d, 0x7c, 0x4f, 0x65, 0x62, 0xdf, 0x81, 0xfc, 0x52, 0x2b, 0x7f, 0x96, 0x0d, 0xa6, 0x4b, 0xb9, 0x4a, 0x38, 0xfc, 0xb6, 0x6e, 0xc2, 0xbd, 0x93, 0xaf, 0xb1, 0x18, 0x49, 0x79, 0xd3, 0x75, 0x30, 0x10, 0x69, 0xdd, 0xb7, 0x78, 0x7d, 0x04, 0x58, 0x92, 0x76, 0x87, 0xcb, 0x87, 0xe9, 0x72, 0x7a, 0x69, 0xb2, 0x05, 0x36, 0x18, 0x44, 0xb8, 0x28, 0x63, 0x3d, 0x7c, 0x0a, 0x70, 0x3e, 0x44, 0x97, 0x5e, 0xf9, 0xc4, 0x3f, 0x28, 0x8b, 0x78, 0x20, 0xcd, 0x0d, 0xe9, 0x32, 0xae, 0x65, 0x2c, 0xc1, 0x37, 0x62, 0xab, 0x21, 0xc1, 0x09, 0x28, 0x9d, 0xb7, 0x29, 0xfe, 0xb0, 0xf8, 0x36, 0xaa, 0x78, 0x7d, 0x53, 0x8b, 0x67, 0x3c, 0xb1, 0xe6, 0x3c, 0x4c, 0x18, 0x2d, 0x31, 0x49, 0xc3, 0x81, 0x76, 0xfa, 0x71, 0x75, 0xdf, 0x31, 0xb9, 0x15, 0xda, 0xf3, 0x9e, 0x27, 0xa3, 0xd9, 0x63, 0xb0, 0xbb, 0xb6, 0xa1, 0xba, 0x96, 0x7a, 0x96, 0x55, 0x93, 0x57, 0xc0, 0xdc, 0x32, 0x22, 0xaa, 0x79, 0x82, 0xfb, 0x07, 0xeb, 0xd8, 0x30, 0xfd, 0x87, 0xc6, 0x5f, 0xc3, 0x7d, 0x4b, 0xdb, 0x6e, 0x5d, 0x48, 0x51, 0x08, 0xda, 0x33, 0xac, 0xe3, 0xcd, 0x0f, 0x35, 0x2c, 0x7d, 0x9c, 0xff, 0xc3, 0x1d, 0xcb, 0x82, 0x4a, 0x96, 0x74, 0x86, 0x7d, 0x87, 0x4b, 0x43, 0xc1, 0x8a, 0x11, 0xc6, 0xff, 0xba, 0x07, 0x96, 0xb2, 0x72, 0xa8, 0x98, 0x3f, 0x57, 0x97, 0x30, 0x86, 0x98, 0xd7, 0xa9, 0xb6, 0x74, 0x3a, 0xd7, 0x65, 0xfd, 0x1c, 0xfa, 0xe0, 0x1c, 0x50, 0xe6, 0xbf, 0xd6, 0x5b, 0x61, 0xbd, 0xcd, 0xe0, 0xcd, 0xc7, 0x0a, 0x5c, 0x07, 0x53, 0xf9, 0x14, 0x8e, 0xf3, 0xb5, 0x4b, 0xe8, 0x2a, 0x86, 0xb7, 0x41, 0x7e, 0xa9, 0x36, 0x56, 0xce, 0x4f, 0xbe, 0x91, 0xe6, 0xe7, 0x92, 0x75, 0x51, 0xa0, 0xbc, 0x3d, 0x6e, 0x2a, 0xb7, 0xc0, 0xc7, 0xbd, 0x6c, 0x98, 0x9d, 0x5d, 0x60, 0x83, 0xc8, 0x5c, 0x2b, 0x09, 0xbe, 0x20, 0x2c, 0x60, 0xf1, 0x27, 0x7b, 0x8c, 0x5e, 0x47, 0x1f, 0xca, 0x62, 0x3b, 0x81, 0x2f, 0xd0, 0x5b, 0x21, 0x8d, 0x42, 0xab, 0x88, 0x96, 0xac, 0x17, 0x7e, 0x44, 0x37, 0xfd, 0x7c, 0x78, 0x4c, 0xec, 0x64, 0xe1, 0xee, 0xac, 0x70, 0x1f, 0x4e, 0x7e, 0x68, 0x28, 0x99, 0xa4, 0x19, 0xeb, 0x15, 0x24, 0x02, 0x34, 0x6c, 0xca, 0x50, 0xd0, 0x48, 0x6c, 0x0d, 0xf1, 0x1f, 0x71, 0x94, 0xd4, 0x51, 0x94, 0x48, 0xa0, 0x70, 0xe6, 0x85, 0x92, 0xde, 0x12, 0xd7, 0x57, 0x9e, 0xe5, 0x6a, 0xb9, 0x64, 0x0e, 0xc2, 0x7e, 0xee, 0x22, 0xac, 0x8d, 0x97, 0xe3, 0x75, 0x53, 0x2a, 0xc1, 0x59, 0x65, 0xf4, 0xa1, 0x3e, 0x67, 0x1d, 0xde, 0xa3, 0x2c, 0x38, 0x8d, 0xd3, 0x1e, 0x18, 0x06, 0x5e, 0xe1, 0xe5, 0xa0, 0xc9, 0x33, 0x70, 0xbb, 0x85, 0x17, 0xc4, 0x04, 0x1e, 0x32, 0xfe, 0xf4, 0xb5, 0x75, 0x5e, 0x9a, 0xb0, 0xfc, 0x9d, 0x9b, 0xb0, 0x36, 0x81, 0x77, 0xc3, 0x47, 0xb0, 0x0d, 0xdc, 0xaa, 0xc2, 0x62, 0x80, 0x1b, 0x99, 0x9e, 0xc1, 0xb4, 0xf5, 0x57, 0x70, 0x56, 0x43, 0x12, 0x8f, 0x4a, 0xb6, 0x07, 0x05, 0x28, 0x99, 0x25, 0x95, 0xf8, 0xe4, 0x56, 0x11, 0x98, 0x0d, 0x04, 0xcb, 0x5e, 0x20, 0xdc, 0x4d, 0xfd, 0x12, 0xd2, 0x4a, 0xad, 0x53, 0x65, 0xd4, 0x86, 0xa2, 0x24, 0xce, 0x2d, 0x25, 0x71, 0xa5, 0xb3, 0xb9, 0x85, 0x3b, 0xba, 0x87, 0xb4, 0x24, 0xda, 0xd8, 0xf2, 0x15, 0x43, 0x2a, 0x97, 0x99, 0xa3, 0x82, 0x5f, 0x06, 0x4a, 0x05, 0xb5, 0xb0, 0x8c, 0xc2, 0x31, 0x5c, 0x66, 0xd3, 0x5f, 0xf8, 0x65, 0xa4, 0xc2, 0x89, 0xc4, 0x92, 0x18, 0x64, 0xd4, 0xb8, 0xe0, 0xa1, 0xa1, 0x05, 0x1a, 0xcd, 0xd3, 0x92, 0x4e, 0xdf, 0xd2, 0x33, 0xcf, 0x6d, 0x2e, 0x4d, 0x41, 0x20, 0x3d, 0xe7, 0x59, 0x66, 0x06, 0x03, 0xe4, 0x66, 0x5d, 0x2e, 0x0b, 0x39, 0x50, 0x56, 0xd5, 0x57, 0xc2, 0xdc, 0xed, 0x4f, 0x56, 0xea, 0xa6, 0xbc, 0x8f, 0x07, 0x3c, 0x74, 0x35, 0xe8, 0x5d, 0x02, 0xfa, 0x89, 0xe7, 0x57, 0x5d, 0x7d, 0xf4, 0xbc, 0xcf, 0x83, 0x14, 0x0b, 0x14, 0x59, 0xd9, 0x1f, 0xed, 0xd5, 0x99, 0x89, 0xf4, 0x31, 0x6f, 0x84, 0xc7, 0xa7, 0x83, 0x2c, 0x68, 0x3d, 0x8b, 0xea, 0xe4, 0xe3, 0x92, 0x33, 0x33, 0xbb, 0xf8, 0x72, 0x60, 0xb8, 0xbb, 0x42, 0xea, 0x6a, 0xf4, 0xe1, 0x69, 0x18, 0xa5, 0xe1, 0x74, 0x10, 0xb1, 0x21, 0xc3, 0x3b, 0x2c, 0xfc, 0x91, 0xf4, 0xd5, 0xc0, 0x44, 0x1a, 0xe1, 0x62, 0x50, 0x64, 0xfb, 0x70, 0x59, 0xf5, 0x88, 0x46, 0x98, 0x31, 0x2f, 0x85, 0x7f, 0xce, 0x99, 0xc1, 0xa0, 0x2e, 0x75, 0x7a, 0xcb, 0xec, 0xc0, 0x4e, 0x76, 0xb5, 0x43, 0x6c, 0x62, 0x59, 0x5d, 0x4c, 0x7c, 0x21, 0x02, 0x9e, 0x02, 0x64, 0x04, 0x80, 0xe6, 0x55, 0x91, 0xf3, 0x77, 0x1f, 0xfe, 0x90, 0x3e, 0x34, 0xc2, 0x77, 0x26, 0xe1, 0xc6, 0x89, 0xe1, 0x27, 0xdc, 0xd7, 0x86, 0xc6, 0x8c, 0x59, 0x7f, 0x9a, 0x17, 0xe4, 0xa2, 0x2a, 0xb6, 0x56, 0x9e, 0x7f, 0x23, 0x14, 0x99, 0x32, 0x5a, 0xb6, 0x17, 0xc9, 0xa1, 0x00, 0x1e, 0x44, 0xc6, 0x14, 0x98, 0xf2, 0xa8, 0xe7, 0xf8, 0x89, 0xf8, 0xf2, 0x20, 0x76, 0x41, 0x2a, 0x82, 0x72, 0x26, 0x31, 0x86, 0x56, 0xec, 0xce, 0x2c, 0x30, 0x38, 0x9b, 0xf3, 0x96, 0x19, 0xfd, 0xf9, 0x3a, 0x48, 0x59, 0x63, 0xbf, 0xaf, 0x85, 0xff, 0xcb, 0x29, 0x7d, 0x28, 0x5e, 0x89, 0x58, 0xeb, 0x62, 0xdd, 0x7a, 0x68, 0x83, 0xf4, 0x0a, 0x7a, 0x40, 0x1d, 0xa7, 0x9a, 0x42, 0x32, 0x56, 0x00, 0xed, 0xd5, 0xbf, 0x0c, 0x36, 0xfa, 0x9a, 0xe5, 0xb4, 0xa6, 0x64, 0x60, 0xf9, 0xf5, 0x56, 0x23, 0x22, 0x62, 0x97, 0x0a, 0xad, 0x43, 0xb1, 0xc9, 0x8b, 0x93, 0x42, 0xd3, 0x76, 0xf4, 0xf4, 0x7b, 0x85, 0xf4, 0xae, 0x59, 0xfe, 0x90, 0x0c, 0xf0, 0x6b, 0xf7, 0x0d, 0x8d, 0xf0, 0x90, 0x0c, 0x72, 0xdb, 0x3d, 0xf2, 0x34, 0x7d, 0xe2, 0xa9, 0x62, 0x39, 0x21, 0xd4, 0x67, 0xda, 0x68, 0xbd, 0xb2, 0x29, 0x2e, 0x8e, 0x14, 0xc0, 0x79, 0xc5, 0x69, 0x19, 0xa4, 0xe2, 0x7a, 0xea, 0x5f, 0x62, 0x22, 0xb5, 0xf7, 0xf1, 0xb0, 0x9a, 0xd8, 0xdc, 0x8d, 0x71, 0x50, 0xc5, 0x1f, 0x15, 0x95, 0x9a, 0xec, 0x02, 0x0a, 0xc8, 0x03, 0x23, 0xbe, 0xab, 0x98, 0xe5, 0x35, 0x49, 0xee, 0x90, 0x6c, 0x41, 0x7a, 0xd7, 0x17, 0xfe, 0x45, 0xae, 0x2d, 0x30, 0x92, 0x5b, 0xa6, 0x7d, 0xc1, 0xd0, 0x84, 0x73, 0x73, 0x38, 0x10, 0xc2, 0xef, 0xd0, 0x66, 0xa8, 0xc4, 0xf8, 0x33, 0xac, 0xb0, 0x8a, 0xbe, 0x8f, 0xc1, 0x6a, 0x25, 0x80, 0xba, 0x5e, 0xe9, 0x8f, 0xb8, 0x20, 0xad, 0x64, 0x15, 0xb2, 0x3b, 0x31, 0x8d, 0xf2, 0xc8, 0xe5, 0x9f, 0x6e, 0x79, 0xa3, 0x36, 0x79, 0x26, 0x72, 0x89, 0x7f, 0x5d, 0x36, 0x40, 0x95, 0xaa, 0xdf, 0xd8, 0x54, 0x15, 0xe0, 0x48, 0xe8, 0xed, 0xe2, 0xe5, 0x64, 0xc4, 0xba, 0x83, 0x58, 0xbb, 0x99, 0xdd, 0xa6, 0x00, 0x83, 0x37, 0x91, 0x94, 0x03, 0x41, 0x17, 0x52, 0x1c, 0x3f, 0x81, 0x2d, 0x82, 0x67, 0x38, 0xb9, 0x0b, 0x8a, 0xda, 0xed, 0x60, 0xf7, 0x8d, 0x27, 0xf8, 0x9d, 0x94, 0x70, 0x47, 0x6f, 0x20, 0x01, 0x32, 0x0d, 0x68, 0x07, 0xc7, 0xa0, 0xfb, 0xa4, 0x2b, 0x05, 0x55, 0x36, 0xd3, 0x2f, 0xb1, 0xdb, 0xf7, 0xc6, 0x1f, 0x35, 0x44, 0x14, 0xd6, 0x6a, 0xd2, 0x22, 0xcb, 0x6f, 0x55, 0x1e, 0x83, 0x87, 0x97, 0x00, 0x25, 0x06, 0x26, 0x6e, 0xd3, 0x5b, 0x49, 0xdc, 0x3a, 0x4d, 0x39, 0xf7, 0x68, 0x85, 0x8e, 0x44, 0xde, 0x4d, 0xf8, 0x04, 0xe7, 0x97, 0x2f, 0x5c, 0x28, 0x41, 0x2d, 0xb2, 0x77, 0x97, 0x9a, 0x5a, 0xf1, 0x1a, 0x88, 0x72, 0x46, 0x80, 0x60, 0x0a, 0x58, 0xfb, 0x1c, 0x89, 0x05, 0xbe, 0xb7, 0x4b, 0x40, 0xbe, 0xe2, 0x8f, 0x67, 0xb5, 0xf9, 0x91, 0xd0, 0x6d, 0x35, 0xf3, 0xa6, 0x3b, 0x23, 0x61, 0xf3, 0xc9, 0x55, 0x75, 0xfd, 0x19, 0x57, 0xd8, 0xd6, 0xc7, 0xe4, 0xab, 0x2f, 0x8f, 0x5a, 0x25, 0x6d, 0x0e, 0x6c, 0x7d, 0xff, 0xcd, 0x17, 0x0a, 0xee, 0x7b, 0xd7, 0xa9, 0xb5, 0x7a, 0x1a, 0x5f, 0x54, 0x9e, 0xf5, 0x3f, 0xa0, 0x31, 0x16, 0x8e, 0xdd, 0x3a, 0xfa, 0x26, 0x8e, 0xfe, 0x60, 0x18, 0x8c, 0xc8, 0xfd, 0x95, 0x56, 0xe6, 0x71, 0x0f, 0xa8, 0xf4, 0x7a, 0x9b, 0x4f, 0x5d, 0x67, 0x9a, 0x3b, 0x1e, 0xd0, 0x98, 0xd6, 0xcd, 0x85, 0x74, 0x94, 0xda, 0xc4, 0xc1, 0xcb, 0x16, 0xaf, 0x6d, 0xc6, 0x71, 0xfc, 0xa0, 0x15, 0x08, 0xef, 0xe7, 0x26, 0x5f, 0x85, 0x92, 0x1a, 0xea, 0xf3, 0x5b, 0xd1, 0xd3, 0x4e, 0x48, 0x47, 0xf7, 0x8c, 0xd2, 0x24, 0x32, 0xab, 0x46, 0x8e, 0xdc, 0x30, 0x6c, 0x42, 0x93, 0xd3, 0x67, 0xe3, 0x3b, 0x79, 0xdc, 0x91, 0x44, 0x62, 0x56, 0xbe, 0x2b, 0xa4, 0xe9, 0x3d, 0x44, 0xd8, 0x16, 0x9c, 0xb6, 0x13, 0xef, 0xb4, 0xc7, 0x18, 0x7b, 0x7e, 0x5a, 0xcb, 0x5c, 0x29, 0xb5, 0xe9, 0xaf, 0x69, 0x88, 0xf7, 0x34, 0x11, 0x2b, 0x78, 0xaf, 0xe4, 0x28, 0x63, 0x8e, 0xa8, 0xf9, 0xd4, 0xcb, 0x7d, 0x13, 0x02, 0x14, 0x6d, 0x23, 0x71, 0x2a, 0x44, 0x97, 0x69, 0x87, 0xa2, 0x60, 0xa6, 0x43, 0x4e, 0xf6, 0x51, 0x38, 0xcd, 0x9d, 0x2f, 0x65, 0x34, 0xe8, 0x19, 0x90, 0x3a, 0x7b, 0xac, 0x2f, 0x91, 0x14, 0x41, 0x89, 0x77, 0xcd, 0x1f, 0x19, 0x88, 0x9b, 0xf0, 0x33, 0xd6, 0x1b, 0x72, 0xea, 0x3b, 0x8e, 0x6f, 0x30, 0xee, 0x21, 0xef, 0x3f, 0x55, 0x73, 0xac, 0x38, 0x1a, 0x51, 0xc6, 0x0a, 0x81, 0xc4, 0xb8, 0x96, 0xf9, 0x4d, 0x8b, 0x11, 0xf1, 0x6f, 0x4a, 0xa9, 0xec, 0x6e, 0xb5, 0x6b, 0xd8, 0x57, 0x39, 0x64, 0x9b, 0x40, 0x20, 0x06, 0xf0, 0xd1, 0x06, 0xce, 0x71, 0x03, 0x8c, 0x24, 0xf4, 0x28, 0x50, 0x83, 0x1b, 0x2c, 0x1c, 0xd9, 0x27, 0x1a, 0x5d, 0x31, 0x0d, 0xe1, 0xd7, 0x8f, 0xcc, 0x59, 0x98, 0x1b, 0xfd, 0x81, 0x2a, 0x82, 0xac, 0x0b, 0x0d, 0x9a, 0x66, 0x1a, 0x64, 0x45, 0x93, 0x4a, 0xef, 0x97, 0x07, 0xf1, 0x39, 0x3b, 0xd3, 0xa4, 0x13, 0x12, 0x61, 0xfd, 0x40, 0x1e, 0xc0, 0x9c, 0x72, 0x9f, 0x3c, 0x6c, 0x76, 0x7b, 0x32, 0x27, 0xab, 0xe3, 0x22, 0x1d, 0xb8, 0x34, 0x06, 0x31, 0x7e, 0x1b, 0xe2, 0x24, 0x4c, 0xfd, 0x9d, 0x16, 0x52, 0x96, 0x0f, 0x49, 0x59, 0xe0, 0x5b, 0x29, 0xb1, 0x36, 0x7f, 0x89, 0x6a, 0xb9, 0x29, 0x30, 0xc7, 0xf3, 0xcd, 0x94, 0xef, 0xba, 0xf4, 0xe5, 0xe6, 0x57, 0xd7, 0x4d, 0xbc, 0xe8, 0x2c, 0x77, 0x04, 0x03, 0x40, 0x4e, 0x88, 0x9c, 0x46, 0x07, 0x3b, 0x29, 0xee, 0x61, 0x6f, 0x03, 0x3a, 0x2b, 0x48, 0x10, 0x8e, 0x07, 0x71, 0x9f, 0x06, 0x6f, 0x0d, 0x93, 0x0b, 0xf5, 0xf1, 0xc4, 0x29, 0xcf, 0x10, 0xa2, 0x1b, 0x92, 0x36, 0x1c, 0x28, 0x3e, 0xfa, 0xc0, 0xb3, 0x7b, 0xee, 0x23, 0x0d, 0x22, 0x18, 0x83, 0x8d, 0xff, 0xa6, 0xab, 0xe3, 0xd6, 0xdd, 0x17, 0xa9, 0xa3, 0x53, 0x59, 0x3b, 0x26, 0x5e, 0xbb, 0xc9, 0x9f, 0xcc, 0x26, 0xaa, 0xd7, 0xd4, 0x42, 0xf3, 0x5f, 0x4d, 0xdf, 0x49, 0x1c, 0x1e, 0x94, 0xf3, 0x04, 0xf6, 0xa5, 0x33, 0x22, 0x3d, 0x2a, 0xd7, 0xe0, 0x4a, 0x6e, 0x0b, 0x85, 0xd6, 0x96, 0x71, 0xfd, 0xb0, 0x83, 0x74, 0xd9, 0xb3, 0xf9, 0xd9, 0x96, 0xf6, 0x00, 0x96, 0x22, 0x42, 0x8a, 0xe8, 0x9c, 0xc9, 0x57, 0xa0, 0x5b, 0x14, 0x16, 0xbd, 0x33, 0x3e, 0xcd, 0x40, 0xf3, 0x60, 0x7a, 0x3c, 0x32, 0x4c, 0xfb, 0x2d, 0x4c, 0x7e, 0x2b, 0x8a, 0xa7, 0x4f, 0x4e, 0x9e, 0x3b, 0x6c, 0xaf, 0x93, 0x51, 0x87, 0x87, 0xd0, 0x8a, 0x4c, 0x21, 0x85, 0x24, 0x97, 0x3c, 0x83, 0x79, 0xe4, 0xb1, 0x52, 0xc8, 0x07, 0x55, 0x7d, 0x38, 0x1d, 0x21, 0x31, 0x1a, 0xc2, 0x90, 0x06, 0x6f, 0x84, 0x49, 0x1d, 0xaa, 0x98, 0xfe, 0x6b, 0xb7, 0xcc, 0x94, 0x54, 0x3b, 0xbd, 0x84, 0x7c, 0x1e, 0x4a, 0x81, 0xda, 0x47, 0x48, 0x5b, 0x0e, 0xa6, 0x77, 0x23, 0xf4, 0x78, 0xb5, 0x90, 0x79, 0xc6, 0x72, 0xa1, 0xad, 0x2f, 0x64, 0x84, 0x1a, 0xe8, 0x7c, 0xb7, 0x55, 0x01, 0x18, 0x6d, 0xd2, 0xea, 0x7a, 0x33, 0xfc, 0x35, 0x79, 0xd3, 0x85, 0x9d, 0x76, 0x78, 0xfb, 0x48, 0x92, 0x14, 0x9d, 0x49, 0x1e, 0xff, 0x6c, 0x69, 0x54, 0xe1, 0x85, 0x27, 0x44, 0xd1, 0xad, 0xfd, 0x10, 0xbe, 0x2e, 0xe5, 0x5c, 0x0e, 0xe2, 0x1c, 0x01, 0x86, 0x8d, 0x26, 0x01, 0x6a, 0x6f, 0x12, 0xc0, 0xe5, 0x1a, 0xff, 0x71, 0xaa, 0x82, 0xdf, 0xce, 0xdc, 0x53, 0x7b, 0x0c, 0x2c, 0x87, 0xb8, 0x0e, 0x41, 0x37, 0x18, 0xd9, 0x5c, 0xb1, 0x83, 0x48, 0x3c, 0xcc, 0x48, 0x00, 0x3f, 0x78, 0x5f, 0xa7, 0xcb, 0x99, 0xf1, 0x51, 0xec, 0x16, 0x19, 0x3b, 0x3e, 0x2c, 0xed, 0xbc, 0x0e, 0x09, 0xb8, 0x78, 0xbc, 0x96, 0x8a, 0xd7, 0x63, 0x94, 0xf3, 0xb6, 0xbc, 0xea, 0x0b, 0x5c, 0x40, 0x3d, 0xb5, 0xaf, 0x8d, 0xc2, 0x25, 0xa7, 0x0b, 0x50, 0xa0, 0x04, 0xcf, 0xba, 0x83, 0x3c, 0xc0, 0x5b, 0x87, 0xb8, 0xf8, 0xf2, 0x43, 0x3f, 0x6d, 0xb1, 0xf3, 0xb3, 0xd0, 0x90, 0x77, 0xfb, 0xb5, 0xe7, 0x9f, 0x40, 0xf5, 0x3c, 0xa5, 0x5c, 0x50, 0x59, 0xfb, 0x8f, 0x57, 0xa2, 0x47, 0x74, 0x8a, 0xa6, 0xad, 0x34, 0xbd, 0xf4, 0x4c, 0xfa, 0xc0, 0x30, 0x0b, 0xa7, 0x3e, 0x66, 0x95, 0xc6, 0xe6, 0x9d, 0xa2, 0xc2, 0xc9, 0xb0, 0x79, 0x56, 0x03, 0x59, 0xb2, 0x46, 0x9e, 0x8f, 0x41, 0x4d, 0xb3, 0x12, 0xb0, 0x56, 0xd2, 0x44, 0xac, 0xef, 0xa4, 0x3a, 0xc3, 0xfa, 0xcf, 0x13, 0x6c, 0xa5, 0x1a, 0x88, 0x48, 0x9d, 0xd2, 0xc5, 0xa7, 0x7f, 0x6c, 0x77, 0x4e, 0x90, 0x6b, 0x27, 0x78, 0xad, 0x85, 0xc6, 0x1a, 0x85, 0x01, 0x89, 0x6b, 0x05, 0x63, 0xf7, 0xa4, 0x14, 0x4b, 0x40, 0x04, 0x81, 0x9b, 0xd0, 0x18, 0x39, 0xd8, 0x24, 0x39, 0xbe, 0xd3, 0xdc, 0x56, 0xd4, 0x88, 0x12, 0xf4, 0x7e, 0x46, 0xeb, 0x72, 0x28, 0x10, 0x6b, 0x92, 0x26, 0x44, 0x8e, 0x35, 0x5d, 0x7a, 0x94, 0x66, 0x40, 0xaf, 0x9c, 0x9a, 0xff, 0xa3, 0x74, 0x36, 0xfa, 0x7f, 0xb0, 0x52, 0x7c, 0xbb, 0xf9, 0xbd, 0xa6, 0x3f, 0xa8, 0x41, 0xa9, 0xc8, 0x94, 0x28, 0x39, 0x8e, 0x27, 0xfe, 0x3e, 0x24, 0xb8, 0x99, 0xcc, 0x9f, 0x14, 0x57, 0x55, 0xfa, 0x5e, 0xa7, 0x1d, 0xb9, 0x1a, 0xcb, 0xef, 0xcd, 0x84, 0xdc, 0x0f, 0xb8, 0x26, 0x0e, 0x6f, 0xf1, 0xa9, 0x35, 0x25, 0x8a, 0xec, 0x88, 0x1d, 0x10, 0x53, 0xa5, 0x0b, 0xb3, 0x62, 0xd6, 0xa4, 0xa6, 0x8a, 0x93, 0x0e, 0xc9, 0x42, 0x48, 0x95, 0x86, 0x5a, 0x58, 0x9f, 0xf8, 0x8c, 0x61, 0xe2, 0x53, 0x55, 0xc2, 0xd4, 0x80, 0x03, 0x5a, 0x63, 0x07, 0x0e, 0x93, 0xe7, 0x32, 0xab, 0x9f, 0x55, 0x70, 0x9f, 0x02, 0xb5, 0xf7, 0x51, 0x51, 0xd6, 0xad, 0x24, 0x39, 0x40, 0x49, 0x03, 0xc2, 0x6a, 0xb5, 0x3e, 0xd5, 0x2d, 0xb7, 0x94, 0xfd, 0x79, 0xd1, 0x91, 0x6a, 0x47, 0x66, 0x1a, 0x3b, 0xce, 0x1d, 0x46, 0xfd, 0xfa, 0x8b, 0x6f, 0x6e, 0x1a, 0x0c, 0x89, 0x87, 0xd9, 0xf1, 0xb3, 0xba, 0x6f, 0xe1, 0x0c, 0x79, 0x18, 0x79, 0xc8, 0xf7, 0xc5, 0x36, 0x83, 0x32, 0x12, 0x95, 0xd4, 0x31, 0x79, 0x78, 0x26, 0x8a, 0xc5, 0xcc, 0xc3, 0x28, 0xc9, 0x69, 0x32, 0x4b, 0x51, 0x39, 0xc3, 0xd0, 0x59, 0x9d, 0x68, 0xb3, 0x7d, 0x0c, 0xc6, 0xd2, 0xb1, 0xfe, 0x8c, 0xf4, 0x32, 0x08, 0x04, 0x09, 0xbd, 0x48, 0xe8, 0xb4, 0xfe, 0x03, 0x76, 0x06, 0x4b, 0x8d, 0xc6, 0x8d, 0x92, 0x69, 0x5c, 0x8d, 0x90, 0xb2, 0xfa, 0x8d, 0x44, 0xb9, 0xb7, 0x15, 0xa4, 0xf0, 0x55, 0xb7, 0x8e, 0x07, 0xd0, 0x4c, 0x01, 0x54, 0x33, 0x80, 0x8d, 0x78, 0xaf, 0x91, 0x08, 0x40, 0xee, 0x53, 0x83, 0xc9, 0xa5, 0x78, 0x7c, 0xe8, 0x69, 0x0e, 0x56, 0xc8, 0xc3, 0x49, 0x06, 0xd5, 0x86, 0x83, 0x0e, 0xd9, 0x60, 0x81, 0xaf, 0x65, 0xb0, 0xf8, 0x5a, 0x73, 0x97, 0x4f, 0x69, 0x49, 0x52, 0xa7, 0x0c, 0xa1, 0xc7, 0x19, 0x86, 0x06, 0x5d, 0x3e, 0x99, 0x81, 0x11, 0xf5, 0x3e, 0x75, 0xc7, 0x60, 0x9a, 0xc8, 0xdd, 0x30, 0x2e, 0x43, 0x06, 0x23, 0x4e, 0x3c, 0x56, 0xca, 0xd4, 0x72, 0x99, 0x90, 0x15, 0x38, 0xe9, 0xf8, 0x14, 0xd6, 0x80, 0x26, 0xf6, 0x2c, 0xca, 0xa1, 0xb6, 0x98, 0xbe, 0x57, 0x1a, 0x1a, 0x6f, 0xe2, 0xe6, 0xb6, 0xde, 0x09, 0x4f, 0x1a, 0x13, 0x8a, 0xb2, 0x81, 0x6c, 0x17, 0x86, 0xd7, 0x34, 0x9e, 0x90, 0x1e, 0x77, 0xcd, 0x55, 0x10, 0x15, 0xd6, 0xd5, 0x06, 0x16, 0x6f, 0x76, 0x18, 0x3d, 0x1d, 0x3f, 0x86, 0xe0, 0xb3, 0x46, 0x57, 0xf7, 0x15, 0x6c, 0x3f, 0x72, 0x42, 0x47, 0xc6, 0xd0, 0x92, 0x60, 0xa7, 0xed, 0x3c, 0x9f, 0x76, 0x1b, 0x1a, 0x03, 0x86, 0x75, 0xb1, 0x96, 0x0a, 0x70, 0x6c, 0xa1, 0x7a, 0xb3, 0x28, 0x1c, 0x39, 0x29, 0xf5, 0x68, 0x74, 0x54, 0x1b, 0x41, 0x4d, 0xe4, 0x5c, 0xee, 0x39, 0x88, 0x79, 0xba, 0xa6, 0x04, 0xf8, 0xa8, 0xe2, 0x84, 0x23, 0x63, 0x38, 0x2f, 0x54, 0x74, 0x5c, 0x00, 0x70, 0xb7, 0x09, 0xd1, 0xb2, 0x10, 0xe8, 0xb9, 0xaa, 0x5a, 0xb4, 0x98, 0x85, 0xa0, 0x9c, 0xf0, 0x8e, 0x90, 0xe8, 0xf7, 0xf5, 0x2c, 0xe0, 0xea, 0xcf, 0xc3, 0xe9, 0xa3, 0x5f, 0x20, 0xf2, 0x6e, 0x94, 0x01, 0x0e, 0x19, 0xd2, 0xcb, 0x62, 0x4a, 0xf6, 0x7b, 0x42, 0x15, 0x94, 0xe0, 0x97, 0xce, 0x82, 0x08, 0x84, 0x1c, 0x9b, 0xf8, 0x49, 0x4f, 0xbd, 0x9f, 0x67, 0xf4, 0x14, 0x0d, 0x05, 0xa6, 0x9b, 0xe1, 0x92, 0x27, 0xdf, 0x00, 0xac, 0xaf, 0x07, 0x8d, 0x40, 0x83, 0x11, 0x15, 0xf3, 0xca, 0x5e, 0x09, 0xc1, 0x9c, 0x71, 0x72, 0xe4, 0x5d, 0xf4, 0xe0, 0xf8, 0x49, 0xfb, 0xa3, 0x5c, 0x4f, 0x8d, 0x3e, 0xdb, 0x23, 0x61, 0x19, 0x8c, 0x8f, 0xe5, 0x76, 0xf6, 0x0a, 0x84, 0xa6, 0x78, 0x8b, 0x29, 0x7d, 0xe9, 0x9f, 0xff, 0x03, 0x7b, 0xba, 0x7c, 0x6c, 0xe5, 0xca, 0x9d, 0x4b, 0xc1, 0x12, 0x73, 0x02, 0x32, 0x36, 0xde, 0x7d, 0xcb, 0x92, 0x99, 0x20, 0xac, 0xd0, 0x76, 0xfd, 0xee, 0xba, 0xeb, 0x4b, 0x42, 0x4c, 0xce, 0x13, 0xd4, 0x0e, 0x5d, 0x2d, 0x76, 0xa1, 0x81, 0x6b, 0xfa, 0x97, 0x54, 0x14, 0xdf, 0x88, 0xe0, 0x94, 0x31, 0x61, 0x2a, 0x71, 0xaa, 0x00, 0x6f, 0x81, 0x1d, 0xfe, 0xad, 0x5b, 0x15, 0xcc, 0x65, 0x0b, 0xb9, 0x02, 0x9f, 0x0a, 0xf2, 0xf3, 0x30, 0x6d, 0xd0, 0x85, 0x38, 0x5c, 0x2a, 0x40, 0xee, 0xc6, 0x85, 0xa4, 0xa0, 0x53, 0x37, 0xc0, 0xf5, 0x9a, 0xcd, 0x00, 0x76, 0x95, 0xa9, 0x47, 0x4c, 0x51, 0xf0, 0x3d, 0x4b, 0xea, 0xa3, 0xeb, 0x30, 0xb7, 0x0b, 0x85, 0x27, 0xc2, 0x5b, 0x86, 0x91, 0x7b, 0x91, 0x02, 0x03, 0xad, 0x9d, 0x38, 0x92, 0xb0, 0xc5, 0x68, 0x4e, 0xe1, 0x48, 0xe4, 0x0c, 0x4f, 0x41, 0x68, 0x69, 0xb7, 0xcf, 0xae, 0x0b, 0xb3, 0x73, 0x3e, 0x2a, 0x2e, 0xb9, 0x84, 0x4f, 0x1b, 0x1b, 0x24, 0x5c, 0x66, 0x22, 0x92, 0xcd, 0x2b, 0xce, 0xdd, 0x3d, 0x27, 0x38, 0xcb, 0x2c, 0x6c, 0x76, 0x2b, 0xff, 0x58, 0xbf, 0x67, 0x48, 0xc7, 0xcf, 0x59, 0x48, 0x88, 0x8d, 0x5f, 0xb3, 0x0e, 0xec, 0xb2, 0xb2, 0x68, 0x0f, 0xf3, 0x2e, 0x74, 0xb0, 0x07, 0x4c, 0x4f, 0xc2, 0x25, 0x34, 0x0f, 0x55, 0x2d ],
+const [ 0x02, 0x87, 0xfa, 0x0e, 0x37, 0x7c, 0x9d, 0xd6, 0x08, 0xcf, 0x98, 0x53, 0x90, 0x7b, 0x01, 0x0b, 0xca, 0xe4, 0xc2, 0x16, 0x02, 0x75, 0xa7, 0xdd, 0x89, 0x88, 0xb5, 0x22, 0xad, 0x86, 0xbe, 0x41, 0xe8, 0x4f, 0x32, 0xb5, 0x58, 0xdc, 0x38, 0xdd, 0x6f, 0x23, 0xfd, 0x00, 0xec, 0x3a, 0x4c, 0x90, 0x0a, 0xc0, 0x60, 0xab, 0xf7, 0x79, 0xf6, 0xe7, 0x87, 0x38, 0xa6, 0x4f, 0x2a, 0x02, 0x72, 0xa9, 0x1c, 0x70, 0xa0, 0xfb, 0xdb, 0x55, 0xc5, 0x4d, 0xde, 0xa1, 0x23, 0xaf, 0x84, 0x85, 0x34, 0x7e, 0x4b, 0xd8, 0x87, 0xe4, 0x42, 0xba, 0xcb, 0x9e, 0xc1, 0x77, 0x2a, 0x02, 0x57, 0xae, 0xd8, 0x40, 0x04, 0xb2, 0xeb, 0xe8, 0xa8, 0x30, 0x6d, 0xac, 0xbc, 0x12, 0xaf, 0x68, 0x40, 0xa4, 0xe1, 0x5f, 0xf4, 0xf5, 0xe0, 0xc7, 0xcb, 0x81, 0x4f, 0x89, 0x9d, 0x0c, 0xe9, 0x42, 0x1c, 0xd1, 0x15, 0x8d, 0x09, 0xdc, 0xbb, 0x84, 0xa8, 0xb5, 0x57, 0x84, 0x71, 0x3e, 0x4c, 0x31, 0x08, 0xde, 0x7a, 0xba, 0x6f, 0xdf, 0x12, 0x5f, 0x7b, 0x15, 0xa9, 0x30, 0x84, 0xc1, 0x8c, 0x17, 0x61, 0xb4, 0x54, 0x18, 0x93, 0xb8, 0xba, 0xd8, 0xc1, 0x2b, 0xac, 0x5c, 0x65, 0xed, 0xa0, 0x14, 0xc4, 0x7d, 0x28, 0x18, 0x23, 0x5e, 0xc6, 0xb1, 0x38, 0xc0, 0x02, 0x1b, 0xdf, 0x5c, 0xbb, 0x89, 0x0e, 0xa0, 0xbb, 0x6a, 0x0b, 0x0c, 0x8e, 0xeb, 0xdc, 0xdc, 0x93, 0xbd, 0x00, 0xe7, 0x53, 0x18, 0x5c, 0xc7, 0x12, 0x00, 0x78, 0x3a, 0xa4, 0xc7, 0xeb, 0xc8, 0x82, 0xd3, 0x14, 0xa6, 0x1d, 0xa1, 0x0b, 0xdb, 0x72, 0x0a, 0xd7, 0xa1, 0xdf, 0xc5, 0xe2, 0x0e, 0x35, 0x2e, 0xaa, 0xf3, 0x0e, 0x45, 0xb8, 0x05, 0x61, 0xfa, 0xd6, 0x3a, 0x53, 0xa8, 0x7d, 0x76, 0x50, 0xdf, 0x8d, 0x67, 0x5b, 0x66, 0x40, 0xad, 0xa2, 0x80, 0x61, 0x3f, 0x56, 0x6f, 0xb9, 0x0a, 0xb9, 0x37, 0xcb, 0xdb, 0x79, 0xa4, 0xc1, 0x7e, 0x3c, 0x8e, 0xa5, 0x28, 0x7c, 0x5c, 0xd4, 0x12, 0x95, 0xc7, 0xb0, 0x67, 0x1c, 0xe1, 0x96, 0x60, 0x73, 0x55, 0x10, 0xad, 0x9a, 0xf0, 0x4b, 0x18, 0x48, 0x60, 0xcb, 0x65, 0x3b, 0x3c, 0x5d, 0x7c, 0xcc, 0x45, 0x4d, 0xca, 0xc6, 0xec, 0xda, 0xe4, 0x78, 0x14, 0xe7, 0x6d, 0x09, 0x18, 0xf3, 0x3b, 0x0c, 0x10, 0x4b, 0xb5, 0x54, 0x50, 0x7e, 0x7f, 0x0a, 0x32, 0x12, 0x5a, 0xfc, 0x16, 0x75, 0x45, 0x38, 0xa6, 0x36, 0xe8, 0xda, 0x5f, 0x75, 0x33, 0x22, 0x4d, 0x99, 0x43, 0xca, 0x15, 0x41, 0x85, 0x96, 0x39, 0x7c, 0x1d, 0x2c, 0x98, 0x3c, 0x89, 0x26, 0x34, 0x08, 0x81, 0x66, 0x38, 0xf2, 0x22, 0xa9, 0x3a, 0xc9, 0x4c, 0x5f, 0xbd, 0x8f, 0x49, 0xbb, 0xfa, 0x2d, 0xaf, 0x06, 0xe0, 0x66, 0x87, 0x38, 0x59, 0x0a, 0xae, 0xc9, 0xcf, 0x6c, 0x7c, 0xc5, 0xef, 0x15, 0xa4, 0x1f, 0xac, 0xba, 0x5b, 0x47, 0x87, 0x6c, 0xbd, 0xfe, 0x0e, 0x0f, 0x6c, 0x6a, 0xa3, 0x0d, 0x7a, 0x65, 0x7f, 0x4c, 0x89, 0x1b, 0xf7, 0x5d, 0x30, 0xd4, 0xfd, 0xf6, 0xa1, 0x0e, 0xe9, 0xa2, 0x89, 0xcf, 0x7a, 0xb7, 0x38, 0x39, 0x17, 0x88, 0x02, 0x5f, 0x5b, 0xdd, 0xe5, 0x57, 0xd1, 0xa0, 0x6c, 0x91, 0xfc, 0xd9, 0xd2, 0x66, 0x9b, 0xdd, 0x6b, 0xf4, 0x2a, 0xc1, 0x40, 0x2a, 0xac, 0x15, 0xf9, 0x1f, 0xa8, 0xcf, 0x01, 0xa8, 0x72, 0x86, 0xe4, 0x29, 0xab, 0xe1, 0xfc, 0xab, 0x0b, 0x4e, 0x4c, 0x2f, 0x5e, 0xf7, 0xac, 0x42, 0xcd, 0xf2, 0x27, 0xd2, 0x5f, 0xb7, 0xa1, 0x40, 0xc0, 0xd8, 0xbc, 0xb6, 0x40, 0xec, 0xfd, 0xbb, 0x1e, 0xcc, 0x2b, 0x05, 0x07, 0x03, 0xf8, 0x8e, 0xda, 0x7f, 0xe4, 0xea, 0xae, 0x8d, 0x5d, 0xd7, 0x16, 0x04, 0x2b, 0x16, 0xa4, 0xbf, 0x0b, 0x79, 0xab, 0x51, 0x9a, 0x3e, 0x49, 0xf5, 0x75, 0x9b, 0xa5, 0xc4, 0x9f, 0x9a, 0x76, 0x2b, 0x23, 0x27, 0xc5, 0x9b, 0xfa, 0x67, 0xf3, 0x82, 0x2e, 0x4c, 0xfd, 0x7b, 0x40, 0x67, 0xff, 0xc1, 0xc8, 0xfd, 0xf7, 0xea, 0x5b, 0x5c, 0xcc, 0xd2, 0xb1, 0x6f, 0x8f, 0xd5, 0x07, 0x91, 0x00, 0x41, 0xc3, 0x9f, 0x54, 0x0a, 0x57, 0x51, 0x35, 0xc0, 0x67, 0xca, 0x0b, 0xbf, 0x2e, 0x6d, 0x7a, 0xa6, 0x1e, 0xf3, 0x2b, 0x0a, 0xc6, 0xba, 0xd0, 0x6b, 0xf9, 0x60, 0x62, 0x66, 0x2d, 0x91, 0xad, 0x2d, 0x21, 0x1d, 0x0f, 0x35, 0xc3, 0x4e, 0x7d, 0x2e, 0x50, 0x78, 0xc6, 0x38, 0xbd, 0xd1, 0x1c, 0x54, 0x56, 0x83, 0xd0, 0x18, 0xa5, 0x00, 0x5d, 0xa8, 0x95, 0x96, 0xa8, 0xe1, 0xd7, 0x43, 0x86, 0xd7, 0x85, 0xca, 0x7f, 0x82, 0x05, 0x06, 0xd2, 0xb4, 0x31, 0x7f, 0xb8, 0x4e, 0xb4, 0x3b, 0xed, 0xb4, 0xb7, 0xd7, 0x6d, 0x7e, 0xbe, 0xd6, 0x7b, 0x71, 0xcc, 0x38, 0xe8, 0xad, 0xce, 0x4e, 0x92, 0x27, 0x36, 0xce, 0x2b, 0x5a, 0xe7, 0x23, 0x3c, 0x3a, 0x51, 0x06, 0x69, 0x6a, 0xdd, 0x52, 0xf6, 0xae, 0x8b, 0x14, 0x8a, 0xa3, 0xd9, 0xe2, 0x33, 0xae, 0xe8, 0x6f, 0xab, 0x32, 0xda, 0x5c, 0xda, 0x06, 0x7e, 0x50, 0x9b, 0x26, 0x2f, 0x4a, 0xc3, 0xa8, 0xf9, 0x36, 0x60, 0xf2, 0xfe, 0xbf, 0x3e, 0x2b, 0x18, 0x65, 0xb0, 0xef, 0xc0, 0xcf, 0x8c, 0x47, 0x2f, 0x62, 0x78, 0xd8, 0xc2, 0x12, 0x64, 0x5a, 0xa3, 0x78, 0x58, 0x4c, 0xa6, 0x25, 0x70, 0xe6, 0x71, 0x37, 0x25, 0x50, 0xe0, 0x2a, 0xcd, 0x11, 0xa8, 0xf0, 0x65, 0xca, 0x3a, 0x43, 0x8f, 0x24, 0xea, 0x3a, 0xd7, 0x07, 0x50, 0x1a, 0x3a, 0x0d, 0xee, 0x6f, 0xe9, 0x36, 0x14, 0x5c, 0x4a, 0xdd, 0x01, 0x30, 0x40, 0xea, 0x4b, 0x39, 0xac, 0x4a, 0x81, 0xdd, 0x34, 0x9c, 0x0e, 0xe6, 0x43, 0x2d, 0x60, 0x1e, 0x50, 0x27, 0x4a, 0x1c, 0x64, 0x05, 0xa7, 0x5d, 0xd6, 0x4a, 0x41, 0x97, 0x59, 0x73, 0xf1, 0x49, 0x3a, 0x2a, 0x07, 0x97, 0xe2, 0xbc, 0xeb, 0x55, 0xa2, 0xcd, 0x05, 0x62, 0xb0, 0x4b, 0xdb, 0x37, 0x6c, 0xa0, 0x79, 0xbf, 0xe8, 0x2c, 0x16, 0x6a, 0xa8, 0xf2, 0xf4, 0x7d, 0xa6, 0x91, 0x88, 0xac, 0x99, 0x77, 0xdb, 0xea, 0x77, 0x51, 0x30, 0x80, 0x39, 0xc5, 0xe7, 0x5c, 0xde, 0x64, 0xa1, 0xac, 0xb2, 0xda, 0xa5, 0xac, 0xd0, 0x68, 0x83, 0xbc, 0xe6, 0x95, 0xf7, 0xb6, 0x38, 0x20, 0x0f, 0x7e, 0xe8, 0x38, 0x90, 0xdb, 0x74, 0xef, 0x97, 0x85, 0x80, 0xed, 0x7c, 0x7f, 0xd6, 0x61, 0xfb, 0xa6, 0xab, 0x3e, 0x96, 0x8b, 0x24, 0xa3, 0x35, 0x7e, 0x18, 0x9a, 0x10, 0xeb, 0x18, 0x06, 0xce, 0xea, 0xac, 0xd7, 0xee, 0x11, 0xe0, 0x80, 0x67, 0x8c, 0xff, 0xab, 0x8b, 0x70, 0x9f, 0x2b, 0x31, 0x4d, 0xdd, 0x32, 0x13, 0x03, 0xea, 0xc4, 0x75, 0xd6, 0xc7, 0x6b, 0x08, 0xc4, 0x4c, 0x2d, 0x0d, 0x15, 0x6f, 0xbb, 0xbd, 0x35, 0xc3, 0xeb, 0xe9, 0xbf, 0x3f, 0x68, 0xde, 0xda, 0x41, 0xa8, 0x8b, 0xc8, 0xd2, 0x1f, 0xe6, 0xbc, 0x2c, 0xb3, 0x8b, 0xec, 0x7a, 0x6f, 0xa6, 0xe8, 0xde, 0x7b, 0x14, 0x2a, 0xb8, 0x4c, 0xc5, 0xee, 0x26, 0x18, 0x65, 0x44, 0xc7, 0x8d, 0x3b, 0x63, 0xc5, 0xc2, 0x51, 0x40, 0x12, 0x6e, 0xd5, 0x5f, 0xf1, 0x58, 0xbf, 0xe9, 0xb9, 0x0e, 0xb4, 0x00, 0xd5, 0xda, 0x2a, 0x4f, 0x10, 0xf2, 0xce, 0xe5, 0x10, 0xef, 0x22, 0x43, 0x1f, 0x80, 0x6b, 0xb3, 0x32, 0x60, 0xca, 0xdc, 0x23, 0x85, 0xa9, 0x94, 0x42, 0x9b, 0x58, 0xf5, 0x0c, 0xb0, 0xf8, 0xb3, 0x3a, 0x31, 0x99, 0xac, 0xfe, 0x15, 0x9f, 0xc1, 0x89, 0x58, 0x6a, 0xe5, 0xd0, 0xab, 0x36, 0x73, 0x90, 0x6a, 0x3f, 0xc5, 0x8f, 0xce, 0x29, 0x02, 0x26, 0x64, 0xa0, 0x37, 0xfc, 0xbd, 0x3c, 0xaa, 0x14, 0x67, 0xa7, 0x6b, 0x0a, 0x1d, 0x01, 0x2b, 0x99, 0x3b, 0x83, 0x51, 0x61, 0x75, 0x63, 0x4b, 0xe7, 0xc7, 0xf8, 0x22, 0xde, 0xaf, 0x1f, 0x52, 0xa5, 0x9b, 0xdd, 0xd8, 0x10, 0x9d, 0x46, 0x8c, 0x6b, 0x66, 0x9d, 0xb1, 0xbc, 0x72, 0xbc, 0xcb, 0x49, 0x80, 0xb6, 0xb0, 0x5a, 0x45, 0xbc, 0xe2, 0x40, 0x61, 0x3d, 0x1c, 0x96, 0x92, 0x51, 0x2b, 0xc7, 0x28, 0x58, 0xff, 0xd1, 0xb9, 0xde, 0x02, 0x48, 0x15, 0xc3, 0xa9, 0x9d, 0x7c, 0x98, 0x48, 0xa0, 0x0f, 0x4b, 0x2a, 0x44, 0x85, 0x07, 0xe1, 0xa2, 0x1f, 0x56, 0xdb, 0x41, 0xde, 0x89, 0x36, 0x95, 0xf3, 0x59, 0xd5, 0xc5, 0x77, 0xce, 0xb4, 0xb2, 0x5c, 0x60, 0x78, 0x34, 0xa4, 0x5d, 0x4b, 0xa6, 0xd0, 0x8a, 0xe6, 0xa6, 0x9c, 0x0d, 0xef, 0x16, 0xe9, 0x8a, 0x86, 0x66, 0xfb, 0x8d, 0x1b, 0x16, 0xe4, 0x28, 0x82, 0x76, 0x40, 0xdd, 0x49, 0xb1, 0x23, 0xbd, 0x49, 0x09, 0x50, 0xd2, 0x7b, 0x64, 0xac, 0xbb, 0x0d, 0x08, 0xf2, 0x96, 0xb5, 0xa3, 0xa7, 0x23, 0x46, 0x8e, 0x51, 0x25, 0x81, 0x52, 0xe4, 0x0c, 0x2d, 0x6c, 0x7d, 0xd2, 0x6a, 0x4d, 0x52, 0x23, 0x42, 0xa5, 0xe9, 0xc0, 0x81, 0xe1, 0x89, 0x25, 0xc6, 0xf2, 0xef, 0x6a, 0xdb, 0x51, 0x41, 0x67, 0x42, 0x40, 0x48, 0x1b, 0x10, 0x52, 0xd9, 0x4f, 0xff, 0x2d, 0x94, 0x76, 0xbe, 0x8f, 0xd2, 0xd8, 0x8b, 0x8f, 0xd8, 0xef, 0x04, 0x26, 0x51, 0x11, 0x3a, 0xed, 0xfb, 0x50, 0x08, 0x28, 0xa0, 0x9f, 0xa3, 0x04, 0x48, 0x36, 0x71, 0x1d, 0xad, 0x37, 0x1f, 0x43, 0xef, 0x91, 0xee, 0x7e, 0x89, 0x24, 0x4d, 0x4f, 0x84, 0x27, 0xad, 0x39, 0xea, 0xc7, 0x91, 0x80, 0x7e, 0x11, 0xe4, 0x31, 0xaa, 0x12, 0x90, 0x62, 0xb9, 0x3d, 0x4c, 0xbb, 0x46, 0x0d, 0xb5, 0x36, 0xf4, 0xeb, 0xa1, 0x22, 0x60, 0x51, 0xb0, 0x6e, 0x54, 0x30, 0x24, 0x24, 0x3e, 0x8f, 0xf2, 0x34, 0xe0, 0x75, 0x18, 0x73, 0x48, 0x0a, 0x32, 0xe3, 0x03, 0xf9, 0x48, 0x35, 0x8e, 0x18, 0xeb, 0x8c, 0x0d, 0x4b, 0x80, 0x84, 0x3f, 0xa6, 0xdb, 0x73, 0xb2, 0xd1, 0x10, 0xef, 0x33, 0xb1, 0x85, 0x90, 0x89, 0x44, 0x4c, 0xf6, 0x63, 0xcd, 0xb0, 0x0e, 0x8e, 0x32, 0x0e, 0x92, 0x6b, 0xa2, 0xe7, 0xcf, 0xa1, 0x7a, 0x32, 0xab, 0x0f, 0x6a, 0xf7, 0xe6, 0x05, 0xd4, 0x19, 0xa0, 0xb3, 0x74, 0x74, 0x1c, 0xe1, 0x46, 0x27, 0xc3, 0xe1, 0xa4, 0x33, 0x6c, 0xc2, 0xaf, 0x46, 0xda, 0xc7, 0xf1, 0xd1, 0x86, 0x17, 0x41, 0x60, 0x9f, 0xb6, 0xe6, 0x2b, 0x50, 0xb4, 0xff, 0xe8, 0x41, 0xa5, 0x22, 0xe4, 0x60, 0x51, 0x43, 0x52, 0xe1, 0xac, 0xd7, 0xe3, 0x83, 0x08, 0x3a, 0x97, 0x16, 0x89, 0x4e, 0xd2, 0x3a, 0xd9, 0x66, 0xb2, 0x69, 0x1e, 0x62, 0xa0, 0x38, 0x29, 0x1b, 0x25, 0xd9, 0xf0, 0x01, 0xff, 0xe5, 0x3f, 0x02, 0x75, 0x58, 0xaa, 0xae, 0xe7, 0xde, 0xc6, 0x99, 0xa9, 0x4d, 0x99, 0x01, 0x12, 0x72, 0x4e, 0xb1, 0xcf, 0x10, 0x2d, 0x25, 0x7d, 0x26, 0xcb, 0xef, 0x78, 0x71, 0x7e, 0x5a, 0xed, 0x32, 0x14, 0x4c, 0x37, 0x31, 0xc5, 0x71, 0x68, 0x02, 0x65, 0x95, 0x25, 0x87, 0xdf, 0x52, 0xb8, 0xb6, 0xde, 0xec, 0x60, 0x9c, 0xcd, 0x79, 0xeb, 0xa2, 0x02, 0x45, 0x87, 0x10, 0x36, 0x74, 0xd6, 0xcf, 0x39, 0xe9, 0x40, 0x73, 0xe3, 0x67, 0x8d, 0x79, 0x4e, 0xf6, 0xb3, 0xcc, 0x42, 0x89, 0xec, 0x8e, 0xf1, 0xdd, 0x0c, 0x16, 0xe5, 0xa4, 0x12, 0x35, 0x36, 0xe3, 0xfd, 0xbe, 0x00, 0x99, 0xe1, 0x45, 0x14, 0xa1, 0x39, 0x26, 0xee, 0xd9, 0x7f, 0xca, 0xe8, 0x84, 0xfa, 0x25, 0xad, 0xed, 0xd8, 0x83, 0xef, 0x4e, 0x7c, 0x85, 0x5d, 0xef, 0x19, 0x66, 0xcf, 0x92, 0x80, 0x83, 0xc4, 0x0f, 0x36, 0x1b, 0x0f, 0x3c, 0xca, 0x53, 0xcd, 0x0f, 0x65, 0x7d, 0x9a, 0x07, 0xa3, 0x99, 0x05, 0xc7, 0xa1, 0x1c, 0x41, 0x05, 0x58, 0xf1, 0x1d, 0xa2, 0x29, 0xbe, 0x35, 0x1a, 0xb8, 0x68, 0x6a, 0x1f, 0xfe, 0xd9, 0x91, 0x81, 0x9a, 0x01, 0x68, 0x51, 0x68, 0x1a, 0xce, 0x46, 0x55, 0x31, 0x33, 0x5f, 0x72, 0xe2, 0x4d, 0xca, 0x47, 0x63, 0x0c, 0x05, 0x69, 0xc4, 0xd1, 0x43, 0x4f, 0x74, 0xdb, 0x11, 0x61, 0x08, 0x01, 0x39, 0x52, 0x38, 0xa7, 0xe7, 0xb0, 0x2a, 0xeb, 0x0a, 0xb9, 0xf4, 0x1f, 0xfd, 0x71, 0x5c, 0x7c, 0x67, 0xf1, 0xe1, 0x14, 0x60, 0x02, 0x00, 0x09, 0xd5, 0xea, 0xb0, 0xfd, 0x2d, 0x86, 0x2f, 0xc9, 0x2c, 0x99, 0x00, 0x72, 0x18, 0x64, 0x35, 0x59, 0x1b, 0x77, 0xea, 0xb1, 0xe9, 0xc6, 0x12, 0x36, 0xa2, 0xff, 0x76, 0x1c, 0xfa, 0x1b, 0xfa, 0x46, 0x97, 0x34, 0x22, 0xb9, 0xbb, 0x96, 0xd6, 0x50, 0x22, 0x18, 0x62, 0xb1, 0x2e, 0xad, 0xc1, 0x7f, 0x41, 0x36, 0x1b, 0xd2, 0x6a, 0x9a, 0x8c, 0xe4, 0x45, 0x19, 0x27, 0x0d, 0x1c, 0xdd, 0x3b, 0xf1, 0x52, 0xd2, 0xd4, 0xf8, 0x02, 0xb8, 0x85, 0xfe, 0xe3, 0x77, 0x65, 0x4c, 0x6f, 0xb2, 0x58, 0xc7, 0x44, 0x9e, 0x90, 0x68, 0xca, 0x15, 0x53, 0xec, 0x16, 0xe6, 0xfe, 0xcd, 0x0e, 0x70, 0x4a, 0x70, 0xce, 0x6f, 0xce, 0xa0, 0x4b, 0x15, 0xc5, 0x3b, 0x36, 0x5d, 0x12, 0x2b, 0x24, 0x9c, 0x81, 0x98, 0xeb, 0x58, 0x50, 0x5c, 0x4f, 0x5e, 0xee, 0xb8, 0xde, 0x0f, 0x02, 0x45, 0x18, 0xfb, 0xaf, 0x2d, 0xd3, 0xb1, 0x16, 0x9a, 0xde, 0xd4, 0x1d, 0x6f, 0xe5, 0x72, 0x6f, 0x37, 0x94, 0x92, 0xc5, 0x5a, 0xff, 0x0c, 0x63, 0x97, 0x42, 0x9e, 0xe5, 0xae, 0x64, 0x3b, 0x3b, 0x5d, 0x82, 0xa6, 0xf3, 0x8e, 0x29, 0x40, 0xb6, 0xcf, 0x03, 0x1f, 0x16, 0x02, 0xb6, 0x5f, 0x87, 0x56, 0x09, 0xbd, 0xaa, 0x76, 0x49, 0x61, 0xd2, 0x00, 0xeb, 0xfc, 0xc1, 0x38, 0x72, 0x13, 0xb2, 0xfe, 0x93, 0x9b, 0x9d, 0xfd, 0x97, 0xc5, 0xb6, 0x26, 0x02, 0x1b, 0x36, 0x5d, 0x72, 0xcc, 0x5f, 0x71, 0xc9, 0x44, 0xba, 0x52, 0x8e, 0x00, 0xa4, 0x7e, 0x91, 0xa1, 0x08, 0xbd, 0xce, 0x3f, 0x6e, 0x0e, 0x94, 0xff, 0x35, 0xe1, 0xe7, 0xe8, 0x1c, 0x86, 0x22, 0xf2, 0x08, 0xe6, 0xe1, 0x60, 0x01, 0x71, 0x1d, 0x50, 0x7d, 0x57, 0x99, 0x91, 0xe1, 0xfb, 0x7d, 0xb4, 0x45, 0xa5, 0x41, 0x66, 0x77, 0x76, 0xcd, 0xfd, 0x43, 0xa2, 0xdf, 0x50, 0xf2, 0xd9, 0xac, 0xcc, 0x11, 0x06, 0xca, 0xc4, 0x74, 0x3c, 0x4d, 0x09, 0x7a, 0xed, 0x31, 0xbb, 0x91, 0x5e, 0xf8, 0x5e, 0xfd, 0x57, 0x93, 0x30, 0xd6, 0x1f, 0x86, 0xba, 0x50, 0xa8, 0x48, 0xa6, 0x40, 0x06, 0xe8, 0xd0, 0xdb, 0x25, 0xf6, 0xa0, 0xc0, 0xbc, 0xa1, 0x96, 0x39, 0x7d, 0x1d, 0x26, 0xbd, 0x8f, 0x48, 0xc7, 0xba, 0x3d, 0x8c, 0x47, 0x92, 0xf0, 0x07, 0x61, 0xe3, 0x5a, 0xe9, 0x91, 0x0c, 0xf5, 0x1e, 0x27, 0xed, 0xac, 0x2e, 0x9b, 0xee, 0xd7, 0x61, 0x20, 0x42, 0x6d, 0x26, 0x7b, 0x6d, 0x75, 0xb5, 0x16, 0x03, 0xbe, 0xf4, 0x50, 0xb3, 0xd0, 0x97, 0x18, 0x85, 0x22, 0x8c, 0xba, 0x60, 0x8e, 0x96, 0xf8, 0xcf, 0x01, 0x38, 0x5d, 0x04, 0x77, 0xd4, 0xce, 0x1e, 0x27, 0x14, 0x62, 0xa7, 0xfa, 0x89, 0x74, 0x61, 0x42, 0x92, 0xf6, 0x42, 0xa9, 0x80, 0x07, 0xbd, 0x67, 0xf7, 0xc8, 0x43, 0xb9, 0x97, 0x6c, 0x0a, 0x8e, 0xdc, 0x8f, 0x0d, 0x83, 0x43, 0xc9, 0x54, 0x11, 0xaf, 0x82, 0x75, 0x05, 0x0a, 0x08, 0x5b, 0x31, 0x2f, 0xde, 0x46, 0x62, 0x08, 0x58, 0x13, 0x92, 0xf3, 0x64, 0xbe, 0x5e, 0x6b, 0xab, 0x25, 0xba, 0xe4, 0xd9, 0x0e, 0xe3, 0xf6, 0x38, 0x6c, 0x95, 0xbe, 0x84, 0xde, 0x7f, 0x82, 0xfb, 0x79, 0xf4, 0x93, 0xb3, 0xc7, 0xe3, 0x78, 0x30, 0x0f, 0x09, 0x48, 0x36, 0xd7, 0x65, 0x58, 0xdc, 0xa8, 0xec, 0x16, 0xe2, 0x11, 0x7f, 0x35, 0x44, 0xee, 0x1a, 0x0b, 0x0f, 0xeb, 0x4e, 0x37, 0x74, 0x43, 0xf1, 0x86, 0x1b, 0xce, 0x14, 0x18, 0xba, 0x3a, 0x35, 0xbe, 0xe5, 0x98, 0xb6, 0xa7, 0x28, 0x1b, 0x8e, 0x3c, 0x53, 0x1d, 0x3f, 0x48, 0x15, 0x63, 0x08, 0x5c, 0xcc, 0xa2, 0x5b, 0x72, 0x9c, 0x42, 0x91, 0xd0, 0xbe, 0x61, 0xdd, 0x2f, 0x1b, 0x1b, 0x7e, 0x1d, 0x1a, 0x09, 0x39, 0xa0, 0xb6, 0x07, 0x07, 0x1c, 0xd3, 0x3b, 0x0b, 0x76, 0xd2, 0x53, 0xc6, 0x7a, 0x63, 0x0d, 0x8e, 0x7a, 0x9a, 0xfd, 0x3c, 0x38, 0x46, 0x8b, 0x26, 0x07, 0x7e, 0x3b, 0x4d, 0x2c, 0x7c, 0x31, 0xd7, 0x8a, 0xaf, 0xf4, 0xbf, 0x7f, 0x0b, 0x72, 0xcb, 0x09, 0xa4, 0x44, 0xbe, 0x2d, 0x7b, 0x34, 0xcf, 0x99, 0x97, 0xfc, 0x5b, 0x88, 0x58, 0x51, 0xd7, 0xe6, 0x09, 0x20, 0x08, 0xb4, 0xb4, 0x18, 0x76, 0xaf, 0x3a, 0x68, 0x1e, 0x2c, 0xa2, 0xca, 0x67, 0x47, 0xb2, 0xc0, 0x57, 0x3c, 0xbc, 0x1d, 0x07, 0x15, 0xbb, 0xc8, 0x54, 0x86, 0x9f, 0xbd, 0xd8, 0x15, 0xe4, 0x54, 0x19, 0x7d, 0x69, 0xc6, 0xff, 0x55, 0x80, 0xed, 0x8c, 0xed, 0x41, 0x4b, 0xc7, 0x79, 0x25, 0x4e, 0xf9, 0x71, 0xd0, 0xd2, 0x1c, 0x37, 0x2d, 0xe8, 0x91, 0xfb, 0xc0, 0xd6, 0x11, 0xdc, 0x38, 0x5f, 0xe6, 0x4f, 0x44, 0x44, 0x5b, 0xc5, 0xa8, 0x0a, 0x71, 0x88, 0x90, 0xfe, 0xd3, 0xe6, 0x24, 0x77, 0x0c, 0x92, 0x5c, 0x5b, 0xf8, 0x47, 0x16, 0xe4, 0x78, 0xae, 0x66, 0xa4, 0x6a, 0x82, 0x2d, 0xc7, 0xd9, 0xf2, 0xed, 0x99, 0x70, 0x47, 0xdb, 0x48, 0x35, 0xc6, 0x36, 0xea, 0x74, 0xd8, 0xd8, 0xc1, 0xf8, 0x68, 0x0b, 0xbe, 0x81, 0x8d, 0x9d, 0x45, 0x73, 0x69, 0x37, 0x30, 0xcc, 0x51, 0xea, 0x16, 0x58, 0x2d, 0x0b, 0xcd, 0x28, 0x22, 0x41, 0x2d, 0x40, 0x6f, 0xdc, 0x17, 0x90, 0x95, 0x68, 0xb6, 0x26, 0xbb, 0x82, 0x05, 0xa1, 0x50, 0xeb, 0x92, 0xe9, 0xf2, 0xdb, 0x81, 0x1d, 0x8f, 0x98, 0xd3, 0xcd, 0xca, 0x46, 0xe9, 0x6a, 0xa0, 0x01, 0x43, 0xfa, 0x4b, 0x29, 0x8e, 0x10, 0x66, 0xfd, 0xde, 0xfc, 0x53, 0x6c, 0x38, 0x3f, 0xda, 0x27, 0x53, 0x42, 0x12, 0xfb, 0x9f, 0x47, 0x85, 0x5e, 0x87, 0x9f, 0x8f, 0x48, 0xf3, 0x1d, 0x07, 0x44, 0x12, 0xcc, 0x21, 0xc6, 0x56, 0xdd, 0x93, 0xbf, 0xc0, 0xe3, 0xf7, 0x6f, 0x5d, 0x43, 0x71, 0x7a, 0x11, 0xe5, 0x91, 0x3f, 0x93, 0x30, 0x7b, 0x65, 0xb9, 0x36, 0x45, 0xb6, 0xf6, 0x2b, 0xa0, 0x31, 0x21, 0x1c, 0xbb, 0x5a, 0x77, 0xdd, 0x64, 0xd5, 0xe4, 0x44, 0x71, 0x33, 0x7e, 0x94, 0x5e, 0x0c, 0x52, 0x3c, 0x37, 0x4e, 0x64, 0xc2, 0xb8, 0xd4, 0xf1, 0xfa, 0xb4, 0x3b, 0xf7, 0x7b, 0xb3, 0xf1, 0xf8, 0x53, 0xdf, 0x8e, 0xfa, 0xfa, 0x21, 0x68, 0xd2, 0x85, 0x87, 0x61, 0xa2, 0x1c, 0xe9, 0x04, 0xa1, 0xae, 0xcc, 0xd1, 0x1a, 0xe3, 0x86, 0xd4, 0xb8, 0x53, 0xa3, 0x7d, 0x00, 0xf5, 0x88, 0xab, 0x1f, 0xda, 0x56, 0x0a, 0xe6, 0x1b, 0x11, 0x9f, 0x13, 0x10, 0x02, 0xa1, 0xd2, 0xc2, 0x59, 0x8b, 0x83, 0xa3, 0x17, 0x6f, 0xbe, 0x7d, 0x2b, 0x8d, 0x94, 0xa9, 0xdb, 0x24, 0x18, 0x81, 0x66, 0x88, 0x1f, 0x17, 0xe8, 0x75, 0x43, 0x28, 0x7d, 0xa3, 0x2e, 0x4b, 0xa9, 0x9a, 0x15, 0x6e, 0xf8, 0xc8, 0x82, 0x83, 0xe1, 0xd1, 0x57, 0x77, 0xf0, 0x26, 0x10, 0x64, 0x25, 0xd9, 0x48, 0x07, 0x97, 0xb0, 0x7e, 0x74, 0x5c, 0x78, 0x1a, 0x08, 0xad, 0x9b, 0xab, 0xa0, 0x46, 0xf5, 0x73, 0x08, 0x0c, 0xe4, 0x25, 0xb7, 0xf2, 0x9e, 0xed, 0xb9, 0x1d, 0xc8, 0xb1, 0xec, 0x47, 0x44, 0x97, 0x6f, 0x61, 0x4a, 0xc7, 0x58, 0x7c, 0xba, 0x72, 0xa5, 0xe9, 0xb0, 0x13, 0x76, 0x9f, 0x59, 0xf4, 0x79, 0xde, 0x06, 0xf4, 0xa5, 0x12, 0x7f, 0x89, 0x2b, 0xfa, 0x9a, 0x01, 0xa9, 0x09, 0x0c, 0x0d, 0xa1, 0x0d, 0x7e, 0x7f, 0x2b, 0x0e, 0xe4, 0x53, 0xe6, 0x79, 0x0a, 0xec, 0x34, 0x7e, 0x6f, 0xa1, 0xa7, 0xb6, 0x57, 0x78, 0xb6, 0x09, 0x1c, 0x31, 0xb5, 0xcf, 0xc5, 0x87, 0x04, 0x35, 0xd9, 0xb2, 0x86, 0xe2, 0x76, 0x30, 0x54, 0xdb, 0x9d, 0xc5, 0xb3, 0xa4, 0xd0, 0xc1, 0x44, 0xa9, 0xdf, 0x81, 0x7b, 0xdc, 0xff, 0x38, 0x52, 0x9e, 0x1c, 0xf0, 0x3f, 0xe3, 0x70, 0xcb, 0x63, 0x91, 0x55, 0x8f, 0x04, 0x2a, 0x57, 0x61, 0x3d, 0xab, 0x8e, 0xd1, 0xf4, 0xb4, 0x2b, 0x17, 0x0d, 0xe8, 0x50, 0x9c, 0xdd, 0x97, 0x25, 0xbd, 0xe2, 0x9b, 0x28, 0xcb, 0xb1, 0x7f, 0xc4, 0x56, 0x2f, 0xe7, 0x26, 0xab, 0x04, 0x2b, 0x4c, 0x9b, 0x4d, 0x46, 0x5e, 0x7e, 0x91, 0xef, 0x42, 0x78, 0xf7, 0x05, 0x6b, 0xfb, 0xb6, 0x30, 0xf1, 0x8d, 0xcc, 0xc6, 0xe7, 0xcc, 0xf3, 0xeb, 0xe9, 0xaf, 0xd1, 0xfd, 0xf4, 0x0e, 0x6f, 0x2f, 0x7a, 0x65, 0xec, 0x73, 0xb6, 0xd5, 0x73, 0x9e, 0x3e, 0x6b, 0x6a, 0xc6, 0xd7, 0xa5, 0xec, 0xef, 0x8c, 0x32, 0x7a, 0xe7, 0x02, 0xfa, 0xed, 0x6f, 0x06, 0x5e, 0xaf, 0x9b, 0x68, 0xc1, 0x2b, 0x7c, 0x0c, 0x47, 0x82, 0xfc, 0x3e, 0xdc, 0x80, 0x08, 0x46, 0x79, 0xce, 0xf5, 0x3c, 0xa2, 0x69, 0x1c, 0x1e, 0x34, 0x52, 0xc8, 0x20, 0x5d, 0x88, 0x53, 0x43, 0xec, 0x33, 0x8b, 0x29, 0xcb, 0x22, 0x5a, 0x28, 0xc9, 0x77, 0xa7, 0x9d, 0x9d, 0xa1, 0x77, 0x83, 0x28, 0x8b, 0x58, 0x44, 0xfb, 0x13, 0xff, 0xce, 0x19, 0xbe, 0x30, 0xea, 0xfe, 0xaa, 0xde, 0xc9, 0xe0, 0xc4, 0x94, 0xe0, 0x34, 0x3a, 0x13, 0xf7, 0x74, 0x34, 0x3d, 0x7c, 0x20, 0xbf, 0x31, 0x1c, 0x03, 0x09, 0xb8, 0x95, 0xb7, 0xd4, 0xe0, 0xc5, 0x6b, 0x25, 0xe6, 0x07, 0xe4, 0x3c, 0x59, 0xc0, 0xc2, 0xc9, 0x7d, 0x35, 0x05, 0x5d, 0xee, 0xa0, 0xcf, 0x1f, 0x85, 0x82, 0x6b, 0xc0, 0x7f, 0x3a, 0x8f, 0xb1, 0xdc, 0xd7, 0xde, 0x93, 0x06, 0x2b, 0xb1, 0xef, 0xb3, 0x20, 0x17, 0x27, 0x0c, 0x50, 0x1b, 0xac, 0x0f, 0xcf, 0x45, 0x72, 0x32, 0x4b, 0x63, 0xa1, 0x49, 0x58, 0x88, 0x8e, 0xa9, 0x05, 0x56, 0xe9, 0x8e, 0xb3, 0x79, 0x38, 0xba, 0x27, 0x74, 0x83, 0x5f, 0xdd, 0xa0, 0x51, 0x3f, 0x9f, 0x71, 0xd4, 0x12, 0x57, 0xfc, 0x61, 0x28, 0x22, 0xb6, 0x23, 0x4f, 0xa5, 0x7f, 0x0f, 0xf7, 0xa4, 0xdf, 0x1a, 0x94, 0xd0, 0x8f, 0xaa, 0x44, 0xe1, 0x3b, 0x4b, 0xb2, 0xe5, 0x86, 0xa4, 0x3a, 0xd8, 0x4f, 0xa9, 0x4e, 0x74, 0x32, 0x12, 0x18, 0x4a, 0x52, 0x0b, 0x60, 0x12, 0x56, 0x2d, 0xb1, 0x40, 0xb2, 0xad, 0xb7, 0xd8, 0x28, 0xd3, 0xec, 0x82, 0x8e, 0xae, 0x74, 0xe1, 0xd1, 0x07, 0x44, 0x21, 0x3a, 0x93, 0x8a, 0xcf, 0xf0, 0x6c, 0x49, 0xee, 0xbf, 0xc2, 0x44, 0x47, 0x17, 0xce, 0x1e, 0x00, 0x58, 0x08, 0xbf, 0x70, 0x4c, 0x9a, 0xfa, 0x32, 0xf5, 0x14, 0x6c, 0x78, 0x8a, 0x61, 0xa7, 0xa2, 0xbc, 0xfa, 0x90, 0x10, 0x3d, 0x59, 0x05, 0x34, 0x83, 0xb1, 0xc3, 0xeb, 0xca, 0xdc, 0x87, 0x0d, 0x58, 0x95, 0x74, 0x42, 0x04, 0xe7, 0xb5, 0x18, 0xf9, 0xe5, 0x63, 0x53, 0xb8, 0x9c, 0xa9, 0x85, 0x5c, 0x46, 0x26, 0xde, 0x22, 0xc1, 0x92, 0x44, 0x28, 0x3f, 0xa5, 0xa6, 0x75, 0x3e, 0x34, 0x8e, 0x3a, 0xbb, 0x9e, 0xf6, 0x57, 0xa2, 0x66, 0x5d, 0x21, 0x8a, 0x21, 0x1a, 0x63, 0x9f, 0x93, 0xef, 0xa3, 0xdf, 0x15, 0xe1, 0xa6, 0x8a, 0x39, 0x47, 0x36, 0xd3, 0xb1, 0x22, 0x22, 0xdc, 0x6d, 0xac, 0x87, 0xe1, 0x04, 0x34, 0x4e, 0xb4, 0x55, 0x28, 0xf6, 0x69, 0x6e, 0x74, 0x93, 0x52, 0xad, 0x0a, 0x17, 0x2e, 0x24, 0xc2, 0xd1, 0x9d, 0x42, 0x65, 0x33, 0xd7, 0xb0, 0x04, 0xd8, 0x9e, 0x7a, 0x8f, 0xc6, 0x71, 0x6f, 0xa3, 0xf0, 0x03, 0xca, 0xa2, 0xff, 0xeb, 0x12, 0x09, 0x51, 0x9d, 0x3e, 0xfe, 0x42, 0x99, 0x1d, 0x29, 0xab, 0xe2, 0xf5, 0xc5, 0xa9, 0xb2, 0x6b, 0xf7, 0xa0, 0x6c, 0xa2, 0x5e, 0x7f, 0xd2, 0xa7, 0xeb, 0x45, 0x78, 0x0d, 0xf3, 0xc4, 0x78, 0xd4, 0x82, 0xa4, 0x68, 0x90, 0xf3, 0xac, 0x89, 0xc6, 0xbd, 0x3d, 0x41, 0x9a, 0x90, 0x1f, 0xcc, 0xa7, 0xa1, 0x81, 0x2e, 0x2f, 0x42, 0x3a, 0x6c, 0x74, 0xb5, 0x55, 0xfb, 0x65, 0x42, 0xcd, 0x79, 0x7d, 0x87, 0x95, 0x9b, 0xe9, 0x10, 0xdb, 0x67, 0xe9, 0x27, 0x8e, 0xa3, 0x78, 0xed, 0x1e, 0x8d, 0x2f, 0xaa, 0x83, 0xcc, 0x67, 0x62, 0x80, 0xa7, 0x9e, 0xa9, 0x29, 0x75, 0x1c, 0xb7, 0xa3, 0x54, 0xd5, 0xbf, 0x2b, 0x1e, 0x92, 0x7d, 0x59, 0x99, 0x4c, 0x0f, 0xa6, 0xee, 0xd8, 0x05, 0x2d, 0x5d, 0xca, 0xbb, 0xae, 0x2e, 0x93, 0xe7, 0xd8, 0xeb, 0xec, 0x6e, 0xc8, 0xcc, 0x78, 0x7c, 0xcd, 0x73, 0xa4, 0xd3, 0x6e, 0xd9, 0xd3, 0x63, 0xae, 0x89, 0xb8, 0x1b, 0x8e, 0x0c, 0x02, 0x00, 0xd4, 0xa4, 0x3f, 0x7c, 0x0b, 0x3d, 0xfa, 0xf8, 0xcb, 0xa0, 0x27, 0xad, 0x3a, 0xea, 0xc2, 0xb6, 0xd3, 0x3c, 0xb2, 0x6a, 0x66, 0xb5, 0xf3, 0xea, 0x60, 0x9d, 0xf4, 0xf6, 0x4d, 0xe3, 0x3e, 0x05, 0x9b, 0xca, 0x57, 0x94, 0xa1, 0xdf, 0xe6, 0xbe, 0xe0, 0x2e, 0x17, 0x0d, 0x88, 0xb5, 0x41, 0x90, 0x3e, 0x19, 0xc7, 0x2d, 0x1c, 0x98, 0x3c, 0x39, 0xf9, 0x3f, 0xca, 0x46, 0xeb, 0x5d, 0xd4, 0x3c, 0x0b, 0x37, 0xda, 0xac, 0x78, 0xfd, 0x9d, 0x60, 0x9f, 0xfd, 0x84, 0x37, 0xb9, 0x17, 0x3f, 0x30, 0x94, 0x71, 0xaa, 0xc4, 0x97, 0x6c, 0xf4, 0x79, 0x01, 0xd6, 0x00, 0xb4, 0x71, 0x61, 0x0b, 0xce, 0xab, 0x53, 0x90, 0x6b, 0x99, 0x80, 0x68, 0x07, 0x90, 0x75, 0x36, 0xd2, 0xd5, 0xf7, 0x02, 0xbe, 0x60, 0xac, 0x24, 0xd6, 0xdf, 0x17, 0x64, 0xd1, 0xfe, 0xca, 0x5f, 0xe7, 0xe6, 0xd6, 0x2d, 0xe3, 0x03, 0x87, 0x40, 0x7a, 0x0b, 0x4e, 0x8f, 0xdb, 0x3c, 0xff, 0xf4, 0x87, 0xe5, 0x3c, 0xd3, 0x63, 0x27, 0x31, 0xfd, 0x0b, 0xfd, 0x83, 0xd4, 0x6a, 0x7a, 0x82, 0xaf, 0x88, 0x52, 0xa6, 0x80, 0xa2, 0x9c, 0x39, 0xb4, 0x80, 0xd6, 0x51, 0x5a, 0x03, 0x2a, 0x01, 0x88, 0xfe, 0xef, 0xd0, 0xfa, 0x46, 0x73, 0x6a, 0xfd, 0x0d, 0xf8, 0x96, 0x8b, 0x6b, 0xfc, 0x68, 0xb8, 0x3e, 0xbe, 0xb8, 0x4d, 0x34, 0xfd, 0xd3, 0xb2, 0x26, 0x03, 0x6f, 0x11, 0xa8, 0xe2, 0xe5, 0xb8, 0xde, 0xfe, 0x9a, 0xbf, 0x91, 0xcb, 0xbe, 0xeb, 0x81, 0xd8, 0x3a, 0xd3, 0xfd, 0x0d, 0xe3, 0x41, 0xb2, 0x31, 0xf4, 0xdb, 0xc1, 0xae, 0xbb, 0x03, 0x14, 0x99, 0x92, 0xfb, 0xf1, 0xed, 0x11, 0x4d, 0xcf, 0x17, 0x82, 0x6a, 0x69, 0xb8, 0x95, 0x91, 0x12, 0xa6, 0x56, 0xf2, 0x48, 0x34, 0x5b, 0x14, 0x8b, 0xb3, 0x42, 0x74, 0x70, 0x38, 0x5b, 0x6f, 0xf1, 0xa0, 0xa1, 0x61, 0x07, 0xd2, 0xef, 0x0f, 0x7b, 0x44, 0x70, 0x42, 0xf8, 0xc1, 0x58, 0xb5, 0x66, 0x69, 0xd1, 0x31, 0x73, 0xf9, 0x38, 0xf7, 0x72, 0x4c, 0x8a, 0x5e, 0x69, 0x22, 0x19, 0xbd, 0x65, 0x21, 0x84, 0x8b, 0x11, 0x19, 0xe5, 0xc5, 0x87, 0x8c, 0x4c, 0x90, 0x66, 0x6e, 0x6d, 0x20, 0x25, 0x29, 0x95, 0xd8, 0xa7, 0xe4, 0xe3, 0xb3, 0x0f, 0x05, 0xb4, 0xe2, 0xd5, 0xf4, 0x5f, 0xb7, 0x1a, 0x22, 0x23, 0xc1, 0x38, 0x4b, 0x5d, 0x39, 0x9e, 0xf8, 0xfe, 0x9c, 0xdb, 0x47, 0x3d, 0x9a, 0xf8, 0xee, 0x89, 0x2f, 0x0b, 0x7e, 0xc2, 0x10, 0x09, 0xe5, 0xa8, 0x48, 0xdc, 0x37, 0x94, 0x23, 0xb5, 0xae, 0x66, 0x4b, 0xa4, 0xef, 0xbe, 0x31, 0x66, 0x8e, 0x6f, 0xae, 0x7e, 0xd5, 0x30, 0xeb, 0x87, 0xc1, 0x95, 0x7e, 0xc8, 0x4e, 0x3e, 0xd5, 0x09, 0xf4, 0x4f, 0xd8, 0xa5, 0x72, 0x1f, 0xca, 0xe1, 0xca, 0x35, 0x70, 0x7c, 0x8d, 0x70, 0x76, 0x87, 0x58, 0x85, 0x0e, 0x77, 0x9f, 0xaf, 0xda, 0x79, 0xa9, 0xa1, 0x0c, 0x05, 0xdc, 0xc0, 0xcc, 0xb6, 0x3b, 0x8f, 0xda, 0x59, 0x2d, 0x6a, 0x74, 0x44, 0x80, 0x78, 0x7a, 0xe9, 0xad, 0xdb, 0xd0, 0xaa, 0x5e, 0x29, 0x04, 0xef, 0x2d, 0x20, 0x30, 0x76, 0xaf, 0x95, 0x22, 0xeb, 0xb1, 0xae, 0xbb, 0xb9, 0xc1, 0x51, 0x95, 0x1f, 0xf1, 0xdc, 0xe8, 0x86, 0xd7, 0x17, 0xaf, 0x12, 0xd8, 0x67, 0x06, 0x77, 0xa7, 0x44, 0xd7, 0x0e, 0x08, 0xec, 0xb5, 0x28, 0xda, 0x59, 0x08, 0xa2, 0x54, 0x71, 0x6b, 0xb9, 0x8f, 0x7e, 0x52, 0x20, 0x44, 0xdd, 0xf0, 0x50, 0xd8, 0xfa, 0x58, 0x20, 0x95, 0x7c, 0xe2, 0x95, 0x3b, 0xbc, 0xd0, 0xfb, 0xb7, 0x7c, 0x31, 0x34, 0x32, 0xd6, 0x06, 0x51, 0x4d, 0x72, 0xa4, 0x5f, 0xab, 0xfc, 0x59, 0x83, 0xb1, 0xd5, 0x52, 0x4a, 0x89, 0x09, 0xbc, 0x3a, 0x6d, 0x82, 0x2a, 0xad, 0x22, 0x7b, 0x37, 0xdf, 0xc2, 0x37, 0x6c, 0x45, 0xbf, 0xf2, 0x64, 0x20, 0x25, 0x18, 0x2d, 0x53, 0x1f, 0xb5, 0xf2, 0x71, 0xbd, 0x2c, 0xd7, 0x1b, 0xf4, 0x2d, 0x25, 0x89, 0xe7, 0xe1, 0xa7, 0x66, 0x64, 0x67, 0x54, 0xe1, 0xb2, 0x84, 0x2d, 0x01, 0x8a, 0x96, 0x69, 0x38, 0x63, 0xca, 0xd0, 0x3c, 0xf3, 0x8f, 0x65, 0x12, 0xf2, 0x4b, 0x47, 0x6b, 0x21, 0x4c, 0xd9, 0x34, 0x8b, 0x01, 0x21, 0x69, 0x0a, 0x6a, 0x6e, 0x2a, 0x0e, 0xcd, 0x3e, 0x10, 0x9a, 0xab, 0x5e, 0xc1, 0x8f, 0xf2, 0x53, 0xc2, 0x2d, 0x74, 0xf9, 0x8d, 0xd7, 0x98, 0x6a, 0xe4, 0x16, 0x4f, 0x21, 0x64, 0xe1, 0x4a, 0x60, 0x5d, 0x1c, 0x6b, 0xce, 0xe1, 0x5e, 0x79, 0x65, 0x1b, 0xf7, 0x17, 0x8b, 0xe2, 0x32, 0xf7, 0x7f, 0x8e, 0xd7, 0x4b, 0xf7, 0x0b, 0xf4, 0x7c, 0x08, 0x2c, 0xdd, 0x1f, 0x45, 0x41, 0x72, 0x25, 0x2b, 0xeb, 0xa0, 0x51, 0xbd, 0x2f, 0x2b, 0xf0, 0x6b, 0xca, 0xaa, 0xc4, 0x38, 0xc4, 0xd3, 0x41, 0x1c, 0x48, 0xf8, 0xfc, 0xa7, 0xb3, 0xd2, 0x60, 0xe8, 0xeb, 0x7e, 0xa2, 0x8d, 0xf2, 0xc5, 0xf8, 0x4b, 0xbb, 0xa0, 0x06, 0x81, 0x3c, 0xfb, 0x99, 0x18, 0xc4, 0xba, 0x98, 0xad, 0x8f, 0xfa, 0x38, 0xf2, 0x98, 0x99, 0x6e, 0x51, 0xae, 0xf8, 0xaa, 0xd3, 0xca, 0xff, 0xc2, 0x41, 0xa0, 0x62, 0x2c, 0x89, 0x74, 0x23, 0x71, 0x62, 0x2f, 0x59, 0xde, 0x33, 0xb2, 0x2f, 0x7d, 0x31, 0x6a, 0x2f, 0x44, 0xc8, 0x24, 0xc1, 0x8b, 0x3d, 0x23, 0xee, 0xc4, 0x91, 0x70, 0x6a, 0x66, 0xa8, 0x72, 0xd2, 0x2a, 0xab, 0xbe, 0x32, 0x7a, 0xaa, 0x30, 0xca, 0x26, 0x86, 0x3b, 0x12, 0x5a, 0x0e, 0x7d, 0xfb, 0xcd, 0x68, 0x97, 0x78, 0x3a, 0xb3, 0x3b, 0x3d, 0x14, 0xea, 0x87, 0xc6, 0x76, 0x0b, 0x91, 0x9c, 0x59, 0x79, 0x43, 0xd4, 0x09, 0x9f, 0x69, 0xd8, 0xda, 0xd7, 0x08, 0x6a, 0x16, 0x8a, 0xf1, 0xe5, 0x3b, 0x98, 0x97, 0xc6, 0x63, 0xfa, 0x1e, 0x6c, 0x04, 0xa6, 0xb4, 0x1c, 0xd9, 0xb2, 0x24, 0x48, 0x20, 0xbd, 0xa8, 0x11, 0x06, 0x8b, 0xff, 0x0a, 0x60, 0xef, 0xc0, 0x3f, 0x9b, 0xee, 0xee, 0x76, 0xf6, 0x21, 0xcc, 0xb4, 0xee, 0x5b, 0xf3, 0x03, 0xfa, 0x8c, 0xa1, 0x73, 0x79, 0xe5, 0x54, 0x5f, 0xe9, 0x3d, 0x98, 0xf1, 0x59, 0xb4, 0x1d, 0xe8, 0x21, 0x96, 0x0c, 0x99, 0xd0, 0x82, 0x9b, 0x34, 0x66, 0xcb, 0xe0, 0x49, 0xc4, 0x1e, 0xe2, 0x8b, 0x60, 0x65, 0xf6, 0xd3, 0x3d, 0xec, 0x49, 0x68, 0x1b, 0xc2, 0xb9, 0x7d, 0xeb, 0x63, 0xe9, 0xfb, 0x85, 0x93, 0x94, 0x81, 0x9d, 0x8d, 0x21, 0xa9, 0xf3, 0x5d, 0x78, 0x8e, 0xcb, 0x8b, 0x15, 0x8b, 0x9d, 0xf9, 0x5a, 0x45, 0x0d, 0x0e, 0x2a, 0xeb, 0x1d, 0x14, 0xb3, 0xbc, 0xa2, 0xdf, 0x8b, 0xca, 0xf5, 0xb0, 0xff, 0xfe, 0xea, 0x59, 0xa8, 0x5d, 0x06, 0xa1, 0x3f, 0x89, 0xec, 0xe9, 0xb1, 0x8b, 0x19, 0x10, 0x76, 0xcf, 0xd1, 0x95, 0x1f, 0x70, 0x59, 0xfb, 0x2f, 0xb7, 0x67, 0x72, 0x2c, 0xde, 0xd7, 0xb3, 0xf6, 0x19, 0x9f, 0x2c, 0x57, 0xd7, 0x05, 0x5d, 0xda, 0x44, 0x10, 0x82, 0xe1, 0x13, 0x3c, 0x72, 0xf2, 0x7c, 0x71, 0xc7, 0x52, 0x80, 0x36, 0x3f, 0xd5, 0x74, 0x23, 0x62, 0xf4, 0xbd, 0x94, 0x65, 0x20, 0xd9, 0xa5, 0x4f, 0x56, 0x9f, 0x5a, 0x5a, 0xf4, 0xc7, 0x1d, 0x9c, 0xcb, 0xac, 0x6e, 0xe6, 0x75, 0x51, 0xd6, 0xed, 0xe8, 0xa2, 0x1c, 0xa7, 0x4c, 0xfd, 0xbc, 0xf8, 0x0a, 0xf1, 0x95, 0x8e, 0x26, 0x46, 0xe2, 0x0a, 0xce, 0x3d, 0x6b, 0x60, 0x33, 0x18, 0xfd, 0x80, 0x97, 0xdd, 0x17, 0x36, 0xa7, 0x58, 0xe6, 0x4e, 0x0c, 0x5f, 0x73, 0xfd, 0x3d, 0x5a, 0x1c, 0x7c, 0x97, 0x02, 0x41, 0xf6, 0xaf, 0x68, 0x3f, 0xa4, 0xe7, 0x39, 0xa2, 0x37, 0x3f, 0x41, 0x96, 0x76, 0x6e, 0x2f, 0x9f, 0x28, 0x32, 0x98, 0x8a, 0x34, 0xe4, 0x3e, 0xa4, 0x07, 0x4f, 0x91, 0x29, 0x36, 0xc2, 0x76, 0xff, 0x64, 0x64, 0x48, 0xa4, 0x67, 0xc8, 0x1c, 0x66, 0xa6, 0xc1, 0x4a, 0xd2, 0xc5, 0x78, 0x29, 0x6e, 0x85, 0xbb, 0x19, 0xab, 0xe5, 0x98, 0xc7, 0x15, 0x8e, 0x2b, 0xac, 0xcd, 0x6d, 0xb4, 0xd7, 0x39, 0xa2, 0xec, 0xed, 0xfa, 0x99, 0x9a, 0x6e, 0x1e, 0x76, 0x61, 0x39, 0x97, 0xb7, 0xdc, 0x53, 0xec, 0x14, 0xed, 0xe4, 0x2f, 0xaa, 0x51, 0x82, 0x2f, 0x59, 0x78, 0xb2, 0xee, 0x6b, 0x94, 0xac, 0x56, 0x76, 0xf1, 0x5f, 0x27, 0x83, 0x84, 0xb5, 0x34, 0x6f, 0xc6, 0x18, 0xcf, 0x92, 0xc3, 0x35, 0x82, 0x9f, 0x6d, 0x00, 0x00, 0xcb, 0x37, 0xf8, 0x5a, 0x32, 0xdf, 0xac, 0x76, 0x76, 0x8b, 0x7e, 0xbe, 0xa9, 0x18, 0xa7, 0x15, 0x6d, 0xaf, 0x7b, 0x0f, 0x59, 0x99, 0xee, 0x61, 0x9f, 0x54, 0x58, 0x96, 0xec, 0xe6, 0x75, 0x04, 0x90, 0x71, 0xb0, 0xff, 0xdf, 0x08, 0xa1, 0x4c, 0xd7, 0xc1, 0xd4, 0xd8, 0x03, 0x0b, 0xcc, 0xaa, 0x9e, 0x42, 0x47, 0x17, 0xfc, 0x81, 0xc4, 0x35, 0x26, 0xb8, 0x43, 0x92, 0xc5, 0xfe, 0x4c, 0x25, 0x41, 0x28, 0x32, 0x84, 0x29, 0x9a, 0x99, 0x58, 0xd6, 0x5d, 0x36, 0x0e, 0x4b, 0x72, 0xd6, 0xd0, 0x60, 0x66, 0xa2, 0xb4, 0x20, 0x27, 0xa1, 0x33, 0x6f, 0x16, 0x7e, 0xdc, 0xf0, 0x5d, 0x8c, 0x49, 0x25, 0x83, 0x07, 0x53, 0xd8, 0x3e, 0x9d, 0x82, 0xba, 0x88, 0x2c, 0xc7, 0x4b, 0xf4, 0xce, 0x6e, 0xf9, 0x43, 0x13, 0x4e, 0x8c, 0x32, 0x8d, 0x43, 0xc1, 0x97, 0x92, 0xde, 0x35, 0xac, 0x3d, 0x5a, 0x85, 0xab, 0xb6, 0xd2, 0xb4, 0x9b, 0xb3, 0xb2, 0xcd, 0x69, 0x3f, 0x6c, 0xc9, 0x3a, 0xbb, 0x6c, 0xb2, 0x00, 0x22, 0x4d, 0x09, 0x4b, 0x91, 0x4d, 0x66, 0x63, 0x06, 0xfe, 0x5e, 0x93, 0x67, 0x3f, 0xa9, 0xc7, 0xc7, 0x6b, 0x84, 0x5a, 0xe6, 0xd0, 0x55, 0x29, 0xf6, 0x63, 0x8e, 0xec, 0xa5, 0xb1, 0xd3, 0xc6, 0x57, 0x19, 0x5f, 0x1a, 0xb3, 0x39, 0xa4, 0xa1, 0x62, 0xa6, 0x31, 0xb9, 0x13, 0xe0, 0xd9, 0x00, 0xc3, 0x85, 0x12, 0x22, 0x3b, 0xc4, 0x9b, 0xef, 0xda, 0x15, 0x62, 0xb1, 0x94, 0x27, 0xa4, 0xbc, 0x3b, 0x1a, 0x56, 0x46, 0xfd, 0xef, 0xc4, 0x79, 0x2f, 0x3d, 0x78, 0xc7, 0x49, 0x25, 0x5d, 0x7e, 0x31, 0x87, 0x24, 0x9c, 0xbc, 0x76, 0xe7, 0xe4, 0x72, 0xea, 0x0c, 0x31, 0x91, 0xb5, 0x6d, 0x0b, 0x55, 0xb9, 0xb5, 0x78, 0x77, 0x57, 0x0d, 0x14, 0xf3, 0x2b, 0xf9, 0x64, 0x0f, 0xf6, 0x7c, 0x68, 0x99, 0xdb, 0x83, 0x6f, 0x70, 0xcf, 0x81, 0x2f, 0x46, 0x4b, 0x56, 0x15, 0xa3, 0x43, 0x75, 0xda, 0x2d, 0x5c, 0x46, 0x57, 0x28, 0x5a, 0xc9, 0x9a, 0x39, 0xd7, 0x7d, 0x39, 0x6f, 0x3b, 0x80, 0xe6, 0x83, 0xe8, 0xf7, 0x44, 0x5f, 0xb5, 0xb0, 0xfa, 0xde, 0x9e, 0x06, 0x05, 0xd3, 0xba, 0x05, 0x52, 0x4c, 0x6d, 0xcf, 0x8c, 0x18, 0xde, 0x3e, 0x33, 0x86, 0xab, 0xcb, 0xee, 0x70, 0xdc, 0xaf, 0x22, 0x78, 0x16, 0x48, 0xc3, 0x92, 0x11, 0xbd, 0x6a, 0xc3, 0x4c, 0xe5, 0xa8, 0x28, 0x00, 0x65, 0x9b, 0x39, 0x52, 0x19, 0xbe, 0x4f, 0xcc, 0xb6, 0x05, 0x64, 0x0e, 0xad, 0x2a, 0x1a, 0xc1, 0x52, 0x41, 0xff, 0xcd, 0x3d, 0x93, 0x10, 0xcc, 0xf0, 0xa9, 0x7c, 0xbe, 0xbb, 0xa7, 0xaa, 0xfe, 0xdd, 0xdc, 0x7c, 0x75, 0xec, 0x96, 0xd6, 0x0d, 0x77, 0x3b, 0x5a, 0x68, 0xe9, 0x95, 0x76, 0xd3, 0xb0, 0x6e, 0xa1, 0x75, 0x9f, 0x5d, 0xe1, 0xcc, 0x91, 0xdf, 0x91, 0x5b, 0x50, 0xa9, 0x61, 0x9c, 0xb5, 0x3d, 0x9e, 0x3c, 0x10, 0xbc, 0xb4, 0x87, 0xc9, 0xfb, 0xf1, 0x22, 0x48, 0xd8, 0x8b, 0xf8, 0x13, 0xcf, 0xe5, 0x76, 0x36, 0xc8, 0x0e, 0xfb, 0xe8, 0x33, 0x8a, 0x8a, 0x6b, 0x57, 0x56, 0xc3, 0x34, 0xe7, 0x26, 0x11, 0x4c, 0xd7, 0xf1, 0x24, 0xf6, 0x6d, 0xaf, 0xa2, 0x92, 0x9b, 0x62, 0x19, 0xc1, 0x8c, 0x53, 0x39, 0xca, 0x7d, 0x9e, 0x40, 0x3d, 0xce, 0xf0, 0xb5, 0xd6, 0x59, 0x90, 0x59, 0xa3, 0x02, 0x9c, 0x5b, 0x69, 0x8f, 0x96, 0xcb, 0x45, 0xbb, 0x1f, 0x51, 0x8f, 0x85, 0x01, 0x1f, 0x03, 0xce, 0x73, 0x24, 0x23, 0x23, 0x99, 0x82, 0xd7, 0xd8, 0x4b, 0x43, 0x57, 0x56, 0x17, 0x47, 0x4a, 0xb5, 0x89, 0x81, 0x30, 0x8e, 0xa9, 0x64, 0xfd, 0x0a, 0xc6, 0x97, 0x06, 0x3f, 0x72, 0xf0, 0x21, 0xbd, 0xce, 0xa0, 0x08, 0x63, 0x08, 0xab, 0xff, 0x78, 0x21, 0x9c, 0xb7, 0xf7, 0xf4, 0x76, 0x71, 0x29, 0x74, 0xed, 0x66, 0x79, 0x35, 0xd6, 0x67, 0x85, 0x2e, 0xdd, 0xc1, 0x71, 0xbd, 0x76, 0x63, 0x80, 0xeb, 0x16, 0x43, 0xe5, 0xf2, 0xa2, 0xfd, 0xd6, 0xfc, 0x28, 0xbd, 0xe3, 0x2e, 0xcd, 0x60, 0x86, 0xe5, 0x06, 0xd6, 0xfb, 0x3f, 0x0b, 0xcb, 0x51, 0xde, 0x89, 0x86, 0xc2, 0xe8, 0x97, 0x11, 0x40, 0x52, 0xec, 0x9a, 0x50, 0x5f, 0x4f, 0x19, 0x1b, 0x63, 0x4e, 0x33, 0xc2, 0xcd, 0x33, 0x5e, 0xf3, 0x64, 0x34, 0x47, 0xba, 0xd1, 0xea, 0x71, 0x99, 0x5e, 0x05, 0x1e, 0xda, 0xfd, 0x3d, 0x72, 0x24, 0x8c, 0x8c, 0xd6, 0x4d, 0x57, 0x9a, 0x9b, 0x6f, 0xdf, 0x79, 0xdf, 0x3e, 0xda, 0x92, 0xb5, 0x98, 0x7a, 0xdf, 0x80, 0x5e, 0xf2, 0x5b, 0xa0, 0x83, 0x37, 0xb7, 0x51, 0x62, 0x03, 0x4f, 0xcf, 0x55, 0x20, 0x5c, 0xbf, 0x83, 0xe3, 0x6b, 0xca, 0xf9, 0xf7, 0x0e, 0x8b, 0xfd, 0x5b, 0xd1, 0xab, 0x9e, 0xae, 0x6f, 0x4a, 0x90, 0xab, 0x46, 0xa1, 0x37, 0xf0, 0x09, 0xe6, 0x02, 0x03, 0xb5, 0x70, 0xfa, 0x96, 0xc6, 0x1c, 0x9b, 0x0a, 0xaa, 0xef, 0xe2, 0x33, 0x76, 0xfd, 0xa7, 0x5b, 0xd8, 0x89, 0x2d, 0x89, 0x4c, 0x6d, 0xf8, 0x03, 0x93, 0xbd, 0xde, 0x11, 0x62, 0xa7, 0x61, 0x04, 0x57, 0x9d, 0x3c, 0x77, 0x30, 0xb7, 0x3c, 0xd5, 0x3f, 0x52, 0x51, 0x1b, 0x19, 0xfe, 0xe5, 0xdf, 0x8f, 0x97, 0x6c, 0x92, 0xdf, 0xb1, 0x3d, 0x02, 0x2b, 0x39, 0xa0, 0x22, 0x29, 0x5a, 0x28, 0x0e, 0x1d, 0x9e, 0x43, 0x4a, 0x04, 0x56, 0x0f, 0x4a, 0x12, 0x3b, 0x6f, 0x38, 0x5f, 0x55, 0x5f, 0xf1, 0xde, 0x1c, 0x84, 0x51, 0x8e, 0xde, 0x07, 0xb0, 0xf4, 0x60, 0xa4, 0xac, 0xc8, 0xc8, 0xfe, 0x29, 0xef, 0xba, 0x36, 0x97, 0xa9, 0xc2, 0xbb, 0x74, 0x0c, 0xf2, 0x64, 0x11, 0xb1, 0xcc, 0xbc, 0x98, 0xad, 0x62, 0x9d, 0x4e, 0xc2, 0xbb, 0x00, 0x16, 0xd7, 0x79, 0x13, 0x37, 0xa6, 0xb9, 0x8c, 0x5e, 0xb5, 0x3b, 0x3d, 0xe7, 0x87, 0xc3, 0xe9, 0x58, 0x13, 0xbe, 0x57, 0x2e, 0x75, 0x29, 0xa4, 0xdd, 0xe4, 0xaf, 0xdd, 0x12, 0xe4, 0x11, 0xce, 0x3b, 0xbc, 0xcb, 0x14, 0x49, 0x2b, 0xf5, 0x7a, 0xb4, 0x57, 0x67, 0x82, 0xc0, 0x06, 0x20, 0x41, 0x00, 0x10, 0xe9, 0x70, 0x18, 0x15, 0x35, 0xc1, 0xc6, 0x6b, 0x4c, 0x6f, 0x24, 0x5a, 0xa8, 0x19, 0x27, 0x8c, 0x9f, 0xd0, 0x6c, 0xbf, 0x43, 0x6f, 0x34, 0xbd, 0x87, 0x2a, 0xad, 0x8e, 0xa3, 0x6a, 0x73, 0xec, 0xb9, 0xd9, 0x56, 0xf7, 0xb8, 0xb8, 0x5e, 0x2a, 0x81, 0x79, 0x0c, 0x8e, 0x48, 0x8a, 0xe3, 0x2d, 0x3d, 0x6f, 0x27, 0xca, 0x6c, 0x13, 0xe5, 0xcf, 0xe2, 0x60, 0x33, 0x87, 0x12, 0x0d, 0xb9, 0x8d, 0x77, 0xb7, 0x70, 0x85, 0x7a, 0x34, 0xaa, 0x09, 0x95, 0x24, 0x53, 0xe6, 0xb9, 0xc8, 0x76, 0x89, 0xed, 0x18, 0x02, 0xb4, 0x39, 0x0f, 0xcf, 0x76, 0xc2, 0x4a, 0xdc, 0x59, 0x36, 0xd1, 0xdb, 0xdd, 0x6a, 0x35, 0xef, 0x25, 0x42, 0xdb, 0xb4, 0xf1, 0xd2, 0x97, 0x80, 0xcc, 0xc2, 0x7c, 0xe8, 0x87, 0xf7, 0xf3, 0x86, 0xe5, 0x6f, 0x0b, 0xfa, 0x98, 0x6d, 0x10, 0x2f, 0x6c, 0xd7, 0x5f, 0xe0, 0xc3, 0xdc, 0x78, 0x5a, 0x41, 0xd9, 0x55, 0x83, 0xc8, 0x7e, 0xfb, 0x1b, 0xa7, 0x2d, 0x4e, 0x42, 0x0e, 0xa2, 0x29, 0x3a, 0xc6, 0xd9, 0xae, 0x6f, 0x1e, 0x2c, 0xdb, 0xb4, 0x29, 0xbd, 0x5e, 0xd0, 0x26, 0x13, 0xab, 0x39, 0x40, 0x08, 0x4b, 0x1f, 0x78, 0xe2, 0x77, 0xac, 0xdf, 0xc0, 0xe5, 0x8b, 0x08, 0x38, 0xe2, 0xa7, 0xbd, 0x3e, 0xa1, 0x35, 0xf1, 0x47, 0xd3, 0xf4, 0xf6, 0xaf, 0x77, 0xb3, 0xf0, 0x58, 0xf4, 0x15, 0x8a, 0x95, 0x65, 0x91, 0xe7, 0x46, 0x34, 0xbc, 0xdc, 0x44, 0xea, 0xcb, 0x5c, 0xff, 0x45, 0x53, 0x33, 0x65, 0x8c, 0x54, 0xf7, 0x06, 0x1f, 0x76, 0x3c, 0x76, 0x52, 0x92, 0x08, 0xf3, 0x7b, 0x74, 0x87, 0x48, 0x4a, 0xe0, 0xff, 0xf1, 0x59, 0xd2, 0x05, 0x80, 0x04, 0x0a, 0xf2, 0x40, 0x7b, 0xc8, 0x91, 0x17, 0x15, 0xd5, 0x1a, 0xb1, 0xe8, 0xc2, 0x64, 0xda, 0x96, 0x74, 0x56, 0x2c, 0x69, 0xe1, 0x9f, 0xeb, 0xa3, 0x14, 0xa6, 0x2d, 0x0f, 0x77, 0xc4, 0x3e, 0xdc, 0x51, 0xb2, 0x42, 0xab, 0x8e, 0x3d, 0x1c, 0xe7, 0xbf, 0x41, 0x8f, 0x55, 0x61, 0xd4, 0xa3, 0xec, 0x62, 0xc2, 0x4b, 0xe6, 0xe1, 0x3a, 0x44, 0x17, 0x36, 0xc6, 0x40, 0x7e, 0x32, 0x80, 0x44, 0x1a, 0xa7, 0x84, 0x4f, 0xfe, 0x2b, 0xa1, 0x3c, 0xa8, 0x1a, 0x54, 0xe9, 0x8f, 0xda, 0xf6, 0x99, 0xfb, 0x63, 0x34, 0x97, 0x19, 0xfe, 0xc0, 0x1d, 0x4f, 0x4c, 0x46, 0x73, 0xcd, 0x8b, 0xa2, 0x5b, 0x65, 0x15, 0x50, 0xad, 0x9c, 0x29, 0x23, 0x3f, 0x01, 0xee, 0x3a, 0x07, 0xbd, 0xb5, 0x31, 0x84, 0x6c, 0x7f, 0x94, 0x59, 0x2b, 0xbf, 0x99, 0x3c, 0xf2, 0x61, 0x0e, 0x0e, 0x25, 0x0a, 0x90, 0x4b, 0x65, 0xa2, 0xfe, 0xa5, 0xac, 0x10, 0x2d, 0xec, 0x99, 0x44, 0xdd, 0x31, 0x08, 0x7b, 0xec, 0x2b, 0xe6, 0xbe, 0xca, 0xda, 0x44, 0xac, 0x2d, 0x69, 0xa9, 0x7a, 0x06, 0x59, 0xad, 0x38, 0xb3, 0xdc, 0xc3, 0x56, 0x76, 0x7f, 0x57, 0x66, 0x26, 0x0c, 0x19, 0x23, 0x24, 0xaf, 0x98, 0xb3, 0x91, 0x57, 0x12, 0x29, 0xbe, 0x5f, 0x8a, 0x4e, 0xe4, 0x6e, 0x1c, 0xa1, 0x16, 0x9c, 0x8e, 0x9c, 0x73, 0xd6, 0x27, 0x39, 0xa0, 0x83, 0xc4, 0xb5, 0x76, 0x67, 0x28, 0x94, 0xf7, 0xc8, 0x94, 0xe5, 0x87, 0xd0, 0x97, 0xc7, 0x59, 0x33, 0x28, 0x2c, 0x27, 0x12, 0xf2, 0xdd, 0x26, 0x1e, 0xef, 0xbf, 0x39, 0x00, 0x38, 0x54, 0x64, 0xf9, 0x1c, 0x84, 0x84, 0xc5, 0x6f, 0x9e, 0x3e, 0xc6 ],
+const [ 0xe3, 0x6e, 0x18, 0xed, 0xdf, 0xe2, 0xc2, 0x1d, 0x09, 0x7a, 0xf7, 0xbf, 0x9f, 0x8d, 0x89, 0xf1, 0x93, 0x4e, 0xa6, 0xb4, 0x34, 0xe8, 0xa3, 0xa1, 0x0b, 0xcd, 0xf7, 0xd8, 0x03, 0x4a, 0x8b, 0x3a, 0xce, 0x60, 0x31, 0xd8, 0x83, 0xcf, 0x71, 0xaa, 0x8c, 0x73, 0x8c, 0x85, 0xbf, 0xd3, 0xbb, 0x47, 0xcb, 0xf8, 0xb8, 0x55, 0xd6, 0x7b, 0x7f, 0x47, 0x64, 0xe2, 0x56, 0xe1, 0x7b, 0x2d, 0x0b, 0x45, 0x05, 0xab, 0x7d, 0x68, 0x75, 0x12, 0x5d, 0xc3, 0xad, 0xcf, 0x36, 0x4b, 0x1f, 0x9b, 0xab, 0xa2, 0x33, 0x4f, 0x01, 0x8f, 0xe9, 0xf9, 0xdd, 0xac, 0xc0, 0x2f, 0x4e, 0x5e, 0xd6, 0xa3, 0x0d, 0x0a, 0x50, 0xf8, 0x04, 0x86, 0xfc, 0xd4, 0x0e, 0xce, 0x35, 0x37, 0xfe, 0xf9, 0x08, 0x0b, 0xe2, 0x6b, 0x95, 0xfc, 0x89, 0x4b, 0xb7, 0x89, 0x42, 0x38, 0xe7, 0x5b, 0xe7, 0x37, 0x5d, 0xd6, 0x1a, 0xf0, 0x79, 0xef, 0xcf, 0x1b, 0x62, 0x3d, 0x0b, 0x35, 0xed, 0x52, 0xea, 0x77, 0xc0, 0x4b, 0xe7, 0x08, 0xb7, 0xa6, 0x58, 0x72, 0x86, 0x54, 0x38, 0x53, 0xa0, 0x0f, 0x29, 0x55, 0x58, 0xee, 0xb9, 0x5f, 0x46, 0x37, 0xe5, 0x0d, 0xed, 0x74, 0xdc, 0x5e, 0x9a, 0xc9, 0x05, 0xad, 0x8f, 0x84, 0x42, 0xe3, 0x61, 0xf6, 0x77, 0xea, 0x9f, 0x82, 0x46, 0x65, 0xb4, 0xf3, 0x1d, 0x9e, 0x0f, 0x12, 0x73, 0xbf, 0x81, 0x79, 0x4e, 0x46, 0xe6, 0xa2, 0x09, 0xb3, 0x07, 0x43, 0x54, 0x83, 0xbf, 0xde, 0x7c, 0x62, 0x5d, 0x93, 0xed, 0x9d, 0x4a, 0x3a, 0xf5, 0xd6, 0xec, 0xae, 0xca, 0xfb, 0xc9, 0x6b, 0xcf, 0x79, 0xf0, 0x5c, 0x13, 0xac, 0x95, 0xee, 0x1a, 0x9a, 0xfb, 0x69, 0xe1, 0xe2, 0x97, 0x80, 0x1c, 0xef, 0x72, 0x27, 0xc2, 0x71, 0xcf, 0xa4, 0xcb, 0x0e, 0x0e, 0xe9, 0x39, 0x54, 0xd0, 0x21, 0x55, 0xf3, 0x5c, 0x89, 0x3b, 0x29, 0x41, 0x81, 0x98, 0x7d, 0x3d, 0xe3, 0xb3, 0xb0, 0x5e, 0x93, 0xaa, 0xf1, 0x67, 0x57, 0xfe, 0x50, 0x75, 0xe9, 0x52, 0x75, 0xe2, 0x4b, 0x70, 0x92, 0x6a, 0x5b, 0x8d, 0x96, 0x8c, 0xa7, 0xce, 0xa4, 0x33, 0x82, 0x0b, 0xc3, 0x96, 0x58, 0xd2, 0xd7, 0x5d, 0x3e, 0xaf, 0xd0, 0x05, 0xcd, 0xaa, 0x21, 0x85, 0x31, 0x12, 0x73, 0x32, 0x7d, 0x79, 0x9b, 0xe0, 0x41, 0x00, 0xca, 0x4a, 0x5f, 0xd5, 0x04, 0xb4, 0x1a, 0xf9, 0xd4, 0xce, 0x70, 0x47, 0x3d, 0xdc, 0xaa, 0xb2, 0xf3, 0x14, 0x31, 0xce, 0xcc, 0x47, 0xa3, 0x92, 0x71, 0xc4, 0x26, 0x5c, 0x59, 0x7a, 0xfd, 0x35, 0xf8, 0x5c, 0x59, 0x56, 0x33, 0x0a, 0x71, 0xec, 0x18, 0xad, 0xd4, 0x19, 0xcc, 0x22, 0xfe, 0x3b, 0xc4, 0x5c, 0x2a, 0x70, 0x38, 0x03, 0x68, 0x5a, 0xd5, 0x61, 0xef, 0x1f, 0xb3, 0x7f, 0xb4, 0xb4, 0x86, 0x8b, 0x3c, 0x5c, 0x18, 0x7d, 0xae, 0x6b, 0xf7, 0xfb, 0x2c, 0x50, 0x6a, 0x79, 0x63, 0xd2, 0xaa, 0xa4, 0x61, 0x9a, 0x4f, 0x01, 0xa7, 0xf2, 0x09, 0xd1, 0x80, 0xcc, 0x90, 0x39, 0x91, 0x06, 0xde, 0x9f, 0xb0, 0xec, 0x9b, 0x57, 0xfa, 0xff, 0xd9, 0x7f, 0x1f, 0xf5, 0x01, 0x27, 0x01, 0x00, 0x0d, 0xb6, 0x7e, 0x53, 0xf8, 0x88, 0x89, 0xe3, 0x73, 0xdc, 0x80, 0x6a, 0xda, 0xee, 0xb9, 0xb2, 0x66, 0x60, 0x5f, 0x10, 0xa4, 0xde, 0x7c, 0x2e, 0x26, 0x02, 0x56, 0x0e, 0x78, 0x75, 0xff, 0x4c, 0x55, 0x58, 0x28, 0xa4, 0x1b, 0xe2, 0x36, 0xb3, 0x7d, 0x4a, 0x98, 0x02, 0x78, 0xe7, 0x57, 0x40, 0x88, 0x96, 0xee, 0xcf, 0x1b, 0x5c, 0x5d, 0x83, 0x46, 0x4c, 0x79, 0xa6, 0xb7, 0xab, 0x86, 0x3f, 0xeb, 0x53, 0x07, 0x93, 0xa1, 0x55, 0xd5, 0xed, 0x8e, 0xe2, 0x6f, 0x9b, 0x52, 0x6c, 0x91, 0x39, 0xab, 0x08, 0x08, 0x32, 0xe8, 0x17, 0xc4, 0x83, 0xa1, 0x25, 0x2f, 0xc2, 0xa6, 0x11, 0xbd, 0x5f, 0x35, 0x6e, 0xc4, 0x2b, 0x70, 0x2a, 0x8f, 0x16, 0x0d, 0x6d, 0xae, 0x3d, 0x50, 0xc4, 0x8f, 0x24, 0x36, 0x7f, 0x53, 0x3f, 0xf4, 0x58, 0xda, 0xb8, 0x9f, 0x55, 0x20, 0x6c, 0x2d, 0xef, 0xcd, 0x37, 0x9c, 0x73, 0x07, 0x71, 0x71, 0xa9, 0x8b, 0xb8, 0x64, 0xb4, 0xfc, 0xf0, 0x5a, 0x39, 0x7a, 0x89, 0x93, 0xc3, 0x77, 0x00, 0x25, 0x66, 0xc6, 0xa9, 0xa9, 0xa3, 0xf5, 0xab, 0x34, 0x8c, 0xdd, 0x4c, 0x89, 0x28, 0x77, 0x6f, 0x8c, 0x19, 0xf2, 0x5a, 0xfa, 0x7c, 0x02, 0xbd, 0x58, 0x11, 0x7a, 0xf0, 0x29, 0x9c, 0x1d, 0x7d, 0x64, 0x8b, 0xb1, 0xde, 0x25, 0xd8, 0x56, 0x88, 0xa3, 0x31, 0x16, 0x28, 0x62, 0x57, 0xbd, 0x2c, 0xaa, 0xc4, 0xeb, 0x85, 0x37, 0x90, 0x67, 0xab, 0x32, 0x95, 0xb6, 0xe2, 0x60, 0xd2, 0xed, 0xbd, 0x9a, 0x0d, 0xc3, 0xe0, 0x7d, 0xbc, 0xea, 0x09, 0x62, 0x26, 0xa0, 0x52, 0x90, 0xc6, 0x81, 0xb0, 0xb1, 0xf0, 0x9f, 0xc0, 0x83, 0xb7, 0xd4, 0xc3, 0xd0, 0x0d, 0x57, 0xe6, 0xa0, 0x2c, 0x8e, 0xc8, 0xad, 0x35, 0x23, 0x36, 0x17, 0x17, 0x5a, 0x39, 0x59, 0xb3, 0xa2, 0x52, 0x7c, 0x3e, 0x6a, 0x04, 0x8b, 0xe6, 0x35, 0x93, 0x46, 0xb8, 0xf1, 0x0c, 0x1a, 0xc1, 0x84, 0x85, 0x51, 0x73, 0xa9, 0xa6, 0x87, 0x4b, 0xfa, 0x68, 0x5d, 0xb1, 0x4d, 0x1d, 0x71, 0x20, 0x44, 0xb1, 0x8d, 0x86, 0x20, 0x2f, 0x1e, 0xee, 0xd6, 0x86, 0xe8, 0x5c, 0x65, 0x8e, 0xf9, 0xf8, 0x66, 0x46, 0xdb, 0x6f, 0xe5, 0x60, 0x0e, 0x97, 0x6f, 0xff, 0xb5, 0x52, 0x6c, 0xbf, 0x90, 0xb4, 0xb0, 0xf6, 0x2a, 0x68, 0x4c, 0x39, 0x54, 0x4f, 0xaa, 0x22, 0xd1, 0x6b, 0xd9, 0x51, 0x53, 0xfc, 0x25, 0xb1, 0xa7, 0xe8, 0xeb, 0xfc, 0x2c, 0x60, 0xab, 0x82, 0x89, 0xc1, 0x5f, 0x26, 0x9f, 0xb8, 0x0b, 0xa9, 0xbd, 0xaa, 0x96, 0x2b, 0x13, 0x53, 0xd8, 0xee, 0x6a, 0xad, 0xf4, 0x5e, 0x12, 0x13, 0xe8, 0x4e, 0x1b, 0xa6, 0x62, 0x85, 0xc8, 0xf0, 0xd6, 0x79, 0x40, 0xc7, 0xcd, 0x5a, 0x87, 0x74, 0x80, 0x52, 0xad, 0x15, 0xa5, 0x0c, 0x45, 0x40, 0x89, 0x73, 0x19, 0xe9, 0x5f, 0xbc, 0x1c, 0x86, 0xd7, 0xa6, 0xa0, 0x70, 0xf3, 0x00, 0xc9, 0x8d, 0x17, 0x6c, 0x42, 0x2c, 0x5f, 0x64, 0x2e, 0x30, 0x34, 0x7a, 0x62, 0x71, 0x22, 0xe4, 0xd1, 0x5f, 0xe4, 0x37, 0x47, 0xe9, 0xc1, 0x73, 0x5b, 0x9d, 0x1c, 0x40, 0x9f, 0x10, 0x46, 0x77, 0x19, 0x80, 0x96, 0xe4, 0xf7, 0xb8, 0xbc, 0x4b, 0x7e, 0x34, 0x52, 0xa8, 0x44, 0x86, 0xb4, 0xbb, 0x9f, 0xf8, 0x12, 0xc4, 0x5d, 0x73, 0xc3, 0x8c, 0xb5, 0x9f, 0xdc, 0xa4, 0x7e, 0x4c, 0x02, 0xf1, 0x9f, 0x11, 0x7c, 0x69, 0xc7, 0x32, 0x8c, 0x17, 0x5e, 0xc7, 0x00, 0x65, 0xbb, 0x1b, 0x04, 0x9a, 0x97, 0x53, 0x3a, 0xa2, 0xc1, 0x50, 0x0d, 0x0e, 0x14, 0xd6, 0x42, 0x5b, 0xa7, 0xed, 0xcf, 0x77, 0x43, 0x87, 0xf1, 0x81, 0x1a, 0x64, 0x79, 0xd0, 0xb5, 0x33, 0x66, 0x38, 0x2f, 0xfa, 0xb9, 0x88, 0xa1, 0xb7, 0x85, 0x57, 0xdd, 0x48, 0x46, 0x01, 0x5f, 0x88, 0x73, 0xec, 0x80, 0xbb, 0x57, 0x10, 0xed, 0x2c, 0x1c, 0xb6, 0x58, 0x14, 0x29, 0x7f, 0x6d, 0xbe, 0xae, 0xa9, 0x08, 0xe9, 0x7c, 0x8e, 0xa5, 0x6e, 0x1b, 0x6d, 0x18, 0x22, 0x16, 0x6d, 0x7e, 0xfe, 0x9a, 0xdf, 0x73, 0x7d, 0x3f, 0xc4, 0x85, 0x46, 0x26, 0x8f, 0xe9, 0x0b, 0x44, 0x2c, 0x6d, 0xb1, 0xfd, 0x40, 0xae, 0xb1, 0xf5, 0xb3, 0x8b, 0xbe, 0x23, 0x6c, 0xd9, 0xa8, 0x27, 0x5b, 0x58, 0x80, 0xdd, 0xbd, 0xe6, 0xfd, 0x32, 0x9b, 0xf3, 0x1e, 0x36, 0x94, 0x35, 0x11, 0x73, 0xdd, 0x9d, 0x54, 0x7e, 0x86, 0x89, 0x1a, 0xcb, 0xff, 0x3b, 0xf0, 0xc5, 0xda, 0x8a, 0xa0, 0x1e, 0xd2, 0xd7, 0x55, 0x64, 0x0d, 0x43, 0x01, 0xd6, 0x9e, 0x1f, 0xfc, 0x75, 0x4e, 0xa5, 0xee, 0x5e, 0x9c, 0xe5, 0xee, 0x56, 0x02, 0x01, 0xeb, 0xa7, 0x7a, 0x9d, 0x4b, 0x2b, 0x41, 0x92, 0xd3, 0xa6, 0xdb, 0xe2, 0xc7, 0x58, 0x57, 0xf1, 0x52, 0xd3, 0xd4, 0xf2, 0x27, 0x0b, 0x44, 0x9f, 0x69, 0xac, 0x70, 0x2d, 0xc9, 0xb0, 0x3d, 0x7f, 0xee, 0x30, 0x2d, 0x9a, 0x19, 0x7a, 0x28, 0x59, 0x09, 0x65, 0x7d, 0x61, 0x1c, 0xe1, 0x24, 0x58, 0xb8, 0xd2, 0x46, 0x52, 0xe9, 0x1f, 0xfe, 0x8c, 0x4b, 0x05, 0x62, 0x5d, 0x2b, 0xb2, 0xbd, 0x69, 0xe9, 0x0f, 0x1f, 0x18, 0xa0, 0xdd, 0x18, 0x47, 0x09, 0x03, 0xc0, 0x3d, 0x9d, 0x26, 0xfa, 0xe0, 0xfa, 0x7b, 0xfa, 0x28, 0x88, 0xd9, 0x05, 0xd5, 0x5c, 0x13, 0x78, 0x5d, 0x5d, 0x84, 0x0c, 0x29, 0xa5, 0xeb, 0x58, 0x00, 0x2a, 0x7a, 0x98, 0xc4, 0x9d, 0x29, 0xac, 0x5c, 0x92, 0x50, 0x64, 0xf1, 0xe2, 0x75, 0xfa, 0x5d, 0x4d, 0x62, 0xe0, 0xe0, 0x64, 0x7b, 0xbc, 0x15, 0xa7, 0x4f, 0xb2, 0x25, 0xea, 0x6d, 0xe1, 0x3b, 0xfd, 0x79, 0x30, 0x38, 0x8b, 0x7f, 0x4a, 0xa7, 0x43, 0x86, 0xe7, 0xf3, 0x36, 0x69, 0x4e, 0xd7, 0x80, 0xe2, 0x17, 0x17, 0x2b, 0xe8, 0x36, 0x6e, 0x50, 0x3b, 0x35, 0xc7, 0x7f, 0x3d, 0xc1, 0xb0, 0x61, 0x03, 0x68, 0x0b, 0x9c, 0xac, 0xa1, 0x06, 0xf7, 0xf1, 0x0d, 0x4e, 0xbf, 0xfe, 0xfc, 0x80, 0x69, 0x80, 0x33, 0xe1, 0x78, 0x00, 0xed, 0x4e, 0xa2, 0x6f, 0x1f, 0x76, 0x2e, 0x02, 0x00, 0x46, 0xa0, 0x40, 0xc9, 0xa5, 0x98, 0x59, 0xb9, 0x62, 0xf8, 0xb9, 0x5d, 0x6a, 0x45, 0xdd, 0x0e, 0x3f, 0x50, 0x65, 0xbb, 0xa5, 0x15, 0x6b, 0xe9, 0x9f, 0xe3, 0x14, 0xf7, 0x99, 0xbd, 0x64, 0xa7, 0xe7, 0x01, 0x57, 0xda, 0x6e, 0x47, 0x2d, 0x9b, 0xa1, 0x8c, 0x05, 0x5f, 0xb0, 0x90, 0xad, 0x8b, 0xfb, 0x7c, 0xb9, 0x37, 0xcd, 0xc8, 0xd2, 0x32, 0x47, 0x5c, 0x51, 0x46, 0x9a, 0xf5, 0x0d, 0xbd, 0x7a, 0xcb, 0x70, 0x23, 0xcf, 0x71, 0xd1, 0x4e, 0xad, 0xfc, 0xfd, 0x9c, 0x86, 0x67, 0x17, 0x7c, 0x9e, 0x36, 0xa3, 0x30, 0xc0, 0x5a, 0xdd, 0xd1, 0x30, 0x55, 0x4f, 0x93, 0xe0, 0x9e, 0xa2, 0x4a, 0xe6, 0x47, 0xb5, 0x2d, 0x2e, 0xdd, 0xec, 0xda, 0x6c, 0x90, 0xcb, 0x9b, 0x55, 0x93, 0xc3, 0xe8, 0x0f, 0xc6, 0x4b, 0x2d, 0xe6, 0x93, 0x33, 0xcd, 0x40, 0x15, 0x35, 0x66, 0xd3, 0x80, 0xce, 0x57, 0x15, 0xbd, 0x4c, 0x7f, 0xf4, 0x54, 0x27, 0x48, 0xc8, 0x8f, 0x94, 0xe4, 0x86, 0xdd, 0x58, 0xd7, 0x36, 0x74, 0xda, 0xb6, 0xa7, 0x3a, 0x7d, 0x2e, 0x61, 0xe6, 0x2c, 0x47, 0xdb, 0x62, 0x37, 0xea, 0xee, 0x74, 0x5d, 0xa2, 0x8a, 0x9e, 0x2a, 0x9f, 0xa8, 0x43, 0x83, 0x00, 0x7f, 0x0a, 0x7f, 0x52, 0xfb, 0x88, 0x78, 0x53, 0x6b, 0x19, 0x62, 0xfc, 0x7a, 0x0e, 0x5c, 0xbf, 0x60, 0x0e, 0x85, 0x0e, 0x59, 0xb6, 0x11, 0x1c, 0x56, 0x83, 0x9c, 0xe7, 0xf3, 0xf2, 0xbd, 0x76, 0xaa, 0xe5, 0xdf, 0x5f, 0x46, 0x49, 0x4c, 0x8d, 0x9a, 0xf6, 0x8b, 0x40, 0x72, 0xd6, 0xec, 0x55, 0xca, 0x4a, 0x61, 0xc8, 0x3e, 0xc9, 0x8f, 0x77, 0xc2, 0xcb, 0x25, 0x29, 0x93, 0xe5, 0x6d, 0xce, 0x6e, 0x35, 0x21, 0x09, 0xff, 0x00, 0x7f, 0xeb, 0x9c, 0x9a, 0x9f, 0x02, 0x33, 0x86, 0x05, 0x92, 0x81, 0xdf, 0x73, 0x22, 0x85, 0xf6, 0x00, 0x3a, 0x35, 0x3d, 0x6e, 0x6c, 0x6f, 0x64, 0xb9, 0x91, 0x32, 0xc1, 0xec, 0x55, 0x0e, 0xf5, 0x38, 0xf6, 0xd9, 0xcd, 0x47, 0x48, 0xa4, 0x66, 0xce, 0xfd, 0xed, 0x95, 0x62, 0x23, 0x17, 0x85, 0x8c, 0xee, 0x17, 0xa2, 0x1f, 0xb8, 0x6f, 0xb6, 0xc9, 0x46, 0x60, 0x52, 0xe9, 0x4d, 0x5b, 0x70, 0xa0, 0x34, 0xba, 0x56, 0x2b, 0x1c, 0xad, 0xbe, 0x70, 0x1e, 0x77, 0x33, 0xd6, 0xd3, 0xda, 0xbe, 0x5a, 0x1a, 0xcf, 0xc2, 0xe0, 0x15, 0x7b, 0x25, 0xc6, 0x75, 0x5f, 0xb0, 0xbf, 0xf8, 0xcf, 0xb9, 0xdf, 0x2f, 0xa5, 0xff, 0xf2, 0x85, 0x36, 0xd5, 0x12, 0x7d, 0x85, 0x83, 0x79, 0x3b, 0xb7, 0xe9, 0x93, 0x46, 0xc7, 0x65, 0x57, 0x8c, 0x7b, 0xf7, 0xd8, 0xa7, 0x97, 0xa3, 0x17, 0x5e, 0x50, 0x17, 0x1c, 0x6f, 0x03, 0x8e, 0x45, 0x8c, 0x27, 0xf4, 0xdd, 0xa3, 0x81, 0x4b, 0xf0, 0x62, 0x96, 0x4d, 0x5e, 0xfb, 0x66, 0x53, 0x2f, 0x24, 0x57, 0x75, 0x26, 0x62, 0x70, 0xf3, 0x99, 0x88, 0xc7, 0xd4, 0x80, 0x7a, 0x3d, 0xcc, 0xcb, 0x37, 0x68, 0x63, 0xf9, 0x17, 0xd1, 0x54, 0xe6, 0x51, 0x60, 0x33, 0xe4, 0xbf, 0x14, 0x53, 0x0e, 0xe6, 0xf7, 0xe7, 0xd9, 0x31, 0x52, 0x67, 0xec, 0x7d, 0x1d, 0x36, 0x32, 0xda, 0xb9, 0x81, 0x2d, 0x90, 0xe2, 0x6a, 0x8d, 0x61, 0xdf, 0x66, 0x01, 0x0e, 0xfb, 0xe3, 0x4d, 0x1d, 0x39, 0x2f, 0x9d, 0xd8, 0x44, 0x95, 0x18, 0x99, 0xa5, 0xc9, 0xb9, 0x45, 0x38, 0x86, 0x5a, 0x17, 0xe1, 0x75, 0x12, 0x9f, 0x7b, 0x51, 0xc1, 0x0a, 0x11, 0x49, 0xe9, 0xa3, 0x51, 0xa5, 0xc0, 0x9a, 0x3d, 0xad, 0x83, 0x04, 0x24, 0xc6, 0x0c, 0x24, 0xd1, 0xdf, 0xa7, 0xe9, 0x02, 0x0b, 0x22, 0xb7, 0x1c, 0x6f, 0x23, 0x6b, 0x1c, 0x5f, 0xbe, 0x99, 0xd1, 0xc4, 0x47, 0x17, 0x49, 0xc1, 0x65, 0xc0, 0x89, 0x96, 0x68, 0x72, 0x80, 0xc4, 0xdd, 0x59, 0x3e, 0x72, 0x5f, 0x70, 0x62, 0x0f, 0xb0, 0x44, 0xd1, 0x39, 0x08, 0xfc, 0xae, 0xdd, 0xac, 0x96, 0x86, 0xa0, 0xc3, 0x73, 0xca, 0x7e, 0x65, 0x16, 0x83, 0xb1, 0xf6, 0x29, 0x41, 0xd5, 0xb2, 0xc0, 0x54, 0x49, 0x88, 0xe2, 0x3f, 0xd8, 0x2c, 0x46, 0x6a, 0x99, 0x68, 0x5a, 0x17, 0x13, 0xb3, 0x89, 0x97, 0xa5, 0x04, 0xbe, 0xbe, 0x26, 0xe8, 0x24, 0x94, 0xc8, 0xd3, 0x31, 0x4d, 0x42, 0xb3, 0xe2, 0x7c, 0x2e, 0xcb, 0x48, 0x83, 0xaf, 0xbf, 0x43, 0x4e, 0x58, 0xeb, 0x8e, 0x41, 0x49, 0xf9, 0xfb, 0x6e, 0x9b, 0xb3, 0x00, 0x0c, 0xff, 0x15, 0x73, 0x24, 0xa1, 0xa7, 0x92, 0x8e, 0x53, 0x0a, 0x46, 0x1c, 0xe7, 0xd0, 0xa9, 0x15, 0xdc, 0x91, 0xc5, 0xe5, 0x3e, 0x3a, 0x9f, 0x12, 0xc7, 0xa9, 0x74, 0x72, 0x4a, 0x77, 0x42, 0x9c, 0x52, 0x15, 0x8a, 0x9c, 0x06, 0x1b, 0x54, 0xeb, 0x4f, 0xdc, 0x75, 0x9e, 0x3d, 0x3e, 0x0d, 0xdd, 0xa7, 0xc9, 0x53, 0x97, 0x12, 0xfd, 0x95, 0x74, 0xd4, 0xe9, 0x7a, 0x0b, 0x7a, 0xf9, 0x8b, 0x56, 0x66, 0x10, 0xf1, 0x62, 0xbd, 0xd6, 0x80, 0x4b, 0x80, 0x54, 0xf5, 0x68, 0xf8, 0xbe, 0x7c, 0xc3, 0x58, 0x8f, 0x76, 0xcc, 0x9e, 0xdb, 0x78, 0x4e, 0xba, 0xe1, 0x97, 0xa1, 0xf2, 0xe1, 0xe3, 0x22, 0x85, 0x2d, 0x31, 0xe0, 0x8e, 0x81, 0x1e, 0x98, 0x2c, 0x97, 0x50, 0xe4, 0xe0, 0xf7, 0xff, 0xaf, 0x36, 0x0d, 0xb4, 0xec, 0xa8, 0x7d, 0x51, 0x87, 0xbf, 0xbb, 0x52, 0x9c, 0x7b, 0xd6, 0x52, 0xe8, 0xf5, 0x94, 0xd1, 0x7d, 0x43, 0xc4, 0x34, 0xb9, 0x9c, 0xd0, 0x0d, 0x78, 0xbc, 0x92, 0x9d, 0x89, 0x8a, 0x68, 0x98, 0x5f, 0xf9, 0x8b, 0x27, 0x09, 0x2c, 0x9c, 0x33, 0x65, 0xdd, 0x80, 0xe1, 0x90, 0xff, 0x6e, 0x59, 0xa0, 0xa2, 0x46, 0xcc, 0x96, 0x18, 0x25, 0xb5, 0x8e, 0x56, 0x36, 0x5f, 0x39, 0x9c, 0xcb, 0xa7, 0x8d, 0x59, 0xac, 0x03, 0xbb, 0x49, 0xae, 0xc3, 0x62, 0xe0, 0x88, 0x97, 0x02, 0xeb, 0xe3, 0x52, 0xb3, 0x75, 0xb0, 0xed, 0x17, 0xe7, 0xbe, 0xcf, 0x8d, 0x74, 0x8c, 0x4b, 0xa7, 0xb4, 0x5c, 0x6b, 0xdf, 0x8f, 0x88, 0xec, 0x85, 0x5d, 0x19, 0x89, 0xfc, 0x4b, 0x96, 0x7d, 0x26, 0x01, 0x1a, 0x43, 0x1d, 0x82, 0xa9, 0xa0, 0x24, 0x53, 0xc4, 0xe3, 0xdd, 0xdf, 0x3b, 0x6c, 0xbc, 0x1a, 0x43, 0x6b, 0xbb, 0x65, 0xc8, 0xea, 0x4f, 0xb2, 0x05, 0x0e, 0x9b, 0xe8, 0x51, 0x99, 0xe4, 0x89, 0x3c, 0xb4, 0x46, 0x92, 0xda, 0xec, 0xa5, 0xa2, 0x5f, 0x7a, 0xe6, 0x5f, 0xec, 0xc7, 0x5e, 0x15, 0xa9, 0x2f, 0x8a, 0xa1, 0x14, 0x05, 0x01, 0x8e, 0x99, 0xd8, 0xa8, 0x7d, 0x62, 0xf5, 0x25, 0xca, 0x70, 0x2d, 0x96, 0x6c, 0xeb, 0xd9, 0x82, 0x1d, 0xb6, 0x1b, 0x0f, 0xbc, 0x47, 0x66, 0x76, 0xef, 0xb6, 0x40, 0xb5, 0x0c, 0x13, 0x46, 0x84, 0x3a, 0xfd, 0x71, 0x89, 0xd3, 0x70, 0x99, 0xcf, 0x0d, 0xdf, 0x37, 0x75, 0xda, 0x83, 0x6f, 0xa3, 0x0c, 0xf2, 0x4e, 0xc2, 0xbd, 0xf3, 0x50, 0xed, 0xee, 0x91, 0x25, 0xa2, 0x6e, 0x6e, 0xb4, 0xbe, 0xfe, 0x5a, 0x61, 0xa8, 0xb2, 0x24, 0x8b, 0xcc, 0x9a, 0xb0, 0x59, 0x4b, 0xa2, 0x4a, 0xb7, 0xf0, 0xb7, 0x3a, 0x9b, 0x67, 0x2b, 0x99, 0x8d, 0xa9, 0x5b, 0x63, 0x66, 0xbb, 0x8f, 0xcd, 0x58, 0x98, 0x21, 0xd8, 0x2e, 0x6c, 0xe2, 0x26, 0xd5, 0x02, 0xb9, 0x0c, 0x1c, 0x80, 0x8d, 0xea, 0xb8, 0x52, 0x65, 0xb7, 0x8b, 0x64, 0xce, 0xe0, 0x26, 0x94, 0x7e, 0x53, 0x8c, 0x67, 0x36, 0xd6, 0x38, 0xfa, 0xed, 0x9e, 0x62, 0x3c, 0x2a, 0x1d, 0x7f, 0x5b, 0xb2, 0x1b, 0x07, 0x7c, 0x63, 0x08, 0x7a, 0xaf, 0x60, 0x91, 0xa5, 0x22, 0x6e, 0x71, 0x22, 0x95, 0x9e, 0x8a, 0x1e, 0x0d, 0x2d, 0x34, 0x5e, 0xcd, 0xa8, 0xd5, 0x84, 0x82, 0x53, 0xb2, 0x8f, 0xbe, 0xcc, 0x04, 0xa2, 0xa7, 0xec, 0x4f, 0x06, 0xf1, 0xee, 0xef, 0x71, 0x09, 0xd3, 0xf3, 0x89, 0x93, 0x04, 0x2f, 0xa4, 0x17, 0x3a, 0x8d, 0xd2, 0xf7, 0x9b, 0xa4, 0x1d, 0xa5, 0x26, 0x8c, 0x0f, 0x12, 0x50, 0xf0, 0x75, 0x6a, 0xef, 0x64, 0x63, 0xfe, 0x58, 0xf9, 0x78, 0x82, 0xc4, 0x0f, 0x63, 0x78, 0xf9, 0x6b, 0xa6, 0xec, 0x26, 0x8a, 0x9a, 0x62, 0x0e, 0x34, 0xb4, 0x0d, 0x68, 0x54, 0x06, 0x41, 0x86, 0x06, 0x09, 0x2b, 0x36, 0xf2, 0x99, 0xc0, 0xe6, 0xd9, 0x41, 0xf3, 0x0b, 0x6d, 0xb9, 0x2b, 0xc3, 0x66, 0xad, 0xf4, 0xb8, 0xd2, 0xc0, 0xf4, 0x48, 0xac, 0xd1, 0x22, 0xe4, 0xb1, 0x7d, 0x32, 0xb6, 0x6f, 0xe5, 0x53, 0x87, 0x9f, 0xb1, 0x1d, 0xdf, 0xb4, 0x55, 0xc5, 0x6e, 0xb4, 0x92, 0x94, 0xaa, 0x47, 0x40, 0x97, 0xba, 0x0e, 0x4c, 0x97, 0x93, 0x35, 0xfd, 0x4b, 0x61, 0x4c, 0x7b, 0xcd, 0x28, 0x52, 0x91, 0x4b, 0xab, 0x13, 0xb2, 0xff, 0x8d, 0xb5, 0x3a, 0x61, 0xb6, 0x8d, 0xf7, 0x9b, 0xf8, 0x37, 0xe8, 0x3d, 0xf2, 0xe5, 0x44, 0x32, 0x35, 0xf7, 0xbe, 0xf3, 0xa6, 0xcc, 0x08, 0xfa, 0x24, 0xd8, 0x96, 0x7a, 0x6a, 0xf7, 0xa4, 0x4d, 0x36, 0x01, 0x7a, 0x2d, 0xab, 0x9f, 0xef, 0x28, 0xf3, 0x5d, 0x2c, 0x4e, 0x2a, 0x00, 0xb2, 0xad, 0x77, 0x19, 0x9f, 0x7f, 0x7c, 0xda, 0x2c, 0xa1, 0xf1, 0x29, 0x7b, 0x47, 0x8b, 0xf3, 0x90, 0xef, 0x23, 0xc3, 0x9d, 0x93, 0x14, 0x93, 0x82, 0x23, 0xe5, 0xe2, 0x94, 0x32, 0x28, 0x06, 0x9d, 0xf0, 0xa1, 0xc4, 0x25, 0x58, 0xab, 0x1e, 0xf0, 0xaa, 0xd8, 0x6c, 0xc8, 0x1c, 0xd8, 0xae, 0x7d, 0xcc, 0x9c, 0x21, 0x29, 0xfa, 0xba, 0x10, 0xb8, 0x74, 0x14, 0xed, 0xa8, 0x51, 0xb5, 0xa0, 0x0e, 0xe2, 0xfb, 0x1f, 0xda, 0xe6, 0xfb, 0x3f, 0x5b, 0xfd, 0x21, 0xca, 0x06, 0x60, 0x17, 0xd1, 0x73, 0xce, 0xe8, 0x43, 0xa8, 0xca, 0x66, 0xbf, 0x9a, 0x03, 0xc9, 0xa7, 0xf1, 0x14, 0x98, 0x76, 0x0c, 0x6d, 0xcd, 0x53, 0x45, 0x91, 0x34, 0xe6, 0x76, 0x83, 0x14, 0x6a, 0xbc, 0x7a, 0x11, 0x03, 0x7a, 0xdc, 0x51, 0x52, 0xa1, 0x6a, 0xde, 0x47, 0x2f, 0xb8, 0x4b, 0x37, 0xf6, 0xe1, 0x9b, 0x2f, 0x9f, 0x78, 0x5e, 0x87, 0xee, 0xc2, 0x1d, 0xba, 0x48, 0x22, 0xf8, 0x75, 0x72, 0xd4, 0x8e, 0xed, 0x9b, 0xde, 0x1d, 0x76, 0x9d, 0x44, 0xea, 0x52, 0x80, 0x7c, 0xe4, 0xc6, 0x3f, 0x21, 0x84, 0x73, 0xcf, 0xec, 0xf7, 0xe4, 0x5e, 0xdf, 0x7f, 0x64, 0xd9, 0xc3, 0x17, 0x12, 0xb0, 0xd5, 0x56, 0x37, 0xdd, 0xbd, 0x95, 0xd6, 0x23, 0xbf, 0x54, 0x85, 0x93, 0x35, 0xda, 0x7c, 0x55, 0x3d, 0x1c, 0xec, 0xa5, 0xaf, 0xe0, 0x92, 0x1c, 0x52, 0x22, 0x8b, 0x31, 0x4f, 0xb7, 0x6a, 0xff, 0xe5, 0x30, 0x88, 0x49, 0x5f, 0x01, 0x9b, 0xbb, 0x43, 0xe3, 0x8a, 0x72, 0xcd, 0x76, 0x80, 0xbf, 0x9b, 0x2b, 0x40, 0x28, 0xaa, 0x61, 0xb8, 0xb0, 0x81, 0xce, 0xd8, 0x59, 0xac, 0x21, 0xa4, 0xe6, 0x6c, 0xe5, 0x88, 0xe5, 0xad, 0xa9, 0xec, 0xed, 0x38, 0x5e, 0x09, 0x25, 0x2a, 0x00, 0xfb, 0x05, 0xa5, 0x79, 0x17, 0x61, 0xc5, 0xc2, 0x7e, 0xa3, 0xd6, 0x4b, 0xf2, 0x58, 0xc4, 0x9d, 0xe9, 0xee, 0xd2, 0x3e, 0xe0, 0xbb, 0x8f, 0xd4, 0xf2, 0x42, 0x07, 0x8e, 0xa9, 0xb2, 0x36, 0xc0, 0x14, 0xb0, 0xc2, 0xcd, 0x1a, 0x56, 0xe9, 0x4a, 0x0d, 0x7c, 0xb7, 0x60, 0x83, 0x36, 0x7d, 0x72, 0x61, 0x9d, 0x80, 0x00, 0x38, 0xd3, 0xee, 0xcc, 0xd5, 0x41, 0x16, 0x3b, 0x13, 0x23, 0xd7, 0xfd, 0xf4, 0x47, 0x59, 0xf0, 0xf0, 0x11, 0xfc, 0x42, 0x8d, 0xc3, 0x8e, 0xd7, 0x30, 0xfb, 0xc1, 0xea, 0x33, 0x7e, 0xdc, 0xf6, 0x37, 0x33, 0xb0, 0xd7, 0xbc, 0x73, 0xce, 0x2c, 0xef, 0x80, 0xf7, 0x01, 0xc2, 0x52, 0xd4, 0xab, 0x42, 0x9a, 0xe7, 0xf2, 0x26, 0x01, 0xc2, 0x76, 0xa3, 0xb0, 0x77, 0x4b, 0x88, 0x16, 0x4f, 0xe7, 0x86, 0xe5, 0xbf, 0x3e, 0xcf, 0x5e, 0x97, 0x2b, 0xe4, 0xcf, 0x7d, 0x12, 0xa7, 0x5a, 0x9a, 0xc4, 0xb8, 0xf7, 0x93, 0xa2, 0xfe, 0xbc, 0xbb, 0x06, 0x84, 0x5d, 0x87, 0xde, 0x87, 0xef, 0x42, 0x9a, 0xcd, 0xf1, 0x01, 0x49, 0x38, 0x8c, 0xda, 0xfe, 0x9a, 0x1a, 0x51, 0x79, 0xcb, 0xe6, 0x13, 0x03, 0xf9, 0x32, 0xe7, 0x9a, 0x40, 0x7f, 0xe1, 0x4e, 0x7a, 0x08, 0xd8, 0xeb, 0x59, 0x90, 0x1b, 0xd8, 0xb3, 0x5d, 0x60, 0x3f, 0x1c, 0x85, 0xfd, 0x6e, 0xba, 0x68, 0x5b, 0x7e, 0x55, 0x7e, 0xa7, 0x32, 0xae, 0x53, 0xca, 0x21, 0x12, 0xcf, 0x9c, 0x18, 0x2e, 0xbb, 0x54, 0xba, 0x25, 0x81, 0x44, 0x69, 0xe0, 0x33, 0xc3, 0x6a, 0xa6, 0xcf, 0x6a, 0x43, 0xec, 0xc2, 0x83, 0x68, 0x6e, 0xaa, 0xbe, 0x17, 0x7e, 0x60, 0x26, 0x81, 0x9c, 0x36, 0x54, 0x2a, 0x48, 0x7d, 0xe2, 0x92, 0x14, 0x4b, 0x23, 0x15, 0xfd, 0x7b, 0x11, 0x10, 0xfb, 0xf4, 0x87, 0x45, 0xd7, 0x2f, 0xb1, 0x81, 0x3d, 0xf3, 0xc0, 0x7c, 0x12, 0x63, 0xe2, 0x00, 0x07, 0x3b, 0x71, 0x4d, 0x6f, 0x57, 0x6a, 0xbd, 0x4e, 0x75, 0x22, 0xa4, 0xb2, 0x3b, 0x34, 0x7a, 0x46, 0x7c, 0xbe, 0x3c, 0x24, 0xb7, 0xcd, 0x0f, 0xeb, 0xe0, 0x15, 0x27, 0x11, 0x63, 0xe6, 0xe7, 0x7b, 0x67, 0x5b, 0x49, 0x4b, 0x4f, 0xd5, 0x81, 0xfa, 0x87, 0xa7, 0xdd, 0xa6, 0x7d, 0x13, 0xf0, 0xad, 0xed, 0x76, 0xef, 0x7a, 0x62, 0xbf, 0x5b, 0x9f, 0xfa, 0x25, 0xe0, 0x24, 0x69, 0x1a, 0x7e, 0x1f, 0x40, 0x7a, 0xe6, 0x85, 0x70, 0x09, 0x27, 0x40, 0x09, 0x1c, 0x89, 0x82, 0x48, 0x96, 0xb9, 0x58, 0xd1, 0x16, 0x27, 0x82, 0x39, 0x6f, 0xad, 0x82, 0xc7, 0x59, 0x71, 0xf3, 0x7c, 0x66, 0x0c, 0x1c, 0x50, 0x37, 0xec, 0xc5, 0xbf, 0xef, 0xf6, 0x49, 0x84, 0xe8, 0x70, 0xed, 0xa5, 0xa5, 0x1f, 0x70, 0xaf, 0x08, 0xac, 0xe4, 0x43, 0xc5, 0x4d, 0xbc, 0xd1, 0x17, 0xa1, 0x25, 0xa4, 0xb2, 0xdb, 0x9a, 0x1f, 0xf8, 0x22, 0xb2, 0x46, 0x6f, 0x38, 0x3d, 0x80, 0x73, 0x5a, 0x90, 0x9a, 0x28, 0x68, 0x1d, 0x10, 0xb3, 0x46, 0x47, 0x88, 0xaa, 0x82, 0x74, 0xa0, 0xc8, 0x37, 0x63, 0xe9, 0xe6, 0x31, 0xc0, 0x33, 0x26, 0x51, 0xf5, 0x0c, 0x72, 0x33, 0x44, 0x83, 0x25, 0x0f, 0x12, 0x32, 0x07, 0xdd, 0x86, 0x7b, 0x7f, 0xbd, 0x53, 0x11, 0x04, 0x95, 0xd2, 0xba, 0xd5, 0xfc, 0x54, 0x54, 0xea, 0x57, 0xb6, 0x16, 0x2a, 0x41, 0x36, 0x19, 0xde, 0x31, 0x84, 0x17, 0x66, 0x56, 0x1d, 0x72, 0x2a, 0xc6, 0xd4, 0x78, 0xd4, 0xd8, 0xb1, 0xe5, 0xbd, 0xce, 0xff, 0xa9, 0xa4, 0xb8, 0xa1, 0xec, 0xa6, 0x95, 0xa5, 0x50, 0x6a, 0xba, 0x1c, 0x76, 0x9d, 0x78, 0x28, 0xc3, 0x9e, 0xf9, 0x56, 0x64, 0x7a, 0x6b, 0x2e, 0x8f, 0x1a, 0x60, 0x09, 0x0c, 0xbb, 0x75, 0x23, 0xf5, 0x9f, 0x32, 0xf1, 0xba, 0x02, 0x32, 0xb5, 0x67, 0x50, 0x84, 0x4f, 0x2a, 0x95, 0x50, 0x56, 0x10, 0x35, 0xbe, 0x67, 0x0f, 0xdd, 0x13, 0xbd, 0x49, 0xb9, 0x1e, 0x02, 0x8f, 0xe8, 0xd2, 0x65, 0x24, 0x2d, 0x34, 0xed, 0xc4, 0xe7, 0x78, 0x0d, 0xe5, 0x43, 0x66, 0x78, 0x3d, 0xb0, 0x03, 0x36, 0x84, 0x93, 0x6e, 0xf8, 0x7b, 0x3c, 0x08, 0xa9, 0x2d, 0x19, 0xd7, 0x45, 0x75, 0x2a, 0x2d, 0xee, 0xc0, 0xb5, 0x84, 0x3d, 0x14, 0x3b, 0xad, 0xd6, 0x52, 0xaa, 0x2a, 0x3f, 0xb8, 0xd4, 0xd8, 0xf2, 0xa9, 0x20, 0xd1, 0xb0, 0xb1, 0x80, 0x90, 0x19, 0xc4, 0xa3, 0x56, 0x7a, 0xc6, 0x6b, 0xcd, 0xe6, 0x51, 0xa1, 0xeb, 0x88, 0xb2, 0xe8, 0x1a, 0x37, 0x34, 0xef, 0x96, 0x4b, 0xa2, 0xeb, 0x16, 0xaf, 0x07, 0x45, 0xae, 0x38, 0xb8, 0x8f, 0xf4, 0x35, 0x94, 0xbd, 0x62, 0x48, 0x8b, 0x92, 0xfb, 0x74, 0x5d, 0x58, 0x31, 0x76, 0xa4, 0xd4, 0x07, 0x59, 0x15, 0x79, 0x73, 0x45, 0x03, 0xdc, 0x06, 0x98, 0x24, 0x68, 0xce, 0x37, 0x98, 0x53, 0x7c, 0x27, 0x27, 0xd0, 0xc2, 0x57, 0xcb, 0x87, 0xff, 0xc0, 0x6e, 0x42, 0x1e, 0xb0, 0xf4, 0xe9, 0xbb, 0x63, 0x7c, 0xb0, 0x88, 0xd4, 0xe3, 0x8f, 0xf0, 0xd2, 0x8a, 0xf3, 0xfa, 0x56, 0x5a, 0xb3, 0x6f, 0x14, 0x05, 0x45, 0x3f, 0x50, 0x8e, 0x32, 0x21, 0xf3, 0x0b, 0xc7, 0x7a, 0xde, 0xaa, 0x0d, 0x80, 0x7e, 0xf2, 0xfc, 0x9f, 0xa1, 0x4b, 0xec, 0x1c, 0x88, 0xc1, 0x4c, 0xf8, 0x3d, 0x05, 0x96, 0x17, 0x27, 0xb4, 0x82, 0xa1, 0xdb, 0xdc, 0x7b, 0xa9, 0x35, 0xbd, 0x4f, 0x0c, 0xa8, 0xcc, 0x2a, 0x9c, 0xd2, 0xfe, 0xc5, 0x7e, 0x53, 0x42, 0xdb, 0xd1, 0xe0, 0x4f, 0xdd, 0x90, 0x93, 0xa1, 0xe6, 0xba, 0x85, 0xbe, 0xf1, 0xb0, 0x9f, 0xbe, 0x4a, 0xde, 0xad, 0x0a, 0x42, 0x9d, 0xb4, 0x64, 0x27, 0x58, 0x86, 0x28, 0x73, 0xee, 0x93, 0xd1, 0x44, 0x58, 0x02, 0xbe, 0x0c, 0x8c, 0x01, 0x37, 0x8a, 0xa1, 0x59, 0xab, 0xf9, 0x33, 0x45, 0x3b, 0x87, 0x09, 0x84, 0x7d, 0x08, 0xf5, 0xad, 0x79, 0xec, 0xfc, 0xc3, 0xf8, 0x6e, 0xb7, 0x09, 0xff, 0x0f, 0xf9, 0x17, 0x96, 0x43, 0xb3, 0x2e, 0xcd, 0x6a, 0x14, 0xc9, 0x01, 0x01, 0xf4, 0x74, 0x5c, 0x1a, 0x72, 0xe1, 0x9b, 0x09, 0xdc, 0x39, 0x14, 0x61, 0xd0, 0xb0, 0xf7, 0x1f, 0xa1, 0x5c, 0xd4, 0x24, 0xfc, 0x47, 0x5d, 0xe9, 0xcc, 0xc3, 0x6e, 0x6e, 0x5a, 0xfd, 0x4a, 0x73, 0xb9, 0xd5, 0x28, 0xeb, 0x61, 0xed, 0xee, 0xae, 0x1a, 0x00, 0x3c, 0x6e, 0x1c, 0x76, 0xac, 0xec, 0x74, 0x35, 0x58, 0x6b, 0xa9, 0xb9, 0x9d, 0x65, 0xa0, 0x67, 0x1f, 0x7e, 0xbd, 0x1e, 0x0d, 0xb6, 0x4b, 0x10, 0xa7, 0xe2, 0x1e, 0xd0, 0xfd, 0x5d, 0x76, 0xab, 0xf9, 0xfb, 0x27, 0x3c, 0x9f, 0x3e, 0xf7, 0x3b, 0x94, 0xcd, 0x48, 0x96, 0xdd, 0x21, 0xf7, 0xc3, 0xea, 0x82, 0x83, 0x54, 0xd3, 0x32, 0x72, 0xcc, 0xe1, 0xe8, 0xf0, 0xb1, 0x50, 0x7f, 0xba, 0xe2, 0x53, 0xf0, 0x3a, 0x2b, 0x59, 0x7e, 0xf3, 0x17, 0x8f, 0x30, 0x20, 0x05, 0xa6, 0x84, 0x98, 0x7e, 0xd6, 0x62, 0xf5, 0xc6, 0x23, 0x4f, 0xf5, 0xb1, 0xdf, 0xe3, 0x21, 0xb8, 0x70, 0x7d, 0xac, 0x4c, 0x53, 0x35, 0x9d, 0x6b, 0x61, 0x12, 0x31, 0x70, 0x51, 0x7e, 0x7a, 0x2f, 0x7f, 0xf6, 0x4d, 0x41, 0xeb, 0x06, 0x5b, 0x9d, 0x85, 0x75, 0x9e, 0x68, 0xa8, 0xbd, 0xf7, 0x0f, 0xe4, 0xbd, 0x15, 0x92, 0x00, 0xb2, 0x98, 0x23, 0x3f, 0x64, 0x76, 0xef, 0xe3, 0x9d, 0x9e, 0x3c, 0xf0, 0xdf, 0xdc, 0xb4, 0x32, 0x56, 0xfd, 0x00, 0x81, 0x0c, 0x33, 0x99, 0x44, 0x5c, 0xbb, 0xdb, 0x34, 0xa9, 0xbc, 0x5c, 0x63, 0x50, 0x73, 0x7b, 0x7c, 0xda, 0x8d, 0x3c, 0x4c, 0x77, 0xd4, 0x53, 0x81, 0xa8, 0x0e, 0x7e, 0xb2, 0x3b, 0x22, 0x18, 0xa0, 0x7c, 0x7d, 0xec, 0xbc, 0xaa, 0xb4, 0x47, 0xe9, 0xa8, 0x6b, 0x51, 0x82, 0xf5, 0x75, 0x9c, 0x9f, 0xde, 0x3d, 0xfe, 0x94, 0xf2, 0x64, 0x9c, 0xbb, 0xb7, 0xab, 0x48, 0x74, 0x9b, 0x14, 0x0d, 0x69, 0x2d, 0x44, 0x07, 0x17, 0x8d, 0x2c, 0x78, 0x8a, 0x21, 0xe8, 0x19, 0x67, 0x8a, 0xe7, 0xae, 0x30, 0xd7, 0x4d, 0xdd, 0xc4, 0xf8, 0x95, 0x40, 0x25, 0x75, 0x7b, 0xb9, 0x7e, 0x60, 0x19, 0x06, 0x65, 0x88, 0x50, 0x95, 0x5d, 0xef, 0x69, 0x99, 0x9f, 0x7e, 0xfc, 0x5d, 0x1a, 0xf8, 0x11, 0xd8, 0xb8, 0x2d, 0x86, 0x83, 0xe3, 0x70, 0xb1, 0x67, 0x48, 0x4a, 0x45, 0x7a, 0xda, 0x70, 0x7a, 0x2b, 0x1a, 0xf3, 0x68, 0x3c, 0x96, 0xb7, 0xb4, 0xd0, 0xb0, 0x26, 0x6f, 0xc5, 0xa1, 0x25, 0x3b, 0x43, 0xbe, 0x47, 0xb0, 0x95, 0xf9, 0x41, 0xfe, 0x38, 0xaa, 0x9f, 0xd3, 0x32, 0x90, 0xb5, 0x7f, 0xa5, 0x12, 0xd7, 0x56, 0xa4, 0xcb, 0xcd, 0x55, 0x45, 0x46, 0x81, 0x09, 0xf8, 0x06, 0xfb, 0xad, 0x17, 0xca, 0x8f, 0x93, 0xbe, 0x0f, 0x55, 0xc5, 0xdc, 0xd5, 0xda, 0xeb, 0x8a, 0xa6, 0x15, 0x6f, 0x9c, 0xd5, 0x9d, 0xe0, 0x76, 0x04, 0x19, 0x94, 0x22, 0xe8, 0xf7, 0x92, 0x9f, 0x51, 0x61, 0xae, 0x7b, 0x64, 0x6c, 0xf6, 0xa4, 0x2b, 0x93, 0x4d, 0x7b, 0x51, 0x65, 0x56, 0x2a, 0x26, 0x7a, 0x94, 0x37, 0xe9, 0xab, 0xcf, 0x5a, 0x47, 0x82, 0xb9, 0x8c, 0x1f, 0xf0, 0xd1, 0x61, 0x88, 0x3e, 0x88, 0x97, 0x15, 0x46, 0xa2, 0xef, 0x58, 0xe3, 0xe0, 0x3b, 0xa4, 0xa6, 0xdc, 0xb9, 0x17, 0xcb, 0x34, 0x9f, 0xd8, 0x6b, 0xea, 0xf7, 0x9e, 0xf3, 0x0b, 0xad, 0x72, 0xd4, 0x8f, 0xe7, 0xb5, 0x7c, 0x81, 0x94, 0x64, 0x86, 0x60, 0x48, 0x9b, 0x2d, 0xc4, 0x47, 0x58, 0x07, 0x44, 0xe0, 0x82, 0xf0, 0x98, 0xfc, 0x2a, 0x43, 0xfb, 0xf6, 0x10, 0x51, 0xd3, 0xad, 0x69, 0x0b, 0x94, 0xd8, 0xdf, 0x02, 0xe2, 0x9a, 0xda, 0x92, 0xf6, 0x57, 0xfe, 0x59, 0x42, 0xc5, 0xf5, 0xee, 0x58, 0x46, 0x6e, 0xd0, 0x08, 0x75, 0x65, 0x9d, 0xc8, 0xfe, 0xa5, 0x85, 0x5a, 0xb4, 0x8c, 0xfd, 0xa8, 0xdd, 0x0f, 0xb8, 0xf3, 0xd0, 0xfd, 0xd3, 0x2c, 0xc3, 0x88, 0x50, 0xa2, 0xde, 0x01, 0xc5, 0xde, 0x94, 0xe3, 0x55, 0xcb, 0x32, 0x13, 0xe0, 0x1b, 0xb8, 0x66, 0x77, 0xe5, 0xe9, 0x64, 0x13, 0x93, 0x9e, 0x4c, 0x86, 0xfb, 0x5f, 0x58, 0xb1, 0xcc, 0x34, 0x41, 0xf8, 0x2c, 0xb9, 0x06, 0xf3, 0x9f, 0x71, 0xea, 0x66, 0x2b, 0x5c, 0xbb, 0x74, 0xba, 0xcc, 0x5a, 0x0f, 0xbf, 0x74, 0x78, 0xb3, 0x1c, 0xc2, 0x9e, 0x54, 0x44, 0x6f, 0x70, 0x95, 0x9c, 0x54, 0x32, 0x3a, 0x28, 0x7f, 0x8b, 0xe0, 0x63, 0x86, 0x89, 0xeb, 0x6e, 0x1b, 0xe6, 0xc1, 0x6d, 0xe1, 0x8a, 0x36, 0x2f, 0x7e, 0x50, 0x46, 0x0d, 0xf2, 0x0d, 0x0a, 0x14, 0x27, 0xcf, 0xe5, 0x66, 0xc8, 0x62, 0xff, 0xdd, 0x57, 0x19, 0xf4, 0xf2, 0x7a, 0xca, 0xcd, 0xdd, 0x96, 0x1b, 0x2f, 0xfe, 0x9f, 0xfc, 0xd2, 0x7c, 0x2f, 0x75, 0x35, 0x2c, 0xd5, 0xa2, 0x90, 0xb4, 0xaf, 0xfc, 0x0b, 0xf0, 0x3b, 0xd9, 0x2d, 0x94, 0x6a, 0x37, 0x97, 0x13, 0xf6, 0xb5, 0xf2, 0xc0, 0xf6, 0xe2, 0x26, 0x33, 0xb0, 0xba, 0xcc, 0xef, 0xae, 0x6e, 0xe7, 0x42, 0x14, 0x64, 0xce, 0x6c, 0x30, 0x7f, 0x6d, 0x03, 0x53, 0xa0, 0xad, 0x95, 0xdf, 0x6d, 0x31, 0x90, 0xa2, 0x51, 0x43, 0x5f, 0x62, 0xc3, 0x0e, 0xd6, 0xb9, 0xcc, 0x0d, 0xd0, 0x24, 0xc3, 0xc3, 0x16, 0x56, 0x5c, 0xad, 0x83, 0xd2, 0xe1, 0x75, 0x66, 0xb8, 0xbe, 0x68, 0x28, 0xdf, 0x43, 0x2a, 0x2f, 0x25, 0xa6, 0xa8, 0x01, 0x03, 0x47, 0x4f, 0xad, 0x65, 0x38, 0x7c, 0x67, 0xb8, 0xfd, 0x33, 0x72, 0x44, 0x90, 0x13, 0x43, 0xbc, 0xa9, 0x89, 0xe3, 0x13, 0x3b, 0x45, 0x95, 0x92, 0x42, 0xea, 0xb9, 0x28, 0xbc, 0x0a, 0xf0, 0x01, 0xf5, 0x51, 0x81, 0x59, 0x08, 0x00, 0xfb, 0x93, 0xa3, 0x9d, 0x1c, 0x85, 0x0a, 0xe9, 0xf2, 0x17, 0x5f, 0x13, 0x40, 0x0c, 0x20, 0x2b, 0x23, 0x1f, 0xf1, 0xd9, 0xf5, 0x52, 0x9c, 0x4f, 0x72, 0x83, 0x56, 0x7c, 0x19, 0x40, 0x44, 0x83, 0xd5, 0xdc, 0x3d, 0x6b, 0xdd, 0xc2, 0xd2, 0x18, 0xd9, 0x0a, 0x8b, 0x7a, 0x46, 0x4a, 0x74, 0x04, 0x1b, 0xaf, 0xd8, 0x60, 0xad, 0x4c, 0x4d, 0x61, 0xd0, 0xb1, 0xf0, 0x39, 0x3f, 0xc0, 0xf2, 0xec, 0x3e, 0xbc, 0x54, 0x04, 0x7d, 0xa3, 0xee, 0x87, 0x40, 0xbe, 0xb6, 0x26, 0xbd, 0x76, 0x3f, 0xb7, 0xc5, 0x69, 0x80, 0xe5, 0xa7, 0xbd, 0xd7, 0x26, 0x52, 0xb4, 0x4e, 0xee, 0xb9, 0x81, 0x1c, 0x23, 0x7c, 0x5b, 0x6f, 0xd0, 0xc4, 0xcf, 0x68, 0x1d, 0x6e, 0x5a, 0x67, 0x7f, 0x6d, 0x37, 0x8a, 0x2c, 0x69, 0x76, 0x70, 0xd2, 0xac, 0x4e, 0x43, 0x88, 0x3f, 0xb4, 0xf5, 0x05, 0x50, 0x2c, 0xc9, 0x0f, 0xd7, 0xe0, 0x16, 0x37, 0x7a, 0xef, 0x48, 0xc4, 0xad, 0x07, 0x27, 0xed, 0x1d, 0x36, 0x5c, 0x4b, 0x4f, 0xfd, 0x30, 0x8d, 0x84, 0xa7, 0x98, 0x6e, 0xe1, 0xd8, 0x6f, 0xe4, 0xcc, 0x69, 0x02, 0x9a, 0x99, 0x73, 0xd1, 0xa1, 0x66, 0xaa, 0x94, 0x63, 0x43, 0xed, 0x7d, 0xd8, 0x97, 0x1b, 0xbd, 0xfc, 0xbf, 0x27, 0x49, 0x80, 0xf7, 0x6f, 0xde, 0xbf, 0x7e, 0x49, 0x42, 0xf5, 0xf5, 0xdf, 0xce, 0xab, 0x08, 0x3e, 0x29, 0x76, 0x51, 0xa9, 0x56, 0xe1, 0x79, 0x33, 0xf1, 0xa8, 0xa1, 0x8d, 0xb5, 0x27, 0x00, 0x1c, 0x42, 0x11, 0xcd, 0x4e, 0x1d, 0x65, 0x5f, 0x2f, 0xf9, 0x9e, 0x93, 0x37, 0x35, 0x2b, 0x6e, 0x66, 0xa5, 0x1e, 0x03, 0x94, 0x95, 0x28, 0x97, 0x02, 0x0b, 0xc5, 0x04, 0x34, 0x4d, 0xb4, 0x5b, 0x03, 0xa3, 0xaa, 0xcd, 0xee, 0x5e, 0x47, 0xcc, 0xb1, 0x19, 0x49, 0x6d, 0x19, 0x3f, 0x00, 0x11, 0x16, 0xce, 0x02, 0x44, 0x12, 0x5a, 0x1f, 0xe5, 0x81, 0x54, 0x97, 0x88, 0xb9, 0x8c, 0x8b, 0x18, 0x04, 0xf5, 0xb2, 0xc1, 0xf4, 0xa8, 0x4d, 0x0c, 0xf7, 0x2c, 0x5d, 0x4c, 0x2b, 0xf5, 0x13, 0x3a, 0x74, 0x2a, 0x88, 0xdc, 0xcb, 0xac, 0xae, 0xab, 0xd9, 0x53, 0x87, 0xf4, 0xc4, 0x7b, 0x94, 0x7f, 0x49, 0xbf, 0x91, 0x6f, 0x0b, 0x04, 0x5f, 0x69, 0x2a, 0xba, 0x42, 0xf8, 0x18, 0x5e, 0x4c, 0x30, 0xa8, 0x43, 0x19, 0x92, 0x68, 0x93, 0xbd, 0x30, 0x31, 0x90, 0xfb, 0x12, 0xfc, 0x20, 0xb8, 0xd7, 0xf7, 0x89, 0xae, 0x9f, 0xd9, 0x79, 0x65, 0x29, 0x72, 0x49, 0x5f, 0x39, 0x86, 0x82, 0x93, 0x3d, 0xdb, 0xa1, 0x1e, 0x2f, 0x91, 0x17, 0x34, 0xbd, 0xb2, 0x94, 0x5c, 0xa8, 0x0a, 0x85, 0xdd, 0x6a, 0x39, 0xdc, 0x73, 0x1b, 0x06, 0x0f, 0x47, 0x95, 0xf6, 0x63, 0x1e, 0xd7, 0x1e, 0x6a, 0xd1, 0xa7, 0x35, 0xca, 0xfd, 0x7c, 0xed, 0x41, 0xfb, 0x9a, 0x83, 0xe6, 0x13, 0x7f, 0x95, 0xb2, 0xec, 0x7e, 0x35, 0x3e, 0x47, 0xaa, 0x3b, 0xce, 0xed, 0xf5, 0xdf, 0x8f, 0xe6, 0x99, 0x87, 0x1d, 0xec, 0xb7, 0xdd, 0x48, 0x20, 0x3e, 0x25, 0x18, 0xfb, 0x0f, 0xce, 0x0f, 0x86, 0x5f, 0x46, 0xad, 0xce, 0x5c, 0x13, 0x3a, 0x92, 0x13, 0x20, 0xbf, 0x40, 0x91, 0x54, 0x56, 0x20, 0x48, 0x69, 0xa3, 0xce, 0xb5, 0xfc, 0xa3, 0xed, 0x40, 0xe0, 0xa4, 0x1a, 0x64, 0xb8, 0x95, 0x1f, 0x0f, 0xc5, 0x80, 0x69, 0x4c, 0xfc, 0x55, 0xbd, 0x1f, 0x5c, 0xe9, 0x26, 0xb0, 0x7e, 0x3e, 0x32, 0xac, 0x6e, 0x05, 0x5d, 0xe9, 0xb9, 0x61, 0xce, 0x49, 0xc7, 0xee, 0x41, 0xe0, 0x6b, 0x02, 0x45, 0x59, 0xb9, 0x33, 0xa7, 0x95, 0x18, 0x19, 0x2e, 0x96, 0x98, 0x55, 0x88, 0x9c, 0x85, 0xd1, 0x85, 0x8d, 0x3c, 0x4a, 0x83, 0x9a, 0x3d, 0x0c, 0x2a, 0x20, 0x82, 0xfd, 0x59, 0xcc, 0x0f, 0xdd, 0x5f, 0x03, 0xcb, 0xcc, 0x6f, 0x81, 0x8e, 0x0d, 0x4e, 0x40, 0x7b, 0x09, 0x4f, 0x9b, 0x90, 0x97, 0x81, 0xb3, 0x7b, 0x7a, 0x27, 0x12, 0xaf, 0x2b, 0x68, 0x8e, 0xb8, 0xda, 0x48, 0x70, 0xcb, 0xaf, 0xd7, 0xd6, 0xa2, 0x55, 0xa8, 0x56, 0x87, 0xb9, 0x85, 0xe4, 0xae, 0x0f, 0x61, 0xf6, 0xc7, 0x17, 0x8e, 0xe6, 0xd4, 0x9e, 0x31, 0x97, 0x38, 0x47, 0xf2, 0x5b, 0x11, 0x8b, 0xf8, 0x14, 0xc8, 0xff, 0x14, 0x9a, 0xe7, 0xd5, 0x3c, 0x5d, 0x2a, 0xa6, 0x3c, 0x4c, 0xd8, 0x6f, 0xa8, 0xf5, 0x53, 0xd9, 0x15, 0xed, 0xee, 0xbd, 0x88, 0x72, 0x00, 0xe7, 0x2f, 0x4f, 0x37, 0x1a, 0x4f, 0x00, 0x2e, 0x55, 0x7e, 0x17, 0x41, 0x55, 0x12, 0xde, 0xa0, 0x5b, 0xd9, 0x3e, 0xa2, 0x2f, 0x0b, 0xdf, 0x5c, 0x65, 0x7c, 0x91, 0x73, 0xdf, 0x16, 0xeb, 0x2e, 0x93, 0x87, 0x31, 0xcf, 0x8e, 0x37, 0x7b, 0x24, 0x39, 0x7d, 0x14, 0x59, 0xdc, 0x12, 0x21, 0x10, 0x60, 0xc6, 0x83, 0xb3, 0x59, 0x71, 0xfe, 0x09, 0x44, 0x2d, 0x9a, 0x08, 0x0c, 0xc2, 0x49, 0xeb, 0xd4, 0x62, 0xcb, 0x84, 0xf0, 0x97, 0xcf, 0xd2, 0x34, 0x79, 0x5b, 0xd6, 0x72, 0x24, 0x6d, 0xa3, 0x3e, 0x69, 0xe3, 0xb5, 0xf4, 0xc4, 0x98, 0x83, 0xfd, 0x8e, 0xd0, 0x57, 0x4d, 0x74, 0xd6, 0x5e, 0x30, 0x28, 0xe3, 0xfb, 0x47, 0x56, 0x42, 0x61, 0xcd, 0xda, 0xb2, 0x61, 0x1f, 0x30, 0x0c, 0x80, 0x7c, 0x2c, 0x25, 0x4d, 0x09, 0xeb, 0xf6, 0xf2, 0x18, 0x09, 0xfa, 0x08, 0xa9, 0x14, 0xd8, 0xb0, 0x31, 0x41, 0x42, 0xdf, 0x9b, 0x5e, 0x1d, 0xf9, 0x8d, 0x08, 0xe2, 0xa2, 0xec, 0x1e, 0x44, 0xd1, 0xa2, 0x76, 0x13, 0x25, 0x9f, 0xce, 0x60, 0x7d, 0x1d, 0x05, 0xe2, 0xc3, 0x29, 0x8b, 0x98, 0x08, 0x5f, 0x16, 0xb0, 0xd6, 0xf5, 0x96, 0xa8, 0xc1, 0xfb, 0x6c, 0xb3, 0x40, 0xe0, 0xd6, 0x5e, 0xbb, 0x39, 0xae, 0x73, 0xe5, 0xbe, 0x55, 0x1d, 0x4c, 0x95, 0xea, 0x4e, 0x2f, 0xd4, 0xbf, 0x5e, 0x8f, 0x41, 0x0d, 0xf5, 0x88, 0x5c, 0xe6, 0x2a, 0xe2, 0x9f, 0x6c, 0xec, 0xe4, 0x04, 0x41, 0xa1, 0x68, 0xc8, 0x3e, 0x0e, 0x35, 0x6e, 0x68, 0x77, 0x88, 0x08, 0x1f, 0x07, 0xf4, 0xb2, 0x99, 0x72, 0x6c, 0x5f, 0x8f, 0xd8, 0x9f, 0xd8, 0x36, 0xed, 0x84, 0x01, 0x71, 0x57, 0x35, 0x5e, 0x45, 0x57, 0x00, 0xd7, 0x8d, 0xac, 0xbb, 0xb8, 0xef, 0xb4, 0x59, 0xfc, 0x0e, 0xd5, 0xbb, 0xcb, 0x01, 0x1b, 0xc8, 0x41, 0x05, 0x22, 0xc0, 0x71, 0x6e, 0x37, 0xcd, 0xaa, 0xe4, 0xba, 0xdc, 0xf9, 0xcb, 0xc6, 0xaa, 0xee, 0x03, 0x15, 0x22, 0xa3, 0xd2, 0x1d, 0xe6, 0xfb, 0x1e, 0x7f, 0x2c, 0x28, 0xe0, 0xa2, 0xcb, 0x70, 0xd5, 0x9b, 0x95, 0x30, 0x77, 0x51, 0xe8, 0x21, 0x2b, 0xde, 0x80, 0xda, 0xbc, 0x38, 0x8f, 0x96, 0x08, 0x10, 0x10, 0x38, 0xf9, 0xfa, 0x58, 0x8c, 0xb7, 0xcf, 0xee, 0xd0, 0x1c, 0x4f, 0x9c, 0x73, 0x69, 0x0b, 0xc6, 0x1c, 0x37, 0x83, 0xfb, 0xee, 0xb0, 0x8b, 0xca, 0x0b, 0xfe, 0xf3, 0xd7, 0x56, 0x04, 0x66, 0x2e, 0x7e, 0x4c, 0x93, 0xd6, 0x38, 0x41, 0x8b, 0xaa, 0xcb, 0x9f, 0x6a, 0x64, 0xd2, 0x27, 0x3a, 0xfb, 0x3d, 0x97, 0x14, 0x2f, 0x9a, 0xd9, 0x88, 0x61, 0x93, 0x7b, 0x40, 0xa9, 0xb7, 0x5f, 0xdf, 0x23, 0x7d, 0xb4, 0x2f, 0x89, 0x85, 0x24, 0x7c, 0x07, 0x22, 0x4f, 0x3b, 0x4a, 0x16, 0x79, 0xf0, 0xdb, 0x9c, 0x7f, 0x4e, 0xab, 0xac, 0x10, 0x9f, 0xef, 0x7a, 0x19, 0x66, 0x2d, 0x40, 0x81, 0x43, 0x97, 0x3d, 0x17, 0x18, 0x99, 0xfd, 0xc9, 0x6a, 0xae, 0xdc, 0x16, 0x0a, 0x77, 0xc6, 0xc6, 0xf4, 0x0e, 0x40, 0xd8, 0x77, 0x98, 0xac, 0xbc, 0x96, 0x19, 0xc8, 0xc2, 0xaf, 0x8d, 0x79, 0xd3, 0x5a, 0x34, 0xc7, 0x5f, 0x94, 0x2d, 0x28, 0x96, 0x1d, 0x46, 0x01, 0xdb, 0x1e, 0x13, 0x6a, 0x75, 0x0f, 0x3d, 0x32, 0x88, 0xd8, 0x1d, 0x22, 0x44, 0x36, 0x89, 0x86, 0x5d, 0x61, 0xee, 0xea, 0xbb, 0xec, 0x9f, 0x22, 0x72, 0xec, 0x6d, 0x8d, 0xf4, 0x5c, 0x78, 0x9a, 0x86, 0xc0, 0x45, 0x8a, 0xf0, 0x09, 0x10, 0x78, 0x79, 0xb9, 0x63, 0x97, 0x12, 0x47, 0xe7, 0xbc, 0xd2, 0xc5, 0x7b, 0x1c, 0xa2, 0xc0, 0x83, 0x56, 0x3a, 0x68, 0x82, 0xb4, 0x4c, 0xf0, 0xec, 0xad, 0xfe, 0x38, 0x35, 0xaf, 0x9e, 0xaa, 0x2e, 0x1c, 0x91, 0x62, 0x91, 0x93, 0x8d, 0x91, 0xda, 0x70, 0x09, 0x23, 0x59, 0x96, 0xf1, 0x9f, 0x86, 0x6c, 0x9d, 0x4f, 0x94, 0x25, 0x04, 0xa2, 0x49, 0x45, 0x2d, 0xce, 0x0c, 0x60, 0xe7, 0xb9, 0x40, 0x25, 0xba, 0x1a, 0xd0, 0x9c, 0x1d, 0xdb, 0x0b, 0xac, 0xe9, 0xc3, 0xb3, 0xe0, 0x0e, 0x51, 0x50, 0x6b, 0x85, 0xeb, 0xca, 0x69, 0x86, 0x38, 0x37, 0x67, 0xfa, 0xca, 0xf2, 0x26, 0x33, 0x00, 0xed, 0x9c, 0xdb, 0x2a, 0x48, 0x3c, 0x2a, 0xef, 0x22, 0x77, 0x5c, 0xec, 0xaf, 0x83, 0x63, 0x9e, 0x8a, 0x5b, 0xd9, 0x82, 0x4d, 0x07, 0x38, 0x7a, 0x60, 0x1d, 0x4d, 0x73, 0x0e, 0x88, 0xea, 0x45, 0xde, 0x88, 0xdc, 0xda, 0x20, 0xfa, 0x1c, 0x93, 0xc6, 0xda, 0x4a, 0xe7, 0x75, 0x06, 0x56, 0x4e, 0xdc, 0x44, 0x81, 0x5d, 0x45, 0x87, 0x84, 0x32, 0x69, 0x6e, 0x0e, 0x12, 0x89, 0x0e, 0x74, 0x51, 0xba, 0xf1, 0xa4, 0x72, 0x81, 0x5e, 0x5c, 0x90, 0x9f, 0xdb, 0x99, 0xfd, 0x2e, 0xf1, 0x51, 0x28, 0xed, 0x2f, 0x64, 0xc4, 0xd9, 0x72, 0xd1, 0x26, 0xfd, 0x63, 0x25, 0xef, 0x8a, 0x40, 0x3a, 0xec, 0x2a, 0xe0, 0x1d, 0x3a, 0x92, 0xf1, 0x50, 0xae, 0x56, 0x85, 0x32, 0x73, 0x02, 0xcd, 0xbb, 0xf5, 0x66, 0x23, 0x6c, 0xfe, 0x31, 0x4e, 0x86, 0x1f, 0xc2, 0x02, 0x7b, 0x52, 0x3a, 0xa7, 0xa2, 0xdd, 0xd6, 0x5b, 0x2e, 0x7a, 0x7c, 0x3a, 0x61, 0xb4, 0x93, 0xdd, 0xfd, 0x94, 0x18, 0x20, 0xfc, 0x7d, 0xee, 0x29, 0x80, 0x55, 0x76, 0xa6, 0x0d, 0xe5, 0x60, 0x55, 0xf6, 0x83, 0xc1, 0xca, 0x15, 0xee, 0x65, 0x6d, 0xbf, 0x79, 0x66, 0xc2, 0xf7, 0x6c, 0xfd, 0xed, 0xe2, 0xa7, 0x99, 0x75, 0x7c, 0x88, 0x2e, 0x48, 0x88, 0x0f, 0xd0, 0xff, 0xcd, 0x40, 0x80, 0x64, 0x7f, 0xc9, 0x46, 0x31, 0xfc, 0xe5, 0x80, 0x1b, 0xb9, 0x80, 0x79, 0x0f, 0x7b, 0x9c, 0x3d, 0xbc, 0xca, 0xf3, 0xac, 0x51, 0xa2, 0xde, 0xce, 0x88, 0x6d, 0x75, 0x66, 0xe3, 0x2e, 0xf8, 0xca, 0x35, 0xff, 0x6e, 0xf1, 0x65, 0xbd, 0x8b, 0xce, 0x6f, 0x02, 0xd7, 0xdc, 0xab, 0x53, 0x0d, 0xfb, 0x52, 0x9b, 0xc1, 0x7a, 0x3e, 0xd8, 0x46, 0x75, 0xf1, 0x15, 0xcf, 0x61, 0xd9, 0x98, 0xd4, 0xe5, 0xd3, 0x5c, 0xb8, 0xeb, 0xed, 0xc2, 0xa8, 0xf8, 0x70, 0x83, 0xc6, 0xb8, 0x1e, 0xe9, 0x87, 0xde, 0xb8, 0x3f, 0x59, 0x2b, 0xc3, 0x86, 0x8a, 0xcb, 0x8c, 0x69, 0x65, 0xe8, 0x6a, 0x73, 0x9e, 0x7a, 0x43, 0x80, 0xf0, 0x5c, 0x51, 0x71, 0x04, 0xa5, 0x26, 0x24, 0x95, 0x35, 0xee, 0xa4, 0xd2, 0x8e, 0xf5, 0x9c, 0x03, 0xe6, 0x69, 0x12, 0x70, 0x7a, 0x60, 0x51, 0x7e, 0x24, 0x1c, 0x27, 0x1c, 0x30, 0x8e, 0x51, 0x5d, 0x6c, 0x1a, 0x34, 0x66, 0x7e, 0x9a, 0xce, 0x8b, 0x7a, 0xa5, 0xeb, 0xb5, 0xb4, 0x11, 0x9c, 0x07, 0xd3, 0xb6, 0xe5, 0xc1, 0x27, 0x75, 0xb6, 0x64, 0x3d, 0x7a, 0x1c, 0x17, 0xb0, 0xbd, 0xb9, 0x49, 0x41, 0xcf, 0x72, 0x98, 0x2a, 0xd3, 0x67, 0xf1, 0xb0, 0xca, 0x28, 0xf9 ],
+const [ 0x38, 0x32, 0x42, 0xc7, 0x09, 0xfe, 0x5f, 0x2c, 0xe7, 0x82, 0xbf, 0x8c, 0x83, 0xb6, 0x45, 0xd1, 0x71, 0xf2, 0xbd, 0x23, 0x8a, 0xbc, 0x65, 0x5d, 0x8f, 0xdf, 0xac, 0xbd, 0x0f, 0xbd, 0x39, 0xdf, 0x8a, 0xe5, 0x2f, 0xec, 0xd6, 0xe8, 0xb0, 0x0f, 0xc2, 0x69, 0xa0, 0x28, 0xfa, 0x74, 0xab, 0xc5, 0x2a, 0x11, 0x89, 0x4e, 0x66, 0x18, 0x80, 0x7f, 0xca, 0x46, 0x2b, 0x1b, 0x5d, 0x91, 0x7b, 0xdf, 0x3b, 0xb9, 0xfb, 0xb5, 0xf4, 0x20, 0x58, 0x2b, 0x2f, 0xdb, 0x20, 0x23, 0x93, 0x09, 0xca, 0xcc, 0xe7, 0x63, 0xf7, 0xd1, 0x77, 0x15, 0xf7, 0xd0, 0xba, 0xcd, 0x8f, 0x0d, 0x33, 0x11, 0xf9, 0x68, 0x95, 0xd5, 0x2d, 0x8c, 0x2a, 0x4d, 0x5f, 0x6a, 0x75, 0x00, 0xc9, 0xe6, 0x17, 0x1e, 0xaa, 0xcf, 0xef, 0x13, 0x8f, 0x15, 0x85, 0x5c, 0xd1, 0x36, 0xa9, 0x99, 0x5f, 0xfa, 0x57, 0xe4, 0xbd, 0x60, 0xde, 0x62, 0x4d, 0xd8, 0x41, 0x17, 0xce, 0xb2, 0xde, 0xff, 0x22, 0xd7, 0x4d, 0x5a, 0x54, 0xb7, 0x8b, 0x47, 0xd9, 0x82, 0x58, 0x94, 0x16, 0x9b, 0xdd, 0xd5, 0x23, 0x4a, 0x92, 0xb3, 0xcf, 0xb1, 0x5f, 0x87, 0xe4, 0x01, 0x02, 0x28, 0xac, 0xed, 0xb0, 0x00, 0xb3, 0x5f, 0xff, 0x66, 0xcf, 0x6a, 0x03, 0x28, 0x5e, 0x81, 0xb7, 0x66, 0xcf, 0xe6, 0x9f, 0xa7, 0x64, 0x64, 0xac, 0x26, 0x35, 0x41, 0x60, 0x6d, 0x79, 0x6f, 0x32, 0x25, 0x01, 0x02, 0x34, 0x2d, 0x05, 0xe7, 0xf3, 0xe9, 0x23, 0xd2, 0x9f, 0xdd, 0xa5, 0x78, 0x6c, 0x7a, 0x03, 0xff, 0x37, 0x37, 0xa8, 0xb2, 0x6d, 0xe4, 0xf9, 0xfa, 0x29, 0x3b, 0x94, 0x89, 0x9c, 0xb9, 0xd5, 0xd9, 0xb2, 0xac, 0x9f, 0xd5, 0xf2, 0x8c, 0x59, 0xd6, 0xa7, 0x8e, 0x36, 0xd0, 0x3d, 0x77, 0xba, 0xce, 0xed, 0xae, 0x7a, 0x9b, 0x9d, 0x96, 0x23, 0xc2, 0x01, 0x1a, 0xbd, 0xb9, 0x07, 0x8a, 0x31, 0x5a, 0x72, 0xa5, 0x09, 0x92, 0xc4, 0xf7, 0x78, 0x5d, 0x62, 0x65, 0x9a, 0xf2, 0xf3, 0x06, 0xfc, 0x3a, 0x09, 0x34, 0x5f, 0x87, 0x03, 0xe3, 0xb9, 0x83, 0x32, 0x32, 0x7d, 0x67, 0x3a, 0x40, 0x1c, 0x6d, 0xbb, 0x41, 0xcc, 0x87, 0x31, 0xd1, 0x88, 0x51, 0x19, 0x87, 0x58, 0x44, 0x56, 0xce, 0xd2, 0x2d, 0xd2, 0xf0, 0xe1, 0xde, 0x68, 0x74, 0xc5, 0x24, 0x02, 0xaa, 0x5b, 0xf9, 0xfe, 0x84, 0x9f, 0xfa, 0xd7, 0xa7, 0x6f, 0x1b, 0x01, 0xc2, 0x92, 0x99, 0x14, 0x1f, 0xf8, 0x30, 0x2d, 0x78, 0x43, 0x8f, 0x91, 0x0b, 0x87, 0x09, 0x94, 0xf0, 0x4e, 0x8d, 0xba, 0xab, 0xe0, 0xd8, 0x1b, 0xfe, 0xc1, 0xe9, 0x0c, 0x01, 0x7a, 0xb5, 0xfb, 0x74, 0x9c, 0x1d, 0x9b, 0x53, 0x03, 0x1d, 0x42, 0xab, 0x58, 0x46, 0x8f, 0xad, 0xd9, 0x6e, 0x4f, 0x00, 0x5d, 0xa6, 0xa1, 0x5c, 0x92, 0x6c, 0x59, 0x55, 0x8a, 0x22, 0xa3, 0x74, 0x76, 0xbf, 0xe9, 0x8c, 0xb1, 0xc5, 0xf6, 0x4b, 0x00, 0x73, 0x5b, 0x10, 0x18, 0x3b, 0x11, 0xfc, 0x60, 0x76, 0x61, 0x4c, 0xf9, 0x57, 0x01, 0xe6, 0xfc, 0x1d, 0x80, 0x31, 0x02, 0x8d, 0xe3, 0x2a, 0xea, 0xa0, 0x91, 0xb5, 0xd6, 0x79, 0x6c, 0x30, 0x77, 0x99, 0x41, 0x4e, 0x8b, 0x56, 0x62, 0x23, 0xa3, 0x89, 0x91, 0x7b, 0x2a, 0x88, 0x20, 0x70, 0xa3, 0x54, 0x57, 0x3c, 0x32, 0x13, 0x16, 0x4b, 0x5e, 0xc0, 0xbb, 0x95, 0x15, 0x21, 0x46, 0x2a, 0xf0, 0xf9, 0xbc, 0x0e, 0xb9, 0x80, 0xc9, 0x48, 0x2b, 0x10, 0xa8, 0x36, 0xf8, 0x21, 0x48, 0x23, 0x11, 0x77, 0xa7, 0x1b, 0x21, 0x9a, 0x82, 0xfe, 0x5a, 0x87, 0x31, 0xd4, 0x75, 0xa5, 0xcd, 0x60, 0xf4, 0xfa, 0x93, 0xf8, 0xab, 0x9f, 0x8d, 0x94, 0x7e, 0x71, 0x6f, 0x24, 0x6c, 0x0a, 0xbf, 0x27, 0xcd, 0xf0, 0x38, 0x79, 0xd7, 0x0b, 0x71, 0x6c, 0x67, 0x5d, 0xba, 0x1b, 0xff, 0xed, 0x46, 0xfb, 0x0a, 0x04, 0x90, 0xb3, 0x68, 0x9c, 0xf7, 0x2e, 0x26, 0x16, 0xab, 0xee, 0x8d, 0x2b, 0xcd, 0xa3, 0x5f, 0x25, 0xd2, 0xfc, 0x5d, 0x4f, 0x29, 0xbd, 0x0c, 0xaa, 0x1d, 0x12, 0xb9, 0xe1, 0xfc, 0x22, 0xbb, 0x7f, 0x79, 0xe8, 0xf8, 0x60, 0x4f, 0x3e, 0xab, 0x65, 0x27, 0x3b, 0x64, 0x6c, 0xbc, 0xbf, 0x50, 0x80, 0x3d, 0x4c, 0xba, 0x4c, 0xf3, 0x18, 0xd2, 0xd6, 0x23, 0x60, 0xad, 0x6a, 0x36, 0xfe, 0x8e, 0xd3, 0x17, 0x3e, 0x64, 0xd2, 0xdd, 0xee, 0x93, 0xc8, 0xaa, 0xb4, 0xf7, 0xb6, 0xd2, 0xa5, 0x26, 0x67, 0x40, 0x12, 0xf6, 0xec, 0x16, 0xa5, 0x40, 0x49, 0x94, 0xad, 0xe3, 0x6e, 0x3b, 0xb7, 0x0b, 0x69, 0x32, 0x5e, 0xb3, 0xd9, 0xe8, 0x64, 0x68, 0xa6, 0xfb, 0x01, 0x50, 0xef, 0x59, 0x7a, 0x6c, 0x44, 0xa5, 0xf6, 0x1a, 0x16, 0xdc, 0x8e, 0xde, 0x6b, 0x38, 0xa3, 0x61, 0xd6, 0x54, 0x74, 0xba, 0xa7, 0x92, 0xef, 0xed, 0x5f, 0xba, 0xc8, 0xb1, 0x67, 0xe3, 0xc9, 0x77, 0x01, 0x97, 0x69, 0xa7, 0x7e, 0x32, 0x9f, 0x2d, 0xb2, 0x8b, 0xf8, 0x34, 0xa5, 0xd6, 0xe8, 0x31, 0x8b, 0xc9, 0x5d, 0x24, 0xf6, 0xfe, 0x9a, 0x1b, 0x4b, 0x99, 0x43, 0xf7, 0x72, 0x2a, 0xb4, 0x72, 0xd2, 0xd5, 0x97, 0x61, 0x7d, 0xb0, 0xb6, 0x37, 0xa7, 0x6c, 0x0d, 0xcb, 0x5d, 0x38, 0x24, 0x5b, 0x74, 0xe2, 0x9c, 0xd0, 0xbf, 0x3f, 0x07, 0x43, 0x85, 0xce, 0xfd, 0xc1, 0x31, 0x98, 0x6c, 0x4b, 0x4c, 0x5a, 0x2f, 0x21, 0xa9, 0xe6, 0xe2, 0x41, 0xdf, 0xc7, 0xf5, 0x2a, 0xfc, 0x24, 0x00, 0xe5, 0x78, 0xe7, 0x56, 0x46, 0x68, 0x1d, 0xdd, 0x70, 0xf4, 0xa0, 0x1d, 0x97, 0x0b, 0xf4, 0x96, 0x0a, 0x56, 0x70, 0x57, 0x70, 0x6a, 0x9e, 0xcc, 0x51, 0x41, 0xe4, 0xd8, 0xd9, 0xeb, 0x63, 0x23, 0xd9, 0x81, 0x1f, 0xb6, 0x0f, 0x5b, 0x60, 0xc5, 0xa7, 0x82, 0x59, 0xcb, 0x01, 0x68, 0x08, 0xdd, 0xb5, 0xd7, 0x5d, 0x37, 0xd5, 0x28, 0x9e, 0x1c, 0x72, 0xb5, 0x0a, 0xdd, 0x61, 0x91, 0xbd, 0x37, 0x3e, 0x76, 0xd3, 0xe1, 0xb2, 0xfe, 0xd0, 0x66, 0xf2, 0x16, 0x40, 0x31, 0x88, 0xb0, 0x9a, 0xe6, 0x56, 0xb9, 0x6a, 0xf9, 0xd8, 0x4b, 0xaf, 0x79, 0xa9, 0x23, 0x82, 0x2c, 0x49, 0x55, 0xf9, 0xe1, 0x1d, 0x3e, 0x4b, 0x02, 0xb7, 0xbb, 0x35, 0x69, 0x58, 0x98, 0x9c, 0x74, 0xb3, 0x4c, 0x73, 0x5c, 0xf4, 0xe3, 0xdf, 0xc2, 0x01, 0x3b, 0x99, 0x8b, 0x00, 0x73, 0x95, 0xee, 0x19, 0xa1, 0xe1, 0xcb, 0x7d, 0xc3, 0xcf, 0x3f, 0xa7, 0xf9, 0x56, 0x75, 0xe2, 0xf1, 0xb6, 0xbf, 0x0b, 0xa2, 0x5b, 0xe5, 0x98, 0x3d, 0x04, 0xbd, 0xd9, 0x60, 0x24, 0xfb, 0x7e, 0x8d, 0x88, 0x4b, 0x5a, 0xdc, 0x3b, 0x9d, 0x66, 0xec, 0xa7, 0xc0, 0x09, 0x1f, 0xfc, 0x33, 0x96, 0x07, 0xd6, 0x38, 0x17, 0x1b, 0x1a, 0x29, 0x49, 0xaf, 0x20, 0x0f, 0xe7, 0x23, 0x18, 0x71, 0x2b, 0x5a, 0xa6, 0x6a, 0x93, 0x6d, 0xd0, 0xfe, 0xe1, 0xa1, 0x1a, 0xae, 0x65, 0x97, 0xef, 0x4a, 0x7e, 0xc3, 0x43, 0x07, 0x5f, 0x1f, 0x77, 0xd2, 0x0f, 0x21, 0x7d, 0xe3, 0xb3, 0xea, 0x3c, 0x94, 0x10, 0xc0, 0x36, 0x74, 0x4c, 0xbe, 0x68, 0x97, 0xf4, 0xca, 0x71, 0x31, 0x44, 0xc8, 0xf7, 0x63, 0xa2, 0x0d, 0x47, 0x55, 0x6b, 0x17, 0x3b, 0x85, 0xf2, 0x7b, 0x61, 0x5f, 0xc6, 0x1e, 0x59, 0x0d, 0x34, 0xa8, 0x7f, 0x90, 0x0d, 0x36, 0xcb, 0x10, 0xaa, 0x50, 0xf5, 0x70, 0x2c, 0x1a, 0xdc, 0x26, 0x08, 0xce, 0x28, 0x4a, 0xc4, 0x69, 0x2e, 0xec, 0xfb, 0xa5, 0x15, 0xab, 0xa7, 0x28, 0x37, 0x83, 0xa0, 0xfb, 0xca, 0xe7, 0x5f, 0x3d, 0xc0, 0x10, 0x08, 0x19, 0xeb, 0x94, 0xa8, 0xf5, 0x65, 0x3a, 0xba, 0xec, 0x2f, 0x0d, 0xf1, 0x7f, 0x18, 0xaf, 0x31, 0x87, 0xe1, 0xf0, 0xde, 0x6e, 0x9e, 0x9f, 0x5a, 0x9f, 0x5f, 0xa1, 0xc9, 0x3b, 0x10, 0x3f, 0x18, 0x0e, 0x9e, 0xc4, 0x3d, 0xc1, 0x5c, 0x48, 0xc0, 0x51, 0xa4, 0xc7, 0x7a, 0xc0, 0xc1, 0x76, 0x9d, 0x0a, 0x0c, 0x56, 0xf4, 0x5a, 0x56, 0x09, 0x6c, 0x7e, 0x86, 0xe5, 0xd4, 0x98, 0x83, 0x47, 0xe1, 0x17, 0x55, 0x29, 0x75, 0xe6, 0x87, 0xf7, 0x20, 0xe3, 0xcf, 0x9f, 0xe8, 0x93, 0xf1, 0xe8, 0x45, 0x14, 0xe0, 0x04, 0x70, 0x53, 0x26, 0x68, 0xdd, 0x7f, 0x87, 0xdb, 0x06, 0xbd, 0xe1, 0xcd, 0x6b, 0x1d, 0x57, 0xeb, 0xd7, 0xcc, 0xae, 0xf0, 0xe4, 0x8c, 0xf7, 0xbe, 0xc1, 0x62, 0x6f, 0xad, 0x33, 0x8e, 0xa3, 0x23, 0xda, 0xc0, 0xd8, 0x65, 0xb6, 0x89, 0xa9, 0xac, 0xea, 0x10, 0xf2, 0x7c, 0xbf, 0x06, 0xed, 0x31, 0xeb, 0xdc, 0x9b, 0xdb, 0x14, 0x33, 0x66, 0x4b, 0x90, 0x94, 0x04, 0x6e, 0x6f, 0x61, 0x9e, 0xda, 0xbb, 0x0b, 0x32, 0xa7, 0xfe, 0x86, 0x36, 0x80, 0x05, 0xfa, 0x7e, 0xf9, 0xe4, 0xbc, 0x5f, 0x23, 0x3a, 0x7c, 0x15, 0x5f, 0xb6, 0xc0, 0x62, 0x6f, 0xda, 0x91, 0x78, 0xd3, 0xff, 0x73, 0x19, 0x52, 0x9a, 0x9b, 0xfd, 0xd7, 0xbd, 0x5d, 0x74, 0x7e, 0xe1, 0xe4, 0x4c, 0xef, 0xe2, 0x25, 0xf5, 0xeb, 0x4b, 0x15, 0xe3, 0x24, 0xd4, 0x1a, 0x34, 0x52, 0x29, 0xc0, 0x93, 0x83, 0xed, 0xae, 0x5c, 0xb2, 0xff, 0xd8, 0x00, 0x9c, 0xfc, 0xf6, 0xac, 0xcf, 0x05, 0x34, 0x25, 0x04, 0xc2, 0x2b, 0xf7, 0xae, 0xa6, 0x10, 0xce, 0xd3, 0x75, 0x2b, 0x24, 0x1b, 0x04, 0x8b, 0x1c, 0x27, 0x41, 0xf9, 0xae, 0x23, 0x72, 0x2a, 0x05, 0x9f, 0xc2, 0x39, 0x25, 0x9a, 0xf9, 0x54, 0xd1, 0xe0, 0x8b, 0xb5, 0xac, 0x97, 0xd4, 0xd3, 0x9e, 0x14, 0xa2, 0xda, 0x79, 0xf3, 0xf4, 0x59, 0xdd, 0x66, 0x01, 0x3b, 0x59, 0xcd, 0x7c, 0xf9, 0xd2, 0x87, 0x17, 0x0e, 0x29, 0x08, 0x46, 0xaa, 0x18, 0x2c, 0x45, 0xaa, 0x5d, 0xcb, 0x5c, 0xc8, 0x1b, 0x8e, 0x62, 0x0f, 0x7d, 0x01, 0x80, 0x93, 0x9c, 0xe9, 0x37, 0x5e, 0xa3, 0xd7, 0xa4, 0xad, 0x31, 0xfd, 0x03, 0x5d, 0xfe, 0x41, 0x73, 0xa0, 0xc2, 0x90, 0xf8, 0xf4, 0x52, 0x75, 0xc6, 0x56, 0x0c, 0xea, 0xbd, 0xb2, 0x76, 0x6e, 0x30, 0x9f, 0x22, 0x57, 0xea, 0x49, 0xd5, 0x6a, 0x73, 0xae, 0xe7, 0xa9, 0x8f, 0x0e, 0xed, 0x6c, 0x08, 0x9c, 0x96, 0xb3, 0xad, 0x7a, 0xd3, 0xbb, 0x9b, 0xe4, 0x3b, 0xcf, 0xbb, 0xac, 0xad, 0x61, 0x8c, 0xe6, 0x37, 0x59, 0x23, 0xe4, 0x36, 0xad, 0x70, 0x65, 0xbf, 0x32, 0xc2, 0x09, 0x3e, 0xb2, 0x8d, 0x08, 0x5d, 0x3e, 0x6c, 0x24, 0x28, 0xc5, 0x62, 0xdc, 0x6e, 0xe6, 0x65, 0xe3, 0x6a, 0x03, 0x1d, 0xd0, 0xa2, 0x97, 0xe9, 0x17, 0x10, 0xc9, 0x23, 0x38, 0x80, 0x41, 0xa5, 0x36, 0x39, 0x3a, 0x8b, 0x4b, 0xdf, 0xd8, 0x3b, 0xda, 0x98, 0xbc, 0xa3, 0xa5, 0x6e, 0xd7, 0xc2, 0x40, 0xf5, 0x7b, 0x6a, 0xc6, 0x2d, 0xb8, 0x44, 0xca, 0xa9, 0xe5, 0x14, 0x90, 0xf1, 0x7d, 0x3e, 0x7d, 0x26, 0x2d, 0x8a, 0xcd, 0xe4, 0x2a, 0x24, 0x84, 0x6c, 0xc8, 0xe7, 0xa7, 0x03, 0x49, 0xda, 0xab, 0x95, 0xf2, 0xfb, 0x2e, 0x9e, 0x65, 0x3c, 0xe5, 0x4b, 0x2a, 0xcc, 0xd6, 0xdc, 0x8f, 0x97, 0xc7, 0x4c, 0xb2, 0x10, 0xf6, 0x34, 0xdc, 0x2e, 0x0a, 0xed, 0x10, 0xb4, 0x4a, 0xf4, 0xe4, 0xb6, 0x0d, 0x93, 0x90, 0x59, 0x71, 0xbe, 0x45, 0xda, 0x50, 0x3c, 0xc0, 0xd2, 0x70, 0x07, 0x1e, 0xb8, 0xfa, 0xf4, 0xf2, 0xa7, 0x2e, 0x96, 0x95, 0x61, 0x54, 0x60, 0xbd, 0x95, 0xf6, 0x0b, 0x51, 0x5d, 0x4c, 0x37, 0x7c, 0x0b, 0xf8, 0x55, 0x01, 0x25, 0xf4, 0xc4, 0xce, 0xae, 0xc8, 0x3a, 0xd3, 0xa7, 0x00, 0x66, 0x14, 0xd6, 0xdd, 0xd4, 0xfd, 0xc6, 0x4b, 0x10, 0xf6, 0x0f, 0x13, 0x0e, 0x38, 0xd7, 0x52, 0xc9, 0xdf, 0x99, 0x2a, 0x2b, 0x40, 0x26, 0xb7, 0x2d, 0x7c, 0xe9, 0x44, 0x3f, 0x56, 0x6e, 0xbf, 0xea, 0x41, 0x26, 0x6b, 0xb4, 0xbd, 0x64, 0xd5, 0x44, 0xe4, 0xac, 0x09, 0xc6, 0x40, 0x2d, 0x05, 0x91, 0xe0, 0x8c, 0x6e, 0x07, 0xab, 0xe3, 0x82, 0xbd, 0xf4, 0x0a, 0x4e, 0xdd, 0x4e, 0x15, 0x21, 0xc8, 0xa1, 0x1d, 0x40, 0xff, 0x7d, 0x44, 0xdb, 0x43, 0xaf, 0xf3, 0x40, 0xfb, 0x12, 0x66, 0x4f, 0xd7, 0xa8, 0x6b, 0x2e, 0xb3, 0xe9, 0x66, 0x3e, 0xbe, 0x5b, 0x99, 0x4d, 0xdb, 0x63, 0xa2, 0x0d, 0x47, 0x5b, 0x45, 0xc4, 0x7c, 0xe4, 0x6c, 0x46, 0x56, 0x7e, 0x6c, 0x21, 0x75, 0x56, 0x8a, 0x17, 0xe2, 0x5e, 0xbe, 0xd1, 0xf5, 0xa3, 0xb7, 0xd1, 0x76, 0xdc, 0x1e, 0xa9, 0x02, 0x3e, 0x1f, 0x6a, 0xb0, 0x98, 0x26, 0x60, 0xf5, 0x9b, 0xe6, 0xfc, 0xc5, 0x79, 0xa0, 0x12, 0xfb, 0xb3, 0xa2, 0x45, 0xfb, 0x2b, 0x0e, 0xbf, 0x96, 0x81, 0xdc, 0x25, 0x2e, 0x9c, 0x22, 0xc9, 0x1a, 0x87, 0x93, 0x22, 0x4b, 0x7f, 0x46, 0x7a, 0x30, 0x4a, 0xba, 0xe7, 0xd8, 0xca, 0x16, 0x7c, 0x57, 0xd1, 0xb5, 0xc0, 0x6a, 0x37, 0xe1, 0x5f, 0x5e, 0x2a, 0xdf, 0x20, 0x2d, 0xc6, 0x2d, 0x17, 0xeb, 0xe5, 0x07, 0x1c, 0x60, 0x39, 0x2f, 0x7c, 0xf7, 0x98, 0xee, 0xee, 0xd7, 0x96, 0x56, 0xc8, 0x4f, 0x59, 0xcb, 0x72, 0x77, 0xa9, 0xc2, 0x1b, 0x14, 0x47, 0xc7, 0xac, 0xbd, 0x80, 0xc5, 0xfa, 0x3c, 0x01, 0x82, 0x40, 0x37, 0xed, 0x69, 0xcc, 0x10, 0x2d, 0x8c, 0xf8, 0x09, 0x08, 0xe9, 0x5c, 0xac, 0xf3, 0xec, 0x42, 0x6a, 0xaa, 0x36, 0x5a, 0x82, 0x7f, 0x9d, 0xb0, 0x24, 0xf2, 0x74, 0xda, 0xd6, 0x83, 0x0c, 0x76, 0x18, 0xc4, 0x7a, 0xd4, 0x43, 0xb2, 0x9b, 0xef, 0xb7, 0x45, 0x56, 0xa2, 0x35, 0x46, 0x21, 0x18, 0x8a, 0x61, 0xc7, 0x85, 0x6e, 0x7b, 0x68, 0x13, 0xab, 0x46, 0xc1, 0x20, 0x82, 0x12, 0xad, 0xa6, 0x4a, 0xe6, 0xec, 0xfa, 0x5a, 0xcf, 0x24, 0xba, 0x29, 0x78, 0x25, 0x00, 0xb4, 0xfb, 0x71, 0xdc, 0x20, 0xf7, 0xfc, 0x02, 0xa1, 0xe3, 0x30, 0xbf, 0x9a, 0xa1, 0x34, 0x32, 0x06, 0x56, 0x6e, 0xb8, 0x16, 0x7a, 0x47, 0xa8, 0x1b, 0x2b, 0x2e, 0x41, 0xa7, 0xc7, 0xdf, 0xe0, 0xef, 0xb9, 0xe5, 0x76, 0x74, 0x93, 0x5d, 0x3a, 0xe3, 0x5e, 0xfe, 0x9b, 0x39, 0x2d, 0x56, 0x79, 0x2a, 0xf9, 0x56, 0x94, 0xc4, 0xa8, 0x11, 0x45, 0x50, 0x6f, 0xc1, 0x6c, 0x79, 0x5a, 0x0b, 0xa9, 0xb0, 0x29, 0x84, 0xcf, 0xce, 0x5e, 0x73, 0x95, 0xfb, 0x94, 0xd9, 0x8f, 0xcf, 0x12, 0xae, 0x5d, 0xb8, 0xa0, 0x6e, 0x23, 0x9c, 0x9a, 0xd4, 0x39, 0xbf, 0x42, 0xe5, 0x23, 0xe6, 0x5a, 0x31, 0xc3, 0xbd, 0xf3, 0x56, 0xcd, 0x76, 0x80, 0xc5, 0x7c, 0xb3, 0x2e, 0xc9, 0x83, 0xa6, 0x78, 0xc5, 0x47, 0x76, 0xf5, 0xbd, 0x4b, 0xe5, 0x75, 0x17, 0xeb, 0x31, 0x4d, 0xa3, 0x4e, 0x37, 0xef, 0xda, 0x96, 0xde, 0xbe, 0x63, 0x59, 0xb3, 0x20, 0xdc, 0x55, 0xd1, 0xd4, 0xd6, 0x5f, 0x04, 0x86, 0x21, 0x9d, 0x2e, 0xa0, 0x4b, 0xf5, 0xe9, 0x64, 0x63, 0xc5, 0x6d, 0x38, 0x02, 0xd5, 0xb5, 0x40, 0x8d, 0x8a, 0xdd, 0x32, 0xb4, 0x5c, 0xcf, 0x66, 0x3e, 0x89, 0x1e, 0x2d, 0x09, 0x0b, 0x32, 0x64, 0x4c, 0xc8, 0xa6, 0x49, 0x20, 0x0a, 0xee, 0x8d, 0x3f, 0x2e, 0x3d, 0xaa, 0x0b, 0xa0, 0xa5, 0x76, 0xd2, 0x07, 0x81, 0xf8, 0x50, 0xbc, 0x10, 0x7b, 0x75, 0x81, 0x62, 0xe2, 0x69, 0x70, 0x78, 0x3b, 0xce, 0x31, 0xa7, 0x97, 0x45, 0x70, 0x3d, 0x18, 0x33, 0x8e, 0x67, 0x4b, 0xc5, 0x97, 0x52, 0xb8, 0x31, 0x75, 0x91, 0xb8, 0x3f, 0x63, 0xbf, 0x87, 0x09, 0xa4, 0x65, 0x9a, 0xfe, 0x74, 0x1d, 0x33, 0x2d, 0x3f, 0xf8, 0x32, 0xc1, 0x11, 0x1e, 0x2e, 0xc7, 0x4e, 0xb4, 0xc4, 0x38, 0xa3, 0x03, 0x2f, 0x33, 0x3c, 0xd6, 0x19, 0x8a, 0x37, 0x23, 0xb1, 0x80, 0x59, 0xee, 0xfe, 0xd1, 0x00, 0x6b, 0x73, 0xf3, 0x59, 0x63, 0xc3, 0x9c, 0xd3, 0xd8, 0xf7, 0x84, 0xd4, 0xec, 0xbd, 0x6c, 0xaa, 0xff, 0x03, 0x5f, 0xc4, 0x18, 0xc4, 0x38, 0x22, 0x86, 0x22, 0x64, 0x0a, 0xc7, 0xb6, 0xe9, 0xfd, 0xa8, 0x24, 0xa7, 0xe9, 0xae, 0xf2, 0xde, 0xa0, 0xb5, 0x9a, 0xf1, 0x89, 0xd7, 0xdd, 0x6a, 0x95, 0x8f, 0x5b, 0x3d, 0x75, 0x1e, 0x61, 0x51, 0x0b, 0x2e, 0x02, 0x3c, 0x1e, 0xb6, 0x69, 0x4f, 0x51, 0x1d, 0x6d, 0xd2, 0x56, 0xa2, 0x66, 0x90, 0x5f, 0xfb, 0x3f, 0x97, 0xd5, 0x3c, 0xcd, 0x39, 0x4d, 0xfb, 0x5f, 0x56, 0xb8, 0xb2, 0x97, 0xde, 0xd9, 0x64, 0x78, 0x91, 0xfd, 0x84, 0xbf, 0x09, 0xe6, 0x12, 0x77, 0xfb, 0x08, 0x07, 0xc8, 0xba, 0xf8, 0xf3, 0x10, 0xfc, 0x21, 0xe5, 0x35, 0xe1, 0xb9, 0x8b, 0x39, 0x31, 0xf3, 0x9a, 0x0e, 0xe5, 0x76, 0x70, 0xac, 0xea, 0x0f, 0xf9, 0x62, 0x21, 0xa2, 0xcf, 0x69, 0xaa, 0x67, 0xa5, 0xbf, 0x62, 0x52, 0xe5, 0x32, 0xaa, 0xd3, 0x98, 0xbb, 0x6b, 0xc0, 0x87, 0x0e, 0x57, 0x90, 0x9f, 0x6f, 0x71, 0xc9, 0x9a, 0xc7, 0xcf, 0xbb, 0xdc, 0xf7, 0x9e, 0x6f, 0x9b, 0x6c, 0x68, 0xdb, 0x43, 0xf4, 0x92, 0x57, 0x19, 0xd0, 0x29, 0x55, 0x1e, 0x0a, 0xde, 0x4c, 0x36, 0x09, 0x4e, 0xf5, 0x89, 0x62, 0x87, 0xba, 0x2a, 0xf1, 0xc8, 0x6c, 0xf7, 0x29, 0x89, 0x34, 0xc0, 0xa8, 0xbb, 0xcc, 0xab, 0x0e, 0x51, 0xee, 0xd6, 0x10, 0xff, 0x0d, 0x3f, 0xc8, 0x42, 0x44, 0xe1, 0x4f, 0xa0, 0x8c, 0x20, 0x8e, 0x31, 0x31, 0x67, 0x51, 0x5e, 0x87, 0x10, 0x9d, 0xe9, 0xd9, 0x84, 0x44, 0x2e, 0xa2, 0xa3, 0xb6, 0xa8, 0xff, 0x66, 0x1a, 0xb6, 0x65, 0xc2, 0x9e, 0x9f, 0x8f, 0xd0, 0x0b, 0xd4, 0xbb, 0x2c, 0x9c, 0x76, 0x16, 0x9b, 0x10, 0x18, 0x75, 0xf0, 0xfe, 0xc6, 0x45, 0x30, 0x69, 0x46, 0xc5, 0xf4, 0x94, 0x9d, 0x73, 0x0f, 0x17, 0xd6, 0xc3, 0x71, 0x33, 0xfe, 0x17, 0x4b, 0x63, 0x73, 0xec, 0x74, 0x33, 0x5f, 0x51, 0x0c, 0x55, 0x7f, 0x9e, 0x5f, 0xf2, 0x29, 0x62, 0x0b, 0x3e, 0x8d, 0x9d, 0x66, 0x4f, 0x3b, 0x30, 0x1a, 0x2f, 0xe5, 0x91, 0x12, 0x30, 0x66, 0xc3, 0x9a, 0x7f, 0x04, 0x86, 0xc1, 0xfc, 0xf2, 0xcb, 0x02, 0x49, 0x19, 0x6a, 0x24, 0x21, 0x19, 0x17, 0x5f, 0xec, 0x8a, 0x93, 0xc0, 0x90, 0x87, 0x1f, 0xcf, 0x89, 0x6d, 0x36, 0x6e, 0x3c, 0xe0, 0x7b, 0x04, 0x88, 0x0f, 0xf1, 0xdb, 0x9f, 0x39, 0x6a, 0xc7, 0x14, 0x71, 0x42, 0x09, 0x35, 0x9e, 0x4c, 0x72, 0x9a, 0xc5, 0x0d, 0xcc, 0xfe, 0x8b, 0x28, 0x75, 0x4e, 0xf5, 0x1a, 0x4d, 0x00, 0x73, 0x27, 0xd2, 0xa6, 0x1d, 0x94, 0x8a, 0xc3, 0x3c, 0x17, 0xa2, 0xdd, 0x0c, 0x8c, 0xd4, 0xd3, 0xc0, 0xe9, 0x8e, 0x71, 0xc7, 0x74, 0x50, 0x42, 0x4e, 0x34, 0x55, 0xa5, 0x06, 0xa5, 0x77, 0x23, 0x27, 0xb0, 0x4d, 0x00, 0xb5, 0xd9, 0x96, 0x10, 0x02, 0xbb, 0xda, 0xcc, 0x74, 0xb1, 0x4e, 0xa5, 0x88, 0xd7, 0xf9, 0x99, 0x17, 0x31, 0x15, 0x03, 0xd8, 0x29, 0xb8, 0xb7, 0x27, 0x3f, 0xb3, 0x4e, 0x04, 0xfc, 0xba, 0xbf, 0x5f, 0x27, 0xc6, 0x30, 0x93, 0x3c, 0xb8, 0x0b, 0x30, 0x1a, 0x3f, 0x53, 0xfd, 0xfc, 0xfb, 0x39, 0x3d, 0xaa, 0xe3, 0xea, 0x32, 0xf1, 0xe4, 0xac, 0xe0, 0x50, 0xca, 0x29, 0x13, 0xf4, 0x64, 0x0a, 0xa3, 0xe7, 0xe3, 0xc8, 0xf7, 0x84, 0x84, 0xbf, 0xc8, 0x2e, 0x6f, 0x85, 0x27, 0x41, 0xde, 0x79, 0xc2, 0x49, 0x81, 0x9f, 0x63, 0x72, 0x22, 0xab, 0xb9, 0x40, 0x85, 0x5b, 0x5b, 0x80, 0x92, 0x0a, 0x0a, 0x7f, 0xb5, 0x83, 0x36, 0x79, 0x86, 0x13, 0xc4, 0x54, 0xa5, 0xe2, 0x0f, 0x8e, 0xe8, 0x82, 0x2d, 0x75, 0xb9, 0xc9, 0x73, 0x96, 0xb9, 0xdc, 0x3b, 0x77, 0xaa, 0x8d, 0xe4, 0x89, 0x8b, 0xe7, 0x1b, 0x58, 0x04, 0x06, 0x59, 0x05, 0x05, 0x2d, 0xad, 0xf6, 0xab, 0x12, 0xbc, 0xcc, 0x63, 0x7c, 0x06, 0x95, 0x51, 0x10, 0x6b, 0x43, 0xf3, 0x68, 0xed, 0x5e, 0x01, 0x66, 0xb7, 0xf5, 0x98, 0xc8, 0x5f, 0xda, 0x98, 0xfc, 0x68, 0x0f, 0x4b, 0x35, 0x0b, 0x7b, 0x47, 0xbe, 0x36, 0xe1, 0x95, 0x8f, 0xd6, 0x13, 0x12, 0x1e, 0x52, 0x63, 0x16, 0x77, 0x57, 0x5b, 0x54, 0x8f, 0xdb, 0xae, 0x01, 0xd5, 0x5c, 0x6d, 0x39, 0x0b, 0x69, 0x7e, 0x9e, 0x54, 0x64, 0x4b, 0x42, 0x8e, 0x86, 0xb7, 0xc7, 0xe1, 0x23, 0x56, 0xc4, 0x98, 0x30, 0xdd, 0x6b, 0x30, 0x02, 0xd7, 0x69, 0xaf, 0x58, 0x9a, 0x0e, 0x38, 0x9c, 0x7a, 0xae, 0xdb, 0x66, 0x3c, 0x47, 0xb1, 0x42, 0xce, 0x63, 0x29, 0xb3, 0x35, 0x40, 0x9d, 0x78, 0xc6, 0x2f, 0x29, 0x0d, 0x99, 0x3a, 0xbc, 0x75, 0x3b, 0x09, 0x6f, 0x37, 0xa3, 0x07, 0x16, 0xa7, 0x67, 0xc0, 0x15, 0x66, 0x30, 0x8d, 0x76, 0x2c, 0x6c, 0x74, 0x38, 0xc5, 0x42, 0x4a, 0xe9, 0x5a, 0xcb, 0x1a, 0x77, 0xf2, 0x7f, 0xcb, 0x43, 0x38, 0xed, 0xfc, 0x77, 0x7f, 0xb0, 0x33, 0x9a, 0x03, 0x9e, 0x37, 0x61, 0x72, 0x42, 0xba, 0xc8, 0xab, 0x8d, 0x3b, 0x62, 0xc5, 0xc8, 0x2b, 0xed, 0x53, 0xcd, 0x4f, 0x2a, 0xe6, 0x77, 0x65, 0xec, 0xd4, 0x57, 0x0a, 0x6e, 0x38, 0xa8, 0xdb, 0xe9, 0x3a, 0x85, 0xdb, 0x66, 0x91, 0x5a, 0x15, 0xd1, 0x46, 0x99, 0x82, 0x50, 0xba, 0xae, 0x2c, 0xd3, 0xea, 0x34, 0x94, 0xeb, 0xf2, 0x69, 0x51, 0xdf, 0xd0, 0xdf, 0xfb, 0xfd, 0x6b, 0x75, 0x47, 0x2e, 0xd4, 0x86, 0x73, 0xcd, 0xcb, 0x60, 0xe5, 0xb9, 0x85, 0xf8, 0x0f, 0xa9, 0xac, 0xdc, 0x95, 0xc0, 0xa8, 0x68, 0xb2, 0x62, 0x1d, 0x3d, 0xd8, 0x45, 0xb4, 0xef, 0x96, 0xcb, 0x1f, 0xfe, 0xbf, 0x8f, 0x57, 0x08, 0xc9, 0x3d, 0x28, 0x3c, 0x73, 0xa8, 0xf0, 0x12, 0xaa, 0x16, 0xa4, 0x39, 0xae, 0xde, 0x13, 0xd1, 0x71, 0x36, 0x6f, 0xdb, 0x40, 0x46, 0x09, 0xee, 0xa4, 0x81, 0x5c, 0x2b, 0x8b, 0x34, 0x4d, 0x73, 0xa3, 0x5f, 0xb1, 0xd7, 0x07, 0xc5, 0x10, 0x4f, 0x1d, 0x3f, 0xa8, 0xaf, 0xbe, 0x55, 0xb5, 0xd8, 0x98, 0x0f, 0xf0, 0x2b, 0xd1, 0x09, 0x56, 0x44, 0xed, 0xc6, 0x2a, 0xe4, 0xf2, 0x46, 0x3d, 0x2e, 0xca, 0xdb, 0x6d, 0x17, 0xe8, 0x38, 0x6c, 0x18, 0x2f, 0xcb, 0xc3, 0x25, 0x0f, 0x4d, 0x16, 0xe3, 0xf1, 0x97, 0xa9, 0x16, 0xd5, 0xb7, 0x23, 0x58, 0x39, 0x43, 0x92, 0x11, 0x3d, 0xed, 0xb0, 0xa3, 0x06, 0x58, 0x65, 0xe5, 0x60, 0x2a, 0x8c, 0xd3, 0xa7, 0x63, 0xfa, 0x84, 0xe7, 0xed, 0xbc, 0x5c, 0x42, 0x73, 0xa1, 0x82, 0x92, 0x77, 0xf9, 0x94, 0x50, 0x9f, 0x9b, 0x9a, 0xb5, 0x50, 0x2d, 0x39, 0x1e, 0x7e, 0x9f, 0x2a, 0xb5, 0xc3, 0xf9, 0xea, 0x4e, 0xae, 0x57, 0xb2, 0x8f, 0x5d, 0x31, 0xa9, 0x54, 0x4e, 0xe0, 0x59, 0x51, 0x72, 0x5e, 0x5f, 0xfa, 0x83, 0x4e, 0x67, 0x9f, 0x98, 0x3c, 0x58, 0xdc, 0xf7, 0x25, 0xcc, 0x30, 0x2a, 0x3a, 0xc3, 0xec, 0x55, 0xe1, 0x98, 0x4f, 0xc6, 0xfd, 0x34, 0xef, 0xce, 0x6f, 0x81, 0x5a, 0xcf, 0xdd, 0x21, 0xfe, 0x97, 0xb1, 0x61, 0x46, 0xec, 0x65, 0x68, 0x06, 0x68, 0xff, 0xb5, 0x19, 0x88, 0xd7, 0xc8, 0x49, 0xff, 0xa0, 0x1e, 0x6e, 0x50, 0xa6, 0x63, 0xda, 0x9b, 0x55, 0xe4, 0xf5, 0xb7, 0xfb, 0x43, 0x25, 0x82, 0xcf, 0x6e, 0xf1, 0x75, 0x31, 0xd1, 0x65, 0x7c, 0x33, 0xcb, 0xb8, 0x04, 0x59, 0x5f, 0x2c, 0x55, 0x9d, 0x2d, 0x36, 0x22, 0xb6, 0xa0, 0xdf, 0x5e, 0x9a, 0x68, 0x6a, 0x52, 0x42, 0x2b, 0x37, 0xed, 0xad, 0x77, 0xe7, 0x5b, 0x27, 0xfc, 0xc1, 0xd9, 0xcb, 0xf8, 0x54, 0xc7, 0x47, 0xf2, 0x5e, 0xfe, 0xdf, 0xab, 0xed, 0x65, 0xb5, 0x52, 0xc4, 0xbf, 0x47, 0xf7, 0x00, 0xc7, 0x39, 0x42, 0xfc, 0x7f, 0x55, 0x65, 0x71, 0xc5, 0xd0, 0x4f, 0xe2, 0x27, 0xce, 0x22, 0x37, 0xf8, 0x29, 0xe8, 0xa8, 0xa3, 0x6e, 0x82, 0xdc, 0x40, 0x29, 0xe0, 0x52, 0x65, 0x63, 0x78, 0x01, 0x3f, 0x68, 0xf0, 0x3b, 0xe1, 0xce, 0x1e, 0xd7, 0xdb, 0xb2, 0x33, 0x8f, 0x0f, 0x45, 0x33, 0xa7, 0xc0, 0x88, 0xa9, 0xd0, 0xec, 0x53, 0x98, 0x4b, 0xdc, 0x9c, 0xb4, 0x51, 0xf9, 0xf6, 0xd2, 0xb3, 0xe1, 0x58, 0x9e, 0xbe, 0xba, 0x20, 0x8c, 0x61, 0xc7, 0x57, 0x11, 0x92, 0x38, 0x37, 0x12, 0xed, 0x47, 0xea, 0x9d, 0x9e, 0x80, 0x95, 0xd7, 0x82, 0x60, 0x95, 0x35, 0x89, 0x22, 0x09, 0xef, 0x5f, 0xd6, 0x90, 0xb2, 0x4b, 0xb3, 0x54, 0x96, 0x57, 0xae, 0x47, 0x4f, 0xb1, 0x4c, 0xac, 0xa7, 0x51, 0xb4, 0xda, 0x2c, 0xdc, 0x08, 0x3c, 0x25, 0xc8, 0xf5, 0x9d, 0xcb, 0xc2, 0x89, 0xa2, 0xb6, 0x4c, 0x45, 0x98, 0x96, 0xab, 0x74, 0x70, 0x23, 0x00, 0xbb, 0x08, 0x57, 0xb5, 0xf0, 0xad, 0xda, 0x1a, 0x2f, 0xdd, 0xbe, 0x50, 0x2b, 0x51, 0x6c, 0x67, 0xc3, 0x3b, 0xde, 0xc3, 0xd6, 0xcc, 0x0f, 0xc4, 0x57, 0xf9, 0xb0, 0xa6, 0xa4, 0x7f, 0x1d, 0xa5, 0x13, 0x24, 0x8f, 0x65, 0xce, 0x40, 0x93, 0x92, 0xe2, 0x7d, 0xbb, 0xc3, 0x92, 0xdb, 0x93, 0xa5, 0xf1, 0xf7, 0xd6, 0x55, 0xb0, 0x8c, 0xe2, 0x0d, 0x34, 0x3a, 0x6a, 0x03, 0xeb, 0x86, 0x6b, 0x8e, 0xe1, 0x23, 0x61, 0x8b, 0x8e, 0x70, 0xba, 0xff, 0xf3, 0x41, 0x8b, 0xfe, 0xe5, 0xe2, 0x82, 0xcb, 0xa8, 0x59, 0x1c, 0x40, 0xbf, 0xec, 0x17, 0x70, 0x03, 0xe3, 0x2b, 0x8c, 0xf3, 0x8f, 0xf5, 0x03, 0x4b, 0x8b, 0x34, 0xed, 0xd8, 0x42, 0x37, 0xaa, 0x8a, 0xb1, 0x96, 0xc6, 0xcb, 0x6f, 0x21, 0x20, 0x0f, 0xea, 0x16, 0x4c, 0xac, 0xf3, 0x97, 0x35, 0xed, 0x7d, 0x5a, 0x07, 0x61, 0xa1, 0xa3, 0x4c, 0x79, 0xe6, 0x6f, 0x55, 0x52, 0xc0, 0xf2, 0xdb, 0xd0, 0x56, 0x44, 0xe6, 0xec, 0x88, 0x58, 0xee, 0x4f, 0x31, 0x2d, 0x40, 0x1f, 0xa9, 0x48, 0xa4, 0x19, 0x8f, 0x61, 0x3d, 0xe0, 0xc5, 0x5d, 0xb0, 0x94, 0xbb, 0x7c, 0x89, 0xa7, 0xf1, 0xd4, 0xda, 0xec, 0xb7, 0xfe, 0x24, 0xf1, 0x38, 0x0f, 0x7b, 0x8f, 0xb6, 0xc9, 0xe6, 0xbf, 0x17, 0x13, 0x05, 0xaf, 0xa1, 0xa7, 0xf6, 0x16, 0x02, 0x0b, 0x78, 0xc4, 0x93, 0xc2, 0x51, 0x7d, 0xdd, 0xc3, 0xee, 0x07, 0x5d, 0x2a, 0x4a, 0x82, 0x84, 0x2e, 0x11, 0xf8, 0x02, 0x53, 0x04, 0x35, 0x44, 0xe0, 0x9f, 0xd9, 0x3b, 0x94, 0xf9, 0xab, 0x60, 0x95, 0xed, 0x30, 0xf5, 0xa9, 0x77, 0x7d, 0x8d, 0xa8, 0x60, 0x49, 0xce, 0x32, 0x1e, 0x46, 0x76, 0x9d, 0xf6, 0xb2, 0x9c, 0x31, 0x63, 0x28, 0x39, 0x98, 0xbb, 0xbd, 0xe6, 0x90, 0x10, 0x48, 0xe7, 0xe3, 0x54, 0x01, 0x69, 0x99, 0xc1, 0x4e, 0x08, 0x6c, 0x78, 0xd9, 0x94, 0x7c, 0x69, 0xe6, 0x15, 0x44, 0x72, 0xe4, 0x0c, 0xcd, 0xcb, 0x41, 0xfc, 0x21, 0xa1, 0x83, 0x29, 0x03, 0x01, 0x95, 0xa0, 0xdd, 0xf8, 0x5e, 0x77, 0xfa, 0xf9, 0x98, 0x56, 0xf5, 0x7e, 0xe0, 0x37, 0x72, 0xf2, 0x09, 0x69, 0x0b, 0xcf, 0xb6, 0xdb, 0x8e, 0x04, 0x28, 0x97, 0x65, 0x99, 0x54, 0x8d, 0x55, 0x95, 0x39, 0x92, 0x6c, 0x20, 0x70, 0xa8, 0x34, 0xe5, 0x05, 0x80, 0x2d, 0xba, 0x85, 0x3d, 0x7a, 0x83, 0x58, 0x7b, 0xdb, 0x53, 0x51, 0x90, 0xdb, 0xd5, 0x84, 0x11, 0x4b, 0xeb, 0x58, 0x99, 0xee, 0x94, 0xdd, 0xc5, 0x76, 0x13, 0x5f, 0x83, 0xaf, 0x4e, 0x3b, 0x8d, 0xfb, 0x74, 0xf1, 0x30, 0xfe, 0xe2, 0x7b, 0x52, 0x9a, 0x48, 0xdd, 0xb3, 0x1e, 0x07, 0xfe, 0x73, 0xba, 0xde, 0xb6, 0xd5, 0x37, 0xc6, 0x28, 0x42, 0xe4, 0x1a, 0x52, 0x91, 0xd4, 0xfb, 0xe2, 0x85, 0x46, 0xf3, 0x4b, 0x97, 0x65, 0xd8, 0x19, 0xf6, 0x32, 0xf4, 0x81, 0xcd, 0xbe, 0x62, 0x3d, 0xc4, 0x9c, 0xbb, 0x97, 0xc9, 0x96, 0xf3, 0xc3, 0x10, 0x9f, 0x7d, 0x71, 0x58, 0x09, 0xb6, 0xa3, 0x71, 0xf8, 0x80, 0xbc, 0xfb, 0x17, 0x2d, 0xda, 0x70, 0x89, 0xa0, 0x66, 0x65, 0x23, 0xae, 0xea, 0x0c, 0xd8, 0xca, 0x22, 0xfe, 0x74, 0xe2, 0x55, 0x37, 0x8e, 0x84, 0xe5, 0x62, 0xb7, 0x45, 0x26, 0x58, 0xf8, 0x63, 0x6c, 0xe3, 0x7c, 0xa9, 0x68, 0xc7, 0x89, 0x93, 0xb4, 0x03, 0xb5, 0xb3, 0xac, 0x54, 0x56, 0x53, 0x80, 0xfb, 0x3a, 0x5c, 0x87, 0xc0, 0x98, 0x77, 0xd6, 0x37, 0x47, 0x71, 0x12, 0x42, 0x2e, 0xe4, 0x82, 0xd7, 0xfc, 0x14, 0x68, 0x03, 0x19, 0x17, 0x92, 0x2f, 0xdc, 0x39, 0x2c, 0xa3, 0xfe, 0x9e, 0xd8, 0x48, 0x4e, 0x29, 0x01, 0xb2, 0xa7, 0x9d, 0x6b, 0x5d, 0x1f, 0x02, 0x0f, 0x37, 0x82, 0x4b, 0x27, 0x5f, 0xff, 0x35, 0x85, 0x2d, 0x20, 0x72, 0x28, 0x72, 0x00, 0x07, 0x11, 0x01, 0xb8, 0xf3, 0x53, 0x6e, 0x1a, 0x11, 0x6a, 0x15, 0xa2, 0x3f, 0xcd, 0x5e, 0xa9, 0xc0, 0xc7, 0x40, 0xdc, 0xdf, 0x82, 0x04, 0xed, 0xd5, 0x65, 0x4c, 0x88, 0xed, 0x9f, 0x53, 0x89, 0xe6, 0x04, 0x76, 0x6c, 0x99, 0x19, 0xf4, 0x04, 0xdc, 0x6a, 0xf2, 0x70, 0xa5, 0x24, 0xc2, 0x4c, 0x73, 0xdf, 0x64, 0x24, 0xe9, 0xbc, 0x4d, 0x2e, 0xbc, 0xb0, 0x68, 0x38, 0xd0, 0x1f, 0x5b, 0xdf, 0x9e, 0xad, 0x0b, 0x02, 0xd9, 0x51, 0x62, 0x76, 0x51, 0xab, 0x50, 0xfb, 0x17, 0x97, 0x0f, 0x6f, 0xe2, 0x02, 0xac, 0x42, 0xb1, 0xfc, 0xc3, 0x2a, 0xb2, 0x0f, 0x8a, 0x18, 0x63, 0xcf, 0x10, 0x6a, 0xf7, 0xb3, 0xc7, 0x62, 0xfb, 0x23, 0x41, 0xd7, 0x39, 0xd2, 0x37, 0x2a, 0xdd, 0x4e, 0xcf, 0x7c, 0xd6, 0xd6, 0x1e, 0x1e, 0x7f, 0x6b, 0xec, 0x49, 0x7f, 0x29, 0xb8, 0x10, 0xee, 0xd8, 0xfc, 0x92, 0xb9, 0xbf, 0xb3, 0x74, 0x47, 0xb8, 0x17, 0x8f, 0x5c, 0x8a, 0xaf, 0xe5, 0x3e, 0x72, 0x89, 0xda, 0x17, 0x03, 0xc5, 0xa1, 0x9b, 0x31, 0x53, 0xf4, 0xea, 0xa8, 0xfc, 0x08, 0xb8, 0x62, 0xa7, 0xc0, 0xab, 0x78, 0xd5, 0x21, 0x04, 0x38, 0x6f, 0x06, 0x82, 0x79, 0xc1, 0x14, 0x83, 0x2b, 0xc6, 0xf1, 0x6d, 0x32, 0xa6, 0xb1, 0x4c, 0x75, 0x7d, 0x91, 0xbd, 0x31, 0x5e, 0xe8, 0x0a, 0x94, 0x98, 0x5a, 0x96, 0x87, 0x37, 0x4f, 0x7c, 0xcb, 0xce, 0xa3, 0x73, 0x47, 0x74, 0xa0, 0xf5, 0xa0, 0x0d, 0x29, 0xa0, 0x0b, 0xcb, 0x37, 0xdc, 0x5f, 0xf4, 0x8a, 0xbe, 0x6f, 0xe5, 0x98, 0x2c, 0x96, 0x57, 0xca, 0x42, 0x93, 0xe1, 0xe7, 0xf5, 0x97, 0xbe, 0xd0, 0xf6, 0x9d, 0xd1, 0x6f, 0xd9, 0xfa, 0xe6, 0xea, 0x77, 0x35, 0x3b, 0x1c, 0x91, 0x18, 0x3f, 0x45, 0xb6, 0x07, 0x99, 0x00, 0x66, 0x91, 0x6c, 0x76, 0x77, 0x45, 0xd9, 0xd2, 0xb8, 0xc7, 0xc6, 0xf5, 0xd5, 0x23, 0xde, 0x6a, 0x7a, 0x60, 0xd9, 0x9c, 0xbb, 0x59, 0xfe, 0x46, 0xb4, 0xc8, 0xe6, 0x2c, 0x6c, 0xa4, 0x82, 0x09, 0x00, 0xad, 0x60, 0xc8, 0xfd, 0x45, 0x29, 0xf6, 0x0d, 0x81, 0x6f, 0x78, 0xd6, 0x80, 0xa5, 0x79, 0x1f, 0xfb, 0x6f, 0xa7, 0x34, 0x1e, 0x1d, 0x9f, 0x8c, 0x96, 0x71, 0xa5, 0xaa, 0xec, 0xa9, 0x99, 0x41, 0x11, 0xb9, 0x26, 0x9b, 0x3a, 0xd9, 0x3d, 0x3b, 0xed, 0x3f, 0xc2, 0xc2, 0x5c, 0x2e, 0x85, 0x0f, 0xf3, 0x2f, 0x73, 0xaa, 0x2d, 0x9f, 0x0e, 0x63, 0xab, 0x69, 0x1a, 0x36, 0x87, 0x15, 0x99, 0x72, 0xe6, 0x02, 0xfa, 0x1b, 0xcc, 0xef, 0x8e, 0x8c, 0x35, 0xc0, 0x3b, 0x60, 0x61, 0x7f, 0x74, 0x93, 0x6f, 0xa2, 0x68, 0xe5, 0x2d, 0x8c, 0x7a, 0x7f, 0x2f, 0x56, 0xf2, 0xd9, 0x1e, 0xce, 0xf2, 0xdb, 0x53, 0xc0, 0xab, 0x43, 0xa4, 0x75, 0xd0, 0x46, 0x7e, 0x7a, 0x4b, 0x7a, 0x35, 0xa2, 0x30, 0xf3, 0x97, 0x4e, 0xef, 0xac, 0xc7, 0xec, 0xcd, 0x29, 0x49, 0xbe, 0x95, 0x5b, 0x59, 0xdd, 0x8a, 0xc4, 0x81, 0x7d, 0xa1, 0xdc, 0x6a, 0x72, 0xed, 0xb2, 0xf3, 0xf4, 0x5b, 0xd6, 0x80, 0x9f, 0x9f, 0x77, 0x94, 0xbd, 0x6e, 0xc9, 0xa3, 0xc8, 0xee, 0xa9, 0x21, 0x2b, 0x6b, 0x84, 0xdf, 0x49, 0x4b, 0x75, 0x97, 0xc0, 0x44, 0xad, 0xc6, 0xef, 0xcc, 0x18, 0xb9, 0xb6, 0xd1, 0x3e, 0xeb, 0x7c, 0xab, 0x67, 0x8e, 0x77, 0x4f, 0x02, 0x68, 0x27, 0xc5, 0x47, 0xe0, 0x24, 0xdc, 0x1c, 0x59, 0x1a, 0x1c, 0x35, 0xbe, 0x12, 0xfc, 0x80, 0x5e, 0xf3, 0x55, 0xc0, 0xfb, 0x48, 0x17, 0x77, 0x1d, 0x43, 0x3b, 0x0a, 0xac, 0x02, 0xf8, 0x20, 0xbe, 0x12, 0x3a, 0x4b, 0xae, 0x32, 0x50, 0xea, 0x6e, 0x59, 0xe4, 0x4e, 0x1e, 0xfa, 0x31, 0x1b, 0xdd, 0x86, 0x70, 0xf1, 0xdf, 0x33, 0x93, 0x4c, 0xbf, 0xfc, 0x36, 0xa9, 0x17, 0xe8, 0xd3, 0xeb, 0x4f, 0x90, 0x35, 0xfc, 0xb2, 0xdb, 0x2f, 0xb7, 0xc7, 0x0d, 0x8d, 0x06, 0xde, 0x00, 0x4b, 0x47, 0xe9, 0xb0, 0x05, 0xf5, 0x8d, 0xfe, 0xaf, 0x84, 0x79, 0xad, 0x86, 0x8c, 0xf7, 0xb1, 0x46, 0x2a, 0xc0, 0xa9, 0x9e, 0xa4, 0x15, 0xaa, 0xe1, 0x4b, 0x0b, 0x3e, 0xfe, 0xa6, 0x27, 0xac, 0xb2, 0xcc, 0x2a, 0x7a, 0xfc, 0x12, 0x2e, 0x31, 0xd2, 0xe6, 0xf2, 0x60, 0x12, 0xfb, 0x73, 0xe3, 0xbb, 0xa7, 0xbc, 0x65, 0x5d, 0x89, 0xfe, 0x24, 0xce, 0x6e, 0xe3, 0xf4, 0x1f, 0x75, 0x20, 0x87, 0xce, 0x72, 0x4a, 0xeb, 0x3d, 0x91, 0xea, 0x54, 0x63, 0x3c, 0xd3, 0x1c, 0xc2, 0x3e, 0xb3, 0x08, 0x99, 0x28, 0xe9, 0xcd, 0x5a, 0xf3, 0x96, 0xd3, 0x5e, 0xe8, 0xf7, 0x38, 0xd8, 0xbd, 0xf2, 0x18, 0x08, 0x01, 0xee, 0x0c, 0xb1, 0xba, 0xe8, 0xf0, 0xcc, 0x4c, 0xc3, 0xea, 0x7e, 0x9c, 0xe0, 0xa7, 0x48, 0x76, 0xef, 0xe8, 0x7e, 0x2c, 0x05, 0x3e, 0xfa, 0x80, 0xee, 0x11, 0x11, 0xc4, 0xc4, 0xe7, 0xc6, 0x40, 0xc0, 0xe3, 0x3e, 0xd4, 0x51, 0x8c, 0x74, 0xdf, 0x6b, 0xd1, 0x2e, 0x5f, 0x22, 0x49, 0x30, 0x59, 0x77, 0xbf, 0xaf, 0x7b, 0x72, 0xed, 0x08, 0x00, 0x71, 0x88, 0xb2, 0xd4, 0xbf, 0x7d, 0x71, 0xf8, 0x68, 0x7b, 0xcd, 0x29, 0x4c, 0xb1, 0xc3, 0xbc, 0x73, 0xd9, 0xba, 0xcd, 0xa0, 0x75, 0xb9, 0x98, 0x29, 0x58, 0xd6, 0x27, 0x05, 0x69, 0xf2, 0x2e, 0x27, 0xa4, 0xa3, 0x33, 0x0a, 0x61, 0x72, 0xf1, 0x8e, 0xd9, 0x47, 0xff, 0x02, 0xe6, 0x21, 0xad, 0x82, 0x0a, 0x0a, 0x2f, 0x83, 0xb3, 0x4b, 0xfd, 0xac, 0xbd, 0xdc, 0x79, 0xe8, 0x39, 0x1e, 0xd2, 0xb9, 0x6d, 0xcc, 0x29, 0xcf, 0x1b, 0x2f, 0xf3, 0xd9, 0x07, 0x92, 0x9f, 0x9b, 0xb3, 0xf6, 0x78, 0x40, 0x6d, 0x07, 0xcc, 0xf2, 0x8b, 0x4e, 0x4e, 0xa9, 0xf6, 0xa7, 0xb9, 0x40, 0xe5, 0xf6, 0xb6, 0xce, 0xeb, 0x16, 0x00, 0x33, 0x34, 0x12, 0xc6, 0xf1, 0x0c, 0x98, 0x51, 0x3e, 0xa0, 0xaa, 0xe6, 0x57, 0x09, 0x97, 0xee, 0x16, 0x86, 0x2a, 0x54, 0xc7, 0x09, 0x21, 0x2f, 0x38, 0xf6, 0xe0, 0xa1, 0x0f, 0x27, 0x67, 0xfe, 0x60, 0x33, 0x82, 0x31, 0x7f, 0xf0, 0x3f, 0x5c, 0x13, 0x36, 0xa5, 0xbf, 0x6c, 0xe6, 0xa3, 0xdb, 0x17, 0x2b, 0x47, 0xd7, 0xaf, 0x00, 0x31, 0x22, 0xf5, 0xf3, 0x46, 0x5a, 0x23, 0x28, 0xa9, 0x6d, 0x7e, 0xa0, 0xe7, 0xfe, 0x2b, 0xbb, 0x71, 0x0a, 0x43, 0xfc, 0x50, 0xcb, 0x2a, 0x0d, 0x14, 0xdc, 0x1c, 0x03, 0x0d, 0x9f, 0x08, 0xe2, 0xbe, 0xdc, 0xa2, 0x64, 0x8f, 0xaa, 0xb4, 0xf6, 0xc2, 0x93, 0xb4, 0x04, 0xa8, 0xf3, 0x9c, 0x76, 0x15, 0xa1, 0xf6, 0x7b, 0x11, 0xd1, 0x36, 0x85, 0xd0, 0x39, 0x4d, 0x95, 0xe5, 0x73, 0x7b, 0xb8, 0xb2, 0xa3, 0x65, 0xd1, 0x23, 0x59, 0x67, 0x9a, 0x9c, 0xb9, 0x2b, 0xe6, 0x2f, 0xd9, 0x7b, 0x29, 0x13, 0x6a, 0x53, 0x39, 0x51, 0x9b, 0x3b, 0x56, 0xc1, 0x3a, 0xd3, 0x69, 0x35, 0x1c, 0xb0, 0x89, 0xf4, 0xc0, 0x66, 0xc3, 0x6a, 0x2f, 0xe6, 0x1b, 0x1d, 0x26, 0x0b, 0xce, 0xe3, 0x77, 0x6f, 0xda, 0x53, 0xad, 0x83, 0xc0, 0x79, 0xef, 0xdf, 0x89, 0xce, 0x27, 0xd6, 0x07, 0x66, 0x63, 0x4e, 0x5d, 0x6c, 0x7b, 0xce, 0xc2, 0xcc, 0xf4, 0xd9, 0x81, 0x2f, 0x24, 0x7b, 0x44, 0x2c, 0x97, 0x21, 0x93, 0xbc, 0xb2, 0xae, 0x98, 0xef, 0x96, 0xca, 0x25, 0xde, 0x47, 0x7d, 0xf8, 0xe1, 0x0e, 0xfe, 0x3d, 0x02, 0x1b, 0xc5, 0x54, 0xb1, 0x6f, 0xe7, 0xd5, 0xb9, 0xf9, 0xa3, 0xd1, 0x72, 0xff, 0x38, 0x5b, 0x38, 0xc0, 0xfa, 0x47, 0x1d, 0x58, 0xa5, 0x32, 0xdb, 0xe3, 0xf1, 0xc3, 0x0d, 0xe5, 0x67, 0x2f, 0x9e, 0xea, 0x72, 0x03, 0x81, 0x69, 0xb9, 0x1e, 0xa2, 0xee, 0xac, 0xfc, 0x1d, 0x78, 0x5d, 0x3b, 0xaf, 0x20, 0x92, 0x57, 0x69, 0xfc, 0x18, 0xb9, 0xac, 0x43, 0x5a, 0xf0, 0x51, 0xb2, 0x32, 0x3e, 0x28, 0x2e, 0xfe, 0x56, 0xa4, 0xaa, 0xf7, 0x64, 0xd4, 0x4b, 0xbe, 0x4e, 0x95, 0xca, 0x38, 0x39, 0x07, 0x1b, 0x9c, 0x50, 0x3d, 0x4c, 0xca, 0xc0, 0x39, 0xaf, 0xdf, 0x07, 0x17, 0x3b, 0x06, 0x6f, 0x88, 0x30, 0x91, 0xd5, 0x82, 0xfa, 0x48, 0xaf, 0x36, 0x58, 0x00, 0x4e, 0x43, 0xbd, 0x70, 0x60, 0x29, 0xf7, 0x41, 0xb8, 0x00, 0x0e, 0x64, 0x52, 0x6a, 0x6f, 0xa8, 0x91, 0xc6, 0x49, 0x8c, 0xcc, 0xa6, 0x38, 0x51, 0x09, 0x83, 0x21, 0x54, 0x08, 0xb0, 0x5d, 0x9b, 0x84, 0x8d, 0x19, 0xae, 0xb5, 0xfd, 0xfc, 0xa8, 0x19, 0x1a, 0x0b, 0x8d, 0x74, 0x27, 0xca, 0xde, 0x16, 0xc5, 0xa4, 0x6b, 0x5c, 0x6a, 0x8d, 0x69, 0x79, 0x10, 0xe6, 0xc4, 0x76, 0x2a, 0xa1, 0xb7, 0x78, 0xdc, 0xa5, 0x99, 0x42, 0x6b, 0x74, 0xfa, 0xfa, 0xf3, 0x0b, 0xee, 0x30, 0x58, 0x0a, 0xa9, 0x1c, 0x7e, 0x14, 0x4c, 0x27, 0xbd, 0x79, 0xff, 0xae, 0x8f, 0x12, 0x40, 0x02, 0x8c, 0x6d, 0x7a, 0xb3, 0x99, 0x2a, 0xda, 0x0e, 0x5c, 0xa5, 0x5e, 0xe4, 0xf3, 0xd6, 0x2f, 0x8d, 0xe5, 0x75, 0x30, 0x2d, 0x58, 0x61, 0xd7, 0x36, 0x85, 0x42, 0x3c, 0x2e, 0x6a, 0x6d, 0x6f, 0xb3, 0xbe, 0x09, 0x0f, 0xbc, 0x2a, 0x70, 0x18, 0x21, 0xb6, 0xd8, 0xfd, 0x5e, 0x82, 0x33, 0xf7, 0x94, 0xb6, 0x54, 0x9c, 0xd0, 0xbb, 0x52, 0xb3, 0x90, 0xac, 0x31, 0x47, 0x83, 0x07, 0xbf, 0xfa, 0x91, 0xa9, 0xbd, 0x9c, 0x1b, 0xf9, 0x3f, 0xfc, 0x84, 0x63, 0x56, 0xfe, 0xf0, 0x08, 0xeb, 0xee, 0x4b, 0xb3, 0xee, 0x14, 0x8e, 0x0f, 0xb1, 0x89, 0x3d, 0x18, 0x8e, 0x49, 0x34, 0xd0, 0xd0, 0x88, 0xa4, 0x33, 0xd1, 0x4a, 0x59, 0x6c, 0x5f, 0x2e, 0x3e, 0x49, 0x64, 0x8a, 0x22, 0xed, 0xc6, 0xbd, 0xbc, 0xc5, 0x8d, 0xc1, 0xed, 0xbd, 0x44, 0x00, 0x46, 0xb3, 0xa1, 0x69, 0xca, 0x2b, 0x68, 0xc2, 0xf5, 0x45, 0x8c, 0x40, 0xfd, 0xed, 0x97, 0x55, 0x57, 0x52, 0x4d, 0xc9, 0x7d, 0x99, 0x8c, 0x0c, 0xef, 0xd2, 0x77, 0xcb, 0x77, 0x2b, 0xd4, 0xc1, 0xb2, 0x63, 0xb1, 0xd0, 0xcc, 0x82, 0x4e, 0x50, 0x8b, 0xc8, 0x37, 0xa7, 0x8f, 0xe3, 0xb1, 0x19, 0xd8, 0x65, 0x57, 0xe2, 0x88, 0x74, 0x05, 0x82, 0xea, 0xc3, 0xf5, 0x59, 0xb4, 0xc2, 0x28, 0x73, 0x89, 0x12, 0x08, 0xa5, 0xc2, 0x3c, 0x4b, 0xd9, 0x6e, 0xa2, 0x1a, 0xa6, 0x97, 0xb6, 0x73, 0x24, 0xc8, 0x69, 0xcc, 0xfe, 0xcb, 0xe7, 0xf9, 0xc8, 0xb7, 0x81, 0x4f, 0x93, 0x2b, 0xea, 0x0a, 0xbf, 0xd4, 0xa7, 0xec, 0x11, 0x35, 0xc1, 0x27, 0x05, 0xa7, 0xbd, 0x7d, 0x66, 0x9e, 0xcd, 0xa6, 0x1b, 0x2f, 0x48, 0xf2, 0x44, 0xcf, 0x58, 0x2f, 0x86, 0x5e, 0xf3, 0xcd, 0xa2, 0x64, 0x0c, 0x40, 0x4d, 0x9a, 0x0a, 0xa6, 0x3c, 0xac, 0x79, 0xaa, 0x7e, 0x3d, 0xff, 0xa8, 0x0e, 0x2b, 0x92, 0x12, 0xa9, 0x15, 0xe9, 0x12, 0xdd, 0x1b, 0x30, 0x70, 0x63, 0xe5, 0x00, 0xb7, 0xae, 0xe7, 0x8e, 0x93, 0xc4, 0xe3, 0x23, 0x7e, 0x4d, 0xaf, 0xcc, 0x9b, 0xe9, 0x38, 0x52, 0xe2, 0xc7, 0xc7, 0x6c, 0x7e, 0x74, 0x83, 0x34, 0x73, 0xf0, 0x38, 0xd8, 0x84, 0x07, 0x56, 0x92, 0x54, 0xde, 0x3d, 0xda, 0xcb, 0xcd, 0xb7, 0xda, 0xbb, 0x6c, 0xc6, 0x22, 0xc4, 0xf1, 0xa1, 0x9d, 0x75, 0xb9, 0xf9, 0xc3, 0xb3, 0x24, 0x80, 0x11, 0x5f, 0xa6, 0xac, 0xb6, 0x33, 0x1b, 0xb8, 0x90, 0xed, 0x5b, 0xed, 0x56, 0xb0, 0x0f, 0x1f, 0x17, 0xa7, 0xc3, 0x7a, 0xe3, 0xeb, 0x3c, 0x7f, 0xc8, 0xa7, 0x0b, 0x49, 0x00, 0x7a, 0x62, 0x15, 0x68, 0x1c, 0x27, 0x01, 0x34, 0x45, 0x47, 0x14, 0xe1, 0xca, 0x4d, 0x7f, 0x6c, 0x09, 0x33, 0x22, 0xc2, 0x88, 0x77, 0x52, 0x77, 0xd9, 0x72, 0xda, 0xba, 0xc1, 0xe6, 0x3f, 0x89, 0x99, 0xd6, 0x49, 0x21, 0xf3, 0x9a, 0xbe, 0xb9, 0x81, 0x32, 0x71, 0x6f, 0x33, 0xdb, 0x7b, 0x83, 0xa0, 0xe0, 0xc9, 0xc3, 0xa7, 0xb3, 0xd7, 0x46, 0x56, 0x3c, 0xba, 0x5d, 0x0a, 0x71, 0x64, 0xc7, 0xd8, 0x27, 0x24, 0x24, 0x2c, 0x27, 0x6c, 0xac, 0xb0, 0x85, 0xd7, 0x21, 0x70, 0x2d, 0x6a, 0x02, 0x3b, 0xbf, 0x1b, 0x02, 0x4c, 0x9d, 0x8f, 0xb9, 0x2a, 0x42, 0x28, 0x98, 0xcc, 0xd5, 0x3f, 0x22, 0x01, 0xfd, 0xae, 0x59, 0x0f, 0xf8, 0x92, 0x77, 0x9a, 0xe7, 0x4f, 0xdf, 0xc8, 0x6c, 0xd4, 0x53, 0xa3, 0x77, 0x20, 0x67, 0xbf, 0x5d, 0x04, 0x36, 0x1c, 0x2b, 0x2b, 0x53, 0x4d, 0x39, 0x59, 0x03, 0xda, 0x02, 0xf0, 0xa9, 0xe4, 0x32, 0xb8, 0x81, 0x07, 0x01, 0xdf, 0x91, 0x85, 0xc0, 0x3f, 0xdd, 0xa0, 0xb1, 0xe0, 0xdb, 0x47, 0x1c, 0xbe, 0x26, 0xf5, 0x9f, 0xcc, 0x76, 0xd7, 0xc6, 0x38, 0xd0, 0x2d, 0xdc, 0xf1, 0xfa, 0xf2, 0x00, 0x67, 0x32, 0xbf, 0x7b, 0x92, 0x1f, 0xed, 0x50, 0x35, 0x08, 0xfa, 0x15, 0x64, 0x44, 0x2d, 0x02, 0x44, 0xf2, 0x7d, 0x48, 0x12, 0xea, 0xb0, 0xa3, 0x66, 0xf3, 0xc0, 0x33, 0xb9, 0x36, 0x82, 0x88, 0x25, 0xf2, 0x89, 0xfc, 0x6d, 0x72, 0x49, 0x45, 0x3d, 0x3c, 0x78, 0x4a, 0xb3, 0x8c, 0xba, 0x36, 0x1d, 0x00, 0x7c, 0xcb, 0x05, 0x95, 0x20, 0xfa, 0x6b, 0xd2, 0x5b, 0xb0, 0x51, 0x43, 0xdc, 0xf2, 0x7d, 0x29, 0x2f, 0x2c, 0x7a, 0x70, 0xe0, 0xc6, 0xe0, 0xe1, 0xe3, 0xf9, 0xd5, 0x99, 0x33, 0xe1, 0xd4, 0xba, 0xba, 0xd3, 0xad, 0x60, 0x71, 0xf0, 0xcd, 0xd7, 0xc8, 0xfa, 0xc0, 0x0b, 0x48, 0x67, 0xf4, 0x3f, 0x77, 0xb4, 0xc0, 0x02, 0xfc, 0xfc, 0xa4, 0x5f, 0x03, 0xc9, 0xd3, 0x55, 0xe3, 0x2a, 0xee, 0x87, 0xfe, 0x06, 0x13, 0x33, 0xe9, 0xaf, 0x16, 0x68, 0xce, 0xba, 0x0e, 0x74, 0x0e, 0x0f, 0x14, 0x9c, 0x2a, 0x3c, 0x47, 0x11, 0xe3, 0x0f, 0x14, 0x1f, 0xa0, 0x63, 0xb4, 0xa6, 0x11, 0x3a, 0xf5, 0xce, 0x12, 0x0c, 0x3e, 0xf7, 0xd2, 0x5f, 0xcd, 0xef, 0x34, 0x98, 0x44, 0x68, 0x75, 0x11, 0x64, 0xa9, 0x10, 0x6b, 0x18, 0x83, 0xde, 0x26, 0xb5, 0x87, 0x82, 0x6e, 0x80, 0x76, 0x04, 0x38, 0x71, 0xf9, 0xbc, 0x8e, 0x36, 0x92, 0x72, 0x27, 0x7b, 0xd3, 0xc3, 0x3b, 0x69, 0xce, 0xc6, 0x95, 0x6c, 0xcc, 0xf0, 0xea, 0x3a, 0x42, 0x35, 0x69, 0x11, 0x00, 0x70, 0x93, 0x3f, 0xac, 0x05, 0x4d, 0xe8, 0x6f, 0xc5, 0x34, 0x04, 0xee, 0x12, 0x30, 0xa7, 0x7c, 0x43, 0x4c, 0x85, 0x8d, 0x4a, 0xc5, 0xb5, 0x6e, 0x93, 0x60, 0xb5, 0x34, 0x30, 0x01, 0xaf, 0xf3, 0x34, 0x7a, 0xfa, 0x30, 0x5c, 0xa1, 0xe4, 0x98, 0xf5, 0xa5, 0xaf, 0xf2, 0xf9, 0xa2, 0xd9, 0x52, 0x7c, 0x72, 0xa1, 0x8f, 0x46, 0xc7, 0xc6, 0xf8, 0xc2, 0x76, 0x92, 0x43, 0x17, 0x16, 0x17, 0xc6, 0x94, 0xca, 0xb9, 0xea, 0x51, 0x5b, 0xec, 0xdc, 0x13, 0x8a, 0x3f, 0x85, 0x71, 0xa4, 0x9a, 0xbd, 0x35, 0x56, 0xc3, 0xbb, 0x05, 0xc3, 0x27, 0xd0, 0x43, 0xd4, 0xd8, 0x56, 0x31, 0xcf, 0xd2, 0xe3, 0x59, 0x2c, 0x82, 0xc2, 0x2c, 0xa4, 0x89, 0xa3, 0xe9, 0x8a, 0xbd, 0x91, 0xc0, 0x5e, 0x70, 0x25, 0x38, 0xa0, 0xf6, 0xf9, 0xce, 0xe2, 0x61, 0x60, 0xde, 0x21, 0x8f, 0x54, 0xc7, 0x55, 0x67, 0xb0, 0x4b, 0x47, 0x5f, 0xa0, 0x34, 0xa3, 0x41, 0x55, 0x3d, 0x4e, 0x30, 0xfd, 0x2f, 0xf9, 0xe6, 0xf2, 0x4b, 0xf7, 0x3f, 0x31, 0xe8, 0x4b, 0xfb, 0x0f, 0x5d, 0x06, 0xbf, 0x27, 0x21, 0xd0, 0x5e, 0x97, 0x31, 0xc4, 0x57, 0x6c, 0xb2, 0x81, 0x9f, 0x5a, 0xd8, 0x7d, 0xa0, 0xb1, 0x06, 0x9d, 0x81, 0x8c, 0x37, 0x03, 0xa8, 0x4b, 0x9c, 0x28, 0x7d, 0x44, 0x86, 0x2a, 0x71, 0xb6, 0x87, 0x67, 0x40, 0xfe ],
+const [ 0x9d, 0x18, 0x98, 0xf0, 0x4e, 0x38, 0xda, 0x85, 0xc2, 0x7e, 0x63, 0x17, 0xc1, 0x9e, 0xe8, 0x1c, 0x3b, 0xdc, 0x6b, 0x1a, 0xe7, 0x21, 0x02, 0x62, 0x2a, 0x4e, 0xdb, 0xfa, 0x3a, 0xd0, 0x7d, 0xdb, 0x83, 0x75, 0x50, 0x5c, 0x4a, 0x7d, 0x60, 0xef, 0x90, 0xf5, 0x5e, 0x0b, 0x39, 0x40, 0xe8, 0x69, 0x6d, 0xf7, 0x09, 0x73, 0x3f, 0xf3, 0x04, 0xfa, 0x8c, 0xa7, 0x4d, 0x27, 0x26, 0xb3, 0xd9, 0xb4, 0x32, 0xb7, 0x97, 0x5b, 0xcf, 0x65, 0x3f, 0x8f, 0xf9, 0xdb, 0x4a, 0x6b, 0xac, 0x2f, 0x41, 0xe8, 0x4c, 0x4b, 0x3b, 0x52, 0x44, 0xfb, 0xa2, 0xfd, 0xee, 0x44, 0x35, 0x34, 0xb3, 0xf8, 0x53, 0x72, 0x73, 0x87, 0x76, 0xd5, 0x26, 0x18, 0xfe, 0xcf, 0xc4, 0xd8, 0x30, 0x1f, 0x63, 0x92, 0x7e, 0xff, 0x9f, 0x81, 0x08, 0x9f, 0x3f, 0x62, 0x64, 0xd3, 0x16, 0xcc, 0x9a, 0x08, 0x26, 0xc4, 0x73, 0x7d, 0x0c, 0x8d, 0xf4, 0xb0, 0x98, 0xbd, 0x25, 0x16, 0xbb, 0x96, 0x17, 0x0e, 0xa6, 0x92, 0x24, 0x18, 0x30, 0x40, 0x79, 0x42, 0x78, 0x4f, 0xd2, 0xe4, 0xcc, 0xe8, 0x85, 0x8d, 0xca, 0x42, 0xc2, 0x3d, 0xc5, 0x70, 0x19, 0xd5, 0x6b, 0x7d, 0x3c, 0xcb, 0xa4, 0xba, 0x07, 0x22, 0xbd, 0x57, 0xbd, 0x9a, 0xc5, 0x31, 0x95, 0x24, 0x37, 0xeb, 0x75, 0x98, 0xda, 0x40, 0xfd, 0xaa, 0xe6, 0x97, 0xc7, 0x1b, 0x68, 0xd8, 0xed, 0x2c, 0xe7, 0x7f, 0xcc, 0x58, 0x48, 0xef, 0x08, 0x42, 0xef, 0x08, 0xd1, 0xed, 0x27, 0xfb, 0x64, 0x2b, 0xc4, 0x5d, 0xd4, 0x58, 0x07, 0x7b, 0x0a, 0x47, 0xc1, 0xee, 0x0a, 0x7d, 0xbb, 0x6f, 0x79, 0x9d, 0x56, 0xec, 0x5c, 0x24, 0x6f, 0xdb, 0x23, 0x56, 0x85, 0xce, 0xe6, 0x79, 0x1e, 0x47, 0xee, 0x40, 0x66, 0xce, 0x77, 0x8a, 0x1a, 0x42, 0xb4, 0x4d, 0xa4, 0x6d, 0x14, 0xcc, 0x88, 0xda, 0xc4, 0x11, 0xfe, 0xeb, 0x75, 0x97, 0xe0, 0x26, 0x5f, 0x47, 0xc7, 0xd0, 0x86, 0xa5, 0x72, 0xbd, 0x3c, 0x4c, 0x67, 0x66, 0xe7, 0x98, 0xdc, 0x3c, 0x04, 0xa2, 0xd7, 0x3c, 0x6c, 0x71, 0x95, 0xc4, 0xd6, 0x6e, 0x29, 0xa5, 0x9e, 0x19, 0x65, 0x79, 0xc5, 0xfb, 0xfd, 0x37, 0x38, 0xdb, 0xea, 0x04, 0x55, 0x35, 0x0d, 0x4c, 0xab, 0xe8, 0x15, 0x12, 0x01, 0x2f, 0xa2, 0x84, 0x9a, 0xd2, 0xaa, 0xd3, 0xb8, 0x9e, 0x1d, 0x41, 0x5f, 0x12, 0xc4, 0x7c, 0x5b, 0x5b, 0x6f, 0x2a, 0x85, 0x83, 0x4f, 0xc5, 0x41, 0xe5, 0xa1, 0xa9, 0x4b, 0xe4, 0x8c, 0x6b, 0xb4, 0xdc, 0x4d, 0x6d, 0x27, 0x59, 0x91, 0xaf, 0x71, 0x87, 0x22, 0xe8, 0x40, 0xea, 0xc6, 0xd6, 0x2b, 0x4f, 0x65, 0xd2, 0xf3, 0x03, 0x69, 0xa7, 0x09, 0x42, 0x6a, 0xa4, 0x50, 0xf2, 0x0b, 0xf0, 0x23, 0x92, 0x1f, 0x1e, 0x9a, 0x6d, 0x11, 0x01, 0x09, 0x13, 0x82, 0xc2, 0xca, 0x09, 0x33, 0x2f, 0x3d, 0xc0, 0x26, 0x56, 0x0c, 0xc4, 0x00, 0x53, 0xb4, 0x36, 0xb2, 0x66, 0x41, 0x7c, 0x58, 0x49, 0x58, 0x37, 0x61, 0xc0, 0x7b, 0x75, 0xf1, 0x71, 0x89, 0x29, 0x83, 0xf6, 0x84, 0xd8, 0xd3, 0x31, 0x97, 0x94, 0xfb, 0xdf, 0x58, 0x2e, 0xdc, 0x70, 0x4a, 0xa8, 0xbf, 0x17, 0xa6, 0xe9, 0x3c, 0x1d, 0x5b, 0xb4, 0x5c, 0x7a, 0x53, 0xdb, 0xfa, 0xa6, 0xf8, 0xb0, 0x6f, 0xad, 0xf7, 0xbd, 0x6e, 0x82, 0x43, 0xb5, 0x2c, 0x95, 0x5e, 0xaa, 0xc4, 0xa7, 0xd4, 0x7f, 0xdb, 0xdd, 0x08, 0xa1, 0x7f, 0x14, 0x32, 0xf2, 0x55, 0x75, 0xa9, 0x06, 0xf4, 0x49, 0x5e, 0x92, 0x8c, 0x0e, 0xa9, 0x21, 0xcb, 0xca, 0x49, 0x09, 0x01, 0x9f, 0xa6, 0x9e, 0x82, 0xa0, 0x58, 0xa5, 0x4c, 0xe3, 0xed, 0x0c, 0xe9, 0xd7, 0xe7, 0xd8, 0x97, 0xd8, 0x05, 0x5e, 0xa7, 0x01, 0xc4, 0xb6, 0x23, 0x42, 0x24, 0x6d, 0xb3, 0xb2, 0xaf, 0x7a, 0xc1, 0x26, 0xb8, 0x73, 0xdc, 0x02, 0xe1, 0x01, 0x5a, 0x4f, 0xe0, 0x92, 0x42, 0x0e, 0x82, 0x4d, 0x69, 0xcc, 0xef, 0x4b, 0xda, 0x77, 0x31, 0x04, 0x7b, 0x70, 0xf0, 0x07, 0xee, 0xe1, 0x7f, 0xef, 0xb6, 0x51, 0x1d, 0x92, 0x9b, 0x76, 0x74, 0x7b, 0x4f, 0x4a, 0x66, 0x9b, 0x51, 0x61, 0x09, 0x3b, 0x12, 0x79, 0xf0, 0x35, 0x57, 0x53, 0xad, 0x64, 0xde, 0xc1, 0x93, 0x59, 0x44, 0x01, 0xc1, 0x4f, 0x26, 0x49, 0x5c, 0x61, 0x87, 0xa3, 0x1b, 0xfb, 0x71, 0xfb, 0x09, 0x8f, 0xdf, 0x76, 0x86, 0x89, 0xdb, 0x06, 0x8f, 0x84, 0xe4, 0x3c, 0x40, 0xbe, 0x92, 0x5d, 0x97, 0xc9, 0x7d, 0xb7, 0x7b, 0x84, 0x5a, 0x35, 0xfd, 0x4a, 0x67, 0x32, 0xdd, 0x69, 0x0a, 0x8b, 0x50, 0xd6, 0xb4, 0xf8, 0x00, 0x1f, 0x0c, 0x9c, 0x55, 0xa0, 0x4a, 0xda, 0xf3, 0xfa, 0xe0, 0x6b, 0x84, 0xc1, 0x60, 0xad, 0xb7, 0x75, 0x9a, 0x3e, 0x88, 0xb4, 0x04, 0xca, 0xc3, 0xad, 0x60, 0x21, 0xc3, 0xd8, 0x98, 0x8d, 0x80, 0xe5, 0xed, 0x62, 0xc9, 0xf2, 0x50, 0xd6, 0xcd, 0x00, 0x10, 0x13, 0xe0, 0xa8, 0xb6, 0x8b, 0x7c, 0x0a, 0x2e, 0x8c, 0x86, 0x07, 0x27, 0x14, 0xd3, 0xb0, 0xbb, 0xe6, 0xeb, 0xfd, 0x53, 0xdd, 0x0d, 0xc3, 0xc5, 0x81, 0x73, 0xe0, 0xc0, 0xd8, 0xd6, 0xb8, 0x6a, 0x7f, 0x35, 0xe6, 0x47, 0xf8, 0xd3, 0x2b, 0x5d, 0x46, 0x7f, 0xaa, 0x96, 0xb7, 0x17, 0x58, 0x65, 0x02, 0x4f, 0xae, 0xac, 0x91, 0xaf, 0xa1, 0xde, 0x20, 0xdb, 0xd3, 0x61, 0x87, 0x17, 0x0b, 0x36, 0xd4, 0x0a, 0xe3, 0xdb, 0x9d, 0xc2, 0xc0, 0x70, 0x95, 0xf9, 0x07, 0x1a, 0x5c, 0x97, 0x8e, 0xa5, 0x9c, 0x78, 0x51, 0x6d, 0x51, 0x6e, 0x67, 0x7e, 0x68, 0x8a, 0x34, 0xfa, 0x8c, 0x97, 0xdf, 0xbb, 0x3d, 0xe8, 0x06, 0x3a, 0x22, 0x54, 0xb1, 0xaf, 0xa0, 0x7e, 0x85, 0x7a, 0xab, 0x5a, 0x3b, 0xc2, 0xdc, 0xec, 0x50, 0x5c, 0xc4, 0x53, 0xfd, 0xee, 0x81, 0x07, 0x69, 0x54, 0x8e, 0x5f, 0x1e, 0x42, 0xe0, 0x56, 0xb9, 0x2b, 0x2e, 0x8e, 0xe6, 0x62, 0x90, 0x95, 0x8c, 0x80, 0x4b, 0x68, 0x45, 0x05, 0xeb, 0x35, 0x11, 0x42, 0x93, 0x65, 0x4b, 0x76, 0x92, 0xda, 0xdc, 0x37, 0x36, 0x75, 0xae, 0x13, 0xe5, 0xdc, 0x64, 0x78, 0x69, 0x7a, 0x48, 0xd1, 0x8c, 0xc7, 0x84, 0xf2, 0xe5, 0xc9, 0x96, 0xb6, 0xf1, 0xdb, 0xfe, 0xe6, 0x66, 0xad, 0x39, 0x5d, 0xc3, 0x8c, 0xf3, 0x6a, 0x2c, 0xe3, 0x79, 0x76, 0x75, 0x02, 0x6d, 0xe7, 0x7d, 0x1f, 0xbd, 0x44, 0xbd, 0x9a, 0xd5, 0x99, 0x20, 0x86, 0x14, 0x1d, 0x15, 0x64, 0x7d, 0x12, 0xe3, 0x31, 0xb0, 0xed, 0x3e, 0xa4, 0x18, 0xb7, 0x17, 0xb1, 0x65, 0xb3, 0xb8, 0x51, 0x3d, 0x41, 0x0f, 0x85, 0x2e, 0x02, 0x4a, 0x98, 0xe8, 0x3d, 0xa5, 0xa5, 0xa9, 0x81, 0x80, 0x5a, 0xf8, 0x8c, 0xb5, 0xfb, 0x96, 0x6c, 0x28, 0xaa, 0xb2, 0xe4, 0xa0, 0xe5, 0x5c, 0x11, 0xd5, 0x50, 0x3c, 0x4d, 0xca, 0xb5, 0x84, 0x54, 0x5c, 0x49, 0x23, 0xa6, 0x1b, 0x31, 0x3c, 0x2c, 0x5a, 0x44, 0xd6, 0x1d, 0x82, 0x13, 0xd5, 0x23, 0xac, 0x26, 0x29, 0xba, 0x6e, 0x89, 0x45, 0xd9, 0xf4, 0x88, 0xd2, 0xd5, 0x53, 0xb6, 0xa5, 0x82, 0x1b, 0x34, 0xef, 0x9b, 0x2b, 0x2f, 0xb4, 0x64, 0xca, 0xab, 0x7f, 0x8d, 0xf3, 0x7f, 0x53, 0x5a, 0xef, 0xa1, 0xe4, 0x01, 0x2a, 0xa4, 0x07, 0x54, 0x3f, 0x7f, 0x68, 0x9f, 0x55, 0x90, 0x7b, 0xd4, 0xae, 0xe1, 0xb5, 0xe5, 0x7d, 0xa9, 0xfb, 0x72, 0xf8, 0x16, 0x5b, 0xa4, 0xaf, 0x49, 0xfa, 0x59, 0x1c, 0xa3, 0x4d, 0x81, 0x7b, 0x3f, 0x8c, 0xc7, 0xdc, 0xbf, 0x64, 0x75, 0x76, 0x4c, 0xed, 0x91, 0x3e, 0xd8, 0xdb, 0x4c, 0xb8, 0xa6, 0xf8, 0x9e, 0x0d, 0x0d, 0xd2, 0x2a, 0x5f, 0x79, 0xb0, 0x67, 0x59, 0xb2, 0xcb, 0x01, 0x0a, 0x61, 0xbb, 0x7d, 0xf3, 0xd0, 0x30, 0x1d, 0x5e, 0xf1, 0xe2, 0x03, 0xf2, 0xa2, 0xcb, 0x98, 0x85, 0x2f, 0x93, 0x2f, 0x31, 0x18, 0x4c, 0xe6, 0xaa, 0x15, 0x5f, 0xcd, 0xce, 0x58, 0xc6, 0x4b, 0x7e, 0x12, 0x7c, 0xbd, 0xad, 0x38, 0x32, 0x5f, 0xb6, 0x87, 0x44, 0x70, 0xf3, 0xc6, 0xeb, 0x91, 0x8b, 0x4b, 0xb4, 0x6f, 0x8b, 0xc0, 0x31, 0xa1, 0x39, 0x27, 0xee, 0xd4, 0xa5, 0x1c, 0xa6, 0x25, 0x80, 0x5a, 0xb7, 0xce, 0x31, 0x81, 0xd4, 0x05, 0x26, 0x17, 0xfa, 0x21, 0x68, 0xcc, 0xa5, 0xff, 0x73, 0x02, 0x43, 0xa4, 0x44, 0x8c, 0xe9, 0x23, 0xb3, 0xb6, 0x45, 0xc1, 0x03, 0x86, 0xd4, 0x58, 0xb8, 0x42, 0x54, 0xf9, 0xa8, 0x32, 0x7d, 0xd5, 0x55, 0xa7, 0xec, 0x5e, 0x7a, 0x3d, 0x60, 0xa9, 0xe4, 0x5c, 0x28, 0x17, 0x83, 0x05, 0xdc, 0x34, 0xc1, 0xcb, 0x4c, 0xdf, 0x12, 0x1f, 0xb6, 0xac, 0xcd, 0xd1, 0x3c, 0x86, 0x3a, 0xd4, 0x94, 0x99, 0xec, 0x42, 0x02, 0x6f, 0x51, 0x9f, 0x83, 0x58, 0x87, 0x62, 0x4b, 0x10, 0x71, 0xb1, 0x72, 0x9c, 0x0b, 0x6d, 0xeb, 0x75, 0xfa, 0x6e, 0xb5, 0xe8, 0x68, 0x10, 0x55, 0xbd, 0x0e, 0xee, 0x83, 0x17, 0x92, 0xed, 0x24, 0x9b, 0x14, 0x7d, 0x78, 0xd4, 0x04, 0x1b, 0x95, 0xd6, 0x36, 0x1a, 0x14, 0x22, 0x38, 0xa4, 0x0a, 0xca, 0xe3, 0xfc, 0x3a, 0xd6, 0x30, 0x05, 0x88, 0xe5, 0x4d, 0x08, 0xb1, 0x18, 0xf0, 0xb2, 0x3a, 0x2b, 0xec, 0x5c, 0xa6, 0xe5, 0x02, 0x90, 0xec, 0xb3, 0xf9, 0xc8, 0x28, 0x90, 0xf0, 0x78, 0x91, 0x27, 0xf4, 0x4f, 0xab, 0x3c, 0xce, 0xba, 0xbe, 0x48, 0x1e, 0xab, 0x86, 0x63, 0xae, 0x98, 0x2c, 0x67, 0x00, 0xc6, 0x75, 0x53, 0x29, 0xc7, 0x3a, 0xed, 0xe2, 0x42, 0x18, 0xac, 0xdd, 0xf2, 0x68, 0xd4, 0x55, 0xf1, 0x71, 0xe3, 0xe9, 0x37, 0xdd, 0x2c, 0xaa, 0x5d, 0x6a, 0xc2, 0x73, 0xa7, 0xe2, 0x97, 0x79, 0x42, 0x4d, 0xe5, 0x22, 0xca, 0x65, 0xcd, 0x1b, 0x10, 0x4a, 0x3f, 0xa5, 0x19, 0x77, 0x19, 0x2f, 0x6a, 0xf5, 0x93, 0x2a, 0x82, 0xce, 0xda, 0x19, 0xa9, 0xc5, 0xfb, 0xe7, 0xe8, 0x44, 0x03, 0x7e, 0x59, 0x96, 0x64, 0x95, 0xa1, 0x56, 0x9b, 0xc9, 0xba, 0x28, 0x10, 0xf0, 0xf6, 0xa7, 0x3e, 0xaa, 0x40, 0x9e, 0x13, 0x38, 0xa5, 0x7a, 0x9a, 0x92, 0x14, 0xff, 0xd7, 0xb3, 0x62, 0x3b, 0xf3, 0x38, 0x91, 0xb8, 0x99, 0x29, 0x52, 0xf6, 0x9f, 0x17, 0xc8, 0x18, 0xe9, 0x67, 0x8f, 0xde, 0x8a, 0xed, 0xfd, 0xd3, 0x2d, 0xbd, 0xa8, 0xc8, 0xb4, 0x3d, 0x28, 0x80, 0x1e, 0x7f, 0x1e, 0xad, 0xae, 0xce, 0x75, 0x1b, 0x49, 0x87, 0xe7, 0x2c, 0x21, 0x2b, 0xc3, 0x84, 0x90, 0xb1, 0xee, 0x05, 0x46, 0x21, 0x28, 0xfe, 0xa7, 0x5e, 0x91, 0x9f, 0x6f, 0x43, 0x6c, 0xb1, 0x98, 0xf2, 0x22, 0x84, 0x7d, 0x69, 0x8a, 0x28, 0x3f, 0x57, 0x67, 0xdf, 0x68, 0x2d, 0x33, 0xd3, 0xce, 0x77, 0x1b, 0x05, 0xbb, 0x6d, 0x4a, 0x86, 0x4a, 0xc5, 0x6a, 0xe9, 0x14, 0xcc, 0x68, 0xf8, 0x0c, 0xb5, 0x78, 0xa6, 0xa8, 0x31, 0x5a, 0x45, 0x42, 0x40, 0xdb, 0xf9, 0xbd, 0x46, 0x9e, 0x6d, 0x6b, 0x61, 0x1c, 0xc4, 0x2e, 0xfa, 0xea, 0xd3, 0xde, 0x9a, 0x3b, 0x8d, 0xeb, 0xff, 0xa5, 0xbe, 0x44, 0x70, 0x28, 0xfd, 0x77, 0x4d, 0x6c, 0xdb, 0x19, 0xea, 0x4a, 0x61, 0x68, 0x9d, 0x8e, 0xba, 0x2f, 0x16, 0xfb, 0x2c, 0xea, 0xef, 0x90, 0x4d, 0x2b, 0x84, 0x0a, 0x73, 0x3c, 0x05, 0xaa, 0x6c, 0x06, 0xca, 0x38, 0x6f, 0x31, 0xe6, 0x48, 0x53, 0x8d, 0xfe, 0xbc, 0xff, 0xb1, 0x5c, 0x8a, 0x22, 0xe2, 0x3f, 0xc0, 0x24, 0x36, 0x75, 0xc5, 0x5c, 0xf8, 0x2c, 0xe1, 0x83, 0x4f, 0x06, 0xff, 0x68, 0x1b, 0x6b, 0xb2, 0xe6, 0x20, 0x23, 0x77, 0x13, 0x66, 0x24, 0x3a, 0xbb, 0xdf, 0xa8, 0x1b, 0x0d, 0x4b, 0x83, 0x71, 0x93, 0x59, 0xb4, 0x0f, 0x68, 0x0f, 0x3a, 0xc7, 0xa5, 0x6b, 0x29, 0x2d, 0x1c, 0x4b, 0xfc, 0x9d, 0x49, 0x8a, 0x2d, 0x80, 0x85, 0x6c, 0x03, 0xca, 0x7d, 0x3c, 0xac, 0xc7, 0xe3, 0x33, 0x8b, 0x18, 0x63, 0x9c, 0xd3, 0xf9, 0xd9, 0x36, 0x55, 0xc5, 0xc1, 0xda, 0x96, 0xbb, 0xee, 0x5d, 0x25, 0x02, 0x80, 0xb8, 0x2b, 0xeb, 0x10, 0x66, 0x44, 0x77, 0x2d, 0x0e, 0x8d, 0x19, 0x0c, 0x62, 0xff, 0xbc, 0x7b, 0x47, 0xfb, 0x08, 0x17, 0x36, 0x25, 0xe1, 0xbf, 0xe2, 0x76, 0x31, 0x48, 0x1b, 0x8d, 0xe8, 0x72, 0xf2, 0x46, 0x41, 0x1b, 0x1e, 0x8e, 0x46, 0xb3, 0x9e, 0x76, 0x96, 0xf0, 0xa0, 0x86, 0x66, 0xc3, 0xa2, 0x53, 0xc6, 0x8a, 0xd7, 0x53, 0x25, 0x87, 0xcc, 0xf1, 0x18, 0x91, 0x4b, 0xdd, 0x57, 0x09, 0x80, 0xa6, 0x08, 0x10, 0x5a, 0x8a, 0x41, 0xf7, 0x34, 0x8d, 0xc8, 0xf7, 0xb5, 0xc8, 0x1d, 0x23, 0xf4, 0x04, 0xba, 0x9a, 0xe0, 0x87, 0x99, 0x01, 0xe0, 0x2e, 0xf7, 0x31, 0xb6, 0xbc, 0x58, 0x2c, 0xa9, 0x72, 0xcb, 0x56, 0xe3, 0xe0, 0x6f, 0xe2, 0x18, 0xfa, 0x36, 0x8a, 0x68, 0x6e, 0xe9, 0x83, 0x87, 0x35, 0x6c, 0xb0, 0x1b, 0x68, 0x44, 0x16, 0x65, 0x56, 0x56, 0x90, 0x24, 0xd3, 0xf1, 0xc3, 0xb6, 0xd3, 0x0f, 0x55, 0x81, 0x37, 0xd8, 0x5a, 0x91, 0xe6, 0x68, 0x0f, 0x82, 0x20, 0xd2, 0xcb, 0xa1, 0x0f, 0x65, 0x32, 0x4e, 0x9f, 0x2e, 0xac, 0xa5, 0x90, 0xbd, 0x16, 0x5d, 0xca, 0x2c, 0xb7, 0xef, 0xf0, 0x5e, 0x75, 0xfb, 0x37, 0x85, 0x48, 0xe8, 0x79, 0xe7, 0xf0, 0xcc, 0x85, 0xe1, 0xe3, 0x8b, 0xba, 0x2c, 0x8a, 0x42, 0xd4, 0x5f, 0xac, 0xe6, 0x05, 0xb5, 0x2b, 0x28, 0x48, 0x11, 0xee, 0x9c, 0xf2, 0x3f, 0x1e, 0x1b, 0x89, 0x7d, 0x95, 0x66, 0xda, 0x3a, 0x93, 0x0b, 0x46, 0x1d, 0xb3, 0x8d, 0x5d, 0x49, 0x1e, 0xbf, 0xae, 0xe0, 0xff, 0x71, 0xdc, 0xc5, 0x37, 0x4e, 0xf5, 0xa7, 0x51, 0x05, 0x00, 0x3b, 0xb8, 0xa7, 0xd5, 0xc8, 0x27, 0x50, 0x32, 0xe9, 0x62, 0x0a, 0x0a, 0x8f, 0x24, 0xee, 0x20, 0x45, 0x58, 0x8d, 0xd5, 0xb8, 0x8b, 0x8e, 0x3e, 0x76, 0xa2, 0x98, 0x7a, 0xf6, 0xc8, 0x72, 0x43, 0xd9, 0xab, 0x68, 0xc2, 0x6f, 0xe8, 0xf1, 0xa8, 0x7d, 0xc3, 0x90, 0x7a, 0x3d, 0x1c, 0xf8, 0x2c, 0xa7, 0x9f, 0x73, 0xf2, 0xef, 0x3a, 0x84, 0x53, 0x4f, 0xd4, 0xcb, 0x7f, 0x06, 0x3c, 0x2a, 0xe2, 0xa1, 0x5f, 0x26, 0xf9, 0x79, 0xbf, 0x90, 0x65, 0x7d, 0x20, 0x64, 0x3e, 0x31, 0x84, 0xf1, 0xa9, 0xf7, 0x5a, 0x3a, 0xad, 0x8e, 0xf3, 0x9d, 0x42, 0xd8, 0x35, 0xb2, 0xab, 0xe0, 0x93, 0x76, 0x06, 0x1b, 0x3d, 0xa9, 0x22, 0xee, 0x93, 0x74, 0x90, 0x71, 0xe0, 0x4f, 0xfd, 0x73, 0x45, 0x22, 0xbf, 0xbe, 0xf3, 0xaa, 0xad, 0x9b, 0x9d, 0x1f, 0x34, 0x99, 0x2e, 0x14, 0xa7, 0x8b, 0xb7, 0x9e, 0xd7, 0xd0, 0xab, 0xb8, 0xe4, 0xd7, 0x4e, 0xe6, 0x52, 0xe1, 0x6b, 0x19, 0x5f, 0x09, 0x45, 0xd3, 0x94, 0x82, 0xd1, 0x8b, 0x9b, 0x21, 0x22, 0x53, 0x50, 0x1b, 0x25, 0xb8, 0x1a, 0x0f, 0x8e, 0xea, 0x7c, 0x47, 0x12, 0x1d, 0xe7, 0x3b, 0xd7, 0x2e, 0xd3, 0x56, 0x29, 0x8a, 0x0e, 0xfd, 0x6e, 0x4c, 0x53, 0xce, 0x5c, 0xa5, 0x1e, 0x25, 0x69, 0x81, 0xbf, 0xe5, 0x83, 0x67, 0xad, 0x75, 0x02, 0xa1, 0x1e, 0x08, 0xdb, 0x9e, 0xd4, 0x22, 0x16, 0x94, 0x3a, 0x58, 0x82, 0x69, 0xaf, 0x57, 0xa7, 0xd4, 0x22, 0x27, 0xfc, 0xc0, 0xdf, 0xb1, 0x5a, 0xf1, 0xa8, 0x7f, 0xb1, 0xe9, 0x08, 0xc4, 0xfa, 0x0d, 0xe4, 0x9c, 0x6c, 0x04, 0x53, 0x94, 0xf3, 0x60, 0xb0, 0x6d, 0xde, 0x80, 0xed, 0x1d, 0xd7, 0xb4, 0x29, 0x17, 0x19, 0xa3, 0x85, 0xcc, 0xdd, 0xea, 0x34, 0x72, 0x15, 0x06, 0xd2, 0x04, 0x5d, 0x74, 0xf7, 0x8a, 0x2f, 0x16, 0x0b, 0x9a, 0x56, 0xd9, 0x5c, 0x1f, 0xa5, 0x95, 0x6d, 0x59, 0xe8, 0x35, 0x92, 0x25, 0x1b, 0x17, 0xb9, 0x7f, 0xda, 0xb6, 0x8b, 0x45, 0x19, 0x86, 0xb4, 0x3d, 0x15, 0x1f, 0x7e, 0x5a, 0x8a, 0x9e, 0xa5, 0x3b, 0x27, 0x48, 0x67, 0xf5, 0x3f, 0x71, 0xda, 0x12, 0xc1, 0x9d, 0x82, 0xda, 0x6a, 0xe4, 0x23, 0xd1, 0x39, 0x9b, 0xd4, 0x80, 0x24, 0x30, 0x55, 0x78, 0x09, 0x56, 0xa2, 0x95, 0xe7, 0x62, 0xc8, 0x80, 0x4e, 0xf5, 0xf8, 0x77, 0x14, 0xdc, 0xda, 0x51, 0x4a, 0x34, 0x23, 0xbc, 0x6e, 0xd2, 0x6a, 0xca, 0xe2, 0xe2, 0x38, 0xac, 0x9d, 0xcd, 0x5e, 0xbd, 0x21, 0x61, 0x8b, 0xc2, 0xad, 0x2c, 0x1d, 0x6f, 0xb3, 0x28, 0x38, 0x2e, 0x8c, 0x9e, 0x15, 0x1d, 0x6b, 0x44, 0x9d, 0x55, 0x90, 0xa8, 0x37, 0x72, 0xbe, 0xd2, 0xde, 0x50, 0xee, 0x25, 0x76, 0x12, 0x45, 0x87, 0x60, 0x69, 0x44, 0xc2, 0x4c, 0x13, 0x3f, 0x29, 0x4e, 0xa1, 0x10, 0x7e, 0x35, 0x7e, 0x0c, 0x13, 0x18, 0x2d, 0x36, 0x30, 0x31, 0xd2, 0xb3, 0xb5, 0xee, 0xf4, 0x7e, 0x00, 0x46, 0x81, 0x5d, 0x11, 0x4a, 0x12, 0x14, 0xec, 0xfc, 0x71, 0xd8, 0x3f, 0x63, 0x59, 0x06, 0x45, 0xdf, 0x7c, 0x15, 0xea, 0xbb, 0xca, 0xca, 0x30, 0x01, 0xf1, 0xaa, 0xd1, 0x92, 0x20, 0xb5, 0x26, 0x75, 0x11, 0x51, 0x47, 0x70, 0x46, 0x85, 0x74, 0xd5, 0x93, 0x67, 0xb4, 0x9f, 0xdc, 0xd8, 0xbb, 0xbd, 0x20, 0x6e, 0x11, 0xae, 0xb6, 0xb2, 0x71, 0x4e, 0xd7, 0x8c, 0x70, 0xf0, 0x5d, 0xfb, 0x5f, 0xac, 0xca, 0x09, 0x71, 0xfb, 0x8c, 0xff, 0x21, 0x81, 0x80, 0xd5, 0xce, 0x29, 0xb4, 0xec, 0xa8, 0x77, 0x71, 0x00, 0xd0, 0x1a, 0x79, 0x58, 0xbb, 0xc1, 0x8d, 0x3f, 0xd8, 0x30, 0x32, 0xb8, 0x72, 0x93, 0xb5, 0x6e, 0xd7, 0x12, 0x6d, 0xea, 0xba, 0xa5, 0x40, 0x08, 0xd6, 0x2a, 0x68, 0xac, 0xd4, 0xb5, 0x77, 0xb1, 0x6f, 0x27, 0x99, 0x22, 0xd6, 0x02, 0x1a, 0xad, 0x51, 0x7b, 0x28, 0x54, 0x28, 0xd1, 0xd9, 0x66, 0xc1, 0xde, 0x70, 0xae, 0x08, 0xec, 0xdc, 0xea, 0x13, 0xc9, 0x81, 0x7f, 0x07, 0x1e, 0x3b, 0x6a, 0x35, 0xfc, 0xa0, 0x7a, 0x89, 0xb8, 0x86, 0xbc, 0x25, 0xf9, 0xc6, 0x37, 0x49, 0x0f, 0x3f, 0xda, 0x76, 0x86, 0x1d, 0xb3, 0xd3, 0xfb, 0x5b, 0x62, 0xcf, 0x2f, 0x86, 0xcc, 0x08, 0x5a, 0xc4, 0x14, 0x6c, 0xc2, 0x16, 0xc7, 0x9d, 0x8b, 0xda, 0x56, 0x9a, 0xd1, 0x94, 0xca, 0x9d, 0xf4, 0xed, 0xb3, 0x3f, 0x33, 0xfc, 0x61, 0xe2, 0x7d, 0xc5, 0x57, 0x50, 0x83, 0xff, 0xfd, 0xa0, 0x12, 0x1b, 0x95, 0x5a, 0xa0, 0x81, 0x70, 0xdb, 0x25, 0x1d, 0x62, 0xfa, 0x2c, 0x1a, 0x73, 0xeb, 0x29, 0xed, 0xd7, 0x64, 0x0d, 0x96, 0x21, 0xff, 0x18, 0x22, 0xb3, 0xe0, 0xee, 0x75, 0x79, 0x97, 0xee, 0x46, 0xd7, 0x47, 0xbf, 0x6b, 0xdf, 0x08, 0x2b, 0x57, 0xc8, 0x8b, 0x31, 0xe1, 0x9b, 0xfd, 0x55, 0x47, 0x30, 0x2d, 0x3b, 0x72, 0x59, 0xf0, 0x74, 0x7b, 0x5d, 0xc5, 0x98, 0x6f, 0xa8, 0xb5, 0x95, 0x4f, 0xc0, 0x7d, 0x46, 0x5b, 0x7b, 0xef, 0x48, 0x90, 0x70, 0x96, 0x09, 0x70, 0xab, 0x99, 0x21, 0x01, 0xa5, 0xe1, 0xe6, 0x18, 0x73, 0x7e, 0x3a, 0xd7, 0x3d, 0x47, 0xa8, 0x75, 0xf2, 0xc1, 0xb0, 0x3d, 0x3a, 0x43, 0x5e, 0xda, 0xac, 0x57, 0x22, 0xd1, 0x42, 0x62, 0xdb, 0x4f, 0x09, 0x88, 0x35, 0x25, 0x1d, 0xca, 0x35, 0x11, 0xd5, 0x71, 0x12, 0x3f, 0x3b, 0xb0, 0x47, 0x0f, 0xbf, 0x85, 0xe6, 0x19, 0x2c, 0xe0, 0x2f, 0x6f, 0xda, 0x07, 0x61, 0x21, 0x26, 0x39, 0xd0, 0x07, 0x1f, 0x91, 0x38, 0xba, 0x82, 0x2e, 0x51, 0xe4, 0xe9, 0x91, 0xa3, 0xba, 0x3f, 0x46, 0x9c, 0xc6, 0x77, 0xc7, 0xe0, 0xea, 0x7d, 0x9d, 0xe0, 0xa2, 0x6d, 0xc8, 0xae, 0x89, 0x04, 0x61, 0x10, 0x1f, 0x54, 0x7e, 0xd3, 0xc9, 0xbb, 0x56, 0x61, 0x19, 0x15, 0xa6, 0x96, 0x50, 0x31, 0x53, 0xd0, 0x21, 0x82, 0x50, 0x45, 0xb8, 0x17, 0xc2, 0x9a, 0xfb, 0xcd, 0x62, 0xb1, 0x10, 0xc4, 0x23, 0xc2, 0x1f, 0x0f, 0x16, 0xad, 0x59, 0xb0, 0x8a, 0x8e, 0x39, 0xc3, 0x77, 0x92, 0x09, 0xf9, 0x1d, 0x0a, 0xa9, 0x48, 0xe8, 0xbe, 0x8c, 0xe1, 0x97, 0x84, 0x03, 0x63, 0x9d, 0x11, 0xbe, 0x4e, 0xc7, 0x0e, 0x8f, 0xba, 0x20, 0x6f, 0x72, 0x49, 0x12, 0x00, 0xcb, 0x5a, 0xcd, 0x40, 0xee, 0x7f, 0xed, 0x73, 0xe4, 0x32, 0x56, 0xf3, 0x6d, 0xc3, 0x63, 0xc7, 0x41, 0x95, 0x41, 0x76, 0x9b, 0x8a, 0x95, 0x1d, 0xf8, 0xbc, 0x65, 0xc0, 0x1c, 0x6e, 0x35, 0xde, 0x57, 0x42, 0x70, 0x48, 0x06, 0xac, 0x0a, 0x33, 0x5c, 0xa6, 0x64, 0x8b, 0x63, 0xa5, 0x70, 0x8a, 0x3d, 0xcc, 0x15, 0x8a, 0xb0, 0x60, 0xd5, 0x17, 0xe2, 0x7d, 0xad, 0x49, 0x60, 0x07, 0x3c, 0x50, 0x65, 0xe2, 0x28, 0x51, 0x5a, 0x66, 0xbe, 0x71, 0x99, 0x0d, 0xd8, 0x2f, 0x76, 0x6f, 0x04, 0xf6, 0x80, 0x71, 0xe2, 0xf2, 0x04, 0xb9, 0xce, 0x24, 0xd3, 0x65, 0xbf, 0xb1, 0x45, 0xfc, 0x6f, 0x80, 0x7e, 0xa4, 0xbd, 0x03, 0xf0, 0x96, 0x4f, 0x55, 0x21, 0xd0, 0x7b, 0x86, 0xaf, 0x09, 0x68, 0x33, 0x91, 0xea, 0x70, 0x59, 0x9f, 0x7b, 0xc9, 0x6a, 0x55, 0xdc, 0x65, 0xa1, 0xd4, 0x35, 0x16, 0x93, 0x29, 0xef, 0xf6, 0x08, 0xd2, 0x25, 0x06, 0x08, 0x7e, 0x55, 0x15, 0x39, 0x15, 0x5c, 0xe4, 0x68, 0xf8, 0xa1, 0x87, 0x65, 0x8a, 0x90, 0x0e, 0x14, 0xef, 0x4a, 0x65, 0xc1, 0x14, 0x9a, 0x79, 0xb4, 0xef, 0x2c, 0x9c, 0x05, 0x08, 0xf9, 0x2b, 0xb2, 0x38, 0x06, 0x6e, 0xef, 0xb0, 0x4e, 0xbf, 0xbd, 0x3e, 0xfc, 0xef, 0xbe, 0xcc, 0xde, 0xe5, 0x48, 0x2a, 0x17, 0x88, 0xb8, 0x0d, 0x14, 0xe0, 0x09, 0x57, 0xc1, 0x77, 0xa5, 0x98, 0xfc, 0x06, 0x7a, 0xd5, 0x4a, 0x4d, 0x51, 0x89, 0xc8, 0x43, 0x5b, 0xea, 0x65, 0x6f, 0x0d, 0x6d, 0x4f, 0x96, 0x2e, 0x8c, 0xab, 0x96, 0x2f, 0xc7, 0x89, 0x92, 0xba, 0xe9, 0x17, 0x4f, 0x8d, 0x8c, 0x14, 0xde, 0x89, 0xdf, 0x88, 0x7c, 0x06, 0xa7, 0xb3, 0xb6, 0x6a, 0x84, 0x43, 0xd1, 0xfa, 0x76, 0xca, 0x68, 0xf0, 0x9f, 0x6e, 0x57, 0xcd, 0x4b, 0xe3, 0xd8, 0xf0, 0x2d, 0x96, 0xec, 0x68, 0xeb, 0x2b, 0xfd, 0x07, 0xde, 0x2a, 0xc1, 0xb7, 0x13, 0xf5, 0x61, 0x11, 0x95, 0xfe, 0xdb, 0x2c, 0xee, 0x36, 0xa5, 0xb3, 0xeb, 0xc9, 0x93, 0x3b, 0xa0, 0x08, 0xfa, 0xd3, 0xac, 0xa6, 0x16, 0xdc, 0xbe, 0x28, 0xa9, 0x1b, 0x58, 0x97, 0xe5, 0x0c, 0xd3, 0x78, 0x8c, 0x79, 0xa4, 0xfe, 0x56, 0x4c, 0xdd, 0x7d, 0x93, 0xa2, 0xf7, 0x22, 0x11, 0x20, 0xce, 0xe2, 0x40, 0x8a, 0xed, 0xb0, 0x94, 0x91, 0x0c, 0xf3, 0x2b, 0xed, 0xd7, 0x37, 0xb0, 0xac, 0xf1, 0x22, 0x7f, 0xca, 0x39, 0xaa, 0x09, 0x01, 0x4c, 0x86, 0x7a, 0xe2, 0x4b, 0xe2, 0x9a, 0x25, 0xde, 0x57, 0xf1, 0x3e, 0x78, 0x1a, 0x2f, 0x31, 0xdd, 0x74, 0xcb, 0xa6, 0xe2, 0x72, 0xe9, 0x40, 0x74, 0xdd, 0x81, 0x2b, 0xdc, 0x6c, 0xbe, 0xf4, 0x41, 0x39, 0xa4, 0x9e, 0x6f, 0x72, 0xf6, 0xf2, 0xd7, 0x51, 0x57, 0x16, 0xd6, 0x4e, 0xaf, 0x61, 0x3a, 0x93, 0xd0, 0x6e, 0x02, 0xb0, 0x5a, 0x6f, 0x65, 0x90, 0xdb, 0xc4, 0x16, 0xab, 0x3b, 0xcd, 0xc7, 0x7e, 0x58, 0xfc, 0xec, 0x38, 0xed, 0x2e, 0xc1, 0xb7, 0xb8, 0x3b, 0x8e, 0xb2, 0xdc, 0xcb, 0x29, 0x38, 0x84, 0x6c, 0xbd, 0x59, 0xc9, 0xe2, 0xcb, 0x23, 0xd6, 0xbe, 0x6e, 0xd0, 0x49, 0x33, 0xe3, 0x3d, 0xdd, 0x24, 0x48, 0x9e, 0x46, 0x81, 0xa4, 0x71, 0x5d, 0xd4, 0x28, 0xb0, 0x7d, 0x17, 0xb5, 0x4b, 0x2d, 0xc9, 0x9e, 0xd5, 0xff, 0x41, 0xae, 0x7d, 0xb8, 0x41, 0x6d, 0x41, 0xb0, 0xce, 0x9f, 0x5e, 0x7c, 0x3f, 0x0e, 0x0b, 0xcb, 0x95, 0x89, 0x66, 0x8e, 0x0a, 0x2d, 0xaf, 0x5c, 0xed, 0xe3, 0xb4, 0x14, 0xac, 0x2a, 0x8c, 0xc4, 0x33, 0x17, 0x88, 0xc9, 0x74, 0x99, 0x67, 0x38, 0x47, 0x02, 0xc9, 0x7d, 0x75, 0xc3, 0xe7, 0x42, 0x0f, 0x77, 0x80, 0x93, 0x05, 0x24, 0x17, 0x3f, 0xf3, 0xbd, 0x5b, 0x81, 0x3e, 0xeb, 0xe7, 0xdf, 0x60, 0x0c, 0x2b, 0x53, 0x80, 0x7d, 0xaa, 0xa9, 0x46, 0x14, 0x67, 0x28, 0xed, 0xf1, 0x99, 0x74, 0x9a, 0x77, 0xa6, 0xb3, 0xec, 0x95, 0x4f, 0xef, 0xd4, 0x4a, 0x28, 0xbb, 0xa7, 0x68, 0x4c, 0x1a, 0x71, 0x98, 0x4e, 0x9c, 0x8d, 0x9e, 0x73, 0xca, 0x72, 0xde, 0x1e, 0xc4, 0xd0, 0x1f, 0x8b, 0x29, 0xdc, 0x90, 0xc0, 0x37, 0xe7, 0x08, 0xc1, 0x34, 0x36, 0x92, 0x04, 0x0c, 0x0e, 0x29, 0x24, 0x3b, 0x0e, 0xc0, 0xd9, 0xed, 0xc2, 0x86, 0x28, 0x64, 0x74, 0x67, 0xd7, 0x9b, 0x45, 0xd6, 0x24, 0x29, 0x7d, 0xca, 0xb7, 0x67, 0x20, 0x06, 0xd4, 0xd5, 0xc2, 0x9e, 0xd5, 0xba, 0x9b, 0xb7, 0xd8, 0x0b, 0xde, 0x8e, 0xb5, 0x8e, 0x47, 0xbc, 0x33, 0x3f, 0xf3, 0xb8, 0x7b, 0xf3, 0x75, 0x9d, 0xcc, 0x3b, 0x26, 0x2d, 0x71, 0x8b, 0xbc, 0x16, 0xf0, 0x9c, 0x1f, 0x75, 0x85, 0x0e, 0x78, 0x99, 0xce, 0x52, 0x8a, 0x09, 0xc8, 0xc7, 0x45, 0xc8, 0xfa, 0x23, 0x98, 0xd7, 0xf0, 0x15, 0x88, 0xfc, 0xeb, 0x29, 0x7f, 0xc2, 0xd7, 0xeb, 0xe6, 0xc1, 0x7d, 0x4f, 0xf5, 0x1f, 0xfa, 0x50, 0xca, 0x57, 0x70, 0xd8, 0xb9, 0x39, 0xfb, 0xe0, 0xe4, 0x33, 0xe7, 0xd8, 0x0b, 0xce, 0x20, 0x49, 0xa5, 0x7b, 0xe9, 0xb9, 0x2f, 0x90, 0xd1, 0xcf, 0xc4, 0x8e, 0xe3, 0xb7, 0xee, 0xa5, 0x1e, 0xc8, 0xbc, 0x7a, 0x25, 0x64, 0x14, 0x27, 0x37, 0x20, 0x4b, 0x83, 0x60, 0x25, 0xf3, 0xa5, 0xf1, 0xd7, 0xf4, 0xa3, 0x2f, 0xb4, 0xdf, 0x9f, 0x48, 0x7e, 0x7e, 0x05, 0x8b, 0x9c, 0xb0, 0x0e, 0xd7, 0xbe, 0x73, 0x89, 0x54, 0xc0, 0x43, 0xda, 0x62, 0xd1, 0xa3, 0x43, 0xcf, 0xd4, 0xf9, 0x62, 0x4d, 0x06, 0x9e, 0xfb, 0x23, 0xe1, 0x36, 0xf8, 0x22, 0x41, 0x3d, 0xae, 0xdb, 0xc6, 0xe3, 0x62, 0x0f, 0x79, 0x1a, 0x0c, 0x67, 0xb2, 0xed, 0x5a, 0x65, 0x39, 0x13, 0xf8, 0x9b, 0xab, 0xc4, 0x0f, 0x1b, 0x1f, 0xcb, 0x0c, 0x2e, 0x0a, 0xdd, 0xa2, 0x49, 0x60, 0x29, 0x12, 0x3c, 0xfc, 0x30, 0xaa, 0xad, 0x42, 0xd7, 0x8b, 0xc5, 0x03, 0xba, 0xb0, 0x29, 0xa0, 0xc4, 0x2c, 0x2c, 0x73, 0xfd, 0xb3, 0x43, 0x6a, 0xa2, 0x5c, 0xb9, 0xf5, 0x7b, 0xa5, 0xa3, 0x23, 0x69, 0xb8, 0x17, 0x08, 0x3f, 0xed, 0x99, 0x61, 0xd2, 0x8f, 0xd6, 0x7b, 0x54, 0xe3, 0x95, 0x50, 0xdd, 0x66, 0xea, 0xf3, 0x4b, 0x57, 0xac, 0x2f, 0x4c, 0x75, 0x2a, 0x6b, 0xb9, 0x0a, 0x1a, 0xd1, 0x26, 0x28, 0xd2, 0xb0, 0xb7, 0x33, 0xbb, 0x1e, 0x35, 0x9f, 0x02, 0xe1, 0x60, 0xfb, 0x90, 0x90, 0x87, 0x2f, 0x3d, 0xf5, 0x57, 0x02, 0x40, 0xb6, 0xf1, 0xdf, 0xea, 0x34, 0x3f, 0xd8, 0x95, 0xb4, 0x87, 0xeb, 0xd7, 0xbd, 0x40, 0x84, 0xfb, 0xc0, 0x25, 0x44, 0xb1, 0xff, 0x89, 0x01, 0x04, 0xa7, 0xea, 0x0e, 0x8d, 0x3f, 0xc8, 0xbc, 0xe6, 0x46, 0xb7, 0x20, 0x62, 0x18, 0xb4, 0x17, 0xfb, 0x12, 0xb5, 0x88, 0x8c, 0xf6, 0x84, 0xe9, 0x41, 0x91, 0xcc, 0x05, 0x4b, 0x9b, 0x74, 0xfc, 0xd8, 0xde, 0x2d, 0x8b, 0x42, 0x9b, 0x47, 0x8d, 0x86, 0x29, 0xc9, 0xc2, 0xf9, 0xdf, 0xc0, 0xd0, 0x36, 0x34, 0xd7, 0x87, 0x5b, 0x25, 0x28, 0x69, 0x75, 0xd7, 0x52, 0x6a, 0x38, 0x7e, 0xcc, 0xf4, 0xf4, 0x7d, 0x79, 0x2e, 0xc4, 0xcf, 0x7c, 0x7e, 0x09, 0xa5, 0x4d, 0x4d, 0x16, 0x50, 0x0c, 0x0a, 0x2d, 0x62, 0x16, 0x71, 0xab, 0x10, 0xd7, 0x0d, 0x7f, 0xdb, 0xdf, 0xfb, 0xe0, 0x70, 0x37, 0xf2, 0x40, 0xcc, 0xf5, 0x80, 0x7b, 0xa3, 0x0e, 0x96, 0x55, 0x03, 0x6c, 0x47, 0x23, 0x35, 0x40, 0xcd, 0xc8, 0xe4, 0x9a, 0xcd, 0xe3, 0x80, 0x37, 0xdc, 0x47, 0xe5, 0x99, 0x41, 0xac, 0x38, 0x5d, 0xfc, 0xa4, 0x12, 0xca, 0x08, 0xd0, 0xe1, 0xa6, 0xde, 0x53, 0x8b, 0x4d, 0x3a, 0x87, 0x54, 0x04, 0x21, 0xef, 0x01, 0x8a, 0x23, 0x6d, 0x3d, 0xf0, 0xde, 0xb5, 0x3d, 0xab, 0xc3, 0x02, 0xa0, 0xe8, 0x1d, 0x08, 0x99, 0x1f, 0x4e, 0x29, 0x4f, 0xeb, 0x5c, 0xeb, 0x84, 0x19, 0xad, 0xaa, 0x75, 0xfe, 0x0f, 0x8a, 0x02, 0x0e, 0xfc, 0xb0, 0x0f, 0xab, 0x1b, 0xb2, 0x2a, 0x3b, 0x09, 0x4b, 0x6e, 0x7d, 0x5a, 0x54, 0xa7, 0x1d, 0xdb, 0xef, 0xb7, 0x86, 0x1a, 0x06, 0x38, 0xf7, 0x29, 0xf4, 0x62, 0xd9, 0x9e, 0x81, 0x2f, 0x50, 0xde, 0x14, 0xbe, 0x10, 0x9c, 0x24, 0xf5, 0x72, 0x9c, 0xf0, 0x6b, 0xc6, 0xbd, 0x70, 0x85, 0xeb, 0x36, 0x8b, 0xdf, 0x1e, 0x20, 0x8a, 0xed, 0x10, 0x35, 0xcd, 0xe2, 0x3b, 0xd7, 0xbc, 0xd0, 0x75, 0x54, 0x01, 0x11, 0xc6, 0x68, 0xf5, 0xe7, 0x77, 0x03, 0x57, 0x5f, 0x6b, 0x4d, 0x44, 0x7b, 0xb3, 0xe7, 0x63, 0x8f, 0x5c, 0x74, 0x61, 0xec, 0x8b, 0x59, 0x9d, 0xbc, 0xcd, 0xc0, 0x24, 0x2d, 0xa8, 0xe3, 0xdf, 0xd2, 0x76, 0x87, 0x0b, 0x46, 0x73, 0xc6, 0xea, 0x12, 0x14, 0x12, 0xb8, 0xd0, 0x9a, 0x77, 0xe1, 0x91, 0xe8, 0x20, 0x71, 0x7d, 0x91, 0x1d, 0xcc, 0xb9, 0x36, 0x64, 0x9f, 0x8e, 0x0f, 0x15, 0x16, 0xc7, 0xc7, 0x02, 0x50, 0x5a, 0x8d, 0x6e, 0x10, 0x4b, 0x68, 0x15, 0xb5, 0xce, 0xca, 0x6d, 0x6c, 0xac, 0x69, 0x2c, 0xa4, 0xe7, 0x4a, 0x0a, 0xc2, 0xa1, 0x1e, 0xc8, 0x16, 0x3a, 0xd2, 0x71, 0x0e, 0xb9, 0x62, 0xe0, 0xaa, 0x6d, 0xee, 0x82, 0x30, 0xd4, 0x0f, 0x5d, 0x21, 0xbb, 0x6b, 0x51, 0x6b, 0xa7, 0x87, 0x9e, 0xe0, 0x74, 0xdd, 0xa7, 0xe7, 0x3c, 0x2f, 0xf6, 0x72, 0x7a, 0x1a, 0x7f, 0x30, 0x6f, 0xee, 0x29, 0x03, 0xc5, 0xbd, 0x8a, 0xb4, 0x73, 0xb2, 0xf2, 0xe6, 0xe0, 0xa4, 0xac, 0x48, 0x4b, 0xeb, 0x80, 0x0f, 0x6a, 0x73, 0x7c, 0xa4, 0x51, 0x0f, 0xf5, 0x99, 0x96, 0x0f, 0xc8, 0xe2, 0xb3, 0x14, 0xe5, 0x42, 0xab, 0x23, 0x0f, 0x03, 0xf1, 0xf9, 0xdd, 0xea, 0x85, 0x9e, 0x05, 0x6a, 0x60, 0x3d, 0xd9, 0x18, 0x12, 0x33, 0x12, 0x5f, 0xaa, 0x66, 0xcd, 0x75, 0xd6, 0xd8, 0xd3, 0x8d, 0x4b, 0x7c, 0x1d, 0x4f, 0x67, 0x48, 0x98, 0x85, 0x15, 0x8b, 0x25, 0x17, 0xf2, 0x81, 0xe4, 0x39, 0xae, 0x24, 0xb2, 0xe3, 0xb4, 0x46, 0xf0, 0x81, 0x0d, 0xdd, 0x87, 0xed, 0x81, 0x9e, 0x28, 0x9a, 0x00, 0xcd, 0xd9, 0x12, 0x41, 0x53, 0xad, 0xa2, 0xa9, 0x11, 0xd2, 0x53, 0x6e, 0x74, 0xd1, 0x1d, 0xfc, 0x49, 0x12, 0x58, 0x98, 0xd3, 0x9f, 0x73, 0x43, 0x1b, 0x29, 0xe8, 0xe1, 0x88, 0x50, 0x6f, 0x9a, 0xaf, 0x1f, 0x73, 0x81, 0x6c, 0xd6, 0xc2, 0x73, 0x32, 0xed, 0x88, 0x42, 0x9f, 0x55, 0x7e, 0x13, 0x54, 0x01, 0x5f, 0x05, 0x03, 0xa5, 0x9c, 0x14, 0xc9, 0xbe, 0x50, 0x3c, 0xbf, 0xd2, 0x76, 0xe1, 0xcc, 0xf9, 0x5a, 0x6e, 0xbd, 0x9c, 0x4d, 0x3d, 0x97, 0x7d, 0x9d, 0xb7, 0x2b, 0xf7, 0xc4, 0xbc, 0xec, 0x88, 0xe0, 0x45, 0xfe, 0x8c, 0x63, 0x47, 0x8f, 0x4b, 0x0c, 0xdb, 0x6a, 0x36, 0x16, 0x9d, 0xc9, 0x6e, 0xaf, 0x51, 0x6b, 0x86, 0xab, 0xcd, 0xe7, 0x8a, 0x7a, 0x13, 0x40, 0x40, 0x57, 0xbd, 0xb9, 0xad, 0xc3, 0x9e, 0xeb, 0xdb, 0x32, 0xa6, 0x14, 0xda, 0x04, 0x06, 0xb2, 0x05, 0xb6, 0x95, 0x51, 0x86, 0x5a, 0x72, 0xa1, 0x1d, 0x44, 0xeb, 0xcb, 0x1d, 0x07, 0x9e, 0x05, 0xb7, 0xa0, 0xde, 0x65, 0x7a, 0xf0, 0x59, 0xf2, 0x1b, 0x70, 0xf7, 0x01, 0x72, 0x20, 0x05, 0xbf, 0xc6, 0xc0, 0x92, 0x0a, 0x4a, 0x43, 0x19, 0x85, 0xe7, 0x81, 0x61, 0xeb, 0x3c, 0x2c, 0xa2, 0xa3, 0xe4, 0x05, 0xe9, 0x95, 0xf7, 0x4f, 0xbd, 0x3d, 0xd3, 0x84, 0x03, 0xfd, 0x1c, 0x48, 0x1f, 0xb8, 0x01, 0x9b, 0x5c, 0x9c, 0xc1, 0x52, 0x8e, 0x3f, 0x6e, 0xc8, 0xf6, 0xee, 0xf2, 0xd1, 0x65, 0x42, 0x4f, 0xef, 0xa4, 0xf3, 0x2b, 0xc9, 0x14, 0xf1, 0x8b, 0xd8, 0x92, 0xb1, 0xdf, 0x64, 0x9d, 0xc5, 0x3f, 0xaf, 0xbb, 0xb0, 0xf4, 0x70, 0x18, 0xf8, 0x3a, 0x82, 0x71, 0x7d, 0x44, 0xde, 0x30, 0x08, 0x81, 0xc7, 0xd9, 0x27, 0x1e, 0x44, 0xa4, 0x39, 0xcc, 0xd3, 0x6c, 0xc5, 0xc3, 0x5c, 0xc7, 0x10, 0x06, 0x64, 0x77, 0xee, 0xe9, 0x83, 0x01, 0xd8, 0xd1, 0x18, 0x9b, 0x3f, 0x3c, 0x3b, 0x4b, 0x20, 0x01, 0xf3, 0x4e, 0xd9, 0xd8, 0xa9, 0xb7, 0x3b, 0x1c, 0xdd, 0x58, 0xe0, 0xd0, 0x18, 0xe5, 0xbe, 0xe1, 0x22, 0x57, 0xfd, 0xaa, 0x74, 0x8f, 0x06, 0xbd, 0xf0, 0x3c, 0xdd, 0xe1, 0xd0, 0xfe, 0xb0, 0x57, 0xdd, 0xcc, 0xb0, 0x62, 0xe1, 0x93, 0x1f, 0x06, 0x5e, 0x1f, 0xaa, 0x0f, 0x80, 0x3f, 0xfa, 0x55, 0x51, 0x24, 0x86, 0x3f, 0x2c, 0x0b, 0xab, 0x86, 0x74, 0x1c, 0xfe, 0x3b, 0x85, 0x91, 0xe1, 0x0c, 0xeb, 0x1a, 0x54, 0xc3, 0xd3, 0x80, 0x0e, 0x0f, 0xbe, 0x89, 0xcd, 0x87, 0x7d, 0x1d, 0xea, 0xec, 0x59, 0xa6, 0x30, 0xae, 0x92, 0xbd, 0xee, 0xb2, 0x0b, 0x02, 0x4b, 0x53, 0x43, 0x4b, 0xda, 0xa7, 0x87, 0x02, 0x6e, 0x03, 0x66, 0xc8, 0x30, 0xc1, 0x66, 0x5e, 0xee, 0x40, 0xf5, 0xc6, 0xb6, 0x2d, 0xa2, 0xa5, 0xa4, 0x01, 0x8d, 0xec, 0xf8, 0xcb, 0x1c, 0xb7, 0x6b, 0x30, 0xf0, 0x76, 0xc4, 0xb0, 0x18, 0x4a, 0xa6, 0x2b, 0x84, 0xb2, 0xac, 0xa3, 0xbc, 0x66, 0xb8, 0x43, 0xd2, 0x83, 0x87, 0xa0, 0x94, 0xe9, 0x89, 0x40, 0x07, 0xe1, 0xf0, 0x59, 0x11, 0x04, 0x07, 0xda, 0x76, 0x58, 0xc6, 0xaf, 0x06, 0xbb, 0xa3, 0x41, 0x14, 0x85, 0xaa, 0x3d, 0x29, 0x69, 0xd0, 0x97, 0xfa, 0x9c, 0x85, 0xce, 0x98, 0x39, 0x88, 0x71, 0xe7, 0xe5, 0xff, 0xe2, 0x51, 0xaf, 0xc7, 0x5a, 0xbb, 0x39, 0x09, 0x2d, 0xb8, 0x1d, 0x0e, 0x50, 0xfd, 0x8a, 0x54, 0x18, 0x16, 0x2e, 0xe1, 0x44, 0x57, 0x59, 0xd7, 0x3e, 0x14, 0x5f, 0x49, 0x9e, 0x15, 0x3e, 0x4d, 0xf0, 0x44, 0x80, 0x52, 0xb7, 0xa9, 0x63, 0xb4, 0xb2, 0x98, 0x38, 0x8e, 0x5d, 0x29, 0x09, 0xd0, 0xbb, 0xe9, 0x7e, 0x91, 0x53, 0xcf, 0x01, 0xa6, 0x78, 0x72, 0x21, 0x73, 0xce, 0x78, 0x34, 0x01, 0x0a, 0x52, 0x41, 0x51, 0xf9, 0x27, 0x1d, 0xf0, 0xc4, 0x0d, 0xd3, 0xcc, 0x72, 0x7f, 0x49, 0x46, 0xae, 0x0c, 0x21, 0x88, 0xcb, 0x4c, 0xde, 0x19, 0x05, 0x18, 0x48, 0xae, 0x0a, 0xfa, 0x11, 0x44, 0xb9, 0xe3, 0xb8, 0x6b, 0x29, 0x1c, 0xae, 0xe5, 0xed, 0x7f, 0xb8, 0x6f, 0x96, 0xe7, 0x94, 0xdf, 0x7a, 0xe5, 0xdf, 0x6f, 0xb4, 0xb5, 0x36, 0x59, 0x6c, 0x70, 0x9c, 0xa4, 0x59, 0x82, 0x1b, 0x3d, 0x83, 0x5f, 0xae, 0x49, 0x4e, 0x72, 0x5f, 0xba, 0xb4, 0x56, 0xad, 0x20, 0xd2, 0x49, 0x30, 0xc2, 0xa6, 0xde, 0x80, 0xee, 0x17, 0xf2, 0x52, 0x8d, 0x35, 0xe0, 0xe4, 0xfa, 0xc3, 0xf9, 0x9c, 0x15, 0xf3, 0x2e, 0xec, 0x93, 0x70, 0x10, 0x78, 0x98, 0xa1, 0xfb, 0x7b, 0x87, 0x2d, 0x8d, 0x66, 0x19, 0xba, 0x5d, 0xcb, 0xac, 0xfb, 0xea, 0x7a, 0xde, 0xe9, 0xd2, 0xea, 0x5b, 0x50, 0x45, 0xda, 0xf3, 0x8e, 0xb8, 0x37, 0xf0, 0x97, 0xde, 0x41, 0xa6, 0x3d, 0xd4, 0xea, 0x4b, 0xaf, 0x9c, 0x7e, 0x09, 0x3f, 0xcc, 0x89, 0x52, 0x68, 0x87, 0xf6, 0x74, 0x0f, 0xad, 0x74, 0x6d, 0x09, 0x4f, 0x1e, 0x00, 0xde, 0x66, 0x5a, 0x08, 0xcc, 0xc4, 0x01, 0x0d, 0x0f, 0x4a, 0xc1, 0x15, 0x60, 0x5c, 0xc0, 0xbc, 0xbc, 0x92, 0x82, 0x87, 0x66, 0xb0, 0x0d, 0x76, 0x2f, 0xd9, 0x4b, 0xd8, 0xf5, 0xff, 0xaf, 0x63, 0x6a, 0x9e, 0x1b, 0x84, 0x16, 0xaa, 0x02, 0xf4, 0xa0, 0xc6, 0xca, 0x8c, 0x49, 0xb6, 0x74, 0x5a, 0xb9, 0x17, 0x7e, 0xf4, 0xfe, 0x4d, 0x08, 0x0c, 0xd2, 0xbe, 0x37, 0x45, 0x1c, 0x3e, 0xd7, 0x45, 0xba, 0xc9, 0x44, 0x0c, 0x7e, 0x78, 0x8a, 0x84, 0x76, 0xae, 0xcb, 0x59, 0x71, 0x92, 0xe1, 0x0a, 0xbe, 0xc3, 0x45, 0x41, 0x37, 0x47, 0x2f, 0x60, 0x7f, 0xc4, 0xff, 0x5c, 0x87, 0xf2, 0xdc, 0xce, 0x57, 0x50, 0x9b, 0x47, 0x0b, 0x16, 0xe2, 0xe4, 0x1b, 0x6b, 0x8d, 0x23, 0xe0, 0xd9, 0x50, 0xf5, 0x54, 0xfe, 0x9e, 0x15, 0x1a, 0x84, 0xca, 0x97, 0xbe, 0x53, 0x6d, 0xc4, 0x3d, 0x04, 0x07, 0x25, 0xc8, 0x99, 0xe9, 0xde, 0xc5, 0x6c, 0x52, 0x3e, 0x17, 0x66, 0xd8, 0x93, 0x9f, 0x71, 0x09, 0x43, 0x02, 0x30, 0x53, 0x18, 0xad, 0xed, 0x21, 0xdc, 0x17, 0xd3, 0x47, 0x26, 0x46, 0x5d, 0xa0, 0x73, 0x95, 0x0e, 0xf5, 0x78, 0xb4, 0x63, 0x21, 0xb7, 0xf0, 0x06, 0x73, 0x51, 0xb5, 0x44, 0x54, 0x1b, 0x51, 0xc1, 0x2a, 0xf3, 0xfa, 0x6a, 0x7c, 0x55, 0x13, 0xac, 0x56, 0x29, 0xab, 0xe3, 0xef, 0xdf, 0x47, 0x16, 0x89, 0xbe, 0xe1, 0xe1, 0x99, 0x79, 0x30, 0xb2, 0x28, 0x04, 0x2a, 0x39, 0x79, 0xa5, 0xc8, 0x19, 0xec, 0x4e, 0x09, 0xe4, 0x22, 0x2a, 0x39, 0x46, 0x62, 0x76, 0x73, 0x80, 0x3b, 0x92, 0x65, 0x18, 0x6b, 0x58, 0x53, 0xcf, 0x00, 0xac, 0x5e, 0xd4, 0xbd, 0x54, 0x07, 0x37, 0xbf, 0x0b, 0xef, 0xa0, 0x61, 0xd0, 0xe0, 0x41, 0x5c, 0x84, 0x11, 0x09, 0x33, 0xb4, 0xa6, 0x1b, 0xce, 0xb4, 0x77, 0x7e, 0x64, 0xed, 0x12, 0x16, 0x9f, 0x77, 0x03, 0xd3, 0xfb, 0xeb, 0x53, 0x28, 0x70, 0x72, 0x4e, 0xbf, 0x50, 0x22, 0x89, 0x6b, 0x72, 0x8b, 0x24, 0x5e, 0x90, 0x8c, 0x4d, 0x9c, 0xee, 0x6c, 0x05, 0xaf, 0x3c, 0x25, 0x27, 0x9c, 0xbe, 0x03, 0xa6, 0x17, 0xaa, 0x6e, 0x16, 0xf3, 0xd2, 0x04, 0x6e, 0xdc, 0x82, 0xec, 0x0c, 0x48, 0xac, 0x66, 0xf9, 0xab, 0x42, 0xa6, 0x6f, 0xea, 0xe4, 0xe2, 0x98, 0x13, 0xbb, 0xaa, 0x99, 0x4b, 0xa5, 0x78, 0xcf, 0x08, 0x92, 0x88, 0x58, 0x80, 0x2e, 0xe9, 0xd6, 0x61, 0xc0, 0xd5, 0x6f, 0xc2, 0x51, 0x3e, 0x19, 0x59, 0x12, 0xa9, 0x14, 0xef, 0xf8, 0x3f, 0xb7, 0x12, 0xa9, 0x21, 0x70, 0x0a, 0x9b, 0xfd, 0x07, 0x0e, 0x7a, 0xdf, 0x22, 0xb7, 0xcb, 0x49, 0x0e, 0xb4, 0xd0, 0x85, 0xbc, 0xc0, 0xab, 0x3a, 0x0a, 0xd1, 0xc5, 0x3e, 0x44, 0x92, 0x71, 0xab, 0xeb, 0x14, 0xcd, 0x35, 0xb5, 0xc0, 0xe9, 0xba, 0xd4, 0x91, 0x2c, 0x1b, 0x7b, 0x80, 0xf3, 0x4b, 0x9f, 0x3f, 0x7a, 0xa5, 0xfb, 0x29, 0x00, 0x83, 0x56, 0x7a, 0x26, 0x0c, 0x08, 0xbb, 0x99, 0x4d, 0xbb, 0x81, 0xf0, 0x8c, 0x6f, 0x57, 0xd8, 0xd8, 0xc1, 0xf9, 0x6e, 0xe5, 0x6c, 0xc3, 0xec, 0x17, 0x10, 0x68, 0x88, 0xdd, 0x32, 0xe7, 0x99, 0x40, 0x84, 0xbb, 0xfc, 0xbc, 0x67, 0x52, 0xb6, 0x4e, 0xaf, 0xc1, 0xda, 0xce, 0xa6, 0xb6, 0xae, 0x7f, 0x53, 0xae, 0x09, 0xe5, 0xfc, 0x68, 0xff, 0xd6, 0xe9, 0x99, 0xc0, 0xd4, 0x6b, 0xe1, 0xbe, 0x9a, 0x1d, 0xfe, 0x0e, 0xf5, 0x6a, 0x40, 0x11, 0xd5, 0x4f, 0x3c, 0x53, 0xa4, 0x62, 0xc5, 0xb3, 0xd6, 0x14, 0x18, 0xc5, 0xc2, 0x33, 0x57, 0x74, 0xb0, 0xb3, 0x39, 0xec, 0x33, 0xad, 0xff, 0xb7, 0xb9, 0xa8, 0xaa, 0x25, 0x60, 0x18, 0x6b, 0xf2, 0x0b, 0x24, 0x5b, 0x23, 0xb6, 0xac, 0x6c, 0x31, 0x06, 0x8b, 0x9f, 0x69, 0x24, 0x19, 0x78, 0x93, 0xcc, 0xf4, 0xb0, 0xd2, 0xa1, 0x01, 0x29, 0xcb, 0xc4, 0xad, 0x27, 0x09, 0xa4, 0x79, 0xbc, 0xa0, 0x18, 0xb5, 0x84, 0x11, 0xab, 0x8b, 0x93, 0x6e, 0x36, 0x40, 0xac, 0xbf, 0xb5, 0xb7, 0xb3, 0xa3, 0x53, 0x37, 0x65, 0x3b, 0xc7, 0x6d, 0x47, 0x43, 0xe3, 0xb5, 0xdc, 0x82, 0x6a, 0x95, 0x1b, 0x65, 0x23, 0x8a, 0x20, 0xe7, 0x2b, 0x08, 0x22, 0xb3, 0x8f, 0xbc, 0xa5, 0x8d, 0x1a, 0x14, 0xf1, 0xee, 0x6c, 0x01, 0xc2, 0xee, 0x4c, 0xfc, 0x41, 0x67, 0x40, 0x47, 0x33, 0x58, 0x5a, 0x75, 0x71, 0x87, 0x54, 0x2c, 0x98, 0x6b, 0xe0, 0x2a, 0x01, 0x48, 0x39, 0x86, 0xf4, 0x9c, 0xfe, 0x38, 0x18, 0xba, 0x40, 0xdc, 0x2e, 0xb5, 0xda, 0xb3, 0xff, 0x7f, 0x00, 0xeb, 0x93, 0x52, 0x1b, 0x20, 0xa4, 0x4f, 0xd4, 0x22, 0x52, 0x66, 0x6f, 0xf9, 0x19, 0x75, 0x5b, 0x26, 0xff, 0xb4, 0x07, 0x2c, 0x12, 0x50, 0xf7, 0x4f, 0x11, 0x56, 0x16, 0x9c, 0x6a, 0xd3, 0x4e, 0x29, 0x64, 0x3a, 0x56, 0x9e, 0x9e, 0x05, 0xcb, 0xf4, 0xb8, 0x9f, 0x83, 0x7d, 0x50, 0x82, 0x1e, 0x25, 0x30, 0x9c, 0xdd, 0xf7, 0xc5, 0xf8, 0xb8, 0xe3, 0xd4, 0x9a, 0xaa, 0xbe, 0x68, 0xab, 0x50, 0x8a, 0x0f, 0xd6, 0xb2, 0xf8, 0x45, 0xf1, 0x61, 0x2b, 0x31, 0xe0, 0xc2, 0xbf, 0x8f, 0xb6, 0xa9, 0x0a, 0xee, 0x1e, 0x29, 0xa1, 0x1b, 0xfa, 0xab, 0x1e, 0xdd, 0x49, 0x3e, 0x21, 0xe2, 0x4e, 0x2e, 0x95, 0xfa, 0xef, 0xd8, 0x35, 0x83, 0x5b, 0xbc, 0x4e, 0x24, 0xef, 0xd4, 0xc6, 0xbf, 0x5b, 0x25, 0x5d, 0xa0, 0x00, 0x93, 0x33, 0xfb, 0x9d, 0xf9, 0x8b, 0x95, 0x2b, 0x79, 0xce, 0xc1, 0x05, 0x11, 0xd3, 0x8e, 0x4c, 0x6f, 0x5d, 0x3f, 0x8a, 0x07, 0xe5, 0xfb, 0x95, 0x62, 0x9a, 0xc6, 0xb7, 0xb9, 0xa7, 0xb0, 0x0b, 0xc2, 0xb4, 0x4c, 0x2a, 0xca, 0xaf, 0x64, 0x07, 0x04, 0xcc, 0xeb, 0x18, 0x21, 0xca, 0x33, 0xb7, 0x20, 0x79, 0x61, 0xc7, 0x68, 0x79, 0x1d, 0x9a, 0x14, 0x44, 0x8e, 0x12, 0x8e, 0x6e, 0x85, 0x07, 0x5f, 0x2c, 0xf8, 0xe9, 0x45, 0x14, 0xb3, 0xa7, 0x86, 0x23, 0x4a, 0xcf, 0x85, 0x04, 0x52, 0xf6, 0x93, 0x8f, 0xd0, 0x5a, 0x07, 0x91, 0xf2, 0xc6, 0x91, 0xcb, 0xfd, 0xb6, 0xcb, 0x3d, 0x87, 0xbc, 0x11, 0xa4, 0xe6, 0x22, 0x93, 0x41, 0xe8, 0xd1, 0xa8, 0xdc, 0xc5, 0x71, 0x66, 0x09, 0x51, 0xd2, 0x6f, 0xaa, 0x76, 0x8b, 0x0d, 0xb5, 0xe2, 0xe1, 0x82, 0x37, 0xfd, 0xea, 0x99, 0x99, 0x1e, 0xf2, 0x81, 0x22, 0xfe, 0x1d, 0xdb, 0xbe, 0x6d, 0x4e, 0x12, 0xfe, 0x43, 0x48, 0xeb, 0x5f, 0x9a, 0x13, 0x5d, 0xcf, 0x3a, 0xa2, 0xa2, 0x6d, 0x55, 0xb2, 0x8e, 0x91, 0x75, 0xf5, 0x20, 0x0c, 0xb2, 0x70, 0x57, 0xb1, 0x28, 0x21, 0x46, 0x14, 0xa8, 0xe6, 0x6b, 0x91, 0xae, 0x9a, 0x3d, 0x90, 0x93, 0x81, 0x04, 0x08, 0x04, 0xe6, 0xed, 0x42, 0xb3, 0x02, 0x5e, 0xe0, 0x4c, 0x20, 0x87, 0x1d, 0xab, 0xff, 0x3a, 0x56, 0x4c, 0x78, 0xfc, 0xca, 0x03, 0x60, 0x5c, 0x9e, 0xed, 0xb0, 0x83, 0x24, 0xa6, 0xe3, 0x0d, 0x5c, 0xbc, 0xa0, 0x17, 0xbb, 0x64, 0x99, 0x99, 0x2c, 0x6c, 0xb3, 0xf7, 0x55, 0x71, 0x67, 0xd2, 0x1b, 0x52, 0x68, 0x24, 0x68, 0xe4, 0x86, 0x8c, 0x2b, 0xe8, 0xd2, 0xe6, 0xa1, 0x3a, 0x03, 0x1f, 0xd4, 0x4b, 0x18, 0x47, 0x61, 0xd0, 0x3f, 0xe8, 0x7d, 0xbc, 0xf6, 0x97, 0x3a, 0x6c, 0x70, 0xc8, 0x07, 0x22, 0x3a, 0xe7, 0x76, 0xb5, 0x1e, 0xa4, 0x43, 0x87, 0x48, 0x8e, 0x91, 0xb6, 0xa7, 0xe3, 0x76, 0x97, 0x96, 0xa6, 0xba, 0x60, 0xbc, 0xf3, 0xdc, 0x24, 0x30, 0x90, 0x56, 0x05, 0xe1, 0xc4, 0x22, 0xa5, 0x36, 0x6c, 0x7d, 0xdd, 0xf1, 0x4b, 0xeb, 0xb2, 0x59, 0xa2, 0x7b, 0x84, 0x98, 0x00, 0x4c, 0x89, 0x62, 0x5c, 0x50, 0x7a, 0xd7, 0x61, 0x50, 0x8c, 0xab, 0x09, 0x31, 0xa2, 0x84, 0x6d, 0x75, 0xc1, 0xa3, 0xdc, 0x05, 0xc4, 0xc7, 0x2a, 0x2d, 0x51, 0x4e, 0x4a, 0xe8, 0x0b, 0x9e, 0x1f, 0x5e, 0x09, 0xc3, 0x90, 0xab, 0x88, 0x59, 0xdb, 0xe2, 0xdc, 0xad, 0x2b, 0x51, 0xad, 0x1f, 0x6c, 0x07, 0x5f, 0xcb, 0x5e, 0x94, 0xd2, 0x68, 0xe8, 0x10, 0x4c, 0x6f, 0xb0, 0x5f, 0xb3, 0x80, 0xe8, 0xb2, 0x00, 0x03, 0x6b, 0x51, 0xf0, 0x0b, 0x08, 0x99, 0xfc, 0x7f, 0x1d, 0x40, 0x8c, 0x7b, 0x68, 0xe1, 0x68, 0xf4, 0x1b, 0xb4, 0x6f, 0x9b, 0x2e, 0x9c, 0x8b, 0x04, 0xf9, 0x68, 0xe4, 0x08, 0x02, 0x52, 0x54, 0x68, 0x14, 0xcc, 0x1c, 0xb2, 0x91, 0x7d, 0xd5, 0x69, 0x08, 0x86, 0xa9, 0x60, 0x0a, 0x09, 0xc2, 0x67, 0x3a, 0xec, 0x03, 0x29, 0xa4, 0xda, 0xf6, 0x55, 0x50, 0x8b, 0x06, 0xfc, 0x16, 0x46, 0xef, 0x3b, 0xb3, 0xa4, 0x72, 0x19, 0x1d, 0x96, 0x4d, 0xb2, 0x14, 0xa9, 0x6a, 0x96, 0xfa, 0x89, 0x57, 0x6c, 0xe4, 0xc4, 0xf6, 0xdb, 0xf1, 0xd1, 0x76, 0xaa, 0xdb, 0x51, 0x81, 0x25, 0xcb, 0x94, 0xb7, 0xc3, 0x72, 0x5f, 0x5c, 0x07, 0x55, 0xed, 0x4d, 0xa4, 0x68, 0x33, 0x39, 0xe4, 0xdf, 0x69, 0x0d, 0x4a, 0x41, 0xc5, 0xb0, 0x77, 0xbe, 0x8a, 0xf1, 0x4a, 0xc2, 0x41, 0xbe, 0x4b, 0xca, 0x46, 0x96, 0x4a, 0x77, 0x87, 0x40, 0x43, 0xe0, 0x89, 0xbe, 0x85, 0x2d, 0xac, 0x7d, 0x13, 0x62, 0xaf, 0xce, 0x4b, 0x78, 0x76, 0x9a, 0xc5, 0xb2, 0x0b, 0x50, 0x7e, 0x2e, 0xe4, 0x23, 0x36, 0xbb, 0x64, 0x73, 0x16, 0xea, 0xa3, 0x88, 0x96, 0x68, 0x72, 0x86, 0x9e, 0x8a, 0x9a, 0x9d, 0xeb, 0x2a, 0x65, 0x81, 0xb5, 0xb2, 0x60, 0x1a, 0x8f, 0x76, 0x5e, 0x7c, 0x8e, 0x47, 0xc0, 0x19, 0xad, 0x44, 0xf4, 0x35, 0x70, 0xf4, 0x3c ],
+const [ 0xa2, 0x83, 0x31, 0xa9, 0x66, 0xb0, 0x86, 0x58, 0x92, 0xc2, 0xc7, 0x6c, 0x12, 0x4c, 0x50, 0xa0, 0x4a, 0x6e, 0xcb, 0xc7, 0x4c, 0x41, 0x01, 0x55, 0x4f, 0x75, 0xf1, 0x20, 0x5d, 0x39, 0x1f, 0x68, 0x4b, 0x5b, 0x2f, 0x15, 0xee, 0xb1, 0xb2, 0x41, 0x8c, 0xb7, 0x40, 0xf6, 0x91, 0x79, 0xc7, 0x39, 0x83, 0xb4, 0x22, 0x47, 0x38, 0x38, 0xee, 0x1e, 0x47, 0x90, 0x99, 0x3f, 0xbc, 0xe5, 0xbb, 0xb3, 0x10, 0x20, 0xaa, 0x4c, 0x58, 0x4f, 0x49, 0x2d, 0xbc, 0x4a, 0x20, 0x8c, 0x2b, 0x96, 0xb2, 0xb7, 0x4d, 0x89, 0x0a, 0x55, 0xb9, 0xaf, 0x98, 0xef, 0x69, 0x6d, 0x3b, 0xaf, 0x6a, 0xe4, 0x9f, 0x67, 0xd8, 0x18, 0xc9, 0xd4, 0x0a, 0x52, 0xf0, 0x25, 0x0a, 0xc3, 0x8f, 0xb7, 0x48, 0x69, 0xb8, 0x23, 0x8f, 0x37, 0xab, 0x7a, 0x37, 0x70, 0xa7, 0xcf, 0x9d, 0x54, 0x00, 0xf6, 0xd0, 0xfe, 0x72, 0x8c, 0x8d, 0x8d, 0xb5, 0x37, 0x6e, 0x82, 0x51, 0x2f, 0x5e, 0x69, 0xb4, 0xfe, 0x50, 0xbc, 0x82, 0x84, 0x31, 0x04, 0x2c, 0x3d, 0x1a, 0x41, 0xc4, 0xc7, 0xcb, 0x8c, 0x10, 0x9e, 0x55, 0xfb, 0xdd, 0x2b, 0x16, 0xc5, 0x95, 0xfd, 0xea, 0xa6, 0x14, 0x56, 0xa0, 0x85, 0xb8, 0xe9, 0xab, 0x55, 0xb7, 0xe2, 0x1a, 0x39, 0xb6, 0x27, 0xcb, 0xeb, 0x97, 0xdd, 0xdb, 0x5e, 0x92, 0x2f, 0x60, 0xa2, 0x87, 0x4a, 0x5b, 0x09, 0x92, 0xac, 0xe8, 0x88, 0xe1, 0x9f, 0xb8, 0x5f, 0xc2, 0x00, 0xc1, 0xfc, 0x00, 0x45, 0x34, 0x1d, 0x70, 0xbf, 0xb0, 0x36, 0xc7, 0x1b, 0xb5, 0x12, 0xae, 0x2f, 0x5b, 0xbc, 0x19, 0xf4, 0x44, 0xa0, 0xd4, 0xce, 0xcf, 0xee, 0x5e, 0x14, 0x8e, 0x3f, 0xfb, 0xcc, 0xfb, 0x7b, 0x05, 0xb6, 0x66, 0xfa, 0x83, 0x8d, 0x32, 0xe9, 0xfd, 0x89, 0x41, 0xf0, 0x8e, 0x28, 0xad, 0x11, 0x3a, 0x2e, 0xb9, 0xd4, 0x82, 0xea, 0x07, 0xa1, 0x36, 0xbc, 0x0b, 0x6d, 0x8b, 0xd4, 0xbf, 0x99, 0x6d, 0x3c, 0x98, 0x16, 0x16, 0x19, 0xb9, 0xce, 0xe0, 0x2e, 0x68, 0x3f, 0x57, 0xa1, 0xbe, 0x69, 0x93, 0x02, 0xa2, 0xeb, 0xc5, 0x89, 0xf8, 0x69, 0x0f, 0x9f, 0x15, 0x30, 0x99, 0xa0, 0x76, 0x1d, 0xe1, 0xe0, 0xb2, 0xbb, 0x52, 0xec, 0xae, 0xab, 0x19, 0x12, 0x10, 0x49, 0x34, 0x23, 0xf6, 0x8c, 0xcb, 0x77, 0xe7, 0x2e, 0xc4, 0x32, 0x0a, 0x0d, 0x92, 0xc6, 0x95, 0xd2, 0x4d, 0xb9, 0x89, 0xd0, 0x08, 0xa9, 0x9d, 0x2f, 0x5f, 0x8d, 0x77, 0x49, 0x4f, 0x3d, 0x22, 0x54, 0x4b, 0x35, 0xbd, 0x42, 0x8b, 0x95, 0x70, 0xe5, 0xa8, 0x6d, 0xa5, 0x57, 0x66, 0x38, 0x74, 0x99, 0xd0, 0xa6, 0x5e, 0x7a, 0x8b, 0x9f, 0x3f, 0xba, 0x64, 0x84, 0x7e, 0x70, 0x2b, 0xb8, 0x87, 0xa9, 0xc4, 0x5f, 0x7b, 0x52, 0x7b, 0x65, 0x25, 0x58, 0x98, 0xc2, 0x31, 0x0d, 0x33, 0xfd, 0x98, 0xce, 0x4a, 0xef, 0x5f, 0xe3, 0x11, 0xca, 0x81, 0xa6, 0x89, 0x5a, 0x2a, 0xe7, 0x54, 0x8a, 0x25, 0x90, 0xc8, 0x29, 0x98, 0x85, 0x42, 0xee, 0xef, 0xce, 0xbd, 0xba, 0x16, 0xf8, 0xa3, 0x1e, 0xeb, 0xb8, 0xe2, 0x1d, 0xf3, 0xd2, 0x43, 0x33, 0x4b, 0x39, 0xf8, 0x96, 0xe2, 0x78, 0x73, 0xbb, 0xe6, 0x50, 0x7f, 0x1c, 0x7c, 0xa3, 0x89, 0x39, 0xb4, 0x91, 0x3e, 0xdc, 0xbc, 0xe0, 0x5c, 0xa2, 0x54, 0xa1, 0xc1, 0xb7, 0x81, 0x10, 0xc9, 0xe1, 0x86, 0xbd, 0xd6, 0xc0, 0x10, 0xe9, 0x30, 0x54, 0xb1, 0x33, 0x10, 0xbf, 0x8f, 0x74, 0xf7, 0x4c, 0x5e, 0xe7, 0x44, 0xb1, 0x8b, 0x8d, 0x06, 0x91, 0xba, 0xcf, 0x0f, 0x45, 0x73, 0x66, 0x4a, 0xdc, 0x18, 0x78, 0x4e, 0x60, 0x1b, 0x03, 0x32, 0x5b, 0x6d, 0x7f, 0xa3, 0x9a, 0x3a, 0xbf, 0x35, 0x31, 0xd3, 0x19, 0xf7, 0xc0, 0xec, 0xc6, 0x4a, 0xf4, 0x07, 0x8b, 0xf3, 0x50, 0x30, 0x99, 0x6e, 0x2d, 0xeb, 0xb3, 0x85, 0xff, 0x6b, 0x8e, 0x22, 0xdb, 0x04, 0x7d, 0x62, 0x36, 0xe3, 0x4e, 0xea, 0xf0, 0xfd, 0x6e, 0x7e, 0x91, 0x45, 0x54, 0xd0, 0xd2, 0x22, 0x1d, 0x95, 0x5f, 0x20, 0x74, 0xde, 0xdb, 0xe6, 0xb5, 0xa6, 0x24, 0x68, 0x52, 0xa7, 0xd9, 0x5d, 0x75, 0x73, 0x1a, 0xf4, 0xe7, 0xbf, 0x8f, 0xc2, 0x30, 0x02, 0xac, 0xff, 0x00, 0x3f, 0x33, 0xf3, 0xcd, 0x1e, 0xfa, 0xab, 0xbe, 0x42, 0xee, 0xf0, 0xc8, 0xd7, 0x58, 0x7a, 0x17, 0x6a, 0x5f, 0x60, 0xaf, 0xfe, 0xce, 0xd3, 0x53, 0x5c, 0x18, 0x0c, 0xa5, 0xaa, 0x9a, 0x83, 0x90, 0x3f, 0x1f, 0x62, 0xe3, 0xb6, 0xa9, 0x39, 0x3e, 0x41, 0x6f, 0xf3, 0x32, 0x40, 0x22, 0x09, 0xa4, 0x13, 0x74, 0xf5, 0x72, 0x2c, 0xdb, 0xea, 0x5a, 0x68, 0x92, 0xc2, 0x17, 0x9f, 0xe2, 0x38, 0xcc, 0x7a, 0x9f, 0x57, 0xa6, 0x84, 0xf5, 0x32, 0xbd, 0x84, 0x65, 0xd6, 0x3c, 0x0b, 0x0a, 0x7d, 0xc2, 0x49, 0x21, 0x04, 0x08, 0x24, 0xc8, 0x9f, 0xc3, 0x8c, 0x06, 0xcc, 0xcc, 0x08, 0x0c, 0x85, 0x7e, 0x95, 0xba, 0xba, 0x5f, 0xb1, 0x65, 0xfe, 0x03, 0xb3, 0xd8, 0x81, 0x2e, 0x5d, 0x98, 0x3e, 0x39, 0xb4, 0x6d, 0x75, 0xb7, 0x0f, 0x1d, 0x5c, 0x58, 0x6f, 0x7b, 0x12, 0x0d, 0x0e, 0xa0, 0xd4, 0x6c, 0x3b, 0x79, 0x73, 0x57, 0x64, 0x82, 0x05, 0xd8, 0x75, 0xd0, 0xdb, 0x50, 0x61, 0x55, 0xb4, 0xd1, 0xfd, 0x60, 0x30, 0xc8, 0x15, 0x63, 0x88, 0xdf, 0xba, 0xf9, 0x7b, 0x21, 0xd9, 0x27, 0x8c, 0x5f, 0x12, 0xe2, 0x6a, 0xd3, 0xc6, 0xd2, 0xb0, 0x04, 0x72, 0x56, 0xce, 0xe9, 0x3c, 0xc8, 0x47, 0x51, 0xcc, 0x02, 0x1e, 0x83, 0x5d, 0x21, 0x8a, 0x21, 0x14, 0x89, 0xf1, 0x52, 0x90, 0x29, 0x14, 0x1f, 0xc2, 0x00, 0x88, 0x1e, 0xff, 0xdf, 0x65, 0x4e, 0x53, 0x71, 0x42, 0x43, 0x19, 0x7a, 0x60, 0x83, 0xc8, 0x5c, 0x25, 0x2f, 0x10, 0xdf, 0xcc, 0xe6, 0x26, 0x31, 0x5c, 0xe6, 0x5c, 0x2c, 0xd6, 0x74, 0xf4, 0xd8, 0xb3, 0x7f, 0x36, 0x31, 0x8d, 0x80, 0xc0, 0x2a, 0x1d, 0xa4, 0x1e, 0xf1, 0x65, 0x2d, 0x9a, 0x75, 0x2e, 0x15, 0x55, 0x26, 0xb5, 0xf5, 0x97, 0xfb, 0xa2, 0x26, 0x64, 0xba, 0x39, 0x26, 0x50, 0x74, 0xd4, 0x3d, 0x94, 0x4e, 0x91, 0x60, 0x60, 0x88, 0x48, 0x55, 0x73, 0xb7, 0xc0, 0x18, 0xea, 0x55, 0x22, 0x7e, 0x55, 0x7c, 0xad, 0x18, 0x10, 0xef, 0xac, 0x5a, 0xd1, 0x5a, 0xa5, 0xfc, 0x7d, 0xdb, 0xd4, 0xa1, 0x40, 0xc0, 0xd7, 0xb7, 0xdc, 0x93, 0xab, 0x9e, 0x41, 0x54, 0xd7, 0x0c, 0x5f, 0x05, 0xe7, 0xb0, 0x38, 0x6c, 0x1c, 0x15, 0x39, 0x14, 0x62, 0xca, 0xca, 0x95, 0x82, 0xc0, 0x24, 0x15, 0x99, 0xf3, 0x62, 0x0f, 0xc9, 0x4c, 0xdb, 0x53, 0x2e, 0xc6, 0xb0, 0x4e, 0x14, 0xd1, 0xa1, 0x8c, 0x67, 0xf4, 0x25, 0x7b, 0x6a, 0xb5, 0xb9, 0x72, 0xac, 0xbd, 0x78, 0xf1, 0x39, 0x38, 0xec, 0x2b, 0x0d, 0x7b, 0x24, 0xc1, 0xce, 0xe9, 0x06, 0xd1, 0xba, 0x17, 0xe7, 0x2f, 0xde, 0x2e, 0x59, 0xf2, 0x88, 0x91, 0x44, 0x33, 0x00, 0xc0, 0x39, 0x11, 0x73, 0x7d, 0x02, 0xf8, 0x30, 0x2d, 0x7e, 0x24, 0x17, 0x80, 0xac, 0x60, 0x4d, 0x54, 0x05, 0x14, 0x35, 0xd7, 0x0f, 0x7e, 0x9c, 0xec, 0x2f, 0x40, 0x34, 0xd1, 0xbe, 0x1b, 0x44, 0xfe, 0x60, 0xfa, 0x9d, 0x50, 0x91, 0x32, 0xd0, 0x66, 0x81, 0x08, 0x9e, 0x4c, 0x22, 0x74, 0xb0, 0x56, 0x7f, 0x24, 0x89, 0x4f, 0x4f, 0xc4, 0xb8, 0xd3, 0xca, 0x7d, 0x52, 0xfa, 0xbb, 0xbb, 0x9f, 0x37, 0xd7, 0x34, 0x14, 0x7f, 0x4d, 0x26, 0x81, 0xad, 0x9e, 0xdf, 0x8c, 0x25, 0xaf, 0x83, 0x5e, 0xb7, 0x1d, 0x0a, 0x9c, 0xc7, 0xd0, 0x88, 0x99, 0xab, 0xd3, 0xb1, 0xca, 0x55, 0x62, 0x9c, 0x7a, 0x32, 0x45, 0xc7, 0xbe, 0x51, 0x5d, 0x5c, 0xac, 0xc8, 0x7d, 0xb2, 0xc8, 0x54, 0x7b, 0x17, 0xbf, 0x3f, 0x86, 0xcd, 0x58, 0x87, 0xb9, 0x52, 0xa7, 0x3c, 0xf1, 0xe4, 0x84, 0x2a, 0xdc, 0x45, 0x3b, 0xb8, 0x53, 0xbc, 0x85, 0x10, 0xea, 0x5c, 0xb7, 0x80, 0xc5, 0x88, 0x3a, 0x20, 0xad, 0xb7, 0x3b, 0xb6, 0x62, 0x75, 0xa3, 0xd6, 0x33, 0xab, 0x4a, 0x4e, 0xcd, 0x1f, 0x67, 0xc1, 0x51, 0x3e, 0x4c, 0x91, 0xa9, 0x1a, 0x50, 0x02, 0x1b, 0xaf, 0x0c, 0x9d, 0x1e, 0x6a, 0xca, 0xd3, 0x6d, 0xec, 0x3a, 0xe3, 0x5b, 0x0b, 0x67, 0xfe, 0x66, 0x19, 0xea, 0xa8, 0x0e, 0x69, 0x5d, 0x61, 0xe8, 0x10, 0x13, 0x85, 0xee, 0xe9, 0x06, 0x71, 0x19, 0xdc, 0x11, 0xe7, 0x32, 0x5f, 0x60, 0xb4, 0xe5, 0x3c, 0x24, 0x8f, 0x17, 0x95, 0x8b, 0x45, 0x79, 0x26, 0xef, 0x13, 0x5d, 0xcb, 0x4e, 0x53, 0xc9, 0x42, 0xfa, 0x5c, 0xca, 0x31, 0x91, 0xa3, 0x0b, 0x6b, 0x30, 0x26, 0xa6, 0x6f, 0xe4, 0x0a, 0x3a, 0x32, 0x61, 0x82, 0x3e, 0x1e, 0xf7, 0xf4, 0x95, 0x5a, 0xc1, 0x57, 0x62, 0x4c, 0x20, 0xe0, 0x1d, 0x5c, 0x67, 0xdd, 0xe7, 0xfb, 0xd8, 0xe1, 0x1a, 0xe4, 0xd0, 0x21, 0x25, 0xa2, 0x3e, 0x1e, 0x97, 0x53, 0x59, 0x84, 0x79, 0xab, 0x93, 0x52, 0xe1, 0x3c, 0xc8, 0x3c, 0xc4, 0xf4, 0xbc, 0x4e, 0x0c, 0xe7, 0xc4, 0xd1, 0xea, 0x4e, 0xc3, 0x72, 0x6e, 0xd0, 0x58, 0xa1, 0x55, 0x01, 0x56, 0x38, 0x22, 0x29, 0x75, 0x5d, 0x70, 0x46, 0x47, 0xa9, 0x86, 0x54, 0x6d, 0x8a, 0x2c, 0xcb, 0x0a, 0xe5, 0xbd, 0x6a, 0x78, 0x00, 0x7e, 0x33, 0x3a, 0xa0, 0x2e, 0xb7, 0x32, 0x6e, 0xde, 0x93, 0x14, 0x9f, 0x03, 0x3b, 0x1b, 0xd4, 0xca, 0xf6, 0xfb, 0x3f, 0xab, 0x2a, 0x16, 0x08, 0x41, 0xda, 0xf2, 0xef, 0x59, 0x6d, 0xeb, 0x32, 0x49, 0xb1, 0x25, 0xb1, 0x83, 0x1f, 0xc5, 0x50, 0x69, 0x61, 0x61, 0x9d, 0x63, 0x11, 0xb4, 0xb3, 0x2f, 0xc4, 0x97, 0x5e, 0x79, 0x47, 0x2d, 0x7f, 0xac, 0x28, 0x5d, 0xb2, 0x07, 0x78, 0x85, 0x2f, 0xf3, 0xd0, 0x6c, 0xee, 0x94, 0x92, 0x79, 0x0f, 0x9e, 0x71, 0x23, 0x78, 0x6a, 0x34, 0xa9, 0xc0, 0x49, 0xb6, 0x03, 0x4c, 0x18, 0x32, 0x18, 0xb7, 0x14, 0xbd, 0x31, 0x77, 0xf0, 0x14, 0xae, 0xbe, 0x25, 0x98, 0xf8, 0x9f, 0x8a, 0x97, 0xb6, 0x72, 0x24, 0xcd, 0x44, 0x79, 0x3f, 0x2b, 0x60, 0xc4, 0xbd, 0xd7, 0x27, 0x51, 0xaf, 0x73, 0x41, 0x78, 0x22, 0xa2, 0x58, 0x86, 0x3b, 0xc8, 0xce, 0xa9, 0x87, 0x12, 0xaf, 0x0c, 0x8c, 0xb7, 0xe4, 0x42, 0xa4, 0x7d, 0xaa, 0xe8, 0x0b, 0x7e, 0x43, 0x86, 0x36, 0x2c, 0xeb, 0xb7, 0x66, 0x93, 0x0e, 0x8a, 0x7e, 0xde, 0xb8, 0x27, 0x11, 0x1d, 0x4d, 0xb6, 0xc0, 0x45, 0x7a, 0x7c, 0xc3, 0x78, 0x6b, 0x47, 0xc5, 0x87, 0x3f, 0x0d, 0xf5, 0xb6, 0xb9, 0xd0, 0x5a, 0xbf, 0x38, 0xc4, 0x66, 0x19, 0xe9, 0xb4, 0xcf, 0x79, 0x3b, 0xa2, 0x9a, 0x9a, 0x93, 0xae, 0x79, 0x3a, 0x42, 0x39, 0x56, 0x65, 0xb4, 0x49, 0x30, 0xf5, 0xe9, 0x2f, 0x26, 0x5a, 0x29, 0x68, 0xd1, 0x97, 0xf4, 0xc2, 0xd7, 0x8d, 0x39, 0xbf, 0xbd, 0x7c, 0xc8, 0x3e, 0xfd, 0xc7, 0x08, 0x58, 0x59, 0xf7, 0xed, 0x89, 0x6e, 0x03, 0x25, 0x10, 0x8c, 0xcf, 0x92, 0x98, 0xc5, 0xf2, 0xfd, 0x17, 0x44, 0xbc, 0x09, 0xf7, 0xe1, 0x78, 0x65, 0x74, 0xf2, 0xee, 0x46, 0x45, 0x63, 0x2c, 0x15, 0x7e, 0x09, 0x86, 0x64, 0xb5, 0x33, 0xdc, 0x27, 0x63, 0x82, 0x1b, 0x21, 0x8e, 0xfb, 0x06, 0x9c, 0xa5, 0x5b, 0x37, 0x5d, 0xac, 0xaa, 0x60, 0xd7, 0x98, 0x13, 0xd7, 0x9f, 0xfd, 0xf3, 0x52, 0x20, 0xe6, 0x30, 0xef, 0x90, 0x04, 0xcc, 0x77, 0x23, 0x0c, 0xba, 0xe3, 0x7e, 0x5a, 0xf0, 0x1f, 0x6e, 0xda, 0xbd, 0x0f, 0xda, 0x28, 0x5d, 0xd0, 0xf6, 0xf6, 0xcb, 0x40, 0xba, 0xaf, 0xd6, 0xc0, 0x93, 0x59, 0x77, 0x38, 0x58, 0xc0, 0x62, 0x5c, 0x7f, 0xd1, 0xdb, 0x2e, 0x91, 0x44, 0xcb, 0xc4, 0xdb, 0x7e, 0x13, 0x4c, 0x67, 0xb5, 0x20, 0x4d, 0x2a, 0x55, 0xbf, 0x30, 0x7f, 0xa2, 0x33, 0xfe, 0xd4, 0x9f, 0x86, 0x6b, 0xa3, 0x2f, 0x1c, 0x14, 0xa5, 0x7b, 0x8e, 0x05, 0x42, 0x93, 0xb5, 0x7e, 0x4b, 0x58, 0x04, 0xf7, 0xeb, 0x99, 0x1b, 0x61, 0xdb, 0x7c, 0x9a, 0xaf, 0xd6, 0x20, 0x33, 0x95, 0x4d, 0x80, 0x04, 0x8f, 0x5b, 0x9b, 0x23, 0x26, 0xfb, 0xd2, 0x7a, 0x6f, 0x79, 0x91, 0xd5, 0xd4, 0x26, 0x31, 0x39, 0x16, 0x50, 0x1d, 0x78, 0x93, 0x71, 0x34, 0x02, 0xc5, 0xa7, 0x6f, 0xfe, 0x0c, 0x64, 0xc4, 0x99, 0xad, 0x67, 0x4a, 0x9e, 0x1a, 0xeb, 0x9d, 0x48, 0x74, 0x1e, 0x84, 0x54, 0x4e, 0xd4, 0xd1, 0x59, 0xb4, 0x7d, 0x89, 0x5c, 0x6b, 0x54, 0x45, 0x9f, 0x7b, 0xda, 0xd8, 0xbb, 0xeb, 0x83, 0x32, 0xee, 0xcc, 0xaf, 0x85, 0xb6, 0x79, 0xdb, 0xa6, 0x9f, 0x1c, 0x19, 0xb5, 0x59, 0x74, 0xbd, 0x00, 0x0d, 0xd6, 0x5a, 0x25, 0xf1, 0x72, 0xed, 0x77, 0x1b, 0xd8, 0x57, 0xa3, 0x93, 0xbb, 0x11, 0x94, 0xab, 0xf4, 0x1b, 0x93, 0x93, 0xc9, 0x35, 0xb3, 0x28, 0x70, 0x52, 0x6c, 0x0d, 0xcf, 0x4a, 0x86, 0xfd, 0x86, 0xcf, 0x38, 0x5f, 0x2f, 0xa2, 0x92, 0x1b, 0xe4, 0x06, 0x18, 0xad, 0x02, 0x76, 0xb0, 0x78, 0x2d, 0x93, 0xbe, 0x5c, 0x95, 0x60, 0x8d, 0x8a, 0x77, 0xb1, 0xf1, 0x97, 0xe6, 0xe1, 0x2a, 0xd0, 0xcb, 0xc4, 0x0c, 0xce, 0x2b, 0xdc, 0x5d, 0x4a, 0xa8, 0xd0, 0x7f, 0x32, 0x4b, 0x19, 0x4e, 0xfb, 0x80, 0xff, 0x4c, 0x3a, 0x62, 0xc4, 0xfc, 0x6e, 0x39, 0x1f, 0x8b, 0x20, 0x41, 0xec, 0xb5, 0x2f, 0xae, 0x21, 0xe7, 0x65, 0xec, 0x04, 0xa1, 0x4d, 0x2b, 0x9b, 0x1f, 0x49, 0x1b, 0x64, 0x38, 0xdf, 0xf4, 0x47, 0x86, 0x54, 0xba, 0xc9, 0xc7, 0x7c, 0xbf, 0x82, 0x83, 0xd0, 0x69, 0xd1, 0xf0, 0xc1, 0x35, 0xce, 0x12, 0x4c, 0xfc, 0x80, 0x26, 0xcf, 0x76, 0x51, 0x41, 0x1b, 0xfc, 0xbe, 0x35, 0xca, 0x92, 0x53, 0xb4, 0xd3, 0x24, 0xd7, 0xb8, 0x5b, 0x10, 0xc4, 0x21, 0xce, 0xe5, 0xfa, 0xa0, 0x2f, 0x6a, 0xb3, 0xd5, 0xac, 0xe3, 0xba, 0xb4, 0x76, 0x8f, 0xd8, 0x2d, 0xcf, 0x75, 0x8f, 0x0c, 0x65, 0x61, 0x0b, 0x1e, 0xde, 0x29, 0x56, 0x95, 0xb4, 0x34, 0xcb, 0xad, 0x43, 0x3d, 0xcd, 0x90, 0x20, 0x55, 0xb9, 0x77, 0xad, 0x27, 0x18, 0x13, 0xea, 0x80, 0x1a, 0x2b, 0x8e, 0x0f, 0x40, 0x86, 0x57, 0x69, 0x58, 0x0b, 0x9e, 0x4f, 0xae, 0x27, 0x2e, 0x34, 0x81, 0x6f, 0x56, 0xfa, 0xb4, 0x87, 0x3d, 0xfd, 0xc6, 0x42, 0x76, 0x52, 0x04, 0x0a, 0xd4, 0x51, 0xfd, 0x83, 0x80, 0x50, 0x37, 0x6b, 0x48, 0xb2, 0x20, 0xc5, 0x3a, 0x21, 0x47, 0x36, 0x72, 0x17, 0xcc, 0xaf, 0x30, 0xa3, 0x16, 0x4c, 0x2e, 0x6a, 0xc3, 0x7c, 0x30, 0xec, 0xe5, 0x63, 0xdc, 0x08, 0x6b, 0x7c, 0xcc, 0xc2, 0xdd, 0x83, 0xe2, 0x45, 0x4d, 0x92, 0xdb, 0x24, 0x8a, 0x8a, 0x27, 0xe5, 0x96, 0xb4, 0xf8, 0xc0, 0x5a, 0xa8, 0x9a, 0xa4, 0x99, 0x6e, 0x02, 0x7b, 0x23, 0xe4, 0xa9, 0xaf, 0x4b, 0x5f, 0x9b, 0xed, 0x9a, 0x95, 0xca, 0x29, 0xc5, 0xbb, 0xa9, 0xe2, 0xdd, 0xea, 0xf6, 0xa7, 0xc6, 0xc7, 0xd7, 0xda, 0xea, 0x63, 0x29, 0xb4, 0x2e, 0x60, 0x15, 0x89, 0x26, 0x56, 0xe4, 0x4d, 0x84, 0x74, 0x14, 0x58, 0xd7, 0x6b, 0xab, 0x66, 0x72, 0x87, 0xcb, 0xe2, 0xa9, 0x1f, 0x87, 0x64, 0x44, 0x30, 0xf5, 0x78, 0x2d, 0x45, 0x84, 0xa1, 0x6c, 0x9a, 0x90, 0x9d, 0x55, 0x80, 0x34, 0xeb, 0x00, 0x03, 0x60, 0x8b, 0xfa, 0xcb, 0x2b, 0x05, 0x3a, 0x40, 0x6a, 0xac, 0x57, 0xf2, 0x81, 0x24, 0xf8, 0x37, 0x79, 0x22, 0x8b, 0x16, 0x53, 0x73, 0x3a, 0x63, 0x9c, 0x40, 0x1a, 0x2c, 0x42, 0x90, 0xa6, 0x54, 0xa6, 0x0e, 0x6d, 0x7e, 0xf2, 0x0d, 0x07, 0x2c, 0xad, 0xc9, 0x4d, 0x28, 0x8d, 0xef, 0xca, 0x24, 0x8c, 0x60, 0x6c, 0x9d, 0x3d, 0x32, 0x7f, 0x05, 0x61, 0xf8, 0xdc, 0x20, 0xb6, 0x44, 0x5e, 0xaf, 0x0f, 0x6a, 0x96, 0x4c, 0xa9, 0x86, 0xc0, 0x95, 0xbd, 0xc0, 0xf5, 0x8c, 0x52, 0xce, 0xa2, 0x3e, 0x55, 0xbb, 0x38, 0xa3, 0xeb, 0xe7, 0x25, 0xc6, 0x06, 0x50, 0x04, 0x25, 0x37, 0x0f, 0x10, 0x5b, 0xc3, 0x26, 0xdf, 0xfc, 0xf8, 0x78, 0x4d, 0xc1, 0xc1, 0x19, 0xb6, 0xe5, 0x79, 0xc8, 0x68, 0xce, 0xfd, 0xba, 0x57, 0xf0, 0x05, 0x9a, 0x13, 0xef, 0xb4, 0xcd, 0xf8, 0x03, 0x6d, 0xfa, 0xa4, 0xa1, 0xe9, 0xca, 0xaf, 0x58, 0x86, 0xec, 0x96, 0xf9, 0xe2, 0x5d, 0xf7, 0xfa, 0xa9, 0xe6, 0x04, 0x1c, 0xab, 0xe6, 0x32, 0x4c, 0x32, 0x51, 0x31, 0xc7, 0x92, 0xf9, 0x21, 0x82, 0x01, 0x0c, 0x03, 0xc9, 0xa9, 0xde, 0x6d, 0x26, 0xfc, 0xe9, 0x82, 0x84, 0x48, 0x13, 0x22, 0x94, 0x8b, 0x2f, 0x5e, 0x70, 0x88, 0xc5, 0x2f, 0x7f, 0x1a, 0x16, 0x67, 0x98, 0xc9, 0x5b, 0xe7, 0x6a, 0x9b, 0x4e, 0x13, 0x1b, 0x2c, 0xeb, 0x83, 0x2f, 0x01, 0x78, 0xfb, 0xac, 0x1a, 0xc3, 0x9e, 0x7b, 0xc6, 0xab, 0x5e, 0x12, 0xbc, 0xe1, 0xb7, 0x50, 0x66, 0xf0, 0x9d, 0xa8, 0x80, 0x7b, 0xb3, 0x82, 0xe2, 0xc6, 0xbd, 0xde, 0x9a, 0x79, 0x58, 0x3b, 0x3e, 0xa0, 0xe9, 0xb7, 0x81, 0xf5, 0xd3, 0x77, 0x03, 0x62, 0xed, 0x49, 0x6e, 0xc2, 0x33, 0x88, 0xbe, 0xe8, 0xbb, 0x41, 0xe0, 0xe2, 0xeb, 0x93, 0x7f, 0x7e, 0xea, 0x5c, 0x1b, 0x0e, 0x54, 0x12, 0x5b, 0x69, 0x32, 0xee, 0xa4, 0x32, 0x29, 0x50, 0xea, 0x5d, 0xf1, 0x5f, 0xc6, 0xee, 0x09, 0xef, 0xc9, 0x04, 0xa9, 0xa9, 0x11, 0x17, 0xf9, 0x65, 0x19, 0x7e, 0x80, 0xdb, 0xd5, 0x34, 0xdf, 0x7b, 0xff, 0xdb, 0xbf, 0x99, 0xac, 0x01, 0x08, 0xcd, 0x22, 0xa3, 0x53, 0x9a, 0xed, 0xef, 0xa3, 0x4d, 0x30, 0x4e, 0x4f, 0x28, 0x3a, 0xa2, 0x43, 0xc0, 0x59, 0xcc, 0x69, 0xa4, 0xf3, 0x72, 0x61, 0x3f, 0xd2, 0xff, 0x78, 0x00, 0xc0, 0xeb, 0xd8, 0xb8, 0x54, 0x3c, 0xfc, 0x43, 0x0b, 0x4d, 0x67, 0x6a, 0x9a, 0xce, 0x96, 0x08, 0x83, 0x0c, 0x33, 0x6c, 0xe7, 0x72, 0x8b, 0xff, 0x9b, 0x50, 0x42, 0x26, 0x7e, 0xdc, 0x45, 0x6a, 0x09, 0x77, 0x01, 0xd7, 0x27, 0x31, 0xd3, 0xa1, 0x47, 0x8e, 0xbf, 0x0e, 0xb0, 0x8b, 0x64, 0x8f, 0x15, 0xdc, 0x2f, 0x30, 0x6a, 0x78, 0xd0, 0x33, 0xf6, 0x57, 0xea, 0xf8, 0xa8, 0x7a, 0x0f, 0x21, 0xae, 0x2d, 0xeb, 0xf3, 0x44, 0x89, 0xbf, 0xfe, 0xca, 0x3c, 0x12, 0x00, 0x1a, 0x8d, 0xa3, 0x07, 0x18, 0x9a, 0xa1, 0xd6, 0x8b, 0xe4, 0x1e, 0x8a, 0x2b, 0x0e, 0xc2, 0x7d, 0xfa, 0xe2, 0xbc, 0x6b, 0xd8, 0x95, 0xfe, 0xd3, 0x52, 0x4c, 0xaa, 0xa0, 0xbc, 0xde, 0xc7, 0x09, 0x7f, 0xdc, 0x39, 0xb6, 0xb3, 0xcf, 0xf0, 0x24, 0xf1, 0xc0, 0x5f, 0x4a, 0x62, 0xfe, 0x30, 0x7d, 0x1c, 0x1b, 0x36, 0x91, 0xaf, 0x38, 0xa3, 0x41, 0xfa, 0x82, 0x7b, 0xd0, 0x44, 0xfd, 0x48, 0xf1, 0x88, 0x81, 0x10, 0xe5, 0x0f, 0x02, 0x84, 0xe3, 0x44, 0x14, 0x7a, 0xbc, 0xc5, 0xad, 0x9d, 0xbf, 0xb6, 0x2d, 0x63, 0xda, 0x5a, 0x9d, 0x40, 0x03, 0xe4, 0x34, 0x1a, 0xd6, 0x8a, 0x20, 0xfc, 0x80, 0xdc, 0x83, 0x0e, 0xdb, 0x54, 0xbb, 0xc5, 0xda, 0x2e, 0xe6, 0x57, 0x28, 0x79, 0xa5, 0x72, 0x0c, 0x6f, 0x21, 0x2d, 0x90, 0x02, 0x4c, 0x3f, 0xe2, 0xb7, 0x6a, 0x6e, 0xfa, 0xb7, 0xcf, 0x4b, 0x7d, 0x24, 0xea, 0x1d, 0xe2, 0xa9, 0x82, 0x1b, 0xd3, 0x55, 0x40, 0xde, 0xd6, 0xa9, 0x6e, 0x15, 0x2c, 0xef, 0xfe, 0x7b, 0xf9, 0xce, 0xce, 0x06, 0xa6, 0x1c, 0x2a, 0x61, 0x84, 0xf3, 0x93, 0x9d, 0xb2, 0x07, 0xbe, 0x24, 0x40, 0x36, 0xe0, 0xee, 0x94, 0x61, 0x29, 0xf7, 0x0d, 0x7b, 0x8e, 0xf0, 0xe7, 0xdf, 0xcc, 0x34, 0x5f, 0xe7, 0xaa, 0xff, 0x17, 0xba, 0x7e, 0xda, 0xbb, 0x65, 0xf2, 0x5a, 0xe5, 0x2e, 0x08, 0x0a, 0x3e, 0x24, 0x5c, 0xa6, 0xe7, 0xfb, 0xaa, 0x8a, 0x17, 0x17, 0x8f, 0x69, 0x05, 0xe7, 0x94, 0x42, 0x08, 0x74, 0x68, 0x90, 0xfc, 0x3a, 0x6d, 0xc2, 0xe9, 0x36, 0x76, 0xea, 0xdf, 0x40, 0xd0, 0xb9, 0x24, 0x9b, 0x7f, 0xab, 0x92, 0xcb, 0xc9, 0x7f, 0x3a, 0xa6, 0xf9, 0xea, 0x4d, 0xae, 0x5d, 0x8c, 0x3d, 0x9e, 0x91, 0x23, 0x1f, 0x43, 0xff, 0xff, 0x54, 0x8d, 0xa7, 0xb6, 0x68, 0xe6, 0x1c, 0x18, 0x3a, 0xc2, 0xcf, 0x65, 0x5d, 0x78, 0x90, 0xbe, 0xbf, 0x50, 0x52, 0xda, 0x88, 0xdd, 0x2f, 0xfa, 0x45, 0x8d, 0xac, 0x1f, 0x46, 0x7e, 0x3d, 0x7a, 0x44, 0x93, 0x0c, 0x24, 0x48, 0xc8, 0xf6, 0x0f, 0xc7, 0xc2, 0xd6, 0x3d, 0x12, 0xab, 0x07, 0x2f, 0xee, 0x3c, 0x24, 0xa1, 0x7e, 0x1b, 0x12, 0x74, 0x6a, 0x68, 0x41, 0xec, 0x3a, 0x92, 0x2e, 0x1b, 0x03, 0x70, 0x2d, 0x9d, 0x46, 0x8d, 0x65, 0x86, 0x15, 0xc3, 0x1c, 0x99, 0x77, 0x0b, 0x35, 0xbb, 0x0e, 0x93, 0xf6, 0xa7, 0xf7, 0x11, 0x0f, 0xe2, 0xf2, 0x58, 0xd8, 0xf2, 0xc3, 0x28, 0xdb, 0xcb, 0xd8, 0x4b, 0x92, 0x8a, 0x2b, 0xdd, 0x72, 0x65, 0x6a, 0xec, 0x28, 0xe2, 0x56, 0x41, 0x22, 0x48, 0x69, 0x7c, 0x51, 0x53, 0xbb, 0x67, 0x2d, 0x2c, 0x26, 0x84, 0xfa, 0x98, 0xa8, 0xe8, 0x4a, 0x70, 0x0a, 0x4c, 0xc4, 0x51, 0xbf, 0x62, 0x23, 0x94, 0x0f, 0x65, 0x82, 0x81, 0x75, 0xf4, 0xd6, 0xbf, 0x45, 0x20, 0xbc, 0x0f, 0x91, 0xc4, 0x75, 0x3b, 0x4e, 0x15, 0x2e, 0x48, 0xb3, 0x79, 0x85, 0xf3, 0xe2, 0x9d, 0x4a, 0x5c, 0xca, 0xc1, 0x82, 0xfc, 0x4c, 0x57, 0xb2, 0xdc, 0x9c, 0xcd, 0x5a, 0x09, 0xeb, 0xa7, 0xbf, 0x43, 0x43, 0xd0, 0xed, 0xf5, 0xb2, 0x32, 0xfd, 0x6a, 0xaa, 0x84, 0x94, 0x3d, 0xa8, 0x63, 0xac, 0x11, 0x14, 0xa5, 0x97, 0x83, 0x68, 0xea, 0x40, 0x5d, 0x95, 0x73, 0xb5, 0x0c, 0xa3, 0x38, 0xe2, 0x55, 0x97, 0x34, 0x9f, 0x43, 0x99, 0x04, 0xee, 0x64, 0x56, 0xb0, 0x7d, 0x35, 0xa4, 0xc9, 0x73, 0xda, 0x64, 0xb4, 0x69, 0x12, 0xad, 0x45, 0xb5, 0x6b, 0x27, 0x90, 0xef, 0xb2, 0xb4, 0xfb, 0xae, 0xae, 0x56, 0x98, 0x93, 0x0e, 0x4d, 0xb2, 0x89, 0x9f, 0x7f, 0xa6, 0x4a, 0xc2, 0x1d, 0xf4, 0x26, 0x1e, 0x84, 0x96, 0x00, 0x92, 0x61, 0x91, 0x99, 0x6d, 0x19, 0xc9, 0x11, 0xe2, 0x68, 0x19, 0xaa, 0xb6, 0x48, 0xa3, 0xd0, 0x3c, 0x14, 0x65, 0x56, 0x83, 0xed, 0x0e, 0x03, 0xce, 0x5d, 0x0f, 0x4d, 0x44, 0x3a, 0xf4, 0x64, 0xe9, 0xcd, 0xf5, 0x72, 0xcd, 0x34, 0xc8, 0x21, 0x84, 0x05, 0xba, 0x5f, 0xd5, 0x34, 0xfe, 0x5e, 0xb6, 0x37, 0x45, 0xde, 0x79, 0x67, 0x8f, 0xae, 0x40, 0xaa, 0x40, 0x70, 0xb6, 0x4f, 0x76, 0x9e, 0x01, 0x39, 0x9a, 0xca, 0xf2, 0x40, 0x35, 0x2a, 0x7f, 0xd4, 0x05, 0x53, 0x74, 0xe3, 0x51, 0x45, 0x65, 0xfd, 0x79, 0xa8, 0xe7, 0xb7, 0xd1, 0x55, 0x00, 0x4d, 0xaf, 0x18, 0xdb, 0x8b, 0xc3, 0xb4, 0xc0, 0xed, 0xa7, 0x28, 0x44, 0x05, 0xb7, 0x31, 0xbd, 0x1d, 0x23, 0x10, 0xf9, 0x1e, 0x43, 0x8d, 0x30, 0xb0, 0x2a, 0x3c, 0x36, 0xa3, 0x7d, 0xff, 0xf5, 0x8e, 0x86, 0xcc, 0x1b, 0xb5, 0x84, 0xb1, 0x10, 0x30, 0x45, 0x15, 0x2b, 0x4a, 0xf7, 0x40, 0x25, 0x28, 0x3c, 0x1e, 0xce, 0xab, 0x7c, 0x3f, 0xfe, 0x96, 0x7f, 0x23, 0xcf, 0xf4, 0x3b, 0xb5, 0x09, 0xb4, 0xea, 0x15, 0xde, 0x97, 0x60, 0x9a, 0xd8, 0x4c, 0x9c, 0x18, 0x0f, 0xd9, 0x9d, 0x5e, 0x9f, 0x3c, 0x77, 0x03, 0x59, 0x52, 0xa5, 0x63, 0xb9, 0xf9, 0xa1, 0xe4, 0x18, 0x71, 0xb2, 0x7e, 0x23, 0x09, 0x05, 0x7a, 0x8c, 0xf7, 0x00, 0x79, 0x00, 0x87, 0xd3, 0xb9, 0x58, 0x78, 0x50, 0x94, 0x13, 0xa2, 0xfc, 0x49, 0x04, 0xdd, 0x66, 0xff, 0x48, 0x1f, 0xb7, 0x07, 0x7b, 0xe4, 0x8b, 0x62, 0x2b, 0xd3, 0xff, 0x83, 0x8d, 0x9e, 0x0b, 0x55, 0x6f, 0x2a, 0x13, 0x80, 0x6e, 0xf0, 0xb8, 0xe9, 0x69, 0xa3, 0xf4, 0x77, 0x36, 0x12, 0x66, 0x1d, 0x93, 0x51, 0xea, 0x15, 0x5f, 0x13, 0x6d, 0x69, 0x0a, 0x5b, 0x00, 0xb8, 0x4a, 0x54, 0x2a, 0x37, 0x0f, 0x7c, 0x83, 0xf6, 0xba, 0x08, 0x7e, 0x65, 0x89, 0x85, 0x87, 0x16, 0x56, 0xbb, 0x4e, 0xc4, 0x82, 0xd6, 0x62, 0x95, 0x2c, 0xc8, 0x01, 0x9c, 0xa6, 0xe9, 0x2f, 0xa2, 0x29, 0xe0, 0x05, 0x26, 0xc7, 0xc7, 0x4c, 0xa2, 0xa2, 0x8a, 0x4a, 0x10, 0x5c, 0x90, 0xdc, 0xad, 0xce, 0x9e, 0xc5, 0xfd, 0xfd, 0xf8, 0x46, 0x0f, 0x49, 0xc9, 0xef, 0x02, 0xe8, 0xc4, 0xb4, 0xc8, 0x93, 0x0c, 0x43, 0x2a, 0x7f, 0x51, 0x95, 0x0c, 0x8f, 0x3c, 0xc3, 0xf3, 0xc8, 0x0e, 0x1c, 0xc4, 0x05, 0x84, 0x74, 0xcf, 0xec, 0xfd, 0xbe, 0x0b, 0x20, 0xde, 0xde, 0xa3, 0xb8, 0x36, 0xb8, 0xb2, 0xf1, 0x9e, 0x8d, 0x4b, 0x1f, 0x64, 0x87, 0xbd, 0xea, 0xe8, 0x92, 0x15, 0xb6, 0x45, 0x6e, 0xe4, 0x63, 0x34, 0x02, 0x42, 0x37, 0x2e, 0xf4, 0x12, 0x18, 0xd1, 0x76, 0x88, 0xff, 0x85, 0x63, 0xe9, 0xa9, 0x5f, 0x8a, 0x92, 0x90, 0x46, 0x4a, 0x3c, 0x19, 0x54, 0x5f, 0x7e, 0x0f, 0x7e, 0xfb, 0x93, 0x50, 0x78, 0x18, 0x5e, 0xc6, 0xd3, 0x0d, 0xab, 0x99, 0x69, 0x60, 0xb8, 0xa3, 0xfa, 0xdc, 0xf4, 0x25, 0x17, 0xe3, 0x06, 0xb8, 0x3f, 0x05, 0x11, 0x86, 0x49, 0xd1, 0x37, 0xb9, 0x01, 0xea, 0x5c, 0x34, 0x16, 0x5e, 0x2c, 0x81, 0x34, 0x34, 0x5f, 0x0b, 0x6d, 0x44, 0x3b, 0x8e, 0xdd, 0x4c, 0x5b, 0xcb, 0x8e, 0x3f, 0xb0, 0x80, 0x99, 0xe0, 0xc5, 0x97, 0x8e, 0x90, 0x47, 0x9e, 0x16, 0x64, 0xc4, 0x77, 0xd7, 0x7b, 0xb3, 0x51, 0x98, 0x8f, 0xb5, 0xd7, 0xa6, 0xc9, 0x1a, 0xa6, 0x76, 0xda, 0xa7, 0x05, 0x8b, 0x47, 0x96, 0xd0, 0x9a, 0x04, 0xdf, 0xb6, 0xed, 0x45, 0xb6, 0xa5, 0x05, 0x91, 0x55, 0x81, 0x83, 0x18, 0xfb, 0x1c, 0x49, 0x46, 0x35, 0x63, 0xdc, 0x98, 0x5c, 0xd5, 0x0c, 0xaf, 0x5f, 0x3a, 0xd8, 0xa3, 0xc2, 0x91, 0x8c, 0x99, 0xe7, 0x4a, 0x2c, 0x98, 0x8d, 0xb5, 0x15, 0x98, 0x96, 0xbb, 0xe2, 0xdc, 0x0d, 0xcc, 0x8d, 0x82, 0x67, 0x18, 0xd6, 0x59, 0x09, 0x02, 0xe9, 0xf2, 0x0b, 0xd1, 0x3b, 0xfa, 0x3c, 0xa9, 0xb5, 0xc6, 0x66, 0xbb, 0x14, 0x30, 0xd3, 0xb8, 0x90, 0xa2, 0x0f, 0x8b, 0xbb, 0x70, 0xf0, 0x47, 0xad, 0x6b, 0xd4, 0x5e, 0x5e, 0xb3, 0x2a, 0x15, 0x53, 0xcc, 0x34, 0x34, 0x7d, 0xf4, 0x0a, 0x02, 0x5e, 0xb4, 0xe3, 0x70, 0x6d, 0xb6, 0x90, 0x95, 0xbc, 0xd6, 0x49, 0x5a, 0xd8, 0x7b, 0xac, 0x77, 0xf0, 0x28, 0x03, 0x9e, 0x3a, 0x4e, 0xc6, 0xf5, 0x93, 0x65, 0x61, 0xca, 0x66, 0x3a, 0x36, 0x83, 0xce, 0x8b, 0xe6, 0xd3, 0xff, 0xd1, 0xcc, 0x34, 0xe2, 0x5d, 0xcb, 0x91, 0xff, 0xa6, 0x4a, 0x42, 0xa0, 0xe2, 0x7c, 0x3e, 0x33, 0xd3, 0xe5, 0x8c, 0xf1, 0xe4, 0x1a, 0xfb, 0xbd, 0x74, 0xc8, 0x13, 0x4f, 0x72, 0xf7, 0x4b, 0x91, 0x2a, 0x90, 0x7d, 0x49, 0x5e, 0x1d, 0x96, 0xf9, 0x99, 0xd1, 0x92, 0x03, 0xc0, 0xc8, 0xa8, 0x11, 0xea, 0x8f, 0xc1, 0xb4, 0x71, 0xe7, 0x2f, 0x4c, 0x4a, 0xc6, 0x9c, 0x27, 0x91, 0x9f, 0x40, 0xed, 0x68, 0xe3, 0x58, 0x3b, 0x02, 0xc8, 0xd3, 0x8e, 0xfb, 0x49, 0x4e, 0x63, 0xeb, 0x6e, 0x42, 0x9c, 0x3a, 0xcd, 0x7c, 0x26, 0x36, 0x51, 0xce, 0xd9, 0x62, 0x3a, 0x05, 0x9f, 0x11, 0x65, 0x1a, 0xd9, 0x34, 0xce, 0xad, 0xfe, 0x71, 0x53, 0xae, 0x85, 0x75, 0xbb, 0x5e, 0x06, 0x8a, 0xf6, 0x76, 0x9c, 0x6c, 0xa6, 0xa5, 0x8d, 0x58, 0xdf, 0x40, 0x2d, 0x67, 0x2b, 0x36, 0xff, 0x1a, 0xd2, 0x42, 0x1e, 0x36, 0x58, 0x64, 0xdb, 0xd2, 0x46, 0x91, 0xa8, 0xae, 0x2e, 0xaa, 0x35, 0xc6, 0xe9, 0xab, 0xd8, 0x27, 0x23, 0x25, 0x32, 0x02, 0x1a, 0xee, 0x10, 0xff, 0xa2, 0x16, 0x8f, 0xd3, 0x6d, 0x1e, 0x84, 0x15, 0x89, 0x65, 0x1a, 0x4d, 0x2a, 0xe3, 0xbd, 0x4f, 0xaa, 0x19, 0x37, 0xc7, 0xce, 0x48, 0x19, 0x14, 0x4b, 0xe2, 0x5d, 0x5a, 0x88, 0x3e, 0x49, 0xd2, 0xa6, 0x8f, 0x97, 0x65, 0xbe, 0x17, 0xd2, 0x7a, 0x69, 0x98, 0x03, 0x0c, 0x86, 0x0c, 0x8d, 0xff, 0x37, 0x95, 0x56, 0xb4, 0x2d, 0xb7, 0x27, 0xdb, 0x26, 0xc5, 0x56, 0x88, 0xb3, 0x99, 0xa2, 0x89, 0x3f, 0x88, 0x5e, 0xf8, 0x4d, 0x96, 0xd2, 0x0c, 0x01, 0xe5, 0xde, 0x34, 0xe2, 0x74, 0xe0, 0x67, 0xde, 0x06, 0xd8, 0xb5, 0x8f, 0x5f, 0xca, 0x23, 0xbc, 0xb6, 0x64, 0xb5, 0x23, 0x68, 0xe1, 0xcc, 0x75, 0xea, 0x2d, 0xb2, 0xa3, 0x01, 0x4a, 0x74, 0x58, 0x35, 0xf2, 0xf0, 0xc6, 0x83, 0x7e, 0x2e, 0xa6, 0x52, 0x06, 0xf4, 0x7a, 0xa8, 0xca, 0x94, 0x16, 0x9e, 0xd0, 0x09, 0x5e, 0x11, 0xcf, 0x42, 0x51, 0x9b, 0x4c, 0xbe, 0x47, 0xc1, 0x03, 0x59, 0x76, 0x6e, 0x88, 0x66, 0xbb, 0xa1, 0x2e, 0xfd, 0x98, 0x62, 0x28, 0x96, 0x79, 0xfa, 0xee, 0xd7, 0x3b, 0x63, 0xe3, 0xab, 0xee, 0xfe, 0x34, 0x94, 0xda, 0x84, 0x03, 0x42, 0xc1, 0x3f, 0xc5, 0x64, 0x64, 0x7a, 0xe8, 0xbe, 0x48, 0x36, 0xb9, 0x7c, 0xba, 0x1e, 0x86, 0xc6, 0x11, 0xbd, 0xff, 0x94, 0x33, 0xef, 0xe2, 0xc4, 0x5b, 0x95, 0xd8, 0x6a, 0x19, 0x8d, 0x9a, 0x67, 0x9a, 0xe2, 0x57, 0x3d, 0x29, 0x3f, 0x5a, 0x21, 0xf6, 0xaa, 0xe8, 0x52, 0x16, 0x6e, 0x67, 0xaa, 0xcc, 0x59, 0xc6, 0x72, 0x07, 0x28, 0x18, 0x7b, 0x2b, 0x40, 0x82, 0x6a, 0x14, 0x9f, 0x58, 0x54, 0x59, 0x11, 0x83, 0x8b, 0xcd, 0xa7, 0x26, 0xb7, 0x4c, 0x65, 0x81, 0x28, 0xb4, 0x3b, 0x15, 0x6a, 0x31, 0x37, 0x08, 0x1a, 0xbe, 0xf8, 0xcc, 0xf9, 0xe8, 0x66, 0xfc, 0x3f, 0xd5, 0xa0, 0x86, 0x32, 0x86, 0x36, 0x0f, 0xf6, 0x59, 0x99, 0x93, 0xa7, 0xd2, 0xcf, 0x4c, 0xa5, 0x9a, 0x6b, 0xd6, 0x2f, 0xc8, 0xbd, 0x90, 0x34, 0x60, 0x46, 0x45, 0x65, 0x19, 0x6e, 0x0c, 0x8f, 0x64, 0x7a, 0x6c, 0x28, 0xa9, 0xb8, 0xc4, 0x28, 0xd4, 0xfc, 0xea, 0x1a, 0x10, 0x50, 0x13, 0x72, 0xd2, 0xe8, 0xf3, 0x21, 0x1a, 0x54, 0x25, 0x67, 0xf6, 0xf9, 0xcc, 0xe8, 0x47, 0xc2, 0x7b, 0x03, 0xc7, 0x13, 0x52, 0x5f, 0x4b, 0xff, 0x6a, 0xc6, 0x46, 0xba, 0x74, 0x37, 0x8f, 0x51, 0x9c, 0x36, 0x64, 0x98, 0xb4, 0x67, 0xae, 0x64, 0x8e, 0x5b, 0x86, 0xfb, 0xa9, 0xaa, 0xf9, 0xc9, 0x10, 0x42, 0x08, 0x55, 0x80, 0xfe, 0xf3, 0x73, 0xc9, 0x7b, 0xb8, 0xba, 0x76, 0x27, 0xd6, 0x38, 0xb0, 0x9a, 0x56, 0x65, 0x60, 0x2a, 0x0c, 0x56, 0x94, 0xb9, 0x1b, 0x33, 0x24, 0xd2, 0xb7, 0xeb, 0x95, 0xf5, 0x2f, 0x26, 0x3d, 0x2e, 0x2a, 0x7c, 0xa8, 0xec, 0x30, 0xe4, 0x3b, 0x11, 0x6d, 0x6f, 0x17, 0x46, 0xb2, 0x36, 0x41, 0x91, 0xbd, 0x90, 0xff, 0x29, 0xba, 0x89, 0x85, 0x89, 0x0a, 0x90, 0xd0, 0xc3, 0x42, 0x70, 0xd3, 0x17, 0x77, 0x82, 0xd1, 0xc4, 0xb9, 0x20, 0x0a, 0x1e, 0xdd, 0x5c, 0x99, 0xe1, 0x80, 0xf2, 0x9d, 0xc5, 0x48, 0x7c, 0x97, 0x52, 0x6d, 0xe5, 0x13, 0xf6, 0x78, 0x20, 0x8b, 0x55, 0x4b, 0x1a, 0x88, 0xe0, 0x62, 0xed, 0x0a, 0xa9, 0x58, 0x56, 0x2a, 0x75, 0xad, 0x69, 0xfe, 0x13, 0xc6, 0x83, 0xbd, 0xed, 0x35, 0x81, 0x23, 0xdd, 0x3b, 0x2f, 0x17, 0x42, 0x8b, 0x03, 0x8c, 0x52, 0x51, 0x0c, 0xa5, 0xb2, 0x73, 0x25, 0x1c, 0x44, 0x17, 0x6e, 0xe4, 0x40, 0x65, 0xfd, 0x0d, 0x86, 0x8e, 0xd0, 0xe9, 0x32, 0x0d, 0x06, 0x6d, 0x71, 0x2d, 0x4f, 0xd9, 0x94, 0xcb, 0xa2, 0x9c, 0x63, 0x5d, 0x2e, 0x71, 0xb4, 0x33, 0x92, 0xcf, 0x3c, 0xfd, 0x50, 0x80, 0xa4, 0x8e, 0x7f, 0x8f, 0xdf, 0xdf, 0xc1, 0x68, 0xbc, 0x57, 0x75, 0x3b, 0xb7, 0x49, 0x2e, 0xa1, 0x15, 0xbf, 0x63, 0x82, 0x30, 0x76, 0x68, 0x36, 0x0f, 0x29, 0x9c, 0xea, 0x39, 0x12, 0xe5, 0x46, 0xcb, 0xaf, 0x59, 0x4d, 0xc9, 0xc2, 0x3e, 0x84, 0xb2, 0x9b, 0x35, 0x56, 0x57, 0x99, 0xb2, 0xb7, 0xec, 0xef, 0xaf, 0x08, 0x60, 0xa4, 0xa2, 0x3a, 0xea, 0xde, 0xac, 0x37, 0xe5, 0x5f, 0x13, 0x7d, 0xdd, 0x50, 0xf2, 0x0c, 0xea, 0x3d, 0x2f, 0x83, 0x3c, 0x62, 0xae, 0x86, 0xf8, 0x25, 0xc4, 0x62, 0x43, 0xe3, 0xef, 0xf4, 0x9b, 0xef, 0xc4, 0xc7, 0x6e, 0xd8, 0x28, 0x7c, 0xe5, 0xeb, 0xc3, 0x6f, 0x01, 0xf9, 0xb2, 0x97, 0xea, 0x5b, 0x7c, 0xae, 0x84, 0x32, 0x48, 0x92, 0x42, 0xf3, 0x4d, 0xec, 0x3f, 0x24, 0x89, 0x0f, 0x8b, 0x60, 0xb6, 0x23, 0xc2, 0xa1, 0x7a, 0x82, 0xe4, 0xbf, 0xde, 0x62, 0x60, 0x33, 0x01, 0xb5, 0x72, 0x21, 0x0e, 0x4d, 0xaf, 0x96, 0x6b, 0x44, 0xdf, 0x0e, 0x33, 0x9b, 0x0a, 0x39, 0xe7, 0x21, 0xd6, 0xfe, 0x60, 0x96, 0x10, 0xc1, 0x08, 0x11, 0x88, 0xe1, 0x4a, 0x9f, 0x22, 0x85, 0x47, 0x2d, 0x2a, 0x99, 0xcb, 0xa8, 0xe8, 0x13, 0x7f, 0x62, 0x74, 0x7b, 0x60, 0xb8, 0xcc, 0xaa, 0x6f, 0xf2, 0x24, 0xd2, 0xaa, 0x6a, 0x7d, 0xbe, 0x3c, 0xf1, 0x79, 0x5b, 0xf1, 0x6e, 0x6e, 0x78, 0xec, 0xc8, 0xb9, 0xca, 0x9c, 0x06, 0x55, 0x33, 0xec, 0xb5, 0xac, 0x43, 0xba, 0x8a, 0xac, 0x00, 0x8b, 0x49, 0x1e, 0xe2, 0x7d, 0xe5, 0x33, 0x22, 0x7d, 0xe9, 0x60, 0x35, 0xb9, 0x16, 0x6c, 0x93, 0x58, 0x4e, 0xc8, 0xbc, 0x69, 0xb1, 0x1e, 0x7d, 0x1a, 0x05, 0x2c, 0x6f, 0x2b, 0x5b, 0xd3, 0xc2, 0xa2, 0xef, 0x6b, 0x38, 0xbf, 0x51, 0x5a, 0x74, 0x32, 0xc2, 0xe5, 0x75, 0x8c, 0xe1, 0x46, 0x5e, 0xf4, 0x87, 0xfe, 0x78, 0x1b, 0xef, 0x6c, 0x79, 0x72, 0x1a, 0x9f, 0x07, 0x9a, 0x71, 0x69, 0x78, 0x1b, 0xad, 0xb4, 0xdc, 0x5a, 0xf4, 0x19, 0x3d, 0xc5, 0x44, 0xaf, 0x25, 0x51, 0x15, 0x21, 0x61, 0x26, 0x3a, 0x04, 0x05, 0x98, 0x09, 0x67, 0xb0, 0x5a, 0xbb, 0xab, 0x11, 0xee, 0x16, 0x95, 0xaa, 0x60, 0x49, 0xa1, 0xd4, 0x34, 0x17, 0x99, 0x04, 0x9d, 0x37, 0x67, 0x4c, 0xf0, 0xfb, 0x28, 0x25, 0x57, 0x31, 0x81, 0x6b, 0xca, 0x47, 0x36, 0xa9, 0x3b, 0xb2, 0xf8, 0x97, 0x11, 0x8f, 0x7f, 0xe1, 0xd8, 0x8b, 0xd9, 0x2a, 0x37, 0x01, 0x02, 0x51, 0x22, 0x63, 0xb4, 0xf3, 0x50, 0xdb, 0x80, 0x31, 0xf0, 0x32, 0x1e, 0xb3, 0x98, 0xf0, 0x02, 0xec, 0x7e, 0xc5, 0x2f, 0xa0, 0xea, 0x27, 0x50, 0xa4, 0xeb, 0x3d, 0x05, 0xe6, 0x4a, 0xfc, 0x7b, 0xad, 0xbc, 0x90, 0x3f, 0x21, 0x5b, 0xfd, 0x54, 0x0d, 0x57, 0x06, 0x83, 0xe4, 0xe9, 0x4e, 0xf2, 0x02, 0x89, 0xbd, 0xf8, 0x35, 0x61, 0x25, 0x30, 0x7c, 0x01, 0x25, 0xcc, 0x0e, 0x54, 0x4e, 0x2c, 0x9e, 0xd3, 0x85, 0xb0, 0xde, 0xf8, 0xa8, 0xca, 0x42, 0xf6, 0x75, 0x57, 0x06, 0xa7, 0xa7, 0x2f, 0x72, 0xc6, 0x61, 0xfa, 0x5d, 0x5e, 0xd0, 0x46, 0xf0, 0x82, 0x0d, 0xd7, 0xac, 0x3f, 0x40, 0x3e, 0xae, 0xcf, 0x0b, 0xae, 0x32, 0x0f, 0x26, 0x0a, 0x57, 0x34, 0x46, 0x42, 0x22, 0xb9, 0x44, 0xe0, 0xc4, 0x9b, 0x7b, 0xde, 0x20, 0xc9, 0x72, 0xbb, 0x88, 0xd6, 0xbb, 0xce, 0xc7, 0xf2, 0x1a, 0xd9, 0x65, 0x18, 0xea, 0xe1, 0x26, 0x89, 0xbd, 0x3d, 0xd4, 0x78, 0x43, 0xee, 0x3e, 0x07, 0x6d, 0x2e, 0x81, 0x72, 0xd1, 0x4b, 0x86, 0x8a, 0x51, 0xb6, 0xcc, 0x66, 0xf7, 0x57, 0x68, 0x55, 0x24, 0x24, 0x4a, 0x16, 0xea, 0xf2, 0xc1, 0x4c, 0xb6, 0x8b, 0x42, 0x2c, 0x32, 0x00, 0x65, 0x79, 0x69, 0x41, 0x30, 0xb2, 0x2d, 0xea, 0x98, 0x8a, 0xb5, 0x60, 0x45, 0x98, 0x8b, 0x1d, 0x96, 0x50, 0xa6, 0x48, 0xe5, 0x32, 0xd2, 0x89, 0x0c, 0x41, 0x59, 0x1b, 0x27, 0xb7, 0xdc, 0x23, 0x9c, 0xf7, 0x82, 0x40, 0x59, 0xc3, 0x55, 0x63, 0x5d, 0xaf, 0xe8, 0xe1, 0x7a, 0xd5, 0x3d, 0xc6, 0x59, 0xcb, 0xe7, 0x6d, 0xbe, 0xd2, 0x6c, 0x4d, 0x0d, 0x50, 0xed, 0x16, 0x0e, 0x81, 0x09, 0xfd, 0xed, 0x69, 0xfe, 0x53, 0x85, 0x0d, 0x11, 0x5d, 0xdd, 0xe2, 0x31, 0x60, 0xf3, 0x86, 0xd7, 0xfb, 0xb9, 0xae, 0x30, 0xb9, 0x5e, 0x60, 0x7e, 0xe7, 0xce, 0x62, 0xbc, 0xa3, 0x7c, 0xf2, 0x80, 0x36, 0x5f, 0xb7, 0x26, 0xa4, 0x3a, 0xf8, 0x2b, 0x81, 0x21, 0x0c, 0xd7, 0x05, 0x39, 0x11, 0x1f, 0x63, 0xbf, 0xe1, 0xc9, 0x57, 0x4c, 0x42, 0xd1, 0xfe, 0x57, 0x5d, 0x0c, 0xeb, 0xfb, 0x72, 0x0b, 0x77, 0xfa, 0xc9, 0x42, 0x58, 0x03, 0xec, 0x69, 0x76, 0x30, 0x13, 0x23, 0xfa, 0xd3, 0xe0, 0xde, 0xa7, 0x72, 0x4c, 0xfa, 0x6d, 0x10, 0xe2, 0x2d, 0x3b, 0xae, 0x2b, 0x26, 0x16, 0x12, 0x69, 0x70, 0x68, 0xc7, 0x87, 0x9a, 0x9a, 0x65, 0x51, 0x95, 0xe4, 0x13, 0xe1, 0x5d, 0x64, 0x49, 0x59, 0xdb, 0x6e, 0xdb, 0xd8, 0x0b, 0x24, 0x33, 0xa6, 0x5a, 0x46, 0xdd, 0xb2, 0x52, 0x4b, 0x4a, 0x3f, 0x78, 0xb0, 0xcd, 0xda, 0x75, 0x90, 0xea, 0x8f, 0x75, 0x75, 0xd0, 0x5c, 0xcd, 0x6e, 0x24, 0xe6, 0xe0, 0x61, 0x00, 0x6b, 0x43, 0xa3, 0x3c, 0xf8, 0x1f, 0xc6, 0xec, 0xdc, 0xd7, 0xb2, 0x29, 0x5c, 0xeb, 0xf7, 0x15, 0xa8, 0x1d, 0x62, 0x19, 0x0e, 0xd2, 0xcf, 0x71, 0x6e, 0xba, 0x3d, 0xeb, 0xee, 0xb3, 0x28, 0xeb, 0xee, 0xeb, 0x13, 0xb3, 0x3f, 0x45, 0x64, 0xe1, 0x8f, 0xff, 0x74, 0x39, 0x28, 0x91, 0xe7, 0xa5, 0xdb, 0xd8, 0x39, 0x7a, 0x36, 0x73, 0x9a, 0xfd, 0xfe, 0x6e, 0xfc, 0x26, 0xd9, 0x1d, 0x6a, 0xa4, 0x4a, 0x4b, 0x9b, 0x20, 0xe2, 0x95, 0xc7, 0xc6, 0xb5, 0x10, 0xb9, 0x02, 0x0c, 0x32, 0x26, 0x87, 0x59, 0xef, 0x3d, 0x96, 0x70, 0x22, 0x7f, 0x7d, 0xf3, 0x2f, 0xd1, 0x5e, 0x0e, 0xe6, 0xcf, 0x31, 0x65, 0xab, 0x64, 0x0c, 0x4b, 0xd4, 0x97, 0xa2, 0x35, 0x53, 0xa8, 0x0b, 0x6e, 0x95, 0x5c, 0xc3, 0x0c, 0xaa, 0x95, 0xf4, 0x22, 0xa5, 0x25, 0xf8, 0x37, 0x46, 0xe4, 0x19, 0xf7, 0xd6, 0x01, 0x9c, 0x29, 0x53, 0x95, 0xff, 0xe1, 0xcd, 0x7e, 0x7e, 0xf7, 0x10, 0x6a, 0xdc, 0xb7, 0x83, 0x32, 0x5f, 0xda, 0x50, 0x6a, 0x1d, 0xb6, 0xc5, 0x36, 0x76, 0xb1, 0xfb, 0x5e, 0xe2, 0xfb, 0xb5, 0xa5, 0xed, 0x7d, 0x8a, 0x57, 0x7f, 0x0c, 0x47, 0x22, 0x61, 0xe3, 0x8f, 0x26, 0xfd, 0x50, 0xc4, 0x4f, 0x65, 0xad, 0x2b, 0xe3, 0x97, 0x92, 0x4a, 0x57, 0x00, 0x49, 0x95, 0x67, 0x3e, 0x82, 0x4a, 0x66, 0x2a, 0x48, 0x9a, 0xd2, 0x16, 0x34, 0x09, 0x2b, 0x53, 0xe1, 0x17, 0x05, 0xf7, 0x9f, 0x20, 0x5d, 0xdc, 0x6c, 0x81, 0x29, 0xec, 0x20, 0xfc, 0x32, 0x9c, 0xe7, 0x5e, 0x26, 0xb7, 0xf4, 0x5e, 0xe9, 0x5d, 0x74, 0xc9, 0x2d, 0x4b, 0xc1, 0xdc, 0x42, 0x5d, 0xd9, 0xf1, 0x2f, 0x50, 0x0e, 0x5f, 0x01, 0xcd, 0xff, 0x9b, 0x63, 0xa3, 0xc6, 0xa3, 0x6f, 0x55, 0x73, 0x9c, 0xc4, 0xd4, 0xba, 0xb9, 0xd9, 0x8d, 0xe8, 0x60, 0x91, 0xa6, 0x1b, 0x88, 0x0f, 0x85, 0xb3, 0x66, 0xcb, 0x93, 0x04, 0x48, 0xe5, 0x3f, 0x4d, 0xc1, 0xba, 0x45, 0xee, 0x06, 0xb6, 0x30, 0xd5, 0x98, 0x69, 0x1d, 0x3a, 0x23, 0xdc, 0xc3, 0x8c, 0xa6, 0x25, 0xb0, 0xab, 0xd5, 0x39, 0xd5, 0x57, 0xbc, 0x02, 0x45, 0xe9, 0xa4, 0xb1, 0x3a, 0x40, 0x3a, 0x56, 0x59, 0xff, 0xee, 0xad, 0x37, 0xf6, 0x9a, 0x3b, 0x1b, 0xdd, 0x64, 0x9a, 0x06, 0x48, 0xe5, 0x12, 0xf0, 0xd7, 0x8b, 0x69, 0x55, 0xad, 0x3b, 0xfb, 0xf0, 0x24, 0x3b, 0x0d, 0xc7, 0xbf, 0x50, 0x5e, 0x67, 0x61, 0x23, 0xff, 0x71, 0xbc, 0xe9, 0x65, 0x55, 0x0b, 0x43, 0xbd, 0x5e, 0x04, 0x63, 0x7f, 0xef, 0x08, 0x71, 0x46, 0x0c, 0x9e, 0x2d, 0xdf, 0x1b, 0x1f, 0xd5, 0x9f, 0xec, 0xb3, 0x49, 0xfa, 0xf8, 0x7b, 0x6d, 0x52, 0xe6, 0x10, 0xcf, 0x0d, 0x54, 0x2d, 0x8a, 0xea, 0xd3, 0xa8, 0x6a, 0x95, 0x33, 0xa7, 0x50, 0x79, 0x02, 0x10, 0xd8, 0xd5, 0x4f, 0x41, 0x3a, 0x12, 0xb3, 0x02, 0x6e, 0x54, 0x93, 0xb7, 0x94, 0x4f, 0x9f, 0xdb, 0x92, 0x5c, 0x9e, 0xa9, 0xff, 0xcb, 0x6e, 0x1c, 0x40, 0x7b, 0x46, 0x1a, 0xf0, 0xa9, 0x3f, 0xec, 0x86, 0x06, 0x13, 0xf2, 0x31, 0x0c, 0x24, 0x95, 0x07, 0x91, 0xc0, 0x7c, 0x5f, 0x9d, 0xa3, 0x03, 0x7b, 0x79, 0xbd, 0xe9, 0x6b, 0x08, 0x36, 0x48, 0x2d, 0x5a, 0xb0, 0xcb, 0x19, 0x7f, 0xcc, 0x1b, 0x7d, 0x99, 0xef, 0x9a, 0x84, 0x35, 0x46, 0x54, 0x5c, 0xdc, 0x07, 0x33, 0x97, 0xe4, 0xfa, 0x72, 0xd2, 0x8c, 0x39, 0x53, 0x95, 0x49, 0x34, 0x15, 0x7b, 0x5a, 0xf7, 0x20, 0x93, 0xa2, 0xb0, 0x84, 0x05, 0xb7, 0x6b, 0xa1, 0xf9, 0x37, 0x21, 0x27, 0xb4, 0x5b, 0xf1, 0x42, 0x04, 0xce, 0xad, 0x0e, 0xdf, 0xbf, 0x98, 0x51, 0x47, 0x35, 0x6e, 0x69, 0x70, 0xa2, 0xa5, 0x83, 0x25, 0xbc, 0xf3, 0x0e, 0x68, 0x88, 0x10, 0x70, 0x59, 0xb7, 0xbd, 0xf7, 0x59, 0x36, 0x05, 0x12, 0x6e, 0x01, 0xc3, 0xc1, 0xe9, 0x38, 0x64, 0x4a, 0x47, 0x74, 0xee, 0x2e, 0x56, 0x5b, 0x41, 0x5b, 0x99, 0x72, 0x9e, 0xa3, 0xec, 0x33, 0x65, 0x6d, 0x6b, 0x60, 0x23, 0xaa, 0x91, 0x96, 0xcb, 0x0b, 0x9d, 0x25, 0x44, 0x71, 0x3a, 0x1f, 0x24, 0xa6, 0x5e, 0xaf, 0xbc, 0x4a, 0x73, 0xac, 0x54, 0x10, 0xb5, 0x6e, 0xb7, 0x2a, 0xdb, 0xe1, 0xf3, 0x01, 0xf9, 0xd7, 0x5a, 0x2a, 0xa5, 0xa3, 0xcc, 0x95, 0x59, 0xe3, 0x39, 0x08, 0x18, 0x9d, 0x61, 0xcc, 0x54, 0x8e, 0xde, 0xa7, 0x10, 0xbe, 0x65, 0x0a, 0x42, 0x58, 0x49, 0x8a, 0x7b, 0xb9, 0x40, 0x94, 0xc9, 0xc7, 0x6a, 0x5d, 0xdd, 0x84, 0x8f, 0x19, 0x69, 0xe3, 0xa9, 0x6d, 0xcc, 0xda, 0xa2, 0x26, 0xf1, 0xb8, 0x5e, 0x2b, 0x74, 0xb9, 0xfc, 0xb0, 0x07, 0xd7, 0x59, 0xad, 0x15, 0xe4, 0xd6, 0x8f, 0xa5, 0xd6, 0x5c, 0x2d, 0x80, 0x62, 0x9d, 0xfd, 0x96, 0xcc, 0x9c, 0x88, 0x9e, 0xfd, 0x6f, 0x1b, 0xfd, 0xd6, 0x43, 0xc0, 0xe9, 0xc4, 0xa2, 0x6c, 0xce, 0x94, 0xf1, 0x7a, 0xf0, 0x89, 0x3d, 0x58, 0x53, 0xac, 0x37, 0x81, 0xd8, 0x64, 0x7c, 0xab, 0xa8, 0x46, 0x1a, 0x41, 0xd5, 0x2e, 0x50, 0x13, 0x3f, 0x8f, 0x96, 0x4d, 0xb5, 0x07, 0xdd, 0xa5, 0x5d, 0x37, 0x18, 0xd9, 0x56, 0xd1, 0xfb, 0x59, 0x9b, 0xf2, 0x03, 0x40, 0x2b, 0xb3, 0xb6, 0x89, 0x67, 0xfb, 0x2c, 0x80, 0xbb, 0x97, 0xce, 0x76, 0x80, 0x8c, 0x5e, 0xb9, 0x21, 0xab, 0x38, 0xc4, 0x7d, 0x67, 0xd7, 0xb2, 0x8d, 0xe4, 0x9a, 0xf9, 0x47, 0x50, 0xc8, 0x54, 0xc2, 0x76, 0xd3, 0x01, 0x9a, 0x90, 0xd9, 0x2d, 0x96, 0x5d, 0x70, 0xad, 0x88, 0x74, 0xa3, 0xee, 0x75, 0xd8, 0x38, 0x2f, 0xf6, 0xcc, 0x35, 0xed, 0xde, 0xe9, 0xa2, 0x9f, 0x1d, 0x6d, 0x8f, 0xa4, 0xe5, 0xd6, 0x59, 0x7a, 0x0b, 0xb0, 0x2a, 0x30, 0xaf, 0xab, 0xbf, 0x1e, 0x1f, 0xf0, 0x6e, 0xd3, 0xf9, 0xb5, 0x67, 0x4f, 0x90, 0x0f, 0x3a, 0x73, 0x91, 0x08, 0x99, 0xb5, 0xe7, 0xf2, 0x5f, 0x18, 0xdb, 0xfb, 0xd2, 0x5c, 0x80, 0x01, 0x25, 0x71, 0x4e, 0xa7, 0x42, 0x32, 0x0d, 0xa8, 0xc6, 0x50, 0xf5, 0x6b, 0x4c, 0x8c, 0x13, 0xd8, 0xee, 0x2a, 0xee, 0x6b, 0x09, 0xa2, 0x6b, 0x86, 0x41, 0x98, 0xee, 0x0c, 0xc5, 0x0e, 0xc2, 0x2b, 0xd4, 0xd9, 0xbb, 0x79, 0x81, 0x51, 0x19, 0x43, 0xb3, 0x4d, 0xb0, 0x21, 0x6f, 0x4f, 0x46, 0xce, 0x5a, 0xfb, 0x3d, 0x37, 0x79, 0xce, 0x72, 0xd2, 0x3c, 0x0c, 0x64, 0x31, 0xbb, 0xfa, 0x99, 0xd7, 0x3f, 0x4e, 0x3d, 0x4a, 0x04, 0xe4, 0x0d, 0x6a, 0x3d, 0xb2, 0x73, 0x00, 0x59, 0xfe, 0xf2, 0x9a, 0x85, 0xce, 0xc5, 0x97, 0x72, 0xa1, 0xc3, 0x7e, 0x58, 0x5c, 0x86, 0x94, 0x3b, 0x87, 0xcc, 0xad, 0x6d, 0xb9, 0x1d, 0x42, 0x54, 0x51, 0xaf, 0xc4, 0x6d, 0x67, 0x86, 0x30, 0x91, 0x03, 0xdf, 0xe4, 0x77, 0x8c, 0xcf, 0xb1, 0x7b, 0x83, 0x28, 0x31, 0x9d, 0x71, 0x9c, 0x5a, 0xcd, 0x1d, 0x25, 0x54, 0x66, 0x03, 0xa4, 0x88, 0xf8, 0x02, 0xc8, 0xfa, 0x4a, 0x55, 0x31, 0xd8, 0x9f, 0xc4, 0xd5, 0x53, 0x39, 0x1b, 0xa3, 0xad, 0x1c, 0xdc, 0x67, 0x93, 0x14, 0x31, 0xee, 0xae, 0xf9, 0x24, 0x6a, 0x75, 0x32, 0x12, 0x17, 0x45, 0x78, 0x5d, 0x1f, 0xb3, 0xdc, 0x62, 0xbc, 0x21, 0x0c, 0xab, 0x9c, 0x8f, 0xd2, 0x65, 0x89, 0xb4, 0xdd, 0x14, 0x49, 0x4d, 0xc4, 0x85, 0xc3, 0xb6, 0x48, 0x04, 0x64, 0xb7, 0xda, 0xd0, 0xc1, 0xa0, 0x5d, 0xcc, 0x7e, 0x98, 0x2c, 0x77, 0x6e, 0x32, 0x5f, 0x1e, 0xfb, 0x41, 0x4a, 0x51, 0xc9, 0xee, 0x47, 0x93, 0x96, 0x07, 0xb6, 0x55, 0x65, 0x9a, 0x41, 0x26, 0xdb, 0xc3, 0x65, 0x24, 0xe9, 0xc2, 0x2d, 0xb6, 0xab, 0x50, 0x41, 0x7d, 0x90, 0x34, 0x20, 0x87, 0xbc, 0x11, 0xaa, 0xc6, 0xaa, 0x82, 0xe1, 0xc1, 0x16, 0x68, 0xf0, 0x8a, 0x1a, 0x83, 0x6d, 0xf0, 0x97, 0x40, 0xdb, 0xf5, 0xd6, 0xd2, 0x73, 0x83, 0x6f, 0x84, 0x24, 0x5a, 0x6a, 0x4e, 0xd8, 0x4d, 0xa5, 0xa6, 0xf9, 0xae, 0x75, 0x98, 0x33, 0x07, 0x90, 0x19, 0x7c, 0x0a, 0x2b, 0x99, 0x52, 0xcb, 0x5f, 0xd7, 0x44, 0x2d, 0xd1, 0xf9, 0xb4, 0x9a, 0x92, 0xdc, 0xdb, 0xf8, 0x44, 0xa9, 0x0e, 0xd8, 0x7f, 0xa9, 0x3f, 0xf0, 0x73, 0x5a, 0xc6, 0xcb, 0xce, 0xc2, 0x62, 0xbf, 0xe0, 0x03, 0x7a, 0x20, 0xfc, 0x30, 0xa9, 0xb3, 0x22, 0x5f, 0x7a, 0x65, 0xdc, 0xff, 0x70, 0x3d, 0x66, 0x6c, 0x4a, 0x90, 0x11, 0xc1, 0x84, 0x74, 0xe9 ],
+const [ 0x2d, 0x18, 0x66, 0x7c, 0xac, 0x74, 0x03, 0xce, 0x75, 0x17, 0x5d, 0x39, 0x0e, 0x00, 0xc5, 0xd4, 0x00, 0x25, 0xad, 0x5f, 0xda, 0x64, 0xc5, 0xd6, 0x78, 0xbc, 0x63, 0x46, 0x85, 0xbd, 0x28, 0xe0, 0x3f, 0x3d, 0xe1, 0x4c, 0x7a, 0x4d, 0xab, 0x40, 0xe8, 0x6c, 0x5b, 0x50, 0x97, 0xfa, 0x1c, 0x08, 0xbb, 0xef, 0x5a, 0x38, 0xae, 0xcc, 0xdf, 0x8f, 0x35, 0xd2, 0x3c, 0x6b, 0x05, 0x72, 0x6b, 0xf0, 0x86, 0x06, 0xb2, 0x58, 0xd6, 0xbe, 0xca, 0x89, 0x11, 0xdd, 0x41, 0xed, 0xd0, 0x25, 0x1d, 0x7e, 0xef, 0x8f, 0xc2, 0x20, 0x94, 0x40, 0x16, 0x34, 0x6c, 0xb9, 0xe2, 0x6a, 0x38, 0x4e, 0x7c, 0xd6, 0x89, 0xd9, 0xa3, 0x47, 0xc7, 0xaf, 0xaa, 0xd4, 0x78, 0xd3, 0xd9, 0xb7, 0xbf, 0x6a, 0x10, 0x5f, 0x23, 0x6f, 0xad, 0xc0, 0x92, 0xa8, 0xb0, 0xee, 0xa6, 0xd9, 0x1d, 0xea, 0x27, 0x37, 0xa2, 0xbb, 0xd0, 0x1f, 0x7a, 0xc1, 0x56, 0x08, 0x91, 0x47, 0xa6, 0xb7, 0xe9, 0x57, 0x6e, 0xb2, 0x3c, 0xd2, 0xe0, 0xf6, 0xe3, 0xc0, 0xb3, 0xec, 0xf6, 0xe4, 0x6a, 0x9a, 0xb5, 0x93, 0xd8, 0x16, 0x26, 0xc7, 0xe4, 0x41, 0x00, 0x70, 0x8a, 0xb1, 0xc8, 0x0a, 0x22, 0xef, 0x3a, 0x74, 0xe5, 0xe3, 0xea, 0x00, 0xad, 0x8c, 0x2b, 0xc7, 0xfc, 0xf5, 0x30, 0x3f, 0x40, 0x64, 0x71, 0x0f, 0x55, 0xd4, 0x50, 0x21, 0x4c, 0xa5, 0xfd, 0xf9, 0x6b, 0x93, 0x97, 0x46, 0x74, 0xe5, 0x94, 0xb7, 0x2b, 0xe6, 0x62, 0x10, 0x12, 0x99, 0x4e, 0x7d, 0x77, 0xa9, 0xa6, 0x26, 0xb0, 0x9f, 0x1a, 0x03, 0xa6, 0x57, 0x68, 0xf2, 0x90, 0xb5, 0x39, 0x07, 0x01, 0x94, 0x45, 0x23, 0x25, 0xff, 0xbe, 0xc8, 0x47, 0xa4, 0xec, 0x2b, 0x97, 0x85, 0x15, 0x8b, 0x2b, 0xf1, 0x9f, 0xc2, 0x43, 0xb3, 0x78, 0x1a, 0xd1, 0x89, 0xb6, 0x61, 0x39, 0xd8, 0x7b, 0x40, 0x55, 0x9d, 0x1c, 0xc8, 0xbc, 0xa7, 0x82, 0x4e, 0x44, 0x04, 0xd0, 0x79, 0xc5, 0xb9, 0x45, 0x99, 0x20, 0xb6, 0x65, 0x3a, 0x80, 0x08, 0x53, 0xfa, 0xe0, 0x51, 0x82, 0x97, 0xce, 0x75, 0x8c, 0x4c, 0x6e, 0x97, 0x62, 0x5e, 0xc1, 0x44, 0xa6, 0xf2, 0x27, 0xed, 0x55, 0x21, 0x23, 0x9b, 0xa9, 0x4e, 0x5f, 0xde, 0x3e, 0xb7, 0xf0, 0x06, 0x73, 0x4b, 0xda, 0x96, 0x13, 0xbc, 0xd7, 0xf6, 0x35, 0xd4, 0x54, 0x68, 0x60, 0x0c, 0xbd, 0x3d, 0xf3, 0x5b, 0xfa, 0x49, 0xc4, 0x4c, 0x3a, 0x94, 0x08, 0x53, 0xef, 0x52, 0x73, 0x61, 0x19, 0x16, 0xa0, 0xb6, 0xc8, 0x42, 0xb2, 0xf7, 0xdc, 0xc2, 0x3c, 0x80, 0x10, 0xfa, 0x5e, 0xfb, 0x37, 0xfc, 0x31, 0x31, 0xc5, 0xff, 0x65, 0x21, 0x90, 0x0d, 0x29, 0x4f, 0xd8, 0xfb, 0x4b, 0x5f, 0x85, 0x9e, 0xa1, 0xe2, 0xb1, 0x3c, 0xa7, 0x70, 0x66, 0x41, 0x69, 0xf7, 0xa9, 0x33, 0xa4, 0x52, 0xb7, 0xe8, 0x28, 0x1e, 0x8e, 0xf7, 0x80, 0xc9, 0xaf, 0x6c, 0xd5, 0xeb, 0x23, 0xc0, 0x10, 0xda, 0xbc, 0x08, 0x3f, 0x79, 0x9d, 0x6c, 0x3a, 0x50, 0xfc, 0xdb, 0x86, 0xe2, 0x27, 0xfd, 0x79, 0x3a, 0xc5, 0x69, 0x9f, 0xc8, 0x5f, 0x19, 0x5d, 0x6b, 0x1f, 0x1a, 0xd4, 0xcf, 0xd7, 0x88, 0x08, 0xf9, 0x44, 0xba, 0x42, 0x20, 0x95, 0xba, 0xb3, 0xbf, 0x27, 0xf8, 0x59, 0xe8, 0x93, 0x3f, 0x27, 0xdb, 0xea, 0xe7, 0x60, 0xd7, 0x3f, 0x4d, 0x44, 0x30, 0x66, 0x80, 0xee, 0xa2, 0xfc, 0x3d, 0x7d, 0xe5, 0xa7, 0x1e, 0x72, 0x81, 0x9f, 0x0e, 0x59, 0xe4, 0x6e, 0x00, 0xac, 0xb2, 0xf4, 0xe1, 0xf4, 0x5c, 0xad, 0xca, 0x31, 0xf4, 0x37, 0x7b, 0x7c, 0x40, 0x0e, 0x05, 0xeb, 0x0d, 0x9b, 0xc6, 0xb5, 0xc5, 0x6d, 0x9a, 0x96, 0x44, 0xc6, 0x50, 0x75, 0xe8, 0x59, 0x5b, 0x45, 0xe7, 0x52, 0xca, 0x29, 0xe6, 0x97, 0x7b, 0xdb, 0xc7, 0x4d, 0x8b, 0x4e, 0xc2, 0x9f, 0x10, 0x92, 0xb7, 0xba, 0x0b, 0xf9, 0xc2, 0x1c, 0x98, 0x78, 0x11, 0x0f, 0x68, 0x4f, 0xf2, 0x70, 0x71, 0xec, 0x30, 0xb5, 0xe4, 0x0d, 0xa0, 0x2f, 0x60, 0x26, 0xf7, 0x8b, 0x65, 0x02, 0xde, 0x9f, 0x0b, 0xac, 0x49, 0x64, 0xf4, 0x90, 0x04, 0x3e, 0x7f, 0xde, 0x8e, 0x84, 0x3e, 0x2f, 0x2b, 0x3c, 0xab, 0x6b, 0x35, 0x26, 0x16, 0xea, 0xb3, 0xfd, 0xe2, 0xd9, 0x2d, 0xf9, 0xf1, 0xe0, 0xbe, 0x98, 0x5d, 0x01, 0x6a, 0x9e, 0x69, 0xc4, 0xb2, 0x5a, 0xb7, 0x91, 0x66, 0x2c, 0xbb, 0x5d, 0xbb, 0x44, 0x6f, 0x89, 0x9d, 0xac, 0x48, 0x06, 0x46, 0x89, 0x69, 0xbe, 0x10, 0x9e, 0x18, 0x2f, 0x87, 0x11, 0x6e, 0x59, 0xc3, 0x72, 0x52, 0xdb, 0xf5, 0xf9, 0xa8, 0x59, 0x3f, 0x0f, 0xc5, 0x20, 0xc9, 0x10, 0x26, 0x0d, 0x11, 0x50, 0x62, 0xab, 0x82, 0x5c, 0x5e, 0x9b, 0x49, 0x82, 0xc0, 0x39, 0x64, 0x93, 0xa6, 0x7c, 0xfb, 0xe7, 0x97, 0x1e, 0xf4, 0xa2, 0xba, 0xfd, 0xc2, 0x36, 0x45, 0xc2, 0x7d, 0x29, 0x39, 0xc0, 0x38, 0x19, 0x4d, 0x1f, 0x8f, 0xfd, 0x27, 0x39, 0x7f, 0xad, 0xd2, 0x44, 0x7b, 0xa5, 0x6d, 0x32, 0xbb, 0x05, 0x20, 0xd5, 0xd8, 0xdd, 0x55, 0x47, 0x96, 0xa8, 0x24, 0x89, 0x00, 0x16, 0x0e, 0x6a, 0xbb, 0x0f, 0xef, 0xaa, 0x94, 0xf4, 0x2e, 0x60, 0x5b, 0x28, 0x37, 0x99, 0xf4, 0xcf, 0x2b, 0x42, 0xab, 0xd5, 0xd5, 0x48, 0xc8, 0x32, 0xe1, 0xfd, 0x63, 0x6d, 0x48, 0xbe, 0x7a, 0x5f, 0x0f, 0xd3, 0x41, 0x3a, 0x31, 0x96, 0xb9, 0xca, 0xda, 0xd7, 0x84, 0xfa, 0xd5, 0x80, 0xf8, 0x99, 0x48, 0x75, 0x72, 0x5e, 0x9f, 0xbe, 0xed, 0x2a, 0xc6, 0xe8, 0xd3, 0x8e, 0x9b, 0xa8, 0x12, 0x8d, 0xa3, 0xc2, 0x73, 0xa3, 0xfb, 0x29, 0x28, 0x06, 0x92, 0x68, 0xa3, 0x2b, 0x96, 0x40, 0xaf, 0x8c, 0x2c, 0x93, 0xb9, 0xa9, 0x64, 0x81, 0x6e, 0x4c, 0x6c, 0xd0, 0x8c, 0x12, 0x04, 0x91, 0xf1, 0x27, 0x31, 0x00, 0xf9, 0x51, 0x36, 0xad, 0x06, 0x30, 0xc0, 0xd9, 0x60, 0xc4, 0x61, 0x23, 0x40, 0x2f, 0x3f, 0x64, 0x27, 0xbc, 0x0e, 0xd7, 0x74, 0x21, 0x3b, 0x7d, 0x36, 0x01, 0x6a, 0xbf, 0x3f, 0xb5, 0x23, 0x56, 0x7a, 0x4c, 0xc8, 0x68, 0x7e, 0xd0, 0xcb, 0xf3, 0x62, 0xcb, 0x1d, 0x6f, 0xd3, 0x0a, 0xea, 0xaf, 0x65, 0xa1, 0x83, 0x09, 0x27, 0x30, 0x9c, 0xb6, 0x7a, 0x64, 0xb7, 0x7b, 0x23, 0xc0, 0xe0, 0x89, 0x9e, 0x9d, 0x9b, 0xa3, 0xb5, 0x6f, 0x1b, 0x7e, 0x52, 0x4b, 0xb4, 0x6d, 0x92, 0xa6, 0x93, 0x3e, 0x1a, 0x60, 0xad, 0x5e, 0xae, 0x01, 0xf5, 0x44, 0x00, 0x42, 0xd2, 0x0d, 0xc5, 0xcf, 0xd0, 0x64, 0x0e, 0x4b, 0x96, 0xa5, 0xd6, 0x94, 0x18, 0x42, 0xd7, 0x49, 0x0d, 0x65, 0xa3, 0x8a, 0xa4, 0xd7, 0xef, 0xff, 0x72, 0x20, 0x32, 0x1c, 0xaf, 0xf0, 0x6f, 0xa3, 0xa3, 0xbd, 0x4e, 0x6a, 0x5b, 0xae, 0x72, 0x5e, 0xa0, 0xb8, 0x07, 0xc8, 0x2a, 0x07, 0x9a, 0xcf, 0x10, 0x9f, 0x2e, 0x3e, 0x83, 0x43, 0x8c, 0x88, 0xbc, 0x95, 0xda, 0x0a, 0x33, 0x80, 0x6f, 0x8f, 0x12, 0xd3, 0xe6, 0x19, 0xe9, 0x2e, 0x71, 0xdf, 0xa3, 0x22, 0x70, 0x92, 0xb9, 0x94, 0x43, 0xe4, 0xa5, 0x62, 0x5c, 0x4b, 0x9a, 0x4a, 0x98, 0x02, 0x72, 0x07, 0xcf, 0x52, 0xe8, 0xbc, 0xaa, 0x0f, 0x07, 0x96, 0xb4, 0x65, 0xe2, 0xad, 0xb4, 0xd5, 0x86, 0x2c, 0x3b, 0x7a, 0x2d, 0xb2, 0x79, 0x91, 0xb4, 0xf8, 0x54, 0x38, 0x4f, 0xb3, 0xbc, 0x76, 0x7c, 0xbc, 0x38, 0x7c, 0x35, 0x6e, 0xc5, 0x2a, 0x6a, 0x4f, 0xe1, 0xd5, 0xae, 0xf3, 0xe3, 0x48, 0x31, 0x1e, 0x8d, 0x08, 0xee, 0x29, 0xe4, 0xdd, 0x25, 0xa7, 0x3f, 0x8d, 0x0c, 0x48, 0x9f, 0xeb, 0xc2, 0xfd, 0x3e, 0x10, 0x84, 0x5c, 0x6b, 0xe9, 0x23, 0x47, 0x94, 0xf2, 0xb5, 0xc8, 0xa5, 0x40, 0x8b, 0x40, 0x91, 0xc5, 0x64, 0xc1, 0x2d, 0xd0, 0xe0, 0xb8, 0x45, 0xd3, 0x38, 0xcf, 0xea, 0x69, 0x2b, 0x11, 0x09, 0x97, 0x3c, 0x4f, 0x42, 0x52, 0x1a, 0xc3, 0xf6, 0x42, 0x60, 0xf4, 0xa2, 0xc6, 0x7e, 0xd9, 0x6c, 0x38, 0xf7, 0x41, 0xfc, 0x72, 0xce, 0x73, 0x8d, 0x91, 0x3a, 0x11, 0x44, 0xf9, 0xa1, 0x42, 0xc0, 0x99, 0xc4, 0x0f, 0xf2, 0x70, 0x38, 0x0e, 0x2f, 0x4f, 0x15, 0x3e, 0x83, 0xe1, 0xf2, 0x33, 0x49, 0xea, 0x10, 0x73, 0xf8, 0xcc, 0xd5, 0x1f, 0x40, 0x4f, 0x7c, 0xd6, 0x56, 0xa1, 0x0c, 0xd6, 0x8c, 0x9c, 0x86, 0x64, 0x24, 0x48, 0x63, 0x6f, 0x66, 0xa1, 0x3d, 0x70, 0xf0, 0x9a, 0xcd, 0x94, 0x4e, 0x61, 0x15, 0x1d, 0xca, 0xe5, 0xde, 0x05, 0x85, 0x96, 0x65, 0xe5, 0xc7, 0x6b, 0x52, 0x16, 0x94, 0x2a, 0xe9, 0x16, 0x80, 0xe4, 0x84, 0x2d, 0xc4, 0xbe, 0x41, 0x50, 0x90, 0xf8, 0xf8, 0x45, 0xa3, 0x27, 0x70, 0x08, 0x1a, 0xc5, 0xd2, 0x6e, 0x85, 0xec, 0x5d, 0x08, 0x40, 0x5f, 0x5c, 0x4a, 0x01, 0xca, 0x55, 0xec, 0xad, 0x4b, 0x84, 0x91, 0x70, 0x30, 0x87, 0xa7, 0x0c, 0x03, 0x5b, 0x8e, 0x71, 0xc4, 0x87, 0xfc, 0x8f, 0x75, 0x97, 0xa0, 0x68, 0xdc, 0xcc, 0x05, 0x69, 0x84, 0x12, 0xba, 0xfa, 0x05, 0x32, 0xb0, 0x54, 0x85, 0x49, 0xe3, 0x92, 0x7f, 0x79, 0x3c, 0x0b, 0xc3, 0xde, 0xb6, 0xe0, 0xbe, 0xc4, 0xc1, 0xd1, 0xfc, 0x17, 0xe4, 0x55, 0xeb, 0x1a, 0xa5, 0xe9, 0xe2, 0x5c, 0xad, 0xa8, 0x61, 0xe9, 0x28, 0x1c, 0x9b, 0xbd, 0x6b, 0x54, 0x31, 0x7e, 0xd9, 0x36, 0x41, 0x6a, 0x07, 0x17, 0x9f, 0x8e, 0x1e, 0x89, 0x62, 0x38, 0x81, 0x74, 0xa3, 0xb0, 0xb0, 0x69, 0x81, 0x23, 0x6d, 0x32, 0x68, 0xe0, 0x1d, 0xae, 0x94, 0xc7, 0x70, 0xdc, 0xd0, 0xfd, 0x44, 0x35, 0x84, 0xe5, 0xc7, 0x3f, 0xee, 0x4c, 0xdc, 0x5f, 0xb0, 0xe4, 0xc1, 0xee, 0x8b, 0xf4, 0xee, 0x90, 0x6a, 0x4d, 0x40, 0xc1, 0xa2, 0x80, 0x56, 0xb1, 0x78, 0x4e, 0x3c, 0x52, 0xe4, 0x60, 0x46, 0xaf, 0x94, 0x39, 0x3f, 0x7f, 0x34, 0x68, 0xc3, 0xfa, 0xed, 0x02, 0xea, 0xeb, 0x2b, 0x4f, 0x27, 0x07, 0xa4, 0xc4, 0x6f, 0x7d, 0x96, 0x31, 0x9d, 0xce, 0x4f, 0x3c, 0x15, 0xdf, 0xf3, 0x0e, 0xa7, 0x4d, 0x7a, 0x4c, 0xb7, 0x00, 0xf8, 0x49, 0x9b, 0x03, 0x21, 0x7a, 0x45, 0x92, 0x0c, 0x2a, 0x22, 0x75, 0x37, 0x6e, 0x41, 0x8d, 0xcc, 0x5c, 0xb8, 0xad, 0x22, 0x78, 0x44, 0xab, 0x87, 0x6f, 0x2f, 0xb6, 0x3d, 0x08, 0x77, 0xe9, 0xc2, 0x57, 0x2c, 0x21, 0x54, 0x34, 0x1a, 0x0c, 0xb5, 0xeb, 0xa8, 0x83, 0x2c, 0x35, 0x00, 0x1a, 0xcc, 0x67, 0x70, 0xf5, 0xf8, 0xea, 0x10, 0xdd, 0x27, 0xeb, 0xa6, 0x92, 0xe5, 0x53, 0xc6, 0x63, 0x1b, 0xfa, 0x3e, 0xfd, 0x8f, 0x17, 0xb1, 0x81, 0xae, 0xfc, 0x81, 0xd9, 0x8a, 0x00, 0xf2, 0x4b, 0x1f, 0xbc, 0x8d, 0x4e, 0xda, 0x7a, 0xc3, 0x9d, 0x5c, 0xea, 0xd3, 0x8b, 0x7b, 0x17, 0xee, 0x96, 0x89, 0x9a, 0x98, 0x3e, 0xd9, 0x0d, 0x51, 0x18, 0x80, 0xc3, 0x75, 0x1e, 0x59, 0xb6, 0x61, 0x49, 0x4c, 0xc1, 0xd7, 0x62, 0xcf, 0x10, 0xa4, 0x15, 0xac, 0xd4, 0x7f, 0x47, 0x05, 0x3b, 0x35, 0xa9, 0x96, 0x9f, 0x03, 0x8d, 0x3b, 0xfe, 0x43, 0xf9, 0xb2, 0xaa, 0x4c, 0xfa, 0xa1, 0x41, 0x93, 0x3b, 0xdb, 0xe0, 0x16, 0xd6, 0xdf, 0x94, 0xfa, 0x6a, 0xa2, 0x11, 0x72, 0x6e, 0x8e, 0xa7, 0xe4, 0xc5, 0xca, 0x71, 0x47, 0x92, 0xbc, 0xd0, 0xd0, 0x4d, 0xcc, 0x17, 0xcd, 0x17, 0x6b, 0x88, 0xd1, 0x4a, 0x54, 0x80, 0x11, 0x55, 0x12, 0xee, 0x0e, 0xc7, 0xc3, 0x09, 0x74, 0xa9, 0x1b, 0x43, 0x42, 0x11, 0xac, 0x78, 0x2c, 0xf4, 0x64, 0x6c, 0x3e, 0x3c, 0x57, 0x74, 0xc1, 0x1a, 0xbe, 0x73, 0x62, 0x9e, 0x40, 0x08, 0x91, 0x85, 0x71, 0x06, 0x28, 0x52, 0x99, 0x25, 0x4d, 0xa0, 0xb6, 0xf7, 0x99, 0xb6, 0xc4, 0x1d, 0x7a, 0x5c, 0x3b, 0xba, 0xd5, 0xed, 0xda, 0x28, 0xf0, 0xae, 0xa3, 0xea, 0x90, 0x5e, 0x27, 0xe2, 0x5e, 0x0e, 0x03, 0xc4, 0x8f, 0x33, 0xab, 0xcb, 0xc4, 0xfa, 0x66, 0xab, 0x2f, 0xdb, 0x9a, 0xc6, 0xf8, 0x71, 0x4a, 0xa2, 0xdf, 0x89, 0xdd, 0x9b, 0x22, 0x79, 0x21, 0xd5, 0xa1, 0xb3, 0x8f, 0x75, 0x40, 0x99, 0xd1, 0x11, 0x8d, 0x93, 0x81, 0x64, 0xa3, 0x5f, 0x34, 0x47, 0x4e, 0xa9, 0xb7, 0xdd, 0x6f, 0xdc, 0x98, 0x0d, 0xa2, 0x37, 0xe8, 0x35, 0x1f, 0x23, 0x40, 0x1c, 0xde, 0xc4, 0x02, 0x29, 0xff, 0xce, 0xe1, 0xd3, 0x68, 0x9a, 0xa4, 0x59, 0xb0, 0x79, 0x26, 0xb3, 0x3c, 0x48, 0xa2, 0xc8, 0xa7, 0x44, 0x2d, 0xe1, 0x67, 0x20, 0x84, 0x5e, 0xae, 0x55, 0x08, 0xa8, 0x8f, 0xba, 0x07, 0x66, 0x62, 0x54, 0x3d, 0xf4, 0x69, 0x6f, 0x9b, 0x10, 0xb4, 0xed, 0x47, 0xd7, 0x41, 0xdf, 0xe3, 0xf1, 0x68, 0x52, 0x12, 0x08, 0x76, 0x6b, 0x38, 0x7e, 0x99, 0xb7, 0x82, 0x5f, 0xfc, 0xbc, 0x27, 0x94, 0x32, 0xd4, 0xed, 0x5a, 0xd8, 0x3b, 0xee, 0xf3, 0x76, 0x66, 0x9c, 0x9b, 0xa7, 0x96, 0x03, 0xbe, 0x7a, 0xae, 0x4e, 0x68, 0x17, 0x41, 0x8d, 0xfd, 0xa6, 0xf0, 0xb5, 0x2a, 0x6c, 0xf3, 0xe8, 0x1b, 0x37, 0xf5, 0xf7, 0xef, 0xfd, 0x25, 0x26, 0x69, 0xc0, 0x8a, 0x2f, 0xe8, 0xb4, 0x96, 0x89, 0x99, 0xa4, 0xff, 0xe9, 0xeb, 0x92, 0xca, 0x0a, 0x43, 0x9e, 0xa9, 0xaa, 0xf2, 0x29, 0x86, 0xd5, 0x64, 0x39, 0x60, 0x65, 0x99, 0x1f, 0x56, 0xca, 0xd9, 0x58, 0x01, 0x07, 0xa4, 0xb2, 0x07, 0xfd, 0xe9, 0xaf, 0xed, 0xec, 0x78, 0x2e, 0x2d, 0x37, 0xb8, 0x48, 0x89, 0x67, 0x9d, 0x79, 0x9e, 0x73, 0xd5, 0x00, 0xbc, 0x3f, 0x42, 0x88, 0xf5, 0x62, 0xad, 0x07, 0x74, 0x2c, 0xb9, 0xe7, 0x11, 0xe8, 0x15, 0x64, 0x22, 0x5e, 0xf6, 0x35, 0x93, 0x9c, 0xc5, 0x6e, 0x39, 0xf6, 0x14, 0xa5, 0x63, 0x4c, 0xd7, 0x53, 0xb2, 0x8b, 0xd1, 0x7e, 0x2b, 0x76, 0x4c, 0x95, 0x8b, 0xa7, 0x0d, 0x9c, 0xda, 0xd0, 0x87, 0x88, 0x43, 0x47, 0x4f, 0xed, 0x23, 0xc2, 0xd0, 0xd6, 0x60, 0x5f, 0x40, 0xf4, 0xfc, 0xe7, 0xd3, 0xfc, 0xea, 0x53, 0x2e, 0x4a, 0x20, 0x8f, 0x1e, 0xca, 0xed, 0x7f, 0x8a, 0x18, 0x8d, 0x40, 0xa6, 0xe6, 0xfb, 0xb0, 0x6a, 0x9f, 0x06, 0x30, 0x43, 0x49, 0xa7, 0xa8, 0x08, 0xb0, 0x92, 0xcc, 0x2f, 0xc1, 0x0b, 0x9e, 0x41, 0x34, 0xfb, 0x34, 0x8b, 0x6e, 0x43, 0xbc, 0x17, 0xa5, 0x50, 0xbd, 0xda, 0x45, 0xef, 0xa0, 0x2f, 0x92, 0x63, 0x6e, 0x84, 0x8f, 0xb6, 0xdb, 0x53, 0x1f, 0x4c, 0x84, 0x55, 0x6b, 0xbe, 0x75, 0xf2, 0x83, 0xe5, 0xee, 0xfb, 0x48, 0x34, 0x67, 0x9b, 0x89, 0x4b, 0xd1, 0x8b, 0x6c, 0xca, 0x1f, 0x86, 0x10, 0x63, 0x05, 0xfd, 0x70, 0x34, 0xff, 0x0b, 0x8b, 0x53, 0x96, 0xab, 0xc2, 0xaa, 0xdf, 0x29, 0x81, 0x05, 0x44, 0xd6, 0x21, 0x69, 0x86, 0x00, 0x0d, 0xa8, 0x03, 0x21, 0x24, 0x32, 0x35, 0x57, 0x5f, 0x2e, 0x7c, 0x14, 0xb4, 0xc9, 0x1d, 0x17, 0x3a, 0xce, 0x8a, 0x9b, 0x8d, 0x78, 0xe4, 0xce, 0x74, 0x84, 0xbe, 0x84, 0xc1, 0x89, 0x24, 0x2d, 0x79, 0x8c, 0xdb, 0x04, 0x35, 0xcf, 0xeb, 0x8a, 0xc8, 0xeb, 0x5b, 0x33, 0x22, 0x1e, 0x3c, 0x5f, 0x75, 0xe6, 0xe9, 0x8b, 0x96, 0xcf, 0x8c, 0xc9, 0xa5, 0x89, 0xe4, 0x6d, 0xf0, 0x3d, 0x46, 0x0a, 0x15, 0x21, 0xe2, 0x9d, 0x67, 0x4b, 0x48, 0x07, 0x93, 0xc3, 0x2b, 0xc1, 0x84, 0xdb, 0x64, 0xcb, 0x83, 0xc3, 0x39, 0xe5, 0xa3, 0x58, 0xe0, 0x02, 0x5c, 0x3d, 0x3f, 0xfa, 0x76, 0x2d, 0xf6, 0x7f, 0x28, 0x8f, 0x9f, 0x52, 0x82, 0x4b, 0x54, 0xb6, 0x08, 0xdd, 0x72, 0x26, 0xa0, 0xa8, 0x9d, 0x43, 0xae, 0x8c, 0x05, 0x10, 0x7d, 0xba, 0xe7, 0x61, 0xe1, 0xc7, 0x56, 0x91, 0x1a, 0x00, 0x3b, 0x74, 0xfc, 0xfe, 0x9b, 0x8c, 0x4d, 0x7a, 0x18, 0x80, 0x6f, 0x62, 0xbb, 0xc9, 0x3e, 0x2b, 0xf0, 0xaf, 0x3c, 0x6a, 0xd2, 0x74, 0xec, 0x9e, 0xa9, 0xcf, 0x7b, 0x50, 0xb1, 0x9c, 0xa5, 0x5f, 0x1e, 0xd1, 0xd7, 0x95, 0x5c, 0xb4, 0x91, 0x7d, 0x9b, 0x4b, 0x0f, 0x79, 0x8b, 0x14, 0x28, 0x0f, 0x64, 0xf7, 0x76, 0x84, 0x2a, 0x79, 0xb7, 0xac, 0x2f, 0x32, 0x73, 0x00, 0xd9, 0x81, 0xe0, 0xf1, 0xa5, 0x7e, 0x02, 0x7c, 0x6c, 0x30, 0x16, 0xff, 0xe6, 0x01, 0x31, 0x4b, 0x6c, 0x6e, 0x25, 0xfa, 0x02, 0x03, 0xa4, 0x03, 0x94, 0x87, 0xa8, 0x8b, 0x80, 0x74, 0x11, 0xfe, 0x55, 0xaa, 0x90, 0x5f, 0xda, 0x63, 0xc5, 0xdc, 0x53, 0x6a, 0xa4, 0xa6, 0xff, 0x88, 0x1d, 0xff, 0xe5, 0x3f, 0xfc, 0x95, 0xd1, 0xbb, 0x0e, 0x0e, 0x99, 0x06, 0x85, 0xe4, 0xa4, 0x7b, 0x9d, 0x73, 0xad, 0x7d, 0x80, 0x50, 0xc5, 0x69, 0x67, 0xdd, 0x97, 0xc8, 0x03, 0x1a, 0xf0, 0xca, 0x1b, 0xbe, 0x7f, 0xf0, 0x76, 0x87, 0xd9, 0x08, 0xfb, 0xce, 0xbf, 0x5e, 0x17, 0x5e, 0xa4, 0x31, 0x5f, 0x86, 0x6a, 0x64, 0x77, 0x6d, 0x6d, 0x76, 0x32, 0xa6, 0xc2, 0xb4, 0xfa, 0x04, 0xc1, 0xad, 0x73, 0xb0, 0xc0, 0xe7, 0x5b, 0x78, 0x22, 0xd0, 0xb5, 0x6a, 0x91, 0xf7, 0x26, 0xa2, 0x87, 0x7c, 0x9f, 0x60, 0x13, 0xc6, 0x3c, 0x5e, 0xda, 0x73, 0x6c, 0x60, 0x5c, 0x95, 0x53, 0x0c, 0x78, 0x1b, 0x6c, 0xfc, 0x32, 0x8d, 0x73, 0x12, 0xb5, 0xfd, 0x82, 0x0b, 0x94, 0x3a, 0x7a, 0x57, 0x55, 0x46, 0xa4, 0x28, 0x30, 0x0a, 0x98, 0xca, 0x14, 0x49, 0x5e, 0x32, 0xeb, 0xd3, 0xd4, 0xd9, 0x1f, 0xfb, 0x4f, 0xcb, 0x5d, 0x4a, 0x85, 0xfa, 0x99, 0x75, 0xab, 0xd9, 0x52, 0x8d, 0xda, 0x26, 0x17, 0x76, 0xb7, 0x07, 0x4a, 0x9a, 0x53, 0x59, 0x24, 0xde, 0x50, 0x45, 0xf9, 0xd6, 0x46, 0x14, 0xbd, 0x34, 0x64, 0x44, 0xc8, 0x87, 0x5b, 0xdb, 0xd6, 0x22, 0x77, 0xfb, 0x52, 0x59, 0x0f, 0xb7, 0xd4, 0xf4, 0x20, 0x25, 0xe8, 0xdd, 0x35, 0xb4, 0x11, 0x1c, 0x8a, 0xc0, 0x0d, 0x05, 0x70, 0x64, 0x5b, 0xb0, 0xf3, 0x90, 0xfb, 0xaa, 0xbb, 0x5b, 0x75, 0xea, 0x30, 0x9a, 0x1c, 0x07, 0xe2, 0xb1, 0x94, 0xa8, 0x27, 0xa9, 0x92, 0x3b, 0x06, 0x83, 0xe3, 0xea, 0x53, 0xcc, 0xb0, 0xca, 0x1c, 0x72, 0x00, 0x56, 0x44, 0xd6, 0x7e, 0x1d, 0x6e, 0x22, 0x7d, 0xb7, 0x1c, 0xdd, 0x39, 0xfd, 0x18, 0xbd, 0x5f, 0x7a, 0x14, 0xbc, 0xd0, 0x1c, 0x8d, 0x6d, 0xa2, 0x2f, 0xf5, 0x91, 0x68, 0x8c, 0x10, 0xe6, 0xb4, 0x0e, 0x9f, 0x3f, 0xda, 0x46, 0x3c, 0xd9, 0xf6, 0x70, 0x85, 0xed, 0x30, 0xa5, 0x7c, 0x82, 0x3e, 0x52, 0x2e, 0x85, 0x2b, 0xe8, 0x93, 0x1b, 0x57, 0xd5, 0xb6, 0x36, 0xc0, 0xb4, 0x15, 0x67, 0x7f, 0xc0, 0x4b, 0xf3, 0x96, 0x8f, 0xec, 0x28, 0xe8, 0xfd, 0xb1, 0xf1, 0x89, 0x66, 0xd5, 0xa9, 0x38, 0x18, 0xbe, 0x2d, 0x2a, 0x07, 0xe0, 0x35, 0x0a, 0xc3, 0xdf, 0xe4, 0x3d, 0xa8, 0xf3, 0x9d, 0x6a, 0x54, 0x91, 0x19, 0x3a, 0x5f, 0x48, 0xb6, 0x5c, 0x46, 0xe9, 0x12, 0xcd, 0xa7, 0xea, 0xd9, 0x56, 0xb4, 0x0c, 0xdb, 0x56, 0xe2, 0x3c, 0x62, 0xc1, 0xe1, 0xb7, 0xc2, 0x69, 0xd1, 0x72, 0x31, 0x7c, 0xb3, 0xb9, 0xd9, 0x4e, 0x1d, 0x16, 0x2c, 0x59, 0x32, 0x74, 0x78, 0x83, 0xd2, 0x84, 0xbb, 0x9f, 0x0e, 0x60, 0xb8, 0x35, 0xdf, 0x6f, 0x4a, 0x86, 0x17, 0x88, 0xf9, 0xcb, 0x97, 0x5a, 0xcb, 0xbe, 0xc3, 0x0b, 0x5c, 0x5b, 0x33, 0x1f, 0x31, 0xe8, 0xab, 0x9c, 0x4a, 0x33, 0x4e, 0x6b, 0xf6, 0x1b, 0x0e, 0x02, 0xec, 0x51, 0x67, 0x40, 0x96, 0x60, 0x4d, 0x98, 0xb0, 0xeb, 0x63, 0x72, 0x12, 0x36, 0x6d, 0xce, 0xca, 0xe9, 0x08, 0x2b, 0x6e, 0x10, 0x99, 0xa7, 0xb1, 0x65, 0x83, 0x67, 0x33, 0xd2, 0x9d, 0x39, 0x9e, 0x32, 0xe3, 0x78, 0xee, 0x58, 0x6b, 0x31, 0x10, 0x52, 0x9b, 0x83, 0xaf, 0xee, 0x9a, 0x4c, 0x4b, 0x7e, 0x04, 0x02, 0x8b, 0xd9, 0xe2, 0xde, 0xd4, 0xa2, 0xd9, 0x40, 0x1a, 0xcd, 0xa1, 0x4f, 0xf6, 0x5e, 0xb9, 0xdf, 0xf9, 0x74, 0x59, 0x99, 0x41, 0x87, 0xa9, 0x55, 0x49, 0xee, 0x30, 0xcb, 0x05, 0xa4, 0x8f, 0x6b, 0x2f, 0x4b, 0x6f, 0x89, 0xdc, 0x71, 0xb8, 0xbd, 0x52, 0x13, 0x03, 0x8a, 0x1d, 0x5f, 0x53, 0x3d, 0x60, 0xbe, 0xff, 0x18, 0x6a, 0x12, 0xf3, 0xb0, 0x89, 0x3c, 0x19, 0x94, 0x23, 0xe2, 0x11, 0x2f, 0x02, 0x6f, 0x28, 0xf0, 0xf0, 0x5b, 0x88, 0xa8, 0x84, 0xac, 0xac, 0x33, 0x3b, 0xbd, 0x17, 0x5a, 0xca, 0x3e, 0x46, 0xf8, 0xb3, 0x7c, 0xe3, 0x5c, 0x17, 0xe2, 0x3b, 0xef, 0xcb, 0xc0, 0xf2, 0x16, 0xae, 0x4c, 0xf5, 0x5a, 0x39, 0xe7, 0xb1, 0xc7, 0x57, 0xa1, 0x83, 0x91, 0x77, 0xfe, 0x6f, 0xfe, 0xe0, 0xfb, 0x14, 0x7f, 0x45, 0x4c, 0xdf, 0x20, 0x9a, 0xe8, 0x80, 0x23, 0x26, 0xc7, 0x9a, 0xe8, 0xd8, 0xea, 0xbf, 0x11, 0xde, 0x9d, 0x9b, 0xe3, 0x74, 0xf9, 0x6f, 0xee, 0xfa, 0xac, 0xc2, 0xf0, 0x4a, 0xfd, 0x53, 0xf7, 0x48, 0x0a, 0x51, 0xc6, 0xbb, 0x54, 0xce, 0x7a, 0x5b, 0x7e, 0x72, 0x6d, 0x2a, 0x52, 0x6c, 0x5b, 0x08, 0x05, 0xae, 0xc3, 0x82, 0xbc, 0x5a, 0x90, 0xec, 0x4e, 0x77, 0xf9, 0xaf, 0x4c, 0xe9, 0xa6, 0xe3, 0x3f, 0xa0, 0x14, 0x21, 0x30, 0x0f, 0x3a, 0x92, 0x6e, 0xe0, 0x6d, 0x4c, 0x8b, 0xe6, 0x81, 0xdf, 0xa8, 0x53, 0x31, 0x2a, 0xf2, 0x2b, 0xc0, 0x74, 0x6d, 0xf8, 0xe1, 0xb8, 0xf1, 0xc0, 0xd5, 0x3f, 0x72, 0x34, 0xd3, 0x74, 0x84, 0x2a, 0xac, 0xf5, 0x1d, 0x4d, 0xaf, 0xe6, 0x9d, 0x13, 0xca, 0x8a, 0x0d, 0xf0, 0xf3, 0x14, 0xa4, 0xca, 0xc6, 0xba, 0x90, 0xac, 0x70, 0x0c, 0xf3, 0xbe, 0xcb, 0x84, 0x2b, 0x75, 0xca, 0x5e, 0x56, 0x07, 0x18, 0xa9, 0x15, 0x22, 0xfc, 0x9f, 0x91, 0xdd, 0x80, 0x32, 0xbc, 0xef, 0xd2, 0xe7, 0xda, 0x1e, 0xea, 0xe7, 0x3f, 0xfb, 0x6d, 0x54, 0x5a, 0xcd, 0xd2, 0xd9, 0xf2, 0xcb, 0xc3, 0x85, 0xb0, 0x8e, 0xc6, 0xd9, 0xde, 0xc5, 0x1c, 0x1f, 0x6e, 0x2b, 0xe9, 0xfe, 0x3e, 0xb6, 0x96, 0x4c, 0x9a, 0x11, 0x74, 0x23, 0x03, 0x4d, 0xa2, 0x37, 0x2e, 0xd4, 0x30, 0x66, 0x50, 0x9e, 0x84, 0x91, 0x99, 0xa7, 0xfd, 0xab, 0xfe, 0xa0, 0xd7, 0x0f, 0x3c, 0xe4, 0x4f, 0x17, 0x1a, 0xaf, 0x07, 0xea, 0xee, 0x8a, 0xab, 0x95, 0x62, 0x0a, 0xd5, 0x5e, 0x78, 0xba, 0x2e, 0x54, 0xcc, 0x56, 0xd7, 0x2b, 0x1a, 0x3a, 0x07, 0x47, 0xff, 0x19, 0xf5, 0x17, 0x04, 0xf2, 0xf8, 0xa4, 0xd8, 0x40, 0xec, 0x6a, 0xdd, 0x72, 0xd9, 0x66, 0xe6, 0x9a, 0xcf, 0x70, 0x40, 0x69, 0x14, 0xcb, 0xef, 0x5b, 0x82, 0xfb, 0x39, 0x2f, 0x2a, 0xd6, 0x69, 0x9a, 0x3d, 0xde, 0xcd, 0x3c, 0x2d, 0xce, 0x01, 0xd3, 0x0f, 0x73, 0x6f, 0xaf, 0x44, 0xbd, 0x17, 0x66, 0x58, 0x16, 0x8c, 0xc8, 0x2a, 0xf2, 0x3f, 0x15, 0x4d, 0xa8, 0x00, 0x6e, 0xaf, 0x80, 0xc2, 0x8a, 0x78, 0x0d, 0x9f, 0xaa, 0x35, 0xbd, 0x1c, 0xcf, 0x36, 0xae, 0xad, 0x2a, 0x34, 0xc3, 0x7c, 0xd4, 0x38, 0xf8, 0x66, 0xbf, 0xb7, 0xf2, 0x46, 0xed, 0x02, 0xdb, 0x77, 0xdf, 0xde, 0x6c, 0x94, 0x51, 0x6e, 0x4b, 0x82, 0x24, 0x5a, 0x98, 0xb1, 0x9c, 0x2a, 0xc2, 0x9e, 0xcb, 0xf3, 0xa0, 0x9d, 0x4d, 0x36, 0xbd, 0xd5, 0x36, 0x05, 0xf3, 0x8c, 0x49, 0x67, 0x3b, 0xa5, 0x6b, 0xfe, 0xc3, 0x66, 0x57, 0xe7, 0x41, 0x7f, 0x92, 0xe2, 0x88, 0x48, 0xa2, 0xb3, 0x58, 0x4b, 0x7b, 0xc8, 0x7b, 0x02, 0x3a, 0x1b, 0x0d, 0xe2, 0x15, 0x5a, 0x1c, 0x98, 0x92, 0x46, 0x71, 0x92, 0xf8, 0x59, 0xac, 0xc1, 0x03, 0xab, 0x97, 0x9d, 0xdc, 0x16, 0xb4, 0x6a, 0x48, 0x98, 0x18, 0xba, 0x20, 0xfa, 0x7c, 0x34, 0x01, 0xaf, 0x92, 0x93, 0x44, 0xff, 0x95, 0xf2, 0x31, 0x65, 0x24, 0x46, 0x6f, 0x35, 0x50, 0x2c, 0xbf, 0x81, 0xf4, 0xe5, 0xeb, 0x3e, 0x45, 0x9e, 0xf8, 0xa3, 0xa9, 0xf5, 0xa3, 0xd2, 0xcd, 0xba, 0x0c, 0xba, 0xf1, 0xf2, 0xac, 0x3c, 0x87, 0x22, 0x8c, 0x8c, 0xfd, 0xca, 0xb9, 0xdb, 0xd7, 0x2f, 0xf3, 0x33, 0x00, 0x5d, 0xa5, 0xa2, 0x62, 0x6d, 0x1a, 0x9a, 0xb4, 0x04, 0xed, 0x98, 0x93, 0x1c, 0xc1, 0x04, 0xd5, 0x07, 0x33, 0x58, 0x1a, 0xb0, 0x0d, 0x85, 0xa3, 0x25, 0xbc, 0x93, 0x68, 0x52, 0x05, 0x87, 0x64, 0x0f, 0xf3, 0x89, 0x34, 0x5e, 0x14, 0x46, 0xe0, 0xed, 0xe5, 0x94, 0xf9, 0xe3, 0x8a, 0x54, 0xe4, 0xd9, 0xc2, 0x9d, 0x75, 0x25, 0x1b, 0x17, 0xc0, 0x5f, 0x62, 0xa4, 0x2b, 0x1e, 0x5e, 0x46, 0xc8, 0x03, 0xbe, 0x3d, 0xe2, 0xf9, 0x4f, 0x6f, 0xd6, 0xba, 0x72, 0x0d, 0x24, 0x96, 0xce, 0x74, 0xc6, 0x70, 0x42, 0x51, 0xc1, 0x09, 0x1d, 0x09, 0xf9, 0x81, 0x92, 0x58, 0x49, 0x1a, 0x66, 0x38, 0xd3, 0x40, 0xec, 0x04, 0x95, 0xc6, 0x33, 0xdd, 0x3e, 0x73, 0x7e, 0x4d, 0x3f, 0xbd, 0xf4, 0x2a, 0x24, 0xd4, 0x99, 0xbd, 0x25, 0xe2, 0x7d, 0x24, 0xf8, 0x91, 0x34, 0xf5, 0xea, 0xcf, 0x85, 0x24, 0x2e, 0xce, 0x66, 0x27, 0x75, 0x4e, 0x29, 0x57, 0xbf, 0x1e, 0xf0, 0x9a, 0x70, 0xe0, 0x66, 0x3f, 0xa6, 0x0e, 0xb1, 0x29, 0xca, 0x3a, 0xa2, 0x30, 0x65, 0x9a, 0x2f, 0xc4, 0x35, 0xc3, 0x24, 0xd3, 0x81, 0xb5, 0x15, 0xed, 0xa9, 0x18, 0x97, 0xa7, 0x01, 0xc5, 0xb0, 0x3d, 0xdf, 0x88, 0x8b, 0x7b, 0xf3, 0x24, 0x70, 0xdd, 0xd7, 0x98, 0xf4, 0xf5, 0xe7, 0xa1, 0x6d, 0x0d, 0x53, 0x80, 0xa9, 0x0e, 0x73, 0xfd, 0xe0, 0xa0, 0x5a, 0xac, 0xe6, 0x93, 0xad, 0x6f, 0xa5, 0x7e, 0xb6, 0x3c, 0xcb, 0xa5, 0xb4, 0x21, 0xc0, 0x20, 0x75, 0x85, 0xdb, 0x3a, 0x27, 0xb0, 0xd5, 0x18, 0x6c, 0x8e, 0x7e, 0x9b, 0xac, 0xaf, 0xae, 0x86, 0xaf, 0x93, 0x7f, 0xe4, 0x6b, 0x25, 0xb9, 0xa4, 0x1a, 0x85, 0x8e, 0x87, 0x90, 0x0a, 0x88, 0x3c, 0xcc, 0x88, 0xbf, 0xc9, 0xcd, 0xce, 0x4f, 0x2c, 0xa7, 0x73, 0x09, 0x42, 0xd5, 0xd3, 0x69, 0xe9, 0xd1, 0x54, 0xc8, 0x61, 0xe2, 0xee, 0xd3, 0xf9, 0x35, 0xea, 0x3c, 0xe7, 0x30, 0xe9, 0xb0, 0x77, 0x03, 0x29, 0x08, 0x68, 0x80, 0x04, 0xc3, 0x92, 0x2c, 0xb9, 0xb4, 0xcd, 0x96, 0x6f, 0xf8, 0x0f, 0xe7, 0x77, 0x2b, 0xd4, 0xbb, 0xd2, 0xdb, 0xc3, 0x2f, 0xf3, 0x3d, 0x8e, 0x3b, 0xc5, 0x1f, 0x1a, 0x43, 0xf0, 0x1e, 0xe0, 0xe8, 0x59, 0x19, 0x93, 0x24, 0xe7, 0xe6, 0x02, 0x96, 0x8d, 0x43, 0x41, 0x1a, 0x85, 0x0f, 0x03, 0x9d, 0xd9, 0xba, 0x4b, 0x30, 0x28, 0xfa, 0x44, 0x5a, 0xa7, 0xbf, 0x6c, 0xb3, 0x66, 0x6a, 0xf8, 0xae, 0xd5, 0x39, 0x75, 0xb7, 0x86, 0x06, 0xab, 0x7e, 0x34, 0x32, 0xc6, 0x92, 0x05, 0xdc, 0xb8, 0x31, 0x0c, 0x56, 0xd9, 0x5f, 0x12, 0xd9, 0xd0, 0x35, 0x96, 0x77, 0xb7, 0x7c, 0x12, 0x52, 0x7a, 0x7a, 0x80, 0x0c, 0x80, 0x0c, 0x1d, 0x7e, 0x8e, 0xf5, 0x6d, 0xad, 0xe8, 0x76, 0x7f, 0xf9, 0xb9, 0x1f, 0x72, 0x98, 0xb4, 0xe4, 0x38, 0x43, 0xfc, 0x73, 0x9a, 0x2f, 0x41, 0xc5, 0x7c, 0x3f, 0x2c, 0xf3, 0x63, 0x78, 0xfe, 0x4c, 0x34, 0xb5, 0x74, 0xa4, 0x3f, 0x9c, 0xed, 0xee, 0x7b, 0xd0, 0xce, 0x0e, 0x13, 0x68, 0x26, 0xe8, 0x22, 0xa1, 0x8e, 0xbd, 0xbb, 0xcf, 0x54, 0xb7, 0x2d, 0x9a, 0xd8, 0xc2, 0x85, 0x66, 0x35, 0x9e, 0x54, 0x13, 0x24, 0x32, 0xb2, 0xe7, 0x1e, 0x24, 0x82, 0xc8, 0xc1, 0xa6, 0xf8, 0xaf, 0x75, 0x93, 0x59, 0x59, 0x4f, 0xba, 0x02, 0x40, 0x36, 0x7a, 0xac, 0xc9, 0x44, 0x8f, 0xee, 0xbf, 0x6e, 0x2b, 0x03, 0x00, 0x68, 0x48, 0xce, 0x76, 0xc3, 0x3d, 0x1b, 0x49, 0x59, 0x90, 0x28, 0x53, 0xea, 0x0c, 0x64, 0xd5, 0x07, 0x13, 0x76, 0x68, 0x2f, 0x35, 0x81, 0x36, 0x39, 0x01, 0xa7, 0x69, 0xf1, 0x1a, 0xcc, 0xe4, 0x06, 0x8e, 0x9c, 0x31, 0x24, 0x64, 0xcf, 0xbb, 0x5d, 0x74, 0xab, 0x3e, 0xcd, 0x7c, 0xcb, 0x7b, 0x7e, 0x6f, 0x20, 0x30, 0x89, 0x10, 0x35, 0x47, 0x7e, 0xc0, 0xb7, 0x4e, 0x06, 0x94, 0x34, 0x27, 0xc7, 0xab, 0x23, 0x01, 0x88, 0xbf, 0x25, 0x87, 0x96, 0xf9, 0x8a, 0x56, 0x66, 0x0a, 0x17, 0xb5, 0x7b, 0x77, 0x06, 0x80, 0x8a, 0x34, 0x4f, 0x66, 0xdd, 0x75, 0x26, 0x55, 0xf5, 0xc1, 0xc5, 0x31, 0x73, 0x48, 0x6b, 0xcc, 0x39, 0x76, 0xa5, 0x13, 0xcc, 0xc8, 0xcc, 0x85, 0xfc, 0xdf, 0xcf, 0xea, 0xc8, 0xd3, 0x32, 0x41, 0x7c, 0xc9, 0x57, 0xfa, 0x1c, 0xc8, 0xfd, 0x65, 0x05, 0xc8, 0x06, 0x6b, 0xd2, 0x0c, 0x7d, 0x7c, 0x7d, 0xb2, 0xd7, 0xc8, 0xc6, 0x89, 0x79, 0xb2, 0xd9, 0x22, 0x7b, 0x81, 0x2b, 0x2a, 0xac, 0x59, 0xa5, 0xf6, 0xd6, 0x6b, 0x04, 0x60, 0x43, 0x68, 0x80, 0xd2, 0x7f, 0x3b, 0xab, 0xa0, 0x60, 0xf7, 0x9d, 0x9b, 0x44, 0x0e, 0x4e, 0xe3, 0x9a, 0xc5, 0x43, 0xfc, 0xa4, 0xe4, 0x6d, 0x24, 0x7a, 0xb2, 0x4e, 0xe4, 0x53, 0x20, 0x5d, 0xe6, 0x00, 0x45, 0xac, 0x06, 0xb9, 0x0a, 0xc8, 0xab, 0x1c, 0x27, 0xe0, 0x58, 0x73, 0x4e, 0x2a, 0x7e, 0x36, 0xa5, 0x83, 0x95, 0xd1, 0x7a, 0x56, 0x6a, 0xa6, 0x33, 0xbe, 0xbb, 0x56, 0x83, 0xef, 0x01, 0x3c, 0xe4, 0xd2, 0x8d, 0x3b, 0x41, 0xef, 0xd6, 0xba, 0xf2, 0x90, 0x12, 0xec, 0xee, 0x23, 0x03, 0x55, 0x3c, 0xe1, 0x14, 0x8a, 0xab, 0xad, 0xa4, 0x38, 0xc3, 0x3f, 0xa2, 0x67, 0xfb, 0x81, 0x5a, 0x00, 0x2d, 0x39, 0x8e, 0x8d, 0x46, 0xe9, 0xc9, 0x41, 0x42, 0xf3, 0xf0, 0x38, 0x58, 0x01, 0x1a, 0xff, 0x71, 0xa4, 0xa1, 0x57, 0xdf, 0x3c, 0x7a, 0x36, 0x4c, 0x17, 0xc1, 0x0f, 0xf0, 0xdd, 0x98, 0x53, 0x08, 0x2b, 0x32, 0x38, 0x83, 0x7e, 0x2b, 0xb9, 0xfe, 0x53, 0x1b, 0xde, 0xf2, 0x8c, 0x6a, 0x3d, 0x2c, 0x16, 0x66, 0xc1, 0x7e, 0xc9, 0x92, 0xaa, 0xb5, 0x8f, 0x41, 0xd5, 0xca, 0xc9, 0x64, 0x3e, 0x5d, 0xee, 0xa1, 0xc3, 0x5e, 0x75, 0xa5, 0x2b, 0x0e, 0xf6, 0xba, 0x66, 0x26, 0x8c, 0x9c, 0x16, 0x55, 0x7d, 0x88, 0x4f, 0xf0, 0x1d, 0x97, 0x9b, 0xe6, 0xef, 0x4a, 0x42, 0xf2, 0x0e, 0x66, 0xc8, 0x14, 0xcb, 0x02, 0xb6, 0x41, 0x98, 0xde, 0x9e, 0x5a, 0x25, 0xf6, 0x59, 0x5b, 0xc8, 0x57, 0x93, 0xd5, 0x22, 0x32, 0x8a, 0x9e, 0x00, 0x2f, 0x12, 0xc6, 0x7f, 0x03, 0xdd, 0xce, 0x74, 0x45, 0xf9, 0x15, 0x0a, 0x7d, 0x9a, 0x93, 0xad, 0x7f, 0x1a, 0xc9, 0x27, 0xf7, 0x3e, 0xf8, 0x09, 0x44, 0xbb, 0x92, 0x4d, 0x8a, 0xf8, 0xee, 0x39, 0x02, 0x16, 0x3f, 0x87, 0x95, 0x2e, 0xc7, 0xc2, 0xaa, 0xd9, 0x48, 0xf3, 0x3c, 0xf6, 0xbc, 0x7d, 0x2f, 0xa7, 0x45, 0x46, 0xe4, 0x9d, 0x67, 0x17, 0x0b, 0x96, 0x75, 0x46, 0xb8, 0x23, 0x49, 0x92, 0xb9, 0xaf, 0x38, 0x4e, 0x28, 0xbd, 0x46, 0xc2, 0x3c, 0x71, 0x95, 0xce, 0x64, 0x52, 0x24, 0xd0, 0x97, 0x4e, 0xb6, 0xc8, 0xe5, 0xff, 0x0f, 0xba, 0x53, 0x2c, 0x66, 0x54, 0xe5, 0x93, 0x18, 0xd1, 0xfc, 0xe5, 0x9a, 0x1d, 0xe2, 0x13, 0xb1, 0x3a, 0xa4, 0xc8, 0xe5, 0xe2, 0x20, 0x36, 0x33, 0x6e, 0x5e, 0x16, 0x02, 0xf6, 0x24, 0xea, 0x58, 0xba, 0xc4, 0x86, 0x4e, 0xc0, 0x39, 0xce, 0xc1, 0xbf, 0x72, 0xc1, 0x4b, 0x3c, 0xee, 0xb7, 0x71, 0xf3, 0x89, 0xe6, 0x1e, 0x78, 0x96, 0x2b, 0x51, 0x1e, 0x2d, 0x08, 0x12, 0x18, 0xc6, 0xe9, 0xaa, 0xde, 0x07, 0xab, 0x13, 0xd3, 0xdb, 0x5e, 0xae, 0x24, 0xc4, 0x4a, 0x34, 0xf3, 0x72, 0x31, 0xef, 0xb5, 0x94, 0xd4, 0x2a, 0xd8, 0xee, 0xb8, 0xe6, 0xa9, 0xac, 0x2a, 0xce, 0x76, 0xf6, 0x81, 0x6d, 0xef, 0xc4, 0xa3, 0x9f, 0xd2, 0xf4, 0xcb, 0x45, 0xc8, 0x9a, 0x89, 0x3d, 0x8a, 0x97, 0x0a, 0x92, 0x47, 0x6d, 0x99, 0xef, 0x4a, 0x51, 0x66, 0x5a, 0xd8, 0x82, 0x86, 0x1e, 0x57, 0xda, 0x3c, 0x09, 0xb6, 0xa2, 0x77, 0xd8, 0x08, 0xab, 0x9b, 0xf0, 0x72, 0x9a, 0x84, 0x4f, 0x48, 0x84, 0xc9, 0xc1, 0x73, 0xbb, 0x3d, 0x57, 0x16, 0xe7, 0xbc, 0x15, 0x71, 0x58, 0x24, 0xeb, 0x05, 0x9a, 0xa1, 0xe7, 0xf8, 0x4a, 0x2e, 0xa8, 0xbc, 0x29, 0x58, 0x16, 0xec, 0x6f, 0x45, 0x50, 0x76, 0x62, 0xf6, 0xe6, 0xff, 0x26, 0xc9, 0x49, 0x83, 0xd7, 0x42, 0x7f, 0x3c, 0xd5, 0x0a, 0x1b, 0xc6, 0x5f, 0x38, 0x6d, 0x80, 0x64, 0xd0, 0xf6, 0x35, 0x95, 0x89, 0x1e, 0xfc, 0xbf, 0xd4, 0x2a, 0x5c, 0x58, 0x19, 0x68, 0xb4, 0x58, 0x44, 0xac, 0xda, 0x4a, 0x80, 0x00, 0x03, 0xa2, 0x42, 0x98, 0xe3, 0x51, 0x8a, 0x04, 0x15, 0x97, 0x66, 0xa9, 0xbc, 0x18, 0xb7, 0x72, 0x6b, 0x33, 0x37, 0xc3, 0x42, 0x8f, 0xbb, 0xaf, 0x5a, 0xf6, 0xb6, 0x6a, 0x64, 0x67, 0xff, 0x01, 0x8c, 0x66, 0xd4, 0x48, 0xa4, 0x97, 0x1e, 0x14, 0x7e, 0x8b, 0xf6, 0xab, 0x99, 0xda, 0x69, 0x79, 0x00, 0x72, 0x78, 0x05, 0x70, 0x2e, 0x63, 0x23, 0xb9, 0xab, 0x28, 0x6a, 0x66, 0x57, 0x46, 0xe8, 0xa0, 0xca, 0xc6, 0x15, 0x50, 0x5a, 0x7c, 0x06, 0x84, 0xe9, 0x8b, 0xe3, 0x14, 0x02, 0x27, 0x9b, 0x85, 0x25, 0x9f, 0xd6, 0x2d, 0x5e, 0x9a, 0x2c, 0x98, 0x1c, 0xa0, 0x94, 0x2b, 0x41, 0xdd, 0x1f, 0x07, 0x76, 0x22, 0xe6, 0x31, 0xc1, 0x2d, 0x40, 0xef, 0x59, 0x2a, 0x39, 0x75, 0xb9, 0x7a, 0x40, 0xc0, 0xf3, 0xb2, 0x20, 0xc3, 0x47, 0xe7, 0x32, 0xc1, 0xf4, 0x29, 0xd0, 0xfa, 0x4e, 0x4d, 0x0c, 0x89, 0x11, 0xf0, 0xa2, 0x8d, 0xf5, 0xb8, 0x2c, 0x87, 0x82, 0xdd, 0x95, 0x03, 0x26, 0xe8, 0xd0, 0x7b, 0x85, 0xbb, 0xca, 0x78, 0x10, 0xd2, 0x9d, 0xfa, 0xd9, 0xc8, 0x06, 0x1a, 0xa5, 0x1d, 0x19, 0xee, 0x43, 0x36, 0x33, 0xad, 0x1d, 0xa5, 0x31, 0x13, 0x0d, 0xab, 0xdf, 0x07, 0x72, 0xfb, 0xb3, 0x7c, 0x82, 0xc1, 0xbc, 0x95, 0xe2, 0xe3, 0xd5, 0x0c, 0x74, 0x87, 0x1e, 0xd4, 0x70, 0xd5, 0xad, 0xfd, 0xb6, 0xfe, 0x80, 0xd9, 0x62, 0x7d, 0xb6, 0x5d, 0xa1, 0x9d, 0xff, 0xc9, 0xc4, 0x3b, 0x52, 0x8c, 0x93, 0xcd, 0xde, 0x61, 0xe4, 0xa3, 0x42, 0xbf, 0x6c, 0x6d, 0x00, 0x70, 0xd4, 0xfe, 0x2f, 0x7f, 0x0f, 0x4f, 0x71, 0x58, 0xec, 0xc7, 0x25, 0x2b, 0xe7, 0xb9, 0xde, 0x91, 0x45, 0x2f, 0x13, 0x72, 0x60, 0xe6, 0x18, 0x26, 0x3f, 0x99, 0x4c, 0xda, 0x69, 0x82, 0x95, 0x36, 0xfb, 0x1f, 0x09, 0x3d, 0xf9, 0x32, 0xee, 0x74, 0xe2, 0x0b, 0xe5, 0x46, 0x87, 0x09, 0x62, 0xa7, 0x1c, 0x5f, 0x5f, 0xf8, 0x90, 0x14, 0x52, 0x2a, 0x1a, 0x4e, 0x5c, 0x27, 0x15, 0xcf, 0xc3, 0x6d, 0x0d, 0xc0, 0xa2, 0xfc, 0x1a, 0xad, 0xdf, 0x73, 0x6c, 0xd2, 0x5e, 0x76, 0x28, 0x95, 0x74, 0x52, 0x73, 0x53, 0x9f, 0xe4, 0xcb, 0x5f, 0x74, 0xb7, 0x9e, 0x48, 0xd8, 0x6c, 0x15, 0x5b, 0x73, 0x5f, 0x31, 0x69, 0x62, 0x87, 0x1a, 0xcb, 0x2c, 0x9e, 0xb4, 0xa2, 0xf8, 0x82, 0x72, 0x63, 0xfd, 0xdc, 0x6f, 0x94, 0x39, 0xff, 0xbb, 0xd0, 0x66, 0x13, 0xf2, 0x11, 0x2a, 0x72, 0x14, 0x2f, 0x8e, 0x52, 0x90, 0xa3, 0xb1, 0xa5, 0xa2, 0x91, 0xbe, 0x3d, 0xdf, 0x06, 0x1b, 0x34, 0x0f, 0x7e, 0xe3, 0x8b, 0x3a, 0xa9, 0x97, 0x11, 0x06, 0x6e, 0x10, 0x86, 0x40, 0x31, 0xb8, 0x01, 0xb8, 0x51, 0xfa, 0x8f, 0x52, 0xf5, 0xf7, 0x1d, 0x5a, 0x09, 0x7b, 0x98, 0x18, 0x83, 0x2f, 0x52, 0xa4, 0xeb, 0x10, 0xa8, 0xfc, 0x1a, 0x1f, 0xe2, 0x54, 0x42, 0x5a, 0x5a, 0xad, 0x2e, 0xec, 0xe1, 0xa9, 0xcb, 0xa1, 0x5e, 0x9e, 0xe8, 0x9c, 0xb8, 0xe9, 0x3a, 0x4c, 0xf6, 0x85, 0xa3, 0x9c, 0xa5, 0xdc, 0xb3, 0x6a, 0x7a, 0xdc, 0x70, 0x3b, 0x39, 0x4e, 0x52, 0x2d, 0xd5, 0x63, 0x92, 0x2d, 0xd9, 0x90, 0xa5, 0x69, 0x06, 0x9c, 0x03, 0x08, 0x3e, 0xf8, 0x2c, 0x19, 0xa1, 0x4e, 0xed, 0xca, 0xf5, 0x5c, 0xdf, 0xdb, 0x4b, 0x03, 0x32, 0x52, 0xdf, 0x9b, 0xa8, 0x6f, 0x41, 0x8a, 0xe4, 0xe2, 0xb2, 0x15, 0xe5, 0x3c, 0xd1, 0x76, 0xce, 0xa4, 0x77, 0x2e, 0xe8, 0xcb, 0xdf, 0x9c, 0xe9, 0x22, 0x0a, 0xcf, 0x77, 0x4a, 0x61, 0x99, 0xe8, 0xcb, 0x9d, 0xe4, 0x4c, 0x0a, 0xe4, 0x49, 0xad, 0x75, 0x34, 0xdf, 0x95, 0x01, 0x05, 0x51, 0xd1, 0xd6, 0x2a, 0x34, 0x75, 0x48, 0xf9, 0x97, 0x20, 0x0a, 0xab, 0xdb, 0x81, 0x9e, 0x06, 0xc5, 0x1a, 0x10, 0x39, 0xd1, 0x44, 0xe4, 0x07, 0xc9, 0x74, 0x4d, 0x27, 0x97, 0xbc, 0xa0, 0xeb, 0x58, 0x95, 0x07, 0x21, 0xb1, 0xdb, 0x7a, 0x37, 0x66, 0x19, 0xeb, 0xa2, 0x28, 0x07, 0xc1, 0x7f, 0xaf, 0x51, 0x88, 0x7b, 0x09, 0x9a, 0xe7, 0xf1, 0x32, 0xc1, 0xd2, 0x53, 0xe4, 0x63, 0x00, 0xcb, 0xb0, 0xa1, 0xa0, 0x22, 0x4e, 0x23, 0x48, 0xe0, 0x32, 0x5c, 0x2e, 0xb5, 0x5f, 0x10, 0x9a, 0x17, 0x80, 0x14, 0x9b, 0x2d, 0x35, 0x56, 0xfa, 0xec, 0xab, 0x1d, 0x6c, 0x80, 0x6f, 0x91, 0x0b, 0xed, 0x84, 0x7d, 0x07, 0xf6, 0xb3, 0x54, 0x99, 0x3e, 0x22, 0x72, 0x39, 0xad, 0x28, 0xa5, 0x11, 0x15, 0x60, 0xec, 0xb1, 0x15, 0xfc, 0x7e, 0x04, 0x3e, 0x5c, 0x0e, 0x83, 0x75, 0xe0, 0x4e, 0xa8, 0x98, 0xfa, 0xb2, 0xa6, 0x65, 0x87, 0x76, 0x57, 0x97, 0x5f, 0xe2, 0x76, 0x51, 0x2a, 0xcd, 0x0e, 0xc0, 0x76, 0x60, 0x32, 0xfd, 0x07, 0x1c, 0xef, 0x30, 0x6e, 0x1e, 0x7f, 0xfb, 0xde, 0xa2, 0xbf, 0x16, 0x3a, 0xc7, 0xe4, 0x36, 0x72, 0x92, 0x69, 0x34, 0x10, 0x34, 0x4b, 0x6b, 0x0e, 0x90, 0x79, 0x62, 0xeb, 0xf8, 0x86, 0xab, 0xfe, 0x37, 0xa2, 0x0a, 0x09, 0xd5, 0xc8, 0xda, 0x11, 0x96, 0x39, 0xad, 0x6d, 0x44, 0x28, 0x33, 0x1e, 0xae, 0xb7, 0x5d, 0x5e, 0xf1, 0x22, 0xc1, 0x7b, 0xf6, 0x3a, 0x41, 0xe6, 0x3c, 0x16, 0xe7, 0x87, 0xd8, 0x05, 0x14, 0x54, 0xba, 0xc6, 0xda, 0x22, 0x31, 0xfc, 0xa6, 0xbb, 0xb2, 0xdc, 0x22, 0x30, 0xd5, 0x29, 0x59, 0x71, 0xa0, 0x62, 0x1d, 0x1a, 0x08, 0x3a, 0xa5, 0x90, 0xb5, 0x48, 0x7b, 0x4d, 0x06, 0x00, 0x96, 0x78, 0x55, 0xe2, 0xc2, 0xb9, 0x7c, 0xf1, 0x49, 0x4b, 0x97, 0x67, 0xcc, 0x53, 0x0c, 0xa7, 0x72, 0x70, 0xc9, 0x73, 0x45, 0x93, 0xcd, 0x5f, 0xd8, 0x11, 0xea, 0x85, 0x2d, 0xf6, 0xc9, 0x7b, 0xd7, 0x9d, 0x2e, 0x82, 0x5c, 0x7d, 0x7d, 0x00, 0xdd, 0x46, 0x7e, 0x31, 0xf9, 0x2d, 0x5d, 0x19, 0xee, 0x83, 0xf5, 0xbd, 0x01, 0x8d, 0x4d, 0x92, 0x21, 0x90, 0x63, 0x36, 0xc7, 0x2b, 0x29, 0x5e, 0x20, 0xe9, 0xce, 0x10, 0x6e, 0x17, 0x3e, 0x12, 0xac, 0xd3, 0xec, 0xa2, 0x70, 0x66, 0xcf, 0x67, 0x16, 0xd4, 0xaa, 0xa8, 0x1b, 0xb1, 0x91, 0xbc, 0xc7, 0x35, 0xa9, 0xc1, 0x0f, 0x93, 0x2f, 0x91, 0xb9, 0x87, 0xbc, 0xf2, 0xc1, 0x2e, 0xc7, 0x0d, 0xfc, 0x1b, 0x6b, 0x22, 0xfb, 0xa7, 0x6a, 0x79, 0x32, 0x88, 0x73, 0x9c, 0x59, 0xa6, 0xa0, 0xc3, 0x13, 0x2a, 0x43, 0x90, 0xce, 0xd7, 0xe2, 0xfc, 0xea, 0x9d, 0x80, 0x92, 0x1d, 0x6b, 0x1e, 0xdb, 0x16, 0x46, 0x82, 0x19, 0x60, 0x98, 0x37, 0x37, 0x8a, 0xca, 0xd5, 0x01, 0x85, 0x14, 0x83, 0x91, 0x4d, 0x94, 0xb9, 0x09, 0xcb, 0x9e, 0x4b, 0x88, 0xfb, 0x54, 0xa3, 0x56, 0x4a, 0x76, 0x4d, 0x62, 0x42, 0x7b, 0xba, 0xef, 0x68, 0xe0, 0x3d, 0x8a, 0x65, 0xc0, 0x5a, 0x3f, 0x65, 0xa5, 0x40, 0x0c, 0xbd, 0x9e, 0x94, 0x96, 0xd0, 0x91, 0x70, 0x1b, 0x33, 0xd3, 0xac, 0xa8, 0x0f, 0xf6, 0x5c, 0x8c, 0xc7, 0xe2, 0x99, 0x0c, 0xdb, 0x27, 0x85, 0x58, 0x0d, 0x92, 0x89, 0xbe, 0xc2, 0xff, 0xe1, 0x1e, 0xaa, 0x6d, 0x5b, 0x9e, 0xa3, 0x58, 0x5b, 0x9e, 0xdb, 0x43, 0x23, 0xef, 0x35, 0x94, 0x51, 0x3f, 0xef, 0xa4, 0xa9, 0xd8, 0x81, 0x17, 0x15, 0x8b, 0xc8, 0x69, 0xea, 0xe6, 0x63, 0xca, 0x6d, 0xae, 0x5e, 0x2c, 0x96, 0x89, 0x0d, 0x9a, 0x14, 0xfa, 0x3b, 0xcb, 0x90, 0x92, 0x85, 0xf7, 0x36, 0x65, 0x00, 0xe9, 0x72, 0xbc, 0x22, 0x56, 0xf7, 0x09, 0xdf, 0x6d, 0x06, 0x20, 0x12, 0xaf, 0xed, 0xa3, 0x1f, 0x01, 0xce, 0xbe, 0xd6, 0xff, 0xa1, 0x15, 0x9b, 0x94, 0x7c, 0xfb, 0xc4, 0xc7, 0x12, 0xe5, 0x43, 0xd8, 0x7b, 0x1e, 0x85, 0x8c, 0x33, 0xbc, 0x9a, 0xc5, 0x64, 0xd2, 0x95, 0x55, 0x68, 0xe7, 0x36, 0x14, 0x89, 0xa7, 0xc6, 0x31, 0x0c, 0xd9, 0x43, 0xc5, 0x6f, 0x91, 0xbd, 0xae, 0xee, 0xa7, 0x00, 0x9a, 0x4c, 0x67, 0x73, 0x62, 0xcf, 0x8a, 0x40, 0x9a, 0x8d, 0x66, 0xb5, 0x66, 0xe6, 0x61, 0xeb, 0x8e, 0x52, 0xab, 0xa5, 0xd5, 0x5d, 0x2d, 0x7a, 0x87, 0xef, 0xbc, 0x37, 0x52, 0xd1, 0x93, 0x7f, 0x56, 0x6d, 0x00, 0xb4, 0x7f, 0xd5, 0x5d, 0x1b, 0x13, 0x07, 0x42, 0x3a, 0x87, 0x70, 0xf9, 0x85, 0x97, 0xae, 0x32, 0x3a, 0x96, 0x9a, 0xf8, 0x8a, 0x02, 0x86, 0xe4, 0xf9, 0x5b, 0xc3, 0x91, 0x07, 0x35, 0x67, 0x4f, 0x10, 0x8d, 0x4c, 0x1c, 0x71, 0x59, 0x5c, 0xd0, 0xec, 0x62, 0x0c, 0x97, 0x4e, 0x56, 0x27, 0xa4, 0x4e, 0x19, 0xcd, 0x24, 0xb9, 0x5d, 0xbb, 0x71, 0xcc, 0x72, 0xcd, 0x89, 0xe1, 0x5f, 0xc0, 0xbe, 0x4f, 0x31, 0x3d, 0xaf, 0x8b, 0x93, 0x13, 0x76, 0x93, 0x9f, 0xc5, 0x23, 0x8c, 0xf4, 0x44, 0x6a, 0xa9, 0x09, 0xfd, 0x98, 0x50, 0xc1, 0x16, 0xcb, 0x78, 0x3f, 0xf5, 0x63, 0x56, 0xfb, 0x03, 0xb4, 0x38, 0x15, 0xaf, 0xfd, 0xb1, 0xea, 0xb5, 0x9e, 0xf6, 0xe6, 0xa0, 0x85, 0x88, 0x99, 0x8d, 0xea, 0x13, 0x0c, 0x33, 0x3c, 0x96, 0x55, 0x20, 0x5b, 0xc5, 0x69, 0x45, 0x07, 0xac, 0x32, 0xb5, 0x99, 0x94, 0xe1, 0xaa, 0xf0, 0x2a, 0x86, 0xc9, 0xaf, 0xde, 0xdd, 0xa7, 0xa6, 0x8a, 0x6b, 0x8b, 0x8d, 0x54, 0xca, 0x76, 0xf8, 0xd5, 0x42, 0x60, 0x87, 0x7b, 0x99, 0xc5, 0x5d, 0x2b, 0x2b, 0x60, 0xd4, 0x2b, 0x3d, 0x37, 0x6f, 0x40, 0x8e, 0xd7, 0x11, 0x13, 0x2f, 0xe1, 0x6c, 0xd9, 0x95, 0xc5, 0xbb, 0x33, 0xed, 0xce, 0xb4, 0x53, 0xaf, 0x5f, 0xb8, 0x61, 0x76, 0x7c, 0x4e, 0x1d, 0x0f, 0x8b, 0xcf, 0xc5, 0xcf, 0x5c, 0x63, 0x39, 0x2a, 0x68, 0x2b, 0x5d, 0x82, 0x56, 0xc0, 0xbf, 0x3d, 0xc4, 0xdd, 0x7a, 0x1a, 0x43, 0x58, 0x5a, 0xc5, 0xa3, 0x57, 0x40, 0xa9, 0x72, 0xc0, 0xc8, 0x05, 0xbf, 0xf1, 0x2a, 0x42, 0x23, 0xb2, 0x5e, 0x84, 0x03, 0x67, 0x84, 0x7f, 0x0f, 0x8b, 0x82, 0x8c, 0x0e, 0x59, 0xef, 0xfb, 0xde, 0xcc, 0x30, 0xab, 0xb6, 0xca, 0xe0, 0xd9, 0xaf, 0x9c, 0x76, 0x36, 0x83, 0xa2, 0x21, 0x3c, 0x94, 0x45, 0xf7, 0xc1, 0x30, 0x2c, 0x4f, 0xcd, 0x13, 0xb3, 0x6b, 0xa9, 0x2d, 0x99, 0x5b, 0x38, 0xa6, 0xf8, 0x1d, 0x8a, 0x20, 0x7b, 0x09, 0xaf, 0x3c, 0xcb, 0x6d, 0xc9, 0x5f, 0x4a, 0x74, 0x65, 0xb6, 0x04, 0x4c, 0x0c, 0x77, 0xe3, 0x87, 0x14, 0x6a, 0x22, 0xc2, 0xbc, 0xa9, 0x03, 0x85, 0x79, 0xa4, 0xc5, 0x6b, 0x8a, 0x67, 0xd0, 0x83, 0xd2, 0x20, 0x34, 0xf5, 0xe7, 0xdb, 0x51, 0xe9, 0x67, 0x91, 0xd7, 0xa4, 0x8b, 0x61, 0xf2, 0xf4, 0xfe, 0x1d, 0xbe, 0xcf, 0xef, 0x08, 0x01, 0x37, 0x65, 0xde, 0x19, 0x60, 0xd2, 0x15, 0x33, 0x15, 0xec, 0x63, 0xbe, 0x58, 0xb8, 0x80, 0x20, 0x49, 0xe7, 0x2d, 0xa7, 0x49, 0x66, 0x75, 0xc2, 0x5e, 0x31, 0x33, 0x71, 0xd9, 0x68, 0xd4, 0xfa, 0x37, 0xa4, 0x5e, 0xde, 0x46, 0x8b, 0xb1, 0x0b, 0x89, 0xa2, 0x0e, 0x53, 0xdc, 0x63, 0xd5, 0x1d, 0x5b, 0x90, 0x93, 0x5a, 0x81, 0xc6, 0x3b, 0xbb, 0x8d, 0x55, 0xb4, 0x21, 0x2a, 0x4f, 0x94, 0x56, 0x4e, 0xdf, 0x2c, 0xfa, 0x63, 0xdc, 0xc4, 0xc0, 0xa5, 0x9e, 0x27, 0xda, 0xcb, 0x11, 0x63, 0xb1, 0xe9, 0x07, 0xca, 0xda, 0x95, 0xd3, 0x3c, 0x45, 0x49, 0x13, 0xa9, 0xb8, 0x08, 0xcd, 0xd1, 0x7c, 0x44, 0xbe, 0x4e, 0x57, 0x00, 0xee, 0xd5, 0xba, 0x32, 0x88, 0xb9, 0x3a, 0x6b, 0xe9, 0xb0, 0x44, 0xb9, 0xf7, 0xda, 0x0d, 0xcd, 0xb4, 0xff, 0xc9, 0x59, 0x13, 0x19, 0x1d, 0xbc, 0x0a, 0x12, 0xd6, 0xe1, 0xe8, 0xce, 0xdb, 0x64, 0xe9, 0x6c, 0x60, 0xf7, 0x07, 0xc9, 0x5d, 0x05, 0x14, 0x46, 0x3f, 0x95, 0x06, 0xcc, 0xdd, 0x70, 0x92, 0x0d, 0xad, 0x86, 0xfc, 0x0c, 0x38, 0x8e, 0x2d, 0xdf, 0xcb, 0xed, 0x06, 0xb3, 0x70, 0xd9, 0xf4, 0x12, 0x1c, 0xbe, 0xc4, 0x61, 0x2a, 0xe0, 0xb9, 0xad, 0x08, 0x43, 0xdc, 0xa7, 0x31, 0xc8, 0x94, 0xec, 0x5b, 0x98, 0x76, 0x8a, 0xf1, 0xc5, 0x5e, 0xc0, 0xc3, 0x2f, 0xbf, 0x06, 0xfd, 0xa5, 0x37, 0x4d, 0x55, 0x4d, 0x67, 0x88, 0x89, 0x46, 0x01, 0x6b, 0x09, 0x8b, 0x22, 0x73, 0xf0, 0x1b, 0xe3, 0x26, 0x39, 0x57, 0x2b, 0x9c, 0x30, 0xab, 0xc7, 0x3e, 0x26, 0x70, 0xbc, 0xce, 0x69, 0x11, 0xdb, 0xa8, 0x74, 0x6d, 0x97, 0x47, 0x62, 0x7d, 0x14, 0x0a, 0xa9, 0x37, 0x80, 0x38, 0x04, 0xb2, 0xa6, 0x43, 0xb1, 0x8a, 0xc0, 0x49, 0xdd, 0x86, 0x8d, 0xe0, 0x5d, 0x78, 0xa4, 0x13, 0x9e, 0x65, 0x08, 0xa8, 0xdf, 0xe6, 0xfc, 0xa5, 0x9d, 0xce, 0x19, 0x12, 0x4f, 0x0d, 0x9d, 0xff, 0x54, 0xd5, 0x06, 0xc9, 0x2a, 0xfb, 0xe0, 0x9a, 0xe0, 0x9f, 0xdb, 0x2f, 0xce, 0x0f, 0x20, 0xde, 0x83, 0xe9, 0xe5, 0xd7, 0xff, 0x80, 0x3f, 0xaa, 0x23, 0x81, 0x38, 0x09, 0x65, 0xd7, 0x22, 0xcf, 0xc8, 0xcb, 0x2b, 0x42, 0x0c, 0x70, 0x31, 0x95, 0x21, 0x3e, 0xd7, 0xb2, 0xe2, 0xfd, 0xd8, 0x36, 0x00, 0xe5, 0x9b, 0xbc, 0x3c, 0x03, 0x08, 0x5e, 0xda, 0xde, 0x9b, 0x79, 0x52, 0x5b, 0xb6, 0xb1, 0x48, 0xde, 0x3c, 0x35, 0xbe, 0xb2, 0x5b, 0x44, 0x89, 0xab, 0xa9, 0xf1, 0x01, 0x09, 0x73, 0x23, 0xfd, 0xa0, 0x51, 0xdf, 0xff, 0x36, 0xfe, 0xca, 0xab, 0x2d, 0x67, 0xe9, 0x7e, 0x62, 0x02, 0xac, 0xbc, 0x54, 0x61, 0x2b, 0xaa, 0x89, 0x07, 0xaf, 0xfe, 0x2d, 0x7a, 0x74, 0x94, 0xfd, 0x9a, 0xad, 0x62, 0x63, 0x30, 0xc9, 0xae, 0xe2, 0xca, 0xf5, 0x7e, 0xb5, 0xc7, 0xe2, 0x51, 0xb3, 0xae, 0xc8, 0x0c, 0x76, 0xc4, 0xab, 0x37, 0xbc, 0xdd, 0xdd ],
+const [ 0x3a, 0x14, 0x14, 0x5d, 0xd1, 0xfa, 0x9e, 0x46, 0xc4, 0x56, 0x2e, 0xed, 0x0b, 0x0d, 0xa1, 0x0d, 0x84, 0x5a, 0xd8, 0x4f, 0x43, 0xcd, 0xb1, 0x6e, 0x29, 0x93, 0x36, 0x99, 0xb8, 0xf7, 0x15, 0x19, 0x25, 0x29, 0x51, 0x33, 0xaf, 0x3e, 0x36, 0x50, 0x30, 0x79, 0x92, 0x5b, 0xf2, 0xc9, 0x22, 0x6b, 0xc3, 0x92, 0x4b, 0xa2, 0x4c, 0xb0, 0x0a, 0x55, 0x9e, 0xba, 0x2e, 0x6c, 0x0e, 0x83, 0xc5, 0x0c, 0x43, 0xe7, 0xd4, 0x74, 0x8d, 0xc4, 0x4b, 0x25, 0x78, 0x46, 0x37, 0x46, 0xa2, 0x68, 0x3a, 0x46, 0xc9, 0xb7, 0x38, 0xc3, 0x28, 0x59, 0x54, 0xab, 0x04, 0x4f, 0x1b, 0xa1, 0x82, 0xf7, 0xfe, 0xa2, 0xbb, 0xd5, 0x06, 0xe8, 0x12, 0x92, 0xc3, 0x0e, 0xc6, 0x45, 0x86, 0x76, 0xc3, 0xf2, 0xd0, 0xe8, 0xbe, 0x50, 0x09, 0x7b, 0x80, 0xd0, 0x75, 0xb9, 0x82, 0xda, 0x65, 0xfe, 0xbb, 0x5a, 0xaa, 0x21, 0xb6, 0x7b, 0x4f, 0x56, 0xe7, 0xb2, 0x88, 0x53, 0x3f, 0xff, 0xe5, 0xb2, 0xfe, 0x70, 0xcb, 0x97, 0xc9, 0xe6, 0x25, 0x92, 0xfc, 0x1b, 0x57, 0xc7, 0x41, 0xe4, 0x73, 0x4c, 0x62, 0xb4, 0xb0, 0xd2, 0x5b, 0x62, 0x18, 0x88, 0xb4, 0x2c, 0x80, 0x3c, 0x0d, 0xfb, 0xbd, 0xc3, 0xfb, 0xe9, 0x15, 0x9c, 0x12, 0x00, 0xf4, 0xd0, 0x43, 0x44, 0xe0, 0x1c, 0x69, 0xf4, 0xaf, 0x52, 0x1e, 0x0e, 0xf8, 0xfd, 0xd3, 0x11, 0xc7, 0x44, 0x20, 0x06, 0x95, 0x11, 0x58, 0xc1, 0x77, 0x72, 0x61, 0x65, 0x95, 0x3f, 0xc2, 0x26, 0xde, 0xfd, 0xfe, 0x53, 0xfa, 0x02, 0x21, 0x93, 0x80, 0xda, 0x98, 0x6f, 0x6a, 0xea, 0x45, 0x10, 0xc6, 0x53, 0xd3, 0x4a, 0xae, 0x19, 0x47, 0xda, 0x79, 0x85, 0xd8, 0xec, 0x33, 0xc7, 0x01, 0xe1, 0x4b, 0xe0, 0xd4, 0x4e, 0x8c, 0xbf, 0x91, 0x48, 0x4e, 0xaa, 0x77, 0xdf, 0xee, 0xe0, 0xda, 0xe8, 0x7b, 0x7d, 0x76, 0x00, 0xb2, 0x9d, 0x03, 0xcd, 0x2d, 0xc4, 0x0a, 0x87, 0xd7, 0x7e, 0xf6, 0xb7, 0xa3, 0x42, 0x6e, 0x3f, 0x7e, 0x9c, 0xe2, 0x9b, 0x82, 0x8c, 0x64, 0x66, 0x6c, 0x29, 0xba, 0x20, 0x50, 0x89, 0xb1, 0x2e, 0x8b, 0xe5, 0xb4, 0x22, 0xfa, 0xf9, 0x9c, 0x3d, 0x69, 0xaa, 0xca, 0x32, 0x4e, 0xeb, 0x73, 0x2d, 0xb8, 0xe1, 0x3c, 0x14, 0x82, 0x45, 0x07, 0x0d, 0xcc, 0x0b, 0x0c, 0x40, 0xab, 0x41, 0x2b, 0xde, 0x20, 0x39, 0x80, 0x62, 0x47, 0xea, 0x39, 0x17, 0xd1, 0x94, 0xa4, 0xda, 0xb4, 0xa3, 0x8c, 0x21, 0x21, 0xd6, 0xc6, 0x3c, 0xb7, 0xa0, 0x07, 0xdb, 0xf6, 0xcf, 0xf9, 0xd1, 0xf6, 0x6b, 0x8d, 0x17, 0x59, 0xe1, 0x92, 0x14, 0x7e, 0x60, 0x87, 0x1b, 0xf7, 0x84, 0xad, 0x36, 0x3e, 0x32, 0x61, 0x22, 0xa3, 0xc3, 0xa9, 0x9a, 0x89, 0x64, 0x0d, 0xd9, 0xd2, 0xbc, 0xa8, 0x5a, 0x98, 0xd0, 0x7e, 0xe2, 0x1e, 0x24, 0x10, 0xc0, 0x06, 0x23, 0x2e, 0x53, 0xc4, 0xc1, 0x0d, 0xce, 0x52, 0x5f, 0x99, 0x38, 0x25, 0xef, 0x0c, 0xb7, 0x61, 0x58, 0xc0, 0x0d, 0x49, 0x1c, 0x41, 0x63, 0xf9, 0x38, 0xa7, 0x46, 0x57, 0x4c, 0x23, 0xef, 0x47, 0xfb, 0xd7, 0xc7, 0x1e, 0x95, 0xeb, 0x2a, 0x5a, 0xf3, 0xdd, 0x6b, 0x90, 0xa3, 0x18, 0x19, 0xa5, 0x46, 0xc9, 0x81, 0x41, 0x35, 0xee, 0x74, 0x81, 0x6b, 0xaf, 0x4b, 0xec, 0x9f, 0xf2, 0x27, 0xa9, 0xb0, 0x2a, 0x7e, 0xef, 0x46, 0x6f, 0xd3, 0xbc, 0xb7, 0xd4, 0xc4, 0xca, 0x27, 0xf5, 0x4a, 0xbf, 0xf4, 0xcf, 0x3d, 0xa3, 0x51, 0xd5, 0x16, 0x98, 0x30, 0x40, 0xf9, 0xc5, 0x66, 0xa6, 0xf3, 0x94, 0x09, 0xce, 0x80, 0x1d, 0x1d, 0xc3, 0x50, 0xe2, 0x70, 0x27, 0x4a, 0xbc, 0xc3, 0xca, 0xd2, 0x15, 0x2a, 0x7b, 0x47, 0x58, 0xb6, 0x1e, 0xd0, 0xa6, 0x50, 0xff, 0x59, 0xcb, 0xe8, 0x66, 0xd8, 0x70, 0xd0, 0x6c, 0xd5, 0x91, 0x62, 0x0c, 0x29, 0x32, 0xe9, 0x7d, 0x06, 0x4e, 0xbf, 0xbf, 0x37, 0x11, 0xb2, 0x75, 0xa9, 0x47, 0xac, 0xf2, 0x2b, 0x13, 0x94, 0x96, 0x72, 0xe4, 0x6f, 0x5b, 0x60, 0xa5, 0xcb, 0xab, 0x86, 0x34, 0x5d, 0x75, 0xe7, 0x16, 0xe9, 0x7f, 0xfe, 0x69, 0x62, 0xfe, 0x03, 0x19, 0x53, 0x64, 0x6b, 0x57, 0x7d, 0x79, 0xae, 0x47, 0xc1, 0xad, 0x4c, 0xf9, 0x41, 0xac, 0x12, 0x9b, 0xc3, 0x34, 0x99, 0xed, 0x56, 0x23, 0x11, 0xf5, 0x37, 0xd5, 0x3c, 0xf3, 0xf5, 0xac, 0xbd, 0x97, 0xd4, 0xf0, 0x93, 0x72, 0x6f, 0xda, 0xe1, 0xab, 0xa2, 0xeb, 0xf0, 0xf3, 0xa7, 0x82, 0x76, 0xba, 0x7f, 0xae, 0x19, 0xa3, 0x94, 0x41, 0x2f, 0x36, 0x9c, 0x26, 0xc8, 0xd6, 0xc0, 0xf4, 0xee, 0xf2, 0xfe, 0xc2, 0x2b, 0x7f, 0xcc, 0x3e, 0x4c, 0xa5, 0xfe, 0xf9, 0x65, 0xb8, 0xe9, 0x05, 0x15, 0x6b, 0xc9, 0xc2, 0x0b, 0x40, 0x60, 0xf5, 0xc9, 0x43, 0xe0, 0x1a, 0xa8, 0xf8, 0x0b, 0xfc, 0x1d, 0x92, 0x99, 0x82, 0x3a, 0x65, 0xda, 0xcc, 0x78, 0x9e, 0x9c, 0x7e, 0xb3, 0x32, 0x4f, 0x5c, 0x76, 0x14, 0x67, 0x18, 0x79, 0xab, 0x02, 0x67, 0x68, 0x83, 0xcb, 0x5a, 0xe6, 0x43, 0x1e, 0xec, 0xd2, 0xdf, 0x6d, 0xd8, 0xc9, 0x0e, 0xe2, 0xad, 0xec, 0xff, 0x45, 0x23, 0xe3, 0x47, 0x21, 0xb0, 0x22, 0x1f, 0x22, 0x57, 0x6a, 0xcc, 0xc2, 0xc1, 0x93, 0x5e, 0x24, 0x8e, 0x8a, 0x9d, 0x40, 0xed, 0x96, 0x41, 0x41, 0x6a, 0xdf, 0x61, 0x2b, 0x08, 0x30, 0x2e, 0xc1, 0x90, 0xfc, 0xe1, 0xa6, 0x28, 0x9f, 0xf2, 0xc2, 0x27, 0xe7, 0x8b, 0xe7, 0x28, 0xd3, 0x3c, 0xb5, 0x5e, 0x9a, 0xf0, 0xbb, 0x27, 0xef, 0x20, 0xde, 0xe3, 0x84, 0x46, 0xff, 0x06, 0xcd, 0x95, 0xd8, 0x6c, 0x06, 0xe7, 0x27, 0xed, 0x77, 0xf7, 0x0f, 0x32, 0xf7, 0xd0, 0xbb, 0xc6, 0xaf, 0x85, 0x44, 0x70, 0x20, 0x23, 0xd5, 0xc1, 0x68, 0xe4, 0x0d, 0xe9, 0xc0, 0xa5, 0xa4, 0xcf, 0x4a, 0x9a, 0x52, 0x60, 0x0a, 0x41, 0xec, 0x26, 0x31, 0x94, 0xd1, 0x1d, 0xa2, 0x83, 0x84, 0xc3, 0xaf, 0xa1, 0x9a, 0x6f, 0x23, 0x1e, 0xd7, 0xe3, 0x86, 0xf5, 0x94, 0x24, 0x9c, 0x66, 0x63, 0x8a, 0x2f, 0xa7, 0xf6, 0x13, 0x0e, 0xd7, 0x3d, 0xfc, 0x56, 0x33, 0xcf, 0x93, 0xf0, 0x8c, 0x8b, 0x47, 0x5b, 0xf9, 0x7f, 0x01, 0xac, 0xc9, 0x09, 0xb7, 0xd3, 0xbb, 0x3b, 0x3e, 0x1f, 0x72, 0x84, 0x5f, 0x05, 0x23, 0x8d, 0x2e, 0x1d, 0x91, 0x62, 0x97, 0x6d, 0x3b, 0xd2, 0x3a, 0xea, 0xd3, 0x18, 0x79, 0x3c, 0xf3, 0xbb, 0xce, 0xc2, 0x0c, 0xb2, 0x62, 0xd6, 0x9f, 0xcc, 0xdc, 0x52, 0xaf, 0x4f, 0x77, 0x52, 0x76, 0xdf, 0x58, 0x3c, 0x57, 0xa2, 0x1e, 0xfe, 0x14, 0xa2, 0xba, 0x97, 0x41, 0x73, 0x81, 0xd9, 0xf8, 0x15, 0x7f, 0x6d, 0xcf, 0x1b, 0x0f, 0x17, 0x07, 0x0d, 0xa9, 0x3b, 0x06, 0x0c, 0xfa, 0xa1, 0x07, 0xb4, 0x3a, 0x75, 0x11, 0x47, 0xba, 0x92, 0x25, 0x07, 0xbc, 0x00, 0xbc, 0xe3, 0x88, 0xba, 0x71, 0x56, 0xbc, 0xb5, 0xfa, 0x8d, 0xe4, 0x1f, 0x5c, 0xc8, 0x4a, 0xe4, 0x5f, 0x02, 0x10, 0x77, 0x40, 0xd4, 0x7b, 0xcf, 0xa7, 0x97, 0x92, 0xb0, 0xd8, 0xc9, 0xe8, 0x2b, 0x2d, 0xb1, 0xb6, 0x68, 0xc4, 0x46, 0x2c, 0xa3, 0x75, 0x4e, 0x09, 0x75, 0x07, 0xc3, 0x6a, 0x55, 0xa3, 0x7a, 0xdf, 0x5e, 0x88, 0x07, 0xc4, 0x53, 0x01, 0xdb, 0xcf, 0xe0, 0x94, 0xaf, 0xe5, 0x22, 0x7d, 0x26, 0x32, 0x6a, 0x5b, 0xad, 0x78, 0x3e, 0x28, 0xa6, 0xa7, 0xa1, 0x6e, 0xc7, 0xaf, 0x95, 0xb8, 0xbc, 0x92, 0xdd, 0x47, 0x14, 0xbd, 0x07, 0x07, 0x5a, 0x98, 0xaa, 0xc2, 0x82, 0x5c, 0xed, 0x92, 0x88, 0x25, 0x48, 0x9c, 0x53, 0x48, 0x8f, 0xfb, 0xdf, 0xe6, 0x2c, 0xfb, 0x9b, 0xc1, 0xab, 0x88, 0x10, 0x4f, 0x7d, 0xe6, 0xc4, 0x0d, 0xf5, 0xa2, 0x5e, 0x16, 0x97, 0xc8, 0x0a, 0xf4, 0x92, 0x56, 0x1f, 0xb6, 0x8b, 0xf1, 0x00, 0x42, 0x9c, 0xd7, 0x40, 0xed, 0x9d, 0x15, 0x09, 0x49, 0xa2, 0xfa, 0xbe, 0x3e, 0xc4, 0xcb, 0xdf, 0x5d, 0x25, 0xb8, 0x2d, 0x70, 0x2e, 0x0f, 0x0f, 0x56, 0x1b, 0xb0, 0x35, 0x0e, 0xba, 0xc1, 0x7b, 0x11, 0x6f, 0xa2, 0x10, 0xe5, 0x7c, 0x23, 0xd7, 0xef, 0x7f, 0xf5, 0x0d, 0x89, 0x3c, 0x5f, 0x2d, 0x54, 0x9d, 0x32, 0x10, 0xcf, 0xf7, 0xff, 0x59, 0x29, 0x8f, 0x87, 0x10, 0x54, 0x5d, 0x73, 0x8d, 0x5b, 0x10, 0x46, 0x98, 0xf5, 0x52, 0x8f, 0xce, 0x5a, 0x4c, 0x63, 0x47, 0x55, 0x6d, 0x0a, 0x75, 0x9b, 0x67, 0xf9, 0x4f, 0x5b, 0x7b, 0x00, 0xaf, 0x16, 0xf7, 0xc5, 0xf9, 0xb1, 0xfd, 0x71, 0xfe, 0xc9, 0x85, 0xa9, 0x20, 0x46, 0xa5, 0xc0, 0xb6, 0x33, 0x11, 0x2b, 0xb2, 0xcd, 0xde, 0x35, 0x81, 0xd9, 0x8b, 0xf4, 0x32, 0x3b, 0x41, 0x7b, 0xdb, 0xc5, 0x5a, 0x51, 0x38, 0x4d, 0x21, 0x22, 0x96, 0x02, 0xd8, 0xb5, 0xef, 0x00, 0x00, 0x1e, 0x57, 0x21, 0xd4, 0x35, 0x96, 0x16, 0x17, 0x46, 0x17, 0xb7, 0x0f, 0x0a, 0x01, 0x98, 0xd2, 0xd6, 0xa3, 0xdd, 0xc0, 0x13, 0x15, 0x4f, 0x51, 0xee, 0x1c, 0xaf, 0x11, 0x50, 0x4f, 0x4a, 0xe8, 0x11, 0x78, 0xcd, 0x9f, 0x69, 0x3d, 0x5b, 0xa0, 0xa7, 0x00, 0xdd, 0xfd, 0x25, 0x03, 0x99, 0xb4, 0x7b, 0xd0, 0x07, 0x32, 0xf3, 0xd8, 0xdf, 0x15, 0x3d, 0x5a, 0x77, 0x36, 0x64, 0x86, 0x4c, 0xe7, 0x01, 0xe3, 0xde, 0x79, 0xaf, 0xee, 0xc2, 0x02, 0xbe, 0x04, 0xf2, 0x5c, 0x2c, 0x81, 0x67, 0x71, 0xd0, 0x2a, 0xea, 0xb6, 0xd9, 0xc8, 0x27, 0xf6, 0x77, 0x16, 0x03, 0x51, 0xd8, 0xdd, 0x2f, 0x84, 0x56, 0x5e, 0xfd, 0x6b, 0xef, 0xf0, 0x73, 0xc4, 0xf5, 0xea, 0x9f, 0x35, 0x06, 0xc3, 0x29, 0x91, 0x3f, 0x78, 0x2f, 0x57, 0xad, 0x2e, 0x4c, 0x7b, 0x04, 0x19, 0xfa, 0x69, 0x94, 0x9c, 0x1b, 0x48, 0x78, 0xb2, 0xd2, 0x7b, 0x11, 0x8c, 0x97, 0x6e, 0xb3, 0x7c, 0x8b, 0x8f, 0x9d, 0x11, 0x08, 0x9a, 0x2f, 0x84, 0x7d, 0x1a, 0x57, 0x52, 0x79, 0x2d, 0x4d, 0x2b, 0x05, 0x87, 0x80, 0x0b, 0x37, 0xb9, 0xd0, 0xa7, 0x04, 0xb3, 0xfd, 0x0a, 0x56, 0x88, 0x5f, 0x80, 0x5e, 0x72, 0xd8, 0xb3, 0x2c, 0x16, 0x08, 0x14, 0x7d, 0x09, 0xbf, 0x7c, 0xd4, 0x92, 0xb8, 0x13, 0xcc, 0xb2, 0x84, 0x72, 0xac, 0x61, 0xc4, 0x04, 0x3c, 0x1b, 0x9b, 0xb2, 0xd7, 0x9b, 0x63, 0xbf, 0xc2, 0xe7, 0x9f, 0xf0, 0xbc, 0x8c, 0x31, 0xf1, 0xd6, 0x2b, 0xce, 0xf4, 0x85, 0x34, 0xae, 0x9b, 0xf6, 0xf2, 0x88, 0x18, 0xa1, 0xc8, 0xbd, 0x93, 0x21, 0xba, 0xd4, 0xcb, 0x43, 0x2e, 0x26, 0x01, 0x5d, 0xf4, 0xda, 0x12, 0xe1, 0x85, 0x14, 0xe3, 0x31, 0x88, 0x6a, 0x01, 0xb5, 0x9b, 0x98, 0x89, 0x2c, 0x4f, 0x74, 0x46, 0x3f, 0x74, 0x24, 0x1a, 0x5c, 0x98, 0x8e, 0x9f, 0xc1, 0xca, 0x10, 0x0d, 0xd7, 0xa4, 0x71, 0x5f, 0xc2, 0x88, 0x18, 0xb1, 0x36, 0x29, 0x7c, 0xed, 0x8c, 0x4d, 0xdc, 0xa6, 0x15, 0xd2, 0x30, 0x44, 0xae, 0xef, 0x5f, 0x62, 0x94, 0xbd, 0xb2, 0x74, 0x7a, 0xf6, 0x89, 0xad, 0xd9, 0xfc, 0x4d, 0x20, 0x88, 0x1d, 0xa5, 0x25, 0x8c, 0x15, 0xed, 0xfe, 0x31, 0xd4, 0xe4, 0xba, 0x5a, 0x82, 0xa4, 0x5a, 0x15, 0xc1, 0xd8, 0x33, 0x72, 0x32, 0x29, 0x93, 0x96, 0x3a, 0xf9, 0xa7, 0x0b, 0x06, 0x54, 0x9c, 0x5a, 0xcc, 0x23, 0x05, 0xdc, 0x54, 0xa3, 0x7d, 0xcd, 0xb8, 0x16, 0x8d, 0xa2, 0x68, 0xb9, 0xd0, 0x9c, 0x70, 0xf5, 0x54, 0x9e, 0xfe, 0xd9, 0x44, 0x3c, 0x1e, 0xc8, 0xc4, 0x14, 0xc9, 0x6f, 0x1d, 0x61, 0x1e, 0xfa, 0x1a, 0xcd, 0xef, 0x88, 0xb2, 0x87, 0x7f, 0xdc, 0xe6, 0x96, 0x8a, 0x55, 0xed, 0x6d, 0x86, 0x20, 0x8f, 0xbf, 0x29, 0xac, 0xcf, 0x94, 0x2b, 0x5e, 0xcc, 0x9d, 0x4d, 0x87, 0xe9, 0xc4, 0x9a, 0x93, 0x2c, 0x08, 0xed, 0x83, 0xe4, 0x88, 0xb3, 0x9d, 0x8f, 0xdd, 0xf2, 0x61, 0xfa, 0xad, 0x8b, 0xc0, 0xaa, 0x7d, 0xbc, 0x89, 0x7b, 0xc7, 0xe8, 0x24, 0x87, 0x4d, 0x9b, 0x82, 0x49, 0xac, 0xc9, 0x54, 0x03, 0x34, 0x56, 0x7b, 0x5c, 0xf7, 0xdb, 0xc0, 0x4e, 0x20, 0xa8, 0xc6, 0x3f, 0x87, 0x05, 0x3c, 0x6e, 0x82, 0xbe, 0x57, 0x91, 0xfd, 0xde, 0x80, 0xbd, 0xcd, 0xba, 0x4a, 0x85, 0x41, 0x31, 0xa6, 0x66, 0xfa, 0x33, 0x5a, 0x63, 0xfd, 0x80, 0xaf, 0xec, 0x07, 0xb2, 0x6a, 0x04, 0x21, 0x7e, 0xfe, 0xa3, 0x73, 0x37, 0x00, 0x59, 0x5d, 0x93, 0xdb, 0x35, 0xc4, 0xb2, 0xc5, 0xe5, 0xaa, 0x5c, 0xf2, 0x1e, 0x02, 0x8b, 0x07, 0x3f, 0xc2, 0x29, 0xd1, 0x31, 0x39, 0x1a, 0x37, 0x91, 0xa3, 0x7d, 0x6d, 0x11, 0xfb, 0x2f, 0x6b, 0x1b, 0x10, 0x91, 0x9e, 0xb8, 0xdb, 0x8c, 0xdd, 0xb1, 0x10, 0xd2, 0x9e, 0xf4, 0xf3, 0x66, 0x6a, 0x38, 0x6d, 0x5e, 0x8e, 0xe4, 0x5f, 0xe8, 0x14, 0x2d, 0x36, 0x8b, 0xf1, 0x7f, 0xc0, 0xaf, 0x80, 0x1f, 0x3e, 0x60, 0x2f, 0x0e, 0xba, 0x4f, 0x79, 0x30, 0x9a, 0x19, 0x14, 0xad, 0x76, 0xcc, 0x6b, 0x98, 0x27, 0xa8, 0x4e, 0xcf, 0x20, 0x22, 0xe8, 0x22, 0x02, 0x2f, 0xf2, 0xb7, 0x6a, 0xbe, 0x27, 0xac, 0x0d, 0x86, 0xf8, 0xff, 0x08, 0x03, 0x80, 0xab, 0x71, 0xbb, 0xba, 0x14, 0x32, 0xc6, 0xf2, 0xa5, 0x17, 0x8d, 0x79, 0xb8, 0x25, 0xd2, 0x9d, 0xb6, 0x2e, 0xf1, 0xd8, 0x7f, 0xa2, 0x65, 0x48, 0x0c, 0xa8, 0x8d, 0x5f, 0x53, 0x6d, 0xb0, 0xdc, 0x6a, 0xbc, 0x40, 0xfa, 0xf0, 0xd0, 0x5b, 0xe7, 0xa9, 0x66, 0x97, 0x77, 0x68, 0x16, 0xff, 0x1a, 0x32, 0xe2, 0x59, 0x0c, 0xa0, 0x10, 0xab, 0xcb, 0x85, 0x35, 0xfd, 0xce, 0xd1, 0x93, 0x5f, 0x74, 0xb5, 0xa4, 0x2e, 0x3b, 0x08, 0xf7, 0x94, 0x32, 0xea, 0x3b, 0x4e, 0xb1, 0xa7, 0x9a, 0xb2, 0x47, 0xde, 0x48, 0xf0, 0xf4, 0xe2, 0x5b, 0x98, 0x98, 0x60, 0xdd, 0x5c, 0xac, 0x42, 0x1f, 0x18, 0x30, 0xd4, 0x51, 0x0f, 0xe4, 0x25, 0x50, 0x77, 0xbb, 0xb1, 0xbf, 0x39, 0x8d, 0x3c, 0x59, 0xf2, 0x0c, 0x01, 0x85, 0x3d, 0xf9, 0x0c, 0x2b, 0x34, 0x98, 0xe5, 0xc7, 0x34, 0x61, 0x6e, 0xbc, 0xe1, 0xf8, 0x0e, 0xea, 0x6a, 0x5f, 0x0f, 0x82, 0x0f, 0x6b, 0x45, 0x19, 0xe0, 0x74, 0xf1, 0xfc, 0xc7, 0x51, 0xe4, 0xc4, 0xc8, 0x83, 0xe8, 0x2a, 0x88, 0xb1, 0x5b, 0x1c, 0x0c, 0x55, 0x1d, 0x10, 0xc4, 0xb4, 0xad, 0x98, 0xc8, 0x13, 0x8e, 0x36, 0x61, 0x28, 0xf0, 0x72, 0xcb, 0xcf, 0x8c, 0x2b, 0x39, 0xfe, 0xd0, 0x2b, 0x1a, 0xfb, 0x3c, 0xfe, 0x9b, 0xcc, 0x0c, 0x03, 0x6d, 0xf0, 0x17, 0xc3, 0xc8, 0x4c, 0xf7, 0x82, 0xb0, 0x68, 0x6a, 0x14, 0x77, 0xdb, 0xf8, 0xf2, 0x83, 0x04, 0xd6, 0x8d, 0x51, 0xfb, 0x0b, 0xe2, 0xba, 0xc7, 0xd1, 0x4f, 0x75, 0xd2, 0x3e, 0xa5, 0xde, 0x9a, 0x23, 0x7e, 0xf5, 0xa8, 0x35, 0xd1, 0xaa, 0xc6, 0x6a, 0xc3, 0x58, 0x6d, 0xa6, 0xc0, 0x8f, 0x7d, 0x97, 0xcb, 0x16, 0x30, 0xdd, 0x12, 0x30, 0x51, 0x6f, 0xc6, 0x1f, 0xa9, 0x3a, 0x29, 0xe7, 0xbb, 0x0b, 0xe9, 0x54, 0xb1, 0xae, 0xac, 0x3e, 0x95, 0x58, 0xec, 0x0c, 0xc4, 0x42, 0x05, 0x77, 0xa0, 0x97, 0x8c, 0x91, 0x86, 0x90, 0xe3, 0x05, 0x00, 0xdd, 0x0a, 0xa0, 0x3b, 0x48, 0xb8, 0x10, 0xbb, 0x95, 0xab, 0xec, 0x4d, 0xac, 0x3c, 0xf5, 0x3d, 0xfa, 0x36, 0x9c, 0xca, 0x14, 0xe8, 0xc4, 0xd7, 0x9d, 0x79, 0xc8, 0xe3, 0x6b, 0x7c, 0xc0, 0x3b, 0xe5, 0xc4, 0x00, 0x6e, 0xaf, 0x7a, 0xe2, 0x02, 0x8a, 0x6c, 0xc6, 0x65, 0x75, 0xa8, 0x56, 0x26, 0x18, 0x4a, 0x0f, 0x65, 0x63, 0x92, 0xfd, 0x89, 0x73, 0x3a, 0xc5, 0x31, 0xb5, 0x06, 0xe9, 0x6c, 0x4d, 0x9c, 0x48, 0x2c, 0xb9, 0x96, 0xe4, 0xf8, 0xb1, 0xd6, 0xe8, 0xe2, 0x52, 0x19, 0xea, 0xb9, 0x7c, 0xcf, 0x6d, 0x7f, 0x79, 0x2b, 0xaa, 0x1d, 0xdf, 0x76, 0x90, 0x56, 0xb7, 0xa8, 0x09, 0xfa, 0xde, 0x39, 0x7f, 0x5c, 0xac, 0x35, 0x9f, 0x05, 0xd4, 0x8f, 0x5c, 0xaa, 0x8b, 0xb7, 0x37, 0x5c, 0xed, 0x6e, 0xbe, 0xff, 0x9c, 0xda, 0x53, 0xfd, 0xaa, 0xd5, 0x2f, 0x3c, 0xb9, 0x8b, 0xa7, 0x4d, 0x60, 0x44, 0xad, 0xe6, 0xd1, 0x7e, 0x99, 0x92, 0xb9, 0x3f, 0x2a, 0xa7, 0x68, 0xa9, 0xc7, 0x78, 0x32, 0xcf, 0x0b, 0xcd, 0x15, 0xc7, 0x81, 0x90, 0x9c, 0x01, 0xac, 0xc9, 0x02, 0xd6, 0x4b, 0xcd, 0x9b, 0x64, 0xda, 0xb1, 0x70, 0x9a, 0x5c, 0x05, 0x29, 0x8f, 0x58, 0xbf, 0x31, 0x18, 0x22, 0x76, 0x14, 0x99, 0x5b, 0xd1, 0x2c, 0x1b, 0xbb, 0x3e, 0x7c, 0x9f, 0x0e, 0xe7, 0xdc, 0xb2, 0x7d, 0xe2, 0x57, 0x42, 0x0f, 0xa7, 0xd1, 0xb0, 0x70, 0xc8, 0xec, 0x26, 0xf0, 0xdc, 0x2d, 0x2b, 0xce, 0xbc, 0x5b, 0x75, 0xb7, 0xf3, 0x28, 0xfe, 0x8a, 0x6f, 0x14, 0x5a, 0x5e, 0x7d, 0x8d, 0x47, 0xc6, 0xf4, 0x5b, 0x86, 0x54, 0xaf, 0x3b, 0xe9, 0x5b, 0x41, 0xca, 0xae, 0xf9, 0xe5, 0xa5, 0x0b, 0x55, 0xb4, 0xcf, 0x0a, 0x26, 0x1b, 0x53, 0x97, 0x75, 0x8b, 0x2a, 0xd7, 0xa3, 0x72, 0x5e, 0xbc, 0xad, 0x6b, 0x70, 0xd7, 0xaf, 0xb1, 0xf8, 0x6d, 0xa7, 0xda, 0x8b, 0xcc, 0x7c, 0xc2, 0xe1, 0xdf, 0x3f, 0xc5, 0x37, 0x01, 0xb0, 0x31, 0xf3, 0x0f, 0x04, 0xfa, 0x87, 0xc1, 0xe5, 0xb0, 0x97, 0x3a, 0xbb, 0xaf, 0x5e, 0xdd, 0x2a, 0x96, 0x4e, 0x63, 0xdb, 0xfa, 0xf6, 0x2a, 0x80, 0x5b, 0x29, 0xd0, 0x12, 0x56, 0x5d, 0x01, 0x5d, 0x1d, 0x51, 0x8d, 0xbf, 0x25, 0xf3, 0xbe, 0x2d, 0x1e, 0x80, 0xe8, 0x76, 0x28, 0xed, 0x41, 0xcc, 0x44, 0x86, 0xf3, 0x80, 0x08, 0xd5, 0x70, 0x0d, 0x98, 0xc5, 0x06, 0x58, 0xd1, 0x07, 0xb3, 0x36, 0xc7, 0xb5, 0x3a, 0x2f, 0x72, 0x35, 0x76, 0x82, 0xa4, 0x61, 0xef, 0x68, 0x3e, 0xe4, 0xab, 0x9d, 0xa4, 0xe7, 0x47, 0x1d, 0x6e, 0xee, 0x46, 0x2b, 0x61, 0xfc, 0xa8, 0x98, 0x9d, 0xfe, 0xbe, 0x42, 0x17, 0x66, 0x3e, 0xdb, 0x4a, 0x17, 0x93, 0xec, 0x2a, 0x81, 0x76, 0x19, 0x5a, 0x0d, 0xc2, 0xa6, 0x9e, 0xbb, 0x84, 0x3a, 0x93, 0x09, 0x52, 0xe3, 0x9e, 0x18, 0xdf, 0x5b, 0x22, 0x0a, 0xcc, 0x8a, 0xf6, 0xae, 0xc0, 0x4b, 0x16, 0x5f, 0xba, 0x73, 0x98, 0x29, 0xa6, 0x10, 0xe2, 0x2e, 0x2f, 0xee, 0x1b, 0x48, 0xd5, 0x60, 0xdf, 0xf0, 0x3f, 0x3c, 0x37, 0x5f, 0xd2, 0x28, 0xc8, 0xf2, 0x82, 0x14, 0x4a, 0xd3, 0xe8, 0x08, 0x3c, 0xd6, 0x95, 0x20, 0xd6, 0xa1, 0xa7, 0xd5, 0x40, 0x10, 0x9a, 0x7d, 0x01, 0xd8, 0x60, 0x15, 0xba, 0x6a, 0xb3, 0x3f, 0x14, 0x1a, 0xaa, 0x87, 0xf7, 0x80, 0x8a, 0xea, 0xfd, 0x1e, 0xdf, 0x99, 0x26, 0x44, 0xcc, 0xfa, 0xcd, 0x31, 0xa0, 0xf0, 0xda, 0x7b, 0xa9, 0x5c, 0x3a, 0xb1, 0x4d, 0xe4, 0x8c, 0x3e, 0x56, 0xf3, 0x1d, 0x90, 0x8e, 0x00, 0x17, 0x7a, 0x8c, 0x14, 0xf5, 0xd7, 0xcd, 0x86, 0x3a, 0x71, 0x07, 0x09, 0x63, 0x21, 0xb9, 0xea, 0x1a, 0x37, 0x07, 0x92, 0xac, 0x1b, 0xc5, 0x52, 0xbd, 0x35, 0xd2, 0x60, 0x3b, 0x0b, 0xa7, 0x1c, 0x90, 0xa9, 0x2f, 0x98, 0x1c, 0x46, 0xda, 0x58, 0xe2, 0x24, 0xed, 0x56, 0x81, 0xb8, 0x1c, 0x49, 0x67, 0x0b, 0x5a, 0x27, 0x41, 0x60, 0xf0, 0xe9, 0xb5, 0x17, 0xcc, 0x8e, 0x54, 0xd1, 0x1c, 0x62, 0xca, 0xd5, 0x1c, 0x80, 0x58, 0xb3, 0x2c, 0x96, 0x85, 0x27, 0x26, 0xe8, 0x10, 0x3f, 0xee, 0x98, 0x28, 0xc0, 0x4b, 0x24, 0xdf, 0xc7, 0xf5, 0x30, 0xdd, 0xac, 0xef, 0x86, 0x51, 0x2b, 0x16, 0x5b, 0x2e, 0xc6, 0xfb, 0xd4, 0x93, 0x65, 0xee, 0xc8, 0x8a, 0x40, 0x5b, 0xc8, 0xf6, 0xfe, 0x5a, 0x5c, 0xc7, 0x1e, 0x81, 0x90, 0x70, 0x97, 0xfc, 0xaf, 0x9b, 0xbb, 0xe0, 0x4f, 0x1b, 0x61, 0xbd, 0x8d, 0x22, 0x43, 0x73, 0x9a, 0xb4, 0xa5, 0x46, 0x77, 0x5b, 0x38, 0x34, 0xfc, 0x1d, 0x3d, 0x85, 0x1f, 0xab, 0xed, 0xa5, 0x73, 0xdb, 0x19, 0x2f, 0xef, 0x58, 0x0e, 0x4a, 0xf1, 0x98, 0xbb, 0x38, 0x82, 0x0f, 0x16, 0x2c, 0xdc, 0xa3, 0xbb, 0x5c, 0x2a, 0x5f, 0xd6, 0x58, 0x8e, 0x6b, 0x44, 0x9a, 0x68, 0x3c, 0xf5, 0x5e, 0xd6, 0x08, 0x95, 0xb4, 0x77, 0x7d, 0x6b, 0xd3, 0x75, 0xb2, 0x81, 0xb0, 0xc2, 0x5e, 0x05, 0xcf, 0xa1, 0x48, 0xef, 0x59, 0x69, 0xfe, 0xe4, 0x70, 0x85, 0xca, 0x5a, 0xbf, 0xc0, 0xe2, 0xfe, 0x55, 0xc0, 0xdf, 0x52, 0xb3, 0xcf, 0x70, 0x9b, 0x23, 0xe2, 0x50, 0xfa, 0x4c, 0xd3, 0x75, 0xd9, 0x04, 0xf2, 0x8b, 0x88, 0x65, 0xbc, 0xa0, 0x28, 0x23, 0xea, 0x21, 0xc9, 0x1c, 0xae, 0x05, 0xcf, 0x31, 0x39, 0x48, 0x9a, 0x55, 0x80, 0x9b, 0x66, 0xe3, 0x40, 0x5a, 0x6f, 0x35, 0x3f, 0xbe, 0x59, 0x72, 0xd6, 0x54, 0xd0, 0xa7, 0xac, 0xad, 0x6c, 0x1a, 0xc4, 0x57, 0xd7, 0xdb, 0xba, 0x0d, 0x31, 0x9b, 0x49, 0x2b, 0xb3, 0xc1, 0x11, 0x65, 0x93, 0xbb, 0x97, 0xb7, 0x28, 0x92, 0x8e, 0x9f, 0x4f, 0xc2, 0x55, 0x8b, 0x0d, 0x48, 0xc0, 0x8d, 0x76, 0xfc, 0x1b, 0x56, 0xcd, 0x21, 0x6c, 0x62, 0xec, 0x3b, 0xf9, 0x70, 0xe6, 0x20, 0x0a, 0x35, 0xec, 0x52, 0xf0, 0x51, 0x6d, 0x8c, 0x46, 0x82, 0x81, 0x9b, 0x77, 0x18, 0x88, 0x6f, 0x81, 0xa9, 0x0e, 0x72, 0xf8, 0x05, 0xf3, 0x19, 0x4d, 0x6c, 0xc8, 0xb8, 0x50, 0xff, 0x7b, 0x9a, 0xf4, 0x75, 0x37, 0x51, 0x52, 0x0f, 0x86, 0x4b, 0xf1, 0xce, 0xb9, 0xa6, 0x45, 0xe3, 0x89, 0x45, 0x75, 0x67, 0xfe, 0x24, 0x62, 0x4c, 0x90, 0xe8, 0xe4, 0x94, 0x8d, 0xbb, 0x56, 0xc0, 0xba, 0x56, 0x56, 0x8c, 0x3d, 0x5f, 0xc6, 0xd9, 0xba, 0xf6, 0x16, 0xeb, 0xbd, 0x8b, 0xc6, 0xd4, 0x58, 0xf2, 0x26, 0x30, 0x0d, 0xb9, 0x61, 0x13, 0xed, 0xb9, 0xb9, 0x40, 0x02, 0xeb, 0x14, 0x9c, 0xeb, 0x7d, 0xb8, 0xe2, 0xc6, 0x25, 0x53, 0x97, 0x53, 0xb6, 0x3e, 0x41, 0x55, 0xf1, 0x02, 0xd4, 0x3c, 0x9d, 0x1c, 0x6d, 0x02, 0xda, 0xfd, 0x42, 0x53, 0xb2, 0x55, 0xd9, 0xf0, 0xf1, 0x91, 0x79, 0x55, 0x36, 0xa2, 0xdf, 0x9a, 0x4b, 0x01, 0x31, 0x97, 0xb2, 0xf0, 0x38, 0x4b, 0x80, 0x02, 0xc9, 0x7f, 0x6f, 0xdd, 0x84, 0xa6, 0x2e, 0x3f, 0xc2, 0x08, 0xfb, 0x3f, 0xc8, 0x1f, 0x74, 0xd6, 0x41, 0x41, 0xaa, 0x9d, 0xeb, 0x80, 0x78, 0xd8, 0x90, 0xcf, 0x13, 0xb4, 0x38, 0x66, 0xe1, 0xcd, 0x9d, 0x67, 0x8f, 0xf3, 0xdf, 0xc1, 0x5e, 0x2e, 0x79, 0x54, 0xbd, 0xff, 0x74, 0x57, 0x1d, 0xe9, 0xda, 0xf7, 0x01, 0x30, 0x6e, 0x41, 0x54, 0xe1, 0x9a, 0x42, 0x00, 0x12, 0xa9, 0x6d, 0xbc, 0x6b, 0x36, 0x3d, 0x25, 0xe6, 0xe4, 0x1b, 0x11, 0xd2, 0x50, 0x81, 0x20, 0x1e, 0x44, 0x60, 0x94, 0xd4, 0x2e, 0xbf, 0x62, 0xe4, 0xd0, 0xa5, 0x88, 0x23, 0x38, 0x3a, 0xa2, 0x93, 0xf3, 0x29, 0xb8, 0xe5, 0x7e, 0x48, 0x5b, 0x3c, 0xfd, 0x7b, 0xf0, 0x34, 0x2f, 0xd6, 0x4b, 0x23, 0xa2, 0x01, 0x80, 0x9f, 0x23, 0xe1, 0xf5, 0x40, 0x79, 0x74, 0xbc, 0xa6, 0x53, 0xfd, 0x20, 0xbe, 0x7e, 0x62, 0x7e, 0x42, 0x5b, 0xd2, 0x57, 0x7f, 0x91, 0xaa, 0xa2, 0x5b, 0xff, 0x9a, 0x67, 0x96, 0xf5, 0x04, 0x89, 0x50, 0xa3, 0xa4, 0xe4, 0xcc, 0xd1, 0x76, 0x97, 0x73, 0xd1, 0xd4, 0xa3, 0x1c, 0xb2, 0xdf, 0xb6, 0x8a, 0xb7, 0x21, 0x41, 0x36, 0x07, 0x71, 0xd0, 0x4f, 0xa6, 0x16, 0x9b, 0x00, 0xa4, 0x2f, 0x58, 0xf1, 0x95, 0x52, 0x54, 0x10, 0x41, 0x73, 0xc2, 0x91, 0x9c, 0x07, 0x53, 0x33, 0xf8, 0x6a, 0x07, 0xc6, 0x79, 0x7e, 0x42, 0xea, 0xc9, 0x96, 0x22, 0x19, 0x0e, 0x92, 0x10, 0xe8, 0x19, 0x4b, 0x95, 0x89, 0xe0, 0x31, 0x6f, 0x95, 0x2f, 0x32, 0xe5, 0x08, 0x9a, 0xde, 0x57, 0x8e, 0xb6, 0xc9, 0x19, 0xfd, 0x89, 0x31, 0x82, 0x22, 0x3e, 0xe1, 0x3f, 0xc0, 0x1d, 0x55, 0xed, 0xd6, 0xbb, 0x1f, 0xe8, 0x21, 0x6e, 0x8a, 0x5d, 0xe2, 0x04, 0x7c, 0xa7, 0xe1, 0xb5, 0xa1, 0xd8, 0xb2, 0x55, 0xc5, 0x95, 0x37, 0xcf, 0x82, 0x28, 0x66, 0xce, 0x1c, 0xd0, 0x4c, 0xbd, 0xa9, 0x5b, 0x52, 0xf2, 0x75, 0xf7, 0xc0, 0x26, 0xa4, 0x46, 0x7f, 0x29, 0x19, 0xb0, 0x23, 0xd3, 0x97, 0xfd, 0x29, 0x3e, 0x26, 0x23, 0x7c, 0x32, 0xb9, 0x5c, 0x3e, 0xe1, 0x0d, 0x7c, 0xc6, 0xd5, 0xd4, 0x82, 0xe5, 0x26, 0x13, 0x6d, 0x6e, 0xf0, 0xc9, 0x51, 0xf5, 0x04, 0xd1, 0xa9, 0xd6, 0xde, 0x09, 0xef, 0x7a, 0xd8, 0xb4, 0x6a, 0xd5, 0x9d, 0x1d, 0x48, 0x33, 0xdf, 0x7e, 0xec, 0x35, 0x4d, 0x1f, 0x89, 0x16, 0xbf, 0xc2, 0xf0, 0x33, 0xb4, 0x3f, 0xa6, 0xcb, 0xff, 0x6c, 0x3a, 0x03, 0xbd, 0x3f, 0xd5, 0x2d, 0x8a, 0x37, 0x13, 0x49, 0xf5, 0xf7, 0x11, 0xcc, 0x31, 0x35, 0xc8, 0xa1, 0x0d, 0xd2, 0x99, 0x6e, 0x25, 0x4a, 0x28, 0x18, 0x5a, 0x4f, 0x6e, 0x89, 0x81, 0xb1, 0x0a, 0xb1, 0x58, 0x81, 0xd8, 0xca, 0xbe, 0x76, 0xc5, 0xe1, 0x23, 0x8f, 0xe2, 0x92, 0x3d, 0xfa, 0xb7, 0x13, 0xfc, 0x35, 0xd9, 0x74, 0xc1, 0x73, 0xbf, 0x24, 0xcb, 0x41, 0xd1, 0xb8, 0xf1, 0x69, 0xc2, 0xe8, 0x97, 0x17, 0x20, 0xda, 0xdb, 0x3a, 0x29, 0xa4, 0x0f, 0x2d, 0xe1, 0x0c, 0x6c, 0x97, 0x61, 0x91, 0x04, 0x90, 0x72, 0xb0, 0xf9, 0x05, 0x5a, 0x60, 0xed, 0x5d, 0xf6, 0xdf, 0xb9, 0x5c, 0x09, 0xb0, 0x62, 0x48, 0xd4, 0xe5, 0x49, 0x4b, 0xe7, 0x9a, 0xa1, 0x19, 0x36, 0xc2, 0x26, 0xd2, 0x6f, 0x26, 0x0c, 0x2a, 0x8b, 0xaa, 0x36, 0xc7, 0xa4, 0xd2, 0xa9, 0xeb, 0x06, 0x86, 0x40, 0x52, 0x88, 0x12, 0xa1, 0x5e, 0x1d, 0x71, 0x6f, 0x71, 0xa6, 0xcb, 0xc2, 0x9a, 0x0a, 0x3c, 0xd4, 0x75, 0x89, 0xd7, 0xfd, 0x4c, 0x4d, 0xeb, 0xe1, 0x82, 0x42, 0x84, 0xe8, 0x32, 0x28, 0x35, 0xee, 0x13, 0xe7, 0x15, 0x3c, 0x9f, 0x22, 0x08, 0xb7, 0x74, 0x0e, 0x40, 0x58, 0xfa, 0x85, 0x03, 0xdc, 0x46, 0x56, 0xae, 0xbd, 0x3e, 0xe0, 0xfa, 0x60, 0xfe, 0xdf, 0x7e, 0x90, 0x7b, 0x85, 0x75, 0x2b, 0x66, 0xcd, 0xc2, 0x1b, 0x54, 0x0c, 0x31, 0x88, 0x1b, 0xc8, 0x00, 0x4c, 0x7f, 0xce, 0x9e, 0xa8, 0x0e, 0x7f, 0xb2, 0x35, 0x48, 0x6b, 0x5f, 0x1d, 0x03, 0x21, 0xc6, 0x8a, 0x0e, 0x44, 0xcd, 0x5f, 0x15, 0xe2, 0x1f, 0x27, 0xc4, 0x02, 0x75, 0x4a, 0x2f, 0x7c, 0x13, 0x87, 0x72, 0x0e, 0x95, 0x9e, 0x94, 0xab, 0xeb, 0x4d, 0xb2, 0x16, 0xa3, 0x7e, 0x59, 0xb0, 0x66, 0xbf, 0x33, 0x8f, 0xc6, 0xf2, 0xe6, 0xcf, 0x37, 0x46, 0x39, 0x2d, 0x5a, 0x66, 0x79, 0xd1, 0x82, 0xf0, 0x1b, 0x6c, 0x71, 0x28, 0xa2, 0x83, 0x62, 0xee, 0xc3, 0x0b, 0x4d, 0xed, 0xc7, 0x35, 0x66, 0x16, 0x32, 0x8b, 0xe6, 0x4d, 0xa2, 0x3c, 0x0f, 0x61, 0xf9, 0xb4, 0x6a, 0x42, 0xbe, 0x70, 0x54, 0x6e, 0xc1, 0x11, 0xb8, 0xad, 0xfe, 0xaf, 0x1e, 0xfe, 0xc4, 0x6f, 0xe5, 0xd1, 0x17, 0x58, 0xcc, 0x76, 0x52, 0x62, 0xb8, 0xd6, 0x11, 0xd0, 0xb1, 0x61, 0x4d, 0xc0, 0x2d, 0x47, 0xc9, 0x01, 0x91, 0xeb, 0xad, 0x24, 0xf5, 0x95, 0x71, 0xd6, 0x27, 0x66, 0xfd, 0x6d, 0xf3, 0x92, 0x0f, 0xc0, 0xa2, 0xc9, 0xdc, 0x3c, 0xc1, 0xf6, 0xfa, 0x34, 0x24, 0x2c, 0x7d, 0x79, 0x2a, 0xdd, 0x61, 0x2b, 0x41, 0x4e, 0x28, 0xce, 0xad, 0x47, 0xc3, 0xa0, 0x86, 0x0f, 0xb6, 0x2a, 0x00, 0x98, 0x78, 0x16, 0xf0, 0xf6, 0x18, 0x40, 0x8b, 0x15, 0x26, 0x10, 0x70, 0xac, 0xd1, 0x06, 0xe9, 0x6d, 0x4d, 0x96, 0x6d, 0x7f, 0x78, 0x37, 0x6a, 0x2d, 0xbc, 0xb7, 0x42, 0xe0, 0x37, 0xd1, 0x93, 0x4a, 0x19, 0x01, 0xbc, 0xe5, 0x4e, 0x97, 0x9d, 0x9c, 0x5e, 0x0b, 0x9e, 0xc7, 0x91, 0x90, 0xf2, 0x5d, 0x56, 0xeb, 0x1d, 0x65, 0xe5, 0x86, 0xb3, 0xae, 0x24, 0xc0, 0x63, 0xc0, 0xc7, 0x88, 0x35, 0x12, 0xbc, 0x2a, 0x10, 0x7e, 0xc6, 0x68, 0x7f, 0xf1, 0x68, 0xcd, 0xb4, 0x67, 0x04, 0x3e, 0xce, 0x17, 0x44, 0xd2, 0x57, 0xea, 0xb9, 0xe4, 0x11, 0x32, 0xc2, 0x66, 0xf2, 0x99, 0xb0, 0x77, 0x6d, 0x57, 0x27, 0x38, 0xf3, 0xa9, 0xc7, 0xdc, 0xba, 0x7e, 0x0c, 0xff, 0xbd, 0x73, 0x73, 0x39, 0x04, 0x01, 0xdf, 0xf2, 0x25, 0xf5, 0x3a, 0x78, 0x0b, 0x21, 0x5f, 0x4e, 0xf6, 0x52, 0x38, 0xc8, 0xc3, 0x82, 0x23, 0xd4, 0x6e, 0x4e, 0x9b, 0x1b, 0xd5, 0xaa, 0x14, 0x49, 0xbe, 0xd3, 0x26, 0xa8, 0x1c, 0x85, 0xee, 0xf4, 0x8e, 0x6f, 0xb2, 0x6b, 0x29, 0xe4, 0xc3, 0x23, 0x77, 0xd3, 0xa8, 0xa0, 0xbf, 0xf9, 0x78, 0xa6, 0x87, 0x55, 0x88, 0x4c, 0x58, 0xdc, 0x46, 0x52, 0xc1, 0x6f, 0x65, 0xb4, 0x9e, 0x0a, 0x3b, 0x7f, 0x9b, 0x3e, 0x67, 0xe4, 0xf3, 0xe1, 0xb6, 0x8b, 0x7e, 0x04, 0x48, 0x2a, 0xea, 0x25, 0xee, 0x55, 0x48, 0xa6, 0xd7, 0x98, 0xcb, 0x7e, 0x6c, 0xc3, 0xcd, 0x2f, 0x78, 0x85, 0x13, 0xf8, 0x8c, 0x3c, 0x52, 0x4b, 0xa2, 0x0c, 0xf2, 0x81, 0x00, 0x2e, 0x11, 0xcd, 0x5f, 0x8b, 0xcb, 0x6e, 0x4d, 0x8a, 0xb9, 0x29, 0xd0, 0x26, 0xb7, 0xf7, 0x4c, 0x43, 0xeb, 0xfb, 0xa6, 0x42, 0x03, 0xb6, 0xaa, 0xd3, 0xbd, 0x7e, 0xaa, 0x0a, 0xad, 0x2c, 0x68, 0xb6, 0x3b, 0x16, 0x37, 0xee, 0xeb, 0x3d, 0x5c, 0xec, 0xe1, 0xc7, 0xba, 0x1f, 0xa4, 0xaf, 0xaf, 0x7b, 0x22, 0xbb, 0x39, 0x14, 0xf4, 0xae, 0x5d, 0xeb, 0xe4, 0xbf, 0xc9, 0x07, 0xac, 0x4b, 0xb8, 0xc8, 0x01, 0xc7, 0x16, 0x79, 0xd0, 0xf8, 0xe4, 0x24, 0xc8, 0x66, 0xdf, 0xaa, 0x18, 0x0e, 0x5c, 0x12, 0x7a, 0x57, 0x77, 0x22, 0x70, 0x47, 0x6c, 0x2c, 0xcd, 0xf7, 0x45, 0x2b, 0x78, 0x44, 0xb6, 0x0f, 0x6d, 0xc8, 0x45, 0x54, 0x04, 0x09, 0xad, 0xd9, 0x76, 0xef, 0x85, 0xf0, 0x9d, 0x7c, 0x1d, 0xb1, 0xfb, 0xb7, 0xa9, 0x95, 0xfe, 0xe9, 0xa1, 0x40, 0x82, 0x0c, 0x67, 0x9d, 0x98, 0x81, 0x2b, 0x30, 0x86, 0x01, 0x0c, 0xa8, 0x0f, 0xd6, 0x7f, 0xb4, 0xf4, 0x4b, 0xf5, 0x18, 0xba, 0x61, 0xb8, 0x00, 0xae, 0xc3, 0x16, 0x94, 0x27, 0xfc, 0xc2, 0xcc, 0x0b, 0xe8, 0x77, 0x86, 0x94, 0x68, 0xde, 0xd6, 0x54, 0x5a, 0xb2, 0x9d, 0x77, 0xc9, 0x22, 0x5d, 0x49, 0x60, 0x77, 0x4b, 0xf8, 0x25, 0xf6, 0xa6, 0x9a, 0x64, 0x08, 0x48, 0x71, 0xe8, 0x98, 0x7b, 0x6e, 0x71, 0xbd, 0x0d, 0xf5, 0x63, 0x99, 0xa7, 0xe0, 0xbc, 0x81, 0x5a, 0xc6, 0x48, 0x5d, 0x7b, 0x7d, 0x18, 0x52, 0xb1, 0xdd, 0x30, 0x9f, 0x4c, 0xc7, 0x80, 0xc5, 0xd8, 0x66, 0x16, 0xeb, 0xf2, 0xb5, 0x91, 0x80, 0x5b, 0x42, 0xd9, 0x22, 0x4b, 0x31, 0x0d, 0xbf, 0x08, 0x83, 0xbd, 0xfa, 0xb6, 0x99, 0x5a, 0xd0, 0x71, 0xf3, 0xea, 0x7b, 0x99, 0x3e, 0x00, 0x96, 0x6d, 0x8e, 0xec, 0x83, 0xdc, 0xe8, 0x2f, 0x0a, 0x97, 0x03, 0x32, 0x42, 0x6b, 0x4f, 0x37, 0xb5, 0xce, 0x37, 0x8f, 0xbf, 0xb8, 0xa3, 0x0d, 0x37, 0xb4, 0xc2, 0xbc, 0x51, 0x36, 0x06, 0xcd, 0xc3, 0x2f, 0x70, 0xd3, 0x27, 0xdf, 0x0d, 0x33, 0xa1, 0xea, 0xc1, 0xd5, 0xc1, 0xaf, 0x43, 0x20, 0xab, 0xd5, 0x69, 0x26, 0x75, 0x26, 0xa6, 0x1b, 0xd0, 0xa1, 0xd1, 0x0c, 0xeb, 0xca, 0x27, 0xcd, 0x94, 0x45, 0x94, 0x34, 0xa1, 0xa3, 0x2e, 0x84, 0x8e, 0x7c, 0x02, 0x2c, 0x67, 0xbe, 0x14, 0xb2, 0xe8, 0x44, 0xa1, 0xea, 0xe4, 0xab, 0xa7, 0x6b, 0xe3, 0x61, 0xa8, 0x43, 0x0f, 0xfe, 0xaa, 0xea, 0x51, 0xd8, 0x82, 0x75, 0xb7, 0xd1, 0x52, 0x0c, 0x19, 0x74, 0x51, 0x9e, 0xfc, 0x41, 0xca, 0xd3, 0xb6, 0x44, 0x68, 0x43, 0xd3, 0xed, 0xb0, 0xe5, 0xb8, 0x1b, 0xcf, 0xca, 0x86, 0x7a, 0x96, 0x0b, 0x41, 0x0f, 0xc3, 0x00, 0x32, 0x11, 0x82, 0xb2, 0x89, 0xfb, 0x33, 0x93, 0x47, 0xdf, 0x6e, 0x6d, 0x5b, 0xfd, 0x44, 0x99, 0x0b, 0x94, 0xc8, 0x71, 0x96, 0xf8, 0xcf, 0x07, 0x18, 0xe5, 0xf3, 0x18, 0xad, 0x13, 0xde, 0x3b, 0xd9, 0x0a, 0xc5, 0x5e, 0x28, 0x38, 0x32, 0x73, 0x11, 0x41, 0x07, 0x67, 0x20, 0x96, 0xc0, 0x54, 0x55, 0x49, 0xf8, 0xf7, 0xc7, 0x20, 0x2e, 0x64, 0x8c, 0xe8, 0xca, 0xf8, 0xdd, 0x0b, 0x5b, 0x90, 0x76, 0x65, 0x23, 0xf8, 0x3c, 0x54, 0xd5, 0xa7, 0x22, 0x0e, 0x9d, 0xa9, 0x4d, 0x38, 0x61, 0xdc, 0x77, 0xb4, 0x47, 0x5f, 0x91, 0xba, 0x77, 0x48, 0xac, 0x2a, 0x22, 0x95, 0x19, 0x20, 0xc3, 0x66, 0xcf, 0xc9, 0xa4, 0x69, 0x0e, 0x76, 0xa4, 0x95, 0x42, 0xef, 0x39, 0x1b, 0x2a, 0x0a, 0xb1, 0x99, 0x39, 0x7c, 0xbd, 0x91, 0x3d, 0xee, 0x2f, 0x1b, 0x3e, 0x54, 0x03, 0xd6, 0xa9, 0x7a, 0x9c, 0x24, 0xae, 0xdf, 0x51, 0x97, 0xe6, 0xc7, 0x28, 0xa6, 0x39, 0x8c, 0xe1, 0xa5, 0xff, 0x35, 0x37, 0xf4, 0x65, 0x49, 0x62, 0x76, 0x12, 0xe6, 0xe0, 0x44, 0x0b, 0x0d, 0x75, 0xa3, 0xd4, 0x40, 0x71, 0x34, 0xd9, 0x4f, 0x31, 0x6b, 0x0c, 0x6f, 0xe8, 0x42, 0xce, 0x8c, 0xa0, 0x2f, 0x13, 0xe0, 0x7b, 0x53, 0xc1, 0xc5, 0x3f, 0xf4, 0x5a, 0xc7, 0x11, 0x2d, 0xdb, 0xfe, 0x81, 0xe4, 0xe4, 0x9b, 0xc7, 0xfd, 0x18, 0xc0, 0x4c, 0xcd, 0xc7, 0x95, 0x6d, 0xd2, 0xcb, 0x98, 0x7b, 0xa1, 0xaf, 0x34, 0x06, 0x1f, 0x17, 0x96, 0x5b, 0xf4, 0x5b, 0xbc, 0x4b, 0x3d, 0x76, 0xce, 0x2e, 0x81, 0x1f, 0xb2, 0x28, 0xe7, 0x35, 0xdb, 0xab, 0xa6, 0x60, 0x61, 0x3d, 0xbc, 0xf6, 0x57, 0x7c, 0xe3, 0x1b, 0x59, 0x5f, 0xc1, 0x2d, 0x64, 0xbe, 0x5f, 0x5f, 0xea, 0x15, 0xdc, 0xa3, 0x26, 0x85, 0x63, 0xce, 0xae, 0x1b, 0x5a, 0xf6, 0x47, 0x55, 0xdc, 0x1f, 0xfc, 0xe2, 0x6a, 0x17, 0x72, 0xaa, 0xdd, 0x9f, 0x76, 0x0e, 0x9f, 0xcb, 0xd8, 0x71, 0x1b, 0xac, 0x7c, 0xf7, 0x72, 0x2c, 0xae, 0x8c, 0x70, 0x38, 0xb6, 0x29, 0xbe, 0x25, 0xac, 0x52, 0x59, 0x4c, 0x8e, 0xe4, 0x42, 0xf8, 0x90, 0x0d, 0x78, 0x83, 0xb3, 0x9c, 0x23, 0xbb, 0x99, 0x7b, 0x12, 0x8a, 0x98, 0x79, 0x67, 0xd7, 0x0d, 0x4d, 0x91, 0xa7, 0xf3, 0xd8, 0x7b, 0x88, 0xb4, 0xab, 0x03, 0x2f, 0x3e, 0xc9, 0xae, 0x60, 0x5a, 0xae, 0x9a, 0x0e, 0x39, 0x90, 0xb4, 0xc4, 0x50, 0xe4, 0x2a, 0x43, 0x67, 0x24, 0x24, 0x6d, 0xec, 0xd0, 0xaf, 0x61, 0x8c, 0xb3, 0xf9, 0xe8, 0x05, 0x67, 0xc4, 0x10, 0x35, 0x1b, 0x15, 0x16, 0x77, 0x94, 0x2c, 0x89, 0x30, 0x72, 0xb9, 0xad, 0xa5, 0xb5, 0x4d, 0x1e, 0x10, 0x7f, 0x0f, 0xb5, 0xf2, 0x1b, 0xb0, 0xaf, 0xaa, 0x3f, 0xa1, 0x0c, 0x47, 0x8e, 0x83, 0x36, 0x9b, 0x61, 0xdf, 0xe3, 0x90, 0xc7, 0x17, 0x3c, 0xc0, 0xcb, 0x9c, 0x3f, 0x3f, 0xf5, 0x62, 0x62, 0xbb, 0x13, 0x91, 0x79, 0xc8, 0x38, 0x7e, 0xd9, 0x75, 0x06, 0xd9, 0xbe, 0x23, 0x29, 0x28, 0xea, 0x97, 0x24, 0x73, 0x8f, 0x4d, 0x50, 0x41, 0x6f, 0x0f, 0x21, 0xc4, 0x42, 0xc7, 0xac, 0x51, 0x58, 0x92, 0x66, 0x13, 0x7f, 0x15, 0x2f, 0xff, 0x27, 0x14, 0x8f, 0x0a, 0xc4, 0x40, 0x3f, 0x9a, 0x74, 0x51, 0xeb, 0x3b, 0xe2, 0x55, 0x36, 0x94, 0x6a, 0x48, 0xff, 0x99, 0x7e, 0xe4, 0xe2, 0x02, 0x48, 0xba, 0x02, 0xfb, 0x90, 0x82, 0x06, 0x1d, 0xe1, 0xb0, 0x62, 0x9d, 0xe7, 0x48, 0xd8, 0xc3, 0x1c, 0xf2, 0x3e, 0x9e, 0xa4, 0x51, 0x81, 0xf7, 0x74, 0x91, 0xea, 0x83, 0xba, 0x3f, 0xa0, 0x5c, 0x79, 0x5e, 0x6f, 0xb2, 0x74, 0xb7, 0xc7, 0xbe, 0x4e, 0x70, 0x08, 0xf8, 0xef, 0xe0, 0xfc, 0x8a, 0x2a, 0xa2, 0xa5, 0x04, 0x9c, 0xe8, 0x3a, 0x51, 0xd7, 0x12, 0x6c, 0xea, 0xc0, 0x80, 0xed, 0x49, 0x35, 0xa4, 0x33, 0xa1, 0xf3, 0x5b, 0x7a, 0xcc, 0xb7, 0x7d, 0x08, 0x85, 0xa4, 0xb2, 0xb4, 0xd7, 0xe5, 0x88, 0xa9, 0xd5, 0x93, 0xc3, 0x68, 0x8c, 0xd9, 0xf5, 0x0c, 0x36, 0x56, 0x4e, 0xd2, 0xb1, 0xc2, 0xb4, 0xd8, 0x2f, 0xd5, 0x16, 0x25, 0x2e, 0x64, 0xfe, 0xea, 0xab, 0xce, 0x66, 0x07, 0x92, 0x96, 0xcd, 0xd1, 0x7a, 0x51, 0x8a, 0x13, 0x8f, 0xc3, 0x5f, 0x53, 0xcf, 0x45, 0x51, 0x56, 0x7a, 0x69, 0xb7, 0xe6, 0xc3, 0xe1, 0x92, 0xd2, 0xcc, 0x9d, 0x1c, 0x37, 0xd1, 0x34, 0xa4, 0xfe, 0xa4, 0x85, 0x98, 0xa6, 0x59, 0x9e, 0xe4, 0x43, 0x42, 0xdd, 0x7a, 0xc7, 0x1e, 0x54, 0x32, 0x81, 0x8d, 0x72, 0xd5, 0xe3, 0xc7, 0xe0, 0x74, 0x88, 0x8e, 0xaa, 0xff, 0x76, 0x61, 0x9f, 0x13, 0xa0, 0xf3, 0xfa, 0x12, 0xaf, 0xdb, 0x42, 0x79, 0x01, 0x8d, 0x6e, 0x6e, 0xf2, 0x89, 0x4d, 0x99, 0x5b, 0xd2, 0x25, 0x35, 0x59, 0xa2, 0x9b, 0x67, 0x50, 0x5c, 0xd2, 0xce, 0x2f, 0xc2, 0xd7, 0x5b, 0xf5, 0x68, 0x3d, 0x63, 0x74, 0x68, 0x04, 0xf2, 0x54, 0x58, 0xc0, 0x63, 0x5c, 0x79, 0xf6, 0x2d, 0xed, 0x31, 0xca, 0x00, 0xcf, 0xbc, 0xd7, 0x11, 0x31, 0x1e, 0x5f, 0xb2, 0xea, 0x5c, 0xa4, 0x25, 0x05, 0xeb, 0x95, 0xb2, 0x7d, 0x69, 0xad, 0xf7, 0x45, 0x8b, 0x19, 0x80, 0x8b, 0x57, 0x19, 0x97, 0x3e, 0x93, 0xa8, 0x5d, 0xce, 0x7d, 0x5f, 0x1a, 0x33, 0xbc, 0x97, 0xd2, 0x30, 0x97, 0xce, 0x19, 0xd9, 0x65, 0x4c, 0x27, 0x53, 0x44, 0x05, 0x2f, 0xdb, 0x0e, 0xc2, 0xed, 0x09, 0x89, 0x7c, 0x7f, 0x56, 0xde, 0x08, 0x75, 0xdd, 0x4d, 0xfa, 0x2b, 0x5e, 0x1e, 0xc3, 0x57, 0x88, 0xdb, 0x1c, 0xde, 0x78, 0xbc, 0xa8, 0xec, 0x7d, 0x63, 0xd4, 0x43, 0x1e, 0xc9, 0x03, 0xd3, 0x5e, 0x79, 0xe8, 0x8b, 0x3e, 0xfc, 0x32, 0x70, 0x84, 0x94, 0x6f, 0xec, 0xbb, 0x2d, 0x2a, 0x68, 0x7b, 0x90, 0x57, 0x1d, 0xea, 0xda, 0xf2, 0x26, 0x83, 0x2c, 0xe2, 0xda, 0x16, 0xa5, 0x23, 0x5a, 0x10, 0x8d, 0x24, 0x66, 0xfd, 0xd3, 0x6e, 0x75, 0x4b, 0xba, 0x87, 0x04, 0x51, 0xcf, 0x16, 0x2e, 0x90, 0x1e, 0x47, 0x7d, 0x38, 0xa5, 0x71, 0x00, 0xee, 0x09, 0xf7, 0x9d, 0xcc, 0x88, 0x6c, 0xa9, 0xa9, 0x2f, 0xfa, 0xb6, 0x9b, 0x4d, 0x04, 0xac, 0xbb, 0x27, 0x0a, 0x1c, 0x28, 0xed, 0xcd, 0xd0, 0x4f, 0xed, 0xb4, 0xa7, 0x69, 0x07, 0x6f, 0xa0, 0x44, 0x61, 0xda, 0x34, 0x47, 0x5c, 0x24, 0xe9, 0xb1, 0xc6, 0x30, 0x24, 0x21, 0x51, 0x3b, 0x3e, 0x5b, 0x43, 0xc0, 0xdb, 0x49, 0x70, 0x98, 0x77, 0x40, 0x65, 0x66, 0x42, 0x85, 0xe7, 0x32, 0x2e, 0x10, 0x9c, 0x54, 0x46, 0x8f, 0x07, 0x94, 0x41, 0xae, 0xba, 0x8f, 0x57, 0x96, 0xc6, 0x5d, 0x53, 0xb3, 0x77, 0x70, 0xea, 0xbb, 0x3e, 0xbf, 0x4b, 0xec, 0xef, 0x24, 0xf7, 0x95, 0x2c, 0x03, 0xd3, 0xd7, 0x21, 0x2d, 0x7b, 0xad, 0x73, 0x04, 0xda, 0x2a, 0x72, 0xdf, 0xf8, 0x02, 0x96, 0xb0, 0x12, 0x4c, 0x29, 0xe4, 0xf0, 0x86, 0x41, 0x8a, 0x73, 0xda, 0xf1, 0xb8, 0x6e, 0x9f, 0xc0, 0x2a, 0xb6, 0x23, 0x5a, 0x2d, 0x7d, 0xa8, 0x86, 0xbb, 0xdb, 0xac, 0x58, 0xe8, 0xae, 0x6e, 0xa8, 0x7d, 0xa4, 0xad, 0xc3, 0xe2, 0x96, 0xb3, 0x5f, 0x41, 0x18, 0x92, 0xd5, 0xe8, 0x4e, 0xae, 0x8a, 0xef, 0x01, 0x7b, 0xae, 0x1b, 0xf1, 0x88, 0x2a, 0x03, 0x6d, 0xbd, 0xd3, 0x71, 0x22, 0xe1, 0xe4, 0x0b, 0x31, 0x5e, 0xab, 0x33, 0x84, 0x49, 0x82, 0x2b, 0x61, 0x9d, 0x01, 0x7d, 0x3f, 0xc7, 0x72, 0x9a, 0xd9, 0x68, 0x85, 0xc1, 0x82, 0x56, 0x46, 0x22, 0xb8, 0xe4, 0x4b, 0x44, 0xfb, 0x63, 0x32, 0xa4, 0xe0, 0xe8, 0x4b, 0x9f, 0x61, 0x50, 0x91, 0x91, 0x77, 0x82, 0xdf, 0x3f, 0xeb, 0xf4, 0x60, 0x72, 0x68, 0x71, 0x48, 0xe5, 0xd6, 0x19, 0xc1, 0x61, 0xe3, 0xa9, 0x28, 0x27, 0xe2, 0xfc, 0x7a, 0x8e, 0xd9, 0xd2, 0x09, 0xed, 0xd5, 0xd1, 0x74, 0xbb, 0x81, 0xc9, 0xd5, 0xf5, 0xf7, 0x3c, 0x3c, 0xc0, 0xd6, 0x1e, 0x5d, 0x50, 0x95, 0xd9, 0x85, 0x08, 0x17, 0x94, 0xd3, 0xe3, 0x7f, 0xb5, 0xa4, 0x12, 0x45, 0xa4, 0x4f, 0xe7, 0x8a, 0xd2, 0x13, 0xf1, 0xa8, 0xfb, 0x4d, 0x69, 0x0e, 0xa8, 0xee, 0xcc, 0x4b, 0xf7, 0x2d, 0xca, 0x68, 0x9e, 0x79, 0x5f, 0x7b, 0x2e, 0xb2, 0x40, 0x79, 0x95, 0x98, 0x78, 0x4c, 0xe7, 0x84, 0x53, 0x25, 0x5e, 0x56, 0x7b, 0x14, 0x9f, 0xae, 0x61, 0xd6, 0x3e, 0x5f, 0xde, 0xee, 0x85, 0x20, 0x1b, 0xf7, 0x71, 0x85, 0xae, 0x38, 0xfe, 0x2e, 0x05, 0x79, 0xa4, 0x3f, 0x08, 0x15, 0x22, 0x0f, 0xfa, 0x51, 0x7a, 0x25, 0xa0, 0xec, 0x3d, 0x60, 0xa6, 0xf7, 0x08, 0x75, 0x3e, 0xe7, 0x4f, 0x9f, 0x0a, 0xe9, 0x59, 0x91, 0x3c, 0x75, 0x8c, 0xb0, 0xfc, 0x26, 0xeb, 0x7f, 0x0a, 0xc9, 0xdd, 0x5a, 0xa4, 0xb4, 0x30, 0x68, 0xaa, 0x59, 0x5d, 0xcb, 0x00, 0x1a, 0x0e, 0x19, 0x34, 0x5f, 0xdd, 0x10, 0x60, 0xe6, 0x5f, 0x85, 0x52, 0x5b, 0x61, 0x9e, 0xeb, 0x29, 0x71, 0x41, 0xc5, 0x8f, 0xa1, 0xcc, 0x18, 0xf6, 0x87, 0x07, 0xdf, 0x82, 0x88, 0x57, 0x36, 0xe7, 0x57, 0x34, 0x07, 0x7e, 0xb8, 0xdc, 0xe5, 0x98, 0x8a, 0x49, 0x38, 0x12, 0x04, 0x61, 0x9b, 0x29, 0x3f, 0x6e, 0x82, 0x90, 0xf4, 0xcd, 0x20, 0xc0, 0x88, 0xea, 0x88, 0x90, 0x45, 0x6c, 0x12, 0x05, 0xeb, 0xac, 0x00, 0x6b, 0x67, 0x6c, 0x61, 0xa4, 0xe2, 0xc6, 0x36, 0xc1, 0xfd, 0x62, 0xd4, 0xcf, 0x5b, 0xec, 0x89, 0xf3, 0x61, 0xc5, 0x82, 0xba, 0x39, 0xf9, 0xec, 0xaa, 0x1d, 0x72, 0x5a, 0x1d, 0xd2, 0x6b, 0x67, 0x4f, 0x72, 0x27, 0x9c, 0xb5, 0x6f, 0xe2, 0x94, 0x90, 0xd5, 0x08, 0x5d, 0xc3, 0xcf, 0xa5, 0x22, 0xe1, 0x6d, 0x1c, 0x07, 0x8b, 0xa4, 0x1d, 0x55, 0xf9, 0x97, 0xd1, 0xd7, 0xd6, 0x14, 0x57, 0x84, 0x51, 0x62, 0x74, 0x5d, 0x71, 0x3a, 0x86, 0x99, 0xa8, 0x13, 0xba, 0x00, 0xac, 0xa3, 0x7f, 0x95, 0x82, 0xa2, 0x3b, 0x77, 0xdb, 0xd1, 0x3c, 0x09, 0xa4, 0x3b, 0xf1, 0x51, 0xd9, 0xba, 0x5a, 0x9e, 0x9a, 0xbe, 0xbd, 0x6e, 0x80, 0x4a, 0x9b, 0x8e, 0x31, 0x3f, 0xe2, 0x83, 0x32, 0xdd, 0x64, 0x29, 0xfd, 0x87, 0x88, 0x9a, 0x54, 0xc6, 0x3f, 0x51, 0xd4, 0x91, 0x3a, 0x90, 0xcd, 0xcc, 0x5b, 0xfe, 0x51, 0x0e, 0x69, 0x95, 0x8b, 0xa7, 0x07, 0xbb, 0x52, 0xe2, 0xe7, 0xaf, 0xfe, 0x87, 0x3b, 0x27, 0x7b, 0xa4, 0x6c, 0x38, 0x9c, 0x8d, 0x0f, 0x75, 0xb1, 0x22, 0x15, 0x5b, 0x5b, 0x50, 0x41, 0xed, 0x9f, 0xdb, 0xe0, 0x9b, 0x3a, 0x5a, 0xb4, 0x68, 0x34, 0x83, 0x31, 0x4c, 0xb8, 0xa8, 0xec, 0xd7, 0x23, 0x82, 0x50, 0x18, 0x5b, 0x2e, 0x92, 0xbd, 0x62, 0x75, 0xe8, 0x7b, 0x2b, 0x50, 0xf6, 0xb1, 0xac, 0xab, 0x89, 0x48, 0x34, 0x6a, 0x88, 0xdd, 0xff, 0xaa, 0x28, 0x22, 0x08, 0x49, 0x5e, 0x81, 0x1e, 0xa8, 0x9a, 0x03, 0x3a, 0xaf, 0xb2, 0x71, 0x10, 0x12, 0x1c, 0xb9, 0xe4, 0xd3, 0x61, 0x92, 0x9f, 0x09, 0xce, 0x63, 0x22, 0xdf, 0x6d, 0x61, 0xda, 0xdf, 0x34, 0xf8, 0x94, 0x71, 0x7b, 0x6d, 0x93, 0x9e, 0xb4, 0xc1, 0xe0, 0x1a, 0x56, 0xd8, 0xe2, 0x82, 0x1a, 0xdb, 0x2e, 0xe2, 0x6a, 0xda, 0xa0, 0x7a, 0x16, 0xb6, 0xab, 0xc2, 0x4a, 0x3e, 0xed, 0xab, 0xbd, 0x98, 0x07, 0x28, 0x2a, 0xe3, 0xab, 0xed, 0x04, 0x1a, 0xf7, 0x76, 0x66, 0x3b, 0x01, 0x4c, 0x49, 0xa9, 0xb3, 0x84, 0xf9, 0xcf, 0xd9, 0x88, 0xca, 0x07, 0x78, 0x1a, 0x06, 0xba, 0x61, 0x95, 0x2b, 0xc8, 0x07, 0x76, 0x53, 0x2a, 0x8e, 0x1c, 0xf4, 0xd6, 0x24, 0xcc, 0xc9, 0xe2, 0x94, 0xf8, 0x10, 0xed, 0x18, 0xc1, 0xf6, 0xbb, 0x6f, 0xba, 0x50, 0x1f, 0x30, 0xef, 0x8b, 0x1e, 0x5e, 0x26, 0xe6, 0x51, 0x3c, 0x64, 0xde, 0x8b, 0x63, 0xb3, 0xea, 0xbc, 0x11, 0x23, 0x69, 0x15, 0xc4, 0x0f, 0xd9, 0x6d, 0x08, 0xa1, 0x49, 0xe4, 0x8d, 0x98, 0x11, 0xc6, 0x7c, 0x49, 0xc0, 0xb2, 0x0b, 0xe4, 0x56, 0xfb, 0x50, 0xf9, 0xb4, 0x4e, 0x52, 0x3b, 0x50, 0x95, 0x66, 0x83, 0x2d, 0x1c, 0xb9, 0x18, 0x0b, 0xf2, 0x29, 0x2d, 0xdb, 0x93, 0x59, 0xab, 0x75, 0xc3, 0x04, 0x31, 0x8d, 0xbd, 0x91, 0x59, 0xe3, 0x8d, 0xe8, 0x3e, 0xbb, 0xbb, 0x85, 0x3b, 0x8d, 0x29, 0xca, 0xf5, 0xfd, 0x3e, 0x9a, 0x9b, 0x0d, 0x44, 0x23, 0x6c, 0x92, 0x0f, 0xfb, 0x7a, 0xe5, 0xe0, 0x6f, 0xae, 0xda, 0x89, 0x18, 0x0d, 0xf6, 0xd1, 0xaf, 0x39, 0xdc, 0x19, 0x21, 0x3b, 0x09, 0x40, 0xe6, 0x7f, 0xc1, 0xc5, 0x8f, 0x20, 0x49, 0x2b, 0x9f, 0x67, 0x57, 0xa2, 0x9c, 0x8e, 0xc7, 0xe3, 0x66, 0xc9, 0x8f, 0x5c, 0xc7, 0x87, 0xf5, 0x8d, 0x4a, 0xf4, 0x00, 0xb2, 0x51, 0xc3, 0x2c, 0xa2, 0x62, 0x2c, 0x61, 0xf7, 0xc2, 0x30, 0x26, 0x6f, 0x45, 0x24, 0x13, 0x92, 0x64, 0x6d, 0x84, 0x95, 0x90, 0x89, 0x95, 0x7f, 0xc6, 0x4f, 0x4a, 0x8a, 0x64, 0x77, 0x0d, 0xcc, 0x3b, 0x5c, 0x5e, 0x16, 0xe5, 0x01, 0xc6, 0x1d, 0x58, 0x52, 0x0c, 0xd7, 0xbc, 0xad, 0xac, 0x28, 0x7a, 0xa1, 0x85, 0xbe, 0x96, 0xf6, 0xd2, 0x3a, 0x3e, 0xed, 0x5b, 0x90, 0xa3, 0xc8, 0xed, 0xb0, 0x07, 0x8d, 0x07, 0x66, 0x17, 0x08, 0xd6, 0x7e, 0x7c, 0x0f, 0x63, 0x2d, 0xad, 0x0a, 0x0c, 0xac, 0x07, 0xb2, 0x31, 0x26, 0x1f, 0x18, 0x2f, 0xd4, 0x57, 0xe9, 0x92, 0x67, 0xaf, 0xf1, 0x86, 0xa6, 0xde, 0xdf, 0x8f, 0x58, 0xa2, 0x48, 0x7a, 0x64, 0x54, 0xee, 0x94, 0x37, 0xbf, 0x41, 0x19, 0x66, 0x32, 0x26, 0xef, 0x94, 0xd4, 0xf8, 0x94, 0x97, 0x38, 0xcc, 0x56, 0xd6, 0x31, 0xfa, 0xc2, 0xf5, 0xe8, 0xd9, 0x5e, 0xb5, 0x2b, 0xc9, 0x9b, 0x15, 0x08, 0x77, 0x05, 0xbe, 0x9b, 0x5c, 0xbd, 0x9d, 0x24, 0x87, 0x29, 0xd2, 0x5c, 0x9d, 0xea, 0xc9, 0x0a, 0x1e, 0x0e, 0xa6, 0xd1, 0xe9, 0x87, 0xe7, 0x4c, 0x03, 0xdc, 0x44, 0x5d, 0x94, 0x1f, 0xda, 0xc1, 0x32, 0x1f, 0x89, 0xe8, 0x62, 0xde, 0x9b, 0x04, 0x5c, 0x46, 0xa6, 0x61, 0x0f, 0x17, 0xb3, 0xf4, 0x65, 0x24, 0x9f, 0x36, 0xc8, 0xbf, 0xc2, 0x33, 0xe5, 0x72, 0xcf, 0xdd, 0xb0, 0xf0, 0xfb, 0xa7, 0xa8, 0x4a, 0x62, 0x4f, 0x5c, 0x66, 0xa6, 0xfb, 0x2e, 0xae, 0xd9, 0x88, 0x57, 0x05, 0x9d, 0x1f, 0x2b, 0xff, 0x89, 0x09, 0x9e, 0x51, 0xcf, 0xc4, 0x08, 0x86, 0x1c, 0x56, 0x25, 0xf4, 0xc0, 0xe1, 0x60, 0xef, 0x0f, 0x78, 0x51, 0x3c, 0x07, 0x31, 0x84, 0xc8, 0x33, 0x7b, 0x7c, 0x9a, 0xce, 0xb2, 0xf7, 0x07, 0x2c, 0xf1, 0x74, 0x25, 0x56, 0x28, 0xf3, 0x82, 0xf5, 0x6e, 0xfc, 0x15, 0x71, 0x98, 0xe2, 0x74, 0x59, 0x0a, 0x49, 0x48, 0x06, 0xcd, 0xe6, 0xfe, 0x7b, 0xe2, 0x86, 0xc0, 0x90, 0xd6, 0x52, 0xa4, 0x50, 0x97, 0x51, 0x23, 0x9f, 0x86, 0x2e, 0xcc, 0x20, 0xcd, 0x3c, 0x39, 0x55, 0xf3, 0xb7, 0x43, 0x08, 0xae, 0x4d, 0x72, 0xea, 0xf8, 0xdc, 0xb7, 0x7b, 0x64, 0x7e, 0x5e, 0x29, 0xb3, 0xc3, 0x3e, 0xbc, 0xa2, 0x3d, 0x33, 0xf1 ],
+];
+
+const sha1_long_mds = const [
+'d8fd6a91ef3b6ced05b98358a99107c1fac8c807',
+'4a75a406f4de5f9e1132069d66717fc424376388',
+'a135e32581bb06289b8c83f040e9421ec79bbe01',
+'b22b87ea30f4050913f8f0241fc2ae2c319f52e7',
+'d742931bc51d4d44ff938783be73dc7beccc980b',
+'20a3a677c117c61ed3bb19e2ac77f69987896d0b',
+'dd4374e29b17e2ec533813feddc5253765cd37ac',
+'fdccb6e47645928fbbd51ccddc6cef48d6afc011',
+'e50a54470f59fb9b654bffcb4c353e58b683ada5',
+'9b3ed390fbb328a1641fca93691763000523569d',
+'09bf403d8a9d2334f28fab704d9cab87da43731a',
+'7f32d7486bde22ed00eeeaae073858144dc3ee37',
+'37b7277fc606556160f9bc28b06fd55f4424d9cc',
+'dbc7ace190c9dc985d2c3fbed5fe90328352b3b0',
+'796135c20bfd2dfc7a1ff2087aba7f93b2814ef4',
+'baa2e9bef9dd836d3d37013c296ec31919fe7840',
+'3d40608ab9bce3f372bb29a62ff3fcc68e48385d',
+'8bce8c69fd802389c805d2945c7499c9dd279ea2',
+'064c6fccb707f0f3929084eeb0298e800d542370',
+'bf2d47d4435ace28d3c336acdd6313aa8f9c41fd',
+'efe28211673e7bb68657243df023d4b70c0e5325',
+'afc01657b55fffd0c739cf017294a8379f60c2f9',
+'8a148c03dfc846b484ec15809d9cbfaa4b74a060',
+'8ff89c859a6ffa3d3874d3d1be4125f9de62c9bc',
+'c0af54b14db7ef0c68b1300b7350fd2a82fe96e9',
+'4c66ccc9d6a9f1d988bb7ae0fb41be3a1e1a648d',
+'0f5176527280b8e3fa69a6c14ce1f759d6e9c67c',
+'eef7dfc20c57895d31ad15aaab13cf710aa0d739',
+'93239fa543e8bd68b59a4bd55a7be068f18c5ea1',
+'2393e09e218261acb91ff9fb4783253e9b44b9f6',
+'7d90c7a14fc71e228a4f4fd191d3b7ea98c6509e',
+'07f84b3990bbeb9fc280681dc25d96bf8626992c',
+'bfa71db73fb3d8103fd7f2965eb89f2394f0b751',
+'92588ff54cd3903ceab98afd39f1854835f54492',
+'d947e8fd7fb5d805d70c1a21bd6eb5368f312885',
+'66ba577de1222642fd9e3b2a6e20741905356c2c',
+'b1542439b3590f2e43fa30baaee0ed11a9c46bab',
+'18de122bf588dc3d1eca78661673fa8d8acf254e',
+'e4ae28261f24a10355fd1aa1c2554592a331ceda',
+'290d124e77abc911e4be375232ff1798c4b48cb0',
+'fc8456f92f8a8bb38a3248e988a3e12271061510',
+'94a5d77bc308382a8aa317be7bad0a870f006c67',
+'515d2a8972936e6b45b9b457d9eab8e2f62cbc3d',
+'7fb74b4dde68f8c5e0d9b27878040123a9ed5fde',
+'534702c37c6fa8e1bde879ce4d87aa10c4cc8c8a',
+'cdd84a87e1457601d899b2abbe2e0974784491b7',
+'b51232c68cd82ce9ffb4bc1fea0ea9f71354314e',
+'adf2ebb0c337c89334fe8580b53dae70b25d00a7',
+'e2eb69f7d6fab720a3f038ac773b3274b6d113e9',
+'9c5bf7e24e8764745642e23e7cdc5fd44f91bbf9',
+'7731a20dfb7725e61d7aacebb41afbb4a05ffbfb',
+'fa47305e71a8e1e536486a806cbb839d813caf9f',
+'a94d7bf363f32a5a5b6e9f71b2edaa3f2ae31a61',
+'ed76c5bf4ada6a2092e6dbb40ff40909b8ec06cb',
+'6a5fc2f4a741f17a2e62b198d65e4a5ff6a1e748',
+'280ebf4f434e4134fce0d3f7581c2434bab1efbb',
+'af75e59940783e84761dbe59727ed7908a8709b5',
+'06f0df10ed7bc4b446f9271fdbe6ac81e36bc142',
+'e900914d8a38d14b307d1eb8e569a509421d811f',
+'581562f2a9f3097f760488cbe87f823d0fa7524c',
+'844e1f50dd792b283902e66bc1086a273c05d511',
+'61ca85608418090c78ebe8614bb2b80113fe130e',
+'a1f35ddd6a6275fd21bb8c2ebf290a06a2563df7',
+'b09d1a963ba9bf92907707b7d48b96e0d37dbd79',
+];
diff --git a/mojo/public/dart/third_party/crypto/test/sha1_short_test_vectors.dart b/mojo/public/dart/third_party/crypto/test/sha1_short_test_vectors.dart
new file mode 100644
index 0000000..f17e147
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/test/sha1_short_test_vectors.dart
@@ -0,0 +1,144 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of sha1_test;
+
+// Standard test vectors from:
+//   http://csrc.nist.gov/groups/STM/cavp/documents/shs/shabytetestvectors.zip
+
+const sha1_short_inputs = const [
+const [ ],
+const [ 0x36 ],
+const [ 0x19, 0x5a ],
+const [ 0xdf, 0x4b, 0xd2 ],
+const [ 0x54, 0x9e, 0x95, 0x9e ],
+const [ 0xf7, 0xfb, 0x1b, 0xe2, 0x05 ],
+const [ 0xc0, 0xe5, 0xab, 0xea, 0xea, 0x63 ],
+const [ 0x63, 0xbf, 0xc1, 0xed, 0x7f, 0x78, 0xab ],
+const [ 0x7e, 0x3d, 0x7b, 0x3e, 0xad, 0xa9, 0x88, 0x66 ],
+const [ 0x9e, 0x61, 0xe5, 0x5d, 0x9e, 0xd3, 0x7b, 0x1c, 0x20 ],
+const [ 0x97, 0x77, 0xcf, 0x90, 0xdd, 0x7c, 0x7e, 0x86, 0x35, 0x06 ],
+const [ 0x4e, 0xb0, 0x8c, 0x9e, 0x68, 0x3c, 0x94, 0xbe, 0xa0, 0x0d, 0xfa ],
+const [ 0x09, 0x38, 0xf2, 0xe2, 0xeb, 0xb6, 0x4f, 0x8a, 0xf8, 0xbb, 0xfc, 0x91 ],
+const [ 0x74, 0xc9, 0x99, 0x6d, 0x14, 0xe8, 0x7d, 0x3e, 0x6c, 0xbe, 0xa7, 0x02, 0x9d ],
+const [ 0x51, 0xdc, 0xa5, 0xc0, 0xf8, 0xe5, 0xd4, 0x95, 0x96, 0xf3, 0x2d, 0x3e, 0xb8, 0x74 ],
+const [ 0x3a, 0x36, 0xea, 0x49, 0x68, 0x48, 0x20, 0xa2, 0xad, 0xc7, 0xfc, 0x41, 0x75, 0xba, 0x78 ],
+const [ 0x35, 0x52, 0x69, 0x4c, 0xdf, 0x66, 0x3f, 0xd9, 0x4b, 0x22, 0x47, 0x47, 0xac, 0x40, 0x6a, 0xaf ],
+const [ 0xf2, 0x16, 0xa1, 0xcb, 0xde, 0x24, 0x46, 0xb1, 0xed, 0xf4, 0x1e, 0x93, 0x48, 0x1d, 0x33, 0xe2, 0xed ],
+const [ 0xa3, 0xcf, 0x71, 0x4b, 0xf1, 0x12, 0x64, 0x7e, 0x72, 0x7e, 0x8c, 0xfd, 0x46, 0x49, 0x9a, 0xcd, 0x35, 0xa6 ],
+const [ 0x14, 0x8d, 0xe6, 0x40, 0xf3, 0xc1, 0x15, 0x91, 0xa6, 0xf8, 0xc5, 0xc4, 0x86, 0x32, 0xc5, 0xfb, 0x79, 0xd3, 0xb7 ],
+const [ 0x63, 0xa3, 0xcc, 0x83, 0xfd, 0x1e, 0xc1, 0xb6, 0x68, 0x0e, 0x99, 0x74, 0xa0, 0x51, 0x4e, 0x1a, 0x9e, 0xce, 0xbb, 0x6a ],
+const [ 0x87, 0x5a, 0x90, 0x90, 0x9a, 0x8a, 0xfc, 0x92, 0xfb, 0x70, 0x70, 0x04, 0x7e, 0x9d, 0x08, 0x1e, 0xc9, 0x2f, 0x3d, 0x08, 0xb8 ],
+const [ 0x44, 0x4b, 0x25, 0xf9, 0xc9, 0x25, 0x9d, 0xc2, 0x17, 0x77, 0x2c, 0xc4, 0x47, 0x8c, 0x44, 0xb6, 0xfe, 0xff, 0x62, 0x35, 0x36, 0x73 ],
+const [ 0x48, 0x73, 0x51, 0xc8, 0xa5, 0xf4, 0x40, 0xe4, 0xd0, 0x33, 0x86, 0x48, 0x3d, 0x5f, 0xe7, 0xbb, 0x66, 0x9d, 0x41, 0xad, 0xcb, 0xfd, 0xb7 ],
+const [ 0x46, 0xb0, 0x61, 0xef, 0x13, 0x2b, 0x87, 0xf6, 0xd3, 0xb0, 0xee, 0x24, 0x62, 0xf6, 0x7d, 0x91, 0x09, 0x77, 0xda, 0x20, 0xae, 0xd1, 0x37, 0x05 ],
+const [ 0x38, 0x42, 0xb6, 0x13, 0x7b, 0xb9, 0xd2, 0x7f, 0x3c, 0xa5, 0xba, 0xfe, 0x5b, 0xbb, 0x62, 0x85, 0x83, 0x44, 0xfe, 0x4b, 0xa5, 0xc4, 0x15, 0x89, 0xa5 ],
+const [ 0x44, 0xd9, 0x1d, 0x3d, 0x46, 0x5a, 0x41, 0x11, 0x46, 0x2b, 0xa0, 0xc7, 0xec, 0x22, 0x3d, 0xa6, 0x73, 0x5f, 0x4f, 0x52, 0x00, 0x45, 0x3c, 0xf1, 0x32, 0xc3 ],
+const [ 0xcc, 0xe7, 0x3f, 0x2e, 0xab, 0xcb, 0x52, 0xf7, 0x85, 0xd5, 0xa6, 0xdf, 0x63, 0xc0, 0xa1, 0x05, 0xf3, 0x4a, 0x91, 0xca, 0x23, 0x7f, 0xe5, 0x34, 0xee, 0x39, 0x9d ],
+const [ 0x66, 0x4e, 0x6e, 0x79, 0x46, 0x83, 0x92, 0x03, 0x03, 0x7a, 0x65, 0xa1, 0x21, 0x74, 0xb2, 0x44, 0xde, 0x8c, 0xbc, 0x6e, 0xc3, 0xf5, 0x78, 0x96, 0x7a, 0x84, 0xf9, 0xce ],
+const [ 0x95, 0x97, 0xf7, 0x14, 0xb2, 0xe4, 0x5e, 0x33, 0x99, 0xa7, 0xf0, 0x2a, 0xec, 0x44, 0x92, 0x1b, 0xd7, 0x8b, 0xe0, 0xfe, 0xfe, 0xe0, 0xc5, 0xe9, 0xb4, 0x99, 0x48, 0x8f, 0x6e ],
+const [ 0x75, 0xc5, 0xad, 0x1f, 0x3c, 0xbd, 0x22, 0xe8, 0xa9, 0x5f, 0xc3, 0xb0, 0x89, 0x52, 0x67, 0x88, 0xfb, 0x4e, 0xbc, 0xee, 0xd3, 0xe7, 0xd4, 0x44, 0x3d, 0xa6, 0xe0, 0x81, 0xa3, 0x5e ],
+const [ 0xdd, 0x24, 0x5b, 0xff, 0xe6, 0xa6, 0x38, 0x80, 0x66, 0x67, 0x76, 0x83, 0x60, 0xa9, 0x5d, 0x05, 0x74, 0xe1, 0xa0, 0xbd, 0x0d, 0x18, 0x32, 0x9f, 0xdb, 0x91, 0x5c, 0xa4, 0x84, 0xac, 0x0d ],
+const [ 0x03, 0x21, 0x79, 0x4b, 0x73, 0x94, 0x18, 0xc2, 0x4e, 0x7c, 0x2e, 0x56, 0x52, 0x74, 0x79, 0x1c, 0x4b, 0xe7, 0x49, 0x75, 0x2a, 0xd2, 0x34, 0xed, 0x56, 0xcb, 0x0a, 0x63, 0x47, 0x43, 0x0c, 0x6b ],
+const [ 0x4c, 0x3d, 0xcf, 0x95, 0xc2, 0xf0, 0xb5, 0x25, 0x8c, 0x65, 0x1f, 0xcd, 0x1d, 0x51, 0xbd, 0x10, 0x42, 0x5d, 0x62, 0x03, 0x06, 0x7d, 0x07, 0x48, 0xd3, 0x7d, 0x13, 0x40, 0xd9, 0xdd, 0xda, 0x7d, 0xb3 ],
+const [ 0xb8, 0xd1, 0x25, 0x82, 0xd2, 0x5b, 0x45, 0x29, 0x0a, 0x6e, 0x1b, 0xb9, 0x5d, 0xa4, 0x29, 0xbe, 0xfc, 0xfd, 0xbf, 0x5b, 0x4d, 0xd4, 0x1c, 0xdf, 0x33, 0x11, 0xd6, 0x98, 0x8f, 0xa1, 0x7c, 0xec, 0x07, 0x23 ],
+const [ 0x6f, 0xda, 0x97, 0x52, 0x7a, 0x66, 0x25, 0x52, 0xbe, 0x15, 0xef, 0xae, 0xba, 0x32, 0xa3, 0xae, 0xa4, 0xed, 0x44, 0x9a, 0xbb, 0x5c, 0x1e, 0xd8, 0xd9, 0xbf, 0xff, 0x54, 0x47, 0x08, 0xa4, 0x25, 0xd6, 0x9b, 0x72 ],
+const [ 0x09, 0xfa, 0x27, 0x92, 0xac, 0xbb, 0x24, 0x17, 0xe8, 0xed, 0x26, 0x90, 0x41, 0xcc, 0x03, 0xc7, 0x70, 0x06, 0x46, 0x6e, 0x6e, 0x7a, 0xe0, 0x02, 0xcf, 0x3f, 0x1a, 0xf5, 0x51, 0xe8, 0xce, 0x0b, 0xb5, 0x06, 0xd7, 0x05 ],
+const [ 0x5e, 0xfa, 0x29, 0x87, 0xda, 0x0b, 0xaf, 0x0a, 0x54, 0xd8, 0xd7, 0x28, 0x79, 0x2b, 0xcf, 0xa7, 0x07, 0xa1, 0x57, 0x98, 0xdc, 0x66, 0x74, 0x37, 0x54, 0x40, 0x69, 0x14, 0xd1, 0xcf, 0xe3, 0x70, 0x9b, 0x13, 0x74, 0xea, 0xeb ],
+const [ 0x28, 0x36, 0xde, 0x99, 0xc0, 0xf6, 0x41, 0xcd, 0x55, 0xe8, 0x9f, 0x5a, 0xf7, 0x66, 0x38, 0x94, 0x7b, 0x82, 0x27, 0x37, 0x7e, 0xf8, 0x8b, 0xfb, 0xa6, 0x62, 0xe5, 0x68, 0x2b, 0xab, 0xc1, 0xec, 0x96, 0xc6, 0x99, 0x2b, 0xc9, 0xa0 ],
+const [ 0x42, 0x14, 0x3a, 0x2b, 0x9e, 0x1d, 0x0b, 0x35, 0x4d, 0xf3, 0x26, 0x4d, 0x08, 0xf7, 0xb6, 0x02, 0xf5, 0x4a, 0xad, 0x92, 0x2a, 0x3d, 0x63, 0x00, 0x6d, 0x09, 0x7f, 0x68, 0x3d, 0xc1, 0x1b, 0x90, 0x17, 0x84, 0x23, 0xbf, 0xf2, 0xf7, 0xfe ],
+const [ 0xeb, 0x60, 0xc2, 0x8a, 0xd8, 0xae, 0xda, 0x80, 0x7d, 0x69, 0xeb, 0xc8, 0x75, 0x52, 0x02, 0x4a, 0xd8, 0xac, 0xa6, 0x82, 0x04, 0xf1, 0xbc, 0xd2, 0x9d, 0xc5, 0xa8, 0x1d, 0xd2, 0x28, 0xb5, 0x91, 0xe2, 0xef, 0xb7, 0xc4, 0xdf, 0x75, 0xef, 0x03 ],
+const [ 0x7d, 0xe4, 0xba, 0x85, 0xec, 0x54, 0x74, 0x7c, 0xdc, 0x42, 0xb1, 0xf2, 0x35, 0x46, 0xb7, 0xe4, 0x90, 0xe3, 0x12, 0x80, 0xf0, 0x66, 0xe5, 0x2f, 0xac, 0x11, 0x7f, 0xd3, 0xb0, 0x79, 0x2e, 0x4d, 0xe6, 0x2d, 0x58, 0x43, 0xee, 0x98, 0xc7, 0x20, 0x15 ],
+const [ 0xe7, 0x06, 0x53, 0x63, 0x7b, 0xc5, 0xe3, 0x88, 0xcc, 0xd8, 0xdc, 0x44, 0xe5, 0xea, 0xce, 0x36, 0xf7, 0x39, 0x8f, 0x2b, 0xac, 0x99, 0x30, 0x42, 0xb9, 0xbc, 0x2f, 0x4f, 0xb3, 0xb0, 0xee, 0x7e, 0x23, 0xa9, 0x64, 0x39, 0xdc, 0x01, 0x13, 0x4b, 0x8c, 0x7d ],
+const [ 0xdd, 0x37, 0xbc, 0x9f, 0x0b, 0x3a, 0x47, 0x88, 0xf9, 0xb5, 0x49, 0x66, 0xf2, 0x52, 0x17, 0x4c, 0x8c, 0xe4, 0x87, 0xcb, 0xe5, 0x9c, 0x53, 0xc2, 0x2b, 0x81, 0xbf, 0x77, 0x62, 0x1a, 0x7c, 0xe7, 0x61, 0x6d, 0xcb, 0x5b, 0x1e, 0x2e, 0xe6, 0x3c, 0x2c, 0x30, 0x9b ],
+const [ 0x5f, 0x48, 0x5c, 0x63, 0x7a, 0xe3, 0x0b, 0x1e, 0x30, 0x49, 0x7f, 0x0f, 0xb7, 0xec, 0x36, 0x4e, 0x13, 0xc9, 0x06, 0xe2, 0x81, 0x3d, 0xaa, 0x34, 0x16, 0x1b, 0x7a, 0xc4, 0xa4, 0xfd, 0x7a, 0x1b, 0xdd, 0xd7, 0x96, 0x01, 0xbb, 0xd2, 0x2c, 0xef, 0x1f, 0x57, 0xcb, 0xc7 ],
+const [ 0xf6, 0xc2, 0x37, 0xfb, 0x3c, 0xfe, 0x95, 0xec, 0x84, 0x14, 0xcc, 0x16, 0xd2, 0x03, 0xb4, 0x87, 0x4e, 0x64, 0x4c, 0xc9, 0xa5, 0x43, 0x46, 0x5c, 0xad, 0x2d, 0xc5, 0x63, 0x48, 0x8a, 0x65, 0x9e, 0x8a, 0x2e, 0x7c, 0x98, 0x1e, 0x2a, 0x9f, 0x22, 0xe5, 0xe8, 0x68, 0xff, 0xe1 ],
+const [ 0xda, 0x7a, 0xb3, 0x29, 0x15, 0x53, 0xc6, 0x59, 0x87, 0x3c, 0x95, 0x91, 0x37, 0x68, 0x95, 0x3c, 0x6e, 0x52, 0x6d, 0x3a, 0x26, 0x59, 0x08, 0x98, 0xc0, 0xad, 0xe8, 0x9f, 0xf5, 0x6f, 0xbd, 0x11, 0x0f, 0x14, 0x36, 0xaf, 0x59, 0x0b, 0x17, 0xfe, 0xd4, 0x9f, 0x8c, 0x4b, 0x2b, 0x1e ],
+const [ 0x8c, 0xfa, 0x5f, 0xd5, 0x6e, 0xe2, 0x39, 0xca, 0x47, 0x73, 0x75, 0x91, 0xcb, 0xa1, 0x03, 0xe4, 0x1a, 0x18, 0xac, 0xf8, 0xe8, 0xd2, 0x57, 0xb0, 0xdb, 0xe8, 0x85, 0x11, 0x34, 0xa8, 0x1f, 0xf6, 0xb2, 0xe9, 0x71, 0x04, 0xb3, 0x9b, 0x76, 0xe1, 0x9d, 0xa2, 0x56, 0xa1, 0x7c, 0xe5, 0x2d ],
+const [ 0x57, 0xe8, 0x96, 0x59, 0xd8, 0x78, 0xf3, 0x60, 0xaf, 0x6d, 0xe4, 0x5a, 0x9a, 0x5e, 0x37, 0x2e, 0xf4, 0x0c, 0x38, 0x49, 0x88, 0xe8, 0x26, 0x40, 0xa3, 0xd5, 0xe4, 0xb7, 0x6d, 0x2e, 0xf1, 0x81, 0x78, 0x0b, 0x9a, 0x09, 0x9a, 0xc0, 0x6e, 0xf0, 0xf8, 0xa7, 0xf3, 0xf7, 0x64, 0x20, 0x97, 0x20 ],
+const [ 0xb9, 0x1e, 0x64, 0x23, 0x5d, 0xbd, 0x23, 0x4e, 0xea, 0x2a, 0xe1, 0x4a, 0x92, 0xa1, 0x73, 0xeb, 0xe8, 0x35, 0x34, 0x72, 0x39, 0xcf, 0xf8, 0xb0, 0x20, 0x74, 0x41, 0x6f, 0x55, 0xc6, 0xb6, 0x0d, 0xc6, 0xce, 0xd0, 0x6a, 0xe9, 0xf8, 0xd7, 0x05, 0x50, 0x5f, 0x0d, 0x61, 0x7e, 0x4b, 0x29, 0xae, 0xf9 ],
+const [ 0xe4, 0x2a, 0x67, 0x36, 0x2a, 0x58, 0x1e, 0x8c, 0xf3, 0xd8, 0x47, 0x50, 0x22, 0x15, 0x75, 0x5d, 0x7a, 0xd4, 0x25, 0xca, 0x03, 0x0c, 0x43, 0x60, 0xb0, 0xf7, 0xef, 0x51, 0x3e, 0x69, 0x80, 0x26, 0x5f, 0x61, 0xc9, 0xfa, 0x18, 0xdd, 0x9c, 0xe6, 0x68, 0xf3, 0x8d, 0xbc, 0x2a, 0x1e, 0xf8, 0xf8, 0x3c, 0xd6 ],
+const [ 0x63, 0x4d, 0xb9, 0x2c, 0x22, 0x01, 0x0e, 0x1c, 0xbf, 0x1e, 0x16, 0x23, 0x92, 0x31, 0x80, 0x40, 0x6c, 0x51, 0x52, 0x72, 0x20, 0x9a, 0x8a, 0xcc, 0x42, 0xde, 0x05, 0xcc, 0x2e, 0x96, 0xa1, 0xe9, 0x4c, 0x1f, 0x9f, 0x6b, 0x93, 0x23, 0x4b, 0x7f, 0x4c, 0x55, 0xde, 0x8b, 0x19, 0x61, 0xa3, 0xbf, 0x35, 0x22, 0x59 ],
+const [ 0xcc, 0x6c, 0xa3, 0xa8, 0xcb, 0x39, 0x1c, 0xd8, 0xa5, 0xaf, 0xf1, 0xfa, 0xa7, 0xb3, 0xff, 0xbd, 0xd2, 0x1a, 0x5a, 0x3c, 0xe6, 0x6c, 0xfa, 0xdd, 0xbf, 0xe8, 0xb1, 0x79, 0xe4, 0xc8, 0x60, 0xbe, 0x5e, 0xc6, 0x6b, 0xd2, 0xc6, 0xde, 0x6a, 0x39, 0xa2, 0x56, 0x22, 0xf9, 0xf2, 0xfc, 0xb3, 0xfc, 0x05, 0xaf, 0x12, 0xb5 ],
+const [ 0x7c, 0x0e, 0x6a, 0x0d, 0x35, 0xf8, 0xac, 0x85, 0x4c, 0x72, 0x45, 0xeb, 0xc7, 0x36, 0x93, 0x73, 0x1b, 0xbb, 0xc3, 0xe6, 0xfa, 0xb6, 0x44, 0x46, 0x6d, 0xe2, 0x7b, 0xb5, 0x22, 0xfc, 0xb9, 0x93, 0x07, 0x12, 0x6a, 0xe7, 0x18, 0xfe, 0x8f, 0x00, 0x74, 0x2e, 0x6e, 0x5c, 0xb7, 0xa6, 0x87, 0xc8, 0x84, 0x47, 0xcb, 0xc9, 0x61 ],
+const [ 0xc5, 0x58, 0x1d, 0x40, 0xb3, 0x31, 0xe2, 0x40, 0x03, 0x90, 0x1b, 0xd6, 0xbf, 0x24, 0x4a, 0xca, 0x9e, 0x96, 0x01, 0xb9, 0xd8, 0x12, 0x52, 0xbb, 0x38, 0x04, 0x86, 0x42, 0x73, 0x1f, 0x11, 0x46, 0xb8, 0xa4, 0xc6, 0x9f, 0x88, 0xe1, 0x48, 0xb2, 0xc8, 0xf8, 0xc1, 0x4f, 0x15, 0xe1, 0xd6, 0xda, 0x57, 0xb2, 0xda, 0xa9, 0x99, 0x1e ],
+const [ 0xec, 0x6b, 0x4a, 0x88, 0x71, 0x3d, 0xf2, 0x7c, 0x0f, 0x2d, 0x02, 0xe7, 0x38, 0xb6, 0x9d, 0xb4, 0x3a, 0xbd, 0xa3, 0x92, 0x13, 0x17, 0x25, 0x9c, 0x86, 0x4c, 0x1c, 0x38, 0x6e, 0x9a, 0x5a, 0x3f, 0x53, 0x3d, 0xc0, 0x5f, 0x3b, 0xee, 0xb2, 0xbe, 0xc2, 0xaa, 0xc8, 0xe0, 0x6d, 0xb4, 0xc6, 0xcb, 0x3c, 0xdd, 0xcf, 0x69, 0x7e, 0x03, 0xd5 ],
+const [ 0x03, 0x21, 0x73, 0x6b, 0xeb, 0xa5, 0x78, 0xe9, 0x0a, 0xbc, 0x1a, 0x90, 0xaa, 0x56, 0x15, 0x7d, 0x87, 0x16, 0x18, 0xf6, 0xde, 0x0d, 0x76, 0x4c, 0xc8, 0xc9, 0x1e, 0x06, 0xc6, 0x8e, 0xcd, 0x3b, 0x9d, 0xe3, 0x82, 0x40, 0x64, 0x50, 0x33, 0x84, 0xdb, 0x67, 0xbe, 0xb7, 0xfe, 0x01, 0x22, 0x32, 0xda, 0xca, 0xef, 0x93, 0xa0, 0x00, 0xfb, 0xa7 ],
+const [ 0xd0, 0xa2, 0x49, 0xa9, 0x7b, 0x5f, 0x14, 0x86, 0x72, 0x1a, 0x50, 0xd4, 0xc4, 0xab, 0x3f, 0x5d, 0x67, 0x4a, 0x0e, 0x29, 0x92, 0x5d, 0x5b, 0xf2, 0x67, 0x8e, 0xf6, 0xd8, 0xd5, 0x21, 0xe4, 0x56, 0xbd, 0x84, 0xaa, 0x75, 0x53, 0x28, 0xc8, 0x3f, 0xc8, 0x90, 0x83, 0x77, 0x26, 0xa8, 0xe7, 0x87, 0x7b, 0x57, 0x0d, 0xba, 0x39, 0x57, 0x9a, 0xab, 0xdd ],
+const [ 0xc3, 0x21, 0x38, 0x53, 0x11, 0x18, 0xf0, 0x8c, 0x7d, 0xcc, 0x29, 0x24, 0x28, 0xad, 0x20, 0xb4, 0x5a, 0xb2, 0x7d, 0x95, 0x17, 0xa1, 0x84, 0x45, 0xf3, 0x8b, 0x8f, 0x0c, 0x27, 0x95, 0xbc, 0xdf, 0xe3, 0xff, 0xe3, 0x84, 0xe6, 0x5e, 0xcb, 0xf7, 0x4d, 0x2c, 0x9d, 0x0d, 0xa8, 0x83, 0x98, 0x57, 0x53, 0x26, 0x07, 0x49, 0x04, 0xc1, 0x70, 0x9b, 0xa0, 0x72 ],
+const [ 0xb0, 0xf4, 0xcf, 0xb9, 0x39, 0xea, 0x78, 0x5e, 0xab, 0xb7, 0xe7, 0xca, 0x7c, 0x47, 0x6c, 0xdd, 0x9b, 0x22, 0x7f, 0x01, 0x5d, 0x90, 0x53, 0x68, 0xba, 0x00, 0xae, 0x96, 0xb9, 0xaa, 0xf7, 0x20, 0x29, 0x74, 0x91, 0xb3, 0x92, 0x12, 0x67, 0x57, 0x6b, 0x72, 0xc8, 0xf5, 0x8d, 0x57, 0x76, 0x17, 0xe8, 0x44, 0xf9, 0xf0, 0x75, 0x9b, 0x39, 0x9c, 0x6b, 0x06, 0x4c ],
+const [ 0xbd, 0x02, 0xe5, 0x1b, 0x0c, 0xf2, 0xc2, 0xb8, 0xd2, 0x04, 0xa0, 0x26, 0xb4, 0x1a, 0x66, 0xfb, 0xfc, 0x2a, 0xc3, 0x7e, 0xe9, 0x41, 0x1f, 0xc4, 0x49, 0xc8, 0xd1, 0x19, 0x4a, 0x07, 0x92, 0xa2, 0x8e, 0xe7, 0x31, 0x40, 0x7d, 0xfc, 0x89, 0xb6, 0xdf, 0xc2, 0xb1, 0x0f, 0xaa, 0x27, 0x72, 0x3a, 0x18, 0x4a, 0xfe, 0xf8, 0xfd, 0x83, 0xde, 0xf8, 0x58, 0xa3, 0x2d, 0x3f ],
+const [ 0xe3, 0x31, 0x46, 0xb8, 0x3e, 0x4b, 0xb6, 0x71, 0x39, 0x22, 0x18, 0xda, 0x9a, 0x77, 0xf8, 0xd9, 0xf5, 0x97, 0x41, 0x47, 0x18, 0x2f, 0xb9, 0x5b, 0xa6, 0x62, 0xcb, 0x66, 0x01, 0x19, 0x89, 0xc1, 0x6d, 0x9a, 0xf1, 0x04, 0x73, 0x5d, 0x6f, 0x79, 0x84, 0x1a, 0xa4, 0xd1, 0xdf, 0x27, 0x66, 0x15, 0xb5, 0x01, 0x08, 0xdf, 0x8a, 0x29, 0xdb, 0xc9, 0xde, 0x31, 0xf4, 0x26, 0x0d ],
+const [ 0x41, 0x1c, 0x13, 0xc7, 0x50, 0x73, 0xc1, 0xe2, 0xd4, 0xb1, 0xec, 0xf1, 0x31, 0x39, 0xba, 0x96, 0x56, 0xcd, 0x35, 0xc1, 0x42, 0x01, 0xf1, 0xc7, 0xc6, 0xf0, 0xee, 0xb5, 0x8d, 0x2d, 0xbf, 0xe3, 0x5b, 0xfd, 0xec, 0xcc, 0x92, 0xc3, 0x96, 0x1c, 0xfa, 0xbb, 0x59, 0x0b, 0xc1, 0xeb, 0x77, 0xea, 0xc1, 0x57, 0x32, 0xfb, 0x02, 0x75, 0x79, 0x86, 0x80, 0xe0, 0xc7, 0x29, 0x2e, 0x50 ],
+const [ 0xf2, 0xc7, 0x6e, 0xf6, 0x17, 0xfa, 0x2b, 0xfc, 0x8a, 0x4d, 0x6b, 0xcb, 0xb1, 0x5f, 0xe8, 0x84, 0x36, 0xfd, 0xc2, 0x16, 0x5d, 0x30, 0x74, 0x62, 0x95, 0x79, 0x07, 0x9d, 0x4d, 0x5b, 0x86, 0xf5, 0x08, 0x1a, 0xb1, 0x77, 0xb4, 0xc3, 0xf5, 0x30, 0x37, 0x6c, 0x9c, 0x92, 0x4c, 0xbd, 0x42, 0x1a, 0x8d, 0xaf, 0x88, 0x30, 0xd0, 0x94, 0x0c, 0x4f, 0xb7, 0x58, 0x98, 0x65, 0x83, 0x06, 0x99 ],
+const [ 0x45, 0x92, 0x7e, 0x32, 0xdd, 0xf8, 0x01, 0xca, 0xf3, 0x5e, 0x18, 0xe7, 0xb5, 0x07, 0x8b, 0x7f, 0x54, 0x35, 0x27, 0x82, 0x12, 0xec, 0x6b, 0xb9, 0x9d, 0xf8, 0x84, 0xf4, 0x9b, 0x32, 0x7c, 0x64, 0x86, 0xfe, 0xae, 0x46, 0xba, 0x18, 0x7d, 0xc1, 0xcc, 0x91, 0x45, 0x12, 0x1e, 0x14, 0x92, 0xe6, 0xb0, 0x6e, 0x90, 0x07, 0x39, 0x4d, 0xc3, 0x3b, 0x77, 0x48, 0xf8, 0x6a, 0xc3, 0x20, 0x7c, 0xfe ],
+];
+
+const sha1_short_mds = const [
+'da39a3ee5e6b4b0d3255bfef95601890afd80709',
+'c1dfd96eea8cc2b62785275bca38ac261256e278',
+'0a1c2d555bbe431ad6288af5a54f93e0449c9232',
+'bf36ed5d74727dfd5d7854ec6b1d49468d8ee8aa',
+'b78bae6d14338ffccfd5d5b5674a275f6ef9c717',
+'60b7d5bb560a1acf6fa45721bd0abb419a841a89',
+'a6d338459780c08363090fd8fc7d28dc80e8e01f',
+'860328d80509500c1783169ebf0ba0c4b94da5e5',
+'24a2c34b976305277ce58c2f42d5092031572520',
+'411ccee1f6e3677df12698411eb09d3ff580af97',
+'05c915b5ed4e4c4afffc202961f3174371e90b5c',
+'af320b42d7785ca6c8dd220463be23a2d2cb5afc',
+'9f4e66b6ceea40dcf4b9166c28f1c88474141da9',
+'e6c4363c0852951991057f40de27ec0890466f01',
+'046a7b396c01379a684a894558779b07d8c7da20',
+'d58a262ee7b6577c07228e71ae9b3e04c8abcda9',
+'a150de927454202d94e656de4c7c0ca691de955d',
+'35a4b39fef560e7ea61246676e1b7e13d587be30',
+'7ce69b1acdce52ea7dbd382531fa1a83df13cae7',
+'b47be2c64124fa9a124a887af9551a74354ca411',
+'8bb8c0d815a9c68a1d2910f39d942603d807fbcc',
+'b486f87fb833ebf0328393128646a6f6e660fcb1',
+'76159368f99dece30aadcfb9b7b41dab33688858',
+'dbc1cb575ce6aeb9dc4ebf0f843ba8aeb1451e89',
+'d7a98289679005eb930ab75efd8f650f991ee952',
+'fda26fa9b4874ab701ed0bb64d134f89b9c4cc50',
+'c2ff7ccde143c8f0601f6974b1903eb8d5741b6e',
+'643c9dc20a929608f6caa9709d843ca6fa7a76f4',
+'509ef787343d5b5a269229b961b96241864a3d74',
+'b61ce538f1a1e6c90432b233d7af5b6524ebfbe3',
+'5b7b94076b2fc20d6adb82479e6b28d07c902b75',
+'6066db99fc358952cf7fb0ec4d89cb0158ed91d7',
+'b89962c94d60f6a332fd60f6f07d4f032a586b76',
+'17bda899c13d35413d2546212bcd8a93ceb0657b',
+'badcdd53fdc144b8bf2cc1e64d10f676eebe66ed',
+'01b4646180f1f6d2e06bbe22c20e50030322673a',
+'10016dc3a2719f9034ffcc689426d28292c42fc9',
+'9f42fa2bce6ef021d93c6b2d902273797e426535',
+'cdf48bacbff6f6152515323f9b43a286e0cb8113',
+'b88fb75274b9b0fd57c0045988cfcef6c3ce6554',
+'c06d3a6a12d9e8db62e8cff40ca23820d61d8aa7',
+'6e40f9e83a4be93874bc97cdebb8da6889ae2c7a',
+'3efc940c312ef0dfd4e1143812248db89542f6a5',
+'a0cf03f7badd0c3c3c4ea3717f5a4fb7e67b2e56',
+'a544e06f1a07ceb175a51d6d9c0111b3e15e9859',
+'199d986ed991b99a071f450c6b1121a727e8c735',
+'33bac6104b0ad6128d091b5d5e2999099c9f05de',
+'76d7db6e18c1f4ae225ce8ccc93c8f9a0dfeb969',
+'f652f3b1549f16710c7402895911e2b86a9b2aee',
+'63faebb807f32be708cf00fc35519991dc4e7f68',
+'0e6730bc4a0e9322ea205f4edfff1fffda26af0a',
+'b61a3a6f42e8e6604b93196c43c9e84d5359e6fe',
+'32d979ca1b3ed0ed8c890d99ec6dd85e6c16abf4',
+'6f18190bd2d02fc93bce64756575cea36d08b1c3',
+'68f525feea1d8dbe0117e417ca46708d18d7629a',
+'a7272e2308622ff7a339460adc61efd0ea8dabdc',
+'aef843b86916c16f66c84d83a6005d23fd005c9e',
+'be2cd6f380969be59cde2dff5e848a44e7880bd6',
+'e5eb4543deee8f6a5287845af8b593a95a9749a1',
+'534c850448dd486787b62bdec2d4a0b140a1b170',
+'6fbfa6e4edce4cc85a845bf0d228dc39acefc2fa',
+'018872691d9b04e8220e09187df5bc5fa6257cd9',
+'d98d512a35572f8bd20de62e9510cc21145c5bf4',
+'9f3ea255f6af95c5454e55d7354cabb45352ea0b',
+'a70cfbfe7563dd0e665c7c6715a96a8d756950c0',
+];
diff --git a/mojo/public/dart/third_party/crypto/test/sha1_test.dart b/mojo/public/dart/third_party/crypto/test/sha1_test.dart
new file mode 100644
index 0000000..95d973b
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/test/sha1_test.dart
@@ -0,0 +1,569 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Library tag to allow dartium to run the test.
+library sha1_test;
+
+import "package:crypto/crypto.dart";
+import "package:test/test.dart";
+
+part 'sha1_long_test_vectors.dart';
+part 'sha1_short_test_vectors.dart';
+
+
+void main() {
+  test('expected values', _testExpectedValues);
+  test('invalid use', _testInvalidUse);
+  test('repeated digest', _testRepeatedDigest);
+  test('long inputs', () {
+    _testStandardVectors(sha1_long_inputs, sha1_long_mds);
+  });
+  test('short inputs', () {
+    _testStandardVectors(sha1_short_inputs, sha1_short_mds);
+  });
+}
+
+void _testExpectedValues() {
+  var expectedValues = const [
+    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
+    "5ba93c9db0cff93f52b521d7420e43f6eda2784f",
+    "3f29546453678b855931c174a97d6c0894b8f546",
+    "0c7a623fd2bbc05b06423be359e4021d36e721ad",
+    "a02a05b025b928c039cf1ae7e8ee04e7c190c0db",
+    "1cf251472d59f8fadeb3ab258e90999d8491be19",
+    "868460d98d09d8bbb93d7b6cdd15cc7fbec676b9",
+    "6dc86f11b8cdbe879bf8ba3832499c2f93c729ba",
+    "67423ebfa8454f19ac6f4686d6c0dc731a3ddd6b",
+    "63bf60c7105a07a2b125bbf89e61abdabc6978c2",
+    "494179714a6cd627239dfededf2de9ef994caf03",
+    "2c7e7c384f7829694282b1e3a6216def8082d055",
+    "cff9611cb9aa422a16d9beee3a75319ce5395912",
+    "e51f9799c4a21bba255cf473baf95a89e1b86180",
+    "f741644ba6e1bcf5fee6d3c1b6177b78468ece99",
+    "fb1d9241f67827ce6dd7ac55f1e3c4e4f50caa03",
+    "56178b86a57fac22899a9964185c2cc96e7da589",
+    "0a0315ec7b1e22a79fc862edf79bda2fc01669e3",
+    "32af8a619c2566222bb0ba0689dabcc480c381d5",
+    "d35b5afbc48a696897c084e6e71aae67c7cd9417",
+    "602c63d2f3d13ca3206cdf204cde24e7d8f4266c",
+    "a3c6fbe5c13e8b41fadc204c0cf26f3f214189f4",
+    "25e480e9e0ca2b610105cd1424b8a35f63fb3981",
+    "45412d51d3ca7bcf452d1612720ee88f9d2427c3",
+    "ed6a95036e3e046931597a457db7a78b7309c4c0",
+    "b4fe0256d346700783420e08a4a6f7992b1e36c9",
+    "33e1799e98280e5a9ace5509477a2048607c5537",
+    "cf193837f6de43f8e38000acfcf764fa8d8fde22",
+    "7c8de247dda83599af2ec2ee2d29e20583dac34b",
+    "f38a076f70613fc251c4d21e6435ad08341a8a99",
+    "dcd68e6174bd74ba180da047a7345e8d111f85fd",
+    "43bbacb5f62a0482cbdb564171b04365ca6e27c0",
+    "ae5bd8efea5322c4d9986d06680a781392f9a642",
+    "eb90bce364635c4c23b49f493f0043579bc85c17",
+    "2942c7afa65444c43d0592d0dc73ca71db729205",
+    "abf726f5fda729fb7f3f0484d7c94b3107aa02ae",
+    "75db4f6bcc05a781dda9d17c46717286dd53654b",
+    "a82cb42d89daf5fbc1d4a48476229c495782f98d",
+    "fc1a69683744af823cd69e8a1e3f460591714028",
+    "dc68db44b48521b0700a864896a00e17777aea83",
+    "cc9ad99e917042381b0f99588896cbf236aa8ed3",
+    "ec7a68484a749c7065c6b746f9c465dcb414f370",
+    "c627c449deff14ae7ed807293d30846f061da5b8",
+    "4782f2a19b6dbb0882d656de86c3d21a7317f768",
+    "02d4eed99e7307bea39af5330bf7fb388d48b496",
+    "b3d99b9d90a69e50fd4365704f5ab2eab7bc9763",
+    "9b1c07176bb227f73e8a4e173071d39302061de2",
+    "d79097ddac552a6e02a52ce7aaf494d2d73b2557",
+    "df7f23b160e75b9bae5ea1e62b43a5a34a260127",
+    "f598f3780d8c374d97957b9b62d56106e9e0b2d2",
+    "0bd98598f9ab29c1359ef5460a206dd1370515e3",
+    "e6c320834f69d81689e1ecd5abc808d49d9c4e07",
+    "fd5ee7588cd129e12b886974621fd29facc78e19",
+    "2a9c28ef61eb536d3bbda64ad95a132554be3d6b",
+    "cfae6d86a767b9c700b5081a54265fb2fe0f6fd9",
+    "8ae2d46729cfe68ff927af5eec9c7d1b66d65ac2",
+    "636e2ec698dac903498e648bd2f3af641d3c88cb",
+    "7cb1330f35244b57437539253304ea78a6b7c443",
+    "2e780486f64bc91fbfa2785ec1ca5c9e3cc07939",
+    "4a7713d44e97d9f09ae1d786199c58ae2bfaf3eb",
+    "c98714b16f92c8a770e9fc229df834d1688e282f",
+    "aace3dd6f54a2a255aba920f5ffc8cf04b85a69a",
+    "cf8563896a3b0a0775985d8289444c4bbc478da7",
+    "6d942da0c4392b123528f2905c713a3ce28364bd",
+    "c6138d514ffa2135bfce0ed0b8fac65669917ec7",
+    "69bd728ad6e13cd76ff19751fde427b00e395746",
+    "ce705b7c60d46e7e36fe073db8822698579ca410",
+    "c717ebbf6a2bf1bb33da6257352d5085bee218b3",
+    "86151d140aafc9a4b5877d3fbb49014fe5906e57",
+    "7446b5a6bbcc58bc9662451a0a747d7d031f9a7d",
+    "c24887924f92adac5ae367995d12691c662b7362",
+    "5af83cfd42d61967778889ca911cfb6c14339ba7",
+    "587d4f6e6b4e21343423e434679009cbd3d24dcf",
+    "ac65dd946c5cc432d4d624caeb53c7363f96b7af",
+    "fa71e70750674c0f6b4aa19d0be717b2936c83fd",
+    "c9efe6dd0a019315f73f3962de38b6c848a1705b",
+    "d1d05649b952c8f6eb016be08fe1544aac5d5925",
+    "cc3081ac1d695bae51cfd5b44b9fb3a230733cc3",
+    "eb9de332558953792687d9a7f598b5d84bf0a46b",
+    "39de5efdc92e3d3678f24d2cf545ba4d172d003d",
+    "399dbc9f721e44a992a0def42d999b32af449adc",
+    "996a2817c8acbc667e1c4c27b8f4e9952736dd7a",
+    "3ef8189ce1bcc0d65aa182b1a81534635edfdf2b",
+    "d676714c6a6ff4e17a60c0511c25aa8b164fa606",
+    "4db6e3381e1b9290267c1539e1053793c8b81fa1",
+    "3a34d35b0296fe4d83eda39b742a9d8f4b13a958",
+    "54f3b45304ef1287f54b877fcce3285e154f9d6c",
+    "b1ea96216e025377ab5aa845238fc8bc65dd60e1",
+    "bc6c7488145485dede1ae1d43b594f0046bcda0f",
+    "3d9a0619ecf88c84ce86213e9aa91d9a252cbc32",
+    "92ccaa0b4ce89e2bd80a61b9bafd5ac58ab7b588",
+    "3eb326b5bf4440fb3a88e3dcb05c1db5ea01ac5c",
+    "989c63e819b13d4cadfb33f8deafbc57c1992a12",
+    "ae944552c20cf16f07a5c357713832c9d72d0c6b",
+    "46723e982569a1e2d9edced5498fc1f46f7d63fc",
+    "3bc5dae7907c83a0693f87fd8372efdd1df53e09",
+    "96d281ba44eb21ecfb1663c8ac5752c48686a927",
+    "fa0ef18178880a72b51c26555c10f5210dab4390",
+    "0c7ecac32b8ed6d9835d381bf069568722a276e1",
+    "649e44ecba85c0938ec09229cee4bb69388ec642",
+    "1e6634bfaebc0348298105923d0f26e47aa33ff5",
+    "af2af2734bb2baa288940cb62109f4849daa347f",
+    "22d14bc045cc9a3794c99beee7abe278bf24d6d8",
+    "c3164ccbed75b82ed3f59f4a47fe09b256025549",
+    "c27b5bc7cd24de4913614a769a442e9cc9fb0e08",
+    "f44d48d98cac77522ff6b9e1b9cbb8489e58e588",
+    "ea19a71ffbec9572f6cd65523acaf865ec05ab52",
+    "cda0eb9d310247bd1e8b3ea10d9b9deff6fbaba9",
+    "449dfce971b9d65d69fbc72940e9a885e8dde9ce",
+    "96eebb6b95a9da99c58190cbd77cd6fbcf638a79",
+    "670f7a869e90ce86e0a18232a9d4b1f97c1c77d0",
+    "bc544e24573d592290fdaff8ecf3f7f2b00cd483",
+    "e4ce142d09a84a8645338dd6535cbfaaf800d320",
+    "1c26461e26eb697ccc36a98714ee70caaa87a84e",
+    "51c5b1c25a71ff00394a84ab48b5733c8955551e",
+    "84803504181c0ae33a511c49af5015a5b1892bfd",
+    "7cc8bca120c2635abfea82dd203112b5c7e165da",
+    "44e2519a529d7261f1bebedc8ed95e1182cae0dc",
+    "2a81372da39c1df4251539a9922717b7cf5f0334",
+    "41c89d06001bab4ab78736b44efe7ce18ce6ae08",
+    "d3dbd653bd8597b7475321b60a36891278e6a04a",
+    "3723f8ab857804f89f80970e9fc88cf8f890adc2",
+    "d031c9fb7af0a461241e539e10db62ed28f7033b",
+    "e0b550438e794b65d89b9ee5c8f836ae737decf0",
+    "fb3998281c31d1a8eea2ea737affd0b4d6ab6ac2",
+    "7a914d8b86a534581aa71ec61912ba3f5b478698",
+    "a271f71547442dea7b2edf65cd5fbd5c751710aa",
+    "89d7312a903f65cd2b3e34a975e55dbea9033353",
+    "e6434bc401f98603d7eda504790c98c67385d535",
+    "3352e41cc30b40ae80108970492b21014049e625",
+    "6981ed7d97ffca517d531cd3d1874b43e11f1b46",
+    "76382259107c56b3f798107a8acc62b32d8ec2c6",
+    "548538582fd2e877b023be0611150df9e7ca99e8",
+    "54152ac7d9f4e686e47d3a74d96229c33793d51b",
+    "40e1b424cb6f13453ea005d077adb732b2fb9084",
+    "a47fd7470c43f7cb7e5dd4159fb0c11644f6a108",
+    "4ab5a4f084d4d95894078e8d570eb0bff13c6286",
+    "5f9de1b34863866e2c644fee51ec0bed7d6b7d91",
+    "2425097e0fea366d916d919f690e99cb6594d370",
+    "1e2cf1d35240f0b37d056c69c18ab95559e311d8",
+    "25fb08a7408a380b19074fa547f4fc4eb7d303b9",
+    "e38c3774d31cd2ab4079c38abd7876fe1ff8c1cb",
+    "e06dfc04b000d187b8bd6b539c884581e49a7b48",
+    "027f9a54264ed75254e00c6a8f821630d780c6b3",
+    "a86906b83ee8851520e2e628ab6295ce3497a2d3",
+    "3ba5b1a7c92cf4e749995b819cea8c37e479f433",
+    "e192f0d9326d7a0406b343d89e6c1b0bd1bbfb76",
+    "e5c31d8a5d94c54aba514694cb0ddcd835b328de",
+    "77237ee62b7ea8504451b6372289bba5d46d15a1",
+    "11e85e204f22d0784746ffdcf8c5bc0b5de6a211",
+    "6a2bc12e4605f27fce8c2e90a387e7dee901e48f",
+    "8c696b02e3bd3f7fb02ff852ee8bf8d1d3c9c75c",
+    "75a73cd24385a1e1768adddb23b3d7183cbb2f00",
+    "3c1a0181f2b5d470bf78df6dd596d85f63e4d855",
+    "0be0dc00e59482a360f21199abe9974a85047da2",
+    "b853306aa29ebbea560c61eb1f9a2f740b45b6c8",
+    "5e477b0a9dfe6225bdab510bd87bcecc59bc2497",
+    "9112798181ba4cc1c528a70729cf784115ca69f6",
+    "d741bec70d9070cee9960c5043a2773051e4cbaa",
+    "7135cdf89a331ca5cf339d414a950afa9e2bd786",
+    "aca27247604a6960e513b1eea56146bb4e443c47",
+    "cee02aef5cb718ab5838c9673deb86f47f479f68",
+    "cd024743ff967bf59d595461f549efe50ae155f6",
+    "c100aaa2cc196af36fcdc403e99f04f357c88131",
+    "2f33512a40135a515b68bf53b09844678c7548a1",
+    "3416bd9a3f79dbc063fff2c25bbd760831bf49cb",
+    "679256809caa8eb74c086b8c3a0e2d4abf850f86",
+    "476d4a88a9dabdf50e65dfb207b7117ff9d6e2f4",
+    "9af88ed103f83fab906e5851728b4d47c31cc5cf",
+    "c0733dd1c6ff8f9b1463c3e3ddd299cd3f81d8f0",
+    "5b19b45105657e67a75d290e52b0b12b7cb54fb5",
+    "aa6cc574968f08a0a975fbc65ae1c673125a38b6",
+    "1b3e6fa3c2a28bec0d42f4db58190bd393d372d4",
+    "97019771490e12f6b89b581c7df82ec1e250652b",
+    "37452dde0527a88d2beb55b5b98eebeceaa2b464",
+    "5ada134688493c8ff0298563b6d37e0c2b820818",
+    "27c194fd8566a2c5eff8d00a9ad2febf8105846e",
+    "b692e7fdf82422566df39942a262647fc27544db",
+    "a8df45ea509a4abbb0a9ed2af668040ab420ccca",
+    "b9aa0fd55e3da81095d899e52d6427406779e6c7",
+    "e308d9ea4b329e5ce3ae1ca31cdfc59b687cb7a7",
+    "7366daa91f296da16fc931b8d820c671674c73b1",
+    "b44ab5276973cfccf3b6e1b50f78d1dccae35e0b",
+    "48a9d63f99faea8f26c8f9b37ae8650419767808",
+    "356301d2c18c60cbf761e8820e78b2670a54ba83",
+    "c82f43012f075b3be2018878d30ba404ccde3b5d",
+    "b3d1e00b9f264ff969f7a16c6ae3901f9edb933e",
+    "0446503bbb165ad4e747ebe9e040a550cf6ea1c4",
+    "f4e0b1d08f68e38c83604fda8266535965955131",
+    "38dfba530b2a3b77c25816472c44c03b7e32fe9d",
+    "f079c4078b90472d5a6de034133e6fb6bbb16745",
+    "453e806d74a27e554f2a3395ce7917919bf3bde6",
+    "995b6f0c8f9eda20f3e5a2bd89df908747900008",
+    "c7b4dbb98c78008fd53159174b7baadf250fa5a9",
+    "2407f4de74bc711d0071476eccd73370bb6fbd0e",
+    "56b81cf38a7ad1eb515a8e21af35b308f4977cfe",
+    "de45d743c21cbe75d718086178ce454ced1dfa1a",
+    "9dcc4b7304e7305639ff55e78bf538e6e4bdc847",
+    "63cdae0a07072e387cdbcac4f73bfb0ed66432f6",
+    "20431c9fd7ed84d31937901e6c2f2263e22f2915",
+    "54d11e99127d159799dbce10f51a75e697780478",
+    "b9ae613785fc3061f9df6a4f1e86e6252a6004b3",
+    "366ab5426763b78563de648d831e6e8f02e16c4a",
+    "b5a7a52b733421f97a37319fe3580a4ba2b86a11",
+    "8ed72f03309e7ab31964e4dbfb25e8ab41684124",
+    "5afd9a289b4fce41efb7a77a2baa9314f9f11cf5",
+    "21d0451e21cae775b5f718886fd59b2ea9e9e787",
+    "696cd0f2c8a6e0fce77fac490b70621a71c51e38",
+    "5bcd7ae76d23e39340ef0a0f2fd38ddaa3b4b733",
+    "0e68e78d5d668479992fd6a7ea2879f1c0b44403",
+    "f93dbecda2f86c5c52936e986a582680bcc10953",
+    "e9ef3322618fd7db744b674620bac1d2427c79e5",
+    "2febe02de9105bf3ee4412c79c7c3df1044037ed",
+    "4f60bb9f2c379b6c6b95003d54a4b4dae47889e8",
+    "f2ce6d9c33c6dea70d4a6955f4d00fa8371e54d4",
+    "c012e1bbaac2cb4b7074a859bb98e469177e1afd",
+    "7c5c4cb81d270a5a41f7a41e6124e6028070ee97",
+    "669702442cabc5b51604234fd8ef37062a6cf11a",
+    "0b5febebdc3f4f31d6c5c52b83ef2a06c262ef8b",
+    "cf5d815b01a6a3952ff81a688341222dcbb853fe",
+    "845c71d2b20913850ef1fcfec5606412256639ab",
+    "861c969227f1043620c9833c2580e64bf4cf52d5",
+    "55241a343ca97a602f7a6c71183fe8976999651f",
+    "1d298771d3d6c35899c5604660c1f6c77d1e71c1",
+    "580cc8968318c3bf61ce62aa2ded2b15777de522",
+    "65bb4da1216214d7962733a372e78966bdfda5d5",
+    "17565818c45a669aa6bdd25a7c5c121120704731",
+    "1ad5f3869d8b92fdc30b81b06e21b9be866e103f",
+    "9b181c583aa16426c200931bfe5d4e6c269e6ca2",
+    "60c456ecebd7834f3fa8d1f4307449bf41616740",
+    "bd4c73a0a8748c627879652fad3761fd7ac36c4c",
+    "0baa214b983e58e39ecec9bf2bd537a10b2071ad",
+    "642c7c6166e4dd09183e1b32dfa62f6f3dfc8ad7",
+    "9beb03f7c76da0de2bf22a08efd1e2bf07274f0d",
+    "a0d8782e1eeccc7bb104a4c38f79f8541383fb1d",
+    "1c1b52a04ac3aa838a3698395aa3d934784b4b50",
+    "b844b4f08c5255fa66158fa18ad57154af1aa840",
+    "c07f9c996bf7327dfb47c82eb6b8bda1af065e2f",
+    "1b9fbff4d5a61741c90b6f040eac211285294510",
+    "2e4766b0ebf480a027ae6f9e59e7a2ef9e2aef2a",
+    "f7b8e5e76e6b4cb3dfa7af7070d5560400822b65",
+    "54717f94e8f3ded40b4cc1a470eacb25cb10136f",
+    "e2fce1365029e7d2e8c81f5b1f6c533629ef3752",
+    "7d7bd28f79bfba1b69dcb45f81a423d1730b56d8",
+    "1a17d4c4c689817bc9e5dce38ef79ea684eb8976",
+    "1250a5f131121f1fc0aa77d3d6dfd641526f266a",
+    "43c87ab4ed185c57ab3ccd9d89017897a4e77504",
+    "5a7d9a1c26ef0cb99fa2d7e970b19ccf5a5e4229",
+    "431e10ef7681217c353a54302c611661f5d8aa75",
+    "c572caf20d5aa8b6a8faf99f6628594fe3ddf81b",
+    "a1219d23a9efaaede86c392888a18f995b15e8e2",
+    "be9a388016c3973d9b4a8d0c2c7fb9a6d254370e",
+    "bb260e71e8bd5ed2baf5d9038600032669086ce3",
+    "10fdd35f361b080323b86b47c893cfb13879c028",
+    "154c3aed514692dfef86d89cf1dfbc4f8f1bfc92",
+    "fa2c27c443e60a0bcd8a1eb82d20fec20759c03e",
+    "4916d6bdb7f78e6803698cab32d1586ea457dfc8",
+    "89d6d7a79dfc4c2588e5ba3726d163faa67c4249",
+    "4bc7dfa199db2cc10d6fa1acbe2bea402c3f69f3",
+    "ec485bc69fb3660cdd7c650a8da191c958273534",
+    "1fb3afbdcd58e4edcd92c49f22d4caa0581749a1",
+    "0183c0e82beb55c6b2bc24b89df5dd64b87d22d8",
+    "d8dc481dbe69b312789e85b0284c114108a18bac",
+    "296f1f75500286b9b4e5ac80fba1ea8452d40792",
+    "205c3b9ed40f9f92a70e5920b85707f50689a618",
+    "77ce91d45055ca41c52fa6f9a9c3117b2aee9611",
+    "fe4c72354229cb1b9c9a05dde2ffa93ff6d12400",
+    "48174534cef0fc3fec5b1a6dadfba2281c4195bd",
+    "202413d6ea5edda76cd27e81f8700d0b379ef58e",
+    "699b731a830041cc7afc2a0e8f48df1146abb75d",
+    "3a5f338bf04229f9e45e1402988bd5c59dda930f",
+    "8c620f2651c8ad1a40f4aa2fc0687848c6db1d75",
+    "743fa8d2c15ddaa8923904ba6c2f61db15f5c71e",
+    "ee065a446ffac9e405bc0e30b8a595d898fd8f57",
+    "ba83d7ae664cde7a19ec33e839fa19b46beb7ee8",
+    "0941612acd729027440f6aeac58ac28e18a44cda",
+    "b4a3e1dab651d8e978abfa4c05c0cab1a33902f2",
+    "30666bf53a5fed4b7d6bdbc993348e56144bb1b1",
+    "f6a97e96436d9c5340009a497ba298d2901eb06d",
+    "dc0b98a0d1d20b974885aac995d8c484d6594d4d",
+    "62b3e62ba7f7194fed07c518179d0d86e4e20661",
+    "699b84e119bffbbffa1a228e92682f1f394cabcd",
+    "31ea9a067b4d9207bf4f4e4dbe3ce191cc754e05",
+    "5b9ab97c102fcfb39efda8b788a4a387f18a507f",
+    "a2f9fde34879a9e7f8caa9a21c2f2a4b47c24ede",
+    "4201b2664b010fa180ec54c37d8615b3055f8a81",
+    "84404983f08452a5ff4802e2f531602520d74546",
+    "cc0ea7cd6b40fa790570fc767b363d1482718cb2",
+    "0b0c30ce8a0770ee6a989e94bcf875494ed105d8",
+    "6f5f7e81f4102d4f76c2604d9a0f028e49c4952e",
+    "bab4994f3923af37ddbf54a1b69d5954852d1754",
+    "2c2a9d56d09c676a7b6500d3ee18b6e100cbd87f",
+    "58391cd702c86eec62fcfc9fbfff535410dfb150",
+    "e3510479f43a21b29fde3504af668d37bdbbb799",
+    "ac2369f558f15f080f68cd384fbe52f348a47e31",
+    "e090b0bf8c1b9e7607962a8523f02d82e8cc12af",
+    "262b8f0734bd8af3b42f21fefc9293a6c0bcf8d0",
+    "a4f2c68beca4ab5b4b3db1ae9d07cd1b35f9fffd",
+    "2ca39733f7a738c1fa8f515ffe2ff3ddc0c95c56",
+    "63d16097c9b701d65b33700e05512bc905b58443",
+    "bf77ecf143ceb21f1676c34b8d89c8bb3c43cc4e",
+    "862e4228ab561c475192bdbd03bb33c743fc0734",
+    "515e46b8fd51d614ca183cc8b3a076a9dbe3b70b",
+    "15cd4acbc372d214f88c908c92903c7acb958e32",
+    "26110861010beaef40f4590c701c0ff493f0ee27",
+    "bf7e80ffa9cbda63f72be2b83d732730cb953e97",
+    "d0900aeb1174173f7cc69d4788a61a574893d3b7",
+    "e79a9ff141c1279cec57f7ea34d4ac4d057f0834",
+    "a669f82976ca034e631533ce96e94b44e24dd2d8",
+    "7aab0fd3799c01adc27018aebca9b3a0e1a3d7fc",
+    "36248be03e0562a5306b30fcf7c4a4905cc41714",
+    "6bf234d718fd1f27bbfbff81fb7fd64a22ae6745",
+    "935ca3dfc9bfb1a3dccd5f794ab17e387441a4d2",
+    "bb6ac0036ee0a56803045317744d4269ecfd0e62",
+    "901406bf18a77ea00d526753957cb7423ee20b4e",
+    "b0fe8f32582fa72bddd26dd9599c8205117c6789",
+    "7d62100f74e829f7c5dd4db5817c530f3506813a",
+    "713b4f3bb5a983590b7cb3d8b68aa56abb396cd9",
+    "8e62281add5a87ba1b6df012b5fa25c7ec697265",
+    "ebaa706a4823c278319dfcae0cb4a042d13eb39c",
+    "c2e1fc39b890ff2b27ba8d0d355ef5704d792a8c",
+    "eefbfce3c1c225bb429d0f5bc2552210373aa2d9",
+    "4daea7d3291cdfb5bb13d522966c49bf1d692eac",
+    "efd657e983cc85ba14c91f33fa81cb55413fbda9",
+    "d33bce8f11c9f73666ae05446e0645235b29faf5",
+    "c0c549f0976e53d790ea9fd14aedf0a0cb86a678",
+    "44992a04e41a5cdb18833afe21a731c2b424b990",
+    "6233b62e68349b3b17ffd9eaa7395b8521e31d38",
+    "85d7f914b07ea2df148d5b1ed22f44928fce3a2a",
+    "a2a0b0917c454ba4cb1ee2c61dda863004542ed1",
+    "2411673903f84144bc5ee990f1b9160796196f1b",
+    "6ee6dd69ff465b3bbd0c72048df09f001958419e",
+    "c4493400da60de7e324dd0328ca5e3429d273c14",
+    "a9ea2b10ea549303f8a5448f3921449ce25b8c36",
+    "89725b40e71e1c0b27a68378a9e0ee0b2b0953b8",
+    "cab92400df0b6b54e05d22b6ede2a2e5a623714e",
+    "615653835fa024decf05ab5051fcabb4c6ecf853",
+    "dccbb727546f111a22dbfe140aeb1ca04d74195c",
+    "5d70ca252c600d686da9dd797018545aef3be66a",
+    "a4b6a68e3b0e76d9d97b1323f8ebf752ab8b9815",
+    "9fca700f9b8eb2159fade3e194a26a203270da3c",
+    "69f3f034ffbe3f8881c47e96d8a3c25d108b0b39",
+    "ccecfaa2c49a05caecd260b67e06b3db579aa0c8",
+    "fc97a9f84b147b2244a9c68ed6e42a2b443102e9",
+    "d64305c4b5c334fe9777f4a4c0c82389b289ff1e",
+    "bc04cd94abdf3c177c38572e0b070cfdc6bb615d",
+    "a96053be94fe5646d44c8455783180d5ad7d2ee8",
+    "d34c409ea103ec1a7d54336149f33f3688fafff8",
+    "660e49f0c60c8040ebfea6fbf9d4641bd29a50de",
+    "2f8a580637446865145b7bc1f1376e5827966b47",
+    "bca314aa8344c273ce31d86d05899c4dae043bc6",
+    "c56453208571fd9c5ecb07451ef0f3b93e057ad8",
+    "a238597192afa484d5c085938fe7e5ff5676c5e0",
+    "7c033b565ec87dd7355c42a1822f4478db8a5a06",
+    "2b0006ff2c586663fa9e60f0086ed31cbe263ae4",
+    "07497ffe076d1c6ab3115f8762959763d03a661d",
+    "5b886da6ce74d2392e79fbdf6573d37bd027e767",
+    "946aa1664ebf30f0c8a5297d0307130943516e8a",
+    "1fd32848d34600ec3dbec573897f6491f351e899",
+    "caaf2320f61e4902e0a76275eade0b7b696df011",
+    "188cf111bf5fac85bbd1234a725ae6d60c01b0be",
+    "5a4b75efd596c4b63b585de8bdd7ba32e5c9d51f",
+    "e6cde00bb218398b0746731df063d3bb566de2fa",
+    "5eccce82721de36778dc60bc2202eba25330ac6c",
+    "3f09e72b246a37847815cf6961c046fbe03a1b82",
+    "e41218b9952ed1fdf1c13f4764ce0464ab84da09",
+    "658e0bf69909da7ed06d0812743ea447f031ce20",
+    "351df1eb81e4c608b0f3ab639b4535176417a65e",
+    "8b1418a8864f2bed6f0a744d2a9bff79ce6e128c",
+    "61300adab058879efab23bec70c679a8764cd61c",
+    "c111d79fe3c572e5bb7b76665801304054f9460b",
+    "dbd3d71d83e8eb20ee962d516bc649cf7611bafc",
+    "3fd30a37347451c25842c635700d543a87159ec3",
+    "cdab33892deced0454e1918813b95444c008ad49",
+    "3e2e8c970e959b224f2333e4a9009b482e6863ea",
+    "db4a493a3da552ed75be5fe0d96f6e99e2fd8eeb",
+    "8b94a2c478e153ac9f5fc0b5de763b5124a1f70d",
+    "465059936302a4b0f5303dee926a54c983701c2f",
+    "4d2564abccc82edc1201f2f53975216586966c50",
+    "0b0aa6cf662dcd77e54d3ad8f4f3dc5cc27151a2",
+    "7918795cb32586b1e9e1024318e7eafa9b6ad18f",
+    "35b1bc29234467f581fdcd1eab41d4f5b4e12b64",
+    "abb9f092576cc104c714c930fc45ce4d64579119",
+    "4b21a2a5f59effb24c569761e6d81190178b4ada",
+    "69905ce9887ec25bba3431c58bc461cc198e216e",
+    "9550962ede872cdba5c76e4edd01e0af82627131",
+    "ba961c3cf1019b3ae55cf3cb4dfd63e56445a491",
+    "1daa88cc7b906174701a12cd4ee99db16f0ce895",
+    "1331b7f53c41c3af02675cf9bf9c90f766b15a66",
+    "4c79f5e36122bdd75f0441394e17c47d1610398e",
+    "47ca89f45df07b0cf76413b3e9501a673afaae92",
+    "aafd8ad6f2e4fc8a62a62f9aa0e4b7dfe3ced4ac",
+    "931dc6deca5a7bf14c7f09363b0128e7c2ed54c1",
+    "2860821a19639a36f466d9b609c18d8b925a17be",
+    "1b0833981cb628ba449413cf3b2298a2704aeb32",
+    "36e77b3b717a5157e12ec0c31e97cd7206da5fa2",
+    "de62d25749bd635d6bbe90c450277784a3c61cd0",
+    "dc060bc4abac7f859ce49196440be380973875ec",
+    "7f14938a411d1d43a518f616b89987754587e0a4",
+    "d213475a442062ca792da0365b65013b91bce3e1",
+    "568197b973327d6e1381fb787defb016554ff697",
+    "0f487f25e2c6d326d5842469151decd377808c31",
+    "944c6549c461c86e6efbb055ce984ce8cb477a3e",
+    "5ab47b9585d9fb2479153f5ddb34df05d0d92d2b",
+    "436104ec60d00a3d56f2715f4737b7a12141147f",
+    "c4a4e308300110262019dbbfb4e3d8ba25b15596",
+    "bc32be2415c6c9f7166cd72244aaebdb683ebc58",
+    "283d86c470fead74c4bf994cba027f7edf596747",
+    "7f387b0c27f3b2b273f85eaa35a93bf9d06d8a10",
+    "92aace99c76e474bb8adcba0a875b477fc360885",
+    "bb1cd0c8e0513222e530aa4e1f276cd3b13372ab",
+    "b837ddcbc1eb7084f3c28b6e05bcdb3fea844b56",
+    "d9a19e686d6c77640b10823a49e51b4eb8f51ee5",
+    "198d0a35c25c67b817f4851f5ce0d0056259fdc3",
+    "b5e6beb43c52ae185e2599db1927db7744335adc",
+    "761dc03843153110601ae87b6e36dc29ace16ef6",
+    "a64e92f4a324ad3ba3a116d561bd89036bc9eb71",
+    "18dc53328d39feb8cd31c172e1695093ceec915e",
+    "ae6082492d71f0ef80b402858803602ca3458153",
+    "ec6f78c1620e0bda60f630f36015226ac8639b25",
+    "c05239ff738a997fadd46525bf739e3e2c040e89",
+    "707e83ce4291c118051c5191e888c283b4e98399",
+    "cc14800d9ac3ef0c1f6731c9e70c7939c8dd0870",
+    "c5294dbe82ede53a2d8bb0418503a2deba2e4f3b",
+    "0455262dbd4b71218ed20f4162bbd0c3b7de4d07",
+    "6ccb4f7070d3c908830645cd552e3d6112d059c4",
+    "3974fab667fb7d746d5f088c6e277bfeee8128e7",
+    "065742e2a66d88b5652b2e40d46c4d50102f6db3",
+    "07fa47c9f269b323557182c61f6f6ed1c16ccafb",
+    "196987fbf33148ae33ce9f9733a97ea845cdc1c4",
+    "8139864a57098a32915f0e3aa6c0322fa9459fb6",
+    "1fcbf41589c8e7d92274e64ae6ed3ad9016c179d",
+    "055a0c549e6f648794cc65bddc08cfefffccdf9b",
+    "f956af32d67df97f6534357de15b216cc2d2d102",
+    "d7fea5323eea433ddb6277228ec0a5bc1ab4a808",
+    "083c9487c4469fda257aa45c8876ec8269aeebd8",
+    "9e88e459135e5f0b52ef6c371cca04a39d54b90b",
+    "b8c1ee8246d14bd62e5a03b94b848b534613e7d2",
+    "d26b97682f8acb1daf78be8c4418a0ebb17a05b4",
+    "68f2b5a79ddb450cd1b4d5d6e502979c9f157996",
+    "629e969018aa82b56389a3e601ef2a209f07cf07",
+    "2dca01e39393889210c566779afb65048a387785",
+    "d51c2f00f8c0fa2484497abe1bf85689c45d42ae",
+    "467dd26d49785595bba3d406de25f5df8fd8fd4f",
+    "72f9f715ea0aaf529be15e6afd7388e02341af75",
+    "25a5435435d5020c5a7cbbb84d3f9b5e8b2fb9fe",
+    "059d91ec492b6051340704b240b282d1fbe3d114",
+    "33fd244ba8454d234e7d6a8d04a55b78eff890c5",
+    "7d008c2d8d47bb97fc5dfe3de4559506e7fc4708",
+    "860ddab2982e9dac6cdd1e19f5c6c53dab82e4c1",
+    "4e39274189149868840fe7832230aa66483cd72d",
+    "c61b506b45d98fe6ce5422f8edf6f8bde43fd2df",
+    "97a8be86139d2732a9009525dff7cf77781acec1",
+    "1e83aad8918c5002eca3b07b071045d23a7213f1",
+    "d58d9ff6d19bd47651f3e2c766f869e6e07776ff",
+    "edbb172dc2004b81bf3937a0d3e54ea5ed642da1",
+    "1b144f648322f58caea9d31b3daf5ed686a3305b",
+    "0662edf0d072a4efcbb94fc855a35b0631007eff",
+    "446da0ba13c0c8cdec5dcb55beaff62f83822af7",
+    "3ecdc37d6ba572f691cf42654b182ce0cf4853e0",
+    "b9cf503328fc20919109b57a7785dbb664b2710e",
+    "8519d7c98bc7b7610ee96c047fb71ba73a441ca4",
+    "897e381dc5bac1eb7e8756dde6adae3ef2a081b8",
+    "8d1f32ea054e1d02370eb02c8ddd67bafd4138b2",
+    "d08fbd377a7f3689f881049f8c999e8c3616bdd2",
+    "ef9c6777079358192b922616871f6e6762d5a05a",
+    "63e2d52b6704f4660c1b6662a67acf385b4fb3cf",
+    "9fd8b020a14f2dd4be4ad5de13352ab8addbedaa",
+    "4481cc23334be067c5dfe87bffed1a1557fb5f64",
+    "dbb3e3d67acf2807afce8e9cdc3f670b1cfb67c2",
+    "0ab84832b324391f111b796e18dbdbf2c640f89f",
+    "742672e86dc79921ad0551daaa134baecb1f81f6",
+    "768e50efa6303a32043f7417f3360ffc3c9d4ba8",
+    "4fc6247f63a71000a794758c3d266d42acd39758",
+    "adfbec37138f84c212aab558a83e40570a349e1d",
+    "b8725701da5bb62ed2371788edb05daa9b42799a",
+    "10a0fe5f359d0f7bdcf10ed843b06a73338fa086",
+    "a30f11be717bc710d4d6dbfa02da4767eec14fc1",
+    "c0f1aba4346f0aca89f3ced0822af676a6835e87",
+    "89399c4a03e038efb7a97fe38ab3f6604f1fc37e",
+    "69ac5e45377465de71eed8a5527d7542130d8b2c",
+    "69a5899a88ad3922168116e523a59a19f5fdbe63",
+    "4da263905ead1900d957e11a24165aa5364da10c",
+    "b3f980c9a1a5939c21865e1430cdb6514c9f0787",
+    "195c2807c4b178c8d357d48560b759c70a5e1912",
+    "f5527b7bdfa0eb61b5b399c8a92ef72bcaa1dca7",
+    "60acf171a06b799678aa04c5ad2b999eba84f2e8",
+    "c357c94e288185c8c29ec2af829d159d296d5907",
+    "a7dc371d6a10326870be46b2cdf54803c4f05f2e",
+    "1f5e0cc507a3f9749d8c6377663626bd31aaa99b",
+    "8f352137a1e22f329086dd7b429049c7a8038718",
+    "879c2e232949b8ec6c9ee6529ee39d5dbc502b8c",
+    "aef44d7afe612259094ccd60494193225954bc51",
+    "1fdadca3d067bcc8db56715a9a492dfd2d4f5b3d",
+    "3b70d3d1cb0646f288537ed2695696c10b64d41b",
+    "8188a5ccd6e88caaf801c0373283c18a0b315bf9",
+    "75ebb8907480f01839e972a91051eccdd001619d",
+    "0ec661c8aa7e106c4e03acbcca84c3cd8eaaea6d",
+    "97da3e33e17f41d2187825d377bf0994c1631f89",
+    "5f7c53e4006f76cbd1777b01005d03482d616f75",
+    "50750f6ec4bdaa134369299de53d8d8b87d1ba63",
+    "5f8f7e823d4e54b02610108a86ea721e337864ec",
+    "d6cc685ba7b6ac3157adbb44c3f24c5a3c01ea67",
+    "61e297c05feecd9901ec06b314429fe6ca92f27a",
+    "d64a178d4759b796ec0e77626cf19257c28292fc",
+    "6ae457f71b1cd60b1810fd4379c90bb38154568f",
+    "063623280f208df296895ccd867dab8a73cf174d",
+    "7a8b8c9aa0591603cf08e94ec2ae6a6350cbb8a2",
+    "20c4232d3066c41e211eefe2834db78a8c083ea4",
+    "82fdf2cccc77ab556aa35557d0923b162d1b98cf",
+    "3dce8306f3c1810d5d81ed5ebb0ccea947277a61",
+    "11bca5b61fc1f6d59078ec5354bc6d9adecc0c5d",
+  ];
+  for (var i = 0; i < expectedValues.length; i++) {
+    var hash = new SHA1();
+    hash.add(new List<int>.generate(i, (j) => j, growable: false));
+    var digest = hash.close();
+    expect(expectedValues[i], CryptoUtils.bytesToHex(digest));
+  }
+}
+
+void _testInvalidUse() {
+  var sha = new SHA1();
+  sha.close();
+  expect(() => sha.add([0]), throwsStateError);
+}
+
+void _testRepeatedDigest() {
+  var sha = new SHA1();
+  var digest = sha.close();
+  expect(digest, sha.close());
+}
+
+void _testStandardVectors(inputs, mds) {
+  for (var i = 0; i < inputs.length; i++) {
+    var hash = new SHA1();
+    hash.add(inputs[i]);
+    var d = hash.close();
+    expect(mds[i], CryptoUtils.bytesToHex(d), reason: '$i');
+  }
+}
diff --git a/mojo/public/dart/third_party/crypto/test/sha256_long_test_vectors.dart b/mojo/public/dart/third_party/crypto/test/sha256_long_test_vectors.dart
new file mode 100644
index 0000000..40934a7
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/test/sha256_long_test_vectors.dart
@@ -0,0 +1,140 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of sha256_test;
+
+// Standard test vectors from:
+//   http://csrc.nist.gov/groups/STM/cavp/documents/shs/shabytetestvectors.zip
+
+const sha256_long_inputs = const [
+    const [ 0x45, 0x11, 0x01, 0x25, 0x0e, 0xc6, 0xf2, 0x66, 0x52, 0x24, 0x9d, 0x59, 0xdc, 0x97, 0x4b, 0x73, 0x61, 0xd5, 0x71, 0xa8, 0x10, 0x1c, 0xdf, 0xd3, 0x6a, 0xba, 0x3b, 0x58, 0x54, 0xd3, 0xae, 0x08, 0x6b, 0x5f, 0xdd, 0x45, 0x97, 0x72, 0x1b, 0x66, 0xe3, 0xc0, 0xdc, 0x5d, 0x8c, 0x60, 0x6d, 0x96, 0x57, 0xd0, 0xe3, 0x23, 0x28, 0x3a, 0x52, 0x17, 0xd1, 0xf5, 0x3f, 0x2f, 0x28, 0x4f, 0x57, 0xb8, 0x5c, 0x8a, 0x61, 0xac, 0x89, 0x24, 0x71, 0x1f, 0x89, 0x5c, 0x5e, 0xd9, 0x0e, 0xf1, 0x77, 0x45, 0xed, 0x2d, 0x72, 0x8a, 0xbd, 0x22, 0xa5, 0xf7, 0xa1, 0x34, 0x79, 0xa4, 0x62, 0xd7, 0x1b, 0x56, 0xc1, 0x9a, 0x74, 0xa4, 0x0b, 0x65, 0x5c, 0x58, 0xed, 0xfe, 0x0a, 0x18, 0x8a, 0xd2, 0xcf, 0x46, 0xcb, 0xf3, 0x05, 0x24, 0xf6, 0x5d, 0x42, 0x3c, 0x83, 0x7d, 0xd1, 0xff, 0x2b, 0xf4, 0x62, 0xac, 0x41, 0x98, 0x00, 0x73, 0x45, 0xbb, 0x44, 0xdb, 0xb7, 0xb1, 0xc8, 0x61, 0x29, 0x8c, 0xdf, 0x61, 0x98, 0x2a, 0x83, 0x3a, 0xfc, 0x72, 0x8f, 0xae, 0x1e, 0xda, 0x2f, 0x87, 0xaa, 0x2c, 0x94, 0x80, 0x85, 0x8b, 0xec ],
+    const [ 0x6b, 0x91, 0x8f, 0xb1, 0xa5, 0xad, 0x1f, 0x9c, 0x5e, 0x5d, 0xbd, 0xf1, 0x0a, 0x93, 0xa9, 0xc8, 0xf6, 0xbc, 0xa8, 0x9f, 0x37, 0xe7, 0x9c, 0x9f, 0xe1, 0x2a, 0x57, 0x22, 0x79, 0x41, 0xb1, 0x73, 0xac, 0x79, 0xd8, 0xd4, 0x40, 0xcd, 0xe8, 0xc6, 0x4c, 0x4e, 0xbc, 0x84, 0xa4, 0xc8, 0x03, 0xd1, 0x98, 0xa2, 0x96, 0xf3, 0xde, 0x06, 0x09, 0x00, 0xcc, 0x42, 0x7f, 0x58, 0xca, 0x6e, 0xc3, 0x73, 0x08, 0x4f, 0x95, 0xdd, 0x6c, 0x7c, 0x42, 0x7e, 0xcf, 0xbf, 0x78, 0x1f, 0x68, 0xbe, 0x57, 0x2a, 0x88, 0xdb, 0xcb, 0xb1, 0x88, 0x58, 0x1a, 0xb2, 0x00, 0xbf, 0xb9, 0x9a, 0x3a, 0x81, 0x64, 0x07, 0xe7, 0xdd, 0x6d, 0xd2, 0x10, 0x03, 0x55, 0x4d, 0x4f, 0x7a, 0x99, 0xc9, 0x3e, 0xbf, 0xce, 0x5c, 0x30, 0x2f, 0xf0, 0xe1, 0x1f, 0x26, 0xf8, 0x3f, 0xe6, 0x69, 0xac, 0xef, 0xb0, 0xc1, 0xbb, 0xb8, 0xb1, 0xe9, 0x09, 0xbd, 0x14, 0xaa, 0x48, 0xba, 0x34, 0x45, 0xc8, 0x8b, 0x0e, 0x11, 0x90, 0xee, 0xf7, 0x65, 0xad, 0x89, 0x8a, 0xb8, 0xca, 0x2f, 0xe5, 0x07, 0x01, 0x5f, 0x15, 0x78, 0xf1, 0x0d, 0xce, 0x3c, 0x11, 0xa5, 0x5f, 0xb9, 0x43, 0x4e, 0xe6, 0xe9, 0xad, 0x6c, 0xc0, 0xfd, 0xc4, 0x68, 0x44, 0x47, 0xa9, 0xb3, 0xb1, 0x56, 0xb9, 0x08, 0x64, 0x63, 0x60, 0xf2, 0x4f, 0xec, 0x2d, 0x8f, 0xa6, 0x9e, 0x2c, 0x93, 0xdb, 0x78, 0x70, 0x8f, 0xcd, 0x2e, 0xef, 0x74, 0x3d, 0xcb, 0x93, 0x53, 0x81, 0x9b, 0x8d, 0x66, 0x7c, 0x48, 0xed, 0x54, 0xcd, 0x43, 0x6f, 0xb1, 0x47, 0x65, 0x98, 0xc4, 0xa1, 0xd7, 0x02, 0x8e, 0x6f, 0x2f, 0xf5, 0x07, 0x51, 0xdb, 0x36, 0xab, 0x6b, 0xc3, 0x24, 0x35, 0x15, 0x2a, 0x00, 0xab, 0xd3, 0xd5, 0x8d, 0x9a, 0x87, 0x70, 0xd9, 0xa3, 0xe5, 0x2d, 0x5a, 0x36, 0x28, 0xae, 0x3c, 0x9e, 0x03, 0x25 ],
+    const [ 0x82, 0x82, 0x96, 0x90, 0xaa, 0x37, 0x33, 0xc6, 0x2b, 0x90, 0xd3, 0x29, 0x78, 0x86, 0x95, 0x2f, 0xc1, 0xdc, 0x47, 0x3d, 0x67, 0xbb, 0x7d, 0x6b, 0xb2, 0x99, 0xe0, 0x88, 0xc6, 0x5f, 0xc9, 0x5e, 0xd3, 0xca, 0x0f, 0x36, 0x8d, 0x11, 0x1d, 0x9f, 0xdc, 0xc9, 0x47, 0x6c, 0xd4, 0x06, 0x5e, 0xfc, 0xe7, 0xc4, 0x81, 0xbe, 0x59, 0x85, 0x37, 0xf3, 0xf5, 0x3b, 0xbb, 0xb6, 0xff, 0x67, 0x97, 0x3a, 0x69, 0x83, 0x74, 0x54, 0x49, 0x9e, 0x31, 0x39, 0x8b, 0x46, 0x32, 0x88, 0xe3, 0xaa, 0xfb, 0x8b, 0x06, 0x00, 0xfd, 0xba, 0x1a, 0x25, 0xaf, 0x80, 0x6b, 0x83, 0xe1, 0x42, 0x5f, 0x38, 0x4e, 0x9e, 0xac, 0x75, 0x70, 0xf0, 0xc8, 0x23, 0x98, 0x1b, 0xa2, 0xcd, 0x3d, 0x86, 0x8f, 0xba, 0x94, 0x64, 0x87, 0x59, 0x62, 0x39, 0x91, 0xe3, 0x0f, 0x99, 0x7c, 0x3b, 0xfb, 0x33, 0xd0, 0x19, 0x15, 0x0f, 0x04, 0x67, 0xa9, 0x14, 0xf1, 0xeb, 0x79, 0xcd, 0x87, 0x27, 0x10, 0x6d, 0xbf, 0x7d, 0x53, 0x10, 0xd0, 0x97, 0x59, 0x43, 0xa6, 0x06, 0x7c, 0xc7, 0x90, 0x29, 0xb0, 0x92, 0x39, 0x51, 0x14, 0x17, 0xd9, 0x22, 0xc7, 0xc7, 0xac, 0x3d, 0xfd, 0xd8, 0xa4, 0x1c, 0x52, 0x45, 0x5b, 0x3c, 0x5e, 0x16, 0x4b, 0x82, 0x89, 0xe1, 0x41, 0xd8, 0x20, 0x91, 0x0f, 0x17, 0xa9, 0x66, 0x81, 0x29, 0x74, 0x3d, 0x93, 0x6f, 0x73, 0x12, 0xe1, 0x60, 0x4b, 0xc3, 0x5f, 0x73, 0xab, 0x16, 0x4a, 0x3f, 0xdd, 0xfe, 0x5f, 0xe1, 0x9b, 0x1a, 0x4a, 0x9f, 0x23, 0x7f, 0x61, 0xcb, 0x8e, 0xb7, 0x92, 0xe9, 0x5d, 0x09, 0x9a, 0x14, 0x55, 0xfb, 0x78, 0x9d, 0x8d, 0x16, 0x22, 0xf6, 0xc5, 0xe9, 0x76, 0xce, 0xf9, 0x51, 0x73, 0x7e, 0x36, 0xf7, 0xa9, 0xa4, 0xad, 0x19, 0xee, 0x0d, 0x06, 0x8e, 0x53, 0xd9, 0xf6, 0x04, 0x57, 0xd9, 0x14, 0x8d, 0x5a, 0x3c, 0xe8, 0x5a, 0x54, 0x6b, 0x45, 0xc5, 0xc6, 0x31, 0xd9, 0x95, 0xf1, 0x1f, 0x03, 0x7e, 0x47, 0x2f, 0xe4, 0xe8, 0x1f, 0xa7, 0xb9, 0xf2, 0xac, 0x40, 0x68, 0xb5, 0x30, 0x88, 0x58, 0xcd, 0x6d, 0x85, 0x86, 0x16, 0x5c, 0x9b, 0xd6, 0xb3, 0x22, 0xaf, 0xa7, 0x55, 0x40, 0x8d, 0xa9, 0xb9, 0x0a, 0x87, 0xf3, 0x73, 0x5a, 0x5f, 0x50, 0xeb, 0x85, 0x68, 0xda, 0xa5, 0x8e, 0xe7, 0xcb, 0xc5, 0x9a, 0xbf, 0x8f, 0xd2, 0xa4, 0x4e, 0x1e, 0xba, 0x72, 0x92, 0x88, 0x16, 0xc8, 0x90, 0xd1, 0xb0, 0xdb, 0xf6, 0x00, 0x42, 0x08, 0xff, 0x73, 0x81, 0xc6, 0x97, 0x75, 0x5a, 0xda, 0xc0, 0x13, 0x7c, 0xca, 0x34, 0x2b, 0x16, 0x93 ],
+    const [ 0x5f, 0x66, 0x4b, 0xe0, 0xc0, 0xf3, 0xd2, 0xfc, 0x9a, 0x1a, 0x7e, 0xd6, 0xb5, 0x15, 0xef, 0x9c, 0x52, 0xad, 0x1c, 0x7f, 0xb3, 0xac, 0xf2, 0xc2, 0xde, 0x94, 0x3e, 0x10, 0x9f, 0x91, 0xcc, 0x12, 0xcc, 0xad, 0xd0, 0x41, 0xcc, 0x43, 0x86, 0xf9, 0x5a, 0xb6, 0x16, 0xcf, 0x87, 0x62, 0xba, 0x25, 0xfe, 0xd3, 0x22, 0xfc, 0x8c, 0x35, 0x18, 0x09, 0xe0, 0x0c, 0x60, 0x0a, 0x8f, 0x26, 0xe2, 0x5a, 0x5b, 0xcd, 0x0b, 0xc3, 0xb4, 0x41, 0x70, 0x94, 0x7f, 0x65, 0xb4, 0xf4, 0x17, 0xb8, 0xac, 0x76, 0x91, 0x87, 0xc2, 0xee, 0x45, 0x61, 0x97, 0x82, 0x89, 0xcc, 0xed, 0x04, 0xc0, 0x36, 0xc3, 0x7f, 0x94, 0x2e, 0xc1, 0x0f, 0x7f, 0xd4, 0xd7, 0xf6, 0x90, 0x8e, 0x22, 0xed, 0x6c, 0xfd, 0x0f, 0xb8, 0x93, 0x30, 0xc2, 0xfd, 0xe4, 0x17, 0xb9, 0x56, 0x64, 0x3a, 0xac, 0xa5, 0x3b, 0xaa, 0xb8, 0xa8, 0xff, 0x38, 0xbd, 0xcd, 0x35, 0xe6, 0x05, 0x47, 0x15, 0x9b, 0x26, 0x61, 0x8e, 0x1b, 0x29, 0x12, 0x8a, 0x35, 0xeb, 0xd2, 0x73, 0x3f, 0xc4, 0xad, 0xf6, 0xbf, 0x67, 0x96, 0x07, 0x6b, 0x09, 0xfd, 0x25, 0x54, 0xc6, 0xa4, 0xdf, 0x5e, 0x40, 0xae, 0x97, 0xf3, 0x89, 0xf9, 0x86, 0xf8, 0x43, 0xad, 0x00, 0x00, 0x05, 0x15, 0xf9, 0xc0, 0x01, 0xae, 0xc9, 0xc4, 0xe4, 0x7e, 0x2c, 0x60, 0xfe, 0xa7, 0x8d, 0xe8, 0xa3, 0x3c, 0x84, 0x23, 0xd1, 0x53, 0x9d, 0xfe, 0x12, 0x5c, 0x5b, 0x7e, 0xa4, 0xb1, 0x7c, 0xf8, 0xd8, 0x6e, 0x7f, 0x84, 0xb8, 0x82, 0x64, 0xaf, 0xec, 0x06, 0xb3, 0x70, 0xdf, 0xce, 0xbf, 0x5e, 0x1d, 0x3e, 0x2c, 0x1f, 0x00, 0x5f, 0xaf, 0x24, 0x8b, 0x32, 0x15, 0x93, 0x96, 0x45, 0x87, 0x85, 0x2b, 0x83, 0x0c, 0x72, 0x31, 0x50, 0x4f, 0xe9, 0x47, 0xd6, 0xa3, 0x85, 0xf3, 0x99, 0x44, 0x1c, 0xfc, 0x52, 0xdf, 0x39, 0x14, 0xfa, 0x55, 0xcd, 0xba, 0x25, 0xbd, 0x21, 0x5f, 0x91, 0xa8, 0x0f, 0xc8, 0xff, 0xa8, 0x72, 0xb3, 0x41, 0x13, 0xdb, 0xbd, 0x95, 0x04, 0x86, 0x83, 0x31, 0xa3, 0x8c, 0x08, 0x1f, 0xa6, 0x59, 0x57, 0x4b, 0x18, 0x61, 0x69, 0xdb, 0x59, 0x0f, 0x48, 0xbe, 0x67, 0xfe, 0x75, 0x88, 0x5b, 0x6c, 0x87, 0x7d, 0x37, 0xec, 0x16, 0xeb, 0xde, 0x5a, 0xd7, 0xbe, 0x64, 0x14, 0x08, 0x4e, 0x88, 0x67, 0x0f, 0x7b, 0x7f, 0x48, 0x5e, 0xfc, 0xf4, 0x45, 0x99, 0xf4, 0x4c, 0xbb, 0xfb, 0xc6, 0x2e, 0x48, 0xf6, 0x2b, 0x43, 0x83, 0x19, 0x82, 0x3a, 0xeb, 0x37, 0x67, 0x10, 0x1e, 0xc6, 0x86, 0x8e, 0x4c, 0x85, 0xb1, 0x13, 0xea, 0x62, 0x31, 0x93, 0xab, 0x9a, 0x5a, 0xe0, 0xac, 0x22, 0x63, 0x28, 0xee, 0x46, 0x74, 0xbf, 0x0a, 0x90, 0xff, 0x1f, 0x20, 0xeb, 0x54, 0x2e, 0x11, 0x08, 0x70, 0xbf, 0xee, 0x01, 0x16, 0x5a, 0xb0, 0x3c, 0x22, 0x40, 0x29, 0x93, 0x19, 0xaa, 0x3a, 0xb1, 0x04, 0x52, 0x47, 0xbf, 0x7f, 0x34, 0xe8, 0x41, 0x0d, 0x96, 0xe1, 0x3a, 0xae, 0x46, 0x55, 0x97, 0xb4, 0x23, 0x36, 0xca, 0xd2, 0xde, 0x00, 0xb6, 0x76, 0x02, 0xa7, 0xcb, 0x58, 0x32, 0xcd, 0x72, 0x53, 0xb2, 0x39, 0xab, 0x75, 0x2a, 0x85, 0xf4, 0x52, 0xa6, 0x16, 0x6e, 0x9d, 0xe0, 0x52, 0x3b, 0xf9, 0xc2, 0x0c, 0x2a, 0x0c, 0x27, 0x43, 0x96, 0xd5 ],
+    const [ 0x9d, 0x64, 0xd8, 0x91, 0xd9, 0x9b, 0xb8, 0xab, 0xa2, 0x3a, 0x29, 0xa8, 0xf6, 0x9b, 0x32, 0x48, 0x27, 0x14, 0xe0, 0x31, 0xd3, 0x1d, 0xde, 0x33, 0x17, 0xb0, 0x46, 0xd0, 0x00, 0xf6, 0xb7, 0xfc, 0x42, 0x1f, 0xa8, 0x21, 0x2d, 0x91, 0xfb, 0x66, 0xdc, 0x46, 0xd5, 0x31, 0xb0, 0x6f, 0xae, 0xea, 0xfd, 0x5e, 0xa4, 0x03, 0x02, 0xa2, 0x15, 0x35, 0x1f, 0x74, 0x6c, 0x0c, 0x42, 0x52, 0x3b, 0xa5, 0xa3, 0xe9, 0x8b, 0xb7, 0xb1, 0x38, 0x70, 0xd0, 0x4b, 0xf3, 0xe0, 0xe1, 0x34, 0x25, 0xc4, 0xfd, 0xc1, 0x1a, 0x50, 0x5e, 0xd5, 0x7c, 0x90, 0xa9, 0x0f, 0xbc, 0x44, 0x72, 0x42, 0xb3, 0xee, 0x03, 0x26, 0x8a, 0x29, 0x59, 0x4d, 0xd7, 0x3c, 0x70, 0x58, 0x08, 0xef, 0xc1, 0x6a, 0x05, 0x9e, 0x08, 0xdd, 0x11, 0x8b, 0x4a, 0x34, 0xf1, 0x78, 0x17, 0x51, 0x51, 0x76, 0x0d, 0xe9, 0x63, 0xf8, 0x9d, 0x34, 0xc9, 0x2b, 0x12, 0xe9, 0xb5, 0x8a, 0xce, 0x69, 0x4f, 0xad, 0xd7, 0x3a, 0x57, 0x61, 0x93, 0xb8, 0x0b, 0xfe, 0xd0, 0x07, 0x4b, 0xf5, 0x07, 0x4c, 0xfb, 0xa9, 0xe2, 0x1d, 0xa9, 0x80, 0xfb, 0x36, 0x6f, 0x39, 0xe7, 0x6d, 0x1b, 0x80, 0x73, 0xe8, 0x8e, 0xbf, 0x2d, 0x8d, 0x62, 0x38, 0x27, 0xba, 0xd0, 0x51, 0xf7, 0x36, 0xd0, 0x2e, 0x02, 0x68, 0x81, 0x85, 0xfb, 0xc7, 0xcc, 0xae, 0xa6, 0x92, 0x44, 0xfa, 0xe2, 0xc1, 0x51, 0x46, 0xe6, 0x3b, 0x8e, 0xd0, 0xcb, 0x49, 0x6f, 0x49, 0x4b, 0x4b, 0x27, 0x2b, 0xc8, 0xaa, 0xc9, 0x4c, 0x8f, 0x0d, 0xad, 0xb4, 0x5f, 0xd0, 0x15, 0xab, 0x25, 0xb2, 0x10, 0x17, 0x0a, 0xcd, 0x9f, 0x05, 0xaf, 0xcc, 0x17, 0x86, 0xb7, 0x58, 0xc6, 0xbc, 0x87, 0xd3, 0xd9, 0x34, 0x49, 0x49, 0x7d, 0x76, 0x37, 0xa3, 0x45, 0xdb, 0x16, 0x1e, 0xcc, 0x9f, 0x00, 0xfc, 0x9b, 0x37, 0x67, 0x7a, 0x4d, 0xe5, 0x57, 0x01, 0xf1, 0x89, 0xfb, 0xa0, 0xaf, 0xba, 0x63, 0xba, 0xaf, 0x15, 0x84, 0xfc, 0x36, 0xd5, 0x81, 0x92, 0x12, 0xa5, 0x29, 0x9b, 0x39, 0xb2, 0xc0, 0xda, 0xad, 0x03, 0x02, 0xae, 0xa2, 0x0d, 0x65, 0x44, 0xe3, 0x82, 0x9f, 0x0b, 0x72, 0x6b, 0x68, 0x68, 0x6e, 0x76, 0x81, 0xac, 0x3a, 0x91, 0xf5, 0x43, 0xdc, 0xb7, 0x9f, 0x2d, 0xa3, 0x0a, 0xec, 0xb3, 0x0d, 0x23, 0xe2, 0x52, 0xe7, 0xa6, 0x61, 0xfc, 0xb6, 0x19, 0xa9, 0x80, 0x56, 0xf6, 0x1d, 0x46, 0xe1, 0xfe, 0x47, 0x3f, 0xd3, 0xd1, 0x1b, 0x1c, 0x6b, 0xbc, 0x80, 0xbe, 0x54, 0xd2, 0x0c, 0xee, 0x84, 0x3e, 0x0f, 0x4f, 0x65, 0xd7, 0xd4, 0x90, 0x32, 0xf5, 0x23, 0xe6, 0xa4, 0x83, 0x0a, 0xba, 0xcf, 0x56, 0xde, 0x9f, 0x46, 0xbd, 0x7c, 0x86, 0x86, 0x5a, 0xd4, 0x35, 0x92, 0x30, 0xa9, 0xf5, 0xda, 0xfc, 0x92, 0x8b, 0x61, 0xc9, 0x45, 0x6a, 0x1f, 0xbf, 0x14, 0x27, 0xa5, 0x3c, 0xb8, 0x2d, 0xff, 0x26, 0x4e, 0xb2, 0xde, 0x7f, 0x9f, 0xea, 0xf7, 0x39, 0xa4, 0x7a, 0xa6, 0x4c, 0x4a, 0x2f, 0xd7, 0x07, 0x72, 0xf0, 0x26, 0xa3, 0x3c, 0xf1, 0x45, 0x1e, 0x85, 0x2a, 0x9e, 0x47, 0xae, 0x08, 0x3a, 0x15, 0x9f, 0x62, 0xe2, 0x3c, 0x0c, 0xae, 0x84, 0x02, 0xf7, 0x75, 0xd8, 0x4f, 0x77, 0x04, 0x42, 0x04, 0xb7, 0x65, 0xfb, 0x8e, 0x41, 0x8d, 0x6c, 0xbb, 0x7d, 0xd7, 0xda, 0xcc, 0x74, 0xb1, 0x48, 0xcb, 0xda, 0x95, 0x99, 0x1f, 0x4c, 0x3c, 0xf6, 0x5d, 0xd6, 0x0e, 0x6f, 0x61, 0xb8, 0xdc, 0xe5, 0x9e, 0x6a, 0xd1, 0x27, 0xb2, 0xdd, 0xa6, 0x5b, 0x3d, 0x04, 0x16, 0xa0, 0xf4, 0x93, 0x92, 0xf1, 0xf1, 0x07, 0x35, 0x4c, 0x4d, 0xe6, 0xfa, 0x14, 0xf1, 0x48, 0x2d, 0xb5, 0xa9, 0x96, 0x1f, 0x86, 0x7b, 0x92, 0x1e, 0xf3, 0x36, 0x97, 0xa4, 0xdb, 0x4d, 0x22, 0xcf, 0x37, 0xe6, 0x92, 0x11, 0xfd, 0x2f, 0x2c, 0x29, 0x44, 0xf1, 0x62, 0x52, 0xa8, 0x67, 0x55, 0xba, 0xf0, 0x50, 0x98, 0x35, 0xee, 0x43, 0x37, 0x33, 0xa7, 0x43, 0xf8, 0xf0, 0xb4, 0x93, 0xe0, 0xea, 0xe8, 0xcb ],
+    const [ 0x7d, 0xd5, 0x46, 0x39, 0x7a, 0x9a, 0x01, 0x29, 0x86, 0x1f, 0xb6, 0x81, 0x5d, 0x41, 0x9a, 0x30, 0x7f, 0x90, 0xd2, 0x59, 0xd5, 0x5f, 0x35, 0x03, 0x96, 0x17, 0x54, 0x12, 0x6c, 0xd1, 0xb7, 0x76, 0xd3, 0x23, 0x6a, 0xa2, 0xc2, 0x39, 0xb9, 0x3f, 0x8e, 0x28, 0x37, 0x22, 0x0b, 0x80, 0x05, 0x7c, 0xf4, 0x20, 0x50, 0x51, 0x8d, 0x4f, 0x1c, 0x2c, 0x86, 0x08, 0x40, 0x10, 0x23, 0x94, 0xb2, 0xb1, 0x9a, 0x5f, 0x05, 0xe4, 0xbd, 0x04, 0x30, 0x55, 0xd8, 0xaa, 0x91, 0x78, 0xdd, 0x93, 0x32, 0xc2, 0xbe, 0xf2, 0x4a, 0x18, 0x1b, 0xfd, 0x07, 0x88, 0x1d, 0x44, 0x8a, 0x37, 0xa2, 0x41, 0x34, 0x9a, 0x9a, 0x30, 0x20, 0xe9, 0xb0, 0x21, 0xf0, 0xd1, 0x2e, 0x4b, 0xcd, 0x6a, 0x1a, 0xa3, 0xa9, 0x68, 0xa5, 0xad, 0xc7, 0x95, 0xc7, 0x92, 0x7e, 0x7f, 0x23, 0x74, 0x3a, 0x6d, 0x30, 0xfe, 0xc3, 0x98, 0x9a, 0x3f, 0xc2, 0x98, 0xe6, 0xb8, 0x81, 0x1d, 0x56, 0xb3, 0xf2, 0xdf, 0x0c, 0xd7, 0xf3, 0xd8, 0x71, 0xfa, 0xd0, 0xb0, 0xd8, 0x36, 0x09, 0x79, 0x5f, 0x3f, 0x56, 0x9c, 0x16, 0xf3, 0xe9, 0x13, 0x64, 0x33, 0xf3, 0xd9, 0xa6, 0xf2, 0x69, 0x9f, 0x18, 0x8b, 0x08, 0xc1, 0xf9, 0x58, 0x97, 0x78, 0xea, 0x80, 0x6c, 0x51, 0x98, 0x10, 0x31, 0xde, 0x9a, 0x4e, 0xe8, 0xab, 0x9d, 0x4a, 0x2d, 0x73, 0xbe, 0xb5, 0xbb, 0x94, 0x37, 0xf6, 0x32, 0xc1, 0x3e, 0x7b, 0x18, 0xf7, 0x2a, 0x4d, 0x1d, 0xb2, 0xd8, 0xe8, 0xa3, 0x60, 0x4d, 0x49, 0x7d, 0x16, 0x9c, 0x48, 0xf7, 0x82, 0x0a, 0x28, 0x17, 0x21, 0x71, 0x6d, 0x23, 0xb1, 0xe2, 0xed, 0x63, 0xea, 0x8e, 0x2a, 0x28, 0x69, 0xe7, 0xdf, 0x0e, 0xed, 0x02, 0xd9, 0x7d, 0xc5, 0x40, 0x08, 0x76, 0x89, 0x2d, 0xd6, 0x8c, 0x09, 0xa8, 0xb7, 0x30, 0x83, 0x45, 0x02, 0x32, 0x19, 0xef, 0xff, 0x85, 0x81, 0xd2, 0x41, 0x43, 0xff, 0x78, 0x36, 0xf0, 0x90, 0x31, 0xfc, 0x03, 0x68, 0xb9, 0x76, 0xa2, 0x9f, 0x15, 0xa0, 0xae, 0x28, 0xbe, 0x1f, 0xff, 0x02, 0x01, 0x1d, 0xf1, 0xb2, 0xa6, 0x53, 0x1f, 0xf0, 0xd0, 0x67, 0x6e, 0xa1, 0x24, 0x79, 0x4e, 0x05, 0x2d, 0xf9, 0x3c, 0x32, 0xff, 0xbb, 0x8b, 0xc1, 0x1b, 0x4d, 0x65, 0xc7, 0x93, 0x88, 0x0d, 0x07, 0x6f, 0x65, 0x66, 0x65, 0x4e, 0x12, 0xb9, 0x9e, 0x51, 0x45, 0xb3, 0x37, 0x34, 0xd1, 0xad, 0xb3, 0xbe, 0x77, 0x31, 0x09, 0x5c, 0xfe, 0xb9, 0x55, 0x09, 0x85, 0xb9, 0xce, 0x70, 0x19, 0xe0, 0xf8, 0x55, 0x83, 0x9b, 0x1b, 0x31, 0x63, 0xdc, 0xf3, 0x1c, 0x83, 0x19, 0xa9, 0xf0, 0x65, 0x97, 0x02, 0xac, 0x1e, 0xe8, 0xd7, 0x16, 0x67, 0xb3, 0xc5, 0xa5, 0xf2, 0xb3, 0x25, 0x9d, 0xfa, 0x02, 0x3e, 0x7c, 0x1e, 0x98, 0xba, 0x95, 0x6f, 0x0e, 0x57, 0xfb, 0xc8, 0xa8, 0xdf, 0xa0, 0x5e, 0x93, 0x5a, 0xbe, 0x97, 0x6b, 0x82, 0x76, 0x20, 0x01, 0x77, 0xb8, 0x3a, 0x5a, 0xb4, 0x62, 0x54, 0xfb, 0x42, 0xac, 0xdf, 0x63, 0x2b, 0xc3, 0x5e, 0xda, 0x32, 0xb4, 0xbc, 0x69, 0xc1, 0x8c, 0xe3, 0x2a, 0x23, 0xbd, 0x8a, 0xc2, 0xf3, 0xc4, 0x4e, 0x2b, 0xd5, 0x09, 0x05, 0xb7, 0x64, 0x07, 0x4f, 0x51, 0x6b, 0xac, 0x6d, 0x06, 0x57, 0x03, 0x57, 0xc5, 0xec, 0x10, 0x08, 0x63, 0x38, 0xfc, 0x1d, 0xe2, 0xc5, 0x72, 0x9e, 0xf3, 0x13, 0x48, 0x1c, 0xb9, 0x45, 0x62, 0xfc, 0xd0, 0x1b, 0xd3, 0x12, 0x8e, 0x20, 0x46, 0x72, 0x89, 0x25, 0x9d, 0x82, 0x59, 0xed, 0xd7, 0x54, 0x9f, 0x2a, 0x37, 0x33, 0x46, 0xa8, 0xa2, 0x7c, 0x08, 0xc9, 0x4a, 0xb0, 0x34, 0x31, 0x89, 0xc6, 0xaf, 0xc2, 0x0f, 0xc6, 0x39, 0xcb, 0x40, 0x93, 0xf2, 0x7c, 0xd8, 0x08, 0x1d, 0x9e, 0xd1, 0x47, 0x23, 0x81, 0x86, 0x4e, 0xdb, 0x35, 0x18, 0xcc, 0x08, 0xfc, 0x11, 0x32, 0x24, 0x00, 0x47, 0x0c, 0x5c, 0x42, 0x04, 0x92, 0xdb, 0xd3, 0x63, 0x7a, 0x4b, 0x46, 0xfd, 0x11, 0x99, 0x65, 0xc5, 0x8a, 0xf9, 0x23, 0x31, 0x96, 0x2b, 0xd2, 0x9b, 0x35, 0xfc, 0x96, 0xe6, 0xcb, 0x0f, 0x1a, 0x64, 0x76, 0xdd, 0x81, 0xf7, 0x9f, 0xfb, 0xa0, 0x77, 0xcf, 0x9c, 0x6a, 0x54, 0xc4, 0x56, 0xab, 0x7d, 0xc5, 0x29, 0xfa, 0x80, 0x32, 0xbd, 0xe8, 0xf2, 0x5f, 0xeb, 0x7e, 0x11, 0xa2, 0x7f, 0xe7, 0xa8, 0xab, 0x3c, 0x69, 0x33, 0x14, 0x21, 0x9a, 0x44, 0x39, 0xeb, 0xd0, 0x25, 0x4a, 0xdb, 0xd9, 0xbf, 0x9f, 0xb9, 0xec, 0xba, 0x4b, 0x19, 0xe0, 0xe6, 0xf3, 0xdd, 0x9c, 0xda, 0xe1, 0xfb, 0xcf, 0xdb, 0x54, 0x81, 0xe1, 0xff, 0x1a, 0xd6, 0x29, 0x91, 0x61, 0x42, 0x60, 0xb8, 0xcb, 0xb0, 0x55, 0x54, 0xc0, 0xb3, 0xe3, 0x29, 0x08, 0xc8, 0x20, 0x3f, 0x99 ],
+    const [ 0x42, 0x17, 0x2d, 0x5f, 0xda, 0xe4, 0x47, 0xc4, 0xcf, 0xdd, 0x13, 0x83, 0x6b, 0xb8, 0xb8, 0x33, 0xc0, 0xcb, 0x85, 0xf7, 0x32, 0x7f, 0x92, 0x98, 0x35, 0x01, 0xa4, 0xd7, 0x58, 0x3a, 0x52, 0x01, 0x83, 0x02, 0x66, 0xc3, 0x7c, 0x90, 0x86, 0x40, 0xb0, 0x35, 0x14, 0x61, 0x31, 0x4b, 0x52, 0x6c, 0xfb, 0x68, 0xca, 0xd9, 0x7b, 0xd7, 0xed, 0x61, 0x52, 0x48, 0xfa, 0x57, 0x56, 0xc6, 0x21, 0x3b, 0xd9, 0xea, 0xe9, 0x8d, 0x2f, 0x4e, 0xcf, 0xdf, 0x6a, 0x45, 0x2f, 0x2e, 0x68, 0xc9, 0x68, 0x72, 0x10, 0xb5, 0x3c, 0x74, 0xd8, 0x35, 0x75, 0xe0, 0x8a, 0x7a, 0xce, 0x9b, 0x49, 0xb2, 0x10, 0x56, 0xcf, 0x37, 0x7c, 0x64, 0xf8, 0x06, 0x69, 0xc8, 0x84, 0x74, 0x2e, 0x93, 0x18, 0x1c, 0x42, 0x6d, 0x87, 0x1c, 0xa2, 0x71, 0x50, 0x81, 0x73, 0x3e, 0x68, 0xff, 0xe9, 0x4a, 0x39, 0xe6, 0x67, 0x7a, 0xea, 0x51, 0xe8, 0xf0, 0xe1, 0xa0, 0x9d, 0x25, 0x86, 0x29, 0xd7, 0x37, 0x4a, 0x2b, 0x28, 0x84, 0xe9, 0x03, 0xc5, 0x77, 0xeb, 0xa3, 0x2f, 0xa2, 0x71, 0x3f, 0x13, 0x0d, 0x2e, 0x49, 0x6e, 0xce, 0xb4, 0xa0, 0xf4, 0xda, 0xf1, 0x05, 0xb3, 0x1b, 0xf9, 0xce, 0xf4, 0xc3, 0x06, 0xde, 0x62, 0xdf, 0xbc, 0xd4, 0x6e, 0x2f, 0xb2, 0x83, 0xf1, 0x35, 0x2f, 0xa3, 0x13, 0x8c, 0x31, 0xc5, 0x6d, 0x7b, 0xb4, 0x8d, 0x6a, 0xca, 0x30, 0x1b, 0xf3, 0xd4, 0x64, 0xca, 0x4b, 0xde, 0x52, 0x1d, 0x37, 0xa7, 0x8b, 0xf6, 0x63, 0x40, 0xac, 0x09, 0x01, 0x1e, 0x29, 0x91, 0xb3, 0x6e, 0x49, 0x41, 0xab, 0xa8, 0x72, 0x7e, 0x10, 0x67, 0xa7, 0xcb, 0xa4, 0x78, 0x4f, 0x85, 0xa5, 0x31, 0x38, 0xd0, 0xf1, 0x04, 0xdb, 0xd1, 0x6d, 0x54, 0xe2, 0x1e, 0xa6, 0x86, 0xe7, 0x72, 0xb9, 0x5c, 0x7f, 0xa6, 0x71, 0x7e, 0x77, 0xdc, 0xb0, 0x5a, 0x5d, 0xfe, 0x10, 0x2e, 0x42, 0x67, 0xc9, 0x63, 0xbf, 0xdf, 0xd6, 0x1d, 0x36, 0xcd, 0x53, 0x10, 0x5a, 0xa8, 0x2a, 0x95, 0xf2, 0xaf, 0xee, 0xfd, 0xda, 0xda, 0x07, 0x25, 0x4a, 0x10, 0x10, 0x4a, 0x5a, 0x9a, 0x7d, 0x1f, 0xc6, 0xd8, 0x81, 0x1d, 0xef, 0x32, 0x2f, 0x1b, 0x23, 0x52, 0xdf, 0x1e, 0x1e, 0x90, 0xd3, 0x72, 0xd1, 0xae, 0x1a, 0xfa, 0x62, 0xc6, 0xb5, 0xc4, 0x73, 0x80, 0xf9, 0xe0, 0xa7, 0x88, 0x34, 0x73, 0x62, 0x40, 0x93, 0x07, 0xd1, 0xb2, 0x43, 0x25, 0x2b, 0xc8, 0xd7, 0x26, 0x36, 0xbf, 0xea, 0x46, 0x0c, 0xd9, 0x05, 0xfa, 0x1f, 0x52, 0xc3, 0x84, 0x7b, 0x96, 0x32, 0xc4, 0x4b, 0xb1, 0x7d, 0x51, 0x9f, 0x07, 0xc8, 0xc8, 0x6c, 0x45, 0x5c, 0x64, 0xd4, 0x97, 0x04, 0xcf, 0xa8, 0x1c, 0xb6, 0x38, 0x2c, 0x97, 0x76, 0xa6, 0x1a, 0x67, 0x78, 0x8c, 0xe9, 0xb9, 0x85, 0x9d, 0x4e, 0xfc, 0x9f, 0xe1, 0x04, 0x95, 0xe8, 0x09, 0xc9, 0xd4, 0xc0, 0x00, 0xa9, 0x27, 0x2e, 0xc2, 0x7e, 0x8e, 0x81, 0x71, 0xb8, 0x4f, 0x37, 0xa6, 0x5a, 0xeb, 0x1d, 0x05, 0x45, 0x50, 0xb8, 0x14, 0xb9, 0x50, 0xe4, 0x4d, 0x19, 0x52, 0xbb, 0x71, 0xee, 0x48, 0xb8, 0x20, 0x2f, 0xe1, 0x1c, 0xa7, 0xc0, 0xff, 0x91, 0x19, 0x38, 0x6b, 0x0e, 0xa1, 0xe7, 0xc8, 0xfa, 0x16, 0x18, 0xc5, 0x94, 0xd0, 0x93, 0x97, 0x92, 0xba, 0x66, 0xa7, 0x08, 0xa9, 0xe5, 0x87, 0x8c, 0xec, 0xf0, 0x2b, 0x98, 0x25, 0x74, 0x56, 0x30, 0x57, 0x34, 0x52, 0xc4, 0x3f, 0xca, 0xe4, 0x57, 0xe8, 0xe8, 0x7f, 0xe1, 0x7a, 0xe4, 0xb8, 0xf2, 0x52, 0x74, 0xfa, 0x99, 0x58, 0xb6, 0x7b, 0x84, 0x8d, 0x73, 0x6e, 0x68, 0xe4, 0xa4, 0x7b, 0xa4, 0x53, 0x35, 0x6c, 0x21, 0x29, 0x0a, 0x29, 0x7c, 0xa2, 0x40, 0xe6, 0x67, 0xb9, 0xb5, 0x9b, 0x4c, 0x3d, 0xca, 0xb4, 0x34, 0x27, 0x67, 0x0a, 0xe8, 0x2b, 0x40, 0x13, 0x55, 0x8d, 0x57, 0x55, 0x35, 0x36, 0xc2, 0x21, 0xec, 0x07, 0xaf, 0x7d, 0xb0, 0x6d, 0xa5, 0x62, 0xed, 0x36, 0x0d, 0x28, 0xe8, 0xa3, 0xf0, 0x3e, 0xa2, 0xbe, 0x02, 0x1e, 0xff, 0xed, 0xe0, 0x80, 0x27, 0xc8, 0x96, 0xce, 0x2d, 0x28, 0x64, 0xd9, 0xef, 0x80, 0xc2, 0xca, 0x3d, 0x71, 0xa1, 0x5b, 0x3d, 0x98, 0xf4, 0x47, 0x0d, 0xab, 0x6f, 0xfe, 0xab, 0xc4, 0x8e, 0x9e, 0x12, 0xfc, 0xda, 0x1f, 0xa6, 0x3c, 0x68, 0xcd, 0xd2, 0x50, 0xa2, 0xfc, 0xf0, 0x3d, 0x49, 0xf7, 0x69, 0xd5, 0xbb, 0x39, 0x1d, 0x88, 0x72, 0xe0, 0x05, 0x7d, 0xce, 0x5e, 0x16, 0xe2, 0x14, 0x72, 0x69, 0x80, 0xb6, 0x57, 0x9a, 0x92, 0xd5, 0x3b, 0x6e, 0xd7, 0x04, 0xf2, 0xb8, 0xe6, 0x4f, 0xec, 0x7d, 0xc2, 0x7c, 0x64, 0x56, 0xae, 0x90, 0xdb, 0x16, 0x42, 0x95, 0xc5, 0xad, 0xbf, 0x9b, 0x82, 0x4c, 0xa0, 0xfd, 0x8f, 0xca, 0x71, 0xe5, 0xfe, 0x47, 0xe4, 0x12, 0x23, 0x0f, 0x22, 0xd9, 0x91, 0xc0, 0x5f, 0x6a, 0x45, 0xb0, 0xb1, 0x55, 0x20, 0x89, 0x22, 0x4d, 0x9b, 0x36, 0x04, 0x2b, 0xb6, 0x03, 0x84, 0x36, 0x31, 0xff, 0x82, 0xa1, 0xff, 0xa5, 0xa0, 0x55, 0xf8, 0xbc, 0x99, 0xf1, 0xce, 0x7c, 0xd5, 0x0f, 0x42, 0xf2, 0x3a, 0xca, 0x97, 0xa6, 0x44, 0x7d, 0x47, 0x7a, 0x58, 0xcc, 0xf6, 0xd5, 0x55, 0xe9, 0xa4, 0x01, 0x6d, 0x10, 0x26, 0xd2, 0x33, 0x54, 0xd7, 0x89, 0xf4, 0x9e, 0x8b, 0xf7, 0x4b, 0xf3, 0xc4, 0xe6, 0xf0, 0xf5, 0x29, 0xb4, 0xd1, 0xad, 0x33, 0x41, 0x64, 0x87, 0x2a, 0x0c, 0x3b, 0x9e, 0x50, 0x98, 0xd9, 0x3a ],
+    const [ 0x9c, 0x4b, 0xdc, 0x3b, 0x1a, 0xf6, 0xab, 0x9d, 0xc7, 0xbd, 0x2d, 0xd9, 0x0e, 0x2e, 0x42, 0x9a, 0x07, 0xd5, 0xdd, 0x5c, 0x48, 0xbb, 0x70, 0x16, 0xfe, 0x2c, 0xa5, 0x1d, 0x3c, 0xbd, 0x4f, 0x45, 0x92, 0x8e, 0xa0, 0x49, 0xe2, 0xcd, 0x9c, 0x6d, 0x6f, 0x7b, 0xcd, 0x61, 0x37, 0x73, 0x39, 0x69, 0x83, 0xa8, 0x91, 0xbb, 0xbc, 0xae, 0xab, 0x28, 0x80, 0x7c, 0x32, 0xff, 0xf5, 0x70, 0x9d, 0x2f, 0x5d, 0x93, 0x5d, 0xab, 0xeb, 0x1f, 0x5b, 0x13, 0xd5, 0x3e, 0xa1, 0x90, 0xab, 0x15, 0x57, 0x00, 0xe7, 0x01, 0xf2, 0x53, 0xc5, 0x20, 0xa8, 0x34, 0x55, 0x14, 0x27, 0xec, 0xce, 0x03, 0x86, 0x84, 0x25, 0xe2, 0x7c, 0x2a, 0xde, 0xf4, 0xd0, 0xd7, 0x23, 0x8d, 0x10, 0x2e, 0x13, 0x1c, 0x86, 0xa6, 0x5c, 0x68, 0x68, 0xeb, 0x0c, 0x1a, 0x4f, 0x82, 0xa4, 0x7c, 0xea, 0xac, 0x6e, 0x80, 0xf4, 0x8e, 0x11, 0x04, 0x63, 0x8e, 0x63, 0x54, 0xe3, 0x00, 0x7e, 0xf1, 0x82, 0x02, 0x16, 0x91, 0xad, 0xa4, 0x0a, 0x66, 0x5b, 0x4d, 0x38, 0xa3, 0x88, 0x5a, 0x96, 0x3d, 0xe5, 0x07, 0x7f, 0xee, 0xce, 0x93, 0x4a, 0x80, 0x7c, 0x9f, 0x21, 0x48, 0x7c, 0xd8, 0x10, 0xf1, 0x5f, 0xd5, 0x5d, 0x7b, 0xb4, 0x42, 0x18, 0x82, 0x33, 0x3f, 0xf2, 0xc4, 0x3b, 0x03, 0x53, 0xde, 0x7f, 0xc5, 0xa6, 0x56, 0xfc, 0xdc, 0xf8, 0xde, 0x2e, 0x25, 0xc1, 0xd7, 0x83, 0xa5, 0x01, 0x15, 0x10, 0x6f, 0x8f, 0xe2, 0x82, 0xc8, 0xae, 0x45, 0x58, 0x8a, 0xe2, 0x84, 0x50, 0xc6, 0x02, 0xe7, 0x1f, 0xad, 0x8d, 0xbf, 0x65, 0xb1, 0x41, 0xa7, 0xe0, 0xe7, 0xea, 0x0a, 0xe0, 0xb0, 0x79, 0xe5, 0xfb, 0x98, 0x55, 0xce, 0x01, 0x7e, 0xf6, 0x36, 0x33, 0xf6, 0xaf, 0xeb, 0xaf, 0xeb, 0xcb, 0xe0, 0x2f, 0x89, 0xdc, 0x31, 0xf3, 0x59, 0x50, 0x62, 0xfc, 0xae, 0x45, 0xe8, 0x7b, 0x41, 0x9f, 0xea, 0x89, 0x18, 0x57, 0x48, 0x18, 0xac, 0x15, 0xdd, 0x2a, 0x4a, 0x02, 0x01, 0x41, 0xba, 0xd7, 0x52, 0x16, 0x1f, 0x3b, 0xb5, 0x8d, 0x1e, 0x4b, 0x97, 0xe9, 0x42, 0x7a, 0x79, 0x3c, 0x9f, 0x9b, 0xab, 0x22, 0xb6, 0x3c, 0x57, 0xaf, 0x99, 0x36, 0xc2, 0xa6, 0x50, 0x82, 0xcf, 0xec, 0x7a, 0x4e, 0xc5, 0x3c, 0x37, 0x50, 0x51, 0x1b, 0x46, 0x5b, 0xcf, 0x0f, 0x6b, 0x30, 0xc5, 0x0c, 0x14, 0x96, 0xb0, 0x2f, 0x3b, 0xad, 0x04, 0xaf, 0x8e, 0x7f, 0x6e, 0x10, 0xce, 0xd8, 0x5c, 0x99, 0x75, 0x58, 0xbf, 0x09, 0x9b, 0xc6, 0x0f, 0x86, 0x1a, 0xa7, 0x90, 0xd6, 0xf1, 0x0f, 0xd5, 0xd1, 0xe6, 0xb8, 0x82, 0x16, 0x70, 0x51, 0x56, 0xfe, 0xd3, 0x18, 0x68, 0xce, 0x8d, 0xab, 0xb0, 0x31, 0xf1, 0x1b, 0xca, 0xe5, 0x12, 0x43, 0xf7, 0xb4, 0xe2, 0x58, 0x65, 0xa6, 0x9b, 0xc1, 0xb0, 0x75, 0x5e, 0x28, 0xa8, 0x41, 0x1a, 0xd1, 0x55, 0x85, 0xb0, 0x2a, 0x38, 0x4a, 0x55, 0xa4, 0xd4, 0x9a, 0x37, 0xc2, 0x6d, 0x38, 0x63, 0x6f, 0x10, 0x8e, 0xe6, 0x95, 0xd3, 0xe7, 0x32, 0xeb, 0x5e, 0xde, 0xc4, 0x0f, 0xaa, 0x16, 0x04, 0xd4, 0x09, 0x2c, 0x6d, 0xdd, 0x67, 0xea, 0xed, 0x6b, 0xcf, 0xbe, 0x8f, 0x73, 0x31, 0x6a, 0x57, 0xf4, 0x62, 0xfc, 0x6d, 0x87, 0x64, 0x01, 0x7f, 0x38, 0xe8, 0xf6, 0x60, 0x94, 0x11, 0xff, 0xf5, 0x03, 0x7b, 0xdc, 0x51, 0x58, 0x7c, 0x18, 0x1f, 0xa7, 0xa9, 0x83, 0x40, 0x56, 0x9c, 0xe3, 0xb6, 0x77, 0xf5, 0xe7, 0xc1, 0x55, 0x9f, 0x5c, 0x47, 0x4d, 0x55, 0xa3, 0x79, 0xe0, 0x64, 0x63, 0xb4, 0x06, 0xb2, 0x7b, 0xa5, 0xc4, 0xff, 0x3b, 0xb1, 0x00, 0x6b, 0xd3, 0x94, 0x95, 0x38, 0x0b, 0x48, 0xa3, 0xd2, 0x35, 0x28, 0x28, 0x0c, 0x60, 0x55, 0xd5, 0xad, 0xcf, 0x59, 0x1a, 0x2b, 0xaa, 0x0a, 0x84, 0xb6, 0xf2, 0xb1, 0x48, 0x78, 0xba, 0x6c, 0x20, 0x1c, 0x95, 0xd1, 0x55, 0x8d, 0x4b, 0xd4, 0x1d, 0x00, 0xd0, 0xeb, 0x28, 0x34, 0x76, 0x70, 0x76, 0xf8, 0x61, 0x46, 0x6b, 0xef, 0x3b, 0xbf, 0x25, 0x90, 0x2a, 0xbd, 0x0d, 0x70, 0xff, 0x18, 0xac, 0xc4, 0xb1, 0x40, 0xc1, 0x21, 0x09, 0x24, 0x90, 0x87, 0x9e, 0x52, 0x7c, 0x9e, 0x04, 0x5f, 0xd8, 0x3f, 0x41, 0x89, 0xfb, 0x36, 0x80, 0x9b, 0x92, 0x47, 0x0a, 0x11, 0x3b, 0x6f, 0x71, 0x7d, 0x4f, 0x6b, 0x0e, 0x29, 0xfe, 0x7f, 0xae, 0xfe, 0xa2, 0x70, 0x89, 0xa4, 0x4d, 0xd2, 0x74, 0xeb, 0xa4, 0x8a, 0x57, 0x6a, 0xf1, 0x8b, 0xe0, 0x66, 0x73, 0xe3, 0x79, 0xf5, 0xf9, 0xfb, 0x78, 0x62, 0xaf, 0x1a, 0x96, 0xd4, 0x37, 0x2c, 0xa3, 0x2b, 0xfb, 0xc2, 0x78, 0x2b, 0xc2, 0x59, 0x2c, 0xdc, 0x82, 0xdf, 0x8b, 0x30, 0x75, 0x73, 0xc3, 0xe7, 0x6f, 0x6d, 0x61, 0xb0, 0x6f, 0x9e, 0x7c, 0x91, 0x74, 0xd9, 0x30, 0x88, 0x92, 0xb1, 0x4f, 0x73, 0x44, 0x85, 0x52, 0x2d, 0x04, 0xba, 0x96, 0xfa, 0x19, 0x48, 0xc5, 0x25, 0xb1, 0x78, 0x91, 0xe7, 0x2f, 0xec, 0xa9, 0x8b, 0xc6, 0xdf, 0xe5, 0xd0, 0x47, 0xae, 0xc4, 0x8f, 0x37, 0x97, 0x19, 0x9d, 0x25, 0xc1, 0x01, 0xf3, 0x3a, 0x7d, 0x18, 0x0c, 0x12, 0xcc, 0xed, 0x8f, 0xca, 0x21, 0xb3, 0x2e, 0x5b, 0x68, 0x39, 0xce, 0x26, 0x46, 0x1c, 0xe8, 0xd0, 0xa3, 0x3b, 0x2f, 0x4f, 0x66, 0x6b, 0x73, 0x45, 0x7f, 0x6c, 0xc5, 0x8d, 0x2b, 0x1c, 0xdc, 0x14, 0x73, 0xeb, 0xb7, 0xeb, 0xf6, 0x8f, 0x84, 0x9a, 0xe9, 0xf9, 0xc1, 0xb6, 0x5c, 0x87, 0xa1, 0xb6, 0xbf, 0x7b, 0xb1, 0x02, 0xa4, 0xac, 0xbb, 0x4d, 0xc7, 0x7b, 0xea, 0x25, 0x4b, 0x09, 0x30, 0xc8, 0x46, 0xa7, 0xe5, 0x3a, 0x80, 0x8e, 0xb1, 0x94, 0x78, 0xd1, 0xab, 0x9f, 0xa8, 0x8f, 0xc2, 0xa1, 0x0a, 0x6d, 0x5d, 0x77, 0xdb, 0x43, 0x3e, 0xe4, 0x9f, 0x16, 0xac, 0x29, 0x65, 0x47, 0xd1, 0xd6, 0x4c, 0x09, 0x61, 0xdf, 0x46, 0x18, 0x7c, 0xf2, 0x1c, 0xa9, 0xd6, 0x08, 0xb3, 0x9c, 0x15, 0x3b, 0x8d, 0xf9, 0x7a, 0xd7, 0x92, 0x9a, 0xc4, 0xb3, 0x11, 0x25, 0x51, 0xc2, 0x02, 0x3e, 0x87, 0xe5, 0x8e, 0xfa, 0x72, 0x03, 0xd1, 0x96, 0xae, 0x5c, 0xde, 0x69, 0x88, 0x1a, 0x03, 0x17, 0x60, 0x29, 0x4f, 0x08, 0x52 ],
+    const [ 0xbb, 0x64, 0xbe, 0x5c, 0x71, 0x91, 0x87, 0x56, 0xc6, 0x11, 0xcd, 0x6e, 0x00, 0x1d, 0xba, 0xb5, 0x3e, 0x6b, 0xf9, 0xbe, 0x16, 0x48, 0x75, 0x53, 0x7c, 0xe7, 0x63, 0x67, 0xe5, 0xf9, 0x82, 0x4c, 0xad, 0x7d, 0xa1, 0x26, 0xb6, 0xda, 0x63, 0xa0, 0x53, 0x2b, 0x3f, 0xdd, 0x64, 0xda, 0xca, 0xb2, 0xc2, 0x70, 0x39, 0x12, 0xdd, 0xab, 0x21, 0xc9, 0xa3, 0xd2, 0x82, 0x6d, 0xa4, 0x45, 0x04, 0x92, 0x74, 0x58, 0x80, 0x3e, 0x51, 0x61, 0xc2, 0x9d, 0x06, 0x10, 0x8e, 0xf5, 0x0f, 0xff, 0xe0, 0xdb, 0xfe, 0x8a, 0x78, 0xa8, 0x1e, 0xe1, 0x96, 0x27, 0x55, 0x5b, 0x03, 0x90, 0x4f, 0x0e, 0x50, 0xba, 0xd8, 0x9c, 0x62, 0x8c, 0x8a, 0x4f, 0x2f, 0xb5, 0xa9, 0x69, 0xc2, 0x9c, 0x4b, 0xb5, 0x85, 0x9a, 0xbc, 0x62, 0xbf, 0x68, 0x20, 0x11, 0x5c, 0xd3, 0x5a, 0x2d, 0xed, 0xb7, 0x2d, 0x7b, 0xef, 0x2a, 0xa1, 0xf2, 0x50, 0xf8, 0xa9, 0xcc, 0x2f, 0x50, 0x02, 0xdd, 0xe4, 0xbc, 0x5e, 0x24, 0x40, 0x56, 0xc2, 0xa0, 0x15, 0x3a, 0x2d, 0x64, 0xf9, 0x37, 0x7a, 0xee, 0x48, 0xca, 0x87, 0xb5, 0x68, 0x4c, 0x97, 0x01, 0x51, 0x6a, 0xf5, 0xff, 0x4c, 0xd6, 0xdb, 0x15, 0xfa, 0x3c, 0x91, 0x73, 0x99, 0x78, 0xd9, 0xeb, 0x83, 0x06, 0x8b, 0x02, 0xf7, 0xb9, 0x7d, 0x47, 0x1c, 0xb0, 0xa5, 0xe3, 0x43, 0x87, 0x82, 0x72, 0x6d, 0xca, 0xb7, 0x11, 0x0d, 0xaf, 0xfa, 0xb8, 0x0f, 0x04, 0x2c, 0xcb, 0x18, 0x66, 0xc9, 0xeb, 0x10, 0xb4, 0x83, 0x12, 0xde, 0xc3, 0x2a, 0xdf, 0x72, 0x53, 0xcf, 0x2e, 0x09, 0x42, 0x29, 0xec, 0xac, 0x00, 0x38, 0x2a, 0xfa, 0x43, 0x27, 0x6f, 0x28, 0xfc, 0x77, 0x53, 0x46, 0x89, 0x5a, 0x49, 0xc4, 0x2c, 0x5d, 0xbd, 0x34, 0xbc, 0x4a, 0x5f, 0x51, 0x9a, 0x4d, 0xbe, 0x41, 0xe7, 0x55, 0x18, 0x17, 0xf4, 0xbd, 0x70, 0x9c, 0xfa, 0x2c, 0xe2, 0x4f, 0x0c, 0xba, 0x34, 0xaa, 0x49, 0x54, 0xad, 0xa7, 0x56, 0x61, 0x2a, 0x83, 0x0c, 0xa5, 0x6e, 0xc2, 0x6d, 0x66, 0xba, 0x73, 0xdd, 0xce, 0x9d, 0xb5, 0x8f, 0x91, 0x0e, 0x7a, 0x3d, 0xd0, 0xb8, 0x8b, 0x1c, 0x3c, 0x95, 0xcd, 0x0f, 0x7e, 0xbe, 0xc2, 0x1a, 0xd7, 0x82, 0x52, 0x1a, 0x03, 0xb5, 0xcc, 0xb4, 0x64, 0x4a, 0x28, 0x8c, 0x5c, 0x25, 0x8f, 0xb7, 0xfb, 0x2a, 0x1d, 0x72, 0xda, 0x9a, 0xe5, 0x14, 0x46, 0x9f, 0x35, 0x41, 0xa1, 0x25, 0x1c, 0x61, 0x06, 0xec, 0x2a, 0x50, 0x2c, 0xdb, 0x77, 0x57, 0x8d, 0x98, 0xe6, 0x5c, 0xc7, 0x55, 0xab, 0x55, 0x42, 0xed, 0x0b, 0x03, 0x13, 0x2f, 0x63, 0xdc, 0x20, 0x79, 0x6c, 0x49, 0x85, 0x8a, 0xbd, 0x11, 0x37, 0x91, 0x92, 0x15, 0xe7, 0x89, 0xcb, 0x3f, 0x2a, 0xc9, 0x38, 0xb5, 0xd6, 0xd7, 0x13, 0x52, 0xaf, 0x7e, 0xce, 0x56, 0x43, 0x20, 0x10, 0x5c, 0x12, 0x4d, 0xfa, 0x8d, 0xf2, 0x93, 0xae, 0x14, 0xb2, 0x98, 0x12, 0xd1, 0xfe, 0x67, 0xd1, 0x52, 0x82, 0x08, 0xa3, 0xff, 0x53, 0x53, 0xcf, 0x94, 0x8a, 0x05, 0xee, 0xd5, 0x32, 0x14, 0xf1, 0x7d, 0x64, 0x40, 0x65, 0x77, 0xb0, 0xeb, 0xf6, 0x50, 0xbf, 0x2a, 0x32, 0xed, 0x37, 0x1c, 0x90, 0x79, 0xdf, 0x7b, 0xb1, 0xa2, 0x04, 0x70, 0xe5, 0x05, 0x1b, 0xac, 0xf1, 0xe6, 0xa7, 0xb4, 0x10, 0x25, 0x5d, 0x7c, 0x37, 0x6d, 0x86, 0x38, 0x9d, 0xaf, 0xa6, 0x6f, 0x7b, 0xcf, 0x5b, 0x51, 0x10, 0x9d, 0x87, 0x4a, 0xe9, 0x06, 0xb1, 0xd7, 0x5f, 0x8c, 0xa9, 0x99, 0x61, 0xf3, 0x6b, 0xa8, 0x74, 0x3d, 0x46, 0x29, 0xf7, 0xd9, 0x3e, 0x23, 0xac, 0x18, 0xae, 0x8e, 0x74, 0xe0, 0x32, 0xad, 0x5a, 0xa4, 0xc3, 0x9e, 0xd3, 0x93, 0x24, 0x30, 0x44, 0x10, 0x7e, 0xf4, 0xc5, 0x63, 0x47, 0x97, 0x25, 0xae, 0x67, 0x6e, 0x2e, 0x22, 0x9e, 0x53, 0x2a, 0x72, 0x20, 0xb0, 0xa6, 0x88, 0x83, 0xd9, 0x75, 0x78, 0xdb, 0x9f, 0xf8, 0xb2, 0x24, 0x22, 0x9d, 0x7b, 0xe0, 0xe6, 0xa6, 0x9e, 0x00, 0x29, 0x2c, 0x5e, 0x08, 0x74, 0x63, 0xb0, 0x6f, 0x71, 0x1f, 0xa7, 0x44, 0xfc, 0x97, 0x30, 0x18, 0x7c, 0x69, 0xff, 0x17, 0x74, 0xdf, 0xc9, 0x78, 0x55, 0x71, 0xb4, 0x18, 0x97, 0x8b, 0x0c, 0x61, 0x07, 0x90, 0x37, 0x71, 0x63, 0x1e, 0xeb, 0x78, 0x24, 0x94, 0x9e, 0x62, 0x9b, 0xd1, 0x3e, 0xb7, 0x3f, 0x3f, 0x23, 0xbf, 0x46, 0x11, 0x42, 0xe9, 0x72, 0xc8, 0xa3, 0x6d, 0x2e, 0xfc, 0x15, 0x31, 0xd9, 0x59, 0x20, 0xea, 0x62, 0xe8, 0x3b, 0x83, 0x15, 0x8f, 0x3f, 0xc2, 0xb4, 0xdc, 0x1c, 0x29, 0xca, 0xfe, 0xca, 0x1a, 0x3c, 0x14, 0x83, 0x3f, 0x21, 0xab, 0x30, 0x29, 0xd3, 0x81, 0x21, 0x37, 0x46, 0x8f, 0x00, 0xba, 0x99, 0x47, 0x08, 0x56, 0xeb, 0x1b, 0x72, 0xac, 0x70, 0x3e, 0x30, 0x35, 0xc4, 0xae, 0xde, 0x71, 0x7f, 0x72, 0xf6, 0x42, 0x09, 0x20, 0x43, 0x92, 0xb0, 0xa3, 0x98, 0x3c, 0xf7, 0x3b, 0xc1, 0x2a, 0x31, 0xc5, 0xba, 0xbb, 0x4f, 0x3d, 0x1f, 0x67, 0xf7, 0x81, 0xe4, 0xa5, 0xd6, 0x58, 0x46, 0x0c, 0x36, 0xb2, 0x01, 0xb9, 0xd3, 0x32, 0xc4, 0xf2, 0xea, 0xe9, 0xe2, 0x08, 0x94, 0x65, 0x4a, 0x82, 0x52, 0xea, 0xb9, 0x77, 0xe9, 0xff, 0x2e, 0x3c, 0x70, 0x2c, 0x9f, 0x40, 0xa7, 0x03, 0xea, 0x33, 0x8a, 0x5d, 0x0e, 0x6e, 0x26, 0xe6, 0x9b, 0x8f, 0xac, 0xdc, 0x67, 0x63, 0xc4, 0x13, 0x83, 0x0a, 0x23, 0x3d, 0x6d, 0x55, 0x60, 0x68, 0x87, 0x73, 0x03, 0xc8, 0xc8, 0xcd, 0xe0, 0xb7, 0xb2, 0x2e, 0xa3, 0xfa, 0x84, 0x27, 0xab, 0x46, 0xb0, 0xb2, 0x1c, 0x02, 0x8f, 0x15, 0x2f, 0x4f, 0x54, 0x09, 0xcd, 0x46, 0x3f, 0x1c, 0x5d, 0x80, 0x13, 0x54, 0xda, 0xdc, 0xc9, 0x15, 0x28, 0x7c, 0x86, 0x44, 0xa8, 0x11, 0xcb, 0xad, 0x0a, 0x59, 0xeb, 0xa2, 0x62, 0xe6, 0xc3, 0xe5, 0x7e, 0x20, 0xa5, 0xc9, 0x77, 0x8d, 0x95, 0x93, 0x87, 0x50, 0xb8, 0x26, 0x1a, 0xf0, 0x09, 0xe0, 0x28, 0x5b, 0x4e, 0xbf, 0xc1, 0x2b, 0x4b, 0xc8, 0xea, 0x27, 0x35, 0xa9, 0xa7, 0x0d, 0x69, 0x9d, 0x59, 0x8f, 0x5e, 0x90, 0x4a, 0x9b, 0xd8, 0x84, 0x87, 0xdf, 0x5f, 0x33, 0xee, 0x8d, 0xf0, 0xf5, 0x87, 0x5b, 0xf2, 0xe5, 0x18, 0xcf, 0x6b, 0x3f, 0xf3, 0xb9, 0x74, 0x0d, 0x13, 0x01, 0xeb, 0x03, 0x67, 0xa2, 0x67, 0xa7, 0x6e, 0xf7, 0x71, 0xb5, 0x04, 0x36, 0xf1, 0xc1, 0x7c, 0x3a, 0xe6, 0x1e, 0xee, 0x85, 0x5a, 0xff, 0xd2, 0x85, 0x96, 0xdc, 0xce, 0x16, 0x92, 0x17, 0xcd, 0x49, 0xaf, 0xe0, 0x51, 0x63, 0xa8, 0x56, 0x0a, 0x29, 0xc6, 0xee, 0xa7, 0x5b, 0x54, 0x19, 0xec, 0x7f, 0x53, 0x21, 0x05, 0xdf, 0x6f, 0x54, 0x1a, 0xd5, 0x31, 0x65, 0x23, 0x46, 0x75, 0x0f, 0xfe, 0x6d, 0x1f, 0xfb, 0xbe, 0xda, 0x0a, 0xe4, 0x47, 0xba, 0x41, 0xf9, 0x18, 0x58, 0x72, 0x83, 0x67, 0xe4, 0x9f, 0xc7, 0x73, 0x74 ],
+    const [ 0xe5, 0x09, 0x8b, 0x6a, 0x0b, 0x1c, 0xfc, 0x57, 0xc6, 0xa7, 0x65, 0x37, 0x10, 0x4a, 0x39, 0xc4, 0x8b, 0xae, 0xcb, 0x15, 0xc6, 0xbb, 0xb4, 0x6f, 0xbb, 0x0b, 0x74, 0x5f, 0x9c, 0x9e, 0x5c, 0x05, 0xcf, 0xcf, 0xab, 0xb3, 0x37, 0x86, 0xf7, 0xb7, 0xb5, 0xb0, 0xce, 0x74, 0xee, 0xec, 0x9e, 0xb8, 0x4f, 0x87, 0xd2, 0x49, 0x4f, 0xab, 0x3e, 0xc1, 0xf4, 0xd3, 0xbd, 0x9c, 0x99, 0x82, 0x18, 0x90, 0xee, 0x35, 0x2a, 0x1d, 0x40, 0x96, 0x42, 0x64, 0xfb, 0xf2, 0xc9, 0x3c, 0x6d, 0xed, 0x25, 0x83, 0xcc, 0x75, 0xdc, 0xb2, 0x7b, 0xf4, 0xfd, 0xb4, 0x89, 0xca, 0xbc, 0xf9, 0x7b, 0xfa, 0x5c, 0xc6, 0x4b, 0x23, 0x52, 0xcf, 0xb0, 0xb3, 0xa7, 0x07, 0xa0, 0x57, 0x9e, 0xb7, 0x13, 0xb6, 0x97, 0xcd, 0x0b, 0x5e, 0x33, 0x77, 0xd1, 0xfe, 0xb9, 0xf1, 0x81, 0xd7, 0xb8, 0x9c, 0xc8, 0x6d, 0xee, 0x4f, 0xed, 0x82, 0x69, 0xf1, 0x0e, 0x44, 0xec, 0x48, 0xad, 0xc6, 0x94, 0x0c, 0x6b, 0xad, 0xbb, 0x40, 0x12, 0x2c, 0x1d, 0xc2, 0xd9, 0x32, 0x39, 0x20, 0xe4, 0xe1, 0xfb, 0xad, 0x0b, 0x43, 0x97, 0xd4, 0xdc, 0x38, 0xb8, 0xad, 0xe3, 0xb3, 0xda, 0xce, 0x29, 0x26, 0xf4, 0x64, 0xfa, 0x3b, 0x5b, 0x82, 0xeb, 0xc5, 0xe3, 0xb8, 0x1c, 0xf6, 0x47, 0xe8, 0xbb, 0xd2, 0xcb, 0x55, 0xc9, 0xe3, 0x1f, 0xfd, 0x21, 0x2f, 0x87, 0x29, 0xb6, 0x67, 0x39, 0x42, 0x1c, 0x61, 0x06, 0xe6, 0x4a, 0xc8, 0x3d, 0x3b, 0x9e, 0x13, 0xcd, 0x83, 0x21, 0xb3, 0xa9, 0xf1, 0x0d, 0x91, 0x71, 0xbb, 0x8c, 0xb7, 0x4e, 0x71, 0xc3, 0x4d, 0x1e, 0x8d, 0x0f, 0xc8, 0xd1, 0x4b, 0x8e, 0x5e, 0x12, 0xbb, 0xe2, 0xbd, 0x2a, 0x14, 0x31, 0xfc, 0x22, 0x4b, 0x70, 0xd2, 0x28, 0xe4, 0xe2, 0x06, 0x35, 0x09, 0xdb, 0x26, 0xec, 0xd9, 0xca, 0x7c, 0xc4, 0x02, 0x76, 0x3e, 0x69, 0x92, 0x88, 0x05, 0x60, 0x0a, 0x4a, 0x80, 0xea, 0xb4, 0xae, 0x6a, 0x2c, 0x37, 0x92, 0xb9, 0x8c, 0x69, 0x42, 0x19, 0x5e, 0x64, 0x3f, 0x98, 0xc0, 0xdc, 0x3f, 0xa3, 0xc2, 0xb0, 0x74, 0x31, 0xcb, 0xbe, 0x11, 0x3e, 0x38, 0xfc, 0x0b, 0x7b, 0x45, 0xc5, 0x1c, 0x44, 0x31, 0x70, 0x0e, 0xd2, 0x9d, 0x27, 0x36, 0xb2, 0x36, 0xf6, 0x3f, 0x75, 0x93, 0x23, 0x29, 0xaa, 0x60, 0xbe, 0x90, 0x09, 0xbd, 0x78, 0x32, 0xf1, 0xe1, 0xb9, 0xac, 0x15, 0x03, 0xec, 0x84, 0x72, 0x7a, 0x1e, 0x6c, 0x84, 0x23, 0xc7, 0xc5, 0xb9, 0x03, 0xe7, 0x63, 0x26, 0x2d, 0x55, 0x90, 0x78, 0xe6, 0x54, 0x53, 0x2e, 0x08, 0x68, 0xf2, 0x06, 0xa4, 0x68, 0xb5, 0xb5, 0xeb, 0xd3, 0xed, 0xdb, 0x4f, 0x67, 0x35, 0x36, 0xe5, 0xf0, 0xf8, 0x16, 0x0e, 0x5f, 0x33, 0x11, 0x56, 0x1b, 0x7c, 0xf7, 0x9c, 0x9c, 0x44, 0x09, 0x74, 0x35, 0x59, 0x65, 0xc9, 0x31, 0xae, 0xc5, 0xc7, 0x22, 0x5f, 0x69, 0xf7, 0x76, 0xf0, 0x52, 0xac, 0x4b, 0xd6, 0xb1, 0x9f, 0x85, 0x38, 0x9f, 0xd6, 0x1d, 0xf6, 0x0e, 0xca, 0xbb, 0xeb, 0x00, 0xc8, 0x88, 0x6f, 0xf7, 0x98, 0x3d, 0x20, 0xac, 0x5d, 0x81, 0xe3, 0x03, 0xbc, 0x71, 0x25, 0x3f, 0x40, 0x80, 0x67, 0x72, 0xfd, 0x81, 0xf9, 0x38, 0x74, 0x02, 0x05, 0xa5, 0xb7, 0xdc, 0xd0, 0x7c, 0xce, 0x08, 0x3d, 0xa2, 0x58, 0xb4, 0x93, 0xd2, 0x75, 0x96, 0x7f, 0x91, 0xe4, 0x81, 0x5d, 0x65, 0x69, 0x36, 0xb3, 0x42, 0x72, 0x7c, 0xfe, 0x45, 0xf9, 0x73, 0xb2, 0xa5, 0xac, 0x25, 0x7c, 0xe6, 0x4c, 0x5e, 0xca, 0x4f, 0x53, 0xbe, 0x8d, 0x9f, 0xd9, 0x0c, 0x3d, 0xfc, 0xb8, 0xcd, 0x1e, 0x2c, 0xef, 0x15, 0xc3, 0x07, 0x44, 0x9e, 0xd0, 0x2c, 0x2e, 0x17, 0x04, 0xf4, 0xf1, 0xbe, 0x76, 0xa4, 0x0b, 0x31, 0x1e, 0xe7, 0xcf, 0x81, 0x98, 0x7b, 0x50, 0x89, 0x25, 0x2a, 0x80, 0x7e, 0xf3, 0xfc, 0x99, 0xc7, 0x9e, 0xab, 0xbc, 0x0e, 0xf6, 0x57, 0xd8, 0x97, 0x03, 0x7b, 0xce, 0xd0, 0x46, 0x20, 0xd3, 0x2a, 0x42, 0x50, 0x15, 0x28, 0x3b, 0xce, 0xa1, 0xb5, 0x3e, 0x04, 0x84, 0xbb, 0x61, 0x3d, 0x30, 0xf1, 0x4c, 0x14, 0x22, 0xf5, 0xf8, 0x2c, 0xc2, 0x9a, 0xb7, 0x22, 0x8b, 0x83, 0x75, 0xc0, 0x6b, 0xf1, 0x3d, 0x74, 0x6d, 0xd9, 0xff, 0x00, 0x95, 0x3a, 0x90, 0x72, 0x0b, 0xad, 0xf2, 0x57, 0x7d, 0x3e, 0xd6, 0x2c, 0xbe, 0x7a, 0x5f, 0x15, 0xb3, 0xc9, 0x29, 0xd2, 0x6f, 0xfe, 0x8a, 0xee, 0x9d, 0x2d, 0x17, 0x39, 0x1e, 0xbc, 0x6a, 0x79, 0xf4, 0xbd, 0x23, 0x5d, 0x5f, 0x7b, 0x2d, 0xb2, 0x45, 0x53, 0x43, 0xd9, 0xd7, 0xc6, 0xb2, 0x79, 0x72, 0xcc, 0x60, 0x71, 0xc3, 0x6a, 0x0d, 0x11, 0x2f, 0x86, 0xd9, 0x89, 0x72, 0xfb, 0x06, 0xa1, 0x86, 0xe9, 0x00, 0xab, 0xc6, 0x4e, 0x9a, 0xb6, 0x53, 0xdb, 0x9b, 0x05, 0xb7, 0x00, 0x79, 0xc0, 0xc8, 0x4a, 0x64, 0xe8, 0xcf, 0xee, 0x86, 0x90, 0xea, 0xa6, 0x8a, 0x4b, 0xaf, 0xbb, 0x5b, 0xe1, 0x12, 0x63, 0x2e, 0x46, 0x89, 0x4e, 0xc2, 0xcc, 0x6e, 0x7c, 0xe6, 0x97, 0xa4, 0x51, 0x3d, 0x51, 0x7d, 0xeb, 0x3e, 0x20, 0xdb, 0xb3, 0x7e, 0xd5, 0x96, 0x32, 0x32, 0x67, 0x1e, 0x27, 0xef, 0x9f, 0x62, 0xd6, 0xb5, 0x14, 0xf0, 0xa2, 0x2c, 0x5a, 0x5d, 0xde, 0x2d, 0x77, 0xe7, 0xe1, 0x84, 0x96, 0x59, 0x58, 0xf5, 0x00, 0x2f, 0xe1, 0x7d, 0x47, 0xfb, 0xd5, 0xd9, 0xc4, 0x07, 0x64, 0x4d, 0x44, 0x3c, 0xe8, 0x9e, 0xff, 0x42, 0x73, 0x60, 0xca, 0xe9, 0xaa, 0x78, 0x8d, 0xc8, 0xd7, 0xd9, 0xf6, 0x24, 0x39, 0x91, 0x6f, 0x13, 0x9f, 0x09, 0x4e, 0xe0, 0x35, 0x88, 0x4c, 0xb2, 0x9d, 0xfa, 0x39, 0x69, 0x41, 0xf0, 0xee, 0xc9, 0xe8, 0xe7, 0x82, 0xda, 0x88, 0xcd, 0xc1, 0x8e, 0x5b, 0xc1, 0xd9, 0xa5, 0x35, 0x1b, 0x57, 0xce, 0x15, 0xac, 0x52, 0x0f, 0xfa, 0x47, 0xe6, 0x66, 0xf8, 0x7f, 0xe5, 0xb1, 0x8a, 0xb3, 0xc8, 0xcb, 0x2a, 0x48, 0xec, 0xf8, 0x1f, 0x36, 0xfb, 0x83, 0x97, 0xc6, 0xa7, 0xa5, 0xf5, 0x9a, 0x9f, 0xa9, 0x6c, 0xed, 0xbb, 0x4e, 0xcd, 0x1c, 0x7a, 0x6d, 0x9d, 0x65, 0xaf, 0xdb, 0x6b, 0xef, 0x77, 0x91, 0x60, 0x0b, 0x6e, 0x0a, 0x18, 0xba, 0x23, 0xed, 0xb0, 0x6f, 0xc9, 0xec, 0x21, 0x16, 0x2f, 0xec, 0xcc, 0x54, 0xf2, 0x66, 0x56, 0x11, 0xf1, 0x0d, 0xb5, 0x34, 0x01, 0xb1, 0x8b, 0xad, 0xe2, 0x63, 0xb3, 0xb9, 0x72, 0xda, 0x1a, 0x61, 0x21, 0x15, 0xd1, 0x44, 0xa5, 0x42, 0x60, 0x97, 0xef, 0xdf, 0x5c, 0x6a, 0x5d, 0x1f, 0x3c, 0x2d, 0x31, 0x8f, 0x68, 0x72, 0x42, 0xf9, 0x93, 0xf5, 0xf1, 0x88, 0x4b, 0xd9, 0x5f, 0x2e, 0xce, 0x34, 0xdd, 0x43, 0x20, 0xce, 0xa4, 0x6f, 0x5a, 0x26, 0xc7, 0xc9, 0x45, 0xb6, 0x65, 0x40, 0x27, 0x78, 0x23, 0x3b, 0xdd, 0xa9, 0xd9, 0x7c, 0x2a, 0xcd, 0x8c, 0x4a, 0x4f, 0xf3, 0x9d, 0xcf, 0xdc, 0x3a, 0x3f, 0xbf, 0xc5, 0x94, 0x2e, 0x3a, 0xb8, 0xca, 0x9f, 0xf4, 0xae, 0xc1, 0x72, 0x93, 0xc1, 0xfb, 0xaf, 0x58, 0x3d, 0x60, 0x30, 0x02, 0xf9, 0x3f, 0x9b, 0xef, 0xe8, 0x90, 0x94, 0x85, 0xeb, 0x7c, 0x30, 0xd0, 0xe9, 0x1f, 0xac, 0x6c, 0x22, 0x8c, 0x5f, 0xa6, 0xc0, 0x11, 0xed, 0xde, 0xaf, 0xbd, 0xbe, 0x30, 0xaf, 0x20, 0xae, 0x53, 0xa8, 0x52, 0x06, 0xc0, 0x3d, 0x37, 0xac, 0x17, 0xa3, 0x00, 0x96, 0xbf, 0xb4, 0xf5, 0x84, 0xcd, 0x3f, 0x72, 0xef, 0x28, 0xa3, 0x30, 0x3c, 0xea, 0x9c, 0xc6, 0x36, 0x09, 0x5c, 0x70, 0xbb, 0x36, 0xde, 0x0e, 0xb5, 0x05, 0x77, 0x70, 0x4d, 0x4f, 0xae, 0xd0, 0x5b, 0xd5, 0x4d, 0xa0, 0x20 ],
+    const [ 0x68, 0x17, 0x37, 0xf9, 0x3f, 0xfd, 0x83, 0x5d, 0x7b, 0x51, 0xaf, 0xa8, 0x71, 0x23, 0x56, 0x94, 0x48, 0x12, 0x72, 0xc7, 0x5a, 0x1a, 0xdb, 0x4a, 0xdd, 0xae, 0x0a, 0x3c, 0xc3, 0x07, 0x23, 0xc8, 0xde, 0xbb, 0x33, 0x54, 0x48, 0x91, 0xb5, 0xfb, 0x02, 0x94, 0x5c, 0x3e, 0xdb, 0x66, 0x0c, 0xf6, 0x94, 0xd7, 0x29, 0x8d, 0x41, 0xb6, 0x15, 0x6e, 0xf2, 0xe8, 0xf4, 0xba, 0x93, 0xb6, 0xb3, 0x3d, 0x11, 0x6b, 0x48, 0xa0, 0xbf, 0x1f, 0x3b, 0xe0, 0xf7, 0xce, 0x65, 0xff, 0x04, 0xad, 0xf8, 0xf9, 0x3f, 0xbd, 0xbf, 0xf9, 0x79, 0xa0, 0xa7, 0xcd, 0x99, 0xac, 0x7f, 0x97, 0x86, 0x3e, 0xfc, 0xc6, 0x48, 0x50, 0x00, 0x45, 0x6a, 0x4e, 0x1b, 0xf2, 0xa2, 0x26, 0x53, 0x52, 0xb4, 0x9f, 0x20, 0x83, 0x93, 0xeb, 0xbb, 0x72, 0xc9, 0x7f, 0x98, 0x4e, 0x1a, 0x22, 0x31, 0x3c, 0x64, 0x44, 0x06, 0x4c, 0xca, 0x92, 0xe2, 0xab, 0x11, 0xc7, 0x5f, 0x1b, 0x4a, 0xc5, 0xac, 0xa1, 0xb2, 0xe4, 0x8e, 0x7d, 0xd6, 0x8a, 0xa5, 0x5f, 0xfb, 0xfc, 0xf1, 0xd8, 0xbc, 0x73, 0x95, 0x0f, 0xf5, 0x73, 0xda, 0xb5, 0xe0, 0x58, 0x76, 0x3b, 0x7e, 0x32, 0x0f, 0x42, 0x39, 0xd2, 0xfb, 0x53, 0xc7, 0x25, 0x4a, 0xd0, 0x51, 0xc1, 0x06, 0x2a, 0xd5, 0xbe, 0xb9, 0x55, 0xc9, 0xc7, 0x30, 0x79, 0x01, 0x70, 0x7f, 0xeb, 0xd2, 0xca, 0x45, 0x5b, 0x78, 0x36, 0x31, 0x4f, 0xb5, 0x76, 0xc5, 0xd0, 0xbb, 0x0a, 0x5a, 0x62, 0x4c, 0xb9, 0x65, 0x3a, 0x20, 0x6e, 0xf8, 0xac, 0x87, 0x45, 0x8c, 0xe3, 0x4f, 0xe6, 0xfd, 0xd4, 0xe8, 0x12, 0xd6, 0x74, 0xc6, 0x7b, 0xcf, 0x29, 0x07, 0xd9, 0x94, 0x7f, 0x56, 0x3a, 0xc8, 0x1d, 0x0f, 0x99, 0x4a, 0xf7, 0xa3, 0xb3, 0xb7, 0xc5, 0x3f, 0x16, 0x30, 0xb3, 0xa8, 0x7b, 0x5d, 0x5a, 0x6a, 0x55, 0xb1, 0xef, 0x31, 0xaa, 0xf0, 0xba, 0x77, 0x22, 0xef, 0xca, 0x5f, 0x5e, 0x9c, 0xe8, 0xe1, 0x8a, 0x3d, 0xc9, 0x28, 0x36, 0xfd, 0x88, 0x38, 0x61, 0xa4, 0x53, 0xd4, 0xd7, 0xa6, 0x64, 0x9f, 0xbe, 0x5f, 0x32, 0x81, 0x6b, 0x9d, 0xe9, 0x4c, 0x7a, 0x5f, 0x18, 0xa0, 0x1d, 0xdc, 0xaa, 0x0c, 0xb4, 0xc7, 0x18, 0x75, 0x9e, 0xd2, 0xdd, 0xbc, 0x4f, 0x71, 0x29, 0x9b, 0xa3, 0xe0, 0xd9, 0xd0, 0x72, 0x67, 0xa7, 0x7e, 0x65, 0xdd, 0x9e, 0xd0, 0x08, 0x6b, 0xd2, 0xdf, 0x20, 0x92, 0x4d, 0xd6, 0x3e, 0x6f, 0x4c, 0x54, 0x94, 0x3e, 0xac, 0x11, 0x08, 0x1e, 0x9f, 0xc5, 0x87, 0x13, 0xa3, 0x45, 0x9c, 0x51, 0xb5, 0xef, 0x41, 0xb8, 0xc1, 0x49, 0xf5, 0x9b, 0x5e, 0xe5, 0x0e, 0xc5, 0xb8, 0x88, 0x51, 0xbe, 0xcd, 0x8a, 0xc0, 0x4a, 0xdd, 0x80, 0xb3, 0x33, 0x1b, 0x19, 0x2a, 0x48, 0xa9, 0x46, 0x62, 0xa6, 0xc3, 0x9e, 0xa6, 0x36, 0x3b, 0x00, 0x68, 0x77, 0x25, 0x7a, 0x90, 0x7e, 0xd3, 0x69, 0x14, 0x3b, 0x04, 0xe2, 0xc9, 0xfd, 0x58, 0x51, 0x79, 0x38, 0x07, 0x60, 0x35, 0x87, 0xd3, 0x1b, 0xec, 0xed, 0x3b, 0x51, 0x3d, 0x60, 0xf2, 0x3d, 0x8a, 0x88, 0x8f, 0x65, 0x4e, 0xc4, 0x86, 0xc3, 0xb0, 0x6e, 0x57, 0x23, 0x58, 0x60, 0x05, 0xcc, 0x81, 0xb6, 0xca, 0x62, 0x4f, 0xd6, 0x09, 0x0b, 0x63, 0xae, 0x84, 0xd1, 0xae, 0x3d, 0xcf, 0x48, 0x82, 0x55, 0x05, 0x70, 0xef, 0x9f, 0xb9, 0xdc, 0x4c, 0xdf, 0x2f, 0x14, 0x14, 0x79, 0xcc, 0x39, 0xf4, 0x35, 0xcc, 0xe7, 0x21, 0x3f, 0x33, 0x5f, 0xef, 0x72, 0x06, 0xe6, 0xa0, 0xd5, 0xba, 0x68, 0x79, 0x66, 0xed, 0x61, 0x1c, 0x17, 0x54, 0xfe, 0x11, 0x17, 0xf5, 0x7f, 0xa6, 0x52, 0x96, 0xdf, 0xf9, 0x3b, 0x75, 0xb7, 0x53, 0xc9, 0x39, 0x60, 0xb7, 0xbf, 0x29, 0x57, 0xbb, 0x31, 0x9c, 0xe6, 0x97, 0x44, 0xb0, 0x01, 0x7c, 0x35, 0x3f, 0x6f, 0x27, 0x9d, 0x0f, 0x2a, 0xb5, 0xf3, 0x49, 0x07, 0xb9, 0x52, 0x2d, 0x99, 0x8c, 0x7c, 0x03, 0x53, 0xe4, 0x20, 0x55, 0xee, 0xa8, 0x58, 0x5b, 0x0a, 0x03, 0x76, 0xb7, 0x18, 0xb8, 0x00, 0x63, 0x77, 0xb5, 0xf9, 0xe7, 0xdd, 0xea, 0x62, 0xcf, 0xf9, 0x5b, 0x01, 0x5c, 0x57, 0x74, 0x61, 0x7a, 0x83, 0x9d, 0x1a, 0xf2, 0x71, 0x0f, 0x52, 0xe1, 0x1c, 0xe6, 0x84, 0x69, 0x6e, 0x77, 0x81, 0xa6, 0x60, 0xe3, 0xb4, 0xe3, 0x62, 0xed, 0xa9, 0x0e, 0xfd, 0x08, 0xd1, 0x6a, 0xb7, 0xb4, 0x7f, 0x84, 0x37, 0x0b, 0x37, 0x68, 0xa9, 0x97, 0x28, 0x14, 0x64, 0x67, 0xf7, 0x2d, 0xca, 0x62, 0xbe, 0xf1, 0x70, 0xdb, 0x55, 0x6d, 0x80, 0x65, 0xd0, 0xf0, 0x5b, 0xe8, 0x48, 0xbf, 0x82, 0xf4, 0xdf, 0x0a, 0xb6, 0x56, 0xfe, 0x1f, 0x5e, 0xe9, 0xe1, 0xde, 0x2a, 0xaf, 0x56, 0x6d, 0xf6, 0x20, 0xc1, 0x2d, 0xf1, 0xc2, 0x64, 0xec, 0xfe, 0xfa, 0xdd, 0x5c, 0x5a, 0x22, 0xf0, 0xc3, 0x7f, 0xdb, 0x87, 0xf5, 0x49, 0xa5, 0xf7, 0x80, 0x58, 0xad, 0x85, 0x26, 0xb5, 0xe5, 0x29, 0x90, 0xb8, 0x5a, 0x92, 0x40, 0x29, 0xc3, 0x69, 0xc8, 0xa5, 0x55, 0xda, 0x39, 0x43, 0xdf, 0x51, 0xdf, 0x78, 0x12, 0x81, 0x2b, 0x38, 0x20, 0xab, 0xf1, 0x5e, 0x8a, 0x1d, 0xd4, 0x4e, 0x32, 0xf9, 0xfe, 0xd9, 0xb8, 0x37, 0x14, 0x61, 0x03, 0xed, 0x68, 0x3d, 0x1e, 0xce, 0x71, 0x5e, 0x46, 0xf1, 0x79, 0x33, 0x41, 0xd5, 0x96, 0xcb, 0xf1, 0xa1, 0xdb, 0x3a, 0x28, 0xb0, 0xcf, 0x3d, 0xbe, 0x4c, 0x1e, 0x21, 0xe1, 0xba, 0x8f, 0xe0, 0xad, 0x78, 0x36, 0x8e, 0xfc, 0xc2, 0xeb, 0xf3, 0x80, 0x5a, 0xfb, 0x7a, 0x0f, 0x89, 0x1d, 0x4a, 0x3d, 0x61, 0xa7, 0xb2, 0x30, 0x46, 0x01, 0xca, 0xb0, 0xad, 0x5a, 0x57, 0x7e, 0x22, 0x9b, 0xf0, 0xe7, 0x90, 0x99, 0x5f, 0x98, 0xbd, 0x8f, 0x4a, 0xb4, 0x14, 0xcb, 0x13, 0x24, 0xa7, 0xa7, 0xfc, 0x2f, 0x74, 0xbb, 0x8f, 0x4a, 0xe7, 0x51, 0x3d, 0x31, 0xa1, 0x19, 0x45, 0x36, 0x78, 0x1f, 0xd7, 0xd9, 0xbf, 0xf9, 0x79, 0x9a, 0xc7, 0x45, 0xab, 0x0b, 0xa5, 0x53, 0xc6, 0x29, 0x36, 0x1e, 0x2a, 0xec, 0x61, 0x81, 0x98, 0x1d, 0x9c, 0xa7, 0xdd, 0x68, 0xb2, 0xc4, 0xb1, 0xb2, 0xc3, 0x02, 0xde, 0xad, 0x8c, 0xbf, 0xa5, 0xa9, 0xe8, 0xf5, 0x5d, 0xad, 0x97, 0xf9, 0x5d, 0xc6, 0x3f, 0x69, 0x1c, 0x9f, 0xb0, 0x5f, 0x97, 0x52, 0x6c, 0xeb, 0xf3, 0x7e, 0x67, 0xc1, 0x64, 0x9a, 0x0b, 0x2e, 0x4d, 0x88, 0x7f, 0x51, 0xa9, 0x6d, 0x29, 0x87, 0xa9, 0xc1, 0x72, 0x27, 0x9e, 0xa2, 0xc9, 0x70, 0x1a, 0x6e, 0xea, 0xbf, 0x52, 0x90, 0x60, 0x05, 0xc7, 0x9a, 0x48, 0x79, 0x26, 0x95, 0x59, 0x8a, 0x6c, 0x94, 0x21, 0x18, 0x4d, 0x90, 0x91, 0xe3, 0xd7, 0x6f, 0xbc, 0x44, 0x53, 0x66, 0xdc, 0x1b, 0x6c, 0x81, 0x96, 0x08, 0x93, 0x80, 0x7f, 0xde, 0xa1, 0xe5, 0xde, 0x54, 0xbe, 0x4b, 0xb4, 0xfe, 0x82, 0xf9, 0xf9, 0x7c, 0x5b, 0xb7, 0x29, 0xf2, 0x2f, 0xe1, 0xff, 0xb8, 0x42, 0xb9, 0x80, 0x52, 0x59, 0x01, 0x3c, 0xa2, 0x20, 0xca, 0xd1, 0x5c, 0xc9, 0x87, 0xb0, 0xbb, 0xf6, 0x65, 0x24, 0x72, 0xd9, 0xdf, 0x90, 0xe6, 0x99, 0x8c, 0xf8, 0x9a, 0xf8, 0x3c, 0xc2, 0xea, 0x34, 0x44, 0xbe, 0xfd, 0x2a, 0x16, 0x65, 0xf5, 0xc1, 0x15, 0x5e, 0x68, 0x86, 0xa7, 0x47, 0x14, 0x94, 0x8b, 0xb1, 0xce, 0xb7, 0x6d, 0x6c, 0xbc, 0xd1, 0xb7, 0x06, 0xc4, 0x7c, 0xab, 0x8e, 0x44, 0xf0, 0xaf, 0x9d, 0x04, 0x28, 0xe7, 0x98, 0x69, 0x40, 0x09, 0x2f, 0xeb, 0x22, 0x6d, 0x29, 0xc8, 0x61, 0x64, 0x64, 0xfa, 0x65, 0xcb, 0x17, 0x67, 0xc9, 0xe0, 0x5b, 0x59, 0x01, 0x54, 0xea, 0x2d, 0x40, 0xa1, 0x26, 0x4f, 0x98, 0x9d, 0x5d, 0x66, 0x64, 0x4f, 0x4b, 0xcb, 0xe3, 0x02, 0xe0, 0x40, 0x25, 0x99, 0x44, 0xdf, 0x2b, 0x22, 0x19, 0x50, 0x4a, 0xae, 0x00, 0x3f, 0xd0, 0x5f, 0x5e, 0x0d, 0xea, 0xc2, 0x60, 0xc6, 0xc5, 0x5f, 0x3c, 0x54, 0xf4, 0x8f, 0xba, 0xf2, 0x12, 0x8e, 0xf4, 0xe3, 0xa8, 0xd1, 0x59, 0x63, 0x50, 0x9a, 0xf8, 0xde, 0x1b, 0xc9, 0xfc, 0x60, 0x31, 0xf5, 0x72, 0x4d, 0xb7, 0xbb, 0x53, 0x52, 0xf6, 0x56, 0xbe, 0x9b, 0xb9, 0x70, 0x85, 0x46, 0xf6, 0x38, 0xeb, 0x18, 0xb1, 0xb5, 0xac, 0x6f, 0x1e, 0x5a, 0x3e, 0x78, 0x06, 0xda, 0x57, 0xa2, 0x6b, 0x3e, 0xaf, 0x53, 0x6f, 0x34, 0x07, 0xd9, 0x72 ],
+    const [ 0x38, 0x42, 0xb0, 0x33, 0xf3, 0xca, 0x31, 0xa6, 0xf8, 0xe5, 0xa6, 0x38, 0xb3, 0x9e, 0xfe, 0xe6, 0xbf, 0x73, 0xcd, 0xcc, 0x5a, 0xff, 0x57, 0xe8, 0x16, 0xd6, 0xea, 0x21, 0xd2, 0xb1, 0x72, 0x88, 0xe9, 0xcb, 0x47, 0xdd, 0xa9, 0x8a, 0x49, 0x55, 0x07, 0x62, 0x2f, 0x9a, 0x90, 0xf7, 0x1c, 0x14, 0xa3, 0x81, 0x73, 0x67, 0xde, 0x75, 0xed, 0x3d, 0xd6, 0x62, 0xe9, 0x45, 0x0b, 0x18, 0x03, 0x7c, 0x1b, 0x10, 0xe7, 0xab, 0x35, 0x08, 0x68, 0x30, 0xd1, 0xee, 0xcc, 0x02, 0x9e, 0xff, 0x6a, 0xf0, 0xbc, 0x30, 0x78, 0x29, 0x2c, 0xcd, 0x1e, 0x01, 0x85, 0x60, 0xce, 0xf2, 0xe8, 0xd4, 0xd8, 0xe1, 0x35, 0xda, 0x39, 0xa3, 0x7f, 0x8c, 0xb4, 0xc0, 0xbe, 0x50, 0x25, 0x77, 0xc4, 0x00, 0x11, 0x02, 0x73, 0x48, 0x81, 0x1b, 0x2c, 0x4f, 0x11, 0xbe, 0x8a, 0x99, 0x44, 0x31, 0x51, 0x2c, 0x1a, 0x42, 0xa1, 0xf1, 0xe5, 0xd0, 0x70, 0x5e, 0x58, 0x8c, 0x37, 0x52, 0xe1, 0x01, 0xea, 0x40, 0x39, 0xd2, 0x2e, 0x90, 0x39, 0x43, 0xc7, 0x42, 0xef, 0xfb, 0x4f, 0xd5, 0xf1, 0x09, 0x2e, 0x67, 0xf1, 0x24, 0xc6, 0x1d, 0x92, 0x37, 0xee, 0xc5, 0x7a, 0x1d, 0xa2, 0xba, 0xa8, 0xa8, 0xf8, 0x08, 0x08, 0xe9, 0x56, 0xd1, 0x45, 0xab, 0xe3, 0xf0, 0xdf, 0x41, 0x3b, 0xdb, 0x7d, 0x82, 0x67, 0xce, 0x84, 0x11, 0x0c, 0x26, 0xe8, 0xe2, 0xe2, 0x0b, 0x43, 0xf9, 0x68, 0x51, 0x24, 0x75, 0xd7, 0xa0, 0xa9, 0xce, 0x54, 0xd3, 0x50, 0x5b, 0x69, 0x9f, 0x0a, 0x17, 0xb6, 0x75, 0x91, 0xa4, 0xe4, 0xa9, 0xfc, 0x90, 0xdb, 0xd3, 0x91, 0xd8, 0x35, 0x76, 0xda, 0xaa, 0xf2, 0xdf, 0xfb, 0x6f, 0x6d, 0x50, 0x42, 0x09, 0x8e, 0x5e, 0x00, 0x59, 0x42, 0x98, 0x97, 0x05, 0x28, 0x69, 0xd5, 0x78, 0x8e, 0x40, 0x80, 0x2a, 0x9b, 0xed, 0x32, 0x21, 0xcd, 0x4f, 0x67, 0xb8, 0xa7, 0x2c, 0xd5, 0x9f, 0xa3, 0x60, 0xfc, 0x23, 0x6e, 0x3a, 0xfd, 0xaf, 0x54, 0x23, 0xaf, 0x93, 0xf9, 0x80, 0xf0, 0x05, 0x4b, 0xda, 0x39, 0x65, 0xb4, 0x3c, 0x76, 0xc6, 0x94, 0xdd, 0x14, 0xa9, 0xee, 0xff, 0x5b, 0x0b, 0x62, 0x17, 0xfe, 0xa3, 0x5b, 0x2e, 0xf0, 0x65, 0x89, 0x87, 0x7a, 0x4a, 0x92, 0x82, 0x8b, 0x53, 0x04, 0xc0, 0x4f, 0xcc, 0x8f, 0x88, 0x02, 0xce, 0x71, 0x6a, 0x07, 0x07, 0x31, 0x22, 0x34, 0xbd, 0x90, 0xbf, 0x71, 0x11, 0xbd, 0x04, 0x81, 0x81, 0xc8, 0x0e, 0x1f, 0xb1, 0x59, 0x37, 0x4d, 0x6b, 0xa2, 0x3b, 0xe9, 0xe4, 0x92, 0x99, 0x81, 0x41, 0x4b, 0x3c, 0x68, 0x59, 0xd7, 0x5b, 0x09, 0xbd, 0x16, 0x9e, 0x7c, 0xf6, 0xfb, 0x82, 0x57, 0x0d, 0xf8, 0xfe, 0xc7, 0x51, 0xb7, 0x67, 0xdf, 0x54, 0x0b, 0x91, 0x2f, 0x37, 0x26, 0x37, 0x99, 0x27, 0x0c, 0x9c, 0x60, 0x28, 0x48, 0x73, 0x82, 0x11, 0xdd, 0xfc, 0x48, 0xd8, 0x7f, 0x71, 0x1b, 0x10, 0x03, 0xa0, 0x99, 0xb0, 0x15, 0xd9, 0xe8, 0x16, 0x29, 0x0a, 0x4a, 0x4c, 0xb4, 0x29, 0xf2, 0x89, 0x9b, 0xd2, 0x17, 0xfb, 0xeb, 0x32, 0x46, 0xc3, 0xcc, 0x23, 0xfc, 0x42, 0xb0, 0x98, 0x74, 0x93, 0xd0, 0x3c, 0xbe, 0x58, 0xd9, 0x56, 0x11, 0xba, 0xe2, 0xf0, 0x62, 0xab, 0xa2, 0x38, 0x35, 0x6e, 0xe0, 0x26, 0xb4, 0x5a, 0x2a, 0x5f, 0xfe, 0xdb, 0xca, 0x5a, 0xc1, 0xb9, 0xf6, 0xc1, 0x0b, 0x9d, 0x47, 0x1a, 0x5d, 0xd1, 0x6d, 0xa6, 0x02, 0x47, 0x20, 0x89, 0x9e, 0xdd, 0x59, 0x2c, 0x0a, 0xdf, 0xc3, 0xe0, 0x5f, 0xcd, 0x6c, 0xc4, 0x51, 0x5f, 0xc1, 0xe8, 0xbf, 0xc7, 0xb9, 0xb2, 0x87, 0x36, 0x50, 0x81, 0x9f, 0xa1, 0x37, 0x91, 0x62, 0xc5, 0xca, 0x1f, 0x27, 0x69, 0x42, 0xcd, 0x18, 0xe3, 0x2c, 0x47, 0x42, 0xdd, 0x1a, 0x27, 0xe8, 0x59, 0x98, 0x16, 0x1d, 0xf3, 0x61, 0x34, 0x92, 0x66, 0xd3, 0xbb, 0xac, 0x52, 0xa1, 0xdf, 0xd9, 0x3d, 0xc8, 0xf8, 0x25, 0xd7, 0xc4, 0xe2, 0x08, 0x82, 0x03, 0xa4, 0x82, 0x11, 0x9a, 0x51, 0x6a, 0xd0, 0x37, 0x2c, 0x04, 0xc5, 0x56, 0x0f, 0xd1, 0x36, 0xb8, 0x0e, 0xab, 0x6c, 0x11, 0x57, 0x11, 0xb6, 0x02, 0x5c, 0xbf, 0xb0, 0x46, 0x35, 0x81, 0xc4, 0x30, 0x3f, 0x4a, 0xf2, 0x55, 0x0a, 0x80, 0xcd, 0x86, 0x72, 0x9b, 0xc6, 0x01, 0x0b, 0xee, 0xad, 0xe7, 0xc3, 0xc4, 0x75, 0xf1, 0xc2, 0xaf, 0x38, 0x5f, 0x95, 0x1d, 0x7a, 0x32, 0x8c, 0x2c, 0xb2, 0x9b, 0x60, 0xc0, 0x07, 0xb3, 0x19, 0xd2, 0x57, 0x6c, 0x2f, 0x0b, 0x7d, 0xc8, 0xf0, 0x91, 0xd4, 0x49, 0x21, 0x21, 0xf7, 0xa8, 0xe8, 0x5e, 0xcb, 0xca, 0xea, 0x68, 0xc0, 0xef, 0xb0, 0xb1, 0x53, 0x2d, 0x4f, 0x0c, 0xd8, 0x1d, 0x48, 0x07, 0x76, 0xd4, 0xad, 0x7b, 0x73, 0x14, 0x85, 0x61, 0xb1, 0xc4, 0x72, 0xe7, 0x79, 0x9e, 0x91, 0xc4, 0x78, 0x28, 0xa2, 0xc8, 0x07, 0xe5, 0x69, 0xb7, 0xb0, 0xcc, 0x53, 0x57, 0xed, 0xf9, 0x5d, 0xc8, 0x32, 0xa3, 0x32, 0x14, 0x2e, 0x4e, 0x93, 0x07, 0x4f, 0x41, 0xfc, 0x41, 0x84, 0x3b, 0x85, 0x89, 0x46, 0x62, 0x06, 0x64, 0xd9, 0x7c, 0x7e, 0xe6, 0xcf, 0x61, 0xb6, 0xc9, 0xcf, 0xb0, 0x21, 0xbc, 0x94, 0xc2, 0x07, 0xfd, 0x38, 0xdc, 0xe2, 0x2a, 0xb3, 0xa9, 0x09, 0x55, 0x9f, 0xe7, 0x8b, 0x56, 0x3e, 0x60, 0x5e, 0x65, 0xbd, 0x1c, 0xb9, 0xe8, 0xba, 0xd5, 0xbe, 0x89, 0x05, 0xab, 0x5c, 0x8c, 0xa3, 0x19, 0x74, 0x5f, 0x19, 0x28, 0x3a, 0x73, 0xe7, 0xe2, 0xdf, 0x4b, 0x52, 0x0a, 0x6d, 0xd3, 0x66, 0x0a, 0xf2, 0xf2, 0x3c, 0x2d, 0xe0, 0x62, 0x79, 0x0e, 0xb4, 0xc0, 0x17, 0x51, 0xd6, 0xdf, 0x68, 0x90, 0xc0, 0x62, 0x57, 0x98, 0x63, 0x8a, 0xf2, 0xd6, 0xc6, 0x4c, 0x25, 0x0c, 0xf1, 0xa7, 0xc8, 0x48, 0x09, 0x34, 0xdd, 0x17, 0xbc, 0xff, 0x12, 0xf6, 0xe0, 0x95, 0x8e, 0x09, 0x56, 0x5e, 0xe9, 0x10, 0x35, 0x2d, 0x7c, 0x96, 0x24, 0x16, 0xdc, 0x6b, 0x08, 0x80, 0xa1, 0x55, 0xe0, 0x7a, 0x6c, 0x03, 0xec, 0x53, 0x28, 0x42, 0x15, 0x64, 0x8f, 0x74, 0x89, 0x31, 0xf0, 0x3d, 0xa6, 0xb1, 0x30, 0x7f, 0x19, 0xe9, 0x10, 0x89, 0x47, 0xc0, 0xad, 0x8b, 0xec, 0x0e, 0x4d, 0x4d, 0x01, 0xf6, 0x58, 0x21, 0xe4, 0x76, 0xa5, 0x17, 0xb3, 0x3c, 0xf7, 0x6f, 0xf8, 0xbb, 0xc8, 0x54, 0x8c, 0x7f, 0x45, 0xc7, 0xb5, 0xbd, 0x99, 0xd9, 0x92, 0x2f, 0x6e, 0x1d, 0xb9, 0x1e, 0xb1, 0x5d, 0x1e, 0xc1, 0x96, 0x8c, 0x37, 0xc5, 0xdd, 0xfc, 0x5d, 0x2d, 0x53, 0xd1, 0x76, 0x5c, 0x9b, 0xb6, 0xd1, 0x70, 0x2e, 0xce, 0x51, 0xd2, 0xa1, 0xed, 0xce, 0x0b, 0x27, 0x09, 0xb8, 0xda, 0x56, 0xeb, 0xfd, 0x83, 0x2e, 0x2a, 0x2d, 0x69, 0x57, 0x5a, 0xdd, 0xdf, 0xaa, 0x81, 0x49, 0x3c, 0xf3, 0xca, 0x3d, 0x2d, 0xf5, 0x7e, 0x35, 0x50, 0xaf, 0x2f, 0xc3, 0xfe, 0xde, 0x37, 0x31, 0x68, 0xc3, 0x61, 0x67, 0xe5, 0x26, 0xe5, 0x10, 0x8a, 0x9b, 0x9a, 0xf9, 0xfc, 0x04, 0x67, 0xb9, 0x82, 0x57, 0xfa, 0x97, 0x5e, 0xa2, 0xbd, 0xa8, 0x5e, 0x4c, 0x06, 0x38, 0xae, 0x9d, 0x8f, 0x6b, 0xf0, 0x80, 0x25, 0x24, 0x8e, 0x88, 0xa4, 0x26, 0x4f, 0x32, 0x22, 0x7a, 0x29, 0x6a, 0x6b, 0x10, 0x57, 0x50, 0xae, 0xa9, 0xab, 0x3b, 0x75, 0xf3, 0x24, 0xfe, 0xda, 0xf6, 0xc3, 0x6b, 0xf8, 0xb0, 0x9b, 0x16, 0xa1, 0xfc, 0x28, 0x5c, 0x4f, 0xb9, 0xe1, 0xa3, 0x5c, 0x27, 0x10, 0xe2, 0x75, 0x94, 0xe2, 0x65, 0x4c, 0x39, 0xba, 0xca, 0x8d, 0x5f, 0xcb, 0x50, 0x14, 0xc6, 0xe6, 0x51, 0x5d, 0x46, 0x90, 0x0c, 0x3b, 0xb7, 0x58, 0xa8, 0xcd, 0x0f, 0x68, 0x76, 0xae, 0xca, 0x59, 0x77, 0x6d, 0x8f, 0x4c, 0x1e, 0x3d, 0x10, 0x36, 0x56, 0xed, 0x32, 0x7b, 0xc7, 0x1a, 0x6e, 0xbf, 0x55, 0xa3, 0x76, 0xf8, 0xea, 0x5d, 0x1c, 0xc8, 0x76, 0x08, 0x70, 0x0b, 0x34, 0x82, 0x29, 0xac, 0x2e, 0x3b, 0x47, 0xbc, 0x03, 0xe9, 0xf6, 0xc5, 0xe8, 0x7d, 0xb4, 0x5b, 0xed, 0x55, 0xb6, 0xf5, 0x82, 0xb3, 0x88, 0xfb, 0x39, 0x6e, 0xf5, 0x20, 0xcd, 0xe7, 0x26, 0xf2, 0x64, 0x3f, 0x0e, 0xaf, 0x11, 0xc7, 0x05, 0x5b, 0x9d, 0xb8, 0xb2, 0x0f, 0x87, 0x25, 0x2f, 0x94, 0x49, 0x2d, 0x68, 0x31, 0xdd, 0x75, 0xc4, 0xc0, 0x80, 0xd6, 0x08, 0x07, 0xb6, 0x52, 0x78, 0x46, 0x8e, 0x4d, 0x3f, 0x0d, 0x27, 0xf9, 0x10, 0x50, 0x73, 0x13, 0x0e, 0xbd, 0x3b, 0xcd, 0xe9, 0x4d, 0x63, 0x0b, 0x4a, 0x1a, 0x70, 0xd1, 0x72, 0x70, 0x47, 0xfc, 0x1e, 0x26, 0x37, 0x31, 0xad, 0x2f, 0x3a, 0x14, 0x84, 0x6c, 0x78, 0xba, 0xb2, 0xc4, 0x0d, 0x60, 0xd0, 0x77, 0x0c, 0x5d, 0x2b, 0xaf, 0xc4, 0x55, 0x26, 0x59, 0x42, 0xb0, 0xd9, 0x32, 0x17, 0x4a, 0xfe, 0x25, 0x5b, 0x6c, 0x0e, 0xd4, 0xf1, 0xfc, 0xa7, 0x75, 0x0d, 0xf0, 0x31, 0xdf, 0xf4, 0x08, 0xc1, 0xe4, 0x03, 0xbd, 0x3d, 0xe2, 0xf3, 0x75, 0xc2, 0x95, 0x5b, 0xf8, 0x42, 0x2f, 0x76, 0x27, 0x72, 0xab, 0x27, 0xec, 0xe3, 0x5e, 0x3a, 0x6d, 0x6e, 0xcf, 0xed ],
+    const [ 0x90, 0x20, 0x91, 0x8a, 0xad, 0x4e, 0xbe, 0x24, 0xbf, 0xba, 0xd9, 0xf9, 0x10, 0x93, 0x25, 0xd0, 0x9e, 0xf5, 0x20, 0xbd, 0x79, 0xba, 0x08, 0x98, 0x6d, 0x94, 0x9f, 0xad, 0xe1, 0x59, 0x2c, 0xb5, 0xff, 0x9d, 0xc2, 0x06, 0x15, 0x86, 0xc4, 0x06, 0x3b, 0xdc, 0xa9, 0xe5, 0x37, 0x60, 0xfd, 0x8c, 0x9d, 0x5f, 0xa8, 0xd0, 0x3b, 0x86, 0x73, 0xec, 0xb3, 0xf8, 0xc8, 0x2e, 0x6a, 0x9e, 0xb9, 0xf0, 0xa1, 0xbe, 0x45, 0xca, 0xe2, 0xd0, 0xd6, 0x06, 0x9e, 0x8d, 0x0d, 0x54, 0x14, 0x48, 0xc2, 0xbf, 0x74, 0x81, 0x47, 0xe0, 0x45, 0xb8, 0xed, 0x52, 0x04, 0x7f, 0xca, 0x66, 0x0e, 0xd3, 0xb9, 0x17, 0xc0, 0xac, 0xa1, 0x40, 0xdc, 0xd3, 0xfb, 0x0c, 0x2e, 0xf4, 0x8e, 0xae, 0x70, 0xf4, 0x7d, 0x53, 0x6c, 0x84, 0x84, 0x55, 0x60, 0xf7, 0x7f, 0xb2, 0xa6, 0x50, 0x2c, 0xbc, 0x94, 0xa0, 0x31, 0x12, 0xa2, 0x8f, 0x61, 0xce, 0xca, 0x38, 0x3b, 0x00, 0x35, 0x3a, 0xb3, 0x5c, 0x13, 0x0b, 0x36, 0x2f, 0xcb, 0x90, 0xe8, 0x98, 0x54, 0xeb, 0x30, 0xf4, 0xe2, 0x95, 0x76, 0x9a, 0xc6, 0xac, 0x2b, 0xc9, 0x8f, 0x8e, 0x0a, 0xde, 0x76, 0xa6, 0x9e, 0xca, 0xf9, 0x86, 0x05, 0xc4, 0xc5, 0x36, 0xf3, 0x3b, 0xd9, 0xcc, 0xfa, 0x0f, 0xe9, 0x3d, 0x08, 0x00, 0x00, 0x73, 0x31, 0x67, 0x6a, 0xa0, 0xae, 0x24, 0xd1, 0xd1, 0x26, 0xd7, 0xa6, 0xc6, 0x2d, 0x53, 0xc3, 0x01, 0x0b, 0x4f, 0x4e, 0x1d, 0xbe, 0x5f, 0xe0, 0x61, 0x42, 0x23, 0xe6, 0x95, 0x0f, 0xbe, 0x48, 0x14, 0xe4, 0x8a, 0x49, 0x23, 0xc3, 0x0b, 0xaf, 0x81, 0x3c, 0x21, 0x23, 0x40, 0xef, 0x81, 0xda, 0xd2, 0x4d, 0x65, 0x75, 0x67, 0x9e, 0x83, 0x26, 0x77, 0x48, 0x3c, 0x15, 0x9a, 0x4e, 0x17, 0x02, 0xa0, 0x17, 0x6d, 0x2b, 0xde, 0x71, 0x66, 0x70, 0xc6, 0xd5, 0x24, 0xb5, 0xbb, 0xed, 0x3d, 0x88, 0x23, 0x53, 0x6f, 0x03, 0xbd, 0x9c, 0x8f, 0xf4, 0x34, 0x95, 0xc3, 0x3c, 0xf5, 0xcc, 0xf1, 0x75, 0x3e, 0x52, 0x77, 0xd8, 0x78, 0xc0, 0x1d, 0x5d, 0xc7, 0x78, 0x47, 0x23, 0xdf, 0x2d, 0x70, 0x13, 0x19, 0xa6, 0xd3, 0xc1, 0xc6, 0xbe, 0x6b, 0x92, 0xc3, 0xb0, 0x1e, 0x24, 0x4e, 0x91, 0x36, 0xea, 0x17, 0x1e, 0x10, 0x17, 0x9a, 0xb8, 0x18, 0xbe, 0xad, 0xad, 0xf5, 0x37, 0x55, 0xb9, 0x00, 0xc4, 0xde, 0xcd, 0xfb, 0x74, 0x2b, 0x0e, 0x00, 0x48, 0x4a, 0x21, 0xb7, 0x95, 0x4b, 0xa6, 0xcc, 0xa9, 0x53, 0x02, 0xa0, 0xb1, 0xec, 0x62, 0x3f, 0xdb, 0x9f, 0xfd, 0x93, 0xb7, 0xc5, 0x99, 0xd7, 0xe3, 0x9a, 0x50, 0x4d, 0xe7, 0x93, 0x94, 0x34, 0x5e, 0xf2, 0x71, 0xf5, 0x57, 0x97, 0x12, 0x9d, 0xfa, 0x19, 0x87, 0x8f, 0x6f, 0x15, 0xc5, 0x7b, 0xfb, 0xc6, 0xee, 0x8a, 0x6c, 0xd6, 0xd3, 0xdb, 0xb8, 0x74, 0xb8, 0x33, 0xe1, 0xa7, 0x57, 0xf0, 0x1b, 0xe2, 0x27, 0x3f, 0x31, 0xd8, 0xdd, 0x8f, 0x25, 0x91, 0x33, 0x46, 0x17, 0xbe, 0xe9, 0xb2, 0x67, 0x4a, 0x0a, 0x42, 0x1e, 0x31, 0x71, 0xf6, 0x8a, 0x95, 0x8b, 0x14, 0x29, 0x0f, 0x5f, 0x1d, 0xc9, 0x43, 0xcb, 0xff, 0xec, 0xb7, 0x10, 0x8c, 0x71, 0xe5, 0x91, 0x2b, 0x71, 0x8e, 0xd7, 0xcd, 0x68, 0x52, 0xd9, 0x23, 0x95, 0x7e, 0x7a, 0x0f, 0xa3, 0x25, 0x54, 0x58, 0x88, 0x72, 0xb4, 0xa1, 0xae, 0x3c, 0xe5, 0x9c, 0x50, 0xdb, 0xb2, 0x7b, 0x28, 0x3a, 0x26, 0xa7, 0x47, 0x2e, 0x96, 0xb5, 0x44, 0x06, 0xe2, 0x96, 0x98, 0x64, 0xf7, 0x0d, 0x49, 0x4b, 0x98, 0x66, 0xc6, 0x78, 0x5f, 0x66, 0x12, 0xf6, 0xfe, 0x7e, 0x25, 0xed, 0xcb, 0x43, 0x90, 0xbb, 0x7c, 0x23, 0x5f, 0x45, 0x2e, 0x50, 0x43, 0x8f, 0xad, 0x01, 0xf1, 0x8b, 0xef, 0xda, 0xc5, 0x2f, 0xe1, 0xa8, 0xab, 0xca, 0x67, 0x52, 0x3f, 0x98, 0x9d, 0x0d, 0x33, 0x94, 0x64, 0xce, 0xf1, 0x8d, 0x1a, 0x05, 0x82, 0x7c, 0xa8, 0x88, 0xaf, 0x15, 0xc2, 0xcd, 0x66, 0x9c, 0x6a, 0x5d, 0x5f, 0xfa, 0xb6, 0x85, 0xfe, 0x10, 0xd4, 0x4f, 0x7c, 0x4b, 0x4b, 0xb1, 0x42, 0x79, 0x83, 0x03, 0x95, 0xdb, 0x88, 0xb6, 0x78, 0x7b, 0x0b, 0x44, 0xce, 0xbf, 0xaa, 0x63, 0xc0, 0x3f, 0x71, 0x7e, 0x5e, 0xd4, 0xa0, 0x65, 0x89, 0xf1, 0xae, 0x44, 0x10, 0x37, 0x8f, 0xd2, 0x19, 0x43, 0x33, 0xca, 0xc3, 0xcb, 0x4f, 0x9f, 0x09, 0xe9, 0x5f, 0x6c, 0xea, 0xb6, 0xec, 0x29, 0xc6, 0x1b, 0x0a, 0x25, 0x0c, 0xe4, 0x26, 0xb0, 0x12, 0x16, 0xfe, 0x18, 0x44, 0x83, 0xf1, 0xd8, 0x81, 0x9b, 0x79, 0x0b, 0xc2, 0x85, 0xf6, 0x27, 0xfd, 0x6f, 0xad, 0xe7, 0x49, 0x22, 0x10, 0x89, 0x42, 0xd9, 0x40, 0x3a, 0xaf, 0x53, 0xd0, 0xcf, 0x62, 0x27, 0xcc, 0xb5, 0x60, 0x58, 0xf9, 0x2b, 0x42, 0x29, 0x5f, 0xae, 0xdb, 0x32, 0x05, 0xb5, 0x1b, 0xb4, 0xfc, 0x9f, 0x33, 0x2a, 0x9e, 0xea, 0xfa, 0x20, 0x18, 0xa5, 0x90, 0x48, 0x26, 0x28, 0x41, 0xcb, 0x1e, 0x02, 0xac, 0xdd, 0x30, 0x33, 0x24, 0x94, 0xec, 0x9c, 0x56, 0xfa, 0x04, 0xb3, 0x2c, 0x61, 0x54, 0x7b, 0xf2, 0xf6, 0x1f, 0xb4, 0xb8, 0x99, 0x9c, 0x4e, 0xf7, 0xec, 0xb1, 0x24, 0x77, 0xaa, 0xfe, 0xe7, 0x6f, 0x3b, 0x1d, 0x58, 0xef, 0x85, 0x28, 0xbb, 0x7b, 0x04, 0x7c, 0x88, 0xf8, 0x1d, 0xbd, 0x63, 0xcd, 0xaf, 0x1b, 0x4e, 0x42, 0xec, 0xd3, 0x1e, 0x2b, 0x67, 0xf8, 0x2b, 0xcb, 0x6d, 0x73, 0x4c, 0xf3, 0x99, 0x49, 0x03, 0x6a, 0xa3, 0x1c, 0xf4, 0x91, 0x79, 0xf5, 0x9c, 0x47, 0x91, 0x40, 0x3f, 0x0b, 0x7d, 0x18, 0x22, 0x60, 0xc0, 0xc5, 0xfb, 0x76, 0xe0, 0x83, 0xa6, 0x06, 0xbc, 0x85, 0x19, 0x7e, 0x20, 0x3a, 0x9a, 0x5e, 0x97, 0xcf, 0x30, 0xe2, 0x80, 0xf5, 0x57, 0xe1, 0x64, 0xe4, 0xf7, 0xf5, 0x87, 0xa0, 0x97, 0xdc, 0xbd, 0x7b, 0xce, 0x1e, 0x7f, 0xdb, 0xfb, 0xf0, 0x3e, 0x3d, 0x36, 0x59, 0xf7, 0x7a, 0x87, 0x93, 0x08, 0x49, 0x55, 0xb4, 0x42, 0x06, 0x21, 0x8e, 0x3f, 0xb2, 0x74, 0xd3, 0xf6, 0x3a, 0x15, 0x7d, 0x8c, 0xfc, 0x80, 0x6c, 0x6e, 0x87, 0x94, 0x51, 0x9c, 0xa2, 0x8c, 0xcc, 0x48, 0x91, 0x30, 0xd1, 0x9f, 0x93, 0x4c, 0x50, 0xe7, 0xaf, 0x62, 0x15, 0xca, 0xb0, 0x9c, 0xed, 0xf1, 0x6f, 0x04, 0x0a, 0xd5, 0x50, 0xf7, 0xa8, 0xd2, 0x0f, 0xd7, 0xf1, 0x7e, 0xbd, 0x01, 0x1e, 0x38, 0x05, 0xff, 0xe0, 0x04, 0xb4, 0xfe, 0xfe, 0x96, 0x79, 0x82, 0x3f, 0xac, 0xe8, 0x58, 0x8a, 0xa1, 0xc5, 0xcd, 0x4c, 0x3f, 0x80, 0x1d, 0x1a, 0xd6, 0xfc, 0x2e, 0x98, 0x8a, 0x94, 0x7e, 0x99, 0xf1, 0x60, 0x5a, 0x87, 0xde, 0xb4, 0x52, 0x06, 0x77, 0xea, 0xe9, 0xd4, 0x8e, 0x62, 0x91, 0xf3, 0x2e, 0xc6, 0xd6, 0x0b, 0x73, 0x93, 0xd9, 0x0a, 0x9f, 0xd5, 0x00, 0x0d, 0x6b, 0x32, 0xec, 0x83, 0x9b, 0x29, 0xab, 0x8f, 0xd5, 0x9c, 0x2f, 0xaf, 0xb3, 0x8c, 0xff, 0x9c, 0x17, 0x25, 0x2d, 0x71, 0xbf, 0xfa, 0x88, 0x0e, 0x19, 0x91, 0x12, 0xbf, 0x58, 0x22, 0xb5, 0x19, 0xc7, 0x9c, 0x31, 0x25, 0x5d, 0xe9, 0x59, 0xc1, 0x92, 0x73, 0x7f, 0x42, 0x72, 0xe7, 0x2d, 0x5e, 0xf0, 0x39, 0x16, 0x4a, 0x7c, 0xe8, 0x4b, 0x1f, 0xd8, 0x83, 0xb2, 0x82, 0x27, 0x6c, 0xb5, 0x84, 0x47, 0xdc, 0x37, 0xc7, 0x60, 0x27, 0xcc, 0xe3, 0xbd, 0x41, 0x29, 0x07, 0xdb, 0x81, 0xd9, 0xe4, 0xc0, 0xa6, 0x32, 0xc6, 0x8e, 0x18, 0x88, 0x04, 0x58, 0x70, 0xa0, 0x9b, 0x34, 0x39, 0x67, 0x16, 0x92, 0xf8, 0xe4, 0xb1, 0xcc, 0x6b, 0x6c, 0xbd, 0xfe, 0x0f, 0x15, 0x46, 0x17, 0xe4, 0x6d, 0xf4, 0x30, 0x74, 0x6b, 0x2f, 0x1d, 0x12, 0xa5, 0x86, 0x42, 0x60, 0xc4, 0x52, 0xa8, 0x14, 0x35, 0x96, 0x51, 0xfb, 0x22, 0x2a, 0xc8, 0x3e, 0xa1, 0x19, 0xfb, 0xe4, 0x2b, 0x47, 0x4d, 0x98, 0x4f, 0x57, 0xe8, 0xac, 0xa7, 0xcb, 0x50, 0x5f, 0x0c, 0x6d, 0x3e, 0x5b, 0x06, 0xee, 0xab, 0x82, 0x86, 0xce, 0x2b, 0xea, 0xd8, 0x7b, 0x7c, 0x26, 0xd3, 0xbd, 0x5f, 0xc8, 0x53, 0x51, 0xa6, 0x23, 0xe9, 0xd5, 0x8f, 0x56, 0xd0, 0xe4, 0x50, 0x86, 0x23, 0x81, 0xf3, 0x6a, 0x4e, 0xb9, 0x64, 0x0d, 0xc3, 0x84, 0xc9, 0xcf, 0xee, 0xed, 0x11, 0xad, 0x6a, 0x72, 0xd0, 0xc3, 0x75, 0xae, 0x4a, 0x0f, 0xa1, 0x35, 0xcd, 0x78, 0xcd, 0xc0, 0x45, 0x0f, 0x54, 0x8a, 0x0a, 0x94, 0x84, 0xf9, 0xfc, 0x3c, 0x52, 0x81, 0xd2, 0xb1, 0x4b, 0xc6, 0xaf, 0x5b, 0xce, 0x00, 0xf6, 0xde, 0x79, 0xa4, 0x60, 0xe4, 0xe1, 0x41, 0x4c, 0x1c, 0x86, 0xa7, 0x56, 0x83, 0x06, 0x4f, 0x2a, 0xe2, 0x90, 0xf7, 0x9b, 0x97, 0x9c, 0x8d, 0xef, 0x99, 0xd9, 0x4e, 0x7d, 0xb7, 0x67, 0x2f, 0x7b, 0x20, 0x47, 0x7c, 0x11, 0x28, 0x10, 0xbf, 0xb1, 0x49, 0xe3, 0xe3, 0xab, 0x68, 0xa0, 0x99, 0xfc, 0x5a, 0x5a, 0xfb, 0x67, 0xa7, 0x09, 0x6f, 0xc8, 0x8e, 0x7f, 0xcf, 0xa4, 0x49, 0x9e, 0xc7, 0x04, 0x92, 0xc7, 0x7e, 0x84, 0x65, 0x95, 0x78, 0xa7, 0x08, 0xcc, 0xbb, 0x6d, 0x49, 0x8c, 0x30, 0x28, 0x07, 0xcb, 0x4d, 0x8b, 0xf3, 0x02, 0xf1, 0x04, 0x98, 0x25, 0x8f, 0x4c, 0x99, 0xd9, 0x8f, 0x3c, 0x3a, 0xe2, 0xf1, 0xe2, 0x22, 0xda, 0x34, 0xd4, 0x60, 0x29, 0x76, 0xc4, 0xab, 0x31, 0xdc, 0x55, 0xee, 0xc9, 0x34, 0x2d, 0x04, 0xed, 0xd9, 0x4b, 0xbf, 0xb3, 0xd7, 0x9b, 0x30, 0x81, 0x50, 0xc8, 0x22, 0x7e, 0x1f, 0x52, 0xe8, 0x46, 0xba, 0xe0, 0x59, 0xe2, 0x5d, 0xd7, 0x18, 0xf7, 0x65, 0x2b, 0x19, 0x3d, 0xfa, 0x76, 0x60, 0x33, 0xf0, 0x47, 0x0c, 0x12, 0xef, 0xbc, 0x95, 0xff, 0xd2, 0x53, 0x52, 0x84, 0x4e, 0xfd, 0x3e, 0x41, 0xd4, 0x74, 0xfb, 0xdf, 0xb8, 0xcf, 0x17, 0x46, 0x92, 0x54, 0x8f ],
+    const [ 0x56, 0x2d, 0x41, 0x2b, 0x2b, 0x65, 0xb5, 0xb9, 0x06, 0x84, 0x8a, 0xe4, 0xc8, 0xb6, 0xcb, 0xdb, 0xf3, 0x47, 0x26, 0xe6, 0xbc, 0x65, 0x9d, 0x4d, 0x62, 0x26, 0x7f, 0x76, 0xbf, 0xcd, 0x97, 0x4d, 0x1d, 0x49, 0xa3, 0xe8, 0x4a, 0xfe, 0x08, 0x6c, 0xef, 0xc8, 0xc3, 0x2a, 0x1d, 0x3d, 0xa3, 0x0e, 0x29, 0x33, 0xb5, 0x3a, 0xba, 0x83, 0x00, 0xee, 0x20, 0x0c, 0x73, 0xab, 0xe7, 0xfa, 0x1c, 0x98, 0xac, 0x48, 0x9b, 0x24, 0x30, 0x83, 0xd5, 0xed, 0xab, 0xd1, 0xed, 0xe1, 0x63, 0x33, 0x70, 0xa2, 0x7c, 0x07, 0xcf, 0x2f, 0x12, 0xd1, 0x13, 0xc2, 0x85, 0x3a, 0xcc, 0xf4, 0x14, 0x59, 0x4a, 0x27, 0xae, 0x32, 0x10, 0x25, 0x04, 0x7c, 0x86, 0x05, 0xe3, 0xa8, 0xee, 0x4f, 0xc1, 0x1e, 0x99, 0x60, 0x96, 0xca, 0x5b, 0x0f, 0xed, 0xd7, 0x3c, 0x90, 0x3a, 0xba, 0x70, 0x99, 0x6e, 0x73, 0x8a, 0xc4, 0xc9, 0x0f, 0xec, 0x35, 0xef, 0x72, 0x82, 0x7c, 0x3f, 0x53, 0xb0, 0xbc, 0x60, 0x88, 0x88, 0x0d, 0x1c, 0x84, 0x41, 0x20, 0x72, 0x1e, 0xe4, 0x22, 0xe6, 0x94, 0x49, 0xe2, 0x1c, 0xcf, 0x42, 0x35, 0xa5, 0xe8, 0x16, 0x9a, 0x19, 0xec, 0x31, 0x1a, 0x66, 0xdc, 0x19, 0x72, 0x67, 0xf8, 0xa4, 0x74, 0xb9, 0x3d, 0x69, 0xab, 0xca, 0x2d, 0x74, 0x3e, 0x32, 0xce, 0x3e, 0x16, 0x47, 0xf5, 0xdc, 0x43, 0xeb, 0xc4, 0x76, 0x9c, 0xa9, 0x72, 0xfb, 0xa6, 0x01, 0x4a, 0x13, 0xb8, 0xff, 0xf7, 0x55, 0x5c, 0x13, 0xfe, 0xbb, 0xf7, 0x1c, 0x8c, 0x52, 0xad, 0xc6, 0x72, 0x36, 0x7f, 0x16, 0x6e, 0xbe, 0xb6, 0x43, 0xac, 0xf4, 0x85, 0xc8, 0x8c, 0x48, 0xea, 0xb7, 0xa6, 0x85, 0xd5, 0x50, 0x0c, 0x03, 0x8c, 0xd2, 0xce, 0x1f, 0x4e, 0x91, 0xc4, 0xe8, 0x36, 0x49, 0x87, 0x1b, 0x63, 0xb2, 0xc1, 0x52, 0x56, 0x54, 0xa7, 0x78, 0x9b, 0x9d, 0xc3, 0x80, 0xac, 0x31, 0xf7, 0x56, 0x12, 0x81, 0xbf, 0x16, 0xcd, 0x9f, 0xb6, 0x7d, 0xf6, 0x51, 0x5c, 0x9d, 0xa3, 0x64, 0x16, 0xd4, 0x0b, 0x42, 0x76, 0xfe, 0xeb, 0xc7, 0xbd, 0xea, 0x28, 0x51, 0x9e, 0x0b, 0xb5, 0x16, 0x45, 0x70, 0xb7, 0xbb, 0x98, 0xf6, 0xe7, 0x22, 0xbd, 0xbd, 0x38, 0x83, 0xdc, 0xd8, 0xbb, 0xbe, 0x26, 0x49, 0xbf, 0xef, 0x16, 0x2c, 0x3c, 0x43, 0xf6, 0x32, 0x72, 0x0b, 0xa6, 0x51, 0xcd, 0x0f, 0x99, 0xba, 0x0c, 0x25, 0x20, 0x0c, 0xa2, 0x02, 0xeb, 0xc7, 0x5c, 0x4f, 0xcc, 0x03, 0x45, 0x00, 0xbf, 0x62, 0xc7, 0xe1, 0x28, 0x43, 0x12, 0x71, 0x5b, 0x38, 0xc2, 0xf4, 0x61, 0xbb, 0xbb, 0xc4, 0xfa, 0x1c, 0x58, 0xe8, 0xde, 0xbe, 0xc6, 0xe7, 0x48, 0x83, 0xaa, 0xde, 0xb5, 0x85, 0x0a, 0xd1, 0xe9, 0x07, 0x6a, 0x3f, 0x34, 0xab, 0x35, 0xf9, 0xf3, 0xe5, 0x5f, 0x34, 0x59, 0xaf, 0x49, 0xdc, 0x70, 0x7e, 0xe5, 0x2b, 0x5a, 0x75, 0x1a, 0x7b, 0xdd, 0xd9, 0x6a, 0x58, 0x1f, 0xc6, 0xd2, 0xda, 0xad, 0x20, 0xf1, 0x31, 0xc2, 0xcb, 0x6d, 0x82, 0xc7, 0x1f, 0x93, 0xf2, 0x16, 0x96, 0x3d, 0x00, 0x03, 0xc8, 0xf9, 0x17, 0x1d, 0x9a, 0x67, 0x63, 0xb1, 0xb2, 0xe3, 0xe5, 0x90, 0x2e, 0x64, 0xc2, 0x12, 0x95, 0xa4, 0xe1, 0x5b, 0x0d, 0x82, 0xb4, 0xdd, 0xcf, 0xa4, 0x56, 0x1e, 0xd9, 0x60, 0xd7, 0xbc, 0xe2, 0xdd, 0xd4, 0xae, 0x93, 0x75, 0x4a, 0xcc, 0xf4, 0x5e, 0xab, 0x92, 0x25, 0x8a, 0x32, 0x21, 0x4e, 0xcb, 0x74, 0x86, 0xd8, 0x3b, 0x39, 0x3f, 0xde, 0xdb, 0x89, 0xfb, 0xde, 0x7a, 0x0a, 0xa2, 0xb5, 0xd9, 0x89, 0x95, 0xca, 0x0c, 0xd6, 0x37, 0x89, 0x23, 0xd5, 0xac, 0x13, 0x0a, 0xd2, 0xe1, 0x33, 0xae, 0x15, 0xcc, 0x95, 0x61, 0xb6, 0xf5, 0x32, 0x80, 0xb3, 0x35, 0x0f, 0x53, 0x40, 0xbd, 0x27, 0x34, 0x5e, 0x5b, 0xa5, 0xf4, 0xaf, 0xf9, 0x57, 0x7a, 0x89, 0x67, 0x60, 0xad, 0x49, 0x5a, 0x2d, 0x95, 0xea, 0xb4, 0xaa, 0xbc, 0xd6, 0x05, 0xb5, 0xdb, 0xfb, 0x52, 0xd3, 0xb2, 0x22, 0x16, 0x21, 0x38, 0x7c, 0x87, 0x8e, 0xf4, 0x7e, 0x1a, 0x48, 0xab, 0xef, 0x49, 0x74, 0x3b, 0x40, 0x94, 0x22, 0xc7, 0x1b, 0xc6, 0x80, 0x14, 0x3e, 0x79, 0x4d, 0x33, 0x8a, 0xdc, 0x91, 0x61, 0x57, 0xb4, 0x8c, 0x2b, 0x0b, 0xa1, 0xec, 0xd6, 0xeb, 0xa3, 0x43, 0xfd, 0x31, 0xdc, 0xb7, 0x7c, 0x5e, 0x98, 0xfc, 0x8d, 0xd1, 0x8a, 0x7f, 0x31, 0x99, 0x58, 0xe4, 0xd2, 0x88, 0x5b, 0xb3, 0x26, 0x88, 0xa0, 0x4e, 0x56, 0x32, 0x32, 0x27, 0x60, 0x9d, 0x9b, 0x2f, 0xba, 0x74, 0xa8, 0x92, 0x38, 0x4c, 0x6d, 0xa1, 0x2f, 0x34, 0x89, 0x0f, 0xdb, 0x8d, 0xab, 0x61, 0xfe, 0x1c, 0x55, 0xa0, 0xca, 0x5d, 0xe0, 0x51, 0x01, 0x1a, 0xc1, 0xa7, 0x5b, 0x3d, 0x0a, 0xf6, 0x28, 0xe3, 0x34, 0x6b, 0x36, 0xb1, 0x1b, 0xfb, 0xf5, 0x6b, 0x4a, 0x99, 0xd9, 0xc2, 0x79, 0xac, 0x00, 0x6e, 0x54, 0xc0, 0x15, 0x7d, 0x7e, 0x7b, 0x74, 0xeb, 0xd6, 0xd3, 0x8e, 0x72, 0xf9, 0x7f, 0x8f, 0xa3, 0x08, 0xab, 0x3f, 0x36, 0xab, 0xf0, 0x26, 0x9f, 0x55, 0x83, 0xf4, 0xe2, 0xca, 0xad, 0x20, 0xa7, 0xdf, 0x7b, 0xce, 0x91, 0x81, 0xb6, 0xf6, 0xcc, 0xf9, 0x15, 0xc3, 0xe5, 0x6e, 0xb2, 0x39, 0xdf, 0xac, 0xbb, 0x1b, 0x83, 0x24, 0x6a, 0x0c, 0xf7, 0x33, 0x37, 0xf4, 0x92, 0xa7, 0x4c, 0xa5, 0xef, 0x7f, 0x39, 0xbf, 0x40, 0xf2, 0xe9, 0xd0, 0xe5, 0xb3, 0xd4, 0xc0, 0x3e, 0x74, 0x77, 0x6d, 0xbd, 0xa9, 0x01, 0x92, 0x3f, 0x8e, 0x50, 0xed, 0x9c, 0x6b, 0x1b, 0xa1, 0x7c, 0x16, 0x71, 0xd9, 0x6d, 0xba, 0x62, 0xae, 0x33, 0xd8, 0xfc, 0x4b, 0x5f, 0x8b, 0x79, 0x4e, 0x24, 0x10, 0xb6, 0x72, 0x65, 0x85, 0xe7, 0x6b, 0x12, 0xf1, 0x8a, 0x12, 0xb5, 0x85, 0x99, 0xc2, 0x48, 0x22, 0x04, 0x02, 0x4a, 0x1b, 0x5e, 0x64, 0x12, 0x3b, 0xd6, 0xad, 0x62, 0x0a, 0x6a, 0x35, 0x3f, 0x4c, 0x57, 0x91, 0x00, 0xcb, 0xd4, 0x70, 0xa6, 0x56, 0xff, 0xc3, 0x6b, 0x0a, 0x18, 0x21, 0x9e, 0xd0, 0xed, 0x69, 0xad, 0x27, 0x95, 0xa9, 0x84, 0x24, 0x61, 0x3e, 0x15, 0xb6, 0x10, 0x3d, 0x38, 0x2f, 0x42, 0x12, 0xb6, 0x00, 0x30, 0x67, 0xa0, 0xc4, 0x99, 0x48, 0xe6, 0x81, 0x00, 0x84, 0x24, 0x2a, 0x14, 0x56, 0xbf, 0x68, 0x70, 0x44, 0x31, 0x99, 0x84, 0x48, 0xa1, 0x1a, 0xd3, 0x2e, 0xb7, 0xc1, 0x60, 0x3d, 0xae, 0xae, 0x62, 0x19, 0xab, 0x44, 0x3f, 0xe8, 0x4d, 0x72, 0xb8, 0xb4, 0x85, 0x37, 0x61, 0x10, 0xa8, 0x65, 0x55, 0xff, 0xc2, 0xa5, 0x27, 0x11, 0x2e, 0xbb, 0x1c, 0xcf, 0x63, 0x0b, 0x97, 0x59, 0x11, 0x5c, 0xd4, 0x4e, 0x6d, 0xdd, 0xd9, 0xec, 0xc8, 0x65, 0xaa, 0x79, 0x67, 0xff, 0xbd, 0xe1, 0x8f, 0xa6, 0xad, 0xa0, 0xdf, 0x4d, 0x32, 0xe2, 0xe3, 0x23, 0x51, 0xe9, 0xe5, 0x14, 0xd0, 0xb0, 0x06, 0x93, 0xed, 0xce, 0x8e, 0x97, 0x50, 0x9c, 0x81, 0xe3, 0x3d, 0x9a, 0x73, 0x8b, 0x0e, 0x0f, 0x9c, 0xb4, 0xe1, 0xf0, 0x2f, 0x9b, 0x8e, 0x03, 0xe8, 0xd9, 0xdc, 0x44, 0xe4, 0xe5, 0xf4, 0x88, 0xb6, 0xda, 0x15, 0x60, 0xb7, 0x7a, 0x8a, 0x40, 0x9d, 0x73, 0xd9, 0xe1, 0x50, 0xe2, 0x3e, 0xe3, 0xf9, 0x16, 0x57, 0xb7, 0x5b, 0x96, 0x21, 0xbc, 0x66, 0x65, 0x23, 0xa8, 0x09, 0x84, 0xe9, 0x2a, 0x49, 0xb9, 0xb4, 0xce, 0x90, 0x8f, 0x70, 0x20, 0x47, 0x9e, 0xe6, 0x14, 0xa6, 0x0c, 0x33, 0xa5, 0xcb, 0x54, 0x79, 0xbd, 0x0a, 0x46, 0xd4, 0x55, 0x85, 0x50, 0x90, 0xdd, 0xfc, 0xfb, 0x99, 0xde, 0xe6, 0xb8, 0x32, 0xde, 0xc0, 0xdd, 0xea, 0x84, 0xa5, 0xeb, 0xcc, 0xfc, 0x1f, 0x12, 0xd7, 0x9d, 0x3d, 0xf7, 0xae, 0xc9, 0xe5, 0xb4, 0x90, 0x15, 0x6c, 0x20, 0x89, 0xaa, 0x64, 0x52, 0xea, 0xec, 0xb5, 0x60, 0xf8, 0x59, 0xf0, 0x6c, 0xe1, 0xb3, 0xdf, 0xe2, 0xf4, 0x61, 0x61, 0xfb, 0x10, 0x13, 0x74, 0x86, 0x5d, 0xa5, 0x94, 0xe7, 0x3b, 0x46, 0x44, 0x60, 0x78, 0xd9, 0xea, 0x8f, 0xc6, 0x9b, 0xdf, 0x38, 0x6c, 0x06, 0xc7, 0x45, 0x3b, 0xf6, 0x1e, 0x0b, 0xc4, 0x0b, 0x14, 0xcf, 0xc8, 0x4e, 0x9b, 0x89, 0xf0, 0x17, 0xbe, 0xe7, 0xbe, 0x2e, 0x34, 0x95, 0xc4, 0x30, 0x35, 0xbc, 0x14, 0x34, 0x8c, 0xc9, 0xf7, 0xaf, 0xee, 0x6f, 0xe2, 0x95, 0x8a, 0xef, 0xa5, 0xc1, 0xe1, 0x97, 0xe6, 0x97, 0xd8, 0x88, 0xce, 0xe8, 0x0b, 0xbd, 0x02, 0x15, 0x65, 0x49, 0xd5, 0x78, 0xee, 0xe0, 0xbc, 0xff, 0xe3, 0x99, 0x02, 0x1a, 0x0c, 0xf2, 0xbc, 0xd8, 0x4a, 0x15, 0x00, 0x4d, 0x70, 0x5a, 0x52, 0x36, 0x53, 0x0c, 0x5f, 0xe0, 0x25, 0x70, 0xee, 0x45, 0xfe, 0x03, 0x13, 0x78, 0xbc, 0x04, 0xa5, 0x44, 0x0d, 0x32, 0xf3, 0x10, 0xca, 0xd7, 0xb3, 0x06, 0x87, 0x05, 0x3b, 0x75, 0x68, 0x20, 0xf4, 0x73, 0x36, 0x9c, 0x0b, 0xc6, 0xb1, 0x08, 0x69, 0x05, 0x28, 0x4c, 0xe6, 0xfa, 0x48, 0x2f, 0xb9, 0x4b, 0x32, 0x1c, 0x33, 0x59, 0xd0, 0x25, 0xae, 0x69, 0x68, 0x48, 0xc0, 0x02, 0x71, 0xf1, 0xb4, 0x95, 0xa6, 0xc1, 0x3a, 0x64, 0x5a, 0x8e, 0x5d, 0x9c, 0x0b, 0xab, 0xb6, 0xc4, 0x39, 0x69, 0xdf, 0x5b, 0x78, 0xdd, 0x2b, 0xbd, 0xc5, 0xe4, 0x94, 0x47, 0x16, 0x65, 0xf5, 0xbb, 0x35, 0xd6, 0x7a, 0xe6, 0xcd, 0x02, 0x54, 0x80, 0xc5, 0x09, 0xb1, 0x53, 0xce, 0xa8, 0xeb, 0xa0, 0x38, 0xba, 0xff, 0xbe, 0x0a, 0xff, 0x42, 0x04, 0x51, 0x1d, 0x4f, 0xe9, 0xb8, 0xe4, 0x44, 0x6a, 0x59, 0xd6, 0x2e, 0xac, 0xd3, 0xe7, 0xc1, 0xe3, 0x9d, 0x81, 0x4d, 0x72, 0x9a, 0xcb, 0xed, 0x54, 0xed, 0x2b, 0x02, 0xba, 0x0e, 0x0a, 0xdf, 0xf5, 0x1d, 0xd7, 0xc6, 0x97, 0x77, 0x4e, 0x14, 0xd5, 0x88, 0xfa, 0xb8, 0x30, 0xe0, 0xf8, 0xe9, 0x55, 0x88, 0xff, 0x19, 0x41, 0x96, 0x9d, 0x24, 0xa8, 0xff, 0xc3, 0xce, 0x98, 0xad, 0x84, 0x6c, 0x5a, 0xd1, 0x1a, 0xe1, 0x99, 0x7b, 0x2a, 0xcc, 0xc5, 0x68, 0x49, 0x00, 0xba, 0x1a, 0xbe, 0x35, 0x9d, 0x2e, 0x89, 0xfd, 0x07, 0xeb, 0xa5, 0xf9, 0x66, 0x17, 0x8b, 0x4c, 0xa0, 0x0e, 0xf7, 0x50, 0xf9, 0x15, 0xee, 0x88, 0x36, 0xeb, 0x00, 0xd6, 0x02, 0xa1, 0xcb, 0xee, 0x92, 0xac, 0xc0, 0x0b, 0x85, 0x39, 0x2a, 0xe1, 0x0e, 0xc0, 0x6b, 0xd2, 0x54, 0xdc, 0x89, 0x64, 0x19, 0x5a, 0xea, 0xf3, 0x9a, 0x8f, 0x5c, 0xa3, 0xb7, 0xef, 0x59, 0x99, 0x54, 0xdc, 0x88, 0x6b, 0xff, 0xbc, 0x86, 0xd4, 0xd3, 0x4e, 0xe7 ],
+    const [ 0x53, 0x10, 0x97, 0x7a, 0x5f, 0x36, 0x89, 0xbb, 0x9a, 0xcd, 0x32, 0xb9, 0xec, 0x2a, 0x60, 0xa0, 0x27, 0xe9, 0x12, 0xff, 0xeb, 0x3c, 0x7f, 0xc1, 0xc7, 0x83, 0x5a, 0x5f, 0xa0, 0x1d, 0x55, 0x54, 0x57, 0x7e, 0xe4, 0xd0, 0xa6, 0x82, 0x43, 0xb0, 0x4b, 0x01, 0xba, 0xae, 0x69, 0xa4, 0x20, 0xd5, 0x2b, 0xf7, 0x9e, 0x39, 0xaa, 0xbf, 0xb5, 0xe4, 0x11, 0x8d, 0x82, 0x13, 0xff, 0x93, 0x41, 0xa3, 0x2c, 0xb7, 0x11, 0xc6, 0x50, 0xe6, 0xf6, 0xfa, 0x40, 0xab, 0x24, 0x3c, 0x5a, 0x00, 0x7b, 0x78, 0x24, 0x64, 0x4e, 0x45, 0x30, 0x2d, 0x68, 0xcf, 0x43, 0x20, 0x51, 0x14, 0xb5, 0x3f, 0xcd, 0x54, 0x1b, 0xe2, 0xa6, 0xc2, 0x24, 0x09, 0xab, 0x80, 0xc1, 0xf1, 0xf9, 0xca, 0x89, 0xe5, 0x79, 0x72, 0x5b, 0x57, 0xaa, 0x8c, 0x45, 0x2f, 0xa1, 0x6a, 0xa4, 0x63, 0x4e, 0xcb, 0x8d, 0xc8, 0x00, 0x4f, 0x6c, 0x28, 0x2b, 0x2e, 0xeb, 0x94, 0x6a, 0x2a, 0x16, 0xfb, 0xc0, 0xc2, 0xbc, 0xfc, 0x23, 0xa9, 0x18, 0xf9, 0x3b, 0x76, 0xb0, 0x6d, 0x67, 0x9d, 0x7e, 0x7f, 0x01, 0x9e, 0x4e, 0xd7, 0xe3, 0x7c, 0x67, 0xb0, 0x29, 0x71, 0x6d, 0x2e, 0x39, 0xe0, 0x86, 0xf2, 0x01, 0x8b, 0xbc, 0xed, 0x80, 0x06, 0xa3, 0x71, 0x88, 0x6c, 0x3b, 0x8e, 0xc2, 0x50, 0x17, 0x9b, 0xf2, 0xf6, 0xbf, 0x13, 0x7c, 0xc3, 0x54, 0xa3, 0x28, 0xf3, 0x72, 0x80, 0x22, 0x8a, 0x5a, 0xfe, 0x45, 0x8d, 0x51, 0x5f, 0x98, 0x71, 0x43, 0xe8, 0x19, 0xd4, 0xac, 0x3b, 0xba, 0x6b, 0xb9, 0xe0, 0xaa, 0x3c, 0xaa, 0x25, 0xd5, 0x0d, 0x7a, 0x28, 0xae, 0x1c, 0xc2, 0x32, 0x2c, 0x10, 0xdb, 0x46, 0x12, 0x30, 0x42, 0xfa, 0x74, 0xd3, 0x41, 0x86, 0x77, 0x17, 0xcc, 0x1b, 0x58, 0xd6, 0xaa, 0x76, 0xb0, 0xd6, 0xd5, 0xb4, 0xf6, 0x40, 0x22, 0x68, 0x45, 0x54, 0x24, 0xeb, 0x5f, 0x5a, 0x4e, 0xf3, 0xf3, 0xdc, 0x59, 0x67, 0x1b, 0x12, 0xe5, 0x72, 0x29, 0x9e, 0x63, 0xd7, 0xa3, 0x7a, 0x32, 0x84, 0x8c, 0x2e, 0x08, 0x69, 0xe5, 0x46, 0x94, 0x8a, 0x74, 0x03, 0x62, 0x53, 0xc4, 0x51, 0xfe, 0x2c, 0x6d, 0xf9, 0x5c, 0x4e, 0x95, 0x18, 0x77, 0xd5, 0xb7, 0xd0, 0x39, 0x16, 0xa4, 0x3d, 0x9b, 0x32, 0xc7, 0xaa, 0x0d, 0xec, 0xac, 0x05, 0x18, 0xb7, 0xc4, 0x91, 0x42, 0x13, 0x62, 0xdb, 0x32, 0x1a, 0x0a, 0xef, 0x14, 0x56, 0xeb, 0xcb, 0x3f, 0xd6, 0xaa, 0x14, 0x15, 0x81, 0x61, 0x08, 0x2b, 0xaa, 0xe8, 0xb4, 0xab, 0xe4, 0x53, 0x67, 0xf6, 0x17, 0xbb, 0x66, 0x8d, 0xd3, 0x42, 0xe1, 0x31, 0xe5, 0x51, 0x26, 0x49, 0x28, 0x24, 0x15, 0x85, 0x9e, 0x89, 0xd4, 0xc1, 0xbf, 0xe4, 0xc4, 0x2c, 0x11, 0x77, 0xb3, 0xa9, 0xf9, 0xe0, 0x53, 0x75, 0xd1, 0xe3, 0xea, 0x0a, 0x3a, 0x6a, 0x4c, 0x44, 0xb4, 0xca, 0x07, 0xc3, 0x6c, 0x48, 0xdd, 0x90, 0x54, 0xdc, 0x77, 0x03, 0x79, 0x35, 0x57, 0xe4, 0x92, 0xfc, 0x0f, 0xd0, 0xd4, 0x5d, 0xb0, 0xde, 0x0e, 0xc4, 0x86, 0x83, 0xf1, 0xe4, 0x02, 0xb3, 0xaf, 0xfe, 0xf8, 0x49, 0xc9, 0x60, 0x0b, 0xa9, 0x21, 0x2c, 0x65, 0xa4, 0x57, 0x5a, 0xab, 0x9c, 0x52, 0x00, 0x2f, 0xe8, 0x1d, 0xd1, 0x68, 0x79, 0xf5, 0xe4, 0xa0, 0xbe, 0xa0, 0xb8, 0xed, 0xc6, 0x00, 0x74, 0x62, 0xa5, 0xe7, 0x73, 0x86, 0x18, 0x2d, 0xff, 0x05, 0x6c, 0x00, 0x5d, 0xa6, 0x9b, 0x7c, 0x0b, 0x7d, 0xb9, 0x7b, 0x45, 0x62, 0x8e, 0xaf, 0xcd, 0xa2, 0x85, 0xee, 0xec, 0xf4, 0xc5, 0xcc, 0xb4, 0xae, 0x9d, 0x6f, 0x89, 0x38, 0x25, 0x9f, 0xe0, 0xc1, 0x22, 0x1d, 0x45, 0x32, 0x2b, 0x36, 0xa3, 0x60, 0x0a, 0x97, 0xc0, 0x86, 0x65, 0x63, 0x07, 0xf2, 0x9e, 0x83, 0x8a, 0xfe, 0xf7, 0x3e, 0x47, 0x42, 0xfa, 0x09, 0xaa, 0x08, 0x18, 0xa0, 0x54, 0x00, 0x90, 0x55, 0x1b, 0x36, 0x92, 0xa8, 0x52, 0x40, 0xa4, 0x19, 0x4a, 0xbc, 0x46, 0x3a, 0x18, 0xfa, 0xd1, 0x08, 0x99, 0xf5, 0xa5, 0x7b, 0xb4, 0x88, 0x83, 0x5c, 0xdf, 0xde, 0x38, 0x57, 0xe5, 0x2b, 0x7c, 0x51, 0xe6, 0x99, 0x19, 0xfc, 0x9f, 0x86, 0x50, 0xa8, 0xeb, 0xec, 0x78, 0x5c, 0x8a, 0x20, 0xe8, 0x25, 0x22, 0xc0, 0x17, 0xae, 0x83, 0xe6, 0x02, 0x11, 0x2f, 0xa2, 0xce, 0xed, 0x1a, 0xa8, 0xaf, 0xb9, 0xae, 0x45, 0x08, 0x57, 0x12, 0x98, 0xd4, 0xec, 0xac, 0xfe, 0x44, 0xf0, 0xe5, 0xce, 0xa9, 0x81, 0x2c, 0x47, 0x95, 0xfd, 0x3d, 0xc6, 0x3d, 0xcf, 0xa3, 0x3c, 0x22, 0x89, 0x7b, 0xe0, 0xf1, 0x34, 0x7c, 0x21, 0xa7, 0xe3, 0x34, 0xdf, 0xf8, 0x8f, 0x94, 0xda, 0xf2, 0x1e, 0xaf, 0x6b, 0xde, 0xc5, 0xbf, 0x72, 0x67, 0x90, 0x69, 0x8f, 0xfe, 0x3f, 0x42, 0x95, 0x7c, 0x54, 0x91, 0x3b, 0x09, 0x6a, 0x57, 0x15, 0x3d, 0xc8, 0x8c, 0xc3, 0x86, 0x36, 0xac, 0x69, 0xca, 0x10, 0x72, 0x5f, 0x4d, 0x98, 0xe3, 0x29, 0xd4, 0x90, 0x8f, 0xa9, 0x0b, 0x09, 0x14, 0x93, 0x24, 0x76, 0xe3, 0x22, 0xc1, 0x04, 0x47, 0x09, 0x14, 0x2e, 0xa3, 0xad, 0x44, 0x8b, 0xfb, 0x91, 0x13, 0xeb, 0xb5, 0x11, 0xbf, 0xa3, 0xa1, 0x54, 0x25, 0x25, 0x38, 0x7c, 0x2c, 0xd4, 0x21, 0x1f, 0x61, 0x16, 0xfa, 0xfb, 0xdf, 0xaa, 0x54, 0xe5, 0x72, 0x3c, 0xff, 0x03, 0xfc, 0x36, 0x89, 0x3b, 0x17, 0xda, 0x01, 0xeb, 0xfb, 0x8e, 0x00, 0xdb, 0xa3, 0x76, 0xeb, 0x70, 0x2b, 0x48, 0x72, 0x22, 0x7d, 0x5c, 0x5c, 0x2f, 0x2c, 0x03, 0x87, 0x91, 0xa0, 0x1a, 0x2a, 0x2e, 0x74, 0xdf, 0x5e, 0x50, 0x1c, 0x03, 0xdd, 0x54, 0xcb, 0x00, 0x09, 0xa6, 0x93, 0xac, 0x30, 0xed, 0xcf, 0x0e, 0x0e, 0x82, 0xbe, 0x71, 0x93, 0x27, 0x70, 0xb8, 0xe7, 0xf6, 0xe6, 0xf1, 0xac, 0x97, 0x75, 0x2d, 0x83, 0xb6, 0x6b, 0x8e, 0xd1, 0xb4, 0xf5, 0xa1, 0xc3, 0x9d, 0x40, 0xee, 0x8f, 0x5b, 0xdf, 0xce, 0xfd, 0x29, 0x6d, 0x7d, 0x27, 0x4a, 0x73, 0x70, 0x7c, 0xfa, 0x8b, 0xe9, 0x0b, 0xa5, 0xc6, 0xc8, 0xff, 0x57, 0x4c, 0xa4, 0x65, 0x74, 0x42, 0x1a, 0x36, 0xa9, 0xf1, 0x65, 0x91, 0x22, 0x24, 0x2f, 0x48, 0xfd, 0xd1, 0xa7, 0x9e, 0xff, 0xfc, 0xd4, 0x4f, 0x86, 0xd9, 0x29, 0xd1, 0xbf, 0x31, 0x59, 0xda, 0x19, 0x06, 0x6d, 0x22, 0xfa, 0x7a, 0x13, 0x6a, 0xb0, 0xed, 0x39, 0xbd, 0xaa, 0x66, 0xda, 0xf6, 0xe8, 0x34, 0x18, 0x82, 0xb0, 0xd5, 0x8c, 0x67, 0x83, 0x16, 0xda, 0x85, 0x4f, 0x7c, 0x88, 0x1c, 0xe6, 0xe3, 0x10, 0x8f, 0xaf, 0x65, 0x33, 0x68, 0x9b, 0x7d, 0x91, 0x9b, 0x5b, 0x6c, 0x77, 0x0f, 0xd1, 0xdc, 0xf8, 0x5a, 0xc4, 0xc4, 0x3f, 0xcd, 0xd7, 0x8b, 0x23, 0xb0, 0xbc, 0x70, 0xfc, 0xce, 0xa5, 0x29, 0xb5, 0x35, 0xfb, 0xca, 0x23, 0x37, 0x53, 0xe9, 0x95, 0xb4, 0x9e, 0x00, 0xad, 0x9c, 0x9f, 0x12, 0x6e, 0xaf, 0xa3, 0x92, 0x95, 0x87, 0x6c, 0x80, 0x2d, 0xd9, 0x6e, 0xd5, 0x5e, 0xf8, 0x3e, 0x21, 0x86, 0x9a, 0x47, 0x73, 0x8b, 0xdf, 0xbf, 0x79, 0x6f, 0x8f, 0xd9, 0xe8, 0x24, 0xa3, 0x3c, 0x1e, 0xa2, 0x08, 0xb5, 0x07, 0x38, 0x9f, 0x28, 0x3d, 0x1f, 0x88, 0xcd, 0x73, 0x55, 0xa0, 0x98, 0x13, 0xa8, 0x48, 0xf9, 0x26, 0x11, 0x69, 0xc6, 0x75, 0x44, 0xb5, 0x76, 0xed, 0x85, 0x2f, 0x8f, 0x48, 0xbd, 0xed, 0x61, 0xea, 0xcd, 0x1c, 0xf5, 0x09, 0x22, 0x46, 0x41, 0x11, 0x8a, 0xd0, 0x9d, 0x47, 0x46, 0xc7, 0x7b, 0xac, 0x60, 0xdc, 0x52, 0x24, 0x3f, 0xac, 0xdb, 0xd7, 0x78, 0x45, 0x80, 0xd8, 0xe7, 0xe6, 0x12, 0x05, 0xff, 0x07, 0xba, 0x2e, 0x5e, 0x99, 0x32, 0x79, 0xa4, 0x8f, 0x34, 0x04, 0x86, 0x9d, 0x33, 0xcd, 0x1e, 0x40, 0x4a, 0xcf, 0x85, 0xfe, 0x72, 0x6e, 0xa4, 0xef, 0xf7, 0x15, 0x47, 0x7c, 0x2d, 0x1e, 0x73, 0x67, 0x5f, 0xf2, 0xfa, 0x0c, 0x08, 0x71, 0x4c, 0xe6, 0x45, 0x94, 0x90, 0x54, 0x8b, 0x50, 0xf4, 0x9d, 0x95, 0xbe, 0x41, 0x32, 0xa1, 0x7a, 0xb2, 0x34, 0xdc, 0x49, 0x06, 0x36, 0x1b, 0xfe, 0xd4, 0x44, 0xcb, 0x9e, 0x1f, 0x24, 0x2b, 0xc2, 0x2a, 0xdb, 0xb9, 0x3d, 0x8d, 0x74, 0xe9, 0xff, 0x89, 0xfc, 0x1d, 0x39, 0x99, 0xd1, 0xd2, 0xc2, 0x49, 0x1d, 0x17, 0xba, 0x4b, 0x9d, 0x44, 0x6d, 0xc8, 0xa7, 0xe8, 0x79, 0xf4, 0x6b, 0x03, 0x34, 0xe5, 0x79, 0x76, 0x48, 0xa5, 0x83, 0xb7, 0xa0, 0x86, 0x64, 0xc9, 0x88, 0xb5, 0x62, 0x6c, 0x0f, 0x12, 0xb0, 0x91, 0xb0, 0x3f, 0x37, 0x10, 0x32, 0xf7, 0x97, 0x9d, 0xcd, 0xa2, 0x68, 0xf9, 0x8e, 0x26, 0xc5, 0x65, 0xfd, 0xff, 0x0b, 0x5c, 0xfc, 0x92, 0xde, 0x81, 0xf2, 0xbe, 0x6d, 0xd7, 0x29, 0xb5, 0xf7, 0x30, 0x75, 0x0a, 0x8f, 0xe8, 0x17, 0x0b, 0x1c, 0xd2, 0xe0, 0x50, 0xa3, 0x73, 0x9a, 0x94, 0xc9, 0x6e, 0xa3, 0xc4, 0x93, 0x40, 0xdb, 0x56, 0x71, 0x2d, 0xc0, 0xdc, 0x7b, 0x7a, 0xd8, 0xd9, 0xfa, 0xdd, 0x50, 0xd3, 0x2a, 0x32, 0xe2, 0xa9, 0x3e, 0x6f, 0xfc, 0x27, 0xa5, 0xda, 0x1e, 0xd8, 0x8c, 0x7a, 0x83, 0x1b, 0xa4, 0xcb, 0x05, 0x79, 0x25, 0xb6, 0x3b, 0x36, 0x13, 0xbf, 0xe4, 0x26, 0xc0, 0x81, 0x88, 0xc2, 0x92, 0x57, 0x5c, 0x7b, 0x06, 0x5d, 0x67, 0x4f, 0xf5, 0x97, 0xe3, 0x99, 0x16, 0x6f, 0xe6, 0x2d, 0xc5, 0x65, 0x41, 0xa4, 0x02, 0x02, 0xa8, 0xf5, 0xbd, 0x0d, 0x14, 0x46, 0x51, 0x02, 0x66, 0x01, 0x4e, 0xc0, 0x4d, 0x29, 0x7b, 0x82, 0x69, 0xef, 0x1b, 0x10, 0xb1, 0x80, 0x70, 0x37, 0x12, 0x22, 0x7e, 0x76, 0x58, 0x7f, 0x11, 0xfa, 0x52, 0x40, 0x01, 0xcd, 0x31, 0xde, 0xb5, 0x4a, 0x32, 0xb5, 0xe6, 0xd4, 0x7d, 0x5b, 0xa5, 0xc7, 0x4c, 0x2f, 0xa0, 0xaf, 0x4f, 0x35, 0xa1, 0xb8, 0x50, 0x21, 0x57, 0x66, 0x13, 0xb1, 0x59, 0x86, 0x80, 0x40, 0x68, 0x65, 0x03, 0x99, 0xf4, 0x3f, 0x34, 0x09, 0xe2, 0xfa, 0xb3, 0xb8, 0x8d, 0x14, 0x56, 0x38, 0x0b, 0xdb, 0x87, 0x5f, 0xb1, 0xdc, 0xe7, 0x52, 0xd9, 0x9d, 0x38, 0xe3, 0xe2, 0x8f, 0x79, 0x1d, 0x79, 0x3e, 0x52, 0x1c, 0x17, 0xcb, 0xb3, 0x23, 0xcb, 0x9c, 0xb9, 0xe8, 0x3a, 0x52, 0xd1, 0x32, 0xe4, 0xfb, 0x1f, 0xa6, 0xa9, 0x89, 0x21, 0xde, 0x8b, 0x84, 0x8f, 0xbc, 0xb5, 0xfb, 0x86, 0xfe, 0xbd, 0xc0, 0xe6, 0x12, 0x26, 0xd5, 0xf9, 0x2b, 0x29, 0x21, 0x55, 0x94, 0xb4, 0x67, 0x03, 0x45, 0xb4, 0x79, 0xe0, 0xb4, 0x90, 0xa9, 0x44, 0xed, 0xf5, 0x81, 0xe2, 0xe5, 0xd9, 0xb4, 0xef, 0x0b, 0xba, 0x53, 0x87, 0x21, 0x27, 0x44, 0x4c, 0x4a, 0x82, 0xf1, 0x50, 0x64, 0x04, 0x3d, 0x35, 0x97, 0x01, 0xbc, 0x92, 0x2e, 0x6e, 0x23, 0x99, 0xa6, 0xa0, 0xfd, 0xf7, 0x05, 0x56, 0xa0, 0xfc, 0x6e, 0xfa, 0x60, 0xfc, 0xf1, 0x24, 0x02, 0xf5, 0xa7, 0x60, 0x74, 0x71, 0xff, 0x31, 0xbb, 0xae, 0x53, 0x56, 0x2c, 0xfd, 0xbf, 0x4b, 0xdf, 0x68, 0x32, 0x13, 0x61, 0x97, 0xc5, 0x35, 0xa9, 0xf5, 0x4c, 0x05, 0x4d, 0x0e, 0x2b, 0x24, 0xf6, 0x3b, 0x6c, 0x4a, 0x12, 0x82, 0x0e, 0x43, 0xc8, 0xb8, 0x9f, 0x38, 0x31, 0xe8, 0x0d, 0x30, 0xc5, 0xf9, 0xb9, 0xd6, 0x13, 0x8a, 0xcd, 0x7d, 0xb6, 0x21, 0xd0, 0x61, 0x84, 0x85 ],
+    const [ 0x3c, 0xfb, 0xc7, 0x7b, 0x88, 0x97, 0xb6, 0xa5, 0x61, 0x3f, 0x62, 0xf6, 0xb1, 0xc8, 0x9b, 0x0d, 0x68, 0xf2, 0x72, 0xc6, 0xc1, 0x9b, 0x9e, 0x0e, 0xc6, 0x33, 0x1e, 0xf6, 0x16, 0x70, 0x20, 0x06, 0xe6, 0x43, 0x22, 0xd3, 0x46, 0x0a, 0x57, 0xd3, 0xa5, 0x07, 0x4c, 0x71, 0x98, 0x11, 0xcb, 0x5d, 0xd7, 0x89, 0x00, 0x26, 0x88, 0x90, 0xda, 0x0a, 0xc1, 0x77, 0xb4, 0x0d, 0x48, 0x77, 0x35, 0x48, 0x9d, 0xa3, 0x74, 0x84, 0x3a, 0x1a, 0x60, 0x07, 0x19, 0x81, 0x60, 0xae, 0x77, 0xb1, 0x36, 0x3c, 0xd8, 0xac, 0x29, 0xf2, 0x4b, 0xd6, 0x63, 0x60, 0xef, 0x62, 0x98, 0x7a, 0xb6, 0x0a, 0xe8, 0xee, 0x69, 0x03, 0x07, 0xb5, 0xec, 0x30, 0x9b, 0xe8, 0xc4, 0x96, 0xe5, 0xd6, 0xd6, 0x10, 0xa4, 0x53, 0x71, 0x43, 0x36, 0x53, 0x8f, 0xd5, 0x01, 0xb7, 0x58, 0xda, 0x11, 0x66, 0xe8, 0x8f, 0x02, 0xa0, 0x52, 0x4b, 0x21, 0x8f, 0xe5, 0xb2, 0xce, 0x1f, 0xae, 0x2c, 0x25, 0x10, 0x3d, 0x96, 0xdd, 0x4a, 0xac, 0x37, 0x6f, 0x70, 0xde, 0xf5, 0x7b, 0xb7, 0x05, 0xc8, 0x68, 0xf9, 0x67, 0x70, 0x4c, 0x05, 0x61, 0x63, 0x0b, 0x3a, 0xac, 0x0a, 0xc2, 0x54, 0xdf, 0x2c, 0x66, 0x85, 0x35, 0xab, 0xa8, 0xc8, 0x91, 0x6e, 0x1c, 0x72, 0xbf, 0x9e, 0x9b, 0x09, 0xfd, 0x15, 0xe6, 0x5a, 0xba, 0x13, 0x8b, 0xc6, 0x9d, 0x33, 0x0d, 0xdd, 0xc9, 0x9e, 0x3f, 0x2e, 0x60, 0x7f, 0xf1, 0x5c, 0x45, 0xb7, 0xce, 0x75, 0x27, 0xd1, 0x85, 0x80, 0xbb, 0x38, 0x27, 0x55, 0x48, 0xa7, 0xd0, 0xb2, 0x69, 0xe2, 0x8a, 0x8a, 0x0f, 0xa4, 0x6e, 0xa0, 0xc5, 0xd8, 0x0d, 0x55, 0x38, 0x0b, 0x0e, 0xbe, 0xf6, 0x22, 0x18, 0xfa, 0x76, 0x48, 0xf2, 0xc3, 0x59, 0x2b, 0xe8, 0x42, 0xef, 0x68, 0x71, 0x28, 0xfd, 0x43, 0x10, 0xfa, 0xbd, 0x9c, 0x78, 0xac, 0x27, 0x1f, 0xf3, 0x72, 0x6f, 0xba, 0x04, 0xd3, 0xcf, 0x54, 0x4b, 0xff, 0x86, 0xbc, 0xaa, 0x62, 0x21, 0xdf, 0xa6, 0x79, 0xf9, 0x3f, 0x10, 0xe5, 0xfd, 0xa0, 0xe4, 0xbe, 0xb1, 0x04, 0x71, 0x29, 0x77, 0xda, 0xba, 0x2d, 0x0e, 0x73, 0x1d, 0xc2, 0x58, 0xb5, 0x32, 0x2b, 0x60, 0x13, 0xf6, 0x86, 0x9b, 0xbd, 0x29, 0xa2, 0x6e, 0x13, 0xf4, 0x10, 0xf1, 0x60, 0xcf, 0x7d, 0xf3, 0xc5, 0xa2, 0x3f, 0x3e, 0x73, 0x2a, 0x2d, 0x1b, 0x1d, 0x9f, 0xb4, 0x19, 0xae, 0x94, 0x27, 0x0b, 0x37, 0x1e, 0x57, 0x50, 0x2b, 0x38, 0x64, 0x57, 0xce, 0x66, 0xd2, 0x61, 0xeb, 0x99, 0xdf, 0x89, 0xc5, 0x53, 0x14, 0x02, 0x51, 0x0b, 0x1b, 0xa1, 0xa2, 0xd3, 0xd0, 0x9b, 0xa5, 0x38, 0x9a, 0x8f, 0x0e, 0x6a, 0xfc, 0xc7, 0x92, 0x9d, 0x67, 0xbb, 0x57, 0xae, 0x53, 0xd6, 0xa9, 0x0a, 0x8e, 0x7d, 0xee, 0xcc, 0xd3, 0x4e, 0xdc, 0x25, 0x9e, 0xa5, 0xe9, 0x01, 0x3f, 0x65, 0x03, 0xe7, 0x2d, 0xf5, 0x82, 0x21, 0x9e, 0x88, 0x5b, 0x1e, 0x54, 0xa2, 0x96, 0x14, 0xba, 0xd8, 0x02, 0xe9, 0x2f, 0xd7, 0x27, 0x54, 0xa2, 0xa7, 0x7c, 0x40, 0x5f, 0x31, 0xda, 0x71, 0x28, 0xff, 0x31, 0x69, 0x88, 0x44, 0x7a, 0x8d, 0x64, 0x1c, 0xec, 0x84, 0xd3, 0x14, 0x73, 0xe0, 0x30, 0xed, 0x5e, 0x00, 0x6d, 0x9d, 0x57, 0x34, 0xa9, 0x97, 0x99, 0x23, 0x05, 0x4c, 0x5d, 0x6a, 0xb4, 0xf2, 0x95, 0x86, 0x52, 0x84, 0xdd, 0xf4, 0x77, 0x0a, 0xaf, 0x96, 0x8b, 0x1a, 0xd6, 0x59, 0xdc, 0x9f, 0x25, 0x15, 0xed, 0xd9, 0x68, 0xb5, 0x12, 0xa5, 0x9b, 0x97, 0x39, 0xff, 0x5a, 0x36, 0x0b, 0xc5, 0x99, 0x06, 0x34, 0xbd, 0x95, 0x9f, 0xfe, 0xda, 0x0a, 0x1e, 0x25, 0xbb, 0xa7, 0xc8, 0xe7, 0x75, 0xbf, 0xf1, 0x5a, 0x92, 0x41, 0x1d, 0x02, 0x5a, 0xea, 0x64, 0xa3, 0x51, 0xb9, 0x1b, 0x54, 0x00, 0xa4, 0xb0, 0xd5, 0xf8, 0x89, 0xd6, 0x22, 0x15, 0x67, 0xe2, 0x48, 0x00, 0xce, 0x75, 0x78, 0xf7, 0x94, 0x5c, 0x5a, 0xd1, 0xca, 0xb4, 0xa3, 0x3c, 0xee, 0x52, 0xea, 0x4a, 0x62, 0x62, 0xb8, 0x2c, 0x1d, 0x4d, 0xde, 0x3d, 0xa1, 0xe1, 0x0b, 0x42, 0x2d, 0xac, 0x9d, 0xef, 0x33, 0xa8, 0xb8, 0xae, 0x0c, 0x1e, 0x95, 0x9d, 0xeb, 0xc4, 0x1d, 0xd5, 0x10, 0x28, 0xb7, 0xf2, 0x3e, 0x52, 0x5e, 0xd0, 0x6e, 0xa5, 0xf6, 0x92, 0xc5, 0x07, 0xe0, 0xe9, 0xc4, 0x42, 0xcc, 0x93, 0xbf, 0xa9, 0xce, 0x21, 0x90, 0xfe, 0xb5, 0xfe, 0x8c, 0x93, 0x98, 0xad, 0xb6, 0xb0, 0xb1, 0x52, 0x33, 0x35, 0x6e, 0x74, 0xfe, 0x80, 0xc6, 0x01, 0xdd, 0x91, 0xca, 0x92, 0x94, 0x6c, 0x7c, 0xf1, 0x58, 0xbf, 0xe3, 0xd9, 0x86, 0xc5, 0x5f, 0xfc, 0x95, 0x6a, 0x3b, 0x4a, 0x4a, 0xb0, 0x81, 0x71, 0x2a, 0x51, 0x12, 0xa0, 0x35, 0xa6, 0xf5, 0x91, 0xd1, 0xc7, 0xf0, 0xc6, 0x05, 0xf4, 0x55, 0x13, 0xe7, 0x34, 0x1f, 0x5c, 0x58, 0x3b, 0x3d, 0xa0, 0xee, 0x91, 0x2e, 0x36, 0x32, 0xf1, 0xce, 0x57, 0x0c, 0xf0, 0x70, 0xdd, 0x7b, 0xdf, 0x2c, 0x4a, 0x89, 0xf1, 0x7b, 0x0c, 0x7f, 0xa1, 0x01, 0x00, 0x55, 0x4e, 0xa9, 0x34, 0x6c, 0x28, 0xf7, 0xf1, 0x80, 0x50, 0x9a, 0xf9, 0xd8, 0x3b, 0x41, 0x0d, 0xbf, 0x58, 0xb0, 0xb2, 0x38, 0xf2, 0x13, 0x35, 0xee, 0x57, 0x92, 0xed, 0x6a, 0x3a, 0x25, 0xc0, 0x88, 0x56, 0xaa, 0xe8, 0x2c, 0x54, 0x35, 0xf7, 0x31, 0xef, 0xa7, 0x19, 0xa2, 0x56, 0x82, 0x9a, 0x2d, 0xd1, 0xfb, 0xa8, 0xd4, 0xa8, 0x51, 0x59, 0xe6, 0x41, 0x5e, 0xf0, 0x2e, 0x88, 0x6c, 0x5c, 0x6a, 0x93, 0x49, 0x01, 0xff, 0x87, 0x9e, 0xbb, 0xea, 0xb5, 0x7c, 0x20, 0xfa, 0x09, 0x38, 0x06, 0x3c, 0xa5, 0x79, 0x46, 0xb7, 0xc9, 0x8f, 0xbf, 0x5a, 0xf6, 0x06, 0x9d, 0x33, 0x53, 0x7b, 0xdb, 0xe2, 0x4f, 0xaf, 0x06, 0x4c, 0x88, 0xda, 0x44, 0x94, 0xec, 0x42, 0x96, 0x47, 0x1d, 0x0b, 0x5a, 0xd6, 0x1a, 0x51, 0x14, 0x4a, 0x1d, 0x74, 0x6d, 0x33, 0xbf, 0xb3, 0x7c, 0xe1, 0x62, 0xfd, 0x45, 0xd7, 0xd0, 0x03, 0x7f, 0x7d, 0x20, 0x92, 0x9b, 0x15, 0xda, 0x20, 0x01, 0xf0, 0x5b, 0xa5, 0x9d, 0xe2, 0x7a, 0xac, 0x9a, 0xf3, 0x6b, 0xa9, 0x6d, 0x57, 0xe4, 0x8d, 0x16, 0xa1, 0x7f, 0x98, 0xa2, 0x33, 0x60, 0x6e, 0xf5, 0xf9, 0x17, 0x6e, 0xc6, 0x57, 0xc7, 0x3f, 0xeb, 0x5f, 0x88, 0xab, 0xd7, 0x48, 0x0b, 0xb1, 0x61, 0x1b, 0x7d, 0xd5, 0xc7, 0xb0, 0xad, 0xbb, 0xf2, 0xd9, 0x70, 0xf4, 0xfb, 0xdd, 0x45, 0x18, 0xef, 0x28, 0x35, 0x15, 0xcf, 0x40, 0xfd, 0xc6, 0xdb, 0xfb, 0x6f, 0xc8, 0x10, 0xf0, 0x16, 0x89, 0xf0, 0x2b, 0x19, 0xa1, 0x81, 0x25, 0x61, 0x66, 0x98, 0xf3, 0xfe, 0xba, 0x57, 0xbd, 0xc7, 0x28, 0xf5, 0x72, 0x41, 0x30, 0xbd, 0xba, 0xc3, 0xde, 0x5a, 0x2c, 0xd7, 0xa2, 0x51, 0xc2, 0xe2, 0x5b, 0xcf, 0x89, 0x08, 0xb5, 0xa5, 0x9d, 0x4a, 0xb5, 0x91, 0x55, 0xf1, 0x92, 0xbf, 0xbb, 0x30, 0xc7, 0x8f, 0x3f, 0x05, 0x66, 0x99, 0xac, 0x60, 0xaf, 0xef, 0x5a, 0x87, 0xe1, 0xa1, 0xa6, 0xb9, 0x50, 0x87, 0x9f, 0x11, 0xb8, 0x3a, 0x02, 0xae, 0xd1, 0x64, 0x69, 0x11, 0x23, 0x3a, 0xbf, 0xc6, 0x1c, 0x46, 0xf7, 0x47, 0x60, 0x6a, 0xfd, 0x1d, 0x60, 0x22, 0xed, 0x48, 0x2e, 0x09, 0x84, 0xe1, 0x90, 0x9f, 0xd4, 0xfe, 0x53, 0x49, 0x3b, 0xd6, 0xe1, 0x99, 0x95, 0x26, 0x16, 0xd0, 0xb1, 0xd3, 0x50, 0xa1, 0x02, 0xd0, 0xc5, 0x38, 0x97, 0x42, 0x1a, 0x7b, 0x4d, 0xe2, 0x31, 0x90, 0x44, 0xa3, 0x42, 0x9f, 0x8f, 0x96, 0x2d, 0xd9, 0x30, 0x0a, 0x0e, 0xb9, 0x43, 0xf7, 0x12, 0x89, 0x79, 0x9d, 0x8a, 0x29, 0xc8, 0x68, 0x3e, 0x0c, 0x61, 0x17, 0x04, 0x83, 0xe3, 0x1d, 0x91, 0x3e, 0xce, 0x47, 0x8e, 0x0f, 0x3a, 0xa0, 0xef, 0xf2, 0xc9, 0x92, 0x80, 0x4b, 0xda, 0x4d, 0xc0, 0x6e, 0xff, 0x6d, 0xf3, 0x64, 0xb2, 0xd6, 0x73, 0xed, 0x43, 0xe3, 0x47, 0xc1, 0x15, 0xc1, 0xf6, 0x1b, 0x0a, 0x15, 0x9d, 0x78, 0x3c, 0xe5, 0x40, 0x9c, 0xee, 0xb5, 0x5e, 0xd7, 0xc2, 0xf0, 0xc8, 0x86, 0x2c, 0x8a, 0xb3, 0xdc, 0x26, 0xe4, 0x0b, 0xe3, 0x25, 0xf0, 0x0a, 0xbd, 0x4c, 0x95, 0x0a, 0x30, 0xe0, 0x55, 0x97, 0x62, 0xfd, 0x2d, 0xc9, 0xe0, 0x87, 0xbc, 0xd0, 0xe5, 0x62, 0xa8, 0xd1, 0xda, 0xe6, 0x3e, 0xf1, 0x19, 0x8d, 0x58, 0xaf, 0xf6, 0xef, 0x84, 0x76, 0x00, 0xf1, 0x62, 0x72, 0x84, 0x39, 0x4e, 0xa4, 0x53, 0xe5, 0x3f, 0x31, 0xc5, 0x7c, 0xef, 0x00, 0xfe, 0x24, 0x3d, 0x83, 0x70, 0x16, 0xcf, 0xd5, 0xa1, 0x50, 0xfb, 0x06, 0x2f, 0x89, 0xe8, 0xb3, 0x11, 0x6a, 0xf0, 0xd9, 0x1f, 0xfb, 0x49, 0xea, 0xd5, 0x5c, 0xe5, 0x21, 0x54, 0xb5, 0x96, 0x13, 0xa9, 0x6f, 0x76, 0x88, 0x52, 0xa5, 0x86, 0x88, 0xfe, 0xd5, 0x95, 0xb9, 0x95, 0xdc, 0x64, 0xe8, 0x78, 0x21, 0x07, 0xe5, 0x0a, 0x10, 0x8e, 0x94, 0x6f, 0xca, 0xe5, 0x41, 0x94, 0x1a, 0xf9, 0x34, 0x6f, 0xac, 0x1c, 0x85, 0x88, 0x79, 0xab, 0x32, 0xb8, 0x86, 0xee, 0x6f, 0x30, 0xce, 0x3f, 0x3d, 0xbe, 0x7c, 0x6f, 0x3e, 0x4c, 0x5e, 0x65, 0xc8, 0xaa, 0x97, 0x08, 0x38, 0x8d, 0x94, 0x60, 0x89, 0xd7, 0x41, 0xf7, 0x25, 0x18, 0x7c, 0x86, 0xfa, 0x55, 0xca, 0xcd, 0xd1, 0x09, 0x48, 0xc3, 0xdb, 0x6a, 0xe5, 0xef, 0x8d, 0xed, 0xcf, 0x16, 0xae, 0x0c, 0x2b, 0x16, 0xaf, 0x47, 0x09, 0x12, 0x3a, 0x69, 0x97, 0xcf, 0x0d, 0x0c, 0x94, 0x5e, 0x09, 0x5f, 0x08, 0xfc, 0x86, 0x27, 0x33, 0x36, 0xea, 0x04, 0xc3, 0x51, 0x7a, 0xf6, 0x4a, 0xe8, 0x70, 0x1f, 0xee, 0xd7, 0x4d, 0xcb, 0x63, 0x58, 0x70, 0xad, 0x16, 0x6c, 0xe8, 0x6b, 0xab, 0x7d, 0x87, 0x5e, 0xaa, 0x41, 0x37, 0x93, 0x75, 0xe1, 0x91, 0x15, 0x7e, 0x5b, 0xac, 0x6e, 0xb6, 0x25, 0x33, 0x6b, 0x49, 0x13, 0xbb, 0x20, 0x88, 0x7a, 0x53, 0x2c, 0x26, 0x96, 0x5c, 0x3e, 0xa8, 0x29, 0x9b, 0xd8, 0x17, 0x65, 0x8c, 0x53, 0xf8, 0x0c, 0xf9, 0x24, 0x7e, 0xd6, 0xcc, 0x5d, 0xfd, 0x13, 0x22, 0x77, 0xa2, 0x91, 0xa0, 0x4e, 0x62, 0xc0, 0x0a, 0x6d, 0x30, 0x14, 0x11, 0x8c, 0x73, 0xab, 0x6d, 0x57, 0xb7, 0x30, 0x2c, 0x71, 0xa2, 0xff, 0x4a, 0xb9, 0x2a, 0x89, 0x81, 0xcc, 0x06, 0xfa, 0x62, 0xcb, 0x62, 0x1a, 0xa5, 0x5e, 0xd7, 0x71, 0xbe, 0xf8, 0x9a, 0xaf, 0xb1, 0x5d, 0xf4, 0x4b, 0x26, 0x62, 0xf2, 0x69, 0xc0, 0xf4, 0x5d, 0x01, 0xab, 0x5c, 0xec, 0x3e, 0x74, 0xc1, 0xb9, 0x24, 0x1e, 0xef, 0xf2, 0x76, 0x72, 0x57, 0xd1, 0xd7, 0x96, 0x56, 0xce, 0x2f, 0xe1, 0xba, 0x13, 0x50, 0xee, 0x82, 0x30, 0xda, 0xef, 0xe5, 0x10, 0x5b, 0x44, 0x96, 0x2b, 0xbb, 0x4d, 0x47, 0xfe, 0xd8, 0x7c, 0x6c, 0xb8, 0x6d, 0xae, 0x41, 0x37, 0x38, 0xbb, 0x0e, 0x32, 0x5c, 0x4b, 0xa9, 0xb8, 0x04, 0xec, 0x3d, 0xd9, 0x49, 0x62, 0x4b, 0xa3, 0x56, 0x3e, 0xee, 0x50, 0xc9, 0xb3, 0x63, 0xbd, 0x5d, 0xa4, 0xc8, 0x1e, 0xc6, 0x01, 0x24, 0xf1, 0xdd, 0x54, 0xa8, 0x30, 0xfd, 0x97, 0x35, 0xcb, 0xad, 0x49, 0x1e, 0x55, 0x7f, 0xc1, 0x2e, 0xfd, 0x38, 0xc1, 0xed, 0xc1, 0x30, 0x4e, 0x1f, 0xde, 0xfc, 0xbf, 0x8e, 0x8b, 0x4b, 0x15, 0x09, 0xe6, 0x0e, 0x8a, 0xad, 0x2f, 0xdc, 0x6d, 0x63, 0x34, 0x94, 0x2c, 0xaa, 0x0c, 0x44, 0xb3, 0x97, 0x08, 0x49, 0xf4, 0x19, 0xe7, 0xb8, 0xc7, 0x82, 0x49, 0xfd, 0xf5, 0x43, 0x67, 0xc2, 0x8f, 0xf7, 0x00, 0x13, 0x85, 0xa4, 0x97, 0xbf, 0x73, 0x3d, 0xdb, 0x01, 0xbe, 0x6b, 0x67, 0x5f, 0xe0, 0x8c, 0xab, 0xd3, 0x00, 0xfd, 0x2a, 0x29, 0xc6, 0x94, 0xe7, 0xa8, 0x6d, 0x71, 0x19, 0xf4, 0x1a, 0xf7, 0x26, 0x33, 0x6c, 0x15, 0xcf, 0x6f, 0x54, 0xca, 0xa8, 0x3b, 0x27, 0xe8, 0xcc, 0x9a, 0xf1, 0x18, 0xce, 0x1c, 0x0d, 0x1e, 0xf3, 0x4a, 0xf2, 0x5e, 0x9e, 0x44, 0x50, 0x9f, 0x0b, 0xa9, 0x5c ],
+    const [ 0x3f, 0xbc, 0xbd, 0x3f, 0x57, 0xa9, 0x91, 0x2b, 0x97, 0x17, 0xf9, 0x1e, 0x81, 0x52, 0x9f, 0x67, 0x36, 0xc6, 0xd0, 0x6f, 0x8b, 0xc1, 0x30, 0x9c, 0x5e, 0x7a, 0xad, 0x74, 0x2b, 0x51, 0xb1, 0x06, 0xda, 0x58, 0x9c, 0x85, 0xdb, 0x13, 0x71, 0x37, 0x75, 0x7c, 0xcf, 0x8d, 0x5b, 0x4a, 0x24, 0x94, 0x81, 0x73, 0x1d, 0x8c, 0x2d, 0xf0, 0x61, 0xd5, 0x51, 0xc0, 0x7e, 0x13, 0x18, 0x2f, 0x23, 0x8a, 0xbf, 0x58, 0x91, 0xca, 0xa6, 0xe9, 0x4c, 0x91, 0xa7, 0x26, 0x16, 0xed, 0xa6, 0x31, 0x1d, 0xa1, 0x69, 0x88, 0x74, 0xca, 0xaa, 0xcf, 0xc0, 0xc2, 0x6b, 0xd0, 0x34, 0x45, 0x8a, 0xc0, 0xbf, 0xd2, 0x95, 0xc3, 0x83, 0x54, 0xdf, 0xb3, 0x8a, 0x02, 0xd4, 0x1d, 0xb4, 0x84, 0x89, 0x8d, 0xf4, 0x57, 0x98, 0x0c, 0xbc, 0x72, 0x2a, 0xe6, 0xb6, 0x2a, 0x55, 0xb1, 0xb5, 0x53, 0xa9, 0x8a, 0xeb, 0xa8, 0x05, 0xa2, 0x5c, 0x6d, 0xaf, 0xfa, 0x92, 0x52, 0xa4, 0x6a, 0x93, 0x9b, 0x2d, 0xe8, 0x10, 0x7e, 0xb3, 0x07, 0xdf, 0xcc, 0xd4, 0xbe, 0xac, 0xd4, 0xb7, 0x6b, 0xeb, 0x85, 0x9c, 0x17, 0x10, 0xd2, 0xb7, 0xfc, 0x03, 0x5b, 0x3e, 0x44, 0xce, 0x49, 0xc1, 0x14, 0x99, 0x79, 0xba, 0xc9, 0xd9, 0xde, 0x65, 0x82, 0xc4, 0x20, 0xd1, 0xde, 0x08, 0x89, 0x37, 0x07, 0xbc, 0x22, 0x8c, 0xef, 0x97, 0x19, 0x52, 0xd9, 0x60, 0x66, 0xb3, 0x1c, 0xa5, 0xae, 0xd0, 0x23, 0xb0, 0x68, 0x57, 0xb9, 0xb7, 0x3e, 0x53, 0x83, 0x53, 0xb6, 0x49, 0xce, 0x33, 0x11, 0x80, 0x8c, 0x12, 0x74, 0xa0, 0x98, 0xe6, 0x45, 0x7f, 0x42, 0x5b, 0xd8, 0x37, 0x07, 0x7f, 0x4b, 0x7c, 0xa0, 0xbf, 0xae, 0x2c, 0x3f, 0x12, 0x67, 0x28, 0x15, 0x74, 0xd5, 0x63, 0x17, 0x96, 0x34, 0x38, 0x02, 0xd4, 0xc1, 0x01, 0x9c, 0x67, 0x1e, 0xe5, 0x3d, 0xdc, 0xf7, 0xf1, 0x8f, 0xc4, 0xe6, 0x6a, 0x92, 0xae, 0x94, 0x62, 0xe3, 0x52, 0x22, 0x8a, 0x3d, 0x0f, 0xc7, 0x47, 0x40, 0x98, 0xba, 0x08, 0x71, 0xea, 0x52, 0xd6, 0x83, 0x81, 0x6b, 0x2d, 0xd5, 0xcb, 0x0d, 0x0a, 0x3b, 0xdd, 0x48, 0x45, 0x01, 0x65, 0x62, 0x21, 0x2d, 0xdf, 0x35, 0x22, 0x05, 0x0c, 0xd2, 0x1e, 0xd1, 0xa0, 0x6a, 0x97, 0xe2, 0x3b, 0x6f, 0x48, 0xd3, 0x9b, 0xf6, 0xfe, 0x0f, 0x10, 0x60, 0xa9, 0x93, 0x30, 0x39, 0xb3, 0xf6, 0xcb, 0x60, 0x90, 0xa6, 0x22, 0x68, 0x97, 0x74, 0x53, 0x3f, 0x10, 0x53, 0x18, 0x0d, 0x8e, 0x5c, 0xb1, 0x5f, 0x7f, 0x16, 0x1f, 0x85, 0x01, 0xf5, 0x93, 0x38, 0xf7, 0x20, 0x26, 0x81, 0x5c, 0x77, 0xca, 0xd6, 0xd8, 0xd5, 0x81, 0x85, 0x91, 0x92, 0xcd, 0x56, 0x44, 0x4d, 0x67, 0x6b, 0x94, 0xe8, 0x33, 0x6c, 0xa2, 0xd3, 0x74, 0xe1, 0xdd, 0x8e, 0x3d, 0xdf, 0x1c, 0x69, 0x28, 0xe7, 0xea, 0x8f, 0x49, 0x0b, 0x20, 0x42, 0x65, 0x52, 0xba, 0x68, 0x60, 0x5e, 0xe3, 0x47, 0xf5, 0x4c, 0x52, 0x8d, 0xaa, 0xdc, 0xd9, 0x93, 0x02, 0xd2, 0x3b, 0xe2, 0xf4, 0x9c, 0x3f, 0xf7, 0x9c, 0x34, 0x02, 0x43, 0x31, 0x48, 0x91, 0x76, 0x37, 0x99, 0xb7, 0xfd, 0xf5, 0xa1, 0x14, 0xc9, 0x2a, 0x78, 0x6f, 0x53, 0xfc, 0xf8, 0x4e, 0xdd, 0x31, 0x20, 0xc3, 0xfa, 0xa1, 0xb6, 0x88, 0x50, 0xeb, 0x30, 0x4e, 0x9d, 0x68, 0xd5, 0x53, 0xf8, 0x5d, 0x20, 0x33, 0x5a, 0x75, 0x65, 0x00, 0x5c, 0x6e, 0xb6, 0x94, 0x42, 0x12, 0x08, 0x26, 0x39, 0x69, 0x92, 0x1c, 0xdd, 0x2d, 0x76, 0x20, 0xfe, 0x7e, 0xa3, 0x76, 0xa4, 0xd7, 0xfa, 0x8d, 0x50, 0x41, 0xb0, 0xd4, 0x85, 0xc6, 0xf3, 0xce, 0x87, 0x29, 0xd0, 0x69, 0x63, 0xd4, 0x54, 0x8c, 0x2f, 0x12, 0xf1, 0xef, 0x93, 0x7e, 0x24, 0x2f, 0x89, 0xbc, 0x55, 0x22, 0x60, 0x66, 0xff, 0x68, 0x07, 0x49, 0x10, 0x42, 0x88, 0xd2, 0x93, 0xa7, 0xd3, 0xc3, 0x8c, 0x95, 0xbd, 0x2a, 0x23, 0xa6, 0x48, 0x94, 0x05, 0xe3, 0x25, 0x7e, 0x08, 0xdc, 0x77, 0x0c, 0x0e, 0xf9, 0xda, 0xfe, 0x2b, 0x0b, 0xa4, 0xdf, 0x0a, 0x26, 0x6b, 0x7f, 0x8c, 0xb3, 0xc7, 0xa4, 0xb3, 0xc1, 0x58, 0xfd, 0xbf, 0x9c, 0x0b, 0x57, 0x96, 0xa1, 0x9a, 0x13, 0x69, 0x50, 0x52, 0xd8, 0x95, 0xa3, 0x19, 0x85, 0xc7, 0x9e, 0xaf, 0x6a, 0x64, 0x28, 0x34, 0xb7, 0x28, 0x19, 0xeb, 0x34, 0x0d, 0x94, 0x3d, 0x33, 0x6e, 0x97, 0x01, 0xc4, 0x6c, 0xd0, 0xfa, 0x27, 0x91, 0xb3, 0xa1, 0x87, 0xb3, 0xc9, 0x25, 0xe5, 0x1b, 0x4b, 0xb1, 0x52, 0xe7, 0xef, 0xed, 0x61, 0xad, 0x02, 0xc7, 0xdc, 0x61, 0xb7, 0x73, 0xb6, 0x79, 0xbf, 0xb0, 0x41, 0x4e, 0x19, 0x4e, 0xa1, 0xc6, 0x2c, 0xed, 0x81, 0x30, 0x13, 0x07, 0x04, 0x6f, 0x38, 0x31, 0xfe, 0x5b, 0x24, 0x9d, 0x65, 0x64, 0x95, 0xe4, 0x02, 0x79, 0xd1, 0x02, 0x6c, 0x28, 0x3b, 0xa2, 0x37, 0x06, 0x24, 0x9d, 0x69, 0x51, 0xe3, 0xbd, 0x2d, 0xd4, 0x28, 0xc6, 0xcc, 0x0b, 0x8d, 0xb7, 0xd8, 0x88, 0x6e, 0x4d, 0xab, 0x95, 0xfb, 0xc9, 0x10, 0x1b, 0x8b, 0xf3, 0x3f, 0xc2, 0x34, 0x5f, 0x0f, 0x5a, 0x98, 0xef, 0x67, 0x7a, 0x01, 0x99, 0xf5, 0x66, 0xb1, 0x6a, 0x23, 0x36, 0x73, 0xcb, 0x47, 0x35, 0x76, 0x04, 0x1a, 0x88, 0x5b, 0xfe, 0x6c, 0x10, 0x8d, 0x4d, 0x16, 0x91, 0xd1, 0x6d, 0x2f, 0x13, 0x1e, 0x4c, 0x83, 0x88, 0xae, 0x09, 0x40, 0xb0, 0x55, 0xfc, 0xf3, 0x3a, 0x12, 0xf6, 0xb3, 0x2c, 0xe4, 0xca, 0x9c, 0x84, 0xde, 0x0c, 0x80, 0x1f, 0x7e, 0x18, 0xd8, 0xdb, 0x3b, 0x56, 0x01, 0xf9, 0x5d, 0xbd, 0xa5, 0xc5, 0x11, 0x96, 0x77, 0x78, 0xbd, 0x83, 0x23, 0x5d, 0x91, 0xbf, 0x84, 0x33, 0x5f, 0xa7, 0x18, 0xd3, 0xac, 0x7a, 0xb2, 0x12, 0x07, 0x5d, 0x6f, 0xe9, 0x99, 0xa2, 0xeb, 0xd3, 0xfe, 0x49, 0xb5, 0x77, 0x53, 0xc7, 0x00, 0x87, 0x90, 0x07, 0x9b, 0xe8, 0x18, 0xaf, 0x23, 0x13, 0x8f, 0xa4, 0x77, 0xbb, 0xec, 0xd0, 0x6c, 0xb0, 0xcf, 0x23, 0xc2, 0x03, 0x14, 0xd7, 0x57, 0x6b, 0xa8, 0xf9, 0x9b, 0xe7, 0x9b, 0x25, 0x44, 0xa5, 0x77, 0x91, 0x43, 0x23, 0xd1, 0x4c, 0xf6, 0x94, 0x1d, 0xc8, 0x9f, 0x85, 0xc7, 0x97, 0x15, 0xc0, 0x7f, 0x72, 0xb9, 0x70, 0xd4, 0x7f, 0xac, 0x87, 0x04, 0xd4, 0x3f, 0x5d, 0x12, 0x37, 0xab, 0x99, 0x1a, 0x27, 0x03, 0x55, 0xe2, 0x21, 0x66, 0x7d, 0xb1, 0x1c, 0x79, 0x78, 0x64, 0x56, 0x14, 0x0b, 0xbe, 0x52, 0x3c, 0x7a, 0x00, 0x21, 0x52, 0xf0, 0xb9, 0xe2, 0x89, 0x20, 0xe0, 0x85, 0x9e, 0x2d, 0x20, 0xd4, 0xc3, 0xc7, 0x73, 0xb3, 0xdc, 0x98, 0xf2, 0xa6, 0xed, 0xde, 0xec, 0x95, 0xd3, 0x59, 0x35, 0xcc, 0x33, 0x67, 0xc0, 0x46, 0xb1, 0x6e, 0x70, 0x2b, 0x62, 0x7a, 0x2c, 0x97, 0x83, 0x27, 0x32, 0x9d, 0x6b, 0xc2, 0xad, 0x8c, 0xbe, 0xab, 0x89, 0x70, 0xe4, 0xfd, 0x86, 0xdc, 0xb9, 0x71, 0x8b, 0xe7, 0x86, 0x80, 0x3e, 0x75, 0x31, 0xc8, 0xd1, 0xb8, 0xb0, 0xb1, 0x1e, 0xf6, 0xc3, 0x50, 0xf7, 0x8c, 0xe3, 0x8c, 0xb7, 0x33, 0x75, 0x7f, 0x1d, 0x82, 0x44, 0x1f, 0x5b, 0xb4, 0x2e, 0x1d, 0x69, 0xac, 0x1e, 0x0d, 0x9f, 0x36, 0x3a, 0xc8, 0x83, 0x90, 0x5d, 0x0e, 0xe0, 0x29, 0xc7, 0x70, 0x18, 0xa8, 0x13, 0x6d, 0xba, 0x30, 0x6a, 0xdc, 0x57, 0xe2, 0xf7, 0x8a, 0x92, 0xa4, 0x9a, 0x23, 0x77, 0x21, 0xe1, 0x56, 0x0e, 0x11, 0x34, 0x34, 0x2f, 0xbb, 0x4f, 0xd9, 0x97, 0xb8, 0xf6, 0x4f, 0x3c, 0xf9, 0xe3, 0xaf, 0xde, 0x0c, 0x04, 0x89, 0xdf, 0x9a, 0xe3, 0x86, 0x54, 0x35, 0x66, 0x4c, 0x5c, 0x50, 0xb8, 0xa2, 0xb1, 0x8f, 0x87, 0xd5, 0x7c, 0x42, 0x70, 0x5a, 0x6e, 0x2c, 0xb7, 0xb4, 0x0c, 0x88, 0x3c, 0x99, 0x4a, 0x4e, 0xaa, 0x50, 0x5c, 0xb2, 0xf2, 0x5d, 0xc9, 0xed, 0xf8, 0x60, 0xc1, 0x41, 0x8b, 0x3b, 0xb0, 0x37, 0x9b, 0x73, 0x13, 0x2c, 0xa6, 0xd9, 0x8b, 0x0b, 0x74, 0x69, 0x2f, 0x5c, 0x04, 0x72, 0x27, 0x7e, 0xc6, 0xf7, 0x77, 0x30, 0x0b, 0x55, 0x18, 0x57, 0xb9, 0x27, 0x4d, 0xfb, 0x43, 0x67, 0x34, 0x92, 0xd8, 0xd6, 0x9b, 0x81, 0xdb, 0x9d, 0x16, 0xe0, 0x94, 0x34, 0x4e, 0x7d, 0x25, 0x83, 0x9c, 0x24, 0xbf, 0x47, 0xd7, 0x1e, 0x15, 0xb8, 0x6a, 0xf8, 0x11, 0x69, 0xa9, 0x86, 0xc6, 0x6f, 0x65, 0x26, 0xa7, 0xc5, 0xbd, 0x49, 0xf6, 0xef, 0x38, 0x30, 0x7f, 0xde, 0x11, 0xf4, 0x85, 0x14, 0xd2, 0xc9, 0xfd, 0x08, 0x24, 0x83, 0xfa, 0xcc, 0xe6, 0x5a, 0x69, 0xed, 0x7c, 0xea, 0xfe, 0x9b, 0x6a, 0x7e, 0x6e, 0x09, 0x21, 0x8d, 0xdf, 0x17, 0x18, 0x85, 0x9c, 0x2f, 0x1f, 0xc8, 0x0e, 0x6c, 0xf1, 0xf4, 0xe8, 0x02, 0x08, 0x68, 0xa1, 0xda, 0xb5, 0x04, 0x27, 0x7c, 0x6f, 0x2f, 0xd2, 0x32, 0x6c, 0x1f, 0x96, 0x6a, 0x6e, 0x55, 0x7e, 0x5d, 0xe0, 0x66, 0x55, 0xee, 0x21, 0x01, 0xa6, 0xd5, 0x20, 0x2e, 0xe8, 0xfc, 0x29, 0xd4, 0xf2, 0x29, 0xfe, 0x7e, 0xb5, 0xde, 0x2a, 0x5e, 0x29, 0x7e, 0x92, 0x93, 0x88, 0xb0, 0x4d, 0xa7, 0xbb, 0x08, 0xb5, 0x5c, 0x11, 0xe5, 0xbe, 0xa8, 0x37, 0x95, 0x87, 0xfe, 0x65, 0xc0, 0x2f, 0xcf, 0xd5, 0x03, 0xea, 0x51, 0x79, 0xdb, 0x54, 0x7f, 0xed, 0xc5, 0x05, 0x61, 0xab, 0xa3, 0x65, 0x8d, 0x7e, 0x62, 0xc1, 0xee, 0x39, 0xda, 0x9f, 0xc4, 0xa8, 0xf5, 0x4f, 0xec, 0xc7, 0x14, 0xc3, 0x62, 0x32, 0xae, 0xa1, 0x04, 0xdd, 0x3a, 0x95, 0x98, 0x05, 0x50, 0xec, 0x11, 0x66, 0x0b, 0x5f, 0x0e, 0xaf, 0xb1, 0x2c, 0xa4, 0x33, 0x96, 0x6c, 0x5d, 0xe1, 0x3d, 0xa0, 0x80, 0x76, 0xc1, 0x8d, 0x93, 0xf1, 0x73, 0x4a, 0x1f, 0x47, 0xc5, 0x97, 0xb3, 0x59, 0x67, 0x70, 0x2b, 0x23, 0xaf, 0xe2, 0x32, 0x36, 0x3e, 0x1e, 0x06, 0x68, 0xe1, 0xcc, 0x7c, 0xca, 0xb5, 0xa1, 0x43, 0xda, 0x8f, 0x34, 0x6c, 0xfa, 0x9a, 0x0d, 0x2a, 0x21, 0x42, 0xff, 0xd7, 0xd1, 0x51, 0xb9, 0x38, 0x49, 0x58, 0x97, 0x02, 0xfb, 0x51, 0xbe, 0x9d, 0x40, 0x82, 0x67, 0x27, 0x4b, 0xa5, 0x7b, 0xbc, 0x5b, 0x45, 0x61, 0xf5, 0x35, 0x6b, 0x13, 0xae, 0xd2, 0x7a, 0x78, 0x0d, 0x55, 0x58, 0xee, 0xc0, 0x40, 0xce, 0x25, 0x85, 0xe6, 0x32, 0x34, 0xf0, 0x24, 0x43, 0xe6, 0x69, 0x4c, 0x54, 0x55, 0x74, 0x62, 0xad, 0xbb, 0x35, 0x8b, 0x2e, 0x84, 0x33, 0xc2, 0x35, 0xa8, 0x5c, 0xcd, 0xc2, 0x37, 0x49, 0x6f, 0xd9, 0x36, 0xc4, 0xe0, 0x28, 0xa9, 0x87, 0x7a, 0xea, 0xf1, 0x47, 0xb5, 0x0b, 0x58, 0xf1, 0x55, 0x8d, 0xeb, 0x34, 0xe2, 0x2a, 0x88, 0x3f, 0x59, 0x3b, 0x37, 0xcc, 0x21, 0xd8, 0xbd, 0x5d, 0x40, 0x41, 0x6f, 0xc5, 0xcf, 0x7c, 0x45, 0xeb, 0xab, 0x40, 0x2f, 0xcb, 0x6e, 0x12, 0xac, 0xbd, 0x9e, 0xae, 0x98, 0xfa, 0x24, 0xa8, 0x45, 0x5c, 0xff, 0x53, 0xce, 0x65, 0x39, 0xe2, 0xa8, 0x83, 0x1a, 0xcd, 0x7a, 0x92, 0x9d, 0x77, 0x2f, 0xa3, 0x20, 0x0d, 0x49, 0xfc, 0x5f, 0xb1, 0x78, 0x60, 0xa3, 0xd8, 0x6b, 0x90, 0x37, 0xf0, 0xe6, 0x11, 0x1c, 0x47, 0x15, 0x30, 0xfd, 0x28, 0x20, 0x44, 0x65, 0x47, 0xff, 0x33, 0x30, 0x5e, 0x90, 0x37, 0x40, 0x19, 0xe6, 0xe2, 0x71, 0x30, 0xe4, 0x60, 0xce, 0xd2, 0x0b, 0xfd, 0x05, 0x4a, 0x91, 0xe6, 0x18, 0xdd, 0xb3, 0x34, 0x56, 0xf1, 0x4c, 0x26, 0x8a, 0x75, 0xa5, 0xae, 0x72, 0x7c, 0x8f, 0x30, 0x72, 0x2b, 0xaf, 0x86, 0x8a, 0xd6, 0x1a, 0x47, 0x86, 0x66, 0x22, 0x49, 0x74, 0xfe, 0x6f, 0x64, 0x5b, 0xde, 0x51, 0x79, 0x2a, 0x87, 0x54, 0xb3, 0xef, 0x1f, 0x15, 0x0d, 0x49, 0x18, 0x55, 0x15, 0x20, 0x0d, 0x4c, 0xef, 0x93, 0xec, 0x3f, 0x9c, 0x32, 0x5a, 0x55, 0x7d, 0x6e, 0x53, 0xa7, 0x12, 0x4d, 0x11, 0x96, 0x08, 0x63, 0x30, 0x61, 0x73, 0xfd, 0x0f, 0xf7, 0x58, 0x9f, 0x79, 0x09, 0x6e, 0xb1, 0x85, 0x64, 0x25, 0x75, 0xba, 0x7e, 0xe8, 0x3c, 0x77, 0x4e, 0x9f, 0xda, 0x92, 0x61, 0x79, 0x57, 0x40, 0x2b, 0xe8, 0xe7, 0x35, 0x9b, 0xed, 0x1c, 0x0c, 0xf2, 0x95, 0x5b, 0xe8, 0xd4, 0xc4, 0x8d, 0x5c, 0x9f, 0x31, 0x16, 0x88, 0xfd, 0xb2, 0x0b, 0x85, 0xb5, 0xba, 0x9f, 0x04, 0xc7, 0x1f, 0xdf, 0x31, 0xb7, 0x21, 0xa0, 0xde, 0x29, 0xa9, 0xb5, 0xdd, 0xae, 0xce, 0x65, 0xad, 0xde, 0x9d, 0x1c, 0x5a, 0xa7, 0x1a, 0x60, 0x9e, 0xe4, 0x82, 0x07, 0x4c, 0x31, 0xd3, 0xa7, 0xee, 0xfe, 0x8e, 0x4f, 0xad, 0xe3, 0xbc, 0x74, 0x72, 0x33, 0x2f, 0x2e, 0x4b, 0xd4, 0x0a, 0xa5, 0x10, 0x4e, 0x84, 0xc5, 0x46, 0x21, 0xe8, 0x3a, 0x43, 0x5c, 0xe0, 0x98, 0x93, 0x6b, 0xf4, 0xd9 ],
+    const [ 0x17, 0x18, 0xa5, 0x7f, 0xe1, 0xa0, 0xa0, 0x12, 0xda, 0xdd, 0xb0, 0xd3, 0x00, 0x69, 0x52, 0x5c, 0x5a, 0xbe, 0x69, 0x14, 0x7e, 0xa9, 0xdf, 0x49, 0x57, 0xfc, 0x8f, 0x7f, 0x25, 0x84, 0x63, 0x07, 0xc5, 0x3a, 0xb9, 0xd3, 0x33, 0xbd, 0x0c, 0x88, 0x4d, 0x00, 0xd0, 0xd5, 0xda, 0x40, 0x9d, 0x04, 0xca, 0x3a, 0x90, 0xce, 0xbf, 0x9a, 0xef, 0x74, 0xcd, 0xb6, 0x0b, 0x0b, 0x7e, 0x7c, 0x6b, 0x17, 0x1a, 0xa9, 0x26, 0x5c, 0x25, 0x3d, 0x91, 0xf1, 0x28, 0x2b, 0x1a, 0x96, 0xb5, 0x54, 0x74, 0x47, 0xa5, 0xb6, 0xf5, 0x12, 0xa4, 0xe1, 0x3c, 0x25, 0xf0, 0xab, 0x16, 0x2b, 0x5d, 0x25, 0xa3, 0xd9, 0x9d, 0xce, 0xb4, 0xc3, 0xbe, 0x06, 0x78, 0x75, 0xf4, 0xc5, 0x58, 0xbf, 0x99, 0x8c, 0x1f, 0x50, 0x72, 0x9c, 0x5e, 0x86, 0x34, 0x67, 0x0f, 0x85, 0x46, 0x44, 0x78, 0x87, 0xc9, 0x66, 0x52, 0x73, 0xd6, 0x0f, 0x2b, 0xb0, 0x06, 0x01, 0x09, 0x3b, 0x38, 0x36, 0x50, 0xf7, 0x8e, 0xd0, 0xe5, 0x45, 0xb9, 0x53, 0x94, 0xd5, 0x77, 0x12, 0xaf, 0xbc, 0x59, 0xe7, 0xf8, 0xc6, 0xca, 0x27, 0xc1, 0x0d, 0x4d, 0xd5, 0x52, 0xca, 0x06, 0x16, 0x8b, 0x6c, 0x7c, 0xe5, 0xcb, 0xe7, 0x9d, 0x08, 0x10, 0x4f, 0x03, 0x43, 0x5f, 0xa5, 0x75, 0xcb, 0x66, 0xf1, 0xb1, 0xfd, 0x60, 0x90, 0x68, 0x50, 0x39, 0xd0, 0x8b, 0x89, 0xf2, 0xba, 0xc5, 0x2e, 0x48, 0x2f, 0x49, 0x3c, 0x90, 0x37, 0xcd, 0x1c, 0xe6, 0x95, 0xd6, 0xd4, 0x86, 0x9f, 0x37, 0x7b, 0x7a, 0x4c, 0xd4, 0xef, 0x76, 0x8f, 0xac, 0xca, 0x00, 0xe3, 0x17, 0x91, 0xd3, 0x27, 0x4b, 0x2f, 0x86, 0xad, 0x25, 0xa2, 0x69, 0x8e, 0x27, 0xf5, 0xb0, 0x40, 0xbd, 0x6e, 0xd3, 0x6a, 0xc4, 0x08, 0x34, 0xf6, 0x4c, 0x23, 0x03, 0x68, 0x9d, 0x7b, 0x5e, 0x6f, 0x79, 0x57, 0xbd, 0xba, 0xa1, 0x03, 0x8e, 0x0d, 0x9b, 0x7f, 0x1c, 0x94, 0xb1, 0x79, 0xb5, 0x77, 0x3d, 0x79, 0x0c, 0xae, 0x24, 0x5c, 0xdc, 0x17, 0xa1, 0x03, 0xce, 0xc6, 0x44, 0x4c, 0x9d, 0x9c, 0x3a, 0x41, 0x78, 0x1b, 0xce, 0x90, 0xa8, 0x78, 0x30, 0x3c, 0x72, 0xf2, 0x75, 0x91, 0x3f, 0x63, 0xe0, 0x5d, 0xfa, 0x15, 0x60, 0x5d, 0xba, 0xd6, 0x59, 0xf6, 0xa1, 0x4f, 0xa7, 0x25, 0x04, 0x91, 0xe1, 0xb9, 0xcb, 0xf1, 0xda, 0xc0, 0x1b, 0x16, 0x6e, 0x3f, 0x33, 0x50, 0x7b, 0x26, 0x94, 0x2b, 0x2d, 0x82, 0x65, 0x45, 0x7f, 0xf5, 0x15, 0x5c, 0xfe, 0x63, 0x42, 0xab, 0xd0, 0xef, 0xda, 0x77, 0xf6, 0x26, 0x80, 0xe5, 0xce, 0x79, 0x31, 0x0e, 0xdc, 0xf1, 0x27, 0x55, 0xc9, 0x1e, 0xfd, 0xf9, 0xac, 0x51, 0x15, 0xe6, 0x89, 0x0b, 0x37, 0xd1, 0x17, 0xb4, 0x7a, 0x83, 0xc7, 0x90, 0x68, 0x75, 0x01, 0xf0, 0x5d, 0x9e, 0xb1, 0xa5, 0x30, 0x89, 0x02, 0xba, 0x15, 0xaa, 0x69, 0x63, 0xc2, 0xf2, 0xe6, 0x30, 0xd1, 0xa1, 0x87, 0x86, 0x66, 0x5c, 0x2d, 0x50, 0x11, 0x7f, 0x92, 0xf2, 0xf6, 0xb4, 0x8b, 0x7e, 0x2b, 0xc5, 0x8b, 0x2b, 0x61, 0xae, 0x69, 0x03, 0xc7, 0xf7, 0x63, 0xdb, 0x2b, 0x40, 0x62, 0x88, 0x62, 0x1e, 0x80, 0x50, 0xeb, 0x25, 0xc7, 0x9f, 0xcf, 0x46, 0x3b, 0xfb, 0xcb, 0x5c, 0x1b, 0x3a, 0xb1, 0x01, 0x65, 0xf3, 0x0c, 0xa6, 0x98, 0x32, 0x03, 0xe3, 0xbd, 0x70, 0x80, 0x0b, 0xa8, 0xc2, 0x91, 0x04, 0x7c, 0x50, 0x0e, 0x55, 0x6d, 0x09, 0x7c, 0x81, 0xca, 0x95, 0x31, 0x94, 0x3a, 0x8b, 0xb9, 0xfb, 0x46, 0xe5, 0x79, 0x98, 0x17, 0xb1, 0x92, 0x16, 0x81, 0x09, 0x08, 0x7a, 0x41, 0x44, 0x24, 0xfb, 0x83, 0x6e, 0x16, 0x14, 0xa8, 0xf6, 0xdf, 0xd7, 0x45, 0xa7, 0x6e, 0x84, 0x6f, 0xd9, 0x09, 0x5a, 0x36, 0xe9, 0xef, 0xad, 0x6f, 0xe6, 0x3c, 0x39, 0xb7, 0x8d, 0x0c, 0xb6, 0xb4, 0x78, 0xe3, 0xad, 0x9e, 0x92, 0x4d, 0x89, 0xfe, 0xce, 0xc1, 0xf1, 0xb6, 0x19, 0xcb, 0x55, 0x42, 0x8d, 0x6b, 0xc7, 0x3d, 0xe7, 0xb8, 0x0d, 0x27, 0x3b, 0xc8, 0xf4, 0x65, 0xe6, 0xd4, 0xe7, 0x89, 0xc5, 0x98, 0xbf, 0xd4, 0xa4, 0xf9, 0xdd, 0xf9, 0xf9, 0xea, 0x76, 0x24, 0xd3, 0x90, 0x2f, 0x3b, 0x0d, 0xa4, 0xea, 0x64, 0xc7, 0x1a, 0xdf, 0xc7, 0x16, 0x00, 0xee, 0x95, 0xfb, 0xa8, 0x33, 0x49, 0x92, 0x09, 0xdc, 0x2e, 0x8c, 0x63, 0x37, 0x21, 0xdf, 0x22, 0x0f, 0x98, 0xbc, 0x05, 0x39, 0xe3, 0xc2, 0x7f, 0x6a, 0xb2, 0x71, 0x5e, 0x4c, 0xd8, 0xe1, 0xaa, 0xd0, 0x4e, 0xb4, 0xd0, 0xc5, 0x7b, 0x49, 0xff, 0xaa, 0xb2, 0x32, 0xd3, 0xc0, 0xfd, 0xe9, 0x31, 0x64, 0x19, 0xbe, 0x72, 0x9c, 0xc1, 0x14, 0xc3, 0xf0, 0x30, 0xcd, 0xcb, 0x7b, 0xe1, 0x03, 0x8f, 0x41, 0x99, 0xf9, 0x93, 0xc3, 0xa7, 0x51, 0x42, 0xd1, 0x6a, 0x7f, 0x90, 0xa0, 0x15, 0x7d, 0xde, 0x1c, 0xaf, 0xc0, 0x1e, 0x7f, 0x5e, 0x6c, 0x37, 0x23, 0xe4, 0xc4, 0xab, 0x94, 0x6a, 0xe4, 0x77, 0xea, 0x7d, 0xb2, 0x3b, 0x56, 0x56, 0x12, 0x9a, 0xfa, 0x5e, 0x59, 0xe4, 0xfe, 0xf1, 0x05, 0xf2, 0xe0, 0x62, 0xab, 0x52, 0x0b, 0x40, 0x30, 0xa5, 0xac, 0xd8, 0x3c, 0x44, 0xc1, 0xfb, 0xec, 0x2a, 0x72, 0x02, 0xc7, 0x0e, 0xa5, 0x0e, 0xf4, 0xcf, 0xcd, 0x95, 0xaa, 0x15, 0x02, 0x1a, 0xe7, 0x36, 0x57, 0x3b, 0x65, 0x56, 0x68, 0xf1, 0xca, 0xd3, 0x32, 0x14, 0x1e, 0xe0, 0x28, 0x1d, 0x83, 0x6f, 0x83, 0x30, 0x20, 0x55, 0xd9, 0x5a, 0x5f, 0xa8, 0xf1, 0x17, 0x58, 0x6c, 0xd6, 0x17, 0x8d, 0x6f, 0x2a, 0x41, 0xd7, 0x72, 0xbd, 0xf9, 0xa0, 0x89, 0x5e, 0x9e, 0x53, 0xc5, 0xf1, 0x57, 0x11, 0x0f, 0xc2, 0x10, 0xa6, 0x57, 0x19, 0xbf, 0xbb, 0xef, 0x0f, 0xec, 0x4c, 0x31, 0x9f, 0x70, 0x5d, 0x68, 0x00, 0x7d, 0xe9, 0xee, 0x32, 0xde, 0x1c, 0x91, 0xd8, 0x80, 0xc2, 0x3b, 0x45, 0x32, 0xfe, 0xd3, 0xd9, 0xa9, 0x3f, 0x5e, 0x8e, 0xc7, 0x70, 0x6a, 0xce, 0x1d, 0x6f, 0xac, 0x88, 0xae, 0xc1, 0xe8, 0x82, 0xf5, 0x84, 0x11, 0xf1, 0x2a, 0xa4, 0xb2, 0x47, 0xc2, 0x52, 0x8c, 0x4c, 0x35, 0xb2, 0x80, 0x70, 0x03, 0xd4, 0xb0, 0x5f, 0xf9, 0xe6, 0xe2, 0xd7, 0xb0, 0xa8, 0x25, 0xb6, 0x58, 0x20, 0xb6, 0x58, 0xb3, 0x8e, 0x24, 0x1f, 0x64, 0xa2, 0xb3, 0x53, 0x6a, 0xed, 0xfe, 0x2d, 0xe8, 0x96, 0xe1, 0x2e, 0x27, 0x4e, 0x96, 0xb5, 0xdd, 0x85, 0x1e, 0xd1, 0xb0, 0xde, 0xe3, 0x54, 0xf6, 0xe1, 0x9b, 0x29, 0xbf, 0xf1, 0x6f, 0xe7, 0x15, 0x7d, 0x5d, 0xa5, 0x82, 0x7a, 0xdb, 0x11, 0xd3, 0x10, 0xbd, 0xbc, 0x1c, 0x93, 0x58, 0xb8, 0xfc, 0xb6, 0xe8, 0x65, 0x22, 0xfb, 0x2f, 0x88, 0x10, 0x6e, 0x5f, 0x9d, 0x1f, 0x93, 0x3a, 0x6f, 0xc4, 0x9d, 0x78, 0xe5, 0x11, 0xe0, 0x69, 0x1f, 0x7f, 0x89, 0xdb, 0xc1, 0xea, 0x8d, 0x3e, 0x8f, 0xdd, 0xdf, 0x06, 0x3b, 0x10, 0xe6, 0x51, 0x7a, 0x2f, 0x2e, 0xca, 0x5d, 0xdd, 0x5e, 0xcd, 0xdf, 0xf9, 0x6a, 0xcc, 0xbb, 0x20, 0x09, 0xf1, 0x80, 0x73, 0x6a, 0x04, 0xe6, 0x9a, 0x22, 0x90, 0x63, 0x09, 0x6a, 0x41, 0xfa, 0x81, 0x87, 0x91, 0x54, 0xda, 0x89, 0xa3, 0x11, 0x01, 0x38, 0x6f, 0x60, 0x3d, 0x4c, 0x20, 0xcd, 0xb6, 0xdc, 0xba, 0x5b, 0x37, 0x19, 0x00, 0xd3, 0x33, 0x3c, 0x95, 0x5b, 0x06, 0xbd, 0x61, 0x4a, 0x7e, 0xc6, 0x36, 0x3b, 0x9a, 0xe7, 0xb4, 0x61, 0x91, 0x0b, 0x6a, 0x1a, 0x16, 0xab, 0x3d, 0xc6, 0xdb, 0x41, 0x0e, 0xd9, 0x54, 0x00, 0x97, 0x2f, 0xbd, 0xc2, 0x96, 0xa0, 0x5e, 0x42, 0x2e, 0xd5, 0x0e, 0x8b, 0x8a, 0x59, 0xf6, 0xb0, 0xc3, 0xf3, 0x97, 0xbe, 0x04, 0x34, 0x0f, 0xef, 0xec, 0x4c, 0x97, 0x20, 0x33, 0x22, 0x51, 0x85, 0x91, 0xa3, 0x41, 0x9c, 0xdb, 0x59, 0x98, 0x5f, 0x70, 0x40, 0x39, 0xbe, 0xd3, 0xd6, 0x76, 0x4c, 0x99, 0x72, 0x1a, 0x39, 0x86, 0xd6, 0xad, 0x80, 0xf3, 0x07, 0xf3, 0x61, 0x72, 0x5d, 0xb6, 0x12, 0xb5, 0xd6, 0xc5, 0xb2, 0xac, 0xaf, 0x3d, 0x7e, 0xee, 0x36, 0x07, 0x47, 0x5a, 0xda, 0xa2, 0x24, 0xfe, 0x84, 0x23, 0x64, 0x38, 0x2a, 0x7a, 0xc6, 0x1a, 0xa1, 0xf6, 0xed, 0x13, 0xb2, 0x0c, 0x0e, 0xcc, 0x71, 0x54, 0xec, 0x51, 0xca, 0xd4, 0x06, 0x71, 0x5d, 0x81, 0x0e, 0x67, 0x8c, 0x03, 0x9e, 0xba, 0xd1, 0xb9, 0x27, 0x61, 0x55, 0xfd, 0x2a, 0x2b, 0xbf, 0xa9, 0xaa, 0x5e, 0x4a, 0xd9, 0xe1, 0x9e, 0x1b, 0xf3, 0x32, 0x11, 0xd1, 0xe5, 0x5f, 0xc1, 0x5d, 0xae, 0xfc, 0x42, 0x14, 0x20, 0x23, 0x94, 0x02, 0xe4, 0x6a, 0x4a, 0x82, 0xbe, 0x12, 0xec, 0x0c, 0x12, 0x81, 0x9b, 0x4d, 0xa8, 0xf2, 0xf3, 0x7d, 0xac, 0x6c, 0x36, 0xed, 0xf9, 0xf0, 0xa6, 0xdf, 0x97, 0xf7, 0x32, 0x9b, 0x81, 0x1c, 0x55, 0xbf, 0xac, 0x15, 0x3c, 0xd7, 0x46, 0xe7, 0x27, 0x2d, 0x3b, 0x5a, 0x11, 0xe3, 0xfe, 0xab, 0x93, 0x3e, 0x86, 0x82, 0x06, 0x45, 0x97, 0x23, 0xe8, 0x8b, 0x42, 0xe8, 0x80, 0x49, 0xaf, 0xef, 0xc5, 0xaf, 0x1a, 0x10, 0x7d, 0x7c, 0x1c, 0x12, 0xa2, 0xcd, 0x2c, 0x1e, 0x09, 0x32, 0x65, 0x73, 0x46, 0x07, 0x8a, 0x5c, 0xca, 0x02, 0x47, 0x5f, 0x4e, 0x08, 0xb9, 0xb8, 0x75, 0x45, 0x31, 0x06, 0xac, 0x7b, 0x35, 0x43, 0x55, 0x9a, 0xc8, 0xf9, 0x26, 0x92, 0xec, 0xb3, 0xcb, 0x65, 0x64, 0xb2, 0xd3, 0x80, 0xbe, 0xe2, 0xc9, 0x4b, 0x91, 0x0d, 0xa1, 0xff, 0x04, 0x4d, 0x57, 0xb8, 0x8f, 0xc7, 0xd2, 0xcb, 0x06, 0x96, 0x0e, 0x59, 0xd3, 0x06, 0x7a, 0x24, 0x82, 0x03, 0x9f, 0xa2, 0x84, 0xd1, 0x03, 0x50, 0x2c, 0xfd, 0x4d, 0x49, 0xfe, 0x93, 0xa9, 0x17, 0x29, 0x91, 0x6e, 0xc9, 0x52, 0x9c, 0xff, 0x45, 0x93, 0xf2, 0xef, 0xe0, 0xc4, 0xa0, 0x68, 0x2c, 0xf9, 0xf5, 0xcd, 0x11, 0x4b, 0x36, 0x9e, 0x20, 0xdc, 0x93, 0x9c, 0x23, 0x15, 0x5a, 0x2e, 0xf9, 0x32, 0x6b, 0x04, 0xa1, 0x01, 0xec, 0xfa, 0x94, 0xe6, 0x3d, 0x3f, 0x58, 0x23, 0x2e, 0xb6, 0x52, 0x56, 0x70, 0x9c, 0xdc, 0x43, 0x4a, 0x6c, 0x97, 0xd4, 0x8d, 0xff, 0x02, 0x5e, 0xca, 0xf8, 0x4c, 0x26, 0xc2, 0x5f, 0x67, 0x24, 0x1e, 0x8c, 0x5e, 0x07, 0x61, 0x47, 0xe8, 0x79, 0x1a, 0x2d, 0x3d, 0xa3, 0x5e, 0x56, 0x28, 0xf4, 0x75, 0x34, 0x5e, 0x1e, 0xd4, 0xbe, 0x0e, 0x62, 0x4b, 0xce, 0xb9, 0x0e, 0x80, 0xc8, 0x44, 0x44, 0x9c, 0x7d, 0x4c, 0xfc, 0x44, 0x4f, 0xb9, 0x4c, 0xcb, 0x95, 0x96, 0xe8, 0xa6, 0x41, 0x20, 0xe5, 0x20, 0xc0, 0x1c, 0xc2, 0x4f, 0x21, 0x6e, 0xa8, 0x46, 0x7a, 0xe8, 0xf1, 0x8c, 0x87, 0x60, 0xe8, 0xcd, 0x95, 0x05, 0xcf, 0xd0, 0x9e, 0xf3, 0x27, 0xa9, 0xb6, 0x04, 0x2b, 0x30, 0xa5, 0xe9, 0x9e, 0xb1, 0xd6, 0x7a, 0xc6, 0xe5, 0x70, 0x4b, 0xb9, 0x21, 0xc2, 0x80, 0xd7, 0xce, 0xe4, 0xe2, 0x98, 0x19, 0x9b, 0x32, 0x88, 0xeb, 0x7e, 0xbd, 0x8f, 0x1c, 0x57, 0x30, 0x76, 0xe4, 0xcc, 0xae, 0xa7, 0x92, 0x3f, 0x20, 0x34, 0x80, 0xf2, 0xcc, 0x1b, 0x46, 0x6f, 0x2a, 0xc9, 0x2e, 0x27, 0xf2, 0xdc, 0xe8, 0x59, 0x7a, 0x2d, 0x7f, 0x35, 0x3f, 0x0e, 0x8c, 0x42, 0xc1, 0xd0, 0xaa, 0xfd, 0x95, 0x89, 0x29, 0xc3, 0xb5, 0x13, 0x07, 0xf0, 0x1a, 0x58, 0x1b, 0x49, 0x8d, 0xcd, 0x94, 0x97, 0xba, 0x3d, 0xa2, 0x95, 0x86, 0xc8, 0x73, 0x0c, 0xa2, 0x2b, 0x61, 0x3d, 0x60, 0x42, 0x6a, 0x7f, 0xc6, 0xcb, 0xe0, 0x29, 0xe2, 0x6c, 0x61, 0xb2, 0x5c, 0xf8, 0x0a, 0x17, 0x52, 0xee, 0xe8, 0x7d, 0x5f, 0x42, 0xaf, 0x18, 0xfd, 0x60, 0xaf, 0x4b, 0x0e, 0x6f, 0x03, 0x11, 0xb5, 0xd2, 0x0c, 0x9b, 0x6a, 0xf5, 0x1e, 0x3b, 0x4e, 0x46, 0x78, 0x80, 0xbb, 0x81, 0x7a, 0xa3, 0x20, 0x31, 0x12, 0x21, 0x0c, 0x74, 0x78, 0xaa, 0x88, 0xfe, 0x1b, 0x3a, 0xaa, 0x60, 0xdb, 0x86, 0x67, 0x8a, 0x78, 0x99, 0xa9, 0x8f, 0x4a, 0xbf, 0xa1, 0xa9, 0x33, 0xa2, 0x5f, 0x7d, 0xd3, 0xb3, 0xa0, 0xa0, 0xfa, 0xcb, 0xe7, 0x59, 0x63, 0x12, 0xcf, 0xa9, 0x9f, 0x21, 0x9f, 0x88, 0x4f, 0x63, 0x1f, 0x72, 0x96, 0xc1, 0xaa, 0x22, 0xce, 0x7e, 0x85, 0x9e, 0x7a, 0x5f, 0x6f, 0x73, 0x7c, 0x10, 0x79, 0x42, 0x89, 0xc3, 0x18, 0x7b, 0xd9, 0x1a, 0x79, 0x69, 0x23, 0x47, 0x14, 0x6f, 0xc8, 0x72, 0x84, 0x91, 0x4f, 0x5a, 0x96, 0x35, 0x11, 0x40, 0xa0, 0x2b, 0x35, 0x01, 0x14, 0xec, 0xdf, 0x82, 0x54, 0x1f, 0xa5, 0x50, 0xc8, 0x62, 0x43, 0x88, 0x2f, 0x46, 0x8f, 0xf5, 0x32, 0x9b, 0xaf, 0x79, 0x3f, 0xef, 0x89, 0xae, 0x94, 0x51, 0x7b, 0xcc, 0x9a, 0x5b, 0x4c, 0xce, 0x75, 0x6f, 0x63, 0xd0, 0xd9, 0x40, 0x37, 0xbc, 0x1f, 0x94, 0x07, 0x25, 0x98, 0x49, 0xcb, 0x73, 0x21, 0x96, 0x6a, 0x41, 0xf7, 0x94, 0x2d, 0x03, 0xcd, 0xfd, 0x74, 0xec, 0x1c, 0x33, 0xa8, 0x0f, 0xbb, 0x84, 0x70, 0xc4, 0xaf, 0xac, 0x28, 0x4d, 0x44, 0x9b, 0x8f, 0xb9, 0x5d, 0x79, 0xbf, 0x09, 0x08, 0xe8, 0x63, 0x92, 0x55, 0x89, 0x24, 0xa2, 0x69, 0xc1, 0x64, 0x66, 0xce, 0xbd, 0x2f, 0x0b, 0x0d, 0xb3, 0x6e, 0x24, 0x7f, 0x6b, 0x5e, 0x4c, 0x60, 0xff, 0x41, 0x0c, 0x25, 0xdf, 0x54, 0xff, 0x0f, 0x17, 0x00, 0x33, 0x01, 0xd5, 0x54, 0xd3, 0x8f, 0x25, 0xb3, 0x03, 0x57, 0x00, 0xca, 0x0c, 0x94, 0x85, 0xc5, 0xb9, 0xf0, 0x86, 0xc3 ],
+    const [ 0xee, 0xb1, 0xa4, 0xc6, 0x60, 0xbe, 0x97, 0xe3, 0x65, 0xdf, 0xe4, 0x2a, 0x4d, 0x34, 0x00, 0xc6, 0xe6, 0x61, 0xca, 0xac, 0xa0, 0x2a, 0xcc, 0xd2, 0xef, 0x41, 0xbe, 0x9b, 0xf1, 0x5b, 0x4c, 0x96, 0x51, 0x89, 0x1a, 0x69, 0x6b, 0xc6, 0x04, 0x08, 0xb0, 0xcc, 0xaa, 0x2b, 0x4c, 0x2d, 0x2c, 0xfe, 0x07, 0x9e, 0x32, 0x1a, 0x69, 0x96, 0x30, 0xb4, 0x22, 0x18, 0xe8, 0x14, 0xa9, 0xcc, 0x30, 0x49, 0x22, 0x55, 0xf5, 0x1c, 0x85, 0xdf, 0x80, 0x42, 0xfd, 0xf7, 0xf8, 0xd6, 0x8e, 0xa0, 0x28, 0x06, 0xfb, 0xa3, 0x83, 0x0c, 0xe7, 0x26, 0x65, 0x60, 0x3a, 0x80, 0x9c, 0x2b, 0xc6, 0x4c, 0x27, 0xff, 0x2b, 0xbc, 0x3d, 0xc6, 0xf7, 0x31, 0x92, 0xf9, 0x12, 0x08, 0xd5, 0x13, 0x5a, 0xb6, 0x7d, 0x44, 0x8a, 0x17, 0xc5, 0x69, 0x60, 0x03, 0xf5, 0x3c, 0xff, 0x23, 0xe4, 0xc8, 0x92, 0x02, 0xbb, 0x21, 0x32, 0x67, 0xfb, 0x51, 0x0a, 0xe3, 0xc2, 0x95, 0xb8, 0xa6, 0x4a, 0xca, 0xf7, 0x96, 0xb2, 0x22, 0x7b, 0xa3, 0x01, 0x1b, 0x1d, 0x54, 0x68, 0xb2, 0x38, 0xa6, 0xc7, 0xd3, 0x53, 0x17, 0x73, 0x15, 0x00, 0xfe, 0x37, 0xa4, 0x03, 0x1d, 0x98, 0x7e, 0xb7, 0x79, 0x5d, 0xe3, 0xae, 0x6a, 0x4f, 0x06, 0x98, 0xee, 0x3e, 0x09, 0x66, 0x42, 0x44, 0x28, 0xaf, 0xb4, 0x4e, 0x35, 0x52, 0xb3, 0xd7, 0x44, 0x5d, 0x28, 0xf7, 0xa7, 0x2d, 0x09, 0x9d, 0x1d, 0xd7, 0x2a, 0x18, 0x46, 0xc7, 0x57, 0xdd, 0x5a, 0xa7, 0xa1, 0x84, 0x1b, 0x83, 0xf5, 0x13, 0x08, 0x2a, 0xf3, 0x7f, 0xd4, 0xd7, 0xfc, 0x70, 0x16, 0x10, 0x8d, 0x45, 0x42, 0xcf, 0xcc, 0x58, 0xd8, 0xe0, 0x61, 0x83, 0xdb, 0x8a, 0x87, 0xe3, 0x85, 0x71, 0x63, 0xdb, 0x39, 0xbb, 0x94, 0x5c, 0xb9, 0x72, 0x0b, 0x64, 0x99, 0x29, 0x1d, 0xc5, 0xf4, 0xe3, 0xd6, 0x28, 0x5d, 0x30, 0x91, 0x51, 0x18, 0x99, 0xc5, 0xa5, 0x8b, 0x3e, 0x22, 0xe9, 0xef, 0xbe, 0xdd, 0x4c, 0x4b, 0x57, 0x48, 0xa8, 0xa3, 0x4f, 0xa5, 0x05, 0x6c, 0x92, 0x3c, 0x5f, 0x44, 0x9c, 0xab, 0xa9, 0xe0, 0x99, 0x7e, 0x11, 0x46, 0xcb, 0xff, 0x86, 0x3c, 0x2d, 0x4f, 0x77, 0x00, 0x56, 0xb6, 0xde, 0x39, 0x9f, 0x38, 0x7e, 0x2e, 0x88, 0x69, 0x68, 0x36, 0x58, 0x82, 0xc4, 0x6f, 0x04, 0xb3, 0xce, 0xb3, 0x52, 0xbb, 0x1f, 0xc8, 0x3e, 0xb7, 0x2e, 0xd7, 0x9d, 0x37, 0x16, 0x20, 0x00, 0x97, 0x9a, 0xeb, 0xdb, 0x8d, 0x66, 0xc2, 0xe7, 0xfe, 0x97, 0xdd, 0xc4, 0x16, 0x7e, 0xde, 0xe3, 0x97, 0xa1, 0xbf, 0xa3, 0x71, 0x03, 0x08, 0xba, 0x94, 0xa6, 0x45, 0xd7, 0x02, 0x4d, 0xb7, 0x86, 0x28, 0x86, 0x4a, 0x53, 0x6e, 0xe8, 0xc7, 0x32, 0x0d, 0x9a, 0x4b, 0x1e, 0x20, 0x15, 0xf8, 0x01, 0xff, 0x2a, 0xea, 0xd4, 0xc8, 0x46, 0x6c, 0x07, 0x3e, 0xf5, 0x6c, 0x23, 0xd7, 0xa5, 0x2d, 0xae, 0x10, 0xad, 0x3c, 0x4f, 0x04, 0x8d, 0xa5, 0x32, 0x3d, 0x77, 0x66, 0xae, 0xca, 0x0f, 0x24, 0x25, 0x91, 0x70, 0x1d, 0x2c, 0xe7, 0x6f, 0x5e, 0xec, 0x5e, 0x23, 0x36, 0xc8, 0xde, 0xa5, 0xea, 0x41, 0xf8, 0x14, 0xaa, 0x16, 0x76, 0xdc, 0xc4, 0xaf, 0x37, 0x38, 0x18, 0xbb, 0x3a, 0xf6, 0xcc, 0x19, 0xf8, 0x7b, 0x41, 0xf4, 0xf7, 0x06, 0x45, 0x33, 0x9c, 0x39, 0x8a, 0x10, 0x41, 0xd5, 0x56, 0x06, 0x87, 0xc5, 0x7d, 0xf1, 0xed, 0x5e, 0x8d, 0x71, 0xa2, 0xe5, 0x48, 0x8f, 0x98, 0x51, 0x57, 0xa3, 0xda, 0x53, 0x3c, 0x75, 0x1f, 0x94, 0x89, 0xa2, 0x9f, 0x3e, 0x4f, 0x41, 0x25, 0xbd, 0xda, 0xc7, 0x66, 0xc7, 0x9b, 0x28, 0x91, 0x99, 0x66, 0x3f, 0x27, 0x84, 0xde, 0x70, 0x0d, 0xa9, 0x2d, 0x8c, 0xe0, 0x01, 0xf8, 0xf4, 0x88, 0xa0, 0x91, 0x02, 0x10, 0x3a, 0x6f, 0xa4, 0xb4, 0xe6, 0xdc, 0x4a, 0x3c, 0x22, 0xee, 0x03, 0x89, 0x17, 0xb8, 0xe2, 0x6e, 0x1f, 0xc1, 0xa7, 0xc1, 0x85, 0xb6, 0x9b, 0xb1, 0x8c, 0x5b, 0xbc, 0x59, 0xb2, 0xc7, 0x1a, 0x96, 0x35, 0xd1, 0x81, 0x16, 0xd7, 0xc6, 0x58, 0xb2, 0xde, 0x5d, 0xc9, 0xfe, 0x60, 0xec, 0x23, 0x1e, 0xbd, 0xdb, 0x7c, 0xdb, 0x6d, 0x59, 0x9a, 0xf6, 0xfc, 0x4f, 0x14, 0xbb, 0x52, 0x92, 0xb4, 0xda, 0x38, 0x5d, 0x20, 0x73, 0x18, 0xfe, 0xb9, 0x70, 0x04, 0xcf, 0xc4, 0x17, 0xfa, 0x68, 0xc8, 0xdf, 0x67, 0x13, 0x36, 0x83, 0xe9, 0x81, 0x4f, 0x56, 0x59, 0xbb, 0x43, 0xd6, 0x09, 0x5a, 0x96, 0x83, 0x4a, 0xfb, 0xc8, 0xf2, 0x32, 0xee, 0x35, 0x1d, 0x9c, 0x2e, 0x3a, 0xfd, 0x6f, 0x96, 0x99, 0x5b, 0x24, 0x51, 0x1f, 0xe3, 0x82, 0x93, 0x84, 0x7a, 0xac, 0x86, 0x92, 0xd1, 0x5e, 0x88, 0x89, 0x3a, 0x74, 0x93, 0xc3, 0xbb, 0xac, 0xfc, 0x94, 0x61, 0xac, 0x61, 0x74, 0xd7, 0x47, 0xdd, 0x60, 0x37, 0xfc, 0x7d, 0x7d, 0x20, 0xbf, 0xf8, 0xff, 0x09, 0xfd, 0x9a, 0x49, 0xd5, 0xda, 0x82, 0x55, 0xa7, 0xbd, 0x0d, 0x57, 0xf7, 0x0e, 0x92, 0x9d, 0xe6, 0x3e, 0x50, 0xba, 0xce, 0x08, 0xa4, 0xe3, 0x1e, 0xf7, 0x80, 0x99, 0x65, 0x29, 0x18, 0x89, 0xac, 0x52, 0xde, 0xb0, 0x09, 0x03, 0xb1, 0xc2, 0x71, 0x2d, 0x51, 0xcd, 0xce, 0xe1, 0x17, 0x19, 0x51, 0x59, 0xe3, 0x54, 0x0a, 0x3c, 0x55, 0xeb, 0xb6, 0x1e, 0x40, 0xbb, 0xd8, 0x46, 0x5b, 0xe9, 0x0b, 0xb5, 0x3a, 0x0e, 0x96, 0x64, 0x7d, 0x98, 0x41, 0xcc, 0x48, 0x6d, 0x67, 0xab, 0xf3, 0xd1, 0x4d, 0x06, 0x02, 0x89, 0xb2, 0x6a, 0x57, 0x40, 0xa7, 0x78, 0xa6, 0x2b, 0xa1, 0xa1, 0x2a, 0xe9, 0xcd, 0x2d, 0x96, 0xad, 0xa3, 0x82, 0x4f, 0x9e, 0xbe, 0xa3, 0xd8, 0x7e, 0xeb, 0xf7, 0x8d, 0x8a, 0x80, 0x4c, 0x95, 0xa2, 0xef, 0x1b, 0x12, 0xaa, 0x9a, 0x0d, 0x9a, 0x30, 0xe9, 0xbf, 0xeb, 0x4f, 0x9a, 0xc2, 0xda, 0xd3, 0x59, 0xe7, 0x8d, 0x9d, 0x91, 0xb9, 0xea, 0x4a, 0x81, 0x4a, 0x4f, 0x0f, 0x92, 0x33, 0x84, 0xe7, 0xe8, 0xd6, 0xee, 0xf1, 0x37, 0xe6, 0x05, 0x13, 0xd8, 0x2a, 0x08, 0xe4, 0x1c, 0x7d, 0xef, 0xc9, 0xe0, 0x1a, 0xa1, 0x5e, 0x61, 0x16, 0x67, 0x17, 0x52, 0x2e, 0xa0, 0x27, 0x2c, 0xc3, 0xb7, 0xa0, 0xc6, 0x23, 0x53, 0xdc, 0x25, 0x0a, 0xcd, 0x1d, 0x95, 0x69, 0xe7, 0x70, 0xf8, 0x65, 0xbb, 0xd7, 0x5f, 0xa3, 0xf1, 0xa6, 0xd7, 0xc3, 0x35, 0x2e, 0x86, 0x2a, 0xe8, 0x99, 0xf6, 0x05, 0x16, 0x15, 0xb0, 0x8a, 0xa9, 0x35, 0x0d, 0x81, 0xdc, 0x93, 0x49, 0x04, 0xf2, 0xbb, 0xd9, 0x83, 0x27, 0x44, 0xfe, 0x0b, 0xe7, 0x40, 0x9b, 0xc7, 0x3e, 0xd7, 0x44, 0xc7, 0x90, 0x2e, 0x97, 0x00, 0x8a, 0x8e, 0xcf, 0x94, 0x58, 0xc2, 0x96, 0x54, 0x18, 0xc0, 0x1b, 0x83, 0x8f, 0x8c, 0x65, 0xdd, 0x1b, 0x5a, 0xe7, 0xd8, 0xe9, 0xf3, 0x54, 0x2a, 0x68, 0x59, 0xb4, 0x8b, 0xfe, 0xae, 0xb8, 0xbc, 0xf9, 0x52, 0x4a, 0xc8, 0xc8, 0x4c, 0x69, 0x8a, 0x6b, 0xeb, 0x34, 0x6f, 0x28, 0xac, 0x44, 0x7e, 0x80, 0x5f, 0x3f, 0x95, 0x61, 0x86, 0xaa, 0xf5, 0x9d, 0xfe, 0xff, 0x00, 0x9b, 0xe1, 0x00, 0x42, 0x4d, 0xaa, 0x4a, 0xaf, 0x61, 0x9a, 0x2d, 0x2b, 0xbc, 0x5b, 0xbb, 0x50, 0x24, 0xe4, 0x1f, 0x6b, 0x3c, 0x9c, 0x31, 0xc7, 0xb6, 0xc2, 0x47, 0x2f, 0xc4, 0x0c, 0x4d, 0xae, 0xcf, 0x8e, 0x18, 0x99, 0x6c, 0xde, 0xf7, 0xcf, 0x8c, 0x76, 0x8b, 0x40, 0xf2, 0x59, 0xd9, 0xac, 0xeb, 0xfa, 0x9e, 0xad, 0x39, 0x59, 0xe2, 0xf8, 0x50, 0x6f, 0xd0, 0xe0, 0xc5, 0xcc, 0xc5, 0x1c, 0x03, 0x7f, 0xa7, 0xc9, 0x40, 0x36, 0x78, 0xb3, 0xaf, 0xa6, 0x2b, 0xd0, 0xf7, 0x2d, 0xb6, 0x0d, 0xe5, 0xb6, 0x68, 0x4d, 0x5d, 0xde, 0x7d, 0xaf, 0x97, 0x55, 0xf0, 0x10, 0x88, 0x86, 0x90, 0xd2, 0x9d, 0x7a, 0x56, 0xdb, 0xaf, 0xf9, 0xf6, 0xe0, 0x34, 0xf3, 0xb4, 0xe3, 0xb2, 0x1f, 0x79, 0xfa, 0x7a, 0xe2, 0x26, 0x53, 0x92, 0x72, 0x28, 0x75, 0xf3, 0x3b, 0x4d, 0xc8, 0xf4, 0x82, 0xd5, 0x58, 0x07, 0x48, 0xcd, 0xd6, 0xa3, 0x71, 0x98, 0xe0, 0x81, 0x25, 0xcf, 0x81, 0x0b, 0x77, 0x4b, 0xfc, 0x12, 0x44, 0x7f, 0xc5, 0xbf, 0x5e, 0x0b, 0xd1, 0xcc, 0xea, 0x8f, 0x0f, 0xf3, 0x07, 0xbd, 0x37, 0xa7, 0xb1, 0xb3, 0xc2, 0x03, 0xe4, 0x87, 0x39, 0x00, 0x04, 0x23, 0xb3, 0xea, 0x7c, 0x53, 0x9a, 0x15, 0xa6, 0x1c, 0xad, 0xcc, 0xeb, 0x50, 0x4b, 0x8a, 0x2b, 0x5f, 0xee, 0x6d, 0x5e, 0x70, 0xf6, 0xe7, 0x7c, 0xb0, 0xa8, 0xb7, 0x9b, 0xea, 0x76, 0x17, 0x57, 0x59, 0x80, 0x37, 0x77, 0xba, 0x5c, 0xeb, 0xce, 0xa4, 0x12, 0xa0, 0x5e, 0x1c, 0x6b, 0x95, 0xc4, 0x65, 0x6c, 0x48, 0xd0, 0x15, 0x1d, 0x2e, 0x73, 0x6e, 0x8f, 0xa6, 0xde, 0xea, 0x1c, 0x30, 0xe8, 0x18, 0xf1, 0xda, 0xb0, 0xa7, 0xca, 0xfc, 0x84, 0xc0, 0xfd, 0x25, 0x02, 0x9a, 0xba, 0x55, 0x7d, 0x48, 0x91, 0x6d, 0xa3, 0xd5, 0x34, 0xe3, 0x5c, 0x92, 0x7f, 0xba, 0xf5, 0xaf, 0xb5, 0xb2, 0x7d, 0x09, 0x0d, 0xbc, 0x6f, 0x43, 0x6d, 0xb0, 0x92, 0x18, 0x75, 0x42, 0x1e, 0xef, 0xbf, 0x33, 0x20, 0xb0, 0x65, 0xc4, 0x1f, 0xd7, 0xc4, 0x70, 0x00, 0xc7, 0x80, 0xda, 0x27, 0x60, 0xc9, 0x05, 0xdf, 0xd3, 0xdc, 0xc3, 0xfc, 0xb5, 0xcc, 0x70, 0xbf, 0x53, 0x82, 0xdf, 0xf9, 0x46, 0x02, 0x95, 0x73, 0x47, 0xf1, 0x35, 0x8e, 0x44, 0x54, 0x3c, 0x27, 0xb3, 0x9b, 0xee, 0xbd, 0x26, 0xde, 0x91, 0xd6, 0x1f, 0x66, 0xd8, 0x9e, 0x26, 0x6f, 0xa2, 0xd2, 0x1a, 0x2c, 0xe5, 0xdc, 0xc5, 0x0c, 0xe4, 0x40, 0xb2, 0x3c, 0xa9, 0x36, 0x43, 0x6d, 0xaf, 0x98, 0xfe, 0xd7, 0xdf, 0xff, 0x28, 0x7e, 0xbd, 0x2a, 0x95, 0xb4, 0xe4, 0x9f, 0xbe, 0xdf, 0xb0, 0x94, 0x14, 0x7c, 0x3a, 0x0f, 0x94, 0x64, 0x89, 0x4d, 0x9c, 0x4e, 0x06, 0x61, 0xfd, 0x96, 0x31, 0x1d, 0x51, 0x3d, 0x93, 0x35, 0x8f, 0x30, 0xf3, 0xa2, 0xdc, 0xcd, 0xcd, 0x45, 0xa4, 0xa3, 0x00, 0xcd, 0xea, 0x79, 0xc7, 0xda, 0xdc, 0x92, 0xea, 0x62, 0xab, 0x30, 0x36, 0x55, 0x99, 0x57, 0x2a, 0x7c, 0x54, 0xd3, 0xf3, 0xa7, 0x82, 0x7d, 0x9b, 0x07, 0x9d, 0xb9, 0x7d, 0xd9, 0x01, 0x43, 0xfc, 0x44, 0x43, 0x2c, 0x74, 0x85, 0xc5, 0x1f, 0x71, 0x49, 0x87, 0xe9, 0x1f, 0x5a, 0x40, 0x38, 0x02, 0x7e, 0xae, 0xa3, 0xe7, 0x9d, 0x2a, 0xeb, 0x1b, 0x21, 0x7f, 0x81, 0xda, 0xa2, 0xfc, 0x48, 0x0a, 0xc3, 0xc8, 0x9b, 0x2a, 0x57, 0x76, 0x92, 0x85, 0xc9, 0xd9, 0x81, 0xab, 0xba, 0x1a, 0xc2, 0x21, 0xeb, 0x07, 0xb5, 0x58, 0x5e, 0xae, 0x04, 0xdc, 0xb8, 0x2b, 0x2c, 0xce, 0xea, 0xbe, 0x39, 0x94, 0x10, 0x21, 0xd0, 0xcf, 0x99, 0x18, 0x73, 0x8d, 0xa9, 0x49, 0x01, 0xc1, 0xbb, 0x4e, 0x7c, 0xf0, 0x8b, 0x09, 0x0f, 0x2c, 0x33, 0x37, 0x50, 0x46, 0x94, 0x48, 0xc2, 0x40, 0xf7, 0x6f, 0x9e, 0x01, 0xf4, 0xf5, 0xd3, 0x4c, 0x94, 0xd2, 0x4b, 0xf3, 0xb2, 0x7e, 0x70, 0x48, 0xa7, 0x05, 0xef, 0xd5, 0x26, 0x5a, 0xbb, 0x4d, 0x64, 0xed, 0x56, 0xc2, 0x7c, 0x7f, 0x4c, 0x17, 0x13, 0x35, 0x00, 0xb9, 0x37, 0xec, 0xaa, 0x8a, 0x8d, 0xcd, 0xa1, 0x1e, 0xac, 0x21, 0xd6, 0x2a, 0xc4, 0x66, 0xa1, 0x39, 0x83, 0xa2, 0xc1, 0xa1, 0x39, 0xf7, 0x9e, 0xb6, 0x3a, 0x78, 0xd0, 0x3d, 0x84, 0x3b, 0xe5, 0x24, 0xa1, 0xaf, 0x5f, 0x70, 0xcf, 0x30, 0xfd, 0x76, 0x5f, 0xd9, 0x3c, 0x4e, 0x5b, 0x9a, 0x1c, 0x85, 0x6b, 0x8a, 0x27, 0x12, 0xf9, 0x7e, 0xb0, 0x8b, 0x94, 0xda, 0x59, 0x99, 0x92, 0xa7, 0xd8, 0xaa, 0xfa, 0xe6, 0xfa, 0xe5, 0xa1, 0x24, 0xe7, 0x63, 0x92, 0x4f, 0xa9, 0x9c, 0xb3, 0xc8, 0xe8, 0x1f, 0xa6, 0xb9, 0xf7, 0x87, 0xee, 0xa9, 0x15, 0xaa, 0x53, 0x4e, 0xec, 0x13, 0x87, 0xa2, 0x5e, 0xb3, 0x09, 0x39, 0x81, 0xd3, 0x4a, 0xd1, 0xe8, 0x4d, 0x0f, 0x2b, 0x25, 0xfc, 0x16, 0x19, 0x8b, 0x71, 0xfc, 0xd9, 0x39, 0xe7, 0x5e, 0xa1, 0x54, 0x79, 0x3f, 0x7b, 0x93, 0x93, 0xa9, 0x53, 0x01, 0xa7, 0x97, 0x4e, 0xfe, 0x21, 0x13, 0x5e, 0x87, 0x9c, 0x9c, 0x14, 0xb8, 0x56, 0xca, 0xb5, 0x8f, 0xe1, 0x35, 0x8f, 0xf3, 0x1c, 0x92, 0x8d, 0xf5, 0x62, 0x1f, 0x0a, 0x55, 0x01, 0x42, 0xe3, 0x48, 0xee, 0x6c, 0xd0, 0x78, 0xb7, 0x44, 0xf4, 0x4d, 0xb8, 0x02, 0xb2, 0x6b, 0x92, 0x18, 0xc3, 0x7c, 0xd9, 0x18, 0x85, 0x2f, 0x0d, 0xd2, 0x96, 0x80, 0xcc, 0xbc, 0xa2, 0x3b, 0x45, 0x98, 0x79, 0xbb, 0xf0, 0x50, 0x65, 0xf8, 0x7d, 0x25, 0xba, 0xc1, 0x0a, 0x08, 0xae, 0x45, 0x98, 0x48, 0x6b, 0xd8, 0xc0, 0x6e, 0x63, 0xf4, 0xa2, 0x66, 0xe4, 0x7e, 0x1f, 0xdf, 0xec, 0x4b, 0x48, 0xf3, 0x3e, 0xe3, 0x15, 0x0b, 0xb5, 0x85, 0x5b, 0xfd, 0xd9, 0x6b, 0xf8, 0x78, 0xb0, 0x4e, 0x50, 0xa2, 0xd7, 0x2d, 0xfe, 0xff, 0xd0, 0x4b, 0xc3, 0x95, 0x9e, 0x77, 0xc2, 0x4e, 0x8f, 0x8f, 0xf0, 0x9d, 0x5a, 0x47, 0xc6, 0x64, 0x69, 0x27, 0x39, 0x16, 0x78, 0xd3, 0xeb, 0x19, 0x5f, 0x8f, 0xa3, 0x6e, 0x2c, 0x02, 0xfb, 0x93, 0x75, 0x3a, 0x58, 0xa8, 0xed, 0xf1, 0x1f, 0xd2, 0x34, 0x0f, 0x26, 0xdd, 0xf4, 0x70, 0x69, 0x25, 0x29, 0xe6, 0xff, 0xb6, 0xc0, 0x82, 0x4c, 0xb2, 0x64, 0x0f, 0x77, 0xf3, 0x95, 0xe0, 0x1e, 0xf2, 0xfa, 0xcc, 0x49, 0xe7, 0xf8, 0x76, 0x9d, 0x32, 0x83, 0xd2, 0xd3, 0xfa, 0x34, 0xe4, 0x68, 0x14, 0x9c, 0xcb, 0x95, 0x26, 0xd9, 0xff, 0x81, 0x0c, 0x66, 0xd7, 0xb6, 0x7a, 0x38, 0x4e, 0xd1, 0xe3, 0x06, 0x06, 0x7e, 0x9a, 0xe8, 0x8d, 0xa4, 0x38, 0x23, 0xe0, 0xdd, 0x3d, 0x43, 0x2d, 0x29, 0xfa, 0x6b, 0xdd, 0xe3, 0xae, 0xea, 0xd2, 0xf4, 0xef, 0x0e, 0xed, 0x46, 0x4b, 0x3d, 0xd4, 0x7c, 0x30, 0x41, 0xf2, 0xe0, 0x09, 0xe4, 0xbf, 0x9c, 0xaa, 0xbd, 0x41, 0x2e, 0xee, 0x49, 0xd3, 0x16, 0x9e, 0x3e, 0x25, 0xd1, 0x95, 0x1b, 0x84, 0x0b, 0x22, 0x04, 0x5b, 0x11, 0xae, 0xcd, 0xfa, 0x85, 0x9f, 0x55, 0x97, 0x55, 0x7c, 0x15, 0x92, 0xed, 0x51 ],
+    const [ 0x22, 0xe9, 0x35, 0x5d, 0xee, 0x8f, 0x5b, 0xd9, 0xee, 0x75, 0x3a, 0xcc, 0xa4, 0xe2, 0x8a, 0x5e, 0xab, 0xd4, 0xdc, 0x28, 0x4a, 0x47, 0xd4, 0x95, 0x49, 0xb3, 0x92, 0x8e, 0x03, 0xd7, 0x71, 0x56, 0xbd, 0xb5, 0xf4, 0xb2, 0x36, 0xde, 0xfd, 0x4e, 0x7f, 0xef, 0x40, 0x5c, 0x0d, 0x5c, 0xf8, 0x7e, 0x0d, 0x6c, 0xd8, 0xe6, 0xf7, 0x85, 0x45, 0xbb, 0x66, 0xaa, 0xc2, 0xbf, 0x27, 0x42, 0xac, 0x30, 0x90, 0x1b, 0x27, 0xec, 0x13, 0xae, 0x58, 0xd8, 0x13, 0xa5, 0xd5, 0x81, 0xf5, 0x9a, 0x59, 0x04, 0x7b, 0x22, 0xbd, 0x2c, 0x4d, 0x0a, 0x23, 0xdb, 0xd9, 0xe0, 0x75, 0xab, 0x5d, 0xb5, 0x0e, 0xd4, 0x42, 0x22, 0xb6, 0x51, 0xac, 0x89, 0xd4, 0x3e, 0x4f, 0x9d, 0xdf, 0x85, 0x84, 0x25, 0x16, 0xb9, 0x9c, 0xfd, 0x71, 0x42, 0x74, 0x5d, 0xd7, 0xbb, 0x49, 0x5d, 0x91, 0x98, 0xce, 0xb9, 0xff, 0x0c, 0x7c, 0xd2, 0x89, 0x2a, 0x2a, 0xf6, 0xd9, 0x4a, 0xdd, 0xe1, 0x47, 0xae, 0xe1, 0x84, 0x95, 0x65, 0x19, 0x05, 0xdd, 0x70, 0x93, 0x06, 0xc7, 0x24, 0x5f, 0x2a, 0xff, 0xcf, 0xa2, 0xd5, 0xe7, 0x9e, 0xe6, 0x34, 0x89, 0xbe, 0xb4, 0x7e, 0xcf, 0xc2, 0x65, 0x79, 0xf6, 0x45, 0x35, 0x3f, 0x40, 0xd0, 0x99, 0x42, 0xe9, 0xfe, 0xd3, 0x8e, 0x5d, 0xdd, 0xc3, 0x4e, 0xa8, 0x98, 0x00, 0x92, 0x2e, 0x53, 0x27, 0x4f, 0x9c, 0x57, 0x73, 0xa7, 0x1e, 0x6f, 0x8e, 0x6b, 0xd3, 0x91, 0xa7, 0xdf, 0x7e, 0xc1, 0xc5, 0xbd, 0x7e, 0x33, 0x5b, 0x7c, 0x00, 0xb0, 0x1c, 0xd1, 0x73, 0x3a, 0x10, 0x77, 0x3c, 0xf3, 0xe8, 0x2c, 0xab, 0x3b, 0x8f, 0xfc, 0x2e, 0x19, 0x01, 0xc1, 0xc5, 0xdc, 0x60, 0xeb, 0xb6, 0x02, 0x45, 0x7d, 0x82, 0x58, 0x54, 0x58, 0x17, 0x63, 0x13, 0xbc, 0x47, 0xff, 0xfc, 0x0c, 0x79, 0x46, 0xd0, 0xd1, 0x9f, 0xb3, 0x2f, 0x02, 0x68, 0x87, 0x66, 0x83, 0xb6, 0x6c, 0x88, 0xeb, 0x52, 0x59, 0xc0, 0x8a, 0xdf, 0xb5, 0xe5, 0xab, 0x0c, 0xbf, 0x4f, 0x16, 0x0e, 0x2d, 0xe9, 0xd9, 0x4e, 0x13, 0x88, 0x48, 0x5e, 0x07, 0x7b, 0x43, 0x32, 0x83, 0x64, 0xb7, 0x8d, 0x8b, 0x46, 0x67, 0xb9, 0x8f, 0xde, 0xed, 0x7b, 0x92, 0x37, 0xfb, 0x46, 0x8c, 0x79, 0xe7, 0xaf, 0x0d, 0x01, 0x67, 0x21, 0x24, 0xb7, 0x99, 0xd2, 0x7f, 0x9c, 0x46, 0xf5, 0xd3, 0xa3, 0x67, 0x32, 0x7f, 0xc2, 0xe8, 0x53, 0x6c, 0x48, 0xad, 0x40, 0x37, 0x71, 0xd3, 0x2d, 0x92, 0x38, 0x38, 0x12, 0xe7, 0x6c, 0x3d, 0x5b, 0x3f, 0x06, 0xca, 0xe1, 0x63, 0xba, 0x93, 0x1a, 0x40, 0xcc, 0x9a, 0x8c, 0x90, 0x25, 0xf5, 0x88, 0xb7, 0xa6, 0xd2, 0x14, 0xeb, 0xbc, 0xb8, 0x29, 0x98, 0x35, 0x10, 0x1f, 0x03, 0x52, 0xe3, 0x65, 0x2d, 0x1d, 0xe5, 0x75, 0xfa, 0xfc, 0xb3, 0x07, 0x92, 0x87, 0x59, 0x85, 0x08, 0x97, 0x17, 0xc0, 0x3a, 0x9f, 0x65, 0xe1, 0xf8, 0x40, 0x34, 0xa2, 0x68, 0x17, 0x77, 0xbe, 0xa8, 0xda, 0xe2, 0xa5, 0xb6, 0xa3, 0xf1, 0x75, 0x8d, 0x8b, 0x2d, 0x26, 0x91, 0x7b, 0xab, 0x04, 0x2d, 0x3f, 0xd5, 0x63, 0xbb, 0xdc, 0x6c, 0x8e, 0xa4, 0x24, 0xce, 0x00, 0xc8, 0x87, 0x75, 0xd7, 0x20, 0x2c, 0xc1, 0x85, 0xa1, 0x41, 0xf7, 0xc9, 0x64, 0x8f, 0x89, 0xde, 0x05, 0x51, 0x98, 0xf2, 0x49, 0x46, 0xb7, 0xd9, 0x03, 0x05, 0xf2, 0x03, 0x38, 0x91, 0x0f, 0xab, 0x81, 0x2d, 0x13, 0x52, 0xb1, 0x71, 0x08, 0x6c, 0xb8, 0x9e, 0xfe, 0x59, 0xc7, 0x2f, 0x50, 0x96, 0xb5, 0xb0, 0x28, 0x35, 0xa2, 0xd3, 0x45, 0x8a, 0xda, 0xc1, 0xfc, 0x28, 0xfb, 0xae, 0x7d, 0x0c, 0x5b, 0xb0, 0x58, 0x17, 0xa4, 0xd1, 0x40, 0xc2, 0xc1, 0x63, 0x0e, 0x0d, 0xfe, 0x93, 0x09, 0xb8, 0x6a, 0x41, 0x64, 0xb6, 0x80, 0x0f, 0x08, 0xdf, 0x07, 0xb8, 0x94, 0xe5, 0x37, 0xa4, 0xa2, 0x89, 0x1d, 0xb9, 0x4d, 0x0e, 0x41, 0x73, 0xf0, 0xee, 0x85, 0x37, 0x2f, 0xcd, 0x50, 0xe4, 0x3c, 0xab, 0xec, 0xac, 0x53, 0x5d, 0x2d, 0x22, 0x87, 0x3e, 0x54, 0x93, 0xc1, 0x22, 0x32, 0x9a, 0x06, 0x8b, 0x91, 0xef, 0xf8, 0x20, 0xcf, 0x80, 0xa0, 0x5a, 0xcc, 0xc3, 0x6a, 0x81, 0x07, 0x4a, 0x71, 0xd7, 0x03, 0x98, 0xfd, 0x13, 0xf0, 0x33, 0x4a, 0x10, 0x87, 0xfa, 0x8c, 0xc7, 0x36, 0xb9, 0x2f, 0x7b, 0x7d, 0xfb, 0x63, 0x33, 0x98, 0x1f, 0xd8, 0x6d, 0x5e, 0xae, 0xc6, 0x11, 0x69, 0xec, 0x31, 0xa4, 0x77, 0xad, 0x6b, 0xbe, 0x10, 0x6a, 0xda, 0xbe, 0x69, 0x94, 0xfb, 0xbc, 0x89, 0x28, 0xa7, 0xbf, 0xaa, 0x84, 0x96, 0x30, 0xe2, 0x79, 0x21, 0x8f, 0x02, 0xa1, 0x4c, 0x65, 0xbf, 0xf3, 0x03, 0x7a, 0x0f, 0x94, 0xa4, 0x47, 0xd6, 0xf0, 0xbe, 0xae, 0xc2, 0x0a, 0x19, 0xe9, 0x73, 0x10, 0xf6, 0xc1, 0xe0, 0x33, 0x97, 0x00, 0xf6, 0xb6, 0x02, 0x28, 0x82, 0x44, 0x03, 0x65, 0x50, 0x86, 0x70, 0xc1, 0x94, 0xf5, 0xb0, 0x97, 0x8a, 0xed, 0x7e, 0x4a, 0x5a, 0x03, 0xeb, 0x36, 0x3e, 0x99, 0xa2, 0xe7, 0xe6, 0xb0, 0x70, 0x89, 0x1c, 0xfd, 0x04, 0xa0, 0xa4, 0x3e, 0xf3, 0xfa, 0x66, 0xce, 0xff, 0xe1, 0xcf, 0x77, 0x98, 0x95, 0x74, 0x88, 0xa3, 0xf9, 0xf8, 0x28, 0x7b, 0x8c, 0x30, 0xea, 0x35, 0x9b, 0x86, 0xa2, 0x29, 0xb5, 0x9b, 0x76, 0xad, 0x60, 0x31, 0x38, 0x24, 0x0a, 0x47, 0xf3, 0x38, 0x42, 0x85, 0xc3, 0x63, 0x28, 0xdb, 0xea, 0xb4, 0x22, 0x66, 0x21, 0xd0, 0xd1, 0x93, 0x2c, 0x37, 0x44, 0x86, 0xb1, 0xc8, 0x6b, 0xbd, 0x4a, 0x88, 0xce, 0xf0, 0xd9, 0x9f, 0x7e, 0x3c, 0x1c, 0xa3, 0x4c, 0x81, 0x81, 0x19, 0x3a, 0x09, 0x3b, 0x39, 0x2f, 0x6a, 0x95, 0xf2, 0xef, 0xad, 0x86, 0x2e, 0x49, 0xaf, 0x86, 0x57, 0x93, 0xc8, 0xa1, 0x1a, 0x53, 0xab, 0xca, 0x6b, 0x3f, 0x8d, 0x71, 0xc9, 0x68, 0x8a, 0x58, 0xc3, 0xb2, 0x44, 0xa2, 0xbb, 0x87, 0xcd, 0x2d, 0xea, 0xcc, 0xc7, 0x21, 0xa4, 0x14, 0xc9, 0xc9, 0xdd, 0x14, 0x05, 0xa2, 0xed, 0x58, 0x28, 0xb2, 0x90, 0x34, 0x82, 0x1b, 0x31, 0xfc, 0x67, 0xf0, 0x68, 0x77, 0xd5, 0x47, 0xc1, 0x92, 0x56, 0x90, 0xbf, 0x52, 0x28, 0x25, 0x20, 0x0c, 0x9c, 0x22, 0x63, 0xd8, 0xbc, 0x76, 0x88, 0x43, 0x30, 0x3a, 0x17, 0x44, 0x63, 0x42, 0x63, 0x72, 0xe1, 0xf2, 0x10, 0x73, 0x04, 0x53, 0xd3, 0xb8, 0xcf, 0x66, 0x79, 0x67, 0x1a, 0xb9, 0x2b, 0x99, 0xef, 0x37, 0xf0, 0xc6, 0x35, 0x44, 0x73, 0x7d, 0x8b, 0x0a, 0x07, 0x59, 0x77, 0x0d, 0xe8, 0x30, 0xc0, 0x06, 0xc3, 0x8d, 0x18, 0xee, 0x79, 0x61, 0xfe, 0x59, 0x21, 0xf5, 0xe3, 0x05, 0x4c, 0x23, 0x8c, 0xb3, 0x8c, 0xc6, 0xb7, 0x35, 0x37, 0x6f, 0x01, 0xc9, 0x68, 0x5a, 0x07, 0xa5, 0x47, 0xa0, 0xcc, 0xd3, 0x8a, 0xad, 0x5b, 0x3f, 0x3c, 0xf5, 0xad, 0x0f, 0xbd, 0xe3, 0xcc, 0x32, 0x0b, 0x12, 0x39, 0x3c, 0x3f, 0xc0, 0x8b, 0x71, 0x5b, 0x80, 0x5a, 0x1f, 0x42, 0x2e, 0x5b, 0x32, 0x08, 0x28, 0xcc, 0x02, 0x6c, 0xbb, 0x13, 0x6f, 0xa3, 0xdc, 0xa2, 0x30, 0x58, 0x19, 0x1d, 0x68, 0xf0, 0xcf, 0xbf, 0x7a, 0x12, 0x9c, 0xfa, 0x1f, 0x67, 0x17, 0x5d, 0xb6, 0x9e, 0xbf, 0xbb, 0xdb, 0xb4, 0x32, 0x8a, 0x3a, 0x72, 0xa0, 0x89, 0xa5, 0x37, 0x7e, 0xa6, 0x65, 0xf7, 0x7f, 0x1e, 0xce, 0x84, 0xc0, 0xe6, 0x17, 0x0c, 0x42, 0x4a, 0x68, 0xe3, 0x9e, 0xd4, 0x33, 0x83, 0xf4, 0x6f, 0xc8, 0xd2, 0x25, 0xcc, 0x24, 0xa3, 0x42, 0x05, 0x0a, 0x7e, 0x44, 0x80, 0x56, 0xa4, 0xfd, 0x17, 0x8d, 0x4e, 0x4e, 0x75, 0xb8, 0x36, 0x9b, 0xc3, 0x73, 0x58, 0x7c, 0x85, 0x41, 0xfa, 0xb5, 0xbe, 0x22, 0xea, 0x69, 0x5b, 0x68, 0x07, 0x8a, 0xce, 0xc6, 0x02, 0x94, 0xfa, 0xaa, 0x66, 0x7b, 0x4f, 0xcc, 0xd6, 0xe1, 0x36, 0x07, 0x96, 0x8d, 0xaf, 0x69, 0x4e, 0x19, 0x38, 0x86, 0x0a, 0xea, 0xf2, 0x11, 0x84, 0x66, 0xff, 0xad, 0xa6, 0x60, 0x2e, 0x00, 0x4b, 0xd7, 0xda, 0x09, 0x46, 0xe1, 0x0f, 0xb4, 0xa5, 0xe2, 0xef, 0xac, 0x37, 0x01, 0x54, 0x71, 0x4b, 0xdd, 0xb7, 0xaa, 0xbb, 0x7b, 0x51, 0xbc, 0x29, 0x84, 0x7f, 0x9b, 0x89, 0xad, 0x6b, 0xe1, 0xdf, 0x76, 0xe9, 0x1d, 0x4a, 0x17, 0x9f, 0x6d, 0x42, 0xb7, 0x69, 0x4f, 0x1e, 0xe0, 0xfc, 0xb4, 0xd9, 0x30, 0xc9, 0x56, 0x15, 0x51, 0x24, 0x4c, 0x60, 0x2b, 0xa5, 0xdb, 0xb7, 0x57, 0xce, 0x90, 0x48, 0xd7, 0xef, 0x8b, 0x7c, 0x05, 0x47, 0x1e, 0x35, 0xca, 0x6c, 0x97, 0x55, 0x10, 0xed, 0x59, 0x7f, 0x7a, 0x35, 0x32, 0x21, 0x52, 0xb2, 0xe8, 0xb2, 0xc3, 0x37, 0x15, 0x38, 0x48, 0x9f, 0x35, 0x0e, 0x64, 0xb4, 0xfe, 0xe4, 0x94, 0x4f, 0xf0, 0x07, 0x82, 0xc0, 0x2c, 0xe3, 0x7b, 0x6f, 0x89, 0xc6, 0x23, 0xc4, 0xe5, 0xe6, 0x67, 0x45, 0xb9, 0xa6, 0xb4, 0xfe, 0xf0, 0x15, 0x66, 0x26, 0xfa, 0xb7, 0x84, 0xff, 0x1c, 0x89, 0xaa, 0xfe, 0x0a, 0x3f, 0x46, 0x2c, 0xb7, 0xd0, 0x07, 0xcc, 0x6c, 0x34, 0x93, 0x3e, 0x18, 0x6c, 0x79, 0x23, 0xe7, 0xc4, 0x66, 0xc2, 0x15, 0x55, 0x9b, 0xab, 0x05, 0xcd, 0x9e, 0x99, 0x8d, 0x73, 0x30, 0x9d, 0x94, 0x65, 0x80, 0x79, 0xe0, 0x24, 0x9e, 0x4a, 0x29, 0x53, 0x32, 0x6b, 0x72, 0xbc, 0x6e, 0x95, 0x99, 0x94, 0x41, 0x4b, 0x2c, 0x00, 0xce, 0x75, 0x7e, 0xd8, 0x1c, 0x4b, 0xfa, 0xaa, 0x0f, 0x74, 0xb8, 0x02, 0x97, 0x6f, 0x4e, 0xe8, 0x27, 0x33, 0xe9, 0xab, 0x69, 0x12, 0x9c, 0xdd, 0x30, 0xe3, 0xf7, 0x9f, 0xae, 0x60, 0xdc, 0x1f, 0xe7, 0xcd, 0x8e, 0x5e, 0x65, 0xdb, 0x0b, 0x37, 0x2d, 0xcb, 0x9c, 0x9d, 0xf3, 0xd6, 0xaa, 0x24, 0x8a, 0xcd, 0xd3, 0xc2, 0x9e, 0xfd, 0x3d, 0xd7, 0xa5, 0x55, 0x2a, 0x6c, 0x13, 0xcb, 0xcd, 0xb8, 0xcd, 0xfb, 0x5d, 0xe9, 0xe1, 0x11, 0x67, 0x21, 0x74, 0xea, 0x68, 0xbe, 0xfc, 0x76, 0x9b, 0xde, 0xaf, 0x61, 0x10, 0x22, 0x3a, 0xf2, 0xfe, 0xb3, 0xb7, 0x33, 0x5a, 0x83, 0xd9, 0x52, 0xa8, 0xd6, 0x6a, 0x47, 0x12, 0x00, 0xf8, 0xb7, 0xb7, 0x70, 0xcb, 0x18, 0x45, 0xed, 0x1a, 0x17, 0xca, 0x20, 0x7e, 0x36, 0xc7, 0x53, 0xa6, 0xba, 0x87, 0x78, 0x4d, 0xc4, 0xae, 0x6d, 0x69, 0xbe, 0x15, 0x7e, 0xa5, 0xf8, 0xd5, 0x2c, 0x12, 0x93, 0xa2, 0x2c, 0x19, 0x9f, 0x5b, 0xb3, 0xb5, 0x80, 0xde, 0xf1, 0xdf, 0x96, 0x21, 0xdb, 0x49, 0x1d, 0x7f, 0x2e, 0x4e, 0x51, 0x4f, 0xb1, 0x29, 0xd6, 0xbb, 0xba, 0x66, 0x58, 0xd0, 0xf3, 0x97, 0x6f, 0xd1, 0x5e, 0x48, 0xc5, 0xd1, 0x97, 0x35, 0x7a, 0x80, 0x5a, 0xba, 0xc7, 0x46, 0x44, 0x8a, 0xe2, 0x8e, 0xde, 0xa4, 0x22, 0x65, 0xd7, 0x83, 0x64, 0x43, 0x91, 0x95, 0xad, 0x28, 0xe0, 0xef, 0x11, 0xeb, 0x0e, 0x3f, 0xd3, 0xcf, 0x22, 0x02, 0xcd, 0x58, 0x61, 0xf7, 0x12, 0x5d, 0x16, 0xd3, 0xd3, 0x5d, 0x8f, 0x36, 0x7f, 0x17, 0x68, 0xde, 0x2e, 0x54, 0x0c, 0x1b, 0x40, 0x08, 0x78, 0x82, 0x41, 0x99, 0x42, 0xe6, 0x10, 0x7f, 0xda, 0x84, 0x41, 0x0d, 0x11, 0x7e, 0xbf, 0x8e, 0xd7, 0x8b, 0xb6, 0x94, 0x49, 0xec, 0xb0, 0x8d, 0xeb, 0xa2, 0xfe, 0x97, 0x31, 0xde, 0x59, 0x96, 0x45, 0xb9, 0xc9, 0x83, 0x04, 0x25, 0xc6, 0x07, 0x49, 0x23, 0x9d, 0x48, 0x6f, 0x37, 0x16, 0x03, 0x11, 0x19, 0x54, 0xdb, 0x14, 0xae, 0xfc, 0xf0, 0xe8, 0x36, 0x9a, 0xb4, 0x0a, 0xc7, 0x40, 0xfa, 0xce, 0xfa, 0x70, 0x50, 0x5b, 0xe4, 0x3b, 0x8f, 0xf7, 0x48, 0xab, 0xb0, 0x85, 0x0a, 0x5f, 0xe1, 0x4b, 0xe7, 0x75, 0xd8, 0xf9, 0x64, 0xad, 0x68, 0xe7, 0x04, 0xca, 0x52, 0x9f, 0xbe, 0x3c, 0x5d, 0x9b, 0xae, 0xfd, 0xa9, 0x50, 0x0b, 0xb9, 0x40, 0x6b, 0x59, 0x31, 0xee, 0x5a, 0xe0, 0xe1, 0x53, 0x0e, 0x5c, 0xe0, 0x36, 0xff, 0xf6, 0x09, 0x1c, 0x71, 0x73, 0x58, 0x19, 0xf6, 0xac, 0x96, 0xe7, 0x35, 0x3e, 0x39, 0x35, 0xe9, 0x82, 0x86, 0x41, 0x2d, 0xc0, 0xf8, 0xa9, 0xf6, 0x9f, 0xe5, 0x7f, 0xe1, 0xe0, 0x5f, 0x9b, 0x2f, 0x4c, 0x59, 0x35, 0x0d, 0xeb, 0x0a, 0xb3, 0x19, 0x77, 0x97, 0xbf, 0x23, 0x10, 0xec, 0x9d, 0x30, 0x31, 0xea, 0xbb, 0xc5, 0xe3, 0xc8, 0x8a, 0x62, 0x31, 0xb3, 0x8d, 0x4c, 0xdb, 0xb8, 0xb0, 0x8f, 0x4f, 0xe4, 0xda, 0x44, 0xd4, 0xaa, 0xc5, 0x10, 0x09, 0x84, 0x0e, 0xed, 0x8e, 0xdd, 0x88, 0x2d, 0x01, 0x2f, 0xd6, 0xbc, 0x2c, 0x69, 0x39, 0xa5, 0x7c, 0x93, 0xa6, 0xd7, 0xb5, 0xb4, 0x1c, 0x2a, 0xe5, 0xf4, 0x34, 0x9d, 0x97, 0xfe, 0xfa, 0xe1, 0x48, 0xa8, 0xfb, 0x1c, 0x1f, 0xd6, 0x9f, 0xe7, 0xd8, 0x9b, 0xb9, 0x98, 0x02, 0xa2, 0x5d, 0xc7, 0x6a, 0xcd, 0xf2, 0x0b, 0xd7, 0x1b, 0x87, 0x05, 0xf7, 0xcf, 0x6b, 0xa0, 0x9a, 0xcf, 0xf7, 0x96, 0x1e, 0x4a, 0xaf, 0x37, 0x2a, 0x9d, 0x8a, 0x66, 0xa0, 0x78, 0x8d, 0xe4, 0xcc, 0x3c, 0x9e, 0xd1, 0xe2, 0xa8, 0x98, 0x6f, 0xa7, 0xb5, 0x9b, 0x2a, 0x6e, 0xbe, 0xa6, 0xd5, 0x46, 0xe4, 0x67, 0x37, 0x72, 0xb1, 0x51, 0xc6, 0x19, 0xfc, 0xf0, 0xb2, 0x3f, 0x0c, 0x79, 0x25, 0xf4, 0x00, 0xa6, 0xca, 0xcb, 0x6d, 0xc0, 0x8c, 0x8e, 0x4a, 0xfd, 0xa0, 0x30, 0x09, 0x0d, 0xc5, 0x03, 0x07, 0xf0, 0xca, 0x2b, 0x26, 0x0a, 0x51, 0x53, 0xb8, 0x79, 0xd4, 0x9f, 0xa0, 0xa6, 0xe5, 0xe1, 0xb3, 0x1a, 0xba, 0x0f, 0x65, 0x94, 0xe8, 0xf5, 0xa1, 0x58, 0x6f, 0x27, 0xf8, 0xc9, 0xf7, 0x3a, 0xfe, 0x3a, 0x59, 0x33, 0xf1, 0x02, 0x61, 0x40, 0x9c, 0xce, 0xd3, 0xa6, 0x7b, 0x3c, 0xab, 0xfb, 0x20, 0xa5, 0xa9, 0x95, 0xd5, 0x39, 0x0d, 0x42, 0x83, 0x52, 0xa0, 0x39, 0xd3, 0x02, 0xf3, 0x51, 0x92, 0xee, 0xeb, 0x71, 0x5a, 0x60, 0x7d, 0x48, 0x6f, 0x97, 0xb7, 0x3e, 0xe7, 0x62, 0x00, 0xaa, 0x0e, 0xed, 0xa0, 0x45, 0x08, 0xda, 0x83, 0xdf, 0xb8, 0x93, 0x39, 0x50, 0xe1, 0xdf, 0x42, 0xb2, 0x8b, 0xb4, 0x89, 0xcd, 0xa9, 0x4d, 0x2e, 0xd3, 0xf8, 0x7b, 0x88, 0x4e, 0x2a, 0x40, 0x6b, 0x56, 0x44, 0x9a, 0xa6, 0x07, 0x45, 0x9d, 0xd0, 0x32, 0x08, 0xc4, 0x45, 0x53, 0x6b, 0x89, 0x6b, 0xc3, 0xb1, 0x33, 0x3a, 0x2f, 0x25, 0xf0, 0xfb, 0x49, 0x00, 0x23, 0x4f, 0xbd, 0x8d, 0xff, 0x74, 0x67, 0x8b, 0x55, 0xc4, 0xc3, 0xd3, 0xaa, 0x7e, 0xa5, 0x3b, 0x8d, 0xc9, 0x2a, 0xb9, 0x28, 0xf6, 0xee, 0xcc, 0x14, 0x06, 0x7f, 0x17, 0x72, 0x6c, 0x12, 0x4f, 0x37, 0x14, 0x75, 0x58, 0xc7, 0xa3, 0x45, 0xab, 0xc6, 0x01, 0x61, 0xfb, 0x2a, 0x15, 0x9e, 0x18, 0x95, 0xcf, 0xbd, 0x13, 0xe3, 0x6c, 0x9a, 0xa3, 0xfe, 0xf5, 0xa5, 0xc7, 0xfa, 0x09, 0x96, 0xad, 0x5e, 0xdd, 0x5d, 0xd3, 0xbf, 0x81, 0x58, 0x6c, 0x94, 0x65, 0xc9, 0x05 ],
+    const [ 0x9e, 0xd1, 0xf4, 0x04, 0x5d, 0xe7, 0xf9, 0x65, 0x2a, 0xf2, 0xc6, 0x72, 0xe2, 0x65, 0xd3, 0x57, 0x57, 0xe1, 0x11, 0xca, 0xae, 0x03, 0x73, 0x89, 0x06, 0x81, 0xad, 0x04, 0x5b, 0x75, 0x3c, 0x56, 0xa9, 0xf8, 0xa6, 0x7a, 0x54, 0xf3, 0x03, 0xbc, 0xc7, 0x32, 0xbc, 0x6d, 0x5b, 0xba, 0x93, 0xdb, 0x7b, 0x5d, 0xe3, 0x81, 0x07, 0x8b, 0x29, 0x7a, 0xf5, 0x6b, 0xc4, 0x3c, 0x3e, 0x2a, 0xf9, 0x82, 0xf8, 0x94, 0x3a, 0x8a, 0xbf, 0xe1, 0xa8, 0x81, 0x5a, 0xd1, 0xd6, 0x3c, 0x9c, 0xfb, 0xd0, 0x28, 0x87, 0x61, 0x5c, 0x84, 0xb8, 0x49, 0x7f, 0xcd, 0xff, 0x48, 0x43, 0x7a, 0x4d, 0xa0, 0xb8, 0xea, 0xd3, 0xcc, 0x39, 0x9b, 0x68, 0x58, 0xf0, 0x9c, 0x2b, 0xf6, 0x9d, 0x45, 0x6a, 0xcf, 0x92, 0x25, 0xc3, 0x17, 0x02, 0x3c, 0x89, 0xe4, 0x7c, 0x6a, 0x6a, 0x40, 0xb3, 0x28, 0x4e, 0x7c, 0x80, 0x76, 0x81, 0xc8, 0x2a, 0x14, 0x15, 0x01, 0xe4, 0xf5, 0x82, 0xca, 0x97, 0xf1, 0x90, 0xde, 0xe2, 0xba, 0x77, 0xa5, 0x60, 0x11, 0x44, 0x05, 0x29, 0x3a, 0x7e, 0x7a, 0x9b, 0xad, 0x0a, 0x69, 0x5a, 0x0e, 0x4c, 0xb1, 0x95, 0x5f, 0x8f, 0x84, 0x8b, 0x75, 0xa7, 0x75, 0x4e, 0xa8, 0xd4, 0xd1, 0xc7, 0xcf, 0xea, 0x33, 0xfb, 0x6c, 0xaf, 0x53, 0x8c, 0x23, 0x85, 0x1f, 0x83, 0x71, 0x49, 0x0d, 0x4c, 0x9a, 0x7a, 0xaf, 0x02, 0xe3, 0x9e, 0x88, 0xee, 0x02, 0xe1, 0x1e, 0x4a, 0xd3, 0x00, 0x50, 0x4a, 0x4c, 0x65, 0xea, 0x5d, 0xb3, 0x94, 0x77, 0xb0, 0x0e, 0xc5, 0x56, 0xf3, 0xdc, 0xd2, 0x10, 0x61, 0x02, 0x54, 0xe9, 0xfa, 0x08, 0x09, 0xb5, 0x13, 0x85, 0x7a, 0xed, 0x11, 0xd8, 0xda, 0x02, 0x72, 0x19, 0x30, 0xf1, 0x0d, 0x50, 0xb9, 0x18, 0x9a, 0xe4, 0x87, 0x48, 0x74, 0x56, 0x6f, 0x1b, 0x9e, 0x2e, 0x22, 0x88, 0x04, 0x36, 0x9a, 0xb4, 0x04, 0xe7, 0xb8, 0x0b, 0x2d, 0x21, 0x2b, 0x90, 0x47, 0x1f, 0x93, 0x71, 0x93, 0xa9, 0xe6, 0xdf, 0x54, 0x8b, 0x13, 0x1c, 0x8d, 0x47, 0xe6, 0xd6, 0x0d, 0x07, 0x2c, 0xb3, 0xa9, 0xd5, 0x17, 0x2d, 0xc9, 0x0e, 0xe4, 0xa0, 0x26, 0x14, 0xba, 0xa1, 0xd1, 0x44, 0xd6, 0x92, 0x78, 0x28, 0xe5, 0x73, 0xe5, 0xed, 0xb1, 0xfb, 0xc7, 0x17, 0x00, 0xe8, 0xb5, 0x73, 0xb9, 0x93, 0x70, 0x4d, 0x49, 0xc7, 0x68, 0xe4, 0x45, 0xd3, 0x82, 0x1b, 0x51, 0xde, 0x19, 0x71, 0x40, 0x7b, 0x43, 0x33, 0x7d, 0x7e, 0x55, 0xf1, 0xa9, 0x0d, 0xa9, 0x2e, 0x85, 0xfa, 0x9e, 0x5b, 0x13, 0x50, 0xe1, 0x07, 0xf8, 0x2b, 0xeb, 0x50, 0x25, 0xcd, 0xcb, 0x9d, 0xb6, 0xef, 0x26, 0x8f, 0x1a, 0x55, 0x7c, 0x34, 0x75, 0xa5, 0xac, 0x7e, 0x42, 0x79, 0xbb, 0xf4, 0x3d, 0xb3, 0xd1, 0xa8, 0x80, 0x11, 0x84, 0x69, 0xec, 0x01, 0x59, 0x39, 0xca, 0xb6, 0x88, 0x02, 0xb2, 0x7b, 0x00, 0x84, 0xac, 0x47, 0xab, 0x92, 0x96, 0x92, 0xf3, 0x7e, 0xc6, 0x68, 0x85, 0xd2, 0xf0, 0xbc, 0x55, 0x40, 0x49, 0xfe, 0xe2, 0xdc, 0xec, 0xf0, 0xbb, 0x89, 0x7d, 0xb5, 0x42, 0xb1, 0x0d, 0x2a, 0xb0, 0x3a, 0x3e, 0x7a, 0x59, 0xb5, 0xa8, 0xed, 0x32, 0xd8, 0x7b, 0x01, 0x90, 0x2e, 0x65, 0xbc, 0x32, 0x0d, 0xb6, 0x40, 0x82, 0xc9, 0xc2, 0xa0, 0x18, 0x27, 0x86, 0xf2, 0x80, 0x14, 0x8f, 0xa6, 0x3d, 0x97, 0x18, 0x16, 0x0d, 0x05, 0x73, 0x5d, 0x6f, 0x74, 0xaa, 0x6d, 0x63, 0x71, 0x65, 0x5c, 0x71, 0xf6, 0x0e, 0xff, 0xec, 0x96, 0x34, 0xba, 0x78, 0xfb, 0x2d, 0x96, 0xca, 0x92, 0x00, 0x94, 0xaf, 0x85, 0x82, 0x42, 0x50, 0xea, 0xbe, 0x8b, 0xb4, 0x3a, 0x9a, 0xd3, 0x86, 0x04, 0xb8, 0x44, 0x19, 0xe2, 0x9b, 0x62, 0xa9, 0xad, 0x0b, 0xe6, 0xe4, 0xed, 0xba, 0xc9, 0xa8, 0x93, 0x27, 0x9f, 0x0f, 0xeb, 0xc3, 0x26, 0xa9, 0xcc, 0x53, 0x1f, 0x08, 0x12, 0x95, 0x5c, 0x82, 0x4d, 0x26, 0x1b, 0x32, 0xbb, 0xa3, 0x92, 0x40, 0x74, 0x0e, 0xcb, 0x62, 0xe5, 0x74, 0xb2, 0xa3, 0x7f, 0xcd, 0x6d, 0x64, 0xb0, 0x24, 0xeb, 0xa0, 0x13, 0xf8, 0xc0, 0x74, 0xe4, 0xe1, 0x30, 0xde, 0xb6, 0x77, 0x89, 0xc5, 0x68, 0x6f, 0xb7, 0x39, 0x55, 0x07, 0x12, 0xfd, 0xcb, 0xa5, 0x7a, 0x42, 0xbf, 0xba, 0xa6, 0xb6, 0xbe, 0xed, 0xb9, 0xbd, 0x27, 0x76, 0x16, 0xfe, 0x98, 0xc7, 0x76, 0x22, 0xa6, 0x72, 0x38, 0xd8, 0xd1, 0x47, 0xf8, 0x1d, 0xb6, 0xbc, 0x62, 0xba, 0x87, 0x93, 0x48, 0x0e, 0xb9, 0xb6, 0xf3, 0x0d, 0xfc, 0x66, 0xb7, 0x89, 0x70, 0x94, 0xca, 0xb1, 0x16, 0x8f, 0x57, 0xd7, 0x85, 0xe0, 0xcd, 0x76, 0xde, 0x72, 0x7d, 0x73, 0x01, 0xf7, 0x64, 0xa3, 0x01, 0x86, 0x45, 0x8e, 0xd6, 0x89, 0xfc, 0x72, 0x52, 0xd6, 0x0e, 0x8b, 0x57, 0x1c, 0x84, 0x92, 0x46, 0x81, 0xfa, 0x84, 0xba, 0x89, 0xf3, 0xa4, 0x77, 0x3a, 0x6f, 0xc3, 0x9d, 0x7e, 0xc0, 0xbf, 0x22, 0xc8, 0x99, 0x4a, 0x7e, 0xfa, 0x68, 0xec, 0xa8, 0x87, 0xe5, 0x4b, 0x42, 0xd4, 0xeb, 0xab, 0x10, 0xe5, 0x88, 0xb1, 0xaf, 0x35, 0x50, 0x6c, 0x84, 0xe5, 0xf6, 0x96, 0xf2, 0x19, 0x1d, 0x16, 0xd0, 0xa0, 0x6b, 0xca, 0x1a, 0xd3, 0xdf, 0x84, 0xe6, 0xbf, 0x65, 0x52, 0x9a, 0x86, 0xa8, 0x03, 0x5d, 0x02, 0x28, 0xe6, 0xcb, 0xac, 0x8c, 0xd5, 0xed, 0xbc, 0x39, 0x72, 0x68, 0x92, 0x23, 0xb1, 0xf4, 0x55, 0xe3, 0x97, 0x10, 0xda, 0x0b, 0x41, 0xf5, 0xc7, 0xb6, 0x27, 0xc8, 0xf8, 0x63, 0xa2, 0x13, 0x21, 0x03, 0xac, 0x76, 0xb5, 0x50, 0xe7, 0x9a, 0x07, 0x61, 0xe2, 0x67, 0xb0, 0x7b, 0x97, 0x77, 0x30, 0x2b, 0x38, 0xca, 0xd8, 0x91, 0x2b, 0xbb, 0xe7, 0xff, 0x53, 0x32, 0xf3, 0xc3, 0x91, 0x1c, 0x8a, 0x40, 0x8a, 0x18, 0x1a, 0x44, 0xab, 0x73, 0x0e, 0x95, 0x6b, 0x57, 0x3a, 0xcd, 0xd0, 0x3f, 0x79, 0x68, 0x35, 0xae, 0x94, 0x1c, 0x4a, 0x21, 0x66, 0x69, 0x5c, 0x42, 0x3e, 0x70, 0xd7, 0x5e, 0x85, 0x08, 0x09, 0x19, 0xa1, 0x0f, 0x28, 0x61, 0x18, 0xfe, 0x97, 0xa0, 0xf9, 0xc0, 0x65, 0x36, 0x78, 0xc5, 0x17, 0x26, 0xd8, 0x52, 0xa7, 0x0f, 0x8e, 0x1b, 0xcc, 0x5f, 0xa3, 0x13, 0x7c, 0xc3, 0x5a, 0x83, 0xaf, 0xe2, 0x13, 0x59, 0x67, 0x4a, 0x6f, 0xc3, 0xed, 0xaa, 0xb5, 0xfd, 0x5d, 0x43, 0x74, 0x68, 0x64, 0x99, 0x6a, 0xdb, 0x49, 0x6e, 0xa5, 0x3d, 0x2a, 0xf0, 0xe8, 0x54, 0x89, 0x32, 0x50, 0xd8, 0x07, 0xd9, 0x37, 0xcc, 0x6e, 0x18, 0x59, 0x0e, 0xf5, 0xde, 0x35, 0x2c, 0xc0, 0x4d, 0xb7, 0x79, 0xa7, 0x6f, 0x13, 0x60, 0x38, 0x24, 0xf4, 0xf9, 0xff, 0x5f, 0xd6, 0xda, 0x05, 0x92, 0xb0, 0x30, 0x96, 0x67, 0xd7, 0x0e, 0x47, 0xb1, 0x1f, 0x04, 0x38, 0xa2, 0x43, 0xf4, 0x97, 0x3e, 0x87, 0x21, 0x65, 0x0f, 0x9b, 0x89, 0x7d, 0x1b, 0xc3, 0x75, 0xd2, 0x13, 0x35, 0x4e, 0xf8, 0xcd, 0xc2, 0xb2, 0xe6, 0xf4, 0xb9, 0xc7, 0xfa, 0xff, 0x09, 0xcf, 0x3d, 0x5f, 0xa5, 0xfd, 0xe9, 0xfd, 0x2d, 0x87, 0x28, 0xe3, 0xca, 0xfd, 0x1f, 0x39, 0x5a, 0xd9, 0x2b, 0x74, 0xcd, 0x57, 0x6a, 0xca, 0xce, 0x87, 0x7e, 0xe9, 0xa6, 0xa0, 0x8d, 0xe8, 0x5e, 0x97, 0x8c, 0x7e, 0x24, 0xf0, 0xbe, 0x72, 0xf1, 0xd5, 0x77, 0x52, 0x68, 0x65, 0x26, 0x68, 0x00, 0x4e, 0x92, 0xea, 0x65, 0x9e, 0x64, 0x71, 0x1c, 0xd6, 0xe6, 0xac, 0x66, 0x40, 0x0a, 0x56, 0x68, 0x83, 0xae, 0x65, 0x88, 0x75, 0x1e, 0x85, 0x1a, 0x30, 0xdb, 0xc4, 0x3c, 0x68, 0x9b, 0x8f, 0xfe, 0xfc, 0x90, 0xdd, 0xc7, 0xca, 0xed, 0xaa, 0xf4, 0xc8, 0xa7, 0xa7, 0xc1, 0x51, 0x78, 0x30, 0x6d, 0xbc, 0x2a, 0x7e, 0x99, 0x33, 0x12, 0x1e, 0xf2, 0xc2, 0xdb, 0xa1, 0x0f, 0xaf, 0x85, 0x96, 0x9c, 0x0a, 0xac, 0xb5, 0xb9, 0x84, 0x0e, 0x5d, 0x9d, 0x85, 0x48, 0x41, 0x7f, 0x78, 0xe0, 0x5e, 0xb6, 0x6a, 0x88, 0x30, 0x1f, 0xd3, 0xa1, 0x25, 0xbf, 0xb3, 0xff, 0x52, 0xa9, 0xe1, 0xec, 0x64, 0x22, 0xa0, 0x6f, 0xda, 0x04, 0x74, 0xce, 0x72, 0x60, 0x34, 0x51, 0xe1, 0x67, 0x5f, 0x49, 0xc7, 0x8b, 0xb3, 0x51, 0xe2, 0xe1, 0xfc, 0xd4, 0x82, 0xca, 0x2b, 0xcf, 0x3d, 0xd2, 0xa7, 0xd8, 0xe3, 0xd8, 0xe8, 0x60, 0xb5, 0x70, 0x41, 0x35, 0xd1, 0x85, 0xfd, 0x4a, 0xf1, 0x43, 0xae, 0xbb, 0x55, 0x33, 0xc2, 0x0c, 0xfe, 0xa8, 0x57, 0xb2, 0x1d, 0x5b, 0x51, 0xd4, 0xcb, 0x52, 0xa9, 0x52, 0xfa, 0x06, 0x07, 0x07, 0xac, 0xc4, 0x94, 0x4b, 0x63, 0x54, 0x09, 0xbc, 0xd8, 0xd9, 0x0d, 0x3f, 0xef, 0xf8, 0xbd, 0x41, 0xeb, 0x3c, 0x8c, 0x43, 0xde, 0xb9, 0x4d, 0x95, 0x64, 0xf0, 0x8e, 0x61, 0x91, 0xf3, 0x28, 0xec, 0x28, 0xca, 0x14, 0x19, 0x0e, 0x14, 0x80, 0x2f, 0xfe, 0xf1, 0x22, 0xdb, 0x7d, 0x20, 0xcd, 0x79, 0x11, 0x65, 0x42, 0x8f, 0xae, 0x2e, 0x48, 0x9a, 0x71, 0x75, 0xff, 0x0e, 0x91, 0xe8, 0x71, 0x98, 0x92, 0x48, 0x6a, 0xa6, 0xbb, 0x0f, 0x8a, 0x29, 0xcb, 0x55, 0x98, 0x99, 0xe8, 0xf4, 0x19, 0x3a, 0xd8, 0xeb, 0x21, 0x9f, 0x73, 0x00, 0x6a, 0x6c, 0x58, 0xaa, 0xa3, 0x60, 0xe0, 0x2d, 0x0a, 0x92, 0x50, 0x07, 0x3d, 0xfa, 0x53, 0x8b, 0x4d, 0x34, 0xa7, 0xcc, 0x15, 0x81, 0x16, 0xbc, 0xca, 0x0f, 0xa8, 0x95, 0xd3, 0x7a, 0x17, 0x78, 0xda, 0x92, 0x83, 0x54, 0x23, 0x5f, 0x67, 0x0a, 0x1c, 0x62, 0xcc, 0xcf, 0x36, 0x1e, 0xbc, 0xd1, 0xf4, 0xd7, 0xfa, 0x1d, 0x41, 0x9a, 0xf0, 0xc0, 0x07, 0x7d, 0xe9, 0x2c, 0xfd, 0x28, 0x80, 0xde, 0xc1, 0x94, 0x58, 0x3e, 0x26, 0x13, 0x0e, 0xc7, 0xcf, 0x91, 0x6c, 0x67, 0xfd, 0x19, 0xe0, 0x29, 0xa5, 0x9b, 0x2c, 0x11, 0xc6, 0xec, 0x5e, 0x47, 0xf9, 0x0e, 0x03, 0x79, 0x4a, 0xb2, 0x98, 0x7a, 0x46, 0xfb, 0x41, 0x2f, 0x55, 0x85, 0xbe, 0xab, 0x4a, 0xa6, 0x9a, 0x99, 0x39, 0xf3, 0xa5, 0xda, 0x88, 0x06, 0xa5, 0x70, 0x49, 0x7f, 0x49, 0x9b, 0xc7, 0x49, 0x5e, 0x41, 0x5f, 0x1f, 0x45, 0x93, 0x92, 0x4e, 0xa5, 0xee, 0x58, 0xbc, 0x5d, 0xff, 0xb6, 0x29, 0xbd, 0x2b, 0x92, 0xb5, 0xf5, 0x2e, 0xc7, 0xa2, 0xcd, 0x02, 0x75, 0x5c, 0x97, 0x02, 0x9a, 0xb6, 0x62, 0x4f, 0xe7, 0x77, 0x71, 0x73, 0xcc, 0x15, 0xec, 0x44, 0xd6, 0xc0, 0xd4, 0x0b, 0x3a, 0xa2, 0x3c, 0xe6, 0xb2, 0x66, 0xb7, 0x6b, 0x87, 0xf7, 0x0d, 0x8e, 0xef, 0x8a, 0x32, 0xc5, 0x9a, 0xde, 0x78, 0x6a, 0x88, 0xc2, 0x03, 0x60, 0x1d, 0xd9, 0x7d, 0xf9, 0x77, 0x9a, 0x0c, 0x17, 0xff, 0x9a, 0x81, 0x92, 0x3e, 0x0e, 0xd3, 0xda, 0xf3, 0x8b, 0xcb, 0xde, 0x62, 0x11, 0x00, 0x2c, 0xee, 0x48, 0x06, 0x59, 0xea, 0x09, 0xe3, 0xa3, 0xad, 0x20, 0xc2, 0xd5, 0xe4, 0x51, 0xec, 0x6b, 0x2d, 0x99, 0xf3, 0xf7, 0xe1, 0xb5, 0x30, 0xc3, 0x30, 0xe9, 0x70, 0xb8, 0x74, 0xfa, 0xeb, 0x7e, 0xbf, 0x7c, 0x76, 0xe5, 0xb6, 0x54, 0xf9, 0x84, 0xa3, 0x75, 0x22, 0xa0, 0xc5, 0xed, 0x5b, 0x4f, 0xeb, 0x25, 0xfa, 0xdc, 0x41, 0x64, 0xb8, 0x6e, 0x69, 0x96, 0x65, 0xe5, 0xcd, 0x4c, 0xda, 0x05, 0x34, 0x03, 0x2e, 0xd6, 0x94, 0xa9, 0x2d, 0x4a, 0x27, 0x5d, 0x05, 0x21, 0xc1, 0x77, 0x43, 0x0a, 0x61, 0xc8, 0xfe, 0x0b, 0x06, 0x23, 0x52, 0x22, 0xc4, 0x1b, 0x11, 0x2d, 0x16, 0x0f, 0xb4, 0x07, 0x76, 0x64, 0x98, 0xf4, 0x2b, 0x12, 0x67, 0x3f, 0x63, 0x62, 0xd3, 0x21, 0x81, 0xf6, 0x8b, 0xe5, 0xb8, 0x09, 0x67, 0x4a, 0xd9, 0xf8, 0xe6, 0x29, 0x69, 0x01, 0xdb, 0x57, 0xf7, 0x4b, 0x63, 0xcd, 0xac, 0x27, 0x1a, 0x06, 0x24, 0x96, 0x8f, 0xa9, 0x7c, 0x0b, 0xf5, 0x68, 0xad, 0x72, 0x1b, 0x28, 0x18, 0x70, 0x9e, 0x62, 0x62, 0xed, 0x5d, 0xc9, 0x81, 0xd0, 0x2d, 0x2d, 0x17, 0x09, 0xce, 0x9f, 0xff, 0xd5, 0x1e, 0xd6, 0x26, 0x3d, 0x8d, 0xd1, 0x9d, 0xe0, 0xd1, 0xbe, 0xec, 0xf3, 0xdb, 0x1b, 0xa8, 0x86, 0x09, 0x1b, 0x48, 0x09, 0x9d, 0x4b, 0x34, 0x0e, 0x6e, 0x75, 0x1f, 0x51, 0xdd, 0xc4, 0x97, 0xf5, 0x0b, 0x2a, 0xda, 0x10, 0x49, 0xff, 0xec, 0x6a, 0xd0, 0xeb, 0xe6, 0x82, 0xb3, 0x05, 0x91, 0xd2, 0x11, 0x3c, 0x33, 0x54, 0x8f, 0xf7, 0xa9, 0x45, 0x05, 0xf8, 0xb6, 0x29, 0x78, 0x86, 0x9b, 0x0f, 0x49, 0xcb, 0xe8, 0x16, 0xab, 0x7b, 0x91, 0x30, 0x5a, 0xb6, 0x44, 0x26, 0x8b, 0x30, 0xfa, 0xdd, 0x1e, 0x8f, 0xcd, 0xd7, 0x1b, 0x14, 0x09, 0xfc, 0x5c, 0x7e, 0x85, 0x9b, 0x87, 0x2b, 0x34, 0xac, 0x40, 0x81, 0xf7, 0x58, 0x9c, 0x8c, 0xb5, 0xbb, 0xd8, 0xe8, 0xae, 0xe8, 0x4b, 0xe2, 0x0c, 0x2d, 0x99, 0xda, 0xbb, 0x99, 0x2a, 0xec, 0x7b, 0xbc, 0xda, 0xcf, 0x34, 0xae, 0xf2, 0xfc, 0x89, 0x53, 0x58, 0x13, 0xaf, 0xdc, 0x02, 0x7b, 0x80, 0x91, 0xb0, 0x49, 0xcb, 0xce, 0xdb, 0x64, 0xef, 0x4c, 0xe8, 0xe6, 0xa8, 0xa2, 0xa2, 0xc5, 0x28, 0x0c, 0xe7, 0xb2, 0x6a, 0x6a, 0xa1, 0x41, 0xc3, 0x8c, 0xf9, 0x4b, 0xba, 0xac, 0xc7, 0x91, 0x19, 0x3c, 0x4c, 0xa1, 0x44, 0xe3, 0x23, 0xfe, 0xca, 0xc2, 0x75, 0x7b, 0x3a, 0xfb, 0x6d, 0xe8, 0x38, 0x74, 0xeb, 0xf0, 0xcf, 0xd8, 0x7d, 0x42, 0x09, 0xdf, 0x8b, 0xef, 0xbd, 0xd0, 0xd1, 0x13, 0xa9, 0x44, 0x12, 0xb8, 0xc0, 0x2c, 0x0b, 0xf7, 0xc5, 0x15, 0xa7, 0x60, 0x19, 0xab, 0x71, 0x9d, 0xd2, 0x7c, 0x4e, 0x51, 0x0c, 0xff, 0x6c, 0x46, 0x84, 0xd5, 0x76, 0xc8, 0x63, 0x4e, 0x0a, 0x4c, 0x57, 0x2f, 0x6c, 0x56, 0xe8, 0xb3, 0x7c, 0x99, 0x0a, 0xcf, 0xe5, 0x5f, 0xee, 0xba, 0x98, 0x2b, 0x1e, 0xad, 0x79, 0x9d, 0xc9, 0xe8, 0x57, 0x97, 0x5b, 0xf5, 0x22, 0x9e, 0x51, 0x30, 0x58, 0x83, 0x4c, 0x87, 0xc1, 0x42, 0x64, 0x7f, 0x5c, 0x2a, 0xbe, 0x77, 0x99, 0x3e, 0x61, 0x31, 0xc8, 0xdc, 0x45, 0x8e, 0xd2, 0x9c, 0xad, 0x99, 0x27, 0x7b, 0xb7, 0xc7, 0xf7, 0x39, 0x32, 0x7e, 0xa5, 0xff, 0xaf, 0xd3, 0x79, 0x45, 0xdb, 0x98, 0x95, 0xf3, 0x0c, 0x96, 0x2a, 0xc6, 0x19, 0x17, 0xeb, 0xf6, 0x6f, 0xa8, 0xc2, 0x16, 0x61, 0x1c, 0xc2, 0x3b, 0xc0, 0xd4, 0x5e, 0x60, 0xac, 0x3e, 0xd8, 0x09, 0xa9, 0x9c, 0xfc, 0x27, 0xf6, 0x07, 0x0d, 0x3c, 0x1a, 0xb3, 0x00, 0xbf, 0xbf, 0x74, 0xe8, 0xc2, 0xc3, 0x81, 0xb2, 0xd2, 0x8d, 0x79, 0x12, 0x1f, 0x9d, 0xa3, 0xbd, 0xdd, 0x67, 0x7a, 0xd9, 0xe9, 0x62, 0x69, 0xb1, 0xb0, 0x5c, 0xd3, 0xae, 0x4d, 0x10, 0x56, 0x83, 0xf1, 0xfa, 0x51, 0xa7, 0x88, 0x6a, 0xa3, 0x08, 0x99, 0xd8, 0xb6, 0xfe, 0x6e, 0x77, 0xbd, 0x7d, 0x76, 0x0c, 0x39, 0x90, 0xe7, 0x01, 0xc2, 0x02, 0xa7, 0xb5, 0x04, 0x5e, 0x6d, 0x17, 0x08, 0x1b, 0x24, 0x73, 0xb5, 0x10, 0x90, 0x8c, 0x96, 0x2e, 0x33, 0xea, 0xdd, 0x6d, 0x72, 0x75, 0xa8, 0x07, 0xf4, 0x43, 0x84, 0xe5, 0x4b, 0xaf, 0x2f, 0x56, 0xd6, 0xab, 0xa3, 0x07, 0xe5, 0x57, 0x4f, 0x30, 0x1f, 0xd2, 0xa8, 0x0b, 0x21, 0x4f, 0xe0, 0x8a, 0x68, 0x6c, 0xf5, 0x49, 0x71, 0xc0, 0xee, 0xc2, 0x1e, 0xb3, 0x62, 0xc0, 0x5c, 0x93, 0x39, 0x16, 0x03, 0xe4, 0xb6, 0x90, 0xfe, 0xf7, 0xb6, 0x2a, 0xab, 0xbe, 0x32, 0x80, 0x84, 0xde, 0x0b, 0x86, 0x00, 0x06, 0x07, 0x79, 0xb4, 0x7f, 0x16, 0x15, 0xbe, 0x05, 0xdb, 0x09, 0x63, 0xd6, 0x67, 0xa8, 0xf7, 0x08, 0x48, 0xe1, 0xfd, 0x1f, 0xc2, 0x71, 0x90, 0xdf, 0x5c, 0x57, 0x02, 0x5f, 0x9f, 0x88, 0xc2, 0x5f, 0x1a ],
+    const [ 0xfb, 0x9d, 0xe4, 0x3c, 0x9c, 0x78, 0x60, 0xe1, 0xa3, 0xba, 0xcf, 0x32, 0x1b, 0x59, 0x22, 0xea, 0x1d, 0x15, 0xe6, 0xf4, 0x39, 0x50, 0xc7, 0xdd, 0x18, 0x1f, 0x53, 0x8a, 0x60, 0xa1, 0x01, 0x26, 0xd8, 0x90, 0x72, 0x5f, 0xcd, 0x15, 0xf6, 0xd2, 0xb4, 0xe1, 0x52, 0xc3, 0x10, 0x79, 0xc1, 0x12, 0x96, 0xd1, 0x38, 0x6a, 0x8f, 0x1d, 0xee, 0xbc, 0x7f, 0xe4, 0x1c, 0xec, 0x04, 0x56, 0x01, 0xca, 0x00, 0xdf, 0x2a, 0x43, 0xfa, 0xfc, 0xf0, 0xd9, 0xc2, 0x4e, 0x42, 0x50, 0x54, 0xed, 0xa5, 0xaa, 0xff, 0xfe, 0x78, 0x56, 0xc7, 0x88, 0x7d, 0xa5, 0x07, 0x83, 0x95, 0x7d, 0x5b, 0x32, 0xcb, 0x51, 0xbc, 0xb3, 0x94, 0x50, 0xed, 0xd5, 0x55, 0xdd, 0x17, 0x29, 0x26, 0x40, 0xb0, 0x5c, 0xd6, 0x9b, 0xa0, 0xc3, 0x2f, 0x1f, 0xa7, 0x38, 0x7b, 0x7f, 0xf9, 0x25, 0x47, 0xa5, 0x2c, 0xde, 0x66, 0xa5, 0x54, 0x34, 0x39, 0xef, 0x6d, 0x47, 0x2e, 0xc8, 0xf9, 0x9b, 0x87, 0xfb, 0xe9, 0x6e, 0x5d, 0xcb, 0xc1, 0x49, 0xe4, 0x2d, 0xf8, 0xd6, 0xf0, 0x34, 0x9d, 0xf1, 0xb8, 0xcd, 0x41, 0x01, 0xda, 0xac, 0x10, 0x89, 0xa0, 0x86, 0x41, 0xfa, 0x82, 0x81, 0xb1, 0xcc, 0xec, 0xe9, 0xca, 0xcc, 0x41, 0x24, 0xaa, 0xb8, 0x1f, 0xe8, 0x81, 0x09, 0xe5, 0xab, 0x3b, 0x10, 0x72, 0x5b, 0x60, 0x44, 0x30, 0x50, 0x38, 0xdb, 0x52, 0x7f, 0x32, 0x97, 0x59, 0xf0, 0x86, 0xe3, 0xdd, 0x72, 0x1a, 0x1e, 0x8a, 0x8d, 0xa3, 0x37, 0x69, 0xb8, 0x0c, 0x7a, 0x60, 0xcc, 0x1b, 0xa9, 0xfd, 0xb9, 0x52, 0x4f, 0x6f, 0x77, 0x13, 0x51, 0xd5, 0x40, 0x08, 0xc6, 0xbc, 0xfd, 0xc2, 0x08, 0xe2, 0xfe, 0xa0, 0x0b, 0x40, 0xed, 0xf3, 0xee, 0x48, 0x05, 0x5f, 0xd0, 0x6c, 0x7f, 0x85, 0xe5, 0xdf, 0x4d, 0xde, 0xc9, 0x9f, 0x0b, 0xea, 0x14, 0xb3, 0x33, 0x8b, 0x2e, 0xb1, 0x90, 0xab, 0x65, 0x84, 0xf5, 0x25, 0x3c, 0x6c, 0x2e, 0xe3, 0x06, 0x46, 0x37, 0x44, 0xb4, 0x0e, 0xac, 0xc0, 0xec, 0xa2, 0x81, 0xce, 0x5b, 0xc9, 0xf3, 0x05, 0x4b, 0x73, 0xbe, 0x82, 0x78, 0x43, 0x91, 0x8b, 0x1f, 0x4a, 0xbf, 0x71, 0x59, 0x16, 0x37, 0xbb, 0xa7, 0xeb, 0xb6, 0x80, 0xce, 0x50, 0x3b, 0x15, 0xe5, 0xcd, 0xbc, 0xe9, 0xac, 0xf4, 0x17, 0xac, 0x1f, 0x9e, 0x4b, 0xb7, 0x4b, 0x77, 0xe8, 0xa8, 0x61, 0xbd, 0xc4, 0x4c, 0x09, 0x44, 0xf0, 0xc3, 0xf8, 0xbe, 0xea, 0xde, 0xc5, 0x39, 0x14, 0xcc, 0xf8, 0xe9, 0x65, 0xf6, 0x65, 0x28, 0x5f, 0x27, 0xb8, 0xbb, 0x41, 0xf0, 0x50, 0x57, 0x7d, 0x4b, 0x51, 0x63, 0x6c, 0x7e, 0xf4, 0x00, 0x41, 0x42, 0x22, 0x47, 0x3c, 0x25, 0x42, 0xd1, 0x20, 0x2d, 0x4f, 0x7d, 0xe6, 0xbe, 0x2d, 0x6d, 0xb3, 0xbd, 0x3d, 0x52, 0x08, 0xf6, 0x2f, 0xea, 0x38, 0xbb, 0x17, 0xc7, 0x20, 0xce, 0xc3, 0x51, 0x12, 0x82, 0x4c, 0x0e, 0x12, 0x1c, 0xec, 0x21, 0x45, 0x7f, 0x0f, 0x11, 0xa6, 0x09, 0xad, 0xcc, 0xfb, 0xb8, 0xd6, 0xec, 0x08, 0x91, 0x8f, 0x38, 0x02, 0x42, 0xdc, 0x6e, 0x46, 0x06, 0x1e, 0x40, 0x4b, 0xc9, 0x9f, 0x9c, 0xd5, 0x8d, 0x6c, 0x30, 0x6c, 0x0c, 0x63, 0x2e, 0x0d, 0x9e, 0x8c, 0x4c, 0x1f, 0x5e, 0xad, 0x10, 0xa8, 0x88, 0x18, 0x4a, 0xc1, 0x26, 0xc8, 0xe2, 0x48, 0xec, 0xac, 0xd3, 0xd4, 0x60, 0x43, 0x78, 0xee, 0x3e, 0x69, 0x07, 0x7e, 0x1a, 0x71, 0x5b, 0x83, 0x47, 0x73, 0xf6, 0x07, 0xf8, 0xe7, 0x46, 0x53, 0xa5, 0x73, 0x27, 0x5f, 0xb0, 0x02, 0xaa, 0x8c, 0x49, 0x16, 0x14, 0x95, 0x8f, 0x5f, 0x2a, 0xc3, 0xf7, 0x8c, 0xac, 0x61, 0xf2, 0x61, 0x20, 0x70, 0xca, 0x0a, 0xd0, 0x9c, 0xcd, 0xaf, 0x16, 0x6e, 0xae, 0x48, 0xd7, 0xc2, 0x28, 0xb3, 0x4e, 0x7c, 0xe4, 0x03, 0x0b, 0x77, 0x9d, 0x1c, 0x3b, 0xbe, 0x82, 0x7d, 0x29, 0xff, 0xdc, 0x5c, 0x05, 0x3c, 0xf0, 0xf8, 0xe5, 0xc4, 0x27, 0x2b, 0x09, 0x62, 0x6c, 0x3e, 0x63, 0xd4, 0xd6, 0x02, 0x56, 0x7e, 0x87, 0x1c, 0xbf, 0x60, 0xd4, 0xa1, 0x32, 0x46, 0xa6, 0xe3, 0x86, 0x3e, 0x1f, 0x8a, 0x93, 0x4f, 0x81, 0xe6, 0x3a, 0x68, 0x4c, 0x83, 0xa6, 0x97, 0xa7, 0xfe, 0xd2, 0x7b, 0x01, 0x18, 0x4b, 0xfc, 0xf8, 0x09, 0x38, 0x39, 0x7a, 0x17, 0x97, 0xc2, 0x2a, 0x66, 0xc9, 0x08, 0x05, 0x12, 0x51, 0x12, 0x45, 0x7b, 0xd9, 0x71, 0x85, 0xe0, 0x75, 0x75, 0x27, 0x30, 0x2c, 0xa1, 0xf3, 0x1c, 0xb5, 0x5d, 0x00, 0x71, 0x7e, 0xeb, 0xd8, 0xa5, 0xf3, 0x9c, 0xd7, 0xaf, 0xfc, 0x44, 0xd4, 0x1c, 0xc7, 0xeb, 0x04, 0x60, 0xc9, 0xc5, 0x1a, 0x6a, 0xff, 0x65, 0xb3, 0x7b, 0x7a, 0x2d, 0xf2, 0x37, 0x1a, 0x09, 0x67, 0xfd, 0x9a, 0x5d, 0x36, 0x74, 0xcc, 0x3b, 0x75, 0x66, 0x26, 0xda, 0xd5, 0xd2, 0x7e, 0x43, 0x85, 0x3c, 0x12, 0x4e, 0x53, 0x48, 0xcb, 0xcd, 0x15, 0x87, 0xc3, 0x07, 0x47, 0x91, 0x04, 0x68, 0xf5, 0x54, 0x93, 0x76, 0xdc, 0xab, 0xad, 0x07, 0xcc, 0x33, 0x50, 0xb1, 0x50, 0x5a, 0xfd, 0x83, 0x91, 0xb8, 0xbd, 0xf2, 0x78, 0xa3, 0x62, 0x16, 0x13, 0xfd, 0x0f, 0x17, 0x3a, 0x51, 0xfa, 0xe2, 0x72, 0x1e, 0x71, 0x20, 0x11, 0x73, 0x1b, 0x68, 0xa3, 0xbc, 0x81, 0xb3, 0x8d, 0xdc, 0xcc, 0x11, 0xf0, 0x7c, 0xd0, 0x9b, 0xd0, 0xa2, 0x4a, 0xa9, 0x76, 0x85, 0x66, 0x45, 0x12, 0xa0, 0x85, 0xdf, 0xa5, 0x05, 0x3c, 0x42, 0x1e, 0xf4, 0xa0, 0xc6, 0xc3, 0xac, 0xc1, 0xc7, 0xd3, 0x81, 0x74, 0x57, 0x6a, 0x2f, 0x56, 0x30, 0xa4, 0x6e, 0x0d, 0xec, 0x05, 0xc6, 0xd1, 0x79, 0x19, 0xa5, 0x2c, 0xc7, 0x57, 0xaf, 0xfd, 0xc3, 0x4b, 0x55, 0xc3, 0x89, 0xf5, 0xa9, 0x18, 0xd5, 0x6c, 0x70, 0x7c, 0xbb, 0xc6, 0x79, 0x54, 0x99, 0x3c, 0x2e, 0x32, 0x49, 0x8a, 0x69, 0x57, 0x9b, 0x95, 0x89, 0x77, 0x02, 0x50, 0xc4, 0xbc, 0x8d, 0xe0, 0xbf, 0x0d, 0x19, 0xff, 0x5b, 0x8f, 0xc6, 0x9e, 0xd2, 0x6c, 0xa7, 0xce, 0x04, 0xd4, 0xbe, 0xe0, 0x0b, 0x42, 0x27, 0xcb, 0x15, 0x01, 0x93, 0xcf, 0x73, 0xee, 0xf8, 0x58, 0xed, 0x7f, 0x87, 0x25, 0x59, 0x04, 0xdf, 0xa9, 0x6c, 0x2d, 0x80, 0xb2, 0xcf, 0xcd, 0x82, 0x48, 0x75, 0xdd, 0x87, 0xd8, 0x2d, 0xc4, 0xee, 0x92, 0x73, 0xd6, 0x49, 0x0f, 0x8c, 0x1a, 0x11, 0x37, 0xd2, 0x50, 0x99, 0x62, 0x4c, 0x32, 0x41, 0xbd, 0x81, 0xfb, 0xec, 0xf0, 0x8e, 0x26, 0xb4, 0xfd, 0x77, 0x78, 0xdc, 0x6b, 0xbb, 0x40, 0x05, 0xa5, 0x2b, 0xde, 0xa5, 0x9d, 0xfb, 0x82, 0xb6, 0xb4, 0x1a, 0x36, 0xab, 0xde, 0xbf, 0x1f, 0xa8, 0x01, 0x45, 0xff, 0xf2, 0x9f, 0x38, 0xff, 0xa5, 0xb5, 0xb0, 0xac, 0xa5, 0xe3, 0xdd, 0x3f, 0xd6, 0xcc, 0xe4, 0x21, 0x90, 0xc0, 0xe9, 0xae, 0x4d, 0x99, 0x6d, 0x3a, 0xa5, 0xe2, 0xdb, 0x51, 0x7d, 0x3f, 0x5d, 0x43, 0x7b, 0x08, 0xf4, 0xe0, 0xbd, 0x38, 0xc8, 0x81, 0xca, 0x86, 0xbd, 0x48, 0xc8, 0xd1, 0x46, 0xa8, 0xf0, 0xc1, 0x7e, 0x27, 0x40, 0xac, 0x75, 0x62, 0x6f, 0xb6, 0xc7, 0x52, 0x26, 0x3d, 0x74, 0xcf, 0x6d, 0x74, 0xeb, 0x52, 0x64, 0x4d, 0x68, 0xff, 0x33, 0x9d, 0x80, 0xe3, 0x43, 0x7b, 0xfb, 0x7a, 0xaf, 0xe8, 0xe1, 0x74, 0xf5, 0xb6, 0xd7, 0xb8, 0xf2, 0xa2, 0xac, 0xaa, 0x0d, 0xc4, 0x30, 0xa9, 0xb2, 0x29, 0x45, 0xdc, 0x02, 0xbe, 0x38, 0x2f, 0xc8, 0x6f, 0x51, 0x98, 0xaf, 0x91, 0xa8, 0x9f, 0xb3, 0x7d, 0x3b, 0x1d, 0xd6, 0x7e, 0x3e, 0x44, 0x14, 0xee, 0xb2, 0xdf, 0x98, 0x9b, 0x39, 0xdb, 0x30, 0x70, 0x29, 0x07, 0xff, 0x51, 0xdf, 0x18, 0x72, 0x46, 0x56, 0xf0, 0x75, 0xdc, 0xf8, 0x20, 0xe6, 0xc8, 0xb3, 0xab, 0x49, 0xce, 0x50, 0x0d, 0xbe, 0xe1, 0x00, 0x7b, 0x31, 0x8c, 0x38, 0x6d, 0xd1, 0x90, 0xbf, 0x5a, 0xc3, 0xcf, 0x06, 0xc2, 0x17, 0x68, 0xb7, 0x72, 0xfb, 0x24, 0x90, 0x04, 0x2e, 0x11, 0x72, 0xa5, 0xb8, 0x6c, 0xb5, 0x1b, 0xd9, 0xc4, 0xbf, 0x06, 0x3f, 0x5d, 0xd5, 0x65, 0x7b, 0xd3, 0x30, 0x5d, 0xb6, 0xff, 0x54, 0x36, 0xa0, 0x1e, 0x9d, 0xa7, 0xaa, 0x30, 0x1b, 0x53, 0x75, 0x9f, 0xa0, 0x93, 0x8a, 0x21, 0x16, 0x76, 0x4b, 0xdf, 0x16, 0x06, 0x2a, 0xd7, 0xb7, 0xcd, 0x18, 0x7f, 0xa4, 0x98, 0x40, 0xab, 0x72, 0x7b, 0xf6, 0xb0, 0x30, 0x15, 0xea, 0xca, 0x3f, 0x15, 0xa2, 0xbb, 0x64, 0xfd, 0x27, 0xb5, 0x1b, 0x27, 0xfe, 0x7a, 0x2e, 0x05, 0x59, 0xc2, 0x87, 0xac, 0x8f, 0xdd, 0x42, 0x94, 0xca, 0x99, 0x07, 0x99, 0xff, 0x66, 0x97, 0x46, 0x24, 0xb8, 0xa4, 0x53, 0x9d, 0xad, 0xe6, 0x6c, 0xf7, 0xf0, 0x6b, 0x35, 0xd8, 0xdd, 0x2f, 0x8a, 0x36, 0xe6, 0xec, 0x0b, 0xc8, 0x35, 0x33, 0xd8, 0xba, 0x92, 0xbc, 0x99, 0xa5, 0x88, 0xfb, 0xc2, 0xbe, 0xc3, 0xf3, 0x15, 0x4e, 0xbd, 0x4f, 0x68, 0x62, 0x9a, 0xaf, 0xa8, 0xc3, 0x50, 0x40, 0x1e, 0x28, 0x0a, 0x8f, 0xf1, 0xab, 0xcf, 0x9f, 0xec, 0x7a, 0x5e, 0x39, 0x82, 0xcf, 0x5d, 0x83, 0x0f, 0x22, 0xb3, 0xd4, 0x61, 0x9d, 0x33, 0xc7, 0x77, 0xd0, 0x7a, 0x8e, 0x88, 0xa6, 0x1a, 0x89, 0x48, 0x97, 0xf8, 0x17, 0x66, 0x20, 0xf2, 0xad, 0x59, 0x70, 0xc5, 0x25, 0x5c, 0x65, 0x2e, 0x58, 0xb7, 0xb6, 0x50, 0xee, 0x41, 0x72, 0x56, 0x75, 0x23, 0xa9, 0x59, 0xb1, 0xde, 0x68, 0x84, 0x33, 0x90, 0xeb, 0x76, 0x2d, 0x73, 0x0f, 0xe7, 0x85, 0xa6, 0x06, 0x8f, 0x28, 0x30, 0x4e, 0x43, 0xa1, 0x42, 0xe4, 0x62, 0xea, 0xbc, 0xb5, 0x6f, 0x82, 0xf3, 0x55, 0xff, 0xbf, 0xb1, 0xf3, 0xd6, 0x66, 0x7e, 0x8d, 0x4d, 0x79, 0x1e, 0x60, 0xf7, 0x50, 0x5b, 0xa3, 0x83, 0xeb, 0x05, 0x74, 0xe4, 0x87, 0x36, 0x13, 0xb0, 0x6f, 0xda, 0x4e, 0xc6, 0x15, 0x6f, 0x3c, 0x34, 0x61, 0x0a, 0x2e, 0x58, 0x49, 0x9b, 0xe3, 0x45, 0xa2, 0x71, 0xfb, 0x67, 0x36, 0x01, 0xae, 0x6b, 0x16, 0xe3, 0xbe, 0x59, 0x32, 0x1d, 0xaa, 0x03, 0x26, 0xa4, 0x25, 0xa3, 0x57, 0x20, 0xc6, 0xc0, 0x3f, 0xf0, 0x01, 0x51, 0x05, 0x6e, 0x56, 0x25, 0x51, 0x74, 0xc8, 0x82, 0x5e, 0x1f, 0x91, 0x0d, 0x51, 0xd2, 0x14, 0xe9, 0xc9, 0x7e, 0x13, 0x23, 0xb7, 0x21, 0x22, 0x4e, 0x70, 0x8d, 0x5c, 0x6a, 0x00, 0x6b, 0x54, 0x0b, 0xc1, 0x7f, 0x4f, 0xb7, 0x2d, 0x2e, 0xb0, 0x8f, 0xf1, 0x3d, 0xb3, 0x31, 0x42, 0xdb, 0x5e, 0xde, 0x74, 0xe2, 0xb5, 0xd8, 0xc9, 0x5a, 0x2e, 0x0e, 0x87, 0x3f, 0x64, 0xfb, 0x4d, 0x83, 0x0f, 0xcc, 0xa6, 0x57, 0x34, 0xc1, 0xdf, 0xa7, 0x99, 0xd5, 0x16, 0xe3, 0x7c, 0xa1, 0x94, 0x05, 0x84, 0x7e, 0x5d, 0xd0, 0xf8, 0xea, 0x04, 0x55, 0x2f, 0x2d, 0xc4, 0xbc, 0x48, 0x3c, 0xcd, 0x41, 0x1b, 0xdd, 0xdc, 0x7d, 0x6e, 0x0c, 0x0e, 0xe7, 0x6d, 0x9d, 0xf6, 0x9a, 0x54, 0x24, 0xed, 0x59, 0x6f, 0x12, 0xa9, 0xd0, 0x44, 0x20, 0x12, 0x1c, 0x0f, 0xf1, 0x50, 0x8e, 0x6e, 0xf2, 0x29, 0xac, 0x5e, 0x86, 0x8a, 0x79, 0x66, 0x60, 0x63, 0xf7, 0x12, 0x2f, 0xb8, 0xe9, 0xa3, 0x81, 0xf6, 0xdd, 0x05, 0xe1, 0x83, 0x6a, 0x01, 0x43, 0x98, 0xb7, 0xb4, 0xa3, 0x53, 0x3c, 0x40, 0xe8, 0x08, 0xcd, 0xc1, 0x0e, 0xd9, 0xd4, 0x83, 0x84, 0x86, 0xde, 0x72, 0xd3, 0x86, 0x59, 0xd1, 0x81, 0x56, 0x9b, 0x2f, 0x35, 0x11, 0x27, 0x97, 0x1b, 0x41, 0x2c, 0x08, 0x8a, 0xf4, 0x4f, 0x24, 0xe5, 0x13, 0xaa, 0x2c, 0xbf, 0xf0, 0x15, 0x2c, 0x42, 0x1e, 0xa4, 0x73, 0xd1, 0x85, 0x71, 0x46, 0xec, 0xb5, 0x9b, 0xd6, 0x54, 0x7b, 0x8e, 0x6f, 0x70, 0xb2, 0x85, 0xf1, 0xf0, 0x5c, 0x4e, 0x84, 0xb0, 0xf2, 0x4d, 0x88, 0xdf, 0xf8, 0xc4, 0xcb, 0x60, 0xd3, 0x52, 0xff, 0x70, 0xdf, 0xb9, 0x6b, 0x8a, 0xbd, 0xe4, 0xe0, 0x87, 0xea, 0x28, 0xef, 0x0a, 0x96, 0xca, 0x59, 0x1b, 0xb3, 0xc1, 0xc7, 0x12, 0x4c, 0xbe, 0xbb, 0xb7, 0x18, 0x6a, 0xc7, 0xa7, 0x4f, 0xee, 0xfd, 0xfa, 0xbc, 0xb9, 0xa6, 0x22, 0x14, 0x7d, 0x37, 0x16, 0x86, 0x7b, 0x80, 0xb1, 0x93, 0x01, 0x27, 0x54, 0x20, 0x31, 0x55, 0xd3, 0xc9, 0x03, 0xaf, 0x8f, 0x79, 0x8e, 0x88, 0xdf, 0x37, 0x83, 0x54, 0xb5, 0x43, 0xfa, 0x60, 0x7e, 0x62, 0x71, 0xc1, 0x49, 0x76, 0x11, 0x8b, 0x2c, 0x51, 0x34, 0x43, 0xe3, 0xcb, 0x25, 0x96, 0xbb, 0x12, 0x26, 0x4a, 0xaf, 0x42, 0xb8, 0x76, 0xd0, 0x36, 0x16, 0xee, 0xea, 0x9d, 0x03, 0x02, 0x64, 0x50, 0xc5, 0x68, 0x68, 0xe3, 0x72, 0x76, 0x44, 0x79, 0x6a, 0x94, 0x10, 0xdd, 0x25, 0xf2, 0x91, 0xcf, 0x2f, 0x76, 0x5e, 0x9c, 0x70, 0xf9, 0x41, 0xf2, 0xb1, 0xb2, 0xe0, 0xf1, 0x5c, 0xf2, 0x9d, 0x85, 0x83, 0x12, 0xba, 0xf4, 0x24, 0xaa, 0xc1, 0xb3, 0xac, 0x04, 0x23, 0x7e, 0xb9, 0xd1, 0x1f, 0xa7, 0x24, 0x1a, 0xe5, 0xaf, 0x3f, 0x79, 0xfc, 0x13, 0x5b, 0x88, 0xe1, 0x68, 0x8e, 0x9a, 0xf1, 0xaa, 0xb3, 0xa9, 0x88, 0xd2, 0xb1, 0x90, 0x6b, 0xa6, 0x01, 0x7a, 0x63, 0xd5, 0x6a, 0x9b, 0x2b, 0x43, 0x0f, 0x1e, 0x8c, 0xa2, 0xac, 0x5e, 0xc7, 0x42, 0x1d, 0x58, 0x33, 0x2a, 0x20, 0x61, 0x27, 0x67, 0x5b, 0x14, 0x1a, 0xa4, 0xa1, 0x8f, 0x09, 0xfb, 0x71, 0xdf, 0x1a, 0x0b, 0xbf, 0xb8, 0x7e, 0x4b, 0xf7, 0x69, 0x9b, 0x9d, 0x40, 0x10, 0x6b, 0x27, 0xfe, 0x0a, 0x1f, 0x5e, 0x9a, 0xae, 0x09, 0x63, 0x85, 0x3b, 0xb8, 0x93, 0x7a, 0x0e, 0x65, 0x5a, 0x04, 0x19, 0x8e, 0x47, 0x41, 0x90, 0xe0, 0x66, 0xe5, 0xe5, 0x5a, 0xca, 0x81, 0xf7, 0xb0, 0x69, 0x06, 0x87, 0xed, 0x2d, 0x85, 0xeb, 0x5d, 0x47, 0x38, 0x06, 0xaa, 0xc7, 0xc6, 0x77, 0x45, 0x69, 0xc3, 0x11, 0x07, 0xb2, 0x76, 0x8b, 0x19, 0x3c, 0xe0, 0x79, 0x11, 0x4f, 0xf9, 0x7b, 0x5d, 0xb0, 0x3d, 0xb5, 0xe5, 0xbe, 0x67, 0x7f, 0xec, 0xba, 0x7d, 0x5d, 0x37, 0x67, 0x0c, 0x31, 0x72, 0xd3, 0xb5, 0xaf, 0xcf, 0x74, 0xe8, 0x12, 0xf0, 0x76, 0xf0, 0x0d, 0x07, 0x54, 0x30, 0x05, 0x3c, 0xa6, 0xac, 0x7d, 0x4f, 0x3a, 0xcb, 0xd2, 0x7e, 0x65, 0x5b, 0x28, 0xa9, 0x9b, 0xd5, 0xa4, 0xb4, 0x3e, 0xe2, 0xdc, 0x2d, 0xb4, 0x1f, 0x8b, 0x2e, 0xbc, 0x1d, 0x8a, 0x85, 0x02, 0xad, 0xfb, 0x13, 0xf1, 0x5a, 0xc7, 0x72, 0xc8, 0x36, 0x4c, 0xdb, 0xf0, 0xda, 0x4f, 0x46, 0x8d, 0xa8, 0x38, 0xd2, 0x53, 0x53, 0x7e, 0x68, 0x9a, 0xa2, 0x60, 0x9b, 0xb5, 0x70, 0xd6, 0xd3, 0x80, 0xf8, 0xc7, 0xab, 0x39, 0x4f, 0x7c, 0x97, 0x91, 0x32, 0x55, 0xca, 0x02, 0x02, 0xba, 0x57, 0x62, 0x0d, 0x55, 0x96, 0xb9, 0x0f, 0x7e, 0xc9, 0x50, 0xf9, 0xf7, 0xff, 0x0a, 0xf0, 0xda, 0x39, 0xf7, 0x99, 0xcf, 0xcc, 0x27, 0x94, 0x82, 0x06, 0xbc, 0x46, 0x55, 0x14, 0x43, 0xdc, 0x52, 0x23, 0x45, 0x8c, 0x63, 0xc6, 0x18, 0x1e, 0xc5, 0x98, 0xfb, 0xac, 0xba, 0x22, 0x63, 0xa6, 0x7e, 0xff, 0x8f, 0x18, 0x7d, 0x3d, 0x62, 0x30, 0xc3, 0x07, 0x72, 0xfb, 0xb4, 0x81, 0x5d, 0x6f, 0xfd, 0xf4, 0x5c, 0xae, 0xca, 0x2b, 0x1a, 0x89, 0x3a, 0x1d, 0xc6, 0x43, 0x0f, 0xcc, 0x66, 0x98, 0xab, 0x6c, 0x6f, 0xfe, 0x38, 0xc8, 0x93, 0x2b, 0x26, 0xe2, 0xdb, 0xd7, 0xda, 0xd9, 0xf5, 0xc3, 0xa4, 0x10, 0xcf, 0xfa, 0xf2, 0x8d, 0x65, 0x57, 0xc4, 0x9f, 0xd7, 0x47, 0x60, 0xc4, 0xbe, 0xd0, 0x47, 0xc9, 0xc0, 0xd3, 0x67, 0x33, 0x62, 0x8e, 0x92, 0xde, 0x1e, 0x64, 0x2f, 0xe4, 0xb6, 0xe1, 0x30, 0xc0, 0xc7, 0xf9, 0x44, 0xb4, 0xa1, 0x90, 0x4d, 0x68, 0x56, 0x40, 0x14, 0xd3, 0x11, 0x56, 0x3b, 0x5e, 0xa9, 0x1d, 0x74, 0x47, 0x76, 0x60, 0xf1, 0x44, 0x64, 0x2a, 0x1c, 0x6a, 0x45, 0xd0, 0x87, 0x4c, 0x6c, 0x31, 0x26, 0x67, 0x77, 0x3d, 0xbc, 0xbe, 0x6c, 0xb4, 0x93, 0xc1, 0x08, 0x30, 0x70, 0x73, 0x53, 0x66, 0xc6, 0xcc, 0x78, 0xa9, 0x2a, 0x5c, 0xd4, 0xb0, 0x07, 0x32, 0x4d, 0x98, 0x93, 0xfc, 0xe5, 0x2c, 0x01, 0x70, 0x8e, 0x65, 0xf9, 0xea, 0x41, 0x2d, 0x45, 0x56, 0x4a, 0x68, 0xcd, 0x50, 0xe6, 0x35, 0xc5, 0x8a, 0x0f, 0x71, 0x25, 0x6e, 0x97, 0x7e, 0x59, 0x05, 0x74, 0x42, 0x3a, 0x18, 0x5b ],
+    const [ 0x58, 0x06, 0x7f, 0xf7, 0x95, 0x9a, 0x19, 0x66, 0xd3, 0x7f, 0xce, 0x5c, 0xf0, 0x6a, 0x8d, 0xde, 0x6e, 0x1f, 0x1c, 0x67, 0x6e, 0x91, 0xb0, 0x2d, 0xdc, 0x4b, 0xbb, 0xa5, 0xe7, 0x0e, 0x05, 0x49, 0xb4, 0xbc, 0xfe, 0x99, 0x53, 0x74, 0x53, 0x60, 0xf2, 0xff, 0xbf, 0x38, 0x50, 0x6b, 0x24, 0x50, 0x75, 0xf5, 0xda, 0x6d, 0xa1, 0x2d, 0x46, 0x2f, 0x82, 0x54, 0xaf, 0x96, 0xa9, 0x09, 0x4e, 0xc4, 0x3f, 0x25, 0xa4, 0x05, 0xf4, 0xe3, 0x11, 0x0c, 0x39, 0x44, 0xa1, 0x80, 0xaf, 0xb1, 0x29, 0xb7, 0xdf, 0xe2, 0x93, 0xc1, 0x2b, 0x00, 0x76, 0xa8, 0x04, 0x06, 0xea, 0xf6, 0x5e, 0x6d, 0x9a, 0x78, 0x61, 0x08, 0x1a, 0x42, 0x62, 0x2d, 0x7b, 0xf3, 0x11, 0x15, 0x1d, 0x3a, 0xf4, 0x85, 0xc5, 0x99, 0x14, 0xae, 0xef, 0x69, 0xf6, 0x53, 0x66, 0x1f, 0xcc, 0x29, 0x11, 0xcd, 0xed, 0x83, 0x10, 0xec, 0x83, 0x2e, 0x08, 0x58, 0x83, 0x9a, 0xba, 0x9c, 0xe3, 0x3b, 0xdb, 0x70, 0x07, 0x2f, 0x1f, 0x80, 0x7c, 0x21, 0x98, 0x6f, 0xe8, 0x6d, 0x3e, 0x1c, 0x41, 0x85, 0xcf, 0x24, 0x3e, 0x93, 0xd9, 0xa8, 0x0b, 0x60, 0x14, 0x50, 0x41, 0x74, 0xf6, 0x8f, 0x15, 0x7f, 0x82, 0x29, 0xd0, 0xf7, 0x61, 0xf3, 0x7f, 0x03, 0x33, 0xda, 0xeb, 0x98, 0x27, 0x27, 0xcb, 0xe1, 0xc9, 0x02, 0x39, 0xe5, 0x1c, 0x34, 0x63, 0x64, 0xe9, 0x31, 0x83, 0x01, 0x56, 0x55, 0x11, 0xa7, 0xba, 0x6e, 0x36, 0x25, 0xb0, 0x7b, 0x85, 0x1b, 0x6b, 0xb3, 0xe6, 0x1a, 0x49, 0xc9, 0xd2, 0x07, 0xaa, 0x6f, 0xc6, 0xc0, 0x02, 0x19, 0xf1, 0x02, 0x2d, 0x03, 0x30, 0x8b, 0x03, 0x75, 0x3d, 0x7b, 0x2d, 0x46, 0x24, 0x00, 0x37, 0x9f, 0xf6, 0x32, 0xe5, 0x01, 0xc0, 0x3c, 0xcb, 0x89, 0xbe, 0xbd, 0x18, 0x73, 0xcd, 0x6e, 0xb3, 0xde, 0x1f, 0x04, 0x89, 0xce, 0x32, 0x58, 0x25, 0x77, 0x03, 0xc5, 0x81, 0xb9, 0x7f, 0xd1, 0x1b, 0xe7, 0x3a, 0x10, 0x4c, 0xcc, 0x63, 0x46, 0xd5, 0xf0, 0xf8, 0xcc, 0xbb, 0x17, 0x36, 0x35, 0x56, 0x0b, 0x54, 0x30, 0xa4, 0x9b, 0x70, 0xb0, 0xe3, 0xe4, 0xca, 0x4b, 0x5e, 0xcf, 0x30, 0xe0, 0x87, 0xdb, 0xb9, 0x7d, 0x46, 0x1d, 0xb6, 0x80, 0x91, 0x85, 0xe6, 0xfc, 0x3d, 0x62, 0xe9, 0x5e, 0x13, 0x28, 0xf7, 0x50, 0x27, 0x71, 0xd2, 0xdd, 0x65, 0x43, 0xf9, 0xd6, 0x6d, 0x91, 0x1f, 0x75, 0xa1, 0x04, 0xdb, 0x41, 0x7b, 0xfb, 0xa1, 0x31, 0x25, 0xd0, 0xf1, 0x14, 0x43, 0x5d, 0xce, 0x30, 0x13, 0xbe, 0x72, 0x2a, 0xb9, 0x59, 0x40, 0x26, 0xd4, 0x1c, 0xfa, 0x2e, 0x55, 0x06, 0x34, 0xd8, 0x91, 0xe9, 0x09, 0x23, 0x95, 0x6e, 0x0c, 0xa3, 0xb9, 0x59, 0x81, 0xde, 0x78, 0x0e, 0xce, 0xf5, 0x7e, 0x54, 0x2c, 0x87, 0x03, 0x5a, 0xa2, 0xd2, 0x58, 0xf8, 0x34, 0x1b, 0xbf, 0x36, 0x58, 0x50, 0x80, 0x12, 0xa9, 0xed, 0x39, 0x7e, 0xdf, 0x1c, 0x76, 0xa9, 0xff, 0x20, 0x81, 0x7f, 0xcf, 0xf3, 0x7c, 0x73, 0x8d, 0x2e, 0xac, 0x7c, 0xe0, 0x2a, 0x18, 0x5d, 0x0f, 0x65, 0x53, 0x2a, 0x71, 0x27, 0x96, 0x08, 0x25, 0x65, 0x11, 0x34, 0x02, 0xe5, 0x83, 0x47, 0xd1, 0xa3, 0x09, 0xb8, 0xba, 0x74, 0x33, 0xa2, 0xfd, 0xe9, 0x5d, 0xc7, 0xe3, 0x76, 0x3d, 0xd6, 0xf3, 0xd3, 0xb8, 0xe9, 0x68, 0xa3, 0xfa, 0x52, 0xe3, 0x54, 0xc5, 0x97, 0x5e, 0x46, 0x09, 0xbb, 0x61, 0x2f, 0xb6, 0xbf, 0x78, 0xbe, 0xce, 0x69, 0xe4, 0x7e, 0xbe, 0x44, 0x91, 0xfe, 0xee, 0xe8, 0x48, 0x2f, 0x97, 0x7b, 0x26, 0x0d, 0xd5, 0x78, 0x4d, 0x81, 0xfd, 0xaf, 0xd9, 0x86, 0x30, 0x8e, 0x16, 0x8c, 0x30, 0x9e, 0xf0, 0x19, 0x73, 0x50, 0xaa, 0xb6, 0x76, 0xfa, 0xd3, 0x09, 0x54, 0x1d, 0x76, 0x3f, 0x97, 0xe9, 0x92, 0xad, 0x4e, 0x03, 0xc9, 0xb6, 0x60, 0x85, 0x5c, 0xef, 0x1f, 0x47, 0x57, 0x81, 0x20, 0x5d, 0x09, 0xcf, 0x4b, 0xe0, 0xb7, 0x59, 0x2e, 0xf2, 0x92, 0xe0, 0x96, 0xfc, 0xe5, 0xcc, 0x61, 0x3a, 0x93, 0xca, 0x8e, 0x7a, 0xc1, 0xb9, 0x96, 0x20, 0xd0, 0xc7, 0xff, 0x6e, 0x8e, 0xd7, 0x2e, 0x02, 0xad, 0x27, 0x7d, 0xa0, 0x74, 0x2f, 0x8d, 0x32, 0xb4, 0xcc, 0xde, 0x0d, 0xfe, 0x9d, 0x9c, 0x76, 0x13, 0xad, 0xbc, 0x65, 0x9c, 0x53, 0x48, 0x89, 0x1b, 0x57, 0xf7, 0x8b, 0x22, 0x56, 0x01, 0x97, 0xc3, 0x68, 0x31, 0x19, 0x47, 0xff, 0x3c, 0xc4, 0x22, 0x13, 0x51, 0xd9, 0x27, 0x7c, 0xf1, 0xa6, 0xf9, 0x9f, 0x01, 0x4d, 0xc2, 0x4c, 0x1e, 0xc6, 0x27, 0xe7, 0x30, 0x27, 0x7b, 0xc6, 0x42, 0x23, 0x32, 0xdb, 0x91, 0xd1, 0x99, 0x93, 0xe2, 0xaf, 0xc5, 0xfd, 0x19, 0xe7, 0xc9, 0x2f, 0x08, 0xd1, 0x2d, 0xe6, 0x85, 0xb8, 0x9b, 0x6c, 0xbf, 0xe1, 0xda, 0xbf, 0xd2, 0xc9, 0x01, 0xef, 0x98, 0xaf, 0xe4, 0xc8, 0xc2, 0x52, 0xd3, 0xb1, 0x28, 0xfc, 0x84, 0xd4, 0x5e, 0xbf, 0x4d, 0x7f, 0x88, 0xff, 0x96, 0xca, 0x6f, 0x31, 0x8f, 0x7b, 0xd4, 0xe1, 0x1e, 0x26, 0x04, 0xfa, 0x1c, 0x99, 0xac, 0x42, 0xc0, 0x77, 0xef, 0x24, 0x5b, 0x22, 0xb6, 0xb2, 0x46, 0xde, 0x47, 0xea, 0x19, 0x34, 0x1a, 0x38, 0x1e, 0x95, 0xe7, 0x3d, 0x06, 0x40, 0x04, 0xcf, 0xda, 0x66, 0xee, 0x41, 0x34, 0x8b, 0x26, 0xe4, 0xae, 0x2f, 0x3e, 0xcd, 0x9b, 0xae, 0x33, 0xd9, 0xf5, 0x65, 0xfd, 0xef, 0x97, 0x16, 0x65, 0x85, 0xac, 0x8d, 0x17, 0x66, 0x68, 0x84, 0xf8, 0xb2, 0xf6, 0xc5, 0xb9, 0x26, 0xb1, 0x8e, 0xad, 0x9d, 0x96, 0x39, 0xd7, 0xd7, 0xf9, 0x1c, 0x48, 0x7a, 0x78, 0xaf, 0xa8, 0x56, 0x2e, 0xec, 0x12, 0xed, 0x29, 0xfc, 0x25, 0x33, 0x1d, 0x0f, 0x57, 0x92, 0x59, 0x8c, 0x8d, 0x31, 0xfb, 0x6a, 0xe9, 0x76, 0x60, 0xdd, 0xe3, 0xca, 0xdf, 0x36, 0x9c, 0x9c, 0xb7, 0x04, 0x6e, 0xa8, 0x45, 0x80, 0xc8, 0x79, 0x7b, 0x28, 0x39, 0x2c, 0x8d, 0xa9, 0xca, 0x78, 0xed, 0x02, 0x91, 0xeb, 0x7a, 0xe7, 0x83, 0x76, 0xf5, 0x63, 0x8a, 0x2c, 0xb4, 0xc2, 0xd8, 0x47, 0x9a, 0xae, 0x7a, 0x6c, 0x46, 0x98, 0x30, 0x30, 0x8b, 0x5a, 0x7c, 0xda, 0x20, 0x1a, 0xf9, 0x6a, 0x99, 0x71, 0xee, 0xdb, 0x96, 0xcc, 0x23, 0xa6, 0x3b, 0x13, 0xf3, 0x87, 0xe0, 0x89, 0xa3, 0x83, 0x09, 0xf4, 0xf2, 0x2a, 0x98, 0xfd, 0xf1, 0x1a, 0x41, 0xd9, 0x15, 0xc4, 0x3f, 0x29, 0x8b, 0x73, 0x45, 0x1f, 0xcb, 0x8a, 0xb8, 0xe3, 0x70, 0x0c, 0x1b, 0x35, 0x47, 0x62, 0xcb, 0x53, 0xa6, 0x59, 0xec, 0x1d, 0xff, 0x6b, 0xa3, 0x77, 0xb4, 0x3f, 0x85, 0xef, 0x2d, 0x73, 0x50, 0xa0, 0x29, 0x98, 0xd9, 0x55, 0x51, 0x7e, 0x46, 0xf2, 0x13, 0xb2, 0x7d, 0x10, 0xad, 0x46, 0xdd, 0xe8, 0x88, 0xd0, 0x2b, 0x72, 0xc8, 0xb5, 0xcf, 0xce, 0x21, 0xa8, 0x40, 0xe2, 0xec, 0x6d, 0xbd, 0x45, 0x7a, 0xe3, 0x3e, 0x5b, 0xa8, 0x41, 0xaa, 0xc2, 0xb3, 0xa0, 0x4a, 0xed, 0x4e, 0xba, 0x7e, 0x0f, 0xf2, 0xf1, 0xae, 0x3b, 0x76, 0x93, 0x84, 0xc9, 0xdf, 0x5c, 0x58, 0xfb, 0x79, 0x3c, 0xec, 0xe1, 0x27, 0x5b, 0x5a, 0x79, 0xf7, 0x5b, 0x4a, 0x1b, 0xf9, 0xdd, 0x68, 0x14, 0x52, 0x46, 0x16, 0x92, 0x8c, 0xc3, 0x5d, 0xc0, 0x30, 0x8a, 0x2a, 0x31, 0x97, 0x63, 0xb7, 0x82, 0xfd, 0x67, 0x47, 0x3b, 0xd7, 0x08, 0x16, 0xf7, 0x66, 0x52, 0x90, 0xc5, 0x8d, 0x71, 0xc1, 0xcd, 0xe0, 0x72, 0x0d, 0x37, 0xfd, 0x4e, 0x21, 0x48, 0x1f, 0x24, 0x29, 0xce, 0xf0, 0xc6, 0x43, 0xbf, 0x9f, 0x77, 0x34, 0x1d, 0x33, 0xf3, 0x5b, 0x1c, 0x1f, 0xb0, 0xe3, 0x87, 0x16, 0x64, 0x3c, 0x60, 0x20, 0xc7, 0xcb, 0xc7, 0xee, 0x9a, 0xe0, 0x1c, 0x6a, 0xe8, 0xe9, 0x68, 0x93, 0x8c, 0xe6, 0xf9, 0x88, 0xf3, 0x1d, 0x4d, 0xe2, 0x23, 0x0f, 0x32, 0x47, 0xfc, 0xaa, 0x2a, 0x3d, 0xbe, 0xc0, 0x14, 0x3b, 0xcc, 0xb8, 0x09, 0x06, 0xb0, 0x84, 0x85, 0x3b, 0x5e, 0xd3, 0xc7, 0x27, 0xbd, 0x87, 0x7a, 0xdf, 0x63, 0x69, 0x94, 0x8d, 0xa0, 0x1b, 0x7f, 0x09, 0xbf, 0x4f, 0x77, 0xa9, 0x88, 0x37, 0x33, 0x59, 0x0a, 0x3c, 0xc7, 0xee, 0x97, 0xf3, 0xc9, 0xb7, 0x0f, 0x4d, 0xb2, 0x55, 0x62, 0x0e, 0x88, 0xcd, 0x50, 0x80, 0xba, 0xdc, 0x73, 0x68, 0x4c, 0x8b, 0x80, 0x39, 0x33, 0x02, 0xca, 0x88, 0x03, 0xa1, 0x07, 0xc0, 0xc7, 0x4d, 0x57, 0x17, 0x30, 0x08, 0x82, 0xc0, 0xf3, 0xc5, 0x81, 0x62, 0x6c, 0x7a, 0x41, 0xca, 0x87, 0x76, 0xa3, 0xdd, 0xe0, 0xf5, 0xc7, 0xd0, 0x29, 0xf2, 0x8a, 0x9b, 0xcd, 0x3c, 0x4d, 0xaa, 0xd2, 0xcc, 0xf9, 0xd6, 0x04, 0x56, 0x3f, 0x95, 0x50, 0x1e, 0x25, 0x6d, 0x6e, 0x0d, 0xbe, 0xaf, 0xc3, 0x04, 0x38, 0x61, 0x85, 0x70, 0x1d, 0x7c, 0x20, 0x1f, 0xd2, 0x58, 0xd8, 0x52, 0x64, 0x64, 0xb0, 0x13, 0x83, 0x1a, 0x8b, 0xc8, 0xcf, 0x32, 0x92, 0x09, 0x53, 0x16, 0xd5, 0xaf, 0x4f, 0x97, 0x35, 0x2d, 0x3b, 0xde, 0x81, 0x24, 0x08, 0xa5, 0xdf, 0x31, 0xa9, 0xa7, 0x6e, 0x0a, 0xd2, 0x54, 0x29, 0xc9, 0x00, 0xca, 0x0f, 0x87, 0xb9, 0x01, 0x81, 0x2d, 0x15, 0x45, 0xeb, 0x87, 0x7d, 0xea, 0xa6, 0x9a, 0xb3, 0x3b, 0x1d, 0x38, 0x12, 0xb3, 0x2f, 0xd1, 0x18, 0x70, 0xd5, 0x8c, 0x21, 0xe4, 0x05, 0x96, 0x75, 0xce, 0xd6, 0xba, 0x85, 0x68, 0xe4, 0x33, 0x72, 0xe2, 0xf6, 0xbe, 0xcf, 0x10, 0xde, 0xf3, 0xa8, 0x60, 0xa1, 0xd4, 0xc3, 0x0e, 0xd8, 0xa7, 0x25, 0x9b, 0x56, 0x01, 0xd8, 0x7b, 0x0b, 0x24, 0xec, 0x0e, 0x28, 0x8a, 0xbc, 0xd1, 0x84, 0xc2, 0x73, 0xd6, 0x3f, 0x7b, 0xce, 0x71, 0xa5, 0xdf, 0x23, 0x35, 0x55, 0x22, 0xa2, 0x1e, 0xa2, 0x5a, 0xdb, 0x10, 0x39, 0x91, 0x80, 0x80, 0x04, 0x18, 0x6c, 0x71, 0x4f, 0x1f, 0xe5, 0xa3, 0x2a, 0x83, 0x1e, 0x07, 0x0e, 0xe7, 0x00, 0x75, 0xc3, 0x06, 0x2a, 0xa1, 0x80, 0x47, 0x37, 0x4c, 0x55, 0x93, 0x3f, 0xb7, 0xc6, 0x63, 0xa0, 0x5d, 0xb9, 0x1d, 0xfe, 0xe1, 0x92, 0xa0, 0x88, 0x46, 0x9c, 0x1d, 0x7d, 0x5e, 0xab, 0x2a, 0xef, 0x85, 0xff, 0x11, 0xc8, 0x8f, 0x6c, 0x6e, 0x0a, 0xfe, 0xb8, 0xf9, 0x5b, 0x78, 0x45, 0xa0, 0xc0, 0x79, 0xef, 0xd9, 0xa9, 0x46, 0x38, 0x36, 0x2e, 0x22, 0xa3, 0x39, 0x98, 0xc3, 0x5d, 0x6b, 0x23, 0x07, 0x22, 0xa8, 0x02, 0xe4, 0x5f, 0xbd, 0xa4, 0x9d, 0x94, 0x35, 0x36, 0x3c, 0xfd, 0x6f, 0x69, 0x3c, 0x71, 0xf4, 0x75, 0x86, 0x8a, 0x08, 0x5e, 0x9f, 0x06, 0x7f, 0x75, 0x1f, 0x6d, 0xd2, 0x23, 0x65, 0xf4, 0x72, 0xe2, 0x89, 0xa2, 0x5c, 0x8c, 0x92, 0xb1, 0xee, 0xd8, 0xe9, 0x37, 0xf9, 0x21, 0x0e, 0x06, 0x17, 0x6a, 0x8a, 0xd0, 0x3f, 0xa0, 0x25, 0x8f, 0x96, 0x1e, 0x58, 0x23, 0x88, 0x77, 0x05, 0x3d, 0x18, 0x6f, 0x66, 0x7d, 0x74, 0x4a, 0x44, 0xd7, 0xcd, 0x4a, 0x69, 0x3b, 0x65, 0x73, 0x57, 0x75, 0xea, 0x91, 0x3a, 0x52, 0x02, 0x7c, 0x1c, 0x04, 0x27, 0x9b, 0x58, 0xc7, 0xb5, 0xa7, 0x51, 0xc5, 0x41, 0xb1, 0x63, 0x37, 0x2d, 0x67, 0x1a, 0xce, 0x79, 0x93, 0xa2, 0x51, 0xdc, 0xe4, 0x7f, 0x87, 0x14, 0xf1, 0x7e, 0x57, 0x7a, 0x7b, 0xec, 0x2e, 0xd9, 0xf2, 0x05, 0xa1, 0x80, 0x3b, 0xaf, 0x54, 0x96, 0xb1, 0x69, 0x1a, 0xae, 0x6a, 0x7e, 0x5d, 0x9b, 0xbb, 0x7e, 0xc1, 0x86, 0xfe, 0xee, 0x04, 0x3e, 0x92, 0x3f, 0x29, 0xce, 0x24, 0xfd, 0xd5, 0x55, 0x2d, 0x49, 0xf9, 0x12, 0xbc, 0x89, 0xb1, 0xbf, 0x76, 0x5e, 0x6c, 0x20, 0xdb, 0xd7, 0x4e, 0xdb, 0xcb, 0xe4, 0xd2, 0x8a, 0x48, 0x0d, 0xb4, 0x0f, 0x7d, 0x63, 0x0e, 0x27, 0xff, 0xb7, 0xc1, 0x43, 0x54, 0x0b, 0x16, 0x93, 0xb2, 0x46, 0xa5, 0x63, 0x08, 0x2c, 0x76, 0xaa, 0x43, 0x8c, 0x67, 0xe0, 0xca, 0xbb, 0xcd, 0x11, 0x4a, 0x42, 0x5e, 0x30, 0xb9, 0xd4, 0x4f, 0xad, 0x95, 0x83, 0xb9, 0x49, 0x6d, 0x33, 0x41, 0x2a, 0xa3, 0x4e, 0xf8, 0x2a, 0x70, 0xb9, 0x80, 0x75, 0x28, 0x07, 0x71, 0x53, 0xc0, 0xed, 0xfa, 0x42, 0x8d, 0xf6, 0xcc, 0x48, 0x4e, 0x78, 0x33, 0x87, 0x6d, 0xc7, 0x86, 0x12, 0x82, 0xa8, 0xc2, 0xff, 0x19, 0x09, 0x72, 0xbe, 0xb5, 0xef, 0xd2, 0xa9, 0x15, 0xaf, 0x33, 0xdb, 0xb5, 0x61, 0xa1, 0x46, 0x98, 0x92, 0xc4, 0x00, 0x45, 0x39, 0x04, 0xde, 0x10, 0xec, 0xf0, 0x44, 0x9a, 0x54, 0xe1, 0x3b, 0x9b, 0xdf, 0xda, 0xc4, 0xdf, 0xb4, 0xb3, 0x6d, 0x8f, 0xec, 0x77, 0x21, 0xb2, 0xff, 0x0a, 0x44, 0xf3, 0x7c, 0x0f, 0x00, 0xa5, 0xfe, 0x08, 0xd9, 0x04, 0x5b, 0xbf, 0x88, 0xbe, 0x1e, 0xe6, 0x06, 0xb2, 0x38, 0xfa, 0xe7, 0xf7, 0xf2, 0x6d, 0xe9, 0x20, 0x26, 0x03, 0xcd, 0xbe, 0xaf, 0x7d, 0x65, 0x27, 0x1e, 0x75, 0xef, 0x76, 0xae, 0x89, 0xa1, 0xd3, 0x7b, 0xbb, 0x85, 0xf5, 0xee, 0x18, 0x87, 0xe4, 0x7c, 0x98, 0xcd, 0x04, 0x90, 0x46, 0x46, 0x4f, 0xc5, 0xa0, 0x86, 0xe2, 0x59, 0x41, 0xd1, 0xbb, 0xdf, 0xbd, 0x75, 0xc1, 0x33, 0xcd, 0x5d, 0x04, 0xb3, 0xac, 0xe4, 0x47, 0xac, 0xc0, 0xe7, 0xbc, 0x13, 0x7d, 0x1e, 0x0e, 0x76, 0x87, 0xac, 0xa4, 0x31, 0x16, 0xf4, 0x25, 0xe5, 0x9f, 0xaf, 0x37, 0x26, 0xb1, 0x3b, 0x8d, 0x74, 0x1d, 0x36, 0x20, 0x6d, 0x59, 0x4c, 0xbc, 0x40, 0x26, 0x4d, 0xbf, 0x65, 0x71, 0x83, 0x1e, 0x8c, 0x77, 0x42, 0xa8, 0xd3, 0x2d, 0xc0, 0x8f, 0x3b, 0xdf, 0x27, 0x24, 0x5d, 0x17, 0xe9, 0xe2, 0x59, 0xc0, 0x54, 0xae, 0x10, 0x8b, 0x66, 0x5d, 0x93, 0x92, 0xe2, 0x77, 0xda, 0x3c, 0xa3, 0x3a, 0xba, 0x60, 0x31, 0xe2, 0x11, 0xad, 0x92, 0x28, 0x44, 0x49, 0x63, 0x09, 0xeb, 0xb8, 0x27, 0xc8, 0xca, 0x00, 0xde, 0x36, 0x04, 0x0a, 0xda, 0x31, 0x8b, 0x4c, 0xce, 0x6b, 0xdb, 0xa5, 0x28, 0x6d, 0xe8, 0x88, 0xa0, 0xdb, 0x54, 0x5d, 0x11, 0xf9, 0xe6, 0x24, 0x88, 0x6e, 0x38, 0x5c, 0x9b, 0x48, 0xaf, 0x23, 0xfd, 0x41, 0xb0, 0x9e, 0x4f, 0x40, 0x11, 0x9b, 0x38, 0x23, 0xce, 0x75, 0xb7, 0xbc, 0xfe, 0x38, 0xb8, 0x19, 0x05, 0x06, 0xe6, 0x09, 0x0a, 0xba, 0xc1, 0xdb, 0xac, 0xca, 0xf0, 0x69, 0xf0, 0x72, 0xd8, 0x56, 0x7e, 0x0f, 0x6d, 0x93, 0x0e, 0xc9, 0x48, 0x28, 0x1d, 0x74, 0xfb, 0x31, 0xe4, 0xb8, 0xa1, 0x26, 0x8a, 0x70, 0xb9, 0x60, 0x99, 0x51, 0x34, 0xd9, 0xaf, 0xcc, 0xcc, 0x34, 0x76, 0x35, 0x98, 0xfd, 0xd5, 0x24, 0xdd, 0x31, 0x68, 0x1c, 0x28, 0x01, 0x2e, 0x6a, 0x99, 0xd3, 0x82, 0x50, 0x82, 0x8a, 0x4d, 0x63, 0x31, 0x07, 0x79, 0x32, 0x09, 0xef, 0xa9, 0x28, 0xd8, 0xaf, 0x27, 0xb4, 0x64, 0xbe, 0x1d, 0xa6, 0x47, 0x22, 0x09, 0xdd, 0xfd, 0x36, 0x6b, 0x1f, 0x3c, 0xaa, 0xc0, 0x48, 0x83, 0xcb, 0xb4, 0xa7, 0xf6, 0x05, 0x94, 0xa5, 0x69, 0xa6, 0x02, 0xa7, 0xbb, 0xe4, 0xec, 0x36, 0x65, 0x22, 0xbf, 0x5e, 0x52, 0x6f, 0xd7, 0x53, 0xf2, 0x50, 0x3b, 0x5b, 0x8a, 0xbf, 0x87, 0xe7, 0xce, 0x73, 0x29, 0x03, 0xb1, 0x62, 0xd0, 0xf1, 0x7c, 0x85, 0x22, 0x11, 0x1d, 0xdb, 0xae, 0x05, 0xc2, 0xb0, 0x21, 0x11, 0xa7, 0x1f, 0xbc, 0xc8, 0x2c, 0xd6, 0x05, 0xe5, 0x2b, 0x19, 0xbd, 0x77, 0x88, 0x0a, 0x13, 0x41, 0x0a, 0x27, 0x17, 0x60, 0x69, 0x14, 0x71, 0x2e, 0xa8, 0x9b, 0x53, 0x67, 0xa4, 0xf1, 0xac, 0x8a, 0xee, 0x3a, 0x9f, 0x82, 0xd6, 0x50, 0x33, 0x86, 0xc8, 0xc0, 0x4c, 0x3e, 0xdc, 0x16, 0xda, 0x27, 0xa8, 0x5b, 0x50, 0x38, 0x59, 0xdb, 0x58, 0xc6, 0x02, 0x2c, 0xc4, 0xa5, 0x33, 0x6b, 0xc8, 0x90, 0xce, 0xc9, 0x67, 0xca, 0x16, 0x46, 0x2c, 0x06, 0x09, 0xbd, 0x1a, 0x85, 0xf0, 0x21, 0xe5, 0x7e, 0x34, 0x06, 0x63, 0xc2, 0x73, 0x63, 0x3d, 0xa0, 0xd3, 0x96, 0xea, 0x06, 0x96, 0xa8, 0xde, 0xea, 0xef, 0xd3, 0xfe, 0xe8, 0x14, 0x41, 0x58, 0x2d, 0x95, 0x17, 0x11, 0x93, 0xec, 0xb2, 0x9e, 0x0d, 0x55, 0x30, 0x37, 0x46, 0xe0, 0x33, 0x89, 0x85, 0xc4, 0xe1, 0xac, 0xd4, 0xf6, 0x30, 0x54, 0x61, 0xfa, 0x60, 0x4b, 0x24, 0xfa, 0xc9, 0x1f, 0xc2, 0x15, 0xd6, 0x18, 0xb2, 0xf9, 0x52, 0x6c, 0x9e, 0xb4, 0xe2, 0xb6, 0x0c, 0xc7, 0xd3, 0xa5, 0x3d, 0x7c, 0x16, 0xf1, 0x55, 0x7a, 0x89, 0x94, 0xbd, 0x97, 0x79, 0x36, 0xc6, 0xed, 0x64, 0xe9, 0x8f, 0x30, 0x03, 0x16, 0x28, 0x3f, 0x87, 0xb7, 0xf7, 0xf8, 0x24, 0xc7, 0x5b, 0x51, 0xcc, 0xf7, 0x90, 0xa4, 0x3d, 0xa3, 0xd3, 0x4b, 0x3d, 0x04, 0xc6, 0x6d, 0x24, 0xa7, 0x15, 0x17, 0x9c, 0x1e, 0x5a, 0x8f, 0xa5, 0xf5, 0x3e, 0xe5, 0xdc, 0xe8, 0xe1, 0xca, 0xfc, 0x52, 0x7d, 0xa5, 0xa5, 0xe9, 0x46, 0xe4, 0x5c, 0xa9, 0x94, 0x90, 0xd4, 0x0e, 0x43, 0x25, 0x6b, 0x86, 0x5a, 0xa0, 0xf8, 0x26, 0xec, 0xd9, 0xc4, 0x9c, 0x3c, 0x13, 0xd6, 0x65, 0x24, 0xd2, 0x74, 0x40, 0xb8, 0xed, 0xe6, 0xe2, 0x26, 0xe3, 0x7d, 0xeb ],
+    const [ 0x02, 0x33, 0xe1, 0xcb, 0x20, 0x16, 0xc8, 0xa4, 0x26, 0x8a, 0x16, 0xfe, 0x8d, 0x3a, 0x98, 0x01, 0x28, 0xba, 0x62, 0x02, 0x4d, 0x1b, 0x13, 0xb1, 0x35, 0xbd, 0x5a, 0x94, 0xa5, 0x65, 0xb9, 0xb4, 0xce, 0x8f, 0x89, 0x96, 0x73, 0x06, 0x3f, 0x6c, 0x49, 0xb1, 0xed, 0x8d, 0xa3, 0xb0, 0x0c, 0x23, 0x4e, 0xa8, 0x78, 0x23, 0xba, 0x5a, 0xbc, 0x83, 0x5b, 0x7b, 0x90, 0xa7, 0x4f, 0xbf, 0xa0, 0x1c, 0x41, 0x38, 0x8f, 0x88, 0x8d, 0xde, 0x3c, 0xe1, 0xa5, 0x6f, 0x44, 0xde, 0xb3, 0x79, 0xc8, 0xab, 0x80, 0xb4, 0x70, 0xe1, 0x94, 0x96, 0xaf, 0xb5, 0x9f, 0x22, 0x49, 0x70, 0x17, 0x01, 0x13, 0x1f, 0x23, 0xd3, 0xfa, 0x8b, 0xb8, 0xc7, 0x47, 0x6b, 0x01, 0x69, 0x22, 0xd9, 0x05, 0xbc, 0x54, 0x03, 0x84, 0x89, 0x51, 0x23, 0x21, 0xf6, 0x75, 0xb1, 0xc7, 0x5a, 0x8e, 0xd6, 0x45, 0x50, 0x9b, 0x25, 0x3b, 0x0b, 0xd3, 0x86, 0x3a, 0xe9, 0xe9, 0x72, 0x27, 0x4a, 0x8f, 0x66, 0xe0, 0xa2, 0x39, 0x91, 0x22, 0xcd, 0x23, 0xd0, 0xab, 0xa3, 0x95, 0xdd, 0x9b, 0xcd, 0x66, 0xc4, 0x20, 0xd7, 0xbf, 0x96, 0x52, 0x85, 0x21, 0x60, 0x5c, 0x6b, 0xa9, 0x5e, 0xdd, 0xb8, 0x93, 0x6d, 0x8e, 0x53, 0xfe, 0xbf, 0x24, 0x29, 0xee, 0xd2, 0x78, 0xc5, 0x97, 0xa3, 0xe5, 0x21, 0xd9, 0x1f, 0xf1, 0xbb, 0x07, 0xda, 0x30, 0xec, 0xec, 0x03, 0x66, 0x75, 0x10, 0x98, 0xec, 0x5b, 0x37, 0xd6, 0x55, 0xf6, 0x2b, 0xf4, 0x50, 0x44, 0xbb, 0x10, 0xd0, 0x83, 0x04, 0x6a, 0x6b, 0xfe, 0xef, 0xd0, 0x00, 0x27, 0xfb, 0x59, 0x9d, 0xe6, 0x3d, 0x56, 0xa0, 0x31, 0xa5, 0x86, 0x1c, 0xdd, 0x82, 0x89, 0x7e, 0xb3, 0x48, 0x97, 0x70, 0xc7, 0x91, 0x72, 0xfd, 0x05, 0x63, 0x99, 0xf6, 0x0d, 0xb1, 0xbf, 0x95, 0x41, 0x24, 0x7b, 0x61, 0x1b, 0x1b, 0x41, 0x51, 0xc5, 0xf0, 0x91, 0x34, 0xe3, 0x7d, 0x6e, 0x50, 0xb3, 0xde, 0x12, 0x4a, 0x59, 0x79, 0xe0, 0x46, 0x74, 0x3c, 0x9a, 0x4e, 0xf5, 0x26, 0xd4, 0xf8, 0x31, 0x09, 0xa9, 0x43, 0x35, 0x8e, 0xac, 0xc3, 0x59, 0x79, 0x21, 0xfe, 0x18, 0x2e, 0x6e, 0x15, 0x1e, 0x74, 0xcc, 0xa7, 0xa3, 0x7a, 0x42, 0xf2, 0xf8, 0x18, 0xd4, 0x3b, 0x5f, 0x56, 0xf8, 0x70, 0x20, 0x32, 0x49, 0x0d, 0xd9, 0x9e, 0x7f, 0x3c, 0x16, 0xc9, 0x9f, 0x40, 0x21, 0x9f, 0x6f, 0x13, 0x1c, 0x93, 0x2d, 0x4e, 0x4c, 0x9c, 0x80, 0x4a, 0xb8, 0x7d, 0xaf, 0x85, 0xf3, 0x4a, 0x11, 0x47, 0x36, 0x28, 0xc5, 0x85, 0xb1, 0x54, 0xa2, 0x05, 0x23, 0x67, 0x71, 0xc3, 0xa9, 0xd8, 0x5a, 0x94, 0xd3, 0xc2, 0x9d, 0x09, 0xfd, 0xe7, 0x83, 0x96, 0xdd, 0xf6, 0x93, 0xf3, 0x58, 0x09, 0x08, 0xc3, 0x9a, 0x72, 0x83, 0x74, 0x65, 0xb7, 0xfe, 0x66, 0xa9, 0xdb, 0x01, 0x4f, 0x56, 0xdf, 0x18, 0xde, 0x6e, 0x89, 0x84, 0x9e, 0x5e, 0x64, 0x31, 0x1e, 0x8e, 0x08, 0xe8, 0x4f, 0x37, 0x9b, 0xc6, 0x2d, 0x75, 0x98, 0xed, 0xa1, 0x9d, 0xcf, 0x79, 0xa6, 0xd0, 0xae, 0xb6, 0xac, 0xd0, 0xbe, 0x90, 0x39, 0x13, 0x70, 0x4a, 0xd6, 0x16, 0x1a, 0x73, 0x29, 0xf4, 0x3d, 0x16, 0x5f, 0x37, 0x09, 0x32, 0xcd, 0xee, 0x23, 0x69, 0xd6, 0x00, 0xa5, 0xfc, 0x0f, 0xbf, 0x67, 0xf7, 0xa1, 0xc0, 0x7d, 0xa9, 0xef, 0xeb, 0x00, 0x57, 0x79, 0xce, 0x12, 0x32, 0x00, 0x36, 0x1c, 0x85, 0xec, 0x01, 0x5a, 0x33, 0xea, 0x2e, 0x9a, 0x61, 0xd9, 0x36, 0x40, 0x70, 0xe7, 0x9f, 0x8e, 0x2e, 0xf7, 0xce, 0x22, 0x4d, 0x47, 0x1d, 0xc0, 0x14, 0x4f, 0x2d, 0x52, 0x54, 0xec, 0x7e, 0x2d, 0x9e, 0xbd, 0x3c, 0x96, 0xb3, 0xcd, 0x5c, 0x85, 0x3c, 0x73, 0xe8, 0xa9, 0xbb, 0x77, 0x97, 0xab, 0xc2, 0x76, 0xa1, 0xb7, 0x63, 0x88, 0xd1, 0x39, 0xe7, 0x1f, 0xdc, 0xe4, 0xc2, 0x33, 0xf1, 0xf9, 0xc7, 0x9c, 0x91, 0xc6, 0x99, 0xbf, 0xa1, 0x6d, 0x62, 0x6c, 0xbe, 0xe6, 0xc7, 0x07, 0xd0, 0x47, 0x1b, 0xe6, 0xe2, 0x43, 0xd2, 0xfb, 0x31, 0xf1, 0x39, 0xb3, 0x82, 0xcf, 0x65, 0x1d, 0xb9, 0x07, 0x69, 0x4f, 0xa8, 0xf1, 0xcd, 0x06, 0x25, 0xd8, 0x3b, 0x8c, 0x5f, 0x01, 0x7a, 0xdf, 0x72, 0xe9, 0xa1, 0x0f, 0x38, 0xcf, 0x84, 0xe8, 0x62, 0x72, 0x73, 0xd1, 0xc8, 0x1c, 0x24, 0xf4, 0xfe, 0xdf, 0xed, 0x9f, 0x28, 0x1f, 0x36, 0xea, 0x0f, 0x51, 0x2f, 0x9b, 0x74, 0x01, 0xbe, 0x46, 0xa4, 0x1a, 0xbc, 0xb9, 0x4c, 0x62, 0x60, 0x97, 0x8f, 0x44, 0xfb, 0x42, 0x56, 0xd2, 0xe6, 0xfe, 0xe7, 0x0a, 0xb9, 0x54, 0xba, 0x58, 0xbe, 0xb5, 0x87, 0x5d, 0xa6, 0x60, 0xa4, 0xef, 0x7a, 0x86, 0x8e, 0x61, 0xd4, 0xab, 0xc6, 0x04, 0x4e, 0x4f, 0xde, 0xed, 0x3b, 0xce, 0xd3, 0xf9, 0x95, 0x85, 0x9d, 0x0f, 0x37, 0x36, 0x05, 0xa5, 0x4c, 0xad, 0xb7, 0x86, 0x08, 0xa4, 0x98, 0xd2, 0x96, 0xe5, 0x59, 0x46, 0x51, 0xae, 0x4d, 0xbd, 0x36, 0x59, 0x77, 0xf7, 0x99, 0x3c, 0xe8, 0x9a, 0x18, 0xcf, 0x48, 0x76, 0xce, 0x0c, 0xb2, 0x0d, 0xc9, 0x1c, 0xc5, 0x53, 0xbd, 0x2f, 0xf7, 0xb2, 0xf9, 0xac, 0x2d, 0x51, 0x9b, 0x8a, 0x89, 0x96, 0x00, 0xfd, 0x83, 0xea, 0x7f, 0x56, 0x3c, 0xbc, 0x57, 0x24, 0x0e, 0xc8, 0xe5, 0xa0, 0x68, 0x99, 0x1b, 0x48, 0xd9, 0x4c, 0x2d, 0xc9, 0x6a, 0x98, 0x8d, 0x22, 0x31, 0x0b, 0x1a, 0x07, 0x23, 0x96, 0x95, 0x83, 0x2a, 0x4c, 0x54, 0xe2, 0x78, 0x67, 0x3a, 0xce, 0x1a, 0x8c, 0xe6, 0xb8, 0xd0, 0x50, 0x2b, 0x7a, 0x1c, 0xfa, 0xc0, 0x3a, 0x99, 0x8a, 0x39, 0x91, 0x8e, 0xfb, 0x36, 0xec, 0xc3, 0xc6, 0xdb, 0x33, 0x93, 0xa7, 0x80, 0xa9, 0x43, 0xa3, 0xa9, 0x14, 0x92, 0x4a, 0x38, 0x1d, 0x91, 0x3a, 0xe1, 0xf9, 0xb5, 0xe4, 0xdf, 0x49, 0x2b, 0x93, 0xe5, 0x3f, 0x6b, 0xaa, 0x58, 0x03, 0x10, 0x2c, 0xbb, 0x55, 0xe7, 0x82, 0x6b, 0x73, 0x46, 0x79, 0x8c, 0x3d, 0x9f, 0x8b, 0x43, 0x97, 0x54, 0x5f, 0x25, 0x0f, 0xcd, 0x93, 0xf0, 0xc0, 0xc9, 0xb8, 0x79, 0x75, 0xf1, 0x9e, 0xe6, 0x12, 0xb3, 0xd2, 0x1d, 0x30, 0x4d, 0x66, 0x7d, 0x08, 0x28, 0xf0, 0xcb, 0x92, 0x68, 0xd5, 0x6f, 0xee, 0xc1, 0xc8, 0xe0, 0x02, 0x8c, 0x8d, 0x5d, 0x65, 0x1a, 0x03, 0xde, 0x7b, 0x48, 0x61, 0x4a, 0xe2, 0x53, 0xc0, 0xea, 0x0d, 0xee, 0xda, 0x1e, 0x2f, 0x92, 0x11, 0x4e, 0x5b, 0x16, 0xb3, 0x24, 0xe9, 0x7f, 0x7c, 0xf8, 0x1b, 0x19, 0x5c, 0x8c, 0x01, 0xc7, 0x7b, 0xfa, 0x99, 0x97, 0x7b, 0xea, 0x3b, 0x99, 0xfd, 0x08, 0x34, 0xf2, 0x66, 0xb6, 0xb2, 0x2c, 0xe3, 0xfd, 0xe0, 0xd0, 0xaa, 0xca, 0x51, 0x37, 0x83, 0x57, 0xa2, 0x9d, 0x87, 0xe7, 0x5b, 0x77, 0x28, 0xb6, 0x17, 0x06, 0x72, 0x30, 0xe5, 0x2d, 0x91, 0x61, 0xed, 0x80, 0x92, 0xad, 0x57, 0x9d, 0x6e, 0xc1, 0x68, 0xbf, 0x44, 0xc9, 0xee, 0x90, 0xe6, 0xe3, 0xdf, 0x3f, 0x97, 0xd4, 0x3d, 0xd3, 0x13, 0xfb, 0x3c, 0xbf, 0xd0, 0x83, 0xa7, 0xb6, 0x84, 0xdc, 0x80, 0xc0, 0xe7, 0x6b, 0xe7, 0x8e, 0xba, 0x80, 0x3c, 0x0a, 0x08, 0x89, 0x88, 0x33, 0xac, 0x86, 0x19, 0x28, 0x13, 0xbd, 0x6d, 0x82, 0x43, 0xaf, 0x52, 0xe7, 0x1c, 0x4a, 0x4a, 0xdd, 0xde, 0x60, 0x34, 0xdb, 0xec, 0x58, 0x29, 0xa6, 0xd0, 0x24, 0xa5, 0xdb, 0x7e, 0x73, 0xe7, 0xc7, 0xdd, 0x27, 0x9a, 0x7f, 0x83, 0x09, 0xb4, 0x2d, 0xc0, 0xbb, 0x9f, 0xa9, 0xdf, 0xef, 0x97, 0x49, 0xa8, 0xd7, 0x53, 0xf9, 0x2a, 0xdc, 0xe7, 0x8e, 0xb7, 0x93, 0xe9, 0x57, 0x2f, 0xed, 0xd2, 0xf5, 0x82, 0xae, 0xa8, 0x6d, 0x70, 0x20, 0xda, 0x7c, 0x93, 0x08, 0x6c, 0x2b, 0xa0, 0xd9, 0x53, 0xa2, 0xea, 0x28, 0x23, 0x41, 0x27, 0x60, 0xe7, 0xed, 0x77, 0xb7, 0x50, 0xa8, 0xa2, 0x60, 0x13, 0x65, 0xa1, 0x02, 0x8c, 0x1a, 0x61, 0x6a, 0xa7, 0x16, 0xc3, 0x7d, 0x00, 0x95, 0xe7, 0x70, 0x49, 0x92, 0xaa, 0x3b, 0xed, 0xdc, 0x6d, 0x4a, 0xf2, 0x6c, 0x19, 0x76, 0x24, 0xf6, 0x5f, 0x35, 0x70, 0xbe, 0x45, 0x0d, 0x8e, 0xad, 0xde, 0x4f, 0xe3, 0xa4, 0x58, 0x01, 0xa5, 0x10, 0x3d, 0x1c, 0x40, 0xbf, 0xf2, 0xf8, 0xf8, 0xf2, 0x84, 0x04, 0xd0, 0xb3, 0xa3, 0xba, 0xab, 0x68, 0xef, 0xd2, 0xb2, 0xa9, 0x73, 0xb6, 0xf5, 0x4f, 0x6f, 0x37, 0x55, 0xcd, 0x5b, 0x7e, 0xa1, 0xc4, 0x28, 0x45, 0xff, 0xd1, 0xc9, 0x47, 0x8e, 0xaa, 0xf2, 0xf4, 0x49, 0x69, 0x20, 0x6a, 0x2f, 0x27, 0xd9, 0xa1, 0xa1, 0xcd, 0x35, 0xe5, 0x0b, 0x27, 0x9d, 0x8a, 0xc6, 0x3a, 0xd3, 0xdb, 0x3d, 0xd8, 0x32, 0x53, 0x4f, 0x71, 0x38, 0x10, 0xf5, 0x2c, 0x41, 0x84, 0x25, 0x36, 0x95, 0x6e, 0xf6, 0x5a, 0xa5, 0x08, 0x04, 0xd3, 0x92, 0x82, 0x16, 0x5e, 0xef, 0xb0, 0xfe, 0x93, 0xc8, 0x00, 0xc1, 0x74, 0xe3, 0xae, 0xf8, 0x47, 0x45, 0x3b, 0x76, 0xa1, 0xf8, 0x1b, 0x2b, 0xc4, 0x0c, 0xae, 0x48, 0x2a, 0xdc, 0x71, 0xa4, 0x62, 0x93, 0x76, 0x5f, 0x1b, 0xee, 0x11, 0xc5, 0x7f, 0x43, 0xd5, 0x75, 0xc2, 0xc2, 0xbe, 0xc2, 0xfa, 0xfb, 0xb0, 0x59, 0x31, 0xa0, 0x20, 0x24, 0xb8, 0x8c, 0x11, 0x6f, 0xbf, 0x05, 0x43, 0x4a, 0x23, 0x3e, 0xa7, 0x2e, 0x87, 0x20, 0x15, 0xe3, 0xa6, 0x4a, 0x41, 0xa0, 0xe7, 0x57, 0xec, 0x75, 0x33, 0x5f, 0x57, 0xe6, 0x03, 0xc0, 0xfd, 0xd9, 0xbd, 0x1e, 0x81, 0xb2, 0x40, 0xa8, 0xe6, 0xbc, 0xbd, 0x9d, 0xfe, 0xcb, 0xca, 0x0f, 0x25, 0x1f, 0xb1, 0xe8, 0x2f, 0x8c, 0x0e, 0x2a, 0x9e, 0xd8, 0x99, 0x7b, 0x18, 0x65, 0x40, 0xe0, 0x19, 0x0f, 0x79, 0xc9, 0xe6, 0x58, 0xd6, 0x4e, 0xc2, 0xc3, 0xd9, 0xb8, 0x63, 0x7d, 0x0b, 0x43, 0xa7, 0x42, 0x48, 0x22, 0x84, 0x7f, 0x5d, 0xc4, 0x3d, 0xb4, 0xd5, 0x56, 0xdc, 0x1d, 0x0f, 0x89, 0xdc, 0x91, 0x94, 0x95, 0x26, 0xaa, 0xa8, 0x7e, 0x3f, 0x26, 0x1f, 0x95, 0xbf, 0x8d, 0x72, 0x43, 0x05, 0x14, 0x12, 0x02, 0x29, 0xc2, 0xfc, 0xac, 0x32, 0xd1, 0x8e, 0xf8, 0x89, 0x57, 0x99, 0x41, 0xae, 0x26, 0xb7, 0x8a, 0x2a, 0xf0, 0xdf, 0xc0, 0xc5, 0xaf, 0x36, 0x3e, 0xf8, 0x43, 0x28, 0x97, 0xa5, 0x5d, 0xb8, 0x8f, 0x06, 0x9d, 0x14, 0x6a, 0xe4, 0xf7, 0x6d, 0x6a, 0x09, 0x5b, 0x05, 0x93, 0xf7, 0x95, 0x8a, 0xb1, 0xda, 0x72, 0xa2, 0x9c, 0xbc, 0x24, 0xc7, 0xbb, 0xf8, 0xe7, 0x55, 0xc7, 0xf1, 0xe5, 0xe1, 0xd1, 0x03, 0x57, 0xcd, 0x87, 0xba, 0xee, 0x19, 0xb3, 0x42, 0x71, 0x7c, 0x04, 0x1f, 0xa7, 0xb4, 0x11, 0x1e, 0x77, 0x1a, 0x9b, 0x8c, 0x4e, 0x79, 0x12, 0xa5, 0xc1, 0x20, 0x5b, 0x4f, 0x74, 0x36, 0xd1, 0x09, 0x3a, 0x4e, 0x8a, 0x1e, 0x7d, 0x3b, 0xdb, 0x1e, 0xe1, 0x26, 0x1e, 0x8e, 0x24, 0xde, 0xb2, 0xdf, 0x49, 0x6e, 0x44, 0x9d, 0xf5, 0xf5, 0x4d, 0xe9, 0x19, 0xb2, 0xdc, 0x29, 0xd1, 0x5f, 0x96, 0xfe, 0x8c, 0xc0, 0xfb, 0x77, 0x6e, 0x7b, 0xeb, 0x84, 0xf2, 0x2a, 0x68, 0xad, 0xd4, 0xaf, 0x9d, 0x03, 0x2e, 0xc7, 0x1f, 0x57, 0xe1, 0xe3, 0x74, 0xab, 0x36, 0x33, 0xd2, 0xe6, 0xc5, 0x03, 0x28, 0xcc, 0x96, 0x4a, 0x63, 0x2c, 0x87, 0x80, 0xea, 0x5b, 0xed, 0xb1, 0x6a, 0xe2, 0x7e, 0xd0, 0xd9, 0x74, 0x6f, 0x4d, 0xb5, 0x23, 0xd9, 0xe9, 0x8d, 0xd3, 0x61, 0xca, 0xc3, 0xee, 0x18, 0xca, 0x90, 0x59, 0xa0, 0x15, 0x48, 0xa7, 0x91, 0xf3, 0xe0, 0x8d, 0x1a, 0xe2, 0xad, 0x96, 0xec, 0xe8, 0x6e, 0x18, 0x53, 0x27, 0x8d, 0x67, 0xa6, 0xb2, 0xa2, 0x48, 0xe2, 0x9f, 0x39, 0xa9, 0x92, 0x5e, 0xd5, 0x8f, 0xf2, 0x49, 0x35, 0x4f, 0x53, 0x7b, 0xd5, 0x01, 0xc1, 0xe6, 0xb8, 0x32, 0xe4, 0xa0, 0x65, 0xd9, 0x24, 0x7e, 0x30, 0x8c, 0x10, 0xe4, 0xba, 0xf4, 0x01, 0xdb, 0xbb, 0x7f, 0xfa, 0x64, 0xff, 0x54, 0xd3, 0x0d, 0xaf, 0x8c, 0x97, 0xc1, 0xd2, 0x9f, 0x2a, 0xe4, 0x13, 0x1c, 0x2f, 0xa0, 0xc5, 0x9e, 0x28, 0x79, 0x24, 0xfb, 0xdf, 0x28, 0xde, 0xbe, 0x06, 0xa6, 0xd2, 0xd8, 0x1a, 0x87, 0x17, 0x92, 0x8d, 0x89, 0x40, 0xc6, 0x23, 0x6d, 0xde, 0x4f, 0x9d, 0x05, 0x47, 0xbe, 0x95, 0x8f, 0x96, 0x4e, 0xa9, 0x41, 0xf3, 0x1b, 0xdb, 0x25, 0x15, 0x8e, 0x38, 0x27, 0x04, 0x1c, 0xb8, 0x6d, 0x24, 0x30, 0x66, 0xe6, 0x6f, 0x65, 0xc0, 0x26, 0x02, 0xf9, 0x61, 0x71, 0xdb, 0x7f, 0xdd, 0x15, 0xe1, 0xd3, 0xed, 0xfd, 0x24, 0x53, 0xcc, 0x84, 0x67, 0x4c, 0xe0, 0x87, 0xdc, 0xb3, 0x9d, 0xbe, 0x2e, 0x16, 0xa7, 0x4c, 0xc4, 0xd1, 0x36, 0x94, 0x45, 0x85, 0xbf, 0x4f, 0x57, 0xc6, 0xd1, 0xdb, 0xad, 0x14, 0x3d, 0xd6, 0x40, 0x0d, 0x79, 0xec, 0xdc, 0xe0, 0x46, 0xed, 0xdf, 0x05, 0x91, 0x23, 0x3e, 0x2c, 0x97, 0xe2, 0xc8, 0x73, 0x4d, 0x60, 0xaf, 0xdb, 0xff, 0xc7, 0x44, 0xfd, 0x37, 0x89, 0x02, 0xf9, 0xe0, 0xf4, 0xce, 0xb0, 0xab, 0x06, 0x7d, 0x33, 0xb2, 0x82, 0x97, 0x7a, 0x5c, 0x43, 0x5a, 0x5a, 0x80, 0xd1, 0x02, 0xb1, 0xcd, 0x32, 0x48, 0xe4, 0x69, 0x03, 0x29, 0x8b, 0xd8, 0xc7, 0xe8, 0x6a, 0x20, 0x7e, 0x56, 0xa4, 0x2a, 0x7a, 0x51, 0x2b, 0x6c, 0x6e, 0x8b, 0x7b, 0xc5, 0xc8, 0x8d, 0x88, 0xa8, 0x40, 0xfb, 0xf4, 0x7d, 0xb1, 0x19, 0x86, 0x44, 0x28, 0x8e, 0xd8, 0x7c, 0x3b, 0x68, 0x4f, 0x43, 0x9d, 0x61, 0x50, 0xbe, 0xef, 0x60, 0xb1, 0xbb, 0xd8, 0x43, 0x6e, 0x95, 0x57, 0xdc, 0x9e, 0x58, 0x58, 0x39, 0xa5, 0x26, 0x86, 0x29, 0xaa, 0xda, 0x61, 0xfb, 0x4c, 0xea, 0x90, 0x89, 0x90, 0x92, 0x78, 0x76, 0x1e, 0x2f, 0x0d, 0xb3, 0xae, 0xe9, 0xe8, 0x48, 0xbd, 0x94, 0x9b, 0x51, 0x84, 0xd8, 0x41, 0x46, 0x2a, 0x90, 0x59, 0x80, 0x39, 0x71, 0xd4, 0xf9, 0x4f, 0xec, 0x6c, 0x54, 0x16, 0x55, 0x38, 0x1d, 0x75, 0x44, 0x7d, 0x51, 0x08, 0x3c, 0xc8, 0x21, 0xce, 0x8a, 0x39, 0xf3, 0x22, 0x70, 0x22, 0xaa, 0xed, 0x83, 0xd1, 0x27, 0x19, 0x52, 0xa9, 0x0f, 0x49, 0x48, 0x78, 0xcf, 0xc7, 0xd4, 0x04, 0xde, 0xbd, 0xc6, 0xe7, 0x42, 0xa9, 0xfd, 0x9d, 0x56, 0x0b, 0x3f, 0xdc, 0xca, 0x60, 0x68, 0x23, 0xeb, 0x54, 0xc7, 0x96, 0x25, 0x34, 0xc5, 0x09, 0xc6, 0xa2, 0xc7, 0x5b, 0x04, 0x8c, 0x56, 0x05, 0x42, 0x5f, 0x7e, 0xf2, 0x8f, 0x77, 0x73, 0x92, 0x70, 0xdb, 0x7b, 0x2a, 0xdf, 0x27, 0x07, 0x6e, 0x93, 0xc9, 0x23, 0x51, 0x82, 0x70, 0x11, 0x1c, 0xa5, 0xc2, 0x31, 0xbd, 0xfb, 0x4e, 0x25, 0x62, 0xd0, 0xc1, 0x31, 0x47, 0x3f, 0x5c, 0xe8, 0xcc, 0xf6, 0xa5, 0x05, 0xcb, 0x39, 0x5d, 0x97, 0x28, 0x2a, 0xb3, 0x61, 0xaa, 0x47, 0xb7, 0x80, 0x09, 0x34, 0x11, 0x4e, 0x48, 0xbb, 0xf3, 0x87, 0x44, 0x11, 0x4c, 0xaa, 0x8e, 0x5a, 0x3f, 0xa2, 0x76, 0x70, 0xd3, 0xa6, 0x68, 0xe0, 0xec, 0x5e, 0x7c, 0x36, 0x7a, 0x47, 0x48, 0x7b, 0xf0, 0x58, 0xf9, 0xfb, 0xf8, 0xe6, 0xa2, 0x4c, 0x64, 0xc5, 0xd3, 0x8b, 0x68, 0xb0, 0x6e, 0xe9, 0x07, 0xea, 0xb6, 0x66, 0xcc, 0x26, 0xa9, 0xdd, 0xba, 0xa5, 0x90, 0x41, 0x85, 0x9e, 0xd4, 0x26, 0x03, 0xe2, 0x13, 0x83, 0xdd, 0xc0, 0x73, 0xb6, 0x8a, 0x26, 0x36, 0xc8, 0x7e, 0x0a, 0x8f, 0xf3, 0x9e, 0x08, 0xb4, 0x61, 0xf8, 0x4d, 0x35, 0x37, 0xb1, 0xb3, 0x8c, 0xd2, 0x3e, 0x2d, 0xf5, 0x50, 0xd7, 0x66, 0x80, 0x53, 0x29, 0xa5, 0x64, 0x01, 0x4c, 0xf4, 0x96, 0x50, 0xf4, 0x81, 0x9a, 0x80, 0xeb, 0x44, 0x9a, 0xe9, 0xbf, 0xe2, 0xb5, 0xf6, 0xb8, 0xd2, 0x99, 0x72, 0x0c, 0xbe, 0x54, 0x02, 0x56, 0x2c, 0x67, 0xf3, 0x45, 0x5d, 0x1c, 0x36, 0x91, 0x75, 0x1a, 0xa9, 0x34, 0xdd, 0x37, 0x99, 0xd6, 0xe6, 0x8d, 0x84, 0x89, 0xaf, 0xd0, 0x23, 0xb6, 0x48, 0xdf, 0xa7, 0x57, 0x17, 0x98, 0x44, 0x67, 0x7b, 0xf1, 0xec, 0x97, 0xb0, 0x44, 0x5d, 0x43, 0xf3, 0xeb, 0x5d, 0xa4, 0xe6, 0x0d, 0x44, 0x47, 0x35, 0xb7, 0xbc, 0xbe, 0x7a, 0x2f, 0xc5, 0x95, 0x5e, 0x85, 0xfc, 0x88, 0x01, 0x6a, 0x1c, 0xf2, 0x9d, 0x45, 0xc5, 0x89, 0x66, 0x84, 0x7c, 0x49, 0xb4, 0x30, 0xf4, 0xae, 0x63, 0xc5, 0x8b, 0x26, 0x7a, 0x40, 0x18, 0xc6, 0x0c, 0x79, 0xe4, 0x3c, 0x5c, 0xb3, 0xf6, 0x05, 0x44, 0x72, 0x94, 0xe0, 0xd8, 0x8d, 0x06, 0x82, 0x46, 0x83, 0x9d, 0x8b, 0x01, 0x12, 0xf4, 0xb9, 0x1e, 0x06, 0x76, 0x5b, 0xfe, 0x50, 0x20, 0x09, 0x2d, 0x57, 0x88, 0x93, 0x8a, 0x93, 0x1f, 0x37, 0xa8, 0x57, 0xb3, 0x17, 0x75, 0xee, 0x38, 0xea, 0x19, 0xea, 0xc7, 0xf1, 0x21, 0xb9, 0xe7, 0x2c, 0xdd, 0x79, 0x0c, 0xcf, 0x06, 0x0d, 0x5d, 0xf0, 0xa4, 0x71, 0xba, 0x82, 0x2f, 0x4a, 0xfe, 0x86, 0xf5, 0xc2, 0x81, 0x80, 0xbb, 0x92, 0xe2, 0x28, 0xa7, 0x60, 0x03, 0x63, 0x5e, 0x4c, 0x54, 0x71, 0x69, 0xc6, 0x55, 0x68, 0xdd, 0xa2, 0x56, 0xe1, 0x3b, 0x6e, 0x81, 0xf1, 0x95, 0x03, 0x1b, 0x5b, 0xf2, 0x5a, 0x07, 0x03, 0xf4, 0xa1, 0x8c, 0xa6, 0xb8, 0x8e, 0x58, 0xc9, 0xfe, 0xf4, 0xc4, 0xef, 0x8a, 0x94, 0x59, 0x0f, 0xca, 0x35, 0x93, 0x45, 0xb8, 0xf7, 0xe6, 0xc8, 0x02, 0xe4, 0xff, 0x1c, 0x68, 0xc8, 0x4c, 0x89, 0x66, 0x42, 0xbe, 0xcb, 0x14, 0x1c, 0xce, 0x0b, 0x4a, 0xd8, 0xbe, 0x0e, 0x07, 0x8b, 0x21, 0xad, 0x14, 0xef, 0x9d, 0x85, 0xe4, 0xb3, 0xf0, 0xef, 0xbf, 0x15, 0x31, 0x33, 0x20, 0xb3, 0x58, 0xf8, 0x5b, 0x9e, 0x01, 0xff, 0x82, 0xb1, 0x6d, 0x11, 0x8a, 0x21, 0xca, 0x36, 0xaa, 0x54, 0xb4, 0x28, 0x04, 0xf7, 0xfb, 0x07, 0x87, 0x4b, 0xa7, 0x4e, 0x14, 0xbf, 0x39, 0x06 ],
+    const [ 0x03, 0xd1, 0x46, 0x76, 0xac, 0x6a, 0xfd, 0x0e, 0xec, 0xd6, 0x7c, 0x8e, 0xbb, 0xb6, 0x2e, 0xbe, 0x95, 0x2d, 0xfc, 0xf9, 0x35, 0x95, 0x29, 0x84, 0xa1, 0x71, 0x7a, 0x1e, 0x66, 0xa3, 0x9b, 0xd8, 0x25, 0xe0, 0xbe, 0x27, 0x4e, 0x60, 0x85, 0x38, 0x2c, 0xda, 0x22, 0x83, 0x22, 0xaf, 0xbd, 0xa3, 0x34, 0x66, 0x15, 0x65, 0xc8, 0x58, 0x6b, 0x1f, 0xae, 0xac, 0x9c, 0x43, 0x5f, 0x86, 0x8d, 0x33, 0x82, 0x7c, 0xcb, 0x57, 0xb5, 0x4a, 0x73, 0x6e, 0x89, 0xc6, 0x50, 0x21, 0xce, 0x16, 0x44, 0xde, 0x12, 0x20, 0xe9, 0xe3, 0x64, 0x42, 0x77, 0x99, 0x5e, 0x43, 0xe9, 0x24, 0x62, 0x8a, 0x5b, 0x38, 0x23, 0x8e, 0xb7, 0x2e, 0x67, 0x8e, 0x90, 0x57, 0x0c, 0x82, 0x4e, 0x90, 0x49, 0x51, 0x8c, 0x16, 0x37, 0x44, 0xbe, 0x9c, 0x90, 0xbb, 0x17, 0x9b, 0xb6, 0x1f, 0xaa, 0xea, 0xf7, 0x17, 0xcf, 0x8e, 0x0f, 0xff, 0xc8, 0xd3, 0xee, 0x96, 0xa4, 0x9c, 0xbc, 0xf6, 0x64, 0xf7, 0x1b, 0xca, 0x5d, 0xf4, 0xac, 0xbb, 0xdd, 0xb8, 0xd4, 0x2b, 0x11, 0xcd, 0xc0, 0x26, 0x26, 0xbc, 0xa6, 0x95, 0xaf, 0xde, 0x4e, 0xb5, 0x47, 0x6f, 0xd2, 0xc8, 0x77, 0xe4, 0xa2, 0x0b, 0xda, 0x7e, 0xca, 0xe7, 0x7e, 0x20, 0x78, 0x6b, 0x8e, 0x5e, 0xb8, 0xfa, 0x2e, 0xd6, 0x83, 0x41, 0xa7, 0xc3, 0xf8, 0x6c, 0xc4, 0xcf, 0xe9, 0x9a, 0x7c, 0x29, 0x99, 0x8e, 0xd0, 0xd8, 0xc4, 0xa7, 0xf7, 0x4f, 0xe0, 0x12, 0xb9, 0x41, 0xa3, 0x3e, 0x19, 0xb6, 0xc5, 0x90, 0x36, 0x5f, 0x07, 0x59, 0x73, 0x26, 0x74, 0x05, 0xd6, 0x0a, 0xe7, 0x95, 0xae, 0x2a, 0xcd, 0x4f, 0x79, 0x1f, 0x2c, 0xb3, 0x04, 0x8f, 0xe5, 0xb2, 0xd4, 0xff, 0x36, 0x1b, 0xc5, 0xe9, 0x82, 0x56, 0xf1, 0x0f, 0x55, 0x54, 0xd3, 0x0e, 0xa3, 0xc6, 0xad, 0x36, 0x50, 0x8d, 0x26, 0x99, 0xf5, 0x72, 0x38, 0x62, 0xe2, 0x18, 0x49, 0x69, 0x5f, 0x2e, 0x98, 0x04, 0x38, 0xe9, 0xdb, 0x1f, 0x78, 0xb2, 0x27, 0x8f, 0x74, 0x1c, 0x0f, 0xa3, 0x0b, 0x18, 0x10, 0xfc, 0x2d, 0x6c, 0x2d, 0x9f, 0x9a, 0x61, 0xd6, 0x49, 0xec, 0xbc, 0x0e, 0x03, 0xd8, 0xf0, 0xcd, 0xf5, 0xb1, 0x92, 0xa3, 0x7f, 0x2d, 0x0d, 0x9f, 0x86, 0x6c, 0x97, 0x6f, 0x0c, 0x36, 0x64, 0xc8, 0x04, 0x85, 0x19, 0x09, 0x64, 0x43, 0x83, 0x1b, 0x7b, 0x54, 0x89, 0x9b, 0x85, 0xd7, 0x5f, 0x3b, 0x7d, 0xa9, 0xfd, 0x65, 0x32, 0x2b, 0xd0, 0x22, 0x9d, 0x46, 0xaf, 0x3b, 0x72, 0xac, 0x10, 0x9e, 0xf5, 0x60, 0x7c, 0x02, 0x0f, 0x78, 0x40, 0xce, 0xa1, 0x22, 0x66, 0x37, 0x18, 0xe5, 0xe3, 0xa9, 0x42, 0x29, 0x12, 0x69, 0x60, 0xfa, 0x61, 0x78, 0x7c, 0x09, 0x4b, 0xba, 0xfc, 0xf3, 0x86, 0x57, 0x78, 0xc6, 0x7d, 0x62, 0xc9, 0xc2, 0x00, 0xb9, 0x62, 0x5c, 0x3a, 0x2c, 0xe4, 0x89, 0xe4, 0xe1, 0xec, 0x38, 0xb9, 0xf6, 0x2f, 0x20, 0x2a, 0x69, 0xca, 0xbd, 0x52, 0x35, 0xd3, 0x95, 0x2c, 0xbe, 0x34, 0xc0, 0x04, 0x6f, 0xb9, 0xa7, 0x2b, 0xa2, 0x67, 0x0c, 0xef, 0xc0, 0x10, 0x4b, 0xca, 0xa9, 0x24, 0xdf, 0xda, 0x56, 0xca, 0x27, 0x91, 0xbd, 0x2f, 0x6a, 0xae, 0xf4, 0x1e, 0x1a, 0x6c, 0x9a, 0xd2, 0x55, 0xf9, 0x73, 0x08, 0xb1, 0x29, 0x52, 0x58, 0x39, 0x6c, 0x3c, 0xc4, 0xb3, 0xfe, 0xca, 0x92, 0x25, 0x5d, 0xcf, 0x57, 0x97, 0x00, 0x3b, 0x55, 0x19, 0x46, 0x3f, 0x06, 0x08, 0xad, 0xb2, 0xf9, 0x8e, 0x44, 0xb4, 0xdd, 0x68, 0x63, 0x91, 0xdc, 0xec, 0x99, 0xe8, 0x2a, 0x4a, 0xe6, 0x0c, 0xdd, 0x12, 0x2a, 0xaa, 0xff, 0xf6, 0xde, 0xac, 0xe1, 0xd2, 0x02, 0x5e, 0xb3, 0xe9, 0x56, 0xcf, 0x52, 0x71, 0xcd, 0x7b, 0x61, 0x53, 0x3f, 0x26, 0x9b, 0x2c, 0x5e, 0x0b, 0x67, 0x97, 0xeb, 0x36, 0xad, 0xae, 0x2a, 0x2f, 0xe9, 0xce, 0x93, 0xd8, 0x7e, 0x9b, 0xca, 0x98, 0x4c, 0x44, 0xd1, 0xb9, 0x84, 0x09, 0x7d, 0x0f, 0xbb, 0xfa, 0x26, 0xdb, 0x3e, 0x01, 0xa3, 0xee, 0xa6, 0x22, 0x75, 0x12, 0xac, 0x02, 0x43, 0xa5, 0x3e, 0xa6, 0x87, 0x87, 0xd2, 0x7e, 0x86, 0x37, 0xfa, 0xa2, 0x85, 0x38, 0x38, 0x5b, 0x3a, 0xba, 0x14, 0xe5, 0x81, 0x76, 0x6d, 0x73, 0x50, 0xda, 0x0d, 0x74, 0xed, 0x66, 0x80, 0x15, 0x5e, 0x56, 0x25, 0x07, 0x22, 0x81, 0x85, 0x82, 0x1e, 0x81, 0xe4, 0x8a, 0xda, 0x14, 0x16, 0x71, 0xed, 0xc2, 0x94, 0x9d, 0xb6, 0xc0, 0xcf, 0x8b, 0x4d, 0x15, 0xc4, 0x14, 0xb9, 0xfb, 0xd1, 0xef, 0x64, 0x88, 0xc7, 0x78, 0xcc, 0x8d, 0x40, 0xaf, 0x7a, 0xbf, 0x33, 0x84, 0x38, 0x14, 0xc5, 0x52, 0x7f, 0x70, 0x62, 0xa9, 0x2f, 0x81, 0x0d, 0x50, 0x82, 0xe7, 0xf4, 0x8a, 0x43, 0x99, 0x48, 0x99, 0x3b, 0x84, 0x4b, 0x81, 0xed, 0x75, 0xab, 0x0e, 0x83, 0x38, 0x0e, 0x18, 0x07, 0x02, 0xee, 0x06, 0xd6, 0x0c, 0xa7, 0x91, 0x52, 0x81, 0xce, 0xcb, 0xd8, 0x9a, 0xc5, 0x5f, 0xf2, 0x07, 0x8c, 0x1a, 0xcd, 0x92, 0xda, 0xaa, 0xed, 0xff, 0x6d, 0xa6, 0x1f, 0x36, 0x9e, 0xcf, 0xaf, 0xa4, 0x38, 0x96, 0xdc, 0xde, 0x8a, 0xde, 0x89, 0x87, 0xbb, 0x02, 0x35, 0x75, 0x5e, 0x1a, 0x2d, 0x0f, 0x46, 0x7a, 0x00, 0xf9, 0x9c, 0x7c, 0x34, 0xf4, 0x2e, 0x80, 0x37, 0xff, 0x0a, 0x30, 0x98, 0xc2, 0x4c, 0x09, 0x77, 0x2d, 0x34, 0x17, 0x3b, 0x5d, 0x7c, 0xff, 0x83, 0xbf, 0xe8, 0x43, 0x5e, 0x77, 0x1e, 0xc2, 0xbe, 0x03, 0xb8, 0x7e, 0x2a, 0x1b, 0x98, 0xa2, 0xb4, 0xdc, 0x7b, 0xc4, 0x2b, 0x26, 0xd1, 0x67, 0x91, 0x43, 0xcd, 0xc4, 0xcf, 0xc9, 0xb8, 0xca, 0xa8, 0xc1, 0x8a, 0x63, 0xec, 0x08, 0xbb, 0xf9, 0xee, 0xf6, 0x57, 0x39, 0x37, 0x3e, 0x51, 0x16, 0x7c, 0x15, 0x19, 0x11, 0xce, 0x97, 0x70, 0xb8, 0x11, 0x66, 0x7c, 0x6d, 0xaf, 0x94, 0x17, 0x69, 0x8e, 0xc3, 0x6d, 0x01, 0x3f, 0x8a, 0xc6, 0x27, 0x78, 0x1b, 0xa0, 0x33, 0xc4, 0x23, 0x01, 0xe4, 0x79, 0xf2, 0x0b, 0xa1, 0xea, 0xdc, 0xd1, 0x05, 0xdf, 0xdf, 0x69, 0x9b, 0x42, 0x86, 0x43, 0xe6, 0x1b, 0x0c, 0xb8, 0xa5, 0xbf, 0xc5, 0xe6, 0x54, 0x43, 0xba, 0xbc, 0xf6, 0x37, 0x93, 0x51, 0x12, 0x91, 0xbb, 0x7a, 0xfc, 0xe8, 0xbe, 0x9b, 0x55, 0xe3, 0xf6, 0xbd, 0xd5, 0xf0, 0x66, 0xe1, 0x48, 0x39, 0xe6, 0x94, 0xd7, 0xd4, 0x81, 0xc4, 0x89, 0x39, 0x1b, 0xd2, 0x0a, 0xfa, 0x56, 0xe8, 0xaa, 0xae, 0xb7, 0x8d, 0xa8, 0x2e, 0x05, 0x77, 0xb1, 0x05, 0xf2, 0xa0, 0xa4, 0x21, 0xfe, 0x9c, 0x98, 0xcf, 0x97, 0x29, 0x20, 0xe6, 0x85, 0x08, 0xce, 0x41, 0x85, 0x0b, 0xf5, 0x73, 0x34, 0x70, 0xb3, 0xb7, 0x2f, 0x6d, 0x2f, 0x26, 0x79, 0x0c, 0x20, 0x2d, 0x1d, 0x39, 0x8f, 0x3d, 0x14, 0x19, 0xdd, 0xc4, 0x68, 0x9e, 0x07, 0x5d, 0x9a, 0x59, 0x29, 0x43, 0x42, 0x8f, 0x41, 0x0c, 0xf5, 0x8e, 0x36, 0x94, 0x6b, 0x41, 0x19, 0x37, 0xe1, 0x03, 0xaa, 0x43, 0xbd, 0xb1, 0x1e, 0xac, 0x71, 0x03, 0x1f, 0x02, 0xa1, 0x1c, 0x15, 0xa1, 0x88, 0x5f, 0xa4, 0x28, 0x98, 0x85, 0x75, 0x2c, 0x60, 0xec, 0x3a, 0x2d, 0xb3, 0x32, 0xec, 0xc8, 0x07, 0x03, 0x57, 0x2f, 0x1b, 0x2f, 0xd9, 0xd7, 0xdd, 0x00, 0x67, 0x70, 0x8a, 0xca, 0xd0, 0x1a, 0x17, 0xc3, 0x46, 0xd6, 0xd0, 0x15, 0x1a, 0x3a, 0x3f, 0x32, 0xc7, 0x6a, 0x4f, 0x68, 0x32, 0x43, 0xb1, 0xb5, 0x30, 0xd9, 0x7f, 0xdc, 0x49, 0x24, 0x1f, 0xb8, 0xbc, 0xf6, 0x6b, 0xd1, 0xc2, 0x30, 0x0e, 0x2d, 0x17, 0x36, 0x31, 0x69, 0xb7, 0xa0, 0x58, 0x08, 0xe5, 0x33, 0x86, 0x0a, 0x72, 0x0f, 0xa8, 0xc0, 0x3c, 0x29, 0x30, 0xe0, 0xf5, 0xfc, 0x01, 0xd5, 0x26, 0x7c, 0x8b, 0x58, 0x73, 0x4c, 0x37, 0x44, 0x20, 0x30, 0x05, 0xa6, 0xd4, 0xc5, 0x73, 0x14, 0x9d, 0x70, 0xa2, 0x41, 0x35, 0x94, 0xb4, 0xce, 0x84, 0x08, 0x78, 0x62, 0x65, 0xc8, 0x49, 0xfc, 0xad, 0xea, 0x33, 0x88, 0x6a, 0xd4, 0x58, 0xb1, 0x68, 0xad, 0x92, 0xf7, 0xfa, 0x11, 0x5a, 0x01, 0xf6, 0x09, 0xe9, 0x34, 0x02, 0x3a, 0x9c, 0x84, 0x0e, 0x5c, 0x9d, 0x8a, 0x22, 0xee, 0xc0, 0xd7, 0x5a, 0x28, 0xab, 0x89, 0x2f, 0x32, 0x3a, 0x1c, 0xf7, 0x93, 0x22, 0x82, 0xaf, 0xec, 0xd4, 0x75, 0xf9, 0xe6, 0xa4, 0x0c, 0x61, 0x69, 0x2a, 0x8c, 0xe4, 0x0f, 0xe8, 0x81, 0xb3, 0xd8, 0x2e, 0x0e, 0x34, 0x1f, 0x3b, 0x82, 0x4a, 0xcc, 0xa5, 0x2b, 0xd6, 0xcc, 0xfb, 0x6f, 0x7e, 0xbe, 0xa8, 0x18, 0xad, 0xef, 0x1a, 0xf0, 0xda, 0x89, 0x24, 0x8e, 0x0e, 0x07, 0xa1, 0x6f, 0xa0, 0xec, 0x5b, 0x49, 0x43, 0xb5, 0x2b, 0x9b, 0x44, 0x0c, 0x61, 0x89, 0x0c, 0x3e, 0x65, 0xe7, 0xec, 0xef, 0x9f, 0x94, 0x1a, 0x0d, 0x95, 0x09, 0xf6, 0x02, 0x53, 0x31, 0x92, 0x2e, 0x10, 0x7c, 0x72, 0x94, 0x0e, 0x2f, 0x90, 0xd3, 0xc2, 0xfe, 0xa3, 0x59, 0x35, 0xdc, 0xa1, 0xd3, 0xaa, 0x12, 0x83, 0xe7, 0x81, 0x8e, 0x48, 0x26, 0x5b, 0x7e, 0x3c, 0x3c, 0x7f, 0x1e, 0x7a, 0x6a, 0x7d, 0xce, 0xb0, 0x37, 0x11, 0x68, 0x22, 0x62, 0x49, 0xd0, 0xf2, 0x1a, 0xea, 0xcd, 0x9e, 0x71, 0x11, 0x17, 0xca, 0x0f, 0x16, 0xb1, 0x40, 0x23, 0xb5, 0x78, 0x35, 0xa0, 0x70, 0xfd, 0xce, 0xa5, 0x2f, 0x90, 0xe2, 0x3c, 0x2a, 0x9d, 0x02, 0x48, 0x08, 0x3c, 0xb6, 0xb9, 0x48, 0x03, 0x0a, 0x02, 0xe1, 0x1e, 0x49, 0xcd, 0x25, 0xa2, 0x09, 0xed, 0xeb, 0x1f, 0x67, 0x94, 0xed, 0x75, 0x94, 0xc6, 0x6f, 0xe8, 0x91, 0x0d, 0x22, 0x76, 0x36, 0x6f, 0x47, 0x67, 0x79, 0x9d, 0x17, 0x27, 0xed, 0x6d, 0x63, 0x51, 0x89, 0x8a, 0x78, 0x0c, 0xab, 0x6a, 0x45, 0x9a, 0x5c, 0x81, 0xc0, 0x2e, 0xd6, 0xb5, 0x85, 0xfe, 0x44, 0x11, 0xc0, 0x9a, 0xc8, 0xbd, 0x4e, 0x7c, 0xc2, 0x2e, 0x1f, 0xe0, 0x50, 0x9a, 0xdf, 0xd6, 0x11, 0xaf, 0xd5, 0x95, 0x2f, 0x84, 0x0b, 0x12, 0x9c, 0xd0, 0xaf, 0xd1, 0x9b, 0x5a, 0xb9, 0xfb, 0x83, 0xb0, 0xce, 0xb2, 0xbf, 0x1c, 0x64, 0xa1, 0x1a, 0xd4, 0x28, 0xd7, 0x3a, 0x71, 0x9c, 0xd5, 0x69, 0xa2, 0x05, 0xe5, 0x9c, 0x22, 0x84, 0xae, 0xad, 0xe7, 0x83, 0x06, 0xec, 0x9d, 0x52, 0x07, 0xd6, 0x52, 0x12, 0x65, 0x24, 0x73, 0xd3, 0xfe, 0x08, 0xf7, 0xf9, 0xb3, 0xb3, 0xda, 0xe4, 0x77, 0x1a, 0xcd, 0xd0, 0xa5, 0xfa, 0x2c, 0xf9, 0x97, 0x19, 0x30, 0x03, 0x74, 0xd0, 0x66, 0x9a, 0x49, 0xc6, 0x5f, 0x56, 0x5c, 0xfe, 0xa9, 0xe1, 0xbd, 0x14, 0xff, 0x5b, 0x1d, 0xc3, 0xbd, 0xfd, 0xe3, 0xab, 0x97, 0xfd, 0x7d, 0x51, 0x89, 0xb2, 0xf4, 0x68, 0x11, 0xf9, 0xc4, 0x4f, 0x9d, 0xd7, 0xea, 0xda, 0x3f, 0x60, 0x3e, 0x55, 0xa8, 0xd7, 0x03, 0xc6, 0x54, 0x16, 0xbd, 0x73, 0x02, 0x30, 0x42, 0xa4, 0x67, 0x56, 0x14, 0xaa, 0x23, 0xf7, 0xee, 0x20, 0xf4, 0x2b, 0x9d, 0x71, 0x2a, 0x52, 0x11, 0x9b, 0x5b, 0xf8, 0xb4, 0x32, 0x57, 0xfd, 0xfb, 0xa7, 0x5e, 0xf2, 0x3a, 0xca, 0x91, 0xc5, 0xbc, 0x8e, 0xa7, 0xa1, 0x13, 0x0c, 0xe1, 0x10, 0xad, 0xcb, 0x40, 0x63, 0xa8, 0x3f, 0xf5, 0x53, 0xe7, 0x8f, 0x19, 0xe8, 0x66, 0x9c, 0x9e, 0x9a, 0xca, 0x3e, 0x86, 0xb7, 0x3d, 0xd0, 0x52, 0x04, 0x78, 0xf0, 0xbe, 0xa7, 0x21, 0x80, 0xab, 0x44, 0x58, 0xf0, 0x5d, 0x67, 0x8d, 0xc0, 0xe6, 0x22, 0x94, 0x40, 0xe2, 0xf7, 0xfb, 0x9b, 0x65, 0xf7, 0x9b, 0x13, 0x32, 0x2c, 0x6d, 0x8e, 0x2e, 0x35, 0x9f, 0x52, 0x14, 0x30, 0xe7, 0x0d, 0x69, 0xdd, 0x18, 0x18, 0xb3, 0xff, 0xf3, 0xfc, 0xe6, 0x06, 0x3f, 0x36, 0x1f, 0xec, 0x1c, 0x37, 0x94, 0x5d, 0x94, 0xaf, 0xcb, 0x1a, 0x73, 0x0b, 0x0b, 0x9f, 0x58, 0x3c, 0x11, 0x04, 0x0d, 0xbb, 0x03, 0x21, 0x14, 0xca, 0xaa, 0xf5, 0x82, 0xfc, 0xdb, 0x49, 0x11, 0xf7, 0x36, 0x90, 0x70, 0x79, 0x14, 0x12, 0xdd, 0x99, 0xba, 0x49, 0xf6, 0x50, 0xd3, 0x8b, 0xcc, 0x37, 0x1d, 0xea, 0x3a, 0x92, 0x62, 0x59, 0x75, 0x8e, 0xaa, 0x10, 0xe3, 0xc7, 0xaf, 0x31, 0x31, 0x0d, 0x91, 0xab, 0xa0, 0x68, 0xcb, 0x5e, 0x9f, 0x59, 0x66, 0x81, 0x9f, 0x63, 0x6c, 0x41, 0x23, 0xca, 0xa0, 0xab, 0x16, 0x9b, 0x6c, 0xcc, 0x62, 0xec, 0x1b, 0x17, 0xbe, 0x65, 0x48, 0x07, 0xc7, 0x00, 0x96, 0x05, 0x53, 0x0c, 0xa2, 0x8b, 0x02, 0x78, 0x36, 0x8a, 0x16, 0x4e, 0xc0, 0x09, 0x84, 0x7e, 0x02, 0x0f, 0x4a, 0xdd, 0x0a, 0xc4, 0x04, 0x6d, 0x65, 0xd3, 0xba, 0xdf, 0x90, 0x12, 0xfd, 0x56, 0xaf, 0x65, 0x32, 0x6e, 0x81, 0xe0, 0x2d, 0x7d, 0x94, 0x2b, 0x02, 0x19, 0xb5, 0x2b, 0x17, 0xda, 0xab, 0xde, 0x7e, 0x60, 0x25, 0x87, 0x82, 0x98, 0xf0, 0x0c, 0x80, 0x3c, 0x6d, 0x9c, 0xf9, 0x99, 0x43, 0x94, 0xe4, 0x95, 0x51, 0xa4, 0x49, 0xf0, 0xe7, 0x2e, 0x0b, 0xca, 0x35, 0xee, 0x06, 0x66, 0x03, 0xe0, 0x59, 0x2d, 0xa3, 0x5e, 0x05, 0xf6, 0x24, 0x89, 0xb8, 0x84, 0xc9, 0xeb, 0xe3, 0x50, 0xb9, 0x5b, 0x12, 0x89, 0xf8, 0x20, 0x7d, 0x5a, 0x96, 0x59, 0xda, 0x6b, 0x27, 0x9c, 0x76, 0xaa, 0x73, 0xdd, 0x84, 0x4b, 0x6e, 0x91, 0xb5, 0x0d, 0x6a, 0x14, 0x09, 0xc0, 0x8b, 0x48, 0xe4, 0x04, 0x7b, 0x80, 0x64, 0x53, 0x60, 0x9c, 0xf2, 0x42, 0x0b, 0x75, 0x17, 0x03, 0x72, 0x7b, 0x91, 0x2f, 0x61, 0x9c, 0xa7, 0xc2, 0x6c, 0x68, 0xb9, 0x68, 0x28, 0x73, 0x1b, 0xf7, 0x9b, 0xfb, 0x24, 0x3c, 0xf0, 0xcb, 0x81, 0xfa, 0x6f, 0x5f, 0xcf, 0x30, 0xad, 0x49, 0x6a, 0x9b, 0x00, 0xd4, 0x7f, 0x7c, 0x36, 0xe6, 0x69, 0x9b, 0x87, 0x2b, 0x3a, 0x8c, 0xc7, 0x6f, 0x97, 0x31, 0xe1, 0x4c, 0xca, 0x80, 0x80, 0x06, 0x12, 0x86, 0x0f, 0xb3, 0x3d, 0xac, 0xe4, 0x9f, 0x79, 0x3a, 0xb8, 0xee, 0x68, 0x19, 0x5b, 0x83, 0x72, 0xdd, 0xa5, 0x21, 0x5f, 0x03, 0xb0, 0xd0, 0x25, 0x76, 0x44, 0x83, 0xfe, 0x58, 0x93, 0xf7, 0xbe, 0x00, 0x27, 0xde, 0x64, 0x3f, 0x18, 0x3d, 0xef, 0xe8, 0x82, 0x13, 0x73, 0x8f, 0x36, 0x3b, 0x6b, 0x90, 0xb0, 0x93, 0x51, 0x54, 0x4a, 0x5e, 0x6c, 0xcf, 0xaf, 0xe7, 0xea, 0x4d, 0x91, 0x68, 0x2e, 0x6f, 0x9f, 0x29, 0x6b, 0x70, 0xb1, 0xec, 0x72, 0xad, 0x46, 0x89, 0xc8, 0x65, 0x31, 0xd6, 0xfc, 0xbd, 0x8f, 0xc9, 0x37, 0x07, 0xfc, 0xe1, 0x15, 0x43, 0x07, 0xc1, 0xb3, 0xe6, 0xe3, 0x1f, 0x0a, 0xdb, 0x5f, 0xdc, 0x7b, 0xc8, 0x17, 0x74, 0xaa, 0x92, 0xec, 0x99, 0x90, 0x23, 0xb3, 0x1b, 0xcc, 0x6b, 0x2a, 0x0b, 0x3a, 0xa4, 0x30, 0x20, 0xc7, 0xdb, 0x35, 0x59, 0x84, 0xac, 0xef, 0xe4, 0xf9, 0x4d, 0x4e, 0x3f, 0xbb, 0xce, 0xb3, 0x9d, 0x41, 0x9e, 0x5d, 0x8b, 0xf3, 0x52, 0x23, 0xd3, 0x84, 0xa2, 0x69, 0xa1, 0x82, 0xb4, 0x4d, 0xe4, 0x2b, 0x9e, 0x21, 0xf7, 0x83, 0x26, 0x1e, 0x81, 0xa3, 0xcb, 0x56, 0x9a, 0x54, 0x0a, 0xeb, 0x2f, 0xdc, 0xda, 0x7f, 0xa7, 0x18, 0x79, 0xeb, 0xc6, 0xcb, 0x6a, 0x34, 0xd2, 0x36, 0xbf, 0xbb, 0xf5, 0xe9, 0x94, 0xb3, 0xe3, 0xd8, 0xdc, 0xd8, 0xbc, 0xb1, 0x60, 0x5e, 0x34, 0x6d, 0x04, 0x28, 0xf1, 0x26, 0x4c, 0x3b, 0x35, 0x28, 0x20, 0x72, 0xbc, 0x4a, 0xcc, 0x73, 0xe8, 0x7f, 0x4b, 0xe1, 0x1b, 0xa8, 0xc5, 0xd4, 0x64, 0xac, 0x56, 0x86, 0x5f, 0xcb, 0x11, 0x4f, 0x56, 0x2f, 0x45, 0xd3, 0xac, 0xc4, 0xfe, 0x7a, 0x7c, 0x4a, 0xcf, 0x20, 0x7d, 0xa9, 0xcf, 0x0e, 0x29, 0x84, 0xe2, 0x29, 0x1e, 0x10, 0x3a, 0x6a, 0xc4, 0x27, 0x1d, 0x8e, 0x30, 0x98, 0xe8, 0x0f, 0x48, 0xc2, 0x54, 0x52, 0x28, 0x61, 0xf8, 0x22, 0xc5, 0xa7, 0x0f, 0x5d, 0xd0, 0x8f, 0x7c, 0xed, 0xde, 0x6e, 0x0b, 0xfa, 0xc5, 0xca, 0xfa, 0x5e, 0x49, 0x70, 0xb8, 0x5a, 0xf8, 0xc1, 0xec, 0x87, 0x52, 0x4d, 0xb9, 0x0f, 0x2d, 0xa3, 0x40, 0x1c, 0x58, 0x66, 0x67, 0x91, 0x7f, 0xa4, 0xd9, 0xf9, 0x4e, 0x64, 0x4f, 0xbc, 0xd9, 0x7e, 0x0d, 0x99, 0x3c, 0xb0, 0xaf, 0x50, 0x7e, 0xed, 0x25, 0x9f, 0xbc, 0xf8, 0xfd, 0x70, 0x83, 0x32, 0xe0, 0x51, 0x7d, 0xb1, 0x60, 0x24, 0x50, 0x91, 0xf1, 0x18, 0xc3, 0x8f, 0x34, 0xd8, 0x23, 0xd3, 0x7c, 0x02, 0xe5, 0x0e, 0x8b, 0xda, 0x8c, 0xc5, 0x9c, 0x40, 0xcd, 0xed, 0xa7, 0xdf, 0xf1, 0xb7, 0xe0, 0xa8, 0x7c, 0xad, 0x80, 0x7f, 0x0c, 0xfe, 0xc9, 0x33, 0x83, 0x16, 0x44, 0xb4, 0x68, 0x72, 0x4e, 0x80, 0x8b, 0xb3, 0xd2, 0x5f, 0xe8, 0xf1, 0x58, 0x50, 0xce, 0x51, 0x3f, 0xc3, 0x41, 0xda, 0x46, 0x08, 0x9c, 0x84, 0x52, 0x08, 0x7b, 0x92, 0x6b, 0x33, 0xd7, 0x22, 0x07, 0xb9, 0x73, 0x03, 0x8b, 0xfd, 0x77, 0xc6, 0x0f, 0x47, 0x5b, 0x18, 0x61, 0xb8, 0x07, 0x4f, 0x4d, 0x84, 0x39, 0x42, 0x1c, 0x5b, 0x26, 0x5e, 0x5b, 0x28, 0x64, 0xf6, 0xde, 0xfe, 0x07, 0xdb, 0x04, 0x4f, 0x0b, 0x2d, 0x3b, 0x60, 0xf2, 0x70, 0xc7, 0xf9, 0xad, 0xe2, 0xc0, 0x61, 0xc0, 0x0c, 0x5a, 0x8a, 0xa2, 0x98, 0x6a, 0x88, 0x62, 0x62, 0x25, 0x47, 0x90, 0xd2, 0x2a, 0x7e, 0x5b, 0x68, 0xc3, 0xdf, 0xf7, 0x98, 0x67, 0x91, 0x42, 0xd9, 0x84, 0xdf, 0xa6, 0xf9, 0x7c, 0x32, 0x41, 0xb3, 0xed, 0x3c, 0x43, 0x83, 0x36, 0x77, 0x98, 0xb9, 0x37, 0xce, 0xc8, 0xcd, 0x58, 0x99, 0x1b, 0xf2, 0xcc, 0xcf, 0x00, 0xed, 0x17, 0x77, 0xaf, 0x28, 0xcd, 0x60, 0x0e, 0x02, 0x9d, 0x12, 0xd1, 0x6a, 0x8f, 0x04, 0xe6, 0xac, 0x8a, 0x10, 0x10, 0x8a, 0x19, 0x23, 0xd2, 0x8f, 0x6e, 0x39, 0x8e, 0xa0, 0xa8, 0x89, 0xee, 0xd4, 0x51, 0xfc, 0x83, 0x86, 0x2b, 0xe4, 0xac, 0xa8, 0x2c, 0xeb, 0xba, 0x59, 0xc7, 0x49, 0x51, 0xba, 0x6d, 0x3b, 0x11, 0xfe, 0x54, 0xb0, 0x76, 0xc1, 0x77, 0x45, 0xfd, 0x9b, 0xde, 0x73, 0x89, 0xf4, 0x1f, 0x07, 0x04, 0x1a, 0x25, 0xd3, 0x49, 0x90, 0x30, 0xa4, 0x42, 0xaa, 0x1d, 0x74, 0x4d, 0x56, 0xe8, 0xe0, 0xe5, 0x3d, 0x6f, 0xdc, 0x7e, 0x0b, 0x78, 0xa5, 0xb0, 0x0a, 0xf6, 0xf7, 0x98, 0xf6, 0x88, 0x81, 0x7c, 0x0d, 0x43, 0x96, 0xad, 0x65, 0xb1, 0x25, 0xb2, 0x82, 0x19, 0xeb, 0xa2, 0x28, 0x01, 0xe7, 0xd2, 0x6e, 0xf2, 0x0e, 0xb0, 0x14, 0x7b, 0x41, 0xef, 0x16, 0x78, 0x7c, 0xe5, 0x81, 0x95, 0x50, 0x31, 0x86, 0x0d, 0x93, 0xa0, 0xcd, 0xb8, 0x56, 0x52 ],
+    const [ 0x08, 0xbe, 0x55, 0x57, 0x31, 0x77, 0xd7, 0x0c, 0x9e, 0xca, 0x51, 0x8c, 0x96, 0xb4, 0x57, 0x67, 0x7c, 0xe0, 0x7e, 0x31, 0xa1, 0x26, 0xcc, 0x29, 0x5c, 0x53, 0x6c, 0x17, 0x5d, 0x28, 0xa6, 0x7b, 0x3e, 0xa5, 0x0f, 0xe3, 0x5b, 0x87, 0xfd, 0x9d, 0xe4, 0x0f, 0x3e, 0x8e, 0x30, 0x05, 0x0a, 0x62, 0x54, 0xfd, 0x35, 0xe6, 0xf5, 0xd9, 0xa9, 0xb1, 0x5a, 0x8f, 0x14, 0x0a, 0xc5, 0x2c, 0xde, 0x06, 0x04, 0x19, 0x5e, 0xf1, 0x43, 0x9d, 0x4d, 0xef, 0x24, 0xa4, 0x7b, 0xe3, 0x12, 0xbf, 0xc0, 0x90, 0xd2, 0x6b, 0x36, 0xff, 0x5a, 0x96, 0xa5, 0x20, 0xe7, 0x5f, 0x3f, 0xb3, 0x4a, 0x1e, 0x8e, 0x69, 0x82, 0xa4, 0xaa, 0x47, 0x90, 0xc4, 0xaf, 0x4c, 0x87, 0x12, 0x6e, 0x53, 0xe3, 0xea, 0x63, 0x3b, 0x1b, 0xb4, 0xe8, 0x44, 0x7a, 0x67, 0xa7, 0xbc, 0x2a, 0x4c, 0x55, 0xdc, 0x92, 0x05, 0x9e, 0xed, 0xe2, 0xcd, 0x5b, 0xae, 0xeb, 0x01, 0x0b, 0xfa, 0x35, 0xe0, 0x81, 0xa6, 0x4b, 0x8f, 0xda, 0xa9, 0x5a, 0x5f, 0xb2, 0x7f, 0xfa, 0x53, 0x98, 0xcf, 0x4c, 0xdd, 0xbe, 0x4b, 0x45, 0xe9, 0xf5, 0xd7, 0x49, 0x1c, 0xd9, 0xee, 0xfc, 0x5e, 0x49, 0x42, 0x55, 0x96, 0x1b, 0xa3, 0xf4, 0xb4, 0x0d, 0x22, 0xb5, 0xf5, 0xfe, 0x76, 0x85, 0x62, 0x5e, 0x9f, 0x74, 0x9b, 0xe3, 0xc9, 0x0c, 0xd2, 0x7d, 0x72, 0xe1, 0x1a, 0x8d, 0xcf, 0x6a, 0xe2, 0x52, 0x6c, 0x0f, 0xbc, 0xa3, 0x14, 0x83, 0x64, 0xe4, 0xf0, 0x54, 0xfd, 0x33, 0xf2, 0xc1, 0x9d, 0xe2, 0x75, 0xcb, 0x0c, 0x2a, 0x1d, 0x8f, 0xc9, 0x1d, 0x05, 0xd2, 0x4e, 0xdd, 0x19, 0xde, 0x95, 0x0c, 0xc0, 0x8d, 0xdb, 0x83, 0xbf, 0xa3, 0xa4, 0x47, 0x5a, 0x60, 0xff, 0xb8, 0xbb, 0x56, 0x0b, 0x0c, 0x98, 0x79, 0xba, 0xfc, 0x11, 0x75, 0xd5, 0xbd, 0xd7, 0x44, 0x41, 0x32, 0x93, 0xff, 0x80, 0x60, 0x86, 0xf4, 0x7a, 0x22, 0x6c, 0xfa, 0x7e, 0x1e, 0xa7, 0x01, 0x84, 0xf7, 0x99, 0xed, 0xb5, 0xc5, 0x52, 0xa5, 0x2d, 0xc2, 0x6b, 0x66, 0xff, 0x45, 0x31, 0x5e, 0x79, 0xf5, 0x07, 0x76, 0xaa, 0x36, 0x05, 0x6f, 0x22, 0xe8, 0xe5, 0x30, 0xf9, 0x51, 0x20, 0x5e, 0x13, 0x57, 0x54, 0x2e, 0xa1, 0xf3, 0xe9, 0x77, 0xeb, 0xe2, 0xf4, 0x0c, 0x4e, 0x9e, 0x5b, 0x48, 0x80, 0x8c, 0x3b, 0xea, 0x1c, 0x77, 0x86, 0x23, 0x5a, 0x3d, 0xf1, 0xee, 0x1d, 0xc8, 0x0d, 0xa0, 0x34, 0x40, 0xb3, 0xc0, 0xd9, 0x7f, 0xa6, 0x18, 0x7e, 0xc6, 0x74, 0x0c, 0xca, 0xae, 0x9d, 0x2b, 0xde, 0x61, 0xf7, 0x04, 0xdc, 0x09, 0x51, 0x3b, 0xaa, 0x89, 0x57, 0xdc, 0xf3, 0x6c, 0xb6, 0xee, 0x6f, 0x1a, 0x80, 0x4c, 0x65, 0x52, 0xd1, 0xb0, 0x6e, 0xd4, 0xb3, 0x11, 0x7b, 0x5e, 0x3f, 0x2f, 0x19, 0xda, 0x05, 0x6c, 0xf4, 0xd6, 0xae, 0xdd, 0x9a, 0x34, 0xe0, 0xa1, 0x82, 0x23, 0x62, 0x71, 0x4d, 0x4e, 0x81, 0x79, 0x4b, 0x53, 0xb2, 0x66, 0x41, 0x76, 0x78, 0xc1, 0x6a, 0x97, 0x88, 0x7b, 0xbb, 0x61, 0x2c, 0xc9, 0x6b, 0xc5, 0xe5, 0x32, 0xb3, 0xa6, 0x54, 0xe5, 0xd3, 0xd6, 0x5a, 0x51, 0x55, 0x42, 0x7f, 0xf0, 0x95, 0x69, 0x90, 0x63, 0x81, 0x13, 0x8c, 0xc4, 0x9e, 0x3f, 0xc2, 0x38, 0x4c, 0x5d, 0x33, 0xc3, 0x4a, 0xbd, 0x3d, 0x61, 0x7c, 0x48, 0x7b, 0x52, 0xec, 0x6e, 0xe7, 0xb5, 0x10, 0x5f, 0x41, 0x58, 0x4b, 0x7e, 0xb5, 0xcf, 0xb5, 0x12, 0xb8, 0xc3, 0x1f, 0x3f, 0x33, 0x8d, 0x52, 0x36, 0xe3, 0x03, 0x98, 0xa8, 0xff, 0x92, 0x7e, 0x80, 0x1c, 0x8e, 0xd7, 0xd1, 0x4f, 0xc5, 0x04, 0x0d, 0x91, 0x5a, 0x73, 0x79, 0x67, 0xd1, 0x66, 0xdd, 0xc2, 0x66, 0xf6, 0x80, 0x23, 0xa3, 0x57, 0x53, 0x04, 0x31, 0x5d, 0x6d, 0x74, 0xef, 0x3f, 0xb7, 0x01, 0x41, 0x9c, 0xe9, 0xda, 0xab, 0xbb, 0xb5, 0x35, 0x9e, 0x17, 0x41, 0xef, 0x91, 0x1b, 0xdb, 0x72, 0x54, 0x2a, 0xe9, 0xdc, 0xa1, 0xe2, 0x1e, 0x5e, 0xf5, 0xa2, 0xf4, 0xe1, 0x9d, 0x49, 0x56, 0xf0, 0x14, 0x41, 0x9c, 0xd2, 0x8c, 0xbd, 0xbd, 0xf6, 0xcb, 0x3e, 0xc0, 0x95, 0x38, 0x5c, 0x74, 0x92, 0x36, 0xc3, 0x61, 0xa5, 0xb0, 0x7c, 0xfe, 0xb8, 0xf5, 0x6e, 0x25, 0x91, 0xc7, 0x24, 0xc3, 0xb2, 0xae, 0xd0, 0xd4, 0x7d, 0x93, 0x90, 0x8f, 0x9c, 0x89, 0xf1, 0xdd, 0xa0, 0xee, 0xb2, 0x10, 0xe8, 0xb3, 0xca, 0xd2, 0xc5, 0xf8, 0xab, 0x5b, 0xdb, 0xdc, 0xc9, 0xe8, 0xcb, 0x93, 0x56, 0x68, 0x0f, 0xb9, 0x50, 0x78, 0x25, 0xe5, 0xbe, 0x91, 0xef, 0x82, 0x37, 0x80, 0x5a, 0xda, 0xa3, 0x17, 0x3e, 0x74, 0x46, 0x23, 0x85, 0xa0, 0xfa, 0x9e, 0x90, 0x50, 0xbb, 0x25, 0xd6, 0x29, 0x69, 0xac, 0xce, 0xda, 0xca, 0x70, 0x10, 0xad, 0xcf, 0x2d, 0xb7, 0x5b, 0x18, 0x91, 0x09, 0x25, 0xb9, 0xf1, 0x5a, 0x20, 0x3f, 0x3c, 0x2d, 0xd1, 0xee, 0x2d, 0x9d, 0xf9, 0x4d, 0xc4, 0xfb, 0xb2, 0xe5, 0xf6, 0xb9, 0xbb, 0x45, 0xa4, 0x86, 0x11, 0x49, 0xca, 0xbb, 0xbf, 0x9c, 0xf9, 0xf6, 0xf6, 0x7c, 0x07, 0x04, 0x60, 0xbd, 0x05, 0x05, 0xb2, 0x11, 0x71, 0xca, 0x81, 0x86, 0xad, 0x82, 0x56, 0x50, 0xb0, 0x96, 0x04, 0xc9, 0xfc, 0xd1, 0x39, 0xb6, 0xcf, 0xc4, 0x54, 0xcc, 0x9e, 0x69, 0x76, 0x73, 0xbf, 0x06, 0xdc, 0xc9, 0x66, 0x54, 0x6c, 0xea, 0xd2, 0xe1, 0x8d, 0x6f, 0xc8, 0xb3, 0x3c, 0x34, 0x41, 0x2e, 0x5d, 0x5f, 0x60, 0x38, 0x4e, 0x9d, 0xa6, 0x9a, 0xc2, 0xaf, 0x69, 0xa9, 0xcd, 0x26, 0x82, 0x27, 0x3b, 0x6a, 0x47, 0x64, 0x26, 0x01, 0xb9, 0xa8, 0xc8, 0x0e, 0xfe, 0xd5, 0x8d, 0x18, 0x11, 0x49, 0x6c, 0x0d, 0xb8, 0x02, 0x78, 0x87, 0xb6, 0x05, 0xb2, 0x4d, 0x42, 0x00, 0x22, 0x1d, 0xb9, 0x2e, 0x26, 0xa9, 0x90, 0x7b, 0x09, 0xdf, 0x8c, 0xe9, 0xd7, 0x6d, 0x35, 0x32, 0x70, 0x85, 0x88, 0xaf, 0xdc, 0xdd, 0xec, 0x78, 0xde, 0xfb, 0x67, 0xcd, 0xcc, 0xaf, 0x12, 0xb4, 0x9d, 0xe1, 0xca, 0xe4, 0x44, 0x8c, 0x29, 0xe2, 0x3d, 0x0b, 0xb4, 0x6a, 0x65, 0x94, 0x56, 0x10, 0x0e, 0x02, 0x0e, 0x27, 0x53, 0xd7, 0xe4, 0xe2, 0xa9, 0x81, 0x21, 0xb9, 0xb7, 0xdc, 0xbf, 0x0e, 0x68, 0xf9, 0x1f, 0x11, 0x3e, 0x1e, 0xfa, 0xe1, 0xe9, 0x0d, 0x9a, 0xf4, 0x18, 0x89, 0x4a, 0xb8, 0x8f, 0x17, 0x0b, 0x7a, 0x79, 0x02, 0x88, 0x88, 0x00, 0xa1, 0x4c, 0x92, 0x1c, 0xdc, 0x33, 0x56, 0xa8, 0xed, 0x1e, 0x7d, 0xbb, 0x64, 0xeb, 0xbf, 0x35, 0x6e, 0xa5, 0x4e, 0x98, 0x56, 0xf7, 0x72, 0x1a, 0x4c, 0xe7, 0x70, 0xf8, 0x66, 0xc1, 0xb1, 0x0c, 0xe4, 0x50, 0x20, 0xa2, 0xb8, 0x54, 0xd4, 0x88, 0x46, 0x31, 0xef, 0x64, 0x68, 0xe5, 0xc6, 0x4a, 0xb5, 0x3c, 0x42, 0x8e, 0x03, 0x47, 0x86, 0xd7, 0x2a, 0x0a, 0xd1, 0x75, 0x0b, 0x75, 0xa6, 0xf5, 0xd1, 0x96, 0x2b, 0xf2, 0x77, 0x0c, 0xd0, 0x2e, 0x8b, 0xbf, 0x30, 0xe1, 0x31, 0xce, 0x3c, 0x50, 0x6a, 0xc9, 0x96, 0xa2, 0x96, 0x21, 0x3b, 0xef, 0x38, 0xdc, 0x65, 0x9b, 0xfa, 0x8d, 0xb0, 0xe2, 0xf1, 0x84, 0x7b, 0xb3, 0x21, 0x42, 0x91, 0xc2, 0x44, 0x30, 0x09, 0xd9, 0xc7, 0x90, 0x6a, 0x6e, 0x16, 0xb3, 0x13, 0x7b, 0x19, 0x6c, 0xda, 0x8a, 0xfe, 0xc6, 0xf4, 0x0f, 0x3a, 0xf2, 0x15, 0xfb, 0xca, 0x83, 0xd7, 0x8e, 0xbf, 0xde, 0x60, 0x6d, 0xf9, 0xeb, 0x3f, 0xf4, 0x33, 0x11, 0x98, 0xcd, 0x40, 0x62, 0x81, 0xc2, 0x93, 0x12, 0xab, 0xcf, 0x05, 0x2e, 0x45, 0x7c, 0xd3, 0x8a, 0x1d, 0x6a, 0xe6, 0xfc, 0x09, 0x2b, 0x58, 0xc7, 0x85, 0x56, 0x33, 0x5a, 0x9d, 0xdb, 0x7c, 0x3b, 0x0e, 0x95, 0x70, 0x3e, 0xa8, 0x1e, 0x0d, 0xfa, 0xf6, 0xe7, 0xd4, 0x7d, 0x21, 0x88, 0xce, 0x3f, 0x12, 0x54, 0xcd, 0x55, 0xd7, 0x31, 0xf4, 0xe7, 0x48, 0xa7, 0x79, 0xe4, 0xea, 0x36, 0xaa, 0xf4, 0x13, 0xed, 0x2e, 0xaf, 0x4f, 0x38, 0x8e, 0x0c, 0x03, 0xfa, 0xf4, 0x1c, 0x50, 0xdb, 0x32, 0xf8, 0x3a, 0xe4, 0x05, 0xf8, 0x0a, 0x49, 0x9b, 0x25, 0xf0, 0x85, 0x54, 0xf1, 0xed, 0xac, 0xc6, 0x26, 0xf0, 0xfd, 0x03, 0x1d, 0x40, 0xb7, 0x1e, 0x30, 0x19, 0x2f, 0xeb, 0x71, 0x9a, 0x1e, 0x07, 0x9d, 0xdf, 0x3f, 0x18, 0x4b, 0x6a, 0x1a, 0x56, 0x69, 0xc7, 0x1a, 0x4b, 0xe9, 0x6f, 0xe6, 0xd6, 0xb8, 0xee, 0xee, 0x76, 0xf0, 0x41, 0x44, 0xc5, 0x4e, 0x82, 0xae, 0x43, 0xe6, 0xc7, 0xf9, 0x55, 0x15, 0x47, 0x90, 0x8e, 0xb8, 0xbe, 0x4d, 0x2c, 0x9b, 0x13, 0x8e, 0xe6, 0x35, 0x38, 0x8c, 0xe5, 0x92, 0x53, 0xe8, 0x10, 0x90, 0x1b, 0x87, 0x8c, 0x4e, 0x84, 0xa0, 0x83, 0xe2, 0x9e, 0x13, 0x25, 0x4a, 0xba, 0xfd, 0xed, 0xa5, 0xd0, 0x89, 0x26, 0xa4, 0x1d, 0x09, 0xad, 0x3b, 0x10, 0x45, 0xf8, 0x9c, 0x67, 0x12, 0x57, 0x65, 0x96, 0x27, 0x7a, 0x18, 0x68, 0x2d, 0x34, 0xcd, 0xe8, 0x15, 0x7e, 0x23, 0x82, 0xae, 0xbf, 0x7c, 0x66, 0x77, 0x4b, 0x6a, 0x2d, 0xb2, 0x29, 0x64, 0xbf, 0xb9, 0x19, 0xbe, 0x74, 0x95, 0xd5, 0xd8, 0x79, 0xcd, 0x98, 0x95, 0x76, 0x7c, 0xdd, 0x0e, 0x6d, 0xa6, 0x69, 0x88, 0xe6, 0xcc, 0x8b, 0xa4, 0x49, 0xbe, 0xa3, 0xd6, 0x8b, 0xb1, 0xe1, 0x18, 0x0c, 0x91, 0x4f, 0xe0, 0xc0, 0x99, 0x12, 0x4f, 0x8e, 0x20, 0xed, 0xab, 0xf5, 0xb6, 0x06, 0x0f, 0xf5, 0x6f, 0xed, 0x61, 0x2d, 0x7f, 0xda, 0x85, 0x41, 0x07, 0x36, 0xd0, 0x7e, 0x2f, 0x5d, 0xc0, 0xc1, 0x75, 0xa3, 0xea, 0x94, 0x45, 0x95, 0x33, 0x9b, 0xc9, 0x81, 0x43, 0x2f, 0x02, 0x38, 0x37, 0x48, 0x18, 0x12, 0x96, 0xa0, 0xee, 0x33, 0x87, 0x15, 0xfa, 0x0d, 0x41, 0x4f, 0x54, 0x26, 0xc2, 0xa4, 0x0c, 0x1b, 0xc4, 0x38, 0xc1, 0xe6, 0xed, 0x69, 0x6f, 0x5c, 0x46, 0x6a, 0x89, 0xf9, 0xee, 0x2d, 0x48, 0xe0, 0x10, 0x87, 0x42, 0x1e, 0x12, 0x8f, 0x3e, 0x2f, 0x0f, 0x47, 0x47, 0xc3, 0x88, 0x7e, 0xff, 0xc2, 0x56, 0xf4, 0x36, 0x8d, 0xe3, 0xc0, 0xbb, 0x87, 0x9a, 0xef, 0x72, 0xd4, 0x9c, 0x6e, 0xa7, 0x60, 0xb5, 0x2a, 0xa2, 0x23, 0x8e, 0x75, 0x7c, 0xa4, 0x24, 0xac, 0x31, 0xbc, 0x78, 0x16, 0xf5, 0x9d, 0x89, 0x10, 0xcc, 0x12, 0x7f, 0x67, 0x55, 0x09, 0x29, 0x06, 0xe6, 0x4e, 0xa9, 0xd1, 0xde, 0x99, 0x6e, 0xd0, 0x37, 0xcb, 0x63, 0x90, 0x5b, 0x75, 0x66, 0xc6, 0x39, 0x9a, 0xfc, 0x36, 0x97, 0xb6, 0x43, 0xd3, 0xaa, 0xfe, 0x28, 0x28, 0xe4, 0xea, 0xd9, 0xf6, 0x0d, 0xf1, 0x7e, 0x1f, 0x95, 0x93, 0x24, 0xc2, 0x29, 0x9d, 0xf9, 0xa8, 0x84, 0xa9, 0xbf, 0xdf, 0x88, 0xe4, 0x7b, 0xa4, 0x8d, 0x14, 0x6d, 0x87, 0xf9, 0xd9, 0x45, 0xc9, 0x10, 0x32, 0x94, 0x09, 0x0e, 0x44, 0x81, 0x1f, 0x73, 0x57, 0xbd, 0x49, 0x9f, 0x22, 0xb9, 0x85, 0x9e, 0x48, 0x16, 0x3d, 0x45, 0x22, 0x5d, 0x29, 0x7e, 0xbf, 0xf0, 0x72, 0xe0, 0x29, 0x40, 0x13, 0x83, 0xea, 0x41, 0x85, 0x12, 0xcf, 0x1b, 0x9b, 0x21, 0xec, 0x23, 0xab, 0xc1, 0xe0, 0x09, 0xee, 0x52, 0x5b, 0x52, 0x29, 0x99, 0xdd, 0x09, 0x8d, 0x13, 0xc0, 0xb2, 0xdc, 0x88, 0x78, 0x80, 0xce, 0xe2, 0x1a, 0xc8, 0xb3, 0x40, 0x1b, 0xb4, 0x59, 0x47, 0x5a, 0x3c, 0x30, 0xb8, 0x61, 0x52, 0xac, 0x48, 0xe8, 0x5d, 0xeb, 0xac, 0x9b, 0xe9, 0x98, 0xf3, 0x1e, 0x9d, 0x0f, 0x18, 0x4d, 0x6d, 0xc2, 0xd8, 0xc8, 0x11, 0xdb, 0xc1, 0xaf, 0xb5, 0x23, 0x8c, 0xaa, 0xf2, 0x22, 0xac, 0x2d, 0xfd, 0x88, 0x27, 0xfa, 0x1e, 0xcb, 0xa5, 0xe7, 0x64, 0x12, 0xc6, 0xe1, 0x98, 0x52, 0xb9, 0x31, 0x6f, 0xb6, 0x0b, 0xfe, 0x03, 0x45, 0xbc, 0x13, 0x84, 0xbf, 0x98, 0xe3, 0x2b, 0xc7, 0xc4, 0xca, 0x70, 0x47, 0x98, 0x96, 0x7d, 0x11, 0xac, 0x46, 0xe2, 0xc2, 0x36, 0x12, 0x8a, 0xec, 0x93, 0xab, 0xee, 0x74, 0x23, 0xc3, 0x88, 0x38, 0x5a, 0xd0, 0x8b, 0xf5, 0x14, 0x0d, 0xd1, 0x69, 0x29, 0xc2, 0x15, 0xb4, 0x42, 0xc6, 0x62, 0x04, 0xeb, 0x42, 0xcb, 0x71, 0xe9, 0xb7, 0x5d, 0x26, 0xcd, 0x43, 0x52, 0xc2, 0xc9, 0x20, 0x87, 0xfe, 0xc3, 0x6d, 0x31, 0x8f, 0xa8, 0x31, 0xcb, 0x4e, 0x03, 0x9d, 0x53, 0x96, 0xce, 0x91, 0xb5, 0xed, 0x87, 0x62, 0x88, 0xe7, 0x87, 0xdb, 0xf8, 0x48, 0x90, 0x81, 0x03, 0x69, 0xa5, 0x1b, 0xe9, 0xdd, 0x1e, 0x72, 0xdd, 0x53, 0xfb, 0x56, 0x01, 0xbe, 0x79, 0xe1, 0x91, 0xb4, 0xe3, 0x00, 0x5e, 0x14, 0xab, 0x2e, 0x7f, 0xec, 0xb9, 0x83, 0x43, 0x9a, 0x03, 0xee, 0x6a, 0x31, 0x5e, 0xbf, 0x94, 0x1e, 0x93, 0x68, 0xf9, 0x0b, 0xb6, 0x84, 0x5b, 0x03, 0xb3, 0x18, 0x39, 0xd7, 0x2a, 0x19, 0x46, 0xc1, 0x7d, 0x2f, 0x19, 0x48, 0x27, 0xb9, 0x26, 0x63, 0x4f, 0x11, 0xed, 0xe1, 0x9c, 0x11, 0x71, 0x08, 0x4c, 0xd6, 0xec, 0x7d, 0x80, 0xc3, 0xc1, 0x64, 0xda, 0xc9, 0xb2, 0xc7, 0x4a, 0xe6, 0x53, 0x3c, 0x25, 0xec, 0xbe, 0xc2, 0x78, 0x84, 0x89, 0xed, 0x9b, 0x72, 0xf5, 0x43, 0x09, 0x1b, 0x68, 0xe5, 0x6e, 0x44, 0x1e, 0x72, 0x02, 0x1c, 0x1b, 0x28, 0x16, 0x7d, 0x64, 0x4c, 0xec, 0x6f, 0x6e, 0xcc, 0xcc, 0xee, 0xd7, 0x24, 0x54, 0xed, 0x54, 0x7e, 0x10, 0x9a, 0xeb, 0x1d, 0x4b, 0xe4, 0x62, 0xfb, 0x24, 0x3a, 0xf7, 0xb1, 0xe4, 0x96, 0x51, 0x98, 0x8e, 0xbb, 0xb7, 0x2e, 0xb8, 0xbb, 0x80, 0xbb, 0x9a, 0xbb, 0xca, 0x34, 0x65, 0xfa, 0x6f, 0x5f, 0xd6, 0x10, 0x35, 0x38, 0x0a, 0x74, 0x45, 0x94, 0x94, 0x41, 0xdf, 0x04, 0xcd, 0x3a, 0x4b, 0xfc, 0x6b, 0x0b, 0x13, 0x34, 0x55, 0xd2, 0x6f, 0x4f, 0xb6, 0xdd, 0x01, 0xbb, 0x50, 0xb5, 0xc2, 0xd8, 0x14, 0x5c, 0x3d, 0x5c, 0xef, 0xd4, 0xfb, 0xf6, 0xe6, 0xe0, 0x3e, 0x31, 0x65, 0x0f, 0xf2, 0x9c, 0xd4, 0xf5, 0xe0, 0x28, 0x6c, 0xbc, 0x25, 0xd1, 0x49, 0xdc, 0xe2, 0x80, 0xc0, 0x26, 0x36, 0x30, 0xf2, 0x07, 0x69, 0x50, 0xa1, 0x0b, 0x6a, 0x69, 0x43, 0xa0, 0x7c, 0x01, 0x55, 0x1d, 0x2c, 0xbf, 0xf2, 0x02, 0x86, 0xd0, 0xa4, 0x81, 0x88, 0x88, 0x7a, 0x3e, 0xd7, 0x4d, 0x5b, 0x54, 0xb1, 0xb1, 0x99, 0x98, 0x23, 0xde, 0xc9, 0x21, 0x7c, 0x37, 0xd3, 0x08, 0x01, 0x3c, 0x45, 0x6c, 0xe2, 0xae, 0xed, 0xb9, 0x6d, 0xf4, 0xa6, 0x2a, 0x82, 0xbe, 0x72, 0x8d, 0x47, 0xe8, 0xc9, 0x47, 0x1c, 0xa1, 0x31, 0x97, 0xd2, 0xcc, 0x0f, 0x1f, 0x17, 0xa6, 0xbd, 0xa0, 0x35, 0xaa, 0xdc, 0x05, 0xfd, 0xb2, 0xec, 0xa3, 0xfd, 0x5e, 0x1a, 0xbf, 0xfa, 0xb9, 0x58, 0x50, 0x9a, 0x1a, 0xb3, 0x07, 0x60, 0x49, 0xe1, 0x8d, 0xdd, 0xe3, 0x1a, 0x0c, 0x25, 0x00, 0x2a, 0xf0, 0x81, 0x12, 0xc3, 0xef, 0x63, 0x11, 0x17, 0x46, 0x9f, 0xd5, 0xa6, 0x46, 0xd7, 0xc3, 0x55, 0x10, 0x37, 0xab, 0xc1, 0x9d, 0x63, 0xf1, 0xd2, 0x01, 0xae, 0xeb, 0x93, 0xf0, 0x8d, 0x8b, 0x41, 0x81, 0x4b, 0x3e, 0xa2, 0x32, 0xfe, 0x13, 0x97, 0x2c, 0xb9, 0x20, 0xf5, 0xc9, 0x03, 0x22, 0x91, 0x54, 0x88, 0x63, 0x9a, 0x10, 0x0f, 0xe1, 0x2c, 0x7b, 0xac, 0xac, 0x21, 0xd3, 0x37, 0x90, 0x2b, 0xda, 0xfc, 0xf4, 0x20, 0xd7, 0xb4, 0x02, 0x94, 0xdd, 0xb5, 0x08, 0xad, 0x4f, 0x65, 0x1e, 0x33, 0xa4, 0xf4, 0x0a, 0xe7, 0x68, 0x4b, 0x60, 0x16, 0x83, 0x3f, 0xee, 0x6d, 0xbe, 0x0b, 0x56, 0x0f, 0x83, 0xfd, 0xfd, 0xe5, 0xe4, 0x6f, 0x24, 0x35, 0xe0, 0xf9, 0x55, 0x77, 0xe1, 0xe5, 0x01, 0x64, 0x88, 0xe3, 0x67, 0x4f, 0xad, 0xfe, 0xb7, 0xb8, 0xa2, 0xcf, 0x78, 0x1f, 0xb8, 0xf1, 0x27, 0x16, 0x05, 0xb5, 0x21, 0x9a, 0x64, 0x16, 0xc3, 0xa3, 0xbc, 0xef, 0xcf, 0xfa, 0x86, 0x6b, 0x11, 0x4b, 0x89, 0xbd, 0x43, 0x7b, 0xe8, 0x12, 0x2f, 0x3b, 0x5f, 0xc4, 0x13, 0xde, 0xca, 0xd1, 0x49, 0x67, 0xe7, 0x8b, 0x27, 0xe7, 0x5c, 0x91, 0x25, 0x06, 0xfc, 0xfd, 0x3d, 0xdf, 0x46, 0xdf, 0x98, 0x11, 0x2e, 0xeb, 0x66, 0x12, 0x21, 0x6e, 0x0e, 0xc7, 0x43, 0x87, 0x87, 0x52, 0xfb, 0x93, 0x05, 0x2c, 0xb1, 0xe9, 0xd9, 0x73, 0xd6, 0xc8, 0x92, 0x85, 0x25, 0x8d, 0x69, 0xcd, 0x29, 0x29, 0xdc, 0xdd, 0x00, 0xd3, 0x98, 0xbd, 0x5e, 0xfa, 0x9c, 0x83, 0xd5, 0x7e, 0x9c, 0x24, 0x53, 0x1f, 0xa3, 0x8a, 0xec, 0x36, 0xfd, 0xe7, 0xd9, 0xa3, 0x54, 0x48, 0xc1, 0x06, 0x19, 0x6d, 0x38, 0x32, 0x26, 0xd8, 0x86, 0xde, 0xa1, 0x24, 0xa9, 0x9e, 0x23, 0x98, 0x9d, 0x12, 0x19, 0xfc, 0xda, 0x5d, 0x6b, 0xab, 0x1f, 0xd9, 0x5c, 0xea, 0x6e, 0x0a, 0xb2, 0x78, 0x57, 0xd0, 0x16, 0x67, 0x7a, 0xe0, 0xbd, 0x29, 0x48, 0x74, 0x48, 0xee, 0x09, 0x42, 0xe9, 0x2e, 0x23, 0xab, 0xc8, 0x81, 0x99, 0x36, 0xa5, 0xb7, 0xd2, 0x3c, 0xbe, 0x25, 0x9c, 0xe5, 0xf3, 0x3d, 0x70, 0x53, 0x28, 0x62, 0xf8, 0x1c, 0xeb, 0xfa, 0xce, 0xfe, 0x56, 0xc4, 0x87, 0xce, 0x37, 0x6b, 0xf0, 0xb2, 0x6f, 0x5c, 0x97, 0x90, 0x98, 0xd5, 0x8d, 0xc6, 0xeb, 0x3f, 0x6b, 0x1c, 0x60, 0xbe, 0x93, 0xf6, 0x16, 0x06, 0xb8, 0xcf, 0xf6, 0x70, 0xa1, 0xe2, 0x94, 0x4d, 0x29, 0x2a, 0x55, 0x7a, 0x8b, 0x8d, 0xd7, 0x35, 0xdc, 0x55, 0x8d, 0x2e, 0xd9, 0xdf, 0xaa, 0xe1, 0xe3, 0x97, 0x41, 0x24, 0x48, 0x24, 0xaa, 0xfc, 0xc4, 0xdf, 0x27, 0xb5, 0x48, 0x8a, 0xc7, 0x32, 0xf9, 0x3f, 0x8b, 0x81, 0x7c, 0xa6, 0xc8, 0xb2, 0x71, 0x6b, 0xcc, 0xea, 0x3d, 0xef, 0xc4, 0xb3, 0x0d, 0x3e, 0xde, 0x96, 0x18, 0x42, 0xaa, 0xec, 0x24, 0x36, 0xc6, 0xf1, 0x4b, 0x5c, 0xba, 0x1a, 0xff, 0xf3, 0x21, 0xa9, 0x4c, 0x64, 0x0a, 0x7e, 0x5d, 0xbc, 0x9d, 0x30, 0x42, 0x5e, 0x02, 0x5c, 0xf0, 0xfa, 0x7e, 0x3d, 0x89, 0xb9, 0xdf, 0x7d, 0xde, 0xba, 0x1b, 0x4b, 0x33, 0xc2, 0x34, 0xae, 0x42, 0x2f, 0x5e, 0x19, 0x82, 0x2e, 0x64, 0x3f, 0xa8, 0x2e, 0x48, 0x28, 0x6e, 0x95, 0x2a, 0x85, 0x94, 0xb1, 0x6a, 0x41, 0x25, 0xf1, 0x11, 0x58, 0xfc, 0x55, 0x6d, 0xec, 0x86, 0x23, 0xfc, 0x96, 0xca, 0xdc, 0x8c, 0xfa, 0xa6, 0x6e, 0x9f, 0x9e, 0x5b, 0xab, 0x14, 0xfc, 0x4c, 0xfa, 0x04, 0xd5, 0x02, 0x4c, 0xeb, 0xc9, 0x74, 0x52, 0x08, 0x25, 0x85, 0xee, 0x06, 0xfc, 0xcf, 0xe7, 0xdb, 0x79, 0x9f, 0xe0, 0xf1, 0x73, 0x40, 0x8b, 0x83, 0x42, 0x7d, 0x1a, 0x4b, 0xd1, 0x61, 0xf6, 0x5a, 0xf5, 0x41, 0xb4, 0x47, 0xfd, 0xfd, 0x45, 0x8b, 0x8b, 0x82, 0x6c, 0x2c, 0xa2, 0x93, 0x75, 0x99, 0xff, 0xca, 0x25, 0xd5, 0xad, 0xd9, 0xed, 0xd8, 0xd4, 0x16, 0x62, 0x33, 0xd2, 0x37, 0xf2, 0xf2, 0x8c, 0x59, 0xcf, 0xc6, 0x06, 0x48, 0x30, 0x64, 0x32, 0xfa, 0xb9, 0x28, 0x06, 0x5c, 0x37, 0xfe, 0xd1, 0x52, 0x91, 0x82, 0xcf, 0xf8, 0xfc, 0x66, 0xfb, 0x2f, 0x6d, 0x14, 0x24, 0x55, 0x54, 0x95, 0x43, 0x53, 0x87, 0xb2, 0x0c, 0xdd, 0x7c, 0x59, 0xc3, 0xf5, 0xbc, 0x42, 0x51, 0xb1, 0x94, 0xd1, 0x97, 0x3f, 0x0e, 0x3f, 0x02, 0x26, 0x20, 0xf5, 0x60, 0xce, 0x22, 0x38, 0xf2, 0x43, 0x85, 0x0b, 0xc2, 0x36 ],
+    const [ 0x5b, 0xfe, 0x61, 0x88, 0x8f, 0xb4, 0x87, 0x79, 0xd4, 0xdc, 0x6b, 0xfb, 0xfe, 0x89, 0x1f, 0xed, 0x45, 0xa8, 0x30, 0xb3, 0x45, 0xed, 0xce, 0xd1, 0x49, 0x0d, 0x2c, 0xb8, 0xc8, 0x2e, 0x2a, 0xdf, 0x30, 0x9b, 0x32, 0x16, 0xe3, 0xbd, 0x5f, 0x18, 0x7f, 0x47, 0xe5, 0x5f, 0x63, 0xb0, 0xad, 0x3c, 0x6f, 0xe6, 0x3f, 0x26, 0x0a, 0x41, 0xe5, 0x53, 0x6a, 0xb5, 0x0d, 0x85, 0x10, 0x4d, 0xf0, 0x27, 0x91, 0xd4, 0x71, 0x98, 0x9c, 0xd5, 0x48, 0xc7, 0x39, 0xc7, 0x5f, 0x00, 0x4f, 0x81, 0x7c, 0x05, 0x69, 0xf4, 0x21, 0x61, 0xb9, 0x18, 0xb1, 0xf9, 0x5e, 0x27, 0xd3, 0xe4, 0xe2, 0x0a, 0x1b, 0x7c, 0x07, 0x10, 0xe8, 0xb5, 0xc3, 0xe6, 0x88, 0xae, 0x89, 0xc4, 0xa3, 0x86, 0xca, 0xe4, 0xd6, 0x71, 0xbc, 0x38, 0x9e, 0x0b, 0x5a, 0x5c, 0x78, 0xec, 0xac, 0xca, 0x46, 0x7c, 0x48, 0x4d, 0xf5, 0x08, 0x19, 0xb8, 0x5d, 0x16, 0x5f, 0xd7, 0x68, 0xf6, 0xf7, 0xa6, 0x77, 0x9a, 0xdd, 0xc1, 0x01, 0xa8, 0xef, 0x1c, 0x7d, 0xcc, 0xf3, 0xf4, 0x83, 0x53, 0xdc, 0x05, 0x2e, 0xf6, 0x49, 0xfe, 0xc4, 0xf3, 0x4f, 0x32, 0x99, 0x63, 0x78, 0x90, 0x30, 0xc7, 0x0b, 0xd5, 0xa4, 0xe4, 0x8e, 0x00, 0x46, 0xd1, 0x8a, 0x06, 0x88, 0x4e, 0x8e, 0xc8, 0x1a, 0x57, 0x76, 0x42, 0x52, 0xf9, 0xed, 0x05, 0xd1, 0x65, 0x31, 0xe7, 0x64, 0x43, 0x17, 0xf9, 0x28, 0x48, 0x4e, 0xb9, 0xf2, 0x0b, 0xe7, 0x89, 0xed, 0x14, 0x15, 0x60, 0x85, 0x36, 0x32, 0xc0, 0x84, 0x20, 0x03, 0xe8, 0x7b, 0x2e, 0x3d, 0x4a, 0x64, 0x85, 0x48, 0x3f, 0x85, 0x5e, 0x42, 0xfa, 0x98, 0xa2, 0x47, 0xba, 0x28, 0xb8, 0xf0, 0x44, 0x3e, 0x9a, 0x19, 0x91, 0x3d, 0x2f, 0xe8, 0xc4, 0x0b, 0xd5, 0x0b, 0x5f, 0x71, 0x3c, 0x40, 0xb5, 0xc5, 0x7b, 0x1b, 0xa3, 0xc6, 0x5d, 0x04, 0x7b, 0xc7, 0xfc, 0x7f, 0x41, 0x10, 0x92, 0xb0, 0x1a, 0x81, 0x8b, 0x1e, 0x01, 0x78, 0xdf, 0xb7, 0xbc, 0xf5, 0x9e, 0x14, 0x0e, 0xfc, 0xcd, 0xff, 0x2f, 0x3b, 0x70, 0x32, 0x79, 0xed, 0xe8, 0x62, 0x64, 0xfe, 0x7f, 0x7c, 0xb4, 0x70, 0x42, 0x2f, 0xf1, 0xfd, 0x0f, 0xaa, 0x18, 0xfe, 0xee, 0xa7, 0x90, 0x8b, 0xa4, 0xa8, 0x5f, 0xe4, 0x86, 0x80, 0x9e, 0x0f, 0x8c, 0x16, 0x2a, 0xc3, 0xa6, 0x66, 0x9d, 0x85, 0x53, 0xc8, 0x7d, 0x11, 0x6f, 0x75, 0xb3, 0xfb, 0x4c, 0x47, 0x3e, 0x96, 0x05, 0xc0, 0x28, 0x15, 0x0f, 0x4e, 0xb9, 0xf0, 0x11, 0xcd, 0xec, 0x8a, 0xf6, 0x4e, 0x1f, 0x10, 0x40, 0x17, 0x0e, 0xa4, 0x9f, 0xeb, 0x02, 0xbb, 0xc2, 0x8b, 0x46, 0xc3, 0x6d, 0x7c, 0xdb, 0x0a, 0xcc, 0x0b, 0x6c, 0xdb, 0x07, 0x8f, 0x84, 0xea, 0x16, 0xee, 0xff, 0xf1, 0xd7, 0x62, 0xbf, 0x9c, 0x5d, 0x7d, 0xa0, 0xa3, 0x8b, 0x6b, 0xad, 0x35, 0xe2, 0x78, 0x94, 0x9d, 0x98, 0xd1, 0x57, 0x20, 0xea, 0x8f, 0x45, 0x24, 0xb3, 0xf1, 0x29, 0x98, 0x3c, 0xe9, 0xc1, 0x8f, 0x56, 0xdb, 0x71, 0x2e, 0xa6, 0xa1, 0x39, 0xc9, 0x41, 0xd2, 0xe5, 0x49, 0x79, 0x44, 0x83, 0xd1, 0xf6, 0xcf, 0x1a, 0xa1, 0x08, 0x54, 0x99, 0x3a, 0x3b, 0xfe, 0x0e, 0xc2, 0x2c, 0xc8, 0x18, 0xab, 0x9c, 0x40, 0x9f, 0x90, 0xc3, 0x8a, 0xc2, 0x5f, 0xe6, 0xa7, 0x11, 0xbd, 0x2c, 0xf8, 0xfd, 0xa6, 0xae, 0xfd, 0x8c, 0x54, 0xcd, 0x63, 0x52, 0x63, 0xc8, 0x3e, 0x9c, 0x32, 0x8e, 0x93, 0xee, 0x8c, 0xd0, 0x19, 0xb0, 0x88, 0x5b, 0x40, 0x24, 0xad, 0xa5, 0x73, 0x9b, 0x5a, 0xa5, 0x9a, 0xe9, 0x65, 0xe8, 0xe4, 0x16, 0x03, 0xe2, 0xc3, 0x56, 0xe8, 0x82, 0x38, 0x3b, 0xaf, 0x09, 0x50, 0x2a, 0x7b, 0x1b, 0xef, 0x0c, 0xdf, 0x16, 0xcc, 0x45, 0xfb, 0xa4, 0xbd, 0xea, 0xe8, 0x8c, 0x35, 0x2e, 0x57, 0xce, 0x0a, 0x1e, 0x74, 0xee, 0x7c, 0x8f, 0x11, 0x90, 0x74, 0x54, 0x00, 0x45, 0x09, 0xb4, 0xc0, 0xa5, 0x48, 0x1b, 0x5d, 0x9e, 0x35, 0x0f, 0x91, 0x0b, 0x0d, 0x66, 0x2f, 0x88, 0xce, 0xb6, 0xc1, 0x85, 0xf9, 0x0e, 0x70, 0x9a, 0x97, 0xe3, 0x25, 0x1a, 0x7a, 0x4d, 0xee, 0xeb, 0xc5, 0x74, 0xa3, 0x95, 0xaf, 0x44, 0xc9, 0x98, 0x83, 0x69, 0xb6, 0x03, 0xeb, 0x77, 0xf6, 0x42, 0x6f, 0x68, 0xee, 0x38, 0x39, 0x4c, 0xbf, 0x8e, 0x1b, 0x3c, 0x6e, 0x4a, 0xd3, 0x90, 0x41, 0xa3, 0x8d, 0x52, 0x6c, 0x13, 0xa9, 0xf2, 0xec, 0xaf, 0xbf, 0x3a, 0xb4, 0xb4, 0xe0, 0x85, 0x07, 0x62, 0x1f, 0x2c, 0x25, 0x0d, 0x50, 0x42, 0x29, 0x71, 0x10, 0x81, 0x32, 0x46, 0x06, 0x83, 0xc1, 0x14, 0x68, 0x36, 0x62, 0x49, 0xc0, 0x8a, 0x8f, 0x89, 0xf0, 0x6c, 0xd1, 0x45, 0x73, 0xf8, 0x28, 0x8f, 0xe7, 0xea, 0xad, 0x2c, 0xc8, 0x56, 0x76, 0xeb, 0x7f, 0x9a, 0xba, 0x36, 0x9b, 0x90, 0x35, 0xe7, 0x5e, 0x08, 0xce, 0x5d, 0x7b, 0x75, 0x78, 0xce, 0x1e, 0xe6, 0x56, 0xde, 0x2d, 0x38, 0x22, 0x71, 0xcd, 0x8a, 0xcf, 0xbe, 0x29, 0xf2, 0x6d, 0xa6, 0x6f, 0x6e, 0x4e, 0x43, 0x1a, 0x1e, 0x67, 0xc3, 0x77, 0xb0, 0xf8, 0x77, 0x62, 0x1b, 0x70, 0x27, 0x51, 0x90, 0x8b, 0xa9, 0x95, 0xad, 0xbd, 0xb1, 0xdc, 0xf5, 0xd3, 0xeb, 0xf9, 0x7d, 0xd8, 0x47, 0xe8, 0xe7, 0x35, 0x95, 0x0c, 0x94, 0x1d, 0x51, 0xbc, 0x16, 0x28, 0xc0, 0xfe, 0xe4, 0x3e, 0x3c, 0x92, 0x52, 0xb7, 0xcb, 0x33, 0xc0, 0xc0, 0xf7, 0x19, 0x11, 0x01, 0xda, 0xc2, 0x5f, 0x7d, 0x79, 0xf2, 0xec, 0xb9, 0x53, 0xf9, 0x5c, 0x20, 0x39, 0x34, 0x22, 0xa6, 0x5f, 0xd6, 0x39, 0xac, 0xb4, 0xe8, 0x14, 0x23, 0x6f, 0x8f, 0xd7, 0xf5, 0xea, 0x8e, 0xc7, 0xa0, 0xb4, 0x0b, 0xff, 0x24, 0xe2, 0x96, 0x66, 0x20, 0xa5, 0x67, 0xdd, 0x38, 0x22, 0xe7, 0xbd, 0xb9, 0x7d, 0x73, 0x80, 0x80, 0x37, 0x5c, 0xbe, 0x18, 0xbb, 0x32, 0x5c, 0x22, 0x33, 0x42, 0x00, 0xfa, 0xa0, 0x5d, 0xc7, 0x97, 0x2a, 0xdb, 0x3b, 0xb3, 0xb4, 0xe0, 0x7f, 0x2c, 0xb4, 0xde, 0xcd, 0xab, 0x42, 0x5b, 0x23, 0x83, 0x6f, 0xf5, 0x38, 0xdc, 0xd7, 0xa3, 0xb5, 0x10, 0x7a, 0x3d, 0xa2, 0x55, 0xc7, 0x3f, 0x1e, 0x9d, 0xfa, 0xca, 0x54, 0xba, 0xa8, 0xeb, 0xaa, 0xc6, 0x98, 0x20, 0x3b, 0xc2, 0xd5, 0x18, 0x88, 0x7d, 0x01, 0xbb, 0x6a, 0xb7, 0xec, 0x6a, 0x4c, 0x87, 0x66, 0x88, 0x96, 0xfa, 0x51, 0x39, 0x6c, 0xfd, 0xfa, 0x69, 0x99, 0x7d, 0xa9, 0x11, 0xc6, 0xcc, 0x76, 0xb5, 0xf0, 0x47, 0x5f, 0x32, 0x19, 0x36, 0x98, 0xb6, 0x3d, 0xf3, 0x22, 0x10, 0x87, 0x4f, 0x9f, 0x2a, 0xc5, 0x31, 0x65, 0xd3, 0x1a, 0x80, 0xd1, 0xc2, 0xf2, 0x43, 0xdd, 0xd8, 0x3b, 0x07, 0xf5, 0xa6, 0xd3, 0x81, 0x07, 0x2f, 0x3c, 0x75, 0xda, 0xef, 0x97, 0xd7, 0xa0, 0x1c, 0xd0, 0x2f, 0xce, 0x2b, 0x16, 0x42, 0x2b, 0x96, 0x8e, 0xee, 0x27, 0xdd, 0x48, 0x56, 0x6f, 0xcb, 0x72, 0x3f, 0xbe, 0xfa, 0xcb, 0xba, 0xf6, 0x99, 0x5b, 0x04, 0x6f, 0x6d, 0x62, 0xaa, 0x8f, 0x16, 0x8e, 0xf0, 0x9b, 0x94, 0x70, 0x74, 0xcc, 0x09, 0x31, 0x0f, 0xa6, 0xc0, 0x81, 0xfc, 0x85, 0x6f, 0xd1, 0x3c, 0x79, 0xb9, 0xc2, 0x38, 0x53, 0xf7, 0xdd, 0xa9, 0x00, 0x38, 0x84, 0xb5, 0x16, 0x86, 0x28, 0x5a, 0xad, 0x6c, 0xbd, 0x10, 0x70, 0xb5, 0x6b, 0xaa, 0xf4, 0x75, 0x87, 0x7e, 0x48, 0x4e, 0xc1, 0xc5, 0xcd, 0xec, 0x9f, 0x45, 0x47, 0xd2, 0x2a, 0x2d, 0x35, 0x59, 0xe7, 0x40, 0x5e, 0xf5, 0x08, 0x35, 0xad, 0xbb, 0xe4, 0x5e, 0x3e, 0x20, 0xa5, 0x89, 0xb9, 0x04, 0x40, 0x24, 0xdf, 0xef, 0xab, 0xa4, 0x62, 0x9a, 0x4a, 0x27, 0xfa, 0xb1, 0xaa, 0x57, 0xb5, 0xd7, 0x71, 0x92, 0x8f, 0xeb, 0x95, 0x49, 0x42, 0x89, 0xcd, 0xa6, 0x5f, 0xd4, 0x45, 0x72, 0x9e, 0x73, 0x96, 0x35, 0x72, 0xda, 0xf5, 0x9f, 0xe1, 0xcb, 0xaa, 0x26, 0x93, 0x1c, 0xc5, 0xf1, 0x29, 0xba, 0x0c, 0xf5, 0xd0, 0xee, 0x37, 0x5e, 0x15, 0xdf, 0x60, 0x30, 0xfb, 0x59, 0xb5, 0x2e, 0x4a, 0xcc, 0x70, 0xfb, 0x2b, 0x98, 0x09, 0x7f, 0xf2, 0x87, 0xa9, 0x8c, 0x3b, 0x9b, 0xe3, 0xc1, 0x38, 0x0b, 0x9f, 0xaf, 0x49, 0x88, 0x56, 0x3b, 0xcd, 0xc4, 0x85, 0x43, 0x39, 0x35, 0x5b, 0x85, 0x67, 0x17, 0xb5, 0xbc, 0x30, 0xb0, 0x4d, 0x0b, 0x3c, 0xd7, 0x2e, 0x9f, 0x19, 0xb7, 0x6c, 0x91, 0x8b, 0xd1, 0x11, 0x09, 0x23, 0x40, 0x5a, 0xa9, 0x13, 0x41, 0x24, 0x29, 0x41, 0xf2, 0xa1, 0x3e, 0x9a, 0x5a, 0x4f, 0xc1, 0xa9, 0xaa, 0x2b, 0x0d, 0x68, 0xc2, 0x22, 0xa9, 0x56, 0xf7, 0xc8, 0x27, 0xc9, 0x14, 0x4c, 0x4b, 0x86, 0x9e, 0xac, 0x70, 0x8f, 0x5d, 0x25, 0x28, 0x3c, 0x17, 0xee, 0x23, 0x8d, 0x9f, 0x25, 0x52, 0xbf, 0x0f, 0x0a, 0x4b, 0x1d, 0x51, 0x6b, 0xf0, 0x19, 0xe4, 0x5f, 0x4b, 0x9b, 0xdc, 0x37, 0xbd, 0x99, 0x2b, 0xb2, 0x58, 0xe8, 0x20, 0x70, 0x89, 0x52, 0x2d, 0xa9, 0xfa, 0xe8, 0xed, 0x1f, 0xb6, 0x99, 0x65, 0x51, 0x8f, 0x04, 0x8b, 0xf2, 0xbd, 0x8b, 0x04, 0x99, 0xc7, 0xa9, 0x32, 0xba, 0xa7, 0x85, 0x6e, 0xd5, 0x29, 0xc7, 0x92, 0xed, 0x94, 0xaa, 0xbb, 0x3c, 0x8c, 0x52, 0x4d, 0x25, 0x37, 0x61, 0x37, 0x6a, 0x9f, 0xc5, 0x78, 0x9f, 0x57, 0xd3, 0xe2, 0xdf, 0x62, 0x9a, 0x1d, 0xbd, 0x50, 0x71, 0xf0, 0x7d, 0xaa, 0xd3, 0xbc, 0x85, 0x90, 0x6d, 0x49, 0x0e, 0xa1, 0x74, 0xc5, 0x1f, 0x1b, 0x3c, 0x0a, 0xbc, 0x43, 0x07, 0x20, 0x5b, 0x08, 0x1b, 0x03, 0x97, 0xe3, 0x17, 0xa6, 0x28, 0x01, 0x86, 0x37, 0x13, 0xa4, 0xb5, 0xa5, 0x1e, 0xc7, 0xc2, 0x60, 0x87, 0x01, 0xf6, 0x60, 0xf5, 0xab, 0x54, 0x68, 0xaf, 0x45, 0x72, 0x8c, 0x0c, 0x16, 0x88, 0xf1, 0x2b, 0x13, 0xc7, 0xd4, 0xe3, 0x02, 0xec, 0xcd, 0xfd, 0xdf, 0x14, 0x55, 0xa1, 0x7f, 0xd2, 0x87, 0x0f, 0x73, 0x7f, 0x23, 0x90, 0x2f, 0xd1, 0xd8, 0xab, 0x6c, 0xaf, 0xc3, 0x9b, 0xca, 0x44, 0x33, 0x01, 0xba, 0x53, 0xaf, 0xd7, 0x9b, 0xca, 0x3a, 0xa5, 0x23, 0x99, 0xd5, 0xf7, 0x01, 0xc4, 0x46, 0x0e, 0xc0, 0xb7, 0x18, 0xd6, 0xef, 0xdb, 0xe3, 0x18, 0x7f, 0x66, 0xcd, 0xf1, 0x6c, 0x77, 0x51, 0x83, 0xa0, 0x62, 0x3f, 0xea, 0x14, 0x48, 0x04, 0x71, 0x38, 0xec, 0x2c, 0x06, 0x95, 0xc1, 0x25, 0xec, 0xb0, 0x48, 0x46, 0xb0, 0x32, 0x98, 0x0f, 0x5e, 0x47, 0x3e, 0xb3, 0xf4, 0x44, 0x48, 0xd3, 0x17, 0x8c, 0x9d, 0x8d, 0x05, 0xb4, 0x90, 0xb5, 0xcb, 0xe5, 0xb4, 0x62, 0xb8, 0x82, 0xf1, 0xad, 0x11, 0x0b, 0xd7, 0xb5, 0x06, 0x42, 0x33, 0xe7, 0xe5, 0x8c, 0xe0, 0x7c, 0x8e, 0x99, 0xe0, 0x42, 0x27, 0x47, 0xab, 0xa0, 0x11, 0xc4, 0xc7, 0xd4, 0x1a, 0xf3, 0x99, 0x80, 0xf4, 0x12, 0x7b, 0x65, 0xe6, 0x99, 0x0f, 0x6e, 0xc1, 0x65, 0xd2, 0xf0, 0x16, 0x15, 0xf4, 0x30, 0xa6, 0xb5, 0x67, 0x26, 0x1a, 0x9a, 0x36, 0x80, 0xf4, 0x8c, 0x18, 0xea, 0xc6, 0x2b, 0x45, 0x8d, 0xa1, 0x8b, 0x88, 0xd5, 0xd1, 0x22, 0x95, 0x78, 0xc7, 0xe4, 0x9e, 0xb4, 0x57, 0xac, 0x21, 0xd8, 0x24, 0xde, 0x04, 0x05, 0x58, 0x4a, 0xe3, 0x36, 0x98, 0x54, 0xa9, 0x7e, 0x37, 0x52, 0x5d, 0x91, 0xa9, 0x36, 0x3f, 0x86, 0x3b, 0x6d, 0x14, 0xdb, 0x02, 0x07, 0xbe, 0xba, 0x11, 0x17, 0x0f, 0x7a, 0xef, 0x5d, 0xdf, 0x69, 0x49, 0x22, 0x5c, 0xc9, 0xe3, 0x64, 0xa2, 0x18, 0xd4, 0x33, 0x8c, 0x95, 0xf3, 0x5b, 0xc9, 0xff, 0x8d, 0x43, 0x32, 0xa0, 0x59, 0x15, 0x5a, 0x8a, 0xad, 0x1f, 0x67, 0x21, 0xf1, 0x7a, 0x21, 0xd9, 0x55, 0xe9, 0x49, 0x41, 0xbf, 0x03, 0x2c, 0x41, 0x07, 0x95, 0x78, 0x9f, 0x67, 0x42, 0x4d, 0xc8, 0x2d, 0x6c, 0x97, 0xce, 0xb3, 0x58, 0x9c, 0xad, 0x91, 0x8c, 0xd1, 0xd2, 0x11, 0x7c, 0xf2, 0xde, 0xe4, 0x66, 0x51, 0xa7, 0x13, 0x7b, 0x6f, 0x7f, 0x38, 0x3f, 0xc9, 0xba, 0xed, 0x32, 0xf4, 0x6a, 0x85, 0xb0, 0xec, 0x6d, 0xfa, 0x16, 0xaa, 0xaa, 0x27, 0x26, 0xf4, 0x97, 0x37, 0xad, 0x79, 0xff, 0x5e, 0x62, 0x1d, 0x02, 0xc7, 0x12, 0x92, 0x5d, 0xcd, 0xfa, 0x28, 0xeb, 0x6d, 0x75, 0xe6, 0x6c, 0xfb, 0xd7, 0xd9, 0x86, 0x15, 0x98, 0xac, 0x09, 0xd6, 0xb5, 0x79, 0x77, 0x4b, 0x53, 0xdf, 0xc4, 0x2b, 0xa5, 0x55, 0x5a, 0xc2, 0x11, 0xbd, 0x60, 0x2f, 0x8e, 0x3d, 0x3c, 0xcf, 0x51, 0x4a, 0x56, 0xf9, 0xa8, 0x05, 0x1f, 0xec, 0x26, 0xcb, 0x53, 0x05, 0x00, 0x07, 0x7b, 0x36, 0xb7, 0x4b, 0xb5, 0xb3, 0xf7, 0xa0, 0xb7, 0xee, 0xc0, 0x1a, 0x12, 0xc6, 0xc3, 0xaf, 0xb4, 0xfb, 0x0f, 0x48, 0xb1, 0xe6, 0xec, 0x19, 0x43, 0x67, 0x07, 0x2e, 0x0f, 0x1e, 0xd0, 0x47, 0xa9, 0xde, 0x21, 0xe6, 0x5b, 0x5e, 0x20, 0xa6, 0x22, 0x32, 0x66, 0xce, 0xfa, 0xfa, 0x61, 0x26, 0x5b, 0xda, 0xf6, 0x0a, 0x04, 0x2a, 0x6b, 0xbc, 0xf7, 0x6e, 0x85, 0xff, 0xc5, 0x88, 0xed, 0xe1, 0x0b, 0x2c, 0xd8, 0xd8, 0x3d, 0x95, 0xe7, 0x10, 0xa2, 0x76, 0x4c, 0x04, 0xa0, 0x34, 0x2f, 0x4c, 0x3a, 0x52, 0x50, 0xb5, 0xd7, 0x2d, 0xed, 0x97, 0x45, 0xe9, 0xe6, 0x63, 0xfd, 0xab, 0x1f, 0x7c, 0xa9, 0x08, 0x26, 0x48, 0xe3, 0xbe, 0x16, 0x86, 0x40, 0xa2, 0xbb, 0xe2, 0x8d, 0xda, 0xf6, 0xc6, 0x58, 0x4c, 0x63, 0x74, 0xb3, 0x56, 0x3a, 0x52, 0x34, 0xc0, 0x73, 0x84, 0x40, 0xef, 0x2e, 0xc0, 0x89, 0x5b, 0x51, 0x5e, 0xd6, 0x43, 0x73, 0xaf, 0x03, 0x9f, 0xf9, 0x90, 0x48, 0x56, 0x7e, 0x3f, 0xbe, 0xb1, 0x79, 0x6d, 0x1e, 0x0f, 0x19, 0x94, 0xcc, 0xdb, 0x74, 0x8a, 0x15, 0xbc, 0xe1, 0x57, 0xb5, 0x0b, 0xa2, 0x44, 0x9d, 0x8a, 0xc7, 0x34, 0xf3, 0x53, 0x4e, 0x37, 0x59, 0x0e, 0x8f, 0x5d, 0x72, 0x67, 0xd8, 0xc8, 0xa2, 0xc0, 0x54, 0x05, 0x16, 0x22, 0x31, 0x9d, 0x05, 0x7a, 0x01, 0xe6, 0x35, 0x02, 0x61, 0x1f, 0xc0, 0xfd, 0xd9, 0xbc, 0x18, 0xa7, 0x04, 0xff, 0x49, 0x6c, 0xf1, 0xc8, 0x7e, 0x58, 0xc8, 0xae, 0xc7, 0xcf, 0xb1, 0x4e, 0x19, 0x7e, 0xf1, 0xe3, 0x97, 0x91, 0x56, 0x18, 0x0f, 0x26, 0xd6, 0x1a, 0xc8, 0x02, 0x73, 0xf0, 0x7b, 0x83, 0x62, 0x0f, 0x9f, 0xd6, 0x6b, 0x29, 0xe9, 0x6a, 0x93, 0x47, 0x14, 0xa5, 0xf9, 0x17, 0xde, 0xd5, 0xfe, 0x87, 0x53, 0x69, 0xa8, 0x92, 0x4d, 0x61, 0x49, 0x5a, 0x3c, 0x03, 0x5b, 0x78, 0x23, 0xd0, 0xaf, 0x90, 0xe3, 0xb6, 0xc7, 0x28, 0xbc, 0x87, 0x80, 0xba, 0x11, 0xaa, 0xf3, 0x07, 0x6b, 0x11, 0x9e, 0xaf, 0xc1, 0x6a, 0xbf, 0xff, 0xf7, 0x9a, 0x01, 0x0a, 0xa4, 0x67, 0x5a, 0xfb, 0x18, 0x74, 0x34, 0xa9, 0x9e, 0x73, 0xcb, 0x6c, 0xfe, 0x96, 0xd6, 0x30, 0x46, 0x46, 0x69, 0xc7, 0xca, 0x18, 0x1a, 0x84, 0x6a, 0xfd, 0x63, 0x05, 0x13, 0xb9, 0x47, 0x50, 0x89, 0x96, 0x38, 0x22, 0x63, 0x59, 0x39, 0x83, 0x57, 0x75, 0x40, 0x9e, 0xb7, 0x7f, 0xde, 0xd0, 0x3c, 0xe2, 0x21, 0xff, 0x03, 0xd4, 0xba, 0x2d, 0xd5, 0x88, 0x5b, 0x4c, 0xab, 0xa5, 0x63, 0x54, 0x71, 0xf8, 0xbd, 0x94, 0x0b, 0x65, 0x05, 0x45, 0x96, 0x24, 0xed, 0x65, 0xf0, 0x2a, 0xe0, 0xc3, 0x7a, 0xe4, 0xe5, 0x56, 0x1c, 0x2b, 0xc5, 0xd2, 0x8a, 0x75, 0x70, 0x7d, 0xc6, 0x48, 0x9d, 0x3f, 0xe7, 0xf5, 0xb1, 0xf9, 0x18, 0x82, 0xe2, 0x18, 0xe3, 0xe8, 0x9c, 0x6a, 0xb0, 0x7f, 0x23, 0x30, 0x88, 0xb6, 0x7b, 0x74, 0x1f, 0x07, 0x85, 0x9d, 0x12, 0x2a, 0x6a, 0x40, 0x6d, 0x89, 0x3c, 0x39, 0x70, 0xf5, 0xdb, 0xfb, 0x93, 0x97, 0x16, 0x24, 0xc7, 0x29, 0x13, 0x55, 0xff, 0x66, 0xf1, 0x40, 0xef, 0xbe, 0xab, 0x02, 0x13, 0x4f, 0x40, 0xb4, 0xf4, 0x11, 0x11, 0x3c, 0xa7, 0x50, 0x8a, 0x69, 0x96, 0x60, 0x04, 0x40, 0x83, 0x8c, 0xea, 0x90, 0xc9, 0x4f, 0x1b, 0xcd, 0xe5, 0xc7, 0x90, 0x1a, 0x36, 0x66, 0x3f, 0xa8, 0x01, 0xeb, 0x3f, 0x3f, 0xb8, 0x90, 0x2c, 0x1a, 0x7c, 0x85, 0xcd, 0xf8, 0xe0, 0x9e, 0xf4, 0x70, 0xf0, 0x49, 0xa6, 0x85, 0x72, 0xc2, 0x7c, 0x7a, 0x6b, 0x8a, 0x49, 0xe8, 0xe5, 0x15, 0xfd, 0x0d, 0xf0, 0xc2, 0xca, 0x67, 0xe7, 0x11, 0x85, 0x81, 0xf4, 0x11, 0x4e, 0x0e, 0xd6, 0x17, 0x73, 0x34, 0xe2, 0xb5, 0x92, 0x2a, 0x48, 0xea, 0xfe, 0x05, 0x98, 0x97, 0x64, 0xcf, 0x85, 0x32, 0xaf, 0xda, 0xe8, 0xbe, 0x28, 0x53, 0x08, 0xfb, 0xe2, 0x1a, 0x18, 0xda, 0x55, 0xd1, 0x01, 0x33, 0x49, 0x34, 0x62, 0xba, 0xf6, 0xa8, 0xd5, 0x30, 0x69, 0x16, 0x75, 0xd6, 0x29, 0xf9, 0x9d, 0x27, 0x1b, 0xb6, 0xf2, 0xc6, 0xa3, 0x2d, 0xa3, 0xb6, 0x0c, 0x8d, 0xef, 0xc9, 0x2a, 0x6c, 0xe8, 0x5b, 0x3d, 0x17, 0x77, 0x3f, 0x19, 0x26, 0xa1, 0xfa, 0x84, 0x54, 0x08, 0x2f, 0xe0, 0x8e, 0xb5, 0x5b, 0x0a, 0x4a, 0x14, 0xc3, 0x81, 0x1a, 0x40, 0xaa, 0xcb, 0x81, 0x81, 0xc6, 0x14, 0x05, 0x14, 0xf5, 0x19, 0x85, 0x2a, 0x2d, 0x44, 0xcd, 0x32, 0xb1, 0x18, 0x68, 0x5b, 0x8b, 0xd0, 0xb5, 0x55, 0x36, 0x43, 0x3e, 0x58, 0x9b, 0x0b, 0x44, 0x68, 0x3f, 0xe6, 0x9f, 0xd7, 0xba, 0x5c, 0xc5, 0x0b, 0x6b, 0xa3, 0x28, 0x82, 0x6a, 0xbf, 0xc5, 0x12, 0xbe, 0xed, 0xf9, 0x76, 0xd0, 0x42, 0x97, 0x06, 0x20, 0x90, 0x39, 0xc6, 0x37, 0x89, 0xd3, 0xa2, 0xdd, 0x27, 0x8e, 0xf8, 0x8b, 0x4b, 0xd3, 0x57, 0x23, 0xa4, 0xa5, 0x87, 0xdf, 0xd2, 0x35, 0xc9, 0x87, 0xcb, 0xb0, 0x5f, 0xe8, 0x7e, 0x5c, 0x4f, 0x81, 0xb7, 0xe3, 0x65, 0x7f, 0x43, 0xef, 0x77, 0xec, 0x54, 0xf6, 0xec, 0x23, 0x27, 0x58, 0x7f, 0x87, 0xe3, 0xa7, 0x41, 0x74, 0xc5, 0x45, 0xdd, 0x76, 0x7a, 0x35, 0x20, 0xb9, 0xcc, 0x2b, 0xb9, 0xc1, 0x81, 0xe5, 0x3d, 0x5b, 0x80, 0xbe, 0x6e, 0xd4, 0x36, 0x81, 0xbc, 0x68, 0x38, 0x7b, 0x0c, 0xfd, 0x2a, 0xd4, 0xb9, 0x12, 0xdf, 0x1f, 0xd8, 0xf2, 0xc1, 0x2f, 0xc1, 0x2d, 0x74, 0x2c, 0xcb, 0x48, 0xb6, 0xe7, 0x56, 0xb4, 0x8a, 0x6b, 0x0f, 0xfd, 0x95, 0xd5, 0x6f, 0x44, 0xc8, 0x65, 0x85, 0xef, 0x3f, 0xd4, 0xf6, 0x9f, 0x69, 0xe8, 0x42, 0x62, 0x6a, 0x47, 0x48, 0x2b, 0xbd, 0x89, 0x0d, 0x7f, 0x1e, 0x90, 0xb9, 0x70, 0xa7, 0x1c, 0xe2, 0xcf, 0x39, 0x9a, 0x0d, 0x9e, 0x1d, 0x3d, 0x72, 0xc4, 0xeb, 0x50, 0x00, 0x04, 0xab, 0xcb, 0xa1, 0x30, 0x3b, 0x24, 0xbf, 0x9a, 0xf1, 0x67, 0x07, 0xcc, 0x80, 0x89, 0x6d, 0x79, 0x20, 0xfa, 0x70, 0xb3, 0xe9, 0x79, 0x9f, 0x5d, 0x80, 0x2c, 0x5c, 0xe4, 0xf6, 0xf0, 0xe0, 0x2a, 0xed, 0xee, 0x7f, 0xc3, 0xfd, 0x6f, 0x2d, 0x64, 0x56, 0xf1, 0x42, 0x98, 0xa6, 0x79, 0x7a, 0xb5, 0x3d, 0x2c, 0x40, 0x0f, 0x6f, 0x19, 0x2c, 0x6b, 0x39, 0x5a, 0xca, 0xb7, 0x28, 0x5b, 0x9d, 0xf8, 0x77, 0x79, 0x63, 0x83, 0x77, 0xcf, 0x9b, 0x70, 0x34, 0x4c, 0x45, 0x4c, 0x56, 0x09, 0xe9, 0x0e, 0x45, 0xda, 0xda, 0x4c, 0x91, 0x24, 0xbc, 0xaf, 0x90, 0xee, 0x44, 0xa5, 0x49, 0x3a, 0x3f, 0x55, 0x90, 0x95, 0xd6, 0xd8, 0x73, 0xed, 0x10, 0xa6, 0xd5, 0xa3, 0x98, 0x4e, 0x59, 0xe1, 0xc1, 0x6b, 0x82, 0x2e, 0xc7, 0xd3, 0x18, 0x3f, 0x58, 0x11, 0xcd, 0x10, 0x52, 0x16, 0x20, 0x34, 0xcf, 0x2b, 0x82, 0x6a, 0x5f, 0x2a, 0xb7, 0x70, 0x94, 0xee, 0x80, 0x1c, 0xc4, 0x08, 0x77, 0xa8, 0x0a, 0xb3, 0x3a, 0x4e, 0x8e, 0x0b, 0xcb, 0x14, 0x06, 0x79, 0x37, 0xea, 0x7d, 0x72, 0x76, 0xf2, 0x53, 0x61, 0x93, 0x1f, 0x86, 0xe1, 0x0d, 0x01, 0x2f, 0x30, 0x7c, 0xdf, 0x50, 0xe0, 0x77, 0x07, 0xcc, 0xd0, 0xb6, 0x62, 0xb7, 0x5b, 0x74, 0x4b, 0xd0, 0xcf, 0x17, 0xa1, 0x4c, 0x21, 0x13, 0x1b, 0xd6, 0xdf, 0x0c, 0xdc, 0xd3, 0x65, 0x3b, 0x48, 0xea, 0x54, 0x12, 0x15, 0xc4 ],
+    const [ 0xf5, 0x73, 0x04, 0x25, 0x76, 0xd4, 0x7a, 0x37, 0x21, 0x6e, 0x1a, 0x4e, 0x3b, 0x45, 0x68, 0x29, 0x98, 0xab, 0xff, 0x4e, 0xb1, 0x06, 0x3b, 0xf3, 0xf7, 0xd3, 0x35, 0x1e, 0x67, 0xeb, 0xf4, 0x0c, 0x5f, 0x05, 0xe1, 0xd0, 0xb0, 0x7d, 0x7c, 0x3c, 0xf4, 0x54, 0x4e, 0x04, 0x22, 0x77, 0x1e, 0x21, 0x5f, 0x44, 0x68, 0x74, 0x17, 0x4a, 0x0b, 0xac, 0x4d, 0x50, 0x42, 0x69, 0x2f, 0x99, 0xd5, 0xa1, 0xee, 0x67, 0x91, 0x44, 0xcc, 0xbe, 0xf5, 0x1b, 0x77, 0x6a, 0x2e, 0xf6, 0x95, 0x44, 0x46, 0x06, 0xa0, 0xb0, 0x98, 0x88, 0xf4, 0x6a, 0x87, 0xa3, 0x26, 0x83, 0x6f, 0x94, 0x98, 0xa6, 0xdc, 0x08, 0x4a, 0xa0, 0xfa, 0xc9, 0xf3, 0x1f, 0x4d, 0x9d, 0x51, 0xba, 0xa2, 0x6c, 0xbd, 0x32, 0x46, 0xa0, 0x02, 0xf8, 0x75, 0xd1, 0x6f, 0xef, 0x15, 0xa2, 0x2b, 0x72, 0xa5, 0xe6, 0xc9, 0x99, 0x70, 0x08, 0x1c, 0xb8, 0x06, 0xa9, 0x4d, 0x29, 0xec, 0x8a, 0x2a, 0x4c, 0x93, 0xad, 0xc1, 0xcb, 0x87, 0xb7, 0x2e, 0x23, 0xe9, 0x99, 0xb1, 0x60, 0x1f, 0x6f, 0x04, 0x27, 0xca, 0xa8, 0xeb, 0xfa, 0xf8, 0x68, 0x0c, 0xb8, 0x9c, 0x2a, 0x01, 0x63, 0x3b, 0xaa, 0xac, 0x26, 0xe7, 0x02, 0xca, 0x97, 0x71, 0x13, 0xcb, 0x39, 0xdb, 0x26, 0xe2, 0x45, 0x0c, 0xd3, 0x58, 0xaa, 0xc7, 0x23, 0x25, 0x52, 0xde, 0xf1, 0xc1, 0xa7, 0xa3, 0x96, 0x38, 0x56, 0xa0, 0xc5, 0x7d, 0x52, 0x88, 0xb3, 0x00, 0x1d, 0x6d, 0x7b, 0x82, 0x43, 0x32, 0xc2, 0x28, 0x27, 0x44, 0x96, 0xcf, 0x01, 0x85, 0x9c, 0xa0, 0x28, 0x89, 0x6b, 0xe4, 0x8d, 0x05, 0x33, 0x19, 0x88, 0x84, 0xa2, 0x45, 0xd8, 0x5c, 0x08, 0x8a, 0xe5, 0xe1, 0xb9, 0xfb, 0x47, 0xd8, 0xb3, 0xae, 0x8c, 0x2f, 0x80, 0x12, 0x36, 0xeb, 0x5e, 0x83, 0x04, 0x61, 0x9e, 0x1c, 0x73, 0xa9, 0x4a, 0xcd, 0x83, 0x50, 0x0a, 0xad, 0xbe, 0x4d, 0x48, 0x91, 0x77, 0x36, 0x93, 0xdd, 0x50, 0xb4, 0x41, 0x9a, 0xff, 0x35, 0x59, 0xc9, 0x51, 0xe0, 0xb0, 0xf7, 0x6e, 0xce, 0x51, 0x12, 0x60, 0x77, 0x22, 0x7b, 0xcf, 0x6a, 0xc5, 0x5c, 0x0e, 0x42, 0xbd, 0x3c, 0x5c, 0xd5, 0xd2, 0xd1, 0x63, 0xae, 0xb6, 0x15, 0x05, 0xbe, 0xe8, 0x9c, 0x58, 0x4e, 0xd9, 0x24, 0xef, 0x38, 0x4e, 0x6e, 0x5c, 0x57, 0x05, 0x4c, 0xf2, 0x3c, 0x9b, 0xfc, 0xd0, 0x22, 0xad, 0xb4, 0x1b, 0x24, 0x3e, 0x7e, 0x8a, 0xae, 0x58, 0x46, 0x28, 0x32, 0xf6, 0x31, 0x55, 0x1c, 0x22, 0x31, 0x0e, 0x07, 0x5b, 0xd7, 0x6f, 0x31, 0x39, 0x68, 0x76, 0x2c, 0x54, 0x32, 0x0a, 0xd7, 0x61, 0x20, 0x3c, 0x8d, 0x9e, 0x8d, 0xcc, 0x9c, 0x71, 0x56, 0xef, 0xf9, 0x4b, 0x33, 0x4f, 0x32, 0xd3, 0x47, 0x54, 0xa3, 0x41, 0xf5, 0xa2, 0xed, 0x07, 0xf6, 0xe3, 0xa4, 0xb7, 0xa8, 0xc6, 0x48, 0x21, 0xa9, 0x47, 0x77, 0xbb, 0xa5, 0x32, 0x60, 0x47, 0x6c, 0xe2, 0x7b, 0xaf, 0x48, 0x4f, 0x78, 0x34, 0x8d, 0x48, 0x75, 0xc7, 0x71, 0xfc, 0x73, 0xb7, 0x1e, 0xbf, 0x0b, 0x8d, 0x06, 0x0b, 0x5d, 0x35, 0x77, 0xc5, 0x4a, 0x5e, 0x6f, 0xc2, 0xe3, 0x22, 0xb1, 0x8a, 0x20, 0xea, 0x18, 0x5c, 0xd6, 0x8c, 0x2c, 0x72, 0xe3, 0xb7, 0xf3, 0x85, 0xab, 0x91, 0x0a, 0x94, 0xc9, 0x9e, 0xf3, 0xe2, 0xfe, 0xe4, 0xb1, 0x3e, 0x6d, 0x4d, 0x92, 0x86, 0x0b, 0x4c, 0x4d, 0x6e, 0x51, 0xc3, 0x4c, 0x7e, 0x34, 0x25, 0x4b, 0x5a, 0x56, 0xd8, 0x22, 0x46, 0x7e, 0xdd, 0xdf, 0xe9, 0x46, 0xb2, 0x18, 0x51, 0x13, 0x77, 0x80, 0x38, 0x4a, 0x51, 0xb7, 0x86, 0xc1, 0x0c, 0x67, 0x17, 0x74, 0x04, 0x8c, 0xbd, 0x7a, 0x45, 0x13, 0x89, 0x37, 0xf1, 0xa7, 0x46, 0xd2, 0xe2, 0xc8, 0x47, 0xe9, 0x91, 0x1d, 0x63, 0x84, 0x36, 0x0b, 0x3d, 0x48, 0x31, 0x86, 0xc9, 0xee, 0xa9, 0x27, 0x0b, 0xf3, 0x73, 0x7f, 0x22, 0x90, 0x35, 0xac, 0x86, 0xec, 0xcb, 0x29, 0x8e, 0x91, 0xe9, 0xeb, 0x35, 0x1c, 0x02, 0xa9, 0x1d, 0x39, 0x69, 0x7b, 0xd4, 0xcf, 0xb7, 0xa6, 0x57, 0x78, 0x6c, 0xb6, 0xd4, 0x34, 0xd9, 0xce, 0xb4, 0x5e, 0x3d, 0x3d, 0xd9, 0xdf, 0x2e, 0x51, 0x24, 0xa1, 0x3a, 0x70, 0x3b, 0x47, 0xcf, 0x64, 0x89, 0x1b, 0x58, 0xf7, 0x86, 0x47, 0xa9, 0xc0, 0x38, 0x49, 0x9d, 0x3c, 0xfa, 0xa1, 0xfd, 0x21, 0x7c, 0xcc, 0xa4, 0xee, 0x0b, 0x76, 0xe1, 0xc7, 0x12, 0xec, 0x1d, 0x80, 0xe1, 0xd0, 0xbe, 0xf8, 0xae, 0x10, 0x4b, 0xa8, 0xd9, 0x18, 0xd0, 0x7b, 0x75, 0x47, 0x84, 0xe0, 0x03, 0xa0, 0xa9, 0x1e, 0x80, 0xc3, 0xb4, 0xe9, 0xa3, 0x1b, 0xae, 0x32, 0x60, 0x58, 0xda, 0x43, 0xb0, 0x20, 0x98, 0x0a, 0x94, 0x01, 0x89, 0xb5, 0x57, 0xab, 0xf4, 0x80, 0x14, 0x5c, 0x68, 0xcb, 0x79, 0x9b, 0xa3, 0x70, 0xca, 0x29, 0xb3, 0x53, 0x29, 0x35, 0x5b, 0x3b, 0x14, 0xcf, 0xb8, 0xe0, 0x2f, 0x9f, 0x24, 0x45, 0x44, 0xd7, 0x5b, 0x47, 0x88, 0x66, 0xdd, 0x76, 0x20, 0x6f, 0x93, 0x25, 0xe3, 0xf9, 0xb4, 0xbd, 0x62, 0xe8, 0xea, 0x57, 0x25, 0x2c, 0xb1, 0x89, 0x38, 0x38, 0x00, 0x7f, 0xe7, 0xb5, 0x2c, 0x4e, 0xc5, 0x78, 0x09, 0x86, 0xf3, 0xb2, 0x52, 0x06, 0x9e, 0x67, 0x4b, 0x15, 0xca, 0x22, 0xa4, 0xae, 0x4e, 0xe6, 0xa1, 0x1a, 0x20, 0x67, 0x78, 0xc5, 0xd3, 0x7a, 0xfb, 0x4a, 0x5e, 0xcb, 0x76, 0xd0, 0x1f, 0xce, 0xdb, 0x99, 0x20, 0xf8, 0x1c, 0xd8, 0x98, 0x2e, 0xd9, 0xc3, 0xb5, 0x7e, 0x3b, 0xea, 0x98, 0x0d, 0x20, 0xc7, 0xa2, 0x50, 0x78, 0x96, 0xee, 0x7f, 0xee, 0x67, 0x1e, 0x47, 0xcc, 0x71, 0x5b, 0xc0, 0x18, 0xa9, 0x97, 0x9e, 0x03, 0x93, 0x15, 0xab, 0x85, 0x58, 0x2c, 0x75, 0x41, 0x1a, 0x48, 0x43, 0xae, 0x84, 0x31, 0x4e, 0x78, 0xa5, 0x90, 0x2e, 0x24, 0xfe, 0xaf, 0x93, 0xf4, 0xd9, 0x80, 0x35, 0x0a, 0xdd, 0xe1, 0x0e, 0xcf, 0xe0, 0x1e, 0xc6, 0x96, 0xfc, 0xb7, 0x6f, 0x7d, 0xe5, 0x64, 0x72, 0x94, 0x79, 0x57, 0xc9, 0x42, 0x99, 0xc1, 0x6f, 0xe4, 0x38, 0x97, 0x15, 0xb6, 0xb1, 0x96, 0x17, 0xf7, 0x5e, 0x85, 0xae, 0x48, 0x66, 0xba, 0x67, 0x56, 0xd6, 0xdf, 0xd4, 0xb8, 0xf4, 0xf6, 0x81, 0x1b, 0xd0, 0x9b, 0x29, 0x9c, 0x1b, 0x89, 0x2a, 0x75, 0x3c, 0x60, 0x37, 0xdc, 0xa1, 0xa6, 0x4d, 0x28, 0x53, 0x0b, 0xe8, 0x36, 0xce, 0xf1, 0x76, 0x0b, 0x0f, 0x2b, 0x0c, 0xba, 0xee, 0x05, 0x58, 0x88, 0xae, 0x85, 0xd7, 0x4f, 0xd3, 0xf1, 0x47, 0x20, 0x33, 0x91, 0x60, 0x2c, 0x50, 0xb6, 0xbf, 0xe5, 0xe5, 0xfc, 0x23, 0x60, 0xbf, 0xcb, 0xdb, 0xfe, 0xce, 0x24, 0x7f, 0x4b, 0x7c, 0x9a, 0xdf, 0x26, 0x3d, 0x9e, 0x39, 0x23, 0x68, 0x00, 0xaf, 0x2d, 0x45, 0xb3, 0xf7, 0x70, 0x67, 0xd1, 0x55, 0x76, 0x3c, 0xde, 0xc6, 0x8f, 0xe2, 0x51, 0x7e, 0x77, 0x3c, 0x50, 0x95, 0x33, 0x46, 0xbc, 0xfe, 0x3c, 0xa5, 0x6d, 0xb8, 0xdf, 0x83, 0xbf, 0x48, 0xe4, 0x99, 0x4d, 0x66, 0x6e, 0x8d, 0xfc, 0xf7, 0x22, 0x7f, 0x3c, 0x3b, 0x8b, 0xdf, 0x8a, 0x48, 0xbd, 0x81, 0x39, 0xb7, 0x39, 0xf3, 0x73, 0x9d, 0x11, 0x0e, 0x7b, 0xbd, 0x4d, 0xcb, 0x34, 0xfb, 0x8c, 0x58, 0xe7, 0x14, 0xef, 0x6b, 0x41, 0x8d, 0x32, 0xd7, 0x9b, 0xe9, 0x1c, 0x5d, 0x7f, 0x1f, 0x1a, 0xc4, 0x67, 0x4b, 0x27, 0x2b, 0xc7, 0xa4, 0xee, 0x9f, 0x4e, 0xae, 0x33, 0xe9, 0x69, 0xb1, 0x6f, 0xa9, 0x0a, 0x69, 0xba, 0xa9, 0xa7, 0xff, 0xee, 0x6b, 0x85, 0x38, 0x0a, 0x04, 0x36, 0xed, 0xd4, 0x2d, 0x61, 0xbb, 0xc3, 0x98, 0xc1, 0xfb, 0x1b, 0x80, 0x70, 0xf4, 0x5a, 0x84, 0x66, 0x50, 0xd3, 0xb5, 0x3c, 0xcd, 0x99, 0xee, 0x36, 0x35, 0x9e, 0x64, 0x81, 0x90, 0x1c, 0x7d, 0xb9, 0x98, 0x34, 0xe6, 0xaf, 0x6d, 0xd6, 0xe0, 0x68, 0x8a, 0xe0, 0xda, 0x69, 0xf8, 0x8a, 0x45, 0x31, 0xc1, 0x01, 0xa4, 0x08, 0xa8, 0x52, 0xe2, 0xf7, 0x17, 0x8a, 0xe9, 0x18, 0x59, 0x1b, 0x70, 0x10, 0x09, 0x82, 0x14, 0xd9, 0xcb, 0x27, 0xab, 0xc5, 0x3a, 0x85, 0xd5, 0xbf, 0x21, 0x8a, 0xd3, 0xd4, 0xed, 0x41, 0x9d, 0xf3, 0x62, 0xae, 0x2e, 0xf1, 0x8e, 0xfa, 0x23, 0xd0, 0xfb, 0xd0, 0x84, 0x41, 0x29, 0x06, 0xe2, 0x67, 0x3b, 0x80, 0xa2, 0xde, 0xf1, 0x51, 0x98, 0xfc, 0xd6, 0x24, 0xd8, 0x57, 0xbb, 0xdb, 0xc8, 0x87, 0x63, 0x75, 0x7a, 0x2d, 0x80, 0x35, 0x39, 0x34, 0xde, 0x00, 0x62, 0x56, 0xdf, 0x08, 0x76, 0xe2, 0x27, 0xa7, 0x6c, 0xbd, 0x98, 0x8d, 0x4c, 0xa7, 0x81, 0x1e, 0xf9, 0xc0, 0x12, 0x16, 0x4e, 0x4b, 0x14, 0x6f, 0x6d, 0xb1, 0xd7, 0x84, 0x54, 0xc9, 0x6b, 0x76, 0xb2, 0x56, 0x12, 0xcf, 0xf8, 0xd2, 0xf6, 0x65, 0xb2, 0x6a, 0x18, 0x82, 0x18, 0x49, 0x89, 0x41, 0xe0, 0x19, 0xdc, 0x3b, 0x57, 0xc7, 0xdb, 0x63, 0xb0, 0x87, 0x79, 0x2f, 0x9c, 0x19, 0x08, 0xf9, 0x1b, 0x4a, 0xac, 0xa4, 0x91, 0xbd, 0x10, 0x82, 0x1c, 0xeb, 0x57, 0x75, 0x25, 0x69, 0x56, 0x55, 0x35, 0x6a, 0x00, 0x92, 0x0a, 0x84, 0x21, 0x1b, 0xeb, 0xb7, 0x50, 0x7e, 0x38, 0xab, 0x1e, 0x50, 0x45, 0x39, 0x94, 0xcf, 0x68, 0x2d, 0xdd, 0xc6, 0x51, 0x4a, 0x3f, 0xb1, 0x9a, 0x8f, 0x50, 0x22, 0x9f, 0xb9, 0x66, 0x63, 0x90, 0x09, 0x4f, 0x5d, 0xc5, 0x47, 0x42, 0xb8, 0x51, 0x07, 0x16, 0x44, 0xd9, 0x2b, 0xb2, 0x98, 0xa7, 0xa9, 0xc5, 0xf9, 0xfa, 0x8f, 0xb7, 0x7d, 0xa0, 0x44, 0xdf, 0x6f, 0xc7, 0x10, 0xf6, 0xf6, 0x11, 0xde, 0xcb, 0xf2, 0xe6, 0x41, 0x39, 0x27, 0x0e, 0xb6, 0x56, 0x9d, 0x7f, 0x29, 0xee, 0x46, 0x73, 0xba, 0x30, 0xe2, 0xbe, 0xc0, 0xa6, 0x20, 0x5f, 0x0e, 0x6b, 0x06, 0x55, 0x76, 0x98, 0x92, 0xb4, 0x8c, 0xff, 0xa2, 0xf7, 0xac, 0x1c, 0x11, 0x98, 0x3f, 0x48, 0x23, 0xde, 0x39, 0x30, 0x23, 0xf7, 0xe6, 0x86, 0x4a, 0x46, 0xe7, 0xf6, 0xe3, 0xfe, 0x78, 0x5c, 0xad, 0xf0, 0xf4, 0x34, 0x81, 0xa1, 0x9a, 0x51, 0x34, 0xa0, 0x91, 0xd3, 0xbf, 0x16, 0x2a, 0x53, 0x9d, 0x9f, 0x66, 0x60, 0x75, 0x58, 0xb8, 0x2f, 0xf9, 0x3a, 0x0b, 0x8e, 0x0e, 0xa6, 0x07, 0x1a, 0x2d, 0x40, 0x90, 0xb2, 0x09, 0x01, 0x90, 0x2b, 0x72, 0x88, 0xf7, 0x45, 0x79, 0xb1, 0x00, 0xde, 0xd5, 0x69, 0xb5, 0x66, 0x85, 0xc1, 0xb5, 0x93, 0xb7, 0x41, 0x35, 0x56, 0xe9, 0x7e, 0x45, 0x0d, 0x4e, 0xee, 0x54, 0xfa, 0x73, 0xfc, 0xf7, 0xf4, 0x22, 0x58, 0xe6, 0x5c, 0x87, 0x91, 0x47, 0x53, 0x91, 0xe5, 0x30, 0x2a, 0x9b, 0x58, 0x67, 0x1a, 0x4c, 0x03, 0x6c, 0x36, 0xbb, 0xaf, 0xb9, 0x9d, 0xd7, 0xa2, 0x48, 0xf4, 0x07, 0xb9, 0x56, 0x14, 0x0d, 0xb7, 0x67, 0xff, 0x30, 0xdd, 0x8a, 0x19, 0x9a, 0xbb, 0xde, 0x95, 0xff, 0x45, 0x55, 0x2d, 0x7f, 0x29, 0xb8, 0x16, 0xce, 0x60, 0xeb, 0x33, 0x92, 0x03, 0x73, 0x89, 0x0c, 0x61, 0x35, 0xf3, 0xfb, 0x4e, 0x80, 0x16, 0xbd, 0xbe, 0x4e, 0x98, 0xb8, 0x92, 0xc7, 0x8d, 0xf8, 0xb1, 0x07, 0x32, 0x19, 0x5b, 0x21, 0xde, 0x68, 0xba, 0x64, 0x35, 0x45, 0xba, 0xdd, 0x9f, 0xcc, 0x1b, 0x1c, 0xf9, 0xb4, 0xc5, 0x3b, 0x8a, 0x76, 0x5b, 0x1d, 0x38, 0xb2, 0x12, 0xf4, 0xfb, 0xcf, 0xc4, 0x06, 0x93, 0xe3, 0x40, 0xb0, 0x76, 0xd2, 0xe5, 0xab, 0x0d, 0xb9, 0x6f, 0x8e, 0x1f, 0x8d, 0x10, 0x94, 0x8e, 0xff, 0xc3, 0xa0, 0x41, 0xa3, 0xdd, 0x7e, 0x61, 0x52, 0xe4, 0x6c, 0xc8, 0xcd, 0xa5, 0xd9, 0xb6, 0xa2, 0x81, 0x6c, 0xc6, 0x54, 0x08, 0x48, 0x21, 0xb6, 0xc9, 0x8f, 0xf2, 0x98, 0x67, 0x24, 0x1a, 0xa5, 0xf0, 0xb6, 0x24, 0x8c, 0x6b, 0xfa, 0x7b, 0x5e, 0xb0, 0x37, 0xda, 0x37, 0x7d, 0x08, 0x05, 0x21, 0xc5, 0x5e, 0xb7, 0x35, 0x4b, 0xc4, 0xdb, 0x04, 0x70, 0xe7, 0xfe, 0x35, 0x49, 0x55, 0x05, 0x6f, 0xf5, 0x85, 0x1b, 0x79, 0x2e, 0x18, 0xee, 0x9f, 0x1d, 0x5e, 0x1b, 0x58, 0x73, 0x1c, 0xe6, 0x27, 0xb5, 0x8c, 0x2f, 0xbf, 0xd7, 0xa6, 0xa2, 0x6a, 0x0d, 0x9e, 0x2d, 0xab, 0xde, 0xae, 0xb7, 0x22, 0x7a, 0x15, 0x0f, 0xb1, 0x4d, 0x60, 0x22, 0xdd, 0xd4, 0xe8, 0x72, 0x77, 0xb0, 0x9c, 0xc3, 0x7b, 0xf9, 0x00, 0x17, 0x38, 0xd4, 0x76, 0xdd, 0xb1, 0x48, 0xbd, 0x66, 0x44, 0x4d, 0xb7, 0x98, 0x89, 0x26, 0x6f, 0xe6, 0x7d, 0xf1, 0x5a, 0x80, 0xe0, 0x7d, 0xdd, 0xc6, 0xdb, 0x5b, 0x10, 0x03, 0xe6, 0x38, 0xc2, 0x58, 0xe9, 0x6a, 0xbd, 0xf6, 0xa1, 0xc8, 0x4a, 0x90, 0x46, 0xbf, 0xf8, 0x11, 0x6b, 0xa2, 0x9a, 0x8a, 0x25, 0x42, 0x8f, 0x6e, 0x6f, 0xbf, 0x46, 0x01, 0xcd, 0x9d, 0x00, 0x0e, 0x30, 0x1a, 0xd8, 0xd8, 0x1a, 0xbf, 0x01, 0x54, 0x02, 0x36, 0x50, 0x95, 0xfa, 0x5b, 0xfa, 0x88, 0x8f, 0x95, 0x9e, 0xe1, 0xf1, 0x67, 0x86, 0x55, 0x54, 0x42, 0x2a, 0x0a, 0x95, 0x9e, 0xf5, 0x4c, 0x21, 0x49, 0x4c, 0x81, 0x13, 0xfe, 0xcd, 0x5f, 0x9c, 0x39, 0xd4, 0x5c, 0xa8, 0x4a, 0x44, 0x66, 0xbe, 0xa8, 0x84, 0xd5, 0x28, 0x89, 0xc7, 0x9e, 0x55, 0xaf, 0x91, 0xc9, 0x7b, 0x85, 0x77, 0x25, 0x80, 0x6a, 0x26, 0x3a, 0x1b, 0x4d, 0xa6, 0x7f, 0x37, 0x7a, 0xe0, 0xcd, 0x98, 0xb3, 0x5e, 0x14, 0xc0, 0x83, 0x53, 0x4d, 0x14, 0xcf, 0xdb, 0xaf, 0x3b, 0xae, 0x83, 0x26, 0xc7, 0x7b, 0x0c, 0x01, 0x17, 0x28, 0x6c, 0xea, 0x7b, 0xd4, 0x16, 0x1c, 0x9a, 0xa0, 0x7b, 0xd0, 0x11, 0xbf, 0xd1, 0xf8, 0x5d, 0xcd, 0x13, 0x30, 0xfb, 0x62, 0x49, 0xf2, 0xcd, 0xe6, 0x09, 0x09, 0xc0, 0xa7, 0x3e, 0x48, 0xac, 0x28, 0x28, 0x7b, 0x7c, 0xbd, 0xa4, 0x9e, 0x8e, 0x54, 0xae, 0x4d, 0x5d, 0x96, 0x24, 0x7c, 0x5d, 0x2f, 0xcc, 0x68, 0x26, 0x69, 0x99, 0xcd, 0xd5, 0x00, 0x2a, 0x5a, 0xaf, 0x32, 0x94, 0x62, 0x08, 0x15, 0x61, 0xd4, 0x64, 0x2d, 0xd9, 0x6d, 0xdb, 0x3e, 0x80, 0x2c, 0xc2, 0x5f, 0xdf, 0x07, 0x87, 0x50, 0x87, 0xdc, 0xdd, 0x0d, 0x54, 0xaa, 0x19, 0xa3, 0xef, 0x01, 0xdc, 0x43, 0x96, 0xb7, 0xf3, 0x95, 0x20, 0xdd, 0x7b, 0x4e, 0x3b, 0xf1, 0x49, 0x05, 0xf9, 0x55, 0x89, 0x43, 0x8b, 0x00, 0xa4, 0xd9, 0x4c, 0x74, 0x68, 0x76, 0x01, 0xf0, 0x63, 0x78, 0x5e, 0xe6, 0x8f, 0x03, 0xcd, 0xaf, 0x35, 0x50, 0x6c, 0x7e, 0x0b, 0x48, 0x54, 0x93, 0x9f, 0x52, 0x21, 0xb1, 0xf9, 0x69, 0xaf, 0xd1, 0x7c, 0x71, 0x21, 0x18, 0x0e, 0xcb, 0x28, 0x07, 0x79, 0x27, 0x82, 0xf2, 0x10, 0x99, 0xc0, 0xb3, 0x95, 0xf0, 0x4d, 0x9f, 0x5a, 0x43, 0xac, 0xb9, 0xa7, 0xcc, 0x01, 0x26, 0x5c, 0xf9, 0xd3, 0xe1, 0xd7, 0xc1, 0x10, 0xb0, 0x18, 0x35, 0x51, 0x57, 0x23, 0x57, 0x60, 0x0b, 0xa6, 0x2e, 0xf8, 0x29, 0xdc, 0x1a, 0xcb, 0x28, 0xb1, 0x66, 0xc9, 0xcd, 0x27, 0x1c, 0xa0, 0x9d, 0xf8, 0x1d, 0x7f, 0x98, 0x7d, 0x70, 0x20, 0x24, 0xce, 0xdb, 0x05, 0x48, 0x2b, 0xb0, 0x02, 0x1a, 0x9b, 0xea, 0xfb, 0x7b, 0xd2, 0x78, 0xef, 0x01, 0x58, 0xd9, 0x35, 0x35, 0xe8, 0xe9, 0x06, 0xff, 0x17, 0xfb, 0x3c, 0x5e, 0x36, 0x27, 0x59, 0x5c, 0x78, 0xe6, 0xcb, 0x42, 0x58, 0xdc, 0x6f, 0x08, 0x35, 0xf4, 0x53, 0x0f, 0x3f, 0xb2, 0xc0, 0x13, 0x97, 0xc5, 0x78, 0x5b, 0xb2, 0xdc, 0x3c, 0x32, 0xff, 0xbb, 0x91, 0x9b, 0xc9, 0x8e, 0xc4, 0x41, 0x5e, 0x7d, 0x2c, 0xad, 0x71, 0x80, 0xaf, 0xbb, 0xbd, 0x75, 0x87, 0x4f, 0xeb, 0x70, 0x46, 0x44, 0xb6, 0x52, 0x18, 0xa5, 0x4d, 0x9d, 0x49, 0x20, 0xf8, 0x86, 0x07, 0xb7, 0xff, 0x4c, 0x68, 0xb9, 0xc8, 0xc9, 0xaf, 0xf1, 0x3f, 0x47, 0xcb, 0x1d, 0x7a, 0x94, 0x20, 0xa2, 0x9e, 0x59, 0x8a, 0x7d, 0xfc, 0xa7, 0x9f, 0x7d, 0x80, 0xd3, 0x35, 0xaf, 0x4c, 0x84, 0x25, 0x1a, 0xa0, 0x0a, 0x4e, 0xad, 0xfd, 0xf1, 0xdc, 0x76, 0x8a, 0xd6, 0xca, 0x15, 0xb6, 0x7a, 0xa5, 0x6f, 0x1f, 0x15, 0x93, 0xa7, 0xb3, 0xed, 0x95, 0x4a, 0x14, 0x26, 0x09, 0xc9, 0x41, 0xdc, 0x73, 0x2d, 0x74, 0x6f, 0x7c, 0x06, 0x46, 0x1e, 0x3b, 0xa4, 0x19, 0xd8, 0xb4, 0x8a, 0xb7, 0x4e, 0x9e, 0x20, 0x37, 0x4d, 0x6a, 0xa8, 0x21, 0x4b, 0x80, 0x73, 0xd2, 0x40, 0xcc, 0x55, 0x21, 0xb7, 0x79, 0x56, 0x42, 0x24, 0xfc, 0xaa, 0xeb, 0x78, 0x55, 0xe4, 0xb6, 0xf3, 0x91, 0x66, 0xc7, 0x39, 0x94, 0x1c, 0xae, 0xa9, 0x15, 0x6a, 0x8e, 0xea, 0xea, 0x62, 0x7f, 0xc6, 0x86, 0x3b, 0x32, 0x3c, 0xc0, 0xfe, 0xd4, 0xd0, 0xd6, 0x83, 0x34, 0x26, 0xb1, 0x9c, 0x27, 0xcf, 0x6a, 0x90, 0x2c, 0x63, 0x0e, 0xcb, 0x4c, 0xd0, 0x9e, 0xd3, 0x44, 0xf1, 0x5a, 0x7e, 0xe6, 0x63, 0x3f, 0x63, 0xbd, 0x94, 0xcf, 0x8e, 0xf0, 0x1c, 0x10, 0x78, 0x68, 0x51, 0xd7, 0x36, 0x35, 0x15, 0x46, 0xf0, 0x2e, 0xf3, 0x94, 0x95, 0xd8, 0x6b, 0x0c, 0xcd, 0x8a, 0x89, 0x59, 0x2f, 0xce, 0xbd, 0x00, 0xb5, 0x09, 0xe6, 0x2e, 0x6c, 0x5f, 0xb0, 0xb4, 0x70, 0xd1, 0x20, 0x50, 0x18, 0xa8, 0x6d, 0x2e, 0x6e, 0x17, 0x12, 0xae, 0xe2, 0x1c, 0x21, 0x68, 0x3f, 0xa7, 0xda, 0x6e, 0xdd, 0xfe, 0x7c, 0xd0, 0x19, 0x60, 0x5b, 0x66, 0x02, 0xe8, 0x33, 0xc9, 0x55, 0xb5, 0xbc, 0xa3, 0xac, 0x48, 0x7e, 0x29, 0xf2, 0x2d, 0xe7, 0xe5, 0x1a, 0xde, 0x9b, 0xb9, 0x10, 0xe4, 0x0b, 0x21, 0xf0, 0x3f, 0x49, 0xb8, 0x77, 0x08, 0x1b, 0xfe, 0xb7, 0x55, 0x4e, 0x58, 0x0e, 0x5d, 0x4c, 0x58, 0x58, 0xdd, 0xf1, 0x3f, 0x64, 0xba, 0x9b, 0xc0, 0xa5, 0xe7, 0x80, 0x07, 0x2a, 0x89, 0x45, 0xfa, 0xd0, 0x59, 0xcc, 0xbf, 0xb7, 0x4a, 0x4d, 0x7e, 0xf2, 0x6d, 0xa8, 0x68, 0x83, 0x11, 0xf9, 0xf8, 0x86, 0x2e, 0x6d, 0x78, 0xac, 0x04, 0x55, 0xc8, 0xeb, 0xff, 0x79, 0x5b, 0x74, 0xde, 0xaf, 0x82, 0xe6, 0x14, 0xac, 0xed, 0xc1, 0x6e, 0x19, 0x6e, 0x1d, 0xf7, 0xea, 0x01, 0x9c, 0x19, 0xeb, 0x0a, 0x9d, 0x04, 0x9b, 0xdd, 0xb2, 0x54, 0x3e, 0x83, 0x55, 0xed, 0x2e, 0xbc, 0xd6, 0x2a, 0x72, 0x40, 0x98, 0x38, 0x91, 0x4a, 0x7d, 0xbc, 0xa8, 0x57, 0x9f, 0xbc, 0xbb, 0x2b, 0x41, 0xbc, 0x49, 0x16, 0x05, 0x27, 0x23, 0x75, 0x5f, 0xf1, 0x7e, 0x7b, 0x49, 0x7b, 0x46, 0x32, 0x38, 0xb7, 0xb5, 0xbc, 0x4f, 0x8c, 0x25, 0xdf, 0xd3, 0x7c, 0x22, 0xc1, 0xe0, 0x84, 0xc4, 0xef, 0x5a, 0x43, 0x3b, 0xa4, 0x25, 0x5f, 0xac, 0x49, 0x99, 0x25, 0x3c, 0x38, 0x30, 0x6f, 0x6a, 0xc5, 0x82, 0xcb, 0xa1, 0x7f, 0x74, 0xd9, 0x0d, 0xb3, 0xac, 0xf5, 0xaf, 0x32, 0x48, 0x16, 0xac, 0x54, 0xcf, 0xf6, 0xeb, 0x3d, 0x67, 0x74, 0xde, 0x5f, 0x49, 0x36, 0xa0, 0x40, 0x73, 0x92, 0x41, 0x7e, 0x9c, 0xaf, 0x5e, 0x10, 0x6d, 0xe7, 0xf4, 0xce, 0xee, 0x70, 0x75, 0x34, 0x3f, 0x3c, 0x1c, 0x63, 0x88, 0x1d, 0x7e, 0x68, 0x32, 0x2d, 0x63, 0xc1, 0x58, 0x6d, 0xd3, 0x1d, 0x78, 0xac, 0x74, 0x64, 0x6f, 0xab, 0x13, 0xf7, 0xa4, 0x7e, 0x80, 0x39, 0x83, 0x35, 0x9f, 0x4e, 0x2d, 0xbc, 0xbc, 0x23, 0x6d, 0x00, 0x1f, 0xae, 0xef, 0x53, 0xe0, 0x77, 0xac, 0x12, 0xfd, 0x57, 0xa9, 0x85, 0xaa, 0x7f, 0xe1, 0x06, 0xe8, 0xbd, 0x7f, 0x66, 0x59, 0xfb, 0x51, 0x8c, 0x53, 0x09, 0x7a, 0x5f, 0x33, 0x9c, 0x67, 0xe7, 0xf4, 0x96, 0x04, 0xae, 0x00, 0x87, 0x2f, 0x6d, 0x45, 0x74, 0x6d, 0xe4, 0x8c, 0xd8, 0xdb, 0x0a, 0x06, 0xe9, 0x68, 0x66, 0x28, 0x1c, 0x42, 0xbd, 0xb9, 0xeb, 0x8e, 0xed, 0x2a, 0xd6, 0x5c, 0x19, 0x25, 0xa8, 0xda, 0x06, 0x68, 0xfb, 0xc7, 0xc5, 0xd4, 0xfe, 0x2b, 0x93, 0xc1, 0x76, 0x46, 0xfd, 0x95, 0x03, 0xc6, 0x48, 0x95, 0xa5, 0x3d, 0x0f, 0xfb, 0x7e, 0xd1, 0x2e, 0x48, 0xda, 0x36, 0xdf, 0xdb, 0x6c, 0xd9, 0x23, 0xc3, 0xda, 0x5e, 0x64, 0xd2, 0x7d, 0x4d, 0x58, 0xf2, 0x62, 0x08, 0x28, 0xbc, 0x94, 0x01, 0xd2, 0x47, 0x9d, 0x29, 0xcc, 0x3e, 0x4a, 0xac, 0xea, 0x36, 0xaf, 0xdb, 0x81, 0x3e, 0x6b, 0x69, 0xcd, 0xb7, 0x2d, 0xdb, 0x90, 0x66, 0x77, 0x3a, 0xfc, 0xc7, 0xa2, 0x0b, 0xd3, 0xa4, 0x23, 0x81, 0xcd, 0xe7, 0x0c, 0xf0, 0x3a, 0xad, 0xd6, 0x85, 0xe8, 0x9b, 0x5d, 0x35, 0x47, 0x75, 0x2c, 0xf3, 0xcb, 0xec, 0xfb, 0x26, 0x92, 0xb8, 0x76, 0x5a, 0x47, 0xe7, 0x40, 0x35, 0x46, 0x75, 0x38, 0xad, 0x00, 0x1c, 0xfb, 0x79, 0xa1, 0x6d, 0xaa, 0xc5, 0xf1, 0x20, 0xed, 0x2a, 0x78, 0xa9, 0x37, 0xdd, 0xe6, 0x0c, 0x4c, 0x27, 0xb2 ],
+    const [ 0x1b, 0xa0, 0x72, 0x89, 0x93, 0xb8, 0xf0, 0x03, 0x8c, 0xd7, 0xaf, 0xac, 0x17, 0xdf, 0xde, 0x8c, 0x71, 0x28, 0x42, 0xe3, 0x27, 0x18, 0x7b, 0x5f, 0x7d, 0xf4, 0x89, 0x91, 0x11, 0xf5, 0x8e, 0xa2, 0xbc, 0x9f, 0xd5, 0x42, 0xb9, 0x4e, 0x14, 0xe2, 0x09, 0x12, 0xee, 0x23, 0x15, 0xbc, 0xbc, 0x8e, 0x96, 0x39, 0x8d, 0x85, 0xb2, 0x1f, 0x6b, 0x79, 0x67, 0x86, 0xe1, 0x5e, 0x2d, 0x19, 0xba, 0x5c, 0xd7, 0x6d, 0x0a, 0xc8, 0xbb, 0x91, 0x73, 0x52, 0x12, 0xe6, 0xa1, 0x80, 0xa2, 0x30, 0x17, 0x5b, 0x9a, 0xee, 0x2e, 0x68, 0xbd, 0xe7, 0x5a, 0xd9, 0xc2, 0x06, 0xb0, 0x05, 0xfb, 0x67, 0xa5, 0x16, 0x36, 0xb2, 0x19, 0x01, 0xe1, 0xa8, 0x94, 0xbc, 0x71, 0xfb, 0xcf, 0xab, 0x04, 0x63, 0x76, 0x5b, 0x44, 0xee, 0x2c, 0x72, 0x8f, 0x98, 0xd0, 0xe6, 0x56, 0x1b, 0xfe, 0x6e, 0xc3, 0x08, 0xd9, 0x36, 0x9f, 0x17, 0x08, 0xd7, 0x72, 0xbb, 0xff, 0x86, 0xec, 0xfa, 0x80, 0x8b, 0x83, 0x7c, 0x61, 0xf6, 0x5e, 0xe2, 0x8f, 0x8d, 0x72, 0x59, 0x53, 0x08, 0xeb, 0x6e, 0xd4, 0x81, 0xcd, 0x24, 0xde, 0x26, 0xdb, 0x43, 0xe1, 0x31, 0xb8, 0xf4, 0x3d, 0x1a, 0x4c, 0x8b, 0xbc, 0x0a, 0x69, 0xa4, 0x60, 0x94, 0xae, 0x71, 0x60, 0xa0, 0xac, 0x52, 0x6d, 0xa7, 0x48, 0xa6, 0x39, 0x26, 0x60, 0xe2, 0x3a, 0x4c, 0xb2, 0xe0, 0xac, 0xf6, 0xf9, 0x79, 0xd5, 0xde, 0x58, 0x55, 0x8c, 0x0f, 0xfc, 0x02, 0xfc, 0x9d, 0xfe, 0x44, 0xa6, 0x92, 0x86, 0xac, 0xa5, 0x2b, 0x36, 0x6c, 0x36, 0x45, 0xc6, 0x6a, 0x77, 0x12, 0xeb, 0x93, 0x6f, 0x10, 0x7e, 0x72, 0x4f, 0x3c, 0xda, 0x01, 0xf7, 0x83, 0x86, 0xbf, 0xbc, 0x79, 0x14, 0x02, 0x69, 0x4d, 0x48, 0x8f, 0x83, 0xfd, 0x7d, 0x68, 0xd2, 0xc6, 0x45, 0xe5, 0x1c, 0xdf, 0x50, 0x06, 0x34, 0x66, 0x8f, 0x08, 0x34, 0x9b, 0x98, 0x36, 0x06, 0x4c, 0x4d, 0x02, 0x29, 0x90, 0xb8, 0x54, 0xb1, 0xb8, 0x3a, 0x22, 0x90, 0x83, 0xe5, 0x41, 0x15, 0x91, 0x26, 0x7b, 0xb2, 0x1a, 0xa7, 0xe1, 0x02, 0xe0, 0x73, 0x62, 0x0a, 0x62, 0x5c, 0x9d, 0xc0, 0x53, 0x9a, 0xf4, 0xc9, 0x4a, 0xb4, 0xe2, 0x87, 0xbb, 0xa4, 0x8e, 0x53, 0x26, 0x36, 0xa0, 0x07, 0x8e, 0xb1, 0x53, 0xc0, 0x2d, 0xb9, 0xcb, 0xe2, 0x66, 0x74, 0xaa, 0x5c, 0xfb, 0xec, 0xde, 0x2d, 0x80, 0xb4, 0xbc, 0x27, 0x10, 0xcf, 0x53, 0xf2, 0x3e, 0xcd, 0xfa, 0x55, 0x4e, 0x37, 0x2c, 0xb1, 0xa6, 0x2d, 0x96, 0xce, 0x7f, 0x4e, 0x6d, 0xda, 0xe0, 0xd8, 0x05, 0xaf, 0xcd, 0x10, 0xa0, 0x55, 0xbc, 0xe5, 0x84, 0xc8, 0x48, 0xd0, 0x50, 0xfb, 0x29, 0xfe, 0x8f, 0x1c, 0x64, 0xb1, 0x8e, 0x1a, 0xbf, 0xe4, 0x6b, 0x65, 0x78, 0x2e, 0x6f, 0xf5, 0x36, 0xe8, 0x9d, 0x8d, 0x40, 0x92, 0x8b, 0x41, 0xed, 0x73, 0x71, 0x36, 0x5c, 0x80, 0x80, 0xa9, 0x64, 0x7f, 0x75, 0x32, 0xce, 0x6c, 0x6d, 0x4a, 0xc2, 0x1c, 0xfb, 0x0c, 0x80, 0x20, 0x78, 0x38, 0x51, 0xec, 0x9a, 0x7d, 0xbc, 0x39, 0x48, 0xf8, 0xfc, 0xa7, 0xad, 0xf8, 0xb2, 0xa7, 0x8c, 0x04, 0xd8, 0x98, 0xd3, 0x1f, 0xf6, 0x30, 0x72, 0x4a, 0x98, 0x1e, 0x6d, 0x4b, 0xff, 0xed, 0x30, 0xad, 0x17, 0x2c, 0x24, 0x08, 0xa9, 0xcc, 0x7f, 0x82, 0xd2, 0xc9, 0x60, 0x96, 0xb4, 0x0d, 0x1b, 0x14, 0x6b, 0x91, 0xd1, 0x69, 0x42, 0xc5, 0x45, 0x21, 0x27, 0x32, 0xea, 0xaa, 0x5d, 0x5d, 0x41, 0x5b, 0x71, 0xef, 0x61, 0xb4, 0x6f, 0x14, 0xd7, 0xe8, 0x55, 0x21, 0xb1, 0x98, 0xc8, 0x79, 0xd6, 0xe2, 0x06, 0xb1, 0x99, 0x9a, 0x1c, 0xf2, 0x8d, 0xd7, 0x59, 0x9f, 0x9a, 0xb2, 0x02, 0x38, 0x50, 0x4a, 0x47, 0x7f, 0x7c, 0x0c, 0x76, 0xd9, 0xf9, 0x31, 0x6f, 0xf6, 0xc9, 0x87, 0x58, 0xb4, 0x64, 0x75, 0x92, 0x41, 0x50, 0x39, 0xeb, 0x80, 0xf2, 0x75, 0x15, 0xaf, 0xa4, 0xea, 0x57, 0x46, 0x08, 0x83, 0x82, 0x22, 0x9b, 0x95, 0x27, 0xe2, 0x8d, 0x65, 0x07, 0x92, 0xd0, 0xeb, 0xcb, 0x87, 0x6f, 0xd5, 0xf5, 0x89, 0x21, 0xcf, 0x17, 0x38, 0x1e, 0x02, 0x42, 0xa8, 0x31, 0xda, 0xc2, 0x4f, 0x0e, 0x0d, 0x08, 0x21, 0xe7, 0xd9, 0xe8, 0xf9, 0x3a, 0x8d, 0x05, 0x3b, 0xed, 0x4a, 0x89, 0xb7, 0x9c, 0x0b, 0x19, 0xd1, 0x32, 0xe3, 0x08, 0xdf, 0xb6, 0x86, 0xca, 0xd3, 0x68, 0x0b, 0xac, 0x1a, 0x0d, 0xf0, 0xc3, 0xc4, 0x87, 0x5f, 0x22, 0xe4, 0xa8, 0xaf, 0x50, 0x3a, 0x48, 0x2e, 0xfa, 0x0f, 0x95, 0x1e, 0xe4, 0x61, 0xab, 0xfd, 0x25, 0x40, 0x65, 0x0a, 0x94, 0x78, 0x72, 0x04, 0x7e, 0x70, 0xab, 0x35, 0x9a, 0x52, 0xa3, 0xaf, 0x3e, 0x6c, 0x80, 0xd6, 0xd2, 0xd7, 0x0a, 0x1e, 0x86, 0x56, 0x02, 0x16, 0x40, 0x80, 0xb5, 0xa6, 0xd8, 0x22, 0xd1, 0x94, 0x88, 0xdf, 0x76, 0x4d, 0x9e, 0x19, 0x90, 0xe3, 0x74, 0x15, 0x65, 0x52, 0xa2, 0x59, 0x6a, 0x07, 0x72, 0x59, 0x5b, 0xa3, 0x95, 0x53, 0x8a, 0xfc, 0x14, 0x78, 0x78, 0x64, 0x89, 0x4c, 0xa2, 0x2f, 0x8e, 0x4f, 0x9d, 0x6f, 0x76, 0xdd, 0x65, 0x02, 0x3b, 0x53, 0xf3, 0xcf, 0xb8, 0x73, 0x0d, 0x4c, 0x18, 0x0a, 0x62, 0x44, 0x8f, 0xcf, 0xd6, 0xd7, 0x48, 0x8f, 0x1b, 0xc2, 0x9e, 0x87, 0x81, 0xe0, 0x8e, 0x12, 0x0f, 0xf1, 0x6c, 0x84, 0xd2, 0x9b, 0xd6, 0x55, 0x75, 0xae, 0xe7, 0x82, 0x12, 0xac, 0xac, 0x30, 0x48, 0x89, 0xdc, 0x92, 0x8e, 0xaf, 0xc3, 0x0e, 0xc6, 0x45, 0x80, 0x9b, 0x16, 0xb1, 0x70, 0x6e, 0xf3, 0x5b, 0xea, 0xd5, 0x7e, 0xb4, 0x2d, 0x63, 0x14, 0x78, 0x96, 0x4d, 0x20, 0x30, 0x17, 0x14, 0x34, 0xfa, 0xe4, 0x64, 0x59, 0x8c, 0x6f, 0x3d, 0xa3, 0x77, 0x97, 0x50, 0x08, 0xa9, 0x1c, 0xac, 0x71, 0x36, 0x57, 0x99, 0x12, 0x58, 0x28, 0xc4, 0xf7, 0xb4, 0x2f, 0x9d, 0xe0, 0xde, 0x3f, 0xfe, 0x4f, 0x20, 0x0f, 0x0d, 0xdf, 0x77, 0x33, 0x63, 0xd7, 0xdf, 0x4b, 0x6e, 0xff, 0xd0, 0x7b, 0x13, 0xb3, 0x09, 0x1b, 0x98, 0x35, 0x8c, 0xaf, 0xc2, 0x48, 0xea, 0x19, 0x3a, 0xfa, 0xc0, 0x0d, 0x35, 0xc1, 0x82, 0xc6, 0x54, 0xc9, 0x77, 0xf7, 0xc9, 0x8d, 0x05, 0x05, 0xbc, 0xa5, 0x2f, 0x73, 0xed, 0xde, 0x5c, 0x9e, 0x9a, 0x90, 0x5a, 0xaa, 0xa3, 0x2c, 0xa2, 0xbc, 0xec, 0x15, 0xde, 0x69, 0x03, 0xb1, 0xa8, 0x6f, 0x03, 0xbf, 0x95, 0xa3, 0xb8, 0xeb, 0x72, 0x2b, 0x03, 0x9f, 0xcd, 0xed, 0x80, 0x1d, 0xb8, 0x47, 0x67, 0xcb, 0xc9, 0x01, 0xb0, 0xcd, 0x65, 0x80, 0x7b, 0xd9, 0x3e, 0x3c, 0xae, 0x47, 0x1b, 0x74, 0xe0, 0x68, 0xd8, 0x20, 0x76, 0x19, 0xad, 0x27, 0x0b, 0x98, 0xb3, 0xd2, 0x16, 0x96, 0xa3, 0x80, 0xc6, 0x8d, 0xe1, 0x9c, 0x31, 0x53, 0xba, 0xcd, 0xae, 0xf0, 0xea, 0x6c, 0x7f, 0xad, 0x62, 0x3b, 0xb4, 0x6d, 0x48, 0x54, 0x4b, 0x40, 0x3e, 0x5f, 0x9c, 0x36, 0xe7, 0x08, 0xf5, 0x71, 0xa7, 0xb1, 0x81, 0x7e, 0xab, 0x63, 0x6e, 0xe6, 0x2a, 0x0b, 0x4e, 0xff, 0xea, 0xe3, 0xbe, 0x08, 0x05, 0x2e, 0x46, 0x75, 0xed, 0x28, 0x81, 0x88, 0xae, 0x3d, 0x7e, 0x21, 0x73, 0x79, 0x65, 0xd7, 0x4c, 0x40, 0x5e, 0x47, 0x2e, 0x3f, 0xae, 0xac, 0x3c, 0xa2, 0x23, 0xb1, 0x44, 0x87, 0xb3, 0x83, 0x8d, 0xb3, 0x60, 0x29, 0xd0, 0x84, 0x5f, 0x18, 0x84, 0x27, 0x78, 0x02, 0x5e, 0x0b, 0xb0, 0xf0, 0x19, 0x96, 0x26, 0x90, 0x73, 0x16, 0x3b, 0xd0, 0x78, 0xfa, 0xf5, 0xab, 0x02, 0x42, 0xa6, 0x43, 0x81, 0x34, 0xc8, 0x31, 0xf8, 0x51, 0x2c, 0x19, 0x48, 0x87, 0x54, 0x81, 0xb1, 0xa8, 0x1d, 0xe3, 0x96, 0x1b, 0xa0, 0x00, 0x80, 0xd2, 0x5b, 0x78, 0x66, 0x7b, 0x8c, 0x98, 0x2c, 0xfb, 0xde, 0x73, 0x69, 0x18, 0x47, 0x34, 0x6d, 0x75, 0x31, 0xb2, 0x83, 0xc4, 0xd8, 0x45, 0x73, 0x37, 0xf3, 0xd9, 0x4b, 0x37, 0x96, 0x40, 0x5f, 0x59, 0x57, 0xcd, 0x8f, 0x8e, 0xb0, 0x1e, 0xc8, 0x9a, 0xa4, 0x39, 0xce, 0xc7, 0xa5, 0xdb, 0x38, 0xda, 0xb6, 0x0c, 0xbc, 0x46, 0xcd, 0xf7, 0xac, 0xa0, 0x7b, 0xf9, 0xc1, 0x53, 0xce, 0xf8, 0x18, 0x95, 0x77, 0xf6, 0x7a, 0x99, 0x28, 0xe5, 0xe0, 0x06, 0x40, 0xbd, 0x36, 0xa9, 0xaa, 0xcd, 0x60, 0x66, 0x02, 0x4e, 0x7b, 0x75, 0xfa, 0x3e, 0x65, 0xcb, 0xfd, 0x6c, 0x7f, 0xd5, 0x12, 0xcf, 0xb1, 0x6c, 0x02, 0x1b, 0xaf, 0x06, 0xbd, 0x96, 0x7b, 0x29, 0xfa, 0x28, 0x2c, 0x26, 0x1e, 0xb2, 0xed, 0x03, 0x5f, 0xa1, 0x48, 0xb9, 0x29, 0xc3, 0xa5, 0xa0, 0xc0, 0x59, 0x0d, 0x27, 0x28, 0x6d, 0x34, 0xc8, 0x42, 0x66, 0xb7, 0x3b, 0x37, 0xd9, 0xa2, 0xea, 0x19, 0xa2, 0x35, 0xa6, 0xc8, 0x34, 0xe8, 0x98, 0x13, 0x2d, 0xac, 0x7a, 0x20, 0x2e, 0x74, 0x07, 0x0e, 0xe9, 0xf4, 0xaf, 0xd8, 0x7b, 0xa8, 0x90, 0x7d, 0xfd, 0x19, 0xa2, 0x5e, 0x55, 0x5c, 0x31, 0xe7, 0x52, 0xdb, 0x91, 0x71, 0xf9, 0x58, 0x0d, 0x67, 0x19, 0x2e, 0x20, 0xa8, 0x26, 0xda, 0xe8, 0x2d, 0x43, 0xbb, 0xd7, 0xec, 0xa1, 0x16, 0xac, 0xfc, 0x08, 0x5d, 0xa1, 0xf9, 0xb3, 0xb1, 0xe6, 0xaa, 0x61, 0xa5, 0x4f, 0xe1, 0xa9, 0x45, 0x4a, 0xa3, 0x8e, 0x57, 0x13, 0x89, 0x53, 0xe0, 0x2b, 0x66, 0x91, 0xea, 0x06, 0x2a, 0x86, 0x85, 0x03, 0x07, 0xb0, 0x0c, 0xa2, 0xd2, 0x9a, 0xa9, 0xf2, 0xab, 0xf7, 0x1b, 0x48, 0xe0, 0xed, 0xb7, 0x36, 0x0f, 0xb3, 0xad, 0xbb, 0x8b, 0x5e, 0x8d, 0xb8, 0x01, 0xf8, 0x0a, 0xa3, 0x5c, 0xd3, 0xfd, 0x7f, 0xe5, 0x1c, 0xad, 0x0c, 0xaf, 0xb3, 0x4d, 0x3b, 0x32, 0x3a, 0xc6, 0xe4, 0x36, 0x6d, 0xb7, 0xbb, 0xf3, 0xb1, 0xba, 0x81, 0x76, 0xef, 0xea, 0x77, 0x46, 0xa2, 0xa2, 0x18, 0x48, 0x2f, 0x87, 0x07, 0xe0, 0x76, 0xc8, 0x47, 0x59, 0xa6, 0xa4, 0xaa, 0x87, 0x55, 0x2d, 0x8c, 0xaa, 0xd0, 0x4c, 0xc0, 0x96, 0xaf, 0x06, 0xcb, 0x11, 0xad, 0xfd, 0x50, 0x7d, 0xb7, 0x3a, 0xcc, 0xb7, 0x43, 0x29, 0x84, 0x3e, 0xe3, 0xe5, 0xbb, 0x98, 0x1a, 0xb6, 0x27, 0xf1, 0x6e, 0xd9, 0xa6, 0x06, 0xbe, 0x7f, 0x2e, 0x41, 0xd6, 0x17, 0x02, 0x25, 0x41, 0xd0, 0x2c, 0xed, 0x5e, 0x5a, 0x27, 0x70, 0xb7, 0xed, 0xdc, 0x48, 0x8d, 0x8d, 0xd0, 0x33, 0xb8, 0x8c, 0x9b, 0xb9, 0xae, 0x50, 0x9c, 0x10, 0xe1, 0x57, 0xeb, 0x3c, 0x4e, 0x77, 0x8f, 0x7a, 0x52, 0x6b, 0xf1, 0xdf, 0xc0, 0x8b, 0x91, 0x3d, 0x32, 0xdb, 0xf8, 0x46, 0x9c, 0x47, 0xee, 0xf4, 0x27, 0x2d, 0xec, 0x28, 0x3c, 0x1c, 0xd4, 0x91, 0xde, 0xdc, 0xe0, 0xcf, 0x3e, 0xae, 0xd8, 0xd8, 0x89, 0xd4, 0x89, 0x9b, 0x05, 0x54, 0x72, 0xe4, 0x5c, 0xfa, 0xc0, 0x80, 0x38, 0x9c, 0x7d, 0xa1, 0x0f, 0xa1, 0x04, 0x84, 0x41, 0xc4, 0xb8, 0x50, 0x60, 0x16, 0xf5, 0x42, 0xce, 0x42, 0x47, 0x07, 0x8e, 0x15, 0xda, 0x69, 0x54, 0x3e, 0x32, 0x2e, 0xde, 0x52, 0x1c, 0x3d, 0x87, 0x13, 0xe5, 0x03, 0x1a, 0xf1, 0xc9, 0x15, 0xe4, 0xd1, 0xae, 0x17, 0x0d, 0x0e, 0x13, 0xdc, 0x28, 0xbd, 0x43, 0xce, 0x08, 0x36, 0xce, 0x91, 0xd5, 0xd0, 0x39, 0xe3, 0x60, 0xeb, 0xf5, 0xc7, 0xb4, 0x34, 0x8e, 0xe2, 0xee, 0x24, 0x25, 0x25, 0x4e, 0xca, 0x20, 0xac, 0x8d, 0xcb, 0x20, 0xe6, 0x71, 0xa7, 0x33, 0xf7, 0xa0, 0x3d, 0x4c, 0x5a, 0xb2, 0x92, 0xf0, 0xcb, 0x89, 0xce, 0x31, 0x64, 0xe5, 0x87, 0xe0, 0x06, 0x33, 0x42, 0xff, 0xfa, 0xa6, 0x37, 0x75, 0xd8, 0x89, 0x55, 0x05, 0xa8, 0xd4, 0x86, 0x81, 0x48, 0xfd, 0x34, 0x3b, 0x0e, 0x10, 0x0c, 0xbd, 0xad, 0x02, 0x02, 0xba, 0x5d, 0x43, 0x95, 0x44, 0x36, 0x92, 0x54, 0x3e, 0xdd, 0x15, 0xa1, 0x15, 0x63, 0xa9, 0xb5, 0xab, 0x6a, 0x77, 0xe4, 0x94, 0x8a, 0xc8, 0x22, 0x85, 0xf3, 0x1a, 0xc7, 0x09, 0x53, 0x72, 0x8f, 0x76, 0xfa, 0xf5, 0xe5, 0x20, 0x3c, 0xb2, 0x61, 0xcc, 0x16, 0xc3, 0x8f, 0x68, 0x15, 0x94, 0xf2, 0xf9, 0x74, 0x82, 0x48, 0xd4, 0x84, 0xa8, 0x10, 0x11, 0x51, 0xf5, 0x4a, 0x3d, 0x83, 0x82, 0x7e, 0x4f, 0x82, 0x23, 0xff, 0xdd, 0xde, 0x3d, 0x71, 0x90, 0xed, 0xd7, 0x89, 0xd6, 0xb6, 0xf3, 0x14, 0xd6, 0x0d, 0x1e, 0x3b, 0xa9, 0x00, 0x46, 0x05, 0xc7, 0x72, 0xcc, 0x1d, 0xbf, 0x06, 0xda, 0xd6, 0x2c, 0x3f, 0xf7, 0x6c, 0xe4, 0xe5, 0xd8, 0x8d, 0x72, 0xaa, 0x79, 0x17, 0xc7, 0x0d, 0x6d, 0x24, 0x2c, 0x7f, 0x73, 0x44, 0x7b, 0xc4, 0x49, 0x09, 0x8f, 0x9d, 0xc5, 0xc9, 0xf9, 0xa4, 0x21, 0x9f, 0xf4, 0x77, 0x97, 0xb3, 0x9c, 0x18, 0x2d, 0xbb, 0x5a, 0x94, 0xd3, 0xc2, 0xa3, 0xe3, 0xab, 0x28, 0xe2, 0x10, 0xa8, 0xeb, 0xb2, 0x9a, 0x5a, 0x24, 0x51, 0x19, 0x08, 0xd5, 0x51, 0x24, 0x00, 0xe1, 0x91, 0x73, 0x2b, 0x5c, 0x6c, 0x41, 0xe4, 0x05, 0x30, 0xf4, 0x0a, 0x11, 0xd2, 0x00, 0x54, 0x2b, 0xe0, 0x09, 0xe5, 0xb8, 0xb6, 0x48, 0x21, 0x5f, 0xf5, 0x2f, 0xbe, 0xc9, 0x31, 0x50, 0x1e, 0xa5, 0xea, 0x7b, 0xdc, 0xf0, 0xbe, 0x26, 0xa5, 0x73, 0xdc, 0x12, 0x49, 0x8d, 0xbc, 0x2c, 0x11, 0x32, 0x0e, 0xb2, 0x54, 0x34, 0xf0, 0x96, 0x45, 0xc1, 0x63, 0x27, 0x0f, 0x2e, 0x00, 0xee, 0x24, 0xf2, 0xe7, 0xd6, 0xd1, 0xf6, 0xf9, 0x91, 0x17, 0x0c, 0x47, 0x36, 0xb6, 0xbc, 0xc9, 0x2f, 0x8a, 0x47, 0x54, 0x52, 0x1a, 0xe6, 0xc6, 0x4e, 0x6f, 0x53, 0x84, 0x49, 0x22, 0x8a, 0x26, 0xc7, 0xb9, 0xd1, 0x70, 0xce, 0x34, 0xf6, 0x84, 0x48, 0xe2, 0xd8, 0x57, 0xa8, 0x79, 0x28, 0x62, 0xd0, 0x66, 0x71, 0x9a, 0x32, 0x62, 0x56, 0xa1, 0x36, 0x46, 0x1c, 0x3e, 0xdc, 0x20, 0x68, 0x0b, 0xa3, 0x86, 0x49, 0x6d, 0xa9, 0x2a, 0x78, 0xc9, 0x13, 0xaf, 0xdf, 0xf5, 0xaf, 0xbb, 0x59, 0xed, 0xd8, 0x4e, 0xb9, 0xc8, 0x9b, 0x52, 0x0d, 0xea, 0x18, 0x73, 0x24, 0x7a, 0x2a, 0x30, 0x4d, 0x17, 0x4a, 0x32, 0x62, 0xc6, 0xb0, 0xdd, 0x05, 0x2f, 0xbc, 0x26, 0x2a, 0x0a, 0x95, 0xa4, 0xd6, 0xd4, 0x10, 0xe9, 0x25, 0xc6, 0xd3, 0x12, 0x92, 0x07, 0xba, 0x9d, 0x73, 0x21, 0x79, 0x7b, 0xc3, 0xb2, 0x83, 0x66, 0x24, 0x64, 0x2b, 0x75, 0x24, 0x1e, 0x09, 0xee, 0xc0, 0x7c, 0xa0, 0x5b, 0x27, 0x7d, 0x3d, 0xe0, 0xc0, 0x7c, 0x22, 0xcb, 0x6d, 0x62, 0xe4, 0x6d, 0x12, 0x19, 0x12, 0x29, 0x51, 0x44, 0x17, 0xca, 0x98, 0x2d, 0x62, 0x19, 0x5e, 0xfe, 0xc4, 0xb0, 0xa9, 0x35, 0x19, 0x09, 0xd4, 0x52, 0x2a, 0xda, 0x8f, 0xd2, 0xd2, 0xa5, 0x27, 0x61, 0x60, 0x8a, 0x08, 0x4c, 0x3d, 0x61, 0x80, 0x35, 0xcf, 0x05, 0xc5, 0x0a, 0x9c, 0xf2, 0x3a, 0x38, 0xb3, 0x13, 0xee, 0x1b, 0x48, 0xd5, 0x65, 0xb9, 0x9e, 0x80, 0x9c, 0xb1, 0x2a, 0xc7, 0x47, 0x6e, 0xf5, 0x9e, 0x5d, 0xa0, 0x42, 0x4b, 0xd6, 0xed, 0x71, 0xc0, 0xb4, 0xe3, 0x23, 0x28, 0x40, 0x32, 0x9f, 0xc0, 0x96, 0x18, 0x74, 0xe8, 0x63, 0x1c, 0x60, 0x7a, 0xee, 0xff, 0x71, 0x5a, 0x55, 0xf0, 0x6a, 0x4e, 0x19, 0xff, 0x68, 0x10, 0xdd, 0xd4, 0xc5, 0xa2, 0x6b, 0xa1, 0x3d, 0xe2, 0xf8, 0x55, 0x4f, 0x5e, 0xa9, 0x13, 0xe6, 0x69, 0x56, 0xe2, 0x39, 0x6f, 0x8d, 0xa6, 0xf0, 0x85, 0xda, 0x4f, 0x88, 0x44, 0x45, 0x50, 0xf8, 0xd8, 0x1d, 0x52, 0x95, 0x54, 0xf4, 0x2a, 0x33, 0x48, 0xeb, 0x09, 0x8d, 0x96, 0x30, 0xf3, 0xe7, 0x81, 0xc4, 0x73, 0xf1, 0x07, 0x82, 0x8c, 0xef, 0x71, 0x5d, 0xf2, 0x17, 0x28, 0xe9, 0x7b, 0x3a, 0xca, 0x1d, 0xd0, 0xa7, 0x7d, 0x57, 0x68, 0x4d, 0x84, 0xa0, 0xb7, 0x1f, 0x10, 0x31, 0xa2, 0xbd, 0x58, 0x37, 0x37, 0x50, 0xeb, 0xd4, 0x9b, 0xb5, 0x45, 0x66, 0x43, 0xdf, 0xa1, 0x0b, 0x67, 0x76, 0x0f, 0x65, 0xb4, 0xc4, 0xc6, 0x9a, 0x42, 0xd2, 0xbb, 0x9f, 0xc5, 0xce, 0x73, 0xb7, 0x07, 0xb0, 0x15, 0x36, 0x96, 0x1e, 0xc3, 0x8b, 0xb9, 0x8c, 0x2a, 0x7d, 0xa9, 0xa7, 0x58, 0xb5, 0xfe, 0xf4, 0xce, 0x7d, 0x68, 0xb4, 0xd7, 0xc7, 0x9f, 0x0c, 0x18, 0x71, 0x9d, 0x62, 0x67, 0xc7, 0x0a, 0x0a, 0xe1, 0x4a, 0xf8, 0x22, 0x36, 0xb0, 0xd0, 0xba, 0x48, 0x2b, 0x8c, 0x39, 0xf5, 0xee, 0x27, 0xfb, 0x30, 0xee, 0x52, 0x3f, 0x57, 0xe5, 0x69, 0x41, 0xc0, 0x9d, 0xa5, 0xa3, 0x96, 0x6b, 0x93, 0x11, 0xe3, 0xf9, 0xc5, 0x25, 0xed, 0x49, 0xc7, 0x88, 0xc6, 0xf7, 0x54, 0x5b, 0x1f, 0xbf, 0xca, 0xd5, 0x5d, 0x3e, 0xdc, 0x2d, 0xef, 0xfd, 0x87, 0xba, 0xde, 0xab, 0x47, 0x59, 0xa5, 0xaa, 0x8a, 0x0f, 0x44, 0xce, 0x65, 0xef, 0x90, 0x61, 0x86, 0x3e, 0xcd, 0x6a, 0x6a, 0xd6, 0x7e, 0x2e, 0xd0, 0xc8, 0x7c, 0xf8, 0x6d, 0x45, 0x46, 0x16, 0xe1, 0xbf, 0x98, 0x24, 0xea, 0x4b, 0x3f, 0x8d, 0xd7, 0x4a, 0x2b, 0x4e, 0x40, 0x48, 0xc6, 0xfd, 0xf5, 0x24, 0x84, 0x0a, 0x34, 0x71, 0xbb, 0x46, 0x1f, 0x1d, 0xb6, 0xa1, 0x6c, 0x50, 0x05, 0x38, 0x5f, 0x97, 0x16, 0x8f, 0xf5, 0x42, 0x0a, 0x1a, 0x63, 0x0b, 0xc1, 0x03, 0xbe, 0xf8, 0x37, 0x27, 0xfc, 0x82, 0x14, 0x62, 0x1b, 0xf6, 0x7e, 0x0c, 0xa0, 0x1c, 0x32, 0xc3, 0x43, 0x17, 0xd3, 0x6b, 0xe9, 0x8c, 0x81, 0x74, 0xd2, 0x06, 0xae, 0x5b, 0x14, 0x99, 0x2d, 0x74, 0x48, 0xc6, 0x8c, 0xe6, 0x83, 0x9f, 0xa4, 0xf7, 0x88, 0x2b, 0x6e, 0x8a, 0x3b, 0x0c, 0x19, 0xe5, 0x59, 0x5f, 0x59, 0xb8, 0x67, 0xe4, 0x01, 0x5b, 0xe8, 0x5f, 0xd4, 0x58, 0xd3, 0x3e, 0x98, 0x29, 0x44, 0x7b, 0x6d, 0x43, 0x72, 0xc4, 0x5d, 0x53, 0xe1, 0xda, 0x34, 0xc7, 0xd9, 0x37, 0x92, 0x90, 0x16, 0xf3, 0x3e, 0x26, 0xc1, 0xe8, 0xbd, 0xcd, 0x9f, 0x15, 0x24, 0x18, 0x89, 0x40, 0x2a, 0xab, 0x1c, 0xdf, 0x81, 0x44, 0xb1, 0x39, 0x67, 0xfd, 0x8f, 0xc9, 0x78, 0xcb, 0x60, 0xe3, 0xc6, 0x4b, 0xe2, 0x9a, 0x2b, 0xbe, 0xdf, 0xe0, 0xde, 0x51, 0x5f, 0xef, 0x45, 0xa3, 0x1c, 0xe8, 0x0a, 0x81, 0x36, 0xba, 0x71, 0xf4, 0x28, 0x46, 0xe9, 0x7d, 0xfb, 0xc1, 0xe1, 0x9f, 0xba, 0x59, 0xdc, 0x9e, 0x25, 0x1b, 0xc8, 0x87, 0xa9, 0x14, 0x8b, 0x70, 0x90, 0xb6, 0xe0, 0x01, 0x76, 0x7e, 0x61, 0x33, 0xfc, 0xd4, 0xe4, 0x58, 0xc0, 0x33, 0x0b, 0x5c, 0x8c, 0x89, 0x17, 0x4a, 0xcd, 0xe1, 0xfd, 0x11, 0x47, 0x3f, 0xbc, 0x89, 0x08, 0xcb, 0xed, 0xb1, 0x9a, 0x32, 0x9c, 0x3b, 0x7d, 0x4a, 0x56, 0x4a, 0xd4, 0xf5, 0x83, 0x7a, 0x5f, 0x47, 0xf7, 0x21, 0xa9, 0xeb, 0xc3, 0xd4, 0x83, 0xc2, 0x51, 0x2d, 0xb0, 0xce, 0xb0, 0xcc, 0xe2, 0x4f, 0x2c, 0x9c, 0xe6, 0x2b, 0x22, 0x57, 0x1b, 0x93, 0x12, 0x4d, 0x28, 0xe4, 0xf6, 0x61, 0xee, 0xcb, 0xd2, 0x54, 0xbc, 0xad, 0x8d, 0x46, 0xc2, 0x46, 0xff, 0x79, 0xc9, 0x90, 0x4b, 0x59, 0x21, 0xe6, 0x6f, 0xb9, 0xda, 0x69, 0x19, 0x60, 0x37, 0xa3, 0xbd, 0xc4, 0x5f, 0x6a, 0xe4, 0x15, 0x56, 0x07, 0xc7, 0x7d, 0x2c, 0x98, 0x1c, 0xa7, 0x74, 0xb3, 0x30, 0x7e, 0xf8, 0x4c, 0x36, 0x37, 0xab, 0xd9, 0xde, 0x91, 0xdf, 0xb3, 0x2a, 0x5b, 0xb8, 0xc0, 0x7e, 0x37, 0xe1, 0x4f, 0xf6, 0x9f, 0x7d, 0x43, 0xfb, 0x25, 0x61, 0x74, 0x19, 0xff, 0x80, 0x52, 0x0b, 0xc2, 0xa6, 0xcc, 0x18, 0x6e, 0x6a, 0x70, 0xa3, 0xab, 0x5e, 0xd3, 0xfd, 0x52, 0x88, 0x33, 0x7d, 0x2f, 0x16, 0x5b, 0xd3, 0x06, 0x4d, 0xc7, 0x99, 0xd3, 0xc3, 0x09, 0x2b, 0x56, 0xce, 0x6b, 0xb9, 0xcf, 0x3c, 0xd6, 0x9a, 0x07, 0x44, 0xf2, 0xe3, 0x8f, 0xbd, 0x8f, 0x39, 0x4c, 0x8e, 0x44, 0xe3, 0x34, 0x66, 0x55, 0x23, 0x52, 0xad, 0xda, 0xc7, 0x10, 0xba, 0x1e, 0xfb, 0xb5, 0x46, 0x46, 0x61, 0x2d, 0x20, 0x33, 0x64, 0x09, 0x23, 0xa9, 0xc9, 0xc6, 0x66, 0xb0, 0x86, 0x52, 0xb2, 0x3a, 0xd8, 0xcc, 0x39, 0x07, 0x90, 0x8b, 0x84, 0xc6, 0xad, 0x63, 0xae, 0x7d, 0x30, 0x23, 0xd0, 0x2a, 0x2c, 0x62, 0xbc, 0xab, 0x1d, 0x7c, 0xee, 0xdb, 0x7a, 0xd7, 0xbf, 0xfe, 0x8e, 0x6b, 0xdc, 0x5f, 0x83, 0x81, 0xf7, 0x37, 0xc0, 0xba, 0xbc, 0xd1, 0x75, 0x54, 0x07, 0xec, 0x73, 0xa9, 0x54, 0x61, 0x42, 0xf8, 0x77, 0x05, 0x6d, 0x68, 0x8d, 0xd1, 0x21, 0x4a, 0x32, 0x40, 0xf6, 0x9f, 0xf4, 0xf9, 0x0d, 0xda, 0x08, 0xae, 0x5b, 0xe7, 0x3c, 0x44, 0x44, 0x6b, 0x2d, 0x34, 0x6c, 0x4e, 0xba, 0x31, 0xca, 0x77, 0xb8, 0x0b, 0xfe, 0xd6, 0xe7, 0xd3, 0xe4, 0xa8, 0x25, 0x40, 0x69, 0xf6, 0xe2, 0x51, 0x9d, 0x5f, 0xd4, 0x34, 0x0a, 0x18, 0xec, 0x67, 0x45, 0x31, 0x88, 0x1d, 0xc2, 0x1a, 0xea, 0xe3, 0xec, 0x65, 0xe9, 0x83, 0x75, 0xcd, 0xe6, 0x28, 0xeb, 0x78, 0x02, 0xc4, 0x8d, 0x79, 0x8e, 0xaf, 0x5c, 0x99, 0xc4, 0x91, 0x75, 0x57, 0xb4, 0x81, 0x9d, 0x2d, 0x80, 0x6e, 0x1e, 0x15, 0xcc, 0xbe, 0xd2, 0x4c, 0x71, 0x36, 0x7d, 0x56, 0x71, 0x1a, 0x5f, 0x42, 0x30, 0x95, 0x0a, 0x2f, 0xe1, 0x5a, 0x72, 0x0f, 0x3e, 0x8c, 0x43, 0xab, 0x7c, 0xdc, 0x77, 0xe8, 0x7e, 0xf1, 0x27, 0x48, 0x49, 0x0c, 0xa1, 0xb3, 0xb8, 0xec, 0xbc, 0x78, 0x70, 0xef, 0x68, 0x8f, 0x17, 0x7b, 0x89, 0x21, 0xc1, 0x9c, 0x06, 0x49, 0xab, 0xee, 0x1c, 0x1d, 0x2c, 0xbe, 0xf9, 0xe8 ],
+    const [ 0x9e, 0x01, 0x44, 0x21, 0xc8, 0x8b, 0xcf, 0x4c, 0x26, 0x11, 0x98, 0x1d, 0x72, 0x37, 0x47, 0xec, 0xae, 0xc7, 0x0e, 0x75, 0xb8, 0xf6, 0xdc, 0x3a, 0x1e, 0xe9, 0xd4, 0x23, 0x33, 0x77, 0xfd, 0x68, 0x63, 0x31, 0x3b, 0xb0, 0xc3, 0x9f, 0x7e, 0x7b, 0xec, 0xcd, 0x39, 0xbd, 0x0a, 0x06, 0x16, 0xcb, 0x30, 0xe0, 0xe8, 0x7b, 0xef, 0x79, 0xe0, 0x87, 0x26, 0xff, 0x05, 0x33, 0x1b, 0x76, 0xde, 0x30, 0xcb, 0xb5, 0x71, 0xbf, 0x7f, 0xb2, 0x72, 0x1a, 0xa0, 0x00, 0xb4, 0x0f, 0xcc, 0x96, 0xe3, 0xee, 0x29, 0xd2, 0x75, 0xa5, 0xfa, 0xbe, 0xde, 0x2a, 0x70, 0x91, 0x03, 0x19, 0xc2, 0x79, 0xf2, 0x9f, 0x80, 0x97, 0xd0, 0x96, 0x24, 0x4b, 0x12, 0xf1, 0xea, 0xb3, 0xf1, 0x5b, 0xe1, 0x6e, 0x17, 0x1b, 0x42, 0xa6, 0x9f, 0x3b, 0x01, 0x4d, 0x3c, 0xe9, 0xa3, 0xa6, 0xb8, 0x1d, 0x4f, 0x08, 0xa1, 0x7c, 0x27, 0xdf, 0x3f, 0x7d, 0xd9, 0xf3, 0xc8, 0xca, 0x70, 0xed, 0xd7, 0xe9, 0x71, 0x17, 0x1b, 0x1b, 0x23, 0x63, 0x4c, 0x84, 0x2e, 0xaf, 0x64, 0x8d, 0x67, 0x47, 0x0b, 0x87, 0xeb, 0xab, 0x53, 0x91, 0x6b, 0x93, 0xa5, 0xbb, 0xc6, 0x31, 0xfc, 0x6b, 0xdd, 0xb6, 0x50, 0x00, 0xa3, 0x17, 0x56, 0xb6, 0x73, 0x11, 0x66, 0xc9, 0xa7, 0x6b, 0xbc, 0xde, 0x66, 0x7b, 0xe4, 0x9e, 0xbd, 0xeb, 0x70, 0xa4, 0xf1, 0xbd, 0xec, 0x99, 0x14, 0x8d, 0x14, 0x9d, 0xd7, 0x16, 0x44, 0xe9, 0x9f, 0xf8, 0x2f, 0xb3, 0xdb, 0xb9, 0xd4, 0x52, 0x94, 0x09, 0xae, 0xa3, 0x45, 0x4a, 0x2b, 0xab, 0xee, 0x4f, 0x60, 0x7e, 0x64, 0x64, 0xfb, 0x5f, 0xeb, 0x8f, 0x79, 0x28, 0x06, 0x16, 0x99, 0xed, 0x8e, 0x41, 0x10, 0xdc, 0x02, 0x61, 0x7e, 0x67, 0x1e, 0x11, 0xa1, 0xa6, 0xaf, 0xbc, 0xc8, 0xf6, 0xa5, 0x60, 0x8b, 0xe7, 0x6a, 0x91, 0xba, 0x55, 0x72, 0xc0, 0x93, 0xd4, 0x14, 0xbd, 0x38, 0x52, 0x98, 0x7b, 0x60, 0xf7, 0x91, 0x14, 0x4c, 0x50, 0x6d, 0x0c, 0xfd, 0xad, 0x4a, 0xda, 0xa4, 0xc7, 0x0b, 0xa4, 0x5a, 0xa6, 0xab, 0x4b, 0x11, 0xc2, 0xd2, 0xa7, 0xca, 0x69, 0xa6, 0x14, 0x09, 0x60, 0xe4, 0x2d, 0x86, 0xcd, 0x2f, 0xd7, 0x26, 0x54, 0xa8, 0x82, 0x29, 0x81, 0xbe, 0xab, 0xa5, 0x66, 0x48, 0xa5, 0x33, 0x85, 0xd1, 0x9a, 0xe8, 0xf0, 0x32, 0xcd, 0x87, 0xae, 0x67, 0x21, 0xf4, 0x61, 0x9b, 0xdf, 0xec, 0x26, 0x85, 0xb4, 0xf4, 0xbd, 0xf7, 0xf9, 0x8f, 0xea, 0xb4, 0x37, 0xb4, 0x1a, 0x83, 0xeb, 0x7f, 0x4a, 0x81, 0x86, 0x27, 0x25, 0xbb, 0xb8, 0x30, 0x6c, 0xfc, 0xee, 0xe2, 0x9b, 0xe4, 0x1a, 0xf9, 0xca, 0x3a, 0xb2, 0x9e, 0xd1, 0x83, 0xfb, 0x96, 0xaf, 0xd4, 0x87, 0xba, 0x2d, 0xe4, 0xfc, 0xa7, 0xbe, 0x65, 0x18, 0xb6, 0xaa, 0x95, 0xf2, 0x2f, 0x6b, 0x10, 0x83, 0xb9, 0x57, 0xe8, 0x64, 0x15, 0x80, 0xf7, 0xd9, 0x0c, 0xd9, 0x74, 0x0f, 0xa6, 0x9a, 0xc5, 0xa2, 0x9d, 0xe5, 0x94, 0x62, 0x11, 0xa9, 0x25, 0x57, 0x7d, 0xc7, 0xe7, 0x03, 0xea, 0x73, 0x49, 0xe6, 0x63, 0xdd, 0xce, 0x48, 0xa8, 0x11, 0x64, 0x32, 0x27, 0x1c, 0xf2, 0xbe, 0x27, 0x71, 0x30, 0x90, 0x47, 0x8b, 0xbb, 0xa5, 0x27, 0xd3, 0x69, 0x4c, 0x65, 0xc3, 0xd9, 0x71, 0xcb, 0x4c, 0x4f, 0x21, 0xc6, 0x75, 0xbf, 0x4b, 0x1a, 0x46, 0x28, 0xc4, 0xd5, 0xe4, 0x24, 0x8e, 0x81, 0xfd, 0xbc, 0x5a, 0x9e, 0x66, 0x80, 0x4b, 0x50, 0x03, 0xd8, 0xfd, 0x54, 0xe8, 0x95, 0xc6, 0x38, 0xbd, 0xcb, 0x3c, 0xcc, 0x67, 0xe3, 0xf7, 0xd4, 0xe5, 0xec, 0x98, 0xff, 0x77, 0x32, 0x09, 0x1d, 0x06, 0x12, 0x07, 0x8c, 0xc0, 0x0c, 0xde, 0xf3, 0x03, 0x1a, 0x74, 0x33, 0x7c, 0x40, 0x89, 0x9b, 0x90, 0x65, 0x3d, 0x5c, 0xfa, 0x61, 0xd3, 0x3c, 0xb6, 0x57, 0xb4, 0x8e, 0x1e, 0x45, 0xb7, 0x61, 0x54, 0xd9, 0x9f, 0xf8, 0xdf, 0x87, 0xe6, 0x7a, 0x99, 0xd8, 0xb9, 0xeb, 0xc8, 0x05, 0x43, 0x5b, 0x8b, 0xc4, 0x2e, 0x5d, 0x78, 0x62, 0x67, 0xbb, 0x83, 0x12, 0x22, 0x68, 0x21, 0x85, 0x1f, 0xb6, 0xae, 0xba, 0x2b, 0xc9, 0x0c, 0x18, 0xe9, 0x4c, 0x8e, 0xba, 0xd2, 0x62, 0x14, 0x0a, 0x7b, 0xe0, 0x77, 0x91, 0x16, 0xb9, 0x27, 0x0d, 0x3c, 0xba, 0x12, 0xc4, 0xea, 0x77, 0xc8, 0x19, 0xc9, 0x85, 0xdd, 0x5d, 0xb2, 0xe9, 0x8f, 0xe7, 0x71, 0xd1, 0xa9, 0x67, 0xc9, 0x82, 0xa8, 0x77, 0xb9, 0x92, 0x1b, 0x73, 0xfe, 0x57, 0x50, 0x8b, 0xd9, 0x9f, 0x2c, 0x16, 0x12, 0xa1, 0x5b, 0x29, 0x3d, 0x34, 0xaa, 0x69, 0x3c, 0x3f, 0xb0, 0x1d, 0x05, 0x71, 0xb4, 0x88, 0xa6, 0x32, 0xcb, 0x75, 0x86, 0xd9, 0x41, 0x13, 0xed, 0x1f, 0x3a, 0x03, 0xc6, 0xd3, 0x99, 0xb0, 0xa4, 0xd0, 0x21, 0xdf, 0x04, 0x2d, 0xda, 0x87, 0xd2, 0xb3, 0xb7, 0xe2, 0x2e, 0x94, 0x75, 0xc4, 0x6f, 0x59, 0xc6, 0x2c, 0x68, 0x1d, 0xaf, 0x18, 0xeb, 0xf9, 0x2f, 0x9e, 0x8c, 0xbf, 0x21, 0x39, 0xa7, 0xeb, 0x63, 0x61, 0xa5, 0xd6, 0x38, 0x5e, 0x7a, 0x2d, 0xeb, 0x5d, 0x72, 0xa2, 0xb6, 0xc4, 0x2e, 0xe1, 0xe1, 0xc3, 0xe9, 0xc6, 0x2e, 0x2b, 0x01, 0xcd, 0x75, 0x84, 0xb2, 0xca, 0x8c, 0x5a, 0x24, 0xda, 0x69, 0xd7, 0xa8, 0x99, 0x8b, 0x97, 0x3e, 0x95, 0x96, 0xb7, 0x5c, 0x03, 0x3d, 0x2f, 0xea, 0xb1, 0x64, 0x62, 0x91, 0x3c, 0x86, 0xf4, 0x35, 0x83, 0x55, 0xdc, 0xc0, 0x5b, 0xa1, 0xba, 0x22, 0x85, 0x7b, 0x6a, 0x96, 0xdd, 0x9a, 0xd9, 0x26, 0xd3, 0xfe, 0x17, 0x71, 0x1f, 0xd2, 0xae, 0xac, 0xb1, 0x97, 0x33, 0xe7, 0xe7, 0x7f, 0x1a, 0x91, 0x03, 0x17, 0xce, 0x3f, 0xdc, 0x29, 0x02, 0xa9, 0xd4, 0xe1, 0x41, 0xf5, 0x09, 0x2e, 0xcd, 0x39, 0xd0, 0x6b, 0xa6, 0x3b, 0x5f, 0x3f, 0xe9, 0x7b, 0xc9, 0xc2, 0x5b, 0x73, 0x30, 0xe1, 0x46, 0x1d, 0x35, 0x03, 0x84, 0xb6, 0xb4, 0xed, 0xd9, 0xc2, 0xaf, 0xe2, 0x86, 0x50, 0x87, 0x0f, 0x1a, 0x7f, 0x72, 0x27, 0x8c, 0x41, 0x29, 0x4b, 0x87, 0x5f, 0xe1, 0x2c, 0x05, 0xbd, 0x7d, 0x73, 0x1f, 0xe0, 0x02, 0x61, 0x23, 0xad, 0x4b, 0xb2, 0xe8, 0x73, 0xfe, 0xc8, 0x5e, 0x2c, 0xbe, 0x05, 0x69, 0x00, 0xa2, 0x79, 0xf0, 0x0b, 0xe6, 0xbd, 0x31, 0x60, 0xe1, 0x1e, 0x57, 0x4e, 0x37, 0xfe, 0x4e, 0xe2, 0x50, 0x78, 0xd6, 0xac, 0x09, 0x43, 0xd6, 0xc6, 0xa9, 0xd9, 0xf3, 0x13, 0x16, 0xd8, 0x62, 0xc5, 0x49, 0xa8, 0xfa, 0x22, 0xff, 0x5e, 0x8e, 0x87, 0xb1, 0xe0, 0x79, 0xad, 0xc7, 0x4a, 0x7a, 0x2b, 0x09, 0x91, 0xc3, 0x3c, 0x56, 0x67, 0x4c, 0xc3, 0x98, 0x5e, 0x6d, 0x8c, 0xf7, 0x4f, 0xac, 0xd5, 0x4d, 0xfd, 0xd4, 0x0d, 0xda, 0xf6, 0x47, 0xdb, 0x3a, 0xba, 0x94, 0x62, 0x93, 0x1f, 0x4c, 0xc4, 0x13, 0xf4, 0x12, 0xe4, 0x9a, 0xe5, 0xf2, 0x71, 0xb3, 0x9e, 0xf4, 0x20, 0xc9, 0x34, 0xf0, 0x38, 0x98, 0xc0, 0xa3, 0x54, 0xe1, 0x4d, 0x03, 0x64, 0x62, 0xf4, 0xd0, 0xf6, 0x05, 0x45, 0x6c, 0xb4, 0x58, 0xe9, 0xec, 0x2d, 0x3d, 0x86, 0x6f, 0xd8, 0xe3, 0xe3, 0xae, 0x55, 0xf4, 0x4d, 0xd5, 0xf7, 0x10, 0x39, 0x92, 0x80, 0x7b, 0x2a, 0x6b, 0x2b, 0x12, 0xd5, 0x54, 0xf0, 0x84, 0x83, 0x81, 0x03, 0xbe, 0xb8, 0x79, 0x9e, 0xa7, 0x12, 0x6c, 0x00, 0x0e, 0x73, 0xc6, 0xb6, 0xe0, 0x63, 0x04, 0x19, 0x9f, 0xaf, 0xc6, 0x18, 0x0f, 0x56, 0x26, 0x37, 0x33, 0xa6, 0x49, 0xd8, 0x77, 0xa3, 0x33, 0xb9, 0x2f, 0xa8, 0xe0, 0xbf, 0x40, 0x51, 0x90, 0xf2, 0x1d, 0x97, 0x62, 0xc8, 0xf6, 0x3d, 0x24, 0xa6, 0x2c, 0x6c, 0x6a, 0xa4, 0x07, 0x9a, 0xdd, 0x91, 0xab, 0xb0, 0xd6, 0x37, 0x48, 0x6b, 0x2c, 0xdf, 0x92, 0x02, 0x4a, 0x18, 0x71, 0x0a, 0x84, 0xb5, 0xf9, 0x97, 0xab, 0x15, 0x9c, 0xa5, 0xde, 0xa7, 0x9e, 0xb6, 0xa4, 0xac, 0xca, 0xbc, 0x38, 0x3f, 0x64, 0x38, 0x24, 0x93, 0x5e, 0xa4, 0x11, 0x7d, 0xce, 0x0f, 0xde, 0x32, 0xa0, 0x07, 0xef, 0x51, 0x88, 0xbb, 0xc8, 0x24, 0x3b, 0x61, 0xda, 0x23, 0xdf, 0xd6, 0x9c, 0xb9, 0xc0, 0x84, 0xde, 0x4b, 0x44, 0x89, 0x5b, 0x77, 0x21, 0x16, 0x8d, 0x99, 0xcd, 0x14, 0xc5, 0x94, 0x37, 0x0e, 0x7a, 0xcf, 0xb4, 0x4b, 0xe1, 0x7d, 0x3c, 0x3a, 0xbf, 0x22, 0xd6, 0x14, 0x7c, 0x52, 0x51, 0xbc, 0x78, 0xbc, 0x35, 0xea, 0xa2, 0x68, 0xf9, 0x88, 0x46, 0x3d, 0x76, 0x5c, 0x26, 0xc6, 0x9c, 0xe8, 0xcd, 0x36, 0x64, 0x8e, 0x20, 0xa9, 0x05, 0xf8, 0x36, 0xac, 0x6b, 0xb7, 0x69, 0x00, 0xe5, 0x2a, 0xad, 0x9b, 0x1e, 0xa2, 0x21, 0xf0, 0x4e, 0xc3, 0xe4, 0x70, 0xb1, 0x2e, 0x2a, 0x51, 0x39, 0x5d, 0x8f, 0x8e, 0x80, 0xcd, 0xab, 0x2f, 0x00, 0x63, 0xe6, 0xca, 0x86, 0x09, 0x8d, 0x4a, 0xe4, 0x98, 0x26, 0xef, 0xe6, 0xfa, 0x01, 0x96, 0x88, 0x90, 0x10, 0x3b, 0x66, 0xd1, 0xf8, 0xbc, 0x74, 0x34, 0x68, 0xdf, 0xef, 0x50, 0xaa, 0x97, 0x94, 0x42, 0x78, 0x83, 0x0f, 0x50, 0x10, 0xb8, 0xb6, 0xcc, 0x8b, 0xc0, 0x77, 0x3a, 0x6a, 0xe2, 0x0f, 0xb5, 0x72, 0xa4, 0x7d, 0x8e, 0xba, 0x8f, 0xb7, 0x37, 0x02, 0x32, 0x9b, 0x5f, 0x46, 0x6a, 0x28, 0x5f, 0x93, 0xe0, 0xee, 0xd5, 0x1a, 0xd2, 0xc3, 0x8e, 0x83, 0x17, 0xb8, 0xaa, 0x83, 0x5d, 0x4c, 0xfa, 0xb1, 0xb6, 0xdf, 0xad, 0x95, 0x53, 0x69, 0x2c, 0x02, 0x8e, 0x6b, 0x42, 0xa6, 0x2e, 0x26, 0x80, 0xe0, 0xe7, 0x0c, 0xe0, 0xd1, 0x21, 0x74, 0xa8, 0xb6, 0xfb, 0x91, 0x91, 0x75, 0x8e, 0xa5, 0x29, 0x75, 0x76, 0x72, 0x76, 0xb3, 0x8f, 0xf1, 0xdc, 0x13, 0xfc, 0x47, 0x40, 0xf4, 0x6e, 0xf5, 0x6e, 0x06, 0xa2, 0x4f, 0xb8, 0x60, 0x2c, 0x2f, 0xe0, 0xcd, 0x74, 0xea, 0x39, 0x67, 0xfe, 0x83, 0x08, 0x68, 0xee, 0x1f, 0x30, 0x3c, 0xcb, 0xb9, 0x0f, 0xdb, 0x83, 0x17, 0xa3, 0x55, 0xaf, 0xfd, 0xf1, 0xae, 0x19, 0xa0, 0xa7, 0xed, 0x7b, 0x5d, 0x00, 0x70, 0x8a, 0xab, 0xe8, 0x82, 0x33, 0x4f, 0x61, 0x30, 0x25, 0xcf, 0x25, 0x58, 0x8f, 0x28, 0x8c, 0x02, 0x2b, 0xc3, 0xb1, 0xf3, 0x7b, 0xa6, 0xd0, 0x80, 0x53, 0xe8, 0xf3, 0xa1, 0x97, 0x67, 0xce, 0x46, 0x46, 0xbd, 0xe7, 0xee, 0xb7, 0x6f, 0xfa, 0x75, 0x23, 0x68, 0x9b, 0x2d, 0x64, 0xa6, 0x1d, 0x31, 0xfc, 0x34, 0xb3, 0xf6, 0x59, 0x58, 0xd5, 0x23, 0x58, 0x0d, 0xe5, 0xa3, 0x07, 0xb3, 0x13, 0xf8, 0xaf, 0x06, 0x7e, 0xd2, 0x12, 0x4d, 0x9b, 0xe0, 0xf1, 0xd3, 0xdb, 0xe6, 0xd1, 0x9b, 0x88, 0x10, 0xff, 0x50, 0xf0, 0x86, 0xd2, 0x7b, 0xc6, 0x40, 0x30, 0xf9, 0xc5, 0x1c, 0x53, 0xab, 0x96, 0x2d, 0xcd, 0x6f, 0xf4, 0x56, 0xca, 0x4f, 0x0e, 0x18, 0x96, 0xf9, 0x2d, 0xa9, 0x5f, 0x6f, 0x96, 0x46, 0x3b, 0x00, 0xb2, 0xc9, 0x6d, 0x77, 0x6c, 0x7e, 0xe4, 0x92, 0xdb, 0x33, 0x04, 0xb6, 0x21, 0x8e, 0xa9, 0xe0, 0x93, 0xa4, 0x69, 0xdf, 0x1a, 0xc6, 0x1a, 0xc1, 0xd8, 0x9e, 0x94, 0x8b, 0x0f, 0x7c, 0xb8, 0x2d, 0x3f, 0xea, 0xb2, 0xb4, 0x8f, 0x86, 0x7a, 0xc2, 0x6e, 0x11, 0xa1, 0x3b, 0x7a, 0xc3, 0x4a, 0x42, 0xa1, 0xe1, 0x77, 0x64, 0x86, 0x92, 0x86, 0x12, 0x26, 0xef, 0xfb, 0x55, 0xbb, 0x59, 0x7f, 0xbd, 0xe1, 0x0f, 0x29, 0x9b, 0xf7, 0xff, 0xfd, 0x6f, 0xc8, 0xdd, 0xb2, 0xa4, 0x6a, 0x73, 0xb9, 0x7b, 0x67, 0x38, 0x7a, 0x46, 0x1b, 0x23, 0xe1, 0xd6, 0x5d, 0xc1, 0x19, 0x36, 0x62, 0x86, 0x97, 0x9a, 0xdd, 0x61, 0x5b, 0x92, 0x6b, 0x92, 0x72, 0x83, 0x2f, 0xc0, 0xc0, 0x58, 0xb9, 0x46, 0xfc, 0x75, 0x2d, 0xcf, 0xfc, 0xec, 0xa1, 0x22, 0x33, 0xf4, 0xc6, 0x3f, 0x78, 0x97, 0xcb, 0xaa, 0x08, 0xaa, 0x7e, 0x07, 0xcf, 0x02, 0xb5, 0xe7, 0xe3, 0xe5, 0xec, 0xe2, 0x52, 0xbf, 0x2f, 0xe6, 0x1d, 0x16, 0x3b, 0xce, 0x84, 0xc0, 0xe0, 0x36, 0x84, 0x54, 0xa9, 0x8e, 0x9f, 0xde, 0xbf, 0x6e, 0xdb, 0xd7, 0x0b, 0x29, 0x0d, 0x54, 0x9b, 0xa5, 0x57, 0x7d, 0x47, 0x6a, 0xf0, 0x41, 0x94, 0xf8, 0x23, 0x48, 0xd8, 0x5e, 0x9b, 0x29, 0x9f, 0x08, 0xdd, 0xde, 0x4e, 0xd9, 0x16, 0x75, 0x06, 0x7a, 0x17, 0x07, 0xcb, 0xf1, 0x9e, 0xee, 0xe6, 0x75, 0xd7, 0x33, 0x87, 0x80, 0x22, 0x46, 0xaf, 0x27, 0x17, 0xf2, 0x4d, 0xa7, 0xc7, 0x8f, 0xa8, 0x40, 0x45, 0x7a, 0xfc, 0x46, 0x66, 0xc2, 0x68, 0x75, 0xc4, 0x24, 0x07, 0x85, 0x09, 0x3a, 0x5e, 0xfe, 0x6a, 0xef, 0xf6, 0x4e, 0x71, 0x36, 0x49, 0x18, 0x00, 0xfc, 0xe3, 0xd0, 0x93, 0x5a, 0xc1, 0x85, 0xc5, 0x10, 0xfd, 0xfd, 0x16, 0x2f, 0xad, 0x07, 0xeb, 0x15, 0x08, 0x0d, 0xd6, 0x9e, 0xca, 0xe9, 0x18, 0x99, 0xda, 0xf9, 0x64, 0x79, 0x2a, 0x76, 0xe6, 0x4d, 0xdf, 0x01, 0x84, 0xf3, 0xb3, 0x7f, 0x64, 0x88, 0x97, 0x27, 0xae, 0x22, 0x9c, 0xd9, 0x93, 0xc2, 0x13, 0xb2, 0x8e, 0x84, 0xf3, 0xdd, 0xe9, 0x19, 0x7c, 0xac, 0x84, 0x77, 0x1a, 0xe7, 0xd2, 0xcf, 0x8c, 0x64, 0x24, 0xc0, 0x45, 0xd7, 0x2a, 0xca, 0x13, 0xec, 0xb6, 0x05, 0xfe, 0x93, 0xc4, 0x13, 0x73, 0x9b, 0xb8, 0x53, 0xa2, 0x83, 0xe6, 0x57, 0x24, 0x8d, 0x57, 0x99, 0xe1, 0x13, 0xca, 0x69, 0x31, 0x1e, 0xfa, 0x2a, 0x41, 0x35, 0x1f, 0xbe, 0xb9, 0x73, 0xb7, 0x3f, 0x9b, 0xdd, 0x86, 0xf0, 0x6e, 0xf2, 0xdc, 0x73, 0x9d, 0x83, 0x16, 0x3c, 0x1a, 0xc4, 0x67, 0x45, 0x46, 0xa4, 0xd9, 0x03, 0x15, 0x5a, 0x8e, 0x9a, 0x6d, 0x40, 0x4c, 0x4d, 0xd0, 0xe5, 0x39, 0x38, 0x3b, 0x5d, 0xe2, 0x41, 0x4e, 0xdc, 0x82, 0x4c, 0xac, 0x84, 0x82, 0xae, 0xa5, 0x7a, 0x3c, 0xe4, 0x13, 0x3f, 0x04, 0x86, 0x81, 0x3e, 0x69, 0x76, 0x93, 0xa1, 0xb8, 0x5d, 0xa2, 0x69, 0xc2, 0x58, 0xa6, 0xbe, 0xdf, 0xee, 0x59, 0x83, 0x33, 0x46, 0x99, 0x2e, 0x30, 0x96, 0x0e, 0xd7, 0x5c, 0xdf, 0x0e, 0x8e, 0x55, 0xd8, 0xbd, 0xf2, 0x12, 0x27, 0x79, 0x00, 0x6b, 0xd7, 0x75, 0x28, 0xdc, 0x07, 0xa3, 0xa6, 0x86, 0xdf, 0xd8, 0x0f, 0x76, 0xc9, 0x2b, 0x2a, 0x2a, 0xdd, 0x9e, 0x02, 0x51, 0x9c, 0x00, 0x39, 0xd3, 0xe2, 0x11, 0x9f, 0x11, 0x16, 0xe8, 0x03, 0x6e, 0xa4, 0x92, 0x4a, 0x0e, 0xad, 0xfc, 0xbe, 0xde, 0xfd, 0x12, 0xa8, 0xd4, 0x3d, 0x29, 0x20, 0x78, 0x69, 0x9a, 0x24, 0xa3, 0x85, 0xb0, 0xe8, 0x86, 0x8c, 0xc5, 0x6d, 0xef, 0xaa, 0xa7, 0x55, 0xc8, 0xaa, 0x41, 0xf6, 0xe0, 0xb2, 0x77, 0xad, 0xef, 0x2e, 0x51, 0x74, 0xd4, 0x0a, 0x5c, 0xb7, 0x20, 0x24, 0x4d, 0x64, 0xd8, 0x01, 0xe8, 0x42, 0x77, 0xbf, 0x20, 0x83, 0x33, 0x4a, 0x80, 0x9c, 0x81, 0xd3, 0xc9, 0x54, 0xdb, 0x7e, 0xdd, 0x1b, 0xc1, 0x5b, 0xdb, 0x9e, 0xfe, 0x98, 0x8c, 0x98, 0x2c, 0xf5, 0xfe, 0xeb, 0x7a, 0x77, 0x6e, 0xef, 0xad, 0x61, 0x6b, 0x0a, 0x65, 0x60, 0x39, 0x81, 0xa2, 0x06, 0x74, 0x8d, 0x86, 0x79, 0xf5, 0xb2, 0x5d, 0x6d, 0xfa, 0x4c, 0xda, 0x4f, 0x80, 0x6b, 0xa3, 0xc3, 0xf4, 0xe0, 0x11, 0x51, 0x0b, 0x98, 0x30, 0x5b, 0xef, 0x29, 0x0e, 0x53, 0x9b, 0xab, 0x32, 0x2b, 0x88, 0xc9, 0x6a, 0x0c, 0x89, 0x17, 0xca, 0x4a, 0xf3, 0xa7, 0xf1, 0x98, 0x02, 0xd7, 0x8e, 0x78, 0x78, 0x6c, 0x23, 0xf6, 0x87, 0xe5, 0x09, 0x96, 0xf1, 0x09, 0xb5, 0x8b, 0x6e, 0xc3, 0x39, 0x29, 0x4e, 0x2f, 0x0d, 0x9d, 0x5f, 0xf5, 0x10, 0xdc, 0x11, 0xd6, 0xca, 0xd9, 0xd8, 0x84, 0xf4, 0xfb, 0xd2, 0xb7, 0x3a, 0xce, 0xaa, 0x7d, 0x3f, 0xf9, 0xbc, 0xd1, 0xe2, 0x70, 0x7a, 0x70, 0xc0, 0xea, 0x0e, 0xe8, 0xf9, 0x96, 0x41, 0xf2, 0x38, 0x09, 0x9b, 0x01, 0xed, 0x7b, 0xcb, 0x1b, 0xdd, 0x34, 0x4a, 0xe8, 0xdd, 0x41, 0x3c, 0x09, 0xda, 0x6b, 0x97, 0xaa, 0x1d, 0x6a, 0x86, 0x5b, 0xcd, 0x55, 0x10, 0x1b, 0xb6, 0x5d, 0xf5, 0xb6, 0x48, 0xbb, 0xd8, 0x52, 0xe3, 0xe7, 0xa3, 0x44, 0x52, 0x0b, 0x28, 0x28, 0x95, 0xb7, 0x04, 0x30, 0xe3, 0xd6, 0xc9, 0xbc, 0xef, 0xe1, 0x5c, 0x2b, 0x6b, 0x52, 0x9b, 0xf1, 0xca, 0x5c, 0x43, 0xea, 0x4b, 0xd9, 0x11, 0xef, 0x33, 0x84, 0x28, 0xa6, 0x59, 0x68, 0xb3, 0x9e, 0xe8, 0x98, 0xcb, 0x9b, 0x61, 0x21, 0x9b, 0x2e, 0xdf, 0x3d, 0xc2, 0x89, 0x9f, 0xc9, 0xf8, 0x92, 0xbf, 0xf9, 0xf5, 0x36, 0x46, 0x4b, 0x8f, 0x00, 0x65, 0xb9, 0x22, 0xea, 0xfd, 0x33, 0x34, 0x73, 0x60, 0x4c, 0x59, 0xf1, 0x5c, 0x34, 0x55, 0x29, 0x76, 0xe6, 0x81, 0x1d, 0x73, 0xa2, 0x70, 0x25, 0x1d, 0x9e, 0xd1, 0x41, 0x43, 0xf9, 0x97, 0xae, 0x02, 0xf0, 0x58, 0xb7, 0x43, 0x54, 0xf3, 0xce, 0x85, 0x3b, 0x76, 0xdb, 0xdd, 0xf7, 0x3f, 0xd4, 0x3a, 0x44, 0x61, 0x8e, 0xee, 0xc5, 0x49, 0xd3, 0x6a, 0xb2, 0xa1, 0xb4, 0x49, 0xcb, 0x74, 0x20, 0x91, 0x90, 0x93, 0xb6, 0x35, 0xb3, 0x38, 0xd8, 0xde, 0xce, 0xea, 0x01, 0xea, 0x52, 0xa0, 0x58, 0xb5, 0xbf, 0x29, 0x85, 0x18, 0x1b, 0xcb, 0xc3, 0x30, 0x9d, 0x2b, 0x36, 0x61, 0xa9, 0x6c, 0x80, 0x9a, 0x01, 0x9b, 0x8f, 0xda, 0x39, 0x4b, 0xb8, 0xf3, 0x6b, 0x7c, 0x0a, 0x8e, 0x2d, 0xc2, 0xdc, 0x6f, 0xc0, 0xa3, 0xa9, 0xfa, 0x8a, 0x40, 0x1e, 0xf6, 0xc6, 0x38, 0x70, 0x92, 0x7b, 0xc9, 0xf3, 0xa5, 0xaa, 0x38, 0xe9, 0x3a, 0xcc, 0x73, 0x97, 0x4c, 0x7c, 0xf6, 0x9f, 0xce, 0x70, 0xeb, 0x89, 0xef, 0xad, 0x95, 0xa3, 0x9b, 0xfb, 0xee, 0x0b, 0x45, 0x97, 0x8f, 0x0a, 0xe4, 0x29, 0xd1, 0xa3, 0x3b, 0xf5, 0x32, 0x6c, 0x5e, 0x55, 0xfa, 0x9d, 0x72, 0x67, 0x1e, 0x67, 0xb4, 0x03, 0x64, 0x87, 0xbd, 0xf0, 0xc8, 0x1a, 0x04, 0x57, 0x1e, 0xb3, 0xa4, 0x77, 0xfa, 0xab, 0x5f, 0x9b, 0xcd, 0xb8, 0xe3, 0x49, 0x50, 0xc1, 0x4d, 0xbd, 0x26, 0xf1, 0xec, 0x96, 0xbd, 0x0b, 0x47, 0xce, 0x75, 0xfd, 0x61, 0xef, 0x04, 0xb7, 0x3b, 0x84, 0x19, 0x3d, 0x9b, 0xce, 0x3f, 0xfb, 0x0c, 0xb9, 0x04, 0x5a, 0x26, 0x0e, 0x5b, 0x90, 0x0f, 0xea, 0x40, 0xbc, 0x42, 0x6f, 0x9a, 0x32, 0x8f, 0xb9, 0x65, 0x13, 0x63, 0x14, 0x10, 0x22, 0x4a, 0x6c, 0x24, 0xd2, 0xb2, 0x05, 0x27, 0xa4, 0xf2, 0x6c, 0xc0, 0xaf, 0x8b, 0xad, 0x1c, 0x80, 0xad, 0xc6, 0x8f, 0x25, 0xfd, 0x5c, 0x7f, 0x85, 0x95, 0xad, 0x7e, 0xf3, 0x4c, 0xc6, 0xb6, 0x02, 0x38, 0xf5, 0x8a, 0x9a, 0x72, 0x82, 0x7a, 0x4b, 0x19, 0x9a, 0x47, 0xe2, 0x9a, 0x8c, 0x58, 0x3a, 0x2e, 0x38, 0x5d, 0x55, 0xa4, 0xc3, 0x32, 0xab, 0x60, 0x90, 0x06, 0xc2, 0xa4, 0x6c, 0xbc, 0xff, 0x0e, 0x09, 0x91, 0xbc, 0x62, 0xae, 0x00, 0x9b, 0x8a, 0x2c, 0xe3, 0x19, 0xdb, 0x14, 0xda, 0x66, 0x9a, 0x27, 0xf0, 0x74, 0xbf, 0x0e, 0x7c, 0x4d, 0xf8, 0x4c, 0x46, 0xab, 0xf1, 0x70, 0xeb, 0xc2, 0xd3, 0x8f, 0x83, 0x61, 0x0b, 0xf1, 0x80, 0x39, 0x4c, 0x0b, 0xd9, 0x7c, 0xd7, 0xad, 0x69, 0xab, 0xfa, 0x7d, 0x92, 0xa9, 0xd6, 0xa4, 0x25, 0x13, 0x66, 0xc7, 0x86, 0xd4, 0xbd, 0x39, 0x0b, 0xf3, 0x8f, 0x6f, 0xa6, 0xb0, 0xf3, 0xb4, 0xc4, 0xd0, 0x67, 0x1d, 0x74, 0x35, 0x15, 0xc0, 0xcc, 0xb1, 0x55, 0x21, 0x88, 0x1c, 0x72, 0xed, 0xf5, 0xa4, 0xb1, 0xeb, 0x0e, 0x65, 0x8f, 0x2f, 0xe4, 0x3a, 0x4b, 0x91, 0x43, 0xd2, 0xa4, 0x5d, 0x92, 0x06, 0xe4, 0x4c, 0xfb, 0x69, 0x1d, 0xb3, 0xcc, 0x21, 0xb3, 0xfb, 0x1d, 0xf6, 0x1a, 0x51, 0xb4, 0xa9, 0xe1, 0x9e, 0x25, 0x87, 0xf0, 0xba, 0x3d, 0x3d, 0x0e, 0xdd, 0xa1, 0xee, 0xa6, 0x56, 0xb3, 0x83, 0xca, 0x7f, 0xb5, 0x43, 0x78, 0xf0, 0x31, 0xa3, 0x1c, 0xf3, 0x98, 0x5f, 0x57, 0x38, 0x29, 0xc9, 0xff, 0xca, 0x14, 0x61, 0x67, 0x42, 0xe0, 0xa7, 0xe0, 0x3b, 0x0a, 0x2d, 0x7f, 0x05, 0xef, 0xf0, 0x21, 0x9e, 0xeb, 0xe8, 0xad, 0xdd, 0xc3, 0xde, 0x99, 0xf1, 0x40, 0x7e, 0xb0, 0x0a, 0x1d, 0xad, 0x12, 0x56, 0x24, 0x1d, 0x7c, 0x2f, 0x93, 0x1e, 0xc9, 0x93, 0xc4, 0xb7, 0xb9, 0xd4, 0x0d, 0xf5, 0xf2, 0x90, 0xe6, 0x83, 0x44, 0xe4, 0x49, 0x7b, 0x31, 0xdd, 0x5f, 0x7c, 0xad, 0x2f, 0x58, 0xfd, 0x22, 0x2a, 0x9a, 0xe0, 0xb7, 0xe9, 0x1f, 0x4a, 0xd2, 0xcd, 0x18, 0xb3, 0xdb, 0x2a, 0xd7, 0x39, 0x44, 0x3f, 0xeb, 0x3a, 0xc6, 0x6c, 0x8d, 0x21, 0xed, 0x9f, 0x3b, 0x80, 0xd6, 0x10, 0xa2, 0x60, 0x38, 0x2e, 0xc1, 0xd5, 0xa1, 0xd8, 0x4c, 0xd5, 0x02, 0xd1, 0x4e, 0x49, 0x6e, 0x6e, 0x13, 0x65, 0x1f, 0x92, 0x45, 0x35, 0xba, 0xdc, 0x55, 0x79, 0xd3, 0x1f, 0x1c, 0xb3, 0xb4, 0x13, 0xc3, 0x7e, 0x5a, 0x4a, 0xe0, 0x21, 0xc1, 0x65, 0xe1, 0x64, 0x62, 0x87, 0xae, 0xa3, 0xf9, 0x0a, 0x8a, 0x20, 0x8b, 0x71, 0x3a, 0x9d, 0xa8, 0x9e, 0x6a, 0x2b, 0xee, 0x46, 0x4c, 0x3d, 0xce, 0xa1, 0x82, 0x00, 0x93, 0x66, 0x3e, 0xef, 0x9f, 0xf6, 0xa8, 0xa2, 0xf8, 0xd7, 0x80, 0xe6, 0x04, 0x65, 0x04, 0x13, 0x91, 0xc4, 0x14, 0x9a, 0x18, 0x19, 0x94, 0xde, 0x43, 0xfa, 0x12, 0x45, 0xac, 0x23, 0xa8, 0x8e, 0xe8, 0x6a, 0x24, 0x65, 0xc4, 0xf5, 0x67, 0x34, 0xce, 0xaa, 0x0b, 0x3d, 0x18, 0xe7, 0x49, 0xe6, 0x38, 0x73, 0x19, 0x53, 0x93, 0xb5, 0x9a, 0x3a, 0xdc, 0x24, 0xb5, 0xf3, 0xd7, 0xff, 0xfd, 0xcf, 0x63, 0x3e, 0xda, 0xab, 0xb7, 0xc8, 0xe7, 0xc5, 0xec, 0xe6, 0x98, 0xce, 0xbc, 0xf8, 0x20, 0x40, 0x89, 0x67, 0x92, 0xf1, 0xa0, 0xda, 0x46, 0xe9, 0xc0, 0xad, 0x7e, 0x70, 0xd6, 0x9f, 0x49, 0x6c, 0x0b, 0xca, 0xa8, 0xea, 0x00, 0xd9, 0xf0, 0xfb, 0x58, 0x75, 0x6f, 0xc1, 0x78, 0x00, 0x52, 0xc9, 0x8a, 0x86, 0xc6, 0x9b, 0xc8, 0xf0, 0x5e, 0x90, 0xf7, 0x7b, 0xb5, 0xe4, 0x31, 0x69, 0x54, 0x0c, 0xe8, 0xf7, 0xd6, 0x4a, 0x28, 0x8e, 0x4a, 0x7e, 0x1c, 0x3d, 0xd8, 0x3f, 0xd4, 0x67, 0xa8, 0x2a, 0x45, 0xb9, 0xff, 0x7a, 0x92, 0x5f, 0xab, 0xda, 0x8a ],
+    const [ 0xdf, 0x75, 0x3c, 0x3c, 0x6e, 0xb6, 0xf4, 0xe3, 0x4d, 0xde, 0x6e, 0xe5, 0x38, 0x8b, 0x5b, 0x81, 0x81, 0x96, 0xc4, 0xe7, 0xa9, 0x51, 0x43, 0x9e, 0x2d, 0x0d, 0x72, 0x23, 0xa2, 0xe0, 0xa4, 0xd3, 0x04, 0xa5, 0xd3, 0x0a, 0x4c, 0x43, 0xda, 0x8d, 0x40, 0x33, 0xe4, 0x25, 0x8f, 0x3c, 0x25, 0x8d, 0x1d, 0x81, 0xc8, 0x8e, 0x9c, 0xbe, 0x28, 0x69, 0x5c, 0xcf, 0x42, 0x75, 0x64, 0x72, 0x6b, 0x09, 0xc1, 0x4d, 0x3e, 0x9c, 0x1e, 0x33, 0xd9, 0x2b, 0x95, 0xa3, 0x49, 0xdc, 0xc5, 0x91, 0x42, 0xe0, 0x25, 0x69, 0x13, 0x9d, 0x97, 0x52, 0xda, 0x0d, 0x41, 0xb0, 0xf4, 0x61, 0x98, 0xec, 0xb8, 0xeb, 0xbd, 0x77, 0x65, 0x3a, 0x0d, 0x0c, 0x58, 0x87, 0xf4, 0x36, 0x83, 0x50, 0x01, 0x13, 0x1a, 0x42, 0x40, 0x57, 0x8f, 0x5c, 0xc4, 0x93, 0xc1, 0x52, 0x83, 0xb8, 0x71, 0x2f, 0x67, 0xd7, 0xf5, 0x3f, 0xa1, 0x2a, 0x30, 0x2c, 0x41, 0x58, 0xc1, 0x67, 0x03, 0xf5, 0x7b, 0xc9, 0x6c, 0x48, 0x15, 0x7b, 0x16, 0x52, 0x23, 0x13, 0x49, 0x0b, 0x45, 0xff, 0xca, 0xef, 0x9f, 0x27, 0xf8, 0xb9, 0x89, 0xce, 0x14, 0x6f, 0x87, 0xb9, 0xe1, 0x9e, 0x7b, 0x94, 0x6d, 0xe7, 0x19, 0x91, 0x2e, 0xba, 0x9c, 0x52, 0x50, 0x62, 0xb7, 0x09, 0x4e, 0x42, 0xcf, 0xde, 0xc0, 0x5e, 0x67, 0x91, 0x74, 0x1d, 0xdc, 0x60, 0xbf, 0x4d, 0x52, 0x2b, 0x15, 0x67, 0xee, 0xd6, 0xd8, 0x14, 0x46, 0xef, 0x6e, 0xf1, 0x15, 0x90, 0x96, 0x8f, 0x34, 0x87, 0xfc, 0xbf, 0xc5, 0xb5, 0x0b, 0x0c, 0xb1, 0xb4, 0x02, 0x88, 0x56, 0xbd, 0x4a, 0xcc, 0x79, 0xc8, 0x07, 0x3a, 0x82, 0xf4, 0xed, 0x85, 0xe8, 0x2a, 0x54, 0x74, 0xea, 0xfd, 0x8f, 0xe2, 0x80, 0xd5, 0x7a, 0x0a, 0x91, 0x4d, 0x53, 0x01, 0x66, 0xd9, 0xcb, 0x84, 0x5f, 0xac, 0x5c, 0xf4, 0xe4, 0xd9, 0xdc, 0x9f, 0x9f, 0xb8, 0x53, 0x41, 0xe8, 0x8b, 0x0a, 0xcb, 0x81, 0x61, 0xe4, 0x62, 0x84, 0x3b, 0xf1, 0xab, 0x99, 0x6e, 0x41, 0x46, 0x6c, 0x48, 0xf6, 0x98, 0x5f, 0xf6, 0x9d, 0xce, 0x7c, 0xa5, 0xbf, 0x1e, 0xad, 0xe8, 0xb2, 0x50, 0x2f, 0x5a, 0xb5, 0x7e, 0x44, 0x84, 0x3d, 0x18, 0x28, 0x01, 0x89, 0x2a, 0x47, 0xdf, 0x7c, 0xe2, 0xad, 0x49, 0xac, 0x4d, 0xbe, 0x63, 0xb7, 0x61, 0x27, 0x76, 0xd6, 0x40, 0x14, 0x4d, 0xb4, 0xbb, 0xa4, 0xdf, 0x80, 0x15, 0x99, 0x2e, 0x40, 0x0a, 0x55, 0x6e, 0x69, 0x10, 0x02, 0x6a, 0xad, 0xdd, 0x10, 0x24, 0x15, 0x29, 0xe4, 0xbb, 0x4f, 0xb5, 0xce, 0x92, 0x49, 0x8c, 0x3c, 0xaf, 0xff, 0x89, 0x2e, 0x61, 0x91, 0x19, 0xea, 0x26, 0x98, 0x42, 0xf1, 0xcb, 0xba, 0xe5, 0x31, 0xd5, 0x7c, 0x40, 0x7c, 0x20, 0x58, 0xb6, 0x39, 0xc6, 0x10, 0xd3, 0x5a, 0x42, 0x41, 0x8b, 0x8e, 0xd6, 0x3b, 0xc2, 0xb7, 0x2a, 0x10, 0x12, 0x9e, 0x35, 0xeb, 0xc8, 0xe5, 0x60, 0xa3, 0x2f, 0x3e, 0xe9, 0x90, 0x12, 0xdb, 0x86, 0x9e, 0x7c, 0x26, 0x4c, 0x9f, 0xc2, 0xb1, 0xce, 0xe6, 0xc3, 0x70, 0x89, 0x11, 0x6f, 0x26, 0x80, 0x26, 0x86, 0x1d, 0x23, 0xe2, 0xa2, 0x1a, 0x75, 0x4d, 0x78, 0x90, 0x6e, 0x92, 0x5b, 0x14, 0x9e, 0x0e, 0x02, 0x11, 0x14, 0xa7, 0x8a, 0xbd, 0x7e, 0x5f, 0xbe, 0x4b, 0x92, 0x28, 0x97, 0x63, 0xac, 0xfb, 0xff, 0xcf, 0xb8, 0x24, 0xda, 0x77, 0x52, 0xe0, 0x47, 0x8f, 0x2c, 0x29, 0x23, 0x0f, 0xb0, 0xd1, 0xd0, 0x63, 0xe7, 0xce, 0x34, 0x64, 0x9a, 0xd5, 0x04, 0x88, 0xb7, 0x2a, 0x42, 0x55, 0xf5, 0xb6, 0x04, 0x1c, 0xbb, 0x5a, 0x78, 0xe3, 0x3f, 0x83, 0x25, 0xa3, 0xeb, 0xfe, 0x73, 0xb4, 0x04, 0x0e, 0x6e, 0x85, 0x8d, 0xbc, 0xc7, 0x90, 0x69, 0x6f, 0x1b, 0x8d, 0xc1, 0xbc, 0x78, 0xe6, 0xa5, 0x7f, 0x1e, 0x6c, 0xf6, 0x2b, 0x82, 0x48, 0x83, 0x5e, 0x99, 0x34, 0x72, 0xb9, 0x52, 0xeb, 0xe2, 0xee, 0x65, 0xdd, 0xce, 0x1a, 0x4b, 0x28, 0x34, 0x56, 0x8d, 0xc4, 0x77, 0x88, 0x42, 0xfd, 0x03, 0x80, 0xd3, 0x27, 0x2f, 0x40, 0x02, 0x8d, 0x67, 0x9a, 0x2b, 0xaa, 0x8a, 0x01, 0xc9, 0x9c, 0x91, 0x99, 0x3b, 0xd5, 0x72, 0x90, 0xc9, 0x14, 0x43, 0xb1, 0xe2, 0x93, 0xa3, 0x36, 0xa7, 0x82, 0x56, 0xde, 0xae, 0xb5, 0x2f, 0x40, 0xff, 0x9a, 0x33, 0x5f, 0x63, 0x6d, 0xfb, 0x7e, 0xdf, 0xaf, 0x5a, 0x36, 0x7b, 0xd4, 0x40, 0xc5, 0x47, 0x3c, 0xde, 0xa9, 0xa0, 0x64, 0x0b, 0x6e, 0xb0, 0x5e, 0xe7, 0xc4, 0x34, 0x7e, 0xbe, 0xd4, 0x82, 0x57, 0x2f, 0xd4, 0xca, 0xe5, 0x8d, 0xd9, 0x9c, 0x0c, 0x85, 0xed, 0xaa, 0x41, 0x01, 0x62, 0xd0, 0x88, 0x4d, 0x66, 0x51, 0x9e, 0x78, 0xd7, 0x64, 0x77, 0xfe, 0x58, 0xef, 0xeb, 0xa3, 0xa4, 0x92, 0xac, 0xa2, 0x22, 0xe7, 0x7b, 0x07, 0xba, 0x08, 0x9b, 0x5a, 0xe8, 0x52, 0x86, 0x7d, 0x0e, 0x69, 0xe0, 0xd7, 0x0f, 0x7c, 0xa9, 0xb3, 0x19, 0xcb, 0xb6, 0xe2, 0xc2, 0x66, 0x62, 0xa8, 0x57, 0x37, 0x81, 0xd6, 0x70, 0x42, 0x95, 0x33, 0xc8, 0x2c, 0x45, 0x20, 0x4c, 0xfa, 0x0a, 0x7c, 0x72, 0x1c, 0x2c, 0xc6, 0xcc, 0xaa, 0xed, 0x81, 0xdd, 0xed, 0x03, 0xdd, 0x2b, 0x21, 0x4c, 0x93, 0x95, 0x79, 0xbe, 0x11, 0xe7, 0x64, 0x9d, 0xd7, 0xac, 0x0f, 0xf0, 0x21, 0x44, 0x2b, 0x35, 0xc6, 0x36, 0xf0, 0x54, 0x60, 0xc7, 0x62, 0xd2, 0xad, 0xcb, 0xd3, 0x47, 0x35, 0xbb, 0xa9, 0x12, 0x2d, 0x08, 0x61, 0x4b, 0x9c, 0xaf, 0xd4, 0xf9, 0xbc, 0x0e, 0xb9, 0x85, 0xa3, 0xf5, 0x6c, 0x6f, 0x22, 0x01, 0xee, 0x40, 0xee, 0x25, 0x2c, 0xc0, 0xfd, 0x8a, 0x84, 0x68, 0x33, 0x99, 0x85, 0x1a, 0x3e, 0x56, 0xf6, 0x10, 0xbf, 0xef, 0x1a, 0x13, 0xaa, 0x94, 0x33, 0xed, 0xef, 0x8a, 0x45, 0x20, 0x5a, 0x7b, 0x1c, 0xd8, 0xb7, 0x11, 0x90, 0x1f, 0x3b, 0xc3, 0x08, 0x50, 0x1f, 0xee, 0x3d, 0xce, 0x8e, 0x27, 0x41, 0xf5, 0xc1, 0xd0, 0xbf, 0x51, 0x69, 0xe9, 0x84, 0x0e, 0x4d, 0x29, 0x3e, 0xb0, 0x34, 0x4d, 0x84, 0x05, 0x05, 0xb1, 0x17, 0x57, 0x2d, 0x1d, 0x68, 0xe5, 0x41, 0xe1, 0x5a, 0x95, 0xe4, 0x24, 0x48, 0xe3, 0xec, 0x79, 0x4a, 0x1d, 0xc0, 0xb3, 0xb4, 0xd2, 0x04, 0xfb, 0xe0, 0x88, 0x79, 0x1f, 0x2e, 0xad, 0x1e, 0x2d, 0x48, 0xd0, 0x9c, 0x41, 0xab, 0x11, 0xe0, 0x9b, 0x63, 0xd6, 0x0a, 0xf4, 0x15, 0xc0, 0x86, 0x12, 0x43, 0xde, 0x78, 0x9b, 0xcc, 0x20, 0x5e, 0x27, 0xb2, 0x0e, 0xf1, 0x98, 0x20, 0xb9, 0x4b, 0xae, 0xac, 0xf2, 0x4f, 0xd6, 0xd9, 0xbb, 0x46, 0x43, 0xe0, 0xfb, 0xc6, 0x40, 0xb0, 0x76, 0xd8, 0xc5, 0x33, 0xfb, 0x59, 0x48, 0xd3, 0xdf, 0xa1, 0xd5, 0x3d, 0xab, 0x63, 0x61, 0x64, 0x12, 0xd4, 0x5c, 0xc9, 0x26, 0x10, 0x85, 0xfb, 0xcb, 0xb9, 0x02, 0x59, 0x6b, 0xe1, 0xb0, 0x1f, 0xeb, 0x2a, 0xb8, 0xa1, 0xde, 0x2b, 0x63, 0xd1, 0xf9, 0x16, 0x2f, 0x07, 0xc7, 0x98, 0x22, 0x02, 0x9e, 0x01, 0x5e, 0x2a, 0xd2, 0xa5, 0xf6, 0x17, 0x28, 0x82, 0x00, 0x57, 0x8e, 0x23, 0xeb, 0x6c, 0x09, 0xc4, 0x13, 0x15, 0xee, 0xb6, 0x93, 0xcf, 0x55, 0x05, 0x5a, 0x9a, 0xcb, 0x59, 0x82, 0x00, 0x47, 0x1a, 0xdd, 0x54, 0x60, 0xd7, 0xd0, 0x38, 0xbc, 0xe9, 0x64, 0x61, 0xcc, 0x53, 0x9a, 0x9f, 0xb6, 0xed, 0xff, 0x17, 0x93, 0xc2, 0x81, 0xd3, 0xdb, 0xb6, 0x81, 0x7e, 0x1d, 0x6c, 0x29, 0x68, 0xf4, 0x66, 0x00, 0xd1, 0x36, 0x6e, 0xbb, 0x63, 0x6e, 0x35, 0x57, 0x00, 0x8d, 0x3b, 0x64, 0xbe, 0xdc, 0xee, 0xa4, 0x30, 0x35, 0x16, 0xd4, 0xe8, 0x73, 0x70, 0xca, 0x39, 0x27, 0x99, 0xc0, 0x42, 0x8d, 0x2e, 0xf0, 0x27, 0xbe, 0x32, 0x61, 0xa2, 0x26, 0xb0, 0x00, 0xbb, 0x39, 0xa1, 0xf2, 0xd3, 0x62, 0x0f, 0x29, 0xe7, 0x3c, 0x7b, 0x35, 0x13, 0x05, 0x7d, 0x5d, 0x55, 0x50, 0xaa, 0xef, 0x94, 0xf9, 0xba, 0xd4, 0xe1, 0x5e, 0xeb, 0x67, 0xfc, 0xcc, 0xa0, 0x88, 0x1a, 0x38, 0x4e, 0xeb, 0xe5, 0x30, 0x98, 0xb6, 0xc5, 0x11, 0xb9, 0x4c, 0x5e, 0x79, 0x23, 0x63, 0x5a, 0xff, 0x65, 0x5d, 0x68, 0x22, 0x52, 0xd5, 0x84, 0x80, 0x60, 0x78, 0x7a, 0x49, 0x4e, 0x16, 0xa5, 0xf2, 0x0a, 0xf8, 0xfd, 0x2e, 0xd1, 0x75, 0x51, 0x1a, 0x98, 0xc0, 0xd0, 0xb7, 0xab, 0x04, 0xce, 0x9e, 0x94, 0xb3, 0xc5, 0xef, 0x3e, 0x1b, 0x9a, 0x8b, 0x5a, 0x3a, 0x22, 0x83, 0x02, 0xd3, 0xe5, 0xd0, 0x9c, 0xc1, 0x22, 0x44, 0x02, 0x8c, 0x13, 0xc0, 0xe0, 0x3a, 0x71, 0xa8, 0x5d, 0x67, 0x3b, 0x94, 0xfd, 0x98, 0xb4, 0x48, 0xc5, 0xcd, 0xab, 0xe7, 0xa1, 0x55, 0xfe, 0x63, 0x04, 0xe6, 0x61, 0x38, 0xce, 0xed, 0x5c, 0x5a, 0x72, 0x23, 0x93, 0x6b, 0x58, 0x61, 0x4a, 0x32, 0x80, 0xb5, 0x28, 0x49, 0x69, 0xb5, 0x3b, 0x15, 0x31, 0x13, 0x3d, 0xfb, 0xfd, 0x72, 0x16, 0xd1, 0x9b, 0x78, 0xa1, 0x93, 0x66, 0x25, 0xb3, 0x58, 0x6a, 0x63, 0x5a, 0x84, 0xc9, 0xde, 0x62, 0x3e, 0x5e, 0x15, 0x1e, 0x25, 0x9f, 0xb2, 0x65, 0x3e, 0xc8, 0x16, 0xda, 0x31, 0x36, 0x39, 0x70, 0xb6, 0x10, 0xb1, 0x2e, 0x4a, 0x2d, 0x10, 0x30, 0x26, 0x32, 0x73, 0xef, 0x71, 0xfb, 0x58, 0xc2, 0xb5, 0x3d, 0xb0, 0xa4, 0x90, 0x69, 0x36, 0x37, 0xac, 0xd3, 0xfe, 0x09, 0xf0, 0x13, 0x51, 0x16, 0xf8, 0xab, 0xb8, 0x8f, 0xc3, 0xeb, 0x57, 0xda, 0xac, 0x12, 0x7c, 0xda, 0x9c, 0xb6, 0x78, 0x70, 0x7d, 0x66, 0xae, 0x42, 0xf2, 0x8d, 0xe9, 0xbb, 0x45, 0x99, 0xf3, 0x53, 0xa1, 0x5d, 0x63, 0x10, 0x81, 0xb4, 0xb6, 0x4c, 0x68, 0x68, 0xa1, 0xba, 0xd3, 0x52, 0xa6, 0xa4, 0x6b, 0xc2, 0xe6, 0x76, 0x80, 0x21, 0x36, 0x80, 0xb3, 0xd4, 0x74, 0xf8, 0xf2, 0x64, 0x1c, 0x3e, 0xaa, 0xdc, 0x16, 0x64, 0x37, 0x73, 0xd2, 0xee, 0xa0, 0x6b, 0x97, 0xd6, 0x81, 0x39, 0x18, 0xd4, 0x48, 0xe6, 0x49, 0xdc, 0xa4, 0xb5, 0x70, 0xe7, 0x3b, 0x06, 0x7f, 0xf6, 0x9c, 0x7a, 0xa1, 0x54, 0x74, 0x58, 0x13, 0x1c, 0x04, 0x30, 0x35, 0xfc, 0xd2, 0xbe, 0xe1, 0x38, 0x9f, 0x10, 0xfb, 0xf2, 0x9a, 0xeb, 0x49, 0xa8, 0xd3, 0x6c, 0x85, 0xfe, 0xf2, 0xeb, 0xb1, 0xbe, 0x29, 0x24, 0xab, 0x1d, 0x67, 0x99, 0x01, 0x40, 0xcf, 0x32, 0x06, 0xfe, 0x68, 0x27, 0x26, 0xe8, 0x16, 0x1f, 0x76, 0x86, 0xc9, 0x9a, 0x8f, 0xe4, 0xf4, 0x8c, 0x9d, 0x4d, 0x41, 0x4a, 0xb3, 0x57, 0x83, 0xaa, 0x62, 0x20, 0xeb, 0x66, 0x89, 0xd6, 0x80, 0xc2, 0x6e, 0x7d, 0xc9, 0x6f, 0x0e, 0xec, 0xcc, 0xae, 0xb2, 0x19, 0x3d, 0xb9, 0xc3, 0x97, 0xef, 0x5e, 0xdf, 0x5d, 0x8e, 0xed, 0x2c, 0xc9, 0x90, 0x54, 0xed, 0xe5, 0x69, 0x89, 0x53, 0xe8, 0xfe, 0x28, 0x95, 0x00, 0x5d, 0x5e, 0x43, 0x4e, 0xab, 0x05, 0xd7, 0x32, 0x5d, 0x10, 0x8d, 0xca, 0xac, 0x2a, 0x74, 0xb5, 0x42, 0x9a, 0xc5, 0x1d, 0x3a, 0x6a, 0x74, 0xf4, 0x47, 0xc8, 0x06, 0x7d, 0x33, 0xac, 0xa2, 0x0f, 0x8c, 0xbb, 0x6a, 0x16, 0x9a, 0x6c, 0x0c, 0x5a, 0x93, 0x69, 0x93, 0x84, 0x12, 0x38, 0x84, 0xde, 0xc6, 0x1a, 0x26, 0x5a, 0x67, 0x33, 0x21, 0xd6, 0xef, 0xec, 0x4a, 0x9e, 0x06, 0x96, 0xbe, 0x32, 0xbe, 0x50, 0x2e, 0x4a, 0x80, 0x2a, 0x79, 0x18, 0x47, 0x8a, 0x80, 0xcd, 0x0b, 0xcf, 0x36, 0x5e, 0x81, 0x35, 0xf6, 0x88, 0x01, 0xf8, 0x1a, 0x12, 0xc7, 0xbd, 0xc9, 0x52, 0x5f, 0x2d, 0x10, 0xf2, 0x5b, 0xe3, 0x34, 0xf4, 0x47, 0x88, 0x47, 0xf4, 0xdf, 0x3c, 0xfa, 0xad, 0x7f, 0x38, 0xb2, 0xbf, 0xda, 0xb2, 0xde, 0xb0, 0xef, 0x01, 0x87, 0x30, 0x39, 0x02, 0x28, 0xa1, 0x26, 0xba, 0xc1, 0xd6, 0xcb, 0x3d, 0x27, 0x1b, 0xd6, 0xce, 0x9e, 0x76, 0xc4, 0x47, 0xa9, 0x2d, 0x54, 0xbc, 0x21, 0x88, 0x3b, 0x5b, 0x85, 0xd8, 0x19, 0x96, 0x91, 0xb8, 0xac, 0x85, 0x12, 0x93, 0x43, 0x85, 0xf8, 0x67, 0x76, 0x26, 0xad, 0xc8, 0x15, 0x44, 0xa5, 0x27, 0x5e, 0x73, 0x37, 0x54, 0x73, 0xa1, 0xab, 0x42, 0x0b, 0xf6, 0x94, 0x0b, 0x67, 0xff, 0x60, 0x33, 0x88, 0x0c, 0x2d, 0x31, 0x9f, 0xd6, 0xde, 0x2b, 0xc5, 0x65, 0x6e, 0x02, 0xec, 0x31, 0x85, 0x8e, 0x15, 0x88, 0x49, 0x2b, 0xc4, 0x2f, 0x77, 0x74, 0xb1, 0x4c, 0xb2, 0x4e, 0xc1, 0x83, 0x1b, 0x29, 0x34, 0x60, 0x21, 0x82, 0x20, 0xf5, 0x9b, 0xac, 0x1e, 0xc4, 0x14, 0xd1, 0x43, 0xdf, 0x65, 0x34, 0x52, 0x4d, 0x8a, 0xb8, 0x2f, 0xb0, 0xae, 0xa6, 0x97, 0x25, 0x88, 0xab, 0x0f, 0x6c, 0xea, 0x20, 0x1a, 0x49, 0x97, 0x8e, 0xaf, 0x29, 0x56, 0x72, 0xea, 0x09, 0x44, 0x3d, 0x02, 0x94, 0x6e, 0x9f, 0x7b, 0x8b, 0x9f, 0x05, 0x9d, 0x6a, 0x77, 0x61, 0x24, 0x49, 0xbd, 0x29, 0x39, 0x00, 0xf6, 0xa2, 0xa1, 0x8e, 0x37, 0x5e, 0x35, 0xbc, 0x37, 0x03, 0x92, 0xfd, 0xa8, 0x4f, 0x11, 0x99, 0xc8, 0x59, 0xfa, 0x0a, 0x33, 0x1a, 0xf4, 0xa6, 0xfb, 0x2b, 0xc0, 0x7f, 0xfa, 0xd0, 0x27, 0x88, 0x67, 0x36, 0x31, 0xf9, 0xa8, 0xf9, 0x98, 0xf4, 0x67, 0xe9, 0x7c, 0x68, 0xe8, 0x0e, 0x58, 0x36, 0x9a, 0xea, 0x35, 0x92, 0xec, 0xfd, 0x1e, 0xac, 0x61, 0x8f, 0xd3, 0x90, 0xe7, 0xa9, 0xc2, 0x4b, 0x65, 0x65, 0x32, 0x50, 0x93, 0x67, 0xc2, 0x1a, 0x0e, 0xac, 0x12, 0x12, 0xac, 0x83, 0xc0, 0xb2, 0x0c, 0xd8, 0x96, 0xeb, 0x72, 0xb8, 0x01, 0xc4, 0xd2, 0x12, 0xc5, 0x45, 0x2b, 0xbb, 0xf0, 0x93, 0x17, 0xb5, 0x0c, 0x5c, 0x9f, 0xb1, 0x99, 0x75, 0x53, 0xd2, 0xbb, 0xc2, 0x9b, 0xb4, 0x2f, 0x57, 0x48, 0xad, 0x83, 0xdc, 0x6e, 0x53, 0x87, 0x36, 0x76, 0x3e, 0xff, 0x64, 0x6f, 0x0f, 0x9a, 0xa6, 0xa5, 0xb0, 0x28, 0xe5, 0x75, 0xde, 0x07, 0x4f, 0x5f, 0xe5, 0xde, 0x42, 0x5d, 0xab, 0x8e, 0x6b, 0x73, 0xf0, 0x66, 0x2f, 0x88, 0xd4, 0x97, 0x49, 0x74, 0x9a, 0xe7, 0xb5, 0x5a, 0xab, 0xa9, 0xcd, 0x38, 0xde, 0xec, 0xb3, 0xbc, 0xf6, 0xf3, 0xee, 0x5a, 0x6d, 0xe5, 0x58, 0x9b, 0x70, 0xc6, 0x37, 0xb8, 0x2a, 0xa6, 0xaa, 0x67, 0x45, 0x18, 0x47, 0xf5, 0xae, 0xe6, 0x02, 0x95, 0x99, 0x03, 0x50, 0xf8, 0xc6, 0xc1, 0x8d, 0x1d, 0x02, 0x44, 0x9b, 0x6b, 0xf0, 0x37, 0xcd, 0xfd, 0x09, 0xbd, 0x03, 0x3d, 0xe2, 0xab, 0x16, 0xb4, 0xad, 0xf4, 0x76, 0x20, 0x03, 0x65, 0x11, 0xc7, 0xe1, 0x92, 0x77, 0x0c, 0xf0, 0x10, 0x3c, 0x40, 0x09, 0xe4, 0x9e, 0xba, 0xf8, 0x3c, 0x68, 0x2a, 0x80, 0x5d, 0x17, 0x2a, 0xa0, 0xdd, 0x3a, 0x16, 0x15, 0x12, 0x1f, 0x1e, 0x20, 0xca, 0xab, 0x99, 0x89, 0x3c, 0x8a, 0x9c, 0xe4, 0x3f, 0x89, 0xcc, 0x13, 0xba, 0x3f, 0x70, 0x0c, 0x5c, 0xf3, 0xcb, 0xdd, 0x8d, 0xba, 0xa8, 0xed, 0xa4, 0xe0, 0x36, 0x84, 0x5a, 0x89, 0x16, 0x8d, 0x7e, 0x98, 0xb3, 0x9b, 0xeb, 0xd0, 0xd2, 0x2b, 0xb8, 0x39, 0x6a, 0x29, 0xae, 0xc6, 0xb5, 0xb5, 0xff, 0x34, 0x87, 0x26, 0x34, 0x35, 0xdf, 0x4f, 0x68, 0xce, 0xbb, 0x02, 0xb4, 0xfe, 0x31, 0xd3, 0xea, 0xa0, 0xbc, 0x1e, 0x86, 0x92, 0xd4, 0x4c, 0xe1, 0x17, 0xc1, 0x51, 0xa8, 0x7a, 0xb0, 0x79, 0x8d, 0xf5, 0x07, 0x65, 0x3c, 0xd0, 0xf6, 0x50, 0x91, 0xcd, 0x4e, 0x98, 0x08, 0xc4, 0x97, 0x79, 0x75, 0x8b, 0x5d, 0x1b, 0xf5, 0x18, 0xca, 0xcf, 0x24, 0xea, 0x7a, 0x95, 0x90, 0xa5, 0x8a, 0xe3, 0x6e, 0xfc, 0xf2, 0xa1, 0x8c, 0xd3, 0x15, 0x78, 0x87, 0xa5, 0x97, 0x4c, 0x3e, 0x24, 0x6f, 0x07, 0x86, 0x20, 0x3d, 0x99, 0x20, 0xaa, 0xdd, 0x3d, 0xe8, 0x79, 0x3c, 0xfd, 0x4e, 0x8d, 0x6a, 0x78, 0x0a, 0x11, 0xf1, 0xe3, 0x0c, 0x86, 0x66, 0x4e, 0xb2, 0x1e, 0x3d, 0x28, 0x3e, 0x66, 0xe1, 0x06, 0x87, 0x28, 0x05, 0xa0, 0xef, 0x90, 0x34, 0x1c, 0x94, 0x8d, 0xb0, 0x90, 0xcb, 0x7a, 0x79, 0xc2, 0xca, 0xfe, 0xac, 0x32, 0xa4, 0x31, 0x0e, 0x5a, 0x7b, 0x00, 0xe9, 0x34, 0xf0, 0xd2, 0x17, 0xfd, 0xdf, 0x6c, 0x5c, 0x39, 0x4a, 0x11, 0xf9, 0xf7, 0x92, 0xee, 0x7d, 0x56, 0xed, 0xb6, 0xdf, 0x48, 0x14, 0x8a, 0xca, 0x96, 0x3c, 0x1b, 0x38, 0x24, 0x48, 0x12, 0x42, 0x77, 0x3d, 0xb0, 0x36, 0x74, 0xf6, 0xb1, 0xeb, 0x6a, 0x19, 0x77, 0x51, 0x53, 0x49, 0x64, 0x4c, 0x57, 0x9d, 0x88, 0xc3, 0x92, 0x51, 0x7c, 0xf4, 0x17, 0xbc, 0x8d, 0x0a, 0x35, 0x82, 0x1d, 0xf1, 0xf9, 0x0b, 0x47, 0x69, 0xf3, 0x34, 0xc2, 0x59, 0x3d, 0x44, 0x08, 0x66, 0xba, 0x21, 0xb7, 0xc5, 0x9c, 0xc4, 0x37, 0x4d, 0x29, 0xea, 0x9d, 0xd1, 0xbe, 0x0c, 0xcf, 0xac, 0x14, 0x92, 0xe9, 0x9d, 0xc2, 0x44, 0xe0, 0xd6, 0x03, 0x01, 0x66, 0x4f, 0xba, 0xb3, 0x0d, 0x60, 0xb3, 0x82, 0xae, 0x8f, 0x2c, 0x48, 0x0c, 0xa7, 0x94, 0x45, 0xb5, 0x0a, 0x92, 0x15, 0x29, 0x47, 0x49, 0xde, 0x3e, 0xef, 0xdb, 0xce, 0xc3, 0xa5, 0x2b, 0xc5, 0x64, 0x75, 0xe8, 0x4e, 0xcd, 0x67, 0xc7, 0xd4, 0x13, 0x53, 0x0f, 0x13, 0x4f, 0xf6, 0x5b, 0xcc, 0x8c, 0x46, 0x9b, 0xbd, 0xe3, 0x03, 0x5d, 0xd0, 0xe4, 0x8f, 0x4b, 0x93, 0x38, 0xff, 0xf4, 0xe8, 0x85, 0x72, 0xcf, 0xfe, 0x92, 0xa1, 0x7c, 0x7f, 0xac, 0xb8, 0x4e, 0x0b, 0x48, 0x65, 0x07, 0xe6, 0xe9, 0x2e, 0xe2, 0xed, 0x44, 0x07, 0xd7, 0xcf, 0xa2, 0x24, 0x1a, 0x79, 0x87, 0x0c, 0xe5, 0xd2, 0x91, 0xef, 0x77, 0xa9, 0xa2, 0x39, 0x5d, 0xeb, 0x42, 0x67, 0xf0, 0x1a, 0x3e, 0x19, 0x1f, 0xfa, 0x95, 0x69, 0x6e, 0x8e, 0x95, 0x7c, 0x3f, 0x42, 0x42, 0x56, 0x50, 0x6a, 0xf7, 0xf3, 0x86, 0xeb, 0x50, 0x93, 0xe9, 0x38, 0x46, 0x55, 0xef, 0x81, 0x9c, 0x07, 0xfd, 0x27, 0x7b, 0x3d, 0x2b, 0x72, 0x59, 0xa0, 0x48, 0x86, 0x1f, 0x89, 0x1e, 0x93, 0x8a, 0xcf, 0xf6, 0x4d, 0xd1, 0xdd, 0x5f, 0x9c, 0x89, 0x07, 0x2c, 0x94, 0xc6, 0x1e, 0xbc, 0xa7, 0x84, 0x41, 0x7e, 0x19, 0x45, 0xf7, 0xb3, 0xb5, 0xfb, 0x7b, 0x76, 0xbf, 0x27, 0x57, 0xfa, 0x29, 0x43, 0x34, 0x14, 0x09, 0x5e, 0xf1, 0xf9, 0x4b, 0x06, 0xf2, 0x48, 0xa3, 0x6a, 0xbb, 0x4b, 0xc6, 0xc0, 0xbd, 0x7a, 0xda, 0xe5, 0x6f, 0x40, 0x2b, 0x43, 0xa1, 0x02, 0x1f, 0xf8, 0x0e, 0x5e, 0x6c, 0x35, 0x30, 0xb0, 0x88, 0xe3, 0x58, 0xdb, 0x62, 0x8d, 0xfd, 0x46, 0x4f, 0x7a, 0x54, 0x24, 0x47, 0x19, 0x22, 0xf9, 0x51, 0xa3, 0xcf, 0x59, 0x3c, 0xfb, 0xbb, 0xf3, 0x90, 0xd9, 0xd5, 0xcf, 0xc4, 0x27, 0x69, 0xd4, 0xb1, 0xab, 0x39, 0x8d, 0x47, 0xe7, 0xd0, 0x2d, 0x7f, 0x3d, 0x13, 0xd0, 0x90, 0x57, 0x19, 0x03, 0x66, 0xc6, 0x3c, 0x87, 0x50, 0xe9, 0x70, 0x52, 0xf9, 0x11, 0xd4, 0xd7, 0x99, 0xe2, 0x87, 0x87, 0x6c, 0xfd, 0xbd, 0x98, 0x64, 0xdc, 0x12, 0x05, 0x1b, 0xfc, 0x1e, 0xd6, 0x0b, 0x42, 0x49, 0xa1, 0x01, 0x98, 0xe0, 0x51, 0xcf, 0xd7, 0x69, 0x26, 0x41, 0xe9, 0x34, 0xfd, 0x53, 0x2f, 0x33, 0xd2, 0xa1, 0x20, 0x0b, 0x83, 0x1f, 0x33, 0x6b, 0xd6, 0x0a, 0xff, 0x9d, 0xbe, 0x1f, 0xa1, 0x5b, 0xda, 0x0a, 0x5f, 0xe3, 0x3f, 0x21, 0x8b, 0x4e, 0x77, 0x52, 0xa9, 0x1d, 0xc9, 0x5a, 0xd4, 0x15, 0xbb, 0x38, 0x5d, 0x4d, 0xd6, 0xe2, 0xb6, 0x85, 0xa9, 0x36, 0x8e, 0xb9, 0x11, 0x33, 0x3e, 0xf6, 0xb7, 0x69, 0x64, 0x6d, 0xd9, 0xae, 0xcd, 0xc6, 0x4e, 0x13, 0x99, 0xb6, 0xc4, 0x17, 0x99, 0xd4, 0x4d, 0x1a, 0xfc, 0xa8, 0x1a, 0x14, 0x2b, 0x05, 0x85, 0x86, 0xf1, 0x99, 0x55, 0xb1, 0xdf, 0xc3, 0x3e, 0x07, 0xef, 0xa4, 0xa8, 0xdf, 0x67, 0x79, 0xb2, 0x6c, 0x00, 0x28, 0x75, 0xf0, 0x48, 0x18, 0x8d, 0x2d, 0x45, 0x46, 0xd6, 0x1c, 0x5b, 0x96, 0x73, 0xe2, 0x6f, 0x67, 0x15, 0x00, 0x4d, 0x69, 0x79, 0xca, 0x47, 0xb3, 0x33, 0x1a, 0x1f, 0x10, 0xab, 0x45, 0x28, 0x9a, 0x65, 0x4e, 0xa7, 0x8b, 0x85, 0x5a, 0x7f, 0x4f, 0x92, 0x64, 0x0e, 0xde, 0x7a, 0x32, 0x52, 0x48, 0xd6, 0x88, 0x50, 0x91, 0x70, 0x9b, 0xb6, 0xc0, 0x02, 0xc8, 0xbf, 0x33, 0x41, 0x86, 0x57, 0x35, 0x1a, 0x9a, 0x80, 0xd3, 0x3c, 0x8a, 0xf4, 0xeb, 0xd6, 0x53, 0x0b, 0x85, 0xa2, 0x5e, 0xe0, 0x66, 0x22, 0xb1, 0xaf, 0xe3, 0x2a, 0x63, 0x82, 0xf4, 0x9e, 0x52, 0x0d, 0x89, 0x7d, 0x18, 0xd6, 0x21, 0x1e, 0x3a, 0x99, 0x98, 0xba, 0xa3, 0xea, 0x40, 0x2b, 0x51, 0x1c, 0x34, 0xf3, 0x4f, 0x62, 0xe9, 0x80, 0xe3, 0x34, 0x06, 0xaf, 0x08, 0xf4, 0x76, 0x8e, 0x1e, 0xd2, 0xbb, 0x66, 0xe1, 0xed, 0x85, 0xf9, 0x98, 0xba, 0x83, 0x08, 0x8e, 0xaa, 0x79, 0x18, 0xc6, 0x07, 0x93, 0x76, 0xeb, 0x1f, 0xf9, 0x79, 0x86, 0xa5, 0xa3, 0x07, 0x74, 0x54, 0x6f, 0x5a, 0x96, 0xd5, 0x70, 0x04, 0xca, 0xe3, 0x89, 0x31, 0x1a, 0xad, 0x3b, 0x2d, 0x34, 0x7c, 0xbc, 0x26, 0x1a, 0x95, 0x49, 0x32, 0x1b, 0x61, 0xbc, 0x94, 0x02, 0xcb, 0x61, 0x3b, 0x8d, 0xea, 0x06, 0x8b, 0x21, 0xe0, 0x51, 0x60, 0xbb, 0x02, 0x57, 0x50, 0x2a, 0x39, 0x69, 0x31, 0x7c, 0xa7, 0x31, 0xdb, 0xb6, 0x8e, 0xff, 0x2f, 0xc8, 0x6e, 0x5d, 0x59, 0xbf, 0x6e, 0xe9, 0x51, 0x3d, 0xfd, 0x64, 0xa8, 0x26, 0xb9, 0x06, 0x81, 0x9d, 0x90, 0x14, 0xde, 0x2f, 0x25, 0xb5, 0x1d, 0x4d, 0x75, 0x02, 0xc2, 0x00, 0xba, 0x5c, 0x76, 0xd8, 0x90, 0x02, 0x50, 0x26, 0x56, 0xe2, 0x54, 0x6a, 0xd7, 0xb0, 0x39, 0x0f, 0x29, 0x36, 0x70, 0x56, 0xd6, 0xeb, 0x61, 0x91, 0x3a, 0xc6, 0xf8, 0x91, 0x2c, 0x54, 0x60, 0x61, 0xe1, 0x09, 0x0e, 0x35, 0x0c, 0xd4, 0x02, 0x9d, 0x4a, 0xf5, 0x49, 0xfe, 0xbe, 0x13, 0xc7, 0x43, 0xf8, 0x89, 0x33, 0xd0, 0x1c, 0x02, 0x63, 0xb7, 0x40, 0x45, 0xca, 0x2f, 0x15, 0x52, 0x3f, 0x42, 0xca, 0xad, 0xff, 0xc5, 0x2d, 0xfa, 0xf6, 0x8d, 0x14, 0xca, 0x3a, 0xe0, 0xfb, 0xb5, 0xd9, 0x2a, 0xee, 0xa9, 0xd4, 0xf1, 0xaa, 0x81, 0x6b, 0x0b, 0xff, 0xd9, 0x9b, 0x0f, 0x78, 0x21, 0xe6, 0x09, 0x3e, 0xf1, 0x52, 0x72, 0x3a, 0x9c, 0xb4, 0x5f, 0x7a, 0x08, 0x2e, 0xf8, 0xd6, 0xbd, 0xf7, 0x2c, 0xd3, 0x3b, 0x5a, 0xa3, 0xc7, 0x91, 0x02, 0xf4, 0x3e, 0x2b, 0x74, 0x19, 0x9d, 0xec, 0xdd, 0x20, 0x05, 0x7d, 0x0e, 0x22, 0x7a, 0xe4, 0xc5, 0x79, 0x45, 0x58, 0x2e, 0x2e, 0x96, 0x53, 0xa9, 0xb1, 0x6e, 0xea, 0xce, 0xcd, 0xbc, 0x5a, 0xae, 0xda, 0xc7, 0xe3, 0x5c, 0x35, 0xcb, 0xd9, 0xad, 0xed, 0xe7, 0xf8, 0x3b, 0xbf, 0x36, 0xf8, 0xb0, 0x45, 0x3d, 0x61, 0x41, 0x6a, 0x85, 0xa1, 0x78, 0x21, 0x88, 0x5b, 0x37, 0x57, 0xd2, 0x03, 0xfa, 0x25, 0x60, 0xa8, 0x5c, 0x4b, 0x4c, 0x10 ],
+    const [ 0x6d, 0x72, 0x62, 0x47, 0x6d, 0xa9, 0x5d, 0xb6, 0x3b, 0x32, 0x2c, 0x51, 0x93, 0xea, 0x05, 0x03, 0x09, 0x23, 0xc3, 0xcb, 0xf0, 0xf8, 0xe8, 0xb1, 0x7b, 0xde, 0xe2, 0xfe, 0x22, 0x7c, 0x8d, 0xac, 0x47, 0xbd, 0xfa, 0x1c, 0x1a, 0x23, 0x6f, 0x07, 0xba, 0x5e, 0xae, 0xb7, 0x9d, 0x1d, 0x7a, 0x77, 0x31, 0x24, 0x58, 0x48, 0xc3, 0x9e, 0x93, 0xd5, 0xa1, 0xb5, 0x82, 0xa9, 0x7b, 0x61, 0x0d, 0xa0, 0x0f, 0x7d, 0x6e, 0x9b, 0x06, 0x20, 0x35, 0x78, 0x18, 0x2a, 0x8f, 0x42, 0x77, 0x1d, 0xc7, 0xa4, 0x6b, 0x2f, 0x0d, 0xa4, 0x39, 0x9d, 0x77, 0x8e, 0x4a, 0x41, 0x45, 0x2d, 0x89, 0x67, 0x69, 0x41, 0x0d, 0xdd, 0x47, 0x2e, 0xf8, 0x49, 0xb9, 0xf2, 0x9f, 0xbf, 0x56, 0x59, 0xeb, 0x93, 0xf4, 0x74, 0xff, 0x6c, 0x6b, 0x47, 0x1a, 0x9a, 0x9c, 0xc2, 0xbf, 0xaa, 0xb2, 0xf3, 0x14, 0x37, 0xa8, 0x79, 0x89, 0x03, 0x0c, 0x3c, 0xb9, 0x46, 0x02, 0x5b, 0x95, 0x45, 0x8b, 0x66, 0xbf, 0x27, 0x07, 0xce, 0x34, 0x04, 0xf9, 0x99, 0x2e, 0x40, 0x0b, 0x5a, 0x49, 0x17, 0x52, 0x61, 0xe4, 0x78, 0xd2, 0x2f, 0xca, 0x17, 0x45, 0x2d, 0x12, 0xbe, 0x18, 0x9d, 0x43, 0xe3, 0xb7, 0xd0, 0xbc, 0x80, 0x0a, 0x99, 0x53, 0x1f, 0x3f, 0x03, 0x3d, 0x34, 0xcb, 0x3f, 0x2e, 0xb0, 0xab, 0xe0, 0xc0, 0xd3, 0xf0, 0x4b, 0x19, 0x42, 0x7a, 0x68, 0xc8, 0x59, 0x04, 0x9e, 0xf1, 0xc2, 0x61, 0xff, 0xaa, 0x47, 0x04, 0xbf, 0xa4, 0xe4, 0xc6, 0xeb, 0x0e, 0x21, 0xe4, 0x57, 0xb6, 0x9f, 0x47, 0xd9, 0x72, 0xf0, 0x09, 0xb4, 0xbe, 0xab, 0x34, 0x57, 0xa6, 0xc0, 0xcd, 0x48, 0xe7, 0x0a, 0x11, 0x5b, 0x51, 0x23, 0xfe, 0x27, 0x6f, 0x7c, 0x15, 0xba, 0x6a, 0xad, 0x5f, 0x8c, 0x2b, 0x09, 0xae, 0xb2, 0xc0, 0x76, 0x25, 0x54, 0x01, 0x7c, 0xfa, 0x61, 0x73, 0x9b, 0x7b, 0x81, 0x6c, 0xe2, 0x4f, 0x4c, 0x78, 0xbd, 0xff, 0xb9, 0xfc, 0x0f, 0xb5, 0xd9, 0x19, 0x80, 0x43, 0xc5, 0xd3, 0x19, 0x66, 0xd5, 0x73, 0x0e, 0x4c, 0x12, 0x29, 0xda, 0x55, 0xee, 0xf6, 0x91, 0x17, 0x33, 0xc9, 0x72, 0xa4, 0x3a, 0xe9, 0xbc, 0x0f, 0x5d, 0x92, 0xc4, 0x2c, 0xae, 0xe3, 0x43, 0x98, 0xea, 0xf8, 0xf4, 0xf9, 0xa8, 0x53, 0x5f, 0x87, 0xd6, 0x80, 0xef, 0xcc, 0x66, 0xf8, 0x4b, 0xa7, 0x45, 0x47, 0xe3, 0x97, 0x8d, 0x6a, 0xc9, 0x36, 0xfb, 0x7b, 0xc3, 0x04, 0xa3, 0x90, 0x9e, 0x66, 0xe2, 0xe0, 0xc5, 0xef, 0x95, 0x27, 0x12, 0xdd, 0x88, 0x4c, 0xe3, 0xe7, 0x32, 0x41, 0x71, 0x36, 0x9f, 0x2c, 0x5d, 0xb1, 0xad, 0xc4, 0x8c, 0x7d, 0x7b, 0xfd, 0x35, 0xc4, 0x1f, 0xe7, 0x38, 0xb6, 0x97, 0xd3, 0xb2, 0xce, 0x02, 0xb9, 0xce, 0x57, 0x11, 0xd6, 0xde, 0x2e, 0xb8, 0x99, 0xaa, 0xc9, 0x29, 0xc0, 0x07, 0x78, 0x02, 0xbf, 0xac, 0xeb, 0xc5, 0x61, 0x42, 0xf5, 0x8a, 0xb1, 0xba, 0x8f, 0xf0, 0x1b, 0xe3, 0x20, 0x59, 0xcf, 0x3c, 0xfc, 0x57, 0x66, 0x07, 0x2a, 0x61, 0xc8, 0x9e, 0x6a, 0xcb, 0x4d, 0x0a, 0x76, 0xf5, 0x22, 0xd2, 0x89, 0xc2, 0xef, 0x11, 0x1e, 0x4b, 0xb6, 0xcb, 0xfa, 0xd5, 0xff, 0x81, 0x6c, 0x01, 0x32, 0x03, 0xd4, 0x43, 0x44, 0x86, 0x62, 0x95, 0x95, 0xf6, 0x20, 0x6d, 0x19, 0x8e, 0x33, 0xec, 0xb7, 0xa5, 0x5e, 0x58, 0xee, 0xcb, 0xc7, 0xcc, 0xbe, 0x14, 0xfe, 0x2e, 0xc6, 0xb4, 0x3b, 0x62, 0xaa, 0xcc, 0xe7, 0xbd, 0xb7, 0x84, 0x5e, 0xbd, 0xca, 0x5a, 0xf4, 0xf7, 0x6d, 0xba, 0x36, 0x50, 0x44, 0xce, 0x72, 0x70, 0xa8, 0x97, 0x79, 0x74, 0x91, 0x3d, 0xa3, 0xe3, 0xb9, 0xa3, 0x14, 0xe4, 0xfe, 0x3f, 0x3e, 0xae, 0x08, 0x29, 0xa7, 0x3f, 0x2d, 0x71, 0xec, 0x51, 0x91, 0xb6, 0x07, 0x8a, 0x92, 0xf4, 0xcd, 0xf3, 0x63, 0x9e, 0xba, 0xab, 0xf6, 0xed, 0xf1, 0xdd, 0x20, 0x77, 0x7f, 0xef, 0xf8, 0x03, 0xe0, 0xfc, 0x80, 0x9c, 0xc4, 0x85, 0x87, 0xe4, 0x13, 0x63, 0xcd, 0xab, 0x2e, 0x00, 0x69, 0xc0, 0x78, 0xc7, 0x68, 0x07, 0x15, 0xd9, 0xb7, 0xcc, 0xf1, 0x02, 0x43, 0x57, 0x04, 0xeb, 0x5e, 0xc1, 0xd5, 0x91, 0x65, 0x06, 0x3d, 0xf5, 0x9f, 0x5a, 0x6e, 0x16, 0x69, 0xc1, 0x33, 0x1c, 0x90, 0xda, 0x7a, 0xd6, 0xff, 0xfb, 0x0f, 0x66, 0x9a, 0x83, 0xaa, 0x3b, 0x69, 0x6c, 0x2c, 0x40, 0xf9, 0x20, 0x26, 0x53, 0xff, 0x8e, 0x9b, 0xf9, 0x3f, 0x7c, 0x07, 0x50, 0xac, 0x1f, 0x9f, 0x45, 0xd1, 0xe9, 0xdb, 0x06, 0x6f, 0xa2, 0x32, 0xbb, 0x68, 0xba, 0x24, 0x71, 0xdb, 0xde, 0x7e, 0x56, 0x91, 0xc9, 0xda, 0x2c, 0x98, 0x5d, 0x65, 0xf8, 0x2d, 0xf2, 0xe5, 0xfa, 0xe0, 0xee, 0xfa, 0xe2, 0xf2, 0x95, 0xa3, 0x41, 0x02, 0x23, 0x05, 0x3e, 0xe8, 0x18, 0x68, 0x8a, 0xe2, 0xd4, 0x83, 0x96, 0xee, 0x63, 0xf9, 0x03, 0x76, 0x9a, 0x23, 0x5a, 0x32, 0x63, 0x10, 0xfd, 0x4b, 0x55, 0xca, 0x5d, 0xbc, 0x88, 0xdb, 0x6e, 0xfe, 0xa7, 0x10, 0x58, 0xe4, 0x46, 0x7d, 0x70, 0xc4, 0x76, 0xc1, 0x66, 0xd7, 0x97, 0x8c, 0xbf, 0xe2, 0x6e, 0x5e, 0x86, 0x16, 0x78, 0x91, 0x3f, 0x35, 0x7d, 0x99, 0x1d, 0xf7, 0x67, 0x8b, 0x75, 0xac, 0x55, 0xdc, 0x71, 0x22, 0xec, 0x6b, 0x09, 0xc9, 0xed, 0xc2, 0x2f, 0x15, 0x0d, 0x99, 0x4a, 0x24, 0x01, 0x9c, 0xe6, 0xa1, 0xd8, 0x6f, 0xaa, 0xe8, 0x8d, 0xee, 0x8a, 0x6b, 0xdd, 0xb9, 0x3e, 0x54, 0x56, 0xf0, 0xf2, 0x6c, 0xb1, 0x3b, 0x3f, 0x3b, 0x61, 0x0e, 0x5a, 0x71, 0x6c, 0x2b, 0x8b, 0x84, 0x7a, 0x68, 0xe1, 0x9b, 0x2b, 0xb2, 0x25, 0xab, 0xae, 0x52, 0x0c, 0xdf, 0x90, 0x6f, 0xb0, 0x3e, 0xd1, 0xd4, 0x41, 0x88, 0x3d, 0xf4, 0xf8, 0x60, 0xf9, 0x2b, 0x4d, 0xb0, 0x5d, 0x47, 0x6a, 0x4a, 0x01, 0x47, 0xdf, 0xcb, 0x1b, 0x63, 0x97, 0xc5, 0x08, 0x4c, 0x0b, 0x1d, 0x28, 0xb4, 0xb5, 0xb1, 0xef, 0x11, 0xc8, 0x3e, 0x39, 0x9e, 0x1e, 0x82, 0xde, 0xa3, 0x72, 0x9d, 0x87, 0xf7, 0xcf, 0xbd, 0xc0, 0xc3, 0x48, 0xfa, 0x4e, 0x88, 0xea, 0x7f, 0xc2, 0x64, 0xef, 0xeb, 0x4e, 0x91, 0x34, 0xf7, 0xd8, 0x2e, 0xee, 0x58, 0x4d, 0x42, 0x98, 0xe7, 0x38, 0xfe, 0x30, 0xff, 0x93, 0x42, 0xa2, 0x26, 0xdc, 0x63, 0x85, 0xf0, 0x6c, 0x2c, 0x05, 0x21, 0x05, 0x22, 0x20, 0x12, 0xaa, 0x0c, 0x16, 0x56, 0xb3, 0xb3, 0x1a, 0x9c, 0x20, 0xe7, 0x4e, 0xd7, 0x2e, 0xc2, 0xee, 0x9d, 0x28, 0x31, 0xcb, 0xcd, 0x80, 0xaf, 0xfc, 0x75, 0x1e, 0x54, 0xd0, 0xf3, 0xf8, 0x0f, 0x07, 0x5a, 0xe3, 0x30, 0x41, 0x17, 0xa8, 0x29, 0xb6, 0xd4, 0x5b, 0x95, 0x28, 0x9c, 0xe8, 0x79, 0x16, 0x40, 0xef, 0xca, 0x33, 0xfa, 0xd2, 0x30, 0x16, 0x51, 0x0c, 0x0a, 0x33, 0x3c, 0xc4, 0xb2, 0x0a, 0x8a, 0xa1, 0x02, 0x9e, 0x81, 0xe1, 0x17, 0x29, 0xc6, 0xa5, 0x54, 0x0e, 0x7d, 0x8f, 0xaa, 0x0f, 0xb0, 0x8f, 0x17, 0xc0, 0xf5, 0xfa, 0x6d, 0x3b, 0x4b, 0xdd, 0x55, 0x16, 0x46, 0x90, 0x93, 0x92, 0x6c, 0x8e, 0x8c, 0x15, 0xde, 0x83, 0x05, 0xdb, 0x3b, 0xa7, 0x2d, 0xe8, 0xc1, 0x4b, 0xde, 0x41, 0xb5, 0xb1, 0x20, 0x5b, 0x05, 0x21, 0xef, 0xd4, 0x2d, 0x39, 0x3e, 0x61, 0x57, 0x85, 0x3b, 0x08, 0xc6, 0x50, 0xd5, 0x8f, 0x74, 0xb9, 0x7b, 0x34, 0xfa, 0x09, 0x27, 0x9e, 0xb1, 0x43, 0x9c, 0x14, 0x17, 0xfd, 0xec, 0xed, 0x74, 0x6f, 0x3c, 0x47, 0xbd, 0xca, 0xcb, 0xfc, 0xb8, 0xcb, 0x31, 0xd2, 0x61, 0x8f, 0xe5, 0xf2, 0x8d, 0xa9, 0x02, 0x9c, 0xcd, 0x72, 0x4b, 0x18, 0x95, 0xa0, 0x6c, 0xf0, 0x9d, 0x1a, 0x83, 0x5c, 0x88, 0x0b, 0xde, 0xfe, 0xc4, 0x35, 0x06, 0xcf, 0xb1, 0x89, 0xfd, 0x5a, 0x05, 0xf4, 0xc5, 0x28, 0x6f, 0x7b, 0x21, 0x7b, 0x7a, 0x8a, 0xa0, 0x3f, 0xb5, 0x89, 0xd6, 0x3d, 0x11, 0xb1, 0xed, 0x92, 0x8a, 0x1e, 0x5d, 0x5f, 0x09, 0x25, 0xf7, 0xc3, 0x89, 0xe7, 0x28, 0x06, 0x79, 0x26, 0x7c, 0x17, 0x62, 0x58, 0x61, 0x39, 0xca, 0xfa, 0x2e, 0xf9, 0x58, 0x27, 0x63, 0x63, 0x39, 0x69, 0x32, 0x75, 0xc1, 0xcf, 0x3f, 0xd4, 0x56, 0x40, 0xa5, 0xbe, 0x8a, 0x0e, 0x39, 0x40, 0x87, 0xce, 0x12, 0xa9, 0xb0, 0x68, 0x49, 0x3e, 0x85, 0x6a, 0xfd, 0x2f, 0xc7, 0xa2, 0x9a, 0xca, 0xdd, 0xeb, 0x5b, 0xef, 0x77, 0x47, 0x0e, 0xc4, 0x71, 0x2e, 0x18, 0xa9, 0xfa, 0x26, 0xb8, 0x6f, 0xf5, 0x94, 0x90, 0xc4, 0x9f, 0xd2, 0x61, 0xf2, 0x73, 0x81, 0x16, 0xca, 0x4b, 0x21, 0x04, 0xda, 0xc7, 0xdf, 0x70, 0xe7, 0xf2, 0xad, 0x51, 0x97, 0x23, 0x98, 0x58, 0x6d, 0x22, 0x56, 0x2e, 0xfa, 0x8c, 0x1f, 0xfd, 0x52, 0x79, 0xbf, 0x31, 0xbe, 0x5b, 0xe8, 0x80, 0xb0, 0x2a, 0xcc, 0x27, 0xfc, 0xbe, 0xeb, 0x77, 0x44, 0x7c, 0x2a, 0x91, 0xb4, 0x34, 0x26, 0x6e, 0xf0, 0x4a, 0xc7, 0x22, 0x4b, 0x14, 0x18, 0x61, 0x3a, 0x84, 0x56, 0x42, 0x08, 0x07, 0x47, 0x43, 0xcb, 0xac, 0xcc, 0x8d, 0x96, 0x89, 0xba, 0x7a, 0xf0, 0x5b, 0xe6, 0x55, 0x85, 0x6c, 0x7f, 0x61, 0x1c, 0xba, 0xa1, 0x1c, 0xc9, 0x55, 0x26, 0xc4, 0x64, 0x09, 0xc0, 0x1b, 0x39, 0x3d, 0x45, 0x68, 0x01, 0x1b, 0x49, 0xbe, 0x12, 0xf1, 0xf2, 0x80, 0xd2, 0xd7, 0x08, 0x25, 0x71, 0x93, 0x4c, 0x39, 0xd8, 0xb9, 0x0b, 0xa4, 0xdc, 0x17, 0xf2, 0x2f, 0xb8, 0x4f, 0x24, 0x44, 0xba, 0xc6, 0x8a, 0xf5, 0x3c, 0xbd, 0x6a, 0x41, 0xd6, 0xbe, 0x3c, 0x92, 0xd2, 0x3a, 0xb9, 0x89, 0xe0, 0x70, 0x34, 0xfe, 0x0b, 0x90, 0x2d, 0x43, 0xec, 0x21, 0x24, 0xa9, 0x1e, 0xa0, 0xab, 0x46, 0xf2, 0x6a, 0xbf, 0xf5, 0x63, 0xdc, 0x58, 0x9d, 0x4c, 0xb8, 0x3f, 0xb7, 0xd8, 0xca, 0x20, 0x0a, 0x3a, 0xcc, 0xe0, 0xb9, 0x9f, 0x88, 0x30, 0x80, 0x61, 0x3c, 0x63, 0x3b, 0x7e, 0x42, 0x7c, 0xa8, 0x48, 0xf0, 0x8c, 0x6d, 0x5e, 0xbe, 0x3b, 0x5d, 0xda, 0xa6, 0xa4, 0xf7, 0xcc, 0xd1, 0x66, 0x2f, 0xe8, 0x6f, 0xf7, 0x72, 0x7b, 0xe7, 0x3c, 0xe4, 0xa4, 0x30, 0x57, 0xec, 0xc0, 0x7e, 0xc1, 0xf2, 0x26, 0x22, 0x98, 0x67, 0x15, 0xab, 0x3a, 0x06, 0xea, 0x52, 0x12, 0x5a, 0x96, 0x95, 0xb2, 0x81, 0x50, 0x21, 0x22, 0x2f, 0x87, 0xf5, 0x78, 0xf6, 0x1b, 0xc5, 0xa9, 0xc4, 0xcc, 0x9c, 0x9f, 0xad, 0xf3, 0xc6, 0x8c, 0xea, 0x70, 0xed, 0x7d, 0x22, 0xe3, 0x82, 0x32, 0xe9, 0x1f, 0x5f, 0x2d, 0x87, 0xdb, 0xaa, 0x09, 0xfa, 0xab, 0xfc, 0x0d, 0x3e, 0x2f, 0xc2, 0x01, 0xcb, 0x8a, 0xe4, 0x40, 0x60, 0x16, 0xa5, 0x0f, 0xff, 0x57, 0xcb, 0x2d, 0x38, 0x2d, 0xff, 0xac, 0xab, 0x4d, 0x76, 0xfe, 0xc9, 0xf1, 0xd1, 0x53, 0xda, 0xcf, 0x42, 0x23, 0x44, 0x48, 0xf1, 0x06, 0x0a, 0xe3, 0x9e, 0xcc, 0x93, 0xf9, 0x87, 0xca, 0xad, 0xb2, 0x8c, 0x72, 0xd1, 0x30, 0x91, 0x27, 0xa9, 0x09, 0x24, 0x4f, 0xcf, 0xfb, 0x5f, 0xa9, 0xd8, 0xdb, 0x10, 0xe0, 0x91, 0xcf, 0x18, 0x61, 0x88, 0xbd, 0x11, 0x6a, 0xce, 0x03, 0x34, 0x64, 0xfc, 0x69, 0x79, 0x73, 0x74, 0x53, 0xff, 0x4b, 0xe9, 0x3c, 0xaf, 0x45, 0x22, 0x5f, 0x1d, 0xb2, 0xfa, 0xb7, 0xae, 0x6f, 0xac, 0x2a, 0x00, 0xba, 0x4d, 0x02, 0x86, 0x43, 0x9a, 0x9c, 0x73, 0x86, 0xf4, 0x64, 0xda, 0x59, 0xa9, 0x01, 0x13, 0xc1, 0x75, 0xcc, 0x60, 0x0a, 0x49, 0x87, 0xd0, 0x17, 0x4a, 0x4c, 0x64, 0xf6, 0x1d, 0xc3, 0x71, 0xb7, 0x62, 0x98, 0x45, 0x7f, 0x7e, 0x2c, 0x0d, 0xd8, 0x9e, 0x8b, 0xf7, 0x4b, 0xf9, 0x9f, 0x93, 0x31, 0x55, 0xa3, 0x7f, 0xc6, 0xcc, 0xd9, 0x43, 0x7f, 0xd0, 0x80, 0x7a, 0x9e, 0x6d, 0x01, 0x33, 0x03, 0xce, 0x69, 0x96, 0x45, 0x03, 0x1b, 0xcb, 0x01, 0x01, 0xc7, 0x17, 0x72, 0xea, 0x96, 0x48, 0x42, 0x8f, 0xa7, 0x54, 0xa0, 0x34, 0xbf, 0x3d, 0x93, 0x93, 0x3c, 0x37, 0x8e, 0x23, 0x4b, 0x0d, 0x44, 0x99, 0x5b, 0xc1, 0xbd, 0xaf, 0xd2, 0x73, 0xaa, 0x25, 0xfe, 0x83, 0xf6, 0x06, 0x4e, 0xfa, 0x9d, 0x2d, 0xc2, 0x26, 0xc1, 0x07, 0xa0, 0x85, 0xfb, 0x9b, 0x69, 0xe5, 0xef, 0xc7, 0x0b, 0xc8, 0x23, 0xcc, 0x58, 0x0d, 0x11, 0x0d, 0xb7, 0xcd, 0x7a, 0x13, 0x19, 0x84, 0xfe, 0xd5, 0x2f, 0x71, 0xea, 0x36, 0xdb, 0x3f, 0x51, 0xd0, 0xe4, 0xe4, 0x5e, 0xf0, 0xed, 0xca, 0xe8, 0xe1, 0xa8, 0x2c, 0x47, 0x6e, 0x47, 0xc4, 0x66, 0xa2, 0x33, 0xa3, 0x1a, 0xd2, 0x01, 0x60, 0xb2, 0xde, 0xa2, 0x74, 0xd0, 0xb3, 0xd9, 0xe5, 0x77, 0x14, 0xf2, 0x22, 0x64, 0x9b, 0xb2, 0x2e, 0xa2, 0xfa, 0x8a, 0x01, 0x59, 0x87, 0x0f, 0x2c, 0xe7, 0xf8, 0xaf, 0xbb, 0x31, 0x6a, 0x9c, 0x5f, 0x3b, 0xa9, 0x0d, 0xcd, 0xf7, 0xab, 0xa6, 0x61, 0x5b, 0x5d, 0x34, 0x07, 0xb6, 0xa3, 0x9e, 0x5b, 0x44, 0x99, 0x19, 0x0f, 0x00, 0x20, 0x9a, 0x8d, 0xb9, 0x96, 0x91, 0xde, 0x68, 0xe4, 0xd4, 0xcb, 0xc1, 0xbe, 0xd9, 0x42, 0x08, 0x26, 0x29, 0xfb, 0x26, 0x32, 0x11, 0x5a, 0xfc, 0x10, 0x9b, 0x98, 0xf7, 0x47, 0xbd, 0x1e, 0xe5, 0x3f, 0xcf, 0x31, 0x07, 0x04, 0x42, 0xd4, 0x67, 0x47, 0x90, 0xea, 0x6b, 0xa6, 0x6f, 0x9c, 0xab, 0x2d, 0x4a, 0xfa, 0x00, 0x1c, 0xf1, 0xe5, 0xdd, 0xea, 0x90, 0x2c, 0xe3, 0x8b, 0xde, 0xf5, 0xaf, 0xef, 0x96, 0x5f, 0xf7, 0xcb, 0x2b, 0x65, 0xd5, 0x9b, 0xb8, 0x06, 0x62, 0xe8, 0x35, 0xa2, 0x87, 0xc6, 0xf1, 0xa8, 0x10, 0xa2, 0x3c, 0x6e, 0x02, 0x3a, 0x64, 0x60, 0x2f, 0xed, 0xe4, 0x5d, 0x07, 0x35, 0xd7, 0x5e, 0xb1, 0x72, 0xb3, 0x59, 0x5b, 0xe9, 0x33, 0x65, 0xce, 0x0c, 0x95, 0x1e, 0x45, 0xfc, 0x06, 0x4b, 0x7f, 0x4c, 0x5b, 0xbe, 0x13, 0x08, 0x01, 0x7c, 0x04, 0xf5, 0x37, 0x1e, 0x95, 0x1b, 0x7a, 0x77, 0x5e, 0x81, 0x41, 0x77, 0xa0, 0x38, 0xeb, 0x4f, 0xd6, 0x9a, 0xf6, 0xd6, 0x8c, 0xd4, 0x71, 0x2c, 0x74, 0xa2, 0xb4, 0x9d, 0xb7, 0x5a, 0x4e, 0xc8, 0x89, 0x2c, 0x3f, 0x00, 0x00, 0xa8, 0x68, 0xf2, 0x26, 0x80, 0x3f, 0x88, 0x4d, 0x90, 0xc7, 0x0e, 0xa2, 0x1b, 0xc0, 0x94, 0x05, 0x58, 0x1a, 0x93, 0x18, 0x2d, 0xb0, 0xd3, 0x96, 0x3a, 0x33, 0x8b, 0xe7, 0x19, 0x64, 0xcb, 0xf1, 0xe4, 0x87, 0x17, 0x30, 0xf8, 0x14, 0x54, 0x09, 0xf9, 0xaf, 0xe9, 0x5b, 0x17, 0x5a, 0x1e, 0x58, 0x8f, 0xea, 0xc7, 0x93, 0x74, 0xb7, 0x27, 0x59, 0xaf, 0x98, 0x0f, 0x45, 0x45, 0x0f, 0x46, 0x0f, 0xd8, 0xc0, 0x2d, 0xa5, 0x71, 0x28, 0xa3, 0x7d, 0x7c, 0x8b, 0x27, 0x29, 0x14, 0x2e, 0x3c, 0x2c, 0x81, 0xc7, 0x12, 0x0c, 0xff, 0x32, 0x62, 0xa8, 0xc1, 0x65, 0x9a, 0xcc, 0x36, 0xa6, 0x3a, 0x03, 0x8b, 0xfc, 0x7e, 0xac, 0x71, 0xe3, 0x3d, 0x50, 0x20, 0x43, 0x11, 0x33, 0x9c, 0xa3, 0xb8, 0x29, 0x37, 0x9a, 0xba, 0xab, 0x57, 0x87, 0x4c, 0x2a, 0x79, 0x82, 0x75, 0xa3, 0x76, 0x93, 0x6f, 0x74, 0x05, 0x21, 0x50, 0x6e, 0x82, 0xad, 0xea, 0x2b, 0xee, 0xc0, 0xef, 0xa2, 0x36, 0x21, 0x59, 0xf8, 0xb8, 0x4c, 0x08, 0x9a, 0x03, 0x20, 0xad, 0x88, 0xde, 0xd8, 0xe8, 0xf4, 0x8d, 0x3c, 0xad, 0x0b, 0x4f, 0x18, 0xec, 0x13, 0x2b, 0xee, 0x71, 0xb6, 0xec, 0xe8, 0x09, 0x9d, 0x6b, 0x10, 0xe6, 0x41, 0x0c, 0xc3, 0x44, 0xfe, 0x8b, 0x63, 0x4d, 0x6a, 0xf9, 0x4d, 0x3a, 0xe4, 0x01, 0x0b, 0xbc, 0x70, 0x70, 0xca, 0x9a, 0xc2, 0xf5, 0x0e, 0x9b, 0x98, 0x24, 0xa4, 0xa6, 0x4d, 0xc1, 0xd9, 0x28, 0xab, 0x3c, 0xe9, 0xb6, 0x02, 0x78, 0xba, 0xf4, 0x76, 0xd0, 0xca, 0xb5, 0x9d, 0x5c, 0x66, 0x63, 0x4a, 0x70, 0x1e, 0xa2, 0xa3, 0x66, 0x75, 0x30, 0x7a, 0x9e, 0xdd, 0x0f, 0xda, 0xc2, 0xe2, 0xe7, 0xdf, 0x4f, 0xa5, 0xa6, 0xcb, 0x51, 0x8c, 0x69, 0x57, 0x6e, 0x38, 0x9f, 0x47, 0x25, 0xb7, 0x6b, 0x41, 0x58, 0xfb, 0x4b, 0xdf, 0x08, 0x8b, 0xf8, 0x03, 0x61, 0x79, 0x8d, 0x6b, 0xf6, 0x94, 0xea, 0x85, 0x4d, 0xde, 0x5b, 0x84, 0x9e, 0x41, 0x75, 0xb3, 0xd8, 0x7d, 0x41, 0x09, 0xe5, 0x65, 0x9d, 0xfe, 0x2f, 0x4b, 0xde, 0x9e, 0x63, 0xb9, 0xba, 0xdc, 0x75, 0x62, 0x66, 0x28, 0xe4, 0x57, 0xfb, 0x44, 0x3f, 0x7e, 0x1e, 0x53, 0xe8, 0x41, 0xe0, 0x33, 0x18, 0x83, 0xe3, 0x0c, 0x23, 0xd8, 0xbf, 0x29, 0xfd, 0xf5, 0xa3, 0x07, 0xfd, 0x65, 0x40, 0xac, 0xe2, 0x7e, 0xe2, 0x3a, 0x14, 0x94, 0xe0, 0xc4, 0x2c, 0x6c, 0x37, 0x60, 0xb5, 0xf3, 0x72, 0x7e, 0x34, 0x30, 0xcd, 0x78, 0x67, 0x78, 0x99, 0x6a, 0xcb, 0xe1, 0xe2, 0x43, 0x60, 0xf9, 0x50, 0x1c, 0xb0, 0xb7, 0x4b, 0xc9, 0x0e, 0xb1, 0x62, 0xae, 0x1c, 0x90, 0xee, 0xd4, 0x90, 0xc1, 0xf2, 0x3d, 0x37, 0x6e, 0x46, 0x74, 0x3a, 0xad, 0xf5, 0x67, 0xa0, 0xf7, 0xe3, 0x79, 0x14, 0xdb, 0xb3, 0xd4, 0xe8, 0xf3, 0xe7, 0xfc, 0x5b, 0x18, 0x49, 0xaa, 0x17, 0xd2, 0x8a, 0xd7, 0xfe, 0x12, 0x2a, 0x17, 0x26, 0x24, 0x97, 0x28, 0x22, 0xdf, 0x99, 0xcb, 0x84, 0x1f, 0xed, 0xd2, 0x9f, 0x75, 0x31, 0x7b, 0x92, 0x1c, 0x00, 0xfc, 0x82, 0x2f, 0x5d, 0x5f, 0x26, 0x1a, 0x55, 0x90, 0x89, 0x4f, 0xe0, 0xb5, 0x0b, 0x3a, 0x09, 0xbd, 0xa9, 0x76, 0x4e, 0x3c, 0x7f, 0x41, 0x4a, 0x76, 0x8b, 0x2d, 0x91, 0xb9, 0xb4, 0x19, 0xdc, 0xf1, 0x0b, 0x60, 0x66, 0x76, 0x50, 0x50, 0x95, 0x28, 0xb8, 0xde, 0xdd, 0xbe, 0xed, 0x97, 0xe2, 0x5b, 0x57, 0xda, 0xdc, 0x62, 0x9a, 0x45, 0x40, 0x8c, 0x60, 0x6d, 0x9d, 0x38, 0x58, 0xd2, 0xc3, 0x02, 0x7f, 0x12, 0x2b, 0x96, 0x9e, 0x5c, 0x93, 0xc7, 0x13, 0x28, 0xe9, 0xdb, 0xd5, 0x25, 0x6a, 0x29, 0xb3, 0x73, 0x0b, 0xe7, 0xdc, 0x13, 0x18, 0x3d, 0xa4, 0x9c, 0x1b, 0x9d, 0x85, 0x2f, 0xff, 0x57, 0x64, 0xac, 0x75, 0x68, 0x16, 0x26, 0x97, 0x93, 0x23, 0x95, 0xcb, 0xb4, 0xca, 0xcb, 0xeb, 0x50, 0x45, 0xaa, 0xa3, 0x70, 0x4e, 0x93, 0x1a, 0xb0, 0xe1, 0x21, 0xd4, 0x93, 0x44, 0x18, 0xd7, 0x19, 0x45, 0x98, 0x0c, 0x94, 0xc3, 0x97, 0xe9, 0xb7, 0x6f, 0x8e, 0x4d, 0xf0, 0xd4, 0x71, 0xab, 0xf8, 0x95, 0xe5, 0x6b, 0xa8, 0xf6, 0xae, 0x8d, 0x0e, 0x9e, 0x66, 0x90, 0xc0, 0x9c, 0x75, 0x92, 0x70, 0xa7, 0x3d, 0xb8, 0xc1, 0xaa, 0x95, 0xd0, 0x59, 0x80, 0x79, 0x35, 0x37, 0xfb, 0xff, 0xf3, 0x47, 0x2c, 0x8d, 0x2c, 0x34, 0xde, 0x4a, 0xbb, 0x7e, 0x64, 0xd2, 0x16, 0xcc, 0x95, 0x2e, 0x79, 0x83, 0x14, 0x03, 0x41, 0x97, 0xd5, 0x09, 0x96, 0xa2, 0xdc, 0xbf, 0x4c, 0x33, 0x48, 0x5e, 0x0b, 0x68, 0x91, 0x0b, 0xae, 0xbf, 0x0e, 0x50, 0xea, 0x29, 0xba, 0xcd, 0x30, 0x60, 0x37, 0x2b, 0xd4, 0x7b, 0x13, 0x52, 0x6e, 0xc0, 0x4b, 0xdc, 0x81, 0xb9, 0x0d, 0xc9, 0x5a, 0x8a, 0xc2, 0x74, 0x3b, 0x81, 0x4c, 0xc5, 0xb9, 0xef, 0x8c, 0xa9, 0x63, 0x36, 0x28, 0xbf, 0xa4, 0x24, 0x8b, 0x55, 0xeb, 0x7f, 0x2d, 0x92, 0x08, 0xe1, 0x14, 0xf4, 0xda, 0xc6, 0x9b, 0xfe, 0x27, 0xe4, 0x72, 0x2a, 0xcb, 0xbb, 0xe6, 0x25, 0x15, 0x6c, 0x62, 0x3b, 0x6e, 0xce, 0x36, 0x10, 0x3b, 0xbf, 0x98, 0x92, 0x05, 0xb8, 0xe8, 0x2b, 0xd7, 0xa5, 0x39, 0x3b, 0xe8, 0xf3, 0x0c, 0xc5, 0x7a, 0xea, 0x5e, 0x69, 0x02, 0x3d, 0xe6, 0x92, 0x89, 0xdf, 0x98, 0xf0, 0x52, 0x19, 0x6d, 0x29, 0xbd, 0xda, 0x66, 0xcb, 0x6b, 0x4e, 0xcf, 0x86, 0xa3, 0xb1, 0xc1, 0x98, 0xf5, 0x66, 0xea, 0x88, 0x1d, 0x43, 0x90, 0x17, 0x2a, 0x30, 0xd4, 0x74, 0xdf, 0xf0, 0x34, 0xaf, 0x59, 0x3e, 0x54, 0x70, 0xf2, 0x1c, 0xfe, 0xe9, 0x66, 0x68, 0x67, 0x09, 0x34, 0xb0, 0xb4, 0xf2, 0x47, 0x47, 0xbc, 0xae, 0xd6, 0x98, 0x10, 0x1d, 0x89, 0xbb, 0x39, 0x32, 0xdd, 0x46, 0x40, 0x5f, 0xc9, 0x66, 0x74, 0x4e, 0xa2, 0x2e, 0x67, 0xd2, 0x3c, 0x2e, 0x3a, 0x1d, 0x52, 0x48, 0x1a, 0x33, 0x27, 0xbf, 0x0b, 0x9f, 0x6e, 0x91, 0xe4, 0x64, 0x67, 0x07, 0x9b, 0x36, 0x4c, 0x8a, 0xc3, 0xea, 0xeb, 0xb8, 0x53, 0x2c, 0x94, 0xb7, 0xa9, 0x70, 0x35, 0xc9, 0xcf, 0x2b, 0xc4, 0x21, 0xfc, 0x42, 0xdd, 0xf6, 0x5e, 0xc2, 0xad, 0xd5, 0x16, 0xd3, 0x0e, 0x3b, 0x85, 0xe7, 0xf3, 0x63, 0xc6, 0x37, 0x07, 0x5d, 0x7b, 0x70, 0x91, 0x60, 0xcd, 0xa9, 0x9b, 0x61, 0xae, 0x99, 0x53, 0xe4, 0x61, 0x07, 0xb1, 0x13, 0x3d, 0x81, 0x5a, 0x0d, 0xae, 0x51, 0xc5, 0x80, 0x7c, 0xad, 0x9c, 0x7a, 0x50, 0x2e, 0x65, 0x7c, 0x74, 0x84, 0x61, 0xd1, 0xda, 0x67, 0xb4, 0x1d, 0x60, 0xd0, 0xc7, 0x39, 0x52, 0x6a, 0xeb, 0x3e, 0x30, 0x43, 0x3f, 0xe0, 0xb2, 0xc8, 0xd3, 0xfe, 0x0a, 0xf0, 0x0d, 0x76, 0x69, 0xb7, 0x4c, 0x3e, 0xc4, 0xce, 0xcc, 0xb1, 0xd8, 0x91, 0xca, 0x26, 0x6c, 0x39, 0xe8, 0xc7, 0xd6, 0x53, 0xd2, 0xa1, 0xc0, 0x71, 0x22, 0xf7, 0x2c, 0x1f, 0x81, 0xdc, 0xb6, 0x18, 0x0f, 0x01, 0x19, 0xba, 0x06, 0xcb, 0xf5, 0xb8, 0x9a, 0xa8, 0xd0, 0x0f, 0x23, 0xa4, 0x5a, 0x3b, 0x7d, 0x37, 0xf5, 0xaa, 0xaf, 0x61, 0x74, 0x71, 0xcc, 0xf9, 0x23, 0x3e, 0x17, 0x43, 0x08, 0x8d, 0x6a, 0xc0, 0x69, 0x1f, 0xd9, 0x4a, 0x8f, 0xa8, 0x92, 0x60, 0xc9, 0xc9, 0x07, 0xbe, 0xb3, 0x3d, 0x50, 0x30, 0xb7, 0x57, 0xca, 0xa9, 0xd5, 0xac, 0x05, 0x8f, 0xa0, 0x0d, 0xdd, 0x5a, 0x89, 0xb8, 0xe6, 0x5d, 0x60, 0xce, 0x0e, 0xe3, 0x18, 0x08, 0x7d, 0x7e, 0xcb, 0xa6, 0xc0, 0x9c, 0xfd, 0xa9, 0x27, 0x5b, 0x25, 0x42, 0x6b, 0x9f, 0x6a, 0x8a, 0x94, 0x61, 0xaa, 0x73, 0x1a, 0x4a, 0xc0, 0xff, 0x4b, 0x80, 0x07, 0xb0, 0xec, 0xc0, 0x1a, 0x3f, 0x23, 0xad, 0xde, 0x91, 0x95, 0x67, 0xc3, 0xe6, 0xcb, 0x60, 0x46, 0x54, 0xda, 0x6b, 0xbb, 0x74, 0x43, 0x16, 0x49, 0x5b, 0x18, 0x3a, 0x36, 0xcb, 0x60, 0xd0, 0x64, 0xab, 0xbd, 0x06, 0x1c, 0xb5, 0x4c, 0x93, 0x0b, 0x6f, 0xcd, 0x47, 0x8a, 0x5c, 0x04, 0xe6, 0x23, 0x73, 0x5e, 0x36, 0x50, 0xd0, 0xd8, 0x57, 0x85, 0xaa, 0x1d, 0x53, 0x71, 0x85, 0xee, 0xf6, 0x82, 0xa8, 0xc7, 0xe0, 0xa7, 0xd2, 0xc0, 0xd8, 0x59, 0x29, 0xb1, 0x63, 0xdc, 0x73, 0x99, 0x95, 0xc2, 0x88, 0x41, 0x28, 0xb2, 0x07, 0x1c, 0xcb, 0x67, 0x49, 0x72, 0xbc, 0xfb, 0x93, 0xbd, 0x99, 0x66, 0x90, 0x54, 0x74, 0x42, 0xfe, 0x46, 0x25, 0xd1, 0xa7, 0x89, 0xe4, 0x40, 0x93, 0x54, 0x17, 0x2d, 0x7c, 0xc9, 0x68, 0x68, 0x82, 0xd7, 0x1b, 0xf6, 0x20, 0x5f, 0x9e, 0x5c, 0x5f, 0x95, 0x62, 0x1a, 0x49, 0xaa, 0xea, 0x75, 0xa1, 0xa8, 0x22, 0x79, 0xd1, 0x9d, 0xf1, 0x3f, 0x24, 0xfb, 0x11, 0x6c, 0x35, 0x3f, 0x1f, 0xfa, 0xa8, 0xd1, 0xee, 0x3b, 0x17, 0x2b, 0x21, 0x1a, 0x4f, 0x3e, 0xf9, 0xa5, 0xbd, 0x11, 0x6b, 0xc8, 0x23, 0xac, 0x76, 0x5b, 0x8f, 0x34, 0xb3, 0x60, 0x8e, 0x57, 0x2e, 0x85, 0x9d, 0xeb, 0x74, 0xf1, 0xe0, 0xd1, 0xed, 0x3c, 0x17, 0x20, 0x6c, 0xbf, 0xcd, 0x7f, 0x05, 0x0f, 0xd2, 0xd3, 0x1f, 0xc4, 0xec, 0x1b, 0xc9, 0x7f, 0xca, 0x97, 0x52, 0x2b, 0x39, 0x30, 0x13, 0x82, 0x9b, 0x14, 0x90, 0xd3, 0x94, 0xa1, 0xc0, 0x03, 0x06, 0x84, 0xa8, 0xd3, 0x40, 0x22, 0x2f, 0x60, 0x72, 0x37, 0x2d, 0xf0, 0x64, 0xbc, 0xc5, 0xeb, 0x68, 0x0f, 0xf5, 0x28, 0x8e, 0x4e, 0x6b, 0x6a, 0x16 ],
+    const [ 0x3a, 0xc3, 0xe8, 0x6e, 0x6d, 0x6d, 0x65, 0xca, 0x20, 0x3b, 0x85, 0x0a, 0xc3, 0x6f, 0xd5, 0x96, 0xe8, 0xe0, 0x1f, 0x21, 0x4b, 0xef, 0x8e, 0x39, 0x0f, 0xbd, 0x14, 0x1c, 0x4a, 0x9b, 0x09, 0xce, 0xc4, 0xc2, 0x15, 0x68, 0xfc, 0x45, 0x4f, 0xb3, 0x6c, 0x43, 0xa6, 0xf5, 0x0e, 0x61, 0x81, 0x0b, 0x1f, 0x77, 0xa2, 0xb8, 0x23, 0x8a, 0x50, 0x3d, 0x29, 0xfb, 0xb5, 0x2a, 0x50, 0xfd, 0x85, 0x73, 0x8a, 0x4c, 0xe0, 0xc6, 0xa0, 0x1d, 0x7a, 0x1c, 0x77, 0x50, 0xf9, 0x8f, 0x91, 0xed, 0x9e, 0x6b, 0xd6, 0xce, 0x28, 0x87, 0x95, 0x99, 0xf5, 0xd6, 0xc6, 0xf2, 0x6b, 0x39, 0x92, 0xee, 0x96, 0x97, 0x15, 0xca, 0x12, 0x30, 0x62, 0xdd, 0x2c, 0x2e, 0xc7, 0xcb, 0x44, 0x7d, 0x53, 0xfc, 0x76, 0xdd, 0x96, 0x4c, 0x79, 0x36, 0xa8, 0x04, 0xc6, 0x2b, 0x6d, 0x0a, 0xfd, 0xf1, 0x16, 0x54, 0x85, 0x62, 0xeb, 0xa2, 0x73, 0x4d, 0x48, 0x6d, 0xae, 0x11, 0xe6, 0x1a, 0x50, 0x6a, 0x5c, 0x74, 0x4f, 0x8a, 0xe6, 0x59, 0x5c, 0x6c, 0x64, 0xb3, 0x0b, 0x65, 0xa6, 0xab, 0x35, 0xfc, 0xe6, 0x19, 0x9b, 0xfb, 0x96, 0x3e, 0xcb, 0xc6, 0x5d, 0xb5, 0x48, 0xec, 0x5c, 0xa7, 0xe5, 0xfc, 0xb5, 0x3f, 0x72, 0x9a, 0x4e, 0x5d, 0x9a, 0xd1, 0xd2, 0x8f, 0x0c, 0xab, 0xf9, 0x3d, 0xd9, 0xff, 0x0a, 0x23, 0x1d, 0x8b, 0x9e, 0x04, 0xe2, 0x42, 0xa6, 0x9d, 0x41, 0xe7, 0xaf, 0xd9, 0xca, 0xdb, 0x65, 0x43, 0x27, 0x34, 0x56, 0xc0, 0xfb, 0x0e, 0xf9, 0x7e, 0x10, 0x26, 0xef, 0x28, 0xb2, 0xa5, 0x88, 0x5c, 0x56, 0x39, 0x89, 0x5e, 0x80, 0x6a, 0x2d, 0x0e, 0xe3, 0x2c, 0x69, 0x17, 0xc9, 0xb0, 0x74, 0x6a, 0xb5, 0x80, 0x87, 0xeb, 0x47, 0xcb, 0xe2, 0x69, 0x61, 0xfd, 0x0f, 0xd4, 0x88, 0x93, 0x6a, 0xaa, 0x8d, 0x2e, 0xe1, 0xb3, 0x6c, 0xe6, 0xf9, 0xee, 0x74, 0xe0, 0x11, 0xcb, 0xa8, 0x23, 0xeb, 0x9a, 0x66, 0xa7, 0x68, 0x44, 0x46, 0xaf, 0x93, 0x39, 0x45, 0x59, 0xe1, 0xa9, 0x23, 0x74, 0xb8, 0xf7, 0x09, 0x91, 0x2d, 0x6b, 0x6f, 0x5d, 0x12, 0x27, 0x3d, 0x2e, 0x30, 0x5c, 0x30, 0xdb, 0xd1, 0xbd, 0x80, 0xd1, 0x82, 0x34, 0xc0, 0x63, 0x16, 0xd4, 0x05, 0x62, 0xee, 0x10, 0x4a, 0xee, 0x78, 0x2a, 0x13, 0x8b, 0xf6, 0xee, 0x51, 0x78, 0x81, 0x9f, 0x86, 0x3c, 0x4d, 0x32, 0x29, 0x81, 0x2e, 0xba, 0x4c, 0x25, 0x5b, 0x24, 0x7c, 0x8f, 0x73, 0x24, 0xe9, 0x3f, 0xbd, 0x6f, 0xc7, 0xa9, 0xb4, 0x2b, 0xf3, 0x44, 0xc3, 0xa3, 0xda, 0xde, 0x4d, 0x40, 0x97, 0x32, 0xf0, 0xb5, 0x5b, 0xbc, 0x0b, 0x79, 0x12, 0xcc, 0x7d, 0x7a, 0x43, 0xda, 0xb0, 0x10, 0x38, 0x19, 0xd7, 0x2f, 0x60, 0x4e, 0x73, 0xe2, 0xf1, 0xe3, 0x1c, 0xf4, 0xd1, 0x37, 0x7e, 0xf0, 0xb7, 0x39, 0xa2, 0x4d, 0x8e, 0x35, 0x6f, 0xe2, 0x1a, 0xee, 0x70, 0xa0, 0xdd, 0xec, 0xd7, 0x7f, 0x3c, 0x17, 0xc2, 0xb9, 0xde, 0x85, 0xbe, 0x37, 0x55, 0x91, 0x89, 0x48, 0x00, 0x2d, 0x1d, 0x99, 0x2f, 0x79, 0xe9, 0x62, 0x89, 0x94, 0x62, 0xdd, 0xab, 0xb1, 0xba, 0xfc, 0x12, 0x6e, 0xef, 0x5b, 0x3b, 0x62, 0x08, 0x74, 0x08, 0xf5, 0x9c, 0x12, 0x66, 0x75, 0x93, 0x08, 0x2d, 0x66, 0x30, 0x22, 0x48, 0x19, 0x50, 0x5c, 0x15, 0x80, 0xec, 0x52, 0x0e, 0x40, 0xe5, 0xf8, 0xaa, 0x08, 0x01, 0x8b, 0x7e, 0x21, 0x30, 0xc7, 0xa8, 0x47, 0x15, 0x5b, 0x6d, 0xb8, 0xc1, 0x9a, 0x21, 0x8a, 0xc2, 0x73, 0x47, 0x41, 0x5c, 0xa3, 0xfa, 0xa1, 0x16, 0x29, 0x8c, 0xc1, 0x79, 0xfa, 0x6c, 0x61, 0x14, 0xf7, 0x4d, 0x7d, 0xc3, 0x1c, 0x84, 0x23, 0x31, 0xfa, 0xb2, 0x81, 0x9c, 0x67, 0xa4, 0x42, 0xd8, 0x74, 0x77, 0x1b, 0x97, 0x9f, 0x00, 0xa0, 0xe7, 0x4a, 0x6b, 0x5d, 0xfc, 0x6c, 0x21, 0x22, 0x30, 0x87, 0xf0, 0x9e, 0x48, 0xda, 0x66, 0x2f, 0xf9, 0xd7, 0x7d, 0xf9, 0xab, 0xd7, 0x7e, 0x36, 0x7c, 0x0d, 0x1f, 0xcc, 0x88, 0xb8, 0xee, 0x25, 0x68, 0x9d, 0xf3, 0x3b, 0xf8, 0xb5, 0x91, 0xf2, 0x5d, 0x23, 0xae, 0xab, 0x47, 0x68, 0x14, 0x16, 0x74, 0xda, 0x16, 0x47, 0x76, 0x53, 0x76, 0x0d, 0xb5, 0x26, 0x86, 0x7f, 0xb7, 0x57, 0x8e, 0xd7, 0x9f, 0x0b, 0x6e, 0x84, 0xf4, 0x3d, 0x84, 0x7a, 0xa4, 0xb3, 0xd0, 0xcd, 0x49, 0x30, 0x56, 0x7e, 0xaa, 0xec, 0xc4, 0x95, 0x85, 0x41, 0x55, 0x6f, 0x8c, 0xa7, 0xf5, 0x5a, 0xad, 0xe2, 0xa6, 0x5f, 0x96, 0x7a, 0x22, 0x5f, 0x79, 0x6c, 0xc2, 0x62, 0x0c, 0x1f, 0x9e, 0x2b, 0xd5, 0x99, 0xf6, 0x10, 0xa4, 0xf3, 0xd1, 0x08, 0x61, 0x0a, 0xe3, 0x06, 0x07, 0x78, 0xb4, 0x85, 0xf1, 0xc3, 0xff, 0x64, 0x55, 0xd3, 0x58, 0xf5, 0x0e, 0xaa, 0x12, 0x51, 0x9e, 0x4f, 0x60, 0xee, 0x73, 0x0b, 0xba, 0x73, 0x69, 0xd8, 0x83, 0xca, 0x91, 0x17, 0xe8, 0x77, 0x31, 0x81, 0x0b, 0x29, 0x0b, 0x60, 0x61, 0x8f, 0xe2, 0xff, 0x58, 0x6d, 0x3b, 0x5f, 0x3e, 0xef, 0x61, 0x2b, 0x5e, 0x3d, 0xab, 0xee, 0x6c, 0x4f, 0x01, 0x84, 0x23, 0x03, 0x9d, 0xcf, 0x2c, 0x6d, 0x0f, 0xab, 0x42, 0x6e, 0x84, 0x23, 0x94, 0x88, 0x47, 0xe5, 0x6a, 0xf0, 0x88, 0xf3, 0x0c, 0xe5, 0x5d, 0x9c, 0xe0, 0x41, 0x06, 0xab, 0xd2, 0x4e, 0x75, 0xde, 0xf8, 0xda, 0x0e, 0x99, 0x76, 0x8e, 0xab, 0xdc, 0xa0, 0x7b, 0xe3, 0x73, 0x5f, 0xf6, 0x8c, 0x6c, 0xd6, 0xa6, 0x7e, 0xce, 0x45, 0xdb, 0x9a, 0x88, 0x2d, 0x21, 0x0b, 0xa8, 0xb5, 0x16, 0xcc, 0xcd, 0x4c, 0x78, 0x6a, 0xdf, 0x90, 0x82, 0x0c, 0xfd, 0x6e, 0x79, 0xb0, 0xb7, 0x8b, 0x82, 0xb7, 0x7e, 0xe3, 0xb6, 0xa4, 0x58, 0xb1, 0x78, 0x21, 0xd9, 0x8e, 0x06, 0x43, 0x4e, 0xdc, 0x4f, 0x0e, 0x3b, 0x65, 0x05, 0x3c, 0x08, 0x40, 0xf2, 0x3a, 0xf7, 0xf5, 0x8f, 0x74, 0x59, 0xe0, 0xd3, 0xd2, 0x02, 0xdb, 0x49, 0x82, 0xfa, 0x17, 0x65, 0xf9, 0x75, 0x4b, 0x18, 0x34, 0x05, 0x11, 0xa2, 0x44, 0x0f, 0x8c, 0xa8, 0x09, 0x7c, 0x4f, 0x86, 0x3e, 0xb0, 0x7a, 0xe6, 0xb5, 0xc0, 0x26, 0x92, 0xe4, 0xdf, 0x04, 0x86, 0xa1, 0x1a, 0x40, 0x4a, 0x2a, 0x46, 0xac, 0x7e, 0x68, 0x36, 0x1a, 0xb6, 0x75, 0x31, 0x09, 0x89, 0x5b, 0xa2, 0x85, 0xe5, 0x1f, 0x12, 0x48, 0xa5, 0xfe, 0x54, 0x25, 0x66, 0xf6, 0xff, 0xa7, 0x96, 0x88, 0x22, 0xf5, 0xcd, 0xbd, 0x32, 0xf8, 0x61, 0x67, 0x47, 0xc0, 0x35, 0xa9, 0x88, 0x24, 0xd1, 0xb9, 0xe4, 0xa9, 0xb8, 0xe5, 0x04, 0xa6, 0xf5, 0xd4, 0x7d, 0xa5, 0xf8, 0x0f, 0x49, 0x0b, 0xa0, 0xbf, 0x78, 0xfc, 0x99, 0xb9, 0x23, 0x79, 0xe8, 0xb7, 0xa2, 0xcb, 0xc4, 0xe8, 0xfe, 0x25, 0xa8, 0xac, 0xa9, 0x85, 0xa6, 0x98, 0x6d, 0xdb, 0xfe, 0xc1, 0xa3, 0x6d, 0xef, 0x37, 0xa5, 0x7a, 0xcd, 0xcf, 0x86, 0x1d, 0x54, 0x26, 0x00, 0x75, 0x3c, 0xe2, 0xad, 0x03, 0x0d, 0x3b, 0x7a, 0x53, 0x35, 0xbb, 0x5a, 0xdf, 0x58, 0x41, 0x37, 0x30, 0xe7, 0x4c, 0x2e, 0x46, 0xf4, 0x76, 0xfb, 0x3a, 0x45, 0x3f, 0xb2, 0x22, 0xa7, 0x0c, 0xb1, 0x35, 0x84, 0x70, 0xd2, 0x30, 0xb8, 0xa9, 0xe5, 0xf8, 0xa1, 0x6e, 0x5d, 0x80, 0x75, 0xe8, 0x49, 0xed, 0xd9, 0xfe, 0x86, 0xf8, 0xaf, 0xd5, 0x33, 0x94, 0x2f, 0x97, 0x66, 0xd1, 0x39, 0x74, 0x1d, 0x01, 0xe9, 0xe7, 0x78, 0x19, 0x6d, 0x3b, 0x25, 0x5a, 0x13, 0x4d, 0x1b, 0x30, 0xa6, 0x93, 0x8b, 0x5a, 0xfb, 0x5d, 0x13, 0x4b, 0xc7, 0x5b, 0x36, 0xd0, 0xb3, 0x60, 0x09, 0xf4, 0xb3, 0x65, 0x2e, 0x21, 0x93, 0xd1, 0x06, 0x87, 0xd3, 0xf8, 0x23, 0xc1, 0xb4, 0xe1, 0xfc, 0xb6, 0x93, 0x4c, 0xe5, 0xbe, 0x76, 0xf3, 0x3e, 0x07, 0xe5, 0x11, 0xea, 0x36, 0xfb, 0x21, 0x03, 0x51, 0xbc, 0xe8, 0xcb, 0xdc, 0xa9, 0xb5, 0xe6, 0x42, 0x92, 0xe8, 0xc7, 0x77, 0xac, 0xb1, 0x69, 0xdc, 0xe3, 0x1a, 0x3f, 0x63, 0x71, 0x48, 0x6d, 0xf3, 0xb0, 0xfd, 0x38, 0x0e, 0x2c, 0x62, 0xbb, 0xb1, 0xfd, 0x04, 0xdc, 0x7b, 0x54, 0x1c, 0x7f, 0x12, 0x53, 0x13, 0xfa, 0xc3, 0x22, 0x45, 0xc8, 0x68, 0x3f, 0x06, 0x81, 0x8f, 0x15, 0xe2, 0x09, 0xd8, 0xd1, 0x29, 0x08, 0x9f, 0x71, 0xac, 0x9b, 0xdb, 0x1d, 0xc1, 0x4a, 0x46, 0xbb, 0x8d, 0x39, 0xbf, 0xbe, 0x82, 0xa2, 0xec, 0x3e, 0x26, 0x82, 0x23, 0x4e, 0x16, 0x93, 0x8b, 0x8a, 0x4b, 0x7b, 0x7e, 0xef, 0x9d, 0x43, 0x32, 0xf0, 0x85, 0x0a, 0x99, 0xc5, 0x27, 0xfb, 0x85, 0x07, 0x90, 0x7c, 0x10, 0x7a, 0x3c, 0xa8, 0x3b, 0x2a, 0xdb, 0x00, 0xd5, 0xb9, 0x54, 0x5d, 0x9f, 0xf7, 0x0b, 0x2a, 0xad, 0xb3, 0x60, 0xcf, 0x0f, 0xd1, 0x78, 0x70, 0xb1, 0x9d, 0x3f, 0xd8, 0x80, 0x5f, 0xad, 0xb0, 0xce, 0x30, 0x49, 0xf5, 0xf8, 0x0b, 0xec, 0xa9, 0x46, 0x27, 0xc8, 0xc8, 0x12, 0x84, 0xa8, 0x7d, 0x2d, 0xc4, 0x79, 0x96, 0x7e, 0x3d, 0x0a, 0x36, 0xec, 0x4c, 0x10, 0xc9, 0x7f, 0xec, 0x6d, 0x3d, 0xc1, 0x87, 0xb2, 0x70, 0x6b, 0x0c, 0xe2, 0xe4, 0x3d, 0x41, 0x79, 0xba, 0x2e, 0x5b, 0xac, 0xde, 0xc5, 0xcc, 0xf3, 0x7f, 0xc7, 0x5c, 0xc5, 0xc2, 0x12, 0x7b, 0xa2, 0xb7, 0xc9, 0xd5, 0x57, 0x8c, 0xb1, 0x28, 0x7e, 0x00, 0xdb, 0x52, 0x44, 0x1b, 0x84, 0xaf, 0x6f, 0x1c, 0x39, 0xa1, 0x9f, 0xb4, 0x3f, 0x70, 0xd3, 0x71, 0x31, 0x55, 0x30, 0x7d, 0xeb, 0xd1, 0xfe, 0x88, 0xa7, 0x43, 0xf4, 0x03, 0x66, 0xba, 0xb5, 0x8f, 0x92, 0x08, 0x9a, 0xb5, 0xe1, 0x18, 0xb2, 0xd7, 0x7c, 0x81, 0x07, 0x66, 0x61, 0x5a, 0x23, 0x56, 0x05, 0x51, 0xd3, 0xcf, 0x3e, 0xf7, 0x2b, 0x26, 0x61, 0x5e, 0xca, 0x0b, 0xa7, 0xe6, 0x60, 0x04, 0xd6, 0x54, 0x6d, 0x1a, 0x1d, 0x24, 0x4b, 0xd1, 0x3f, 0x21, 0x6e, 0x5e, 0xf4, 0x32, 0xeb, 0x15, 0x8c, 0x77, 0x37, 0x21, 0xd5, 0x94, 0x31, 0x77, 0x3f, 0x4d, 0x63, 0x0d, 0x3e, 0x54, 0x85, 0x46, 0xf0, 0x5e, 0x43, 0xb1, 0x00, 0x7c, 0x41, 0xf4, 0xca, 0xa9, 0x5b, 0x03, 0xbf, 0x9f, 0x31, 0x96, 0x0b, 0xf0, 0xe3, 0xd9, 0x76, 0x51, 0x19, 0x65, 0x88, 0x39, 0x47, 0x6f, 0xf1, 0xab, 0x2f, 0x3f, 0x28, 0x4f, 0xa7, 0xe4, 0x51, 0xc8, 0x9c, 0x27, 0x64, 0x42, 0x57, 0xbd, 0x8c, 0x4a, 0xff, 0xc1, 0xcd, 0xe3, 0x5f, 0x61, 0xea, 0xd6, 0xea, 0xd7, 0x86, 0x49, 0xfc, 0x9b, 0x89, 0x93, 0x63, 0xd6, 0xc5, 0x4f, 0x1e, 0x1a, 0xda, 0xaf, 0x64, 0x51, 0x56, 0x14, 0xe9, 0xf4, 0x21, 0xdb, 0x5c, 0x7e, 0x19, 0x79, 0x34, 0x1f, 0xf9, 0xca, 0xac, 0xb4, 0x7f, 0xa6, 0x0c, 0xf7, 0xce, 0xb6, 0x2b, 0xf3, 0x11, 0x85, 0x32, 0xbc, 0x61, 0xda, 0xa2, 0x5c, 0xe9, 0x46, 0x99, 0x10, 0x47, 0xf9, 0x51, 0xb5, 0x36, 0xd9, 0xe9, 0x7d, 0x6a, 0xd6, 0x68, 0xe6, 0xbc, 0x77, 0xff, 0xed, 0x87, 0xb9, 0x8e, 0x7e, 0x52, 0x1a, 0x6a, 0x30, 0xaf, 0xf1, 0x5e, 0x2f, 0x62, 0x00, 0xef, 0x79, 0xc6, 0x4c, 0xe4, 0x4e, 0x6d, 0x2d, 0x06, 0xe1, 0x07, 0xa1, 0x25, 0x54, 0x85, 0xe5, 0x5b, 0xe3, 0x7e, 0x47, 0x95, 0x60, 0xd1, 0x36, 0x4e, 0xdf, 0x8c, 0x9b, 0x9e, 0xb2, 0x0c, 0x6c, 0x74, 0x98, 0x66, 0x7d, 0x1f, 0x31, 0x06, 0x9a, 0x14, 0xb5, 0x96, 0xd4, 0xeb, 0xe6, 0x22, 0x18, 0xaa, 0x43, 0x79, 0x06, 0x46, 0x7f, 0xd6, 0xff, 0x67, 0x31, 0xbf, 0x80, 0x6c, 0xcd, 0x2e, 0xaf, 0xaf, 0xd3, 0xef, 0x34, 0x0a, 0x46, 0x49, 0x4a, 0x9a, 0x60, 0xe0, 0x16, 0xc2, 0x84, 0xda, 0x37, 0x73, 0x74, 0x41, 0x9e, 0xab, 0xc4, 0xa8, 0xa0, 0x3c, 0x8f, 0x12, 0x49, 0xcf, 0x68, 0x0f, 0xf4, 0x28, 0x93, 0x28, 0x18, 0xac, 0x76, 0x7d, 0x65, 0x20, 0x4a, 0xad, 0x10, 0xb3, 0x16, 0xf6, 0x6b, 0x3f, 0xde, 0x9e, 0xb8, 0xcc, 0x17, 0x91, 0x3f, 0x56, 0x5f, 0x4b, 0x9e, 0xd0, 0x6b, 0xf8, 0x61, 0x68, 0x41, 0xda, 0xd2, 0x0d, 0xa7, 0xec, 0x12, 0x2e, 0xdb, 0xc5, 0x69, 0xc5, 0x84, 0xbe, 0xdb, 0x95, 0xe9, 0x57, 0xfc, 0xaf, 0x61, 0xd7, 0x05, 0x3b, 0x0a, 0x33, 0x26, 0x75, 0xbe, 0x31, 0x1e, 0xf6, 0x43, 0xcd, 0x0a, 0x35, 0xc2, 0xdc, 0x7a, 0x4d, 0x7b, 0xef, 0xca, 0x01, 0xb6, 0x7a, 0xb0, 0xfd, 0xfd, 0x36, 0x11, 0x5e, 0x88, 0xc3, 0x19, 0x75, 0xf9, 0x92, 0x8a, 0xc8, 0x4a, 0x02, 0x54, 0x5a, 0x03, 0xc9, 0x67, 0x2d, 0xb0, 0x96, 0xc5, 0x04, 0x92, 0xf5, 0xdb, 0x6d, 0x95, 0x72, 0x11, 0xff, 0x82, 0x01, 0xa0, 0xe1, 0x76, 0x9d, 0xa3, 0x8c, 0x93, 0x30, 0x72, 0xd1, 0xf5, 0xb3, 0x2b, 0x1d, 0xe7, 0x96, 0x91, 0xfc, 0x57, 0x62, 0x1a, 0xdc, 0x88, 0x9d, 0x43, 0x14, 0x07, 0xee, 0x27, 0x24, 0xe0, 0x81, 0x50, 0x3e, 0x11, 0xad, 0xcd, 0x06, 0x3f, 0xd4, 0x84, 0x97, 0xa8, 0x8b, 0xca, 0xc6, 0x59, 0xfb, 0x31, 0xaa, 0xa1, 0x87, 0xa1, 0x5c, 0xc5, 0xb0, 0xab, 0xfb, 0xf5, 0x35, 0x19, 0xf3, 0x7f, 0x7e, 0xca, 0x7f, 0x43, 0x3a, 0xbd, 0x6d, 0x67, 0x48, 0x6b, 0x22, 0x4c, 0xd3, 0x5a, 0xdd, 0xc0, 0xc2, 0xef, 0x40, 0x75, 0x4f, 0x84, 0x0c, 0xb1, 0xf5, 0xba, 0x2c, 0x48, 0x90, 0x10, 0xf5, 0xc8, 0xc0, 0xb5, 0xac, 0xf3, 0x8e, 0x9b, 0x48, 0x72, 0x52, 0xcd, 0x7a, 0xc7, 0xd4, 0x02, 0xeb, 0x84, 0xb1, 0x72, 0xc5, 0xba, 0x00, 0xe8, 0x74, 0xb5, 0x36, 0x19, 0xae, 0xe6, 0x47, 0x34, 0xb0, 0x21, 0x0e, 0xba, 0xcb, 0x09, 0xef, 0x90, 0x20, 0xc8, 0xbb, 0x53, 0xa8, 0x03, 0xd3, 0xeb, 0x77, 0x0c, 0x91, 0x63, 0x41, 0x5a, 0xe3, 0xf7, 0x1d, 0x37, 0x39, 0x6f, 0x89, 0xb9, 0xa2, 0xac, 0xae, 0xf3, 0x31, 0x81, 0xe6, 0x6c, 0xa6, 0xc4, 0x7c, 0xd1, 0x4a, 0xa4, 0xb3, 0xe6, 0x1b, 0x3c, 0x09, 0xc2, 0x29, 0x69, 0xbc, 0x3c, 0x40, 0xd9, 0x8e, 0xa1, 0xc7, 0x65, 0xc5, 0xa8, 0xe8, 0xa1, 0x77, 0xa7, 0xf2, 0xb1, 0x04, 0x06, 0xfb, 0x5e, 0xe4, 0xf4, 0xc9, 0x69, 0xa3, 0x5a, 0xf3, 0x1e, 0x29, 0x0d, 0x43, 0x2d, 0x3f, 0x48, 0x5f, 0xb6, 0x4f, 0x59, 0xa8, 0xa3, 0x6b, 0x9a, 0x63, 0x3a, 0x91, 0xa3, 0x17, 0xf2, 0x2e, 0xbe, 0x35, 0x86, 0xe0, 0x9c, 0xfe, 0x49, 0x80, 0x46, 0xa2, 0xb9, 0x60, 0x55, 0xa5, 0x56, 0xd1, 0x66, 0x87, 0xb5, 0xe9, 0xc9, 0xa4, 0xd0, 0x83, 0x79, 0x59, 0xa0, 0x86, 0x51, 0x68, 0xee, 0x6b, 0x7c, 0x9e, 0x66, 0xf9, 0x2e, 0xb3, 0xed, 0x53, 0x91, 0x71, 0x34, 0x35, 0x03, 0x18, 0x8d, 0x7b, 0x7e, 0x02, 0xfe, 0xe3, 0x57, 0x83, 0x94, 0x13, 0x2c, 0x13, 0xfa, 0xde, 0x18, 0xaf, 0x4a, 0xc3, 0x28, 0x7c, 0x23, 0xb6, 0x13, 0xae, 0xfc, 0x24, 0x25, 0xa8, 0xb8, 0x31, 0x7d, 0x64, 0x7a, 0x44, 0x78, 0x16, 0xba, 0xc5, 0x6d, 0x0c, 0x99, 0x25, 0x9b, 0xd9, 0x71, 0x1f, 0x5f, 0xb2, 0xb1, 0x3e, 0xab, 0x18, 0xe8, 0xa0, 0xb3, 0xb8, 0x1f, 0xf9, 0xe9, 0x8f, 0x6c, 0xda, 0x2c, 0x51, 0xc4, 0x34, 0x3c, 0x0c, 0x11, 0x18, 0x72, 0x08, 0x84, 0xc0, 0xae, 0xf3, 0x2d, 0xd3, 0x90, 0x3a, 0xc9, 0xe5, 0xeb, 0xba, 0xdb, 0x3d, 0x76, 0x98, 0xfe, 0xdc, 0xc5, 0x6d, 0x79, 0xbb, 0x78, 0xa7, 0x14, 0x53, 0xb3, 0x2c, 0x2a, 0x62, 0xce, 0x40, 0x00, 0xed, 0x4d, 0xa8, 0x55, 0x81, 0x12, 0x0f, 0x3a, 0xbf, 0xd1, 0xaa, 0x24, 0x18, 0xc5, 0x18, 0x40, 0xd4, 0xa1, 0x8c, 0x06, 0x59, 0xca, 0x2d, 0x11, 0xaa, 0xc3, 0xbd, 0x2e, 0x2e, 0xe8, 0x79, 0xb3, 0xb3, 0x60, 0x41, 0x12, 0xb2, 0x4d, 0xf9, 0xad, 0xd4, 0x45, 0x2f, 0xec, 0xb6, 0x06, 0xfe, 0x8d, 0xe9, 0x65, 0x32, 0x3c, 0x3e, 0x88, 0xac, 0x64, 0x40, 0x55, 0x09, 0x44, 0x01, 0x2a, 0x7e, 0x45, 0x1a, 0xcf, 0x06, 0x8b, 0xed, 0xa9, 0xc0, 0xca, 0x2d, 0x30, 0x92, 0x5b, 0xa1, 0xa3, 0x13, 0x8f, 0x24, 0xfa, 0xa8, 0x43, 0xf1, 0x1c, 0xed, 0xb4, 0x1d, 0x52, 0x56, 0x95, 0x65, 0xfb, 0x16, 0x5f, 0x2a, 0x82, 0x3f, 0xe9, 0xba, 0x8e, 0x2b, 0x38, 0xd1, 0x78, 0x1c, 0x98, 0x60, 0x02, 0x1f, 0xeb, 0x8c, 0x46, 0x36, 0x42, 0xfa, 0xec, 0xb5, 0xaa, 0x4a, 0xa0, 0xed, 0x49, 0xe1, 0xc3, 0x08, 0xa9, 0xec, 0x61, 0x34, 0x53, 0xa1, 0x64, 0x04, 0xa0, 0xc8, 0x07, 0x12, 0xcc, 0x7b, 0x8d, 0xea, 0x4c, 0x2a, 0x32, 0x23, 0x61, 0xe2, 0x62, 0xcf, 0xee, 0xce, 0x29, 0x16, 0x87, 0xfe, 0xeb, 0x1d, 0xca, 0x67, 0x55, 0x2d, 0xf2, 0x2b, 0x93, 0x11, 0xa9, 0x1b, 0xc3, 0xbf, 0x1e, 0x7a, 0xaa, 0x3b, 0x58, 0x04, 0xa6, 0xb9, 0xca, 0x2f, 0xe4, 0x02, 0x27, 0xb1, 0xd3, 0x18, 0x77, 0x42, 0xd9, 0x1d, 0x6b, 0xa3, 0x44, 0x71, 0xed, 0xdf, 0x83, 0x1b, 0xfc, 0xd1, 0x96, 0x6a, 0xb7, 0xe6, 0xc3, 0xdb, 0xb7, 0x25, 0x8b, 0x3e, 0xa2, 0x6c, 0xdc, 0x15, 0xfd, 0xfc, 0x88, 0x3d, 0x42, 0x37, 0xf6, 0xd0, 0x33, 0xa9, 0x18, 0x49, 0x6d, 0x46, 0x9c, 0xe9, 0x40, 0xf2, 0x67, 0x5a, 0xbe, 0x47, 0x3f, 0x93, 0x12, 0x92, 0xc7, 0xfb, 0x14, 0x1e, 0xb1, 0xd1, 0x1a, 0xb6, 0x2f, 0xcb, 0x10, 0x65, 0xaa, 0xfd, 0xcb, 0x80, 0xb7, 0xfd, 0x9a, 0xe6, 0x47, 0x45, 0x1e, 0x87, 0x1d, 0xd8, 0x5c, 0x23, 0x86, 0x29, 0x11, 0x54, 0x44, 0x38, 0x45, 0xcf, 0xcb, 0xfe, 0x23, 0xe7, 0xb0, 0x0b, 0x08, 0x53, 0x5e, 0x6e, 0xda, 0x30, 0x0b, 0xd5, 0x9b, 0x4a, 0xea, 0xf5, 0x3e, 0x97, 0xa2, 0x2c, 0xb9, 0x04, 0x00, 0x65, 0x5b, 0x74, 0xe8, 0x3d, 0x60, 0x06, 0x92, 0x64, 0xc3, 0x97, 0xf3, 0x45, 0x53, 0x89, 0x78, 0xe9, 0x09, 0xc2, 0xfa, 0x18, 0x99, 0xf7, 0xef, 0xc2, 0x47, 0x2a, 0xdd, 0x9e, 0xfc, 0x71, 0x15, 0x11, 0x99, 0xfa, 0x9d, 0x51, 0x8b, 0x4c, 0x6e, 0xca, 0xa0, 0xcf, 0xdf, 0xc1, 0x18, 0x8f, 0x62, 0x37, 0x00, 0x3d, 0x6e, 0x10, 0xbb, 0x77, 0xbc, 0x74, 0xe2, 0x48, 0xb6, 0x76, 0x4e, 0xf3, 0x2d, 0xf3, 0x72, 0xec, 0x4a, 0xbd, 0xee, 0x28, 0xc7, 0xf9, 0x62, 0x96, 0x5e, 0xc6, 0x80, 0xee, 0x82, 0x20, 0x66, 0xa9, 0x4e, 0x03, 0x2a, 0x50, 0xbb, 0xd3, 0xb6, 0xfa, 0x15, 0xfb, 0xd6, 0x11, 0xb0, 0xd5, 0x8f, 0x54, 0xd7, 0xca, 0xb3, 0x22, 0x05, 0xba, 0xb2, 0xf5, 0x58, 0x9d, 0xb3, 0x2d, 0x42, 0x6b, 0xe3, 0x0f, 0x82, 0x3a, 0x0d, 0x0d, 0x52, 0xa6, 0x6c, 0x47, 0xe2, 0x76, 0xbd, 0x53, 0x06, 0x7d, 0x97, 0x39, 0x2b, 0xbd, 0xff, 0xc2, 0x90, 0xd3, 0x38, 0xf3, 0xb3, 0x8f, 0xd8, 0xd4, 0x09, 0xe2, 0x21, 0x76, 0xf1, 0xfd, 0x8d, 0x33, 0xeb, 0xb7, 0xab, 0x38, 0x05, 0x2f, 0x2a, 0x41, 0x97, 0xb3, 0x33, 0xa4, 0x30, 0xe1, 0xfd, 0x91, 0xd0, 0x0c, 0x9b, 0x98, 0x58, 0xe2, 0x18, 0x6b, 0x3e, 0x4b, 0xc5, 0xe6, 0x85, 0x94, 0xd2, 0x4c, 0xed, 0xcc, 0x1c, 0xd4, 0x67, 0x6e, 0x46, 0x64, 0xcb, 0x41, 0x0b, 0x9c, 0xcd, 0x7d, 0xd2, 0x16, 0x2e, 0x2f, 0x83, 0xec, 0x2f, 0xde, 0x9a, 0x7b, 0x4b, 0x6f, 0x7a, 0x67, 0x25, 0x46, 0x03, 0xe0, 0xc0, 0xae, 0x66, 0x23, 0xee, 0x7b, 0x38, 0x43, 0x0b, 0xee, 0xc6, 0x29, 0xea, 0xd8, 0xa9, 0xd9, 0x10, 0x02, 0x9a, 0xf8, 0x20, 0xcd, 0x87, 0x8b, 0x97, 0x16, 0xe6, 0x02, 0xb9, 0x5c, 0x49, 0x75, 0xcc, 0x25, 0x32, 0x2d, 0x83, 0x9d, 0x29, 0x66, 0xbd, 0x81, 0x0d, 0x53, 0x70, 0x3b, 0xa8, 0x63, 0xdf, 0x4f, 0x85, 0xc3, 0x14, 0xf5, 0x06, 0x24, 0x8a, 0x07, 0xb1, 0xbe, 0x2a, 0x1e, 0xcb, 0x95, 0x78, 0xf9, 0x28, 0xfb, 0x0f, 0x1e, 0x41, 0x56, 0x4b, 0xc3, 0x87, 0x23, 0x45, 0xee, 0xf7, 0x3b, 0x04, 0xdc, 0xef, 0x55, 0xf1, 0xa0, 0x40, 0xcd, 0x8c, 0x0c, 0x84, 0xa4, 0x5e, 0xd4, 0xb2, 0xc7, 0x2e, 0xf1, 0xef, 0x94, 0x78, 0x44, 0xa7, 0x9a, 0x1b, 0x7c, 0xdd, 0xa0, 0x52, 0x39, 0xbf, 0xe9, 0xe5, 0x71, 0x7e, 0xb7, 0xa1, 0x14, 0x5c, 0x0e, 0x05, 0xeb, 0x07, 0xba, 0x3e, 0xc6, 0x25, 0x94, 0x56, 0xd6, 0x30, 0x00, 0xa8, 0x58, 0x84, 0xba, 0x97, 0x73, 0xb6, 0xd3, 0x7f, 0x64, 0x28, 0xf6, 0xec, 0xd8, 0xda, 0xf0, 0x0a, 0x99, 0x83, 0x6f, 0x5d, 0x6d, 0xe1, 0x0a, 0xb2, 0x3c, 0x4d, 0x82, 0x56, 0x70, 0x92, 0x48, 0x85, 0xa1, 0xff, 0x3f, 0x25, 0x72, 0xbb, 0xc2, 0xb5, 0xb6, 0x59, 0xe9, 0x80, 0xd8, 0xac, 0x08, 0x16, 0x79, 0xdd, 0x79, 0xfc, 0x5a, 0xba, 0x9c, 0xa3, 0x7d, 0x51, 0x1b, 0x97, 0x87, 0xbe, 0x73, 0xf9, 0x69, 0x41, 0xb0, 0x2f, 0x3f, 0x94, 0x77, 0xda, 0x78, 0x7b, 0x4a, 0x08, 0x38, 0x9c, 0x08, 0xac, 0xfa, 0x91, 0xb3, 0x4b, 0x7a, 0x3c, 0x76, 0xf7, 0xd2, 0x5a, 0xe7, 0x81, 0xe3, 0x5b, 0x89, 0xeb, 0xf6, 0x72, 0x95, 0x1c, 0xa3, 0xe8, 0xfa, 0xd7, 0xf3, 0xb5, 0xa2, 0xee, 0xc1, 0x51, 0xf7, 0xb3, 0x66, 0xc8, 0xa6, 0xb0, 0x95, 0x0d, 0xa2, 0x98, 0x83, 0x90, 0x6d, 0x7d, 0x4b, 0x12, 0x93, 0x42, 0x92, 0xb8, 0x77, 0x54, 0x66, 0x5f, 0x51, 0x95, 0x6c, 0x30, 0x78, 0x99, 0x3b, 0x74, 0xdd, 0x15, 0x03, 0xa9, 0xd8, 0x94, 0x72, 0xd5, 0x28, 0x6c, 0xd8, 0x1a, 0x35, 0xf1, 0x89, 0x8b, 0x97, 0xe8, 0x83, 0x3e, 0xdc, 0x3f, 0x50, 0xa2, 0x86, 0xfb, 0x2e, 0x13, 0x54, 0x71, 0x6e, 0xac, 0xc3, 0xb9, 0x1a, 0x5d, 0xd3, 0x60, 0xda, 0x3d, 0x0e, 0x5d, 0x18, 0x21, 0xc7, 0x46, 0x63, 0x6d, 0xa0, 0xc4, 0x11, 0x2a, 0x4f, 0x45, 0x29, 0x59, 0xa1, 0xf0, 0x80, 0x87, 0xbe, 0xde, 0x21, 0xa2, 0xb0, 0x87, 0xf2, 0x0b, 0x1f, 0x7a, 0x95, 0xec, 0x5e, 0x52, 0x8d, 0xcc, 0xac, 0xe5, 0xa2, 0x61, 0xb3, 0xbe, 0x86, 0xa5, 0x55, 0xce, 0xb8, 0x2c, 0xa8, 0x5e, 0xa9, 0xb4, 0x3f, 0x48, 0x1e, 0xfe, 0xac, 0x67, 0xd5, 0xdc, 0x42, 0x4c, 0x6b, 0x8c, 0x20, 0x32, 0x7d, 0x44, 0x6b, 0x34, 0x0e, 0x0e, 0xda, 0xbe, 0x28, 0xd6, 0x78, 0x42, 0xc6, 0xc1, 0xa5, 0x2c, 0xf2, 0xc1, 0x5e, 0x17, 0x2b, 0x67, 0xbf, 0x41, 0x09, 0xf8, 0xc6, 0x3c, 0x24, 0xc2, 0x5a, 0xe7, 0x31, 0xb0, 0x8c, 0x9d, 0x6e, 0x1d, 0x1c, 0xac, 0x41, 0xe6, 0x3f, 0x09, 0x1b, 0xc3, 0x9f, 0x42, 0xa3, 0xd7, 0xa4, 0xb3, 0x11, 0x85, 0xf2, 0xfd, 0xd7, 0x86, 0x33, 0xb4, 0x87, 0x38, 0x16, 0x58, 0xf1, 0x39, 0x97, 0x87, 0x8b, 0x35, 0x82, 0x70, 0x17, 0xfc, 0x32, 0x8b, 0x7f, 0xd8, 0x9f, 0x88, 0x04, 0x1d, 0x98, 0x85, 0x97, 0x01, 0x4c, 0x83, 0x87, 0xae, 0x0f, 0x1b, 0x5d, 0x96, 0x5b, 0x6d, 0x05, 0x07, 0x15, 0x5a, 0x2e, 0xff, 0x12, 0xf3, 0xf2, 0x41, 0xda, 0x30, 0xba, 0xa8, 0xac, 0xe6, 0x5c, 0xbc, 0xc2, 0xf3, 0x87, 0x83, 0xd5, 0xbb, 0x61, 0x9a, 0xe4, 0xd9, 0x6e, 0x83, 0x32, 0x0e, 0xb4, 0x41, 0x8e, 0x7d, 0x1d, 0x22, 0xd6, 0x1b, 0x1c, 0xdd, 0xbe, 0x61, 0x93, 0xdc, 0xce, 0x44, 0xf5, 0xdb, 0xaa, 0x66, 0xa8, 0xb2, 0x96, 0x8e, 0xad, 0x6f, 0x39, 0x56, 0x82, 0xa8, 0xa1, 0x23, 0x47, 0x10, 0x88, 0x5a, 0x21, 0x47, 0xd6, 0xd1, 0xdc, 0xf7, 0x67, 0x84, 0xd4, 0x1c, 0x0d, 0x8a, 0x15, 0xa3, 0xd9, 0x47, 0xc1, 0x37, 0x96, 0xe2, 0xb2, 0x58, 0x97, 0xf9, 0x61, 0xad, 0xb3, 0x94, 0x06, 0x9b, 0x8d, 0x58, 0x01, 0x16, 0x19, 0xfe, 0x79, 0xb7, 0x5b, 0x03, 0x43, 0x0f, 0x72, 0xa0, 0x05, 0x3c, 0xd6, 0xfc, 0x9b, 0xb9, 0xde, 0xa1, 0xb9, 0x7b, 0x85, 0x2c, 0xd2, 0x39, 0x6d, 0x49, 0x39, 0x0b, 0x24, 0xdf, 0x87, 0x36, 0xa7, 0x88, 0x3c, 0x46, 0x24, 0x44, 0xa9, 0x5e, 0x04, 0x6e, 0x0d, 0xcd, 0x29, 0xef, 0xfe, 0xe1, 0x74, 0xb1, 0x0a, 0x00, 0x8b, 0x57, 0x9f, 0xf4, 0xd9, 0x2b, 0x28, 0x87, 0xd6, 0x57, 0x79, 0x50, 0x88, 0x59, 0x6d, 0xcc, 0x4a, 0xb1, 0xcd, 0xb1, 0xcc, 0xdc, 0x74, 0x7e, 0x5b, 0x86, 0xb1, 0x57, 0x62, 0xfc, 0xed, 0x10, 0x31, 0xe0, 0x8e, 0x88, 0xfe, 0x20, 0x1b, 0x38, 0x29, 0x28, 0xa0, 0x0b, 0xc5, 0x57, 0x54, 0x70, 0x53, 0xb0, 0x79, 0xae, 0xd0, 0xd3, 0x84, 0x79, 0xf3, 0x2b, 0x7e, 0xc2, 0xb0, 0x68, 0xaa, 0xd3, 0x00, 0x30, 0x68, 0x9a, 0xe4, 0x11, 0x59, 0x45, 0xa7, 0xbb, 0xc4, 0x10, 0x64, 0x6c, 0x38, 0x5b, 0xc9, 0xab, 0x73 ],
+    const [ 0x9a, 0x96, 0x67, 0x95, 0x5c, 0x84, 0x47, 0x3a, 0xde, 0xe8, 0x98, 0x0b, 0x59, 0xea, 0x75, 0x0b, 0xd6, 0x41, 0x4a, 0x45, 0x41, 0xf6, 0x89, 0xb2, 0xc0, 0x6a, 0x9e, 0x5c, 0x43, 0x9a, 0x24, 0xc4, 0x5b, 0xa2, 0x59, 0x81, 0x4f, 0x80, 0xcf, 0x2b, 0x6d, 0x1b, 0x65, 0x77, 0x9e, 0x84, 0x76, 0xa3, 0x3d, 0x7b, 0x50, 0x15, 0x29, 0x35, 0xe8, 0x3f, 0x19, 0x5c, 0xcc, 0xc5, 0x30, 0x58, 0x58, 0xe2, 0xd2, 0xcd, 0x2d, 0x08, 0xb5, 0x64, 0xdf, 0xc6, 0x3b, 0xcf, 0xee, 0xef, 0xff, 0x07, 0xf8, 0xf9, 0xad, 0xd8, 0x2c, 0xa3, 0x18, 0xa0, 0x02, 0xda, 0x86, 0x54, 0x29, 0xde, 0x4e, 0xc3, 0xc1, 0xa1, 0xa6, 0x1f, 0xcb, 0x70, 0xb6, 0xb9, 0xde, 0xd4, 0xf1, 0x0c, 0x1b, 0xbb, 0xa4, 0xfd, 0x63, 0xd3, 0xcf, 0x61, 0xc7, 0x37, 0x35, 0xc0, 0x3f, 0x4d, 0xaf, 0x58, 0x9f, 0xee, 0xc5, 0x65, 0xc8, 0xc8, 0x7f, 0xa0, 0x1b, 0x01, 0x79, 0x06, 0x34, 0x1d, 0x36, 0xda, 0xd4, 0x22, 0xb6, 0xed, 0x1e, 0xfa, 0x4b, 0x1d, 0x07, 0x18, 0xa8, 0x1c, 0x08, 0x5f, 0x3b, 0x73, 0x15, 0x3f, 0xbd, 0xc6, 0xd3, 0x21, 0x07, 0x59, 0x06, 0x05, 0x27, 0xd3, 0x48, 0x69, 0xb3, 0x42, 0x01, 0x6d, 0x5d, 0x60, 0x93, 0x36, 0xc8, 0x15, 0xd5, 0x90, 0x9a, 0x3c, 0xc3, 0xd7, 0xd3, 0xaa, 0x74, 0x17, 0x5d, 0x6c, 0x4c, 0x72, 0xe3, 0x51, 0x72, 0xc2, 0xe7, 0xa9, 0x84, 0x80, 0x0f, 0x4b, 0x8a, 0xe5, 0xc0, 0xdd, 0x29, 0x4e, 0xee, 0x4f, 0x1a, 0xe5, 0x33, 0xa9, 0xda, 0x7e, 0x1e, 0x07, 0xa2, 0xbf, 0xcd, 0xe1, 0x99, 0x84, 0xbe, 0x90, 0x49, 0x81, 0xe2, 0x0e, 0x4f, 0x2a, 0xf3, 0xfe, 0x57, 0xcf, 0x08, 0xec, 0x48, 0x0c, 0x67, 0xd5, 0xbc, 0x60, 0x9a, 0xea, 0xb3, 0x1c, 0xc5, 0x91, 0x88, 0x7f, 0x36, 0xad, 0x24, 0x1f, 0x3e, 0x1f, 0x71, 0x8a, 0x3f, 0x8d, 0x11, 0x2e, 0x07, 0x61, 0x51, 0x76, 0x5c, 0x15, 0x58, 0x36, 0xd8, 0xaf, 0xa5, 0x49, 0xf8, 0x87, 0xb8, 0x79, 0x6f, 0x50, 0x0e, 0x9e, 0xc0, 0x56, 0x53, 0x0a, 0x0b, 0x05, 0xd4, 0x25, 0x27, 0xab, 0x33, 0x55, 0xf2, 0x7f, 0x5e, 0x21, 0xe5, 0xe1, 0xc1, 0x95, 0xec, 0xe3, 0xbb, 0xe8, 0x74, 0x09, 0x4f, 0x5c, 0xc5, 0x4d, 0x1d, 0x66, 0x92, 0x66, 0x90, 0x0f, 0xce, 0x4a, 0x58, 0x9a, 0xc2, 0xf2, 0x1b, 0x67, 0x5d, 0x5d, 0x67, 0x17, 0xcb, 0xd7, 0xec, 0xf1, 0x49, 0x7b, 0xe8, 0x84, 0x37, 0xf7, 0xe2, 0x8e, 0x6e, 0x8f, 0x9b, 0x1d, 0xd5, 0x65, 0x42, 0xf4, 0x2f, 0xf7, 0xe7, 0x30, 0x37, 0xe9, 0x32, 0x2c, 0xef, 0x05, 0x55, 0xa1, 0x35, 0x80, 0x3f, 0x12, 0x97, 0x7e, 0x12, 0x67, 0x68, 0xd9, 0xd8, 0xd8, 0x13, 0x1e, 0x72, 0x0c, 0xb0, 0xd9, 0xd0, 0x82, 0xd5, 0x13, 0x68, 0x31, 0xaf, 0x18, 0xe0, 0x6b, 0x51, 0x7e, 0x0e, 0x07, 0x4b, 0x62, 0x23, 0xbf, 0x7f, 0xf5, 0x23, 0xd7, 0x30, 0x38, 0x99, 0x00, 0x5c, 0x03, 0x88, 0x7b, 0x4c, 0x4c, 0xa4, 0x81, 0x69, 0xa6, 0xc2, 0xe3, 0x51, 0x08, 0x8e, 0xee, 0x2a, 0xd0, 0x7c, 0x91, 0x37, 0x07, 0x01, 0xc2, 0xa8, 0xe7, 0x02, 0x1d, 0xb7, 0x9a, 0x8d, 0xce, 0xf0, 0x45, 0xc7, 0xb2, 0xd0, 0x45, 0x25, 0xb9, 0x92, 0xb9, 0xdf, 0x8f, 0x46, 0x40, 0xa2, 0x7b, 0x23, 0x04, 0x86, 0x87, 0x1e, 0xf7, 0x3f, 0xe1, 0xbc, 0x5c, 0x97, 0x81, 0x24, 0x8a, 0x1c, 0x0c, 0x78, 0xec, 0x15, 0xf8, 0x65, 0x4d, 0xbb, 0xf2, 0xf9, 0x52, 0xa6, 0x7c, 0xb5, 0x48, 0x86, 0xdb, 0xe4, 0x20, 0x13, 0x30, 0x2b, 0xb8, 0x47, 0xe5, 0x60, 0x5d, 0xca, 0x4a, 0x9f, 0x8d, 0xae, 0x80, 0x9b, 0x01, 0x5c, 0x97, 0x33, 0xeb, 0xce, 0xf3, 0x46, 0x7c, 0xff, 0xf4, 0xc7, 0xa9, 0xa0, 0xd6, 0x14, 0x2f, 0x0d, 0xd5, 0x83, 0xd4, 0x7f, 0x95, 0x3e, 0xf0, 0x83, 0xc2, 0x52, 0x2d, 0xab, 0xf3, 0x02, 0x8b, 0x83, 0xd5, 0x61, 0xa7, 0xc6, 0x85, 0x20, 0x3c, 0xd2, 0x3d, 0xa4, 0xea, 0x5a, 0x33, 0x5b, 0x36, 0x5b, 0xbe, 0x51, 0xd3, 0x51, 0xbb, 0xfe, 0x20, 0xaa, 0x2f, 0x63, 0xf1, 0x7b, 0x2e, 0x55, 0x92, 0x72, 0xfb, 0x18, 0x09, 0x0c, 0x70, 0x2f, 0x9c, 0x07, 0xa0, 0x73, 0x93, 0x1b, 0xbc, 0x63, 0x3f, 0xe5, 0x33, 0xbb, 0x3b, 0x24, 0x1d, 0x48, 0xf2, 0x27, 0xda, 0xfa, 0x61, 0x86, 0xf6, 0x3b, 0x1f, 0x11, 0x50, 0x7f, 0x9a, 0x06, 0x7c, 0x1c, 0xa3, 0x87, 0x65, 0x5d, 0x2d, 0x4a, 0x37, 0xd1, 0x51, 0x93, 0x7c, 0xe9, 0x96, 0x5f, 0x85, 0xc2, 0x70, 0xe2, 0x0b, 0x40, 0x06, 0x34, 0x16, 0x5c, 0x38, 0x48, 0x1e, 0xbf, 0xe1, 0x1d, 0x70, 0x8f, 0x59, 0x38, 0xd4, 0x89, 0x3f, 0x51, 0x6d, 0x50, 0x75, 0x4d, 0xe0, 0x04, 0x6b, 0x6c, 0xb9, 0x17, 0xa1, 0xc4, 0x0a, 0x5c, 0x67, 0xee, 0x54, 0x61, 0xe8, 0xff, 0xab, 0xff, 0x66, 0xb9, 0x16, 0x2f, 0xc7, 0x03, 0x35, 0x1f, 0x51, 0x97, 0x26, 0x86, 0xb2, 0xfb, 0xa8, 0x34, 0x43, 0xb2, 0x81, 0xed, 0x8d, 0xb3, 0x1e, 0x77, 0x0d, 0x1a, 0x7a, 0xf2, 0x34, 0x1e, 0x41, 0x68, 0xb2, 0x43, 0x34, 0xa5, 0xf4, 0xd0, 0xcf, 0x49, 0xeb, 0x84, 0x29, 0x1b, 0x10, 0x85, 0x1d, 0xa0, 0xa5, 0x99, 0xa7, 0xed, 0x3d, 0x98, 0x90, 0xb9, 0x7e, 0x22, 0x4e, 0xb6, 0x26, 0x8d, 0x26, 0x22, 0x4c, 0x21, 0x93, 0x98, 0xe9, 0x88, 0xeb, 0x2d, 0x96, 0x80, 0x40, 0xb8, 0x97, 0xd3, 0x84, 0x71, 0x19, 0x89, 0xf1, 0xbe, 0xb8, 0x5c, 0xa8, 0x49, 0x44, 0x6c, 0x99, 0x56, 0xc5, 0x34, 0xa2, 0x54, 0xbc, 0xbd, 0xfb, 0xb1, 0xac, 0x11, 0xd1, 0xf3, 0xd9, 0xf3, 0x31, 0x05, 0x50, 0xcd, 0x28, 0xce, 0x27, 0xea, 0x29, 0x08, 0x06, 0xe5, 0xae, 0x50, 0xe7, 0x62, 0x22, 0x79, 0x19, 0xfb, 0xff, 0x26, 0x8b, 0x7e, 0x34, 0x98, 0x47, 0x55, 0xc9, 0xc4, 0x3d, 0x45, 0xc5, 0xa9, 0x42, 0x5c, 0x50, 0xe0, 0x58, 0x24, 0x15, 0x75, 0x30, 0x1d, 0xea, 0xf5, 0xed, 0x6a, 0xb3, 0xc8, 0x2b, 0xcb, 0x83, 0xc1, 0x40, 0xcb, 0x05, 0xf4, 0xc1, 0x3b, 0x1b, 0xc8, 0x49, 0xde, 0xc4, 0x4d, 0x75, 0x66, 0x43, 0xcf, 0x33, 0x9f, 0x7e, 0xab, 0x3d, 0xeb, 0xa4, 0x61, 0xe0, 0xee, 0x12, 0xeb, 0x02, 0x8a, 0x78, 0x4d, 0x63, 0x0e, 0x37, 0x6e, 0x23, 0xaa, 0x0e, 0x26, 0x85, 0x27, 0xf6, 0x98, 0xf2, 0xd4, 0x4a, 0xc2, 0x41, 0xc4, 0x2b, 0x52, 0x35, 0x36, 0x23, 0xbb, 0x47, 0x55, 0x08, 0x89, 0xa6, 0x22, 0x24, 0xf1, 0x7d, 0xae, 0x92, 0xad, 0x74, 0x8c, 0xeb, 0x07, 0x79, 0x86, 0x23, 0x33, 0xc0, 0x8f, 0xad, 0xe1, 0x08, 0xf9, 0xe6, 0x13, 0x21, 0xe8, 0xb0, 0x2c, 0xab, 0x07, 0x5d, 0x4a, 0x20, 0x79, 0xd0, 0xd6, 0x15, 0x13, 0xde, 0x5a, 0xbc, 0xc8, 0xfa, 0x92, 0xae, 0x64, 0x12, 0xc5, 0xe7, 0x7e, 0xb4, 0x55, 0x12, 0xa7, 0x75, 0x96, 0x08, 0xe8, 0x93, 0xdc, 0x93, 0x6c, 0xd9, 0xd8, 0x77, 0x79, 0xc3, 0x24, 0xb3, 0xa5, 0xe3, 0x1c, 0x04, 0x46, 0x83, 0xf0, 0xab, 0x2a, 0x8c, 0xf7, 0x70, 0x88, 0xa7, 0x46, 0xe7, 0x37, 0xa1, 0x82, 0xf2, 0x1e, 0x14, 0xf2, 0x87, 0xec, 0x44, 0xd8, 0xb3, 0x09, 0x47, 0x02, 0xdf, 0xcc, 0x69, 0x9c, 0x53, 0xee, 0xce, 0x48, 0xf8, 0x3e, 0x59, 0x71, 0x62, 0x97, 0xcd, 0xdb, 0x0d, 0x0f, 0x32, 0x7f, 0xe7, 0x72, 0x7b, 0x97, 0x0f, 0xef, 0x65, 0xf5, 0xdd, 0x10, 0xa2, 0x98, 0x22, 0xf0, 0x37, 0x81, 0xb1, 0xa8, 0x23, 0xc3, 0x1e, 0x0a, 0x41, 0xda, 0xc5, 0x92, 0x6f, 0x3d, 0x0e, 0x99, 0xf0, 0x37, 0xf0, 0xcc, 0x0f, 0xf2, 0xb4, 0xdd, 0x05, 0xd5, 0xfc, 0x78, 0x1d, 0x0f, 0x03, 0x79, 0x16, 0x74, 0x26, 0x5c, 0xc9, 0x89, 0xa4, 0xf4, 0x0c, 0xda, 0xa2, 0x60, 0xd5, 0x94, 0x72, 0x3c, 0xa3, 0x4f, 0x14, 0x14, 0x19, 0x2c, 0xfd, 0x1e, 0xec, 0x20, 0x18, 0x28, 0x00, 0x8f, 0x0b, 0xcf, 0xce, 0x1d, 0xbb, 0xf2, 0x09, 0xc1, 0x12, 0x66, 0x81, 0x1b, 0x00, 0xeb, 0x47, 0x07, 0xbf, 0x5f, 0x12, 0x72, 0x5c, 0x32, 0xe1, 0x6c, 0x73, 0x1a, 0xe2, 0x7f, 0x3a, 0x08, 0x93, 0x3f, 0xc0, 0x5a, 0x27, 0x23, 0x77, 0x52, 0x2b, 0x93, 0xf1, 0xc7, 0x69, 0x42, 0xe7, 0x1a, 0x0d, 0xbe, 0x7f, 0x6c, 0x06, 0x46, 0xce, 0x0e, 0xaf, 0xdb, 0x9c, 0x39, 0xaf, 0x99, 0x68, 0x00, 0x1e, 0x48, 0xac, 0x82, 0xe9, 0x2f, 0x63, 0x64, 0x77, 0x28, 0xc7, 0x7f, 0x8c, 0xfa, 0x5f, 0xd5, 0x6e, 0xe2, 0x39, 0xca, 0x47, 0x73, 0x75, 0x91, 0xcb, 0xa1, 0x03, 0xe4, 0x1a, 0x18, 0xac, 0xf8, 0xe8, 0xd2, 0x57, 0xb0, 0xdb, 0xe8, 0x85, 0x11, 0x34, 0xa8, 0x1f, 0xf6, 0xb2, 0xe9, 0x71, 0x04, 0xb3, 0x9b, 0x76, 0xe1, 0x9d, 0xa2, 0x56, 0xa1, 0x7c, 0xe5, 0x2d, 0x81, 0xed, 0xa1, 0x0e, 0xd8, 0x3a, 0x04, 0x48, 0x4a, 0xc6, 0xf7, 0xe7, 0x3f, 0xac, 0x3b, 0x7e, 0x93, 0xa3, 0xb7, 0x24, 0x90, 0x25, 0x10, 0xbd, 0x19, 0xd0, 0x7b, 0x7b, 0x27, 0x0c, 0xcf, 0xa4, 0x7a, 0xee, 0xdf, 0x95, 0x88, 0x5c, 0x06, 0x07, 0xba, 0x72, 0x03, 0x91, 0xd7, 0x25, 0x07, 0x6e, 0xc0, 0x26, 0x0d, 0x81, 0x5f, 0x09, 0x6a, 0x96, 0xda, 0xa7, 0xa5, 0xeb, 0x0c, 0xc1, 0x88, 0xef, 0x35, 0xe6, 0x77, 0x49, 0xf0, 0x96, 0x01, 0x1c, 0x66, 0xa7, 0xb5, 0x89, 0xc2, 0xe8, 0x37, 0x76, 0xe5, 0x05, 0x93, 0x8e, 0x5a, 0xaa, 0xd0, 0x89, 0x8c, 0xeb, 0xc9, 0xae, 0x36, 0xe4, 0x38, 0x96, 0x1c, 0x9c, 0x14, 0x32, 0xf9, 0x30, 0x1d, 0x10, 0xb8, 0x2d, 0xb5, 0xd9, 0xe6, 0x3d, 0xf1, 0x1f, 0x68, 0x06, 0xf0, 0x55, 0x69, 0x4f, 0x6b, 0x1f, 0x97, 0x64, 0x8e, 0xcd, 0x8f, 0xbc, 0x06, 0x21, 0x95, 0xda, 0x5c, 0x59, 0x89, 0x71, 0x81, 0x69, 0x16, 0xcb, 0xaa, 0x89, 0x2d, 0x6b, 0x5d, 0xef, 0xb2, 0xf2, 0xcc, 0xde, 0x75, 0x3f, 0x63, 0xdf, 0x63, 0xda, 0x9d, 0x4f, 0xfe, 0x93, 0x1b, 0x19, 0x0a, 0x66, 0xf7, 0xc5, 0x89, 0xa2, 0x56, 0xb2, 0xea, 0x4b, 0x3c, 0x9f, 0x7e, 0xbc, 0xa5, 0x70, 0x2b, 0x90, 0xd1, 0x2f, 0x64, 0xc3, 0xdf, 0x52, 0x58, 0x15, 0x9d, 0x3c, 0x6a, 0xaf, 0x9f, 0x06, 0xe2, 0x09, 0x8e, 0x7e, 0xe2, 0x0b, 0xc3, 0x70, 0x9b, 0x73, 0x14, 0x25, 0xc0, 0x76, 0xee, 0x2a, 0x3b, 0xaa, 0xa5, 0x52, 0x20, 0x23, 0x07, 0xfe, 0xdf, 0xdc, 0x37, 0x9c, 0xbd, 0x59, 0xb9, 0x6e, 0x85, 0x8b, 0xc9, 0x8d, 0x7a, 0xf4, 0xf1, 0x2d, 0x91, 0x0c, 0xda, 0x22, 0xdd, 0xe2, 0x63, 0xa4, 0x4b, 0x06, 0xf0, 0x4f, 0x8f, 0xa7, 0x04, 0x6d, 0x5e, 0xf9, 0x13, 0x78, 0xde, 0xd9, 0x91, 0xdb, 0x5b, 0xb4, 0x4f, 0xf9, 0x3b, 0xa5, 0x07, 0x70, 0x34, 0xdd, 0x36, 0x9f, 0xbc, 0x48, 0x29, 0x66, 0xc1, 0x6e, 0x5b, 0x2c, 0x9b, 0x97, 0xfe, 0x27, 0x3f, 0x32, 0xd8, 0xd7, 0xb5, 0x77, 0x50, 0xd4, 0xcc, 0x4c, 0xc9, 0xca, 0x0c, 0x65, 0x2e, 0xc2, 0xec, 0xb0, 0xce, 0xa3, 0x45, 0xf0, 0x6b, 0xf8, 0x07, 0xa7, 0x8d, 0xf3, 0x2b, 0x3a, 0x1c, 0xb2, 0xe8, 0x50, 0x2e, 0xc2, 0x2a, 0x7b, 0x1e, 0xe2, 0x40, 0x1a, 0xde, 0x09, 0xd4, 0x7e, 0x8e, 0xaa, 0x21, 0x4b, 0x4d, 0x36, 0x60, 0x21, 0x4f, 0xe3, 0x83, 0x7c, 0x2f, 0xac, 0x26, 0xd9, 0x87, 0x98, 0xc3, 0x1b, 0xbf, 0x40, 0x25, 0x2c, 0x22, 0x8b, 0x1f, 0xe7, 0x37, 0xbd, 0x7d, 0x36, 0x4e, 0xb0, 0x3b, 0x77, 0x59, 0x60, 0xf5, 0x25, 0xfd, 0xae, 0x9f, 0xb4, 0xe9, 0x5d, 0x76, 0xbc, 0x67, 0x61, 0x36, 0x5a, 0x30, 0x59, 0x8e, 0xd4, 0x85, 0x5a, 0xd1, 0x7b, 0x7b, 0xee, 0xee, 0xd6, 0x97, 0x5c, 0xa2, 0xfc, 0x9a, 0x2a, 0xec, 0x42, 0x9e, 0xe1, 0xc2, 0x16, 0x62, 0x10, 0x02, 0x2b, 0xe3, 0x93, 0xab, 0xd7, 0x2c, 0x15, 0x4d, 0xb9, 0x6e, 0xd4, 0xbe, 0x9e, 0x53, 0xa4, 0x0f, 0xa5, 0x90, 0x37, 0xbe, 0xa2, 0xba, 0x9b, 0x2d, 0xc1, 0x5a, 0x04, 0x53, 0x6c, 0x43, 0xcc, 0xb2, 0x6e, 0x23, 0xb8, 0x89, 0x58, 0x59, 0x7d, 0x4a, 0x23, 0x06, 0x83, 0x4e, 0x18, 0x67, 0xe8, 0xc8, 0xed, 0x62, 0xc8, 0xf8, 0x31, 0x5e, 0xbc, 0xa1, 0xea, 0x58, 0xa0, 0xbc, 0x7c, 0x33, 0x9a, 0x6e, 0xcc, 0x50, 0x57, 0x38, 0xa6, 0x5f, 0x98, 0x6e, 0x5c, 0x75, 0xee, 0xea, 0xb0, 0x5e, 0xc1, 0x01, 0xf4, 0x34, 0x97, 0xb6, 0x70, 0x30, 0x93, 0x2e, 0x04, 0xc1, 0x3c, 0x64, 0x0f, 0xdb, 0x81, 0x1e, 0x8f, 0x92, 0xf9, 0x20, 0x89, 0xe7, 0x6f, 0x9f, 0xab, 0xe2, 0x9d, 0xf8, 0x30, 0xe1, 0x38, 0xa2, 0x04, 0x2f, 0x2d, 0x61, 0x28, 0xd8, 0x2b, 0xbd, 0x59, 0xbc, 0x61, 0xb3, 0xec, 0xe3, 0x89, 0xaa, 0xfd, 0x10, 0x25, 0xa9, 0xc8, 0x99, 0x08, 0xc6, 0x57, 0x75, 0x19, 0xe2, 0x5e, 0x97, 0x54, 0x93, 0x63, 0x7a, 0x11, 0x62, 0x21, 0xfe, 0x89, 0x37, 0x2f, 0x72, 0x96, 0x11, 0xdd, 0xf2, 0xba, 0xfa, 0x5f, 0xf3, 0x63, 0x3b, 0x2d, 0x1c, 0x6d, 0xcc, 0xa9, 0x58, 0xe9, 0x0e, 0x02, 0x29, 0x1d, 0xbc, 0x59, 0x3f, 0xcb, 0x1f, 0x23, 0x49, 0xb7, 0x82, 0xcf, 0x0b, 0x63, 0xe6, 0xa8, 0xb0, 0x1d, 0xf7, 0xfc, 0x62, 0x3b, 0x3e, 0x7e, 0x19, 0xa6, 0x97, 0xe9, 0xb0, 0x95, 0xe6, 0xe6, 0x3e, 0x9b, 0x06, 0x30, 0xa3, 0xe4, 0x02, 0xf6, 0x61, 0xbc, 0x88, 0x81, 0xae, 0x50, 0x9a, 0x16, 0xc7, 0xb9, 0x87, 0x1e, 0x86, 0x36, 0x1a, 0x84, 0x37, 0xb9, 0x11, 0x5f, 0xa8, 0xa6, 0xd0, 0xd1, 0x7f, 0xd7, 0x57, 0x2e, 0xd0, 0xe3, 0x72, 0x61, 0xef, 0xa0, 0x2f, 0x8c, 0x83, 0xe6, 0x95, 0xef, 0xdc, 0x96, 0x93, 0x0b, 0x87, 0xdb, 0x37, 0x07, 0x1f, 0xb0, 0x21, 0x52, 0x65, 0xa3, 0x36, 0x8a, 0x93, 0xd8, 0x99, 0x9d, 0xee, 0x50, 0xd7, 0x2e, 0x9b, 0x6b, 0x61, 0x3a, 0xb3, 0xac, 0x40, 0xfb, 0x9a, 0xbd, 0x04, 0x0c, 0x8c, 0xb3, 0xfd, 0xcf, 0x78, 0x92, 0xae, 0x0c, 0x12, 0x14, 0x7f, 0xda, 0x24, 0xa6, 0xb2, 0xc3, 0x24, 0xb4, 0x98, 0x23, 0x0c, 0x26, 0x05, 0xd1, 0x66, 0x2b, 0x01, 0x01, 0xa6, 0x35, 0xc0, 0x69, 0xbd, 0x45, 0xd5, 0xa3, 0xeb, 0x68, 0xa2, 0xd3, 0xd5, 0x81, 0x13, 0x89, 0xd7, 0x4a, 0x8c, 0xe9, 0x9b, 0x96, 0x1f, 0x09, 0xeb, 0xd9, 0x03, 0x9a, 0xc3, 0xe9, 0x41, 0xcb, 0xab, 0x06, 0xb1, 0x6a, 0x43, 0x19, 0x25, 0x4c, 0x20, 0x39, 0xe4, 0xf0, 0xd6, 0x73, 0x5a, 0x5f, 0x56, 0xcb, 0x0d, 0x56, 0x7b, 0x7e, 0xd3, 0xa7, 0xdf, 0x8a, 0x43, 0xdd, 0xf3, 0x70, 0x69, 0x1f, 0x4f, 0x39, 0xbe, 0x57, 0x46, 0xb7, 0x56, 0x93, 0xbe, 0x0d, 0x5c, 0xab, 0x3e, 0x72, 0xbc, 0x24, 0x49, 0x31, 0x1f, 0x54, 0xeb, 0xf4, 0x1c, 0xc7, 0x91, 0x43, 0xac, 0xe2, 0x1e, 0x48, 0xdf, 0xc6, 0x3a, 0xd5, 0xce, 0x77, 0xed, 0xa8, 0xd1, 0x3e, 0x6e, 0xed, 0xf2, 0x4b, 0x35, 0x04, 0xa1, 0x9f, 0x57, 0x85, 0xa9, 0x29, 0x13, 0x81, 0x62, 0x2f, 0xa8, 0x0b, 0x28, 0xf0, 0x6a, 0xf7, 0x0d, 0x88, 0x15, 0xe2, 0xcb, 0x13, 0x61, 0x73, 0xfd, 0x15, 0xd7, 0xdf, 0x8e, 0x1a, 0xe2, 0xb3, 0x71, 0x99, 0x29, 0xce, 0x92, 0x1e, 0x1c, 0xac, 0x0d, 0xa8, 0xcd, 0xeb, 0x9f, 0x50, 0x02, 0x07, 0x59, 0x2c, 0x88, 0x69, 0x9c, 0x73, 0xca, 0xa0, 0x41, 0xe2, 0xa2, 0xee, 0x18, 0x5e, 0x6e, 0x06, 0x94, 0xda, 0x67, 0x14, 0xc4, 0x7b, 0x2e, 0xfe, 0x85, 0xfa, 0xa8, 0xe9, 0xf7, 0x4b, 0x0c, 0x00, 0x2d, 0x7c, 0x3a, 0x70, 0x29, 0xdf, 0x4f, 0xb7, 0x07, 0x6b, 0x76, 0x1f, 0x78, 0x60, 0x01, 0x85, 0x72, 0x2a, 0xb8, 0x5f, 0x26, 0x88, 0x70, 0xfe, 0x33, 0xed, 0xe0, 0x10, 0x19, 0x27, 0xb1, 0x68, 0xf0, 0x3e, 0xd4, 0x02, 0x5a, 0x9f, 0x18, 0x41, 0xb6, 0x79, 0xfc, 0x7c, 0x96, 0x68, 0xc1, 0xb9, 0x73, 0x51, 0xc4, 0xb8, 0xa0, 0x8d, 0x0b, 0x34, 0x7d, 0x49, 0x1e, 0x65, 0xed, 0x2c, 0x18, 0xc9, 0x0a, 0x3b, 0xfd, 0x24, 0x17, 0xfa, 0x4e, 0xc6, 0xb5, 0xd4, 0xdb, 0x0c, 0x5a, 0xbd, 0xd9, 0x29, 0x00, 0x16, 0x34, 0x26, 0x1a, 0xd1, 0x27, 0x28, 0xcc, 0xd5, 0x09, 0xf2, 0x5b, 0xa4, 0x6a, 0xaa, 0xe3, 0x3b, 0x5e, 0xe0, 0x48, 0x3a, 0x19, 0xcc, 0x6e, 0x44, 0xbc, 0xd7, 0xad, 0xa9, 0x6f, 0x5e, 0x7f, 0x42, 0xb0, 0xb2, 0x7c, 0x9d, 0xea, 0x63, 0x89, 0x5a, 0x4a, 0xbe, 0x4c, 0xd5, 0xce, 0x94, 0xe3, 0x06, 0x9f, 0x3d, 0xd5, 0xa5, 0xa0, 0xdd, 0x48, 0x91, 0x47, 0xe6, 0x75, 0x72, 0xac, 0xde, 0x5a, 0x9d, 0xdf, 0x63, 0xae, 0x39, 0x7f, 0x6c, 0x1a, 0xa0, 0x88, 0xd1, 0xa6, 0x08, 0x6d, 0x0e, 0x72, 0x63, 0x67, 0x44, 0xa6, 0x84, 0x0c, 0x80, 0xab, 0x82, 0x23, 0x40, 0x9c, 0x61, 0xb7, 0x33, 0xf7, 0xef, 0x6a, 0x41, 0x99, 0xed, 0x0c, 0xcb, 0xe9, 0x6f, 0x6c, 0x34, 0x53, 0x86, 0x6e, 0xa0, 0xf8, 0x1b, 0x5e, 0xfb, 0xa3, 0x1e, 0x84, 0x3e, 0xff, 0xe1, 0xf9, 0xed, 0x08, 0xbe, 0xb9, 0xe4, 0xc0, 0x00, 0xf8, 0x54, 0x23, 0x01, 0xba, 0x09, 0x5c, 0x8f, 0x9e, 0xee, 0x39, 0x94, 0xfa, 0xd2, 0xdd, 0xf6, 0x2d, 0x6c, 0xb5, 0xbd, 0x31, 0x9d, 0xad, 0x74, 0x70, 0xf6, 0xa3, 0xd1, 0xd9, 0x7a, 0x1b, 0x98, 0x32, 0xa5, 0x35, 0xbc, 0xb0, 0xad, 0xdd, 0xc7, 0xc5, 0x07, 0x42, 0x7d, 0x39, 0x2d, 0x89, 0xbc, 0x7c, 0x9f, 0xc2, 0xa7, 0x3b, 0x27, 0x1b, 0x04, 0x31, 0x62, 0x53, 0xe1, 0x40, 0x7c, 0x72, 0x7e, 0xc0, 0x3b, 0xb8, 0x67, 0x17, 0x3f, 0xd3, 0xe1, 0x89, 0x88, 0x55, 0x87, 0x52, 0x38, 0x64, 0x35, 0xf2, 0x9a, 0xb3, 0x25, 0xc9, 0x64, 0xb2, 0x58, 0xe3, 0x39, 0x02, 0x38, 0x15, 0x72, 0x2c, 0x7b, 0x49, 0x1e, 0x92, 0x4a, 0x16, 0x47, 0xa6, 0xa3, 0x94, 0x78, 0x59, 0xfc, 0x6e, 0x7b, 0xd7, 0x29, 0x38, 0x67, 0x71, 0x7f, 0x03, 0xdb, 0xda, 0x3a, 0x2f, 0x84, 0x97, 0x1c, 0x81, 0xe5, 0xb1, 0x57, 0x75, 0x57, 0xad, 0xad, 0xd6, 0x4e, 0xbd, 0xd6, 0x8b, 0xdf, 0x38, 0x22, 0xb4, 0x7f, 0x48, 0x5f, 0xf6, 0x0e, 0xe3, 0xfd, 0x12, 0x14, 0xfc, 0x70, 0xbd, 0x4a, 0xfa, 0xd6, 0xac, 0x5c, 0x69, 0xda, 0xee, 0xed, 0xef, 0xd8, 0x7e, 0xdb, 0x82, 0x42, 0x19, 0xc5, 0xd9, 0x42, 0x4d, 0xcb, 0x20, 0xa0, 0xd3, 0x95, 0xf0, 0xe7, 0x1e, 0x97, 0x7e, 0xc3, 0x34, 0x93, 0x13, 0xae, 0xbd, 0x5f, 0xbc, 0xcb, 0x59, 0xe8, 0x42, 0x12, 0x37, 0x77, 0x5c, 0xae, 0xe4, 0x33, 0x24, 0xa3, 0x60, 0xe8, 0xc8, 0xb4, 0x77, 0x06, 0x82, 0x84, 0x4e, 0xed, 0xca, 0xfb, 0x3d, 0x67, 0xca, 0xeb, 0xdc, 0x76, 0x12, 0xf4, 0x61, 0x51, 0x8d, 0xa5, 0x29, 0xa9, 0xb3, 0xe3, 0x94, 0x30, 0x01, 0x8f, 0x16, 0x5c, 0xa6, 0x63, 0x8b, 0x68, 0x80, 0x1d, 0xcb, 0x9d, 0x46, 0xe0, 0x7f, 0xcf, 0x07, 0xd7, 0x33, 0x2a, 0xd3, 0x1b, 0xac, 0x2f, 0xb8, 0xd7, 0x7b, 0xf9, 0xf0, 0xaa, 0xd2, 0xc5, 0x58, 0x4c, 0x97, 0xb1, 0x24, 0x75, 0xb7, 0xc4, 0xd1, 0xfa, 0xbd, 0x2f, 0x5c, 0x39, 0xa3, 0xd2, 0xb2, 0xb8, 0xe7, 0x02, 0x67, 0x09, 0xe2, 0x8a, 0xaa, 0xf1, 0x56, 0xef, 0x79, 0xc9, 0x46, 0xf9, 0x11, 0x23, 0x0a, 0x6e, 0xa9, 0xb1, 0xa2, 0x21, 0x5f, 0x63, 0x4b, 0x2b, 0x73, 0xd0, 0x50, 0x79, 0xb3, 0xd7, 0x23, 0x87, 0x36, 0x86, 0xac, 0x6a, 0x4d, 0x3a, 0xe1, 0x14, 0xb7, 0x08, 0x97, 0xd4, 0x14, 0x5c, 0x97, 0x1c, 0x9c, 0xe0, 0xf5, 0x87, 0x11, 0xa0, 0x9d, 0x1a, 0xf2, 0x6b, 0x2f, 0xcb, 0xf2, 0x7c, 0x0d, 0x3f, 0xa9, 0x5a, 0xb2, 0xd8, 0x88, 0xfc, 0x45, 0xef, 0x12, 0x31, 0x6d, 0x5e, 0x49, 0x3f, 0x68, 0x42, 0x67, 0xca, 0x57, 0xff, 0xcf, 0xf8, 0xdc, 0x84, 0x43, 0xd3, 0xe7, 0xd0, 0x57, 0xef, 0xcd, 0xb4, 0x26, 0x4c, 0x9b, 0xdb, 0x43, 0x7d, 0xa9, 0x09, 0xf3, 0x0a, 0x72, 0xa0, 0x99, 0x14, 0xa2, 0x68, 0x71, 0x37, 0x71, 0x8f, 0x81, 0xb5, 0x30, 0xef, 0xcd, 0xd0, 0x21, 0x90, 0xcb, 0x77, 0x8c, 0x6e, 0x16, 0x25, 0x0f, 0x7c, 0x66, 0x07, 0x36, 0xe8, 0xc0, 0x5d, 0x4c, 0xa1, 0xea, 0x22, 0x70, 0x17, 0x22, 0xef, 0xeb, 0x42, 0x0f, 0x1d, 0xc0, 0xe5, 0xf8, 0x2a, 0x85, 0x14, 0x34, 0x5d, 0x72, 0xf4, 0xe2, 0xad, 0xb8, 0xc2, 0xda, 0xe0, 0x13, 0x16, 0xe3, 0xf0, 0xa3, 0x69, 0x26, 0xb2, 0xf8, 0xd5, 0xe2, 0xb9, 0x6c, 0x1d, 0x62, 0x79, 0xb5, 0xed, 0x2c, 0xa8, 0xba, 0x63, 0x7c, 0xea, 0xa6, 0xcd, 0xf0, 0xac, 0x3b, 0xb5, 0x85, 0x50, 0x6a, 0x1b, 0xc2, 0x8b, 0x20, 0x01, 0x33, 0x0c, 0x62, 0x2d, 0x19, 0x5f, 0x9c, 0x2a, 0x60, 0x10, 0x36, 0x90, 0xd1, 0x13, 0x69, 0x85, 0x89, 0x63, 0x51, 0x84, 0xaa, 0xea, 0x43, 0x5d, 0x50, 0xa1, 0x60, 0x7d, 0xc7, 0xf8, 0x6a, 0x70, 0xfb, 0x78, 0xd7, 0xa4, 0x2f, 0xa7, 0x24, 0x70, 0xf2, 0x2c, 0x6c, 0x54, 0x4f, 0x33, 0x39, 0x83, 0x45, 0x13, 0x9a, 0x9e, 0x77, 0x2e, 0x76, 0xc3, 0x23, 0x19, 0x1f, 0xc6, 0x58, 0xfe, 0x2a, 0xbe, 0x64, 0x3e, 0x7f, 0xc4, 0x8c, 0x5a, 0xac, 0xf7, 0x01, 0x13, 0x7f, 0xc4, 0x0f, 0xd0, 0xd3, 0x64, 0x96, 0x41, 0xaa, 0xa5, 0xbe, 0x42, 0x7c, 0xee, 0xe7, 0x02, 0xcf, 0x7d, 0xdf, 0x64, 0x08, 0xf4, 0x58, 0xa5, 0x81, 0x14, 0x99, 0x40, 0xdb, 0xc8, 0x73, 0x0e, 0x96, 0x65, 0x77, 0xb2, 0xde, 0x30, 0x66, 0x34, 0xa8, 0x21, 0xe9, 0xec, 0xfe, 0xe6, 0x82, 0xa2, 0x97, 0x2b, 0xc3, 0xf3, 0xab, 0x19, 0xbe, 0xf6, 0x05, 0x1c, 0xbc, 0x20, 0x5a, 0xea, 0x32, 0x65, 0xd9, 0xc1, 0xf0, 0xa0, 0x03, 0xef, 0x9c, 0x35, 0xbd, 0x98, 0x5f, 0xf5, 0xa4, 0xb4, 0xde, 0x42, 0xa0, 0x57, 0x6c, 0x73, 0xbc, 0x35, 0x7d, 0x7a, 0x35, 0x65, 0x5e, 0xc3, 0xd0, 0x65, 0x24, 0x60, 0x71, 0x5f, 0xe3, 0x64, 0xea, 0xaa, 0x20, 0x8c, 0x11, 0x94, 0x88, 0x25, 0x15, 0x5f, 0xe2, 0x29, 0x12, 0x89, 0x42, 0xac, 0xe2, 0x51, 0x7f, 0x76, 0x37, 0x76, 0xe8, 0xf2, 0xe6, 0x42, 0x33, 0x47, 0x86, 0xc7, 0xb6, 0xc4, 0x3a, 0x69, 0xda, 0x81, 0xcb, 0x9c, 0xcc, 0x43, 0xfa, 0xef, 0x75, 0xa1, 0x14, 0x4a, 0xad, 0x65, 0xc6, 0x73, 0xab, 0x35, 0x33, 0xd7, 0xc0, 0x73, 0x44, 0x88, 0x46, 0x61, 0x3f, 0x82, 0xd3, 0x89, 0x9c, 0x32, 0xb2, 0x5c, 0x14, 0x39, 0x93, 0x19, 0xfa, 0x6d, 0x81, 0xf0, 0xce, 0x20, 0x15, 0x68, 0x10, 0xa6, 0xe9, 0xfe, 0x52, 0x11, 0x50, 0x0e, 0x91, 0x3f, 0x44, 0xf7, 0xc5, 0x17, 0xa0, 0x7b, 0xb7, 0x0f, 0x90, 0x64, 0x13, 0xf1, 0x45, 0x6d, 0xbe, 0xe0, 0xed, 0x5f, 0x69, 0x96, 0xe2, 0x7b, 0x67, 0xef, 0x21, 0x18, 0xbb, 0xab, 0xff, 0x8d, 0x76, 0x6f, 0x17, 0x51, 0x40, 0x0e, 0x87, 0x61, 0x34, 0x07, 0x5c, 0xe2, 0xf1, 0x4f, 0x4a, 0x08, 0xed, 0x50, 0xa1, 0x36, 0x0d, 0x31, 0x7c, 0x67, 0x73, 0x58, 0x3b, 0xcc, 0x98, 0x2d, 0x34, 0xb6, 0x9a, 0x21, 0xa6, 0xb7, 0xd7, 0xf0, 0xee, 0x04, 0xba, 0x22, 0xfe, 0x1e, 0xd5, 0xd8, 0x0a, 0xb2, 0x30, 0xc5, 0x84, 0xbd, 0xe1, 0x7b, 0x4b, 0xf3, 0xdd, 0xe8, 0x20, 0x62, 0x0e, 0x20, 0x59, 0x53, 0xa6, 0x5d, 0xd9, 0x71, 0xb2, 0x43, 0x3f, 0x2d, 0xf2, 0x69, 0x5e, 0x60, 0xe8, 0x16, 0xee, 0x32, 0x2f, 0x48, 0x80, 0x3c, 0x0e, 0xfb, 0xb8, 0xe9, 0x4d, 0xa7, 0xb6, 0x22, 0x47, 0x0b, 0xd5, 0x2a, 0x41, 0x29, 0x98, 0xc6, 0xfa, 0x92, 0xe1, 0xa2, 0x83, 0xe3, 0x64, 0xf0, 0x51, 0x90, 0x5c, 0x52, 0x91, 0xe0, 0x7c, 0xfa, 0xbb, 0x39, 0x29, 0x0f, 0x6a, 0x9e, 0xe6, 0x53, 0x6b, 0x76, 0x10, 0x04, 0x14, 0x8f, 0xcb, 0x00, 0xd7, 0x62, 0x3c, 0x2c, 0x17, 0x99, 0xf9, 0x15, 0x39, 0xce, 0xbd, 0xd8, 0xff, 0x96, 0x61, 0x40, 0x11, 0xbe, 0x07, 0x2f, 0xdd, 0xd4, 0x99, 0x3f, 0xa1, 0xe9, 0x72, 0xa8, 0xc6, 0x96, 0x5a, 0x65, 0x70, 0x3d, 0xb8, 0x92, 0x53, 0x91, 0x03, 0x19, 0xc8, 0x59, 0x7a, 0x8d, 0x20, 0x71, 0x15, 0x56, 0x38, 0x11, 0xbb, 0x0f, 0x4d, 0x51, 0xb5, 0x2c, 0x12, 0xed, 0x63, 0xe0, 0x00, 0x46, 0x2d, 0x3e, 0xee, 0xaa, 0xbd, 0x9e, 0xe1, 0xd5, 0x6b, 0x42, 0x25, 0xb8, 0xf9, 0x39, 0x9d, 0x79, 0x81, 0x84, 0x57, 0xba, 0xab, 0x78, 0x63, 0x1e, 0x23, 0x63, 0xe6, 0x09, 0x4b, 0x72, 0x6a, 0xa8, 0x2d, 0xd2, 0x78, 0x32, 0xb3, 0x16, 0x69, 0x6d, 0x1a, 0xd9, 0x79, 0x73, 0xa4, 0xa4, 0x1d, 0xb6, 0x8d, 0x12, 0x97, 0x42, 0x41, 0x31, 0xc7, 0x42, 0xcc, 0x2c, 0x44, 0xc6, 0x92, 0x27, 0xab, 0xc3, 0x40, 0x6b, 0x37, 0x5b, 0x02, 0xc3, 0x92, 0x5f, 0xf7, 0x25, 0xeb, 0x13, 0xe2, 0x95, 0x49, 0x31, 0x22, 0x47, 0x1f, 0x30, 0xe4, 0x04, 0x20, 0xc5, 0x97, 0xce, 0x54, 0xab, 0xa0, 0xc7, 0x6c, 0xa0, 0x4f, 0x4f, 0x53, 0xb0, 0x12, 0x6d, 0x05, 0xb5, 0xe9, 0x70, 0xa4, 0x1f, 0x1a, 0xd6, 0xc9, 0xf1, 0x26, 0x6c, 0x18, 0x0c, 0xfb, 0xb7, 0x17, 0xb0, 0x6b, 0x93, 0x40, 0x40 ],
+    const [ 0x92, 0x98, 0x35, 0x01, 0xa4, 0xd7, 0x58, 0x3a, 0x52, 0x01, 0x83, 0x02, 0x66, 0xc3, 0x7c, 0x90, 0x86, 0x40, 0xb0, 0x35, 0x14, 0x61, 0x31, 0x4b, 0x52, 0x6c, 0xfb, 0x68, 0xca, 0xd9, 0x7b, 0xd7, 0xed, 0x61, 0x52, 0x48, 0xfa, 0x57, 0x56, 0xc6, 0x21, 0x3b, 0xd9, 0xea, 0xe9, 0x8d, 0x2f, 0x4e, 0xcf, 0xdf, 0x6a, 0x45, 0x2f, 0x2e, 0x68, 0xc9, 0x68, 0x72, 0x10, 0xb5, 0x3c, 0x74, 0xd8, 0x35, 0x75, 0xe0, 0x8a, 0x7a, 0xce, 0x9b, 0x49, 0xb2, 0x10, 0x56, 0xcf, 0x37, 0x7c, 0x64, 0xf8, 0x06, 0x69, 0xc8, 0x84, 0x74, 0x2e, 0x93, 0x18, 0x1c, 0x42, 0x6d, 0x87, 0x1c, 0xa2, 0x71, 0x50, 0x81, 0x73, 0x3e, 0x68, 0xff, 0xe9, 0x4a, 0x39, 0xe6, 0x67, 0x7a, 0xea, 0x51, 0xe8, 0xf0, 0xe1, 0xa0, 0x9d, 0x25, 0x86, 0x29, 0xd7, 0x37, 0x4a, 0x2b, 0x28, 0x84, 0xe9, 0x03, 0xc5, 0x77, 0xeb, 0xa3, 0x2f, 0xa2, 0x71, 0x3f, 0x13, 0x0d, 0x2e, 0x49, 0x6e, 0xce, 0xb4, 0xa0, 0xf4, 0xda, 0xf1, 0x05, 0xb3, 0x1b, 0xf9, 0xce, 0xf4, 0xc3, 0x06, 0xde, 0x62, 0xdf, 0xbc, 0xd4, 0x6e, 0x2f, 0xb2, 0x83, 0xf1, 0x35, 0x2f, 0xa3, 0x13, 0x8c, 0x31, 0xc5, 0x6d, 0x7b, 0xb4, 0x8d, 0x6a, 0xca, 0x30, 0x1b, 0xf3, 0xd4, 0x64, 0xca, 0x4b, 0xde, 0x52, 0x1d, 0x37, 0xa7, 0x8b, 0xf6, 0x63, 0x40, 0xac, 0x09, 0x01, 0x1e, 0x29, 0x91, 0xb3, 0x6e, 0x49, 0x41, 0xab, 0xa8, 0x72, 0x7e, 0x10, 0x67, 0xa7, 0xcb, 0xa4, 0x78, 0x4f, 0x85, 0xa5, 0x31, 0x38, 0xd0, 0xf1, 0x04, 0xdb, 0xd1, 0x6d, 0x54, 0xe2, 0x1e, 0xa6, 0x86, 0xe7, 0x72, 0xb9, 0x5c, 0x7f, 0xa6, 0x71, 0x7e, 0x77, 0xdc, 0xb0, 0x5a, 0x5d, 0xfe, 0x10, 0x2e, 0x42, 0x67, 0xc9, 0x63, 0xbf, 0xdf, 0xd6, 0x1d, 0x36, 0xcd, 0x53, 0x10, 0x5a, 0xa8, 0x2a, 0x95, 0xf2, 0xaf, 0xee, 0xfd, 0xda, 0xda, 0x07, 0x25, 0x4a, 0x10, 0x10, 0x4a, 0x5a, 0x9a, 0x7d, 0x1f, 0xc6, 0xd8, 0x81, 0x1d, 0xef, 0x32, 0x2f, 0x1b, 0x23, 0x52, 0xdf, 0x1e, 0x1e, 0x90, 0xd3, 0x72, 0xd1, 0xae, 0x1a, 0xfa, 0x62, 0xc6, 0xb5, 0xc4, 0x73, 0x80, 0xf9, 0xe0, 0xa7, 0x88, 0x34, 0x73, 0x62, 0x40, 0x93, 0x07, 0xd1, 0xb2, 0x43, 0x25, 0x2b, 0xc8, 0xd7, 0x26, 0x36, 0xbf, 0xea, 0x46, 0x0c, 0xd9, 0x05, 0xfa, 0x1f, 0x52, 0xc3, 0x84, 0x7b, 0x96, 0x32, 0xc4, 0x4b, 0xb1, 0x7d, 0x51, 0x9f, 0x07, 0xc8, 0xc8, 0x6c, 0x45, 0x5c, 0x64, 0xd4, 0x97, 0x04, 0xcf, 0xa8, 0x1c, 0xb6, 0x38, 0x2c, 0x97, 0x76, 0xa6, 0x1a, 0x67, 0x78, 0x8c, 0xe9, 0xb9, 0x85, 0x9d, 0x4e, 0xfc, 0x9f, 0xe1, 0x04, 0x95, 0xe8, 0x09, 0xc9, 0xd4, 0xc0, 0x00, 0xa9, 0x27, 0x2e, 0xc2, 0x7e, 0x8e, 0x81, 0x71, 0xb8, 0x4f, 0x37, 0xa6, 0x5a, 0xeb, 0x1d, 0x05, 0x45, 0x50, 0xb8, 0x14, 0xb9, 0x50, 0xe4, 0x4d, 0x19, 0x52, 0xbb, 0x71, 0xee, 0x48, 0xb8, 0x20, 0x2f, 0xe1, 0x1c, 0xa7, 0xc0, 0xff, 0x91, 0x19, 0x38, 0x6b, 0x0e, 0xa1, 0xe7, 0xc8, 0xfa, 0x16, 0x18, 0xc5, 0x94, 0xd0, 0x93, 0x97, 0x92, 0xba, 0x66, 0xa7, 0x08, 0xa9, 0xe5, 0x87, 0x8c, 0xec, 0xf0, 0x2b, 0x98, 0x25, 0x74, 0x56, 0x30, 0x57, 0x34, 0x52, 0xc4, 0x3f, 0xca, 0xe4, 0x57, 0xe8, 0xe8, 0x7f, 0xe1, 0x7a, 0xe4, 0xb8, 0xf2, 0x52, 0x74, 0xfa, 0x99, 0x58, 0xb6, 0x7b, 0x84, 0x8d, 0x73, 0x6e, 0x68, 0xe4, 0xa4, 0x7b, 0xa4, 0x53, 0x35, 0x6c, 0x21, 0x29, 0x0a, 0x29, 0x7c, 0xa2, 0x40, 0xe6, 0x67, 0xb9, 0xb5, 0x9b, 0x4c, 0x3d, 0xca, 0xb4, 0x34, 0x27, 0x67, 0x0a, 0xe8, 0x2b, 0x40, 0x13, 0x55, 0x8d, 0x57, 0x55, 0x35, 0x36, 0xc2, 0x21, 0xec, 0x07, 0xaf, 0x7d, 0xb0, 0x6d, 0xa5, 0x62, 0xed, 0x36, 0x0d, 0x28, 0xe8, 0xa3, 0xf0, 0x3e, 0xa2, 0xbe, 0x02, 0x1e, 0xff, 0xed, 0xe0, 0x80, 0x27, 0xc8, 0x96, 0xce, 0x2d, 0x28, 0x64, 0xd9, 0xef, 0x80, 0xc2, 0xca, 0x3d, 0x71, 0xa1, 0x5b, 0x3d, 0x98, 0xf4, 0x47, 0x0d, 0xab, 0x6f, 0xfe, 0xab, 0xc4, 0x8e, 0x9e, 0x12, 0xfc, 0xda, 0x1f, 0xa6, 0x3c, 0x68, 0xcd, 0xd2, 0x50, 0xa2, 0xfc, 0xf0, 0x3d, 0x49, 0xf7, 0x69, 0xd5, 0xbb, 0x39, 0x1d, 0x88, 0x72, 0xe0, 0x05, 0x7d, 0xce, 0x5e, 0x16, 0xe2, 0x14, 0x72, 0x69, 0x80, 0xb6, 0x57, 0x9a, 0x92, 0xd5, 0x3b, 0x6e, 0xd7, 0x04, 0xf2, 0xb8, 0xe6, 0x4f, 0xec, 0x7d, 0xc2, 0x7c, 0x64, 0x56, 0xae, 0x90, 0xdb, 0x16, 0x42, 0x95, 0xc5, 0xad, 0xbf, 0x9b, 0x82, 0x4c, 0xa0, 0xfd, 0x8f, 0xca, 0x71, 0xe5, 0xfe, 0x47, 0xe4, 0x12, 0x23, 0x0f, 0x22, 0xd9, 0x91, 0xc0, 0x5f, 0x6a, 0x45, 0xb0, 0xb1, 0x55, 0x20, 0x89, 0x22, 0x4d, 0x9b, 0x36, 0x04, 0x2b, 0xb6, 0x03, 0x84, 0x36, 0x31, 0xff, 0x82, 0xa1, 0xff, 0xa5, 0xa0, 0x55, 0xf8, 0xbc, 0x99, 0xf1, 0xce, 0x7c, 0xd5, 0x0f, 0x42, 0xf2, 0x3a, 0xca, 0x97, 0xa6, 0x44, 0x7d, 0x47, 0x7a, 0x58, 0xcc, 0xf6, 0xd5, 0x55, 0xe9, 0xa4, 0x01, 0x6d, 0x10, 0x26, 0xd2, 0x33, 0x54, 0xd7, 0x89, 0xf4, 0x9e, 0x8b, 0xf7, 0x4b, 0xf3, 0xc4, 0xe6, 0xf0, 0xf5, 0x29, 0xb4, 0xd1, 0xad, 0x33, 0x41, 0x64, 0x87, 0x2a, 0x0c, 0x3b, 0x9e, 0x50, 0x98, 0xd9, 0x3a, 0x5c, 0x15, 0xc4, 0x97, 0x29, 0x3c, 0xdb, 0xe9, 0xb0, 0x7b, 0xea, 0x9c, 0x34, 0x52, 0x7c, 0xe0, 0xbc, 0xfd, 0xf0, 0x65, 0xc6, 0x53, 0xcf, 0x63, 0x3a, 0xee, 0x5d, 0xde, 0x9d, 0x8c, 0x6e, 0x28, 0x87, 0xb5, 0x7b, 0xa7, 0x57, 0x9e, 0xf5, 0xd8, 0x25, 0x4e, 0xd9, 0x94, 0xf8, 0xff, 0x85, 0x93, 0x39, 0xc7, 0xca, 0x2e, 0x68, 0x77, 0x42, 0x69, 0x0e, 0xc4, 0xe4, 0x30, 0xf3, 0xa4, 0xd5, 0xe1, 0x90, 0xfb, 0x81, 0x0b, 0xc7, 0x77, 0xeb, 0x76, 0xd2, 0xb8, 0x41, 0x63, 0x7a, 0xb5, 0xb4, 0x14, 0x89, 0x5b, 0x87, 0x8f, 0x81, 0x77, 0x65, 0xa0, 0x8e, 0xd5, 0xf7, 0x1d, 0xba, 0xa9, 0xb6, 0x6d, 0x60, 0x2f, 0xfe, 0x4b, 0xe3, 0x8f, 0x64, 0xc8, 0x9f, 0x03, 0x4a, 0x8f, 0x20, 0x3b, 0xb1, 0x6d, 0x92, 0x01, 0x4e, 0x11, 0x79, 0x19, 0xdf, 0x10, 0xa3, 0x6b, 0xbf, 0x2c, 0x5a, 0x64, 0xb8, 0xd5, 0xde, 0x99, 0x19, 0xf0, 0x12, 0xad, 0x09, 0xd8, 0x75, 0x75, 0x1b, 0xa2, 0x54, 0x5b, 0x23, 0xa6, 0x3e, 0x00, 0x47, 0x3a, 0xb9, 0x26, 0x59, 0xc1, 0x33, 0xcc, 0x64, 0xe5, 0x3b, 0x9a, 0x84, 0x20, 0xf1, 0x80, 0xfb, 0x81, 0xbb, 0x9b, 0x82, 0xad, 0x3a, 0x58, 0xdd, 0x24, 0x7d, 0xdb, 0xb2, 0xc5, 0x74, 0xa2, 0x9b, 0x95, 0xa7, 0x65, 0x7a, 0xbc, 0x27, 0x41, 0x0d, 0xd0, 0xc5, 0x16, 0xc2, 0x56, 0x83, 0x2e, 0xcc, 0x86, 0x48, 0x1f, 0x76, 0x4f, 0xd8, 0xf2, 0xb7, 0x9b, 0x02, 0x84, 0x07, 0xd4, 0x1c, 0x2d, 0x72, 0xa7, 0xac, 0xa0, 0xeb, 0x08, 0x68, 0x12, 0xe2, 0x76, 0x61, 0x9f, 0x19, 0x80, 0x7b, 0xe9, 0xb3, 0x88, 0x20, 0x02, 0x8e, 0xc7, 0x35, 0x8c, 0xd2, 0x91, 0x4d, 0x1e, 0xca, 0xda, 0x1d, 0xea, 0xf3, 0xfa, 0x31, 0x9d, 0x53, 0xad, 0xdd, 0x87, 0x0c, 0x5e, 0x75, 0xfc, 0x31, 0xa5, 0xc0, 0xfa, 0xd8, 0x0e, 0xab, 0x0b, 0x71, 0x1c, 0x3b, 0x6d, 0x56, 0x8d, 0xc5, 0x71, 0xa3, 0xe0, 0x61, 0x21, 0x47, 0x15, 0x9c, 0x25, 0x5b, 0xb4, 0x6d, 0xe8, 0xb3, 0x10, 0x6b, 0xf6, 0xb3, 0xcd, 0x3c, 0xa9, 0x64, 0xa0, 0x51, 0x04, 0xc7, 0x56, 0xd0, 0xdf, 0x6a, 0x18, 0xd2, 0x44, 0x38, 0xed, 0xcf, 0x1a, 0x95, 0x80, 0x56, 0x00, 0xab, 0x24, 0x02, 0x7c, 0xfe, 0x15, 0xa9, 0x55, 0x47, 0x00, 0xd6, 0x3d, 0x7f, 0xc6, 0x7a, 0xb3, 0x3a, 0x7e, 0xde, 0x28, 0x36, 0xb9, 0xdc, 0x61, 0x34, 0x09, 0x4f, 0x1c, 0x06, 0xc4, 0xc8, 0xf6, 0xea, 0x05, 0x83, 0x8c, 0x16, 0xf4, 0x99, 0xe1, 0x94, 0x47, 0x76, 0x00, 0x50, 0x09, 0x8e, 0xe2, 0x70, 0x9a, 0x4c, 0x91, 0xe3, 0xf8, 0x4b, 0x8e, 0x3d, 0x3c, 0xc9, 0x70, 0xc2, 0x68, 0x59, 0xcf, 0xc0, 0x5f, 0xd7, 0x60, 0x23, 0x35, 0xa1, 0x61, 0x43, 0xa9, 0x04, 0x38, 0x00, 0xf0, 0xf5, 0x57, 0x11, 0xb5, 0x02, 0x62, 0x99, 0x5d, 0x88, 0x94, 0xfb, 0x8f, 0x25, 0x5f, 0xf0, 0xf4, 0x70, 0x52, 0xd7, 0x3b, 0xe8, 0x40, 0x4c, 0x61, 0x2b, 0x9f, 0xfb, 0x2f, 0x69, 0x2e, 0xb6, 0x04, 0x17, 0xdb, 0xc6, 0xd4, 0xe8, 0xe3, 0x7f, 0x71, 0xf9, 0x3b, 0x18, 0x09, 0x4b, 0x2f, 0xb9, 0xf0, 0x77, 0x49, 0xd4, 0xa0, 0x9d, 0x74, 0xb9, 0xff, 0x9e, 0x61, 0x65, 0xe0, 0x8b, 0x2a, 0x9b, 0xcb, 0x5d, 0x35, 0x37, 0x01, 0xe6, 0x5c, 0xbe, 0xbb, 0x07, 0x4a, 0x39, 0xb3, 0x24, 0x28, 0x44, 0xe5, 0xd5, 0x7a, 0x62, 0x97, 0xde, 0x43, 0x93, 0x97, 0x62, 0x70, 0x29, 0xc4, 0x53, 0x73, 0xd7, 0xcf, 0x2d, 0x2f, 0x0b, 0x43, 0xe4, 0x14, 0x7d, 0xc3, 0x1a, 0x8b, 0x08, 0x93, 0x96, 0x94, 0xba, 0x5b, 0xf2, 0xad, 0x27, 0x27, 0x93, 0xf7, 0x02, 0xb1, 0xdf, 0x94, 0xee, 0xe3, 0xa9, 0x53, 0x91, 0x98, 0xf0, 0x8f, 0xea, 0xa3, 0xca, 0x54, 0xe5, 0x12, 0x9b, 0xc4, 0x2d, 0xb4, 0x8a, 0xb9, 0x42, 0xd8, 0x36, 0xac, 0xcb, 0x58, 0xa4, 0xd6, 0x2d, 0xd6, 0x7d, 0x94, 0x5c, 0x46, 0x76, 0x10, 0xf2, 0xac, 0x0f, 0x1e, 0x7e, 0x27, 0x80, 0x64, 0x1e, 0x2f, 0xf0, 0xbe, 0x50, 0x1b, 0xe9, 0xe1, 0x05, 0xe6, 0x09, 0x3e, 0xf7, 0x32, 0xfa, 0x29, 0x3d, 0x8d, 0xa4, 0x3a, 0x1c, 0xf4, 0xa0, 0xf3, 0x21, 0x95, 0xf0, 0xa4, 0x6c, 0xd9, 0xee, 0x8c, 0x4f, 0xa2, 0x83, 0x41, 0x18, 0xd2, 0x99, 0x52, 0x2a, 0x0c, 0xd3, 0x2a, 0x53, 0xbe, 0x7b, 0x37, 0x59, 0x5f, 0xbc, 0x4c, 0xd6, 0xf5, 0x11, 0x44, 0x46, 0xdb, 0xfd, 0xe9, 0x5f, 0xc1, 0xfd, 0x14, 0xa1, 0xf4, 0xbb, 0x15, 0x2d, 0xe0, 0x84, 0x54, 0xda, 0xd3, 0xfc, 0x39, 0x86, 0x03, 0x10, 0x4a, 0xaa, 0xd3, 0x2d, 0x93, 0x31, 0x52, 0xaf, 0x4b, 0x8b, 0x04, 0x9d, 0xb4, 0xfd, 0xe6, 0x93, 0x43, 0x3b, 0xac, 0xff, 0x01, 0x38, 0x4d, 0x90, 0x31, 0x3d, 0xc1, 0xec, 0x33, 0x39, 0x09, 0xa2, 0xa8, 0x58, 0x71, 0x5f, 0xd7, 0xd6, 0x12, 0x64, 0x50, 0x16, 0x9a, 0x37, 0xce, 0xee, 0x50, 0x99, 0x62, 0x45, 0x52, 0xb9, 0xce, 0xe1, 0x21, 0xa7, 0x2f, 0x7a, 0x60, 0x0b, 0xe0, 0x13, 0xd9, 0x17, 0x9a, 0x8a, 0xc1, 0xba, 0xe0, 0x6d, 0x3d, 0x17, 0x9a, 0x0f, 0x25, 0x35, 0x00, 0xdb, 0x07, 0xf8, 0xb9, 0xe9, 0x6f, 0x50, 0x44, 0xcf, 0x65, 0xb0, 0x98, 0xba, 0x38, 0xc2, 0x07, 0xbd, 0x7a, 0x59, 0x68, 0x68, 0x4c, 0xa7, 0x75, 0x9d, 0xdc, 0xb0, 0x72, 0x9f, 0x2b, 0xfe, 0x10, 0x6c, 0x14, 0x96, 0x90, 0x4d, 0x8a, 0x2c, 0x2b, 0xab, 0x21, 0x93, 0xb2, 0x24, 0xcf, 0x77, 0x72, 0xde, 0xf4, 0x4e, 0x5a, 0x1b, 0x99, 0x8c, 0x60, 0x0e, 0xf5, 0x16, 0x20, 0xee, 0x36, 0xfa, 0xc6, 0x48, 0x7e, 0x5d, 0x2f, 0x99, 0x2b, 0xb5, 0x4b, 0x1c, 0x5b, 0x38, 0xc6, 0xe1, 0xaf, 0x93, 0xe7, 0x1f, 0x50, 0xe0, 0xb8, 0xcb, 0x30, 0xd2, 0x67, 0x69, 0x93, 0x33, 0xec, 0x23, 0xcd, 0x91, 0xec, 0x18, 0x4d, 0x34, 0xdd, 0xf6, 0xda, 0x53, 0x6c, 0xcb, 0x1d, 0x87, 0x1b, 0x18, 0x60, 0x7f, 0x2f, 0x28, 0x95, 0xf6, 0xc9, 0x9f, 0x9a, 0xe2, 0x53, 0x56, 0xbb, 0xee, 0x1d, 0x66, 0x79, 0x2b, 0x48, 0x83, 0x89, 0x02, 0xe4, 0x8c, 0x20, 0x6e, 0x55, 0x5f, 0x6e, 0x68, 0xfb, 0xf2, 0x68, 0xa2, 0x12, 0xa0, 0xcb, 0x77, 0xd6, 0xc0, 0x5e, 0x22, 0xeb, 0x7c, 0x77, 0x2f, 0xfd, 0xe1, 0xc0, 0x30, 0xa4, 0x32, 0x3b, 0xb1, 0x8a, 0x82, 0x84, 0x6e, 0xcf, 0x81, 0x57, 0xc3, 0xac, 0x97, 0x51, 0x63, 0x57, 0x2f, 0xfb, 0x4d, 0x27, 0x56, 0x04, 0xfc, 0xf9, 0x84, 0xce, 0xde, 0xd2, 0xb9, 0x2d, 0x08, 0xc6, 0xcc, 0x6b, 0x28, 0x18, 0x00, 0x8f, 0xbb, 0xa2, 0xd9, 0xde, 0x80, 0x77, 0x2e, 0xa3, 0x2c, 0xc8, 0x7e, 0x2c, 0x5f, 0x04, 0x88, 0x15, 0xd7, 0x43, 0x15, 0xc9, 0xe4, 0xe5, 0x19, 0x45, 0x1b, 0x76, 0xfa, 0x1f, 0x4f, 0xd5, 0x30, 0xc7, 0xbd, 0x96, 0x0e, 0x0e, 0x87, 0xa4, 0xdf, 0xe4, 0x64, 0x2b, 0x35, 0x66, 0x95, 0xb5, 0x7e, 0x18, 0x1b, 0x93, 0xd8, 0x6e, 0x27, 0x7e, 0x27, 0x92, 0xd2, 0x7e, 0x64, 0x61, 0x0e, 0x0b, 0x38, 0xb6, 0xdc, 0x72, 0xc9, 0xec, 0xc0, 0x7b, 0xd4, 0x9e, 0x72, 0x49, 0xfc, 0xb1, 0xd7, 0x81, 0x61, 0x95, 0x2f, 0xaf, 0x75, 0xc7, 0x90, 0xe5, 0x0b, 0x9b, 0x93, 0xa5, 0xb1, 0x38, 0x4d, 0x00, 0x40, 0xe4, 0x81, 0x00, 0xb1, 0x82, 0x13, 0x44, 0x32, 0x58, 0xc0, 0xea, 0x79, 0x16, 0x0d, 0xb2, 0x59, 0x14, 0x7d, 0x5f, 0x93, 0xdc, 0x07, 0x61, 0xee, 0xe8, 0xc7, 0xb2, 0x8a, 0xad, 0xf4, 0xfe, 0x71, 0xd8, 0x12, 0x06, 0x6f, 0xd7, 0x69, 0x46, 0x24, 0x9b, 0xb5, 0xd5, 0x57, 0x9c, 0x1f, 0x8e, 0x8d, 0x1e, 0x6c, 0x6d, 0xda, 0xb3, 0x75, 0x3b, 0xf8, 0x02, 0xd7, 0x6e, 0x96, 0xc6, 0xeb, 0x4b, 0xf2, 0x1a, 0xf9, 0x4d, 0xaa, 0xf3, 0xa8, 0xca, 0xd0, 0xee, 0xb9, 0xd4, 0x3c, 0x4c, 0xf5, 0x5e, 0x26, 0x3a, 0x64, 0x9f, 0xf4, 0x56, 0xc0, 0xbc, 0x50, 0x70, 0x29, 0xa1, 0x7e, 0x8d, 0x1a, 0x2f, 0xec, 0x32, 0x9c, 0x9d, 0x0b, 0xdf, 0xba, 0x18, 0x5e, 0xd9, 0x34, 0xad, 0xd1, 0x2c, 0x78, 0x69, 0x4b, 0xf1, 0xcd, 0xbf, 0x86, 0xcd, 0xd2, 0x29, 0x1f, 0xba, 0x27, 0x12, 0xe9, 0x0a, 0x6a, 0xf4, 0x87, 0xa9, 0x65, 0xbe, 0x3a, 0xa2, 0x85, 0x78, 0xf7, 0xe4, 0x8e, 0x29, 0xbd, 0x47, 0x8e, 0xf9, 0x25, 0xca, 0x10, 0x93, 0x3b, 0x1e, 0x91, 0xcd, 0x8c, 0x69, 0x38, 0x8b, 0x80, 0x44, 0xc1, 0xe0, 0xea, 0x05, 0xbb, 0x77, 0xde, 0x44, 0xf3, 0x32, 0xc3, 0x98, 0x30, 0x10, 0xa8, 0xa2, 0x20, 0x54, 0xdc, 0x4d, 0x93, 0xe4, 0xb8, 0x53, 0xe7, 0xef, 0xc0, 0x04, 0xc3, 0xd2, 0xeb, 0x43, 0x09, 0x3d, 0x3e, 0xd1, 0x05, 0x91, 0x9f, 0xce, 0xeb, 0x8d, 0xe9, 0x7c, 0x80, 0x2a, 0x3c, 0x47, 0x17, 0xc3, 0x97, 0x02, 0xbf, 0x79, 0xa8, 0x74, 0xbb, 0xd6, 0xe2, 0x13, 0x32, 0xb1, 0xd1, 0x0f, 0x28, 0x51, 0xaa, 0x92, 0xad, 0xd5, 0x27, 0x47, 0x54, 0xd2, 0x91, 0x19, 0xe7, 0x3f, 0x1e, 0x3d, 0x59, 0x8e, 0x7e, 0x72, 0xfc, 0x1c, 0xb1, 0x87, 0xf4, 0xcb, 0x1b, 0x1e, 0xec, 0xed, 0xda, 0xb1, 0x08, 0x65, 0x57, 0xd2, 0x1a, 0x08, 0x1b, 0xb7, 0x18, 0x4a, 0xe5, 0xf5, 0xce, 0x16, 0xf9, 0x8c, 0xd0, 0xfd, 0xba, 0x24, 0xb3, 0x93, 0x7b, 0x96, 0x7c, 0x16, 0x93, 0xae, 0x59, 0x51, 0xaf, 0x30, 0x8f, 0xc0, 0x6d, 0x18, 0xb4, 0xf5, 0x26, 0x26, 0x1e, 0x3a, 0x0a, 0x9a, 0x9b, 0x78, 0x73, 0x3d, 0x62, 0x58, 0x73, 0xa0, 0x4a, 0xa7, 0xaf, 0xa8, 0x3a, 0xff, 0x71, 0x4a, 0xe1, 0xa4, 0xf8, 0x94, 0xa7, 0xac, 0x13, 0xed, 0xe3, 0x63, 0xee, 0x9d, 0x4e, 0xed, 0x2b, 0x90, 0xb8, 0x2d, 0x34, 0x56, 0xf9, 0xe6, 0xd0, 0x6f, 0x2b, 0x20, 0xf5, 0xc6, 0x16, 0xce, 0xde, 0x7b, 0xec, 0xad, 0x5c, 0xe5, 0x37, 0x6f, 0x71, 0xd8, 0x0f, 0x19, 0x1b, 0x23, 0x90, 0xaa, 0x6e, 0x5d, 0x8b, 0xfd, 0xe5, 0xe2, 0x7c, 0xf0, 0xfa, 0x18, 0xbc, 0xc6, 0xf4, 0xf7, 0xf8, 0xca, 0x01, 0xc8, 0xe2, 0x35, 0x84, 0x2c, 0x26, 0x52, 0xb0, 0x61, 0xa0, 0xe0, 0x56, 0xc1, 0xcc, 0xb8, 0xfb, 0x8b, 0x7e, 0xb0, 0x2e, 0xe6, 0xd3, 0xbe, 0x19, 0x23, 0x67, 0x61, 0x55, 0x43, 0xc8, 0x3c, 0x03, 0xb9, 0x2b, 0x04, 0x18, 0x71, 0x5e, 0x9d, 0xf8, 0x10, 0xfe, 0x80, 0x47, 0x7e, 0xea, 0x60, 0xfb, 0xa2, 0xf7, 0x0d, 0xb6, 0x6c, 0xe6, 0x98, 0x54, 0x19, 0x93, 0xb8, 0xbf, 0xb2, 0x6e, 0x6c, 0x0b, 0xd6, 0x2f, 0xe2, 0xbf, 0xba, 0xc6, 0x98, 0x70, 0x6e, 0x91, 0xc1, 0x95, 0x62, 0xd2, 0xea, 0x96, 0x28, 0x60, 0xdd, 0x26, 0x7b, 0x9d, 0xc6, 0xd3, 0x81, 0xa7, 0x94, 0xdb, 0x4d, 0xd3, 0xa2, 0x42, 0xa8, 0x57, 0x97, 0x21, 0x11, 0x46, 0x8b, 0x41, 0x02, 0xc2, 0x6b, 0xe8, 0x75, 0x6d, 0x9e, 0xf3, 0xa7, 0x20, 0xe8, 0x25, 0x1c, 0xe0, 0x8f, 0xbf, 0xe3, 0x0d, 0xbd, 0x51, 0x1b, 0xdd, 0x26, 0xcf, 0xb6, 0x09, 0xea, 0xe7, 0x7d, 0xc6, 0xbd, 0x92, 0x54, 0xf7, 0x45, 0xea, 0xc0, 0xa1, 0xc3, 0x3b, 0xa6, 0x9f, 0xf6, 0x5c, 0x56, 0x97, 0x3d, 0x40, 0xc7, 0x2c, 0xfb, 0xc8, 0x24, 0x75, 0x3f, 0xdb, 0x88, 0xae, 0xa5, 0xb9, 0x07, 0x2e, 0x77, 0x8c, 0xed, 0x99, 0x18, 0x41, 0x4a, 0x57, 0xa3, 0x95, 0xae, 0x45, 0xcf, 0x73, 0x31, 0xaa, 0x16, 0x7d, 0xb6, 0x6c, 0x16, 0xe9, 0x71, 0x84, 0x37, 0x8e, 0xa7, 0xaf, 0x8e, 0x3e, 0xb5, 0x66, 0x01, 0x57, 0x54, 0x11, 0xac, 0x95, 0x1b, 0x78, 0x84, 0x2a, 0x46, 0x7a, 0x3a, 0x11, 0xb5, 0x01, 0x63, 0x9f, 0x38, 0x35, 0xd5, 0x5b, 0x09, 0xf0, 0x54, 0x0f, 0x9a, 0x72, 0x6e, 0x1f, 0x91, 0x57, 0xa3, 0x1a, 0x11, 0xc6, 0xc9, 0x8f, 0x3c, 0xea, 0xaf, 0x22, 0xf6, 0xa6, 0x01, 0xde, 0xeb, 0x84, 0x6b, 0xcd, 0xd3, 0xef, 0x01, 0xc6, 0xf5, 0xa3, 0xdf, 0x87, 0xe9, 0x61, 0x0c, 0x04, 0xa3, 0xe7, 0xa5, 0xfe, 0xad, 0x1f, 0x37, 0xd6, 0xb4, 0x97, 0x6c, 0xa4, 0x46, 0x31, 0xea, 0x84, 0xda, 0x1c, 0x78, 0x30, 0x11, 0x02, 0x62, 0xd4, 0x3b, 0x83, 0x1f, 0x1d, 0x1d, 0xe3, 0x32, 0x93, 0xf2, 0xff, 0x4e, 0x2a, 0xaf, 0x86, 0xbd, 0x13, 0x8b, 0x65, 0x03, 0xd8, 0xbf, 0x83, 0xbe, 0xa8, 0x8a, 0xaf, 0xd0, 0xf0, 0x79, 0xd7, 0xc0, 0x2b, 0xe5, 0x7a, 0x5e, 0xfa, 0xbd, 0x5f, 0xa6, 0x77, 0x86, 0x88, 0xe7, 0xc6, 0x9f, 0x62, 0x25, 0xee, 0xca, 0x3e, 0xbb, 0xe7, 0xe8, 0x04, 0x44, 0xf5, 0x04, 0x26, 0xbc, 0x34, 0x93, 0xd4, 0xe3, 0x73, 0xfa, 0x6f, 0xe2, 0x45, 0x51, 0x3f, 0x31, 0x56, 0x67, 0x68, 0xb8, 0xfc, 0x06, 0x1a, 0x35, 0x0e, 0x78, 0x09, 0xdd, 0xf9, 0x49, 0x1d, 0x46, 0x10, 0x4f, 0x6a, 0x84, 0x24, 0xe8, 0x62, 0x93, 0x55, 0x83, 0x49, 0xf5, 0x27, 0x62, 0xea, 0x9b, 0xd9, 0x9e, 0x89, 0x09, 0xf2, 0x6b, 0x18, 0xb6, 0x1c, 0x9d, 0xae, 0xb1, 0x35, 0x6b, 0x34, 0x8a, 0xa4, 0x73, 0x62, 0x70, 0xe9, 0xff, 0xea, 0x97, 0x78, 0x87, 0xf2, 0xdd, 0xc8, 0x77, 0xc8, 0xac, 0xa7, 0x31, 0xd1, 0x22, 0xd0, 0x56, 0xc3, 0x6f, 0xbf, 0x42, 0x14, 0x7f, 0xc4, 0xd5, 0xb3, 0xda, 0x57, 0x79, 0xf5, 0xc8, 0xab, 0x60, 0xd2, 0xb8, 0x86, 0x0e, 0x51, 0xe2, 0x4f, 0x18, 0x41, 0x2c, 0x69, 0x2b, 0x2a, 0x4a, 0xbf, 0x4f, 0x83, 0x2a, 0xa0, 0x6d, 0x25, 0x8f, 0xce, 0x0f, 0x00, 0xfc, 0xd1, 0x68, 0x0d, 0xd3, 0x91, 0x94, 0x83, 0xbe, 0x24, 0x21, 0x4e, 0x4e, 0xe5, 0xcd, 0xbd, 0xe2, 0xc6, 0x91, 0x7b, 0xcb, 0xe7, 0xdf, 0xc0, 0xad, 0x67, 0x29, 0xc8, 0x28, 0x7a, 0xa2, 0x85, 0xb8, 0xbb, 0x48, 0x91, 0xda, 0xc4, 0x22, 0x66, 0x71, 0xfc, 0xc6, 0xd1, 0x67, 0xb1, 0x1f, 0xa4, 0x97, 0x67, 0x6d, 0xac, 0xeb, 0x6f, 0x8d, 0xe2, 0xc1, 0xbb, 0x7b, 0xe5, 0x94, 0xf0, 0x15, 0xa8, 0xd8, 0xbd, 0x22, 0x68, 0x25, 0x6c, 0x92, 0xe2, 0x98, 0xb6, 0x07, 0xc2, 0x77, 0xdc, 0x95, 0x5e, 0x13, 0xf3, 0xc6, 0xa4, 0xf3, 0x7f, 0xe2, 0x51, 0x2e, 0x44, 0x6d, 0x65, 0x19, 0x59, 0xf0, 0xd3, 0x22, 0x7e, 0xfd, 0x7c, 0xfc, 0xaf, 0x6d, 0x5e, 0xfd, 0xfa, 0xec, 0x09, 0xc4, 0x8d, 0xb8, 0x53, 0x1e, 0x13, 0xa5, 0x4d, 0x2b, 0x41, 0x65, 0x76, 0xbc, 0xab, 0x06, 0x2e, 0x00, 0xdd, 0xbc, 0x6d, 0x60, 0xa7, 0xe1, 0xb4, 0xa7, 0xb8, 0x3a, 0x44, 0x66, 0x6e, 0x7c, 0x8f, 0x97, 0xed, 0x0e, 0xec, 0x80, 0x6f, 0x11, 0x8e, 0xda, 0xdb, 0x9e, 0xb7, 0x33, 0x98, 0x4e, 0x29, 0x91, 0xa3, 0x00, 0xde, 0x58, 0xdf, 0xd6, 0xf8, 0x6d, 0xad, 0x81, 0xfb, 0x9c, 0xbd, 0xbf, 0x3a, 0x37, 0x24, 0x21, 0x8f, 0x00, 0xae, 0x12, 0x4f, 0x49, 0x75, 0x15, 0x7d, 0x5a, 0xb2, 0x4e, 0x3e, 0x13, 0xd4, 0x44, 0x8d, 0xd3, 0xcf, 0xe5, 0x30, 0x98, 0xb7, 0xcb, 0xeb, 0x67, 0x8d, 0xbd, 0xf3, 0xee, 0x59, 0x79, 0xa5, 0x68, 0x78, 0xb0, 0x78, 0xc1, 0x38, 0x53, 0x31, 0xfa, 0xa2, 0x0d, 0x56, 0xd0, 0x97, 0x11, 0xe4, 0x98, 0x1f, 0x15, 0x44, 0x6e, 0xfd, 0x9e, 0x7c, 0x8e, 0x87, 0x7f, 0xa3, 0x02, 0xb4, 0x9c, 0x97, 0x7e, 0x77, 0xf4, 0xf2, 0x88, 0x4b, 0xdf, 0x39, 0xdb, 0x0f, 0x93, 0x57, 0x0e, 0x15, 0xed, 0x4a, 0x71, 0x76, 0x6f, 0x1d, 0x38, 0xa8, 0x85, 0x16, 0xdb, 0x52, 0x0c, 0x30, 0xbc, 0x5e, 0x14, 0xcb, 0x0b, 0x50, 0xe5, 0xa3, 0xe6, 0xd7, 0x41, 0xff, 0xc5, 0xa2, 0xe9, 0x2b, 0x16, 0x75, 0x63, 0x27, 0x24, 0x7c, 0xf9, 0xa1, 0x3d, 0xdf, 0x05, 0x21, 0x14, 0x96, 0x6c, 0x84, 0x64, 0x7f, 0x69, 0xab, 0xd6, 0xae, 0x8c, 0x74, 0x25, 0x04, 0x02, 0xe9, 0x80, 0x03, 0x16, 0xb8, 0x30, 0xe0, 0xf8, 0xe4, 0x7a, 0xda, 0xbd, 0xb9, 0xc7, 0xcb, 0xa8, 0x05, 0x02, 0xfd, 0xa8, 0x85, 0x42, 0x3e, 0x21, 0x9e, 0xa9, 0x37, 0xef, 0x4d, 0x8c, 0xf9, 0xa9, 0x61, 0xd3, 0xd9, 0x22, 0xe8, 0xa3, 0x7e, 0x36, 0xe7, 0x3b, 0x38, 0xc3, 0x4e, 0x1c, 0x93, 0xf5, 0x2a, 0x6d, 0x2d, 0xc7, 0x1d, 0x9d, 0xc4, 0xc6, 0x0b, 0x4a, 0x93, 0x18, 0x17, 0x62, 0xdf, 0xbe, 0xce, 0x88, 0xcd, 0x16, 0xa1, 0xb9, 0x76, 0xa4, 0x99, 0x2f, 0x3d, 0x11, 0x46, 0x85, 0x61, 0x74, 0xf9, 0x1d, 0xce, 0xd1, 0x33, 0xbf, 0x39, 0xdf, 0x5c, 0x82, 0x6b, 0x0f, 0xb8, 0xf0, 0xdd, 0xc9, 0x98, 0x65, 0x86, 0xf9, 0xcd, 0xb8, 0xf1, 0xca, 0x62, 0x1d, 0x92, 0xb1, 0x8b, 0x4a, 0x5a, 0xae, 0xd8, 0xd9, 0x89, 0xcf, 0xae, 0xee, 0xc4, 0xf5, 0xf8, 0x19, 0x67, 0xda, 0x1a, 0x7e, 0x1c, 0x53, 0x26, 0x33, 0xad, 0xd3, 0x53, 0xe9, 0x16, 0x31, 0xab, 0xcf, 0xdf, 0xab, 0x03, 0xb3, 0xa8, 0x2a, 0x30, 0x6a, 0x06, 0xc8, 0x78, 0x73, 0x8d, 0x8f, 0x47, 0xd7, 0x2e, 0x83, 0x23, 0x53, 0xc4, 0xe3, 0xe2, 0xb9, 0xe9, 0xad, 0x1b, 0x94, 0x0e, 0x60, 0xda, 0x0b, 0xcb, 0x05, 0x98, 0x08, 0x73, 0x70, 0x6a, 0x99, 0xec, 0xc4, 0x78, 0x96, 0xbd, 0x35, 0xb1, 0x84, 0x69, 0x12, 0xbd, 0xb9, 0xfc, 0x02, 0x33, 0xc1, 0xe3, 0x8e, 0x0d, 0x01, 0x00, 0xdf, 0x59, 0x9a, 0xfe, 0xc9, 0x31, 0x90, 0xe2, 0x09, 0xec, 0x2c, 0xe3, 0xcb, 0x96, 0x9e, 0x7c, 0x70, 0x9e, 0xe7, 0xbf, 0x8d, 0xcf, 0xf6, 0xec, 0x37, 0x81, 0x11, 0x42, 0x7e, 0x11, 0x77, 0x15, 0x37, 0x8e, 0x44, 0x21, 0xff, 0xb5, 0x94, 0x1e, 0x7c, 0x20, 0xeb, 0x95, 0xe6, 0xba, 0xd5, 0xf1, 0xc6, 0x76, 0xc9, 0xd9, 0xfe, 0x41, 0x53, 0xbd, 0x0a, 0x35, 0x73, 0xaf, 0x85, 0x0f, 0x40, 0x75, 0xef, 0xe3, 0xd0, 0xdc, 0xad, 0x0e, 0x5c, 0x4f, 0x51, 0x6d, 0xa0, 0xa7, 0x1c, 0xcc, 0x81, 0x45, 0xc1, 0xa1, 0xf2, 0x5e, 0x6c, 0xfb, 0x18, 0x97, 0x03, 0xb5, 0xac, 0xd2, 0xac, 0xef, 0xa2, 0x47, 0x8f, 0xbe, 0x08, 0xd6, 0xdd, 0x23, 0x30, 0x9b, 0x11, 0x3a, 0x11, 0xc4, 0x76, 0xb4, 0xeb, 0x9f, 0xe9, 0x87, 0x2a, 0xf7, 0xe0, 0xe4, 0x8d, 0xa1, 0xab, 0x6a, 0x87, 0x52, 0xfa, 0x99, 0xe6, 0xb4, 0xa0, 0x89, 0xb2, 0xb8, 0x96, 0xdc, 0x58, 0x2d, 0x43, 0xf1, 0x07, 0x92, 0xfa, 0x5a, 0x5b, 0x28, 0xc5, 0x91, 0x39, 0x4c, 0x61, 0xe6, 0xfa, 0x04, 0x89, 0xbc, 0xcb, 0xd8, 0x78, 0xf5, 0x53, 0xe3, 0xa9, 0xab, 0x97, 0x29, 0xe1, 0x21, 0x1b, 0x2b, 0x6f, 0xf9, 0x4a, 0xb9, 0xb2, 0xa7, 0x18, 0x08, 0xdd, 0x25, 0xe6, 0x04, 0xf7, 0xe8, 0xa6, 0xe7, 0x26, 0x14, 0x3f, 0x0b, 0x2c, 0xec, 0x33, 0xfc, 0x32, 0x8c, 0x7f, 0xd2, 0xc5, 0xda, 0xc3, 0xbe, 0x1e, 0xba, 0xa2, 0xe2, 0xa6, 0x81, 0x6c, 0x66, 0xb9, 0xad, 0xfa, 0xc8, 0xaa, 0xd3, 0xda, 0x73, 0x08, 0xd8, 0xad, 0x94, 0x20, 0x64, 0xcc, 0x29, 0xc3, 0x94, 0x32, 0x5a, 0x4a, 0xef, 0x96, 0x0d, 0xd6, 0x9c, 0xd7, 0xb5, 0xdd, 0xd2, 0x9d, 0x6a, 0xe2, 0x8f, 0x3e, 0x3f, 0x83, 0x8d, 0xde, 0xd0, 0xb9, 0x72, 0xdb, 0x1a, 0x5c, 0x46, 0x68, 0x90, 0xe5, 0x2b, 0x77, 0x6b, 0x78, 0x48, 0xdd, 0x41, 0x22, 0x07, 0xb0, 0xd9, 0x5f, 0x80, 0xf4, 0x3e, 0xdf, 0x35, 0x77, 0x12, 0x89, 0xff, 0xfa, 0x25, 0xc1, 0x48, 0x91, 0x46, 0xe6, 0x7b, 0x4d, 0x59, 0x1f, 0xb9, 0x17, 0xaa, 0x58, 0xce, 0xdf, 0x81, 0x87, 0x63, 0xf7, 0xf7, 0x34, 0x74, 0xb9, 0x07, 0x38, 0x05, 0x70, 0xe8, 0xc5, 0x11, 0x76, 0x9a, 0xa6, 0xc4, 0x99, 0xc0, 0xc8, 0xea, 0xc3, 0xad, 0xfa, 0xa6, 0xdb, 0xc1, 0xf1, 0x67, 0xe6, 0xf6, 0x8f, 0x18, 0x72, 0xb6, 0x65, 0x97, 0x34, 0xf0, 0x76, 0x69, 0xf0, 0x6a, 0x3d, 0xac, 0x99, 0x59, 0xf2, 0x4c, 0xba, 0x2f, 0x0a, 0x7a, 0x14, 0xb4, 0xfd, 0x5a, 0x88, 0x58, 0x4b, 0xfc, 0x38, 0xc7, 0xc1, 0x8e, 0xea, 0xbf, 0xf8, 0xd0, 0xad, 0x1e, 0x20, 0xc8, 0xbe, 0x40, 0xfb, 0xb6, 0xac, 0x87, 0x2c, 0x4a, 0xbb, 0x3b, 0xb2, 0x15, 0x86, 0x95, 0xb0, 0x3e, 0xe9, 0x16, 0x6f, 0x76, 0x1e, 0x1d, 0xa5, 0x2d, 0x26, 0xb9, 0xf8, 0x06, 0x6b, 0xbc, 0xbe, 0x89, 0xa3, 0x11, 0x07, 0x19, 0xf7, 0x4f, 0xdd, 0x25, 0x65, 0x8d, 0xca, 0xa2, 0x63, 0x79, 0x9b, 0xb8, 0xc5, 0xa4, 0x64, 0xbb, 0xe0, 0x20, 0xc4, 0x5e, 0xf0, 0x4d, 0x6a, 0x23, 0xb7, 0xf0, 0xd8, 0x16, 0x67, 0x85, 0x67, 0xbb, 0xc2 ],
+    const [ 0x2e, 0x52, 0x3e, 0x9d, 0x8a, 0x55, 0x32, 0x12, 0x7e, 0xc6, 0x3b, 0x22, 0x08, 0x38, 0xf1, 0x1b, 0x0f, 0x8a, 0x09, 0xe9, 0xa3, 0x17, 0xc1, 0xe4, 0x87, 0x2d, 0x7f, 0xec, 0xec, 0xc1, 0xb4, 0xb8, 0x80, 0x60, 0x07, 0x6b, 0xa7, 0x69, 0xb0, 0x68, 0x08, 0x7a, 0x21, 0x68, 0x4c, 0x28, 0xec, 0xca, 0x22, 0xf3, 0xe1, 0x2a, 0x87, 0x78, 0x76, 0x34, 0x44, 0xe9, 0x6d, 0xba, 0xb8, 0xbb, 0xb0, 0x05, 0xd7, 0x9e, 0x80, 0x69, 0x73, 0xb2, 0xce, 0x1c, 0xbb, 0xf8, 0xe9, 0x49, 0x01, 0x07, 0x5a, 0x5f, 0xc0, 0x00, 0x0c, 0xaf, 0xdd, 0xc3, 0xb1, 0x36, 0x2d, 0x63, 0x60, 0xb7, 0x38, 0xd8, 0x83, 0x0e, 0x3c, 0xf4, 0xf0, 0xc0, 0x75, 0x99, 0x56, 0xd6, 0x9c, 0x28, 0xdb, 0xec, 0xae, 0x3c, 0x03, 0x85, 0xee, 0x99, 0xd4, 0xa1, 0x2d, 0x5f, 0x38, 0x92, 0x49, 0x84, 0xa2, 0x0b, 0xf4, 0x80, 0xf4, 0x7a, 0xb6, 0x4a, 0xa1, 0x97, 0x35, 0x84, 0x0e, 0x3d, 0xb5, 0xf2, 0x3f, 0x7a, 0xdb, 0x31, 0xaf, 0xe2, 0xb6, 0xa6, 0x7f, 0x28, 0x00, 0xb4, 0xd3, 0xef, 0xa0, 0x32, 0x7a, 0xdd, 0x74, 0x1c, 0xcd, 0xf1, 0x4e, 0x88, 0xd9, 0x17, 0x3c, 0xdc, 0xc0, 0xfa, 0x0d, 0x3f, 0x5c, 0x1a, 0x10, 0x4d, 0x26, 0x1e, 0x1f, 0x0f, 0x56, 0x6b, 0xdc, 0x2a, 0x4c, 0xf5, 0x3b, 0x56, 0x2f, 0x55, 0x41, 0x12, 0xd4, 0x1d, 0x0b, 0x97, 0xe1, 0x68, 0x11, 0x0a, 0x32, 0xb5, 0xac, 0xf5, 0x7b, 0xf5, 0xd6, 0xf8, 0x2f, 0xe2, 0x31, 0xbc, 0xa1, 0x93, 0x4c, 0x29, 0x6a, 0x4d, 0x21, 0xd9, 0x0a, 0x9d, 0xe2, 0xcc, 0xd2, 0xa3, 0xf5, 0x5d, 0x01, 0xb1, 0x3d, 0x74, 0x2d, 0x15, 0x9b, 0xfe, 0xe4, 0x32, 0xb4, 0x9a, 0x94, 0xd6, 0xf5, 0x95, 0xa8, 0xc7, 0xd5, 0x19, 0xf4, 0x9f, 0x5a, 0xa1, 0x53, 0xda, 0xdf, 0xb0, 0x8e, 0x2e, 0x14, 0xc3, 0x80, 0x1b, 0x46, 0x84, 0x78, 0xc2, 0xe1, 0x40, 0xdf, 0xfa, 0x33, 0x9b, 0x1b, 0xa1, 0x72, 0x83, 0xb2, 0x30, 0x01, 0x62, 0xb3, 0x92, 0xef, 0x98, 0x52, 0x37, 0xc1, 0x28, 0xd2, 0x64, 0x71, 0xb1, 0xa8, 0xcd, 0xb6, 0xa1, 0xdd, 0x65, 0x86, 0xa5, 0xb4, 0x75, 0xd9, 0x64, 0x8d, 0xeb, 0xb1, 0x6c, 0x09, 0xf5, 0x57, 0x6c, 0x6f, 0xcf, 0xe7, 0xa5, 0x4e, 0xda, 0x0e, 0x9b, 0x64, 0xed, 0x13, 0x10, 0xbf, 0xef, 0x14, 0x32, 0x22, 0xa6, 0x93, 0x14, 0xaa, 0xca, 0x31, 0x5b, 0xb1, 0x5e, 0xb8, 0x3a, 0xf3, 0x40, 0x5f, 0xa0, 0xef, 0xfe, 0x4a, 0xaf, 0x91, 0xeb, 0x51, 0x71, 0x0d, 0x72, 0x02, 0xc6, 0x0e, 0xab, 0xe9, 0xa1, 0x10, 0x2c, 0x0f, 0x74, 0x0a, 0x22, 0xc0, 0xe9, 0x51, 0xa0, 0x91, 0xd3, 0xb9, 0x36, 0xa2, 0x64, 0xfd, 0xc6, 0x21, 0xa0, 0x61, 0x93, 0x0f, 0x11, 0x95, 0x9b, 0x47, 0xbd, 0xdd, 0x27, 0xbc, 0x55, 0x6f, 0xa0, 0x02, 0xaf, 0x1c, 0xa4, 0x10, 0x76, 0x33, 0x59, 0x44, 0x21, 0xa3, 0x01, 0xa7, 0x21, 0x5f, 0xcf, 0x73, 0x5f, 0x07, 0xf9, 0xd2, 0xe5, 0xc4, 0x0f, 0xe9, 0xdb, 0x74, 0x8b, 0x15, 0xb6, 0x07, 0xa9, 0x74, 0xac, 0x28, 0x79, 0xa8, 0x6b, 0x20, 0x32, 0xd7, 0x0a, 0xf8, 0xc9, 0xf6, 0x40, 0xde, 0xc2, 0x48, 0xd4, 0xcb, 0x47, 0x21, 0x54, 0x62, 0x77, 0xf0, 0x0a, 0x1a, 0x00, 0x7c, 0x2c, 0x9f, 0xf0, 0x6e, 0x53, 0x76, 0xc8, 0x10, 0x2e, 0xe0, 0xd2, 0x54, 0x78, 0x02, 0xb5, 0x18, 0x27, 0x42, 0x47, 0xa8, 0xe7, 0xf4, 0xa2, 0x85, 0xc6, 0x36, 0x7a, 0x65, 0x31, 0x18, 0xae, 0x7a, 0x1f, 0x01, 0x1c, 0xf7, 0x8c, 0x4e, 0xba, 0xd1, 0x29, 0x3b, 0xe3, 0xc2, 0x52, 0x07, 0xee, 0x94, 0x40, 0x53, 0x05, 0x9c, 0x80, 0xcc, 0x34, 0x85, 0xa3, 0x09, 0xc1, 0x4f, 0x38, 0xb6, 0xbc, 0x96, 0xf7, 0xf3, 0xd6, 0x18, 0x3f, 0xf7, 0x77, 0x72, 0xc3, 0xf9, 0x0a, 0x2a, 0x80, 0x50, 0x9c, 0xf2, 0xf2, 0xd9, 0xa5, 0x2b, 0x87, 0x99, 0x25, 0xa9, 0x54, 0xa3, 0xf3, 0xb6, 0x06, 0x3c, 0x52, 0x59, 0x1c, 0x3e, 0xc6, 0xd8, 0x54, 0xba, 0x26, 0x7b, 0x63, 0xe1, 0xf1, 0x93, 0xe9, 0x25, 0xe5, 0xbb, 0xa4, 0x9b, 0xce, 0x5e, 0xe4, 0xa4, 0x9d, 0x79, 0x3f, 0xcc, 0xb9, 0xa2, 0x85, 0xf2, 0x9a, 0x4a, 0xf7, 0xaa, 0x93, 0x3f, 0xb3, 0xdf, 0xef, 0x74, 0x73, 0xbd, 0x40, 0x05, 0x77, 0xcd, 0xf4, 0x76, 0xc0, 0x62, 0x29, 0x3c, 0x7f, 0x35, 0xc3, 0x7e, 0xcd, 0x4c, 0xbb, 0x1c, 0x9c, 0x20, 0xb9, 0xf1, 0xee, 0xfe, 0xe6, 0x55, 0x45, 0xae, 0xfb, 0xe6, 0x5a, 0x53, 0x9f, 0x89, 0x11, 0x92, 0xef, 0xab, 0xad, 0xf6, 0x5e, 0xcd, 0x40, 0x93, 0xbf, 0x3f, 0x66, 0xea, 0xa0, 0x2b, 0x33, 0x0d, 0xda, 0xd6, 0x6a, 0x04, 0x66, 0x23, 0xf0, 0x6e, 0x72, 0x59, 0x80, 0x6b, 0xb4, 0x25, 0x9f, 0xba, 0xff, 0xe3, 0xd3, 0x1f, 0x14, 0x19, 0x10, 0x08, 0xba, 0x44, 0x73, 0x6f, 0x11, 0xd8, 0x33, 0x02, 0x23, 0x82, 0xd4, 0x82, 0xbc, 0xb0, 0x9d, 0x69, 0x7c, 0x53, 0x4d, 0xcf, 0x2a, 0xe3, 0x0a, 0x8e, 0x4b, 0xa4, 0x9a, 0xa5, 0xf3, 0x29, 0xd5, 0xda, 0xdc, 0x16, 0x5a, 0xa4, 0xb5, 0x2a, 0x82, 0x47, 0xbc, 0x7c, 0x92, 0x41, 0x8f, 0x04, 0x35, 0xe5, 0x3f, 0x5e, 0x29, 0x46, 0xa7, 0xcb, 0x38, 0x56, 0xfc, 0x79, 0x6a, 0x4f, 0xa5, 0x04, 0x79, 0x52, 0x4c, 0x3c, 0x85, 0x4e, 0x35, 0x29, 0x09, 0x24, 0xce, 0x4c, 0x0e, 0x09, 0x88, 0x28, 0x9e, 0x2b, 0xe6, 0x01, 0x7c, 0x97, 0xd3, 0xe4, 0x12, 0x5a, 0x39, 0xe7, 0xab, 0xe6, 0xcf, 0xb2, 0xe2, 0xb8, 0x33, 0x3e, 0x5a, 0x38, 0x38, 0xdd, 0xb0, 0xe1, 0x81, 0x7b, 0xae, 0xa1, 0x4f, 0x23, 0xc2, 0x83, 0x97, 0xc5, 0xae, 0x8b, 0x58, 0x36, 0x80, 0xe1, 0x2b, 0x78, 0xc5, 0x33, 0x1c, 0x3c, 0xfa, 0x54, 0xb8, 0xa5, 0x43, 0x29, 0x67, 0x4f, 0x60, 0xc5, 0xfc, 0x90, 0xdc, 0xd3, 0x8b, 0xfd, 0x87, 0x34, 0x7a, 0x30, 0x27, 0xea, 0xdb, 0xc9, 0x6b, 0x35, 0xf9, 0xb3, 0x20, 0xfb, 0x31, 0xa9, 0xa7, 0x6d, 0x04, 0xf8, 0xa7, 0xe8, 0x6a, 0x86, 0xff, 0x19, 0x68, 0x13, 0xff, 0x65, 0xe4, 0xbf, 0xd7, 0x88, 0xb9, 0xcc, 0x4f, 0x7c, 0x07, 0xa6, 0xb9, 0x9c, 0xcc, 0x20, 0x24, 0x09, 0xb9, 0x01, 0xd3, 0x4d, 0x3e, 0xbf, 0xee, 0x3e, 0xe8, 0x8a, 0x76, 0x25, 0xec, 0x8c, 0x7e, 0x20, 0x04, 0x70, 0x99, 0xc5, 0x79, 0x21, 0x8f, 0x08, 0x81, 0xd4, 0x54, 0x5f, 0xcc, 0x48, 0x3a, 0x24, 0x5a, 0x4c, 0x65, 0x3a, 0x8f, 0x83, 0x7f, 0xf3, 0x89, 0x64, 0xae, 0x31, 0xb1, 0x84, 0xc3, 0xcc, 0x90, 0x18, 0xb5, 0x34, 0xe5, 0xb5, 0x4d, 0x58, 0xf4, 0x5b, 0x22, 0xc6, 0x20, 0xb2, 0xc8, 0x13, 0xbc, 0x93, 0x45, 0x7d, 0x1f, 0xca, 0xc4, 0xcf, 0xf6, 0x1b, 0x8e, 0x85, 0xdf, 0x83, 0x35, 0x31, 0x33, 0xbf, 0x12, 0x1d, 0x22, 0x13, 0xf2, 0x32, 0x06, 0x44, 0x0d, 0x18, 0xf1, 0xe6, 0x38, 0x9f, 0x88, 0xde, 0x5b, 0x5e, 0x15, 0x1f, 0x24, 0x9a, 0xd7, 0xb7, 0xfd, 0x69, 0x9d, 0x0f, 0x3c, 0x16, 0x93, 0x6e, 0x9a, 0xc8, 0x5b, 0xc0, 0xe7, 0x5f, 0x5f, 0x96, 0xfc, 0x9f, 0x66, 0x6d, 0xf0, 0x90, 0x66, 0x33, 0x8f, 0x24, 0x99, 0x07, 0x07, 0x1b, 0xd3, 0x41, 0xe5, 0x24, 0x13, 0xb2, 0x40, 0x45, 0x58, 0x2d, 0x34, 0x7c, 0xb6, 0x45, 0x93, 0xa7, 0xa8, 0x59, 0xd6, 0xa1, 0xa8, 0xce, 0x5a, 0xae, 0xfd, 0x9c, 0xc9, 0x19, 0xd5, 0x0c, 0xd5, 0x1b, 0x93, 0xc0, 0x2d, 0xff, 0x6a, 0xf3, 0xa9, 0x84, 0x2b, 0x02, 0xc8, 0x83, 0x5b, 0x2b, 0x5d, 0xd1, 0x89, 0x95, 0x85, 0x67, 0xde, 0x91, 0xdc, 0xc0, 0xf6, 0x20, 0xf1, 0x83, 0xee, 0xb5, 0xf7, 0x62, 0xbf, 0x3c, 0xbd, 0x42, 0xca, 0x5a, 0xe0, 0x9c, 0xb4, 0xf7, 0x3f, 0x23, 0x73, 0xfa, 0xaf, 0xa7, 0xa9, 0x53, 0xf0, 0x39, 0x31, 0x3f, 0xe0, 0x90, 0xf8, 0xc7, 0xef, 0xab, 0x0f, 0x8a, 0xd3, 0xb8, 0xfe, 0xbd, 0x7d, 0x35, 0x5a, 0x70, 0x4b, 0x55, 0x9a, 0x13, 0x7f, 0xa5, 0x26, 0x38, 0xf0, 0xef, 0xb1, 0x9b, 0xff, 0x5e, 0xc9, 0x5f, 0xcd, 0xe4, 0xac, 0x9a, 0xab, 0xd9, 0x5e, 0x14, 0xd2, 0xe5, 0xf8, 0x4c, 0x55, 0x1f, 0x43, 0xbc, 0x53, 0x76, 0x85, 0x5e, 0x71, 0x51, 0x9b, 0x6f, 0x87, 0x72, 0x48, 0x73, 0x9a, 0x20, 0xcd, 0x79, 0x0b, 0x85, 0xba, 0xa0, 0x0d, 0x55, 0x03, 0xda, 0x5c, 0xb0, 0x56, 0xf0, 0x2d, 0x4a, 0xac, 0xc7, 0x60, 0xc9, 0x1f, 0xe1, 0xfd, 0x6e, 0xfb, 0x26, 0xde, 0xf8, 0x17, 0xe5, 0xa9, 0xc5, 0x66, 0x16, 0x02, 0x3b, 0xc9, 0xe2, 0xfe, 0x66, 0x27, 0x65, 0xda, 0xe2, 0xc0, 0xb2, 0xed, 0xfc, 0xbe, 0x17, 0xdb, 0x14, 0x0d, 0xa3, 0x0c, 0x46, 0x6d, 0xe6, 0x5c, 0x49, 0xc6, 0xf8, 0x14, 0x96, 0xbb, 0xbd, 0x1a, 0xcd, 0x81, 0x66, 0x64, 0x55, 0xf2, 0x3b, 0xb2, 0x43, 0xdd, 0x98, 0x7d, 0x7e, 0xa1, 0x36, 0x2a, 0x20, 0xfa, 0xac, 0x84, 0x1f, 0x1a, 0x36, 0x69, 0x2c, 0xfc, 0xb4, 0xc3, 0xdb, 0xf5, 0xf6, 0xbb, 0x05, 0x8c, 0x36, 0x29, 0x6b, 0x8b, 0xe6, 0x4e, 0x9b, 0x56, 0xad, 0xc5, 0x18, 0x7c, 0xac, 0xb7, 0xb5, 0x8c, 0x05, 0x4f, 0x42, 0x2a, 0x9e, 0x6d, 0x6a, 0x61, 0x22, 0x9f, 0xdc, 0x3b, 0x49, 0x4d, 0xa9, 0x8f, 0x5a, 0x33, 0xed, 0x1b, 0xee, 0x14, 0xb2, 0xd2, 0xf6, 0xad, 0x11, 0x77, 0xff, 0xe9, 0x9a, 0x6b, 0xb5, 0x53, 0xf7, 0xc4, 0xa6, 0xd0, 0xcb, 0x9e, 0x49, 0x8e, 0xe0, 0xb6, 0x3f, 0x38, 0x82, 0x35, 0xd8, 0x6c, 0x26, 0xc9, 0xd9, 0x6e, 0x50, 0xfa, 0x7d, 0x1e, 0xb3, 0xbc, 0xb9, 0x27, 0x99, 0x40, 0xc4, 0x7a, 0x85, 0x10, 0xd7, 0xfb, 0x17, 0x5b, 0x32, 0x79, 0x31, 0x8d, 0x5f, 0xe4, 0x58, 0x23, 0xba, 0xba, 0x5d, 0xbe, 0x31, 0xc3, 0x3c, 0x76, 0x49, 0xfe, 0x44, 0x70, 0x61, 0xdb, 0x78, 0xb3, 0x3b, 0xaa, 0x36, 0x37, 0xb8, 0x54, 0x16, 0x3f, 0xe3, 0x49, 0x15, 0xe9, 0x31, 0xb9, 0xf3, 0x04, 0x08, 0x07, 0xd9, 0x21, 0x7d, 0x7b, 0x3f, 0xed, 0x62, 0x37, 0x0d, 0xbe, 0x80, 0x6c, 0x00, 0x6b, 0x21, 0xcd, 0x50, 0x61, 0xd2, 0x44, 0x90, 0xf3, 0x66, 0xe4, 0xd5, 0xf2, 0x3e, 0x20, 0x1a, 0x7e, 0xc8, 0x3a, 0xe3, 0x1b, 0x46, 0xfe, 0x21, 0x08, 0xd1, 0xaf, 0x56, 0xcc, 0x9d, 0x42, 0xf9, 0x11, 0x7e, 0xca, 0x1c, 0xb5, 0xab, 0x34, 0x4c, 0x1f, 0xc3, 0x34, 0xb9, 0xcf, 0x0d, 0x7f, 0x97, 0x39, 0x04, 0x3b, 0xc3, 0xd4, 0x13, 0xb3, 0xaa, 0x6e, 0x9d, 0x50, 0x67, 0xc2, 0x40, 0xc5, 0x2b, 0x4c, 0x5b, 0x89, 0xe2, 0x5c, 0xcd, 0x8a, 0x13, 0x6a, 0x00, 0x20, 0x08, 0xa9, 0x27, 0x3f, 0x30, 0xde, 0xc3, 0xf2, 0xc1, 0x73, 0x6c, 0x04, 0xa1, 0xc7, 0xce, 0x00, 0x87, 0xc9, 0xf2, 0x5d, 0x5e, 0xc5, 0xbf, 0xf2, 0xea, 0x7e, 0xc0, 0xb0, 0xad, 0x7c, 0x27, 0x8f, 0x0c, 0xa7, 0x12, 0xc9, 0xae, 0x15, 0x0e, 0x47, 0x25, 0x21, 0xd9, 0x58, 0xd0, 0xbd, 0x6d, 0xa9, 0xff, 0x09, 0x39, 0x72, 0x59, 0x24, 0xb2, 0xed, 0x7b, 0x41, 0x0a, 0x0c, 0xe2, 0xfe, 0x3f, 0x6b, 0x0b, 0xf2, 0x58, 0x84, 0xd8, 0x85, 0xec, 0x22, 0x36, 0x05, 0xe3, 0x18, 0xfd, 0xf6, 0x80, 0x32, 0x18, 0xa9, 0xa0, 0x6c, 0xe5, 0x10, 0x3c, 0x62, 0xde, 0xd0, 0x35, 0x08, 0x7a, 0x98, 0x51, 0x9b, 0x4e, 0xb1, 0x80, 0xd7, 0x78, 0xd7, 0x65, 0x6b, 0x3d, 0x48, 0x11, 0xaa, 0xf1, 0x1a, 0x12, 0x83, 0x17, 0xd1, 0xac, 0xb3, 0xca, 0x31, 0x66, 0x39, 0x5c, 0x51, 0xc9, 0x0a, 0x3c, 0xf1, 0x64, 0x07, 0x1d, 0x0d, 0x13, 0x2c, 0x54, 0xb3, 0x81, 0x0a, 0x82, 0x11, 0xec, 0x77, 0x74, 0xd2, 0x28, 0x84, 0x47, 0xab, 0xe7, 0xaf, 0xd0, 0x30, 0x37, 0x5a, 0x3b, 0xed, 0x4c, 0x7c, 0xf1, 0xb2, 0x80, 0x97, 0xc0, 0x2e, 0x98, 0xea, 0x36, 0xbf, 0x49, 0xe7, 0x4d, 0x89, 0xfb, 0xe7, 0x4e, 0xc6, 0xcc, 0x1d, 0xef, 0x5c, 0xd8, 0xc8, 0xbe, 0xb5, 0xb8, 0xad, 0xc3, 0xcb, 0x48, 0xc5, 0x61, 0x82, 0xad, 0x33, 0x7e, 0x3b, 0x97, 0x78, 0xe4, 0xa6, 0xc4, 0xea, 0xe6, 0xd7, 0xc6, 0x63, 0x46, 0x9d, 0x05, 0x36, 0x56, 0x0f, 0x07, 0x67, 0x5e, 0x67, 0xef, 0x1b, 0x3e, 0x14, 0x44, 0x4d, 0x54, 0x0a, 0xf4, 0xc3, 0xa0, 0x5d, 0x99, 0x40, 0x26, 0x0e, 0xfa, 0xfc, 0x94, 0x25, 0xd5, 0x51, 0x25, 0xff, 0xdc, 0xb7, 0xc5, 0xea, 0xfd, 0xf2, 0x76, 0xef, 0xe6, 0x8a, 0xf2, 0xef, 0xc9, 0x7c, 0x92, 0xf2, 0x5c, 0x2f, 0x6e, 0xbb, 0x25, 0xa9, 0xc6, 0xa0, 0xf4, 0x03, 0xa1, 0x98, 0xb1, 0x1a, 0xb3, 0x96, 0x57, 0x88, 0x84, 0x15, 0x41, 0xd3, 0xcf, 0xf4, 0xa5, 0xe3, 0x28, 0x85, 0x5e, 0xba, 0xe2, 0xe1, 0xee, 0x5f, 0x30, 0x7e, 0xc3, 0x1b, 0x8a, 0x03, 0xb9, 0xe8, 0x53, 0x5a, 0xe1, 0x27, 0xb8, 0x07, 0x81, 0x91, 0xdb, 0xb9, 0x5b, 0x70, 0x31, 0x1f, 0x32, 0x0f, 0x28, 0xfd, 0x8b, 0x6f, 0x0e, 0x7f, 0xb1, 0x3b, 0x2e, 0xcd, 0xfb, 0xfe, 0x3c, 0xdf, 0x51, 0x94, 0xf3, 0x93, 0xed, 0xdf, 0xfc, 0xfd, 0x5f, 0xbb, 0x12, 0xfe, 0xd4, 0x33, 0x64, 0x18, 0x97, 0xf5, 0x3a, 0x80, 0xd8, 0x03, 0xdc, 0x75, 0xad, 0xac, 0xb0, 0xd1, 0x56, 0xbb, 0xa2, 0xde, 0xc5, 0xee, 0xc8, 0x6a, 0x5e, 0xa9, 0x46, 0x1e, 0xfb, 0xec, 0x70, 0x0b, 0x33, 0x83, 0x2f, 0x86, 0xdc, 0x7c, 0xa6, 0x36, 0xce, 0xde, 0x15, 0x6b, 0xea, 0x98, 0xfd, 0xb1, 0x5b, 0xb8, 0x85, 0xa6, 0x1c, 0xdd, 0x1c, 0x08, 0xba, 0xef, 0x60, 0x12, 0x5c, 0x0d, 0x3e, 0x09, 0x00, 0xc7, 0x5b, 0x12, 0x07, 0x8e, 0xb3, 0x46, 0xf4, 0x68, 0x81, 0x08, 0x71, 0xe9, 0x5e, 0x96, 0x93, 0x5e, 0xac, 0xdf, 0x5e, 0x4b, 0x35, 0x95, 0x8c, 0x18, 0x10, 0x82, 0x8a, 0x07, 0xc5, 0x1f, 0xc4, 0x69, 0xb0, 0x63, 0x22, 0x12, 0xab, 0xd9, 0xd2, 0x0a, 0xe7, 0xf5, 0x49, 0x85, 0x1b, 0xa8, 0x84, 0x15, 0xe1, 0x32, 0x94, 0x1f, 0x5c, 0x38, 0x59, 0x8c, 0x1f, 0x16, 0x8e, 0xc0, 0x4a, 0x76, 0x05, 0xd0, 0xf6, 0x22, 0x34, 0xef, 0xd4, 0x16, 0xf1, 0x2a, 0x10, 0xda, 0x7a, 0x56, 0x7c, 0x0e, 0xb8, 0x46, 0xea, 0x46, 0xc5, 0x41, 0xd9, 0x19, 0xab, 0xb2, 0x55, 0x75, 0x6f, 0x22, 0x18, 0x35, 0x4e, 0x64, 0xf5, 0xf6, 0x46, 0x0f, 0x77, 0x26, 0xd8, 0x32, 0xc5, 0x5d, 0x0d, 0x42, 0xc8, 0xf1, 0xb7, 0x57, 0x90, 0xc5, 0xf9, 0x98, 0xf4, 0x61, 0x09, 0xf4, 0x79, 0x48, 0x35, 0x14, 0x76, 0x85, 0x24, 0x8d, 0x75, 0x88, 0x5f, 0x59, 0xdb, 0x30, 0x0f, 0x88, 0xcc, 0x29, 0x09, 0x33, 0x49, 0x78, 0x07, 0xb2, 0x9b, 0x54, 0x38, 0x0e, 0xf5, 0x38, 0xfc, 0xb9, 0x55, 0x36, 0xe8, 0x7d, 0xab, 0x8e, 0x11, 0xb3, 0x3d, 0x7f, 0x87, 0xb5, 0x4a, 0x5d, 0x1f, 0x96, 0xed, 0xe4, 0x76, 0x10, 0x45, 0xcc, 0x32, 0xbd, 0xd3, 0x9d, 0x8b, 0x8a, 0x23, 0xc5, 0x0b, 0x6a, 0xaf, 0xe8, 0x91, 0x47, 0x00, 0x77, 0x9c, 0x3e, 0x16, 0x84, 0xc6, 0x0b, 0x0a, 0xd5, 0x8f, 0xc2, 0xf2, 0x37, 0x5c, 0xc1, 0x05, 0x14, 0xc0, 0xe2, 0x00, 0x48, 0xf9, 0xf5, 0xc8, 0x31, 0xbe, 0x6d, 0x50, 0x05, 0x38, 0x59, 0xbd, 0x69, 0x4e, 0x96, 0xc8, 0x3f, 0x25, 0x43, 0x64, 0xbf, 0xe7, 0x76, 0xa1, 0xc9, 0xc4, 0x2d, 0xd1, 0x79, 0x37, 0x88, 0xe9, 0xfd, 0x8b, 0x35, 0x2a, 0xa3, 0x9d, 0x2b, 0x00, 0x36, 0xe3, 0x9b, 0x2a, 0x8b, 0xad, 0x23, 0x1b, 0x57, 0xab, 0x46, 0xa0, 0x43, 0xb0, 0x19, 0xc4, 0x43, 0xb5, 0x3e, 0xf1, 0x23, 0x21, 0x16, 0x57, 0x63, 0x48, 0x33, 0x91, 0x44, 0x31, 0x0c, 0x86, 0x23, 0x9c, 0xf5, 0x8e, 0x06, 0x43, 0x4e, 0xd7, 0x75, 0x61, 0xfa, 0x06, 0x8b, 0x71, 0x13, 0x21, 0x4c, 0x38, 0xdb, 0xac, 0x39, 0x05, 0xf6, 0x12, 0x22, 0x38, 0xd7, 0x47, 0x3c, 0x01, 0x79, 0xac, 0x73, 0x6a, 0x4f, 0x33, 0x01, 0x98, 0x7d, 0xc3, 0x40, 0x4d, 0x48, 0xde, 0xbc, 0xb2, 0xcb, 0x81, 0x8d, 0x54, 0xec, 0x4b, 0xe4, 0x6c, 0x8f, 0xe2, 0xe3, 0x63, 0x0a, 0x93, 0xb2, 0x95, 0xd8, 0x38, 0xcf, 0x56, 0x91, 0x5f, 0xa5, 0x32, 0x19, 0xa8, 0x61, 0x79, 0x18, 0x6f, 0x01, 0xfc, 0xab, 0xab, 0xad, 0x11, 0x5a, 0x16, 0x4b, 0xdd, 0x49, 0x8f, 0x4e, 0xd2, 0xb2, 0xbc, 0xce, 0x76, 0x92, 0xf3, 0xde, 0x66, 0xa3, 0x5b, 0x1a, 0x9b, 0x8b, 0x4e, 0x7f, 0xed, 0x53, 0x02, 0x80, 0xd5, 0x1a, 0x69, 0x55, 0x77, 0x0b, 0x55, 0x97, 0xe0, 0x8c, 0xe0, 0x0a, 0x8c, 0xb8, 0x0b, 0xba, 0x2b, 0x10, 0xa5, 0x49, 0xa4, 0x6d, 0x6f, 0x87, 0x5b, 0x3a, 0x7d, 0x43, 0xb0, 0xdf, 0xdf, 0x61, 0xc8, 0x80, 0x81, 0x2d, 0x8f, 0xe8, 0x50, 0xef, 0xfd, 0xc0, 0x9e, 0xc0, 0x99, 0x05, 0xc8, 0x9b, 0x3c, 0xb9, 0x16, 0xb7, 0x18, 0xd8, 0xe2, 0x14, 0xf8, 0x8d, 0xfd, 0x54, 0xc9, 0xa6, 0x4e, 0xcd, 0x5a, 0x46, 0xbc, 0xdc, 0x60, 0xd9, 0x4f, 0x7c, 0xbd, 0x4d, 0x91, 0x17, 0x02, 0x80, 0x3b, 0x9c, 0x32, 0xf4, 0x0d, 0xd1, 0xc9, 0xca, 0xfe, 0xeb, 0xfc, 0xee, 0x95, 0x5c, 0x43, 0x8f, 0x97, 0xec, 0x15, 0xd2, 0xe2, 0x0b, 0xf2, 0xc7, 0x99, 0x65, 0xa7, 0x9c, 0x81, 0xb8, 0xce, 0x10, 0xab, 0xe2, 0x94, 0x2b, 0x54, 0x3f, 0xbf, 0x2c, 0x09, 0x31, 0xef, 0xc4, 0x0f, 0x00, 0x23, 0x81, 0x01, 0xe5, 0x80, 0x8d, 0xbb, 0x61, 0x4e, 0x98, 0x77, 0xd3, 0x44, 0x13, 0x36, 0x4a, 0x05, 0x9f, 0x62, 0x98, 0xea, 0xc5, 0xb1, 0xa8, 0x02, 0xe7, 0x4c, 0x11, 0x57, 0x76, 0x31, 0xea, 0x73, 0x66, 0xd5, 0xe1, 0x23, 0xdf, 0x0e, 0x87, 0x7b, 0x36, 0x31, 0xee, 0x1a, 0x1b, 0x77, 0x76, 0xb0, 0x14, 0xa6, 0xe4, 0xbd, 0x2a, 0xed, 0xb4, 0x9b, 0xe1, 0x0f, 0xb1, 0xbe, 0x6e, 0xc4, 0xc2, 0x3b, 0x25, 0x5c, 0x07, 0x87, 0x31, 0xa5, 0x24, 0x81, 0x87, 0x0f, 0xdd, 0xb3, 0x1d, 0x0e, 0xe4, 0xd5, 0x56, 0xc0, 0xee, 0x93, 0xc1, 0xd0, 0x0c, 0x91, 0x04, 0x9a, 0x39, 0xab, 0x13, 0x8f, 0x2f, 0x81, 0xa6, 0xdb, 0x80, 0x33, 0xe9, 0x46, 0xe1, 0x69, 0x75, 0x58, 0xc9, 0x97, 0x7f, 0xc1, 0x3b, 0x7f, 0x4f, 0xf8, 0xdf, 0xf7, 0xf4, 0x21, 0x58, 0xec, 0x37, 0x34, 0xd2, 0xa7, 0xcd, 0x5c, 0xda, 0x4f, 0xd1, 0x9d, 0x73, 0xaf, 0x71, 0xba, 0x66, 0x3a, 0xe7, 0x56, 0xd9, 0x4c, 0xab, 0x59, 0x23, 0xb3, 0xe6, 0x95, 0xdf, 0x6e, 0x2a, 0xaa, 0x3f, 0xb4, 0x61, 0x26, 0xa4, 0x39, 0x04, 0xf1, 0x6b, 0xac, 0x8e, 0xe9, 0x09, 0x84, 0x2f, 0xc9, 0x5a, 0xfc, 0xc4, 0x4f, 0x36, 0x5c, 0x07, 0x9e, 0x46, 0x7b, 0x03, 0xe1, 0x15, 0x82, 0xcc, 0x31, 0x6a, 0xf2, 0x6c, 0xb9, 0xd6, 0xe9, 0x20, 0x17, 0x89, 0xa1, 0xc5, 0x06, 0x69, 0x39, 0x8d, 0x3a, 0x66, 0xb8, 0xf6, 0x8c, 0x07, 0x4f, 0xfd, 0x57, 0x49, 0xde, 0x8e, 0x22, 0xaa, 0xba, 0x40, 0x7f, 0x81, 0xae, 0x3f, 0x32, 0x90, 0x3f, 0x89, 0x96, 0xdc, 0x34, 0x5e, 0x3d, 0xbd, 0x56, 0xf1, 0xd7, 0x31, 0x75, 0x64, 0x55, 0x75, 0xab, 0xf3, 0x4e, 0xd7, 0xe5, 0x70, 0xa1, 0xc6, 0x9e, 0xef, 0x5c, 0x2b, 0xee, 0xc2, 0xdc, 0xfc, 0xc4, 0xa8, 0x36, 0x0d, 0x6f, 0x41, 0xd6, 0x2a, 0x64, 0xc5, 0x66, 0x64, 0x3b, 0xf6, 0xf2, 0xa8, 0xfa, 0x53, 0x49, 0x96, 0x96, 0x8f, 0xa6, 0x8f, 0xb7, 0x41, 0x8f, 0x10, 0xbc, 0xdd, 0xfe, 0x3f, 0xff, 0xe3, 0xbf, 0xc4, 0x5a, 0x56, 0x19, 0xda, 0xea, 0x70, 0xb0, 0xa6, 0x12, 0x94, 0xaa, 0xc7, 0xc3, 0x84, 0x11, 0x2e, 0xfb, 0xd4, 0x78, 0x30, 0x8c, 0x9f, 0xe2, 0xd9, 0x1f, 0x78, 0xdf, 0x84, 0x78, 0xa3, 0xf8, 0xa8, 0xfc, 0x86, 0x4d, 0xf5, 0x70, 0x5a, 0x7d, 0xa0, 0x03, 0x26, 0xc6, 0xfb, 0x8f, 0xee, 0x6e, 0x48, 0x1c, 0x27, 0x61, 0xcf, 0xa6, 0x6f, 0x1b, 0x2e, 0x20, 0x7b, 0xc8, 0xf1, 0xb8, 0x51, 0xaa, 0x62, 0x5d, 0xb7, 0xbc, 0xa2, 0x7e, 0xeb, 0x95, 0xf9, 0x15, 0x94, 0x8e, 0x6b, 0xe5, 0xf9, 0x27, 0x8c, 0xff, 0x71, 0xa7, 0x95, 0x8b, 0x1a, 0x03, 0xb6, 0xc5, 0xce, 0x01, 0xae, 0x46, 0x53, 0x9d, 0x9a, 0x85, 0xd2, 0xac, 0x0a, 0x9d, 0x8b, 0xbf, 0x5a, 0x51, 0xc6, 0x4a, 0x40, 0x4d, 0x0d, 0x06, 0xa1, 0xae, 0x98, 0x93, 0xa9, 0xc5, 0x09, 0x62, 0x1a, 0x18, 0x5a, 0xd2, 0xe4, 0xaa, 0x13, 0x99, 0xf7, 0x7d, 0xc0, 0x66, 0x55, 0x54, 0xa2, 0xc5, 0x6b, 0xbd, 0xa5, 0x42, 0xa1, 0x4f, 0x92, 0xd1, 0x30, 0x31, 0x86, 0x6d, 0x33, 0xdc, 0xa3, 0x00, 0x02, 0x21, 0x05, 0x83, 0xbb, 0x6d, 0xf7, 0x66, 0x21, 0x4c, 0x67, 0x32, 0xaa, 0x2c, 0x98, 0x6d, 0xd3, 0x64, 0x17, 0xbe, 0xb7, 0x74, 0xf0, 0x51, 0xe0, 0x8e, 0x21, 0x7d, 0x5d, 0x56, 0x4f, 0xa4, 0x14, 0xe7, 0xb8, 0x5b, 0x5a, 0x16, 0x69, 0xcb, 0xc1, 0xfa, 0xb1, 0x57, 0x31, 0xac, 0xd5, 0x80, 0x3b, 0x4b, 0x05, 0x05, 0xa9, 0x43, 0x8f, 0x4e, 0x5a, 0xcf, 0x53, 0x0a, 0x4d, 0xbd, 0x77, 0x18, 0xfb, 0x72, 0x5c, 0xa3, 0xea, 0x2d, 0xd0, 0x92, 0x7f, 0x90, 0x85, 0x1f, 0x14, 0x5c, 0xc1, 0xc5, 0x4a, 0x7c, 0x58, 0x60, 0xa0, 0x45, 0xd8, 0x90, 0x45, 0xfc, 0x03, 0x5e, 0x2b, 0x98, 0x82, 0x22, 0x5d, 0xca, 0xd7, 0xa4, 0x92, 0x3b, 0x94, 0x81, 0x02, 0x15, 0xca, 0xd0, 0x78, 0xc4, 0xc5, 0x06, 0xa9, 0xfe, 0xf6, 0x17, 0xc4, 0x00, 0x31, 0xde, 0x4a, 0x1b, 0x19, 0xbf, 0x20, 0x70, 0xd8, 0x8b, 0xe3, 0xf8, 0x13, 0xa3, 0x7b, 0xc7, 0x1c, 0x61, 0xf3, 0x91, 0x6a, 0xb3, 0x87, 0x6d, 0x47, 0x09, 0xff, 0xd9, 0xc9, 0x72, 0x3c, 0xfe, 0x03, 0x01, 0x11, 0x36, 0x7c, 0x76, 0x54, 0xcc, 0xe1, 0x1a, 0x34, 0x03, 0xf6, 0xeb, 0xcc, 0x59, 0xd2, 0xf9, 0xf9, 0x0c, 0x4c, 0x10, 0x69, 0xde, 0xb1, 0x97, 0xf5, 0x15, 0xb8, 0xb8, 0x31, 0xc7, 0xb7, 0xc2, 0x41, 0x54, 0x16, 0xcb, 0xee, 0x34, 0x04, 0x99, 0xf9, 0xf3, 0x6a, 0xc3, 0xae, 0x79, 0x1d, 0x13, 0xbd, 0x8f, 0x58, 0x2f, 0x46, 0x9f, 0x69, 0x78, 0x33, 0xbb, 0xaa, 0x33, 0xca, 0xe1, 0xb3, 0xe7, 0x82, 0x7e, 0xce, 0x05, 0x16, 0x30, 0xac, 0xce, 0xd9, 0xd0, 0x56, 0x72, 0x49, 0xb0, 0x65, 0x75, 0xe6, 0x21, 0x76, 0x57, 0x45, 0x39, 0xd9, 0x74, 0x60, 0xd3, 0x89, 0x29, 0x30, 0xd6, 0x61, 0x38, 0x7e, 0xbb, 0x8c, 0x6e, 0xf6, 0x49, 0x3e, 0x83, 0x7d, 0xa3, 0xa1, 0x41, 0xc4, 0x85, 0x13, 0xe8, 0x1d, 0xcb, 0x8e, 0xd2, 0x8e, 0x33, 0x67, 0x53, 0x24, 0x63, 0x3c, 0xe3, 0x8a, 0x2e, 0x28, 0x7f, 0xda, 0x13, 0x38, 0x4c, 0xb3, 0x06, 0x23, 0x7e, 0x8c, 0x74, 0x35, 0x78, 0x48, 0x81, 0x8d, 0x34, 0x0a, 0x94, 0x88, 0xe6, 0x4a, 0x15, 0x7d, 0xdc, 0x29, 0x75, 0xab, 0xa9, 0x01, 0x6f, 0x6f, 0x82, 0x41, 0x8e, 0xbb, 0xe8, 0x78, 0xf0, 0xc3, 0x88, 0xaf, 0x49, 0xf9, 0x5f, 0xfc, 0x2a, 0x3c, 0x21, 0x54, 0x84, 0x4c, 0xdc, 0xa1, 0x68, 0x82, 0xd8, 0x14, 0x10, 0xbe, 0xc3, 0xbd, 0x23, 0xa0, 0x0a, 0x59, 0x35, 0xfb, 0x8a, 0x6b, 0x8d, 0x86, 0x68, 0x8e, 0x2c, 0xd5, 0x3d, 0x09, 0x0b, 0x88, 0x77, 0xa4, 0xa3, 0xc3, 0xfc, 0xba, 0xb2, 0xde, 0x10, 0x90, 0x3d, 0x5d, 0x78, 0xe5, 0xd1, 0x22, 0xdf, 0xca, 0x0f, 0xe1, 0x7a, 0xb4, 0x68, 0xd5, 0xe8, 0xd0, 0x24, 0xb1, 0x5c, 0x96, 0xa9, 0xda, 0xfd, 0xa1, 0xfa, 0xd3, 0x8d, 0xbe, 0x7e, 0xf8, 0x49, 0x43, 0x03, 0x70, 0x11, 0xa2, 0x02, 0x5d, 0xc9, 0x3d, 0x24, 0x55, 0xff, 0x7c, 0x06, 0x16, 0xce, 0x1d, 0x39, 0x75, 0x02, 0xcc, 0x8e, 0x98, 0x7c, 0xf4, 0x90, 0x65, 0xd9, 0xd4, 0x51, 0x3a, 0x4e, 0xd5, 0x6a, 0xdf, 0xd6, 0x1b, 0x3d, 0xb9, 0x90, 0x5a, 0x7d, 0x40, 0x62, 0xeb, 0xf1, 0xb3, 0xe3, 0x1f, 0x74, 0x0a, 0x78, 0xd3, 0x41, 0x2c, 0xbd, 0x44, 0x6d, 0x62, 0x26, 0x25, 0xb5, 0x0b, 0xe6, 0xef, 0x7a, 0x92, 0x0f, 0x79, 0x0a, 0x9e, 0xfb, 0xc8, 0x21, 0x88, 0xec, 0x28, 0xb0, 0x12, 0xef, 0x7b, 0xdc, 0x56, 0x06, 0xd2, 0x4a, 0xfc, 0x85, 0x3a, 0x9a, 0xb0, 0xbd, 0xd9, 0x31, 0xd3, 0xd8, 0x39, 0x3c, 0x71, 0x04, 0xe3, 0xf1, 0x74, 0xd4, 0x30, 0x18, 0x17, 0xe2, 0x5c, 0xcb, 0x9d, 0xba, 0xdc, 0x7a, 0x42, 0xf3, 0xf1, 0x32, 0x72, 0x9f, 0x7e, 0x1e, 0x39, 0xe6, 0x17, 0x4e, 0xfb, 0xed, 0x5a, 0xb7, 0x65, 0xfd, 0x82, 0x7b, 0xa3, 0xe1, 0x39, 0x6b, 0xd3, 0x8f, 0xae, 0xca, 0xba, 0x0b, 0xe8, 0x54, 0xb6, 0x89, 0x5a, 0x7f, 0xf4, 0xd2, 0xb7, 0x01, 0xe3, 0xe8, 0x07, 0x92, 0xe9, 0xed, 0xfb, 0xf3, 0x54, 0x41, 0x7d, 0x2f, 0x93, 0xeb, 0x8c, 0x21, 0xa6, 0x3a, 0x47, 0x36, 0xd3, 0xab, 0x47, 0x75, 0x9b, 0x0e, 0x32, 0xbc, 0xec, 0xe5, 0x8d, 0x4c, 0x98, 0x0d, 0xd2, 0x87, 0x06, 0xa0, 0xc3, 0xf9, 0x28, 0x19, 0xfd, 0x96, 0xac, 0xb9, 0xd0, 0x42, 0x77, 0x2a, 0x4e, 0x97, 0x4f, 0x63, 0xa2, 0xe2, 0xd7, 0xcb, 0xa4, 0x6e, 0xc1, 0xa1, 0xaa, 0x06, 0x3f, 0x9b, 0xa0, 0xb5, 0xba, 0xcd, 0x5b, 0xd0, 0xc7, 0xcd, 0x2a, 0x36, 0x57, 0x15, 0xae, 0xd7, 0x2d, 0xa8, 0xec, 0x73, 0x96, 0xf9, 0xa1, 0xa4, 0x54, 0x08, 0xd5, 0x1f, 0xdb, 0xce, 0xb3, 0x37, 0xc0, 0xdb, 0x98, 0xa3, 0x6e, 0x3e, 0x6a, 0x80, 0x1b, 0xa5, 0x2b, 0x9a, 0xfa, 0xc5, 0xce, 0xe7, 0xb2, 0xfc, 0x49, 0x54, 0x10, 0x35, 0xeb, 0xc4, 0xf8, 0x0d, 0xf0, 0x56, 0xa2, 0x34, 0x53, 0xe7, 0x03, 0x15, 0xe3, 0xd9, 0x88, 0xb9, 0x99, 0x12, 0x0a, 0xe8, 0x29, 0x47, 0xff, 0x92, 0xd7, 0x7a, 0xed, 0x6e, 0x8c, 0xc1, 0x25, 0xe1, 0x29, 0x4a, 0xad, 0x21, 0x1b, 0x9c, 0x7e, 0x9a, 0x30, 0x1f, 0xef, 0x91, 0xa8, 0xdf, 0x72, 0x07, 0x90, 0x8d, 0x7e, 0xe0, 0x4b, 0xc7, 0xcc, 0x44, 0x72, 0x98, 0xc6, 0x46, 0xde, 0x43, 0x3d, 0xc3, 0x02, 0x3c, 0x5a, 0x8d, 0x7e, 0x78, 0xd7, 0xc9, 0xf2, 0xe6, 0x6e, 0x96, 0x10, 0x3e, 0x92, 0xf0, 0xf6, 0xf9, 0x5e, 0xd3, 0xba, 0xa0, 0xcb, 0xa3, 0x46, 0x4a, 0x25, 0xcb, 0x66, 0x61, 0xc0, 0xa5, 0x1f, 0xa4, 0xe7, 0x9a, 0x43, 0x72, 0x15, 0x8a, 0x42, 0x45, 0x68, 0x6d, 0x43, 0x7d, 0x52, 0x3b, 0x73, 0x5f, 0x92, 0x0a, 0x9d, 0x5d, 0x62, 0x76, 0xfc, 0x97, 0xf2, 0x46, 0x4d, 0xa3, 0x16, 0x4d, 0x27, 0x89, 0x3b, 0x8d, 0x8f, 0x12, 0xa0, 0xa3, 0xc8, 0x43, 0xc3, 0x5f, 0x68 ],
+    const [ 0xe7, 0x06, 0x53, 0x63, 0x7b, 0xc5, 0xe3, 0x88, 0xcc, 0xd8, 0xdc, 0x44, 0xe5, 0xea, 0xce, 0x36, 0xf7, 0x39, 0x8f, 0x2b, 0xac, 0x99, 0x30, 0x42, 0xb9, 0xbc, 0x2f, 0x4f, 0xb3, 0xb0, 0xee, 0x7e, 0x23, 0xa9, 0x64, 0x39, 0xdc, 0x01, 0x13, 0x4b, 0x8c, 0x7d, 0x3a, 0x45, 0x92, 0xd2, 0x4b, 0x20, 0x0f, 0x68, 0x9f, 0x25, 0x40, 0x5d, 0x69, 0x0a, 0x0b, 0xcd, 0xe9, 0x5e, 0xd7, 0x51, 0xe2, 0x27, 0xa1, 0xc5, 0x4d, 0xc9, 0x4c, 0x4f, 0x4f, 0x29, 0x39, 0x9c, 0x69, 0x13, 0x18, 0x6d, 0xef, 0xd9, 0xfe, 0x53, 0xbb, 0x3d, 0xb7, 0xb6, 0x22, 0x91, 0x5d, 0x1c, 0x27, 0x1d, 0x29, 0xa8, 0xef, 0xc1, 0x8a, 0xe1, 0x75, 0xdc, 0x74, 0xb6, 0x7f, 0x6c, 0xfb, 0xbe, 0xd1, 0x76, 0x20, 0xc4, 0xa0, 0xa8, 0xeb, 0x82, 0x49, 0x3d, 0xba, 0xad, 0x43, 0x21, 0xd8, 0x32, 0x52, 0x55, 0x51, 0xc0, 0xfe, 0x96, 0x05, 0x86, 0x44, 0x39, 0xfc, 0x3e, 0x8b, 0x5a, 0xf9, 0x6a, 0xda, 0x35, 0x52, 0xdd, 0x47, 0xd4, 0xfe, 0x7e, 0xb3, 0xeb, 0xf0, 0x49, 0xb4, 0x00, 0xa3, 0x96, 0xd3, 0xce, 0xf7, 0x9e, 0xf8, 0xec, 0x3b, 0x3b, 0x22, 0xaa, 0x8b, 0xef, 0x5b, 0x3c, 0x5c, 0x28, 0xec, 0x1a, 0x55, 0xc2, 0xcd, 0xa6, 0x61, 0xce, 0x5f, 0x0f, 0x02, 0x92, 0x5d, 0x76, 0xe8, 0xd0, 0x10, 0x50, 0xc2, 0x4c, 0xc3, 0x0c, 0x54, 0x88, 0x77, 0xf5, 0xc9, 0xd2, 0xd8, 0x59, 0x4b, 0x80, 0x6f, 0xeb, 0xd2, 0x7b, 0x18, 0x66, 0x39, 0xfa, 0xb7, 0x73, 0x97, 0x90, 0x27, 0xcd, 0xcc, 0x69, 0x73, 0xa3, 0x5a, 0xd1, 0x49, 0x3e, 0x77, 0xf5, 0xab, 0xe3, 0x60, 0xee, 0xe8, 0xfb, 0xef, 0xfb, 0xcb, 0x71, 0x70, 0x0e, 0x12, 0x5c, 0xb1, 0x8b, 0x21, 0xde, 0x58, 0x4c, 0xf8, 0x4b, 0x79, 0xe8, 0x63, 0x8e, 0x68, 0x35, 0x70, 0xc9, 0xcc, 0x0b, 0x26, 0x3c, 0xf5, 0x4b, 0x74, 0x68, 0x70, 0x20, 0x68, 0x74, 0xd8, 0x85, 0xa2, 0xcf, 0xee, 0x08, 0x07, 0x17, 0xec, 0xcd, 0xba, 0x3a, 0x17, 0xd5, 0x48, 0xdb, 0x94, 0x80, 0x22, 0xf7, 0x7c, 0x51, 0x51, 0xc8, 0x33, 0xf2, 0x65, 0xe9, 0xf5, 0x78, 0xae, 0xbc, 0xb1, 0xe7, 0xaf, 0x09, 0x1b, 0xf9, 0xd0, 0xe7, 0xfd, 0x1b, 0x53, 0xe0, 0xcd, 0xb9, 0x89, 0x50, 0x85, 0xbb, 0x46, 0x0e, 0xaf, 0x50, 0x92, 0x4e, 0xbf, 0xea, 0xa1, 0xc6, 0xa6, 0x8a, 0x06, 0x10, 0xa4, 0x3d, 0x23, 0x50, 0x5e, 0xe6, 0xe4, 0x16, 0x30, 0x3f, 0xad, 0x86, 0xc4, 0x1b, 0x90, 0xb6, 0xe4, 0xee, 0xc4, 0x57, 0x8c, 0x8e, 0x52, 0x98, 0x44, 0x3b, 0x12, 0x47, 0xac, 0xde, 0xd6, 0x39, 0x59, 0x8e, 0xe5, 0xed, 0xdf, 0x58, 0xab, 0x6c, 0x2f, 0x40, 0xae, 0x73, 0x24, 0x83, 0xc4, 0xd4, 0x58, 0x1f, 0x84, 0x1a, 0x3c, 0x95, 0xfa, 0x6c, 0x68, 0xee, 0x9f, 0xb4, 0x2f, 0xfc, 0x87, 0x00, 0x77, 0xe2, 0xdd, 0x28, 0xc7, 0xd7, 0x8d, 0xb1, 0xa2, 0x26, 0x40, 0xf1, 0x14, 0x79, 0x8d, 0x74, 0x8a, 0x58, 0x6d, 0x9f, 0xe7, 0xed, 0xf0, 0x93, 0xd3, 0x0a, 0x2f, 0x54, 0x56, 0x6d, 0x82, 0x2b, 0xa7, 0x42, 0xf3, 0x48, 0x3e, 0xe9, 0xf2, 0xac, 0x30, 0xfa, 0x4a, 0x46, 0xbc, 0x86, 0x53, 0x5c, 0x21, 0xa0, 0x69, 0x2d, 0xb3, 0x1c, 0x9e, 0xd5, 0x2e, 0x97, 0xac, 0x70, 0x4a, 0xb8, 0x2e, 0x82, 0x90, 0xb4, 0x0f, 0x97, 0x6b, 0x18, 0x42, 0x26, 0x82, 0xc3, 0xb3, 0xbb, 0x45, 0x31, 0x7e, 0x55, 0xc6, 0x00, 0x60, 0x0d, 0xcb, 0xac, 0x6a, 0xf9, 0x21, 0x9e, 0xfd, 0x50, 0x33, 0x65, 0xf2, 0xcf, 0xdb, 0x43, 0x19, 0x5b, 0x77, 0xeb, 0xe5, 0xe7, 0x40, 0x89, 0x65, 0x98, 0xd7, 0x03, 0x76, 0x27, 0x21, 0x7e, 0x38, 0x88, 0x55, 0x25, 0xbe, 0xc9, 0x53, 0x25, 0x0a, 0x3c, 0x38, 0xfc, 0x38, 0xd8, 0x2f, 0xf4, 0xf9, 0xdd, 0x8a, 0xea, 0x43, 0xb7, 0x11, 0x54, 0x47, 0x25, 0x99, 0x83, 0xa4, 0x9a, 0xd9, 0x25, 0xda, 0xe4, 0x7a, 0x0d, 0x01, 0x0b, 0x6d, 0x37, 0xbb, 0x7c, 0x81, 0x06, 0x67, 0x66, 0x35, 0xd1, 0x97, 0x65, 0xca, 0x9e, 0xc4, 0x5e, 0x9d, 0x2d, 0x41, 0xaa, 0xb4, 0x39, 0x6e, 0x76, 0x97, 0xfa, 0x2e, 0x69, 0x61, 0xee, 0x9b, 0x88, 0x16, 0xd9, 0xf8, 0x57, 0x37, 0x0b, 0xe6, 0x41, 0x94, 0xe1, 0xdb, 0x3a, 0x62, 0x8e, 0xd1, 0xa3, 0x8d, 0x1b, 0x3b, 0x6e, 0x50, 0xad, 0x3d, 0x82, 0x02, 0x07, 0x1c, 0x61, 0x33, 0x4f, 0xf4, 0x08, 0xf7, 0x15, 0xa9, 0x17, 0x82, 0x91, 0x1f, 0x31, 0xf5, 0x2c, 0xae, 0xa6, 0x78, 0x43, 0xd0, 0x4f, 0x89, 0x27, 0x1d, 0xba, 0x93, 0x68, 0x7a, 0x87, 0xc3, 0x53, 0x8d, 0x12, 0x17, 0xb9, 0x74, 0x53, 0xb8, 0xf2, 0xb6, 0x02, 0x89, 0x22, 0x79, 0xfe, 0x00, 0xbb, 0xf6, 0xef, 0x35, 0x43, 0x2b, 0x2a, 0x38, 0x58, 0xcf, 0xd6, 0xa8, 0xf1, 0x8b, 0x4d, 0x81, 0xe6, 0x67, 0xc5, 0x36, 0xb3, 0x83, 0x30, 0x00, 0x79, 0x07, 0x61, 0x75, 0x45, 0x5c, 0x6f, 0x5c, 0x95, 0x9d, 0x5e, 0xc0, 0x18, 0x48, 0xfc, 0x43, 0xb6, 0x3a, 0x0a, 0xb5, 0xd0, 0xda, 0x9c, 0xe5, 0xc9, 0x94, 0xc3, 0xb7, 0xc5, 0x89, 0x68, 0x77, 0xb0, 0x84, 0x7b, 0x6d, 0x83, 0x30, 0x4e, 0xb2, 0xc2, 0x89, 0x3b, 0x42, 0x49, 0x91, 0x8d, 0x51, 0x49, 0x44, 0x9e, 0xe3, 0x8e, 0xcd, 0x3c, 0x97, 0x03, 0xfa, 0x51, 0xc3, 0x77, 0xee, 0xc3, 0xc6, 0xa1, 0x16, 0x9a, 0x9a, 0x62, 0x5e, 0x61, 0xa9, 0x4b, 0xa4, 0xce, 0xe2, 0x5f, 0x6c, 0xa5, 0x0b, 0x1a, 0xd6, 0xd9, 0x59, 0xb2, 0xce, 0xf4, 0x3e, 0x9c, 0x83, 0xba, 0x82, 0x52, 0x1a, 0x09, 0x95, 0x54, 0xa3, 0x04, 0x24, 0x6c, 0x4c, 0x71, 0xea, 0x37, 0xd4, 0x5e, 0xc9, 0xe1, 0x43, 0x0b, 0x19, 0x30, 0xd9, 0x04, 0x40, 0xc4, 0x44, 0x8e, 0x82, 0x9d, 0x16, 0x44, 0x1b, 0xdd, 0x75, 0x02, 0x8b, 0xcf, 0x14, 0x02, 0x32, 0x29, 0x63, 0x45, 0x1c, 0x8e, 0x03, 0x35, 0x1e, 0x57, 0x7d, 0x88, 0x22, 0x93, 0x33, 0x67, 0xbf, 0x4c, 0x97, 0xd0, 0x0d, 0x0d, 0x9a, 0x39, 0xb7, 0xa0, 0x68, 0x76, 0x51, 0x1c, 0x52, 0xdc, 0xec, 0x20, 0x0b, 0xa7, 0xe8, 0x59, 0x18, 0x99, 0x0a, 0x4a, 0x82, 0xe4, 0xce, 0x4c, 0xce, 0x4a, 0xff, 0xd3, 0x2e, 0x83, 0x84, 0xf4, 0xf9, 0xdf, 0x7d, 0x24, 0x59, 0x2c, 0x8f, 0x43, 0x44, 0xda, 0x7b, 0xd9, 0xad, 0x5d, 0xf6, 0x9f, 0xfb, 0xd3, 0xb5, 0x41, 0xba, 0xe7, 0xc7, 0x62, 0x90, 0xf5, 0x27, 0xe0, 0x73, 0x6f, 0x92, 0x5a, 0x1a, 0x7f, 0x96, 0xf0, 0xb1, 0xed, 0xec, 0x4a, 0xd1, 0x44, 0x07, 0xdc, 0xaf, 0x30, 0xed, 0x68, 0x94, 0x2b, 0x46, 0xc4, 0x8d, 0x58, 0xb2, 0xdd, 0x63, 0xaf, 0x60, 0xfc, 0xcd, 0x5b, 0xdd, 0x48, 0xe5, 0x60, 0x29, 0x8d, 0xd9, 0x81, 0x10, 0x3b, 0xe3, 0x61, 0xb7, 0xb2, 0x7b, 0xe8, 0x76, 0xbc, 0xcb, 0xe8, 0xe5, 0x5b, 0x63, 0x01, 0x3a, 0xc6, 0x2e, 0xc2, 0xd2, 0xae, 0xa4, 0x10, 0x0d, 0xc5, 0x42, 0xcc, 0x5f, 0x81, 0x37, 0xb0, 0xa4, 0x1d, 0x61, 0x7a, 0xb4, 0xe2, 0x77, 0x4d, 0x38, 0xa4, 0x88, 0x54, 0xbc, 0x8f, 0xa4, 0xa8, 0x05, 0x24, 0xd9, 0x74, 0xa4, 0x7e, 0x61, 0x57, 0xcb, 0xda, 0x19, 0x09, 0x60, 0x56, 0x35, 0x42, 0x50, 0xf9, 0x32, 0xd7, 0x26, 0xf4, 0x0d, 0x26, 0xdc, 0x27, 0xb3, 0xb5, 0xf0, 0xe7, 0xb8, 0x16, 0xbb, 0xff, 0x4b, 0x0e, 0xff, 0xf4, 0x6a, 0xf6, 0xbf, 0x8e, 0x52, 0x60, 0x53, 0x93, 0x3a, 0xfe, 0xbb, 0xd6, 0x40, 0xc0, 0x34, 0x70, 0xa4, 0x3d, 0x09, 0x4e, 0x34, 0x54, 0xac, 0xec, 0x07, 0x13, 0x05, 0x5f, 0x6e, 0xd7, 0x0a, 0x99, 0x28, 0xb5, 0x90, 0xe9, 0xd5, 0x19, 0x60, 0xc1, 0xad, 0xad, 0x8e, 0xbc, 0x72, 0x7d, 0x06, 0xdf, 0xa3, 0x58, 0x68, 0x20, 0xf3, 0x79, 0x16, 0x24, 0xfa, 0x67, 0x8b, 0x4d, 0x29, 0x19, 0xee, 0xf4, 0x03, 0x5e, 0xe6, 0xf3, 0x8a, 0x7c, 0xb1, 0x67, 0xf8, 0x17, 0x70, 0xb4, 0xb0, 0x55, 0xc5, 0xc9, 0x74, 0x40, 0xa0, 0xa5, 0xd8, 0x6c, 0x56, 0x19, 0xf7, 0xd9, 0xf4, 0xd0, 0x64, 0x1a, 0xd2, 0x8e, 0x64, 0xb7, 0x6b, 0xb5, 0x5a, 0xd1, 0x6b, 0x0d, 0x82, 0x04, 0x0a, 0xc4, 0xe2, 0x92, 0x99, 0xb4, 0x7e, 0xbd, 0x5a, 0xe5, 0xcc, 0x74, 0x95, 0x53, 0x67, 0x32, 0xe8, 0xf1, 0x07, 0x24, 0xdf, 0xed, 0xb1, 0x8a, 0xc5, 0x36, 0x2b, 0x5f, 0xb9, 0x3c, 0xb3, 0x3c, 0x04, 0xf7, 0xf0, 0x7a, 0xa9, 0x2a, 0x29, 0x97, 0x3e, 0xe9, 0xb5, 0xda, 0xfb, 0x59, 0xb3, 0x3a, 0x11, 0xb7, 0xfb, 0x7d, 0x3c, 0x9b, 0x54, 0x9d, 0x9c, 0x7e, 0xe7, 0x6f, 0xc1, 0x7a, 0xf3, 0x86, 0x05, 0x52, 0xc3, 0x56, 0x1e, 0xb2, 0xdd, 0x95, 0xf3, 0xb8, 0x7d, 0xe7, 0xaf, 0xb2, 0x41, 0xb9, 0x14, 0x2a, 0x26, 0x6d, 0x13, 0x20, 0xb3, 0xb8, 0x99, 0x96, 0x74, 0x49, 0xab, 0x52, 0xaa, 0xac, 0xb5, 0xdf, 0x41, 0x6d, 0x1f, 0xd5, 0x02, 0x80, 0x22, 0x5a, 0x0a, 0xe0, 0xda, 0xe9, 0x7b, 0x77, 0x9c, 0x52, 0x71, 0x3e, 0x89, 0x02, 0x38, 0xa5, 0x63, 0x85, 0xbc, 0x35, 0xa0, 0x49, 0x40, 0x74, 0xbd, 0xa5, 0x53, 0x09, 0xd5, 0x19, 0x00, 0x20, 0x72, 0xd8, 0x46, 0x10, 0xa3, 0x83, 0xc8, 0x3b, 0x4f, 0x38, 0xc4, 0x36, 0xc8, 0xcb, 0x49, 0x2b, 0xa3, 0x53, 0xa5, 0x7b, 0xc8, 0xe9, 0x1d, 0xa7, 0xc5, 0xac, 0xe2, 0x70, 0x68, 0x09, 0x40, 0x3d, 0x8c, 0x39, 0x17, 0xbe, 0x33, 0x0a, 0x8f, 0xcf, 0xd5, 0xe3, 0x08, 0x9f, 0xf8, 0x02, 0x50, 0x11, 0x01, 0x09, 0x19, 0x62, 0x4a, 0xb9, 0xaa, 0x0d, 0x74, 0xfd, 0xd4, 0xeb, 0xff, 0x2a, 0x28, 0x9f, 0x17, 0x85, 0x67, 0x31, 0xb1, 0x06, 0x3a, 0xf9, 0xd7, 0x5b, 0x23, 0xbf, 0x40, 0x30, 0xb4, 0x20, 0x24, 0xae, 0xff, 0x33, 0x4e, 0x41, 0x4d, 0x6d, 0x73, 0x9f, 0x13, 0xc2, 0xc2, 0x06, 0x21, 0x0d, 0xbc, 0xc4, 0x1d, 0xb2, 0x46, 0xfd, 0x30, 0x82, 0xfd, 0xa9, 0xff, 0xdf, 0xc9, 0xdc, 0xdd, 0x20, 0xb5, 0x4a, 0x3e, 0x37, 0xfe, 0x0a, 0x6f, 0x90, 0x69, 0x9a, 0x85, 0x3d, 0xda, 0x24, 0x94, 0x51, 0x23, 0xff, 0x21, 0x89, 0x1a, 0x79, 0xd9, 0x32, 0xee, 0xd4, 0x83, 0x46, 0xbb, 0x8e, 0x33, 0xd9, 0x5b, 0xe6, 0xc0, 0xb3, 0x80, 0x9b, 0x79, 0x3f, 0xff, 0xf7, 0x14, 0xa4, 0x6f, 0x0c, 0xe7, 0x31, 0xf3, 0x3e, 0x5b, 0xfe, 0x54, 0x01, 0x9d, 0xd0, 0x53, 0xe4, 0x96, 0x3e, 0x3d, 0xcf, 0x1e, 0x12, 0xbf, 0x88, 0x6c, 0xf2, 0xfc, 0x7c, 0xd1, 0x40, 0xdd, 0xbd, 0xa7, 0x3e, 0xa8, 0x47, 0x84, 0x76, 0xd5, 0x87, 0xb3, 0x59, 0x1d, 0x1e, 0xe4, 0x26, 0xd3, 0xe2, 0x22, 0x0d, 0x77, 0x25, 0x06, 0x95, 0x89, 0x3b, 0x2a, 0x3b, 0x9b, 0x36, 0xe1, 0x5b, 0xaa, 0xf4, 0x25, 0x54, 0xae, 0x5c, 0xd1, 0xe8, 0x70, 0xe4, 0x11, 0xe1, 0x9c, 0x56, 0x16, 0xfa, 0x17, 0xd5, 0x0e, 0xfc, 0x92, 0x1b, 0x53, 0x28, 0x60, 0x04, 0xe2, 0xd5, 0x84, 0x50, 0x10, 0x5a, 0x0f, 0xa4, 0x78, 0x2e, 0xa9, 0xd3, 0x38, 0x4e, 0x6d, 0x5c, 0x5d, 0xdf, 0xfa, 0x34, 0x9b, 0x15, 0xc6, 0xc5, 0x42, 0x53, 0xb6, 0x36, 0x6d, 0x94, 0xec, 0xed, 0x7c, 0x09, 0xe1, 0x52, 0xc5, 0x03, 0xb3, 0xd6, 0x87, 0x14, 0xc0, 0x35, 0x1f, 0x71, 0x73, 0xf7, 0x7f, 0x9b, 0x5e, 0x3d, 0xdb, 0x3f, 0x89, 0xba, 0xa5, 0x5a, 0x0a, 0x00, 0xbc, 0xa0, 0xd6, 0xfd, 0xe1, 0x1f, 0xd7, 0xc5, 0x6a, 0x20, 0x3f, 0x92, 0x3a, 0x4e, 0x1b, 0x08, 0xf0, 0x1a, 0x2b, 0xbe, 0x5f, 0x5d, 0xf1, 0xfb, 0x3f, 0x3f, 0x08, 0xbd, 0x21, 0x59, 0xb7, 0x00, 0xa9, 0x16, 0xc6, 0x3c, 0xf7, 0x5f, 0x90, 0x30, 0x66, 0x77, 0x5a, 0xde, 0x79, 0x23, 0xe3, 0xd7, 0x12, 0x0f, 0x3c, 0xb8, 0xe5, 0x6d, 0xda, 0xf5, 0x2d, 0xdf, 0xea, 0xd5, 0x9d, 0x97, 0xe4, 0xbe, 0x9a, 0xbc, 0x63, 0xb3, 0xa7, 0x10, 0x34, 0x1b, 0x21, 0xd1, 0xad, 0xc4, 0x2c, 0xdd, 0x40, 0x27, 0xed, 0x19, 0x50, 0xee, 0xfa, 0x12, 0x42, 0xb3, 0x0e, 0xe5, 0xd8, 0x0b, 0x02, 0x5d, 0xba, 0xc3, 0xf8, 0x5c, 0x56, 0x69, 0xda, 0x7c, 0xea, 0x0e, 0x03, 0xf5, 0xdf, 0x4b, 0x3b, 0xc2, 0x59, 0x82, 0xe9, 0xff, 0x0c, 0x66, 0x84, 0x96, 0x51, 0xbe, 0x4b, 0x1a, 0x79, 0x66, 0x36, 0xf3, 0x61, 0x96, 0x2c, 0xbc, 0x46, 0x66, 0x76, 0xe9, 0xdb, 0x92, 0x74, 0xad, 0x99, 0x7b, 0x8e, 0x1b, 0x57, 0x6f, 0x6e, 0x8b, 0x1a, 0x2a, 0x6c, 0x3f, 0x2e, 0x9d, 0x4a, 0x46, 0x76, 0xee, 0x22, 0xa1, 0x00, 0xbf, 0x9c, 0xa5, 0xdc, 0xb3, 0x64, 0xa0, 0x2f, 0x2e, 0xdc, 0xbf, 0x83, 0x5d, 0x0e, 0x2f, 0x61, 0x77, 0xe4, 0x83, 0x22, 0x42, 0x9b, 0x56, 0x02, 0xd8, 0x75, 0x31, 0x76, 0xab, 0xae, 0xaf, 0xc0, 0xc7, 0xb2, 0xde, 0xc0, 0x57, 0x8d, 0xe9, 0x0d, 0x6b, 0xa3, 0xf4, 0x44, 0xf8, 0xa1, 0x48, 0xa0, 0x20, 0xb3, 0xb0, 0xcb, 0xb4, 0xf8, 0x22, 0xf4, 0xf8, 0x33, 0xa2, 0x22, 0xa6, 0xc3, 0x64, 0xc8, 0x35, 0xd5, 0x31, 0x99, 0x5a, 0xd8, 0x0b, 0x9d, 0xd0, 0x31, 0x14, 0x85, 0x55, 0x30, 0xac, 0x3c, 0xf5, 0x43, 0xda, 0xbe, 0x8a, 0x6a, 0xed, 0x2d, 0x84, 0xeb, 0x63, 0x22, 0xe6, 0x47, 0x09, 0x41, 0x91, 0x6c, 0x64, 0x10, 0xc5, 0x2c, 0x50, 0x09, 0xe5, 0xee, 0xe7, 0xed, 0x7a, 0xa4, 0xa4, 0x5c, 0x7b, 0xfd, 0xc8, 0xa3, 0xcc, 0xdb, 0xfd, 0xd5, 0x04, 0x07, 0x3a, 0x1d, 0x73, 0x24, 0xe6, 0x52, 0x64, 0xe1, 0x40, 0xcc, 0x9f, 0x73, 0xfe, 0x76, 0x32, 0x43, 0x34, 0x25, 0x71, 0xe3, 0x78, 0x28, 0x3c, 0x47, 0x44, 0x21, 0x80, 0x32, 0x9c, 0x13, 0x00, 0xee, 0xf0, 0xbb, 0x56, 0x40, 0x43, 0x24, 0x34, 0x9b, 0x8d, 0x76, 0xf0, 0x94, 0x5e, 0x0e, 0x40, 0x96, 0xc5, 0xd4, 0x42, 0xd7, 0x70, 0xc9, 0xbf, 0x8a, 0x14, 0xe0, 0xb0, 0x57, 0x10, 0x0f, 0x01, 0x08, 0x4d, 0xa5, 0x96, 0x85, 0x68, 0xde, 0x8c, 0x02, 0x13, 0xb5, 0xc1, 0x77, 0xb8, 0xf9, 0x96, 0x50, 0x60, 0xa3, 0xf3, 0x66, 0xd4, 0x67, 0x8c, 0x2f, 0x01, 0x89, 0x63, 0x31, 0xa1, 0xf2, 0x8e, 0xbd, 0x18, 0x83, 0x3b, 0xd9, 0x9c, 0xa9, 0xf1, 0x7e, 0x99, 0x32, 0x19, 0x04, 0x54, 0x5f, 0xbc, 0xda, 0xce, 0x3a, 0x8e, 0x7a, 0xeb, 0x29, 0x2c, 0x9c, 0xd3, 0xc4, 0xa2, 0xaa, 0x99, 0xe4, 0x30, 0x75, 0x1b, 0xfc, 0x4e, 0x26, 0x29, 0xad, 0xed, 0x77, 0xe9, 0x94, 0x00, 0x23, 0x79, 0x67, 0x3b, 0x9a, 0xd7, 0x40, 0x1a, 0xfa, 0xfe, 0x38, 0x26, 0x3b, 0x52, 0x38, 0x74, 0xa9, 0x3e, 0x0c, 0x6e, 0x98, 0x1c, 0xb9, 0xd5, 0x53, 0x55, 0x11, 0x07, 0x55, 0xc9, 0x84, 0x7e, 0xbc, 0x71, 0x39, 0x9a, 0xfa, 0x42, 0x5e, 0xa0, 0xce, 0x55, 0xbc, 0x02, 0x73, 0x46, 0x8e, 0xe1, 0x17, 0xda, 0x93, 0xd0, 0x8e, 0xe4, 0x62, 0xdb, 0x48, 0x69, 0xfe, 0xc8, 0x80, 0x02, 0xaa, 0x9c, 0xb7, 0x82, 0xfe, 0x61, 0x61, 0xd9, 0x3b, 0x27, 0xde, 0x38, 0xdc, 0x49, 0xab, 0x76, 0x6d, 0xf1, 0xda, 0xb3, 0xa0, 0xde, 0xbf, 0x3b, 0x9e, 0x65, 0xed, 0xac, 0x9b, 0xb6, 0x61, 0x5c, 0xad, 0x61, 0xfc, 0xf5, 0xde, 0x19, 0x37, 0x62, 0x80, 0xb7, 0x12, 0xef, 0xc0, 0x82, 0x4d, 0xab, 0x7e, 0xad, 0xdb, 0x11, 0x5c, 0x21, 0x94, 0xe8, 0x15, 0x7d, 0x2a, 0x68, 0x11, 0x5b, 0x5e, 0x9e, 0x36, 0xd6, 0x73, 0x12, 0x00, 0x49, 0xe3, 0xa6, 0xd4, 0x58, 0x52, 0xc1, 0x91, 0x35, 0xc0, 0xad, 0x69, 0x1c, 0x02, 0x3e, 0xef, 0x20, 0x73, 0xb5, 0x70, 0x2a, 0xe7, 0xe3, 0x87, 0x3f, 0xe0, 0x92, 0xec, 0x01, 0x05, 0x20, 0x8d, 0x79, 0xcf, 0x6d, 0xe0, 0x13, 0x86, 0xf8, 0x77, 0xea, 0x6c, 0x44, 0xd5, 0x46, 0x38, 0x81, 0x80, 0x63, 0xc5, 0x68, 0x57, 0x75, 0x0c, 0x67, 0x26, 0xe8, 0x50, 0xfe, 0x78, 0xec, 0x98, 0x69, 0xac, 0x31, 0x62, 0x7f, 0x4b, 0xef, 0x96, 0xda, 0x99, 0x2a, 0xb9, 0x38, 0x6a, 0x34, 0x63, 0x21, 0x37, 0x73, 0xf3, 0xca, 0x71, 0x64, 0x81, 0x3a, 0x15, 0xe0, 0x14, 0xab, 0x81, 0x9f, 0x15, 0x33, 0x86, 0xfa, 0x04, 0xa3, 0xbe, 0xf5, 0x6a, 0xb0, 0x20, 0x7c, 0x0f, 0x50, 0xd1, 0xed, 0x6c, 0x67, 0x3d, 0xd7, 0x63, 0xa3, 0x67, 0x02, 0x2e, 0xa4, 0x7d, 0xaf, 0x96, 0x61, 0xb0, 0x20, 0x65, 0xc7, 0x43, 0x5b, 0x1d, 0xa3, 0xe1, 0x2c, 0xea, 0xc1, 0x33, 0x69, 0xd6, 0x55, 0xb2, 0x79, 0x3c, 0x9b, 0xba, 0x17, 0x7f, 0xbb, 0xe0, 0x54, 0xfb, 0xef, 0x86, 0xdb, 0x3c, 0xe7, 0xad, 0x79, 0x6e, 0x6d, 0x0a, 0xdd, 0x15, 0x45, 0x5b, 0x9c, 0xff, 0x57, 0xfb, 0x78, 0x76, 0x10, 0xb4, 0xe1, 0xba, 0x05, 0xd5, 0xbc, 0xae, 0xd9, 0x85, 0x64, 0xd1, 0x61, 0x57, 0xee, 0x70, 0x07, 0x1f, 0xb2, 0x1a, 0x6c, 0x03, 0x06, 0x55, 0x52, 0xd5, 0x4d, 0x8f, 0xb8, 0xa0, 0x31, 0x57, 0x46, 0x80, 0x2c, 0xcd, 0xec, 0xb7, 0x4d, 0x57, 0xc7, 0xfe, 0x39, 0x96, 0x44, 0x19, 0x70, 0x99, 0x87, 0xae, 0xd1, 0x50, 0x0e, 0x57, 0x61, 0x43, 0x91, 0xf6, 0x48, 0x83, 0x2d, 0x49, 0x1c, 0xe1, 0xc2, 0xbe, 0x62, 0x5f, 0x9a, 0x88, 0x52, 0xe4, 0x4b, 0xf2, 0xdb, 0x34, 0xde, 0xf3, 0xe7, 0x1e, 0x30, 0x03, 0xe0, 0xf8, 0x99, 0x2e, 0x73, 0x48, 0xcc, 0x67, 0x94, 0xc4, 0xfe, 0x1e, 0xc2, 0x7d, 0x4b, 0x15, 0x8c, 0x57, 0x55, 0x6f, 0x54, 0xbc, 0x2e, 0x0a, 0x53, 0x91, 0x78, 0x0e, 0xdd, 0x69, 0xca, 0xc6, 0xe6, 0xf9, 0x56, 0xaf, 0xc6, 0xcd, 0xc9, 0xcf, 0x39, 0x39, 0x73, 0x48, 0xaa, 0x91, 0xa8, 0x2d, 0xb1, 0x9c, 0x66, 0x94, 0xda, 0x47, 0x37, 0xed, 0xa8, 0x97, 0x59, 0x92, 0xd9, 0xe1, 0x1d, 0x9f, 0xec, 0x3d, 0x8d, 0x03, 0xe1, 0x38, 0x51, 0xd7, 0x40, 0xc9, 0xd4, 0xef, 0x5c, 0x87, 0xa2, 0xaf, 0xd9, 0x18, 0x15, 0x20, 0x6c, 0xed, 0x30, 0x43, 0xe2, 0x2c, 0xcb, 0xa6, 0x64, 0xee, 0xf0, 0x34, 0xf9, 0xab, 0x86, 0x51, 0x4c, 0xf2, 0x2c, 0x27, 0xb0, 0x5e, 0x68, 0x3a, 0x61, 0xc5, 0x01, 0x43, 0x0c, 0xb2, 0xa9, 0x3b, 0x92, 0x16, 0xdf, 0xb6, 0x0a, 0x3a, 0x14, 0x72, 0x05, 0xf8, 0x0d, 0x30, 0x15, 0x2b, 0x88, 0xc2, 0x90, 0x64, 0x22, 0x66, 0x91, 0xdf, 0x78, 0x52, 0x40, 0xb5, 0x8d, 0x90, 0x53, 0x52, 0x6c, 0x0c, 0xd5, 0x2a, 0x0e, 0xec, 0x26, 0xa8, 0x7d, 0x1f, 0x44, 0x67, 0x3a, 0x39, 0x48, 0xa5, 0xdc, 0x7e, 0x34, 0xf5, 0xfb, 0x3c, 0xeb, 0x33, 0x4c, 0x5f, 0x81, 0xbd, 0x0d, 0x3f, 0xb5, 0xe0, 0xa4, 0xbc, 0xbc, 0x91, 0x83, 0x8d, 0x41, 0x5e, 0x4e, 0xd5, 0xa9, 0xa4, 0x40, 0xf7, 0x9b, 0x01, 0xcb, 0xac, 0xc0, 0x0c, 0x7e, 0x53, 0xc7, 0x44, 0x2c, 0x88, 0xad, 0x47, 0x4b, 0xf7, 0x3b, 0x45, 0x9a, 0x72, 0xd0, 0xb3, 0x07, 0x42, 0x60, 0x44, 0xcf, 0xbb, 0xbd, 0x15, 0xe7, 0x14, 0x15, 0x27, 0x9b, 0x75, 0xbc, 0x13, 0x75, 0x50, 0x2c, 0xf9, 0x60, 0xf5, 0x4b, 0xba, 0x0d, 0x61, 0xec, 0x67, 0x96, 0x57, 0x97, 0xf9, 0x61, 0xb3, 0x8d, 0x42, 0x48, 0xfa, 0x07, 0x23, 0xf6, 0x35, 0xbf, 0x00, 0x94, 0x00, 0xb1, 0x71, 0xa6, 0xde, 0x23, 0x3a, 0x2f, 0xcf, 0xe3, 0x7e, 0x1c, 0x25, 0xd0, 0x2f, 0xdf, 0x93, 0x9b, 0xc9, 0x5b, 0x87, 0xcf, 0x40, 0x00, 0xb9, 0x0f, 0x36, 0x37, 0x04, 0x9f, 0x72, 0x00, 0x76, 0x27, 0x8e, 0xd9, 0xa3, 0xb3, 0xef, 0xe3, 0x3e, 0xfd, 0xfb, 0x40, 0xea, 0xef, 0x85, 0xbf, 0x4d, 0x64, 0x8c, 0xbb, 0x66, 0x2f, 0x26, 0x40, 0x21, 0x5e, 0xb7, 0x70, 0x29, 0xc0, 0x66, 0x25, 0xfe, 0xa4, 0xd2, 0xd8, 0x47, 0xe4, 0x00, 0xc2, 0x69, 0x22, 0x99, 0x40, 0x58, 0x52, 0x52, 0x7c, 0xae, 0x78, 0xab, 0x4a, 0xfa, 0xb3, 0xdc, 0x50, 0x5a, 0x7b, 0x0c, 0x6a, 0x4c, 0x27, 0xc5, 0x4d, 0xc1, 0xb2, 0xa5, 0x6a, 0x73, 0xbe, 0x56, 0x15, 0x79, 0xd9, 0xc0, 0xe6, 0x18, 0x00, 0x7c, 0x5f, 0xdd, 0x61, 0x8c, 0xd0, 0xe8, 0x65, 0x4a, 0x78, 0x8b, 0xee, 0x9f, 0xed, 0x14, 0xde, 0x75, 0xbe, 0xe6, 0xd8, 0x6f, 0x56, 0xcf, 0x4a, 0xd7, 0x23, 0x95, 0xab, 0xd8, 0xf8, 0xd2, 0x01, 0xed, 0xb0, 0x02, 0xa7, 0x99, 0x15, 0xdb, 0x4d, 0x59, 0x00, 0xdd, 0x40, 0xd7, 0xc1, 0x29, 0xec, 0x60, 0xc0, 0x96, 0x9f, 0x98, 0x65, 0x02, 0x8f, 0x6c, 0x36, 0xe6, 0x1f, 0x49, 0x3f, 0x2d, 0x5e, 0x8b, 0xb7, 0x47, 0xd0, 0x39, 0xe0, 0x79, 0x72, 0xef, 0x2f, 0x77, 0xf8, 0x1b, 0xad, 0x34, 0x59, 0x6c, 0x9d, 0xf9, 0x8d, 0x88, 0x5f, 0xb5, 0x95, 0xfe, 0x94, 0x94, 0xbd, 0x7b, 0x83, 0xd2, 0x1e, 0x40, 0xbc, 0xd2, 0x66, 0xd3, 0xfa, 0x6a, 0xdc, 0xf5, 0x4e, 0x81, 0x9e, 0xd5, 0x7a, 0xdd, 0x2d, 0x83, 0x9b, 0x36, 0x2c, 0xa7, 0x0c, 0x8f, 0x65, 0x73, 0x86, 0xc6, 0x0d, 0xd6, 0x8c, 0x69, 0x49, 0xf3, 0x06, 0xcb, 0xf1, 0xd1, 0x2c, 0x57, 0x93, 0x54, 0xa5, 0x25, 0xbb, 0x6c, 0xf0, 0xcb, 0x71, 0x8c, 0x04, 0x76, 0x04, 0x5e, 0x33, 0x39, 0x06, 0xb5, 0x54, 0xa4, 0x98, 0xc3, 0x21, 0x99, 0xe8, 0x8c, 0xde, 0x5b, 0xf7, 0x9a, 0x3c, 0xe8, 0xa0, 0xf2, 0x7c, 0x89, 0xd6, 0x48, 0xd7, 0xa7, 0x2d, 0x6f, 0x1e, 0xe0, 0x9b, 0x13, 0x9e, 0x5a, 0x80, 0xaa, 0x46, 0x57, 0xe5, 0xa8, 0x0c, 0x0a, 0x01, 0xf2, 0x8c, 0xaa, 0x02, 0x96, 0xf2, 0xc4, 0x0a, 0xb9, 0x1b, 0xd5, 0x77, 0xd1, 0xf7, 0x18, 0x67, 0x14, 0x32, 0x9d, 0x7b, 0x2f, 0x13, 0x9b, 0xdc, 0x3c, 0xa4, 0x07, 0x7c, 0xee, 0x13, 0x65, 0x9f, 0x0f, 0x58, 0xdf, 0x99, 0x2d, 0x18, 0x94, 0xd9, 0x90, 0xc9, 0x32, 0x26, 0x6f, 0x18, 0xc7, 0x29, 0x63, 0x87, 0xd4, 0x2c, 0x1b, 0x5b, 0xa4, 0x21, 0x52, 0xb5, 0xdb, 0xe6, 0xfe, 0xff, 0x52, 0xc7, 0xca, 0x89, 0x22, 0x45, 0xc7, 0x74, 0xff, 0x15, 0x5e, 0xd0, 0xc8, 0x6c, 0x8a, 0x01, 0x5b, 0x7a, 0x44, 0x67, 0xae, 0x34, 0x3e, 0x3e, 0x1c, 0x57, 0xd3, 0xc2, 0xfc, 0xaa, 0x3e, 0x97, 0x78, 0x83, 0x0b, 0x69, 0x9d, 0x8c, 0xcc, 0xd0, 0xae, 0xc7, 0x0d, 0x76, 0xbe, 0xd0, 0x8a, 0x7b, 0x7d, 0x63, 0x9f, 0x18, 0x53, 0x1d, 0xff, 0x83, 0xab, 0x87, 0xa9, 0x13, 0x92, 0x50, 0x18, 0xa5, 0x80, 0xda, 0xba, 0x3e, 0x75, 0xf9, 0xa4, 0xf2, 0x48, 0xf7, 0x84, 0x04, 0x3c, 0xdb, 0xd7, 0x4e, 0xd5, 0xea, 0x5c, 0xe3, 0xea, 0x6f, 0xc8, 0xf4, 0xfa, 0xb8, 0xbb, 0xf0, 0xc4, 0x61, 0xf3, 0xef, 0x11, 0xd5, 0xc0, 0x51, 0xd5, 0x11, 0xb7, 0xa2, 0x76, 0xab, 0xab, 0xc1, 0x6c, 0x13, 0xd9, 0x42, 0x0a, 0x1a, 0x63, 0x10, 0x9b, 0xb0, 0x00, 0x57, 0xb1, 0xf2, 0xf1, 0xa1, 0xba, 0x64, 0x37, 0x3f, 0xd4, 0x7a, 0x03, 0xea, 0xe3, 0x5e, 0x6e, 0xaa, 0xe0, 0xed, 0x6a, 0xf7, 0x74, 0x02, 0xf8, 0x1e, 0xc5, 0xf8, 0x9c, 0xe7, 0x90, 0x6a, 0x0e, 0x75, 0x78, 0x3d, 0x33, 0x6d, 0x9d, 0xe1, 0x4b, 0x5b, 0x71, 0xd3, 0x6c, 0x51, 0xc7, 0x67, 0x2f, 0xd1, 0x2d, 0xc4, 0xa9, 0xec, 0x7c, 0x30, 0x9d, 0xac, 0xad, 0x8e, 0xef, 0xb0, 0xee, 0x24, 0x5c, 0x16, 0xf5, 0xa2, 0x69, 0x9e, 0x95, 0x60, 0x99, 0x0b, 0x8f, 0xe8, 0xe3, 0xcd, 0xaa, 0xb4, 0x63, 0xde, 0x06, 0x39, 0x50, 0xea, 0xad, 0x24, 0x2e, 0xb2, 0x6b, 0xe3, 0x45, 0xb2, 0xe0, 0x67, 0x51, 0x01, 0xd3, 0x28, 0x7b, 0x7a, 0xc9, 0x6a, 0x88, 0x19, 0xd6, 0xbf, 0x51, 0xa7, 0xb4, 0xce, 0x73, 0x9a, 0x12, 0x52, 0x47, 0x37, 0x2e, 0x66, 0x15, 0xf9, 0xa6, 0xff, 0x84, 0x36, 0x8c, 0xba, 0x55, 0x00, 0xb8, 0xd8, 0x51, 0x4a, 0x62, 0x86, 0x80, 0x4b, 0xf0, 0x62, 0x9c, 0x28, 0x0c, 0x3c, 0xc5, 0xcd, 0xfa, 0x19, 0x76, 0x1b, 0x28, 0x7e, 0xb8, 0x49, 0x07, 0xeb, 0x96, 0x84, 0x1a, 0xa5, 0xd0, 0xd9, 0x4d, 0xb8, 0xd4, 0x55, 0x87, 0x3d, 0xe9, 0x6b, 0x82, 0xd9, 0xae, 0x95, 0xdb, 0x86, 0xc3, 0x3e, 0x65, 0x96, 0xc6, 0xe0, 0xc3, 0xf5, 0x81, 0x6a, 0x36, 0xae, 0x61, 0xe4, 0xb3, 0xb0, 0x2a, 0x55, 0x39, 0xd3, 0xea, 0xe5, 0x61, 0x16, 0x2c, 0x3f, 0x37, 0x2a, 0x6d, 0x39, 0x48, 0x35, 0xd4, 0xb7, 0xfc, 0xd0, 0x1d, 0xcc, 0x26, 0x51, 0xd7, 0x23, 0xda, 0x50, 0xcf, 0x9e, 0x7f, 0x64, 0xcc, 0x3c, 0x24, 0x2e, 0x7c, 0x40, 0x18, 0x99, 0xaf, 0x90, 0xb4, 0x5f, 0xc3, 0x5b, 0x7c, 0xd0, 0x5f, 0xfe, 0x67, 0xcf, 0x65, 0x29, 0x7a, 0x1d, 0x21, 0x3d, 0x9b, 0xda, 0xc7, 0xf9, 0xa5, 0x48, 0x1c, 0x56, 0xb8, 0xd3, 0x73, 0xaf, 0xd3, 0x4e, 0xdb, 0x25, 0xa4, 0x80, 0x97, 0x42, 0x9e, 0xdf, 0xce, 0xdd, 0x4d, 0x9b, 0x84, 0x3d, 0xe6, 0xde, 0xc9, 0x81, 0x23, 0x53, 0x30, 0x3e, 0x4d, 0xe5, 0x83, 0x6b, 0x9a, 0xc9, 0xb5, 0x7a, 0xba, 0xbe, 0x18, 0xc8, 0xad, 0x93, 0xd0, 0x37, 0xd7, 0xea, 0x88, 0x19, 0x56, 0x3d, 0x64, 0x51, 0x93, 0x1e, 0x36, 0xb4, 0x17, 0xc3, 0xf4, 0xb6, 0xa1, 0xc1, 0x6a, 0x42, 0x75, 0x18, 0x2c, 0xe9, 0xf6, 0x70, 0xcf, 0x3f, 0x77, 0xa2, 0x58, 0x82, 0x4f, 0x7a, 0xf5, 0x7d, 0x2b, 0xbc, 0xeb, 0xac, 0xa9, 0x64, 0xd0, 0xa1, 0x22, 0x32, 0xfa, 0xa6, 0xc6, 0x66, 0x37, 0xa4, 0xef, 0xc9, 0xbe, 0x44, 0xaf, 0xec, 0x66, 0x53, 0xab, 0xb4, 0x16, 0x6b, 0x2d, 0x16, 0x7d, 0xd0, 0x74, 0x20, 0x03, 0x98, 0x4f, 0x39, 0xff, 0x0f, 0xea, 0xa9, 0x2a, 0x59, 0xe7, 0x5c, 0x54, 0x59, 0xb0, 0xe2, 0x55, 0xd2, 0x0c, 0xbb, 0x47, 0xcc, 0xf1, 0xd2, 0xf2, 0x3a, 0x9a, 0x47, 0x88, 0xd9, 0xd8, 0x71, 0x93, 0x5b, 0xad, 0x24, 0x2b, 0xc5, 0x17, 0x2f, 0x6c, 0x16, 0x2a, 0x29, 0x27, 0x29, 0x61, 0x6e, 0xd8, 0xdc, 0x36, 0x64, 0xd8, 0x72, 0xf0, 0x03, 0xd4, 0x36, 0xbd, 0x94, 0x7e, 0x61, 0x00, 0xb8, 0x82, 0x3e, 0xec, 0xad, 0xbc, 0x8c, 0x52, 0xcd, 0xa8, 0x24, 0xb7, 0x57, 0x1a, 0xdc, 0xaa, 0x72, 0x2f, 0xaa, 0x55, 0x6f, 0x83, 0x0d, 0x51, 0x4f, 0xa4, 0xa8, 0xbf, 0x85, 0xc7, 0x30, 0x94, 0xfd, 0xba, 0x89, 0x34, 0x5c, 0x1a, 0x2c, 0x43, 0x8a, 0xc6, 0xcc, 0xb7, 0x6e, 0x93, 0x39, 0x32, 0xf8, 0x42, 0x84, 0x90, 0x65, 0xaf, 0x64, 0xbb, 0xbe, 0x4a, 0xd8, 0xc7, 0xa2, 0xcb, 0x0e, 0x3b, 0x46, 0x22, 0x84, 0xac, 0xba, 0xad, 0x6d, 0x91, 0x6e, 0xae, 0x56, 0x52, 0xf4, 0xfc, 0x09, 0xa2, 0x07, 0xf9, 0xb2, 0x0f, 0xcd, 0xc3, 0x40, 0xd7, 0x59, 0xaf, 0x0e, 0xfe, 0x74, 0xf3, 0xc3, 0x9d, 0x9d, 0xa2, 0x77, 0x7d, 0x4e, 0xde, 0x17, 0xe4, 0x81, 0x49, 0x0a, 0xaf, 0x73, 0xbc, 0x14, 0xa1, 0xa8, 0x3c, 0x7b, 0xfb, 0x2f, 0x29, 0x69, 0x4d, 0x27, 0xb9, 0x92, 0x8b, 0x82, 0xa5, 0x16, 0x63, 0x09, 0x22, 0xa9, 0xce, 0xa0, 0x13, 0xf1, 0xe6, 0xcc, 0x7d, 0x2f, 0xf7, 0x72, 0x3b, 0x22, 0xd8, 0xe2, 0xf3, 0x29, 0x7c, 0x13, 0x48, 0xa7, 0xc4, 0x30, 0x51, 0xab, 0x97, 0x54, 0x4a, 0xd1, 0x35, 0x93, 0x8a, 0x63, 0xc8, 0x39, 0xb5, 0xc4, 0x3d, 0x56, 0x33, 0x0f, 0x51, 0x7a, 0xe1, 0xfb, 0xef, 0xbd, 0x06, 0x02, 0xb9, 0x02, 0x88, 0xc2, 0xe5, 0x7d, 0x60 ],
+    const [ 0xaa, 0x2a, 0x95, 0xbe, 0x71, 0x7d, 0xdf, 0x5d, 0x67, 0x6a, 0xeb, 0x00, 0x65, 0xf4, 0x00, 0xe6, 0x88, 0x55, 0xc2, 0x30, 0x34, 0xf0, 0x57, 0x80, 0x58, 0x87, 0xc9, 0xc6, 0xf3, 0xae, 0xab, 0x57, 0xd7, 0x7f, 0x00, 0x40, 0xad, 0x90, 0x58, 0xd9, 0x39, 0x22, 0x3c, 0x9d, 0xdf, 0x9b, 0xcc, 0x38, 0x66, 0x37, 0xa7, 0xe2, 0xfd, 0xfa, 0x0b, 0xec, 0x7b, 0xe9, 0x3e, 0x98, 0xeb, 0x79, 0x2c, 0x2e, 0x48, 0x48, 0x51, 0x4c, 0x85, 0x0b, 0xd9, 0x7e, 0xd0, 0xc7, 0x06, 0x0e, 0x18, 0x45, 0xd3, 0x1e, 0xcd, 0xc0, 0xd7, 0xf3, 0xe7, 0xe0, 0x6b, 0x94, 0x29, 0xec, 0x0f, 0x94, 0xa7, 0x3b, 0x0a, 0x2c, 0x86, 0xeb, 0x51, 0x8d, 0x03, 0xd6, 0xaa, 0x73, 0xb6, 0xc2, 0x11, 0xfe, 0x18, 0xd8, 0x5b, 0xbe, 0x44, 0x58, 0x19, 0x0c, 0xfa, 0x8a, 0xbf, 0xa1, 0xe9, 0xf8, 0x06, 0x61, 0x2e, 0xda, 0x8e, 0x78, 0x18, 0xd2, 0xc8, 0xa8, 0x2e, 0xd9, 0x13, 0xe1, 0x73, 0x79, 0x25, 0x13, 0xe8, 0x3e, 0xad, 0x40, 0x53, 0x67, 0x36, 0xd5, 0x3f, 0xe0, 0x4f, 0x3a, 0x44, 0x75, 0xe9, 0xa8, 0x88, 0x40, 0x00, 0x3b, 0x86, 0x63, 0x7e, 0x48, 0x0e, 0xfd, 0x5c, 0xf0, 0x8d, 0x56, 0x0a, 0xf5, 0x8f, 0x5d, 0x11, 0xcd, 0x82, 0x55, 0xf7, 0xf5, 0xbd, 0xcb, 0x62, 0x88, 0xc1, 0xcb, 0x81, 0x10, 0xbe, 0x53, 0xa8, 0x9c, 0x59, 0x08, 0x3a, 0x13, 0xac, 0x28, 0xcc, 0xc7, 0x8e, 0xc0, 0x87, 0x4d, 0x15, 0x1f, 0xce, 0x8d, 0x5a, 0x8a, 0x21, 0x15, 0x7c, 0x31, 0x42, 0xb3, 0xe8, 0x62, 0x96, 0x42, 0xd7, 0xfd, 0xcd, 0xc4, 0x18, 0x28, 0xc6, 0xb1, 0x0f, 0x43, 0xac, 0x8f, 0xfe, 0x1f, 0x66, 0xc3, 0x83, 0x6a, 0x2e, 0xa7, 0x62, 0x6e, 0x7f, 0xdc, 0x85, 0xfc, 0x35, 0xe2, 0x41, 0xa2, 0xf0, 0xe5, 0xdb, 0x24, 0xb9, 0xda, 0x4b, 0x2a, 0xe8, 0xcb, 0x3f, 0x37, 0x44, 0x6f, 0x63, 0xda, 0x6d, 0xfe, 0xe0, 0x28, 0x77, 0x43, 0x22, 0x69, 0xd8, 0xf3, 0xdf, 0x12, 0x84, 0x3d, 0x55, 0xf4, 0x56, 0xa2, 0xd3, 0xb2, 0xb2, 0x07, 0x7a, 0x78, 0x69, 0x09, 0x45, 0xea, 0xdc, 0x90, 0x47, 0x5b, 0x65, 0xa7, 0x34, 0x40, 0xf2, 0x8b, 0x23, 0xe4, 0xf3, 0x01, 0x92, 0x5d, 0x77, 0xed, 0xab, 0xbe, 0x91, 0x21, 0xc6, 0x8e, 0x01, 0x73, 0x2e, 0x79, 0x10, 0x12, 0x28, 0x46, 0xbc, 0x1a, 0x31, 0x09, 0x15, 0x65, 0x88, 0x9a, 0xe7, 0xa5, 0xec, 0x45, 0x99, 0xaf, 0xa7, 0xc3, 0x55, 0x1a, 0xcb, 0x69, 0x6a, 0x09, 0xbc, 0xa0, 0xee, 0x45, 0xee, 0x95, 0xa7, 0x8f, 0xf0, 0x32, 0x2c, 0x34, 0xaa, 0x4c, 0x47, 0xe1, 0xe3, 0x1e, 0x9e, 0xb9, 0x06, 0xf6, 0x92, 0xa5, 0x25, 0x2e, 0x68, 0xeb, 0x3e, 0x5e, 0xa6, 0x03, 0xbd, 0xd0, 0xc0, 0xa6, 0x43, 0x34, 0xf4, 0x27, 0xa6, 0x95, 0x73, 0x06, 0x39, 0x8c, 0xc1, 0xc3, 0x4d, 0xb4, 0x5e, 0xf0, 0xf7, 0x5d, 0xa6, 0x8a, 0x14, 0x85, 0xf6, 0x89, 0x8b, 0x04, 0x10, 0xb6, 0xd2, 0x06, 0xc1, 0xbd, 0xb4, 0xbe, 0xc1, 0x83, 0x51, 0x59, 0xda, 0xb9, 0x66, 0x31, 0x4c, 0xb2, 0xce, 0x44, 0x71, 0x71, 0x49, 0xe4, 0x9d, 0x07, 0x7d, 0xb0, 0x48, 0x1c, 0x3a, 0xc2, 0x6f, 0xcb, 0x02, 0x2a, 0x37, 0xb3, 0xc9, 0x9b, 0xd4, 0x4a, 0xf9, 0x65, 0xa9, 0x75, 0xb9, 0xa3, 0xb0, 0x56, 0x6f, 0xb6, 0x1d, 0x65, 0x83, 0xf2, 0x3e, 0xc3, 0x67, 0x96, 0xa6, 0xcb, 0xd4, 0x02, 0x8a, 0xe9, 0x56, 0x24, 0x6b, 0xaf, 0x0a, 0x34, 0xf5, 0x25, 0xa6, 0xa1, 0x28, 0x61, 0xbb, 0x4b, 0xb5, 0x58, 0x37, 0xf2, 0xab, 0xf4, 0x2e, 0xee, 0x52, 0x67, 0xda, 0x21, 0x57, 0xbe, 0xe0, 0x2b, 0x2a, 0xb9, 0xd4, 0xdc, 0xa5, 0xda, 0x00, 0xef, 0xee, 0xbc, 0x61, 0xf5, 0x9e, 0xa6, 0xf3, 0x8f, 0x23, 0x60, 0x2f, 0xe0, 0x63, 0x45, 0xd1, 0x42, 0xa1, 0x9a, 0xde, 0x38, 0xa5, 0x1e, 0xe6, 0xa5, 0x17, 0xe2, 0x86, 0x3b, 0x2d, 0x5b, 0x32, 0x35, 0x86, 0xb6, 0x31, 0x49, 0x55, 0x6b, 0xe9, 0xd8, 0xc1, 0x15, 0x5d, 0x69, 0x8c, 0x81, 0xf4, 0x55, 0xf3, 0x05, 0x7c, 0xc3, 0xd6, 0x13, 0x6e, 0xd7, 0x19, 0x0d, 0x74, 0x27, 0x4a, 0x5b, 0x28, 0x6f, 0x84, 0xbc, 0x1f, 0x85, 0x93, 0xd9, 0x26, 0x8f, 0x58, 0x20, 0xcb, 0x73, 0x6f, 0xcf, 0x20, 0x8f, 0x10, 0x4f, 0xbb, 0xab, 0x33, 0xc4, 0x01, 0x2b, 0xf8, 0xe2, 0xa5, 0x89, 0x45, 0x02, 0x6b, 0x03, 0xb1, 0x75, 0x32, 0x91, 0xa1, 0x18, 0x31, 0x1a, 0xb0, 0x28, 0x81, 0xe7, 0x55, 0x58, 0xdb, 0x58, 0xc0, 0x21, 0xa4, 0xd6, 0x04, 0x5a, 0x26, 0x08, 0x7b, 0x08, 0x21, 0x4a, 0x66, 0x77, 0x82, 0x5b, 0xd5, 0x8a, 0x72, 0x55, 0xc7, 0x4f, 0x92, 0xe3, 0x91, 0xd6, 0x85, 0xae, 0x84, 0x44, 0xb0, 0x18, 0xca, 0x23, 0x3d, 0x2d, 0x91, 0xfc, 0x66, 0xd6, 0x6c, 0x28, 0xf0, 0x50, 0xf5, 0xe3, 0xf5, 0xdd, 0xb8, 0xa2, 0xe7, 0xba, 0x4c, 0xa7, 0xd2, 0x50, 0xc3, 0xd2, 0xe1, 0xae, 0x45, 0xba, 0x24, 0x37, 0xf7, 0xfc, 0x90, 0x98, 0x21, 0xd3, 0x48, 0xfe, 0x91, 0xe9, 0x1b, 0x85, 0x3a, 0x6d, 0x4d, 0xf3, 0x21, 0x66, 0x9a, 0xa6, 0x7a, 0x47, 0x78, 0xcb, 0x0d, 0xc3, 0x9d, 0xd1, 0xdf, 0xe2, 0xc1, 0x1d, 0x0f, 0x55, 0xa5, 0x00, 0xfe, 0x07, 0x54, 0xe6, 0xb2, 0xf4, 0xa8, 0xd0, 0x7d, 0x3e, 0x11, 0x04, 0xd9, 0x7d, 0x92, 0x02, 0x97, 0x57, 0x0c, 0xbb, 0x39, 0x52, 0xbf, 0xfe, 0x9c, 0xe5, 0x0e, 0x33, 0xda, 0xd5, 0x82, 0x4b, 0x6e, 0xbf, 0x12, 0xf7, 0x99, 0xf0, 0xa2, 0x18, 0x05, 0x7d, 0xc9, 0x77, 0xa9, 0x91, 0xd7, 0xb7, 0xec, 0x01, 0x17, 0x88, 0x0d, 0x26, 0x51, 0x1d, 0xc2, 0xeb, 0x93, 0xdf, 0x1f, 0x25, 0x31, 0x63, 0xba, 0x23, 0x0b, 0x99, 0x0d, 0x86, 0x0e, 0x47, 0x1b, 0x53, 0xfe, 0xb6, 0x57, 0x47, 0x72, 0xac, 0xc1, 0x6b, 0x20, 0x99, 0x52, 0xe8, 0x5a, 0x15, 0x9a, 0x1b, 0xd9, 0x8a, 0xa8, 0xec, 0xba, 0x2e, 0x2a, 0x5c, 0xc6, 0x35, 0xd5, 0x5e, 0xf6, 0x44, 0x07, 0xe8, 0x36, 0x28, 0xab, 0x49, 0x6a, 0xc8, 0x5e, 0xbd, 0xaf, 0x58, 0xcf, 0x3f, 0xe3, 0xd0, 0x6c, 0x9e, 0x67, 0x9d, 0x3b, 0xd3, 0x23, 0x96, 0x05, 0x92, 0xcb, 0x31, 0xba, 0x1f, 0x61, 0xf7, 0x11, 0x63, 0xfc, 0x35, 0x6f, 0x3f, 0xc7, 0xf5, 0x0a, 0x20, 0x4c, 0x2c, 0x4e, 0xd4, 0xf3, 0x35, 0x80, 0x9c, 0xc5, 0x7e, 0xa1, 0x82, 0x76, 0x82, 0x95, 0xec, 0xa3, 0xf7, 0x84, 0x72, 0x58, 0x48, 0x81, 0xed, 0xd5, 0x45, 0x69, 0xd0, 0x92, 0x1a, 0x0e, 0xbc, 0x80, 0x7d, 0x95, 0x4e, 0x92, 0x2c, 0x1d, 0x3c, 0x7c, 0x97, 0xa2, 0xa0, 0xbb, 0xd9, 0x20, 0x93, 0xd5, 0xed, 0xfb, 0xfe, 0xe2, 0x1f, 0x9e, 0xad, 0x4b, 0xc0, 0x62, 0xa5, 0xd2, 0x1e, 0xb2, 0xb8, 0xd2, 0xb4, 0x6e, 0x56, 0xc8, 0x9d, 0x8c, 0xa6, 0x13, 0x4f, 0x05, 0xd5, 0xf8, 0x85, 0xef, 0xaf, 0xe9, 0x7d, 0xe6, 0x6c, 0x07, 0x64, 0xb1, 0xcc, 0xe5, 0x0f, 0x23, 0x66, 0x8f, 0xeb, 0x3e, 0x3c, 0xcb, 0x37, 0x9f, 0x94, 0x9e, 0x70, 0x16, 0x03, 0x12, 0x0d, 0x94, 0xcb, 0x37, 0x6d, 0x4a, 0x67, 0x68, 0x0e, 0x0f, 0x63, 0xcf, 0xff, 0x02, 0x71, 0x2c, 0x98, 0x71, 0xba, 0xd1, 0x68, 0xfa, 0x72, 0xf1, 0x6f, 0xf0, 0xaf, 0x1b, 0x8d, 0x01, 0x7b, 0x02, 0x3b, 0x15, 0x27, 0x7f, 0x79, 0x78, 0xe3, 0xd9, 0x07, 0x3c, 0x8c, 0x43, 0xd8, 0xd9, 0xc5, 0xa6, 0xc4, 0x17, 0x49, 0xa1, 0x7d, 0x2e, 0x80, 0xcf, 0xc4, 0x2b, 0x50, 0x48, 0xdd, 0x95, 0x35, 0x6a, 0x40, 0x51, 0x94, 0xd9, 0x91, 0xc3, 0x4c, 0xc4, 0xd2, 0x36, 0x8f, 0x6a, 0xd8, 0x7e, 0xf0, 0xdd, 0xfb, 0xdb, 0xbc, 0x06, 0x12, 0x21, 0x8e, 0xea, 0x9f, 0x16, 0x1e, 0x2b, 0x46, 0x1c, 0x5a, 0xd2, 0x84, 0x10, 0xb8, 0x4b, 0x9d, 0x71, 0xca, 0xb1, 0xd6, 0xc5, 0x13, 0x4d, 0xe5, 0x38, 0x19, 0x59, 0xa6, 0x87, 0xbb, 0x09, 0x0f, 0x1c, 0xc5, 0xcc, 0x66, 0x7b, 0xc2, 0xcf, 0xb1, 0xdc, 0x11, 0xc2, 0x6f, 0x19, 0x3b, 0xe0, 0x85, 0xcb, 0x84, 0x29, 0x7b, 0xb0, 0xc0, 0xf2, 0xe8, 0x51, 0x68, 0xa0, 0x2b, 0xe1, 0xed, 0xb1, 0x5c, 0x67, 0x4c, 0xfc, 0x83, 0x20, 0xe3, 0x39, 0x07, 0x1e, 0x83, 0xc3, 0x69, 0x36, 0xc6, 0x9d, 0x31, 0x19, 0xa3, 0xb3, 0x29, 0xc1, 0x3f, 0x63, 0xca, 0x0f, 0x06, 0x3c, 0xf4, 0xb2, 0xfb, 0x06, 0xe2, 0x4a, 0x4c, 0x02, 0x5c, 0xcd, 0x2a, 0x73, 0x2e, 0x2a, 0xd7, 0x5c, 0xda, 0x2d, 0x01, 0x8c, 0x8a, 0xa3, 0x4e, 0xd8, 0x48, 0xbe, 0x38, 0xa8, 0x71, 0xbb, 0x1b, 0xb5, 0x67, 0xc1, 0x8c, 0x10, 0x87, 0x0d, 0xed, 0x67, 0x5b, 0x4c, 0x3e, 0x84, 0x10, 0x48, 0x36, 0x16, 0x2a, 0xc7, 0x93, 0xb4, 0x76, 0xb0, 0xae, 0x1f, 0x40, 0x70, 0x52, 0xc7, 0xc7, 0x9c, 0xce, 0x91, 0xee, 0xd8, 0x49, 0xd8, 0x34, 0xf7, 0x56, 0xb2, 0xe6, 0x64, 0xc9, 0x74, 0x94, 0xc0, 0xc8, 0x78, 0xc1, 0xcc, 0x25, 0x1d, 0xde, 0x8a, 0xeb, 0x10, 0x7a, 0x9f, 0x36, 0xca, 0xb3, 0xfc, 0x48, 0x5a, 0xf0, 0xbd, 0xda, 0x65, 0xd2, 0x51, 0xb0, 0x6b, 0x67, 0xdc, 0x70, 0x4b, 0xa1, 0xd9, 0xb4, 0x0a, 0x07, 0x04, 0x5e, 0xd0, 0xab, 0x77, 0x2c, 0x33, 0x5c, 0x13, 0x8c, 0xb8, 0x1c, 0x21, 0xb1, 0x97, 0xd5, 0x39, 0xe6, 0xbf, 0x47, 0x63, 0x22, 0x1a, 0x45, 0x7d, 0xdd, 0x12, 0x21, 0xdd, 0x23, 0x54, 0x65, 0x37, 0xe7, 0xd4, 0xc3, 0xc0, 0x99, 0x11, 0x4f, 0x93, 0xfb, 0x9a, 0xec, 0x54, 0x30, 0xd1, 0x04, 0x14, 0x15, 0xef, 0x7d, 0x75, 0xd5, 0x48, 0xe8, 0x0f, 0xb8, 0xd1, 0xfb, 0x12, 0x3c, 0xdf, 0x41, 0x2c, 0x67, 0x31, 0x10, 0xad, 0x5b, 0x31, 0xbc, 0xe9, 0x2b, 0x77, 0x0a, 0xdd, 0xed, 0x8f, 0xe7, 0x16, 0x11, 0xfc, 0x5a, 0xcf, 0xf1, 0x7c, 0xb8, 0x5a, 0xa8, 0x8e, 0x17, 0xc1, 0x28, 0x32, 0x04, 0xac, 0x87, 0xf0, 0x79, 0x85, 0x9a, 0x1b, 0x09, 0xdb, 0xc5, 0x57, 0x5e, 0x04, 0x11, 0x59, 0xe5, 0x07, 0x7f, 0xee, 0xc8, 0xb9, 0x9d, 0x3f, 0x1d, 0x25, 0x56, 0x53, 0x5d, 0x31, 0x0e, 0xd5, 0x17, 0x7f, 0xef, 0x18, 0xe5, 0x92, 0x7d, 0x58, 0xa0, 0x32, 0x71, 0x43, 0xd0, 0x11, 0xc4, 0xb7, 0x66, 0xae, 0x0a, 0xce, 0xae, 0x7a, 0x01, 0x18, 0x7f, 0x3a, 0x6a, 0x27, 0xb5, 0xac, 0x17, 0x51, 0xe0, 0x6d, 0x46, 0xb1, 0x3e, 0x1a, 0x2d, 0x6f, 0xe7, 0xb5, 0xd6, 0x41, 0x48, 0x4b, 0x2d, 0x32, 0xd2, 0xd4, 0x58, 0xa3, 0xf3, 0x5b, 0x46, 0x8f, 0x46, 0x5f, 0x8b, 0x13, 0x07, 0x78, 0x6b, 0x2d, 0xc9, 0x3e, 0x34, 0xc4, 0x6b, 0x66, 0xd2, 0xe8, 0x48, 0x2e, 0x9d, 0x5c, 0xae, 0xfc, 0x75, 0x51, 0x92, 0x41, 0x11, 0x75, 0x81, 0xa4, 0x94, 0x2c, 0xda, 0x5d, 0x61, 0x1d, 0x3b, 0xde, 0x31, 0xf1, 0x39, 0xb9, 0x63, 0x57, 0x54, 0xbe, 0x93, 0x4c, 0x29, 0x63, 0x6d, 0x99, 0xea, 0x6a, 0xc3, 0x9d, 0x0c, 0xbd, 0xde, 0x4c, 0x3f, 0x9d, 0x12, 0x78, 0xa3, 0xfb, 0x95, 0x50, 0x39, 0x26, 0x92, 0x26, 0x98, 0xa7, 0x78, 0x75, 0xe1, 0x69, 0x98, 0x22, 0xf4, 0x1e, 0xef, 0x02, 0xe4, 0xdd, 0x40, 0x9d, 0xa9, 0x10, 0x67, 0x31, 0x15, 0x8d, 0xe9, 0xfa, 0x0a, 0x03, 0xcf, 0xb1, 0xe9, 0x98, 0xb5, 0x53, 0x4d, 0xd0, 0x1e, 0x23, 0xfa, 0xb1, 0x0a, 0xf2, 0x10, 0x25, 0xcb, 0x9e, 0x85, 0x9f, 0x14, 0xd9, 0xd1, 0x01, 0x53, 0x2b, 0xeb, 0xbe, 0x40, 0x3a, 0x75, 0x3b, 0xb6, 0x4a, 0x33, 0x7c, 0xc3, 0x00, 0xc2, 0xfc, 0xfb, 0x6b, 0x87, 0xdc, 0x11, 0x45, 0xe5, 0x40, 0xa8, 0x75, 0xb3, 0xf7, 0x66, 0xd9, 0xed, 0x5a, 0x4a, 0x43, 0xa9, 0x76, 0x40, 0xc1, 0x4d, 0x6d, 0xf3, 0x22, 0x00, 0x19, 0xe3, 0xb5, 0x5e, 0xf3, 0xb7, 0x54, 0x70, 0x33, 0xd4, 0xa1, 0xdb, 0x39, 0x2e, 0x90, 0x57, 0x2c, 0x5e, 0x26, 0x63, 0xe1, 0xf6, 0x80, 0x38, 0xfe, 0x11, 0x16, 0xfb, 0x5f, 0x2e, 0x41, 0x36, 0xb8, 0x3e, 0xfb, 0x89, 0x7c, 0xfb, 0xe6, 0x9d, 0xfe, 0x7c, 0x91, 0x5a, 0xd7, 0x06, 0xf6, 0x5a, 0x87, 0x26, 0x47, 0x9d, 0x5f, 0xfc, 0xea, 0x7e, 0x9e, 0xda, 0xc2, 0xe5, 0xda, 0x0e, 0xb0, 0xbf, 0xa1, 0xfb, 0x59, 0xab, 0x61, 0x6f, 0x2a, 0xf6, 0x85, 0x30, 0x9a, 0xca, 0xe1, 0xd8, 0xaf, 0xa2, 0x50, 0xe3, 0xc4, 0x01, 0x9b, 0x07, 0x89, 0x64, 0x9d, 0xc4, 0x4b, 0x75, 0xa5, 0x3b, 0x76, 0x81, 0x1c, 0x43, 0x58, 0x2c, 0x68, 0xba, 0x27, 0x64, 0x0f, 0x19, 0x46, 0x93, 0x20, 0x4b, 0xc4, 0x19, 0xcf, 0xc0, 0x26, 0xf9, 0x5f, 0xbd, 0x66, 0xd2, 0x45, 0xf6, 0x3b, 0x12, 0x8a, 0x5e, 0x9b, 0x66, 0x71, 0x3e, 0x7e, 0x75, 0x5a, 0x84, 0xe6, 0xcd, 0xe6, 0x5e, 0x1c, 0x1d, 0x5c, 0x08, 0x3c, 0xa6, 0x4b, 0xe3, 0xf3, 0xec, 0x71, 0xc6, 0x88, 0xb1, 0xdc, 0x98, 0x19, 0x23, 0x4f, 0x1f, 0x28, 0x55, 0xe7, 0x13, 0x56, 0xec, 0xfe, 0x77, 0x6d, 0x1b, 0x50, 0x29, 0xa4, 0xd1, 0x5c, 0xb7, 0x1f, 0x30, 0x0e, 0x74, 0xb6, 0x42, 0x9a, 0xcb, 0xf7, 0xe7, 0xab, 0xd4, 0x6e, 0x12, 0xbd, 0x25, 0x24, 0x35, 0xc7, 0xeb, 0x65, 0xfa, 0x1e, 0x39, 0xc6, 0x34, 0x96, 0x9f, 0x67, 0x15, 0xea, 0xff, 0x76, 0xa1, 0x5e, 0x9c, 0xf4, 0x62, 0xa2, 0x74, 0xbc, 0x5e, 0xfa, 0xd0, 0xc1, 0x46, 0x9c, 0x19, 0x97, 0xf0, 0x59, 0xed, 0x35, 0x07, 0x80, 0x72, 0xf9, 0x02, 0x00, 0xea, 0xec, 0x52, 0xcc, 0x88, 0x48, 0xe0, 0x84, 0x82, 0x37, 0xb6, 0x51, 0x68, 0xde, 0xfc, 0x11, 0xb4, 0x9a, 0x27, 0xb4, 0xa2, 0x89, 0x6d, 0xe5, 0x42, 0x4d, 0x7c, 0xed, 0xcb, 0x0c, 0x6b, 0xd5, 0x32, 0xbb, 0xf1, 0xcb, 0xfb, 0x9d, 0xd5, 0xc8, 0x50, 0x06, 0xa5, 0x6f, 0x50, 0x65, 0xab, 0x37, 0xa9, 0x81, 0x1d, 0xcc, 0x69, 0x03, 0x94, 0xb3, 0x11, 0x35, 0xbf, 0x2d, 0xeb, 0x09, 0x59, 0x5f, 0x9e, 0x5d, 0x58, 0xaf, 0x00, 0x7d, 0x68, 0x71, 0x2b, 0xea, 0x97, 0xc3, 0xd3, 0x5a, 0x52, 0xb5, 0xd7, 0xff, 0x90, 0xae, 0x15, 0x0c, 0x4d, 0x0b, 0x83, 0x76, 0x3a, 0x08, 0x7c, 0xf7, 0xb3, 0xe4, 0x57, 0x59, 0xf1, 0x40, 0x3e, 0xf1, 0x81, 0xc9, 0x3d, 0x6a, 0xf4, 0x16, 0x9a, 0xc4, 0xd9, 0xd3, 0x65, 0x9b, 0xe8, 0x20, 0x4f, 0xad, 0x80, 0x34, 0xc0, 0x97, 0x54, 0x46, 0x23, 0xdf, 0x61, 0xad, 0x85, 0x37, 0x23, 0x46, 0x5e, 0x00, 0x08, 0x16, 0xae, 0x0e, 0x25, 0x30, 0x4c, 0xab, 0x27, 0xd9, 0x7b, 0xde, 0x8d, 0xeb, 0xbf, 0xed, 0x15, 0x77, 0xef, 0x20, 0x74, 0xae, 0x8a, 0xc8, 0x4a, 0x02, 0x4e, 0x80, 0x55, 0x88, 0x07, 0xb3, 0xe5, 0xa1, 0xa6, 0x5e, 0x90, 0xd9, 0x92, 0x17, 0x26, 0x0f, 0x43, 0x4f, 0xe8, 0xd7, 0x0c, 0xd4, 0xf4, 0x1c, 0x38, 0x99, 0x04, 0x0a, 0x59, 0xba, 0x58, 0x2a, 0xdd, 0xbb, 0xf1, 0xcf, 0xe2, 0x11, 0x00, 0xb2, 0x4c, 0xe3, 0x9e, 0xd9, 0x14, 0x11, 0xbd, 0xbd, 0xe2, 0x76, 0x5f, 0xab, 0xdf, 0x6a, 0x06, 0x6b, 0xc4, 0x8b, 0x6b, 0x20, 0x38, 0xbe, 0x72, 0x6f, 0x58, 0x70, 0x5e, 0xe3, 0x97, 0x22, 0x41, 0x90, 0xc8, 0x24, 0xb7, 0xf7, 0x79, 0xa0, 0xd4, 0x2a, 0x83, 0xdb, 0x5b, 0x31, 0xdf, 0xb8, 0x31, 0xab, 0xbb, 0x7e, 0x11, 0xb8, 0xcd, 0xda, 0x80, 0x17, 0xe8, 0x28, 0x04, 0x8c, 0xcd, 0xee, 0x91, 0x85, 0x43, 0xa9, 0x44, 0xfc, 0x6a, 0xcd, 0x54, 0x9f, 0x4c, 0x07, 0x45, 0x2f, 0xb5, 0xc5, 0x5e, 0x26, 0x45, 0xf8, 0x5e, 0x9c, 0xc3, 0x18, 0x6b, 0x6b, 0xb4, 0x69, 0x4b, 0x92, 0x2c, 0x7e, 0xd6, 0xd7, 0xe5, 0xfb, 0xab, 0xb1, 0x8e, 0x9f, 0x23, 0x64, 0x65, 0x81, 0x83, 0x6e, 0x08, 0x99, 0x76, 0x22, 0x88, 0x83, 0xba, 0x93, 0xc0, 0x80, 0x19, 0xb3, 0xe5, 0xbe, 0x9b, 0xbc, 0x5e, 0xd9, 0xfa, 0xcf, 0xd5, 0xa1, 0x56, 0xdb, 0x8e, 0x1e, 0x2a, 0xc1, 0xf7, 0xd1, 0x7f, 0xb6, 0x81, 0x3d, 0x5f, 0xe8, 0xaf, 0xa6, 0x8d, 0x64, 0x6c, 0x19, 0x73, 0x37, 0xa2, 0xac, 0x5c, 0xd3, 0x08, 0x07, 0xe3, 0xb5, 0x3c, 0x23, 0xab, 0x45, 0x11, 0x52, 0x51, 0xfe, 0x2a, 0x80, 0x9f, 0xce, 0xc8, 0xb8, 0x03, 0xc0, 0xe0, 0xea, 0x3f, 0xd8, 0x71, 0xeb, 0x61, 0x3e, 0x14, 0xbd, 0xf6, 0xa0, 0xd5, 0x11, 0x7b, 0xd1, 0x41, 0x0a, 0x14, 0xb6, 0xc0, 0x44, 0x81, 0x62, 0x25, 0x15, 0x4d, 0x80, 0x84, 0x12, 0x48, 0xf1, 0x43, 0xd5, 0x38, 0xb7, 0x74, 0xfe, 0xcc, 0x12, 0x62, 0x78, 0xd1, 0xe8, 0x6a, 0xfe, 0xa8, 0x6a, 0x0d, 0xdd, 0xf8, 0xf5, 0x43, 0xfb, 0xa0, 0x36, 0x11, 0x18, 0xf0, 0x92, 0x5d, 0x54, 0x18, 0xc5, 0x02, 0xf1, 0xe0, 0xc9, 0x20, 0x5b, 0x9a, 0xf9, 0xb5, 0x65, 0x55, 0x76, 0x72, 0xd6, 0x54, 0xca, 0xc7, 0x24, 0xbf, 0xcb, 0x41, 0x7f, 0x97, 0xc2, 0x15, 0x11, 0xef, 0xcd, 0xfd, 0x85, 0x5a, 0x82, 0x42, 0xc6, 0xa0, 0xd5, 0x1a, 0x09, 0xb5, 0x3c, 0x35, 0x0d, 0xeb, 0x11, 0x93, 0xa1, 0x66, 0x37, 0x98, 0x68, 0xd0, 0x00, 0x62, 0xd9, 0x4f, 0x4e, 0x5a, 0x89, 0xb4, 0xf9, 0x09, 0xad, 0xf6, 0x71, 0x2e, 0xda, 0xde, 0xa5, 0x0d, 0x10, 0x03, 0x23, 0x09, 0xf7, 0xf9, 0x80, 0x75, 0x68, 0xc6, 0xfa, 0xa8, 0x2f, 0x95, 0x5c, 0x4f, 0x10, 0xaf, 0x22, 0x08, 0x08, 0xa6, 0xde, 0x2c, 0xd4, 0xd3, 0xda, 0xeb, 0xb8, 0x03, 0xff, 0x9f, 0x79, 0x6e, 0xf5, 0x5a, 0xab, 0xe9, 0x8c, 0xc1, 0x33, 0x5c, 0x5b, 0x1e, 0x04, 0x75, 0xa7, 0xb0, 0x2c, 0x9e, 0x86, 0x46, 0x14, 0x2d, 0x43, 0x0c, 0x03, 0xdb, 0x05, 0xa4, 0xe5, 0x78, 0xac, 0x78, 0x4b, 0xdd, 0xfc, 0x4f, 0xb2, 0x21, 0xfd, 0x1f, 0x08, 0x10, 0xa1, 0x22, 0x6c, 0xd8, 0xa8, 0x2c, 0x36, 0x06, 0xc1, 0x3c, 0x37, 0xb1, 0xf2, 0x51, 0x42, 0xf5, 0x39, 0x7f, 0xea, 0xa4, 0x74, 0x41, 0x8e, 0x37, 0x7e, 0x11, 0x93, 0x0b, 0x9b, 0x36, 0xf1, 0xca, 0x16, 0xde, 0xf1, 0x26, 0x28, 0x6c, 0x35, 0xce, 0x1c, 0x13, 0xf8, 0x9a, 0xb1, 0xa4, 0x97, 0x09, 0xc0, 0xa4, 0x50, 0xee, 0x1e, 0xa2, 0x4a, 0x66, 0xc4, 0xc7, 0xd6, 0x0d, 0x2d, 0xaf, 0xf5, 0x72, 0x00, 0x77, 0x1a, 0xc8, 0xef, 0x18, 0x31, 0xde, 0xdf, 0xf3, 0xdf, 0x51, 0x49, 0xad, 0x0c, 0x00, 0xe0, 0x3c, 0x9f, 0xc0, 0x74, 0x42, 0x88, 0x51, 0x16, 0x9a, 0x04, 0x91, 0x7d, 0x31, 0x1c, 0xf0, 0xa8, 0x18, 0x6f, 0x24, 0xc5, 0xd7, 0x32, 0x1e, 0x52, 0x03, 0x75, 0x3c, 0x82, 0x13, 0xa8, 0xc0, 0xe2, 0x6f, 0x5d, 0x81, 0x3c, 0xca, 0x50, 0xe0, 0xbb, 0xb2, 0xa4, 0xfe, 0x51, 0x65, 0x6f, 0x2c, 0x56, 0xe7, 0x79, 0xa3, 0x72, 0x51, 0x41, 0x76, 0xbc, 0x6c, 0x41, 0xc4, 0x23, 0x7e, 0x73, 0x32, 0x0e, 0x64, 0x14, 0x98, 0x3f, 0xe1, 0xa8, 0xfb, 0xfd, 0x36, 0x3e, 0xbc, 0x72, 0xf3, 0xf5, 0x0e, 0x52, 0x0c, 0xbf, 0xad, 0xbd, 0x2f, 0x65, 0xce, 0x67, 0x55, 0xcc, 0x51, 0xf6, 0x98, 0x76, 0x3e, 0xab, 0x44, 0x4b, 0x6f, 0x45, 0x30, 0x9a, 0x8a, 0x22, 0x4f, 0x5b, 0x33, 0xa8, 0x82, 0xb7, 0x7f, 0xe3, 0xb0, 0xca, 0xab, 0x6f, 0x19, 0xa7, 0x0e, 0x99, 0xe7, 0x9c, 0x4c, 0xc1, 0x06, 0xb8, 0xcd, 0x03, 0x36, 0x8b, 0x6d, 0x16, 0x5f, 0x2d, 0x75, 0x73, 0x24, 0x82, 0xcb, 0xba, 0xba, 0xbb, 0x65, 0x52, 0xfb, 0x20, 0x03, 0x50, 0xb6, 0x0d, 0x1e, 0x9b, 0x4a, 0x3b, 0x1b, 0x4d, 0x73, 0x41, 0xc5, 0x5c, 0x63, 0x5b, 0xfa, 0x79, 0x15, 0x69, 0xa4, 0x38, 0xde, 0x3b, 0xec, 0x72, 0x45, 0x0b, 0xaa, 0xe8, 0x14, 0x4b, 0x1f, 0x28, 0xaf, 0xa2, 0xe6, 0xb5, 0xa5, 0x31, 0x28, 0x62, 0x85, 0x1a, 0x10, 0xff, 0xf3, 0x43, 0x7e, 0x37, 0xfa, 0x57, 0x00, 0xb9, 0xa4, 0x0e, 0xfe, 0x96, 0xc8, 0xaf, 0x34, 0xea, 0x24, 0xd3, 0x65, 0xbf, 0xab, 0x6b, 0x4e, 0x2e, 0x20, 0x04, 0xda, 0xc7, 0xe4, 0x4a, 0x94, 0x34, 0x0d, 0xcb, 0x61, 0x18, 0xb7, 0xfe, 0x6f, 0x3d, 0x9f, 0x84, 0x69, 0xef, 0xee, 0xad, 0xed, 0xa3, 0x52, 0x3e, 0x3f, 0xdd, 0x53, 0x72, 0x3f, 0x50, 0xe5, 0x3e, 0x98, 0x46, 0x39, 0xd9, 0x3b, 0x42, 0xd9, 0x7c, 0x0c, 0xe4, 0xf4, 0x67, 0xda, 0x0e, 0xf6, 0x24, 0x95, 0x45, 0x5c, 0x0f, 0xbb, 0x5a, 0xc7, 0x16, 0x14, 0x49, 0x4f, 0xbe, 0x9f, 0x61, 0x19, 0x66, 0xcc, 0xa5, 0x2c, 0xd0, 0xeb, 0x73, 0x80, 0xdd, 0xe5, 0x63, 0x58, 0x98, 0x2a, 0x72, 0xd2, 0x76, 0xea, 0x60, 0xbd, 0xdd, 0x88, 0x56, 0xaa, 0xe2, 0x4c, 0xcc, 0x46, 0x57, 0x58, 0xaa, 0xe7, 0x05, 0xdd, 0xad, 0x64, 0x36, 0x8e, 0x0d, 0x2a, 0x77, 0x55, 0x5d, 0x8c, 0x9b, 0x45, 0xb2, 0x5b, 0x03, 0xd1, 0x07, 0xb7, 0x1d, 0x3b, 0xe0, 0x24, 0x2b, 0x4f, 0x2e, 0xe1, 0x46, 0x50, 0x73, 0x75, 0xa2, 0x33, 0x26, 0x8a, 0x13, 0x0b, 0x59, 0xfe, 0xd0, 0xc5, 0x99, 0x38, 0x78, 0x15, 0x16, 0xb8, 0x52, 0xb0, 0x04, 0xf2, 0xd9, 0xbc, 0x40, 0x5d, 0x78, 0x84, 0x37, 0xc7, 0x92, 0x71, 0x04, 0xeb, 0xc5, 0x36, 0xd8, 0x45, 0x70, 0x4a, 0x9f, 0x25, 0x72, 0x9b, 0xe0, 0x03, 0x35, 0x81, 0xe5, 0x12, 0xec, 0xf0, 0x1d, 0x17, 0x18, 0xf3, 0xbe, 0x7c, 0x51, 0x55, 0xae, 0xa0, 0x43, 0xa1, 0xa4, 0x72, 0xf7, 0x4e, 0x8b, 0x3e, 0x54, 0x33, 0x27, 0xc7, 0xe5, 0x41, 0xfa, 0x95, 0xdc, 0x70, 0x69, 0x90, 0x57, 0xfa, 0x1b, 0xce, 0xe3, 0xc8, 0xa2, 0xaa, 0x3e, 0x29, 0x5d, 0x16, 0x62, 0xca, 0x9c, 0x32, 0xbe, 0xe3, 0x06, 0x1d, 0xc7, 0xae, 0x38, 0x0a, 0xaf, 0x1d, 0xaf, 0x97, 0x74, 0xcc, 0xe8, 0x5b, 0x1d, 0x35, 0xc5, 0xbe, 0x41, 0x23, 0x33, 0x0e, 0xc8, 0x69, 0x0a, 0xcf, 0xf5, 0xd3, 0x35, 0x52, 0xa5, 0x5d, 0x12, 0x89, 0xd1, 0xa3, 0x1b, 0x19, 0x5a, 0x99, 0xc7, 0xb1, 0x06, 0x7c, 0xab, 0x9a, 0xc5, 0x08, 0xe5, 0x90, 0x3a, 0xec, 0xba, 0xd1, 0x76, 0x7b, 0x7e, 0x73, 0x07, 0xa4, 0xb4, 0xfa, 0x31, 0x24, 0x77, 0x2a, 0x7b, 0xfa, 0x19, 0x1a, 0x6e, 0x1b, 0x09, 0x8a, 0x99, 0x68, 0xfa, 0x76, 0xd8, 0xdd, 0x41, 0xec, 0xd6, 0x0b, 0x7f, 0x1a, 0xd1, 0xc8, 0x81, 0xab, 0x9d, 0x25, 0x64, 0x54, 0xec, 0xa0, 0xfd, 0xa9, 0xcc, 0x9b, 0x78, 0x36, 0x71, 0x0d, 0x3e, 0xcb, 0x35, 0x78, 0x1d, 0x17, 0xdd, 0x1b, 0xa3, 0x78, 0x1e, 0x68, 0xca, 0x12, 0x60, 0xb8, 0xdb, 0x1f, 0xc1, 0x3e, 0x8c, 0x85, 0x5d, 0x39, 0x6b, 0xae, 0xcd, 0x6e, 0x80, 0x94, 0xed, 0xd6, 0x2e, 0x1b, 0xe2, 0x94, 0x5b, 0xa4, 0x5c, 0x29, 0xd1, 0xdf, 0x19, 0xeb, 0xe3, 0xe0, 0xab, 0xb4, 0x53, 0x76, 0x7a, 0xd7, 0x73, 0xb8, 0x0c, 0x58, 0x8b, 0xe0, 0x84, 0x5c, 0x7b, 0x5d, 0x69, 0xde, 0xa1, 0x23, 0xa9, 0xa4, 0xfd, 0x46, 0xde, 0x71, 0x93, 0xc7, 0xcf, 0x7d, 0x11, 0xae, 0x3a, 0x22, 0xb2, 0x58, 0xd1, 0xd8, 0x62, 0x13, 0x82, 0x63, 0x23, 0xe8, 0xfb, 0x4b, 0xaf, 0xb8, 0x6e, 0x8d, 0x5f, 0x8b, 0x91, 0x90, 0x4b, 0x24, 0xea, 0x5a, 0xb3, 0xd9, 0x49, 0x04, 0x9e, 0xa1, 0x96, 0x6b, 0xc0, 0x6f, 0xcc, 0x29, 0xa1, 0xbe, 0x46, 0xc4, 0xfc, 0x6d, 0x3a, 0x24, 0x65, 0xce, 0x83, 0x4b, 0x2f, 0xfa, 0xa3, 0x40, 0x8d, 0x67, 0x08, 0x4c, 0xf7, 0xbc, 0x8e, 0x69, 0xd0, 0xe3, 0x46, 0xf8, 0x45, 0x60, 0x76, 0xb2, 0x78, 0xe2, 0xe0, 0xe1, 0xde, 0x18, 0x47, 0xd0, 0xe5, 0xc6, 0x30, 0x80, 0xdb, 0x18, 0xe6, 0x9c, 0x0b, 0x36, 0xc0, 0xaf, 0x29, 0x18, 0xa6, 0x95, 0xf0, 0x9c, 0xd2, 0x30, 0x09, 0xd6, 0xd4, 0x5c, 0x2f, 0xa7, 0xd9, 0x24, 0x91, 0x91, 0x2c, 0x36, 0x77, 0xc9, 0xfd, 0x94, 0x29, 0x8e, 0x62, 0x8d, 0x0d, 0xba, 0x9b, 0xec, 0x0f, 0x97, 0x9a, 0x6f, 0x45, 0xf3, 0xc3, 0x7a, 0xd3, 0x77, 0xf0, 0x0d, 0x0d, 0x34, 0xb8, 0xf4, 0xdc, 0x7f, 0xf1, 0x3d, 0x63, 0xff, 0x73, 0xef, 0xe2, 0x04, 0x1f, 0xf9, 0xda, 0x1a, 0x20, 0x69, 0x72, 0xdf, 0x71, 0xde, 0x19, 0x11, 0x9f, 0x40, 0x6d, 0xeb, 0xd1, 0xae, 0x5b, 0xb2, 0x05, 0xb8, 0x88, 0x8b, 0x9c, 0xcf, 0xf0, 0x8f, 0x19, 0xf9, 0xce, 0x21, 0x26, 0xca, 0xbb, 0x7f, 0xd8, 0x8f, 0x19, 0x98, 0x33, 0xcc, 0xb2, 0x1e, 0xf1, 0xe9, 0x9d, 0xdb, 0x7f, 0x28, 0x62, 0x48, 0x49, 0xda, 0x5d, 0x5c, 0x37, 0xd3, 0x68, 0xa2, 0x77, 0x1b, 0xb4, 0x8e, 0x7e, 0xe6, 0xf8, 0x11, 0x49, 0xc6, 0xce, 0x6b, 0xe9, 0x20, 0x59, 0x41, 0x3e, 0xdd, 0x2c, 0xef, 0x03, 0x61, 0x67, 0x1f, 0x0a, 0xc1, 0x23, 0x9b, 0xc9, 0x30, 0x11, 0x5f, 0x16, 0xbb, 0x5d, 0xf3, 0x2f, 0x37, 0xd9, 0xf7, 0xfd, 0x77, 0x57, 0xff, 0x9a, 0xc2, 0x56, 0xa2, 0x10, 0x83, 0xe2, 0xce, 0x64, 0x43, 0xb5, 0x5e, 0xd3, 0xd5, 0xa2, 0xef, 0x5b, 0xd0, 0x34, 0xef, 0x7d, 0x43, 0x92, 0xf6, 0x42, 0xa3, 0xa5, 0x5a, 0x7c, 0x08, 0x7d, 0xfe, 0x4e, 0x99, 0xf1, 0x6a, 0xee, 0x45, 0x86, 0x21, 0xaa, 0xb5, 0x93, 0x2e, 0x29, 0x7e, 0xa2, 0x01, 0xf4, 0x9a, 0x18, 0x79, 0x34, 0x19, 0x19, 0x42, 0xbe, 0x14, 0xa6, 0x61, 0x4c, 0xe3, 0x08, 0x0d, 0x0d, 0x8f, 0x72, 0xc1, 0x61, 0x8a, 0xe2, 0x8f, 0xdd, 0x9e, 0x48, 0xb7, 0x96, 0x24, 0xea, 0x78, 0x9c, 0x76, 0x07, 0x26, 0xc4, 0xa7, 0xba, 0x7d, 0xab, 0x71, 0x22, 0x35, 0xf7, 0x6e, 0xc0, 0xd6, 0xe0, 0x8b, 0x20, 0xce, 0xf0, 0xbb, 0xbc, 0xc1, 0x06, 0xe8, 0x1d, 0x20, 0xa1, 0x2f, 0x43, 0xfd, 0x5b, 0x4c, 0x47, 0x1e, 0xb4, 0x53, 0x3f, 0x50, 0x11, 0xa2, 0x62, 0xfd, 0x05, 0x13, 0x6d, 0x01, 0xce, 0x76, 0x45, 0xba, 0x23, 0x3e, 0xdd, 0x5e, 0x2d, 0x7a, 0x5a, 0x92, 0xd3, 0x07, 0x75, 0x38, 0x3a, 0x04, 0x21, 0x88, 0x8c, 0x87, 0x6e, 0x62, 0xf9, 0x8e, 0xae, 0xe2, 0xfc, 0x39, 0xd6, 0x36, 0xe0, 0x36, 0x27, 0xac, 0x82, 0x7c, 0x0d, 0x0f, 0x58, 0x3c, 0x47, 0x34, 0xb2, 0x14, 0x48, 0xd0, 0x40, 0x87, 0xdd, 0x8c, 0xd5, 0xaa, 0x11, 0x5c, 0x6a, 0x1f, 0x4e, 0x0c, 0x66, 0x47, 0xc4, 0x1c, 0x1d, 0xb4, 0x0e, 0xcd, 0x96, 0xdd, 0x13, 0x7c, 0x91, 0x16, 0x2b, 0x2f, 0xc8, 0xbf, 0x84, 0x6e, 0x76, 0xbb, 0xc3, 0x54, 0x16, 0x24, 0xee, 0xe5, 0x6d, 0x3c, 0x89, 0xa2, 0xca, 0xa7, 0xff, 0x5b, 0x8d, 0xd8, 0x44, 0x45, 0xe6, 0xca, 0xb9, 0x4c, 0xdf, 0xf0, 0x50, 0xaa, 0x9d, 0x6e, 0xf0, 0xb9, 0xe2, 0x89, 0x1b, 0x05, 0xd7, 0x5c, 0xce, 0xa6, 0x09, 0xcd, 0xa8, 0xcd, 0xb1, 0xc0, 0x4f, 0x9c, 0x38, 0x8b, 0x10, 0x3b, 0xfa, 0xa9, 0xc5, 0x28, 0x4b, 0xb2, 0xfc, 0xce, 0xb7, 0x8a, 0x55, 0x5a, 0x8e, 0xd9, 0x2c, 0xca, 0xa1, 0xbc, 0x78, 0x46, 0x46, 0xbb, 0xf3, 0xb4, 0xa2, 0xfa, 0x7c, 0x87, 0x27, 0xb3, 0xb9, 0xd7, 0x5b, 0xe3, 0x00, 0xb7, 0xdb, 0x44, 0x78, 0xc3, 0xa0, 0x7c, 0x7b, 0xf8, 0x82, 0x94, 0x3f, 0xc9, 0xfa, 0xab, 0xb6, 0x6e, 0x2c, 0xec, 0xb2, 0x80, 0x25, 0xbd, 0x4d, 0xc3, 0x61, 0x39, 0x88, 0x43, 0x90, 0xe1, 0x32, 0xa2, 0x99, 0x8e, 0x0c, 0xb0, 0xe0, 0xab, 0x2a, 0x3c, 0xc5, 0xa0, 0x9c, 0x2a, 0x6d, 0x91, 0x4e, 0xc6, 0xc4, 0x49, 0x2d, 0x58, 0xc2, 0x71, 0x8b, 0xf9, 0xee, 0x06, 0xc5, 0xa4, 0x21, 0x0a, 0x23, 0x90, 0x8d, 0x79, 0xff, 0xbd, 0xfd, 0x7e, 0x2a, 0xcd, 0x5e, 0xe7, 0x8b, 0x16, 0x7f, 0xd7, 0x09, 0xf5, 0x15, 0xba, 0xac, 0x65, 0x02, 0x7e, 0xfe, 0xd0, 0xd7, 0x01, 0xb8, 0x25, 0x97, 0xc5, 0x9a, 0x2a, 0xbe, 0xeb, 0x9b, 0x14, 0x81, 0x5f, 0x42, 0x55, 0x58, 0x50, 0x54, 0xb5, 0xba, 0xe3, 0xaf, 0xa4, 0x27, 0x28, 0x76, 0xce, 0x6c, 0x4d, 0x6e, 0xf1, 0x23, 0x11, 0xa8, 0xeb, 0x79, 0x7c, 0x61, 0x18, 0x34, 0xcd, 0x26, 0xda, 0xf4, 0xb5, 0x3c, 0x79, 0xb8, 0xc2, 0x3e, 0x2e, 0xa5, 0x1e ],
+    const [ 0xd7, 0xa5, 0x68, 0x8c, 0x0c, 0x38, 0x5e, 0xdc, 0xc1, 0x60, 0x49, 0x30, 0xcc, 0x73, 0xba, 0x22, 0x67, 0x8c, 0xec, 0x50, 0xcc, 0xd3, 0xfa, 0xbc, 0x02, 0xff, 0x50, 0x73, 0xf6, 0x19, 0x5f, 0x6d, 0xcd, 0x82, 0x96, 0xb5, 0x79, 0x37, 0x8d, 0xc9, 0x8a, 0x54, 0x83, 0x44, 0x47, 0xd7, 0x0a, 0xba, 0xfe, 0xa7, 0x01, 0xe4, 0x98, 0xd5, 0xc3, 0xfd, 0x70, 0x21, 0x9e, 0x6b, 0x66, 0xc0, 0x87, 0xa2, 0x2f, 0x5c, 0x0b, 0x46, 0xef, 0x5d, 0x89, 0x8f, 0x09, 0x67, 0x9f, 0xf2, 0x35, 0x23, 0xe2, 0xfe, 0xd4, 0x43, 0xd2, 0x84, 0x81, 0xc0, 0x0d, 0xfa, 0xe9, 0x66, 0xc2, 0x21, 0xdc, 0x93, 0x69, 0xe6, 0xa4, 0x3c, 0xb1, 0x86, 0x95, 0x30, 0xba, 0xf6, 0xe5, 0xa1, 0x85, 0x82, 0xbe, 0xe0, 0xa9, 0xb4, 0x92, 0x68, 0x47, 0x77, 0xaf, 0x1e, 0x3f, 0x7c, 0x13, 0xd7, 0xa4, 0xdd, 0x81, 0x1b, 0x6e, 0x01, 0xd4, 0x29, 0x6f, 0xbf, 0x94, 0x3a, 0x89, 0xc6, 0xc7, 0x0a, 0x1d, 0x3c, 0x09, 0x95, 0xc6, 0xa5, 0xdf, 0x1e, 0x48, 0x07, 0x49, 0x76, 0xc3, 0x4b, 0x96, 0x7b, 0x2d, 0xe7, 0x7c, 0xdf, 0xfe, 0xba, 0x68, 0x2b, 0x2d, 0x37, 0x13, 0x03, 0x5c, 0xc6, 0x56, 0xab, 0x50, 0x67, 0x3f, 0xca, 0xa3, 0x99, 0x64, 0x6e, 0xbd, 0x7a, 0x77, 0x51, 0x00, 0x2f, 0x1b, 0x5b, 0x43, 0x86, 0xf6, 0x67, 0x82, 0xda, 0x08, 0x4a, 0xd3, 0x38, 0x3b, 0x11, 0x9c, 0xbf, 0x3b, 0x8b, 0x04, 0x4d, 0x87, 0x08, 0xa7, 0x58, 0xc9, 0x5f, 0x8e, 0x19, 0x63, 0x36, 0x5e, 0xf0, 0x4a, 0x7d, 0xcf, 0x04, 0x17, 0x3c, 0x60, 0x2a, 0x5b, 0x8f, 0x4a, 0x08, 0x33, 0xee, 0xb2, 0x7a, 0x1d, 0xb2, 0x22, 0x34, 0x0a, 0xd5, 0x3a, 0xa9, 0xb5, 0xfa, 0xa3, 0x2c, 0x32, 0xad, 0x45, 0x55, 0xca, 0xeb, 0xba, 0xa7, 0x06, 0xe5, 0x02, 0x6f, 0x0a, 0x01, 0x78, 0xef, 0x24, 0x22, 0x04, 0xbc, 0xa5, 0x29, 0x93, 0x65, 0xf0, 0xbc, 0xc4, 0x55, 0xd0, 0x46, 0xe4, 0xfb, 0x0f, 0x3e, 0x1d, 0x28, 0x44, 0xad, 0xea, 0xb8, 0xec, 0xea, 0xce, 0x74, 0xbc, 0xa8, 0x46, 0x37, 0x36, 0x33, 0xfc, 0x50, 0x7b, 0xf7, 0x3d, 0x28, 0x60, 0x42, 0xad, 0x25, 0xc3, 0x4b, 0x3a, 0xcd, 0x20, 0x72, 0x4e, 0x2f, 0x5f, 0xc9, 0x49, 0x7e, 0xf0, 0xd4, 0x2e, 0x00, 0x1a, 0x8d, 0x9c, 0x26, 0x90, 0xab, 0x01, 0xfd, 0x46, 0x24, 0x0a, 0xc5, 0x82, 0xf1, 0x5e, 0xde, 0x36, 0x11, 0x8b, 0xec, 0x8d, 0xd0, 0x40, 0x33, 0xc4, 0x49, 0xbe, 0x43, 0x3b, 0x2a, 0x89, 0xda, 0xcc, 0xb7, 0x63, 0x06, 0x5b, 0x12, 0x7a, 0x8a, 0xae, 0xb9, 0xe1, 0x83, 0x7f, 0x50, 0x3d, 0x4b, 0xd0, 0xa1, 0xc1, 0x9e, 0x7f, 0xe1, 0x5c, 0xfb, 0x1a, 0x34, 0x30, 0x4d, 0xf4, 0x74, 0x47, 0xcb, 0x79, 0x2e, 0x81, 0x1d, 0xbe, 0xee, 0xd1, 0xc0, 0x5d, 0xbd, 0xa9, 0xab, 0x7f, 0xe7, 0xb3, 0x33, 0x3a, 0x02, 0xc2, 0x2c, 0x1e, 0x2b, 0x08, 0x51, 0x0a, 0x93, 0x89, 0xe6, 0x44, 0x3b, 0xcf, 0x9b, 0xc9, 0xfb, 0xe0, 0xb4, 0xe2, 0xc9, 0x6d, 0x67, 0xf8, 0x38, 0x4c, 0x85, 0xa9, 0x3f, 0x29, 0x5d, 0x1c, 0x3c, 0x78, 0xde, 0x91, 0x38, 0xad, 0xfb, 0x3c, 0x6d, 0xb0, 0x54, 0x53, 0x05, 0x8b, 0x12, 0x66, 0x25, 0x66, 0x12, 0xef, 0x2a, 0xb6, 0x47, 0x2a, 0x33, 0xb1, 0x59, 0x26, 0xdf, 0x05, 0x92, 0x1c, 0x58, 0xc9, 0xfb, 0x01, 0x90, 0xb4, 0xc2, 0x57, 0xca, 0x8d, 0xdf, 0x48, 0x5d, 0xe2, 0xf7, 0xf5, 0xb4, 0xfd, 0x81, 0x0c, 0x9a, 0x14, 0x27, 0x98, 0xb4, 0xc0, 0x6f, 0x1e, 0x4f, 0xb0, 0x9a, 0xe5, 0x5d, 0x9f, 0xcd, 0x95, 0xb9, 0x83, 0x6e, 0x04, 0xb3, 0x08, 0xd1, 0x4c, 0xc8, 0x3c, 0x14, 0x21, 0xb1, 0x8c, 0x47, 0x61, 0xa0, 0xef, 0xd0, 0xed, 0xc6, 0x61, 0x0e, 0xb8, 0x18, 0x93, 0x3d, 0x1d, 0x53, 0xe1, 0x9a, 0x76, 0x3d, 0x84, 0xc7, 0xea, 0x2e, 0x09, 0x70, 0x86, 0xd0, 0x01, 0x2f, 0x8f, 0x23, 0xfb, 0xad, 0x17, 0xc4, 0xaf, 0x0b, 0xcf, 0x6e, 0x7c, 0x80, 0x1c, 0xc1, 0x15, 0x43, 0x6d, 0x42, 0x77, 0xab, 0xcb, 0xa4, 0x1e, 0x94, 0xb2, 0x46, 0x78, 0x06, 0x1f, 0xfc, 0x9a, 0x11, 0xea, 0x12, 0x32, 0xfb, 0x56, 0x8e, 0xbc, 0x9e, 0xe7, 0xb6, 0xf9, 0x0b, 0x73, 0xd2, 0x9d, 0x73, 0x7c, 0x33, 0x48, 0x48, 0xbd, 0x74, 0xb8, 0x9f, 0x03, 0x00, 0x3d, 0xd9, 0x3e, 0xd4, 0x6d, 0x82, 0xd8, 0x87, 0x18, 0x79, 0x45, 0x87, 0x7f, 0x51, 0xdc, 0xa5, 0xc0, 0xf8, 0xe5, 0xd4, 0x95, 0x96, 0xf3, 0x2d, 0x3e, 0xb8, 0x74, 0x37, 0xbc, 0xae, 0x86, 0x66, 0x40, 0x31, 0x0c, 0xe1, 0xe3, 0x4a, 0x01, 0x88, 0x97, 0x6f, 0x0d, 0x36, 0x5e, 0xee, 0x56, 0x43, 0xba, 0x8f, 0x99, 0x4e, 0x64, 0x74, 0x79, 0x39, 0x40, 0x45, 0x17, 0x74, 0x91, 0x8a, 0xe2, 0x7f, 0x6a, 0x58, 0xb1, 0xaa, 0x65, 0x30, 0x0f, 0x20, 0x96, 0x24, 0xd5, 0x23, 0xc2, 0x3b, 0xff, 0x99, 0xcd, 0x17, 0xb8, 0xc8, 0x72, 0xd5, 0xb7, 0x5e, 0x37, 0x35, 0xce, 0xb4, 0x9f, 0xfb, 0xc0, 0x53, 0xa1, 0x95, 0x54, 0xb8, 0x59, 0xfd, 0xa7, 0x54, 0xfe, 0xe1, 0xc6, 0xd7, 0x14, 0x02, 0x7c, 0xae, 0xe2, 0xda, 0x69, 0xca, 0x27, 0x81, 0x54, 0xa4, 0x09, 0xd1, 0xc3, 0x7e, 0x4e, 0xc9, 0xc8, 0xeb, 0xce, 0x2f, 0x1d, 0x91, 0x28, 0x79, 0x73, 0x2e, 0xb5, 0xee, 0x08, 0xd9, 0xba, 0x09, 0x78, 0x8b, 0xe2, 0x1e, 0xd5, 0xdd, 0xeb, 0x3f, 0xf9, 0x13, 0x9f, 0x61, 0x1b, 0x5a, 0x06, 0xbb, 0xa1, 0x4e, 0xda, 0x6f, 0x35, 0xbf, 0x3b, 0x6c, 0x1b, 0xb5, 0xa4, 0x93, 0xc2, 0xb1, 0x1e, 0x19, 0x99, 0x36, 0xb3, 0x2c, 0x23, 0x88, 0x26, 0xd9, 0x4e, 0xb4, 0xe1, 0x2d, 0x01, 0xd0, 0x2f, 0x9a, 0xf4, 0x84, 0xab, 0x9d, 0xc4, 0xca, 0xf9, 0x9e, 0x47, 0xf1, 0xb3, 0x18, 0x1d, 0xe8, 0xa6, 0xf9, 0x87, 0xb9, 0x3f, 0x4c, 0x7c, 0x54, 0x40, 0x15, 0xfa, 0x8e, 0xb7, 0x7c, 0x9b, 0x69, 0x31, 0x2e, 0x68, 0x96, 0x2b, 0x01, 0xf1, 0x38, 0xc9, 0xd7, 0x9e, 0xeb, 0xcb, 0xc4, 0x40, 0x05, 0xbc, 0x73, 0xeb, 0x1c, 0x6c, 0xc5, 0x08, 0xc8, 0xa1, 0xbc, 0xa6, 0xa9, 0x0a, 0x98, 0x11, 0xac, 0x74, 0x3f, 0xa6, 0x8b, 0x40, 0xe2, 0xe5, 0x93, 0x15, 0xde, 0xc8, 0xaa, 0xd2, 0xe0, 0x53, 0x90, 0xc7, 0x4d, 0x6d, 0x65, 0x24, 0xe1, 0xee, 0x6c, 0xb1, 0x96, 0xf9, 0x0e, 0xc0, 0xc7, 0x8c, 0x22, 0x61, 0x95, 0x55, 0x6b, 0xd4, 0x8a, 0xc8, 0x62, 0x44, 0x7c, 0x6e, 0x36, 0xb2, 0xb4, 0x80, 0x12, 0x2f, 0x50, 0xb4, 0x9e, 0x4e, 0xe6, 0x57, 0xc8, 0xd9, 0x6a, 0x9c, 0xc4, 0xc3, 0x52, 0x34, 0x51, 0x5e, 0xf7, 0x1e, 0x3f, 0xce, 0x3f, 0xc1, 0x2e, 0xbe, 0x79, 0x38, 0x98, 0x51, 0x88, 0xed, 0x12, 0x5b, 0x44, 0x69, 0xce, 0xd2, 0x1d, 0x6a, 0x65, 0x7f, 0x02, 0x36, 0xd3, 0xf9, 0x81, 0x30, 0xc3, 0xd4, 0x2f, 0xa9, 0x0e, 0x16, 0x4a, 0xf8, 0x7e, 0xea, 0x9d, 0xcd, 0xd7, 0x99, 0xa4, 0xc2, 0x18, 0xb5, 0xf1, 0x33, 0xfe, 0x98, 0xce, 0x50, 0xca, 0x0d, 0x24, 0x70, 0x44, 0x4c, 0x9b, 0xa9, 0x00, 0x2c, 0x03, 0x9d, 0xe0, 0x94, 0xf3, 0x96, 0xda, 0x32, 0xaf, 0xd6, 0xfb, 0x70, 0x4f, 0x28, 0xac, 0xa4, 0x1e, 0xbb, 0x35, 0x87, 0x41, 0x30, 0x7f, 0xe9, 0x99, 0xf2, 0x1e, 0xa3, 0xea, 0xc6, 0x8e, 0xcc, 0x3c, 0xa3, 0xbd, 0x30, 0x81, 0xc3, 0xca, 0xfd, 0x79, 0xfa, 0x0d, 0xc0, 0xd3, 0x47, 0x57, 0x90, 0x95, 0xa9, 0x7b, 0x89, 0xbd, 0x33, 0x0d, 0x7d, 0x28, 0x63, 0x69, 0xe5, 0xb4, 0xb0, 0xf7, 0x1e, 0xa2, 0x62, 0xae, 0xd2, 0x3e, 0xa6, 0xd7, 0xb4, 0xc1, 0xe2, 0x14, 0x70, 0x76, 0x46, 0xa0, 0xe1, 0x1c, 0xa4, 0xd8, 0x85, 0x8c, 0x81, 0xfb, 0x2f, 0x9b, 0x6c, 0x2e, 0xfc, 0x42, 0x8e, 0xc3, 0x88, 0xfc, 0x83, 0xba, 0x62, 0x70, 0x68, 0x88, 0xbd, 0x50, 0x35, 0x18, 0x68, 0x81, 0x4d, 0x10, 0x00, 0x7c, 0x54, 0x55, 0x64, 0xf4, 0x41, 0xd1, 0x69, 0xb9, 0xb4, 0x74, 0xcf, 0xdc, 0x89, 0x78, 0x74, 0x14, 0xad, 0xea, 0xc8, 0x60, 0x30, 0x66, 0x81, 0xee, 0x9c, 0x22, 0x90, 0x3c, 0x86, 0x2d, 0x53, 0x7d, 0x62, 0xf9, 0x0c, 0x3e, 0x9c, 0x18, 0x92, 0x49, 0xe4, 0x43, 0x46, 0xc9, 0xc9, 0xa0, 0x49, 0xb0, 0x89, 0x45, 0xec, 0x56, 0x27, 0xf8, 0x68, 0x62, 0xbf, 0x38, 0xd0, 0xee, 0x17, 0x82, 0x43, 0xe6, 0x76, 0xcd, 0x66, 0xb1, 0xb9, 0x57, 0x11, 0x14, 0xa3, 0xa3, 0x49, 0x53, 0x75, 0xc2, 0x6f, 0x99, 0xbe, 0xd3, 0xb6, 0x99, 0x75, 0xc6, 0xdb, 0x76, 0x45, 0x65, 0x10, 0xe0, 0x28, 0x94, 0x39, 0x81, 0x37, 0xd7, 0x5a, 0x97, 0xc1, 0x16, 0x50, 0xe2, 0x9a, 0x9d, 0xc0, 0xc0, 0xb5, 0x67, 0x4e, 0x97, 0xf5, 0x9c, 0x0f, 0x73, 0x41, 0x58, 0x40, 0xf0, 0xd7, 0xae, 0x38, 0x5b, 0xe2, 0xed, 0x9b, 0x14, 0x4e, 0x21, 0xd1, 0x36, 0xdb, 0xdd, 0xb6, 0x7a, 0x70, 0x38, 0x93, 0x59, 0xb3, 0x16, 0x4e, 0x71, 0xd6, 0xa9, 0xdd, 0x2a, 0xb3, 0x37, 0x00, 0x99, 0x1c, 0x1d, 0x30, 0xa5, 0x6c, 0x14, 0xd2, 0x68, 0x62, 0xb3, 0xb1, 0xd8, 0x30, 0x35, 0xab, 0xa6, 0xce, 0x7d, 0xab, 0x66, 0x94, 0x57, 0xd7, 0xf1, 0x08, 0x01, 0x0a, 0x07, 0xf5, 0xea, 0x84, 0x39, 0xbd, 0xb9, 0xe0, 0x06, 0xef, 0x91, 0x47, 0x45, 0x1c, 0x93, 0xe4, 0xc3, 0xe7, 0xa5, 0x97, 0x2c, 0x5c, 0x72, 0xee, 0x2f, 0x83, 0xb2, 0x51, 0xdd, 0x34, 0xac, 0x7c, 0x52, 0x2c, 0xf9, 0x33, 0x98, 0x61, 0x8a, 0x30, 0xc8, 0x93, 0xed, 0x61, 0x72, 0x24, 0xcb, 0x50, 0x3f, 0x29, 0xb6, 0xe3, 0xd5, 0xc1, 0x21, 0x45, 0xfb, 0xa6, 0xb0, 0x24, 0xfe, 0x01, 0xb3, 0x1d, 0x53, 0x83, 0xed, 0x74, 0x7d, 0xb1, 0x99, 0x09, 0x32, 0x7f, 0xaf, 0x87, 0xb9, 0x21, 0x63, 0xdf, 0x96, 0x1e, 0xee, 0xf5, 0x69, 0xa6, 0x92, 0x98, 0x14, 0x25, 0xd8, 0xb8, 0x1c, 0x18, 0x1d, 0xd3, 0x52, 0x20, 0x4c, 0xb1, 0xb2, 0x54, 0xed, 0x51, 0x8b, 0xdc, 0x5f, 0x23, 0xe0, 0xbc, 0x61, 0x78, 0x0e, 0xed, 0xd8, 0x36, 0xb0, 0xb2, 0xcc, 0xd0, 0xc0, 0x29, 0xb3, 0x75, 0xff, 0x20, 0xf2, 0x88, 0x96, 0x2b, 0xa1, 0x51, 0xfd, 0xf3, 0x8e, 0xf2, 0x1c, 0xd1, 0x85, 0x9c, 0xb0, 0x9c, 0xcf, 0x02, 0xf1, 0xbf, 0xf9, 0x0e, 0x72, 0x8e, 0xd7, 0xd3, 0x48, 0xda, 0xc7, 0xc4, 0x6e, 0xc2, 0x3a, 0x23, 0x68, 0xcd, 0x71, 0xbc, 0x27, 0x36, 0x85, 0xd2, 0x2d, 0x87, 0xaa, 0x5a, 0xf1, 0x69, 0xb4, 0x67, 0x85, 0xbb, 0xdb, 0xe6, 0x76, 0xe1, 0xbb, 0x8b, 0xf4, 0x5f, 0x9f, 0x0b, 0x32, 0xa6, 0xfe, 0x8c, 0x10, 0x2d, 0x46, 0x59, 0xf8, 0xc4, 0xd9, 0xdb, 0x05, 0x26, 0x55, 0xc5, 0x6b, 0xcd, 0x19, 0x8e, 0x13, 0x0a, 0x05, 0x24, 0x85, 0x54, 0x80, 0xdf, 0x0b, 0xe1, 0xc0, 0xb3, 0x13, 0x73, 0x46, 0xab, 0xd6, 0x75, 0xa7, 0x92, 0x37, 0x46, 0x92, 0xf3, 0xee, 0xd5, 0x0f, 0x45, 0xe5, 0x6e, 0x05, 0x5f, 0xe2, 0xd3, 0xff, 0x32, 0x67, 0x8f, 0x2f, 0xb6, 0xd7, 0x87, 0xb4, 0x25, 0xd9, 0xd2, 0x18, 0x68, 0x01, 0xca, 0x1d, 0xce, 0xae, 0x63, 0xb9, 0x04, 0x2e, 0xbc, 0x5f, 0x42, 0x29, 0xf4, 0x80, 0xc2, 0x3c, 0x3f, 0x52, 0x76, 0xe4, 0x39, 0xd0, 0xfa, 0x9e, 0x7a, 0x02, 0xc8, 0x4c, 0x6a, 0x7e, 0xab, 0xdb, 0x56, 0x2f, 0x76, 0x23, 0xc4, 0x55, 0xf5, 0x0e, 0x04, 0xcd, 0x24, 0xfd, 0x08, 0x93, 0x9f, 0x67, 0x76, 0x85, 0x5a, 0xc3, 0xfa, 0x69, 0x92, 0xa9, 0xe1, 0x32, 0x03, 0x34, 0xe4, 0x7f, 0x5c, 0xaa, 0x41, 0x65, 0xf0, 0x5f, 0x11, 0x6e, 0xae, 0xd6, 0xd5, 0xe1, 0x53, 0x2a, 0x52, 0x44, 0xde, 0xac, 0x9f, 0x20, 0x44, 0xce, 0x7c, 0x04, 0x66, 0x40, 0xe5, 0xcc, 0x40, 0x58, 0xe7, 0x23, 0x63, 0xb7, 0xb3, 0x47, 0xa5, 0x2a, 0xf1, 0x0d, 0x17, 0xce, 0x56, 0x24, 0x37, 0x78, 0x79, 0x9d, 0x67, 0x53, 0xe2, 0xab, 0x9e, 0xcb, 0x64, 0xa8, 0x5e, 0xaa, 0xae, 0x59, 0xe6, 0x81, 0x1c, 0x73, 0xa8, 0x4a, 0xd3, 0x5e, 0xfd, 0x4b, 0x0c, 0x38, 0x18, 0x3e, 0xb0, 0x1d, 0x38, 0xae, 0x26, 0xa6, 0x22, 0xa4, 0x68, 0xaf, 0xcf, 0x83, 0x5d, 0x5e, 0x62, 0x31, 0x63, 0x61, 0x5d, 0x77, 0x2a, 0x76, 0x13, 0xab, 0xc9, 0x31, 0x61, 0x8c, 0x0b, 0xfa, 0x99, 0x6d, 0x0a, 0x55, 0xbf, 0x96, 0x00, 0x66, 0xf8, 0xe7, 0x59, 0xb4, 0x3f, 0xbe, 0x0d, 0x2d, 0x5a, 0x1b, 0x2c, 0x6a, 0x0c, 0x02, 0xbb, 0x35, 0x8d, 0x21, 0xbe, 0x48, 0x37, 0xb3, 0x96, 0x58, 0x82, 0xa4, 0x8d, 0x52, 0x32, 0xf6, 0xb0, 0xe5, 0xcf, 0x63, 0xdd, 0x40, 0x56, 0x44, 0x1c, 0x1d, 0x2e, 0xb1, 0x32, 0xfe, 0x5d, 0xea, 0x74, 0xb6, 0xfc, 0xf5, 0xda, 0x2c, 0xe8, 0x89, 0x54, 0x5c, 0xbb, 0x2b, 0x61, 0x9e, 0xfb, 0x97, 0xdd, 0x2b, 0x91, 0x61, 0x1a, 0xdd, 0x7c, 0xdc, 0x33, 0x36, 0xc6, 0x3b, 0x9d, 0xa4, 0xb7, 0xf6, 0xff, 0x03, 0x4a, 0x70, 0x44, 0x64, 0xdd, 0xd6, 0xee, 0x0d, 0x2c, 0x4a, 0xad, 0xc1, 0x80, 0x41, 0x30, 0x41, 0x24, 0x29, 0x3b, 0x12, 0x19, 0x50, 0xfa, 0x81, 0x0a, 0x01, 0x95, 0xe5, 0x82, 0xf0, 0x04, 0x24, 0x5d, 0xd7, 0x25, 0x78, 0x7d, 0x62, 0x0b, 0x73, 0xbe, 0x49, 0x99, 0x41, 0x2b, 0xbb, 0x50, 0x2e, 0x72, 0x03, 0x66, 0x67, 0x95, 0x66, 0x18, 0x05, 0xe3, 0x4a, 0x41, 0x47, 0x27, 0x9e, 0x2a, 0x1f, 0x1f, 0x75, 0xa4, 0xf1, 0x2f, 0xf4, 0x54, 0x97, 0x57, 0x6f, 0x4f, 0xa8, 0x63, 0xcf, 0xe7, 0xfa, 0x61, 0x37, 0xc4, 0x65, 0x58, 0xe7, 0x36, 0xca, 0x37, 0x60, 0xc9, 0x54, 0x0c, 0xc8, 0x1a, 0xfe, 0x76, 0x91, 0xea, 0x56, 0x5d, 0x56, 0x71, 0x80, 0xe0, 0x05, 0xf4, 0x7d, 0x8f, 0x43, 0x9a, 0xae, 0xdb, 0x0c, 0x7c, 0x93, 0xca, 0x9a, 0xfb, 0xd9, 0xf0, 0x89, 0x56, 0x94, 0x9a, 0x38, 0x7c, 0xc9, 0x4c, 0x72, 0x1e, 0x2f, 0x6e, 0x4e, 0x09, 0x36, 0x42, 0x53, 0xb3, 0x49, 0x19, 0xe0, 0x13, 0x50, 0xc7, 0xcb, 0xb6, 0x7a, 0x54, 0x49, 0x10, 0x39, 0xf4, 0x0e, 0x10, 0x8e, 0x39, 0xb5, 0xf7, 0x86, 0x88, 0x61, 0x69, 0x05, 0xca, 0xa5, 0xc4, 0xc2, 0x63, 0xa1, 0xb2, 0x93, 0x68, 0x6e, 0xfa, 0xeb, 0x0c, 0xbd, 0x9c, 0xa0, 0x5c, 0xba, 0x1c, 0xf2, 0x2d, 0x37, 0x1e, 0xca, 0x52, 0x06, 0x33, 0x3f, 0x12, 0xa6, 0xf3, 0x5e, 0xd9, 0x23, 0x4c, 0x2b, 0x2d, 0x37, 0x19, 0xe3, 0xe4, 0xb5, 0xf6, 0x84, 0x94, 0x27, 0x53, 0x8f, 0x4c, 0xb6, 0xc8, 0x0d, 0x81, 0x4b, 0xa8, 0xd0, 0x4b, 0xf4, 0xd9, 0xfb, 0xd2, 0x89, 0xe3, 0xc5, 0x02, 0x8f, 0x46, 0x79, 0x87, 0x5c, 0x11, 0xc1, 0xf5, 0x7c, 0xb0, 0x25, 0x46, 0x54, 0x06, 0xcf, 0x8a, 0x05, 0xbc, 0x91, 0xda, 0x94, 0xd8, 0x29, 0x8e, 0x47, 0x91, 0xc3, 0xb0, 0x52, 0x61, 0xbf, 0xb0, 0xb2, 0x5d, 0xb5, 0x58, 0x5a, 0xc2, 0xb6, 0x03, 0x8d, 0xd0, 0xd5, 0x0a, 0x8b, 0xdb, 0xe6, 0x80, 0x6f, 0x9f, 0x86, 0x1f, 0x58, 0xd4, 0x5c, 0x81, 0xc7, 0x02, 0x9e, 0x94, 0x48, 0x97, 0xd6, 0x48, 0x55, 0x37, 0xe6, 0x8a, 0x77, 0x53, 0x49, 0x76, 0xae, 0xfd, 0x9d, 0xc8, 0x13, 0xfa, 0x5e, 0x94, 0xbc, 0x19, 0xf5, 0x38, 0xe0, 0xc4, 0xf1, 0x8e, 0x3b, 0xd5, 0x94, 0x66, 0xb4, 0xab, 0x91, 0x33, 0x3e, 0x7c, 0x14, 0x04, 0xfc, 0xec, 0x03, 0xb6, 0xa8, 0xdf, 0x83, 0x68, 0x35, 0x8c, 0xbf, 0x30, 0xb3, 0xd4, 0xe5, 0x0c, 0x74, 0xd1, 0x70, 0x1c, 0x6d, 0xb1, 0xad, 0x0e, 0xde, 0xc5, 0x78, 0xd9, 0x36, 0xd5, 0x47, 0xae, 0x31, 0xb7, 0x6b, 0x2b, 0x43, 0x1f, 0x92, 0xd3, 0x39, 0xb9, 0x8f, 0xbb, 0x1e, 0x75, 0x5e, 0x85, 0x5b, 0x23, 0x62, 0x92, 0x23, 0x3f, 0xf2, 0x74, 0x0e, 0x0e, 0x14, 0xa2, 0x04, 0xea, 0x88, 0x70, 0x5d, 0xd9, 0x09, 0x3e, 0x46, 0x65, 0xcf, 0xef, 0x67, 0xa8, 0x58, 0x9d, 0xc3, 0xa7, 0x68, 0x8a, 0xdf, 0xe1, 0x4f, 0x5a, 0x26, 0x27, 0x6a, 0x80, 0x8c, 0xad, 0xec, 0xf7, 0x72, 0x62, 0xde, 0x32, 0xc9, 0x7d, 0x65, 0x55, 0x7b, 0x58, 0x44, 0xa5, 0x06, 0x82, 0xa1, 0x3d, 0x6a, 0x10, 0x0c, 0x04, 0x46, 0x33, 0xbd, 0xdb, 0x3e, 0x10, 0x1d, 0x1b, 0x9f, 0xcb, 0x89, 0x3e, 0x46, 0xe5, 0x52, 0xdc, 0xbe, 0xc9, 0x08, 0xda, 0xa8, 0xa1, 0xf8, 0xde, 0x60, 0x6e, 0xf3, 0x05, 0xdd, 0x58, 0x51, 0xd9, 0xd9, 0x42, 0x36, 0x7d, 0x32, 0xa2, 0x14, 0x2b, 0x91, 0x90, 0x71, 0xe1, 0x49, 0x1d, 0xeb, 0x56, 0x82, 0xe5, 0x79, 0x33, 0x96, 0xe8, 0xf3, 0x80, 0xbb, 0x95, 0xd5, 0x5c, 0xe3, 0x28, 0x40, 0xf2, 0xe0, 0x36, 0x41, 0xa8, 0xcc, 0x86, 0x56, 0x99, 0xa8, 0x23, 0x2e, 0x46, 0x43, 0xaf, 0xb1, 0x88, 0x5d, 0xfa, 0x40, 0xca, 0x0d, 0xd4, 0x3e, 0x74, 0x60, 0x1f, 0xcf, 0xaa, 0x43, 0x28, 0xdf, 0x37, 0xa3, 0x37, 0x67, 0xc4, 0xd2, 0x64, 0xeb, 0x4e, 0x2d, 0xad, 0x48, 0xd7, 0xfc, 0x46, 0xac, 0x5b, 0x99, 0x30, 0xe6, 0x05, 0xd5, 0x0d, 0xe0, 0xa3, 0x97, 0x33, 0x69, 0x58, 0xc6, 0xff, 0x38, 0x90, 0x69, 0x6b, 0x2e, 0x39, 0x0d, 0xe3, 0xdc, 0x31, 0x67, 0x55, 0x45, 0xfa, 0x3b, 0x88, 0xe5, 0xb5, 0x7d, 0xae, 0xf2, 0x4e, 0xb5, 0x3c, 0xe1, 0xf4, 0xa8, 0xf9, 0x2c, 0xcc, 0x34, 0x55, 0x53, 0xe6, 0x7c, 0xfd, 0x21, 0x70, 0x45, 0xac, 0x30, 0x29, 0xa0, 0x44, 0xaf, 0x19, 0xca, 0x1d, 0x63, 0x80, 0x50, 0x9d, 0xec, 0x0c, 0x76, 0x09, 0x4a, 0x4e, 0xda, 0x9a, 0x9f, 0x6f, 0x55, 0xd4, 0x36, 0x1f, 0x22, 0x13, 0xc5, 0xcf, 0x42, 0x67, 0xef, 0x20, 0x1e, 0xa1, 0x0d, 0x9b, 0x6f, 0xae, 0x2e, 0xa2, 0x5b, 0x24, 0x5c, 0xa6, 0xe0, 0x1b, 0x22, 0x9b, 0x76, 0x3e, 0x4b, 0xa9, 0xf0, 0x22, 0xeb, 0x25, 0xa4, 0xd6, 0xa4, 0xbf, 0xcb, 0xbb, 0x22, 0xfd, 0x2b, 0x95, 0xe8, 0xe8, 0xf3, 0xe3, 0x4f, 0x05, 0xe6, 0x6c, 0xcb, 0x86, 0xbb, 0x1b, 0x71, 0xc2, 0xc4, 0x0c, 0xb6, 0xe3, 0xcf, 0xe7, 0x7a, 0xde, 0x4a, 0x6d, 0x45, 0xa9, 0xaa, 0x50, 0xd0, 0xa8, 0x0d, 0x48, 0xc7, 0x68, 0x1d, 0x63, 0xcd, 0x8f, 0x38, 0x9d, 0xc1, 0x13, 0xcf, 0xb0, 0x3f, 0xab, 0x0c, 0x2d, 0x6a, 0x83, 0xb8, 0xcc, 0xe9, 0x34, 0x5b, 0x00, 0x30, 0xf3, 0xa5, 0xcf, 0x01, 0x08, 0x0c, 0xe1, 0x32, 0x83, 0xb7, 0xd7, 0xb0, 0x2a, 0x9b, 0xde, 0xc4, 0xb5, 0xe4, 0x83, 0x95, 0x3e, 0x96, 0xc9, 0xef, 0xf3, 0x74, 0x78, 0x42, 0x0e, 0x21, 0xb9, 0xee, 0x07, 0x85, 0xe0, 0xbd, 0x07, 0x72, 0x89, 0xb1, 0xa1, 0x87, 0xe6, 0x01, 0xbd, 0x55, 0x57, 0x5e, 0xd4, 0xc1, 0x3b, 0x7a, 0x63, 0xa9, 0x07, 0xcb, 0x99, 0xcb, 0x95, 0x8d, 0x53, 0xe2, 0xbe, 0x06, 0x4b, 0x11, 0x2a, 0x0d, 0x8c, 0x85, 0x67, 0xcd, 0x2a, 0x57, 0x39, 0xc7, 0x2f, 0xaf, 0x31, 0x16, 0xd8, 0x2f, 0x81, 0xf7, 0x02, 0x8f, 0x0f, 0x88, 0xdf, 0x84, 0xc8, 0xd0, 0xed, 0xe7, 0x37, 0x00, 0x29, 0x13, 0x56, 0xf8, 0x80, 0x8f, 0xa4, 0x0d, 0x86, 0xed, 0x77, 0x0a, 0x6a, 0xf1, 0x94, 0x74, 0x2a, 0xf6, 0xfd, 0x13, 0x03, 0x8e, 0x0a, 0xad, 0x2c, 0x69, 0xbb, 0x15, 0xc3, 0x78, 0x4d, 0x65, 0x08, 0x51, 0x0b, 0x87, 0xc9, 0xd6, 0x67, 0xfa, 0x1d, 0x11, 0x49, 0xd2, 0x55, 0x63, 0xa7, 0x01, 0x30, 0xde, 0x56, 0xd6, 0x4e, 0xef, 0x20, 0xc3, 0xe7, 0x40, 0x16, 0x63, 0xbd, 0xdc, 0x27, 0xbb, 0x4f, 0x95, 0xf2, 0xc1, 0x50, 0xa3, 0xd9, 0x1a, 0x57, 0x8d, 0x57, 0x28, 0xd8, 0x4d, 0x93, 0x44, 0x53, 0xaf, 0x35, 0x48, 0xcb, 0xfa, 0x78, 0x51, 0x7a, 0xd2, 0x80, 0xc3, 0xc3, 0x5d, 0xef, 0x8d, 0x68, 0xa5, 0xb3, 0xae, 0xfd, 0x3d, 0x21, 0xf8, 0x9d, 0x28, 0x48, 0x13, 0xdb, 0xf6, 0x7f, 0xc6, 0xfb, 0x30, 0x41, 0x72, 0x63, 0xf6, 0x3b, 0xdf, 0x4c, 0xe7, 0xa2, 0x3b, 0xbd, 0x41, 0xca, 0x60, 0xba, 0x49, 0xf5, 0x56, 0xb9, 0xee, 0x69, 0x19, 0x55, 0xa9, 0xc5, 0x9c, 0x46, 0xa7, 0x94, 0x0d, 0x91, 0x2a, 0x23, 0x5b, 0xfc, 0x2d, 0x90, 0xf6, 0xc5, 0x47, 0x24, 0xd6, 0x93, 0xd1, 0xe2, 0xbe, 0xad, 0x4b, 0x60, 0xc2, 0x6a, 0xfc, 0xd6, 0x07, 0xe9, 0xd9, 0x75, 0xca, 0x01, 0xa8, 0xfa, 0xa3, 0x7b, 0x65, 0x82, 0x0b, 0x7f, 0xe5, 0xa0, 0x1d, 0x4d, 0xb9, 0xad, 0x99, 0x2e, 0x55, 0x5f, 0x2e, 0xa9, 0x72, 0x9d, 0xf9, 0xf9, 0xb0, 0x92, 0x49, 0xbf, 0x80, 0x01, 0xa5, 0xf5, 0x41, 0xd8, 0x10, 0x23, 0xa9, 0x07, 0x8b, 0xd5, 0x67, 0x92, 0xdc, 0x4c, 0x06, 0xe5, 0x8e, 0x74, 0x15, 0x69, 0x39, 0x16, 0x85, 0x54, 0x03, 0x4f, 0x52, 0xc5, 0x67, 0x41, 0x66, 0x10, 0x35, 0x08, 0xba, 0x56, 0xda, 0xef, 0xbe, 0x5a, 0xe2, 0xe4, 0xfb, 0x8f, 0xbb, 0x2a, 0xf6, 0x76, 0xbc, 0x4e, 0x58, 0x26, 0x65, 0x5c, 0x4d, 0x2c, 0xe9, 0x52, 0x2a, 0x96, 0xe9, 0xd5, 0x52, 0x4b, 0x83, 0x23, 0x5a, 0x9e, 0x8b, 0x49, 0x6b, 0x22, 0x18, 0x96, 0xe8, 0xbf, 0x43, 0x4f, 0x51, 0x05, 0x2b, 0xa4, 0x68, 0xc1, 0x3d, 0xe3, 0x92, 0xce, 0xb2, 0xec, 0x7f, 0x2e, 0x58, 0xe5, 0x0d, 0x59, 0x96, 0x2f, 0x6a, 0xd5, 0xaa, 0x98, 0x79, 0x07, 0x36, 0xd2, 0x78, 0x49, 0xfb, 0x24, 0xdf, 0x3d, 0xe4, 0x5f, 0x8b, 0x60, 0x46, 0x14, 0x1b, 0xe2, 0x66, 0x04, 0x9b, 0xb5, 0x3c, 0xd8, 0x60, 0xe4, 0x76, 0x12, 0x32, 0x26, 0xc0, 0x44, 0xb1, 0xb3, 0x43, 0x7f, 0xf1, 0x56, 0x6b, 0x0f, 0x68, 0xc3, 0xee, 0x65, 0x0a, 0x2c, 0x0a, 0x55, 0xb2, 0x0f, 0x0e, 0x82, 0xc4, 0x52, 0x1b, 0x16, 0x10, 0x91, 0x2c, 0xb6, 0xfa, 0xb7, 0x54, 0xb5, 0xd8, 0xcb, 0x47, 0x87, 0x9c, 0x0d, 0x1c, 0x79, 0xb3, 0x42, 0x51, 0xa0, 0x2d, 0x4c, 0x10, 0x0f, 0x1d, 0xfd, 0xb0, 0x4d, 0x43, 0x2d, 0x7f, 0x07, 0xe8, 0x0a, 0xbf, 0x01, 0x0a, 0xb0, 0xee, 0x52, 0xb9, 0xfa, 0x4b, 0xd1, 0xc1, 0x97, 0x95, 0xcb, 0x89, 0x60, 0x16, 0xf7, 0x3b, 0xe8, 0xe0, 0xab, 0x25, 0x55, 0x57, 0x4f, 0x60, 0x6f, 0xef, 0x13, 0xaf, 0xf7, 0x37, 0xdd, 0xa9, 0x3a, 0x17, 0x85, 0x1b, 0xe6, 0x55, 0x45, 0xa8, 0x1b, 0x5e, 0x6b, 0xb2, 0xc5, 0x44, 0x51, 0x7e, 0x2a, 0x03, 0x8f, 0x92, 0xbf, 0x08, 0x6f, 0x62, 0x40, 0xf4, 0xa2, 0x2c, 0xff, 0x9d, 0x31, 0x21, 0x7d, 0x55, 0xb6, 0xc5, 0x37, 0x70, 0xcb, 0x98, 0xc2, 0x00, 0xc3, 0xf6, 0x1a, 0xe3, 0x98, 0x3c, 0x38, 0x00, 0x25, 0x2c, 0xe2, 0xcd, 0x95, 0x93, 0xc7, 0x15, 0x1c, 0x28, 0xcb, 0xf8, 0xe5, 0xb8, 0xa0, 0x33, 0x4b, 0x80, 0x96, 0xa1, 0x4b, 0xdb, 0xb4, 0x02, 0x39, 0x1d, 0x07, 0xfc, 0xb3, 0xbe, 0x3a, 0x5f, 0xd4, 0xbb, 0x67, 0xad, 0xa9, 0x39, 0x2d, 0xda, 0xe9, 0x6b, 0x03, 0x50, 0xe0, 0xb7, 0xcb, 0x36, 0xad, 0x14, 0xab, 0xf2, 0xad, 0xb7, 0x18, 0xec, 0x37, 0xee, 0x33, 0x95, 0x8a, 0x4c, 0x59, 0xa9, 0x03, 0x06, 0xf5, 0xb1, 0x94, 0x9d, 0x99, 0xcb, 0x71, 0xbd, 0x4e, 0xad, 0x0c, 0x66, 0x28, 0xe8, 0x44, 0x49, 0x1d, 0x6a, 0xd9, 0x75, 0x16, 0x47, 0x24, 0x32, 0x47, 0xb9, 0x05, 0x2d, 0xbc, 0x65, 0x1c, 0xd6, 0x35, 0xdf, 0x3c, 0x07, 0x34, 0x71, 0x1c, 0xe6, 0x54, 0x18, 0x50, 0x0c, 0xdc, 0xd0, 0x78, 0xe7, 0x94, 0x11, 0xb8, 0x5c, 0xd8, 0x9a, 0x68, 0xb1, 0xea, 0x6d, 0x0c, 0xab, 0x8d, 0x1b, 0x86, 0xf3, 0xcf, 0x41, 0x8a, 0xbe, 0x26, 0x53, 0x53, 0xad, 0xbe, 0x98, 0x94, 0xf2, 0x12, 0x76, 0xb2, 0xb5, 0xba, 0xf0, 0x30, 0xb6, 0x83, 0x6d, 0x6b, 0x33, 0xc5, 0xbb, 0x87, 0x0c, 0xf1, 0x53, 0xa9, 0x25, 0x6a, 0xdf, 0x66, 0x0c, 0x96, 0xf9, 0x7c, 0xdc, 0x34, 0x36, 0xc0, 0x61, 0xf0, 0x63, 0x58, 0x7c, 0x34, 0x0e, 0x2a, 0xc9, 0x42, 0x49, 0x94, 0x80, 0x80, 0xaa, 0x5e, 0x99, 0x12, 0x96, 0xed, 0x34, 0xae, 0xbf, 0xb9, 0x37, 0xac, 0xec, 0x01, 0x39, 0x5d, 0xf9, 0xbd, 0x9f, 0x9e, 0x1e, 0xd4, 0x04, 0xad, 0x74, 0x8f, 0xdf, 0x3b, 0xb4, 0x4d, 0x5f, 0xc2, 0x42, 0x79, 0x9a, 0x18, 0x6b, 0xba, 0xe7, 0x45, 0xeb, 0x69, 0x88, 0x92, 0xb3, 0x48, 0x8d, 0xe2, 0xe9, 0x71, 0xf4, 0x45, 0x2f, 0x8c, 0x15, 0xcb, 0x28, 0x45, 0x3e, 0x96, 0x38, 0xfe, 0x9a, 0x33, 0x8c, 0xc0, 0x57, 0x2b, 0x5b, 0x78, 0x07, 0xd4, 0x6b, 0x60, 0x47, 0x6d, 0xd6, 0xbb, 0x9f, 0x6a, 0x0e, 0xc5, 0xaa, 0x0d, 0x1f, 0xea, 0x77, 0x36, 0x34, 0x36, 0x2e, 0x7c, 0x5d, 0x0d, 0xf7, 0x7c, 0x8f, 0x1c, 0x17, 0x71, 0xed, 0x8f, 0x5c, 0x06, 0x45, 0x84, 0xbc, 0x68, 0xde, 0xc0, 0x39, 0x9e, 0x71, 0xa1, 0x08, 0x1d, 0x75, 0x54, 0xf1, 0x97, 0x9f, 0x48, 0xf9, 0x15, 0xaa, 0xe3, 0x3f, 0x45, 0x54, 0x73, 0x24, 0x15, 0xa9, 0x67, 0xae, 0x80, 0x83, 0xbf, 0x2f, 0xa8, 0x52, 0xc1, 0x21, 0x26, 0x19, 0xee, 0x55, 0x9e, 0xb9, 0x34, 0x4d, 0x96, 0x72, 0x65, 0xe6, 0x88, 0xa7, 0xe8, 0x39, 0x35, 0xe1, 0xaf, 0xc4, 0x3d, 0x17, 0x68, 0xc5, 0xed, 0x2d, 0xf8, 0xe7, 0x58, 0xba, 0x25, 0x20, 0xa9, 0x0e, 0x92, 0xda, 0xb7, 0x74, 0xf1, 0x51, 0xda, 0xb4, 0x74, 0x3c, 0xfe, 0xdc, 0x84, 0xaf, 0xf5, 0x40, 0xb6, 0x40, 0x12, 0xc0, 0xfb, 0x69, 0xf3, 0x49, 0x17, 0x2d, 0x9e, 0x9f, 0x54, 0xfe, 0xd0, 0x59, 0x77, 0xdf, 0x91, 0x2d, 0xf3, 0xc6, 0x0c, 0x6d, 0x5d, 0x44, 0x9e, 0xd2, 0x20, 0x67, 0x2d, 0x79, 0x72, 0xe0, 0xbb, 0x2b, 0x86, 0x61, 0x3a, 0xe1, 0x03, 0x49, 0xa2, 0x87, 0xb6, 0x83, 0x42, 0x01, 0x83, 0xab, 0x53, 0x6c, 0xa2, 0x73, 0xd3, 0xa6, 0x08, 0x46, 0x91, 0x10, 0x22, 0x2b, 0x84, 0x92, 0xc9, 0xeb, 0x60, 0xe0, 0x73, 0x76, 0x6b, 0xfc, 0xa6, 0x83, 0x8d, 0xfd, 0xb3, 0x77, 0xa7, 0x0e, 0xa0, 0x88, 0x26, 0xb9, 0x66, 0x22, 0xd8, 0x66, 0x5d, 0x89, 0xfe, 0x1e, 0xf4, 0xc1, 0xa2, 0x95, 0xa5, 0xab, 0x2b, 0x68, 0x28, 0x70, 0x2e, 0xa3, 0xe7, 0x22, 0x87, 0x86, 0xb3, 0xa1, 0xa9, 0x89, 0xb5, 0xbc, 0x32, 0x9d, 0xa7, 0x99, 0xc3, 0xb5, 0x44, 0x57, 0x0e, 0x85, 0xfc, 0xf1, 0x30, 0x89, 0xed, 0x66, 0x42, 0x4a, 0x0f, 0x17, 0x2a, 0xdd, 0xae, 0x70, 0xb7, 0xac, 0x1e, 0xca, 0xee, 0x79, 0xaa, 0x90, 0x9e, 0x9f, 0xcd, 0xa1, 0x3b, 0x9b, 0xa5, 0xf6, 0xe8, 0xcc, 0xa4, 0x85, 0xd6, 0x77, 0x89, 0x65, 0xcd, 0x0e, 0x8e, 0x32, 0x08, 0xb2, 0xe3, 0xb3, 0x46, 0xf6, 0x5c, 0xba, 0x1e, 0xe6, 0x67, 0x4c, 0x93, 0x48, 0x40, 0x02, 0xe8, 0x21, 0x68, 0xaf, 0xb6, 0x7b, 0x53, 0x43, 0x3b, 0x66, 0x60, 0xf0, 0xf5, 0x3d, 0x0f, 0x8b, 0x6f, 0x2a, 0x6f, 0x34, 0x5c, 0xec, 0xd5, 0x39, 0xe2, 0xd8, 0xd3, 0x38, 0x38, 0x1e, 0x68, 0x84, 0x73, 0x4e, 0x75, 0xca, 0x9d, 0x1b, 0x70, 0xf5, 0x08, 0x5e, 0x5c, 0x4e, 0xe1, 0x5e, 0xf9, 0xe8, 0x08, 0x4e, 0x38, 0x3b, 0x1f, 0x17, 0xf1, 0x0f, 0xe2, 0x58, 0xd8, 0x9c, 0xb6, 0xab, 0xae, 0xef, 0x84, 0x2b, 0xb4, 0x8f, 0xc7, 0x33, 0x65, 0x61, 0xe4, 0x68, 0x64, 0xc9, 0xbb, 0xf9, 0xb4, 0x12, 0x7b, 0x25, 0x27, 0x10, 0xba, 0xfe, 0x19, 0x03, 0xc5, 0x6d, 0x5d, 0xbf, 0x34, 0x77, 0x78, 0x0a, 0xc2, 0xbe, 0x0d, 0x46, 0x5c, 0x4b, 0x99, 0x50, 0x78, 0x8a, 0x61, 0xa7, 0xa8, 0x96, 0xa8, 0xd1, 0x6f, 0xb7, 0x24, 0xfa, 0x53, 0x2a, 0xb3, 0xdf, 0x33, 0x20, 0x4b, 0xea, 0xdb, 0x08, 0x2f, 0x9e, 0xd6, 0x11, 0x69, 0x36, 0x83, 0xeb, 0x74, 0x89, 0x6c, 0xce, 0x39, 0x31, 0xd2, 0xbe, 0x3d, 0xec, 0x8d, 0x0d, 0x18, 0x42, 0x13, 0x21, 0x29, 0x69, 0xd6, 0x78, 0x88, 0x65, 0xd3, 0xe8, 0x3c, 0x73, 0x67, 0x2c, 0xae, 0xa8, 0x65, 0x9c, 0x5e, 0xd6, 0x67, 0x3c, 0xd5, 0xaf, 0x61, 0xf8, 0xdb, 0x2d, 0x7c, 0x2e, 0xe9, 0x31, 0x21, 0x6d, 0xe1, 0x6a, 0x53, 0x7d, 0xfd, 0x78, 0x43, 0x9f, 0x05, 0x51, 0x1e, 0x15, 0xc6, 0xe4, 0x2a, 0xe5, 0xbf, 0xfd, 0x11, 0xdb, 0x1d, 0x69, 0x7d, 0xcd, 0xea, 0x5a, 0xe4, 0x22, 0x81, 0x0d, 0xa6, 0x95, 0x45, 0xa9, 0x55, 0x37, 0x92, 0x6b, 0x53, 0xb3, 0xf4, 0x00, 0xa3, 0xd6, 0x97, 0x32, 0xf9, 0x4f, 0xff, 0xc7, 0x13, 0xb3, 0xf9, 0xa6, 0x4c, 0xc4, 0xd2, 0x3c, 0x6f, 0xf2, 0xc6, 0x1e, 0xc9, 0x22, 0xbb, 0xf0, 0x82, 0xaf, 0x30, 0x85, 0x2d, 0xae, 0x70, 0x47, 0x9d, 0x77, 0x0b, 0xda, 0xfa, 0x61, 0x86, 0xfc, 0x15, 0xcc, 0x52, 0xb0, 0xf9 ],
+    const [ 0xd2, 0x96, 0x7d, 0xdf, 0x69, 0xef, 0x62, 0xa9, 0xe2, 0x3c, 0x91, 0x18, 0xdf, 0xaa, 0x55, 0xdf, 0x92, 0xb4, 0x11, 0x63, 0x22, 0xf1, 0xc9, 0x27, 0x51, 0x31, 0xe3, 0x87, 0x5d, 0xc9, 0x2f, 0xaa, 0x23, 0x2b, 0x26, 0xb2, 0x8a, 0xba, 0x6f, 0x35, 0x1f, 0xdc, 0xa8, 0xf1, 0xfd, 0x50, 0x62, 0xbb, 0xf0, 0xc2, 0x6d, 0xb9, 0xda, 0x9c, 0x57, 0xd1, 0x55, 0x20, 0x2f, 0x61, 0x99, 0xb4, 0x8e, 0x31, 0xa1, 0x7c, 0xd9, 0xa6, 0x89, 0x2e, 0xc0, 0x38, 0x3b, 0x22, 0x0a, 0x25, 0x4a, 0xa9, 0x95, 0x67, 0x1e, 0xa0, 0x98, 0xe4, 0x52, 0x45, 0x2c, 0xe6, 0x5a, 0x49, 0x0b, 0xca, 0x69, 0x26, 0x97, 0xfc, 0x91, 0xb2, 0x1e, 0x23, 0x2d, 0xf4, 0x5c, 0x98, 0x7c, 0x37, 0x41, 0x1d, 0x8e, 0x5e, 0xf5, 0xcc, 0x64, 0x77, 0x1a, 0x4d, 0x53, 0x93, 0x51, 0x4c, 0xa9, 0xd4, 0xff, 0x2a, 0x93, 0xc7, 0x51, 0xf3, 0x3e, 0xf4, 0x7d, 0x91, 0x3d, 0xb4, 0x4b, 0x3f, 0x2b, 0x43, 0xd5, 0x40, 0x91, 0x16, 0x8a, 0xd0, 0x09, 0x6f, 0x79, 0x5b, 0xa4, 0x2e, 0xcd, 0xed, 0x8a, 0xea, 0x93, 0xea, 0xe0, 0x40, 0xc4, 0xff, 0xef, 0x6b, 0x7f, 0x58, 0x82, 0x15, 0x96, 0x13, 0x8f, 0x6d, 0x4c, 0xf5, 0x1a, 0x7a, 0x5d, 0x5c, 0x57, 0xaf, 0x3f, 0x75, 0x0f, 0xbf, 0xa8, 0xaf, 0x44, 0xb3, 0x50, 0x70, 0x18, 0x39, 0xf8, 0x06, 0xeb, 0x3f, 0xab, 0xe0, 0xc4, 0xc0, 0x44, 0xfe, 0xf2, 0xde, 0x30, 0xa6, 0xf3, 0x32, 0x75, 0x59, 0x94, 0x60, 0xf3, 0x05, 0x5a, 0xee, 0xea, 0x7c, 0x21, 0x56, 0xbd, 0x25, 0x03, 0x59, 0xf6, 0xf1, 0x7b, 0x97, 0x89, 0x91, 0xca, 0x5d, 0x5d, 0xe7, 0x9a, 0xbe, 0x08, 0xba, 0xe2, 0xe5, 0xdb, 0xad, 0x09, 0xa9, 0x1e, 0x72, 0x4e, 0x62, 0x9c, 0x3b, 0x67, 0xfb, 0x63, 0x71, 0x68, 0x49, 0xc5, 0xa9, 0xe7, 0x9b, 0xa2, 0xd4, 0x5e, 0x93, 0xea, 0xb5, 0xd0, 0x34, 0x5d, 0x99, 0xb0, 0x3b, 0x95, 0x42, 0xfe, 0xb3, 0x47, 0x24, 0xb3, 0xc4, 0xc6, 0xd4, 0x5f, 0xcc, 0xc8, 0xbd, 0x11, 0xb1, 0x6d, 0x15, 0x77, 0x75, 0x7d, 0x0f, 0x46, 0x0a, 0xf1, 0x52, 0xdc, 0x68, 0xb6, 0xab, 0x25, 0xde, 0xad, 0xfe, 0xbb, 0xa5, 0xf6, 0x83, 0x51, 0xbb, 0x6e, 0x2e, 0x51, 0xee, 0x76, 0x6f, 0xc4, 0x37, 0xf7, 0x1c, 0x73, 0x4a, 0xa3, 0xac, 0x4b, 0x6b, 0x7d, 0xa5, 0x06, 0x83, 0x9b, 0x57, 0x08, 0x73, 0x2a, 0xcb, 0x87, 0xa8, 0xb4, 0xf7, 0xef, 0xf0, 0x9e, 0x33, 0x85, 0x8c, 0xf5, 0xf1, 0x4a, 0x86, 0x6a, 0xa8, 0x22, 0x45, 0x9a, 0x11, 0x35, 0x5e, 0x93, 0x96, 0x96, 0xad, 0x94, 0x08, 0x23, 0xa5, 0x15, 0x90, 0xac, 0xe4, 0x07, 0xe8, 0x57, 0x0a, 0x5d, 0xca, 0x42, 0xcc, 0xcb, 0xa9, 0x6b, 0x44, 0xce, 0xa0, 0xcd, 0x8b, 0xec, 0xa8, 0xcc, 0x8a, 0x3d, 0x0d, 0xd3, 0x0d, 0x2a, 0x23, 0x3c, 0x19, 0x75, 0x35, 0x70, 0x80, 0x7a, 0xbe, 0x4f, 0xb2, 0xb4, 0xdb, 0xd2, 0xd6, 0x82, 0x01, 0xee, 0x1a, 0x2b, 0xeb, 0xbc, 0x47, 0x20, 0xd7, 0xd8, 0x98, 0x82, 0xf2, 0x07, 0xcc, 0xe4, 0x11, 0x1c, 0x7a, 0x52, 0xa1, 0x1c, 0xa5, 0x92, 0xe1, 0xa0, 0x90, 0xa9, 0x4f, 0x7b, 0xd3, 0xa2, 0x5f, 0x9d, 0xaf, 0x8a, 0x73, 0x37, 0x9f, 0xbf, 0x08, 0x20, 0x2f, 0x6b, 0x2d, 0x78, 0x11, 0x4b, 0x3a, 0x8b, 0x6e, 0xb5, 0xbe, 0xf7, 0x7a, 0xd9, 0xb9, 0x12, 0x4b, 0x47, 0x0c, 0x86, 0xeb, 0xb1, 0x2d, 0x3e, 0xac, 0xf2, 0x1f, 0x86, 0xbb, 0x50, 0xa2, 0x6d, 0xf8, 0xfe, 0xa7, 0x6e, 0x05, 0xe5, 0x06, 0x50, 0x9d, 0xa5, 0x73, 0x4b, 0x28, 0xd6, 0xaf, 0x6c, 0x8c, 0x93, 0xfb, 0x3b, 0x45, 0x39, 0xd2, 0x9a, 0xb8, 0x6c, 0xd7, 0xf0, 0xc4, 0x5b, 0x0d, 0x87, 0x9b, 0x45, 0x46, 0x33, 0xd0, 0x3d, 0xde, 0x35, 0xb1, 0x2a, 0xa8, 0x5e, 0xd6, 0x11, 0x29, 0x78, 0xfa, 0x97, 0x04, 0xe1, 0x0a, 0xc1, 0xb6, 0x79, 0x7c, 0xff, 0x83, 0xbe, 0xe2, 0x69, 0xb0, 0x36, 0xbf, 0x48, 0xf3, 0x0e, 0x99, 0xd8, 0x28, 0x00, 0x4f, 0x4c, 0x45, 0x7a, 0xad, 0x13, 0x90, 0xfc, 0x3e, 0x5a, 0x10, 0xc1, 0x61, 0xd2, 0x41, 0xa3, 0x9f, 0xb3, 0x0c, 0x39, 0x3c, 0x01, 0xf5, 0x42, 0x0c, 0x0e, 0x97, 0x46, 0x88, 0x40, 0x4d, 0x7a, 0x21, 0x14, 0x33, 0xe5, 0xd5, 0x63, 0x4d, 0xc1, 0xff, 0xe4, 0x05, 0x24, 0x73, 0xf3, 0xdb, 0xdf, 0xca, 0x90, 0x58, 0xa6, 0xfb, 0xab, 0x43, 0x72, 0x2c, 0x9f, 0x18, 0x24, 0xc7, 0xfc, 0xb6, 0x6b, 0xcf, 0x89, 0x58, 0xe7, 0x75, 0x89, 0xc6, 0x8f, 0xe6, 0x3e, 0xcd, 0x50, 0x68, 0xac, 0xec, 0xf6, 0xa5, 0x9f, 0x50, 0x50, 0x46, 0xef, 0x03, 0x8f, 0xc4, 0x03, 0x60, 0xf0, 0x7b, 0x94, 0xca, 0x9b, 0x01, 0xb3, 0x9d, 0xca, 0xb5, 0x0e, 0x65, 0x2d, 0x9b, 0x6f, 0x4e, 0x8e, 0x67, 0x85, 0xdc, 0xb1, 0xd7, 0xe7, 0xdc, 0x7e, 0x46, 0x56, 0x9b, 0x61, 0x7f, 0x42, 0x55, 0xf2, 0xcf, 0x90, 0xf0, 0xd1, 0x5e, 0x9b, 0xea, 0xd4, 0xbe, 0x79, 0x91, 0x65, 0xc5, 0x7f, 0x72, 0x25, 0x98, 0x07, 0x13, 0xd6, 0x09, 0x70, 0xe5, 0x77, 0x23, 0x67, 0x74, 0xb0, 0x02, 0x65, 0xe1, 0x71, 0xe9, 0x79, 0x92, 0xd7, 0x8e, 0x48, 0x28, 0x4f, 0xb8, 0x52, 0xb1, 0xfd, 0x0c, 0x77, 0x1f, 0x5f, 0x24, 0xb9, 0xfa, 0x2d, 0xe2, 0x43, 0x51, 0x84, 0x04, 0xab, 0xf6, 0x44, 0xf8, 0x74, 0xeb, 0xb7, 0xf1, 0xd7, 0x17, 0x73, 0x3a, 0xc2, 0x3d, 0x81, 0xcb, 0x22, 0x2f, 0xbe, 0x1a, 0x5e, 0x3f, 0x82, 0x33, 0x23, 0xf7, 0x80, 0x0b, 0x67, 0x0a, 0xed, 0x11, 0xa8, 0x89, 0xe5, 0x07, 0x75, 0x5a, 0x0a, 0x10, 0x30, 0xe7, 0x6e, 0x0a, 0x12, 0x13, 0xb3, 0x1d, 0x6f, 0x72, 0x70, 0x94, 0x3c, 0xb9, 0xd7, 0xec, 0xce, 0x73, 0x95, 0x2b, 0xe4, 0xf6, 0xfa, 0x74, 0xe8, 0x96, 0x5a, 0xd7, 0x72, 0x18, 0xb3, 0x6d, 0x0e, 0x6a, 0x8f, 0xa5, 0x3f, 0x91, 0x2c, 0xd9, 0xc4, 0xe2, 0xdb, 0x25, 0x19, 0x75, 0xa6, 0x78, 0x41, 0xd7, 0x35, 0xeb, 0xc3, 0xff, 0xf3, 0x52, 0xf3, 0x83, 0x6c, 0x11, 0x72, 0x0c, 0xf9, 0x32, 0xf8, 0x08, 0xa0, 0xb4, 0x51, 0x9e, 0x36, 0x25, 0xa6, 0xe7, 0xc6, 0x73, 0xfe, 0x5b, 0x37, 0xff, 0x04, 0x89, 0x28, 0xf3, 0x0b, 0x0c, 0x1f, 0xd6, 0x4f, 0xba, 0xe3, 0x5d, 0x7e, 0x1e, 0x26, 0x84, 0x77, 0x29, 0x67, 0xde, 0x51, 0x24, 0x17, 0x29, 0x9f, 0xe9, 0xfb, 0x26, 0xf2, 0x53, 0xd1, 0xa8, 0xa0, 0xf3, 0x36, 0xea, 0xc4, 0x04, 0xc7, 0x25, 0x86, 0xa1, 0x87, 0x62, 0x9d, 0x36, 0x81, 0x8d, 0x12, 0x35, 0xae, 0xcc, 0x46, 0x0a, 0x18, 0x0f, 0x36, 0x50, 0x40, 0xe7, 0xfe, 0x45, 0xbd, 0x9b, 0x9c, 0x7b, 0x27, 0x79, 0xf7, 0xd1, 0x33, 0x6a, 0x20, 0xa2, 0x1f, 0xc9, 0xd7, 0x3c, 0x51, 0x75, 0x51, 0x94, 0x3b, 0x25, 0x38, 0x38, 0x81, 0xfc, 0xf4, 0x84, 0x5e, 0x5e, 0x29, 0x19, 0x44, 0x01, 0x80, 0x8b, 0xc2, 0x47, 0xab, 0x5a, 0xab, 0xcb, 0xa3, 0x24, 0x75, 0x39, 0x34, 0x18, 0xdf, 0x64, 0xbc, 0xae, 0xd6, 0x92, 0x30, 0x95, 0x9a, 0x1a, 0x5f, 0xed, 0x1d, 0x32, 0x7b, 0xb7, 0xac, 0x02, 0xd5, 0x8a, 0xd0, 0xfd, 0xe8, 0x87, 0x77, 0x70, 0x99, 0x8f, 0x4f, 0x5b, 0xbd, 0xb3, 0x73, 0x81, 0xdc, 0xeb, 0x49, 0xbb, 0x34, 0x0b, 0xaa, 0x91, 0x01, 0xf4, 0x44, 0x0b, 0xfc, 0x07, 0x3d, 0xc5, 0x22, 0xe0, 0x19, 0x42, 0xb6, 0x40, 0xde, 0x82, 0x89, 0x4a, 0x76, 0xd7, 0x79, 0xf3, 0x54, 0xf4, 0x38, 0xb4, 0x5b, 0x47, 0x4f, 0x81, 0xfb, 0x89, 0x62, 0xff, 0x9d, 0x93, 0xb5, 0xf2, 0x41, 0x73, 0xef, 0xf4, 0x65, 0xbf, 0x1e, 0x6d, 0x29, 0x29, 0xfc, 0xbf, 0xb2, 0x54, 0x71, 0xc1, 0xcc, 0xe6, 0x58, 0x6f, 0xd3, 0xdf, 0x86, 0xe0, 0xd3, 0x29, 0x08, 0x78, 0xee, 0x6f, 0xad, 0x5e, 0xfe, 0x33, 0xc5, 0x30, 0x7c, 0x1b, 0x27, 0xf6, 0xa1, 0x8c, 0x79, 0x55, 0xca, 0x7a, 0xab, 0x06, 0x21, 0x7f, 0xc5, 0x86, 0x7a, 0x2a, 0xe3, 0x0e, 0x7b, 0x99, 0x7d, 0xc5, 0x00, 0x4a, 0xec, 0x35, 0xbd, 0x2e, 0x2a, 0xfb, 0x26, 0xff, 0xda, 0xc3, 0x8b, 0xd4, 0x88, 0x74, 0x88, 0xf3, 0x31, 0xa8, 0x9c, 0xe6, 0x06, 0x5f, 0x18, 0xd1, 0x6d, 0xf4, 0x3b, 0x02, 0x49, 0x50, 0x9b, 0xca, 0x7b, 0x5d, 0xc6, 0x8b, 0xa9, 0xbd, 0x2a, 0x13, 0x3d, 0xbd, 0x32, 0x28, 0xb1, 0x84, 0xb2, 0x64, 0x0b, 0x91, 0x85, 0x44, 0xa3, 0x64, 0x75, 0x7b, 0x2c, 0x7a, 0x5a, 0x8c, 0xf2, 0x7f, 0x86, 0x97, 0x61, 0xc0, 0x61, 0x73, 0xc7, 0xdf, 0x51, 0xfe, 0x5b, 0xca, 0xdd, 0xb1, 0x7d, 0xed, 0x11, 0x78, 0x3f, 0xa7, 0x24, 0xc0, 0x25, 0xfb, 0x58, 0xd1, 0x29, 0x89, 0x22, 0x5e, 0x02, 0xbc, 0x8b, 0x5a, 0xa6, 0x44, 0xd6, 0x0e, 0x0e, 0xc7, 0x63, 0x69, 0x39, 0xd3, 0xd3, 0x97, 0x73, 0x18, 0x6d, 0xd5, 0xd7, 0xd4, 0xc0, 0x83, 0x13, 0x8e, 0x8a, 0x7a, 0x6b, 0x07, 0xd9, 0xa1, 0x01, 0x6e, 0x70, 0xbb, 0x53, 0xd3, 0x6c, 0x83, 0x05, 0xde, 0x28, 0xfb, 0xe1, 0xc1, 0x5d, 0x01, 0x1c, 0x6b, 0x8e, 0x23, 0xda, 0xfe, 0xa3, 0xb4, 0xf5, 0x84, 0xd4, 0x1f, 0xfa, 0xde, 0xc8, 0x7c, 0x75, 0xfc, 0xfe, 0x61, 0x6f, 0x54, 0x6d, 0xfb, 0x34, 0x8c, 0x67, 0x5d, 0x5a, 0x7a, 0xc3, 0x17, 0xfe, 0x4f, 0x3b, 0x0b, 0x51, 0x0f, 0x13, 0x7c, 0x54, 0x45, 0xfc, 0x68, 0xdf, 0xf4, 0x37, 0x18, 0xe8, 0xd0, 0xfd, 0xf5, 0x02, 0xae, 0x1f, 0x9d, 0x24, 0x3a, 0xea, 0x36, 0xac, 0xe8, 0x4d, 0x03, 0xa3, 0x2d, 0x3e, 0x34, 0x43, 0xee, 0x59, 0x03, 0xb6, 0x39, 0xca, 0xfc, 0x21, 0x33, 0x6e, 0x9c, 0xe1, 0x51, 0x35, 0x1e, 0x15, 0xcb, 0xcb, 0x92, 0x5c, 0x4e, 0x77, 0x2f, 0xe0, 0xf2, 0x43, 0xea, 0x93, 0x6b, 0x5d, 0x48, 0xb8, 0x83, 0xbd, 0x70, 0xa6, 0xc8, 0x08, 0x84, 0xc8, 0x81, 0xb4, 0x31, 0xe9, 0xe7, 0x6e, 0x85, 0xae, 0x92, 0xb8, 0x01, 0x64, 0x32, 0xd7, 0xf0, 0xfc, 0x7f, 0xec, 0xf7, 0x54, 0x73, 0x61, 0xec, 0xb9, 0xb6, 0x86, 0xeb, 0xa9, 0x5a, 0x7c, 0xa7, 0xdd, 0xc8, 0x53, 0xff, 0x87, 0xfa, 0x6f, 0xd2, 0xd8, 0xeb, 0x30, 0x13, 0xc5, 0x4c, 0xd2, 0x20, 0x0b, 0x79, 0x91, 0x4f, 0x70, 0xab, 0x11, 0xca, 0x4c, 0x6f, 0xfe, 0x9e, 0x49, 0x57, 0xef, 0x0e, 0x67, 0xef, 0x91, 0x2d, 0x43, 0xf2, 0x01, 0xac, 0x98, 0xbe, 0x79, 0xf0, 0x06, 0x06, 0x2f, 0x67, 0x12, 0xc7, 0x7a, 0x1d, 0x6f, 0x7d, 0x37, 0x8a, 0x7c, 0x96, 0x6b, 0xaf, 0x0d, 0x27, 0x2a, 0x61, 0x6e, 0xde, 0xb7, 0xe4, 0xa5, 0x38, 0xec, 0xbb, 0xf8, 0xf3, 0xdc, 0xbf, 0xaf, 0xc7, 0xb8, 0x6f, 0x1b, 0x51, 0xef, 0x87, 0xd7, 0x50, 0x99, 0xd4, 0x4e, 0x13, 0x16, 0x46, 0x7d, 0x32, 0xf2, 0x47, 0xfb, 0x7d, 0x0c, 0x4b, 0x36, 0x32, 0xf8, 0xa8, 0xff, 0x73, 0xa1, 0xa9, 0x49, 0xf6, 0x33, 0xdd, 0x2d, 0xff, 0x38, 0xb5, 0x32, 0x8b, 0x01, 0x4e, 0xcc, 0xce, 0x47, 0x8c, 0x22, 0xe0, 0x12, 0x68, 0x14, 0xb4, 0xda, 0x8b, 0x7d, 0x49, 0xec, 0x1b, 0xb5, 0x24, 0x10, 0xd5, 0x5b, 0xfd, 0x69, 0x5c, 0x51, 0xb9, 0x9c, 0xd0, 0x07, 0x98, 0x35, 0xa3, 0xfd, 0xb0, 0x46, 0xa8, 0x83, 0x9a, 0x50, 0x6d, 0xc4, 0x6b, 0x67, 0xcb, 0x02, 0xe5, 0x92, 0xbb, 0x23, 0xef, 0x71, 0x6b, 0x6d, 0x43, 0x22, 0x92, 0x8e, 0x67, 0x64, 0x00, 0xdf, 0xde, 0xfd, 0x79, 0xe9, 0x9f, 0x5a, 0xc3, 0x29, 0xc6, 0x76, 0xfe, 0x10, 0x8a, 0xfd, 0x34, 0x4e, 0x6f, 0xb0, 0x31, 0x50, 0xbc, 0x0b, 0x95, 0x07, 0x30, 0x25, 0x27, 0xec, 0xf1, 0xd9, 0x6c, 0x41, 0xc5, 0x23, 0x79, 0x99, 0x84, 0xcc, 0x05, 0x9a, 0xce, 0x4a, 0xc2, 0x02, 0xf9, 0xe2, 0xee, 0xe8, 0x4d, 0x0f, 0x24, 0x45, 0x74, 0x27, 0x79, 0xb2, 0x2c, 0x3c, 0xc4, 0x73, 0x3f, 0x40, 0x3d, 0xb5, 0xb5, 0x6d, 0x4a, 0x14, 0x48, 0xe4, 0x95, 0x60, 0x18, 0x95, 0x62, 0xa1, 0xa0, 0x5e, 0x20, 0x58, 0xe9, 0x77, 0x3d, 0x08, 0xfd, 0x0d, 0x3f, 0xf5, 0x9f, 0x2d, 0x11, 0x2c, 0x39, 0xe4, 0x9a, 0xc3, 0x16, 0xa5, 0x94, 0x62, 0xd1, 0xea, 0x9c, 0x03, 0x0e, 0x1e, 0x85, 0xf5, 0x67, 0xbb, 0xf2, 0x27, 0xaa, 0xb0, 0x24, 0xa3, 0x41, 0x05, 0x10, 0x59, 0xf1, 0xc1, 0xb5, 0x1e, 0xc8, 0x0c, 0xac, 0xf4, 0x50, 0x91, 0x01, 0x8c, 0x09, 0x26, 0x41, 0x09, 0x16, 0xaf, 0xd4, 0x07, 0x37, 0x3f, 0x8d, 0xdc, 0xf7, 0x81, 0x80, 0x1d, 0x27, 0x57, 0x14, 0x65, 0x8a, 0xc0, 0x59, 0x51, 0xd2, 0xff, 0x9b, 0xcf, 0xcb, 0xfa, 0x37, 0x99, 0xd7, 0xe0, 0xad, 0xfc, 0x9a, 0x0e, 0xf7, 0xde, 0xf6, 0x34, 0x19, 0xff, 0x3a, 0xb3, 0xfa, 0x7f, 0x96, 0x4a, 0x72, 0xa1, 0xd3, 0xf2, 0xa4, 0xce, 0x40, 0x06, 0x8e, 0xdd, 0xf0, 0xa7, 0xde, 0x91, 0x22, 0x5f, 0x07, 0x63, 0x01, 0x04, 0x95, 0x82, 0x8e, 0xe0, 0xbd, 0x19, 0xda, 0x0e, 0x39, 0xd0, 0x78, 0x27, 0x53, 0x95, 0x32, 0x1f, 0x3f, 0x9c, 0xfb, 0x69, 0xad, 0xa4, 0x25, 0x62, 0x9f, 0x7d, 0xd4, 0xec, 0x78, 0xc7, 0xb3, 0x59, 0x56, 0xfc, 0xe5, 0x8c, 0xa2, 0xb1, 0x3f, 0x5a, 0xe6, 0x18, 0xb4, 0x36, 0xde, 0xca, 0x10, 0x0e, 0xd1, 0xc3, 0xea, 0x70, 0x21, 0xae, 0xd3, 0xf1, 0x22, 0x64, 0xd4, 0xcf, 0x28, 0xaf, 0x18, 0xd5, 0xe4, 0x53, 0xe5, 0x7f, 0xf0, 0x4f, 0xd1, 0x5f, 0xa8, 0x60, 0x32, 0xbf, 0x3c, 0xc7, 0xd6, 0x88, 0x03, 0x4c, 0xf4, 0x63, 0x12, 0x83, 0x63, 0x1d, 0x0e, 0x4e, 0x0a, 0x50, 0x3e, 0xa3, 0x98, 0x40, 0xe4, 0x8f, 0x75, 0x03, 0xce, 0x7b, 0xf8, 0xe5, 0x28, 0xaf, 0xda, 0x0a, 0x94, 0x14, 0xea, 0x55, 0x7d, 0x3e, 0x03, 0x89, 0xa7, 0xa9, 0x3b, 0xae, 0x0b, 0x43, 0x5e, 0xb7, 0xe3, 0x2b, 0x9b, 0x61, 0x01, 0xb9, 0x7c, 0x5e, 0x64, 0xbe, 0x1c, 0xb3, 0x0d, 0x0d, 0x94, 0x5f, 0x0f, 0x3a, 0xb6, 0x3d, 0xe6, 0xa1, 0xfe, 0x2b, 0x09, 0xaa, 0xc5, 0x6c, 0xc3, 0x4c, 0xb8, 0x4b, 0x3e, 0xd0, 0x89, 0x01, 0xe1, 0xd8, 0xe4, 0xd9, 0xdb, 0x9f, 0xa5, 0x92, 0x00, 0x82, 0x48, 0x05, 0xd5, 0xc0, 0xa0, 0x08, 0xe6, 0x7e, 0xcc, 0x91, 0x60, 0x0e, 0x68, 0x1f, 0xdb, 0x70, 0x00, 0x55, 0x78, 0x19, 0xca, 0xe8, 0x2c, 0xf4, 0x94, 0xbc, 0x5b, 0xa7, 0xfb, 0x4a, 0xa9, 0x17, 0xde, 0x45, 0x0d, 0x2e, 0x12, 0x7d, 0x27, 0xdc, 0x57, 0x03, 0xd3, 0x5b, 0x8b, 0x8e, 0xfe, 0xb8, 0x1e, 0x1d, 0xb8, 0x8f, 0xc6, 0xde, 0x8b, 0x16, 0x74, 0x4f, 0x0b, 0x5c, 0x86, 0xa3, 0xaf, 0xd3, 0x3e, 0x67, 0xdf, 0x0d, 0x73, 0x65, 0x4e, 0xc3, 0x86, 0xc9, 0x8a, 0x1b, 0x98, 0x82, 0xd2, 0x2a, 0xfa, 0xeb, 0x27, 0xb8, 0xe5, 0xab, 0xa5, 0x44, 0x6c, 0xda, 0x14, 0x48, 0xae, 0x65, 0xbb, 0xbf, 0x50, 0xb3, 0x74, 0xe3, 0x2b, 0x88, 0x06, 0x3b, 0x41, 0x2a, 0xae, 0xd5, 0xf6, 0xc3, 0xff, 0xd1, 0x7d, 0x07, 0xed, 0x1f, 0x90, 0x16, 0x24, 0x88, 0x64, 0xa4, 0x9e, 0xf3, 0xdc, 0x57, 0x74, 0xe1, 0xfd, 0x70, 0xf4, 0x3b, 0xa2, 0xae, 0xf5, 0x4d, 0x70, 0x6f, 0x67, 0x12, 0x0d, 0x19, 0x2e, 0xb2, 0x8d, 0xb8, 0x31, 0x49, 0x2d, 0xe9, 0xad, 0xea, 0x44, 0xf6, 0xd0, 0xe4, 0x76, 0x42, 0x83, 0x43, 0x2b, 0xe8, 0x87, 0x9a, 0x3f, 0x9f, 0xc3, 0x00, 0xfc, 0xe1, 0xdc, 0x59, 0x45, 0x4c, 0x07, 0xd7, 0x13, 0x48, 0x1b, 0xc0, 0x26, 0xea, 0xeb, 0x71, 0xf4, 0x18, 0xd2, 0xa3, 0xe6, 0xee, 0x8f, 0xed, 0xc3, 0x61, 0x53, 0x8a, 0x6c, 0x22, 0x19, 0x5d, 0xcb, 0xc5, 0x36, 0x32, 0x06, 0x23, 0x31, 0x47, 0xf8, 0xfd, 0xd4, 0x0b, 0xe1, 0xe2, 0x83, 0x25, 0x5c, 0x52, 0xcd, 0xb8, 0x92, 0x23, 0x41, 0xe5, 0xae, 0x24, 0x83, 0x92, 0x91, 0x01, 0x9f, 0x6a, 0xc6, 0x66, 0x9c, 0x25, 0xb8, 0x67, 0x55, 0x0a, 0x22, 0x20, 0x84, 0xb2, 0xc8, 0x98, 0x20, 0x0e, 0x65, 0xec, 0xe9, 0xac, 0xe4, 0xa9, 0x41, 0x35, 0xd2, 0x79, 0x3d, 0x3b, 0x14, 0x02, 0xfc, 0x31, 0xd5, 0x0b, 0x37, 0xbb, 0xc3, 0xe0, 0x1a, 0x29, 0x7b, 0xf8, 0x52, 0x3d, 0x41, 0xd6, 0x68, 0x35, 0xf5, 0x2d, 0x4d, 0x05, 0x42, 0x47, 0x36, 0xe5, 0x19, 0xa7, 0xa9, 0x0b, 0x5e, 0xee, 0xd8, 0xba, 0xe1, 0xfb, 0x2f, 0x7b, 0x8f, 0x56, 0x29, 0xab, 0xea, 0xcf, 0x67, 0x35, 0xb6, 0x62, 0x03, 0xa1, 0xf5, 0x5e, 0x22, 0x4e, 0x16, 0xc7, 0xc8, 0xfb, 0x6a, 0xf8, 0xf1, 0x8c, 0xd7, 0x8c, 0xdd, 0x0b, 0xd0, 0x7f, 0xab, 0xee, 0x84, 0x91, 0x29, 0x98, 0x56, 0xeb, 0xeb, 0x22, 0x8e, 0x05, 0x9a, 0x5a, 0x4e, 0xc7, 0x8f, 0x0c, 0xc7, 0xef, 0xa0, 0x81, 0xac, 0xb2, 0x3a, 0x46, 0xe7, 0xa6, 0xb1, 0x2e, 0x8c, 0xdf, 0xd3, 0x9a, 0x0b, 0x58, 0xc3, 0xf8, 0xa9, 0x95, 0x05, 0x8a, 0x31, 0x87, 0xd5, 0x69, 0xe6, 0xb0, 0xbd, 0xc9, 0xbd, 0x88, 0x66, 0x7e, 0xc9, 0x1e, 0xaf, 0xc0, 0xf7, 0x02, 0xfc, 0x2b, 0xfb, 0x63, 0xd0, 0x09, 0x8a, 0x75, 0x9f, 0xd4, 0xca, 0x15, 0xdd, 0xf7, 0x07, 0xb0, 0x5b, 0xd5, 0xa7, 0x61, 0xd3, 0x0c, 0x60, 0x59, 0xc2, 0xfb, 0xa8, 0x84, 0x75, 0x82, 0x6d, 0x6a, 0x67, 0x08, 0x07, 0x53, 0xca, 0xc3, 0x6b, 0xae, 0x64, 0x33, 0xa1, 0xb3, 0x9c, 0xf0, 0x78, 0x48, 0xd5, 0xa6, 0x78, 0x21, 0xfa, 0x5e, 0x18, 0x2c, 0x5a, 0xff, 0x31, 0x2c, 0xb7, 0x14, 0xb3, 0xa3, 0x99, 0xcf, 0x97, 0xf6, 0xe8, 0x4e, 0x14, 0xcc, 0xba, 0x1e, 0x16, 0xb7, 0x6a, 0xfe, 0xec, 0x16, 0xea, 0xe5, 0x40, 0x3a, 0x5a, 0x46, 0x4d, 0xc7, 0xd9, 0x92, 0x4c, 0x5d, 0x9b, 0xff, 0x2f, 0x78, 0x3b, 0x88, 0x92, 0x95, 0x53, 0x34, 0xef, 0x97, 0x4b, 0x9c, 0x11, 0x68, 0x6e, 0xa7, 0xcb, 0xe3, 0x43, 0x99, 0xe9, 0xf2, 0x1a, 0x4c, 0x67, 0xf3, 0xe5, 0xbc, 0xe1, 0x61, 0x49, 0xca, 0x4b, 0xb0, 0xf5, 0x39, 0xe2, 0x78, 0x33, 0xfd, 0x62, 0xd6, 0xbc, 0xb5, 0x7a, 0x10, 0xd1, 0x76, 0x7d, 0x77, 0x87, 0xca, 0x5a, 0x92, 0x63, 0xf8, 0xce, 0x78, 0x26, 0x86, 0xd8, 0x7e, 0xea, 0xfd, 0x6e, 0x12, 0x6e, 0xec, 0x6e, 0xe7, 0xaf, 0x2f, 0xd7, 0x53, 0xb8, 0x71, 0x39, 0xf5, 0xba, 0xf0, 0x6a, 0x9a, 0x5f, 0x80, 0x7b, 0x61, 0x5c, 0xd3, 0xea, 0x1e, 0x46, 0xf7, 0x19, 0xfd, 0xa6, 0x20, 0xff, 0x68, 0x4f, 0xa8, 0x1e, 0x2a, 0xef, 0x54, 0xb5, 0xd4, 0xe5, 0xd9, 0x36, 0x5f, 0x52, 0x9f, 0xfa, 0x14, 0x73, 0xc4, 0x34, 0xa9, 0x2e, 0x64, 0x24, 0xad, 0xea, 0x18, 0x8d, 0x26, 0xa4, 0xbc, 0x68, 0x78, 0x3f, 0x76, 0xda, 0x88, 0x1c, 0xf3, 0x64, 0x22, 0xeb, 0xf4, 0x5a, 0x98, 0xc1, 0x0a, 0x96, 0xac, 0x6a, 0x9d, 0x6d, 0xb0, 0x00, 0x33, 0xe2, 0xec, 0xbc, 0xef, 0x1a, 0x40, 0x0d, 0x58, 0x10, 0x0b, 0xe7, 0x5d, 0x8a, 0x4b, 0x5e, 0x95, 0x4c, 0x05, 0x73, 0xcb, 0x8b, 0xe7, 0x2e, 0xb9, 0xa4, 0x2c, 0xed, 0x14, 0x0e, 0xc0, 0xfb, 0xc9, 0x8d, 0xa4, 0x64, 0x87, 0xa9, 0x95, 0x08, 0x7d, 0x5f, 0xe8, 0xef, 0x65, 0x16, 0xb9, 0xdc, 0xc1, 0xd5, 0x44, 0x25, 0x64, 0xb2, 0x93, 0xc1, 0x35, 0x8e, 0x5a, 0xa3, 0x30, 0xff, 0x1f, 0x46, 0xad, 0x8e, 0x9d, 0x8a, 0xe5, 0x23, 0x6b, 0xbe, 0xb2, 0xbd, 0xd9, 0xfe, 0x96, 0x66, 0x1b, 0xbf, 0xff, 0x67, 0xa9, 0xa8, 0xc9, 0xb8, 0xe5, 0xa4, 0x05, 0xba, 0xfe, 0x35, 0xf9, 0x28, 0x15, 0x0b, 0x67, 0x4b, 0x9f, 0xd5, 0x13, 0x6e, 0x0b, 0x57, 0x7f, 0x92, 0xa4, 0xbc, 0xf9, 0x63, 0xb8, 0x2e, 0xd7, 0x6a, 0xfa, 0xa5, 0x02, 0x83, 0x25, 0xfc, 0xb1, 0x92, 0xe2, 0x4a, 0x77, 0x72, 0xec, 0x6f, 0x80, 0x2e, 0x72, 0xed, 0x18, 0x74, 0xbd, 0xfa, 0x6c, 0x46, 0x12, 0xd3, 0x95, 0xf3, 0xda, 0x52, 0xd2, 0x46, 0x00, 0xc3, 0x15, 0xfd, 0x9b, 0xf4, 0xc2, 0x7c, 0xcd, 0x8b, 0xb3, 0xc3, 0xea, 0x9c, 0x7f, 0x9e, 0xdd, 0x7b, 0xfc, 0x1b, 0xc8, 0xcf, 0x02, 0x41, 0xeb, 0xe8, 0x72, 0xff, 0xc7, 0x53, 0x77, 0x63, 0x83, 0xab, 0x0c, 0x0d, 0x8e, 0xb1, 0xbf, 0xe2, 0x86, 0x9f, 0xb4, 0x05, 0x59, 0xba, 0xec, 0x03, 0xaa, 0x27, 0xc7, 0x4d, 0x76, 0xff, 0xc8, 0xec, 0xf7, 0xa6, 0x99, 0x70, 0xc8, 0x58, 0x4f, 0x29, 0x4b, 0x04, 0xee, 0x9a, 0x48, 0x5e, 0x30, 0x2b, 0xd6, 0x30, 0x82, 0x1e, 0x7f, 0xf0, 0x50, 0xc4, 0x9f, 0x98, 0x82, 0xf1, 0x0d, 0xb2, 0x47, 0xad, 0xfd, 0xb2, 0x11, 0x2c, 0x25, 0x89, 0xe1, 0x01, 0x1f, 0x77, 0xc4, 0x8e, 0x0f, 0x21, 0x9d, 0xbf, 0x85, 0xe3, 0x26, 0xf8, 0xa5, 0x67, 0x32, 0x4b, 0x85, 0x77, 0x35, 0xef, 0xd6, 0x0f, 0x05, 0xed, 0xc7, 0xb7, 0xe2, 0x1d, 0x26, 0x0f, 0xb5, 0x51, 0xc8, 0xac, 0x95, 0xd0, 0x2c, 0x22, 0x8f, 0x06, 0x5b, 0x62, 0xa7, 0x79, 0x12, 0x47, 0x1a, 0xff, 0x23, 0x6b, 0xe6, 0x2f, 0x19, 0x3f, 0x8c, 0x15, 0x1b, 0x5b, 0x15, 0x2a, 0x13, 0x12, 0x53, 0x82, 0x0f, 0x4a, 0x69, 0x48, 0xe7, 0x8a, 0x8e, 0x68, 0x20, 0x55, 0x0d, 0x8b, 0x10, 0xb7, 0x90, 0x48, 0x43, 0x1d, 0x9f, 0x98, 0x1e, 0x6a, 0x64, 0x8b, 0xc2, 0x46, 0xb1, 0x3a, 0x33, 0xb9, 0x44, 0xfd, 0xba, 0xfa, 0x49, 0xde, 0x87, 0x81, 0x20, 0x4d, 0x9b, 0x63, 0x61, 0x15, 0xe5, 0xdf, 0x1d, 0x8e, 0xab, 0x34, 0x67, 0x14, 0x2c, 0xb6, 0x13, 0xb9, 0x84, 0x21, 0xbe, 0x37, 0xcf, 0x2d, 0x0f, 0x29, 0x91, 0x63, 0x3b, 0x7a, 0x56, 0x2e, 0xcf, 0x1d, 0x95, 0x35, 0xaa, 0xfe, 0xda, 0xe8, 0x48, 0x39, 0x24, 0x59, 0x47, 0x8b, 0x8c, 0x4e, 0x23, 0x05, 0x28, 0x94, 0x45, 0x08, 0x2f, 0x96, 0x3c, 0x6d, 0x5e, 0x2e, 0x4a, 0x04, 0x9a, 0xba, 0x22, 0x40, 0xd6, 0x73, 0xf0, 0x30, 0x37, 0xfa, 0x9a, 0xb1, 0x76, 0x34, 0x45, 0xe3, 0x87, 0x58, 0x1c, 0xd9, 0x78, 0x46, 0x4c, 0x95, 0x9b, 0x1b, 0x53, 0x33, 0xe7, 0x02, 0x7b, 0x64, 0x9c, 0x4d, 0xa1, 0x1e, 0x26, 0xc4, 0x3b, 0x92, 0x44, 0x3c, 0x9a, 0x5f, 0x69, 0x6c, 0x6c, 0x05, 0x63, 0xfd, 0x84, 0x9c, 0x3a, 0xe0, 0xde, 0xc6, 0x5b, 0xe4, 0xdd, 0xe2, 0xf5, 0x88, 0xd8, 0x82, 0xa4, 0x0d, 0xd5, 0x1f, 0x4d, 0xd0, 0x94, 0x0c, 0x49, 0xd7, 0xd0, 0xa9, 0xc5, 0xaa, 0xc1, 0xd9, 0x68, 0x64, 0xe5, 0xb6, 0x37, 0x09, 0x00, 0x83, 0xb6, 0x1a, 0x62, 0xe1, 0x50, 0x67, 0x68, 0x46, 0xf9, 0x25, 0x45, 0xac, 0x12, 0x40, 0x02, 0x86, 0x8d, 0xf3, 0xc4, 0xf8, 0x51, 0x95, 0x4e, 0x47, 0xe0, 0xb6, 0xc6, 0x8f, 0x37, 0x6a, 0xbc, 0xb4, 0xf6, 0xe5, 0x68, 0x9a, 0xc0, 0x48, 0x33, 0x99, 0xe5, 0xbb, 0x7a, 0x2b, 0x3e, 0xbc, 0x8e, 0xe8, 0x59, 0xb6, 0xff, 0xb5, 0xd6, 0xd6, 0x1a, 0x38, 0x11, 0x1a, 0xb0, 0x8f, 0x02, 0xab, 0x19, 0x41, 0x61, 0x6c, 0x79, 0x74, 0x0d, 0xd3, 0x42, 0x61, 0xae, 0xf8, 0xfa, 0x06, 0x99, 0xeb, 0x3f, 0x1a, 0xf5, 0x4b, 0x08, 0x46, 0x1c, 0x14, 0x2d, 0x92, 0x44, 0xb9, 0x2a, 0x1e, 0x5f, 0x73, 0x20, 0x12, 0x40, 0xd8, 0x1c, 0xd7, 0xfe, 0xaf, 0x9c, 0x88, 0x9d, 0x03, 0x4f, 0xa3, 0xeb, 0x76, 0x1d, 0x05, 0xa9, 0xd8, 0x67, 0x15, 0xeb, 0xf8, 0x90, 0x3f, 0xc2, 0xba, 0xbc, 0xa4, 0x17, 0x6a, 0xd7, 0x0f, 0xda, 0x50, 0xda, 0x2b, 0x5d, 0x85, 0x49, 0xf4, 0xfa, 0x05, 0x00, 0x6c, 0xfc, 0x04, 0x30, 0x8f, 0xbd, 0x86, 0xa5, 0x88, 0x0b, 0x2a, 0x4a, 0x25, 0xd0, 0x46, 0xee, 0x89, 0xf2, 0x39, 0x48, 0x21, 0x79, 0xfd, 0x39, 0xd9, 0xf0, 0xfc, 0x52, 0x8f, 0x0d, 0x25, 0x96, 0xc7, 0x94, 0x3e, 0x81, 0xa1, 0x78, 0x7c, 0x49, 0x09, 0x43, 0x51, 0x63, 0x2e, 0xb9, 0x85, 0x49, 0x35, 0xb8, 0x88, 0x7b, 0x2e, 0x63, 0x07, 0xc3, 0x47, 0x80, 0xbd, 0xbe, 0x3f, 0x1d, 0x8c, 0x98, 0x1e, 0x7a, 0xcc, 0x17, 0x24, 0x23, 0xe3, 0xdb, 0xff, 0x5d, 0x15, 0xe4, 0x41, 0xc3, 0x9e, 0x54, 0x10, 0x31, 0xfe, 0x76, 0x1f, 0xe1, 0x95, 0x00, 0xde, 0xd4, 0x6f, 0x95, 0xee, 0x74, 0x61, 0x8e, 0xd8, 0x77, 0x55, 0xfa, 0xfe, 0x06, 0xe2, 0xe3, 0xd2, 0x1f, 0x20, 0xd4, 0x45, 0x38, 0xba, 0x97, 0x83, 0x25, 0x44, 0x43, 0xdd, 0x3b, 0xcf, 0x77, 0x06, 0xb6, 0xbb, 0xe0, 0x83, 0x58, 0xcd, 0x01, 0x5d, 0x53, 0x81, 0x33, 0x19, 0x69, 0xa2, 0xea, 0xe9, 0x52, 0x17, 0x3b, 0x24, 0x5e, 0x00, 0x9b, 0xf4, 0x5b, 0x02, 0xea, 0x4f, 0xb9, 0xde, 0xb0, 0x28, 0xec, 0x49, 0xa6, 0xe6, 0x12, 0xf8, 0x78, 0x15, 0xd6, 0xfa, 0xc9, 0x5b, 0x94, 0x4a, 0x77, 0xae, 0xbe, 0xa5, 0x21, 0xc5, 0x7e, 0x99, 0xe7, 0xcc, 0x9c, 0xdf, 0x71, 0x5c, 0xa3, 0xea, 0x33, 0xaa, 0x3f, 0xc0, 0xef, 0xff, 0xea, 0x09, 0x7b, 0x68, 0xc7, 0x65, 0xc4, 0xae, 0xce, 0x03, 0x13, 0x88, 0x2a, 0x70, 0x8f, 0x10, 0xdf, 0xac, 0x04, 0x74, 0xb0, 0x83, 0xe2, 0xee, 0x40, 0x1a, 0x89, 0xf6, 0x77, 0xc9, 0xc3, 0xb6, 0x27, 0x28, 0x92, 0xbe, 0xf0, 0x6d, 0x2d, 0xf9, 0x61, 0xf5, 0x45, 0xdf, 0x5f, 0x20, 0x8c, 0xed, 0xcb, 0x62, 0x78, 0x52, 0x5f, 0x97, 0x44, 0xec, 0xd9, 0x97, 0x39, 0x72, 0x5c, 0x0b, 0x2b, 0xf3, 0x13, 0x7f, 0x46, 0x7f, 0x17, 0xb8, 0x0b, 0x24, 0x93, 0x47, 0x95, 0x1c, 0x26, 0x5e, 0x21, 0x44, 0x88, 0xe3, 0xcd, 0xd0, 0x71, 0xc3, 0xa0, 0x3d, 0xb6, 0x89, 0xcb, 0x88, 0xb5, 0x2f, 0x2e, 0x9e, 0xf4, 0x33, 0x1e, 0x13, 0x05, 0xee, 0x66, 0x16, 0xad, 0x22, 0x8b, 0xa5, 0x45, 0xd2, 0x55, 0xfd, 0x5f, 0x56, 0x8a, 0x55, 0xad, 0xae, 0xfd, 0xcb, 0x1f, 0x17, 0xc7, 0x9f, 0x4c, 0xdc, 0xd5, 0x9f, 0x13, 0x6f, 0xa3, 0xe2, 0x82, 0xb8, 0x46, 0xb9, 0xf6, 0xad, 0xb0, 0xe3, 0x84, 0x23, 0x30, 0x00, 0x98, 0xe3, 0x38, 0x48, 0xdc, 0x01, 0x63, 0x7d, 0x5c, 0x69, 0xb6, 0x1e, 0xe7, 0xbb, 0x27, 0xde, 0xb8, 0x59, 0x5b, 0x55, 0x56, 0xbe, 0xb4, 0xf4, 0xb8, 0x11, 0x8b, 0x3e, 0xad, 0xf9, 0xba, 0x35, 0x7b, 0xb4, 0x5e, 0x13, 0xc6, 0x63, 0xdb, 0x3b, 0xb4, 0xa8, 0x20, 0x6f, 0x4f, 0x73, 0x2c, 0x43, 0x2b, 0x19, 0xd0, 0xd2, 0x48, 0xa7, 0xb7, 0xaf, 0x39, 0x75, 0xa5, 0x1f, 0x86, 0xfe, 0xfc, 0x85, 0x50, 0xee, 0x84, 0x1d, 0x33, 0x7d, 0x6b, 0xed, 0x71, 0xfc, 0x8b, 0xf9, 0x4c, 0xad, 0xec, 0xb7, 0xb3, 0xd8, 0x8a, 0xc2, 0x21, 0x1b, 0x58, 0xd2, 0xc3, 0x02, 0x84, 0xec, 0xd9, 0xd8, 0xfd, 0xd6, 0x5e, 0xbc, 0x33, 0xce, 0xeb, 0xf7, 0x1e, 0x7b, 0xd9, 0x8c, 0x81, 0x24, 0xa6, 0x11, 0x70, 0x20, 0x99, 0xbe, 0x10, 0x8e, 0xa9, 0xc4, 0x9e, 0x46, 0x9c, 0xdf, 0xb2, 0x0f, 0x6c, 0x2f, 0xc5, 0x12, 0xee, 0x44, 0xf1, 0x8e, 0xb5, 0x78, 0xf9, 0xce, 0x35, 0x81, 0x89, 0x58, 0x24, 0x46, 0xbf, 0x68, 0x26, 0xf2, 0xe9, 0x9c, 0xa8, 0x47, 0x91, 0xf1, 0x0c, 0x36, 0xb7, 0xee, 0x07, 0xac, 0x5d, 0x1f, 0x48, 0xae, 0x49, 0xc5, 0x5b, 0xa8, 0x06, 0xcc, 0xcc, 0x02, 0x2c, 0xfd, 0x8f, 0xf5, 0xe1, 0x75, 0x9f, 0x9d, 0xa0, 0x56, 0xe6, 0x4f, 0x39, 0xbc, 0x5d, 0x2c, 0x19, 0xf3, 0x74, 0xf6, 0xcc, 0xe7, 0xb4, 0x23, 0xc0, 0xdb, 0xa3, 0x30, 0x4c, 0x5e, 0xe8, 0x38, 0xf0, 0x7b, 0xaf, 0xc5, 0xdf, 0x31, 0x4f, 0xe6, 0xba, 0x23, 0x2a, 0x82, 0x9f, 0x8f, 0xd5, 0xeb, 0x62, 0x84, 0x7a, 0xb6, 0x1a, 0x50, 0x7a, 0xcb, 0xe0, 0x38, 0x56, 0xb8, 0xd3, 0x6d, 0xcf, 0x4b, 0x60, 0x3b, 0x4c, 0x5f, 0xc0, 0x82, 0x7d, 0xf6, 0xc1, 0x6a, 0x3e, 0x88, 0xca, 0x53, 0xbe, 0x9b, 0x19, 0x0b, 0xe0, 0x94, 0x50, 0x44, 0xe1, 0xcd, 0x30, 0x45, 0x3c, 0xe7, 0xa4, 0xdf, 0xca, 0x62, 0x01, 0xa3, 0x2e, 0x6a, 0x8c, 0x52, 0x70, 0xf4, 0x3d, 0x95, 0xe8, 0x0a, 0xc2, 0xee, 0x5e, 0x63, 0xc7, 0xef, 0x6f, 0x37, 0x75, 0xaa, 0x32, 0x51, 0x38, 0x68, 0x1c, 0x66, 0xc6, 0x9e, 0x21, 0xa5, 0x5d, 0x1c, 0x1c, 0x8f, 0x4b, 0x88, 0x71, 0x09, 0xb4, 0x0b, 0xf1, 0xb0, 0x90, 0x4a, 0xfe, 0x6c, 0xf3, 0x98, 0xef, 0x48, 0x91, 0x69, 0xb6, 0x81, 0x81, 0x0a, 0xbf, 0xdc, 0x41, 0x90, 0x1c, 0x3d, 0xfb, 0x0f, 0xe0, 0x76, 0x06, 0x0c, 0xc8, 0x5d, 0xb0, 0x34, 0x21, 0x21, 0x3b, 0x4e, 0xe5, 0xde, 0x25, 0x6e, 0x28, 0x6e, 0xad, 0x6b, 0xb2, 0x83, 0x92, 0x94, 0xee, 0xf2, 0x1e, 0x9f, 0x03, 0x52, 0x63, 0xe2, 0x40, 0xc6, 0xc5, 0xc6, 0xbd, 0x17, 0xb8, 0x78, 0x3f, 0x06, 0xcb, 0xe1, 0x5d, 0xe0, 0xe6, 0xd9, 0xe1, 0x52, 0xcf, 0x97, 0x71, 0x7f, 0xf3, 0x6c, 0x6f, 0x50, 0x64, 0xb2, 0x1d, 0x0b, 0x1e, 0xff, 0x05, 0x28, 0x8e, 0x9e, 0x98, 0x60, 0x55, 0x3f, 0x15, 0x06, 0x49, 0xed, 0xac, 0x9a, 0xbc, 0x41, 0xe4, 0x9c, 0x02, 0xd5, 0x3a, 0x9e, 0x2d, 0xfc, 0x0a, 0x9d, 0x1b, 0xb0, 0xb3, 0x91, 0xb3, 0xcc, 0xf7, 0x43, 0x6b, 0x7c, 0xa0, 0x5f, 0x0d, 0xf1, 0x69, 0xca, 0xbc, 0x59, 0x1b, 0x35, 0x32, 0x0e, 0xf7, 0xf3, 0x4b, 0x0d, 0x54, 0x07, 0xc7, 0xab, 0x89, 0x82, 0x4b, 0x83, 0x0d, 0x0c, 0xaa, 0xb3, 0xdd, 0xc0, 0x63, 0x48, 0x1e, 0x3d, 0x6b, 0xf6, 0x04, 0xf9, 0x2c, 0x0d, 0xf2, 0xd9, 0xcd, 0xa8, 0xe3, 0xff, 0xb4, 0x27 ],
+    const [ 0x0f, 0x54, 0x52, 0xe6, 0xb5, 0x15, 0x40, 0xcf, 0x21, 0x99, 0x98, 0x59, 0x09, 0x95, 0xcd, 0x7f, 0x87, 0x85, 0xfa, 0x40, 0xb4, 0xf2, 0x17, 0xfc, 0x79, 0xf0, 0x73, 0x22, 0xa2, 0xec, 0x5e, 0x08, 0x34, 0xa4, 0x26, 0x1a, 0x01, 0x77, 0x46, 0x37, 0x79, 0xdf, 0xd9, 0x58, 0xc3, 0x3c, 0x55, 0x73, 0x0d, 0xd3, 0x75, 0x9f, 0x20, 0x16, 0x77, 0x78, 0x37, 0x26, 0x88, 0xc5, 0x11, 0x96, 0x7d, 0x58, 0x45, 0x72, 0xc3, 0x36, 0xd6, 0x7f, 0x99, 0xf8, 0x07, 0xc5, 0x7c, 0x71, 0x70, 0x4b, 0xe3, 0x91, 0x52, 0x22, 0x2d, 0x89, 0x28, 0xa4, 0xd8, 0x30, 0x7e, 0xfe, 0xf3, 0xa6, 0x06, 0xec, 0xd6, 0x37, 0xe9, 0xc4, 0x10, 0x82, 0x5b, 0xb6, 0xa1, 0xda, 0x72, 0x52, 0x6a, 0xec, 0x38, 0x4a, 0xe1, 0xa2, 0xff, 0x7a, 0x09, 0x48, 0xf4, 0x25, 0xa2, 0xee, 0xf7, 0x82, 0x9c, 0x0d, 0xaa, 0x77, 0xd2, 0x6d, 0xc8, 0xa4, 0xf5, 0x45, 0xb9, 0xa3, 0xc6, 0xa5, 0x63, 0x8e, 0x89, 0x11, 0x42, 0xc2, 0xb6, 0x6e, 0xbb, 0xe3, 0xf1, 0x23, 0xad, 0x21, 0x3c, 0x78, 0x4a, 0xb9, 0x6c, 0x41, 0x25, 0xbe, 0xd9, 0xc1, 0x8b, 0x19, 0x5a, 0xc9, 0x17, 0xcf, 0x71, 0x20, 0x81, 0x82, 0xc2, 0x27, 0xb7, 0x3b, 0xca, 0xbd, 0x2f, 0x66, 0xcd, 0x61, 0x7b, 0x1e, 0x10, 0x96, 0x1e, 0xab, 0x49, 0x8c, 0x9e, 0x49, 0x54, 0xfc, 0xda, 0x2b, 0x27, 0x54, 0x9e, 0xc0, 0x08, 0x14, 0x75, 0x35, 0xfe, 0x78, 0xbe, 0x3b, 0x85, 0x57, 0x02, 0x0a, 0x85, 0x4b, 0x85, 0xa6, 0x85, 0x12, 0x1b, 0x61, 0x1c, 0x34, 0x3d, 0xa1, 0xa9, 0xe6, 0x5c, 0xe3, 0x44, 0x2f, 0x75, 0x00, 0xf5, 0x49, 0xe6, 0xaf, 0x23, 0x4a, 0x80, 0x4c, 0x4f, 0x04, 0xdd, 0xd8, 0x02, 0x29, 0xf4, 0x40, 0x03, 0xb3, 0xea, 0xe2, 0xce, 0x82, 0x2c, 0x4d, 0x42, 0x47, 0xba, 0x48, 0x9a, 0xa2, 0xc6, 0x17, 0x9e, 0x87, 0x7d, 0xf9, 0x1a, 0xe6, 0x25, 0xf5, 0x90, 0x8b, 0x68, 0xd6, 0x2a, 0x43, 0xef, 0x75, 0xf2, 0x40, 0x33, 0x36, 0x45, 0xbe, 0x90, 0xd5, 0x85, 0xe7, 0x9c, 0x63, 0x0f, 0xf4, 0xb6, 0x8b, 0x6d, 0x96, 0xe2, 0x1a, 0xcc, 0x94, 0xd4, 0xbf, 0xb0, 0xb5, 0x4a, 0x0e, 0xe6, 0xe0, 0x9f, 0xcb, 0xbb, 0x82, 0x9d, 0x66, 0x6b, 0x30, 0x94, 0xc2, 0xdc, 0x8e, 0xa8, 0x3a, 0x8c, 0x6f, 0x6f, 0xe6, 0xc8, 0x3d, 0xbc, 0x1a, 0x20, 0x9c, 0xb5, 0x30, 0x17, 0x4a, 0x2c, 0x88, 0x1f, 0x49, 0x2c, 0xcc, 0xc4, 0x41, 0xd1, 0x79, 0x27, 0x20, 0x5d, 0x9b, 0xae, 0x03, 0x89, 0xd8, 0xfa, 0x59, 0x19, 0xaf, 0x19, 0x45, 0xb3, 0x02, 0xfd, 0x45, 0xf1, 0xd2, 0x2d, 0x12, 0xb5, 0x4b, 0xbb, 0xc7, 0xbd, 0x00, 0x76, 0x44, 0x77, 0x77, 0x60, 0xd5, 0x16, 0xe8, 0x63, 0x0f, 0xe5, 0x42, 0x3f, 0xfb, 0xdb, 0x6f, 0xc7, 0x77, 0x70, 0xd9, 0x4d, 0xd8, 0xb0, 0x2d, 0x5b, 0xd4, 0x8e, 0x5f, 0xa4, 0xa0, 0x7a, 0xee, 0x39, 0x55, 0x36, 0x69, 0x00, 0x98, 0xe5, 0x32, 0x63, 0x7a, 0x65, 0x82, 0x45, 0x9d, 0xde, 0xad, 0x3a, 0x99, 0x9b, 0xa7, 0xf7, 0x9d, 0x19, 0xc7, 0x07, 0x5a, 0x5e, 0xcc, 0xc0, 0x1c, 0x8c, 0x1e, 0x76, 0x3a, 0xb6, 0x56, 0xee, 0xb1, 0xf2, 0xff, 0x15, 0x0c, 0xb0, 0x9e, 0xf2, 0x87, 0x4a, 0xf1, 0xda, 0x73, 0xdc, 0x75, 0xe3, 0xdc, 0x55, 0x2a, 0x9b, 0x6a, 0xce, 0x9a, 0xf9, 0x85, 0x1b, 0x18, 0x93, 0xbc, 0xa0, 0x46, 0x12, 0x68, 0x66, 0xda, 0xe3, 0x8c, 0x6f, 0xa1, 0x30, 0x00, 0x46, 0xc4, 0x0f, 0xcf, 0xd9, 0x4a, 0xf9, 0xdd, 0x8b, 0xde, 0x7d, 0xcd, 0x86, 0xd2, 0x35, 0x21, 0x4e, 0x65, 0xfa, 0xa3, 0x9c, 0x41, 0x54, 0x04, 0x69, 0x48, 0x34, 0xc4, 0x49, 0x90, 0xe6, 0x51, 0xfa, 0xac, 0x41, 0x73, 0x3d, 0x2e, 0x21, 0xe7, 0xe4, 0x69, 0x17, 0x4b, 0x2d, 0x7c, 0x5e, 0x3a, 0x4e, 0x8c, 0x11, 0xb7, 0x51, 0x50, 0x9c, 0xcf, 0x22, 0xd3, 0x71, 0x7a, 0xe7, 0x75, 0xfc, 0xc3, 0x8f, 0x33, 0xd8, 0x28, 0xae, 0x29, 0x43, 0x44, 0x88, 0x55, 0xcf, 0xab, 0x6b, 0x9e, 0x5b, 0x16, 0x43, 0x15, 0x42, 0xc0, 0x68, 0x7a, 0xd2, 0x0f, 0xba, 0x02, 0x00, 0x77, 0xf0, 0x57, 0x59, 0x9c, 0x2d, 0xe1, 0x3c, 0xb6, 0xd4, 0x44, 0x47, 0x3a, 0x9e, 0x2a, 0x0f, 0xb7, 0xea, 0x42, 0x14, 0xfd, 0x54, 0x89, 0xf4, 0x85, 0x88, 0xc8, 0xde, 0x0d, 0x59, 0x5d, 0x4a, 0x83, 0x0d, 0x3f, 0xe7, 0x24, 0xfb, 0x3d, 0xd5, 0xe5, 0x59, 0x86, 0x15, 0x12, 0x4f, 0x6e, 0x3e, 0x35, 0x4f, 0x6f, 0x71, 0x39, 0xa9, 0x6e, 0x8e, 0xcf, 0x5a, 0x40, 0xa8, 0x11, 0x25, 0x6d, 0xb7, 0x65, 0xe6, 0x34, 0x8d, 0xa5, 0x22, 0xcf, 0x0c, 0x7d, 0xe2, 0xf8, 0x95, 0x14, 0xc2, 0xab, 0xc3, 0xee, 0x45, 0x2e, 0x5a, 0x11, 0x6b, 0x4f, 0x7a, 0x66, 0x86, 0xed, 0x19, 0x63, 0x49, 0xb9, 0xb0, 0xe7, 0x22, 0x3e, 0x33, 0x65, 0xca, 0x1f, 0x47, 0x45, 0x1a, 0xa0, 0xb0, 0x87, 0x20, 0x68, 0x08, 0xaa, 0x72, 0x86, 0xb7, 0xcc, 0xc2, 0xb1, 0x1f, 0x12, 0xb3, 0xd4, 0x17, 0x4a, 0xeb, 0xca, 0x9b, 0xcf, 0x69, 0x65, 0xc1, 0xad, 0x19, 0xb6, 0xef, 0x06, 0xa6, 0x88, 0x4c, 0xb5, 0x90, 0x2e, 0x74, 0x30, 0x7e, 0x7f, 0x70, 0xb3, 0xd5, 0x1e, 0xe5, 0x9b, 0x89, 0xff, 0x8b, 0x10, 0x34, 0x26, 0xe1, 0xe6, 0x65, 0xb2, 0x20, 0xc5, 0x3a, 0x1b, 0x6d, 0x88, 0x31, 0xb8, 0x52, 0xe4, 0x3b, 0x84, 0x6f, 0x4a, 0x12, 0x21, 0x6d, 0x0e, 0xcd, 0x1d, 0x34, 0xc8, 0xb2, 0x75, 0x5e, 0xfb, 0x4b, 0x57, 0xeb, 0xf4, 0xbc, 0x2c, 0x36, 0xf5, 0x53, 0xd6, 0x27, 0x93, 0x61, 0x36, 0xab, 0x5d, 0x48, 0xf2, 0x61, 0xbe, 0xd6, 0x75, 0x97, 0x25, 0xd1, 0x37, 0x74, 0x62, 0xd3, 0x3e, 0x76, 0x54, 0x58, 0xe5, 0x20, 0xc1, 0x16, 0xdc, 0xec, 0x85, 0x8d, 0x70, 0x87, 0xef, 0xde, 0x0c, 0x3d, 0x68, 0xe0, 0x00, 0xb2, 0x55, 0x71, 0x82, 0xd4, 0x3f, 0x0a, 0xf2, 0x0d, 0x31, 0x97, 0x63, 0xbd, 0x62, 0x85, 0x56, 0xe7, 0x14, 0x1c, 0xc8, 0x2b, 0xbc, 0x0f, 0x70, 0xf4, 0x63, 0x51, 0x42, 0xf2, 0x4c, 0x2b, 0x37, 0xcb, 0xd7, 0x8c, 0x50, 0x0d, 0xa5, 0xa0, 0xd9, 0x68, 0xfd, 0xa3, 0xeb, 0x1a, 0x6f, 0xf8, 0x34, 0xaa, 0xb7, 0x75, 0xfa, 0xd9, 0xe4, 0x02, 0x5e, 0xd6, 0xb9, 0x62, 0xde, 0xb1, 0x53, 0x50, 0x1e, 0x12, 0x0c, 0xce, 0xe8, 0x2b, 0xa0, 0xba, 0x71, 0xeb, 0x8e, 0xa2, 0xde, 0x74, 0xc1, 0xd9, 0x06, 0xd0, 0x70, 0xca, 0x7a, 0xdf, 0x43, 0x8d, 0xc3, 0x94, 0xb7, 0xb8, 0xea, 0x61, 0xc3, 0x78, 0x3e, 0xf0, 0xbc, 0xe0, 0x51, 0x14, 0x76, 0x80, 0x44, 0xff, 0xac, 0x3a, 0x44, 0xb5, 0xa1, 0x51, 0x55, 0xc1, 0x08, 0xc3, 0x4e, 0x26, 0x21, 0xd9, 0x25, 0x98, 0x26, 0xfc, 0x6d, 0xec, 0xe5, 0xca, 0x1d, 0xce, 0xae, 0x69, 0x93, 0xb2, 0x6f, 0x1b, 0xd9, 0x0d, 0x1e, 0x13, 0x26, 0xc4, 0x57, 0x88, 0xa8, 0xe4, 0x47, 0x07, 0x80, 0x95, 0xc8, 0x0d, 0x0f, 0x49, 0xcd, 0xd5, 0x70, 0x39, 0x01, 0x6f, 0x45, 0x12, 0xab, 0x12, 0xb7, 0xeb, 0xd5, 0xb3, 0xb8, 0x7b, 0xad, 0xd6, 0x8b, 0x89, 0x2b, 0xa5, 0x87, 0xa3, 0xf4, 0x3f, 0x18, 0x13, 0x7f, 0x52, 0x06, 0x0f, 0x76, 0xec, 0xfa, 0x30, 0x5f, 0x8e, 0x3e, 0x26, 0x7b, 0x83, 0xc4, 0xa9, 0xee, 0x6f, 0x6a, 0xb2, 0x21, 0x2b, 0x7c, 0xec, 0x65, 0xd0, 0x7a, 0x65, 0xd9, 0x12, 0x1c, 0x8a, 0x8d, 0xd0, 0x94, 0x52, 0xe7, 0xe8, 0x13, 0xb9, 0x46, 0x50, 0x8e, 0x70, 0xe6, 0x63, 0xc2, 0xd3, 0x04, 0x78, 0x76, 0x1b, 0x42, 0xb9, 0x00, 0xd5, 0x4c, 0x33, 0x0a, 0x93, 0xbc, 0x29, 0x96, 0xe1, 0x3b, 0xae, 0x40, 0x7a, 0xe9, 0x73, 0xc3, 0xbc, 0x00, 0xdd, 0xbf, 0x5a, 0xb4, 0x5a, 0xba, 0x51, 0x5d, 0xf6, 0x64, 0x1d, 0xd7, 0x29, 0x1f, 0x2c, 0x29, 0xf3, 0xbe, 0x93, 0x66, 0x2b, 0x8d, 0x00, 0xd1, 0x15, 0x92, 0xef, 0x44, 0x32, 0x13, 0x21, 0xd3, 0x5c, 0x59, 0x4a, 0xac, 0x12, 0xb3, 0x0b, 0x41, 0x10, 0xbd, 0x1f, 0xaa, 0x22, 0xe1, 0xd9, 0x44, 0x3b, 0x1f, 0xce, 0x9f, 0xc1, 0x0a, 0xcf, 0x97, 0x2c, 0x13, 0x1a, 0xc0, 0xcf, 0x0a, 0xd0, 0x08, 0xf5, 0xe2, 0xaa, 0x97, 0x30, 0xb5, 0xe8, 0xfa, 0xee, 0x07, 0x8b, 0x81, 0x4d, 0x4f, 0xc4, 0xe5, 0x31, 0xb4, 0xac, 0x2e, 0x93, 0x14, 0x35, 0xd4, 0x1c, 0x4a, 0x61, 0x25, 0xf2, 0xb1, 0xb2, 0xe6, 0xd2, 0xe4, 0xe1, 0x3d, 0x5f, 0xc8, 0xd3, 0xcf, 0xb9, 0xcd, 0xc8, 0x25, 0x52, 0x70, 0xd6, 0x54, 0xfd, 0x05, 0x96, 0xdd, 0x48, 0xb3, 0x1d, 0xd2, 0x0c, 0xc0, 0x2d, 0x3a, 0x42, 0x0e, 0xad, 0xb7, 0x18, 0xe6, 0x57, 0x66, 0x45, 0xf5, 0xb1, 0x07, 0x99, 0x94, 0x3e, 0x5e, 0xd8, 0x4d, 0xf5, 0xd8, 0xc8, 0x9a, 0xf2, 0x72, 0x89, 0xef, 0x6c, 0xd7, 0x25, 0xfb, 0xe7, 0xc8, 0x68, 0x2c, 0xaa, 0xc1, 0xf2, 0x71, 0x74, 0xda, 0x8a, 0x43, 0x6b, 0xeb, 0xb5, 0xe6, 0x55, 0xf3, 0x87, 0xec, 0x0a, 0xbb, 0xba, 0xfc, 0x29, 0xb6, 0xfd, 0xd1, 0x0b, 0x2c, 0x8e, 0x85, 0xf5, 0x97, 0x0b, 0x10, 0x92, 0x4e, 0x86, 0x0c, 0xa0, 0x60, 0xd7, 0xbb, 0xe9, 0xc3, 0x36, 0x4a, 0x75, 0xae, 0x09, 0x57, 0xfe, 0x43, 0xfa, 0xb2, 0xa4, 0x71, 0x4d, 0x60, 0xe2, 0x19, 0x70, 0xe6, 0xc1, 0x6f, 0xd4, 0xc4, 0x4b, 0xa4, 0xfc, 0x3f, 0x43, 0xc2, 0xd4, 0x63, 0x13, 0xd7, 0x43, 0x49, 0x06, 0x55, 0x03, 0x96, 0xb7, 0xb9, 0xb1, 0x44, 0xca, 0x6b, 0x20, 0xa5, 0xd9, 0xe5, 0xf3, 0xa4, 0xb1, 0x18, 0x6b, 0x4f, 0xbf, 0x0b, 0x7d, 0x92, 0xc5, 0xc6, 0x28, 0x45, 0xd1, 0x6e, 0x05, 0x6a, 0x70, 0xb1, 0x20, 0xaf, 0x1f, 0x65, 0x06, 0x3b, 0x02, 0x6b, 0x1f, 0xa6, 0xd9, 0xda, 0x3e, 0x49, 0x2f, 0x59, 0x77, 0xb9, 0xd4, 0xcd, 0x31, 0x8e, 0x8e, 0x35, 0x7b, 0x69, 0x0c, 0xd1, 0xa4, 0x35, 0x1b, 0x8a, 0x05, 0xac, 0x1d, 0x8e, 0x22, 0x1d, 0xb6, 0x3b, 0xf2, 0x6d, 0xc8, 0x3e, 0x7a, 0x5d, 0xa2, 0xfc, 0xa1, 0x0a, 0x74, 0x31, 0x3f, 0xba, 0x06, 0xd6, 0x77, 0xd5, 0xaa, 0x49, 0x47, 0x32, 0x70, 0xa8, 0x5d, 0x94, 0x98, 0x7d, 0x2c, 0x75, 0x4d, 0xa1, 0x40, 0x02, 0x90, 0x5a, 0xce, 0x66, 0x72, 0xc7, 0x90, 0x4b, 0x86, 0x7e, 0xcf, 0x9e, 0x96, 0x73, 0xc2, 0x93, 0x95, 0x1c, 0x16, 0xea, 0xd5, 0xd2, 0xce, 0x70, 0x7a, 0x7b, 0x4d, 0xc8, 0x2f, 0x66, 0xb1, 0x6b, 0x17, 0x76, 0x63, 0xee, 0x06, 0x83, 0xec, 0x84, 0xf2, 0xfd, 0x0b, 0xc3, 0xa4, 0xd2, 0x04, 0xab, 0xb3, 0x92, 0x3a, 0xe4, 0xb3, 0xd2, 0x00, 0x47, 0xaa, 0xce, 0xad, 0xa0, 0xc3, 0x52, 0xee, 0xb2, 0x47, 0xda, 0x61, 0x7c, 0xc8, 0xf8, 0x5f, 0xbb, 0xa0, 0xf6, 0x19, 0xb0, 0x9a, 0xbc, 0xe6, 0x23, 0xee, 0xf5, 0xdb, 0xa8, 0x73, 0x6e, 0x9d, 0x21, 0x10, 0xbe, 0x73, 0x84, 0x73, 0x2c, 0x9f, 0xdf, 0x06, 0xcd, 0xef, 0x99, 0x1f, 0xed, 0x8f, 0xfa, 0x78, 0xb0, 0x21, 0xed, 0xde, 0xf9, 0x0f, 0x05, 0x2d, 0x8b, 0x20, 0xbf, 0x7b, 0x6f, 0x4a, 0x07, 0x94, 0x95, 0xc8, 0xfd, 0xa7, 0xbe, 0x6c, 0xf8, 0x3e, 0x98, 0x35, 0xcb, 0x73, 0x2b, 0x24, 0x48, 0x61, 0x75, 0x4c, 0x03, 0xda, 0x51, 0x29, 0x59, 0x58, 0x9e, 0x32, 0xb0, 0x35, 0x9c, 0xb1, 0xff, 0x1e, 0x99, 0xd3, 0x92, 0xc5, 0xce, 0xfb, 0x07, 0xd6, 0x84, 0x5c, 0x9d, 0x2d, 0x7b, 0xc7, 0xae, 0x46, 0x8b, 0xc1, 0x79, 0xf4, 0x8c, 0xd9, 0x25, 0x56, 0x74, 0x39, 0x03, 0x07, 0xbf, 0x7a, 0x14, 0x96, 0x14, 0xbd, 0xcb, 0x36, 0x25, 0xf7, 0x13, 0xb6, 0xd7, 0x8c, 0x94, 0xb3, 0xa3, 0x20, 0x32, 0x0c, 0x3b, 0xa9, 0xd7, 0x96, 0x71, 0xc9, 0x73, 0x11, 0x55, 0x5c, 0x41, 0x5b, 0x9e, 0x4d, 0x4b, 0xe4, 0x4c, 0xad, 0x30, 0x62, 0x8b, 0x06, 0x25, 0xc6, 0xd9, 0xec, 0x3a, 0x6e, 0x6b, 0xd6, 0xdf, 0x9c, 0xcd, 0x2c, 0xa6, 0x27, 0xca, 0xa1, 0x4a, 0x70, 0x8b, 0xc3, 0xf1, 0x98, 0x03, 0xd0, 0xae, 0xf0, 0x8a, 0xcc, 0x4a, 0xb1, 0xc7, 0xd0, 0x44, 0xee, 0xd4, 0xa5, 0x16, 0xc6, 0x9d, 0x92, 0xba, 0xde, 0x89, 0x71, 0x6d, 0x0f, 0x5d, 0x08, 0xb3, 0x5b, 0x5d, 0x97, 0x9b, 0x26, 0xb4, 0xae, 0x44, 0xa2, 0x15, 0x41, 0xa0, 0x8c, 0xa3, 0xfe, 0x78, 0x16, 0x0e, 0xde, 0xb0, 0x24, 0xff, 0xfb, 0xcd, 0xba, 0xb7, 0xa1, 0xb4, 0xb5, 0xf3, 0xa7, 0xb4, 0xba, 0x12, 0x00, 0xc7, 0x6d, 0x79, 0x8d, 0x15, 0xe3, 0x37, 0x35, 0xba, 0x59, 0xe5, 0x38, 0xc9, 0x26, 0xd0, 0xc0, 0x91, 0xee, 0x5b, 0xba, 0x1f, 0x19, 0x9e, 0xe3, 0x04, 0x83, 0x53, 0x26, 0x58, 0x75, 0xf3, 0x25, 0xfe, 0xd5, 0x1c, 0x16, 0x2a, 0x99, 0x36, 0xd0, 0x21, 0x81, 0x56, 0x25, 0x40, 0x06, 0x62, 0x73, 0x40, 0x8e, 0x77, 0x76, 0xb8, 0xe1, 0x87, 0x60, 0xe3, 0xe0, 0x47, 0x2c, 0xa4, 0x75, 0x48, 0x2f, 0xc7, 0xc6, 0x63, 0xf0, 0x8a, 0xae, 0x5b, 0x39, 0x5c, 0x6d, 0xbe, 0x6e, 0xe4, 0x9e, 0x0c, 0x1e, 0x45, 0x6a, 0x1b, 0xd8, 0xa1, 0xfc, 0xba, 0x40, 0xdc, 0x34, 0x95, 0x61, 0xa2, 0xa0, 0x59, 0x45, 0xab, 0xa8, 0x18, 0xc3, 0x3d, 0x08, 0xee, 0x99, 0xf3, 0x84, 0xe5, 0xbb, 0xbe, 0xd6, 0x16, 0xea, 0x29, 0xec, 0x11, 0x87, 0xe1, 0x50, 0x7f, 0xaa, 0x74, 0xe8, 0x06, 0x6f, 0x59, 0xdf, 0x6d, 0x90, 0x31, 0xe3, 0x01, 0x39, 0x4c, 0x91, 0x37, 0x17, 0x6f, 0x2d, 0x92, 0xb3, 0xd4, 0x97, 0xc7, 0xfe, 0x73, 0x7a, 0x20, 0x2c, 0x80, 0xc7, 0x1e, 0xc6, 0x35, 0x62, 0x62, 0xfb, 0xd1, 0x1b, 0xcd, 0x38, 0xe1, 0xdf, 0xe7, 0xf8, 0xbe, 0x2f, 0x7d, 0xdc, 0x57, 0xd2, 0x8f, 0xfe, 0x30, 0xc7, 0x69, 0x83, 0xab, 0x7e, 0x0f, 0x6f, 0x87, 0x48, 0xde, 0xbd, 0xa6, 0x0b, 0x71, 0xb0, 0x13, 0x3a, 0xc2, 0x64, 0x43, 0x04, 0x91, 0xa8, 0x9b, 0xcc, 0x0a, 0x10, 0x33, 0xda, 0xa2, 0x45, 0xda, 0x50, 0x42, 0xa0, 0x5a, 0x5f, 0xa7, 0xf7, 0xfd, 0xba, 0x09, 0xb7, 0x4f, 0x4b, 0xfa, 0x33, 0x26, 0x26, 0x92, 0x3c, 0xe0, 0xbb, 0xc9, 0xf2, 0xec, 0x4f, 0x24, 0xd9, 0x8c, 0xad, 0x94, 0x30, 0xd8, 0x18, 0x9b, 0x7e, 0x07, 0x85, 0xb0, 0x6d, 0xea, 0x07, 0xe5, 0xdb, 0xb9, 0x8b, 0xc7, 0x2f, 0x12, 0xc5, 0x85, 0xe9, 0x3f, 0x6a, 0x55, 0x7e, 0xb8, 0xa0, 0x14, 0x62, 0xe8, 0xb3, 0x2c, 0x66, 0x34, 0x09, 0xbb, 0x44, 0x3a, 0x58, 0xf2, 0x78, 0x56, 0x16, 0xbb, 0x52, 0x6b, 0x31, 0x9e, 0x4a, 0xe0, 0x01, 0xe5, 0x93, 0xe8, 0x7b, 0xfe, 0xf3, 0x07, 0xa7, 0x22, 0xd1, 0xd2, 0x54, 0x34, 0x90, 0xf6, 0x0a, 0xec, 0x1b, 0x7b, 0x40, 0x34, 0xc1, 0x4a, 0xcf, 0xd2, 0x44, 0xed, 0xa7, 0x48, 0x2c, 0x97, 0xc0, 0xf8, 0x61, 0x64, 0x54, 0x8c, 0xf9, 0xe1, 0x4c, 0x95, 0x4f, 0xcf, 0xf8, 0x72, 0x55, 0x24, 0x02, 0x74, 0x2b, 0x53, 0xa5, 0x40, 0xf0, 0xcd, 0x1a, 0x74, 0xd8, 0xc8, 0x53, 0x8d, 0x7e, 0x3f, 0xec, 0x08, 0x7c, 0x3a, 0x5f, 0xc7, 0x3a, 0x4f, 0x77, 0xb7, 0x03, 0x69, 0x07, 0xb0, 0x5e, 0xc8, 0xdb, 0x9c, 0x9b, 0x49, 0xef, 0xdc, 0xac, 0xe8, 0xdf, 0xe7, 0x36, 0x83, 0x9f, 0x34, 0xe8, 0xe1, 0x6c, 0x5b, 0x0c, 0xf2, 0x02, 0x77, 0x5b, 0x58, 0x10, 0xce, 0x16, 0x27, 0xe9, 0xb4, 0x52, 0xe9, 0x7c, 0xac, 0x94, 0xe6, 0x86, 0xd1, 0x9d, 0xa2, 0x06, 0x74, 0x87, 0xa6, 0xf2, 0x07, 0x11, 0x83, 0x28, 0x39, 0x38, 0x15, 0xa7, 0x63, 0x07, 0x05, 0xff, 0x23, 0xaf, 0x91, 0x06, 0x46, 0xda, 0x90, 0xcd, 0xec, 0x3d, 0xb0, 0xd2, 0xe6, 0x6c, 0x03, 0x77, 0x63, 0xf3, 0xba, 0xb3, 0xcc, 0xa2, 0x30, 0x08, 0xec, 0x28, 0x2a, 0xb5, 0x54, 0xe4, 0x5d, 0x2c, 0xfe, 0xf7, 0x30, 0xc6, 0x30, 0x9e, 0xc4, 0xb6, 0xa3, 0xbf, 0x31, 0x3c, 0xe5, 0xc1, 0x13, 0x1b, 0xfc, 0xa1, 0x46, 0x4c, 0x4c, 0x42, 0xed, 0xf4, 0xbb, 0x05, 0xb9, 0x94, 0x12, 0x9a, 0x68, 0x7f, 0xa6, 0x16, 0x8b, 0x92, 0x39, 0x45, 0x8d, 0x1f, 0x1b, 0x41, 0xf1, 0x2a, 0x94, 0x43, 0xdb, 0xd8, 0x87, 0xba, 0xd2, 0x24, 0x4f, 0x9a, 0xc4, 0xd4, 0xed, 0xf7, 0x4a, 0xab, 0x65, 0xd2, 0x2e, 0xe1, 0x65, 0x33, 0x2b, 0xd0, 0x28, 0x78, 0xf3, 0xf0, 0x9a, 0xec, 0x77, 0x05, 0xbd, 0x9b, 0x62, 0x97, 0x4b, 0x65, 0xe6, 0xa3, 0x9d, 0x52, 0xbc, 0x90, 0xcb, 0x25, 0x66, 0x64, 0x15, 0x34, 0xb8, 0x38, 0x81, 0x76, 0x96, 0xea, 0xc6, 0xde, 0xff, 0x11, 0x69, 0xe7, 0x4b, 0x36, 0x26, 0x71, 0xb0, 0x41, 0x91, 0xcb, 0x0b, 0x31, 0xfd, 0x11, 0xdd, 0x10, 0x9d, 0xb8, 0x94, 0x26, 0xe9, 0x67, 0x0d, 0x6e, 0x43, 0x08, 0x56, 0x46, 0xdb, 0x20, 0xb8, 0x6a, 0xd0, 0x5b, 0xf5, 0x23, 0x98, 0x6c, 0xce, 0xbc, 0xa1, 0x13, 0xc8, 0x36, 0x38, 0x7f, 0x30, 0x3d, 0xab, 0xd7, 0x5d, 0x5a, 0xaa, 0x14, 0x35, 0x69, 0xf3, 0x11, 0xf3, 0x4e, 0x2f, 0xe5, 0x27, 0xe4, 0x16, 0x70, 0xfd, 0x36, 0xda, 0x34, 0xc3, 0xf2, 0xc3, 0x66, 0xa6, 0x1a, 0x16, 0x45, 0xbc, 0xfd, 0x3c, 0xab, 0x48, 0x66, 0x20, 0xe2, 0x39, 0x13, 0xd9, 0xb8, 0xf3, 0x68, 0x89, 0xd6, 0x52, 0x65, 0x85, 0x4d, 0xec, 0xd6, 0xb6, 0x72, 0x97, 0xc9, 0x3f, 0xec, 0x2c, 0x45, 0x5f, 0x0b, 0x8a, 0x39, 0x99, 0x5c, 0xdd, 0xb3, 0x13, 0x7a, 0x20, 0x52, 0x3d, 0x26, 0xe0, 0xfe, 0xb2, 0x9a, 0x43, 0xd6, 0x63, 0x1b, 0x4a, 0x6a, 0xf2, 0xce, 0x53, 0x2b, 0x5c, 0xcc, 0xe2, 0x20, 0xdb, 0x78, 0xa0, 0xda, 0x0b, 0x11, 0xa4, 0xa9, 0x4b, 0x83, 0xf2, 0x10, 0x66, 0x83, 0x41, 0x77, 0x73, 0xda, 0x02, 0x20, 0xf9, 0x01, 0x9d, 0x5c, 0x57, 0xef, 0xfe, 0xff, 0x63, 0x2f, 0x50, 0x11, 0x52, 0x35, 0x08, 0xc6, 0xd8, 0xf2, 0x26, 0xb0, 0x8f, 0xa6, 0xb7, 0x34, 0x9d, 0xf6, 0x9f, 0x3b, 0x92, 0x3e, 0x95, 0x29, 0x8f, 0x28, 0x6f, 0x13, 0xad, 0x7e, 0xa0, 0x2d, 0x9c, 0x3c, 0xff, 0x81, 0x8b, 0xea, 0xca, 0xe7, 0x48, 0x28, 0xea, 0x31, 0xa9, 0x8b, 0x78, 0xa6, 0x2a, 0xa7, 0x81, 0xb2, 0xd7, 0x6d, 0x06, 0xdb, 0x6d, 0xb8, 0x47, 0xf7, 0xbc, 0x22, 0x42, 0x9c, 0x4f, 0x1c, 0x76, 0xd9, 0x4f, 0x3e, 0xec, 0x23, 0xa5, 0xdb, 0x78, 0x92, 0x5f, 0xd9, 0x3d, 0x4e, 0x55, 0xbf, 0x6f, 0x44, 0x0c, 0x10, 0x5d, 0x1d, 0xda, 0xd8, 0xae, 0x70, 0x4b, 0x84, 0xea, 0x36, 0xc4, 0xf6, 0x3d, 0x7f, 0x66, 0xd9, 0x78, 0x64, 0x35, 0x32, 0x59, 0x3d, 0x7a, 0x38, 0x0c, 0x14, 0x66, 0x66, 0xf1, 0x59, 0xf7, 0xce, 0xa0, 0xd6, 0x20, 0xb0, 0x2b, 0xe6, 0x24, 0x4b, 0xa3, 0xe2, 0x43, 0xf3, 0xdd, 0xdd, 0x98, 0x64, 0x75, 0x91, 0x42, 0x56, 0x14, 0x98, 0xc2, 0x52, 0xef, 0xe0, 0xa4, 0xc3, 0x90, 0x59, 0x62, 0x50, 0xd9, 0xf0, 0x85, 0x69, 0x46, 0xc1, 0x0d, 0x20, 0x72, 0x88, 0x13, 0x3b, 0xdd, 0x59, 0xad, 0x87, 0xec, 0x92, 0x12, 0x6f, 0x31, 0x0d, 0xfe, 0xcc, 0xed, 0x9a, 0x58, 0xff, 0xd3, 0xac, 0x13, 0x3e, 0x0f, 0x52, 0x52, 0x2b, 0x87, 0x69, 0xcf, 0xab, 0x61, 0x11, 0x7d, 0xf5, 0xc5, 0x5d, 0x6c, 0xe9, 0xe4, 0x4f, 0xed, 0xa4, 0x39, 0x03, 0xf8, 0x51, 0x0e, 0x2a, 0xca, 0x41, 0x43, 0xba, 0xd2, 0x3f, 0x4b, 0xe4, 0xce, 0x1d, 0x77, 0x47, 0x32, 0x93, 0x77, 0x63, 0xc9, 0x4a, 0x1e, 0x50, 0x9e, 0x33, 0x65, 0xaf, 0x1d, 0x1d, 0xb3, 0xe2, 0x76, 0x87, 0x5b, 0x78, 0x42, 0xb2, 0x66, 0xeb, 0x69, 0xfb, 0x94, 0x8e, 0x43, 0x68, 0x9d, 0xc1, 0xfd, 0x81, 0xbc, 0x67, 0x3f, 0x61, 0x6e, 0x9a, 0x0b, 0x0c, 0x78, 0x9d, 0xe9, 0x03, 0x27, 0x11, 0x41, 0x16, 0xdb, 0x6c, 0x08, 0x7a, 0xc7, 0xa8, 0x9e, 0x1b, 0xf2, 0x38, 0xf7, 0x33, 0x81, 0x40, 0xfa, 0x1c, 0x39, 0x05, 0x26, 0x63, 0x40, 0xa3, 0x7b, 0x1d, 0x23, 0xfe, 0x98, 0x7e, 0x1d, 0xfa, 0x21, 0xa7, 0x97, 0xef, 0x63, 0xc0, 0xeb, 0x57, 0x3b, 0x47, 0x6d, 0xca, 0x33, 0xa7, 0xac, 0x2d, 0xef, 0x0d, 0xf5, 0x26, 0xc8, 0x77, 0x19, 0xd2, 0xb6, 0x0e, 0x70, 0xbb, 0x73, 0xb5, 0x1e, 0x04, 0xdd, 0xe2, 0x95, 0xe7, 0x9d, 0xac, 0x5c, 0x62, 0x06, 0x26, 0x0e, 0x2c, 0x3f, 0xec, 0xa5, 0xee, 0xa5, 0xfb, 0xf8, 0xb0, 0x6b, 0xc6, 0x83, 0x91, 0x83, 0x86, 0x67, 0xbc, 0xc2, 0xd1, 0xb1, 0x97, 0x3f, 0x6e, 0xdf, 0x3e, 0xfc, 0x68, 0xa1, 0x2f, 0xc8, 0x61, 0xdc, 0x47, 0x63, 0x29, 0xf4, 0xed, 0xe4, 0x8f, 0x4b, 0x8d, 0x58, 0x77, 0x05, 0x48, 0xac, 0x2d, 0x0f, 0xe9, 0xcd, 0xf9, 0x5f, 0x1b, 0x0d, 0xf4, 0x7d, 0xda, 0xc9, 0x19, 0x42, 0x28, 0x48, 0x9f, 0xdf, 0x01, 0xe7, 0x87, 0x22, 0x90, 0x73, 0x71, 0xf5, 0xa3, 0xd7, 0xb3, 0x28, 0x5d, 0xf7, 0xac, 0x70, 0x2a, 0xdb, 0x56, 0xaf, 0xf8, 0x10, 0x1b, 0x75, 0xa5, 0x4b, 0xea, 0xc7, 0xb3, 0x50, 0x89, 0x20, 0x43, 0x12, 0x2d, 0xb6, 0x41, 0x1c, 0x48, 0xfe, 0xdc, 0x2f, 0xa2, 0x72, 0x39, 0x2d, 0xab, 0x92, 0x68, 0x35, 0x10, 0x29, 0x97, 0x10, 0x8c, 0xd1, 0x85, 0xcc, 0x01, 0xb9, 0x3a, 0xa6, 0xc7, 0xa6, 0xf6, 0x2e, 0x43, 0x38, 0x67, 0xa5, 0xbc, 0x6f, 0x1e, 0xaa, 0x6b, 0x6d, 0x44, 0x16, 0xd1, 0x7e, 0x89, 0x24, 0x4e, 0x55, 0x5e, 0xd5, 0xee, 0x99, 0x64, 0x92, 0x86, 0xa0, 0x24, 0x13, 0x00, 0x7a, 0x00, 0x81, 0xf3, 0x31, 0x69, 0xd7, 0x77, 0x4f, 0x53, 0x8e, 0x37, 0xa1, 0xe6, 0x79, 0xc7, 0x3b, 0x77, 0xee, 0x38, 0xbc, 0xb6, 0x26, 0xea, 0xd3, 0x29, 0xe6, 0xa2, 0x02, 0xd9, 0x5f, 0xdc, 0xa2, 0x4b, 0x54, 0x63, 0x28, 0xb1, 0x7a, 0x1e, 0xa6, 0x62, 0x24, 0x2d, 0x95, 0x88, 0x1f, 0x35, 0xd1, 0x18, 0xdb, 0xf7, 0xe5, 0x08, 0xcc, 0x28, 0x89, 0xbc, 0x10, 0x7c, 0x69, 0xc1, 0x52, 0x05, 0x28, 0xbd, 0xee, 0xbb, 0xa5, 0xa6, 0x56, 0x5c, 0x7d, 0x33, 0xb4, 0x76, 0xd1, 0x90, 0xd1, 0xc1, 0x49, 0x56, 0x35, 0xb3, 0x58, 0xba, 0x90, 0x4f, 0xc2, 0x05, 0x58, 0x3e, 0x5c, 0x44, 0xb4, 0x20, 0x13, 0x40, 0x99, 0x24, 0x30, 0xb0, 0x32, 0xd6, 0xdb, 0xae, 0x86, 0x39, 0xdd, 0x68, 0x55, 0x16, 0xaa, 0x18, 0x42, 0x93, 0x9e, 0x36, 0x38, 0x07, 0x87, 0xeb, 0x06, 0x0d, 0x64, 0xca, 0x4c, 0xd8, 0x6c, 0xbb, 0x9b, 0xc6, 0x52, 0x37, 0xd8, 0x37, 0xc8, 0xbb, 0xe1, 0x9f, 0x42, 0x76, 0x73, 0xda, 0xfc, 0x45, 0x4c, 0xc0, 0x3e, 0xe2, 0x8c, 0xfa, 0xdf, 0x59, 0x61, 0x14, 0x08, 0xbb, 0xe3, 0xd2, 0x3a, 0x15, 0x3d, 0xc8, 0x92, 0xa3, 0x0e, 0x25, 0x4c, 0x42, 0x0f, 0xd0, 0x87, 0x24, 0xf5, 0xb6, 0x47, 0xc7, 0x99, 0x62, 0xc0, 0x28, 0x56, 0xce, 0xd2, 0x34, 0xb2, 0x78, 0xd0, 0x7f, 0x41, 0xb9, 0x85, 0x38, 0xc7, 0x52, 0x79, 0x5d, 0x9d, 0x48, 0x70, 0x2b, 0x56, 0xf3, 0x34, 0xd9, 0xa1, 0x51, 0x94, 0x85, 0x71, 0xa0, 0xad, 0x6f, 0x5c, 0x2b, 0x68, 0x65, 0x41, 0x64, 0x44, 0x7e, 0x2e, 0x33, 0x56, 0x0b, 0x81, 0x8e, 0x8e, 0xcb, 0x4d, 0x4a, 0x3b, 0x5e, 0xff, 0x30, 0xd1, 0xfc, 0x41, 0x54, 0xea, 0x67, 0x1e, 0xa2, 0x8c, 0x1e, 0x67, 0xba, 0xaa, 0xd4, 0x56, 0xfe, 0xed, 0x20, 0x72, 0xe8, 0xb4, 0x76, 0xb2, 0xa2, 0x59, 0x56, 0xe5, 0xd0, 0xb6, 0xc3, 0x51, 0xb0, 0xe7, 0xf7, 0x9b, 0x66, 0x52, 0x55, 0xe7, 0x91, 0xe5, 0x9f, 0x3f, 0x22, 0x9f, 0x69, 0x39, 0x6e, 0x52, 0xce, 0xd4, 0x82, 0xa7, 0x61, 0xa4, 0xb6, 0x62, 0x66, 0x2f, 0x85, 0xe7, 0x43, 0x96, 0x9b, 0xfd, 0x31, 0x78, 0x30, 0xd3, 0x37, 0x13, 0x95, 0x41, 0x59, 0xac, 0x0c, 0x4f, 0x0d, 0x31, 0xdd, 0xfb, 0xee, 0x1e, 0xa6, 0x37, 0xb4, 0x9d, 0xf3, 0x32, 0x64, 0xf1, 0x0e, 0xd8, 0xc4, 0x14, 0x19, 0x9c, 0x12, 0x9f, 0x59, 0x75, 0xf5, 0xeb, 0xd5, 0x26, 0xb4, 0x76, 0x20, 0xc3, 0xa6, 0x88, 0x73, 0x71, 0xea, 0x16, 0xfe, 0x6d, 0x57, 0xe6, 0x80, 0x50, 0xb6, 0xf4, 0x16, 0x91, 0x2f, 0x15, 0x50, 0x4b, 0x02, 0xda, 0x8a, 0x40, 0x78, 0xb7, 0x7a, 0x1f, 0x18, 0x64, 0x05, 0x02, 0x1d, 0x84, 0x57, 0x3b, 0x28, 0x85, 0x32, 0x50, 0x33, 0xc7, 0x86, 0x44, 0xc6, 0x00, 0x43, 0x18, 0x6d, 0xdf, 0x6b, 0x92, 0x69, 0xef, 0x6b, 0x3d, 0xa6, 0xbf, 0xab, 0xb1, 0xed, 0x40, 0x64, 0x14, 0x5b, 0x6e, 0xb2, 0xe1, 0x12, 0x32, 0xea, 0xe8, 0x2e, 0x87, 0x2d, 0x97, 0xfb, 0xdd, 0x3d, 0x77, 0x65, 0xba, 0x90, 0xf9, 0xaf, 0xa7, 0xa3, 0x73, 0x68, 0x4a, 0x91, 0x66, 0x9b, 0xd0, 0xe4, 0x02, 0x47, 0x8e, 0xab, 0xec, 0x0e, 0xe7, 0xcd, 0x3e, 0x31, 0x70, 0x9c, 0xd0, 0xbc, 0x52, 0xad, 0xb6, 0xfe, 0xf0, 0xe8, 0x09, 0x3c, 0xca, 0xdb, 0xeb, 0xa7, 0xa1, 0x53, 0xc5, 0x8a, 0xdd, 0x2e, 0xd3, 0xc8, 0x2b, 0x6b, 0xe3, 0x86, 0x6a, 0x83, 0x59, 0x25, 0xc8, 0xfc, 0x77, 0x73, 0x28, 0x3b, 0xdb, 0x22, 0xc8, 0x9a, 0x49, 0x79, 0x20, 0xba, 0xab, 0x49, 0x0d, 0x1b, 0x56, 0x23, 0x2e, 0xe9, 0x8f, 0xc8, 0x8e, 0x19, 0x4e, 0xe1, 0x84, 0xb5, 0x42, 0xf0, 0xd8, 0x74, 0x14, 0x87, 0x27, 0x8e, 0xf0, 0xb8, 0x89, 0xce, 0x42, 0xcc, 0x70, 0xe9, 0xbd, 0x37, 0xd4, 0x0e, 0xa2, 0xcc, 0x8d, 0xbe, 0x3f, 0x2e, 0x00, 0xde, 0xb6, 0x87, 0xfd, 0x0b, 0xff, 0x7c, 0xe8, 0x2d, 0x30, 0x60, 0x17, 0x4f, 0xfc, 0xa7, 0x7c, 0xae, 0x7a, 0x9e, 0x84, 0x0f, 0x28, 0x5a, 0x3e, 0x56, 0x30, 0xee, 0xc0, 0x55, 0xea, 0xe2, 0xc7, 0xe2, 0xa1, 0xe0, 0x9d, 0x2c, 0x9a, 0xaf, 0x40, 0x4f, 0x52, 0x66, 0xc0, 0x25, 0x08, 0xd9, 0xe9, 0x5f, 0x7b, 0x58, 0x22, 0xd5, 0xf5, 0x99, 0x95, 0x1b, 0x88, 0xf2, 0x90, 0x55, 0x98, 0xcb, 0x2b, 0x4c, 0x9a, 0x54, 0x2c, 0xc1, 0x1a, 0x73, 0x27, 0x01, 0x03, 0x01, 0xea, 0xb9, 0x1b, 0x35, 0x18, 0x0c, 0xcd, 0x60, 0x13, 0xe3, 0x2b, 0xdb, 0x1f, 0x84, 0x33, 0x3e, 0xc5, 0x67, 0x51, 0xd3, 0x76, 0x44, 0x26, 0x4b, 0x71, 0x71, 0x88, 0xaf, 0xe7, 0x6b, 0xca, 0x99, 0x5c, 0xb3, 0x3d, 0xa3, 0x50, 0xdb, 0xf6, 0x20, 0x1f, 0xe0, 0xd2, 0x0a, 0x26, 0xba, 0xb8, 0x3c, 0x27, 0x32, 0x1e, 0xe1, 0xee, 0xf4, 0xcf, 0x2d, 0x35, 0xe5, 0xeb, 0x4b, 0xc6, 0xb6, 0x2f, 0x96, 0xdf, 0xba, 0x76, 0x0b, 0xda, 0xf4, 0x80, 0xfe, 0x0d, 0x75, 0xf3, 0x0d, 0xf0, 0xe5, 0x9f, 0x53, 0x7d, 0x5f, 0x06, 0xde, 0xdd, 0x82, 0x1c, 0x62, 0x40, 0xc4, 0x4b, 0x2e, 0x0d, 0x0a, 0xba, 0x60, 0x3b, 0x76, 0xcf, 0x55, 0xfe, 0x80, 0xf3, 0x64, 0xa7, 0x49, 0x95, 0xcc, 0xc5, 0x2b, 0x71, 0xea, 0x91, 0x95, 0x12, 0xb0, 0x89, 0x16, 0x95, 0x52, 0x5a, 0xb7, 0xb1, 0x42, 0x03, 0x8e, 0xf4, 0x5f, 0x38, 0x90, 0x4f, 0x6a, 0x04, 0xa7, 0xd5, 0xb9, 0xb3, 0x05, 0xc0, 0x2f, 0xef, 0xb7, 0xb5, 0x6b, 0x29, 0x7d, 0x49, 0x40, 0x3b, 0xd9, 0xc3, 0x65, 0x4b, 0x66, 0x23, 0x6e, 0xf2, 0x6b, 0x64, 0xfb, 0x9d, 0xb0, 0xff, 0x30, 0x34, 0x90, 0xb0, 0x65, 0xfa, 0x50, 0x7c, 0x1e, 0xb5, 0xaf, 0xf3, 0x3d, 0x0e, 0xbe, 0xb3, 0x76, 0x3a, 0xf2, 0x2d, 0x04, 0xda, 0x78, 0xac, 0x9a, 0x20, 0xc8, 0x93, 0x9d, 0x34, 0x7d, 0xe5, 0x90, 0xd6, 0x64, 0x0b, 0xd0, 0x44, 0xd3, 0xd2, 0x81, 0x5e, 0x3c, 0xb4, 0xc8, 0x08, 0x01, 0x58, 0x3a, 0xd0, 0x8a, 0x5c, 0x95, 0xd1, 0x96, 0x51, 0xae, 0xd6, 0xce, 0x07, 0xab, 0xc3, 0xa0, 0x0b, 0x72, 0x31, 0x4a, 0x6f, 0x62, 0x59, 0x35, 0xc9, 0x40, 0x33, 0x85, 0x7e, 0x74, 0xdf, 0xee, 0x41, 0x75, 0x43, 0xc9, 0xd6, 0x82, 0xf6, 0x67, 0x1c, 0x93, 0x5c, 0xa5, 0x4a, 0x8f, 0x13, 0xc0, 0x79, 0xbf, 0x8e, 0x6b, 0x63, 0x83, 0x00, 0x1f, 0x6a, 0x43, 0x7c, 0xb3, 0xdc, 0xa9, 0x5a, 0x2c, 0x75, 0x0d, 0xdc, 0xd6, 0x25, 0x31, 0x12, 0x94, 0x14, 0x2f, 0xfa, 0x74, 0xe4, 0xaf, 0xec, 0x86, 0x36, 0x5d, 0x35, 0xef, 0x6f, 0x9b, 0x03, 0x39, 0xbc, 0x72, 0x81, 0xed, 0x53, 0xcf, 0x42, 0x64, 0xfc, 0xec, 0xe3, 0xda, 0xd0, 0x0c, 0xec, 0xc4, 0x41, 0x6b, 0xf8, 0x63, 0x5b, 0x75, 0x16, 0x9a, 0x4a, 0x36, 0x6e, 0xfd, 0x1b, 0x12, 0x28, 0x2a, 0xc7, 0xb6, 0x89, 0x5c, 0x6d, 0x4e, 0x5f, 0x3d, 0xdf, 0xf8, 0xa0, 0xfc, 0x60, 0x79, 0x4e, 0xa0, 0xac, 0x30, 0x9d, 0x9c, 0x39, 0x48, 0x58, 0xa3, 0xbd, 0x31, 0x81, 0xbd, 0xf0, 0x50, 0x38, 0x9b, 0x93, 0xf5, 0xdd, 0x27, 0xb1, 0x8e, 0x79, 0x60, 0x25, 0x1b, 0x5a, 0x65, 0x5c, 0xe2, 0xfe, 0xcf, 0x5c, 0x64, 0x33, 0x44, 0x05, 0x8f, 0x7b, 0x4a, 0x97, 0x35, 0xb5, 0x58, 0x75, 0xbd, 0xfa, 0x33, 0x29, 0x19, 0xc6, 0x78, 0xa7, 0xf8, 0x58, 0x74, 0xd6, 0x3c, 0x5b, 0x3c, 0x4c, 0xae, 0xc5, 0xfa, 0x59, 0xf0, 0x00, 0x86, 0x48, 0xb4, 0x48, 0x36, 0xe1, 0x2c, 0x54, 0xf6, 0x33, 0xc1, 0x38, 0x9b, 0x90, 0x08, 0x8a, 0x74, 0xd8, 0xf2, 0xc3, 0x22, 0xfb, 0x43, 0xe9, 0xaa, 0xb9, 0x45, 0x6b, 0xc9, 0xac, 0xbd, 0x4d, 0x88, 0x89, 0x1e, 0x84, 0x0f, 0xa3, 0xfd, 0xa4, 0xbe, 0xb0, 0xc5, 0xb8, 0x7a, 0xd0, 0xac, 0x71, 0x45, 0xcb, 0xe5, 0x84, 0x12, 0x9a, 0x17, 0x4d, 0xd7, 0x2a, 0x0f, 0xb8, 0xe3, 0x5c, 0xb2, 0x61, 0x72, 0x50, 0x35, 0xfa, 0x7f, 0xe3, 0x90, 0xee, 0xd9, 0x76, 0x2f, 0x43, 0x79, 0xf2, 0xeb, 0xc5, 0x13, 0x08, 0x3a, 0x61, 0xeb, 0xbe, 0xa2, 0xcf, 0xea, 0x27, 0x74, 0x74, 0xf1, 0x71, 0xb6, 0x86, 0x6d, 0x26, 0x61, 0x71, 0x2c, 0xab, 0xcd, 0x79, 0x6f, 0x0d, 0x69, 0xa1, 0x40, 0xfc, 0xaf, 0xcc, 0x05, 0x18, 0x57, 0x23, 0x56, 0x6c, 0xcb, 0xb6, 0x0c, 0x38, 0xdc, 0x66, 0x9a, 0xf4, 0xb3, 0x02, 0xa1, 0x91, 0x0a, 0xb0, 0xbe, 0x02, 0x9c, 0x8f, 0xa7, 0xfb, 0xd9, 0x9a, 0x76, 0xf9, 0xdf, 0xd0, 0x44, 0x82, 0xa6, 0x92, 0xfa, 0xae, 0x7a ],
+    const [ 0x10, 0x93, 0x17, 0x55, 0x6c, 0x21, 0xc9, 0x69, 0xed, 0xa6, 0x5a, 0x94, 0x17, 0x6d, 0x7a, 0x11, 0x46, 0x2c, 0x9a, 0xe1, 0x8a, 0x86, 0x5b, 0x6d, 0xb4, 0xd4, 0x46, 0x6e, 0xb1, 0x25, 0xbd, 0x0a, 0x17, 0x83, 0x31, 0x3f, 0xfe, 0x79, 0x96, 0x85, 0x11, 0xd2, 0x14, 0xaf, 0xe5, 0xa2, 0x00, 0x13, 0x89, 0x8b, 0x0a, 0xea, 0x5e, 0x39, 0xb8, 0xfa, 0x28, 0x2f, 0x13, 0x72, 0x66, 0xc6, 0xa0, 0x15, 0xdf, 0x72, 0x91, 0x9a, 0x7e, 0x48, 0x3d, 0x53, 0x5f, 0xbd, 0xce, 0x0e, 0x2a, 0xb1, 0x39, 0x39, 0xa0, 0xac, 0x74, 0x49, 0x73, 0x67, 0xe3, 0x5c, 0x5b, 0x8e, 0x13, 0x1c, 0x66, 0xc4, 0xaa, 0xe7, 0x90, 0xe8, 0x9e, 0x2e, 0x93, 0x96, 0xa6, 0x1b, 0x00, 0xf1, 0xee, 0x77, 0x8f, 0xa0, 0x0f, 0xca, 0xb3, 0x17, 0x3e, 0xc4, 0x72, 0x18, 0xc3, 0xdb, 0x74, 0x79, 0xae, 0x36, 0x5a, 0x27, 0xc5, 0xca, 0x51, 0x6b, 0xc0, 0xc3, 0xe6, 0x6c, 0xb9, 0x25, 0x1c, 0xf6, 0xde, 0xb3, 0xbb, 0x79, 0x69, 0x10, 0xec, 0x55, 0xd2, 0x24, 0x03, 0x54, 0x42, 0xc1, 0x9c, 0x78, 0x4c, 0x86, 0xe9, 0xf8, 0xd8, 0x04, 0x4a, 0x85, 0x5f, 0x20, 0x1e, 0xd1, 0x5e, 0xb8, 0xda, 0x52, 0x04, 0x8a, 0x58, 0x44, 0x2e, 0x51, 0x71, 0xed, 0x96, 0x30, 0xcd, 0x24, 0x47, 0x54, 0xfa, 0x14, 0x55, 0xd6, 0xbc, 0x3e, 0xca, 0xde, 0xa4, 0xbd, 0xe3, 0x0e, 0xe4, 0xce, 0x7d, 0x1e, 0x62, 0x8f, 0xca, 0xc3, 0x0b, 0x07, 0x48, 0xd6, 0x6a, 0x67, 0xf4, 0xb2, 0x79, 0x8f, 0xbb, 0xde, 0xb7, 0xd4, 0x31, 0xec, 0x7a, 0x01, 0x85, 0xa0, 0x87, 0x9b, 0xb5, 0x55, 0xe0, 0x6a, 0xfe, 0x9d, 0xdd, 0x34, 0x97, 0x28, 0x7e, 0xcc, 0x9e, 0xe7, 0x00, 0x4c, 0x53, 0x70, 0xae, 0x9e, 0x84, 0xa5, 0xfa, 0x41, 0x48, 0x90, 0xcc, 0x49, 0xf0, 0x92, 0x1a, 0xa8, 0x3b, 0xbd, 0xb9, 0xad, 0xc9, 0x7e, 0x73, 0xca, 0xd2, 0x7f, 0x59, 0x9a, 0x18, 0xcb, 0x5a, 0x22, 0x1a, 0x34, 0x15, 0x58, 0x8b, 0xf2, 0xec, 0xe1, 0x02, 0x8c, 0x5a, 0x1f, 0xf3, 0xfc, 0x86, 0x6b, 0xde, 0x0e, 0x18, 0x9f, 0xc6, 0x09, 0x4b, 0xd8, 0xe5, 0x91, 0x43, 0x7a, 0x9e, 0xcc, 0xa2, 0x74, 0xb3, 0xc4, 0x56, 0xc5, 0xb8, 0x0c, 0xb4, 0x3f, 0xc8, 0xa7, 0xcb, 0x8a, 0x76, 0x25, 0xf2, 0x6d, 0x06, 0x0f, 0xa4, 0x49, 0xde, 0x85, 0x8e, 0xe6, 0x37, 0x26, 0xe5, 0x72, 0x18, 0x30, 0xfd, 0xc7, 0x85, 0xe8, 0x18, 0xed, 0xf4, 0x3d, 0x7c, 0xe0, 0x00, 0xa8, 0xc8, 0x93, 0x61, 0x56, 0x87, 0x34, 0x1c, 0x89, 0x06, 0xb2, 0xf7, 0x3c, 0x63, 0x7d, 0x30, 0x06, 0xe7, 0x8d, 0x6e, 0x40, 0x95, 0xa5, 0xf8, 0x6a, 0x03, 0xd9, 0x25, 0xcb, 0x69, 0x4e, 0x14, 0x58, 0xf8, 0x41, 0x9c, 0xd7, 0x6d, 0x4a, 0x86, 0x44, 0xe5, 0xe2, 0xfa, 0x74, 0xf3, 0x24, 0x38, 0xf8, 0xf0, 0xd0, 0x89, 0x44, 0x92, 0x95, 0x74, 0x11, 0xc0, 0x90, 0x34, 0xff, 0xa5, 0x10, 0x6a, 0x7f, 0x04, 0x9c, 0x10, 0xf0, 0xcb, 0x37, 0xae, 0x08, 0xea, 0xe2, 0xd0, 0x76, 0x65, 0x63, 0xb7, 0xc5, 0xa8, 0x45, 0x4f, 0x84, 0x1c, 0x20, 0x61, 0xa4, 0xf7, 0x1a, 0x0a, 0x21, 0x58, 0xae, 0x6c, 0xe5, 0x93, 0xac, 0xa3, 0xe9, 0xc9, 0x81, 0xfa, 0x9d, 0xbd, 0xb9, 0x5f, 0x8a, 0xe2, 0xc2, 0x15, 0x35, 0xb9, 0xf3, 0xa9, 0x47, 0x59, 0xcc, 0x27, 0xec, 0x4f, 0x80, 0x8d, 0x79, 0xa9, 0xb0, 0x80, 0x51, 0x4e, 0x7a, 0x3e, 0x09, 0x91, 0xb2, 0xd4, 0xca, 0x05, 0x6f, 0x91, 0xf7, 0x92, 0xca, 0xba, 0x10, 0xc8, 0xe2, 0x7f, 0xd7, 0x74, 0x24, 0x2e, 0xb1, 0x71, 0xc9, 0xa7, 0x4e, 0xc1, 0x9f, 0x10, 0x8c, 0xdc, 0x0d, 0xca, 0x99, 0x48, 0x51, 0xa3, 0x58, 0x6a, 0x0d, 0x4d, 0x07, 0x9c, 0x02, 0x0f, 0x1e, 0x80, 0x1b, 0xba, 0x7a, 0x93, 0xad, 0xdf, 0xba, 0x05, 0xfd, 0x3f, 0xea, 0xc8, 0x03, 0x83, 0x5f, 0xe7, 0x6d, 0x2d, 0xe1, 0x19, 0xe7, 0xcf, 0x10, 0x96, 0x9a, 0x7a, 0x00, 0x29, 0xf2, 0x7a, 0x27, 0x86, 0xa5, 0x40, 0x79, 0xdf, 0xf1, 0xa0, 0xd1, 0xb2, 0x25, 0x3d, 0x93, 0xe5, 0x62, 0x41, 0x8f, 0x14, 0xa3, 0x51, 0x29, 0x2a, 0xfb, 0xc0, 0xb7, 0x2e, 0x1e, 0x02, 0x2b, 0x60, 0x23, 0x64, 0xf2, 0x85, 0x88, 0xfb, 0x1c, 0x7f, 0x77, 0xda, 0xbc, 0x20, 0x47, 0x88, 0x92, 0x40, 0x46, 0xb2, 0xe7, 0x0d, 0xb6, 0x1c, 0xb9, 0xa3, 0x15, 0xdd, 0x18, 0xdd, 0xa2, 0xcc, 0xd0, 0x6a, 0x1c, 0x36, 0x48, 0x23, 0xcd, 0xd2, 0xaa, 0x9b, 0xc7, 0xf6, 0x44, 0xf8, 0x6e, 0x0a, 0x2f, 0x02, 0x36, 0x3e, 0x2e, 0x7a, 0xae, 0x78, 0xd8, 0xad, 0xbe, 0x90, 0xfa, 0x49, 0x2c, 0xc0, 0x37, 0x6e, 0x65, 0x56, 0xf1, 0x08, 0x7b, 0xac, 0x6d, 0x5d, 0x6a, 0x5a, 0x31, 0xe2, 0x9f, 0xaa, 0xb1, 0x53, 0xbb, 0x4d, 0x2b, 0x02, 0x94, 0x4c, 0xd0, 0x70, 0x7c, 0x41, 0x24, 0x1a, 0xc7, 0xc6, 0xa7, 0x95, 0x87, 0x2e, 0xb5, 0xdd, 0x9a, 0x73, 0xab, 0xeb, 0xe7, 0x70, 0x4b, 0x85, 0xe4, 0x50, 0x62, 0x5a, 0x5c, 0x47, 0xa7, 0x4e, 0x6f, 0x80, 0xe7, 0x13, 0xda, 0x56, 0x5f, 0xf9, 0x78, 0xc6, 0x6a, 0x07, 0x09, 0x24, 0x5c, 0x4a, 0x33, 0x0e, 0xad, 0x6d, 0xc6, 0x9f, 0x5a, 0x8a, 0x44, 0xe4, 0x88, 0x40, 0xa1, 0x94, 0x6a, 0x06, 0x47, 0xfb, 0x66, 0xbe, 0x5d, 0x38, 0x73, 0x8e, 0x49, 0xa8, 0xc6, 0xeb, 0x73, 0xa2, 0xad, 0xf6, 0x4c, 0x65, 0xbb, 0x0c, 0x90, 0x4e, 0x25, 0x98, 0xc8, 0x4f, 0x6c, 0x2c, 0x12, 0x9c, 0x3c, 0xd1, 0x24, 0xa7, 0x95, 0x9b, 0x8f, 0x4f, 0x28, 0x80, 0x41, 0x54, 0x04, 0x69, 0x4e, 0x0f, 0x71, 0x8a, 0xf0, 0x60, 0x1c, 0xef, 0xcc, 0xe7, 0x75, 0x58, 0x76, 0x77, 0x56, 0x47, 0x38, 0xc7, 0xe5, 0x57, 0x0f, 0x6b, 0xbb, 0xcf, 0xf7, 0x03, 0x46, 0x77, 0x68, 0xb3, 0x6b, 0xab, 0x21, 0xd3, 0x70, 0xad, 0x24, 0xe7, 0x1a, 0x40, 0x02, 0xd1, 0x12, 0x72, 0x58, 0x45, 0x8d, 0xb9, 0x9a, 0x7e, 0x2c, 0x41, 0x0f, 0x2f, 0x21, 0x85, 0x1d, 0xbd, 0x94, 0x1d, 0xc7, 0xab, 0x45, 0xd6, 0x74, 0x56, 0x72, 0x08, 0xf2, 0xe2, 0xfb, 0x24, 0xba, 0x74, 0xc4, 0x8d, 0x76, 0xa1, 0x5b, 0xa9, 0xc0, 0x27, 0xdb, 0x37, 0x2d, 0xdb, 0x10, 0xe3, 0x8a, 0xe3, 0xdb, 0x17, 0x65, 0x25, 0xd8, 0x15, 0xd0, 0xff, 0x3f, 0x43, 0x61, 0x39, 0x08, 0xc5, 0x7d, 0x38, 0x53, 0x51, 0xd6, 0x74, 0x06, 0x3f, 0x33, 0x2c, 0xb8, 0xe0, 0x70, 0x58, 0xce, 0x11, 0xc5, 0xdf, 0xe3, 0x10, 0x4b, 0x0a, 0x6e, 0x8e, 0xbb, 0x38, 0x9e, 0x05, 0x79, 0xd4, 0x89, 0x4b, 0xd2, 0x85, 0x86, 0x68, 0x82, 0xa4, 0xd7, 0xa5, 0x7a, 0xf3, 0x8c, 0xe5, 0xe0, 0x8c, 0xa3, 0x38, 0x56, 0x17, 0x74, 0xae, 0x7f, 0x40, 0x4d, 0x69, 0xbf, 0x69, 0x59, 0xf6, 0x43, 0x9b, 0xc6, 0xde, 0x42, 0xc3, 0x26, 0x77, 0x82, 0x1b, 0x16, 0x00, 0x1d, 0xe6, 0x1e, 0xed, 0x85, 0x60, 0xd9, 0x80, 0xc6, 0xf5, 0x56, 0x99, 0x0b, 0xb1, 0xbd, 0xcf, 0x64, 0xf8, 0x36, 0xbf, 0xc6, 0x77, 0x06, 0xa4, 0x54, 0x5a, 0xfb, 0x29, 0xdc, 0xbf, 0x0b, 0x7b, 0xa5, 0x6b, 0x38, 0xa1, 0x68, 0xbc, 0xb7, 0x10, 0x9c, 0xdf, 0x50, 0x7a, 0xf6, 0x43, 0x08, 0xe8, 0x31, 0x4e, 0xfe, 0x08, 0x0b, 0x4e, 0x93, 0xc8, 0x90, 0xb2, 0xcd, 0x23, 0x9a, 0x7a, 0xfe, 0x3b, 0x99, 0xec, 0xa0, 0xa9, 0x90, 0x89, 0x84, 0x11, 0x60, 0x3f, 0x2c, 0xf9, 0x49, 0xe0, 0x75, 0xdb, 0xae, 0xd3, 0x78, 0x78, 0x18, 0x0a, 0xb3, 0x70, 0x7e, 0x33, 0x64, 0x10, 0xc4, 0x33, 0x36, 0x6b, 0x81, 0xd0, 0x1f, 0xac, 0x05, 0xad, 0x89, 0xaa, 0x9b, 0x7c, 0xb0, 0xbd, 0x0b, 0x6f, 0x4b, 0xd1, 0x63, 0xef, 0x6e, 0xb8, 0xf7, 0x91, 0xaf, 0xc5, 0xa7, 0x46, 0x88, 0x96, 0x60, 0xd2, 0xfc, 0x31, 0xe6, 0x7f, 0x7d, 0x53, 0xd0, 0x12, 0x0e, 0x04, 0xd4, 0xfe, 0xa5, 0x6f, 0x44, 0xd8, 0xd3, 0xf1, 0xd9, 0x0b, 0xa6, 0x70, 0xb0, 0xcd, 0xcf, 0xee, 0x92, 0x51, 0x00, 0x5d, 0x78, 0x3e, 0x98, 0xb5, 0x4e, 0x61, 0x82, 0x45, 0xf8, 0x9e, 0x5a, 0x46, 0x93, 0x2d, 0xd2, 0xb6, 0xfd, 0x03, 0x55, 0x64, 0x97, 0x8d, 0xea, 0x47, 0x49, 0xa4, 0x5a, 0x13, 0xc7, 0xbe, 0x95, 0x0e, 0x13, 0x61, 0x52, 0x20, 0x44, 0xde, 0xf6, 0x2a, 0x85, 0x3b, 0xb7, 0x99, 0x60, 0x71, 0x01, 0x3b, 0x3d, 0xd8, 0x18, 0x51, 0x25, 0xdf, 0x00, 0xe5, 0xcc, 0x00, 0x9a, 0x5e, 0xcf, 0xf3, 0x0f, 0x51, 0x3a, 0x22, 0x71, 0x9a, 0x4d, 0x5e, 0xa0, 0xac, 0x80, 0xd0, 0x6b, 0x25, 0xc4, 0x32, 0xf8, 0xa6, 0x0c, 0x3f, 0x66, 0xe1, 0x0c, 0x67, 0xb0, 0xf3, 0x40, 0xc8, 0xd5, 0xf5, 0x31, 0x5a, 0x36, 0xcd, 0xf4, 0x69, 0x3f, 0x4a, 0xf3, 0x49, 0x49, 0x71, 0xf0, 0x45, 0xbf, 0x11, 0x46, 0xd8, 0x80, 0x9e, 0x72, 0x20, 0x85, 0x3b, 0xd3, 0x8f, 0xc4, 0x19, 0xae, 0xe4, 0x54, 0x00, 0x75, 0x59, 0xd1, 0x2b, 0x49, 0x1e, 0x02, 0x59, 0xbd, 0x07, 0xb9, 0x21, 0xdd, 0x82, 0xfb, 0x86, 0x6f, 0xcb, 0x61, 0xcb, 0x78, 0x63, 0xbe, 0x89, 0x02, 0xbe, 0x02, 0xfe, 0x1d, 0x3b, 0x5f, 0xa8, 0x24, 0x5a, 0xaa, 0x12, 0x41, 0x2a, 0x03, 0xef, 0x33, 0x00, 0xb8, 0x65, 0x4f, 0x6e, 0x67, 0xab, 0xc5, 0x73, 0x63, 0xd6, 0x25, 0xf0, 0x59, 0xf0, 0x22, 0x5b, 0x34, 0x4b, 0x95, 0xb7, 0x3d, 0x14, 0xc5, 0xc4, 0x87, 0x2b, 0xe5, 0x73, 0x8a, 0x32, 0xde, 0x9c, 0x0e, 0xe5, 0x4f, 0xf3, 0x4b, 0xa9, 0xd2, 0x39, 0x4e, 0x67, 0x82, 0xaf, 0x9e, 0x9a, 0xba, 0xd0, 0x20, 0xa7, 0x1f, 0x3f, 0x38, 0x6e, 0xe0, 0xff, 0x31, 0x1e, 0x3c, 0xe2, 0xdf, 0x4d, 0x45, 0x44, 0x82, 0x48, 0xe4, 0xf8, 0xee, 0xa7, 0x1e, 0x83, 0xe9, 0x25, 0x95, 0x88, 0xd5, 0xaf, 0x52, 0x84, 0x8f, 0xbb, 0xc1, 0xbc, 0x96, 0xdb, 0xfd, 0x73, 0x70, 0x92, 0x4e, 0x5f, 0x49, 0x66, 0xf1, 0x5e, 0xde, 0x36, 0x17, 0x66, 0x99, 0xce, 0x2f, 0xba, 0xfd, 0xb9, 0x68, 0x64, 0x45, 0x56, 0x72, 0xdf, 0x48, 0x2f, 0x85, 0x14, 0xa0, 0x85, 0xa5, 0x88, 0x0b, 0x30, 0x24, 0xd3, 0x11, 0xa6, 0x68, 0x54, 0xe8, 0x59, 0xef, 0x23, 0x94, 0x46, 0x8f, 0x47, 0x52, 0xca, 0x03, 0x29, 0x37, 0xb8, 0xa3, 0x49, 0x15, 0xaa, 0x73, 0x30, 0x9e, 0x94, 0x5f, 0xa6, 0xcc, 0x9f, 0xc5, 0x24, 0x80, 0x34, 0x34, 0x8c, 0x69, 0x56, 0x74, 0x18, 0x27, 0x36, 0xc6, 0x90, 0xb0, 0x01, 0x6c, 0xc1, 0xf3, 0xfd, 0x6c, 0x2a, 0xbc, 0xd4, 0x92, 0xf8, 0xd8, 0x30, 0xb4, 0x35, 0x79, 0x87, 0x39, 0x3c, 0xdc, 0x39, 0xdc, 0x70, 0x28, 0xd8, 0xae, 0x2d, 0x9a, 0xc6, 0x5a, 0xff, 0xdf, 0x06, 0xad, 0x12, 0xc1, 0x4c, 0x56, 0xea, 0x06, 0x56, 0xea, 0x54, 0x95, 0x7f, 0x2b, 0x9d, 0xdb, 0x92, 0x89, 0x01, 0x6d, 0xdc, 0xe9, 0x66, 0xef, 0x85, 0xa6, 0x4b, 0x34, 0x20, 0xd5, 0xfb, 0xa6, 0x80, 0xce, 0x06, 0xe9, 0xcd, 0xe8, 0xf1, 0xbb, 0xd8, 0x83, 0x2d, 0x1f, 0xac, 0x4c, 0x46, 0xba, 0x66, 0xbc, 0x5d, 0x7d, 0x46, 0xe2, 0xd8, 0x84, 0x05, 0x63, 0x58, 0x3e, 0x69, 0xbf, 0xeb, 0xcf, 0x18, 0xd5, 0x84, 0xb2, 0xaa, 0xaa, 0xa8, 0xa3, 0x01, 0x66, 0x69, 0xbc, 0xdd, 0x9f, 0x98, 0xde, 0xab, 0xda, 0x37, 0x52, 0x9e, 0x4f, 0x2d, 0xb0, 0x01, 0xed, 0x3d, 0x00, 0xcc, 0x9e, 0x39, 0x20, 0x75, 0xcc, 0x73, 0x66, 0x08, 0x24, 0x75, 0x85, 0x7a, 0x9a, 0xf2, 0xb5, 0x3b, 0xad, 0xfc, 0x0e, 0x0a, 0xec, 0x76, 0x35, 0x0d, 0xb9, 0xcd, 0x3b, 0x21, 0x4d, 0xe3, 0xc2, 0x6f, 0xfc, 0x4c, 0x62, 0x40, 0xba, 0xbd, 0x4b, 0x12, 0xdf, 0xc1, 0x2b, 0xea, 0x27, 0xae, 0x52, 0xed, 0xfd, 0xd8, 0x14, 0x2a, 0xf9, 0x04, 0x6e, 0xbb, 0xa7, 0x20, 0xed, 0x0c, 0x8a, 0x31, 0xcc, 0x7a, 0x60, 0x8c, 0x5c, 0x20, 0xa8, 0x49, 0xa9, 0xed, 0x62, 0xf5, 0x5b, 0xfa, 0x16, 0x87, 0xda, 0x1b, 0x17, 0x95, 0xb6, 0xb5, 0x09, 0xc8, 0x45, 0xcf, 0xa1, 0x8e, 0x8e, 0x6b, 0xac, 0x0e, 0x65, 0x16, 0x53, 0x61, 0xd8, 0xbe, 0x9d, 0xff, 0xca, 0xc4, 0x35, 0x77, 0xde, 0x52, 0x6e, 0x64, 0x97, 0xef, 0x84, 0x9c, 0xbd, 0x50, 0x25, 0xaa, 0x02, 0x71, 0x2f, 0x7f, 0xe5, 0xe5, 0xbc, 0x64, 0xd7, 0x6b, 0x5c, 0x33, 0x9c, 0xc1, 0xa1, 0xc7, 0xf5, 0xbd, 0xe1, 0xb1, 0x7c, 0x99, 0x37, 0x2c, 0xcf, 0x8f, 0xcb, 0x54, 0xf0, 0xa5, 0x53, 0x92, 0xec, 0xcb, 0xda, 0x5b, 0xbb, 0x23, 0xc0, 0x1a, 0x68, 0xa0, 0x03, 0x6a, 0x72, 0xd2, 0xbc, 0x89, 0x71, 0x00, 0xed, 0x09, 0xfc, 0x78, 0x79, 0xc9, 0xcb, 0x23, 0x74, 0x24, 0x19, 0x5c, 0x9d, 0x68, 0x4c, 0x02, 0x29, 0x8a, 0xd8, 0xcc, 0xc3, 0x18, 0x61, 0xdd, 0xd0, 0x6e, 0x20, 0x99, 0xf7, 0x2d, 0x87, 0xb6, 0xe1, 0xe9, 0x28, 0x96, 0x3d, 0x22, 0xd3, 0xd4, 0x08, 0x76, 0xfe, 0x1d, 0x0b, 0x14, 0x6a, 0x41, 0xa5, 0x74, 0x04, 0x89, 0xca, 0x46, 0x0a, 0x4c, 0x4c, 0xa8, 0x6e, 0xbd, 0x59, 0x9b, 0x7f, 0x07, 0x46, 0xb8, 0xc6, 0x9c, 0x8a, 0x1f, 0x2e, 0xc9, 0x0e, 0xb1, 0x69, 0x8f, 0xa4, 0x7f, 0x8e, 0xae, 0xd4, 0x81, 0x07, 0x02, 0xdf, 0x8c, 0xaa, 0x12, 0xfe, 0x7e, 0x26, 0xe7, 0xeb, 0xbc, 0xa1, 0x1a, 0xa2, 0xde, 0x9f, 0x31, 0x69, 0xa8, 0x26, 0x2c, 0x0e, 0x3c, 0x20, 0x5a, 0x70, 0x8f, 0x00, 0x71, 0x40, 0x1a, 0xa8, 0xde, 0x09, 0xd2, 0x8a, 0x5a, 0x6e, 0x59, 0x0e, 0xbe, 0xb4, 0x76, 0x34, 0x18, 0x80, 0xc3, 0x7b, 0xfe, 0xe1, 0xa5, 0x01, 0x22, 0x90, 0x81, 0xeb, 0x27, 0x77, 0x2d, 0x07, 0xb3, 0x71, 0xa5, 0xb0, 0xc6, 0x51, 0x00, 0xf3, 0x4a, 0x25, 0xa2, 0xf0, 0xeb, 0xbc, 0xb2, 0x82, 0x28, 0x65, 0xcf, 0x22, 0xaa, 0xfa, 0xfe, 0x08, 0xd5, 0x1d, 0xe7, 0x94, 0x9e, 0xc2, 0x42, 0xed, 0x9c, 0xee, 0x8c, 0xe8, 0x61, 0xbd, 0xfe, 0x2b, 0x0a, 0xaa, 0xbf, 0x92, 0x15, 0x0b, 0x59, 0xd1, 0x73, 0xdb, 0x6a, 0x5b, 0xde, 0xbc, 0x9c, 0x83, 0x6d, 0x3c, 0xd6, 0xe1, 0x66, 0x58, 0xb4, 0xf8, 0x53, 0x3f, 0x35, 0x15, 0x58, 0x58, 0xb4, 0x7a, 0xc3, 0x85, 0x1a, 0xbc, 0xe5, 0xaa, 0x51, 0x6a, 0x21, 0x69, 0xfc, 0xef, 0x42, 0x30, 0x65, 0xba, 0x11, 0x76, 0xb6, 0x9c, 0x28, 0x41, 0x6d, 0x71, 0x01, 0xec, 0x0a, 0x02, 0x52, 0x27, 0x0a, 0x2a, 0x9d, 0x3f, 0x19, 0x38, 0x02, 0xa0, 0x84, 0x95, 0x59, 0x98, 0xed, 0xa7, 0x7d, 0x5d, 0x42, 0xf4, 0xea, 0x52, 0xf0, 0x8b, 0x8b, 0x86, 0x53, 0xa0, 0xcd, 0x7d, 0x71, 0x76, 0xf8, 0x34, 0xe9, 0x82, 0xbf, 0x5f, 0x26, 0xcd, 0x16, 0xf5, 0xd8, 0x9a, 0x43, 0xee, 0xa5, 0x49, 0x38, 0x4c, 0x1b, 0x7b, 0x20, 0x58, 0xea, 0x77, 0x38, 0x2e, 0x50, 0xcc, 0xe0, 0x7b, 0xd4, 0x38, 0xf2, 0x86, 0x37, 0xc9, 0x52, 0x6d, 0xa8, 0x42, 0xc6, 0xb1, 0x37, 0xc0, 0x08, 0xf5, 0x8c, 0x9d, 0x1a, 0x03, 0xd9, 0x95, 0xda, 0x10, 0x0d, 0x27, 0xd6, 0x41, 0x4b, 0x3e, 0x61, 0x6e, 0x9a, 0x11, 0xe7, 0x25, 0xde, 0x48, 0x7d, 0xf2, 0x07, 0x60, 0xbc, 0xdd, 0x88, 0x50, 0xd0, 0x35, 0x0a, 0x6d, 0xcc, 0x8c, 0x62, 0x8b, 0x40, 0x03, 0xc1, 0x65, 0x0e, 0xc8, 0x2b, 0x3f, 0x79, 0xdc, 0x2b, 0xc9, 0x7f, 0x1a, 0xc4, 0x47, 0x69, 0x75, 0xaa, 0xef, 0xa0, 0x81, 0xb3, 0x92, 0xc2, 0x35, 0x88, 0x7f, 0xf5, 0xef, 0xa0, 0xa5, 0x7c, 0xb8, 0x6f, 0xf7, 0x88, 0xc9, 0xda, 0x15, 0x50, 0x4f, 0xef, 0x28, 0x63, 0x6c, 0xd3, 0x0d, 0x3d, 0x7e, 0xfb, 0xb7, 0x19, 0xa3, 0x9f, 0xce, 0x07, 0x7d, 0x6c, 0x9c, 0x3e, 0x32, 0x7a, 0x2a, 0xb3, 0xb7, 0x7d, 0xa6, 0xeb, 0x4f, 0x3f, 0x08, 0x0d, 0x4e, 0x4e, 0xf6, 0x3b, 0x23, 0xf1, 0xe4, 0x22, 0x95, 0x61, 0x7f, 0xd0, 0x4d, 0x36, 0x4c, 0xc6, 0x95, 0x20, 0x8c, 0x4f, 0x5f, 0xd7, 0x64, 0x10, 0x89, 0x55, 0x3a, 0xdf, 0x5f, 0x42, 0x62, 0xd9, 0x62, 0xb0, 0xfa, 0xae, 0x48, 0x08, 0x12, 0x40, 0x43, 0x44, 0x11, 0x6d, 0x86, 0x5f, 0x53, 0x28, 0x06, 0x0a, 0x17, 0xcf, 0x7d, 0xa1, 0x99, 0xb8, 0xb5, 0x5d, 0x7b, 0x0e, 0x03, 0xcb, 0x69, 0xdb, 0x11, 0x7d, 0xfd, 0x65, 0xe1, 0xff, 0xe0, 0xbe, 0x0f, 0x0c, 0x33, 0x97, 0x57, 0x02, 0x2d, 0x55, 0x56, 0x94, 0x05, 0x67, 0x95, 0xbf, 0x12, 0xd6, 0xc3, 0xff, 0x31, 0x1d, 0x42, 0xc2, 0x67, 0x3c, 0xe6, 0x1d, 0xc7, 0x08, 0xf9, 0xbe, 0x96, 0xc5, 0x82, 0x22, 0xae, 0xf6, 0xc6, 0x08, 0x20, 0x74, 0x10, 0x25, 0x1d, 0xbe, 0xae, 0x19, 0x17, 0x90, 0x3c, 0xa2, 0x23, 0xb7, 0x25, 0x0f, 0xa2, 0x23, 0x66, 0xf8, 0x20, 0x3e, 0x95, 0x2d, 0x7c, 0x7c, 0x22, 0xec, 0x49, 0x33, 0xde, 0x57, 0x75, 0xae, 0xb9, 0x24, 0x28, 0x7d, 0xd0, 0x97, 0xef, 0x0e, 0xa7, 0xad, 0x1a, 0x82, 0xb2, 0x9b, 0x63, 0xb9, 0x1b, 0x76, 0xd0, 0xaf, 0xbf, 0x34, 0xda, 0x0c, 0x7a, 0xd3, 0xce, 0xf6, 0xa4, 0xd8, 0x74, 0x2a, 0xdb, 0xfb, 0xef, 0x4b, 0x03, 0x21, 0xe4, 0x79, 0x8c, 0x8a, 0xde, 0x26, 0xf3, 0x4c, 0xf1, 0x25, 0x8c, 0x00, 0x9e, 0x04, 0x7e, 0xbb, 0xf7, 0x9c, 0x0f, 0x40, 0x03, 0xe6, 0x22, 0x73, 0x64, 0x11, 0xfd, 0x11, 0x37, 0xd1, 0x50, 0x9f, 0x3c, 0xf9, 0x73, 0xa0, 0x37, 0x4c, 0xf0, 0x0b, 0x96, 0x90, 0x41, 0xfc, 0x53, 0xe5, 0xdb, 0xaa, 0x1c, 0x55, 0x6b, 0x99, 0xb2, 0xac, 0x5f, 0x11, 0x8f, 0x8a, 0xa8, 0xce, 0xcb, 0xb6, 0xbe, 0xf9, 0x40, 0xb5, 0xe5, 0x57, 0xed, 0x9c, 0xb0, 0xc1, 0x98, 0x22, 0xc3, 0xd4, 0xb7, 0xf9, 0xdc, 0xe9, 0x91, 0x5f, 0x15, 0x47, 0xa1, 0xf0, 0x63, 0x98, 0x3b, 0xbe, 0x63, 0x9a, 0x72, 0xa3, 0x56, 0x17, 0x38, 0xd6, 0x69, 0x17, 0xc7, 0xbd, 0x3b, 0x54, 0x40, 0x02, 0x99, 0xee, 0x92, 0xe9, 0x8c, 0x60, 0x9e, 0xe1, 0x95, 0xb3, 0x99, 0x59, 0x37, 0xf2, 0xb1, 0xd4, 0xb6, 0xdd, 0xf3, 0x40, 0x1f, 0xe1, 0x6c, 0x83, 0x88, 0x48, 0x8e, 0x58, 0x99, 0xae, 0xd6, 0x59, 0x4b, 0xb4, 0xac, 0x5c, 0xf0, 0xf8, 0x8b, 0x03, 0x74, 0x44, 0x61, 0x8f, 0xe2, 0x05, 0x39, 0xf5, 0x29, 0xff, 0x17, 0x34, 0x21, 0x40, 0x23, 0xe5, 0xc9, 0x52, 0x0a, 0x14, 0xd3, 0xb5, 0xa2, 0x4e, 0x62, 0x8c, 0xcd, 0xfb, 0x12, 0x97, 0x9f, 0xef, 0x39, 0x61, 0xc3, 0x3b, 0x6c, 0xbb, 0x1a, 0x49, 0x45, 0x68, 0xa6, 0x28, 0x64, 0x1a, 0xa7, 0x24, 0xb4, 0x9e, 0x03, 0x9a, 0xef, 0x53, 0xeb, 0x0a, 0x65, 0xe0, 0xbc, 0x6e, 0xf9, 0x26, 0x23, 0xca, 0x6c, 0x74, 0x85, 0x05, 0xde, 0xfa, 0x9e, 0xf7, 0x91, 0x81, 0x68, 0xc3, 0xf1, 0x59, 0x3e, 0x67, 0xd1, 0x92, 0x41, 0x91, 0xf8, 0x6f, 0xfb, 0xb5, 0xdc, 0x17, 0x42, 0x5c, 0xad, 0x8e, 0x5f, 0xbf, 0x95, 0xe4, 0x70, 0x94, 0x3f, 0xac, 0x0b, 0x28, 0x96, 0xb0, 0x24, 0xae, 0xcf, 0xe3, 0x31, 0xd6, 0xa9, 0x97, 0x8b, 0xa2, 0xf3, 0xf0, 0x18, 0x76, 0x4f, 0x99, 0x27, 0x6e, 0x37, 0xb5, 0x9b, 0xf3, 0x3d, 0x19, 0x4c, 0x91, 0x97, 0xb8, 0xaa, 0x03, 0xda, 0x5e, 0xa4, 0x90, 0x06, 0xa2, 0xc8, 0x9b, 0xc3, 0x16, 0xab, 0x75, 0xea, 0xc0, 0x8b, 0x75, 0x47, 0xce, 0x33, 0x4b, 0x9e, 0x85, 0x1f, 0x91, 0xeb, 0x7b, 0xe1, 0xa3, 0xee, 0x06, 0xc3, 0xb1, 0xe7, 0xf4, 0xae, 0x12, 0x9f, 0x7c, 0x4a, 0xdb, 0xa7, 0x75, 0x67, 0xb1, 0xe4, 0xc6, 0x9c, 0xdb, 0x4c, 0x1e, 0x2d, 0x9b, 0xea, 0xe5, 0x32, 0xbf, 0x28, 0x72, 0xf6, 0x73, 0x4d, 0x7e, 0x9e, 0x59, 0x45, 0xd8, 0x0b, 0xdc, 0xa1, 0x5b, 0x01, 0xc1, 0xde, 0x1e, 0x88, 0xfe, 0xea, 0xea, 0x92, 0xd0, 0xe4, 0xf1, 0xdf, 0x08, 0x23, 0xbc, 0x1e, 0xa5, 0x7b, 0x66, 0x55, 0xa8, 0xbb, 0x08, 0x82, 0x24, 0x7a, 0x74, 0x83, 0x95, 0x14, 0x26, 0x33, 0x72, 0xef, 0x77, 0xd6, 0x06, 0x03, 0x14, 0xb7, 0x7b, 0x99, 0xaf, 0x0f, 0x38, 0x52, 0xf4, 0x29, 0x6d, 0x6c, 0xbf, 0xc4, 0xeb, 0x41, 0x8c, 0xb9, 0x3a, 0x10, 0x2f, 0xdd, 0xe5, 0x00, 0xc5, 0x29, 0x19, 0x62, 0xea, 0x18, 0x6e, 0x37, 0x2c, 0x51, 0x05, 0xf2, 0xc0, 0x86, 0xd3, 0x7f, 0x74, 0x9c, 0x3c, 0x83, 0xe5, 0x0c, 0xe4, 0xe6, 0xf2, 0x89, 0xc2, 0x8f, 0x70, 0xe3, 0x76, 0x6e, 0x1f, 0x2b, 0xdc, 0xc0, 0xdd, 0x18, 0xe1, 0x8e, 0x1a, 0xa9, 0x95, 0x77, 0x8c, 0x0c, 0x82, 0xb0, 0x24, 0xbf, 0x3d, 0x49, 0x40, 0xf5, 0x3a, 0xb2, 0x22, 0x3b, 0xe4, 0x7d, 0xa1, 0x5b, 0xed, 0x65, 0x1e, 0x80, 0xe3, 0x90, 0xba, 0x9c, 0x05, 0x11, 0xc6, 0x07, 0x54, 0xb1, 0x7c, 0x69, 0xed, 0xef, 0xec, 0xd9, 0x95, 0x45, 0x38, 0x46, 0x96, 0xad, 0x04, 0x16, 0xca, 0x64, 0x29, 0x0e, 0xf5, 0xee, 0xa9, 0x72, 0x57, 0x5a, 0xe8, 0x6d, 0x82, 0xc7, 0x19, 0xb2, 0x6a, 0x27, 0xf6, 0x64, 0xbb, 0x43, 0xb4, 0x34, 0x6f, 0x00, 0x36, 0xc9, 0x9f, 0xe0, 0x81, 0x64, 0x99, 0xcb, 0x70, 0xc4, 0x34, 0x10, 0xa8, 0x47, 0x60, 0xa7, 0xcf, 0x53, 0x01, 0xb9, 0xf9, 0xf4, 0xfe, 0x61, 0x63, 0xc6, 0x94, 0xb5, 0x64, 0x16, 0xf1, 0x00, 0xa0, 0x44, 0xfe, 0x52, 0x7f, 0x6b, 0x7c, 0x3b, 0xde, 0x44, 0x52, 0xd3, 0x04, 0x48, 0x25, 0xfd, 0xd7, 0x15, 0x2a, 0xed, 0x4f, 0x13, 0x38, 0xe8, 0x2c, 0x57, 0x22, 0x4b, 0xe4, 0xc8, 0x43, 0xcf, 0xe0, 0x80, 0x5a, 0x0b, 0xe7, 0x75, 0x99, 0x3b, 0xdb, 0x58, 0xf8, 0x3f, 0xa3, 0xbd, 0xcf, 0xe7, 0x68, 0x7d, 0xa4, 0x6d, 0x04, 0x58, 0x41, 0x43, 0xb7, 0xdf, 0x0a, 0x0f, 0x1c, 0x92, 0x8e, 0xf5, 0x5c, 0x45, 0x5c, 0x14, 0xa2, 0xc8, 0x18, 0x53, 0xcf, 0xc6, 0xce, 0x5d, 0x6e, 0xee, 0x85, 0xea, 0xea, 0x51, 0x18, 0x41, 0xfe, 0x0b, 0x41, 0xfa, 0x6e, 0x26, 0xf7, 0x09, 0xf5, 0xbb, 0xfa, 0xf8, 0x7e, 0x5a, 0xac, 0x74, 0x97, 0xac, 0x22, 0x0b, 0x22, 0x57, 0x7b, 0x34, 0x4d, 0x22, 0x70, 0x90, 0xc5, 0x5a, 0x2d, 0x6f, 0x27, 0x74, 0x5f, 0x96, 0xb8, 0xf3, 0x8f, 0x40, 0x55, 0x8d, 0xae, 0x62, 0xad, 0x89, 0xf1, 0x33, 0xad, 0x6b, 0xdf, 0xec, 0x3c, 0xd3, 0xa8, 0xcc, 0x29, 0xa3, 0xb8, 0x60, 0x61, 0x60, 0x8c, 0x01, 0x66, 0xdb, 0xc4, 0x9e, 0xfc, 0x10, 0x7a, 0xbc, 0x26, 0x4e, 0xd3, 0xba, 0x50, 0x98, 0xd3, 0x5a, 0xce, 0x4c, 0x76, 0x7d, 0x85, 0x02, 0xfc, 0x2e, 0xe8, 0xb7, 0x84, 0xe2, 0x27, 0x2b, 0xdc, 0xfe, 0xa2, 0x87, 0x98, 0x9a, 0xa4, 0x43, 0x61, 0x85, 0x4e, 0x47, 0x90, 0x89, 0xd1, 0x50, 0xfc, 0xf0, 0xe1, 0x96, 0x0f, 0x46, 0x66, 0xac, 0x20, 0x61, 0x74, 0xa7, 0xfc, 0x9f, 0x7d, 0x82, 0xc6, 0x6f, 0xc5, 0xc1, 0x02, 0x13, 0x17, 0x55, 0xec, 0xa4, 0xb7, 0xc0, 0x0e, 0x56, 0x97, 0x79, 0x11, 0xfd, 0xcd, 0x92, 0xd4, 0xd0, 0x45, 0x98, 0xbb, 0x6d, 0xb3, 0xbb, 0x4a, 0x1e, 0xcc, 0x2e, 0xf2, 0x5b, 0xb6, 0xd1, 0x2a, 0x90, 0xbd, 0x0e, 0xc2, 0x20, 0x47, 0x00, 0x74, 0xa9, 0x0a, 0xdb, 0xbd, 0x8a, 0x7c, 0x88, 0xeb, 0xa2, 0x8b, 0x8f, 0x76, 0x5b, 0x8f, 0x3a, 0x93, 0xe7, 0x7d, 0xf8, 0x07, 0xca, 0x5d, 0xff, 0x39, 0x99, 0xfe, 0x35, 0x8c, 0x01, 0xe8, 0x51, 0xeb, 0x0a, 0x92, 0x3d, 0xa6, 0x9d, 0xd5, 0xbf, 0x7c, 0x45, 0xa1, 0x59, 0xf9, 0x32, 0xef, 0x6e, 0x02, 0x83, 0xf6, 0xa5, 0xae, 0xc5, 0xa2, 0x93, 0x57, 0xb6, 0x42, 0x94, 0xf1, 0x4f, 0x81, 0xf9, 0x9b, 0x02, 0x97, 0x69, 0x74, 0x41, 0xc0, 0x81, 0xb0, 0x3f, 0xed, 0xbe, 0xeb, 0xfa, 0xba, 0x9d, 0xbc, 0x79, 0xa1, 0x00, 0x8e, 0x52, 0x6d, 0xd4, 0xab, 0x70, 0xf1, 0xf1, 0x9a, 0x13, 0xf9, 0x41, 0xab, 0x18, 0x81, 0x25, 0xd0, 0x7b, 0x25, 0x14, 0xae, 0x1a, 0xd9, 0x86, 0xf4, 0xbc, 0xda, 0x10, 0xec, 0x51, 0xe5, 0xd0, 0x50, 0x7c, 0xa6, 0x0b, 0x5e, 0x4e, 0x73, 0x15, 0x2e, 0x55, 0x3a, 0x71, 0x44, 0xd5, 0xb8, 0x3a, 0x62, 0x55, 0xec, 0xc1, 0x9f, 0x5d, 0xcc, 0x78, 0xbd, 0x7f, 0x36, 0x0f, 0xb8, 0x94, 0x29, 0xdc, 0x9b, 0x48, 0x35, 0x80, 0x97, 0xd9, 0x30, 0xc8, 0x56, 0x1b, 0x2b, 0xd1, 0x8d, 0xc0, 0xa4, 0x70, 0xd1, 0xd6, 0xfe, 0xd0, 0xab, 0x91, 0x2e, 0x5d, 0xee, 0x4b, 0xb6, 0xe1, 0x48, 0xc9, 0xd7, 0xed, 0x18, 0xc0, 0x02, 0x7b, 0x7f, 0x97, 0x91, 0xd1, 0xba, 0x6f, 0xb4, 0xa9, 0xaf, 0x61, 0xae, 0x8e, 0xc5, 0x06, 0x41, 0x89, 0xf9, 0x3d, 0x66, 0xfd, 0x2f, 0x28, 0x42, 0xd0, 0xc5, 0x78, 0x56, 0xcb, 0x6e, 0xeb, 0xf6, 0x44, 0x3e, 0x12, 0xfc, 0xfa, 0x01, 0x58, 0xbd, 0x40, 0xd1, 0x40, 0x3c, 0x5e, 0xe8, 0xee, 0x9e, 0x34, 0xb2, 0xe9, 0xde, 0x20, 0x26, 0x1f, 0xc2, 0x22, 0x57, 0x2a, 0x0e, 0x3e, 0x46, 0xd1, 0xf7, 0x22, 0xfb, 0xd2, 0xda, 0x09, 0xd4, 0xdf, 0x2e, 0xdf, 0x1c, 0xe6, 0xb8, 0xa6, 0xdf, 0x95, 0xfd, 0x18, 0xfd, 0x1e, 0xfd, 0x8e, 0x7e, 0x37, 0x1e, 0x20, 0x25, 0x65, 0x67, 0x0e, 0x48, 0x7b, 0xee, 0x5f, 0xdf, 0x5d, 0x94, 0xc7, 0xda, 0x0a, 0xef, 0xce, 0xb8, 0xda, 0x88, 0x2f, 0x55, 0x04, 0x47, 0x7e, 0x03, 0x62, 0x2b, 0x0e, 0xdd, 0x79, 0x3e, 0x12, 0x58, 0xb4, 0xc9, 0x02, 0x1b, 0xf0, 0xc4, 0x41, 0x11, 0x3d, 0x90, 0xfc, 0xbc, 0xe3, 0xe9, 0x55, 0xcc, 0xa4, 0x16, 0xc1, 0xf0, 0x41, 0x62, 0xae, 0xec, 0x40, 0xd0, 0x6a, 0xec, 0xeb, 0x0b, 0x40, 0x17, 0x9c, 0x9c, 0xe4, 0x68, 0x38, 0x5f, 0x11, 0xb9, 0xfa, 0x38, 0x70, 0x21, 0x72, 0x02, 0xbc, 0x80, 0xcd, 0xc8, 0x24, 0x58, 0x56, 0x38, 0xf0, 0xdf, 0x3d, 0x54, 0x68, 0x52, 0x97, 0x6b, 0xf1, 0x8b, 0xa7, 0x48, 0x7a, 0xd6, 0x5c, 0xa9, 0x16, 0x01, 0x1a, 0xf3, 0xea, 0xb2, 0xbe, 0x23, 0x4a, 0xfd, 0xdc, 0x08, 0x1f, 0x36, 0x4a, 0xb0, 0x8c, 0x04, 0xe3, 0x20, 0xd1, 0xb7, 0x85, 0x47, 0x6f, 0xdc, 0x5c, 0x35, 0x8d, 0x0e, 0x63, 0x89, 0x9a, 0x0f, 0x27, 0x28, 0x34, 0x17, 0xcf, 0x35, 0x48, 0x6b, 0x59, 0x3d, 0x7b, 0x32, 0x26, 0xb1, 0xc9, 0x84, 0xb9, 0x9a, 0x6c, 0xc5, 0xbc, 0x88, 0x00, 0x31, 0x43, 0xcb, 0xe4, 0xb7, 0x55, 0xe6, 0xe3, 0x0b, 0xa9, 0x41, 0x14, 0xf7, 0xad, 0x1e, 0xfe, 0xf2, 0xcc, 0xce, 0x00, 0xf3, 0xf1, 0x25, 0xf1, 0x87, 0x47, 0x2b, 0x03, 0x22, 0x44, 0x14, 0xed, 0xb2, 0xe5, 0x73, 0x49, 0x7a, 0x3b, 0xaa, 0x3a, 0x1e, 0x26, 0xa5, 0x53, 0xfa, 0x61, 0xc8, 0xb4, 0xb8, 0xbe, 0x25, 0x76, 0x22, 0xb3, 0xf3, 0x4a, 0x34, 0x16, 0x3b, 0x5c, 0x76, 0x25, 0xd5, 0x7e, 0x89, 0xc9, 0x93, 0x82, 0xff, 0x1c, 0xbc, 0xe7, 0x70, 0x28, 0xbc, 0xb9, 0xc9, 0xf2, 0x19, 0xb2, 0xe8, 0xb7, 0xa9, 0xa5, 0x66, 0x75, 0x03, 0x1d, 0xb4, 0xad, 0x33, 0x41, 0x6a, 0x67, 0xb2, 0xfa, 0xdb, 0x78, 0x95, 0x58, 0xed, 0x00, 0x04, 0x32, 0x28, 0x36, 0xee, 0x0d, 0x0c, 0x68, 0xfb, 0x3f, 0xa8, 0x3d, 0xc2, 0x55, 0x68, 0x3e, 0x3d, 0xb1, 0x2f, 0x94, 0x79, 0x78, 0xa5, 0x13, 0x92, 0xab, 0xd3, 0x78, 0xdf, 0x93, 0xed, 0xef, 0x6a, 0x63, 0x6e, 0xd9, 0xa3, 0x19, 0x6a, 0xcb, 0x55, 0xa5, 0x20, 0xda, 0xd8, 0x4d, 0xd0, 0x16, 0x89, 0x50, 0xcc, 0x54, 0x77, 0xc9, 0xd0, 0x31, 0x5f, 0xd7, 0x96, 0x53, 0xdb, 0xfb, 0xa6, 0xf2, 0xd6, 0xc1, 0x6c, 0x97, 0x43, 0xa3, 0x8c, 0x24, 0x0e, 0x2a, 0x7a, 0x15, 0x53, 0x56, 0x45, 0x05, 0xcf, 0x40, 0xb3, 0x74, 0x94, 0xfe, 0x93, 0xc7, 0x00, 0xc7, 0x4f, 0x90, 0xef, 0x57, 0xc1, 0x10, 0x30, 0x95, 0x47, 0xfb, 0x36, 0x74, 0x1a, 0x7a, 0x10, 0x17, 0xdb, 0x76, 0x9c, 0x38, 0x6f, 0x14, 0xf7, 0xca, 0x0d, 0x7c, 0x37, 0xdd, 0x95, 0xdf, 0x5d, 0xc3, 0x24, 0xb8, 0x85, 0x71, 0xe5, 0x52, 0x60, 0x27, 0x2a, 0x8a, 0xe4, 0x54, 0xbb, 0xd6, 0x42, 0xb4, 0x6d, 0x86, 0x19, 0xbb, 0xf7, 0x4a, 0xe9, 0x36, 0x02, 0xf5, 0xca, 0x30, 0x7f, 0x80, 0x5e, 0x12, 0x3d, 0x52, 0x04, 0x0f, 0xbb, 0xbe, 0x4e, 0xbf, 0x3b, 0xce, 0xb6, 0x0a, 0x17, 0x3f, 0x8c, 0x48, 0x58, 0xcc, 0x33, 0xa6, 0x85, 0xb0, 0x8d, 0xcc, 0xb9, 0x66, 0xb4, 0xbd, 0xf8, 0xb3, 0xeb, 0xfe, 0xc3, 0xe6, 0xd4, 0xfa, 0xea, 0x5f, 0xe3, 0xa5, 0xa2, 0x4e, 0x12, 0x60, 0xd7, 0xbd, 0xd6, 0x1d, 0xc4, 0xd1, 0x52, 0xc3, 0xc0, 0x4c, 0xcb, 0xd4, 0x5b, 0x57, 0x5d, 0x4d, 0xa9, 0x7f, 0xec, 0xcd, 0xde, 0xfd, 0x5d, 0xfa, 0x1b, 0x3a, 0x05, 0x20, 0x88, 0x92, 0x61, 0x1c, 0xa3, 0x58, 0x08, 0x79, 0xd8, 0x1b, 0xdf, 0xd8, 0x51, 0x28, 0x8c, 0x95, 0x0f, 0x50, 0x2d, 0xa7, 0x3a, 0xec, 0x49, 0xc8, 0xb5, 0x1e, 0x06, 0xd7, 0xf6, 0x59, 0x9d, 0x7a, 0x15, 0x23, 0x0c, 0x07, 0x22, 0x19, 0x0b, 0xa5, 0xbc, 0x34, 0x40, 0xae, 0xdf, 0x4c, 0xb6, 0x58, 0xfe, 0xda, 0x8c, 0x95, 0x52, 0x02, 0xea, 0x37, 0x71, 0xd1, 0x39, 0x58, 0x22, 0xc3, 0x94, 0xf9, 0x70, 0x88, 0x79, 0xe9, 0xfd, 0x07, 0xc5, 0xe9, 0x99, 0xa4, 0xdf, 0x0d, 0x13, 0xbe, 0x33, 0x65, 0x4f, 0x7c, 0xe2, 0xdd, 0x99, 0xca, 0xb7, 0x62, 0x39, 0x9e, 0x5e, 0x46, 0x48, 0x80, 0xd0, 0xe6, 0xc2, 0x49, 0x12, 0x8a, 0xdc, 0x2b, 0x1f, 0x8c, 0x97, 0xf1, 0x23, 0xbd, 0x95, 0x88, 0xe9, 0x04, 0x2b, 0xbf, 0x97, 0x48, 0xb9, 0x4b, 0x99, 0x90, 0x36, 0x0e, 0xdb, 0x69, 0x0f, 0x99, 0x3b, 0x89, 0x32, 0xef, 0x3e, 0xb1, 0x65, 0x8b, 0x01, 0xd8, 0xdd, 0xa5, 0x73, 0x85, 0x0c, 0xb2, 0xc2, 0x7d, 0xba, 0x2a, 0x13, 0x9e, 0x57, 0x8d, 0x76, 0x0b, 0x90, 0xa8, 0x19, 0x89, 0x20, 0x15, 0xbc, 0x29, 0xe9, 0x01, 0x64, 0x28, 0x43, 0x31, 0x54, 0x13, 0x94, 0x47, 0x39, 0x2e, 0x21, 0x42, 0xa5, 0x17, 0x23, 0x45, 0xbe, 0xa7, 0x1e, 0x99, 0x38, 0x19, 0x6e, 0xf4, 0x80, 0x6e, 0x22, 0xfc, 0x3a, 0x0f, 0x0e, 0x07, 0xee, 0xb5, 0x1c, 0x25, 0xfe, 0x86, 0xe3, 0x60, 0xdc, 0x81, 0x7b, 0x42, 0x79, 0x1b, 0x8f, 0x98, 0x01, 0x2a, 0xb3, 0x76, 0xc5, 0x03, 0xf8, 0x7b, 0x79, 0xdf, 0xbe, 0x56, 0x9f, 0x84, 0xca, 0x89, 0x43, 0x21, 0x99, 0x6d, 0xe9, 0x79, 0xf3, 0x77, 0xc4, 0x43, 0xc3, 0xb9, 0x28, 0xd1, 0x25, 0xac, 0x42, 0xf1, 0xc1, 0x2c, 0x07, 0x11, 0x58, 0xc4, 0x6a, 0xa6, 0x9c, 0x2c, 0xd2, 0xce, 0x45, 0x10, 0xcb, 0x33, 0x61, 0x13, 0xfb, 0x33, 0xeb, 0x14, 0x59, 0x3f, 0xa0, 0xb0, 0x99, 0x81, 0x0e, 0x08, 0xea, 0xc2, 0xee, 0xc4, 0xe4, 0x8a, 0xb3, 0x58, 0xbc, 0x89, 0x63, 0x85, 0xbb, 0x35, 0xa6, 0x23, 0xee, 0xb5, 0x1d, 0x1f ],
+    const [ 0xf6, 0x0c, 0x89, 0x48, 0x14, 0x88, 0xd6, 0x5c, 0x26, 0xa6, 0xba, 0x36, 0x4c, 0x5d, 0x60, 0x21, 0x34, 0xed, 0x1a, 0xfa, 0xd5, 0xc2, 0xb0, 0x37, 0x60, 0x9b, 0xf8, 0x28, 0x73, 0xeb, 0xa6, 0x7d, 0x90, 0x7f, 0x66, 0x09, 0xcf, 0x62, 0x28, 0xc5, 0xcf, 0xfe, 0xbb, 0x18, 0xf2, 0x83, 0x9e, 0x55, 0xca, 0x8d, 0x13, 0x86, 0xce, 0x01, 0x74, 0x68, 0x52, 0x37, 0xca, 0xb6, 0xb6, 0x5f, 0x9c, 0xaa, 0xdd, 0x1d, 0x05, 0xc2, 0xe0, 0x77, 0x09, 0xc0, 0x04, 0xf1, 0x29, 0xf4, 0xea, 0xf6, 0x35, 0xbd, 0x06, 0x7a, 0x62, 0x4e, 0x52, 0xde, 0x9d, 0xae, 0x44, 0x14, 0x1e, 0x02, 0xfd, 0x03, 0x3f, 0x0f, 0xc3, 0x2d, 0x8f, 0xfb, 0xb1, 0x8f, 0x22, 0x53, 0xad, 0xc8, 0x2c, 0x53, 0x9b, 0x7e, 0xce, 0x61, 0xd0, 0xfe, 0x30, 0xda, 0xca, 0x22, 0xd0, 0x11, 0x1e, 0x78, 0x1a, 0x95, 0xb1, 0xa0, 0x38, 0xb3, 0x2b, 0xf6, 0x2b, 0x3c, 0xa9, 0x72, 0x1b, 0x89, 0xb3, 0xcc, 0xeb, 0xbb, 0x6d, 0xe3, 0x11, 0x47, 0x11, 0x5f, 0xa5, 0xb3, 0x9c, 0x95, 0xb7, 0x9a, 0xc8, 0xac, 0xe6, 0xf6, 0x3b, 0xfe, 0x2e, 0x9f, 0xfe, 0xc1, 0x02, 0x0e, 0x30, 0xe7, 0x9b, 0x67, 0xfc, 0x42, 0x8f, 0xb7, 0xc8, 0xec, 0xa5, 0x79, 0xaf, 0xe6, 0xe8, 0x60, 0x32, 0xff, 0xfa, 0x50, 0x2a, 0xf8, 0xab, 0xad, 0x01, 0xe5, 0xca, 0xd9, 0x22, 0xd6, 0x3c, 0xf8, 0xae, 0xb7, 0x4a, 0xf7, 0x71, 0x75, 0x3f, 0xcc, 0x14, 0x63, 0x33, 0xff, 0x94, 0xdb, 0x22, 0x69, 0xf3, 0x28, 0x41, 0x3c, 0x2d, 0xa3, 0x91, 0x43, 0x6d, 0x1d, 0xb4, 0x6b, 0x81, 0x7d, 0x00, 0x83, 0x8b, 0xaa, 0xd2, 0x40, 0xfa, 0xac, 0x24, 0x84, 0xb9, 0x0e, 0x62, 0xdf, 0xa6, 0x86, 0x7a, 0x57, 0x46, 0xd8, 0x33, 0x64, 0xb7, 0xf7, 0xbf, 0x3f, 0xe6, 0x6d, 0x93, 0x5c, 0x02, 0xfe, 0x76, 0x35, 0x30, 0x88, 0xd8, 0x4a, 0x80, 0x2e, 0x66, 0x66, 0x1f, 0xb5, 0xdb, 0x23, 0xcf, 0x2e, 0x19, 0xb0, 0x95, 0xd6, 0x78, 0xd2, 0xb1, 0x3a, 0x5e, 0x29, 0xd3, 0x9f, 0x10, 0xb5, 0x8c, 0xa0, 0xc7, 0x99, 0x03, 0x19, 0x07, 0x1e, 0xe9, 0x44, 0x2c, 0xfa, 0xaf, 0x22, 0x46, 0xd3, 0xf6, 0x1d, 0x26, 0xff, 0x47, 0xeb, 0xb9, 0x8e, 0x04, 0xb5, 0x95, 0x8a, 0x9e, 0x79, 0xd2, 0x7d, 0x09, 0xad, 0x1b, 0x34, 0x6d, 0x25, 0x04, 0xc3, 0x1f, 0x36, 0x9e, 0xc9, 0xcf, 0x1c, 0x4a, 0xf5, 0x03, 0x99, 0xca, 0xc9, 0xc4, 0xdf, 0x9e, 0x9e, 0x96, 0xb0, 0x8d, 0xe9, 0xae, 0xc4, 0x82, 0xbc, 0x60, 0x6b, 0x99, 0x90, 0xd7, 0x73, 0x7a, 0x41, 0x08, 0x4c, 0xe6, 0x5a, 0xe8, 0x6a, 0x8f, 0x93, 0xdd, 0xeb, 0x2d, 0x98, 0x73, 0x7a, 0xce, 0x0c, 0x51, 0x73, 0x6d, 0xce, 0x6b, 0x47, 0xc7, 0x7b, 0x79, 0x23, 0x6a, 0x34, 0xa7, 0xcc, 0x0f, 0xa1, 0x8e, 0xce, 0x29, 0x35, 0x63, 0xd5, 0xbe, 0xb4, 0x6e, 0x5b, 0x76, 0xf3, 0xbe, 0x83, 0xf2, 0xe0, 0x1c, 0x45, 0x5e, 0xc1, 0x3d, 0xcc, 0x4a, 0xc1, 0x3c, 0x1c, 0xb5, 0xa8, 0x47, 0xf8, 0x6b, 0xea, 0x98, 0x03, 0x92, 0xe3, 0xa6, 0x25, 0x7f, 0x61, 0x9d, 0x30, 0xce, 0x63, 0x0c, 0xc4, 0xb1, 0x20, 0xde, 0x70, 0x88, 0x4b, 0x8c, 0x19, 0xb2, 0x96, 0x91, 0xa0, 0xa3, 0x75, 0x1d, 0xbf, 0x37, 0x24, 0x0d, 0x34, 0x46, 0xeb, 0x1b, 0x22, 0x79, 0xa1, 0x52, 0xb4, 0x5c, 0x6f, 0xc6, 0x03, 0xb4, 0xd6, 0x81, 0x3a, 0x12, 0xf3, 0xc0, 0xf8, 0xa8, 0x02, 0x60, 0xf5, 0x5c, 0x22, 0x93, 0xe9, 0x1b, 0x57, 0xd7, 0xa9, 0x70, 0xd5, 0x29, 0x93, 0x55, 0x7c, 0x75, 0x2d, 0x49, 0x9f, 0x52, 0x09, 0xa2, 0x09, 0xec, 0xec, 0x25, 0x42, 0x41, 0x2e, 0xd4, 0x0e, 0x91, 0x64, 0x07, 0x37, 0x0f, 0x3d, 0xbe, 0x8c, 0xdd, 0xaa, 0x36, 0x2a, 0x37, 0x42, 0xba, 0xfa, 0xef, 0xe4, 0xbc, 0x7b, 0x19, 0x9e, 0x24, 0xc2, 0x07, 0xcd, 0xe8, 0xbf, 0x78, 0x86, 0xdd, 0xc1, 0x0c, 0x35, 0xcd, 0x3c, 0xfb, 0x84, 0xc9, 0xcb, 0x07, 0x7f, 0xc0, 0x71, 0xaf, 0xf5, 0x51, 0x24, 0xa6, 0x21, 0xde, 0x8c, 0x83, 0x89, 0xe2, 0x08, 0xba, 0x27, 0x84, 0xf2, 0xcb, 0xc7, 0x6c, 0x24, 0xb9, 0xb0, 0xd5, 0xba, 0xbe, 0x86, 0xe3, 0x1a, 0x3d, 0x6f, 0x37, 0x32, 0xf8, 0x75, 0xc2, 0x01, 0x83, 0x2c, 0xd6, 0x59, 0xf9, 0x94, 0x83, 0xe3, 0xed, 0x40, 0x20, 0x63, 0xa3, 0xb8, 0x28, 0x3d, 0x80, 0x1d, 0x48, 0x39, 0xc0, 0x0b, 0xb5, 0x83, 0x67, 0xc3, 0xc3, 0xf6, 0x7a, 0x8a, 0xb4, 0x99, 0x6e, 0x4c, 0xcd, 0x6a, 0xe1, 0x85, 0xb0, 0x5b, 0x88, 0x62, 0xe5, 0x9b, 0x69, 0x23, 0xba, 0x16, 0x4a, 0xc3, 0x4d, 0x3f, 0x69, 0xdb, 0xe7, 0x0d, 0x6d, 0xc4, 0x8b, 0x43, 0x9d, 0xfb, 0xcf, 0xf5, 0x50, 0xca, 0xeb, 0x48, 0xa4, 0x25, 0x10, 0x79, 0x73, 0xd3, 0xfb, 0x21, 0x83, 0xce, 0xc9, 0xb7, 0xfd, 0xeb, 0x0d, 0x56, 0x21, 0xbd, 0x20, 0xc0, 0x37, 0xb7, 0xb8, 0xa4, 0xc9, 0x92, 0xbc, 0x1c, 0x0f, 0xee, 0x57, 0x7a, 0xab, 0x3c, 0x4c, 0x44, 0x97, 0xdb, 0x89, 0x7d, 0x5b, 0x81, 0xfe, 0x26, 0x83, 0xdd, 0xaf, 0x05, 0x50, 0x7b, 0x08, 0xa5, 0xae, 0xe7, 0x71, 0x9e, 0x66, 0x15, 0x23, 0x16, 0x95, 0x00, 0x3a, 0x88, 0x5d, 0x92, 0x0b, 0xc5, 0xda, 0xc4, 0xb7, 0x38, 0x57, 0x06, 0x01, 0x6d, 0xc2, 0xe1, 0x5c, 0xd5, 0x5e, 0xdb, 0x48, 0xc3, 0xb8, 0x9b, 0xdf, 0xbb, 0xdc, 0x4d, 0xab, 0xec, 0xc8, 0x48, 0xbb, 0xfb, 0x21, 0xee, 0xf6, 0x02, 0x25, 0xd4, 0xaf, 0xd9, 0xe1, 0x24, 0x79, 0x94, 0xa4, 0x3f, 0x3c, 0x4c, 0xb3, 0xa6, 0x88, 0x23, 0x3e, 0x1a, 0x2a, 0x82, 0x93, 0x02, 0xfd, 0xa5, 0x92, 0x0e, 0x03, 0x5a, 0x61, 0x1a, 0xb4, 0x05, 0x61, 0x55, 0x96, 0xe8, 0x60, 0xa2, 0x0e, 0xa1, 0x10, 0x3e, 0x76, 0xf4, 0xb7, 0xa3, 0x6f, 0xcb, 0x29, 0xad, 0x79, 0x7b, 0xf4, 0xfc, 0xc1, 0x49, 0xda, 0x99, 0x39, 0x2d, 0x84, 0xdc, 0xee, 0xd6, 0x74, 0x8d, 0x97, 0xed, 0x3c, 0x49, 0x69, 0x9e, 0xed, 0x27, 0x33, 0x55, 0xd3, 0x9c, 0xa6, 0xc5, 0x5f, 0x9c, 0xf4, 0x2f, 0x65, 0x02, 0x9e, 0xe1, 0x88, 0x32, 0x86, 0xfd, 0xf2, 0xfd, 0x4c, 0x7b, 0x48, 0xc5, 0xd7, 0x71, 0xdc, 0xe1, 0x32, 0x92, 0x25, 0x42, 0x9a, 0xf5, 0x6d, 0x57, 0xd5, 0x19, 0xca, 0x2f, 0xc5, 0x25, 0x4f, 0xde, 0x3c, 0x74, 0x83, 0x21, 0x12, 0x50, 0x12, 0x45, 0x75, 0xfe, 0xc3, 0x44, 0x81, 0xfc, 0xaa, 0x32, 0x10, 0x86, 0x9f, 0xd7, 0xd4, 0x5e, 0xef, 0x9e, 0xa3, 0xcd, 0x51, 0xae, 0x11, 0xe5, 0x1b, 0x56, 0x44, 0x0a, 0xb5, 0xae, 0x04, 0xb1, 0x4e, 0x7b, 0x12, 0x66, 0xcf, 0x54, 0xbb, 0x14, 0x0d, 0x03, 0xac, 0x81, 0x43, 0x2e, 0x08, 0x18, 0xbf, 0x37, 0xb8, 0xeb, 0xdb, 0x60, 0x03, 0xf8, 0x2f, 0x33, 0x5e, 0xab, 0x05, 0x21, 0x85, 0xa5, 0x0d, 0x69, 0xca, 0xbc, 0x53, 0x3b, 0xad, 0x43, 0x6d, 0x1d, 0xae, 0x8b, 0xf9, 0x8f, 0x5f, 0xa9, 0x47, 0xea, 0xbd, 0x7a, 0x52, 0x8e, 0xc0, 0xe5, 0xf5, 0x3c, 0x31, 0x60, 0x5b, 0xc1, 0xbc, 0xb6, 0xb8, 0xd5, 0x46, 0x07, 0x36, 0x42, 0x81, 0x10, 0x33, 0x49, 0xbd, 0xac, 0xa9, 0x41, 0x01, 0x9b, 0xed, 0x81, 0x5a, 0x83, 0x9d, 0x80, 0x73, 0x34, 0xd3, 0x3b, 0x66, 0x30, 0x9f, 0xd7, 0xd2, 0x6b, 0xb5, 0x88, 0x2e, 0x4f, 0x62, 0xb1, 0x5c, 0x03, 0xc5, 0x4d, 0x81, 0xed, 0x3b, 0x8d, 0x15, 0x76, 0x1b, 0xc2, 0x36, 0x0d, 0xa4, 0x7e, 0x42, 0x6e, 0x33, 0xf6, 0xa4, 0x24, 0xb9, 0xab, 0xee, 0x4c, 0x6d, 0x4a, 0x29, 0x9d, 0xbe, 0xd0, 0x68, 0xa5, 0x8c, 0xf1, 0xa4, 0x55, 0x97, 0xbb, 0xc3, 0xc0, 0x38, 0x77, 0xfa, 0x20, 0x4f, 0xd0, 0x55, 0x1a, 0x7c, 0x37, 0x94, 0x43, 0x92, 0x85, 0x39, 0xe2, 0x48, 0xe2, 0xdf, 0xf8, 0x32, 0xe6, 0xcd, 0x7d, 0xf0, 0xff, 0xcb, 0xed, 0xa6, 0x13, 0x35, 0x03, 0xac, 0x66, 0x4d, 0xc4, 0x86, 0xbd, 0xd5, 0xc0, 0x16, 0xc4, 0xde, 0x95, 0x10, 0xad, 0xdb, 0xb4, 0xaf, 0x1a, 0xf9, 0x68, 0xa6, 0x3d, 0xb3, 0x14, 0x5a, 0x3d, 0xa0, 0xbc, 0x4e, 0xdc, 0x90, 0xc6, 0xde, 0x58, 0xd8, 0x02, 0x31, 0x8e, 0xea, 0xe9, 0x69, 0x65, 0x29, 0x22, 0x1c, 0x6a, 0xfb, 0x4b, 0x08, 0xb8, 0x1f, 0xf5, 0x02, 0x1b, 0x41, 0xf0, 0x30, 0x75, 0xcb, 0xca, 0x78, 0x60, 0xff, 0x92, 0x38, 0x14, 0x43, 0xe1, 0x38, 0x8c, 0xbb, 0x1c, 0xdd, 0xe4, 0x1d, 0xf3, 0x9f, 0x06, 0xc1, 0x2d, 0xbc, 0x85, 0xf8, 0xa8, 0x2e, 0xc9, 0x9f, 0x9b, 0xdb, 0x6d, 0xf4, 0x1f, 0x0d, 0xe5, 0xa8, 0xee, 0x21, 0x64, 0x35, 0x6a, 0x83, 0xfc, 0x71, 0xe1, 0xda, 0x08, 0x63, 0x0f, 0x7f, 0xc7, 0x56, 0xe4, 0x34, 0x49, 0x2d, 0x88, 0x13, 0x8f, 0xf6, 0x9d, 0xc4, 0xee, 0xc2, 0xc4, 0xf3, 0xb4, 0xb3, 0x62, 0x01, 0x0e, 0x56, 0xa4, 0xfa, 0x29, 0x33, 0xc0, 0xc8, 0x98, 0xa3, 0x7e, 0xa6, 0xf6, 0xe2, 0xf8, 0xd7, 0xcc, 0x65, 0x9d, 0x97, 0xb4, 0x6e, 0x7c, 0x52, 0xbf, 0xdd, 0xc0, 0x14, 0x15, 0x49, 0x76, 0x41, 0xdb, 0x4f, 0x97, 0x86, 0x5a, 0x2a, 0x42, 0x0f, 0x5d, 0x84, 0x49, 0xfa, 0xda, 0x8c, 0xef, 0x0c, 0xd5, 0x49, 0xf0, 0xa3, 0x82, 0x2e, 0xc2, 0xec, 0xaa, 0xee, 0x1b, 0x56, 0x4f, 0x92, 0xb3, 0x47, 0x93, 0xc8, 0x4b, 0x0d, 0xd6, 0x7e, 0xee, 0x17, 0x1f, 0xaf, 0x77, 0x65, 0xbd, 0x7d, 0x53, 0x3d, 0x2e, 0x81, 0x88, 0x20, 0x3f, 0x5f, 0xf6, 0xfc, 0x75, 0x9d, 0xdd, 0xa3, 0xac, 0xb5, 0xa0, 0x7c, 0xfe, 0x68, 0xc9, 0x78, 0xe6, 0x56, 0x4c, 0x48, 0xa5, 0xcc, 0x10, 0xce, 0xe5, 0xdd, 0xab, 0xd1, 0x9d, 0xb4, 0x6e, 0xf4, 0x34, 0x28, 0xa1, 0xe9, 0xe9, 0x91, 0x0f, 0xe2, 0x72, 0xda, 0xc6, 0x48, 0xe3, 0xd8, 0x18, 0xb0, 0xd2, 0xda, 0xe5, 0x0b, 0xb9, 0x82, 0x1d, 0x1c, 0x9b, 0xd3, 0x80, 0x30, 0xeb, 0x8a, 0xa8, 0x09, 0xa9, 0xb2, 0x4a, 0x1b, 0xce, 0x73, 0xb9, 0xfb, 0xea, 0x2b, 0xab, 0x14, 0x0c, 0xc0, 0x40, 0x9c, 0xe2, 0x34, 0x40, 0xc6, 0x21, 0x79, 0xa4, 0x39, 0x27, 0x87, 0x59, 0xc2, 0xe0, 0xad, 0x40, 0x45, 0xe6, 0x24, 0x79, 0xfa, 0xec, 0xea, 0xe1, 0xd5, 0x5c, 0xcd, 0xd9, 0x46, 0x3f, 0xc6, 0x4a, 0x23, 0x5e, 0x89, 0xe6, 0xe3, 0xa6, 0x5a, 0xb0, 0x0c, 0xd1, 0x22, 0xbe, 0xee, 0x43, 0xc2, 0x3d, 0x92, 0x32, 0xa7, 0xb7, 0xee, 0x0a, 0x9f, 0x91, 0x5a, 0x10, 0xeb, 0xd8, 0x48, 0x45, 0x95, 0x3d, 0x2f, 0x8d, 0x04, 0x5d, 0xc8, 0x10, 0xcd, 0x46, 0x7d, 0xe1, 0xcc, 0x37, 0x1f, 0xde, 0x74, 0xa8, 0xd7, 0xd7, 0x63, 0x8a, 0x5f, 0xf2, 0x39, 0xd0, 0x71, 0x4d, 0xab, 0x2e, 0x80, 0xe6, 0xd3, 0x21, 0xa7, 0xb8, 0xca, 0x2f, 0xdf, 0x27, 0x79, 0x70, 0x74, 0x9e, 0xac, 0x4d, 0xba, 0x77, 0x68, 0x88, 0xfc, 0x1b, 0x7f, 0x7d, 0xb5, 0x6a, 0x61, 0xa7, 0x02, 0x5d, 0x35, 0x65, 0x58, 0xe9, 0x29, 0xfe, 0x72, 0x27, 0x06, 0xe3, 0x8e, 0xb3, 0x07, 0x35, 0xd9, 0x52, 0xeb, 0x87, 0x28, 0xd7, 0x49, 0xe5, 0xe8, 0x47, 0x24, 0x15, 0x58, 0x3b, 0xbf, 0x1c, 0xf6, 0x86, 0xb2, 0x05, 0x36, 0x18, 0x3e, 0xdd, 0x7a, 0x22, 0xde, 0x02, 0x3f, 0x7b, 0x1e, 0x9e, 0x94, 0x43, 0xb0, 0x6e, 0xd1, 0xc6, 0xbd, 0xc8, 0x85, 0xa2, 0x79, 0xdc, 0xb0, 0x2d, 0xfa, 0x3a, 0x33, 0x11, 0x4a, 0x94, 0x84, 0x39, 0xbb, 0xc5, 0xa6, 0xf1, 0x7a, 0x13, 0x59, 0x48, 0x67, 0xb1, 0x8e, 0xb9, 0x24, 0x88, 0x1d, 0x0b, 0x6c, 0x38, 0xba, 0x76, 0xa7, 0x59, 0x26, 0x07, 0xbb, 0x06, 0xa2, 0x46, 0x24, 0x9c, 0xa9, 0x15, 0x47, 0xbf, 0xde, 0xdb, 0x03, 0x9e, 0x44, 0xe2, 0x8a, 0x78, 0xad, 0xfe, 0x6f, 0x60, 0x75, 0x70, 0x00, 0x3d, 0x6f, 0x09, 0xd5, 0x14, 0x20, 0x93, 0xa9, 0x8a, 0x2b, 0x6c, 0x69, 0xa4, 0x0d, 0x74, 0x8b, 0xd2, 0x0a, 0x29, 0xa1, 0x2c, 0x67, 0x11, 0x2e, 0xfb, 0xda, 0x59, 0xb8, 0x7b, 0x3f, 0xbb, 0x1e, 0xdf, 0x8c, 0xa5, 0x2c, 0x96, 0x07, 0x97, 0x6d, 0xcd, 0xb7, 0xcc, 0x40, 0x35, 0x18, 0x1e, 0x2e, 0x06, 0x13, 0x24, 0x7b, 0x44, 0x2c, 0x9d, 0xfb, 0x41, 0xfe, 0x11, 0x27, 0x63, 0xe4, 0xb5, 0x70, 0x27, 0xfa, 0x90, 0xd4, 0x66, 0x44, 0xdc, 0xae, 0xd7, 0x2c, 0xaf, 0xd2, 0xd6, 0x32, 0xda, 0xd9, 0x63, 0xdf, 0x11, 0xba, 0x6e, 0xfa, 0x4d, 0x9b, 0x52, 0xff, 0x6f, 0xe6, 0x9f, 0xcd, 0x26, 0x9e, 0x1c, 0x9f, 0x12, 0xf4, 0x0c, 0x3d, 0x2a, 0x15, 0xb1, 0x74, 0x5b, 0x47, 0x0f, 0xc3, 0x71, 0x34, 0xf2, 0x57, 0x3b, 0x85, 0x32, 0x3a, 0xea, 0xb3, 0x36, 0xc7, 0xbb, 0x1a, 0xb7, 0x61, 0xd6, 0x50, 0xc6, 0x64, 0x75, 0xb4, 0x11, 0x5c, 0x48, 0x4a, 0x62, 0x75, 0x19, 0xc6, 0x68, 0x33, 0xac, 0xe6, 0xba, 0x63, 0xe9, 0x05, 0x19, 0x52, 0x3c, 0xee, 0xf5, 0x3c, 0x3d, 0xee, 0x33, 0x07, 0x8c, 0x2d, 0x2e, 0x31, 0xff, 0x3d, 0xfc, 0x08, 0x00, 0xf4, 0xf2, 0x19, 0x30, 0x77, 0x6a, 0xea, 0x51, 0x98, 0xc3, 0xec, 0x62, 0x62, 0xaa, 0xab, 0x0b, 0xf1, 0x98, 0x48, 0x3c, 0x88, 0x9c, 0x29, 0x12, 0xdd, 0x5b, 0xef, 0xfa, 0xb7, 0x55, 0xa8, 0x18, 0xbb, 0x6a, 0x46, 0xea, 0x83, 0x9c, 0x51, 0x28, 0xf1, 0x16, 0xd8, 0xef, 0xc3, 0x6e, 0xad, 0x1f, 0x67, 0x27, 0xd2, 0x02, 0x10, 0x7a, 0x2e, 0x2e, 0x09, 0x55, 0x84, 0xac, 0x4a, 0xa5, 0xa6, 0x59, 0x49, 0xd1, 0xe6, 0x8d, 0x12, 0x86, 0xce, 0xfb, 0x9a, 0xba, 0x11, 0xd8, 0x50, 0xeb, 0xc0, 0x40, 0xf6, 0xa8, 0xc1, 0xd5, 0xaf, 0x53, 0x7e, 0xa9, 0x59, 0x25, 0xda, 0x5e, 0x1c, 0x72, 0x69, 0x8b, 0x43, 0x2f, 0xe0, 0x62, 0x4b, 0xb1, 0xca, 0x90, 0x3a, 0xb7, 0x7d, 0x65, 0x33, 0xab, 0x4d, 0x35, 0x46, 0x25, 0xff, 0xfe, 0x8c, 0xb1, 0x81, 0x4a, 0x74, 0xd2, 0xd8, 0x57, 0x58, 0x47, 0x59, 0x76, 0x54, 0x8c, 0x1c, 0xb1, 0x57, 0xa4, 0xae, 0xb0, 0x7a, 0x16, 0x06, 0xde, 0x91, 0x36, 0xba, 0xc7, 0x00, 0xa5, 0x73, 0xc4, 0xd1, 0x1b, 0x9f, 0xdb, 0x03, 0x64, 0x65, 0xe1, 0x24, 0xa9, 0xde, 0xe1, 0x22, 0xf1, 0x82, 0xc2, 0x5e, 0xe7, 0xe0, 0x23, 0x02, 0xde, 0x93, 0x8a, 0x95, 0x12, 0x71, 0xbe, 0xcc, 0x31, 0x05, 0x71, 0xa3, 0x1a, 0x40, 0x22, 0xad, 0xe4, 0x6b, 0x42, 0xa8, 0x22, 0x60, 0x96, 0x55, 0x65, 0xfa, 0xdc, 0x87, 0x03, 0xca, 0xb1, 0x79, 0x17, 0x0b, 0xb2, 0x64, 0xc9, 0xd8, 0xe2, 0x51, 0xd0, 0x9d, 0x4c, 0x2c, 0x35, 0xcc, 0xe9, 0x1b, 0x59, 0xd1, 0xc3, 0x0e, 0x39, 0x47, 0x5b, 0x96, 0xf1, 0x6c, 0x48, 0xfa, 0x7f, 0xd2, 0x22, 0x88, 0xca, 0x58, 0x9e, 0x29, 0xe3, 0x59, 0xfa, 0x38, 0x8a, 0x23, 0x9c, 0x94, 0xf4, 0xab, 0xf6, 0xf4, 0xcb, 0x7f, 0xac, 0x7b, 0x77, 0xfb, 0xf9, 0x8d, 0x9c, 0xc0, 0x4f, 0xe0, 0xe3, 0x62, 0x3d, 0xd6, 0xfe, 0x61, 0x96, 0x0a, 0xe6, 0x5b, 0xd0, 0x28, 0x67, 0x7f, 0xaa, 0x03, 0xdf, 0x45, 0x11, 0xe1, 0x43, 0x5c, 0x45, 0x19, 0x62, 0xe4, 0x38, 0xe1, 0x6e, 0xde, 0x37, 0x61, 0xb8, 0xe1, 0xcb, 0x0c, 0xbb, 0x0e, 0xe2, 0x2f, 0x5c, 0x46, 0x2a, 0xca, 0x70, 0x9a, 0xbe, 0xa0, 0x7f, 0x02, 0x04, 0x8a, 0xc7, 0x52, 0xd5, 0x10, 0x84, 0x6b, 0xdf, 0x3a, 0x6f, 0xae, 0x48, 0xa4, 0x85, 0xb7, 0x94, 0xd1, 0x09, 0x47, 0xc9, 0xc1, 0xcc, 0x81, 0xd1, 0xc6, 0xac, 0x5a, 0x1f, 0x93, 0x5b, 0x4b, 0x96, 0x96, 0x62, 0x48, 0xa6, 0x88, 0x65, 0xf6, 0xb8, 0x42, 0xa8, 0x19, 0xcc, 0xd2, 0xd2, 0x4b, 0x60, 0xce, 0xf1, 0xf4, 0x94, 0xe8, 0xbf, 0x76, 0x8d, 0xc3, 0x24, 0xa8, 0x17, 0x05, 0xfb, 0x86, 0x8e, 0xae, 0x19, 0x27, 0xfe, 0xa8, 0x8b, 0xef, 0x89, 0x9e, 0x20, 0x05, 0x09, 0x12, 0x28, 0x07, 0xf7, 0xaa, 0x7a, 0xfd, 0x8c, 0xcb, 0xbc, 0x8c, 0x25, 0x69, 0xde, 0x6d, 0xec, 0x1e, 0xe8, 0x1d, 0xb5, 0x79, 0xf6, 0xd5, 0x26, 0x98, 0x80, 0xbc, 0x1b, 0xf9, 0xdf, 0x5c, 0x48, 0x8d, 0x0d, 0x52, 0x21, 0x0e, 0xad, 0x4a, 0xf6, 0x93, 0x4b, 0x2b, 0x63, 0x62, 0xe4, 0x8f, 0xe7, 0x05, 0xa9, 0x76, 0xd3, 0xa0, 0x00, 0x3b, 0x66, 0x81, 0xcc, 0xc7, 0x36, 0xf9, 0xee, 0x04, 0xd1, 0x6a, 0x0c, 0x94, 0xa5, 0xa2, 0x90, 0xc4, 0x1d, 0x67, 0xf4, 0xbb, 0x0d, 0x53, 0x3e, 0xf8, 0x50, 0xe3, 0xc6, 0xfb, 0xb0, 0xca, 0x3f, 0x41, 0x05, 0x8b, 0xf5, 0x76, 0xa1, 0x46, 0x54, 0xe7, 0xec, 0xd2, 0xaa, 0x36, 0x4c, 0x0d, 0x2e, 0x51, 0x48, 0x70, 0x40, 0xa4, 0xec, 0xe7, 0xf2, 0x8e, 0x6f, 0xdf, 0xc8, 0x12, 0x13, 0xa0, 0xbc, 0xd0, 0x4d, 0xdd, 0x85, 0x33, 0x26, 0x89, 0x19, 0xeb, 0xe1, 0xed, 0x71, 0x9e, 0xde, 0xf8, 0x8c, 0xda, 0xbe, 0xd6, 0xb6, 0x4f, 0xc8, 0xc4, 0x0a, 0x3b, 0x8b, 0x22, 0x36, 0x25, 0xc5, 0xc9, 0x7e, 0xce, 0x84, 0xa0, 0x04, 0x65, 0x8b, 0x6a, 0x46, 0xfa, 0xf7, 0xe2, 0xe8, 0x35, 0x23, 0x0a, 0xb4, 0x48, 0xc8, 0xc0, 0xdf, 0x22, 0x69, 0x92, 0x8d, 0xe5, 0xee, 0xd3, 0x98, 0x9b, 0x8f, 0xee, 0x8d, 0x25, 0xf3, 0xfb, 0xf8, 0x73, 0x99, 0x90, 0xe2, 0xfb, 0x78, 0xda, 0x97, 0x63, 0xe2, 0xec, 0xad, 0x81, 0xae, 0x56, 0x41, 0x86, 0x96, 0xfa, 0x84, 0x76, 0xde, 0x1b, 0x77, 0xdc, 0x37, 0xb7, 0xf2, 0xbb, 0xe2, 0x17, 0xeb, 0xc7, 0x18, 0xa4, 0xf5, 0xd5, 0xaa, 0xfc, 0x07, 0x91, 0xe5, 0x45, 0x7f, 0x6f, 0xb8, 0xc2, 0x66, 0xe4, 0x19, 0xa3, 0xf6, 0xd5, 0xa4, 0x22, 0x59, 0x50, 0x85, 0xcb, 0xb4, 0x7a, 0x99, 0x1b, 0x64, 0xc8, 0xd0, 0x4d, 0x88, 0x72, 0xd6, 0x71, 0xbf, 0x25, 0xf2, 0xbe, 0x33, 0xf9, 0x2e, 0x29, 0xd6, 0xa2, 0xb8, 0x37, 0xeb, 0xea, 0x88, 0x0f, 0xc9, 0x5f, 0x43, 0xd3, 0xdb, 0x48, 0x5f, 0x30, 0xec, 0xde, 0x89, 0x34, 0xa1, 0xb9, 0x43, 0x60, 0x47, 0x89, 0xd2, 0xff, 0xcf, 0x06, 0x57, 0xb6, 0x17, 0x2a, 0x3c, 0x5b, 0x6c, 0x9d, 0xd1, 0x0a, 0x4c, 0x71, 0x37, 0x76, 0x70, 0x0f, 0x7e, 0x7e, 0x0a, 0x71, 0x0a, 0x01, 0x4b, 0x92, 0x3b, 0xf2, 0x28, 0x23, 0x4d, 0xaf, 0x5e, 0x80, 0x7c, 0x8e, 0xb3, 0xe2, 0x6c, 0xb9, 0x7f, 0xd6, 0xc9, 0x3d, 0x6c, 0xee, 0x2a, 0x5d, 0x7a, 0xb6, 0x3c, 0x2c, 0x46, 0xe9, 0x1c, 0x5b, 0x8b, 0xe5, 0x04, 0x4f, 0xe9, 0x5d, 0x2a, 0x76, 0xe5, 0x4e, 0xe5, 0xdc, 0x32, 0x34, 0x12, 0xf9, 0x2f, 0x7d, 0xb6, 0xce, 0xb0, 0x3e, 0xe5, 0x30, 0x01, 0x25, 0xe2, 0x63, 0x28, 0xaf, 0x87, 0xea, 0x6b, 0x9a, 0xe7, 0x9e, 0x12, 0x9e, 0x33, 0xfe, 0x6e, 0x58, 0xda, 0xc6, 0x1a, 0x87, 0xf4, 0xc3, 0x81, 0x7a, 0xe1, 0xe5, 0xa0, 0xc9, 0x2d, 0x96, 0x0e, 0x44, 0xb7, 0x4a, 0x39, 0x29, 0x13, 0x57, 0xf2, 0x9a, 0x2c, 0x08, 0x2c, 0x4d, 0x2e, 0xec, 0x00, 0x86, 0xa3, 0x74, 0xf5, 0x42, 0xdc, 0xbd, 0x7f, 0xb5, 0x92, 0xab, 0xc5, 0xf7, 0xcd, 0x37, 0xa7, 0xfb, 0x05, 0x0a, 0x00, 0xc0, 0x87, 0x4a, 0x28, 0xcb, 0x1b, 0xb4, 0xbe, 0xd4, 0xe4, 0xeb, 0xa4, 0xc0, 0x87, 0x0f, 0x4a, 0xcf, 0x90, 0x92, 0x30, 0x17, 0x11, 0x47, 0xa6, 0x31, 0x8b, 0xbc, 0xd7, 0x32, 0x12, 0xca, 0x05, 0xdc, 0xad, 0x6a, 0x16, 0x16, 0xfc, 0xca, 0x50, 0x9a, 0x1d, 0xa1, 0x61, 0xee, 0xcf, 0xbf, 0xa2, 0x95, 0xd8, 0xe8, 0x9c, 0x86, 0xa5, 0xe2, 0xcc, 0xdd, 0x31, 0xcd, 0xa3, 0xd1, 0x28, 0xb3, 0xd1, 0xe6, 0x4b, 0x60, 0xc3, 0x63, 0x16, 0x74, 0x6a, 0x07, 0xa0, 0xb6, 0x3f, 0xf8, 0xc4, 0xab, 0x84, 0xfc, 0x7e, 0x68, 0xcc, 0xeb, 0x97, 0xa4, 0xbd, 0x65, 0x85, 0x11, 0x15, 0xc0, 0x8d, 0xed, 0xeb, 0x44, 0x2a, 0xd3, 0x38, 0x9b, 0xb2, 0xd8, 0x95, 0x83, 0x37, 0xd3, 0x46, 0xc6, 0xab, 0xfc, 0x78, 0x6c, 0x48, 0xb9, 0xc7, 0x2f, 0x2f, 0xb4, 0x03, 0x2f, 0x50, 0x31, 0x34, 0xe7, 0x89, 0x9f, 0xdb, 0x60, 0x12, 0x6c, 0x7b, 0xa4, 0x18, 0x1e, 0x58, 0x76, 0xa8, 0xa0, 0x7f, 0x40, 0xcf, 0xd9, 0x06, 0x4d, 0x00, 0x83, 0x95, 0x38, 0xb5, 0x3b, 0x26, 0xa5, 0x59, 0xd4, 0x08, 0x2e, 0x66, 0xf1, 0x2a, 0xa1, 0xcb, 0xd3, 0x96, 0x68, 0x90, 0x6f, 0x3c, 0x48, 0xbc, 0xc4, 0xf1, 0x4f, 0x77, 0x6b, 0xb7, 0x07, 0x6c, 0x70, 0x3f, 0xf0, 0x71, 0x60, 0xac, 0x2d, 0x6a, 0xa3, 0x9a, 0x7e, 0x6a, 0x0c, 0x5f, 0x6e, 0x1c, 0xaf, 0x90, 0xce, 0x62, 0xf3, 0xc8, 0x61, 0x3b, 0xe8, 0xa4, 0xd9, 0xea, 0xda, 0x12, 0x02, 0x55, 0x26, 0xcc, 0x3e, 0xab, 0x4c, 0x1f, 0x31, 0x49, 0x46, 0xf1, 0xbd, 0xdf, 0x18, 0x02, 0x31, 0xce, 0xa9, 0x72, 0xbd, 0xd5, 0xd1, 0x84, 0x2a, 0xed, 0xb3, 0xa1, 0xc7, 0x71, 0x4d, 0xa0, 0xa7, 0x82, 0x4d, 0x44, 0x09, 0xaa, 0x26, 0x06, 0x18, 0xbf, 0x64, 0x15, 0xd5, 0x0b, 0x3c, 0x9c, 0x51, 0xa9, 0x68, 0x43, 0x1f, 0x32, 0x32, 0xf8, 0x09, 0x9a, 0xce, 0xef, 0x02, 0x54, 0xec, 0xe7, 0x5c, 0xbd, 0x8e, 0xb0, 0x3b, 0xb7, 0x17, 0xea, 0x4a, 0x94, 0xa5, 0x0f, 0xac, 0x37, 0xa1, 0xb4, 0x36, 0x75, 0x95, 0x0b, 0xdb, 0xc1, 0x3d, 0xad, 0x67, 0x09, 0xe0, 0x96, 0x71, 0xdb, 0xe0, 0x71, 0x8a, 0xcc, 0x91, 0x17, 0xbb, 0x1a, 0x47, 0x52, 0x2f, 0x90, 0xb3, 0xe6, 0x2c, 0xaa, 0x6f, 0xd2, 0x48, 0xfa, 0xd7, 0xd3, 0xd9, 0xca, 0x1b, 0x2a, 0xad, 0x03, 0x92, 0x9f, 0xfb, 0x4e, 0x51, 0xc6, 0x9a, 0x78, 0xfd, 0x81, 0x71, 0x1b, 0xdd, 0xc6, 0x2f, 0x7b, 0x33, 0xa2, 0x3c, 0xae, 0xcd, 0x7e, 0xef, 0x00, 0xd7, 0xa2, 0x01, 0x95, 0xf3, 0xf7, 0x41, 0x50, 0x8c, 0x11, 0x8a, 0xf4, 0x66, 0x6c, 0xf2, 0x89, 0x7a, 0xf6, 0x45, 0x02, 0x02, 0xce, 0xb2, 0x1c, 0xd0, 0x4c, 0xc3, 0x89, 0xe3, 0x41, 0x93, 0x4e, 0x3c, 0x80, 0x3b, 0x6a, 0xee, 0x9d, 0x8d, 0xb8, 0x75, 0xf4, 0x05, 0x16, 0x48, 0xed, 0xfc, 0xc7, 0xb2, 0x7f, 0x1f, 0x16, 0xdd, 0xf3, 0x20, 0x3c, 0x30, 0xeb, 0xab, 0x84, 0xda, 0xa2, 0x9c, 0xad, 0xaf, 0x75, 0x6f, 0x90, 0x34, 0xa3, 0xf7, 0x03, 0xf5, 0x51, 0x53, 0xfc, 0x1f, 0xd1, 0x1f, 0xfa, 0x4a, 0x23, 0xe7, 0xa0, 0x97, 0xbc, 0xe1, 0xa3, 0xfb, 0x87, 0xdb, 0xe7, 0xda, 0x2a, 0x72, 0xe5, 0xd8, 0x8a, 0x85, 0x50, 0xec, 0x91, 0xe9, 0xf8, 0xb6, 0x2f, 0x5e, 0xee, 0x12, 0x9e, 0xc2, 0xe9, 0xed, 0xeb, 0x85, 0xe8, 0x57, 0xb2, 0x5d, 0x19, 0xda, 0x29, 0x3b, 0xfa, 0x0a, 0x5f, 0x7d, 0xbe, 0x5e, 0xc6, 0x65, 0xf2, 0x3e, 0xf0, 0xca, 0x60, 0x5d, 0x96, 0x0d, 0x34, 0x49, 0xde, 0x4f, 0x5d, 0x41, 0xdd, 0xe1, 0x36, 0x46, 0x5b, 0xfc, 0x66, 0x74, 0xd7, 0xb3, 0x05, 0x93, 0xcb, 0x25, 0x00, 0xea, 0x32, 0xf7, 0xbe, 0x53, 0x46, 0x02, 0x03, 0x95, 0x8e, 0x48, 0x15, 0xed, 0x18, 0x2d, 0x1e, 0xee, 0x04, 0xe4, 0xd2, 0x8c, 0x42, 0x27, 0x51, 0x73, 0x9b, 0x2b, 0x4f, 0x9d, 0xf6, 0xd3, 0x72, 0x23, 0xd4, 0x24, 0xfb, 0x53, 0x1e, 0xf9, 0xa9, 0x04, 0x20, 0xf7, 0xda, 0x26, 0xd5, 0xc4, 0xf4, 0x9d, 0x65, 0x74, 0x03, 0x50, 0xec, 0x44, 0xa4, 0x7c, 0x7d, 0x8b, 0x21, 0x4f, 0x67, 0xed, 0xdd, 0xb2, 0xb6, 0xd2, 0xf3, 0x66, 0xfd, 0x16, 0x1a, 0x52, 0x53, 0x03, 0xcc, 0x1b, 0x9c, 0x7c, 0xa7, 0xf6, 0x0a, 0x7a, 0x13, 0xba, 0xe3, 0xbd, 0x25, 0x3a, 0x84, 0xbb, 0xc3, 0xd1, 0xa6, 0xdd, 0x09, 0x3e, 0xe0, 0xea, 0xec, 0xb2, 0x6d, 0xc3, 0x1d, 0x28, 0x30, 0x52, 0x30, 0xf5, 0xf5, 0xbd, 0xfe, 0xa0, 0xfa, 0xdf, 0x48, 0xf3, 0xae, 0xf8, 0x9d, 0x52, 0xb8, 0xa3, 0x7d, 0x4c, 0x3b, 0x09, 0xbe, 0x70, 0x58, 0x55, 0x2f, 0x62, 0xf5, 0x68, 0x7c, 0x2e, 0xbd, 0xcd, 0x51, 0xdb, 0x68, 0xef, 0xc2, 0x44, 0x3d, 0x89, 0xeb, 0x23, 0xd5, 0x5f, 0xd3, 0x6f, 0x21, 0x2c, 0x97, 0xe8, 0xaf, 0xdb, 0xc4, 0xf0, 0x28, 0xf9, 0x04, 0x9c, 0x1e, 0x6b, 0xfd, 0x0b, 0x04, 0x5c, 0x76, 0xf6, 0x7e, 0x7a, 0xbb, 0x89, 0xdc, 0x62, 0x43, 0x71, 0xe0, 0x58, 0x91, 0x37, 0xc8, 0x3c, 0x58, 0xcc, 0x88, 0xb9, 0xe2, 0x65, 0x58, 0xc0, 0xb2, 0x88, 0x6e, 0x35, 0x69, 0x67, 0x0d, 0xe8, 0xe6, 0x6e, 0xbe, 0xc6, 0xb1, 0x18, 0xde, 0x51, 0x9a, 0x06, 0x58, 0x4d, 0x9d, 0x52, 0xb4, 0xbc, 0x09, 0x21, 0x51, 0x0d, 0xe2, 0x77, 0xee, 0x91, 0x83, 0x50, 0x6f, 0x2e, 0x87, 0xec, 0xde, 0x57, 0xea, 0x6a, 0xb1, 0x3b, 0x6c, 0x98, 0x4b, 0x3d, 0x36, 0x0a, 0xc5, 0xa5, 0xc0, 0x69, 0xed, 0x95, 0xf2, 0x0e, 0x8f, 0x3e, 0x8a, 0xcf, 0xf4, 0x53, 0xbd, 0x19, 0xa9, 0xbe, 0x21, 0x40, 0x81, 0x93, 0xca, 0x12, 0xdd, 0x42, 0xb3, 0xb2, 0x2b, 0x10, 0x60, 0xa4, 0xad, 0xc8, 0xc2, 0x24, 0x7c, 0xad, 0x5b, 0xbc, 0xcc, 0xb4, 0xa3, 0x15, 0x71, 0xf0, 0xa9, 0x0e, 0xa3, 0x4e, 0xfd, 0x0b, 0xfe, 0x82, 0xce, 0x8f, 0xcc, 0x41, 0x50, 0x0e, 0x87, 0xb1, 0x60, 0xfc, 0x9a, 0x1e, 0x6b, 0x2a, 0x68, 0xee, 0x8c, 0x52, 0x8f, 0xd7, 0xf4, 0xf1, 0x6e, 0x4f, 0x8f, 0x54, 0xe5, 0x44, 0xe5, 0xf6, 0x5b, 0x0e, 0x3e, 0x09, 0x06, 0xa2, 0x09, 0x53, 0x66, 0x08, 0x7e, 0x3b, 0x13, 0x0f, 0x83, 0x24, 0xb9, 0x3f, 0xcc, 0xf9, 0x61, 0x0f, 0x47, 0x09, 0xf2, 0x58, 0xb7, 0x16, 0xf7, 0x0a, 0x9e, 0xa8, 0xa2, 0x1e, 0x61, 0xa7, 0x11, 0xcb, 0xa7, 0x29, 0xd1, 0xfd, 0x02, 0x89, 0xa1, 0x03, 0xd1, 0xb9, 0x78, 0x87, 0x65, 0xd9, 0xc9, 0xc4, 0x62, 0x08, 0x05, 0xf3, 0x68, 0x7a, 0x62, 0x06, 0xf3, 0xca, 0xdb, 0x99, 0x80, 0x92, 0x77, 0x26, 0xf2, 0x3a, 0xcf, 0x78, 0x33, 0x0d, 0xca, 0x62, 0x1e, 0x92, 0xac, 0xb0, 0x9d, 0x19, 0x4f, 0x5e, 0x0e, 0x94, 0xaf, 0x08, 0xec, 0xa8, 0xad, 0xa2, 0xab, 0x04, 0x0c, 0x69, 0xe3, 0xf2, 0xc0, 0x19, 0xb1, 0x2b, 0x68, 0x61, 0x5b, 0xf0, 0x19, 0x94, 0x32, 0x56, 0x5d, 0xa1, 0xbd, 0xe2, 0x7b, 0x45, 0x13, 0x55, 0xf9, 0x7f, 0x89, 0xc9, 0x60, 0x45, 0x8d, 0xfd, 0x3f, 0x75, 0xd2, 0xee, 0x72, 0x0e, 0xae, 0xa7, 0xa4, 0xa0, 0xc0, 0x59, 0x13, 0x01, 0xd5, 0xae, 0x93, 0x42, 0x0c, 0x5b, 0xd6, 0xe1, 0x39, 0xf5, 0xea, 0x40, 0x88, 0x05, 0x03, 0x56, 0x63, 0x5e, 0x7b, 0xa5, 0x95, 0xae, 0x17, 0x6c, 0xaf, 0x54, 0x8c, 0x1d, 0xaa, 0x71, 0x42, 0x11, 0xcf, 0x42, 0x57, 0x7b, 0xd4, 0xad, 0xe7, 0x9b, 0x48, 0x19, 0x8b, 0x34, 0x31, 0x83, 0x1f, 0x3f, 0xf3, 0xce, 0xc9, 0xe1, 0x73, 0x5b, 0x36, 0x9b, 0x7d, 0xda, 0x27, 0xc1, 0x63, 0x60, 0x2d, 0x2d, 0xe7, 0xb9, 0xb0, 0x34, 0x5b, 0xff, 0x36, 0xd9, 0x07, 0x6b, 0xe2, 0x41, 0xcb, 0x6c, 0x3b, 0x67, 0x06, 0xf6, 0x30, 0x11, 0xb6, 0x1d, 0x58, 0x03, 0xe0, 0xe2, 0x7e, 0x72, 0x32, 0x4d, 0x5c, 0xbb, 0xe7, 0xbc, 0xa7, 0x55, 0xeb, 0x7a, 0x4c, 0x04, 0x3f, 0x93, 0xfa, 0x50, 0xa0, 0xe7, 0xe0, 0x36, 0x63, 0x7e, 0xb8, 0x1d, 0xa4, 0x1b, 0x04, 0x0c, 0x9f, 0x14, 0x97, 0x19, 0x5e, 0x60, 0x58, 0x25, 0x95, 0xf2, 0x43, 0xc6, 0xca, 0x45, 0xb0, 0x85, 0xb8, 0x39, 0xd8, 0x4a, 0xf6, 0x1d, 0x95, 0x14, 0xd4, 0x0d, 0x69, 0xed, 0x86, 0x7e, 0xc2, 0x1e, 0x84, 0x17, 0x7c, 0x9f, 0x30, 0xc3, 0xa8, 0xd1, 0xb9, 0x04, 0x8c, 0x6f, 0x40, 0x8a, 0xea, 0xc2, 0x3a, 0x04, 0x86, 0x15, 0x16, 0x36, 0xe2, 0x69, 0x1f, 0x4b, 0x4c, 0x6a, 0xa3, 0x6d, 0x1a, 0xa1, 0x55, 0x94, 0x35, 0xea, 0xf0, 0x9b, 0xd4, 0x29, 0x1d, 0x99, 0x8a, 0x39, 0x97, 0x6e, 0x83, 0x25, 0x8d, 0x9c, 0x0b, 0x9b, 0x48, 0x59, 0x4f, 0x9d, 0x0d, 0xe2, 0x68, 0x7a, 0x45, 0x11, 0x95, 0xfd, 0xdb, 0x32, 0xc8, 0xe4, 0xe6, 0x13, 0x65, 0x93, 0x88, 0x5a, 0x46, 0x0a, 0x15, 0x1b, 0x02, 0x15, 0x78, 0xaa, 0x6f, 0xc2, 0xd3, 0xae, 0x65, 0x18, 0x66, 0x77, 0xc5, 0x06, 0xb2, 0x92, 0xba, 0x9a, 0xde, 0x9a, 0x3f, 0x74, 0x59, 0x50, 0xe2, 0x79, 0xc1, 0xee, 0xc7, 0xcc, 0x04, 0xb9, 0xef, 0xfa, 0xc5, 0xd6, 0xba, 0x74, 0x01, 0x5e, 0xab, 0x43, 0xf2, 0xb5, 0x6c, 0xf7, 0x33, 0x17, 0x12, 0xe0, 0x26, 0x73, 0xa1, 0x81, 0x93, 0x7d, 0xd3, 0x42, 0x91, 0xff, 0x15, 0x65, 0xaa, 0x6f, 0xd3, 0x3b, 0x3a, 0xc7, 0xf5, 0x98, 0x18, 0x91, 0xaa, 0x84, 0x78, 0x41, 0x64, 0x33, 0x10, 0xc8, 0x24, 0x38, 0x7a, 0x66, 0xf7, 0xf5, 0xda, 0xc0, 0xc0, 0x56, 0xc0, 0x32, 0x39, 0xbf, 0x50, 0x66, 0x35, 0x42, 0xa0, 0x26, 0x28, 0x16, 0x61, 0x6e, 0xe8, 0x44, 0xc2, 0xc6, 0xb5, 0xa4, 0x91, 0xce, 0x78, 0x08, 0xa3, 0x1b, 0x48, 0xb7, 0x77, 0x41, 0x32, 0x1d, 0x16, 0x31, 0x3a, 0xc0, 0x3d, 0xc6, 0x9d, 0x76, 0xbe, 0x9a, 0x59, 0xd6, 0x24, 0x1e, 0xef, 0xec, 0x96, 0xea, 0x68, 0x31, 0xfe, 0x51, 0x96, 0xb9, 0x6a, 0x39, 0x9c, 0xaf, 0xb2, 0x29, 0xb1, 0xff, 0x5b, 0xa4, 0x20, 0x52, 0xbb, 0xb6, 0x93, 0x3f, 0x5e, 0xcc, 0x92, 0xbf, 0xa9, 0xc9, 0x47, 0xe2, 0xbd, 0x55, 0x84, 0xc1, 0x9e, 0x78, 0x07, 0xb4, 0x95, 0x69, 0xfc, 0xc5, 0xd2, 0xa0, 0xc3, 0x64, 0x56, 0x32, 0xf4, 0x5c, 0x10, 0x5e, 0xa0, 0x05, 0x46, 0x63, 0xda, 0xbb, 0x37, 0x95, 0x76, 0x90, 0xff, 0xb0, 0x11, 0x3e, 0xba, 0x6c, 0x52, 0x60, 0xec, 0x52, 0x6e, 0xe1, 0x21, 0xcd, 0xf2, 0xb4, 0xd0, 0x84, 0xbd, 0xc5, 0x85, 0xe7, 0x4b, 0x30, 0x3f, 0x08, 0x3a, 0xb2, 0x17, 0xad, 0x06, 0x5c, 0x23, 0xa3, 0x18, 0x8f, 0x9a, 0x55, 0xff, 0x24, 0x39, 0x9d, 0xfd, 0xeb, 0xe5, 0xd9, 0xc5, 0x57, 0x91, 0x42, 0x83, 0x77, 0x62, 0x79, 0x1d, 0x28, 0x11, 0x63, 0xb8, 0x8a, 0x92, 0x37, 0x7f, 0xb0, 0xf3, 0xd5, 0x9f, 0x9c, 0x86, 0x5a, 0x96, 0x6a, 0x42, 0xf1, 0xae, 0xcb, 0x67, 0xec, 0xc4, 0xb5, 0x61, 0x13, 0x4e, 0x59, 0xef, 0x3b, 0x9d, 0x56, 0x84, 0x1b, 0x5f, 0x2c, 0xee, 0x5c, 0x67, 0xf3, 0x35, 0xef, 0xb1, 0x4d, 0xc6, 0xa3, 0xa0, 0x99, 0xd0, 0xf7, 0x8b, 0x69, 0xef, 0x2c, 0x78, 0x36, 0x08, 0x9f, 0x27, 0x53, 0x74, 0x56, 0x53, 0x20, 0x60, 0xd9, 0x34, 0x80, 0x73, 0x43, 0x48, 0x8d, 0xb2, 0x98, 0x53, 0x8a, 0xa1, 0x59, 0xa5, 0x18, 0xab, 0x56, 0x9b, 0xad, 0xc4, 0xc4, 0x68, 0x43, 0x4d, 0x8f, 0x15, 0x4d, 0x38, 0xf2, 0xc7, 0xef, 0x6c, 0x44, 0x41, 0x6e, 0x6b, 0x15, 0xa9, 0xe6, 0x32, 0x79, 0x8f, 0x3b, 0x61, 0xa4, 0x2b, 0x51, 0x9b, 0xb7, 0xe6, 0x80, 0x30, 0xda, 0x1d, 0x42, 0xf9, 0x8b, 0x21, 0x2f, 0x84, 0x35, 0x82, 0x2c, 0x71, 0x05, 0x8d, 0xdf, 0x1c, 0xf9, 0x13, 0x66, 0x7d, 0x3a, 0x6c, 0x48, 0x4c, 0xab, 0xbc, 0xab, 0x68, 0xc2, 0x75, 0xc8, 0x79, 0x97, 0x1d, 0x9d, 0xd4, 0x3a, 0x52, 0xe1, 0xa0, 0x4a, 0x0b, 0x3d, 0x37, 0xc3, 0x20, 0xb9, 0xcf, 0x18, 0x0d, 0x75, 0x5a, 0x82, 0xf3, 0x99, 0xab, 0x97, 0xdf, 0x8e, 0xd9, 0x1e, 0x4f, 0x6f, 0xe8, 0x22, 0xf2, 0xba, 0xa6, 0x45, 0xb0, 0x4c, 0xd4, 0x57, 0xea, 0x8c, 0x86, 0x27, 0x03, 0xe6, 0xcd, 0x99, 0x1f, 0x7b, 0x92, 0xf9, 0x2a, 0x16, 0xc5, 0x8f, 0x1d, 0x62, 0xb8, 0x74, 0x7c, 0x5b, 0xc5, 0xa4, 0x23, 0x03, 0x37, 0x53, 0x43, 0x56, 0x68, 0x85, 0xa8, 0x7f, 0x26, 0xd9, 0x3d, 0x4c ],
+    const [ 0x6b, 0x1d, 0x94, 0xbc, 0x0c, 0x6e, 0x45, 0xfc, 0x90, 0x5c, 0x50, 0x9e, 0xa6, 0x67, 0x85, 0x3e, 0x4b, 0x2c, 0x5a, 0x88, 0x48, 0xdd, 0x91, 0x4e, 0xfc, 0xef, 0x14, 0xd9, 0x5b, 0x12, 0x24, 0x7d, 0x37, 0x66, 0xb2, 0x70, 0xbf, 0xec, 0x0d, 0xdd, 0x45, 0x3b, 0xbe, 0x33, 0x44, 0x74, 0xb0, 0xc3, 0xa1, 0x77, 0x95, 0x8a, 0x31, 0x57, 0x84, 0x4b, 0x7c, 0x0c, 0xe7, 0xe2, 0xc0, 0x68, 0x94, 0xd4, 0x39, 0x4d, 0x3a, 0x2a, 0xa0, 0x1c, 0xff, 0x80, 0xf2, 0x70, 0x67, 0x59, 0x72, 0x0d, 0x78, 0xb5, 0xf1, 0x13, 0x1c, 0xe6, 0x4d, 0x78, 0xc6, 0x9f, 0x38, 0xb4, 0x58, 0x4e, 0x3a, 0xbe, 0x45, 0xab, 0xf9, 0x38, 0xf2, 0x91, 0xb9, 0xe6, 0x63, 0x0e, 0x1f, 0x65, 0x13, 0xb6, 0x3a, 0x1a, 0x23, 0x3c, 0xc4, 0x68, 0xb7, 0x43, 0xa4, 0x26, 0x9e, 0x71, 0xb8, 0x50, 0x31, 0xc5, 0xd2, 0xfc, 0x7d, 0x2b, 0x00, 0x90, 0xa4, 0x4e, 0x11, 0x33, 0x80, 0xae, 0x54, 0x81, 0x8a, 0xf2, 0xa3, 0x83, 0xfa, 0x7f, 0xa0, 0xde, 0x30, 0x49, 0x3f, 0x4a, 0x53, 0xe9, 0x85, 0x46, 0x38, 0xf1, 0x8f, 0x0b, 0x85, 0x7c, 0xd5, 0xbe, 0x16, 0x09, 0xb0, 0xe9, 0x9f, 0x89, 0x1a, 0x2c, 0x93, 0xb6, 0xb5, 0x30, 0x45, 0xa7, 0x10, 0xdd, 0x4e, 0xa1, 0x25, 0xcd, 0x2e, 0x31, 0x26, 0x00, 0x36, 0x77, 0x79, 0xd1, 0xa5, 0xc5, 0x01, 0x28, 0x11, 0x69, 0x9f, 0xf2, 0x08, 0xc6, 0xf8, 0xce, 0xf8, 0xaa, 0x79, 0x09, 0x4c, 0xdb, 0x99, 0xcd, 0xd8, 0xf3, 0x5e, 0x95, 0x77, 0x6e, 0x23, 0xe4, 0xf2, 0x02, 0x98, 0x37, 0x24, 0x2f, 0x0a, 0x38, 0x5c, 0x16, 0xe5, 0x34, 0x03, 0x8e, 0x77, 0xcf, 0x7f, 0x75, 0xf6, 0xf7, 0x56, 0x44, 0xc5, 0x16, 0x97, 0xe6, 0xf3, 0x8c, 0x76, 0xcb, 0x05, 0x5c, 0x36, 0x38, 0xf5, 0x25, 0x4c, 0xe1, 0x7a, 0x55, 0xc1, 0xb9, 0x8a, 0x99, 0xd8, 0x09, 0x1d, 0x98, 0xf1, 0xbf, 0x35, 0xe0, 0xad, 0x09, 0x1b, 0x20, 0x53, 0x23, 0xeb, 0x99, 0x72, 0x6e, 0x52, 0xcf, 0xc8, 0xc1, 0x97, 0x84, 0x63, 0x03, 0xd8, 0xe6, 0x06, 0xfa, 0x97, 0x08, 0xce, 0x5e, 0x75, 0x8f, 0x15, 0x32, 0x3c, 0xae, 0x97, 0x54, 0x23, 0x54, 0xd3, 0x52, 0x4e, 0xa3, 0xb5, 0x7f, 0x95, 0xa5, 0x71, 0x46, 0x86, 0x3a, 0xb2, 0xbf, 0xad, 0x55, 0xf4, 0x80, 0x13, 0x68, 0x2e, 0xb6, 0x04, 0x1d, 0xb5, 0x74, 0x15, 0x47, 0x5d, 0x4a, 0x66, 0x18, 0xe1, 0x1a, 0x25, 0x94, 0x85, 0x27, 0x53, 0x45, 0xf9, 0x6f, 0xcb, 0x31, 0x81, 0x3b, 0x80, 0x09, 0x53, 0xf4, 0x06, 0xa3, 0x40, 0x38, 0x54, 0xaa, 0x97, 0x2d, 0xc8, 0x95, 0x47, 0x15, 0x6b, 0xd5, 0x43, 0x23, 0x77, 0x53, 0x2b, 0x8d, 0x16, 0x19, 0x28, 0xe3, 0x6d, 0x4f, 0x18, 0x9f, 0xd9, 0x6a, 0xeb, 0xfd, 0x78, 0xa0, 0x4c, 0x0d, 0xec, 0x9f, 0x84, 0x06, 0x5b, 0x7e, 0x9c, 0xdd, 0xba, 0xf4, 0xc2, 0x16, 0x4c, 0xc8, 0xef, 0xdb, 0x65, 0x88, 0xc6, 0x4b, 0x74, 0x7e, 0xbe, 0x14, 0x40, 0xe0, 0x83, 0x44, 0x72, 0x47, 0x9a, 0x5c, 0x54, 0x62, 0x44, 0xa6, 0xd8, 0xec, 0xa6, 0xc9, 0xdc, 0xdb, 0x26, 0x9b, 0xac, 0xdb, 0x18, 0x36, 0xc9, 0xfa, 0x9a, 0x4e, 0xe9, 0xa5, 0xbc, 0xc2, 0x3e, 0xd3, 0xe5, 0x70, 0xfb, 0x80, 0x72, 0x4e, 0x15, 0x5d, 0x9f, 0xb7, 0x46, 0xc6, 0xab, 0x02, 0x58, 0xf4, 0x37, 0x59, 0xa0, 0x74, 0xf0, 0xc8, 0xc9, 0xd7, 0x6d, 0x95, 0xd3, 0xac, 0x5a, 0xd0, 0x5a, 0xab, 0xd7, 0x2a, 0x1c, 0x33, 0x1b, 0x0b, 0xb6, 0xf7, 0x5d, 0xde, 0xae, 0xf4, 0xf4, 0xb0, 0xb6, 0xa6, 0xbd, 0xf9, 0x2f, 0x7b, 0xbd, 0xb9, 0xed, 0x88, 0x07, 0xc7, 0x3a, 0x7a, 0xe0, 0x66, 0x1d, 0xd0, 0x22, 0x1a, 0xdc, 0x48, 0xde, 0xba, 0xbf, 0x97, 0x45, 0xc5, 0x17, 0x5d, 0xc9, 0xf9, 0x7f, 0x58, 0x7f, 0x22, 0x62, 0xd8, 0xc8, 0x31, 0xbd, 0x73, 0x30, 0x8d, 0x26, 0xf9, 0x96, 0xae, 0x0e, 0xab, 0x8e, 0xe7, 0x43, 0xa7, 0x03, 0x83, 0xb8, 0xa7, 0x21, 0x14, 0x89, 0xeb, 0x71, 0x08, 0x3a, 0x74, 0x46, 0x7d, 0x40, 0x73, 0x59, 0x57, 0xc2, 0x01, 0xb0, 0x8f, 0xa0, 0x10, 0xc4, 0xcd, 0xb5, 0xa2, 0xe2, 0x3a, 0x59, 0x39, 0xd2, 0x8f, 0x2a, 0x8e, 0xb7, 0x73, 0x0d, 0x85, 0x36, 0x03, 0x6f, 0x61, 0xda, 0xb2, 0xd1, 0x34, 0xb7, 0x53, 0x83, 0x9a, 0x4e, 0x74, 0xaf, 0xa7, 0xb1, 0xee, 0x9a, 0x1e, 0xe8, 0xba, 0x27, 0xe4, 0x92, 0x06, 0x9d, 0xb4, 0xcf, 0x88, 0xa9, 0x13, 0x5e, 0x13, 0xa7, 0x87, 0x03, 0x68, 0x1d, 0x04, 0x2c, 0x4e, 0x88, 0xa7, 0xd3, 0xe5, 0x5c, 0xa7, 0xa6, 0x37, 0x46, 0x88, 0x66, 0x10, 0xb4, 0x91, 0x8d, 0x10, 0x97, 0x81, 0x33, 0xfe, 0x67, 0x7e, 0x32, 0x5f, 0x68, 0x4e, 0x89, 0x47, 0x2d, 0xc9, 0xfe, 0x70, 0x5a, 0x8e, 0x08, 0x89, 0xae, 0xf6, 0xeb, 0xd0, 0x40, 0x46, 0x25, 0xe3, 0x08, 0x29, 0x09, 0xd3, 0xa2, 0x5d, 0xaa, 0x7b, 0x4f, 0xac, 0xfa, 0x10, 0x3d, 0x1e, 0x33, 0xf9, 0x08, 0x6d, 0x76, 0xe0, 0x80, 0xb9, 0xb2, 0x09, 0xad, 0x7d, 0xc8, 0xe2, 0x10, 0xc2, 0xed, 0xdc, 0x2c, 0x92, 0x4f, 0x7a, 0x45, 0xb0, 0xfb, 0xa7, 0x68, 0x86, 0xfe, 0x4d, 0xab, 0x5f, 0xca, 0x23, 0xb6, 0xd6, 0xdc, 0xc7, 0x82, 0x8e, 0x9c, 0x0c, 0x61, 0x24, 0x85, 0x95, 0x3f, 0x62, 0x85, 0xa3, 0x27, 0xb6, 0xa7, 0x2b, 0x09, 0xe2, 0xef, 0x2c, 0xba, 0xf4, 0x85, 0x3f, 0x3c, 0x79, 0x17, 0x70, 0x40, 0xee, 0x78, 0x4c, 0xe9, 0x77, 0x8d, 0x3b, 0xd3, 0xd4, 0x69, 0x10, 0x54, 0x90, 0xb7, 0xdf, 0x01, 0x7b, 0x58, 0x0e, 0x74, 0x5b, 0x4e, 0xaf, 0x4d, 0xdf, 0xd9, 0x0d, 0x77, 0xd4, 0xdf, 0x85, 0xad, 0x9b, 0x91, 0x98, 0x3c, 0xdb, 0x4c, 0x3e, 0x0a, 0x73, 0xbd, 0x7c, 0xd7, 0xb3, 0x49, 0x38, 0xc3, 0xcb, 0xac, 0x4d, 0x10, 0x83, 0xe0, 0xdb, 0x2a, 0x2d, 0x40, 0xe0, 0xe4, 0xd8, 0xed, 0x0d, 0x05, 0xc7, 0x71, 0xd2, 0x03, 0x22, 0xa2, 0xbc, 0x0e, 0xea, 0xc9, 0x00, 0x50, 0x32, 0x04, 0x58, 0x74, 0x8d, 0xe9, 0x0d, 0x65, 0xc3, 0x6c, 0x55, 0x58, 0xc8, 0x03, 0xe0, 0x0c, 0xee, 0x08, 0xae, 0x50, 0x59, 0x5e, 0x23, 0xc7, 0xb3, 0x57, 0x5d, 0xe8, 0x22, 0xd5, 0xc5, 0x48, 0x77, 0xb0, 0xe4, 0x1c, 0xa9, 0x58, 0x79, 0xf9, 0x81, 0xbc, 0xc8, 0xdf, 0x96, 0x6a, 0x34, 0x76, 0x7c, 0xf7, 0x10, 0x97, 0x39, 0xa1, 0xb3, 0x0e, 0xf8, 0x33, 0xca, 0x9f, 0x02, 0x29, 0xf3, 0x47, 0xe9, 0x15, 0x87, 0xc3, 0x06, 0x41, 0xb6, 0x57, 0x26, 0x96, 0xda, 0xc8, 0x81, 0xbc, 0x05, 0xaa, 0xec, 0x83, 0xdc, 0xe2, 0x4f, 0x82, 0xa9, 0x63, 0x58, 0xfe, 0xab, 0x3b, 0x71, 0x0d, 0xb1, 0xd3, 0xf0, 0xfa, 0xe7, 0x72, 0x8e, 0xec, 0xef, 0x04, 0x1b, 0xc3, 0x33, 0x1a, 0x70, 0x43, 0x7a, 0x31, 0xa4, 0x74, 0xba, 0x37, 0x83, 0x48, 0x2d, 0x4b, 0x3b, 0x7f, 0xa7, 0xc5, 0x59, 0xc8, 0x27, 0x76, 0xf4, 0x29, 0xac, 0x31, 0x28, 0xa0, 0x4a, 0x89, 0xc7, 0x0b, 0x7c, 0xdd, 0x4a, 0x45, 0xbc, 0x92, 0x0e, 0x92, 0x51, 0xa0, 0xbd, 0x3d, 0x69, 0x50, 0x09, 0x7f, 0x67, 0x44, 0xa1, 0xa3, 0x7e, 0xb7, 0x5d, 0x68, 0x7f, 0x06, 0xbc, 0xa7, 0xef, 0x6f, 0x91, 0x35, 0x5d, 0x19, 0xf9, 0x0b, 0xf2, 0x55, 0x90, 0xa4, 0x4a, 0x24, 0xe5, 0xa7, 0x82, 0xf9, 0x2b, 0xc6, 0x93, 0xc0, 0x31, 0xe6, 0xde, 0x1e, 0x94, 0x80, 0x08, 0xfb, 0x33, 0x47, 0x07, 0x3e, 0xe3, 0x0b, 0x7d, 0xd7, 0x64, 0xdd, 0x45, 0x03, 0x94, 0x74, 0x4c, 0xcb, 0xe3, 0xcf, 0xa3, 0xce, 0x07, 0x1c, 0xd2, 0x41, 0xf1, 0xd9, 0x6e, 0x34, 0xff, 0x39, 0xee, 0x17, 0x73, 0xc9, 0xba, 0x7c, 0x24, 0x53, 0x85, 0x1f, 0x73, 0x02, 0xdd, 0x23, 0x81, 0xc8, 0x00, 0x9e, 0x9f, 0xfd, 0xf2, 0x58, 0x06, 0x49, 0xcc, 0xd0, 0xc9, 0xc3, 0x57, 0x80, 0x07, 0x5a, 0xd9, 0x62, 0x65, 0x75, 0x2f, 0xb3, 0xbb, 0xd6, 0x1c, 0xf7, 0x0e, 0xc4, 0xe1, 0x3d, 0xbf, 0x69, 0x0e, 0xa4, 0x01, 0x79, 0x97, 0x1e, 0x90, 0x14, 0x2a, 0x74, 0xa1, 0xee, 0xc0, 0x8b, 0x14, 0xad, 0x73, 0xe5, 0xf1, 0x92, 0x8f, 0x6a, 0x12, 0x5c, 0xeb, 0x69, 0x1d, 0x69, 0x7a, 0xda, 0xb6, 0x1f, 0x1d, 0xe6, 0xf2, 0x8a, 0xbb, 0xa9, 0x0e, 0x46, 0x94, 0x36, 0x61, 0xa0, 0xd2, 0xdb, 0x8f, 0xf8, 0x61, 0xa7, 0x00, 0x6a, 0x01, 0x2a, 0x90, 0xad, 0x9a, 0x7c, 0x88, 0x3a, 0xcf, 0x81, 0xce, 0xb1, 0xd5, 0x6a, 0x58, 0x79, 0x86, 0x7f, 0xe6, 0xa7, 0xb1, 0x1c, 0xf1, 0x22, 0xb5, 0xfa, 0xde, 0x04, 0x4e, 0xb0, 0x78, 0x43, 0xae, 0x7a, 0x9d, 0x90, 0xd0, 0x38, 0x37, 0x7f, 0x09, 0xba, 0x6f, 0xe9, 0xe0, 0x3a, 0x1d, 0x8f, 0x1f, 0x2a, 0x82, 0xff, 0x2a, 0x31, 0x39, 0xbc, 0x90, 0x70, 0x6b, 0x99, 0xe0, 0x09, 0x43, 0x66, 0xbe, 0xe2, 0xa1, 0xce, 0x35, 0xa6, 0x13, 0x80, 0x4f, 0x0d, 0x01, 0x8d, 0xe3, 0x5e, 0x27, 0x11, 0xaf, 0x32, 0x48, 0x16, 0xa6, 0x7a, 0x21, 0xb5, 0x8b, 0xc3, 0x9d, 0x7e, 0xbf, 0xb9, 0x47, 0x1b, 0x58, 0xea, 0x04, 0x2f, 0x72, 0xcd, 0x02, 0x84, 0xca, 0x03, 0xec, 0x66, 0x89, 0xdc, 0x60, 0x4a, 0x5d, 0x1d, 0xa2, 0xb4, 0xce, 0x01, 0x92, 0x57, 0xd0, 0x7d, 0xdb, 0x7d, 0x94, 0xc8, 0x6e, 0xa9, 0xa4, 0x1b, 0x2f, 0x7b, 0x2f, 0xb6, 0xed, 0xd5, 0xa1, 0x23, 0x98, 0x3c, 0x77, 0xbe, 0xae, 0x81, 0x52, 0x75, 0xf7, 0xa0, 0x4a, 0xcd, 0x72, 0xe8, 0x84, 0x25, 0x8f, 0x5c, 0x07, 0x3f, 0x9e, 0x5a, 0xcb, 0xfc, 0x88, 0x7a, 0x13, 0x67, 0xbd, 0xb9, 0xfd, 0xf5, 0x6d, 0xd7, 0x58, 0x0c, 0xfb, 0xfd, 0xb5, 0xc1, 0xaf, 0xa3, 0xc1, 0xe6, 0xab, 0xb1, 0xd2, 0x44, 0x20, 0xe4, 0xbf, 0x25, 0xc1, 0x74, 0xf5, 0x16, 0x78, 0xf4, 0xc7, 0xea, 0x58, 0x79, 0x06, 0x02, 0xd4, 0xfe, 0xd2, 0xcc, 0x2e, 0x07, 0xaf, 0x8a, 0x32, 0x85, 0xdc, 0x55, 0x23, 0xfa, 0xe0, 0x61, 0xf6, 0xdd, 0x65, 0x82, 0xbe, 0x40, 0x49, 0xef, 0x68, 0xb0, 0xf3, 0x47, 0xa8, 0x5d, 0xe3, 0xd1, 0x33, 0x7b, 0x8d, 0x08, 0x2f, 0xe7, 0x68, 0x57, 0xe7, 0x0e, 0x42, 0x21, 0xc4, 0x0b, 0xd6, 0x04, 0x79, 0x0f, 0xa0, 0x5f, 0x7d, 0x06, 0xf0, 0x11, 0xbe, 0x77, 0x3e, 0x84, 0x94, 0xac, 0xbd, 0xeb, 0xf3, 0x14, 0x32, 0xc7, 0xe6, 0xe5, 0x07, 0xb0, 0x38, 0x05, 0x9b, 0x52, 0x74, 0x2b, 0xdd, 0xb6, 0x11, 0x42, 0x19, 0xc3, 0xe6, 0x0e, 0x12, 0x04, 0xe4, 0x11, 0x50, 0xab, 0x03, 0xb0, 0xbb, 0xd6, 0x7d, 0x92, 0x69, 0x12, 0x3b, 0x49, 0xb5, 0x1d, 0x8c, 0x34, 0x91, 0xf1, 0x1d, 0xa3, 0x1d, 0xfd, 0x26, 0x3d, 0x78, 0xb6, 0xe1, 0x9f, 0xd5, 0x4e, 0x40, 0x46, 0xd2, 0xc3, 0xdf, 0xaf, 0x06, 0x1c, 0x38, 0xbc, 0xd9, 0xf0, 0x16, 0x5a, 0x99, 0x27, 0x4c, 0x61, 0xca, 0x04, 0xa6, 0xbc, 0xbd, 0x64, 0x20, 0xc9, 0x64, 0x40, 0x56, 0x02, 0x64, 0x79, 0x3c, 0xde, 0x6c, 0xd5, 0x0f, 0xf2, 0xc5, 0x44, 0x8b, 0x5c, 0x2b, 0x69, 0x5f, 0x61, 0xdc, 0x55, 0xde, 0x55, 0xee, 0x96, 0xf7, 0xbb, 0xe5, 0x70, 0x67, 0xae, 0x85, 0x6a, 0x2d, 0x80, 0xe5, 0x0d, 0x3e, 0xa0, 0xc5, 0xe8, 0x7b, 0xc1, 0x21, 0xd7, 0xe0, 0x38, 0x07, 0x85, 0xfe, 0xa6, 0xa5, 0x30, 0xab, 0xd8, 0xa6, 0xac, 0xf8, 0xeb, 0xbf, 0xab, 0x63, 0xb4, 0x84, 0x3b, 0x4e, 0x5f, 0x81, 0x90, 0xb0, 0x55, 0x86, 0x04, 0x0b, 0x64, 0x42, 0x5c, 0x9e, 0x1a, 0x13, 0x4d, 0xdb, 0x71, 0x1d, 0x3f, 0x1b, 0xb2, 0x9a, 0x50, 0x91, 0x93, 0x70, 0x9c, 0x7c, 0xa2, 0x09, 0xbc, 0xa1, 0xe7, 0x5f, 0x8c, 0xf9, 0xc5, 0x56, 0x31, 0xa7, 0x22, 0x4f, 0x5b, 0x2c, 0xc8, 0xfa, 0xc8, 0xde, 0x0a, 0x6b, 0x0a, 0x97, 0xaa, 0x71, 0x89, 0xaa, 0xfa, 0x23, 0xcb, 0x1b, 0x42, 0xbb, 0xf3, 0x0f, 0x62, 0xa8, 0x88, 0x81, 0xb8, 0xde, 0x78, 0x37, 0x44, 0x71, 0x5d, 0xf4, 0x0a, 0x62, 0xfe, 0xf0, 0xb8, 0xb9, 0x19, 0x85, 0x89, 0xd3, 0x60, 0x2b, 0x69, 0xfe, 0xc1, 0xa6, 0x5a, 0x43, 0xea, 0x7e, 0x16, 0x83, 0x0d, 0xb0, 0xf6, 0xc6, 0xe0, 0xa3, 0x12, 0xcf, 0xe9, 0x5d, 0xaa, 0xf4, 0xf8, 0xf7, 0xc5, 0x2c, 0xf5, 0x4e, 0x17, 0x6a, 0xdb, 0xfc, 0x28, 0x29, 0x05, 0x87, 0xb3, 0x48, 0xa9, 0xd7, 0x4c, 0x19, 0xa2, 0xee, 0x46, 0xb5, 0x72, 0xd3, 0xd4, 0x92, 0x87, 0xcf, 0x6e, 0x57, 0xbd, 0xdc, 0x77, 0xee, 0x25, 0x5b, 0x1c, 0xdb, 0x05, 0x05, 0x7f, 0xcd, 0x1f, 0x24, 0x15, 0x73, 0x36, 0x03, 0x4c, 0x91, 0xcf, 0xa3, 0x72, 0x53, 0x35, 0xaf, 0xd2, 0xe1, 0xbf, 0xb2, 0x20, 0x33, 0x55, 0x88, 0x17, 0x27, 0x31, 0x13, 0x60, 0xd1, 0xe3, 0x2f, 0xb6, 0x12, 0x98, 0xe7, 0x48, 0x6c, 0x9b, 0xe9, 0x5e, 0x14, 0x1c, 0x37, 0x40, 0x49, 0x31, 0x20, 0x54, 0xe5, 0x1a, 0x6f, 0x86, 0x32, 0xc9, 0xe2, 0xec, 0xfe, 0xa2, 0xdd, 0xaa, 0xf2, 0x7f, 0x60, 0x14, 0x1f, 0xf7, 0x37, 0x13, 0xda, 0xe0, 0x70, 0xca, 0xca, 0x12, 0x12, 0x79, 0x3f, 0x6e, 0x0c, 0xa1, 0xc5, 0x1f, 0x6c, 0x69, 0xfa, 0x20, 0xd1, 0x40, 0x9c, 0xfe, 0x23, 0xc4, 0xe6, 0xe0, 0x81, 0xe2, 0x1d, 0xc4, 0x7b, 0x3f, 0x66, 0x0b, 0x82, 0xd7, 0xda, 0x38, 0x9c, 0xe5, 0xdc, 0xf5, 0x5d, 0x02, 0xaa, 0x57, 0x12, 0x90, 0x33, 0x62, 0x3f, 0x59, 0x29, 0xd0, 0x4c, 0x74, 0x56, 0x0e, 0x7b, 0x69, 0x33, 0x88, 0x1d, 0x94, 0xb7, 0x26, 0x06, 0xcf, 0x6d, 0x16, 0x3e, 0x4b, 0xc9, 0xcd, 0xf9, 0xbf, 0xbc, 0x48, 0xc9, 0xc5, 0x86, 0x98, 0x13, 0x80, 0xcc, 0x9d, 0xc0, 0x83, 0xea, 0x12, 0x34, 0xee, 0x8a, 0xc9, 0x84, 0xda, 0x76, 0x38, 0xe3, 0xf8, 0xaa, 0x35, 0x5e, 0x74, 0xae, 0xfe, 0xca, 0x20, 0x22, 0x7c, 0xfa, 0xce, 0x9a, 0xc9, 0x35, 0xfd, 0xad, 0xef, 0xe6, 0xb9, 0x49, 0xf3, 0x96, 0xbc, 0x49, 0x12, 0x18, 0xd9, 0x4a, 0x4a, 0x03, 0x9b, 0xba, 0x1c, 0x66, 0x29, 0x31, 0x91, 0xb6, 0x6c, 0x05, 0x7b, 0x0b, 0x74, 0x19, 0xfd, 0x8c, 0x18, 0xf5, 0x4d, 0x28, 0xdd, 0x1c, 0xb9, 0x88, 0x1a, 0x99, 0xe8, 0x41, 0x59, 0xdc, 0x63, 0x4d, 0xff, 0xc4, 0x53, 0xbc, 0x30, 0xfd, 0x8d, 0xa7, 0xed, 0x8c, 0xcb, 0x66, 0x7f, 0xa8, 0x3c, 0x02, 0x19, 0xcc, 0x40, 0xed, 0xb9, 0x0a, 0x6c, 0xf1, 0x4f, 0xa2, 0xd5, 0x67, 0x21, 0xd3, 0x8b, 0xa9, 0x6e, 0xf1, 0x63, 0xca, 0x51, 0xb8, 0xfa, 0x84, 0xe9, 0xe0, 0xf6, 0x71, 0xb7, 0xf1, 0x8f, 0x7e, 0x47, 0x59, 0x4f, 0x9e, 0x13, 0xbc, 0x15, 0xbb, 0xa4, 0x8b, 0x60, 0xf2, 0xfa, 0xd8, 0xca, 0xff, 0x2e, 0x69, 0xd3, 0xf6, 0x56, 0x0b, 0xe0, 0x35, 0xa9, 0x28, 0x84, 0x96, 0xe4, 0x9c, 0xfd, 0xe9, 0xec, 0xc5, 0x02, 0xa1, 0xb4, 0xd9, 0xbc, 0xcd, 0x61, 0x7d, 0x12, 0x4a, 0xac, 0x93, 0x29, 0x37, 0x88, 0x53, 0x2b, 0xaa, 0x05, 0x9d, 0x48, 0xa1, 0x75, 0x8d, 0xfb, 0x3c, 0xcd, 0x51, 0x8f, 0x29, 0x4e, 0x37, 0xe1, 0x5f, 0x64, 0x0a, 0x67, 0x0f, 0xce, 0x9f, 0x71, 0xd7, 0xff, 0xab, 0xaf, 0x3a, 0xc4, 0xd7, 0xf4, 0x4d, 0x28, 0x17, 0x39, 0xb2, 0x95, 0x37, 0xe5, 0xca, 0x3b, 0xb7, 0x4c, 0x27, 0xb5, 0xd8, 0x75, 0x40, 0xea, 0xf7, 0x20, 0x69, 0x32, 0x1a, 0x07, 0x02, 0xbb, 0xc9, 0x65, 0xee, 0x2a, 0x1f, 0xb5, 0x47, 0x85, 0x20, 0xbc, 0x4f, 0x50, 0x4d, 0xc9, 0xaa, 0xf6, 0x76, 0x3c, 0xcb, 0x6b, 0xd0, 0x45, 0xad, 0x10, 0x47, 0xee, 0xc3, 0xd7, 0x15, 0x5c, 0x31, 0xa7, 0x94, 0x51, 0x3c, 0x02, 0x50, 0xf6, 0xff, 0xe5, 0x61, 0xd8, 0x60, 0xef, 0xf8, 0x30, 0x43, 0xc6, 0x37, 0x67, 0xfe, 0xb7, 0x46, 0xd9, 0x0c, 0x9c, 0xa3, 0xda, 0x05, 0x03, 0xb9, 0xf6, 0xcd, 0x8c, 0xb5, 0x7d, 0x0c, 0x93, 0x95, 0x40, 0xdf, 0x0f, 0x81, 0x95, 0xce, 0xba, 0x5f, 0xa1, 0xfd, 0x73, 0xa2, 0xd6, 0xa6, 0xe0, 0x62, 0xba, 0xc6, 0x57, 0xb2, 0xea, 0x17, 0xff, 0x2e, 0x5f, 0x3f, 0x32, 0xd3, 0xf1, 0x47, 0x26, 0x14, 0x19, 0x4e, 0xcd, 0x29, 0xfb, 0x7f, 0xf9, 0xab, 0xa4, 0x40, 0xc4, 0x5e, 0x90, 0xac, 0x2f, 0x4e, 0x6f, 0x44, 0x09, 0x1d, 0x28, 0xe1, 0x13, 0x9b, 0x1f, 0xee, 0x61, 0x97, 0xb4, 0xd3, 0x03, 0xf5, 0x0c, 0xb4, 0xe5, 0x01, 0x13, 0x5c, 0xf4, 0x03, 0xc1, 0x74, 0x82, 0x14, 0x9d, 0xf9, 0xec, 0x2f, 0x80, 0xed, 0x7a, 0x8b, 0x9c, 0x4c, 0x86, 0x28, 0xbc, 0x41, 0xe1, 0xa8, 0xcd, 0x9a, 0x72, 0x61, 0x9e, 0x7a, 0x20, 0xb0, 0xe4, 0x4d, 0xf3, 0x90, 0x81, 0x01, 0x75, 0x6b, 0x06, 0x74, 0x5f, 0x30, 0x76, 0x28, 0x71, 0xa5, 0x4d, 0x3e, 0xa2, 0xff, 0xc0, 0xa2, 0x79, 0xb0, 0x47, 0x83, 0xbb, 0x80, 0x59, 0x06, 0x46, 0xdf, 0x76, 0x3b, 0x3d, 0x79, 0x6b, 0x50, 0x65, 0x0c, 0xd2, 0x04, 0xcf, 0x76, 0xd8, 0x5f, 0xb8, 0x13, 0x43, 0xa0, 0xad, 0x45, 0xb3, 0x78, 0xf3, 0x54, 0x27, 0x75, 0x25, 0x79, 0xc4, 0xc1, 0x1f, 0x35, 0xd2, 0x0c, 0x1b, 0xe7, 0x08, 0xc7, 0x1a, 0x9e, 0x09, 0x93, 0x86, 0x2c, 0x2e, 0xf9, 0x15, 0x7c, 0x86, 0x5b, 0xf0, 0x25, 0x1b, 0x2a, 0x15, 0x3e, 0x77, 0x5a, 0xf9, 0x75, 0x67, 0x13, 0x72, 0x5b, 0xff, 0xaa, 0xd5, 0x02, 0xde, 0xcf, 0x5b, 0xca, 0xb4, 0x08, 0xca, 0x78, 0x01, 0x5e, 0x51, 0x88, 0x1f, 0x55, 0xb3, 0xc5, 0x82, 0x22, 0xa8, 0x16, 0x3f, 0x19, 0x80, 0x9b, 0xcb, 0x65, 0x09, 0xf8, 0x05, 0xfb, 0xb3, 0xf1, 0x77, 0xd1, 0xf2, 0x38, 0xd9, 0x4a, 0xe4, 0x82, 0xd7, 0xf5, 0x34, 0xe0, 0x15, 0x78, 0x3e, 0x4d, 0x6f, 0xc7, 0x73, 0x83, 0x85, 0x9a, 0xff, 0x14, 0x77, 0x1d, 0xaa, 0xb5, 0xed, 0xe9, 0xfc, 0xdd, 0x5b, 0x33, 0xa5, 0x8f, 0x83, 0x43, 0x1c, 0x73, 0x3b, 0x28, 0x85, 0x2c, 0x70, 0xab, 0xd8, 0xe6, 0x6b, 0x81, 0x40, 0x2e, 0x53, 0xc5, 0xc1, 0x07, 0xf3, 0xa5, 0x1e, 0x3a, 0xbe, 0x5b, 0xfa, 0xed, 0x10, 0x5f, 0x3d, 0x77, 0xb7, 0xda, 0xb9, 0x73, 0xb2, 0x5e, 0x0e, 0x13, 0x38, 0xd5, 0xca, 0xb8, 0xfd, 0xb8, 0xd5, 0xbf, 0xb0, 0x82, 0x0d, 0x9d, 0xc8, 0x63, 0x2d, 0x2e, 0x80, 0x38, 0xf3, 0x4a, 0x20, 0xbb, 0x82, 0x9a, 0x7f, 0xf7, 0x05, 0xa9, 0xc6, 0x00, 0x95, 0x3e, 0x76, 0xe0, 0x5d, 0xea, 0xad, 0xd4, 0xfb, 0xdd, 0xa5, 0xb9, 0x2a, 0xfd, 0x7d, 0xc1, 0x9e, 0x3a, 0x3c, 0x6a, 0x30, 0x1b, 0x13, 0xb1, 0x3b, 0x9d, 0xe2, 0x82, 0x46, 0x3e, 0xfe, 0x74, 0xe3, 0x55, 0x32, 0xb3, 0xd6, 0xa4, 0x03, 0x3d, 0x7a, 0x30, 0x38, 0x52, 0x61, 0x51, 0x9a, 0x25, 0x3b, 0x05, 0xf9, 0xd8, 0xf9, 0x89, 0x6f, 0xa7, 0x32, 0x2b, 0xe9, 0x64, 0xc5, 0x5a, 0xe2, 0x23, 0xc0, 0xff, 0x72, 0x36, 0x80, 0x10, 0x88, 0x5c, 0x1a, 0x61, 0x73, 0x35, 0xfa, 0xbe, 0xa8, 0xf9, 0xca, 0x38, 0xbf, 0x6a, 0x96, 0xbc, 0xbe, 0x07, 0x2d, 0xea, 0x9a, 0x83, 0xca, 0x23, 0xfb, 0x75, 0xf3, 0xe4, 0x40, 0x51, 0xa2, 0x53, 0xc3, 0x97, 0xa3, 0x18, 0x5e, 0x4a, 0x3d, 0x6e, 0x2e, 0xa4, 0x14, 0x7a, 0x96, 0x08, 0x4e, 0xdb, 0x87, 0x38, 0xf5, 0x82, 0xff, 0xc8, 0x9c, 0xc4, 0xd0, 0xd3, 0x46, 0xad, 0xa3, 0xec, 0x83, 0x98, 0x3c, 0x57, 0xdc, 0xfc, 0x00, 0x7a, 0x71, 0x89, 0xb4, 0x8e, 0xe1, 0x74, 0x87, 0x9a, 0x6a, 0x0f, 0x53, 0xa2, 0x52, 0x9c, 0x20, 0x1b, 0x85, 0x63, 0xea, 0xa3, 0x7f, 0x02, 0xa4, 0xef, 0x6c, 0x05, 0x7c, 0x05, 0x8e, 0xb6, 0x61, 0xab, 0xe0, 0x36, 0xc2, 0x1f, 0xf9, 0xcd, 0x99, 0x08, 0x32, 0x7f, 0xa9, 0xad, 0x0b, 0xe0, 0x03, 0x65, 0xcb, 0x29, 0xcf, 0x4e, 0x67, 0x8a, 0x49, 0x42, 0xa5, 0xc2, 0x0a, 0x07, 0x81, 0xee, 0x89, 0xc6, 0xd0, 0x9e, 0xe1, 0xbf, 0x23, 0x2e, 0xd5, 0x3a, 0xee, 0x54, 0x11, 0xc1, 0xea, 0xf5, 0xb2, 0x8c, 0xb7, 0x3d, 0x09, 0x3d, 0xc6, 0xee, 0x9c, 0xce, 0x76, 0xf8, 0x6e, 0xc7, 0x7d, 0x4b, 0x81, 0xb4, 0x8a, 0xe9, 0x98, 0xd6, 0x29, 0x3f, 0x41, 0x19, 0xe6, 0xb5, 0x13, 0x46, 0xb5, 0x84, 0x35, 0x7a, 0x91, 0xc7, 0x20, 0xd7, 0x64, 0xd6, 0xa5, 0x79, 0x27, 0xcf, 0x31, 0xab, 0x4a, 0x75, 0x50, 0x5b, 0x56, 0x3e, 0x70, 0xcc, 0xd1, 0xa7, 0xe8, 0x8b, 0x62, 0xcb, 0x38, 0xa4, 0x35, 0x34, 0x92, 0x15, 0xa1, 0xf1, 0x9a, 0x83, 0x08, 0xe8, 0x6b, 0x2c, 0xff, 0x6e, 0xda, 0x1d, 0xaf, 0x15, 0xfe, 0xa5, 0x7b, 0xc5, 0xf0, 0x09, 0xe4, 0x0f, 0xcf, 0x79, 0xa9, 0xbd, 0x07, 0x43, 0x32, 0xae, 0xd3, 0x47, 0x2e, 0xe1, 0x01, 0xab, 0x7c, 0xcf, 0xf6, 0xd0, 0x47, 0xfe, 0xf1, 0x84, 0x76, 0xd3, 0x94, 0x79, 0x43, 0xa8, 0xa0, 0xf5, 0x29, 0x1e, 0x00, 0xcc, 0x04, 0xb4, 0x09, 0x8c, 0x74, 0x99, 0x00, 0xf7, 0x82, 0xbf, 0xdc, 0xb6, 0x86, 0x31, 0x4e, 0x4b, 0x48, 0xa6, 0xff, 0x48, 0x65, 0x56, 0x19, 0xbe, 0xf4, 0x0c, 0x08, 0xf9, 0x6a, 0x7d, 0x82, 0x6a, 0xbb, 0xd8, 0xc4, 0xe5, 0xc2, 0x9e, 0x1f, 0x0d, 0xe3, 0xb4, 0xb4, 0x0c, 0xef, 0xb7, 0x7c, 0x87, 0x47, 0x8f, 0x8b, 0xd0, 0x45, 0x47, 0x95, 0x5e, 0xd7, 0x1b, 0xb1, 0x7b, 0x6d, 0xd3, 0x5d, 0x3d, 0x16, 0x50, 0xc2, 0xb7, 0xe5, 0x65, 0x3a, 0x70, 0x9a, 0xe8, 0x10, 0x15, 0x7e, 0x08, 0x87, 0x6a, 0x8f, 0xe0, 0x1d, 0x86, 0xdd, 0x4d, 0x10, 0x40, 0x34, 0xfd, 0x22, 0xe5, 0xfb, 0xc9, 0x99, 0x2c, 0x5c, 0x45, 0x8b, 0x6b, 0xa6, 0x95, 0x58, 0x0a, 0xef, 0x82, 0x78, 0x38, 0xfd, 0xcd, 0x77, 0xde, 0x67, 0xc2, 0x3d, 0xd1, 0xf7, 0x11, 0x93, 0x4c, 0x53, 0xda, 0xe3, 0x9d, 0xdc, 0x07, 0x3f, 0x1e, 0xd7, 0xde, 0xa5, 0x67, 0xcb, 0xd6, 0x82, 0xc2, 0x29, 0xaa, 0x74, 0xe0, 0x32, 0xad, 0x54, 0xca, 0x16, 0x5d, 0x74, 0x19, 0x59, 0x3a, 0x25, 0x6a, 0x7b, 0xd9, 0x7d, 0x0d, 0xd8, 0x34, 0x57, 0xfd, 0xcd, 0x44, 0x9a, 0x15, 0x1c, 0xd2, 0xbf, 0x80, 0x92, 0x8a, 0x8d, 0x72, 0xe7, 0x51, 0x27, 0x15, 0xe5, 0xd8, 0x49, 0xc7, 0xcc, 0x71, 0xcf, 0x82, 0xf6, 0x22, 0x77, 0x9b, 0xb7, 0xf8, 0xe7, 0xb0, 0x87, 0x9e, 0xf2, 0xdc, 0x63, 0x2e, 0x17, 0x2c, 0x70, 0x47, 0x4a, 0x57, 0xe2, 0x60, 0xf8, 0xa9, 0x1c, 0x5c, 0x45, 0x41, 0x18, 0x5e, 0x98, 0x7c, 0x0a, 0xde, 0x59, 0xb1, 0x40, 0xfd, 0xf9, 0x1f, 0x4d, 0x15, 0x33, 0x23, 0x66, 0x95, 0x92, 0xaf, 0x0c, 0x0c, 0x34, 0xf7, 0xec, 0x83, 0xcd, 0x6d, 0x03, 0x10, 0xee, 0xf0, 0x05, 0xa8, 0x88, 0x40, 0x00, 0x35, 0xac, 0xb6, 0x3c, 0xe8, 0x94, 0x32, 0x67, 0xd1, 0xe7, 0x54, 0xee, 0xad, 0x39, 0xef, 0xae, 0xff, 0xd1, 0xba, 0xcc, 0x62, 0xb0, 0x49, 0xe1, 0x1d, 0xcf, 0x3c, 0x5b, 0xf8, 0xa7, 0xb7, 0x20, 0x4e, 0xf6, 0x12, 0x74, 0x64, 0xc1, 0xd1, 0x1c, 0xf9, 0x95, 0xd6, 0xc3, 0x1e, 0x13, 0xd5, 0x9e, 0x48, 0xac, 0x09, 0x4c, 0xa4, 0xa8, 0x25, 0x00, 0xaa, 0x6d, 0x8e, 0xe1, 0xf5, 0xfe, 0xc7, 0xb1, 0x52, 0xc2, 0x2c, 0xad, 0x17, 0x87, 0xe4, 0xb5, 0xb6, 0xc6, 0x11, 0xad, 0x91, 0x28, 0x49, 0x23, 0x10, 0x4a, 0x4a, 0x32, 0xf1, 0xbd, 0xe9, 0xa6, 0xe0, 0x52, 0x4c, 0x60, 0x48, 0x94, 0x59, 0xfd, 0x68, 0x95, 0x6e, 0xb2, 0xa9, 0xee, 0x53, 0x7a, 0x2f, 0x01, 0x6d, 0x74, 0xae, 0x81, 0x34, 0x86, 0x7f, 0x35, 0xe7, 0x47, 0xf3, 0xf8, 0x7e, 0x1c, 0xe7, 0x05, 0xe0, 0xa1, 0x98, 0x71, 0x56, 0x4a, 0xb9, 0xf9, 0x3f, 0x4a, 0xc3, 0xfe, 0x06, 0xb3, 0x8d, 0xce, 0x52, 0xdf, 0x1c, 0x25, 0x7c, 0x10, 0xbc, 0xf4, 0x46, 0x53, 0x4f, 0x60, 0xca, 0xaa, 0xe6, 0x0e, 0xb0, 0x69, 0x8e, 0x9e, 0xa4, 0xe1, 0x6d, 0x75, 0x07, 0x3c, 0x0d, 0xc0, 0xe5, 0xa8, 0xf7, 0xb5, 0x28, 0xb8, 0x84, 0x1c, 0x0b, 0x06, 0xf0, 0x0f, 0xd1, 0x1e, 0xb0, 0xfe, 0xb6, 0x97, 0x05, 0xf6, 0x26, 0x83, 0xd2, 0x22, 0x2d, 0x0a, 0xab, 0x92, 0x2f, 0x51, 0x2e, 0x3b, 0xd9, 0xa1, 0x96, 0x3f, 0x57, 0xc5, 0x8d, 0x6f, 0xc7, 0xb3, 0x42, 0x0e, 0xee, 0x6f, 0xbc, 0xd8, 0x2a, 0x2d, 0x6e, 0x43, 0xa8, 0xb6, 0x0b, 0x05, 0xd7, 0x0c, 0x9b, 0xd6, 0x1d, 0x51, 0xcf, 0x77, 0xc8, 0xe5, 0x91, 0xf3, 0x47, 0xcf, 0xe0, 0x25, 0x9a, 0x5e, 0xdb, 0x7a, 0x07, 0x0f, 0x1b, 0xf9, 0x0f, 0xb2, 0x46, 0x80, 0xa0, 0xc9, 0xe1, 0x50, 0x8c, 0x31, 0x66, 0xcb, 0x3a, 0x04, 0x97, 0x7d, 0x9c, 0xbd, 0x11, 0x5a, 0x60, 0x9d, 0x24, 0x46, 0x6b, 0x4e, 0xe2, 0xdb, 0x83, 0xc7, 0x76, 0x66, 0x4b, 0x6f, 0xb8, 0x32, 0x75, 0x85, 0xfe, 0x0a, 0x33, 0xbf, 0x34, 0xf9, 0xee, 0x31, 0x2f, 0x54, 0x3b, 0x71, 0x3e, 0xfa, 0x0b, 0xf9, 0x02, 0xdb, 0x21, 0xcc, 0x80, 0xb7, 0xca, 0x5d, 0x75, 0x28, 0xc8, 0xac, 0xe9, 0xe3, 0x8f, 0xb2, 0x07, 0x3b, 0xb4, 0xff, 0x2c, 0xe7, 0xa2, 0xa2, 0x3e, 0x04, 0x8f, 0x49, 0x3f, 0x5e, 0xae, 0xa9, 0x22, 0xeb, 0xa6, 0x20, 0xdd, 0x98, 0x44, 0x99, 0xbf, 0x48, 0x6c, 0xb1, 0x04, 0x1a, 0x56, 0x18, 0xa7, 0xeb, 0xf7, 0x39, 0x77, 0x1d, 0xbc, 0x1d, 0x6d, 0x96, 0x7e, 0x8c, 0x3d, 0x0b, 0xb3, 0x76, 0x2b, 0x7e, 0xe1, 0x92, 0x20, 0x05, 0x59, 0x45, 0xfd, 0xce, 0x21, 0xc5, 0x2f, 0x60, 0x32, 0x7e, 0x84, 0x23, 0xe3, 0xb5, 0x3c, 0x23, 0xa6, 0x6b, 0x64, 0x11, 0xf2, 0x84, 0x5f, 0x8b, 0x80, 0x28, 0xc6, 0x9c, 0xba, 0x6a, 0x72, 0x87, 0x71, 0x27, 0xd6, 0xc0, 0xce, 0x31, 0x92, 0x3c, 0x8b, 0xad, 0x46, 0xea, 0x62, 0xba, 0xa4, 0x82, 0xc6, 0x54, 0xca, 0x7d, 0xd2, 0x77, 0xce, 0x64, 0x7f, 0x87, 0x9a, 0x4e, 0x19, 0xef, 0xfa, 0xa5, 0xf4, 0x09, 0xf3, 0x28, 0x5b, 0x3e, 0x57, 0x36, 0xc9, 0x6e, 0x96, 0x49, 0x5c, 0x91, 0xd7, 0xc1, 0x86, 0x9f, 0x47, 0xe3, 0x06, 0xae, 0xb1, 0x21, 0x16, 0x5a, 0x50, 0x9b, 0xe6, 0x6a, 0xe1, 0xe7, 0x4a, 0xb1, 0xfb, 0x0d, 0xaf, 0x31, 0xa3, 0xd6, 0x54, 0x87, 0x1c, 0x47, 0xb7, 0x83, 0xfc, 0x68, 0x4d, 0x16, 0x85, 0x4a, 0x75, 0x71, 0x31, 0x47, 0xaf, 0x6b, 0x8f, 0x8c, 0x09, 0x23, 0x4e, 0xd5, 0xdb, 0xe7, 0x97, 0x78, 0xb4, 0x55, 0xa1, 0xa5, 0x94, 0xc0, 0x7f, 0xec, 0x5c, 0xd6, 0x3c, 0xff, 0x82, 0x7f, 0x29, 0xba, 0x09, 0x08, 0x76, 0x60, 0xb1, 0x80, 0x00, 0x28, 0x6b, 0x62, 0x6a, 0xf8, 0x0f, 0x75, 0x6f, 0x70, 0x51, 0xf1, 0x76, 0x2a, 0xf2, 0xe3, 0x67, 0x40, 0x33, 0xd2, 0xbe, 0x0f, 0x8f, 0xa3, 0xde, 0x3b, 0xa9, 0xba, 0xa7, 0xf4, 0x84, 0x62, 0x4a, 0x77, 0xf2, 0x6f, 0x5c, 0xd7, 0x4f, 0x22, 0x2a, 0xfd, 0x6e, 0x4c, 0x4d, 0xed, 0xd4, 0xb6, 0x7e, 0x4c, 0x24, 0xc1, 0xab, 0x1f, 0xdb, 0x4a, 0x4a, 0xd6, 0x3d, 0xd0, 0xed, 0x89, 0x90, 0xd9, 0x16, 0x81, 0x87, 0x91, 0x4d, 0xfa, 0x01, 0xb5, 0x71, 0x27, 0xf4, 0xaf, 0x4c, 0x77, 0xa3, 0x03, 0x69, 0x17, 0x18, 0xe9, 0x2a, 0xb8, 0xce, 0x3b, 0x15, 0x92, 0xae, 0x92, 0x6f, 0xa9, 0x3c, 0xad, 0x0c, 0x4f, 0x13, 0x12, 0x65, 0xea, 0x8f, 0xf7, 0xeb, 0xf7, 0xc9, 0x62, 0x9b, 0x4f, 0xc8, 0x90, 0xd3, 0xa9, 0xf5, 0x94, 0x64, 0x61, 0xd0, 0x40, 0xe8, 0x78, 0xe2, 0x48, 0x56, 0xdb, 0xf2, 0xa5, 0xd3, 0xe8, 0x7c, 0x38, 0xcb, 0x2e, 0x5f, 0xb0, 0x41, 0x74, 0xd6, 0xad, 0x63, 0xfd, 0xa9, 0x25, 0x62, 0x0b, 0xa5, 0x08, 0x80, 0xa2, 0x49, 0x1f, 0x6b, 0x8e, 0xc2, 0x3a, 0xc9, 0xa8, 0x1a, 0x8a, 0x14, 0x54, 0xac, 0x4c, 0xa8, 0x4e, 0xdb, 0xa7, 0x1a, 0xa7, 0x03, 0xd8, 0xcc, 0x0a, 0xb0, 0x8c, 0xbe, 0x44, 0x0e, 0x8d, 0xa7, 0x03, 0xa1, 0xa1, 0x45, 0xde, 0x36, 0xb0, 0xf1, 0x96, 0x1a, 0x24, 0x76, 0x9c, 0x89, 0x95, 0x23, 0xd3, 0x69, 0xa6, 0x1f, 0x96, 0x39, 0x2a, 0xfd, 0xfd, 0x44, 0x8c, 0x90, 0x5c, 0x1a, 0x6d, 0x01, 0x0d, 0x40, 0x8e, 0x1e, 0x70, 0x27, 0xf1, 0xf5, 0x2f, 0x5b, 0x3b, 0xa2, 0xc7, 0xfd, 0x5d, 0x65, 0x44, 0x73, 0x73, 0xf8, 0x4b, 0x5e, 0xec, 0x1f, 0x5e, 0xcc, 0xec, 0x80, 0x5c, 0xb0, 0xee, 0xb5, 0x47, 0x8f, 0xae, 0xa0, 0x4a, 0x7b, 0x46, 0xfe, 0xfb, 0x45, 0x97, 0x3f, 0xdd, 0xef, 0xea, 0x96, 0x29, 0x60, 0xd7, 0x4c, 0xce, 0x5b, 0x67, 0x59, 0xb6, 0xb2, 0x75, 0x35, 0x4b, 0xb7, 0x5a, 0xec, 0x3a, 0xf4, 0xc9, 0x71, 0x76, 0x1c, 0xf7, 0x34, 0x81, 0x41, 0xff, 0xf6, 0xe7, 0x46, 0x86, 0xdc, 0x0b, 0x98, 0x9a, 0xc3, 0x25, 0x19, 0xe0, 0xd4, 0x8c, 0x5d, 0xef, 0x58, 0x31, 0x19, 0xf7, 0xcd, 0x6c, 0xd8, 0xa6, 0x39, 0xfc, 0xf0, 0x4c, 0xbe, 0x49, 0xb5, 0x3d, 0x6f, 0xeb, 0xec, 0x77, 0x62, 0x70, 0x83, 0x84, 0x06, 0x5a, 0x7f, 0xa2, 0xb7, 0x68, 0x35, 0x22, 0x90, 0x17, 0xbd, 0x0e, 0x81, 0x67, 0xa4, 0x0e, 0xa1, 0xe2, 0xe1, 0x8c, 0xc5, 0xdb, 0x0a, 0x17, 0x51, 0xf4, 0xc8, 0x05, 0x4e, 0xe3, 0x89, 0x5d, 0xbd, 0x75, 0x74, 0xf4, 0x2b, 0xd2, 0xa2, 0xd5, 0x86, 0x04, 0x8b, 0xe6, 0x2f, 0xb3, 0xbe, 0xc9, 0x50, 0x32, 0xd6, 0x01, 0x70, 0xc0, 0xa9, 0x56, 0x45, 0x07, 0xc2, 0x7a, 0xc9, 0xe9, 0x12, 0xec, 0x90, 0x7c, 0xe2, 0x1d, 0x58, 0x53, 0x0c, 0xd2, 0xe2, 0x00, 0x6b, 0xc9, 0x00, 0xd6, 0x90, 0x9f, 0xf0, 0xf4, 0xb6, 0xf1, 0xe8, 0x7f, 0xf8, 0xc2, 0xf2, 0x2e, 0xc2, 0x1c, 0xfa, 0x0c, 0x86, 0xfa, 0x25, 0x79, 0xb0, 0x66, 0x65, 0x72, 0xdb, 0xdf, 0x4b, 0x13, 0x45, 0xfd, 0x1c, 0x5a, 0x80, 0x58, 0x26, 0x2e, 0x6b, 0xa5, 0x54, 0xa0, 0x61, 0x22, 0x01, 0x70, 0xb0, 0x35, 0x0a, 0xd3, 0x4d, 0x4f, 0x27, 0x73, 0xc6, 0x17, 0x7b, 0xb8, 0x77, 0xc5, 0x69, 0x46, 0x01, 0xcb, 0xaa, 0xc7, 0xf8, 0xbb, 0x9c, 0xea, 0xdc, 0x65, 0xdd, 0xab, 0x4b, 0x3f, 0x19, 0xd6, 0x74, 0x0b, 0x20, 0xc6, 0xcf, 0xb3, 0x3c, 0x73, 0x0c, 0x78, 0xc1, 0xac, 0x49, 0x4b, 0xe5, 0xa0, 0x87, 0x7b, 0xd2, 0xa3, 0x5f, 0x91, 0xfa, 0x2f, 0xf1, 0x79, 0xab, 0x29, 0x1e, 0xe2, 0xe3, 0x66, 0xf7, 0xe6, 0x65, 0x6e, 0x74, 0xee, 0x0c, 0x80, 0x6a, 0xd0, 0x60, 0xd6, 0xb7, 0x3b, 0x67, 0x29, 0xbf, 0x55, 0xbe, 0x78, 0x1d, 0xa2, 0xe7, 0x06, 0x92, 0x28, 0xe5, 0xa2, 0x41, 0xd1, 0x06, 0x2a, 0x1f, 0x10, 0x01, 0x52, 0xa5, 0xc7, 0x40, 0xa2, 0xc8, 0x69, 0x7f, 0xbe, 0x2a, 0x5c, 0x96, 0xea, 0x92, 0xa1, 0x93, 0xcd, 0x9a, 0xb6, 0x0c, 0x75, 0xa7, 0xbb, 0xb4, 0x9c, 0x1e, 0xd5, 0x2b, 0x2a, 0xd5, 0xd0, 0x1b, 0xfb, 0xc8, 0x08, 0x80, 0xe1, 0x0e, 0x89, 0x47, 0xed, 0x0b, 0x75, 0x1b, 0xea, 0xe6, 0xa6, 0x7c, 0x2b, 0x3d, 0x95, 0x11, 0x87, 0x18, 0x7a, 0x3f, 0xa1, 0x1c, 0xb5, 0xfa, 0x6d, 0x02, 0x6d, 0xdb, 0xef, 0x47, 0x77, 0x73, 0x46, 0x24, 0x79, 0xe0, 0xea, 0xc0, 0x4f, 0x9d, 0x32, 0xa5, 0xad, 0x9f, 0x19, 0x70, 0x06, 0x9d, 0x41, 0xcd, 0xad, 0xaf, 0x38, 0xa3, 0x3b, 0x1a, 0xfb, 0x8c, 0x30, 0x6a, 0xb8, 0x88, 0xdd, 0xc2, 0xd8, 0xf2, 0x81, 0x71, 0x3d, 0xb3, 0xb2, 0xc5, 0xc8, 0xb5, 0xfe, 0x24, 0x1f, 0x9b, 0xd3, 0x58, 0xad, 0xaf, 0x9c, 0x2b, 0xea, 0x1b, 0x2d, 0x34, 0xdc, 0x5d, 0x61, 0xf0, 0xde, 0xf5, 0x01, 0x15, 0xa0, 0x60, 0xe8, 0x22, 0x6f, 0x4a, 0x65, 0x3b, 0xb6, 0x00, 0xe1, 0x34, 0xc5, 0x24, 0xc2, 0xec, 0xd2, 0xa4, 0x8f, 0xdc, 0x3d, 0xec, 0x54, 0xef, 0x19, 0x5b, 0x48, 0x94, 0xe7, 0xf4, 0xad, 0x12, 0xa4, 0x57, 0xf8, 0x1d, 0x07, 0xef, 0x32, 0xa6, 0x04, 0x6c, 0x9e, 0xf7, 0x94, 0x74, 0x9c, 0xfe, 0xb8, 0x95, 0xcd, 0xe9, 0xbb, 0x7f, 0x78, 0xf4, 0xb8, 0x70, 0x2c, 0x7f, 0x5d, 0xef, 0xa7, 0x64, 0xee, 0xbd, 0xf7, 0x87, 0x8d, 0x09, 0xdf, 0xaf, 0xb8, 0xe3, 0x7c, 0x94, 0x13, 0xf3, 0x28, 0x39, 0x68, 0x6b, 0x9f, 0x7b, 0xec, 0x3a, 0x61, 0xea, 0xc4, 0x83, 0x57, 0xd9, 0xc7, 0x4d, 0xb8, 0xb1, 0x86, 0x7c, 0x2e, 0x8b, 0x89, 0x00, 0x35, 0xfd ],
+    const [ 0x56, 0xee, 0x7c, 0xbb, 0x74, 0x5a, 0x2b, 0x1f, 0x3a, 0x77, 0xc8, 0xa9, 0xba, 0xde, 0x1e, 0x49, 0x34, 0xa0, 0x86, 0x45, 0xe7, 0xd0, 0x5a, 0xdc, 0x27, 0x42, 0xac, 0x2a, 0xb0, 0x93, 0x38, 0x4b, 0x3a, 0x69, 0x98, 0xc3, 0x4d, 0xfc, 0xb7, 0x1d, 0x57, 0xd6, 0x88, 0xd3, 0xfc, 0xd7, 0xf8, 0x6e, 0xad, 0x7b, 0x21, 0xee, 0x7c, 0x60, 0xc0, 0x6c, 0x2e, 0x02, 0xe9, 0xfe, 0x92, 0xc9, 0xf9, 0xdb, 0x12, 0x47, 0xcd, 0xc0, 0x88, 0xba, 0x31, 0x92, 0x53, 0xd9, 0x9b, 0x44, 0xa9, 0xcd, 0x1a, 0xfb, 0x2e, 0x7d, 0x89, 0x70, 0xc6, 0x0e, 0x08, 0x96, 0xa8, 0xaa, 0xad, 0x7e, 0xb5, 0x81, 0x76, 0x77, 0x07, 0x0e, 0x82, 0x79, 0xcc, 0x9c, 0x81, 0xc4, 0x55, 0x08, 0x6a, 0xc4, 0x6a, 0xc8, 0x6c, 0x38, 0xe1, 0x2c, 0x26, 0x93, 0x6f, 0xe4, 0x1a, 0xa2, 0xbd, 0xc3, 0x5f, 0x70, 0xbe, 0xc3, 0x97, 0x67, 0x41, 0x48, 0x21, 0xb7, 0xc2, 0xa9, 0x90, 0xfc, 0x86, 0xec, 0x5b, 0x1b, 0xe7, 0xd1, 0xd5, 0x6c, 0xec, 0x13, 0x60, 0x1f, 0x1c, 0xea, 0xde, 0xd8, 0x94, 0xd4, 0x69, 0x9d, 0x58, 0x95, 0x44, 0xf2, 0xe7, 0x7c, 0x11, 0x42, 0x12, 0xe9, 0x44, 0x81, 0x0d, 0x0c, 0xd7, 0x10, 0xc7, 0xef, 0x40, 0xe1, 0x77, 0xb7, 0xa0, 0xdb, 0x77, 0x27, 0x3d, 0x80, 0x56, 0x65, 0x32, 0xcd, 0x29, 0x01, 0x65, 0x61, 0x21, 0x33, 0xba, 0xe2, 0x63, 0x64, 0x86, 0x9d, 0x13, 0xf0, 0x47, 0x6c, 0xb2, 0x2b, 0x92, 0xdd, 0xab, 0xa2, 0x4c, 0x90, 0x28, 0xa3, 0x1d, 0xe1, 0x2a, 0xff, 0x22, 0xc7, 0xd9, 0x0e, 0xe2, 0xfc, 0x19, 0xf4, 0x84, 0x5f, 0x5d, 0x23, 0x3f, 0x96, 0xc0, 0x21, 0x11, 0xf7, 0x52, 0x8c, 0xb4, 0xa9, 0xaf, 0x5b, 0xce, 0x06, 0xd7, 0x66, 0x68, 0x44, 0x39, 0x29, 0xa1, 0x55, 0x11, 0xc4, 0xa3, 0x0b, 0xf4, 0x47, 0xd7, 0x80, 0xa9, 0x2d, 0x55, 0xb5, 0x3b, 0x26, 0x9f, 0x79, 0x4c, 0x1a, 0x8e, 0x8d, 0xac, 0x6a, 0x8c, 0x05, 0x2b, 0x79, 0x04, 0xf1, 0xab, 0x6b, 0x17, 0x3d, 0x79, 0x2c, 0x91, 0xd6, 0xdd, 0xb4, 0x1b, 0x0e, 0xef, 0x8a, 0xb2, 0x42, 0xad, 0x87, 0x57, 0xba, 0x4b, 0xdd, 0x08, 0xd0, 0xca, 0x58, 0xf0, 0x55, 0xcc, 0xe3, 0xdb, 0x30, 0xa7, 0x4d, 0xec, 0x48, 0xb8, 0x4d, 0x92, 0xa5, 0xfa, 0xc4, 0xb8, 0xd2, 0xd6, 0x43, 0x3c, 0x85, 0x3d, 0xcd, 0xa3, 0x81, 0xf5, 0xde, 0x0b, 0xbc, 0x30, 0xab, 0x60, 0xbd, 0x63, 0xac, 0xd3, 0x49, 0x55, 0x58, 0x88, 0x3e, 0x77, 0x30, 0x8f, 0xbf, 0x73, 0xfe, 0x16, 0x91, 0x07, 0x5f, 0xdd, 0xc5, 0x14, 0x7f, 0xea, 0x98, 0xf2, 0x24, 0x7d, 0x97, 0x07, 0xee, 0x46, 0x07, 0x98, 0xdd, 0xd6, 0x83, 0xde, 0x13, 0x54, 0xe7, 0x5d, 0xdb, 0x71, 0x6d, 0x71, 0xeb, 0x9d, 0x16, 0x2a, 0xe6, 0x7c, 0x4c, 0x59, 0x25, 0x93, 0xc5, 0xeb, 0xb7, 0x48, 0xaa, 0x76, 0xa6, 0x09, 0xf9, 0x12, 0x7c, 0xcb, 0x28, 0x6a, 0x06, 0xb6, 0x0b, 0x13, 0x58, 0x1e, 0xf7, 0x1c, 0x11, 0xb6, 0x28, 0xe6, 0xe1, 0x00, 0x60, 0x35, 0x48, 0x08, 0xd1, 0x88, 0xa0, 0x52, 0x3d, 0xa6, 0x5d, 0x11, 0x5c, 0x7a, 0x94, 0x99, 0x7e, 0x20, 0xba, 0x17, 0x71, 0x40, 0xaf, 0x80, 0xa5, 0x9b, 0xfa, 0xc7, 0x8e, 0xe3, 0x57, 0x53, 0x4a, 0xd0, 0x6f, 0xb0, 0x84, 0x70, 0xe6, 0x85, 0x98, 0xbf, 0x9a, 0xc6, 0xf7, 0x77, 0x2a, 0x2a, 0xce, 0x29, 0xb6, 0xe0, 0xe2, 0x8d, 0xe6, 0x7e, 0xbe, 0x17, 0x2e, 0x3a, 0x11, 0xca, 0x50, 0x5c, 0x52, 0x51, 0x22, 0xf3, 0xa5, 0x4c, 0x91, 0xc7, 0x02, 0xe8, 0xe6, 0x90, 0x94, 0xb2, 0x48, 0x65, 0x5f, 0xad, 0x82, 0x77, 0x26, 0xa1, 0x07, 0xff, 0x8c, 0xb7, 0x33, 0x75, 0x79, 0x43, 0xd4, 0x03, 0xbf, 0xe1, 0xe9, 0x39, 0xfe, 0xc3, 0xaa, 0x02, 0xc5, 0x49, 0xc8, 0xd7, 0xf9, 0xd2, 0xf5, 0x32, 0x7b, 0xd3, 0xa7, 0x46, 0x05, 0x26, 0x19, 0xed, 0x55, 0xa4, 0x93, 0xe2, 0x8e, 0xf5, 0xec, 0x30, 0xdb, 0xa7, 0x4d, 0xea, 0x55, 0x7e, 0x37, 0x1d, 0x27, 0x0b, 0xc8, 0x03, 0xef, 0x80, 0x3a, 0x79, 0x68, 0xc3, 0xac, 0xb3, 0x47, 0xc1, 0x25, 0x2f, 0x62, 0x05, 0xd6, 0xe7, 0x17, 0x89, 0x9f, 0xcb, 0xec, 0xcc, 0xd5, 0x6e, 0x73, 0x24, 0x43, 0x00, 0x71, 0x56, 0x6e, 0x7c, 0x3e, 0x64, 0x1e, 0x22, 0x6f, 0xa6, 0x19, 0x28, 0xb3, 0x1c, 0x32, 0xad, 0xfb, 0x03, 0x82, 0xee, 0xde, 0xa6, 0xf6, 0xbc, 0x3b, 0x77, 0x0a, 0x2e, 0x20, 0x5e, 0xd3, 0x93, 0xea, 0x51, 0x43, 0xaa, 0xae, 0x25, 0xa9, 0x16, 0xd8, 0xa4, 0x77, 0x0c, 0x12, 0xdf, 0x48, 0x4f, 0x68, 0xc6, 0x21, 0x5e, 0xa9, 0xf5, 0xf7, 0xeb, 0x10, 0xd1, 0x72, 0x90, 0x23, 0xd4, 0xf1, 0xbe, 0xdc, 0x25, 0xce, 0xf6, 0x07, 0x6c, 0xe3, 0x3b, 0xeb, 0xe4, 0x4d, 0xc7, 0x2c, 0xb2, 0x6f, 0xfd, 0xf0, 0x75, 0x3a, 0x9f, 0x41, 0x1e, 0xac, 0x41, 0xb3, 0x02, 0x97, 0xfd, 0x46, 0x2d, 0xa4, 0x69, 0x8d, 0xf9, 0x97, 0xc6, 0x10, 0xe0, 0xd5, 0x7a, 0xf0, 0x8f, 0x23, 0xc1, 0xc9, 0x3b, 0xb0, 0x9f, 0xdc, 0x38, 0x56, 0x19, 0x6e, 0xc8, 0x1d, 0xa4, 0x6b, 0x31, 0x01, 0xde, 0x4f, 0x12, 0xf5, 0x7c, 0x46, 0xf6, 0x27, 0x83, 0x92, 0x2a, 0x86, 0xbc, 0x2e, 0xcc, 0x82, 0x61, 0xb1, 0x25, 0x12, 0x1d, 0x74, 0x39, 0xfc, 0x34, 0xf7, 0x9b, 0x51, 0xfd, 0x81, 0x86, 0x36, 0x99, 0x07, 0x2a, 0xea, 0xdf, 0x4f, 0x44, 0x05, 0x96, 0x56, 0xf1, 0xfe, 0xe7, 0xee, 0xc4, 0xf0, 0x11, 0xab, 0x16, 0x9e, 0x5f, 0x00, 0x9d, 0xb4, 0x58, 0xa6, 0x41, 0x50, 0x35, 0x3d, 0x2a, 0xc0, 0x98, 0x36, 0x1e, 0x8e, 0x7a, 0xf0, 0x0a, 0xb9, 0x65, 0x21, 0xde, 0x46, 0xe4, 0x78, 0x9e, 0xf7, 0x39, 0x81, 0xb6, 0x5b, 0x4d, 0xc8, 0x8f, 0x07, 0xed, 0x41, 0x5f, 0x22, 0x32, 0xe7, 0x45, 0x27, 0x41, 0xa4, 0x95, 0xe6, 0x35, 0x71, 0x71, 0xcc, 0x5a, 0xbe, 0x99, 0x65, 0x9c, 0x14, 0x83, 0x1f, 0x3f, 0xf9, 0xaf, 0x51, 0xd0, 0x14, 0x35, 0x7b, 0x5b, 0x91, 0xa0, 0xd0, 0xde, 0xc7, 0xfe, 0xf1, 0xfe, 0x18, 0x38, 0xfc, 0xf9, 0x19, 0xa0, 0xc5, 0xdc, 0xf3, 0xc9, 0x63, 0xf6, 0x0a, 0x9b, 0xef, 0x8c, 0xdc, 0xa6, 0x88, 0xce, 0x2b, 0xb7, 0x9a, 0x0a, 0x5e, 0xa9, 0x60, 0x20, 0x25, 0x7e, 0xa8, 0x36, 0x5c, 0xaf, 0xd7, 0xac, 0x32, 0xbf, 0x2c, 0x52, 0x8a, 0x16, 0x49, 0xd9, 0xa1, 0x0d, 0xef, 0x88, 0xf1, 0x46, 0x09, 0x30, 0x56, 0x3e, 0xec, 0x62, 0x70, 0x25, 0xdd, 0xdf, 0x48, 0xed, 0xd3, 0x50, 0x36, 0xa1, 0x7f, 0x38, 0x02, 0xf8, 0x8a, 0x26, 0x49, 0x2a, 0x1e, 0x2f, 0x22, 0x02, 0xa7, 0x9b, 0x02, 0x34, 0xdb, 0xdf, 0xdd, 0xf2, 0xf8, 0xcc, 0x8e, 0xba, 0x4c, 0x05, 0x79, 0x72, 0xfb, 0xb6, 0x6f, 0xb6, 0xfd, 0x83, 0xd2, 0x71, 0x66, 0xbf, 0xf9, 0xaa, 0xea, 0xdf, 0xd5, 0xa1, 0xa0, 0x2e, 0xd5, 0x1b, 0x06, 0xc2, 0x08, 0xfa, 0x46, 0xae, 0x82, 0x10, 0xb7, 0x79, 0x00, 0x35, 0xa7, 0xcf, 0xcf, 0x97, 0x58, 0x77, 0xe9, 0x52, 0x48, 0x85, 0x62, 0x41, 0xb5, 0xd1, 0x02, 0x13, 0x61, 0xa7, 0x34, 0xa1, 0x93, 0xc0, 0x1e, 0x7e, 0x5e, 0x71, 0x12, 0xd0, 0x25, 0x23, 0x25, 0x5f, 0x5f, 0x03, 0x1d, 0xec, 0x98, 0xfb, 0x91, 0xc4, 0xb8, 0xe0, 0x4b, 0x95, 0x88, 0xed, 0xf1, 0x7f, 0x72, 0x70, 0xe5, 0x6e, 0x89, 0xc3, 0x69, 0xa8, 0xc9, 0x7e, 0x07, 0xa2, 0x9f, 0xeb, 0x30, 0x18, 0xac, 0xba, 0x23, 0x5c, 0xc6, 0xf6, 0x10, 0xef, 0x3f, 0x38, 0x7d, 0x4e, 0x6a, 0x1b, 0xea, 0x0e, 0x5c, 0xef, 0xb0, 0x2b, 0xf0, 0xb2, 0x2f, 0x9e, 0x0e, 0x3c, 0x28, 0x2d, 0x2c, 0xb9, 0x68, 0x87, 0x14, 0x5c, 0xa7, 0x90, 0xe8, 0x52, 0xaf, 0xfa, 0x64, 0xf5, 0xc1, 0x15, 0x64, 0x43, 0x34, 0xe8, 0xa6, 0x8e, 0x5f, 0x80, 0xd0, 0x74, 0xb9, 0x88, 0xb5, 0x12, 0x3f, 0x1a, 0xd4, 0x75, 0x16, 0xd5, 0x21, 0x51, 0x72, 0x30, 0x09, 0xf6, 0xb6, 0x0d, 0xb0, 0x7f, 0xdd, 0x92, 0x7d, 0x4d, 0x18, 0x34, 0xd8, 0xb4, 0xb8, 0x14, 0x32, 0xf3, 0x4f, 0x8f, 0x46, 0x6a, 0x12, 0x10, 0x9f, 0x07, 0x82, 0x29, 0x5b, 0x02, 0x4c, 0xe3, 0x2e, 0xca, 0x6d, 0x52, 0xaa, 0x3f, 0x99, 0x6c, 0xbd, 0x21, 0xde, 0x1b, 0x7b, 0xc8, 0x85, 0x90, 0x1d, 0x16, 0x39, 0xdb, 0x4a, 0xab, 0x6b, 0xb8, 0x96, 0x57, 0xf4, 0xac, 0x49, 0xd5, 0xfc, 0x51, 0x61, 0xb6, 0x1b, 0xee, 0xda, 0x9b, 0xbf, 0x4b, 0x2c, 0xa7, 0xce, 0xc4, 0x16, 0x34, 0x8c, 0x9b, 0x9a, 0xc5, 0xbe, 0x93, 0x49, 0x3c, 0x10, 0xba, 0xc0, 0x4e, 0xb4, 0x86, 0x73, 0x33, 0x4c, 0x23, 0xa9, 0xa2, 0x0a, 0x0c, 0xc8, 0xfc, 0x15, 0xd9, 0xd3, 0xc8, 0x2f, 0x57, 0x31, 0x5f, 0x96, 0xde, 0xb0, 0xe8, 0x27, 0xdf, 0xc9, 0x87, 0xc9, 0xbd, 0x26, 0xd2, 0x09, 0xde, 0x61, 0x85, 0x02, 0x01, 0x0f, 0x76, 0x80, 0xd2, 0xfd, 0xcb, 0x65, 0xbb, 0xb9, 0x6a, 0x4b, 0xfe, 0x54, 0xb1, 0x6a, 0x01, 0x67, 0x68, 0xbc, 0xe8, 0x54, 0xf3, 0x60, 0x69, 0xce, 0xcc, 0x3d, 0xdc, 0x9c, 0x31, 0xe7, 0x92, 0x99, 0x1a, 0xc6, 0x68, 0x00, 0x6e, 0x75, 0x9c, 0xe6, 0x76, 0x68, 0xdf, 0x08, 0x92, 0xd2, 0xab, 0xc7, 0x2b, 0xc5, 0xd6, 0x71, 0xe8, 0x9b, 0x68, 0xc2, 0x25, 0x96, 0xaa, 0xab, 0xa1, 0xc3, 0x7f, 0x51, 0x76, 0x24, 0xf7, 0x59, 0x4f, 0x0d, 0x22, 0x63, 0xd5, 0xcf, 0x22, 0xd4, 0x6a, 0x94, 0x84, 0xd9, 0x1a, 0x8a, 0xd1, 0xa9, 0xce, 0x44, 0x5f, 0x0a, 0xc3, 0x5d, 0x6d, 0x16, 0x3b, 0x5e, 0x6f, 0x3f, 0x73, 0xe1, 0xa7, 0x91, 0xd4, 0xf7, 0xf5, 0x37, 0x6d, 0xc8, 0xf0, 0x41, 0xa1, 0x79, 0x35, 0xa4, 0x1d, 0x53, 0x00, 0x82, 0x0e, 0x21, 0xf9, 0xac, 0x90, 0xd9, 0x50, 0x66, 0x69, 0x7f, 0x0b, 0x6a, 0xf7, 0x47, 0x9f, 0x2f, 0x67, 0xfa, 0xbe, 0x6a, 0x28, 0x9a, 0x71, 0xd6, 0x9f, 0x49, 0x66, 0x30, 0x1d, 0x67, 0x8b, 0x86, 0x0e, 0xfb, 0xdc, 0xb2, 0x73, 0x54, 0x78, 0x22, 0x92, 0xf0, 0xfb, 0xda, 0xeb, 0x9c, 0x08, 0xbb, 0x6f, 0xdd, 0x25, 0x05, 0xed, 0x8f, 0xcc, 0x1b, 0xcd, 0xcc, 0xbe, 0x86, 0x00, 0x0f, 0x9b, 0x3d, 0x37, 0x99, 0xb0, 0x23, 0x53, 0x14, 0x10, 0xd2, 0x1d, 0x77, 0xe6, 0x97, 0x38, 0x29, 0x09, 0xbd, 0x54, 0x69, 0xd1, 0x0f, 0xa3, 0xed, 0x2a, 0x98, 0x91, 0xc9, 0xe6, 0xad, 0xb0, 0x93, 0x58, 0x2e, 0xf1, 0xc5, 0x1e, 0x08, 0x1a, 0x62, 0x3e, 0xfe, 0x74, 0xdd, 0x75, 0xaa, 0xc4, 0x36, 0xcb, 0xbe, 0x7d, 0x66, 0x6b, 0x90, 0x34, 0xfd, 0xb2, 0xd6, 0x54, 0x0a, 0x86, 0xad, 0x13, 0x3b, 0xe9, 0xe1, 0xa5, 0x45, 0xcd, 0x68, 0xaf, 0x86, 0x2a, 0x2f, 0xfe, 0xe9, 0x4f, 0x1a, 0x79, 0x0b, 0x76, 0x46, 0x54, 0x9c, 0x9a, 0x91, 0x87, 0x07, 0x8d, 0x5c, 0x7f, 0x55, 0x45, 0x8f, 0x13, 0x4e, 0x76, 0xde, 0xb9, 0xe2, 0x67, 0x4b, 0xfa, 0xc8, 0xfe, 0xec, 0x23, 0x65, 0x1c, 0xef, 0x3e, 0xef, 0x31, 0xdb, 0x40, 0xd2, 0x07, 0x18, 0x84, 0x53, 0xe2, 0xb2, 0x78, 0x73, 0xcb, 0x5a, 0x97, 0x16, 0x29, 0xae, 0x97, 0x64, 0x91, 0xba, 0xe3, 0x70, 0xdf, 0xbe, 0x4b, 0x17, 0x86, 0x31, 0xfa, 0x2c, 0x24, 0x07, 0xa9, 0xd2, 0x5a, 0x30, 0x13, 0x28, 0xda, 0x61, 0xa9, 0x2c, 0xc1, 0x16, 0x86, 0xd9, 0x28, 0xd8, 0xa5, 0x93, 0xf5, 0xbb, 0x52, 0xc5, 0xf7, 0x2c, 0xde, 0xc9, 0x33, 0xe9, 0x97, 0x08, 0x78, 0x51, 0xf7, 0x62, 0x3a, 0xde, 0x1c, 0xd0, 0x9d, 0xf0, 0x78, 0x47, 0xcf, 0xcc, 0xca, 0xe0, 0x9b, 0xe4, 0x4d, 0x37, 0x3b, 0x59, 0x2f, 0x10, 0x6e, 0xbe, 0x44, 0x41, 0xcb, 0x1f, 0xfc, 0xcc, 0x55, 0x41, 0x93, 0x4b, 0x4f, 0x2c, 0x87, 0x91, 0x52, 0xe7, 0x4f, 0x8e, 0x9c, 0x83, 0x4a, 0x73, 0xab, 0x5a, 0xf6, 0x17, 0x0b, 0x99, 0x62, 0x99, 0x6c, 0xfc, 0xe6, 0x48, 0xf7, 0xd9, 0x11, 0xbf, 0xe2, 0x60, 0xe3, 0x54, 0x42, 0x21, 0x3c, 0xb4, 0x21, 0xcf, 0x95, 0xc7, 0xd1, 0x43, 0xee, 0xda, 0x7f, 0xc3, 0x07, 0xfc, 0x0b, 0x85, 0xd3, 0xa8, 0x18, 0x6f, 0x2a, 0xa5, 0x5f, 0x21, 0xbe, 0x2b, 0x48, 0x35, 0x50, 0x47, 0xbb, 0xc5, 0x24, 0x80, 0x33, 0x2e, 0xb2, 0xbb, 0x15, 0x14, 0x9e, 0x5c, 0x41, 0xa7, 0xea, 0xae, 0xe6, 0x24, 0x6b, 0x85, 0x9a, 0x9e, 0x79, 0x22, 0xaa, 0xfe, 0xeb, 0x56, 0xae, 0x49, 0x43, 0xeb, 0x61, 0x21, 0x25, 0x3f, 0xb0, 0x8f, 0x0e, 0x32, 0x11, 0xff, 0x42, 0x42, 0x16, 0x8c, 0x06, 0xf5, 0x42, 0x7e, 0x10, 0x78, 0x1b, 0x11, 0x3c, 0x85, 0x80, 0x79, 0x80, 0x89, 0x3d, 0x22, 0x22, 0x07, 0xdd, 0x3c, 0x28, 0x37, 0xc0, 0x77, 0x11, 0xf4, 0x6d, 0x0b, 0xc2, 0xd5, 0x28, 0xfc, 0xc3, 0x99, 0xc8, 0x9c, 0xab, 0xc8, 0xc3, 0x51, 0xd9, 0x97, 0x8b, 0x98, 0x65, 0x0c, 0x1d, 0x4a, 0x56, 0x64, 0xd6, 0x1f, 0x16, 0xb2, 0x89, 0x70, 0x23, 0xc8, 0xd0, 0x41, 0x06, 0x5a, 0x9f, 0x7e, 0x89, 0x61, 0x1f, 0x85, 0x25, 0xbe, 0xb9, 0xe5, 0xba, 0x20, 0x70, 0x65, 0x83, 0x27, 0x75, 0x49, 0x48, 0xca, 0xf5, 0xd0, 0xd5, 0xf6, 0x36, 0x01, 0xac, 0x77, 0xe2, 0xa7, 0xf7, 0x1c, 0xa3, 0x9b, 0xc0, 0x16, 0xef, 0x41, 0x64, 0xa2, 0x26, 0x55, 0x45, 0xe8, 0xda, 0xe8, 0xc0, 0x22, 0x6d, 0xa5, 0x5f, 0x00, 0xe2, 0x59, 0x4f, 0x4b, 0xed, 0xb3, 0x14, 0xca, 0x4c, 0x48, 0x7b, 0x62, 0x5a, 0xd9, 0xd0, 0x80, 0xe2, 0xd9, 0x52, 0xbc, 0x31, 0x2a, 0xe4, 0xb6, 0x6f, 0x28, 0x05, 0x44, 0x2f, 0xe8, 0x02, 0xd0, 0x44, 0xc1, 0x6a, 0xfb, 0xd6, 0x0c, 0xc3, 0x86, 0xb6, 0x29, 0x7b, 0x73, 0xef, 0xc3, 0x22, 0x67, 0x9e, 0x54, 0xd6, 0x53, 0x03, 0xeb, 0xfe, 0x53, 0xd7, 0x2d, 0x3b, 0xd7, 0xe0, 0x99, 0x9b, 0x00, 0xc4, 0x11, 0x10, 0x4d, 0x1b, 0x96, 0x21, 0x76, 0xc7, 0x54, 0xe0, 0x98, 0x88, 0xde, 0x1c, 0x93, 0xcb, 0xba, 0xd7, 0xb0, 0xc3, 0x20, 0xfa, 0x88, 0xbb, 0xff, 0x48, 0x21, 0xab, 0x41, 0x91, 0x59, 0x09, 0x50, 0x28, 0x88, 0xe1, 0xd9, 0x97, 0x61, 0x28, 0xd0, 0x90, 0x19, 0x4e, 0xb4, 0x27, 0xcc, 0x12, 0x14, 0x3f, 0x1c, 0x9a, 0x52, 0x42, 0x1b, 0xc3, 0xa7, 0x16, 0x6b, 0xb6, 0x67, 0x4c, 0xa3, 0xbc, 0x86, 0x9a, 0xf5, 0x53, 0x5c, 0x8b, 0x0e, 0x81, 0xa5, 0x75, 0x3e, 0x68, 0xcc, 0xac, 0xd9, 0x1b, 0x69, 0xf5, 0xdd, 0xb0, 0x08, 0x3d, 0xd4, 0x96, 0x2c, 0x8b, 0xfc, 0x29, 0x93, 0x34, 0xa6, 0x84, 0xbc, 0x4e, 0xdc, 0x96, 0xa7, 0x66, 0x46, 0x79, 0xdc, 0x76, 0x4f, 0xfe, 0xae, 0x11, 0x83, 0x8d, 0xc1, 0xe1, 0x3b, 0x2c, 0xca, 0x53, 0x7d, 0xdd, 0x96, 0x91, 0x1e, 0x2d, 0x4e, 0xb1, 0x29, 0x0a, 0xf9, 0x2b, 0x85, 0xd5, 0x42, 0x91, 0xd1, 0xb8, 0x7b, 0x7a, 0x93, 0x3a, 0xe3, 0xc0, 0x92, 0x10, 0x24, 0xeb, 0x80, 0x36, 0x20, 0xec, 0xdc, 0x3f, 0xed, 0x0f, 0x17, 0xea, 0x1e, 0x2b, 0xf6, 0xf5, 0x45, 0x1b, 0x37, 0x36, 0xb6, 0x72, 0x77, 0xe7, 0x8d, 0x6b, 0x53, 0x42, 0xf2, 0x1f, 0xce, 0x4e, 0x9b, 0xfb, 0xf2, 0xf8, 0x93, 0x70, 0xbb, 0x65, 0x3a, 0xec, 0x30, 0x87, 0x8e, 0x0a, 0xd3, 0xee, 0xa8, 0x06, 0x3b, 0xe1, 0x89, 0x73, 0x00, 0xae, 0x17, 0x30, 0xd7, 0x3e, 0x63, 0x98, 0xfe, 0xec, 0x2d, 0xf9, 0xdb, 0x97, 0xaa, 0x47, 0xe0, 0xf6, 0x85, 0x12, 0xb1, 0x2c, 0x23, 0xb6, 0x89, 0x9d, 0x2b, 0xd2, 0xda, 0xff, 0x46, 0xfb, 0x33, 0xb4, 0x23, 0xb1, 0x67, 0x57, 0xbf, 0x91, 0xec, 0x95, 0xe3, 0xcd, 0x81, 0x3e, 0xee, 0xda, 0x13, 0x9b, 0xd4, 0x68, 0xe2, 0x03, 0x67, 0x97, 0xe0, 0xa9, 0xd5, 0x68, 0x59, 0xb8, 0x72, 0x71, 0xd9, 0xa2, 0xb8, 0xd6, 0x4b, 0xb4, 0x8c, 0x74, 0x5e, 0xef, 0xc3, 0x5f, 0x2d, 0x13, 0xe5, 0x8f, 0x1e, 0xfc, 0x31, 0xd6, 0x0a, 0x31, 0xe1, 0x15, 0x9f, 0xbb, 0xaf, 0xb0, 0x03, 0x33, 0x97, 0x3f, 0xba, 0x1f, 0xdf, 0x87, 0xca, 0x7f, 0x55, 0xa8, 0x1d, 0xa2, 0xd8, 0x97, 0x26, 0x3e, 0x19, 0xcf, 0xc8, 0xc0, 0xa3, 0x44, 0x73, 0xe1, 0x19, 0x99, 0x90, 0x7a, 0xbf, 0x92, 0x1f, 0x99, 0x3c, 0xcc, 0x9e, 0xd4, 0x9f, 0xac, 0x2d, 0xdd, 0x9f, 0x95, 0xf1, 0x57, 0x27, 0x5e, 0xb6, 0xe8, 0x12, 0x03, 0xd8, 0x90, 0x33, 0x9a, 0x63, 0x39, 0x98, 0x89, 0x79, 0x8f, 0x0f, 0xf7, 0xf4, 0x11, 0xea, 0x80, 0x4d, 0x68, 0x00, 0x2d, 0xbd, 0xf8, 0xf4, 0xa3, 0xa1, 0xb6, 0xba, 0x9a, 0x23, 0x39, 0x56, 0x91, 0x17, 0x13, 0xe7, 0xc0, 0x23, 0x61, 0xe5, 0x4f, 0x23, 0xa1, 0xa7, 0xc5, 0xcb, 0xc4, 0x28, 0xc3, 0x8e, 0x84, 0x0a, 0xf2, 0xbf, 0xf8, 0xdb, 0x3a, 0xf7, 0x66, 0x98, 0x35, 0xb6, 0x58, 0x6f, 0xe3, 0x4d, 0xf2, 0xc9, 0x9f, 0xfb, 0x82, 0x88, 0x51, 0x56, 0x59, 0x8d, 0xe6, 0xec, 0xda, 0x7e, 0xfd, 0x2b, 0xd0, 0xc6, 0xe3, 0x7e, 0x05, 0xdd, 0xc2, 0xb9, 0x10, 0xc9, 0x15, 0xb7, 0x6e, 0xe5, 0x5f, 0x41, 0xd4, 0xe1, 0x1d, 0x32, 0xc4, 0x0a, 0xf9, 0xd9, 0x5f, 0xcb, 0x40, 0x9f, 0x7a, 0x74, 0x96, 0xea, 0xf3, 0x3b, 0xe9, 0x41, 0x45, 0x81, 0xa3, 0xb0, 0x5b, 0x56, 0x24, 0x6e, 0xa2, 0x3e, 0x6f, 0xbd, 0x62, 0x35, 0x23, 0x12, 0x4e, 0xf2, 0xae, 0x76, 0x5a, 0x69, 0xbd, 0x2c, 0xcc, 0x93, 0xf6, 0x94, 0x96, 0x71, 0xea, 0x4f, 0xe3, 0x4f, 0x45, 0xa4, 0xf0, 0x46, 0x48, 0x22, 0x1d, 0x04, 0x7a, 0x87, 0x44, 0xd0, 0x9a, 0xe1, 0x49, 0xc8, 0xd7, 0xf3, 0xf2, 0x6d, 0x44, 0xda, 0xf9, 0x62, 0x86, 0xf1, 0x60, 0x71, 0xcf, 0xf1, 0x05, 0xcf, 0x11, 0x5d, 0x76, 0xa1, 0x6b, 0x1d, 0x06, 0xbe, 0xe8, 0x68, 0x21, 0xb7, 0x68, 0xe8, 0xdc, 0x15, 0xde, 0x19, 0xd0, 0xe1, 0xbc, 0xf3, 0x29, 0x6a, 0xac, 0xc8, 0xfa, 0x42, 0x81, 0x6f, 0xd4, 0x8a, 0x6d, 0xa2, 0x96, 0x6f, 0x74, 0xa5, 0x86, 0xf5, 0x20, 0x28, 0xa1, 0xf4, 0x77, 0x6f, 0x30, 0x5f, 0x2a, 0xb0, 0x9c, 0xcc, 0x0f, 0xbd, 0x83, 0x31, 0xd1, 0xe2, 0x0b, 0xec, 0xe7, 0x11, 0x77, 0x07, 0xc2, 0x3c, 0xf8, 0xb9, 0x4b, 0x03, 0xc5, 0x30, 0x8c, 0x8f, 0x6d, 0x8d, 0xad, 0xbe, 0x6c, 0x31, 0x23, 0x80, 0xfd, 0x37, 0x24, 0x81, 0x30, 0x41, 0x5e, 0x08, 0x3c, 0x78, 0xe8, 0x1f, 0x16, 0xce, 0x79, 0xf4, 0x43, 0x87, 0xd8, 0x7f, 0xea, 0xf7, 0x93, 0x65, 0x2d, 0x8d, 0xf4, 0x1c, 0xb9, 0x10, 0x31, 0x50, 0x9c, 0x29, 0xe3, 0x86, 0x58, 0x22, 0xb9, 0x00, 0x35, 0xed, 0x6e, 0xe0, 0xdb, 0x68, 0xf8, 0x90, 0x1f, 0xdf, 0x03, 0x60, 0x1e, 0xd2, 0x9d, 0x71, 0x88, 0xf9, 0x33, 0xd3, 0x3f, 0x86, 0xbc, 0xea, 0x21, 0xaa, 0x34, 0x16, 0x21, 0x5a, 0x4c, 0x92, 0x9d, 0x53, 0x60, 0x9d, 0xec, 0x5c, 0xa9, 0xd8, 0x36, 0xcb, 0xb4, 0xf0, 0x88, 0x4a, 0x12, 0x7c, 0x27, 0xdb, 0x52, 0x29, 0x25, 0x1a, 0x2c, 0x14, 0x33, 0xc2, 0xff, 0x77, 0xb6, 0x73, 0x7e, 0x88, 0x1d, 0xb3, 0xa5, 0x9e, 0x71, 0x32, 0xf3, 0x96, 0x2d, 0x52, 0xd3, 0x75, 0x51, 0xe6, 0x5b, 0x4e, 0xb2, 0x3a, 0x38, 0x67, 0x94, 0x55, 0xe9, 0x97, 0x7a, 0x7a, 0x2c, 0xf2, 0x3d, 0xf5, 0xb6, 0xa9, 0x5c, 0x14, 0x27, 0x2b, 0x93, 0x73, 0x3d, 0x90, 0xaf, 0x7c, 0x48, 0x38, 0xa0, 0x2f, 0xde, 0xaf, 0xd0, 0x1f, 0xcf, 0xd4, 0xb3, 0xbd, 0x5b, 0x3b, 0xa0, 0xd9, 0xa3, 0xcf, 0xdf, 0x66, 0x5e, 0xbc, 0x03, 0x7e, 0xcd, 0x8c, 0x79, 0xa6, 0xf1, 0x8f, 0x62, 0x52, 0xfb, 0x81, 0x9e, 0xac, 0x04, 0x67, 0x29, 0x91, 0xfe, 0xba, 0xab, 0xdc, 0xeb, 0xc7, 0x4a, 0xe8, 0x4d, 0x56, 0xc3, 0x50, 0xdd, 0x8a, 0xb9, 0xf9, 0x7f, 0x08, 0x4d, 0x53, 0x76, 0x5b, 0xee, 0xdb, 0xd4, 0x98, 0x72, 0xe5, 0x35, 0x3d, 0x66, 0x98, 0xad, 0x5f, 0xa3, 0x3a, 0xff, 0x05, 0x22, 0xae, 0x10, 0xcf, 0x12, 0x3a, 0x9b, 0xdb, 0x27, 0x8e, 0x25, 0xe8, 0x34, 0x02, 0x34, 0xbc, 0xfc, 0x20, 0xbc, 0xc4, 0x46, 0x62, 0xda, 0xfb, 0x2f, 0x3c, 0xc4, 0x0c, 0xc4, 0x5d, 0x01, 0xbb, 0xd0, 0x33, 0xd5, 0x81, 0xf3, 0xad, 0x00, 0x76, 0xf4, 0x44, 0xa8, 0x75, 0x58, 0x3c, 0x93, 0x7a, 0x34, 0x27, 0x99, 0x4e, 0x3f, 0xac, 0x59, 0x67, 0x2b, 0x86, 0x2c, 0x09, 0x36, 0xcf, 0x57, 0xb2, 0xfc, 0x7f, 0x85, 0xb5, 0x8f, 0x30, 0x74, 0x25, 0xc9, 0x24, 0xee, 0xf4, 0xe1, 0x88, 0xfb, 0x5c, 0x3d, 0xfa, 0x55, 0x7e, 0x87, 0x4a, 0x1c, 0x4a, 0x03, 0x7d, 0xcb, 0x9e, 0x20, 0x18, 0x6b, 0xb2, 0x4d, 0x9b, 0x06, 0xb3, 0x0d, 0x4b, 0x5f, 0xae, 0x4e, 0x34, 0xe0, 0xb0, 0xf7, 0x6f, 0xd4, 0x2c, 0xc0, 0xa1, 0xd6, 0x9c, 0x46, 0xc4, 0x89, 0x6b, 0x5f, 0x2a, 0x8a, 0x13, 0xaa, 0xbe, 0xa3, 0x83, 0x6b, 0x8e, 0x42, 0xc3, 0x96, 0x86, 0x29, 0xda, 0x2a, 0x7e, 0x66, 0xf0, 0xc0, 0x78, 0x86, 0xb0, 0x64, 0x22, 0x06, 0xf0, 0xa3, 0xa3, 0x0a, 0x94, 0xe5, 0x93, 0x51, 0xaf, 0xfe, 0x4b, 0x69, 0xec, 0xff, 0x60, 0x1f, 0x2d, 0x52, 0x6a, 0x3a, 0x71, 0x06, 0x0a, 0x69, 0xfb, 0x67, 0x2b, 0x79, 0xb1, 0xd2, 0x87, 0xcb, 0xc2, 0xc7, 0x6d, 0x06, 0x8b, 0x40, 0xc2, 0x09, 0xbc, 0x41, 0x47, 0x24, 0xb6, 0xb1, 0x19, 0x87, 0x38, 0x68, 0x7e, 0xfa, 0x3b, 0x89, 0xde, 0xcf, 0x1a, 0x12, 0x10, 0x15, 0xf6, 0xb1, 0xd8, 0x0f, 0x59, 0xda, 0xad, 0xe5, 0x19, 0x16, 0xbf, 0x98, 0x80, 0x9e, 0x38, 0x3b, 0xa9, 0x28, 0xc2, 0x61, 0x2d, 0x01, 0x4a, 0xd2, 0x00, 0x5c, 0x04, 0x82, 0x95, 0xea, 0xb0, 0xc3, 0x49, 0xaa, 0x1b, 0xb9, 0xfe, 0x03, 0xe8, 0x0e, 0x06, 0x10, 0x90, 0xe8, 0x44, 0x3b, 0xa8, 0x18, 0x8d, 0x0d, 0x63, 0x95, 0x54, 0x44, 0x57, 0x28, 0x87, 0x26, 0x84, 0x68, 0xb4, 0x16, 0x92, 0xe9, 0x70, 0x65, 0x5a, 0xb1, 0xf9, 0x6a, 0xa8, 0xeb, 0x1a, 0xd5, 0x3f, 0xe0, 0x4f, 0x40, 0x1e, 0x22, 0x2a, 0x07, 0x02, 0x0a, 0xf5, 0x5a, 0x2c, 0x65, 0x99, 0x90, 0x64, 0x6b, 0xbf, 0xbe, 0x3e, 0xf1, 0x34, 0x89, 0x9c, 0xdf, 0x92, 0x38, 0x74, 0xe3, 0x1d, 0x0e, 0xd4, 0x67, 0xeb, 0xd6, 0x23, 0xc1, 0x48, 0xbf, 0xa9, 0xaa, 0x58, 0x6a, 0x52, 0xf2, 0xfe, 0x42, 0xae, 0x72, 0xfd, 0x0c, 0x3d, 0x41, 0x5d, 0xbe, 0xea, 0x2b, 0x11, 0x95, 0xd5, 0x5e, 0xd6, 0x62, 0x55, 0x67, 0x5e, 0x25, 0x3e, 0x5d, 0xae, 0xdc, 0x5f, 0x5c, 0xc5, 0x9d, 0x4f, 0x35, 0x7e, 0xe3, 0x6a, 0x64, 0xb7, 0x26, 0x16, 0x43, 0xb3, 0xae, 0x4b, 0x7d, 0xbd, 0xa8, 0x52, 0xc4, 0x0e, 0x7a, 0xcc, 0xc7, 0xf1, 0x54, 0xf7, 0x5e, 0x25, 0x07, 0x2d, 0x08, 0x83, 0x1b, 0xad, 0x98, 0xe0, 0x1b, 0x9e, 0x2b, 0x35, 0x34, 0x51, 0x5d, 0xfe, 0xff, 0xc7, 0xbd, 0xdf, 0x9a, 0x73, 0x7e, 0x8d, 0xfd, 0x40, 0x6f, 0xec, 0x8b, 0xd6, 0x2d, 0x75, 0xe8, 0x19, 0x96, 0xdb, 0x0b, 0xf3, 0x82, 0xee, 0x94, 0x54, 0xae, 0xbf, 0x5f, 0x77, 0xf9, 0x05, 0x59, 0x66, 0xd3, 0xbf, 0x92, 0xc0, 0xf2, 0x1b, 0x94, 0xba, 0x46, 0x97, 0xf4, 0x64, 0x30, 0x66, 0x26, 0x2e, 0xef, 0x15, 0x95, 0xaa, 0x5b, 0x6e, 0xf3, 0x93, 0xd5, 0x9d, 0xce, 0x0f, 0x7e, 0x91, 0x65, 0x31, 0xa7, 0xa5, 0xb9, 0xc2, 0x89, 0x80, 0xe7, 0x41, 0x36, 0x39, 0xb4, 0x28, 0xd0, 0xbf, 0x6a, 0x71, 0xf9, 0x79, 0xe3, 0x59, 0x8a, 0x29, 0xe3, 0x64, 0x88, 0x16, 0xab, 0xa1, 0x54, 0x6a, 0xca, 0x2f, 0x21, 0xd9, 0x37, 0x00, 0xab, 0x83, 0x9d, 0xdd, 0x27, 0x1c, 0xf6, 0xaa, 0x75, 0x4a, 0x5b, 0xec, 0x9d, 0x4e, 0x1a, 0x88, 0x79, 0xe7, 0x0a, 0xcd, 0xaf, 0x73, 0x1b, 0xb5, 0xe3, 0x58, 0x31, 0x68, 0x2a, 0xa2, 0x33, 0x02, 0xc1, 0xee, 0x5e, 0x96, 0xff, 0x86, 0xe0, 0x73, 0x88, 0xcd, 0xa2, 0xa6, 0xc4, 0xde, 0x65, 0xc0, 0x8f, 0x70, 0x10, 0xd9, 0x32, 0xfd, 0x48, 0xd4, 0x92, 0x23, 0x42, 0xe5, 0xa8, 0x4a, 0xd5, 0x51, 0x31, 0x87, 0xd4, 0x75, 0xa7, 0xc0, 0x9a, 0x0a, 0x6f, 0x11, 0xe6, 0xa7, 0x54, 0x6f, 0xea, 0x87, 0x34, 0x8b, 0x9e, 0x8d, 0xf9, 0xf9, 0x5a, 0x85, 0xcb, 0x92, 0xa4, 0xad, 0x85, 0x17, 0x47, 0x74, 0x65, 0x17, 0xa5, 0x81, 0x07, 0x12, 0x4d, 0xf7, 0x94, 0xde, 0xd0, 0xf8, 0x37, 0x4a, 0xd1, 0x68, 0xd0, 0x02, 0x5c, 0xf3, 0xed, 0xb2, 0x79, 0x51, 0xf6, 0x6e, 0x00, 0xc8, 0xa7, 0x52, 0xae, 0xf3, 0xc3, 0x65, 0x79, 0xc3, 0x07, 0xc3, 0x21, 0xc3, 0x5d, 0xfc, 0x08, 0xa0, 0x53, 0xb7, 0x43, 0xe8, 0xcb, 0x9b, 0xf1, 0x12, 0xf4, 0x6f, 0xcb, 0xbf, 0x79, 0x7f, 0xfd, 0x3f, 0xf8, 0x42, 0x35, 0x57, 0xb5, 0x3b, 0xf9, 0x41, 0x90, 0x1d, 0x3d, 0xf5, 0x34, 0x32, 0x35, 0xa7, 0x92, 0xfd, 0x68, 0x91, 0x8e, 0x1f, 0x06, 0xf2, 0xf7, 0x77, 0x7b, 0x57, 0xbd, 0x8d, 0x44, 0x19, 0x5e, 0x31, 0x01, 0x27, 0xa2, 0x5f, 0xcc, 0x05, 0x88, 0x66, 0xca, 0x15, 0x80, 0x49, 0xff, 0x16, 0xda, 0x66, 0x67, 0xea, 0x7f, 0x55, 0x42, 0x9c, 0xdf, 0x13, 0xaf, 0xa1, 0x2a, 0x60, 0x7c, 0x5e, 0xc3, 0x65, 0x3d, 0xeb, 0xf2, 0x9a, 0x9b, 0x17, 0xd9, 0xe7, 0xef, 0xac, 0xa9, 0x0a, 0x10, 0xf4, 0x15, 0x38, 0x68, 0x7b, 0x07, 0x07, 0x4e, 0x17, 0x92, 0x8b, 0x90, 0x26, 0x29, 0xbf, 0x4e, 0x17, 0x0e, 0x27, 0x0f, 0x2c, 0x0c, 0xb4, 0x0e, 0x7d, 0x69, 0xe8, 0xd5, 0x41, 0x17, 0x3a, 0x0d, 0x49, 0x2a, 0xbc, 0x95, 0xcd, 0x8f, 0xfb, 0xd1, 0x6b, 0xfa, 0x27, 0x45, 0x6d, 0x20, 0x74, 0x62, 0x4b, 0x27, 0xbf, 0x9f, 0x70, 0x5a, 0x75, 0xcc, 0x41, 0x22, 0xb1, 0xa3, 0x5c, 0x31, 0xa4, 0xa1, 0x1d, 0x01, 0x3a, 0x14, 0x67, 0x7d, 0xfa, 0x74, 0xa1, 0xfe, 0x2f, 0xf6, 0xfe, 0x78, 0x45, 0x5f, 0x02, 0xf6, 0x75, 0x16, 0x42, 0x43, 0xa5, 0x7e, 0x6b, 0xea, 0x89, 0x82, 0x85, 0x61, 0x0f, 0x72, 0x79, 0x82, 0xfa, 0x0d, 0xd1, 0x3a, 0xcc, 0xdf, 0xc0, 0x85, 0xea, 0xcd, 0x62, 0x9a, 0xfb, 0xee, 0x44, 0x62, 0x91, 0x9c, 0x27, 0x2f, 0x0b, 0xcb, 0x01, 0xab, 0xba, 0x9a, 0x45, 0x0f, 0x42, 0x28, 0x64, 0x95, 0x43, 0xa9, 0x94, 0x2f, 0x39, 0xb9, 0xd0, 0x79, 0xa1, 0xef, 0x20, 0xec, 0x5e, 0xb6, 0x1a, 0x55, 0x5a, 0x58, 0xa9, 0x86, 0x70, 0x5c, 0x0d, 0x4c, 0x8a, 0x12, 0x23, 0xa1, 0x06, 0x6c, 0xe7, 0x22, 0x5f, 0x0f, 0x37, 0xc3, 0x09, 0xaa, 0xda, 0xc1, 0x9c, 0x87, 0xc0, 0xd8, 0x35, 0x60, 0x8b, 0xb7, 0x19, 0x73, 0x4f, 0xb1, 0x9c, 0xd8, 0x96, 0xb5, 0x42, 0x13, 0xa8, 0x80, 0x23, 0xe6, 0x09, 0x11, 0x94, 0x69, 0x42, 0x5d, 0x03, 0x5c, 0xe4, 0x45, 0x23, 0xbb, 0xcb, 0xc5, 0x4a, 0x93, 0xa0, 0x6e, 0x17, 0x15, 0xa1, 0x16, 0x57, 0xe8, 0xa5, 0xce, 0x29, 0xc4, 0x5a, 0x14, 0x61, 0x3d, 0xd2, 0x4a, 0x2b, 0xdc, 0x3e, 0x67, 0xf1, 0x74, 0xf9, 0xed, 0x7e, 0xb3, 0xc8, 0x1b, 0x63, 0xf8, 0x60, 0x63, 0x99, 0x64, 0x28, 0x1e, 0x69, 0x34, 0x41, 0x7f, 0x89, 0x4e, 0xc4, 0xc5, 0x88, 0x19, 0x4a, 0xb5, 0x6b, 0x92, 0xb2, 0x48, 0x99, 0x9d, 0x1e, 0xa1, 0xf4, 0x98, 0x3f, 0x41, 0x49, 0x36, 0xd3, 0x7e, 0xea, 0x8b, 0x6b, 0x31, 0x99, 0x63, 0x72, 0xb0, 0xa8, 0xd8, 0x6b, 0xfc, 0x5f, 0x24, 0x7a, 0x3b, 0x9e, 0xb3, 0x26, 0x68, 0xc3, 0x7d, 0x5d, 0x49, 0xce, 0x92, 0xb8, 0xa1, 0xc4, 0xf6, 0x01, 0xa8, 0x51, 0xb0, 0xf3, 0xb8, 0xb0, 0x1e, 0x40, 0x49, 0xd0, 0x8b, 0xd9, 0x1f, 0xaf, 0x03, 0x69, 0xc2, 0x0a, 0x66, 0x22, 0x2f, 0x39, 0xbc, 0xbd, 0xcd, 0x55, 0xc8, 0xbc, 0xa2, 0x9b, 0xe0, 0xf3, 0xc7, 0x15, 0xfc, 0x46, 0x19, 0x77, 0x0c, 0xb4, 0x32, 0x47, 0x8f, 0x95, 0x98, 0x40, 0x61, 0x1f, 0x33, 0xf9, 0xd4, 0x2f, 0x05, 0xc2, 0x03, 0x47, 0x15, 0xce, 0x63, 0xd2, 0xac, 0x98, 0x9b, 0xb0, 0xc4, 0x7f, 0x96, 0xee, 0xbe, 0xb3, 0xd6, 0xd5, 0x53, 0x55, 0x0b, 0x27, 0xcd, 0xda, 0xe4, 0xa5, 0x77, 0xb1, 0x25, 0xd4, 0x52, 0x25, 0xfa, 0x01, 0x09, 0x84, 0x8a, 0x83, 0x27, 0x81, 0xd0, 0x40, 0x88, 0xd7, 0xa6, 0x73, 0x0d, 0x2f, 0x23, 0xac, 0x94, 0x44, 0x27, 0x18, 0x28, 0x45, 0x34, 0x02, 0x74, 0x7b, 0x80, 0x9a, 0x7e, 0x2b, 0x48, 0xf5, 0x92, 0xbe, 0x66, 0x56, 0x7b, 0x1f, 0x26, 0xac, 0xfa, 0x65, 0x56, 0x5b, 0x70, 0xb2, 0x9c, 0x3f, 0xde, 0x5a, 0x0d, 0xee, 0x0f, 0x48, 0xfa, 0x3e, 0x14, 0x9e, 0x0d, 0x08, 0xf1, 0x9c, 0x95, 0x2b, 0x96, 0xc3, 0x1f, 0xd3, 0x11, 0x3a, 0x46, 0xfb, 0x01, 0x70, 0xcc, 0x30, 0x4e, 0x03, 0xe9, 0x98, 0x17, 0xe1, 0xe2, 0x34, 0xec, 0xad, 0xde, 0x62, 0x3e, 0x64, 0xf6, 0xa6, 0x13, 0x40, 0x8b, 0xa9, 0xfe, 0xdc, 0xdc, 0x82, 0x4f, 0x9a, 0xd7, 0x35, 0x87, 0x42, 0x30, 0x79, 0x0f, 0xeb, 0xb1, 0xbf, 0x29, 0x1f, 0xd1, 0x6f, 0x26, 0x3a, 0x87, 0x75, 0xda, 0x13, 0x60, 0xfc, 0x4d, 0xde, 0xd0, 0x79, 0xb3, 0x51, 0xc5, 0xec, 0x9e, 0x06, 0x82, 0x63, 0x73, 0x21, 0xab, 0xbf, 0x1a, 0x32, 0x9c, 0xba, 0xfa, 0x5d, 0xff, 0x29, 0x25, 0xb8, 0x9e, 0x7f, 0xcf, 0xf4, 0x75, 0x93, 0x05, 0x40, 0x0c, 0xa3, 0x9c, 0x6a, 0x04, 0x98, 0x67, 0x47, 0xef, 0x8b, 0xad, 0x56, 0x65, 0x89, 0xd9, 0xa0, 0x54, 0x93, 0x74, 0xe2, 0x97, 0xe9, 0x51, 0xee, 0xca, 0x89, 0x07, 0x4f, 0x5d, 0xf2, 0xa4, 0x2c, 0xe8, 0x2d, 0xa0, 0x6f, 0xbe, 0x0e, 0x10, 0x25, 0xc5, 0xb8, 0x1c, 0x28, 0x85, 0x5f, 0xb3, 0xfc, 0x7e, 0x52, 0x7e, 0xf8, 0xbf, 0x38, 0x12, 0xa6, 0xb4, 0x99, 0x69, 0x6c, 0x40, 0xa1, 0x93, 0x6b, 0x0b, 0x21, 0xa9, 0xa7, 0x1e, 0xd7, 0x03, 0x68, 0xad, 0xef, 0xaa, 0xe1, 0x33, 0xc9, 0x10, 0x10, 0xc5, 0xfd, 0xff, 0xe5, 0x9f, 0x9d, 0xd0, 0xa6, 0x04, 0xba, 0xdd, 0x92, 0x45, 0x29, 0x39, 0xc5, 0x1f, 0x86, 0x9e, 0x5b, 0x49, 0x7a, 0xa6, 0xd8, 0x4e, 0x3a, 0x3e, 0xc8, 0x99, 0x50, 0x58, 0xa2, 0xce, 0x9e, 0xe1, 0xf2, 0x61, 0xa0, 0xf3, 0xb7, 0x61, 0xf1, 0x4b, 0x0a, 0x94, 0x11, 0xfd, 0x01, 0xc9, 0x65, 0x66, 0xd3, 0x6a, 0x7f, 0x63, 0x3d, 0x51, 0xa0, 0xc0, 0x24, 0xdc, 0x7b, 0xf4, 0x7b, 0x44, 0x3c, 0x0b, 0x67, 0x2a, 0xc9, 0xe3, 0xa1, 0x73, 0x48, 0x9b, 0x1d, 0x56, 0xe1, 0x49, 0xe9, 0xb3, 0xc5, 0xeb, 0x57, 0xa7, 0x6f, 0xa1, 0x5e, 0x5d, 0x2a, 0x19, 0x3e, 0x27, 0xd3, 0x4a, 0x63, 0xcd, 0xe0, 0x65, 0x8c, 0x25, 0xa1, 0x08, 0x2c, 0xe3, 0xc6, 0xb5, 0x10, 0xb3, 0x22, 0x84, 0x43, 0x85, 0xae, 0x14, 0x2f, 0x28, 0xd1, 0xc7, 0x04, 0x1b, 0xde, 0x2f, 0x5e, 0xa0, 0xdf, 0xc3, 0x22, 0x11, 0x91, 0xd7, 0xa8, 0x77, 0xaf, 0xcb, 0x20, 0x59, 0x73, 0x82, 0x2e, 0xd2, 0x5b, 0x15, 0xd8, 0xe6, 0x29, 0xc9, 0xa2, 0x16, 0x2d, 0x3f, 0xf7, 0x32, 0xc6, 0xeb, 0xcb, 0x6f, 0x27, 0xc7, 0x7f, 0xba, 0x57, 0x49, 0x05, 0x4b, 0x7b, 0x92, 0x44, 0x7c, 0x58, 0xe8, 0xbe, 0xdc, 0x14, 0x66, 0x70, 0x7f, 0x3c, 0xf2, 0xf9, 0x99, 0x0c, 0x70, 0xff, 0x4b, 0xea, 0x35, 0xcf, 0xbd, 0x33, 0xbf, 0x43, 0x6d, 0x3a, 0xa3, 0xe9, 0xc7, 0x8e, 0xc6, 0x61, 0xf5, 0x7c, 0xd0, 0x07, 0xf8, 0xd5, 0xde, 0xd3, 0xf8, 0xf2, 0x78, 0x7d, 0xd8, 0xf4, 0xc2, 0xe4, 0x0e, 0x50, 0xf6, 0xb0, 0xb2, 0x8c, 0x11, 0x36, 0xd4, 0x43, 0xcd, 0x9d, 0x13, 0x6f, 0xd0, 0x3f, 0x6b, 0xe8, 0x23, 0x52, 0x4f, 0x27, 0xe5, 0xc8, 0xf8, 0x50, 0x41, 0x73, 0xfc, 0x70, 0x9d, 0x6d, 0x22, 0x02, 0x14, 0xb7, 0x75, 0xb9, 0x27, 0x20, 0x97, 0x79, 0xaf, 0x69, 0x58, 0xa6, 0x16, 0xa6, 0x87, 0xa2, 0xc7, 0xe7, 0x09, 0x91, 0xe3, 0x18, 0x27, 0x60, 0x36, 0x26, 0x2c, 0x05, 0x69, 0x64, 0x30, 0x08, 0x79, 0x2c, 0x2f, 0x42, 0x68, 0xc9, 0x5e, 0xe5, 0x32, 0x94, 0xbe, 0xbc, 0x02, 0x5e, 0xf1, 0xb4, 0xa6, 0x0e, 0x4d, 0x9c, 0x40, 0x8b, 0x2f, 0x29, 0x3f, 0xdd, 0x91, 0x3d, 0x8e, 0x8f, 0xdf, 0x68, 0x0b, 0x57, 0x07, 0xb0, 0x3b, 0xf9, 0xd0, 0x8d, 0x3c, 0x68, 0x6c, 0x38, 0xfb, 0x2e, 0x50, 0x25, 0xa7, 0x0f, 0x43, 0xce, 0x65, 0xe9, 0xb5, 0xb3, 0x45, 0xdf, 0x53, 0x9f, 0x74, 0xb6, 0xd8, 0x2c, 0xb4, 0x7f, 0x26, 0x89, 0x0a, 0x77, 0x95, 0x7b, 0xb6, 0x2b, 0x8b, 0xa2, 0x68, 0xe0, 0x4d, 0xfe, 0xb1, 0x31, 0x14, 0xb2, 0xb8, 0xfa, 0x64, 0x07, 0x2e, 0x75, 0x99, 0xb3, 0x84, 0xa3, 0xc3, 0x5c, 0x5b, 0xee, 0xb3, 0x58, 0x3c, 0x0c, 0x56, 0xb7, 0x89, 0x26, 0x42, 0x83, 0xb3, 0x3a, 0x8f, 0x46, 0xae, 0xbe, 0xe8, 0xcd, 0xa2, 0x86, 0xe1, 0x2c, 0xe4, 0xe7, 0x8b, 0x02, 0x24, 0x1d, 0x47, 0xfe, 0xe8 ],
+    const [ 0x87, 0x68, 0x04, 0xe2, 0xe7, 0xf2, 0xb0, 0x45, 0xcb, 0x5f, 0x60, 0x95, 0xfc, 0xa5, 0x41, 0x1b, 0x31, 0xef, 0xe0, 0xfe, 0x84, 0x44, 0x40, 0x09, 0x23, 0x63, 0x2a, 0xaf, 0x48, 0xf2, 0xc4, 0x4c, 0x6b, 0xd8, 0x65, 0xae, 0xb6, 0xe8, 0xa8, 0xd4, 0xb9, 0xbf, 0xbf, 0xf5, 0x5f, 0xef, 0x0a, 0xc5, 0x20, 0x5d, 0xe8, 0xf3, 0x79, 0xe7, 0xce, 0xf6, 0x99, 0x4a, 0x96, 0x09, 0x5e, 0x43, 0x19, 0x74, 0x7f, 0xf5, 0xff, 0x0e, 0x0b, 0x8b, 0xd6, 0x00, 0x12, 0x1e, 0x62, 0xcb, 0xa1, 0xd9, 0x34, 0x8d, 0xf4, 0x5b, 0x7e, 0x80, 0xe8, 0x5c, 0x26, 0xc3, 0xaf, 0x94, 0x19, 0x5d, 0xc7, 0xd8, 0xe2, 0x7f, 0x2d, 0x87, 0x7b, 0x09, 0xce, 0x24, 0x63, 0x50, 0x3e, 0x44, 0xf0, 0x1e, 0xac, 0xab, 0xe7, 0xfb, 0x16, 0xb2, 0x4a, 0xab, 0xb9, 0xec, 0x71, 0xf8, 0xcc, 0x08, 0x5c, 0xb2, 0x6d, 0xf9, 0x48, 0xf3, 0xdc, 0x55, 0x80, 0xa7, 0xe7, 0xfb, 0x76, 0x4c, 0xa5, 0xf9, 0x12, 0xf7, 0x67, 0xad, 0x4a, 0x98, 0xec, 0x2a, 0xf3, 0x7e, 0xd4, 0xdc, 0xd7, 0x1e, 0x57, 0x70, 0x07, 0x10, 0x37, 0xee, 0x73, 0x5a, 0xf3, 0x28, 0xb7, 0xf1, 0x3e, 0x58, 0x38, 0x7d, 0xaf, 0x05, 0x70, 0x5d, 0xba, 0x26, 0x86, 0xeb, 0xdf, 0x8a, 0x22, 0x01, 0x21, 0x77, 0x7f, 0xbc, 0xba, 0x92, 0xc2, 0x7f, 0x0d, 0xfe, 0x8a, 0x3b, 0xdc, 0xc8, 0xc8, 0xee, 0xbb, 0x83, 0xd1, 0x6a, 0xc5, 0x2f, 0xb1, 0x58, 0x8d, 0x60, 0xc2, 0x7c, 0x58, 0x9c, 0x7e, 0x3b, 0x89, 0x04, 0x92, 0x5a, 0x5c, 0x36, 0x33, 0x08, 0xd7, 0x73, 0xb5, 0x1f, 0xfe, 0xfd, 0x5a, 0xa7, 0x47, 0xc3, 0x68, 0x9c, 0x4d, 0x40, 0x7e, 0xf0, 0xc8, 0xa1, 0x27, 0xd4, 0xbd, 0x26, 0xb0, 0x34, 0xf2, 0xca, 0x37, 0x80, 0xa5, 0x26, 0x05, 0xb2, 0x7d, 0x93, 0x1e, 0x8d, 0xc1, 0x8f, 0x15, 0x22, 0xc8, 0x62, 0x25, 0x99, 0xb1, 0x01, 0x7e, 0x2e, 0x54, 0x32, 0xdd, 0x7a, 0x77, 0xf1, 0x5f, 0xf4, 0x46, 0x12, 0x97, 0xb7, 0xfd, 0x29, 0xde, 0x86, 0xe8, 0xa7, 0xea, 0x0d, 0x8d, 0x45, 0xa3, 0x69, 0x28, 0xa6, 0x31, 0xeb, 0x57, 0x37, 0x5a, 0x19, 0x17, 0x5b, 0x0b, 0xf6, 0xef, 0xc5, 0x34, 0x84, 0x6b, 0x24, 0xd9, 0x86, 0xcc, 0x06, 0x67, 0x8a, 0xfe, 0xf6, 0x44, 0x27, 0xca, 0xe8, 0xa9, 0x84, 0x4d, 0xd8, 0xb4, 0x19, 0xa9, 0xad, 0xb9, 0xba, 0xfa, 0x63, 0xda, 0xd1, 0x8c, 0x69, 0xd7, 0xeb, 0x4b, 0x48, 0x27, 0x76, 0x7a, 0x86, 0x47, 0xc8, 0xa8, 0xca, 0x52, 0x64, 0xe0, 0x40, 0xd2, 0x79, 0x21, 0x3f, 0xd5, 0xac, 0x0d, 0x2a, 0x44, 0x17, 0xe5, 0x94, 0x71, 0x92, 0xb5, 0xa7, 0xef, 0x31, 0xcc, 0xc6, 0xa6, 0x0e, 0x6f, 0x71, 0x26, 0x48, 0xcf, 0x69, 0x3c, 0x4b, 0x38, 0x15, 0xc3, 0x52, 0x8a, 0x25, 0xbd, 0x2b, 0xed, 0x75, 0xa3, 0x3a, 0xc1, 0x34, 0xf9, 0xc1, 0xd4, 0x45, 0x24, 0x5f, 0xd8, 0xe5, 0x80, 0xd6, 0x14, 0x8f, 0xae, 0x11, 0x59, 0x1c, 0x2b, 0x65, 0x38, 0x2f, 0x27, 0x17, 0x72, 0xd0, 0x94, 0x1e, 0xb0, 0x57, 0x7d, 0x2b, 0x74, 0x8c, 0x99, 0xe7, 0x50, 0x0c, 0x20, 0x7b, 0x56, 0xef, 0xdd, 0x56, 0xcf, 0xa7, 0x85, 0x2a, 0x30, 0x2b, 0x47, 0x38, 0x49, 0x56, 0xa4, 0xce, 0xc0, 0x89, 0x81, 0x0e, 0xbe, 0x98, 0x7a, 0xf0, 0xe8, 0xe4, 0x7a, 0x8b, 0x91, 0xc4, 0x88, 0x90, 0x2d, 0x2a, 0xe4, 0x17, 0x09, 0x83, 0x53, 0x9e, 0x3a, 0xde, 0xb7, 0x4e, 0xd4, 0x51, 0xe2, 0x81, 0x5c, 0x98, 0xac, 0x82, 0x7f, 0x00, 0x43, 0x93, 0x03, 0x84, 0xc3, 0x35, 0xff, 0x35, 0x07, 0xa3, 0x47, 0xdf, 0xbe, 0xa0, 0x2b, 0xe9, 0xc1, 0x72, 0x61, 0x7d, 0xa4, 0x2f, 0x3f, 0xe9, 0x8a, 0x37, 0x2d, 0x45, 0x3e, 0x02, 0x5b, 0x56, 0x80, 0x1c, 0xaf, 0xb3, 0x9d, 0x6d, 0x02, 0x26, 0x43, 0xbe, 0x8b, 0x55, 0x92, 0x79, 0x9b, 0xa2, 0x76, 0xb0, 0x8b, 0x4f, 0x35, 0x61, 0xf3, 0xe6, 0x44, 0xf9, 0x1d, 0xd8, 0x5f, 0x16, 0xba, 0x64, 0xd8, 0x91, 0xd3, 0xba, 0x30, 0xbc, 0x02, 0x61, 0xe4, 0xe8, 0xe1, 0xd6, 0x89, 0x2b, 0xc3, 0x76, 0x1b, 0x60, 0xa2, 0x9d, 0x93, 0x6e, 0x59, 0x10, 0xb7, 0xce, 0x13, 0x98, 0x36, 0x47, 0x04, 0xf0, 0xf4, 0xfc, 0x57, 0xe1, 0xa3, 0xa9, 0x67, 0xac, 0x93, 0x2a, 0x31, 0xa8, 0xcb, 0x3d, 0x0a, 0x2c, 0x58, 0x88, 0x8d, 0xaf, 0xe5, 0xde, 0xd8, 0x2e, 0x8c, 0xbe, 0xf8, 0xcf, 0xec, 0x1c, 0xa1, 0xc3, 0x7c, 0x64, 0x22, 0x70, 0x1e, 0xbd, 0x99, 0xd0, 0xf8, 0x8b, 0x63, 0x14, 0x7f, 0x37, 0xd7, 0x8e, 0xd4, 0x32, 0x34, 0xcd, 0x54, 0x37, 0xd7, 0x0a, 0x6b, 0xd1, 0xb2, 0xc3, 0xa8, 0x1e, 0xf9, 0xa5, 0x17, 0xd2, 0x1e, 0xaf, 0xcb, 0x7e, 0x00, 0x95, 0xba, 0x13, 0x60, 0x62, 0xce, 0xa2, 0x94, 0x62, 0x38, 0x65, 0x7f, 0x3f, 0x08, 0x03, 0xc0, 0x6a, 0xfa, 0x10, 0x2a, 0xbc, 0x93, 0xd3, 0x74, 0x5e, 0x6d, 0x4d, 0x32, 0xe6, 0xd0, 0x76, 0x04, 0xc2, 0x81, 0xca, 0x0e, 0xda, 0xdf, 0x04, 0xa8, 0x71, 0x2b, 0x2a, 0x56, 0x4c, 0x28, 0xc9, 0xfa, 0x17, 0xe4, 0x82, 0x48, 0x04, 0xd5, 0xc5, 0x7b, 0xb5, 0x27, 0xdd, 0x46, 0x5c, 0x55, 0x2d, 0x0e, 0x21, 0xf7, 0xb9, 0x56, 0xc4, 0xdb, 0xe8, 0x7b, 0x83, 0x56, 0x88, 0xa1, 0x3e, 0xdc, 0x12, 0xed, 0xd9, 0xcf, 0x2f, 0xf5, 0xe2, 0x95, 0x7c, 0x74, 0x73, 0xed, 0x8a, 0x43, 0x5a, 0x83, 0x2a, 0x84, 0x78, 0xc2, 0xe7, 0x20, 0x67, 0xe9, 0xd3, 0x75, 0x60, 0x61, 0x87, 0x48, 0x5b, 0x4e, 0x65, 0x01, 0x77, 0x64, 0x20, 0x17, 0x9d, 0xfb, 0x7f, 0xc9, 0x60, 0x66, 0x5d, 0x0f, 0x28, 0x81, 0xf5, 0xd0, 0x90, 0x8a, 0x5c, 0x55, 0x0c, 0x32, 0x4f, 0xfe, 0xcf, 0xf3, 0x2f, 0x33, 0xec, 0xa3, 0x4a, 0x9e, 0xbb, 0x4a, 0x5c, 0x97, 0x7e, 0x31, 0x56, 0xe0, 0x44, 0x3b, 0x5d, 0x93, 0x0e, 0x78, 0x16, 0x58, 0x31, 0xf8, 0x21, 0xdb, 0xfb, 0xdd, 0xe3, 0x7e, 0x99, 0xb4, 0x89, 0x4b, 0x38, 0x06, 0x49, 0x2c, 0x6b, 0x29, 0xeb, 0x5e, 0xcd, 0x5c, 0x89, 0x23, 0xe7, 0x14, 0x93, 0xb7, 0x54, 0x90, 0x15, 0x86, 0x22, 0xb3, 0x3d, 0x9c, 0x7c, 0x13, 0x18, 0x5d, 0x86, 0x4e, 0x9c, 0x76, 0x89, 0x9d, 0xeb, 0x13, 0x50, 0xab, 0xd6, 0x53, 0xd2, 0xa7, 0xa0, 0xf8, 0x11, 0x97, 0x05, 0x64, 0x41, 0xf0, 0x7b, 0xc1, 0x2d, 0x64, 0xb8, 0x7f, 0xd7, 0xfc, 0x74, 0x03, 0x5e, 0x66, 0x70, 0x9d, 0x25, 0x90, 0xb7, 0xbb, 0x32, 0x76, 0x24, 0x5d, 0xd4, 0x38, 0x24, 0xc9, 0x89, 0x6f, 0xbd, 0x80, 0x1e, 0xc1, 0xd0, 0x70, 0x18, 0xb3, 0x9b, 0x6b, 0x53, 0xbf, 0x81, 0xd8, 0xe9, 0xa7, 0x0e, 0xa9, 0x55, 0x08, 0x36, 0x8d, 0xd9, 0x32, 0xdd, 0x66, 0x1d, 0x37, 0x9d, 0xfd, 0x18, 0x42, 0xc3, 0xf4, 0x33, 0x2a, 0x9a, 0xfd, 0xac, 0x47, 0xed, 0x4a, 0x39, 0x85, 0xc7, 0x45, 0xef, 0xb6, 0x7d, 0x80, 0x61, 0x2d, 0xee, 0xef, 0x0c, 0x88, 0x0a, 0x55, 0xf3, 0xcd, 0x91, 0xfc, 0x86, 0xb9, 0x1d, 0xa9, 0xc8, 0x54, 0x63, 0xcf, 0xb1, 0xc9, 0xb6, 0x03, 0xd1, 0x75, 0xcd, 0xb0, 0x37, 0x3e, 0xc5, 0x0c, 0x91, 0x26, 0x69, 0x4a, 0x95, 0x1f, 0xb2, 0x12, 0x9f, 0x22, 0x8a, 0x2e, 0x9b, 0x7b, 0xd5, 0x86, 0x25, 0x67, 0xb2, 0x4e, 0xef, 0xe0, 0xfe, 0x7e, 0x63, 0xb8, 0x1b, 0x82, 0x8a, 0xe5, 0xef, 0x33, 0x2d, 0x1c, 0x2f, 0x07, 0x3a, 0xa1, 0xdd, 0x84, 0x68, 0x5d, 0x0f, 0xfb, 0x1e, 0x31, 0xf3, 0x72, 0x92, 0x8a, 0x10, 0xe2, 0x2e, 0x35, 0xce, 0xa3, 0x37, 0x75, 0x39, 0x24, 0xb0, 0x53, 0x02, 0xdf, 0x7c, 0x36, 0xc6, 0x8c, 0xc4, 0xb3, 0x93, 0x95, 0x98, 0xa6, 0xa9, 0xcb, 0xd9, 0x82, 0x7d, 0x57, 0x56, 0xe5, 0x04, 0xf3, 0x35, 0x70, 0x2d, 0x5a, 0x95, 0xd5, 0xb0, 0xfc, 0x71, 0x31, 0x06, 0xf7, 0xc7, 0x9d, 0xb8, 0x43, 0xfa, 0xff, 0xdd, 0x2c, 0x76, 0x27, 0xde, 0x06, 0x92, 0x17, 0x7d, 0x1c, 0xba, 0xa1, 0x16, 0xe9, 0xcd, 0x38, 0x24, 0x8b, 0xc4, 0x00, 0x06, 0x74, 0x95, 0x27, 0x04, 0x63, 0x56, 0x78, 0x8d, 0x92, 0xa6, 0x2d, 0xc2, 0x31, 0x49, 0x05, 0x39, 0x14, 0x12, 0x97, 0xfa, 0xa9, 0x06, 0xe6, 0xce, 0x2c, 0xbe, 0x35, 0xba, 0x1e, 0x0d, 0x1d, 0xc6, 0xf3, 0xe3, 0xdc, 0x02, 0x0b, 0x71, 0xf0, 0xcb, 0xe3, 0x8e, 0xe5, 0x4b, 0x8d, 0x5a, 0x6b, 0x3f, 0x5d, 0x21, 0xab, 0xfd, 0xe6, 0x82, 0xdb, 0xb5, 0x24, 0xd0, 0x10, 0xf7, 0xfb, 0xb8, 0x54, 0x75, 0xe0, 0x24, 0xf9, 0x0b, 0xd7, 0x60, 0x2d, 0xfc, 0x9d, 0x7b, 0xce, 0x7f, 0x26, 0xf1, 0x7f, 0x7a, 0x4a, 0x86, 0xfb, 0x8d, 0xbb, 0x75, 0xa9, 0x52, 0x3a, 0xca, 0x71, 0xe3, 0x0a, 0x0d, 0xcf, 0x9d, 0xa5, 0x20, 0x25, 0x24, 0xaf, 0x6a, 0x56, 0xa7, 0x28, 0x36, 0x90, 0x66, 0xe5, 0x55, 0x69, 0x71, 0x41, 0x0b, 0x2e, 0xb2, 0x10, 0x29, 0x77, 0x2d, 0xd4, 0x76, 0xff, 0x87, 0x34, 0x53, 0xb3, 0xc5, 0xa9, 0x9f, 0x09, 0x57, 0x7b, 0xd9, 0x93, 0x55, 0xec, 0x84, 0xd4, 0x08, 0xb2, 0xd0, 0x52, 0xac, 0xab, 0x76, 0xec, 0x74, 0xcd, 0xe4, 0x6e, 0xcf, 0x5c, 0x9a, 0x63, 0xea, 0x5f, 0xd4, 0x2b, 0x76, 0x54, 0x69, 0x4d, 0xab, 0x23, 0xf3, 0x0e, 0x8d, 0x51, 0x30, 0x42, 0x6e, 0x76, 0xa8, 0x62, 0xb4, 0xf1, 0x90, 0xdf, 0xdc, 0xda, 0xef, 0xb6, 0xbf, 0x38, 0xff, 0x45, 0x14, 0x74, 0xd6, 0x5c, 0x37, 0x0e, 0x45, 0x98, 0x29, 0x8f, 0x01, 0xec, 0xd7, 0xbf, 0x00, 0x81, 0x9f, 0x17, 0x26, 0xc0, 0x10, 0x79, 0x21, 0xad, 0xf1, 0x1f, 0x92, 0x76, 0x85, 0xd2, 0x6d, 0x4b, 0x0e, 0x5c, 0xa2, 0x71, 0x90, 0x3f, 0xfd, 0x92, 0xd7, 0xa7, 0x4a, 0x58, 0xbb, 0x9e, 0xbe, 0x3a, 0xa3, 0x7f, 0x92, 0x95, 0x48, 0xad, 0xf1, 0xfe, 0xbc, 0x84, 0x14, 0xd7, 0xaa, 0x90, 0xac, 0x20, 0xdf, 0xfd, 0x80, 0x90, 0x09, 0x4f, 0x57, 0xe4, 0xbf, 0x54, 0x18, 0x78, 0xc2, 0x56, 0x30, 0x14, 0x83, 0x94, 0x34, 0x08, 0xe5, 0xf4, 0xc7, 0x7b, 0x43, 0xf2, 0xbf, 0x00, 0xb5, 0xdc, 0x83, 0x6a, 0x8f, 0x41, 0xb7, 0xe2, 0x2b, 0xa7, 0x1c, 0x36, 0xe9, 0x7c, 0xb1, 0x74, 0x73, 0x4f, 0x1f, 0xb8, 0x46, 0x40, 0x53, 0x42, 0x6e, 0xb5, 0x6d, 0xcb, 0x90, 0x4f, 0xd9, 0x19, 0x2e, 0x1d, 0xbb, 0xd2, 0x27, 0x0f, 0x91, 0x8e, 0x7d, 0xad, 0x14, 0x2f, 0x5b, 0x08, 0x5e, 0x75, 0x57, 0xf1, 0x52, 0xcd, 0xf4, 0x6a, 0x39, 0x6a, 0x6b, 0x5a, 0xa9, 0x97, 0xab, 0x85, 0xab, 0x4c, 0x9e, 0xba, 0x1c, 0xff, 0xae, 0x4e, 0x54, 0xbc, 0x88, 0xca, 0x06, 0x78, 0x1f, 0xe1, 0x67, 0xa3, 0xf4, 0xa5, 0x93, 0xfc, 0x96, 0xfa, 0x2c, 0xa9, 0x64, 0x4a, 0x44, 0x87, 0x9a, 0x7a, 0x7d, 0xbf, 0x8c, 0x1d, 0x6e, 0x9a, 0x2c, 0xe8, 0x49, 0x96, 0xd2, 0x66, 0xbb, 0xb9, 0x3d, 0xed, 0x14, 0x25, 0xd5, 0xd1, 0xa8, 0xed, 0x32, 0xd7, 0x75, 0x27, 0xe2, 0xed, 0x06, 0x42, 0x67, 0x18, 0x97, 0x9a, 0x80, 0xad, 0x79, 0x4a, 0xaa, 0xc4, 0xb8, 0x41, 0xe5, 0xea, 0xfc, 0x99, 0xbb, 0x16, 0xad, 0x24, 0x7f, 0xdf, 0x5a, 0x47, 0xd3, 0xeb, 0x5c, 0x0b, 0x6c, 0xab, 0xb6, 0x71, 0x1a, 0x45, 0x40, 0x06, 0x02, 0xd2, 0x05, 0xb8, 0x2e, 0xca, 0xe9, 0xe8, 0x49, 0xbc, 0x8f, 0xc0, 0xa3, 0x43, 0x79, 0xc7, 0x7c, 0x35, 0x71, 0xb2, 0x7e, 0x1d, 0x28, 0x7e, 0x8b, 0xec, 0x1e, 0xbb, 0xb9, 0xeb, 0xc1, 0x2b, 0x9b, 0xf4, 0xd9, 0x8b, 0xc3, 0xe2, 0x23, 0xb1, 0x84, 0x46, 0x3c, 0xd7, 0xfd, 0x5c, 0xc1, 0x37, 0x52, 0x3d, 0xb5, 0xd8, 0x3d, 0x55, 0x23, 0xa7, 0xc6, 0x18, 0x04, 0xc9, 0x4e, 0xf1, 0x62, 0x30, 0xd2, 0x7b, 0xbe, 0x6c, 0x6e, 0xf4, 0xb0, 0xc4, 0x20, 0xef, 0xcd, 0x86, 0xcf, 0x48, 0xcd, 0x9b, 0x8c, 0x5d, 0xee, 0x5e, 0x17, 0x7b, 0x93, 0xaf, 0xa5, 0x97, 0x31, 0x42, 0xe0, 0x3f, 0x6b, 0x3d, 0x30, 0xd0, 0x7c, 0x03, 0x39, 0xe8, 0xd6, 0x4a, 0xa5, 0x1e, 0x08, 0x74, 0x23, 0xf1, 0xe5, 0x1c, 0xaf, 0xff, 0xe3, 0xef, 0x15, 0x78, 0xc1, 0xbd, 0xb0, 0xd1, 0x6d, 0xcf, 0x78, 0xbd, 0x24, 0x7c, 0x3c, 0x59, 0xdb, 0xf7, 0x2b, 0xa6, 0xde, 0x6b, 0x99, 0x3d, 0xb7, 0x4a, 0x00, 0x3e, 0x51, 0xe2, 0x45, 0x8a, 0x5d, 0x31, 0x3d, 0x32, 0xf5, 0xfa, 0x70, 0x2f, 0x7f, 0x18, 0x1d, 0x53, 0xd5, 0x13, 0x7e, 0x7f, 0xa3, 0xf1, 0x4c, 0x17, 0x10, 0x4e, 0x86, 0xb3, 0xa0, 0xaf, 0x6f, 0x17, 0x58, 0x14, 0xd6, 0x66, 0x24, 0xcc, 0x99, 0x92, 0x77, 0x8d, 0x6c, 0x17, 0x31, 0xc4, 0xd7, 0xe9, 0xc5, 0x2a, 0x7e, 0xaa, 0x9b, 0x98, 0xa5, 0x21, 0xb3, 0x1c, 0xf3, 0xe8, 0x8c, 0x4c, 0x76, 0x64, 0x44, 0xda, 0xe8, 0xfa, 0x00, 0x69, 0x31, 0x80, 0x8e, 0x9f, 0x2c, 0xf2, 0x49, 0x7c, 0xae, 0x67, 0x3d, 0xea, 0xc5, 0x43, 0x8c, 0x95, 0x3d, 0xad, 0x11, 0xfc, 0x69, 0x44, 0x42, 0xc9, 0x20, 0x0d, 0x5b, 0x5d, 0x05, 0xb0, 0xb9, 0xb0, 0x0b, 0xe5, 0x83, 0x58, 0x39, 0x29, 0x90, 0xe7, 0xab, 0xb5, 0x85, 0x7a, 0xda, 0xb0, 0x3e, 0x8f, 0x1d, 0xa4, 0x70, 0x17, 0x6f, 0x2f, 0x8c, 0xcd, 0x72, 0xfb, 0xe6, 0xc5, 0xb4, 0xef, 0x16, 0x48, 0x31, 0xa7, 0x9e, 0xdf, 0x1a, 0x22, 0xce, 0xae, 0xd5, 0xbb, 0xe5, 0x03, 0x45, 0x5b, 0x79, 0x2f, 0x4b, 0xec, 0x19, 0x95, 0x8d, 0x11, 0x30, 0x00, 0x76, 0x14, 0x2c, 0x3a, 0x7e, 0x20, 0xe0, 0xda, 0xab, 0xb0, 0x27, 0x5d, 0x57, 0x47, 0xcb, 0x78, 0x35, 0x62, 0xa5, 0xad, 0x8f, 0xaa, 0x05, 0x1d, 0xd1, 0x6f, 0x54, 0x9d, 0x4b, 0x52, 0xf7, 0x0b, 0x33, 0x41, 0x77, 0xe3, 0xe9, 0xa9, 0xdf, 0x0d, 0x7f, 0xe6, 0x66, 0xf9, 0x79, 0xff, 0x4e, 0xee, 0xd1, 0x90, 0x0c, 0x9f, 0x3f, 0x07, 0xa9, 0x00, 0xb7, 0x13, 0x68, 0x57, 0x32, 0x5a, 0xa9, 0x96, 0xb1, 0x6b, 0x0d, 0xe8, 0x7f, 0xf3, 0xdb, 0x8a, 0xb7, 0x33, 0xa3, 0xdc, 0x07, 0xb1, 0x21, 0xb8, 0xb3, 0x2e, 0x63, 0x02, 0xdd, 0xd9, 0x2e, 0x80, 0x03, 0xc2, 0x9f, 0xec, 0xc9, 0x91, 0x0e, 0x48, 0xf9, 0x78, 0x37, 0x72, 0xc8, 0x66, 0x9c, 0xf8, 0x5b, 0x7e, 0x25, 0x2d, 0x89, 0xc7, 0x0a, 0x7d, 0xe3, 0x25, 0xf2, 0xfd, 0xf1, 0x88, 0x5d, 0x46, 0xbf, 0x63, 0x3f, 0x84, 0x98, 0x60, 0xed, 0xca, 0x12, 0x52, 0x3d, 0xa9, 0x4b, 0x6a, 0xe9, 0x00, 0x71, 0xaf, 0x35, 0x15, 0x88, 0xa8, 0xd2, 0xe5, 0x67, 0x5b, 0x01, 0xb9, 0x04, 0x7c, 0xfc, 0xfa, 0xf2, 0xde, 0x91, 0x46, 0x28, 0x2d, 0x10, 0xc3, 0x04, 0xdf, 0x67, 0xb4, 0x90, 0x68, 0x8c, 0x4a, 0x03, 0xad, 0x1b, 0xbc, 0x8b, 0xbc, 0x41, 0x9a, 0x49, 0xba, 0xd8, 0x5e, 0x9d, 0x1c, 0xd3, 0x44, 0xa5, 0x1b, 0xdd, 0x5b, 0x00, 0x61, 0x3d, 0xdc, 0xd8, 0x09, 0xfd, 0xbb, 0x1f, 0xc6, 0x4b, 0x7d, 0x18, 0x62, 0x1f, 0x49, 0x1a, 0x6b, 0x1e, 0x41, 0x91, 0x29, 0xbf, 0x13, 0x45, 0xd2, 0xac, 0xca, 0xdf, 0x01, 0x6b, 0xeb, 0xa9, 0x65, 0x3d, 0xbd, 0x95, 0xb6, 0x46, 0xe8, 0x81, 0xee, 0xef, 0x41, 0xb9, 0xb5, 0x89, 0xe5, 0xbd, 0x1d, 0x33, 0x85, 0x45, 0x8f, 0xfd, 0x00, 0x83, 0x06, 0x4d, 0x37, 0xa8, 0x7a, 0x82, 0x1d, 0xa9, 0xa0, 0xd8, 0x0d, 0x43, 0xd0, 0x8b, 0x61, 0x3d, 0x46, 0x40, 0x40, 0xed, 0x8e, 0xa0, 0xb7, 0xfd, 0x3a, 0x46, 0x0b, 0x6f, 0xd6, 0xdb, 0x4e, 0xdf, 0x1e, 0x7f, 0x31, 0x08, 0x6e, 0x6b, 0x19, 0x8a, 0x79, 0xd5, 0x75, 0xeb, 0x3e, 0x14, 0x4e, 0xdb, 0x38, 0x05, 0x1f, 0xbc, 0xd5, 0xad, 0xe8, 0x61, 0x2a, 0x20, 0x7e, 0x16, 0xe5, 0xa1, 0x25, 0xe1, 0x83, 0x0a, 0x60, 0x08, 0xc3, 0x6f, 0x08, 0xd3, 0x5a, 0xfe, 0x9c, 0x93, 0xe8, 0x29, 0xd8, 0xe3, 0x2b, 0x08, 0x89, 0x2e, 0x72, 0xf8, 0x9f, 0x72, 0x55, 0x89, 0x84, 0x43, 0xa4, 0x97, 0xac, 0x12, 0x9d, 0xb6, 0x6e, 0xaf, 0x62, 0xd4, 0x12, 0x0d, 0xaa, 0x19, 0x2b, 0x46, 0xb6, 0x12, 0x27, 0xde, 0x87, 0x0f, 0x24, 0x4c, 0x4e, 0xc9, 0x05, 0xb6, 0x24, 0x48, 0xc5, 0xfd, 0xfb, 0x04, 0x0c, 0xf9, 0xd4, 0x4b, 0x00, 0x06, 0x33, 0xe2, 0x5e, 0xbf, 0xd0, 0xef, 0xc9, 0x09, 0x90, 0x16, 0x62, 0x54, 0xb3, 0xe3, 0x98, 0x1d, 0x4f, 0x68, 0x42, 0xb7, 0xfd, 0x27, 0xeb, 0x4c, 0xd2, 0x32, 0x6c, 0x1f, 0x91, 0x90, 0xc1, 0x13, 0x1e, 0xe3, 0x15, 0x71, 0x36, 0x48, 0x1f, 0xe6, 0x5e, 0x7f, 0xb1, 0xcb, 0x19, 0x4c, 0x8e, 0xa9, 0x5e, 0x1c, 0x7d, 0xfd, 0x49, 0xec, 0x9b, 0x38, 0x11, 0x67, 0xf5, 0x0a, 0x3a, 0x4e, 0x56, 0xe0, 0x0c, 0x1d, 0x5e, 0xac, 0x43, 0xec, 0xd4, 0xe4, 0x08, 0x93, 0x3d, 0xcd, 0x20, 0x11, 0xae, 0xf9, 0x64, 0x2f, 0xde, 0x0e, 0x71, 0x60, 0x7f, 0xca, 0xa0, 0xec, 0xcf, 0x44, 0x39, 0x4d, 0x6a, 0x75, 0xe3, 0xd9, 0x62, 0xf6, 0x5f, 0xa2, 0x91, 0x0b, 0x76, 0x9b, 0x2e, 0xe1, 0x30, 0xfc, 0x9f, 0x14, 0x47, 0xe7, 0x8e, 0x74, 0xdb, 0x4b, 0x3f, 0x09, 0x67, 0x09, 0x21, 0x55, 0xf4, 0x55, 0xa3, 0xd8, 0x8d, 0x5f, 0x48, 0xda, 0xf2, 0x33, 0xfe, 0x64, 0x91, 0xde, 0xac, 0x90, 0xb1, 0xd3, 0x0a, 0x02, 0xf1, 0x8d, 0xb5, 0xb7, 0xf1, 0x75, 0x83, 0xfe, 0x4f, 0x05, 0x13, 0xc3, 0xd5, 0x2e, 0xa9, 0x13, 0xf0, 0xf7, 0x39, 0xdd, 0x64, 0x68, 0xc2, 0xf6, 0x3f, 0xa6, 0xde, 0x60, 0x0b, 0x5f, 0x96, 0xcc, 0x48, 0x68, 0x7a, 0x5d, 0x1a, 0xa5, 0xf2, 0xaf, 0x3e, 0x2a, 0xcf, 0x18, 0x42, 0x9f, 0x25, 0x2e, 0xf6, 0xe9, 0x5d, 0x89, 0x1e, 0x07, 0x86, 0xca, 0x69, 0x39, 0xec, 0xdb, 0xa7, 0x68, 0xec, 0x79, 0x36, 0xc2, 0x06, 0xf0, 0xbd, 0xa5, 0x34, 0x26, 0x1d, 0xbe, 0x7a, 0xdb, 0xa5, 0x72, 0xbf, 0x2f, 0x86, 0x7c, 0xdb, 0x65, 0x86, 0xd8, 0xf1, 0xe6, 0xf8, 0xe0, 0xff, 0x89, 0xeb, 0xb6, 0xb3, 0x11, 0xa2, 0xe1, 0x81, 0xf8, 0x44, 0x3b, 0xf2, 0x6b, 0xd5, 0x0a, 0x3f, 0x95, 0x65, 0x6d, 0x1e, 0x20, 0x87, 0xfa, 0xdc, 0xf9, 0x05, 0xa5, 0xac, 0x54, 0xd2, 0xe3, 0x3f, 0xf1, 0x40, 0x10, 0x94, 0x9d, 0x73, 0x0e, 0x12, 0xfb, 0x16, 0x30, 0xd4, 0x84, 0x4c, 0x56, 0x44, 0xcd, 0xea, 0x59, 0xeb, 0x08, 0xe3, 0xa9, 0x87, 0xce, 0x04, 0x34, 0x5e, 0x1c, 0xe1, 0x8a, 0xd3, 0x9b, 0x0f, 0x3f, 0x37, 0x24, 0x93, 0x91, 0xe1, 0x83, 0x9b, 0x4b, 0x81, 0x7b, 0x6c, 0xea, 0xb1, 0x0b, 0x9c, 0xfd, 0xcd, 0xf0, 0x81, 0xd2, 0x05, 0x6b, 0xe9, 0x4e, 0xb0, 0x44, 0x0b, 0x1d, 0xe3, 0x0f, 0xbe, 0x0c, 0x43, 0xae, 0xe9, 0xb2, 0x17, 0x17, 0x3b, 0x56, 0xa2, 0x58, 0x1c, 0x0d, 0xaf, 0xd8, 0xe3, 0x23, 0x6d, 0xdf, 0x49, 0xbc, 0x7d, 0x58, 0x1d, 0xbb, 0x4a, 0xd6, 0x3a, 0xe3, 0x99, 0xd6, 0xb7, 0x3c, 0x61, 0x44, 0x5d, 0xb9, 0xdc, 0x40, 0x5e, 0x17, 0xde, 0x21, 0x43, 0x08, 0x66, 0xba, 0x27, 0x91, 0x72, 0xdd, 0x23, 0xb1, 0x18, 0x1e, 0x09, 0x43, 0xd3, 0xd9, 0x55, 0x25, 0x1b, 0x77, 0x60, 0x9a, 0x38, 0xec, 0xd7, 0xed, 0x57, 0x84, 0x6c, 0x58, 0xde, 0xe0, 0xcb, 0x23, 0xfd, 0x3b, 0xd0, 0x10, 0x85, 0xf3, 0xf7, 0xf7, 0xfe, 0x44, 0x14, 0xae, 0xf4, 0x56, 0x44, 0x2b, 0x91, 0x7a, 0x23, 0xed, 0x71, 0xb0, 0x3f, 0x98, 0xb1, 0x6e, 0xcd, 0xdf, 0x49, 0x9c, 0x9b, 0xa6, 0x9c, 0xe3, 0x46, 0x68, 0x4e, 0x27, 0xad, 0xd7, 0x56, 0x52, 0xa5, 0xc3, 0x54, 0x54, 0xef, 0x3d, 0x24, 0x68, 0x67, 0xfc, 0xb3, 0x98, 0x7d, 0x00, 0x11, 0x83, 0xe9, 0x74, 0xc8, 0x5e, 0x9b, 0xd9, 0x6d, 0x39, 0xf1, 0x61, 0x74, 0x83, 0x2d, 0x99, 0x48, 0xd1, 0x26, 0x4b, 0x9c, 0xdb, 0x3e, 0xa3, 0xfb, 0xc7, 0x93, 0x90, 0xa7, 0xab, 0x7a, 0x6d, 0xa0, 0x4d, 0x29, 0xe1, 0x03, 0x2d, 0xb3, 0x04, 0x95, 0xc5, 0x3a, 0xc3, 0xa0, 0x0f, 0x5f, 0x85, 0xfe, 0x48, 0xfe, 0x0f, 0x73, 0xf4, 0x19, 0xa4, 0x40, 0x22, 0x11, 0x71, 0xf4, 0xf1, 0x1c, 0x29, 0x86, 0x53, 0xf3, 0xed, 0xa1, 0x11, 0xcb, 0x6e, 0x3f, 0x0f, 0x87, 0x55, 0x79, 0xd2, 0x2c, 0xe3, 0x9d, 0x3f, 0x95, 0xd4, 0x82, 0xa5, 0x68, 0x8a, 0x18, 0xfe, 0x48, 0x67, 0x43, 0x72, 0x4c, 0x7b, 0xea, 0x1d, 0xb0, 0x5f, 0x4b, 0x12, 0xcb, 0x60, 0x91, 0xa0, 0x41, 0xe0, 0xa8, 0xd4, 0x7a, 0xfa, 0x50, 0x3e, 0x53, 0x65, 0x70, 0xf8, 0x13, 0x9b, 0xad, 0xe5, 0xa0, 0x3a, 0x3c, 0x37, 0xf3, 0xaa, 0xf4, 0x34, 0xc9, 0x00, 0xa8, 0x39, 0x9b, 0x22, 0xb3, 0xff, 0xd1, 0x2c, 0xd4, 0x1d, 0x33, 0x13, 0x3d, 0xce, 0xa0, 0x89, 0xe6, 0xf5, 0x02, 0x20, 0x27, 0x5e, 0x81, 0xb1, 0x86, 0x47, 0xf7, 0xff, 0xce, 0x1f, 0xa4, 0x98, 0x61, 0x8d, 0x24, 0xfc, 0xce, 0xb4, 0x9d, 0x01, 0xa6, 0xb6, 0x3d, 0x76, 0x8c, 0x76, 0xe4, 0x07, 0x8c, 0xa3, 0x1d, 0x60, 0xae, 0xf2, 0x53, 0x96, 0xca, 0xaa, 0x42, 0xc2, 0x9d, 0x66, 0xab, 0xef, 0x1d, 0x16, 0x4c, 0x36, 0x0a, 0x48, 0x0f, 0x27, 0xc6, 0xa6, 0x82, 0x6b, 0x66, 0xbf, 0x87, 0xa8, 0x09, 0x0a, 0x4d, 0xa5, 0x68, 0x27, 0x7e, 0xaf, 0xaf, 0x69, 0xba, 0x3b, 0x8c, 0x92, 0x45, 0xcc, 0x85, 0xdd, 0xfc, 0x17, 0x8e, 0x42, 0x8e, 0x65, 0xdb, 0xf5, 0xe8, 0x3a, 0xf3, 0x30, 0xf1, 0x34, 0x06, 0x32, 0x78, 0x35, 0x80, 0x88, 0x6a, 0xc5, 0xde, 0x8b, 0x49, 0xb1, 0xc0, 0x2a, 0xd9, 0xf8, 0x40, 0xe9, 0x1d, 0xe8, 0x83, 0x2a, 0x81, 0x85, 0x8d, 0xab, 0x59, 0x2a, 0x5a, 0x51, 0x8a, 0x73, 0x2a, 0x24, 0x87, 0x59, 0x1c, 0x9a, 0x80, 0x9f, 0xfe, 0x18, 0xd6, 0x6e, 0x64, 0xb6, 0xd1, 0x3c, 0xf7, 0x43, 0x95, 0xf2, 0x10, 0x89, 0x52, 0x4d, 0x86, 0xd1, 0xbc, 0x84, 0xc4, 0xaa, 0xbb, 0x2c, 0x1e, 0xe7, 0x63, 0x59, 0x65, 0xe7, 0x26, 0x07, 0xb8, 0x19, 0x48, 0xb8, 0x9e, 0xbe, 0x94, 0x5e, 0x52, 0xf1, 0x4e, 0x7a, 0x5e, 0xe5, 0x68, 0x86, 0x6b, 0x6f, 0xf8, 0x91, 0x58, 0xc4, 0xea, 0x29, 0x89, 0x83, 0xf2, 0x7d, 0x82, 0xf6, 0xc5, 0xc3, 0xb4, 0x95, 0x89, 0xd8, 0x96, 0xcb, 0x8a, 0x26, 0xf8, 0xfd, 0x2e, 0xcb, 0x95, 0xc9, 0x2b, 0xf8, 0xe7, 0x8b, 0xf7, 0x96, 0x3f, 0x26, 0x81, 0x30, 0x14, 0x01, 0x1e, 0x0d, 0x9b, 0x4f, 0xc6, 0x9c, 0x99, 0x94, 0x80, 0x16, 0x76, 0x64, 0x1b, 0x5e, 0x92, 0x6e, 0x1f, 0x2c, 0xdc, 0xba, 0x03, 0x6a, 0xa0, 0x2f, 0xa0, 0xde, 0xa0, 0x58, 0xe6, 0x0a, 0x67, 0x68, 0xce, 0x50, 0xda, 0x7b, 0x8f, 0x5a, 0x10, 0x1e, 0x15, 0xb9, 0x63, 0x12, 0xaf, 0xcc, 0xc7, 0x4d, 0x08, 0xe4, 0x5b, 0x42, 0x58, 0xa5, 0x3e, 0x62, 0xdb, 0xb0, 0xa4, 0xe3, 0x83, 0x7f, 0x29, 0xc0, 0xea, 0x8f, 0x65, 0x01, 0x8a, 0xc5, 0xc0, 0x3c, 0x30, 0x0b, 0x87, 0x5c, 0xae, 0x3a, 0x40, 0xa1, 0xd0, 0x3c, 0x3b, 0xe8, 0x92, 0x72, 0x6a, 0x2d, 0x90, 0x53, 0x72, 0x4e, 0xbe, 0x56, 0x02, 0x11, 0x59, 0x12, 0x64, 0x69, 0x1e, 0xa4, 0x52, 0xf5, 0xb9, 0x52, 0x0a, 0xca, 0x80, 0x6e, 0xa5, 0x72, 0x61, 0x7c, 0xa4, 0x34, 0x19, 0x97, 0xcc, 0x96, 0xa7, 0x10, 0x34, 0x21, 0x01, 0x59, 0x9c, 0x64, 0x05, 0x21, 0x00, 0x3c, 0xb2, 0xc1, 0x6d, 0x52, 0x98, 0xd7, 0x14, 0xe4, 0x8d, 0x30, 0x9d, 0xc9, 0xa2, 0xec, 0xbd, 0xaf, 0x56, 0xdc, 0x0b, 0xa8, 0x09, 0x2f, 0x0f, 0xe5, 0xb3, 0x4e, 0x9c, 0xc0, 0xd5, 0x04, 0x60, 0x00, 0xb0, 0xe2, 0xba, 0x59, 0xb6, 0xe2, 0xcb, 0x33, 0x3e, 0x4a, 0xd0, 0xad, 0x7b, 0xd3, 0xaf, 0xe0, 0xaf, 0x0b, 0xcf, 0x68, 0x9c, 0xf8, 0x2d, 0x21, 0x3b, 0xfe, 0xad, 0x2e, 0xb1, 0x02, 0xae, 0x40, 0x7f, 0xd0, 0xe0, 0x14, 0xf9, 0xba, 0x5a, 0x3e, 0xf9, 0x82, 0xe7, 0x26, 0xd4, 0x7b, 0xa1, 0x50, 0x8d, 0xea, 0xc2, 0xe0, 0x49, 0xb2, 0xb6, 0x5d, 0x03, 0x31, 0x75, 0xb5, 0x81, 0x65, 0x0f, 0x81, 0x87, 0x53, 0x88, 0x8b, 0x4a, 0xa9, 0xe7, 0x8d, 0x27, 0xa2, 0x8a, 0x3c, 0x95, 0x2a, 0xbc, 0x85, 0x59, 0x43, 0x8a, 0x17, 0xf9, 0xa7, 0xd2, 0x21, 0x72, 0xae, 0x9c, 0x5d, 0x2d, 0x73, 0xad, 0x4d, 0x30, 0x32, 0x5a, 0xc5, 0x92, 0xf5, 0x9b, 0xa9, 0x31, 0x70, 0x60, 0xf8, 0xa7, 0x29, 0x28, 0x09, 0x79, 0xdc, 0xcf, 0x15, 0x92, 0x1d, 0xa7, 0xf6, 0xf0, 0x3f, 0xcb, 0x2e, 0x9e, 0x75, 0xb0, 0x2b, 0xe2, 0x37, 0xfd, 0xca, 0xb7, 0xe7, 0x9d, 0x19, 0x7d, 0xb5, 0x12, 0x61, 0xf0, 0xc0, 0x0c, 0x64, 0x57, 0x7d, 0x3a, 0xe3, 0xfd, 0x5d, 0x60, 0x63, 0xe5, 0xaa, 0xaa, 0x31, 0xba, 0xb2, 0x40, 0xa4, 0x05, 0x28, 0x1a, 0xa2, 0xa3, 0xc7, 0x16, 0x65, 0x75, 0x38, 0x47, 0x7f, 0x59, 0x36, 0x90, 0x1c, 0x59, 0xf0, 0x72, 0x88, 0x23, 0xaf, 0x23, 0xf1, 0xb9, 0xb8, 0xe0, 0x6d, 0x6a, 0x74, 0x83, 0x3f, 0x01, 0xce, 0x58, 0x56, 0x3c, 0xdd, 0x2d, 0x16, 0x80, 0xc3, 0xa8, 0x5b, 0xca, 0xd5, 0xde, 0xbb, 0xe9, 0xfc, 0x20, 0x0c, 0xeb, 0x5a, 0x18, 0x26, 0xd5, 0x31, 0x16, 0xea, 0x97, 0x01, 0xa4, 0x84, 0x3e, 0xf1, 0x60, 0xec, 0x6c, 0x70, 0x0b, 0xb3, 0x05, 0x1c, 0xdd, 0xfc, 0x2c, 0xe3, 0x1b, 0xc9, 0x6e, 0x68, 0xec, 0x78, 0x3c, 0xa8, 0x69, 0x8d, 0x9f, 0xdd, 0xf3, 0xb1, 0x27, 0xa3, 0xc9, 0xfb, 0x25, 0x59, 0xd9, 0x6f, 0x19, 0xca, 0xd7, 0xc4, 0x6e, 0x0c, 0x8d, 0x6b, 0x65, 0xa9, 0x72, 0xcc, 0x50, 0xfd, 0x7d, 0xd3, 0x00, 0xdf, 0x3b, 0xab, 0x80, 0x84, 0x20, 0xc9, 0x04, 0x9f, 0x1b, 0x2d, 0x1c, 0xcd, 0x6c, 0xe4, 0x2d, 0x31, 0xba, 0xd2, 0x22, 0x5b, 0x60, 0xae, 0x5f, 0x6f, 0x09, 0x4e, 0xf6, 0x83, 0x7c, 0x25, 0x1e, 0x48, 0xb9, 0x0a, 0xe1, 0xed, 0x44, 0x3a, 0x14, 0x40, 0xc1, 0xa1, 0x8c, 0x17, 0xc1, 0x55, 0x8f, 0xee, 0xdc, 0x64, 0x89, 0xd1, 0x00, 0xcf, 0x00, 0x7d, 0x08, 0xd6, 0xca, 0xc2, 0x90, 0x76, 0x7e, 0x2b, 0x08, 0x31, 0x28, 0xe1, 0x08, 0x0d, 0x41, 0xcd, 0xe3, 0xdf, 0xde, 0xfd, 0x7f, 0xc9, 0x27, 0x49, 0x64, 0x02, 0x0b, 0x36, 0x12, 0xd5, 0x32, 0x1a, 0x98, 0xed, 0x33, 0x81, 0x62, 0xcf, 0x08, 0xd0, 0x53, 0xa8, 0xbf, 0x28, 0x14, 0x49, 0x71, 0x8d, 0xab, 0x70, 0x78, 0x48, 0x4f, 0x49, 0xdd, 0x89, 0x7a, 0x34, 0x10, 0x51, 0x41, 0xc9, 0xdc, 0x8f, 0xe1, 0x19, 0x99, 0x8a, 0x9a, 0x37, 0xa4, 0x7e, 0xc0, 0xf8, 0x0c, 0x8a, 0x0f, 0xf6, 0x8e, 0xc9, 0x3f, 0xdb, 0xc4, 0xc0, 0xd8, 0xdc, 0x99, 0xf8, 0x48, 0x83, 0x00, 0xeb, 0x32, 0xb2, 0xe6, 0x25, 0x0a, 0xe5, 0x64, 0xa3, 0xdf, 0xb7, 0x3a, 0x7f, 0x77, 0xa8, 0x79, 0xcf, 0xa1, 0x1d, 0x7f, 0xca, 0xc7, 0xa8, 0x28, 0x2c, 0xc3, 0x8a, 0x43, 0xdc, 0xf3, 0x76, 0x43, 0xcc, 0x90, 0x98, 0x37, 0x21, 0x3b, 0xd6, 0xfd, 0x95, 0xd9, 0x56, 0xb2, 0x19, 0xa1, 0x40, 0x6c, 0xbe, 0x73, 0xc5, 0x2c, 0xd5, 0x6c, 0x60, 0x0e, 0x55, 0xb7, 0x5b, 0xc3, 0x7e, 0xa6, 0x96, 0x41, 0xbc, 0x01, 0x84, 0xb9, 0xce, 0x9e, 0x76, 0xca, 0x27, 0x31, 0x1c, 0xf4, 0x95, 0x66, 0x48, 0x4f, 0x20, 0x2d, 0xf6, 0x7d, 0x35, 0x55, 0x8a, 0xdd, 0x04, 0x5d, 0x58, 0x01, 0x26, 0x87, 0x69, 0x63, 0x83, 0x2d, 0x7c, 0x53, 0x73, 0x58, 0x4c, 0x34, 0x23, 0x8f, 0x11, 0xe8, 0x3b, 0xed, 0x49, 0x89, 0xbd, 0x77, 0xb8, 0x5a, 0x30, 0xac, 0xae, 0xfd, 0xff, 0x5d, 0x88, 0xe6, 0x1c, 0xbe, 0x79, 0x0f, 0xe8, 0xbe, 0x8b, 0xed, 0x57, 0x94, 0xe0, 0xa4, 0x4f, 0x9a, 0x3e, 0x77, 0x52, 0x5f, 0xcb, 0x82, 0x5d, 0xf7, 0x14, 0xab, 0x10, 0x96, 0x54, 0xd6, 0x0e, 0x5e, 0xf4, 0x58, 0xa7, 0x74, 0x4e, 0xae, 0xb5, 0x59, 0xb6, 0x70, 0xc3, 0x78, 0xbb, 0x80, 0x75, 0xfb, 0xaa, 0x87, 0x24, 0xe3, 0x54, 0xa2, 0xc8, 0x58, 0x11, 0x58, 0x1b, 0x3d, 0x05, 0xd0, 0xfb, 0x08, 0xa2, 0x40, 0x10, 0xd1, 0x6e, 0xa9, 0xb0, 0xa8, 0x07, 0xc2, 0xff, 0x2c, 0x64, 0x31, 0x5b, 0x5a, 0x5d, 0x01, 0xf7, 0xa2, 0x6e, 0x51, 0xc5, 0x40, 0xb8, 0x49, 0x9a, 0xc9, 0x48, 0x53, 0x8d, 0x04, 0x9c, 0x87, 0xa0, 0xfc, 0x63, 0x66, 0xa2, 0x53, 0x85, 0xcc, 0x53, 0xd9, 0x63, 0x20, 0xca, 0x5d, 0x60, 0xce, 0x14, 0xc4, 0xa0, 0xf7, 0x1e, 0x58, 0x10, 0x67, 0xd4, 0x62, 0xa6, 0xc7, 0x8b, 0xfa, 0xea, 0x13, 0x9c, 0x1e, 0xb5, 0x4f, 0x52, 0x02, 0x38, 0x76, 0x07, 0xa7, 0x41, 0xb4, 0x89, 0xaf, 0xba, 0xd4, 0xc3, 0x70, 0x72, 0xfc, 0x99, 0x47, 0x21, 0x98, 0x13, 0x2e, 0xa6, 0x94, 0xbe, 0x91, 0x92, 0xce, 0x4f, 0x5e, 0xea, 0xcb, 0x8a, 0x5c, 0x29, 0xa9, 0x62, 0xbd, 0x85, 0x54, 0x62, 0xf6, 0x73, 0xfd, 0x4b, 0xce, 0x6d, 0xc8, 0xff, 0xb5, 0xf3, 0xc5, 0x9d, 0x58, 0xd0, 0x22, 0xee, 0x72, 0x9e, 0x9f, 0x00, 0xe5, 0x8c, 0x41, 0x10, 0x09, 0x5f, 0x4b, 0xad, 0x44, 0xb7, 0x6a, 0x1b, 0xdb, 0x94, 0x30, 0xf6, 0x07, 0x18, 0xc3, 0x17, 0x4c, 0x8f, 0xd7, 0xbc, 0x06, 0xac, 0xd9, 0xe2, 0x45, 0x15, 0x6d, 0xf6, 0xda, 0x23, 0x1b, 0xad, 0xb2, 0xe2, 0x45, 0x31, 0x63, 0x60, 0x5d, 0x7d, 0x05, 0x24, 0x55, 0x0a, 0x43, 0xfc, 0x56, 0xab, 0xb1, 0xfc, 0xb4, 0xb5, 0x61, 0xc3, 0x22, 0x64, 0xb1, 0x00, 0x22, 0x7a, 0x66, 0x35, 0xc0, 0x29, 0xff, 0xbb, 0x80, 0x33, 0x43, 0x07, 0x95, 0x50, 0x1d, 0x2b, 0x53, 0xd0, 0xa9, 0x9f, 0xe7, 0x81, 0x8f, 0x42, 0x46, 0xd3, 0x90, 0x9c, 0x63, 0x3a, 0x5e, 0x66, 0xa5, 0xd4, 0xb1, 0x4c, 0x98, 0x4c, 0x97, 0xf1, 0xe3, 0xfe, 0x0b, 0x34, 0x7a, 0x5c, 0xca, 0xb2, 0x14, 0x90, 0x62, 0x8b, 0xe0, 0x63, 0x8c, 0x6a, 0x73, 0x5d, 0xbb, 0xbf, 0x05, 0x2d, 0xf5, 0x4f, 0xde, 0x4c, 0xe2, 0xef, 0x0b, 0xde, 0x23, 0x8c, 0x55, 0xd9, 0xe4, 0x6f, 0x74, 0x68, 0xb5, 0xbf, 0x7f, 0x92, 0x95, 0x48, 0xa7, 0x17, 0x50, 0x7a, 0x25, 0x9a, 0x0c, 0xb5, 0x71, 0x05, 0x1e, 0xc4, 0xb5, 0x2a, 0x22, 0xa7, 0x81, 0xa6, 0x4a, 0x95, 0xc0, 0x0b, 0xf6, 0x41, 0xeb, 0x3e, 0x85, 0x5d, 0x7c, 0x1d, 0x6b, 0x5c, 0xa6, 0x65, 0x84, 0x7d, 0x43, 0xd3, 0xa9, 0x05, 0x0e, 0x8a, 0x80, 0xcb, 0x12, 0xb5, 0x98, 0xfa, 0x62, 0x6d, 0xb5, 0x13, 0x0b, 0xdd, 0x68, 0x31, 0x47, 0xa4, 0xe3, 0x91, 0xf3, 0x7a, 0x0c, 0x51, 0x43, 0x17, 0xd0, 0x78, 0xb5, 0x51, 0xba, 0x37, 0x43, 0x84, 0xc4, 0x6f, 0xdd, 0x36, 0x6d, 0x72, 0x16, 0xfb, 0x0b, 0x0e, 0x1e, 0x97, 0x63, 0xc8, 0xf0, 0x63, 0x77, 0x65, 0xcc, 0xf2, 0x9f, 0xaf, 0xe8, 0xf3, 0xdb, 0x75, 0x63, 0x59, 0x68, 0xd4, 0x7a, 0xba, 0x91, 0xb5, 0xfe, 0xf5, 0xc8, 0x97, 0x05, 0x18, 0xf5, 0x8f, 0xe1, 0x81, 0x0e, 0x8c, 0x4e, 0x43, 0xe8, 0xe0, 0xef, 0xcb, 0x4d, 0xfc, 0xfc, 0xc3, 0x4e, 0x7b, 0x35, 0x36, 0xda, 0x63, 0x1a, 0xf5, 0x90, 0xa7, 0x5d, 0x3a, 0xd2, 0xf0, 0x98, 0x8c, 0x1b, 0x9c, 0x3c, 0xe2, 0x92, 0x07, 0xc9, 0x0b, 0xdf, 0x0a, 0x45, 0x4d, 0x3d, 0xc2, 0xe7, 0x4d, 0xd0, 0x93, 0x13, 0x2e, 0x3a, 0x6c, 0x8b, 0xfd, 0x69, 0x4c, 0xe3, 0x4d, 0xb2, 0x05, 0x35, 0x1e, 0x24, 0x40, 0x17, 0x04, 0x16, 0xc1, 0xca, 0x85, 0x03, 0xec, 0xb4, 0xc2, 0x98, 0x88, 0x10, 0x5a, 0x0a, 0xc4, 0xe5, 0x8b, 0xad, 0x77, 0x34, 0x9a, 0xc3, 0xac, 0x76, 0x75, 0x91, 0x5e, 0x46, 0x98, 0xb9, 0x80, 0x5a, 0x2d, 0xc3, 0x41, 0xb7, 0x77, 0xfd, 0x8d, 0x25, 0x70, 0x85, 0xd7, 0xe1, 0xb1, 0xa4, 0x16, 0x93, 0x93, 0x5d, 0x0d, 0x7f, 0x94, 0x46, 0xd0, 0xff, 0xfc, 0x97, 0x84, 0x31, 0xc0, 0x81, 0x66, 0xed, 0xa6, 0xc1, 0x0f, 0xfa, 0xaa, 0x74, 0xf6, 0x81, 0xa0, 0x2d, 0x36, 0xc1, 0x1c, 0x45, 0x91, 0x05, 0x8f, 0x72, 0xb5, 0xd3, 0xb2, 0x9b, 0xbf, 0x67, 0x28, 0xeb, 0xfe, 0x60, 0x5f, 0x25, 0xf9, 0xb8, 0xb7, 0x37, 0xb3, 0xf9, 0xe6, 0x11, 0x2d, 0xae, 0x9b, 0xb7, 0x2d, 0x18, 0x61, 0x95, 0x3e, 0x23, 0xc6, 0x14, 0xf8, 0x98, 0xbd, 0x6a, 0x81, 0x94, 0x42, 0xb6, 0x54, 0x39, 0x3c, 0x4c, 0x41, 0xa3, 0xa7, 0x4d, 0xb5, 0x1e, 0xf2, 0x7c, 0x3c, 0x96, 0xa6, 0x4c, 0x44, 0x4f, 0x49, 0x3e, 0x24, 0xd6, 0x82, 0x69, 0x5d, 0x37, 0x7e, 0x5a, 0x1f, 0x70, 0x91, 0x1f, 0x0f, 0x26, 0x21, 0x9f, 0x47, 0x97, 0xc0, 0x2d, 0x9e, 0xd0, 0x98, 0x5c, 0x2a, 0x1f, 0x0c, 0x14, 0x04, 0xcc, 0x9c, 0xe5, 0x4b, 0x04, 0x09, 0x9c, 0x6c, 0x16, 0xba, 0x14, 0xa0, 0xe2, 0x5f, 0x4f, 0xb6, 0x8d, 0xd4, 0xc5, 0x12, 0x7a, 0x48, 0xfc, 0xf6, 0x76, 0x9e, 0x59, 0x00, 0x33, 0x13, 0x36, 0xf4, 0xf8, 0x22, 0x35, 0xbc, 0x96, 0xa5, 0xd3, 0xad, 0x9e, 0x3c, 0x40, 0x0c, 0xd1, 0xf2, 0x6e, 0xd1, 0xd8, 0x1e, 0x67, 0xaa, 0x36, 0x88, 0xe5, 0x43, 0x7a, 0xcd, 0x1c, 0xc5, 0xb9, 0x05, 0xdb, 0x9d, 0x3b, 0xa2, 0xd3, 0x7e, 0x75, 0x9b, 0x36, 0xa9, 0x37, 0xcb, 0x85, 0x6c, 0x27, 0x94, 0xa3, 0xe8, 0x6e, 0xc7, 0x2d, 0x18, 0xb1, 0xc8, 0x0e, 0x0f, 0x43, 0xed, 0x4d, 0x81, 0x99, 0x28, 0x2a, 0x85, 0xfe, 0xe6, 0x6a, 0x99, 0x87, 0x36, 0xef, 0xe7, 0x4a, 0x2e, 0x8b, 0xc7, 0xcb, 0x8a, 0x16, 0x84, 0xb7, 0x97, 0xbe, 0x63, 0xd5, 0x50, 0x9f, 0xe1, 0x39, 0xc6, 0x94, 0x3d, 0xbb, 0xc5, 0x4c, 0x36, 0xa7, 0xb4, 0xa0, 0x16, 0xb6, 0xbd, 0x23, 0xef, 0x3d, 0x2e, 0xfb, 0x25, 0xa5, 0x1f, 0xf0, 0x2c, 0x1b, 0x56 ],
+    const [ 0x6b, 0x9e, 0x10, 0xc9, 0xdb, 0xa0, 0x55, 0x60, 0x31, 0x96, 0xcb, 0x2b, 0x7f, 0xd7, 0xc5, 0x4a, 0x3e, 0x8d, 0x10, 0x62, 0x4a, 0xad, 0x1c, 0x34, 0x2e, 0x2d, 0x5d, 0x75, 0xa2, 0x71, 0xf1, 0xd9, 0x52, 0x06, 0x83, 0x72, 0xe1, 0x92, 0x6f, 0x38, 0x2e, 0x0b, 0x27, 0xe9, 0xd6, 0x28, 0xd5, 0x13, 0xfa, 0x15, 0x42, 0x6e, 0x42, 0x6b, 0xf6, 0x70, 0x21, 0x5f, 0xa1, 0x1c, 0x5b, 0x3a, 0xb9, 0x1b, 0xc5, 0x09, 0x65, 0x0d, 0x4c, 0x95, 0x9a, 0x21, 0x39, 0x95, 0x83, 0xe3, 0xb4, 0x23, 0x27, 0x56, 0x86, 0x6d, 0x46, 0x43, 0x23, 0xad, 0x83, 0xd0, 0xe7, 0x5b, 0xc9, 0x54, 0xa0, 0xa0, 0xe7, 0x6a, 0x4d, 0x0f, 0x7d, 0x45, 0x25, 0x90, 0x1c, 0x43, 0xdb, 0x9c, 0xa9, 0xc4, 0x21, 0xb0, 0x02, 0x3c, 0x6b, 0xfb, 0xe4, 0x87, 0xf5, 0x5a, 0x0d, 0x7d, 0x07, 0x87, 0x9d, 0xc7, 0x78, 0x8e, 0xc2, 0xf1, 0x71, 0x80, 0x94, 0xbf, 0x73, 0x6a, 0x3e, 0xc5, 0x9b, 0x88, 0x5f, 0x32, 0x25, 0xb7, 0xb0, 0xed, 0x30, 0x29, 0xe6, 0xe3, 0xc0, 0x5c, 0xda, 0x9f, 0x09, 0x4d, 0xe7, 0x1b, 0xeb, 0xe9, 0x93, 0xd5, 0xb9, 0xc4, 0x72, 0x26, 0x3e, 0x0d, 0x48, 0xcf, 0x02, 0xc2, 0x6e, 0xd5, 0xc9, 0x20, 0x77, 0x90, 0x5d, 0x5e, 0x12, 0xfe, 0x8d, 0x9a, 0x32, 0x5d, 0x76, 0x14, 0x6d, 0xf8, 0x01, 0x9a, 0xa2, 0x41, 0xad, 0x43, 0xdf, 0x20, 0x8f, 0x60, 0x82, 0x8b, 0x97, 0xb0, 0x9e, 0x57, 0x14, 0xd3, 0xa0, 0x4d, 0x7a, 0x01, 0x32, 0x81, 0x63, 0xfc, 0x5f, 0xdf, 0xd5, 0x43, 0xf8, 0x07, 0xc3, 0x89, 0x37, 0x5b, 0xd6, 0x65, 0xa3, 0x55, 0x6d, 0x4b, 0x33, 0x1f, 0xe2, 0xbb, 0xb6, 0x5d, 0x0f, 0xb8, 0x72, 0x4d, 0x10, 0x7c, 0x0c, 0x13, 0x4b, 0x6a, 0xa8, 0x4e, 0xae, 0x44, 0x50, 0xef, 0x38, 0x9e, 0x9a, 0x4b, 0xbb, 0x93, 0x85, 0x6f, 0xe0, 0xb6, 0xa5, 0xb3, 0x6b, 0x4b, 0x80, 0x92, 0xc0, 0xb8, 0x37, 0xb8, 0xa6, 0x36, 0x69, 0x5d, 0x4c, 0xcc, 0x54, 0xd2, 0x8a, 0x7e, 0x3d, 0x59, 0x68, 0xc2, 0x12, 0x3a, 0xe4, 0x33, 0x4f, 0x13, 0xf0, 0x89, 0x1e, 0x70, 0xbb, 0xc9, 0xc2, 0x9b, 0x31, 0xb9, 0x35, 0xb6, 0xc5, 0x97, 0x10, 0x06, 0x6e, 0x0a, 0xac, 0x92, 0xef, 0x59, 0x87, 0xed, 0x5c, 0xdb, 0xe9, 0x50, 0xda, 0xaf, 0xc7, 0xeb, 0xa6, 0xac, 0xe7, 0x7d, 0x59, 0x9b, 0x45, 0x23, 0x6a, 0xa4, 0xb6, 0x6d, 0xf4, 0x07, 0xcb, 0xb7, 0xb9, 0x0d, 0xf8, 0xb7, 0x68, 0x3d, 0xf5, 0x52, 0x1b, 0xd2, 0x65, 0xb4, 0x24, 0x6d, 0xb6, 0x9f, 0x09, 0x08, 0x48, 0x03, 0xcd, 0x2b, 0xd1, 0xd0, 0x71, 0x62, 0x00, 0x08, 0xbb, 0xee, 0x60, 0x18, 0x36, 0xbb, 0x80, 0x68, 0x7a, 0x92, 0x51, 0x31, 0xad, 0x90, 0xcf, 0x8f, 0x4a, 0xd7, 0xe3, 0xd7, 0x21, 0x83, 0x88, 0x2a, 0xa0, 0xe0, 0x2e, 0x4a, 0x50, 0xda, 0x5b, 0xad, 0xa2, 0xb4, 0x98, 0xd0, 0xec, 0xfd, 0x8b, 0xce, 0xaf, 0xc0, 0x61, 0x31, 0x1b, 0xfc, 0x6f, 0x08, 0xd5, 0x53, 0x18, 0x3a, 0xf7, 0x06, 0xf1, 0x19, 0x59, 0x21, 0x23, 0x3a, 0x0f, 0xf3, 0x11, 0x85, 0x32, 0xc1, 0x3b, 0x88, 0xe4, 0xbc, 0x62, 0x10, 0x8e, 0x2f, 0xee, 0xfb, 0x6c, 0xfd, 0x8c, 0x48, 0x4c, 0x4b, 0x1b, 0x70, 0x92, 0x7a, 0xc9, 0xf9, 0x80, 0x58, 0x79, 0x48, 0xb4, 0x97, 0x69, 0xb7, 0xf2, 0x7e, 0x11, 0xe7, 0x24, 0xde, 0x4e, 0x58, 0x9f, 0x48, 0xbf, 0x36, 0xa8, 0x7d, 0x6f, 0x76, 0x37, 0x26, 0xb5, 0x22, 0xfb, 0xc5, 0x59, 0xf1, 0x9d, 0xec, 0xf8, 0x1b, 0x49, 0xad, 0xaa, 0x6b, 0x6b, 0x51, 0xe1, 0x96, 0xb6, 0x4c, 0x95, 0xcb, 0x6b, 0x71, 0x9e, 0x8b, 0xd8, 0x63, 0x61, 0xbb, 0x1f, 0x4c, 0xae, 0xf8, 0x38, 0xd1, 0xe9, 0x2a, 0x39, 0x45, 0x68, 0x5c, 0xd5, 0x1c, 0x1d, 0xcb, 0x23, 0xa3, 0x75, 0x3c, 0xa1, 0xef, 0x7f, 0x93, 0x79, 0x13, 0x51, 0xa2, 0x03, 0x97, 0xa8, 0x3f, 0x8a, 0x25, 0xce, 0x99, 0x53, 0x84, 0xc1, 0xcc, 0xdb, 0xcb, 0x91, 0xb2, 0x61, 0xce, 0x0a, 0xfc, 0xa4, 0xdd, 0x93, 0x82, 0xee, 0xae, 0x56, 0xd8, 0x51, 0x97, 0xa1, 0x22, 0x31, 0x00, 0x8c, 0x29, 0x03, 0x19, 0xdd, 0xae, 0x53, 0xc8, 0x28, 0xfe, 0x0c, 0xe6, 0x3b, 0xc6, 0xf4, 0xaa, 0xb9, 0x29, 0x76, 0x65, 0x04, 0x10, 0xa4, 0x70, 0x60, 0xc1, 0x7c, 0x63, 0x56, 0xb4, 0x6a, 0x88, 0x57, 0xa1, 0x0f, 0x90, 0xa2, 0xde, 0x41, 0x84, 0x68, 0xe8, 0x53, 0xfe, 0x2d, 0x40, 0x96, 0x98, 0x71, 0x78, 0x1f, 0xa5, 0x90, 0x8d, 0xcb, 0x1f, 0xe7, 0x77, 0x81, 0xe1, 0x38, 0xff, 0xb7, 0x16, 0x4f, 0xd1, 0x38, 0xf2, 0xe6, 0xd2, 0x24, 0xa0, 0xc7, 0xb3, 0x38, 0x7b, 0x30, 0xc7, 0x4f, 0x80, 0x7b, 0x11, 0x29, 0x03, 0xfe, 0xa2, 0x6c, 0xa2, 0x31, 0x22, 0xe8, 0x78, 0x0e, 0xac, 0x1f, 0x93, 0xbe, 0xdf, 0x05, 0xa7, 0x71, 0x31, 0x04, 0x03, 0x8e, 0x87, 0x43, 0xc5, 0x0c, 0x03, 0x28, 0x4a, 0x1f, 0x1d, 0x1c, 0xe9, 0x18, 0xf6, 0x8e, 0xe1, 0x86, 0xe8, 0x3a, 0x8f, 0xa2, 0x62, 0xab, 0xe5, 0xea, 0xf3, 0xfe, 0x17, 0x0b, 0xa4, 0xea, 0x97, 0x04, 0x8b, 0xfd, 0x44, 0x89, 0x9d, 0x28, 0xdf, 0xa5, 0xc4, 0x7e, 0xbe, 0xa4, 0x32, 0x39, 0xc4, 0x30, 0xf4, 0xfe, 0x90, 0xba, 0xca, 0x62, 0xf5, 0x1c, 0x36, 0xac, 0xaa, 0x7c, 0xd3, 0xdc, 0x43, 0x73, 0xe8, 0xed, 0x60, 0x6e, 0x3d, 0x58, 0x25, 0x55, 0x2d, 0xd9, 0xea, 0x6b, 0xfd, 0x75, 0x33, 0x76, 0x6c, 0xbc, 0xe2, 0x1f, 0x8b, 0x4c, 0xab, 0x9b, 0xcf, 0x96, 0xc9, 0x8b, 0x65, 0xe5, 0xef, 0x21, 0xc5, 0x9c, 0x82, 0x85, 0x8a, 0xbe, 0x05, 0x77, 0x81, 0xb4, 0xd5, 0x35, 0x00, 0x4b, 0x16, 0x9f, 0x79, 0xfd, 0xed, 0x99, 0x4e, 0x71, 0xef, 0xb1, 0xe7, 0x45, 0xda, 0x02, 0x03, 0x0a, 0x83, 0x57, 0x4b, 0x90, 0x10, 0x94, 0x2d, 0x64, 0x67, 0x52, 0xe7, 0x98, 0xe7, 0xca, 0xe2, 0xc2, 0x55, 0xf4, 0x42, 0x47, 0x19, 0xf0, 0xbb, 0xda, 0xaa, 0xa4, 0xa6, 0x3f, 0x47, 0xa7, 0x54, 0x55, 0xe8, 0x5d, 0xa2, 0x53, 0x74, 0x64, 0xcd, 0x52, 0x34, 0x2f, 0x88, 0x0c, 0x88, 0xf1, 0x4c, 0xe3, 0xd8, 0xbd, 0xf0, 0x25, 0xce, 0xeb, 0x79, 0x8e, 0xc2, 0xbd, 0x33, 0x0e, 0x76, 0x43, 0x01, 0xcd, 0x04, 0x7b, 0xf1, 0x6d, 0x14, 0xbd, 0x13, 0x8f, 0x52, 0x56, 0x8c, 0x98, 0x20, 0x74, 0xe6, 0xb5, 0x87, 0x42, 0xaa, 0x1c, 0x74, 0x53, 0x31, 0x95, 0x21, 0x44, 0xb7, 0x39, 0xd1, 0x9d, 0xb1, 0x7a, 0xc0, 0xf9, 0x60, 0x64, 0x5a, 0x67, 0xa7, 0x23, 0xab, 0x0f, 0x1a, 0xc4, 0x17, 0x19, 0x57, 0x40, 0x4b, 0xca, 0x99, 0xb6, 0x73, 0xf0, 0x8a, 0xf8, 0xad, 0x81, 0x59, 0x49, 0xbe, 0x7f, 0x0d, 0x65, 0x05, 0x1e, 0x19, 0xc2, 0xad, 0x29, 0x30, 0x16, 0x26, 0xa2, 0x5a, 0x19, 0xd5, 0xa9, 0x48, 0x8c, 0x0a, 0x9e, 0xe4, 0x7a, 0x33, 0x8a, 0x2d, 0xbe, 0x50, 0xbb, 0x42, 0xc5, 0xa7, 0xaf, 0xbc, 0x95, 0xb9, 0x34, 0x41, 0x0e, 0x74, 0xcc, 0x57, 0x70, 0xaa, 0x56, 0x75, 0x1e, 0xc2, 0xeb, 0x60, 0xa2, 0xae, 0x07, 0xb5, 0xf0, 0x1d, 0xe9, 0xc1, 0xef, 0xf1, 0x3c, 0x99, 0x35, 0xf3, 0xf6, 0x67, 0x12, 0xc5, 0x81, 0x03, 0xd1, 0x19, 0x19, 0xc3, 0x3a, 0x21, 0x75, 0x93, 0x5c, 0x46, 0xa9, 0x48, 0x89, 0x1d, 0x4b, 0x31, 0xa1, 0x97, 0xd4, 0xef, 0x94, 0x78, 0x4a, 0x87, 0x22, 0x0a, 0x1c, 0xb6, 0xe5, 0x12, 0x4e, 0x85, 0x92, 0x03, 0xd5, 0x1c, 0x7c, 0x72, 0x45, 0xdb, 0x59, 0xca, 0xa9, 0xa7, 0x49, 0x41, 0xb2, 0x82, 0x14, 0x0a, 0x15, 0x5f, 0xb3, 0xcc, 0x2e, 0x34, 0x13, 0x54, 0xe9, 0x50, 0x15, 0x87, 0xe2, 0xef, 0xd9, 0x9a, 0xcb, 0x0c, 0x3c, 0x85, 0x0f, 0x76, 0x9f, 0xb4, 0xb4, 0x26, 0xeb, 0x00, 0x86, 0xd0, 0xd1, 0xdf, 0x72, 0xb8, 0x57, 0xd7, 0x30, 0xc7, 0x90, 0x39, 0x25, 0xde, 0xaa, 0x0b, 0x87, 0x6a, 0x2f, 0x46, 0xc2, 0x39, 0x84, 0x42, 0x1a, 0x8c, 0xb6, 0x6e, 0x92, 0x6d, 0x75, 0x44, 0x0d, 0x42, 0x61, 0x7c, 0xb4, 0xa3, 0x85, 0x80, 0x97, 0x69, 0x21, 0x21, 0x97, 0x07, 0xad, 0x88, 0x83, 0x1e, 0x1a, 0x6f, 0x81, 0x4b, 0x5b, 0x91, 0xb0, 0x44, 0x24, 0x5e, 0x0b, 0x23, 0xf2, 0xf4, 0x91, 0x01, 0x4b, 0x4b, 0xa3, 0xc7, 0x47, 0xaf, 0xad, 0x41, 0x4f, 0x74, 0x08, 0x74, 0x25, 0xe5, 0x1f, 0x32, 0x24, 0x7d, 0xd1, 0xeb, 0xca, 0x5a, 0x17, 0xc6, 0x73, 0xee, 0xe7, 0xf0, 0x67, 0xf8, 0x58, 0x34, 0x17, 0xb2, 0x06, 0xcd, 0xa4, 0x4c, 0xb8, 0x78, 0xa1, 0x9a, 0x40, 0xcd, 0x1a, 0x0a, 0xa3, 0xce, 0xd5, 0xd8, 0x7a, 0xc1, 0xd7, 0x85, 0x98, 0x3b, 0x2a, 0x85, 0xed, 0x7e, 0xde, 0x38, 0xaa, 0x04, 0x4e, 0x1b, 0xa6, 0x5c, 0xa5, 0x40, 0x01, 0x35, 0xa0, 0xfb, 0x07, 0xb9, 0x95, 0xdf, 0x57, 0x1c, 0xb4, 0xe8, 0x44, 0x74, 0x8d, 0xfa, 0x7b, 0xcb, 0xd2, 0x8a, 0xe6, 0x72, 0x5e, 0x9b, 0xd1, 0x99, 0x77, 0xed, 0x4c, 0x1d, 0x50, 0x71, 0xd0, 0xa1, 0xd2, 0xff, 0x25, 0xe0, 0x9c, 0x4b, 0x82, 0x41, 0x49, 0x16, 0xf7, 0xad, 0xf1, 0xa1, 0x08, 0x9d, 0xf2, 0x67, 0x9b, 0x77, 0xf0, 0x0b, 0x14, 0x1a, 0x1a, 0x90, 0xbe, 0xb7, 0xaf, 0xc8, 0x6d, 0xe4, 0xc1, 0x0f, 0x61, 0xeb, 0x3a, 0x39, 0x6e, 0x68, 0x1c, 0xc8, 0x5a, 0x13, 0x0d, 0x62, 0x87, 0xda, 0x12, 0x83, 0xd1, 0x33, 0x9b, 0x70, 0xba, 0xb0, 0xc0, 0x6c, 0xc5, 0xd3, 0xca, 0x2d, 0x1f, 0x25, 0xf5, 0x91, 0x84, 0x82, 0x74, 0x8e, 0x61, 0xb7, 0xb6, 0x67, 0x36, 0x4f, 0xe8, 0x26, 0x3f, 0xa9, 0xbb, 0x46, 0x53, 0x4e, 0x67, 0xb0, 0x0c, 0x82, 0xf0, 0xe9, 0x28, 0x19, 0xa7, 0x89, 0x2f, 0x8c, 0xf5, 0xef, 0x56, 0x4c, 0x54, 0x33, 0xa4, 0x56, 0x9e, 0x5c, 0x53, 0x08, 0x8a, 0xd3, 0x79, 0x33, 0x73, 0x18, 0xe8, 0x71, 0x5c, 0xb4, 0x52, 0xb9, 0x32, 0x6f, 0xb1, 0x30, 0x50, 0xc2, 0xe5, 0x42, 0x49, 0x8f, 0x9f, 0xf2, 0xe1, 0x10, 0x7f, 0x6e, 0x5c, 0x0e, 0x79, 0xe7, 0xfc, 0x53, 0x7d, 0x9f, 0xc5, 0x61, 0x57, 0x44, 0x83, 0x64, 0xd4, 0x7c, 0x0e, 0x66, 0x26, 0xc1, 0xcd, 0xc2, 0x89, 0x6f, 0x79, 0xdb, 0x27, 0x1b, 0x23, 0x0d, 0x39, 0x27, 0x79, 0xe4, 0x70, 0x93, 0x45, 0x8c, 0x93, 0x16, 0x36, 0x89, 0x69, 0x6e, 0xe3, 0xa8, 0xd9, 0xf4, 0x0d, 0x36, 0x50, 0x73, 0x24, 0x6f, 0x63, 0x3a, 0x0d, 0x39, 0xb6, 0x70, 0x23, 0x13, 0x1c, 0xa8, 0x7c, 0x48, 0xff, 0xb5, 0x6d, 0x68, 0x03, 0xc0, 0x50, 0xf8, 0xe6, 0x98, 0x84, 0x69, 0xab, 0x48, 0xb6, 0x47, 0xf7, 0xef, 0x5f, 0xb3, 0xbb, 0xcc, 0x8e, 0x13, 0x13, 0x99, 0xe8, 0x08, 0x6e, 0x1a, 0xed, 0xa1, 0xf0, 0xf5, 0x7d, 0xce, 0x14, 0xc4, 0x9a, 0x17, 0x96, 0x69, 0x6f, 0x8d, 0x90, 0xa1, 0x91, 0x01, 0xe3, 0xdd, 0x86, 0x75, 0xd8, 0x4d, 0x84, 0xd0, 0x07, 0x3d, 0x7a, 0xd6, 0x78, 0xa4, 0x55, 0x56, 0x09, 0xfa, 0x7c, 0xa5, 0x0f, 0x4b, 0x9c, 0x4c, 0x40, 0x8a, 0xab, 0xfe, 0xd1, 0x27, 0x27, 0xcd, 0xdb, 0xe3, 0x9f, 0x9d, 0x03, 0xe4, 0x75, 0xd8, 0x5a, 0x04, 0xe2, 0x63, 0x82, 0x6f, 0x3a, 0xd1, 0x13, 0x6d, 0x72, 0xd7, 0x3c, 0x7c, 0xdf, 0x00, 0xae, 0xa2, 0x40, 0xa2, 0xb5, 0x01, 0xff, 0x11, 0xa8, 0xac, 0xb4, 0x12, 0x84, 0xb9, 0xeb, 0x93, 0xd4, 0x98, 0x27, 0x99, 0xd4, 0xa3, 0x27, 0x79, 0xd5, 0xf5, 0x67, 0x4b, 0xe3, 0x80, 0xea, 0x9c, 0xa6, 0x5a, 0x37, 0x63, 0x86, 0x58, 0xa2, 0x36, 0x12, 0xde, 0xcc, 0xbe, 0xa3, 0xf5, 0x6d, 0x69, 0x3c, 0x9e, 0x51, 0x5e, 0xb5, 0x67, 0xa1, 0xb6, 0x19, 0x3b, 0x64, 0xe9, 0x4c, 0x7e, 0x45, 0x86, 0xf1, 0x5a, 0x97, 0x28, 0x8a, 0x53, 0x96, 0xa5, 0xe1, 0x22, 0xf0, 0x88, 0xa8, 0xc0, 0x84, 0xc2, 0x5c, 0xc1, 0x69, 0x9c, 0x6f, 0xe3, 0x32, 0xf0, 0xa5, 0xe7, 0x70, 0x99, 0xbf, 0x9f, 0x79, 0x28, 0x57, 0x49, 0x68, 0xd8, 0x0b, 0x1b, 0x65, 0xc5, 0xdd, 0x1f, 0x27, 0x58, 0xda, 0x41, 0xb6, 0x06, 0xfa, 0xa7, 0x76, 0x3a, 0x48, 0x40, 0x61, 0x8f, 0x42, 0xa0, 0x94, 0x43, 0x83, 0x0b, 0x0d, 0xe9, 0x9f, 0xcf, 0xb3, 0x5d, 0x4f, 0xd7, 0x96, 0xfd, 0xce, 0x7e, 0x79, 0x16, 0x82, 0xa1, 0x8e, 0x9d, 0xdf, 0xf8, 0x80, 0x20, 0x89, 0xa6, 0xb6, 0xfb, 0xb8, 0x0e, 0xd7, 0xcf, 0xe1, 0xe9, 0x89, 0x30, 0x93, 0x95, 0x7f, 0x9e, 0x9f, 0xb0, 0xb2, 0xb7, 0x7b, 0xe6, 0xee, 0xaa, 0xe8, 0x07, 0x91, 0xef, 0xd3, 0x5d, 0x90, 0x36, 0x79, 0x3c, 0xba, 0x9d, 0xcf, 0xda, 0x41, 0x25, 0x21, 0x61, 0x76, 0x67, 0xf9, 0x43, 0xd4, 0x83, 0x42, 0xce, 0x40, 0x5a, 0xad, 0x00, 0x8f, 0xfd, 0x54, 0x9c, 0x49, 0x64, 0x9e, 0x7d, 0xac, 0x64, 0x62, 0x2b, 0xf4, 0xdb, 0x4f, 0xac, 0xda, 0x2e, 0x8b, 0x9d, 0x5b, 0xf5, 0x9a, 0x81, 0xba, 0xf4, 0x82, 0x58, 0xc8, 0x4e, 0x2c, 0x74, 0x63, 0xf5, 0x0e, 0x88, 0x3d, 0x65, 0x07, 0x02, 0xdf, 0x92, 0x8a, 0x9a, 0xed, 0x1e, 0xff, 0x2b, 0xab, 0xd0, 0x66, 0xc2, 0xc0, 0x42, 0x3e, 0xf5, 0x3a, 0xd9, 0xa5, 0x77, 0xd3, 0xfa, 0xc0, 0xe9, 0x72, 0x7b, 0x5d, 0xf2, 0xf5, 0x58, 0xd7, 0x91, 0x2e, 0xa8, 0x3a, 0xb2, 0x2b, 0xcf, 0xa8, 0x00, 0xbb, 0xf4, 0xfc, 0xfb, 0x2d, 0xb6, 0xac, 0x4a, 0x5b, 0x1a, 0xf4, 0x52, 0xe8, 0xc8, 0x31, 0x07, 0xc5, 0x78, 0x8b, 0x02, 0xfa, 0xa7, 0xd6, 0xd5, 0xa3, 0x8e, 0xba, 0x9b, 0x38, 0x54, 0x12, 0xd3, 0x12, 0x83, 0x93, 0x6e, 0x2b, 0xb9, 0xae, 0x26, 0x26, 0xa0, 0xb7, 0x12, 0x8f, 0x1f, 0x46, 0x77, 0x63, 0xd2, 0xde, 0xe2, 0xd3, 0xb8, 0xcc, 0x73, 0x45, 0x2c, 0x52, 0x7c, 0x9c, 0x17, 0x05, 0x4b, 0xb9, 0x63, 0x74, 0x43, 0x41, 0xb3, 0x0a, 0x32, 0xa1, 0x51, 0x36, 0xde, 0x50, 0x67, 0xc8, 0xe1, 0x54, 0x73, 0x9f, 0xb7, 0x08, 0xf5, 0x81, 0x16, 0x1c, 0x6a, 0x4a, 0x7d, 0xdd, 0x7e, 0x49, 0x10, 0xb7, 0x7e, 0xe7, 0xa3, 0xf8, 0x0c, 0x89, 0x15, 0xd6, 0x16, 0xb8, 0xdf, 0xb4, 0x09, 0x80, 0xec, 0xa1, 0x41, 0x15, 0xac, 0x22, 0xc5, 0xbd, 0x64, 0x31, 0x31, 0xe9, 0xc8, 0x85, 0xf3, 0xa5, 0xcb, 0x14, 0xba, 0x33, 0xb6, 0xd7, 0x2c, 0xf3, 0x77, 0xcd, 0xd8, 0x87, 0x3c, 0x42, 0x6b, 0x33, 0x41, 0x51, 0x26, 0x8a, 0xe6, 0xa8, 0x8f, 0x47, 0x05, 0x8b, 0x67, 0x79, 0x82, 0x1c, 0xdd, 0xe3, 0x24, 0xd9, 0x01, 0xa2, 0xa3, 0x66, 0x7b, 0x10, 0x02, 0x8d, 0x7d, 0xe9, 0x1e, 0x83, 0xf6, 0xac, 0x88, 0x6c, 0x09, 0x44, 0x90, 0x22, 0xbd, 0xe8, 0xa2, 0x32, 0xf6, 0x40, 0xd6, 0x28, 0xa4, 0xc9, 0xc2, 0x0d, 0x3a, 0x7a, 0x93, 0x2d, 0x62, 0xa8, 0x5c, 0x1e, 0xee, 0x27, 0xad, 0xfd, 0x12, 0xb2, 0x68, 0xfb, 0xd1, 0x8c, 0xd0, 0x18, 0xb6, 0x68, 0xe3, 0x2f, 0xc4, 0x87, 0xea, 0x33, 0xaf, 0x20, 0x4e, 0xb8, 0x4d, 0x04, 0xad, 0xb5, 0x47, 0x82, 0x2d, 0x88, 0x14, 0x88, 0x10, 0x3a, 0x28, 0x0c, 0x89, 0x05, 0x68, 0xaa, 0xce, 0x13, 0xe2, 0x8f, 0x6f, 0x89, 0xbb, 0x95, 0xe6, 0xc4, 0x68, 0xaf, 0x6f, 0xe2, 0x21, 0x88, 0x1a, 0x85, 0x93, 0x67, 0x1e, 0xd3, 0xd6, 0x56, 0x70, 0xc2, 0x9e, 0x83, 0x94, 0x92, 0xb5, 0xe6, 0xb4, 0x9b, 0xa9, 0x24, 0xef, 0x48, 0xc2, 0xb4, 0xf3, 0x64, 0x36, 0x40, 0xce, 0x94, 0xa0, 0x4e, 0x01, 0x25, 0xaf, 0x1f, 0xd6, 0x08, 0x1b, 0xd7, 0xf4, 0x1b, 0xde, 0xdf, 0x31, 0xab, 0xa0, 0x88, 0xa7, 0x36, 0x73, 0xf1, 0x0a, 0x75, 0xc0, 0x2a, 0x39, 0x99, 0x81, 0x99, 0x12, 0xd6, 0xb1, 0x9d, 0x8b, 0x1e, 0x01, 0x72, 0xfe, 0x2f, 0xcd, 0x55, 0xc5, 0xcf, 0x4e, 0xe8, 0x07, 0x56, 0x11, 0xd7, 0xd1, 0x6e, 0xa8, 0xbc, 0x69, 0x17, 0x9f, 0x40, 0xdf, 0xee, 0xb2, 0x83, 0xe4, 0xae, 0x3c, 0xbf, 0xdf, 0xf7, 0xf3, 0x28, 0x3e, 0x4e, 0xd3, 0x16, 0x0a, 0x66, 0x58, 0x65, 0xbf, 0x9d, 0xf0, 0x1c, 0x5a, 0xca, 0xb0, 0x4e, 0xb3, 0x36, 0x46, 0x3e, 0x0d, 0xe8, 0x2f, 0xc6, 0xec, 0x26, 0x2a, 0xfa, 0x27, 0x38, 0xec, 0x08, 0x3d, 0x6f, 0x15, 0x63, 0xec, 0x66, 0x63, 0x20, 0x00, 0x88, 0x25, 0xa0, 0x6a, 0xd2, 0xf3, 0x6f, 0x91, 0xda, 0x9d, 0x6c, 0xed, 0x11, 0x61, 0x2a, 0xd1, 0x45, 0x61, 0x97, 0x88, 0x6a, 0x54, 0xdb, 0xa4, 0x99, 0x7b, 0x83, 0x93, 0x59, 0xd6, 0xdf, 0x73, 0x1e, 0x99, 0xa8, 0x27, 0x0f, 0xda, 0xe6, 0xab, 0x0c, 0x8c, 0x11, 0xa4, 0xf0, 0xb0, 0x77, 0x3c, 0x13, 0xca, 0xdd, 0x2c, 0x14, 0x92, 0x69, 0x1a, 0xd5, 0xed, 0xc0, 0x26, 0xc6, 0x1b, 0x6b, 0xc0, 0x67, 0x32, 0x7f, 0xbc, 0x08, 0xcb, 0x7d, 0xa8, 0xd3, 0xfb, 0x77, 0x5d, 0x0d, 0x85, 0x74, 0xd4, 0x99, 0x4d, 0x16, 0x3b, 0xbe, 0x10, 0x7a, 0x48, 0x2a, 0x53, 0x60, 0xce, 0x36, 0x99, 0x8c, 0x8e, 0x6b, 0xd9, 0x6c, 0x4f, 0x45, 0x2f, 0xfa, 0x31, 0x38, 0xd2, 0xe4, 0x3e, 0xf1, 0x46, 0xea, 0x42, 0xde, 0xd3, 0x88, 0xdc, 0xf0, 0x35, 0xd6, 0xd6, 0xa0, 0x95, 0xac, 0xb2, 0x30, 0xb8, 0x09, 0x85, 0x33, 0x77, 0xb6, 0x09, 0x4f, 0x6f, 0x26, 0xed, 0x42, 0xf9, 0xa1, 0x6f, 0x23, 0x5d, 0xa2, 0x2d, 0xea, 0x42, 0x7d, 0x38, 0x33, 0x69, 0x44, 0x6b, 0x3f, 0x9b, 0xec, 0xfb, 0x3c, 0xe0, 0xac, 0x4e, 0xc6, 0xf2, 0xa6, 0x11, 0xad, 0xf1, 0xc9, 0x85, 0xf9, 0x58, 0xf6, 0x19, 0x2b, 0x30, 0x61, 0x3e, 0xc6, 0x84, 0x3b, 0x77, 0x0e, 0x14, 0x8e, 0xaf, 0x10, 0x4d, 0x68, 0xd0, 0xe2, 0x79, 0x3b, 0x91, 0x2c, 0x34, 0x84, 0x90, 0xe7, 0x1f, 0xab, 0xa0, 0x65, 0xd8, 0x2a, 0x64, 0x92, 0x29, 0xf2, 0x1d, 0x79, 0x7f, 0x0a, 0xc0, 0x0a, 0x9e, 0x7a, 0x4c, 0x1a, 0x94, 0x67, 0x5a, 0xab, 0xeb, 0x7f, 0xf5, 0x6e, 0x23, 0x98, 0xad, 0x86, 0x60, 0x93, 0xe7, 0x8f, 0x5f, 0x87, 0x77, 0xdf, 0xae, 0x1c, 0x71, 0x0b, 0x1d, 0x34, 0x3b, 0xad, 0x70, 0xd1, 0xe7, 0x65, 0x56, 0x33, 0xc0, 0x1e, 0x9f, 0x40, 0x23, 0x93, 0xa9, 0x29, 0x91, 0x11, 0x1b, 0x4b, 0x01, 0x7e, 0xd6, 0x53, 0x7b, 0x9a, 0x29, 0xa6, 0xe2, 0x85, 0x44, 0x00, 0x12, 0x82, 0xf0, 0x5a, 0x2b, 0xfa, 0x7d, 0x12, 0x2b, 0xc4, 0xfb, 0x46, 0xc3, 0xa3, 0xad, 0x80, 0x63, 0x10, 0xba, 0x99, 0x98, 0x3a, 0x26, 0xd7, 0x97, 0x4c, 0x01, 0x59, 0x1a, 0xee, 0xde, 0xb5, 0x6a, 0x0e, 0x87, 0xdf, 0xbd, 0xe0, 0xef, 0x4d, 0xc3, 0x23, 0x68, 0x58, 0x7c, 0xa7, 0x16, 0xe6, 0x4c, 0x0c, 0xa4, 0x46, 0x51, 0xcc, 0x35, 0x5b, 0xf4, 0x7c, 0x9e, 0xfd, 0xbe, 0x4e, 0xd2, 0x9c, 0x6e, 0xdb, 0x9d, 0x26, 0x48, 0x1f, 0x96, 0x2b, 0xaf, 0xc5, 0x4f, 0x40, 0xf6, 0xa5, 0xce, 0xa1, 0x74, 0x8c, 0x41, 0x1a, 0xd6, 0x3b, 0xed, 0x27, 0xb9, 0xb2, 0x68, 0x5a, 0x79, 0xae, 0x08, 0xfd, 0x43, 0x70, 0x9b, 0xf9, 0x72, 0xc0, 0x58, 0xf6, 0x18, 0x32, 0x16, 0xc4, 0xda, 0xa8, 0xbc, 0xf9, 0x02, 0x18, 0xf9, 0xdc, 0xcf, 0x8f, 0x35, 0x82, 0x0f, 0x76, 0xc7, 0x37, 0xf0, 0x15, 0x68, 0x20, 0x14, 0x55, 0xe7, 0x1e, 0xe3, 0xca, 0x1f, 0xf4, 0x25, 0xf0, 0x27, 0xad, 0xd0, 0xb5, 0xc8, 0x38, 0x1e, 0x38, 0x34, 0x56, 0xe3, 0xd1, 0xf4, 0xb6, 0x1e, 0x51, 0x23, 0x5d, 0xce, 0x8b, 0xda, 0x4c, 0x07, 0x13, 0xeb, 0x5d, 0x44, 0x45, 0xd2, 0x6f, 0xff, 0x89, 0xe8, 0xc2, 0x7f, 0xd6, 0xda, 0xa4, 0xf2, 0x75, 0x5a, 0x4e, 0xbb, 0x08, 0x14, 0x09, 0x0d, 0xca, 0xe4, 0x95, 0xb9, 0x18, 0x46, 0xca, 0x44, 0x31, 0x0e, 0x80, 0x3d, 0x3a, 0x59, 0xad, 0xcd, 0x85, 0xc3, 0xcd, 0x90, 0x12, 0xda, 0x87, 0xa3, 0x56, 0xd3, 0x8d, 0xff, 0x3c, 0x7c, 0xc4, 0x05, 0x6a, 0x72, 0xa5, 0x59, 0xc5, 0x94, 0xe3, 0xf4, 0x37, 0xb7, 0x4d, 0x75, 0xb0, 0x9c, 0xf7, 0xb8, 0x6a, 0x1f, 0x94, 0xaa, 0x72, 0xb0, 0x27, 0x5c, 0x64, 0x07, 0xdb, 0x56, 0x75, 0x14, 0x2e, 0x2d, 0xb7, 0x35, 0x55, 0x58, 0x99, 0xac, 0xdc, 0x3f, 0xad, 0x50, 0x8e, 0x95, 0xaf, 0x82, 0x94, 0xe8, 0xc2, 0x63, 0xe1, 0x76, 0xfc, 0x45, 0xcd, 0x43, 0x25, 0x5f, 0xff, 0x68, 0xbc, 0xc4, 0x91, 0xae, 0x3b, 0x96, 0x6f, 0x5b, 0x9d, 0x76, 0x00, 0x4c, 0x1c, 0x40, 0x09, 0x44, 0x3f, 0xf5, 0xce, 0x84, 0x14, 0xf9, 0x7a, 0x9c, 0xba, 0x7f, 0xc0, 0x80, 0x23, 0x41, 0xc3, 0xde, 0x18, 0x74, 0x33, 0xaf, 0x7e, 0xfb, 0xb9, 0x0d, 0xd7, 0xdb, 0x96, 0x44, 0x0c, 0xef, 0x87, 0x2b, 0x69, 0xdd, 0xeb, 0xb5, 0xe9, 0x48, 0x27, 0xc3, 0xb4, 0x47, 0x4a, 0x3c, 0xe6, 0x16, 0xed, 0x60, 0x92, 0x0c, 0x5e, 0x59, 0x07, 0xcd, 0xfd, 0x13, 0x51, 0xc1, 0xe5, 0x4e, 0x03, 0xc5, 0xcf, 0xf2, 0x34, 0x20, 0x34, 0xa2, 0xc8, 0xb8, 0xb2, 0x93, 0xf1, 0x86, 0xb1, 0x9f, 0xf4, 0x47, 0x46, 0x95, 0x31, 0x74, 0x58, 0xd4, 0x5e, 0x75, 0x01, 0x18, 0x13, 0x12, 0x36, 0x93, 0x8b, 0x2a, 0xab, 0x40, 0xa9, 0xa7, 0xf1, 0x74, 0x39, 0xb1, 0xe1, 0xb6, 0x79, 0x22, 0x3e, 0xd0, 0xd7, 0x3a, 0x96, 0x26, 0xfd, 0x95, 0x69, 0x47, 0x0b, 0x59, 0x8e, 0xc2, 0x23, 0xb4, 0xd1, 0x3b, 0x2b, 0x86, 0xe1, 0xbd, 0xce, 0x5a, 0x6a, 0x52, 0xc4, 0x9b, 0x7e, 0xd1, 0x54, 0x05, 0x39, 0xf8, 0x17, 0x59, 0xa5, 0xba, 0xfe, 0x55, 0xdb, 0xda, 0x96, 0xe3, 0x6b, 0xb9, 0x8b, 0x91, 0xfe, 0x6d, 0x6c, 0x41, 0x3a, 0x12, 0xad, 0x21, 0xe6, 0x65, 0xf2, 0xde, 0x4f, 0x8f, 0x8b, 0x15, 0xea, 0x3e, 0x3a, 0x0b, 0x3a, 0xfa, 0x3d, 0x9d, 0xf4, 0xb7, 0x88, 0x7a, 0x62, 0xa6, 0x53, 0x8f, 0x05, 0x51, 0xd4, 0xc3, 0x7e, 0xe7, 0x4e, 0xe5, 0xaf, 0xd4, 0x4a, 0xe2, 0x1d, 0x95, 0x24, 0x3c, 0x98, 0xcb, 0xca, 0xb7, 0x1f, 0x8e, 0xc1, 0x56, 0xfe, 0x03, 0x69, 0x85, 0x39, 0x31, 0x81, 0x98, 0x2d, 0x10, 0xed, 0x74, 0x75, 0xe3, 0xb7, 0x8c, 0x0b, 0xc8, 0x55, 0x10, 0xaf, 0x8e, 0x2a, 0x60, 0x8d, 0xc6, 0x4f, 0xc7, 0x1a, 0x1d, 0x92, 0x66, 0x3f, 0xe9, 0xbf, 0x6e, 0xb9, 0x01, 0x1f, 0x93, 0xc0, 0xd2, 0x3f, 0xbd, 0xe6, 0xaf, 0xf2, 0x00, 0x43, 0x69, 0x99, 0xce, 0xcf, 0x20, 0xa2, 0x6b, 0x0f, 0x58, 0x4f, 0xa2, 0xf4, 0x4f, 0xb9, 0xb7, 0x00, 0x8f, 0x14, 0x9c, 0xaa, 0xbf, 0x34, 0x67, 0x04, 0xbe, 0x50, 0x04, 0x9b, 0xf3, 0x07, 0x27, 0x9e, 0xde, 0xa0, 0x85, 0x43, 0xf3, 0x96, 0x44, 0x67, 0xa9, 0x54, 0xb0, 0x75, 0xce, 0x3d, 0x2f, 0x88, 0x1d, 0xef, 0x77, 0xd4, 0x12, 0xc9, 0xfe, 0x42, 0xfd, 0xab, 0xb2, 0x5a, 0x56, 0xfc, 0xeb, 0x66, 0x50, 0xf2, 0x9e, 0xd4, 0xb0, 0x0d, 0xd3, 0xdd, 0xe0, 0xe5, 0x59, 0x64, 0x3f, 0x26, 0xb8, 0x21, 0xbc, 0xd9, 0x67, 0xfe, 0xa3, 0xe5, 0x3f, 0xc1, 0xb6, 0xd5, 0x30, 0xec, 0x80, 0xdb, 0x33, 0xe1, 0xe6, 0x15, 0x7f, 0x4a, 0xff, 0x10, 0x00, 0xb8, 0x26, 0x8b, 0x05, 0x8a, 0x4d, 0x7d, 0x39, 0x11, 0x94, 0x59, 0xd4, 0xf2, 0x1a, 0x90, 0x12, 0xcb, 0x12, 0x57, 0xe5, 0x19, 0x1a, 0xac, 0xe6, 0x59, 0xc9, 0x93, 0x92, 0x6d, 0x87, 0xa6, 0xb3, 0x42, 0xa2, 0xcc, 0x1c, 0xb0, 0x9e, 0x49, 0x99, 0xa1, 0xcc, 0xf7, 0x26, 0x76, 0x1e, 0xd2, 0x5f, 0xa6, 0x39, 0xba, 0x38, 0xa8, 0xcc, 0x75, 0xee, 0x14, 0x20, 0xf4, 0x3e, 0x05, 0xf1, 0xd7, 0xd4, 0xc1, 0x7d, 0x33, 0x06, 0x9c, 0xda, 0x92, 0xc2, 0x19, 0x8c, 0x3b, 0xc5, 0x53, 0x57, 0xb4, 0x0e, 0x9b, 0x52, 0x86, 0x93, 0x63, 0x3d, 0x40, 0x32, 0x5b, 0x14, 0xbe, 0xea, 0xd9, 0xe4, 0xab, 0x4b, 0x7e, 0xde, 0x45, 0x2b, 0x17, 0xaa, 0x60, 0x9b, 0xc1, 0xfe, 0xae, 0x1a, 0x51, 0x6e, 0x3d, 0x08, 0xf2, 0x86, 0x41, 0x5d, 0x10, 0x16, 0x14, 0x9a, 0x75, 0xcd, 0x7b, 0x00, 0xb2, 0x09, 0x2b, 0x00, 0xc1, 0xee, 0x8c, 0xf4, 0xe8, 0xb6, 0xbc, 0x0c, 0xe0, 0x47, 0xd7, 0x8b, 0x37, 0x0b, 0x76, 0x33, 0xf3, 0xfc, 0x75, 0xfd, 0x78, 0xfe, 0xfa, 0x0e, 0xac, 0x72, 0xb2, 0xe7, 0x58, 0x08, 0x5e, 0xdc, 0xd2, 0xd4, 0x8f, 0xc7, 0xd9, 0xa5, 0xad, 0xfd, 0xc0, 0x92, 0x3e, 0x81, 0xcf, 0xd5, 0x65, 0x78, 0xe6, 0xdd, 0xa9, 0xdd, 0x63, 0x9e, 0xf8, 0x76, 0x46, 0x2c, 0xec, 0x07, 0x93, 0x88, 0x4d, 0xc5, 0xf8, 0xb9, 0xd6, 0x0d, 0xb0, 0x1f, 0x3c, 0x56, 0xa7, 0x05, 0x6c, 0x65, 0xdf, 0x75, 0x14, 0xc0, 0x12, 0x50, 0x66, 0x64, 0x99, 0x9e, 0x19, 0xba, 0x8c, 0x22, 0xb0, 0xc8, 0x2b, 0x31, 0xfe, 0xa4, 0x7c, 0xc5, 0xea, 0x2f, 0x36, 0xce, 0x70, 0xff, 0xde, 0xc8, 0xe8, 0x9d, 0x30, 0x92, 0x8b, 0xf1, 0xc0, 0x7e, 0x33, 0xfa, 0xe1, 0xa5, 0x62, 0xc3, 0xc6, 0x7d, 0x86, 0x92, 0xe7, 0xad, 0x7b, 0x62, 0xa6, 0x1f, 0x52, 0x93, 0x33, 0x57, 0x51, 0xe1, 0xad, 0x04, 0x3a, 0x93, 0x8a, 0xd5, 0xd1, 0xf4, 0x38, 0x8e, 0x98, 0x07, 0x04, 0x5b, 0xdd, 0x77, 0x3c, 0x64, 0xf6, 0xcd, 0x90, 0xa1, 0xcc, 0xe5, 0xbe, 0xf0, 0x96, 0xa3, 0x6f, 0x65, 0xe7, 0xe2, 0x5b, 0xe1, 0xeb, 0xad, 0xb4, 0xe6, 0xed, 0xb2, 0xc2, 0xa9, 0x1d, 0xf3, 0xcb, 0x69, 0x91, 0xbf, 0x35, 0x00, 0x89, 0xe1, 0xee, 0xb8, 0xf7, 0x17, 0x0c, 0x5f, 0x3f, 0xc6, 0xb1, 0x9e, 0x3b, 0xeb, 0x32, 0x86, 0x82, 0x55, 0x78, 0x6c, 0xea, 0x12, 0xa6, 0xf7, 0x4b, 0x27, 0xfb, 0x77, 0x86, 0x84, 0xfb, 0x78, 0xc6, 0x36, 0xc9, 0x98, 0x06, 0xdf, 0xd8, 0x95, 0xd4, 0x63, 0xc2, 0xaa, 0x54, 0xe5, 0x78, 0x1c, 0x87, 0xf2, 0x9c, 0x10, 0xcd, 0xfb, 0x2b, 0x9f, 0xa9, 0x09, 0x5f, 0x2c, 0xc5, 0xac, 0xd4, 0xf5, 0x36, 0x34, 0xe9, 0xe9, 0x00, 0x24, 0x69, 0xba, 0xdd, 0xe4, 0x6b, 0x32, 0x3a, 0xb6, 0x76, 0xca, 0x83, 0xeb, 0xe9, 0x79, 0xa0, 0x57, 0x9a, 0xca, 0xc0, 0x02, 0xbe, 0x31, 0x55, 0x20, 0x09, 0x9f, 0x5f, 0x44, 0x16, 0x54, 0xee, 0xd0, 0x08, 0xf5, 0xe2, 0xb0, 0x72, 0xde, 0xf6, 0x48, 0x74, 0xb9, 0xfd, 0xaa, 0x27, 0x4f, 0x6b, 0x0d, 0x3b, 0x9f, 0x16, 0x7b, 0xdf, 0x2d, 0x3e, 0xc9, 0xe1, 0x9d, 0xcb, 0xcc, 0x17, 0x80, 0xd7, 0xca, 0xfd, 0x6e, 0x6c, 0x2f, 0x9f, 0x55, 0x8f, 0x81, 0xba, 0x10, 0x7d, 0x96, 0x1e, 0x3c, 0x34, 0x05, 0x56, 0x47, 0x35, 0xda, 0x8b, 0xc9, 0x89, 0x8e, 0xa6, 0x18, 0x02, 0x36, 0xb5, 0x17, 0xc3, 0xfa, 0x90, 0x4e, 0x02, 0xc9, 0xbc, 0x40, 0x0d, 0x4b, 0x8f, 0xf8, 0x8b, 0x17, 0x95, 0xe6, 0x05, 0x27, 0x33, 0xe9, 0xa5, 0x88, 0x8a, 0xad, 0x3d, 0x56, 0x9e, 0x37, 0x8a, 0xe8, 0xb8, 0xbe, 0xbb, 0x48, 0x09, 0xbd, 0x2d, 0xe6, 0x8f, 0x46, 0x79, 0x8d, 0x3d, 0x99, 0xb0, 0x95, 0x56, 0xf5, 0xe5, 0x5b, 0x1a, 0xae, 0xec, 0xee, 0xa4, 0x80, 0x62, 0x0b, 0x13, 0x23, 0xed, 0x4c, 0xe8, 0x1f, 0xc5, 0x9c, 0xaf, 0xe2, 0x74, 0xee, 0xe2, 0x10, 0xda, 0x2f, 0x0a, 0x1a, 0x73, 0x78, 0x27, 0x12, 0xdd, 0x89, 0x52, 0xbe, 0x94, 0x73, 0xa1, 0xeb, 0x01, 0x94, 0x4b, 0x03, 0xb3, 0xc8, 0x0c, 0xe2, 0xec, 0xde, 0xcb, 0xe6, 0x5f, 0x49, 0x7b, 0x45, 0x38, 0x18, 0x3f, 0xa4, 0x5d, 0x29, 0xd1, 0xe5, 0xf3, 0x99, 0x24, 0x40, 0x25, 0x7e, 0x48, 0x95, 0x20, 0xd9, 0x8f, 0x00, 0x62, 0xc6, 0xee, 0xaf, 0x35, 0xf6, 0xa5, 0xf0, 0x76, 0x5f, 0x22, 0x8e, 0x9b, 0x32, 0x23, 0x5e, 0xf5, 0x0e, 0x1c, 0x15, 0x31, 0x73, 0xd8, 0x5c, 0x25, 0x79, 0x62, 0x27, 0xca, 0xc2, 0x26, 0x42, 0x84, 0xad, 0x54, 0x2c, 0xaa, 0xcc, 0x85, 0x29, 0x42, 0x99, 0xa1, 0x93, 0x0c, 0x64, 0x00, 0x71, 0xc3, 0x90, 0xcf, 0x4b, 0x9f, 0xff, 0xb6, 0x3c, 0x1e, 0xcb, 0xb7, 0x48, 0x04, 0x37, 0x5a, 0xf0, 0xa0, 0xe5, 0x07, 0x04, 0x52, 0x49, 0xb3, 0xb9, 0x4a, 0x5d, 0xbf, 0xfb, 0x92, 0x96, 0x1c, 0x04, 0x4f, 0x17, 0xb4, 0x2e, 0x44, 0x26, 0x05, 0x05, 0x97, 0xdc, 0x0f, 0xa1, 0xd8, 0x20, 0x71, 0x33, 0x3f, 0xd6, 0xcf, 0xdd, 0x35, 0x53, 0x76, 0xc7, 0x16, 0x14, 0x43, 0x6f, 0x36, 0xb0, 0xc1, 0x40, 0x22, 0x0c, 0x91, 0x67, 0x28, 0xce, 0x0f, 0xe2, 0x19, 0x14, 0x32, 0xd9, 0x4d, 0x65, 0xb4, 0x32, 0xe8, 0xe8, 0x73, 0x60, 0x5c, 0xd3, 0x18, 0x7b, 0x2f, 0x27, 0xf6, 0x96, 0xff, 0x9b, 0x35, 0x4d, 0xc3, 0xd5, 0x2f, 0x9d, 0x53, 0xe0, 0x1a, 0xf9, 0x2b, 0xdb, 0xe8, 0x99, 0x6b, 0xee, 0x6b, 0x16, 0x23, 0x83, 0xbd, 0x34, 0xce, 0xb2, 0xdf, 0xfe, 0x1c, 0xfc, 0xa0, 0x19, 0xf5, 0x3d, 0xc0, 0x52, 0xba, 0xdc, 0x56, 0x79, 0xce, 0x45, 0x6f, 0x72, 0x55, 0x99, 0xf8, 0x89, 0x3b, 0xa3, 0xde, 0x06, 0x78, 0x0f, 0x73, 0x01, 0x93, 0xd6, 0x14, 0x78, 0x65, 0xfd, 0x09, 0x9f, 0x20, 0x7f, 0xac, 0x77, 0x90, 0x88, 0xcd, 0xa2, 0xa0, 0xe3, 0x56, 0x76, 0x1f, 0xb6, 0x2b, 0x50, 0xc4, 0x6d, 0x54, 0x2b, 0x70, 0xf4, 0x5e, 0x71, 0xb4, 0x29, 0xfe, 0x10, 0x93, 0x91, 0xf8, 0xd1, 0x89, 0x49, 0x3f, 0xe6, 0xcc, 0x40, 0x5e, 0xc1, 0xd1, 0xa4, 0x16, 0x2d, 0x12, 0x9a, 0x49, 0x97, 0x0f, 0x32, 0x17, 0xac, 0x92, 0x9a, 0x46, 0x2a, 0x38, 0x92, 0xe7, 0xef, 0x2d, 0x1f, 0x36, 0x57, 0x37, 0x84, 0xc3, 0xc4, 0xf6, 0x6e, 0xcf, 0x7e, 0x6a, 0x6f, 0xf9, 0xbe, 0xb5, 0xad, 0x1a, 0x05, 0x22, 0xdc, 0x6d, 0xb2, 0x67, 0x69, 0xf3, 0xd4, 0x27, 0xf8, 0x15, 0x3d, 0xbb, 0x11, 0x8c, 0xd8, 0x32, 0x16, 0x7e, 0x3c, 0x96, 0x79, 0xe9, 0x80, 0x71, 0x2b, 0x45, 0x51, 0x90, 0x58, 0x65, 0x43, 0x07, 0x51, 0x9f, 0x65, 0x76, 0xca, 0x2c, 0x18, 0x8a, 0x45, 0xd1, 0x21, 0xc6, 0xce, 0xbf, 0xfc, 0x83, 0xe9, 0xb9, 0x73, 0x35, 0xc9, 0x74, 0x70, 0xf1, 0xc2, 0x43, 0x10, 0x2c, 0x01, 0xf4, 0xf8, 0xc6, 0x7b, 0xf4, 0xec, 0x47, 0x23, 0xba, 0x9e, 0x68, 0x60, 0x63, 0xc3, 0xd5, 0xbe, 0x9a, 0x6c, 0x31, 0xe4, 0xbb, 0x94, 0x5a, 0xc6, 0x38, 0xf5, 0xef, 0x1b, 0x3b, 0x21, 0x10, 0x12, 0x8d, 0xcd, 0x65, 0x40, 0xb6, 0x70, 0x62, 0xdd, 0x66, 0x0d, 0xc9, 0x31, 0x13, 0x4c, 0x70, 0x49, 0xe4, 0xd0, 0x44, 0xee, 0xce, 0xc5, 0x8e, 0xd8, 0xfd, 0xb8, 0x75, 0x1e, 0x75, 0xac, 0xc4, 0xf1, 0xf9, 0x6a, 0xee, 0x8a, 0x2b, 0x18, 0x50, 0x61, 0xf6, 0x0d, 0xb5, 0xa0, 0x29, 0xe4, 0x1f, 0xd7, 0x64, 0xcf, 0xc5, 0xf1, 0x38, 0x2e, 0x58, 0x67, 0x8a, 0x61, 0x8a, 0xb3, 0x38, 0xda, 0xd1, 0x08, 0x00, 0x76, 0x68, 0x40, 0x9d, 0x0d, 0x98, 0x16, 0x32, 0x48, 0x35, 0x95, 0xec, 0xb2, 0x6b, 0xd0, 0xe3, 0x12, 0xbb, 0xd4, 0x42, 0xf9, 0x40, 0xdb, 0xa8, 0x97, 0x37, 0xc2, 0xce, 0xd2, 0xbe, 0xbd, 0x69, 0x9a, 0xdc, 0x4a, 0x52, 0x76, 0xc2, 0x63, 0xe4, 0x63, 0x50, 0xf8, 0xa5, 0xdf, 0xdb, 0x9c, 0x29, 0x41, 0x2e, 0x7f, 0x34, 0x4b, 0xce, 0x9c, 0x1f, 0x02, 0x83, 0x33, 0x7d, 0xbd, 0x13, 0x7a, 0xfe, 0x7d, 0x51, 0x90, 0x93, 0x7c, 0x56, 0xb2, 0xd2, 0x09, 0x0f, 0xb1, 0x9d, 0x92, 0xf8, 0xa3, 0xfe, 0x03, 0x26, 0xd9, 0x56, 0x4f, 0x8b, 0x12, 0xb7, 0x4b, 0x76, 0xee, 0x8e, 0xc3, 0x59, 0xa6, 0x85, 0xc8, 0xcf, 0xf9, 0xa7, 0x47, 0xdd, 0x6a, 0xc5, 0xe0, 0x78, 0xa8, 0x19, 0xf4, 0x48, 0x4e, 0x2a, 0x00, 0xac, 0xcc, 0xef, 0x2a, 0xfe, 0xa5, 0x37, 0x1a, 0x18, 0xdc, 0x49, 0x0b, 0x17, 0xa8, 0xc7, 0x22, 0x5f, 0x6f, 0xd8, 0xfe, 0xdf, 0xf2, 0x85, 0x90, 0x96, 0xc6, 0x64, 0x2d, 0x55, 0x03, 0x74, 0xe1, 0xc7, 0x40, 0x49, 0x07, 0xb0, 0xbe, 0x69, 0x16, 0x72, 0xe3, 0xf5, 0xbe, 0xd5, 0xea, 0x8c, 0x34, 0x07, 0xda, 0x6c, 0xca, 0xe2, 0xb4, 0xda, 0xc2, 0x6e, 0xf1, 0xc5, 0x64, 0xa7, 0x2b, 0xa6, 0x4e, 0x80, 0x1b, 0xaa, 0x0c, 0x27, 0xc3, 0x13, 0xe8, 0x8b, 0xec, 0xdb, 0x03, 0x1c, 0xd3, 0x9b, 0xa5, 0xd1, 0x20, 0xac, 0xd2, 0x70, 0x17, 0x8c, 0x1e, 0x0a, 0x12, 0x83, 0xc2, 0xc4, 0x2f, 0x86, 0xee, 0xde, 0x46, 0x5b, 0x61, 0xed, 0x1e, 0xfe, 0x38, 0x6b, 0xe0, 0x44, 0x03, 0x72, 0xcb, 0xbe, 0x1e, 0xc5, 0x2a, 0xe0, 0x3f, 0x10, 0x83, 0x62, 0x4b, 0x71, 0x12, 0xe7, 0x6e, 0x36, 0x75, 0xdd, 0x6a, 0xe9, 0xa9, 0xa4, 0x2f, 0x8a, 0x35, 0xf2, 0xad, 0x1b, 0xa5, 0x76, 0xe6, 0x62, 0x3a, 0xbb, 0x47, 0xea, 0xe0, 0x50, 0x38, 0x4b, 0x60, 0x26, 0xf2, 0xab, 0xd7, 0x39, 0x90, 0x85, 0x67, 0x72, 0x69, 0xa9, 0x2c, 0xcc, 0x9e, 0x84, 0x72, 0xb7, 0xef, 0xa2, 0x25, 0xba, 0xd3, 0x71, 0x88, 0x5b, 0xc7, 0x48, 0x2a, 0x43, 0xe6, 0xa7, 0x17, 0x9e, 0xba, 0xc1, 0x4b, 0xc1, 0x52, 0x37, 0x6c, 0x0f, 0x94, 0x27, 0xb8, 0x1d, 0xd5, 0x65, 0x3c, 0x14, 0xa7, 0x08, 0x46, 0x57, 0xf2, 0x29, 0x1e, 0x66, 0x47, 0xe7, 0xf1, 0x03, 0x70, 0xae, 0x0e, 0x93, 0x4c, 0xba, 0x55, 0xc6, 0xda, 0xd6, 0xeb, 0x7a, 0x93, 0x6a, 0x33, 0xdd, 0xfd, 0xb4, 0xfa, 0xd2, 0x7d, 0x56, 0xf2, 0x97, 0x6c, 0x11, 0x62, 0xa4, 0x6e, 0xd0, 0x1b, 0xd6, 0xff, 0xe8, 0xae, 0xcc, 0x4f, 0x9e, 0xdc, 0x92, 0x50, 0xea, 0x4e, 0x7c, 0x0d, 0x7a, 0x87, 0x55, 0x3d, 0xfa, 0x16, 0xb9, 0x18, 0x93, 0x10, 0xc0, 0x69, 0xb1, 0xbd, 0xdd, 0xe5, 0x0a, 0x92, 0x05, 0xbb, 0xdc, 0x5f, 0x13, 0x6c, 0x75, 0xca, 0x6b, 0xdd, 0xf9, 0xfc, 0xdd, 0xab, 0x60, 0x9a, 0xcd, 0xbe, 0xbe, 0xf7, 0x91, 0x21, 0xc7, 0x88, 0x1b, 0x10, 0x92, 0x98, 0xd8, 0x53, 0x9d, 0x3c, 0xd7, 0xcb, 0x12, 0x8a, 0x2e, 0x4b, 0x48, 0x06, 0x9a, 0xa9, 0x8d, 0x5d, 0x65, 0x14, 0x23, 0x56, 0x8d, 0xa7, 0x88, 0x05, 0x22, 0x3f, 0xfa, 0x42, 0xf0, 0x8a, 0x3b, 0x59, 0x5e, 0x61, 0x92, 0x03, 0x96, 0x58, 0x12, 0x95, 0xe6, 0x93, 0x1e, 0x78, 0x66, 0xdb, 0x2d, 0xd9, 0xdc, 0xf0, 0xcb, 0xa1, 0xdc, 0x21, 0xe1, 0xa8, 0x34, 0x1b, 0x35, 0x25, 0x87, 0xff, 0x34, 0x6a, 0x37, 0xb7, 0xf0, 0xce, 0x88, 0x89, 0x65, 0xea, 0x03, 0xec, 0x00, 0x08, 0x19, 0x9b, 0x62, 0xd8, 0x09, 0xe9, 0x61, 0x65, 0x04, 0x54, 0x4f, 0x48, 0x8e, 0x5c, 0x7f ],
+    const [ 0x2c, 0x97, 0xef, 0x4f, 0x65, 0x31, 0x94, 0x44, 0x19, 0x9d, 0xf6, 0x71, 0xde, 0xae, 0xe9, 0x66, 0xd1, 0x96, 0x28, 0x05, 0x23, 0x59, 0xf7, 0x91, 0xd5, 0x81, 0x06, 0x08, 0xbf, 0x14, 0x99, 0xb3, 0xd7, 0xc3, 0xe6, 0xfb, 0xb0, 0x64, 0xbe, 0x7e, 0x41, 0xa2, 0x70, 0x62, 0xe8, 0xf3, 0xeb, 0xe9, 0xaf, 0xcb, 0x22, 0x46, 0xcd, 0x10, 0xb5, 0xb0, 0x70, 0xcd, 0xcd, 0xb4, 0xb9, 0x2a, 0x47, 0xcf, 0x08, 0x9c, 0x16, 0x3c, 0x7b, 0x59, 0xe2, 0x0b, 0xb1, 0x0f, 0xf5, 0x73, 0xd4, 0xd5, 0x58, 0x69, 0xd6, 0x62, 0x39, 0x71, 0xfa, 0x7c, 0x90, 0xb5, 0x97, 0xb4, 0x03, 0x54, 0x19, 0x51, 0x06, 0xfc, 0x48, 0x8a, 0x46, 0xbb, 0xcd, 0xf8, 0x48, 0x12, 0xf1, 0x4a, 0x4d, 0x4c, 0xa9, 0x3b, 0x7a, 0x0d, 0xd0, 0xc1, 0x35, 0x2e, 0xb3, 0x87, 0xd2, 0xc8, 0xd2, 0x9e, 0x6f, 0x8f, 0xe5, 0x70, 0x1c, 0x62, 0x1e, 0xf5, 0x40, 0x20, 0xae, 0x29, 0x38, 0xbc, 0x8a, 0xbd, 0x40, 0x94, 0x6f, 0x0c, 0x97, 0xfe, 0x23, 0x52, 0xde, 0x24, 0xff, 0x18, 0xc1, 0x13, 0xaa, 0xf3, 0xda, 0x0e, 0x27, 0x6e, 0xd2, 0x28, 0x12, 0x45, 0xca, 0x12, 0x26, 0xd4, 0xf9, 0x31, 0x03, 0xce, 0x96, 0xf3, 0x2e, 0x32, 0xf8, 0x64, 0x5a, 0x7b, 0xfc, 0xfc, 0xe6, 0x18, 0xa7, 0xbb, 0xa6, 0x1b, 0x0c, 0x79, 0xe6, 0x35, 0x70, 0x77, 0xac, 0xe2, 0xad, 0x39, 0x3e, 0xe1, 0xd4, 0x98, 0xe4, 0xe7, 0x16, 0x13, 0xef, 0x94, 0xe5, 0x66, 0xfa, 0xa6, 0x56, 0x5e, 0x70, 0x6d, 0xca, 0xeb, 0x4f, 0x7f, 0xcd, 0x77, 0x2b, 0xac, 0x3e, 0x76, 0x75, 0x34, 0xb1, 0x3e, 0xfd, 0x38, 0x11, 0x19, 0xb6, 0x6f, 0x8a, 0x99, 0xb9, 0x1a, 0xa5, 0x2c, 0x8d, 0x3a, 0xb5, 0xf0, 0xa6, 0x00, 0x73, 0xc9, 0x2b, 0x85, 0xe5, 0xb0, 0xfd, 0xbb, 0x84, 0x4e, 0xf4, 0xa4, 0x9d, 0xc9, 0x6c, 0xc1, 0xf8, 0xde, 0x00, 0xce, 0xb8, 0x30, 0x95, 0xac, 0x82, 0xdf, 0x9b, 0x9f, 0xe1, 0x5d, 0x8f, 0xb9, 0xe9, 0x7d, 0xc4, 0x96, 0x1b, 0xcd, 0x64, 0x4a, 0x89, 0x26, 0xb1, 0x98, 0x3b, 0x81, 0x91, 0x65, 0xd0, 0x0c, 0x4a, 0x6b, 0x68, 0x7e, 0x8a, 0x32, 0xc2, 0xa7, 0xaa, 0x3c, 0xa2, 0x4b, 0x33, 0x80, 0x76, 0x30, 0xa2, 0x1b, 0x38, 0x76, 0x68, 0x41, 0x96, 0x27, 0x35, 0x79, 0x51, 0x0f, 0x76, 0x0a, 0xe3, 0xce, 0x1d, 0xb0, 0x64, 0x2b, 0xa0, 0x94, 0xae, 0xab, 0x44, 0x7b, 0xc0, 0x63, 0x9b, 0x3e, 0x60, 0x0a, 0x4b, 0x7a, 0x05, 0x52, 0x12, 0x88, 0xf3, 0x78, 0x07, 0xb0, 0xa8, 0x1a, 0x23, 0x99, 0x77, 0x4a, 0xff, 0x04, 0x73, 0xe0, 0xdf, 0xba, 0x8e, 0x14, 0xf0, 0xc3, 0x02, 0x4c, 0xce, 0xd9, 0xf0, 0x32, 0x49, 0x1d, 0x47, 0x0a, 0x69, 0x08, 0xe8, 0x43, 0xb0, 0xa3, 0x08, 0x4b, 0x9e, 0xfb, 0xd5, 0xa8, 0x7b, 0xcf, 0x5c, 0x45, 0x50, 0x8d, 0xaa, 0x09, 0x37, 0x7d, 0x31, 0xae, 0xd4, 0x3b, 0x6e, 0xd1, 0x24, 0x6a, 0xc9, 0x45, 0x75, 0xa7, 0xbd, 0xad, 0xb6, 0xbc, 0x38, 0x4a, 0xf1, 0x16, 0x45, 0x11, 0x16, 0x7a, 0xe8, 0x01, 0xfa, 0xf3, 0x49, 0xb3, 0x9f, 0x0f, 0x15, 0x33, 0xb6, 0x4a, 0x22, 0x0e, 0x62, 0xcb, 0x52, 0xac, 0x3f, 0x4e, 0xb9, 0xe0, 0xa3, 0x62, 0x02, 0xbe, 0x24, 0xd4, 0x0e, 0xad, 0x5a, 0x6b, 0xdf, 0xbd, 0xe6, 0xd5, 0xb5, 0x3a, 0xb2, 0xe2, 0x76, 0x81, 0x7b, 0xf0, 0x53, 0x12, 0x8d, 0xa7, 0xa9, 0xe7, 0xce, 0xe6, 0x25, 0x04, 0xfe, 0xfc, 0x2c, 0x50, 0x3d, 0x1c, 0x7a, 0xa3, 0xce, 0x0b, 0x09, 0x20, 0x1a, 0x1c, 0x34, 0xc5, 0xf8, 0x5e, 0x1c, 0x40, 0x2b, 0x14, 0x4b, 0x04, 0x2c, 0x65, 0x97, 0x9d, 0x2b, 0x55, 0x49, 0x40, 0x50, 0xf4, 0x7f, 0xa7, 0x46, 0xd5, 0xcf, 0x1c, 0xfa, 0xc2, 0x2d, 0xd3, 0xa0, 0xae, 0x0f, 0x7c, 0xf8, 0xeb, 0xcf, 0x19, 0xcf, 0x9e, 0x50, 0x0d, 0xc8, 0x6f, 0xe4, 0x76, 0x5c, 0x85, 0x6d, 0xbd, 0x20, 0xb1, 0xc3, 0x6c, 0x46, 0xe9, 0x56, 0x3f, 0x67, 0xf9, 0x15, 0x7d, 0x80, 0x75, 0x8e, 0x88, 0x3a, 0xf2, 0x56, 0xb3, 0x6e, 0x75, 0xab, 0x55, 0xe8, 0x2c, 0x58, 0x1c, 0x6b, 0x5c, 0xd9, 0xa3, 0xf6, 0x9b, 0xc0, 0x46, 0x46, 0x3f, 0x57, 0x35, 0x9c, 0x16, 0x87, 0xc7, 0xc0, 0x58, 0xf8, 0x11, 0x46, 0xd9, 0x7a, 0xb8, 0x10, 0x83, 0xa4, 0x03, 0x14, 0x04, 0xba, 0x34, 0x5f, 0xc4, 0xd4, 0x19, 0x5a, 0x1a, 0x3d, 0xde, 0x4d, 0xbf, 0x1a, 0x25, 0x21, 0x83, 0x4c, 0x58, 0x6a, 0x3e, 0x97, 0x3e, 0xa5, 0x0a, 0x03, 0xcd, 0xbd, 0xaf, 0x82, 0x40, 0xd5, 0x5f, 0xd4, 0x69, 0x41, 0xa4, 0xa8, 0x47, 0xd5, 0x96, 0x04, 0xdb, 0x63, 0x51, 0xe6, 0x38, 0x7f, 0xa6, 0x2c, 0xda, 0x85, 0x11, 0xb1, 0x38, 0xde, 0xeb, 0xb9, 0x9c, 0x7e, 0xe1, 0x8f, 0x33, 0xb1, 0xa5, 0x6c, 0x60, 0x18, 0xe3, 0x9b, 0x56, 0xee, 0x77, 0xdb, 0xe6, 0x90, 0xdd, 0x05, 0x95, 0x3d, 0xe9, 0xee, 0xf2, 0x1a, 0xb8, 0x8f, 0x27, 0x79, 0xe6, 0x63, 0xcd, 0x5a, 0x01, 0x11, 0x05, 0x32, 0x3e, 0x4b, 0xc4, 0xec, 0x6b, 0xf6, 0x6e, 0x2e, 0x25, 0x8b, 0xa7, 0xdd, 0x4b, 0xbd, 0x66, 0xe3, 0xb3, 0x5c, 0x4a, 0x30, 0x1b, 0x79, 0x32, 0xfe, 0x62, 0xcb, 0x08, 0x5a, 0xf8, 0x51, 0xdd, 0xe0, 0x93, 0x39, 0x3b, 0xc6, 0x23, 0x01, 0xb6, 0x1c, 0x09, 0xdc, 0xc5, 0x51, 0x83, 0x57, 0xd0, 0xfa, 0x6b, 0x3c, 0x8a, 0xcf, 0x22, 0xb6, 0x81, 0xf6, 0xc7, 0xb7, 0xf4, 0x85, 0xac, 0x97, 0xe4, 0x42, 0x0a, 0xfe, 0x6d, 0xad, 0xf3, 0x03, 0x57, 0x40, 0x89, 0x95, 0xe9, 0xf5, 0x6e, 0x1a, 0xfd, 0x09, 0x7b, 0x57, 0x5a, 0xff, 0xb5, 0x90, 0x3d, 0xe9, 0x7c, 0xf0, 0x39, 0xe3, 0x06, 0x2b, 0x41, 0xe0, 0x0c, 0x61, 0x04, 0xa9, 0xc3, 0x46, 0x79, 0x22, 0x0e, 0x80, 0xba, 0xcf, 0xf2, 0x50, 0x15, 0x98, 0x4a, 0x75, 0x60, 0xc9, 0xbc, 0x4d, 0x8e, 0x5d, 0xeb, 0x3e, 0x80, 0x7c, 0xee, 0x54, 0x1d, 0x42, 0x02, 0x2b, 0xa5, 0xc2, 0x7b, 0x10, 0x42, 0x4b, 0x01, 0x63, 0xe1, 0xea, 0xf8, 0x3f, 0x3f, 0x2f, 0x40, 0x5e, 0x47, 0x34, 0x1f, 0x36, 0x9b, 0xdc, 0x7b, 0x68, 0x71, 0x59, 0x4d, 0x5b, 0xa0, 0xf1, 0x52, 0x24, 0xfa, 0x01, 0x04, 0xaa, 0xdd, 0x42, 0xc8, 0x07, 0x05, 0x4b, 0x69, 0x31, 0xa4, 0x57, 0xc5, 0xd9, 0xb5, 0x49, 0xc6, 0x93, 0x8d, 0xed, 0x94, 0x38, 0xb3, 0x81, 0x09, 0x88, 0xf1, 0x74, 0x66, 0x14, 0xab, 0x6d, 0x44, 0x5c, 0x70, 0x8f, 0xcd, 0x34, 0xcf, 0xfc, 0x2b, 0x6c, 0x6c, 0x97, 0x41, 0xaf, 0x53, 0x0f, 0x99, 0xac, 0x8b, 0x19, 0x9e, 0x74, 0xef, 0xfc, 0x0c, 0x23, 0x39, 0x53, 0xa4, 0xc3, 0x60, 0x0e, 0x24, 0x6d, 0x24, 0xbb, 0x76, 0xb1, 0xe6, 0x04, 0x28, 0x39, 0xbe, 0x78, 0x1c, 0xa8, 0xc8, 0x8e, 0x81, 0xc8, 0xbe, 0xe6, 0x01, 0xe5, 0xcc, 0xd3, 0x3c, 0x74, 0x9f, 0x17, 0x76, 0xf9, 0xc0, 0xed, 0x8c, 0x27, 0x20, 0x4d, 0x2d, 0x48, 0xf4, 0x6b, 0x46, 0xdf, 0xc2, 0x81, 0xbe, 0x8c, 0xbc, 0xce, 0x64, 0x31, 0x4e, 0xde, 0x26, 0x53, 0xf3, 0x0d, 0x83, 0xc3, 0x4c, 0x47, 0x43, 0x7d, 0x73, 0x11, 0x65, 0xd0, 0x8d, 0xcd, 0x59, 0xbf, 0x9e, 0x39, 0x6f, 0xa8, 0xa2, 0x3a, 0x90, 0x23, 0xd9, 0xd8, 0x2c, 0x2d, 0x62, 0x89, 0x73, 0x86, 0x0b, 0xb2, 0xc8, 0x57, 0x68, 0x6b, 0x72, 0x18, 0x22, 0x83, 0x95, 0xb1, 0x92, 0xc3, 0x61, 0xdf, 0x8e, 0x77, 0x8a, 0xda, 0x83, 0x2b, 0xf8, 0x35, 0xc4, 0xb3, 0xbf, 0x05, 0x22, 0x6e, 0x51, 0x45, 0xbd, 0xcb, 0xf3, 0x79, 0x1a, 0x0b, 0x6d, 0x92, 0x75, 0x49, 0x06, 0x12, 0x58, 0xb8, 0xaf, 0x70, 0x6c, 0x2d, 0x7f, 0xbe, 0x90, 0xdd, 0x5f, 0x89, 0x28, 0x67, 0x07, 0x01, 0xb7, 0x15, 0x29, 0x59, 0xb1, 0x5e, 0xeb, 0x71, 0x8a, 0xb0, 0x9b, 0xb3, 0x13, 0x6d, 0x9e, 0x3b, 0x06, 0x34, 0xaa, 0x3a, 0xdf, 0x61, 0x36, 0x9c, 0xee, 0xd7, 0x2e, 0xe8, 0xab, 0xfd, 0xea, 0x68, 0x49, 0x06, 0x61, 0x8b, 0x8e, 0x76, 0x9a, 0x87, 0xe1, 0xe1, 0x64, 0x42, 0xa5, 0xf6, 0x47, 0x73, 0xc5, 0xbd, 0xba, 0x04, 0x90, 0x1d, 0x96, 0xbc, 0xc8, 0xa1, 0xcb, 0x1a, 0xf5, 0x7c, 0x52, 0x84, 0xff, 0xca, 0x63, 0xa1, 0xfc, 0x18, 0xe7, 0x03, 0x47, 0x27, 0x30, 0x09, 0xd2, 0xed, 0xe8, 0x03, 0xbd, 0xdd, 0x47, 0x98, 0x27, 0x68, 0x89, 0x65, 0x44, 0xc4, 0xa0, 0xe7, 0xaf, 0xec, 0x26, 0x9b, 0x02, 0xe8, 0x95, 0x63, 0xa5, 0x4e, 0xba, 0x2c, 0xe3, 0x09, 0x67, 0xce, 0x43, 0x59, 0x69, 0x33, 0x15, 0x1b, 0xb9, 0xbc, 0x4b, 0x4b, 0xf7, 0xe0, 0x8a, 0xc7, 0x13, 0x17, 0x81, 0x55, 0x4e, 0xf6, 0x7a, 0xe8, 0x61, 0x9b, 0x2e, 0x1f, 0xfb, 0x4b, 0xde, 0x0f, 0x71, 0x5a, 0x9f, 0x42, 0xb1, 0x4b, 0xf6, 0xff, 0x79, 0x39, 0xa4, 0xcc, 0xc6, 0x76, 0xc3, 0x32, 0x8e, 0x71, 0x12, 0xc0, 0xb1, 0xdd, 0x8e, 0x53, 0x2e, 0x0f, 0x42, 0x94, 0x92, 0xa8, 0x5f, 0xc1, 0xb7, 0x75, 0x8f, 0xb1, 0xaa, 0x93, 0x87, 0x12, 0xed, 0xd7, 0xdb, 0xf6, 0xdf, 0x6c, 0x17, 0x8e, 0x78, 0xbe, 0x0b, 0x34, 0x39, 0x97, 0x66, 0xaf, 0x63, 0x88, 0x87, 0xb3, 0x68, 0x8b, 0x8f, 0xa8, 0x9f, 0xe6, 0xbb, 0xac, 0x3b, 0x53, 0xf1, 0xdb, 0x7e, 0x5d, 0x98, 0xce, 0x2a, 0x0d, 0xad, 0x61, 0x39, 0xc6, 0x13, 0xba, 0xcd, 0x6e, 0x2b, 0x87, 0x6a, 0xce, 0xa5, 0x86, 0x63, 0x3c, 0x96, 0x4b, 0x92, 0x77, 0xca, 0x3e, 0x4c, 0xd2, 0x5b, 0xe3, 0x94, 0x95, 0x82, 0x5e, 0x8f, 0xa0, 0xae, 0x36, 0x39, 0x51, 0xd3, 0x59, 0x55, 0xa8, 0x05, 0x60, 0xaa, 0xa9, 0x45, 0x15, 0x6c, 0x02, 0x9b, 0x32, 0xf9, 0xee, 0x65, 0x6c, 0xc6, 0x59, 0xee, 0xb0, 0x98, 0x45, 0x42, 0xad, 0xf7, 0x6c, 0x41, 0x92, 0xdf, 0x27, 0xf3, 0x19, 0xba, 0x8e, 0x1b, 0xc4, 0x8b, 0xe1, 0x0f, 0x66, 0x6c, 0x27, 0xc6, 0xe6, 0x3a, 0x14, 0x33, 0x40, 0x8f, 0x30, 0xd1, 0xcc, 0xf0, 0x36, 0x80, 0xc3, 0x48, 0xba, 0x8f, 0xff, 0x95, 0x0f, 0x1a, 0x02, 0xe2, 0x68, 0x96, 0x3a, 0x75, 0x3d, 0xaa, 0x84, 0x49, 0xf1, 0x40, 0xee, 0xbf, 0xb1, 0xdd, 0xc1, 0x90, 0x9f, 0x2d, 0xbf, 0x06, 0x30, 0xe3, 0xa9, 0x6c, 0xd2, 0xc0, 0x04, 0xc3, 0xd3, 0xf0, 0x1d, 0xb6, 0x7e, 0x9d, 0x4b, 0xd0, 0x87, 0xbf, 0x74, 0xed, 0xa9, 0x31, 0xd2, 0xee, 0x8d, 0x0a, 0xf7, 0xb1, 0xee, 0x2a, 0x0f, 0x41, 0xfb, 0x13, 0x66, 0x49, 0xfc, 0xfb, 0x2a, 0xcf, 0x39, 0x1f, 0x71, 0x1e, 0x17, 0x59, 0x7d, 0x04, 0x85, 0xf5, 0x3f, 0x3e, 0x96, 0xc1, 0x1b, 0x31, 0x6f, 0x63, 0xeb, 0xdb, 0x64, 0xef, 0x46, 0x08, 0x5e, 0xb9, 0x02, 0xc9, 0x80, 0x68, 0xf7, 0x22, 0x0a, 0x4c, 0x06, 0x03, 0x7d, 0xf2, 0x5b, 0x79, 0x00, 0xf5, 0xee, 0x26, 0x02, 0x16, 0x50, 0xef, 0x21, 0x8f, 0xa4, 0xf4, 0x4a, 0xa5, 0xeb, 0xc5, 0x22, 0x7d, 0x86, 0xd3, 0xa5, 0x30, 0xf5, 0x24, 0x0d, 0x21, 0xe5, 0x4b, 0xf6, 0x8f, 0x6a, 0x98, 0xbf, 0x66, 0x89, 0x8c, 0x33, 0x5b, 0xf9, 0x8f, 0x69, 0x37, 0x2a, 0xe5, 0xe8, 0x73, 0x87, 0xdf, 0x0f, 0x06, 0xf9, 0x4e, 0xb5, 0x7b, 0xac, 0x3d, 0x0c, 0x46, 0x15, 0xe0, 0xcb, 0x58, 0x34, 0xc7, 0x8c, 0xf1, 0x16, 0x57, 0x72, 0xb6, 0x9f, 0x7b, 0x10, 0x03, 0x86, 0x97, 0x86, 0x82, 0xa1, 0xbe, 0xed, 0xfd, 0x63, 0x24, 0xf6, 0x70, 0xa3, 0xd6, 0xcd, 0x63, 0x9e, 0xa8, 0x44, 0x76, 0x40, 0x6f, 0x2d, 0x3e, 0x9f, 0x71, 0x07, 0x4f, 0xc9, 0x1a, 0xde, 0x9a, 0xbf, 0xf1, 0x6c, 0xfa, 0xc1, 0xca, 0x84, 0x09, 0xcc, 0x3c, 0xb1, 0x38, 0x62, 0x55, 0x1a, 0x1f, 0x89, 0x8d, 0xa8, 0x11, 0x16, 0xf9, 0x6b, 0xf4, 0x2b, 0xc1, 0x3a, 0x4f, 0xff, 0xd4, 0x9a, 0xa5, 0xdd, 0xda, 0xe2, 0x02, 0x70, 0x6b, 0x9c, 0xd3, 0x3d, 0x7e, 0x2d, 0xfa, 0x71, 0x24, 0xb9, 0x22, 0xdd, 0x76, 0x41, 0x50, 0x3f, 0xcb, 0x0e, 0xbb, 0xc3, 0x2f, 0x53, 0xde, 0xc9, 0x11, 0x0e, 0xcb, 0xe9, 0x3c, 0x2f, 0xc2, 0x34, 0x09, 0xfc, 0x02, 0xbd, 0xd2, 0xb4, 0xdf, 0x59, 0xa9, 0x72, 0x15, 0xa2, 0x4a, 0x55, 0x5c, 0x42, 0x4f, 0xde, 0x3d, 0x6e, 0xa3, 0x99, 0x23, 0xb0, 0x39, 0x00, 0xb5, 0xea, 0xfe, 0x9c, 0x63, 0x98, 0x0c, 0x6d, 0x3f, 0x55, 0x20, 0x8c, 0x0f, 0xa1, 0x4e, 0x0f, 0xa0, 0xe1, 0xf3, 0x2d, 0x5d, 0xa7, 0xec, 0xa3, 0x1f, 0x34, 0x05, 0x55, 0x47, 0x3b, 0xb4, 0x39, 0x0b, 0xe8, 0x08, 0x71, 0x0d, 0x21, 0xdc, 0xb7, 0x32, 0x0c, 0x50, 0xfe, 0xb1, 0xd1, 0x7a, 0x56, 0x6a, 0xa1, 0x58, 0x11, 0x7a, 0xf7, 0x09, 0x24, 0x0c, 0x1d, 0x3d, 0xd0, 0x71, 0xf3, 0xeb, 0x81, 0x74, 0xec, 0x42, 0xf6, 0xe7, 0x59, 0xe1, 0xa2, 0x82, 0xea, 0x4a, 0x52, 0xee, 0x71, 0x94, 0x11, 0x1c, 0xea, 0x61, 0x48, 0xdb, 0xb9, 0x10, 0x2a, 0xaa, 0x32, 0x34, 0x4f, 0xca, 0x5e, 0x44, 0x9f, 0x98, 0xfc, 0x94, 0x72, 0x1a, 0xc7, 0x83, 0xf6, 0xd8, 0xf7, 0xf6, 0xd0, 0xed, 0x0a, 0x06, 0x06, 0x5d, 0xc4, 0xf6, 0x1c, 0xa9, 0x75, 0x68, 0x7d, 0xa1, 0x7a, 0xd0, 0x1d, 0x7a, 0x06, 0x28, 0x5d, 0x20, 0x23, 0xe6, 0x2f, 0xcd, 0xf3, 0x2b, 0x7a, 0xdb, 0x3c, 0x3d, 0xc0, 0xd7, 0x23, 0x37, 0xfe, 0xd6, 0x38, 0xff, 0xd3, 0x0c, 0xb3, 0x79, 0xe5, 0x9a, 0xfd, 0xfa, 0x81, 0xa8, 0x73, 0x00, 0x81, 0xb4, 0x66, 0x20, 0x73, 0x29, 0x66, 0x3f, 0xf7, 0x34, 0xc0, 0x05, 0x69, 0xd3, 0x45, 0x8f, 0xc0, 0x2f, 0x4d, 0x64, 0xb6, 0x2b, 0xfc, 0xab, 0x2a, 0x3d, 0xc4, 0x9b, 0xc2, 0x7d, 0x2b, 0x32, 0xd4, 0xfb, 0xcf, 0x2a, 0x87, 0x56, 0xa7, 0x29, 0x35, 0x8a, 0x8b, 0x38, 0x14, 0x0a, 0xf7, 0x76, 0x16, 0x0f, 0x0c, 0x0d, 0x0d, 0x2f, 0xd7, 0x66, 0x13, 0x31, 0xd6, 0x99, 0x29, 0x20, 0xb8, 0x28, 0x1e, 0x9e, 0x65, 0xec, 0xb3, 0x7b, 0x3e, 0x4f, 0xfc, 0x86, 0xa6, 0xbc, 0x09, 0xa3, 0xc1, 0x54, 0xc6, 0x1e, 0x7b, 0xe3, 0x20, 0x3f, 0xcd, 0x12, 0x69, 0x1f, 0x3c, 0xde, 0xfe, 0xb9, 0xa2, 0x48, 0x27, 0x44, 0x30, 0x4e, 0x3e, 0xc1, 0xb4, 0x1b, 0x14, 0xd0, 0x18, 0x7b, 0x90, 0xc7, 0x2b, 0x91, 0x99, 0x05, 0xa5, 0xcc, 0x36, 0x84, 0x65, 0x17, 0xf4, 0xae, 0xfc, 0x50, 0x89, 0x72, 0x6f, 0xfc, 0xb6, 0x96, 0x39, 0x39, 0x72, 0x4f, 0x90, 0xf3, 0x44, 0x0f, 0xe9, 0x5b, 0xf1, 0x9e, 0xbe, 0x95, 0x57, 0x6c, 0x8f, 0xb1, 0x99, 0x26, 0x27, 0xdd, 0x7c, 0x87, 0x20, 0xd9, 0x11, 0x71, 0xa9, 0xab, 0x95, 0x3c, 0x87, 0x93, 0x95, 0x4e, 0x5a, 0x41, 0x55, 0xeb, 0x22, 0x46, 0x73, 0x4f, 0x01, 0xc9, 0xc8, 0xfa, 0x43, 0x7b, 0x8f, 0x4c, 0x9b, 0xcd, 0xc9, 0x51, 0xaf, 0x60, 0xe0, 0xde, 0xd7, 0xbc, 0x8a, 0xdd, 0x22, 0x46, 0xf0, 0xe5, 0x9b, 0x6c, 0x10, 0x0e, 0xca, 0x23, 0x5f, 0x03, 0x7d, 0x93, 0xb3, 0x58, 0xc8, 0x10, 0x61, 0x1e, 0x4a, 0x4d, 0xa2, 0xb5, 0xb2, 0xcc, 0x3c, 0xe2, 0x82, 0x99, 0x5e, 0x21, 0x13, 0x38, 0xcb, 0x3d, 0xd9, 0xdc, 0x3a, 0x1d, 0xe9, 0xda, 0xfd, 0xe1, 0xb8, 0x5c, 0xe2, 0x2e, 0x26, 0x5a, 0x57, 0xc5, 0xbb, 0xc6, 0xd1, 0x5b, 0x30, 0x07, 0x6e, 0xa5, 0x31, 0xa9, 0xd9, 0xb2, 0x61, 0x53, 0x6e, 0x7d, 0x9f, 0xf9, 0x9e, 0xc3, 0x88, 0x52, 0x95, 0x12, 0x3c, 0x8d, 0x1b, 0x23, 0x65, 0x40, 0xb8, 0x69, 0x76, 0xa1, 0x1c, 0xea, 0x31, 0xf8, 0xbd, 0x4e, 0x6c, 0x54, 0xc2, 0x35, 0x14, 0x7d, 0x20, 0xce, 0x72, 0x2b, 0x03, 0xa6, 0xad, 0x75, 0x6f, 0xbd, 0x91, 0x8c, 0x27, 0xdf, 0x8e, 0xa9, 0xce, 0x31, 0x04, 0x44, 0x4c, 0x0b, 0xbe, 0x87, 0x73, 0x05, 0xbc, 0x02, 0xe3, 0x55, 0x35, 0xa0, 0x2a, 0x58, 0xdc, 0xda, 0x30, 0x6e, 0x63, 0x2a, 0xd3, 0x0b, 0x3d, 0xc3, 0xce, 0x0b, 0xa9, 0x7f, 0xdf, 0x46, 0xec, 0x19, 0x29, 0x65, 0xdd, 0x9c, 0xd7, 0xf4, 0xa7, 0x1b, 0x02, 0xb8, 0xcb, 0xa3, 0xd4, 0x42, 0x64, 0x6e, 0xee, 0xc4, 0xaf, 0x59, 0x08, 0x24, 0xca, 0x98, 0xd7, 0x4f, 0xbc, 0xa9, 0x34, 0xd0, 0xb6, 0x86, 0x7a, 0xa1, 0x99, 0x1f, 0x30, 0x40, 0xb7, 0x07, 0xe8, 0x06, 0xde, 0x6e, 0x66, 0xb5, 0x93, 0x4f, 0x05, 0x50, 0x9b, 0xea, 0x57, 0x2f, 0xc0, 0x75, 0x0c, 0x52, 0xd1, 0x0f, 0x15, 0xf6, 0xeb, 0xf5, 0x09, 0x66, 0xf7, 0xf8, 0xc7, 0x14, 0x74, 0x2f, 0x5d, 0xe8, 0x77, 0xe9, 0x28, 0xd8, 0xef, 0xe5, 0x3d, 0xb9, 0x2e, 0xc6, 0x08, 0x54, 0xa5, 0xc1, 0x33, 0xbd, 0xef, 0x99, 0xc9, 0xe0, 0x12, 0xcd, 0x9c, 0x5d, 0x01, 0x10, 0xe4, 0x96, 0x65, 0xf9, 0x28, 0x05, 0x9c, 0xfc, 0x62, 0xd4, 0x02, 0x99, 0x5e, 0xa7, 0x70, 0xd3, 0x63, 0xbd, 0x03, 0xe4, 0x15, 0x37, 0x1f, 0x2f, 0x9a, 0xb7, 0xb3, 0x76, 0xfc, 0x2d, 0xbe, 0x4d, 0xce, 0xee, 0x12, 0xce, 0x13, 0x07, 0x58, 0x8f, 0x5b, 0xd0, 0x54, 0xd1, 0x2f, 0xc4, 0x6a, 0xfa, 0xaf, 0x8f, 0x61, 0x46, 0x7a, 0x69, 0x68, 0xb9, 0xce, 0xa3, 0x56, 0x58, 0xf1, 0x7f, 0x36, 0x98, 0xcf, 0x45, 0x03, 0x17, 0xe4, 0x93, 0xb0, 0x8a, 0x5c, 0xf5, 0x6b, 0xf6, 0x79, 0xb5, 0x23, 0x24, 0x36, 0xf5, 0x48, 0x4f, 0x2a, 0xfa, 0xd2, 0x1f, 0xae, 0xcb, 0x84, 0xdb, 0x42, 0xfb, 0x72, 0xda, 0x2d, 0xc3, 0xc1, 0x3a, 0x64, 0x54, 0xae, 0xd5, 0xad, 0x6a, 0xd1, 0x71, 0x04, 0x25, 0xa3, 0x37, 0x3e, 0x15, 0x3f, 0x67, 0xec, 0x93, 0x65, 0x49, 0x82, 0x58, 0xc4, 0x67, 0xb9, 0x48, 0x79, 0xf9, 0x31, 0x8f, 0xd3, 0xa1, 0x5b, 0xef, 0x59, 0x58, 0x96, 0x58, 0x0e, 0xa8, 0x98, 0xba, 0xf3, 0x1d, 0x10, 0x17, 0xce, 0xf6, 0x89, 0xdc, 0x2a, 0x1f, 0x92, 0x71, 0x9f, 0x64, 0x1c, 0x0f, 0x53, 0xdf, 0x23, 0xd2, 0xc1, 0xb2, 0x91, 0x0f, 0xb9, 0xfc, 0x5f, 0xe7, 0xa8, 0x05, 0xfd, 0x1c, 0x1a, 0xbc, 0xf4, 0x24, 0x7d, 0x64, 0xca, 0x7c, 0x28, 0x8a, 0x25, 0x3f, 0x9c, 0x3a, 0x34, 0xf7, 0x09, 0x72, 0x4b, 0xb3, 0x14, 0xd7, 0xcd, 0x5a, 0xd7, 0xa7, 0x4f, 0x3e, 0x29, 0xef, 0xfa, 0xf4, 0x20, 0xfe, 0x31, 0x64, 0xd5, 0x19, 0x74, 0x1c, 0x67, 0x70, 0x85, 0xea, 0x43, 0x51, 0xc9, 0xa9, 0xa2, 0x9c, 0xf0, 0x5b, 0x53, 0x77, 0xd9, 0x78, 0xba, 0x42, 0xaf, 0x86, 0x19, 0xce, 0x59, 0xea, 0x0e, 0xc9, 0x11, 0xfe, 0x5d, 0x7d, 0x52, 0x63, 0xf0, 0xbb, 0xf8, 0x99, 0x1c, 0x11, 0xa3, 0xcc, 0x26, 0x43, 0x5c, 0xf1, 0x06, 0xf9, 0x7b, 0x12, 0x6a, 0xb6, 0xc7, 0xe6, 0xfe, 0x09, 0xe0, 0xa5, 0xeb, 0x07, 0xda, 0x1a, 0x9d, 0xf8, 0x2b, 0xfa, 0xca, 0x51, 0xc7, 0x74, 0xb0, 0xe3, 0x89, 0x09, 0x9e, 0x51, 0xd5, 0x9e, 0xb5, 0xc7, 0x7c, 0xd0, 0xf0, 0xe9, 0xdf, 0x87, 0x62, 0x0a, 0x58, 0xce, 0xbf, 0x9f, 0xd5, 0xe2, 0x1e, 0xf3, 0xc6, 0x88, 0xfd, 0x1c, 0x3a, 0xa4, 0x86, 0x2d, 0x44, 0x08, 0x11, 0xad, 0xa4, 0x8a, 0xe9, 0x48, 0xa3, 0x59, 0x53, 0xc5, 0x3f, 0x91, 0xcc, 0x38, 0x88, 0x0c, 0x93, 0x79, 0x4a, 0x7c, 0x67, 0xd4, 0xec, 0xb6, 0x92, 0x02, 0x98, 0x51, 0x26, 0x58, 0x9d, 0x70, 0x87, 0x3f, 0x11, 0xdc, 0x29, 0xe4, 0xba, 0x56, 0x9b, 0x31, 0x2f, 0x2b, 0xc5, 0xfb, 0x3a, 0x08, 0x6e, 0x7d, 0x81, 0x10, 0x01, 0x05, 0x65, 0x2c, 0x90, 0xed, 0x2b, 0xa2, 0x19, 0xcd, 0x59, 0xea, 0x08, 0xef, 0x63, 0xbd, 0xfe, 0x03, 0x87, 0x6e, 0xd1, 0x14, 0xf6, 0x7d, 0xd4, 0xbb, 0x34, 0x6a, 0x58, 0x93, 0xc1, 0xc7, 0x72, 0xec, 0xf9, 0x91, 0xff, 0xc4, 0x39, 0xc0, 0xe6, 0xf3, 0x43, 0x1d, 0x9d, 0xa5, 0xe4, 0x54, 0xef, 0x0d, 0xd4, 0x4a, 0xfc, 0x58, 0xdd, 0xb0, 0x81, 0xe0, 0x3f, 0xd9, 0x59, 0xa3, 0x54, 0xc8, 0x44, 0xf3, 0x70, 0x8e, 0xe8, 0x6f, 0x0b, 0xd3, 0x15, 0x31, 0x22, 0xb2, 0x4d, 0x49, 0xda, 0xca, 0x84, 0x6a, 0x67, 0x91, 0x24, 0xe4, 0x2c, 0xec, 0x54, 0xd2, 0x23, 0xfd, 0x7a, 0x95, 0x80, 0x3c, 0xfe, 0x81, 0x91, 0xca, 0x52, 0xd5, 0xe9, 0x02, 0x2f, 0xf1, 0xbd, 0x50, 0x21, 0xc3, 0x8e, 0x46, 0x45, 0x83, 0x08, 0xec, 0x51, 0xa0, 0x2b, 0x58, 0xd6, 0xfa, 0xa8, 0x7f, 0xc2, 0x51, 0x8e, 0x4b, 0x29, 0xfd, 0x25, 0xee, 0x45, 0xe0, 0x1a, 0x75, 0xbb, 0x9a, 0xdd, 0xa0, 0x1f, 0xfb, 0x48, 0xf1, 0xbb, 0xbe, 0x81, 0x03, 0x8c, 0x74, 0x21, 0x1d, 0x8e, 0xbe, 0x96, 0x07, 0x3a, 0xbf, 0xc6, 0x1c, 0x4c, 0xd1, 0xf4, 0xa1, 0xc9, 0x77, 0xe8, 0x55, 0x41, 0x94, 0x4a, 0x49, 0x51, 0xda, 0x50, 0xf2, 0x6d, 0x84, 0x99, 0x7d, 0xdc, 0x48, 0x58, 0x62, 0x04, 0x87, 0xb4, 0x3c, 0xe8, 0xc8, 0x6f, 0xd8, 0xef, 0x64, 0xc6, 0x8c, 0xe7, 0x82, 0x99, 0xca, 0x49, 0x46, 0xcc, 0xf4, 0xbf, 0x46, 0xed, 0x72, 0xe3, 0x3e, 0x17, 0x03, 0x4a, 0x04, 0x16, 0x50, 0xc1, 0xbe, 0xcb, 0xc7, 0xd6, 0x52, 0xd2, 0xa6, 0x9b, 0x1e, 0x63, 0x56, 0xa6, 0xea, 0x76, 0xfb, 0x5c, 0x1a, 0x2b, 0x49, 0x70, 0x28, 0x68, 0x99, 0xa6, 0x52, 0xc4, 0x3c, 0xdd, 0x90, 0xa4, 0x0f, 0x4c, 0xc9, 0xa3, 0x4f, 0x0c, 0x46, 0x38, 0xaf, 0xd6, 0x67, 0x93, 0xa8, 0x0f, 0x95, 0xc7, 0x11, 0x01, 0x77, 0x2e, 0xef, 0x6c, 0x69, 0x09, 0x8e, 0x3d, 0x2a, 0x68, 0xd1, 0x9d, 0xd4, 0x4a, 0xc6, 0x2d, 0x12, 0x04, 0x7d, 0x90, 0x8d, 0xe7, 0x1b, 0x2b, 0xa7, 0x1d, 0x2a, 0x28, 0x6c, 0xd4, 0x33, 0xc1, 0xc5, 0x9f, 0x8f, 0xbb, 0xef, 0x18, 0x7a, 0x30, 0x2c, 0xcb, 0x69, 0x92, 0xb9, 0x4f, 0x9e, 0xed, 0xff, 0xb6, 0xf9, 0x6c, 0x0d, 0x28, 0x11, 0x1f, 0x46, 0xca, 0x83, 0xfb, 0x57, 0xe4, 0x8a, 0x23, 0x6d, 0x44, 0xd0, 0x66, 0xa4, 0xdd, 0x84, 0x08, 0xc2, 0xb4, 0xad, 0xc5, 0x25, 0xfd, 0xbe, 0x13, 0xfa, 0x80, 0x6a, 0xa8, 0xb0, 0x42, 0xb9, 0x3c, 0xac, 0x62, 0x5c, 0x90, 0x3f, 0x41, 0x3e, 0xaf, 0xd5, 0xe5, 0x5b, 0x73, 0x6f, 0xa0, 0xd5, 0x4c, 0x53, 0xec, 0x44, 0x3d, 0x01, 0x9a, 0x4e, 0x27, 0x6a, 0x2c, 0x79, 0x4a, 0x5d, 0x7f, 0x3c, 0x09, 0x42, 0xad, 0x5c, 0xed, 0x0a, 0x31, 0x76, 0xed, 0x66, 0x4c, 0xd7, 0xed, 0x37, 0xa8, 0x94, 0x84, 0x46, 0x3c, 0xd8, 0x02, 0x36, 0x6f, 0x78, 0xb2, 0xb7, 0x80, 0xcd, 0x5c, 0xfc, 0x25, 0xc2, 0x0e, 0x6e, 0x72, 0x2c, 0x1c, 0xa2, 0xfd, 0x5a, 0x66, 0x88, 0x40, 0xed, 0xd9, 0xe6, 0x3e, 0xea, 0x39, 0x05, 0x6a, 0x0e, 0x1d, 0xab, 0xc4, 0x62, 0x3b, 0x48, 0x45, 0x0f, 0xe5, 0x74, 0x7d, 0x72, 0xd4, 0x99, 0x7b, 0x73, 0x25, 0xed, 0xed, 0x13, 0xa1, 0xa4, 0x88, 0x45, 0x41, 0x63, 0xaa, 0xff, 0xf1, 0xf7, 0x3e, 0x90, 0x95, 0x47, 0xe1, 0x34, 0x4a, 0x87, 0x42, 0xe6, 0xee, 0xaf, 0xcf, 0x75, 0xe2, 0x2c, 0x8e, 0xda, 0x0e, 0xd5, 0x48, 0xc9, 0x26, 0x20, 0xed, 0x86, 0x2c, 0x96, 0x34, 0xfa, 0x37, 0x84, 0x82, 0x06, 0x72, 0xf4, 0x0d, 0x17, 0x67, 0xdb, 0x41, 0xfb, 0x7e, 0x94, 0x63, 0xf3, 0xc0, 0x8d, 0x74, 0x09, 0xe1, 0x41, 0x58, 0xa3, 0x7e, 0x66, 0x37, 0x59, 0xa3, 0x67, 0x24, 0x04, 0x90, 0x14, 0xfc, 0x17, 0xbd, 0x99, 0x91, 0x33, 0x1b, 0xac, 0x08, 0xf5, 0x9d, 0x0b, 0x80, 0x13, 0xf7, 0x26, 0xf5, 0xa7, 0xa6, 0x18, 0x63, 0xca, 0x30, 0xdc, 0x2e, 0x65, 0xad, 0xbe, 0xc1, 0x44, 0x86, 0x0f, 0x75, 0x6c, 0x7d, 0x1d, 0xb5, 0xaf, 0xed, 0x63, 0x61, 0x7d, 0x53, 0xfc, 0x6f, 0xfd, 0x0e, 0x5e, 0xd8, 0x5c, 0x63, 0x44, 0xb2, 0x66, 0xc4, 0xec, 0x99, 0x53, 0x52, 0x83, 0x54, 0xe3, 0xa0, 0xde, 0xb6, 0xad, 0xba, 0x6a, 0xc1, 0xb3, 0x66, 0x66, 0x12, 0x3b, 0xa9, 0x4f, 0x79, 0xda, 0x8d, 0x9c, 0xe7, 0xd2, 0x22, 0xac, 0x8d, 0x9e, 0xc3, 0xfd, 0x42, 0xca, 0x9a, 0x9e, 0x25, 0x08, 0x67, 0xe7, 0x84, 0x81, 0x7c, 0x67, 0xfd, 0x69, 0x0c, 0x1e, 0xe3, 0xd6, 0xa6, 0xec, 0xe4, 0xd2, 0xfd, 0x4a, 0xe8, 0xae, 0xea, 0x38, 0x3b, 0x9a, 0xb4, 0x76, 0xef, 0x73, 0x8e, 0xf7, 0x7c, 0xdc, 0x61, 0x93, 0xaa, 0x90, 0xcc, 0xfc, 0xb1, 0xf7, 0x6a, 0xf3, 0x9e, 0xf7, 0x53, 0xbc, 0xf8, 0x0c, 0xe5, 0xcf, 0xa4, 0x9b, 0xc4, 0xd0, 0x06, 0x83, 0x1f, 0xc1, 0x69, 0xf6, 0x35, 0x77, 0xa1, 0x87, 0x18, 0x4a, 0xee, 0x83, 0xb1, 0x11, 0x24, 0x85, 0x05, 0x4e, 0x09, 0x45, 0xb6, 0xa5, 0xff, 0xb1, 0xcd, 0x93, 0xe3, 0x3f, 0xb6, 0x5c, 0x34, 0x81, 0x8c, 0x45, 0x78, 0xfa, 0x98, 0x04, 0xdb, 0x30, 0x14, 0x75, 0x1a, 0x02, 0x34, 0x8e, 0x9f, 0x3c, 0x67, 0x95, 0xee, 0x69, 0xda, 0x90, 0x3f, 0xe8, 0x3d, 0xfe, 0x6c, 0x42, 0xcb, 0xc4, 0x0e, 0xbb, 0x84, 0x6a, 0xe3, 0x27, 0xbd, 0x87, 0x74, 0xff, 0xdb, 0x7a, 0xf4, 0xb4, 0x5c, 0x5b, 0x6a, 0x43, 0x17, 0x32, 0x13, 0x0a, 0xc4, 0x66, 0x01, 0xda, 0xbe, 0x78, 0x09, 0x4d, 0x08, 0xf0, 0xdc, 0x5a, 0x8e, 0x98, 0x74, 0x26, 0xae, 0xe9, 0xb2, 0x1d, 0xf7, 0xc3, 0x45, 0x42, 0x31, 0x61, 0xcd, 0xc3, 0x9d, 0x8b, 0x40, 0xd1, 0x7e, 0x0d, 0x8d, 0xae, 0xd7, 0x69, 0x80, 0x08, 0x77, 0xc9, 0xe6, 0x85, 0x33, 0x37, 0xf1, 0x9f, 0x73, 0x10, 0xde, 0xb2, 0xf0, 0xb6, 0xd4, 0x53, 0xbb, 0x86, 0x10, 0xe4, 0x82, 0x0a, 0x3f, 0x65, 0x0f, 0x6f, 0x2b, 0x8d, 0x11, 0x39, 0x9a, 0x1a, 0x1f, 0x35, 0x73, 0x65, 0xfa, 0xaf, 0x23, 0x39, 0x12, 0xe6, 0x3f, 0xe5, 0x4c, 0xbd, 0x6b, 0x90, 0x03, 0xb3, 0x7a, 0xcd, 0x4d, 0x15, 0xd7, 0x70, 0x7f, 0x73, 0x23, 0x9f, 0xf3, 0x50, 0x1f, 0x2c, 0x08, 0x1d, 0xcd, 0x22, 0x6b, 0x69, 0xd2, 0x9d, 0x95, 0x52, 0x1f, 0xdf, 0x95, 0x3f, 0xd0, 0xa1, 0x10, 0xd1, 0x54, 0xa7, 0x86, 0x16, 0xcf, 0x97, 0xd6, 0x00, 0xbc, 0x0b, 0x05, 0x16, 0xd7, 0xe5, 0x3b, 0x6a, 0x3a, 0xe3, 0x0e, 0xcb, 0xc6, 0x73, 0x03, 0x3b, 0xc4, 0xc8, 0x52, 0xa4, 0xcc, 0x2d, 0xea, 0xc6, 0xe6, 0x99, 0xb5, 0x74, 0xf0, 0x84, 0x1d, 0x00, 0x40, 0xfa, 0xcf, 0xf4, 0x8a, 0xee, 0xbf, 0x02, 0x03, 0xd0, 0x6c, 0x3e, 0xc6, 0x62, 0x65, 0x8b, 0x77, 0xc7, 0x0c, 0x53, 0x27, 0xdc, 0x9a, 0x7c, 0x78, 0xcc, 0x63, 0x97, 0x02, 0xdf, 0x5c, 0x5a, 0xf5, 0x93, 0xda, 0x50, 0xff, 0xee, 0x9c, 0xcf, 0x70, 0x12, 0x0c, 0x2b, 0x9c, 0x12, 0xc2, 0x29, 0x80, 0x04, 0x4a, 0xb6, 0xa9, 0x58, 0x27, 0xd9, 0x52, 0x68, 0x17, 0xe7, 0xcd, 0x4f, 0x99, 0xf6, 0x24, 0xff, 0xad, 0x93, 0xff, 0x8e, 0xdb, 0xb8, 0xc8, 0xd1, 0x76, 0xf8, 0x0e, 0x2c, 0x22, 0xfd, 0x27, 0xa8, 0x94, 0x34, 0x1a, 0x46, 0x99, 0xc7, 0xbc, 0x94, 0x5a, 0xcc, 0x18, 0x7d, 0xde, 0xbc, 0x14, 0x65, 0xd0, 0x26, 0x52, 0x76, 0x83, 0xa4, 0x55, 0x34, 0x33, 0x0f, 0xe5, 0x58, 0x8e, 0xef, 0xb4, 0xdb, 0x72, 0x35, 0x41, 0x51, 0xf9, 0x2d, 0xfd, 0x78, 0xb3, 0xae, 0xad, 0x11, 0x32, 0x94, 0x0f, 0xee, 0xcc, 0x6f, 0xc0, 0x4d, 0x9c, 0x7d, 0x5d, 0x64, 0xca, 0xd6, 0xe8, 0x3d, 0x0c, 0xe7, 0x6e, 0xc4, 0x6d, 0x21, 0xe7, 0x1f, 0x4e, 0xf2, 0x5e, 0x3d, 0xaa, 0xf5, 0x52, 0xb2, 0x9e, 0x66, 0x5b, 0xc2, 0x28, 0xd8, 0x11, 0xbb, 0x2f, 0x2a, 0x29, 0x89, 0xc3, 0xb7, 0xe1, 0x84, 0xa7, 0xcd, 0x9f, 0x8c, 0x0c, 0x61, 0xd4, 0x58, 0xa0, 0x00, 0x27, 0x0b, 0xc7, 0x09, 0xd0, 0x08, 0x28, 0x1a, 0x41, 0x08, 0x6c, 0xc8, 0x0c, 0x6a, 0x42, 0x93, 0x01, 0xca, 0xa7, 0x18, 0x96, 0xd4, 0x64, 0x89, 0x8d, 0x5a, 0xd8, 0x5b, 0xd0, 0xa5, 0xf7, 0x3e, 0xa0, 0x09, 0x93, 0x52, 0xee, 0xbc, 0xdb, 0x98, 0x09, 0xe9, 0x21, 0xa7, 0x7a, 0xff, 0xe0, 0xa0, 0x2c, 0x4f, 0xfd, 0x63, 0xd1, 0xd6, 0x4d, 0x03, 0x80, 0x57, 0x58, 0x78, 0xa3, 0xae, 0x5c, 0x94, 0x10, 0x60, 0x95, 0x39, 0x76, 0x76, 0xbc, 0xc8, 0xfb, 0x8c, 0xce, 0xdc, 0x23, 0x25, 0x0e, 0x39, 0xf4, 0x41, 0x4d, 0xff, 0x58, 0x32, 0x69, 0x24, 0xc2, 0xab, 0x14, 0x20, 0x14, 0x1a, 0xd6, 0xea, 0xc1, 0x37, 0x55, 0x24, 0x2e, 0xdd, 0xd5, 0x92, 0x5f, 0x1a, 0xfb, 0xd1, 0xcf, 0x82, 0xd6, 0x46, 0x9f, 0xc8, 0x20, 0x54, 0xf3, 0x8f, 0xc0, 0xd2, 0x9a, 0x7d, 0x94, 0xbc, 0xed, 0x91, 0x6e, 0x28, 0xf9, 0xb7, 0x5c, 0x7c, 0xe0, 0x9a, 0x2d, 0xdf, 0x7c, 0xba, 0x30, 0xed, 0x46, 0xbe, 0x3f, 0xaf, 0x76, 0x0b, 0xfc, 0xca, 0x6c, 0x95, 0x5b, 0xf6, 0x4f, 0xf5, 0x61, 0xb2, 0xf4, 0xbd, 0x2b, 0x37, 0x01, 0x08, 0x31, 0xaa, 0x52, 0x55, 0xcc, 0x95, 0x9b, 0x95, 0xf6, 0x98, 0x4f, 0x82, 0x51, 0x5c, 0xc1, 0x33, 0x6c, 0xc9, 0x8a, 0xed, 0x41, 0x79, 0x2a, 0x3d, 0x02, 0x6c, 0xf2, 0x43, 0x15, 0xfd, 0x21, 0x51, 0x5d, 0x14, 0x4d, 0xb5, 0xbb, 0x9e, 0x04, 0xd2, 0xd4, 0x3a, 0xb4, 0x76, 0x15, 0x35, 0xc8, 0x67, 0xf5, 0xb9, 0x14, 0x3f, 0x7a, 0x41, 0x73, 0x7a, 0xff, 0x50, 0xae, 0xce, 0x34, 0x63, 0xa0, 0xbb, 0x66, 0x24, 0x98, 0x62, 0x01, 0xe0, 0xff, 0x9a, 0x53, 0x3b, 0x3b, 0x41, 0x92, 0x23, 0xd2, 0xd0, 0x21, 0x02, 0xd3, 0x32, 0x0f, 0x38, 0x72, 0xd7, 0xe1, 0xc8, 0xf2, 0x04, 0x91, 0x51, 0xc8, 0x6d, 0xd6, 0x41, 0xfd, 0x05, 0xa6, 0x45, 0xd4, 0x15, 0xf9, 0x04, 0xad, 0x8b, 0xd1, 0x0c, 0x29, 0x95, 0x77, 0x0c, 0x8f, 0x6f, 0x07, 0x45, 0x6e, 0x7a, 0x2e, 0x3b, 0x84, 0x8d, 0x33, 0xb0, 0xdf, 0x8f, 0x34, 0xd2, 0x42, 0x46, 0xb3, 0xb4, 0xca, 0x6a, 0x51, 0xfb, 0xd1, 0xfe, 0xd8, 0xda, 0x13, 0xe0, 0x7f, 0x40, 0x0f, 0x9e, 0x6a, 0x4f, 0xb1, 0x8b, 0x71, 0x11, 0x2d, 0x12, 0x22, 0x66, 0x2e, 0x4b, 0x09, 0x41, 0x30, 0xcc, 0x2f, 0x14, 0x2a, 0xc2, 0xe0, 0x89, 0x71, 0x40, 0xb1, 0x73, 0xd9, 0xd6, 0xc2, 0x04, 0x1d, 0x66, 0x41, 0x40, 0x81, 0x33, 0x2f, 0xb1, 0xb5, 0x3b, 0x67, 0x5d, 0xfd, 0xc7, 0xdc, 0xf5, 0x8f, 0x40, 0x22, 0x4f, 0x3c, 0x44, 0x30, 0x16, 0x53, 0xf9, 0x64, 0xc1, 0xc3, 0xa1, 0xc7, 0xc1, 0x7f, 0x6f, 0x93, 0xff, 0x27, 0x99, 0xf2, 0x85, 0xe4, 0xaf, 0x09, 0x7b, 0x94, 0x2b, 0x35, 0x56, 0x27, 0x49, 0x94, 0x4c, 0x48, 0x19, 0xc8, 0x0b, 0x40, 0xd2, 0xf7, 0xaa, 0x18, 0x69, 0x16, 0xe0, 0xfe, 0x62, 0x68, 0x74, 0xeb, 0xe7, 0x41, 0xf4, 0x82, 0x17, 0x10, 0xaa, 0x3a, 0xa0, 0x9c, 0xcc, 0xbf, 0x90, 0x8e, 0xf3, 0x96, 0x68, 0x30, 0xce, 0x00, 0x72, 0x74, 0x18, 0x22, 0x55, 0x38, 0xc7, 0x62, 0xe7, 0xc8, 0x87, 0x14, 0x42, 0xa5, 0x66, 0x56, 0x1a, 0x85, 0xd1, 0x38, 0x4e, 0x9a, 0xbf, 0x21, 0xbc, 0x17, 0x2c, 0x6e, 0x5a, 0xf1, 0xc9, 0x5b, 0x83, 0xe2, 0xf2, 0x27, 0x8e, 0xb4, 0xe0, 0x73, 0xa5, 0xbc, 0x20, 0xec, 0xd4, 0xa5, 0x43, 0x29, 0x61, 0x6f, 0xd8, 0xd6, 0x5c, 0xb6, 0x97, 0x13, 0x76, 0x38, 0xdf, 0x17, 0x17, 0x92, 0x63, 0x19, 0xaa, 0x4a, 0x20, 0x70, 0x3c, 0x12, 0x92, 0xf9, 0x45, 0x4b, 0x27, 0xb9, 0xc5, 0xc9, 0xf4, 0xc3, 0x93, 0xd6, 0xa6, 0x5c, 0xf2, 0x79, 0xbc, 0x5e, 0x66, 0xf8, 0xf4, 0xda, 0xc6, 0x9b, 0x03, 0x01, 0x91, 0xb3, 0x89, 0x45, 0x85, 0xdb, 0x44, 0xbb, 0x6e, 0x7e, 0x84, 0xc4, 0x3d, 0x99, 0xdf, 0xec, 0x59, 0xc2, 0x25, 0x12, 0x3a, 0x6a, 0x97, 0xca, 0x33, 0x5f, 0x53, 0xff, 0x8f, 0x94, 0x13, 0xdd, 0xe0, 0x25, 0x17, 0xed, 0x94, 0x96, 0x60, 0x82, 0xc9, 0x5c, 0x1f, 0x55, 0x63, 0x9e, 0x6d, 0x6c, 0x5b, 0x3c, 0x3c, 0x40, 0x59, 0x11, 0x8e, 0x1e, 0x86, 0x75, 0xe5, 0xce, 0x9b, 0x06, 0xfa, 0x73, 0x3f, 0xa9, 0xb1, 0xb2, 0x8f, 0xcb, 0x4d, 0x16, 0xfe, 0xed, 0xe0, 0xb3, 0x5f, 0x5f, 0x06, 0x0a, 0x40, 0x4b, 0xd3, 0x2d, 0x7a, 0xf6, 0x0a, 0x24, 0x06, 0x43, 0x90, 0x8e, 0x12, 0x79, 0x20, 0x8b, 0x54, 0x45, 0x3f, 0xda, 0x9f, 0x03, 0x73, 0x3f, 0xb4, 0x39, 0xb0, 0x28, 0x5a, 0x64, 0x13, 0x8f, 0xb1, 0xf8, 0xd3, 0x22, 0xc3, 0xa2, 0x74, 0xa2, 0x5c, 0xd0, 0x3d, 0x89, 0x1c, 0x73, 0xed, 0xef, 0xca, 0x03, 0xaa, 0xae, 0xeb, 0xc4, 0x3a, 0xc5, 0x93, 0x49, 0x75, 0xfa, 0x7c, 0x36, 0xfa, 0xc4, 0x55, 0x4a, 0x22, 0x67, 0x5c, 0x9c, 0x32, 0x61, 0x2f, 0x24, 0xd5, 0x05, 0xdf, 0x7e, 0xc9, 0x66, 0x47, 0xeb, 0xd8, 0x76, 0x9c, 0x99, 0x0a, 0x6f, 0x45, 0x24, 0x19, 0x72, 0xec, 0x5c, 0x25, 0x6e, 0xd5, 0x49, 0xa9, 0x44, 0x6e, 0x6c, 0xae, 0x29, 0x28, 0x48, 0x3e, 0x4b, 0x86, 0x21, 0x1c, 0xb7, 0x73, 0x04, 0xb2, 0x7a, 0xd9, 0x07, 0x4b, 0x06, 0x6f, 0xd2, 0x82, 0xd8, 0xd3, 0x5e, 0xfa, 0x58, 0xd8, 0xfd, 0x50, 0x01, 0x21, 0x9b, 0x4e, 0xc1, 0xef, 0x43, 0x62, 0xa3, 0x37, 0xe5, 0x4e, 0xab, 0xf8, 0x56, 0x20, 0x01, 0xcb, 0x98, 0x65, 0x53, 0xbc, 0x5c, 0x9a, 0x74, 0x58, 0xc5, 0xe3, 0x49, 0x07, 0x6f, 0x00, 0xe5, 0x9c, 0xb0, 0x7c, 0xf3, 0x2b, 0x1d, 0x27, 0x54, 0x1a, 0x50, 0xc7, 0x0a, 0x7b, 0xe9, 0x0b, 0x55, 0x99, 0xd3, 0xc0, 0x1b, 0xd1, 0xc9, 0x47, 0x8d, 0xa4, 0x18, 0x47, 0x08, 0x0a, 0xa6, 0x9f, 0x39, 0x08, 0x33, 0x9f, 0x85, 0x84, 0xdf, 0x77, 0xa8, 0x59, 0xec, 0xef, 0x9c, 0xa7, 0xc6, 0x59, 0xbc, 0x6c, 0x40, 0xc4, 0x29, 0x59, 0x21, 0x73, 0x6d, 0xde, 0xdf, 0x8e, 0x5e, 0x88, 0xaa, 0x16, 0x45, 0x8c, 0xac, 0x1e, 0x40, 0xa4, 0x90, 0x39, 0xe5, 0x19, 0x41, 0x2f, 0x28, 0x21, 0xf4, 0xf4, 0x7f, 0x6c, 0x68, 0xda, 0x44, 0xfa, 0x6c, 0x05, 0x5a, 0x2f, 0xa3, 0x1f, 0x13, 0x29, 0x84, 0x4e, 0x51, 0x51, 0xa4, 0x63, 0xec, 0x30, 0x38, 0x55, 0x54, 0x85, 0xd5, 0xed, 0x78, 0x94, 0x7b, 0xc2, 0xe6, 0xc0, 0xd2, 0x68, 0x33, 0x5c, 0xb3, 0xe5, 0x9d, 0xbf, 0xea, 0x64, 0xef, 0x96, 0x3b, 0x2e, 0xa5, 0x7f, 0xa3, 0xd5, 0x51, 0xd3, 0xdf, 0xb2, 0x3d, 0xc2, 0x33, 0x92, 0x52, 0xa6, 0x64, 0xad, 0x38, 0x91, 0x06, 0xd8, 0xbf, 0x28, 0xfe, 0xfb, 0x7e, 0xb5, 0x3f, 0xc4, 0xba, 0x77, 0xd7, 0x9d, 0x89, 0x3d, 0x2f, 0xdc, 0x36, 0x33, 0x8e, 0x3a, 0xe8, 0xfb, 0xe0, 0x87, 0x7f, 0xff, 0xb6, 0x9c, 0xbf, 0x06, 0x8d, 0x90, 0xb0, 0x06, 0x53, 0x2f, 0x44, 0x39, 0x27, 0xa7, 0x3b, 0x73, 0x61, 0x85, 0x44, 0xb3, 0xd2, 0xe0, 0x65, 0xf8, 0x4d, 0xd4, 0x9c, 0x56, 0x65, 0x33, 0xc7, 0x48, 0x79, 0x76, 0xc1, 0x48, 0xee, 0xfa, 0xce, 0x9d, 0xbc, 0x69, 0x39, 0x75, 0x2c, 0x75, 0x3b, 0x33, 0xe0, 0xcd, 0x1f, 0x0a, 0x13, 0x49, 0xa4, 0xcb, 0x22, 0x68, 0xa3, 0xfb, 0x4b, 0xfd, 0xf1, 0x29, 0xb5, 0x25, 0x87, 0x7e, 0xb1, 0x7c, 0xe0, 0x96, 0x40, 0x91, 0xa3, 0x8e, 0xd5, 0x97, 0x82, 0x5f, 0x5c, 0x5d, 0x62, 0x6a, 0x7a, 0x80, 0xbc, 0x54, 0x17, 0xdf, 0x43, 0x13, 0x1a, 0x4f, 0xc7, 0x49, 0x73, 0x90, 0x59, 0xd1 ],
+    const [ 0x62, 0x9b, 0x37, 0xb9, 0xa0, 0x56, 0xe7, 0x49, 0x59, 0x34, 0x6e, 0x8c, 0x40, 0xae, 0xb4, 0xe2, 0x07, 0x3e, 0x97, 0xbf, 0x21, 0x17, 0xd2, 0xff, 0xcd, 0x13, 0x23, 0x7a, 0x50, 0xed, 0xad, 0xd9, 0x81, 0xb0, 0x9b, 0xa8, 0x8b, 0x6f, 0x06, 0xac, 0xef, 0x37, 0x18, 0x76, 0xc8, 0x42, 0x72, 0x38, 0x53, 0x6d, 0xcc, 0xd8, 0xae, 0xec, 0xdb, 0x43, 0xe0, 0x3d, 0x78, 0x04, 0x1a, 0x5a, 0xfe, 0x15, 0x3d, 0x33, 0xf4, 0xf4, 0x9b, 0x5b, 0xec, 0xfa, 0x02, 0x02, 0xaa, 0xe9, 0xf7, 0x23, 0x89, 0xc4, 0x3f, 0xfe, 0x1b, 0xe3, 0xa4, 0xc9, 0x10, 0x46, 0xf5, 0xa3, 0x59, 0x2a, 0x4f, 0xc9, 0x8d, 0xda, 0x9b, 0x0c, 0x8b, 0xc8, 0x58, 0x83, 0x61, 0xdc, 0x9b, 0x7d, 0x6c, 0x0c, 0x53, 0xb9, 0xc1, 0x2d, 0xd2, 0xda, 0xcc, 0x08, 0x89, 0x15, 0x37, 0xb1, 0x13, 0x2d, 0x0d, 0x14, 0x76, 0xa1, 0x20, 0xd1, 0xa5, 0x24, 0xa8, 0x4a, 0x49, 0x4d, 0x2c, 0xf9, 0xc0, 0x90, 0xa6, 0x08, 0x66, 0x6d, 0xe2, 0x1b, 0x14, 0xe7, 0x27, 0x71, 0xe7, 0x38, 0x19, 0x2b, 0x43, 0xc3, 0xde, 0xeb, 0x17, 0x4a, 0x80, 0xa1, 0x62, 0x61, 0x92, 0xa2, 0xf6, 0x22, 0x17, 0xfb, 0x7c, 0x23, 0x9f, 0x04, 0xb8, 0xa5, 0xb3, 0x38, 0x0e, 0x0e, 0x73, 0x43, 0x45, 0x9a, 0x7e, 0x5d, 0x8c, 0x4d, 0x12, 0xd7, 0xba, 0x2c, 0x75, 0xf3, 0xda, 0xac, 0x93, 0xf9, 0xe7, 0x6b, 0xe8, 0x87, 0xd4, 0x1e, 0xa0, 0x29, 0xcf, 0xca, 0xfd, 0x29, 0xc7, 0x38, 0xfa, 0xa9, 0x2c, 0xa3, 0x2e, 0xee, 0xf6, 0xb3, 0xf2, 0xff, 0xe8, 0xaf, 0xc6, 0x6f, 0x16, 0xee, 0xf1, 0x77, 0xa5, 0x8e, 0x68, 0x48, 0xd2, 0x69, 0xf1, 0x9e, 0x35, 0x45, 0x88, 0x99, 0x47, 0x4b, 0x02, 0xc9, 0x23, 0xbb, 0xf0, 0x87, 0x89, 0xdd, 0xc6, 0x8c, 0x28, 0x3b, 0x3d, 0xbc, 0x1d, 0x0d, 0xf5, 0x43, 0xb7, 0xf5, 0x5f, 0xe3, 0x7d, 0xec, 0xda, 0x8c, 0x72, 0x7c, 0x1c, 0x2e, 0x97, 0x31, 0xd4, 0xcb, 0xb2, 0x4a, 0x8d, 0xd0, 0x4e, 0xb3, 0xd6, 0xa5, 0x03, 0x38, 0xa0, 0x83, 0xf7, 0xf3, 0xe7, 0x86, 0xa5, 0x06, 0x95, 0x03, 0xdd, 0x90, 0xa3, 0x1b, 0x0c, 0xd9, 0x81, 0x90, 0xbe, 0xd0, 0xb8, 0xd8, 0x61, 0xb8, 0xce, 0x70, 0x4c, 0x1e, 0x69, 0x73, 0x00, 0x0e, 0xb8, 0x6b, 0xad, 0x86, 0x0f, 0x67, 0xf8, 0x2b, 0xd1, 0x4e, 0xfb, 0x3b, 0x93, 0x72, 0x8d, 0xc3, 0x7e, 0x68, 0xc4, 0x12, 0xf5, 0x18, 0xb9, 0x6d, 0x78, 0x10, 0x8b, 0x04, 0xc9, 0x1e, 0xa7, 0x25, 0x4d, 0x1d, 0x46, 0xb0, 0xb4, 0x0f, 0x37, 0xcb, 0xdd, 0x6c, 0xde, 0xd6, 0xf3, 0xba, 0x7d, 0xa2, 0xdd, 0x5e, 0xb2, 0xdd, 0xd5, 0xb2, 0x41, 0xd1, 0x56, 0x57, 0x14, 0x4f, 0x3c, 0xcd, 0x80, 0xe5, 0x27, 0x40, 0xca, 0x57, 0x20, 0xa5, 0xea, 0x4d, 0x7f, 0x06, 0x8e, 0x4a, 0x0b, 0x1a, 0x62, 0xdd, 0x64, 0x19, 0x8f, 0x1b, 0x9e, 0xce, 0x81, 0x4c, 0x2f, 0xee, 0xee, 0xe5, 0x0b, 0xa8, 0x14, 0xb7, 0x0d, 0x7d, 0x42, 0x65, 0x99, 0x52, 0x99, 0x1b, 0x80, 0xc4, 0x14, 0x7d, 0x23, 0xbb, 0xc6, 0xde, 0xdc, 0x42, 0x63, 0xb3, 0x99, 0x96, 0x02, 0x47, 0xca, 0x7c, 0x21, 0xb0, 0x7e, 0xd8, 0xea, 0x01, 0xc8, 0x7c, 0xb5, 0xc1, 0x68, 0x3e, 0xcd, 0x9c, 0xa7, 0x4d, 0x77, 0x59, 0x83, 0xc5, 0x30, 0x0c, 0x0c, 0x80, 0x37, 0x8d, 0x0e, 0x30, 0x4b, 0x28, 0xf0, 0xaa, 0xb6, 0x96, 0xdc, 0x85, 0x8a, 0x2c, 0x21, 0xe4, 0x2b, 0x53, 0xd5, 0x90, 0x0d, 0x38, 0xbe, 0x4a, 0xbf, 0xc5, 0x73, 0x5f, 0x29, 0xcf, 0xbe, 0x7c, 0x12, 0x91, 0x45, 0xc4, 0xe5, 0x59, 0x69, 0x20, 0xb4, 0x81, 0x6f, 0xd6, 0x7d, 0xa1, 0xdd, 0x5e, 0xac, 0x03, 0x27, 0x71, 0xe2, 0x57, 0x8b, 0x62, 0xf5, 0xa8, 0x3a, 0xb1, 0x38, 0x8f, 0xb8, 0xde, 0xfc, 0xa7, 0x85, 0x7b, 0x56, 0x40, 0xfd, 0x85, 0x23, 0x58, 0x7d, 0xf4, 0x4a, 0xc7, 0xc7, 0x91, 0x41, 0xb9, 0xa8, 0x08, 0xd3, 0x61, 0xd8, 0x3e, 0x20, 0xec, 0x21, 0xe4, 0xe5, 0xb4, 0xc3, 0x4d, 0xfd, 0xb7, 0x18, 0x7c, 0x28, 0x47, 0x74, 0x82, 0x0c, 0x03, 0x4f, 0x07, 0x79, 0x05, 0xa6, 0x26, 0xf1, 0x5d, 0x9e, 0x7e, 0x68, 0xbe, 0x6b, 0x85, 0x48, 0x78, 0x70, 0x20, 0xb8, 0xa6, 0xa7, 0x71, 0x1e, 0xa9, 0x44, 0xf0, 0xe2, 0xd5, 0x95, 0xbe, 0x76, 0x69, 0x2d, 0x36, 0x93, 0xc5, 0x41, 0xc4, 0xc5, 0xd7, 0x52, 0xfa, 0x29, 0xd7, 0x0c, 0xe0, 0x75, 0x34, 0x6f, 0x8c, 0x3a, 0xce, 0x2c, 0xf3, 0x66, 0x65, 0x52, 0xff, 0x0d, 0x51, 0x29, 0xe2, 0x69, 0x74, 0x5e, 0xa9, 0x1f, 0x6e, 0x61, 0x14, 0xc3, 0x0f, 0x0c, 0xa5, 0x9f, 0x12, 0x85, 0xf7, 0xb0, 0x08, 0x65, 0x51, 0xf2, 0x92, 0x1a, 0x7b, 0xde, 0xd3, 0x8a, 0xd0, 0x30, 0x25, 0xf8, 0x95, 0xed, 0x0b, 0x2c, 0x89, 0xa5, 0x68, 0xce, 0xbd, 0xf5, 0xee, 0x14, 0xa6, 0x51, 0xd8, 0x9d, 0x71, 0x00, 0xdc, 0x9c, 0x96, 0x68, 0x5b, 0x38, 0xb0, 0x8c, 0xdc, 0x33, 0x8c, 0xd3, 0xb8, 0xca, 0x80, 0x0b, 0x16, 0xdd, 0xfe, 0xad, 0x1a, 0x50, 0x68, 0x63, 0x5a, 0xb1, 0x26, 0xc7, 0x92, 0x1b, 0xf7, 0x6e, 0x98, 0x5a, 0x84, 0x25, 0x92, 0x4f, 0x3b, 0x7a, 0x66, 0x96, 0x5a, 0x7f, 0x72, 0x67, 0x4a, 0xca, 0x7e, 0xba, 0x2f, 0xc0, 0xee, 0xaf, 0xbd, 0x14, 0x3c, 0x2c, 0x4d, 0x8a, 0xa6, 0xc8, 0x30, 0x01, 0x24, 0xe8, 0x43, 0xb0, 0x9d, 0x27, 0xc3, 0xb0, 0x5a, 0xfc, 0x63, 0xba, 0xbb, 0x97, 0x9c, 0x33, 0x29, 0x0b, 0x45, 0x65, 0x4b, 0xb2, 0x63, 0x10, 0x7d, 0xcd, 0x42, 0x21, 0x7e, 0x6c, 0xc5, 0xc1, 0x68, 0x8e, 0xfa, 0x91, 0xe6, 0x88, 0xf1, 0x34, 0xa1, 0xab, 0xcf, 0x0f, 0xfb, 0x21, 0x1e, 0x4c, 0x00, 0x18, 0x67, 0x25, 0x99, 0x23, 0x03, 0x5f, 0x03, 0xdc, 0x2e, 0x14, 0x80, 0xcf, 0x5d, 0xb6, 0x4d, 0x93, 0xd2, 0x51, 0xd3, 0x3a, 0x6d, 0x10, 0x21, 0xec, 0xc5, 0x03, 0x9a, 0xce, 0x77, 0x1f, 0xeb, 0x28, 0xbe, 0x87, 0x41, 0xc8, 0x44, 0x0a, 0xb8, 0xa1, 0x38, 0xec, 0x16, 0xb8, 0xa1, 0xe9, 0xb9, 0x41, 0xf2, 0x77, 0xce, 0x04, 0xde, 0x4c, 0xc4, 0x06, 0x6d, 0x20, 0x00, 0x66, 0x50, 0xb4, 0xd3, 0x85, 0x72, 0x13, 0xa9, 0x69, 0xcf, 0x17, 0x83, 0x64, 0x89, 0x30, 0xa7, 0xf0, 0x38, 0x61, 0x95, 0xde, 0x82, 0x8b, 0x3e, 0xb0, 0xed, 0xee, 0x71, 0x43, 0xf0, 0xed, 0x96, 0xb1, 0x50, 0x11, 0x9e, 0x75, 0xaa, 0x51, 0x3a, 0xd0, 0x4b, 0x91, 0x4b, 0x6c, 0x48, 0x68, 0x9a, 0x40, 0xcc, 0x26, 0xca, 0xb3, 0xac, 0x16, 0x8b, 0x04, 0x41, 0x00, 0x10, 0xe9, 0x76, 0xf2, 0xc2, 0x76, 0x20, 0x40, 0x36, 0x41, 0x8e, 0xca, 0x5c, 0xc4, 0x61, 0x7d, 0xfa, 0x02, 0x9e, 0x1d, 0x59, 0x6e, 0x02, 0x41, 0x3f, 0x08, 0x96, 0x9f, 0x1c, 0xc9, 0x83, 0x89, 0x88, 0x41, 0x26, 0xb8, 0xed, 0x7f, 0x67, 0x49, 0x81, 0x31, 0x47, 0x05, 0x78, 0x0c, 0xb9, 0xe5, 0x77, 0x6e, 0xb3, 0xd5, 0x4b, 0x42, 0x84, 0xb9, 0xdb, 0x25, 0x68, 0xae, 0x5b, 0xc6, 0x5a, 0x92, 0xc3, 0x93, 0x29, 0xc6, 0x80, 0x92, 0xce, 0x32, 0x69, 0x8c, 0xfd, 0x8a, 0xf4, 0x71, 0xfa, 0xd0, 0xaa, 0xf8, 0xae, 0x1b, 0xd8, 0x86, 0xfa, 0x96, 0x88, 0x51, 0x4b, 0xcb, 0xaf, 0xc5, 0x6f, 0x22, 0xa8, 0x27, 0xa7, 0xa4, 0xe1, 0x78, 0xfd, 0x05, 0xd5, 0x9c, 0xd7, 0xe2, 0x3a, 0xbb, 0xcd, 0x47, 0x7b, 0xe8, 0xb8, 0x74, 0x68, 0x00, 0x0b, 0xe1, 0x2d, 0xd5, 0x67, 0x7f, 0x80, 0x8c, 0x69, 0x41, 0x1f, 0x44, 0xc7, 0xdb, 0x7a, 0xf9, 0x9b, 0xca, 0xac, 0xa7, 0xfe, 0x94, 0xb0, 0xb2, 0xd9, 0x51, 0xd2, 0x85, 0xf8, 0x6a, 0x63, 0x79, 0x60, 0xa1, 0xb1, 0xf9, 0xe3, 0x51, 0x37, 0xe5, 0xf1, 0xf7, 0x10, 0x33, 0xb1, 0xf2, 0xb2, 0xdc, 0x50, 0x87, 0xd8, 0xf6, 0x9a, 0x28, 0xc0, 0x1d, 0xc7, 0xf6, 0x97, 0x18, 0x97, 0x84, 0x32, 0xba, 0xa1, 0xde, 0xfe, 0x05, 0xe7, 0xca, 0x3a, 0x96, 0xaf, 0x4d, 0x63, 0x3d, 0x8e, 0x71, 0xf0, 0xeb, 0xc6, 0x46, 0x40, 0xd1, 0xd2, 0x27, 0xd1, 0xc6, 0x3e, 0x3e, 0xb2, 0xe9, 0xbc, 0x4b, 0x3b, 0x88, 0x75, 0xa0, 0xfb, 0x41, 0x9d, 0x70, 0xf2, 0x67, 0x4a, 0x4a, 0x00, 0xa8, 0x86, 0xe1, 0x9e, 0xec, 0xa2, 0x0e, 0xcc, 0x7f, 0xce, 0x18, 0x4a, 0x73, 0xe7, 0x32, 0x0b, 0x40, 0x90, 0x45, 0xe7, 0xae, 0x84, 0xf0, 0x90, 0xf5, 0x2b, 0xce, 0xc7, 0x22, 0x6b, 0xf7, 0xd0, 0xbc, 0xc0, 0xc9, 0x23, 0xa8, 0x8f, 0xe8, 0x64, 0x4a, 0xb7, 0x83, 0x95, 0xed, 0x6a, 0xd9, 0x8b, 0x65, 0x3b, 0xfc, 0x9e, 0xf2, 0x77, 0xd5, 0xa5, 0x68, 0xb9, 0x69, 0x22, 0x8d, 0xb9, 0x5a, 0xb9, 0xc3, 0x65, 0xb1, 0xe7, 0xe7, 0x33, 0xda, 0xf0, 0x78, 0xb5, 0xf0, 0x19, 0xfc, 0x6e, 0x3c, 0x18, 0x9f, 0xe4, 0xf8, 0xc9, 0x1e, 0xf6, 0x58, 0x22, 0xe3, 0x70, 0xcb, 0x69, 0x72, 0xdd, 0x7e, 0xa4, 0x03, 0x9c, 0x21, 0x52, 0x70, 0x36, 0xef, 0x58, 0x52, 0xef, 0xe8, 0x3e, 0x67, 0x9b, 0x61, 0x9b, 0x38, 0xb3, 0xbf, 0xce, 0xf8, 0xa8, 0x80, 0xef, 0xae, 0x77, 0x7b, 0x06, 0x97, 0x7e, 0x68, 0x7a, 0xc5, 0x8e, 0xa2, 0xcc, 0x0d, 0x41, 0x2c, 0x84, 0x20, 0x8e, 0xf2, 0x6c, 0xf8, 0x9a, 0x52, 0xfd, 0x76, 0xd1, 0xdb, 0x17, 0x49, 0x36, 0x55, 0xf5, 0x11, 0xf7, 0x01, 0x5f, 0xc4, 0x45, 0x22, 0x21, 0x51, 0x62, 0xbb, 0xbd, 0x84, 0xfc, 0x9b, 0x5d, 0x2a, 0xb9, 0x97, 0x0b, 0x75, 0x13, 0x17, 0x24, 0xa2, 0x66, 0xd4, 0x0a, 0xd8, 0x47, 0xdf, 0x1a, 0x54, 0x18, 0xe6, 0xde, 0xc3, 0xd9, 0xb3, 0x83, 0xef, 0x41, 0xf5, 0x8d, 0x9e, 0x0e, 0x43, 0xc9, 0xb7, 0x99, 0x5e, 0x83, 0xa7, 0xad, 0xb6, 0xfa, 0x03, 0x99, 0x30, 0x11, 0x6f, 0x84, 0x27, 0x47, 0xbe, 0x01, 0xb1, 0xe9, 0x5b, 0xe4, 0x23, 0x87, 0xe7, 0x53, 0xd7, 0xa4, 0x23, 0x20, 0x2c, 0xb1, 0x11, 0x56, 0xcf, 0x3d, 0x56, 0x11, 0x39, 0x66, 0xe3, 0x93, 0x79, 0x93, 0xd4, 0x95, 0x34, 0x65, 0x98, 0xdb, 0xea, 0xea, 0x53, 0x0b, 0x7a, 0x14, 0x80, 0xbf, 0xe9, 0x6a, 0xdb, 0xd9, 0x5f, 0xfe, 0x7e, 0x17, 0x72, 0x9f, 0x4a, 0xe7, 0xa7, 0x4f, 0x88, 0x7c, 0x36, 0xf8, 0xd0, 0x21, 0x0e, 0x5a, 0x2a, 0xcd, 0x19, 0x48, 0x74, 0xf8, 0xc1, 0x14, 0x04, 0xae, 0xb3, 0x48, 0x8e, 0xe2, 0xe3, 0x96, 0x47, 0x04, 0xd0, 0x12, 0x4a, 0xd6, 0x09, 0x9f, 0x3b, 0x7b, 0xf0, 0xa7, 0x2b, 0xd0, 0xbe, 0x10, 0xbc, 0x00, 0xc7, 0x6b, 0x86, 0x53, 0x00, 0x6e, 0xb9, 0x47, 0xbe, 0xa4, 0x03, 0xe2, 0xc0, 0x63, 0xb4, 0x46, 0x70, 0xff, 0x20, 0x86, 0x66, 0x3d, 0x44, 0xb8, 0x2e, 0x0a, 0xad, 0x4c, 0x4b, 0x6d, 0x96, 0x9c, 0x7b, 0xbb, 0x51, 0xc3, 0x3d, 0x0a, 0xe8, 0xb3, 0x91, 0xe7, 0x03, 0x82, 0xff, 0x4c, 0x0c, 0x05, 0xda, 0xcc, 0x92, 0xa0, 0xc6, 0x11, 0xeb, 0x5c, 0x78, 0x88, 0x1e, 0x3a, 0xbd, 0x5b, 0x00, 0xc8, 0xbe, 0xa0, 0x9c, 0xf1, 0x82, 0xd0, 0xd8, 0x19, 0xb4, 0x7a, 0x56, 0x6a, 0xa7, 0x38, 0x99, 0x68, 0x97, 0xe3, 0x69, 0xcc, 0x32, 0x03, 0x78, 0x8f, 0x56, 0x89, 0x45, 0x45, 0x1d, 0xc1, 0x41, 0xac, 0x17, 0x82, 0x31, 0x85, 0xd6, 0xa8, 0xd3, 0xa2, 0xb0, 0xc3, 0xc4, 0x41, 0xc0, 0x11, 0xa1, 0x98, 0x2e, 0xaa, 0x6c, 0xb1, 0xb0, 0xfb, 0x32, 0x78, 0x51, 0x75, 0xeb, 0x13, 0x72, 0x86, 0xa2, 0x71, 0x0e, 0xc9, 0xd6, 0x26, 0x42, 0x7a, 0x1f, 0x76, 0x0c, 0x2c, 0x15, 0xaf, 0x53, 0xbe, 0x6d, 0xbd, 0x27, 0x8b, 0x65, 0xf8, 0x4b, 0xe1, 0x63, 0x40, 0xf0, 0xb5, 0xd8, 0x4c, 0xc4, 0x94, 0x6b, 0x3f, 0x2b, 0xdd, 0x54, 0x7c, 0xcc, 0x2e, 0x05, 0xbc, 0x50, 0x1c, 0x10, 0x5e, 0x66, 0x27, 0x45, 0xfe, 0x0b, 0xec, 0x1a, 0x48, 0x08, 0x9d, 0x51, 0x0e, 0xbc, 0xaf, 0xd4, 0x99, 0x1b, 0xd2, 0xe4, 0x3d, 0xf7, 0x26, 0x72, 0x30, 0x7f, 0xac, 0xcd, 0x9d, 0x05, 0xfb, 0x7e, 0xf3, 0x04, 0x34, 0x70, 0x83, 0x61, 0x37, 0x55, 0x4a, 0xf1, 0x17, 0x44, 0x0b, 0x3c, 0xcc, 0xa7, 0xa2, 0x80, 0x28, 0x54, 0x94, 0xf9, 0x0d, 0xfa, 0xea, 0x60, 0xdc, 0xbf, 0x40, 0xb2, 0x30, 0x27, 0x19, 0x32, 0xcd, 0x38, 0x75, 0xb1, 0xd3, 0xdc, 0xa6, 0x0d, 0x38, 0x86, 0x5f, 0xf8, 0x74, 0x18, 0x0e, 0xfa, 0x7e, 0x05, 0x6b, 0xb9, 0xf8, 0xb2, 0x51, 0x79, 0xa6, 0x23, 0xce, 0xdf, 0x25, 0xd3, 0x76, 0xfa, 0xda, 0xe3, 0xfc, 0x84, 0x28, 0x77, 0x03, 0x64, 0xe6, 0x5e, 0x31, 0x78, 0x10, 0xf1, 0x85, 0x92, 0xbc, 0x3d, 0xeb, 0xc0, 0x50, 0x64, 0x0e, 0xd1, 0xf3, 0x40, 0x6e, 0x14, 0x41, 0x4a, 0xb2, 0x63, 0x43, 0xba, 0x3f, 0x60, 0x9e, 0xf0, 0x09, 0xff, 0x0a, 0x13, 0xa9, 0x45, 0x06, 0xf8, 0xb1, 0x4f, 0xcb, 0x45, 0x3c, 0x95, 0x7e, 0xd6, 0xc9, 0x70, 0xa9, 0x5f, 0x49, 0xda, 0xec, 0x53, 0x76, 0x75, 0xf0, 0x05, 0x67, 0xd0, 0x9d, 0x0e, 0x61, 0xe5, 0x8d, 0xee, 0xf1, 0xe6, 0xc0, 0xf6, 0x37, 0x39, 0x91, 0x65, 0x85, 0xc1, 0xe8, 0xd1, 0x29, 0x5f, 0xb2, 0xc8, 0x86, 0xb8, 0x8e, 0xb8, 0x6a, 0x39, 0xc9, 0x0c, 0x9b, 0x59, 0x8d, 0x98, 0xb3, 0x1e, 0x55, 0x37, 0x2e, 0xe3, 0xa4, 0xb2, 0xc2, 0x58, 0xf7, 0xe4, 0xef, 0xca, 0xf8, 0x1c, 0xd6, 0xa5, 0xf4, 0xc3, 0x4e, 0x37, 0x8f, 0x3f, 0x35, 0xb6, 0xb7, 0x16, 0x04, 0x85, 0xd6, 0x57, 0xa6, 0xb3, 0x4c, 0x36, 0x8b, 0xc5, 0x1c, 0xf6, 0xf8, 0xb5, 0xe5, 0x0c, 0xa1, 0x3a, 0x15, 0x81, 0x79, 0x4a, 0x59, 0x98, 0xc9, 0xdd, 0x58, 0xb1, 0x7f, 0xf5, 0xa0, 0x6d, 0xc9, 0xdb, 0xe0, 0x13, 0xe3, 0xab, 0x59, 0x32, 0x2e, 0x12, 0x8f, 0x88, 0x81, 0x57, 0x44, 0x23, 0xc3, 0x98, 0xa6, 0xc6, 0xba, 0x57, 0xc8, 0x8e, 0x1e, 0x35, 0x4f, 0xd5, 0xf2, 0xfc, 0x6e, 0x57, 0x14, 0xe3, 0x14, 0x93, 0x12, 0x0e, 0x63, 0x75, 0x3f, 0x55, 0x65, 0x31, 0x06, 0x46, 0xfa, 0x72, 0x7f, 0x6d, 0x15, 0xb4, 0x40, 0xd3, 0x28, 0xee, 0x76, 0xc4, 0xdd, 0x75, 0x34, 0xd5, 0x07, 0x1d, 0x0a, 0x26, 0xd8, 0xa1, 0xda, 0xe5, 0x54, 0x45, 0xe7, 0x13, 0x05, 0xb9, 0x2f, 0x8b, 0xf1, 0x41, 0xfb, 0x40, 0xc9, 0x13, 0xb4, 0xc6, 0x63, 0x00, 0xf8, 0x14, 0x6a, 0x57, 0xed, 0x88, 0x55, 0x07, 0xd5, 0x2b, 0x95, 0x03, 0xe3, 0x37, 0x13, 0xeb, 0x4d, 0xd6, 0xd9, 0xe8, 0xa3, 0x2d, 0x0f, 0xd8, 0x5f, 0x99, 0x2a, 0xab, 0xbd, 0x38, 0x60, 0x0c, 0xcd, 0xac, 0x5f, 0x44, 0xc6, 0x1b, 0x3e, 0x5c, 0x9d, 0x7a, 0xb4, 0x82, 0xd6, 0x0c, 0x88, 0xaf, 0x9b, 0x25, 0x48, 0x86, 0x0b, 0x34, 0x3e, 0x7e, 0xd4, 0x00, 0xa0, 0x43, 0x04, 0x32, 0x07, 0x5a, 0x1c, 0x14, 0x22, 0x04, 0x66, 0x98, 0xac, 0x66, 0x89, 0x9c, 0x9b, 0xe6, 0x5b, 0x6c, 0x9b, 0xd8, 0xf6, 0x89, 0xba, 0x5a, 0x0e, 0xa9, 0x65, 0x7c, 0x82, 0xfe, 0x93, 0xa5, 0x30, 0xbb, 0x40, 0x32, 0x0e, 0xd5, 0x1d, 0x5f, 0x77, 0x06, 0x86, 0x6b, 0xc2, 0x18, 0xb4, 0xf7, 0x19, 0x60, 0x34, 0xb0, 0x88, 0x89, 0x97, 0x2d, 0x55, 0x93, 0x6c, 0x1a, 0x90, 0x1a, 0x6b, 0x97, 0xea, 0xdc, 0xf3, 0xdb, 0xcb, 0x76, 0xb7, 0x1d, 0x9e, 0x6e, 0xb4, 0xb4, 0x70, 0x76, 0x66, 0x7d, 0xb9, 0xef, 0x3b, 0x7d, 0x79, 0xad, 0x48, 0xc7, 0x87, 0xfa, 0x3a, 0xa0, 0x26, 0xdd, 0x90, 0xe2, 0xda, 0x9c, 0x08, 0x9e, 0x7a, 0x7f, 0x57, 0x05, 0x85, 0xd7, 0x1d, 0x89, 0xb9, 0x3f, 0x18, 0x3f, 0xe2, 0x22, 0x98, 0x88, 0xf1, 0x7d, 0x33, 0xf0, 0x4d, 0xe6, 0xb9, 0x56, 0x6e, 0xce, 0x6b, 0x4e, 0xa7, 0x03, 0x67, 0xc3, 0x43, 0x78, 0x67, 0xe1, 0xd4, 0x49, 0xab, 0x31, 0xc8, 0xfa, 0x34, 0x06, 0x3d, 0x00, 0x33, 0x19, 0x17, 0x82, 0xc1, 0x70, 0x4f, 0x60, 0xd0, 0x84, 0x8d, 0x75, 0x62, 0xa2, 0xfa, 0x19, 0xf9, 0x92, 0x4f, 0xea, 0x4e, 0x77, 0x33, 0xcd, 0x45, 0xf6, 0xc3, 0x2f, 0x21, 0x9a, 0x72, 0x91, 0xf4, 0x77, 0x13, 0x43, 0x5a, 0x0e, 0x34, 0x6f, 0x67, 0x71, 0xae, 0x5a, 0xde, 0xa8, 0x7a, 0xe7, 0xa4, 0x52, 0xc6, 0x5d, 0x74, 0x8f, 0x48, 0x69, 0xd3, 0x1e, 0xd3, 0x67, 0x47, 0xc3, 0x28, 0xdd, 0xc4, 0xec, 0x0e, 0x48, 0x67, 0x93, 0xa5, 0x1c, 0x67, 0x66, 0xf7, 0x06, 0x48, 0x26, 0xd0, 0x74, 0x51, 0x4d, 0xd0, 0x57, 0x41, 0xf3, 0xbe, 0x27, 0x3e, 0xf2, 0x1f, 0x28, 0x0e, 0x49, 0x07, 0xed, 0x89, 0xbe, 0x30, 0x1a, 0x4e, 0xc8, 0x49, 0x6e, 0xb6, 0xab, 0x90, 0x00, 0x06, 0xe5, 0xa3, 0xc8, 0xe9, 0xc9, 0x93, 0x62, 0x1d, 0x6a, 0x3b, 0x0f, 0x6c, 0xba, 0xd0, 0xfd, 0xde, 0xf3, 0xb9, 0xc8, 0x2d, 0x36, 0xa0, 0x40, 0x79, 0x72, 0xc9, 0x6d, 0x3d, 0x88, 0xa2, 0xd0, 0x82, 0xad, 0x9c, 0xec, 0x52, 0x0f, 0x3a, 0x05, 0x70, 0xbb, 0x67, 0x28, 0x46, 0xbe, 0x0d, 0x6b, 0x1f, 0x8a, 0xe3, 0x76, 0x96, 0x9c, 0x87, 0x42, 0x4e, 0x5c, 0xcc, 0x21, 0xe4, 0x45, 0x55, 0xff, 0x22, 0x45, 0x63, 0xe7, 0x76, 0x67, 0xeb, 0xc9, 0xa2, 0xaf, 0xec, 0x7a, 0xb4, 0x45, 0xff, 0xfc, 0x39, 0xd7, 0x30, 0x00, 0xae, 0x38, 0x0c, 0xa9, 0x37, 0x4d, 0xfb, 0x93, 0x94, 0x29, 0xd0, 0x14, 0x50, 0x77, 0x9f, 0xc1, 0x3b, 0x18, 0xce, 0x34, 0x1b, 0x0e, 0x6f, 0x0d, 0x9f, 0x99, 0xcd, 0x37, 0x94, 0x9f, 0x45, 0x6d, 0x5b, 0x51, 0x58, 0xfc, 0x9b, 0x0c, 0xfe, 0xca, 0x33, 0x7d, 0x3c, 0x97, 0x73, 0x09, 0xf8, 0x83, 0x8b, 0x6c, 0x0d, 0xd0, 0x43, 0xa0, 0x9b, 0xea, 0xed, 0x00, 0xa0, 0xa4, 0x98, 0xad, 0xcd, 0xc5, 0x87, 0x31, 0x92, 0xc3, 0xe2, 0x62, 0x7c, 0xce, 0xaa, 0x89, 0xc0, 0x10, 0xf2, 0xc4, 0x18, 0x34, 0x4d, 0xa9, 0xcd, 0x25, 0x83, 0x2c, 0x15, 0x18, 0x88, 0xc3, 0xa0, 0xcc, 0xae, 0xc8, 0x6e, 0x10, 0x19, 0x1e, 0xe3, 0x87, 0x73, 0x17, 0x1d, 0xa8, 0xe2, 0x95, 0x85, 0x08, 0x37, 0x70, 0xa4, 0xdc, 0x69, 0x18, 0x39, 0xb9, 0x41, 0x7c, 0x88, 0x9f, 0x56, 0x2a, 0xf4, 0x36, 0x3c, 0xb7, 0xd0, 0x57, 0xf9, 0x61, 0x73, 0xce, 0xb8, 0xf3, 0x8a, 0x5f, 0xc2, 0xe9, 0xb3, 0x07, 0xa9, 0xd5, 0x47, 0x83, 0xc6, 0x01, 0x76, 0x17, 0xe6, 0x56, 0x9a, 0x88, 0x41, 0x7c, 0xc5, 0x6a, 0xac, 0x43, 0x9c, 0xa2, 0x0f, 0x42, 0x69, 0x23, 0x18, 0xbe, 0x6b, 0xfb, 0x31, 0xcd, 0x71, 0x93, 0xb0, 0xba, 0xa7, 0x32, 0x4e, 0xac, 0xaf, 0xc4, 0xdb, 0x83, 0xf3, 0xda, 0x30, 0x03, 0x3a, 0xf1, 0x64, 0x34, 0x7a, 0xf7, 0x43, 0x08, 0xed, 0x0b, 0xfb, 0x3f, 0x67, 0x85, 0x19, 0x88, 0xe7, 0x36, 0xb4, 0xe9, 0x6c, 0xf1, 0xe8, 0x60, 0x0a, 0x49, 0x87, 0xcb, 0x3c, 0x9d, 0x0a, 0x05, 0x7c, 0x52, 0xce, 0x52, 0x11, 0x60, 0x7d, 0xfd, 0x29, 0x10, 0xc9, 0x3f, 0x27, 0x04, 0x61, 0x63, 0x3e, 0x77, 0x1d, 0x28, 0x3f, 0xc6, 0x7c, 0x67, 0xaf, 0x2f, 0x51, 0xf5, 0x1d, 0xd9, 0xb9, 0xcb, 0xb2, 0x15, 0x50, 0x64, 0x0a, 0xe4, 0xa5, 0x67, 0x42, 0xb9, 0xeb, 0x86, 0x53, 0x80, 0xf1, 0xa6, 0x9e, 0xde, 0x54, 0x40, 0xc8, 0xbb, 0xf3, 0x07, 0xc7, 0xfe, 0xa3, 0xcb, 0x3d, 0x97, 0x24, 0x9d, 0x05, 0xc3, 0x54, 0x34, 0x0c, 0x8b, 0xa3, 0x8f, 0x63, 0x8e, 0xc7, 0xdc, 0x92, 0x01, 0xb1, 0x99, 0x2e, 0xf4, 0xbf, 0xf9, 0xae, 0xd7, 0x33, 0x89, 0x7a, 0x3c, 0xe4, 0x13, 0x45, 0xdf, 0x33, 0xc2, 0x9d, 0xe3, 0x41, 0x88, 0xc0, 0x5e, 0x5f, 0xbd, 0xb2, 0x18, 0xc6, 0x09, 0x8c, 0x90, 0x89, 0x83, 0x17, 0x40, 0xc7, 0x1a, 0x99, 0x22, 0x25, 0x35, 0xef, 0x73, 0x7b, 0x96, 0xdc, 0xb7, 0xce, 0x84, 0xa1, 0xfd, 0x7f, 0x29, 0xce, 0x64, 0xc1, 0x39, 0x57, 0xde, 0x50, 0xd4, 0xea, 0x34, 0x61, 0xae, 0x80, 0x4b, 0xd4, 0x6d, 0x33, 0xa5, 0xb1, 0x52, 0x4f, 0x2a, 0xd2, 0x1c, 0xab, 0x29, 0xdd, 0x29, 0x3a, 0x9a, 0x76, 0xdf, 0xdd, 0xa6, 0xb2, 0x4a, 0x7b, 0x69, 0xce, 0x06, 0x54, 0xf6, 0x21, 0x60, 0x92, 0x9b, 0x4f, 0xb8, 0x21, 0x67, 0xc0, 0x2a, 0xc1, 0xea, 0x50, 0x6d, 0x5a, 0x3c, 0x48, 0xfa, 0x8f, 0x41, 0x8e, 0x71, 0x95, 0x2a, 0x18, 0x39, 0x46, 0x3f, 0xa6, 0x67, 0x71, 0xdc, 0xb1, 0xe2, 0x75, 0xba, 0x9e, 0xc4, 0x0e, 0x70, 0x38, 0x03, 0x6e, 0x3a, 0x5d, 0x50, 0x90, 0xf8, 0xf7, 0x3f, 0xc9, 0x7a, 0x2f, 0xa9, 0xa0, 0xfa, 0xdd, 0x4f, 0xdf, 0xea, 0x42, 0xbf, 0xea, 0xf1, 0xf9, 0x7c, 0x50, 0x30, 0x2b, 0x59, 0xa0, 0xc9, 0x03, 0x26, 0x7e, 0xa2, 0x61, 0x8e, 0xf5, 0x66, 0xd3, 0x40, 0x0f, 0xcd, 0xc1, 0x4d, 0xa3, 0x1e, 0xe7, 0xd1, 0x6f, 0xf2, 0x08, 0xd6, 0x66, 0x3a, 0xe1, 0x75, 0x4b, 0x83, 0x5d, 0x3e, 0x7f, 0x79, 0x07, 0xdb, 0x18, 0xaa, 0xc4, 0xef, 0x32, 0x8d, 0xc2, 0x44, 0x8a, 0xc3, 0xac, 0x26, 0x49, 0x9c, 0x20, 0x0a, 0x1d, 0xdd, 0x62, 0x74, 0x8e, 0xc1, 0x52, 0x17, 0x90, 0x3d, 0x9b, 0x3d, 0x54, 0x88, 0x2e, 0x69, 0x64, 0xdb, 0xef, 0x3b, 0xef, 0x76, 0xad, 0x95, 0x61, 0xe3, 0x58, 0xfc, 0x37, 0x7e, 0x6e, 0x41, 0x12, 0x35, 0xb7, 0x60, 0x0a, 0x8d, 0x32, 0xa8, 0x44, 0xe5, 0x4f, 0x1c, 0xc7, 0xff, 0x5e, 0x1a, 0x8b, 0xbc, 0x48, 0x3a, 0xd3, 0x27, 0x7d, 0x79, 0xbd, 0xb5, 0x2d, 0x97, 0x18, 0xcc, 0xbb, 0xbd, 0x75, 0x81, 0x6f, 0x63, 0x81, 0xa6, 0x6b, 0x71, 0x92, 0x04, 0xe0, 0xa4, 0x7f, 0xe5, 0x81, 0x34, 0xb5, 0xd6, 0x38, 0xb4, 0x87, 0xaa, 0x18, 0x39, 0xc6, 0xc2, 0x94, 0xbe, 0x92, 0x8c, 0xee, 0xc7, 0x6f, 0x4a, 0xf2, 0x45, 0x9c, 0x15, 0xe3, 0xba, 0xa0, 0x21, 0xb6, 0x9d, 0x25, 0x42, 0x7e, 0x00, 0x09, 0xaf, 0x28, 0x70, 0xb3, 0x07, 0x68, 0x1d, 0xa3, 0x91, 0xf3, 0x3b, 0x4d, 0xc8, 0xef, 0xa7, 0x28, 0x17, 0xa7, 0xce, 0x02, 0xe1, 0x84, 0xcb, 0x96, 0xc4, 0x39, 0xcf, 0x60, 0x1f, 0x3d, 0xc6, 0xb0, 0xd1, 0x7e, 0x37, 0xfe, 0x44, 0x54, 0x6c, 0x7d, 0xab, 0xb3, 0xd4, 0xf2, 0x87, 0xa6, 0xa5, 0xc7, 0x70, 0xf8, 0xc5, 0x5b, 0x12, 0x34, 0xeb, 0x9d, 0x76, 0xd1, 0x02, 0xd9, 0x83, 0xa6, 0xce, 0xd2, 0xc4, 0xa4, 0xd1, 0x10, 0x6b, 0xc3, 0x70, 0x7b, 0x96, 0x3d, 0x52, 0x29, 0xd2, 0xfb, 0x09, 0x75, 0xdd, 0x4c, 0xf4, 0x51, 0xb1, 0xdd, 0x63, 0xdd, 0xbd, 0xe6, 0xfd, 0x38, 0x76, 0xa1, 0x5f, 0x95, 0x0e, 0x00, 0x06, 0x92, 0x83, 0x9f, 0x6f, 0xc6, 0xdc, 0xf8, 0x7c, 0x99, 0xb0, 0xd6, 0x1a, 0x59, 0xe7, 0x0c, 0x21, 0x8a, 0xc4, 0x66, 0x7c, 0x7d, 0x24, 0xe0, 0x89, 0x24, 0x00, 0x16, 0xc2, 0x24, 0x39, 0xfc, 0x9e, 0x2c, 0x95, 0xcf, 0xb2, 0x85, 0x04, 0x4b, 0x1c, 0xeb, 0x29, 0x1f, 0x21, 0x9c, 0x15, 0x9e, 0x15, 0xae, 0x56, 0xb7, 0x7b, 0xa5, 0x30, 0x27, 0x6e, 0x45, 0x2a, 0xed, 0x40, 0xa5, 0xcd, 0xfe, 0x60, 0x85, 0xa8, 0x3b, 0x81, 0xe1, 0x97, 0xa0, 0xf8, 0xc7, 0x45, 0xbe, 0x66, 0x65, 0xf0, 0x6b, 0x98, 0x66, 0x6c, 0xb8, 0xab, 0x7f, 0x6b, 0x23, 0x74, 0x44, 0xfb, 0x0e, 0x1f, 0x41, 0x50, 0x70, 0x15, 0x46, 0xc4, 0xcb, 0x24, 0x02, 0x1c, 0x5e, 0xda, 0xd3, 0x0d, 0x9b, 0x31, 0xdd, 0xff, 0xdb, 0x72, 0x5a, 0x10, 0x51, 0x53, 0x30, 0x5c, 0x3c, 0x62, 0xc9, 0x7c, 0x61, 0xa7, 0x1f, 0x4c, 0xb9, 0x85, 0x16, 0xf1, 0x67, 0xe2, 0x0f, 0x1b, 0xec, 0x88, 0xba, 0x88, 0x9e, 0xca, 0x2b, 0xca, 0x57, 0x6a, 0x31, 0x49, 0x6a, 0xba, 0xe3, 0x8b, 0xdb, 0x02, 0x7b, 0xb3, 0xcf, 0x22, 0x68, 0x48, 0x41, 0x78, 0x9e, 0x38, 0xf7, 0x04, 0x31, 0x1d, 0xb4, 0xca, 0x22, 0xbe, 0xb0, 0x78, 0x79, 0xd9, 0x45, 0x49, 0x93, 0x20, 0xeb, 0x29, 0xbe, 0x81, 0x66, 0x1a, 0x03, 0xaa, 0x3e, 0xd6, 0x43, 0xcd, 0x70, 0xb6, 0x86, 0xa0, 0x63, 0xd2, 0x8f, 0xa9, 0x1d, 0x6a, 0xb4, 0xb8, 0xb7, 0x85, 0xec, 0xb5, 0x0e, 0xd7, 0x2a, 0x9b, 0xbc, 0xe8, 0xe9, 0xc5, 0x47, 0x73, 0x08, 0x69, 0x97, 0x0c, 0xd9, 0x62, 0xae, 0x06, 0x75, 0x32, 0x93, 0x94, 0x52, 0x47, 0x8f, 0x2e, 0x17, 0x7d, 0x9c, 0x37, 0xae, 0xe5, 0x1b, 0xdc, 0x9b, 0xc5, 0xc5, 0x3f, 0x8d, 0xdf, 0xe4, 0xd5, 0x33, 0xf6, 0xc3, 0x0c, 0x51, 0x8f, 0x63, 0x32, 0x13, 0xf5, 0x6f, 0x92, 0xa1, 0x7f, 0x72, 0xe0, 0xf3, 0x15, 0x48, 0xd7, 0xe7, 0xf1, 0xd3, 0x20, 0x91, 0xa3, 0xef, 0x76, 0xd2, 0x58, 0xa7, 0x08, 0x2c, 0x5b, 0xa9, 0x1e, 0xd4, 0xdc, 0xf7, 0x00, 0x09, 0xf1, 0xe0, 0x14, 0xa5, 0xda, 0x2f, 0x46, 0xf2, 0x89, 0xa2, 0xac, 0xbe, 0x62, 0x9d, 0x6a, 0xb2, 0x3f, 0x20, 0xd4, 0xdf, 0xb7, 0xf7, 0xd3, 0x9a, 0xa0, 0x30, 0x8a, 0x8a, 0xd2, 0xd2, 0x39, 0xff, 0x2e, 0xcc, 0x61, 0x85, 0xdf, 0x2c, 0x29, 0xba, 0xe0, 0x91, 0x00, 0x5c, 0xbe, 0xe3, 0x84, 0xa6, 0xa0, 0x41, 0xa2, 0xdd, 0x84, 0x3b, 0xff, 0x26, 0xcb, 0x42, 0x97, 0x9a, 0xf8, 0x5c, 0xa5, 0x9c, 0xb5, 0x1d, 0xc2, 0x6a, 0x17, 0xd2, 0x50, 0xf3, 0x22, 0xff, 0x19, 0xe9, 0x90, 0x0c, 0x34, 0x16, 0xce, 0x3b, 0x29, 0xf3, 0x48, 0xdd, 0x54, 0x77, 0xe6, 0xc6, 0x8f, 0x2d, 0xd6, 0xfe, 0x0b, 0x89, 0x8d, 0xb9, 0x7f, 0x7c, 0x08, 0x89, 0x85, 0x46, 0x58, 0xd3, 0x40, 0x8c, 0x5d, 0x80, 0x43, 0xaa, 0xd2, 0xf4, 0xae, 0x4a, 0x89, 0x44, 0x9a, 0x36, 0xf8, 0xa3, 0xb8, 0x6a, 0xf5, 0x1e, 0x34, 0x6e, 0xbe, 0x8a, 0xe0, 0xe2, 0x3c, 0xba, 0x8e, 0x5a, 0x89, 0xf5, 0xbd, 0x6d, 0xaf, 0xa6, 0x79, 0x09, 0xb3, 0x56, 0x7c, 0x09, 0xd2, 0xd8, 0x99, 0x0a, 0x0a, 0xc3, 0x5b, 0x7a, 0xdc, 0x26, 0xe9, 0xf1, 0x51, 0x76, 0x2c, 0xc5, 0x3b, 0xcb, 0x34, 0xd9, 0xbd, 0x4c, 0xd8, 0xb5, 0x0d, 0xe8, 0x9d, 0xdc, 0x79, 0x48, 0xda, 0x59, 0xa8, 0x01, 0x19, 0x9c, 0x23, 0x0d, 0xbf, 0x84, 0x13, 0x7c, 0xf0, 0xbd, 0x4d, 0x67, 0xad, 0x4c, 0x8b, 0x26, 0x3f, 0x68, 0xfc, 0xc2, 0xd9, 0x8c, 0x00, 0xad, 0x79, 0xca, 0x2c, 0xb1, 0x0f, 0x62, 0x95, 0x27, 0xe1, 0x93, 0x4b, 0x69, 0x2e, 0xb1, 0x23, 0x8a, 0x11, 0x78, 0xba, 0x44, 0xa9, 0xa0, 0xb6, 0x31, 0x77, 0xb1, 0x4f, 0x3e, 0x07, 0x19, 0x0f, 0x5e, 0xd3, 0x7c, 0xd5, 0x7b, 0x64, 0x4b, 0x20, 0xb2, 0xba, 0x98, 0x8a, 0xbf, 0xee, 0x29, 0x93, 0xb6, 0x16, 0xcb, 0xa0, 0xf5, 0x69, 0xe8, 0x44, 0x56, 0xa4, 0x5c, 0xbd, 0xa9, 0xac, 0x85, 0xc2, 0x61, 0x74, 0x99, 0x7c, 0x8d, 0x21, 0x3d, 0xd2, 0x0a, 0x6c, 0x53, 0xe9, 0xf7, 0x48, 0x13, 0xeb, 0x6a, 0xc5, 0x5d, 0x08, 0x61, 0x35, 0x4d, 0xbb, 0xfc, 0x8d, 0x11, 0x4f, 0xe9, 0x0e, 0xf7, 0xa1, 0x1f, 0x24, 0xca, 0x27, 0xcf, 0x8e, 0x5f, 0x31, 0x97, 0xbf, 0x6b, 0x6f, 0xfa, 0x84, 0x97, 0xb4, 0x0d, 0xe8, 0xd7, 0xf9, 0x72, 0x55, 0xf7, 0xa5, 0x8a, 0xfb, 0x77, 0x0c, 0xe7, 0x75, 0x98, 0x35, 0x00, 0xaa, 0xb7, 0xe0, 0x29, 0xf2, 0xda, 0xc7, 0xc2, 0x7b, 0x89, 0x25, 0xae, 0xea, 0xdf, 0x75, 0x07, 0x45, 0xe0, 0x7c, 0x0f, 0x10, 0x0d, 0x89, 0x6a, 0xb6, 0x36, 0xfc, 0x8b, 0x2b, 0x90, 0x05, 0x6d, 0xd0, 0x07, 0xae, 0x83, 0x97, 0xd5, 0x1c, 0xf1, 0x67, 0x54, 0x11, 0xfc, 0xc2, 0x10, 0xb6, 0xbf, 0xa5, 0x21, 0x98, 0x20, 0xaf, 0xb8, 0xf0, 0x03, 0x86, 0xf7, 0x27, 0xbe, 0x77, 0x06, 0x99, 0xcc, 0x5c, 0x63, 0x9a, 0xc5, 0xc3, 0x79, 0xb6, 0x8d, 0x4c, 0x75, 0x3d, 0xcc, 0x53, 0x55, 0x00, 0x9f, 0xcf, 0x41, 0x55, 0x8e, 0x7a, 0x1f, 0x61, 0xbd, 0x33, 0x62, 0x96, 0x66, 0xa0, 0x22, 0x7a, 0x86, 0x17, 0x72, 0xaa, 0xd7, 0xbf, 0xee, 0x1f, 0xff, 0xf2, 0x93, 0xb1, 0x07, 0xe6, 0xd4, 0xd9, 0x0e, 0x8d, 0xe9, 0xbb, 0x3f, 0xb9, 0x6b, 0x64, 0x00, 0x84, 0x1e, 0x50, 0x6c, 0xef, 0x0e, 0x2f, 0x04, 0xc9, 0xdd, 0xe8, 0xa1, 0xd3, 0x5b, 0xdf, 0xae, 0x21, 0x57, 0x74, 0x93, 0xc3, 0xb5, 0xcc, 0x74, 0xa5, 0xc1, 0xd3, 0x1c, 0xb4, 0xc3, 0x81, 0x34, 0x42, 0xd4, 0x5d, 0xb9, 0xac, 0xef, 0x40, 0xad, 0x3a, 0x4b, 0x5c, 0x0c, 0x46, 0xe8, 0x7c, 0x01, 0xa1, 0x68, 0x8d, 0x5a, 0x32, 0x21, 0x5e, 0x3a, 0xe0, 0x70, 0xa4, 0x0d, 0xb3, 0x50, 0x41, 0xc1, 0x35, 0x2b, 0xc6, 0x34, 0x1f, 0xf0, 0x36, 0xe8, 0x31, 0x65, 0x0d, 0xfe, 0x62, 0xbf, 0x80, 0x62, 0x39, 0x70, 0x07, 0x43, 0x7b, 0x40, 0x19, 0xc6, 0x06, 0x9f, 0x36, 0xfb, 0xfd, 0x39, 0x2b, 0x10, 0x25, 0xcc, 0x92, 0xc4, 0x8f, 0x36, 0x98, 0x1f, 0x78, 0xd3, 0x03, 0x60, 0x6d, 0x05, 0x73, 0x38, 0xb3, 0x14, 0xe7, 0x35, 0xe5, 0x39, 0x84, 0x81, 0xdf, 0xf5, 0x92, 0xcc, 0xdb, 0xa7, 0xc8, 0x87, 0xda, 0x5e, 0xc9, 0x53, 0x46, 0xec, 0xee, 0xb9, 0xd5, 0x3c, 0x46, 0x1b, 0xb0, 0xe5, 0xdb, 0xea, 0xd5, 0xfe, 0x37, 0x1a, 0xb9, 0x35, 0x27, 0xd3, 0x32, 0x1b, 0xbf, 0x6a, 0x95, 0xc2, 0x9e, 0x8f, 0x1b, 0x8a, 0x74, 0xc8, 0x8a, 0x38, 0xc1, 0x1e, 0x11, 0x48, 0xdf, 0x15, 0x73, 0x85, 0x42, 0xe2, 0x68, 0xd6, 0xff, 0xd9, 0x40, 0x5b, 0x8b, 0x25, 0xc9, 0xb8, 0xc5, 0xbb, 0x73, 0xb1, 0x37, 0x91, 0xb2, 0xf8, 0x99, 0x0a, 0xa4, 0x42, 0x97, 0xb5, 0xf4, 0xa0, 0xd5, 0x38, 0xfe, 0x0d, 0x2f, 0x87, 0x33, 0x43, 0x45, 0x5a, 0xbf, 0xd4, 0x37, 0xdd, 0x6a, 0x75, 0xad, 0xa9, 0xbc, 0x9d, 0x1b, 0xf3, 0x65, 0x4f, 0x43, 0x03, 0xdc, 0x33, 0xfb, 0xe8, 0x45, 0xec, 0x30, 0x6b, 0x98, 0xa6, 0x2b, 0x41, 0x00, 0xee, 0x13, 0x85, 0x81, 0xc7, 0xb3, 0x65, 0xde, 0xfa, 0x7e, 0x1b, 0xba, 0xad, 0xd0, 0x1f, 0xfd, 0x37, 0x77, 0x9a, 0x79, 0x33, 0x72, 0x1e, 0xce, 0xd3, 0xf8, 0x95, 0x8a, 0x78, 0xbd, 0x78, 0x95, 0x7f, 0x70, 0x42, 0xcd, 0x5d, 0x88, 0x23, 0xed, 0xee, 0x40, 0xf8, 0xb3, 0x0a, 0xe0, 0x7b, 0x42, 0x5a, 0x3f, 0xb7, 0xc5, 0x69, 0x86, 0xc0, 0x55, 0xfe, 0x36, 0xa0, 0x1d, 0xaa, 0x6d, 0x94, 0xbb, 0x9d, 0x65, 0x79, 0xea, 0xbd, 0x3d, 0x81, 0x5e, 0xfa, 0xfc, 0x2a, 0xf0, 0xdb, 0xd3, 0x71, 0xfb, 0x5d, 0xa2, 0x42, 0x06, 0xfe, 0xbe, 0x34, 0xa3, 0x15, 0xf2, 0x73, 0x96, 0x64, 0xc3, 0xfd, 0x3a, 0xf0, 0xf8, 0x12, 0x21, 0x11, 0x5a, 0xe5, 0xfb, 0xc5, 0xb9, 0x98, 0xb9, 0x49, 0x2f, 0x67, 0xf2, 0xeb, 0xa9, 0x24, 0x85, 0x1a, 0xa2, 0xe3, 0x80, 0xbf, 0x32, 0xf6, 0x40, 0xd0, 0x48, 0x1c, 0xda, 0x21, 0x33, 0xf5, 0xba, 0x7e, 0x68, 0xb9, 0x8a, 0xf8, 0x7f, 0x2a, 0x56, 0x7c, 0x7e, 0xc7, 0xed, 0xaa, 0x5a, 0x43, 0x8a, 0xe3, 0xbb, 0x35, 0xb3, 0xa4, 0x00, 0x11, 0x62, 0x13, 0x83, 0x57, 0x63, 0xd8, 0x1e, 0x0a, 0xfd, 0x2e, 0xee, 0x64, 0xd4, 0x3a, 0x56, 0xc8, 0x0e, 0x9b, 0x47, 0xf8, 0xb5, 0x42, 0xbf, 0x88, 0x5c, 0x84, 0x90, 0x93, 0x06, 0x6d, 0x63, 0xac, 0x43, 0x58, 0xfc, 0x17, 0x9c, 0xbc, 0xc0, 0x3a, 0x31, 0x49, 0x74, 0x4e, 0xa1, 0x34, 0x47, 0x5a, 0x2a, 0xcf, 0x13, 0x62, 0x12, 0x5c, 0xe0, 0xdb, 0x45, 0x23, 0xaa, 0x63, 0x3f, 0xc2, 0x64, 0xaf, 0x2c, 0xc5, 0x3c, 0xc5, 0x4e, 0x76, 0x21, 0x6b, 0xa0, 0xf6, 0x82, 0xdf, 0xb9, 0x8d, 0x59, 0xc8, 0xf2, 0x3f, 0x69, 0x6d, 0xcb, 0xa0, 0xc3, 0x25, 0x8b, 0xe9, 0x8f, 0x0e, 0x27, 0x4a, 0x09, 0x02, 0x65, 0x82, 0xca, 0xc7, 0x41, 0xae, 0x49, 0x86, 0x90, 0x5e, 0xa1, 0x7f, 0xe3, 0xee, 0x95, 0xfa, 0xae, 0x14, 0xd1, 0x81, 0xaa, 0xb5, 0x72, 0x4c, 0x77, 0xfd, 0xc9, 0xfd, 0x86, 0xae, 0x5c, 0x8e, 0x36, 0xb8, 0x2e, 0x87, 0x3d, 0x0b, 0x41, 0x74, 0x4a, 0xa9, 0x58, 0x96, 0xe9, 0xff, 0x01, 0xd9, 0xa6, 0x75, 0xd3, 0x06, 0x75, 0x44, 0xf5, 0x3a, 0x51, 0x87, 0xe0, 0x97, 0x24, 0x96, 0x65, 0x39, 0xe7, 0x8f, 0xf1, 0x6b, 0x0a, 0x35, 0x10, 0x1b, 0x16, 0xfe, 0x30, 0x8c, 0x91, 0x67, 0xa8, 0x4b, 0x22, 0x8b, 0xf8, 0x64, 0xf5, 0xf4, 0x52, 0xd5, 0x61, 0xb1, 0x5a, 0x43, 0xc8, 0xa8, 0x2b, 0xec, 0xbf, 0x2e, 0x9a, 0xdd, 0x6f, 0xd5, 0xbe, 0x65, 0x3b, 0x85, 0xb0, 0xc9, 0xa4, 0xcf, 0x8f, 0x39, 0x69, 0x7d, 0xc7, 0x03, 0xf2, 0x6e, 0x93, 0x07, 0xee, 0xa1, 0xc1, 0x6b, 0x3c, 0x8f, 0xb6, 0x90, 0x07, 0xbe, 0xb1, 0x44, 0x36, 0x93, 0x54, 0x39, 0x03, 0x68, 0x60, 0xb5, 0xe9, 0xde, 0xc0, 0x8c, 0xc4, 0x74, 0xc9, 0x4c, 0x34, 0x59, 0xc0, 0xb7, 0x42, 0x7f, 0x9c, 0x76, 0x46, 0xf1, 0x0e, 0x0b, 0x08, 0x66, 0xbf, 0x08, 0x25, 0x16, 0xd9, 0x7e, 0xb4, 0xcc, 0xc8, 0xb9, 0x2a, 0x3d, 0x42, 0x2a, 0x7b, 0x98, 0x84, 0xa5, 0x82, 0x5e, 0xdf, 0xcd, 0xa3, 0x74, 0x74, 0xcc, 0xaf, 0x77, 0x3c, 0x47, 0x07, 0x4f, 0x4b, 0x90, 0x05, 0x07, 0x55, 0x1e, 0x97, 0xdb, 0x71, 0x3b, 0x2d, 0x93, 0x1d, 0xfd, 0xd6, 0x10, 0x82, 0x77, 0xa5, 0x25, 0xfa, 0x30, 0x5a, 0xa8, 0xd0, 0xd5, 0x3e, 0xc8, 0x47, 0x2a, 0x4f, 0xa0, 0xdd, 0x46, 0x9d, 0x0d, 0xd0, 0x00, 0xf4, 0xbd, 0xe2, 0xa5, 0xbb, 0x89, 0x59, 0xec, 0x1c, 0x05, 0x4b, 0x2b, 0x66, 0x55, 0x18, 0xca, 0xaf, 0x42, 0x38, 0xf8, 0xbd, 0x8d, 0x37, 0x9e, 0x27, 0x82, 0xfd, 0x91, 0xb7, 0xd1, 0x53, 0x0c, 0x13, 0x9a, 0xa3, 0x5d, 0x9c, 0xc7, 0xff, 0xde, 0x97, 0x9e, 0x65, 0x27, 0x8b, 0x96, 0x42, 0x82, 0xe9, 0x6a, 0x34, 0xa0, 0xf2, 0x6d, 0x14, 0x8a, 0xd6, 0x1d, 0x34, 0xd9, 0x19, 0xfa, 0xe5, 0x2a, 0x3b, 0x99, 0x3d, 0xcd, 0x98, 0xf4, 0x17, 0xbd, 0x8d, 0x04, 0x5a, 0xd5, 0xdc, 0x92, 0x7f, 0x40, 0x52, 0x4a, 0x4d, 0x32, 0xa7, 0x11, 0xe7, 0xd5, 0xa5, 0x98, 0x09, 0x87, 0x8c, 0x31, 0x8f, 0x42, 0xb6, 0xe2, 0x37, 0x5b, 0x77, 0xb8, 0xa7, 0x70, 0x47, 0x5e, 0xb2, 0x9c, 0x23, 0xee, 0xd7, 0xec, 0x30, 0x07, 0x0a, 0x17, 0xa2, 0x20, 0xb8, 0x69, 0xdc, 0x1c, 0x05, 0x01, 0xd8, 0x1e, 0x58, 0x3c, 0xca, 0x9e, 0x19, 0x71, 0x00, 0xbd, 0xb9, 0xdf, 0x0d, 0xd5, 0xf3, 0xe3, 0x26, 0x55, 0x52, 0x6f, 0xcc, 0xcc, 0xf4, 0xb7, 0xac, 0x43, 0x8d, 0x2d, 0xc3, 0xd0, 0xae, 0xb0, 0xc5, 0x68, 0x48, 0x00, 0xc0, 0xf5, 0x6c, 0x76, 0xfc, 0xa8, 0x54, 0xf2, 0x27, 0x91, 0xa7, 0x14, 0xae, 0x6d, 0xf9, 0xaf, 0x6e, 0xbf, 0x91, 0x7a, 0x8c, 0x22, 0x70, 0x09, 0xa1, 0xdd, 0x8f, 0xfc, 0x1b, 0xb8, 0x67, 0x77, 0xe0, 0x0e, 0xb6, 0xd2, 0x34, 0x24, 0x81, 0x91, 0xdc, 0xb9, 0x55, 0x96, 0x83, 0xde, 0xd3, 0x95, 0x5e, 0x08, 0x6c, 0xc9, 0x0c, 0x64, 0x68, 0xe5, 0xc0, 0x6a, 0x2d, 0x4e, 0xa1, 0xb5, 0xbe, 0x87, 0x71, 0x12, 0x82, 0xec, 0x6d, 0xd7, 0x47, 0xa4, 0x75, 0x76, 0x86, 0xd1, 0x6d, 0x51, 0xe8, 0x09, 0xe3, 0xd0, 0x0a, 0x0a, 0xf2, 0xb1, 0x7d, 0xa9, 0x66, 0xa0, 0x12, 0x0c, 0x20, 0x08, 0x54, 0x19, 0xbd, 0x28, 0x55, 0x2e, 0x72, 0x69, 0xae, 0x13, 0x3a, 0xef, 0xc1, 0x2d, 0x34, 0x6e, 0x41, 0xf4, 0x46, 0x3f, 0xf5, 0xa7, 0x07, 0xb3, 0xb8, 0x3e, 0xdc, 0xa7, 0xc5, 0xa0, 0x61, 0x58, 0x31, 0x16, 0x0a, 0x79, 0xb9, 0xff, 0x0a, 0x83, 0xbe, 0xc6, 0x73, 0x4d, 0x8e, 0x12, 0x9f, 0xdc, 0xe5, 0x3c, 0xd0, 0x7c, 0xb4, 0x06, 0x13, 0x0f, 0x20, 0x8a, 0x6a, 0xa6, 0xce, 0x70, 0x29, 0x4e, 0x5e, 0x64, 0xa1, 0x2d, 0x35, 0xc7, 0xfc, 0xcd, 0x80, 0xa5, 0x68, 0xb7, 0x75, 0xe8, 0x78, 0x44, 0xdc, 0xcb, 0xc6, 0xb0, 0xcf, 0x91, 0xde, 0x70, 0xbe, 0x76, 0x57, 0xc5, 0xb6, 0xe6, 0x43, 0x92, 0xe2, 0xed, 0xca ],
+    const [ 0x2c, 0x9b, 0xdc, 0x9d, 0x3e, 0x5c, 0xf0, 0x9a, 0xdd, 0xfc, 0xd9, 0xc3, 0xf2, 0x4f, 0x6b, 0xb1, 0x82, 0xd7, 0x6c, 0x1d, 0x2f, 0x3b, 0x3e, 0xf5, 0x02, 0xf4, 0xbd, 0xae, 0x67, 0x4a, 0x6b, 0xdd, 0x79, 0x7f, 0xcb, 0x01, 0x80, 0x4a, 0x0a, 0xa3, 0xb8, 0x87, 0xe4, 0xa2, 0x55, 0x2c, 0xc6, 0xc8, 0xc3, 0x7f, 0x30, 0xa0, 0x32, 0x86, 0x5e, 0x8c, 0x52, 0xbf, 0x27, 0x12, 0x5b, 0x12, 0x25, 0x77, 0x51, 0x04, 0x16, 0x8f, 0x86, 0x2d, 0x82, 0xd3, 0x60, 0xec, 0x9f, 0xb4, 0x5c, 0x59, 0x71, 0x2f, 0x53, 0x7b, 0x35, 0xa2, 0xfd, 0xbc, 0x00, 0xde, 0xb3, 0x99, 0xa4, 0x7d, 0x79, 0x9e, 0xd3, 0x76, 0x3b, 0x92, 0x87, 0xee, 0x57, 0xef, 0xa0, 0x51, 0x5c, 0x95, 0xcf, 0xa2, 0x11, 0xbe, 0xb4, 0x0f, 0xba, 0x35, 0x43, 0xc9, 0x96, 0xc3, 0x6c, 0x12, 0xac, 0xea, 0xfb, 0x98, 0xc8, 0xd6, 0xbd, 0x01, 0xc0, 0x91, 0xe4, 0xc7, 0xfb, 0x76, 0xac, 0x46, 0x34, 0xe8, 0x3f, 0x13, 0x7c, 0x44, 0xd6, 0x90, 0x7e, 0x13, 0x22, 0xbd, 0x07, 0x85, 0xea, 0x51, 0xc6, 0x1b, 0xf5, 0x0a, 0x50, 0xa3, 0x2a, 0x41, 0x66, 0x69, 0xf6, 0xc1, 0x7b, 0xac, 0xee, 0xd9, 0x71, 0x4f, 0xb6, 0xb0, 0xa4, 0xd1, 0x21, 0xd9, 0x29, 0x7f, 0x99, 0x27, 0x58, 0xe8, 0xc2, 0xc3, 0x87, 0x92, 0x5a, 0x7b, 0x19, 0xeb, 0x64, 0x5d, 0xb8, 0x82, 0x85, 0x85, 0xde, 0x77, 0xae, 0x33, 0x9a, 0x31, 0xfb, 0x21, 0x91, 0x4e, 0xdb, 0x13, 0x43, 0xe0, 0x72, 0xaf, 0x8f, 0xd6, 0x3b, 0x8f, 0x79, 0xb8, 0xf2, 0x95, 0x2c, 0x98, 0xb1, 0x7e, 0x3b, 0x45, 0x59, 0xba, 0x2c, 0xc1, 0x33, 0x7b, 0x37, 0xf5, 0xd7, 0x0d, 0x4b, 0xa4, 0x4d, 0x65, 0x52, 0x9e, 0x73, 0xfc, 0xb6, 0x36, 0x9e, 0xde, 0x24, 0xf5, 0x84, 0xfd, 0x90, 0x90, 0x5a, 0xcc, 0x79, 0x18, 0x39, 0x09, 0x6e, 0x71, 0xc6, 0xda, 0xd1, 0x05, 0x12, 0x1c, 0xdb, 0xb9, 0xbf, 0xf8, 0xe0, 0x21, 0x65, 0xb7, 0xd4, 0xef, 0x33, 0xd7, 0x0f, 0xb2, 0xda, 0x5e, 0x4d, 0xbd, 0xa6, 0x6e, 0xf9, 0x64, 0xee, 0x1a, 0xab, 0x6f, 0xaf, 0x78, 0xef, 0xc8, 0x74, 0xf7, 0x48, 0x77, 0x79, 0xf3, 0x74, 0xd0, 0x0f, 0x87, 0xf2, 0xeb, 0x42, 0xa3, 0xc2, 0x55, 0xba, 0x5e, 0x6c, 0x05, 0xdf, 0x8d, 0x43, 0x92, 0x41, 0x94, 0xeb, 0xa3, 0x36, 0x7c, 0x19, 0xa6, 0xc5, 0x46, 0x9a, 0xc5, 0xc2, 0x7f, 0x97, 0x15, 0x3b, 0x15, 0x17, 0x11, 0x13, 0x69, 0xc5, 0x48, 0xed, 0xa5, 0xf4, 0x52, 0x4b, 0x50, 0xe0, 0x08, 0xf7, 0x20, 0x36, 0xf5, 0xa3, 0x0f, 0xd7, 0x07, 0xcc, 0xb0, 0xd9, 0x8a, 0xe4, 0xc4, 0xcf, 0x57, 0xaf, 0x09, 0x4b, 0x49, 0xee, 0x52, 0xa1, 0xf1, 0x3b, 0xdc, 0xed, 0x8b, 0x34, 0xe0, 0x57, 0x30, 0xdb, 0x65, 0x95, 0x4d, 0x3d, 0x58, 0xb2, 0x53, 0x52, 0xde, 0x0e, 0xb0, 0x25, 0xe9, 0xa7, 0xff, 0x34, 0x0a, 0x96, 0x7b, 0x1a, 0x86, 0xdd, 0xba, 0x6b, 0xab, 0x5f, 0x98, 0xe0, 0x64, 0x30, 0x71, 0xb4, 0x0c, 0x0f, 0x93, 0x4d, 0x80, 0x31, 0xf2, 0x1f, 0x78, 0x41, 0x1e, 0xce, 0x17, 0xa4, 0x73, 0x92, 0xc0, 0x01, 0x8f, 0xe0, 0x2c, 0x01, 0x0a, 0x47, 0xb9, 0x53, 0x61, 0x98, 0x05, 0xf4, 0x32, 0x49, 0xbc, 0xad, 0xaf, 0x1b, 0xae, 0xdd, 0x4d, 0xfb, 0x25, 0x78, 0xbc, 0x26, 0x75, 0x50, 0x1c, 0x91, 0xd4, 0x93, 0x6e, 0x88, 0x6c, 0x95, 0x48, 0x95, 0xaf, 0xd0, 0xcd, 0xa3, 0xeb, 0x2a, 0xdd, 0x63, 0x1e, 0x76, 0x89, 0xef, 0x0b, 0x3c, 0xca, 0xae, 0x8d, 0xbd, 0x72, 0x77, 0x2c, 0x32, 0x62, 0xf9, 0xee, 0x55, 0xfe, 0x5a, 0x6f, 0x22, 0xde, 0x1e, 0x34, 0xdf, 0xc6, 0x4b, 0x3d, 0x5a, 0xd9, 0xca, 0xd9, 0x72, 0x09, 0x11, 0xbf, 0xd8, 0xd2, 0xff, 0x59, 0x17, 0x28, 0x07, 0x63, 0xd2, 0xae, 0x91, 0xb5, 0x4d, 0x28, 0x9d, 0x5d, 0x30, 0x33, 0xaa, 0xf1, 0x87, 0x34, 0xd6, 0x24, 0x0c, 0x8e, 0x46, 0x96, 0xa9, 0x18, 0xc8, 0xf1, 0x39, 0xce, 0xb7, 0x31, 0x8f, 0xc6, 0x20, 0x43, 0xb9, 0x66, 0x22, 0xd2, 0x85, 0xd5, 0x9b, 0x5e, 0x45, 0xaf, 0x01, 0x8e, 0xd0, 0xfd, 0x8d, 0xc7, 0xc9, 0x64, 0x9f, 0xfd, 0x24, 0x9c, 0x5e, 0xc9, 0xe5, 0x24, 0x9e, 0xbc, 0x2b, 0x34, 0x08, 0xf4, 0x6e, 0xf4, 0x74, 0xec, 0x05, 0xeb, 0x9a, 0x98, 0xeb, 0xba, 0xea, 0xb2, 0xc2, 0x0a, 0xb8, 0x4f, 0x18, 0xc3, 0x9c, 0xb5, 0xea, 0x7e, 0x19, 0x70, 0x66, 0x3e, 0x7c, 0xa3, 0xf5, 0x5a, 0x07, 0x9d, 0x79, 0xbe, 0x4f, 0xac, 0xd3, 0x54, 0xe3, 0x36, 0xa9, 0xbc, 0x2e, 0x05, 0x66, 0x43, 0x9f, 0xe3, 0x82, 0x13, 0x07, 0x67, 0x03, 0xa7, 0x42, 0x0e, 0x44, 0x82, 0x19, 0x8d, 0xf5, 0x21, 0x67, 0x66, 0x63, 0x2e, 0x7b, 0xba, 0xf9, 0xf6, 0xbe, 0x5e, 0x07, 0x1d, 0x95, 0x31, 0xc3, 0x90, 0x89, 0xac, 0x8e, 0xbc, 0xa6, 0xba, 0x78, 0xfe, 0x20, 0xca, 0x05, 0x5a, 0x3d, 0x23, 0x32, 0x6f, 0x6e, 0x78, 0xb3, 0xaa, 0xbf, 0xbd, 0x7f, 0xbb, 0x72, 0x39, 0x8e, 0x45, 0xe7, 0xdb, 0xe1, 0xda, 0xc0, 0xd1, 0xc4, 0x26, 0x42, 0x57, 0x50, 0x6a, 0xfd, 0xcd, 0x33, 0x2d, 0xaf, 0x0d, 0xb4, 0x2e, 0x66, 0xfb, 0xf1, 0x9c, 0xe5, 0x5e, 0x6b, 0x89, 0x49, 0xee, 0xc5, 0x9d, 0xec, 0xad, 0xc9, 0x07, 0x8a, 0x7b, 0xac, 0xb9, 0xa2, 0xe5, 0x93, 0xd5, 0x1f, 0x3f, 0x55, 0x62, 0x38, 0xf2, 0x83, 0x44, 0x95, 0x16, 0xa6, 0x6b, 0xb3, 0x44, 0xc7, 0x4a, 0x89, 0xa5, 0x35, 0x8b, 0x6c, 0x4f, 0x82, 0x01, 0x30, 0xd2, 0xcf, 0xde, 0x90, 0x0d, 0x49, 0x26, 0xcf, 0x47, 0xf4, 0x63, 0xa0, 0x7b, 0xa8, 0x9b, 0x44, 0xf2, 0x59, 0x7f, 0xf2, 0x17, 0x9b, 0xe5, 0x7b, 0x88, 0x64, 0x78, 0x2e, 0x69, 0x14, 0xae, 0xf9, 0xfd, 0xb4, 0xfb, 0xd2, 0x77, 0x7b, 0x45, 0x55, 0x0d, 0x97, 0x97, 0xaf, 0x4f, 0x2a, 0x19, 0xba, 0xb7, 0x92, 0x40, 0x69, 0x81, 0xed, 0x42, 0x67, 0xbc, 0xdc, 0xcd, 0xfb, 0xa2, 0x88, 0xf8, 0x2f, 0x25, 0xe3, 0x7a, 0x31, 0xca, 0x31, 0x19, 0xf9, 0xba, 0xc6, 0x66, 0x2c, 0x17, 0x11, 0xa8, 0x41, 0x8c, 0xd9, 0x16, 0xe2, 0x28, 0xc7, 0x49, 0x95, 0x6c, 0x25, 0xf0, 0x9b, 0xa2, 0xe5, 0xc6, 0x18, 0x71, 0xe5, 0xc1, 0x75, 0xaf, 0x71, 0x8c, 0x03, 0x76, 0x0a, 0x38, 0xe1, 0x7a, 0x65, 0x2f, 0x1f, 0x99, 0xb7, 0x69, 0x23, 0xb4, 0x30, 0xe2, 0x4c, 0xbe, 0xc5, 0x4b, 0xd6, 0x12, 0x33, 0xff, 0xfe, 0x0a, 0x41, 0x3a, 0x66, 0xcd, 0x45, 0x85, 0xba, 0x68, 0xe9, 0x75, 0x94, 0x21, 0x2f, 0x95, 0x9d, 0x07, 0xb3, 0xa1, 0xf6, 0xce, 0x31, 0xf5, 0xd6, 0xda, 0x46, 0x44, 0x74, 0x9a, 0x7b, 0x8d, 0x27, 0x17, 0x7f, 0x4b, 0xcb, 0xcd, 0xb4, 0xed, 0x68, 0xb9, 0xed, 0x85, 0x0e, 0xb3, 0x77, 0xc4, 0x03, 0xfe, 0x56, 0x26, 0x21, 0x1e, 0xd0, 0x6a, 0x79, 0xe9, 0x30, 0x45, 0x3c, 0xe1, 0xc4, 0x57, 0xdc, 0xc1, 0x28, 0x5e, 0x6e, 0x56, 0xc6, 0xaa, 0x53, 0x90, 0x9e, 0xd1, 0x17, 0xd9, 0x43, 0xa3, 0x99, 0xa5, 0x26, 0x60, 0x6c, 0x4b, 0x17, 0x29, 0x7e, 0x13, 0x09, 0xb5, 0xf7, 0x90, 0x16, 0x45, 0x64, 0x30, 0xc3, 0xda, 0x15, 0x11, 0x84, 0xa5, 0xc3, 0x16, 0x83, 0xbf, 0x77, 0x3b, 0x9d, 0x1a, 0xa6, 0x25, 0xad, 0xb8, 0xa1, 0xfe, 0x0e, 0x1a, 0x2d, 0x7f, 0x5b, 0xfc, 0x6d, 0x4e, 0x79, 0x3f, 0x09, 0x8b, 0xd8, 0x27, 0x89, 0xa5, 0xf5, 0xc6, 0x02, 0x73, 0x24, 0xb8, 0xf5, 0x80, 0x8c, 0x11, 0x74, 0xa6, 0x73, 0x94, 0x86, 0xde, 0xbc, 0x26, 0xcd, 0x56, 0xad, 0x82, 0x66, 0xc4, 0xf6, 0x2d, 0x11, 0xfb, 0xef, 0xad, 0x92, 0xbb, 0x22, 0xf6, 0x57, 0xce, 0x09, 0x25, 0x5a, 0x50, 0x19, 0x70, 0x49, 0x4f, 0xff, 0x5d, 0xe5, 0x94, 0x29, 0x33, 0xa8, 0xbf, 0x88, 0xae, 0xaa, 0x9a, 0x94, 0xf7, 0xc5, 0xa7, 0x91, 0xd3, 0xf7, 0xfb, 0x11, 0x1b, 0x09, 0x4f, 0xbb, 0x6c, 0x6e, 0x55, 0x4a, 0x1f, 0x6e, 0x48, 0xd9, 0x7c, 0x84, 0xc7, 0x5d, 0x2a, 0x04, 0xe3, 0x73, 0xea, 0x00, 0x77, 0x5c, 0x86, 0x6d, 0xb8, 0x45, 0x03, 0x82, 0x0c, 0xcc, 0x1e, 0x61, 0x20, 0xc1, 0xf7, 0xf9, 0x34, 0x29, 0x07, 0x2b, 0xba, 0x89, 0x57, 0x2b, 0x20, 0x61, 0xf4, 0x2a, 0xea, 0xf6, 0x9e, 0x32, 0x03, 0x54, 0xc0, 0x51, 0x55, 0x94, 0xa5, 0xf9, 0x97, 0x5b, 0xe8, 0xa7, 0x66, 0xa3, 0x2c, 0xc3, 0x98, 0xbe, 0x0e, 0xc7, 0xcd, 0x97, 0x58, 0xa4, 0x46, 0x3c, 0x77, 0x62, 0xfb, 0x99, 0x30, 0x06, 0xe7, 0x86, 0x8e, 0xb8, 0xa7, 0x05, 0x1f, 0x25, 0x43, 0xc4, 0x60, 0x23, 0x4c, 0xea, 0x75, 0x93, 0x27, 0x10, 0x1d, 0x8c, 0xa8, 0x8c, 0xe6, 0xb6, 0xe3, 0xf6, 0x9d, 0xf3, 0x3e, 0xe5, 0x09, 0x45, 0xcb, 0xfa, 0xd9, 0xec, 0xd5, 0x20, 0xda, 0xce, 0xb9, 0x11, 0x6d, 0x1c, 0xf7, 0x1d, 0x39, 0x33, 0x89, 0x27, 0x1d, 0xc0, 0x74, 0xf0, 0x68, 0x28, 0x9c, 0x98, 0x4d, 0x27, 0xdc, 0x61, 0x91, 0xb7, 0x56, 0xb7, 0x87, 0x33, 0x08, 0x6d, 0x3e, 0xbc, 0xa1, 0x4a, 0xf9, 0xdc, 0x92, 0xc4, 0xdf, 0x69, 0x67, 0x0b, 0xf4, 0xac, 0x58, 0x49, 0x48, 0xc3, 0x1b, 0x28, 0x6f, 0x44, 0xfd, 0x96, 0x30, 0x23, 0x31, 0xc5, 0x81, 0xd6, 0x68, 0x75, 0xb4, 0xb6, 0xa2, 0x75, 0xeb, 0xa9, 0x43, 0x67, 0xd1, 0xfe, 0x69, 0xc5, 0x8c, 0x98, 0x7d, 0x21, 0xed, 0x4f, 0x08, 0xb1, 0xea, 0x93, 0xc8, 0x0a, 0x4f, 0x52, 0x04, 0x2c, 0xb0, 0x1c, 0x1c, 0xbf, 0xa2, 0x86, 0x64, 0x9c, 0x2b, 0xcc, 0x32, 0x8f, 0x76, 0xba, 0x36, 0x5b, 0xcb, 0xcc, 0x0a, 0xff, 0xbf, 0x94, 0x0a, 0x38, 0xa8, 0x5c, 0x66, 0x47, 0x54, 0x0d, 0x76, 0xf4, 0xfb, 0x4f, 0x4d, 0xd3, 0x71, 0xf2, 0x90, 0xc6, 0xa0, 0x8d, 0x89, 0xc3, 0x36, 0x64, 0x77, 0xd8, 0x9b, 0x8f, 0x28, 0x6c, 0x26, 0x59, 0xca, 0xc7, 0x90, 0xe7, 0xff, 0xd5, 0xa9, 0x1a, 0x2f, 0x26, 0x49, 0xb5, 0x22, 0x3a, 0x8a, 0xc3, 0xce, 0xfc, 0x34, 0x33, 0x6d, 0x8c, 0x79, 0xc6, 0xd3, 0x41, 0xe3, 0x2b, 0xff, 0xef, 0x8a, 0x68, 0xf0, 0x65, 0x8a, 0x7b, 0xba, 0x3a, 0xb4, 0x41, 0xd8, 0xca, 0x84, 0x98, 0xc4, 0x7b, 0x53, 0xc0, 0xc5, 0x45, 0xce, 0x08, 0x08, 0x71, 0xa7, 0xa6, 0xf3, 0xa0, 0x8b, 0xe6, 0xb6, 0x10, 0x53, 0x87, 0x23, 0x1b, 0x7e, 0x61, 0xbf, 0x00, 0xdf, 0x4c, 0x19, 0xe6, 0x93, 0x3e, 0x5a, 0x1e, 0x36, 0xb3, 0x1e, 0xa9, 0x56, 0x52, 0x82, 0xfa, 0x28, 0xcd, 0x7e, 0xfc, 0x7a, 0x09, 0x76, 0x57, 0xe9, 0x7f, 0x0b, 0xf0, 0x54, 0xe2, 0x37, 0xae, 0x91, 0x01, 0x99, 0x84, 0x5e, 0xf0, 0x0d, 0xac, 0x9a, 0x62, 0x80, 0x30, 0xb5, 0x5a, 0x03, 0xaf, 0x65, 0x03, 0x1d, 0x5e, 0x9a, 0xdb, 0x66, 0x4d, 0xb5, 0x17, 0x51, 0xec, 0xf4, 0x44, 0x4a, 0xcd, 0x31, 0x2a, 0x01, 0xab, 0xcd, 0xf5, 0x05, 0xac, 0xe7, 0x97, 0x94, 0xe3, 0xd1, 0x68, 0xb2, 0x19, 0xc4, 0x0f, 0x78, 0xcd, 0xd2, 0xa6, 0xaf, 0x79, 0x1d, 0x19, 0x9d, 0x17, 0x47, 0xcf, 0x1f, 0xe4, 0x29, 0x8d, 0xf8, 0x64, 0xc8, 0x97, 0x69, 0xa6, 0x84, 0x18, 0x02, 0xc9, 0x93, 0xc3, 0xb7, 0xbf, 0xae, 0xbb, 0x36, 0x51, 0x0a, 0xb0, 0x78, 0x63, 0x8a, 0x4b, 0x96, 0x7a, 0x33, 0xcd, 0xdf, 0x7b, 0xe0, 0xf3, 0x27, 0xb6, 0x37, 0x1c, 0x61, 0x22, 0xdb, 0xad, 0x71, 0xea, 0xe3, 0xb5, 0x3b, 0x29, 0x8c, 0xcd, 0x00, 0xf2, 0x2a, 0x43, 0xea, 0x94, 0x65, 0x77, 0xe5, 0x1c, 0xa1, 0x84, 0xb1, 0x1b, 0xbe, 0x23, 0x35, 0xa9, 0x02, 0xcd, 0x17, 0xa9, 0x53, 0x20, 0x89, 0x4f, 0xaa, 0x84, 0x66, 0xe0, 0xc4, 0x0e, 0x7d, 0xb9, 0x1b, 0xa5, 0x2d, 0x93, 0x14, 0x63, 0x32, 0x05, 0x7a, 0x3d, 0xbe, 0x4a, 0x2b, 0xe7, 0xcb, 0x45, 0x11, 0xf2, 0xb0, 0xc2, 0x54, 0x38, 0xf3, 0xff, 0xce, 0x79, 0x5f, 0x6b, 0xc0, 0x46, 0x56, 0xad, 0xc3, 0x1e, 0x68, 0xe8, 0x01, 0xd8, 0x24, 0x3e, 0xa4, 0x40, 0x2d, 0x93, 0x8f, 0x05, 0x91, 0x93, 0x4c, 0xd3, 0x57, 0xf6, 0x46, 0xbc, 0x57, 0x02, 0x39, 0xdc, 0x4f, 0x52, 0xe6, 0x3d, 0x32, 0xd7, 0x0b, 0xf8, 0xc3, 0x1c, 0x92, 0x9d, 0x63, 0xce, 0x09, 0xd5, 0x27, 0x7b, 0x52, 0x46, 0x2e, 0x9a, 0x9c, 0xb7, 0x32, 0xcc, 0x92, 0x75, 0x5c, 0x61, 0xd1, 0xf5, 0x5d, 0x1e, 0xa0, 0xba, 0xba, 0x3d, 0xdb, 0x79, 0x67, 0xb6, 0x31, 0x7c, 0x98, 0xbd, 0x90, 0x44, 0xd4, 0x8c, 0xdc, 0x72, 0x4b, 0x62, 0xe7, 0xe8, 0x69, 0xcc, 0x9e, 0x2b, 0xab, 0x23, 0x80, 0x0b, 0xb2, 0x56, 0x55, 0x87, 0x96, 0xe9, 0x1c, 0xeb, 0x7c, 0x3e, 0x45, 0x3b, 0x6b, 0x14, 0x20, 0xd4, 0x5b, 0x4d, 0x96, 0x51, 0x8f, 0xf4, 0x17, 0xac, 0x25, 0x7e, 0xd3, 0xa5, 0xec, 0x50, 0x2d, 0x68, 0x75, 0x82, 0x6c, 0x6a, 0x6d, 0xe3, 0xb4, 0x94, 0x29, 0x3d, 0x36, 0xa3, 0x83, 0xda, 0xa3, 0xcf, 0xe5, 0x46, 0xe6, 0xaa, 0xa3, 0x57, 0x12, 0x4c, 0x8e, 0x6b, 0x99, 0xad, 0xc6, 0xf1, 0xc0, 0x52, 0xcf, 0x2b, 0x4f, 0x2c, 0xe7, 0x31, 0x8d, 0xbd, 0x97, 0x3a, 0x6b, 0x7c, 0x89, 0x17, 0x00, 0x7b, 0x99, 0x00, 0x35, 0x47, 0x2e, 0x93, 0xc2, 0x0f, 0xcb, 0x1a, 0x59, 0x09, 0xe1, 0x0d, 0x20, 0x12, 0xe8, 0xd8, 0x65, 0x95, 0xad, 0xdd, 0x8e, 0xad, 0xee, 0xbd, 0x4e, 0x8e, 0x24, 0xd3, 0x1f, 0x21, 0xa0, 0x02, 0xec, 0xee, 0xd9, 0xb1, 0x0d, 0x3f, 0x05, 0x13, 0x79, 0x82, 0xe6, 0xac, 0x37, 0xf0, 0xe7, 0x11, 0x16, 0x6c, 0x67, 0xef, 0x9e, 0xae, 0x55, 0x4e, 0x46, 0xa0, 0xfd, 0x17, 0xe8, 0x08, 0x21, 0xd4, 0x71, 0x68, 0x4c, 0xb8, 0xdd, 0x22, 0x63, 0xdf, 0x63, 0xe0, 0x7d, 0xd6, 0xec, 0x33, 0xf4, 0x5e, 0xca, 0x7b, 0xbd, 0x6d, 0xa7, 0x06, 0xf4, 0x76, 0xbb, 0x7c, 0xbb, 0xea, 0x43, 0x7a, 0x45, 0xff, 0x2e, 0x7d, 0x2e, 0xb0, 0x19, 0x02, 0x0e, 0x05, 0x7d, 0xeb, 0x4d, 0x94, 0x27, 0x25, 0x39, 0x48, 0xe9, 0x88, 0x55, 0x61, 0x90, 0xfe, 0xf4, 0xbc, 0x15, 0xe8, 0x07, 0x55, 0x18, 0xbd, 0x34, 0x0a, 0x89, 0xf4, 0x28, 0xa2, 0xa9, 0x25, 0x2d, 0x0d, 0x31, 0x6b, 0xff, 0xed, 0xd0, 0x0c, 0xdb, 0x56, 0xdb, 0x5c, 0xda, 0xd2, 0x41, 0xde, 0x7d, 0xa9, 0xbd, 0xad, 0x89, 0x5f, 0x4f, 0x1a, 0x15, 0x7d, 0xec, 0x97, 0xe1, 0x95, 0x75, 0xd4, 0xe9, 0x80, 0xe6, 0x27, 0x3a, 0xea, 0xd0, 0x31, 0x05, 0x11, 0x09, 0xbf, 0xf2, 0xc9, 0xa1, 0xee, 0xb6, 0xc4, 0x19, 0x93, 0xe8, 0x10, 0xd0, 0xd9, 0x10, 0xe1, 0xbe, 0x2c, 0x02, 0x91, 0x64, 0x56, 0x6a, 0xe5, 0x03, 0xe8, 0xa7, 0x92, 0x0d, 0xdc, 0xdd, 0xff, 0xd9, 0x78, 0x45, 0x4d, 0x9a, 0x76, 0xc8, 0x95, 0x92, 0x61, 0xcd, 0x70, 0x83, 0x42, 0x4f, 0xbd, 0x67, 0x7c, 0x32, 0x9e, 0x60, 0xf5, 0xd7, 0xc4, 0xf2, 0x76, 0xee, 0xed, 0x70, 0x55, 0x8b, 0xaa, 0xb4, 0x51, 0x7c, 0x66, 0x13, 0xbd, 0xdb, 0xa4, 0x91, 0xe1, 0xdf, 0x88, 0x50, 0x9d, 0xf7, 0x99, 0x4f, 0x4f, 0x1a, 0xc5, 0x51, 0xf7, 0x58, 0xa6, 0x1a, 0x99, 0xb6, 0x03, 0xe1, 0xe3, 0x38, 0x9a, 0x03, 0x10, 0x3f, 0x1c, 0xf5, 0x0c, 0x15, 0x7a, 0x7c, 0xd9, 0xc7, 0x5f, 0x20, 0x31, 0x33, 0xfd, 0xde, 0x6d, 0x61, 0x0d, 0x1d, 0xa5, 0x17, 0x11, 0xe3, 0x19, 0xa7, 0xdd, 0x49, 0xcf, 0x0c, 0x55, 0x2c, 0x7e, 0x35, 0x78, 0x26, 0xab, 0xa1, 0x9e, 0xbc, 0x12, 0x2c, 0xfd, 0xd9, 0x47, 0x29, 0x72, 0x7c, 0x9d, 0xb0, 0x7f, 0xad, 0x47, 0x39, 0x90, 0xb5, 0xbd, 0x6a, 0x82, 0x8e, 0x62, 0x2e, 0x65, 0x99, 0x63, 0x07, 0x81, 0x8f, 0xe2, 0xa5, 0x98, 0xba, 0x54, 0xb7, 0x6b, 0x65, 0x27, 0x01, 0x7f, 0x91, 0xa8, 0xaf, 0x21, 0xe9, 0x25, 0xe9, 0xa8, 0xf8, 0x4e, 0xa7, 0xfa, 0x9a, 0xe1, 0xc7, 0x52, 0xb0, 0x87, 0x5d, 0x40, 0x18, 0xf9, 0x4a, 0xf1, 0xdd, 0x66, 0x10, 0xb0, 0xaa, 0x19, 0xe4, 0xad, 0x85, 0x57, 0x05, 0xfd, 0xb9, 0x86, 0x4d, 0xe3, 0x14, 0x95, 0x05, 0x4e, 0x53, 0x97, 0xfe, 0xa2, 0xdb, 0xb1, 0xdd, 0xbb, 0xaa, 0x37, 0xb7, 0x30, 0x8c, 0x12, 0xde, 0xd4, 0x92, 0x65, 0xfa, 0x83, 0xc0, 0x70, 0x5b, 0x1b, 0x06, 0xb4, 0x8d, 0xc8, 0x72, 0x57, 0x2d, 0x85, 0xa3, 0xcb, 0xfc, 0xdf, 0x81, 0xab, 0x32, 0xfc, 0x2b, 0xe5, 0x15, 0xdd, 0x31, 0x1e, 0xc9, 0xe0, 0x04, 0x52, 0x6a, 0x89, 0xaa, 0xbb, 0x58, 0x81, 0xb6, 0xf5, 0xd2, 0xdf, 0x78, 0x5f, 0xc7, 0xa7, 0x71, 0xc4, 0xe8, 0x90, 0x09, 0x3b, 0x02, 0x0b, 0x85, 0x4b, 0x8b, 0x80, 0x33, 0x53, 0x7b, 0xdb, 0xe7, 0x29, 0x5d, 0x47, 0xab, 0x02, 0xa5, 0x39, 0xb3, 0x92, 0x44, 0xb1, 0x8f, 0x74, 0x7a, 0xbd, 0xa4, 0xcb, 0xeb, 0x3e, 0xdd, 0x2a, 0xf6, 0xee, 0x9e, 0xb1, 0x42, 0xa2, 0xfa, 0x79, 0x99, 0xcd, 0x25, 0x33, 0xfa, 0x46, 0x2c, 0x0b, 0xe9, 0x4b, 0xe3, 0xd3, 0x0a, 0xc5, 0x1f, 0x5d, 0xee, 0xcd, 0x26, 0x28, 0x2d, 0x70, 0x64, 0x3f, 0xb5, 0xaf, 0x60, 0x5f, 0x61, 0xca, 0xee, 0x58, 0xce, 0xbf, 0xa5, 0xb5, 0x6a, 0x0d, 0x93, 0x9f, 0xcd, 0xbd, 0x30, 0xff, 0x4d, 0xa3, 0x91, 0xe3, 0xcc, 0xe2, 0xde, 0x23, 0xd5, 0xae, 0x06, 0x44, 0xe8, 0x56, 0xb1, 0x9c, 0x11, 0x81, 0x77, 0xb7, 0xbf, 0xb7, 0x4f, 0xfa, 0xd4, 0x24, 0x4a, 0x86, 0xf9, 0x99, 0x81, 0x60, 0x34, 0xd4, 0x4b, 0xce, 0xbc, 0x01, 0xb4, 0x04, 0x0c, 0x81, 0x2b, 0xff, 0x36, 0xe9, 0x7b, 0xb2, 0x7a, 0x4e, 0xfd, 0x60, 0x17, 0xc0, 0x0b, 0x49, 0x61, 0x14, 0xb7, 0x88, 0x14, 0xe7, 0xbd, 0x3c, 0xe8, 0xdf, 0xb7, 0xe6, 0x65, 0x34, 0x90, 0x12, 0xf9, 0x6f, 0x3b, 0x3a, 0x48, 0x72, 0xa5, 0xe7, 0xc3, 0xb9, 0xe8, 0x19, 0x7c, 0xdf, 0xc1, 0xe9, 0x38, 0x64, 0x44, 0x6d, 0xc6, 0xad, 0xce, 0xdc, 0x90, 0x4c, 0x3c, 0xf2, 0x70, 0x82, 0x5a, 0x96, 0xc5, 0x02, 0x9e, 0xbb, 0xc5, 0xf8, 0x17, 0x84, 0x15, 0x4a, 0xa0, 0xab, 0x97, 0x1e, 0x59, 0x23, 0x83, 0x9c, 0x58, 0xfc, 0xb9, 0xf5, 0x9b, 0x88, 0x55, 0xa4, 0x41, 0xbc, 0x84, 0xf4, 0xfa, 0xd8, 0x97, 0xc2, 0xbd, 0x4b, 0x56, 0x84, 0xb9, 0xd0, 0x97, 0x8a, 0x8d, 0xde, 0x0f, 0x84, 0xbb, 0x3f, 0x67, 0x45, 0x5a, 0xfe, 0x92, 0xc6, 0x0c, 0x87, 0x5f, 0x6e, 0x30, 0x0a, 0x4a, 0x90, 0x59, 0x20, 0x98, 0x36, 0xfe, 0xb1, 0xa3, 0x1d, 0x73, 0x15, 0x72, 0x00, 0x17, 0x79, 0x8c, 0x19, 0xd0, 0x85, 0x0e, 0xe6, 0xb4, 0x3c, 0xfc, 0x29, 0x09, 0x23, 0xd5, 0x32, 0x70, 0xa5, 0x6a, 0x60, 0x5d, 0xb6, 0xef, 0xe6, 0xca, 0xb7, 0x53, 0xcb, 0x2d, 0x99, 0xcd, 0x35, 0xa7, 0x46, 0xb8, 0xe6, 0x7e, 0x3c, 0xa0, 0x07, 0xcd, 0x7b, 0x9d, 0x24, 0x7a, 0xa2, 0xdf, 0x79, 0x69, 0x55, 0x8b, 0x6c, 0xef, 0xe1, 0xc6, 0x5a, 0x8a, 0x23, 0x0e, 0x96, 0xcf, 0xa6, 0xd1, 0xaf, 0xa3, 0x0b, 0x38, 0xf2, 0xae, 0xae, 0x44, 0x30, 0x0d, 0x86, 0x1d, 0xc2, 0x47, 0x4d, 0xa7, 0xc9, 0x83, 0xe1, 0x55, 0xba, 0xf8, 0xeb, 0x42, 0x1b, 0xa4, 0xbe, 0x7e, 0x87, 0x41, 0x82, 0xa5, 0xf8, 0x75, 0x91, 0xb7, 0x46, 0x49, 0x21, 0x23, 0xea, 0xdc, 0x24, 0x25, 0x08, 0x59, 0x6c, 0x52, 0xad, 0x26, 0x13, 0x72, 0x55, 0x5e, 0x1a, 0x8d, 0xb0, 0x82, 0x50, 0x49, 0xa5, 0x6b, 0x75, 0x73, 0x98, 0x83, 0xa0, 0xdb, 0xe8, 0x35, 0xde, 0x65, 0xbc, 0xa2, 0x1c, 0x5d, 0x00, 0x96, 0x47, 0x0b, 0xaa, 0xba, 0xb1, 0x87, 0x42, 0x0b, 0xb7, 0xcf, 0xa1, 0x8a, 0xa1, 0x17, 0xf9, 0x35, 0xc9, 0x60, 0x15, 0x37, 0x00, 0x4c, 0xe2, 0x5c, 0x2d, 0x31, 0x2f, 0xc7, 0x37, 0x6c, 0xb1, 0xe7, 0x25, 0xf8, 0x4a, 0xa7, 0x84, 0x3f, 0x8a, 0xe5, 0x09, 0x2f, 0x77, 0x26, 0x78, 0x91, 0x89, 0x88, 0xc4, 0x96, 0xf9, 0xf8, 0x78, 0xb3, 0x3c, 0xa4, 0x55, 0xaf, 0xca, 0xb3, 0x3d, 0xfb, 0x23, 0x34, 0x50, 0x41, 0x14, 0x55, 0x54, 0x3f, 0x36, 0xd6, 0x5a, 0xd6, 0xb9, 0xbd, 0x9e, 0x5e, 0x5f, 0x4a, 0xb0, 0x3d, 0xcb, 0x2d, 0xd1, 0xb8, 0xfc, 0xf7, 0xa0, 0x09, 0x15, 0xcf, 0xf6, 0xb1, 0x5f, 0x66, 0x0e, 0x0f, 0x90, 0x2d, 0xe9, 0x32, 0x4e, 0xc5, 0xf0, 0xec, 0xef, 0xb6, 0xdc, 0x27, 0x83, 0x65, 0xd3, 0x7c, 0x14, 0x40, 0xd3, 0x02, 0x2c, 0x3c, 0x54, 0x64, 0x98, 0x81, 0x29, 0x37, 0x6c, 0x63, 0xa8, 0x8a, 0x47, 0x95, 0x0a, 0xbe, 0xd8, 0x99, 0x15, 0x98, 0xa1, 0x7b, 0xf8, 0x94, 0xfb, 0xbf, 0x76, 0x7c, 0x5b, 0x98, 0x46, 0x3a, 0xd3, 0x5b, 0xba, 0xeb, 0xdc, 0x32, 0xa0, 0x34, 0x52, 0x15, 0x66, 0xd9, 0xc0, 0xf6, 0x81, 0x8b, 0xde, 0x3c, 0x0e, 0x02, 0x58, 0x73, 0xba, 0x4c, 0xd1, 0x42, 0xe0, 0x65, 0x28, 0x9d, 0xf2, 0x07, 0xfa, 0x3b, 0x1a, 0xc3, 0x68, 0x4b, 0x21, 0x51, 0x1a, 0x63, 0x8f, 0x25, 0x83, 0xb9, 0x14, 0x42, 0x67, 0x95, 0x26, 0x53, 0x9b, 0x06, 0xec, 0xf8, 0x0d, 0xd5, 0x5b, 0x5e, 0x04, 0xb7, 0x9f, 0x12, 0xa8, 0xc6, 0xbc, 0x17, 0xc4, 0x32, 0x75, 0x36, 0xcb, 0x34, 0x6d, 0x95, 0x19, 0x44, 0x8c, 0x8b, 0x7c, 0x8c, 0xa4, 0xb3, 0xf3, 0x9c, 0x54, 0x3f, 0xb5, 0x5f, 0x2d, 0x8f, 0x75, 0x4e, 0x14, 0x03, 0xe5, 0xe3, 0xe7, 0x0d, 0x79, 0x51, 0x64, 0x8a, 0x6d, 0x72, 0x46, 0x52, 0x09, 0x01, 0xb0, 0x0d, 0x24, 0x09, 0xcf, 0x49, 0xe7, 0x9d, 0xbc, 0xca, 0xd3, 0xca, 0x9f, 0x21, 0x05, 0xca, 0x1a, 0x81, 0xb9, 0x7a, 0xe5, 0xcd, 0x0e, 0x0f, 0xb5, 0xf5, 0x09, 0x04, 0x63, 0x83, 0xdb, 0x56, 0x4a, 0x71, 0x67, 0xf4, 0xf1, 0x3e, 0xff, 0x71, 0xea, 0x41, 0x6e, 0xfd, 0xf9, 0x3c, 0x3c, 0x93, 0x79, 0x34, 0x2d, 0x74, 0xfc, 0x80, 0x0b, 0xd3, 0x32, 0x21, 0xa5, 0xd2, 0x0c, 0x51, 0x18, 0xad, 0x20, 0x5e, 0x4d, 0x35, 0x50, 0xb9, 0xc3, 0x81, 0xa6, 0x4a, 0x8f, 0xe0, 0x83, 0x07, 0xa1, 0x11, 0xf9, 0xc5, 0x48, 0xb7, 0x75, 0x4e, 0xf9, 0x07, 0xa1, 0xb3, 0x4c, 0xc4, 0x88, 0xe4, 0x47, 0x6d, 0xfc, 0x7d, 0xdf, 0xb5, 0x34, 0xe3, 0xbc, 0x33, 0xba, 0x90, 0x3d, 0x5b, 0x85, 0xab, 0xbc, 0xad, 0x61, 0xdc, 0x13, 0x2c, 0x98, 0x5e, 0x5e, 0x12, 0xcb, 0x56, 0x03, 0xc2, 0x21, 0x63, 0xf0, 0xfe, 0xa4, 0x76, 0x24, 0x5a, 0xe7, 0xe4, 0x71, 0xf0, 0xec, 0xb9, 0x80, 0x56, 0x46, 0x50, 0x15, 0xcd, 0x7b, 0x20, 0x94, 0xbb, 0xac, 0xd9, 0xc5, 0x5c, 0x78, 0xb0, 0xd4, 0xb4, 0x1d, 0xf6, 0x9c, 0xc8, 0xe0, 0xf0, 0x24, 0x0d, 0xb0, 0xe3, 0x6a, 0x21, 0x06, 0x6e, 0x60, 0xb9, 0x0f, 0x1c, 0x35, 0xdb, 0x0d, 0x3a, 0xd5, 0x4d, 0xfb, 0xe6, 0xb3, 0x4d, 0x6f, 0x69, 0xc6, 0x82, 0xc5, 0xc7, 0xd1, 0x33, 0x7a, 0x94, 0xe8, 0xb7, 0xd6, 0x08, 0x30, 0x2c, 0xce, 0x56, 0xe6, 0x6c, 0x28, 0x3a, 0xa3, 0x3d, 0xe0, 0xd1, 0xde, 0xc8, 0xcb, 0xae, 0xb2, 0x4d, 0x7a, 0x2a, 0xe1, 0x14, 0x61, 0xfb, 0x1a, 0xa7, 0x38, 0x09, 0x77, 0x3e, 0xa2, 0x7d, 0x4a, 0x7b, 0x0d, 0x1a, 0x19, 0x57, 0xd9, 0xd0, 0xe7, 0x5d, 0xbc, 0x8e, 0xb5, 0x16, 0x65, 0x59, 0x49, 0xc4, 0x5f, 0x9b, 0x2e, 0x52, 0x39, 0xbd, 0xfc, 0x8c, 0xe4, 0xf7, 0xda, 0x8c, 0x5c, 0x67, 0x40, 0x74, 0x8a, 0x61, 0x02, 0x63, 0x6a, 0x07, 0x8a, 0xa1, 0x69, 0x19, 0x64, 0x1d, 0x11, 0x0e, 0x01, 0x1a, 0xe7, 0x63, 0xb4, 0x25, 0x94, 0x33, 0x01, 0x4a, 0x44, 0x08, 0x17, 0x87, 0x4c, 0xf1, 0x9b, 0x81, 0x0f, 0xd4, 0xa7, 0x76, 0x22, 0x06, 0x13, 0x73, 0xae, 0x19, 0xf3, 0xc7, 0x16, 0xf5, 0x60, 0xb7, 0xda, 0x2a, 0x7c, 0x73, 0xbc, 0x85, 0xb0, 0x49, 0x21, 0xe2, 0x38, 0x19, 0xb9, 0x40, 0xe2, 0x09, 0x62, 0x1b, 0x12, 0x79, 0x4a, 0xf6, 0x0a, 0x3a, 0x54, 0x37, 0x68, 0xfa, 0xbe, 0x37, 0xf0, 0x03, 0x00, 0x9a, 0x8c, 0x26, 0xf7, 0xdc, 0x91, 0xf1, 0x42, 0x2d, 0x44, 0x29, 0xed, 0x7f, 0x9d, 0x74, 0x4c, 0xdd, 0x4b, 0x55, 0x2a, 0xfe, 0xf7, 0x5d, 0x24, 0x1a, 0xcd, 0xa0, 0x4f, 0xfc, 0x39, 0x67, 0x21, 0x59, 0xee, 0x24, 0x8e, 0x60, 0x2d, 0xab, 0x71, 0x92, 0x44, 0x9e, 0x2e, 0xd4, 0x55, 0x29, 0x95, 0xc2, 0x58, 0xf0, 0x0a, 0x47, 0x63, 0x46, 0xe3, 0x6a, 0x29, 0xa0, 0x12, 0x6b, 0xc2, 0x49, 0x04, 0x0f, 0xaa, 0x57, 0xc9, 0x38, 0x0b, 0xdd, 0x74, 0xb8, 0x3f, 0x62, 0xc5, 0x67, 0x90, 0x92, 0x05, 0x74, 0x43, 0x34, 0x32, 0xf8, 0xd6, 0x5c, 0x5c, 0xd1, 0x85, 0xe2, 0x4f, 0xad, 0x13, 0x12, 0x72, 0x65, 0xc6, 0xa5, 0xef, 0x8d, 0xb4, 0xf1, 0x14, 0x49, 0x3d, 0x5c, 0xfa, 0x61, 0xd9, 0x16, 0x64, 0x98, 0x14, 0x08, 0xe9, 0x3a, 0xd6, 0x07, 0x56, 0xf5, 0xe8, 0x4e, 0x4e, 0xe9, 0xb4, 0x2b, 0x33, 0x02, 0x4c, 0xf8, 0x4a, 0x86, 0xae, 0x4d, 0x19, 0xea, 0x47, 0x74, 0x14, 0xea, 0xb5, 0x1d, 0x79, 0xd9, 0xd1, 0x53, 0x79, 0x35, 0xed, 0xaf, 0x98, 0x7e, 0x5a, 0xcc, 0x56, 0x48, 0x2e, 0xfa, 0x0f, 0x90, 0x43, 0x37, 0x20, 0x4c, 0x83, 0x5b, 0x4b, 0x45, 0x63, 0x92, 0x5d, 0x29, 0xae, 0x0f, 0x0d, 0xdc, 0x84, 0xff, 0x28, 0x10, 0xa2, 0xbc, 0xeb, 0x15, 0xe4, 0x44, 0xb0, 0xf2, 0x07, 0xe9, 0xce, 0xb4, 0xb4, 0x4a, 0xba, 0x06, 0xba, 0x81, 0x72, 0x02, 0x9c, 0x9e, 0x1b, 0x47, 0x4b, 0x55, 0xe8, 0x4c, 0x34, 0xf3, 0x3f, 0xf4, 0x7d, 0x96, 0x17, 0x62, 0x8c, 0x9e, 0xa5, 0x0e, 0xca, 0x5f, 0x37, 0x18, 0xa6, 0x18, 0x60, 0xdd, 0xdc, 0x29, 0x55, 0xc9, 0xf7, 0x80, 0x97, 0x6c, 0x14, 0x55, 0xd2, 0xcf, 0xea, 0x17, 0x05, 0x08, 0x07, 0xa6, 0xe4, 0x0c, 0x5c, 0xc2, 0x7b, 0xc5, 0xfc, 0xc4, 0x13, 0x64, 0x21, 0x8b, 0x59, 0xf9, 0x70, 0xba, 0xbd, 0x40, 0x7e, 0x21, 0x19, 0xbe, 0x92, 0x78, 0x93, 0x0d, 0xad, 0x53, 0xc4, 0x75, 0xc7, 0x52, 0x1a, 0xbc, 0x5c, 0x98, 0x7a, 0x3e, 0x27, 0x7f, 0x2a, 0x40, 0x2e, 0x8a, 0xef, 0x81, 0xfe, 0x9c, 0x72, 0x12, 0x38, 0x67, 0xe8, 0x68, 0x4c, 0x26, 0xf2, 0xb0, 0x85, 0x8f, 0xc2, 0x62, 0x46, 0x03, 0x80, 0x19, 0x93, 0x09, 0xec, 0xa2, 0xd2, 0xfa, 0x44, 0x52, 0xd3, 0xfe, 0x68, 0x9d, 0x0f, 0x36, 0x3c, 0xe5, 0x2d, 0x3b, 0x4e, 0x90, 0xcb, 0xc8, 0xb9, 0x5d, 0x7a, 0xb3, 0x49, 0xf8, 0x0a, 0x22, 0xdf, 0xcc, 0x09, 0xfb, 0x17, 0x18, 0x86, 0x9c, 0x29, 0x45, 0x1a, 0xcd, 0x0d, 0x77, 0x2a, 0xf2, 0xe3, 0x62, 0x66, 0x86, 0x91, 0x5f, 0x95, 0xc4, 0xae, 0xbe, 0x95, 0xa7, 0x9f, 0x5e, 0x9d, 0x15, 0xff, 0x7c, 0xc6, 0x57, 0x45, 0xc9, 0xca, 0xcd, 0xa0, 0xbf, 0x0b, 0xe0, 0x26, 0x34, 0xd7, 0x37, 0x2e, 0x30, 0xea, 0x2e, 0xfa, 0xfc, 0x34, 0x84, 0x9a, 0x7b, 0xdd, 0x53, 0x0c, 0xbd, 0x87, 0x46, 0xa8, 0xd2, 0xd3, 0x06, 0xbc, 0xdc, 0x26, 0xf5, 0x73, 0x68, 0xad, 0x1f, 0xfb, 0xff, 0x9e, 0x6e, 0xe6, 0xf7, 0xc1, 0x1d, 0xd1, 0x8f, 0x30, 0x6e, 0x44, 0x3c, 0x5b, 0xa0, 0xda, 0x3d, 0x4e, 0x1b, 0xa2, 0x75, 0x37, 0xef, 0xc4, 0x7a, 0x22, 0x7c, 0x68, 0xea, 0x08, 0x72, 0xd3, 0xfe, 0x08, 0xfd, 0xd3, 0x61, 0xf4, 0x39, 0x5e, 0x42, 0x0f, 0xec, 0x76, 0xa8, 0x15, 0x74, 0x4f, 0x05, 0x7c, 0xfe, 0xb4, 0x0f, 0xfa, 0xf9, 0xa7, 0xcb, 0x47, 0xcb, 0x48, 0xea, 0x24, 0xc2, 0xf8, 0x59, 0x9c, 0x4d, 0xbd, 0x14, 0x8a, 0x6c, 0xe8, 0x3b, 0x5b, 0x65, 0xf6, 0x67, 0x15, 0xb9, 0xb5, 0x3e, 0x98, 0x56, 0xa8, 0x45, 0x25, 0x0e, 0xab, 0xf6, 0x1c, 0x48, 0xda, 0x13, 0x0a, 0xf5, 0xb0, 0x39, 0xe2, 0xc6, 0x6c, 0xb8, 0x8b, 0x9c, 0xb9, 0xa2, 0x9b, 0x41, 0x8d, 0x22, 0x63, 0x55, 0x52, 0x0f, 0x2b, 0x8b, 0x44, 0xc1, 0xbe, 0x15, 0x1a, 0x24, 0x2a, 0x5c, 0xe8, 0x0a, 0xc1, 0xf5, 0x44, 0xc6, 0x63, 0xd0, 0xa8, 0xf6, 0x00, 0xb3, 0x17, 0xa0, 0x58, 0xe7, 0x03, 0x81, 0x05, 0x32, 0x6f, 0xa1, 0xbc, 0x05, 0x51, 0x2b, 0xd0, 0xf5, 0x3a, 0x7c, 0xf7, 0x6f, 0x38, 0x7a, 0x51, 0xa8, 0xfc, 0x27, 0xa6, 0xd4, 0x38, 0x76, 0xf0, 0x98, 0x4b, 0x5d, 0x19, 0xc1, 0x20, 0x2b, 0x05, 0x36, 0x53, 0x1c, 0xd3, 0x2b, 0x96, 0x2a, 0x60, 0x98, 0x54, 0x27, 0x0d, 0xea, 0x94, 0x09, 0xc3, 0xf8, 0x1f, 0x85, 0x34, 0x38, 0xe5, 0xdf, 0x63, 0x33, 0x9d, 0x00, 0x66, 0x36, 0xac, 0xc9, 0x6a, 0x4b, 0x48, 0xa7, 0xf9, 0x67, 0xdd, 0x67, 0x78, 0xe5, 0xaf, 0x4c, 0xf4, 0x33, 0xc2, 0x5f, 0x1e, 0xcc, 0xf7, 0x07, 0x93, 0x66, 0x77, 0xd9, 0x61, 0x6c, 0x54, 0xb1, 0xc7, 0xae, 0x6e, 0x02, 0x3d, 0x58, 0x94, 0x6a, 0xb4, 0x20, 0xec, 0x8a, 0x1f, 0xc4, 0x95, 0x14, 0x32, 0xb4, 0x8a, 0x25, 0x6a, 0x0b, 0xca, 0xd6, 0x4d, 0xc4, 0xb6, 0x0e, 0xf3, 0x2b, 0xba, 0x9a, 0xc5, 0x91, 0x2f, 0x7f, 0x85, 0x44, 0x80, 0x8e, 0x8f, 0xbf, 0x8c, 0x3a, 0x5e, 0x1d, 0x4c, 0xa7, 0x51, 0xd4, 0xb6, 0x03, 0xaf, 0x9f, 0xe1, 0x19, 0xea, 0xbc, 0x69, 0x23, 0x20, 0x58, 0x15, 0xe0, 0xe7, 0x48, 0xb7, 0xe7, 0x4a, 0xf9, 0x54, 0x3b, 0x0f, 0xaa, 0x85, 0x1f, 0x3c, 0xd8, 0x1d, 0x2c, 0xd9, 0xfa, 0x0c, 0xa0, 0xf6, 0x6f, 0x84, 0xf9, 0xf0, 0xb5, 0x5a, 0xc3, 0xf1, 0xdb, 0xae, 0xae, 0xb6, 0x39, 0xce, 0xe3, 0x95, 0x5e, 0x58, 0x98, 0xbe, 0x4a, 0x9f, 0xe2, 0xc1, 0xde, 0x50, 0xcb, 0x50, 0x90, 0x56, 0xa5, 0x46, 0x63, 0xfa, 0x9e, 0xe9, 0x17, 0x4f, 0x94, 0x6c, 0x9c, 0xcd, 0x2a, 0xb9, 0xcd, 0x3c, 0x1b, 0x6d, 0x5b, 0xd4, 0xce, 0x23, 0x07, 0xa2, 0x2b, 0xf5, 0x15, 0x2d, 0xae, 0x40, 0xfd, 0x5a, 0xb9, 0xa8, 0x63, 0x8d, 0x2f, 0x5c, 0x49, 0x11, 0x3e, 0x9b, 0x84, 0xba, 0x7c, 0x78, 0x6c, 0xc8, 0x36, 0xda, 0xd8, 0x0f, 0x04, 0xc6, 0x4a, 0x55, 0xa1, 0xe1, 0x66, 0xfc, 0xfa, 0x30, 0xa9, 0xe1, 0x85, 0x23, 0x57, 0x83, 0xd4, 0xd2, 0xb5, 0x68, 0x6a, 0x86, 0x79, 0xbc, 0xcd, 0x7b, 0x7f, 0x3c, 0xdd, 0xe4, 0xbd, 0x52, 0x63, 0x30, 0x79, 0x81, 0xed, 0x8c, 0xb9, 0x04, 0xda, 0xa9, 0xfc, 0xb2, 0xb1, 0xbf, 0x27, 0x25, 0xb7, 0xd2, 0xc2, 0x1b, 0xc0, 0x34, 0x64, 0x1c, 0x45, 0x4b, 0x6c, 0x5e, 0xb7, 0x94, 0xf2, 0xe5, 0x13, 0xe8, 0xfe, 0xee, 0xb7, 0xfe, 0xf7, 0x8e, 0x74, 0x32, 0x5e, 0x97, 0xe4, 0x84, 0xbc, 0xbb, 0xfd, 0xe4, 0xd8, 0xf4, 0xe7, 0xad, 0x2e, 0x23, 0x0b, 0x6f, 0x9d, 0xf7, 0x6d, 0xf1, 0x60, 0x10, 0x3b, 0x76, 0x3f, 0x64, 0xa6, 0x40, 0x06, 0xe2, 0xf0, 0x53, 0x37, 0x56, 0xc6, 0x7b, 0xfc, 0x8d, 0xd1, 0x90, 0x5f, 0xb9, 0x88, 0xf9, 0xbd, 0x16, 0x48, 0x6f, 0x78, 0xce, 0xa6, 0x03, 0xed, 0x1b, 0x04, 0x63, 0xa6, 0xab, 0x62, 0x59, 0xd0, 0x48, 0x77, 0x94, 0xef, 0xb8, 0x00, 0xab, 0xd0, 0xe2, 0x59, 0x5f, 0xbf, 0x33, 0x4a, 0x21, 0xfb, 0x40, 0x23, 0xd4, 0x67, 0xad, 0x0b, 0xd3, 0x82, 0x4d, 0x95, 0x36, 0x99, 0x8a, 0x94, 0x51, 0x3c, 0x08, 0x31, 0x7e, 0xee, 0x85, 0x3a, 0x1d, 0x20, 0x04, 0xbd, 0xd8, 0x61, 0x2a, 0xd6, 0x2c, 0xcf, 0xe8, 0xc5, 0x24, 0xd1, 0x5a, 0x43, 0x68, 0x08, 0xef, 0x17, 0x77, 0x82, 0xcb, 0xe4, 0x31, 0x31, 0x69, 0x45, 0x98, 0x9c, 0x85, 0x1b, 0xd7, 0xd5, 0x39, 0x26, 0x84, 0xab, 0x66, 0xd3, 0x22, 0x20, 0x55, 0x55, 0xea, 0x1e, 0x9e, 0xf7, 0xcb, 0x65, 0x49, 0xb1, 0xaf, 0xc8, 0x34, 0xf9, 0x00, 0x99, 0xb4, 0xdb, 0x6a, 0x62, 0x7f, 0x4c, 0xe3, 0xd5, 0xca, 0xbc, 0xe9, 0x06, 0xae, 0xea, 0x0b, 0xd8, 0xd0, 0xfc, 0xab, 0xb5, 0x41, 0xcf, 0x02, 0x83, 0xa3, 0x8c, 0x65, 0xd3, 0x8e, 0x7c, 0xc6, 0x5b, 0x32, 0x1d, 0x7d, 0xa6, 0x3d, 0x75, 0x49, 0x0a, 0xff, 0xa6, 0x91, 0xdb, 0xcb, 0xc3, 0xf0, 0xde, 0xa1, 0xe2, 0xf1, 0x00, 0x0b, 0x72, 0x17, 0x48, 0x45, 0xcf, 0x21, 0x0b, 0xa0, 0x14, 0x8b, 0x5f, 0x28, 0x31, 0x58, 0xd1, 0x85, 0x3d, 0x0f, 0x5b, 0x1f, 0x0d, 0x04, 0x90, 0x86, 0x05, 0xd8, 0x1a, 0x10, 0x2e, 0x43, 0x66, 0xc4, 0x89, 0x11, 0x9e, 0x76, 0xa3, 0x6b, 0xd8, 0x34, 0x6a, 0x58, 0x8d, 0xe1, 0x3f, 0x84, 0x4c, 0x20, 0x4c, 0x3f, 0xaf, 0x74, 0x18, 0xc8, 0x8f, 0xa5, 0x58, 0xcc, 0x74, 0x65, 0x09, 0x2a, 0x4f, 0x33, 0xbb, 0xf9, 0x6c, 0x80, 0x30, 0xcc, 0xa2, 0x10, 0x25, 0x34, 0xcd, 0xa4, 0x70, 0x87, 0x7e, 0xd6, 0x4b, 0xe0, 0xf0, 0x44, 0xf0, 0x67, 0x3e, 0xf0, 0x66, 0xd3, 0xd4, 0xe7, 0x9a, 0x2d, 0x23, 0x21, 0xb1, 0xd6, 0x9a, 0xa9, 0x9d, 0xcb, 0xd1, 0xfd, 0xee, 0x28, 0x07, 0xb8, 0xeb, 0xeb, 0xce, 0x6e, 0xe2, 0xfb, 0x05, 0xd8, 0xbc, 0x69, 0x07, 0x31, 0xd4, 0xf5, 0x22, 0xdf, 0x0a, 0xd4, 0x4b, 0x56, 0x13, 0xb0, 0x0f, 0x3a, 0x13, 0xf1, 0xcd, 0xc3, 0x6d, 0x3b, 0x23, 0x66, 0xd9, 0x37, 0xa6, 0xb2, 0xb8, 0x97, 0xd6, 0x78, 0xa5, 0x54, 0x51, 0x2e, 0x4d, 0x3a, 0x46, 0x95, 0x80, 0xa7, 0x2d, 0x9a, 0x88, 0x90, 0xb5, 0x7a, 0xb9, 0xc4, 0xfe, 0x2a, 0x49, 0x75, 0x09, 0xf6, 0x62, 0xf4, 0x6d, 0x68, 0x76, 0xbc, 0x4b, 0x6b, 0xd3, 0xb2, 0x83, 0xb0, 0x77, 0xab, 0x28, 0x51, 0x25, 0x2f, 0x32, 0xb5, 0xb8, 0x7d, 0x73, 0xb3, 0xb8, 0xce, 0xcd, 0xfa, 0x2b, 0xde, 0xa1, 0xb0, 0xad, 0xa9, 0x8a, 0x59, 0xc3, 0x72, 0x4c, 0xfb, 0x6d, 0x0a, 0x07, 0x7f, 0xfa, 0x4f, 0xb1, 0x5b, 0x20, 0xf3, 0xc2, 0x6e, 0x4c, 0x7f, 0x31, 0x2b, 0x37, 0x97, 0xa0, 0xfa, 0xba, 0x7f, 0xd4, 0xdb, 0xe3, 0xde, 0x67, 0x4d, 0x48, 0xc2, 0xc1, 0x6e, 0x9b, 0xe5, 0x44, 0x63, 0x7f, 0x2f, 0xc7, 0xfa, 0x9a, 0x7b, 0x46, 0x8e, 0xec, 0x9e, 0xd7, 0x2c, 0x5f, 0xa5, 0xe0, 0xf3, 0x9f, 0x5f, 0x88, 0xc1, 0x2b, 0x1c, 0x6b, 0x0c, 0xad, 0xb3, 0x92, 0x0d, 0x87, 0xca, 0xa2, 0x24, 0xae, 0x51, 0x53, 0x78, 0xbb, 0x50, 0x24, 0xde, 0x3f, 0xe3, 0x4e, 0xfc, 0x57, 0x82, 0xf6, 0xae, 0x81, 0x86, 0xa6, 0xa8, 0xae, 0xe9, 0xfe, 0x5d, 0x99, 0x4e, 0xa7, 0x20, 0x56, 0x41, 0x89, 0x89, 0x2e, 0xbf, 0x3e, 0x1b, 0xaa, 0xf9, 0xc6, 0x23, 0xee, 0x55, 0x7c, 0xe3, 0x48, 0xb6, 0x48, 0xf0, 0x09, 0xfd, 0x17, 0xd9, 0x94, 0xd0, 0x88, 0x09, 0xb4, 0x9a, 0xe8, 0xef, 0x33, 0xd2, 0x61, 0x5c, 0xa8, 0x81, 0x6e, 0x2c, 0x90, 0xfe, 0x92, 0x28, 0xa0, 0xfc, 0x4a, 0x2b, 0x5a, 0xc7, 0x40, 0x84, 0xdf, 0xcb, 0xc1, 0x9c, 0x04, 0x56, 0x71, 0xd9, 0xa7, 0x9f, 0x3e, 0xc1, 0x44, 0x06, 0x92, 0x63, 0xc3, 0x9d, 0xcd, 0xf2, 0x94, 0xe8, 0xf2, 0xb4, 0xfe, 0xe1, 0xa0, 0x1a, 0xb4, 0x3f, 0x45, 0x31, 0xaa, 0xf8, 0x8e, 0x39, 0x26, 0x05, 0x22, 0x92, 0x1a, 0x65, 0x8f, 0xe0, 0xb1, 0x64, 0x84, 0x67, 0x28, 0x1d, 0x42, 0xb7, 0xdf, 0x3e, 0x4d, 0x8e, 0xb0, 0x0b, 0x67, 0xfa, 0x7f, 0xa6, 0xbe, 0xbe, 0x12, 0x8d, 0x65, 0xf7, 0x23, 0x64, 0x01, 0xff, 0xb4, 0xf5, 0xc5, 0x92, 0xa3, 0x75, 0xa0, 0x2f, 0x7e, 0x08, 0xb4, 0xc1, 0x98, 0x88, 0x0b, 0x7f, 0x5d, 0x82, 0x85, 0x11, 0xe2, 0x82, 0x15, 0xf4, 0xc1, 0x91, 0x2d, 0x1f, 0x23, 0xfb, 0x77, 0xe7, 0x1e, 0x56, 0xc6, 0x20, 0x42, 0xbf, 0x4c, 0x85, 0x6e, 0x67, 0x0d, 0x5a, 0xe8, 0x4f, 0x93, 0x4f, 0xad, 0x4f, 0xe4, 0xa8, 0x06, 0x5d, 0xb1, 0x9b, 0x5c, 0x0c, 0xd0, 0xf9, 0x4d, 0x53, 0xed, 0x11, 0x00, 0x90, 0x7c, 0xd2, 0xb5, 0xcc, 0xf1, 0x2f, 0xa0, 0x41, 0x34, 0xc8, 0xf7, 0x19, 0x4f, 0xc6, 0x4a, 0x79, 0x6a, 0x06, 0x13, 0xbe, 0xfa, 0x7b, 0x8e, 0x07, 0x35, 0xcd, 0xca, 0xf3, 0xc9, 0x46, 0x00, 0xac, 0xcd, 0xef, 0x25, 0x24, 0xf8, 0xf6, 0xbb, 0x9e, 0x11, 0x53, 0xec, 0x71, 0xa6, 0xab, 0xd9, 0x08, 0x01, 0x75, 0x30, 0x2e, 0x58, 0x5b, 0xfc, 0x88, 0x44, 0xe3, 0xc2, 0x63, 0x74, 0x4e, 0xc9, 0xb1, 0xa3, 0xc1, 0xb9, 0x4d, 0xc7, 0xa2, 0x68, 0x87, 0x8c, 0x45, 0xf0, 0xdc, 0x00, 0xc8, 0x05, 0x05, 0x90, 0x3b, 0x85, 0x34, 0x33, 0x04, 0x51, 0x9a, 0xe5, 0x82, 0x5c, 0x2c, 0x57, 0xf1, 0x01, 0xa7, 0xe5, 0x8e, 0x9a, 0xd1, 0xc8, 0xfb, 0x4e, 0x02, 0x8d, 0xe4, 0x2a, 0xe4, 0xc5, 0xe3, 0x73, 0x77, 0xff, 0xa1, 0x3b, 0x58, 0xf3, 0x3f, 0x33, 0x42, 0x00 ],
+    const [ 0x18, 0xdf, 0x82, 0xa5, 0x4c, 0x94, 0xb4, 0x56, 0x9b, 0xbf, 0x2c, 0x4a, 0xf0, 0x72, 0x3e, 0xd1, 0x67, 0x26, 0x15, 0xb9, 0xa8, 0xb7, 0xa6, 0x72, 0x74, 0xb0, 0xe6, 0x70, 0x7d, 0xc9, 0x3b, 0xd1, 0x7b, 0xae, 0x31, 0x40, 0x7c, 0x02, 0x6f, 0x19, 0x7b, 0xa4, 0xe9, 0xcd, 0x35, 0x31, 0x57, 0x89, 0x38, 0xca, 0xe5, 0x12, 0x3d, 0x17, 0x2c, 0xf4, 0xb7, 0x8b, 0x61, 0xdb, 0xac, 0xea, 0xcc, 0x41, 0xc4, 0x09, 0x7c, 0x49, 0xa0, 0xd6, 0x3a, 0xeb, 0x6c, 0x97, 0xbb, 0x52, 0xb8, 0x77, 0x1a, 0x82, 0x83, 0x3e, 0x85, 0x3e, 0x99, 0x60, 0x36, 0x29, 0x20, 0x39, 0xa4, 0x2b, 0x6d, 0x97, 0xfb, 0x16, 0x1c, 0x79, 0xca, 0x8a, 0x5f, 0x16, 0xfc, 0x16, 0x96, 0x21, 0x0a, 0x9f, 0x20, 0x4c, 0x6f, 0x06, 0x71, 0x0b, 0x5b, 0x05, 0x65, 0x9a, 0xab, 0x5a, 0xd4, 0x41, 0x19, 0x28, 0x67, 0xd7, 0xb0, 0x9a, 0xaa, 0x85, 0x84, 0xc9, 0x62, 0xcc, 0x9f, 0xe0, 0x20, 0xc9, 0x3e, 0x7e, 0x16, 0xb8, 0x3e, 0x5b, 0x2a, 0xb8, 0xd1, 0x2f, 0x49, 0xcd, 0x75, 0xcf, 0xfe, 0x2b, 0x27, 0x99, 0x43, 0xb2, 0xd3, 0x13, 0x97, 0xb5, 0x10, 0xcf, 0x50, 0xff, 0x0a, 0x92, 0x33, 0x18, 0xbf, 0xb4, 0x42, 0xc4, 0x6f, 0xca, 0xd5, 0xcd, 0x4d, 0x83, 0xec, 0x02, 0x7b, 0xd0, 0xc4, 0x80, 0x35, 0x48, 0xa8, 0x30, 0x4d, 0xca, 0x0a, 0x91, 0xd7, 0x64, 0xd2, 0xb8, 0x25, 0x73, 0xf6, 0x95, 0xf6, 0x0c, 0x4b, 0x77, 0xea, 0x9b, 0x9b, 0xd2, 0x39, 0xca, 0xf7, 0x41, 0xa5, 0xa5, 0x4e, 0xc7, 0xad, 0xfb, 0x3f, 0x5a, 0x04, 0x07, 0x2c, 0xa2, 0x41, 0x4f, 0x90, 0xfe, 0xd8, 0xcd, 0x92, 0xc8, 0x49, 0x4d, 0xda, 0xda, 0x97, 0x16, 0xa3, 0x50, 0xfc, 0xcc, 0x11, 0x90, 0xdb, 0x95, 0xc5, 0x88, 0xf6, 0x7b, 0xb0, 0x37, 0xe1, 0x12, 0x24, 0x6f, 0xb7, 0x5a, 0x31, 0xd9, 0x0b, 0xe6, 0x2e, 0x39, 0x21, 0x3e, 0x96, 0xf3, 0x5e, 0x83, 0x16, 0xcf, 0xfe, 0x51, 0xe3, 0xf9, 0x05, 0xe9, 0x51, 0x4c, 0x78, 0x90, 0xa2, 0xcf, 0xcc, 0x32, 0x1b, 0x80, 0x9f, 0x4b, 0x5e, 0x51, 0xa6, 0x08, 0xf3, 0x71, 0xe7, 0xa9, 0x28, 0xcc, 0x28, 0x29, 0x1b, 0xd5, 0xa7, 0x21, 0x15, 0x83, 0x0b, 0xea, 0x19, 0x99, 0x9b, 0x01, 0xbd, 0x2b, 0xae, 0xb0, 0x39, 0x5e, 0x62, 0xeb, 0xbe, 0x6f, 0x91, 0x79, 0x09, 0xf7, 0x01, 0x54, 0x37, 0x6d, 0xdb, 0x51, 0xdb, 0xec, 0x5f, 0x03, 0x4e, 0x36, 0xd5, 0xdd, 0x46, 0xfa, 0xc7, 0x98, 0xaa, 0x52, 0x6d, 0xd4, 0xa5, 0x90, 0x69, 0x02, 0xfa, 0x3a, 0xb5, 0x81, 0x97, 0x53, 0xd9, 0x07, 0x6c, 0xdc, 0x61, 0x43, 0x7d, 0x9b, 0x8e, 0xc1, 0x36, 0x1b, 0x4c, 0x0d, 0xff, 0xf4, 0x64, 0x1b, 0x11, 0x4c, 0xf3, 0xe6, 0x88, 0x9e, 0x1b, 0x58, 0xb9, 0xbb, 0xf8, 0x6a, 0xc5, 0x0e, 0xd5, 0x8c, 0x6f, 0x23, 0xa0, 0x47, 0x2a, 0x6b, 0x9c, 0x21, 0x76, 0x39, 0x56, 0xc1, 0x6d, 0x11, 0xda, 0x53, 0x99, 0x22, 0x26, 0x2e, 0x09, 0x11, 0xdf, 0xb4, 0xa4, 0xf8, 0x43, 0x7a, 0xbd, 0xaf, 0x5f, 0xaa, 0xe7, 0x4a, 0x82, 0xa5, 0x0a, 0xe2, 0xf1, 0xec, 0xb6, 0x99, 0xdc, 0x40, 0xb8, 0xd8, 0x91, 0x08, 0xeb, 0xdb, 0xf0, 0xf4, 0x51, 0x70, 0x1f, 0xe0, 0x62, 0xfb, 0x7f, 0xfb, 0xa4, 0xbe, 0xde, 0x28, 0x7c, 0x57, 0xee, 0xa4, 0x44, 0x8a, 0xf5, 0xe9, 0x9d, 0x41, 0xc7, 0xd3, 0x07, 0xd1, 0xf2, 0x02, 0xaf, 0x7f, 0x38, 0x7f, 0x87, 0x43, 0x42, 0xa2, 0x9c, 0xcc, 0x92, 0x33, 0xa5, 0xc3, 0xba, 0xcf, 0xd7, 0x54, 0xcb, 0x8d, 0x01, 0xeb, 0x11, 0xe2, 0xd4, 0x3b, 0xfd, 0xc2, 0x82, 0x85, 0x63, 0x08, 0x8c, 0x17, 0xe6, 0x18, 0xd4, 0x13, 0xb0, 0xc3, 0xfa, 0x71, 0x66, 0x6b, 0xe5, 0x47, 0x5a, 0x67, 0xa0, 0x48, 0x03, 0xa8, 0x68, 0x8b, 0xab, 0x9d, 0x03, 0x8f, 0x68, 0x55, 0x53, 0x7b, 0x4d, 0xe4, 0x2a, 0xaa, 0xe1, 0x07, 0x60, 0x66, 0xd0, 0x0b, 0x23, 0xf4, 0xe1, 0xea, 0x8f, 0xd2, 0x28, 0xb8, 0x7e, 0x3c, 0x7d, 0x3d, 0xa2, 0xf4, 0x2d, 0xe4, 0xd1, 0x43, 0xef, 0xd4, 0x9f, 0x3b, 0x19, 0x5c, 0x32, 0x40, 0x13, 0x94, 0x52, 0xc7, 0x0c, 0x41, 0xc0, 0x5c, 0xed, 0xfa, 0xc9, 0xea, 0x8b, 0x89, 0x1a, 0x37, 0x21, 0x94, 0xd6, 0xae, 0xfd, 0x7d, 0xe6, 0x61, 0x79, 0x86, 0x91, 0x4e, 0x2d, 0x39, 0x4c, 0xe1, 0x63, 0x07, 0xd3, 0xbb, 0xcb, 0x2f, 0x78, 0xb2, 0x71, 0xe1, 0xbb, 0x19, 0xeb, 0xa3, 0x1c, 0x41, 0xd7, 0xf5, 0x2d, 0x3f, 0x85, 0x30, 0xeb, 0xf0, 0xf0, 0xb4, 0x4e, 0x3b, 0xf3, 0x42, 0x1f, 0x96, 0xb9, 0xa7, 0x0a, 0xcc, 0x76, 0x9b, 0xf4, 0xfd, 0x54, 0xe8, 0x8f, 0xe6, 0xb1, 0xcf, 0x2b, 0x62, 0x87, 0xa7, 0xcf, 0x31, 0x2b, 0xc7, 0x88, 0xf9, 0x3b, 0xa6, 0x01, 0x8a, 0xd1, 0x41, 0x54, 0x66, 0xfd, 0xbd, 0x20, 0x81, 0x73, 0x4e, 0xdc, 0x45, 0x80, 0x57, 0x6a, 0xd9, 0x43, 0xd3, 0xef, 0xa3, 0x19, 0xf3, 0xe3, 0x0c, 0x59, 0x08, 0x64, 0x83, 0x42, 0xa4, 0xd0, 0xc4, 0x31, 0xfc, 0x92, 0x5a, 0x17, 0x91, 0x3c, 0x62, 0x2b, 0x10, 0xd7, 0x93, 0xdc, 0x76, 0x76, 0x7b, 0x0a, 0x77, 0x12, 0x0b, 0x75, 0x21, 0x91, 0x56, 0x76, 0xbd, 0x28, 0x96, 0xed, 0xf6, 0xe3, 0x70, 0x7a, 0x3d, 0x82, 0x79, 0xf0, 0x6b, 0x87, 0xf8, 0x06, 0xa8, 0x8d, 0xee, 0x50, 0x8c, 0xdb, 0x53, 0x6e, 0x85, 0x39, 0xa3, 0x84, 0x79, 0x03, 0x99, 0xea, 0xac, 0x7b, 0x3a, 0x24, 0xe3, 0x63, 0x16, 0x14, 0xca, 0xcc, 0xcb, 0x6e, 0x93, 0x29, 0xca, 0x6d, 0xe0, 0xa7, 0x5e, 0xc4, 0xe3, 0xc1, 0xea, 0xd8, 0xc3, 0x0e, 0x72, 0x2c, 0x42, 0x5e, 0x5c, 0x1c, 0x9e, 0x06, 0x78, 0xcf, 0xb4, 0x78, 0x3f, 0x67, 0x6b, 0x17, 0x58, 0x7a, 0x50, 0x49, 0x61, 0xc6, 0x7e, 0xcd, 0xeb, 0x20, 0xc1, 0x4f, 0xc6, 0xae, 0xfb, 0x39, 0x80, 0x56, 0xc6, 0xcd, 0x28, 0x76, 0x5a, 0x71, 0x57, 0xd6, 0xb2, 0x49, 0x72, 0xdb, 0xea, 0x0b, 0x29, 0xfd, 0xec, 0x0f, 0x43, 0x7a, 0x4b, 0xa6, 0x9e, 0x4c, 0x6f, 0xad, 0x71, 0x59, 0xf3, 0x62, 0xd5, 0xeb, 0x4b, 0x76, 0x84, 0x5f, 0xaa, 0x63, 0xe0, 0x21, 0x22, 0xff, 0x37, 0xd8, 0x0e, 0x51, 0x45, 0xdd, 0xad, 0xa4, 0xfa, 0xf2, 0x0f, 0xdb, 0x7e, 0x31, 0x35, 0x04, 0x73, 0x42, 0x74, 0x30, 0x7a, 0xd1, 0x1a, 0x81, 0xf8, 0x3f, 0x54, 0x84, 0x1a, 0x98, 0x4f, 0xc1, 0x16, 0xc6, 0x9e, 0x91, 0xb4, 0x04, 0xdc, 0x30, 0x0e, 0x95, 0x92, 0x13, 0x93, 0xb5, 0x5a, 0x7c, 0x52, 0xd0, 0x45, 0x4b, 0x76, 0xf2, 0x7b, 0x17, 0x0c, 0x7f, 0x21, 0x7d, 0x0d, 0x24, 0x80, 0xb8, 0x98, 0x0d, 0x63, 0x72, 0x7f, 0x58, 0xc0, 0xda, 0x05, 0xca, 0x9b, 0xf7, 0xe6, 0xc1, 0x28, 0x3c, 0x98, 0x6a, 0x30, 0x5c, 0xd1, 0x34, 0xb5, 0x60, 0x49, 0x85, 0xd9, 0xf6, 0xc1, 0xab, 0xfc, 0x0c, 0x44, 0x15, 0x25, 0x9d, 0xad, 0xc3, 0xa3, 0xcb, 0x69, 0xfb, 0xf4, 0x2f, 0x7e, 0x3e, 0xe5, 0x6d, 0xcc, 0x7a, 0xfb, 0x0b, 0x93, 0x81, 0x12, 0x83, 0x36, 0xba, 0x44, 0x96, 0x3f, 0x16, 0x0c, 0xe4, 0xa2, 0x46, 0xab, 0xba, 0x46, 0x2c, 0xcb, 0x2b, 0xc1, 0x8f, 0x63, 0x62, 0x64, 0x12, 0xda, 0x36, 0x77, 0x67, 0x6f, 0xff, 0xc5, 0xc0, 0xd8, 0xa8, 0x5c, 0x86, 0x29, 0x06, 0x8e, 0x4e, 0xf8, 0x68, 0x3b, 0x09, 0xbf, 0x70, 0x53, 0x7a, 0x81, 0x21, 0x96, 0xee, 0xb1, 0x38, 0x9e, 0x27, 0x4f, 0xc0, 0x20, 0x99, 0x54, 0xe1, 0x6f, 0xd9, 0x50, 0xf9, 0x41, 0x52, 0x52, 0xee, 0xb6, 0x3a, 0x08, 0xc2, 0x96, 0xc4, 0x27, 0x67, 0xda, 0x97, 0x0d, 0xd5, 0x6f, 0x80, 0xa6, 0x5b, 0x36, 0x63, 0x8c, 0x32, 0x4f, 0x78, 0x72, 0x58, 0x97, 0xb3, 0xc2, 0x9b, 0x6f, 0x84, 0x85, 0xf4, 0xc0, 0xc1, 0x84, 0x17, 0x3c, 0xe1, 0xac, 0x48, 0xe6, 0x6a, 0xb7, 0x70, 0xd4, 0xac, 0x09, 0x70, 0x33, 0xb0, 0xd8, 0xb5, 0x8d, 0x6c, 0x90, 0x0d, 0x47, 0x38, 0x76, 0xb9, 0x6e, 0x86, 0x8b, 0xc3, 0xb3, 0xcd, 0xb3, 0x92, 0xb3, 0xc6, 0x16, 0xbb, 0x7c, 0xdb, 0xc7, 0x1a, 0x4d, 0xdd, 0xa4, 0x22, 0x9e, 0xf5, 0x7d, 0x71, 0x60, 0xdd, 0x78, 0xa7, 0x86, 0x4f, 0xb3, 0x79, 0xc4, 0xbe, 0x2c, 0x01, 0x97, 0x45, 0xde, 0x58, 0x85, 0xdd, 0x2d, 0x67, 0xa6, 0xd2, 0x84, 0xfa, 0x63, 0x78, 0x3d, 0x16, 0x7e, 0x1a, 0xc1, 0x8d, 0x53, 0x33, 0xf0, 0xcf, 0x5d, 0xe0, 0xc3, 0x03, 0xfb, 0x96, 0x2f, 0x57, 0x74, 0x10, 0x4d, 0x94, 0x39, 0x8c, 0xb9, 0xf5, 0x6b, 0x37, 0x38, 0x39, 0x9d, 0xe6, 0x9d, 0xf7, 0xdb, 0x06, 0xed, 0x32, 0xeb, 0xd6, 0xc1, 0x2d, 0xd2, 0xd4, 0xec, 0x80, 0x9b, 0x74, 0x5e, 0x6c, 0x53, 0x18, 0x48, 0x6c, 0x58, 0x3d, 0x81, 0x0c, 0xd4, 0xf2, 0x29, 0xfe, 0x84, 0x8f, 0x8c, 0x6b, 0xbe, 0xa3, 0x48, 0x87, 0xb2, 0x2e, 0xb3, 0x68, 0xf0, 0x11, 0x77, 0x18, 0x2a, 0xc2, 0x7f, 0xe9, 0x3b, 0x44, 0x17, 0x08, 0x69, 0x57, 0x4e, 0x55, 0xe7, 0xec, 0x9f, 0x72, 0x9e, 0xdb, 0xd1, 0x1a, 0x2e, 0xd8, 0x1c, 0xb5, 0x2f, 0xa4, 0x8d, 0x29, 0xbc, 0x80, 0xac, 0xf2, 0x32, 0xe7, 0x5b, 0x75, 0x35, 0x7c, 0x01, 0x91, 0xf4, 0x42, 0xe8, 0x78, 0xae, 0x0b, 0xe4, 0xbd, 0x76, 0x33, 0x36, 0xae, 0x33, 0x8d, 0xaf, 0xe3, 0xea, 0x9e, 0x19, 0x17, 0x40, 0x09, 0xd2, 0x37, 0x3a, 0x4b, 0xba, 0xb9, 0x48, 0xa8, 0x4f, 0x2f, 0x82, 0x65, 0x17, 0x1c, 0x31, 0x38, 0x3f, 0x06, 0x91, 0xfd, 0x81, 0xcc, 0xd5, 0xaa, 0x4b, 0x3a, 0x6c, 0x85, 0x1d, 0xdb, 0x83, 0x95, 0x32, 0x0e, 0xcb, 0x56, 0x64, 0x5c, 0x7c, 0xb1, 0x4a, 0x09, 0x9a, 0x2a, 0xa3, 0xe9, 0x77, 0x5c, 0xf7, 0x75, 0x79, 0xa2, 0x7b, 0x1e, 0x1d, 0x18, 0x36, 0xe2, 0x3c, 0xc2, 0x62, 0x1c, 0x8d, 0x0a, 0x15, 0xa0, 0x6c, 0x70, 0x20, 0x07, 0xd9, 0x7d, 0x37, 0x48, 0xc4, 0xf8, 0x53, 0x89, 0x88, 0x5d, 0x55, 0x34, 0xb5, 0x8b, 0xec, 0x4c, 0x12, 0xbd, 0xb8, 0x02, 0xe2, 0xbb, 0xb0, 0x83, 0x67, 0x52, 0xc1, 0x15, 0xa5, 0x01, 0xb7, 0x62, 0x68, 0xf5, 0x61, 0x13, 0x88, 0x38, 0xf0, 0xa1, 0x6c, 0x25, 0xa1, 0x68, 0xcd, 0x1f, 0x9c, 0xfe, 0xbc, 0x82, 0x1b, 0xc2, 0xe7, 0xda, 0xce, 0xb8, 0x18, 0x53, 0x7f, 0x94, 0xfe, 0x71, 0xf2, 0x14, 0x30, 0x01, 0x0f, 0x93, 0x6f, 0x50, 0x42, 0xdc, 0x2b, 0x9a, 0x23, 0x3c, 0x49, 0xc5, 0x52, 0xdb, 0x24, 0x4f, 0xa5, 0x4b, 0xd2, 0x86, 0x86, 0x62, 0xa8, 0xf7, 0x96, 0x45, 0x00, 0x28, 0x97, 0xc6, 0x39, 0x8a, 0x88, 0xf0, 0x00, 0xa9, 0x11, 0xdf, 0xce, 0xa6, 0x22, 0xd6, 0xb2, 0xe7, 0xd8, 0x8b, 0x51, 0x0d, 0xa0, 0xc5, 0x2b, 0x26, 0x9e, 0x29, 0x20, 0x24, 0x50, 0x51, 0x32, 0x8f, 0x6e, 0x1f, 0x8c, 0x76, 0x15, 0x51, 0xc4, 0xab, 0x25, 0x55, 0x5d, 0x30, 0xe8, 0x5e, 0x90, 0xec, 0xf4, 0xb7, 0x4b, 0xa2, 0x52, 0x58, 0x7b, 0x24, 0xdf, 0xb7, 0x87, 0xc4, 0xf3, 0xe0, 0x1c, 0x0c, 0x41, 0xc8, 0x30, 0xaf, 0xfe, 0xde, 0x41, 0xbe, 0x46, 0xe4, 0xde, 0x1f, 0xbb, 0xfd, 0x69, 0x3c, 0x6f, 0x07, 0x1b, 0xf8, 0x04, 0x2a, 0x48, 0xe7, 0x11, 0xb1, 0xe5, 0xbe, 0xc8, 0x19, 0x47, 0x08, 0xd6, 0x68, 0x2d, 0x1b, 0x8b, 0xc1, 0x01, 0x4b, 0x3b, 0x34, 0x5b, 0x5d, 0xe4, 0xda, 0xc7, 0x3f, 0x10, 0x22, 0xc8, 0xf6, 0xfd, 0x66, 0x1d, 0xd7, 0xfc, 0xc2, 0x42, 0xfa, 0x17, 0x25, 0x3a, 0xec, 0xf6, 0xa8, 0x8c, 0xa4, 0x04, 0x1f, 0x8c, 0xb8, 0xcd, 0xee, 0xdb, 0xd1, 0xaa, 0x1f, 0x31, 0x5d, 0xa1, 0xb1, 0x5a, 0x83, 0x87, 0x32, 0x7f, 0x5c, 0x67, 0x90, 0xa7, 0x60, 0x28, 0x2c, 0x7d, 0x1e, 0x69, 0x30, 0x54, 0x31, 0xb0, 0x23, 0x68, 0x6f, 0xc4, 0xba, 0x67, 0x63, 0x57, 0xf1, 0x30, 0xfe, 0xe8, 0x5b, 0xda, 0x89, 0xe8, 0xb6, 0xf8, 0xde, 0x1c, 0xc3, 0x1b, 0xd8, 0x42, 0x55, 0x99, 0x08, 0xf7, 0xa7, 0x8d, 0xa9, 0xd8, 0xf2, 0x1f, 0xd6, 0xe8, 0x3f, 0x06, 0xfb, 0x32, 0x7a, 0x4b, 0x8a, 0xaf, 0xc9, 0x4f, 0xef, 0x69, 0x1c, 0x0f, 0xc5, 0xe1, 0x04, 0xa7, 0x4a, 0xae, 0xc8, 0x15, 0x10, 0x68, 0xb6, 0x40, 0xf6, 0xc4, 0xb7, 0x39, 0x57, 0x00, 0x26, 0xc0, 0x81, 0x82, 0xe2, 0x0a, 0x69, 0xbc, 0xa2, 0xc1, 0x9d, 0x52, 0x89, 0x4d, 0x79, 0x7f, 0xfb, 0x52, 0x9e, 0xb5, 0xae, 0x79, 0xa0, 0x83, 0x04, 0x74, 0xff, 0xbc, 0x98, 0x3c, 0x59, 0xd6, 0x16, 0x9d, 0xdd, 0x90, 0x51, 0xf5, 0x03, 0xd7, 0x8f, 0x39, 0x7a, 0xeb, 0x27, 0x38, 0x62, 0xbe, 0x4f, 0x24, 0xbc, 0x9d, 0x2f, 0x4e, 0x1f, 0x11, 0x3a, 0x31, 0xac, 0x08, 0xbd, 0xb2, 0x44, 0x30, 0xb8, 0xa6, 0xf8, 0xa4, 0xee, 0x95, 0xc0, 0xca, 0x38, 0xbd, 0x70, 0x7b, 0x1e, 0x5a, 0xe9, 0x65, 0xa8, 0x25, 0x8c, 0xae, 0x72, 0x1b, 0xf5, 0xda, 0xff, 0x7f, 0xe5, 0xef, 0x4f, 0x22, 0x7f, 0xd7, 0xb4, 0xe2, 0xb8, 0x05, 0xe1, 0x71, 0x09, 0x5c, 0x44, 0x58, 0x66, 0x4c, 0x96, 0x3b, 0x74, 0x3e, 0xb0, 0x5e, 0xf7, 0x32, 0xa0, 0x68, 0x89, 0xa6, 0xfc, 0x67, 0x92, 0xba, 0x76, 0x15, 0x74, 0x93, 0xb1, 0x5a, 0x06, 0xfd, 0x53, 0x11, 0x44, 0x54, 0x5c, 0x0f, 0x45, 0xa4, 0xb6, 0x61, 0x6d, 0x0f, 0x0c, 0xd6, 0xe3, 0x6f, 0xe0, 0xbe, 0x45, 0x3d, 0xd8, 0xf0, 0x9b, 0xb2, 0x59, 0x12, 0x8a, 0x2b, 0x57, 0x14, 0xcb, 0xd2, 0x6c, 0xfe, 0xdb, 0x7b, 0x27, 0xec, 0xf3, 0xcc, 0xa6, 0x56, 0x3a, 0xa1, 0x67, 0x95, 0x3a, 0xae, 0x5b, 0xa3, 0x90, 0x67, 0x3c, 0x23, 0xe8, 0x1c, 0x21, 0xa1, 0x29, 0x69, 0x50, 0x1a, 0xed, 0xcd, 0x53, 0xbf, 0x34, 0x99, 0x4e, 0xf6, 0x59, 0x0c, 0x8f, 0xa2, 0x45, 0xbc, 0x67, 0xa4, 0xe2, 0x37, 0x38, 0xa2, 0xd2, 0xeb, 0xd0, 0x06, 0x62, 0x43, 0xf5, 0x4a, 0xb9, 0x13, 0x41, 0x74, 0x56, 0x36, 0x31, 0xdc, 0xb9, 0x76, 0x78, 0x35, 0x5f, 0xab, 0x99, 0xcb, 0xf4, 0x27, 0xb4, 0x0a, 0xc5, 0x52, 0xa0, 0x40, 0x74, 0x92, 0x3b, 0xa4, 0xef, 0x6e, 0xfe, 0x96, 0xa2, 0xf2, 0xd5, 0x28, 0xec, 0x55, 0x2d, 0xde, 0xd0, 0xd9, 0x4e, 0xb2, 0xee, 0xf3, 0xeb, 0x5b, 0xb1, 0xac, 0xf7, 0xcf, 0xc9, 0x47, 0xbb, 0x07, 0xdc, 0x24, 0x26, 0x02, 0x78, 0xe4, 0x64, 0x0c, 0x4d, 0xce, 0xb2, 0x40, 0x99, 0x71, 0x70, 0x4c, 0xe3, 0x8b, 0x77, 0x74, 0xec, 0x2a, 0xae, 0xda, 0xe3, 0x11, 0xd8, 0xfc, 0xd8, 0x5d, 0xb0, 0x7e, 0x73, 0x69, 0x38, 0x2a, 0xe6, 0xee, 0x4e, 0x35, 0x20, 0x6f, 0x80, 0xc3, 0x43, 0xd4, 0x21, 0xae, 0x59, 0x55, 0x9c, 0x83, 0x43, 0x99, 0x09, 0xce, 0xf1, 0x1f, 0xfe, 0x98, 0xd9, 0xde, 0xa8, 0x2d, 0xa1, 0x28, 0x1a, 0x23, 0x1f, 0xd4, 0xe4, 0x97, 0x84, 0x9c, 0xe8, 0xba, 0xd4, 0xc4, 0x69, 0x8d, 0x9a, 0xfd, 0x65, 0xe8, 0xd9, 0x88, 0x25, 0xc1, 0x45, 0x9e, 0x12, 0xab, 0xb3, 0x10, 0xca, 0x9d, 0xcf, 0x2b, 0x73, 0xf5, 0x0d, 0xde, 0x50, 0xbc, 0xe2, 0x1f, 0x91, 0x2c, 0x33, 0x8a, 0x70, 0x6f, 0x0e, 0x4b, 0x79, 0xaa, 0x98, 0x3f, 0x29, 0x3a, 0x46, 0x56, 0xbb, 0x3e, 0x50, 0x3c, 0x3f, 0x55, 0x63, 0x38, 0xec, 0xa9, 0x97, 0x54, 0xb7, 0x2c, 0xa0, 0xbe, 0x25, 0x21, 0x48, 0x6e, 0x5d, 0xdf, 0x1d, 0x09, 0x81, 0xd1, 0x66, 0x05, 0x3e, 0xc2, 0x5c, 0x0f, 0xa2, 0x57, 0x97, 0xa9, 0x2e, 0xdd, 0xc7, 0x18, 0x2d, 0x45, 0xa4, 0x7d, 0x44, 0x6d, 0x28, 0x42, 0x49, 0xa2, 0xfb, 0xb7, 0x58, 0x62, 0x2f, 0xfd, 0x24, 0x66, 0x2d, 0x24, 0x8c, 0xe0, 0xef, 0x90, 0x6f, 0x01, 0x70, 0xa1, 0xc0, 0xbe, 0x61, 0x93, 0xdd, 0xd4, 0x1e, 0xa2, 0x1c, 0x09, 0xe0, 0x72, 0xa7, 0xb5, 0x34, 0xaf, 0x8b, 0x82, 0xac, 0xf0, 0x0b, 0x70, 0xd4, 0xe2, 0x3a, 0x1c, 0x67, 0xa2, 0xc9, 0x41, 0xc3, 0x6a, 0x1d, 0x7f, 0x9b, 0x70, 0xa4, 0x5b, 0xec, 0x0b, 0x6a, 0x88, 0x32, 0x18, 0xe7, 0x65, 0xdb, 0x9c, 0x1c, 0xc6, 0xfc, 0xab, 0xde, 0xf7, 0x43, 0x88, 0x71, 0xfe, 0x2d, 0x0d, 0x58, 0x21, 0x78, 0x4d, 0x6c, 0xa8, 0xdc, 0x79, 0x2c, 0xe4, 0xf6, 0x00, 0x54, 0x70, 0x85, 0xfa, 0xb1, 0xb7, 0xd8, 0xc7, 0x33, 0xb6, 0x87, 0xf3, 0x44, 0x04, 0x62, 0x5d, 0x58, 0x0f, 0xa7, 0x99, 0xc5, 0xa8, 0x78, 0x92, 0xd6, 0xc2, 0x8b, 0x74, 0x1a, 0x76, 0x24, 0xc9, 0x02, 0x4b, 0x40, 0xe2, 0xab, 0xb5, 0x13, 0x78, 0xf9, 0xdb, 0xb5, 0x93, 0xe5, 0x9d, 0x19, 0xab, 0x18, 0xd6, 0x3e, 0x0d, 0xb8, 0xde, 0xa9, 0x81, 0x82, 0x54, 0x12, 0x2a, 0x19, 0x1a, 0x5e, 0xad, 0x9d, 0xa0, 0xcd, 0x96, 0x80, 0x66, 0x75, 0xf7, 0x95, 0xbc, 0xef, 0x51, 0x6a, 0xcd, 0x50, 0xb8, 0xd8, 0xdb, 0x5a, 0x33, 0xd8, 0xcc, 0xf4, 0x62, 0x98, 0xe6, 0xd8, 0x63, 0xcf, 0xd7, 0x8c, 0xf5, 0x4d, 0xf8, 0x93, 0xde, 0xd6, 0xd2, 0xe4, 0x8b, 0x30, 0xe2, 0x9b, 0xf7, 0x7b, 0x99, 0xef, 0xce, 0xc1, 0xa7, 0x64, 0xd1, 0xce, 0x79, 0x41, 0x7c, 0x42, 0x00, 0x45, 0xe6, 0xe4, 0xb5, 0x96, 0xea, 0x39, 0xda, 0xfa, 0x84, 0x56, 0x02, 0x49, 0x7d, 0xf2, 0xd3, 0x23, 0x4b, 0xbf, 0x0b, 0xde, 0x33, 0xfb, 0xc1, 0xc2, 0xb0, 0x41, 0xee, 0x79, 0x18, 0xa6, 0x2b, 0xc1, 0x7d, 0x01, 0xbc, 0x64, 0xd1, 0x8a, 0xce, 0x6a, 0x4e, 0xa7, 0xfd, 0x8d, 0x15, 0x02, 0x19, 0xed, 0x16, 0xdf, 0x2a, 0x05, 0x2f, 0xad, 0xb1, 0xde, 0x98, 0xda, 0x31, 0x82, 0x7e, 0xec, 0xee, 0xb4, 0xee, 0xce, 0xf5, 0xde, 0xf5, 0x67, 0x5c, 0x4b, 0x06, 0x71, 0xcb, 0x96, 0x9b, 0x89, 0x3c, 0x63, 0x1f, 0x82, 0xfe, 0x4c, 0x0c, 0xff, 0x00, 0x1f, 0x51, 0x41, 0x4c, 0x46, 0xf6, 0x3d, 0xd2, 0x86, 0x02, 0xf2, 0x67, 0xed, 0x9d, 0xf9, 0x0d, 0x05, 0x72, 0x5e, 0x75, 0x4e, 0x57, 0xae, 0xc2, 0xeb, 0x30, 0x51, 0x90, 0x9c, 0x10, 0x1a, 0x35, 0xec, 0xa2, 0x1d, 0x46, 0xac, 0xc8, 0xc1, 0x5e, 0x9f, 0x81, 0x16, 0x1a, 0x77, 0x10, 0x68, 0x68, 0x00, 0x5b, 0x14, 0x02, 0x9c, 0x91, 0x9a, 0x35, 0xef, 0x0f, 0xf4, 0xe7, 0xdb, 0x85, 0x26, 0xd8, 0xaf, 0x54, 0x17, 0x28, 0x9b, 0x3b, 0x9f, 0x1a, 0x68, 0x33, 0xe1, 0x17, 0x65, 0x97, 0xdb, 0xf6, 0xa5, 0x88, 0x3b, 0x7a, 0x67, 0x90, 0x74, 0x1c, 0xd6, 0x85, 0x12, 0x0b, 0xf3, 0xb1, 0x4a, 0x72, 0xcf, 0x2f, 0xd6, 0xf9, 0xfd, 0x98, 0x00, 0x8e, 0x47, 0xe0, 0xfc, 0x65, 0xa0, 0x7a, 0x7a, 0x3d, 0x5a, 0xc3, 0x7c, 0xe6, 0x99, 0x9d, 0x65, 0x00, 0x08, 0x5a, 0x53, 0x05, 0xca, 0xdd, 0xaf, 0x8a, 0xb4, 0xfb, 0x03, 0xc1, 0xb9, 0x27, 0x0b, 0x43, 0xa5, 0x4f, 0x0e, 0x0c, 0x0f, 0x01, 0x6e, 0xc7, 0x88, 0xd2, 0x7f, 0x4d, 0x19, 0x00, 0x95, 0x68, 0xed, 0x56, 0x61, 0xdc, 0x4a, 0x50, 0x7d, 0xa8, 0xc6, 0x80, 0x45, 0x89, 0xb7, 0x30, 0xe9, 0xc0, 0xeb, 0x49, 0xc0, 0x15, 0x99, 0x74, 0xdf, 0x1c, 0x98, 0x7e, 0xeb, 0xb7, 0xcf, 0x01, 0x2b, 0xdc, 0xed, 0x41, 0xe1, 0x98, 0x5a, 0x54, 0xdb, 0x54, 0x6d, 0x86, 0x45, 0x58, 0xdf, 0xfb, 0xc1, 0x8d, 0x7f, 0x96, 0xba, 0x87, 0x28, 0x1a, 0xf4, 0xc2, 0xf0, 0x8f, 0x68, 0x2c, 0xa3, 0xe8, 0x50, 0xe4, 0x70, 0xe2, 0x7e, 0x42, 0xe1, 0x2f, 0xf1, 0x17, 0x11, 0xd4, 0xaa, 0x36, 0x19, 0xd0, 0xbc, 0x33, 0xcb, 0xfe, 0xa3, 0x6a, 0xa3, 0x3c, 0xd6, 0x43, 0xfa, 0xcd, 0xa0, 0xb5, 0x7d, 0xfc, 0x2b, 0x09, 0xde, 0x02, 0xde, 0xe1, 0xc9, 0x2a, 0xe8, 0x78, 0x1a, 0x33, 0x1d, 0x2b, 0x4d, 0xf6, 0x02, 0x39, 0x35, 0x49, 0x23, 0xc7, 0xf1, 0x22, 0xad, 0x27, 0x1d, 0x00, 0x38, 0x59, 0x45, 0x86, 0xe5, 0xd2, 0x9f, 0x69, 0xa9, 0x7d, 0xf9, 0x8d, 0xe8, 0x00, 0xf0, 0x6b, 0x46, 0x40, 0x63, 0xb6, 0xba, 0x27, 0x27, 0x3e, 0xe4, 0xa5, 0xfc, 0x14, 0xa0, 0xf4, 0xc0, 0xef, 0xdb, 0x21, 0xe3, 0xce, 0xa5, 0xc8, 0x1b, 0xdf, 0x88, 0x1f, 0x59, 0xa0, 0x18, 0x35, 0xfb, 0x44, 0xcc, 0x7c, 0x43, 0x58, 0x0c, 0x86, 0x08, 0xa6, 0x8b, 0x0c, 0xab, 0x5a, 0xd7, 0x34, 0x4d, 0x63, 0x2f, 0x13, 0x3f, 0x1c, 0x94, 0x71, 0xba, 0x2c, 0x22, 0xcd, 0xd1, 0xab, 0xa1, 0xa1, 0xa3, 0x86, 0x58, 0xe8, 0xd5, 0x24, 0x21, 0xdc, 0x40, 0x49, 0xc3, 0x04, 0xe6, 0x3b, 0x7b, 0x6e, 0x2b, 0x24, 0xdc, 0x3a, 0x42, 0xb8, 0xda, 0x58, 0xe5, 0x17, 0x21, 0x91, 0x49, 0xf5, 0xab, 0xcc, 0x51, 0xf8, 0x91, 0x8a, 0x02, 0x61, 0x21, 0xb4, 0x37, 0xef, 0x32, 0x96, 0x95, 0x00, 0xb4, 0x2b, 0xc2, 0xfa, 0x8b, 0x9b, 0xd2, 0xe9, 0x9e, 0x02, 0x02, 0x6a, 0x2a, 0x73, 0xa9, 0xc7, 0x5d, 0x3d, 0x6b, 0x63, 0x20, 0x6c, 0xb0, 0x59, 0x34, 0x93, 0x54, 0x60, 0x80, 0xc9, 0xa1, 0xf2, 0xa9, 0xf2, 0x7a, 0xad, 0xe4, 0x40, 0xd8, 0xf9, 0x08, 0xf9, 0x7b, 0xeb, 0xe8, 0x7a, 0xd9, 0x69, 0xdf, 0x7c, 0x5b, 0x8f, 0xac, 0x96, 0xc8, 0x52, 0x80, 0x03, 0x01, 0x63, 0x56, 0xa6, 0xf0, 0x56, 0x83, 0x4b, 0xbb, 0x04, 0x8e, 0x30, 0x3d, 0x2e, 0x41, 0xc4, 0xb6, 0x63, 0x00, 0xae, 0xc1, 0x23, 0x5a, 0x11, 0x87, 0x44, 0xde, 0x0e, 0x33, 0x95, 0x30, 0x8b, 0xa6, 0xc2, 0x5c, 0x33, 0x6b, 0x77, 0x69, 0xbe, 0xed, 0xc8, 0x32, 0x73, 0xe7, 0xd1, 0x71, 0xeb, 0x1d, 0x99, 0x1d, 0x17, 0x4a, 0x3d, 0xf6, 0x85, 0x59, 0x4a, 0x5e, 0xde, 0xd7, 0x6a, 0x6a, 0xb4, 0xa9, 0x43, 0x39, 0x7a, 0xfa, 0x9c, 0x84, 0xd4, 0x78, 0xc1, 0x77, 0x12, 0xc0, 0x29, 0xbf, 0xf6, 0x16, 0x57, 0xe5, 0xbe, 0x5a, 0xfe, 0xda, 0x5e, 0x37, 0x68, 0xd3, 0x0e, 0x9e, 0x18, 0x56, 0x04, 0x73, 0xaf, 0x95, 0x83, 0x86, 0x0c, 0xfc, 0x14, 0xc4, 0xb7, 0x06, 0x14, 0xaf, 0x80, 0x54, 0x6e, 0x0b, 0x63, 0x00, 0xaa, 0xda, 0xaf, 0x2f, 0x27, 0x8b, 0x68, 0xe5, 0xa4, 0x6f, 0xe9, 0x1e, 0x05, 0x6c, 0xcd, 0x1a, 0x54, 0xf5, 0x10, 0xf8, 0x07, 0x39, 0x72, 0x86, 0x81, 0x9b, 0x1c, 0x58, 0xdb, 0x63, 0x86, 0x17, 0xe3, 0xb3, 0x98, 0x1c, 0x65, 0xbc, 0x10, 0x3d, 0xaa, 0x31, 0x23, 0xe7, 0x3f, 0xfc, 0x67, 0x6e, 0xf7, 0x31, 0xf0, 0xa0, 0x33, 0x40, 0xb9, 0xa0, 0x61, 0x6e, 0x46, 0xf2, 0xc3, 0x86, 0x88, 0xd2, 0x72, 0xcb, 0x01, 0xca, 0xa2, 0x32, 0x29, 0x83, 0x27, 0xce, 0x0f, 0xdc, 0x39, 0x8c, 0x43, 0x39, 0x74, 0x20, 0xf4, 0x1d, 0x22, 0x3f, 0x56, 0xfc, 0xbd, 0x0f, 0x46, 0x4a, 0xb0, 0xdc, 0x31, 0xd8, 0x5e, 0x0c, 0x32, 0x60, 0x65, 0x55, 0x7a, 0x5f, 0x24, 0x2d, 0xf5, 0x22, 0x7b, 0x82, 0x2b, 0x24, 0xd1, 0xac, 0x64, 0x97, 0x5c, 0xa0, 0x0f, 0x41, 0x9c, 0x66, 0x64, 0x89, 0x29, 0xcd, 0x49, 0xd2, 0xaf, 0x5d, 0x72, 0x07, 0x37, 0x8d, 0xcd, 0x77, 0xa8, 0x36, 0x1d, 0xe4, 0x8d, 0x48, 0xe4, 0xd6, 0x18, 0xbc, 0x87, 0x35, 0x67, 0xc9, 0xad, 0x17, 0x07, 0x5b, 0xe8, 0xd7, 0xb7, 0xc1, 0x97, 0x67, 0x6e, 0xa5, 0x0b, 0xe7, 0x9f, 0x42, 0xe8, 0x76, 0xbb, 0xd1, 0xce, 0x48, 0xf8, 0x44, 0x39, 0xf8, 0x51, 0x37, 0xa6, 0x20, 0xcd, 0x24, 0xf8, 0x28, 0x05, 0xd6, 0x19, 0x5b, 0xe0, 0x20, 0xe4, 0x40, 0xa2, 0xce, 0x43, 0x27, 0x25, 0xdc, 0x94, 0x02, 0x65, 0xe6, 0x52, 0x76, 0x43, 0xe0, 0xf1, 0x32, 0x82, 0x07, 0x09, 0x80, 0x16, 0x17, 0xb7, 0x19, 0x9e, 0xbf, 0x41, 0x3e, 0x2f, 0x52, 0xf8, 0x04, 0x53, 0xbf, 0x63, 0xf0, 0x51, 0xc3, 0x99, 0xc3, 0xaf, 0x5d, 0xef, 0x97, 0xf6, 0x83, 0xd3, 0x2b, 0xb5, 0x13, 0xf8, 0x7c, 0xc8, 0x0c, 0xb4, 0x95, 0xda, 0xfe, 0xa6, 0xa7, 0x29, 0xbf, 0x9b, 0x5c, 0x89, 0x60, 0xb2, 0x69, 0xac, 0x5f, 0xbf, 0x63, 0xa0, 0x1e, 0xee, 0xd3, 0x99, 0x94, 0xa9, 0x8c, 0xf1, 0x43, 0xbb, 0x3c, 0x6d, 0x6a, 0xb5, 0x42, 0xc2, 0x7b, 0x90, 0xbf, 0x58, 0xcf, 0x95, 0xf0, 0x4d, 0x99, 0x7a, 0xbb, 0xbd, 0x19, 0xce, 0x87, 0x41, 0x12, 0x97, 0x51, 0xb5, 0x7d, 0x39, 0xfc, 0x3f, 0x7f, 0x99, 0xe9, 0x8c, 0x99, 0x83, 0xc8, 0x5d, 0x1f, 0x49, 0xae, 0x43, 0xeb, 0xad, 0x67, 0xa6, 0x52, 0x01, 0x0d, 0x0c, 0x57, 0x8d, 0xd9, 0x98, 0x1f, 0x31, 0x3a, 0xd1, 0xa5, 0x4c, 0x24, 0xa6, 0xaf, 0xdc, 0xab, 0xae, 0x01, 0xe6, 0xd0, 0xb4, 0xd0, 0x18, 0x9b, 0x72, 0x79, 0xad, 0x6a, 0x9d, 0x73, 0x91, 0x88, 0x22, 0x82, 0xc5, 0x01, 0xb0, 0x2e, 0x06, 0xb5, 0x76, 0x74, 0xa9, 0xac, 0x2e, 0xbb, 0xca, 0xa9, 0x5a, 0x0a, 0xa5, 0x02, 0xcd, 0x77, 0x44, 0xae, 0x6e, 0xe3, 0x5b, 0xa0, 0x39, 0xe4, 0x70, 0x53, 0x86, 0x03, 0x3e, 0xa7, 0x8e, 0x28, 0x5c, 0xeb, 0x2b, 0x52, 0x1a, 0x3b, 0xdf, 0x8b, 0xac, 0x0c, 0x18, 0x1c, 0x8a, 0x05, 0xb2, 0xfd, 0x16, 0x11, 0xbe, 0x8f, 0x7f, 0xb2, 0x82, 0x8d, 0xe6, 0x98, 0xc0, 0x40, 0xc0, 0x72, 0x3c, 0xf3, 0x7c, 0x04, 0x78, 0xa7, 0x65, 0x79, 0xc2, 0x08, 0xc9, 0xfb, 0x70, 0x9f, 0x5b, 0x82, 0x6b, 0x48, 0xd6, 0xe9, 0xea, 0xe7, 0xe3, 0x47, 0x80, 0x57, 0x3d, 0x7c, 0x59, 0xa3, 0x13, 0x0a, 0xc1, 0x79, 0xae, 0x27, 0xe5, 0xdb, 0x53, 0x10, 0xde, 0x18, 0x6b, 0x9f, 0xeb, 0xfb, 0xe1, 0x20, 0xfe, 0x42, 0xcc, 0x61, 0x7b, 0x51, 0x4e, 0x08, 0x3c, 0x28, 0xbb, 0x29, 0xd8, 0x93, 0xfe, 0x18, 0x25, 0xa0, 0x39, 0x7c, 0xfb, 0x56, 0xac, 0xa5, 0x3b, 0xa4, 0xd8, 0x20, 0x10, 0x98, 0xe4, 0x88, 0x75, 0xd2, 0x3f, 0x9e, 0xf8, 0x37, 0x87, 0x9c, 0xbd, 0xea, 0xaa, 0xc7, 0xc5, 0x78, 0x4b, 0x44, 0x70, 0x52, 0x67, 0x2c, 0x41, 0x81, 0x38, 0xe3, 0xe2, 0x95, 0x59, 0xa5, 0x68, 0xde, 0x2c, 0x61, 0xd7, 0xdf, 0x79, 0xcb, 0xe9, 0x00, 0x57, 0xad, 0x0b, 0x83, 0x50, 0x7d, 0xa9, 0xb9, 0xc0, 0x35, 0xab, 0x76, 0x7e, 0x5f, 0x40, 0xc2, 0xbe, 0x6f, 0xda, 0xd1, 0x36, 0x56, 0x7a, 0x36, 0x80, 0x54, 0x2d, 0x53, 0xc0, 0x0e, 0xd6, 0x14, 0x86, 0xe0, 0x2f, 0xdd, 0xf6, 0x74, 0x0b, 0xc0, 0x26, 0x94, 0xde, 0xf4, 0xc7, 0x3c, 0x7e, 0x82, 0x08, 0xf4, 0x2b, 0x42, 0xb7, 0x5c, 0xce, 0x06, 0xa9, 0x09, 0x7e, 0x15, 0x5d, 0x8f, 0x48, 0xdb, 0xdc, 0xdf, 0x30, 0xde, 0xe3, 0xd4, 0x73, 0xf4, 0x44, 0x08, 0x0f, 0xb4, 0x8a, 0xec, 0x85, 0x2a, 0xdc, 0x18, 0xde, 0xcf, 0x24, 0xdf, 0xec, 0xb7, 0x70, 0x27, 0xd2, 0x0d, 0x98, 0x77, 0xc7, 0xbd, 0x21, 0x52, 0x16, 0x70, 0x61, 0xc4, 0x69, 0xbd, 0xe4, 0x3a, 0x48, 0x9d, 0x0f, 0x97, 0xdd, 0x20, 0x03, 0x83, 0xfa, 0x5f, 0xc4, 0x06, 0x5d, 0xb2, 0x9b, 0x57, 0x32, 0x23, 0xb8, 0xee, 0xd9, 0x22, 0x1c, 0xe0, 0xea, 0x7a, 0xb6, 0x6c, 0x76, 0x83, 0xcc, 0xd1, 0x90, 0x99, 0x9d, 0x63, 0x0c, 0xce, 0x45, 0xde, 0x87, 0xdc, 0xe0, 0xfa, 0xa8, 0x5e, 0xf2, 0x40, 0xa4, 0x3f, 0x07, 0x1b, 0x08, 0x72, 0x96, 0x32, 0xb3, 0xe3, 0x2b, 0xf5, 0x21, 0xae, 0xc5, 0x76, 0xf0, 0x90, 0x7d, 0x7b, 0x9c, 0x9a, 0x69, 0xd1, 0x8e, 0x2d, 0xc0, 0xe3, 0x55, 0x22, 0x3f, 0x8b, 0x33, 0x49, 0xcb, 0x27, 0xdb, 0x15, 0x57, 0xf0, 0x79, 0x95, 0x08, 0x87, 0xf3, 0xa6, 0x97, 0xd1, 0x6e, 0x68, 0xf8, 0x05, 0x15, 0xee, 0x39, 0x03, 0x15, 0x3a, 0xac, 0xe8, 0xec, 0x68, 0x48, 0xdf, 0xe4, 0x29, 0x4d, 0x3a, 0xda, 0x73, 0x27, 0xc1, 0x44, 0x77, 0x95, 0x49, 0x73, 0xd4, 0x0a, 0x89, 0x15, 0x0a, 0x54, 0x2a, 0xfd, 0x31, 0x7b, 0x1d, 0x27, 0xeb, 0xec, 0x31, 0xf6, 0x97, 0xd6, 0xe5, 0xc1, 0xc7, 0xd5, 0x7a, 0x8e, 0xf4, 0xce, 0x4d, 0x1d, 0x71, 0x1a, 0x64, 0x29, 0x9e, 0xe6, 0x47, 0xea, 0x5e, 0xd9, 0x11, 0xde, 0xcb, 0xf8, 0xc6, 0xc9, 0x28, 0xc7, 0xe7, 0xfb, 0x16, 0xb1, 0x44, 0xd1, 0x0b, 0xaa, 0x12, 0x7e, 0x01, 0x13, 0x3d, 0x0b, 0x6b, 0xde, 0x00, 0x9d, 0x6d, 0xf2, 0xb2, 0xf7, 0x4c, 0xd1, 0xe3, 0x3f, 0x24, 0x78, 0xa7, 0x05, 0xd9, 0x87, 0x32, 0x81, 0x4f, 0xa1, 0xa5, 0x1c, 0xde, 0x16, 0x28, 0x33, 0x00, 0xbf, 0x39, 0x17, 0x4d, 0x2a, 0x43, 0x58, 0xaa, 0xf7, 0x73, 0x43, 0xbd, 0x82, 0xc7, 0xa9, 0xa4, 0xc3, 0x68, 0xe2, 0xe6, 0x72, 0x39, 0x12, 0xa9, 0x6e, 0xb0, 0xab, 0x26, 0x5f, 0xe5, 0x33, 0x5b, 0x9a, 0xe8, 0x48, 0xff, 0x46, 0x58, 0xe1, 0xbb, 0xbd, 0x31, 0xd6, 0x97, 0x35, 0xe6, 0xa3, 0xb3, 0xa0, 0xb0, 0x69, 0x37, 0xd1, 0x25, 0x35, 0x8c, 0xdf, 0x0c, 0x85, 0xcd, 0xce, 0x70, 0x08, 0x78, 0x6c, 0xf3, 0xa6, 0x6a, 0x7a, 0x65, 0xc0, 0x0a, 0x0c, 0x95, 0xb9, 0xc4, 0x33, 0x67, 0xb5, 0xb9, 0xd8, 0x27, 0xa0, 0xb4, 0xeb, 0x1d, 0x73, 0x60, 0xbe, 0x62, 0xb2, 0xb9, 0xab, 0xf2, 0x39, 0xc1, 0xfd, 0x01, 0x39, 0x74, 0x0e, 0x93, 0x7e, 0xfd, 0xac, 0x47, 0xf3, 0x2a, 0xc1, 0x73, 0x67, 0x1e, 0x33, 0x76, 0x91, 0x46, 0x0a, 0x4a, 0x52, 0x8e, 0xd1, 0x59, 0x3b, 0xd4, 0x3e, 0x92, 0x4f, 0x9c, 0x15, 0xbb, 0x0a, 0x06, 0x49, 0x09, 0xa2, 0xfe, 0x64, 0xee, 0x8c, 0xb3, 0x2a, 0x32, 0x42, 0x4a, 0x79, 0x45, 0x44, 0xd3, 0x74, 0xd4, 0x5c, 0x7c, 0xe1, 0x9a, 0x27, 0x04, 0xce, 0x79, 0xd1, 0x73, 0x7b, 0xc9, 0x20, 0x09, 0x74, 0xf0, 0xb4, 0x74, 0xfe, 0x32, 0x8d, 0x46, 0xb4, 0xcb, 0xcd, 0xa5, 0x72, 0x3b, 0xbf, 0x44, 0x72, 0xe2, 0x19, 0x93, 0xb5, 0xcc, 0x7e, 0x33, 0xa5, 0xce, 0x47, 0xad, 0xf8, 0xd2, 0x83, 0x63, 0xd7, 0x6f, 0x3c, 0xc7, 0x40, 0xbd, 0xfd, 0xca, 0xa9, 0x67, 0x90, 0x98, 0xe6, 0x01, 0x0c, 0x82, 0x4c, 0x9c, 0x10, 0x3b, 0x17, 0x98, 0x49, 0x48, 0x09, 0xba, 0x3a, 0xb2, 0x54, 0x7e, 0x3c, 0xfe, 0xba, 0xaf, 0xc3, 0x5e, 0xf3, 0x34, 0xe4, 0x29, 0x4f, 0x2d, 0x14, 0x89, 0x9c, 0x3f, 0x33, 0x74, 0x4a, 0x2b, 0xc9, 0xdd, 0xcd, 0xa6, 0x8f, 0x2b, 0x43, 0x65, 0x31, 0xea, 0x57, 0x77, 0x52, 0xc0, 0x65, 0xd7, 0xd0, 0xa3, 0xdf, 0x42, 0x4a, 0x4a, 0xef, 0x46, 0xe0, 0xe1, 0x5d, 0x9c, 0x3a, 0x01, 0xb4, 0xb7, 0xcc, 0xdf, 0xa0, 0x9d, 0x58, 0xc4, 0x9b, 0xf6, 0xb4, 0xbd, 0xc8, 0x62, 0xcd, 0x93, 0x1f, 0x10, 0xec, 0xfd, 0xcb, 0x8d, 0x38, 0x15, 0xd0, 0xd9, 0x7d, 0x09, 0xf1, 0xc0, 0x2b, 0x13, 0xd1, 0x67, 0xa2, 0xab, 0x58, 0x26, 0xac, 0xfb, 0x58, 0x95, 0x4b, 0x93, 0x71, 0xea, 0xb6, 0x5e, 0x32, 0x82, 0x9e, 0xd4, 0x80, 0xbd, 0xb5, 0x72, 0x3c, 0x0f, 0x71, 0x67, 0x20, 0x54, 0x0d, 0x91, 0xea, 0x64, 0xd2, 0xa7, 0xbd, 0xe8, 0x94, 0xb8, 0xc4, 0x6c, 0x7f, 0xd4, 0x18, 0xb5, 0x14, 0x09, 0xe4, 0x54, 0x6e, 0x91, 0xc7, 0x7b, 0xca, 0x49, 0x79, 0x10, 0x46, 0x65, 0xb2, 0x00, 0xe9, 0x62, 0x47, 0xd6, 0xe4, 0x3d, 0x96, 0x8c, 0x17, 0xe3, 0x25, 0xa0, 0xd7, 0xe8, 0x86, 0x6b, 0xef, 0x7b, 0x7e, 0xaf, 0xe4, 0x9a, 0x66, 0x6f, 0x7e, 0x82, 0xd0, 0x03, 0x83, 0x6a, 0x6e, 0x6b, 0xc6, 0x70, 0x30, 0xe4, 0x60, 0xd4, 0xad, 0xb9, 0x3e, 0x64, 0xc4, 0x5c, 0xdc, 0x37, 0x83, 0xb5, 0x4f, 0x9e, 0x47, 0xba, 0x89, 0x58, 0x25, 0x40, 0xd9, 0x05, 0x89, 0x10, 0xb1, 0xdd, 0x1d, 0x3e, 0xac, 0xa2, 0xed, 0xb6, 0xcf, 0xd3, 0xc8, 0x18, 0x10, 0x23, 0xe9, 0xc6, 0x14, 0x2a, 0xd7, 0x3b, 0x3d, 0x59, 0x89, 0x9e, 0xe4, 0x33, 0xce, 0x96, 0xe3, 0xba, 0xec, 0x61, 0x57, 0x28, 0x87, 0x20, 0xa4, 0xe0, 0xc5, 0x75, 0xb9, 0xa4, 0xb0, 0x50, 0x95, 0x08, 0xdc, 0x06, 0x09, 0x27, 0x49, 0xa4, 0xc0, 0x94, 0x8a, 0x82, 0x7e, 0x94, 0x27, 0x1b, 0xa5, 0x8a, 0x41, 0x1b, 0xfd, 0xb2, 0x74, 0xba, 0xb4, 0x12, 0x02, 0x49, 0xa4, 0xae, 0x2d, 0x0a, 0xd5, 0xfc, 0xe4, 0x45, 0x43, 0x97, 0xa2, 0x98, 0xe1, 0x37, 0x94, 0x8f, 0xdd, 0xe1, 0xfa, 0x75, 0x26, 0x5b, 0xcf, 0x69, 0x2c, 0xe3, 0xac, 0xb4, 0xe7, 0x20, 0xea, 0x59, 0x1a, 0x59, 0x07, 0xee, 0xd9, 0xe5, 0x4a, 0xab, 0x49, 0xe3, 0xaa, 0xc1, 0xa7, 0x2b, 0xed, 0xec, 0x8b, 0x84, 0x0d, 0x4c, 0x6e, 0x17, 0xdf, 0x71, 0x6a, 0x23, 0xf6, 0xb5, 0x42, 0xf3, 0xc6, 0xce, 0xa2, 0x0d, 0x05, 0xa3, 0xa8, 0xad, 0x57, 0x5f, 0xa2, 0x71, 0x29, 0xc4, 0x1a, 0x56, 0xdd, 0xc3, 0x10, 0xe3, 0x28, 0x49, 0x86, 0xa4, 0xb9, 0x5b, 0x42, 0xda, 0x1c, 0x65, 0xcf, 0x71, 0xdd, 0xcf, 0xc5, 0x32, 0xf0, 0xd2, 0x4a, 0x3a, 0x50, 0x8a, 0xd9, 0xab, 0xe7, 0x4c, 0x42, 0xa1, 0xae, 0x39, 0xf2, 0x68, 0x15, 0x13, 0x75, 0xec, 0xa5, 0x50, 0x39, 0x70, 0xe4, 0x6d, 0x95, 0x83, 0x79, 0x85, 0x09, 0x30, 0x90, 0x22, 0xc8, 0x76, 0x80, 0x53, 0x73, 0xf8, 0xab, 0xff, 0x28, 0xf4, 0xa6, 0x78, 0xbb, 0x79, 0x9b, 0x53, 0x43, 0xd5, 0xeb, 0x78, 0xd9, 0x4d, 0x17, 0x75, 0x9c, 0x12, 0xe0, 0x18, 0xf9, 0x70, 0xad, 0x3c, 0x29, 0x47, 0x2e, 0xe3, 0xfa, 0xbf, 0x3f, 0x85, 0xd3, 0x38, 0x0f, 0xa8, 0xf2, 0x80, 0x81, 0xb1, 0xf9, 0x49, 0xd2, 0xfa, 0xa9, 0xda, 0x7d, 0x24, 0xed, 0x04, 0x5b, 0xaf, 0x1a, 0x58, 0x0f, 0xc7, 0x75, 0x97, 0xa1, 0x61, 0xf6, 0x6a, 0x69, 0x87, 0x4b, 0x53, 0x2f, 0xf0, 0x20, 0xe4, 0x90, 0xd4, 0x9e, 0x2f, 0xa3, 0xfe, 0x31, 0x7d, 0xdd, 0x23, 0x8f, 0x43, 0x32, 0x72, 0xf6, 0x51, 0x7d, 0x6c, 0xb4, 0x4d, 0x22, 0xf6, 0xed, 0x60, 0xf2, 0xad, 0x99, 0x2f, 0x4f, 0x79, 0xcc, 0x0d, 0x90, 0x65, 0x3a, 0x6e, 0xa7, 0xae, 0xfa, 0x9f, 0x00, 0x19, 0x8a, 0xb5, 0xad, 0x8a, 0x14, 0xc4, 0xc1, 0xd3, 0xef, 0x51, 0xf9, 0xca, 0x69, 0x09, 0xa2, 0x9e, 0xc4, 0xb3, 0xb6, 0x6b, 0x7e, 0x63, 0x49, 0x0b, 0xd6, 0xf0, 0x23, 0x30, 0x8b, 0xa9, 0xaf, 0xaf, 0xe7, 0x44, 0x14, 0x1f, 0xfc, 0x17, 0xa1, 0xa3, 0x2e, 0x8b, 0x6e, 0x04, 0xf1, 0xcd, 0x40, 0x03, 0xd4, 0xc6, 0xae, 0xed, 0xbf, 0x4e, 0x82, 0x6f, 0x78, 0x9c, 0x62, 0xac, 0x6c, 0x01, 0xb0, 0x8d, 0xad, 0xd7, 0xae, 0x58, 0x37, 0xb4, 0xe6, 0x85, 0x77, 0xe3, 0xc9, 0xcd, 0x0e, 0x14, 0x96, 0x83, 0xd2, 0x52, 0x7d, 0x27, 0x15, 0x36, 0x05, 0x39, 0x2b, 0x5a, 0xab, 0x4b, 0x26, 0x11, 0xcb, 0x5a, 0xe4, 0x55, 0xc4, 0x5e, 0x4c, 0x01, 0x58, 0x20, 0xd4, 0x41, 0x51, 0x4c, 0x46, 0x46, 0x6a, 0xc7, 0xc5, 0x3e, 0x6c, 0x42, 0x0b, 0x83, 0x98, 0x10, 0xf4, 0x12, 0x45, 0x34, 0x40, 0x40, 0xca, 0xbf, 0x94, 0xa8, 0x9e, 0x59, 0xc3, 0x68, 0xbe, 0x1d, 0x4c, 0x8d, 0x4f, 0xaa, 0x24, 0xcb, 0x85, 0x76, 0xb5, 0x72, 0xc3, 0x66, 0x26, 0x9d, 0x04, 0x9c, 0xdd, 0xac, 0x79, 0x91, 0x42, 0xf5, 0x73, 0x63, 0xc6, 0xb7, 0x84, 0x70, 0x25, 0x4f, 0xe1, 0x23, 0xe7, 0xaf, 0x0b, 0x0e, 0x2d, 0x0b, 0xaf, 0x39, 0xaa, 0xd5, 0xca, 0xba, 0xf0, 0xec, 0x10, 0x86, 0xed, 0x11, 0x8f, 0x87, 0xb5, 0x9a, 0x90, 0xef, 0x82, 0x6a, 0xbe, 0xcb, 0xf8, 0x20, 0x8a, 0xdb, 0xae, 0x8f, 0xcd, 0xa1, 0xeb, 0x6f, 0xaf, 0xb8, 0xad, 0x51, 0xc9, 0x67, 0xf0, 0xd9, 0x86, 0x76, 0x2c, 0x27, 0xcf, 0x40, 0x20, 0x96, 0xe7, 0x0a, 0xce, 0xa9, 0x93, 0x93, 0xc7, 0x42, 0x7f, 0xec, 0xa8, 0x15, 0xdd, 0x8a, 0xe5, 0x5d, 0x4f, 0x9a, 0xc5, 0xcd, 0x07, 0x94, 0xae, 0xca, 0x2c, 0x13, 0xa3, 0xd7, 0x80, 0xe4, 0x0b, 0x51, 0x41, 0x5d, 0xb4, 0x5c, 0x4d, 0xf0, 0x17, 0x1d, 0x89, 0x00, 0xde, 0x2a, 0x82, 0xf2, 0xa3, 0x3e, 0x55, 0x88, 0xfb, 0x32, 0xcd, 0x6a, 0xb3, 0x28, 0xcc, 0x06, 0x59, 0x0a, 0xec, 0x9a, 0xfe, 0x33, 0x65, 0x8f, 0x3b, 0x6b, 0x32, 0x09, 0x72, 0x19, 0x6f, 0xbc, 0x56, 0xb4, 0x06, 0x01, 0xae, 0x7b, 0x8a, 0x29, 0x56, 0x66, 0x63, 0x11, 0x86, 0x5c, 0x2c, 0xf6, 0x56, 0xa6, 0x59, 0x8b, 0x82, 0xa4, 0x1d, 0x49, 0x6b, 0xbe, 0x8b, 0x07, 0x5f, 0x9e, 0xfb, 0xca, 0x1a, 0x9c, 0xaf, 0xde, 0x8d, 0x7a, 0xb6, 0x26, 0xde, 0x52, 0x11, 0xb0, 0xaf, 0xcc, 0x15, 0x8c, 0xa3, 0x94, 0x10, 0xdf, 0x1e, 0x0c, 0x2f, 0x33, 0x4d, 0x3e, 0x9f, 0x11, 0x67, 0x14, 0xf3, 0xd2, 0x32, 0xcb, 0xc6, 0xb2, 0xc8, 0xa5, 0xa1, 0x26, 0x9b, 0xde, 0x1f, 0x70, 0xb7, 0xe2, 0x4e, 0x70, 0x47, 0xbd, 0x59, 0xbd, 0x5b, 0xd3, 0x64, 0xf4, 0xe8, 0xd1, 0xb8, 0x50, 0x10, 0xe3, 0x20, 0x7b, 0xa4, 0x28, 0x92, 0xa4, 0xe8, 0x63, 0x12, 0xd2, 0x96, 0xf3, 0xd4, 0x78, 0x25, 0x05, 0xa1, 0x49, 0x4a, 0x08, 0x7b, 0x4d, 0xc0, 0x61, 0x84, 0x35, 0x45, 0x60, 0x1c, 0xec, 0xe5, 0x73, 0x4a, 0x6e, 0x7a, 0x9a, 0x5d, 0xdd, 0x74, 0x1b, 0xd3, 0xd2, 0xd6, 0x77, 0x79, 0xf1, 0x81, 0x9c, 0xd4, 0xc0, 0xb5, 0x5c, 0xc0, 0xb9, 0xd5, 0x1e, 0x57, 0x9d, 0x6a, 0xd4, 0x14, 0x0c, 0x6b, 0x2d, 0x38, 0x53, 0xbc, 0x0b, 0x6d, 0x85, 0xf4, 0x37, 0xaa, 0xcd, 0x63, 0x54, 0x56, 0x02, 0x54, 0x11, 0xb0, 0x7c, 0x8f, 0xa3, 0x6e, 0x26, 0x22, 0x73, 0xa4, 0xd5, 0x61, 0x13, 0xe8, 0xd8 ],
+    const [ 0xd9, 0xdb, 0x53, 0x5f, 0x11, 0xed, 0x31, 0xc9, 0x06, 0xaf, 0x44, 0xc6, 0xb1, 0x0a, 0x63, 0x1f, 0xc6, 0xb0, 0x04, 0xc2, 0x89, 0xa4, 0xb0, 0x66, 0xe3, 0xfc, 0xb4, 0x72, 0xb5, 0xe6, 0x1a, 0x1b, 0x6c, 0xe9, 0xd7, 0xcd, 0xd6, 0x6d, 0x46, 0xcd, 0x34, 0x7e, 0xd5, 0x1c, 0x90, 0xcd, 0xff, 0x9e, 0x50, 0xf7, 0x7a, 0x7b, 0x0c, 0x0a, 0xb1, 0xc6, 0x9d, 0x46, 0x74, 0x5d, 0x76, 0x20, 0xee, 0x10, 0x38, 0x8d, 0xd8, 0x05, 0x80, 0x7c, 0xed, 0x5a, 0x03, 0xa4, 0x9e, 0x0d, 0xde, 0x81, 0x06, 0x19, 0x27, 0x99, 0x20, 0xe2, 0xc8, 0x04, 0x38, 0xd3, 0x8d, 0x2b, 0x9f, 0x46, 0x7b, 0xd0, 0xa3, 0xa4, 0x64, 0x4f, 0xbe, 0xcd, 0xb8, 0x23, 0x0e, 0xba, 0x9e, 0xab, 0x05, 0x61, 0x43, 0x2e, 0x62, 0xd8, 0x72, 0x1e, 0x60, 0xbe, 0x66, 0x99, 0x2d, 0xd7, 0xdc, 0x35, 0x9d, 0xf6, 0x6c, 0xfd, 0x20, 0x20, 0x18, 0xb7, 0xf2, 0xee, 0x26, 0x69, 0x91, 0x33, 0x2b, 0x1b, 0x74, 0xdf, 0x69, 0xdd, 0xfa, 0x23, 0x5a, 0x0c, 0xa1, 0xd6, 0x8d, 0xd2, 0x78, 0x18, 0xb1, 0xec, 0xd7, 0x35, 0xf0, 0xb0, 0x4d, 0xcc, 0x7e, 0x4e, 0xda, 0x30, 0x71, 0x56, 0x5e, 0x0e, 0xd3, 0x7a, 0x52, 0x50, 0xf5, 0x96, 0xb6, 0x42, 0x07, 0xed, 0x4a, 0xf3, 0xe6, 0xb5, 0x01, 0xdf, 0x35, 0xd7, 0xb3, 0xca, 0xaf, 0xf0, 0x12, 0xef, 0xbb, 0x9b, 0xdf, 0x5a, 0x41, 0xf2, 0x5e, 0x93, 0xbd, 0x52, 0x07, 0x7c, 0x92, 0x5f, 0x7e, 0x7c, 0xa0, 0x48, 0xc5, 0xdd, 0x18, 0x4d, 0xb1, 0x73, 0x8f, 0x7e, 0x9a, 0x7f, 0x52, 0xc5, 0x57, 0xd2, 0xfa, 0x26, 0x69, 0x36, 0x40, 0x46, 0x77, 0x09, 0x12, 0x2a, 0xfb, 0x2b, 0xe6, 0x42, 0x3a, 0x1b, 0x4e, 0xa6, 0x79, 0x5c, 0xcc, 0x9f, 0x6e, 0x1e, 0xe8, 0x69, 0xf5, 0x1a, 0x81, 0x37, 0x04, 0xbe, 0x61, 0x78, 0xe1, 0x8a, 0x14, 0x59, 0x92, 0xba, 0xf9, 0x8b, 0x96, 0x25, 0x99, 0x46, 0xd2, 0x65, 0x38, 0x8e, 0xce, 0x38, 0xaa, 0xb5, 0x21, 0x26, 0x68, 0x21, 0x2a, 0x64, 0xe3, 0x4f, 0x01, 0xf9, 0x18, 0x18, 0xad, 0x1f, 0x65, 0x33, 0x98, 0xec, 0x9b, 0xfc, 0x40, 0x31, 0x54, 0x73, 0x2e, 0xa3, 0x87, 0x88, 0x2c, 0x38, 0x59, 0x96, 0xb3, 0xd4, 0x36, 0x2d, 0xa3, 0x25, 0x21, 0x14, 0x36, 0xcb, 0x48, 0x8e, 0x37, 0xbd, 0xdc, 0xdd, 0x6f, 0xe8, 0x1f, 0x05, 0x61, 0x19, 0xbf, 0xd2, 0x37, 0x1c, 0x62, 0x1c, 0xfb, 0x26, 0x82, 0x4a, 0x0a, 0x70, 0x7b, 0x15, 0xc6, 0x25, 0xe2, 0x8f, 0x8c, 0x7e, 0x19, 0x63, 0xe6, 0x2b, 0x20, 0x5e, 0x01, 0xf6, 0xae, 0x2e, 0x61, 0xa3, 0x81, 0x6a, 0xd3, 0x1a, 0xf2, 0xd3, 0xa3, 0xc8, 0xcc, 0xda, 0x10, 0x42, 0x5e, 0x62, 0xfd, 0x2b, 0xcf, 0xc6, 0xe9, 0x59, 0xb2, 0x1e, 0x21, 0x33, 0xda, 0xbe, 0x34, 0x5d, 0x70, 0x00, 0xa8, 0x98, 0x42, 0x44, 0xeb, 0xe3, 0x5e, 0x34, 0x8c, 0xe6, 0xe0, 0x4d, 0xab, 0x91, 0x08, 0x9b, 0xaf, 0x01, 0x90, 0xc3, 0x37, 0xa3, 0x3c, 0x47, 0x52, 0x9b, 0xb2, 0x06, 0xf2, 0x67, 0x8c, 0x02, 0x9e, 0xbf, 0xac, 0x66, 0x68, 0xc0, 0xcf, 0xc8, 0x1f, 0x4a, 0x65, 0xab, 0xc5, 0xa7, 0xa1, 0x48, 0x43, 0x6d, 0xcc, 0x8e, 0x5c, 0xa5, 0xde, 0x67, 0xe0, 0x2c, 0x4f, 0x3d, 0x22, 0x5a, 0x2b, 0xbd, 0xab, 0xe2, 0x65, 0xda, 0x30, 0xf9, 0x6d, 0x15, 0xc2, 0xbb, 0x04, 0xfc, 0x45, 0xca, 0x50, 0xf1, 0x23, 0x38, 0x2b, 0x2d, 0x42, 0xa7, 0xc1, 0x05, 0x33, 0xae, 0x5a, 0x6b, 0xac, 0x7f, 0x74, 0xb7, 0x38, 0xc7, 0x15, 0xa8, 0x2d, 0xd6, 0x5f, 0xa5, 0xde, 0x00, 0x65, 0x49, 0x13, 0x43, 0x3d, 0x1f, 0xb6, 0x2a, 0x57, 0xaa, 0xcf, 0xf0, 0x0c, 0xa9, 0xb3, 0xe9, 0x7a, 0x98, 0x77, 0x1e, 0x90, 0x7a, 0xab, 0x37, 0x65, 0xd6, 0x45, 0x9f, 0xce, 0x00, 0xdc, 0xe2, 0x2f, 0x99, 0x17, 0x5a, 0x91, 0x59, 0x64, 0x0a, 0xf5, 0x0c, 0xed, 0xca, 0xe8, 0xdb, 0xc8, 0xa5, 0x58, 0xcd, 0x6d, 0x7f, 0xa6, 0x8e, 0x6e, 0xfa, 0xfc, 0x6e, 0x62, 0x9b, 0xe1, 0xac, 0x22, 0x29, 0x0b, 0xf5, 0x39, 0x56, 0x74, 0x28, 0x95, 0xa2, 0xb0, 0x5c, 0x83, 0x7b, 0x7d, 0x24, 0xda, 0xa9, 0x9c, 0x12, 0x75, 0xe9, 0xdf, 0x79, 0xe7, 0xd8, 0x84, 0x77, 0x6b, 0x13, 0xc1, 0x33, 0x1a, 0x9d, 0xa0, 0x64, 0x61, 0x81, 0x0d, 0x13, 0xb1, 0xb8, 0x2d, 0xa1, 0x78, 0x4c, 0xf2, 0x0b, 0x51, 0xbe, 0xed, 0x6d, 0x77, 0xa6, 0x63, 0xc5, 0x80, 0x99, 0xa2, 0xfa, 0x48, 0x4f, 0x95, 0x1d, 0x2b, 0x05, 0x97, 0xee, 0x77, 0x21, 0x85, 0xa2, 0x20, 0x15, 0x17, 0xe3, 0xb6, 0x85, 0x70, 0x19, 0x95, 0xac, 0xf3, 0xe8, 0x5c, 0xfc, 0x59, 0xf9, 0xa0, 0x04, 0x00, 0xfe, 0xe1, 0x97, 0x86, 0xf0, 0xbc, 0x2b, 0x97, 0x9b, 0x63, 0x7f, 0x03, 0x5d, 0x4b, 0x81, 0x14, 0x2b, 0x24, 0x6e, 0x1e, 0xd4, 0x0e, 0x3b, 0x57, 0x8a, 0x0a, 0x34, 0xe9, 0x9e, 0xae, 0xe3, 0x46, 0x8b, 0x1e, 0x33, 0xbc, 0x36, 0x37, 0xd5, 0x49, 0x74, 0x0d, 0xe3, 0xb0, 0xcd, 0x98, 0xc3, 0xcc, 0x80, 0xaa, 0x4f, 0x25, 0xc6, 0x24, 0x32, 0xc1, 0x5b, 0x6a, 0x95, 0x3d, 0x3b, 0x14, 0xfc, 0x1c, 0xa9, 0xe7, 0x6a, 0x5e, 0x76, 0x03, 0xcc, 0x54, 0x80, 0x5d, 0x94, 0xb4, 0x79, 0x70, 0xa5, 0xe9, 0xea, 0x30, 0x6f, 0xac, 0x77, 0x40, 0x5b, 0xd8, 0x64, 0x64, 0x69, 0x7a, 0x58, 0x39, 0x17, 0x28, 0x61, 0x24, 0x86, 0x95, 0x39, 0x88, 0xd8, 0x62, 0xc8, 0x3c, 0xdc, 0x36, 0xe9, 0x3c, 0xed, 0x10, 0x71, 0x9e, 0x17, 0xdc, 0x6e, 0xc8, 0x7c, 0x45, 0xac, 0xe1, 0xf6, 0xcb, 0x7e, 0x85, 0xfe, 0x15, 0xba, 0xbd, 0xcd, 0x88, 0x06, 0x2e, 0xc0, 0x18, 0x52, 0x90, 0x01, 0x5e, 0xa6, 0x62, 0x64, 0xeb, 0x1e, 0xdc, 0x8f, 0xdd, 0x33, 0x26, 0x5e, 0xb0, 0x3b, 0xc7, 0x86, 0x56, 0x33, 0x60, 0x78, 0x89, 0xbd, 0x9a, 0x88, 0x60, 0x65, 0x5d, 0x4e, 0x20, 0x28, 0x43, 0x4c, 0x55, 0x37, 0x4c, 0xd2, 0x22, 0xf8, 0xd3, 0x1f, 0xd6, 0x4e, 0xc0, 0xc9, 0xbf, 0x1a, 0x00, 0x5f, 0x43, 0x02, 0x32, 0x4c, 0x2c, 0x71, 0xa3, 0xfe, 0x44, 0xde, 0x7d, 0x48, 0x22, 0x52, 0x3b, 0x05, 0x43, 0x24, 0x60, 0xff, 0x5d, 0x07, 0x69, 0x0f, 0xef, 0x48, 0x00, 0x85, 0x1d, 0x50, 0x72, 0xc9, 0xbb, 0x70, 0x63, 0x43, 0xa8, 0xde, 0xc1, 0x79, 0x5d, 0xfa, 0xf6, 0x77, 0xc5, 0xd6, 0x62, 0x74, 0x50, 0xf6, 0x08, 0xb2, 0x43, 0x54, 0x87, 0xa6, 0x52, 0xa7, 0x4d, 0x59, 0x70, 0xe5, 0x07, 0x0e, 0xe6, 0x07, 0x5b, 0x25, 0xa2, 0x0c, 0xda, 0x3f, 0xd2, 0x40, 0x30, 0xa3, 0xb2, 0xbe, 0x9e, 0xe1, 0xa2, 0x34, 0xab, 0xb5, 0x7c, 0xe6, 0x16, 0x2d, 0x24, 0xf6, 0x0e, 0x0e, 0x61, 0xe2, 0xa5, 0x75, 0xeb, 0x4e, 0x83, 0xba, 0xc5, 0x04, 0xd7, 0x99, 0xcc, 0x39, 0x94, 0x94, 0x91, 0x12, 0xd9, 0x93, 0x64, 0x66, 0xb0, 0xce, 0xb1, 0xc6, 0xfc, 0xec, 0x90, 0xba, 0xad, 0x6c, 0x97, 0x4e, 0x36, 0x45, 0xf2, 0xcd, 0x41, 0xc9, 0xb6, 0xcd, 0xa1, 0xcf, 0x73, 0x6b, 0x88, 0x11, 0x09, 0xd8, 0xfa, 0xd3, 0xbc, 0x15, 0x81, 0xc6, 0x8a, 0xfa, 0x23, 0x2b, 0xbb, 0x7d, 0x91, 0x3b, 0xbb, 0x31, 0xa1, 0xc7, 0x25, 0x0d, 0xfe, 0x1c, 0x20, 0x6f, 0x1e, 0x29, 0xee, 0x60, 0x75, 0xe4, 0xc2, 0x1a, 0xe9, 0xe9, 0xd2, 0xc8, 0x85, 0x64, 0xae, 0x8c, 0x71, 0x32, 0xd0, 0xc6, 0x22, 0x43, 0x74, 0x94, 0xce, 0x43, 0xaa, 0x95, 0x23, 0x79, 0xa9, 0xf3, 0x38, 0xef, 0x66, 0xa0, 0xc4, 0xd3, 0x65, 0xdf, 0x8e, 0x1d, 0xcf, 0x07, 0x24, 0x72, 0xc6, 0x83, 0xd0, 0x48, 0xf5, 0x1e, 0xc8, 0x4c, 0x6b, 0x7e, 0xa5, 0x00, 0xa9, 0xed, 0x16, 0xa9, 0xf9, 0x60, 0xd6, 0x68, 0x02, 0xb1, 0xdb, 0xa7, 0x9a, 0x30, 0xd1, 0xb6, 0xdb, 0x5a, 0xc6, 0xb6, 0x79, 0xe8, 0x27, 0xb7, 0x52, 0x0c, 0xeb, 0x1d, 0x47, 0xf7, 0x0e, 0x48, 0x4b, 0x9e, 0x41, 0x74, 0xb9, 0xbe, 0xe0, 0xdd, 0xeb, 0x1d, 0x24, 0x27, 0x08, 0x14, 0x9a, 0xfe, 0x1d, 0x4a, 0xd3, 0xfa, 0x70, 0xc2, 0x5d, 0xc5, 0x11, 0x18, 0xf3, 0x7f, 0xb1, 0x07, 0xf1, 0x61, 0xb7, 0x2f, 0x0b, 0xa1, 0x91, 0x15, 0x3d, 0x96, 0x48, 0x6c, 0x05, 0x1d, 0x58, 0x93, 0xd1, 0x3b, 0xbe, 0x5e, 0xb3, 0x04, 0x52, 0x19, 0x5c, 0xbb, 0x57, 0xca, 0x48, 0x3a, 0x51, 0xb7, 0x36, 0x94, 0x16, 0x28, 0xdb, 0xfa, 0x28, 0x6e, 0xd7, 0xdb, 0x42, 0x24, 0xe8, 0x4f, 0x31, 0xb5, 0x5e, 0xb6, 0xe5, 0x1f, 0xcf, 0x9c, 0xc8, 0xf6, 0x0b, 0xe1, 0x4f, 0xab, 0x52, 0x16, 0xce, 0x0e, 0xc5, 0x29, 0x90, 0x12, 0x1b, 0x45, 0x27, 0xd0, 0x95, 0xf4, 0x01, 0xcf, 0x34, 0x87, 0x3c, 0x83, 0x29, 0xb7, 0xbb, 0x13, 0x8d, 0x8c, 0x7a, 0x60, 0x52, 0x7e, 0x1e, 0x42, 0x7a, 0xdb, 0xd1, 0x14, 0x86, 0x68, 0x4c, 0x74, 0x32, 0x4b, 0x35, 0x44, 0x5f, 0x28, 0xac, 0xf4, 0x51, 0x8b, 0x21, 0x04, 0x1a, 0x86, 0x68, 0xc4, 0x56, 0x9b, 0x0f, 0x5f, 0x19, 0xdb, 0xef, 0x17, 0x26, 0x50, 0x01, 0xd2, 0x62, 0x99, 0x73, 0xd6, 0x88, 0xd4, 0xfb, 0xd1, 0x1d, 0xc1, 0x6c, 0x1c, 0xa7, 0x23, 0x87, 0x40, 0x1a, 0x6a, 0x13, 0xba, 0x93, 0x90, 0x30, 0xfb, 0x48, 0x41, 0xe8, 0xb3, 0xbf, 0x3e, 0x07, 0x4f, 0x3f, 0x03, 0x2c, 0xc0, 0x85, 0xa8, 0x21, 0x7f, 0xb7, 0x05, 0x68, 0xce, 0x9e, 0x19, 0x16, 0x40, 0x0f, 0xad, 0xe5, 0x7b, 0xaa, 0x34, 0x84, 0x3d, 0xc8, 0xf6, 0x31, 0x9d, 0xae, 0x6d, 0x8a, 0x94, 0x07, 0xef, 0xa0, 0xbb, 0x91, 0x8e, 0x4e, 0x56, 0x16, 0x3d, 0xc9, 0x92, 0x9e, 0x34, 0x77, 0x0b, 0xe3, 0x95, 0x05, 0x91, 0x05, 0x4f, 0xb4, 0x2c, 0x7f, 0x42, 0xf3, 0x5d, 0x5a, 0xa5, 0x33, 0xa7, 0xa0, 0xa5, 0xf7, 0x4e, 0x14, 0x4f, 0x2a, 0x5f, 0x20, 0xb0, 0xb6, 0xf0, 0x0f, 0x3b, 0x52, 0xa9, 0x7c, 0x6b, 0x9b, 0x84, 0x0a, 0xa9, 0x67, 0xd0, 0x56, 0x6f, 0x56, 0x7c, 0x2a, 0xae, 0xaa, 0x92, 0xf4, 0x6d, 0x58, 0x02, 0x76, 0xb3, 0x5e, 0xa1, 0xbe, 0xa8, 0x58, 0x71, 0x59, 0xf7, 0x4e, 0x23, 0xc4, 0x76, 0xd1, 0xda, 0x23, 0x09, 0x46, 0x32, 0x35, 0xc4, 0x81, 0x81, 0x88, 0x4f, 0x96, 0x5d, 0xe9, 0x8f, 0xeb, 0x5e, 0x1f, 0x82, 0x92, 0x24, 0xd9, 0x6b, 0xd6, 0x9c, 0xe4, 0x30, 0x14, 0x80, 0xa1, 0x00, 0xcd, 0x1d, 0xb7, 0x38, 0xf8, 0x59, 0x05, 0x88, 0x9d, 0xf4, 0xdb, 0x52, 0x9f, 0x0e, 0x69, 0x52, 0xda, 0xea, 0x77, 0x84, 0x6d, 0xf1, 0x57, 0x42, 0x59, 0xfa, 0x18, 0xad, 0x4c, 0xc8, 0xfd, 0x4f, 0xb7, 0xd4, 0x2d, 0xff, 0x26, 0x4d, 0xac, 0x04, 0xd1, 0x5e, 0x8a, 0x7d, 0x6e, 0xaf, 0x5b, 0x00, 0x4a, 0x2e, 0xe7, 0x81, 0x98, 0x0f, 0x22, 0x75, 0x09, 0x11, 0x5e, 0x38, 0x9d, 0x04, 0xbf, 0xac, 0xb8, 0x88, 0xef, 0x24, 0x78, 0x17, 0x14, 0x80, 0x46, 0x46, 0xff, 0x99, 0xab, 0x47, 0xa6, 0xdf, 0x65, 0xb3, 0xd5, 0x40, 0xbb, 0x86, 0x20, 0x4c, 0x0d, 0x6c, 0x1c, 0x97, 0xaf, 0x3b, 0xcf, 0x5f, 0xf8, 0xc0, 0x64, 0x6f, 0x95, 0xbe, 0x23, 0x43, 0x23, 0x34, 0xa1, 0x6d, 0xfe, 0xdf, 0x34, 0x38, 0x53, 0x00, 0xaa, 0x8a, 0x7d, 0x5f, 0x3b, 0x0f, 0x8e, 0x90, 0xbb, 0x93, 0x2b, 0x75, 0x15, 0xb0, 0x9e, 0x04, 0xf4, 0xaa, 0x26, 0x4a, 0xc3, 0x97, 0x91, 0xb0, 0xd8, 0xc3, 0x0d, 0x7e, 0xec, 0x52, 0x3c, 0x9d, 0xcf, 0x27, 0x86, 0xa1, 0x59, 0x05, 0xb3, 0x07, 0xa4, 0xf4, 0xb9, 0xba, 0x78, 0xe7, 0xd2, 0xdc, 0x07, 0x9b, 0xd2, 0xc4, 0xdb, 0xc2, 0xb8, 0x43, 0x0c, 0x61, 0x83, 0x2c, 0xb6, 0x77, 0x47, 0x13, 0xaa, 0xdf, 0x7f, 0x54, 0x64, 0x77, 0xa5, 0x58, 0x3e, 0x82, 0x00, 0x13, 0xe3, 0x4b, 0xbe, 0xd1, 0x05, 0x0c, 0x42, 0x33, 0x53, 0x0d, 0xbf, 0x74, 0xa5, 0x10, 0x06, 0xf1, 0x7a, 0xed, 0x9c, 0xe9, 0xa5, 0x7a, 0x10, 0x81, 0x43, 0xad, 0x8b, 0x0b, 0xf0, 0x05, 0xa9, 0x87, 0x3b, 0x25, 0x87, 0x6a, 0x57, 0xc3, 0x1e, 0x9f, 0x13, 0xc0, 0xcf, 0xcc, 0x0b, 0x98, 0x3e, 0xd6, 0x20, 0xfd, 0x64, 0xa7, 0x27, 0xbf, 0xe0, 0x2f, 0xde, 0xef, 0x8e, 0xa8, 0x24, 0x44, 0x5b, 0x1f, 0x69, 0xbd, 0x58, 0x30, 0x63, 0x88, 0x0d, 0x11, 0x02, 0x23, 0x0f, 0xd2, 0xa7, 0xc1, 0xd5, 0xe2, 0x91, 0xef, 0xc7, 0xd6, 0x97, 0x77, 0x98, 0x66, 0x1d, 0x85, 0xd6, 0xb8, 0x41, 0x08, 0xbf, 0xe2, 0x55, 0x5b, 0x57, 0xaa, 0x92, 0x25, 0xb7, 0x8f, 0x0a, 0x7e, 0xa8, 0x0e, 0xdf, 0x53, 0x70, 0x1e, 0xb3, 0x0b, 0xec, 0xfd, 0x5f, 0x6a, 0xdf, 0x2e, 0xe8, 0xb6, 0x8a, 0xc3, 0xaf, 0x19, 0x7d, 0xd8, 0xe7, 0x47, 0xac, 0x60, 0x4c, 0x60, 0xc5, 0x24, 0x12, 0x18, 0xc1, 0x08, 0x1c, 0x15, 0xba, 0x90, 0x6f, 0x99, 0xfc, 0xa4, 0xe6, 0x60, 0x5e, 0x90, 0x27, 0xcc, 0xd3, 0x4f, 0xd5, 0x3f, 0x3c, 0x09, 0x08, 0xc8, 0x80, 0xda, 0xfa, 0x03, 0xdf, 0xd5, 0x03, 0x3a, 0x83, 0x49, 0xc7, 0xd0, 0x58, 0x42, 0xae, 0xe0, 0x1e, 0x53, 0x94, 0x21, 0xbd, 0x93, 0xc2, 0x0d, 0xd8, 0xe6, 0x1d, 0x42, 0xa4, 0x7e, 0x9e, 0x28, 0xfb, 0xa1, 0x02, 0xd4, 0xac, 0xac, 0xc3, 0x2c, 0x16, 0x58, 0x46, 0x4c, 0xf5, 0x3c, 0x56, 0x29, 0x7b, 0x93, 0xd1, 0x74, 0xa3, 0x40, 0xa1, 0xc2, 0xc2, 0x0f, 0xee, 0xe9, 0x5e, 0x3e, 0x92, 0xad, 0x44, 0x3c, 0xce, 0x9c, 0xd5, 0xb0, 0x3b, 0x36, 0xa1, 0xbd, 0x03, 0x51, 0x37, 0x84, 0x50, 0xbc, 0x3a, 0xeb, 0x05, 0x23, 0xb8, 0x9d, 0xad, 0x32, 0xb8, 0x53, 0xb0, 0xfd, 0x12, 0x51, 0xcd, 0xa0, 0x84, 0x33, 0xc4, 0x22, 0x01, 0xe9, 0x53, 0xa0, 0x4c, 0x01, 0x64, 0xa7, 0xc6, 0x24, 0x85, 0xe1, 0x85, 0xe4, 0x98, 0xf4, 0xa5, 0xb5, 0xcc, 0xa7, 0xe3, 0x38, 0xcc, 0x47, 0x67, 0xc0, 0x36, 0x49, 0xe2, 0x0f, 0x4e, 0x30, 0xd9, 0x60, 0xf4, 0xb1, 0x41, 0xab, 0xd3, 0x15, 0x4b, 0x24, 0xdc, 0xe0, 0x81, 0x04, 0xf3, 0xb0, 0x12, 0x8d, 0xe7, 0x67, 0x6a, 0x48, 0xa8, 0x8c, 0x06, 0x92, 0xb4, 0xef, 0x87, 0x56, 0xd3, 0x8c, 0x05, 0x1c, 0x04, 0xb2, 0xa5, 0x43, 0xb7, 0x65, 0x6e, 0x8a, 0x3c, 0x00, 0x58, 0xd6, 0x7c, 0x1f, 0xa6, 0x2f, 0xe7, 0xbb, 0x76, 0x0b, 0xad, 0x97, 0x97, 0xcf, 0x31, 0xdb, 0x9a, 0x93, 0xbb, 0xff, 0x2c, 0x25, 0x6c, 0xeb, 0xa3, 0x51, 0x78, 0x5d, 0xd6, 0x60, 0x8f, 0x8a, 0x32, 0xdf, 0x9c, 0x08, 0x0a, 0xa2, 0xb2, 0xeb, 0x2f, 0x08, 0x43, 0x2f, 0xc1, 0x7f, 0x94, 0x56, 0x44, 0x4b, 0x6d, 0x51, 0xf6, 0x84, 0x15, 0xa4, 0x60, 0x5e, 0x7e, 0xc6, 0x2c, 0xae, 0xbc, 0xc6, 0x36, 0xa9, 0xbb, 0x34, 0xe6, 0xee, 0x32, 0x3f, 0xbc, 0xc7, 0xd3, 0x1b, 0x2c, 0xab, 0xc5, 0xa6, 0xad, 0x08, 0x53, 0x4a, 0x0d, 0x40, 0xe6, 0x25, 0x07, 0xf1, 0x30, 0x67, 0x17, 0x7a, 0xab, 0xfc, 0x8d, 0xbb, 0x42, 0x6c, 0xe1, 0x1c, 0x4d, 0xff, 0x46, 0xd0, 0xc3, 0x24, 0x81, 0x5b, 0xab, 0x13, 0xfc, 0x51, 0xd4, 0xb2, 0x16, 0x61, 0xc6, 0xb5, 0xbe, 0x93, 0xf8, 0x0a, 0x40, 0xce, 0x44, 0x74, 0x5e, 0x9d, 0x97, 0x76, 0xa3, 0x32, 0xed, 0x72, 0xf4, 0xac, 0x7d, 0x12, 0x68, 0x95, 0x30, 0xe7, 0x5a, 0xaf, 0x58, 0x50, 0xbc, 0xf0, 0x9f, 0x9e, 0xad, 0xcb, 0x3d, 0x75, 0x4e, 0xb1, 0x6f, 0x75, 0xd2, 0xd8, 0x24, 0x1a, 0xd5, 0x3b, 0xf9, 0xe1, 0xef, 0xe2, 0x67, 0xad, 0x88, 0x63, 0x3b, 0x68, 0xee, 0xa9, 0x47, 0xed, 0xa4, 0xf4, 0x58, 0x26, 0xfe, 0x21, 0x68, 0x71, 0xea, 0x2c, 0x14, 0x49, 0x11, 0xf3, 0x50, 0x22, 0x1f, 0x3c, 0x59, 0x94, 0x5e, 0xfa, 0xeb, 0xbc, 0x8a, 0xcc, 0xb5, 0xe0, 0xe1, 0xc7, 0x0a, 0x51, 0x79, 0x75, 0xd9, 0x96, 0xd6, 0x1d, 0xdf, 0xc6, 0xbc, 0x45, 0x1b, 0x36, 0x42, 0x76, 0x82, 0x54, 0x28, 0x3f, 0xf5, 0xd3, 0x6a, 0x7c, 0x70, 0x09, 0x15, 0xd9, 0x84, 0x95, 0x5a, 0x91, 0x07, 0x44, 0xe1, 0x7c, 0x0a, 0x36, 0x60, 0x48, 0x0b, 0x3c, 0x6b, 0x06, 0x6c, 0x85, 0x8e, 0xe9, 0x24, 0x7a, 0x99, 0x4b, 0xb5, 0xe6, 0x3b, 0xf1, 0x5e, 0x5a, 0xd2, 0x90, 0x91, 0xd0, 0x82, 0x90, 0xa7, 0x8e, 0x84, 0x0f, 0xd3, 0x4d, 0xc1, 0x29, 0x54, 0x9b, 0xa0, 0x77, 0xef, 0x7e, 0x1c, 0xd5, 0x9d, 0x5a, 0x19, 0x69, 0x81, 0x14, 0xf8, 0xe1, 0x1c, 0x78, 0x69, 0xfb, 0xc4, 0xd8, 0x80, 0x4b, 0x52, 0xf6, 0x0c, 0x39, 0x1c, 0x25, 0x24, 0x49, 0x23, 0xaa, 0x02, 0x9f, 0x8d, 0x68, 0x15, 0xc2, 0x55, 0xbd, 0x51, 0xa0, 0x41, 0xa7, 0xca, 0xd2, 0x14, 0x2b, 0x81, 0x22, 0x05, 0xf7, 0x7d, 0x4a, 0x71, 0x46, 0x1e, 0xff, 0xcd, 0x04, 0xaf, 0x2e, 0xde, 0x32, 0x3a, 0x86, 0x2c, 0x8d, 0xa0, 0x36, 0xb4, 0x6a, 0xe8, 0xf8, 0xdd, 0xe5, 0xd8, 0x4e, 0xad, 0x3a, 0xc2, 0x0b, 0x3d, 0x73, 0xa1, 0x16, 0x6a, 0x44, 0x65, 0x6b, 0xce, 0x33, 0x8a, 0x62, 0xef, 0xfb, 0xef, 0x34, 0xb5, 0x33, 0xe6, 0xbb, 0x22, 0x2b, 0x87, 0x79, 0x3d, 0x17, 0x4b, 0xdc, 0x4f, 0x6f, 0xd6, 0xc0, 0x52, 0x95, 0x13, 0x36, 0xa7, 0xb9, 0x86, 0x84, 0x07, 0xfa, 0xde, 0x6d, 0xbc, 0xcd, 0xca, 0xb2, 0x11, 0xa3, 0x0e, 0xd8, 0x07, 0xc6, 0xd6, 0x2c, 0x49, 0x84, 0x4a, 0x05, 0x62, 0x90, 0x62, 0x49, 0x2e, 0xa5, 0xfc, 0x32, 0x8e, 0x6c, 0x2c, 0x52, 0x60, 0xa0, 0xd3, 0xd5, 0xaf, 0x70, 0x73, 0x07, 0x26, 0x25, 0x41, 0x16, 0xcb, 0x04, 0x7c, 0x18, 0xea, 0x76, 0xfe, 0x4f, 0x4e, 0x66, 0x11, 0xac, 0xb7, 0xeb, 0x83, 0x93, 0x89, 0x27, 0xfd, 0xde, 0xc2, 0x6f, 0x90, 0x24, 0x2e, 0xab, 0x91, 0x3b, 0xde, 0x00, 0xa7, 0xfb, 0xd6, 0xad, 0x22, 0x45, 0x06, 0x33, 0x8e, 0x44, 0x7c, 0xb9, 0x88, 0xf3, 0xd7, 0xae, 0xd1, 0xe0, 0xff, 0xb0, 0xa1, 0x2f, 0x13, 0xad, 0x3e, 0xe1, 0xa3, 0x48, 0xcc, 0x57, 0x20, 0x7e, 0x67, 0x11, 0x90, 0x89, 0x6f, 0xbc, 0x86, 0x04, 0x23, 0x6c, 0x52, 0x51, 0x72, 0x26, 0x75, 0x38, 0x0d, 0xa1, 0x58, 0xd0, 0xc1, 0x4d, 0x3d, 0xa3, 0x04, 0x95, 0x75, 0x0d, 0xce, 0x61, 0xd3, 0xe5, 0xaa, 0xe0, 0x62, 0x5f, 0x0c, 0x84, 0x53, 0x31, 0xe5, 0x4e, 0x39, 0xf5, 0x75, 0x4b, 0x79, 0xcf, 0x60, 0x5f, 0xfb, 0x4f, 0x05, 0x41, 0x26, 0x99, 0x0b, 0xc7, 0x0c, 0xc3, 0x3c, 0x64, 0xe1, 0x7e, 0x97, 0xef, 0xb2, 0xf9, 0xa0, 0xa5, 0x53, 0x02, 0xfb, 0x72, 0x9a, 0x6f, 0x39, 0x6c, 0xca, 0xbc, 0xf2, 0xa0, 0x52, 0xf5, 0x14, 0x12, 0xb8, 0xd6, 0x7a, 0xff, 0xd0, 0x32, 0xc1, 0x65, 0x31, 0x91, 0x57, 0xc6, 0xe9, 0x1d, 0xd4, 0x28, 0x70, 0xbf, 0x8e, 0x60, 0xdb, 0x85, 0x67, 0x90, 0x52, 0x47, 0xea, 0xef, 0xc4, 0x8a, 0x97, 0xc8, 0xd9, 0xa4, 0x7a, 0xc6, 0x29, 0x21, 0x03, 0x6e, 0xab, 0x66, 0x11, 0xed, 0x70, 0x94, 0x50, 0x14, 0x91, 0xaf, 0xc5, 0xa1, 0x66, 0x00, 0xa7, 0xc0, 0xf8, 0xb7, 0x71, 0xd1, 0xb9, 0xd5, 0x35, 0x6c, 0x73, 0x49, 0x33, 0xa2, 0x7f, 0x59, 0xaa, 0x86, 0x37, 0x44, 0xee, 0xed, 0xad, 0x26, 0xbb, 0x71, 0x9e, 0x1b, 0xc9, 0xbc, 0xa1, 0xa7, 0xa0, 0x03, 0xa4, 0x56, 0xae, 0xd0, 0x99, 0x9f, 0x97, 0x05, 0x6d, 0x0e, 0xcc, 0x1e, 0x3a, 0xa3, 0x5f, 0xb6, 0xbd, 0x75, 0x16, 0x4c, 0x0a, 0x9a, 0xbe, 0x48, 0x7e, 0x4b, 0xc1, 0x39, 0xf6, 0x44, 0xfb, 0x61, 0x3e, 0x6a, 0xca, 0x73, 0xcd, 0xb0, 0x64, 0x9b, 0xaf, 0x3b, 0x6e, 0xbf, 0xc2, 0xc5, 0xca, 0x05, 0x25, 0x3f, 0xb0, 0x95, 0xee, 0xba, 0x00, 0xa0, 0x1b, 0x87, 0xd6, 0xa1, 0xcc, 0x9d, 0x5f, 0xe2, 0xaf, 0x3c, 0xec, 0x42, 0xbb, 0xd0, 0x45, 0x37, 0x21, 0x18, 0x40, 0x0f, 0x7f, 0x87, 0x92, 0x7b, 0x57, 0xeb, 0xe4, 0x4d, 0xc1, 0x4c, 0x2a, 0x81, 0x5c, 0x17, 0x30, 0x7a, 0x8a, 0x7c, 0x75, 0x8f, 0xdd, 0x14, 0x3d, 0xc6, 0xcc, 0xc7, 0xe2, 0xdf, 0xab, 0xed, 0x6b, 0x95, 0xda, 0xb3, 0x5f, 0x20, 0x3c, 0xc0, 0xdc, 0xfe, 0xea, 0x19, 0xe3, 0xf3, 0x29, 0x42, 0xf6, 0x4f, 0x9a, 0xa7, 0xe5, 0x6f, 0xb1, 0x3a, 0xe5, 0x86, 0x68, 0x5c, 0xe2, 0x9e, 0x35, 0x01, 0x16, 0xd9, 0x39, 0x0f, 0xdb, 0xfd, 0xba, 0x08, 0xbd, 0x2f, 0xd3, 0xe9, 0xd4, 0xff, 0x6a, 0x52, 0x51, 0xa5, 0x63, 0xe6, 0x56, 0x8a, 0x13, 0xf5, 0x0b, 0x0b, 0xf8, 0x59, 0xee, 0x79, 0xa7, 0x9d, 0x6a, 0x64, 0x05, 0x65, 0xac, 0x19, 0xba, 0x09, 0xb2, 0x69, 0xe3, 0x84, 0xa4, 0xac, 0x07, 0x8d, 0x68, 0x06, 0x4d, 0x03, 0x71, 0xe9, 0xec, 0x8e, 0xd7, 0xdb, 0xe2, 0x84, 0xad, 0x7a, 0xe9, 0x09, 0x8f, 0xbd, 0xa7, 0x7b, 0x7a, 0x7c, 0x25, 0x0d, 0xe0, 0x33, 0x82, 0xb1, 0xfc, 0x03, 0xe9, 0x3c, 0x64, 0xf9, 0xc0, 0xc4, 0xdd, 0x93, 0x22, 0x4d, 0x72, 0x80, 0x90, 0xa5, 0xc8, 0xa8, 0xe3, 0x8d, 0xac, 0x6c, 0x85, 0x19, 0xee, 0x2f, 0xe1, 0x5a, 0x72, 0x15, 0x18, 0x3a, 0x84, 0x0a, 0xf6, 0xa6, 0x6c, 0x07, 0x24, 0xf3, 0x42, 0x90, 0x9f, 0x7a, 0x04, 0x82, 0x68, 0x86, 0xe6, 0x0b, 0x7e, 0x71, 0xe9, 0xfa, 0x09, 0x09, 0xaf, 0x39, 0xd8, 0x38, 0x8e, 0x97, 0x0d, 0xe5, 0xe3, 0xcb, 0x17, 0x15, 0xa9, 0xb6, 0xe1, 0x56, 0x4a, 0xe9, 0x49, 0x5d, 0xb4, 0x67, 0xd4, 0xee, 0xb0, 0xac, 0xa0, 0xfc, 0x6f, 0xee, 0x9a, 0x12, 0x66, 0xa2, 0xf0, 0xf1, 0x5d, 0x42, 0xca, 0x7b, 0xc2, 0x4e, 0x35, 0xcf, 0x42, 0x91, 0x5f, 0xb6, 0x9b, 0xa5, 0x0a, 0x3e, 0xab, 0xb9, 0x3b, 0xa4, 0xcd, 0x92, 0x32, 0x77, 0x66, 0xd0, 0x9f, 0xfb, 0xbb, 0x73, 0x13, 0xcc, 0x06, 0x9d, 0xb5, 0xc3, 0xc8, 0x99, 0x36, 0x1d, 0x60, 0x1d, 0x07, 0xda, 0xdd, 0xcc, 0xc9, 0x64, 0x11, 0xff, 0x05, 0x71, 0xe6, 0xc5, 0x1d, 0x2a, 0xf6, 0x29, 0x82, 0x8d, 0x55, 0xb3, 0x28, 0x10, 0xb1, 0x31, 0x37, 0x87, 0x9e, 0xb6, 0x04, 0x47, 0x2b, 0xe4, 0x3f, 0x8c, 0xb9, 0x67, 0x6e, 0x18, 0x0d, 0xc2, 0x99, 0x1d, 0xa3, 0x4e, 0x47, 0x5d, 0x45, 0x7f, 0xaa, 0x90, 0xdd, 0x6a, 0x17, 0x06, 0x88, 0x84, 0xb9, 0x8d, 0xeb, 0xad, 0x85, 0x95, 0xca, 0x6d, 0x70, 0x92, 0xd6, 0x7d, 0xe0, 0xa2, 0xc7, 0x89, 0x61, 0x70, 0xab, 0x34, 0x9a, 0x58, 0x7e, 0x5d, 0x7f, 0xcc, 0xfa, 0xa0, 0xc8, 0xf6, 0xb0, 0x20, 0xa1, 0x9e, 0x58, 0x84, 0xa3, 0x4f, 0x66, 0x40, 0x03, 0xb5, 0xde, 0x16, 0x09, 0x4a, 0x68, 0xdc, 0xc4, 0x32, 0xa7, 0x7f, 0xfd, 0x62, 0xc7, 0x48, 0x69, 0x08, 0x55, 0x5e, 0x22, 0x27, 0x54, 0x8d, 0x58, 0x82, 0x8d, 0x45, 0x44, 0xbc, 0x26, 0xe6, 0x5e, 0xbd, 0x76, 0x3a, 0xd0, 0x58, 0x18, 0x43, 0x2a, 0x2a, 0x3e, 0x38, 0x57, 0xc5, 0x48, 0xca, 0xd0, 0x0e, 0x96, 0xab, 0x0f, 0xe3, 0x9a, 0x51, 0x47, 0x01, 0x31, 0xf8, 0x52, 0x25, 0x33, 0xe6, 0xeb, 0x72, 0x48, 0xf2, 0x1d, 0x13, 0xfe, 0x47, 0xfb, 0x21, 0x19, 0x66, 0x92, 0xc7, 0x2b, 0x6a, 0x1c, 0xa4, 0x64, 0x90, 0x77, 0x70, 0xaa, 0xf6, 0xd5, 0xe3, 0xec, 0xa3, 0xb4, 0xd2, 0xb4, 0xc8, 0x11, 0x9c, 0xfc, 0x45, 0xd8, 0xc4, 0x43, 0x6f, 0xa0, 0xdf, 0xe0, 0x11, 0x95, 0xb1, 0x95, 0xb1, 0xb5, 0x93, 0x67, 0x14, 0x40, 0x17, 0xad, 0x04, 0x69, 0xef, 0x68, 0x50, 0x52, 0x0b, 0xd2, 0x15, 0x37, 0x02, 0x3a, 0x3c, 0xea, 0xb3, 0x0e, 0x44, 0x7f, 0x2c, 0x3a, 0x41, 0x48, 0xcb, 0xb0, 0x25, 0x04, 0xa2, 0x48, 0x3f, 0x53, 0x20, 0xcb, 0x01, 0x6d, 0xee, 0x4a, 0x06, 0x14, 0x18, 0xb5, 0x54, 0xc7, 0x6d, 0xa9, 0xde, 0x39, 0x28, 0x88, 0x4d, 0x01, 0xd0, 0xcf, 0xff, 0x93, 0x5c, 0xa4, 0x50, 0x6f, 0x9b, 0xaf, 0x19, 0x98, 0xd3, 0x2b, 0x77, 0x48, 0xa9, 0x3d, 0xce, 0xe2, 0x40, 0x84, 0x0d, 0x28, 0xa5, 0xf1, 0x33, 0xae, 0x6b, 0xd9, 0x12, 0x8e, 0x92, 0x48, 0x52, 0x5e, 0xae, 0x99, 0xba, 0x5f, 0x44, 0x43, 0xab, 0xf7, 0x78, 0xf6, 0xed, 0x62, 0xe5, 0xe7, 0xaf, 0xa4, 0xcd, 0x68, 0xc8, 0xc2, 0x72, 0xbb, 0x43, 0x31, 0xc3, 0x28, 0x1b, 0x8f, 0x3b, 0x4d, 0x43, 0x91, 0x07, 0xb6, 0xe9, 0x3d, 0x67, 0xad, 0xfc, 0x59, 0x56, 0x53, 0xec, 0x23, 0x6d, 0xf0, 0xb1, 0x42, 0x05, 0x88, 0x0e, 0xfd, 0x9c, 0xaf, 0x17, 0xab, 0x7a, 0x9d, 0xf1, 0x6a, 0x93, 0x85, 0xd9, 0x14, 0xb0, 0x23, 0x67, 0x6f, 0xca, 0x95, 0x14, 0xa4, 0xb6, 0x6b, 0xfb, 0xf3, 0x08, 0x01, 0xdc, 0xa4, 0x31, 0x0d, 0x66, 0x41, 0xea, 0x74, 0xb6, 0x02, 0xd6, 0x62, 0x1b, 0x89, 0x62, 0x99, 0x1c, 0xcf, 0xf1, 0x09, 0xbc, 0x5f, 0x36, 0xa1, 0xfc, 0xc2, 0xe0, 0x66, 0xa2, 0x3a, 0x7d, 0xc2, 0x39, 0xb3, 0x98, 0x1e, 0x59, 0xf6, 0x25, 0xb3, 0x28, 0x20, 0x20, 0x9c, 0x21, 0x52, 0x70, 0x30, 0x14, 0xab, 0x11, 0x90, 0x6e, 0x73, 0x72, 0x7c, 0xbb, 0x99, 0x1c, 0x6b, 0x69, 0x60, 0x95, 0xda, 0xcf, 0x55, 0x84, 0xe4, 0x6e, 0x84, 0x15, 0x13, 0x76, 0xeb, 0x9f, 0x76, 0x8c, 0x2f, 0x85, 0xf3, 0xca, 0x8e, 0x5a, 0xdf, 0x07, 0x15, 0x48, 0xcc, 0x59, 0x13, 0xb2, 0xa2, 0xd9, 0xcd, 0x18, 0xf2, 0xa6, 0x73, 0x3b, 0x86, 0x2d, 0x53, 0x82, 0x3d, 0xa7, 0x4d, 0x9d, 0x16, 0xe2, 0x87, 0x68, 0x8a, 0x45, 0x62, 0x12, 0x1f, 0x0f, 0xac, 0x7e, 0x3a, 0xdf, 0x17, 0xe9, 0x34, 0x79, 0xe9, 0xce, 0xb1, 0xc7, 0xf6, 0x06, 0x2d, 0x1e, 0xcb, 0x34, 0xd8, 0xc3, 0x2d, 0x60, 0xa4, 0xae, 0xc2, 0xe2, 0x9c, 0x8d, 0x0d, 0x82, 0x77, 0x0c, 0xa0, 0xdd, 0x6d, 0x54, 0x8c, 0x0b, 0x49, 0xd1, 0x1d, 0x7e, 0xc0, 0x39, 0xc4, 0x2d, 0x01, 0xca, 0x55, 0xf2, 0x8d, 0xd3, 0x72, 0x31, 0x49, 0x75, 0x47, 0xbb, 0xd1, 0xab, 0x79, 0xf2, 0x10, 0x88, 0x58, 0x2d, 0x0e, 0xc0, 0x5c, 0x5e, 0x08, 0x6a, 0xcf, 0xf2, 0xc6, 0x04, 0xc7, 0xf8, 0x29, 0xb8, 0x57, 0x86, 0x04, 0xdd, 0x06, 0x58, 0x2c, 0xc1, 0x80, 0xbb, 0xd3, 0xa6, 0x8c, 0xa9, 0x11, 0x0a, 0x3e, 0x36, 0xc4, 0x2c, 0x6e, 0x2b, 0x9a, 0xcb, 0x69, 0xf0, 0x6c, 0x31, 0xe5, 0xaf, 0xce, 0x70, 0x3b, 0xb6, 0xe4, 0xec, 0xd0, 0x1d, 0x77, 0x19, 0xd4, 0xa9, 0x47, 0x86, 0x30, 0xf1, 0xa3, 0x1b, 0xb9, 0xbf, 0x38, 0x9f, 0xaa, 0xb9, 0x27, 0x7c, 0x51, 0x41, 0x5a, 0xc7, 0x08, 0x99, 0x17, 0x7b, 0x67, 0x4b, 0xd5, 0x05, 0xb8, 0xc8, 0x4f, 0x06, 0xab, 0x4f, 0xd8, 0x54, 0x4c, 0x10, 0xee, 0x42, 0x31, 0x92, 0x11, 0x21, 0xf8, 0x52, 0xd6, 0x06, 0xf1, 0xad, 0x37, 0xce, 0x17, 0xff, 0x2d, 0x60, 0x45, 0x0d, 0x81, 0x32, 0xa6, 0xa0, 0xde, 0x0f, 0x6e, 0x73, 0x2c, 0x17, 0xc7, 0x4f, 0x19, 0x07, 0x0e, 0x75, 0xf8, 0xba, 0x40, 0x3c, 0xcf, 0xf0, 0xaf, 0xfb, 0xab, 0x4f, 0xfa, 0x29, 0x37, 0xa7, 0x3b, 0xc3, 0x8d, 0x7a, 0x82, 0xee, 0x4c, 0xbc, 0x83, 0xde, 0xeb, 0xd7, 0x8b, 0xf6, 0x4d, 0xf2, 0xb9, 0x31, 0x95, 0x73, 0x6a, 0xc0, 0x3b, 0xc2, 0xf5, 0xf5, 0x60, 0x50, 0x99, 0x5f, 0x5e, 0xd9, 0xb3, 0x37, 0xa4, 0xe6, 0x34, 0xfa, 0xc1, 0x95, 0x53, 0x58, 0xbe, 0x9c, 0x7f, 0x4d, 0xb1, 0x8c, 0x98, 0x8e, 0x8f, 0x53, 0x5e, 0x26, 0x42, 0x05, 0x2a, 0x61, 0xfb, 0xdc, 0xdc, 0xe9, 0xca, 0x7d, 0x14, 0x2f, 0x6c, 0x7c, 0xa5, 0x0c, 0x64, 0x23, 0x46, 0xa9, 0x4d, 0x6f, 0x8b, 0x9c, 0x6e, 0x5c, 0x14, 0x53, 0x8f, 0x62, 0x05, 0xb6, 0x0b, 0x40, 0xb5, 0x08, 0x27, 0xf8, 0xab, 0x0e, 0xa2, 0x1b, 0xc6, 0x74, 0x8d, 0x46, 0xbb, 0x6c, 0x5d, 0xed, 0xc5, 0x98, 0x3f, 0x57, 0x97, 0x2a, 0xab, 0xea, 0x96, 0x4a, 0x3c, 0xa9, 0x45, 0xb8, 0xbf, 0xfb, 0x00, 0xb2, 0x8a, 0xae, 0xee, 0x18, 0x0f, 0x3b, 0x31, 0xce, 0xb0, 0x4c, 0x5f, 0x62, 0xd5, 0x7b, 0x36, 0xee, 0x3c, 0x5d, 0x8b, 0x40, 0x91, 0xbf, 0x84, 0x39, 0x3f, 0x2f, 0x07, 0x73, 0x85, 0xbf, 0x72, 0x26, 0xcc, 0x05, 0x8d, 0x4d, 0x38, 0x66, 0xbd, 0x04, 0x7d, 0x95, 0x7a, 0x35, 0xf4, 0x56, 0x02, 0x73, 0xee, 0x88, 0x4f, 0x26, 0x48, 0x62, 0x47, 0xe9, 0x3f, 0xfd, 0x34, 0x30, 0x86, 0x12, 0x73, 0x2e, 0x96, 0x06, 0x70, 0xf6, 0x46, 0x23, 0xd2, 0xe0, 0x9b, 0x29, 0xf2, 0x2e, 0xe1, 0x05, 0x92, 0xef, 0xfa, 0xe0, 0xcc, 0x24, 0xf7, 0x5b, 0x48, 0x22, 0xe5, 0x19, 0xb2, 0x37, 0xe9, 0x7f, 0x6b, 0x90, 0x90, 0xb7, 0x7f, 0x5a, 0x60, 0xfb, 0xd8, 0x28, 0xb3, 0x10, 0xb1, 0x95, 0xc5, 0x10, 0x4d, 0x2a, 0x0b, 0x6d, 0xe8, 0x82, 0xc6, 0x33, 0xee, 0xab, 0xd9, 0x8d, 0x6b, 0xd0, 0xd7, 0x8b, 0xc2, 0x15, 0x61, 0x22, 0xa3, 0xc3, 0xaf, 0x75, 0x37, 0xa5, 0x6c, 0x52, 0x9d, 0xb2, 0xc7, 0x00, 0x9a, 0xeb, 0xc7, 0x38, 0x8c, 0x87, 0xde, 0x71, 0xa0, 0x4e, 0xc2, 0x61, 0x45, 0x43, 0x78, 0xc0, 0xe1, 0x85, 0xb1, 0x4f, 0xc2, 0x77, 0x5a, 0x19, 0x57, 0x1f, 0x6f, 0xf8, 0xa0, 0xcc, 0x10, 0x5c, 0xe3, 0xfc, 0xd6, 0x48, 0xa1, 0x7c, 0x67, 0x9d, 0xc8, 0xd1, 0x48, 0x9b, 0x2a, 0xd7, 0xf3, 0xa5, 0x2e, 0xa8, 0x2a, 0x44, 0xc5, 0xbf, 0x8a, 0x6f, 0xa0, 0x5e, 0x63, 0x0a, 0xa1, 0x2c, 0xc7, 0xac, 0x8f, 0x23, 0xe1, 0xa5, 0x0d, 0xa9, 0x88, 0x40, 0xcd, 0xfd, 0x14, 0x45, 0x01, 0xd5, 0x71, 0xc2, 0x12, 0x46, 0x72, 0x0b, 0x95, 0xe3, 0x67, 0x00, 0x7b, 0x29, 0xf1, 0x8e, 0x87, 0x1b, 0x15, 0x79, 0x06, 0x29, 0x90, 0x58, 0xba, 0x56, 0x6a, 0xe1, 0x17, 0x9a, 0xce, 0x66, 0xb2, 0x85, 0x19, 0xa0, 0xf6, 0x26, 0x31, 0xac, 0x18, 0x2b, 0x18, 0x53, 0x4e, 0x49, 0xc1, 0x8e, 0x3c, 0xdf, 0x22, 0x49, 0xaf, 0xd6, 0x8a, 0x68, 0x8e, 0xcb, 0x35, 0x08, 0x0e, 0x70, 0x1e, 0x07, 0x24, 0x2f, 0x14, 0xc6, 0x40, 0x11, 0x10, 0x2d, 0x38, 0xdf, 0xc6, 0xf0, 0x82, 0x87, 0x7a, 0x11, 0xa7, 0xc0, 0x15, 0xa7, 0xf4, 0xf1, 0x78, 0xdd, 0x73, 0x4f, 0x10, 0x3d, 0x1a, 0x46, 0xaa, 0x2f, 0x41, 0x1b, 0x89, 0xbc, 0x5a, 0xcf, 0xb6, 0x98, 0xdc, 0x46, 0x98, 0x60, 0x80, 0xa9, 0xc4, 0x20, 0xb0, 0x08, 0x16, 0x18, 0x3c, 0x44, 0x01, 0xc0, 0x50, 0x2c, 0x23, 0x09, 0xa3, 0xe6, 0x1d, 0xe6, 0xf0, 0x91, 0xa1, 0x0b, 0xaa, 0x28, 0xcd, 0xf4, 0xec, 0xa9, 0xb7, 0x2a, 0xaf, 0x77, 0x49, 0xc2, 0x3f, 0xfd, 0x4f, 0x26, 0xf0, 0x95, 0xce, 0x18, 0x0c, 0xa8, 0x97, 0xf3, 0x11, 0x16, 0x1d, 0x34, 0x19, 0xd8, 0x84, 0x3a, 0x9a, 0xe4, 0xfa, 0x4a, 0x4f, 0x50, 0x4a, 0xd6, 0x76, 0xbb, 0xae, 0xff, 0x3c, 0xe9, 0xe5, 0x58, 0x76, 0xad, 0x86, 0xed, 0x91, 0x0c, 0x94, 0x84, 0xcc, 0x9f, 0x52, 0x22, 0xa4, 0x39, 0x59, 0xd1, 0x90, 0xca, 0xe7, 0xa1, 0xef, 0x83, 0x7a, 0xed, 0x3f, 0x3b, 0x9e, 0xdf, 0x8f, 0x12, 0x03, 0x36, 0x37, 0x54, 0xd2, 0x47, 0xc6, 0xa0, 0x41, 0x42, 0x3c, 0x49, 0x66, 0xb7, 0x7a, 0xfc, 0x48, 0x59, 0xf6, 0xa3, 0x3c, 0x01, 0xb3, 0x8a, 0x6f, 0xf6, 0x71, 0xc0, 0xbf, 0x6b, 0x21, 0xc1, 0xcf, 0x49, 0x9b, 0x51, 0x5a, 0x2f, 0x93, 0xab, 0xc7, 0xb7, 0xc9, 0xdb, 0xfe, 0xfc, 0x81, 0x69, 0x7b, 0x59, 0x33, 0x37, 0xa0, 0x73, 0x83, 0xac, 0x50, 0x79, 0x73, 0x12, 0xb9, 0xaa, 0xd8, 0x3d, 0x71, 0x18, 0x0b, 0x6e, 0xc5, 0xac, 0xe0, 0x77, 0x4e, 0x6b, 0xdc, 0x1f, 0xc5, 0xf7, 0xa2, 0xc7, 0x17, 0x59, 0xaf, 0x4e, 0xbc, 0xfd, 0x47, 0x33, 0x45, 0xfe, 0xaf, 0xf9, 0x35, 0xa5, 0x9d, 0xd0, 0x12, 0x2c, 0xed, 0x71, 0xbc, 0xc7, 0x95, 0x4a, 0xfd, 0xe5, 0xdb, 0xdb, 0x60, 0xb2, 0xc6, 0x60, 0x47, 0xe1, 0xd2, 0xb0, 0x38, 0xaa, 0xe7, 0x65, 0x78, 0x0e, 0x8c, 0x3d, 0xdb, 0x62, 0x59, 0xc0, 0xda, 0x0b, 0xaa, 0x23, 0xe6, 0x87, 0x9b, 0x6d, 0xfc, 0xad, 0x30, 0xd8, 0x7a, 0x35, 0xd3, 0x7a, 0x31, 0x7a, 0x04, 0x24, 0xbb, 0x7f, 0x4c, 0x8b, 0x0e, 0x30, 0x72, 0xa5, 0x52, 0xeb, 0xf2, 0x56, 0xf0, 0x3f, 0xab, 0x4c, 0xec, 0xf4, 0xd8, 0x28, 0x74, 0x4b, 0x41, 0xde, 0xb9, 0x86, 0xb3, 0x5e, 0xfd, 0xab, 0xad, 0x74, 0xed, 0x86, 0x5c, 0xec, 0x32, 0xed, 0xc9, 0xfb, 0x43, 0x48, 0x52, 0xda, 0x7d, 0x50, 0x57, 0xb4, 0x75, 0x16, 0x35, 0xc2, 0x8d, 0x47, 0x78, 0xb5, 0xc5, 0xaf, 0x4c, 0x54, 0xd4, 0xfd, 0x35, 0x66, 0x78, 0xc6, 0x00, 0xd2, 0x0a, 0xcc, 0xfa, 0x05, 0x55, 0x7f, 0x5f, 0x94, 0xa8, 0xc4, 0x15, 0x22, 0x2a, 0xf6, 0x9a, 0x85, 0x6e, 0x2a, 0x3c, 0x24, 0x47, 0xb8, 0x88, 0xa3, 0xde, 0xf7, 0x04, 0xc3, 0x01, 0x47, 0x21, 0x83, 0xbe, 0x55, 0x6b, 0x8c, 0x31, 0x9a, 0x03, 0xcb, 0x9a, 0x25, 0x4f, 0x60, 0xb2, 0x9b, 0xf0, 0xb7, 0x40, 0x7c, 0xf4, 0xf4, 0xe7, 0xa7, 0x4d, 0x95, 0x42, 0x21, 0x82, 0x52, 0x33, 0x12, 0xa5, 0x48, 0x77, 0x10, 0x85, 0x57, 0x7e, 0xa0, 0x24, 0xc9, 0x7a, 0xfa, 0x6c, 0x34, 0xb7, 0x0d, 0x1d, 0xa1, 0x2a, 0xc3, 0x0a, 0xed, 0x4c, 0x86, 0x85, 0x70, 0x29, 0x03, 0x18, 0xdd, 0xb3, 0x2e, 0x76, 0x69, 0x5d, 0x86, 0xb0, 0x30, 0xe5, 0x9a, 0xac, 0xd4, 0x71, 0xcc, 0xd4, 0x67, 0xde, 0x55, 0x0b, 0x8b, 0x55, 0x89, 0xe5, 0xd7, 0x1f, 0x5c, 0x17, 0x7d, 0xba, 0x26, 0x2c, 0x2a, 0x2c, 0xa3, 0x7a, 0x2e, 0x97, 0x3e, 0x55, 0xdd, 0x0e, 0x8f, 0x82, 0x35, 0xa7, 0x22, 0xee, 0xc1, 0xd1, 0x7a, 0xa0, 0xbc, 0xe8, 0x55, 0xed, 0x7a, 0x07, 0x32, 0xeb, 0x04, 0x1e, 0x11, 0x28, 0x03, 0x44, 0x7a, 0x9b, 0xdf, 0x4e, 0xc0, 0xda, 0x27, 0xa0, 0x87, 0x8e, 0x34, 0x43, 0x84, 0x24, 0x09, 0x38, 0x84, 0xc6, 0x7e, 0x0c, 0xb0, 0x8a, 0x9e, 0xad, 0x0f, 0xe9, 0x4d, 0x7c, 0x4c, 0x72, 0x2e, 0xa3, 0xba, 0xbf, 0xc3, 0xa9, 0x95, 0xa9, 0xd6, 0x44, 0x8b, 0xb8, 0x18, 0x6e, 0x7a, 0xdd, 0x09, 0xba, 0x7c, 0x64, 0x17, 0xe9, 0x21, 0x24, 0x0a, 0xb8, 0xfb, 0xf9, 0x9f, 0xfd, 0x60, 0x74, 0x73, 0xf2, 0x6b, 0xd0, 0x23, 0xd1, 0x44, 0x28, 0xb2, 0xa1, 0xa1, 0xe8, 0x2b, 0x4f, 0x8d, 0x82, 0x87, 0x00, 0x69, 0x62, 0xd0, 0xa6, 0x30, 0x23, 0x87, 0xd1, 0xff, 0x03, 0x44, 0xc9, 0xd4, 0x94, 0x9c, 0xd9, 0x95, 0xb5, 0x47, 0xed, 0x55, 0xc1, 0x82, 0x60, 0xd4, 0x06, 0xb3, 0x0f, 0x44, 0x79, 0x4c, 0xb2, 0x53, 0xa7, 0xf1, 0x6c, 0x65, 0xef, 0xdd, 0xa0, 0x21, 0xef, 0x82, 0x07, 0x30, 0x3c, 0x6f, 0xff, 0x41, 0x56, 0x77, 0x26, 0x51, 0xdb, 0x10, 0x28, 0x29, 0xfa, 0xf9, 0xd5, 0x28, 0x2b, 0x20, 0x77, 0x42, 0x1d, 0xc2, 0x62, 0x49, 0xf0, 0xd4, 0xcc, 0x6b, 0xa5, 0xa2, 0xdf, 0xfd, 0xd3, 0xb6, 0x0d, 0x77, 0x9b, 0xfb, 0xa4, 0xbf, 0xdd, 0x22, 0xa2, 0xaa, 0xac, 0x45, 0xca, 0xc0, 0x00, 0xca, 0xf7, 0x3f, 0xab, 0x8b, 0xb1, 0x63, 0x8f, 0x33, 0xfe, 0xe5, 0x0d, 0xeb, 0x7a, 0xc1, 0xc1, 0x37, 0xaa, 0x3d, 0x6c, 0x1a, 0x8e, 0x27, 0x31, 0x81, 0x75, 0x5e, 0x05, 0xdf, 0x15, 0x94, 0x61, 0x14, 0xdb, 0x51, 0x39, 0x93, 0x80, 0x3b, 0x32, 0xc4, 0xdd, 0x96, 0x10, 0xa7, 0x00, 0x07, 0x6d, 0xbb, 0x7f, 0x9d, 0xb1, 0x1e, 0x0c, 0x11, 0x3e, 0xf5, 0x4a, 0x4d, 0xeb, 0x0e, 0xe0, 0x2c, 0xb4, 0xc4, 0xcb, 0x81, 0xb0, 0x23, 0xf8, 0x5a, 0x43, 0x4d, 0x12, 0x86, 0x94, 0x1c, 0x99, 0x54, 0x41, 0x09, 0x34, 0x9e, 0x52, 0x4d, 0x48, 0x06, 0x6c, 0x46, 0xc9, 0x80, 0x47, 0x1b, 0x50, 0x11, 0x62, 0xa3, 0x6e, 0xd6, 0xf6, 0x83, 0x41, 0x47, 0x28, 0x97, 0x44, 0xbd, 0x82, 0x94, 0x6b, 0x32, 0xa4, 0xeb, 0x70, 0x48, 0x37, 0xf0, 0x67, 0x8d, 0x23, 0x3b, 0x99, 0xfe, 0x02, 0x4e, 0x8f, 0xca, 0xd4, 0x79, 0x6d, 0x58, 0xf4, 0xfb, 0x82, 0x8a, 0x4b, 0x6a, 0x1c, 0x44, 0xc3, 0x55, 0xa1, 0x28, 0xfe, 0x27, 0xdb, 0xa4, 0x49, 0x4e, 0x94, 0x2f, 0xcb, 0x9d, 0x63, 0xcf, 0x02, 0xef, 0xc5, 0xdf, 0x71, 0x0e, 0x6f, 0x0f, 0x92, 0xd3, 0xe3, 0xac, 0x12, 0x8e, 0x42, 0x22, 0x3d, 0xa7, 0x61, 0xbf, 0xb8, 0x86, 0x1e, 0xb9, 0x6e, 0xb1, 0xf5, 0x73, 0xcc, 0x34, 0xce, 0xfc, 0x31, 0x46, 0x19, 0xd8, 0xa0, 0x29, 0x1d, 0x04, 0xb9, 0x52, 0x8d, 0x34, 0xe7, 0xca, 0x5d, 0x5f, 0xda, 0xd4, 0xd3, 0x7d, 0x38, 0xd0, 0xe1, 0x90, 0x8f, 0x5f, 0xb2, 0xe1, 0x8f, 0xc8, 0x83, 0x8c, 0x76, 0x9b, 0xb4, 0x3e, 0xcb, 0x94, 0x1f, 0x3e, 0x4f, 0xc1, 0xa8, 0xaa, 0x31, 0xe7, 0x15, 0x04, 0x81, 0x23, 0x21, 0xed, 0xe7, 0xcd, 0xcb, 0x2f, 0x95, 0xa1, 0xf4, 0x01, 0x7a, 0x21, 0x29, 0x87, 0xb8, 0x35, 0xbe, 0x99, 0x59, 0x15, 0x1c, 0xc5, 0x3d, 0x68, 0x5b, 0x97, 0x57, 0xae, 0x14, 0x17, 0x1a, 0xdb, 0x70, 0x94, 0x2d, 0x44, 0x85, 0xa0, 0x66, 0xbf, 0xe3, 0x5c, 0xf6, 0x06, 0x69, 0xf6, 0xe1, 0x5d, 0x5e, 0x6f, 0xb2, 0x75, 0xbd, 0xa2, 0x6c, 0x8f, 0xcf, 0x82, 0xc3, 0xe4, 0xff, 0xa3, 0x8c, 0x45, 0xeb, 0xfc, 0x73, 0xff, 0xb7, 0xeb, 0xec, 0x01, 0xa6, 0x79, 0x6c, 0x41, 0xeb, 0xe0, 0xd8, 0x5b, 0xbc, 0x4a, 0x3e, 0x7b, 0xa9, 0xdc, 0xc3, 0x7e, 0x2c, 0xf3, 0xdc, 0x54, 0x81, 0xad, 0xc1, 0xa9, 0xb7, 0xac, 0x1f, 0xc4, 0x08, 0x16, 0x0d, 0xaf, 0x66, 0xe0, 0x42, 0x98, 0x56, 0x4d, 0x85, 0x77, 0x01, 0xb1, 0x64, 0xf1, 0x88, 0x7b, 0x29, 0x7c, 0x99, 0x72, 0x0a, 0xc5, 0x40, 0x3f, 0xa0, 0x4f, 0xff, 0x2c, 0x9b, 0x5c, 0x20, 0x2b, 0xb3, 0x10, 0x4a, 0x1a, 0xe2, 0xd4, 0x53, 0x45, 0xd0, 0xf9, 0x55, 0x2d, 0x8f, 0x9d, 0x04, 0x88, 0x88, 0xd3, 0x3e, 0x88, 0xb5, 0xfe, 0xe4, 0x60, 0x11, 0x7e, 0xe9, 0x05, 0x4d, 0x8f, 0xa8, 0x31, 0xc5, 0x6d, 0x7b, 0xae, 0xb2, 0xbd, 0x89, 0xd1, 0xa1, 0x28, 0xdf, 0x45, 0x24, 0x49 ],
+    const [ 0xc0, 0xa4, 0xf3, 0x47, 0xf7, 0x90, 0xb9, 0x98, 0x5d, 0x95, 0x42, 0x6b, 0xd5, 0x9a, 0x30, 0xee, 0xa6, 0x59, 0xa0, 0xd7, 0x7d, 0x58, 0x52, 0xf8, 0xb6, 0x1a, 0x0a, 0x14, 0xd7, 0x96, 0x35, 0xf2, 0x5d, 0xe8, 0xd0, 0xaf, 0xbc, 0x47, 0x86, 0x58, 0xa1, 0x37, 0x18, 0xb9, 0x7a, 0xff, 0x02, 0x6f, 0x38, 0x5e, 0x5c, 0x45, 0x53, 0x7a, 0xfe, 0xbd, 0x0f, 0x19, 0xe7, 0xec, 0xff, 0x13, 0xe0, 0x8b, 0xc7, 0x08, 0x5c, 0x4c, 0x25, 0x4e, 0xa3, 0x6a, 0x33, 0x2d, 0x2f, 0x84, 0xe6, 0x4f, 0x56, 0xab, 0xdb, 0x72, 0x2a, 0xba, 0x53, 0x60, 0x9e, 0xe5, 0x7c, 0x21, 0xea, 0x95, 0xf2, 0x6f, 0x30, 0x74, 0x85, 0x6a, 0x5f, 0xc3, 0x3d, 0x8d, 0x58, 0xf4, 0x9b, 0xe1, 0x4f, 0x75, 0x22, 0x70, 0x74, 0xca, 0x16, 0xfd, 0xd3, 0xde, 0x84, 0xf2, 0x79, 0x9b, 0x82, 0x9a, 0xd9, 0xb8, 0xb8, 0x90, 0x6e, 0xd2, 0x1f, 0x78, 0xa1, 0xbf, 0x09, 0xec, 0xec, 0x1f, 0x62, 0xb9, 0x40, 0x33, 0x35, 0x4c, 0xa4, 0xf3, 0x71, 0x67, 0x20, 0x5a, 0xee, 0x19, 0xd9, 0x05, 0xab, 0xec, 0x7d, 0xfc, 0x5a, 0x60, 0xe1, 0xd0, 0x1e, 0x98, 0xe9, 0xe6, 0x93, 0x54, 0xa9, 0x12, 0x0f, 0x1f, 0xc9, 0x67, 0x27, 0xca, 0x2e, 0x4e, 0x75, 0x18, 0xd6, 0xd6, 0x99, 0xbb, 0x04, 0x4b, 0x7e, 0x7f, 0x9e, 0x0a, 0xdf, 0xc6, 0xd3, 0x93, 0x09, 0x34, 0x00, 0xe0, 0xe2, 0xab, 0xd5, 0xf6, 0x2a, 0x7a, 0xb4, 0xb9, 0x01, 0xd1, 0x59, 0x04, 0xa9, 0x79, 0xc0, 0xf9, 0x8e, 0xc1, 0x43, 0x96, 0x83, 0xbc, 0x04, 0x89, 0x4f, 0xa9, 0x8a, 0x46, 0x68, 0xb3, 0xaf, 0x56, 0xfe, 0xdb, 0xb9, 0xf2, 0x3b, 0x32, 0xc7, 0xd0, 0xca, 0x4b, 0x6f, 0x3d, 0x96, 0xf0, 0xa5, 0x6c, 0xd4, 0x14, 0xde, 0x0e, 0x43, 0x09, 0x76, 0x22, 0xb2, 0xf3, 0x4f, 0x0f, 0xc4, 0x7d, 0xbc, 0xf0, 0xf0, 0xca, 0x9d, 0x2f, 0xcb, 0xaf, 0xcb, 0x55, 0x8a, 0x1f, 0xb6, 0x20, 0xc2, 0xe6, 0x4c, 0xd7, 0x73, 0x9a, 0x1d, 0xda, 0x45, 0xcf, 0xbd, 0x7d, 0x11, 0x8b, 0x6a, 0x16, 0xa3, 0xfa, 0xef, 0x55, 0xbf, 0x62, 0xc8, 0xd4, 0x61, 0x58, 0x87, 0xef, 0x49, 0x35, 0x77, 0xd6, 0xb7, 0xc4, 0x7e, 0xe0, 0x74, 0x3d, 0x48, 0x23, 0x11, 0x77, 0xa1, 0x41, 0x73, 0x59, 0x23, 0x84, 0x90, 0x92, 0x12, 0x2e, 0x73, 0x89, 0x84, 0x0a, 0x86, 0x97, 0xc5, 0x47, 0x10, 0x75, 0xf9, 0x86, 0xfd, 0xf0, 0x03, 0x32, 0xde, 0xe4, 0xa6, 0x10, 0x30, 0x67, 0xea, 0x17, 0xe1, 0x45, 0xc2, 0x81, 0x10, 0xad, 0xeb, 0x22, 0x15, 0x29, 0x17, 0xf9, 0xc1, 0xd3, 0x4b, 0x05, 0xe6, 0xc7, 0x86, 0x59, 0x1a, 0xd4, 0xa3, 0x73, 0xb9, 0x77, 0x80, 0xca, 0x29, 0x09, 0x60, 0xa6, 0x62, 0x37, 0x8e, 0x34, 0xad, 0xb3, 0x44, 0xda, 0xab, 0x29, 0xca, 0xc8, 0x9a, 0x75, 0xe2, 0xd0, 0xd4, 0x13, 0x64, 0x77, 0x98, 0xd6, 0x26, 0x4c, 0x0d, 0xdd, 0x1e, 0x78, 0x84, 0xc4, 0xcb, 0x97, 0xfe, 0x17, 0xd0, 0xc6, 0xee, 0x0c, 0xe3, 0xfd, 0x40, 0x71, 0xe5, 0xa0, 0x99, 0xe3, 0x52, 0x50, 0xe1, 0x41, 0xdc, 0x07, 0xff, 0x60, 0x53, 0x64, 0xe3, 0x00, 0xc8, 0x43, 0xca, 0xff, 0xf2, 0x91, 0xbd, 0xcd, 0xd1, 0x5f, 0x5b, 0x20, 0x90, 0x34, 0xd9, 0xe9, 0xb0, 0xa8, 0x47, 0x86, 0x63, 0x2e, 0x15, 0x39, 0x36, 0x32, 0xd5, 0xd9, 0xf3, 0x64, 0x42, 0xc7, 0xc6, 0x53, 0x82, 0x24, 0x9e, 0x3d, 0xa8, 0x41, 0xd6, 0x25, 0x7d, 0x57, 0x15, 0x27, 0x80, 0x79, 0x73, 0x09, 0x2b, 0xc6, 0xdd, 0x12, 0x78, 0xe3, 0xba, 0x1f, 0xa4, 0xa9, 0xce, 0xf3, 0x33, 0x1a, 0x5f, 0xcf, 0x34, 0x9a, 0x97, 0x42, 0xc6, 0x5c, 0x2a, 0x43, 0xdb, 0x1a, 0x39, 0x7d, 0x3c, 0x09, 0x75, 0xea, 0xce, 0x0c, 0x87, 0xa3, 0x13, 0x27, 0xb0, 0xf7, 0xf3, 0x37, 0xac, 0xba, 0xbd, 0xe1, 0xdd, 0xdf, 0x69, 0xc9, 0xa5, 0x4a, 0x20, 0x04, 0x14, 0xdf, 0xfe, 0xcf, 0xc3, 0xdf, 0x16, 0x81, 0xff, 0x74, 0xb6, 0xbe, 0x2a, 0x8a, 0xed, 0xee, 0x5f, 0xe1, 0x4b, 0xed, 0x55, 0x60, 0xe8, 0x04, 0x86, 0xad, 0xa7, 0x19, 0x90, 0xfa, 0xbc, 0x22, 0xdb, 0x22, 0x6c, 0xe0, 0x7c, 0xf4, 0x14, 0xc9, 0x59, 0xce, 0x6d, 0x46, 0x8e, 0x6f, 0x0e, 0x1e, 0x10, 0x06, 0x33, 0x32, 0x90, 0x8e, 0xbc, 0x6c, 0xa3, 0x5e, 0x79, 0xf2, 0x1f, 0xfc, 0xa4, 0x9f, 0xc8, 0x33, 0xaf, 0xb3, 0x2c, 0x65, 0x41, 0xc9, 0xcb, 0x22, 0x7b, 0x0a, 0x7b, 0xf8, 0x7f, 0xa1, 0x0b, 0x8d, 0x33, 0x6e, 0x27, 0xec, 0x42, 0xff, 0x7b, 0x1d, 0x64, 0xbc, 0x1c, 0xf8, 0xe0, 0x61, 0x23, 0x3a, 0x4f, 0xb2, 0x9b, 0xd9, 0xa2, 0x6a, 0x9d, 0x95, 0x66, 0x74, 0xb9, 0xd0, 0x47, 0x5d, 0x98, 0x9f, 0xd3, 0x0a, 0xe0, 0x21, 0x81, 0xa6, 0x58, 0x10, 0xf2, 0xdf, 0x4d, 0x95, 0x76, 0x52, 0x34, 0x61, 0xd2, 0x43, 0x90, 0xf9, 0x41, 0x92, 0x16, 0x51, 0xb8, 0xea, 0x0f, 0x9d, 0x6e, 0x3c, 0xff, 0x64, 0x9c, 0x6c, 0x84, 0xd6, 0x81, 0x4a, 0x80, 0x5f, 0xaa, 0xc3, 0x7a, 0x7c, 0x70, 0x59, 0x42, 0xce, 0xc2, 0xd0, 0xd4, 0x6d, 0x25, 0x2a, 0x7f, 0x7e, 0xf8, 0xd6, 0x47, 0x08, 0xfd, 0x25, 0x87, 0x03, 0x15, 0xfd, 0xdb, 0xb2, 0x4b, 0xd1, 0x3c, 0x33, 0x14, 0xd0, 0x6d, 0x55, 0xd5, 0x5d, 0x97, 0xa9, 0xa6, 0xc0, 0x30, 0xdc, 0x56, 0x1b, 0x20, 0x43, 0xaf, 0x9f, 0x27, 0xb8, 0xfb, 0xff, 0x79, 0xa5, 0xc7, 0x25, 0xac, 0x5e, 0xe6, 0x25, 0xd4, 0xb4, 0xb9, 0x6f, 0xed, 0xc7, 0xae, 0x48, 0x79, 0x1b, 0x07, 0x7b, 0x69, 0xee, 0xdd, 0x4b, 0x41, 0xc9, 0x64, 0xad, 0x78, 0x56, 0x70, 0xb4, 0x1d, 0x71, 0x38, 0x4d, 0xc1, 0x81, 0x5a, 0x2c, 0x90, 0x09, 0x20, 0x06, 0xc1, 0x7a, 0x02, 0x01, 0x31, 0x4c, 0x6c, 0x69, 0x4a, 0x4c, 0xc1, 0xa4, 0x2a, 0x38, 0x9f, 0x68, 0x01, 0x89, 0x65, 0x2b, 0xbb, 0x90, 0xf2, 0xdb, 0xe0, 0xc4, 0xb0, 0xd0, 0xb8, 0x5b, 0xd2, 0xff, 0xb2, 0x17, 0xd9, 0x70, 0x06, 0x63, 0x5d, 0xf2, 0x9a, 0x9e, 0x0a, 0x0d, 0x23, 0xb7, 0xe9, 0x38, 0x8c, 0xfa, 0xe0, 0x4c, 0x9b, 0x29, 0x7d, 0x39, 0xd2, 0xcf, 0xef, 0xf7, 0x93, 0xd1, 0x55, 0xc0, 0x88, 0x46, 0x3c, 0x7d, 0x42, 0x88, 0x62, 0x7e, 0x20, 0x8b, 0xc0, 0x6d, 0x73, 0x6e, 0xc8, 0x85, 0xdf, 0x50, 0xec, 0xff, 0x05, 0x65, 0x5f, 0xcd, 0x5e, 0x49, 0x1f, 0x8b, 0x6a, 0x94, 0x33, 0xb3, 0x0b, 0xae, 0x31, 0x10, 0x2b, 0xe5, 0x04, 0x75, 0xa5, 0xbc, 0xec, 0xae, 0x63, 0x86, 0xc6, 0xb7, 0xc4, 0x34, 0x8e, 0x2c, 0x40, 0x6c, 0x22, 0x01, 0x4e, 0xdb, 0x49, 0x73, 0x85, 0xcb, 0xf3, 0x3e, 0x02, 0xf8, 0xc3, 0x11, 0x0b, 0x9f, 0xca, 0x3f, 0xf1, 0xd9, 0x96, 0xb7, 0x3b, 0x27, 0x6b, 0x36, 0x00, 0x4e, 0xd0, 0xbb, 0x95, 0x65, 0x4d, 0x3c, 0x69, 0x2c, 0x74, 0x97, 0x2c, 0x9f, 0x1e, 0xcb, 0x37, 0xcb, 0xf7, 0x68, 0x28, 0xe1, 0x3d, 0x44, 0xcc, 0x89, 0xc4, 0x70, 0x43, 0x78, 0x3e, 0x6a, 0x5e, 0x45, 0xb9, 0x94, 0x4c, 0x78, 0x69, 0xe5, 0x76, 0xe5, 0xa8, 0xdf, 0xa7, 0x38, 0x3b, 0xc1, 0x70, 0xd0, 0xd7, 0xfd, 0xcb, 0xd1, 0xe3, 0xec, 0xfe, 0x74, 0x80, 0xc1, 0xc2, 0xa2, 0xc7, 0xbc, 0xa5, 0xc2, 0x51, 0xa0, 0xad, 0xcf, 0xfd, 0x66, 0x3e, 0xad, 0xed, 0x33, 0x3d, 0xbd, 0xd2, 0x88, 0x76, 0xaf, 0x6a, 0xb8, 0x3b, 0x97, 0x47, 0xa0, 0x4e, 0x43, 0xd1, 0x92, 0x02, 0xcc, 0x8e, 0x92, 0x9c, 0x6c, 0xa1, 0xc5, 0xff, 0x8f, 0x91, 0x26, 0x89, 0x2d, 0x4c, 0x7b, 0x38, 0x56, 0x6c, 0x88, 0x11, 0x0f, 0xb8, 0x82, 0xc2, 0x5c, 0xee, 0xc6, 0x86, 0x9e, 0xc0, 0xcb, 0x49, 0x1f, 0x1c, 0x55, 0x0d, 0xec, 0xb0, 0xec, 0x8c, 0xe3, 0xae, 0x8d, 0x1e, 0x0c, 0xcc, 0x9f, 0xde, 0x2d, 0x90, 0x28, 0x08, 0x98, 0xca, 0x41, 0xa6, 0x48, 0x62, 0xc8, 0x6c, 0x2c, 0x53, 0x54, 0xe0, 0xc3, 0xf8, 0x6e, 0xbe, 0xe9, 0x87, 0xfe, 0x9a, 0xf1, 0xdb, 0x03, 0xc7, 0xf3, 0x76, 0x87, 0x78, 0x67, 0xc6, 0xd3, 0x25, 0xf3, 0xa7, 0xdf, 0x30, 0x82, 0x2a, 0x0c, 0xc9, 0x96, 0x94, 0x15, 0x0f, 0xdf, 0xaa, 0x43, 0x77, 0x0c, 0x2c, 0xe1, 0x72, 0xe1, 0xa0, 0xf0, 0x4a, 0x8a, 0x50, 0x1c, 0x4d, 0x2f, 0x96, 0xee, 0x2e, 0xc8, 0x57, 0x42, 0xa8, 0x33, 0xce, 0xfc, 0x64, 0x83, 0x8b, 0xf7, 0x1d, 0x9c, 0xbb, 0x3e, 0x02, 0xfd, 0xa9, 0x7f, 0x5c, 0xdc, 0x85, 0xbc, 0x70, 0x78, 0x65, 0x44, 0xa7, 0xab, 0x89, 0xe2, 0xec, 0xbe, 0xe3, 0x54, 0x56, 0x82, 0xd6, 0xfe, 0x07, 0x9c, 0x3f, 0xe0, 0x54, 0x21, 0xb2, 0xc6, 0x26, 0x63, 0x06, 0xbe, 0x9f, 0x0a, 0x13, 0xcf, 0x01, 0x66, 0xba, 0xe8, 0xcc, 0x03, 0x26, 0x17, 0x27, 0x7e, 0x52, 0xfb, 0x81, 0x98, 0xcb, 0x7c, 0x78, 0x89, 0xb8, 0xb9, 0xfa, 0x97, 0x17, 0x42, 0xaa, 0xe6, 0x49, 0x88, 0x85, 0x92, 0xd1, 0x92, 0xc5, 0xfb, 0x59, 0xf1, 0x05, 0x60, 0xf5, 0xf5, 0xa7, 0xb0, 0xac, 0x21, 0x73, 0x9c, 0x35, 0xdd, 0x80, 0xf1, 0xfe, 0x6b, 0x58, 0x25, 0x73, 0x1c, 0x57, 0x2f, 0x7c, 0xc4, 0x54, 0x9c, 0x47, 0x6b, 0x84, 0xe0, 0x49, 0x45, 0x9a, 0xea, 0x7f, 0xe5, 0x33, 0xfb, 0xfa, 0xad, 0x72, 0xb7, 0x9a, 0x89, 0xe7, 0x7d, 0x1a, 0xdd, 0xb6, 0xf4, 0x4c, 0xbb, 0xf5, 0xe6, 0xa6, 0x5a, 0x55, 0x52, 0xfe, 0xc3, 0x05, 0xbc, 0x92, 0xce, 0xd3, 0xc8, 0x4b, 0x4d, 0x95, 0x07, 0x43, 0x87, 0xc7, 0x11, 0x84, 0xe8, 0x75, 0xd4, 0x13, 0xf6, 0x5c, 0x2b, 0x2d, 0x87, 0x4c, 0xb3, 0xd0, 0x31, 0xd0, 0xda, 0x7d, 0x03, 0x11, 0x38, 0x3d, 0x72, 0xf8, 0x23, 0xe2, 0x96, 0x93, 0x7d, 0x8f, 0x97, 0xba, 0xd1, 0x7a, 0x62, 0xf2, 0x9e, 0xf1, 0xa0, 0x91, 0xf3, 0x9b, 0xe8, 0x23, 0x3c, 0x01, 0x33, 0x0d, 0x5c, 0x4c, 0x91, 0x70, 0xfc, 0x50, 0x1b, 0x50, 0x22, 0xca, 0x29, 0xf6, 0x05, 0xe6, 0xc5, 0x92, 0x20, 0x05, 0x5f, 0x25, 0x85, 0xbc, 0xc2, 0x9e, 0x74, 0x20, 0x46, 0x43, 0x2c, 0x41, 0x47, 0x53, 0x01, 0xf4, 0xd7, 0xea, 0xaf, 0xd6, 0xb0, 0x24, 0xee, 0x8d, 0x6c, 0x85, 0x46, 0x51, 0xf9, 0x99, 0x25, 0xac, 0x47, 0xd7, 0x2f, 0x7d, 0x43, 0xcb, 0xd5, 0x43, 0x09, 0x75, 0x29, 0x98, 0x55, 0xec, 0xf0, 0xfc, 0x3b, 0x46, 0xf9, 0xd4, 0x19, 0xbc, 0xae, 0xb2, 0xc9, 0x0a, 0xe9, 0xd7, 0x1b, 0x15, 0x09, 0xf7, 0x82, 0xd0, 0x44, 0x3c, 0x0d, 0x60, 0x3f, 0x8d, 0x99, 0x7f, 0xdb, 0x0f, 0x46, 0x1e, 0x52, 0xec, 0x27, 0x4e, 0x84, 0x54, 0x3e, 0x60, 0x8b, 0xc2, 0xa7, 0x4b, 0x95, 0x81, 0x13, 0x4f, 0xf3, 0x6e, 0x78, 0xd8, 0x6d, 0xff, 0x07, 0xa5, 0xd9, 0x84, 0x5f, 0x29, 0xec, 0xad, 0x00, 0x32, 0x4f, 0x4d, 0x02, 0xc8, 0xf5, 0x5d, 0x07, 0x58, 0xad, 0x44, 0x6e, 0x12, 0xf3, 0x56, 0xc9, 0x8f, 0x0c, 0x9a, 0x91, 0xb7, 0x52, 0xd0, 0x19, 0xe2, 0xcc, 0xb2, 0xc1, 0x3d, 0x01, 0x7b, 0x6c, 0x70, 0x0e, 0xa6, 0x34, 0x7d, 0xf7, 0xf8, 0x5c, 0xeb, 0x3b, 0xc0, 0x85, 0x25, 0xab, 0x5e, 0x25, 0x1d, 0x7b, 0x02, 0x36, 0x34, 0x9a, 0xb6, 0x2b, 0x5e, 0x3f, 0x9f, 0x28, 0x81, 0xc5, 0x7f, 0x72, 0x1f, 0xb8, 0x7f, 0x25, 0x35, 0x30, 0x2c, 0x25, 0x63, 0x5d, 0xbf, 0x56, 0x4c, 0x64, 0xa1, 0x10, 0x40, 0x69, 0x2e, 0xcd, 0x19, 0xed, 0xba, 0x25, 0x62, 0x5b, 0xd1, 0xfd, 0xbf, 0xdd, 0xc3, 0xfb, 0x88, 0x74, 0x60, 0x3d, 0xb8, 0x48, 0x01, 0x4a, 0x06, 0x3d, 0xc8, 0x48, 0x51, 0xc6, 0x28, 0x70, 0x41, 0xfe, 0xa7, 0xc0, 0x2c, 0xf5, 0xe2, 0xef, 0x36, 0x47, 0xd2, 0xa6, 0xbd, 0xf4, 0x4f, 0xed, 0xf4, 0x6b, 0xd2, 0xe4, 0xcd, 0xe8, 0x7f, 0xb3, 0x1d, 0x00, 0x63, 0xc3, 0xfb, 0x7b, 0xfa, 0x2f, 0x68, 0x61, 0xf4, 0x75, 0x36, 0x57, 0x38, 0x72, 0x22, 0x2c, 0x2a, 0x8d, 0x44, 0xb0, 0x29, 0x32, 0xa9, 0xc5, 0x5c, 0x82, 0x3e, 0xb8, 0xaf, 0x48, 0xef, 0xd1, 0x18, 0x2f, 0x11, 0x28, 0x1f, 0x33, 0xfd, 0xbb, 0x9d, 0x56, 0xfe, 0xbe, 0xc4, 0x94, 0x6e, 0x32, 0x5f, 0x18, 0x1b, 0xb9, 0x5b, 0xb0, 0xf0, 0xa9, 0x87, 0x7f, 0xd1, 0x5f, 0x98, 0xf2, 0xc6, 0xd6, 0x70, 0xf5, 0x5c, 0x78, 0xa0, 0x66, 0x48, 0x33, 0x2b, 0xc9, 0x4e, 0xd0, 0x8d, 0x3e, 0x61, 0x80, 0xfb, 0xb1, 0x0c, 0xb8, 0xed, 0x51, 0x10, 0x3f, 0xda, 0x43, 0x4f, 0x86, 0x42, 0x97, 0xe8, 0x37, 0xf2, 0x7b, 0xa4, 0x10, 0x84, 0xae, 0x91, 0xf2, 0x25, 0x38, 0xec, 0x35, 0x9b, 0x59, 0x44, 0x3f, 0x86, 0xbf, 0xdd, 0x55, 0xe5, 0xfb, 0x53, 0xb0, 0xdd, 0x36, 0x7f, 0xd4, 0xb6, 0x20, 0x9e, 0x1d, 0x27, 0x2a, 0xb0, 0x9b, 0xd3, 0xf5, 0x1f, 0x20, 0x13, 0x0a, 0xa1, 0x96, 0xf6, 0xcb, 0x5f, 0x96, 0x86, 0xaa, 0x57, 0x37, 0x4d, 0x98, 0xff, 0x24, 0x18, 0xc0, 0x2b, 0xf2, 0xfb, 0x76, 0x30, 0xb0, 0x95, 0x6a, 0x4a, 0xbf, 0x95, 0x22, 0x3b, 0xe4, 0x7d, 0xa7, 0x35, 0x9b, 0xa7, 0x7e, 0xfa, 0xae, 0x85, 0xd9, 0x42, 0x07, 0x2c, 0x0f, 0x5d, 0xc2, 0x14, 0x4a, 0x19, 0x87, 0x19, 0x7f, 0xe6, 0x17, 0xc6, 0xa4, 0x38, 0x24, 0xd3, 0x1d, 0x2d, 0x66, 0xec, 0x77, 0x70, 0xeb, 0xb5, 0x58, 0x5d, 0xaf, 0x0a, 0xb6, 0x66, 0x6c, 0x8b, 0x48, 0xb5, 0xb3, 0x58, 0x3a, 0x12, 0x3c, 0x19, 0x25, 0x08, 0x7b, 0x42, 0x3e, 0x43, 0x73, 0x95, 0xce, 0x3d, 0xcf, 0xe8, 0xe2, 0x1a, 0x2f, 0x28, 0x43, 0xd0, 0xc0, 0x9e, 0xa8, 0x8a, 0x0f, 0x71, 0x2b, 0x4f, 0x1f, 0x6c, 0xfa, 0xde, 0xb9, 0x02, 0x4f, 0xdd, 0x03, 0x8f, 0xa2, 0x33, 0x54, 0xe1, 0x1d, 0xb3, 0x47, 0xf7, 0x50, 0xfa, 0x0e, 0x08, 0x26, 0x9a, 0x09, 0xc8, 0x17, 0x78, 0x97, 0xe6, 0xa0, 0x72, 0x2d, 0xd9, 0xf0, 0x45, 0xa5, 0xdc, 0xe5, 0xae, 0xd8, 0x37, 0x36, 0xd0, 0x6e, 0xc1, 0xf2, 0xd6, 0xf5, 0xa3, 0x29, 0xd9, 0x31, 0x5e, 0xe8, 0x04, 0xb3, 0x10, 0x6b, 0xf6, 0xad, 0xf3, 0x8f, 0x67, 0x05, 0x26, 0x86, 0x0f, 0xa8, 0xb0, 0xce, 0xc3, 0x21, 0xc2, 0x64, 0xe2, 0x6a, 0x3c, 0x35, 0xef, 0x02, 0x73, 0xd5, 0x7f, 0x3f, 0x31, 0x73, 0x56, 0xe6, 0xfe, 0x0d, 0xcd, 0xf9, 0x9e, 0xe0, 0x77, 0xd0, 0xdb, 0x23, 0x03, 0x6b, 0x85, 0xf4, 0x64, 0x07, 0xb6, 0x93, 0x30, 0xef, 0x5a, 0xce, 0x46, 0x95, 0xef, 0xbc, 0xb4, 0xe1, 0x8a, 0xae, 0xd8, 0xc9, 0x1b, 0x63, 0xc5, 0x22, 0xf1, 0x7b, 0xe7, 0xb6, 0x81, 0x2e, 0xeb, 0x96, 0x63, 0x3e, 0xd9, 0xb2, 0x9d, 0x2a, 0x83, 0xa6, 0x24, 0xa5, 0x23, 0xd7, 0xa0, 0x46, 0x40, 0xbf, 0x70, 0x81, 0xd1, 0x85, 0xee, 0xd6, 0xa5, 0xd1, 0xf4, 0x48, 0x02, 0xde, 0x9f, 0x11, 0x8d, 0xd1, 0x52, 0x94, 0x69, 0x49, 0xfe, 0x93, 0xa3, 0x37, 0xa1, 0xa2, 0xce, 0xf0, 0x0d, 0xdc, 0xea, 0x80, 0xeb, 0xd4, 0x8b, 0x41, 0xff, 0xcf, 0x37, 0xad, 0xae, 0x30, 0x0f, 0x71, 0xbd, 0x33, 0xb1, 0xc2, 0x5b, 0xde, 0x5e, 0xf4, 0x62, 0x35, 0x58, 0x49, 0xda, 0xae, 0x8e, 0x07, 0xbf, 0xe4, 0x7b, 0xcd, 0x03, 0x8f, 0x4c, 0x26, 0xd7, 0xb4, 0x41, 0x5f, 0x27, 0x19, 0x55, 0x96, 0x63, 0xfc, 0x21, 0x14, 0x85, 0x04, 0xfe, 0xdd, 0x50, 0x78, 0x6a, 0x84, 0xd5, 0xaf, 0xad, 0x44, 0x3c, 0xc8, 0xbc, 0x4d, 0xc1, 0x9b, 0x5d, 0x5c, 0xfd, 0xee, 0x8c, 0x8e, 0x67, 0xed, 0x1d, 0x76, 0x1a, 0xd4, 0xa4, 0x6d, 0xd9, 0xef, 0x92, 0x29, 0x50, 0xc4, 0xa0, 0x92, 0x9c, 0x8f, 0x71, 0xd0, 0x0e, 0xee, 0x72, 0xa9, 0x2c, 0xde, 0x06, 0x0a, 0xf9, 0xe6, 0xe0, 0xe3, 0x77, 0x92, 0xaf, 0x38, 0x69, 0x23, 0x01, 0x76, 0x5d, 0x85, 0x61, 0x03, 0xea, 0x81, 0xc3, 0x18, 0x37, 0x34, 0x23, 0xd3, 0xbc, 0xc0, 0x68, 0x88, 0x4d, 0x41, 0x8e, 0x59, 0x54, 0x03, 0x04, 0x06, 0x5e, 0xf2, 0x53, 0x06, 0xd9, 0x51, 0x01, 0xd6, 0x1b, 0xaf, 0xb5, 0x91, 0xa7, 0x17, 0x9b, 0xc1, 0xac, 0x88, 0x0a, 0x74, 0xcf, 0xa4, 0x65, 0x93, 0x2a, 0xac, 0x3f, 0x70, 0x95, 0xac, 0xc2, 0x9e, 0x24, 0xf3, 0x51, 0x05, 0xf1, 0xc6, 0x6c, 0x35, 0x1b, 0x56, 0xd4, 0xfb, 0x0e, 0xef, 0xf0, 0x32, 0x05, 0x71, 0x70, 0xdc, 0xce, 0x04, 0x30, 0x72, 0xcd, 0x08, 0x5f, 0x78, 0x44, 0x4b, 0xe0, 0x53, 0xd2, 0x7f, 0xf0, 0x5f, 0x39, 0xeb, 0x0a, 0x3d, 0x64, 0x60, 0x07, 0x6a, 0xa8, 0x6f, 0x8a, 0x16, 0x4a, 0xd9, 0x9b, 0x33, 0x41, 0x47, 0x92, 0xcc, 0x3e, 0x3b, 0x37, 0x98, 0xea, 0x47, 0x27, 0xcf, 0x6e, 0x7d, 0x7a, 0x3c, 0x39, 0x26, 0xa2, 0x94, 0xfd, 0xb7, 0x96, 0x06, 0xfb, 0x00, 0x31, 0x13, 0x81, 0xa7, 0xd4, 0xa0, 0xb1, 0xd5, 0x53, 0x49, 0x83, 0x2f, 0x0f, 0xf9, 0x0e, 0x08, 0x5f, 0xb7, 0x03, 0xd4, 0x35, 0xc3, 0x7a, 0xe0, 0xfe, 0xe2, 0xf1, 0x41, 0xc9, 0xf6, 0x91, 0x0b, 0xac, 0xd1, 0xb4, 0xc3, 0x63, 0x4b, 0xa5, 0x16, 0x3b, 0x92, 0xa6, 0xca, 0x2f, 0xc2, 0x38, 0xf6, 0x50, 0xb6, 0x96, 0x6e, 0x6a, 0x1d, 0x83, 0x82, 0xe4, 0xd0, 0x45, 0xe8, 0xe8, 0x63, 0xf2, 0xf6, 0xc4, 0xf9, 0xea, 0x14, 0x90, 0x5d, 0xa5, 0x72, 0x11, 0x4f, 0xaf, 0xf6, 0xde, 0x1c, 0xf0, 0x79, 0xc1, 0x72, 0x31, 0x32, 0x60, 0x71, 0xdc, 0x72, 0x1d, 0x05, 0x03, 0x92, 0x3a, 0x74, 0xa4, 0x2a, 0x41, 0x33, 0x2c, 0x84, 0xa3, 0xfe, 0x39, 0x51, 0x9f, 0x27, 0xa4, 0x9a, 0x65, 0x2f, 0xbf, 0xf9, 0x7c, 0x93, 0xdb, 0x08, 0x61, 0xe8, 0x0e, 0x1a, 0x71, 0x2a, 0x33, 0x29, 0x08, 0x52, 0x31, 0x10, 0xeb, 0x26, 0x81, 0xfa, 0xe3, 0x55, 0xea, 0x1b, 0xab, 0xc3, 0x8f, 0x9e, 0x0c, 0x22, 0x2c, 0xde, 0x47, 0xc2, 0x9d, 0xd8, 0xb3, 0xaa, 0xa0, 0xe1, 0xa7, 0xe7, 0xdb, 0x94, 0x9a, 0x24, 0x21, 0x0f, 0x89, 0x7b, 0xf1, 0x5f, 0x9a, 0x8b, 0x3f, 0x38, 0xfe, 0xcb, 0x77, 0xe9, 0x1b, 0x1d, 0xc0, 0x90, 0xeb, 0xa7, 0x7e, 0x8a, 0x9f, 0xde, 0x1a, 0x2e, 0x89, 0xe3, 0x05, 0xbb, 0x38, 0x13, 0xfa, 0x8e, 0xe5, 0xda, 0x84, 0x99, 0x0e, 0xc7, 0xc1, 0x10, 0x60, 0xe6, 0x65, 0x65, 0xda, 0x4a, 0x01, 0x77, 0x30, 0xe9, 0x86, 0x07, 0x6d, 0xad, 0x05, 0x6b, 0xdd, 0xc7, 0xb8, 0x86, 0x2a, 0x47, 0x46, 0xf7, 0xc5, 0xe9, 0x43, 0x91, 0x87, 0x32, 0xf6, 0x0b, 0x99, 0xbc, 0x60, 0xf9, 0x91, 0xcf, 0x79, 0xfb, 0xdd, 0x30, 0xbd, 0x35, 0x65, 0x3e, 0xe7, 0xff, 0x6c, 0x3a, 0xfd, 0xdd, 0xb7, 0xe7, 0x8c, 0xb1, 0xf2, 0x53, 0x35, 0x2f, 0x4f, 0xf4, 0x68, 0x92, 0x70, 0xf6, 0x70, 0x8d, 0x87, 0xd4, 0xb0, 0x85, 0xbc, 0x26, 0x2c, 0xfd, 0xcf, 0xba, 0x4b, 0x52, 0xfe, 0xe5, 0xdb, 0xa8, 0x29, 0x1b, 0x55, 0x24, 0x34, 0xbe, 0x62, 0x5c, 0xad, 0x34, 0x9f, 0x0b, 0xae, 0x3c, 0x9d, 0x0a, 0x05, 0x82, 0x2d, 0x7b, 0x93, 0x71, 0xda, 0x47, 0xf2, 0x48, 0xb6, 0xcc, 0x5b, 0x70, 0x5a, 0xcf, 0xc6, 0x0d, 0x28, 0xb8, 0x52, 0xd3, 0xd3, 0xfe, 0xe8, 0x1a, 0x22, 0xe0, 0x1b, 0x35, 0xf0, 0x56, 0x53, 0x00, 0x78, 0x47, 0x2b, 0xb9, 0xcf, 0xfc, 0x17, 0x11, 0xb2, 0xd5, 0x4a, 0x82, 0x82, 0x3a, 0xd7, 0xe2, 0x8d, 0xd5, 0x16, 0x39, 0x8f, 0xfe, 0x49, 0xd0, 0x79, 0x77, 0x7f, 0x8a, 0x70, 0x5a, 0xb9, 0x77, 0x19, 0x4f, 0x4c, 0xa7, 0x14, 0x02, 0x86, 0x3c, 0xc6, 0xd5, 0x94, 0xc3, 0x5c, 0xd2, 0xa3, 0xc5, 0x0c, 0xe3, 0x46, 0x98, 0x9e, 0x45, 0x18, 0x7b, 0x2c, 0x3a, 0xa2, 0xe3, 0x26, 0xfe, 0x7f, 0x0f, 0x98, 0xfd, 0xbd, 0xe2, 0xb0, 0x43, 0x87, 0xf2, 0x7b, 0x34, 0x01, 0xdd, 0xef, 0x7d, 0x74, 0xdc, 0x2e, 0x4a, 0xab, 0x9a, 0x09, 0xba, 0x9d, 0x46, 0xc3, 0x8f, 0x4c, 0xe6, 0x18, 0x2b, 0xec, 0xef, 0x7e, 0xb8, 0x48, 0x13, 0xab, 0xa6, 0x62, 0x5b, 0x57, 0x5a, 0x59, 0x75, 0x43, 0x24, 0x90, 0x4f, 0x7a, 0x72, 0x0d, 0xe5, 0xd7, 0x44, 0x1f, 0x57, 0xc7, 0xe0, 0x44, 0x3e, 0x50, 0xc7, 0x49, 0x40, 0x53, 0xe7, 0xb3, 0xe2, 0x0e, 0x12, 0x5e, 0x9e, 0xe4, 0xaf, 0x64, 0x36, 0x61, 0xb0, 0x40, 0x47, 0x79, 0xc4, 0x34, 0x21, 0x10, 0xcd, 0xe8, 0xd6, 0xc0, 0x94, 0x53, 0x91, 0xd6, 0xbb, 0xde, 0x29, 0x9d, 0xf4, 0xc7, 0xf6, 0xe0, 0x71, 0xc4, 0xe4, 0xaa, 0x9c, 0xea, 0xc5, 0x50, 0x07, 0xcc, 0xec, 0xb1, 0xa6, 0xe7, 0xf7, 0xbd, 0x3c, 0x3e, 0xec, 0x34, 0x13, 0x41, 0x88, 0xb0, 0xf0, 0xf3, 0xd3, 0xe6, 0x46, 0x4c, 0xf8, 0x29, 0xaa, 0xdc, 0x54, 0x30, 0x87, 0xb2, 0xcd, 0x18, 0x13, 0x7c, 0x65, 0xac, 0x81, 0xf0, 0x0e, 0xe5, 0x79, 0x6a, 0xc1, 0xad, 0xc5, 0xd6, 0xca, 0xe8, 0x4d, 0xd0, 0x66, 0xb5, 0x45, 0x0a, 0x8f, 0xf1, 0xa5, 0xee, 0x17, 0xfe, 0xd9, 0x85, 0xf4, 0xc2, 0xba, 0x98, 0xdb, 0xf2, 0xbe, 0x15, 0x10, 0x90, 0x6b, 0xb3, 0x7c, 0xb2, 0x12, 0xd9, 0x00, 0x86, 0xb9, 0xbd, 0x09, 0x93, 0x59, 0xc9, 0x64, 0x41, 0x4a, 0x42, 0x54, 0x9c, 0xfb, 0x2b, 0xe2, 0x55, 0xe6, 0x67, 0x75, 0x09, 0xc3, 0x1f, 0xa2, 0xc6, 0xfc, 0x63, 0x45, 0xcc, 0x62, 0x14, 0xd1, 0x90, 0x1e, 0x01, 0xe4, 0x07, 0xea, 0x50, 0x1f, 0x20, 0x81, 0x20, 0x34, 0x93, 0x53, 0x6c, 0x40, 0xd9, 0x7e, 0x32, 0x5c, 0x7b, 0xfa, 0xd5, 0x6e, 0x90, 0x13, 0xc1, 0x46, 0x81, 0x1d, 0x4d, 0xe6, 0x10, 0x63, 0xe5, 0x20, 0x99, 0x60, 0x68, 0x67, 0x97, 0x32, 0xcf, 0xdf, 0x69, 0x4b, 0x10, 0xb6, 0x57, 0x6a, 0x41, 0xb7, 0xd0, 0xc9, 0x01, 0x1c, 0xf5, 0x98, 0x14, 0xa4, 0x5c, 0xab, 0x4d, 0xe6, 0x0d, 0x70, 0xb1, 0xe5, 0xd1, 0x23, 0xd9, 0xe4, 0xad, 0x45, 0x98, 0x7c, 0xa9, 0x4a, 0xde, 0xeb, 0xd5, 0x92, 0xdc, 0xaf, 0x8e, 0x9a, 0x69, 0x54, 0xfe, 0x74, 0xa5, 0x8a, 0xe2, 0x74, 0xdc, 0x7a, 0x90, 0x2d, 0xad, 0x5a, 0x38, 0x9b, 0x6b, 0x3f, 0x6a, 0xa2, 0xc3, 0x33, 0xd8, 0xb7, 0x9f, 0x88, 0x5e, 0xde, 0x4b, 0x6c, 0x3f, 0xd4, 0xd6, 0xbd, 0xb2, 0x8d, 0xbc, 0x1e, 0x9d, 0xe1, 0xc1, 0x4a, 0xa0, 0x82, 0x20, 0xa8, 0x55, 0x31, 0xe5, 0x20, 0xd6, 0x31, 0x98, 0x2e, 0x80, 0xfc, 0x1b, 0x34, 0xf7, 0x36, 0xd5, 0x15, 0x6a, 0xdf, 0x11, 0xff, 0x19, 0xcc, 0xa0, 0x88, 0x14, 0x58, 0xc6, 0xfd, 0x45, 0x57, 0x54, 0xf6, 0xb0, 0x4b, 0x11, 0x2e, 0xfa, 0xdb, 0x5e, 0x92, 0x28, 0x80, 0x1a, 0x98, 0xaa, 0x82, 0xc4, 0xd2, 0x98, 0x23, 0xdf, 0xc3, 0x3b, 0x19, 0x9b, 0xf1, 0xcf, 0x42, 0xb1, 0x3b, 0x87, 0x94, 0x8f, 0x6d, 0xd2, 0x53, 0xb5, 0x12, 0xdd, 0x86, 0x5f, 0x8a, 0x59, 0xab, 0x64, 0x5c, 0x7e, 0xaa, 0x5e, 0xcd, 0x50, 0x08, 0x0b, 0xb1, 0x21, 0x5d, 0xf3, 0x81, 0x57, 0x08, 0x4b, 0xae, 0x6f, 0x21, 0x1a, 0x35, 0x42, 0xaf, 0x9a, 0x74, 0x87, 0x1b, 0xe1, 0x3b, 0x9a, 0xe5, 0xc0, 0x27, 0x7c, 0x96, 0xec, 0x2b, 0x1a, 0xf6, 0x5b, 0x70, 0xd2, 0x7e, 0xf1, 0x5f, 0x33, 0x10, 0x5c, 0xfc, 0x04, 0xe6, 0x3d, 0x75, 0x88, 0xc9, 0x88, 0xfa, 0x01, 0x83, 0x2d, 0xd0, 0x73, 0x96, 0xf8, 0xa1, 0xaa, 0x2e, 0xb5, 0x17, 0x7e, 0x55, 0x99, 0xa9, 0x56, 0x66, 0xdd, 0xb4, 0xeb, 0xc4, 0xac, 0xcd, 0x4f, 0xcb, 0x3f, 0x56, 0x2d, 0x07, 0x47, 0x4f, 0x52, 0xa4, 0x8b, 0x6f, 0x6c, 0x26, 0xd2, 0x73, 0x12, 0x5b, 0x03, 0xb7, 0x05, 0x8d, 0x8b, 0x03, 0xb6, 0xfb, 0xff, 0xa7, 0x08, 0x8b, 0x02, 0xca, 0x56, 0xb9, 0x6a, 0xff, 0xb8, 0xd3, 0x9e, 0x19, 0x82, 0x68, 0x42, 0x41, 0x0e, 0xfe, 0x17, 0x45, 0xbc, 0x03, 0x1c, 0x33, 0x36, 0x06, 0xfa, 0x27, 0xf9, 0x27, 0x9e, 0x61, 0x11, 0xcc, 0x28, 0x9a, 0x23, 0x96, 0x04, 0x98, 0xb1, 0x94, 0x56, 0x01, 0x9a, 0xb6, 0x9c, 0x6d, 0xe0, 0x84, 0x8f, 0xbe, 0xae, 0x0f, 0x49, 0xb4, 0x9a, 0x28, 0xad, 0xbc, 0x27, 0xd1, 0x04, 0x09, 0x8e, 0xf1, 0xe4, 0xe6, 0xbe, 0x4c, 0x56, 0x4b, 0xa1, 0xb1, 0x37, 0xae, 0xa1, 0x75, 0xdf, 0x1b, 0x6b, 0x21, 0x01, 0x87, 0xf2, 0x68, 0xd2, 0x62, 0xb7, 0x5c, 0x6e, 0x6b, 0x49, 0xe1, 0x77, 0xc8, 0x07, 0x61, 0xff, 0x56, 0x2d, 0xc1, 0xa8, 0x3e, 0x0f, 0x94, 0x09, 0xc9, 0x9f, 0x8f, 0x54, 0x75, 0x35, 0x3d, 0x36, 0x48, 0x90, 0xf4, 0xff, 0x64, 0x18, 0x08, 0x03, 0xdc, 0x65, 0x3e, 0x40, 0xc6, 0x05, 0x84, 0x41, 0x91, 0x7a, 0xdf, 0x42, 0x99, 0x83, 0xa4, 0x94, 0xf9, 0x9d, 0xeb, 0x43, 0xa0, 0xc8, 0x41, 0xf7, 0xa8, 0x8e, 0x9d, 0x18, 0xe3, 0x42, 0x96, 0x35, 0xb6, 0x86, 0xd2, 0xa7, 0x2a, 0x0f, 0xc2, 0x71, 0x40, 0xad, 0x8c, 0x6b, 0x85, 0x85, 0x49, 0xa0, 0xe7, 0xa1, 0x71, 0xf4, 0xc7, 0xac, 0x93, 0x0a, 0x4f, 0xf6, 0x4a, 0x64, 0x06, 0xbf, 0x6c, 0xcc, 0xa1, 0xb1, 0x84, 0xf3, 0x1d, 0xae, 0x83, 0x59, 0x0a, 0xcc, 0xb2, 0x6c, 0x2a, 0x9e, 0xeb, 0xf4, 0x3a, 0xb6, 0x09, 0xae, 0x10, 0x67, 0x9d, 0x37, 0xe6, 0xd0, 0xe3, 0x2c, 0xf6, 0x15, 0xf4, 0x90, 0x47, 0xf0, 0x3c, 0x6e, 0xc6, 0x69, 0x2f, 0xbf, 0x98, 0xe1, 0x38, 0x8d, 0xaf, 0x55, 0xf2, 0x59, 0x9b, 0xe1, 0x9b, 0xbb, 0xa3, 0x83, 0xc6, 0x48, 0x15, 0x22, 0x4f, 0xb8, 0xda, 0xcf, 0x94, 0x49, 0x4d, 0x4a, 0xe2, 0x5e, 0x4e, 0xc8, 0x2e, 0x6c, 0x91, 0xf3, 0x06, 0x16, 0x3c, 0x33, 0xc7, 0x97, 0xb2, 0x2c, 0x0f, 0x61, 0xa9, 0x88, 0x75, 0x03, 0x83, 0xf6, 0x78, 0x50, 0xdb, 0x72, 0xb6, 0xbe, 0x5e, 0xc8, 0x5f, 0x0c, 0xdc, 0x53, 0xe8, 0x28, 0x9e, 0x0b, 0x04, 0x4f, 0xfb, 0xbf, 0xd0, 0x76, 0x26, 0x9e, 0x4d, 0xe9, 0x4a, 0xfc, 0x14, 0x32, 0xd9, 0x53, 0x45, 0x3c, 0x21, 0x88, 0xc1, 0xb8, 0x20, 0x70, 0x99, 0xc0, 0x99, 0x93, 0xc6, 0xba, 0x67, 0x30, 0x1a, 0x80, 0x12, 0x81, 0x76, 0xbe, 0xa0, 0x3f, 0x3e, 0x9b, 0xad, 0x69, 0x0a, 0x9b, 0xbe, 0x42, 0x9e, 0xc3, 0xd3, 0x99, 0x1d, 0xff, 0x3b, 0x4c, 0x79, 0xc2, 0xac, 0x0f, 0x2e, 0xec, 0x93, 0x6a, 0x30, 0xf0, 0xa9, 0x01, 0x21, 0x36, 0xc7, 0x18, 0xc8, 0xbe, 0xfb, 0x56, 0xbf, 0x07, 0xdb, 0xc9, 0x6b, 0x2f, 0x19, 0x2b, 0x31, 0x5b, 0x58, 0x64, 0xe7, 0x59, 0x3e, 0x4f, 0x89, 0x84, 0xcb, 0xc1, 0x2e, 0xe8, 0xe9, 0xc8, 0x3a, 0xa7, 0x44, 0x30, 0xd4, 0x9c, 0x5b, 0x4c, 0x9b, 0x3d, 0xd8, 0xf3, 0x94, 0xc6, 0x1c, 0xc8, 0x67, 0x94, 0x1f, 0xbe, 0xcc, 0xce, 0x77, 0xdc, 0x40, 0x4b, 0xb6, 0x3e, 0xfc, 0xb0, 0xf9, 0x5d, 0x27, 0xd9, 0xbe, 0x90, 0x4b, 0x7b, 0xf6, 0xd2, 0x06, 0x07, 0x5c, 0xc5, 0x02, 0xd1, 0x04, 0xf7, 0x26, 0x71, 0x37, 0x64, 0x0e, 0x69, 0x7e, 0x3d, 0xb9, 0x09, 0xfd, 0xe8, 0x82, 0x90, 0x02, 0x48, 0x52, 0x94, 0xde, 0x3e, 0x13, 0xa4, 0xf4, 0x70, 0x68, 0x2b, 0x0f, 0x49, 0x9b, 0x97, 0xf9, 0x41, 0xd7, 0xbb, 0x49, 0x5e, 0x97, 0x72, 0x7c, 0xfa, 0x5e, 0x86, 0x47, 0xc8, 0xa9, 0xd0, 0x2c, 0x12, 0x21, 0xa0, 0x4c, 0x44, 0x16, 0x5f, 0x7c, 0xae, 0x29, 0x72, 0x9a, 0x86, 0x48, 0x62, 0x22, 0x2c, 0xe0, 0x3a, 0xfc, 0xb2, 0x4d, 0x31, 0x98, 0x9c, 0x96, 0x89, 0x3d, 0xe4, 0x57, 0xb7, 0x9e, 0x42, 0xfe, 0xc4, 0xaf, 0xaa, 0x3a, 0xf3, 0xb6, 0x15, 0xb1, 0xa4, 0xa5, 0x84, 0xf2, 0x78, 0xa7, 0x42, 0xaa, 0xb6, 0xf9, 0x6a, 0x1a, 0xee, 0xfb, 0xaa, 0xc8, 0xdc, 0x87, 0x46, 0x75, 0x8e, 0x81, 0x60, 0x50, 0xc9, 0xaf, 0x76, 0x69, 0xaa, 0xcb, 0x2c, 0x68, 0x89, 0xd7, 0x4c, 0x7f, 0x22, 0xb1, 0x0b, 0x9d, 0xf7, 0xe7, 0x8e, 0xe5, 0xf0, 0xcc, 0xac, 0x5e, 0x45, 0xcc, 0xf6, 0xec, 0x9d, 0xfc, 0xf4, 0x7f, 0x78, 0xf5, 0xb2, 0x8a, 0xca, 0xe3, 0x7b, 0xb7, 0xe8, 0xd9, 0xe5, 0xd9, 0xa8, 0x68, 0x0e, 0x21, 0xc4, 0x6f, 0x24, 0x96, 0x80, 0x34, 0x2b, 0xbf, 0x8d, 0xb4, 0xfa, 0xa2, 0x2c, 0x38, 0x87, 0xf3, 0x97, 0x29, 0x65, 0x85, 0x9c, 0x25, 0x8b, 0x04, 0x8b, 0x52, 0x57, 0xe6, 0x52, 0xf3, 0xd3, 0x9f, 0xe7, 0x39, 0x36, 0x14, 0xe6, 0x5b, 0xae, 0x53, 0x7c, 0xe9, 0x5c, 0x81, 0x83, 0x5d, 0xa0, 0x13, 0xee, 0xf3, 0x98, 0x42, 0x68, 0xba, 0xe3, 0xb8, 0x38, 0xeb, 0xab, 0x90, 0x68, 0x7a, 0xe2, 0x7d, 0x26, 0xec, 0xcb, 0x49, 0x6a, 0x68, 0xbd, 0x82, 0xd9, 0x10, 0x24, 0x70, 0xea, 0x92, 0xc8, 0x49, 0x47, 0xf9, 0x52, 0xa8, 0x76, 0xca, 0x0c, 0x3c, 0xb8, 0x4c, 0xe8, 0xbd, 0x31, 0x27, 0xc4, 0x25, 0x4a, 0x30, 0xec, 0x1c, 0x54, 0x84, 0xe0, 0xb4, 0x6e, 0xd4, 0x58, 0x56, 0xa8, 0xff, 0x86, 0xfd, 0x68, 0xe6, 0x9b, 0xa1, 0x0d, 0x7c, 0x8c, 0xf7, 0xd3, 0x1c, 0x16, 0x57, 0xf6, 0x20, 0x00, 0xfd, 0x1b, 0xaf, 0xa0, 0x75, 0xeb, 0xd6, 0xa0, 0x51, 0x01, 0xda, 0x02, 0x1d, 0x06, 0xcd, 0x62, 0x95, 0x1a, 0x60, 0x7b, 0x15, 0x76, 0xf8, 0xed, 0x50, 0x50, 0x04, 0x3e, 0x45, 0xff, 0x8d, 0x1e, 0x6f, 0x60, 0x0e, 0xef, 0x3c, 0x78, 0x87, 0x84, 0xc1, 0x5b, 0xcd, 0x29, 0xac, 0x4c, 0x24, 0xe4, 0x7a, 0x25, 0x0f, 0xfb, 0xea, 0xfa, 0x67, 0xb6, 0xb1, 0xf9, 0xab, 0x66, 0x6f, 0x94, 0x97, 0xa6, 0xe2, 0xe3, 0xf8, 0xe1, 0x59, 0x43, 0xbe, 0x15, 0x6c, 0x44, 0x53, 0xd6, 0xeb, 0xc2, 0x2b, 0x95, 0x14, 0x51, 0x9d, 0x22, 0x09, 0xdf, 0xf1, 0x70, 0x81, 0x94, 0xba, 0x99, 0xbd, 0xfd, 0x66, 0x21, 0xbe, 0x6a, 0x13, 0x7f, 0xb5, 0x94, 0xa4, 0xd9, 0xbb, 0x83, 0x14, 0x10, 0xc2, 0xaf, 0x0b, 0xfc, 0xcb, 0x66, 0xaf, 0xf9, 0x5a, 0x6d, 0xbd, 0xa2, 0x27, 0xea, 0xd8, 0xdc, 0x17, 0x81, 0x21, 0x17, 0x6a, 0xbe, 0x07, 0xd0, 0x36, 0xb3, 0x61, 0x5a, 0x14, 0xe2, 0xba, 0xdf, 0x19, 0x5d, 0xeb, 0xa2, 0x08, 0x2b, 0xf0, 0x86, 0xc5, 0xee, 0xf4, 0xd4, 0x0d, 0xc3, 0xae, 0x39, 0x65, 0x6a, 0xf0, 0x0e, 0x50, 0xa7, 0x7d, 0xdc, 0xc5, 0xe7, 0x1c, 0x20, 0xe0, 0x27, 0xea, 0x4b, 0xd8, 0x12, 0xf4, 0x0d, 0x31, 0x69, 0x05, 0xd3, 0x33, 0xa8, 0xbd, 0x8f, 0x9a, 0xe7, 0xe3, 0xb7, 0x8f, 0xfe, 0xfc, 0x90, 0xd7, 0xec, 0x1d, 0xac, 0x4b, 0x7a, 0xfd, 0xb1, 0x88, 0x1b, 0x4e, 0x5d, 0xe7, 0x17, 0x4e, 0xc7, 0xb0, 0xe8, 0x99, 0xe8, 0x8a, 0xe4, 0x41, 0x59, 0x36, 0x1d, 0x20, 0x5e, 0x7d, 0x86, 0x6d, 0x24, 0x67, 0x57, 0x8e, 0x47, 0xae, 0xb2, 0x2d, 0x97, 0x72, 0x86, 0x8e, 0x1c, 0x2e, 0xb4, 0x20, 0x58, 0xeb, 0x70, 0x52, 0xcb, 0xb4, 0xea, 0xa7, 0xbd, 0x49, 0x2e, 0x0d, 0x37, 0x18, 0x49, 0x6b, 0x53, 0x68, 0xae, 0x79, 0xb5, 0xd8, 0xd8, 0xd4, 0x5a, 0x08, 0x30, 0x52, 0x91, 0x96, 0x30, 0x92, 0x46, 0x4c, 0xc9, 0xd8, 0x86, 0x97, 0x02, 0x18, 0x40, 0x3b, 0xe3, 0x51, 0x49, 0x46, 0x91, 0x1d, 0xa3, 0x42, 0xba, 0x85, 0xff, 0xaf, 0x33, 0x19, 0x80, 0xb1, 0xe0, 0x41, 0xc2, 0x05, 0xd5, 0xce, 0x1b, 0x39, 0xba, 0xd4, 0x21, 0x1d, 0x74, 0xbc, 0x6c, 0x75, 0x02, 0x95, 0x9d, 0xf0, 0xa4, 0xab, 0x9e, 0x5e, 0x43, 0x5b, 0x2c, 0x1d, 0x0d, 0x25, 0x93, 0xd4, 0x60, 0x03, 0xb9, 0x64, 0xe9, 0xf9, 0x5e, 0x1c, 0x0d, 0xee, 0xa2, 0x2d, 0x87, 0xba, 0xc8, 0x5d, 0x53, 0x80, 0x39, 0xff, 0xcb, 0x3e, 0xcc, 0x22, 0x11, 0xa2, 0x44, 0x09, 0xac, 0x20, 0x1b, 0xdb, 0x76, 0x41, 0x7e, 0x9c, 0xb5, 0x3e, 0x98, 0x5c, 0x88, 0xcd, 0x13, 0xae, 0x85, 0x3b, 0xdc, 0x5c, 0xa0, 0xbb, 0x27, 0x59, 0x4e, 0xfe, 0xb4, 0xf7, 0xeb, 0x03, 0x50, 0x5a, 0x59, 0x31, 0x9e, 0x2d, 0xeb, 0xa3, 0x17, 0x93, 0x81, 0xc3, 0x50, 0x61, 0xf4, 0x1a, 0x7b, 0x8a, 0xb4, 0x66, 0x31, 0xdb, 0xaf, 0xed, 0x6f, 0xe8, 0x75, 0x12, 0xde, 0x46, 0x9a, 0x26, 0x57, 0xfa, 0x5c, 0x80, 0xa6, 0x32, 0x86, 0xd0, 0x8e, 0x33, 0x95, 0xb0, 0x0e, 0x93, 0x18, 0x7c, 0xe3, 0xa8, 0x5d, 0x64, 0x4e, 0x40, 0x49, 0xbf, 0x17, 0x92, 0x88, 0xa2, 0xd2, 0x75, 0xe7, 0xb2, 0x61, 0xd0, 0xfd, 0x36, 0xba, 0x52, 0x11, 0x71, 0xeb, 0x63, 0x38, 0x2e, 0x5b, 0x5a, 0xbe, 0x9c, 0x52, 0xf0, 0xc7, 0x5c, 0xbb, 0xf4, 0x36, 0xd9, 0x29, 0x41, 0xce, 0xd8, 0x19, 0xee, 0x97, 0x50, 0x77, 0xc4, 0x84, 0x7b, 0x63, 0xf5, 0x52, 0x2d, 0x34, 0x0a, 0xb3, 0x65, 0xbd, 0x1e, 0xac, 0x21, 0xd0, 0x4a, 0x3c, 0x77, 0x01, 0x60, 0x3e, 0xe2, 0xac, 0xdc, 0x90, 0xda, 0x3a, 0x17, 0x75, 0xa7, 0x9f, 0xbe, 0x38, 0x76, 0x27, 0x83, 0x13, 0xad, 0x73, 0x12, 0x4e, 0x7c, 0xbe, 0x47, 0xab, 0xb4, 0x66, 0x9e, 0x02, 0xdd, 0xa7, 0xeb, 0x29, 0x83, 0xa9, 0x4b, 0x16, 0xd0, 0xbd, 0x5a, 0x48, 0x60, 0xe3, 0xa6, 0x63, 0x50, 0x91, 0x64, 0x1a, 0x98, 0xaf, 0x62, 0x51, 0x9b, 0xe6, 0x3d, 0x83, 0xfd, 0x1a, 0xd4, 0x62, 0xb5, 0x35, 0xfc, 0xbe, 0x63, 0x27, 0x76, 0xa8, 0xe3, 0x2b, 0x1e, 0xd7, 0x22, 0x4b, 0x64, 0x4b, 0x30, 0x26, 0x00, 0x2f, 0x97, 0xf1, 0xe2, 0x04, 0xec, 0xbc, 0x68, 0xfc, 0xa3, 0xf6, 0xd4, 0xa4, 0x27, 0x34, 0xfd, 0xc6, 0x2b, 0x2e, 0x45, 0x8e, 0x3a, 0x0a, 0xca, 0xeb, 0x96, 0xde, 0xe1, 0x38, 0x3f, 0x70, 0xc0, 0x1c, 0x52, 0x40, 0x7a, 0xaf, 0x94, 0xc8, 0x31, 0xde, 0x4f, 0x02, 0x86, 0x10, 0x5d, 0x2b, 0x55, 0x0a, 0x82, 0xc7, 0xa0, 0x0f, 0xff, 0xe5, 0xc8, 0x4c, 0x63, 0xa4, 0x03, 0x74, 0xa5, 0xf6, 0x0a, 0xa8, 0x70, 0xa4, 0x12, 0x99, 0xbe, 0x92, 0xfe, 0xf0, 0xa8, 0x45, 0xd3, 0xee, 0x7c, 0xa2, 0x6c, 0x4f, 0x11, 0xf8, 0x6f, 0x75, 0x57, 0x41, 0x7f, 0xc2, 0x32, 0xa5, 0xb3, 0x46, 0x89, 0x40, 0x47, 0x9a, 0x9a, 0x25, 0x92, 0x0b, 0x90, 0xa3, 0x38, 0xfb, 0x57, 0xc7, 0xa1, 0x85, 0xaf, 0x21, 0xaa, 0x60, 0x7f, 0xcb, 0x9a, 0x06, 0x6c, 0xa8, 0x57, 0x15, 0xab, 0xea, 0xda, 0xf5, 0x13, 0xd7, 0xe0, 0xbb, 0x77, 0xcc, 0xe2, 0x4d, 0x32, 0x82, 0x48, 0xc7, 0x03, 0x90, 0xda, 0x1e, 0x1c, 0x31, 0x77, 0x04, 0x75, 0x48, 0x09, 0x0b, 0x66, 0xa1, 0xb8, 0x0c, 0x75, 0x7a, 0x5e, 0xca, 0x6d, 0x42, 0x3b, 0xd3, 0xb0, 0xa0, 0xeb, 0xa7, 0xcd, 0xb7, 0x94, 0x1c, 0x55, 0xa9, 0x64, 0x01, 0xeb, 0x59, 0x3b, 0x02, 0x9b, 0x76, 0xa4, 0xcb, 0x6d, 0xb5, 0x0a, 0x71, 0x39, 0x5d, 0x29, 0x0d, 0xbc, 0x09, 0xc2, 0xaa, 0xec, 0xa9, 0x93, 0x61, 0x89, 0xcb, 0x86, 0xc2, 0xf5, 0x19, 0x29, 0x76, 0x45, 0x22, 0x5e, 0x23, 0x98, 0x5d, 0x54, 0x90, 0xa7, 0x6a, 0xb5, 0x0a, 0x9e, 0x9c, 0x21, 0x06, 0x2b, 0xb5, 0xdc, 0x07, 0xd4, 0xf0, 0xc3, 0xc2, 0x8d, 0x45, 0x85, 0x80, 0x8a, 0xe8, 0x0f, 0xc5, 0x52, 0x13, 0x48, 0x2f, 0x15, 0x05, 0xff, 0xa0, 0x3f, 0x4b, 0x21, 0xa0, 0x4d, 0x3e, 0x30, 0xfc, 0xdf, 0xcd, 0xf0, 0xb3, 0x0f, 0x7c, 0x64, 0x13, 0x02, 0xad, 0xf8, 0x20, 0xbc, 0x1e, 0x00, 0x35, 0x39, 0xb4, 0x61, 0xee, 0xb9, 0x77, 0x8e, 0x44, 0x5b, 0xdd, 0xb7, 0xfa, 0xed, 0x4b, 0x3d, 0x39, 0x03, 0xd9, 0x68, 0x77, 0x46, 0x56, 0x5c, 0x9d, 0x0f, 0x8c, 0x49, 0x68, 0x35, 0xc4, 0xe3, 0x0f, 0x23, 0x8d, 0x12, 0x27, 0x2d, 0xba, 0xea, 0xc4, 0x24, 0xaa, 0xdd, 0xe2, 0x27, 0xcc, 0x2f, 0x03, 0xbd, 0x61, 0xab, 0x19, 0x21, 0x84, 0x95, 0xa5, 0xdd, 0x68, 0xdf, 0x21, 0x9a, 0xe2, 0x9f, 0x9c, 0x37, 0x27, 0xc1, 0xa4, 0x18, 0xd6, 0xf9, 0x68, 0xc1, 0x39, 0xfc, 0x1e, 0xa3, 0xc8, 0xf0, 0xa3, 0x35, 0xee, 0x21, 0x61, 0x47, 0x10, 0xf5, 0x76, 0x94, 0xcc, 0x22, 0x13, 0x96, 0x7e, 0x1e, 0x21, 0x9e, 0x09, 0xd8, 0x2b, 0x23, 0xd4, 0xa5, 0x78, 0x5a, 0x12, 0x7d, 0x77, 0x08, 0x47, 0x67, 0x61, 0x95, 0x07, 0x32, 0x19, 0x61, 0x01, 0x66, 0x57, 0x5b, 0x3d, 0x7a, 0x05, 0xcf, 0xa2, 0x47, 0xe9, 0x7f, 0xbb, 0xbd, 0x85, 0xf6, 0xbb, 0xd5, 0x3b, 0x19, 0xbe, 0xc6, 0xb5, 0xff, 0x51, 0x7c, 0x84, 0x02, 0x35, 0x46, 0x07, 0x16, 0x60, 0xcf, 0x8f, 0x5a, 0x45, 0x4f, 0xc0, 0xed, 0x55, 0x02, 0x3b, 0x03, 0xc6, 0xda, 0x7a, 0x38, 0x93, 0x71, 0xfa, 0x24, 0xc4, 0x41, 0xa0, 0x2f, 0xef, 0x17, 0x56, 0xa6, 0xff, 0xc5, 0xf5, 0x0f, 0x34, 0x17, 0x67, 0xba, 0x6b, 0x09, 0x0d, 0x99, 0xa0, 0x37, 0x5e, 0x51, 0xb1, 0x95, 0xd1, 0x91, 0x64, 0x60, 0xfd, 0xa3, 0xac, 0x55, 0xff, 0x41, 0x28, 0x20, 0x1d, 0xa9, 0xed, 0x17, 0xa9, 0xf4, 0x85, 0x28, 0x27, 0xa3, 0x37, 0x10, 0xb2, 0x7b, 0x89, 0xce, 0x9b, 0x93, 0x04, 0x58, 0x54, 0xab, 0x37, 0x8c, 0x8c, 0xbf, 0xff, 0x69, 0x9c, 0xdc, 0x05, 0x7f, 0x22, 0x33, 0x87, 0xa4, 0xeb, 0x6c, 0x5c, 0xe9, 0x17, 0x3c, 0x32, 0xcd, 0x77, 0x3a, 0x1b, 0xb0, 0x3a, 0xee, 0x48, 0x8a, 0xc9, 0x2b, 0x13, 0xdc, 0xef, 0x9f, 0x43, 0xe7, 0x3d, 0xa9, 0x8c, 0x1d, 0xad, 0x6a, 0x56, 0xd5, 0x85, 0x1f, 0xc0, 0x42, 0x7e, 0xae, 0xe3, 0xa6, 0x26, 0x7e, 0x5b, 0xc3, 0x83, 0x8c, 0x04, 0x92, 0xf9, 0xbc, 0x01, 0x38, 0x6d, 0x6d, 0x03, 0x36, 0xab, 0x4f, 0xc7, 0xe0, 0x05, 0x79, 0xe1, 0x10, 0x3d, 0xb6, 0xb9, 0x1b, 0xa6, 0x20, 0xd3, 0x04, 0x85, 0xf1, 0x53, 0xf0, 0xbd, 0x95, 0xc0, 0xda, 0xac, 0x04, 0x08, 0x88, 0x50, 0x4e, 0xc4, 0xbe, 0xae, 0x77, 0xbe, 0xb1, 0x74, 0x86, 0xb0, 0xbe, 0xdd, 0xd9, 0x4f, 0x5c, 0xd5, 0xbb, 0x88, 0x50, 0x5e, 0x39, 0x0a, 0x20, 0x32, 0x31, 0x04, 0xc9, 0xa9, 0xab, 0x30, 0xb4, 0xde, 0x6c, 0x10, 0xe7, 0x0d, 0xc9, 0x78, 0x79, 0x40, 0xba, 0x4c, 0x48, 0x2b, 0x2f, 0x8b, 0xee, 0x54, 0xa7, 0x8c, 0xf0, 0x77, 0xfe, 0x88, 0x39, 0x28, 0x86, 0x59, 0xc7, 0xba, 0x5a, 0x81, 0xa5, 0x60, 0xef, 0x6e, 0x19, 0x92, 0xec, 0xfd, 0x1e, 0xb2, 0x3c, 0x3c, 0x14, 0xf0, 0x61, 0x74, 0xb7, 0x6b, 0x0b, 0x67, 0x4e, 0x98, 0xe9, 0xd6, 0x24, 0xe8, 0xbf, 0x46, 0x3c, 0xa5, 0xb9, 0x04, 0x41, 0x1d, 0xff, 0x67, 0xbc, 0x03, 0x89, 0x55, 0x8a, 0x12, 0x35, 0x08, 0x8c, 0xf3, 0x16, 0x12, 0xa0, 0x61, 0x0f, 0x9f, 0xd0, 0x8b, 0xa1, 0xfb, 0xca, 0xba, 0x02, 0x54, 0x90, 0x33, 0x6f, 0xc0, 0x71, 0x5f, 0xc2, 0x82, 0x38, 0x29, 0x47, 0x89, 0xa3, 0xa8, 0xcc, 0x39, 0x17, 0xfe, 0xf7, 0x6e, 0x91, 0x80, 0xdd, 0xbe, 0xe0, 0x17, 0xcf, 0xff, 0x12, 0xe5, 0x77, 0x09, 0x2c, 0x2c, 0x25, 0xbd, 0x1e, 0x6c, 0x63, 0x47, 0xf5, 0xcc, 0xcf, 0x9f, 0x53, 0xbb ],
+    const [ 0x2d, 0x81, 0x9b, 0x81, 0xdf, 0x84, 0x8a, 0x0b, 0x7e, 0x30, 0x2b, 0x76, 0x8f, 0x47, 0x48, 0x37, 0x45, 0x81, 0xcb, 0x60, 0xf4, 0x2e, 0xd1, 0x6a, 0xc9, 0x1c, 0xff, 0x31, 0xb9, 0xbb, 0x19, 0x40, 0xb7, 0x7f, 0xd0, 0x4f, 0x2a, 0x86, 0xdc, 0x0a, 0x9e, 0x7b, 0x4b, 0x14, 0xb9, 0xba, 0x19, 0x4c, 0x71, 0xb4, 0x00, 0x4f, 0x7d, 0x95, 0x91, 0x3e, 0x09, 0x25, 0x84, 0xc1, 0xae, 0xec, 0x4d, 0x4b, 0xa1, 0x9a, 0xf0, 0xa0, 0x2b, 0xa6, 0x15, 0x95, 0x59, 0x34, 0x5f, 0x17, 0xf4, 0x3c, 0xfa, 0x6f, 0xb3, 0xe9, 0x73, 0xc4, 0xb0, 0x3f, 0xcd, 0xe2, 0x19, 0x01, 0xd1, 0x3a, 0x28, 0xd2, 0xa5, 0x29, 0x55, 0x9a, 0xa0, 0x7d, 0xca, 0x2b, 0x5d, 0x35, 0x17, 0x25, 0x0e, 0x88, 0x27, 0x16, 0x13, 0x29, 0x72, 0xe6, 0xcc, 0xca, 0x75, 0x73, 0xab, 0xdf, 0x5f, 0x78, 0x8d, 0xa4, 0x0e, 0xb3, 0x4a, 0x61, 0x39, 0x47, 0x8a, 0xec, 0xef, 0x5f, 0xdb, 0x70, 0x40, 0x14, 0x01, 0x6e, 0x3a, 0x91, 0x8d, 0x01, 0x17, 0x74, 0xb2, 0x66, 0xb4, 0x78, 0x53, 0xbb, 0x45, 0x51, 0x60, 0x07, 0x48, 0xd8, 0x63, 0x7b, 0xb7, 0x68, 0x56, 0xf8, 0x82, 0x88, 0xb8, 0xd1, 0x3c, 0xca, 0xe0, 0xd1, 0x14, 0xf3, 0x90, 0x80, 0x08, 0x5b, 0xcd, 0xa2, 0x55, 0x97, 0xee, 0x01, 0x32, 0x56, 0xf4, 0x6c, 0xbd, 0x89, 0x19, 0x00, 0x36, 0xc7, 0xac, 0xa6, 0x6b, 0xef, 0x1b, 0xdd, 0x73, 0x0f, 0x52, 0xba, 0x9f, 0x84, 0x43, 0x2c, 0xae, 0x63, 0xc6, 0x85, 0x40, 0x18, 0xa4, 0x36, 0x8e, 0x4d, 0xee, 0xda, 0x57, 0x0e, 0x94, 0x77, 0x1e, 0x2a, 0x32, 0x00, 0x92, 0xdc, 0x2d, 0x1e, 0x4e, 0xaa, 0xff, 0x2f, 0xc2, 0x8e, 0xcf, 0x90, 0x71, 0x54, 0x45, 0x17, 0x5e, 0x43, 0x9c, 0xe4, 0xc0, 0xff, 0xf9, 0x5a, 0xfd, 0xae, 0xfb, 0x68, 0xd6, 0x5a, 0x93, 0x0d, 0xdf, 0x96, 0x16, 0x1b, 0x33, 0x65, 0x90, 0x3b, 0x65, 0x57, 0x5c, 0x31, 0xba, 0xf5, 0xf1, 0x61, 0x95, 0x5f, 0xff, 0x92, 0x32, 0x34, 0xbb, 0xf3, 0x97, 0xb2, 0x76, 0x5b, 0xc8, 0x1f, 0x75, 0xd5, 0x3b, 0x67, 0xfd, 0x5c, 0x8b, 0x06, 0xad, 0xe3, 0x70, 0x28, 0x11, 0x99, 0xef, 0x0f, 0x73, 0x6a, 0xce, 0xb6, 0xf4, 0xc9, 0x4b, 0xb4, 0xdc, 0xad, 0x0e, 0x62, 0x2f, 0xd9, 0x5b, 0x40, 0x81, 0x61, 0x8c, 0x95, 0x0a, 0x6a, 0xbf, 0x56, 0xfd, 0x31, 0xcc, 0x49, 0x16, 0x4f, 0x7a, 0x6a, 0x72, 0x3b, 0xf2, 0x8e, 0xa4, 0x10, 0x73, 0x46, 0x05, 0x90, 0x48, 0x06, 0x4b, 0x69, 0xf7, 0x87, 0x5e, 0xb8, 0xbc, 0x69, 0x67, 0xcc, 0x35, 0x1d, 0x29, 0x2c, 0x5f, 0x02, 0x94, 0xdb, 0xc1, 0xce, 0x97, 0xda, 0xe7, 0x30, 0x37, 0xef, 0x12, 0xb4, 0xde, 0xa5, 0x2e, 0xe6, 0xf5, 0x94, 0x04, 0xba, 0xb4, 0xe2, 0xb1, 0x2b, 0x39, 0x0a, 0x57, 0x23, 0xd8, 0xdc, 0x12, 0x9b, 0xb3, 0xc6, 0x2e, 0x03, 0x8a, 0x51, 0x97, 0xe4, 0xd4, 0xee, 0x90, 0xc4, 0x0e, 0xf3, 0xa8, 0x4a, 0x53, 0xe1, 0xea, 0xa2, 0x2d, 0xe8, 0x55, 0x23, 0xab, 0xad, 0x8c, 0x2f, 0xb3, 0x4a, 0xce, 0x5b, 0x9a, 0x96, 0x27, 0xd0, 0xf2, 0xa8, 0xe8, 0xf2, 0xa3, 0x96, 0x56, 0x3f, 0x3e, 0x82, 0x9f, 0x79, 0x8d, 0xd8, 0x12, 0x07, 0x6f, 0xd1, 0x8e, 0x99, 0xe2, 0x3c, 0x3b, 0x0b, 0x62, 0x7d, 0x79, 0x8c, 0x72, 0xd6, 0x16, 0xff, 0x78, 0xe5, 0xc4, 0xa1, 0xcd, 0x6e, 0xca, 0xec, 0x15, 0x5b, 0xf9, 0xbc, 0xcc, 0x01, 0xe2, 0xb1, 0x22, 0xa5, 0x46, 0xd4, 0x09, 0x3f, 0xce, 0x7d, 0x8c, 0x7d, 0xfc, 0x74, 0x62, 0x0b, 0x62, 0x56, 0xc3, 0x12, 0x12, 0x3a, 0x7a, 0xff, 0x55, 0x95, 0x3c, 0x85, 0xa0, 0x5b, 0x38, 0xe5, 0xc3, 0x67, 0xef, 0x6d, 0x64, 0x1d, 0x46, 0x3e, 0xac, 0x4e, 0xd9, 0x53, 0x40, 0x5b, 0x93, 0xbf, 0x73, 0x9e, 0x7c, 0x36, 0xba, 0x05, 0xd1, 0xcf, 0x60, 0x00, 0x5a, 0x08, 0x7a, 0x9e, 0xf8, 0x0b, 0x1e, 0xf3, 0x7e, 0x30, 0xd0, 0xbc, 0xc1, 0xc2, 0x3d, 0x46, 0xf3, 0x06, 0x2c, 0x8b, 0x2c, 0x79, 0xb1, 0x9e, 0x4a, 0x5a, 0xa3, 0x4a, 0xfb, 0x68, 0x51, 0xf6, 0x18, 0xed, 0x71, 0xcc, 0x35, 0xfb, 0x59, 0x1b, 0x76, 0xf6, 0x72, 0xf9, 0xa4, 0x52, 0xe9, 0x2c, 0x7f, 0x9e, 0xa7, 0x4b, 0x56, 0xc2, 0x84, 0x20, 0xd6, 0x85, 0xb7, 0x51, 0x20, 0x52, 0x91, 0x3f, 0x1e, 0x3b, 0x6c, 0x2f, 0x16, 0x3e, 0xde, 0xa8, 0x7f, 0xc7, 0x32, 0x1b, 0x14, 0x77, 0x18, 0xca, 0x28, 0x24, 0x9b, 0xe2, 0x39, 0x21, 0x54, 0xea, 0xc7, 0xbf, 0xdd, 0x61, 0x66, 0x13, 0x89, 0xa3, 0x13, 0xfa, 0x52, 0x0d, 0xc4, 0x5b, 0x13, 0x61, 0x43, 0xac, 0xf8, 0x6c, 0x3b, 0xb8, 0x32, 0xe6, 0x93, 0x9f, 0xef, 0x99, 0xfc, 0x1e, 0x89, 0xc6, 0xc6, 0x10, 0xfd, 0xc4, 0xf8, 0x35, 0xa0, 0xea, 0x9f, 0x33, 0x0d, 0xaf, 0x66, 0xda, 0x62, 0x10, 0x67, 0xac, 0xac, 0x32, 0x41, 0x9d, 0x9f, 0x49, 0x6b, 0x17, 0x8b, 0xb8, 0xc8, 0x41, 0x8b, 0x7a, 0x7b, 0x81, 0x00, 0xc0, 0xfc, 0x40, 0x3d, 0xdb, 0x6b, 0xed, 0x84, 0x5d, 0x25, 0x44, 0x32, 0x7b, 0x96, 0xd0, 0x36, 0xb6, 0x4e, 0xae, 0xc7, 0xbb, 0x56, 0x95, 0x57, 0x87, 0xc4, 0x13, 0xc2, 0xce, 0x8d, 0x19, 0xcc, 0x9e, 0x9b, 0xba, 0xca, 0x40, 0x1f, 0x30, 0x9f, 0x5f, 0x29, 0x20, 0xea, 0x6b, 0x76, 0x1f, 0x7e, 0x40, 0x88, 0x74, 0x13, 0x03, 0xfc, 0x1f, 0x3b, 0x4d, 0x19, 0x1b, 0x97, 0x8c, 0xa5, 0xe1, 0x4a, 0xa6, 0xfc, 0x2d, 0xae, 0xdf, 0x63, 0x04, 0x46, 0xfc, 0x99, 0xf6, 0xf4, 0xa8, 0xaf, 0xa1, 0x6c, 0x18, 0x1a, 0x76, 0xe9, 0xeb, 0x07, 0xc0, 0x1f, 0x54, 0xee, 0xe1, 0x70, 0x7a, 0x6a, 0xdf, 0x62, 0x1f, 0x48, 0x20, 0x51, 0x80, 0xdd, 0x72, 0x61, 0x7d, 0x9d, 0x4f, 0xb7, 0xfa, 0xea, 0x5e, 0xe9, 0x85, 0x2a, 0x3c, 0xb2, 0x39, 0x1c, 0x7d, 0xeb, 0xe2, 0x6c, 0xee, 0xb6, 0x62, 0x85, 0x1d, 0xfd, 0x53, 0xa6, 0x1c, 0x1b, 0xed, 0x38, 0x81, 0xd8, 0x2a, 0x5f, 0xb1, 0x9b, 0x29, 0xcf, 0x5f, 0xdb, 0xd0, 0xe1, 0x4f, 0xd7, 0xb6, 0xe5, 0x60, 0x87, 0x40, 0xba, 0xc9, 0xd2, 0x0a, 0x9d, 0xa3, 0x01, 0x88, 0x3f, 0xa8, 0x74, 0xed, 0x1a, 0x3a, 0x93, 0x4b, 0x04, 0xa7, 0x08, 0xfc, 0x05, 0xab, 0x2c, 0x42, 0x66, 0x36, 0xbe, 0x2a, 0x0a, 0x70, 0xdb, 0xb6, 0x02, 0xfa, 0x2a, 0x3a, 0x5b, 0x77, 0x58, 0x07, 0x3a, 0x4c, 0xc4, 0x47, 0x2c, 0xa3, 0x7b, 0x28, 0xb7, 0xb6, 0x66, 0x3d, 0x35, 0x4a, 0xc2, 0x21, 0xe2, 0x79, 0xd1, 0x5d, 0x33, 0xb5, 0xcf, 0x8b, 0x69, 0x0a, 0x28, 0xbc, 0x67, 0xa3, 0xe8, 0x18, 0xc0, 0x90, 0x73, 0xc4, 0x15, 0xc7, 0x76, 0x09, 0x9e, 0x68, 0x1d, 0xb2, 0x06, 0x45, 0x87, 0xb5, 0x7c, 0xa1, 0x77, 0x16, 0x07, 0x38, 0x4c, 0x09, 0x19, 0x80, 0x33, 0x57, 0x68, 0x2f, 0x9b, 0x02, 0xf9, 0xfd, 0xe9, 0x2c, 0x7d, 0xab, 0x6d, 0x35, 0xe1, 0x44, 0x95, 0x24, 0x21, 0xa3, 0x61, 0x48, 0x5d, 0x35, 0x17, 0x1f, 0x2e, 0x00, 0x38, 0x76, 0x3a, 0xe4, 0xb2, 0xd2, 0x06, 0x21, 0x57, 0x0f, 0x0c, 0x1a, 0x8e, 0x47, 0x0e, 0x59, 0x49, 0xf5, 0xa9, 0xd2, 0x37, 0x5a, 0x2d, 0x6c, 0x3a, 0x20, 0xac, 0xbd, 0x1b, 0x3e, 0x51, 0x15, 0x7d, 0x1b, 0xf3, 0xbf, 0x0f, 0xf6, 0xea, 0x83, 0x06, 0x85, 0x22, 0x6f, 0xcb, 0xdc, 0x6e, 0xd8, 0xf0, 0x91, 0x1e, 0x9b, 0x69, 0x1e, 0xd3, 0xa8, 0xf9, 0x86, 0x92, 0xc2, 0xea, 0x3c, 0x18, 0x80, 0x01, 0x40, 0x6d, 0x98, 0xb1, 0x8b, 0xbc, 0x5c, 0x8f, 0xad, 0x62, 0x85, 0x06, 0xb5, 0x45, 0x30, 0x4c, 0x51, 0x67, 0x26, 0x94, 0x36, 0xbb, 0x60, 0x86, 0xc2, 0x37, 0xcb, 0xec, 0xe0, 0x2a, 0x48, 0xae, 0x2d, 0xd0, 0xf7, 0x00, 0x59, 0x23, 0xb5, 0xda, 0xcf, 0xf5, 0xe3, 0xa8, 0x98, 0x3c, 0x6a, 0x44, 0x7c, 0xad, 0xfb, 0x21, 0x6b, 0x8c, 0x9c, 0xc9, 0x1c, 0xc2, 0x60, 0x89, 0xf4, 0x30, 0x75, 0x6a, 0x29, 0x43, 0x64, 0x64, 0x27, 0xc8, 0x95, 0xcf, 0x33, 0x02, 0x12, 0x1a, 0x4e, 0xfa, 0x8c, 0xbf, 0x5c, 0x17, 0xa3, 0x76, 0x85, 0xee, 0x62, 0xaa, 0xdc, 0x5b, 0x09, 0x29, 0x3e, 0xd1, 0x10, 0x1f, 0x7d, 0xee, 0x68, 0x45, 0xbe, 0x53, 0x04, 0x56, 0x20, 0xb2, 0x98, 0xc3, 0x9f, 0x28, 0xa1, 0xa7, 0x37, 0xce, 0xa5, 0xfd, 0x4c, 0x8b, 0xbc, 0x11, 0x49, 0x2c, 0x4f, 0x34, 0x88, 0xb6, 0x20, 0xb4, 0x72, 0xfa, 0x8a, 0x0b, 0xe7, 0x6b, 0x0b, 0x57, 0xe0, 0x2d, 0xff, 0x0a, 0x52, 0x6e, 0xae, 0xe3, 0x56, 0xf9, 0x89, 0x1d, 0x88, 0x08, 0xb1, 0xe6, 0xac, 0x5a, 0xb9, 0x12, 0x98, 0x86, 0xad, 0x11, 0x4e, 0x8f, 0x53, 0x1e, 0x68, 0xb8, 0xb0, 0xba, 0xb9, 0x9a, 0xce, 0x59, 0x31, 0x73, 0xbd, 0x5b, 0x01, 0xc1, 0xd8, 0x3d, 0x00, 0x10, 0x49, 0x11, 0x4d, 0x10, 0xd0, 0x2b, 0x36, 0xea, 0xc0, 0x1e, 0x59, 0xd4, 0x4a, 0xe7, 0x09, 0xe4, 0xfd, 0x67, 0xf4, 0x21, 0x8e, 0x17, 0x02, 0xe0, 0xd5, 0xf7, 0x80, 0x4e, 0x19, 0xc7, 0x7d, 0x49, 0x8d, 0x7a, 0x74, 0x74, 0x1a, 0xe8, 0x2c, 0x8a, 0x5f, 0xc3, 0xdd, 0xf2, 0xf7, 0xcc, 0x94, 0x94, 0xfa, 0x46, 0xd8, 0xec, 0xc6, 0xab, 0x8e, 0x5c, 0xff, 0x9f, 0x1a, 0xc7, 0xd4, 0x22, 0xc7, 0x5b, 0x84, 0x09, 0x69, 0xae, 0x21, 0xaf, 0x41, 0x0d, 0x95, 0xe8, 0x20, 0x11, 0xe2, 0x36, 0xcf, 0x72, 0xae, 0x40, 0xaf, 0x20, 0xfe, 0x7f, 0x9d, 0x90, 0x42, 0x3b, 0x18, 0x54, 0x92, 0xb6, 0xa6, 0xef, 0x37, 0xa7, 0x73, 0xe7, 0x6d, 0xe9, 0x3c, 0x1c, 0x67, 0x75, 0x6b, 0x57, 0x94, 0x8e, 0x84, 0x26, 0x21, 0x3b, 0xbf, 0xe8, 0xbf, 0xfa, 0xf7, 0x24, 0xa6, 0xb3, 0xc2, 0x1f, 0xd9, 0xeb, 0xe2, 0xad, 0xac, 0x3a, 0xdc, 0x47, 0x84, 0xff, 0xe6, 0x5e, 0xdf, 0x52, 0x06, 0xef, 0x94, 0x3a, 0x79, 0x58, 0x5b, 0x20, 0x52, 0x6a, 0x8f, 0x84, 0x63, 0xbf, 0x33, 0xef, 0x60, 0x4d, 0x34, 0x29, 0x42, 0x3c, 0xed, 0xab, 0xea, 0xf5, 0xf0, 0x57, 0x07, 0x7c, 0x04, 0x67, 0x39, 0xff, 0x6a, 0xa4, 0x77, 0xaf, 0x65, 0xd8, 0xae, 0xce, 0xf9, 0x85, 0xaa, 0x09, 0xf2, 0xd7, 0x3a, 0x09, 0x28, 0xd8, 0x8f, 0x45, 0x02, 0xe3, 0xe6, 0x1a, 0x39, 0x5b, 0x67, 0x1d, 0xde, 0x9c, 0x4c, 0xb0, 0x9f, 0x32, 0x45, 0xd3, 0x46, 0x4a, 0x1b, 0x3d, 0x82, 0x65, 0x94, 0xac, 0xea, 0x54, 0x98, 0x79, 0x3f, 0x60, 0x91, 0x6f, 0xf1, 0xc9, 0x18, 0xdd, 0xe5, 0x72, 0xcd, 0xea, 0x76, 0xda, 0x86, 0x29, 0xba, 0x4e, 0xad, 0x6d, 0x06, 0x5d, 0xe3, 0xdf, 0xb4, 0x8d, 0xe9, 0x4d, 0x23, 0x4c, 0xc1, 0xc5, 0x00, 0x29, 0x10, 0x63, 0xc4, 0x44, 0xc7, 0x67, 0x7e, 0x03, 0x02, 0x8a, 0xd3, 0x07, 0x31, 0x93, 0x43, 0x5f, 0x75, 0x25, 0xae, 0xfb, 0x4d, 0xdb, 0x16, 0x63, 0x71, 0x97, 0xa6, 0xa9, 0xfe, 0x16, 0xf3, 0x9b, 0xd4, 0xc8, 0x83, 0x3e, 0x3c, 0xdf, 0x8c, 0x78, 0xcf, 0xa6, 0xfd, 0x0d, 0x93, 0x15, 0xc2, 0xcd, 0x66, 0xa2, 0x44, 0x0b, 0xa0, 0x59, 0x30, 0x50, 0xf4, 0x2f, 0x7a, 0x51, 0x97, 0x94, 0xa1, 0x1f, 0xa4, 0x47, 0x34, 0x9e, 0xc0, 0x6e, 0x95, 0x38, 0xfa, 0xe6, 0xfd, 0xd2, 0xf4, 0xd8, 0xc0, 0xff, 0x48, 0x8d, 0xd3, 0x74, 0x25, 0x83, 0x8b, 0xbd, 0x39, 0xc0, 0xa7, 0x2e, 0xd4, 0x66, 0x91, 0x1b, 0x4a, 0x88, 0xe1, 0x4c, 0x99, 0x3c, 0x23, 0xab, 0x4b, 0xf1, 0xda, 0x40, 0x9e, 0x03, 0xc5, 0x5f, 0xe3, 0x8d, 0x60, 0x20, 0x24, 0x7f, 0xae, 0x10, 0x09, 0xf0, 0x36, 0x26, 0xfc, 0xb5, 0x4b, 0xf9, 0x8c, 0x32, 0x91, 0x2f, 0x0f, 0x70, 0xbd, 0x39, 0x8c, 0x70, 0x9c, 0x3e, 0xd8, 0xbf, 0x57, 0x54, 0xfe, 0x4b, 0xf5, 0xf6, 0xe4, 0x75, 0x21, 0xb3, 0x2c, 0x67, 0x2e, 0x23, 0x59, 0xa8, 0x58, 0x1f, 0x33, 0xed, 0x4d, 0x31, 0x6c, 0x33, 0xec, 0x4a, 0x83, 0x0a, 0x4c, 0xb3, 0xe9, 0x34, 0x00, 0x46, 0x63, 0x6e, 0x99, 0xde, 0xaf, 0x8e, 0x6d, 0x0c, 0x6a, 0xce, 0x97, 0x0c, 0x31, 0x68, 0x3f, 0xf7, 0x07, 0x63, 0x1c, 0x39, 0xf6, 0xac, 0x36, 0x46, 0xf9, 0x68, 0xf1, 0x89, 0x1a, 0x89, 0x47, 0x9d, 0xd8, 0x9f, 0x55, 0xc0, 0xcb, 0xf1, 0x19, 0x85, 0x8b, 0xcd, 0x7a, 0xc9, 0xcd, 0x1c, 0x88, 0xe7, 0xcf, 0x39, 0x06, 0x30, 0xf7, 0x04, 0x26, 0x95, 0xb7, 0x32, 0x93, 0xa7, 0xb3, 0xe7, 0xb4, 0xc2, 0x26, 0x86, 0x30, 0x84, 0x81, 0xc8, 0xad, 0x84, 0x56, 0x0b, 0xde, 0x41, 0x75, 0xed, 0xbc, 0x59, 0x55, 0x1a, 0x13, 0xfc, 0xb5, 0x62, 0x41, 0x9f, 0x82, 0x0f, 0x3a, 0xf5, 0xfc, 0x75, 0xd0, 0x1b, 0x15, 0xca, 0x32, 0x13, 0x19, 0x38, 0xb2, 0x73, 0x94, 0x31, 0xcb, 0x5e, 0x71, 0x03, 0x62, 0xb4, 0x5f, 0xac, 0x4c, 0x86, 0x79, 0xef, 0x11, 0xcd, 0x25, 0xa7, 0xef, 0x5b, 0x3c, 0x5c, 0x22, 0x11, 0x6c, 0x14, 0x63, 0x53, 0xdb, 0x6b, 0xaf, 0xb9, 0x0d, 0xe6, 0x49, 0x07, 0x08, 0x85, 0x02, 0x60, 0xb6, 0x97, 0xb8, 0xb6, 0x8a, 0xd2, 0x1d, 0x85, 0x66, 0xa3, 0xb9, 0xc1, 0xbd, 0xc3, 0x33, 0x0d, 0xf5, 0x0b, 0xcc, 0x2d, 0x0f, 0x89, 0x2c, 0xbe, 0x89, 0xd3, 0x61, 0x24, 0x83, 0x9b, 0x25, 0xc5, 0x22, 0x84, 0x5f, 0x75, 0x32, 0x34, 0xed, 0x30, 0x0f, 0xab, 0xa1, 0x0f, 0xc5, 0xd3, 0x89, 0x75, 0x76, 0x58, 0x74, 0x89, 0xfc, 0xb9, 0xb1, 0xea, 0xd0, 0xa0, 0x1a, 0x9e, 0x2a, 0x6f, 0x52, 0x4b, 0x6a, 0x1b, 0x4a, 0xa9, 0xb7, 0x3d, 0x0a, 0x37, 0xe6, 0x66, 0xae, 0x2d, 0x9d, 0xb3, 0xae, 0xb2, 0xb8, 0xa2, 0x63, 0x50, 0xeb, 0x24, 0xc7, 0xa5, 0xa9, 0xf4, 0x7d, 0x5b, 0x45, 0x26, 0x11, 0x5a, 0x58, 0x03, 0x80, 0x3b, 0x62, 0x14, 0xfb, 0x00, 0xb4, 0x7d, 0xe8, 0x03, 0x8d, 0x8d, 0x2a, 0x2d, 0x83, 0x92, 0xa2, 0x68, 0x24, 0xf2, 0xf5, 0x57, 0xde, 0x77, 0x90, 0x44, 0x1c, 0xeb, 0xea, 0x5a, 0xb2, 0xe5, 0x09, 0x14, 0x7b, 0xe2, 0x48, 0xf5, 0x40, 0x97, 0x57, 0x7a, 0xdc, 0x86, 0x83, 0x4d, 0x9e, 0xd0, 0x38, 0xbb, 0xef, 0x4a, 0xc4, 0x68, 0x35, 0xd2, 0x5d, 0x41, 0xf7, 0xe4, 0x66, 0xb3, 0x41, 0x68, 0xee, 0x1a, 0x4a, 0xce, 0x7a, 0x7d, 0x54, 0x5d, 0x04, 0x78, 0xd4, 0xc8, 0x43, 0x79, 0xd3, 0x03, 0x2d, 0x30, 0x94, 0x54, 0xbb, 0x40, 0x77, 0xad, 0xec, 0x3b, 0x1d, 0x39, 0x0c, 0xcd, 0xcd, 0x35, 0x36, 0x37, 0x16, 0x01, 0x18, 0xff, 0xb6, 0x77, 0xf6, 0xe6, 0xbb, 0x7b, 0xf1, 0x1b, 0xe8, 0xd3, 0x8a, 0xae, 0x5a, 0x3a, 0x62, 0x47, 0x6c, 0xaf, 0x43, 0x18, 0xd7, 0x13, 0x64, 0x10, 0x1e, 0xf3, 0xe9, 0x52, 0x29, 0xa3, 0xaa, 0xe5, 0x2f, 0x8c, 0x35, 0xad, 0xda, 0xc6, 0x16, 0x9a, 0xa6, 0xea, 0x56, 0x1f, 0x8b, 0x21, 0x41, 0xe6, 0xdb, 0x81, 0x6c, 0xc2, 0x6d, 0x9a, 0xf7, 0xe5, 0xfb, 0x4b, 0x10, 0x53, 0xc9, 0xdb, 0xb8, 0x96, 0x87, 0x44, 0xca, 0xb3, 0x79, 0xd2, 0x39, 0x5e, 0xd5, 0xed, 0x99, 0x6a, 0x6d, 0x33, 0xe1, 0x83, 0x8d, 0xcb, 0x6f, 0x1f, 0x27, 0xf5, 0x4c, 0xb2, 0x2d, 0xe5, 0xb2, 0x21, 0x3f, 0xd1, 0xcb, 0x7a, 0x86, 0x49, 0xbc, 0xe2, 0xe0, 0xc7, 0xe2, 0xcf, 0x3d, 0x87, 0x5b, 0x77, 0x49, 0x98, 0xc9, 0x88, 0x4b, 0x34, 0x52, 0x19, 0x4c, 0x4d, 0xec, 0xe0, 0x7d, 0x68, 0xd7, 0xa6, 0xd3, 0xae, 0x6a, 0xf9, 0xf4, 0x40, 0x13, 0x21, 0x56, 0xcc, 0x9a, 0x55, 0xa5, 0x5e, 0xa5, 0x2e, 0x66, 0x78, 0x81, 0x5b, 0xdb, 0x64, 0x1f, 0x97, 0x26, 0xc9, 0x5d, 0xd8, 0xb0, 0x7d, 0x87, 0xc9, 0xcc, 0x9a, 0x1e, 0x7b, 0x98, 0xd4, 0xd8, 0x57, 0x24, 0x09, 0xe7, 0x58, 0xd7, 0x1a, 0x7e, 0x77, 0x0e, 0xfa, 0x92, 0x66, 0x05, 0x04, 0xde, 0x80, 0xfb, 0x92, 0x29, 0x01, 0x91, 0xcb, 0xcb, 0x72, 0x74, 0xbc, 0x6e, 0x68, 0x3b, 0xab, 0x12, 0x6e, 0x93, 0xa7, 0x54, 0x40, 0x99, 0x64, 0xef, 0x3a, 0x87, 0x46, 0x83, 0x0f, 0x93, 0xbc, 0x95, 0xbe, 0x14, 0xcf, 0xd7, 0xc2, 0xe7, 0xfb, 0xaa, 0x89, 0x11, 0x3d, 0xe2, 0x28, 0xa5, 0x6d, 0xc9, 0x4d, 0xe9, 0xce, 0x66, 0x75, 0xb4, 0xe4, 0xff, 0x5f, 0x1a, 0x85, 0xdc, 0xc0, 0x4b, 0x33, 0x4e, 0x38, 0xb9, 0xa9, 0xf0, 0x85, 0x79, 0xb4, 0x2d, 0xf7, 0xec, 0x44, 0x02, 0x23, 0x9e, 0xc3, 0x05, 0xdc, 0x6e, 0xa5, 0xa7, 0x5f, 0xf0, 0x41, 0xb6, 0xce, 0x0f, 0xdf, 0x26, 0xe0, 0xf7, 0x12, 0x10, 0xd6, 0x32, 0x48, 0xfb, 0xb1, 0x10, 0x9f, 0x5b, 0xa2, 0x4d, 0xfa, 0x57, 0xc2, 0xee, 0x55, 0xcf, 0x03, 0x6c, 0x55, 0x9e, 0x66, 0x14, 0x23, 0x1c, 0x6f, 0xae, 0x7b, 0xe7, 0xd7, 0x5d, 0x00, 0xe4, 0x80, 0xc6, 0xd3, 0x80, 0xae, 0x74, 0x63, 0x3c, 0x73, 0x7b, 0x87, 0x68, 0x6b, 0x5c, 0xca, 0x2e, 0xaa, 0x29, 0x05, 0xd3, 0xf3, 0xea, 0x34, 0x3a, 0x2a, 0x3e, 0x82, 0xaa, 0x0c, 0x46, 0xa6, 0xd0, 0x1e, 0xbe, 0x72, 0x08, 0xe3, 0x6d, 0xa9, 0xd8, 0x52, 0xc0, 0x12, 0xbd, 0x87, 0xb2, 0xca, 0x2b, 0xb9, 0xee, 0xde, 0xcf, 0x6c, 0x38, 0x19, 0x17, 0xe8, 0x09, 0x1b, 0xf4, 0xe9, 0x79, 0xab, 0xdf, 0x98, 0x62, 0x4f, 0x1a, 0xba, 0xc3, 0x19, 0x38, 0x28, 0x62, 0xc3, 0xdf, 0x7f, 0xb6, 0xff, 0xcd, 0x18, 0x03, 0x08, 0x19, 0x3b, 0xc7, 0x7d, 0xbb, 0x8f, 0x55, 0x6f, 0x4f, 0xd5, 0xc0, 0xb9, 0x16, 0xd6, 0xfa, 0x8f, 0x3e, 0x9a, 0x3d, 0x5a, 0x63, 0xdb, 0xaa, 0xc3, 0x55, 0xb9, 0x31, 0x0e, 0x1c, 0xb0, 0xb0, 0xaa, 0x39, 0xc6, 0x5f, 0x06, 0x2f, 0x09, 0x6b, 0xa6, 0x42, 0x38, 0xe1, 0x75, 0x7f, 0xc1, 0xce, 0x5d, 0xfc, 0xeb, 0xa5, 0x15, 0x61, 0x55, 0xe0, 0x3a, 0xa7, 0x9f, 0xea, 0xa2, 0x20, 0x67, 0x3d, 0xed, 0xb8, 0x77, 0xc7, 0x5c, 0x7a, 0x3c, 0x93, 0xe7, 0x56, 0x7b, 0xa5, 0x89, 0x21, 0x3f, 0x26, 0xdf, 0xdd, 0x16, 0xc1, 0xf1, 0x3b, 0x7c, 0x4c, 0x50, 0x5e, 0x98, 0xab, 0x61, 0xe2, 0x26, 0xf1, 0xf8, 0x1d, 0xb5, 0xc9, 0x28, 0xa4, 0x12, 0x15, 0x5a, 0x11, 0x04, 0xd4, 0x9d, 0x04, 0x39, 0x49, 0x3d, 0x68, 0x81, 0x5a, 0x97, 0xf8, 0x3a, 0x36, 0x2b, 0x01, 0x0b, 0x3a, 0xf3, 0x69, 0xd6, 0x16, 0xf4, 0xf0, 0xe7, 0x2b, 0x12, 0xb6, 0x72, 0x38, 0x28, 0xfe, 0x3c, 0x36, 0x58, 0x31, 0x98, 0x80, 0xa0, 0x26, 0x95, 0x37, 0xae, 0xa0, 0x76, 0xe5, 0xf6, 0x18, 0x62, 0x60, 0x01, 0xbd, 0x5d, 0xf2, 0x08, 0xba, 0x77, 0xb6, 0xc1, 0xb7, 0x43, 0x45, 0x79, 0xa2, 0x8b, 0x92, 0x63, 0xaf, 0x42, 0x13, 0x30, 0x9d, 0xba, 0x22, 0xdf, 0x3c, 0x18, 0xa2, 0xd7, 0x2c, 0x04, 0xe5, 0x33, 0xe7, 0xa5, 0xcd, 0x5d, 0x01, 0xcc, 0x32, 0xde, 0xaf, 0x6f, 0x84, 0x74, 0x87, 0x5a, 0xb2, 0x65, 0x86, 0x21, 0x4a, 0x14, 0x57, 0x59, 0xe1, 0xd2, 0xd2, 0x07, 0xb5, 0xf6, 0xc4, 0x59, 0x91, 0x30, 0xee, 0x94, 0xf1, 0x1a, 0x50, 0x4e, 0x67, 0x10, 0xa7, 0xdd, 0x3d, 0x42, 0x34, 0x0f, 0x5c, 0x07, 0xbf, 0x1c, 0x6c, 0x75, 0xdc, 0xd8, 0x3d, 0x2e, 0x6d, 0x2d, 0x66, 0x7c, 0x68, 0xc9, 0x2c, 0xa1, 0xda, 0x14, 0xa5, 0x68, 0x2c, 0x65, 0x1d, 0x00, 0xa5, 0x75, 0xb8, 0x0a, 0x31, 0x14, 0x59, 0xf1, 0x61, 0x1a, 0xc3, 0x7a, 0xb2, 0xa1, 0xfe, 0x9c, 0x12, 0x71, 0xfd, 0x91, 0xa0, 0xbc, 0x7d, 0x2d, 0xb4, 0x0c, 0x30, 0x6f, 0x1f, 0x79, 0x1b, 0x56, 0xb4, 0x1f, 0x3c, 0xf5, 0x07, 0xcf, 0x71, 0xca, 0x74, 0x05, 0x95, 0x4c, 0x63, 0x1a, 0xec, 0xc3, 0xcb, 0xbb, 0xc1, 0x5c, 0xf5, 0x9a, 0x4d, 0x7d, 0x83, 0x63, 0xdb, 0x56, 0xb0, 0xf2, 0x2a, 0xb9, 0xd9, 0xc3, 0x13, 0x2b, 0x3d, 0xaa, 0x6b, 0x3b, 0x01, 0xc4, 0x2b, 0x12, 0x77, 0xad, 0xce, 0x4c, 0x9f, 0xf3, 0xfb, 0x06, 0xee, 0xcb, 0x64, 0x38, 0x4f, 0x03, 0xee, 0x46, 0x68, 0x38, 0x12, 0xd1, 0x1e, 0x49, 0x83, 0xd3, 0x5b, 0x0b, 0x11, 0xeb, 0x0e, 0x3f, 0xcd, 0xf5, 0x74, 0xc1, 0x6e, 0xde, 0x97, 0x02, 0xf3, 0xb6, 0x14, 0xb7, 0x8a, 0x07, 0x20, 0xd3, 0xb1, 0x66, 0xcd, 0xb3, 0x9b, 0x47, 0x8a, 0x99, 0xd5, 0x16, 0xe9, 0x5c, 0x29, 0x83, 0xa6, 0x5e, 0xc3, 0x1d, 0xe4, 0xbd, 0x92, 0x22, 0xb9, 0xce, 0xf1, 0x95, 0xed, 0xc7, 0x87, 0x92, 0xff, 0xbb, 0x6b, 0xdf, 0x69, 0xcc, 0x8c, 0xc3, 0x25, 0x9c, 0x51, 0x1b, 0x70, 0x04, 0x7c, 0xaa, 0xce, 0x09, 0x54, 0xb1, 0x4e, 0x0b, 0x03, 0xbf, 0x0f, 0x40, 0x3d, 0xcb, 0x03, 0x61, 0x22, 0x80, 0xf3, 0xa3, 0x66, 0xd8, 0xc4, 0xe9, 0xaf, 0xec, 0xf8, 0x38, 0x3e, 0x0b, 0x78, 0x6b, 0xd2, 0x09, 0x90, 0x28, 0xc9, 0xd9, 0x3b, 0x12, 0x89, 0x5e, 0xa1, 0x40, 0x1e, 0x7f, 0xde, 0xef, 0x24, 0x7a, 0x05, 0x73, 0xe8, 0x7a, 0x64, 0x74, 0xca, 0x6b, 0x0a, 0x56, 0xe6, 0x0d, 0x87, 0xf9, 0xf3, 0x47, 0xf3, 0xa3, 0x6a, 0xbf, 0x32, 0x3a, 0xeb, 0xa7, 0x75, 0xb7, 0xde, 0xda, 0x04, 0xd7, 0x56, 0x27, 0x3c, 0x13, 0x3a, 0xec, 0xd3, 0xd3, 0xa6, 0xe7, 0x64, 0xdf, 0x8f, 0x4a, 0x27, 0x16, 0xa6, 0x0d, 0xff, 0x62, 0x7f, 0x88, 0xbb, 0xeb, 0xf3, 0x41, 0x95, 0x8b, 0xc3, 0x03, 0xff, 0x83, 0x7d, 0x30, 0xa0, 0x6c, 0xa4, 0x57, 0x99, 0x70, 0x0b, 0x09, 0x0c, 0xb9, 0x82, 0xe9, 0xdf, 0x2a, 0xb4, 0x03, 0xbd, 0x4d, 0x50, 0x5f, 0x5e, 0x8d, 0x67, 0xd5, 0x09, 0xa6, 0x16, 0x22, 0x57, 0x59, 0x64, 0x3c, 0x39, 0x64, 0x6d, 0xe3, 0x3c, 0xb1, 0xc1, 0x79, 0x0c, 0xce, 0x07, 0x13, 0x37, 0x9d, 0xe6, 0xd0, 0x34, 0x4d, 0x25, 0x6a, 0xa4, 0x88, 0x10, 0x0a, 0xd7, 0xee, 0x1e, 0x61, 0x92, 0xc3, 0xd2, 0xf4, 0x10, 0xe4, 0xdf, 0xb7, 0x46, 0x00, 0x8f, 0xde, 0x6c, 0x04, 0x65, 0xf0, 0xb8, 0xd7, 0x02, 0x1d, 0x6d, 0x48, 0x45, 0xd1, 0x14, 0x45, 0xb6, 0x89, 0x09, 0x4d, 0x25, 0xe6, 0x3a, 0x27, 0x8e, 0xff, 0x2c, 0xd5, 0x40, 0xfc, 0x3f, 0xc4, 0x3e, 0xe1, 0x32, 0x45, 0xe6, 0xa7, 0xe9, 0x41, 0xd0, 0x91, 0x6e, 0x27, 0xf9, 0xbd, 0x37, 0x2a, 0x21, 0xfa, 0xa7, 0xaa, 0x71, 0xd9, 0xd6, 0xef, 0x61, 0x07, 0x95, 0x1d, 0xd9, 0xd9, 0xad, 0x64, 0x96, 0x29, 0x68, 0x78, 0xd0, 0x61, 0x53, 0x41, 0x1a, 0xd5, 0x41, 0xd3, 0x89, 0x56, 0x93, 0xa0, 0x18, 0x03, 0xb7, 0xec, 0x4b, 0x63, 0xef, 0x82, 0x13, 0xb1, 0x54, 0xa6, 0xf2, 0x77, 0x1a, 0x4a, 0x5f, 0x5f, 0x15, 0x85, 0x6c, 0x45, 0x7c, 0x40, 0xa6, 0x90, 0xee, 0x33, 0x3d, 0xc3, 0xb2, 0x10, 0x65, 0x4f, 0x43, 0xfd, 0xfb, 0xac, 0x0c, 0x48, 0x6c, 0xa7, 0x70, 0x56, 0xd3, 0xfe, 0x0d, 0xdd, 0x61, 0x2a, 0x42, 0x53, 0x02, 0x7c, 0xee, 0xa7, 0x3d, 0x6b, 0x7b, 0x2e, 0x5c, 0x2d, 0x1c, 0xe0, 0xce, 0x84, 0x52, 0xc4, 0xc9, 0xdb, 0xb5, 0xa9, 0x34, 0x91, 0xf1, 0x17, 0xc3, 0x95, 0x0f, 0x85, 0x64, 0x33, 0xf6, 0xcc, 0xda, 0x2d, 0x31, 0xdc, 0xa7, 0x0e, 0xf2, 0xae, 0x30, 0xbb, 0x57, 0x7a, 0x1c, 0x4b, 0xed, 0x29, 0xfd, 0x18, 0x73, 0x0d, 0x32, 0x16, 0xe0, 0xd0, 0x0c, 0x64, 0xa7, 0xaa, 0x2f, 0x21, 0x39, 0xd7, 0x3b, 0x81, 0xcb, 0x49, 0xac, 0x20, 0x5a, 0x9a, 0xff, 0x96, 0xed, 0x44, 0x17, 0x4b, 0x1b, 0x14, 0xde, 0x8d, 0xcc, 0xdc, 0x2f, 0xdf, 0x44, 0x69, 0xf4, 0x94, 0x5d, 0xb4, 0x8b, 0x9d, 0x13, 0x5c, 0x6f, 0xa0, 0x46, 0x54, 0x14, 0x4a, 0xbc, 0xd9, 0x12, 0xe5, 0x66, 0xa8, 0x86, 0x2d, 0xe4, 0x6d, 0xb5, 0x5f, 0x4a, 0x7e, 0xf3, 0x94, 0x25, 0xc9, 0xc4, 0x4d, 0xb9, 0x0c, 0x40, 0x4f, 0x8d, 0x44, 0xbc, 0xb1, 0x2a, 0x67, 0xa6, 0x33, 0x1f, 0x55, 0xb1, 0xd1, 0x48, 0x0c, 0x32, 0x98, 0x50, 0x1c, 0xca, 0xb9, 0x75, 0x5c, 0x46, 0xdc, 0x8b, 0xda, 0xc3, 0xb6, 0x44, 0x18, 0x16, 0xde, 0xae, 0x75, 0x6b, 0xdc, 0xfd, 0xe9, 0x2b, 0x83, 0x8b, 0xf5, 0x24, 0x82, 0x1d, 0xda, 0xe4, 0x35, 0x68, 0x0a, 0x65, 0xc1, 0xd4, 0xdc, 0xf0, 0x5f, 0x7f, 0x83, 0x3b, 0xf8, 0x85, 0x41, 0xd5, 0xf3, 0x7f, 0xd8, 0xc3, 0x4b, 0x49, 0x42, 0x6c, 0xe4, 0x09, 0xa1, 0xb2, 0x1f, 0x6c, 0x79, 0x62, 0xac, 0x33, 0x1d, 0xce, 0x9f, 0xef, 0x67, 0xb8, 0xc6, 0x08, 0xac, 0x72, 0x3a, 0x04, 0xef, 0x44, 0x35, 0x06, 0x55, 0x0e, 0x23, 0x95, 0xd9, 0x2e, 0xfc, 0x9f, 0x41, 0xa4, 0xd0, 0xbe, 0x51, 0x74, 0xa4, 0xb9, 0x3e, 0x4c, 0x7c, 0x4e, 0x66, 0x67, 0xb9, 0x2f, 0x3d, 0xb1, 0xa5, 0x4a, 0x8b, 0x2c, 0x4d, 0x4d, 0xd5, 0x92, 0x8f, 0x6a, 0x18, 0x3c, 0x73, 0x58, 0xbe, 0x42, 0xbf, 0x9a, 0xca, 0xe4, 0xc5, 0x03, 0x56, 0x29, 0x80, 0x7a, 0x3f, 0xc5, 0xdf, 0xfb, 0x1f, 0x40, 0x61, 0xde, 0x7b, 0x55, 0xe2, 0x5c, 0x3e, 0x99, 0xb5, 0x4f, 0x66, 0x5d, 0xf2, 0x39, 0xfe, 0xd4, 0x11, 0x88, 0x4c, 0x79, 0xb8, 0x18, 0x4b, 0xab, 0xd2, 0xfa, 0x5c, 0x9a, 0xe1, 0x74, 0x38, 0x67, 0x95, 0x48, 0x29, 0x87, 0x9d, 0x39, 0x7a, 0x69, 0xbd, 0xcc, 0x2b, 0x58, 0x21, 0x4c, 0xea, 0xa2, 0xf1, 0x10, 0x3f, 0xfa, 0x25, 0x01, 0x07, 0x1b, 0x9b, 0x56, 0x23, 0xae, 0x66, 0xa2, 0x71, 0x6e, 0x6a, 0x11, 0xfb, 0x8a, 0x26, 0xee, 0x6f, 0x4a, 0xd0, 0x69, 0xd0, 0xf6, 0xa7, 0x98, 0x6a, 0xf4, 0x85, 0xbb, 0x0b, 0x30, 0xb3, 0xc4, 0x70, 0xc1, 0x02, 0x17, 0xfe, 0xc9, 0x17, 0x8e, 0xb3, 0x9c, 0x07, 0xc0, 0x5b, 0x25, 0x24, 0x83, 0x07, 0x86, 0x16, 0xaf, 0xbb, 0xff, 0x2d, 0x25, 0x67, 0x11, 0xf5, 0x10, 0x18, 0xe3, 0x0b, 0x6b, 0x70, 0xe4, 0x30, 0xc4, 0x54, 0xb2, 0x9c, 0x3f, 0xe4, 0x3b, 0x94, 0xdd, 0xb0, 0x22, 0x3f, 0xfe, 0x28, 0x64, 0xb6, 0x25, 0x55, 0x3b, 0x5a, 0xfc, 0xc7, 0x42, 0x6a, 0x98, 0xcf, 0xda, 0xd5, 0xfd, 0xee, 0xcd, 0x4c, 0xe5, 0x8c, 0x32, 0x9c, 0xbd, 0xed, 0x91, 0x3b, 0xf1, 0x62, 0x47, 0x20, 0x69, 0xbc, 0x2b, 0xd8, 0x54, 0x06, 0x71, 0xd7, 0x24, 0x74, 0xcf, 0x0c, 0xd9, 0x96, 0xdf, 0xb8, 0x83, 0xd1, 0xc5, 0x7f, 0x02, 0x10, 0x11, 0xc0, 0x11, 0xb7, 0xe7, 0x22, 0x83, 0xd9, 0x5d, 0x6f, 0xcb, 0xaa, 0x24, 0xa6, 0xc2, 0x37, 0x6b, 0x4b, 0xa5, 0x54, 0x00, 0x02, 0x5d, 0xd6, 0xb8, 0x5c, 0x04, 0x03, 0x12, 0xf1, 0xa4, 0x47, 0x17, 0xaf, 0x42, 0x29, 0x84, 0x71, 0x1b, 0x7c, 0x2b, 0xd3, 0x2d, 0xda, 0x97, 0x45, 0xf9, 0x4e, 0xef, 0x5f, 0x88, 0x51, 0x1c, 0x75, 0xac, 0xf8, 0x2e, 0x6a, 0x88, 0x6b, 0xfc, 0xc9, 0x52, 0x99, 0x0b, 0x11, 0x58, 0x2a, 0xb2, 0x51, 0x41, 0xb5, 0x7b, 0xf5, 0x96, 0x34, 0xcb, 0xe0, 0x81, 0xb5, 0xc6, 0xbb, 0xd4, 0x52, 0x6d, 0x8c, 0x4c, 0x62, 0x09, 0x8a, 0x18, 0xf1, 0xcd, 0x30, 0x95, 0x6e, 0xb7, 0x90, 0x5c, 0xa4, 0xb7, 0xea, 0x7e, 0xec, 0x13, 0x7d, 0x0e, 0xa0, 0x0a, 0x9d, 0xe0, 0xd2, 0xb8, 0x06, 0x91, 0x3e, 0x39, 0x70, 0xc7, 0x7e, 0x11, 0x63, 0xba, 0x7d, 0xcb, 0x4d, 0xf4, 0x2e, 0xe1, 0xd2, 0x55, 0x7e, 0xdc, 0x63, 0x59, 0x87, 0xbc, 0x12, 0x9e, 0x06, 0x9a, 0xa4, 0xa0, 0x0f, 0x8c, 0xe8, 0xc7, 0xff, 0xc9, 0x48, 0xa5, 0xb3, 0x0e, 0x9e, 0x78, 0xf7, 0x40, 0x49, 0xf7, 0x41, 0x52, 0x7f, 0x4b, 0xa0, 0x69, 0xe4, 0x5b, 0xef, 0x3e, 0x5c, 0x4c, 0x4e, 0xc4, 0x1e, 0x48, 0xd3, 0x0c, 0x0b, 0x7f, 0x7c, 0x65, 0x3d, 0x6c, 0x68, 0xc7, 0xe2, 0x5a, 0x47, 0x72, 0x4b, 0x26, 0x10, 0xd2, 0x40, 0x46, 0xf2, 0xa6, 0x97, 0x0a, 0x8c, 0x61, 0x05, 0x22, 0x60, 0xd0, 0x33, 0x61, 0x85, 0xfe, 0x14, 0xc1, 0x9d, 0x55, 0x77, 0xa6, 0x07, 0x05, 0xd8, 0x67, 0x56, 0xaa, 0x7c, 0x0a, 0x01, 0x29, 0xbd, 0x4f, 0x5b, 0xda, 0xa2, 0xf1, 0xc6, 0xed, 0xb2, 0x28, 0x24, 0x06, 0x0a, 0x72, 0x8f, 0x2b, 0xae, 0x93, 0x4a, 0xe0, 0x1d, 0xda, 0xf7, 0x90, 0x28, 0xa7, 0x0a, 0x2f, 0x03, 0x2a, 0x7d, 0x1e, 0x9d, 0x6d, 0xc6, 0x4f, 0x2d, 0x95, 0x06, 0xa9, 0x0d, 0x65, 0x83, 0xae, 0xcc, 0x03, 0x58, 0x5b, 0x7f, 0xff, 0x6b, 0x4f, 0x57, 0x91, 0xa0, 0x30, 0x79, 0x22, 0x4c, 0x4b, 0x09, 0x0e, 0xed, 0x7a, 0x88, 0xa9, 0x18, 0x4b, 0x61, 0x80, 0xb2, 0x5e, 0xbe, 0xe1, 0x63, 0x0f, 0xa0, 0x9d, 0x48, 0x55, 0x2f, 0x0c, 0xe8, 0xea, 0x4f, 0x52, 0x6a, 0xad, 0x73, 0xe1, 0x05, 0x44, 0xb6, 0x3f, 0xb7, 0x05, 0x28, 0x0a, 0x3a, 0x17, 0x65, 0x39, 0x34, 0xd4, 0x6d, 0xa4, 0xae, 0x72, 0xaf, 0xc7, 0xc7, 0xe3, 0x67, 0xc2, 0xa9, 0xf9, 0x2a, 0xa5, 0xbd, 0xce, 0xbf, 0xeb, 0x1b, 0x63, 0x31, 0x44, 0x45, 0x87, 0x22, 0x98, 0x14, 0xfb, 0x62, 0x48, 0xf2, 0xd3, 0xc1, 0xb7, 0x4a, 0x1f, 0x21, 0x09, 0x3d, 0xcb, 0xcf, 0x2a, 0x97, 0xc4, 0x13, 0x12, 0x01, 0x5c, 0x05, 0x48, 0x78, 0xf0, 0xa3, 0xa5, 0xfd, 0xc8, 0x21, 0x5b, 0x8e, 0x3e, 0x80, 0x36, 0x56, 0x23, 0x62, 0x21, 0x21, 0x5e, 0x1d, 0xeb, 0x12, 0xd6, 0x0e, 0x4b, 0x98, 0x93, 0x30, 0x22, 0x9e, 0x20, 0xec, 0x01, 0x02, 0x33, 0x33, 0xeb, 0x49, 0x8f, 0xcb, 0x5c, 0x91, 0x2a, 0xe6, 0x89, 0xc6, 0x8b, 0xf9, 0xea, 0x19, 0x77, 0xcb, 0xf6, 0xae, 0xcc, 0xcd, 0x2e, 0x95, 0xad, 0xa9, 0x5c, 0xfc, 0xdf, 0x1d, 0x1d, 0xa3, 0x73, 0x0a, 0x9d, 0x90, 0xa6, 0xc8, 0xa2, 0x03, 0x05, 0xbd, 0xcc, 0xac, 0xd5, 0x2e, 0x1b, 0x1c, 0xb1, 0x54, 0xb1, 0x7a, 0x75, 0xb3, 0xd9, 0x77, 0x5b, 0xa7, 0x49, 0x83, 0x64, 0x40, 0xa4, 0x42, 0xfa, 0x4f, 0x43, 0x39, 0xd3, 0xc1, 0x35, 0xce, 0x18, 0x2c, 0x84, 0x6f, 0xc7, 0xa8, 0xba, 0x11, 0x56, 0xe0, 0xa4, 0xdc, 0x99, 0x69, 0x56, 0x24, 0xe5, 0x52, 0x6f, 0x9c, 0x76, 0xfc, 0x9f, 0xc6, 0x0e, 0x2b, 0x66, 0xae, 0xdf, 0x5e, 0x1e, 0xd8, 0xab, 0x5c, 0x3b, 0x77, 0x2a, 0x10, 0xd2, 0xdf, 0xac, 0x96, 0x58, 0x3d, 0xff, 0x96, 0xad, 0x86, 0x93, 0xd1, 0x58, 0xad, 0xdc, 0xf9, 0x15, 0x19, 0xf8, 0xc6, 0x8d, 0x56, 0x92, 0x46, 0x64, 0x0b, 0x06, 0x75, 0x78, 0x2c, 0xc5, 0x0d, 0x68, 0x70, 0xfc, 0x9f, 0x54, 0x06, 0x70, 0xe3, 0xe4, 0x84, 0xac, 0x4d, 0x8c, 0x20, 0x5f, 0xe0, 0x0e, 0x22, 0x00, 0x47, 0x40, 0x99, 0xb3, 0x22, 0x0f, 0x4d, 0x70, 0x9e, 0xc4, 0xf6, 0x62, 0x48, 0x86, 0xab, 0x8d, 0x23, 0x20, 0x9d, 0xb4, 0xf7, 0x05, 0x05, 0x7a, 0xed, 0x91, 0x5b, 0xc7, 0x59, 0x92, 0xc9, 0x6d, 0xd7, 0x07, 0xdf, 0x0c, 0x99, 0x28, 0x88, 0x33, 0xff, 0xa6, 0x3d, 0xc7, 0x68, 0x33, 0x78, 0xa9, 0x49, 0x45, 0x6c, 0x93, 0x7c, 0x17, 0xf3, 0x43, 0xda, 0xf1, 0xc8, 0xdc, 0x0b, 0xaa, 0xf6, 0x89, 0x9d, 0x6b, 0x90, 0x63, 0x54, 0xb5, 0xa3, 0x95, 0xc1, 0xa6, 0x69, 0xbd, 0x16, 0x78, 0xbf, 0x96, 0x39, 0x4a, 0xd9, 0xd5, 0x17, 0x23, 0x35, 0x50, 0x3b, 0x34, 0xcd, 0x65, 0x9f, 0x5d, 0x91, 0x9a, 0xc2, 0xf3, 0x14, 0x81, 0xfa, 0xc1, 0x86, 0xdf, 0x0c, 0x4c, 0xe2, 0x0c, 0xfa, 0x5c, 0x68, 0x9d, 0x1c, 0xb7, 0x4e, 0x41, 0x72, 0x30, 0xb3, 0xe9, 0x39, 0xe0, 0xd4, 0x2c, 0xbc, 0xb4, 0x82, 0xe9, 0x6d, 0x28, 0xd4, 0x2e, 0x34, 0x51, 0x19, 0x58, 0x07, 0x21, 0x10, 0x7c, 0xbb, 0xe7, 0x5c, 0x06, 0x1a, 0x15, 0x32, 0xa0, 0x35, 0x46, 0x55, 0x56, 0xfc, 0x7f, 0x44, 0xf7, 0x0b, 0xb5, 0xb1, 0xbe, 0xc7, 0x90, 0x36, 0x31, 0xaa, 0x6f, 0x44, 0x4a, 0xdb, 0xac, 0x5c, 0xd5, 0x02, 0x21, 0x81, 0x19, 0x5a, 0xeb, 0xed, 0xba, 0x08, 0x6d, 0x03, 0xde, 0xab, 0x98, 0x85, 0x8f, 0x34, 0x6a, 0x07, 0x61, 0xf8, 0xb5, 0xa3, 0x54, 0x03, 0x22, 0xef, 0xfb, 0xaf, 0x75, 0x2c, 0xde, 0x76, 0x13, 0xc0, 0x1e, 0x05, 0xc1, 0xe7, 0x57, 0x91, 0xae, 0xa5, 0xca, 0x6e, 0xb4, 0xff, 0xbc, 0xde, 0xdb, 0x6a, 0x19, 0x27, 0x1f, 0x84, 0x5d, 0xe8, 0x73, 0x02, 0xb4, 0xac, 0x05, 0xe9, 0x60, 0xc0, 0xc4, 0x02, 0x5c, 0x42, 0x20, 0x87, 0x3f, 0x7b, 0x10, 0x23, 0x62, 0x6f, 0x5a, 0x1a, 0x45, 0xb1, 0x0f, 0xc3, 0x2f, 0x7c, 0x54, 0x3f, 0x15, 0x00, 0x68, 0x65, 0xbd, 0xfa, 0xe3, 0xfc, 0x24, 0x87, 0x3c, 0x2d, 0x1c, 0x3a, 0x8e, 0x37, 0x39, 0x6c, 0x9c, 0x65, 0xee, 0xd3, 0x12, 0x3e, 0xf4, 0x57, 0x0e, 0xfb, 0xeb, 0x20, 0xde, 0x3e, 0x44, 0xf4, 0x0c, 0x00, 0x5e, 0xc0, 0x97, 0xcb, 0xef, 0x74, 0x84, 0x2a, 0xa6, 0x14, 0x95, 0x5f, 0x0f, 0x0c, 0x59, 0x53, 0xb6, 0xc5, 0x65, 0xd3, 0x8f, 0x75, 0xe0, 0xf8, 0x95, 0x3b, 0x45, 0xe7, 0xb2, 0x6b, 0x64, 0xbb, 0xdf, 0x27, 0xaa, 0xc0, 0x8c, 0x2f, 0xa3, 0xe2, 0x42, 0xf9, 0xbd, 0x65, 0x87, 0x05, 0x4f, 0xd6, 0x02, 0x6b, 0xd9, 0x41, 0xdf, 0xb6, 0x8e, 0xa4, 0x75, 0xf4, 0x0f, 0xa4, 0x26, 0x0e, 0x7a, 0x7f, 0x87, 0x56, 0xa3, 0x42, 0xc1, 0x5f, 0xa1, 0x3c, 0x38, 0x11, 0x8d, 0xb2, 0x6a, 0xfc, 0x86, 0xd4, 0x19, 0xed, 0xf8, 0xf0, 0xac, 0xbf, 0x1e, 0xe6, 0xd3, 0x74, 0xc6, 0xdc, 0x6a, 0x85, 0x55, 0x32, 0xa0, 0x75, 0x0a, 0xb8, 0x58, 0xac, 0x87, 0x1f, 0xcf, 0x83, 0x8d, 0xae, 0x7f, 0x9c, 0x07, 0x36, 0x44, 0x74, 0x4a, 0x48, 0xbe, 0x3b, 0x9b, 0xa5, 0xf6, 0xe3, 0xf1, 0xf6, 0x44, 0x77, 0xfd, 0xbe, 0x70, 0xae, 0x68, 0x8c, 0x17, 0xc0, 0x5c, 0x75, 0x50, 0x78, 0x45, 0xc1, 0x90, 0x8a, 0xd9, 0xe5, 0xcb, 0x28, 0x56, 0xb2, 0xdc, 0xd0, 0x0a, 0xcb, 0x27, 0x68, 0x19, 0x5c, 0x7d, 0x8c, 0x7b, 0x09, 0x40, 0x27, 0x44, 0x25, 0xc7, 0x40, 0x28, 0x25, 0x03, 0x17, 0x3e, 0x54, 0x63, 0x71, 0x04, 0xc8, 0xf6, 0x30, 0xa4, 0x94, 0xd0, 0x26, 0x75, 0x3f, 0xae, 0x2b, 0xc5, 0x75, 0xdd, 0x6d, 0xd6, 0xfd, 0x57, 0x08, 0x26, 0xeb, 0x30, 0xd7, 0xf3, 0x17, 0x30, 0x89, 0xff, 0xcd, 0xc2, 0xf7, 0x91, 0xc6, 0x0c, 0xb4, 0xbc, 0x57, 0x60, 0xe6, 0xe3, 0xe9, 0xd3, 0x55, 0x7d, 0xa9, 0x2b, 0xc2, 0x16, 0x81, 0xff, 0x7a, 0x96, 0x46, 0x19, 0x2b, 0xc6, 0x33, 0x1f, 0xf5, 0x10, 0x96, 0x73, 0xc4, 0x87, 0xc9, 0x57, 0xde, 0x27, 0x64, 0x55, 0xb8, 0x5d, 0xb1, 0xde, 0x0e, 0xca, 0x60, 0x31, 0x32, 0x44, 0x7c, 0x7e, 0xa5, 0x1d, 0x9e, 0x4b, 0xe4, 0xa8, 0x61, 0x18, 0x84, 0xfa, 0x15, 0x3e, 0x81, 0xee, 0xb8, 0x1d, 0xd4, 0x6c, 0x22, 0x76, 0x43, 0xea, 0x7f, 0x16, 0x7d, 0x32, 0x02, 0xb5, 0x66, 0x66, 0xd8, 0x1d, 0xb0, 0x42, 0x5b, 0x8f, 0xab, 0xa2, 0x89, 0x62, 0x5e, 0x44, 0xb4, 0xed, 0xd6, 0xce, 0x7a, 0xa7, 0xbe, 0x13, 0xf8, 0x8d, 0x30, 0x92, 0x3b, 0xc4, 0xcb, 0x3f, 0xf7, 0x80, 0x06, 0x87, 0x7c, 0x24, 0xc3, 0x8e, 0xe5, 0xab, 0x28, 0xbb, 0x93, 0x46, 0xaa, 0x76, 0xda, 0x46, 0x6a, 0x30, 0xf9, 0x3d, 0xc5, 0xa4, 0x50, 0x60, 0x26, 0x5d, 0xcd, 0x30, 0x1f, 0x79, 0xa8, 0x5a, 0xb9, 0xac, 0x50, 0xdb, 0x08, 0x88, 0xa5, 0x67, 0x02, 0xfb, 0x67, 0x0c, 0x91, 0x19, 0xee, 0x13, 0xe6, 0x1b, 0x1c, 0x27, 0x11, 0xa8, 0x91, 0xb9, 0xce, 0x54, 0x1d, 0xa2, 0xa2, 0x67, 0x7b, 0x0a, 0x27, 0xdf, 0x3c, 0x89, 0xa4, 0xb8, 0x01, 0x8d, 0xe1, 0x6a, 0xed, 0xfc, 0x3a, 0xb4, 0x5a, 0x1a, 0xf1, 0x98, 0xcb, 0xac, 0xc9, 0xa7, 0x22, 0x5e, 0xd0, 0x7e, 0x14, 0x62, 0x7c, 0x91, 0xd9, 0x5a, 0xf9, 0x27, 0x28, 0x78, 0xc2, 0xa6, 0x62, 0xe3, 0x6f, 0x11, 0x0e, 0x5d, 0xcd, 0xcf, 0x85, 0x24, 0x34, 0xae, 0xee, 0x15, 0x15, 0x27, 0x6d, 0x17, 0xd3, 0xe4, 0x98, 0xb7, 0xd4, 0x7f, 0x2b, 0x10, 0xd7, 0x8d, 0xfc, 0xee, 0x88, 0xdb, 0x31, 0x33, 0x51, 0xf7, 0xb0, 0x79, 0x74, 0xf2, 0xd7, 0xf8, 0x57, 0x65, 0x6e, 0xaa, 0x1e, 0xb2, 0xd9, 0xae, 0x7f, 0x8c, 0x92, 0xeb, 0xd2, 0xba, 0xd7, 0xf5, 0x68, 0x17, 0xa0, 0x34, 0x1e, 0xde, 0xd4, 0x43, 0x32, 0x24, 0xbc, 0x96, 0x55, 0xa6, 0xb8, 0x60, 0x01, 0xc5, 0x31, 0xb3, 0x0c, 0xcf, 0xce, 0xe9, 0x7e, 0x80, 0xeb, 0x44, 0xa0, 0xc9, 0x47, 0xd1, 0x55, 0xcf, 0xfc, 0x92, 0xad, 0x37, 0xb5, 0xdb, 0xb8, 0xa1, 0x1b, 0xfd, 0x98, 0x72, 0x90, 0x22, 0xda, 0xd7, 0x20, 0x78, 0x07, 0x07, 0xb4, 0x92, 0x75, 0xc8, 0x89, 0x0b, 0x63, 0x34, 0xe1, 0x6c, 0x45, 0xbd, 0xf9, 0x4f, 0x5d, 0x6f, 0x3a, 0xc5, 0x8b, 0x75, 0xb3, 0xf6, 0x66, 0xdf, 0xc7, 0x07, 0x8b, 0xa2, 0x23, 0x41, 0x36, 0xe0, 0xf4, 0x6f, 0x0f, 0x6a, 0x56, 0x87, 0x46, 0x84, 0x0f, 0x8d, 0xe1, 0xe8, 0x7d, 0xb5, 0x55, 0x0d, 0xcd, 0xc8, 0x54, 0xa8, 0x6e, 0xc8, 0xe7, 0x74, 0xc5, 0xd7, 0xbc, 0x2e, 0x23, 0x55, 0xc1, 0xe4, 0xf4, 0x49, 0xf2, 0x70, 0x39, 0x02, 0x6e, 0x40, 0x38, 0xfe, 0xd1, 0x58, 0x71, 0x0a, 0xbe, 0x99, 0xd5, 0xab, 0xbb, 0x43, 0x33, 0xbd, 0x42, 0xb9, 0xf3, 0x5a, 0x14, 0x84, 0x06, 0xfd, 0xd1, 0x9b, 0x1d, 0xe7, 0xc6, 0xe1, 0x19, 0xc2, 0x06, 0xf0, 0xc3, 0x85, 0xbc, 0x15, 0xbe, 0x97, 0xbf, 0x9b, 0xba, 0x37, 0x67, 0x4d, 0xe9, 0x1b, 0xa0, 0x36, 0xb7, 0x57, 0x3c, 0xab, 0xb6, 0x81, 0x8e, 0x8c, 0xd7, 0x13, 0x34, 0xc6, 0xe0, 0x10, 0x34, 0x1c, 0x1a, 0xeb, 0x4b, 0x28, 0x4a, 0xa4, 0x81, 0x9c, 0xe3, 0x34, 0x01, 0xce, 0x7a, 0x2b, 0x28, 0x74, 0x7a, 0x98, 0xdc, 0xab, 0x19, 0x29, 0x1f, 0x3f, 0x8b, 0x93, 0xe3, 0x26, 0x75, 0x34, 0x20, 0x4d, 0xa4, 0xf7, 0x25, 0x98, 0xff, 0x79, 0x2c, 0x24, 0xba, 0x6a, 0x30, 0xcf, 0xcd, 0x35, 0x03, 0xfa, 0xa5, 0xe3, 0x9b, 0x8d, 0x19, 0x3c, 0xac, 0x3c, 0x9f, 0x30, 0x7d, 0x09, 0xc0, 0x76, 0xf4, 0x0a, 0xc9, 0x73, 0xf2, 0x6d, 0xc4, 0x5d, 0xe7, 0xb9, 0xa6, 0xa0, 0x9d, 0x56, 0xca, 0x81, 0x58, 0x50, 0x9e, 0x01, 0x21, 0x58, 0x9d, 0x04, 0x5f, 0x0c, 0x7d, 0xb2, 0xa7, 0x78, 0xa9, 0x1e, 0xd5, 0xdc, 0xf1, 0x25, 0x5c, 0xaf, 0x80, 0x9a, 0xda, 0xe5, 0x0f, 0xa0, 0xf0, 0x6e, 0x59, 0x56, 0x50, 0xff, 0xcf, 0xba, 0x17, 0x14, 0x8c, 0xc7, 0x5e, 0x36, 0x8b, 0xe1, 0x0b, 0x79, 0x18, 0x73, 0xed, 0x4a, 0x84, 0xd7, 0x09, 0x67, 0x1d, 0x76, 0x2e, 0x2f, 0x5d, 0x30, 0xd0, 0x1c, 0x62, 0xfe, 0x13, 0x8e, 0x9e, 0xd5, 0x25, 0xca, 0xd0, 0xce, 0xd1, 0x42, 0x33, 0x85, 0x51, 0x17, 0xf5, 0xbe, 0x64, 0xdc, 0xea, 0x4f, 0xa1, 0x9d, 0x82, 0x3a, 0x0b, 0x1f, 0xf9, 0x19, 0xe5, 0x6a, 0xcd, 0xbf, 0xc8, 0x85, 0x75, 0x1c, 0xf2, 0x81, 0x50, 0x61, 0xe1, 0xb8, 0xdc, 0x65, 0x21, 0x57, 0x28, 0x47, 0x62, 0x1a, 0x8c, 0x56, 0xcd, 0x57, 0x97, 0x2d, 0x98, 0x3e, 0x49, 0x22, 0xd8, 0x5f, 0x82, 0xe2, 0x97, 0x6d, 0xbb, 0x55, 0x27, 0x41, 0xf4, 0xc8, 0xb5, 0x21, 0xed, 0x4a, 0x21, 0x43, 0x99, 0x56, 0x0e, 0x8d, 0xd0, 0xb3, 0x35, 0x9f, 0x44, 0x99, 0xfe, 0x13, 0xb6, 0x15, 0x51, 0x03, 0x6a, 0xae, 0xa9, 0xcc, 0xd8, 0x49, 0x6b, 0x12, 0xa4, 0x4a, 0x77, 0x05, 0xd0, 0xfc, 0xfc, 0xe2, 0x31, 0x33, 0x90, 0xbc, 0x1f, 0x30, 0x80, 0x7c, 0x71, 0xc4, 0x64, 0x27, 0xa9, 0xb9, 0xf7, 0x5f, 0x6b, 0x6d, 0x26, 0x2d, 0x34, 0xc0, 0x67, 0xfd, 0x48, 0x30, 0x4c, 0xea, 0xec, 0x43 ],
+    const [ 0x7b, 0xd0, 0xa5, 0x9d, 0x7e, 0xec, 0x22, 0xeb, 0x80, 0x64, 0x83, 0xb0, 0xb9, 0x5d, 0xe6, 0xe1, 0x5c, 0x14, 0x23, 0x44, 0x25, 0x22, 0x01, 0xd5, 0x31, 0xfe, 0xa9, 0x69, 0x13, 0xc3, 0x5a, 0x91, 0x24, 0x33, 0x5f, 0xc1, 0x1a, 0xfc, 0x3e, 0xb2, 0xdd, 0x3b, 0x33, 0x04, 0x96, 0x3f, 0xdc, 0x28, 0x08, 0x8f, 0x36, 0x7d, 0x23, 0x2e, 0xc8, 0xb9, 0xd6, 0x1d, 0x1e, 0x8b, 0x26, 0x22, 0x79, 0x7f, 0x7d, 0xc8, 0xc5, 0x21, 0x44, 0xa7, 0xcb, 0x65, 0xb3, 0xe5, 0xa8, 0x46, 0xe8, 0xfd, 0x7e, 0xae, 0x37, 0xbf, 0x69, 0x96, 0xc2, 0x99, 0xb5, 0x6e, 0x49, 0x14, 0x4e, 0xbf, 0x43, 0xa1, 0x77, 0x0f, 0x2d, 0x96, 0xbf, 0x05, 0x22, 0x74, 0x31, 0xcd, 0xac, 0x6b, 0xcc, 0xbe, 0xda, 0x20, 0x33, 0x3a, 0x92, 0xad, 0xa5, 0xd6, 0x29, 0xe9, 0x2e, 0xbb, 0x31, 0xeb, 0x1f, 0x4d, 0x92, 0xc9, 0xbd, 0x0a, 0xdd, 0xa5, 0x36, 0xb4, 0xdc, 0xeb, 0xd9, 0xb2, 0x6e, 0xd4, 0x85, 0xb4, 0x91, 0x2f, 0x62, 0x96, 0xc1, 0x60, 0xd0, 0x87, 0x81, 0xa9, 0x9d, 0x6a, 0x37, 0xa8, 0x7b, 0x7c, 0x3c, 0x21, 0xb1, 0x37, 0x34, 0xfe, 0x10, 0x77, 0x9b, 0x94, 0x29, 0xdc, 0xa1, 0x28, 0xbd, 0x6f, 0x38, 0xb2, 0x75, 0x88, 0x6b, 0xe0, 0xd3, 0xef, 0xf1, 0x5e, 0x69, 0x41, 0x02, 0x55, 0x49, 0x95, 0x69, 0x32, 0xbc, 0x60, 0xdb, 0xa8, 0x37, 0x96, 0x87, 0xf8, 0x8a, 0x12, 0xee, 0x70, 0x5b, 0x38, 0xf5, 0x31, 0xd3, 0xd9, 0x38, 0x36, 0x97, 0x56, 0xa2, 0x92, 0xfa, 0x09, 0x3b, 0xf9, 0x71, 0xe0, 0x40, 0x82, 0x47, 0x4b, 0x79, 0xab, 0x91, 0x59, 0xc7, 0x9e, 0x65, 0x1e, 0xfd, 0xb3, 0x47, 0x57, 0xf0, 0x35, 0xe4, 0x51, 0xd2, 0x69, 0x03, 0x06, 0xbb, 0xcc, 0xb8, 0x89, 0x89, 0x9d, 0xda, 0xa5, 0xea, 0x9b, 0xb8, 0xc1, 0xb7, 0x10, 0x08, 0x07, 0x84, 0x0e, 0x20, 0xc6, 0x75, 0xf9, 0x69, 0x14, 0x53, 0x45, 0x10, 0xb7, 0xde, 0x81, 0xfe, 0x46, 0x65, 0x95, 0x0b, 0x8b, 0x95, 0x48, 0x6e, 0x2c, 0x8f, 0x05, 0x78, 0x8a, 0x3d, 0xde, 0x83, 0xea, 0xe5, 0xd1, 0x25, 0xd3, 0xfe, 0x4a, 0xa9, 0xb6, 0x43, 0xea, 0xbf, 0xd5, 0x07, 0x87, 0x72, 0x5d, 0xc8, 0x74, 0x5b, 0xd5, 0x06, 0x02, 0x14, 0xbc, 0x55, 0x46, 0xf0, 0x6e, 0xb2, 0x1d, 0xe9, 0x48, 0x13, 0x6e, 0xda, 0x0c, 0x42, 0xaf, 0xef, 0x87, 0xea, 0xab, 0x59, 0x71, 0xf2, 0x82, 0x46, 0x94, 0x0b, 0xf1, 0x10, 0x31, 0x85, 0xd3, 0xb4, 0x9f, 0x67, 0xe8, 0x87, 0x35, 0xbe, 0xd6, 0x24, 0x6a, 0x35, 0x6d, 0xa9, 0x3b, 0xe6, 0x2f, 0x23, 0xcd, 0x70, 0x10, 0x46, 0x54, 0x4a, 0x7a, 0x62, 0x33, 0x57, 0x94, 0x92, 0x65, 0xba, 0xc4, 0x37, 0x1b, 0xeb, 0x73, 0xa4, 0xa6, 0x0a, 0x10, 0x1b, 0x98, 0x74, 0x57, 0xf9, 0x26, 0x95, 0xd3, 0x2d, 0xd1, 0xfd, 0xa1, 0xee, 0x46, 0xb5, 0x78, 0xae, 0x82, 0xd3, 0xe6, 0x49, 0x39, 0x4c, 0xdc, 0x83, 0x79, 0x0a, 0x6d, 0xb1, 0x8b, 0x3e, 0xd3, 0xb6, 0x1a, 0xf8, 0xb3, 0x31, 0x96, 0xf5, 0xa2, 0xf5, 0xdb, 0xb7, 0xe7, 0xba, 0x0e, 0xdb, 0x82, 0x12, 0xc8, 0xa8, 0x6e, 0x9e, 0x77, 0xe4, 0x24, 0x81, 0x01, 0xeb, 0x60, 0x15, 0xaa, 0x02, 0x27, 0xdd, 0x37, 0xe8, 0x09, 0xbb, 0x53, 0xae, 0xa4, 0x63, 0x33, 0xc9, 0x69, 0x10, 0x76, 0x66, 0xa3, 0x76, 0x4f, 0xfd, 0xb4, 0xf7, 0xe5, 0x29, 0xa2, 0x19, 0xfa, 0xb7, 0xd3, 0x38, 0xcb, 0xfc, 0x15, 0x78, 0x38, 0x6c, 0xe2, 0xfe, 0x25, 0x69, 0xe1, 0x60, 0x20, 0x59, 0xaf, 0x59, 0x44, 0xfb, 0xe0, 0xc2, 0x5d, 0xfb, 0x41, 0xbd, 0x4d, 0xc4, 0x60, 0x34, 0xae, 0x95, 0x4f, 0x82, 0xb8, 0xd7, 0xa4, 0x6f, 0x65, 0xae, 0xc4, 0x62, 0xd4, 0xce, 0x62, 0xd2, 0xeb, 0x90, 0x42, 0xfe, 0x41, 0x44, 0x43, 0xde, 0x3b, 0xc9, 0x9c, 0x59, 0x75, 0x5c, 0x66, 0xb8, 0x63, 0xae, 0x5b, 0x5b, 0x38, 0x39, 0xdd, 0xaa, 0x06, 0xd3, 0x3a, 0x4f, 0x27, 0x84, 0x2e, 0xa3, 0xdd, 0x95, 0xa9, 0x65, 0x35, 0xe9, 0xd3, 0xb2, 0x31, 0x91, 0x4d, 0x31, 0x25, 0x9a, 0xba, 0x8f, 0x62, 0x29, 0x7f, 0x2b, 0x12, 0xcb, 0xc6, 0x12, 0x63, 0x06, 0xc9, 0x2d, 0xe8, 0x34, 0x4d, 0xb9, 0x3c, 0x91, 0x6c, 0xf8, 0xe8, 0x92, 0x98, 0x26, 0x86, 0x78, 0xdd, 0xaf, 0x27, 0x26, 0x66, 0x9f, 0xf3, 0x2f, 0x43, 0x5a, 0x0f, 0x34, 0x6a, 0x8d, 0xc4, 0x6d, 0xfb, 0x64, 0xdd, 0x85, 0xc8, 0xfe, 0x50, 0xab, 0x14, 0x1e, 0x21, 0xe6, 0x9b, 0x23, 0x84, 0xa8, 0xd3, 0x3a, 0x42, 0xa7, 0x72, 0xd2, 0x5d, 0xe8, 0x30, 0x50, 0xf7, 0x1c, 0xce, 0x04, 0x70, 0x30, 0x57, 0x5c, 0xcf, 0x20, 0xa6, 0x58, 0x63, 0x0c, 0x28, 0x3e, 0xaa, 0x8d, 0xe3, 0x8f, 0x71, 0x49, 0xb7, 0x39, 0x3d, 0xc5, 0xe4, 0x0e, 0xea, 0x7b, 0xcd, 0x75, 0x92, 0x2d, 0xfc, 0x60, 0xb0, 0x78, 0x65, 0x7e, 0x85, 0xac, 0xef, 0xb1, 0xbb, 0xdb, 0x30, 0xc2, 0x49, 0x30, 0x78, 0x54, 0x96, 0x82, 0x12, 0x16, 0xe1, 0x29, 0xc6, 0x3d, 0xe0, 0x11, 0xa2, 0x32, 0xa7, 0x0d, 0xfb, 0x87, 0xcc, 0x6d, 0xae, 0x30, 0xc9, 0xd2, 0xab, 0xf0, 0xa1, 0x41, 0xb5, 0x11, 0xc7, 0x77, 0x63, 0x58, 0x3b, 0x7c, 0x6b, 0x38, 0xf6, 0x7b, 0x1f, 0x46, 0x88, 0xd1, 0x38, 0xed, 0x00, 0x64, 0xd3, 0x63, 0x0c, 0x36, 0xb9, 0xdb, 0x61, 0x3a, 0xe3, 0xfd, 0x5d, 0x66, 0x3e, 0x93, 0xeb, 0x09, 0xab, 0x85, 0xa8, 0x5f, 0x4a, 0x07, 0x44, 0x62, 0xf8, 0x11, 0x2a, 0xe4, 0x16, 0x0f, 0x63, 0xdb, 0x8d, 0xdb, 0xb7, 0xfc, 0x0e, 0xe8, 0x16, 0x8b, 0x9f, 0xc0, 0x37, 0x71, 0x53, 0xb0, 0x7f, 0x8f, 0x58, 0xc1, 0x24, 0x52, 0x37, 0xeb, 0x92, 0x87, 0x58, 0x86, 0x0e, 0x71, 0xc5, 0x01, 0x99, 0x19, 0x2f, 0xd6, 0x17, 0xe6, 0x36, 0xbd, 0xb0, 0x6d, 0xe5, 0x21, 0x77, 0x8a, 0x7c, 0xd0, 0x49, 0xb0, 0x73, 0xf6, 0xf8, 0x7d, 0xbb, 0x4c, 0xa9, 0x92, 0x47, 0x8d, 0x7b, 0xa1, 0xcb, 0x2a, 0x6a, 0xc7, 0xc4, 0x3e, 0x72, 0x1d, 0xb8, 0xc4, 0xf7, 0x8a, 0xbf, 0x08, 0x64, 0xdb, 0x42, 0x5b, 0x13, 0x15, 0x03, 0x0b, 0x6d, 0x09, 0x5d, 0x92, 0x52, 0x2a, 0xce, 0x0e, 0xbb, 0x9c, 0xb2, 0xf1, 0x9d, 0x8d, 0x51, 0xfa, 0x11, 0xc8, 0x1c, 0x64, 0xb3, 0x87, 0x34, 0x5d, 0x47, 0x89, 0x2c, 0xb9, 0xa3, 0x65, 0x10, 0xe8, 0xc9, 0x1e, 0xa6, 0x25, 0x53, 0xf7, 0xf3, 0xf1, 0x14, 0x89, 0x01, 0xc0, 0xfc, 0x12, 0xe0, 0xf2, 0x3c, 0x10, 0xeb, 0x04, 0xab, 0x0f, 0x4c, 0x08, 0x68, 0xbf, 0xc3, 0x52, 0xc1, 0x49, 0xa3, 0x75, 0x54, 0xe3, 0x1d, 0x6e, 0x74, 0xa3, 0xc0, 0x1e, 0xcf, 0x90, 0x41, 0xfe, 0x4d, 0xff, 0x78, 0x0e, 0x3b, 0x1d, 0xac, 0x0e, 0xa8, 0xc8, 0x10, 0xf1, 0x0f, 0xa3, 0x8d, 0x8f, 0x37, 0x69, 0xc2, 0x9a, 0x58, 0x81, 0x4a, 0xd3, 0x7f, 0xd3, 0x3d, 0x7d, 0x33, 0xdb, 0xf9, 0x12, 0x59, 0xfb, 0x22, 0x36, 0x55, 0x16, 0xe7, 0xe9, 0x72, 0x5a, 0x87, 0x00, 0x84, 0x5d, 0x14, 0xd6, 0xcc, 0x6c, 0x78, 0x3f, 0x1b, 0x20, 0xb5, 0xbd, 0x3a, 0x31, 0x71, 0xf7, 0x8a, 0x8f, 0xb1, 0x66, 0xe8, 0xaf, 0xe5, 0x52, 0xd3, 0x23, 0x25, 0xfd, 0xd1, 0x6e, 0xba, 0x1e, 0x0e, 0x16, 0xe0, 0x90, 0x47, 0xfb, 0xca, 0x4c, 0xe6, 0xe6, 0xe7, 0x95, 0x6f, 0x65, 0x64, 0x72, 0x1a, 0xd7, 0xf2, 0x61, 0xc2, 0xc3, 0xc9, 0x4a, 0xfd, 0x6e, 0xec, 0xb2, 0x8d, 0xac, 0xaf, 0x31, 0xf7, 0xf6, 0x77, 0x26, 0x71, 0xbd, 0xc2, 0xa9, 0x01, 0xfe, 0x67, 0xc1, 0xe4, 0x17, 0x1e, 0xd7, 0x2d, 0xd9, 0x42, 0x6b, 0xae, 0xde, 0xd6, 0x06, 0x1b, 0x1c, 0xc7, 0x70, 0x6d, 0xbb, 0x70, 0x22, 0x85, 0x24, 0x63, 0xfe, 0x12, 0x5b, 0x67, 0x3e, 0xb4, 0x8e, 0xbd, 0xab, 0x62, 0xee, 0xa8, 0x0f, 0x09, 0xbd, 0x2c, 0xec, 0x75, 0xa8, 0x15, 0x6e, 0x75, 0x58, 0x3b, 0x9f, 0x3a, 0x44, 0x05, 0xda, 0x01, 0xc9, 0x2c, 0x82, 0xf2, 0x7c, 0xc1, 0xf3, 0x47, 0xbf, 0x72, 0xb9, 0xb0, 0x92, 0x09, 0x01, 0xf6, 0xac, 0x35, 0x4c, 0xdf, 0xcb, 0x8d, 0x6b, 0x53, 0x48, 0xd2, 0xa7, 0xbc, 0xee, 0x74, 0x40, 0xb3, 0x0c, 0x58, 0x19, 0xd8, 0xc9, 0xd9, 0xb1, 0x01, 0xb8, 0x0d, 0x55, 0x98, 0xac, 0x49, 0x94, 0x3e, 0xce, 0xe7, 0xf4, 0xb4, 0xec, 0x46, 0xe3, 0xfc, 0x14, 0x13, 0xf0, 0xbb, 0x62, 0xc7, 0x3b, 0xe2, 0x16, 0x71, 0x2a, 0x8d, 0xe9, 0xb6, 0x5e, 0x2c, 0xa2, 0x16, 0xe6, 0xe0, 0xe4, 0x71, 0xb2, 0x28, 0x4a, 0xc9, 0x4a, 0xbc, 0xb6, 0x49, 0xc0, 0xb9, 0xe5, 0x86, 0xe2, 0xff, 0x47, 0x06, 0xb5, 0xd7, 0x0e, 0xff, 0x1f, 0xda, 0x85, 0x60, 0xe4, 0x0e, 0xa4, 0x15, 0xd4, 0x51, 0xe1, 0x87, 0x42, 0xfb, 0x48, 0x63, 0xb7, 0xbf, 0xce, 0x9d, 0xe8, 0xd2, 0xe3, 0xb4, 0xe6, 0x4f, 0x46, 0x37, 0x95, 0xdb, 0x1d, 0x88, 0x5f, 0x85, 0x45, 0xe0, 0x29, 0xef, 0xe7, 0x93, 0x86, 0xb3, 0x4c, 0x96, 0x2b, 0x00, 0xf2, 0x3e, 0xa4, 0x84, 0xdf, 0x4a, 0x45, 0x8f, 0x35, 0x24, 0x62, 0x75, 0x07, 0x64, 0xc3, 0x34, 0x6b, 0x96, 0x52, 0x56, 0xd0, 0x3d, 0x17, 0x19, 0x92, 0x18, 0x66, 0xce, 0xcc, 0xa3, 0x57, 0x7f, 0x6e, 0xe1, 0x77, 0xd4, 0x8f, 0x59, 0xbd, 0x37, 0x04, 0x5e, 0xc0, 0x37, 0x31, 0x94, 0x26, 0x2a, 0x1f, 0xb0, 0x60, 0x17, 0xcf, 0x7f, 0x95, 0xd3, 0xce, 0x2a, 0xdb, 0x69, 0x0a, 0xb8, 0xad, 0xbf, 0xe4, 0xd4, 0x9a, 0x77, 0x86, 0xd1, 0x3a, 0x14, 0x77, 0xeb, 0x66, 0x5e, 0x6c, 0xd0, 0xa8, 0x07, 0x62, 0x5f, 0xf1, 0x8e, 0xe9, 0xaf, 0x8a, 0x64, 0xc3, 0x53, 0x4d, 0x4e, 0xad, 0xdc, 0x15, 0x0a, 0x7d, 0xa0, 0x73, 0x35, 0x6d, 0xba, 0xa3, 0x6c, 0xb7, 0x52, 0xbe, 0xb2, 0x62, 0x1f, 0x30, 0x11, 0x5b, 0x29, 0x6d, 0x84, 0xc7, 0xd4, 0xe0, 0x15, 0x98, 0x1a, 0x24, 0x43, 0x5e, 0x18, 0x77, 0xa6, 0x60, 0xcc, 0x6c, 0xd6, 0xec, 0x1d, 0xe0, 0x88, 0xeb, 0x1b, 0x2e, 0xfa, 0xb8, 0x89, 0xa7, 0x92, 0x33, 0x99, 0x3c, 0xc2, 0x11, 0xf6, 0x7e, 0x2e, 0x76, 0x07, 0xc9, 0x11, 0xc5, 0x73, 0xbb, 0xdc, 0xb7, 0xe0, 0xeb, 0x21, 0xaa, 0x01, 0xd8, 0xb0, 0x3c, 0xcf, 0x20, 0x00, 0x19, 0x16, 0xf3, 0xd0, 0x11, 0x34, 0xc6, 0x0d, 0x6e, 0x1d, 0x4c, 0xf7, 0x84, 0xa3, 0xa2, 0x80, 0x89, 0xf5, 0xca, 0xf4, 0xa7, 0x65, 0x5a, 0xdf, 0x50, 0x6e, 0x75, 0x2c, 0xd2, 0xf5, 0xfb, 0x8a, 0x2b, 0xcf, 0xfd, 0x14, 0x1e, 0x84, 0x74, 0x30, 0x86, 0x52, 0x32, 0xb7, 0xeb, 0x75, 0x18, 0x57, 0x53, 0xa6, 0x8a, 0x36, 0x5a, 0xe2, 0x20, 0xd8, 0x85, 0x6c, 0x9e, 0x43, 0xd4, 0x15, 0x27, 0x61, 0x96, 0xbb, 0xad, 0xa5, 0x81, 0x10, 0xac, 0xf1, 0x02, 0x9c, 0x18, 0xb8, 0xd2, 0x06, 0x94, 0x60, 0xca, 0x8f, 0xe4, 0xea, 0xf8, 0xdf, 0xa5, 0xd4, 0xf2, 0x04, 0x3b, 0x3e, 0x6a, 0xb8, 0x0c, 0x4d, 0x03, 0xe2, 0xec, 0xcd, 0x63, 0x60, 0xd7, 0x1a, 0x8a, 0x04, 0xe6, 0x40, 0x62, 0xdc, 0x7c, 0x61, 0x97, 0xb7, 0xc0, 0x57, 0xa8, 0xe4, 0x51, 0x9b, 0x3f, 0x3d, 0x35, 0x65, 0xbe, 0x65, 0x12, 0x15, 0x1a, 0x4d, 0xa0, 0xd2, 0xec, 0xfd, 0x5e, 0x71, 0xc5, 0x91, 0x84, 0x98, 0xc2, 0x81, 0x39, 0x23, 0x61, 0x26, 0x07, 0xc6, 0x93, 0x7a, 0x8c, 0xf4, 0x13, 0x20, 0x72, 0x00, 0xf5, 0xa4, 0xa1, 0x83, 0x82, 0x03, 0xb2, 0xfd, 0x43, 0x6e, 0xa7, 0xbf, 0x5c, 0x4b, 0xda, 0x08, 0x1c, 0x7d, 0x34, 0x6e, 0xd1, 0xe5, 0x9f, 0x7f, 0xe1, 0x28, 0xbe, 0xa9, 0x16, 0xb3, 0xdb, 0x57, 0x3a, 0xfd, 0x21, 0x5d, 0xe4, 0x0c, 0x0b, 0x96, 0x91, 0x3b, 0x1c, 0xcb, 0xf6, 0x3a, 0xd1, 0xd7, 0x95, 0x56, 0xd4, 0x09, 0x8f, 0xfb, 0x72, 0xca, 0xb9, 0x77, 0x4f, 0x80, 0xf1, 0x00, 0x58, 0xb2, 0xb3, 0xf9, 0xfa, 0x6c, 0xe7, 0x71, 0x91, 0xe5, 0xfd, 0xed, 0x24, 0x5f, 0x3c, 0x67, 0x4f, 0x4f, 0x57, 0x96, 0x80, 0xbe, 0x42, 0x70, 0x67, 0xef, 0x43, 0xee, 0xa7, 0x42, 0x4c, 0x0f, 0xd2, 0x58, 0x88, 0x1f, 0x94, 0x78, 0x34, 0x39, 0x2e, 0x31, 0xb0, 0x0b, 0x26, 0x41, 0xd6, 0xd9, 0x3d, 0xb6, 0x8a, 0xc4, 0xa2, 0x53, 0x92, 0x4d, 0x65, 0x35, 0xa9, 0x15, 0x2e, 0xb7, 0xce, 0xe6, 0x2f, 0x92, 0xe2, 0xf7, 0x57, 0x49, 0x72, 0x6c, 0xc9, 0xc4, 0xd2, 0x1d, 0x8c, 0x3a, 0x6b, 0x98, 0x84, 0x55, 0x55, 0x69, 0xa1, 0x91, 0x29, 0x99, 0x56, 0xe6, 0x10, 0x74, 0x4d, 0xa6, 0x20, 0x8f, 0x59, 0xa8, 0xe9, 0x0a, 0xac, 0xa6, 0x4a, 0x13, 0x4a, 0xe4, 0x8a, 0xab, 0xbd, 0x12, 0xa3, 0xad, 0x0a, 0x74, 0xe1, 0x0c, 0xe5, 0x40, 0xac, 0x5c, 0x21, 0x48, 0xa2, 0x94, 0x6a, 0xd8, 0xea, 0x12, 0x36, 0xe2, 0xc4, 0xdf, 0xf9, 0x58, 0x64, 0x35, 0x98, 0xda, 0x00, 0x3e, 0x21, 0x91, 0x28, 0x1f, 0xb9, 0x5b, 0x56, 0x35, 0xd6, 0x28, 0xc6, 0x9e, 0xae, 0xa4, 0x87, 0xfc, 0xef, 0x16, 0xd3, 0x75, 0xb0, 0x87, 0x9c, 0xff, 0xa7, 0x28, 0x67, 0xda, 0x9d, 0xee, 0x5d, 0x5d, 0x20, 0x7f, 0x9f, 0xf6, 0x78, 0x51, 0xdb, 0x6d, 0xdc, 0x10, 0x1d, 0x68, 0xe5, 0x41, 0xe7, 0x34, 0x42, 0x26, 0x83, 0xc2, 0xae, 0xe1, 0x98, 0xf0, 0x1f, 0xdb, 0xfc, 0x0a, 0x40, 0x67, 0xc9, 0x91, 0x22, 0xa3, 0xb3, 0x3b, 0x2e, 0x9f, 0x98, 0x3a, 0x5f, 0xc2, 0x59, 0xc1, 0xae, 0x69, 0xe9, 0xc5, 0xcd, 0xd0, 0xa3, 0x01, 0x17, 0x36, 0xe1, 0x3c, 0xc8, 0x3c, 0xca, 0xce, 0x69, 0x8f, 0x6b, 0x61, 0x8f, 0xc6, 0x0a, 0xf5, 0xc5, 0x8e, 0xb6, 0x27, 0xc7, 0x04, 0x23, 0xb2, 0xf1, 0x62, 0xb5, 0x36, 0xf6, 0xde, 0xdb, 0x38, 0xd5, 0xcf, 0x9e, 0x6a, 0x09, 0x12, 0x7a, 0x2d, 0x00, 0xac, 0x6c, 0x55, 0xcf, 0xb0, 0x4c, 0x2c, 0x24, 0x64, 0x5d, 0xb9, 0x7c, 0x9f, 0x23, 0x42, 0x96, 0x75, 0x74, 0x0f, 0x27, 0x16, 0xd2, 0x71, 0xcf, 0xf4, 0xf8, 0x03, 0x4c, 0x24, 0xb3, 0x30, 0xee, 0x07, 0xf3, 0xf5, 0x4a, 0x29, 0x22, 0xe8, 0x33, 0x69, 0xb4, 0x7a, 0xe6, 0x5b, 0x00, 0x79, 0x85, 0xea, 0x4e, 0xd9, 0xc7, 0x42, 0x31, 0xb3, 0xed, 0xed, 0x17, 0x8e, 0xf8, 0x3b, 0x1e, 0xde, 0x19, 0xe8, 0x29, 0xca, 0x69, 0xf9, 0x34, 0x32, 0xda, 0xe7, 0xe4, 0xf1, 0x6d, 0xff, 0x62, 0x5f, 0xa6, 0x09, 0x6a, 0x1a, 0x3e, 0x28, 0x9f, 0x07, 0x17, 0x01, 0x22, 0x93, 0x75, 0x1f, 0x62, 0x3f, 0x6a, 0x96, 0x36, 0x5b, 0x92, 0xe7, 0x29, 0x11, 0x01, 0x24, 0x14, 0xa6, 0x7a, 0x55, 0xf3, 0xfd, 0xe1, 0x19, 0xf1, 0x5d, 0xf3, 0x91, 0xc5, 0x73, 0x35, 0x79, 0x41, 0x9b, 0x2a, 0x98, 0x28, 0x5b, 0xc9, 0x5b, 0x41, 0x30, 0x2e, 0xbd, 0xa9, 0x8e, 0x90, 0x69, 0x6d, 0x22, 0x73, 0x23, 0x58, 0x5a, 0x1f, 0x64, 0x0a, 0x27, 0x50, 0x44, 0x4a, 0x02, 0x2f, 0x9d, 0x9e, 0x2d, 0x81, 0x6e, 0x18, 0x3b, 0x1f, 0x7d, 0x72, 0xd2, 0xa6, 0x41, 0x5e, 0xb0, 0x6f, 0xfe, 0x17, 0xec, 0xc2, 0x32, 0x3c, 0x7e, 0x46, 0x30, 0xde, 0x02, 0xbc, 0x0b, 0xd8, 0xb9, 0xed, 0xb5, 0x5e, 0xd1, 0xe1, 0x68, 0xd9, 0xe6, 0x52, 0x45, 0xf2, 0xc8, 0x60, 0x3c, 0xed, 0x7f, 0x87, 0x2b, 0x39, 0x8c, 0xcd, 0x4a, 0x45, 0x72, 0x40, 0xc6, 0x95, 0x75, 0x9f, 0xac, 0x14, 0xa2, 0x58, 0x09, 0xac, 0x0f, 0xb2, 0x50, 0x14, 0x64, 0x4c, 0xfb, 0xe9, 0x9a, 0xc6, 0x75, 0x01, 0x03, 0xbe, 0x38, 0xfc, 0x8b, 0xfe, 0x32, 0x1b, 0x3d, 0xf3, 0x6e, 0x56, 0x09, 0x62, 0xf0, 0xa8, 0xc4, 0x56, 0xe1, 0xae, 0x70, 0x5d, 0xec, 0x70, 0xbe, 0xf3, 0xe7, 0x7f, 0xd1, 0x3f, 0xb6, 0x40, 0x45, 0xfd, 0x6c, 0x87, 0x70, 0xbc, 0xb4, 0x67, 0xe7, 0x49, 0x70, 0x49, 0x44, 0x6b, 0x9f, 0x3c, 0x27, 0xd0, 0x84, 0x8c, 0x7b, 0x48, 0x05, 0x96, 0xfb, 0x31, 0x51, 0xda, 0xf4, 0x32, 0xc5, 0x52, 0x4c, 0x2d, 0x11, 0x03, 0xc3, 0x6e, 0x96, 0xd1, 0x79, 0x29, 0x13, 0x97, 0xb1, 0x23, 0x81, 0x77, 0xd4, 0xaf, 0x3b, 0x6f, 0xb9, 0xdc, 0x62, 0x2d, 0x23, 0xed, 0x80, 0x25, 0x8b, 0x09, 0x6b, 0xe0, 0x20, 0x34, 0x6d, 0x97, 0x0d, 0x7e, 0xa1, 0x00, 0xfa, 0x7a, 0xa0, 0x68, 0xd5, 0xf2, 0x5d, 0x02, 0xd2, 0xd9, 0x4e, 0x7f, 0xb0, 0x81, 0xcd, 0xde, 0x3f, 0x0f, 0xbd, 0x86, 0x1f, 0x2b, 0x70, 0x92, 0xca, 0xfc, 0xc8, 0x6c, 0xd4, 0x53, 0x9d, 0x9d, 0x72, 0x26, 0x5f, 0xe3, 0x3a, 0x41, 0xfd, 0x84, 0x29, 0x38, 0x05, 0xe3, 0xea, 0xa0, 0x0c, 0x51, 0x55, 0x7e, 0x50, 0x25, 0x37, 0x00, 0x9c, 0x0f, 0x51, 0x6b, 0x6c, 0xa9, 0xa3, 0x55, 0x52, 0x4f, 0xea, 0x14, 0x98, 0x31, 0x67, 0x76, 0x27, 0xa6, 0xe2, 0xb3, 0xa7, 0xc4, 0xef, 0x9f, 0xe8, 0x2d, 0x70, 0x24, 0x81, 0x2b, 0x5b, 0xf0, 0xb7, 0x00, 0xbd, 0x6b, 0xa0, 0x77, 0xff, 0xec, 0x88, 0xbf, 0x68, 0x2c, 0x93, 0x79, 0xe4, 0xfb, 0xa4, 0x10, 0x04, 0x31, 0x7e, 0x49, 0x45, 0xe8, 0x29, 0x1b, 0x95, 0xe8, 0x98, 0xc0, 0x13, 0x63, 0x88, 0x0c, 0x17, 0xe3, 0xab, 0xfe, 0x72, 0x80, 0x06, 0x95, 0xf7, 0x56, 0x97, 0xe4, 0x3a, 0x36, 0x3c, 0x69, 0x97, 0x9c, 0xd0, 0x9b, 0x76, 0xe1, 0x97, 0xc2, 0xce, 0xb2, 0xdc, 0x0b, 0xe8, 0xc1, 0xd8, 0xdc, 0x66, 0xba, 0xd6, 0x65, 0x83, 0x79, 0x95, 0x78, 0x9c, 0x7a, 0xee, 0x9a, 0xf0, 0x91, 0xb6, 0x5a, 0xa4, 0xdb, 0xe6, 0xe1, 0x0a, 0xf4, 0xf9, 0xcb, 0x22, 0x6a, 0x96, 0x35, 0x61, 0x72, 0x6f, 0x17, 0xb2, 0xda, 0x69, 0xd5, 0xbb, 0x3f, 0xfd, 0x10, 0x61, 0x80, 0xde, 0xc2, 0x8e, 0x72, 0xdc, 0x8a, 0x31, 0xd6, 0x08, 0x44, 0x87, 0x88, 0x19, 0xdd, 0x9a, 0xf9, 0x0e, 0x65, 0x07, 0xde, 0x15, 0x66, 0x03, 0x2a, 0xac, 0x75, 0xa0, 0x3a, 0x06, 0x06, 0x4d, 0x50, 0xb0, 0x85, 0x9c, 0x43, 0x74, 0xa2, 0x49, 0x75, 0x7e, 0xec, 0x77, 0x04, 0xbd, 0xa1, 0x3c, 0x45, 0x8c, 0xc4, 0x60, 0x6e, 0x92, 0x71, 0x62, 0x92, 0xe6, 0x6e, 0xbc, 0xd3, 0x77, 0x02, 0x68, 0xd3, 0xac, 0x0a, 0xa3, 0x6b, 0x47, 0x49, 0xf1, 0xa0, 0x8f, 0x00, 0x61, 0xd2, 0xae, 0xbe, 0x12, 0x37, 0x58, 0x7a, 0xf6, 0x88, 0xad, 0xdf, 0xd6, 0xfa, 0x61, 0xe7, 0x97, 0x70, 0x1a, 0xab, 0xbb, 0xef, 0x19, 0x7a, 0x2b, 0x52, 0x1d, 0x28, 0x33, 0x3f, 0x84, 0xa8, 0xce, 0x59, 0xb4, 0xdd, 0x24, 0xb7, 0xb9, 0xae, 0x51, 0x96, 0x2f, 0x59, 0x68, 0x4a, 0x63, 0x09, 0xb7, 0x7b, 0xb5, 0xaa, 0x4d, 0x8d, 0x41, 0xfc, 0xba, 0x60, 0xbe, 0xe6, 0x16, 0x3a, 0xa5, 0x0e, 0x45, 0x01, 0x96, 0xa6, 0x78, 0xae, 0xf9, 0x89, 0xf7, 0xfe, 0xe1, 0x86, 0x1f, 0x6a, 0x35, 0xfb, 0xa6, 0x5a, 0x11, 0xa6, 0x27, 0x96, 0x6a, 0xb9, 0xda, 0xfd, 0xf1, 0x2c, 0xa2, 0x79, 0x3a, 0x57, 0x4e, 0x32, 0x1e, 0xc0, 0x18, 0x02, 0x5e, 0x32, 0x72, 0x2a, 0x88, 0x0f, 0x03, 0x43, 0x1f, 0xe6, 0xec, 0x77, 0xf6, 0x48, 0x4f, 0xf0, 0xdd, 0xd8, 0x12, 0x91, 0x7f, 0xa2, 0xe0, 0xe4, 0x8b, 0xae, 0x71, 0x54, 0x12, 0xd4, 0x0c, 0x9d, 0x31, 0xd1, 0x4a, 0x80, 0xef, 0x9b, 0x1c, 0xbb, 0x68, 0xf2, 0x0f, 0x38, 0x2c, 0x38, 0xcf, 0x85, 0xe2, 0x82, 0xea, 0x84, 0x31, 0xef, 0xd7, 0x64, 0xe0, 0x39, 0x37, 0xcf, 0x3b, 0x89, 0x5a, 0x65, 0xb9, 0x90, 0x05, 0x6a, 0xdd, 0xd3, 0x73, 0xbb, 0x5a, 0x46, 0x99, 0x07, 0x7a, 0x1d, 0xaf, 0x3b, 0xc0, 0xdf, 0xeb, 0x3e, 0xcd, 0xbc, 0x90, 0xdf, 0x80, 0x20, 0x27, 0x0c, 0x61, 0x88, 0x0c, 0x44, 0x40, 0x95, 0x2d, 0x4e, 0x19, 0x5e, 0x0f, 0x2c, 0x3b, 0x0b, 0x12, 0x4b, 0xa9, 0xa0, 0xf5, 0xfc, 0xc1, 0x16, 0x9c, 0x28, 0x1b, 0xb0, 0x11, 0x3e, 0xb4, 0x8c, 0xca, 0x71, 0x4c, 0x79, 0x2a, 0x21, 0x0c, 0x08, 0x49, 0x96, 0x6c, 0xe6, 0xf8, 0xf4, 0x54, 0x68, 0x00, 0x6b, 0x81, 0x68, 0xab, 0xaf, 0x2b, 0x50, 0x86, 0xa8, 0xe5, 0x74, 0x64, 0x6a, 0xc4, 0xa5, 0xa6, 0x67, 0xc3, 0x02, 0xba, 0xe3, 0x66, 0x12, 0xe2, 0xa9, 0x9e, 0x10, 0x37, 0xfd, 0xed, 0x86, 0xed, 0xd1, 0xca, 0x1e, 0xd8, 0x3c, 0x47, 0xb4, 0x2f, 0x27, 0xf1, 0xaf, 0x91, 0x4a, 0xf8, 0x92, 0x45, 0x57, 0x90, 0xce, 0xc6, 0x74, 0x96, 0xdb, 0x7f, 0xef, 0x77, 0x86, 0xd3, 0x2d, 0x4e, 0x8d, 0x60, 0xe4, 0x4c, 0x69, 0x85, 0x8a, 0x5d, 0x6b, 0x21, 0x0e, 0x08, 0x0a, 0x9e, 0xc5, 0x97, 0x7c, 0x2f, 0xa7, 0x79, 0x83, 0x55, 0xbb, 0xe4, 0x8a, 0xa8, 0xd0, 0xbf, 0xf0, 0xd4, 0x6e, 0xbe, 0xa4, 0xe2, 0x0c, 0xcf, 0xf2, 0xb9, 0x83, 0xb5, 0x9c, 0xe4, 0xc3, 0xf2, 0x2d, 0x95, 0xc5, 0xeb, 0x8a, 0xea, 0xc1, 0x47, 0xca, 0x70, 0xa0, 0x98, 0x47, 0xe6, 0xb4, 0x3d, 0xf5, 0x43, 0xa7, 0x87, 0xf3, 0xfa, 0xb1, 0x1a, 0x60, 0x7c, 0x0e, 0x96, 0x70, 0xfe, 0xb0, 0x77, 0xbf, 0x7d, 0x31, 0x3a, 0xe5, 0x00, 0x0b, 0xc2, 0x4a, 0x1e, 0x0b, 0xf9, 0x3c, 0xbf, 0x03, 0xba, 0x3e, 0x27, 0xc0, 0xef, 0xa3, 0x30, 0x3b, 0xf6, 0x5c, 0xd6, 0x13, 0x4a, 0x0f, 0xf9, 0x3b, 0x5f, 0x69, 0x5f, 0xf0, 0xcd, 0xb4, 0xf9, 0xef, 0xb1, 0xac, 0x67, 0xe4, 0x50, 0x8e, 0xbd, 0x25, 0xfe, 0x73, 0x88, 0xa0, 0x3f, 0xdc, 0x0c, 0x13, 0x2b, 0x8e, 0xd0, 0x7b, 0x17, 0xa0, 0x5d, 0xce, 0x71, 0xd2, 0x42, 0xec, 0xec, 0x20, 0x5b, 0xd3, 0xdd, 0x97, 0x53, 0x13, 0xe5, 0x68, 0x68, 0x83, 0xd1, 0x3b, 0x6e, 0x31, 0xbe, 0xc5, 0x17, 0x9f, 0x81, 0x9d, 0x71, 0x2c, 0x46, 0x4b, 0xb0, 0xd0, 0x76, 0xa2, 0x2e, 0x0c, 0xdf, 0x51, 0xb0, 0x21, 0x0f, 0xb4, 0xeb, 0x81, 0x00, 0xf0, 0x47, 0x83, 0xfb, 0x3e, 0xe2, 0x5a, 0xb6, 0x87, 0xd8, 0x48, 0xc0, 0x32, 0xc2, 0x0f, 0x1e, 0x3a, 0x7c, 0xa9, 0x37, 0x83, 0x2c, 0x38, 0xed, 0x6e, 0x7f, 0x40, 0x0d, 0xab, 0x36, 0x14, 0xe9, 0x4e, 0xe2, 0x8e, 0x43, 0x25, 0xeb, 0x03, 0x6d, 0x49, 0xd7, 0x76, 0xaf, 0xf4, 0xc9, 0x0c, 0xe9, 0x92, 0x48, 0xc0, 0x79, 0x1b, 0x42, 0x58, 0x5f, 0x9f, 0x51, 0x98, 0x9f, 0x23, 0x3c, 0xb5, 0xe7, 0xab, 0xc1, 0x0d, 0x72, 0x98, 0x92, 0x14, 0x2c, 0x34, 0x9d, 0x92, 0x17, 0x8c, 0x90, 0x0c, 0xed, 0x7e, 0x9d, 0x7f, 0x07, 0x12, 0x7b, 0x55, 0x7d, 0x0e, 0xad, 0x91, 0x8f, 0xc4, 0x06, 0x4d, 0x44, 0x2f, 0x6d, 0x66, 0x50, 0x3e, 0xde, 0x76, 0x3b, 0x70, 0xb1, 0x02, 0xc0, 0xa1, 0x1f, 0xf5, 0x74, 0x24, 0x02, 0x4d, 0xa8, 0x11, 0xdc, 0x15, 0x8f, 0xe0, 0x1b, 0x93, 0xa4, 0x37, 0x9b, 0xc2, 0x46, 0x01, 0x6d, 0x03, 0xa5, 0xc0, 0xd7, 0x0f, 0xe2, 0x24, 0x9b, 0x30, 0x72, 0xdc, 0x7c, 0xb1, 0xc4, 0xac, 0xff, 0x92, 0x23, 0xc0, 0x6f, 0x81, 0xdd, 0x40, 0x23, 0x06, 0xa5, 0x24, 0x04, 0xfe, 0x36, 0x4a, 0x49, 0x4a, 0x39, 0xc5, 0x85, 0xc8, 0x69, 0x79, 0xe4, 0x82, 0xf5, 0xe5, 0xb1, 0x26, 0x25, 0x3f, 0x1c, 0xb7, 0x41, 0xc6, 0x3b, 0x81, 0xaf, 0x54, 0x4e, 0x52, 0x5b, 0x32, 0x47, 0xe7, 0x5c, 0x31, 0x8a, 0xa5, 0xd4, 0xf6, 0xf1, 0x8a, 0x17, 0x96, 0x13, 0x62, 0x10, 0x63, 0xc6, 0x3e, 0xe1, 0x05, 0xe2, 0x22, 0xca, 0xcc, 0x48, 0xfe, 0x4c, 0x44, 0x23, 0xdf, 0x8e, 0x0a, 0x6e, 0x67, 0xff, 0xdf, 0xb7, 0x7b, 0x3d, 0xfb, 0x22, 0x3b, 0x36, 0xa3, 0xb0, 0x37, 0x8d, 0xfe, 0xc1, 0xdf, 0x3f, 0x25, 0xd8, 0x3c, 0x86, 0x79, 0x9f, 0xde, 0xfd, 0x39, 0x2b, 0x16, 0x05, 0x54, 0x80, 0x65, 0x68, 0x7b, 0x58, 0x33, 0x3d, 0x7b, 0x20, 0xc4, 0x0c, 0xca, 0x44, 0x69, 0x32, 0x5f, 0xac, 0xf3, 0x86, 0xc7, 0x87, 0x6d, 0x3c, 0x76, 0x47, 0x0b, 0x0a, 0x5b, 0xec, 0x5d, 0x8a, 0xb7, 0x86, 0xc8, 0xe0, 0x2e, 0xf5, 0x37, 0x9c, 0x1f, 0xf4, 0x0e, 0xe2, 0x31, 0x56, 0x60, 0xc8, 0x2e, 0x8e, 0x61, 0xff, 0x15, 0x75, 0x1e, 0xb6, 0x6a, 0x48, 0x6b, 0xbb, 0xd1, 0xf0, 0x1d, 0xe3, 0xdb, 0x87, 0x7a, 0xad, 0x20, 0x17, 0xee, 0x22, 0x8e, 0xa5, 0x00, 0xff, 0x00, 0x6e, 0x83, 0x16, 0x12, 0x70, 0x11, 0xf2, 0x34, 0x2c, 0xb5, 0xba, 0xfe, 0xab, 0xe8, 0x57, 0xc4, 0xbf, 0xbf, 0xd9, 0x69, 0x8b, 0x62, 0x17, 0x78, 0x45, 0xc0, 0x96, 0x70, 0x3b, 0x81, 0xad, 0x60, 0x14, 0x3c, 0xe6, 0xb4, 0x59, 0xeb, 0xa6, 0x4f, 0x34, 0x9c, 0x11, 0xda, 0x77, 0x69, 0x28, 0x5b, 0xdf, 0xa9, 0x34, 0x09, 0x9b, 0x68, 0x68, 0x5f, 0x08, 0x15, 0xc2, 0x6f, 0xbf, 0x7b, 0x32, 0x79, 0xd1, 0xf3, 0xfe, 0xbc, 0x51, 0xd7, 0x65, 0x8c, 0x13, 0x39, 0x83, 0xa5, 0xb4, 0xd5, 0x74, 0xbf, 0xda, 0x45, 0xbc, 0x62, 0xbd, 0x74, 0xe6, 0xfc, 0xe7, 0x55, 0x6c, 0x31, 0x38, 0xd5, 0xd7, 0x72, 0x2c, 0x0e, 0x27, 0xd1, 0x61, 0xbd, 0x75, 0x13, 0x53, 0xf6, 0xd7, 0x07, 0x6a, 0x16, 0x84, 0x17, 0x38, 0xfa, 0x39, 0x1d, 0xfb, 0x6e, 0xdb, 0x78, 0x6a, 0xe8, 0x5d, 0x5e, 0xae, 0x77, 0xe4, 0x73, 0xae, 0xf6, 0x29, 0x9b, 0x8f, 0x85, 0x1f, 0x0d, 0x7b, 0x3a, 0xd7, 0xaa, 0xa2, 0x13, 0xa0, 0x8c, 0x7f, 0x2f, 0x72, 0xe1, 0x5d, 0x3e, 0x8d, 0xfa, 0x19, 0x37, 0x5d, 0x9f, 0x29, 0x49, 0xa1, 0xa6, 0xdd, 0x13, 0xcc, 0xc4, 0xe5, 0x17, 0xab, 0xa2, 0x14, 0x6c, 0x49, 0x33, 0x64, 0xb4, 0x10, 0x46, 0x39, 0x4e, 0x30, 0x57, 0xea, 0xcd, 0x45, 0xab, 0x7d, 0xa8, 0x34, 0x9c, 0xb2, 0x32, 0x55, 0x31, 0x44, 0xcd, 0xd8, 0xf1, 0x6b, 0x5b, 0x61, 0xf9, 0xa5, 0xf6, 0xf6, 0x4d, 0xb6, 0xe1, 0x1b, 0x6c, 0xed, 0xbe, 0x3b, 0x27, 0xaa, 0x01, 0x4a, 0xb2, 0x1d, 0xa4, 0xa9, 0xfc, 0x50, 0x1d, 0x4a, 0x3c, 0x68, 0x8d, 0x14, 0xcc, 0x28, 0x3a, 0x89, 0x3b, 0xb6, 0x3f, 0xa6, 0x9e, 0xa2, 0x82, 0x0a, 0x26, 0x24, 0xe7, 0x5b, 0xf8, 0xa5, 0xc3, 0xe6, 0x38, 0x81, 0x94, 0x85, 0x67, 0x0c, 0xef, 0xc6, 0xf0, 0xd3, 0xb9, 0x49, 0xfd, 0x24, 0x9a, 0x6a, 0x8f, 0xd0, 0xaf, 0x20, 0xce, 0x2f, 0x7f, 0x25, 0x9e, 0x65, 0x31, 0x58, 0x72, 0xe4, 0xfc, 0x5f, 0x65, 0x32, 0xde, 0x90, 0x87, 0xed, 0x91, 0x12, 0x74, 0x0c, 0xbb, 0x3f, 0x2c, 0x67, 0x65, 0x4d, 0x1e, 0x7a, 0xae, 0x2e, 0x86, 0x65, 0xc0, 0xb4, 0xf9, 0x38, 0x04, 0xf9, 0x3e, 0x6e, 0x92, 0xfe, 0x60, 0xb7, 0xec, 0x92, 0x01, 0xfb, 0xeb, 0x76, 0xf1, 0x9b, 0xf9, 0xbe, 0x00, 0xfa, 0x81, 0x7a, 0x10, 0x3c, 0xa4, 0x96, 0x6e, 0x4d, 0x2e, 0xff, 0x62, 0x25, 0xc8, 0x07, 0x04, 0x4b, 0x6f, 0x0b, 0x52, 0x98, 0x24, 0x53, 0x80, 0x3e, 0xe5, 0x39, 0x8f, 0x09, 0xdd, 0x8e, 0x21, 0xe4, 0xd8, 0x39, 0x8c, 0x9e, 0xf9, 0x21, 0x2d, 0xee, 0xaf, 0x4e, 0xff, 0xb5, 0xe5, 0x4b, 0x6b, 0x84, 0x79, 0xce, 0x62, 0x5e, 0xf0, 0x9a, 0xaa, 0xbf, 0x68, 0xa5, 0x75, 0xdc, 0xcd, 0x76, 0x38, 0x2d, 0x50, 0xd2, 0xba, 0x29, 0x15, 0x97, 0x6c, 0x51, 0x2c, 0xe8, 0xf8, 0x6f, 0xc3, 0x8a, 0x1c, 0x20, 0x9a, 0x8e, 0xb9, 0x90, 0xb7, 0x31, 0x27, 0x85, 0x5a, 0x00, 0xcc, 0x9f, 0x33, 0x40, 0xed, 0xde, 0xd3, 0x8c, 0xc3, 0x64, 0x61, 0xc0, 0xd2, 0x7c, 0x8e, 0x16, 0x76, 0xdc, 0xca, 0x8f, 0xbf, 0x27, 0xb9, 0x95, 0x7e, 0xb6, 0xe0, 0xde, 0xa0, 0x98, 0xa5, 0x93, 0xbb, 0xd7, 0x76, 0xb2, 0xe7, 0xfd, 0x48, 0xb1, 0xcf, 0xd7, 0x43, 0x64, 0x08, 0x79, 0xbb, 0x20, 0xa1, 0x82, 0x63, 0x21, 0xfb, 0xa2, 0xbd, 0x29, 0xda, 0x59, 0xd5, 0x6a, 0xbd, 0x01, 0x2f, 0xa6, 0x6b, 0x0e, 0xfe, 0x95, 0xcf, 0x95, 0x96, 0x87, 0x05, 0x0b, 0x24, 0x4a, 0xb5, 0x50, 0x9d, 0x4e, 0xa0, 0xeb, 0xf4, 0x07, 0x78, 0x98, 0x90, 0x93, 0xf5, 0x00, 0xfd, 0x9d, 0x25, 0xc7, 0xe2, 0x81, 0x04, 0xcb, 0x33, 0xb0, 0x4c, 0xab, 0xa7, 0x57, 0x8e, 0x87, 0x6d, 0x3b, 0x82, 0x07, 0x1b, 0xe7, 0x9c, 0x9f, 0xe7, 0x0a, 0xdf, 0x11, 0x19, 0x1b, 0xf6, 0x33, 0xc0, 0x3e, 0x81, 0xf2, 0xa4, 0x6b, 0xad, 0x97, 0x7d, 0xcd, 0x07, 0x49, 0x62, 0x68, 0x92, 0xd3, 0x84, 0xff, 0x16, 0xa8, 0x1c, 0x35, 0xbc, 0x24, 0xa2, 0xf2, 0xd8, 0x15, 0x40, 0x08, 0x06, 0x7a, 0x86, 0x17, 0x78, 0x8b, 0x5f, 0xae, 0x8e, 0xf9, 0x44, 0xb2, 0xa7, 0x76, 0xaf, 0x04, 0x38, 0x78, 0xd3, 0x5e, 0x1b, 0x3a, 0x8a, 0x7e, 0x29, 0x04, 0x8f, 0x87, 0x0a, 0xad, 0xed, 0xa4, 0x4c, 0x5e, 0xb7, 0xee, 0xb3, 0x98, 0xfa, 0x90, 0xd0, 0x79, 0xf0, 0x28, 0xd5, 0x3b, 0x76, 0x71, 0xa8, 0xfd, 0xc0, 0x20, 0x36, 0xc6, 0x4c, 0x0b, 0x0a, 0xc7, 0x14, 0x90, 0x1e, 0xe0, 0x08, 0x35, 0xf1, 0x66, 0xbb, 0x8c, 0xd9, 0x24, 0x5d, 0x5a, 0x9b, 0x9f, 0xe9, 0xf7, 0x39, 0x9f, 0x9f, 0xf8, 0x0b, 0xea, 0xb5, 0x0c, 0x11, 0x53, 0x4a, 0x24, 0x88, 0xf3, 0x9b, 0xd7, 0xbb, 0xb7, 0x79, 0x04, 0x1c, 0x1b, 0xfb, 0xb9, 0x93, 0x34, 0x70, 0x53, 0x16, 0xf4, 0x97, 0xe7, 0x7a, 0xaa, 0x13, 0xe1, 0x89, 0xc8, 0x19, 0xeb, 0x54, 0xe9, 0x6c, 0x11, 0xcb, 0x12, 0x8b, 0x22, 0x8a, 0x38, 0x28, 0x59, 0xf6, 0x03, 0xdd, 0x3c, 0x89, 0xd2, 0x1b, 0xc5, 0x6a, 0xff, 0x63, 0xc0, 0x41, 0x64, 0xb8, 0x74, 0x49, 0x1e, 0x54, 0x85, 0xa7, 0x90, 0x9a, 0x19, 0xfa, 0xab, 0x4c, 0x3a, 0x33, 0x6d, 0xfe, 0x7c, 0xa7, 0xa8, 0xca, 0xdf, 0x62, 0x05, 0x46, 0xf6, 0xbe, 0x48, 0xb3, 0x49, 0x35, 0xd6, 0x77, 0xf9, 0x74, 0x74, 0xce, 0xa2, 0xb0, 0x51, 0xbc, 0x85, 0x3d, 0x47, 0x46, 0xe7, 0x5d, 0x5e, 0xe1, 0xb4, 0x56, 0x92, 0x2b, 0x68, 0xc7, 0xd6, 0xd9, 0x2f, 0x3b, 0x58, 0xf0, 0x4b, 0xff, 0x07, 0x39, 0xb7, 0x31, 0x53, 0xee, 0x0a, 0x1a, 0x33, 0xba, 0x9d, 0xbe, 0x6d, 0xe1, 0xf0, 0xb0, 0x12, 0xba, 0x4a, 0x2b, 0x47, 0x66, 0xa0, 0x5f, 0x4b, 0xbc, 0xb8, 0x09, 0xb6, 0x83, 0x8f, 0x46, 0xff, 0xe4, 0xf7, 0xa9, 0x41, 0x1e, 0x84, 0x8b, 0x3f, 0x7c, 0xa9, 0xa2, 0xa5, 0x85, 0x1f, 0xd6, 0x91, 0x72, 0x86, 0x4f, 0x51, 0xe5, 0x4f, 0xd3, 0x6f, 0xd7, 0xd9, 0x4f, 0xea, 0xd2, 0xda, 0xb3, 0xc7, 0x61, 0x01, 0x03, 0xc8, 0xc6, 0xda, 0xab, 0x7c, 0xea, 0xf1, 0x14, 0x78, 0x9a, 0x3a, 0x74, 0xe3, 0xef, 0xb0, 0xea, 0x38, 0x0e, 0x3d, 0xca, 0x47, 0x12, 0xda, 0x36, 0x7d, 0x47, 0xf7, 0xee, 0x66, 0x99, 0x1d, 0x68, 0x70, 0x4c, 0xd2, 0x24, 0xf2, 0xed, 0xbd, 0x3a, 0x6c, 0x88, 0x0a, 0x35, 0x11, 0x1b, 0x10, 0x23, 0x82, 0x4b, 0x31, 0xed, 0xdd, 0x56, 0x02, 0xe5, 0xf6, 0x49, 0xac, 0x9e, 0xe4, 0x73, 0x93, 0x00, 0xc0, 0x19, 0x35, 0x9b, 0xa9, 0x6b, 0x54, 0x3c, 0x0b, 0xb7, 0x57, 0xbe, 0x21, 0xdd, 0xee, 0x23, 0xb9, 0x03, 0xf5, 0xe4, 0x38, 0x89, 0x9b, 0x84, 0xdd, 0x3f, 0xc3, 0x6b, 0x4a, 0xd6, 0xaa, 0xf2, 0x40, 0x95, 0xca, 0xbb, 0xaa, 0x4d, 0xff, 0x43, 0xdd, 0x8f, 0xe9, 0xba, 0x1e, 0x1c, 0x91, 0x12, 0x64, 0x9d, 0x4f, 0x56, 0x60, 0x95, 0xeb, 0x3d, 0xbb, 0x93, 0x02, 0xff, 0x9f, 0xac, 0xab, 0x67, 0x78, 0x28, 0x5b, 0x29, 0xfc, 0x7c, 0x06, 0x77, 0x69, 0x79, 0x87, 0xcf, 0x0d, 0xc2, 0x42, 0x17, 0x0c, 0x83, 0x08, 0xeb, 0x5e, 0x60, 0x3b, 0x36, 0x17, 0xac, 0x32, 0xff, 0xeb, 0xdc, 0xde, 0x86, 0xf1, 0x3b, 0xae, 0x90, 0xa7, 0xdf, 0xb1, 0xff, 0x37, 0xdb, 0xfb, 0xa5, 0xf8, 0xb6, 0x49, 0x5a, 0x38, 0x1c, 0xe8, 0x4c, 0x39, 0xd4, 0xd2, 0x97, 0x79, 0xf2, 0x1b, 0x16, 0x36, 0x4e, 0x8b, 0x78, 0x32, 0x34, 0x8d, 0x96, 0xb4, 0x5d, 0x47, 0x03, 0xcf, 0x1e, 0x0b, 0xe5, 0xe6, 0xe0, 0xee, 0x04, 0x70, 0xd0, 0xb6, 0x21, 0xf9, 0xd8, 0xfa, 0x89, 0x69, 0xcd, 0x84, 0xea, 0x89, 0xea, 0xfa, 0x64, 0xc3, 0x7d, 0xbe, 0xe3, 0x2a, 0xe0, 0x12, 0xad, 0xba, 0xab, 0x80, 0x37, 0xe0, 0x28, 0x79, 0x3d, 0x3d, 0x07, 0x3c, 0x11, 0xa7, 0x53, 0xf9, 0x34, 0x70, 0xa5, 0x36, 0x23, 0xeb, 0x98, 0x73, 0x73, 0x2d, 0x7c, 0x09, 0x20, 0x11, 0x4f, 0x58, 0x23, 0x7f, 0xe9, 0x21, 0x42, 0xed, 0x76, 0x31, 0x2c, 0x25, 0x29, 0x40, 0xc5, 0x49, 0x2f, 0x18, 0xbf, 0x15, 0xe2, 0xfa, 0x6a, 0x65, 0x40, 0x3d, 0xcd, 0xf7, 0x9b, 0x38, 0xf5, 0x71, 0x91, 0x62, 0x8d, 0xa6, 0x3f, 0xb8, 0xaf, 0x15, 0xb2, 0x5f, 0xfa, 0xb2, 0x9e, 0x8b, 0xe5, 0xea, 0x53, 0x9f, 0x52, 0xe1, 0xec, 0x96, 0x67, 0xfe, 0xca, 0xa1, 0x99, 0xa9, 0x41, 0x11, 0x09, 0x53, 0x90, 0x78, 0x14, 0xb7, 0x17, 0x0b, 0x25, 0x60, 0xc4, 0x4b, 0xce, 0x6c, 0xcf, 0xe5, 0x18, 0x8f, 0xa7, 0xd6, 0x17, 0x5b, 0x2c, 0xd2, 0xc1, 0xbe, 0x1e, 0xe7, 0x00, 0xcc, 0xd5, 0x5e, 0x05, 0xbe, 0x33, 0xe2, 0xe0, 0x3b, 0xd8, 0xe4, 0x4d, 0xd7, 0x94, 0x3d, 0xd1, 0xda, 0x22, 0x15, 0x06, 0x42, 0x13, 0x04, 0x33, 0x0b, 0x08, 0x78, 0x20, 0xad, 0x24, 0x57, 0x29, 0xe7, 0xc1, 0xe5, 0x90, 0xbb, 0x62, 0xe7, 0x18, 0xba, 0xe9, 0x09, 0xcf, 0x81, 0x0b, 0x7d, 0x2b, 0x84, 0x00, 0xe5, 0x58, 0x0a, 0x7f, 0x73, 0xd1, 0x79, 0xe9, 0x4e, 0x2e, 0xd4, 0xc5, 0x38, 0x3c, 0x82, 0x6c, 0x6f, 0x53, 0x51, 0x05, 0xd0, 0xe4, 0xba, 0xb4, 0x42, 0x52, 0x67, 0x0f, 0x52, 0x03, 0xf2, 0xd2, 0x1b, 0xb6, 0xf0, 0xd3, 0x69, 0x17, 0x2e, 0x38, 0x1e, 0x90, 0x3a, 0xe7, 0xd4, 0x63, 0x25, 0x3e, 0xc3, 0xf6, 0x88, 0x05, 0xe5, 0x6d, 0xc5, 0xa0, 0x59, 0x7e, 0x8f, 0x89, 0x06, 0x81, 0xad, 0xfe, 0x80, 0xc7, 0xfa, 0xf7, 0x2f, 0x2d, 0xb1, 0x5b, 0xae, 0xf1, 0xe7, 0x73, 0x71, 0xc4, 0x59, 0x9f, 0xab, 0x20, 0x68, 0x48, 0x6e, 0xdb, 0x62, 0x15, 0x14, 0xfd, 0x03, 0x62, 0xdf, 0xcf, 0x3c, 0xee, 0xdc, 0x34, 0x32, 0xd3, 0x0d, 0x3c, 0x8a, 0xbc, 0xc6, 0xf7, 0xe4, 0x52, 0x58, 0x87, 0xa5, 0xf7, 0xed, 0x79, 0xfa, 0xb7, 0xb3, 0x56, 0x1a, 0x7b, 0x3d, 0x74, 0xcb, 0x80, 0x26, 0x12, 0x27, 0x08, 0xf7, 0xa4, 0xa0, 0x50, 0x4a, 0x6c, 0x42, 0xc1, 0x30, 0x4a, 0x38, 0x6a, 0xd1, 0xd5, 0x92, 0xae, 0x52, 0xaa, 0x45, 0x3a, 0xfc, 0x05, 0x73, 0x3b, 0x9a, 0x8e, 0xed, 0xcd, 0x22, 0x75, 0xf7, 0xb6, 0x98, 0xc0, 0x4b, 0x54, 0x30, 0xe4, 0x60, 0xd4, 0xb3, 0x93, 0xeb, 0xa5, 0x23, 0xd6, 0xa7, 0x2c, 0xa2, 0x5b, 0x51, 0xba, 0x90, 0x10, 0xf7, 0xbb, 0xf4, 0xf1, 0x73, 0x30, 0x1d, 0x1d, 0x33, 0x5f, 0x89, 0x30, 0x3b, 0xc8, 0x05, 0xcd, 0x6c, 0x5c, 0x16, 0x7a, 0x06, 0xea, 0x98, 0xb1, 0x6c, 0xda, 0xa5, 0x33, 0x27, 0x1d, 0xb8, 0xa0, 0x2e, 0x64, 0x12, 0x45, 0x64, 0x90, 0x5d, 0x35, 0x63, 0x6a, 0x90, 0x9b, 0x78, 0x95, 0x12, 0x4e, 0xee, 0xc1, 0x22, 0xa6, 0x90, 0x20, 0x76, 0x8f, 0x69, 0x1e, 0x22, 0xdb, 0xce, 0x4d, 0xbc, 0xdd, 0x9f, 0x9e, 0xbe, 0x33, 0xc9, 0xd7, 0x2b, 0xe3, 0x0f, 0x41, 0x76, 0xaa, 0x0b, 0xa1, 0x9f, 0x90, 0x6f, 0x6a, 0x9f, 0xc0, 0x91, 0x31, 0x06, 0x97, 0x27, 0x61, 0xe3, 0xfb, 0x4e, 0x30, 0xe4, 0xee, 0xd2, 0xd2, 0xbe, 0x62, 0xa9, 0xec, 0xcf, 0x4f, 0xc0, 0x4b, 0x02, 0x04, 0xfb, 0xd6, 0xf4, 0xbb, 0x77, 0xc1, 0x55, 0x6f, 0x12, 0x04, 0x90, 0xf2, 0x2d, 0x0c, 0xae, 0x3a, 0xb0, 0xb0, 0x77, 0xfb, 0x4f, 0x66, 0xdb, 0x7c, 0x0c, 0xb7, 0x91, 0xa3, 0xfd, 0xf0, 0xfe, 0x51, 0x50, 0x1b, 0x58, 0xf6, 0x8c, 0x2d, 0x0b, 0x5c, 0x19, 0x81, 0x5c, 0xc7, 0x03, 0x85, 0x4c, 0x40, 0xfb, 0xb4, 0xbf, 0x2e, 0x9f, 0xc4, 0xdd, 0x26, 0xfb, 0x20, 0xb9, 0x04, 0x4f, 0x98, 0x30, 0x3b, 0x12, 0x57, 0x15, 0x69, 0x38, 0x16, 0x8b, 0x2f, 0xb1, 0x90, 0xb1, 0x3f, 0x32, 0x36, 0x85, 0xb6, 0x37, 0x23, 0x02, 0xad, 0x49, 0x52, 0x8c, 0x0a, 0x7c, 0x0f, 0x8e, 0x9c, 0x3d, 0xab, 0x62, 0x68, 0x4a, 0x74, 0x71, 0x3d, 0x02, 0xe4, 0x9b, 0x8f, 0xdf, 0x19, 0xd9, 0x82, 0x41, 0x85, 0x20, 0x44, 0x6d, 0xe7, 0x89, 0xa0, 0xd5, 0x7a, 0xb0, 0xd0, 0x9a, 0x6c, 0x59, 0x93, 0x4f, 0x91, 0x5a, 0x80, 0x00, 0x59, 0xb5, 0x9a, 0x72, 0x00, 0x04, 0x24, 0xad, 0x04, 0x1a, 0xb7, 0xb8, 0xdc, 0xe7, 0x91, 0xa4, 0xe7, 0x9c, 0x30, 0xcb, 0xa3, 0x10, 0x20, 0x5a, 0x1f, 0x62, 0x11, 0x0d, 0xb3, 0xe1, 0x2c, 0x3a, 0xee, 0x28, 0xa7, 0x11, 0xd0, 0x8d, 0x97, 0x22, 0x39, 0xbd, 0x06, 0x20, 0xa2, 0xa0, 0x46, 0xe4, 0x0b, 0x83, 0x84, 0xb4, 0x34, 0x75, 0xa0, 0xc6, 0x10, 0xf1, 0x3d, 0x00, 0x77, 0xbe, 0x14, 0x02, 0x1b, 0x14, 0x8d, 0x66, 0xbd, 0x00, 0x90, 0x46, 0xa1, 0x09, 0x98, 0xff, 0x3f, 0x14, 0x0a, 0x35, 0x3b, 0x85, 0xc6, 0x18, 0x97, 0xa7, 0xfb, 0xe5, 0x28, 0x4e, 0x3f, 0xaf, 0x46, 0xbb, 0xdf, 0x5f, 0xc8, 0xbf, 0x73, 0xfa, 0x30, 0x24, 0xb6, 0x22, 0x22, 0x48, 0x95, 0xe0, 0x1b, 0x0b, 0x86, 0xa0, 0x5f, 0xeb, 0x1b, 0x7d, 0x33, 0x6e, 0xd7, 0xbf, 0x4d, 0xc1, 0x40, 0xa2, 0x89, 0x9e, 0x35, 0x5a, 0xdd, 0x72, 0x82, 0x53, 0x8f, 0xc0, 0xb2, 0xbd, 0xa5, 0xc0, 0x25, 0x48, 0x9e, 0x4d, 0x62, 0x2c, 0x5f, 0xfe, 0xad, 0x6d, 0x70, 0x92, 0xdd, 0x5d, 0x68, 0x91, 0x68, 0x62, 0xa6, 0x30, 0xc0, 0xf9, 0x42, 0x75, 0xe2, 0xfb, 0x43, 0x9d, 0x2b, 0x20, 0x13, 0xbb, 0x6e, 0xc1, 0x30, 0xa1, 0x45, 0xe2, 0x23, 0x03, 0xa4, 0x6f, 0xb6, 0xda, 0xb4, 0xc6, 0x62, 0x07, 0xde, 0x76, 0x07, 0x39, 0x25, 0x46, 0xe0, 0x10, 0xba, 0x7a, 0xb5, 0x83, 0xca, 0x51, 0x52, 0x7f, 0x9b, 0xd2, 0x39, 0xd0, 0xd7, 0xc8, 0x94, 0x45, 0x28, 0x0c, 0x6d, 0x0f, 0x04, 0x02, 0x21, 0x6b, 0xcb, 0x66, 0x12, 0x81, 0x0f, 0x49, 0x9d, 0x8b, 0x32, 0x56, 0x4c, 0x39, 0x37, 0x5a, 0x4c, 0x54, 0xd2, 0x04, 0x21, 0xa3, 0xc1, 0xe9, 0x98, 0x0b, 0x5f, 0xca, 0xfd, 0xf9, 0x77, 0x1a, 0x8f, 0x05, 0x56, 0xbb, 0x31, 0xcf, 0x24, 0x09, 0x62, 0x2d, 0x74, 0x19, 0x6f, 0x89, 0x19, 0x42, 0xe7, 0x84, 0x3b, 0xdd, 0x50, 0xdf, 0xab, 0x4a, 0x18, 0x9c, 0x74, 0x34, 0xcf, 0x60, 0xb3, 0x15, 0x93, 0x1c, 0xa8, 0xfc, 0xcb, 0xec, 0x0c, 0x8e, 0x18, 0x40, 0xa5, 0x4a, 0x88, 0x39, 0x19, 0x12, 0x0d, 0x56, 0x00, 0xe7, 0x2e, 0x4f, 0x3c, 0xf5, 0xfd, 0x41, 0x8d, 0xcf, 0x49, 0x0c, 0x60, 0xfb, 0x14, 0xf9, 0xe8, 0xb1, 0x47, 0xa1, 0x70, 0xe0, 0xa5, 0x0a, 0xf0, 0x72, 0xfe, 0x12, 0xde, 0xd1, 0xa5, 0x11, 0x46, 0xaa, 0x24, 0xba, 0x1d, 0xf1, 0x2d, 0x42, 0xd3, 0x25, 0xd4, 0xc5, 0x27, 0xd5, 0xfc, 0xe5, 0x3f, 0x63, 0x0f, 0xb4, 0xf8, 0x08, 0xf3, 0xd4, 0x7b, 0x18, 0x39, 0xdc, 0x11, 0x87, 0x97, 0xfe, 0x38, 0xad, 0x98, 0xe7, 0xf6, 0x46, 0x92, 0xe7, 0x6d, 0xbd, 0xd9, 0x52, 0xb0, 0xaa, 0x32, 0x26, 0xd5, 0x99, 0x8a, 0xed, 0x4b, 0x0d, 0xe8, 0xe5, 0x6e, 0xc4, 0xa1, 0x5f, 0x59, 0x3d, 0xcb, 0x65, 0xfb, 0x78, 0xf3, 0x9f, 0x6e, 0xfd, 0x13, 0x78, 0x83, 0x1f, 0xbe, 0x7c, 0xa2, 0x82, 0x9e, 0x04, 0xd1, 0xdb, 0x20, 0x16, 0x12, 0xf7, 0x6e, 0x87, 0xf2, 0xff, 0x9e, 0x62, 0x5f, 0xfa, 0x28, 0x8e, 0xba, 0x93, 0x9e, 0xaa, 0x2d, 0x1c, 0x97, 0x3c, 0x3f, 0xd4, 0xed, 0x0b, 0xa5, 0x65, 0x28, 0xc9, 0x5b, 0xb1, 0x39, 0xf5, 0xf4, 0xce, 0x6c, 0x00, 0x2f, 0x4f, 0x98, 0xaf, 0xca, 0xc6, 0x98, 0xc0, 0x9b, 0x87, 0xff, 0xd0, 0xdc, 0xae, 0x08, 0x7c, 0xc7, 0x63, 0xcc, 0xc7, 0x63, 0x5c, 0xb8, 0xbb, 0x9d, 0xa4, 0x3d, 0x54, 0x9a, 0x9b, 0xc9, 0x99, 0x4c, 0x3f, 0xf7, 0x0c, 0x43, 0xa9, 0x03, 0x44, 0xc6, 0xda, 0x80, 0xd9, 0x23, 0xb8, 0x4d, 0x80, 0x43, 0x54, 0xc5, 0x77, 0x81, 0x6e, 0x36, 0x24, 0xbc, 0x3b, 0x94, 0xf9, 0xab, 0x66, 0x6f, 0x9a, 0x71, 0x54, 0x23, 0x42, 0x72, 0xac, 0x4f, 0x63, 0x64, 0x17, 0x88, 0x8c, 0xa9, 0x44, 0x4e, 0x90, 0xdc ],
+    const [ 0xcb, 0x70, 0x90, 0xf7, 0xa4, 0x65, 0x78, 0x2f, 0x68, 0x0f, 0xd4, 0x4c, 0xbc, 0x55, 0x81, 0x07, 0x82, 0x5c, 0x9e, 0x53, 0xf2, 0x4e, 0x41, 0x40, 0xec, 0x5b, 0x68, 0x20, 0x8c, 0xfe, 0x33, 0xe8, 0x00, 0x82, 0x50, 0xd9, 0x96, 0xc4, 0xb6, 0x5f, 0x19, 0x3a, 0x96, 0x39, 0x5e, 0x34, 0x8e, 0xda, 0x1a, 0x62, 0x21, 0x0f, 0xf6, 0x97, 0x64, 0xe3, 0xe6, 0xcc, 0xf9, 0xc0, 0xb6, 0x68, 0x41, 0xd6, 0xe6, 0xbf, 0xce, 0xc0, 0xb7, 0xd8, 0x17, 0x65, 0x86, 0x73, 0x70, 0x1d, 0x59, 0x4a, 0x39, 0x16, 0xb8, 0x98, 0x55, 0xf5, 0xbe, 0xd8, 0xde, 0xc0, 0x6f, 0xcf, 0x16, 0xfb, 0x4c, 0xcc, 0xa1, 0x11, 0x25, 0x2f, 0xf2, 0xf6, 0x2f, 0x28, 0x04, 0x0b, 0x56, 0xc1, 0x4a, 0x42, 0xd4, 0x1f, 0xe8, 0x82, 0x03, 0x04, 0x23, 0x4d, 0x6f, 0x99, 0x16, 0xa0, 0x30, 0x6b, 0xa7, 0x1a, 0x77, 0xb3, 0xba, 0x61, 0x66, 0xda, 0xa5, 0xc2, 0x25, 0x3c, 0xe3, 0x17, 0x32, 0x2d, 0x0c, 0xee, 0xf8, 0x39, 0x04, 0xe7, 0xa4, 0xb0, 0x73, 0x5e, 0x34, 0x63, 0x76, 0x4a, 0xd0, 0xa8, 0x95, 0x65, 0x5e, 0xa4, 0xf4, 0x8e, 0x51, 0xc9, 0xcd, 0x6b, 0xc1, 0x9d, 0x1d, 0x52, 0xc1, 0xbd, 0x9e, 0x6a, 0xed, 0x22, 0xf6, 0x0d, 0x42, 0xa4, 0x2e, 0x71, 0x33, 0xbc, 0x65, 0x88, 0xf8, 0x8e, 0xc6, 0x24, 0x2a, 0x27, 0xb7, 0x5f, 0x8d, 0x03, 0x53, 0x3a, 0x2d, 0xd2, 0x1b, 0x84, 0xac, 0x7b, 0xe8, 0xfe, 0xda, 0x62, 0x25, 0xbc, 0x86, 0xe7, 0x3a, 0xce, 0x94, 0x2f, 0x4b, 0x20, 0x50, 0x26, 0x23, 0x9f, 0x02, 0xc4, 0x6b, 0x9d, 0xc3, 0x90, 0x20, 0x77, 0x8e, 0x63, 0x44, 0x75, 0x9a, 0x6f, 0xd3, 0xf1, 0xe7, 0x7f, 0xf8, 0xbc, 0x17, 0x80, 0x81, 0xbd, 0x80, 0x41, 0x91, 0xdb, 0x7f, 0x77, 0x94, 0x1e, 0x0f, 0x04, 0x78, 0x10, 0x9a, 0x79, 0x1b, 0x6a, 0x0f, 0xd9, 0xff, 0xec, 0x34, 0xa0, 0x45, 0x8d, 0x3e, 0x03, 0xd9, 0xd4, 0x9f, 0x7a, 0xea, 0x86, 0x1f, 0x7c, 0x9d, 0x81, 0x2e, 0x89, 0x02, 0xe8, 0x78, 0x6e, 0x47, 0x80, 0xbb, 0xc5, 0x2b, 0x5a, 0xd5, 0xbb, 0xb6, 0xb3, 0x22, 0x16, 0x27, 0x18, 0x04, 0x76, 0x2f, 0xce, 0xc3, 0xda, 0x5c, 0x70, 0x98, 0x67, 0xd8, 0xda, 0x04, 0x65, 0x53, 0x46, 0x66, 0x8b, 0x3e, 0xb5, 0xcd, 0x7c, 0x3a, 0x91, 0x0b, 0x91, 0xd0, 0x90, 0x0b, 0xd9, 0x62, 0xdb, 0x64, 0x5e, 0x61, 0x70, 0x2d, 0xaa, 0xc1, 0xc4, 0x14, 0x8a, 0xaa, 0xad, 0xaa, 0x12, 0x71, 0x80, 0x01, 0xe1, 0xc6, 0x76, 0x79, 0xa7, 0x2f, 0x55, 0xd7, 0xe4, 0xb5, 0x4c, 0x97, 0xf2, 0xdc, 0x1e, 0x84, 0x45, 0xd9, 0x83, 0x85, 0xf2, 0x00, 0xcb, 0xba, 0x6e, 0x7c, 0xc4, 0xc7, 0x98, 0x42, 0xde, 0x70, 0xfa, 0x48, 0x8d, 0x67, 0x4c, 0xf1, 0xef, 0x61, 0x3a, 0xcc, 0xaf, 0x6f, 0x68, 0x7f, 0x29, 0x8c, 0xb2, 0xfe, 0xce, 0x72, 0xb8, 0x01, 0xca, 0xb3, 0x9a, 0xb4, 0xe5, 0x04, 0x00, 0xb0, 0xa7, 0xdc, 0x5e, 0x2a, 0xc0, 0x3e, 0x76, 0x6a, 0xa7, 0xd2, 0x1e, 0x7f, 0x80, 0x3b, 0x43, 0x32, 0x43, 0xa5, 0x2e, 0x38, 0x1b, 0x9d, 0x06, 0xac, 0x0c, 0x26, 0x96, 0xbc, 0xd9, 0x09, 0x51, 0xa2, 0x25, 0x6c, 0x93, 0xd6, 0xd8, 0xa6, 0x2a, 0x81, 0xc4, 0x52, 0x15, 0x35, 0x89, 0xa2, 0x8b, 0xdc, 0xb5, 0xf7, 0x40, 0xef, 0x30, 0xae, 0xe3, 0xe9, 0xd8, 0x3c, 0xeb, 0xfa, 0x68, 0x7d, 0x93, 0xff, 0x9e, 0x49, 0x23, 0xb2, 0x9d, 0x49, 0x72, 0x1e, 0x90, 0x08, 0xa9, 0x57, 0x90, 0x4d, 0x49, 0x67, 0xc8, 0xa9, 0x70, 0x8b, 0xd6, 0x4c, 0x58, 0xa0, 0x75, 0x1c, 0x20, 0xd8, 0x59, 0x09, 0xcf, 0xb1, 0x5b, 0x9a, 0x96, 0x28, 0xd6, 0xcc, 0x55, 0x29, 0x51, 0x1d, 0x61, 0x4b, 0x5e, 0xe4, 0x85, 0xba, 0xc1, 0xe3, 0x46, 0x74, 0xd5, 0x1f, 0x6b, 0xb9, 0x2c, 0xf0, 0xbd, 0xbc, 0x76, 0x54, 0x0c, 0x9f, 0xa4, 0x88, 0x72, 0x9e, 0x4d, 0xda, 0xdc, 0x8b, 0x50, 0xb9, 0xc5, 0x7a, 0xbb, 0x0e, 0x45, 0xbd, 0xeb, 0xcf, 0x4b, 0x13, 0xf5, 0xd0, 0x26, 0x1c, 0x45, 0xdd, 0x4b, 0x10, 0x85, 0x07, 0x52, 0xb1, 0xc1, 0x3b, 0x41, 0x7e, 0xc8, 0x19, 0x0d, 0x2a, 0xd5, 0x02, 0x5e, 0x4c, 0x6e, 0x73, 0x93, 0x58, 0x8d, 0x92, 0x06, 0xce, 0xfe, 0x07, 0x91, 0xb1, 0x08, 0x0d, 0x51, 0x3b, 0x4f, 0xc9, 0xa9, 0xcf, 0xf9, 0xda, 0x8a, 0x2f, 0x10, 0x31, 0xf2, 0xef, 0x27, 0x23, 0xb3, 0x2a, 0x41, 0xbc, 0x76, 0x73, 0xee, 0x57, 0xff, 0x0e, 0xb7, 0x6b, 0xb3, 0x61, 0xbc, 0xa8, 0x57, 0xa5, 0x9c, 0x43, 0x1a, 0xe1, 0x95, 0x8e, 0xd6, 0x19, 0xed, 0xcb, 0x93, 0xc2, 0x90, 0x42, 0x4d, 0x7a, 0xfa, 0x91, 0xf7, 0xf6, 0x57, 0x44, 0xbf, 0x3c, 0xe9, 0xa5, 0x94, 0x12, 0xab, 0xd5, 0xe5, 0xb6, 0x34, 0x1c, 0xac, 0xcf, 0xdd, 0x7e, 0xac, 0xa4, 0x26, 0x8f, 0xf6, 0x8c, 0x56, 0x88, 0xb2, 0xa5, 0x62, 0x99, 0x1c, 0xc9, 0x10, 0x81, 0xcd, 0xbe, 0x5c, 0x5d, 0x3c, 0xad, 0x1b, 0xbd, 0x84, 0xd6, 0xde, 0xfd, 0x68, 0x81, 0x19, 0xd3, 0x94, 0x38, 0x85, 0x24, 0x25, 0x33, 0xc2, 0x1c, 0x6c, 0x14, 0x41, 0x7d, 0xef, 0xd5, 0x61, 0x37, 0xb1, 0xfe, 0xd8, 0x3a, 0xb4, 0x1b, 0x55, 0x88, 0xbb, 0x6d, 0x64, 0x8e, 0x54, 0xe0, 0x91, 0xb4, 0x16, 0x3d, 0xd0, 0x33, 0x28, 0xa1, 0x1c, 0x26, 0x03, 0x2e, 0x5f, 0xe5, 0x78, 0x00, 0x92, 0x8e, 0xf4, 0x62, 0x25, 0xe4, 0x03, 0x42, 0xa1, 0x5d, 0x13, 0xe3, 0x8c, 0x76, 0x7b, 0xd2, 0x8d, 0x4a, 0xbb, 0x1b, 0xd0, 0x63, 0x05, 0xbc, 0xac, 0xd0, 0xfd, 0x5a, 0x83, 0x77, 0xbe, 0x33, 0xea, 0xad, 0x1d, 0x54, 0x0a, 0x04, 0x31, 0x0c, 0x46, 0x64, 0x13, 0xa0, 0x1f, 0x5e, 0xe2, 0x40, 0x54, 0xbc, 0x0a, 0x3a, 0x4d, 0x5d, 0xc6, 0x6e, 0xb9, 0x40, 0xe4, 0x02, 0x77, 0xde, 0xc9, 0x57, 0xb2, 0xbd, 0xb4, 0x3b, 0x51, 0x42, 0x47, 0x60, 0x8e, 0xc7, 0x43, 0x0c, 0xe4, 0xed, 0x93, 0x13, 0x2f, 0x33, 0x8c, 0x03, 0x0f, 0xc8, 0x73, 0x9e, 0x8d, 0x9e, 0x3f, 0x8d, 0x01, 0xc0, 0xa1, 0x52, 0x33, 0xe5, 0x42, 0x7f, 0xc0, 0x45, 0x4c, 0x25, 0xbf, 0xab, 0x2b, 0x90, 0xa5, 0xcc, 0x95, 0x31, 0x66, 0xd7, 0xc7, 0xdc, 0xdd, 0x4d, 0x12, 0x34, 0x6e, 0x13, 0x97, 0x63, 0xea, 0xc6, 0x4f, 0x0e, 0xb2, 0x4e, 0x4e, 0x87, 0x20, 0xb6, 0x48, 0x45, 0x22, 0x3a, 0x54, 0x92, 0x28, 0xa2, 0xf0, 0x84, 0x41, 0xcf, 0x45, 0x2e, 0x80, 0x94, 0xad, 0x17, 0xa5, 0xc7, 0x73, 0xec, 0xf9, 0x97, 0xda, 0x71, 0x7a, 0x1f, 0x60, 0xbd, 0x38, 0x3c, 0x43, 0xa7, 0xff, 0x9c, 0x45, 0x7c, 0x36, 0x18, 0xac, 0xf3, 0x07, 0x44, 0x8e, 0x62, 0xc1, 0x44, 0x4b, 0x31, 0x7a, 0xe1, 0x5b, 0x8f, 0xf8, 0xdc, 0x4a, 0x65, 0xd2, 0x81, 0x00, 0x88, 0xd2, 0x80, 0x46, 0x33, 0x9e, 0xf9, 0x86, 0xb4, 0x97, 0xd6, 0xd2, 0x65, 0x02, 0x5d, 0x28, 0xde, 0x66, 0x05, 0xf5, 0x69, 0x34, 0x89, 0xd7, 0xb7, 0xad, 0x3c, 0xa7, 0xd1, 0x01, 0x9c, 0xb7, 0x50, 0xb4, 0x29, 0x58, 0xd1, 0x46, 0x78, 0xa0, 0xa4, 0x13, 0x83, 0x6a, 0xc4, 0x78, 0x43, 0x9d, 0x0c, 0x37, 0x81, 0xb2, 0xa7, 0x1d, 0xe9, 0x70, 0xc9, 0xe2, 0x60, 0xfa, 0x9c, 0x50, 0x97, 0x0c, 0x7e, 0xa7, 0xe0, 0x82, 0x69, 0x41, 0x41, 0x1a, 0xb2, 0x72, 0xc7, 0x7a, 0xf7, 0xb2, 0x1d, 0x75, 0x53, 0xfe, 0x5d, 0x8a, 0xd3, 0x7b, 0x26, 0xad, 0x2e, 0x5d, 0xef, 0x4b, 0xb0, 0x07, 0x9b, 0x88, 0x78, 0x73, 0x4d, 0xcb, 0xe3, 0xd5, 0x7d, 0x7c, 0x48, 0x7b, 0x4c, 0x0c, 0xe6, 0xf8, 0x14, 0x36, 0x1a, 0x81, 0x44, 0x85, 0xd6, 0x97, 0x6b, 0x17, 0x4e, 0xe7, 0x92, 0xa0, 0xf4, 0x6e, 0xcf, 0xb1, 0xa7, 0xe0, 0x17, 0x3b, 0x27, 0x4b, 0x54, 0x4f, 0xcd, 0xf7, 0xb7, 0x27, 0x79, 0x92, 0x50, 0x6a, 0xcb, 0x89, 0xdc, 0xac, 0x96, 0xb9, 0xde, 0x34, 0x91, 0x47, 0xf1, 0x03, 0x50, 0xcc, 0x5c, 0x12, 0x73, 0xb6, 0xe7, 0xda, 0x1e, 0xeb, 0xed, 0x19, 0xa9, 0xaf, 0xb3, 0xd4, 0x98, 0xc7, 0xf8, 0x98, 0xcd, 0xde, 0xcd, 0x06, 0xfc, 0x29, 0xa7, 0x8f, 0x60, 0x47, 0xb3, 0x7b, 0xac, 0x6b, 0x69, 0x30, 0x45, 0xbc, 0x64, 0xb1, 0xae, 0xfc, 0x71, 0x65, 0x43, 0x68, 0xe6, 0x1a, 0x2b, 0xe0, 0x35, 0x49, 0x88, 0x48, 0xc0, 0x9b, 0xf0, 0x2e, 0xef, 0xad, 0x21, 0xad, 0x80, 0x10, 0xf0, 0x91, 0x1f, 0x95, 0x83, 0xbb, 0x37, 0xc7, 0xc0, 0xc8, 0x07, 0xb8, 0x05, 0xed, 0xf8, 0x01, 0x1a, 0x25, 0x2e, 0x04, 0x64, 0x8f, 0x5d, 0x74, 0x5b, 0x11, 0xde, 0x18, 0x3e, 0x42, 0x02, 0xcb, 0x05, 0x87, 0xa6, 0xc8, 0x97, 0x7c, 0x07, 0x24, 0x3d, 0x95, 0xd8, 0x9c, 0x56, 0x05, 0x92, 0x91, 0x4d, 0xde, 0x0c, 0x51, 0xc9, 0x7a, 0x4b, 0x98, 0x23, 0x1b, 0x9b, 0x57, 0x1d, 0xce, 0xde, 0xb3, 0xd1, 0x95, 0x25, 0x51, 0xe7, 0xc4, 0x7d, 0xd1, 0x0b, 0xac, 0x0c, 0x98, 0x9e, 0x77, 0x5c, 0xd3, 0xac, 0x53, 0xf6, 0xb8, 0x1f, 0xd3, 0x33, 0x0f, 0x32, 0x91, 0x4f, 0xf2, 0x28, 0x19, 0xbf, 0xd1, 0x3d, 0x02, 0xc4, 0xb9, 0xdd, 0x5e, 0x41, 0xd5, 0x14, 0x55, 0xca, 0x35, 0x46, 0x0c, 0xfd, 0xce, 0x20, 0xcc, 0x15, 0xc2, 0xce, 0x60, 0xbc, 0xe2, 0x6e, 0xbe, 0x21, 0x71, 0xc5, 0xea, 0x4b, 0x2b, 0x31, 0x18, 0xad, 0x86, 0xdf, 0x11, 0xfa, 0x38, 0x3e, 0xd7, 0x3a, 0xf9, 0xb4, 0x8c, 0x1e, 0x8a, 0x8f, 0x90, 0x90, 0xf6, 0x3e, 0xea, 0x8f, 0x18, 0xc1, 0xe9, 0x3a, 0x5d, 0x5e, 0x0a, 0x2a, 0xcc, 0x96, 0x1d, 0x05, 0x43, 0x57, 0xa4, 0x50, 0x03, 0x73, 0x7c, 0x85, 0x6e, 0x51, 0xbf, 0x66, 0x10, 0xe3, 0xe8, 0x90, 0xdd, 0xd7, 0x38, 0x53, 0xb9, 0x12, 0x59, 0xc1, 0x3e, 0x5a, 0x42, 0x05, 0xb9, 0x52, 0x5a, 0xf7, 0x75, 0xac, 0xe0, 0xed, 0x3d, 0x9a, 0x8a, 0xd3, 0x1c, 0x85, 0x6c, 0x7e, 0x67, 0x02, 0x1c, 0x3d, 0xfd, 0x02, 0x14, 0xb1, 0xce, 0x48, 0x57, 0xdf, 0x9a, 0x21, 0x58, 0x84, 0xfb, 0x4f, 0x17, 0xa8, 0xa6, 0x46, 0x8d, 0x76, 0xee, 0x9b, 0x4a, 0x4b, 0x8a, 0xb9, 0x5d, 0x0d, 0x97, 0xd6, 0x74, 0xbe, 0xe1, 0x25, 0x44, 0x51, 0x5e, 0x4d, 0x2b, 0xbc, 0xfb, 0x1b, 0x14, 0x4e, 0x9b, 0x73, 0x9c, 0x43, 0x5d, 0x8d, 0x73, 0x96, 0x1e, 0x5e, 0x04, 0x16, 0x40, 0x53, 0x58, 0xbc, 0xa9, 0x45, 0x37, 0x3c, 0x0e, 0xaa, 0x91, 0xda, 0x71, 0x08, 0x1d, 0x7f, 0xe8, 0xb0, 0x40, 0x0c, 0xa1, 0xa8, 0x30, 0xee, 0x23, 0xe9, 0x59, 0xf3, 0xd6, 0xca, 0x00, 0x5b, 0xc6, 0xbd, 0x26, 0x33, 0xa4, 0x39, 0xaf, 0xde, 0x0e, 0xf7, 0xc3, 0xf5, 0x0f, 0x61, 0x75, 0x51, 0xea, 0x48, 0xa2, 0x65, 0x13, 0xd5, 0x1c, 0xd1, 0x7f, 0xc2, 0x08, 0x35, 0x1d, 0xc9, 0x85, 0x43, 0xa5, 0x5d, 0x8f, 0x19, 0x90, 0x99, 0x22, 0xcd, 0x67, 0x76, 0xa2, 0x49, 0x41, 0x40, 0x7a, 0x59, 0x88, 0x4b, 0x04, 0x02, 0xfb, 0xe2, 0xa9, 0x16, 0xf9, 0x80, 0x49, 0x05, 0xfc, 0x43, 0xdc, 0xf6, 0x64, 0x9d, 0x5a, 0x16, 0x76, 0x4d, 0xd9, 0x30, 0xa4, 0x8d, 0xf5, 0x7f, 0x0e, 0x8d, 0x75, 0xc0, 0x4a, 0x21, 0x2c, 0x8a, 0x60, 0xb6, 0x1c, 0xe2, 0x19, 0x8b, 0xe2, 0x0b, 0x7a, 0x1e, 0x4e, 0x9b, 0x8b, 0xe4, 0x51, 0xd4, 0x5d, 0x3c, 0x1c, 0x30, 0x4a, 0xa6, 0x86, 0x3e, 0x7f, 0x30, 0xae, 0xad, 0xb8, 0x32, 0xe2, 0xa6, 0x4b, 0x3b, 0xc0, 0x60, 0x68, 0x4b, 0x9b, 0xee, 0x9f, 0x43, 0x21, 0x5b, 0xa2, 0x99, 0x3a, 0xf8, 0x4d, 0x50, 0x33, 0xf5, 0xe3, 0x28, 0x1b, 0x2f, 0x9b, 0x12, 0x6d, 0x49, 0x5b, 0xe6, 0xf0, 0xfe, 0xc3, 0x58, 0xdc, 0xb5, 0x6d, 0x29, 0x3e, 0x56, 0x73, 0x9a, 0x9d, 0x5d, 0x32, 0x26, 0xde, 0x2d, 0x4e, 0x70, 0x65, 0xa6, 0xf7, 0x7b, 0x7d, 0xf9, 0x6a, 0x19, 0xfa, 0xbb, 0xba, 0xa6, 0x1d, 0x39, 0xd0, 0xf5, 0xb7, 0x0c, 0xb0, 0x8b, 0x91, 0xed, 0xff, 0x0b, 0x0c, 0xca, 0xc2, 0xf2, 0x05, 0x19, 0x69, 0x84, 0xfb, 0x6c, 0x0c, 0x07, 0x74, 0x45, 0xf4, 0x2e, 0x9c, 0x2c, 0x5d, 0xd8, 0x30, 0x00, 0x7a, 0xfb, 0x9a, 0x8b, 0xba, 0xda, 0x5e, 0x58, 0x4a, 0x7f, 0xb4, 0xc9, 0xdb, 0x65, 0x76, 0x64, 0xa5, 0x75, 0x3d, 0x6e, 0xac, 0x33, 0xc8, 0xbb, 0x42, 0x3a, 0x9d, 0xc4, 0xcd, 0xe6, 0xf2, 0xfa, 0xca, 0x50, 0xcd, 0x5a, 0x12, 0x7f, 0x6b, 0x42, 0x5c, 0xdc, 0xdf, 0x83, 0x04, 0xe7, 0xfb, 0xb7, 0x0b, 0x29, 0x73, 0xd5, 0x5e, 0x69, 0x40, 0x02, 0x5b, 0x23, 0x43, 0xaa, 0x91, 0x36, 0x2b, 0xd0, 0xc7, 0xdd, 0x98, 0xa2, 0x40, 0xe0, 0x80, 0x51, 0x3e, 0x0c, 0xd3, 0x1f, 0xc5, 0xe0, 0x5a, 0xba, 0xa1, 0x89, 0xe5, 0xc8, 0xab, 0x11, 0xa5, 0xc3, 0x47, 0xd3, 0xd7, 0x07, 0x31, 0x32, 0xa2, 0x29, 0x7a, 0x8a, 0x43, 0x8b, 0xcd, 0x67, 0x67, 0x2d, 0xf7, 0xf5, 0xd8, 0xc6, 0xa6, 0xb8, 0x5c, 0x14, 0x71, 0x7d, 0xdb, 0x70, 0x19, 0x91, 0xbf, 0xa5, 0x0f, 0x30, 0xa0, 0x02, 0x36, 0x40, 0x21, 0xae, 0xe9, 0x40, 0x15, 0x3c, 0x40, 0x7b, 0xe7, 0x7f, 0x8f, 0x81, 0x38, 0xa0, 0x30, 0xd7, 0xc9, 0x6d, 0x83, 0xee, 0x9c, 0xf4, 0x32, 0x52, 0x56, 0x51, 0xba, 0x24, 0xe8, 0xc4, 0x27, 0xca, 0x6e, 0x07, 0x1e, 0xe5, 0x57, 0xde, 0x21, 0x83, 0xc7, 0xef, 0x0f, 0x97, 0x39, 0xd4, 0xea, 0xa6, 0x69, 0x6f, 0xdd, 0xc2, 0x71, 0x7d, 0x7e, 0xbc, 0x32, 0x6e, 0x50, 0x96, 0xf5, 0x75, 0x8c, 0x37, 0x52, 0xdb, 0x21, 0x62, 0x52, 0x98, 0xf9, 0xe9, 0xd0, 0x24, 0x7e, 0x1e, 0x25, 0x8b, 0x5d, 0x8b, 0x04, 0xc0, 0x89, 0xe3, 0xa2, 0x33, 0x84, 0x38, 0x1a, 0xa5, 0xda, 0x6d, 0x11, 0x3b, 0xee, 0xef, 0x95, 0xd2, 0xf8, 0xa0, 0x4b, 0x93, 0x4f, 0x14, 0xca, 0xc7, 0xe4, 0x00, 0x42, 0xec, 0x0f, 0xef, 0x61, 0x08, 0x8f, 0x37, 0x77, 0x3d, 0xcc, 0x2c, 0xd8, 0x9e, 0x5e, 0x93, 0x82, 0x41, 0xd3, 0x5a, 0xff, 0x95, 0xad, 0x86, 0x8d, 0xf6, 0xab, 0x6c, 0x7d, 0x7f, 0x4a, 0x24, 0xd9, 0x20, 0x8a, 0x3b, 0x49, 0xf0, 0xf5, 0xa8, 0x37, 0xc4, 0xde, 0x01, 0x32, 0x00, 0xe7, 0xef, 0x90, 0xad, 0xc6, 0xe0, 0x58, 0xcc, 0x48, 0xfb, 0x5f, 0xea, 0x95, 0x59, 0xb0, 0xf5, 0xb7, 0x72, 0x31, 0x4e, 0x56, 0xd5, 0x84, 0x1f, 0xc5, 0x1d, 0x2c, 0xef, 0x43, 0x20, 0xf1, 0x74, 0x7a, 0x69, 0x85, 0xa8, 0x4c, 0xe9, 0x67, 0x1f, 0xcf, 0xe9, 0x08, 0x97, 0x96, 0x43, 0x2d, 0xd1, 0x33, 0xd2, 0x94, 0x9f, 0xf9, 0x27, 0xda, 0x3f, 0x07, 0x7d, 0x9c, 0xe7, 0x82, 0xef, 0xdd, 0xa1, 0x21, 0xe9, 0xa7, 0x59, 0xef, 0xdd, 0xf5, 0x34, 0x4c, 0x37, 0xd1, 0x24, 0x35, 0x92, 0xba, 0xba, 0xc6, 0x2c, 0x48, 0x3b, 0xfd, 0x97, 0x13, 0xf5, 0xc1, 0xb2, 0xd0, 0xd3, 0x23, 0xd8, 0xbd, 0x30, 0xe3, 0x57, 0x40, 0xe9, 0x36, 0x24, 0xca, 0xb6, 0xc6, 0xcd, 0x02, 0xba, 0xfb, 0xae, 0x20, 0x58, 0x79, 0x68, 0x96, 0x49, 0xea, 0x8f, 0xf6, 0xeb, 0xfd, 0xa3, 0x10, 0xdc, 0xae, 0x42, 0x5a, 0xc8, 0xc9, 0x9b, 0x96, 0x7f, 0xa9, 0x26, 0xae, 0x4b, 0x46, 0x93, 0xe3, 0x80, 0x6f, 0x00, 0x26, 0x54, 0x53, 0x6e, 0xc6, 0xf1, 0x46, 0x76, 0x4c, 0xc9, 0xc2, 0x38, 0xa4, 0x2a, 0xac, 0x95, 0x7d, 0x12, 0xd9, 0x9e, 0xf1, 0x44, 0xd1, 0x4b, 0x69, 0x9b, 0xd3, 0x71, 0xbb, 0x9f, 0x19, 0xee, 0x96, 0x56, 0x5c, 0x26, 0x20, 0x5d, 0x9b, 0xb4, 0xdd, 0x36, 0x19, 0x59, 0xd3, 0xe4, 0xa5, 0x38, 0xec, 0xb5, 0x1d, 0x46, 0x9b, 0x60, 0x35, 0xfc, 0xc2, 0x4f, 0x75, 0x4f, 0xd4, 0x3e, 0x81, 0xe1, 0x37, 0x05, 0x9d, 0x79, 0xec, 0xb2, 0x70, 0xb1, 0x71, 0xdb, 0x08, 0xee, 0xe6, 0x33, 0x1f, 0x95, 0x70, 0x5a, 0x9d, 0x7c, 0xdb, 0xfa, 0x5e, 0x9f, 0x83, 0x0f, 0x34, 0x15, 0x74, 0x86, 0x30, 0x42, 0xd0, 0x0a, 0x1d, 0x4d, 0x71, 0x1b, 0x4e, 0xd4, 0xd0, 0x60, 0x9a, 0xdf, 0x25, 0x3e, 0xa4, 0x13, 0xd0, 0xa9, 0x60, 0x29, 0xf8, 0x3a, 0xd2, 0x9e, 0x72, 0x82, 0x19, 0xab, 0xe4, 0x9f, 0xad, 0x77, 0x2a, 0x0c, 0xe5, 0x8c, 0xf8, 0xbe, 0xbc, 0x87, 0xc1, 0x6c, 0xd4, 0x14, 0xd8, 0x2e, 0xbb, 0x1a, 0xd6, 0x49, 0x6e, 0x33, 0x3b, 0x49, 0x1b, 0x5f, 0x58, 0x51, 0x2b, 0xf9, 0x6c, 0xb0, 0x80, 0xea, 0x0d, 0xb4, 0xfb, 0x1c, 0xc9, 0xc3, 0x42, 0x32, 0x0e, 0xa7, 0xc0, 0x76, 0x47, 0x2a, 0xed, 0x12, 0x48, 0xe3, 0xcf, 0x84, 0xec, 0x4f, 0xc1, 0x4c, 0xfc, 0x24, 0x73, 0xe7, 0x53, 0xe1, 0x32, 0x01, 0x40, 0xaa, 0x69, 0xe7, 0x2c, 0x53, 0x68, 0x3b, 0x7d, 0xbb, 0x65, 0xeb, 0xba, 0x5b, 0xc0, 0x63, 0xef, 0x1e, 0x8c, 0x02, 0x53, 0x73, 0x4a, 0xcb, 0x28, 0xa1, 0xf7, 0x5e, 0xe3, 0x5c, 0x4a, 0x26, 0x8d, 0x95, 0x37, 0xd3, 0x69, 0x96, 0xb7, 0x0b, 0xd7, 0x4d, 0xcb, 0x5c, 0x78, 0xe8, 0xbe, 0x76, 0x93, 0xa3, 0xab, 0x97, 0xb7, 0xde, 0x40, 0x46, 0xa2, 0x73, 0xc1, 0x44, 0x62, 0x46, 0x50, 0xc0, 0xba, 0x1e, 0x6b, 0xca, 0xc7, 0xb3, 0xb6, 0x0a, 0xe3, 0x08, 0xfb, 0xb2, 0xca, 0xfa, 0x6f, 0xb1, 0xfc, 0x19, 0x37, 0x2a, 0x62, 0xb8, 0x2a, 0x24, 0x33, 0x40, 0xd9, 0x83, 0x19, 0xca, 0xcc, 0x37, 0x90, 0xec, 0x0f, 0xb3, 0x8f, 0xd2, 0xee, 0xa0, 0x6b, 0x91, 0xfc, 0xd3, 0xf8, 0xb9, 0x5a, 0x7d, 0xf1, 0x29, 0x35, 0xa2, 0x9a, 0x28, 0x91, 0xcd, 0xa3, 0xb1, 0x45, 0x01, 0x50, 0x0d, 0x47, 0xf2, 0xd7, 0xa8, 0x2a, 0x75, 0x0a, 0x1d, 0xe5, 0x36, 0x35, 0x93, 0xd6, 0xa9, 0x4a, 0x4c, 0x07, 0x43, 0x3b, 0x7b, 0xaf, 0xe9, 0xa8, 0x56, 0xfc, 0xa9, 0xba, 0x6d, 0x0f, 0xa8, 0x4f, 0x3a, 0x49, 0x5b, 0x57, 0xf9, 0xc5, 0xfa, 0x7d, 0xba, 0x25, 0x32, 0x0b, 0xb4, 0x92, 0x1b, 0x07, 0xdc, 0xfe, 0x69, 0xa2, 0xb6, 0xac, 0xe6, 0xd4, 0x6b, 0xf3, 0x20, 0x40, 0x1d, 0x3f, 0x5e, 0x5d, 0x77, 0x58, 0xd9, 0xd7, 0x88, 0xe7, 0x29, 0x33, 0xd1, 0x36, 0xfe, 0xb3, 0x9c, 0x37, 0x10, 0x79, 0x90, 0xc8, 0x59, 0xee, 0x83, 0x35, 0x81, 0x65, 0x8f, 0xfe, 0x9a, 0xfc, 0x68, 0xdb, 0x0d, 0xc3, 0xec, 0xfe, 0xd4, 0x21, 0xfc, 0x98, 0xea, 0x73, 0x8b, 0x9e, 0x00, 0xf5, 0xf4, 0xcd, 0x72, 0xe6, 0x91, 0xec, 0x79, 0xe7, 0x89, 0x51, 0xa2, 0xa5, 0xe9, 0xa6, 0x7f, 0xb7, 0xf7, 0xed, 0x9c, 0xca, 0xc3, 0xc2, 0xb4, 0xfb, 0xfe, 0xe0, 0x25, 0x84, 0x0f, 0xe7, 0xa2, 0x9b, 0x64, 0x5d, 0x28, 0x97, 0x06, 0xf2, 0x33, 0x55, 0x71, 0x08, 0x31, 0xda, 0xa2, 0x72, 0x37, 0x39, 0x71, 0x7c, 0xf3, 0xb7, 0x21, 0x2c, 0xe2, 0x2e, 0x36, 0xc8, 0xc2, 0xaf, 0x86, 0x98, 0x4b, 0x6b, 0x93, 0xed, 0x1a, 0xd4, 0x18, 0x63, 0xee, 0xff, 0xe2, 0x62, 0x16, 0x4d, 0xe1, 0xeb, 0x2a, 0x4a, 0x7f, 0x91, 0xfa, 0xd5, 0x30, 0xc5, 0xc4, 0x82, 0x4b, 0x57, 0xaa, 0x3c, 0x18, 0x3a, 0x62, 0x2f, 0x2a, 0x88, 0x30, 0xe5, 0xef, 0xc5, 0x11, 0xae, 0x85, 0x68, 0x39, 0x46, 0xcf, 0x97, 0xc0, 0xb2, 0xc9, 0x33, 0x99, 0x6b, 0x18, 0x14, 0xc3, 0xbe, 0xe6, 0x96, 0xc3, 0x73, 0xec, 0x54, 0x51, 0xad, 0xd0, 0x33, 0x52, 0x11, 0xb2, 0xa3, 0x06, 0x2a, 0x02, 0x21, 0x83, 0x0c, 0x94, 0x00, 0x62, 0x38, 0xf6, 0x6a, 0xb8, 0xc0, 0x01, 0xa2, 0x48, 0xac, 0xae, 0x8b, 0xf6, 0x9b, 0x2b, 0x6e, 0x7f, 0xae, 0x2e, 0xf8, 0x68, 0xa1, 0x8a, 0x82, 0x34, 0x3b, 0x00, 0x96, 0xda, 0xe9, 0x57, 0xae, 0x76, 0xa6, 0xae, 0x3e, 0x3f, 0x1d, 0x12, 0xf5, 0xb9, 0x12, 0x4c, 0x40, 0x2c, 0xfe, 0xfc, 0x11, 0x54, 0xf9, 0xec, 0xde, 0x5a, 0xdd, 0x9e, 0xec, 0x03, 0xa9, 0x27, 0xcd, 0x28, 0x23, 0x40, 0x28, 0x66, 0xc2, 0x9b, 0xb8, 0x16, 0xca, 0x73, 0x97, 0x7f, 0xb9, 0x67, 0xbd, 0x4b, 0xe2, 0x88, 0xc3, 0x38, 0x58, 0xb1, 0xed, 0x10, 0x0d, 0x17, 0x68, 0xdb, 0x3b, 0x20, 0xd0, 0x53, 0x03, 0x79, 0xf6, 0x98, 0x55, 0x63, 0xdf, 0x25, 0x0f, 0x4d, 0x10, 0x03, 0x69, 0xa8, 0x08, 0x3c, 0x90, 0xf7, 0x0f, 0x93, 0x91, 0x25, 0x2e, 0x72, 0x79, 0x1c, 0x7f, 0x24, 0xba, 0x93, 0xa7, 0x44, 0xd1, 0x27, 0xa0, 0x76, 0x26, 0xae, 0xbc, 0x55, 0x34, 0xc8, 0xe6, 0xac, 0xe9, 0xb6, 0x2b, 0xe8, 0x50, 0x70, 0x7a, 0xcd, 0x6d, 0xf1, 0xa8, 0x69, 0x69, 0xd6, 0xb7, 0x46, 0xef, 0x27, 0x58, 0xe4, 0xd5, 0x75, 0xae, 0x66, 0xff, 0x25, 0x55, 0x8c, 0x80, 0x0b, 0xa3, 0xe1, 0x03, 0x3b, 0x2e, 0x36, 0x6a, 0x1b, 0x8e, 0x4e, 0xb4, 0xbd, 0x64, 0xdb, 0x24, 0x6c, 0x9b, 0xa9, 0x9f, 0x85, 0xed, 0x1a, 0x57, 0x89, 0xa9, 0xd2, 0xa6, 0x6f, 0xb4, 0xb3, 0x3c, 0x3f, 0xce, 0x0c, 0x7d, 0xdc, 0x17, 0x0d, 0x25, 0x21, 0xd2, 0x7f, 0x2e, 0x30, 0x68, 0xb2, 0xf3, 0x07, 0xb0, 0xb6, 0x95, 0x55, 0x6d, 0xcd, 0x9e, 0x8b, 0x19, 0x21, 0xe4, 0x35, 0xe1, 0xb3, 0xb1, 0x8b, 0xf0, 0x94, 0x20, 0x43, 0xf0, 0x57, 0xca, 0xaa, 0xce, 0xc6, 0xa2, 0xf3, 0xbe, 0xd4, 0x1e, 0xcf, 0x80, 0xd3, 0x98, 0x3e, 0xe1, 0xe7, 0xf3, 0xa4, 0x84, 0xbb, 0x81, 0x1f, 0xe2, 0x72, 0x24, 0x18, 0x90, 0xe1, 0xb4, 0x18, 0xc1, 0xfb, 0xa1, 0xdd, 0x0b, 0x8c, 0xda, 0xae, 0x6e, 0x2b, 0xed, 0xeb, 0x92, 0x69, 0x6f, 0xe8, 0x50, 0x4f, 0x9e, 0xfb, 0x74, 0x08, 0x45, 0xd4, 0xc1, 0xda, 0xe0, 0x0d, 0x36, 0x5b, 0x01, 0x02, 0x90, 0xe1, 0xf2, 0xe3, 0x10, 0x3a, 0x9c, 0x08, 0x7e, 0x9d, 0xa7, 0x84, 0x6e, 0xe1, 0xe3, 0xfc, 0xc2, 0xed, 0xe7, 0xba, 0x70, 0x70, 0xf8, 0xfd, 0x86, 0xd2, 0x2c, 0x93, 0x6b, 0x6a, 0xce, 0xaa, 0x67, 0xf1, 0x05, 0xe4, 0x65, 0x36, 0xb1, 0xa9, 0xf8, 0x14, 0x96, 0xc1, 0x9d, 0xa1, 0xbc, 0x22, 0x40, 0xa9, 0x15, 0x06, 0x01, 0x5b, 0x61, 0x41, 0x37, 0x41, 0x4f, 0xd2, 0xb5, 0x76, 0xe5, 0xb8, 0x4d, 0x13, 0x21, 0x07, 0x93, 0xea, 0xe1, 0x3a, 0xe3, 0x77, 0x00, 0xcb, 0xa6, 0x13, 0xc2, 0x01, 0xd0, 0x6b, 0x72, 0x0a, 0xad, 0x31, 0x49, 0x49, 0xde, 0x11, 0x92, 0xf1, 0x9f, 0xe7, 0x0c, 0xd3, 0x4b, 0x2f, 0x90, 0x74, 0x21, 0xbc, 0xf3, 0x63, 0x48, 0xae, 0x2e, 0xc9, 0x11, 0x9e, 0xbc, 0x42, 0x7d, 0x1b, 0x44, 0xeb, 0xff, 0x5a, 0x78, 0xbd, 0x82, 0x29, 0x3d, 0x19, 0xae, 0x25, 0x0c, 0xa3, 0x67, 0x2d, 0x98, 0x54, 0x97, 0x16, 0xb1, 0xcb, 0x2e, 0xa0, 0x68, 0xe4, 0x67, 0xa9, 0x74, 0x8c, 0x4c, 0xa1, 0xd4, 0xd4, 0x7c, 0x3e, 0xb6, 0x44, 0x2c, 0x71, 0x98, 0x71, 0x6c, 0x98, 0xad, 0xd1, 0xab, 0xf5, 0x82, 0xcf, 0x7e, 0x5f, 0xe1, 0x1b, 0x9d, 0x37, 0xf6, 0x44, 0x2e, 0x9e, 0xb0, 0x88, 0x47, 0xe5, 0x6a, 0xeb, 0xae, 0x45, 0xcb, 0x86, 0xe3, 0xd1, 0xea, 0x22, 0x60, 0xa8, 0xb6, 0x05, 0x1f, 0x6f, 0x96, 0x0c, 0x5d, 0xff, 0x4c, 0xfa, 0x9e, 0x5a, 0x1f, 0x10, 0xf1, 0xe4, 0x39, 0xde, 0x75, 0xd0, 0x4e, 0x58, 0x1c, 0xd8, 0x7e, 0x2c, 0xaf, 0x31, 0x7d, 0x53, 0x12, 0xbe, 0xf1, 0xe6, 0xca, 0x84, 0x1b, 0x34, 0xbc, 0x5e, 0xba, 0x11, 0x37, 0xf1, 0x2c, 0x71, 0x35, 0xe3, 0xd7, 0x35, 0xde, 0x48, 0xc7, 0x44, 0x4e, 0x5d, 0x98, 0xde, 0x98, 0x79, 0x97, 0x2d, 0x0b, 0x40, 0x24, 0x1d, 0xb4, 0x1a, 0x5b, 0x6e, 0x23, 0xe4, 0xf3, 0x08, 0x72, 0xe5, 0x65, 0x8e, 0x84, 0x03, 0x51, 0x35, 0x8b, 0x36, 0x1e, 0xd7, 0xcd, 0x3e, 0xe2, 0x43, 0xa7, 0x91, 0x81, 0xd8, 0xd2, 0x98, 0x18, 0x52, 0xe5, 0x1a, 0x9c, 0xe3, 0x1b, 0xf9, 0xbe, 0x86, 0x57, 0x1c, 0x12, 0x90, 0x65, 0xac, 0x71, 0x87, 0x83, 0x83, 0x9c, 0x38, 0x20, 0xe1, 0x21, 0x04, 0xe3, 0x61, 0x83, 0x7b, 0xef, 0x2c, 0x95, 0x2c, 0x66, 0x6d, 0x27, 0xba, 0x2b, 0x05, 0xe4, 0x33, 0xed, 0x7f, 0x7b, 0x9e, 0x61, 0x46, 0xfd, 0xd3, 0xce, 0x15, 0x86, 0x90, 0xcf, 0xb0, 0x20, 0xc8, 0x55, 0xd2, 0xe4, 0x3e, 0xeb, 0x66, 0x63, 0x53, 0x3e, 0xf9, 0x44, 0x1c, 0xdc, 0x70, 0x2e, 0xb8, 0x3c, 0xf6, 0xe8, 0xe1, 0xff, 0x39, 0xbe, 0xc0, 0x75, 0xd6, 0x27, 0x06, 0x63, 0x11, 0xa6, 0x38, 0x03, 0xca, 0xee, 0x4a, 0x4d, 0xad, 0x49, 0x70, 0x75, 0xa8, 0x3a, 0x31, 0xb5, 0xa2, 0x61, 0xbd, 0x4c, 0x6a, 0xa0, 0x80, 0xc7, 0xed, 0x7c, 0xf7, 0x7f, 0xad, 0xc6, 0xc3, 0x63, 0x6e, 0x7a, 0xfc, 0xf7, 0x32, 0xe7, 0xc7, 0x9d, 0x68, 0x10, 0x2b, 0x14, 0x61, 0x53, 0x20, 0x3e, 0x03, 0x48, 0xe9, 0x26, 0xc1, 0xec, 0xa4, 0x41, 0xcb, 0xff, 0x20, 0xf4, 0x81, 0xaa, 0xee, 0x57, 0x2e, 0x65, 0xbb, 0x39, 0xf3, 0x18, 0xdd, 0x64, 0x01, 0x80, 0x2b, 0x21, 0x0b, 0xd5, 0x12, 0xff, 0xfc, 0xaa, 0xe5, 0xd1, 0xe5, 0x14, 0x75, 0xf6, 0x39, 0x0e, 0xe2, 0xdd, 0x3c, 0x1c, 0xb0, 0xc7, 0xb9, 0x2f, 0x1d, 0xcf, 0xf3, 0xc9, 0xb2, 0x28, 0xdf, 0x61, 0x19, 0xa7, 0x90, 0x09, 0x2e, 0x81, 0xf3, 0x4e, 0x58, 0x55, 0xbc, 0x60, 0x1a, 0x6d, 0xa0, 0x73, 0xe5, 0x41, 0xc5, 0x64, 0x31, 0x3c, 0x77, 0xa0, 0xcc, 0xc3, 0x1c, 0x42, 0x71, 0x74, 0x6a, 0x7b, 0x9c, 0xab, 0xd7, 0x37, 0x9d, 0x4b, 0x51, 0xfd, 0xeb, 0xbb, 0x30, 0x17, 0xbc, 0x2e, 0x69, 0xf4, 0xd2, 0x28, 0x04, 0xca, 0x98, 0x3e, 0xd0, 0x7f, 0x6d, 0x1d, 0x55, 0xca, 0x40, 0xcd, 0x0a, 0x96, 0x5d, 0x37, 0xc8, 0xa7, 0x86, 0xe5, 0x7f, 0x7f, 0x46, 0x0a, 0x28, 0x83, 0x82, 0xc2, 0xfa, 0x5a, 0x51, 0x9a, 0xe1, 0x96, 0x0e, 0x53, 0x2c, 0x96, 0xab, 0xe3, 0x85, 0xaa, 0x47, 0xbd, 0x27, 0x79, 0x03, 0x52, 0x4b, 0xa0, 0x12, 0xd8, 0xe3, 0x9c, 0x10, 0x4a, 0x8b, 0xea, 0x95, 0xb0, 0xbd, 0x6c, 0x09, 0xa0, 0x44, 0x0f, 0xba, 0x05, 0xf3, 0xab, 0x2b, 0x1f, 0x96, 0x2b, 0xb0, 0xcb, 0x29, 0xed, 0x37, 0x05, 0x48, 0x6c, 0x69, 0xab, 0xe7, 0x1c, 0xf2, 0x83, 0x43, 0x95, 0x1c, 0x80, 0x18, 0xf4, 0xa3, 0x41, 0x15, 0x7e, 0xc5, 0xdb, 0x8d, 0x87, 0x98, 0xd8, 0x6f, 0x93, 0xa0, 0x80, 0x78, 0xba, 0xa1, 0x57, 0xa7, 0x51, 0xb2, 0xe6, 0xf2, 0xc6, 0x93, 0xbe, 0x37, 0xcc, 0x40, 0xbb, 0x75, 0xb8, 0xc6, 0x86, 0x3c, 0x2b, 0x56, 0x5d, 0x62, 0xf2, 0x98, 0x17, 0xf8, 0x2a, 0x41, 0x62, 0x7c, 0xa8, 0xe8, 0x50, 0x50, 0x98, 0x16, 0x12, 0x6b, 0x63, 0x9c, 0x03, 0x4f, 0xd7, 0x29, 0xe8, 0x3b, 0x82, 0x1b, 0x75, 0xa1, 0x5e, 0x96, 0x14, 0xda, 0xb4, 0xd3, 0xe3, 0x19, 0x3a, 0xbb, 0xfb, 0x9e, 0x7e, 0xb5, 0xf8, 0x2c, 0x88, 0xbc, 0xb6, 0xbc, 0xbb, 0xb4, 0x58, 0x73, 0xfd, 0xfe, 0x8f, 0xd2, 0x18, 0x4a, 0x19, 0x2d, 0x5f, 0xac, 0x87, 0x5e, 0x94, 0xf3, 0x44, 0xba, 0x09, 0x36, 0xd3, 0x44, 0x06, 0xaf, 0x58, 0x21, 0x6b, 0xcc, 0x5a, 0x4c, 0x96, 0x84, 0xc7, 0x8b, 0x87, 0xe8, 0x38, 0xa2, 0x42, 0xfa, 0x77, 0xc6, 0x75, 0xc1, 0x3f, 0x54, 0x5b, 0x9d, 0x42, 0xc3, 0xe0, 0xd9, 0x70, 0xd8, 0x06, 0x7f, 0x77, 0x18, 0x87, 0x70, 0x86, 0x83, 0xbc, 0xb3, 0x57, 0x7f, 0xbd, 0x0e, 0x6c, 0x13, 0xca, 0xd3, 0x99, 0x55, 0xea, 0xfd, 0xc2, 0x26, 0xd1, 0x7b, 0xe6, 0x1c, 0x07, 0xcc, 0x5c, 0xc0, 0x47, 0xcc, 0x5d, 0xfa, 0x26, 0xce, 0xc3, 0xc9, 0xf5, 0xea, 0x10, 0x37, 0xe7, 0x99, 0xb2, 0x8d, 0x77, 0x7f, 0x86, 0xc3, 0x04, 0x87, 0x9a, 0x3a, 0xbe, 0x35, 0x37, 0xae, 0xc6, 0x38, 0x1f, 0x66, 0x91, 0x3f, 0x13, 0xad, 0x8e, 0x0e, 0x98, 0x86, 0x08, 0xd1, 0xfb, 0x9c, 0x4d, 0xb0, 0x93, 0x78, 0x10, 0xa3, 0x46, 0xf6, 0x0c, 0x88, 0x4e, 0xfa, 0xea, 0x73, 0x3d, 0x5f, 0x65, 0x45, 0x3f, 0x30, 0xac, 0x80, 0xa0, 0x1b, 0x07, 0x59, 0x8e, 0x22, 0xbe, 0x0f, 0x1f, 0x94, 0x37, 0x7c, 0x96, 0x3c, 0x5e, 0xea, 0xe2, 0xd8, 0x49, 0x27, 0x67, 0xcd, 0x1d, 0xdc, 0x01, 0x18, 0x2b, 0x1a, 0x46, 0x88, 0x5f, 0x36, 0x0c, 0x2a, 0xdb, 0xd7, 0x2c, 0x05, 0xdf, 0x4d, 0x85, 0x08, 0xec, 0x24, 0x43, 0x41, 0x29, 0xf9, 0x61, 0x50, 0x05, 0x8d, 0x6c, 0x1a, 0x1e, 0x18, 0x8a, 0xc2, 0x62, 0xe0, 0xbc, 0xd5, 0x73, 0x09, 0x60, 0xc4, 0x50, 0xaf, 0xfa, 0x98, 0x33, 0x32, 0x33, 0xe1, 0xb5, 0xd1, 0x22, 0xef, 0x38, 0x7b, 0xcb, 0x45, 0x86, 0xe1, 0xe5, 0x4b, 0xb6, 0xd0, 0xe1, 0x43, 0x50, 0xbe, 0x27, 0x7e, 0xb1, 0xa3, 0xa3, 0xd0, 0xb0, 0x0a, 0x80, 0x41, 0x81, 0x67, 0x33, 0x05, 0xda, 0xab, 0xbc, 0xaf, 0x55, 0x16, 0x28, 0xa1, 0x16, 0x4c, 0x5b, 0xc7, 0xad, 0xac, 0x0c, 0x85, 0x3d, 0xdd, 0x11, 0xed, 0xde, 0xa9, 0xdd, 0x36, 0x41, 0x0f, 0x47, 0x69, 0x93, 0x93, 0x8d, 0x5e, 0xa3, 0xd9, 0x98, 0xe7, 0x46, 0x72, 0x81, 0x4b, 0xfb, 0xf6, 0x55, 0xf6, 0xcb, 0x53, 0x15, 0x6e, 0x73, 0x64, 0x01, 0x89, 0xc5, 0xc6, 0x16, 0xde, 0x4c, 0xe7, 0xd6, 0x79, 0x2f, 0x5f, 0x47, 0xd3, 0x57, 0x84, 0x3e, 0x01, 0xd4, 0x38, 0xdd, 0x2b, 0x7d, 0x06, 0x5b, 0x40, 0xd7, 0x6e, 0x03, 0xe8, 0x39, 0x7c, 0x80, 0xba, 0x2d, 0xa0, 0x57, 0xb0, 0x18, 0xb9, 0xb5, 0xd7, 0x1e, 0x73, 0x6b, 0x4b, 0x40, 0xd3, 0x37, 0x63, 0xc7, 0x10, 0x45, 0x29, 0xe6, 0xa5, 0xf5, 0x0d, 0x9b, 0xa4, 0xdf, 0xda, 0xd6, 0x4d, 0x15, 0xe8, 0xdd, 0xdf, 0xa7, 0x94, 0xef, 0xae, 0x6d, 0xed, 0x27, 0x76, 0x00, 0xb0, 0xa4, 0xef, 0x0a, 0x77, 0xe7, 0xa1, 0xc0, 0x2d, 0x7c, 0xfa, 0xac, 0xc5, 0xdd, 0x9e, 0xb0, 0x2b, 0x93, 0xfe, 0x48, 0x7b, 0x9e, 0x2c, 0x0f, 0x72, 0x17, 0xee, 0x85, 0x22, 0x14, 0x11, 0x0f, 0xe9, 0xcc, 0xff, 0x3f, 0xa3, 0xfc, 0x94, 0x56, 0x1f, 0x89, 0x2e, 0x07, 0xd0, 0x66, 0x03, 0x7e, 0xc5, 0xb8, 0xb8, 0xa1, 0xdb, 0x38, 0x2f, 0x96, 0x32, 0xd9, 0xa0, 0x85, 0xdd, 0xac, 0xeb, 0x9f, 0xde, 0x00, 0x2c, 0x5f, 0x51, 0xcd, 0x90, 0x0f, 0xe7, 0x53, 0x68, 0x8f, 0x96, 0xfe, 0x7c, 0x52, 0x8f, 0x8d, 0xa2, 0xa9, 0x71, 0x73, 0x8f, 0x44, 0xbc, 0x7d, 0xec, 0xf5, 0x88, 0xb6, 0xad, 0xb8, 0x77, 0x88, 0x9e, 0xf1, 0xe8, 0x23, 0x3e, 0xf4, 0x6d, 0x23, 0xd1, 0xca, 0x80, 0x6c, 0xb1, 0x33, 0x71, 0x59, 0xe5, 0xe7, 0xa3, 0x17, 0xf4, 0x21, 0xf8, 0x4b, 0xfb, 0x5e, 0x8a, 0xfb, 0xfe, 0x62, 0x9c, 0xab, 0x7c, 0x7d, 0xd0, 0xc6, 0x46, 0x0c, 0x9a, 0x40, 0x91, 0x42, 0xf4, 0x7a, 0x49, 0x29, 0x53, 0x66, 0xa8, 0xe3, 0xda, 0xeb, 0x08, 0x36, 0xce, 0x8b, 0xf5, 0x48, 0x4b, 0x43, 0x87, 0xa6, 0x35, 0xb2, 0xee, 0x8b, 0x70, 0x7e, 0x4f, 0x60, 0x54, 0xf4, 0xcf, 0x7f, 0x5b, 0xee, 0xed, 0x3c, 0x1d, 0xfa, 0x14, 0x26, 0x7f, 0xb8, 0x70, 0x8a, 0x27, 0x84, 0x02, 0x39, 0x33, 0x55, 0xef, 0x8b, 0x2a, 0xe5, 0x1e, 0xa4, 0x32, 0x13, 0x01, 0xf6, 0x84, 0x85, 0xb3, 0x07, 0x1e, 0x91, 0x44, 0x75, 0xb7, 0x5e, 0x51, 0x37, 0xf8, 0x46, 0xd7, 0x25, 0xe9, 0x7f, 0x48, 0xbb, 0xaa, 0xfb, 0xdf, 0x1a, 0x63, 0x8c, 0x31, 0x4f, 0x7d, 0x4c, 0x06, 0xd8, 0x13, 0x3c, 0x66, 0x64, 0xa3, 0x2b, 0xf7, 0xdb, 0x0a, 0xda, 0x86, 0x9e, 0xaf, 0x5d, 0xe3, 0x10, 0xfe, 0xc4, 0xf2, 0x55, 0x18, 0xfb, 0xff, 0x5a, 0xc8, 0xef, 0x52, 0x15, 0xba, 0xf2, 0x03, 0x0e, 0xe7, 0x61, 0x10, 0x1e, 0x54, 0x84, 0xad, 0x76, 0xfc, 0xb5, 0xdb, 0xe4, 0x0a, 0xc5, 0x3c, 0x52, 0x4c, 0x9b, 0x26, 0x90, 0xe5, 0x1e, 0xf6, 0x53, 0x42, 0x56, 0xa7, 0x7d, 0x4f, 0xcd, 0xa3, 0x9e, 0xea, 0x3c, 0xd8, 0xbb, 0x98, 0x63, 0x0f, 0x4f, 0x76, 0x39, 0x79, 0x90, 0x73, 0x45, 0x8b, 0xf3, 0xbd, 0x4c, 0x0c, 0xf2, 0x79, 0x2c, 0x6d, 0x0d, 0xb7, 0x08, 0x58, 0x0f, 0xa5, 0xa5, 0x8b, 0x92, 0x02, 0x14, 0xe7, 0xc5, 0xd6, 0x92, 0xc4, 0x6d, 0x61, 0xac, 0x88, 0x2a, 0x51, 0xa7, 0x78, 0xfc, 0x38, 0x1e, 0xce, 0x05, 0x3c, 0xed, 0x0b, 0x91, 0x11, 0x4e, 0x8e, 0x53, 0x24, 0x42, 0x66, 0xf1, 0x19, 0x33, 0x65, 0xc4, 0x78, 0xd7, 0x75, 0xd9, 0xa3, 0x57, 0x2f, 0x3b, 0x0c, 0xb1, 0xaa, 0x74, 0xa4, 0x5b, 0x91, 0x51, 0x97, 0x29, 0x79, 0xe6, 0x36, 0x70, 0x71, 0xd2, 0x34, 0x6c, 0xda, 0xc4, 0x16, 0xdf, 0x79, 0x3e, 0xe5, 0xfb, 0xca, 0x99, 0x26, 0x82, 0x97, 0x4a, 0x0c, 0x2c, 0xca, 0x63, 0xeb, 0x49, 0x80, 0x5d, 0xf0, 0xa7, 0x5e, 0x14, 0x10, 0xb6, 0x28, 0x13, 0x3e, 0xea, 0x8f, 0x12, 0xe1, 0x61, 0x4b, 0xbd, 0x85, 0xc6, 0x6a, 0xb7, 0xd0, 0x75, 0xe8, 0xdf, 0xb8, 0xdf, 0x7f, 0xd2, 0xf4, 0x30, 0xc0, 0xb1, 0xb0, 0x30, 0x63, 0x24, 0x85, 0x67, 0xdc, 0x9e, 0xa8, 0x85, 0x2f, 0xe3, 0x62, 0x01, 0x04, 0xc8, 0xc0, 0xff, 0xfe, 0x3a, 0x8b, 0x77, 0x49, 0x82, 0x7a, 0x94, 0x72, 0xc7, 0xa7, 0x5a, 0x7c, 0xd5, 0x40, 0x8c, 0x30, 0x1d, 0x7f, 0xcd, 0xb4, 0xfc, 0xdc, 0x05, 0x5f, 0x40, 0x81, 0x06, 0xcc, 0xe8, 0xfe, 0x70, 0x2d, 0x2b, 0x3e, 0xd1, 0xe2, 0xbc, 0xb9, 0x11, 0x4b, 0x4d, 0xec, 0x0e, 0xda, 0x52, 0x06, 0x83, 0x6c, 0x07, 0xe5, 0x2e, 0xd9, 0xb4, 0x40, 0x32, 0xc9, 0x2f, 0x26, 0xba, 0xca, 0xa3, 0xa7, 0xdf, 0xa0, 0x91, 0xd1, 0xcc, 0xdc, 0x14, 0xde, 0x1f, 0xb1, 0x69, 0xab, 0x93, 0x02, 0xae, 0x6c, 0xdc, 0xbf, 0xea, 0x9f, 0xd3, 0x72, 0x4e, 0x3e, 0xd3, 0x15, 0xbb, 0x39, 0x63, 0x27, 0x84, 0x23, 0x15, 0xff, 0x74, 0x2b, 0xae, 0x5f, 0x13, 0x4f, 0x86, 0x4c, 0x25, 0xcc, 0x32, 0x1d, 0x74, 0xd9, 0x61, 0xd3, 0xcf, 0x94, 0x04, 0xa8, 0x53, 0x3d, 0xb2, 0xeb, 0xe9, 0xa2, 0x4a, 0x0a, 0x10, 0xda, 0xda, 0xf1, 0xdd, 0x36, 0xbf, 0x92, 0x3f, 0x75, 0x0e, 0xc5, 0x88, 0x37, 0x33, 0x53, 0x29, 0xb5, 0xd8, 0x4d, 0xbd, 0xae, 0x09, 0xa3, 0x4a, 0xa5, 0x95, 0xf1, 0xc3, 0x49, 0xb7, 0x9c, 0xd1, 0x35, 0xf5, 0x1e, 0xd2, 0xd9, 0x49, 0x9e, 0x23, 0xb8, 0x7f, 0xc4, 0x9a, 0xd5, 0xde, 0xcb, 0x57, 0x67, 0x0a, 0xd8, 0xbd, 0xd4, 0x29, 0x8a, 0xbb, 0xdd, 0x45, 0xd2, 0x50, 0x16, 0xf1, 0x05, 0x4e, 0x9a, 0x30, 0x2f, 0x5e, 0xfc, 0x92, 0xab, 0x44, 0x81, 0xa0, 0xf0, 0x64, 0x8c, 0x7a, 0xae, 0x85, 0x59, 0xbf, 0x1a, 0xd6, 0xee, 0xad, 0x85, 0x2e, 0x4f, 0x8a, 0x34, 0x98, 0xf2, 0x42, 0x6c, 0x0f, 0x72, 0x51, 0xcc, 0x86, 0x87, 0xe3, 0xe0, 0x2c, 0x36, 0x3a, 0xf2, 0xed, 0x45, 0x51, 0x23, 0x3c, 0xf2, 0xbf, 0xbb, 0x10, 0xe5, 0xdd, 0xbe, 0x2c, 0x62, 0x2b, 0xc0, 0xa4, 0xc3, 0xf0, 0xf9, 0x9d, 0x26, 0x21, 0x9c, 0x54, 0x63, 0x84, 0x65, 0x62, 0x41, 0x15, 0x71, 0x3e, 0xe9, 0xa9, 0x53, 0x03, 0x9a, 0xd1, 0x64, 0x73, 0x9f, 0x01, 0x5a, 0x3c, 0x7e, 0xf2, 0x1d, 0x7b, 0x73, 0x44, 0xd6, 0x7f, 0x1c, 0x68, 0x48, 0xcf, 0x76, 0xbd, 0x63, 0x6e, 0x08, 0xf9, 0x16, 0x5d, 0x5e, 0xcb, 0x66, 0x62, 0xb9, 0xbf, 0xbd, 0x08, 0x05, 0x61, 0x84, 0xe7, 0x0b, 0xa5, 0xf3, 0x25, 0xe8, 0x86, 0x28, 0x3d, 0xbe, 0xee, 0x77, 0xff, 0xa9, 0xd6, 0x02, 0xd9, 0xf5, 0xae, 0x89, 0x54, 0x8e, 0xff, 0x83, 0xe1, 0xb7, 0x4f, 0x6d, 0xd6, 0xff, 0x45, 0x62, 0xb4, 0x71, 0x0d, 0xec, 0xab, 0x0c, 0xfe, 0x1a, 0x60, 0x73, 0x7a, 0xd2, 0xed, 0xe5, 0x16, 0x69, 0x29, 0x6e, 0xfb, 0x71, 0x2b, 0x5f, 0x8d, 0xd2, 0x09, 0xfd, 0x4a, 0x1d, 0xe5, 0x76, 0xf4, 0x1c, 0x2b, 0x19, 0xf2, 0xae, 0x14, 0xc5, 0xf4, 0xd1, 0x6f, 0xa2, 0xd6, 0x01, 0xa0, 0x10, 0xc7, 0xc1, 0xe9, 0xdd, 0xaa, 0x77, 0xe8, 0xbb, 0xbc, 0x7c, 0x61, 0xf1, 0x77, 0x74, 0x3e, 0x50, 0xb7, 0xdb, 0xd4, 0x69, 0x1c, 0xe1, 0x68, 0xfd, 0xaf, 0x78, 0xf2, 0xb5, 0xc8, 0xab, 0x20, 0x13, 0x2f, 0x31, 0x9e, 0xa9, 0x81, 0x42, 0x95, 0x89, 0xd5, 0xa9, 0x72, 0xfc, 0xa0, 0x1b, 0xe8, 0x77, 0xd6, 0xc7, 0x38, 0xca, 0x52, 0x2e, 0xb0, 0x9b, 0x78, 0x35, 0x71, 0x13, 0x19, 0x78, 0x76, 0xd7, 0x96, 0xe2, 0xd2, 0x3a, 0x49, 0x7b, 0x39, 0xb1, 0x20, 0x80, 0xc2, 0x87, 0x8b, 0xb9, 0xeb, 0xd1, 0x99, 0x07, 0xde, 0xa5, 0x5e, 0x3d, 0xf3, 0x87, 0x97, 0x30, 0x75, 0x24, 0x91, 0x12, 0xa9, 0x43, 0x46, 0xfb, 0x0c, 0xf8, 0xc9, 0xc9, 0xdd, 0x1a, 0xe5, 0x2a, 0xdb, 0xf8, 0x01, 0xf7, 0x50, 0x48, 0x47, 0xc4, 0x4e, 0x60, 0x06, 0xb5, 0x39, 0xa9, 0x54, 0x93, 0x85, 0x50, 0xf7, 0x1e, 0xc1, 0x3e, 0x86, 0xa5, 0xd5, 0x4b, 0xcb, 0xd5, 0x88, 0xae, 0x6c, 0xcf, 0x45, 0xb8, 0xca, 0x7d, 0x1e, 0xc3, 0x2a, 0x25, 0x11, 0x65, 0x13, 0x3e, 0x8a, 0xe9, 0xf6, 0x83, 0x2a, 0xff, 0x15, 0x47, 0xc7, 0xb2, 0x9d, 0x08, 0xb4, 0x9b, 0x15, 0x46, 0x42, 0x54, 0xfc, 0x95, 0x86, 0x30, 0xae, 0xf2, 0x5d, 0x29, 0x88, 0x53, 0xae, 0x1a, 0x4c, 0x82, 0xef, 0x2f, 0xc7, 0x2a, 0xeb, 0x99, 0xb1, 0x32, 0xc2, 0x86, 0xd4, 0x4b, 0x31, 0x50, 0x71, 0xc5, 0x13, 0xf4, 0xdf, 0xa7, 0x28, 0xc7, 0x75, 0xfe, 0x16, 0x64, 0xaa, 0x75, 0xad, 0xe9, 0x7b, 0x26, 0x6f, 0x63, 0x0d, 0xb0, 0x50, 0x86, 0x94, 0x8a, 0xba, 0xa2, 0x73, 0x97, 0xd4, 0xd2, 0xa5, 0xfa, 0x04, 0x77, 0x5b, 0x2b, 0xb3, 0xe4, 0xe6, 0x4a, 0x50, 0x5b, 0xd8, 0xb4, 0x97, 0x39, 0x66, 0xd5, 0x13, 0x6d, 0x11, 0x3d, 0xe1, 0x2e, 0x86, 0xf5, 0xb8, 0xee, 0xc2, 0x13, 0x26, 0x89, 0x79, 0x8c, 0x1c, 0xc3, 0xb9, 0x4a, 0xad, 0xf1, 0xcb, 0x7e, 0x13, 0xf6, 0x5a, 0x38, 0xf3, 0x71, 0xd6, 0x35, 0xe2, 0x35, 0x1b, 0xf7, 0x27, 0xfa, 0x4e, 0x1b, 0xc2, 0x52, 0x08, 0xe8, 0xae, 0xde, 0xb7, 0x24, 0x64, 0xc1, 0x41, 0x2b, 0xa0, 0x55, 0xea, 0x42, 0x67, 0x1d, 0x77, 0x28, 0x49, 0xfb, 0x93, 0xee, 0xe4, 0xa3, 0x73, 0x09, 0xa9, 0x50, 0xb6, 0xa6, 0xe3, 0xb6, 0x8f, 0x3d, 0xf4, 0x37, 0x25, 0x69, 0xe2, 0x59, 0x3a, 0xf7, 0x13, 0x78, 0x0b, 0x3c, 0x55, 0xb8, 0x78, 0xac, 0x22, 0x3e, 0x65, 0xa9, 0x21, 0xa0, 0x60, 0x99, 0xef, 0x99, 0x84, 0x3b, 0x20, 0x02, 0x9d, 0x3b, 0x81, 0xfd, 0x8d, 0x04, 0xa0, 0x74, 0xee, 0xd5, 0x8f, 0xc2, 0xf8, 0x17, 0xe4, 0xaf, 0xa5, 0xee, 0x04, 0xa2, 0x14, 0x0e, 0xa2, 0x12, 0x2b, 0xd0, 0x82, 0x3e, 0x81, 0x84, 0x83, 0x1e, 0x7b, 0x09, 0xdc, 0x99, 0xb5, 0x9c, 0xa6, 0xf8, 0xa3, 0xee, 0x9b, 0x9b, 0x78, 0x79, 0x1d, 0xea, 0x46, 0x13, 0x7a, 0x8f, 0x67, 0xc4, 0x6e, 0xe3, 0x1d, 0xd5, 0xe9, 0xa5, 0x75, 0x29, 0x13, 0xf2, 0x71, 0xd1, 0x8d, 0x71, 0x65, 0xda, 0xfa, 0xcf, 0xa2, 0x69, 0xbf, 0x6b, 0x52, 0x0b, 0x06, 0x52, 0xa3, 0x46, 0x09, 0x6d, 0x28, 0x74, 0x8d, 0xf9, 0x7c, 0xd1, 0xac, 0x38, 0x28, 0xd2, 0xd8, 0x66, 0xc6, 0xb8, 0x1d, 0xef, 0x67, 0x66, 0xa6, 0xdf, 0x33, 0x6f, 0x83, 0x9a, 0x4f, 0x74, 0xaa, 0xcd, 0x04, 0xad, 0x3b, 0xa4, 0x1d, 0xc5, 0x08, 0x3e, 0x90, 0xeb, 0x54, 0x5e, 0x61, 0x26, 0xdb, 0x63, 0xc4, 0xe8, 0x13, 0x7a, 0x82, 0xe7, 0xb2, 0x12, 0x9d, 0x28, 0x70, 0x90, 0x37, 0x5c, 0x0e, 0x44, 0xb0, 0x70, 0x97, 0x9c, 0x0f, 0x60, 0xe6, 0x98, 0xa3, 0x4c, 0x68, 0x7e, 0xea, 0xcd, 0x23, 0xcf, 0xb1, 0x89, 0xf7, 0x79, 0x7d, 0x05, 0x24, 0x4e, 0x2a, 0xbb, 0x0d, 0xb5, 0xd2, 0x6d, 0x3c, 0xa0, 0xf0, 0xb8, 0xa5, 0xbe, 0xc5, 0xec, 0x2f, 0xf1, 0xfb, 0x1b, 0x70, 0x02, 0x89, 0x70, 0xb8, 0x94, 0xd6, 0xc2, 0x52, 0x56, 0x21, 0x69, 0x06, 0x7d, 0x20, 0x51, 0xe2, 0x72, 0xe7, 0x4d, 0x3b, 0xc7, 0x0c, 0xad, 0xee, 0x70, 0x09, 0x12, 0xeb, 0x30, 0xe1, 0x81, 0xf5, 0x51, 0x07, 0xb7, 0xa3, 0x98, 0x7b, 0xbc, 0xab, 0x78, 0x36, 0xbb, 0x5f, 0x86, 0xc8, 0x11, 0x78, 0x2d, 0x40, 0xa4, 0x13, 0xa3, 0x4c, 0x76, 0xf9, 0x1b, 0xa1, 0x7a, 0x23, 0x3d, 0x9d, 0xa6, 0x7e, 0xd3, 0x2b, 0x49, 0xeb, 0xc5, 0xe8, 0x9f, 0x8a, 0x47, 0x84, 0xa2, 0x38, 0x51, 0x6a, 0x24, 0x56, 0x4f, 0xa3, 0x1b, 0xcd, 0x1b, 0xf7, 0x3c, 0x4e, 0x28, 0x56, 0xcb, 0xdf, 0x00, 0x77, 0xb1, 0x93, 0xf0, 0xbf, 0xcf, 0x98, 0x01, 0x64, 0x92, 0x77, 0x2b, 0xd2, 0xc7, 0x98, 0xc6, 0x4e, 0xb1, 0x05, 0x41, 0xd9, 0x59, 0x6f, 0x16, 0x57, 0x26, 0x76, 0xfd, 0xf0, 0xad, 0x25, 0x61, 0xb7, 0xca, 0xbc, 0x10, 0x89, 0xf0, 0xb3, 0x36, 0x38, 0xbd, 0xfb, 0x8c, 0xe9, 0xd2, 0x87, 0xcd, 0xbb, 0xe1, 0x0b, 0x6a, 0xaa, 0x07, 0x04, 0x7e, 0xb2, 0x5d, 0xf8, 0x04, 0x37, 0xca, 0xff, 0x48, 0xa4, 0x1b, 0x82, 0x9b, 0x53 ],
+    const [ 0xbe, 0x10, 0x5a, 0x6c, 0x58, 0x5a, 0x76, 0x6a, 0xa1, 0xf2, 0x90, 0xb6, 0x32, 0x21, 0x9f, 0xf8, 0x64, 0xea, 0x66, 0x74, 0xb5, 0xe3, 0xf9, 0x84, 0x6d, 0x44, 0x7d, 0x46, 0x81, 0x3e, 0x2f, 0x92, 0xb7, 0x8e, 0xa8, 0x2f, 0x0b, 0x51, 0x5f, 0x46, 0x51, 0x1a, 0x6f, 0x16, 0x1d, 0x42, 0x9a, 0xea, 0xe0, 0x7f, 0x8e, 0x48, 0x53, 0xb8, 0x68, 0x6c, 0x19, 0x18, 0x77, 0xf5, 0xa0, 0x62, 0x42, 0xdd, 0x48, 0x84, 0xcc, 0xae, 0xc7, 0x6e, 0x16, 0xf3, 0xcc, 0x24, 0xe6, 0xed, 0xe2, 0x12, 0xc7, 0x88, 0x97, 0xa1, 0x51, 0x8d, 0xde, 0x07, 0xaa, 0x19, 0xb3, 0x63, 0x4d, 0x4e, 0xfd, 0x09, 0x0a, 0x48, 0xb8, 0x1a, 0x4e, 0x53, 0x53, 0x59, 0xa5, 0x5b, 0x57, 0x39, 0x7d, 0xa4, 0x4a, 0x3b, 0x2d, 0xbb, 0xd3, 0x76, 0x36, 0xac, 0x1f, 0x77, 0xc8, 0x75, 0x82, 0x4c, 0x88, 0xbb, 0x62, 0xdc, 0x90, 0xbc, 0x51, 0x7a, 0xb7, 0x85, 0x79, 0xb9, 0x13, 0x64, 0x3d, 0x81, 0xbd, 0xa1, 0x1d, 0x62, 0xd4, 0x69, 0xda, 0x29, 0xc5, 0x0b, 0xdb, 0xb1, 0xc9, 0x67, 0xd0, 0xfc, 0xaf, 0xa2, 0x95, 0x82, 0xdb, 0x1f, 0x59, 0xc9, 0x8f, 0xab, 0xff, 0x36, 0x69, 0xf8, 0xc4, 0x23, 0x2d, 0x4d, 0x23, 0x32, 0xc5, 0x7b, 0xf6, 0xe0, 0x86, 0x13, 0xdd, 0x5d, 0xb5, 0xd6, 0xe3, 0x9b, 0x4a, 0x6d, 0x5f, 0xa4, 0xf3, 0x5b, 0x19, 0x32, 0x5c, 0x2f, 0xae, 0x79, 0xae, 0xfe, 0x36, 0x48, 0x56, 0x10, 0x23, 0x50, 0x07, 0xda, 0x6c, 0xc3, 0x02, 0x2c, 0xec, 0x22, 0x95, 0xac, 0x05, 0x50, 0xe1, 0x83, 0x88, 0xea, 0xe1, 0x56, 0xd9, 0xdb, 0xa8, 0x78, 0x4e, 0x2a, 0xea, 0x5e, 0xd9, 0x17, 0xbe, 0x53, 0xe7, 0x67, 0xa2, 0x6c, 0x87, 0xfc, 0xc0, 0xbf, 0xcf, 0xa8, 0x70, 0xd0, 0x7b, 0x43, 0xfd, 0x4c, 0xd8, 0xfb, 0xac, 0xfa, 0xe1, 0xec, 0xfa, 0xee, 0xa7, 0xf1, 0x26, 0x00, 0xf6, 0xb9, 0xef, 0x7c, 0x35, 0x1d, 0x9f, 0x1b, 0x8e, 0xb0, 0x48, 0x32, 0x4f, 0x98, 0x4e, 0x2a, 0x90, 0x9d, 0x25, 0x30, 0x17, 0x80, 0x5c, 0x2d, 0x78, 0x8e, 0xdb, 0xf9, 0x80, 0x74, 0x69, 0xcc, 0xd4, 0x55, 0x71, 0xf5, 0xd6, 0x1a, 0x05, 0xce, 0xc8, 0x0a, 0x23, 0xef, 0x34, 0x9a, 0x37, 0xa2, 0x8b, 0x86, 0xe2, 0x97, 0x0c, 0x20, 0xfa, 0xd9, 0xe7, 0xe8, 0xd2, 0x01, 0xa3, 0x5e, 0xbb, 0xaa, 0xbd, 0x14, 0xca, 0x24, 0x92, 0x07, 0xdc, 0x6d, 0x7e, 0x2f, 0xd8, 0x5c, 0x46, 0x55, 0x34, 0x20, 0xb3, 0x25, 0xbb, 0xe9, 0x80, 0x84, 0x8d, 0xe5, 0x77, 0x24, 0x67, 0x6e, 0xd6, 0x55, 0x24, 0x82, 0xf7, 0x1e, 0x84, 0x73, 0x30, 0x8c, 0x2d, 0xdf, 0xf9, 0x4a, 0xef, 0xe3, 0x4c, 0x72, 0x4c, 0x8c, 0x52, 0xa3, 0x38, 0x8e, 0x3b, 0x54, 0x1d, 0x39, 0x6d, 0x67, 0x22, 0xa8, 0xe2, 0x01, 0xad, 0x3c, 0xcb, 0x9a, 0x26, 0x49, 0x7a, 0x50, 0xff, 0x0e, 0x7e, 0x81, 0xf1, 0xeb, 0x10, 0x98, 0x88, 0xce, 0xae, 0x27, 0xe1, 0xef, 0x05, 0x37, 0xb3, 0xbd, 0x14, 0xdc, 0x8c, 0x17, 0x8f, 0x0c, 0x5d, 0xc0, 0x81, 0xb0, 0x39, 0x0d, 0x36, 0xfc, 0x5a, 0xe1, 0x58, 0xfc, 0x65, 0xdb, 0x58, 0x70, 0xee, 0xce, 0x0f, 0xda, 0x3f, 0x72, 0xa6, 0xd5, 0x55, 0x59, 0xb3, 0xa8, 0x2c, 0x24, 0xa4, 0x1b, 0x3d, 0xf6, 0x61, 0x8a, 0x44, 0x29, 0x2d, 0x37, 0x46, 0x40, 0xcd, 0xe4, 0xd3, 0x1d, 0xed, 0xa2, 0x89, 0x75, 0xbf, 0xe4, 0xd9, 0x80, 0xe5, 0xd7, 0x0e, 0xf5, 0x91, 0xf6, 0x8a, 0x35, 0xeb, 0xd9, 0x53, 0xc6, 0xb3, 0x4d, 0xcf, 0x04, 0x27, 0xaa, 0xcc, 0x13, 0x27, 0x61, 0xc3, 0x18, 0x97, 0xd5, 0x5e, 0xa9, 0x05, 0x6c, 0x37, 0x82, 0x8b, 0xe5, 0xe3, 0x79, 0xf7, 0xec, 0x2f, 0xb4, 0x2a, 0xeb, 0xa9, 0x19, 0xbe, 0x24, 0x63, 0x06, 0xec, 0xfd, 0xf3, 0x42, 0xac, 0x9a, 0xbe, 0x34, 0x1d, 0xb1, 0x77, 0x53, 0x28, 0x9a, 0xe2, 0xde, 0x60, 0xa6, 0xde, 0xcd, 0x2d, 0xb2, 0xa2, 0x07, 0x2a, 0xfc, 0x47, 0xd5, 0xcb, 0x35, 0x87, 0x97, 0x43, 0xd7, 0xc4, 0xb6, 0xa5, 0xb8, 0x4b, 0xd9, 0x49, 0xe0, 0xdb, 0x5c, 0x71, 0x97, 0x61, 0xfe, 0x2c, 0xc3, 0x06, 0xd9, 0x7b, 0x71, 0x6b, 0x98, 0xb3, 0xb2, 0x33, 0xe4, 0x22, 0xa8, 0xc3, 0x1f, 0xf5, 0xe0, 0x45, 0x55, 0x59, 0xe2, 0xf3, 0x6f, 0xe1, 0x07, 0x92, 0xaa, 0x28, 0x8b, 0x3c, 0x48, 0xb7, 0xe3, 0x63, 0x86, 0x29, 0x51, 0x13, 0xcd, 0x8d, 0xb5, 0x77, 0x2c, 0x0b, 0xa6, 0x9f, 0x06, 0xcb, 0xc1, 0x80, 0x08, 0x12, 0x41, 0x3d, 0x5e, 0xae, 0xd1, 0xa5, 0x27, 0x95, 0x9e, 0xfc, 0x26, 0xc9, 0xaf, 0xfe, 0xba, 0x7e, 0x79, 0x21, 0x10, 0x7f, 0xae, 0x1b, 0x97, 0xce, 0x57, 0xa4, 0xb4, 0x8a, 0x22, 0x7d, 0xb8, 0x16, 0xfd, 0xb1, 0x0f, 0x78, 0xe3, 0x1b, 0xb9, 0xff, 0xf6, 0x28, 0xff, 0x29, 0xcf, 0xde, 0x5e, 0xc3, 0x12, 0x1d, 0xc8, 0x52, 0x45, 0x25, 0x0c, 0xb2, 0xe2, 0x59, 0x92, 0xfd, 0xaa, 0x43, 0x4b, 0xaf, 0x3d, 0xd7, 0xe8, 0x07, 0xe8, 0xfc, 0x4a, 0xb0, 0xbe, 0x48, 0x3a, 0xa0, 0xea, 0x0b, 0x5b, 0x41, 0x43, 0x90, 0x5c, 0xce, 0x21, 0x9f, 0x72, 0x00, 0x6f, 0x46, 0x06, 0xeb, 0x02, 0xda, 0xab, 0x22, 0x29, 0x38, 0x52, 0x22, 0x86, 0x50, 0xc1, 0xee, 0x1c, 0xe5, 0x41, 0xf6, 0xa8, 0x8e, 0x97, 0x3d, 0x35, 0x01, 0x36, 0xbb, 0xeb, 0x90, 0xb3, 0x01, 0x28, 0xf4, 0x79, 0x1b, 0xd2, 0x4a, 0xbe, 0xba, 0xeb, 0x5b, 0xb6, 0x93, 0x65, 0x20, 0x06, 0x02, 0x38, 0x86, 0x7b, 0xf3, 0xb3, 0x6e, 0xfc, 0x02, 0x0f, 0xf8, 0xbd, 0xe1, 0x4a, 0x01, 0xb6, 0xfa, 0x33, 0xea, 0x54, 0x56, 0xc1, 0x9b, 0x6e, 0xbe, 0xa8, 0xc8, 0x7a, 0x20, 0x2e, 0x73, 0x01, 0x34, 0x3b, 0xb3, 0x50, 0x5e, 0xb0, 0xb3, 0x71, 0xd7, 0xfa, 0xfd, 0x59, 0x08, 0xe7, 0xf9, 0x63, 0x36, 0xb8, 0xb0, 0xfd, 0x64, 0x77, 0xd6, 0xa1, 0x75, 0x8b, 0x08, 0x08, 0x92, 0x89, 0x52, 0x9a, 0xcb, 0x4d, 0xf4, 0x28, 0x01, 0x4a, 0x66, 0xdd, 0x03, 0x1e, 0x99, 0x72, 0xf7, 0x69, 0x80, 0xa2, 0xfc, 0xe0, 0xcf, 0xde, 0x0d, 0x9d, 0x03, 0x41, 0x28, 0xb9, 0xa2, 0xc6, 0xb0, 0x1d, 0xc4, 0xb9, 0x11, 0x95, 0xd2, 0x6b, 0xa2, 0x27, 0x8e, 0x2a, 0xcf, 0xa2, 0x53, 0x70, 0x77, 0x79, 0x9e, 0x5b, 0x93, 0xd2, 0xce, 0x5d, 0x19, 0xdb, 0x28, 0x35, 0x20, 0x5d, 0x1e, 0x1e, 0x44, 0x93, 0xd1, 0x46, 0x4c, 0x3c, 0xd4, 0x81, 0x0a, 0xef, 0x33, 0x3f, 0x83, 0xaf, 0xb4, 0xbc, 0x50, 0xbf, 0x5c, 0x76, 0x44, 0xb7, 0x35, 0xe4, 0x4f, 0xd8, 0x4f, 0x65, 0xa2, 0x9d, 0x05, 0x77, 0x14, 0x92, 0x81, 0x29, 0xc5, 0x69, 0x83, 0xd3, 0x01, 0x4b, 0x5d, 0x04, 0x67, 0x6c, 0x43, 0xbc, 0x4a, 0xe2, 0xc1, 0xdb, 0x57, 0xb7, 0x8d, 0xda, 0x78, 0x3d, 0x7f, 0xb9, 0xf9, 0xa1, 0xde, 0x38, 0xea, 0xc3, 0xdd, 0x4a, 0xc4, 0x45, 0x65, 0xc7, 0x4f, 0xe3, 0x15, 0x61, 0xc2, 0x02, 0x88, 0xd9, 0x2c, 0x8b, 0xd6, 0x73, 0x14, 0xf9, 0x5d, 0xa7, 0x5c, 0xb1, 0xc1, 0x19, 0x6c, 0x92, 0x31, 0xcb, 0x8c, 0xce, 0xec, 0x91, 0x90, 0xf8, 0x04, 0xc6, 0xbb, 0x5e, 0x62, 0x3e, 0xde, 0x98, 0x0b, 0x7b, 0xc0, 0x61, 0xa2, 0x24, 0xc2, 0xa6, 0x2d, 0xb2, 0xc3, 0xdd, 0x1c, 0x6d, 0x42, 0x98, 0x87, 0x97, 0xc2, 0x5a, 0xb7, 0xe7, 0x73, 0xa9, 0xe8, 0x39, 0x0e, 0x64, 0x4d, 0x83, 0x01, 0x57, 0x55, 0x0b, 0xcc, 0x0d, 0x2d, 0xd7, 0xab, 0xe5, 0x86, 0x65, 0x75, 0x68, 0x98, 0x9d, 0xc4, 0xda, 0x66, 0x04, 0x56, 0x0f, 0x44, 0x32, 0xb3, 0x81, 0x97, 0x86, 0x10, 0x9f, 0xdd, 0x18, 0x74, 0x67, 0xed, 0xef, 0x19, 0x36, 0x7f, 0x75, 0x15, 0xdf, 0xee, 0x27, 0x39, 0xfb, 0x3d, 0x91, 0x3a, 0x81, 0x59, 0x7a, 0x0e, 0x97, 0x9d, 0x5c, 0x99, 0xa7, 0x9b, 0x17, 0x89, 0xb4, 0x1a, 0xe5, 0x7f, 0xef, 0x5b, 0x91, 0x6f, 0x85, 0xa1, 0xe4, 0x49, 0xbc, 0xef, 0x61, 0xd9, 0x3e, 0x14, 0x32, 0xec, 0xb4, 0xe5, 0x61, 0xb4, 0x97, 0xca, 0x4b, 0x6d, 0x43, 0x7c, 0x52, 0x41, 0x4e, 0x0c, 0xd3, 0x69, 0x17, 0x28, 0x58, 0x96, 0xa2, 0x9a, 0x0e, 0x8f, 0xa3, 0x11, 0x79, 0x1b, 0xd8, 0x24, 0x66, 0x21, 0x9c, 0x94, 0x21, 0x0e, 0xba, 0xd1, 0xe9, 0x77, 0x7f, 0xc0, 0xa1, 0x00, 0x13, 0xbc, 0xc8, 0x7c, 0x09, 0xdb, 0xab, 0x55, 0x34, 0x72, 0xd9, 0x2e, 0xbc, 0xdb, 0xd8, 0xc8, 0x72, 0x75, 0x16, 0x22, 0x61, 0xed, 0x22, 0xe5, 0xa5, 0xbc, 0x1c, 0xfe, 0x81, 0xf1, 0x6b, 0x8d, 0xab, 0x31, 0xad, 0xfe, 0xea, 0xfc, 0xf4, 0x75, 0xe3, 0x31, 0x2f, 0x70, 0x30, 0xd5, 0xe6, 0xa8, 0xb3, 0x10, 0x2b, 0x38, 0x2a, 0x78, 0xcd, 0x00, 0x03, 0x93, 0xce, 0x4c, 0x71, 0x96, 0x17, 0xb1, 0xbf, 0x73, 0x6b, 0x38, 0xe5, 0x13, 0x9a, 0xbf, 0x59, 0xe0, 0xf7, 0x9b, 0x27, 0x87, 0x0b, 0x82, 0x44, 0xfc, 0x8b, 0xa9, 0x1f, 0xbe, 0x88, 0x29, 0x7a, 0x5c, 0xe6, 0xa7, 0x78, 0x38, 0x0f, 0x34, 0xf7, 0x8b, 0xe8, 0x72, 0x1f, 0xa9, 0x05, 0xf8, 0x3b, 0x87, 0x19, 0xf8, 0xc8, 0x7a, 0xb0, 0x1f, 0xcc, 0x41, 0x20, 0xbd, 0x6a, 0x46, 0xbc, 0x26, 0xb2, 0x21, 0x4c, 0x58, 0xbe, 0x5e, 0xba, 0xde, 0xfa, 0x80, 0x0e, 0xf4, 0xc3, 0x45, 0x9c, 0xeb, 0x34, 0x2c, 0x7c, 0xcf, 0x3c, 0x35, 0x3b, 0x48, 0xf4, 0xe8, 0xd0, 0xbe, 0x30, 0x98, 0xd2, 0xc0, 0x55, 0xe9, 0xe8, 0xa7, 0x6a, 0x90, 0x80, 0x76, 0x71, 0x5a, 0xc4, 0x05, 0xf7, 0x70, 0xc9, 0x5f, 0xea, 0xd9, 0x0a, 0x68, 0xab, 0x40, 0x16, 0xc3, 0x64, 0xf8, 0x85, 0xf2, 0x9c, 0x3d, 0x30, 0xbf, 0x08, 0xbd, 0xa2, 0xdb, 0xa4, 0x57, 0xc9, 0xc6, 0x03, 0x22, 0xf1, 0xee, 0xe3, 0xb1, 0xf4, 0x1b, 0x05, 0x95, 0xaa, 0x0a, 0x3c, 0x24, 0xa7, 0x58, 0xc3, 0x79, 0x26, 0xa3, 0xd3, 0xbc, 0x40, 0xeb, 0x75, 0xa4, 0x62, 0x3e, 0x96, 0x39, 0xfd, 0x94, 0x59, 0xdf, 0x7f, 0xf8, 0xb1, 0x90, 0x83, 0xe8, 0x2e, 0x69, 0x44, 0xff, 0x17, 0x68, 0x58, 0xd1, 0xba, 0x74, 0x9b, 0x17, 0x00, 0x9d, 0x69, 0x0c, 0x44, 0xa6, 0x10, 0x16, 0x65, 0xc0, 0x84, 0xa9, 0x1a, 0x99, 0x55, 0x68, 0x86, 0x95, 0xdf, 0x8e, 0x0d, 0x5b, 0xc1, 0x8d, 0x65, 0x94, 0x90, 0xf5, 0xf0, 0xef, 0xcc, 0x96, 0x49, 0x69, 0x12, 0xe9, 0x1d, 0xcb, 0x94, 0xac, 0x3c, 0x74, 0xc7, 0xcd, 0xef, 0x58, 0x5b, 0x89, 0x8d, 0x49, 0x70, 0xd5, 0x49, 0x76, 0x07, 0xfd, 0x4e, 0x31, 0xb6, 0x8b, 0x0e, 0xf5, 0xa1, 0x6a, 0xd6, 0xa7, 0xa5, 0x4b, 0xa6, 0x1c, 0xd6, 0x48, 0x41, 0xdc, 0x2c, 0xc7, 0x80, 0x25, 0x79, 0xa2, 0xeb, 0x33, 0x9e, 0x85, 0x8a, 0xbf, 0xff, 0x97, 0xf9, 0xc6, 0x34, 0x5c, 0xbb, 0x8b, 0x02, 0xda, 0xd0, 0xdf, 0x89, 0xfa, 0x8a, 0xa0, 0xbe, 0x32, 0x9c, 0x80, 0x1c, 0x61, 0x74, 0x07, 0x97, 0xfa, 0xcb, 0xdc, 0xd2, 0x65, 0x7a, 0x40, 0x91, 0xa2, 0x8f, 0xdb, 0x71, 0x30, 0xa0, 0xbb, 0xd7, 0x2d, 0x5f, 0x9a, 0x26, 0xbe, 0x6f, 0x5f, 0x35, 0xb1, 0x76, 0xe8, 0x00, 0x61, 0x74, 0x07, 0x9d, 0xda, 0x53, 0xca, 0x72, 0x3e, 0xbf, 0x00, 0xa6, 0x68, 0x37, 0xf8, 0xd5, 0xce, 0x64, 0x8c, 0x08, 0xac, 0xaa, 0x5e, 0xe4, 0x5f, 0xfe, 0x62, 0x21, 0x0e, 0xf7, 0x9d, 0x3e, 0x90, 0x27, 0x2c, 0x73, 0x8a, 0xab, 0x87, 0xe8, 0xd8, 0x01, 0x07, 0x24, 0x2f, 0x1a, 0xa6, 0xc8, 0x00, 0xb0, 0x07, 0x7d, 0x9f, 0xda, 0xb6, 0x2b, 0xa4, 0xde, 0xb0, 0x6c, 0x92, 0x46, 0x26, 0x40, 0xb6, 0x36, 0x7e, 0x02, 0x52, 0xfc, 0x9b, 0x9a, 0xfb, 0xe9, 0x5e, 0xf5, 0x40, 0x5f, 0x6c, 0xb2, 0x8c, 0x2c, 0x32, 0x1e, 0x4e, 0x16, 0x27, 0x63, 0x56, 0xb7, 0x51, 0xfc, 0x82, 0x8c, 0x0b, 0x6c, 0x9b, 0x48, 0x05, 0x30, 0x7a, 0x6e, 0x8c, 0xf2, 0x6f, 0x1e, 0x0c, 0xff, 0xe3, 0x2f, 0xd3, 0xfb, 0x3b, 0x7f, 0x17, 0xd4, 0x00, 0x87, 0x3b, 0xf4, 0x3d, 0x33, 0x4e, 0xbb, 0x29, 0xf0, 0xd5, 0x2c, 0x06, 0x06, 0xca, 0xe6, 0x49, 0x28, 0xe4, 0x56, 0xfb, 0x49, 0x19, 0x2c, 0x5f, 0xb2, 0x62, 0x0b, 0xd5, 0x52, 0xbe, 0x85, 0xfe, 0x55, 0x79, 0x46, 0x21, 0xf8, 0xae, 0x8f, 0xce, 0x9b, 0x0b, 0xe7, 0xc1, 0x17, 0xd4, 0x0d, 0x08, 0x53, 0x2a, 0x30, 0x69, 0x12, 0x8e, 0x62, 0xfe, 0x0f, 0xa1, 0x4b, 0x22, 0x4c, 0x2d, 0x1a, 0x91, 0xa7, 0x69, 0xc1, 0xca, 0xae, 0x79, 0x62, 0xb8, 0xb4, 0x35, 0x04, 0x92, 0x25, 0x2b, 0x8b, 0x00, 0x16, 0xe7, 0xe7, 0x7f, 0x20, 0x72, 0x8b, 0x06, 0x6f, 0x18, 0x21, 0xea, 0x16, 0x6e, 0x7c, 0xff, 0xa5, 0x94, 0xce, 0x00, 0xfe, 0xb8, 0x1b, 0x30, 0x64, 0xdb, 0xed, 0x42, 0xd5, 0xd8, 0x4a, 0x76, 0x9a, 0xa2, 0xe3, 0x06, 0x1c, 0xcd, 0x8e, 0xc0, 0xf9, 0x50, 0xf6, 0xf4, 0x57, 0x89, 0x91, 0x90, 0x79, 0x81, 0xd3, 0x8a, 0x90, 0x72, 0xa2, 0x7e, 0xd3, 0x86, 0x09, 0x99, 0xd1, 0xe2, 0x30, 0xb5, 0x06, 0xe3, 0x8c, 0xc5, 0xad, 0xa7, 0x53, 0x74, 0xd6, 0xd0, 0x33, 0x09, 0xb8, 0x84, 0x43, 0x8e, 0x48, 0xb8, 0x3a, 0x31, 0x0b, 0xaf, 0xdf, 0xea, 0x28, 0xbd, 0xc0, 0x5e, 0xc1, 0x51, 0x27, 0x04, 0x83, 0x33, 0x4a, 0x86, 0x7c, 0x09, 0xc2, 0x6a, 0x2d, 0x20, 0x3e, 0xf1, 0xe1, 0x69, 0x79, 0x3f, 0x3d, 0xc2, 0x69, 0xbd, 0x17, 0x77, 0xba, 0xbc, 0x8c, 0x09, 0x7a, 0x5b, 0x4c, 0x2e, 0x16, 0xaa, 0x39, 0x18, 0x85, 0x0f, 0x31, 0xfa, 0xc3, 0xe9, 0x27, 0xc9, 0x81, 0x74, 0x79, 0x40, 0x1b, 0xed, 0x7d, 0x26, 0xca, 0xf6, 0x5d, 0xd3, 0x1b, 0x3b, 0x26, 0xf1, 0x9f, 0x56, 0x1b, 0x80, 0xe4, 0xf0, 0x4f, 0x1c, 0xa5, 0x29, 0x73, 0x83, 0x3e, 0x3a, 0xec, 0x52, 0x62, 0x59, 0x29, 0x0f, 0x10, 0xde, 0x33, 0x6c, 0xc3, 0xa3, 0x85, 0xca, 0xea, 0xb0, 0x1f, 0xfd, 0x97, 0x18, 0xd6, 0x4f, 0x7b, 0x1e, 0xee, 0xc7, 0x12, 0x9c, 0xea, 0xab, 0x1b, 0xa6, 0xa3, 0x43, 0x4b, 0x6a, 0x98, 0xe0, 0x42, 0x5a, 0x85, 0x1d, 0xbe, 0x8e, 0x37, 0x65, 0x0f, 0x63, 0x9e, 0xb5, 0xcb, 0x69, 0x24, 0xa3, 0xc2, 0x7c, 0x3d, 0xa0, 0x34, 0x30, 0x3f, 0x7a, 0x42, 0x73, 0x75, 0x25, 0xa3, 0x6d, 0x6e, 0xba, 0x98, 0xab, 0x9b, 0xc0, 0x22, 0x7d, 0x1a, 0xab, 0x72, 0x9c, 0xcc, 0xa2, 0xa1, 0x10, 0xad, 0x85, 0xa1, 0x51, 0x65, 0x2f, 0x74, 0xad, 0x1a, 0xf8, 0x9b, 0xe9, 0x89, 0x7e, 0xd2, 0x2b, 0x55, 0xa6, 0xfa, 0x18, 0x9e, 0xdd, 0x57, 0x39, 0xd6, 0xa4, 0xfb, 0xa3, 0xd0, 0x4b, 0x82, 0xd7, 0x1a, 0xfc, 0x00, 0xe7, 0x8d, 0xfc, 0x38, 0xda, 0x22, 0x2e, 0x0f, 0x52, 0x08, 0xd9, 0x40, 0x6c, 0xf3, 0xaa, 0x50, 0xe8, 0xb6, 0xfd, 0xc5, 0x8a, 0x14, 0x58, 0x93, 0xbf, 0xd3, 0x38, 0xd7, 0x84, 0x13, 0x11, 0xc7, 0x84, 0xde, 0x90, 0xe9, 0x80, 0x00, 0x23, 0x84, 0xf4, 0x19, 0xbb, 0x55, 0xf8, 0xf0, 0xd1, 0x82, 0x64, 0x0a, 0xa7, 0xd4, 0x37, 0x7c, 0xd0, 0x20, 0x3a, 0xfd, 0xf2, 0x06, 0xe0, 0x3f, 0xcb, 0xde, 0x71, 0x80, 0x72, 0xf0, 0x67, 0x5c, 0xdf, 0xe3, 0x19, 0xe5, 0xae, 0x79, 0x96, 0xf5, 0x20, 0x79, 0xd4, 0xc3, 0x63, 0xec, 0x0a, 0xb5, 0x13, 0x8b, 0x5a, 0x75, 0x00, 0x79, 0xb3, 0x47, 0x32, 0x2e, 0xf6, 0x9a, 0x2a, 0xb3, 0x57, 0xdc, 0x6b, 0x15, 0x07, 0x93, 0x39, 0x14, 0x10, 0xaa, 0xa1, 0x1b, 0x80, 0x08, 0xb9, 0x75, 0xc9, 0x68, 0x29, 0xbd, 0x68, 0x64, 0xea, 0x96, 0xc5, 0xd2, 0x4e, 0x9d, 0x5a, 0x54, 0x41, 0x9c, 0x18, 0x2b, 0xce, 0x01, 0x06, 0x4c, 0xe5, 0x8e, 0x2c, 0xb6, 0x5b, 0x51, 0xaf, 0x02, 0x32, 0xd7, 0x3d, 0x3c, 0x1b, 0x9d, 0xab, 0xf1, 0x39, 0xc7, 0xdd, 0x89, 0x28, 0x14, 0xe7, 0xd7, 0x3e, 0x12, 0x71, 0xef, 0x10, 0x8e, 0x60, 0x38, 0x38, 0x4f, 0xb3, 0xc2, 0x56, 0x04, 0xaa, 0xd9, 0x55, 0x7a, 0x2e, 0xda, 0xf0, 0x12, 0x6d, 0x45, 0x74, 0x73, 0xc5, 0x14, 0xc7, 0x7c, 0xe3, 0x4b, 0xa9, 0x7c, 0x2c, 0xd1, 0x3a, 0xa6, 0x5b, 0x7e, 0xbc, 0xbf, 0x6c, 0x75, 0x9b, 0x1a, 0xba, 0xb4, 0xaa, 0xc6, 0x64, 0xe9, 0xb0, 0x06, 0xf4, 0x87, 0x23, 0x01, 0x43, 0x1a, 0x33, 0xbb, 0x97, 0xd8, 0x0b, 0x44, 0x0f, 0x78, 0x53, 0x30, 0x41, 0x47, 0xf9, 0x46, 0x21, 0x78, 0x31, 0x7d, 0x25, 0xbb, 0xba, 0x24, 0xa6, 0x12, 0x63, 0x60, 0x8a, 0xe0, 0xcf, 0xdb, 0x20, 0x43, 0x75, 0xbb, 0x4b, 0xa4, 0xea, 0xd1, 0xe3, 0x8d, 0x63, 0x13, 0x58, 0xba, 0x76, 0x4d, 0x98, 0x72, 0x20, 0x13, 0x33, 0x18, 0x0c, 0xfa, 0xbd, 0xfd, 0x12, 0x08, 0x75, 0x78, 0xff, 0x68, 0x23, 0x39, 0x94, 0x62, 0x47, 0xda, 0xd1, 0x8b, 0x6f, 0xb7, 0x73, 0x39, 0xe9, 0x00, 0xbb, 0x3a, 0x9a, 0x0c, 0x71, 0xc6, 0x2e, 0xf0, 0x29, 0xb1, 0x72, 0x51, 0xc5, 0xe5, 0xfd, 0x76, 0x3b, 0x10, 0x16, 0xa1, 0x98, 0x9a, 0xd2, 0xa0, 0x45, 0xda, 0x7d, 0x9f, 0x89, 0x89, 0x3b, 0x40, 0x50, 0x77, 0xef, 0xee, 0x2b, 0x7c, 0x5c, 0x6e, 0x97, 0xb2, 0x8b, 0xb6, 0x82, 0xe1, 0x6c, 0x03, 0x0b, 0x3b, 0xbf, 0x26, 0x8a, 0x4a, 0x35, 0x1e, 0xd0, 0x26, 0xd3, 0xec, 0xb0, 0xeb, 0x98, 0xa3, 0xbe, 0x6a, 0x5f, 0xbf, 0x56, 0x1f, 0x07, 0xb7, 0xe0, 0x64, 0xd0, 0xd6, 0x53, 0xe3, 0x08, 0x46, 0xf8, 0x51, 0xe8, 0x6e, 0x71, 0x5a, 0xb9, 0x7e, 0xf9, 0xd7, 0x3a, 0x47, 0xed, 0x47, 0x46, 0x51, 0x8c, 0x7d, 0xb2, 0x27, 0xfb, 0x96, 0x75, 0xf6, 0x8b, 0x2e, 0x0b, 0x56, 0x3f, 0xd4, 0x1b, 0x68, 0x89, 0xba, 0x57, 0x21, 0x55, 0xb1, 0xa3, 0xe5, 0x48, 0x55, 0x7a, 0x58, 0x4a, 0x85, 0x8e, 0x71, 0x42, 0x17, 0xaf, 0xd0, 0x20, 0xc9, 0xee, 0x51, 0x21, 0x7a, 0x02, 0xe1, 0x4e, 0x9a, 0xeb, 0x90, 0x47, 0xdf, 0xd5, 0xe8, 0x3e, 0x39, 0x3e, 0x7d, 0x46, 0x09, 0x5b, 0xc6, 0xce, 0x8e, 0xb8, 0x2b, 0x68, 0x9f, 0x20, 0x5f, 0xd0, 0xa0, 0xbc, 0xf0, 0x29, 0xaf, 0x7e, 0x1d, 0x89, 0x1e, 0xc1, 0xe7, 0xb8, 0x26, 0x29, 0x6b, 0x35, 0xd9, 0xd1, 0x6e, 0x7a, 0x59, 0xa5, 0x3a, 0x81, 0x48, 0x0c, 0xa9, 0x87, 0x7f, 0xcb, 0x7f, 0x10, 0x03, 0x26, 0xfc, 0x2b, 0x34, 0x47, 0xb2, 0xf7, 0x48, 0xe4, 0x95, 0x66, 0xf8, 0x1d, 0x51, 0x41, 0x79, 0xa3, 0xe0, 0x6d, 0xae, 0x1f, 0x5b, 0x6c, 0x9c, 0xd2, 0x10, 0x26, 0x1e, 0x78, 0xd6, 0xea, 0xda, 0x73, 0x9d, 0xb0, 0x73, 0x25, 0x49, 0xa1, 0x01, 0x9e, 0xc1, 0xd9, 0xbe, 0x77, 0x42, 0x6b, 0x01, 0xfd, 0xfa, 0xa5, 0x71, 0x93, 0xd2, 0x96, 0x72, 0x51, 0x8b, 0xce, 0xe4, 0xf1, 0x0c, 0x65, 0x0d, 0xec, 0xfa, 0x3f, 0xd3, 0xe0, 0x8a, 0x8d, 0x2f, 0x35, 0x93, 0x97, 0xde, 0x00, 0xe8, 0xba, 0x5a, 0x27, 0xe4, 0xac, 0x08, 0xc7, 0x46, 0x08, 0xb3, 0xd2, 0x3f, 0x06, 0x39, 0xfd, 0xca, 0x89, 0x84, 0xd9, 0x3c, 0x60, 0xbc, 0x3f, 0x1c, 0xc5, 0xbb, 0xf2, 0x34, 0x2a, 0xc2, 0x80, 0xe8, 0x36, 0x6a, 0x69, 0xc7, 0x0a, 0xdd, 0x83, 0x60, 0xc8, 0x45, 0x9d, 0x57, 0x56, 0x85, 0x63, 0xb8, 0x5f, 0x28, 0x82, 0x8a, 0x9b, 0x96, 0x0c, 0xa8, 0x51, 0x8e, 0x1d, 0xcc, 0x1a, 0xd0, 0xbf, 0xed, 0xe7, 0x1a, 0x0b, 0xcb, 0x45, 0x56, 0x91, 0xc8, 0xe0, 0x12, 0xfa, 0xf9, 0x46, 0x30, 0xec, 0x7d, 0xee, 0xdf, 0x2e, 0x0d, 0x79, 0xca, 0x0d, 0xd5, 0x37, 0x8f, 0xfe, 0x82, 0xed, 0x72, 0x84, 0x9d, 0xd6, 0x53, 0x54, 0x17, 0xe7, 0xdd, 0xb8, 0x25, 0x57, 0x01, 0x31, 0x4e, 0x5f, 0xa2, 0x60, 0xc1, 0x3f, 0x92, 0x26, 0xed, 0x81, 0xbe, 0x0b, 0x4c, 0x81, 0xa5, 0xdc, 0x7f, 0x2d, 0x0f, 0x98, 0xa0, 0x0a, 0xfb, 0x8e, 0xd4, 0x78, 0xd9, 0xbf, 0x1f, 0x36, 0xf9, 0x89, 0x7d, 0x28, 0x44, 0x87, 0x2e, 0x58, 0x2a, 0xb3, 0x51, 0x3c, 0xdb, 0xcd, 0xb4, 0x37, 0xba, 0x01, 0xeb, 0x61, 0x0e, 0xc4, 0x9f, 0x8b, 0xfb, 0xff, 0x29, 0x7e, 0xb2, 0x6f, 0x5f, 0x84, 0xe4, 0x4b, 0xae, 0x2a, 0x7c, 0x28, 0x6a, 0x43, 0x8d, 0x1b, 0x61, 0x30, 0x89, 0x1d, 0xb6, 0x5f, 0xb5, 0xb3, 0xed, 0x12, 0xd9, 0xce, 0x42, 0x62, 0x3c, 0xef, 0x3f, 0x83, 0xcf, 0x90, 0x8d, 0x49, 0xa9, 0xc0, 0x0b, 0xeb, 0xb3, 0x0d, 0x1d, 0x08, 0xa5, 0xa6, 0x47, 0xe7, 0x31, 0xc1, 0xfa, 0x03, 0x7d, 0x3b, 0xad, 0xc7, 0xd7, 0x7e, 0x30, 0x96, 0xa5, 0xa8, 0x3d, 0x0e, 0x9a, 0xea, 0x51, 0x8e, 0x30, 0x2d, 0xb9, 0xf5, 0x52, 0xfc, 0xf0, 0xad, 0x58, 0x9e, 0x28, 0xe9, 0x39, 0x82, 0x27, 0x2a, 0xfc, 0xe1, 0x54, 0x08, 0x70, 0x9e, 0x12, 0x2f, 0x1d, 0x71, 0x4c, 0xa8, 0x7a, 0x44, 0x51, 0x5a, 0x61, 0xdd, 0xe3, 0xd0, 0xbf, 0xbe, 0x8a, 0x3c, 0x90, 0x49, 0x2f, 0xbc, 0x0b, 0x28, 0xe5, 0xdd, 0x19, 0xec, 0x0a, 0x5e, 0x0c, 0xf4, 0x8f, 0x36, 0x8e, 0x91, 0x94, 0xd7, 0xd7, 0x67, 0x38, 0xb5, 0x24, 0x17, 0xaf, 0x02, 0x64, 0x1b, 0x95, 0xbc, 0x34, 0xf1, 0x81, 0xea, 0x0d, 0x7b, 0xde, 0x23, 0xbc, 0xa6, 0xf6, 0x4f, 0x13, 0x4a, 0x50, 0xb2, 0xdf, 0x51, 0x3c, 0x26, 0x1a, 0x1c, 0xac, 0xa7, 0x61, 0x22, 0x45, 0x15, 0xa8, 0xda, 0xb6, 0x36, 0x2c, 0xdc, 0x49, 0xfb, 0xa9, 0x43, 0xb7, 0x04, 0xcd, 0x55, 0x41, 0x65, 0xed, 0x66, 0xfc, 0xab, 0xf8, 0xf9, 0x6d, 0x1a, 0xa9, 0x29, 0x55, 0x39, 0x00, 0x47, 0xce, 0x91, 0xf2, 0xc5, 0x97, 0xb1, 0x60, 0x52, 0xad, 0x75, 0x46, 0x47, 0x1b, 0x88, 0x35, 0x42, 0x12, 0x28, 0x03, 0x10, 0x3c, 0x29, 0xc1, 0xd1, 0x4e, 0x3d, 0xed, 0x56, 0xdd, 0x72, 0xe9, 0xce, 0x72, 0xfc, 0xac, 0xa2, 0xe0, 0x35, 0xb8, 0x9d, 0xd5, 0xe2, 0x4b, 0x50, 0xb0, 0xb8, 0xda, 0xb5, 0x92, 0x1f, 0xbb, 0x12, 0xb8, 0x35, 0x22, 0x20, 0x08, 0x16, 0x4e, 0x6d, 0xe9, 0x5b, 0x04, 0xff, 0x58, 0xe0, 0x3d, 0x3a, 0x39, 0xcb, 0x1c, 0x04, 0xea, 0xc9, 0x22, 0x26, 0x1e, 0x9b, 0xa5, 0xf5, 0xe9, 0xd2, 0x7e, 0x33, 0x17, 0xd6, 0x03, 0x30, 0xc2, 0x2d, 0x35, 0x34, 0x24, 0xfa, 0x3a, 0x21, 0xa9, 0xc4, 0x0d, 0x55, 0x48, 0x79, 0x74, 0xce, 0x14, 0xb3, 0x32, 0x91, 0x0e, 0x39, 0x7e, 0x4c, 0x3e, 0xc9, 0xb5, 0x3a, 0x02, 0x15, 0x4c, 0x47, 0xa5, 0x0b, 0x08, 0x75, 0x33, 0x59, 0x71, 0x7e, 0x8c, 0x31, 0x84, 0xbb, 0xb8, 0x49, 0xa8, 0x44, 0x7a, 0x27, 0xe3, 0x59, 0x28, 0x9b, 0x4e, 0x00, 0xb9, 0x8d, 0xc6, 0xf0, 0x20, 0xf8, 0xe5, 0xae, 0xd9, 0x37, 0x30, 0xf6, 0xc1, 0x80, 0x92, 0x5c, 0x2a, 0xae, 0x0a, 0x33, 0x2f, 0x43, 0xa0, 0xae, 0x45, 0xad, 0x9d, 0x45, 0x13, 0xc8, 0xfb, 0x5a, 0x84, 0xa5, 0x1b, 0x1d, 0x1a, 0x8a, 0xb6, 0xad, 0x85, 0x39, 0x16, 0x80, 0x74, 0x75, 0x86, 0x04, 0xab, 0xc3, 0x07, 0x86, 0x55, 0x6e, 0x44, 0x54, 0x9c, 0xcd, 0xc8, 0x1e, 0x78, 0xc8, 0x6f, 0xa2, 0xc4, 0x99, 0x1a, 0x89, 0x97, 0xd0, 0xa7, 0x8b, 0xd1, 0x9a, 0x21, 0xda, 0xf4, 0x42, 0x33, 0xbe, 0x36, 0xf8, 0xe3, 0x7c, 0xd4, 0xd2, 0x7d, 0x7d, 0xa8, 0x10, 0xcc, 0xac, 0xfe, 0xa4, 0x90, 0x20, 0xa4, 0xf2, 0x2d, 0xfb, 0x40, 0xd4, 0xa1, 0x92, 0xe6, 0xe1, 0xb8, 0xce, 0xea, 0xef, 0x83, 0xd2, 0xf3, 0xd6, 0x06, 0xdd, 0x51, 0x77, 0x31, 0x72, 0x91, 0xfd, 0x12, 0xb7, 0x4e, 0x63, 0x48, 0x1c, 0x4a, 0x37, 0xbb, 0x3c, 0xbd, 0x9d, 0x8a, 0x08, 0xec, 0x96, 0x45, 0x22, 0xfe, 0x82, 0x5d, 0x87, 0x0b, 0xe4, 0xd8, 0x71, 0x77, 0x66, 0x49, 0x7c, 0x7e, 0x1d, 0x00, 0x07, 0x0f, 0x0d, 0x7e, 0xdd, 0xde, 0xf0, 0x2c, 0x15, 0xb5, 0x33, 0x4c, 0x36, 0x0a, 0x42, 0x2f, 0x9f, 0xd7, 0x05, 0xa8, 0x26, 0xa6, 0xaa, 0xc2, 0x00, 0xeb, 0xa6, 0xae, 0xe1, 0x97, 0xf6, 0xff, 0x63, 0xea, 0xab, 0x1a, 0xac, 0x89, 0xa5, 0xe7, 0x4b, 0xd0, 0x9f, 0xcd, 0x64, 0x69, 0x6c, 0xde, 0x0d, 0x1e, 0x7f, 0x4e, 0xf7, 0xeb, 0xb1, 0x2a, 0x51, 0x58, 0x3f, 0x46, 0xe9, 0x06, 0x12, 0x78, 0x95, 0x87, 0x44, 0x03, 0xd1, 0x72, 0xdf, 0x56, 0xa9, 0xb7, 0xe8, 0xf7, 0xda, 0x31, 0x9c, 0xba, 0x34, 0x7a, 0xf9, 0x36, 0x42, 0x03, 0x80, 0x79, 0x2d, 0x64, 0x3a, 0xfb, 0xde, 0xf0, 0xf9, 0xd1, 0x63, 0x8d, 0xe0, 0x23, 0x94, 0xc3, 0x25, 0xe0, 0xf6, 0x12, 0x16, 0xb0, 0xdf, 0x89, 0x5a, 0x2b, 0xdb, 0x94, 0x7a, 0x48, 0x4f, 0x16, 0xa0, 0x18, 0x5c, 0xb7, 0x9e, 0xb4, 0x06, 0x80, 0x31, 0x74, 0x96, 0xa5, 0x87, 0x61, 0x3c, 0xa1, 0x00, 0xed, 0xf9, 0x88, 0x32, 0xe2, 0xbc, 0x99, 0x2f, 0x99, 0xcc, 0x13, 0x0a, 0x6c, 0x65, 0x4b, 0x97, 0x6d, 0xa6, 0xfa, 0x73, 0x59, 0xab, 0xdb, 0x44, 0xc7, 0xf6, 0x76, 0x42, 0xa5, 0x13, 0x36, 0xf7, 0xe5, 0x7b, 0xc2, 0x42, 0x74, 0xba, 0x8a, 0xa2, 0x6c, 0xcd, 0xa0, 0xb1, 0x8a, 0xce, 0xca, 0xef, 0xe2, 0xd3, 0xd5, 0xc1, 0xd1, 0x13, 0x2c, 0xba, 0x34, 0x4a, 0xa9, 0x18, 0xd7, 0x5f, 0xaa, 0x92, 0x31, 0x44, 0x68, 0x51, 0x4e, 0x1f, 0x84, 0x3c, 0x0c, 0xa7, 0xe3, 0x78, 0x8a, 0xd0, 0xbc, 0x2f, 0xde, 0xaa, 0xef, 0x91, 0x06, 0x86, 0x99, 0x19, 0x21, 0x5c, 0xe5, 0x12, 0xe0, 0x69, 0x25, 0x59, 0x37, 0x1c, 0x21, 0x64, 0x58, 0x33, 0xae, 0x83, 0xe1, 0x22, 0x83, 0x66, 0x54, 0xb4, 0x49, 0xe0, 0xc9, 0xf4, 0xf1, 0xea, 0xdf, 0x4e, 0x4a, 0xeb, 0xf8, 0xf2, 0xd3, 0x37, 0xa6, 0x79, 0xce, 0xd5, 0x60, 0xcb, 0x95, 0x85, 0x7a, 0x40, 0x31, 0x01, 0x54, 0x05, 0x29, 0x84, 0xd1, 0xc2, 0x98, 0x89, 0x0a, 0x79, 0x82, 0xd5, 0x44, 0xb2, 0x68, 0xb7, 0x20, 0xd5, 0x1a, 0x8f, 0x12, 0xd7, 0xcd, 0x8d, 0x14, 0x18, 0x6d, 0xbb, 0x9c, 0x8c, 0x35, 0x3e, 0xcb, 0x1a, 0x7c, 0xd9, 0xe7, 0x41, 0xd2, 0xb2, 0x0b, 0x01, 0x4b, 0x59, 0x1d, 0xf9, 0x1b, 0x06, 0x01, 0xcd, 0x63, 0x22, 0x0c, 0xca, 0x4b, 0x09, 0xbc, 0xcd, 0x51, 0x0f, 0xa6, 0x60, 0xe1, 0xc1, 0xaf, 0x27, 0x25, 0x6d, 0x7f, 0x7b, 0x1e, 0xe4, 0x33, 0x54, 0xf4, 0x7e, 0x52, 0x6c, 0x8a, 0x5f, 0x03, 0xa1, 0x56, 0xf9, 0x7d, 0x9b, 0x70, 0xd2, 0xbe, 0xb0, 0xe8, 0x87, 0x80, 0x04, 0x5d, 0x12, 0x69, 0xf5, 0xcb, 0x48, 0x82, 0xb6, 0xa5, 0xa5, 0xea, 0x39, 0x24, 0x4c, 0xcc, 0x53, 0xde, 0x4a, 0x8e, 0x1b, 0x9a, 0x1b, 0x4b, 0x93, 0x63, 0x6f, 0x84, 0x8a, 0xdb, 0x2e, 0x12, 0xc0, 0xd2, 0xb9, 0x5f, 0x4c, 0x17, 0x73, 0xd6, 0x3b, 0x8e, 0x80, 0x98, 0x7a, 0x83, 0xcc, 0x71, 0xf6, 0x3e, 0x4f, 0x0a, 0x01, 0xd8, 0x90, 0x60, 0xf8, 0x4d, 0x68, 0x74, 0x22, 0xd1, 0x09, 0x45, 0xdc, 0x68, 0x3e, 0xfb, 0xf3, 0xb1, 0xf5, 0x65, 0x52, 0x02, 0xfa, 0xa5, 0xdd, 0xba, 0x05, 0x2a, 0x9c, 0xd3, 0xf7, 0xdf, 0x1c, 0xb7, 0x61, 0xa2, 0x12, 0x55, 0x46, 0xf8, 0x42, 0x73, 0x22, 0xff, 0x9f, 0x46, 0x2a, 0xa4, 0xb4, 0x40, 0xd6, 0x15, 0x42, 0x29, 0x9d, 0x7a, 0x2b, 0x71, 0xff, 0xe0, 0x8e, 0xc5, 0xc9, 0x75, 0x34, 0xe0, 0x95, 0xfb, 0x2b, 0xa4, 0x90, 0x77, 0xb0, 0x69, 0x80, 0x29, 0x53, 0x95, 0x05, 0xc1, 0x55, 0x6c, 0x1e, 0xd0, 0x55, 0x2a, 0xf0, 0x7d, 0x2b, 0x4f, 0xc3, 0x79, 0x15, 0x3b, 0x4e, 0x35, 0x11, 0xfa, 0x34, 0x52, 0x89, 0x61, 0xce, 0x59, 0x35, 0x5a, 0x2b, 0xac, 0x3e, 0x7c, 0x55, 0xbc, 0x9f, 0xdf, 0xd6, 0x7d, 0xd1, 0x2e, 0x7b, 0x17, 0xa7, 0xfd, 0x58, 0xdf, 0x77, 0x5d, 0x0c, 0x85, 0x7a, 0xae, 0x47, 0x8e, 0x75, 0xb5, 0x89, 0x05, 0x99, 0xef, 0x2c, 0x6e, 0xa8, 0x24, 0xa4, 0xfc, 0x5a, 0x3e, 0x06, 0x04, 0xff, 0x5c, 0xc7, 0xb0, 0x65, 0x23, 0xc6, 0xf8, 0xfc, 0x54, 0x8d, 0xce, 0x38, 0xa4, 0xd4, 0x99, 0x37, 0xc8, 0x47, 0xe5, 0xa4, 0xcf, 0x8a, 0x59, 0xdb, 0xb4, 0x79, 0xe9, 0x4e, 0x34, 0xb4, 0x4d, 0x27, 0xdd, 0x5b, 0xb1, 0x2f, 0x68, 0x16, 0xae, 0xee, 0x48, 0x59, 0x79, 0x14, 0x83, 0xe6, 0x5a, 0x17, 0xc1, 0x93, 0x60, 0x1e, 0xa2, 0x4d, 0x54, 0x1e, 0x55, 0x5d, 0xeb, 0x42, 0x67, 0xea, 0x3f, 0x91, 0xd8, 0xbf, 0x80, 0xcb, 0x74, 0x4f, 0xe7, 0x93, 0x60, 0xf6, 0xec, 0xd3, 0xf4, 0x82, 0xb9, 0x5d, 0xc8, 0xf2, 0xde, 0xce, 0x12, 0x7e, 0x46, 0xb8, 0x2f, 0xd7, 0x6a, 0x00, 0x7f, 0xaf, 0xc4, 0x84, 0x76, 0x7c, 0x87, 0x01, 0xf0, 0x79, 0x8d, 0x35, 0xc5, 0xee, 0x91, 0x40, 0x9e, 0xb2, 0x9e, 0x50, 0x07, 0xee, 0xc7, 0x7d, 0xc5, 0x23, 0x19, 0xf2, 0x69, 0x6f, 0xce, 0x4e, 0x25, 0x0c, 0xc3, 0x4a, 0xdf, 0x19, 0x2d, 0x9b, 0x84, 0x9d, 0x87, 0x1a, 0x9f, 0xc9, 0xcf, 0x22, 0x2a, 0x7d, 0xf1, 0x39, 0xa3, 0x0e, 0x84, 0xf3, 0x63, 0x47, 0xb4, 0x14, 0x2c, 0xad, 0x7f, 0xf5, 0x01, 0x07, 0x25, 0x29, 0x3a, 0x1e, 0xd9, 0x5f, 0xd7, 0xc2, 0xbd, 0x8a, 0x15, 0x0d, 0x0d, 0x40, 0x3f, 0xec, 0x9a, 0x60, 0xc7, 0xda, 0x7b, 0xf8, 0x95, 0xef, 0xff, 0x66, 0x9f, 0x1a, 0xe6, 0xbd, 0xba, 0xab, 0xd0, 0x6a, 0xaf, 0x14, 0xf5, 0x17, 0x92, 0xf0, 0x17, 0xcf, 0x4f, 0x44, 0xb5, 0x63, 0x86, 0x05, 0x82, 0x0d, 0x99, 0xdb, 0x15, 0x54, 0x03, 0x25, 0xe2, 0x2f, 0xeb, 0x3d, 0x69, 0x6d, 0xf8, 0xfd, 0xad, 0x54, 0x68, 0x82, 0xe8, 0x89, 0x5c, 0x2f, 0x7d, 0x30, 0x76, 0xf5, 0x2e, 0x53, 0xa6, 0xd2, 0x8f, 0x88, 0x41, 0x98, 0xba, 0xce, 0x54, 0xf0, 0x45, 0xb9, 0x37, 0x9e, 0x71, 0xcf, 0x65, 0x07, 0xa4, 0x31, 0x8a, 0xf0, 0x1a, 0x7e, 0xde, 0x88, 0xd7, 0xf4, 0xb2, 0xa9, 0xe0, 0xd8, 0x48, 0x5b, 0xaa, 0x18, 0xe8, 0x9a, 0xd3, 0x30, 0x30, 0x59, 0x10, 0x4a, 0xac, 0xc6, 0x67, 0xa9, 0xa7, 0xd0, 0x9e, 0x47, 0x40, 0xe6, 0xf3, 0xbd, 0xc0, 0x02, 0x0d, 0x64, 0x2a, 0xe7, 0x33, 0xba, 0x14, 0xa7, 0xbc, 0x07, 0xb6, 0x67, 0xc6, 0x40, 0x41, 0x66, 0x2b, 0x2b, 0x72, 0x3c, 0xb1, 0xc4, 0x66, 0x60, 0x81, 0xe0, 0xb0, 0xed, 0xdb, 0x10, 0xa9, 0xa6, 0x07, 0xc8, 0x07, 0x37, 0x8f, 0xc0, 0xb1, 0xbe, 0xab, 0x9b, 0xd2, 0x89, 0xfd, 0xc7, 0x2c, 0x21, 0x7e, 0xa4, 0xb0, 0x88, 0xb9, 0xe8, 0x4b, 0xc0, 0x37, 0x42, 0x02, 0x8c, 0x3a, 0x3d, 0x41, 0x7b, 0xae, 0x68, 0x70, 0x21, 0x5c, 0xb4, 0xc8, 0xa8, 0x61, 0x1d, 0x65, 0x88, 0xde, 0x8c, 0x9c, 0x92, 0xf2, 0xfc, 0x8e, 0x33, 0xe5, 0xdc, 0xfd, 0xf7, 0xa6, 0xb5, 0x5f, 0x4c, 0x78, 0x0d, 0x31, 0x89, 0xe8, 0x8b, 0x8e, 0x2e, 0x02, 0x5c, 0x00, 0x6d, 0xc4, 0xd4, 0x96, 0xea, 0xd3, 0x59, 0x37, 0xc0, 0x6d, 0x7d, 0x35, 0xc4, 0x9f, 0x6a, 0x25, 0x0d, 0xb8, 0x83, 0xef, 0xb4, 0xfd, 0x48, 0x21, 0xd8, 0x9e, 0x7a, 0x89, 0xe5, 0xe9, 0x80, 0x02, 0x16, 0xbe, 0x0a, 0x8e, 0x39, 0x43, 0xf4, 0xa5, 0xb3, 0xd8, 0x6d, 0xcd, 0xc3, 0x4e, 0x58, 0x6b, 0x0b, 0x53, 0xf2, 0xd9, 0x4c, 0x31, 0xb6, 0xb8, 0x71, 0xb9, 0x7e, 0x88, 0xcf, 0x79, 0xea, 0x76, 0xab, 0x36, 0x05, 0x74, 0xfc, 0x96, 0x26, 0x8f, 0x73, 0x1c, 0x15, 0x7d, 0xb9, 0x59, 0x6f, 0x76, 0xf8, 0x61, 0x4c, 0x46, 0x9c, 0x7d, 0x1e, 0x9f, 0x5b, 0x1f, 0xdd, 0xb3, 0x72, 0x1b, 0x61, 0x02, 0x32, 0x13, 0x0f, 0x71, 0xbc, 0x33, 0xb7, 0x9d, 0x09, 0x1f, 0xbd, 0x6e, 0x2d, 0x2a, 0x77, 0xef, 0xdc, 0xc9, 0xd7, 0x5d, 0x2d, 0x47, 0x4a, 0x7e, 0x9e, 0xba, 0xdf, 0x33, 0x58, 0x35, 0xac, 0x51, 0xb5, 0x3f, 0x6e, 0xad, 0x00, 0x84, 0x6f, 0x76, 0x7c, 0xcb, 0xad, 0xc8, 0xa7, 0x28, 0x38, 0x7d, 0xbf, 0x73, 0xdc, 0x47, 0x86, 0xf8, 0x00, 0xfc, 0x43, 0x70, 0xce, 0x30, 0x09, 0x31, 0x94, 0x09, 0x3b, 0xa1, 0x6a, 0x4f, 0x50, 0xf0, 0x16, 0xc3, 0xd4, 0x07, 0x2c, 0xb2, 0xaf, 0xbb, 0x7a, 0xc9, 0xaa, 0x47, 0xa2, 0x2b, 0x2f, 0xf9, 0x09, 0xc1, 0x50, 0x2b, 0xf0, 0xd1, 0x0c, 0x75, 0xe1, 0xd3, 0xcd, 0x21, 0x4d, 0x80, 0x34, 0xdf, 0x73, 0x2b, 0x19, 0xba, 0x83, 0x54, 0xce, 0x4b, 0x04, 0x7b, 0xa4, 0x2d, 0x73, 0x32, 0xb1, 0xb1, 0x2d, 0x76, 0xd0, 0xd2, 0x8f, 0x3f, 0xe8, 0x6b, 0x5b, 0x56, 0x72, 0xa7, 0x5d, 0x67, 0x35, 0xb9, 0x4f, 0x57, 0x54, 0xce, 0xfb, 0xd7, 0x8b, 0x40, 0x9f, 0x3a, 0xb6, 0x0d, 0x95, 0x83, 0x93, 0x87, 0x33, 0xc3, 0xc8, 0x4d, 0xf1, 0xa2, 0x28, 0x79, 0xc9, 0x3b, 0x32, 0x1b, 0xe4, 0x2d, 0xda, 0xe7, 0x72, 0xee, 0x8d, 0x2a, 0xda, 0x63, 0x6f, 0x03, 0x13, 0xae, 0xe7, 0xcf, 0x51, 0x48, 0x5d, 0xe5, 0xe5, 0x4f, 0x42, 0x84, 0x5e, 0x21, 0x51, 0x09, 0xf5, 0x29, 0x15, 0x65, 0x28, 0xf9, 0xac, 0xcf, 0xa4, 0x99, 0xca, 0xb6, 0x68, 0x1f, 0x01, 0xfa, 0x28, 0x80, 0x3f, 0x5b, 0xef, 0xa6, 0x98, 0x32, 0x09, 0xc3, 0x45, 0x5f, 0x20, 0xe4, 0xed, 0x82, 0xa5, 0xc9, 0x24, 0x6e, 0x72, 0xf4, 0x32, 0xda, 0xad, 0x00, 0x15, 0x5a, 0xef, 0x34, 0xc9, 0x8e, 0xa5, 0x58, 0xc6, 0x99, 0xb7, 0xc7, 0xcb, 0xd5, 0x68, 0xc6, 0xda, 0xc6, 0x7e, 0x14, 0x83, 0x4c, 0xa2, 0xc3, 0x66, 0x1c, 0x09, 0x45, 0xf4, 0x70, 0x54, 0xca, 0x75, 0xfe, 0xb5, 0xca, 0x4f, 0x27, 0x54, 0xdd, 0x85, 0x72, 0xf1, 0xd3, 0x7e, 0x38, 0xca, 0x01, 0x08, 0xa1, 0xbf, 0xd9, 0x9c, 0xcf, 0xb4, 0xbe, 0xe4, 0x58, 0x37, 0x16, 0x7a, 0xfa, 0x62, 0xa0, 0xf3, 0x8a, 0x03, 0x07, 0x1c, 0x2e, 0xfb, 0xb8, 0x83, 0xcc, 0xe4, 0xf1, 0x39, 0xc2, 0xf7, 0x1b, 0xd7, 0xd8, 0x2c, 0x5a, 0xbf, 0x72, 0xa2, 0x62, 0xa4, 0x0b, 0x42, 0x8c, 0x4d, 0xde, 0xa0, 0x29, 0x95, 0xe6, 0x21, 0x16, 0xb7, 0x09, 0x63, 0x91, 0xc8, 0x91, 0xd9, 0x4a, 0x85, 0xdb, 0xb6, 0xbd, 0x4f, 0x53, 0x0d, 0xc0, 0x74, 0xa0, 0x36, 0x58, 0xb0, 0x1b, 0x73, 0xd1, 0xf4, 0x86, 0xd3, 0x0e, 0x65, 0xfb, 0x57, 0x1d, 0xa8, 0x22, 0x54, 0x0e, 0x5d, 0xa7, 0x18, 0x06, 0xe9, 0xeb, 0xd0, 0x8f, 0x79, 0xfa, 0xaa, 0x32, 0x44, 0xbe, 0x36, 0x48, 0x10, 0x72, 0x12, 0x0d, 0xf7, 0x58, 0xc6, 0xf6, 0x6b, 0xaf, 0xed, 0x45, 0x78, 0xe0, 0x96, 0xda, 0x49, 0xf8, 0xe9, 0x4c, 0xee, 0x5a, 0x0e, 0x38, 0x5c, 0xb6, 0x4a, 0xd9, 0xb5, 0x35, 0x6b, 0xd9, 0xca, 0xf6, 0x67, 0x67, 0xdf, 0xbe, 0x40, 0x8a, 0xae, 0xeb, 0x2a, 0xb5, 0xae, 0xaa, 0xf0, 0x9b, 0x94, 0x6a, 0x94, 0x44, 0x1a, 0x91, 0x36, 0x61, 0x00, 0x6d, 0x36, 0xdd, 0x51, 0x6d, 0x9d, 0xb4, 0xe8, 0x91, 0xb9, 0x08, 0x32, 0x1f, 0x08, 0x72, 0x36, 0x98, 0x58, 0x96, 0xd2, 0xea, 0x2b, 0xfa, 0x47, 0xe7, 0x60, 0x18, 0xf8, 0xf6, 0x10, 0xb1, 0x6e, 0x08, 0xb7, 0x65, 0xa0, 0xce, 0x94, 0x81, 0x71, 0x2a, 0x52, 0x18, 0x7b, 0xe3, 0xe7, 0x55, 0x0b, 0x9c, 0xbd, 0x0f, 0x6c, 0x07, 0x0f, 0x9e, 0x69, 0x56, 0x97, 0xed, 0x0d, 0xf2, 0x66, 0xd1, 0xad, 0x70, 0x13, 0x99, 0x29, 0xc1, 0x17, 0xe7, 0x6e, 0xa8, 0x78, 0xbe, 0x3f, 0x71, 0xa5, 0xdb, 0x36, 0xe1, 0xa1, 0x49, 0x05, 0x69, 0x64, 0x30, 0x02, 0x9e, 0x7f, 0xee, 0xe3, 0xee, 0xfe, 0x68, 0xc5, 0x8b, 0x92, 0xa2, 0x74, 0xac, 0xf0, 0x8e, 0xe6, 0xf5, 0x74, 0x22, 0x08, 0x33, 0x0a, 0xad, 0xbe, 0x4d, 0x4e, 0x6b, 0x24, 0x78, 0xf2, 0x57, 0x1b, 0xa9, 0x60, 0x40, 0x01, 0x50, 0xa1, 0x1f, 0xbf, 0x43, 0x7e, 0xa8, 0x09, 0xf8, 0xe5, 0x1f, 0xe1, 0xf8, 0x8e, 0x6d, 0x5d, 0x90, 0xdd, 0x73, 0xab, 0xca, 0x0b, 0x9e, 0x52, 0x9c, 0x81, 0xbc, 0xba, 0x5e, 0x84, 0x0e, 0xef, 0x81, 0x17, 0x9e, 0xa2, 0x7f, 0x1d, 0xd2, 0x71, 0x0e, 0xbf, 0x42, 0x68, 0x99, 0x0d, 0xc7, 0xc7, 0xf0, 0xe8, 0xd4, 0x05, 0x3f, 0x1f, 0x0a, 0x16, 0x3d, 0xd8, 0x06, 0xea, 0xa5, 0x32, 0x7e, 0x36, 0xea, 0x28, 0x8c, 0x76, 0x27, 0xb9, 0x49, 0x33, 0x54, 0x45, 0x9e, 0x81, 0xc0, 0x3b, 0x57, 0xcd, 0xbb, 0xf1, 0x79, 0xd5, 0x93, 0xd3, 0xd6, 0xf8, 0xc3, 0xc0, 0xde, 0xb0, 0x66, 0xb1, 0xb8, 0x5d, 0xf2, 0x9c, 0x92, 0x44, 0x22, 0x98, 0x35, 0xd7, 0x34, 0x41, 0xdc, 0x37, 0x55, 0x5e, 0x46, 0xf7, 0x5a, 0xc1, 0x0a, 0x23, 0xb0, 0x6f, 0x2b, 0x80, 0x96, 0x01, 0xec, 0x16, 0x89, 0x4a, 0xe5, 0xec, 0x00, 0x3a, 0x57, 0x13, 0x5a, 0x02, 0xbd, 0xe5, 0x15, 0x79, 0xa3, 0x8f, 0x40, 0xbf, 0xbb, 0xcd, 0x33, 0x20, 0x2e, 0xf5, 0x7d, 0x3b, 0x30, 0x37, 0x1e, 0x63, 0xd7, 0x23, 0xf7, 0x45, 0x2d, 0x6b, 0x7e, 0xcb, 0x84, 0xeb, 0xb6, 0x41, 0x09, 0xe6, 0x5f, 0xb7, 0x9c, 0x93, 0x69, 0xa6, 0xdf, 0xd8, 0xaf, 0xd6, 0x8d, 0x55, 0xe2, 0x7e, 0x0e, 0xa4, 0xc3, 0xae, 0x48, 0xdf, 0x96, 0xea, 0xb7, 0x63, 0xd3, 0x17, 0xc0, 0xd4, 0x1e, 0x9c, 0x42, 0x62, 0x79, 0xc1, 0x6f, 0x4a, 0xb9, 0x5a, 0xda, 0x9f, 0x36, 0xaa, 0xd0, 0x4a, 0xc7, 0x82, 0xec, 0x50, 0xee, 0xa9, 0xe6, 0x53, 0x4f, 0x80, 0xac, 0x5c, 0x67, 0xe6, 0xb4, 0xd7, 0x7a, 0x5a, 0x90, 0xdf, 0xcd, 0x5f, 0xc3, 0xbc, 0x16, 0x25, 0xd3, 0xaa, 0x31, 0x65, 0x9f, 0xdc, 0x14, 0x8d, 0xf3, 0xc1, 0x05, 0x1d, 0x5a, 0x86, 0x0b, 0x51, 0x33, 0xdc, 0xa2, 0x00, 0x07, 0xfb, 0xb2, 0xc4, 0x1a, 0xe7, 0xc2, 0x5b, 0x40, 0xf2, 0x69, 0x4d, 0xf2, 0x82, 0x06, 0xcf, 0xa1, 0x14, 0xb1, 0xe8, 0x4a, 0x81, 0x72, 0xd2, 0x4b, 0x80, 0xb0, 0xa3, 0x75, 0x6d, 0xec, 0x2d, 0x62, 0x49, 0xaf, 0x22, 0x09, 0x01, 0xc0, 0x7c, 0x8f, 0xf3, 0x9b, 0x1b, 0x61, 0xae, 0x1f, 0xb0, 0x7f, 0xf9, 0x87, 0xdb, 0x1b, 0x18, 0x9b, 0x90, 0x62, 0x4a, 0x27, 0xbf, 0x9a, 0x96, 0xad, 0x34, 0x6d, 0xc7, 0x57, 0xbc, 0x84, 0xb6, 0x2f, 0x89, 0x58, 0xc7, 0x92, 0xd7, 0x45, 0xb6, 0xe2, 0xd0, 0xe1, 0x94, 0x7c, 0xad, 0x8b, 0x0c, 0xea, 0x1f, 0x47, 0xeb, 0x59, 0xed, 0xc9, 0xe0, 0x4d, 0xde, 0xcf, 0x7f, 0x93, 0xd9, 0xb4, 0x8c, 0x78, 0x4b, 0x42, 0x77, 0x38, 0xc9, 0xc9, 0x23, 0xb9, 0xf7, 0x6d, 0xeb, 0x79, 0xa8, 0xc4, 0xe7, 0xc5, 0x46, 0xa1, 0x6b, 0x2d, 0x75, 0x2a, 0xd1, 0x34, 0xf3, 0x31, 0x79, 0x4c, 0xc2, 0xc1, 0x0d, 0x01, 0x8a, 0xf6, 0x0a, 0x74, 0x39, 0x12, 0x7c, 0x0b, 0xec, 0xce, 0x09, 0x67, 0x12, 0xee, 0x30, 0x96, 0xce, 0x18, 0xd3, 0x8a, 0x9e, 0xe6, 0xf3, 0xca, 0x3b, 0x3a, 0xbc, 0x68, 0xc0, 0xd2, 0xc1, 0x33, 0x0d, 0x1c, 0x88, 0x2d, 0x6e, 0x4b, 0x49, 0x40, 0x78, 0xaa, 0xf3, 0x2c, 0x34, 0x30, 0x70, 0xc4, 0x80, 0x55, 0x2a, 0x5a, 0xb1, 0x25, 0xce, 0x78, 0x7d, 0x93, 0x50, 0xd1, 0x19, 0x0f, 0x2f, 0x76, 0x9e, 0x5b, 0xfa, 0x4d, 0xb1, 0x9a, 0x13, 0xc0, 0x63, 0xaa, 0xb3, 0xb2, 0x56, 0xb3, 0x2e, 0xb7, 0x22, 0x00, 0x78, 0x84, 0xf6, 0x0e, 0xe8, 0xa4, 0x83, 0xe3, 0x3d, 0x6d, 0x15, 0xa1, 0xdf, 0x33, 0x03, 0x5b, 0x67, 0xbb, 0x4a, 0x27, 0x60, 0xf2, 0x75, 0x75, 0x4f, 0xdf, 0xc0, 0x9f, 0xf2, 0xd7, 0x7c, 0xc1, 0xc6, 0xf0, 0xb5, 0xca, 0xcb, 0xb8, 0x13, 0xd3, 0x8b, 0x26, 0xfe, 0xb0, 0x59, 0xd0, 0x05, 0xc5, 0xd7, 0x5f, 0x81, 0x1b, 0xbb, 0x40, 0x75, 0xb4, 0xd2, 0x9d, 0xb9, 0x1b, 0x45, 0x8c, 0x58, 0x3e, 0x1b, 0x86, 0x36, 0x80, 0xff, 0x1a, 0xf6, 0x0b, 0x43, 0xe2, 0x1a, 0x63, 0x26, 0xb7, 0x6c, 0x41, 0x52, 0x21, 0x9d, 0x9e, 0xa9, 0x11, 0x2d, 0x0e, 0x41, 0xd3, 0x8a, 0x4f, 0xad, 0x3e, 0x7c, 0x22, 0x7f, 0x2e, 0xc0, 0x59, 0x0a, 0x34, 0xf4, 0x32, 0x6d, 0x8b, 0xb3, 0xe3, 0xcd, 0x4e, 0x00, 0x76, 0xe1, 0xe9, 0xe8, 0xd7, 0xb4, 0xce, 0x63, 0x2c, 0xa6, 0x69, 0x7c, 0x64, 0xb4, 0x55, 0xb1, 0x13, 0xfa, 0xd0, 0x9d, 0x7d, 0x76, 0x6c, 0xd4, 0xf0, 0x0f, 0x08, 0x0f, 0x58, 0xd6, 0xff, 0x89, 0x0d, 0x8b, 0x9f, 0xa8, 0xef, 0x63, 0xdd, 0xe0, 0xb5, 0x08, 0x46, 0xd5, 0x82, 0xe2, 0x39, 0xbf, 0xb9, 0x95, 0x54, 0x13, 0x13, 0xcb, 0x2c, 0x60, 0xef, 0x33, 0x41, 0x76, 0xe9, 0xca, 0x31, 0xce, 0xad, 0x59, 0x2b, 0x26, 0x0e, 0x3e, 0xa7, 0x6c, 0x52, 0x70, 0x54, 0xdd, 0xd0, 0xbe, 0x52, 0x6e, 0xbe, 0x57, 0xa2, 0x6b, 0x44, 0x8f, 0xdb, 0x5e, 0xd4, 0xe0, 0x1e, 0x32, 0xbe, 0x2f, 0x4b, 0x98, 0xff, 0x51, 0x75, 0xaa, 0x5a, 0xce, 0x94, 0xce, 0xab, 0xe5, 0x7a, 0xde, 0x77, 0xd0, 0x09, 0x86, 0xc7, 0x49, 0xa2, 0xed, 0x37, 0x4c, 0xe0, 0x97, 0x4a, 0x1f, 0x87, 0x8a, 0x00, 0x90, 0xb7, 0xaf, 0xab, 0x7e, 0x66, 0x7c, 0xfe, 0x9a, 0x0d, 0xd0, 0x67, 0x6f, 0xa0, 0x1e, 0x9f, 0xa0, 0xc4, 0xce, 0x7f, 0x71, 0x3d, 0xe0, 0x15, 0x89, 0xa5, 0xd3, 0xf7, 0xf7, 0x64, 0xc5, 0xd7, 0x72, 0xdc, 0xdb, 0x58, 0xe5, 0xe4, 0xe3, 0x20, 0x2b, 0x78, 0x38, 0x2e, 0x16, 0xae, 0xe6, 0x6e, 0xb7, 0xec, 0x0f, 0x8b, 0xd9, 0x59, 0x8e, 0x05, 0xcf, 0x91, 0xd9, 0x83, 0x70, 0x9d, 0x2c, 0x6a, 0x5f, 0x22, 0xe4, 0xae, 0x90, 0xd8, 0x29, 0xe9, 0x07, 0x3e, 0xcf, 0xaa, 0xe3, 0x8d, 0x7e, 0x0f, 0x9c, 0xea, 0x11, 0x96, 0x89, 0xdf, 0x3d, 0x30, 0xa5, 0x0c, 0x73, 0x97, 0x92, 0x1a, 0x07, 0xe2, 0xde, 0xf1, 0x91, 0x57, 0x86, 0x2b, 0x94, 0x80, 0xb8, 0xc8, 0x5d, 0x81, 0xdd, 0x23, 0x2e, 0xa8, 0xd7, 0x24, 0x9c, 0x46, 0x87, 0xb8, 0x36, 0xbd, 0x93 ],
+    const [ 0x5a, 0xb7, 0x07, 0x4f, 0x7b, 0xe1, 0x22, 0x72, 0xf9, 0xf4, 0x7f, 0xd8, 0x90, 0x0d, 0xd8, 0x23, 0xef, 0x71, 0x6b, 0x67, 0x69, 0x74, 0x50, 0x2e, 0xed, 0x9a, 0x0b, 0xc0, 0x38, 0xfb, 0x5e, 0xa1, 0x49, 0xec, 0x61, 0x5a, 0x15, 0xdb, 0xd4, 0x7c, 0x7d, 0x7b, 0xb3, 0xe3, 0x7d, 0x22, 0x0b, 0x38, 0xa6, 0x6f, 0x0d, 0xb9, 0xce, 0x2f, 0x60, 0x3d, 0x06, 0x81, 0xbc, 0x72, 0xcc, 0x39, 0xb5, 0x6a, 0x82, 0x83, 0xd4, 0x56, 0x1f, 0xc9, 0xec, 0x91, 0x25, 0xd6, 0xab, 0xe0, 0xd3, 0x3b, 0x70, 0xf8, 0x9b, 0xf1, 0x5c, 0x40, 0xd6, 0x41, 0xac, 0xd9, 0xb7, 0xe1, 0x46, 0xdc, 0x7d, 0x60, 0x91, 0xe2, 0xed, 0xc3, 0x8a, 0xca, 0x00, 0x71, 0x15, 0xb6, 0xd9, 0x4c, 0x90, 0x57, 0xf9, 0x21, 0xae, 0x6b, 0xb6, 0x42, 0x83, 0x83, 0xe9, 0x71, 0xdb, 0x0a, 0xe8, 0x00, 0xd0, 0x83, 0xb4, 0x37, 0x9c, 0x12, 0x73, 0xf6, 0xab, 0x3e, 0x20, 0x9b, 0xf5, 0xf5, 0x81, 0x26, 0x8a, 0xd0, 0x59, 0x9c, 0x6e, 0x99, 0xe0, 0xa9, 0xa8, 0x0b, 0x70, 0x88, 0x96, 0xd8, 0x81, 0x28, 0x83, 0xf1, 0xd7, 0x87, 0x7b, 0x01, 0xfa, 0x62, 0x5e, 0x3a, 0xe7, 0x11, 0x34, 0x55, 0x05, 0xad, 0xc0, 0xd4, 0x5a, 0x73, 0x58, 0x8b, 0xff, 0x6d, 0xf4, 0x5e, 0xd1, 0x4f, 0x84, 0x4c, 0x6a, 0x9f, 0x87, 0xad, 0x50, 0x18, 0xd9, 0xb7, 0x6b, 0x51, 0xcc, 0x47, 0xbd, 0x9a, 0x7b, 0xdf, 0x4d, 0x26, 0x5b, 0xea, 0x64, 0x70, 0x13, 0x48, 0xfc, 0xd7, 0x8e, 0x06, 0x76, 0x8b, 0x4e, 0x6d, 0x8b, 0xad, 0x03, 0x3f, 0x85, 0xb2, 0x5c, 0x3d, 0xaf, 0x09, 0x1d, 0xec, 0x0a, 0xfd, 0x72, 0x99, 0x41, 0xdc, 0x82, 0x9b, 0xdf, 0x59, 0x48, 0xd8, 0xc0, 0x2f, 0x9e, 0x8b, 0xc5, 0x07, 0x9b, 0x44, 0xcc, 0x9c, 0x1f, 0x30, 0xe0, 0x1d, 0xac, 0x9a, 0xac, 0xd3, 0x78, 0xb2, 0x36, 0x03, 0xc0, 0x8d, 0xca, 0x16, 0x5e, 0x6e, 0x33, 0xf7, 0x9e, 0x44, 0x32, 0xbd, 0x4e, 0x73, 0x28, 0x8a, 0x14, 0xd7, 0x16, 0xb2, 0x05, 0x06, 0xc7, 0x20, 0x72, 0xd6, 0x4c, 0xf6, 0x05, 0x20, 0xa9, 0x74, 0x0d, 0xc3, 0xce, 0x1b, 0x17, 0xeb, 0xc9, 0x12, 0xbe, 0x93, 0x39, 0xc8, 0xc4, 0x48, 0x06, 0xdb, 0x61, 0x30, 0x4f, 0x39, 0xda, 0x4c, 0xa4, 0x85, 0x56, 0xfa, 0x76, 0xbc, 0xee, 0xbe, 0xcb, 0x18, 0x03, 0x41, 0x36, 0x34, 0xd4, 0x9a, 0x07, 0x72, 0x4f, 0xcd, 0xbf, 0x9a, 0x28, 0x91, 0xc7, 0xc3, 0x29, 0x57, 0x61, 0x77, 0xc9, 0x87, 0xde, 0x12, 0xff, 0x0d, 0x12, 0x6b, 0x58, 0x14, 0x05, 0xb6, 0x48, 0x11, 0xeb, 0xa9, 0xbd, 0x04, 0x56, 0xde, 0xfa, 0xfb, 0xab, 0x79, 0xa3, 0xd7, 0xd2, 0x0a, 0x14, 0x52, 0x32, 0xb5, 0xf7, 0x41, 0xdd, 0x90, 0x16, 0x17, 0x07, 0x4c, 0x6d, 0xab, 0xbd, 0x18, 0x84, 0x3b, 0xd4, 0xc2, 0xfc, 0xb0, 0x1f, 0x1f, 0x67, 0x23, 0xe5, 0xae, 0x5d, 0xa1, 0x91, 0x78, 0xcc, 0x2b, 0xac, 0x3a, 0x8f, 0x01, 0x09, 0xc6, 0x42, 0x21, 0x3f, 0xa7, 0x55, 0x0a, 0x5c, 0x04, 0x60, 0xc5, 0xd8, 0xc7, 0xb6, 0x26, 0xc8, 0xfd, 0x3d, 0x50, 0x54, 0x80, 0x7d, 0x77, 0x6b, 0xd4, 0xf6, 0xea, 0xb6, 0x50, 0xb7, 0x50, 0xca, 0x7e, 0x2c, 0x31, 0xa1, 0xc4, 0x38, 0xb9, 0x4b, 0x43, 0x83, 0xb9, 0xe1, 0xff, 0x16, 0xef, 0xbb, 0x40, 0x25, 0x87, 0xe2, 0x39, 0x2b, 0xe1, 0xc8, 0xe8, 0x3d, 0x95, 0x37, 0x3d, 0x97, 0xb5, 0x88, 0x7e, 0x7c, 0x52, 0x15, 0xea, 0x3d, 0x41, 0xf1, 0x9d, 0x97, 0x1e, 0xd6, 0xb3, 0x41, 0x92, 0x5e, 0xb0, 0xc6, 0xd2, 0x76, 0x20, 0x91, 0x68, 0x10, 0x7a, 0x46, 0x36, 0x19, 0x4a, 0x59, 0xb8, 0xab, 0x8f, 0xd9, 0x89, 0x83, 0x62, 0x8c, 0x29, 0xb5, 0xd9, 0x41, 0xfd, 0x9e, 0x2b, 0x62, 0x97, 0x1b, 0x15, 0xc9, 0x38, 0xf8, 0x7c, 0xd4, 0x93, 0xac, 0x53, 0xbc, 0xd4, 0x43, 0xbf, 0x22, 0xe1, 0x9b, 0x79, 0xeb, 0xe0, 0xd3, 0x75, 0x4e, 0xf9, 0x01, 0xc1, 0x2b, 0x5d, 0x23, 0xaf, 0x9f, 0x87, 0x59, 0x36, 0xd5, 0xc2, 0x51, 0x96, 0x1f, 0xeb, 0x02, 0x3b, 0x45, 0x78, 0x9d, 0xe4, 0x1d, 0xb9, 0xc0, 0x04, 0x5b, 0x5e, 0xed, 0x68, 0xab, 0x3a, 0x3c, 0x1b, 0xfd, 0x46, 0x4c, 0x87, 0x20, 0xe9, 0x7f, 0xdc, 0x93, 0x76, 0x67, 0xb6, 0x98, 0xf7, 0x7b, 0xfa, 0x89, 0x29, 0x0f, 0x00, 0x6f, 0xc7, 0x83, 0xf8, 0xd1, 0x0b, 0xba, 0x86, 0xca, 0x73, 0xcd, 0xb0, 0x5e, 0xc1, 0x01, 0xfa, 0x0e, 0x45, 0xf7, 0xcf, 0xaa, 0x5e, 0x23, 0x23, 0x67, 0x3f, 0x7f, 0x57, 0x32, 0xef, 0x81, 0x5d, 0x43, 0x93, 0x4a, 0x1c, 0xf4, 0xf0, 0x20, 0x16, 0xd4, 0x2c, 0x1e, 0x48, 0xf7, 0xd4, 0x2a, 0x51, 0x91, 0x24, 0x28, 0xd7, 0xc3, 0x82, 0x6d, 0x27, 0xb5, 0x4b, 0x77, 0x1b, 0xe5, 0xd2, 0xdb, 0x41, 0xbf, 0xa6, 0x7e, 0x39, 0x6d, 0x14, 0x08, 0x5f, 0xf0, 0xed, 0x96, 0xab, 0x70, 0x8a, 0xb0, 0xd5, 0xd0, 0x0c, 0x7a, 0xbc, 0x86, 0xe8, 0x2e, 0x08, 0xaa, 0xa4, 0xc9, 0x0e, 0x4c, 0xdb, 0x05, 0xf5, 0x0b, 0x87, 0x88, 0x17, 0xe3, 0x80, 0x5b, 0xaa, 0x47, 0x3f, 0x9d, 0xa0, 0x70, 0xe8, 0x79, 0xcb, 0xf4, 0x88, 0x55, 0x45, 0x9a, 0x9a, 0x4c, 0x0f, 0x6d, 0xd1, 0xdf, 0xf8, 0x0f, 0x11, 0xe7, 0xc1, 0x50, 0xbe, 0xce, 0x7e, 0xff, 0x3a, 0xff, 0x3f, 0x01, 0xa9, 0x9b, 0xf0, 0x9f, 0xf8, 0x6e, 0x7e, 0x24, 0x1d, 0x21, 0x3c, 0xa8, 0xa0, 0xb1, 0x84, 0x27, 0x5a, 0x20, 0xa1, 0xd6, 0x7d, 0x6a, 0xec, 0xb6, 0xd4, 0xba, 0x36, 0x69, 0x4c, 0xde, 0x66, 0x45, 0xb4, 0xf8, 0x63, 0xa7, 0xc1, 0x77, 0x35, 0x89, 0x55, 0x46, 0x67, 0x57, 0x00, 0x43, 0xaf, 0xff, 0xc8, 0xf3, 0xd1, 0x48, 0x25, 0x74, 0xc0, 0x64, 0x50, 0xb3, 0x06, 0xc8, 0xbd, 0xdf, 0x67, 0x3b, 0xe6, 0x1d, 0xc1, 0x2d, 0x4b, 0x7d, 0x37, 0x4b, 0xb7, 0x2c, 0x8e, 0x50, 0xc4, 0xec, 0xd7, 0x1e, 0xa1, 0xc2, 0x4f, 0x0d, 0x13, 0xee, 0x83, 0x83, 0xba, 0x20, 0xb8, 0xc5, 0x96, 0xe9, 0x89, 0x0c, 0xca, 0x70, 0xd2, 0xdc, 0x9f, 0x66, 0xcd, 0x91, 0xcb, 0x3c, 0x7b, 0x3b, 0xf4, 0x93, 0x46, 0xab, 0x70, 0xf4, 0xe4, 0xce, 0x4f, 0xc1, 0x7e, 0x3a, 0x9b, 0x6b, 0x12, 0x07, 0xde, 0xe6, 0x16, 0xe0, 0xe5, 0x5a, 0x5e, 0x59, 0xc4, 0x1c, 0x3f, 0x83, 0x1a, 0xdc, 0xf5, 0xbf, 0x96, 0x20, 0x42, 0xcf, 0xba, 0xf1, 0x58, 0x33, 0xdf, 0xd3, 0xf9, 0xb2, 0x7a, 0xfb, 0xdd, 0x37, 0x9d, 0xbd, 0x54, 0xde, 0xc1, 0x44, 0x2c, 0x4f, 0xc2, 0x85, 0xd5, 0x4b, 0x2b, 0x75, 0xc3, 0x84, 0xb4, 0x7a, 0x14, 0xb2, 0x09, 0x20, 0x73, 0xe3, 0xcd, 0x0e, 0x3c, 0x12, 0xdf, 0x38, 0xe0, 0xfc, 0xdc, 0x56, 0x8c, 0x2f, 0xe5, 0x94, 0x05, 0x64, 0xa2, 0x8b, 0xd7, 0x0e, 0x86, 0x70, 0xae, 0x33, 0x55, 0x8b, 0x04, 0x7b, 0xe4, 0xeb, 0xfc, 0x87, 0x21, 0x59, 0x8e, 0x83, 0x52, 0x8a, 0xe5, 0xff, 0xa2, 0x99, 0x05, 0xfa, 0xd9, 0xb4, 0xb1, 0x40, 0x6b, 0x15, 0x8c, 0xf7, 0xb4, 0x33, 0x7e, 0x74, 0x82, 0x3a, 0x59, 0x53, 0xd4, 0xb9, 0xbd, 0xc6, 0xe1, 0x9b, 0x39, 0x2d, 0x5c, 0x59, 0xb2, 0xe7, 0xf7, 0x6e, 0x09, 0x68, 0x26, 0x0a, 0xf8, 0x8c, 0x25, 0x0a, 0x3d, 0x2b, 0x3c, 0x28, 0xfb, 0xee, 0x42, 0x6f, 0x5d, 0x61, 0x60, 0xf3, 0x7c, 0x49, 0x17, 0xbe, 0x83, 0x37, 0x84, 0x0d, 0x11, 0x5d, 0xe3, 0xbd, 0xde, 0xa1, 0x53, 0x00, 0xa2, 0xf0, 0xd8, 0x54, 0x32, 0xd5, 0xa6, 0xb6, 0xec, 0x4a, 0x9d, 0x12, 0x56, 0xce, 0x10, 0xff, 0x02, 0xb7, 0xca, 0xa9, 0xb5, 0xca, 0x53, 0x0e, 0xc7, 0x09, 0x6f, 0x6e, 0xcd, 0xcc, 0xe8, 0xfc, 0x76, 0x13, 0x8d, 0xda, 0xb3, 0x1b, 0x7b, 0x44, 0x1b, 0x2f, 0x9b, 0x0c, 0x8d, 0xc1, 0x6c, 0x46, 0x17, 0xb9, 0x03, 0x44, 0x16, 0x0d, 0x50, 0xc5, 0x9f, 0x92, 0xa2, 0x69, 0x1e, 0x12, 0x6d, 0x68, 0x3d, 0x9e, 0x4c, 0x84, 0x08, 0x25, 0x42, 0x3c, 0x4e, 0x46, 0x45, 0x43, 0x4a, 0x63, 0xfd, 0x30, 0x82, 0xf7, 0xc9, 0x77, 0xf0, 0x29, 0x03, 0x98, 0x60, 0xa1, 0x85, 0x96, 0x19, 0x9a, 0x6b, 0xab, 0xbf, 0x38, 0x1b, 0x3a, 0x78, 0x1c, 0x83, 0x05, 0x4e, 0x37, 0xa2, 0xa0, 0xd5, 0xdb, 0x4a, 0x26, 0x0d, 0x18, 0x24, 0x2a, 0x89, 0x45, 0xf4, 0xf0, 0xd1, 0xdd, 0x1e, 0xdd, 0x06, 0x8d, 0x6a, 0x2d, 0xc4, 0x8a, 0x04, 0xe4, 0x4c, 0x28, 0xc7, 0x07, 0xe3, 0xa9, 0xba, 0x0b, 0x75, 0x52, 0xdb, 0x8e, 0x7e, 0xc5, 0x1c, 0x45, 0x2b, 0x8a, 0xac, 0x36, 0xbc, 0xef, 0x77, 0x27, 0x2c, 0x12, 0xf0, 0x56, 0x14, 0x3c, 0x0e, 0x6a, 0xcd, 0x70, 0x94, 0xaa, 0xd4, 0x44, 0x96, 0x6d, 0x73, 0xf0, 0x39, 0xd1, 0x9e, 0xa5, 0xba, 0xb0, 0x1c, 0x20, 0xb2, 0xd0, 0xe7, 0x7e, 0x98, 0x5a, 0xd4, 0x52, 0x87, 0x8e, 0x76, 0xf5, 0x41, 0xb4, 0x40, 0x1d, 0x75, 0x56, 0xeb, 0xb1, 0x3d, 0xac, 0x17, 0xdc, 0xeb, 0x58, 0x35, 0x61, 0x05, 0x54, 0xa4, 0x2e, 0x8e, 0x28, 0x1a, 0x33, 0x87, 0x60, 0x46, 0x74, 0xb6, 0x3d, 0xb4, 0x5d, 0xa6, 0xab, 0xf0, 0x56, 0xef, 0x73, 0xee, 0x98, 0xb7, 0xb2, 0xa9, 0x3f, 0x79, 0x8a, 0x0b, 0xa0, 0x06, 0x17, 0x0d, 0xdc, 0xc9, 0xa4, 0x1f, 0xb6, 0x4e, 0x1f, 0xca, 0xa1, 0x06, 0xcb, 0x94, 0x1d, 0x44, 0x35, 0x24, 0x44, 0x8c, 0x69, 0xa6, 0xa0, 0x0d, 0x65, 0x71, 0x40, 0x6c, 0xce, 0xe7, 0x0b, 0xc3, 0xe2, 0x9d, 0x54, 0xea, 0xae, 0xbd, 0xae, 0xf5, 0x81, 0xa8, 0x01, 0xfd, 0xa0, 0xdf, 0xdd, 0x24, 0x3b, 0x23, 0x0f, 0xd3, 0xa0, 0xdb, 0x72, 0x46, 0xaf, 0xb7, 0x08, 0x4b, 0x8e, 0x93, 0x49, 0x46, 0x9e, 0x9e, 0xbb, 0x79, 0xad, 0xbb, 0xc3, 0x82, 0x6d, 0x27, 0xbb, 0x25, 0x24, 0x5c, 0x44, 0x4c, 0xa6, 0x36, 0xde, 0x4c, 0x81, 0x55, 0xb6, 0x6a, 0x77, 0xc2, 0xbe, 0x9e, 0x31, 0xd5, 0x03, 0x97, 0x31, 0x56, 0x3c, 0xfe, 0x09, 0xe2, 0x9e, 0xff, 0xca, 0x90, 0xf8, 0x06, 0xc0, 0xd5, 0xfb, 0xc6, 0x5c, 0xa5, 0xd9, 0x80, 0x72, 0xdb, 0x13, 0x82, 0xa5, 0xdb, 0x8b, 0xee, 0x1f, 0x76, 0xe1, 0xbc, 0x85, 0x0e, 0xfc, 0x02, 0x29, 0xfa, 0xe7, 0x73, 0x82, 0x2b, 0xdf, 0x26, 0xda, 0x10, 0xaa, 0x9a, 0x47, 0xb8, 0x2a, 0xf6, 0xdc, 0x37, 0x31, 0x95, 0x20, 0x4a, 0x97, 0xc1, 0xbf, 0x3e, 0x8a, 0xbf, 0x80, 0x0d, 0x26, 0x0d, 0x77, 0xcb, 0x45, 0xe7, 0x7c, 0x40, 0x99, 0x0f, 0xdc, 0xd7, 0xf8, 0xce, 0x4e, 0xb7, 0xf6, 0x36, 0x28, 0x2f, 0xb9, 0xab, 0xd2, 0x57, 0x09, 0xa2, 0x7b, 0xf4, 0xa7, 0xa7, 0x0c, 0x9d, 0xe0, 0xa5, 0x5a, 0x1c, 0x61, 0x62, 0xa0, 0x17, 0x4d, 0x49, 0x2c, 0xf0, 0x8d, 0x6c, 0x58, 0xe9, 0x68, 0xc9, 0xbc, 0x8c, 0x53, 0xcc, 0xa2, 0x4a, 0x0a, 0x16, 0xba, 0x62, 0xdf, 0x7d, 0x10, 0x04, 0x52, 0x54, 0x3a, 0xb6, 0xe3, 0xec, 0xd6, 0xf8, 0x24, 0x5a, 0x34, 0x23, 0x12, 0x7b, 0x4f, 0x97, 0xa5, 0x36, 0x02, 0x15, 0xa6, 0x01, 0x78, 0x6a, 0xc1, 0xa7, 0xe5, 0x4e, 0xdb, 0x48, 0x73, 0x8b, 0xa6, 0xa1, 0x80, 0x62, 0x72, 0x8d, 0x06, 0x2a, 0x46, 0xcc, 0x5a, 0x3a, 0x2f, 0x04, 0x1a, 0x09, 0xd8, 0x05, 0x60, 0x94, 0x5b, 0x51, 0x3c, 0x00, 0x57, 0xdc, 0x62, 0x81, 0x43, 0x10, 0x1f, 0x7a, 0x01, 0x14, 0x92, 0xe6, 0xb6, 0x4e, 0x18, 0xf6, 0xda, 0x27, 0x08, 0xfb, 0x8b, 0x0e, 0xa1, 0x87, 0x27, 0xbf, 0x40, 0xcf, 0x19, 0xc5, 0xd6, 0x54, 0xf3, 0x3d, 0x9a, 0xc3, 0xbe, 0xde, 0xfb, 0x19, 0x8d, 0x36, 0xd9, 0x0a, 0x59, 0x36, 0xf4, 0xa4, 0x08, 0xf1, 0xa5, 0x30, 0xcf, 0xa1, 0xcc, 0x59, 0xba, 0xeb, 0x09, 0x90, 0x89, 0x64, 0x2f, 0xae, 0xbe, 0x53, 0xf5, 0xdb, 0xf4, 0xb9, 0xef, 0xaf, 0x72, 0x8e, 0xbd, 0x98, 0x00, 0x4e, 0x83, 0x7c, 0xfa, 0xb4, 0x99, 0x9f, 0xa2, 0xc5, 0x83, 0xc6, 0xba, 0x11, 0x23, 0x9d, 0x53, 0x36, 0x2d, 0x56, 0xe0, 0xa5, 0xdc, 0x93, 0x8e, 0xa9, 0xe3, 0x86, 0xd8, 0xa5, 0xa7, 0x56, 0x55, 0x9d, 0xab, 0xc5, 0xd5, 0xf7, 0x4b, 0x11, 0xad, 0x83, 0xae, 0x17, 0x4f, 0xba, 0xf6, 0xbe, 0x1e, 0x43, 0xb9, 0x93, 0x80, 0xbc, 0xb5, 0xb1, 0x34, 0xb6, 0xbf, 0xe4, 0xe6, 0x01, 0xfd, 0x0e, 0x00, 0x2b, 0x55, 0xc9, 0xc4, 0x43, 0x25, 0x4d, 0x98, 0xe2, 0x35, 0x95, 0xa0, 0x6d, 0xea, 0xbd, 0x92, 0x94, 0xbc, 0xaf, 0xc6, 0x1e, 0xe9, 0xfe, 0x8d, 0xe9, 0x6b, 0x12, 0xc4, 0x2c, 0x28, 0x86, 0xa9, 0x00, 0x6a, 0xce, 0xed, 0x1f, 0x8e, 0x1d, 0x0a, 0xeb, 0x00, 0x85, 0xd6, 0xb2, 0x67, 0x61, 0x58, 0x30, 0x1c, 0xf0, 0xdb, 0x55, 0xe1, 0x42, 0x42, 0x49, 0xd0, 0x58, 0x9b, 0xae, 0x91, 0x87, 0xf7, 0x25, 0xd0, 0x1d, 0x78, 0x13, 0xee, 0x47, 0xab, 0xa5, 0xf7, 0x32, 0x18, 0x11, 0xd5, 0x71, 0x18, 0x1f, 0xc3, 0x9f, 0xe7, 0xe9, 0x04, 0x45, 0xfa, 0xde, 0xd4, 0xfd, 0x93, 0x0d, 0x9f, 0xd8, 0x92, 0xa1, 0x71, 0xfe, 0x8e, 0xa7, 0xae, 0x94, 0x24, 0x18, 0x03, 0xe3, 0x8f, 0x13, 0x9c, 0xb6, 0x79, 0x6a, 0x97, 0x03, 0x11, 0x60, 0xb9, 0xce, 0x5e, 0xb1, 0x60, 0x4b, 0xd3, 0xd3, 0xb9, 0x43, 0x23, 0x7c, 0x33, 0xb8, 0x57, 0x64, 0x34, 0xcc, 0x1d, 0x4c, 0x0a, 0xdf, 0x63, 0x3f, 0x24, 0xf8, 0x24, 0x18, 0x82, 0x66, 0x82, 0x44, 0x6a, 0xa7, 0x16, 0xc9, 0x5d, 0x88, 0x84, 0x87, 0x49, 0x8e, 0x52, 0xbe, 0x00, 0x95, 0xfa, 0xd1, 0xe9, 0xb7, 0x3d, 0x4a, 0xf5, 0x6f, 0xbb, 0x1d, 0xd5, 0xfe, 0xc1, 0x31, 0x6b, 0x0e, 0x62, 0x1c, 0x7e, 0x96, 0xc9, 0x2f, 0xb1, 0xfd, 0xcd, 0xb2, 0xb6, 0x82, 0xc6, 0x70, 0xbf, 0xdb, 0x9f, 0x77, 0x35, 0x1c, 0x2d, 0x19, 0xad, 0xdb, 0xbf, 0x36, 0x18, 0x92, 0xf7, 0xbe, 0x39, 0x44, 0xd8, 0x71, 0x5d, 0x64, 0x1f, 0xe9, 0x46, 0xf2, 0xd7, 0xdb, 0x68, 0xe7, 0x28, 0x9a, 0x58, 0xd3, 0x70, 0xdc, 0x81, 0xc5, 0x95, 0xc1, 0x19, 0x6b, 0x99, 0x11, 0x53, 0x7a, 0x6e, 0xc5, 0xd6, 0x50, 0x0c, 0xca, 0x6f, 0xd9, 0xc2, 0x01, 0x02, 0xaf, 0xc9, 0x8a, 0xc7, 0x85, 0x1f, 0x42, 0xb2, 0xc5, 0x92, 0x8a, 0x33, 0x78, 0x1b, 0x4b, 0x20, 0x67, 0x6e, 0x37, 0xf0, 0x7f, 0xcf, 0x51, 0x29, 0x7a, 0x27, 0xaf, 0x1b, 0xbc, 0x57, 0x7e, 0xcf, 0x7b, 0xcc, 0x48, 0x3b, 0x23, 0x54, 0x72, 0xb7, 0xf9, 0x30, 0x09, 0xb5, 0xfe, 0x6a, 0xbe, 0xac, 0x16, 0x69, 0x2e, 0x55, 0x69, 0xc2, 0x67, 0x1a, 0x0a, 0x51, 0xa8, 0xcc, 0xd7, 0x89, 0x69, 0x94, 0xa0, 0x08, 0x9b, 0x2c, 0x8b, 0x6e, 0x31, 0x4e, 0xb6, 0x70, 0xdf, 0x6d, 0x1f, 0x28, 0x22, 0xa4, 0xc1, 0xaf, 0x80, 0xec, 0x00, 0xee, 0x11, 0x91, 0x47, 0xb1, 0x3e, 0xe7, 0xf0, 0xfd, 0xc9, 0x39, 0x64, 0xa4, 0x0e, 0x02, 0x83, 0x16, 0x88, 0x5f, 0x46, 0x7a, 0x96, 0xc5, 0xa2, 0xfe, 0x7f, 0xef, 0xb0, 0x6b, 0xb4, 0x1b, 0x0c, 0xfc, 0x56, 0x76, 0x7b, 0x70, 0xf8, 0xd5, 0xd0, 0x5e, 0xa6, 0xa5, 0x10, 0xc9, 0x26, 0x25, 0xd4, 0xf4, 0x7d, 0xd3, 0xef, 0x77, 0xb6, 0x23, 0x51, 0x93, 0xde, 0x77, 0x2b, 0xc3, 0x53, 0x4c, 0x54, 0x93, 0x3f, 0xb1, 0xec, 0xb5, 0x5f, 0xfe, 0x3f, 0x52, 0x09, 0xc2, 0xeb, 0x9e, 0x6d, 0xfd, 0x46, 0xaf, 0x1b, 0x90, 0xfa, 0x8f, 0xc5, 0xf1, 0xf2, 0x90, 0x46, 0x23, 0x7a, 0xdf, 0xe4, 0xe6, 0xa1, 0x5c, 0xd2, 0x2b, 0xe2, 0xa9, 0xf9, 0xca, 0x04, 0x81, 0xf9, 0x77, 0x3f, 0x4c, 0x6a, 0xf3, 0xa0, 0xf0, 0x67, 0x7f, 0xaf, 0xe9, 0x4d, 0x96, 0x4e, 0x9c, 0xc0, 0xdb, 0xe4, 0xe8, 0xef, 0x51, 0xbb, 0xff, 0x19, 0xca, 0xa7, 0x74, 0x51, 0xa2, 0xe9, 0x95, 0x7e, 0xac, 0x52, 0xfa, 0xa5, 0x6d, 0xac, 0x5e, 0x6b, 0x88, 0x55, 0xae, 0xd5, 0x7a, 0x2d, 0x60, 0x53, 0x87, 0xb2, 0x06, 0xfd, 0xf4, 0x6a, 0x23, 0x1c, 0x77, 0x82, 0x3d, 0xec, 0xec, 0xb4, 0x33, 0xa0, 0x49, 0x6e, 0xd1, 0xa7, 0xd4, 0x30, 0xa2, 0x2e, 0x94, 0x35, 0x05, 0xe6, 0x05, 0x57, 0x83, 0x07, 0x10, 0x2d, 0x60, 0x95, 0x39, 0x76, 0x70, 0xe2, 0x1b, 0xba, 0x2c, 0x54, 0x11, 0x2e, 0x05, 0x68, 0x37, 0xd9, 0xf9, 0xf7, 0x91, 0xf5, 0x63, 0xb8, 0x89, 0x98, 0x17, 0x07, 0x9f, 0x93, 0xae, 0xe4, 0x5c, 0x9a, 0x1f, 0x3f, 0x87, 0xa6, 0x90, 0x73, 0x9c, 0x98, 0x6b, 0x10, 0x7a, 0x1f, 0xb3, 0xdd, 0x5c, 0xdb, 0x99, 0x1d, 0x0a, 0xc3, 0x4a, 0x12, 0x51, 0xc4, 0x0c, 0xc0, 0xb0, 0xaa, 0x89, 0xf3, 0x54, 0x44, 0x6a, 0x83, 0x47, 0xc3, 0x28, 0xd7, 0xe4, 0x64, 0x1f, 0xa8, 0x8e, 0x4f, 0xe5, 0x07, 0xa1, 0xbe, 0xd9, 0xa2, 0xa9, 0x61, 0xff, 0x43, 0xd2, 0x02, 0x0b, 0x99, 0xa0, 0x65, 0xbb, 0x3b, 0xe0, 0x72, 0x6a, 0xea, 0xdf, 0x95, 0xe3, 0x16, 0xd9, 0x66, 0x73, 0xa4, 0xb4, 0x85, 0x42, 0xef, 0xee, 0xc8, 0xe2, 0x0d, 0xd5, 0x99, 0x29, 0x53, 0xf6, 0x99, 0x3c, 0x1b, 0xd7, 0x8a, 0xed, 0xc4, 0xe9, 0x6b, 0x47, 0xfb, 0xb8, 0xe4, 0x66, 0x39, 0x65, 0xe5, 0x8d, 0x8d, 0x56, 0x8b, 0x72, 0x9c, 0x2c, 0x43, 0xdc, 0xe6, 0xf5, 0x31, 0x70, 0x4b, 0xa3, 0xd3, 0xc8, 0xcd, 0xbe, 0xe1, 0xc6, 0x97, 0x55, 0x78, 0x28, 0x3f, 0x3a, 0x78, 0x5c, 0x48, 0x6f, 0x2b, 0x95, 0xeb, 0xdb, 0x27, 0x1e, 0x16, 0x41, 0x75, 0xef, 0xb6, 0x73, 0xf2, 0x7e, 0x32, 0xc3, 0xf6, 0xd7, 0x37, 0xbb, 0x34, 0xef, 0xbb, 0x0e, 0xe1, 0x35, 0x3c, 0xcd, 0x19, 0x6b, 0x49, 0xde, 0x7e, 0xb4, 0x44, 0xab, 0x22, 0xee, 0x66, 0x17, 0xa7, 0x41, 0x03, 0xb6, 0xa4, 0xf8, 0x10, 0x3d, 0x4b, 0x90, 0xe2, 0x37, 0x49, 0x0f, 0x38, 0xfa, 0xee, 0x98, 0x7c, 0xda, 0x8e, 0x3b, 0x46, 0x9c, 0x27, 0x11, 0x22, 0x2e, 0x43, 0x89, 0x93, 0x95, 0x20, 0xfd, 0x58, 0x26, 0x0f, 0x89, 0xed, 0xf9, 0x1a, 0x1c, 0x55, 0x9b, 0xe9, 0xcf, 0x17, 0x03, 0xe7, 0x76, 0x87, 0xc7, 0xa0, 0x75, 0x46, 0x90, 0x6d, 0xd6, 0x0c, 0xcc, 0x54, 0x98, 0xa5, 0xa2, 0x2a, 0x49, 0x3a, 0x2b, 0xfa, 0xd7, 0xd2, 0xdf, 0xab, 0xa3, 0x18, 0x4d, 0xdc, 0xd7, 0x5f, 0x10, 0x13, 0xfa, 0xe3, 0xfe, 0x17, 0xc1, 0x52, 0xa2, 0x9a, 0x28, 0x8b, 0xed, 0x1b, 0xc2, 0xa5, 0x28, 0x0b, 0x4d, 0x33, 0x2d, 0x2f, 0x8a, 0xc6, 0xd7, 0x45, 0x4c, 0xb4, 0xb7, 0xea, 0xce, 0x18, 0x08, 0xbb, 0x49, 0x1a, 0xe5, 0xbb, 0xc6, 0x71, 0xba, 0xf5, 0x31, 0x26, 0xf9, 0x62, 0xb0, 0x9a, 0x0e, 0x0c, 0x33, 0xca, 0x94, 0x74, 0x4b, 0xd2, 0xc9, 0x31, 0x3f, 0xb0, 0x3f, 0xdb, 0x5d, 0x4b, 0xd5, 0x27, 0x8e, 0xb4, 0xe6, 0x53, 0x2d, 0xab, 0xc0, 0xc5, 0x19, 0x65, 0x58, 0xef, 0x09, 0x8c, 0x3c, 0x75, 0x20, 0x88, 0xc8, 0x92, 0xc2, 0xfd, 0x9d, 0xb8, 0xa5, 0x94, 0x4f, 0x76, 0x2b, 0xff, 0x5e, 0x9f, 0xef, 0x37, 0x68, 0xa9, 0x9d, 0x08, 0x9c, 0x53, 0x08, 0xd0, 0x72, 0x8a, 0x76, 0x84, 0x99, 0x8e, 0x3e, 0xf3, 0x31, 0x51, 0x96, 0x4f, 0x3b, 0x20, 0xa6, 0xe9, 0x4e, 0x84, 0xe1, 0x3c, 0x8b, 0x6b, 0x94, 0x2d, 0xd3, 0x83, 0xbf, 0x91, 0x37, 0xe7, 0x25, 0xf0, 0xaf, 0xfd, 0x9f, 0x88, 0x0f, 0x9e, 0xb5, 0x95, 0x38, 0x78, 0x6f, 0xd0, 0x8b, 0xb1, 0x69, 0x36, 0xa4, 0xcd, 0x26, 0x0a, 0x44, 0xd2, 0xa6, 0x1d, 0x8e, 0xaa, 0x3b, 0x4d, 0x77, 0xc8, 0x98, 0x4c, 0x78, 0x0f, 0x2b, 0xa3, 0x85, 0xef, 0xad, 0xf6, 0x43, 0xd1, 0xf7, 0x89, 0x76, 0xb5, 0x17, 0x03, 0xb8, 0x19, 0xa3, 0x72, 0x71, 0x1d, 0x4d, 0x90, 0x03, 0xe6, 0xb8, 0x45, 0x45, 0x40, 0x8a, 0x6c, 0x33, 0x87, 0xc3, 0xda, 0xe4, 0xc7, 0x4d, 0x9c, 0xbc, 0x22, 0xd3, 0x81, 0xe2, 0x72, 0xd7, 0xd9, 0xf4, 0x30, 0xff, 0x7b, 0xfa, 0x95, 0xb0, 0x0d, 0x99, 0xfe, 0xde, 0x7f, 0x8a, 0x95, 0x23, 0xd9, 0x4a, 0x2e, 0x0e, 0x37, 0x12, 0x6f, 0xbd, 0x11, 0x09, 0x34, 0xae, 0xc0, 0xb9, 0x31, 0xd2, 0x3e, 0xbf, 0xda, 0xe3, 0x2e, 0xc7, 0x7f, 0xf8, 0x1c, 0xb8, 0xbc, 0x57, 0x05, 0x2c, 0x10, 0x8a, 0x1a, 0x23, 0xcc, 0xb5, 0xc1, 0xf8, 0x2f, 0x26, 0xdd, 0x94, 0xcf, 0x2e, 0x4f, 0xe1, 0x3a, 0x2f, 0xbd, 0x81, 0xde, 0xf7, 0x91, 0xc1, 0x26, 0x4c, 0x45, 0xc8, 0xe6, 0xc8, 0xdf, 0x15, 0xf9, 0xe8, 0xb7, 0x28, 0x29, 0x5f, 0x80, 0x7e, 0x4e, 0xb0, 0x86, 0xc3, 0xba, 0xfb, 0x35, 0x44, 0xd5, 0x17, 0xdb, 0xa3, 0x05, 0xe2, 0xaf, 0xce, 0xd1, 0xd5, 0x11, 0x31, 0x45, 0xdc, 0x13, 0x2b, 0x98, 0x64, 0x39, 0xbf, 0x0c, 0xb5, 0x7d, 0x8d, 0x16, 0x82, 0x96, 0x00, 0xbf, 0xbe, 0x7a, 0xc8, 0x4a, 0xb2, 0x22, 0x8b, 0x17, 0x4d, 0x8d, 0xd7, 0xc7, 0xbb, 0x07, 0x5c, 0xa1, 0x39, 0xab, 0x58, 0x34, 0x27, 0x27, 0x52, 0x3e, 0x5e, 0xbf, 0x0b, 0xcd, 0xc5, 0x95, 0xb2, 0xa4, 0x1f, 0x27, 0x57, 0xe0, 0x27, 0x19, 0xa2, 0xdc, 0xdf, 0x35, 0xc5, 0x51, 0x25, 0xb0, 0xaf, 0xc2, 0x87, 0xae, 0x82, 0x17, 0x58, 0x09, 0x48, 0x88, 0x03, 0x4e, 0xe2, 0xbc, 0xa0, 0x09, 0x40, 0x32, 0xc5, 0x43, 0xd8, 0xe1, 0x9f, 0x48, 0x50, 0x1b, 0x41, 0xae, 0x7e, 0xb7, 0x3b, 0x92, 0x93, 0x6f, 0x6f, 0x25, 0x93, 0x87, 0x20, 0x68, 0x09, 0xb0, 0x4c, 0x33, 0xf8, 0x2b, 0x3c, 0x7c, 0x14, 0x31, 0x59, 0xd6, 0x32, 0x93, 0x41, 0x38, 0xfe, 0x9e, 0x1a, 0x00, 0xec, 0x41, 0x27, 0x37, 0x71, 0x72, 0x98, 0x17, 0x72, 0xcd, 0xa7, 0xca, 0xfd, 0x7e, 0xe0, 0x75, 0x37, 0x62, 0xc0, 0x75, 0x95, 0x69, 0x82, 0xe9, 0x4f, 0x3f, 0x36, 0x70, 0x12, 0x2b, 0x13, 0x34, 0xf6, 0x37, 0x0e, 0x27, 0xaf, 0x91, 0xac, 0x8c, 0x07, 0x31, 0x14, 0xba, 0x8c, 0xbc, 0x68, 0x1c, 0x85, 0xa8, 0x55, 0x7d, 0x2b, 0xa2, 0xe9, 0x82, 0x16, 0x2c, 0xa5, 0x78, 0xf6, 0x8b, 0xd4, 0x50, 0x83, 0xe0, 0x1b, 0xe8, 0xb7, 0x95, 0x50, 0x8d, 0x3a, 0xfa, 0x8f, 0xbd, 0x1e, 0x30, 0x8b, 0x31, 0xcc, 0x47, 0x23, 0x1b, 0x3e, 0xa3, 0x36, 0xac, 0x6f, 0xa4, 0xb7, 0xd9, 0x10, 0x86, 0x04, 0x5f, 0x7d, 0x85, 0x73, 0x04, 0xef, 0x45, 0x2e, 0x20, 0xf3, 0x72, 0x42, 0x5d, 0x1b, 0xa3, 0xf2, 0xbb, 0xf3, 0x85, 0x51, 0xd7, 0x36, 0x35, 0x10, 0x6c, 0x42, 0xed, 0x94, 0x1a, 0xca, 0xe3, 0x4b, 0x66, 0xcb, 0x6e, 0x41, 0x03, 0xc1, 0x6b, 0xee, 0x50, 0x1a, 0xdf, 0x53, 0x21, 0xeb, 0xde, 0x45, 0xc2, 0xe2, 0xab, 0x08, 0x39, 0x7c, 0x20, 0x1f, 0xcc, 0x77, 0x50, 0x63, 0xc3, 0x8b, 0x6c, 0x53, 0x6f, 0x55, 0xe3, 0xab, 0x6b, 0x94, 0xcd, 0x38, 0x22, 0x97, 0x8a, 0xea, 0x91, 0xf6, 0xa6, 0x2b, 0x4f, 0x81, 0x00, 0x6f, 0xca, 0x76, 0x2c, 0x0c, 0xd3, 0xf7, 0x15, 0x4d, 0x5d, 0xba, 0xe7, 0xc1, 0x81, 0x03, 0x2c, 0xd9, 0xc6, 0xcf, 0x35, 0xb2, 0xa0, 0x52, 0xbb, 0x30, 0x36, 0xa4, 0xc6, 0x4c, 0x68, 0xb8, 0xce, 0xaf, 0x11, 0x8d, 0x20, 0x7f, 0x89, 0xa8, 0x84, 0x79, 0x6f, 0xc1, 0x1d, 0x40, 0xa5, 0xbd, 0x90, 0xf4, 0x9b, 0xdc, 0x69, 0x07, 0xd1, 0x34, 0xba, 0x4c, 0x97, 0x5e, 0x04, 0x51, 0x18, 0x6f, 0x5b, 0xef, 0x96, 0x29, 0xc6, 0x1f, 0xf7, 0x73, 0xe5, 0x0f, 0x81, 0x07, 0xd6, 0x76, 0xe2, 0x6b, 0x58, 0x24, 0x73, 0x22, 0x31, 0xdd, 0xbd, 0x23, 0xce, 0x67, 0x3d, 0x8a, 0x2a, 0xe2, 0x64, 0x8e, 0xf1, 0x58, 0xe2, 0xb3, 0xe4, 0x95, 0x24, 0x40, 0x7f, 0x39, 0x1b, 0xf4, 0xd9, 0x0b, 0x40, 0xf5, 0xcd, 0x90, 0xd5, 0x09, 0x57, 0xdd, 0x6d, 0x08, 0x40, 0xa9, 0xae, 0x92, 0xfe, 0xa6, 0x56, 0xfd, 0xd6, 0x12, 0x7c, 0x91, 0x43, 0x88, 0x19, 0xf8, 0x9b, 0x1d, 0xc6, 0xf0, 0xf0, 0xa8, 0xc7, 0x43, 0x34, 0x61, 0x49, 0xf9, 0xa1, 0xae, 0xe8, 0xcc, 0x58, 0x39, 0x74, 0xdc, 0x49, 0x46, 0xf5, 0xa4, 0x52, 0x44, 0xec, 0x2d, 0xab, 0xa1, 0xdc, 0x81, 0x81, 0xe3, 0x09, 0x63, 0xe1, 0xf5, 0x80, 0x3d, 0xd8, 0xbe, 0x57, 0x5a, 0xd9, 0xf8, 0x36, 0x55, 0x5e, 0x40, 0x17, 0xd2, 0xd2, 0x69, 0x49, 0x6b, 0xaf, 0x16, 0xbb, 0xee, 0xe4, 0x88, 0x77, 0xc5, 0x79, 0xb4, 0x6d, 0xb5, 0x75, 0x99, 0x72, 0xcc, 0x00, 0xd0, 0x88, 0x94, 0xc5, 0x65, 0x60, 0x8d, 0x9a, 0xe5, 0x1d, 0xda, 0x63, 0xb8, 0x5b, 0x3b, 0x33, 0xb1, 0x70, 0x3b, 0xb5, 0xe4, 0xf1, 0xab, 0xcb, 0xb8, 0x79, 0x4e, 0x74, 0x3d, 0xa5, 0xd6, 0xf3, 0xbf, 0x63, 0x0f, 0x2e, 0x9b, 0x6d, 0x5b, 0x54, 0x51, 0x10, 0x5e, 0xc2, 0xdb, 0x32, 0xfa, 0x28, 0x3d, 0x93, 0x7e, 0xe7, 0x5e, 0x53, 0x1a, 0xbe, 0x16, 0xb5, 0x97, 0xa6, 0x88, 0x22, 0x44, 0xfa, 0xb2, 0x71, 0x34, 0xdb, 0x42, 0x65, 0xa6, 0xd3, 0xab, 0x77, 0xc5, 0xb8, 0x79, 0xd6, 0x92, 0xd4, 0xe1, 0xad, 0x1e, 0x42, 0x9d, 0xa4, 0xfc, 0x9b, 0xf7, 0xa9, 0xf6, 0xd3, 0x23, 0xf0, 0xff, 0x5d, 0xd1, 0x38, 0x69, 0x96, 0x03, 0x51, 0x58, 0x60, 0x1c, 0xdb, 0x77, 0x0d, 0x3a, 0x50, 0xe9, 0x80, 0xc6, 0x45, 0x83, 0x8e, 0x4a, 0xec, 0x38, 0xaa, 0x82, 0xde, 0xd4, 0xc2, 0xb5, 0x17, 0xee, 0x64, 0x45, 0x42, 0x17, 0x25, 0x86, 0x38, 0x58, 0x43, 0xcc, 0xc3, 0xdc, 0x89, 0xc8, 0xa7, 0xe9, 0x73, 0x14, 0xe3, 0x15, 0x93, 0x0c, 0x34, 0xb6, 0x33, 0xe0, 0xdb, 0x9a, 0x3c, 0xe7, 0xa0, 0xf8, 0x57, 0x36, 0x17, 0xa7, 0x51, 0x72, 0x22, 0x8e, 0xc4, 0xe2, 0xb7, 0x5c, 0xf4, 0xc8, 0xe3, 0x79, 0xf7, 0xf2, 0x0f, 0x3c, 0x19, 0x8c, 0x83, 0x5e, 0x7e, 0x38, 0x28, 0xae, 0x09, 0x61, 0x92, 0x07, 0x7d, 0xcb, 0x3d, 0x7f, 0xe2, 0x6f, 0x17, 0xe2, 0x2b, 0x87, 0x3f, 0x5f, 0x15, 0xe5, 0x0d, 0x80, 0x52, 0x88, 0x52, 0x60, 0xe7, 0x71, 0xe1, 0x18, 0xd3, 0xb3, 0x4e, 0x7a, 0xf1, 0xca, 0xf5, 0x02, 0x1f, 0x2d, 0x3e, 0x09, 0xa0, 0x27, 0x20, 0x3c, 0xbf, 0xe2, 0xe4, 0x4d, 0xb5, 0xc5, 0x2c, 0xe8, 0xcd, 0xff, 0x33, 0xe9, 0xc6, 0x64, 0x56, 0xcc, 0x79, 0x79, 0xd4, 0x64, 0xbc, 0xca, 0xd2, 0xd0, 0x85, 0x84, 0xa2, 0xac, 0x53, 0x3f, 0x44, 0x84, 0xc9, 0x1c, 0x2d, 0x8e, 0x9c, 0x10, 0x48, 0x98, 0xb0, 0x7f, 0x3b, 0x3f, 0x7e, 0x0d, 0xeb, 0x62, 0xb9, 0xb1, 0x42, 0xd6, 0x31, 0x0b, 0x30, 0x5b, 0xf7, 0xf7, 0xef, 0xcf, 0xc2, 0x62, 0x8c, 0xa2, 0x91, 0x5c, 0xa3, 0x8a, 0x92, 0x6f, 0x6a, 0x78, 0x43, 0x2f, 0xf0, 0xca, 0xd7, 0x13, 0xa7, 0xc2, 0xdb, 0x83, 0x21, 0x37, 0x19, 0x32, 0x17, 0x8a, 0xbd, 0xae, 0xaf, 0xdc, 0xb6, 0x36, 0xfe, 0x7e, 0x5f, 0xcb, 0xcc, 0xa9, 0x5f, 0x89, 0x98, 0x70, 0xce, 0x38, 0xdc, 0xf2, 0x99, 0x1f, 0x93, 0xd4, 0x27, 0x18, 0xf7, 0xef, 0x3c, 0xea, 0x8f, 0x45, 0x1e, 0xd2, 0x69, 0x3a, 0xf7, 0x63, 0xa5, 0x01, 0x7b, 0x91, 0x33, 0x54, 0xca, 0x08, 0xdc, 0x68, 0x98, 0xc2, 0x87, 0x20, 0x8b, 0xd8, 0xb5, 0x81, 0xe4, 0x98, 0x4f, 0x66, 0x62, 0xd9, 0xa1, 0x74, 0x63, 0x8b, 0xa6, 0x51, 0x4d, 0x92, 0x86, 0x11, 0x2c, 0xd5, 0x5d, 0xf1, 0x9d, 0x91, 0x3e, 0x48, 0xea, 0xf4, 0x78, 0xba, 0x76, 0xe7, 0x17, 0xaf, 0x5c, 0x2b, 0xae, 0x03, 0x53, 0xa7, 0x54, 0x00, 0xd5, 0x00, 0xed, 0x89, 0x80, 0x6b, 0xab, 0x97, 0xbc, 0xbf, 0xd4, 0xea, 0x9e, 0xcf, 0xc5, 0xf8, 0x0c, 0xf6, 0x37, 0x2a, 0x22, 0xf3, 0xc1, 0x47, 0xd5, 0xf7, 0x9e, 0x30, 0xd6, 0xfd, 0xb1, 0xcf, 0xb9, 0x5a, 0xc6, 0x4a, 0x57, 0x95, 0x1b, 0x7c, 0x71, 0x78, 0x1f, 0xa5, 0x96, 0x67, 0x79, 0x60, 0x46, 0xf1, 0x4c, 0xd6, 0x57, 0xa5, 0xb9, 0x32, 0x98, 0x27, 0xa6, 0x55, 0xb5, 0x83, 0xbe, 0xca, 0x5a, 0xc0, 0xb9, 0xfc, 0x9b, 0xb9, 0xde, 0xa6, 0x94, 0x28, 0xc6, 0x8c, 0x4c, 0x04, 0x62, 0x69, 0xe0, 0x0d, 0x40, 0x28, 0xdd, 0xa5, 0x09, 0x56, 0xed, 0xe1, 0x4f, 0xd8, 0xb6, 0xe0, 0x85, 0xd9, 0xff, 0x5b, 0x4f, 0x07, 0x14, 0x7e, 0xfd, 0xff, 0x6c, 0xf6, 0x51, 0x05, 0x8a, 0x4c, 0x89, 0xf9, 0x21, 0x71, 0x99, 0x86, 0x7b, 0x9a, 0xb9, 0x9d, 0x1b, 0x4d, 0x1f, 0x22, 0xa2, 0xbc, 0x0e, 0xe5, 0xef, 0x53, 0x0f, 0xd3, 0x8a, 0x8d, 0x7f, 0x6e, 0x43, 0x0b, 0x49, 0x7a, 0x16, 0xe7, 0xf5, 0xf9, 0x52, 0x46, 0xe2, 0x5a, 0xfb, 0x2c, 0xcf, 0xee, 0x6c, 0x95, 0xa0, 0x9b, 0x40, 0xc1, 0x5f, 0xd4, 0x73, 0xcf, 0x82, 0xc8, 0xc5, 0x8d, 0x6c, 0xda, 0x5f, 0x8f, 0x36, 0x52, 0xb9, 0x7e, 0xae, 0x52, 0xbb, 0xb3, 0xa0, 0x0b, 0x23, 0x04, 0x55, 0x30, 0x26, 0xde, 0x5a, 0xab, 0x5a, 0x95, 0x82, 0x90, 0xd3, 0xf7, 0x2e, 0x4f, 0x8c, 0x27, 0xcc, 0x2d, 0x09, 0xa9, 0x9e, 0xf5, 0x3b, 0xb9, 0xbd, 0xea, 0xa4, 0xe1, 0x5d, 0x01, 0xbc, 0xca, 0x52, 0x4d, 0x92, 0x53, 0xd4, 0xbb, 0xb6, 0xe0, 0x7f, 0xff, 0x57, 0xf4, 0x9d, 0xce, 0xa9, 0x03, 0xa8, 0x4e, 0x89, 0x81, 0x0b, 0xcb, 0x64, 0x3f, 0x29, 0xab, 0x55, 0xf7, 0xa0, 0xa4, 0x8d, 0x26, 0xcf, 0x2c, 0xf8, 0x19, 0x96, 0x31, 0x1e, 0x4b, 0x5c, 0x0b, 0x47, 0xee, 0x57, 0xaf, 0xe2, 0xc8, 0x07, 0x25, 0x27, 0x40, 0x04, 0x3c, 0xfc, 0xb9, 0xfa, 0x7c, 0x15, 0x1e, 0xf2, 0x5c, 0x60, 0xbe, 0xd3, 0xb5, 0xa0, 0x5b, 0x28, 0x77, 0x57, 0x7d, 0x23, 0x9b, 0xea, 0x0c, 0xe2, 0x58, 0x00, 0x1e, 0xf2, 0x9a, 0x2b, 0x0e, 0x12, 0xb0, 0xca, 0xce, 0x39, 0x44, 0x2e, 0x7e, 0xda, 0x91, 0xfb, 0x3d, 0x66, 0xd0, 0xd1, 0x3f, 0x13, 0xf3, 0x2c, 0x1f, 0xdc, 0x96, 0x89, 0x77, 0xc8, 0x33, 0xcb, 0xaf, 0x70, 0x95, 0xdc, 0x12, 0xbb, 0x8f, 0x97, 0x27, 0xed, 0xed, 0xe6, 0x3e, 0xe0, 0xab, 0x27, 0x49, 0x90, 0x65, 0xd5, 0xed, 0xde, 0x0f, 0x64, 0xd9, 0x8d, 0xe6, 0x6c, 0x57, 0x91, 0xa6, 0x0a, 0x20, 0x89, 0xfe, 0x84, 0x75, 0x8a, 0x41, 0x2b, 0x6b, 0x1e, 0x5e, 0x86, 0x87, 0x8c, 0x12, 0xac, 0x8a, 0x5a, 0x5c, 0xf2, 0x8e, 0x11, 0x32, 0xc6, 0x52, 0x40, 0x72, 0xdb, 0xd3, 0xc3, 0x1b, 0x87, 0x1c, 0x45, 0xbd, 0x69, 0x5e, 0x04, 0x2e, 0x4e, 0x43, 0xd4, 0x7f, 0x55, 0x80, 0x67, 0x2e, 0x52, 0xaa, 0xcb, 0x9d, 0x71, 0x4a, 0x34, 0xc3, 0x1c, 0x33, 0xfc, 0x22, 0x1e, 0x13, 0xe8, 0xf9, 0x08, 0x49, 0xad, 0xba, 0xd3, 0xf6, 0xb3, 0xbe, 0xc8, 0x57, 0x18, 0x38, 0x9d, 0x52, 0xf8, 0x68, 0xe1, 0x4e, 0xec, 0x11, 0x9a, 0x48, 0xd0, 0x2c, 0x2c, 0x23, 0xca, 0xde, 0x7c, 0x40, 0x87, 0xa8, 0x56, 0x4f, 0xc8, 0xde, 0x0c, 0x65, 0x1e, 0x5a, 0x60, 0x4e, 0xf1, 0x71, 0xa4, 0x24, 0xc7, 0x26, 0x20, 0x20, 0xc3, 0x9e, 0xb4, 0xb1, 0x6c, 0xd4, 0xbf, 0xcb, 0xb1, 0x8e, 0x3f, 0x82, 0x29, 0x90, 0x39, 0xd7, 0x9f, 0x0f, 0x5b, 0xd2, 0xcd, 0x68, 0xe0, 0xd1, 0x68, 0x12, 0xb4, 0x1f, 0x5d, 0xd1, 0xd8, 0xc8, 0x5b, 0x2d, 0x09, 0xac, 0x91, 0x23, 0x9c, 0xd3, 0xb9, 0x1a, 0xad, 0x00, 0x55, 0x19, 0x78, 0x89, 0x38, 0x36, 0x07, 0x65, 0x49, 0x52, 0x0e, 0x87, 0x84, 0x03, 0x13, 0x6a, 0x41, 0xd2, 0xd1, 0xee, 0xb9, 0xa7, 0xdf, 0x62, 0xc6, 0x81, 0x8d, 0xe2, 0xea, 0x6a, 0x0f, 0xe3, 0x93, 0xab, 0xdd, 0x0c, 0x9d, 0x3c, 0x59, 0x48, 0x19, 0x7e, 0xb2, 0x19, 0x4d, 0x2c, 0x09, 0x2f, 0xfb, 0x8f, 0xd3, 0x39, 0xe7, 0xf2, 0x7f, 0xfb, 0x93, 0x56, 0x58, 0xa0, 0x4d, 0x67, 0xac, 0x52, 0x6b, 0xae, 0x2e, 0x09, 0xd6, 0x07, 0x99, 0xa0, 0xc5, 0x56, 0x96, 0x2e, 0xcb, 0x76, 0xe0, 0x93, 0x14, 0x72, 0xa6, 0x51, 0xec, 0xf8, 0x31, 0x9e, 0x80, 0x0a, 0xc6, 0xb7, 0xe9, 0xf7, 0xce, 0x76, 0x66, 0x8a, 0x34, 0x27, 0xe9, 0x81, 0x0f, 0x98, 0xd6, 0x40, 0x81, 0x6f, 0x07, 0xc7, 0xde, 0xc0, 0x13, 0xe2, 0x11, 0xdf, 0xd0, 0x9f, 0x3c, 0x73, 0x16, 0x05, 0x9f, 0xcc, 0xc6, 0x03, 0xbb, 0x77, 0x0b, 0xa7, 0xb7, 0x0f, 0xe0, 0x91, 0x02, 0x55, 0xd3, 0xa6, 0x3a, 0x83, 0x08, 0x09, 0x4d, 0xde, 0x80, 0x47, 0xde, 0x8b, 0x9b, 0xd1, 0xea, 0xa3, 0xdc, 0xb0, 0xab, 0x8a, 0xed, 0x74, 0xbc, 0x7c, 0xe3, 0x6d, 0x7f, 0x68, 0xc2, 0x1e, 0xbc, 0x02, 0x44, 0xef, 0x8a, 0x14, 0xd6, 0x22, 0x73, 0x14, 0xe4, 0x08, 0xd3, 0xfc, 0x56, 0x75, 0x81, 0x56, 0x5b, 0x71, 0xb1, 0x96, 0x65, 0x30, 0x19, 0xad, 0x75, 0x45, 0x53, 0xdb, 0x98, 0x12, 0x83, 0xc5, 0xb1, 0x83, 0x39, 0xc7, 0x7a, 0xfc, 0x99, 0x8b, 0xc6, 0x8f, 0xb9, 0xdb, 0x09, 0x73, 0x4a, 0xb3, 0x19, 0xb1, 0x7b, 0x9b, 0x36, 0x21, 0x1a, 0x33, 0x49, 0x95, 0xfc, 0x10, 0x69, 0x54, 0xa0, 0xc6, 0xa3, 0xca, 0x0f, 0x46, 0xfb, 0x7d, 0x06, 0x6b, 0xae, 0x43, 0x57, 0xcf, 0xba, 0xb3, 0x8d, 0xe3, 0xa0, 0xd9, 0xcf, 0x3f, 0x69, 0x2e, 0x07, 0x36, 0xe7, 0xc6, 0x43, 0xae, 0x3d, 0xcc, 0x5b, 0x2e, 0xa2, 0x2c, 0xd4, 0x39, 0x61, 0x8f, 0x04, 0xdb, 0x24, 0x8c, 0x77, 0x81, 0x73, 0x1c, 0x92, 0x0e, 0x78, 0x4f, 0x76, 0x2a, 0x05, 0x3e, 0x27, 0xdd, 0xd8, 0x41, 0xee, 0x5e, 0x1d, 0x62, 0xfb, 0x25, 0x34, 0x11, 0x4f, 0x47, 0xb5, 0x19, 0xd9, 0x03, 0xb1, 0xd2, 0xdf, 0x98, 0x3b, 0x98, 0xa0, 0x5a, 0x27, 0x7d, 0x38, 0x05, 0x12, 0x3b, 0xc3, 0x51, 0xa3, 0x6d, 0xc5, 0xc7, 0x0f, 0xfe, 0xca, 0xd2, 0xe3, 0xe1, 0x49, 0x19, 0xfe, 0x02, 0xce, 0x0c, 0xdc, 0x7d, 0x58, 0xbd, 0x1b, 0x0f, 0x00, 0xf2, 0x37, 0xc9, 0xdc, 0x78, 0x99, 0x0c, 0x23, 0xba, 0xd0, 0xb1, 0x92, 0x92, 0x1e, 0x88, 0x0e, 0x5e, 0x36, 0x04, 0x8a, 0x57, 0x44, 0x34, 0x2b, 0x1e, 0x2e, 0xf5, 0xaa, 0x98, 0x19, 0x67, 0xfb, 0xfc, 0x30, 0x9d, 0x2c, 0x2a, 0xa0, 0x99, 0x8f, 0x3f, 0xe7, 0x77, 0x1b, 0x66, 0x4f, 0xe8, 0x10, 0xf1, 0xb5, 0xe2, 0xda, 0xa8, 0x8f, 0x96, 0x38, 0x60, 0x2e, 0xa3, 0x9d, 0xd0, 0x40, 0x89, 0xd7, 0xa1, 0x98, 0x60, 0xee, 0xc4, 0x32, 0xca, 0x4f, 0x08, 0x71, 0x26, 0x29, 0xec, 0xac, 0x06, 0x18, 0xb1, 0xe9, 0xe3, 0x01, 0xb4, 0xe8, 0x10, 0x3d, 0xfb, 0x64, 0xed, 0xf9, 0x0e, 0x95, 0x5d, 0xdc, 0x08, 0xf9, 0x7a, 0xeb, 0xed, 0x54, 0x87, 0xaa, 0x3e, 0xf6, 0x25, 0x84, 0xcb, 0x3c, 0xca, 0x6d, 0xc9, 0x59, 0x70, 0xc6, 0x24, 0x56, 0x8a, 0x81, 0x17, 0x58, 0x3c, 0x85, 0xf9, 0x22, 0xcb, 0x54, 0x5a, 0xda, 0x53, 0xeb, 0x4e, 0x10, 0xb8, 0xea, 0x09, 0xfc, 0xde, 0xf4, 0xac, 0x07, 0x1d, 0x59, 0x5f, 0x8e, 0xef, 0xf2, 0xa0, 0xe2, 0xec, 0x4d, 0xda, 0x93, 0xf9, 0x0a, 0x3a, 0xee, 0xbc, 0x85, 0xbe, 0xc4, 0x53, 0xb6, 0x8f, 0x6d, 0x45, 0x55, 0x90, 0x0d, 0xb8, 0x41, 0x37, 0x16, 0xe5, 0x22, 0x9c, 0x0e, 0xca, 0x4d, 0xcf, 0x93, 0x1e, 0xe9, 0x6f, 0x9c, 0x8a, 0x50, 0x78, 0x01, 0x16, 0xb8, 0x5d, 0x3e, 0xe2, 0x13, 0x57, 0x74, 0x16, 0x34, 0xfc, 0xb0, 0x1b, 0x32, 0x13, 0x70, 0x0c, 0x11, 0xa7, 0x63, 0x67, 0x9f, 0x5a, 0x71, 0x09, 0x9d, 0xfc, 0xfb, 0x59, 0x1f, 0x5c, 0x64, 0xc3, 0x36, 0x5e, 0xd0, 0x68, 0xcb, 0x4e, 0x2b, 0x13, 0xce, 0x74, 0x6e, 0x6f, 0x91, 0xe9, 0x1d, 0x78, 0x6e, 0xa9, 0x14, 0x30, 0xb0, 0xe8, 0x84, 0x93, 0xb1, 0xaa, 0x39, 0xcc, 0x3f, 0x8e, 0x1e, 0xa9, 0x44, 0xea, 0x02, 0x4d, 0xa6, 0x1d, 0x9c, 0x25, 0x6d, 0x21, 0xcd, 0x1d, 0x24, 0x60, 0x26, 0x13, 0x81, 0xc9, 0xaa, 0x8b, 0x48, 0x22, 0xd5, 0xa5, 0x6c, 0xa0, 0xdd, 0x4d, 0x77, 0xb5, 0x37, 0xb2, 0x2d, 0x29, 0x5d, 0xf9, 0x6c, 0x6c, 0xcf, 0x32, 0x57, 0x2b, 0x57, 0x8b, 0xb4, 0x21, 0x92, 0xc3, 0x91, 0x30, 0xac, 0xe2, 0x2e, 0xb0, 0x6b, 0x28, 0x17, 0x07, 0x6f, 0x43, 0x91, 0x79, 0xb8, 0xc5, 0x37, 0x42, 0x68, 0xd4, 0xe5, 0xe2, 0xca, 0x23, 0xd5, 0xb9, 0x94, 0x22, 0x08, 0xd3, 0x69, 0x72, 0xe8, 0x05, 0xa2, 0x9c, 0x2b, 0x39, 0x4e, 0x02, 0xfa, 0x06, 0x77, 0x16, 0x53, 0x84, 0xa8, 0xc9, 0xac, 0x5e, 0xab, 0x47, 0xd9, 0x28, 0x97, 0xe1, 0x2f, 0xf3, 0x0b, 0x4a, 0xea, 0x1f, 0xb4, 0x07, 0xcc, 0x71, 0x15, 0x21, 0x07, 0x65, 0x87, 0x1d, 0x5d, 0xc6, 0x7e, 0x2d, 0x86, 0x7b, 0x0f, 0xa8, 0xd2, 0xa4, 0xaf, 0xb8, 0x0f, 0xe6, 0x3e, 0x53, 0xad, 0x02, 0x44, 0x6c, 0x20, 0xad, 0x7a, 0x6a, 0x86, 0x9c, 0x8c, 0xd9, 0x8a, 0xde, 0x1d, 0x5f, 0x88, 0x6e, 0x0b, 0xf2, 0xf2, 0x09, 0xf5, 0x49, 0xf2, 0x3d, 0xfb, 0x90, 0x50, 0xc3, 0xc5, 0x60, 0x97, 0x0e, 0xc7, 0xee, 0x73, 0x24, 0xc3, 0x83, 0x5e, 0xad, 0x8f, 0x2c, 0x7b, 0x49, 0x18, 0xb2, 0xc2, 0x27, 0xa7, 0xcc, 0x5e, 0xd4, 0x63, 0x94, 0x53, 0x50, 0x18, 0x38, 0x64, 0x67, 0x36, 0xf2, 0x34, 0x3e, 0x1d, 0x3a, 0xab, 0x2d, 0x97, 0x3a, 0x9b, 0xcc, 0xa6, 0x82, 0xa4, 0x51, 0x81, 0xfd, 0x55, 0x19, 0xd9, 0x23, 0x93, 0x84, 0x60, 0x71, 0x3f, 0x06, 0x8c, 0x16, 0x13, 0x7b, 0x98, 0xf0, 0xcd, 0xbb, 0xcd, 0xb6, 0x90, 0x6f, 0xff, 0x77, 0x87, 0x23, 0x5a, 0x43, 0xcb, 0x9c, 0x5f, 0x28, 0x87, 0x6b, 0x29, 0x60, 0x5a, 0xc2, 0xf5, 0xc8, 0xfc, 0x87, 0xe1, 0x94, 0x25, 0xa7, 0xf4, 0x41, 0xaa, 0xad, 0x5f, 0xcc, 0xe9, 0x93, 0x02, 0x22, 0x68, 0xd7, 0x32, 0xd7, 0xb9, 0xd2, 0xba, 0x1a, 0xa1, 0x46, 0x1f, 0xe9, 0x79, 0x36, 0x29, 0x81, 0xd3, 0xfa, 0x9e, 0x19, 0x61, 0x92, 0x51, 0xcf, 0x13, 0x3b, 0x5b, 0xe3, 0x80, 0x40, 0xa9, 0x23, 0x87, 0x13, 0xb7, 0xa6, 0x36, 0x9c, 0x9a, 0xbd, 0xea, 0xd1, 0x44, 0x27, 0xb8, 0x87, 0x04, 0x84, 0x0c, 0x87, 0x4c, 0x0c, 0x90, 0xe5, 0xb7, 0x81, 0x50, 0x8d, 0x4a, 0x62, 0x1b, 0x1f, 0xfb, 0x62, 0x2c, 0xfd, 0x6f, 0x19, 0x0a, 0xa2, 0x08, 0xf8, 0xac, 0x35, 0x1f, 0x82, 0xe1, 0x5d, 0x8e, 0xb9, 0xef, 0x58, 0x72, 0xd7, 0x7a, 0x47, 0x2f, 0x3f, 0xa8, 0xcc, 0xb4, 0xb3, 0x83, 0xd7, 0x00, 0xc7, 0x9f, 0xbd, 0xe4, 0x96, 0xfc, 0x8b, 0x0b, 0xb3, 0x2d, 0x99, 0x39, 0x63, 0xba, 0x62, 0xd0, 0x09, 0xc4, 0x92, 0x98, 0xe1, 0xe7, 0x61, 0xbf, 0xf1, 0x65, 0x20, 0x1f, 0x3d, 0x80, 0x11, 0xc0, 0x3b, 0x27, 0x7c, 0x9e, 0x86, 0xd5, 0xff, 0xac, 0xd6, 0xb7, 0x26, 0x18, 0x30, 0x0d, 0x3c, 0xd1, 0x5a, 0xd2, 0x60, 0x47, 0x92, 0x9f, 0xdb, 0x72, 0x7f, 0xcd, 0xb0, 0x15, 0x68, 0xda, 0x75, 0x44, 0xa4, 0x0d, 0x62, 0x24, 0x52, 0x5d, 0xa8, 0xf2, 0x4a, 0x90, 0x03, 0x46, 0x53, 0xa0, 0x93, 0x99, 0x96, 0x62, 0xe8, 0x05, 0x52, 0x69, 0x5c, 0x4d, 0xd2, 0x29, 0xa5, 0x1d, 0x9c, 0x58, 0xaa, 0x93, 0xec, 0x9a, 0x96, 0xfd, 0x60, 0x5c, 0x2b, 0xe5, 0xf5, 0x00, 0x5a, 0x4b, 0x32, 0x3b, 0x10, 0x31, 0xa3, 0xbc, 0x52, 0x5d, 0x89, 0x0f, 0x8c, 0x5a, 0xd0, 0xc0, 0x26, 0xc0, 0x41, 0xc3, 0x59, 0xb5, 0xf9, 0x13, 0x41, 0xb4, 0x1a, 0x9a, 0x33, 0x8d, 0xc0, 0x51, 0x50, 0xad, 0x37, 0xa8, 0x5a, 0xa0, 0x6b, 0x28, 0xc7, 0xd4, 0x9f, 0x57, 0x14, 0xa0, 0x62, 0xdc, 0x5c, 0x84, 0xbf, 0xe3, 0x29, 0xb3, 0xb5, 0xc3, 0x8a, 0xce, 0xe7, 0xde, 0x66, 0xf3, 0x93, 0xc9, 0x0f, 0xf6, 0xc8, 0xae, 0x1a, 0xee, 0xd4, 0xee, 0x6f, 0xf4, 0xfc, 0x0a, 0x9c, 0x27, 0x71, 0xc3, 0x6f, 0xf4, 0x7f, 0x80, 0xc3, 0x94, 0x06, 0xf1, 0x9a, 0xd5, 0x2e, 0xf2, 0x6c, 0x1e, 0x57, 0xb2, 0xbf, 0xad, 0x4f, 0x14, 0xf8, 0x24, 0xc8, 0x55, 0x71, 0x44, 0x09, 0xf0, 0xcb, 0xf8, 0xe3, 0xbe, 0x86, 0x95, 0xe7, 0x62, 0xce, 0x60, 0xd6, 0xe4, 0x98, 0x51, 0x59, 0x9c, 0xee, 0x16, 0xf2, 0x52, 0x87, 0x5b, 0x33, 0xa3, 0x9b, 0x49, 0x2e, 0xa6, 0xf5, 0x4c, 0x2c, 0xd0, 0x4a, 0x1a, 0xa2, 0x15, 0xc9, 0xf1, 0x60, 0x50, 0xf3, 0x1f, 0x0c, 0xe5, 0xad, 0xc8, 0xcf, 0xa5, 0x94, 0xe4, 0x4e, 0xf2, 0x90, 0x87, 0xdc, 0x23, 0xac, 0x65, 0xed, 0x2a, 0x25, 0x95, 0xce, 0x73, 0xc0, 0x95, 0x94, 0x10, 0x61, 0x8f, 0x53, 0x14, 0xda, 0xda, 0x90, 0x3c, 0x01, 0xc4, 0xf8, 0xd5, 0x05, 0x8f, 0x52, 0xd9, 0x02, 0xb9, 0xb2, 0x5c, 0xd2, 0x81, 0xef, 0x26, 0x27, 0xa6, 0x58, 0xa2, 0xd6, 0x72, 0xa3, 0xf7, 0x76, 0xf7, 0x26, 0x74, 0x2a, 0x99, 0x4a, 0x31, 0xbb, 0xcc, 0x3c, 0xf3, 0xea, 0x1f, 0xe5, 0x51, 0x04, 0x7a, 0x1d, 0x15, 0xb6, 0xa3, 0x1b, 0xe5, 0x23, 0x07, 0x30, 0x23, 0x34, 0xb8, 0xb6, 0x11, 0x2f, 0xb2, 0x43, 0x39, 0x8c, 0x62, 0x22, 0x0c, 0x04, 0x69, 0x03, 0xc9, 0xea, 0x9d, 0xf1, 0xa0, 0xbe, 0x50, 0x85, 0x18, 0x00, 0xd6, 0x59, 0xae, 0x42, 0x41, 0xc0, 0xbe, 0x81, 0x6f, 0xb4, 0xa7, 0xb5, 0x47, 0x10, 0x2b, 0xa7, 0x3f, 0x00, 0x14, 0x03, 0x21, 0xb5, 0x1d, 0xae, 0x10, 0x5d, 0x0f, 0x59, 0xc6, 0x52, 0x2b, 0x57, 0x1f, 0x91, 0xc8, 0xab, 0xdb, 0x6f, 0x3d, 0x66, 0x9f, 0x87, 0x01, 0x30, 0x3e, 0xf7, 0x11, 0x24, 0x37, 0xcc, 0x92, 0xe1, 0x7f, 0xba, 0xb8, 0xdd, 0x80, 0x11, 0xe6, 0xfd, 0x61, 0xec, 0x17, 0x63, 0x88, 0xab, 0x7c, 0x88, 0x5d, 0xa4, 0x66, 0x8a, 0x51, 0x16, 0x67, 0xc7, 0x20, 0x5e, 0xb4, 0xaa, 0x52, 0x6e, 0xce, 0xc5, 0x08, 0x7a, 0x62, 0x20, 0xf5, 0xf4, 0x6d, 0xd1, 0xab, 0xbb, 0xa3, 0xcd, 0x18, 0x90, 0x12, 0xfe, 0x50, 0xc9, 0x03, 0x96, 0x8d, 0x49, 0x21, 0xa2, 0x73, 0xaf, 0xdd, 0xe2, 0x99, 0xce, 0x10, 0xd8, 0x46, 0x5e, 0xe2, 0x1f, 0x78, 0xf0, 0xec, 0xfe, 0x2b, 0x28, 0x99, 0x3d, 0xd7, 0x26, 0xd2, 0x37, 0x3b, 0x45, 0xda, 0x31, 0x59, 0x08, 0x76, 0xea, 0xc2, 0x51, 0x52, 0x73, 0x13, 0xd4, 0xa0, 0x41, 0xc0, 0xcc, 0x02, 0x81, 0x10, 0xec, 0xaa, 0xab, 0x69, 0x99, 0xbf, 0x5a, 0xce, 0x56, 0x03, 0x5b, 0xa6, 0x80, 0xb4, 0x04, 0xbf, 0x3b, 0xb0, 0xc7, 0x92, 0xac, 0xdc, 0x07, 0xc9, 0x69, 0xc5, 0x29, 0xfe, 0x2d, 0x88, 0xef, 0xc6, 0xd1, 0xf0, 0x01, 0xee, 0x77, 0xdf, 0xcd, 0x04, 0x09, 0xef, 0x91, 0x19, 0xe2, 0x58, 0xb6, 0xc6, 0xca, 0x15, 0x60, 0x6d, 0x28, 0x42 ],
+    const [ 0x86, 0xff, 0xd5, 0xbd, 0x3b, 0xd1, 0xca, 0xe1, 0x07, 0x06, 0xa6, 0x1d, 0x24, 0x7b, 0x22, 0x57, 0xb1, 0x65, 0xf3, 0x7c, 0xb5, 0x3f, 0xf2, 0x17, 0x61, 0x07, 0x7a, 0x22, 0x95, 0xa9, 0x11, 0x1b, 0xa6, 0xbc, 0x4b, 0x5b, 0x5f, 0x6c, 0xec, 0xa4, 0x45, 0xb7, 0x4d, 0xf9, 0x1f, 0xdd, 0x01, 0xb2, 0xb6, 0x11, 0xb7, 0xcf, 0xda, 0x75, 0x62, 0x8d, 0xa5, 0x45, 0x98, 0x37, 0x04, 0x52, 0x38, 0x3f, 0x72, 0xb3, 0x50, 0x8d, 0x07, 0xb7, 0x3e, 0x17, 0xb2, 0x1e, 0x15, 0xb2, 0xc3, 0x88, 0x42, 0x27, 0xac, 0x2d, 0x6f, 0x8a, 0x08, 0xcf, 0xa7, 0xc7, 0xdc, 0xed, 0xbb, 0x7e, 0x1d, 0x3a, 0xe5, 0x11, 0x73, 0x4d, 0xac, 0xfb, 0x3d, 0x9a, 0x07, 0x63, 0xd5, 0xa1, 0xc5, 0xf0, 0x15, 0x65, 0x2c, 0xe0, 0x1a, 0x20, 0xe1, 0x54, 0x47, 0x35, 0x08, 0xee, 0x8d, 0x66, 0xab, 0x9e, 0xea, 0x47, 0x60, 0xb9, 0x30, 0xf2, 0x26, 0x4c, 0x08, 0xfd, 0x91, 0xaf, 0x36, 0xa9, 0x27, 0x5d, 0x1f, 0x5c, 0x09, 0x02, 0x88, 0x52, 0xd6, 0xd6, 0xa0, 0x8f, 0xcc, 0x2a, 0x41, 0x18, 0x30, 0x40, 0x73, 0x62, 0xf0, 0x60, 0x32, 0x0b, 0x88, 0x28, 0x71, 0xc8, 0x22, 0x24, 0x5e, 0x9f, 0x01, 0x9f, 0xe8, 0x56, 0x1f, 0xb8, 0x7e, 0x2b, 0x15, 0xb8, 0x1a, 0xc5, 0x3c, 0xa2, 0x7f, 0x6b, 0x12, 0x0c, 0xbf, 0x74, 0xdf, 0x2e, 0xff, 0xfe, 0x98, 0x39, 0x7e, 0xe3, 0x03, 0xea, 0xd4, 0xe9, 0x1c, 0x5e, 0x78, 0x39, 0xb8, 0x28, 0x85, 0x13, 0x68, 0xa1, 0xbe, 0xbf, 0xa0, 0x7f, 0xcf, 0xc7, 0x18, 0xa9, 0xd6, 0x63, 0x73, 0x4a, 0x21, 0x35, 0x1f, 0x24, 0x39, 0x36, 0x7c, 0x28, 0x20, 0xf1, 0x40, 0x43, 0xd8, 0xef, 0x1a, 0x7a, 0x24, 0x72, 0x95, 0x39, 0x93, 0x66, 0x40, 0xe8, 0xb9, 0x94, 0x0c, 0xc0, 0xc0, 0x19, 0xf5, 0xdd, 0x20, 0x16, 0xe4, 0x94, 0xaa, 0xaa, 0xd4, 0x06, 0xcb, 0x1d, 0x34, 0xf5, 0x0f, 0x5e, 0x8d, 0xd7, 0xe4, 0xb0, 0x65, 0x29, 0xa1, 0xa0, 0x63, 0x06, 0xc6, 0x3a, 0xb4, 0xf8, 0x85, 0x7c, 0xac, 0x0e, 0x82, 0x0b, 0xb1, 0x2f, 0xd8, 0x25, 0x55, 0xad, 0x5c, 0xd7, 0xc2, 0x1d, 0x25, 0x70, 0x5b, 0x67, 0x4c, 0x35, 0xa0, 0x19, 0xf0, 0x56, 0x52, 0x01, 0x7d, 0x21, 0xd8, 0xfa, 0x2e, 0x76, 0xe2, 0x06, 0xd1, 0x7b, 0x4c, 0x9d, 0xcb, 0x90, 0x45, 0x45, 0x5b, 0x86, 0xb0, 0x63, 0x23, 0x0b, 0xca, 0x51, 0xe4, 0x69, 0x0e, 0xb0, 0x89, 0x71, 0x56, 0x00, 0x67, 0xb1, 0x42, 0x6e, 0xc3, 0xee, 0xdd, 0xec, 0x94, 0xce, 0x7e, 0x87, 0x8b, 0xd4, 0xed, 0xf5, 0x51, 0x91, 0xc7, 0x6e, 0x10, 0x19, 0x24, 0xbe, 0x34, 0xb5, 0x76, 0x97, 0x73, 0xd7, 0xb5, 0x2b, 0x0a, 0x53, 0xb9, 0xfa, 0x4a, 0xcb, 0xe7, 0xe9, 0x54, 0x6b, 0x0f, 0x95, 0x21, 0xd7, 0x95, 0xe6, 0xc5, 0x62, 0xcf, 0xe7, 0xf4, 0x81, 0xaf, 0xd5, 0xc5, 0x7f, 0xa2, 0x76, 0xb6, 0x72, 0xb7, 0xab, 0xf0, 0x6d, 0x04, 0x49, 0xcd, 0xf7, 0x46, 0x25, 0x98, 0xbc, 0xc7, 0x6e, 0x94, 0x83, 0x85, 0x40, 0x3f, 0x60, 0x90, 0x75, 0xd7, 0x2b, 0xb4, 0xbf, 0x1e, 0x30, 0x58, 0xf4, 0x5b, 0x28, 0xa6, 0xa8, 0xa1, 0x69, 0xec, 0x01, 0x53, 0x59, 0x42, 0xc7, 0xe8, 0x28, 0x6e, 0xbb, 0xec, 0xbf, 0x04, 0x2a, 0x47, 0xf3, 0xd2, 0xc1, 0xc2, 0xff, 0x7a, 0xa3, 0xc7, 0x31, 0x61, 0xb9, 0x68, 0xe3, 0xc8, 0x49, 0xa4, 0xad, 0x39, 0xcb, 0xe5, 0xd9, 0x25, 0xf8, 0xcc, 0x17, 0xcb, 0x23, 0x31, 0x72, 0x5b, 0xcc, 0x66, 0x83, 0x5c, 0x73, 0xbc, 0xe5, 0x4b, 0xaa, 0x49, 0xe9, 0x85, 0x6e, 0xe8, 0x8a, 0x67, 0xb7, 0x80, 0xa3, 0xb3, 0x4e, 0x8a, 0x5f, 0x35, 0xdf, 0xcd, 0xf1, 0xa7, 0x4f, 0x6c, 0x86, 0xd3, 0x4f, 0x23, 0x78, 0xf7, 0x32, 0xce, 0xc5, 0x6d, 0xfb, 0x2b, 0xbf, 0x8b, 0xbb, 0xe0, 0x05, 0xc9, 0x1a, 0xc0, 0xb1, 0x21, 0x33, 0x4a, 0xd3, 0xbc, 0xa5, 0x72, 0x1f, 0xca, 0xe6, 0xa5, 0xe2, 0xb2, 0xdb, 0x07, 0x3b, 0x6b, 0xa6, 0xff, 0x87, 0x29, 0xc0, 0xf5, 0x1d, 0x3d, 0x47, 0x5a, 0x3c, 0x36, 0x99, 0xe9, 0x41, 0x4d, 0x21, 0x2d, 0x1d, 0x00, 0x71, 0x44, 0x07, 0xfc, 0x91, 0xe2, 0x6e, 0x40, 0x97, 0x99, 0x32, 0x80, 0x78, 0x57, 0x13, 0xc7, 0x1e, 0x30, 0x6a, 0x61, 0xbb, 0x5d, 0x17, 0xf8, 0x5c, 0x85, 0xba, 0xfd, 0xc1, 0x3c, 0x26, 0x4a, 0x6c, 0xca, 0x12, 0x05, 0xf8, 0x2d, 0x12, 0xc7, 0xac, 0x61, 0xc6, 0xfd, 0x50, 0xde, 0x51, 0x8f, 0x3f, 0x63, 0x0d, 0xc0, 0xbe, 0xf2, 0x7e, 0x56, 0x8c, 0x1b, 0x84, 0xfa, 0xbb, 0x7e, 0xd4, 0xe1, 0xbd, 0x8c, 0xa8, 0xac, 0xc2, 0x8d, 0xb6, 0x8d, 0x42, 0xe7, 0x5f, 0xac, 0xd5, 0x9d, 0x2a, 0xc9, 0x4b, 0x16, 0x70, 0x22, 0xf9, 0x20, 0x59, 0x97, 0x51, 0x34, 0x07, 0x0c, 0xb6, 0xfc, 0x10, 0x0f, 0x8e, 0x12, 0x32, 0xba, 0x98, 0x0b, 0x42, 0xdb, 0x7f, 0xb4, 0x66, 0x53, 0xb0, 0x9b, 0x84, 0xbc, 0x69, 0xd1, 0xfa, 0x4f, 0x13, 0xef, 0x90, 0x04, 0xd2, 0x57, 0xaa, 0xfa, 0x5a, 0xbc, 0xc3, 0x1a, 0x04, 0xe5, 0x16, 0xf8, 0x21, 0xad, 0x9e, 0xf9, 0x8e, 0x4f, 0x41, 0xbb, 0x89, 0xe0, 0x49, 0xb1, 0xc2, 0x1d, 0x13, 0x0e, 0xb5, 0x67, 0x0b, 0xe5, 0x38, 0x0c, 0xd8, 0x8e, 0x50, 0xc8, 0xd3, 0x4b, 0x49, 0x8c, 0xbe, 0x2b, 0x06, 0x7d, 0xb3, 0x2f, 0x95, 0x40, 0x5a, 0xac, 0x06, 0x75, 0x5f, 0xf0, 0x7e, 0x81, 0x23, 0x28, 0x87, 0x91, 0xb2, 0x82, 0xaa, 0xdc, 0xf6, 0x8e, 0x40, 0x28, 0x2a, 0xea, 0x85, 0x8f, 0x90, 0x1e, 0xee, 0x83, 0x67, 0xc5, 0xbd, 0x10, 0x18, 0xee, 0xd2, 0x61, 0xb0, 0xc1, 0xc4, 0x86, 0x92, 0x66, 0x30, 0x74, 0x6e, 0x22, 0x51, 0x4d, 0x6d, 0xc3, 0xd1, 0xe2, 0xae, 0x3f, 0xdf, 0x77, 0xf6, 0x98, 0x82, 0xc6, 0xa3, 0x02, 0x2d, 0x46, 0xe2, 0x48, 0x93, 0xac, 0x22, 0x6c, 0xbc, 0xb2, 0xc9, 0x8e, 0x59, 0x18, 0x25, 0x0e, 0x55, 0xe9, 0xa5, 0xf5, 0xac, 0x00, 0x49, 0x91, 0x80, 0xca, 0x57, 0x60, 0x6a, 0x4e, 0x50, 0x30, 0x0e, 0x6a, 0x22, 0x83, 0xf2, 0x5f, 0x9f, 0x38, 0x90, 0x90, 0x2e, 0x68, 0xa9, 0x86, 0xc0, 0x8f, 0xdd, 0x38, 0x06, 0xec, 0x79, 0x89, 0xe2, 0x2a, 0x90, 0x13, 0x1b, 0x3f, 0x4d, 0x23, 0x54, 0x95, 0x87, 0x04, 0x3f, 0x67, 0x96, 0x81, 0x0e, 0x6f, 0x65, 0xa5, 0x2a, 0xbe, 0xc9, 0xc5, 0x28, 0xeb, 0x11, 0xc1, 0xf9, 0x6f, 0xdf, 0x86, 0x60, 0x50, 0x36, 0xd7, 0xa9, 0xfd, 0xd3, 0x4e, 0x99, 0x79, 0xc1, 0x9d, 0xa1, 0xbc, 0x28, 0x1a, 0x56, 0x57, 0x66, 0x7b, 0x26, 0x56, 0x60, 0xdd, 0x43, 0x6a, 0x1a, 0x0c, 0xe4, 0x48, 0x86, 0xfe, 0xad, 0x4c, 0x9a, 0xa0, 0x6b, 0x62, 0xa5, 0xd6, 0x05, 0x26, 0xe3, 0xbc, 0xb0, 0x4a, 0x4f, 0x33, 0x61, 0x38, 0xb8, 0x99, 0x88, 0xf9, 0x17, 0xd7, 0xfb, 0x56, 0x20, 0xa1, 0x30, 0x3d, 0x17, 0xf9, 0xb0, 0x66, 0xe5, 0xf5, 0xc8, 0x35, 0x6b, 0xc3, 0x82, 0xe3, 0x16, 0xea, 0xd4, 0xd9, 0xb4, 0xd2, 0x16, 0x5c, 0x86, 0x87, 0xb9, 0x6f, 0x96, 0xba, 0x37, 0xf5, 0x4a, 0x09, 0x46, 0x17, 0x3a, 0x80, 0x51, 0xe5, 0x3f, 0x5f, 0x28, 0x40, 0xcc, 0x1d, 0xf7, 0xf7, 0x82, 0xae, 0x75, 0x30, 0xfe, 0x02, 0x5d, 0x0a, 0xf6, 0xce, 0x22, 0x80, 0x84, 0x8e, 0xdf, 0x91, 0xc1, 0xcb, 0x8c, 0x9d, 0x96, 0x99, 0x78, 0x13, 0xcf, 0x65, 0xf3, 0x49, 0x71, 0xed, 0x4b, 0xab, 0x4e, 0x90, 0xfb, 0x18, 0xd6, 0xc8, 0x1e, 0x89, 0x30, 0xf5, 0x2a, 0xf4, 0x8a, 0x5c, 0xda, 0x70, 0xad, 0x6f, 0x6c, 0x99, 0xd4, 0x4f, 0x0d, 0x36, 0xbe, 0x8f, 0x92, 0x19, 0x02, 0x3b, 0x68, 0x47, 0xa3, 0x18, 0xce, 0x59, 0xe4, 0x2e, 0x41, 0x22, 0x5d, 0x84, 0x38, 0x92, 0x4f, 0x2b, 0x12, 0xda, 0x35, 0x7d, 0x4d, 0xd1, 0x9b, 0xa7, 0xf8, 0x97, 0x33, 0x65, 0x6b, 0x78, 0x26, 0x0d, 0x35, 0x13, 0xa8, 0xcf, 0x56, 0xbb, 0xcf, 0x3b, 0xaf, 0x1d, 0xa5, 0x03, 0xb6, 0x23, 0x7c, 0x03, 0x6e, 0x19, 0x81, 0x7e, 0x97, 0x0f, 0x94, 0xab, 0x21, 0x7e, 0x57, 0x70, 0xe7, 0x2e, 0x85, 0x6d, 0x9a, 0x56, 0x86, 0x3c, 0xfb, 0x06, 0x40, 0xf7, 0x4e, 0xc2, 0x2f, 0xfb, 0x0b, 0x6f, 0xb8, 0xec, 0xd6, 0x74, 0xba, 0xfa, 0xb1, 0x19, 0x67, 0x62, 0x71, 0x32, 0x52, 0x37, 0x6e, 0x02, 0xc8, 0x62, 0x7f, 0x5a, 0x64, 0xe8, 0x26, 0x01, 0xde, 0x6b, 0x07, 0x58, 0x24, 0xf4, 0x9f, 0x3e, 0xac, 0xef, 0x32, 0x32, 0x08, 0x77, 0x05, 0xb7, 0xbb, 0xd4, 0xce, 0xfd, 0x4b, 0x42, 0x69, 0xbd, 0x97, 0xf4, 0xcc, 0x65, 0x6b, 0x59, 0x3d, 0x75, 0x52, 0x9e, 0xc3, 0x29, 0xab, 0x74, 0xda, 0x58, 0xff, 0x13, 0x6a, 0x9c, 0x92, 0x7f, 0xfa, 0xb3, 0x38, 0x0a, 0x21, 0x25, 0x6a, 0x1a, 0x3e, 0x27, 0x99, 0x2c, 0x69, 0xc0, 0xc2, 0x19, 0xaa, 0x2a, 0x43, 0x98, 0x68, 0x7b, 0xed, 0x05, 0x24, 0x85, 0x5a, 0x61, 0x67, 0xfa, 0x81, 0x99, 0xf8, 0xd4, 0x87, 0x0b, 0x53, 0xf3, 0xd9, 0x46, 0x57, 0x08, 0x77, 0x11, 0x3f, 0xb3, 0x93, 0xb0, 0xd3, 0xe8, 0x5a, 0x62, 0xdf, 0x97, 0x12, 0x2e, 0xe5, 0x8c, 0x65, 0xdf, 0x0f, 0x94, 0xfc, 0x4e, 0x67, 0xe1, 0x50, 0xdf, 0x4a, 0xaf, 0xbd, 0x4e, 0x1a, 0x28, 0xd9, 0xac, 0x34, 0x85, 0x03, 0xa4, 0x22, 0x77, 0x3f, 0x03, 0x11, 0xc5, 0x41, 0x78, 0x85, 0x36, 0xc7, 0x97, 0x4b, 0xb1, 0x2c, 0x24, 0xb0, 0xa3, 0x3a, 0x8f, 0xf0, 0xa1, 0x41, 0xbb, 0xf1, 0x4f, 0x65, 0x03, 0x31, 0x80, 0x3c, 0x7f, 0xfd, 0x9e, 0x99, 0x83, 0xe5, 0x4d, 0xa2, 0x69, 0x6c, 0x4b, 0x29, 0x91, 0x04, 0x9a, 0x39, 0xa5, 0x39, 0xe2, 0xee, 0x22, 0x2c, 0x11, 0x8a, 0x14, 0x43, 0x44, 0xc6, 0x21, 0x1f, 0xea, 0x66, 0xc8, 0xce, 0x26, 0x10, 0xeb, 0x42, 0x76, 0x5e, 0x8b, 0x02, 0x93, 0x32, 0xd4, 0x20, 0x98, 0x4a, 0x59, 0x6b, 0x65, 0x14, 0xa0, 0xe5, 0x46, 0xc3, 0xe1, 0x78, 0xd0, 0xa2, 0x0b, 0xe4, 0x0c, 0xa8, 0x08, 0xfc, 0xd8, 0x4d, 0x42, 0x12, 0x89, 0x9d, 0x66, 0xb0, 0xd5, 0x8b, 0x68, 0x89, 0xf1, 0x87, 0xc7, 0xae, 0xf6, 0x53, 0x12, 0x05, 0x89, 0x12, 0xab, 0xf8, 0xbb, 0xa2, 0xcb, 0x6a, 0x2e, 0x2b, 0xc6, 0xef, 0x7a, 0xf8, 0x90, 0x3c, 0xce, 0x86, 0x80, 0xdc, 0xdb, 0xdb, 0x55, 0x25, 0xed, 0x19, 0x77, 0x6b, 0x5b, 0x53, 0x7f, 0x73, 0x22, 0x9f, 0xf8, 0x2a, 0xcd, 0x6d, 0x67, 0x97, 0x98, 0x17, 0x8a, 0x0f, 0xd4, 0xb9, 0xde, 0xa8, 0x8d, 0x42, 0x63, 0xf0, 0x6b, 0xcb, 0xa3, 0xde, 0xd6, 0x28, 0xf1, 0x08, 0x5d, 0xbd, 0xef, 0x17, 0x59, 0x93, 0x53, 0x78, 0xcd, 0xac, 0xea, 0x55, 0x91, 0x93, 0xdd, 0xc4, 0xb0, 0x36, 0x33, 0x3e, 0x0e, 0xf8, 0x97, 0x52, 0x4e, 0x03, 0x5b, 0x9a, 0xf2, 0xdb, 0xbe, 0xef, 0xc4, 0x39, 0x6a, 0xd9, 0x75, 0x16, 0x41, 0x49, 0x85, 0x06, 0x59, 0x8b, 0x62, 0xc7, 0x45, 0x76, 0xd4, 0x1a, 0x97, 0xe6, 0x98, 0xd1, 0xa2, 0x6c, 0x4c, 0x2a, 0x85, 0x43, 0x8b, 0x5b, 0x65, 0x86, 0x58, 0x6e, 0xf9, 0xa1, 0xc0, 0x4f, 0x4c, 0x06, 0xbb, 0x24, 0xbe, 0x21, 0x54, 0xdc, 0x4c, 0x8d, 0x09, 0x0b, 0x12, 0x88, 0x75, 0xf5, 0x0e, 0xa4, 0x2c, 0xe8, 0x27, 0xc0, 0xe7, 0xd0, 0x6e, 0x37, 0xe1, 0x05, 0xa3, 0x57, 0x80, 0x67, 0xfb, 0x15, 0x38, 0xad, 0x20, 0xfe, 0xad, 0xfa, 0x7a, 0x71, 0x17, 0xb1, 0xad, 0x0c, 0xeb, 0x8b, 0x63, 0x64, 0xb8, 0xe7, 0x4b, 0xf9, 0x4e, 0x61, 0x62, 0x69, 0x26, 0xa5, 0x71, 0xe3, 0xfe, 0x86, 0xd6, 0xdf, 0xc4, 0x4a, 0x88, 0x0c, 0xb5, 0x48, 0x56, 0x8a, 0xc6, 0xb6, 0x6f, 0x5a, 0x43, 0xbc, 0x27, 0x13, 0xb6, 0xcc, 0xf8, 0xd6, 0x0a, 0x36, 0xc7, 0x83, 0xf0, 0xf7, 0x69, 0x2d, 0x82, 0xd2, 0x66, 0xcc, 0x26, 0xa3, 0xfd, 0x32, 0xb6, 0xef, 0x68, 0x41, 0xde, 0xbf, 0x61, 0x5a, 0xc5, 0xaf, 0xe4, 0x18, 0xef, 0x42, 0x37, 0x3f, 0x62, 0x78, 0x28, 0xef, 0x07, 0xa3, 0x96, 0x1e, 0x54, 0x76, 0x32, 0x45, 0x28, 0x5f, 0x87, 0x58, 0xf6, 0x17, 0x38, 0xfc, 0x26, 0x77, 0x89, 0xf5, 0xb8, 0x8d, 0x21, 0xdd, 0x2b, 0xef, 0x0f, 0x1c, 0x9d, 0x4f, 0x0a, 0x14, 0x33, 0x50, 0xfd, 0x9c, 0xbb, 0x98, 0xc3, 0xb0, 0x90, 0x26, 0x2e, 0x66, 0xbe, 0xe6, 0x4f, 0x24, 0x67, 0x83, 0xf1, 0x11, 0x66, 0x7d, 0x67, 0xc9, 0x31, 0x7b, 0x88, 0x55, 0x04, 0xe2, 0xf7, 0x5a, 0x3c, 0xa6, 0xa8, 0x90, 0x01, 0x61, 0x9f, 0x76, 0x27, 0xa2, 0xfb, 0x45, 0x56, 0x87, 0x34, 0x22, 0x69, 0x8e, 0xa1, 0x97, 0x15, 0xa8, 0x3d, 0x44, 0xcb, 0x8f, 0xaa, 0xd2, 0xdf, 0x5a, 0x76, 0x29, 0xe9, 0x4f, 0x9e, 0xe3, 0x6c, 0xf8, 0x50, 0x00, 0xb5, 0x79, 0xf5, 0xdb, 0x06, 0x20, 0x6f, 0x5c, 0xf4, 0x3e, 0x9f, 0x70, 0x0e, 0x35, 0x2b, 0xb6, 0xbf, 0xd3, 0x7e, 0x7c, 0x76, 0xde, 0x10, 0xe9, 0x03, 0xf0, 0xe7, 0x7b, 0x45, 0x85, 0x5e, 0xb5, 0x02, 0x53, 0x25, 0x11, 0x16, 0xda, 0x89, 0x3c, 0xd0, 0x3b, 0xf5, 0x82, 0x99, 0x4d, 0xb9, 0x87, 0xd6, 0xee, 0x0b, 0x39, 0x10, 0x97, 0x4b, 0x02, 0x52, 0x34, 0x8c, 0x42, 0xd3, 0x32, 0x4f, 0xfc, 0xd5, 0xd9, 0x91, 0xd0, 0xcd, 0xdc, 0x09, 0x29, 0xc4, 0x2e, 0xab, 0xb7, 0xfd, 0x18, 0x70, 0x20, 0xd8, 0x89, 0x59, 0xf2, 0xf6, 0xad, 0xb2, 0xdd, 0x9e, 0xc0, 0x94, 0x1f, 0x60, 0x25, 0xad, 0x3f, 0xf8, 0xb2, 0x43, 0xfe, 0x75, 0x4f, 0x77, 0x8b, 0x9a, 0xbf, 0xc7, 0xf6, 0x84, 0xbd, 0xd7, 0xe7, 0x8d, 0x4b, 0x71, 0x90, 0x71, 0x47, 0xca, 0xe0, 0xaf, 0x3f, 0x07, 0xf9, 0x32, 0x86, 0xff, 0xe5, 0x31, 0x87, 0x43, 0x84, 0x54, 0x5a, 0x5c, 0xc9, 0x18, 0x95, 0x53, 0x26, 0x74, 0x65, 0x77, 0x45, 0xbd, 0xdd, 0x5a, 0xf9, 0xc7, 0x8d, 0x1d, 0x74, 0x4d, 0x57, 0xed, 0xba, 0x92, 0x7e, 0xce, 0x56, 0x49, 0x00, 0x97, 0x4b, 0xb2, 0x26, 0x3e, 0x4d, 0x07, 0x59, 0x56, 0x31, 0x16, 0x37, 0xd6, 0xa3, 0x2f, 0xe6, 0x1c, 0x17, 0x40, 0xa8, 0x32, 0x02, 0x3f, 0xb0, 0x4f, 0x49, 0xc8, 0x35, 0xa1, 0xf9, 0x08, 0xc4, 0x49, 0x3a, 0xd9, 0xda, 0xa8, 0x7e, 0x2e, 0xb2, 0xd9, 0xfe, 0xb2, 0x5c, 0x7e, 0x67, 0xac, 0x0f, 0xc0, 0xd0, 0x26, 0xc0, 0x91, 0xf0, 0x4e, 0xf3, 0x34, 0x8e, 0x1c, 0xd2, 0x00, 0x38, 0x35, 0x7c, 0x61, 0x38, 0x10, 0x9f, 0x1f, 0xc4, 0x57, 0x49, 0xe3, 0x75, 0x90, 0xfb, 0xf7, 0xfb, 0xfc, 0x00, 0x4d, 0x0e, 0xbf, 0xfc, 0xc3, 0xa7, 0x42, 0xc8, 0xa5, 0x71, 0xd6, 0x7d, 0x73, 0x7a, 0x9a, 0xcf, 0xe5, 0x2f, 0x9e, 0x9d, 0x2d, 0x87, 0x48, 0xc5, 0x7c, 0x7e, 0xf7, 0x3d, 0xc7, 0xc5, 0xe7, 0x60, 0xcb, 0xb8, 0x55, 0x85, 0x4f, 0x90, 0xe3, 0xd6, 0xa9, 0xda, 0x3d, 0x60, 0x83, 0x28, 0xfd, 0x66, 0xdf, 0x06, 0xcc, 0xfb, 0x59, 0x2f, 0xca, 0xd0, 0xac, 0x01, 0x31, 0x4a, 0x78, 0x2f, 0x35, 0xd7, 0x43, 0xb6, 0x2e, 0x83, 0xbd, 0x12, 0xf8, 0xc6, 0x48, 0xb1, 0x9a, 0xa0, 0xb7, 0xa8, 0x27, 0xe8, 0x56, 0xa5, 0xe2, 0xe2, 0x2b, 0x24, 0xa5, 0x0f, 0x7c, 0xe6, 0x84, 0x49, 0x92, 0x9f, 0xad, 0x0f, 0xbc, 0xf0, 0x92, 0x1d, 0x96, 0x94, 0x4b, 0x3f, 0x8a, 0xde, 0x35, 0x68, 0x98, 0x63, 0xe0, 0xfe, 0x53, 0xf4, 0x28, 0x79, 0x2c, 0xcf, 0xa1, 0x2c, 0xf3, 0x15, 0x39, 0x62, 0x9b, 0x7f, 0x18, 0xad, 0x3e, 0x4d, 0xcb, 0x7b, 0x60, 0x80, 0xa2, 0xea, 0x78, 0x49, 0x56, 0xde, 0xad, 0xc1, 0xef, 0x50, 0xdd, 0xda, 0xe5, 0xe9, 0xe3, 0x96, 0x86, 0xcf, 0x1a, 0x77, 0x97, 0xbf, 0x1d, 0x36, 0x3e, 0x5c, 0xd1, 0xb8, 0x20, 0xc6, 0xa6, 0x3d, 0xc6, 0x6f, 0x19, 0xdb, 0x45, 0x2a, 0x7e, 0x2b, 0x1e, 0x85, 0xfc, 0x42, 0x63, 0x59, 0xd9, 0xe2, 0x1b, 0x9f, 0xf7, 0xf2, 0xe8, 0x85, 0x9f, 0x2c, 0xe7, 0xc2, 0x7e, 0x16, 0xd8, 0x26, 0xed, 0x33, 0x7f, 0x75, 0x76, 0x7a, 0x49, 0x75, 0x93, 0x07, 0x33, 0x46, 0xb8, 0x11, 0xe8, 0xf2, 0x94, 0x1c, 0x29, 0x45, 0x95, 0x6f, 0x72, 0xdf, 0xaa, 0xc9, 0xdb, 0x87, 0x4c, 0x50, 0x3c, 0xc2, 0xbf, 0xca, 0x94, 0xa4, 0x95, 0x0f, 0xac, 0xe7, 0x75, 0xbe, 0xf7, 0x3a, 0x1a, 0x30, 0xbd, 0xdb, 0x9e, 0xaa, 0x78, 0x68, 0xf9, 0xd7, 0x7f, 0xf3, 0xc5, 0x75, 0xe1, 0x54, 0x44, 0x4e, 0x94, 0xc3, 0xa3, 0x6a, 0xcf, 0xa6, 0x80, 0x83, 0xb4, 0xa7, 0xab, 0xb9, 0x32, 0x0a, 0x29, 0x87, 0x2a, 0x3d, 0x7f, 0xf6, 0xd0, 0xb1, 0x2d, 0x10, 0x55, 0xe9, 0x78, 0x98, 0xc3, 0xd1, 0x6c, 0xf8, 0x28, 0x50, 0x22, 0x7b, 0xf6, 0x20, 0x3f, 0xbc, 0xaa, 0xde, 0xbd, 0x5f, 0xac, 0x5d, 0xee, 0xfe, 0x76, 0x40, 0xbd, 0x66, 0xf9, 0xc8, 0x38, 0x04, 0x3c, 0xea, 0x4b, 0x9a, 0x47, 0xa5, 0xce, 0x36, 0x3f, 0x92, 0xc3, 0x65, 0xd2, 0xbd, 0xd8, 0xa4, 0xd6, 0xb3, 0x34, 0x17, 0x2c, 0xdc, 0x6f, 0x7e, 0xeb, 0x0b, 0xe2, 0x64, 0xba, 0x54, 0x22, 0x99, 0x7e, 0x1e, 0xc7, 0xe3, 0x36, 0x78, 0x72, 0xf1, 0x22, 0xb1, 0x0e, 0x90, 0x2b, 0x22, 0x55, 0x22, 0x7f, 0x4f, 0x96, 0x4b, 0x7c, 0x2f, 0xb6, 0xed, 0xcf, 0xc7, 0x76, 0x57, 0xdd, 0xfe, 0xf3, 0xb9, 0x62, 0xac, 0x73, 0xdb, 0x57, 0xf4, 0x5e, 0x0f, 0x1a, 0xd4, 0x8b, 0x65, 0xc9, 0xfa, 0xbd, 0x1d, 0xee, 0xd9, 0x6e, 0x62, 0x62, 0xfd, 0xcb, 0x35, 0x6b, 0x9b, 0xff, 0xa7, 0x28, 0x6d, 0xb4, 0x4b, 0x2f, 0xbc, 0xd7, 0xeb, 0x74, 0xbf, 0x9c, 0x7a, 0x6d, 0x23, 0xc3, 0x4a, 0x73, 0xeb, 0x19, 0x7f, 0x6c, 0x7a, 0x41, 0xc4, 0xa7, 0xee, 0xb4, 0x3c, 0x07, 0xb0, 0x07, 0xbb, 0x64, 0x49, 0x6d, 0x37, 0x2e, 0x78, 0x7c, 0x79, 0x53, 0x81, 0x34, 0x18, 0x63, 0xc7, 0x3d, 0xa8, 0xf3, 0x9d, 0x70, 0x2f, 0x3f, 0x5a, 0x99, 0xd8, 0x13, 0xab, 0x7b, 0xec, 0xeb, 0x2e, 0x15, 0xfd, 0x59, 0x3c, 0x24, 0x65, 0xa7, 0x06, 0xe9, 0xef, 0xbd, 0xe3, 0x2c, 0xd3, 0x46, 0xe8, 0x81, 0xe8, 0x0f, 0xba, 0xca, 0x15, 0xaf, 0xa0, 0xfd, 0x08, 0x6d, 0xdc, 0x28, 0x2b, 0x5e, 0x3c, 0xb2, 0xd4, 0xce, 0xec, 0xe3, 0xbd, 0xe1, 0x8e, 0xa6, 0xb3, 0x7a, 0x8c, 0x8e, 0x92, 0x5c, 0xad, 0x18, 0x70, 0x90, 0xe7, 0x30, 0x19, 0x06, 0x75, 0xf6, 0xbc, 0x7f, 0x29, 0xc1, 0xe3, 0xa9, 0x02, 0x64, 0xa8, 0x8c, 0x01, 0xb1, 0x26, 0x26, 0x39, 0x3c, 0x2f, 0x52, 0x26, 0x62, 0x3d, 0xef, 0x3f, 0x89, 0xaa, 0x3d, 0xce, 0xa8, 0x23, 0x8a, 0x00, 0x0b, 0x5a, 0x0f, 0x38, 0x50, 0xfb, 0x15, 0xa9, 0xb6, 0xe2, 0x5c, 0x24, 0x97, 0x8b, 0xbc, 0x2e, 0x32, 0xc9, 0x0d, 0x56, 0xae, 0xbb, 0x45, 0xc6, 0x5c, 0xfc, 0xe0, 0x17, 0x3d, 0x1b, 0x85, 0x6a, 0xc4, 0x4b, 0xe6, 0xb4, 0xdc, 0x5b, 0xe8, 0x59, 0x2d, 0xe8, 0x04, 0xfd, 0x9b, 0xd1, 0xec, 0x96, 0x10, 0xeb, 0x72, 0xc6, 0x7c, 0xf6, 0xa6, 0x69, 0x1a, 0xd0, 0x3f, 0x6a, 0xf4, 0xe9, 0x3d, 0xda, 0xa9, 0xf7, 0xcc, 0x43, 0x6e, 0xeb, 0x6a, 0x39, 0x53, 0x23, 0x4c, 0x33, 0xc8, 0xe1, 0xfe, 0x99, 0x5f, 0xfc, 0x4b, 0x1e, 0xd3, 0xd5, 0x5c, 0x50, 0x4a, 0x8d, 0x24, 0x6d, 0xd7, 0x75, 0xfb, 0x79, 0x43, 0xc6, 0x88, 0x8d, 0x0d, 0x93, 0xe5, 0x72, 0xaf, 0xfb, 0xfe, 0x6f, 0x23, 0xa3, 0x3a, 0x5e, 0xa6, 0x64, 0x5e, 0x05, 0xbc, 0x40, 0xae, 0xa4, 0x74, 0x9b, 0x55, 0xcb, 0xed, 0xa7, 0x06, 0x6e, 0x19, 0x21, 0xe4, 0x3b, 0xc1, 0x3b, 0x9f, 0x2b, 0xc9, 0xd9, 0xe0, 0x58, 0xb6, 0xff, 0xe8, 0x0e, 0x6d, 0x8a, 0x74, 0x24, 0x3d, 0x1f, 0xe3, 0x8d, 0x20, 0x62, 0x9a, 0x2a, 0x3e, 0x68, 0xa8, 0xe2, 0xb3, 0x6e, 0xa6, 0xf5, 0x92, 0xcb, 0xe1, 0x8d, 0x2a, 0x23, 0xbc, 0x97, 0x88, 0xde, 0x4f, 0xd0, 0x3d, 0xd8, 0x54, 0x23, 0x61, 0x5a, 0x44, 0x32, 0xd7, 0x4a, 0xbd, 0x33, 0xd3, 0x9e, 0x27, 0xfd, 0x9a, 0x16, 0x97, 0x62, 0x89, 0x2b, 0xf3, 0xc0, 0x59, 0x43, 0x58, 0xd3, 0xa1, 0x26, 0xb8, 0xcd, 0x9c, 0xb5, 0xc8, 0xa9, 0x2d, 0xda, 0x19, 0xbc, 0x20, 0xbb, 0x84, 0x8d, 0xb3, 0x33, 0xcc, 0xe6, 0x55, 0x82, 0x7f, 0x2b, 0xad, 0x43, 0x1d, 0xeb, 0xde, 0x9f, 0x7c, 0xb5, 0x0a, 0xc1, 0x6b, 0x2d, 0x15, 0x89, 0x96, 0x5e, 0xab, 0x85, 0xaa, 0x52, 0x84, 0x1d, 0xb9, 0xe0, 0xe6, 0x0d, 0xdf, 0xc6, 0x6c, 0x19, 0x26, 0xf8, 0x07, 0xfb, 0xa7, 0x37, 0x42, 0xa1, 0xf2, 0xe4, 0xca, 0x95, 0xb0, 0x17, 0x2d, 0xbd, 0x87, 0xec, 0xe2, 0x44, 0x3e, 0x1d, 0x8a, 0xd8, 0x22, 0xd6, 0x75, 0x16, 0xa8, 0xc4, 0x68, 0x42, 0x53, 0x70, 0x9d, 0x3c, 0xd8, 0xcb, 0x0c, 0xaf, 0x81, 0x09, 0xe9, 0x8c, 0xcf, 0xb3, 0x6e, 0xb7, 0x63, 0xf8, 0xda, 0x00, 0x1e, 0x45, 0xba, 0x54, 0x88, 0x15, 0x67, 0x34, 0x6e, 0x09, 0xd0, 0x67, 0xd0, 0x3b, 0x79, 0xec, 0xfa, 0xd0, 0xc4, 0x33, 0xf0, 0xcc, 0x70, 0x8d, 0x0f, 0x2a, 0x5f, 0xe0, 0xf2, 0x2d, 0x9c, 0x9f, 0x93, 0xf1, 0x9c, 0xf9, 0xb2, 0x45, 0xc4, 0x51, 0x7b, 0xbd, 0x2c, 0xef, 0x63, 0x02, 0xa3, 0xf5, 0x53, 0x6d, 0xf3, 0x94, 0x08, 0xd4, 0x66, 0x7f, 0xba, 0xa4, 0x88, 0xa0, 0xfb, 0x30, 0x2f, 0x0b, 0xe3, 0x49, 0xb9, 0x30, 0x6a, 0x0f, 0x95, 0x54, 0x15, 0x06, 0x05, 0x42, 0xd5, 0x6d, 0x21, 0x3d, 0x2c, 0xcb, 0x20, 0x3a, 0x91, 0xca, 0xd3, 0x4c, 0x16, 0x48, 0x72, 0x60, 0x48, 0xac, 0x9b, 0x2a, 0x56, 0x76, 0x98, 0x5f, 0x76, 0x1b, 0xe1, 0x25, 0x85, 0x0f, 0xe1, 0xc8, 0xed, 0x23, 0xfd, 0xae, 0xcc, 0x11, 0xd3, 0x8d, 0x53, 0x55, 0xbf, 0xdb, 0x6c, 0x3f, 0xa4, 0x86, 0x9f, 0x47, 0xe9, 0xe6, 0x36, 0xa0, 0xc1, 0xf0, 0x9f, 0x10, 0xb0, 0xac, 0x13, 0xfe, 0x4b, 0xe9, 0x75, 0xcd, 0x3f, 0x2f, 0x7d, 0x68, 0x94, 0xf5, 0x15, 0x1e, 0x33, 0x14, 0x03, 0xb1, 0xa6, 0x7c, 0xc9, 0xa9, 0x20, 0x25, 0xc9, 0xee, 0xbd, 0x49, 0xad, 0x96, 0x0a, 0xd1, 0x06, 0xfc, 0xc8, 0x0d, 0x33, 0x12, 0xed, 0xa7, 0x85, 0xf8, 0xec, 0xda, 0xa1, 0xcd, 0x36, 0xdf, 0x25, 0xc5, 0x01, 0xa8, 0x8e, 0x7b, 0x48, 0xd1, 0x59, 0x89, 0x13, 0xd4, 0x68, 0x57, 0xf8, 0x7c, 0xa8, 0x30, 0xe2, 0x9c, 0xf1, 0x9b, 0x11, 0x00, 0x2d, 0xe8, 0x62, 0xa4, 0xbd, 0x09, 0xd1, 0x24, 0x18, 0xa3, 0x3c, 0x74, 0xb5, 0x65, 0x6a, 0xd1, 0x2c, 0x99, 0x4b, 0xf7, 0x98, 0xf8, 0x81, 0x95, 0x3f, 0xc3, 0x20, 0xfe, 0x75, 0x0f, 0xb2, 0x21, 0xbd, 0x61, 0x7f, 0xbb, 0x32, 0x7a, 0x0b, 0xcb, 0x25, 0x74, 0xdf, 0x47, 0x08, 0x0e, 0x8c, 0x0d, 0x8a, 0x45, 0xee, 0x1c, 0x04, 0x24, 0xae, 0x04, 0x14, 0xdc, 0x0a, 0x9b, 0x87, 0x17, 0xd9, 0xf2, 0x7d, 0x8a, 0xc9, 0x87, 0xc7, 0xc9, 0xec, 0xbc, 0x94, 0x60, 0x73, 0x88, 0x4d, 0x1f, 0xb9, 0x6d, 0xbd, 0xb5, 0x83, 0xaa, 0x75, 0x81, 0x86, 0xb1, 0x6f, 0xa4, 0x29, 0xdb, 0xf1, 0x5b, 0x8d, 0x5b, 0xb4, 0x8c, 0xca, 0x71, 0x46, 0x9e, 0x7c, 0xe0, 0xad, 0x8e, 0x7f, 0xa1, 0x4d, 0x3f, 0xf6, 0xd9, 0x0c, 0x12, 0x92, 0x09, 0xb3, 0xb7, 0x11, 0x84, 0x97, 0x43, 0x04, 0x27, 0x7a, 0x82, 0xd6, 0x44, 0xac, 0x8e, 0x0a, 0xdf, 0x75, 0xa0, 0xc4, 0x1d, 0xb8, 0x27, 0x8b, 0xf9, 0xd0, 0x17, 0x4d, 0x39, 0xbe, 0x84, 0xa3, 0xa0, 0x86, 0x6f, 0x57, 0x66, 0xd6, 0xe0, 0x24, 0xe5, 0xe9, 0x35, 0xbc, 0x95, 0xab, 0xb9, 0x10, 0x3a, 0x1e, 0x78, 0xcb, 0x5c, 0xfc, 0x52, 0x1f, 0xf8, 0x9e, 0x4f, 0xc5, 0x75, 0x1c, 0x32, 0x3f, 0xd9, 0xb6, 0x51, 0x61, 0x3d, 0x72, 0xa3, 0x0f, 0x7f, 0x07, 0x1b, 0x48, 0x36, 0xfa, 0x34, 0x64, 0xeb, 0x07, 0xce, 0x99, 0x86, 0xc2, 0x38, 0xc4, 0x06, 0x7e, 0x8e, 0x66, 0x75, 0x6e, 0x45, 0xed, 0x1b, 0x0a, 0x04, 0x36, 0xf3, 0xb4, 0xb5, 0x4f, 0x5b, 0x9c, 0xdd, 0x81, 0x0f, 0xe1, 0x28, 0x8e, 0x58, 0xf9, 0x49, 0x37, 0x81, 0x52, 0x00, 0x01, 0x8b, 0x39, 0x7c, 0x39, 0x22, 0xfc, 0xe4, 0x36, 0xcf, 0x4b, 0x31, 0xde, 0x6e, 0xe4, 0x3e, 0x6c, 0xe3, 0x70, 0x22, 0x70, 0x09, 0xa7, 0xbd, 0x16, 0xeb, 0xbb, 0x91, 0xac, 0x37, 0xf4, 0xd3, 0x5f, 0xef, 0x97, 0xc2, 0x45, 0x62, 0x0d, 0x38, 0xa1, 0x5b, 0x41, 0x7f, 0x62, 0x98, 0x4a, 0x65, 0xec, 0x7d, 0x4a, 0x93, 0x1b, 0x0a, 0x96, 0x1a, 0x85, 0x0b, 0x17, 0x4f, 0x00, 0x8e, 0xf0, 0xd9, 0x65, 0x9a, 0x60, 0x08, 0x93, 0x1e, 0xea, 0x69, 0xb6, 0x28, 0xb4, 0x97, 0xc9, 0x57, 0x2e, 0x53, 0x59, 0x93, 0xf3, 0xd7, 0x8c, 0xfb, 0xf4, 0x68, 0x63, 0x1f, 0xd3, 0x2b, 0x3c, 0x70, 0x8d, 0x39, 0x9b, 0xf5, 0x5c, 0xf5, 0x29, 0x3f, 0xdc, 0x9e, 0xfd, 0x9e, 0x6c, 0x20, 0x1b, 0x95, 0xd7, 0x30, 0x3a, 0x8c, 0x34, 0x97, 0xcb, 0xc5, 0x0a, 0xce, 0x36, 0x91, 0xb8, 0xcc, 0x67, 0xc4, 0x14, 0x1c, 0x89, 0x66, 0x53, 0x32, 0x11, 0xab, 0x29, 0xff, 0xff, 0x25, 0x30, 0xc3, 0x60, 0x39, 0x8e, 0x23, 0x18, 0xd0, 0xd3, 0x7b, 0xde, 0x4e, 0x20, 0x75, 0x88, 0xc8, 0x8e, 0xdb, 0x89, 0x72, 0xcd, 0xa9, 0xb8, 0x56, 0x0c, 0x67, 0x53, 0x4c, 0x19, 0xb5, 0x43, 0x26, 0xca, 0x28, 0xa1, 0x2b, 0x9b, 0x54, 0x7a, 0xc7, 0x98, 0x2a, 0xcf, 0x80, 0x7e, 0x85, 0xe0, 0x2c, 0x1d, 0xff, 0xab, 0x61, 0x00, 0x09, 0xaf, 0x2e, 0x50, 0x3b, 0xf5, 0x08, 0xf6, 0xe8, 0x51, 0x07, 0x00, 0xf6, 0xe6, 0x53, 0x46, 0xec, 0xe8, 0xd9, 0x4d, 0x4d, 0xa6, 0x42, 0x6b, 0x25, 0xc7, 0x25, 0x2c, 0xe1, 0xd3, 0x7b, 0xf5, 0x63, 0xf6, 0x54, 0xe7, 0x56, 0x01, 0xc9, 0x06, 0xbf, 0xb2, 0x32, 0x9b, 0xd5, 0x35, 0x99, 0xd7, 0x13, 0xea, 0x6e, 0xb8, 0x8b, 0x69, 0x7b, 0x31, 0x7d, 0xc4, 0x1b, 0x85, 0x28, 0x0c, 0xa7, 0xf4, 0xe0, 0x16, 0x32, 0x99, 0x61, 0x7e, 0x76, 0x93, 0x63, 0xed, 0x0d, 0x63, 0x6f, 0x98, 0xe5, 0x95, 0xf0, 0x09, 0xee, 0xa3, 0x8d, 0x22, 0x15, 0x16, 0xb6, 0x5f, 0x76, 0xee, 0x7d, 0x5b, 0xcd, 0x44, 0xa8, 0x96, 0x2e, 0x2e, 0x04, 0x75, 0xf7, 0xe3, 0xfc, 0x8a, 0x02, 0x1f, 0x69, 0x16, 0x1f, 0xc9, 0xac, 0xcc, 0xc1, 0xd4, 0xfb, 0xd8, 0xf7, 0x63, 0xf8, 0x20, 0x9e, 0x30, 0x88, 0xca, 0xd6, 0x2e, 0xe2, 0xfe, 0xb2, 0x6d, 0xe6, 0xed, 0x34, 0x3e, 0xb1, 0x12, 0x78, 0x99, 0x6e, 0xb7, 0x2f, 0xbb, 0x6e, 0xbc, 0x4f, 0x13, 0x7c, 0x94, 0x09, 0x5f, 0x6a, 0x90, 0xfc, 0x13, 0xf0, 0x60, 0xa8, 0xfa, 0xb7, 0xd7, 0x25, 0x1f, 0xb0, 0xee, 0x14, 0xee, 0xaa, 0x0c, 0xd7, 0x97, 0x24, 0x84, 0xfd, 0xb3, 0x5f, 0x5f, 0x00, 0x2a, 0xb8, 0x5d, 0x33, 0x54, 0x35, 0x36, 0xf6, 0x5e, 0x5e, 0x25, 0x2c, 0xf0, 0x4e, 0xa7, 0xef, 0x0c, 0x09, 0x81, 0x82, 0x3a, 0x10, 0x00, 0x86, 0xe2, 0x33, 0x84, 0x71, 0xf9, 0xa7, 0x40, 0x3d, 0xdf, 0x58, 0x3b, 0x5d, 0x88, 0x80, 0x9a, 0xf5, 0xdb, 0x79, 0x22, 0x4a, 0x57, 0xd0, 0xf9, 0x78, 0xfc, 0x9a, 0xac, 0x63, 0x69, 0x0b, 0x76, 0xef, 0x42, 0x44, 0xc0, 0x74, 0xd4, 0x6d, 0xe4, 0x6c, 0xfc, 0x04, 0x36, 0x6f, 0x44, 0x74, 0x45, 0x62, 0x50, 0xea, 0x5e, 0xeb, 0x79, 0x64, 0x52, 0x27, 0xb7, 0x0b, 0x79, 0xa0, 0xc4, 0xc2, 0xf7, 0x79, 0x7e, 0xff, 0x3e, 0xec, 0x8e, 0xd9, 0xd5, 0xf7, 0x47, 0x63, 0x57, 0x51, 0xd0, 0x39, 0xbe, 0xa3, 0x86, 0x58, 0xe1, 0xf5, 0x9c, 0x33, 0x3c, 0x66, 0x04, 0x03, 0xf0, 0x21, 0x93, 0x5e, 0x0a, 0x8c, 0x60, 0x0b, 0x08, 0xc3, 0x6d, 0x15, 0x9a, 0x44, 0x89, 0x1e, 0xa5, 0xec, 0x74, 0xf6, 0x8d, 0x22, 0x45, 0x6c, 0xb4, 0x52, 0x09, 0x64, 0x3e, 0x9d, 0xad, 0x2a, 0x18, 0xce, 0x1e, 0x06, 0x38, 0x90, 0xae, 0x11, 0x26, 0xdf, 0xba, 0x46, 0xbb, 0xbd, 0x89, 0xdc, 0x28, 0x26, 0x78, 0xd4, 0x3b, 0x45, 0x54, 0xce, 0xde, 0xe8, 0x08, 0x20, 0xe1, 0x32, 0x78, 0x29, 0xf9, 0x8f, 0xac, 0xe3, 0x08, 0xed, 0x31, 0xb8, 0x9e, 0x2a, 0xbc, 0x97, 0xc0, 0xc8, 0x11, 0x46, 0xe9, 0xe8, 0x23, 0xfa, 0x4f, 0x76, 0x7d, 0x25, 0x67, 0xa1, 0xe0, 0x8f, 0xab, 0x8e, 0x2e, 0xa8, 0x9b, 0x4d, 0x86, 0x1d, 0x02, 0x0c, 0xb1, 0xa9, 0x7a, 0x8a, 0xbd, 0x2e, 0x32, 0xcf, 0xe7, 0x04, 0xef, 0x1b, 0xbf, 0x90, 0x51, 0x1c, 0x86, 0x19, 0x58, 0x63, 0xdb, 0xd8, 0x26, 0x19, 0x97, 0x4e, 0x07, 0xee, 0xf5, 0xdb, 0xae, 0x53, 0xf6, 0x8b, 0xc2, 0xe9, 0x03, 0x33, 0x99, 0x39, 0xd4, 0xbd, 0x43, 0xa5, 0x92, 0xc0, 0xca, 0x9e, 0x38, 0x54, 0xb8, 0x18, 0x3f, 0x24, 0xda, 0x3b, 0x7a, 0xc4, 0x44, 0x5c, 0x3f, 0x45, 0x95, 0x2b, 0xc7, 0x07, 0x7c, 0x2e, 0xd7, 0xcf, 0x7b, 0x6e, 0xa0, 0x19, 0xeb, 0x70, 0xe5, 0xb0, 0x41, 0x66, 0x5b, 0x7b, 0x8f, 0xa7, 0x55, 0x9a, 0x4e, 0x5d, 0xa0, 0xb2, 0x5a, 0x7d, 0xac, 0x84, 0x3e, 0xfd, 0xed, 0xc5, 0xb2, 0x41, 0x81, 0x29, 0x62, 0xd6, 0x13, 0xc2, 0xf1, 0x62, 0xff, 0x88, 0x3e, 0xdb, 0xb7, 0x39, 0xe6, 0xf8, 0x65, 0x63, 0x0a, 0xe5, 0xd2, 0xbe, 0x52, 0x3b, 0x86, 0xc0, 0x31, 0x2f, 0x31, 0x6c, 0x6b, 0x0a, 0x49, 0x6b, 0xd5, 0xd9, 0xf5, 0x5d, 0x5c, 0x65, 0x2a, 0x71, 0x49, 0x65, 0x13, 0x33, 0xc4, 0xf3, 0xb7, 0xa6, 0x96, 0x3d, 0xd6, 0x93, 0x33, 0x7d, 0x13, 0x20, 0xf7, 0x2b, 0x59, 0xa4, 0xb0, 0x70, 0x77, 0xba, 0x5d, 0xdf, 0x0d, 0x95, 0x35, 0x60, 0xac, 0x93, 0xeb, 0x6c, 0x39, 0x14, 0x31, 0x80, 0x92, 0x8c, 0x7b, 0xcb, 0x74, 0xd7, 0x05, 0x2a, 0x9d, 0xcd, 0x17, 0x57, 0x2d, 0x17, 0x88, 0x5e, 0x52, 0x41, 0x81, 0x50, 0x24, 0x0f, 0x83, 0x3a, 0xce, 0x15, 0xab, 0x58, 0xef, 0x82, 0x35, 0x87, 0x40, 0x3d, 0x40, 0xf9, 0x76, 0x33, 0xd0, 0x2c, 0x6a, 0xef, 0x19, 0x1d, 0x77, 0x6b, 0xfb, 0xb9, 0x23, 0x25, 0xc9, 0x94, 0x02, 0x76, 0x4e, 0xdd, 0xd8, 0x1f, 0x12, 0x92, 0xfe, 0x25, 0xd9, 0xf0, 0x07, 0xe0, 0x6d, 0x2e, 0xa2, 0x4e, 0x9d, 0x6a, 0xc2, 0xad, 0x86, 0xe4, 0xfd, 0x48, 0x11, 0x6a, 0x32, 0x91, 0xbd, 0x13, 0x6f, 0x70, 0x9f, 0x30, 0x12, 0xdb, 0xa7, 0x80, 0x2e, 0xa7, 0x24, 0xa3, 0x30, 0x9d, 0x8a, 0xd1, 0xc2, 0xd1, 0x73, 0xcc, 0xef, 0x2f, 0xe5, 0x13, 0x88, 0x57, 0xd3, 0x59, 0xc7, 0xab, 0xe6, 0x35, 0x33, 0xa5, 0x7d, 0x1b, 0xc3, 0x6f, 0xf2, 0x8b, 0x46, 0xad, 0x1f, 0x88, 0x02, 0x9d, 0x20, 0x4c, 0x9c, 0x63, 0x5b, 0x3a, 0x38, 0x9e, 0xbe, 0x14, 0xe0, 0x3f, 0x48, 0x6e, 0x2a, 0x9b, 0xcb, 0x63, 0x15, 0xbf, 0xf0, 0x86, 0x35, 0x03, 0x7b, 0x1b, 0x10, 0xe2, 0xd0, 0x88, 0xc7, 0x08, 0xb6, 0x06, 0xf9, 0xad, 0x5c, 0x9c, 0xe4, 0x22, 0x9a, 0x4e, 0xcd, 0xa9, 0x78, 0x92, 0xa2, 0x8a, 0xf4, 0x03, 0xdf, 0x63, 0x00, 0x59, 0xae, 0xc0, 0xcb, 0x99, 0x52, 0xeb, 0x41, 0x89, 0xc5, 0x06, 0xd5, 0x67, 0xa0, 0x56, 0x7e, 0xda, 0x3c, 0xe2, 0xff, 0x29, 0x17, 0x3d, 0x6c, 0xab, 0x79, 0xa0, 0xea, 0x7f, 0x57, 0x3b, 0xb6, 0x7c, 0x77, 0xcd, 0x69, 0x6b, 0xd5, 0x73, 0x7a, 0x74, 0x46, 0xbd, 0x04, 0xd7, 0x5b, 0x07, 0xc9, 0xdd, 0x88, 0x07, 0x78, 0x0d, 0x85, 0xa2, 0x2b, 0xa2, 0xf5, 0x04, 0x34, 0x3d, 0x46, 0xef, 0x19, 0xd8, 0xd8, 0x53, 0xdd, 0xfb, 0x61, 0x20, 0x81, 0x32, 0x90, 0x58, 0xcb, 0xbe, 0xf0, 0x68, 0x46, 0x8b, 0x10, 0xb8, 0x8a, 0x62, 0xe1, 0x81, 0xbd, 0x60, 0x5f, 0xdf, 0x5a, 0xa7, 0x73, 0x27, 0x31, 0x53, 0x18, 0x7a, 0xb0, 0xb0, 0xbe, 0x9a, 0x60, 0xaa, 0xeb, 0xfd, 0xb2, 0x84, 0x28, 0x20, 0xfc, 0xcd, 0x1b, 0x1e, 0xbf, 0x90, 0xf1, 0x81, 0x2b, 0xcc, 0xff, 0x58, 0xe5, 0x23, 0xa8, 0x8a, 0x07, 0xd6, 0x81, 0x69, 0x69, 0xf1, 0xb3, 0x8a, 0x1f, 0xc3, 0xa1, 0xd5, 0x42, 0x91, 0xcb, 0xd8, 0xf4, 0x8c, 0xf2, 0x60, 0x9e, 0xff, 0x7e, 0x4b, 0x7c, 0xcd, 0x1c, 0x98, 0x5c, 0x1b, 0xab, 0xc0, 0xa2, 0x4a, 0x59, 0x49, 0x90, 0x28, 0x09, 0x98, 0xc4, 0x67, 0xf9, 0x07, 0x02, 0x4e, 0xa1, 0x37, 0x34, 0xae, 0xde, 0xa8, 0xaf, 0x18, 0x4f, 0x86, 0xb8, 0x4d, 0xff, 0xc6, 0x47, 0xf6, 0x45, 0x72, 0x0b, 0x95, 0xe9, 0x41, 0xad, 0xbc, 0x88, 0x6b, 0x59, 0x7d, 0x3a, 0xbb, 0x7b, 0x21, 0x71, 0xe6, 0xc6, 0x1c, 0x25, 0x1b, 0x7b, 0x41, 0x2e, 0xdb, 0xe8, 0x33, 0xf1, 0x0b, 0x2f, 0x1c, 0x3e, 0x48, 0x48, 0xa1, 0x79, 0x7a, 0x49, 0x15, 0xf8, 0xac, 0xe5, 0xec, 0xad, 0x1b, 0x33, 0x73, 0x05, 0x8c, 0xb1, 0xbf, 0x0f, 0xe3, 0x89, 0xe3, 0xe1, 0xf2, 0x13, 0x67, 0x38, 0x8f, 0x9a, 0xf5, 0x5e, 0xe9, 0x63, 0x54, 0x51, 0x1c, 0xeb, 0x9b, 0x21, 0x02, 0x71, 0x9e, 0x9a, 0x4c, 0xb4, 0xad, 0x23, 0xd2, 0xfe, 0x7e, 0xe6, 0x28, 0x61, 0x67, 0x31, 0x72, 0x41, 0xd0, 0x1c, 0x79, 0x13, 0xe9, 0x6d, 0xfe, 0x63, 0x98, 0xb8, 0x4e, 0x1c, 0xb6, 0xcb, 0x16, 0x04, 0x7a, 0x49, 0x79, 0x86, 0x35, 0x94, 0x60, 0xb4, 0x40, 0xf0, 0x11, 0x8c, 0x33, 0xe6, 0x04, 0x7a, 0x58, 0xe7, 0xf1, 0x1f, 0x60, 0x32, 0x2e, 0x51, 0x54, 0xf8, 0x38, 0x63, 0xce, 0xbd, 0x90, 0xa6, 0x68, 0x01, 0xc8, 0x2f, 0x75, 0x20, 0xdd, 0xdb, 0xef, 0x77, 0xc7, 0x91, 0xb1, 0xc8, 0x4f, 0xc7, 0xe6, 0xdf, 0x21, 0x48, 0xc2, 0x76, 0x22, 0x34, 0x70, 0x57, 0x03, 0x48, 0x4b, 0xc0, 0x17, 0x5f, 0x50, 0x0b, 0x61, 0x39, 0xd3, 0x8e, 0xf2, 0x7c, 0x72, 0xc1, 0x72, 0xf8, 0x48, 0x9e, 0xfc, 0x2f, 0x63, 0x4e, 0x2f, 0x15, 0x77, 0x01, 0x81, 0x14, 0xd3, 0x1e, 0xd7, 0x53, 0x95, 0x9c, 0x53, 0x38, 0x1a, 0xaf, 0x6d, 0x2c, 0xb9, 0xa8, 0x46, 0x9e, 0xb1, 0x16, 0x38, 0x4a, 0x5f, 0x32, 0xb2, 0xbb, 0xb5, 0x7a, 0x43, 0x0e, 0xe7, 0x9b, 0xf4, 0xfa, 0x67, 0x94, 0xdb, 0x0d, 0x14, 0x19, 0xed, 0x38, 0xaf, 0x35, 0x14, 0x8e, 0x8e, 0x34, 0x82, 0x49, 0x94, 0xc0, 0x44, 0x0e, 0x60, 0x4a, 0x1a, 0x72, 0xc5, 0xac, 0x86, 0xbc, 0x7a, 0x0c, 0x23, 0xec, 0x13, 0x03, 0x38, 0xfd, 0x30, 0xfe, 0x8d, 0x68, 0xf5, 0xe5, 0x7d, 0xe9, 0xba, 0xfb, 0x4d, 0x85, 0x03, 0x06, 0xbc, 0xcc, 0xb2, 0xaf, 0xdb, 0x5c, 0x7b, 0x2b, 0x1f, 0xa6, 0x99, 0x1b, 0xb5, 0xf5, 0xbf, 0xb1, 0x15, 0xac, 0x52, 0x15, 0xda, 0xce, 0xd5, 0x07, 0xd1, 0xc4, 0xa5, 0xc5, 0x50, 0x5b, 0xe6, 0x2f, 0xc9, 0x0d, 0xbd, 0x29, 0x9e, 0x81, 0xbf, 0x41, 0x37, 0x55, 0xaa, 0x92, 0x53, 0x1a, 0x53, 0xe7, 0x9b, 0xa0, 0xe0, 0x24, 0x7d, 0x74, 0x37, 0xe2, 0x37, 0xa8, 0xb7, 0x5a, 0x32, 0xd2, 0x25, 0x84, 0x92, 0x57, 0xe9, 0x80, 0x0b, 0xea, 0x7a, 0x34, 0xf6, 0x4f, 0x17, 0x37, 0xa4, 0x65, 0xb8, 0xed, 0xf2, 0x63, 0x44, 0xf4, 0x1d, 0x62, 0x04, 0xbf, 0xd8, 0x1c, 0x58, 0x81, 0x9c, 0xf3, 0xa8, 0x4d, 0x40, 0x35, 0x9e, 0x7b, 0xc9, 0x9e, 0x92, 0x4d, 0x83, 0x1e, 0x46, 0xd3, 0x51, 0xdd, 0xd4, 0x0b, 0x41, 0x7d, 0xe4, 0x4d, 0x63, 0x9f, 0x22, 0xe6, 0xdc, 0xa8, 0xf0, 0x04, 0x36, 0xc5, 0x57, 0xd2, 0xfa, 0x2c, 0x44, 0xe3, 0x81, 0xa5, 0xf1, 0xd4, 0x07, 0x49, 0xa1, 0x2d, 0x01, 0x8a, 0x90, 0x89, 0xb0, 0x74, 0x2a, 0xf7, 0xf7, 0x33, 0x7b, 0x9f, 0x6a, 0xd4, 0xe7, 0xa9, 0xa7, 0x50, 0x1b, 0x5a, 0xe9, 0xc6, 0x43, 0x80, 0xda, 0x08, 0x7d, 0x11, 0xa9, 0x59, 0x8e, 0x0f, 0x5d, 0x75, 0xd5, 0xae, 0x69, 0xd2, 0x7d, 0xb9, 0x80, 0x26, 0xf6, 0x32, 0xaa, 0x29, 0xa5, 0x39, 0x98, 0x9c, 0xda, 0x2e, 0x34, 0x8a, 0x03, 0x1a, 0x7d, 0xce, 0x20, 0x4b, 0x92, 0xd5, 0x77, 0x3f, 0x0c, 0xa5, 0x89, 0xc4, 0x91, 0x1e, 0x44, 0x5c, 0xa7, 0x80, 0x7a, 0xe6, 0xc5, 0x2e, 0x92, 0x7b, 0xb0, 0xb2, 0x7e, 0x97, 0x05, 0x00, 0xed, 0x79, 0x11, 0xff, 0xc1, 0xcc, 0xe9, 0x45, 0xc3, 0x86, 0xb7, 0x22, 0x95, 0x11, 0x53, 0xe1, 0xe9, 0xa9, 0x13, 0x4a, 0xf1, 0x05, 0xe3, 0x6c, 0x16, 0x39, 0x98, 0x99, 0xed, 0xdb, 0x81, 0xb1, 0x67, 0x64, 0x3f, 0xa4, 0x48, 0xda, 0xd7, 0x32, 0xda, 0xac, 0x06, 0xf5, 0xe2, 0xde, 0xd5, 0xa2, 0xd3, 0x65, 0x6c, 0x8c, 0x42, 0xd5, 0x2b, 0x69, 0x9a, 0x39, 0xf7, 0x59, 0x11, 0x42, 0xd2, 0x24, 0xda, 0xa5, 0xaf, 0xc3, 0x9c, 0xbe, 0x84, 0x23, 0x24, 0x79, 0xa0, 0x25, 0x57, 0x72, 0x3f, 0xe9, 0x6a, 0x5b, 0x5c, 0x4c, 0x55, 0x9f, 0xc6, 0xaf, 0x84, 0x44, 0x76, 0xfb, 0xd0, 0x16, 0x20, 0xe1, 0xaf, 0x02, 0x08, 0x67, 0xa7, 0xc0, 0x17, 0xa0, 0x09, 0xb5, 0x2e, 0xba, 0xdb, 0x17, 0xba, 0x3f, 0x16, 0x52, 0x89, 0x94, 0x12, 0xaa, 0xdc, 0xc6, 0x3e, 0x22, 0xbd, 0x85, 0x14, 0x9d, 0x92, 0x71, 0x4c, 0x44, 0xf3, 0x95, 0x50, 0x27, 0xb9, 0x31, 0xf1, 0x27, 0x57, 0xbd, 0x58, 0x13, 0x6e, 0x2a, 0x3f, 0x11, 0x9b, 0x6b, 0x61, 0x40, 0x94, 0x34, 0x2e, 0x9b, 0x73, 0x02, 0xc4, 0x21, 0x51, 0x5b, 0x1b, 0x33, 0x17, 0x57, 0x7f, 0x3d, 0x91, 0x5f, 0x44, 0x98, 0xc4, 0x35, 0xb5, 0xaf, 0x82, 0x34, 0x4d, 0x61, 0x3b, 0xda, 0x2a, 0xa7, 0x16, 0x83, 0xbe, 0x77, 0x40, 0x77, 0xc8, 0xe8, 0x84, 0x27, 0x82, 0x96, 0x1d, 0xb4, 0x1c, 0x48, 0xc8, 0xb1, 0x6a, 0xd0, 0x1d, 0x2a, 0xda, 0x33, 0x1e, 0xe5, 0xa8, 0x0a, 0x11, 0xe7, 0x55, 0x28, 0x8b, 0x3a, 0x55, 0x7d, 0xce, 0xee, 0x08, 0x3a, 0x54, 0x5e, 0xeb, 0x36, 0xac, 0xb5, 0x10, 0x91, 0x85, 0xb0, 0xcb, 0x97, 0x09, 0xa5, 0xaf, 0xe7, 0x6c, 0xc4, 0xb8, 0xd4, 0xc4, 0x9d, 0xca, 0x0b, 0x1b, 0xe2, 0x5a, 0x76, 0xc2, 0x6e, 0x6b, 0x61, 0xe9, 0x87, 0xbd, 0xdc, 0x6d, 0x60, 0x41, 0x60, 0xf1, 0xe2, 0xcf, 0xb5, 0x30, 0xac, 0x1b, 0x12, 0x91, 0x59, 0xe6, 0x87, 0xfd, 0x01, 0x71, 0x98, 0xed, 0x02, 0x37, 0x2b, 0xc7, 0x00, 0xdb, 0xa4, 0x6a, 0x2a, 0x60, 0x4e, 0x07, 0xbf, 0x98, 0xfd, 0x34, 0xd1, 0xdf, 0xf1, 0x3b, 0x4a, 0x09, 0xfe, 0xb8, 0x2c, 0x98, 0xea, 0x63, 0x1d, 0x32, 0x17, 0x2a, 0x22, 0x53, 0x61, 0x83, 0xab, 0x40, 0x4a, 0x00, 0xd0, 0x3c, 0x55, 0x23, 0xda, 0xfd, 0xaf, 0x75, 0x05, 0x61, 0x14, 0xd2, 0x84, 0x5e, 0xf1, 0x07, 0xc6, 0x37, 0xc6, 0x9f, 0xf8, 0xf6, 0xcf, 0xf9, 0xcb, 0x16, 0xe3, 0x9e, 0x77, 0x80, 0x9c, 0xd2, 0x00, 0xb9, 0xb8, 0x69, 0xb7, 0x59, 0xbf, 0xdc, 0x05, 0xbf, 0xe6, 0x9c, 0x64, 0x03, 0x34, 0xa6, 0xae, 0x2c, 0xe3, 0x58, 0x9a, 0xa3, 0x09, 0x83, 0x83, 0xe8, 0x78, 0xc1, 0x6c, 0x84, 0xe2, 0x09, 0x42, 0x3f, 0x41, 0x80, 0x60, 0x92, 0x75, 0x92, 0x59, 0x5f, 0x2f, 0x42, 0xf1, 0xe0, 0x0f, 0xbe, 0x6c, 0xde, 0x09, 0x37, 0x0c, 0x23, 0x0d, 0xef, 0xd5, 0x31, 0xe7, 0x94, 0x93, 0x34, 0x64, 0xcc, 0x1e, 0x36, 0xb6, 0x11, 0xdd, 0x92, 0x19, 0xbf, 0x89, 0xab, 0xb7, 0x6b, 0x33, 0xdd, 0xc9, 0x77, 0x89, 0xb4, 0x00, 0xe3, 0x55, 0x5c, 0x23, 0x66, 0x46, 0x59, 0xf9, 0xbe, 0xf3, 0x78, 0x69, 0x44, 0x1d, 0x06, 0xe0, 0xc3, 0x34, 0x3f, 0xf3, 0x8a, 0x1d, 0x09, 0x46, 0xc0, 0x33, 0xe3, 0xac, 0xf8, 0x8c, 0x18, 0x8f, 0x05, 0x7d, 0x38, 0x93, 0x10, 0x60, 0xc8, 0x76, 0xe8, 0x94, 0x39, 0x3b, 0x98, 0xc6, 0x17, 0x87, 0x3f, 0x6f, 0x83, 0x4b, 0x1c, 0x9e, 0xe3, 0xa3, 0xe9, 0xf8, 0xd8, 0xfe, 0x6a, 0xfd, 0x71, 0x80, 0x45, 0x8d, 0x9e, 0xa4, 0x14, 0xaa, 0xe7, 0x26, 0xb9, 0x7f, 0x5d, 0x20, 0xf1, 0xa1, 0xd1, 0x73, 0x2d, 0x96, 0x45, 0x68, 0x9d, 0x94, 0xa0, 0x97, 0x8d, 0x8a, 0xa6, 0x08, 0xf4, 0x65, 0x26, 0x99, 0x4a, 0x8c, 0x75, 0x9f, 0x9b, 0xac, 0x1c, 0xd0, 0xda, 0xbb, 0xce, 0x61, 0x77, 0x37, 0x9d, 0x6b, 0x33, 0xaf, 0x6d, 0x93, 0x34, 0x85, 0xa8, 0xea, 0x54, 0xf2, 0x33, 0x12, 0xbf, 0x4a, 0xa1, 0xa3, 0xbd, 0x82, 0xa7, 0xcc, 0xcc, 0xef, 0xd0, 0x3e, 0xf2, 0x50, 0x72, 0x45, 0x51, 0x0f, 0xe1, 0x38, 0xfc, 0xc4, 0xe2, 0x14, 0x09, 0xfb, 0x63, 0x64, 0xe8, 0x37, 0x69, 0x64, 0xf3, 0x37, 0x49, 0x65, 0x45, 0x77, 0x1b, 0x73, 0xd0, 0xfa, 0x6c, 0x36, 0xaa, 0x47, 0x33, 0x16, 0xa8, 0xb2, 0x06, 0xa2, 0x2e, 0xdc, 0x8e, 0x33, 0x45, 0x7d, 0x39, 0xcc, 0xee, 0x61, 0x2e, 0x45, 0xb7, 0xb1, 0x86, 0xa9, 0x8b, 0x74, 0xb9, 0xdc, 0xce, 0x55, 0x56, 0x81, 0xaa, 0xa7, 0xf8, 0x1a, 0xa3, 0xa6, 0x75, 0x71, 0x72, 0x00, 0x58, 0x38, 0x10, 0x94, 0x92, 0xec, 0x11, 0x79, 0x6c, 0xff, 0x33, 0x42, 0xc0, 0x35, 0x37, 0x80, 0x69, 0x4f, 0xef, 0x89, 0xf8, 0xe7, 0x99, 0x78, 0xa8, 0x9b, 0x6b, 0x75, 0x95, 0x6d, 0x6f, 0x37, 0x28, 0x6a, 0x91, 0xc6, 0xd6, 0x8a, 0xf7, 0x86, 0x0a, 0xd8, 0x90, 0x71, 0x5f, 0xd2, 0xf0, 0xa4, 0x13, 0x13, 0x5b, 0x1d, 0xb9, 0x2f, 0x1f, 0xc3, 0x2d, 0xdf, 0x27, 0xa6, 0xcd, 0x5e, 0xce, 0x89, 0xe6, 0x12, 0xf1, 0x9e, 0x6d, 0x6f, 0x48, 0x90, 0xf0, 0x19, 0xf6, 0xc6, 0xcb, 0x48, 0x5e, 0xe7, 0x9f, 0x71, 0x39, 0x99, 0x00, 0x23, 0xe5, 0x8f, 0x6e, 0x2f, 0x00, 0xc2, 0x87, 0x0b, 0x36, 0xfe, 0x7a, 0x78, 0x57, 0xa1, 0xbf, 0x63, 0xad, 0xa0, 0x06, 0x09, 0x8c, 0xca, 0x6d, 0x5f, 0x2a, 0x51, 0xf5, 0xb1, 0xb1, 0x86, 0x37, 0x89, 0x93, 0xe4, 0x53, 0xd2, 0x1e, 0x50, 0x2a, 0x3d, 0x50, 0x9f, 0xcd, 0xe4, 0xec, 0x59, 0x34, 0x2e, 0xcd, 0xbc, 0x34, 0xf2, 0x7b, 0x04, 0xab, 0xdf, 0xfc, 0xea, 0xfe, 0x1b, 0xed, 0x6b, 0xc5, 0x2a, 0xd1, 0xca, 0xc4, 0x12, 0xa8, 0xd8, 0x1e, 0xbc, 0xc4, 0x73, 0xc5, 0x9e, 0xd8, 0x4d, 0x35, 0x97, 0x52, 0xef, 0x62, 0x1a, 0xea, 0xfd, 0xee, 0x8f, 0x7b, 0xbb, 0xa0, 0xf6, 0x12, 0xd0, 0x12, 0xce, 0x45, 0x4a, 0xa9, 0x35, 0xc7, 0xe3, 0xca, 0x50, 0x39, 0x82, 0x4b, 0xed, 0x42, 0x05, 0x28, 0x67, 0xe1, 0x3e, 0x78, 0xca, 0x02, 0x3b, 0x9f, 0x38, 0x50, 0xcb, 0xc4, 0x8c, 0x4b, 0x3d, 0x86, 0x3c, 0x9a, 0x6b, 0xea, 0x84, 0xa2, 0xf8, 0x98, 0xc1, 0x57, 0xd5, 0x48, 0x1b, 0x52, 0x0a, 0x77, 0x66, 0x25, 0xb3, 0x5e, 0x4a, 0xeb, 0x48, 0x24, 0xa2, 0x23, 0x22, 0x53, 0x23, 0xbe, 0x3b, 0x89, 0x3e, 0x76, 0x36, 0x70, 0x47, 0x62, 0x9f, 0xef, 0xd6, 0xc7, 0x73, 0xa2, 0x6e, 0x32, 0xe3, 0x88, 0x5c, 0xc3, 0x55, 0xfc, 0xe2, 0xcc, 0xac, 0xe7, 0x95, 0x9b, 0xc9, 0x33, 0x04, 0x93, 0x51, 0x83, 0x9a, 0x82, 0xb1, 0x21, 0xc6, 0x2e, 0x60, 0x37, 0x58, 0x31, 0x64, 0x43, 0x2f, 0x07, 0x18, 0xc5, 0x11, 0x66, 0x2c, 0x3a, 0xda, 0xcd, 0xed, 0x4e, 0xd9, 0x60, 0xc7, 0x4e, 0x77, 0xf3, 0x08 ],
+    const [ 0xb2, 0xc6, 0x33, 0xe3, 0x18, 0x1a, 0xe5, 0xfe, 0x78, 0x28, 0x70, 0x7e, 0xd5, 0xb7, 0x0e, 0x04, 0x60, 0x08, 0x8a, 0x84, 0x46, 0x5e, 0xad, 0xee, 0xcd, 0xbc, 0xfa, 0x0e, 0x9f, 0xf1, 0x9b, 0xb1, 0x65, 0xd2, 0x9a, 0x09, 0x98, 0xc7, 0x54, 0x52, 0x94, 0x89, 0x2b, 0xb6, 0xef, 0x29, 0x7c, 0x6e, 0x08, 0x55, 0xd1, 0x2b, 0xe3, 0xd7, 0x57, 0xb4, 0x34, 0x5e, 0x92, 0xd0, 0xb9, 0x81, 0x4f, 0x66, 0xcd, 0x01, 0xda, 0xe3, 0x3b, 0x4e, 0x72, 0xdc, 0x50, 0x4d, 0xfa, 0xf5, 0x34, 0x59, 0xf1, 0x01, 0x7a, 0x88, 0xa4, 0x6a, 0xf5, 0x2f, 0xa2, 0xd3, 0xcd, 0xa8, 0x71, 0xfd, 0xd3, 0x52, 0x7f, 0xe7, 0x12, 0xda, 0x5b, 0x3a, 0xa6, 0xb9, 0x25, 0xe3, 0xd2, 0xfe, 0x44, 0x02, 0x4c, 0x4e, 0x56, 0x03, 0xdb, 0x29, 0x6d, 0x0a, 0x24, 0x6e, 0x78, 0x95, 0xc1, 0x22, 0xff, 0x5d, 0x94, 0x6d, 0x14, 0x7d, 0x5b, 0xe5, 0x86, 0xd5, 0x84, 0x10, 0x57, 0xb1, 0x42, 0x23, 0x70, 0xa6, 0xe0, 0x10, 0x94, 0xbd, 0x56, 0xc0, 0x93, 0xd4, 0x1a, 0x9d, 0xc0, 0x40, 0x38, 0x54, 0xa4, 0xb7, 0xa5, 0xd9, 0xf4, 0x6e, 0xd0, 0xab, 0xc1, 0x7e, 0x7b, 0x59, 0xef, 0x8c, 0xc9, 0x45, 0xe8, 0xa9, 0x98, 0xa8, 0x91, 0x77, 0x10, 0xd6, 0x7e, 0x8d, 0x7c, 0xc4, 0x62, 0x1d, 0x59, 0xc7, 0xc9, 0xd4, 0xad, 0x9e, 0x09, 0x02, 0x9b, 0xb3, 0x75, 0xfb, 0x33, 0x9e, 0xd5, 0xbd, 0x8f, 0xeb, 0x13, 0xd3, 0x1b, 0x1d, 0x37, 0x79, 0x34, 0xf2, 0x95, 0x00, 0xf5, 0xe9, 0x45, 0x74, 0x4d, 0x02, 0xd4, 0x7d, 0x55, 0xc5, 0x39, 0x83, 0xe1, 0x85, 0x0b, 0x15, 0x56, 0xe6, 0xf1, 0x8c, 0xbb, 0x9d, 0x59, 0xeb, 0x12, 0x77, 0x6d, 0x0a, 0xe8, 0x9d, 0x42, 0xf4, 0x2b, 0x16, 0x53, 0x8d, 0x3c, 0x8d, 0x2f, 0x78, 0x45, 0x55, 0x6e, 0x37, 0xcd, 0xaa, 0xe9, 0x94, 0x89, 0x3a, 0x2b, 0x40, 0x75, 0xe4, 0x22, 0xbb, 0x24, 0xbf, 0x1a, 0x73, 0x54, 0x5e, 0xed, 0x30, 0xc6, 0x52, 0x73, 0xaf, 0x4d, 0xf1, 0x40, 0x8d, 0x24, 0x56, 0x8f, 0x68, 0x84, 0xa9, 0x79, 0x40, 0x76, 0xa1, 0x6b, 0x23, 0xe7, 0x46, 0xd6, 0x09, 0xfa, 0xfc, 0x28, 0xfd, 0xa2, 0xbd, 0xfc, 0x7d, 0x6f, 0xa6, 0x8d, 0x24, 0xa8, 0xb5, 0x71, 0x86, 0x9b, 0xd1, 0x84, 0x5c, 0x31, 0x0a, 0x22, 0xe1, 0xc5, 0x23, 0x99, 0x7b, 0x36, 0x4d, 0xdd, 0x9e, 0x3b, 0x36, 0x7e, 0xed, 0xf7, 0x42, 0xd8, 0xa3, 0xce, 0x18, 0x8a, 0x32, 0x76, 0x61, 0x29, 0x2a, 0x51, 0xcc, 0x35, 0x5b, 0xfa, 0x56, 0x4b, 0x3e, 0x1e, 0xc8, 0x9d, 0x91, 0x8d, 0x81, 0xa0, 0x42, 0x90, 0x75, 0x04, 0x8e, 0x7e, 0x76, 0xe9, 0x6a, 0x8a, 0xb3, 0x50, 0x22, 0xdf, 0x7e, 0xcf, 0x40, 0xef, 0x52, 0x8a, 0xaf, 0x07, 0x14, 0x5e, 0x20, 0x27, 0x99, 0x5f, 0xad, 0x12, 0x69, 0x85, 0xbc, 0xa1, 0xc2, 0xa2, 0x27, 0x5c, 0xe0, 0x97, 0x9a, 0x4b, 0x7c, 0xc8, 0x3c, 0x0a, 0x93, 0xcd, 0x91, 0x1c, 0x68, 0x6b, 0x9f, 0x81, 0xcc, 0xc2, 0x4f, 0x8b, 0x9d, 0xc7, 0x17, 0xed, 0x8d, 0xf5, 0xd6, 0x15, 0x24, 0x40, 0xff, 0xbc, 0x09, 0x4b, 0xfa, 0xbb, 0x7d, 0xda, 0xc7, 0x20, 0x28, 0x8a, 0xe5, 0x81, 0x18, 0xc0, 0x72, 0x90, 0x07, 0xdf, 0x93, 0xf0, 0xdc, 0xbe, 0x16, 0x47, 0x75, 0x59, 0x56, 0x95, 0xa4, 0xc6, 0x5f, 0xc4, 0x77, 0x6b, 0x53, 0x80, 0xbd, 0x6f, 0x0d, 0x48, 0xc5, 0x6e, 0x03, 0xc5, 0x69, 0x71, 0x71, 0x5b, 0x4b, 0x1d, 0xb4, 0xff, 0x5f, 0x2a, 0xf3, 0x48, 0xaa, 0x17, 0x05, 0xc8, 0x49, 0x1c, 0x8f, 0x9c, 0xb4, 0x61, 0x6d, 0x42, 0x44, 0x6d, 0x54, 0xab, 0xf3, 0xe1, 0xb5, 0x91, 0x64, 0x66, 0xe4, 0x0b, 0x23, 0xe4, 0x79, 0x5f, 0x2d, 0xf5, 0xf7, 0x17, 0xb3, 0x99, 0xab, 0x57, 0x1b, 0x2b, 0xd7, 0x6d, 0x48, 0x93, 0x10, 0xaa, 0x1b, 0xbe, 0xe5, 0x70, 0x39, 0x4b, 0xc1, 0x8d, 0x0f, 0x87, 0x13, 0xc7, 0x14, 0x9c, 0xab, 0xb8, 0x4e, 0x05, 0x67, 0xdd, 0x18, 0x45, 0x10, 0xe9, 0x22, 0xd9, 0x7f, 0x5f, 0xb9, 0x6b, 0x04, 0x5f, 0x49, 0x48, 0x08, 0xc0, 0x20, 0x14, 0xf0, 0x60, 0x74, 0xbd, 0x45, 0xb8, 0xa8, 0xad, 0x12, 0xb4, 0xcb, 0x44, 0x8e, 0xc1, 0x62, 0x85, 0xfb, 0x27, 0x67, 0x0f, 0xce, 0x99, 0x91, 0x4f, 0x10, 0x0a, 0xd6, 0xf5, 0x04, 0xc3, 0x2f, 0xa4, 0x0a, 0xb3, 0x9b, 0xee, 0xc3, 0x06, 0x66, 0x7f, 0x76, 0xf9, 0xab, 0x98, 0xb3, 0xec, 0x18, 0xc0, 0x36, 0xb8, 0xf1, 0xb6, 0x0d, 0x44, 0x57, 0xa9, 0xfe, 0x53, 0xcb, 0xab, 0x23, 0xa0, 0xee, 0x64, 0xd7, 0x2d, 0x8a, 0x03, 0xd6, 0xd8, 0xd6, 0x7a, 0x9f, 0x2f, 0xf6, 0xeb, 0x1d, 0x85, 0xc2, 0x5d, 0x87, 0x46, 0xc8, 0xb4, 0x85, 0x87, 0x94, 0xe0, 0x94, 0xe1, 0x2f, 0x54, 0xab, 0x80, 0xe5, 0xba, 0x1f, 0x77, 0x4b, 0xe5, 0xc4, 0x56, 0x81, 0x07, 0x55, 0xff, 0xb5, 0x24, 0x15, 0xb5, 0xe8, 0xc6, 0xb7, 0x76, 0xf5, 0xf3, 0x7b, 0x8b, 0xcf, 0x5c, 0x9b, 0x5d, 0x0a, 0xd7, 0xe5, 0x8a, 0x9d, 0x0f, 0xa9, 0x38, 0xe6, 0x7a, 0xd5, 0xaa, 0xee, 0x8c, 0x5f, 0x11, 0xef, 0x2b, 0xe3, 0xa4, 0x13, 0x62, 0x8e, 0xf2, 0x7f, 0x59, 0x3a, 0x77, 0x90, 0x85, 0xda, 0x6e, 0x64, 0x1c, 0x19, 0xe7, 0x9d, 0xcc, 0x3e, 0x19, 0x61, 0xac, 0x53, 0xf9, 0xa5, 0x73, 0x86, 0x0c, 0xac, 0xe8, 0xcf, 0x79, 0xca, 0x99, 0xd3, 0x62, 0x6e, 0xd0, 0x09, 0x74, 0x60, 0xc3, 0x1b, 0xbd, 0x46, 0x0b, 0x8f, 0xbe, 0x6d, 0x57, 0xa6, 0xc2, 0xc6, 0x62, 0x84, 0x6e, 0x2f, 0x22, 0x92, 0x98, 0xf4, 0x43, 0x21, 0x5d, 0x96, 0xd3, 0x50, 0x6d, 0xcb, 0x3f, 0x2f, 0xaa, 0xc5, 0x7e, 0x24, 0xf2, 0xb7, 0x8c, 0x8e, 0x38, 0x96, 0x1a, 0xa9, 0xda, 0x1d, 0x84, 0xb2, 0x2e, 0x13, 0x03, 0x4b, 0x5e, 0xd0, 0x24, 0x20, 0x77, 0xfe, 0x78, 0xcb, 0xbc, 0x9d, 0x8d, 0xf5, 0x40, 0x49, 0x1e, 0xbe, 0xb4, 0xc0, 0x87, 0x5f, 0x7d, 0x9f, 0x7b, 0x0e, 0x0a, 0x6c, 0xf9, 0x23, 0x64, 0xd9, 0x7c, 0x78, 0x06, 0x47, 0x73, 0x15, 0xf0, 0x8a, 0xf0, 0x0d, 0xf7, 0xec, 0xa4, 0xa3, 0x5f, 0x74, 0x0b, 0xb1, 0xab, 0x68, 0xe4, 0x4b, 0xb4, 0x10, 0xe4, 0x9f, 0xf9, 0xbd, 0xab, 0x1f, 0x36, 0x0a, 0xf7, 0xe3, 0x38, 0x62, 0x18, 0x48, 0xef, 0xc2, 0xa4, 0xde, 0xc5, 0xc0, 0x6b, 0x81, 0x2e, 0xcd, 0xad, 0xc5, 0x80, 0xb7, 0x8b, 0x98, 0x06, 0x72, 0xbc, 0x22, 0x4f, 0x17, 0x81, 0xf0, 0xcc, 0x2d, 0xdb, 0x52, 0x9b, 0x28, 0xfb, 0x01, 0x9d, 0x2f, 0xfa, 0x05, 0xce, 0x22, 0xca, 0xd6, 0xd6, 0xdc, 0x6d, 0xc2, 0xdb, 0xb5, 0x64, 0x8e, 0x9a, 0x4b, 0x6b, 0x60, 0xb6, 0x83, 0x63, 0xdd, 0x4f, 0xca, 0x90, 0x8e, 0xd7, 0xa1, 0x04, 0x88, 0x21, 0x58, 0x5b, 0x4c, 0xbb, 0x19, 0xa9, 0xec, 0x7e, 0x29, 0xb1, 0x6f, 0x63, 0x6b, 0x58, 0x77, 0x99, 0x26, 0x59, 0x21, 0xd4, 0x07, 0x39, 0x2d, 0xe7, 0x6a, 0x7e, 0x5f, 0x95, 0xd5, 0x1c, 0x24, 0xa4, 0xc5, 0x30, 0x79, 0x34, 0xae, 0xf0, 0x09, 0x4f, 0x3d, 0xe2, 0x95, 0xc1, 0xe0, 0x4d, 0x99, 0x2a, 0x88, 0xee, 0x2d, 0x51, 0xae, 0xeb, 0x29, 0xbb, 0x94, 0x0d, 0x8c, 0x7d, 0xcd, 0x29, 0x1f, 0x4e, 0xff, 0xdf, 0x55, 0xe0, 0xe8, 0x87, 0x76, 0x71, 0x9f, 0x69, 0xfc, 0x9d, 0x1c, 0x2c, 0x3e, 0x76, 0xfb, 0x92, 0x4b, 0xd6, 0x7d, 0x62, 0x19, 0xf4, 0xd0, 0xa5, 0xdf, 0x36, 0x90, 0x14, 0xbf, 0x46, 0x8d, 0xd2, 0xa8, 0x68, 0xcf, 0x57, 0x7b, 0x0b, 0xd7, 0xac, 0x6c, 0x9d, 0x28, 0xde, 0xac, 0xa4, 0x06, 0xad, 0x45, 0x0b, 0x7e, 0x84, 0x45, 0xb9, 0xa6, 0xae, 0x1e, 0x69, 0x26, 0xc6, 0x4d, 0xb5, 0xf7, 0x6f, 0x3a, 0x73, 0x6b, 0x46, 0x5f, 0x45, 0x6e, 0x15, 0xad, 0x6c, 0x0b, 0x4a, 0x2b, 0xdd, 0x32, 0xa7, 0xe1, 0x97, 0xb8, 0x3a, 0xf4, 0x33, 0x9f, 0x90, 0x12, 0xbd, 0x98, 0x26, 0x10, 0xc2, 0xc6, 0x20, 0xd2, 0xaa, 0xc5, 0x3d, 0x6c, 0x48, 0xeb, 0x0b, 0x86, 0xb0, 0xcd, 0x57, 0x05, 0x49, 0x05, 0xe8, 0xe8, 0x23, 0x33, 0x6d, 0x6f, 0x8a, 0x42, 0xb3, 0x83, 0xdb, 0xed, 0x1b, 0x52, 0x96, 0x81, 0x4c, 0x3a, 0xb5, 0xe4, 0x25, 0xe8, 0x3c, 0xd6, 0xf5, 0xc1, 0x12, 0x77, 0xef, 0x80, 0x0f, 0x09, 0xd8, 0x21, 0x56, 0xf8, 0x03, 0xff, 0xe5, 0x17, 0x7f, 0x39, 0x6a, 0x2d, 0x8f, 0x59, 0x58, 0xb0, 0x5a, 0x38, 0x3b, 0xd0, 0xe4, 0x1c, 0x49, 0xb8, 0x3d, 0x24, 0x39, 0x10, 0xf9, 0xe6, 0x58, 0xc6, 0xdf, 0x56, 0xd9, 0x0e, 0xe6, 0xea, 0x6c, 0xa7, 0x5d, 0xfb, 0x13, 0x60, 0x69, 0x6f, 0x31, 0xdc, 0xb4, 0x95, 0xe4, 0x92, 0x64, 0x50, 0x95, 0x17, 0x4a, 0x78, 0xce, 0xa0, 0x5c, 0x7d, 0x4b, 0xc3, 0x66, 0x4d, 0x53, 0x7d, 0xfc, 0x78, 0x49, 0x79, 0xb3, 0x92, 0x7e, 0x8f, 0x91, 0xda, 0x49, 0x8c, 0xc1, 0x18, 0x5a, 0x31, 0x8b, 0xcc, 0x4b, 0x7e, 0x84, 0x84, 0x78, 0x30, 0x02, 0x8e, 0x11, 0x88, 0xd3, 0xcf, 0x6d, 0x4e, 0x2f, 0xf3, 0xa1, 0x16, 0xea, 0xc7, 0x52, 0xc2, 0xee, 0xe2, 0xc7, 0x48, 0xe9, 0x8b, 0x42, 0xb5, 0x43, 0xd7, 0x91, 0x72, 0x53, 0x12, 0xe0, 0xc6, 0xd2, 0x60, 0xd1, 0x9d, 0x90, 0xa4, 0xcf, 0x88, 0x65, 0xa1, 0x9f, 0x04, 0x6b, 0x60, 0x37, 0xff, 0x6a, 0xd1, 0xd4, 0x98, 0x94, 0xb4, 0x47, 0x27, 0x73, 0xba, 0x8f, 0x7d, 0x1f, 0xe8, 0xad, 0x6d, 0xb4, 0x3d, 0xb4, 0x8b, 0x03, 0x94, 0x20, 0x33, 0x88, 0xcc, 0x68, 0xcd, 0x9d, 0x25, 0xd7, 0x50, 0xec, 0xed, 0x97, 0x05, 0x2a, 0x5d, 0x0f, 0x8e, 0x03, 0xbe, 0x6f, 0x26, 0x50, 0xcf, 0x88, 0x2a, 0x90, 0x6b, 0xe2, 0xd9, 0x96, 0x67, 0x08, 0x58, 0x7f, 0xba, 0x27, 0xf8, 0xe7, 0xe0, 0xd7, 0xbc, 0x5d, 0x80, 0x39, 0x16, 0x13, 0x4c, 0x42, 0xf2, 0xda, 0x28, 0x56, 0xf5, 0x4e, 0x8f, 0x19, 0x07, 0x4e, 0x33, 0x82, 0x0f, 0xb0, 0xe4, 0x31, 0xfd, 0x32, 0xb3, 0x02, 0x0e, 0xb3, 0x57, 0xe2, 0x4b, 0xa3, 0xd0, 0xe1, 0x54, 0xb8, 0x4a, 0x89, 0x5b, 0xe2, 0x43, 0x6e, 0x73, 0x82, 0xf0, 0x07, 0x0b, 0xd7, 0xdd, 0xbc, 0xb5, 0xb8, 0xd5, 0x40, 0x2d, 0x89, 0x01, 0x21, 0x96, 0x68, 0x53, 0x9e, 0x06, 0xa7, 0x26, 0xb8, 0x45, 0x7f, 0x1e, 0x8c, 0xd2, 0x02, 0x56, 0xdf, 0x27, 0x52, 0xba, 0xfb, 0x3e, 0x11, 0xb1, 0xba, 0x54, 0x18, 0x00, 0xe0, 0xed, 0x6c, 0xeb, 0xad, 0x18, 0x6d, 0x9c, 0xb3, 0xf4, 0x51, 0xc9, 0xe6, 0x73, 0xd1, 0x92, 0xf2, 0x5e, 0x22, 0xa8, 0xd1, 0x9a, 0x27, 0xb4, 0x9c, 0xa9, 0xe5, 0xf7, 0xa1, 0x73, 0x37, 0x2d, 0xb7, 0x47, 0xc3, 0xb8, 0xce, 0x1d, 0x2c, 0xfa, 0xca, 0x1e, 0x8a, 0x03, 0x92, 0x66, 0x17, 0x6c, 0x63, 0x08, 0x2a, 0x82, 0x6b, 0x52, 0x6a, 0xa8, 0x93, 0x53, 0x3b, 0xf6, 0x9c, 0x9b, 0x7d, 0x26, 0x6d, 0x42, 0x76, 0xb1, 0xab, 0x2c, 0x0c, 0x35, 0x8b, 0x8a, 0x38, 0x1a, 0xe4, 0xa4, 0xb7, 0x75, 0x89, 0xd7, 0x03, 0x2c, 0xd5, 0xd9, 0x81, 0x5c, 0x87, 0x45, 0xfc, 0xf7, 0xd0, 0x53, 0x52, 0xb2, 0xab, 0xe6, 0x6d, 0x1e, 0x6d, 0xcd, 0x75, 0x14, 0x9d, 0x42, 0x44, 0x57, 0x05, 0xb7, 0x1b, 0x75, 0x09, 0xd3, 0x93, 0xee, 0x38, 0xb7, 0xd6, 0x98, 0x21, 0x85, 0x0e, 0x42, 0x68, 0x23, 0x1e, 0x98, 0x19, 0x3c, 0x91, 0x47, 0x3b, 0x88, 0xcf, 0x61, 0xa9, 0x4e, 0x97, 0x02, 0x1d, 0x27, 0xa9, 0x34, 0x8e, 0x04, 0xc3, 0x10, 0xbc, 0x72, 0xcf, 0x26, 0x09, 0x1d, 0x5b, 0x1f, 0x8a, 0x93, 0x49, 0xa1, 0x5e, 0x4b, 0xc8, 0x73, 0x3e, 0xe6, 0x83, 0xe2, 0x56, 0xb4, 0x18, 0x63, 0x53, 0x7a, 0xcb, 0x79, 0xbe, 0x73, 0x7c, 0xd9, 0x88, 0x94, 0xd6, 0xcd, 0xe6, 0x14, 0xca, 0xd6, 0x5f, 0x2c, 0x3b, 0x95, 0x22, 0x1c, 0xfb, 0xeb, 0x9e, 0x6e, 0xf7, 0x60, 0x4d, 0x7e, 0xae, 0xc1, 0xd0, 0x3a, 0xe8, 0x0d, 0x41, 0x27, 0xa4, 0x93, 0xc5, 0xa5, 0x52, 0x54, 0x60, 0x73, 0x42, 0xae, 0x0e, 0x75, 0x5d, 0x3c, 0x0f, 0xb5, 0x13, 0xf8, 0x82, 0xa9, 0x94, 0xa2, 0x35, 0xb4, 0x43, 0x66, 0xbc, 0xee, 0x67, 0xb9, 0xc0, 0x28, 0x24, 0x84, 0x9a, 0x2b, 0xab, 0x84, 0x20, 0x41, 0xad, 0xf0, 0xbf, 0xf7, 0x15, 0x5d, 0xcb, 0x20, 0xf6, 0xe0, 0x12, 0x1d, 0xc2, 0x72, 0xb7, 0x5c, 0xbe, 0x98, 0x3e, 0x1f, 0xb2, 0x43, 0xe3, 0x7f, 0xe5, 0xf4, 0x30, 0xb0, 0x48, 0x25, 0xce, 0x86, 0xf2, 0xe5, 0x9c, 0x38, 0xcc, 0xc2, 0xfe, 0x65, 0x8e, 0xeb, 0x78, 0x54, 0xea, 0x96, 0x7b, 0x80, 0x06, 0xa0, 0x7e, 0x54, 0x30, 0x73, 0x51, 0x33, 0xce, 0x2d, 0xae, 0xbb, 0x93, 0xff, 0x12, 0x4b, 0xf9, 0xd2, 0xca, 0xc2, 0xeb, 0x31, 0x51, 0x8a, 0xc1, 0x63, 0xd9, 0xd6, 0x72, 0xd7, 0x28, 0x27, 0x05, 0xc6, 0xa5, 0x15, 0x49, 0x13, 0xb3, 0x4c, 0xc6, 0x76, 0x3d, 0xd5, 0xf3, 0xd9, 0x92, 0x97, 0xaa, 0x02, 0x74, 0x1d, 0xd8, 0x73, 0x6b, 0x99, 0x79, 0x8e, 0x60, 0x29, 0xc4, 0xfd, 0x66, 0x5a, 0xa2, 0x51, 0xdb, 0xeb, 0x65, 0xe9, 0xb0, 0xd3, 0xb7, 0x16, 0x05, 0x84, 0xd0, 0x7c, 0xf9, 0x72, 0xed, 0xbc, 0xc0, 0xcf, 0xfd, 0x50, 0xf6, 0x99, 0x9d, 0xb6, 0x32, 0xd7, 0x46, 0xd0, 0xdf, 0x20, 0xc5, 0x8b, 0x47, 0x5c, 0xec, 0xbf, 0xf1, 0xcf, 0x88, 0x56, 0x2d, 0x53, 0x93, 0xb1, 0xed, 0xe4, 0xaa, 0x47, 0xd6, 0x62, 0xc1, 0x8f, 0x97, 0x93, 0x15, 0x21, 0x7a, 0x68, 0x62, 0x18, 0x38, 0x81, 0x56, 0xba, 0x12, 0xf2, 0x46, 0x5b, 0x1d, 0x48, 0x21, 0x7e, 0xde, 0xc7, 0xa2, 0x3e, 0x16, 0xf6, 0xc9, 0xec, 0xdf, 0x5e, 0x8b, 0xfa, 0xf8, 0x8e, 0xc9, 0x17, 0x5e, 0x62, 0x7f, 0x9c, 0x1c, 0x85, 0x3e, 0x27, 0x63, 0x35, 0xdc, 0x85, 0xdd, 0x46, 0x6a, 0xd6, 0x3f, 0x6a, 0x66, 0xeb, 0x1e, 0xaf, 0x32, 0xf3, 0x03, 0x49, 0xc5, 0x57, 0xc1, 0x92, 0xa1, 0xe2, 0x06, 0x4f, 0x04, 0x25, 0x31, 0x35, 0x63, 0x1a, 0x63, 0xac, 0x14, 0x07, 0xd9, 0xd2, 0x4b, 0xa5, 0x79, 0xc3, 0x47, 0x82, 0xaa, 0x18, 0xcd, 0xa4, 0x69, 0xad, 0xd6, 0x6f, 0x9a, 0xa8, 0x85, 0xc9, 0x9b, 0xb6, 0x5b, 0x7b, 0x1f, 0x98, 0xae, 0xda, 0x3a, 0xdf, 0x57, 0xa8, 0xb8, 0xf3, 0xac, 0x35, 0xb3, 0x5a, 0xae, 0xc9, 0x65, 0x37, 0x83, 0x46, 0x3a, 0x11, 0x26, 0x0a, 0x29, 0xd6, 0x5d, 0x13, 0x45, 0x20, 0xeb, 0x66, 0x8f, 0xb6, 0x07, 0xb1, 0x0f, 0x56, 0x0e, 0x2f, 0x23, 0xb2, 0x75, 0xcc, 0x16, 0xb8, 0x01, 0x8a, 0xf4, 0x16, 0x3a, 0x23, 0x9d, 0xfe, 0x1d, 0xf0, 0x19, 0x26, 0x11, 0x09, 0x2b, 0x14, 0x1c, 0xae, 0x29, 0x98, 0x57, 0xe5, 0x0a, 0x9a, 0x9f, 0x65, 0xc1, 0x15, 0x8e, 0xb3, 0xca, 0x64, 0xa9, 0x8b, 0x02, 0xbd, 0xdb, 0x81, 0xbb, 0xfb, 0x23, 0xe8, 0x10, 0xa0, 0x89, 0xf3, 0x76, 0x1a, 0x56, 0x1a, 0x94, 0x45, 0x84, 0xbf, 0x55, 0x32, 0x74, 0x12, 0x3b, 0x27, 0xdf, 0x32, 0xf6, 0xe6, 0x0f, 0x95, 0x35, 0x32, 0x4f, 0xa9, 0xbc, 0x90, 0xa0, 0xbb, 0xb6, 0x4b, 0xad, 0x19, 0x4d, 0xba, 0x01, 0x73, 0x79, 0xc5, 0x78, 0x87, 0x15, 0xa6, 0xf3, 0xfe, 0x38, 0xed, 0x50, 0x90, 0xc2, 0xc7, 0x9a, 0x6f, 0x35, 0x7f, 0x7c, 0xe3, 0xc7, 0x45, 0xfc, 0x31, 0xb5, 0x2f, 0x66, 0xc2, 0xd9, 0x7d, 0x85, 0x81, 0x7f, 0x21, 0x19, 0x85, 0x75, 0x7f, 0x86, 0xf0, 0x61, 0x71, 0xca, 0x17, 0x57, 0x8e, 0xb1, 0xe3, 0xab, 0xac, 0x4c, 0x77, 0x04, 0xa3, 0x9f, 0x12, 0xb2, 0x54, 0x9a, 0x37, 0x42, 0xea, 0x4b, 0x0c, 0x4f, 0x60, 0x51, 0x01, 0x9b, 0x44, 0x94, 0xb1, 0x5e, 0xba, 0x33, 0x0d, 0xdd, 0xc3, 0xbe, 0xb7, 0x3f, 0xbf, 0xa6, 0xac, 0x9c, 0x31, 0xf1, 0x26, 0x58, 0xc3, 0x32, 0xc1, 0xaf, 0x8a, 0xb9, 0xdc, 0x90, 0x8a, 0x07, 0x42, 0xaf, 0x7d, 0x85, 0x0a, 0xd6, 0xd0, 0x75, 0xbb, 0x7b, 0xef, 0x28, 0xb4, 0x98, 0xc2, 0x71, 0xcb, 0xb7, 0x77, 0x5b, 0x35, 0x4c, 0x83, 0x17, 0xa6, 0x48, 0xe3, 0x38, 0xb8, 0xeb, 0xa8, 0x23, 0x91, 0xda, 0xb2, 0xc0, 0xc0, 0x71, 0xbc, 0x76, 0x69, 0x5a, 0x99, 0x57, 0xa2, 0x5f, 0xbc, 0x97, 0x1c, 0x7c, 0xfe, 0x43, 0x06, 0x39, 0x9c, 0x2f, 0x2e, 0x37, 0x7f, 0x31, 0x6a, 0x08, 0xc1, 0x8c, 0x36, 0x43, 0x6c, 0xaf, 0x9e, 0xd8, 0x85, 0x20, 0x5f, 0xa2, 0x49, 0xb3, 0x49, 0x3b, 0xb6, 0xff, 0xe7, 0x14, 0x4d, 0x12, 0x62, 0xc5, 0x17, 0x64, 0xa3, 0xa1, 0xe6, 0x0a, 0xb8, 0x8e, 0xdd, 0x2c, 0x79, 0x14, 0x32, 0xb9, 0x6b, 0xb3, 0x33, 0x59, 0xe4, 0x7a, 0x87, 0xa4, 0x70, 0xd5, 0xb7, 0x91, 0x74, 0xa7, 0xed, 0x31, 0x11, 0x98, 0xfb, 0x9d, 0x4b, 0xb1, 0x9e, 0x2d, 0x6b, 0x26, 0x04, 0xea, 0xa1, 0x72, 0x8d, 0x46, 0xee, 0xa9, 0xcf, 0x0b, 0x41, 0x0a, 0xdc, 0x92, 0xe1, 0xd4, 0xc7, 0x35, 0x0a, 0x5c, 0x64, 0x06, 0xdb, 0x5b, 0x50, 0xc2, 0x70, 0x8c, 0x31, 0x00, 0x4b, 0x77, 0x3f, 0xae, 0xf8, 0x87, 0x04, 0xbe, 0xf0, 0x63, 0x5f, 0x1d, 0xbf, 0x7b, 0xcf, 0xe5, 0x62, 0xe1, 0xee, 0xd3, 0xf3, 0x5b, 0x3c, 0xfb, 0x88, 0xb6, 0x1e, 0xba, 0x58, 0x5d, 0x27, 0xed, 0x1f, 0x2a, 0x95, 0x60, 0xc4, 0x7b, 0x1f, 0x8a, 0x39, 0x89, 0xee, 0x77, 0xa4, 0xf5, 0xe9, 0x05, 0xbc, 0xa4, 0x35, 0x53, 0x75, 0xcd, 0xfc, 0x77, 0xdf, 0x50, 0x6e, 0x6f, 0x4b, 0x4a, 0x06, 0x5a, 0xb1, 0xe6, 0x0f, 0xe9, 0x4e, 0x76, 0x66, 0x10, 0x91, 0xc2, 0x81, 0x01, 0x38, 0x9f, 0xb0, 0x5a, 0xb7, 0xc4, 0xa3, 0x9d, 0xd9, 0xda, 0x2d, 0xe2, 0xa9, 0xd2, 0x47, 0xc8, 0x93, 0x7b, 0x58, 0xb1, 0xc7, 0x54, 0xb4, 0x2f, 0xde, 0x9f, 0x62, 0xb9, 0xc0, 0xb6, 0x22, 0xa3, 0xc5, 0xa2, 0xae, 0x4d, 0x1a, 0xea, 0x41, 0x9a, 0x67, 0xa9, 0x56, 0xa3, 0xae, 0xe3, 0xb2, 0xad, 0x77, 0x19, 0xa4, 0x59, 0x2a, 0x1b, 0x8c, 0x1b, 0xbc, 0x1e, 0x9a, 0xed, 0x8d, 0x0e, 0xd8, 0x45, 0x91, 0x26, 0x6b, 0x44, 0xaf, 0xbd, 0x16, 0x30, 0x66, 0x63, 0xff, 0x24, 0xb6, 0x2c, 0xb6, 0x06, 0x3e, 0x4c, 0x73, 0xba, 0xa2, 0xe4, 0x9f, 0x95, 0x2f, 0x1c, 0x96, 0x15, 0xc2, 0x72, 0xac, 0xcf, 0xe5, 0x52, 0x6e, 0xa8, 0x3c, 0xe6, 0x2a, 0x48, 0x20, 0x2f, 0xb1, 0xcc, 0x89, 0x55, 0x5b, 0xbb, 0x31, 0x3b, 0x4c, 0x3c, 0xf6, 0x57, 0xf6, 0x86, 0x80, 0xc1, 0xdf, 0x97, 0x25, 0x89, 0xa4, 0x29, 0x09, 0x4e, 0x3f, 0xe2, 0x8a, 0x0c, 0x85, 0xcb, 0xdb, 0x36, 0xf2, 0x03, 0xee, 0x05, 0xa9, 0xb5, 0x98, 0x0f, 0xb7, 0x47, 0xf0, 0x1b, 0x98, 0xd4, 0xf8, 0x34, 0xfc, 0xdd, 0x7f, 0xfc, 0xcb, 0x3b, 0x45, 0x43, 0x66, 0x58, 0x61, 0xd8, 0x30, 0x9f, 0xe0, 0x9f, 0x4d, 0x31, 0xaf, 0xe4, 0xa9, 0xda, 0xbb, 0xef, 0x3c, 0x43, 0x56, 0xd9, 0x8d, 0x69, 0xdd, 0x9e, 0x75, 0x4d, 0x97, 0x72, 0x26, 0xee, 0xe1, 0x59, 0x6b, 0x74, 0x88, 0xf2, 0x32, 0xae, 0x77, 0x93, 0x47, 0xbe, 0x92, 0x9b, 0x62, 0x13, 0xe1, 0x04, 0x64, 0x98, 0xf1, 0x38, 0xde, 0x2b, 0x77, 0x26, 0xd3, 0x51, 0x37, 0x94, 0xbf, 0x28, 0x24, 0xb7, 0xd7, 0x9d, 0xc9, 0x01, 0x93, 0xde, 0xe7, 0x3a, 0x6a, 0x13, 0x60, 0xd2, 0xdc, 0x49, 0x53, 0x76, 0xb6, 0xae, 0x89, 0xe1, 0x92, 0x04, 0x10, 0xf5, 0x9d, 0x50, 0x25, 0x0a, 0x9d, 0xd2, 0x58, 0x86, 0x32, 0x3a, 0xea, 0xad, 0x5b, 0x19, 0x7a, 0xbb, 0x3d, 0x96, 0xe0, 0x30, 0x20, 0x62, 0x5a, 0x6c, 0xbb, 0xee, 0xe6, 0x7b, 0xb1, 0xdb, 0xee, 0x32, 0x5b, 0xb2, 0x2a, 0x7b, 0xc8, 0xd5, 0xc3, 0xed, 0x02, 0xb5, 0xb4, 0xa0, 0x93, 0x46, 0x76, 0x3f, 0x48, 0xb0, 0xdc, 0x5e, 0x35, 0x48, 0x3c, 0x0e, 0xf9, 0xbe, 0xcf, 0xaf, 0x44, 0x97, 0x5a, 0x06, 0x96, 0xde, 0x0e, 0x90, 0x49, 0x17, 0xad, 0x15, 0xd1, 0x75, 0xef, 0x7f, 0x43, 0x4d, 0x24, 0xed, 0x14, 0xc9, 0x1a, 0x04, 0x23, 0xe1, 0x41, 0x85, 0xfa, 0x87, 0x0d, 0x25, 0x51, 0x22, 0x9c, 0x99, 0xd4, 0x3e, 0x99, 0xf0, 0x27, 0x82, 0x60, 0x25, 0x26, 0xe2, 0x63, 0xf5, 0x71, 0x16, 0xcc, 0xee, 0x28, 0x4a, 0x64, 0xc9, 0xf3, 0x17, 0xb3, 0xf9, 0x46, 0xb2, 0x69, 0x84, 0xe3, 0x63, 0xfc, 0x12, 0xa0, 0x39, 0x93, 0x43, 0x6a, 0xfd, 0x23, 0x46, 0x8a, 0x64, 0xd7, 0xa8, 0x27, 0x88, 0xb6, 0x69, 0x0c, 0x99, 0x80, 0x55, 0xac, 0xd0, 0xd8, 0x91, 0x63, 0xa5, 0xa8, 0x75, 0xff, 0x42, 0xc2, 0x99, 0x7f, 0x37, 0xc3, 0x33, 0x1b, 0x6f, 0x3d, 0xa0, 0x84, 0x63, 0x15, 0x40, 0x6c, 0x8d, 0x29, 0x87, 0x49, 0x20, 0x36, 0x51, 0x56, 0xf6, 0xfa, 0x76, 0xdb, 0xca, 0x95, 0x9f, 0xaf, 0xa7, 0x35, 0x58, 0xfb, 0xa0, 0xf2, 0x66, 0x40, 0xc2, 0xf7, 0x5a, 0x9c, 0x47, 0xe3, 0x66, 0x49, 0x0c, 0x6f, 0x70, 0x66, 0x46, 0x50, 0x65, 0xfa, 0x70, 0x5f, 0xd0, 0x36, 0x88, 0xf7, 0xab, 0xfa, 0x7a, 0x9e, 0x74, 0x9b, 0xdd, 0xe8, 0x84, 0xe4, 0xdd, 0x99, 0x9d, 0x5a, 0x78, 0x0a, 0xc2, 0xc4, 0xee, 0xce, 0x4b, 0xeb, 0x72, 0x94, 0x38, 0x9f, 0x26, 0x4f, 0xc6, 0xfa, 0x46, 0x95, 0x40, 0xe9, 0xa3, 0x45, 0x18, 0xe7, 0x54, 0x6d, 0x36, 0x0c, 0xa8, 0x6b, 0x90, 0x47, 0x5f, 0x52, 0xfb, 0xe8, 0x19, 0x8f, 0x40, 0x61, 0x0e, 0xcc, 0x73, 0x4d, 0x00, 0x14, 0x80, 0xb1, 0x6e, 0x38, 0x07, 0x82, 0x0b, 0x72, 0x6a, 0x68, 0x6e, 0x49, 0x24, 0xc2, 0x0b, 0xb4, 0x5c, 0xea, 0x62, 0x82, 0xb9, 0xba, 0x76, 0xf9, 0x79, 0x4f, 0x81, 0xbe, 0xbd, 0x0c, 0xe6, 0xf5, 0x27, 0xe2, 0x67, 0xa8, 0xa7, 0xcf, 0x98, 0x6d, 0x92, 0xa5, 0x93, 0x43, 0xf5, 0x0d, 0xee, 0xbe, 0x28, 0xcb, 0xea, 0x64, 0xa6, 0x44, 0xed, 0x56, 0x1b, 0x3d, 0x33, 0x33, 0xbf, 0xe5, 0xc0, 0x39, 0xe3, 0x16, 0x99, 0xad, 0xc9, 0xd8, 0x33, 0x7d, 0xb9, 0x27, 0x2c, 0x25, 0x51, 0xf6, 0x39, 0xcf, 0x1d, 0x73, 0x60, 0xbe, 0x68, 0x8d, 0x67, 0xec, 0x51, 0xb3, 0x8c, 0xf2, 0x21, 0xdf, 0x76, 0x29, 0xdb, 0xd4, 0x6c, 0x0f, 0x15, 0xa4, 0xc5, 0xec, 0x07, 0x74, 0x9f, 0xb5, 0xe2, 0x83, 0xd4, 0x30, 0x63, 0x69, 0x2a, 0x59, 0xa7, 0x9d, 0xca, 0x05, 0x41, 0x3a, 0xf4, 0xc5, 0x8a, 0x03, 0xf0, 0x0d, 0x38, 0xa4, 0x48, 0x95, 0x32, 0x3b, 0x34, 0x00, 0xa3, 0x16, 0x56, 0xbc, 0x4d, 0xbe, 0xa7, 0x29, 0x21, 0x35, 0xb2, 0xfd, 0x0c, 0x7d, 0x00, 0xe7, 0x13, 0x59, 0xd3, 0x72, 0xa2, 0x58, 0x17, 0x2d, 0x21, 0x0e, 0x95, 0x09, 0xc9, 0xa5, 0x6a, 0x02, 0xb6, 0x95, 0xb7, 0x01, 0x3d, 0xaf, 0x9b, 0x01, 0x7f, 0x60, 0x5e, 0x71, 0x3e, 0x34, 0xef, 0xda, 0xf0, 0x99, 0x91, 0xc2, 0x12, 0xe6, 0xd1, 0xd0, 0xbf, 0x9b, 0xbb, 0x31, 0x81, 0xea, 0x4d, 0x39, 0x67, 0x77, 0x2c, 0x4e, 0x58, 0x5d, 0x96, 0x02, 0xa6, 0x71, 0x98, 0x7f, 0xe6, 0xca, 0x81, 0x28, 0x00, 0x81, 0x96, 0x7d, 0x82, 0xb5, 0x07, 0x3f, 0x3a, 0xd2, 0x22, 0xd5, 0x03, 0x13, 0xc7, 0xef, 0xdf, 0x46, 0x1c, 0x69, 0x46, 0xd0, 0x81, 0x72, 0xbe, 0xf0, 0xc7, 0xed, 0xac, 0x48, 0x9c, 0x17, 0x6a, 0x99, 0x4a, 0x6b, 0x99, 0xce, 0xa2, 0xc3, 0xb9, 0x3c, 0x32, 0xbf, 0xf7, 0x28, 0xbf, 0x6a, 0x45, 0x89, 0xef, 0x1b, 0xb0, 0x10, 0x45, 0x9a, 0xee, 0x66, 0x52, 0x84, 0x37, 0xb5, 0x2a, 0xf1, 0x57, 0x69, 0x16, 0x53, 0x00, 0x38, 0x88, 0xa2, 0x64, 0x5f, 0x54, 0xb6, 0x03, 0x2f, 0x1c, 0xf4, 0xc2, 0xc9, 0x0c, 0x2c, 0x3e, 0x26, 0xc8, 0xc2, 0x5f, 0x5a, 0xa3, 0x0c, 0x30, 0x19, 0x12, 0xfc, 0xee, 0x7a, 0x60, 0xff, 0x5f, 0xfb, 0xa3, 0x24, 0x64, 0xc5, 0xee, 0x81, 0xd2, 0x32, 0xc8, 0xd3, 0x7e, 0x8d, 0xdd, 0x64, 0x97, 0x19, 0xf4, 0x32, 0x39, 0x54, 0x21, 0x4d, 0x3e, 0x7c, 0x3c, 0x81, 0x58, 0x53, 0x91, 0x35, 0x5d, 0x20, 0xd9, 0x93, 0xe1, 0xf6, 0x6a, 0xe9, 0x0a, 0x38, 0xaa, 0x4f, 0xa0, 0x5d, 0xc9, 0x8b, 0x64, 0xf1, 0xb0, 0x31, 0xa3, 0xdc, 0x34, 0x0f, 0x0a, 0xe7, 0x90, 0xc7, 0xbc, 0x7c, 0x12, 0xbe, 0xa2, 0xad, 0x14, 0x35, 0x02, 0x79, 0x2e, 0xb6, 0x54, 0x4a, 0xaa, 0xb2, 0x51, 0xc1, 0x38, 0x68, 0x4c, 0xb6, 0xe3, 0x08, 0xc5, 0x7b, 0x44, 0x19, 0x3c, 0x61, 0xf6, 0x18, 0x43, 0x7e, 0x4a, 0x62, 0xd7, 0xad, 0x3b, 0x54, 0xf0, 0xd5, 0xa4, 0xb0, 0x57, 0x6f, 0xb0, 0x42, 0xb8, 0x42, 0x92, 0xc4, 0xf8, 0x71, 0x77, 0x00, 0xc8, 0xb8, 0xb9, 0x34, 0x7b, 0xf3, 0x56, 0xba, 0x14, 0xe0, 0xa0, 0xe8, 0xa4, 0x25, 0x36, 0x36, 0xd3, 0x95, 0x32, 0x9e, 0xbc, 0xaf, 0xa4, 0x49, 0xfe, 0x67, 0x40, 0x67, 0x0f, 0x2a, 0x53, 0x5f, 0xd4, 0x1c, 0xfc, 0x28, 0x6f, 0xa4, 0x98, 0xf6, 0x59, 0x2a, 0x7e, 0x1a, 0xb0, 0x1f, 0xed, 0x23, 0xd2, 0x3e, 0x42, 0x4a, 0x2a, 0x12, 0x6e, 0x0d, 0x4a, 0xb9, 0xa8, 0x19, 0x3a, 0xe7, 0x5f, 0x6d, 0x10, 0x2e, 0x73, 0xbd, 0xc1, 0x7c, 0xa4, 0x14, 0x37, 0xe5, 0x4b, 0xbe, 0xa4, 0xa2, 0x48, 0x65, 0x15, 0x5a, 0x3b, 0x7a, 0x4a, 0xa1, 0xf7, 0xd7, 0xc5, 0xbf, 0x33, 0xa2, 0x21, 0xb2, 0x83, 0x74, 0xa5, 0x76, 0x87, 0xba, 0x19, 0x83, 0x62, 0x5c, 0xd8, 0x98, 0x6e, 0x9d, 0x27, 0xb7, 0x2f, 0x43, 0xc5, 0x70, 0x85, 0xf7, 0xc4, 0x63, 0x25, 0xee, 0x96, 0x01, 0x49, 0xc9, 0x6b, 0x92, 0xa7, 0xba, 0xbb, 0x7c, 0xa0, 0xe9, 0x1e, 0xc2, 0xbb, 0x16, 0x64, 0xcb, 0x51, 0x7f, 0xe2, 0x65, 0x8a, 0x04, 0x0a, 0x09, 0x88, 0x89, 0x3f, 0x61, 0xe1, 0x9c, 0xe7, 0x07, 0x53, 0x57, 0xc1, 0x90, 0xb3, 0x88, 0x78, 0xc9, 0x27, 0x10, 0x79, 0x40, 0x95, 0x89, 0x02, 0x06, 0x5b, 0x2c, 0x7c, 0xb4, 0x41, 0xf1, 0x0b, 0xac, 0xab, 0xf7, 0x63, 0xa1, 0x14, 0x27, 0xdd, 0x5a, 0xb7, 0x15, 0xca, 0xb2, 0x8f, 0x26, 0x07, 0xe4, 0x82, 0xf8, 0xd2, 0x05, 0xda, 0xfe, 0xdb, 0xd2, 0xf4, 0x6b, 0x9e, 0xac, 0x3c, 0x52, 0xf1, 0xe1, 0x59, 0x0b, 0xd9, 0x2d, 0xa4, 0xd8, 0xa2, 0x81, 0xdf, 0xc8, 0x2f, 0x02, 0x24, 0xdc, 0x8e, 0x55, 0x1b, 0x69, 0xcf, 0x1a, 0x70, 0xbd, 0x17, 0xb6, 0x84, 0x05, 0xf0, 0x56, 0x63, 0x6f, 0xe3, 0x31, 0xf7, 0x8b, 0x49, 0x0d, 0x7b, 0xf7, 0x5e, 0x04, 0x31, 0x3b, 0x97, 0x88, 0x58, 0xf2, 0x36, 0xa5, 0x59, 0x2b, 0x1b, 0x86, 0x41, 0x0e, 0xdd, 0x3b, 0x73, 0xc3, 0x19, 0xb9, 0x9f, 0x8f, 0x0a, 0x22, 0xee, 0x40, 0x5a, 0x47, 0x7f, 0xcc, 0x38, 0x6c, 0x17, 0x35, 0xab, 0x4b, 0x14, 0xaf, 0x26, 0x5b, 0xa3, 0x05, 0x5c, 0x51, 0x33, 0x39, 0x55, 0xe7, 0x2a, 0x6b, 0xc2, 0xdd, 0xd6, 0xfb, 0x8e, 0x3e, 0xa6, 0xf2, 0xb5, 0xe5, 0x9a, 0x9e, 0x59, 0x3f, 0xf8, 0x7d, 0x13, 0x53, 0x41, 0x5d, 0x87, 0xff, 0x63, 0xc0, 0x3b, 0x84, 0x30, 0x85, 0xa9, 0x45, 0x0f, 0xc5, 0x92, 0xcb, 0xf1, 0xfc, 0x96, 0x0d, 0x87, 0x69, 0x02, 0xee, 0xb3, 0xb7, 0xe9, 0x08, 0x3c, 0xdc, 0x76, 0xa8, 0xc5, 0x42, 0x80, 0x19, 0x00, 0x24, 0x5f, 0x26, 0x1f, 0x3c, 0xfe, 0xda, 0x8b, 0x9b, 0x32, 0x8a, 0xd9, 0xd8, 0x4a, 0x16, 0xfa, 0x6c, 0xe8, 0x6b, 0xb1, 0x5d, 0x0f, 0x4c, 0x4a, 0x1a, 0x7c, 0x53, 0x8a, 0xa6, 0x3a, 0x32, 0xe2, 0xf9, 0x71, 0x3f, 0xe7, 0xa4, 0x7f, 0x30, 0x07, 0xb3, 0x49, 0x22, 0x74, 0xd7, 0xd3, 0xe1, 0x65, 0xc5, 0x0f, 0x63, 0x7e, 0xd9, 0xf3, 0x95, 0x8c, 0xff, 0xce, 0x5b, 0x76, 0xd3, 0xdc, 0xd1, 0x71, 0x07, 0x18, 0xd8, 0x72, 0x05, 0x51, 0xce, 0xe9, 0xd6, 0x80, 0x9c, 0xac, 0x43, 0x59, 0xf6, 0x31, 0x3a, 0x20, 0xde, 0x01, 0x73, 0xbe, 0x6a, 0x69, 0x52, 0x14, 0xc8, 0x73, 0x10, 0x8f, 0x7f, 0x15, 0x16, 0xfd, 0xf7, 0xa7, 0xa9, 0x9f, 0x3c, 0x9a, 0xcc, 0x7f, 0xff, 0x68, 0x62, 0x03, 0xde, 0xc7, 0x94, 0xc3, 0xe5, 0x22, 0x72, 0x98, 0x54, 0x49, 0xdd, 0xf5, 0xa2, 0x68, 0xa4, 0x7b, 0xc3, 0x36, 0xed, 0xc7, 0xa7, 0x6e, 0xd7, 0x8f, 0x03, 0x83, 0x5d, 0xed, 0x53, 0x90, 0x7e, 0xfa, 0x20, 0x8d, 0x9a, 0x9f, 0x7e, 0xc9, 0x20, 0xa8, 0xda, 0x94, 0x66, 0x1a, 0xf2, 0x3c, 0xd8, 0xc7, 0x25, 0x3c, 0x55, 0x1f, 0xed, 0xaf, 0xd6, 0x49, 0xaa, 0x0b, 0x51, 0x73, 0xa1, 0x0b, 0xdd, 0x66, 0x44, 0xed, 0x16, 0x5d, 0xb4, 0xde, 0xc3, 0x17, 0x84, 0xb3, 0xb6, 0x2b, 0xc0, 0xd9, 0xf4, 0x9c, 0x2d, 0x8f, 0x16, 0xad, 0xd3, 0x52, 0xef, 0xf6, 0xb9, 0x99, 0x6f, 0xb8, 0xf0, 0xc3, 0xc7, 0x6e, 0xd2, 0x4e, 0xce, 0xa4, 0x8c, 0x49, 0xa4, 0x0c, 0xda, 0x0c, 0x95, 0xcf, 0x12, 0x26, 0x40, 0x21, 0x64, 0x97, 0xf8, 0x18, 0x60, 0x40, 0x6a, 0xbe, 0xb8, 0x97, 0x80, 0x65, 0x48, 0x9f, 0x86, 0x3a, 0x53, 0x18, 0x8c, 0x1d, 0x10, 0xf2, 0x0b, 0xb0, 0x65, 0x08, 0xcb, 0xae, 0xf2, 0x0b, 0x03, 0x7f, 0x51, 0xbc, 0xc3, 0x09, 0x9c, 0x5f, 0x8f, 0xc8, 0x30, 0x6c, 0x4c, 0x21, 0xb1, 0x87, 0x61, 0xf3, 0x4f, 0xb2, 0x16, 0x70, 0x47, 0xc2, 0x3f, 0x2b, 0xac, 0x0f, 0x1f, 0x71, 0x67, 0x70, 0x87, 0xdd, 0x7d, 0x67, 0x3e, 0x27, 0x90, 0x98, 0xa5, 0x3d, 0xa9, 0x80, 0x9b, 0x95, 0x34, 0x63, 0x9f, 0xc1, 0x4c, 0x86, 0x34, 0x44, 0x39, 0x9f, 0x8a, 0xa4, 0x37, 0x8a, 0x5a, 0xc0, 0x79, 0x3d, 0x12, 0x64, 0x6e, 0xfe, 0x32, 0x1b, 0x43, 0xd4, 0xf6, 0x44, 0xa9, 0x3b, 0x35, 0x68, 0xd8, 0x1b, 0x89, 0xcb, 0xd4, 0xfb, 0xb0, 0x41, 0xef, 0x72, 0x32, 0x43, 0x8f, 0xdf, 0x44, 0x42, 0x31, 0x5a, 0xed, 0x3b, 0xae, 0xeb, 0x67, 0x8c, 0xbd, 0xf9, 0xc8, 0x06, 0xba, 0x05, 0xe2, 0x43, 0xa6, 0x98, 0x67, 0x3a, 0x6e, 0x79, 0x51, 0x10, 0x70, 0x24, 0x80, 0x32, 0x3b, 0x78, 0xa5, 0xa0, 0x96, 0xb0, 0x60, 0x8c, 0xc5, 0x94, 0xa5, 0x23, 0x07, 0xf0, 0x64, 0xab, 0x63, 0x46, 0x69, 0xce, 0xa4, 0xc0, 0x81, 0x35, 0xa3, 0x68, 0xde, 0x59, 0xc4, 0x9b, 0xbc, 0x96, 0xc3, 0xbb, 0x45, 0x82, 0xb1, 0x25, 0xb2, 0x7c, 0x39, 0x63, 0xb4, 0x88, 0x28, 0xa2, 0x12, 0x5a, 0x2d, 0x66, 0x93, 0xb0, 0xdc, 0x7c, 0x1e, 0xe5, 0xf9, 0x31, 0x20, 0xc3, 0xf4, 0xc1, 0x2e, 0x9a, 0xb0, 0x12, 0xec, 0x8e, 0x88, 0xa2, 0x2d, 0x35, 0x94, 0xbe, 0x5b, 0x62, 0x28, 0xf6, 0x1a, 0x3b, 0x9e, 0xcd, 0x28, 0x92, 0x56, 0xb5, 0x87, 0x72, 0xfa, 0x3a, 0xdf, 0xf7, 0x07, 0x7d, 0x1e, 0x63, 0x89, 0xe4, 0x61, 0x6f, 0x26, 0x10, 0x17, 0xdf, 0x5d, 0x0f, 0x63, 0x59, 0x10, 0xd3, 0xc3, 0x77, 0x40, 0xe3, 0xf0, 0x1b, 0x19, 0x51, 0x05, 0x03, 0x2e, 0xec, 0xe2, 0x9d, 0x05, 0xb6, 0xd3, 0x1c, 0xd6, 0x99, 0x6d, 0xcb, 0x90, 0x55, 0xb9, 0xa1, 0x1d, 0xbd, 0x95, 0x16, 0xe7, 0x23, 0x56, 0x36, 0x9b, 0x11, 0xb2, 0xf4, 0x2d, 0x3a, 0xde, 0xc0, 0x1c, 0xaf, 0xf3, 0x5c, 0xf7, 0x56, 0x96, 0xeb, 0x20, 0x99, 0xd8, 0x4b, 0xd0, 0x5b, 0x5b, 0xa4, 0x5b, 0x30, 0xb7, 0x41, 0xb5, 0xcd, 0x1b, 0x9f, 0x35, 0xbd, 0x38, 0xc4, 0x9a, 0x56, 0x5a, 0xd2, 0x4c, 0xec, 0xd8, 0xdc, 0xe4, 0x44, 0xaf, 0xf8, 0xed, 0x4b, 0x6a, 0x96, 0xec, 0x08, 0x45, 0x10, 0x9f, 0xd0, 0x91, 0x82, 0x83, 0xb9, 0x5a, 0xdb, 0x98, 0x51, 0x48, 0x34, 0x68, 0x8f, 0xc3, 0x61, 0x46, 0x09, 0x5a, 0xc6, 0xd4, 0x68, 0x66, 0x6c, 0xc8, 0x19, 0xea, 0x55, 0xef, 0x46, 0xbe, 0x0c, 0x72, 0x05, 0xed, 0x7f, 0x58, 0xcf, 0x5b, 0x11, 0x4c, 0x33, 0xab, 0xec, 0xa0, 0xcb, 0x5f, 0x94, 0x93, 0x70, 0x41, 0xc2, 0xcf, 0xaa, 0x02, 0x6f, 0x36, 0x6a, 0x22, 0x2f, 0xde, 0xfc, 0x0f, 0xc0, 0x5a, 0x37, 0x91, 0xe3, 0x3c, 0xf7, 0x65, 0x6a, 0xd7, 0xcd, 0x29, 0x93, 0x4a, 0xf4, 0x78, 0x94, 0xba, 0x87, 0x55, 0x77, 0xde, 0xf2, 0xcd, 0x28, 0xc1, 0xa7, 0xd8, 0xcd, 0xc3, 0x12, 0x81, 0x55, 0xe1, 0xce, 0x46, 0x54, 0x37, 0x19, 0xc2, 0x0e, 0xc3, 0x85, 0x89, 0xd1, 0x6c, 0xf1, 0x54, 0x89, 0x43, 0xb8, 0x5e, 0x8e, 0x08, 0x28, 0x0d, 0xc0, 0xf0, 0x36, 0xd5, 0xd6, 0xa5, 0x6f, 0x5a, 0xf3, 0x8f, 0x32, 0xd4, 0x7a, 0x52, 0x1d, 0xb8, 0x24, 0x98, 0xc5, 0x95, 0x50, 0x10, 0xaa, 0x3b, 0x9a, 0xb7, 0x6a, 0x23, 0xae, 0x56, 0x34, 0x0b, 0x5f, 0x4b, 0x80, 0xe1, 0xf3, 0x8d, 0xfd, 0xe2, 0xc1, 0xeb, 0xcb, 0x03, 0xff, 0x94, 0xeb, 0x90, 0xd5, 0xdc, 0xf4, 0x13, 0xb5, 0x3d, 0x07, 0x77, 0xef, 0x9c, 0x04, 0x6d, 0x80, 0xce, 0xfe, 0x0f, 0x2b, 0x5b, 0xed, 0xc3, 0xcc, 0x82, 0xa3, 0x63, 0xe8, 0x7d, 0x02, 0x9b, 0x88, 0x06, 0x6b, 0x92, 0x48, 0x19, 0x79, 0xcc, 0xab, 0xfc, 0xf0, 0x4f, 0xb1, 0x7d, 0xf0, 0x04, 0xac, 0x7b, 0x6f, 0x61, 0x4f, 0xa7, 0xe6, 0x45, 0x08, 0x8c, 0x49, 0x23, 0x90, 0xcd, 0x3d, 0x63, 0xc0, 0xae, 0x86, 0x05, 0xa6, 0xd6, 0xbe, 0x88, 0xd8, 0x54, 0x4d, 0x0a, 0x08, 0xdf, 0x95, 0xb0, 0xd9, 0x62, 0x6d, 0x48, 0xf1, 0xb8, 0xd1, 0x2d, 0x4f, 0xb3, 0xd7, 0x6b, 0xdf, 0x64, 0xe5, 0x24, 0x4c, 0x96, 0x22, 0x33, 0x16, 0x9c, 0x2a, 0x0e, 0xe4, 0x4d, 0x06, 0xf1, 0x1b, 0x4c, 0x5b, 0x39, 0xaf, 0x8d, 0xe1, 0x0e, 0x3a, 0x14, 0x17, 0x44, 0x4b, 0x00, 0x36, 0x83, 0x00, 0xc9, 0x63, 0xa6, 0xd7, 0xc6, 0x28, 0x62, 0xc1, 0xf2, 0x25, 0x28, 0x78, 0xef, 0x03, 0x4c, 0x13, 0x4b, 0xaa, 0x66, 0xd8, 0x03, 0xb4, 0xf9, 0x51, 0x45, 0x21, 0x52, 0xa2, 0x7a, 0x4c, 0xb3, 0x19, 0x84, 0x1d, 0xb1, 0x07, 0x44, 0x81, 0xdb, 0xce, 0x60, 0x17, 0x9c, 0x3c, 0x43, 0x2d, 0x63, 0x17, 0x65, 0xea, 0x00, 0xf9, 0xcc, 0xcc, 0x52, 0x5e, 0xd3, 0x56, 0x1f, 0xfc, 0x2a, 0x02, 0x43, 0x53, 0x1e, 0x7d, 0x0d, 0x84, 0x1a, 0x13, 0xe6, 0x66, 0x6e, 0x68, 0x33, 0xd7, 0x50, 0x6a, 0x7d, 0x50, 0x20, 0x83, 0xcf, 0xbd, 0xf1, 0x13, 0x60, 0x8b, 0x44, 0x1d, 0x72, 0x02, 0x16, 0x41, 0x7a, 0xd5, 0x1e, 0xea, 0x81, 0xf7, 0x50, 0xc8, 0xca, 0xb1, 0xa5, 0x81, 0xb5, 0xf2, 0x1e, 0xa3, 0xe3, 0xe6, 0x07, 0xde, 0x9b, 0xc9, 0x79, 0x70, 0x6d, 0xfe, 0x22, 0xe0, 0x15, 0x5b, 0x48, 0xef, 0xa2, 0xc8, 0x0c, 0xcc, 0xd7, 0x08, 0xec, 0x87, 0xd1, 0xd6, 0x8c, 0xc8, 0xea, 0x34, 0xb6, 0xc1, 0xde, 0x00, 0x9f, 0x61, 0x2c, 0xc8, 0x6c, 0xca, 0xbf, 0xdf, 0xf4, 0x06, 0xce, 0xb0, 0xc8, 0xf5, 0x01, 0x53, 0x71, 0x8a, 0xd5, 0x5e, 0xf8, 0x37, 0x41, 0xfe, 0xac, 0xa6, 0x9a, 0x46, 0x1f, 0xaa, 0xb4, 0xc6, 0x72, 0x75, 0x4a, 0x60, 0xd2, 0x0b, 0x9f, 0x57, 0x43, 0xf7, 0x66, 0xa9, 0x9c, 0x3c, 0xdf, 0x9f, 0xd3, 0x8e, 0x44, 0xa2, 0x7b, 0xc2, 0x63, 0x50, 0x8b, 0x84, 0x8c, 0xcf, 0x61, 0x48, 0xad, 0x61, 0x07, 0x83, 0xbc, 0x39, 0xb4, 0x1a, 0x55, 0x8e, 0x96, 0x1a, 0xa5, 0xed, 0xce, 0xab, 0x86, 0xd3, 0xbd, 0x3f, 0xeb, 0x7b, 0x7e, 0x0f, 0x7f, 0xf5, 0xb3, 0xc8, 0x89, 0x78, 0x85, 0x81, 0x13, 0xf9, 0xe6, 0xf1, 0x4b, 0xfc, 0x19, 0xdf, 0x29, 0xab, 0x75, 0xd9, 0x52, 0x25, 0x66, 0x29, 0x3d, 0x18, 0xb4, 0x05, 0x94, 0x92, 0x08, 0x06, 0xdd, 0x14, 0xac, 0xdc, 0x59, 0xe9, 0x92, 0x3f, 0x2c, 0xb5, 0x98, 0x28, 0xbf, 0x51, 0x0a, 0x42, 0x63, 0xd6, 0x68, 0x9b, 0x37, 0xf8, 0x6a, 0xa0, 0x4b, 0x96, 0x42, 0x48, 0x05, 0x8e, 0x21, 0x8f, 0xc4, 0xd6, 0xfc, 0x26, 0xc4, 0xc9, 0x90, 0x69, 0x42, 0xbe, 0xa4, 0x91, 0xe0, 0xdf, 0x8e, 0x2b, 0x4a, 0x39, 0xf8, 0xc9, 0x1a, 0x0f, 0xe4, 0xf7, 0xf9, 0x74, 0xee, 0x70, 0x07, 0x19, 0xd1, 0x92, 0x7e, 0x63, 0x2d, 0x10, 0x92, 0xc0, 0x88, 0xe7, 0x9b, 0x3c, 0x92, 0x93, 0x75, 0x4f, 0xad, 0x82, 0x27, 0xf9, 0xac, 0xc9, 0xc4, 0x11, 0xdb, 0x16, 0x8f, 0xdb, 0x40, 0xe5, 0x62, 0xd8, 0x21, 0xf7, 0x51, 0xe2, 0xc7, 0x00, 0x8a, 0x78, 0x81, 0xa1, 0x7f, 0x56, 0xeb, 0x95, 0x48, 0x48, 0x6f, 0x2f, 0x42, 0x41, 0x0d, 0x04, 0xfd, 0xa7, 0x58, 0xe5, 0x55, 0xf2, 0xc1, 0x10, 0xde, 0x75, 0x18, 0xa6, 0x86, 0x7b, 0x50, 0x60, 0x75, 0x96, 0x83, 0x7e, 0x38, 0x34, 0x35, 0x01, 0x1f, 0x73, 0xdd, 0x1a, 0xe3, 0x37, 0xa2, 0xe2, 0x8c, 0x79, 0x62, 0x4b, 0x92, 0xe2, 0xf8, 0x57, 0x43, 0x98, 0xbf, 0x88, 0x64, 0x58, 0x52, 0x97, 0x1b, 0xc5, 0x96, 0x69, 0x0d, 0xff, 0xfb, 0x3e, 0xc3, 0x78, 0xfe, 0x2c, 0x52, 0x03, 0xf3, 0xcc, 0x3b, 0x2e, 0x01, 0x33, 0x90, 0xd2, 0x6e, 0x23, 0x58, 0xe8, 0x1c, 0x83, 0x35, 0x9e, 0x54, 0x0d, 0x44, 0xab, 0xc3, 0x47, 0x45, 0xdf, 0xc2, 0xb4, 0xfc, 0xfe, 0xdb, 0x4b, 0xd6, 0xce, 0x88, 0x28, 0xd0, 0x6f, 0x3d, 0x82, 0x95, 0xeb, 0xa9, 0xdd, 0xe6, 0x0e, 0x3a, 0x80, 0x3f, 0x78, 0xdf, 0x2a, 0xb8, 0xf0, 0x11, 0x01, 0x29, 0xfb, 0x14, 0xcb, 0x91, 0xad, 0x7a, 0x60, 0xb9, 0xc0, 0xea, 0x5f, 0x14, 0xe3, 0x1f, 0x21, 0xea, 0x54, 0x33, 0xeb, 0xb5, 0xb1, 0x1e, 0x68, 0xcc, 0x0c, 0x7a, 0x56, 0x3e, 0x3d, 0x89, 0x7f, 0x01, 0x7c, 0x78, 0xeb, 0x4c, 0x2f, 0xe5, 0x54, 0x41, 0x00, 0xa0, 0xda, 0xcf, 0x33, 0xae, 0xf8, 0xd7, 0x36, 0x94, 0xb7, 0x8d, 0x7a, 0xd2, 0x21, 0x22, 0x82, 0xad, 0xf9, 0xa0, 0x3a, 0x31, 0xa9, 0x15, 0x89, 0x77, 0x7c, 0xf3, 0x29, 0x24, 0x0d, 0xb7, 0xb7, 0x32, 0x00, 0xc9, 0x06, 0xf3, 0xef, 0xa3, 0xb9, 0x52, 0xa7, 0x36, 0x11, 0x5d, 0x95, 0x89, 0x03, 0x00, 0x7b, 0xa4, 0x8e, 0x13, 0x67, 0xac, 0x4b, 0x98, 0xe6, 0x4f, 0x46, 0x3d, 0x75, 0x63, 0x0c, 0x29, 0x38, 0xc9, 0x05, 0xf4, 0xef, 0x98, 0x04, 0xf7, 0x25, 0x77, 0x1d, 0xc7, 0xaa, 0x4b, 0xb7, 0xfc, 0x44, 0x13, 0xe1, 0x37, 0xa2, 0x0f, 0xea, 0x63, 0x91, 0x28, 0x2b, 0x3a, 0x73, 0x8c, 0x28, 0x0b, 0xec, 0x99, 0xd8, 0xbb, 0xde, 0xfc, 0x40, 0x0b, 0x98, 0x1a, 0x47, 0x18, 0x4a, 0xaf, 0xc5, 0x28, 0xbc, 0xb4, 0xdd, 0xa3, 0x40, 0x87, 0x8d, 0x60, 0xe6, 0x46, 0x83, 0x22, 0xee, 0x7b, 0x32, 0x63, 0x83, 0xff, 0x26, 0x50, 0xa6, 0x18, 0x94, 0x14, 0x68, 0xe5, 0x36, 0x59, 0x5c, 0xfc, 0x55, 0x0c, 0x4c, 0x51, 0x28, 0x61, 0x2b, 0x5a, 0x5c, 0x18, 0x4b, 0x70, 0xf4, 0xfe, 0xd0, 0x79, 0x53, 0xb6, 0x65, 0xc4, 0x97, 0xb9, 0x2d, 0x34, 0x29, 0x9c, 0xfc, 0xa1, 0x92, 0x92, 0xc8, 0x7b, 0x91, 0x31, 0x5a, 0xb0, 0x6a, 0x79, 0x49, 0xd0, 0x80, 0x12, 0x29, 0x70, 0x26, 0xd5, 0x00, 0xcc, 0xb3, 0x8e, 0xf9, 0xb0, 0xd4, 0x00, 0x5d, 0x98, 0x27, 0x2a, 0xbe, 0x16, 0x05, 0xc9, 0x76, 0x74, 0x9f, 0x1e, 0x50, 0x9a, 0x4c, 0xf1, 0x84, 0x33, 0x21, 0xd6, 0xe9, 0x0c, 0xc3, 0xaf, 0x66, 0xbc, 0x79, 0x72, 0xa9, 0x8a, 0x85, 0x2d, 0x1c, 0x8b, 0xb5, 0x47, 0x15, 0x0b, 0x35, 0x08, 0x4e, 0x2e, 0xa7, 0x5b, 0x94, 0xd7, 0x75, 0xd3, 0xc3, 0xc9, 0x66, 0xed, 0xf1, 0x0d, 0x70, 0x95, 0xea, 0x93, 0xce, 0xeb, 0xdd, 0x1c, 0x52, 0x46, 0x54, 0x56, 0xfb, 0x79, 0x69, 0x49, 0xca, 0x56, 0x37, 0xf3, 0xd2, 0x71, 0x90, 0x2f, 0x8f, 0x27, 0xee, 0xdc, 0x78, 0xde, 0xab, 0x3a, 0xd7, 0x8d, 0x74, 0x97, 0xd9, 0x80, 0xfb, 0x2c, 0xe1, 0x55, 0xec, 0x42, 0x22, 0x4b, 0x23, 0x99, 0x6d, 0xbc, 0x1c, 0x09, 0x47, 0xe7, 0xaa, 0x6a, 0x3f, 0xf3, 0xec, 0xb2, 0x7f, 0x31, 0x7d, 0x5d, 0xa0, 0xa2, 0xec, 0x12, 0xc3, 0xb9, 0x6c, 0x83, 0xdd, 0x61, 0xcc, 0x95, 0x52, 0x42, 0xa9, 0xc1, 0xc6, 0x40, 0xe2, 0xb9, 0x2f, 0x45, 0x4c, 0x4f, 0x2f, 0x41, 0xa7, 0x93, 0xa2, 0x6f, 0xd1, 0x3c, 0x73, 0xd9, 0x3a, 0x4a, 0xb3, 0x1e, 0x98, 0xe9, 0xec, 0x73, 0xdc, 0x97, 0xb2, 0xe8, 0x64, 0x89, 0x7c, 0xed, 0x72, 0x4b, 0xb2, 0x14, 0xdd, 0xa8, 0x07, 0x18, 0x06, 0xc9, 0x09, 0x1f, 0x0e, 0xa1, 0xf6, 0x3c, 0x46, 0x88, 0xd2, 0x38, 0xe7, 0x25, 0xb6, 0x92, 0x04, 0x92, 0x6b, 0xc4, 0xbc, 0xbb, 0x38, 0xc8, 0xb4, 0x07, 0xf7, 0xdb, 0xc5, 0x3b, 0x6e, 0x81, 0xf1, 0x9b, 0xdd, 0xc9, 0x9c, 0x52, 0xd4, 0xd2, 0xf8, 0x13, 0x47, 0x8e, 0xc2, 0x01, 0xe4, 0xc6, 0x2c, 0xcc, 0xa4, 0x5e, 0x1a, 0x1d, 0xa1, 0xdb, 0x90, 0x35, 0x27, 0x22, 0x6b, 0xd1, 0x0d, 0x82, 0x50, 0x50, 0x46, 0xf5, 0xe3, 0x17, 0xb3, 0xa3, 0x39, 0x35, 0x3b, 0xa8, 0x8f, 0x43, 0x1e, 0x17, 0x3c, 0x8e, 0x86, 0x3f, 0xe4, 0x79, 0x60, 0x2d, 0xef, 0x1c, 0x69, 0x72, 0x39, 0x31, 0x8c, 0x26, 0x0b, 0x31, 0x6b, 0x2c, 0x4b, 0xba, 0x3c, 0xb8, 0xef, 0x34, 0xd6, 0x0f, 0xb7, 0xb4, 0x0b, 0x8e, 0x1c, 0x20, 0x39, 0xee, 0x84, 0x95, 0x1c, 0xc6, 0xb7, 0x05, 0xe6, 0x51, 0x96, 0x25, 0x92, 0x72, 0x0b, 0x86, 0x75, 0xf5, 0x3c, 0x01, 0x16, 0x18, 0x04, 0x59, 0x3f, 0x4a, 0xa3, 0x1c, 0x54, 0x32, 0xb4, 0xca, 0xe4, 0xf3, 0x60, 0x39, 0x7e, 0xaf, 0xd2, 0x38, 0xc6, 0x4a, 0xea, 0x73, 0xc7, 0x70, 0x36, 0x97, 0x8b, 0xd9, 0x1e, 0xb6, 0xe9, 0xcb, 0x5e, 0xec, 0x9f, 0xe1, 0xba, 0x43, 0xa1, 0x0c, 0xec, 0xd4, 0xb0, 0xd7, 0xe2, 0x2f, 0x2d, 0xef, 0x26, 0xfd, 0x30, 0xe2, 0x9e, 0xe4, 0xd5, 0x27, 0x75, 0xab, 0xd6, 0x5f, 0x59, 0x9f, 0x5f, 0xda, 0xe7, 0x35, 0x1d, 0x5d, 0x63, 0xf0, 0x99, 0x22, 0xad, 0x85, 0xc4, 0x21, 0x70, 0x3e, 0xd2, 0x8e, 0x9d, 0x9c, 0x4c, 0xa3, 0x18, 0x40, 0x61, 0x9f, 0xb1, 0x0b, 0x7e, 0x0f, 0x55, 0x85, 0x1e, 0x4c, 0x85, 0x7b, 0xe2, 0x45, 0x08, 0xed, 0xe4, 0x7e, 0xdd, 0x27, 0x49, 0x59, 0x74, 0x2d, 0x15, 0x95, 0x1e, 0x5c, 0x43, 0x14, 0xc1, 0x4f, 0x16, 0xe1, 0xd0, 0x00, 0xaa, 0x71, 0x7a, 0x2f, 0xce, 0x29, 0x22, 0x08, 0x16, 0x21, 0x10, 0x00, 0x2b, 0x28, 0x66, 0x00, 0x66, 0x08, 0x55, 0xc5, 0x9d, 0x0b, 0x90, 0x87, 0x3d, 0xbd, 0x01, 0xd8, 0x99, 0xf4, 0xbc, 0xd0, 0x82, 0x0e, 0x31, 0x67, 0x18, 0x7a, 0xa5, 0x22, 0xdf, 0x7a, 0xe3, 0xf2, 0x16, 0x26, 0x2e, 0x59, 0x44, 0xb5, 0x7b, 0xce, 0x13, 0xf8, 0xdd, 0x63, 0x61, 0x27, 0x41, 0xa5, 0x95, 0xe0, 0x5b, 0xc3, 0x2f, 0x6d, 0xe0, 0xf3, 0xa4, 0x46, 0xf6, 0x12, 0x68, 0xd6, 0xe9, 0x8a, 0x4c, 0x82, 0x1f, 0x79, 0x0a, 0xe8, 0x4e, 0x10, 0x1e, 0x64, 0xec, 0x39, 0xd8, 0xd9, 0xe7, 0x7c, 0xb0, 0xae, 0x97, 0x23, 0xd9, 0x16, 0xf1, 0x9c, 0x19, 0x95, 0xfd, 0x20, 0xd7, 0xc0, 0x8a, 0x92, 0x76, 0x44, 0x20, 0xaa, 0xe1, 0x29, 0x36, 0x52, 0x67, 0x58, 0xa5, 0x50, 0xca, 0x5b, 0x5d, 0x26, 0x92, 0x65, 0x56, 0x36, 0xa7, 0x92, 0xca, 0x2a, 0x1f, 0x6f, 0xa2, 0x93, 0x55, 0xbd, 0x2e, 0xd0, 0x3b, 0x72, 0x18, 0x32, 0xf1, 0x01, 0x9b, 0x5e, 0x96, 0xdb, 0xf0, 0xf2, 0x5e, 0x36, 0x09, 0x6b, 0xe4, 0x0d, 0x82, 0x46, 0xc2, 0x68, 0xd5, 0x65, 0x60, 0xdd, 0xcd, 0xb5, 0x09, 0x57, 0x3d, 0x0e, 0x44, 0x16, 0xf1, 0x5a, 0x61, 0xf7, 0xe5, 0xfa, 0x52, 0xf6, 0xb5, 0x65, 0xbc, 0xf1, 0x55, 0x12, 0x4e, 0xaf, 0x02, 0x99, 0x52, 0x20, 0x78, 0x15, 0x81, 0xe6, 0x66, 0xcc, 0x1c, 0x15, 0x1f, 0x12, 0x38, 0x37, 0x92, 0x6a, 0x5a, 0x94, 0x7c, 0xef, 0x43, 0xb0, 0xdc, 0xf2, 0x0d, 0x14, 0xa8, 0xe5, 0x77, 0x51, 0xbe, 0x77, 0x7e, 0x43, 0x1d, 0x01, 0x2d, 0x93, 0x55, 0x21, 0xb5, 0x7f, 0x3c, 0xa4, 0xc0, 0xde, 0xe3, 0xaa, 0x03, 0x5e, 0xc8, 0x04 ],
+    const [ 0xa0, 0x53, 0x26, 0x5e, 0x4f, 0x9b, 0x8c, 0xb0, 0x0d, 0x88, 0x91, 0x7e, 0x4a, 0x19, 0x45, 0x67, 0xbc, 0x7c, 0x32, 0xa0, 0x54, 0x2f, 0xed, 0x39, 0x70, 0x65, 0xea, 0xa2, 0x52, 0xab, 0x94, 0x6d, 0xd1, 0xcb, 0x9d, 0x55, 0x4e, 0xf0, 0x93, 0x80, 0xea, 0x0c, 0xb5, 0x01, 0xf6, 0x77, 0x04, 0xa1, 0xac, 0xd9, 0x9d, 0xdf, 0x1c, 0x49, 0x45, 0x35, 0x68, 0xb6, 0x46, 0x9d, 0x34, 0x86, 0x7a, 0x54, 0x59, 0x7e, 0xa5, 0xde, 0xd9, 0xe2, 0x07, 0x4a, 0x18, 0xdd, 0x32, 0xb7, 0x49, 0x22, 0x1a, 0x17, 0x26, 0xd4, 0x6b, 0x33, 0xe4, 0xa4, 0x1f, 0xf0, 0x66, 0x39, 0x4f, 0xd0, 0xb1, 0xd4, 0x49, 0xbb, 0xa0, 0x34, 0xe4, 0x00, 0xd8, 0xb7, 0x10, 0x97, 0xff, 0xc3, 0xb1, 0xa9, 0x29, 0x64, 0xae, 0x51, 0x93, 0x36, 0x44, 0xa5, 0x94, 0x86, 0xa1, 0xf0, 0xd0, 0xb4, 0xae, 0x42, 0xaf, 0xdb, 0x2c, 0x2b, 0x0e, 0xb4, 0x02, 0xc3, 0x34, 0xb8, 0xd5, 0xed, 0x07, 0x85, 0xda, 0xdd, 0x7f, 0x83, 0xe8, 0xd8, 0x5c, 0xc7, 0xd2, 0x3b, 0x14, 0x38, 0xf3, 0xbf, 0x10, 0xf0, 0x0a, 0xfb, 0x17, 0xe5, 0x49, 0x2b, 0x0b, 0xc8, 0xa8, 0x2f, 0xd3, 0x2d, 0x7f, 0xd7, 0x98, 0xed, 0x54, 0x5d, 0x34, 0xc8, 0xf1, 0x33, 0xe7, 0x4f, 0xba, 0xff, 0x4c, 0x02, 0x3e, 0xe5, 0x8c, 0xb5, 0x0c, 0x04, 0xd2, 0x38, 0xc8, 0x43, 0xff, 0x36, 0x7e, 0x4d, 0x9e, 0x5e, 0x35, 0xda, 0x1a, 0xc1, 0xc8, 0x31, 0x2e, 0x7b, 0xf1, 0xea, 0x9e, 0x96, 0xa7, 0xf9, 0x25, 0x2b, 0xaa, 0xe8, 0xae, 0xca, 0x5c, 0x64, 0xc7, 0x1c, 0xd2, 0xfb, 0x52, 0xc7, 0x2b, 0x24, 0x7d, 0x92, 0x20, 0x80, 0xf5, 0xca, 0xdd, 0x5f, 0x57, 0xe4, 0x0f, 0x86, 0xe8, 0x63, 0x3f, 0x30, 0x85, 0xfd, 0x5e, 0x52, 0xdd, 0xf9, 0xa1, 0x23, 0xdd, 0xdb, 0x8f, 0xdc, 0x6c, 0x43, 0x58, 0xbc, 0x59, 0x13, 0x68, 0x50, 0x91, 0xd0, 0x3c, 0xf1, 0x96, 0x4b, 0x74, 0x8e, 0x2c, 0x80, 0x2a, 0xac, 0x56, 0xbe, 0x83, 0xaa, 0x80, 0x08, 0x83, 0x4a, 0xfe, 0xbc, 0x26, 0x6d, 0xb5, 0x72, 0xac, 0x1e, 0x18, 0x27, 0x34, 0xd2, 0x57, 0x9b, 0x8c, 0xee, 0xd2, 0xf7, 0x48, 0x8a, 0xd4, 0xb3, 0x11, 0x75, 0x7e, 0xb7, 0x40, 0x79, 0x01, 0xc0, 0xac, 0xe0, 0x11, 0x06, 0xbf, 0x36, 0x96, 0x1c, 0xd0, 0x51, 0xa4, 0x17, 0xac, 0x8f, 0xad, 0xf2, 0x76, 0x5f, 0xf5, 0x31, 0xb2, 0x03, 0x47, 0xc5, 0x9c, 0x94, 0xe7, 0x30, 0xbe, 0x46, 0xc7, 0xe9, 0xc1, 0xed, 0xfd, 0x02, 0x84, 0xc0, 0x75, 0x08, 0x6b, 0x5d, 0xe3, 0x2b, 0xfa, 0x0e, 0xfc, 0x9e, 0xa2, 0x4b, 0xe6, 0x41, 0xda, 0x80, 0xed, 0x7e, 0x72, 0x10, 0x77, 0x70, 0x24, 0x99, 0x3a, 0x4b, 0x6d, 0x7a, 0xac, 0xf8, 0x9b, 0x92, 0xbb, 0xff, 0x26, 0x4b, 0xbf, 0xaa, 0x43, 0xd7, 0xad, 0x68, 0xb7, 0xba, 0x8d, 0x6f, 0xe9, 0x89, 0x2e, 0xa5, 0x3c, 0xf1, 0x18, 0xc1, 0x9b, 0xfa, 0xc2, 0xad, 0x56, 0x8d, 0x05, 0x2f, 0x2c, 0x35, 0xd1, 0xc9, 0xa9, 0x22, 0x1f, 0xde, 0xb2, 0x73, 0x26, 0x15, 0x5e, 0xb5, 0xd2, 0x03, 0x07, 0xa6, 0x72, 0x04, 0xa1, 0x3f, 0xb1, 0x69, 0x4b, 0xf2, 0xc7, 0xd9, 0x24, 0x31, 0xf0, 0xf1, 0x60, 0x2f, 0x1d, 0x2e, 0x9b, 0xea, 0xea, 0x0d, 0x6c, 0x69, 0xd1, 0x70, 0x3e, 0x42, 0x9d, 0x44, 0x5b, 0x60, 0x21, 0x61, 0x4a, 0x03, 0x29, 0xb1, 0x5b, 0x08, 0xb1, 0x95, 0x80, 0x6b, 0x55, 0x84, 0x5e, 0x0a, 0x09, 0xf6, 0xa4, 0xac, 0x0a, 0x80, 0x9c, 0x41, 0x15, 0x40, 0x00, 0x6c, 0xd6, 0x7b, 0x0e, 0x3e, 0xa3, 0x85, 0xde, 0x45, 0x6a, 0xe1, 0xf4, 0xc5, 0xe8, 0xaa, 0x12, 0x45, 0x1c, 0x31, 0x4f, 0x4d, 0xfc, 0xe8, 0x6d, 0x6f, 0x66, 0x7f, 0x68, 0x84, 0x59, 0x4c, 0x4b, 0x38, 0x65, 0xf0, 0x47, 0xc9, 0x60, 0x38, 0x06, 0x0b, 0x5b, 0x41, 0x3d, 0xb0, 0xd4, 0xe0, 0x81, 0xc6, 0x2e, 0x40, 0x5b, 0x81, 0x5e, 0xcd, 0x9e, 0x3b, 0xe6, 0x51, 0xf8, 0xb9, 0x07, 0x5d, 0xc8, 0xb0, 0x32, 0xeb, 0x2f, 0x87, 0xc1, 0x41, 0x6a, 0x5f, 0xe4, 0x19, 0x5f, 0x51, 0xde, 0xfe, 0x75, 0xf6, 0x71, 0xf9, 0xa9, 0x2d, 0x96, 0x6d, 0xdf, 0x18, 0x72, 0x40, 0x75, 0x68, 0x86, 0x3b, 0x1e, 0xdb, 0x26, 0xb4, 0xee, 0x02, 0x2c, 0x6a, 0xb1, 0x48, 0xed, 0xb0, 0x81, 0x30, 0x6c, 0xce, 0x98, 0xde, 0xce, 0xa4, 0x62, 0xd9, 0x0e, 0x90, 0xd6, 0x0f, 0xf2, 0x92, 0x07, 0x1a, 0x3e, 0xae, 0xf6, 0xc1, 0x27, 0x92, 0xab, 0xc2, 0x0a, 0x79, 0x84, 0xcf, 0x5e, 0x4f, 0xcc, 0xd6, 0xe8, 0x16, 0x8f, 0x85, 0x2d, 0x88, 0xad, 0x0e, 0x2d, 0xfe, 0x2e, 0x27, 0x4e, 0x90, 0xd5, 0x55, 0x97, 0x7e, 0xf8, 0x6b, 0x1e, 0xcf, 0x8f, 0x4d, 0xc4, 0x37, 0x8a, 0xfa, 0x1f, 0x3e, 0x68, 0xca, 0xb8, 0x9f, 0x05, 0xf4, 0x77, 0xee, 0xb3, 0x52, 0x5b, 0x7e, 0x8d, 0x69, 0x6e, 0x82, 0x08, 0xa4, 0xf9, 0x72, 0xcb, 0xe0, 0xf4, 0xb1, 0xc1, 0x2d, 0xc0, 0x6c, 0x6c, 0xd3, 0x19, 0xc5, 0x7c, 0x94, 0x46, 0x31, 0xa0, 0x31, 0x92, 0x1e, 0x9c, 0x30, 0x00, 0xda, 0x9c, 0xdb, 0x3b, 0xb0, 0xc7, 0x8c, 0xcc, 0x54, 0x18, 0x28, 0x8f, 0x81, 0x69, 0xea, 0x68, 0xe0, 0xd1, 0x62, 0x32, 0x2c, 0x30, 0xbd, 0xf8, 0x94, 0x08, 0x46, 0x68, 0x60, 0x8f, 0x2d, 0x84, 0xd8, 0x02, 0x87, 0x9b, 0x61, 0x3b, 0x97, 0x78, 0xea, 0x86, 0x4c, 0xd9, 0x86, 0xb1, 0x0a, 0x23, 0x5a, 0x62, 0xae, 0x53, 0xba, 0xad, 0xcc, 0x38, 0x8f, 0xe6, 0x3a, 0xe0, 0xfc, 0xb4, 0xd3, 0x50, 0x41, 0x67, 0x75, 0x77, 0xdf, 0x8c, 0x4c, 0x65, 0xfd, 0xbe, 0x53, 0xb9, 0x0a, 0xbf, 0x17, 0x58, 0xa4, 0xc7, 0xbf, 0x65, 0xb8, 0x1b, 0x49, 0x6d, 0xeb, 0xe2, 0x16, 0xe1, 0x39, 0x34, 0xa9, 0xca, 0xdc, 0x75, 0xac, 0xb8, 0x70, 0xe1, 0x33, 0xfb, 0x54, 0x67, 0x45, 0x16, 0x53, 0xbb, 0x99, 0x71, 0x84, 0xa7, 0x9d, 0x4e, 0x6e, 0xa2, 0xbc, 0xfe, 0x70, 0xa3, 0xe1, 0x55, 0x61, 0x37, 0x37, 0x5b, 0x73, 0xd2, 0x34, 0x44, 0x5d, 0x62, 0xd5, 0xa3, 0xb9, 0x2a, 0x2b, 0xda, 0xaa, 0xce, 0x16, 0xd5, 0xc3, 0xaa, 0x51, 0xf8, 0x24, 0x68, 0xae, 0x55, 0xe6, 0xd2, 0xa3, 0x23, 0xba, 0xe4, 0x06, 0x6b, 0xcc, 0x26, 0x15, 0x05, 0xee, 0x39, 0xb9, 0xc3, 0xf2, 0xaf, 0x0c, 0xec, 0x57, 0x20, 0x18, 0xec, 0x29, 0x79, 0xe2, 0x49, 0x22, 0x98, 0xa7, 0xd9, 0x15, 0x16, 0x65, 0x33, 0x8d, 0x64, 0x9d, 0x63, 0xb1, 0x1a, 0x57, 0xe2, 0x6a, 0x8b, 0x68, 0xc5, 0xc8, 0x9d, 0xf0, 0x34, 0xa2, 0xd8, 0x26, 0x1e, 0x7d, 0xbc, 0x58, 0x2b, 0xaf, 0x58, 0x2d, 0xf2, 0xc5, 0x18, 0x2e, 0x6d, 0x21, 0xdf, 0x84, 0xa9, 0xe8, 0x55, 0x03, 0xc2, 0x1b, 0x83, 0x68, 0x0f, 0x03, 0x9d, 0xdf, 0x9a, 0xd3, 0x1e, 0xc9, 0xd3, 0x89, 0x1a, 0xbb, 0x85, 0x15, 0xd0, 0xca, 0x08, 0xbd, 0x80, 0x06, 0xb9, 0xc0, 0x7c, 0x44, 0xa7, 0x39, 0x80, 0x21, 0x8f, 0x47, 0x46, 0x43, 0x0b, 0x6b, 0x56, 0xe2, 0x06, 0x31, 0x1c, 0x87, 0x73, 0x13, 0x3c, 0x14, 0x3e, 0x9a, 0x2a, 0x05, 0x83, 0xc6, 0xf5, 0xf5, 0xff, 0xb0, 0x63, 0x64, 0xc4, 0x6e, 0x43, 0xb7, 0x30, 0x37, 0xff, 0x80, 0x1f, 0xc7, 0x71, 0x00, 0x60, 0x05, 0xf7, 0xeb, 0x66, 0xe4, 0xca, 0x6a, 0x40, 0x87, 0x8b, 0x66, 0xcc, 0xa8, 0x1f, 0x04, 0x27, 0x3a, 0xbd, 0x6c, 0x67, 0x4d, 0x45, 0xcf, 0x8d, 0x33, 0xd4, 0xa8, 0xb5, 0xe1, 0x95, 0x42, 0x90, 0x97, 0xda, 0x7a, 0x14, 0xc4, 0x6b, 0xc6, 0x72, 0x24, 0x1d, 0x76, 0x49, 0x2b, 0xa7, 0x3a, 0x19, 0xa6, 0xb2, 0xe5, 0xfa, 0xa0, 0x2f, 0x70, 0x8e, 0x82, 0xed, 0x42, 0x34, 0x7f, 0x6b, 0xae, 0x7e, 0x2f, 0xeb, 0xbe, 0xe6, 0x7a, 0xc7, 0x2f, 0xbc, 0xb8, 0x08, 0xbc, 0x63, 0x16, 0x35, 0xa0, 0xbd, 0x3c, 0x69, 0x56, 0xe4, 0x2d, 0xa8, 0xa3, 0x1b, 0x6e, 0x73, 0xd6, 0x04, 0x6a, 0x9a, 0x4f, 0x13, 0x15, 0x52, 0x3e, 0x42, 0xd0, 0x87, 0xad, 0x06, 0x8d, 0x74, 0xc1, 0x82, 0x33, 0x70, 0x3c, 0xfb, 0x44, 0x0b, 0x47, 0x8d, 0xbd, 0x59, 0x6f, 0x1c, 0x3d, 0x8e, 0xed, 0x8d, 0x6a, 0xcb, 0x2a, 0x35, 0x90, 0x38, 0x82, 0x91, 0x8c, 0x53, 0x48, 0x38, 0xe9, 0x88, 0x0b, 0x0f, 0x48, 0x01, 0x18, 0xbc, 0x05, 0xbf, 0x40, 0x5d, 0x17, 0xea, 0xdc, 0x79, 0x38, 0x65, 0x0e, 0x36, 0x47, 0xa6, 0x49, 0xcd, 0xea, 0xc5, 0x13, 0x3c, 0x77, 0xd2, 0x09, 0x3b, 0x15, 0x6c, 0x24, 0x70, 0x1e, 0x8f, 0x3c, 0xe6, 0xc8, 0xae, 0xca, 0xbc, 0x05, 0x02, 0xf2, 0x1a, 0xa7, 0x21, 0xc1, 0x69, 0xc8, 0xd2, 0xb3, 0xc4, 0x69, 0x20, 0x78, 0xa9, 0x59, 0xad, 0xf7, 0xf5, 0x59, 0x49, 0x94, 0x0f, 0x7d, 0xc3, 0xae, 0x63, 0xd5, 0xff, 0x6c, 0x12, 0x4d, 0x49, 0xba, 0xe7, 0xd2, 0xe9, 0x8e, 0x8e, 0xb6, 0xf8, 0x70, 0x00, 0x56, 0x72, 0x39, 0x42, 0xfa, 0x8c, 0x1b, 0x4f, 0xfc, 0x47, 0xe1, 0x53, 0x2d, 0x45, 0x78, 0x19, 0x74, 0xdb, 0xaf, 0xc7, 0xb8, 0x69, 0x3b, 0xc9, 0x00, 0xe6, 0xfe, 0x0b, 0xd9, 0xbf, 0x89, 0x6b, 0xf9, 0xe2, 0xdf, 0x6e, 0x21, 0x15, 0x7b, 0x31, 0x48, 0x8d, 0x95, 0xa3, 0xf5, 0xbc, 0xa2, 0xf2, 0xed, 0x6a, 0x1a, 0x43, 0x0e, 0x07, 0x7d, 0xa6, 0x7b, 0x40, 0x98, 0x49, 0xf9, 0xd0, 0x05, 0xec, 0x99, 0x99, 0xf1, 0x94, 0x98, 0xf3, 0x21, 0x84, 0x83, 0x44, 0x37, 0x69, 0x9e, 0xd1, 0x32, 0xd5, 0x87, 0xd3, 0x35, 0xee, 0x17, 0xce, 0x89, 0x68, 0x89, 0x1e, 0xe4, 0xb0, 0xde, 0xd2, 0xec, 0x6a, 0x7f, 0xbe, 0xf7, 0x1e, 0x25, 0xcc, 0x15, 0x2e, 0xf6, 0x93, 0x50, 0x0c, 0xf1, 0x2b, 0x32, 0xa9, 0x8b, 0x3f, 0x88, 0x31, 0x9a, 0x63, 0x66, 0xf5, 0x73, 0xa8, 0x6b, 0xa9, 0x4f, 0x6e, 0x46, 0xcf, 0xf4, 0x7a, 0x79, 0x73, 0x91, 0x49, 0x5d, 0x19, 0xe9, 0xa3, 0x67, 0xf4, 0xb3, 0x73, 0xa9, 0x58, 0x41, 0xd5, 0x9c, 0x72, 0x61, 0x71, 0x1c, 0x37, 0x81, 0x08, 0xb4, 0x9a, 0x16, 0x4c, 0x1c, 0x02, 0x3e, 0xf5, 0x00, 0xfb, 0xa3, 0x11, 0x03, 0x2b, 0xa3, 0x9b, 0x04, 0x89, 0xaf, 0x50, 0xa0, 0xc9, 0xf1, 0xbe, 0xf8, 0x1a, 0x32, 0x9e, 0xb4, 0x14, 0xfa, 0x63, 0x48, 0xec, 0xf9, 0x13, 0x75, 0xeb, 0xa5, 0x56, 0x13, 0x1e, 0x25, 0xcd, 0x0f, 0x4e, 0x6e, 0xa4, 0xb0, 0x32, 0xac, 0x6b, 0x1e, 0xe4, 0xe3, 0x21, 0x24, 0x92, 0xd6, 0x92, 0x35, 0x76, 0x28, 0xe4, 0xad, 0x08, 0xc1, 0x6c, 0x5a, 0x72, 0x73, 0xc6, 0x3b, 0x44, 0xdd, 0x24, 0x87, 0x69, 0x90, 0xe6, 0xf1, 0x5a, 0x71, 0x6b, 0x2b, 0x91, 0x5f, 0x27, 0xa9, 0x41, 0x15, 0xf6, 0xa7, 0x44, 0x51, 0xb0, 0x6d, 0x54, 0x36, 0xfe, 0xd2, 0x7f, 0xee, 0x6c, 0xff, 0xd5, 0x95, 0xbf, 0x75, 0x64, 0x52, 0x88, 0x52, 0x66, 0xc7, 0xf9, 0xcf, 0xb8, 0xac, 0xf8, 0x0e, 0x8e, 0xb6, 0x72, 0x13, 0x66, 0xbe, 0xf2, 0x10, 0x3a, 0x1f, 0x72, 0xe5, 0xfa, 0x60, 0x71, 0xe7, 0x39, 0x13, 0x45, 0xe0, 0x27, 0xfc, 0xb3, 0x58, 0xbf, 0x76, 0xbd, 0x13, 0x41, 0x13, 0xbb, 0xdb, 0xe3, 0x83, 0xad, 0x80, 0xc3, 0xb7, 0xd0, 0x1c, 0x21, 0x45, 0x6f, 0x9b, 0xcb, 0x0f, 0xfc, 0x7b, 0xd8, 0x20, 0x5f, 0xd1, 0x99, 0xd6, 0x8e, 0x8d, 0xcd, 0x46, 0x5e, 0xfe, 0x14, 0xdc, 0x99, 0x99, 0xa7, 0x42, 0x50, 0xf6, 0x45, 0x83, 0x72, 0x1b, 0x71, 0x71, 0x9e, 0xfd, 0xda, 0x44, 0x36, 0x44, 0x1b, 0x83, 0xb5, 0x4f, 0xa4, 0x28, 0x42, 0x78, 0xf8, 0xff, 0x85, 0x99, 0x1a, 0x4f, 0xb9, 0xcf, 0x41, 0xbc, 0x02, 0x7d, 0xd3, 0x6c, 0x01, 0x94, 0x91, 0x69, 0xa6, 0x12, 0x0f, 0x46, 0x46, 0xc9, 0x68, 0x06, 0xee, 0x62, 0x2f, 0x39, 0xf6, 0xa1, 0xa9, 0x68, 0xd9, 0xeb, 0x39, 0xb3, 0x44, 0x05, 0x1b, 0xb9, 0x6c, 0x1e, 0x55, 0xb8, 0xa5, 0x10, 0xeb, 0xf5, 0x31, 0xe3, 0x53, 0x5f, 0x55, 0x92, 0x28, 0x6f, 0xb2, 0x12, 0x23, 0x52, 0xd3, 0x91, 0x46, 0x4a, 0x03, 0xfc, 0x5a, 0x52, 0x61, 0xc3, 0x9c, 0x01, 0x36, 0xe0, 0xb4, 0xb0, 0x85, 0x16, 0xe6, 0xdf, 0xe4, 0x76, 0x8c, 0xd5, 0x8b, 0x28, 0xc4, 0x87, 0xab, 0x68, 0x66, 0xbb, 0x01, 0xcf, 0x39, 0x6d, 0xaa, 0xd4, 0x66, 0x72, 0x39, 0x92, 0x2c, 0x5b, 0x07, 0xcc, 0xd6, 0x9c, 0xca, 0x2e, 0xea, 0xee, 0x69, 0xd5, 0xa4, 0xf1, 0x0f, 0x12, 0xa2, 0x16, 0x7f, 0x6b, 0xe1, 0xbc, 0xa7, 0xe3, 0xe8, 0x99, 0x77, 0x7c, 0x43, 0x5c, 0xf3, 0xf9, 0x33, 0x90, 0x87, 0xe8, 0xa4, 0xc4, 0x9b, 0xe0, 0x5f, 0xe9, 0x68, 0x08, 0x81, 0xfb, 0x0a, 0xd8, 0x2c, 0xe4, 0xd6, 0x24, 0x7c, 0x9d, 0xed, 0x56, 0xbd, 0x96, 0x11, 0xfb, 0xdb, 0x58, 0xb8, 0x81, 0x19, 0x69, 0x5f, 0x3e, 0x06, 0x6f, 0x21, 0xb5, 0xae, 0x99, 0x88, 0x15, 0x0d, 0x3b, 0xa3, 0x03, 0xc9, 0xb8, 0x59, 0x99, 0x20, 0xa5, 0xfc, 0xaf, 0x1e, 0x2b, 0x22, 0x59, 0x14, 0xad, 0xb0, 0xb0, 0x47, 0xab, 0x37, 0xd6, 0xe5, 0xe7, 0x84, 0x34, 0x3d, 0xc6, 0x72, 0x06, 0x2e, 0xf8, 0x03, 0x1a, 0xe0, 0x5b, 0xaf, 0xd4, 0xb3, 0x1d, 0xfc, 0x76, 0x75, 0x22, 0x4f, 0x9e, 0xd8, 0xa5, 0x02, 0x11, 0x23, 0x21, 0xb6, 0xb6, 0x27, 0x72, 0xeb, 0xe6, 0x75, 0x37, 0xce, 0xe3, 0xce, 0x7c, 0x51, 0xa5, 0xdb, 0x96, 0x81, 0xdd, 0x1e, 0x4d, 0x15, 0x34, 0x29, 0x41, 0x42, 0xd3, 0x0e, 0x86, 0xd7, 0x29, 0x16, 0x92, 0x85, 0xe8, 0xb6, 0x59, 0x7e, 0x51, 0xbe, 0xb6, 0x43, 0xb2, 0xd4, 0x0d, 0xb6, 0x2d, 0x21, 0x2f, 0x77, 0xba, 0x4a, 0x7d, 0x6d, 0x6f, 0xa2, 0x51, 0xa3, 0x00, 0x9e, 0x99, 0x56, 0x82, 0x89, 0xc5, 0x4c, 0x74, 0x78, 0xe4, 0x67, 0xff, 0x81, 0x09, 0x79, 0x7d, 0x28, 0xf4, 0x5a, 0x39, 0x1a, 0xee, 0x38, 0x75, 0x1e, 0xf5, 0x2f, 0xb2, 0x48, 0x19, 0x19, 0x2b, 0x6f, 0x26, 0xa8, 0xa3, 0xe2, 0x83, 0xb2, 0x60, 0x57, 0x5a, 0xcb, 0x78, 0x24, 0xf9, 0x19, 0x4b, 0xb2, 0x79, 0x64, 0x51, 0x2e, 0x9d, 0x6d, 0x16, 0x81, 0xfc, 0x81, 0x82, 0x83, 0x63, 0x4d, 0x5e, 0x6b, 0x75, 0xf4, 0x14, 0x8b, 0x94, 0x5f, 0xb6, 0x3a, 0x05, 0xd5, 0x42, 0x11, 0x4e, 0xcb, 0x25, 0x5a, 0xe3, 0xfd, 0xfd, 0xc5, 0x02, 0xbd, 0xa3, 0x5d, 0xdc, 0x8b, 0x69, 0xbb, 0xf5, 0xe7, 0xa0, 0x79, 0xcd, 0x63, 0x5e, 0xea, 0xc0, 0xfc, 0x7e, 0x08, 0x2b, 0xaa, 0xe7, 0xae, 0xd0, 0x36, 0x12, 0x08, 0x7c, 0x4c, 0xc6, 0x47, 0xe7, 0xd1, 0x26, 0x99, 0xdb, 0x76, 0xee, 0x58, 0x98, 0x8e, 0xfa, 0x81, 0x78, 0x1d, 0x08, 0x69, 0xcf, 0x31, 0xbe, 0xab, 0x15, 0x75, 0xef, 0x65, 0x47, 0x03, 0x1a, 0xa4, 0x8a, 0x7a, 0x33, 0x1c, 0x12, 0x50, 0xa6, 0x1d, 0x42, 0x6a, 0x9a, 0xc2, 0x14, 0xea, 0x72, 0x6c, 0xbc, 0x49, 0x9a, 0x6e, 0x88, 0xa5, 0x80, 0x0a, 0x0b, 0x5c, 0xe0, 0x9d, 0x7a, 0xd9, 0x45, 0x16, 0x56, 0xae, 0xcd, 0xac, 0x4b, 0xe3, 0x2c, 0xd1, 0x59, 0x8e, 0xf3, 0x61, 0x31, 0xa4, 0x13, 0x20, 0xe2, 0x0f, 0x9c, 0x63, 0xb4, 0x01, 0xcb, 0x0d, 0x54, 0x87, 0x44, 0xbd, 0x32, 0x61, 0x9c, 0x46, 0x28, 0x11, 0x1a, 0x60, 0x5c, 0x32, 0xbf, 0x9d, 0x67, 0x0b, 0x83, 0x9e, 0xb7, 0x64, 0xe2, 0x86, 0x31, 0x98, 0x97, 0xaf, 0x1b, 0xec, 0xa8, 0x9c, 0x3a, 0x1f, 0xa2, 0x2f, 0x37, 0x43, 0x26, 0x1c, 0x48, 0xcb, 0xa4, 0x9e, 0x0c, 0xe4, 0x67, 0x69, 0xb6, 0x09, 0xd2, 0xdf, 0x6d, 0xd1, 0xe9, 0x86, 0xf3, 0x0c, 0x13, 0xba, 0x85, 0x0f, 0x1d, 0x9f, 0x03, 0x4c, 0x83, 0x5a, 0x51, 0x26, 0xeb, 0x81, 0xfd, 0x03, 0xf3, 0xcf, 0x22, 0xa2, 0x2c, 0x1d, 0x8c, 0xaf, 0x66, 0x8d, 0x1c, 0x94, 0x2f, 0x09, 0x6e, 0x93, 0x96, 0xec, 0xba, 0x11, 0x35, 0xfe, 0xf8, 0x35, 0x6e, 0xa6, 0x48, 0xb2, 0xf4, 0x5b, 0x90, 0xe1, 0x8d, 0x5c, 0x67, 0x13, 0x17, 0xa1, 0x32, 0x25, 0xc9, 0x11, 0x8c, 0x55, 0xbc, 0xf5, 0xec, 0x53, 0xaa, 0xad, 0x81, 0x9c, 0xf5, 0xa1, 0x61, 0x03, 0xeb, 0x7b, 0xe3, 0x90, 0x48, 0x94, 0x49, 0x8e, 0xfc, 0xab, 0xa3, 0xe0, 0x2f, 0xdd, 0xf0, 0x94, 0x83, 0xd1, 0x85, 0xbb, 0x99, 0x34, 0xb3, 0x77, 0xd6, 0x65, 0xa4, 0x55, 0x67, 0x71, 0x86, 0xdd, 0x82, 0x41, 0xeb, 0x68, 0xef, 0x12, 0x70, 0x32, 0xc8, 0x26, 0x9d, 0xb0, 0x7d, 0xb9, 0x0d, 0x24, 0x1a, 0x37, 0xcf, 0x6e, 0xcd, 0xac, 0x0b, 0x25, 0xa3, 0x7c, 0xe9, 0xe6, 0x92, 0x54, 0xae, 0xec, 0xbc, 0x60, 0x29, 0xe1, 0xf2, 0xbf, 0x4d, 0xf4, 0x77, 0x34, 0x1f, 0x2c, 0x07, 0x1e, 0xd3, 0xfc, 0x18, 0xaa, 0x31, 0x17, 0x60, 0x47, 0x3e, 0x85, 0x97, 0x5a, 0x19, 0xf7, 0x7e, 0x33, 0x23, 0x58, 0x20, 0x40, 0x62, 0xa4, 0x58, 0x81, 0x28, 0xfd, 0x93, 0x3c, 0xef, 0xfc, 0xd7, 0xf2, 0x88, 0x45, 0x05, 0x91, 0x75, 0x5e, 0x5b, 0xeb, 0x93, 0xc1, 0x3c, 0x67, 0xfc, 0x2f, 0x34, 0xf7, 0x2b, 0x48, 0x37, 0x4a, 0x61, 0x59, 0x29, 0x42, 0x48, 0x75, 0xa4, 0xa8, 0xd6, 0xc7, 0xf5, 0x1f, 0x75, 0x26, 0x67, 0x56, 0x61, 0xea, 0xc5, 0x82, 0x51, 0xfe, 0x1a, 0x0c, 0x59, 0x37, 0xbb, 0x86, 0x0f, 0xe4, 0x87, 0xe4, 0xed, 0xa7, 0x6e, 0xe9, 0xf6, 0x83, 0x30, 0xdf, 0x9c, 0x35, 0x67, 0x8b, 0xe2, 0xc8, 0xc8, 0x60, 0xbe, 0x64, 0xa6, 0xf3, 0xc1, 0x67, 0xb7, 0xaf, 0xf9, 0xb6, 0x1b, 0xca, 0x17, 0x56, 0x9a, 0x77, 0xcd, 0x36, 0x2e, 0x5e, 0x7a, 0x4f, 0xc1, 0x49, 0x09, 0xef, 0x37, 0x20, 0x16, 0x52, 0xaf, 0x17, 0x53, 0x73, 0x06, 0x26, 0x2b, 0x21, 0x9d, 0xba, 0xa5, 0x55, 0x5d, 0xaa, 0x8a, 0xc3, 0xf8, 0x6c, 0xca, 0xaf, 0x71, 0x89, 0x1c, 0x02, 0xde, 0x4e, 0xe5, 0x9d, 0x6d, 0xc4, 0x5b, 0xed, 0xa5, 0xe3, 0xea, 0xc0, 0xee, 0x03, 0xd7, 0x57, 0x54, 0x93, 0x23, 0xbc, 0x88, 0x0d, 0xb2, 0x56, 0x27, 0x29, 0xac, 0xba, 0x3f, 0x52, 0x24, 0xc4, 0x10, 0x56, 0xf7, 0xe7, 0x0f, 0x61, 0xf7, 0xc1, 0x31, 0x2c, 0x49, 0xf2, 0x65, 0x72, 0x0c, 0x2f, 0x62, 0xa4, 0x3b, 0x92, 0xa4, 0xdd, 0xd5, 0x34, 0xb1, 0x18, 0x3b, 0xfe, 0xa1, 0xa1, 0xd9, 0xbc, 0xdd, 0xc9, 0x08, 0x73, 0x27, 0xde, 0x33, 0xf5, 0xdb, 0x5a, 0x39, 0xb2, 0x74, 0x5b, 0x13, 0xd1, 0x51, 0x53, 0xb7, 0x80, 0xba, 0x01, 0x3c, 0x88, 0x1e, 0xa0, 0x3e, 0x24, 0x9e, 0x5e, 0x84, 0x13, 0xd0, 0x0f, 0xe0, 0xec, 0xbc, 0x23, 0x57, 0xb2, 0x2b, 0xd5, 0x82, 0xa8, 0x22, 0xa6, 0x34, 0x66, 0xa9, 0x0a, 0x5e, 0x2d, 0xd0, 0x61, 0x2f, 0x78, 0xf4, 0x28, 0x7f, 0xd3, 0x3f, 0x71, 0x6d, 0xf0, 0x6e, 0x90, 0x47, 0xf8, 0xd7, 0x18, 0xab, 0x1f, 0xaa, 0x06, 0xec, 0x7b, 0x77, 0x3b, 0xb7, 0x16, 0xf0, 0x30, 0xf7, 0x42, 0xf1, 0xe5, 0xf5, 0x2c, 0xbd, 0x1a, 0xc4, 0xb4, 0x8b, 0xc2, 0xdc, 0x7c, 0x41, 0xb5, 0x05, 0x3f, 0x7f, 0xa5, 0x77, 0x65, 0xdf, 0x53, 0x3f, 0xd4, 0x7b, 0x02, 0xe4, 0x08, 0xb0, 0x2c, 0x4b, 0x66, 0x22, 0x75, 0xd8, 0xcd, 0x00, 0xdd, 0xd6, 0x6f, 0x8a, 0x39, 0x19, 0xdf, 0xd0, 0xe4, 0xe1, 0x6a, 0xbc, 0xb2, 0x02, 0xab, 0x52, 0x25, 0x42, 0x5a, 0x37, 0xe4, 0x03, 0x65, 0x70, 0x68, 0x22, 0x42, 0x6d, 0xf9, 0x1e, 0x83, 0x46, 0xd9, 0x7d, 0xab, 0x44, 0xbf, 0x6b, 0x40, 0xa3, 0x86, 0xa5, 0x21, 0x96, 0x27, 0x95, 0x1a, 0x8c, 0xe5, 0xbe, 0xb6, 0xb2, 0xc7, 0x5b, 0x54, 0xb9, 0x4b, 0x43, 0x7d, 0xd9, 0x59, 0x10, 0x75, 0x16, 0x76, 0x80, 0x10, 0xc2, 0x3a, 0x1c, 0xc7, 0x43, 0x04, 0x17, 0x0b, 0x16, 0xec, 0x78, 0xda, 0x14, 0xf9, 0x7c, 0x8f, 0xf4, 0x95, 0x35, 0xfe, 0x12, 0x3d, 0x78, 0xc0, 0x6e, 0x7d, 0xf6, 0xcc, 0xf8, 0x1c, 0xa9, 0x47, 0x0b, 0x94, 0x72, 0x9e, 0x37, 0xc4, 0x00, 0xd1, 0x43, 0xe9, 0xf3, 0x12, 0x72, 0xcb, 0x41, 0x8e, 0x06, 0x34, 0xd9, 0x8b, 0x03, 0xa6, 0x87, 0xb3, 0x35, 0x4d, 0x18, 0xaf, 0x74, 0x33, 0xbe, 0xf8, 0x27, 0xb3, 0xb6, 0xea, 0x07, 0x30, 0x27, 0x1b, 0x26, 0x07, 0x4e, 0xea, 0x2f, 0xc1, 0xd8, 0x5b, 0xef, 0x8e, 0x8f, 0x22, 0x14, 0xef, 0x39, 0xfd, 0x35, 0xb2, 0xbd, 0x47, 0x13, 0x23, 0x88, 0xcb, 0x1f, 0x81, 0x2f, 0xd6, 0x3c, 0xaf, 0x56, 0x90, 0xc5, 0x2c, 0xd0, 0x8b, 0xd2, 0x45, 0x08, 0x9d, 0xb7, 0x89, 0x9f, 0xeb, 0xce, 0x7e, 0x56, 0x47, 0x77, 0x92, 0x2f, 0xbc, 0x5c, 0x54, 0xcf, 0x66, 0xfa, 0xe4, 0x27, 0x87, 0x5d, 0xa8, 0x53, 0xd8, 0x2a, 0x41, 0xc2, 0x1d, 0xe3, 0xbe, 0x98, 0xfc, 0x67, 0x0f, 0x50, 0x0f, 0xb8, 0xbc, 0xa6, 0x38, 0x01, 0xd7, 0xb4, 0x35, 0xd8, 0x2f, 0x5b, 0x74, 0xc0, 0xc6, 0xe4, 0x28, 0xf2, 0x85, 0xe7, 0x9c, 0x5d, 0x2f, 0x6c, 0xc7, 0xeb, 0x94, 0x51, 0x22, 0x06, 0x07, 0xec, 0xb6, 0x5b, 0x11, 0xf0, 0x79, 0xdd, 0x67, 0x95, 0xda, 0x0d, 0x1a, 0xf3, 0x9b, 0x79, 0x0e, 0xaf, 0xdf, 0x83, 0xad, 0xda, 0x84, 0x64, 0xdc, 0x16, 0xb2, 0x71, 0x2e, 0xfb, 0xb4, 0x9c, 0x58, 0xb9, 0x07, 0x3d, 0xe6, 0xfe, 0xb1, 0x13, 0x2c, 0x1a, 0xd4, 0x85, 0x7e, 0x61, 0x83, 0x2e, 0xa4, 0xd0, 0xd4, 0x99, 0x88, 0xf4, 0x37, 0x49, 0x32, 0x08, 0x06, 0xfd, 0xf6, 0x5e, 0x5d, 0x32, 0xec, 0x00, 0x2b, 0xe8, 0xa1, 0x96, 0x89, 0xa9, 0x0c, 0x8a, 0x4b, 0xc8, 0xc4, 0x6b, 0xd5, 0xe7, 0x70, 0x8f, 0x31, 0xbb, 0x7e, 0xfd, 0x5e, 0x14, 0x18, 0x89, 0xea, 0x17, 0x53, 0x41, 0xc3, 0xce, 0xaa, 0x08, 0x4a, 0xe4, 0xac, 0x81, 0xa9, 0xa9, 0xf1, 0x2f, 0x66, 0x5c, 0x52, 0xda, 0x39, 0xaa, 0x59, 0x34, 0x1b, 0x72, 0xf7, 0xbc, 0xa0, 0xcb, 0x75, 0xe3, 0x86, 0x48, 0xad, 0x6d, 0x8e, 0x7b, 0x7a, 0x1b, 0x8a, 0xb7, 0x6d, 0x87, 0xb8, 0x1a, 0xc2, 0x4f, 0x4e, 0xcb, 0x92, 0x75, 0x56, 0x81, 0x4a, 0x06, 0xbc, 0x45, 0x5b, 0xfa, 0xa6, 0x78, 0x33, 0x5c, 0x03, 0x17, 0x6d, 0xab, 0x67, 0x3e, 0x44, 0x7f, 0x16, 0xeb, 0x4e, 0x6f, 0x5f, 0x05, 0x67, 0x33, 0x2b, 0x9d, 0xea, 0x06, 0xd5, 0x73, 0x28, 0x4e, 0x3c, 0xbc, 0x12, 0x7f, 0x17, 0x22, 0x39, 0x3d, 0x89, 0x0d, 0xf9, 0xc1, 0xf6, 0x21, 0xf0, 0x7d, 0x14, 0x08, 0xb5, 0x03, 0x45, 0x71, 0xc7, 0x23, 0x24, 0x58, 0xc4, 0x53, 0x5d, 0x88, 0xdc, 0x55, 0xc3, 0x5f, 0x84, 0x13, 0x9c, 0xd2, 0x6f, 0xce, 0x3f, 0xb0, 0xba, 0x77, 0xe2, 0x2b, 0x67, 0x5d, 0xad, 0x94, 0x0c, 0x09, 0x13, 0x66, 0xcc, 0x66, 0x61, 0x86, 0x87, 0x26, 0x97, 0xc9, 0x4e, 0x60, 0x78, 0xb7, 0x1a, 0x7e, 0xdd, 0x8f, 0xbd, 0x56, 0x4e, 0x8b, 0x18, 0x97, 0xd3, 0x64, 0x8f, 0x67, 0x08, 0x19, 0xba, 0x4a, 0x70, 0xed, 0x5d, 0x46, 0x0b, 0xae, 0x9b, 0x45, 0x2b, 0x3d, 0x66, 0xba, 0x83, 0x4b, 0x3a, 0x87, 0x81, 0x61, 0x0b, 0x1f, 0xde, 0x23, 0x7c, 0xe7, 0x73, 0xd5, 0x51, 0xe3, 0x4e, 0x1e, 0x27, 0x8e, 0x05, 0x0c, 0x62, 0x09, 0x4a, 0x59, 0x68, 0x78, 0xc0, 0xed, 0x0d, 0xaa, 0x0d, 0xa3, 0x4d, 0xf8, 0x31, 0x50, 0x41, 0x6f, 0x16, 0x02, 0x4c, 0x31, 0x67, 0x85, 0x96, 0x18, 0xa6, 0x2c, 0xbb, 0x9d, 0x79, 0xcd, 0xc4, 0xf8, 0x45, 0x0e, 0x56, 0x89, 0xfe, 0xdf, 0x29, 0x77, 0x3e, 0x48, 0xbc, 0x97, 0x94, 0x65, 0x47, 0x8f, 0x1e, 0xaf, 0xf2, 0x3b, 0x5a, 0x7c, 0x44, 0x4f, 0x39, 0xca, 0xde, 0x3e, 0x75, 0x38, 0x69, 0x5b, 0x25, 0x55, 0xcd, 0x3e, 0x8f, 0x1d, 0xa3, 0x6a, 0x3d, 0xc1, 0xee, 0x2d, 0x53, 0xa7, 0x05, 0xc7, 0x1f, 0xb2, 0xd4, 0xce, 0xf2, 0xc3, 0x44, 0xd0, 0x2e, 0x80, 0xf8, 0x3b, 0xa1, 0x54, 0x3a, 0x7a, 0x11, 0xb6, 0x35, 0x61, 0x18, 0xaf, 0x64, 0xcb, 0x33, 0x96, 0x4a, 0x81, 0x15, 0x1f, 0x64, 0x5e, 0x41, 0x94, 0x5c, 0xb1, 0xd7, 0x61, 0x7f, 0xe3, 0xae, 0xd6, 0x71, 0x5a, 0xa4, 0x29, 0x1f, 0x9c, 0x32, 0xba, 0xf6, 0xb8, 0x44, 0x9b, 0x53, 0xe2, 0x47, 0x50, 0x3a, 0x5d, 0x83, 0xd3, 0x4a, 0x9e, 0xab, 0xdc, 0xf0, 0xae, 0xb2, 0x5e, 0xdc, 0xd0, 0xe1, 0x55, 0xb1, 0x64, 0x27, 0xbf, 0x01, 0x0b, 0xb0, 0xe8, 0x78, 0x0c, 0xb8, 0xeb, 0x57, 0xf6, 0xa2, 0x76, 0x24, 0x87, 0x44, 0xcd, 0xa0, 0xcd, 0x86, 0x12, 0xfa, 0x8b, 0x2b, 0xc3, 0x42, 0xde, 0xee, 0x84, 0x20, 0x20, 0xd1, 0x1f, 0xc6, 0x0d, 0xb2, 0xc9, 0x23, 0x24, 0x1f, 0xa7, 0x5a, 0x50, 0x6b, 0x90, 0x72, 0xc8, 0x01, 0x15, 0x4f, 0x34, 0xf9, 0xbe, 0xe1, 0x11, 0xe9, 0x97, 0x9b, 0x56, 0xfe, 0xeb, 0x27, 0x58, 0x4b, 0x50, 0x58, 0xeb, 0x60, 0xe3, 0x60, 0xca, 0x1f, 0xd5, 0x43, 0x39, 0xcb, 0x27, 0x8b, 0xe8, 0x62, 0xb1, 0x3e, 0x1b, 0x2d, 0x69, 0x0d, 0x08, 0x95, 0xe2, 0xce, 0x80, 0x38, 0x13, 0x2c, 0xd2, 0x3c, 0x5a, 0x9d, 0xed, 0xe3, 0xc1, 0x95, 0xc4, 0x60, 0x7f, 0xfa, 0xf7, 0xea, 0xc2, 0xd7, 0xaf, 0x0e, 0xab, 0x54, 0xc9, 0x49, 0x9a, 0xe6, 0x38, 0xd6, 0xad, 0xc3, 0xa4, 0xc5, 0x83, 0x99, 0x57, 0x4d, 0x46, 0x7f, 0x5a, 0x63, 0xe8, 0x2c, 0xdb, 0x8b, 0xac, 0x66, 0xd2, 0xef, 0xe9, 0xbe, 0xe5, 0xae, 0x0b, 0x7b, 0x88, 0x76, 0xda, 0xd4, 0x68, 0x55, 0xff, 0x62, 0x0a, 0xcc, 0xc3, 0xd4, 0xaf, 0x26, 0x1b, 0xe5, 0x7c, 0x07, 0xe2, 0x8b, 0xd7, 0x48, 0x65, 0x71, 0x14, 0x02, 0x24, 0xa8, 0x51, 0xe9, 0xd7, 0x9a, 0x9e, 0xdc, 0xb0, 0x3f, 0x62, 0xba, 0xe0, 0x93, 0xfa, 0x76, 0x5c, 0x47, 0xa2, 0x6e, 0xe1, 0xb6, 0x99, 0xf8, 0x35, 0x1c, 0x80, 0x3e, 0xb1, 0x02, 0x03, 0x4d, 0xfc, 0xfd, 0xbc, 0x68, 0x19, 0x98, 0x54, 0xa2, 0xa4, 0x8f, 0xec, 0xac, 0x58, 0x3e, 0xbb, 0xeb, 0xd5, 0x58, 0xf8, 0xcd, 0xa0, 0xdc, 0xfa, 0x5e, 0x6c, 0x45, 0x9e, 0x16, 0x98, 0x02, 0xe9, 0xf5, 0xf8, 0x25, 0xee, 0xd3, 0xd8, 0x5f, 0xf2, 0xf1, 0x3e, 0x2c, 0xcf, 0xd3, 0x70, 0x4b, 0x96, 0x52, 0xb6, 0x71, 0x78, 0xed, 0x61, 0x3e, 0xe7, 0x60, 0x0c, 0x70, 0xf8, 0x78, 0x22, 0x57, 0x0c, 0x25, 0xa1, 0x89, 0xaf, 0xd1, 0x1d, 0xd6, 0xc0, 0xf0, 0x07, 0x7e, 0xd3, 0xd8, 0x2f, 0xa2, 0xd3, 0xd3, 0x88, 0xf9, 0xec, 0x73, 0x2b, 0xc4, 0xa7, 0x26, 0x9f, 0x04, 0x57, 0x0a, 0x58, 0xea, 0xb5, 0x03, 0x7d, 0x8f, 0xc7, 0x0a, 0xef, 0xe5, 0x06, 0xc8, 0x86, 0xee, 0xbf, 0x63, 0x9e, 0x2b, 0xba, 0x98, 0xd2, 0x58, 0x1a, 0x0a, 0x07, 0x56, 0x84, 0xd9, 0xad, 0x69, 0x83, 0x77, 0x41, 0xa3, 0x2b, 0xb7, 0x16, 0xa0, 0xfd, 0x27, 0x56, 0x74, 0x0b, 0xa0, 0x43, 0xe2, 0x5d, 0x1b, 0xc3, 0xcf, 0x92, 0xc6, 0x1c, 0xf5, 0xca, 0x58, 0xfc, 0xdc, 0xc4, 0xa1, 0xbc, 0x06, 0x44, 0x65, 0xe5, 0x6a, 0xb8, 0x6a, 0xf4, 0x25, 0x1a, 0xd0, 0x5a, 0x6b, 0x18, 0xa1, 0xc7, 0xc3, 0x73, 0xa9, 0xa8, 0x74, 0xa5, 0x88, 0xef, 0x3a, 0xc6, 0x05, 0x12, 0x3e, 0xb0, 0xa5, 0x56, 0x45, 0x62, 0x7d, 0x4d, 0x28, 0xa2, 0x44, 0x9d, 0x84, 0xe7, 0xac, 0x04, 0xb2, 0x75, 0xf2, 0x99, 0xfa, 0xca, 0xb4, 0x55, 0x03, 0x39, 0x04, 0xd1, 0x8e, 0xd5, 0xba, 0x51, 0x64, 0x90, 0x0e, 0x02, 0x8d, 0xa4, 0x66, 0x80, 0xc3, 0x32, 0x6c, 0x9b, 0x27, 0x29, 0x64, 0x5b, 0x32, 0x6a, 0xbd, 0x42, 0xed, 0x2a, 0xe5, 0xd0, 0x65, 0x97, 0x62, 0x4d, 0x59, 0xbe, 0x1f, 0xc2, 0x37, 0xac, 0x03, 0x49, 0x47, 0xd3, 0xc8, 0x86, 0x25, 0xb0, 0x0b, 0x76, 0x74, 0xab, 0x9f, 0x67, 0xd1, 0x3f, 0x27, 0x48, 0x06, 0x5a, 0xe4, 0x23, 0x80, 0x07, 0xcb, 0xe8, 0x04, 0x4a, 0xdb, 0x6c, 0x9d, 0x4b, 0xad, 0xb1, 0xd9, 0xb7, 0x4d, 0x68, 0x34, 0x64, 0x48, 0xb4, 0xd5, 0x34, 0x06, 0x31, 0x78, 0x3b, 0x5a, 0x35, 0xac, 0x24, 0x58, 0x56, 0x3e, 0xd0, 0x67, 0x2c, 0xf5, 0x41, 0x97, 0x58, 0x7f, 0xb7, 0x34, 0xc4, 0xac, 0x18, 0x9b, 0x2d, 0xda, 0x95, 0x4c, 0xdf, 0xb1, 0x8b, 0x41, 0xc0, 0x10, 0xa7, 0x7e, 0x90, 0x46, 0x4e, 0xea, 0x6f, 0x86, 0x3c, 0x5d, 0xa0, 0x95, 0x6b, 0xfa, 0x8c, 0xc6, 0x36, 0xbf, 0x0a, 0x28, 0xbe, 0x5a, 0xdd, 0xfe, 0x8d, 0x3e, 0x7e, 0x6f, 0x79, 0xf7, 0x1d, 0x7f, 0xcb, 0xba, 0xe2, 0x3e, 0xa1, 0x41, 0x78, 0x3f, 0x91, 0xd6, 0xcc, 0x4c, 0x8f, 0xad, 0x12, 0x58, 0x11, 0x76, 0x0a, 0xb5, 0x71, 0x33, 0x81, 0x88, 0x92, 0x47, 0x1a, 0x79, 0xc6, 0xd0, 0x4e, 0xaf, 0xef, 0x37, 0xb2, 0xfb, 0xe5, 0x06, 0x78, 0x53, 0x18, 0xf9, 0x39, 0x83, 0x77, 0x57, 0xf2, 0x1f, 0x90, 0x82, 0x4c, 0xbc, 0xf8, 0xcd, 0x20, 0x5f, 0xed, 0x8f, 0x3a, 0x36, 0x3a, 0x76, 0x5d, 0x86, 0x5b, 0x1d, 0x88, 0xe5, 0xe2, 0xe0, 0x78, 0xa9, 0x19, 0xef, 0x6e, 0xa0, 0xe9, 0xa1, 0x32, 0x02, 0xfa, 0x0b, 0x58, 0xa3, 0x1c, 0xd2, 0xc2, 0x6d, 0xe6, 0x3d, 0x66, 0x0e, 0x9c, 0x8e, 0x51, 0xee, 0x56, 0x93, 0xec, 0x64, 0x5f, 0x78, 0x7f, 0x29, 0xdc, 0xdf, 0xf3, 0x0d, 0xae, 0x32, 0xdc, 0xe8, 0x99, 0x38, 0xb7, 0xd4, 0xa5, 0xe7, 0x6f, 0x99, 0xc4, 0x7a, 0x27, 0x69, 0xb6, 0xc3, 0x33, 0xce, 0x2a, 0xc1, 0x67, 0xe0, 0x26, 0x75, 0x95, 0xbb, 0xa8, 0xf2, 0x51, 0x30, 0x8e, 0xb4, 0xf7, 0xbb, 0xb3, 0x32, 0xf0, 0xb5, 0x5b, 0xb6, 0x30, 0xcb, 0xd1, 0x6d, 0x03, 0xaf, 0x4e, 0xba, 0x0a, 0x0d, 0x1d, 0xd0, 0x80, 0xc1, 0xfd, 0x80, 0xc2, 0x47, 0xc7, 0x4f, 0x0f, 0x73, 0x50, 0xcc, 0x8c, 0x62, 0x91, 0x21, 0x8b, 0xb0, 0x05, 0xe7, 0x0c, 0xeb, 0x53, 0x3f, 0x84, 0x48, 0x2d, 0x1e, 0xde, 0x95, 0x78, 0xe8, 0xc0, 0x6f, 0xad, 0x41, 0x0f, 0xb5, 0x7f, 0x20, 0xb5, 0x3d, 0xbe, 0x24, 0xa2, 0xc5, 0x7b, 0x2c, 0x10, 0x2c, 0x6d, 0x22, 0x0c, 0xe2, 0x93, 0x17, 0x32, 0x9d, 0x1b, 0x95, 0xb8, 0x4d, 0x83, 0x30, 0xae, 0x53, 0xfe, 0x5f, 0x83, 0xed, 0x19, 0x8a, 0xcc, 0xf5, 0x9e, 0x64, 0x41, 0xcc, 0xb8, 0x7b, 0x08, 0x91, 0x59, 0x0e, 0x37, 0x96, 0xd9, 0x1e, 0x94, 0x14, 0xe0, 0xc7, 0x9f, 0x1d, 0x85, 0xd1, 0xd2, 0xd3, 0xb7, 0x83, 0x27, 0xd8, 0xdc, 0xb7, 0xdb, 0x05, 0xb9, 0x34, 0x71, 0x5f, 0x92, 0x37, 0xfb, 0x46, 0x92, 0x53, 0x95, 0xf0, 0x6d, 0x7b, 0x32, 0x16, 0x43, 0x5e, 0x9b, 0xed, 0xc8, 0xf3, 0xb4, 0x58, 0xa2, 0x54, 0x01, 0x5c, 0x12, 0xcf, 0x6a, 0xd4, 0xd7, 0x3a, 0x3b, 0x66, 0x4f, 0x88, 0x6f, 0xb5, 0xe0, 0x9a, 0x2e, 0xd8, 0x96, 0x57, 0x94, 0x0c, 0x0d, 0xff, 0xb4, 0xa5, 0x92, 0xbc, 0xdd, 0x4b, 0x85, 0x7b, 0x1c, 0x62, 0x01, 0xf9, 0x01, 0xca, 0xc0, 0x21, 0xa6, 0xc9, 0x38, 0x95, 0xee, 0x45, 0x0a, 0x8b, 0x0b, 0x37, 0x9d, 0xda, 0x43, 0x5c, 0x06, 0x54, 0xf3, 0x2e, 0x2c, 0x57, 0xd4, 0x12, 0x29, 0x9f, 0x7d, 0xd3, 0xf3, 0x5e, 0x29, 0x4f, 0x3b, 0x8f, 0xbb, 0x70, 0x95, 0x87, 0xff, 0x5e, 0xda, 0xcd, 0x33, 0xf3, 0xca, 0x2b, 0xc6, 0x70, 0xf6, 0x05, 0x5f, 0x6e, 0xde, 0xea, 0x21, 0x17, 0x56, 0x69, 0x2e, 0x95, 0x2e, 0x26, 0x69, 0xcb, 0x11, 0x2d, 0x81, 0x43, 0xae, 0x85, 0x2b, 0x68, 0x16, 0x09, 0xae, 0xf6, 0x65, 0x73, 0xa5, 0xae, 0xa5, 0xba, 0x00, 0x4e, 0xef, 0x9e, 0x4d, 0xc0, 0xd3, 0x80, 0x36, 0x92, 0xfb, 0x78, 0x4a, 0xa6, 0x0a, 0xa2, 0x00, 0x2b, 0xca, 0xb8, 0xf8, 0xcb, 0x87, 0xe6, 0x85, 0x26, 0xb6, 0xd9, 0x69, 0x80, 0xdb, 0x1a, 0xdf, 0xb6, 0xa9, 0x9a, 0xdf, 0x77, 0x6a, 0x8e, 0x9d, 0xb0, 0xa1, 0x7c, 0x53, 0x48, 0xee, 0x96, 0x40, 0x0e, 0x33, 0x48, 0xf0, 0xf0, 0xf5, 0x0d, 0xbf, 0x6d, 0x05, 0x86, 0x99, 0x4d, 0x5f, 0xcd, 0x03, 0x8f, 0x52, 0x07, 0x5f, 0xa3, 0xe1, 0x38, 0x6b, 0xd9, 0x6a, 0x5c, 0x0c, 0x1a, 0x85, 0xb3, 0x4a, 0xd6, 0x2f, 0x5c, 0x9b, 0x3d, 0x28, 0x25, 0x64, 0xb2, 0x99, 0xa2, 0xbd, 0x7c, 0xfa, 0x7c, 0x75, 0xbf, 0x33, 0x0c, 0x55, 0xab, 0x01, 0x28, 0xa9, 0xf4, 0x9c, 0x3d, 0xfd, 0x82, 0x97, 0x9e, 0x25, 0x69, 0x07, 0x1c, 0x80, 0x1b, 0xe7, 0xd7, 0x7d, 0xdd, 0xbb, 0x54, 0x5d, 0x77, 0x74, 0xcf, 0x3b, 0x30, 0x94, 0xd2, 0x4a, 0xf9, 0x92, 0x06, 0x5f, 0xe9, 0x80, 0x4a, 0xaf, 0xe9, 0xeb, 0x02, 0xd9, 0xb1, 0x03, 0xb1, 0x27, 0xf3, 0xfb, 0xcb, 0x10, 0xd5, 0xb3, 0xc4, 0x02, 0xa5, 0x95, 0x6d, 0x5f, 0xc8, 0xbd, 0x80, 0xc6, 0xf4, 0x5c, 0x79, 0x93, 0xa0, 0x5e, 0xa8, 0xa9, 0xb8, 0x4a, 0x85, 0x6f, 0x94, 0x6a, 0x43, 0x18, 0x2b, 0x2d, 0xa8, 0x28, 0x84, 0xc9, 0x1b, 0x33, 0x6e, 0x24, 0xff, 0xe8, 0x71, 0xf5, 0x3f, 0x4f, 0x04, 0x26, 0x2a, 0x4f, 0x00, 0x7e, 0x82, 0x73, 0x55, 0x7c, 0xcf, 0xee, 0xfc, 0x86, 0xf9, 0xdc, 0x2d, 0x43, 0x16, 0xca, 0xd1, 0x45, 0x81, 0x79, 0x3a, 0xeb, 0x2c, 0xdf, 0x12, 0x85, 0x37, 0x6f, 0x91, 0xba, 0xc1, 0x9a, 0xf3, 0x27, 0xfe, 0x96, 0x2a, 0x49, 0x89, 0x5e, 0xd0, 0x9d, 0xfc, 0xfa, 0x5f, 0x05, 0xbf, 0x00, 0xa4, 0x6e, 0x1d, 0x5b, 0x71, 0xb0, 0x9d, 0x4b, 0x93, 0xb5, 0x8f, 0xad, 0x03, 0xde, 0xe5, 0x7d, 0x61, 0xa2, 0x44, 0x99, 0x9d, 0x79, 0x5b, 0xc7, 0xf8, 0xf8, 0x74, 0xfa, 0x2b, 0x3d, 0x48, 0xd1, 0xe5, 0x8d, 0x18, 0x61, 0x7b, 0x3c, 0xf9, 0x34, 0xdb, 0xcd, 0x70, 0x91, 0xc3, 0x5b, 0x3e, 0xfe, 0x30, 0x38, 0x7d, 0x04, 0x18, 0xd3, 0xec, 0x32, 0x5b, 0xdf, 0x88, 0x65, 0xf8, 0xb1, 0x5c, 0x46, 0x7c, 0xea, 0x99, 0x13, 0xc1, 0x57, 0xe9, 0xa3, 0xd4, 0x15, 0x01, 0xa4, 0x37, 0xf9, 0x75, 0x28, 0x49, 0x2e, 0xd1, 0x60, 0x02, 0x20, 0xe5, 0xa6, 0xe3, 0x99, 0x60, 0xc1, 0x2d, 0x2a, 0xa1, 0x65, 0x52, 0xcd, 0xc9, 0xfa, 0xa9, 0xc8, 0x15, 0x9e, 0x65, 0xd5, 0x6b, 0x6d, 0xc8, 0x7f, 0x32, 0x00, 0x94, 0xcf, 0x67, 0x33, 0xc3, 0x28, 0xed, 0x2c, 0x77, 0x70, 0x25, 0x99, 0x34, 0x70, 0xbf, 0x38, 0x4d, 0x7e, 0xd0, 0x9d, 0x9c, 0x59, 0x24, 0x30, 0x76, 0x54, 0xd5, 0x75, 0xde, 0xb7, 0x1c, 0x90, 0xf9, 0x62, 0x68, 0x08, 0xc3, 0xb3, 0xad, 0xcb, 0xff, 0xaa, 0xff, 0x72, 0x74, 0x4b, 0x5f, 0xc7, 0x56, 0x44, 0xd5, 0x84, 0x03, 0xd0, 0xbf, 0x5e, 0xf0, 0xdb, 0x68, 0x42, 0xe2, 0x67, 0xdc, 0xdf, 0x61, 0x2e, 0xfb, 0x64, 0x69, 0x89, 0xcd, 0x8b, 0x64, 0x90, 0x15, 0xd6, 0x55, 0x83, 0x29, 0x18, 0x56, 0x69, 0x00, 0x38, 0x44, 0xf6, 0x8d, 0x32, 0xb9, 0xb2, 0x4b, 0x5e, 0x3a, 0x58, 0x1a, 0xf5, 0xb2, 0x7c, 0x49, 0xd1, 0x1f, 0x71, 0xf4, 0x74, 0x8c, 0x6a, 0x90, 0x4c, 0x3f, 0xdf, 0xc4, 0x36, 0x33, 0x33, 0x7a, 0x40, 0xc9, 0x93, 0x37, 0xb3, 0xba, 0x21, 0xa7, 0x51, 0x50, 0x52, 0x7d, 0xdb, 0xd6, 0x94, 0x7a, 0xd6, 0x4d, 0x35, 0xca, 0x8f, 0x60, 0x80, 0x97, 0x5d, 0x9a, 0x29, 0xd9, 0x26, 0xd7, 0xeb, 0x6b, 0x24, 0xf8, 0x6f, 0x64, 0xe9, 0xdb, 0x70, 0xa4, 0xa1, 0x8b, 0x1d, 0xad, 0x98, 0xb3, 0xbe, 0xb5, 0xfc, 0x59, 0x9b, 0xf9, 0xe3, 0xc8, 0x19, 0x53, 0x8f, 0xce, 0x27, 0x0f, 0xf1, 0x28, 0xd8, 0xfb, 0x6d, 0x3b, 0x51, 0xbd, 0xdd, 0x05, 0xe6, 0x69, 0xd8, 0x52, 0x80, 0x53, 0x34, 0x33, 0x42, 0x22, 0xc9, 0xac, 0x6c, 0x26, 0x78, 0xad, 0x7f, 0xec, 0x6d, 0x43, 0xa2, 0x0f, 0xa0, 0x10, 0x44, 0x50, 0xa2, 0xf9, 0x03, 0xe9, 0x96, 0x1e, 0xcc, 0x1f, 0x7d, 0x0f, 0x44, 0x17, 0xb8, 0x3d, 0x67, 0xea, 0xc7, 0xae, 0x6f, 0xfb, 0x57, 0xf5, 0xf8, 0x89, 0x7c, 0x62, 0x61, 0x80, 0x3b, 0x76, 0x75, 0x95, 0x4b, 0x99, 0x4b, 0x91, 0x1c, 0x0f, 0x6a, 0xed, 0x19, 0x29, 0x31, 0xa0, 0x2b, 0xb8, 0x77, 0x35, 0x7e, 0xc7, 0x6e, 0x20, 0x87, 0x8a, 0xcd, 0x52, 0x46, 0x91, 0x2e, 0x0b, 0xc8, 0x41, 0xb4, 0xf0, 0xf1, 0x85, 0xf2, 0x5d, 0x78, 0xc1, 0x08, 0xfc, 0x33, 0x08, 0x0f, 0x97, 0x95, 0x8e, 0xb8, 0x2a, 0x75, 0x60, 0x2f, 0x3d, 0x10, 0x52, 0x46, 0x70, 0x52, 0x39, 0xcf, 0x58, 0x51, 0x5b, 0x49, 0x89, 0x1b, 0x24, 0xc0, 0xf4, 0xb1, 0x1b, 0xee, 0x74, 0x53, 0x14, 0xa6, 0xa3, 0xfe, 0xa6, 0x73, 0xf2, 0x34, 0xdf, 0x7c, 0xf9, 0xfb, 0x37, 0xaa, 0x0b, 0x28, 0xc3, 0x0d, 0x0e, 0xdd, 0xab, 0x7c, 0x89, 0x51, 0xde, 0x7c, 0xff, 0xcf, 0x04, 0x64, 0x7c, 0x02, 0xb5, 0xbe, 0x6d, 0x6f, 0xe8, 0xef, 0xb4, 0x43, 0xae, 0x1b, 0xfc, 0x4f, 0x20, 0x43, 0x4a, 0x51, 0x95, 0xb0, 0xd5, 0x75, 0x19, 0x95, 0x18, 0x1b, 0x1b, 0xf0, 0x25, 0xdb, 0x66, 0xb1, 0x3c, 0xc6, 0x53, 0x1e, 0x9c, 0xef, 0x3c, 0x76, 0x99, 0x2b, 0x33, 0xd4, 0xef, 0x14, 0xf4, 0x57, 0x56, 0x54, 0x19, 0x80, 0x57, 0x20, 0x8d, 0xdb, 0x5d, 0x02, 0x43, 0xe2, 0x0f, 0xdc, 0x28, 0x1e, 0xdd, 0x2a, 0x56, 0x8f, 0xd9, 0x87, 0x8a, 0x4e, 0xc9, 0x73, 0xd8, 0x71, 0x7a, 0x53, 0x9d, 0x2f, 0x57, 0xb9, 0xb6, 0x45, 0x39, 0xe6, 0xef, 0x97, 0x81, 0x8d, 0xbe, 0x1b, 0x65, 0xda, 0x32, 0xf3, 0x87, 0xb3, 0x26, 0xd9, 0xcc, 0x3e, 0xba, 0xc0, 0x6b, 0xa3, 0x04, 0xb8, 0x44, 0x13, 0x02, 0x13, 0x74, 0x09, 0xd3, 0xc6, 0x26, 0xcf, 0x27, 0x12, 0xab, 0x45, 0xf5, 0x63, 0xce, 0xde, 0x6c, 0x78, 0x61, 0xeb, 0x2b, 0xc4, 0x1c, 0x1c, 0xb4, 0x14, 0xa8, 0x43, 0x1e, 0x73, 0xf6, 0x5c, 0x0b, 0x4a, 0xd5, 0xcb, 0xda, 0xcc, 0xc4, 0xe4, 0x1e, 0x91, 0x04, 0xb0, 0x4e, 0x81, 0xf2, 0xee, 0xbe, 0xf4, 0x94, 0x59, 0xcd, 0x18, 0x72, 0x29, 0x60, 0x92, 0xa7, 0xdc, 0x90, 0x68, 0x37, 0x36, 0xa0, 0x1e, 0xa3, 0x87, 0x32, 0x1f, 0xbb, 0x2c, 0xba, 0x5f, 0xb4, 0x58, 0x32, 0x3f, 0x7a, 0x15, 0x10, 0xb1, 0x47, 0x85, 0x75, 0x9c, 0x75, 0x6e, 0xa7, 0x82, 0x91, 0xf5, 0xc1, 0x60, 0xb0, 0xaa, 0xa9, 0xd5, 0x06, 0xc5, 0x43, 0x87, 0xb4, 0xaf, 0xe4, 0xc3, 0xe2, 0xc5, 0x0a, 0x63, 0x0e, 0x58, 0x4a, 0xf5, 0xa3, 0xf8, 0x89, 0x19, 0xce, 0xf2, 0x6f, 0x2b, 0x8d, 0x17, 0x19, 0x22, 0x09, 0xbf, 0x0e, 0xb8, 0x25, 0x0e, 0x75, 0xcc, 0x57, 0x76, 0x85, 0x04, 0xb7, 0x7d, 0x3c, 0xb6, 0x55, 0xc1, 0x54, 0x09, 0xd0, 0x39, 0x73, 0x57, 0x24, 0xbd, 0xa2, 0xd6, 0xc4, 0xc9, 0x00, 0x78, 0xe9, 0x7e, 0xb7, 0x0f, 0x29, 0xe9, 0x30, 0xb5, 0x4b, 0x88, 0x83, 0x6b, 0x5a, 0x0a, 0x32, 0x00, 0xf8, 0x57, 0x16, 0x35, 0xf5, 0xd0, 0x99, 0x1e, 0x20, 0xd8, 0x26, 0xcb, 0x5d, 0x93, 0xde, 0x28, 0xf8, 0xed, 0x8d, 0x22, 0x39, 0xdf, 0xdc, 0x0b, 0x39, 0xee, 0xc8, 0x40, 0xf3, 0xf4, 0x52, 0x09, 0x9e, 0x22, 0x78, 0xc0, 0x3b, 0x46, 0x65, 0x36, 0x6a, 0x4a, 0xe5, 0x52, 0x81, 0xfd, 0x1b, 0xfb, 0xdf, 0x17, 0x76, 0x38, 0x7e, 0x77, 0xe1, 0x96, 0xc8, 0xae, 0x3a, 0xcb, 0xac, 0xc1, 0x06, 0x98, 0xf0, 0x2b, 0x63, 0xf4, 0xc9, 0x22, 0x3d, 0x66, 0xa9, 0x1b, 0xc5, 0xb3, 0x58, 0x90, 0x1f, 0xb9, 0x46, 0x01, 0x5b, 0x9b, 0x20, 0x39, 0xa7, 0x1e, 0xa1, 0xd2, 0xc3, 0x53, 0xab, 0xfb, 0xb5, 0x77, 0x96, 0x79, 0xbd, 0x17, 0xc8, 0xec, 0x8b, 0x77, 0x85, 0x54, 0xb0, 0x35, 0x09, 0xd3, 0x53, 0x2a, 0xd4, 0xb5, 0x25, 0x91, 0x46, 0xad, 0x97, 0x6b, 0x6b, 0x61, 0x4a, 0x22, 0x18, 0x29, 0xc6, 0x6c, 0x37, 0x14, 0x70, 0x72, 0x5f, 0x2d, 0xb6, 0x32, 0xa8, 0xfc, 0x8d, 0x21, 0xbd, 0x4f, 0x1d, 0x15, 0x32, 0x3a, 0xba, 0x63, 0x18, 0x5c, 0x17, 0x44, 0xcf, 0x64, 0xb6, 0x7e, 0x1c, 0xd4, 0xa3, 0x40, 0x7b, 0x05, 0x62, 0x4d, 0xb7, 0x6b, 0x26, 0x5c, 0xb7, 0x1b, 0x44, 0xbf, 0x9b, 0x8a, 0xe6, 0x44, 0x08, 0x98, 0x04, 0x59, 0xbf, 0xcd, 0x90, 0x73, 0x75, 0xe2, 0xf1, 0xb0, 0xdf, 0x83, 0xb3, 0xbb, 0x0c, 0x53, 0x7d, 0xf0, 0xf7, 0x31, 0x43, 0xc0, 0x5d, 0xba, 0xbc, 0x57, 0xcc, 0x0e, 0x17, 0x7d, 0xfd, 0xd7, 0xea, 0xba, 0x63, 0x88, 0x6b, 0xbe, 0x04, 0xe3, 0xe2, 0xff, 0x88, 0xbe, 0x5e, 0xa4, 0x8f, 0x06, 0xa7, 0xa2, 0x48, 0x04, 0x75, 0x25, 0x40, 0xdf, 0xdf, 0x31, 0x77, 0x63, 0x16, 0x89, 0xb9, 0x00, 0x53, 0xd0, 0x2b, 0x16, 0x0e, 0xee, 0x25, 0x70, 0x71, 0xb5, 0x3f, 0x0e, 0x0c, 0xc5, 0xaf, 0x27, 0xca, 0xac, 0xd2, 0x6e, 0x24, 0x52, 0x08, 0x95, 0x94, 0x95, 0xc5, 0x0f, 0x4d, 0x30, 0xe5, 0x1b, 0x29, 0xe1, 0x40, 0xfe, 0xe3, 0xcb, 0x7f, 0x8f, 0x86, 0x19, 0x2e, 0xf9, 0x25, 0xe4, 0x12, 0xbd, 0xcd, 0x56, 0xbc, 0xf6, 0xb8, 0x10, 0x5e, 0xe1, 0xc3, 0xca, 0xde, 0x9c, 0x22, 0x39, 0x29, 0x2e, 0x53, 0x36, 0xca, 0xc8, 0x50, 0x1c, 0xbb, 0x4b, 0x09, 0x72, 0x7a, 0x09, 0x11, 0xca, 0x60, 0xd0, 0x98, 0xe8, 0x2f, 0x25, 0x99, 0x27, 0xea, 0xcd, 0x54, 0x19, 0xe9, 0x92, 0xff, 0x6e, 0x2c, 0x43, 0xb9, 0x17, 0xf0, 0xfd, 0xbf, 0xab, 0x80, 0xa9, 0xe2, 0x09, 0x4e, 0xc6, 0x39, 0x3f, 0x42, 0x69, 0x13, 0xaa, 0x52, 0x81, 0x2f, 0x5f, 0x53, 0x60, 0x30, 0xca, 0x0e, 0x77, 0x4b, 0x95, 0x97, 0x61, 0x43, 0xcb, 0xda, 0x24, 0x97, 0x3e, 0x77, 0xb3, 0xfa, 0x26, 0xd0, 0xb7, 0x03, 0x0a, 0x5f, 0x8e, 0x26, 0xe4, 0x4e, 0x94, 0xe3, 0x80, 0x41, 0xa2, 0x3d, 0x25, 0x77, 0xd5, 0x6e, 0x77, 0x11, 0x91, 0xd9, 0x9c, 0xb1, 0xc5, 0x40, 0x9e, 0x47, 0x70, 0x37, 0x10, 0x28, 0x64, 0xd8, 0xf5, 0x61, 0x4a, 0xb9, 0xdd, 0x4a, 0xe6, 0x1b, 0x51, 0x5e, 0x9c, 0x64, 0x71, 0x49, 0x33, 0xd0, 0xdc, 0x43, 0xda, 0x63, 0xd0, 0x9d, 0x68, 0x22, 0x93, 0x99, 0xe8, 0x82, 0x11, 0x7f, 0x55, 0x21, 0xc6, 0xed, 0xa2, 0xb4, 0xde, 0x6f, 0xfd, 0x40, 0x9b, 0x4f, 0x55, 0x8e, 0xf8, 0xaf, 0x1a, 0xd9, 0x8c, 0xd4, 0x44, 0xc9, 0xb0, 0xc5, 0x96, 0xa5, 0xe4, 0x15, 0x24, 0xc4, 0x6f, 0xfd, 0x13, 0x44, 0x46, 0xae, 0xa0, 0xff, 0x2f, 0xe4, 0x63, 0xbb, 0x26, 0xbf, 0xd5, 0xa1, 0x00, 0xcf, 0x11, 0xf1, 0x4e, 0x6d, 0xd7, 0xf3, 0x84, 0x52, 0xd6, 0x31, 0x5b, 0x62, 0x2b, 0xe3, 0x73, 0xc9, 0x25, 0xab, 0x3d, 0x49, 0x4b, 0x82, 0x18, 0xd2, 0xa0, 0xf2, 0xba, 0x54, 0x25, 0x87, 0xd2, 0xd1, 0xa0, 0x80, 0xeb, 0xb6, 0x9c, 0xc9, 0x94, 0x6b, 0xb1, 0x2e, 0xbe, 0x29, 0x05, 0xc9, 0x65, 0x0c, 0x13, 0xbc, 0x73, 0x69, 0xab, 0x26, 0xe1, 0x61, 0x3a, 0x4f, 0x1f, 0xb6, 0x4c, 0x26, 0xb6, 0xde, 0x4f, 0xee, 0x2c, 0x56, 0x9a, 0x34, 0x27, 0x39, 0xae, 0x04, 0xd6, 0x11, 0xbb, 0x5c, 0x8d, 0xed, 0x66, 0xe1, 0xaf, 0xb4, 0xc9, 0xd1, 0xd1, 0xb8, 0xbb, 0x39, 0x1c, 0x8e, 0x52, 0x68, 0xf3, 0x1e, 0xa7, 0xa3, 0xd6, 0xf6, 0xd9, 0x1a, 0x87, 0xe4, 0x55, 0x1b, 0x6b, 0xc3, 0x54, 0x86, 0x32, 0x95, 0xa5, 0x81, 0xbb, 0xd2, 0xac, 0x6c, 0x31, 0x00, 0xab, 0x18, 0x7b, 0x84, 0x40, 0x33, 0xd3, 0xb8, 0x2f, 0x07, 0xb4, 0x3d, 0x62, 0x65, 0xfa, 0x93, 0x2e, 0xdb, 0x45, 0xe6, 0xd8, 0x2d, 0x9e, 0x2b, 0x58, 0x03, 0x5d, 0x6c, 0x5c, 0xe0, 0x49, 0x60, 0x90, 0x53, 0x02, 0x3f, 0x1d, 0x71, 0x9c, 0xd4, 0x6f, 0x82, 0x8d, 0xd4, 0x3c, 0xfb, 0xc9, 0x6e, 0xc2, 0xad, 0x2b, 0x23, 0x50, 0x3b, 0x17, 0xd8, 0x07, 0xd1, 0x5e, 0x2a, 0xe2, 0x13, 0x61, 0x01, 0xf4, 0x54, 0x7a, 0x68, 0xf1, 0x09, 0x97, 0x9c, 0xf0, 0x7d, 0x28, 0x62, 0x6f, 0xc6, 0x3c, 0x9e, 0x98, 0xf7, 0xe6, 0x22, 0xc3, 0x97, 0xe6, 0xc4, 0x3b, 0x52, 0x85, 0xb3, 0x45, 0xef, 0xc1, 0x0b, 0x5e, 0x82, 0xaa, 0xa6, 0xc5, 0xe3, 0x0c, 0x36, 0x39, 0x5e, 0x4e, 0x90, 0x04, 0xac, 0x9a, 0x4b, 0x38, 0x22, 0x3f, 0x8a, 0x39, 0x29, 0x53, 0x16, 0x7b, 0xee, 0x9c, 0xb0, 0x8d, 0x5b, 0xb1, 0xa5, 0x57, 0x45, 0x5c, 0xa2, 0xa0, 0xe7, 0x43, 0xca, 0xd3, 0x8f, 0xc7, 0x06, 0x02, 0x97, 0x2d, 0x9c, 0x2b, 0x97, 0xfb, 0x04, 0xba, 0xd9, 0xa5, 0xf7, 0x50, 0x0d, 0x69, 0xc8, 0xc3, 0x3e, 0x78, 0xf7, 0x66, 0x05, 0x56, 0x04, 0x8a, 0xfd, 0x83, 0x81, 0x44, 0x76, 0x5b, 0x6b, 0x71, 0x6e, 0x3b, 0xba, 0xf8, 0xbd, 0xe5, 0x37, 0x4f, 0x8f, 0x26, 0x8e, 0x41, 0x17, 0xb6, 0xa4, 0xee, 0x82, 0x5f, 0x2a ],
+    const [ 0xaf, 0x08, 0x30, 0x54, 0x84, 0xd0, 0x46, 0x08, 0xc4, 0x3a, 0xc5, 0x8d, 0x68, 0xed, 0x0b, 0xdb, 0x5d, 0xb6, 0x04, 0x41, 0x84, 0x79, 0x4a, 0xf8, 0xfd, 0x6e, 0x90, 0xfe, 0xa5, 0x89, 0x40, 0x21, 0xdd, 0x3a, 0x63, 0x5a, 0x8e, 0x57, 0xc2, 0x5d, 0x6a, 0x57, 0x4a, 0x6e, 0x74, 0xc0, 0xb5, 0x76, 0xc2, 0xe2, 0x67, 0x56, 0x81, 0xc6, 0x96, 0x7b, 0x3b, 0x62, 0xae, 0xb3, 0x55, 0x0e, 0xf4, 0x3f, 0xdc, 0x3c, 0x69, 0x29, 0x81, 0x63, 0xf1, 0xd8, 0xe1, 0x3c, 0xb4, 0xe1, 0x0a, 0x31, 0xc5, 0x20, 0x3b, 0x13, 0x02, 0x08, 0xec, 0x0b, 0x3b, 0x37, 0x0e, 0xd3, 0x96, 0x4d, 0x94, 0x25, 0x31, 0xff, 0x32, 0x74, 0x0a, 0x67, 0x65, 0xdb, 0x1c, 0x9e, 0xb3, 0x53, 0xcb, 0x8d, 0x34, 0x28, 0x82, 0x00, 0x51, 0xae, 0x9b, 0xfc, 0xcc, 0x30, 0x7f, 0x53, 0x01, 0x29, 0x0e, 0x75, 0x6b, 0xb6, 0x41, 0x89, 0x69, 0x4c, 0x0d, 0xbd, 0x42, 0xa6, 0x8b, 0xda, 0x67, 0x02, 0x57, 0x1b, 0xf9, 0x8d, 0x36, 0x3f, 0x8b, 0x1c, 0xfb, 0xdd, 0x29, 0x1c, 0xab, 0xf8, 0x99, 0xcc, 0xdf, 0xd3, 0xe0, 0xaa, 0x6a, 0x06, 0x09, 0x2a, 0x3c, 0xd2, 0x21, 0xae, 0x86, 0xb2, 0x86, 0xb3, 0x1f, 0x32, 0x62, 0x48, 0x27, 0x04, 0x72, 0xc5, 0xea, 0x51, 0x0c, 0xb9, 0x06, 0x4d, 0x60, 0x24, 0xd1, 0x0e, 0xfe, 0xe7, 0xf5, 0x9e, 0x98, 0x78, 0x5d, 0x4f, 0x09, 0xda, 0x55, 0x4e, 0x97, 0xcd, 0xec, 0x7b, 0x75, 0x42, 0x9d, 0x78, 0x8c, 0x11, 0x2f, 0x00, 0x7c, 0xee, 0xda, 0x7b, 0xdd, 0x9a, 0xab, 0xcf, 0xca, 0x56, 0x2a, 0x78, 0xa0, 0x9d, 0x39, 0xdb, 0x03, 0x12, 0x3f, 0xd7, 0x22, 0xb8, 0x86, 0x9e, 0x3c, 0x61, 0xe2, 0xc3, 0x64, 0x69, 0x94, 0x94, 0x81, 0xa3, 0x6d, 0xa9, 0x98, 0x94, 0x37, 0xbd, 0x4e, 0xdf, 0x50, 0xbd, 0xa8, 0x01, 0x98, 0x1f, 0x16, 0x3e, 0x8d, 0x75, 0xb0, 0xdb, 0xb5, 0x42, 0xbf, 0x8e, 0x3d, 0x0c, 0x7f, 0x33, 0xdf, 0xb2, 0x23, 0xc0, 0x09, 0x00, 0x1a, 0x7b, 0x3b, 0x81, 0x91, 0x6b, 0xb0, 0x94, 0x39, 0x0c, 0x42, 0xc2, 0x4a, 0x47, 0x88, 0x4f, 0xc8, 0xa0, 0x41, 0x0f, 0x05, 0xb2, 0xf5, 0x7b, 0x67, 0xd8, 0xd9, 0x04, 0x6b, 0x2e, 0xf4, 0xa8, 0xea, 0xb8, 0x80, 0xc2, 0x9b, 0xe0, 0x93, 0x26, 0xda, 0x26, 0xfe, 0x6d, 0xa7, 0x13, 0x75, 0x8e, 0xf2, 0x6e, 0xf1, 0xaf, 0x16, 0xb3, 0x53, 0x3a, 0xa3, 0xc1, 0x4a, 0x32, 0x60, 0xd3, 0x76, 0xc8, 0x90, 0xb1, 0xce, 0x29, 0x75, 0x28, 0x3f, 0x9b, 0x13, 0xb7, 0x95, 0xc8, 0x36, 0x8b, 0x9f, 0x59, 0xb6, 0xae, 0x8e, 0xc7, 0xfa, 0x7b, 0x9f, 0x6e, 0xbb, 0x55, 0xfa, 0xe4, 0x0a, 0x98, 0xd9, 0x88, 0x95, 0xd0, 0xec, 0x5e, 0x26, 0x29, 0xfd, 0x1a, 0x6c, 0x27, 0xd0, 0x7a, 0xfe, 0x97, 0x4d, 0xd9, 0x9d, 0xc6, 0xe0, 0x02, 0xb9, 0xf0, 0x21, 0x42, 0x37, 0xfb, 0xb0, 0xc1, 0x72, 0x65, 0x63, 0x11, 0x80, 0x7c, 0xa4, 0x08, 0xb6, 0xcd, 0x14, 0xcb, 0x6e, 0xde, 0x75, 0x2c, 0x07, 0x20, 0xc6, 0x36, 0x2e, 0x1f, 0xaf, 0x05, 0x5c, 0xfc, 0x20, 0xdc, 0xa0, 0x1d, 0x36, 0x71, 0x9f, 0x23, 0x5e, 0x8b, 0xd9, 0x1c, 0xbc, 0xcf, 0x2e, 0xfa, 0xce, 0xd7, 0xa0, 0x45, 0x4c, 0x85, 0x5a, 0x0c, 0x53, 0x97, 0xf2, 0x21, 0xc3, 0x7b, 0xeb, 0x86, 0xe6, 0x64, 0x7e, 0x22, 0x52, 0x9d, 0x99, 0xb8, 0x10, 0x1e, 0x29, 0x1a, 0xfd, 0x5d, 0x95, 0x9a, 0x71, 0x66, 0x8a, 0xc2, 0x1f, 0x2e, 0xfe, 0x45, 0x3c, 0x24, 0x6f, 0x34, 0xe4, 0x0a, 0x6c, 0x75, 0xb9, 0x03, 0x57, 0x72, 0xcd, 0xed, 0x69, 0x0e, 0xc2, 0xf0, 0xf6, 0xdd, 0x2f, 0x57, 0xf3, 0x94, 0x46, 0x9f, 0xb5, 0xbe, 0xb4, 0xce, 0xfb, 0xb1, 0xc9, 0x07, 0x2f, 0xc1, 0xd9, 0x5a, 0xe9, 0xb3, 0xe2, 0xe0, 0xb5, 0x75, 0x6e, 0x08, 0x16, 0x0c, 0xbb, 0x2c, 0xcb, 0xcd, 0x1a, 0x68, 0x50, 0xd0, 0x95, 0xab, 0xa8, 0xa2, 0xd4, 0x0e, 0x5a, 0x3a, 0x42, 0x65, 0xba, 0x2e, 0x6b, 0x14, 0x69, 0x27, 0xa8, 0x25, 0x1f, 0x93, 0xff, 0x97, 0xa8, 0x99, 0x45, 0xf8, 0x2d, 0x52, 0x85, 0x36, 0xb5, 0x36, 0xa6, 0xb2, 0xeb, 0xd4, 0x47, 0x96, 0x22, 0xc7, 0xee, 0x69, 0x96, 0xe5, 0x62, 0xe0, 0xf5, 0xb9, 0x55, 0xf7, 0x1e, 0x34, 0x46, 0x41, 0x28, 0x9f, 0xa6, 0x7c, 0xa6, 0xd4, 0x3a, 0x69, 0x29, 0xae, 0xc0, 0xdb, 0x07, 0xbe, 0xd5, 0x0d, 0x5b, 0x3f, 0x16, 0x38, 0x4d, 0x4c, 0x86, 0x65, 0x94, 0x51, 0x30, 0x80, 0x39, 0xc0, 0x0d, 0xaf, 0x9d, 0x05, 0x27, 0xe2, 0xbd, 0xbb, 0xff, 0xaa, 0xb5, 0x20, 0x2c, 0x4e, 0x83, 0xc6, 0x46, 0x1c, 0x0e, 0x8c, 0x02, 0xfd, 0x67, 0xcd, 0x9e, 0x4c, 0x4e, 0xd7, 0x80, 0xe8, 0xf8, 0x9f, 0x1a, 0x88, 0x0f, 0xb3, 0x10, 0x4f, 0xfb, 0x6f, 0x9d, 0xa1, 0x60, 0x74, 0x33, 0x34, 0xe7, 0x56, 0x61, 0x6a, 0x42, 0x95, 0xfa, 0xde, 0x6a, 0xcf, 0x74, 0x3c, 0x2b, 0x33, 0x8e, 0x57, 0xe3, 0x39, 0x35, 0x75, 0x87, 0x90, 0xa9, 0xed, 0xe6, 0x58, 0xdc, 0xf5, 0x32, 0x92, 0x1b, 0xb5, 0xbc, 0xd5, 0xef, 0xa0, 0xff, 0x42, 0x46, 0x03, 0xe0, 0xba, 0xce, 0xde, 0x34, 0x4e, 0xa2, 0xf4, 0x83, 0xf6, 0x28, 0x1e, 0x0b, 0x86, 0x39, 0xe4, 0x08, 0xdf, 0x83, 0x4e, 0x33, 0x62, 0x2c, 0xf8, 0x89, 0xab, 0xb8, 0x65, 0x4d, 0x7b, 0x2d, 0x95, 0x50, 0xf5, 0x75, 0xda, 0x70, 0x0e, 0x03, 0xe7, 0x5f, 0x3f, 0xba, 0x2a, 0xa6, 0x7c, 0x0a, 0x5c, 0xe9, 0x6a, 0x5c, 0x56, 0x6c, 0xcd, 0xb0, 0x26, 0xd6, 0x3f, 0x84, 0x62, 0x35, 0x28, 0xf8, 0xbc, 0x43, 0xea, 0x31, 0xd7, 0xe8, 0x5c, 0xfb, 0x59, 0xff, 0x7a, 0xb2, 0x42, 0x5d, 0x5b, 0x62, 0x7c, 0x0f, 0x63, 0x2d, 0xb2, 0xe4, 0xb9, 0xed, 0x66, 0x2c, 0xfb, 0x1b, 0x3e, 0xbe, 0x31, 0xf0, 0x9f, 0x40, 0x00, 0xc9, 0x7d, 0xa2, 0x21, 0xd0, 0x72, 0xec, 0x11, 0xd9, 0x0d, 0x3a, 0x09, 0x8a, 0x6c, 0x04, 0x30, 0xbf, 0x0d, 0xa3, 0x10, 0x2c, 0xe1, 0x11, 0x46, 0x45, 0xa2, 0xf1, 0x7e, 0x5a, 0x67, 0xcf, 0x9f, 0x07, 0x76, 0xa8, 0x43, 0xcb, 0x59, 0xad, 0x6a, 0xf7, 0x34, 0x44, 0x6f, 0xca, 0x55, 0x50, 0x3b, 0xda, 0x0d, 0xb2, 0xb8, 0xb5, 0xbe, 0x10, 0x88, 0xc9, 0x36, 0xd4, 0xf8, 0x81, 0x3b, 0x78, 0x2f, 0xb1, 0x67, 0x02, 0xac, 0x34, 0x37, 0xca, 0xef, 0xd4, 0x5e, 0x83, 0x75, 0x69, 0x5f, 0x79, 0xea, 0x45, 0x5a, 0x18, 0x9b, 0xd0, 0x26, 0xae, 0x2a, 0x70, 0xa1, 0x72, 0x85, 0xac, 0x44, 0xc4, 0x18, 0x90, 0xfb, 0xb6, 0x42, 0x53, 0x33, 0xcc, 0x06, 0x37, 0x34, 0x00, 0x04, 0xb1, 0xb1, 0x09, 0xa7, 0xca, 0x9d, 0xdd, 0x9f, 0xc5, 0x41, 0x75, 0x92, 0x02, 0x8c, 0xd0, 0x0e, 0x22, 0xaa, 0x3a, 0xc3, 0x6c, 0xd8, 0xce, 0xef, 0x6f, 0x76, 0x3a, 0x19, 0xe9, 0x5d, 0xc2, 0x02, 0xe8, 0x74, 0x88, 0xd9, 0x2f, 0x7e, 0x0a, 0xae, 0xdb, 0x36, 0xec, 0x29, 0x47, 0x9e, 0xf8, 0x7c, 0x2c, 0x94, 0x63, 0x96, 0x0d, 0xa6, 0x51, 0x99, 0xd2, 0x27, 0x9c, 0x8f, 0xb3, 0x82, 0xd1, 0x59, 0x57, 0xcf, 0x7c, 0xe7, 0x3d, 0xa4, 0xa6, 0xaf, 0x5c, 0x2e, 0x9b, 0x57, 0x06, 0x80, 0xf1, 0xb5, 0x12, 0x2a, 0xc5, 0xfa, 0x3a, 0x0e, 0x48, 0x2a, 0xc2, 0x6f, 0x7b, 0xd0, 0x5b, 0x4b, 0x36, 0xef, 0x46, 0xeb, 0x6f, 0x3b, 0xbc, 0xb8, 0xb9, 0x89, 0x8e, 0x50, 0x0b, 0x85, 0x09, 0xd9, 0xc3, 0xa3, 0x1c, 0x96, 0xea, 0x58, 0xbd, 0xb7, 0xba, 0x89, 0x88, 0x76, 0x5d, 0x44, 0xa9, 0x5f, 0xf8, 0xae, 0xfd, 0xef, 0xe8, 0x3c, 0x74, 0x61, 0x4c, 0x26, 0xba, 0xc5, 0xc3, 0x19, 0x16, 0x52, 0x77, 0x2d, 0x92, 0xfd, 0x5a, 0x16, 0x5c, 0x4b, 0xaf, 0x9e, 0x6c, 0x63, 0xcd, 0x53, 0x67, 0x67, 0x1f, 0x7c, 0xc3, 0x04, 0x70, 0x52, 0x2d, 0x48, 0x65, 0x6d, 0x27, 0xb4, 0x4b, 0x7d, 0xf6, 0x93, 0x13, 0x3a, 0xbb, 0x8a, 0x9b, 0x9e, 0xe0, 0x6f, 0x30, 0x51, 0xb5, 0x5e, 0x50, 0x65, 0x5b, 0x0a, 0xb4, 0x43, 0xe2, 0x52, 0x8e, 0xe5, 0xae, 0x15, 0x0f, 0x46, 0x1f, 0x46, 0x2c, 0x17, 0x71, 0x43, 0xa2, 0xb4, 0xe0, 0x62, 0x37, 0x56, 0x10, 0xcd, 0x43, 0x8a, 0xad, 0x91, 0x70, 0xe2, 0x4e, 0xf1, 0xbe, 0xea, 0xa0, 0x00, 0xca, 0x5d, 0xc0, 0x6f, 0x4f, 0x99, 0xe8, 0xa3, 0xed, 0x51, 0x4e, 0x0a, 0x29, 0x82, 0x49, 0xb0, 0xb6, 0xa8, 0xb6, 0x0d, 0xf3, 0x31, 0x9a, 0x22, 0xb4, 0x32, 0x09, 0xc4, 0x45, 0x59, 0x46, 0x37, 0xac, 0x23, 0x2b, 0xfe, 0x2f, 0x4e, 0xcb, 0xf2, 0x16, 0x92, 0x57, 0x92, 0xb2, 0x8c, 0x3e, 0x9a, 0x9e, 0xfb, 0x98, 0xd7, 0x45, 0x2e, 0xc5, 0x39, 0xa4, 0xbd, 0x51, 0x2a, 0x52, 0x78, 0x1b, 0x1e, 0xbd, 0x9d, 0xb7, 0x6b, 0xb6, 0x4e, 0x10, 0x5c, 0x30, 0x41, 0x52, 0x80, 0x44, 0xba, 0x07, 0x48, 0x79, 0xb6, 0x80, 0xd1, 0x43, 0x69, 0x76, 0xff, 0xc9, 0xeb, 0xf1, 0xcb, 0xeb, 0x2f, 0x69, 0xde, 0x84, 0x34, 0x2b, 0x5e, 0xec, 0x7f, 0xff, 0x08, 0xc2, 0xc8, 0x08, 0x7f, 0xe8, 0xf4, 0xeb, 0xe3, 0xce, 0x43, 0x34, 0xa6, 0xf4, 0xcb, 0xf5, 0x9b, 0xaa, 0x25, 0xaf, 0x50, 0x1b, 0x66, 0x76, 0x9e, 0x89, 0x50, 0x51, 0x7e, 0xda, 0xca, 0xe0, 0x1e, 0x54, 0x8e, 0x41, 0x35, 0xa5, 0x22, 0x33, 0x93, 0x26, 0x09, 0x7c, 0xfc, 0x60, 0x3a, 0x89, 0x36, 0xd0, 0xd1, 0x55, 0x61, 0xe7, 0x05, 0x8c, 0x87, 0x55, 0x5a, 0xef, 0x74, 0x87, 0x17, 0xfa, 0xc8, 0x6e, 0xfb, 0xc4, 0x4a, 0x83, 0x2c, 0x28, 0x7f, 0x08, 0x70, 0x22, 0x7c, 0x90, 0x9f, 0x7b, 0xf8, 0xc1, 0x59, 0xa9, 0xa5, 0x59, 0xf4, 0xf1, 0xc1, 0x6f, 0xb8, 0xce, 0xe7, 0xfc, 0x4f, 0x96, 0x2c, 0x99, 0x77, 0x5b, 0x67, 0x8a, 0xfa, 0x0f, 0xd0, 0xfc, 0xe0, 0xec, 0xcd, 0x8b, 0xe3, 0x13, 0x08, 0x07, 0x23, 0x74, 0xc5, 0x78, 0x1b, 0xed, 0x73, 0x5f, 0xd4, 0xb6, 0x80, 0x3f, 0x58, 0xfc, 0x72, 0x5c, 0x6a, 0xcc, 0x34, 0xc3, 0x74, 0x33, 0xad, 0x8a, 0xc1, 0xa4, 0x97, 0x59, 0xec, 0x99, 0x8f, 0x2a, 0x99, 0x7d, 0x68, 0x4c, 0x62, 0xca, 0xc5, 0xae, 0x15, 0x6f, 0xe7, 0x5a, 0x1c, 0x74, 0xc3, 0x40, 0x3c, 0xe0, 0x58, 0x35, 0x83, 0xdb, 0x3f, 0x3b, 0x7b, 0x10, 0x84, 0x03, 0xa4, 0x55, 0xb4, 0xb0, 0x21, 0x8e, 0x37, 0xde, 0xb2, 0xce, 0xe0, 0xe3, 0xe2, 0xc0, 0xc3, 0x54, 0x82, 0x46, 0x47, 0xcc, 0x55, 0x5f, 0x7c, 0xe8, 0x0d, 0x4e, 0xae, 0x96, 0x76, 0xf9, 0x3a, 0x90, 0xf2, 0x8f, 0xa0, 0x23, 0x25, 0x6d, 0xda, 0x35, 0xf1, 0x43, 0xec, 0x86, 0xa5, 0x72, 0xbd, 0x36, 0x71, 0xb9, 0x25, 0x88, 0x1e, 0x11, 0x47, 0xe5, 0xfb, 0xd5, 0x21, 0x24, 0x1b, 0x26, 0x61, 0x08, 0xbd, 0x8e, 0x7a, 0x0a, 0x0c, 0xe3, 0xf8, 0x59, 0x09, 0x6f, 0x10, 0x20, 0xc5, 0x4d, 0x7c, 0x07, 0xd3, 0x16, 0x86, 0xfc, 0xfd, 0xbe, 0x62, 0x33, 0x36, 0xb8, 0xc0, 0x6b, 0xd0, 0x61, 0xa2, 0x74, 0xef, 0x9b, 0x6b, 0xee, 0x3e, 0xb8, 0x39, 0x53, 0xe0, 0x9b, 0x75, 0x38, 0xaa, 0x19, 0xa9, 0xcf, 0x8f, 0xa5, 0x91, 0xb1, 0x5b, 0x2d, 0x74, 0xda, 0xa5, 0x3f, 0xb4, 0xf5, 0xfe, 0x70, 0xa5, 0xdb, 0x6f, 0xfe, 0x9b, 0x56, 0x23, 0xb4, 0x47, 0x2a, 0x60, 0x0e, 0x43, 0x56, 0xbc, 0x9e, 0xeb, 0x97, 0x8d, 0xae, 0x6f, 0x2e, 0xa1, 0x27, 0x26, 0xe3, 0x2f, 0xb2, 0x25, 0x4a, 0x0e, 0x1c, 0x11, 0x45, 0x25, 0xff, 0x31, 0xca, 0x23, 0x9f, 0xc7, 0xe6, 0x70, 0x12, 0xa1, 0x02, 0x63, 0xa4, 0xeb, 0x66, 0xb5, 0x79, 0x47, 0xfb, 0x35, 0x74, 0x20, 0x55, 0xbe, 0x58, 0x3a, 0xf0, 0x66, 0x2d, 0x8e, 0xba, 0xf9, 0xe6, 0x56, 0xd2, 0xa6, 0x40, 0x64, 0x90, 0xf7, 0xed, 0xb7, 0xc5, 0x07, 0xf2, 0x50, 0x44, 0xef, 0x4e, 0x42, 0xa1, 0x81, 0xdc, 0x09, 0x38, 0x39, 0x7a, 0x1c, 0x71, 0x70, 0x6b, 0xc6, 0x43, 0xd3, 0xfa, 0x31, 0xf7, 0x14, 0x60, 0xc4, 0x2f, 0xdf, 0xe8, 0xae, 0x26, 0x10, 0x51, 0xc3, 0x39, 0x23, 0x74, 0x88, 0xa7, 0xeb, 0x27, 0x89, 0x95, 0x87, 0x60, 0xf3, 0x55, 0x93, 0x9e, 0x5e, 0xe7, 0x9b, 0x84, 0xeb, 0xc0, 0xd5, 0xc7, 0x8f, 0xcb, 0x0f, 0x4b, 0xae, 0xae, 0xe6, 0x89, 0xec, 0x4e, 0x39, 0x34, 0x40, 0x95, 0xdd, 0x1c, 0x4a, 0x73, 0x92, 0x52, 0xe6, 0x22, 0x36, 0x8d, 0x01, 0xaf, 0x39, 0xcc, 0xab, 0xb6, 0x51, 0x3d, 0x6e, 0x6d, 0x6f, 0x5e, 0xde, 0xe3, 0xf1, 0x62, 0x72, 0x8a, 0x19, 0xd6, 0x92, 0xf4, 0xbe, 0x84, 0xf1, 0xda, 0x41, 0x98, 0x1d, 0x62, 0xc3, 0x01, 0x55, 0xa1, 0x95, 0x1a, 0x9a, 0x5f, 0xf0, 0x8a, 0x08, 0x1b, 0xe7, 0x69, 0x67, 0x4f, 0x99, 0xa4, 0xfe, 0xf6, 0xab, 0xa2, 0xa7, 0x4a, 0xf6, 0x27, 0x29, 0xd2, 0x7c, 0x79, 0xc1, 0x9c, 0xa1, 0xc2, 0x02, 0xc8, 0x98, 0xb6, 0xe0, 0x46, 0x1b, 0x75, 0x07, 0xdf, 0x5f, 0xb3, 0x71, 0x7a, 0x47, 0x16, 0x37, 0x98, 0xd8, 0xdf, 0xa7, 0x22, 0xed, 0xcd, 0x98, 0x64, 0x2b, 0x3e, 0xfa, 0x59, 0x38, 0x98, 0xb1, 0x29, 0x28, 0xe7, 0xa4, 0xf0, 0x38, 0xc8, 0x10, 0xc1, 0xbf, 0x85, 0x23, 0xeb, 0x61, 0x81, 0xc6, 0x7a, 0x86, 0xd7, 0xba, 0x01, 0x0a, 0x3e, 0xe6, 0x97, 0x37, 0x30, 0xef, 0x20, 0xf0, 0x4b, 0x0a, 0xce, 0x2e, 0xf7, 0x0e, 0xe7, 0xb1, 0x49, 0xce, 0xc8, 0xef, 0x27, 0xa5, 0x2a, 0x51, 0xad, 0x52, 0xa4, 0x9e, 0xd0, 0x06, 0x71, 0xb7, 0x41, 0xbc, 0x74, 0x86, 0x94, 0xc9, 0x79, 0x31, 0xa2, 0xb4, 0xbe, 0x93, 0x2c, 0x47, 0xb2, 0xec, 0xc1, 0xe6, 0xfc, 0xd7, 0xe1, 0x20, 0xbf, 0x7d, 0x62, 0x84, 0x1c, 0x09, 0x13, 0xb6, 0xf9, 0x5c, 0xa0, 0xc2, 0x01, 0x01, 0xb5, 0xaf, 0xec, 0x63, 0x66, 0x58, 0x01, 0x3d, 0xcf, 0x77, 0xd9, 0x53, 0xf7, 0x03, 0x65, 0x60, 0xfb, 0xbc, 0x33, 0x4f, 0x68, 0x04, 0xec, 0xad, 0xe8, 0xf0, 0x22, 0x5f, 0x21, 0x9f, 0x48, 0x90, 0xda, 0xca, 0x02, 0xee, 0x5f, 0x9d, 0xa0, 0x16, 0x27, 0xc5, 0xe4, 0x4c, 0xb5, 0xcb, 0x0c, 0x70, 0xbc, 0xa0, 0x0c, 0x2d, 0x86, 0x79, 0x1c, 0x74, 0x96, 0xdc, 0x72, 0x29, 0x8d, 0xfb, 0x51, 0x1c, 0x4a, 0x42, 0x42, 0x3a, 0x55, 0x2c, 0xa2, 0x05, 0x7e, 0x5a, 0x5c, 0x41, 0xc1, 0xe6, 0xf8, 0xf0, 0x6d, 0xf5, 0xd5, 0x81, 0x86, 0x8b, 0xb2, 0x45, 0x67, 0xa4, 0x73, 0x22, 0xab, 0x80, 0x22, 0x8b, 0x4e, 0x3e, 0x35, 0xaf, 0x10, 0xac, 0x0f, 0xf1, 0x1a, 0x5e, 0xc9, 0x99, 0xe4, 0xfd, 0x31, 0xc9, 0x56, 0xe2, 0x13, 0xb2, 0x2e, 0xe3, 0xb8, 0x07, 0xa1, 0x6d, 0xad, 0xb2, 0x45, 0xd4, 0xc5, 0xc7, 0x2e, 0xe6, 0x61, 0xb6, 0x57, 0xc6, 0xef, 0xc4, 0x44, 0xf8, 0xb1, 0xbc, 0xe6, 0xb8, 0xc0, 0xe1, 0xbf, 0x90, 0x50, 0x28, 0x47, 0x29, 0x35, 0xa4, 0x8d, 0x62, 0xa7, 0x42, 0x21, 0x9f, 0x42, 0xb6, 0x32, 0x63, 0x50, 0xb5, 0xf4, 0x22, 0x4b, 0x65, 0x44, 0x50, 0x9e, 0x12, 0x8f, 0xbe, 0xac, 0x22, 0xf0, 0x26, 0x13, 0x4b, 0x98, 0x05, 0x32, 0x03, 0x73, 0xa8, 0xe9, 0x38, 0x09, 0x8a, 0x9f, 0x42, 0xa2, 0xdd, 0x8a, 0x16, 0xad, 0x67, 0x2a, 0xbc, 0x62, 0x8f, 0x17, 0x03, 0xa7, 0xb8, 0xfd, 0x73, 0x30, 0xcd, 0xe5, 0x83, 0xeb, 0x1d, 0xb6, 0x0c, 0x9b, 0x6a, 0xfb, 0xfe, 0xc2, 0x3c, 0xe6, 0x52, 0xc5, 0x7b, 0x95, 0x3f, 0x4b, 0x3d, 0x95, 0xb1, 0xe6, 0xdd, 0xa5, 0xf7, 0xf5, 0x4d, 0xbc, 0xbb, 0xc9, 0xad, 0x4d, 0x38, 0x06, 0x1c, 0xc9, 0xa7, 0x4c, 0xce, 0x66, 0xfa, 0x17, 0x5e, 0x1f, 0xcd, 0xe4, 0x66, 0xfb, 0x9a, 0x96, 0x4e, 0x93, 0x2c, 0x17, 0x61, 0xce, 0x56, 0x42, 0x26, 0xf0, 0xe4, 0x01, 0xed, 0xd3, 0xd2, 0xb2, 0xa8, 0x73, 0xbc, 0xd0, 0xfc, 0xb1, 0x96, 0xcf, 0x98, 0x50, 0x9d, 0x47, 0xc6, 0x44, 0x8d, 0x55, 0x3f, 0x2c, 0x15, 0x3f, 0x44, 0x1d, 0x88, 0x56, 0xea, 0xa1, 0xd5, 0x21, 0xb6, 0xff, 0xb9, 0xb7, 0x69, 0xbd, 0x33, 0x6d, 0x1d, 0x64, 0x39, 0xb1, 0x91, 0x83, 0xa9, 0x36, 0xc2, 0xf6, 0x82, 0x52, 0xbb, 0x68, 0x54, 0xa4, 0xad, 0x17, 0xf5, 0xf9, 0x42, 0xd7, 0x76, 0x70, 0x2f, 0x5a, 0x55, 0xdd, 0x09, 0xae, 0xf4, 0x6c, 0x59, 0x07, 0x4a, 0x87, 0xf2, 0xbf, 0xd9, 0xf9, 0x82, 0x9b, 0xe0, 0x53, 0x68, 0x50, 0xd1, 0x8e, 0xc5, 0x46, 0x05, 0xf3, 0xd6, 0x9b, 0xaf, 0x38, 0x81, 0x6b, 0x0f, 0xec, 0x2d, 0x4f, 0xe8, 0x15, 0xd7, 0x23, 0x33, 0x17, 0x62, 0x0d, 0x15, 0xd7, 0x2f, 0xba, 0x0f, 0x21, 0xee, 0xeb, 0x75, 0x47, 0xb4, 0x31, 0x21, 0x0b, 0x4d, 0xf4, 0x68, 0xbf, 0xd3, 0xba, 0x4d, 0xab, 0x7f, 0xa6, 0xf5, 0xaf, 0xc0, 0x3f, 0x5b, 0x2a, 0x8a, 0x74, 0x45, 0x1a, 0xf1, 0xdc, 0x77, 0x84, 0xf6, 0x42, 0x26, 0x16, 0xa1, 0x60, 0xaf, 0x0b, 0x50, 0xeb, 0x89, 0x4f, 0x4e, 0xd0, 0x78, 0xe3, 0xa7, 0xbe, 0x04, 0x84, 0x3b, 0xe4, 0x2a, 0x87, 0x12, 0xfc, 0x51, 0x08, 0xef, 0x88, 0x80, 0x43, 0x28, 0x5b, 0xcd, 0x42, 0xb4, 0x5c, 0x19, 0xb9, 0x86, 0x87, 0xfa, 0x2e, 0x19, 0x34, 0xf9, 0x5c, 0x4d, 0x9c, 0xfe, 0xda, 0x71, 0x99, 0x08, 0xf8, 0xa1, 0xad, 0x21, 0xea, 0x52, 0x46, 0x92, 0x28, 0x2b, 0x40, 0x53, 0x14, 0x17, 0xac, 0xc5, 0xdd, 0x98, 0xd0, 0xa3, 0xa4, 0x5e, 0x6e, 0x36, 0xde, 0x18, 0x4a, 0xc9, 0xfa, 0x8a, 0xe6, 0x5d, 0x43, 0xdf, 0x90, 0x9e, 0x07, 0x41, 0x9e, 0x15, 0xf9, 0xa8, 0xf9, 0x9e, 0xd4, 0xef, 0xd8, 0x1d, 0x41, 0x2d, 0xce, 0x6d, 0xfb, 0x42, 0x07, 0x99, 0x31, 0xb0, 0xcf, 0x4f, 0x2c, 0xad, 0x53, 0x91, 0x31, 0x76, 0xac, 0xae, 0xa9, 0xe5, 0x19, 0x71, 0x7f, 0x46, 0x8c, 0x98, 0xca, 0x67, 0x69, 0x87, 0xac, 0xee, 0x8a, 0x3e, 0x79, 0xef, 0x86, 0x89, 0x1c, 0xbe, 0x33, 0x76, 0xb7, 0x02, 0x69, 0x0c, 0x8a, 0x0b, 0x09, 0x3a, 0x16, 0x66, 0x3e, 0x0e, 0x82, 0xae, 0x03, 0x28, 0x3d, 0xa4, 0xe6, 0x6d, 0xe5, 0x82, 0x0b, 0x00, 0x68, 0x8d, 0x73, 0x6e, 0x69, 0xea, 0x7e, 0x28, 0xe5, 0xb2, 0xaf, 0x37, 0x16, 0x49, 0xb0, 0x2b, 0x97, 0xeb, 0x96, 0x54, 0xca, 0x87, 0x65, 0x35, 0x77, 0xd1, 0xd7, 0x36, 0xb5, 0x93, 0x59, 0x99, 0x0e, 0x43, 0x57, 0xaf, 0xde, 0xdb, 0xb9, 0x4c, 0xfc, 0xe5, 0xae, 0x78, 0x9c, 0xd5, 0xa8, 0x67, 0x74, 0x9c, 0xa8, 0xac, 0x1e, 0x7a, 0xbb, 0xa9, 0xbe, 0x14, 0xc4, 0x4a, 0xe4, 0xc6, 0x7d, 0xf3, 0xb4, 0x3a, 0xb9, 0xb6, 0x44, 0x3a, 0xec, 0xca, 0x45, 0xc2, 0xec, 0x38, 0xe6, 0x5a, 0xf9, 0xd8, 0xf5, 0xa2, 0xfc, 0x7c, 0x47, 0x2f, 0x0c, 0x6b, 0x5b, 0x95, 0x36, 0x11, 0x3a, 0xc5, 0x7e, 0xf4, 0xa1, 0x9a, 0x21, 0xea, 0x62, 0xae, 0x1d, 0x8a, 0x08, 0x72, 0xf3, 0xe0, 0xba, 0x7e, 0xac, 0x65, 0x62, 0x25, 0x1a, 0x2d, 0x0e, 0x4d, 0x60, 0x63, 0x96, 0x7d, 0xb5, 0xf3, 0x7f, 0x38, 0x64, 0x86, 0x1f, 0x8a, 0x17, 0xb3, 0x02, 0xe0, 0x56, 0x73, 0x8d, 0x1d, 0x4b, 0xd6, 0xe1, 0xe9, 0xc8, 0xf5, 0x02, 0x4c, 0x8b, 0x28, 0x39, 0x7d, 0xc0, 0x79, 0xb6, 0xf4, 0xc7, 0x58, 0x7a, 0xc6, 0x38, 0x90, 0x74, 0x32, 0x24, 0x79, 0xea, 0x77, 0x9e, 0x6f, 0x1b, 0xe9, 0x7a, 0x84, 0x23, 0x44, 0x55, 0x72, 0x1e, 0x40, 0xd6, 0xd4, 0x90, 0x66, 0x32, 0x95, 0x05, 0x21, 0xf6, 0xa8, 0xf4, 0x18, 0x01, 0xf9, 0xe9, 0xbb, 0xcf, 0xa4, 0xe3, 0x1c, 0xfe, 0x66, 0xfb, 0x01, 0x0a, 0x50, 0x47, 0x37, 0x5c, 0xc3, 0xfe, 0x29, 0x83, 0x98, 0xdd, 0xb1, 0xc1, 0x9f, 0xc9, 0x2d, 0xc9, 0x4b, 0xb5, 0xd6, 0xc7, 0xab, 0xc6, 0x4d, 0xa1, 0x9c, 0xb5, 0x77, 0x7c, 0x3e, 0x76, 0x8b, 0x83, 0xa4, 0x17, 0x69, 0xe3, 0xd0, 0xea, 0x2e, 0x1a, 0xde, 0xe6, 0x05, 0x72, 0x7f, 0x4b, 0x40, 0xc8, 0xa9, 0x85, 0xa7, 0x92, 0x8d, 0x53, 0x0f, 0x21, 0xca, 0x28, 0x2f, 0x23, 0xe0, 0xd2, 0xb0, 0x6b, 0xe7, 0x59, 0x83, 0xf5, 0x81, 0x2a, 0x77, 0x24, 0x0d, 0x74, 0x0b, 0x4f, 0x1d, 0xd3, 0x80, 0x7c, 0x2a, 0x2c, 0x33, 0x6b, 0x87, 0xd8, 0x2a, 0xd7, 0x94, 0x04, 0xed, 0xf8, 0x34, 0x57, 0x97, 0x4c, 0x81, 0xd6, 0x2c, 0x97, 0xbe, 0x05, 0x2d, 0x29, 0x8c, 0x4f, 0x6a, 0x5f, 0x61, 0xa8, 0x18, 0x6c, 0x37, 0x71, 0x23, 0x59, 0x81, 0x9c, 0xc6, 0x4b, 0x63, 0x10, 0x58, 0x05, 0x22, 0x4f, 0x69, 0xad, 0xda, 0x56, 0x0d, 0xd3, 0x6f, 0xc5, 0x78, 0xaf, 0xc5, 0x3f, 0xcb, 0xaa, 0x34, 0x14, 0x2e, 0x21, 0x36, 0x1d, 0x1f, 0x65, 0x63, 0xe8, 0x09, 0x06, 0xa0, 0x15, 0x19, 0x51, 0x93, 0x00, 0x4d, 0x17, 0x5a, 0xa1, 0xce, 0xb0, 0x7c, 0xb0, 0x7f, 0x40, 0x1f, 0x0c, 0xd6, 0x39, 0x7c, 0x5d, 0xeb, 0x21, 0x91, 0xf8, 0xce, 0x96, 0x15, 0x04, 0x1e, 0x8f, 0xb1, 0xdb, 0xd7, 0xe4, 0x6d, 0xb3, 0x6c, 0x11, 0x69, 0x7e, 0x16, 0x37, 0xcd, 0x0f, 0x6b, 0x63, 0x02, 0x7d, 0x32, 0x13, 0x23, 0xcc, 0x76, 0xf6, 0xae, 0xca, 0xd9, 0xf4, 0x80, 0x38, 0x2b, 0x6e, 0x00, 0x2a, 0x3b, 0xc7, 0x9a, 0xb1, 0xed, 0x23, 0x6f, 0xb6, 0x8d, 0x6e, 0x4a, 0x29, 0x63, 0xa1, 0xd6, 0x5c, 0x88, 0x40, 0x0f, 0xa9, 0xf8, 0x27, 0xf7, 0x5b, 0xe7, 0x87, 0x8a, 0xcc, 0x59, 0x2c, 0xf3, 0xca, 0xed, 0x01, 0x00, 0x3f, 0xf9, 0xd5, 0xd4, 0x11, 0xdc, 0x5f, 0xdc, 0x48, 0x90, 0x80, 0x04, 0x6f, 0x7f, 0xc9, 0x2a, 0x3c, 0x98, 0x3d, 0xd2, 0x73, 0xa1, 0x58, 0x1c, 0x07, 0xcf, 0x50, 0xf4, 0x82, 0x94, 0x9a, 0x89, 0xa8, 0xb8, 0xb0, 0x00, 0x57, 0xab, 0x12, 0x69, 0xb2, 0x1a, 0x8a, 0xf2, 0x7f, 0xc0, 0xb5, 0x5a, 0xcc, 0x7f, 0xbf, 0xa9, 0xd9, 0xaf, 0x6e, 0x1f, 0x32, 0xb6, 0x62, 0x6a, 0x1c, 0xd8, 0x9b, 0x1c, 0x32, 0x51, 0x3b, 0x5b, 0x50, 0xa1, 0x8d, 0xda, 0xb0, 0x28, 0x47, 0x09, 0x53, 0xf2, 0x0c, 0x89, 0xa3, 0xd4, 0x35, 0xe3, 0x56, 0xb8, 0xd1, 0x79, 0x95, 0x35, 0xea, 0xbd, 0x5e, 0x63, 0x0b, 0xa0, 0x27, 0xed, 0xfe, 0x4e, 0xc4, 0x67, 0xda, 0x18, 0x8a, 0xe2, 0x3e, 0xb1, 0xb5, 0xbe, 0xd7, 0x9e, 0x07, 0xc0, 0x28, 0xe8, 0xb2, 0x64, 0x8a, 0x14, 0x78, 0x75, 0x71, 0x54, 0x11, 0xda, 0xf2, 0xff, 0xcd, 0xb3, 0x82, 0x3f, 0x7a, 0xa5, 0x01, 0x0a, 0x88, 0x71, 0xf7, 0x53, 0x6b, 0xcc, 0x1d, 0x81, 0x41, 0x6b, 0x1f, 0x20, 0xb5, 0x5d, 0xa0, 0xd6, 0x23, 0x9d, 0x7e, 0x99, 0xfd, 0xe8, 0x58, 0x20, 0x6d, 0xcc, 0x4e, 0x97, 0x3b, 0x02, 0x08, 0x97, 0xf2, 0xfd, 0xfa, 0x55, 0x3e, 0xc3, 0xe6, 0x1a, 0x99, 0xfc, 0xa2, 0xf3, 0x26, 0x48, 0x1b, 0xa9, 0xdd, 0xd6, 0x9a, 0xf3, 0xe9, 0x33, 0x46, 0xeb, 0x4e, 0x5f, 0xeb, 0xbf, 0xcf, 0x26, 0xf9, 0xa9, 0x0f, 0xad, 0xd0, 0x21, 0xf6, 0x4c, 0x3a, 0x51, 0x56, 0x9b, 0x39, 0xc9, 0xcf, 0xd0, 0x04, 0x74, 0xf0, 0x48, 0x4c, 0xca, 0x9e, 0x63, 0xc3, 0x48, 0xba, 0x95, 0xdf, 0x1d, 0xfe, 0xba, 0xdb, 0x27, 0x28, 0xaa, 0x00, 0x1d, 0x5b, 0x0e, 0x22, 0x0e, 0xc2, 0x72, 0x6d, 0x0a, 0x76, 0x9b, 0x62, 0x1f, 0xa2, 0x1a, 0x1c, 0x87, 0xe5, 0x21, 0xd8, 0x1f, 0xf7, 0x96, 0xb4, 0x1b, 0x90, 0x66, 0xb7, 0xf8, 0x85, 0x1c, 0x12, 0xb3, 0x34, 0xb2, 0xa5, 0x39, 0x23, 0xa6, 0xc5, 0x1e, 0xe4, 0x51, 0x3d, 0x91, 0x3c, 0x75, 0x92, 0x90, 0x84, 0x15, 0x8c, 0x58, 0x4e, 0x89, 0xf1, 0x20, 0x4c, 0xd1, 0x94, 0x06, 0x6e, 0x2a, 0x8e, 0x4a, 0x4b, 0xdf, 0xcc, 0xba, 0xc2, 0x62, 0xca, 0x6d, 0xe1, 0x9b, 0x9d, 0xb4, 0x05, 0x80, 0x37, 0x4e, 0x43, 0xe6, 0xe7, 0xdb, 0x07, 0x96, 0x1f, 0x93, 0xfb, 0xa4, 0x7a, 0x38, 0x2b, 0xfc, 0xfd, 0x49, 0x66, 0x3e, 0x9e, 0x79, 0xe7, 0xcc, 0x02, 0x60, 0x35, 0x21, 0x8b, 0x6f, 0x47, 0x64, 0x92, 0x29, 0xec, 0x3c, 0xf1, 0x90, 0x6a, 0xe7, 0xc5, 0xde, 0x65, 0x86, 0x72, 0x76, 0x03, 0xbb, 0xe7, 0x1a, 0x4e, 0x76, 0x23, 0x5e, 0xda, 0x0c, 0xf7, 0x5d, 0xa7, 0x8a, 0x0e, 0xaa, 0x48, 0x48, 0x2c, 0x8a, 0x45, 0xc1, 0xb3, 0x60, 0xbf, 0xa1, 0x6b, 0x68, 0x52, 0x20, 0x82, 0xa8, 0x40, 0x8f, 0xd2, 0x24, 0xcb, 0x30, 0x63, 0x52, 0xe2, 0x4b, 0x31, 0xcd, 0x00, 0x7e, 0x2f, 0x4d, 0x52, 0x55, 0x8b, 0xd7, 0x18, 0x1b, 0x34, 0x31, 0x4d, 0xef, 0x9a, 0x99, 0x8a, 0x1a, 0xb5, 0xb6, 0x28, 0x9f, 0x48, 0xcf, 0xa5, 0x14, 0x67, 0x3b, 0x48, 0xb1, 0x37, 0x19, 0x08, 0xa7, 0xf5, 0x41, 0xab, 0xb2, 0x39, 0x7a, 0x2b, 0xf2, 0x7c, 0xed, 0x5d, 0xf7, 0xd8, 0xd9, 0xd4, 0x1b, 0x10, 0x89, 0x04, 0x14, 0xd0, 0x83, 0xa3, 0xc9, 0x36, 0x03, 0x55, 0x65, 0x90, 0xa7, 0x87, 0xaa, 0x68, 0x6c, 0x9b, 0x89, 0xbe, 0xd9, 0x46, 0xef, 0x94, 0x7a, 0x37, 0xe1, 0xb0, 0x90, 0xfa, 0xcb, 0x9d, 0x07, 0x1b, 0x15, 0xf3, 0xa8, 0x8e, 0xf8, 0xd8, 0x90, 0x4e, 0x90, 0xc7, 0xe1, 0x45, 0x32, 0x90, 0xb7, 0x6c, 0xff, 0xa0, 0x5e, 0x33, 0xb9, 0x83, 0xc2, 0x23, 0xd6, 0xa7, 0x26, 0xc2, 0xd3, 0x63, 0x19, 0xb7, 0xcb, 0x37, 0xa6, 0x2e, 0x48, 0x56, 0xcc, 0x7e, 0x59, 0x61, 0x2e, 0x09, 0xe5, 0x76, 0x0a, 0x64, 0x3e, 0x69, 0x6f, 0xb9, 0xf9, 0x51, 0xab, 0x69, 0xfe, 0x47, 0x03, 0xf5, 0xdb, 0x6a, 0xa8, 0x1e, 0x5e, 0x27, 0xe6, 0x4b, 0x62, 0xb7, 0x9d, 0x2c, 0xe9, 0xe8, 0xf5, 0x9d, 0x6b, 0x21, 0x4e, 0xcd, 0x6e, 0xa0, 0x76, 0x9f, 0x57, 0x07, 0x1f, 0x50, 0x80, 0x17, 0x90, 0x5b, 0x8a, 0xbb, 0x9a, 0x99, 0xf5, 0x48, 0xce, 0xad, 0xed, 0x03, 0xed, 0x9f, 0x67, 0xe4, 0xa0, 0xc7, 0x6d, 0x99, 0x69, 0xed, 0xb6, 0xce, 0xda, 0xae, 0x7a, 0xac, 0x05, 0x21, 0x84, 0x9f, 0x33, 0xbb, 0x89, 0x5d, 0xd9, 0x70, 0xb8, 0x24, 0xc7, 0x1b, 0x92, 0x42, 0xa3, 0x20, 0xfc, 0xdb, 0x96, 0x50, 0x93, 0xe7, 0x45, 0x0d, 0x3f, 0x7a, 0x03, 0xae, 0x0b, 0x48, 0x44, 0x25, 0x34, 0x68, 0x55, 0xde, 0x7f, 0x58, 0x4b, 0xeb, 0xd0, 0x42, 0x3a, 0x5f, 0xf9, 0x7d, 0xa7, 0xf7, 0xd0, 0x57, 0x3f, 0x00, 0x84, 0x12, 0xc9, 0x74, 0x31, 0x2c, 0x59, 0x67, 0xb1, 0xe4, 0xc6, 0xa1, 0xb6, 0xf9, 0x5f, 0x8d, 0x15, 0xb5, 0xda, 0x52, 0x65, 0x2a, 0x8d, 0x3f, 0xc9, 0xbc, 0xe1, 0x6c, 0x0a, 0xdf, 0x03, 0x9e, 0xe9, 0x22, 0xdc, 0x6c, 0xb3, 0x6d, 0x44, 0xa0, 0x15, 0x86, 0x72, 0xe0, 0x32, 0xda, 0xb7, 0x8e, 0xf3, 0x7b, 0x6d, 0xec, 0x9e, 0x65, 0x2a, 0x84, 0xab, 0x05, 0x39, 0xc7, 0xd3, 0xfc, 0x4a, 0xf4, 0x69, 0x20, 0x68, 0x3b, 0xed, 0xc3, 0x2c, 0x23, 0xdf, 0x39, 0x30, 0x29, 0xd1, 0x94, 0xc7, 0xa9, 0xc0, 0xb2, 0xeb, 0x02, 0xa4, 0x7a, 0x77, 0xf6, 0x46, 0x62, 0x97, 0x4f, 0x52, 0x34, 0x7c, 0xc8, 0xad, 0x13, 0x54, 0x2a, 0x08, 0xb9, 0x79, 0xb6, 0xb6, 0x02, 0xe8, 0xc3, 0xba, 0xae, 0xf6, 0xa8, 0x25, 0x62, 0x3e, 0xdc, 0x9f, 0xf1, 0xde, 0x5c, 0x43, 0xda, 0xe3, 0x4d, 0xb0, 0x12, 0x01, 0xe3, 0x5c, 0x03, 0x88, 0x81, 0x2c, 0xd4, 0x93, 0x22, 0x42, 0xeb, 0x82, 0xf7, 0x17, 0xb0, 0xab, 0x51, 0xc9, 0x94, 0x4d, 0xc2, 0xb6, 0x53, 0xc5, 0x7f, 0x49, 0x75, 0x05, 0x09, 0x14, 0x1b, 0x41, 0x0d, 0x1f, 0xf8, 0xeb, 0x88, 0x80, 0x9e, 0xe2, 0x2e, 0x2c, 0xfb, 0xe7, 0x0d, 0x0d, 0x23, 0x50, 0x6e, 0x55, 0x50, 0x00, 0xfc, 0x11, 0x26, 0x96, 0x28, 0x01, 0x3c, 0xe5, 0xcb, 0xa7, 0xd9, 0xa5, 0x0d, 0x9e, 0xfb, 0x67, 0x87, 0x2d, 0x9e, 0xcf, 0xa4, 0x1c, 0x3a, 0xfd, 0x4d, 0xc6, 0x8e, 0x4c, 0xc5, 0x70, 0x9c, 0x3f, 0xd1, 0xd9, 0xf5, 0xb8, 0x1d, 0x12, 0x36, 0x6b, 0xdb, 0x90, 0xd3, 0x93, 0xad, 0x80, 0x13, 0xe3, 0xc5, 0x5a, 0x5c, 0xc0, 0x4a, 0xb9, 0xb1, 0xad, 0xfe, 0x6a, 0x79, 0x07, 0x1f, 0xc3, 0x82, 0xf2, 0x8b, 0x36, 0x45, 0x93, 0x27, 0x26, 0x6c, 0x80, 0x80, 0xf8, 0x91, 0x74, 0xb3, 0x6e, 0x49, 0x48, 0x8b, 0x30, 0x61, 0x1e, 0xea, 0xac, 0x67, 0xe0, 0x6a, 0x20, 0x6c, 0xe9, 0x43, 0xf5, 0x09, 0x01, 0x70, 0x4f, 0xa0, 0x8f, 0x0d, 0xe2, 0xe4, 0x0a, 0x04, 0x07, 0x9c, 0xb1, 0xe8, 0x0f, 0xa4, 0x7c, 0x21, 0xd7, 0x34, 0x52, 0x4a, 0x9c, 0x64, 0x7c, 0xd7, 0x11, 0xf0, 0x5a, 0xfb, 0xaf, 0x39, 0x54, 0xc9, 0x4d, 0x8d, 0x14, 0x99, 0xf0, 0xa8, 0xf2, 0xad, 0xe4, 0x7b, 0xb0, 0x14, 0x0c, 0x2c, 0x68, 0xcf, 0x76, 0x5d, 0xc2, 0x33, 0x32, 0xb1, 0x6a, 0x8e, 0x65, 0x8c, 0xc2, 0x0d, 0x99, 0x1b, 0xd4, 0xdd, 0x57, 0x95, 0x8a, 0x91, 0xf8, 0xc0, 0x21, 0xc4, 0xb8, 0xb6, 0xdb, 0xff, 0x0c, 0xe9, 0xf4, 0xdd, 0x36, 0x65, 0xd8, 0x6c, 0x16, 0x55, 0x93, 0xd7, 0x43, 0xc9, 0x89, 0x42, 0x5a, 0xb6, 0x67, 0xf6, 0x96, 0x3e, 0x59, 0xbe, 0xa1, 0x32, 0x7e, 0x90, 0xaa, 0xd6, 0x99, 0x70, 0xb8, 0xe4, 0x09, 0x92, 0x3e, 0xd3, 0xfb, 0xbf, 0xef, 0x58, 0xde, 0xf9, 0xd3, 0x2e, 0x17, 0x62, 0x9b, 0x13, 0xf6, 0x5a, 0x32, 0x13, 0xe9, 0xe8, 0x94, 0x08, 0xf0, 0x5b, 0xe3, 0x62, 0x51, 0x31, 0xb8, 0x24, 0x8d, 0x37, 0xb7, 0x2f, 0x92, 0xf2, 0x66, 0xc3, 0x32, 0x3e, 0x3f, 0x43, 0xd4, 0x35, 0x03, 0x38, 0x6a, 0x52, 0x52, 0x99, 0xa3, 0xd6, 0x79, 0x4a, 0x61, 0x6b, 0x8b, 0xe2, 0x6d, 0x08, 0xb3, 0xb1, 0x6a, 0x14, 0xc8, 0x02, 0x07, 0xce, 0x22, 0x9d, 0x79, 0xec, 0xac, 0x90, 0x29, 0x82, 0x3b, 0x2f, 0xa9, 0x26, 0x1e, 0x5a, 0xed, 0x52, 0xf7, 0xfe, 0xb8, 0x0a, 0xc9, 0xde, 0x54, 0xbe, 0x51, 0x94, 0x86, 0x71, 0x9a, 0xd2, 0xc1, 0x1b, 0xcc, 0xee, 0x9a, 0x4c, 0x44, 0x9e, 0x7c, 0x13, 0xea, 0x00, 0x9d, 0x1e, 0xbf, 0xdd, 0x30, 0x22, 0xb6, 0x2e, 0xdd, 0x7e, 0xc5, 0xdf, 0x6e, 0x1b, 0x3b, 0xd4, 0xcb, 0x96, 0x54, 0x2a, 0x28, 0xa1, 0x0b, 0xbf, 0x7d, 0xa6, 0x2f, 0xf4, 0x36, 0xae, 0xb9, 0xb1, 0x2c, 0x82, 0x5d, 0xaa, 0xd5, 0x0f, 0x5f, 0xe1, 0xb7, 0x0f, 0xa8, 0x6c, 0x23, 0xe6, 0x19, 0x79, 0x1f, 0xca, 0x1f, 0x8f, 0xa4, 0x27, 0x88, 0x17, 0x0a, 0x42, 0x95, 0x1a, 0xc0, 0x1c, 0x50, 0x4c, 0x40, 0x99, 0x1f, 0x4a, 0x42, 0xe1, 0x9a, 0x20, 0x30, 0x07, 0x9a, 0x0e, 0xdb, 0xe9, 0x92, 0x8c, 0x6c, 0x57, 0x23, 0x8b, 0x9d, 0x77, 0xea, 0xfe, 0x29, 0x67, 0x9d, 0x99, 0x80, 0x25, 0x56, 0xd8, 0xc0, 0xac, 0x2e, 0x44, 0xe1, 0x60, 0x0e, 0xf2, 0x2f, 0xac, 0xc2, 0x4c, 0xfe, 0xea, 0x4f, 0x13, 0x99, 0x83, 0x87, 0xa5, 0x7b, 0x57, 0xda, 0x7c, 0xc2, 0x5f, 0x6f, 0xf8, 0xe0, 0x90, 0x74, 0x5e, 0x94, 0x03, 0xb2, 0x20, 0x19, 0x54, 0x64, 0x5f, 0x9d, 0x48, 0x49, 0xae, 0xf4, 0xb2, 0xf8, 0x19, 0x8e, 0x97, 0x74, 0x66, 0xa6, 0x90, 0x00, 0x9a, 0xbd, 0x70, 0x34, 0xbf, 0x47, 0x27, 0x51, 0xe5, 0xa4, 0xe6, 0xd2, 0x67, 0x51, 0x84, 0x43, 0x6f, 0x60, 0x21, 0x56, 0xbc, 0x25, 0x09, 0x34, 0xa3, 0x33, 0xda, 0x11, 0x54, 0x87, 0xea, 0x03, 0x5f, 0x02, 0xe3, 0x14, 0x77, 0x1d, 0xb0, 0x96, 0x75, 0xd8, 0x9d, 0xb6, 0xa0, 0xf3, 0xb9, 0x54, 0x2b, 0x61, 0x7f, 0x12, 0xff, 0xfa, 0xb6, 0xab, 0xbb, 0x70, 0x96, 0x87, 0xf9, 0x84, 0x2c, 0x8c, 0xd4, 0x79, 0x00, 0x36, 0xa7, 0xc9, 0xf4, 0xea, 0x16, 0x18, 0x6f, 0x87, 0x53, 0x66, 0xbb, 0x3f, 0x9a, 0x88, 0xac, 0xa5, 0xfe, 0xd9, 0x83, 0x06, 0x68, 0x2d, 0x11, 0xfd, 0xdd, 0x06, 0x20, 0x42, 0xff, 0x0b, 0x0e, 0xc3, 0xd7, 0xb5, 0xbb, 0xf6, 0xd1, 0x4c, 0xa6, 0x6d, 0x08, 0x12, 0x52, 0xab, 0xc4, 0xbe, 0xef, 0x36, 0x41, 0x2b, 0x36, 0xed, 0xb3, 0x52, 0x95, 0x9c, 0x86, 0x76, 0x8c, 0xce, 0xea, 0x9e, 0x57, 0xe2, 0x8f, 0x48, 0xcd, 0x61, 0xad, 0x5c, 0x88, 0x8f, 0x48, 0x5f, 0x46, 0x40, 0xb2, 0xe9, 0x8f, 0xed, 0x51, 0x59, 0x98, 0x07, 0xa2, 0xc7, 0x68, 0x8b, 0x7e, 0x3a, 0x39, 0xd7, 0x9d, 0x1b, 0x21, 0xbc, 0x58, 0xea, 0xf1, 0xd4, 0xb3, 0x30, 0x5e, 0x16, 0x9a, 0xb5, 0x5e, 0xa7, 0x6b, 0xf2, 0xd5, 0xf3, 0xb5, 0xc9, 0x71, 0xfd, 0x40, 0x74, 0xd2, 0xf3, 0x4d, 0xbc, 0xef, 0x06, 0x1e, 0x6b, 0xb5, 0x79, 0xb9, 0x03, 0xf1, 0xf7, 0xea, 0xb0, 0x6f, 0x29, 0x87, 0x7c, 0x63, 0x88, 0xf7, 0xc2, 0x09, 0x70, 0xf5, 0xe5, 0x89, 0x76, 0x92, 0x41, 0x1d, 0xfc, 0x79, 0x62, 0x75, 0x03, 0x77, 0x74, 0x5b, 0x40, 0x3b, 0xfb, 0x93, 0x71, 0x5a, 0xc5, 0x05, 0xf1, 0x96, 0x1c, 0x1e, 0x8a, 0x5f, 0x40, 0x73, 0x8b, 0x9a, 0x14, 0xa7, 0x1b, 0xa2, 0x17, 0x8f, 0xcd, 0x8c, 0x96, 0x95, 0x75, 0xb0, 0x20, 0x5a, 0x39, 0x64, 0x3b, 0xa0, 0xeb, 0x0b, 0x55, 0x66, 0x96, 0x4f, 0xfd, 0x54, 0x56, 0xaa, 0x53, 0x5a, 0x6d, 0x2b, 0xbd, 0x95, 0x94, 0x77, 0xdc, 0x72, 0x8f, 0x0e, 0xbf, 0x15, 0x04, 0xcf, 0x56, 0xfc, 0x8d, 0xbf, 0x29, 0xdf, 0x0c, 0x06, 0x49, 0xdb, 0x3f, 0x3a, 0x87, 0xd0, 0x94, 0xe0, 0xe5, 0x08, 0x3e, 0x30, 0x4a, 0x19, 0x88, 0x19, 0x7a, 0x0c, 0x69, 0x85, 0x44, 0xbe, 0x59, 0xde, 0xfe, 0x87, 0x64, 0xd1, 0x2e, 0x1a, 0x7d, 0x52, 0x8a, 0xac, 0x14, 0xe0, 0x23, 0x59, 0xeb, 0x0a, 0xdd, 0xc3, 0x25, 0x32, 0x22, 0xfc, 0xa0, 0x91, 0xd7, 0xa6, 0x84, 0x7b, 0x8f, 0x58, 0x1c, 0xe4, 0xff, 0x44, 0xe5, 0x24, 0xb3, 0x17, 0xe5, 0xf7, 0xff, 0x21, 0x3e, 0xc8, 0x37, 0xb6, 0x03, 0x2f, 0x22, 0xd4, 0x4a, 0xb8, 0xad, 0x05, 0x83, 0xe6, 0xdd, 0x87, 0x08, 0x77, 0x07, 0xab, 0xf5, 0xea, 0x43, 0x7b, 0x39, 0x3f, 0x1e, 0x9f, 0xed, 0xfe, 0x8f, 0x82, 0xe5, 0x7a, 0x2d, 0xb0, 0x85, 0x57, 0x9e, 0x83, 0xd6, 0x4a, 0x53, 0xfe, 0xd9, 0x20, 0x72, 0xf9, 0x1c, 0x02, 0x14, 0x7e, 0x8a, 0xf7, 0xb1, 0x74, 0x87, 0xaa, 0xd8, 0x7a, 0x3d, 0x6e, 0x24, 0x16, 0x30, 0x7f, 0x6b, 0x0f, 0x19, 0x8a, 0x38, 0x17, 0xf1, 0x70, 0x7c, 0xad, 0x4c, 0x48, 0x80, 0x42, 0xe8, 0xa3, 0x1e, 0x9b, 0x86, 0x13, 0x31, 0x76, 0xf8, 0xee, 0x4a, 0x70, 0x7c, 0x4f, 0xa5, 0x26, 0x48, 0x5e, 0x5b, 0x9b, 0x66, 0xd1, 0xd8, 0xda, 0xc2, 0xb3, 0x90, 0xdc, 0x82, 0x64, 0xee, 0xab, 0x95, 0xe2, 0x8d, 0xc8, 0x8f, 0x46, 0xab, 0xca, 0xb4, 0x92, 0xdb, 0x49, 0x52, 0xa9, 0xf9, 0xfa, 0x55, 0x9f, 0x63, 0x1b, 0x15, 0x33, 0x66, 0x12, 0x72, 0x9a, 0xf7, 0x51, 0x23, 0x7f, 0xa4, 0x7c, 0x4b, 0x47, 0xca, 0xce, 0x4d, 0x99, 0x07, 0xb9, 0xe2, 0x1e, 0xf2, 0xcc, 0x69, 0x85, 0x0a, 0xda, 0x7e, 0xcb, 0xed, 0x59, 0xcd, 0xb9, 0xcb, 0x08, 0x28, 0xae, 0x19, 0xd5, 0xd8, 0x9e, 0x8a, 0xfd, 0x31, 0x5b, 0x3b, 0x75, 0x6a, 0x13, 0x2d, 0x89, 0xab, 0x1a, 0xf9, 0xc3, 0x66, 0xea, 0xbf, 0x0e, 0xeb, 0x69, 0x60, 0x1b, 0x37, 0x6a, 0xed, 0x04, 0x0d, 0x75, 0x5f, 0x2f, 0x49, 0xcb, 0x88, 0x76, 0x70, 0xa5, 0x49, 0x84, 0x8b, 0xbd, 0x06, 0x82, 0x36, 0x0f, 0x57, 0xf4, 0xf4, 0xe1, 0x00, 0xdd, 0xc5, 0x01, 0x24, 0x2a, 0xfb, 0x4e, 0xb5, 0x4d, 0x49, 0x79, 0x2f, 0x29, 0x1d, 0x0d, 0x86, 0x2e, 0x2f, 0xad, 0x5c, 0xc5, 0x5a, 0x9d, 0x78, 0xee, 0xac, 0x85, 0x74, 0x27, 0xb9, 0x71, 0xb5, 0x91, 0x34, 0x1b, 0xa1, 0x4e, 0xc0, 0x6d, 0x0b, 0x2d, 0x03, 0x42, 0xf2, 0x89, 0xfc, 0x6d, 0x6c, 0x6e, 0x97, 0xfc, 0xdd, 0xfe, 0x7f, 0xbe, 0x6c, 0x13, 0x34, 0x02, 0xb8, 0x26, 0x5d, 0xa2, 0xc6, 0x70, 0x5f, 0x40, 0x3f, 0x4e, 0x2e, 0xd0, 0xd8, 0xea, 0x64, 0x56, 0x11, 0x18, 0x90, 0xf1, 0x22, 0x7e, 0xd0, 0x19, 0x32, 0xf8, 0xa2, 0x25, 0xcb, 0x3b, 0xf7, 0x10, 0x8b, 0xb8, 0x89, 0x7c, 0x1c, 0xc3, 0x6f, 0xf7, 0x66, 0xf4, 0xee, 0x7e, 0x02, 0xcd, 0x93, 0x3f, 0xf2, 0x9e, 0x7e, 0xa3, 0x90, 0xa6, 0x01, 0x8c, 0xc5, 0x7b, 0x6a, 0xdc, 0x7b, 0xac, 0x1c, 0x36, 0x55, 0xa4, 0xe5, 0x08, 0x9d, 0xd1, 0x8b, 0xc9, 0x7e, 0x06, 0xa8, 0x7f, 0x73, 0x1e, 0xb8, 0x85, 0xff, 0xe3, 0x71, 0x8b, 0x9f, 0x2e, 0x53, 0xde, 0xfd, 0x4f, 0x7f, 0xea, 0x66, 0xae, 0xcc, 0xfd, 0x7e, 0xb3, 0x18, 0x4d, 0x32, 0xe4, 0xdc, 0x3d, 0xef, 0x4d, 0x03, 0xdc, 0x11, 0x25, 0xfd, 0xae, 0x9f, 0xae, 0x0f, 0xb0, 0x35, 0x5d, 0xed, 0x96, 0x41, 0x3b, 0x8a, 0x57, 0x72, 0x8b, 0x2f, 0xeb, 0x6e, 0xad, 0xcb, 0x53, 0xc4, 0x42, 0x8a, 0xdb, 0x21, 0x91, 0xa8, 0x9c, 0xc6, 0x2a, 0x88, 0x44, 0x39, 0xc8, 0x00, 0x1a, 0x3b, 0x7c, 0xf7, 0x3c, 0xfb, 0x08, 0x33, 0x2b, 0x89, 0x89, 0x6c, 0x8a, 0x8d, 0x5a, 0xa5, 0x23, 0x39, 0x34, 0xbc, 0x2b, 0x7c, 0x9a, 0x3f, 0xc7, 0x79, 0x74, 0x81, 0xcf, 0x37, 0xfa, 0xed, 0xd1, 0x9a, 0xd3, 0x9b, 0x59, 0x92, 0x7e, 0x21, 0x6f, 0x92, 0xf2, 0xac, 0x62, 0x44, 0x81, 0x4f, 0xc4, 0x7b, 0x02, 0x9a, 0xb6, 0x69, 0x2f, 0x6f, 0x66, 0x12, 0x4c, 0x11, 0xd5, 0x00, 0x0a, 0x7e, 0xde, 0x38, 0xaa, 0xff, 0x74, 0x6e, 0x65, 0xfd, 0x2b, 0x75, 0x0c, 0x16, 0xf9, 0xf9, 0xec, 0x70, 0x3e, 0x70, 0xf4, 0x4d, 0x03, 0x4e, 0x1a, 0xe0, 0x7f, 0x78, 0xfa, 0x60, 0xe0, 0xfc, 0xc0, 0x5a, 0x48, 0xff, 0x49, 0x4b, 0x15, 0xf7, 0x85, 0x6e, 0x65, 0x1a, 0x20, 0xd3, 0xd9, 0x15, 0x61, 0xb1, 0x9a, 0x02, 0x52, 0xfd, 0x9a, 0x94, 0x21, 0x3b, 0x1d, 0x95, 0xc6, 0x95, 0x77, 0x93, 0xe6, 0x2a, 0x17, 0xd6, 0xf7, 0xa8, 0xc4, 0x95, 0xa6, 0x1d, 0x27, 0x69, 0x75, 0x0a, 0x8a, 0x01, 0xa9, 0xba, 0xdf, 0x18, 0x63, 0xd1, 0x04, 0xa4, 0x0d, 0x28, 0x45, 0x50, 0xf7, 0xd8, 0x23, 0x2d, 0x42, 0x95, 0x53, 0xa4, 0xfe, 0x3e, 0x0a, 0xb0, 0x8f, 0xb1, 0x78, 0x4a, 0x55, 0xe4, 0x92, 0x24, 0x8c, 0x32, 0x15, 0x99, 0x70, 0xf2, 0xc8, 0xe4, 0xa5, 0x4e, 0x01, 0x91, 0xd7, 0x53, 0x6a, 0x32, 0x9e, 0x44, 0x05, 0x53, 0xa4, 0x34, 0x6e, 0xb0, 0x09, 0xd3, 0x61, 0xa5, 0x06, 0x89, 0x7b, 0xe5, 0xd1, 0xc1, 0x45, 0x6f, 0xc1, 0x88, 0x6e, 0xbe, 0xb3, 0x56, 0x58, 0x40, 0xac, 0x2b, 0xd7, 0x0a, 0xc0, 0xde, 0x35, 0xca, 0x32, 0xb2, 0x79, 0xfd, 0xdc, 0x2b, 0xe8, 0x62, 0xd1, 0x20, 0xcd, 0xae, 0x42, 0x10, 0x76, 0x81, 0x9e, 0xba, 0x7f, 0x99, 0xfd, 0xe7, 0x53, 0x46, 0xbf, 0x8b, 0xef, 0x1d, 0x70, 0x0c, 0xe9, 0xf1, 0xef, 0xe2, 0xb1, 0xff, 0xd0, 0x60, 0x18, 0x69, 0xfe, 0xd1, 0x0e, 0xe6, 0xa5, 0xc7, 0xb0, 0xb7, 0x4f, 0xb0, 0x82, 0xdd, 0x4d, 0xaa, 0xf8, 0x89, 0x58, 0x99, 0x3c, 0xd4, 0x78, 0x76, 0x2b, 0xb0, 0x25, 0xea, 0xa0, 0x1e, 0xac, 0x1b, 0xf6, 0xa2, 0xd5, 0xc6, 0xc8, 0xf4, 0xc3, 0x8e, 0xfb, 0xf9, 0x1b, 0x93, 0xff, 0xf1, 0x69, 0x47, 0x51, 0xf2, 0xbf, 0x7d, 0x45, 0x95, 0x9f, 0xc3, 0x02, 0xef, 0x1a, 0xf2, 0xce, 0xc3, 0x3a, 0x03, 0x8c, 0xf5, 0x9e, 0x24, 0x82, 0x42, 0x64, 0x0b, 0x60, 0x2f, 0x4c, 0x8b, 0x7e, 0x3f, 0x19, 0x65, 0x66, 0x69, 0x3b, 0x60, 0x92, 0xc9, 0xac, 0x9c, 0x77, 0x96, 0x18, 0x23, 0xc2, 0x54, 0x40, 0xc1, 0xe1, 0x4b, 0xa0, 0x16, 0xc5, 0x37, 0x4f, 0xe9, 0xe6, 0x41, 0x28, 0xbf, 0x88, 0x2e, 0x27, 0xac, 0x3d, 0xd7, 0x15, 0x6a, 0xac, 0xd9, 0x68, 0xa8, 0x90, 0x8d, 0x65, 0xa4, 0x04, 0x3b, 0x87, 0xfc, 0xfd, 0x8a, 0x24, 0xc2, 0x18, 0x3b, 0x4e, 0xce, 0x96, 0x17, 0xf8, 0x58, 0xa4, 0x26, 0x59, 0xc6, 0xe0, 0x22, 0x96, 0xc2, 0x1a, 0x2b, 0x9b, 0x90, 0x57, 0xbc, 0x49, 0x9e, 0x1c, 0xde, 0xd7, 0x5d, 0xe9, 0x9c, 0x72, 0x50, 0x03, 0xb6, 0x27, 0x63, 0x76, 0x9a, 0x03, 0x7d, 0x5b, 0x8f, 0x79, 0x58, 0x57, 0x34, 0x03, 0x91, 0x64, 0x29, 0x0c, 0xfb, 0xd4, 0x0c, 0x0e, 0x39, 0x93, 0xa7, 0xf8, 0x8c, 0xac, 0x67, 0xd2, 0xe9, 0x0e, 0x10, 0xa3, 0x4f, 0x91, 0xb0, 0x93, 0x57, 0x34, 0xd2, 0x4d, 0x0d, 0xa8, 0xf3, 0xa7, 0xfe, 0x13, 0x3a, 0x85, 0x92, 0x0e, 0x63, 0xfa, 0x9c, 0xef, 0xfd, 0xb1, 0x30, 0x4e, 0xd5, 0x8c, 0xb5, 0xc2, 0xb2, 0x8a, 0x3a, 0xec, 0x42, 0xee, 0x0e, 0xb7, 0x55, 0x9e, 0x8a, 0xdd, 0x49, 0xc9, 0x32, 0xae, 0xc5, 0xcc, 0xfd, 0x0d, 0xab, 0x57, 0xf0, 0xbb, 0x47, 0xcb, 0xf1, 0xd8, 0xcd, 0xe7, 0xdb, 0xa6, 0x02, 0xa4, 0xce, 0x91, 0x39, 0x5d, 0xc9, 0x6c, 0x81, 0x33, 0x7a, 0xfe, 0x1d, 0xb0, 0x54, 0xbd, 0x34, 0xab, 0xe3, 0xd9, 0xca, 0x6b, 0x5c, 0x7c, 0xef, 0x0f, 0x79, 0x51, 0x36, 0x2c, 0x83, 0x43, 0x69, 0xb9, 0xb0, 0x87, 0x7b, 0x28, 0xb0, 0xdc, 0xbe, 0xd6, 0x83, 0x11, 0x56, 0xa5, 0x8d, 0xc8, 0xee, 0xe7, 0xec, 0x7b, 0xaa, 0x7f, 0x09, 0xbc, 0x5c, 0x42, 0x6d, 0xc1, 0xfa, 0xa4, 0xd7, 0x1f, 0x50, 0x90, 0x8b, 0xd6, 0xf2, 0x97, 0xec, 0x8e, 0x75, 0x4d, 0x4d, 0x20, 0xde, 0xf0, 0x05, 0x58, 0x5b, 0x4b, 0xc1, 0xfa, 0x31, 0xda, 0x1f, 0x02, 0xf6, 0x2f, 0x78, 0x30, 0x00, 0x94, 0xfc, 0xc4, 0x1d, 0xf2, 0x05, 0x87, 0x84, 0xf2, 0xa5, 0x0a, 0x0c, 0x61, 0x81, 0x32, 0x9c, 0xd9, 0xe3, 0xf4, 0xe3, 0x9e, 0x0a, 0x5e, 0x49, 0xc6, 0xc5, 0xd7, 0x25, 0x9d, 0x40, 0xa7, 0x30, 0x47, 0x1d, 0xba, 0x3a, 0xa7, 0xc6, 0xa0, 0x1b, 0x80, 0x02, 0xd9, 0xed, 0xda, 0xc7, 0x50, 0x78, 0xa8, 0x50, 0x25, 0xee, 0xa7, 0x6e, 0xaf, 0xd9, 0x89, 0x23, 0xc2, 0x51, 0x53, 0x6d, 0x2d, 0x72, 0x04, 0x60, 0x87, 0x0d, 0x77, 0x77, 0x2c, 0x9e, 0x8a, 0x2c, 0x82, 0x7e, 0x80, 0xc6, 0x81, 0x5a, 0xa4, 0x73, 0x72, 0xe4, 0x2f, 0x96, 0xf6, 0xc8, 0x6c, 0x62, 0x4b, 0xe2, 0x1a, 0xa8, 0xcb, 0xae, 0x12, 0xed, 0xb5, 0x00, 0x2a, 0xc0, 0x30, 0xf5, 0x58, 0x4b, 0x8d, 0x29, 0x1b, 0x27, 0xcd, 0x2a, 0x16, 0x75, 0x63, 0x2d, 0xfe, 0x2a, 0x3b, 0x00, 0xb7, 0xaa, 0xfa, 0x40, 0xba, 0x99, 0x88, 0xcc, 0xba, 0xed, 0xcc, 0x79, 0x87, 0x48, 0xb6, 0x08, 0x32, 0x86, 0x83, 0x55, 0x72, 0x91, 0x3c, 0xd0, 0x46, 0x7d, 0x80, 0x31, 0xdc, 0xd1, 0x84, 0x68, 0xb2, 0x22, 0x58, 0xd3, 0xfb, 0xe7, 0x6c, 0xb4, 0x44, 0x88, 0x52, 0xe2, 0x57, 0xb8, 0xc5, 0xbf, 0x60, 0x05, 0xeb, 0x69, 0x4e, 0xad, 0xd7, 0x35, 0x7c, 0xb4, 0x52, 0x59, 0x91, 0x33, 0xdb, 0xe8, 0xa5, 0xf3, 0xec, 0x04, 0xa5, 0x3a, 0x7f, 0x4f, 0xf8, 0xe5, 0xd1, 0xa2, 0x62, 0xb7, 0x66, 0x02, 0x29, 0xf1, 0x4d, 0xcf, 0x77, 0x23, 0xa5, 0x3f, 0x00, 0x41, 0x60, 0x0b, 0xe4, 0xf9, 0x47, 0x68, 0xd7, 0x44, 0x3e, 0x39, 0x7f, 0x3c, 0xca, 0x83, 0x1d, 0x2d, 0xd0, 0x21, 0x70, 0xee, 0xa0, 0xb9, 0xd7, 0x72, 0x31, 0xee, 0xb5, 0x9a, 0xae, 0xd7, 0x19, 0x4d, 0x32, 0xb0, 0x9f, 0xcb, 0xd1, 0xd0, 0x91, 0x3e, 0xd7, 0xdb, 0x52, 0x93, 0x54, 0x39, 0xfd, 0x87, 0xd8, 0xc7, 0x49, 0x05, 0x7b, 0xcc, 0xb0, 0xaf, 0x20, 0x2e, 0xd0, 0xbb, 0xfb, 0xe6, 0x11, 0x00, 0x51, 0xb1, 0x88, 0x50, 0x7f, 0x08, 0x1b, 0x09, 0x3e, 0x53, 0xe6, 0xe7, 0x25, 0x5a, 0xde, 0x1c, 0x70, 0xfc, 0xb4, 0xa3, 0xff, 0x23, 0xfd, 0xd1, 0xa2, 0xf7, 0x8f, 0x2d, 0x93, 0x52, 0x2e, 0x81, 0x44, 0x74, 0x68, 0x31, 0x5b, 0xf9, 0xbd, 0xcc, 0xfb, 0x08, 0x03, 0xe1, 0x46, 0xcc, 0x09, 0x14, 0x20, 0x28, 0x7b, 0x70, 0x35, 0xa6, 0x05, 0xff, 0x3d, 0xb1, 0xbb, 0x98, 0x7f, 0x05, 0xb9, 0xf9, 0x93, 0x63, 0x06, 0x16, 0x6d, 0x89, 0xbf, 0xb0, 0x97, 0x61, 0x71, 0x28, 0xbe, 0x79, 0xc6, 0x96, 0x70, 0xb3, 0x64, 0x16, 0x24, 0x3e, 0x12, 0x62, 0x7b, 0xc4, 0x1c, 0xa6, 0xc5, 0xe5, 0xf9, 0x8f, 0xc7, 0xe5, 0x2c, 0xa5, 0xbc, 0xa1, 0x68, 0xdc, 0x99, 0xc8, 0xf7, 0x65, 0x95, 0x47, 0x5d, 0xca, 0xe9, 0x05, 0x38, 0x3a, 0xd4, 0xd1, 0x6a, 0x22, 0xe3, 0x99, 0x7a, 0xfd, 0x6f, 0xdc, 0x38, 0x6c, 0x67, 0x61, 0xa0, 0x89, 0x50, 0x2a, 0x01, 0x78, 0x89, 0xa4, 0x5f, 0x40, 0xd4, 0x20, 0x15, 0xd9, 0x12, 0x86, 0xbe, 0x87, 0x4e, 0x48, 0x56, 0x66, 0xfd, 0x96, 0x9d, 0x45, 0x84, 0xd1, 0xbc, 0xb7, 0xfb, 0x41, 0x2b, 0x68, 0x31, 0x0a, 0xd2, 0xae, 0xf0, 0x5c, 0x6f, 0x60, 0x82, 0xeb, 0x37, 0xeb, 0x73, 0x9f, 0xc0, 0xa2, 0x99, 0x8c, 0x1e, 0x56, 0x52, 0x24, 0x4d, 0x27, 0x0d, 0xab, 0xcf, 0x99, 0x0c, 0xec, 0x95, 0xeb, 0x68, 0x2b, 0x23, 0xa4, 0x55, 0x5a, 0xf0, 0x6e, 0xa7, 0x90, 0x0b, 0x27, 0x95, 0xb6, 0x04, 0x36, 0xbd, 0x84, 0x0a, 0x1b, 0x69, 0xac, 0x51, 0x4a, 0x11, 0x54, 0xb7, 0x3a, 0x21, 0xca, 0xa6, 0xb9, 0xfb, 0x73, 0x3c, 0x82, 0x40, 0x05, 0xa9, 0x11, 0x4c, 0xf6, 0xd9, 0xb6, 0xff, 0x35, 0x54, 0xe9, 0xc3, 0x17, 0x62, 0xdd, 0xca, 0x94, 0x72, 0x58, 0x98, 0xb3, 0xbc, 0xc1, 0xc2, 0x43, 0x26, 0x7b, 0xf5, 0xcc, 0x64, 0x71, 0x39, 0xc5 ],
+    const [ 0x9a, 0xd4, 0x32, 0xe5, 0x9a, 0x7f, 0x71, 0xad, 0xef, 0xb6, 0x6e, 0x0c, 0x10, 0xe1, 0x87, 0x3b, 0x5a, 0xb9, 0x1c, 0x65, 0x62, 0x4f, 0x8a, 0xc3, 0x8a, 0x50, 0x5d, 0x06, 0xd2, 0x88, 0xc1, 0xf5, 0xf1, 0xa6, 0x3a, 0x57, 0xa5, 0x3f, 0x95, 0x13, 0x47, 0x15, 0x1f, 0x96, 0xa2, 0x98, 0x14, 0x75, 0x05, 0xad, 0x5a, 0x53, 0x97, 0xaf, 0x6f, 0x06, 0xeb, 0xb3, 0xa1, 0xf5, 0xd4, 0x11, 0x7d, 0xc4, 0x7b, 0x20, 0x89, 0x34, 0xae, 0x40, 0x36, 0x44, 0x7b, 0x1e, 0x10, 0x9d, 0xfe, 0x33, 0x38, 0x2c, 0x77, 0x8e, 0x14, 0x11, 0x9f, 0xd4, 0x45, 0xb8, 0x3d, 0x85, 0xd9, 0x45, 0xf4, 0x80, 0xc2, 0x36, 0x5f, 0xca, 0x87, 0x43, 0x60, 0x8b, 0x3a, 0x89, 0xb4, 0x59, 0xaa, 0xe8, 0xcb, 0xb9, 0xd9, 0xaa, 0xd7, 0xe3, 0xb1, 0x65, 0x24, 0xc6, 0xf2, 0x22, 0xa7, 0x4c, 0x6f, 0xbe, 0xd9, 0xdf, 0x7a, 0x91, 0xc6, 0x2c, 0x9d, 0x4e, 0x60, 0x27, 0x8b, 0x2a, 0x1a, 0x4f, 0x55, 0x41, 0xb2, 0x33, 0xe1, 0x35, 0x4e, 0x35, 0x99, 0x18, 0xcb, 0x8e, 0x60, 0x8c, 0x52, 0x92, 0xca, 0x28, 0x2c, 0x35, 0x8c, 0x1e, 0xd7, 0xcf, 0x31, 0x1b, 0x59, 0x1c, 0x0f, 0x6f, 0xd4, 0x87, 0x7a, 0x6e, 0x5b, 0xa8, 0x37, 0x16, 0x04, 0x0b, 0x33, 0xf2, 0x3e, 0x33, 0x75, 0x3d, 0x65, 0xde, 0x52, 0x4b, 0x94, 0x8b, 0xe0, 0x25, 0xbb, 0x3a, 0xad, 0x74, 0xf1, 0x73, 0xb0, 0xa0, 0x0b, 0x89, 0x7f, 0x38, 0x6d, 0x20, 0xc3, 0x95, 0x20, 0xed, 0xe9, 0xba, 0x25, 0xbd, 0x1b, 0x7f, 0x09, 0xb9, 0x6f, 0xef, 0xba, 0xe8, 0x5e, 0xee, 0x99, 0xf5, 0x77, 0x1f, 0xd0, 0x33, 0x54, 0x04, 0xe6, 0xde, 0xce, 0x67, 0x91, 0xa4, 0x6d, 0xf9, 0xcb, 0x63, 0x22, 0x3a, 0x27, 0x35, 0x39, 0x98, 0x66, 0xaa, 0x89, 0xdb, 0x45, 0x54, 0xee, 0xc0, 0x9a, 0x89, 0xf9, 0xe4, 0x9f, 0x64, 0xe5, 0xe4, 0x8e, 0x0d, 0xcd, 0xc3, 0x6e, 0x3a, 0x1d, 0x8c, 0x2c, 0xf6, 0x47, 0x38, 0xed, 0xa2, 0xb7, 0xd1, 0xa3, 0x39, 0x08, 0xd8, 0xde, 0xd8, 0x78, 0xe5, 0xe6, 0x7d, 0x99, 0x8d, 0x06, 0x0e, 0x4a, 0x88, 0x2a, 0x9e, 0xe6, 0x13, 0xad, 0xed, 0xbb, 0x94, 0x6c, 0x2d, 0xbe, 0x7d, 0x1f, 0x0c, 0x7c, 0x72, 0xe9, 0xee, 0x54, 0xae, 0x2d, 0x7a, 0xe4, 0xa3, 0xa4, 0x59, 0xc1, 0xe0, 0xac, 0x3a, 0x6b, 0x38, 0xe3, 0x1a, 0x80, 0x21, 0xf5, 0xc2, 0x2f, 0x5a, 0xb2, 0x91, 0xf0, 0xd1, 0x64, 0x7b, 0x72, 0xc3, 0x5f, 0x52, 0xd5, 0x25, 0xd9, 0x44, 0x1a, 0x43, 0xfc, 0xa6, 0xd8, 0xa7, 0x3a, 0xf0, 0x30, 0x3c, 0xe1, 0x08, 0x02, 0xb3, 0xef, 0xc3, 0x61, 0x26, 0x27, 0xa9, 0x45, 0xfb, 0x64, 0xf8, 0x80, 0x0c, 0x2e, 0xec, 0xf4, 0x04, 0x8b, 0x3e, 0x02, 0x0c, 0x17, 0xea, 0x46, 0xa8, 0x57, 0x36, 0x81, 0xdb, 0x4b, 0xf0, 0xd6, 0x92, 0x42, 0xf7, 0x3a, 0x40, 0xf2, 0xfd, 0x26, 0xc5, 0xc8, 0x8a, 0x8e, 0x94, 0x7d, 0x44, 0x17, 0x15, 0xea, 0x6f, 0x85, 0x48, 0x1d, 0xb0, 0x72, 0xac, 0xac, 0x16, 0x46, 0x5f, 0x49, 0x5a, 0x63, 0x86, 0x97, 0x66, 0xa0, 0xef, 0x3d, 0x15, 0xf9, 0xf5, 0x38, 0x3a, 0x85, 0xa4, 0x75, 0xe3, 0xa8, 0x1e, 0x9f, 0xdf, 0x89, 0x3d, 0x36, 0x7d, 0xc6, 0x7a, 0xe1, 0x97, 0x67, 0x0e, 0x05, 0xcf, 0x11, 0x57, 0x96, 0x19, 0x7c, 0x7c, 0x2d, 0x7a, 0x27, 0x54, 0x5b, 0x0f, 0x4b, 0x84, 0x3e, 0x50, 0x0d, 0xe8, 0x51, 0x96, 0xf7, 0x35, 0x88, 0xdb, 0xa9, 0xdc, 0x9d, 0xc1, 0xcc, 0x31, 0xa4, 0xd6, 0x48, 0xcc, 0xe6, 0x17, 0xb7, 0x2f, 0xec, 0xb3, 0x19, 0xaa, 0xda, 0x11, 0xc9, 0x7c, 0xff, 0x13, 0xb0, 0x3b, 0xa9, 0x9d, 0xb8, 0x76, 0x3e, 0x51, 0x83, 0x98, 0x88, 0x9d, 0x5e, 0x0f, 0x51, 0xf8, 0x70, 0xae, 0x30, 0x68, 0x37, 0x50, 0xa2, 0x48, 0x36, 0xbf, 0x5c, 0x48, 0xe7, 0xd4, 0xe0, 0xb5, 0xf7, 0xdf, 0x4f, 0xfb, 0xb2, 0x48, 0x7e, 0x68, 0xbd, 0x77, 0x4b, 0x32, 0x03, 0xf2, 0x32, 0xbc, 0xf1, 0xc5, 0x1b, 0x15, 0xe6, 0x27, 0x76, 0xc1, 0xe5, 0x5a, 0x8a, 0xbd, 0x8e, 0xd3, 0x0a, 0xbd, 0x4c, 0x9b, 0xea, 0xb8, 0xcf, 0xf5, 0x70, 0xa6, 0xbd, 0x41, 0x8e, 0x89, 0xa4, 0x20, 0x6f, 0xaa, 0x34, 0xd9, 0x50, 0x25, 0xab, 0xfc, 0x91, 0xa7, 0x90, 0x45, 0x0c, 0x77, 0xa4, 0xc2, 0xa5, 0xb3, 0x16, 0x38, 0x22, 0xdd, 0xf6, 0xc4, 0x3e, 0x96, 0xec, 0xbe, 0xf8, 0xa8, 0x2a, 0xe2, 0x31, 0x4a, 0x9f, 0xb2, 0x76, 0xa0, 0x6d, 0x16, 0x1b, 0x82, 0x9e, 0x46, 0x89, 0x7e, 0x12, 0xe9, 0xd8, 0x20, 0xbc, 0x7f, 0xa1, 0x70, 0x0f, 0xfc, 0x0d, 0xbd, 0xb2, 0xb5, 0x32, 0x99, 0x7b, 0x80, 0xa0, 0x25, 0x9b, 0x17, 0x36, 0x8f, 0x16, 0xbe, 0x3b, 0xd8, 0x77, 0x26, 0xaa, 0xdb, 0xc1, 0x90, 0xcc, 0x8b, 0xa8, 0x35, 0x0c, 0x7c, 0x01, 0xe6, 0x08, 0xa5, 0x78, 0xf0, 0xe4, 0x64, 0x81, 0x42, 0xe3, 0xc2, 0x91, 0xd2, 0x38, 0xf9, 0x8d, 0x3c, 0x19, 0x33, 0x83, 0xac, 0x16, 0x95, 0x98, 0xff, 0xa9, 0x7c, 0x41, 0x25, 0x0e, 0x06, 0xb6, 0xca, 0x54, 0xd5, 0xa4, 0x35, 0xb5, 0x0f, 0x22, 0x70, 0x23, 0xa9, 0xe7, 0xa9, 0x23, 0xe6, 0xba, 0xd8, 0xde, 0x1a, 0x29, 0xa2, 0x75, 0xb4, 0x7e, 0x7d, 0x96, 0x7b, 0xef, 0x16, 0x4d, 0x18, 0x15, 0xf0, 0x1c, 0xd5, 0xa0, 0x4d, 0x4d, 0xa4, 0x48, 0x51, 0x87, 0x63, 0x07, 0x65, 0xa0, 0x5e, 0x85, 0xda, 0xb2, 0x16, 0xd4, 0xce, 0x71, 0x41, 0x5d, 0x54, 0xbb, 0x11, 0x1a, 0xcf, 0x71, 0xb9, 0x06, 0x9f, 0x86, 0x2e, 0xd2, 0x00, 0x55, 0x2a, 0xda, 0x2e, 0x38, 0x77, 0x57, 0xce, 0x56, 0x6a, 0xd6, 0x89, 0xbc, 0xae, 0xe9, 0xfa, 0xb0, 0x42, 0x1c, 0xca, 0x41, 0xc5, 0x2a, 0x19, 0x23, 0xf2, 0x71, 0x20, 0xba, 0x67, 0xa4, 0x15, 0x75, 0xaa, 0xc0, 0x4f, 0x5d, 0x6d, 0x41, 0xab, 0xee, 0x11, 0x95, 0x2e, 0x25, 0x6a, 0xd1, 0xec, 0xda, 0xc2, 0xa3, 0x28, 0x50, 0x20, 0x87, 0xbc, 0x0b, 0xca, 0x3e, 0xbc, 0xe1, 0x08, 0x7d, 0x56, 0x54, 0x2b, 0xe2, 0xfc, 0x1f, 0xce, 0x2b, 0xc6, 0x0f, 0x5c, 0xaa, 0x11, 0x14, 0xd2, 0xf4, 0x6d, 0x98, 0xc6, 0xda, 0xb6, 0x0f, 0xa9, 0x9a, 0x80, 0xd0, 0x49, 0x56, 0xb8, 0x23, 0x99, 0xc4, 0x89, 0x9b, 0xb5, 0x28, 0x7d, 0xa6, 0x21, 0x7f, 0xe5, 0x62, 0x51, 0xfd, 0x7a, 0xb2, 0x6f, 0xba, 0x44, 0x92, 0x58, 0xa9, 0xbb, 0xa7, 0xe8, 0xc9, 0x2d, 0x1a, 0x77, 0x9f, 0x5f, 0xa7, 0xa3, 0xe3, 0x77, 0xf1, 0x50, 0x7a, 0x19, 0x19, 0xee, 0xa4, 0xd1, 0x8e, 0xfb, 0x77, 0xb1, 0x27, 0xc8, 0x8c, 0x3b, 0x6f, 0x7f, 0xf8, 0x81, 0x40, 0x65, 0x7d, 0x8a, 0x93, 0x5d, 0x02, 0xf8, 0x96, 0xae, 0x41, 0xe8, 0xff, 0x05, 0xc0, 0x1a, 0xa0, 0xbe, 0x02, 0x52, 0x3c, 0x5f, 0xfe, 0xfd, 0x9a, 0x65, 0xd0, 0x18, 0xd7, 0x44, 0xaf, 0x4e, 0x00, 0xa9, 0x1f, 0x60, 0xe1, 0x02, 0x67, 0xca, 0x17, 0x40, 0x46, 0xa4, 0x6d, 0xdb, 0xe2, 0xc6, 0x65, 0x17, 0x01, 0x2f, 0x14, 0x87, 0x7b, 0xa8, 0x33, 0xcf, 0xf0, 0xa4, 0x74, 0xad, 0xb6, 0x6b, 0x12, 0x3b, 0x15, 0x77, 0xac, 0x6e, 0xb7, 0x1e, 0x53, 0xe3, 0x5a, 0x72, 0xe2, 0xdb, 0xc8, 0x66, 0x8d, 0x84, 0x09, 0x32, 0xbd, 0x7a, 0xd7, 0xf8, 0x1c, 0x8d, 0x52, 0xa7, 0xeb, 0xc5, 0xf5, 0x20, 0x9c, 0xa3, 0xc9, 0x97, 0x9d, 0xaa, 0xd8, 0x3c, 0x72, 0x1e, 0xe5, 0x1b, 0x06, 0x0c, 0x5a, 0x41, 0x43, 0x8a, 0x82, 0x21, 0xe0, 0x40, 0xf8, 0x36, 0x7a, 0x27, 0x60, 0xe9, 0xe7, 0x91, 0x54, 0xb4, 0xc7, 0x6a, 0xa1, 0x88, 0x5b, 0xbd, 0xb4, 0x6c, 0x9b, 0x79, 0x4f, 0x68, 0x82, 0x76, 0x81, 0xa1, 0xad, 0xb3, 0xd4, 0xc5, 0x24, 0xe2, 0xc8, 0xa9, 0x78, 0x26, 0x80, 0x31, 0x0e, 0x1b, 0xbc, 0x71, 0xba, 0x17, 0x07, 0x11, 0x8f, 0xaf, 0x32, 0xf6, 0xf6, 0x7d, 0x00, 0x1e, 0xfe, 0x21, 0x23, 0xcc, 0xf3, 0x86, 0x67, 0xe6, 0x32, 0x67, 0x2e, 0x9b, 0x3b, 0x11, 0x1c, 0x48, 0x08, 0x6a, 0x13, 0x9d, 0x9e, 0x32, 0x62, 0xfc, 0xe1, 0x89, 0x39, 0x21, 0xac, 0xb1, 0x61, 0x08, 0x21, 0x16, 0x29, 0x0b, 0x3e, 0x8b, 0xa4, 0x4c, 0xb1, 0xd7, 0x11, 0x52, 0xee, 0x70, 0x9b, 0xf7, 0x7e, 0x86, 0x43, 0x81, 0x9a, 0x43, 0x1a, 0x0f, 0xf8, 0x52, 0xb3, 0x37, 0xe5, 0x9e, 0xd8, 0xed, 0x94, 0x5c, 0x7c, 0xa6, 0xb6, 0x4b, 0xf1, 0xbe, 0x4a, 0x3a, 0x5b, 0x17, 0xb7, 0xcc, 0x65, 0x04, 0x18, 0x78, 0x32, 0x65, 0xd7, 0xd3, 0x97, 0x13, 0x7d, 0x12, 0x87, 0x7e, 0xc8, 0xca, 0xce, 0x94, 0xff, 0xfb, 0x02, 0xe5, 0x82, 0x4d, 0xb7, 0x05, 0xa5, 0x99, 0xf3, 0x32, 0xbe, 0xab, 0xe2, 0x37, 0x7d, 0x47, 0xca, 0x90, 0x7c, 0x69, 0x40, 0xcf, 0x17, 0xd1, 0x9d, 0x3f, 0x7e, 0xbf, 0xac, 0xc6, 0x08, 0xfc, 0xa5, 0x10, 0xcb, 0x19, 0x5f, 0xe9, 0x69, 0xfb, 0xc1, 0xeb, 0x2c, 0x98, 0x7a, 0x5a, 0x56, 0xfb, 0xf1, 0x4c, 0xb2, 0x8e, 0x7f, 0x0d, 0x6f, 0x98, 0xdd, 0xc1, 0x2e, 0x05, 0xd8, 0x4b, 0x5a, 0x66, 0x4c, 0x6e, 0xb8, 0x38, 0x4f, 0x32, 0x3f, 0x69, 0xad, 0x8a, 0x29, 0x18, 0x95, 0x33, 0x4a, 0x9d, 0x91, 0xdf, 0xa1, 0xc9, 0xbb, 0x93, 0x2d, 0x6e, 0x2f, 0x4e, 0x01, 0x22, 0xbc, 0xeb, 0x9b, 0x41, 0xdf, 0x48, 0x72, 0x31, 0xf1, 0xa8, 0xce, 0xea, 0x9f, 0x56, 0xdc, 0xb5, 0x9b, 0x8c, 0x02, 0x33, 0x91, 0x92, 0x70, 0xa2, 0x5d, 0x2a, 0xf8, 0x5c, 0x7b, 0x2c, 0x1f, 0xa0, 0xbe, 0x6e, 0x74, 0x95, 0x45, 0xe6, 0x20, 0x8c, 0xac, 0x13, 0xbf, 0x86, 0x7f, 0x98, 0x6e, 0xf6, 0xf4, 0x2b, 0x25, 0xc8, 0xd9, 0xad, 0x48, 0xa1, 0xcb, 0x9a, 0x78, 0x69, 0xa9, 0xa4, 0xaf, 0x07, 0x48, 0x9b, 0x8c, 0x6b, 0x68, 0x90, 0xeb, 0xd2, 0xe7, 0x3a, 0xb9, 0x45, 0x35, 0x99, 0x07, 0x63, 0x08, 0xd8, 0x5c, 0x61, 0x51, 0x78, 0x50, 0x4f, 0x6e, 0xab, 0x56, 0x9d, 0xa1, 0xfe, 0xda, 0xdd, 0xc1, 0x3b, 0x8c, 0xca, 0x2f, 0x8e, 0xfb, 0x8a, 0x0c, 0xe6, 0x65, 0x30, 0xa9, 0x9e, 0xcd, 0x85, 0x3f, 0x5d, 0x4f, 0x08, 0xe1, 0x3b, 0xb1, 0x33, 0xae, 0x25, 0x3a, 0x00, 0x4b, 0x82, 0xc7, 0xac, 0x91, 0x16, 0x1b, 0xbb, 0x82, 0x27, 0x77, 0x3c, 0x82, 0xdf, 0x6a, 0x4e, 0xc4, 0xf2, 0xeb, 0xe3, 0x02, 0x81, 0xa5, 0xc4, 0x71, 0x3d, 0x92, 0xd6, 0xf4, 0xcf, 0xcb, 0x9b, 0x8f, 0x78, 0x9f, 0xfb, 0x1f, 0xf4, 0xe2, 0x45, 0x49, 0xa5, 0x87, 0x71, 0xb1, 0xed, 0x72, 0xa8, 0x6c, 0xdc, 0x87, 0x06, 0xb7, 0x0b, 0x07, 0x9e, 0xe9, 0xc7, 0x1c, 0xbe, 0xa6, 0x72, 0xb2, 0x75, 0x56, 0x27, 0x89, 0x53, 0xd5, 0x9d, 0x88, 0x70, 0x6c, 0x4e, 0x55, 0xaf, 0x01, 0xd8, 0x22, 0x44, 0x8a, 0xa3, 0xca, 0x74, 0xc8, 0xc4, 0x1c, 0x9c, 0x31, 0x21, 0x76, 0x75, 0x2e, 0xd6, 0x97, 0x96, 0x86, 0xd8, 0xae, 0x3b, 0x1a, 0xd8, 0xb6, 0x44, 0xd4, 0x6b, 0x06, 0x81, 0xda, 0x67, 0x24, 0x2c, 0x07, 0x90, 0xdb, 0xb7, 0x9b, 0x74, 0x8d, 0xc9, 0x31, 0x93, 0xca, 0x83, 0xf2, 0xc3, 0x20, 0x07, 0x09, 0xd3, 0x35, 0x3b, 0x56, 0x6f, 0x14, 0xca, 0x67, 0x43, 0xc5, 0x6c, 0xa4, 0x64, 0x20, 0x68, 0xc9, 0xeb, 0xe2, 0x57, 0x9a, 0xe3, 0x01, 0x2a, 0xd2, 0x65, 0x3d, 0x6e, 0x5c, 0x01, 0xf8, 0xcf, 0xc5, 0x60, 0x47, 0xdb, 0xf2, 0x28, 0x49, 0x09, 0x0e, 0x20, 0xb8, 0xfa, 0xc7, 0x95, 0xbd, 0xfe, 0xba, 0xfc, 0x09, 0xda, 0x2b, 0xd8, 0x21, 0xc9, 0xfa, 0xde, 0xf9, 0xc0, 0xd2, 0x57, 0xc5, 0xf6, 0xa4, 0xc7, 0x0c, 0xa4, 0x54, 0xcc, 0xfe, 0x09, 0xb2, 0x48, 0x07, 0xb2, 0xab, 0xc2, 0xa4, 0xf8, 0xc1, 0x0a, 0x76, 0xca, 0xb8, 0x1c, 0x95, 0xad, 0x92, 0x47, 0x26, 0x00, 0xbe, 0x8f, 0x30, 0x85, 0x8d, 0x4f, 0xab, 0x1d, 0xe5, 0x23, 0xda, 0xd3, 0x39, 0x04, 0xdb, 0x1c, 0xb8, 0xb5, 0x7d, 0x5d, 0xc5, 0x5f, 0x51, 0xae, 0xa8, 0x78, 0x04, 0xde, 0x83, 0xe8, 0xeb, 0xb7, 0x87, 0x6f, 0xe0, 0x83, 0x67, 0x41, 0x4d, 0xcf, 0x0d, 0xf4, 0x86, 0x6e, 0x8d, 0x9c, 0x5c, 0xc1, 0x57, 0x35, 0xef, 0x36, 0xb0, 0x41, 0xc3, 0x0f, 0x63, 0xb1, 0x16, 0x65, 0xb3, 0x09, 0x71, 0x6c, 0x95, 0xc0, 0x7e, 0xf8, 0x1c, 0xe5, 0x19, 0x40, 0x35, 0x09, 0xa9, 0xe2, 0x94, 0x58, 0xb1, 0x28, 0xee, 0x09, 0xa2, 0x8a, 0x69, 0xf9, 0xf4, 0x74, 0x51, 0x92, 0x74, 0x49, 0x0c, 0xf2, 0xe0, 0xa7, 0x50, 0x49, 0xb1, 0xed, 0x93, 0x83, 0x38, 0xfa, 0xc3, 0x28, 0xec, 0x38, 0x38, 0x80, 0x03, 0xda, 0xe7, 0xfa, 0x3f, 0x61, 0xd8, 0xce, 0x0b, 0x65, 0xda, 0xe2, 0xc6, 0x92, 0x75, 0xeb, 0x5f, 0xf1, 0x20, 0xd4, 0x22, 0x68, 0xb4, 0x63, 0xd1, 0x85, 0x21, 0x1a, 0xf7, 0x77, 0x5f, 0x5b, 0x79, 0x5d, 0xa8, 0xd0, 0x6e, 0xc4, 0xe5, 0x0a, 0x30, 0x6a, 0x66, 0x68, 0xb3, 0x48, 0xd5, 0x3b, 0x16, 0xd0, 0x6d, 0x27, 0x78, 0x74, 0x67, 0xcd, 0x0d, 0x67, 0xb5, 0xa6, 0x71, 0xa7, 0xf3, 0x32, 0x3c, 0x3b, 0x9b, 0x53, 0xd6, 0xb9, 0x78, 0xf3, 0x8d, 0x0c, 0x5d, 0xed, 0xe4, 0x74, 0x16, 0x2b, 0x2e, 0xce, 0x9f, 0x0c, 0x5c, 0x16, 0x94, 0x08, 0x14, 0x2a, 0xe9, 0x96, 0x03, 0xd1, 0xdb, 0x4d, 0x73, 0xfb, 0x26, 0x4a, 0x20, 0x4b, 0x79, 0xd3, 0x47, 0xd2, 0x27, 0x39, 0x01, 0x1e, 0x1f, 0x03, 0xcf, 0x73, 0x1e, 0x48, 0x76, 0x58, 0x23, 0x5d, 0x0d, 0x55, 0x24, 0xb1, 0x54, 0xfc, 0xff, 0xf4, 0x47, 0x26, 0xb3, 0x7f, 0xf3, 0x7f, 0xd0, 0xf0, 0x89, 0x45, 0x2c, 0x14, 0xb1, 0x4c, 0xd8, 0x0b, 0x20, 0x46, 0x52, 0xa6, 0x6d, 0x41, 0xfc, 0x14, 0x20, 0x71, 0xcd, 0xbe, 0x0d, 0x30, 0x47, 0x6f, 0xe0, 0x43, 0xa9, 0xb8, 0xf8, 0x5f, 0x65, 0x93, 0x79, 0xeb, 0xd4, 0x46, 0x9c, 0x08, 0x29, 0x8a, 0x4a, 0xcf, 0xa4, 0xed, 0xea, 0xd9, 0x08, 0x75, 0x77, 0x05, 0x4e, 0x86, 0xd5, 0x75, 0x9b, 0x05, 0x65, 0xda, 0x70, 0xbe, 0xd7, 0xf2, 0x20, 0x03, 0x3f, 0x4f, 0x88, 0x96, 0x6b, 0x59, 0xfa, 0xca, 0x74, 0x96, 0x7a, 0xe4, 0x94, 0x29, 0x2d, 0xc7, 0x37, 0x99, 0x0e, 0xd1, 0x55, 0xd4, 0xe3, 0x00, 0xfe, 0x74, 0x70, 0x59, 0x37, 0x40, 0xea, 0x8a, 0x04, 0xf6, 0xae, 0xce, 0xc6, 0x48, 0x33, 0x11, 0xc7, 0x24, 0x3d, 0x55, 0x14, 0x38, 0x54, 0x54, 0x8b, 0xb6, 0x75, 0x66, 0x34, 0x54, 0x07, 0xa6, 0xd5, 0x98, 0x10, 0x50, 0xc0, 0x52, 0xa9, 0x6e, 0xf0, 0x6a, 0xb0, 0xb4, 0x54, 0xdb, 0xbc, 0xa8, 0x6b, 0x00, 0x56, 0x06, 0x11, 0x0f, 0x66, 0x62, 0x99, 0xe3, 0xeb, 0x0f, 0x1b, 0xfe, 0xef, 0x40, 0x0f, 0xce, 0xbb, 0x6d, 0x1b, 0x2f, 0x47, 0xf8, 0x2a, 0x32, 0xf4, 0x11, 0xbe, 0x1c, 0x7d, 0xd7, 0x87, 0xb2, 0x2b, 0xbf, 0x34, 0xb4, 0x49, 0x3a, 0x89, 0xa8, 0xd8, 0x92, 0xb2, 0xd8, 0x84, 0x15, 0xd7, 0x9e, 0xd6, 0x76, 0xf0, 0xdf, 0xaa, 0x70, 0xdb, 0xd6, 0xe4, 0xac, 0xab, 0x13, 0x5f, 0xe5, 0x44, 0xc3, 0x26, 0x4a, 0x25, 0x31, 0xe7, 0x24, 0x84, 0x8d, 0xa4, 0xb8, 0xa0, 0xed, 0xac, 0x6f, 0x53, 0x91, 0xca, 0x34, 0xe6, 0x6b, 0xbc, 0x1e, 0x2a, 0xde, 0xe6, 0x4f, 0xc4, 0xc7, 0x48, 0x1c, 0xc9, 0xba, 0xae, 0x6e, 0x8b, 0x8e, 0x26, 0x67, 0xb2, 0x1b, 0xb7, 0x49, 0x8e, 0x42, 0x50, 0x94, 0xab, 0x2e, 0xff, 0x6f, 0xa6, 0xda, 0x63, 0x49, 0x40, 0xd3, 0x64, 0xc0, 0xb1, 0x40, 0x21, 0xc2, 0x3f, 0x1f, 0x2a, 0xf2, 0x0e, 0xd1, 0xf0, 0x4d, 0x3a, 0xd9, 0x7a, 0x0d, 0x23, 0xe1, 0x59, 0xcd, 0x08, 0xfd, 0xdd, 0xef, 0xd8, 0x34, 0x89, 0x3b, 0x44, 0x3d, 0xc5, 0xc8, 0x19, 0x86, 0xd3, 0x20, 0xcd, 0x7b, 0x04, 0x9f, 0x57, 0x04, 0x2c, 0x1c, 0x44, 0x4f, 0x53, 0xcc, 0x08, 0xd1, 0xad, 0x62, 0x92, 0x87, 0xcd, 0x7b, 0x23, 0x82, 0x15, 0x3a, 0x5f, 0xa2, 0x71, 0x2f, 0xa5, 0xa2, 0x45, 0x7e, 0x9c, 0x54, 0xa3, 0x3d, 0x0e, 0x2e, 0xc2, 0x1d, 0xfa, 0x06, 0xab, 0x4d, 0xe4, 0x1a, 0x36, 0x9b, 0x70, 0x53, 0x35, 0xdd, 0x2f, 0xcb, 0xef, 0x8f, 0xb9, 0x8c, 0xd0, 0xbd, 0xfc, 0x9b, 0x5e, 0x24, 0xd3, 0x35, 0x6f, 0x94, 0xdb, 0x58, 0x99, 0x98, 0x82, 0x85, 0xeb, 0x59, 0x60, 0xc5, 0xda, 0xc0, 0xcb, 0xea, 0x7e, 0xdb, 0xa5, 0x17, 0xff, 0x82, 0x79, 0x82, 0x4a, 0x3a, 0xc6, 0x79, 0x08, 0x59, 0x9b, 0xa3, 0xd0, 0x6b, 0x64, 0x89, 0x9b, 0xd5, 0x04, 0x54, 0x79, 0xb8, 0x24, 0xd8, 0x83, 0x18, 0xca, 0xd2, 0x11, 0x3e, 0x2d, 0x6e, 0x2d, 0x5a, 0xc8, 0x0d, 0x47, 0x6d, 0xad, 0x44, 0x2a, 0x66, 0x1c, 0x28, 0x2e, 0x8b, 0x54, 0xc9, 0xaf, 0x1b, 0xa9, 0xfc, 0xbf, 0x32, 0xd7, 0x5e, 0x18, 0xec, 0x96, 0x95, 0x54, 0xcd, 0x6e, 0xd9, 0x61, 0x61, 0xcd, 0xb4, 0x2f, 0x1f, 0x57, 0x05, 0xab, 0x93, 0x7d, 0x4b, 0xf1, 0xbd, 0x51, 0x20, 0xbd, 0xb4, 0x98, 0x04, 0x23, 0x8e, 0x21, 0x5c, 0x81, 0x84, 0x56, 0xba, 0xb1, 0x52, 0x11, 0x5f, 0x83, 0xdd, 0xb1, 0xff, 0x6a, 0x18, 0x6c, 0xc4, 0x75, 0x28, 0xe7, 0x95, 0x81, 0xc7, 0x03, 0x97, 0xae, 0xe6, 0xfa, 0xf4, 0x0f, 0x96, 0xac, 0xdc, 0xa6, 0x28, 0x33, 0xca, 0x8f, 0x93, 0xbd, 0x09, 0x7b, 0x17, 0x9b, 0x76, 0x60, 0x20, 0x95, 0x87, 0x6f, 0x6d, 0x81, 0x8c, 0x47, 0x71, 0x14, 0x35, 0x68, 0xfa, 0xf7, 0x55, 0xea, 0x10, 0x1d, 0xe5, 0x6f, 0x20, 0x55, 0x4c, 0x56, 0x5a, 0x1b, 0xde, 0x31, 0x57, 0xb4, 0xa2, 0x79, 0xff, 0x7a, 0x58, 0x81, 0xaa, 0x74, 0xba, 0xa9, 0x85, 0x29, 0x03, 0xd4, 0x38, 0xb6, 0xae, 0x1c, 0xc5, 0x1f, 0x80, 0xc4, 0xb3, 0xe3, 0xc8, 0x6d, 0x6d, 0xd3, 0xe6, 0x8d, 0xe5, 0x23, 0x0a, 0x1e, 0x7c, 0xc2, 0x3e, 0x93, 0x26, 0xe7, 0xa7, 0x10, 0xc9, 0xed, 0x07, 0xda, 0xe7, 0x60, 0x87, 0x0d, 0x7d, 0x58, 0xb4, 0x8d, 0x2b, 0x05, 0xc7, 0x3e, 0x94, 0x8c, 0x29, 0x78, 0x08, 0x11, 0x36, 0xb5, 0x61, 0x15, 0x42, 0x8d, 0x2a, 0x03, 0xd9, 0xe5, 0x07, 0x05, 0x4b, 0x63, 0x50, 0x1c, 0x68, 0x25, 0x00, 0x70, 0x89, 0xb2, 0xce, 0xe5, 0xd0, 0x30, 0x99, 0xee, 0xb0, 0xd8, 0x09, 0xa6, 0xaf, 0xa8, 0x74, 0x1d, 0x6a, 0x57, 0xfe, 0xef, 0xda, 0x8e, 0x05, 0x1c, 0xd7, 0x55, 0xbc, 0x13, 0xda, 0xcc, 0x15, 0x10, 0x07, 0x1b, 0xe5, 0xa8, 0x6b, 0xab, 0x43, 0xa3, 0x82, 0x97, 0x30, 0x09, 0xfc, 0x5d, 0x7e, 0x7f, 0xc0, 0xda, 0xea, 0xd4, 0x32, 0x75, 0x8c, 0xd8, 0xb1, 0x9a, 0x71, 0x6d, 0x64, 0x6a, 0x86, 0xe0, 0x37, 0xb0, 0xb7, 0x79, 0x20, 0x17, 0x59, 0x50, 0xa7, 0x9b, 0xc5, 0x63, 0xa5, 0x3e, 0x46, 0xe6, 0x4c, 0xfc, 0x36, 0xda, 0x67, 0x00, 0x63, 0xe1, 0xe3, 0x18, 0xb8, 0x51, 0x8f, 0x67, 0x19, 0x87, 0x20, 0x5a, 0x8e, 0x7e, 0x78, 0xdd, 0xa4, 0xa0, 0x28, 0xce, 0x10, 0xdb, 0x33, 0xb1, 0x96, 0xf8, 0x15, 0xa6, 0x29, 0x28, 0x03, 0x99, 0x54, 0xe0, 0x75, 0xb9, 0xd8, 0xe7, 0xe2, 0x2b, 0x97, 0xae, 0xca, 0xff, 0xb0, 0xdf, 0xfa, 0x63, 0xec, 0x38, 0x0c, 0x16, 0x59, 0x9a, 0x2d, 0x20, 0x34, 0x5d, 0x23, 0xc1, 0x0c, 0xe7, 0x8e, 0xa7, 0x25, 0x7d, 0x6d, 0x63, 0x1b, 0x58, 0xe5, 0x1e, 0xc7, 0xfc, 0x3e, 0x88, 0x66, 0xc5, 0x2f, 0x12, 0xf8, 0xc3, 0x5b, 0x5d, 0xe7, 0xc8, 0x1b, 0xf2, 0xe9, 0xbe, 0x7e, 0x33, 0x27, 0x3e, 0x8e, 0x92, 0x9f, 0x5f, 0xd5, 0x00, 0xc7, 0xcc, 0x20, 0xa8, 0x73, 0x1a, 0x83, 0xde, 0xf8, 0x58, 0x9d, 0x52, 0x92, 0xe7, 0x1d, 0x8a, 0x03, 0x8c, 0x85, 0x8f, 0x7d, 0xc3, 0x2f, 0xe6, 0xc2, 0x56, 0x8d, 0xc1, 0x8a, 0x2f, 0xb4, 0x77, 0x25, 0x6a, 0x1c, 0x32, 0x61, 0xaf, 0xa1, 0xe7, 0xae, 0xbf, 0xce, 0x8c, 0x80, 0x4c, 0x5b, 0x85, 0xf5, 0x0e, 0xf4, 0x5f, 0xb8, 0x13, 0x3d, 0xc0, 0x25, 0x57, 0x12, 0x9e, 0xae, 0x94, 0x13, 0xb0, 0x7d, 0x5b, 0x60, 0x22, 0x5a, 0x64, 0xa1, 0x8d, 0xd0, 0x23, 0x4a, 0x26, 0x8b, 0x9b, 0x1d, 0x36, 0x05, 0x77, 0xf0, 0xca, 0x62, 0x57, 0xb0, 0xab, 0x98, 0x68, 0xa6, 0x90, 0xd2, 0x37, 0xf9, 0x93, 0x17, 0xc7, 0x74, 0xe2, 0x26, 0xe1, 0x8a, 0xb7, 0xa5, 0xab, 0x97, 0x8a, 0x7b, 0x7c, 0x69, 0x85, 0x7b, 0xef, 0xff, 0x38, 0x42, 0x36, 0x90, 0x8e, 0x62, 0xb1, 0xd0, 0xff, 0xc0, 0xbf, 0x6e, 0x08, 0x3a, 0xd5, 0xe1, 0xd8, 0x8d, 0xcd, 0x64, 0x4d, 0x76, 0x80, 0x3f, 0x1e, 0x18, 0x96, 0x49, 0x5a, 0x9e, 0x9d, 0xab, 0x11, 0x21, 0x59, 0xe6, 0x50, 0xcc, 0x5b, 0x18, 0x53, 0x3e, 0xd5, 0x7b, 0xf7, 0x2f, 0xad, 0x2e, 0x6e, 0x57, 0xd0, 0x38, 0x36, 0x8b, 0xc9, 0xca, 0x4c, 0x2a, 0x92, 0xc4, 0x9d, 0xb7, 0xaa, 0x7b, 0xbd, 0xc7, 0x67, 0xb9, 0xdb, 0x1e, 0x8e, 0x06, 0xf5, 0x15, 0x21, 0x26, 0x48, 0x3f, 0x78, 0xe3, 0x0b, 0x4b, 0x93, 0x0d, 0x5c, 0x2c, 0xaf, 0xbe, 0x7b, 0x78, 0x17, 0xe2, 0x36, 0x0e, 0x3d, 0xf7, 0xa4, 0xfc, 0x09, 0x12, 0x16, 0xa0, 0x71, 0x23, 0x4b, 0x0d, 0x4a, 0x79, 0xe3, 0xaf, 0x5e, 0x89, 0x16, 0x33, 0xbe, 0xeb, 0xa6, 0xa1, 0x5a, 0xa5, 0x12, 0xcb, 0xce, 0xac, 0x0d, 0xeb, 0x7f, 0xa8, 0x2e, 0x88, 0xe7, 0xf8, 0xe9, 0x99, 0x2d, 0xf6, 0xbe, 0xed, 0xf9, 0x7c, 0xb0, 0xca, 0x86, 0xa7, 0xf9, 0xd5, 0xf9, 0xda, 0xfc, 0x31, 0xf1, 0x06, 0x7b, 0xeb, 0x5f, 0x29, 0x0a, 0x96, 0x98, 0x15, 0xc4, 0x32, 0xa8, 0x73, 0x3c, 0x53, 0xe9, 0x07, 0xb7, 0x7f, 0xd5, 0x36, 0x98, 0xd7, 0x19, 0xc5, 0x1b, 0xf9, 0xea, 0xe3, 0x46, 0x26, 0x9c, 0x6a, 0x1d, 0xa0, 0x71, 0x62, 0x16, 0x56, 0xaf, 0xc7, 0xcc, 0xc3, 0xf5, 0x8b, 0xf7, 0x14, 0xce, 0xdf, 0x9c, 0x89, 0x87, 0xaf, 0x81, 0x1d, 0x3e, 0x6b, 0xe4, 0x69, 0x3c, 0x0d, 0x6c, 0xc6, 0x85, 0x58, 0x60, 0xb2, 0xac, 0x5d, 0x17, 0x75, 0xec, 0x44, 0xb0, 0x04, 0x75, 0x49, 0x03, 0x25, 0x04, 0x05, 0xd6, 0xd4, 0xb6, 0xef, 0x55, 0xe5, 0x1e, 0x22, 0xbc, 0xec, 0x95, 0x61, 0x57, 0x5a, 0xd1, 0x58, 0xac, 0xe8, 0xba, 0x24, 0xf7, 0x39, 0x78, 0x16, 0xd6, 0xba, 0xd1, 0xb4, 0x46, 0xce, 0xb2, 0x01, 0xce, 0x28, 0x0b, 0xff, 0xfa, 0x77, 0xe0, 0x71, 0x0b, 0x49, 0x9e, 0xe5, 0xed, 0x29, 0xab, 0xf2, 0x69, 0x0b, 0x40, 0xbf, 0x9c, 0xeb, 0x7b, 0xc4, 0xa8, 0xb0, 0xb0, 0xd5, 0xa9, 0x56, 0x01, 0x5c, 0xeb, 0x4c, 0x2e, 0xe6, 0x5a, 0x1b, 0xae, 0xe1, 0x39, 0x49, 0xfe, 0xa3, 0x17, 0x7d, 0x39, 0xaf, 0xff, 0xe3, 0xe9, 0x34, 0xf0, 0xd2, 0x1c, 0xd7, 0x8c, 0xad, 0xbb, 0xb2, 0x14, 0x07, 0x18, 0x9d, 0x94, 0x0a, 0xc6, 0xac, 0x5b, 0x19, 0xad, 0xf9, 0xae, 0xb4, 0x5d, 0xa3, 0xbe, 0x9c, 0xa3, 0x16, 0xd7, 0x38, 0x5a, 0x8d, 0xd9, 0x38, 0x84, 0xd6, 0xec, 0x78, 0x9a, 0x55, 0x70, 0x27, 0x20, 0x4c, 0x33, 0x28, 0x7b, 0x5a, 0xe7, 0xb8, 0x07, 0x41, 0xd3, 0x52, 0x65, 0xec, 0xc8, 0xcf, 0x12, 0xb0, 0x57, 0xd2, 0x3e, 0xd2, 0x41, 0x63, 0xdb, 0x49, 0x2f, 0xda, 0xf4, 0xc6, 0xa3, 0xff, 0x40, 0xf2, 0x2f, 0x6f, 0xf7, 0xf6, 0xe5, 0x42, 0xe4, 0x41, 0x0e, 0xea, 0xbc, 0x85, 0x1f, 0x5e, 0xae, 0x03, 0xe8, 0x79, 0x3b, 0x09, 0x0f, 0x9c, 0x48, 0xb9, 0xbd, 0x9b, 0x71, 0x0b, 0x97, 0xd7, 0xa1, 0x16, 0xf0, 0xa7, 0xdf, 0x8b, 0x3c, 0xfd, 0x6b, 0x82, 0xc8, 0x46, 0x0a, 0x79, 0xa9, 0x91, 0x9e, 0x99, 0xf3, 0xf4, 0xf9, 0x3c, 0x2b, 0x2b, 0xf3, 0xad, 0xfe, 0x83, 0xba, 0x2e, 0x32, 0xf7, 0x6a, 0x40, 0xde, 0x98, 0xde, 0x1e, 0xd6, 0x32, 0xc5, 0x8b, 0x6a, 0x2c, 0xf8, 0xcd, 0x50, 0xb0, 0x0b, 0xfa, 0xde, 0x0c, 0x21, 0x72, 0x7c, 0x58, 0x05, 0xad, 0x5a, 0x59, 0x77, 0x37, 0x5e, 0xa6, 0xc4, 0xf8, 0x61, 0x09, 0x9a, 0xb9, 0x9a, 0x28, 0x19, 0xe4, 0x5a, 0x65, 0x2d, 0x8b, 0xfa, 0x02, 0x1c, 0xac, 0x12, 0x89, 0x5b, 0xb4, 0xec, 0x6b, 0xa6, 0x41, 0x39, 0xe7, 0x4f, 0x2c, 0x02, 0x2d, 0xd7, 0xc7, 0xe1, 0xc4, 0xbb, 0x63, 0x70, 0x29, 0x90, 0x16, 0x02, 0xb9, 0x52, 0xbb, 0x91, 0xd0, 0xfa, 0x39, 0xf8, 0x33, 0x4e, 0x09, 0x62, 0xab, 0xfd, 0xf2, 0x03, 0xf3, 0xeb, 0x17, 0x06, 0xd4, 0xca, 0x34, 0xc6, 0x8f, 0xea, 0x25, 0x40, 0x7b, 0x52, 0xa8, 0xc9, 0xef, 0x0f, 0x63, 0xfc, 0x62, 0xcc, 0x29, 0xf7, 0xd1, 0xa3, 0x79, 0xc7, 0x62, 0x33, 0x47, 0x20, 0x46, 0xf3, 0xff, 0x51, 0xe3, 0xc5, 0xc8, 0x78, 0x33, 0xcf, 0x06, 0xf2, 0x67, 0x86, 0x22, 0x16, 0xd1, 0x0b, 0x8d, 0x23, 0x00, 0xbb, 0x02, 0x76, 0x2d, 0x02, 0x0c, 0x01, 0xd6, 0x6f, 0xc9, 0xf8, 0xa8, 0x0e, 0xed, 0xcd, 0xa2, 0xf2, 0x09, 0x5f, 0x78, 0x11, 0x0e, 0x6f, 0x35, 0x55, 0x0d, 0x53, 0x25, 0xef, 0x40, 0xee, 0xf2, 0xef, 0x4e, 0xdf, 0x0d, 0x11, 0xcb, 0xf9, 0x4f, 0xda, 0xfe, 0xf3, 0xe1, 0xe4, 0xe8, 0x61, 0x59, 0x77, 0x81, 0xe3, 0x25, 0x58, 0x45, 0x9d, 0x2d, 0xe6, 0xef, 0xe7, 0xb4, 0x62, 0x85, 0x45, 0x7f, 0x8f, 0x94, 0x99, 0x3a, 0x7b, 0xbd, 0x97, 0x17, 0x9c, 0x70, 0x7a, 0xb8, 0x1e, 0xf8, 0xf5, 0x4f, 0x7c, 0xb8, 0x6d, 0x04, 0x4e, 0xb4, 0x65, 0x97, 0x62, 0x53, 0x3a, 0x46, 0x0d, 0x63, 0x10, 0xf1, 0xc3, 0x5d, 0x0c, 0x7c, 0xe6, 0xea, 0xc4, 0x75, 0xdc, 0xa7, 0xf3, 0xf6, 0x64, 0x25, 0x72, 0xcd, 0x2a, 0x35, 0x63, 0xdb, 0x99, 0x62, 0xaf, 0xba, 0xf0, 0xbe, 0xb4, 0xa3, 0x98, 0xe2, 0x37, 0x8e, 0xb5, 0x30, 0xa0, 0x9a, 0xfb, 0x5b, 0x66, 0xb0, 0xc2, 0x2a, 0xc8, 0x63, 0x5d, 0x78, 0xbe, 0x1b, 0xa8, 0x80, 0x2f, 0x73, 0xe1, 0x57, 0x64, 0xdf, 0xb9, 0xba, 0xbd, 0x92, 0xaa, 0x0a, 0xa2, 0x9f, 0x8a, 0x95, 0xbd, 0x5e, 0x61, 0x17, 0x66, 0x11, 0x78, 0x81, 0x5f, 0xc7, 0xb2, 0xf8, 0xc2, 0x81, 0x1f, 0x21, 0x37, 0x94, 0xcf, 0x9c, 0x6a, 0x4e, 0xe4, 0xce, 0xbd, 0xdc, 0xeb, 0xe4, 0x3a, 0x6b, 0x6d, 0x14, 0xcb, 0x8e, 0xc0, 0x26, 0xad, 0xe0, 0x23, 0x34, 0x22, 0xea, 0x0b, 0xae, 0x66, 0x47, 0xb7, 0xa0, 0xe5, 0x05, 0x0a, 0x38, 0xab, 0x4f, 0x9a, 0x83, 0x1c, 0x49, 0x05, 0x77, 0xe5, 0x3c, 0x84, 0x36, 0x32, 0xf3, 0xc2, 0x91, 0x22, 0x65, 0xee, 0xcb, 0x77, 0x94, 0x0e, 0xa0, 0x93, 0xb4, 0x97, 0x86, 0xa0, 0x90, 0x3b, 0x33, 0x0e, 0x2a, 0x03, 0x5f, 0x42, 0xa1, 0x9d, 0xcb, 0x8c, 0x58, 0xf7, 0x82, 0x5a, 0x55, 0x0d, 0x5f, 0xac, 0xe7, 0xff, 0xcf, 0xc8, 0x8c, 0x66, 0xd8, 0x2f, 0x11, 0xe8, 0x5b, 0xcf, 0xfb, 0x0a, 0x96, 0x7a, 0x26, 0x46, 0xec, 0x97, 0xac, 0x5e, 0xe9, 0x18, 0x08, 0xef, 0x81, 0xac, 0x7c, 0x49, 0x98, 0x35, 0xb0, 0x7e, 0xc8, 0x7c, 0x9b, 0xb9, 0x5e, 0x23, 0xa6, 0xd1, 0xa5, 0xdc, 0x0f, 0x1e, 0x68, 0xd9, 0x8c, 0x8c, 0xb2, 0x84, 0x32, 0xed, 0xd8, 0x6f, 0x94, 0x94, 0xb9, 0x8e, 0x2f, 0x1f, 0x45, 0xa4, 0x06, 0x94, 0x3c, 0xfb, 0x89, 0xb0, 0x38, 0x58, 0xbb, 0x7b, 0xee, 0x2e, 0x94, 0x20, 0xb1, 0x12, 0xa4, 0xfc, 0x38, 0x6f, 0xfa, 0xf5, 0xa0, 0x7b, 0x44, 0x0d, 0xb4, 0x69, 0x38, 0x36, 0x6d, 0xe1, 0x32, 0x69, 0xb5, 0xad, 0x1e, 0xf2, 0x70, 0xb5, 0x98, 0x0e, 0xbd, 0x2d, 0x52, 0xb7, 0x79, 0x0d, 0xb6, 0xbf, 0x06, 0xc1, 0xcd, 0x1c, 0x4a, 0x22, 0x60, 0x83, 0xfa, 0xa6, 0x5d, 0x38, 0x18, 0xd3, 0x7b, 0x24, 0xba, 0xfa, 0x21, 0x28, 0x0e, 0x21, 0x85, 0xb1, 0x9b, 0x41, 0x11, 0x8c, 0xc9, 0xb2, 0x0a, 0xfc, 0xa4, 0xe3, 0x73, 0x0a, 0xdd, 0x4e, 0x2f, 0x1d, 0x11, 0xab, 0x67, 0xca, 0x4e, 0x64, 0x2b, 0xed, 0xd4, 0x4a, 0x5c, 0xf9, 0x18, 0x86, 0xc9, 0x8c, 0x0f, 0xd2, 0x98, 0x47, 0xa8, 0xe9, 0xe8, 0xdc, 0x9b, 0x3b, 0xb4, 0x68, 0x61, 0xe6, 0xfa, 0x04, 0x83, 0xe2, 0x1d, 0x96, 0x18, 0x7b, 0x89, 0xee, 0x89, 0x05, 0x95, 0x0e, 0x98, 0xcb, 0xad, 0xc8, 0xa1, 0x48, 0xb0, 0x8f, 0x1f, 0x9a, 0x97, 0x87, 0x71, 0x33, 0x58, 0xde, 0xdf, 0xd2, 0x09, 0x5f, 0xd8, 0xb1, 0x49, 0x44, 0x7d, 0x00, 0xdc, 0x4c, 0x64, 0x93, 0x95, 0x0e, 0x95, 0xd8, 0x79, 0x8d, 0xd9, 0x0b, 0x21, 0x0c, 0x35, 0xad, 0x60, 0x24, 0xb1, 0x32, 0x26, 0x13, 0x5d, 0xfa, 0xa4, 0x57, 0x96, 0x82, 0xb1, 0x7c, 0x86, 0xdc, 0x6d, 0x32, 0xea, 0x5c, 0x24, 0xa2, 0x18, 0x95, 0x75, 0x02, 0x40, 0x83, 0xb3, 0x67, 0xf2, 0x0a, 0x8b, 0xdb, 0xe0, 0x9f, 0xe7, 0xb0, 0xe6, 0x46, 0x13, 0x14, 0x47, 0xbc, 0x1e, 0xe5, 0x3a, 0xf5, 0x84, 0xc6, 0xa5, 0xc9, 0x09, 0x72, 0x28, 0xea, 0xe8, 0x50, 0x5d, 0x19, 0x2d, 0x48, 0x5e, 0x99, 0x60, 0xd6, 0x88, 0xe4, 0x63, 0x5c, 0x7f, 0x9e, 0x9d, 0xbd, 0x72, 0xc7, 0x59, 0x27, 0xa1, 0x34, 0x68, 0x30, 0x1c, 0x40, 0x0e, 0x25, 0xcd, 0xbf, 0x1c, 0x9e, 0xb8, 0x33, 0x59, 0x56, 0x82, 0x43, 0x26, 0x3a, 0x30, 0x68, 0x62, 0xc0, 0x32, 0xea, 0x8c, 0x7a, 0xa0, 0x0b, 0x27, 0xeb, 0xc3, 0x81, 0x63, 0x99, 0xd7, 0x2a, 0xf9, 0x63, 0x0f, 0xfc, 0x57, 0x15, 0xda, 0x3b, 0xfd, 0x3a, 0x65, 0xee, 0x27, 0x32, 0x61, 0x93, 0xac, 0x84, 0x06, 0x12, 0x26, 0x75, 0x58, 0xf0, 0x53, 0xd9, 0xa9, 0xc5, 0xbb, 0x29, 0x5f, 0xf0, 0x93, 0xd6, 0xf7, 0x89, 0xe2, 0xdd, 0x4a, 0x97, 0xe2, 0x9c, 0x0f, 0x83, 0xa9, 0xe3, 0xa2, 0xcd, 0x08, 0x4f, 0x04, 0xfe, 0xb4, 0xd3, 0x22, 0xde, 0xa3, 0x98, 0x5a, 0xe6, 0xb9, 0x07, 0x3b, 0xf8, 0xa4, 0x24, 0x8c, 0x4e, 0x05, 0x1d, 0x90, 0xb1, 0xd0, 0x22, 0x89, 0xeb, 0xf5, 0x78, 0x7b, 0x7e, 0x40, 0xc9, 0x32, 0x96, 0x7d, 0xbf, 0x86, 0x3d, 0xe1, 0xd1, 0xde, 0xce, 0xa5, 0x5c, 0xf3, 0xac, 0xf4, 0xf5, 0xd7, 0x33, 0x07, 0xfe, 0x35, 0xef, 0x8f, 0x77, 0xda, 0x0c, 0x53, 0x17, 0x74, 0x0e, 0x1a, 0x9b, 0x9a, 0xc3, 0xcb, 0x5f, 0x0d, 0x75, 0xd3, 0x2b, 0x3e, 0x63, 0xc7, 0x4f, 0x10, 0x73, 0x4a, 0xf2, 0xde, 0x21, 0x32, 0xa7, 0xc0, 0xbb, 0xe6, 0x41, 0x0a, 0xd0, 0x0a, 0xe9, 0x16, 0xe6, 0x5f, 0x6d, 0x44, 0x6b, 0xe4, 0xdb, 0x3e, 0xee, 0x42, 0x4f, 0x81, 0x8f, 0x66, 0x09, 0x19, 0xb4, 0x70, 0xc2, 0xab, 0xfe, 0xcc, 0x40, 0xb9, 0x7c, 0x9e, 0x29, 0x22, 0x1e, 0x64, 0x15, 0xe8, 0x6c, 0xd7, 0xe6, 0x36, 0x77, 0x11, 0x5c, 0xa2, 0x10, 0xf5, 0xe4, 0xaf, 0x39, 0xcc, 0xb1, 0x96, 0xd9, 0x2c, 0x0e, 0x46, 0xb4, 0x1e, 0xf3, 0xa9, 0x99, 0x7f, 0xd6, 0x29, 0xdd, 0xa7, 0xc3, 0x73, 0x09, 0x49, 0xaf, 0x7a, 0xd0, 0x9a, 0x0a, 0xbf, 0x44, 0xb6, 0x93, 0xd1, 0x49, 0x3f, 0x70, 0x0f, 0x49, 0x47, 0x7e, 0xb5, 0x29, 0x70, 0xe6, 0x17, 0x7c, 0x51, 0xf1, 0x27, 0xf7, 0x1c, 0x1d, 0x3d, 0x25, 0x7e, 0x70, 0x18, 0x5c, 0xc7, 0x0c, 0x20, 0xf0, 0x4b, 0x04, 0xed, 0xa6, 0x08, 0x6e, 0x0d, 0x6c, 0x89, 0xb9, 0x02, 0x47, 0x0a, 0x41, 0x8b, 0x8c, 0xdc, 0x21, 0x25, 0x53, 0x0b, 0x48, 0xd0, 0x29, 0x3f, 0xd0, 0x16, 0x05, 0xe0, 0x8b, 0x4a, 0x7e, 0x7d, 0xde, 0x0e, 0x3a, 0x6f, 0xd2, 0x17, 0xaa, 0xb9, 0x68, 0x35, 0xf4, 0x33, 0x2d, 0x8d, 0x31, 0xe8, 0x0f, 0x29, 0xd9, 0xbc, 0x6f, 0xb4, 0x7b, 0x52, 0x77, 0x7e, 0xb2, 0x2c, 0xae, 0xc7, 0x54, 0x14, 0xc9, 0x39, 0xec, 0xbb, 0xc5, 0xb6, 0x6b, 0xa1, 0x32, 0x54, 0x1a, 0x34, 0xd2, 0xa6, 0xd3, 0x3c, 0x62, 0x3e, 0x71, 0x76, 0xb8, 0x6f, 0x85, 0x7f, 0x0e, 0x58, 0x4b, 0xf4, 0x9e, 0x1d, 0xdc, 0xd8, 0x6f, 0x78, 0xa4, 0x36, 0x6e, 0x71, 0x17, 0x07, 0xc0, 0x69, 0xa0, 0x55, 0x57, 0x5d, 0xda, 0xa1, 0xc3, 0x69, 0x03, 0x83, 0x4b, 0x8b, 0xae, 0x90, 0x3d, 0xaa, 0xb7, 0x80, 0x82, 0xd7, 0x7c, 0x91, 0x75, 0xd2, 0x4a, 0x26, 0xf6, 0xd0, 0x16, 0xb4, 0xb9, 0x7b, 0x6e, 0xde, 0xe4, 0x3b, 0xaf, 0xdf, 0xda, 0xb4, 0x77, 0x29, 0x51, 0x90, 0x5d, 0x4b, 0xab, 0x7e, 0xe0, 0x18, 0x83, 0x7a, 0x9e, 0x06, 0x86, 0x50, 0xc7, 0xd4, 0x84, 0x5b, 0xd0, 0x70, 0xc6, 0x93, 0x6c, 0x17, 0xa3, 0xc7, 0xb8, 0xbe, 0x4e, 0x26, 0xb5, 0xb1, 0xf2, 0x04, 0xfc, 0x7a, 0x01, 0xdb, 0xad, 0x04, 0xc9, 0x90, 0xa9, 0x00, 0x48, 0xf8, 0x01, 0x88, 0x41, 0x9b, 0xae, 0x02, 0x8f, 0xb8, 0x82, 0x48, 0xba, 0x89, 0x5e, 0x06, 0xc8, 0xc7, 0xa6, 0x63, 0x55, 0x71, 0xf2, 0xe3, 0xe6, 0xca, 0x06, 0x8b, 0x7b, 0xa1, 0x05, 0x47, 0x63, 0xd4, 0xe1, 0x8a, 0x54, 0x17, 0x16, 0x34, 0xbb, 0xf2, 0x98, 0xb8, 0x51, 0x09, 0x09, 0x7e, 0xef, 0xa0, 0x30, 0x86, 0xa3, 0x5e, 0xa7, 0x4f, 0x03, 0x51, 0xd3, 0xf7, 0xc1, 0x33, 0x19, 0xa3, 0x80, 0xec, 0x4f, 0x21, 0xe6, 0x57, 0x71, 0xcc, 0xf3, 0x49, 0x96, 0xb0, 0x91, 0xd0, 0x22, 0xef, 0x6c, 0xb8, 0x3c, 0x64, 0x03, 0x54, 0x83, 0x85, 0x00, 0x7b, 0xfc, 0x8e, 0xc4, 0xd0, 0x4f, 0xdc, 0x47, 0x46, 0x34, 0x96, 0x1f, 0xe4, 0x28, 0x93, 0xde, 0xc6, 0x64, 0x78, 0xa1, 0x65, 0x0f, 0x21, 0xe6, 0x18, 0xb3, 0x43, 0x9e, 0xda, 0xee, 0x4f, 0x84, 0x4d, 0x6a, 0x99, 0xac, 0xff, 0x0e, 0xb9, 0x5f, 0xec, 0x76, 0x31, 0x26, 0x45, 0xa1, 0x51, 0x25, 0x70, 0xea, 0x58, 0xaa, 0x50, 0x3a, 0xdc, 0x06, 0xc6, 0x7b, 0x6c, 0x9c, 0x78, 0x50, 0x73, 0x37, 0xd1, 0x03, 0x5f, 0xa1, 0x49, 0xbf, 0x03, 0x71, 0xe6, 0xff, 0x3a, 0x24, 0x02, 0x46, 0xce, 0x6f, 0x50, 0x11, 0x98, 0xd4, 0x1a, 0x09, 0xe8, 0x74, 0xcc, 0x7e, 0x27, 0x24, 0xb6, 0x11, 0xba, 0xc2, 0x0e, 0xb0, 0x2a, 0xca, 0x34, 0xc8, 0x82, 0x24, 0x3a, 0xb5, 0xf9, 0x40, 0xa4, 0x7e, 0xd1, 0x65, 0x6c, 0xbf, 0x7f, 0x46, 0x4a, 0xe6, 0x0c, 0xd7, 0x32, 0xa2, 0xbb, 0x5e, 0x1d, 0x99, 0xec, 0xcd, 0x0c, 0x5a, 0x40, 0x4f, 0x4a, 0x92, 0xfe, 0x21, 0xf2, 0x82, 0xb6, 0xa3, 0xb2, 0xb0, 0x24, 0xaf, 0xce, 0xdd, 0x56, 0x29, 0x68, 0x38, 0x11, 0xd7, 0xfe, 0xd1, 0x72, 0x73, 0x34, 0x50, 0xd1, 0xff, 0xd4, 0xe7, 0xea, 0x59, 0x13, 0x85, 0x3f, 0x0f, 0x16, 0x4d, 0xb8, 0x74, 0xb4, 0x46, 0x8d, 0xf4, 0x7e, 0x54, 0x65, 0xa4, 0xfc, 0x67, 0xc0, 0x1d, 0x3a, 0xf2, 0x92, 0x8b, 0x83, 0x9f, 0x30, 0x01, 0x6d, 0x41, 0x70, 0x10, 0x16, 0x09, 0x0c, 0x97, 0xac, 0xfe, 0x48, 0xdc, 0x33, 0xa7, 0xd5, 0xdc, 0x82, 0x0a, 0xf4, 0xe0, 0x8f, 0xdb, 0xdf, 0x51, 0xed, 0xed, 0x64, 0xcd, 0x93, 0xec, 0xd3, 0x7a, 0xdf, 0x4e, 0x1a, 0x9b, 0xdb, 0x87, 0x2f, 0x61, 0xbe, 0x7c, 0xae, 0x03, 0xb6, 0x3b, 0xc4, 0x11, 0xe4, 0xe9, 0x4b, 0x05, 0xa8, 0xfb, 0x36, 0x1b, 0x20, 0xaa, 0x30, 0x62, 0xeb, 0xa0, 0x80, 0x13, 0x33, 0xf8, 0x30, 0x22, 0xea, 0x65, 0x6e, 0x14, 0x53, 0xb1, 0x32, 0x10, 0xc5, 0x6a, 0x21, 0x38, 0xac, 0xd8, 0xb2, 0x3a, 0xd0, 0x31, 0x8f, 0x21, 0xda, 0x10, 0x3e, 0x72, 0x14, 0x24, 0x00, 0x74, 0x70, 0x25, 0xf9, 0xcf, 0xcc, 0x0d, 0x92, 0x58, 0x74, 0x84, 0x1c, 0x2c, 0xe8, 0x9c, 0xb6, 0xfc, 0xe0, 0xbe, 0x70, 0xa7, 0x8e, 0xe5, 0xb0, 0x0e, 0x23, 0x09, 0xd5, 0x24, 0x94, 0xdf, 0x1b, 0x44, 0x9e, 0xbf, 0xbe, 0xc8, 0x08, 0xe5, 0x63, 0xd7, 0x28, 0xdd, 0xb3, 0x7e, 0xa8, 0x39, 0x49, 0x02, 0x8a, 0x85, 0xce, 0x75, 0x6a, 0x7d, 0x62, 0x88, 0x03, 0x7d, 0x3e, 0xa0, 0xf5, 0x38, 0x98, 0x2c, 0xc6, 0xad, 0xc7, 0x35, 0x26, 0x57, 0xa8, 0x36, 0x77, 0xa4, 0x40, 0x2f, 0x8c, 0xa9, 0xa3, 0xf5, 0xb1, 0x14, 0x14, 0xcc, 0xec, 0x62, 0x6d, 0x37, 0x83, 0x52, 0xc2, 0x0f, 0xbe, 0x99, 0x41, 0xd3, 0xee, 0xd7, 0x5c, 0x3f, 0xae, 0xca, 0x2b, 0x20, 0x69, 0xc1, 0x0b, 0x66, 0x1d, 0x54, 0x8c, 0x7b, 0x5e, 0x53, 0x8a, 0xd3, 0x9d, 0xfc, 0x99, 0xc5, 0xaa, 0x71, 0xa7, 0x99, 0x78, 0x69, 0xdc, 0xe2, 0x21, 0x25, 0xc5, 0x0e, 0x29, 0xa6, 0xb2, 0x3b, 0x07, 0x1d, 0x5c, 0x4c, 0xe1, 0xa3, 0xcb, 0x3c, 0x98, 0x2a, 0x77, 0xb3, 0x04, 0xb3, 0xae, 0xd7, 0x81, 0xc2, 0x35, 0x65, 0xaa, 0x0f, 0x32, 0x00, 0x64, 0x7f, 0x49, 0xc9, 0x1f, 0x52, 0x06, 0x2f, 0x58, 0x9e, 0x7b, 0x09, 0x62, 0xfc, 0x2a, 0xe2, 0x67, 0x81, 0x25, 0x93, 0xaa, 0xf0, 0x73, 0x18, 0x0e, 0x2d, 0xb6, 0x9c, 0xdc, 0xf5, 0x0b, 0xd6, 0xc1, 0xcd, 0x32, 0x98, 0x16, 0x38, 0xef, 0xa5, 0x64, 0x2d, 0xaf, 0xc4, 0x28, 0xc8, 0x6f, 0x12, 0xd3, 0x40, 0xda, 0x9c, 0x15, 0x19, 0xb1, 0x2d, 0x5b, 0x9b, 0x70, 0x65, 0x97, 0x82, 0x2f, 0x0b, 0x3f, 0xf7, 0xc6, 0xa4, 0x98, 0xbf, 0x34, 0x45, 0x34, 0xb3, 0x42, 0xa5, 0xb9, 0x70, 0x63, 0x76, 0xe5, 0x4f, 0xdf, 0xf6, 0xcf, 0x98, 0x30, 0xc1, 0x70, 0xf2, 0xac, 0xe9, 0x61, 0x1e, 0x65, 0x48, 0xe6, 0xe5, 0x4e, 0x15, 0x2c, 0x4f, 0x9f, 0xb6, 0xcf, 0x16, 0x7a, 0xd5, 0x9f, 0x5a, 0xce, 0xb6, 0xa4, 0x96, 0x7c, 0xc8, 0x60, 0xd3, 0xb8, 0x7a, 0x53, 0x1c, 0xb2, 0x4f, 0xc5, 0x31, 0x76, 0x35, 0xbf, 0x80, 0x11, 0x13, 0x5b, 0x50, 0xf6, 0xa1, 0x3d, 0x40, 0xa0, 0x7c, 0x62, 0xf0, 0x78, 0x7a, 0x19, 0xfe, 0xf8, 0x3a, 0x4e, 0x34, 0x11, 0x00, 0x0e, 0xff, 0xca, 0xc0, 0x48, 0x23, 0x2b, 0x79, 0xd1, 0xae, 0x59, 0xc5, 0xab, 0x2a, 0x02, 0xad, 0x87, 0x17, 0xfb, 0xc1, 0x88, 0x99, 0x28, 0x69, 0x4a, 0x6d, 0x9d, 0x76, 0x23, 0x21, 0x02, 0xfc, 0xa9, 0x85, 0x3c, 0x64, 0x74, 0x5d, 0x4a, 0xbd, 0x25, 0x58, 0x6c, 0x53, 0xa6, 0x46, 0x8b, 0x83, 0xb4, 0x85, 0xd5, 0xcd, 0x9b, 0xbc, 0xa8, 0x2b, 0x41, 0xcc, 0xb1, 0xa1, 0x66, 0x04, 0x55, 0x16, 0x2a, 0x95, 0x4f, 0x62, 0xd0, 0x45, 0x9b, 0xa8, 0xc1, 0x67, 0x93, 0xe6, 0xd4, 0x0a, 0x59, 0xca, 0xcc, 0x71, 0x74, 0xc8, 0x23, 0xc3, 0xbe, 0x69, 0x06, 0x04, 0x7d, 0xe6, 0xa0, 0x44, 0xd0, 0xf5, 0x9b, 0x16, 0x4d, 0xe3, 0xe4, 0x44, 0xe8, 0xe3, 0xaf, 0xc1, 0x16, 0xa6, 0xbc, 0xdf, 0x33, 0x2b, 0xd8, 0xc2, 0x21, 0xd9, 0xa6, 0x15, 0x33, 0xcb, 0x9f, 0xfb, 0x49, 0x6b, 0x58, 0x49, 0x3c, 0x42, 0x03, 0xf2, 0x7c, 0x0e, 0x39, 0xc3, 0xf7, 0x15, 0xf7, 0x50, 0x3d, 0xba, 0xe6, 0x2e, 0xe2, 0x4e, 0xdf, 0x62, 0x24, 0x28, 0xae, 0x1a, 0xce, 0xf8, 0x16, 0x9b, 0x5d, 0x58, 0x16, 0x7b, 0x60, 0xa4, 0x6b, 0x10, 0x25, 0x0c, 0x56, 0x28, 0x91, 0xe7, 0x9f, 0xfa, 0x50, 0x4a, 0xda, 0x5d, 0x2f, 0xda, 0xe9, 0x38, 0xc5, 0xde, 0xc2, 0x3a, 0x59, 0x99, 0x73, 0xcb, 0x00, 0xd6, 0x63, 0x42, 0x06, 0xc4, 0xda, 0x58, 0x8f, 0x04, 0xc3, 0xdc, 0x7e, 0x01, 0xb1, 0xa9, 0x96, 0x80, 0x21, 0xd6, 0xdf, 0x78, 0xff, 0x2c, 0x4c, 0x23, 0x6b, 0xdd, 0x9a, 0x55, 0xbc, 0x72, 0x7b, 0x0d, 0xc5, 0x06, 0xf4, 0x49, 0x58, 0xb2, 0x04, 0x1f, 0x09, 0x48, 0x86, 0x0a, 0x34, 0x44, 0x58, 0x82, 0x42, 0xff, 0xbd, 0xcf, 0x27, 0x26, 0x00, 0x1e, 0x2f, 0x6b, 0x5b, 0xd5, 0xfb, 0x7a, 0x16, 0x24, 0xc6, 0x2f, 0xf3, 0xdc, 0xee, 0x06, 0xca, 0x85, 0xaf, 0xd3, 0x71, 0xab, 0x31, 0xb3, 0xde, 0x78, 0xc5, 0x42, 0x90, 0x88, 0x6b, 0x0e, 0x2b, 0xf8, 0x99, 0x4c, 0x62, 0xc0, 0x37, 0xca, 0x19, 0x43, 0xee, 0x25, 0xcb, 0x25, 0xa2, 0x3c, 0x2a, 0x5d, 0x3d, 0xe4, 0x06, 0x8b, 0xaf, 0xde, 0x70, 0x8b, 0x33, 0x06, 0x1f, 0x4a, 0xd3, 0xcc, 0x13, 0xd8, 0x2e, 0xe8, 0x77, 0xbf, 0x79, 0x4a, 0xcc, 0x94, 0xc4, 0x50, 0x44, 0xcb, 0x7e, 0x3c, 0x6c, 0xcf, 0x3c, 0xe5, 0x0e, 0x53, 0xb6, 0xad, 0x56, 0xe2, 0x12, 0xb2, 0x33, 0xbe, 0x66, 0x49, 0x00, 0xe7, 0x78, 0xa8, 0x64, 0x7a, 0xc8, 0xe2, 0x77, 0x3c, 0xd0, 0x19, 0x26, 0x77, 0x8a, 0xee, 0xd8, 0x05, 0x33, 0x3d, 0x52, 0xaa, 0x4f, 0x08, 0xd7, 0xa7, 0xed, 0xb0, 0x94, 0x8b, 0x2c, 0x6b, 0x3c, 0x4d, 0xfe, 0xf2, 0xf0, 0x98, 0x2c, 0x7a, 0x61, 0x66, 0x9a, 0xe6, 0x38, 0xd0, 0xcd, 0x3b, 0xb6, 0x24, 0xaa, 0x54, 0x97, 0x39, 0x80, 0xd7, 0x3d, 0xff, 0x49, 0x67, 0x0a, 0x5a, 0x2d, 0x1b, 0x0e, 0x31, 0x48, 0x2f, 0xe2, 0xc2, 0xad, 0xfa, 0xd3, 0x38, 0xab, 0x20, 0x43, 0x7f, 0x4f, 0x09, 0x4d, 0x57, 0x29, 0x92, 0xa8, 0xa7, 0x53, 0x02, 0xce, 0x14, 0xb0, 0x3f, 0x5d, 0xd3, 0x72, 0x42, 0xbd, 0xbb, 0xdf, 0xc8, 0x03, 0x9f, 0x54, 0x4a, 0x15, 0xda, 0x8a, 0x30, 0x0f, 0x2b, 0x18, 0x42, 0xe6, 0xc4, 0x39, 0x5f, 0x4c, 0x9d, 0xd0, 0x71, 0xd3, 0x0e, 0xa9, 0xa0, 0x54, 0x9d, 0x02, 0xc6, 0x92, 0x15, 0x4a, 0x23, 0x1b, 0xd8, 0x28, 0x53, 0x6f, 0x75, 0xbf, 0x7c, 0x64, 0x7d, 0x31, 0xcc, 0xc9, 0x93, 0x61, 0x23, 0x4a, 0xc3, 0xfe, 0x0c, 0x93, 0x15, 0xbd, 0xf2, 0xb9, 0x61, 0xe5, 0x91, 0xd5, 0x64, 0x11, 0xaa, 0xf2, 0x14, 0x31, 0xfb, 0x29, 0x31, 0xd3, 0x6e, 0x0a, 0x1d, 0xa1, 0x91, 0x3e, 0xed, 0x2a, 0x46, 0x6b, 0xc0, 0xe5, 0xbc, 0x58, 0x4f, 0x72, 0x9d, 0x52, 0xc6, 0x24, 0x89, 0xce, 0xd3, 0xbd, 0xc4, 0x4f, 0xfc, 0x78, 0x2b, 0x8a, 0x35, 0x4d, 0x6d, 0xc8, 0xb2, 0x70, 0x77, 0x8d, 0xfa, 0x1b, 0x30, 0x77, 0x3d, 0x8d, 0x67, 0x68, 0xe7, 0x53, 0x09, 0xe8, 0x75, 0xc6, 0x98, 0xc4, 0x87, 0xd5, 0xd8, 0xfb, 0x37, 0x04, 0xcc, 0xdb, 0xaa, 0xb5, 0xe0, 0x68, 0xe4, 0xa6, 0x68, 0xfd, 0xe1, 0xbc, 0x49, 0x36, 0xe1, 0xff, 0xf6, 0x0c, 0x03, 0xe5, 0x9f, 0x42, 0x15, 0xd3, 0xa5, 0x01, 0xab, 0xe1, 0x50, 0xbf, 0x6e, 0xde, 0xc4, 0x65, 0xb7, 0x94, 0x31, 0xb0, 0x5d, 0x4c, 0x4b, 0xd7, 0xcb, 0x95, 0xfa, 0x6f, 0x55, 0x42, 0x52, 0x8c, 0xcc, 0xb2, 0xc5, 0x2a, 0x4f, 0x54, 0x97, 0xcb, 0x65, 0x69, 0x93, 0x61, 0x49, 0x0c, 0xfd, 0x6d, 0x85, 0x70, 0xc7, 0x69, 0xc2, 0x6a, 0x07, 0x64, 0xdf, 0x2f, 0xa9, 0xec, 0x40, 0x5e, 0x61, 0x30, 0x69, 0x41, 0xe4, 0x66, 0xcb, 0x50, 0x58, 0x6b, 0xdd, 0xf6, 0x09, 0xa9, 0x6f, 0x98, 0x5d, 0x3e, 0x3c, 0xd4, 0x0a, 0x5b, 0xbe, 0x06, 0x86, 0xe9, 0x46, 0x11, 0xc0, 0x73, 0x4b, 0x5c, 0x0d, 0x40, 0x02, 0x1a, 0x65, 0xbf, 0x30, 0xcf, 0xcf, 0x29, 0x3d, 0x0f, 0x1a, 0x61, 0x89, 0x89, 0xce, 0x1f, 0x03, 0x45, 0x62, 0x4d, 0xf7, 0x2a, 0xaf, 0xb1, 0x27, 0xc3, 0xa5, 0xcd, 0x1e, 0x43, 0x3d, 0x03, 0xc1, 0xc6, 0xae, 0xfd, 0x27, 0xd9, 0xe4, 0x4c, 0xaa, 0x3d, 0x2e, 0x4f, 0x3e, 0xe8, 0x37, 0x57, 0x02, 0x4d, 0x37, 0x08, 0x15, 0xdd, 0x6a, 0x03, 0xab, 0xce, 0xc2, 0xc2, 0x60, 0x1b, 0xd9, 0xc2, 0xcc, 0xcc, 0x29, 0xe8, 0x57, 0x77, 0x7f, 0x1e, 0x4e, 0x07, 0xad, 0x3d, 0x37, 0xbc, 0x7f, 0x2f, 0x62, 0x73, 0xf1, 0x55, 0xc1, 0x28, 0x9f, 0x26, 0xf9, 0xb9, 0x7d, 0x19, 0xb9, 0xec, 0xc8, 0xc5, 0x4b, 0xb4, 0x3d, 0x47, 0x69, 0xb0, 0x88, 0xe5, 0x51, 0xf5, 0xff, 0xf1, 0x1c, 0x0d, 0x90, 0xef, 0x4b, 0x3f, 0xf8, 0xfa, 0xa3, 0x11, 0x36, 0x63, 0x3b, 0x0c, 0x40, 0x9c, 0xd3, 0xbf, 0xf4, 0x54, 0x67, 0x07, 0x51, 0xe4, 0x04, 0x8d, 0xe7, 0xea, 0xdb, 0x8f, 0x8c, 0x33, 0x94, 0xe4, 0x51, 0xdf, 0xe4, 0x3a, 0xb5, 0xbf, 0x62, 0xa3, 0x18, 0x02, 0x96, 0x50, 0x72, 0x11, 0x53, 0x9b, 0x44, 0xb7, 0x47, 0x4b, 0xcf, 0x85, 0xd1, 0x14, 0x85, 0x75, 0x12, 0x5e, 0xbd, 0xcd, 0x47, 0x48, 0xaa, 0x46, 0x56, 0xeb, 0x8e, 0x6e, 0xa6, 0xe3, 0x2b, 0x4b, 0x34, 0x0c, 0x7a, 0x41, 0xe4, 0x89, 0xa0, 0x35, 0x15, 0x0b, 0x1e, 0xf3, 0x77, 0x4f, 0x48, 0xcd, 0x21, 0xe9, 0xf8, 0x85, 0xde, 0x41, 0x83, 0x6e, 0xc8, 0xdb, 0xec, 0xcd, 0x19, 0xdb, 0x58, 0x85, 0x3d, 0xc8, 0xc2, 0xf4, 0x2c, 0x90, 0xf0, 0x18, 0xf6, 0xcc, 0xa6, 0xf6, 0x9f, 0x46, 0x19, 0x3c, 0x2e, 0xb8, 0xa6, 0x25, 0x01, 0xd7, 0xc4, 0x9d, 0x63, 0x90, 0x38, 0xa6, 0x61, 0x92, 0x88, 0xfa, 0xd9, 0x0c, 0xb1, 0xf1, 0xd3, 0xb8, 0x1c, 0xa6, 0x14, 0x18, 0xcf, 0x55, 0xf1, 0x00, 0xe1, 0x08, 0x62, 0x54, 0x30, 0x73, 0x57, 0x13, 0x56, 0x1c, 0x4f, 0x94, 0xd8, 0xbf, 0x26, 0x10, 0xa1, 0xf0, 0x2e, 0x61, 0xaf, 0x02, 0x82, 0x09, 0x0d, 0x28, 0x97, 0x76, 0x01, 0xda, 0x14, 0x85, 0x86, 0x7a, 0xe4, 0x44, 0xfc, 0x38, 0x89, 0xfc, 0x1f, 0x33, 0xb3, 0x6f, 0x36, 0xe0, 0x11, 0x5e, 0x8c, 0xb0, 0x67, 0x4e, 0x24, 0xed, 0xe1, 0x8c, 0xa9, 0xe5, 0xa7, 0x6f, 0xa4, 0x4b, 0xb1, 0xdd, 0xf2, 0xda, 0xdd, 0x10, 0x74, 0x3b, 0x3e, 0x9a, 0x08, 0x29, 0xb7, 0xa7, 0xb8, 0xd3, 0xc9, 0x83, 0x32, 0x82, 0xaa, 0x5c, 0x78, 0x7b, 0x97, 0x48, 0xd9, 0x27, 0x6a, 0x8a, 0x20, 0x71, 0x6f, 0x11, 0x0b, 0x70, 0x74, 0x41, 0xff, 0x46, 0x1f, 0xf6, 0xf9, 0x48, 0x85, 0xc6, 0xc8, 0x5f, 0xf7, 0x87, 0x7a, 0xad, 0x1f, 0x11, 0x14, 0x74, 0x4d, 0x45, 0x86, 0x34, 0x0b, 0x4f, 0xdd, 0x14, 0xf7, 0x27, 0xbb, 0x83, 0xd2, 0x5e, 0x04, 0x1f, 0xd4, 0x17, 0xdb, 0xd6, 0x42, 0x54, 0xcd, 0x4b, 0x43, 0x73, 0x4b, 0x7b, 0xf0, 0xf8, 0x5e, 0xa0, 0xaa, 0x8c, 0x96, 0x56, 0xb0, 0x46, 0x44, 0xfc, 0xf0, 0x2a, 0xe8, 0x5d, 0x1e, 0xef, 0xed, 0x8f, 0x04, 0x06, 0x94, 0x1c, 0x19, 0xd7, 0x2f, 0x60, 0x54, 0x4e, 0x8f, 0x32, 0x42, 0x96, 0xbf, 0xc7, 0x57, 0x24, 0xf3, 0xd2, 0x82, 0xf8, 0xbb, 0xf0, 0x03, 0x1f, 0x7c, 0x44, 0x81, 0x7d, 0x21, 0x5e, 0x57, 0xc9, 0x0e, 0x62, 0x30, 0xd9, 0x55, 0x66, 0xd3 ],
+    const [ 0x37, 0xeb, 0xe9, 0x8e, 0xf5, 0x2b, 0xfb, 0x24, 0x0b, 0x9a, 0xd3, 0x69, 0x15, 0x3a, 0xfe, 0x08, 0x1b, 0xbc, 0xf9, 0xd7, 0xae, 0x43, 0xe8, 0xba, 0x33, 0x6b, 0x8a, 0xc5, 0x7e, 0x8a, 0x6d, 0xa0, 0xa3, 0x36, 0x5e, 0x30, 0x08, 0x07, 0x24, 0x73, 0xbf, 0x9d, 0x6e, 0xac, 0x13, 0xe5, 0x09, 0xc1, 0x61, 0x99, 0x56, 0xe1, 0x2a, 0x06, 0xfc, 0x69, 0x65, 0x12, 0xda, 0x09, 0x1a, 0x7d, 0x40, 0x23, 0x2c, 0x67, 0x5e, 0x73, 0x77, 0x13, 0xfc, 0xf5, 0x1a, 0xea, 0x6c, 0x03, 0x16, 0xc3, 0xbd, 0xbe, 0x19, 0x61, 0x32, 0xb0, 0x94, 0x3d, 0xf2, 0xb0, 0x13, 0x86, 0x01, 0x05, 0xce, 0x67, 0x6f, 0xce, 0x7b, 0x88, 0xd0, 0xa1, 0x67, 0xd7, 0xec, 0x72, 0xc5, 0x88, 0xb7, 0xb6, 0x46, 0x5a, 0x83, 0xc9, 0xea, 0x1d, 0x74, 0x8d, 0x15, 0x71, 0x34, 0x55, 0xe5, 0xd0, 0xe9, 0x01, 0xc3, 0xcf, 0x64, 0x6a, 0x38, 0xa0, 0x9b, 0x00, 0x02, 0xdc, 0x5a, 0xb1, 0x68, 0x7f, 0x35, 0x0d, 0xca, 0x35, 0xc1, 0xa8, 0x7c, 0xd4, 0x04, 0xc0, 0xd5, 0x29, 0x29, 0x20, 0x82, 0xf7, 0x78, 0x44, 0x20, 0x3d, 0x86, 0xbe, 0x0b, 0xb8, 0xa9, 0xd9, 0x70, 0xa9, 0xaf, 0x7b, 0xaa, 0xd8, 0xd0, 0x50, 0xcb, 0xd9, 0xe0, 0x24, 0x78, 0x8e, 0xca, 0x91, 0xfb, 0xed, 0x39, 0xdb, 0x93, 0x03, 0x98, 0x18, 0x0e, 0x39, 0x3d, 0x94, 0x9a, 0xd7, 0xe1, 0x73, 0xd9, 0xc6, 0x54, 0x98, 0x33, 0x9a, 0x6e, 0xc6, 0x70, 0xd0, 0x49, 0x05, 0x86, 0x53, 0xad, 0x48, 0xaf, 0x45, 0xcc, 0x4c, 0xbf, 0xfd, 0x30, 0xc3, 0xb5, 0x4c, 0xf1, 0xb2, 0x90, 0x05, 0x2b, 0x18, 0x64, 0xbc, 0xaf, 0xd0, 0xac, 0xcd, 0xf9, 0xb8, 0xe2, 0xa1, 0x63, 0x13, 0x4d, 0x2c, 0x98, 0x2c, 0x1b, 0xba, 0x4a, 0x3d, 0xaf, 0xec, 0x28, 0x8e, 0x3c, 0xfd, 0x0a, 0xe1, 0x93, 0x4a, 0x6f, 0x0e, 0x39, 0x12, 0x2a, 0xeb, 0xbd, 0x7a, 0x58, 0x6e, 0x48, 0xd4, 0x95, 0x16, 0x76, 0x20, 0x70, 0x86, 0x64, 0xd3, 0x1c, 0x74, 0x0b, 0xd8, 0x68, 0xc1, 0xcc, 0xd5, 0xf0, 0xe9, 0x4b, 0xaf, 0x95, 0x9e, 0x81, 0x50, 0x2c, 0xb0, 0x0d, 0xa8, 0x73, 0x30, 0xcb, 0xf1, 0x49, 0xd5, 0xa8, 0x38, 0x1e, 0x9e, 0xb5, 0x19, 0xa8, 0xb9, 0x7a, 0xca, 0xd7, 0xa4, 0x8c, 0x5b, 0x0c, 0x92, 0x62, 0x3b, 0x86, 0x10, 0x64, 0xff, 0x1c, 0xe8, 0x45, 0x5f, 0x32, 0x46, 0x93, 0x81, 0xe6, 0x19, 0x8c, 0x7b, 0x8a, 0xbc, 0x34, 0x13, 0x57, 0xd6, 0xa4, 0xc8, 0x5f, 0x7f, 0xa5, 0x17, 0xc4, 0xa4, 0x7d, 0xf7, 0x28, 0xac, 0x09, 0xa6, 0x64, 0x5b, 0x0c, 0xa7, 0x7d, 0xf7, 0xc7, 0x0c, 0xd4, 0xaa, 0xca, 0xf1, 0x9c, 0x28, 0x09, 0x49, 0x91, 0x91, 0x32, 0xdd, 0xe7, 0x99, 0x3e, 0x91, 0x81, 0xe6, 0x47, 0xe9, 0x64, 0xba, 0x99, 0xcd, 0x6b, 0xd1, 0x0b, 0x89, 0x3c, 0x8d, 0x90, 0x18, 0x7a, 0x50, 0x09, 0xa2, 0x3d, 0x29, 0x5d, 0x43, 0xbf, 0xb4, 0xcc, 0x0e, 0x58, 0x3b, 0x80, 0x52, 0xac, 0x21, 0x65, 0x1b, 0x23, 0x81, 0x3b, 0xfc, 0x99, 0x12, 0xea, 0x0c, 0x57, 0x4e, 0x15, 0x2f, 0x42, 0xd3, 0xf1, 0x97, 0x53, 0x09, 0x58, 0x8a, 0x47, 0x05, 0x19, 0x65, 0x98, 0xad, 0x93, 0xe1, 0xab, 0x1d, 0x82, 0x95, 0x4b, 0x4a, 0x18, 0xbc, 0x56, 0xe5, 0x50, 0x39, 0xb6, 0x83, 0x7f, 0xd8, 0x93, 0xfa, 0x2b, 0xd7, 0xc7, 0x0e, 0x21, 0xa5, 0x93, 0x4d, 0xc2, 0xe9, 0x90, 0x37, 0x9e, 0xc6, 0xe8, 0xa2, 0x44, 0x5d, 0xc5, 0x5d, 0x57, 0x94, 0x0a, 0x14, 0xe5, 0x16, 0x42, 0x73, 0xf5, 0x9c, 0xd5, 0x8e, 0x5f, 0x6a, 0x82, 0x81, 0xe1, 0x1c, 0x09, 0x53, 0x6e, 0xa2, 0x28, 0x21, 0xc9, 0x8a, 0xc9, 0x78, 0x53, 0x7d, 0x7a, 0x02, 0x22, 0x0d, 0x1d, 0x65, 0x52, 0xae, 0xe1, 0x68, 0xa0, 0x01, 0x71, 0x58, 0x34, 0x59, 0x6b, 0xaa, 0xbf, 0x78, 0x13, 0xe1, 0xc6, 0x99, 0x49, 0xb2, 0x3e, 0xb4, 0xb8, 0x66, 0x58, 0xfd, 0x51, 0x81, 0x9e, 0xad, 0xf8, 0xa1, 0x3f, 0x06, 0x7c, 0xa8, 0xa7, 0x91, 0xcd, 0x1d, 0x53, 0xab, 0x69, 0xd0, 0xe4, 0x3f, 0x18, 0xbd, 0x72, 0xd5, 0xd9, 0x33, 0x22, 0xcc, 0x1c, 0x36, 0xfb, 0xe3, 0x31, 0x21, 0xf5, 0xff, 0x01, 0x90, 0x53, 0x28, 0xfc, 0x7c, 0x33, 0xd4, 0x52, 0xa8, 0x64, 0x68, 0x66, 0x3c, 0x77, 0xfc, 0x80, 0xb0, 0x19, 0x5e, 0xc1, 0xec, 0xa0, 0x5a, 0x5d, 0xae, 0xe3, 0x39, 0x04, 0x2b, 0x4f, 0x88, 0xa1, 0xf9, 0x37, 0x1b, 0x47, 0x2c, 0x6c, 0x51, 0x68, 0xc0, 0x0e, 0x98, 0x49, 0x37, 0xa1, 0x34, 0xb2, 0x82, 0x63, 0x3d, 0xea, 0x25, 0xdd, 0xe7, 0xe3, 0x97, 0xb9, 0x07, 0xb1, 0xe7, 0xd3, 0xd2, 0x40, 0xa5, 0x93, 0xe7, 0x47, 0x00, 0x79, 0x90, 0x78, 0x2c, 0xf9, 0x44, 0xfa, 0x07, 0x8a, 0x71, 0x18, 0xfb, 0xfa, 0x79, 0x3b, 0x26, 0x04, 0xfa, 0x15, 0xb8, 0x24, 0x53, 0x20, 0x9d, 0xaa, 0x64, 0x47, 0x5d, 0x0e, 0x95, 0xe2, 0x40, 0x83, 0x19, 0xe8, 0xb5, 0xce, 0x74, 0x60, 0xf4, 0x59, 0x3a, 0x19, 0xe3, 0x83, 0x1a, 0x9b, 0x36, 0x3b, 0x1c, 0x5d, 0xdb, 0xcd, 0x27, 0x39, 0x95, 0xfb, 0xc6, 0x1c, 0xe7, 0x50, 0x2b, 0x02, 0x33, 0xb1, 0x75, 0x22, 0x23, 0x35, 0x2e, 0x65, 0x48, 0x37, 0x18, 0x1d, 0x01, 0xa9, 0x29, 0xf4, 0x9f, 0xaa, 0xd4, 0x22, 0xc6, 0x5b, 0x8a, 0xe4, 0x16, 0xef, 0x81, 0x29, 0x0b, 0x02, 0xb4, 0x8e, 0x22, 0x2c, 0x2b, 0x8c, 0x3e, 0xd5, 0x7c, 0xf0, 0x49, 0x4b, 0x92, 0x8c, 0x1e, 0x11, 0xad, 0x2d, 0xa7, 0x7b, 0xaa, 0xcd, 0x42, 0x77, 0x85, 0x09, 0x6a, 0xae, 0x1c, 0xd5, 0x93, 0xcc, 0x35, 0x6e, 0x55, 0x1b, 0xc3, 0x90, 0xcd, 0x57, 0x65, 0xea, 0x41, 0xbe, 0x30, 0xcf, 0x02, 0x66, 0xae, 0x2e, 0x97, 0xd3, 0x26, 0xc4, 0x17, 0xc9, 0x1e, 0x90, 0xd7, 0x5f, 0x1f, 0x87, 0x45, 0x55, 0xb8, 0x8a, 0x14, 0xa7, 0xc5, 0x95, 0x9a, 0x62, 0xf2, 0x39, 0x76, 0xb7, 0x7a, 0x4c, 0x75, 0x4e, 0x35, 0xdf, 0xb7, 0xdd, 0xd1, 0x70, 0x0d, 0xf8, 0x5f, 0x61, 0xa6, 0x2b, 0x12, 0xa9, 0xeb, 0x46, 0x44, 0xca, 0xa7, 0xf8, 0xba, 0x03, 0x6b, 0x9f, 0x29, 0xc6, 0x31, 0x5f, 0xf9, 0x6c, 0x3f, 0x71, 0x48, 0x28, 0x4e, 0xbe, 0x32, 0x39, 0xec, 0xad, 0x50, 0x64, 0x1f, 0x39, 0x7e, 0xa2, 0x4b, 0x46, 0xe2, 0x16, 0x55, 0x35, 0x2a, 0x41, 0x09, 0xb6, 0x14, 0x79, 0xb9, 0xdd, 0x34, 0x97, 0x27, 0x79, 0xf2, 0xf1, 0xa6, 0xa1, 0xd2, 0x88, 0x7b, 0x8f, 0xf8, 0x82, 0x89, 0xb2, 0xeb, 0xda, 0x2e, 0xfe, 0x99, 0x56, 0x68, 0x87, 0x9b, 0xb9, 0x3c, 0x4e, 0xbb, 0x3a, 0x58, 0x5a, 0xb3, 0x36, 0xf7, 0x0b, 0x38, 0x22, 0x05, 0xac, 0x37, 0xc3, 0x83, 0x47, 0x5f, 0xa1, 0x2e, 0xbd, 0xdf, 0xb9, 0x5b, 0x15, 0x71, 0x72, 0x26, 0x15, 0x97, 0xd2, 0xcb, 0x0f, 0x24, 0xf2, 0x54, 0xfe, 0xff, 0xaf, 0x75, 0xd2, 0x24, 0xa3, 0xb4, 0x07, 0xeb, 0x54, 0xcc, 0x7c, 0x8d, 0xaa, 0x54, 0x83, 0xe4, 0xa7, 0x9c, 0x34, 0x72, 0x52, 0xd8, 0x08, 0xa5, 0xf4, 0x80, 0xa3, 0x59, 0x87, 0xf6, 0xf0, 0x9f, 0x6c, 0x6a, 0x73, 0xbd, 0x5c, 0xfb, 0xdb, 0x76, 0xa1, 0x1e, 0xd7, 0x8b, 0x86, 0x44, 0x2b, 0x81, 0x0c, 0xb7, 0x03, 0xa5, 0xde, 0xc5, 0x87, 0x4e, 0x87, 0x21, 0xaf, 0x62, 0xe3, 0x86, 0x59, 0x1b, 0xd3, 0x9d, 0x99, 0x0b, 0x35, 0x21, 0x50, 0x5e, 0x14, 0x41, 0x00, 0x60, 0x1b, 0x46, 0xde, 0x3f, 0x50, 0x75, 0x29, 0x11, 0xff, 0x37, 0xbb, 0x18, 0xf3, 0x77, 0xde, 0x45, 0xec, 0x4c, 0x60, 0xfc, 0x4e, 0xd8, 0xea, 0x17, 0x17, 0x70, 0x8d, 0x2d, 0x13, 0xfc, 0x9e, 0x14, 0x53, 0xa1, 0xc4, 0xa4, 0xdb, 0x9e, 0x4f, 0xbe, 0x9b, 0x74, 0xcb, 0x8d, 0xa1, 0x4a, 0xd5, 0x0c, 0x8c, 0x8f, 0x2e, 0xc9, 0x44, 0xe1, 0x0e, 0xe8, 0xe8, 0x2e, 0xbb, 0x6a, 0x08, 0x19, 0x59, 0xb0, 0x15, 0x9f, 0x04, 0x3a, 0x15, 0xfa, 0x1c, 0xb5, 0x9b, 0xc5, 0xe0, 0x35, 0xf7, 0x62, 0x3f, 0xbf, 0xaa, 0x99, 0xea, 0x0a, 0x1d, 0x81, 0xae, 0x86, 0x92, 0xa4, 0x01, 0x9e, 0x5a, 0x5e, 0xdb, 0x3a, 0x48, 0x86, 0xc7, 0x89, 0x67, 0x50, 0x39, 0xfd, 0xe8, 0x72, 0x22, 0x97, 0x5e, 0x86, 0xc2, 0x64, 0x2e, 0xb0, 0xbd, 0x48, 0x40, 0x80, 0x72, 0xfa, 0xfb, 0x1a, 0x88, 0x50, 0x71, 0x94, 0xc9, 0xbd, 0xd6, 0x9f, 0x34, 0x18, 0x37, 0x6a, 0x4d, 0x9e, 0x68, 0xc3, 0xb8, 0x3b, 0x3f, 0x80, 0x06, 0x05, 0xff, 0x1d, 0xcf, 0x09, 0x17, 0xa6, 0x01, 0x4b, 0x0d, 0xd7, 0x77, 0x08, 0xb5, 0x83, 0xce, 0x3e, 0xa6, 0x32, 0x74, 0x6f, 0xee, 0x0e, 0x01, 0xa1, 0x05, 0x00, 0xcb, 0xa9, 0x00, 0x16, 0xb4, 0xa9, 0x07, 0x28, 0x47, 0xd8, 0x09, 0xbb, 0x04, 0x81, 0xae, 0x25, 0xf7, 0x4f, 0x8e, 0xf2, 0x90, 0xc7, 0xa0, 0x87, 0xae, 0x16, 0xf5, 0x05, 0xfd, 0x0d, 0xa6, 0x70, 0x82, 0x6a, 0x0b, 0x11, 0x74, 0x59, 0x2d, 0x18, 0x4e, 0x3a, 0x7e, 0x86, 0x22, 0xa5, 0xc8, 0x4a, 0x30, 0xab, 0x64, 0xaa, 0xb7, 0x5f, 0xac, 0xe5, 0x0b, 0x96, 0xb2, 0x17, 0xe8, 0xea, 0x33, 0x5c, 0x06, 0x05, 0xc6, 0x38, 0xed, 0x1c, 0x59, 0x37, 0x0b, 0xb9, 0xde, 0xd0, 0x04, 0xbe, 0x42, 0x8f, 0x49, 0xa7, 0x9f, 0x74, 0xec, 0x0f, 0xb2, 0x96, 0xb3, 0x75, 0x8f, 0x0b, 0x6b, 0x41, 0x93, 0x0c, 0x7e, 0x02, 0x9b, 0x55, 0xc8, 0xfa, 0x73, 0xcb, 0xa7, 0xdc, 0x92, 0x61, 0x51, 0xd4, 0x04, 0x3c, 0x6b, 0xc8, 0xa7, 0x16, 0xd7, 0xde, 0x9a, 0xe0, 0xcd, 0x3e, 0xf3, 0xab, 0x2d, 0x19, 0xb0, 0xc8, 0x13, 0xea, 0xf1, 0x2e, 0xac, 0xfb, 0x64, 0x1d, 0x49, 0x2b, 0x00, 0x01, 0xb2, 0xf0, 0xf6, 0x99, 0xbd, 0x98, 0xe4, 0x58, 0x1f, 0xd4, 0x4c, 0x0c, 0x81, 0x76, 0x46, 0xbd, 0xd7, 0x7a, 0x71, 0xd8, 0xed, 0x43, 0x2f, 0x8d, 0x42, 0x28, 0x12, 0x75, 0x1a, 0x2f, 0x91, 0x78, 0xcf, 0x18, 0x00, 0xee, 0x68, 0x9e, 0xbf, 0x04, 0x6c, 0xf9, 0xb1, 0x61, 0xf9, 0xa7, 0xef, 0x0a, 0x10, 0x6c, 0xbe, 0x83, 0x33, 0x98, 0xbf, 0x38, 0x32, 0x88, 0x66, 0x1b, 0x42, 0x6f, 0xad, 0x8d, 0x4f, 0x57, 0x0a, 0x82, 0x93, 0x62, 0x9e, 0xe0, 0x68, 0x56, 0xaf, 0x29, 0x5a, 0x58, 0x58, 0x5a, 0x81, 0xf8, 0x7f, 0x13, 0x0e, 0x6e, 0x08, 0xf7, 0x23, 0x23, 0x48, 0x56, 0xe8, 0x74, 0xbd, 0x0a, 0xdb, 0xb2, 0xfc, 0x9e, 0x67, 0x6d, 0xea, 0xb6, 0xb9, 0xf2, 0x2f, 0xaa, 0xcf, 0x12, 0xe8, 0x75, 0xd1, 0x25, 0x9c, 0xce, 0xa5, 0x4f, 0x72, 0x94, 0xbe, 0x02, 0xa1, 0x6f, 0x34, 0xc4, 0x27, 0xb5, 0x1a, 0x33, 0xbe, 0x8a, 0x0c, 0x46, 0x0c, 0x4c, 0x07, 0xd5, 0x1a, 0x2e, 0x7d, 0x5c, 0x07, 0x22, 0xa9, 0xfc, 0xfe, 0xfd, 0x21, 0xc2, 0x65, 0xd5, 0xaa, 0x2c, 0x57, 0xae, 0x4f, 0xe9, 0x55, 0x56, 0xb5, 0xe1, 0x38, 0x8e, 0xa9, 0x75, 0x6a, 0x6a, 0xfb, 0x08, 0x56, 0xfb, 0x8f, 0xbe, 0x1d, 0x2b, 0xb1, 0x83, 0x8b, 0xe7, 0xa9, 0x50, 0x49, 0x84, 0x8f, 0xa9, 0x54, 0x5b, 0x61, 0x6b, 0xad, 0xb7, 0x53, 0xc4, 0x53, 0xf2, 0x66, 0x83, 0x6e, 0xda, 0x3c, 0x92, 0xcd, 0x59, 0x2b, 0xc0, 0x92, 0x56, 0x90, 0xc4, 0x2c, 0xd6, 0x66, 0x7f, 0x86, 0x67, 0x17, 0x82, 0x7e, 0xbe, 0x91, 0xd0, 0x99, 0x9f, 0x9d, 0xe5, 0xf5, 0xfd, 0x6c, 0xf7, 0x7f, 0x63, 0x73, 0x7b, 0x65, 0x92, 0x7a, 0xeb, 0xcf, 0x6c, 0xef, 0xc7, 0xca, 0x10, 0x7f, 0xda, 0x84, 0x47, 0xe8, 0xbe, 0xbf, 0x1f, 0x08, 0xa2, 0x80, 0xd5, 0x3a, 0x4b, 0x07, 0xf8, 0xe3, 0x59, 0x04, 0xcc, 0x48, 0xcc, 0x08, 0xed, 0xa3, 0xc6, 0x3a, 0x34, 0x75, 0x92, 0x4b, 0xde, 0x1d, 0xe6, 0xac, 0xeb, 0xaa, 0x65, 0xfe, 0xc5, 0xee, 0x68, 0xca, 0x22, 0xd3, 0xfe, 0x72, 0x2b, 0xf3, 0x32, 0x67, 0xde, 0x62, 0x8c, 0x9d, 0xb1, 0xce, 0xda, 0x3c, 0x78, 0xcb, 0x2f, 0x99, 0x88, 0x68, 0x2d, 0x64, 0x1d, 0x06, 0x80, 0x23, 0xf9, 0x6a, 0xab, 0xde, 0x4e, 0x10, 0x07, 0x1c, 0xde, 0xc2, 0x08, 0x0f, 0x61, 0x6a, 0xc3, 0x0c, 0x27, 0x25, 0xad, 0x3e, 0xfe, 0x98, 0xa6, 0x9a, 0x56, 0x87, 0x36, 0x15, 0xa3, 0xa3, 0x16, 0x15, 0x03, 0xa4, 0xf2, 0x26, 0x21, 0x98, 0x6d, 0xef, 0x59, 0x7b, 0x66, 0x64, 0x1d, 0x07, 0x79, 0x3d, 0x97, 0xcd, 0xc9, 0xa6, 0x8f, 0x85, 0xfd, 0x38, 0x90, 0xa3, 0x89, 0x28, 0x46, 0x2b, 0x2f, 0xbe, 0x2b, 0xc5, 0xc5, 0x09, 0x63, 0x14, 0x38, 0xd2, 0xe3, 0x44, 0xd1, 0xce, 0xd9, 0xe2, 0xb7, 0x17, 0x48, 0xf1, 0xb6, 0xdd, 0xf3, 0x3a, 0x3e, 0x59, 0x7d, 0xe3, 0xaf, 0x03, 0xce, 0x43, 0xd3, 0x05, 0xb9, 0xf5, 0xac, 0xef, 0xdb, 0x2b, 0x71, 0xac, 0xc6, 0x45, 0xd3, 0xb5, 0x5f, 0xa3, 0x84, 0x84, 0x84, 0xb7, 0xfa, 0x4c, 0xf2, 0x5e, 0x71, 0xe7, 0x66, 0x70, 0x2f, 0x10, 0x03, 0x95, 0x0b, 0xd2, 0xf4, 0x5b, 0x30, 0x40, 0x52, 0x86, 0x1f, 0x67, 0x48, 0xa8, 0xf3, 0x81, 0x75, 0xf1, 0xe9, 0x6c, 0x91, 0x47, 0x1f, 0x5a, 0x54, 0x99, 0x9c, 0xc9, 0x93, 0x71, 0x91, 0xb6, 0xad, 0xc9, 0xde, 0x0d, 0x25, 0x20, 0xd8, 0x65, 0x90, 0xcd, 0x4a, 0xea, 0xb2, 0x92, 0xba, 0x9a, 0xe4, 0x74, 0xed, 0xb5, 0xb8, 0xca, 0xad, 0x6e, 0xe0, 0x95, 0xc9, 0xe7, 0x4c, 0x0f, 0x5e, 0x5c, 0x93, 0x87, 0x55, 0x9f, 0x94, 0x6b, 0x2d, 0xc4, 0x5d, 0xa7, 0xfa, 0x1d, 0x4c, 0x2d, 0xae, 0x69, 0x73, 0xd5, 0x98, 0x48, 0x41, 0x68, 0x2a, 0xf2, 0x5f, 0xf7, 0xff, 0x29, 0xd9, 0x72, 0x1d, 0x6c, 0x7e, 0x76, 0x77, 0x6e, 0x89, 0x65, 0xb6, 0xc6, 0x81, 0xbc, 0x38, 0xe8, 0x5d, 0xa1, 0x59, 0x54, 0xec, 0xbc, 0xf2, 0x0d, 0x74, 0x48, 0x20, 0x4d, 0x9a, 0x6a, 0x47, 0x77, 0x81, 0xc1, 0x56, 0x4d, 0x36, 0x3e, 0x4c, 0x63, 0x4c, 0x36, 0xfb, 0xd3, 0xc3, 0xb5, 0x0b, 0x33, 0x2f, 0x16, 0x43, 0xc4, 0x15, 0xd0, 0x04, 0xec, 0x99, 0x93, 0x16, 0xe7, 0x56, 0x94, 0xa8, 0xb9, 0x8e, 0x25, 0x91, 0x67, 0x83, 0x88, 0xdc, 0x66, 0x24, 0x05, 0x84, 0x54, 0xec, 0x3a, 0x7c, 0xe6, 0x08, 0xb3, 0xf2, 0x22, 0xb8, 0xba, 0xd5, 0xce, 0xf7, 0x70, 0x95, 0x28, 0x5e, 0x1d, 0x2a, 0xd7, 0x46, 0xc5, 0x57, 0x22, 0x2d, 0xfc, 0x30, 0x60, 0x5b, 0xfa, 0xda, 0xaf, 0xc4, 0xf2, 0x92, 0xe9, 0x31, 0xa0, 0xf0, 0xd4, 0x9b, 0x22, 0x6d, 0x99, 0xd7, 0x08, 0x24, 0x78, 0x79, 0xae, 0xd5, 0xb9, 0xf2, 0xca, 0x2f, 0xe6, 0xfb, 0x41, 0x4f, 0x37, 0x37, 0x3f, 0x84, 0x4e, 0x13, 0x86, 0x55, 0x24, 0xf2, 0x06, 0xc5, 0x44, 0x87, 0xae, 0xd5, 0x37, 0x81, 0x83, 0x4b, 0x3f, 0x6e, 0xef, 0xb2, 0x48, 0xd9, 0x5b, 0xa2, 0x1b, 0xb6, 0x00, 0x41, 0xd5, 0x01, 0xf9, 0x0a, 0x97, 0xa1, 0x9d, 0xcd, 0x80, 0x92, 0x0d, 0xf7, 0xd8, 0x43, 0x09, 0x14, 0x8e, 0x3d, 0x08, 0x92, 0xe5, 0x06, 0x87, 0xc8, 0x6a, 0x45, 0xa1, 0x37, 0x29, 0x26, 0xe0, 0x0f, 0x20, 0x00, 0x53, 0xf5, 0xf4, 0x36, 0xe0, 0x03, 0xe3, 0x5b, 0xdc, 0x10, 0xfa, 0x99, 0xd9, 0x32, 0x88, 0x53, 0xbf, 0x82, 0xd2, 0x09, 0x1f, 0x1f, 0x08, 0x7c, 0xc3, 0x76, 0x78, 0x13, 0x8a, 0xc0, 0x02, 0x7e, 0x73, 0xcb, 0xcc, 0x99, 0xf7, 0xfe, 0x37, 0x93, 0x9c, 0x98, 0x11, 0x4f, 0xc7, 0x38, 0x0c, 0x0a, 0xd1, 0xa2, 0x6e, 0x3f, 0x5e, 0xc0, 0x0b, 0xc7, 0xea, 0xe7, 0x70, 0x45, 0xa5, 0x5c, 0x62, 0xc1, 0x81, 0x17, 0x87, 0x93, 0x89, 0xc6, 0x62, 0x83, 0x74, 0x15, 0x85, 0x2e, 0x7a, 0x2d, 0x01, 0xac, 0x66, 0x7a, 0x22, 0x6f, 0xed, 0xb2, 0x59, 0x6e, 0x3e, 0x13, 0x7a, 0x83, 0xda, 0xec, 0x27, 0x12, 0xa6, 0x5e, 0x8c, 0xec, 0x3e, 0x64, 0x4e, 0x73, 0x8d, 0x11, 0xbd, 0xfe, 0x9b, 0x19, 0x51, 0x7f, 0xa5, 0x93, 0x54, 0x63, 0x73, 0xfd, 0xdc, 0xb9, 0xe6, 0x81, 0xfc, 0x97, 0xd1, 0x76, 0x3b, 0xb9, 0x09, 0x2a, 0x45, 0x6c, 0xc0, 0xdf, 0xe1, 0xaa, 0x0e, 0x13, 0x23, 0x87, 0xd1, 0x05, 0xe3, 0xcc, 0xb7, 0x74, 0x6e, 0xe1, 0x99, 0xaa, 0x7a, 0xf0, 0x0b, 0xb9, 0x60, 0x47, 0x31, 0x05, 0x85, 0xfe, 0xd4, 0x02, 0x19, 0xda, 0xb4, 0x3f, 0x05, 0x72, 0x20, 0xa4, 0x1e, 0x90, 0xc5, 0xf8, 0x9f, 0xda, 0xc4, 0xa5, 0xd6, 0xb2, 0x07, 0xc0, 0x1d, 0x5a, 0xd4, 0x44, 0x0c, 0x5c, 0xa2, 0x9e, 0xed, 0x29, 0x2c, 0x6f, 0x70, 0x00, 0xc5, 0x8d, 0xa1, 0x11, 0xeb, 0x4b, 0x16, 0xe3, 0x1e, 0xfa, 0x6d, 0xf3, 0xf3, 0xaf, 0xf6, 0x9e, 0x64, 0x47, 0xac, 0x40, 0x6a, 0xa9, 0x6a, 0x9e, 0xce, 0x4b, 0x5b, 0x81, 0x3b, 0xf8, 0xb3, 0xa4, 0x99, 0xd0, 0x9c, 0xd0, 0x96, 0x90, 0x73, 0x46, 0x85, 0x13, 0x35, 0x5d, 0x6c, 0x19, 0x34, 0x6c, 0x58, 0x48, 0x0f, 0xea, 0xf4, 0x70, 0xe0, 0xd4, 0x5a, 0x13, 0xb7, 0x4f, 0x29, 0x25, 0x48, 0x8f, 0xd8, 0x10, 0xe0, 0xf7, 0x4a, 0xfb, 0x9e, 0x82, 0xa2, 0x4c, 0xdf, 0x61, 0x58, 0x6b, 0xfa, 0xe6, 0x8d, 0xc9, 0x2e, 0xa0, 0x9b, 0x22, 0xd8, 0xc8, 0xf1, 0xff, 0xe9, 0xdb, 0x1e, 0x7e, 0x98, 0x89, 0x2b, 0x55, 0x54, 0xce, 0x2e, 0x15, 0xfd, 0x5f, 0x1c, 0xac, 0x53, 0x47, 0xdf, 0x2e, 0xaf, 0xd2, 0xa8, 0xd5, 0xf1, 0xaa, 0x87, 0x46, 0xb9, 0x40, 0x39, 0x15, 0xda, 0x6d, 0x41, 0x8c, 0x0b, 0x5a, 0x3a, 0xa8, 0xe0, 0x9d, 0x6b, 0x65, 0xf9, 0xa4, 0x9c, 0x3b, 0x7a, 0x57, 0x28, 0xe9, 0xba, 0xf9, 0x54, 0x71, 0x40, 0x4f, 0xdf, 0x64, 0xeb, 0x05, 0xda, 0x5f, 0x70, 0x4d, 0xba, 0xd6, 0x0a, 0xc9, 0xac, 0x10, 0x6c, 0xab, 0x28, 0x73, 0xfb, 0x1b, 0xc9, 0x02, 0x3a, 0xd9, 0x5c, 0x24, 0x85, 0x23, 0x37, 0xa7, 0x03, 0xd9, 0xcc, 0x04, 0xd6, 0xdf, 0x7d, 0xe5, 0x94, 0xc3, 0xb2, 0xe4, 0xfb, 0x9f, 0x29, 0x96, 0xe0, 0x41, 0x8e, 0xc8, 0x69, 0x8a, 0x4c, 0x08, 0x7c, 0x14, 0xa2, 0x68, 0x77, 0x17, 0xf9, 0x7e, 0x22, 0x8e, 0x75, 0xaf, 0xe2, 0x95, 0xca, 0xae, 0x2f, 0x16, 0x51, 0x3f, 0x47, 0xa4, 0x5b, 0x41, 0x24, 0xa7, 0xc5, 0xeb, 0xac, 0xba, 0xcc, 0x56, 0x29, 0x51, 0x23, 0x3b, 0xf8, 0x9f, 0x43, 0xff, 0x85, 0xb7, 0x03, 0xec, 0x77, 0xf1, 0x68, 0xc2, 0x27, 0x8f, 0xbe, 0x6e, 0x57, 0xa0, 0xe7, 0x19, 0x21, 0x25, 0xf4, 0x64, 0x2d, 0x73, 0xf2, 0xf2, 0x27, 0xd8, 0x06, 0x28, 0x70, 0x81, 0xbd, 0x30, 0x14, 0x9b, 0x9d, 0x44, 0xfd, 0xb9, 0x00, 0x29, 0x66, 0x76, 0x22, 0xf9, 0x92, 0x5b, 0x78, 0x26, 0xbd, 0x03, 0x43, 0xbc, 0x53, 0x7c, 0x66, 0xe6, 0x60, 0xf1, 0x74, 0xb4, 0x47, 0x86, 0x0e, 0x1b, 0xb8, 0x84, 0x6c, 0x3e, 0xdc, 0xb6, 0x39, 0xeb, 0xd2, 0x13, 0xa4, 0x69, 0x5f, 0x9c, 0xb4, 0x71, 0xe1, 0x88, 0xdb, 0x7a, 0x85, 0x9f, 0xcf, 0x3a, 0xba, 0xe4, 0x95, 0x69, 0xe6, 0x76, 0xde, 0xc8, 0x57, 0xb8, 0x97, 0x62, 0x7c, 0xb0, 0xbc, 0x11, 0x55, 0xad, 0x6d, 0x45, 0x28, 0x2d, 0x43, 0x01, 0x76, 0xfd, 0xe4, 0x26, 0x2d, 0xa2, 0xd5, 0xf4, 0x1f, 0xf8, 0x90, 0xce, 0xb3, 0x19, 0xd7, 0x3d, 0xda, 0x80, 0x47, 0x38, 0x45, 0x6f, 0x30, 0xa3, 0xd6, 0x8d, 0xa4, 0x15, 0x54, 0xd4, 0xce, 0xde, 0x62, 0xaa, 0x85, 0x49, 0xb2, 0x4e, 0x21, 0x1e, 0x76, 0x76, 0x8e, 0x6b, 0x17, 0x37, 0x9f, 0x84, 0x2a, 0x24, 0xa4, 0x49, 0xa0, 0xba, 0x3e, 0xa7, 0x3c, 0xfc, 0x72, 0x62, 0x4b, 0x5a, 0xfd, 0x11, 0x8f, 0xd7, 0xe7, 0x6a, 0x7c, 0x6b, 0x5b, 0xbf, 0xa7, 0xa6, 0xb6, 0xc9, 0x7b, 0x97, 0xde, 0xa5, 0x2d, 0xec, 0xd5, 0x1c, 0xf3, 0x5a, 0x8e, 0x27, 0x71, 0x40, 0xff, 0xb2, 0x74, 0x87, 0x77, 0xa1, 0xe3, 0xcc, 0x32, 0x11, 0xf3, 0xc1, 0x2b, 0xe0, 0x99, 0xd0, 0x31, 0x6f, 0x45, 0x02, 0x3d, 0xa6, 0xcd, 0x20, 0x03, 0x39, 0xa7, 0x18, 0xc7, 0x2a, 0x5c, 0xa1, 0x72, 0x90, 0x39, 0x22, 0xe5, 0x96, 0x48, 0xd0, 0x8d, 0xc6, 0x7f, 0x17, 0x37, 0x88, 0x36, 0x3c, 0x26, 0xe5, 0xdf, 0x40, 0x63, 0x91, 0xf1, 0x07, 0x55, 0x29, 0x25, 0xba, 0x91, 0xb9, 0xe5, 0x69, 0xf3, 0x81, 0x01, 0xf5, 0xee, 0xf9, 0xa5, 0x2d, 0x20, 0x12, 0x88, 0x37, 0x2a, 0xbf, 0x65, 0x32, 0xbe, 0xb4, 0xaf, 0x19, 0xfa, 0x6d, 0x81, 0xea, 0xf4, 0x73, 0xd4, 0x08, 0x96, 0xdb, 0xf4, 0xde, 0xac, 0x0f, 0x35, 0xc6, 0x3b, 0xd1, 0xe1, 0x29, 0x14, 0x7c, 0x76, 0xe7, 0xaa, 0x8d, 0x0e, 0xf9, 0x21, 0x63, 0x1f, 0x55, 0xa7, 0x43, 0x64, 0x11, 0x07, 0x9f, 0x1b, 0xcc, 0x7b, 0x98, 0x71, 0x4a, 0xc2, 0xc1, 0x3b, 0x5e, 0x73, 0x26, 0xe6, 0x0d, 0x91, 0x8d, 0xb1, 0xf0, 0x5f, 0xfb, 0x19, 0xda, 0x76, 0x7a, 0x95, 0xbb, 0x14, 0x1a, 0x84, 0xc4, 0xb7, 0x36, 0x64, 0xcc, 0xeb, 0xf8, 0x44, 0xf3, 0x60, 0x1f, 0x7c, 0x85, 0x3f, 0x00, 0x9b, 0x21, 0xbe, 0xcb, 0xa1, 0x1a, 0xf3, 0x10, 0x6f, 0x1d, 0xe5, 0x82, 0x7b, 0x14, 0xe9, 0xfa, 0xc8, 0x4b, 0x2c, 0xbf, 0x16, 0xd1, 0x8c, 0x04, 0x56, 0x22, 0xac, 0xb2, 0x60, 0x02, 0x47, 0x68, 0xe8, 0xac, 0xc4, 0xc0, 0xae, 0x2c, 0x0b, 0xd5, 0xf6, 0x0a, 0x98, 0x02, 0x38, 0x28, 0xcd, 0xec, 0x18, 0xed, 0x8d, 0xc2, 0x98, 0xa3, 0x06, 0xc3, 0x8d, 0x1e, 0xce, 0x01, 0x50, 0x9f, 0x32, 0x65, 0xb5, 0xf8, 0xcb, 0xf4, 0x41, 0xf0, 0x52, 0x50, 0x97, 0xe8, 0xb4, 0x82, 0x34, 0xbf, 0x69, 0xf6, 0x5c, 0xf4, 0x02, 0xc7, 0x54, 0x0a, 0x02, 0x3e, 0xd2, 0x31, 0xef, 0x95, 0xb2, 0x22, 0xa9, 0x00, 0xea, 0x4b, 0xfa, 0xee, 0xc0, 0x2c, 0x6d, 0x8b, 0x3b, 0x01, 0x64, 0x8a, 0xd7, 0xa1, 0x65, 0x23, 0x7c, 0xa6, 0xb5, 0x57, 0xb1, 0xce, 0x28, 0x7b, 0x0e, 0xa1, 0x37, 0xf4, 0xef, 0x54, 0x53, 0x40, 0x70, 0xee, 0x79, 0x36, 0x95, 0xa9, 0x07, 0x8e, 0xc8, 0x9b, 0xce, 0xa3, 0x89, 0x95, 0x68, 0x78, 0x61, 0x4c, 0xcb, 0xf9, 0x17, 0xb6, 0x1f, 0x84, 0x27, 0xb7, 0xcd, 0xa8, 0x70, 0xfd, 0xd9, 0x2d, 0x2d, 0x29, 0x71, 0x54, 0x26, 0x2f, 0xc6, 0x5f, 0x28, 0xff, 0x1a, 0x54, 0xb2, 0x65, 0x1a, 0xff, 0xf1, 0x2d, 0x6f, 0x36, 0xee, 0x8c, 0x90, 0x61, 0x07, 0xbb, 0xda, 0x39, 0x9c, 0xe5, 0xe2, 0xcf, 0x0a, 0x43, 0x0a, 0xd0, 0xdd, 0x86, 0x52, 0x08, 0x41, 0x75, 0x71, 0x26, 0xba, 0xd7, 0x25, 0xbf, 0x15, 0x93, 0xc7, 0x95, 0x9f, 0x16, 0x22, 0x18, 0x94, 0xf5, 0x85, 0x2d, 0xda, 0xd3, 0x17, 0x2f, 0xef, 0x86, 0x6b, 0x33, 0x21, 0x75, 0x54, 0x91, 0xfd, 0x44, 0xfb, 0xa0, 0x09, 0xb4, 0x2e, 0xc0, 0xb6, 0xc4, 0xfb, 0x9e, 0x90, 0x1d, 0x7e, 0xb3, 0xb8, 0xac, 0xf7, 0x0e, 0x94, 0x91, 0x1f, 0x54, 0xc5, 0x38, 0xbd, 0x05, 0x59, 0xc5, 0x74, 0x00, 0x42, 0xb6, 0xdf, 0x4a, 0x07, 0xc3, 0xe0, 0x0b, 0xba, 0x09, 0x34, 0xd9, 0x2a, 0x68, 0x4b, 0x39, 0x59, 0x2a, 0x57, 0x63, 0x31, 0xe5, 0xa4, 0x46, 0x72, 0xa2, 0x27, 0xcc, 0xef, 0x3e, 0x59, 0x5f, 0xfa, 0x11, 0x46, 0xac, 0x1d, 0xce, 0xe0, 0xa7, 0x0b, 0xaa, 0x9a, 0xcf, 0xd5, 0xc1, 0x32, 0xb3, 0x61, 0xb5, 0xce, 0xb5, 0x19, 0x98, 0x4b, 0x0e, 0xe0, 0x0c, 0xd2, 0x12, 0x4a, 0xa8, 0xac, 0xb5, 0x0c, 0x9e, 0x57, 0x4f, 0xb1, 0x9b, 0xd9, 0x9c, 0x8f, 0xef, 0x54, 0x07, 0xfa, 0xee, 0xdb, 0x28, 0xb7, 0x96, 0x84, 0x8b, 0xb3, 0x72, 0xbe, 0xb3, 0xf5, 0xbd, 0xe5, 0x5e, 0xd2, 0xcb, 0x14, 0x0b, 0x60, 0xa5, 0x3b, 0xba, 0x2d, 0xf4, 0x71, 0xf3, 0x30, 0x20, 0x8b, 0x09, 0xff, 0xb8, 0xed, 0xa0, 0x43, 0x15, 0xa0, 0x6d, 0x69, 0x3a, 0xa5, 0x3d, 0x9b, 0xff, 0x89, 0x39, 0xef, 0x6f, 0x3a, 0x68, 0xde, 0x6e, 0x19, 0x75, 0xf7, 0x9f, 0x50, 0xb3, 0xd4, 0x84, 0x66, 0x5e, 0x4e, 0xe7, 0x11, 0x24, 0xed, 0x79, 0x4b, 0xe3, 0xa2, 0xba, 0xa7, 0xb5, 0xb9, 0x18, 0xe6, 0x2a, 0x09, 0x5b, 0xc5, 0xd4, 0x6e, 0x40, 0x1a, 0x09, 0x79, 0x64, 0x1f, 0xe4, 0x65, 0x64, 0x0e, 0x8d, 0x4d, 0x43, 0xee, 0xba, 0x9d, 0x0c, 0xac, 0x76, 0xc7, 0xb8, 0x6d, 0x22, 0x37, 0x51, 0x23, 0xb9, 0x88, 0x58, 0x5e, 0x58, 0xf8, 0x65, 0x66, 0xfd, 0x19, 0x0d, 0x86, 0x8e, 0xca, 0x08, 0xaa, 0x1e, 0x66, 0x93, 0x2d, 0x6d, 0x3b, 0x14, 0xec, 0xad, 0x3e, 0xfd, 0x9f, 0x8c, 0xfc, 0xf2, 0x69, 0x6e, 0xd4, 0x2e, 0xad, 0xfa, 0x64, 0x23, 0x24, 0xd9, 0x41, 0x60, 0x2c, 0xba, 0xeb, 0xb8, 0x63, 0x9a, 0x00, 0xa1, 0x75, 0x42, 0xaf, 0xda, 0x32, 0x11, 0x70, 0x51, 0xe4, 0xfb, 0xf2, 0x43, 0xdf, 0xd2, 0x55, 0xa5, 0x59, 0xc4, 0x9a, 0xc3, 0x7c, 0x26, 0x58, 0x27, 0xba, 0x70, 0xb0, 0xbc, 0x61, 0x88, 0x82, 0x33, 0x6f, 0x43, 0xe1, 0xa6, 0xa7, 0x29, 0xc5, 0x7b, 0xe4, 0x78, 0x00, 0x8c, 0xae, 0x6c, 0x74, 0x84, 0x0b, 0xbe, 0x82, 0x8c, 0x97, 0x6a, 0xc6, 0x28, 0xd7, 0xb6, 0x01, 0x5b, 0xcb, 0x70, 0x56, 0x12, 0xc2, 0x77, 0xba, 0xc0, 0x72, 0x7d, 0xa6, 0x45, 0x48, 0x0a, 0x0e, 0x14, 0xfd, 0xc4, 0x97, 0x95, 0x6a, 0xef, 0x05, 0xc8, 0x9d, 0x30, 0xf2, 0x2c, 0x2c, 0x96, 0xc6, 0xdf, 0xc9, 0xda, 0xe3, 0x06, 0x17, 0xe6, 0x20, 0x6f, 0xbd, 0x95, 0x79, 0x75, 0xb8, 0xba, 0x05, 0x24, 0xf5, 0x63, 0x28, 0x9e, 0x1f, 0x5f, 0x09, 0xbd, 0xb6, 0xfd, 0x46, 0xfa, 0x61, 0x17, 0xe7, 0x8e, 0x85, 0x4f, 0x91, 0xd7, 0x16, 0x99, 0xfc, 0xfc, 0xad, 0xfa, 0xa7, 0xd4, 0xdb, 0x8f, 0xcb, 0x04, 0xbe, 0xd0, 0x8d, 0x68, 0xd1, 0x16, 0x77, 0xb5, 0x08, 0x5b, 0x29, 0x5c, 0x1d, 0x41, 0x4c, 0xb1, 0x24, 0x56, 0xc8, 0x4c, 0x66, 0x97, 0x37, 0xaf, 0x6c, 0x33, 0x99, 0x2a, 0x5a, 0x91, 0x49, 0xfc, 0x7f, 0x93, 0x30, 0xbb, 0x29, 0x1d, 0x38, 0xf6, 0xbe, 0xd1, 0x03, 0x18, 0x08, 0x1d, 0xde, 0x8f, 0xd1, 0x78, 0xf0, 0x2e, 0xb0, 0xe8, 0xb7, 0xd0, 0x22, 0xc8, 0xb6, 0x3f, 0xdc, 0xc8, 0x67, 0x54, 0x60, 0x35, 0x77, 0x5f, 0xcf, 0x7b, 0x32, 0xc8, 0xfe, 0xe8, 0x3d, 0xf7, 0xcb, 0xb2, 0x83, 0x72, 0xb2, 0x3c, 0x71, 0x45, 0x9b, 0x95, 0x66, 0xa7, 0xf6, 0x41, 0x65, 0xda, 0x0a, 0x3d, 0x0e, 0x53, 0x8a, 0x3d, 0xcc, 0x1b, 0x6a, 0x38, 0x4f, 0x75, 0xf0, 0x26, 0x3d, 0xc1, 0x0e, 0x09, 0x24, 0xa0, 0xef, 0x2a, 0xb4, 0x59, 0xd0, 0xa5, 0x2b, 0x7c, 0x11, 0x27, 0x10, 0xc5, 0x8c, 0xf7, 0x24, 0x42, 0x25, 0x33, 0x96, 0xb8, 0xa2, 0x5d, 0x76, 0x44, 0xbe, 0x16, 0x6c, 0x3e, 0x78, 0x28, 0xaa, 0x62, 0xb1, 0xca, 0x1f, 0x32, 0xf6, 0x20, 0xed, 0x96, 0x9b, 0x02, 0x1e, 0xc6, 0x09, 0xfe, 0x92, 0x69, 0x58, 0xa0, 0x3c, 0xff, 0x21, 0xf0, 0x8f, 0x7c, 0x8d, 0x3d, 0x32, 0x35, 0xb2, 0x19, 0xfb, 0x00, 0x20, 0xa5, 0x1b, 0x97, 0xb6, 0x0f, 0x96, 0x3e, 0xbb, 0x58, 0xf7, 0xa6, 0x2a, 0x5b, 0x41, 0x10, 0x4c, 0x0b, 0x28, 0xb5, 0x8c, 0xfc, 0x81, 0x66, 0x88, 0x25, 0xf8, 0x70, 0x64, 0xe4, 0x01, 0xc2, 0x63, 0x42, 0x11, 0x52, 0xb8, 0x79, 0x0d, 0xbc, 0x99, 0xb3, 0x03, 0x2c, 0x96, 0x15, 0x18, 0x7f, 0x29, 0xfc, 0xc1, 0xa5, 0x8e, 0x86, 0x36, 0x4a, 0xd4, 0x55, 0x24, 0xb5, 0x35, 0x8f, 0xa2, 0xf0, 0xa3, 0x29, 0x67, 0x29, 0xa3, 0x66, 0x3a, 0x58, 0x5e, 0x9a, 0xa9, 0x22, 0xf5, 0x34, 0xfe, 0xfd, 0x16, 0xfb, 0x6f, 0x96, 0xcd, 0x98, 0x95, 0x70, 0x9c, 0x55, 0x20, 0xcd, 0xcd, 0x24, 0xc8, 0xd1, 0x07, 0xe3, 0x87, 0xe5, 0x20, 0xde, 0x05, 0x5a, 0x32, 0x96, 0x54, 0x4e, 0xf1, 0xc1, 0xdd, 0xd4, 0x3b, 0x91, 0x9a, 0x4f, 0xf1, 0x39, 0x86, 0x1f, 0x06, 0xae, 0x52, 0x80, 0xd5, 0xaa, 0x5a, 0xae, 0xb8, 0xf7, 0xd7, 0x4e, 0xd6, 0xea, 0x56, 0x09, 0x3c, 0x2e, 0x69, 0x7a, 0x30, 0xc2, 0x9c, 0x4a, 0xc1, 0x45, 0xaa, 0x99, 0xa3, 0x72, 0xf1, 0xa0, 0x3a, 0xe7, 0x24, 0x95, 0xf5, 0x2a, 0x40, 0xcf, 0xdd, 0xed, 0xc1, 0x2b, 0x6e, 0x91, 0x15, 0xae, 0xa5, 0xea, 0x51, 0x6c, 0x5a, 0x42, 0x23, 0xa8, 0xd0, 0xa0, 0x07, 0x3c, 0x8b, 0x4a, 0xbe, 0x3c, 0x61, 0x88, 0xfd, 0xd6, 0xd4, 0xab, 0x62, 0x7c, 0x9f, 0x4e, 0xab, 0x46, 0x8f, 0xdc, 0x2a, 0x91, 0x94, 0x52, 0x74, 0xed, 0x18, 0x46, 0x5a, 0x36, 0x8f, 0x29, 0x1a, 0x00, 0x50, 0xc9, 0xd6, 0x38, 0xa3, 0x19, 0x44, 0x09, 0x1b, 0x35, 0xa8, 0xfd, 0x26, 0xa1, 0xff, 0x65, 0xe2, 0xd1, 0x7d, 0xfa, 0x32, 0xef, 0x3a, 0xc4, 0x12, 0xd8, 0x29, 0x3b, 0x27, 0x68, 0x49, 0xad, 0x9a, 0xf7, 0x1f, 0xdf, 0x27, 0x23, 0x63, 0xf7, 0x71, 0xd0, 0xfa, 0x99, 0x99, 0x6e, 0x24, 0x51, 0x0e, 0x7b, 0xf7, 0x31, 0xa7, 0x48, 0x0c, 0xbb, 0xef, 0xff, 0x78, 0x01, 0xc0, 0xe5, 0xfd, 0x0a, 0x13, 0xdd, 0x82, 0x78, 0x16, 0x2e, 0xc1, 0x68, 0x7f, 0x85, 0x40, 0x9a, 0x20, 0x3e, 0x82, 0xd2, 0xbc, 0xdf, 0x7e, 0x7d, 0x1a, 0xe5, 0x50, 0x98, 0x57, 0xc4, 0x2f, 0xce, 0x80, 0x29, 0x9f, 0xe0, 0x61, 0x82, 0xe7, 0x4a, 0x97, 0xc0, 0xc6, 0x24, 0xed, 0x5b, 0x62, 0x46, 0xe5, 0x97, 0x81, 0xaf, 0x94, 0x07, 0xfb, 0x28, 0xb3, 0x4f, 0x70, 0x24, 0xf4, 0x2d, 0x36, 0xeb, 0x92, 0xbb, 0x95, 0xf7, 0x2c, 0xee, 0x37, 0x9e, 0xd3, 0x63, 0xda, 0xf2, 0x62, 0x5b, 0x48, 0xe6, 0x0d, 0x04, 0x89, 0xb2, 0x3d, 0xfa, 0x57, 0x78, 0x9c, 0x0d, 0xd2, 0x27, 0x6b, 0x45, 0x75, 0xa0, 0x1c, 0x23, 0x49, 0x17, 0x1d, 0x2a, 0x58, 0xbc, 0xf2, 0x9e, 0x65, 0x9b, 0x86, 0x8c, 0xda, 0xc1, 0xc3, 0x0a, 0x02, 0xa1, 0x60, 0xc0, 0x78, 0xb6, 0xfa, 0xa7, 0xe0, 0x69, 0x67, 0x11, 0xd4, 0x34, 0x47, 0xea, 0x21, 0x08, 0xdb, 0x3d, 0x34, 0xec, 0x1b, 0xf9, 0xcf, 0xe8, 0x02, 0xf6, 0x01, 0x21, 0x2d, 0x33, 0x54, 0x45, 0xa4, 0x62, 0x48, 0x29, 0xf8, 0xa6, 0x00, 0xb1, 0x8e, 0x9b, 0x3c, 0xf1, 0x3a, 0x97, 0x87, 0x91, 0x0f, 0x2f, 0xb2, 0x76, 0x76, 0xfd, 0x80, 0x9e, 0x7e, 0xa1, 0xa3, 0x4c, 0x73, 0x06, 0xe7, 0x66, 0xb2, 0xe7, 0xae, 0x1b, 0xbb, 0x91, 0x9c, 0xc8, 0x88, 0xea, 0x93, 0x1d, 0x1e, 0xb2, 0xe2, 0x7c, 0x61, 0x09, 0xb9, 0xa1, 0x2c, 0x31, 0xe1, 0x88, 0xa1, 0x96, 0xa9, 0x8b, 0xbe, 0x0b, 0x24, 0xcc, 0x31, 0x57, 0x91, 0xd2, 0x6e, 0xf0, 0x1b, 0x77, 0xfe, 0x06, 0xc3, 0x01, 0x1a, 0xc3, 0x9a, 0x8f, 0x78, 0xd2, 0x33, 0xb7, 0x65, 0x1e, 0x58, 0x6d, 0x14, 0xdc, 0xfc, 0x26, 0x36, 0xcb, 0x71, 0x3e, 0xca, 0xba, 0xdb, 0x97, 0x37, 0x4c, 0xe5, 0x84, 0x98, 0xf8, 0xb2, 0xe5, 0x57, 0x53, 0x17, 0x93, 0xfd, 0x92, 0x07, 0xfe, 0x48, 0x4a, 0x4e, 0x14, 0x7f, 0x7b, 0x82, 0x65, 0x02, 0xcd, 0x37, 0x85, 0x25, 0x19, 0x73, 0xb2, 0x3e, 0x2b, 0x62, 0xb7, 0xfd, 0xc7, 0x4a, 0x10, 0xfc, 0xe9, 0xc0, 0x4f, 0x97, 0x51, 0x1d, 0xbf, 0xfe, 0x3f, 0x2c, 0x46, 0x88, 0x7c, 0x25, 0x90, 0x4b, 0x99, 0xdf, 0x69, 0xe9, 0x7b, 0x41, 0x6b, 0xac, 0x18, 0xfa, 0xda, 0xd6, 0x7b, 0x71, 0xcc, 0x32, 0x0e, 0xff, 0x8d, 0xef, 0x18, 0x5d, 0x41, 0xae, 0x85, 0x58, 0xcb, 0xda, 0xe6, 0xcc, 0xee, 0x38, 0xb8, 0xcf, 0xb2, 0xbf, 0xe9, 0x2d, 0x0a, 0xa9, 0x98, 0x15, 0xb3, 0xca, 0x1d, 0x11, 0x5f, 0x21, 0x49, 0x3b, 0x13, 0xad, 0xee, 0xaf, 0xce, 0x81, 0xa2, 0x3c, 0x6b, 0x1b, 0xc1, 0x5f, 0xc8, 0xf2, 0xb1, 0x71, 0x28, 0x4e, 0x6a, 0x1f, 0xd6, 0x5c, 0x35, 0x1b, 0x0c, 0x82, 0xb3, 0x11, 0x12, 0xf0, 0x22, 0xdd, 0xaa, 0x78, 0xdc, 0xfb, 0xac, 0x9f, 0x20, 0x3e, 0xee, 0xf4, 0x15, 0xc5, 0x66, 0xa0, 0x0c, 0x2c, 0x93, 0x3f, 0x06, 0xff, 0x18, 0xee, 0x76, 0x74, 0xab, 0xa5, 0x48, 0x59, 0x2d, 0xc8, 0x21, 0x4b, 0x1a, 0xf8, 0xe9, 0x29, 0x24, 0x2f, 0x87, 0xc8, 0x1b, 0x0c, 0xeb, 0xe8, 0x10, 0x6b, 0x52, 0x67, 0xba, 0x39, 0xc5, 0xb5, 0x19, 0x87, 0xe3, 0x88, 0x58, 0xdc, 0xe1, 0xd1, 0xf8, 0xd0, 0xcf, 0xee, 0x2b, 0xd6, 0x1d, 0x21, 0x7e, 0x5a, 0x5d, 0x41, 0xbb, 0x0c, 0x4a, 0xaf, 0x0e, 0x7b, 0x0a, 0x8c, 0x66, 0xe5, 0xb0, 0x29, 0x1e, 0x4d, 0x05, 0xbf, 0xdd, 0xcf, 0x88, 0x61, 0xbb, 0x31, 0xb3, 0x2e, 0xa5, 0xba, 0x80, 0xcb, 0x02, 0x47, 0x2c, 0x11, 0x96, 0x9b, 0x3b, 0x02, 0xa7, 0xf7, 0xbc, 0x02, 0x5f, 0xea, 0xce, 0x44, 0x72, 0x6b, 0x63, 0x82, 0x01, 0x25, 0x44, 0xf1, 0xbd, 0x12, 0x56, 0x74, 0x4f, 0x4b, 0x1b, 0x0f, 0xf8, 0x1f, 0x7b, 0x9f, 0x74, 0x62, 0xc5, 0xc9, 0x25, 0x07, 0xf1, 0x31, 0x6d, 0xf2, 0x28, 0xec, 0x5c, 0x07, 0x86, 0x37, 0x8b, 0x87, 0x1e, 0x69, 0x47, 0x9c, 0x3e, 0x26, 0xf2, 0x32, 0xf5, 0xd6, 0xa7, 0x09, 0xd3, 0x55, 0x1d, 0x08, 0xf0, 0xec, 0xce, 0xd5, 0x2f, 0x81, 0x58, 0xa2, 0xc4, 0x0a, 0x23, 0x4a, 0xf4, 0x48, 0x44, 0x9c, 0x1c, 0xb1, 0xa1, 0xf6, 0xf5, 0xae, 0x56, 0x17, 0x16, 0x06, 0x58, 0x2e, 0xbb, 0x9a, 0x58, 0x36, 0xc4, 0x54, 0xeb, 0x86, 0x01, 0x5a, 0xe7, 0xa4, 0xac, 0x87, 0x10, 0x5b, 0x37, 0x1b, 0xf4, 0x0d, 0x49, 0xb1, 0x13, 0x4a, 0x03, 0x72, 0x43, 0xa0, 0x87, 0x89, 0x53, 0xb5, 0xbb, 0xd6, 0xef, 0x94, 0x4a, 0xe7, 0xc3, 0x45, 0xec, 0x24, 0xe4, 0xa0, 0xe8, 0x49, 0x6b, 0x62, 0xd7, 0x1a, 0x63, 0x81, 0xaa, 0x52, 0xe5, 0xbd, 0xee, 0xdc, 0x81, 0x78, 0x4f, 0x45, 0xe0, 0xc7, 0x5b, 0x72, 0xa8, 0xc9, 0x89, 0x8e, 0xa0, 0x38, 0x7a, 0x47, 0x15, 0x3d, 0x7e, 0x3a, 0x7c, 0x89, 0x5a, 0xab, 0x58, 0xa1, 0x49, 0x7a, 0x5e, 0x79, 0x40, 0x52, 0xd7, 0x45, 0x76, 0x24, 0x47, 0x8c, 0x24, 0xd4, 0x4c, 0x7e, 0x89, 0x32, 0xc8, 0x87, 0x32, 0x2b, 0x42, 0x24, 0x78, 0x41, 0x8a, 0xf6, 0x4a, 0x38, 0x9c, 0x15, 0x2d, 0x12, 0xc7, 0xa6, 0x80, 0x3e, 0x0f, 0xb0, 0x05, 0x0d, 0xcf, 0x2b, 0x9d, 0x65, 0xa3, 0x5a, 0x53, 0xb9, 0x84, 0x5b, 0x9c, 0x38, 0x35, 0xfd, 0xdd, 0x45, 0xdf, 0xd1, 0x2e, 0x28, 0xf8, 0x84, 0x5e, 0x03, 0x68, 0x6b, 0x37, 0x07, 0xef, 0x60, 0x03, 0xe7, 0xc1, 0xcd, 0x4f, 0x8d, 0x74, 0x06, 0xee, 0x0d, 0x1c, 0xdc, 0x41, 0xd7, 0xb5, 0x6f, 0xb6, 0x30, 0xc1, 0x43, 0x8f, 0xe3, 0x31, 0x96, 0xe5, 0x33, 0x89, 0xf1, 0xec, 0x15, 0x40, 0xfe, 0x78, 0x9c, 0x65, 0x99, 0xc0, 0xb5, 0x89, 0x29, 0x62, 0x14, 0xd8, 0x31, 0xa8, 0x6e, 0x89, 0x22, 0x0a, 0xe9, 0x79, 0x74, 0xf4, 0xd1, 0x12, 0xf4, 0xc9, 0x8c, 0x72, 0x60, 0x27, 0xd0, 0xc9, 0x31, 0x6d, 0x13, 0x03, 0xb8, 0x7a, 0x43, 0xa8, 0x6c, 0xb8, 0xb8, 0x00, 0x83, 0x5a, 0x67, 0x7a, 0xbf, 0xe1, 0x58, 0x4e, 0x8b, 0xe5, 0x5a, 0x62, 0x46, 0x12, 0xf5, 0x6b, 0xdf, 0x71, 0xa0, 0x54, 0xa2, 0xe8, 0x34, 0xe3, 0x51, 0x05, 0xa1, 0x9a, 0x77, 0xf7, 0xdf, 0xdb, 0xf9, 0xdd, 0x28, 0x50, 0xee, 0x44, 0x65, 0x8a, 0xb0, 0xea, 0xe6, 0xe8, 0x33, 0xc8, 0x55, 0xbb, 0x96, 0x50, 0xed, 0xa7, 0xf8, 0xf4, 0xe7, 0x4d, 0x8d, 0xe7, 0x35, 0x26, 0xf1, 0x27, 0x73, 0xb2, 0xbc, 0xbb, 0x1b, 0xd3, 0x56, 0x39, 0xf8, 0x73, 0x0d, 0x8c, 0xdd, 0x6d, 0x64, 0xf4, 0x96, 0xab, 0xae, 0x4e, 0x1f, 0x8c, 0xdc, 0x96, 0x14, 0x88, 0x94, 0xaa, 0x69, 0x16, 0x83, 0x51, 0x5b, 0xcd, 0xf3, 0x7b, 0xa6, 0xca, 0xa0, 0xcb, 0xf9, 0x53, 0xc7, 0x52, 0xa7, 0xb9, 0x81, 0x9e, 0x9f, 0x83, 0x4f, 0xf3, 0x9e, 0xc8, 0xf6, 0xd8, 0xa3, 0xdd, 0x8d, 0xd5, 0xa4, 0x31, 0xd4, 0x7c, 0x7f, 0x74, 0xc7, 0xa6, 0x33, 0xff, 0x73, 0xff, 0x50, 0x70, 0x09, 0xc5, 0xac, 0x94, 0x31, 0xcc, 0x58, 0x8b, 0xa0, 0xc6, 0xd2, 0x26, 0xed, 0xc1, 0x7c, 0x94, 0xa0, 0xf1, 0x4d, 0x3e, 0x8d, 0xb0, 0xc7, 0xef, 0x60, 0xc3, 0x29, 0x38, 0x78, 0xdf, 0xe5, 0x13, 0xf9, 0x6b, 0x54, 0xc6, 0x1c, 0x88, 0xa9, 0x0a, 0xca, 0x4f, 0x24, 0x6d, 0x6a, 0x59, 0x88, 0xf5, 0xf7, 0x85, 0xce, 0x06, 0x55, 0xf5, 0x1b, 0x85, 0xe5, 0x5a, 0xf0, 0x3e, 0x57, 0x72, 0xa0, 0x83, 0xbf, 0xcf, 0x08, 0x16, 0xeb, 0xd9, 0x7a, 0x4a, 0xf4, 0x16, 0xfa, 0x64, 0x14, 0xa9, 0xad, 0x47, 0xb7, 0x19, 0x8e, 0x51, 0xd5, 0x54, 0x63, 0x80, 0x7e, 0xf4, 0xf0, 0xd9, 0xb7, 0xc0, 0x6a, 0x0a, 0x84, 0x76, 0x2e, 0x4e, 0x46, 0xc8, 0xb3, 0x91, 0x47, 0xa4, 0xbd, 0xd5, 0x94, 0xb8, 0xd4, 0xd4, 0x0b, 0x36, 0xf5, 0xe6, 0xb4, 0xd4, 0x87, 0x26, 0x55, 0x18, 0x90, 0xd0, 0x40, 0xd2, 0x29, 0xee, 0x70, 0xea, 0x30, 0x34, 0xd4, 0x5b, 0x3c, 0x28, 0xeb, 0x80, 0xd6, 0x86, 0x91, 0x8f, 0xe6, 0xe2, 0x19, 0x63, 0x6b, 0x8f, 0x9b, 0x7e, 0x6f, 0xc0, 0x8f, 0x4e, 0x3b, 0xed, 0x9b, 0xaf, 0xc7, 0x78, 0xaa, 0xb2, 0x74, 0x91, 0x3e, 0x9c, 0xfd, 0x57, 0x07, 0x32, 0xab, 0x3f, 0xb4, 0x34, 0xc9, 0xba, 0x09, 0x28, 0x58, 0x12, 0x32, 0x58, 0x04, 0x95, 0x57, 0x1e, 0x56, 0xf6, 0x70, 0x5f, 0x2a, 0xf0, 0x5b, 0x56, 0x64, 0x2c, 0x2b, 0x93, 0xdf, 0x65, 0xc4, 0x43, 0xa6, 0xca, 0xa5, 0xb1, 0x67, 0xa4, 0x04, 0x0d, 0x24, 0x38, 0x20, 0x6d, 0x2c, 0xef, 0xd3, 0x11, 0x4a, 0xb4, 0x66, 0xeb, 0x3c, 0x9e, 0xaa, 0x5e, 0x66, 0xcf, 0x44, 0x47, 0xc8, 0x9c, 0x49, 0x3a, 0x2e, 0xee, 0x0b, 0x0e, 0xa6, 0xe7, 0x32, 0x9b, 0x37, 0xc9, 0x0e, 0xc2, 0xd0, 0x14, 0x2b, 0xae, 0x7f, 0xef, 0x26, 0x5a, 0xe3, 0xc9, 0xc0, 0x53, 0xe4, 0x40, 0x31, 0xc0, 0xa1, 0x42, 0xbf, 0x9f, 0xaa, 0x72, 0x8e, 0x51, 0x70, 0xcd, 0xba, 0x59, 0xfa, 0x8d, 0xa3, 0x61, 0xd9, 0x4d, 0x88, 0x7d, 0x5d, 0x6f, 0x58, 0xb4, 0x09, 0xbb, 0xc4, 0xbd, 0x45, 0x48, 0x99, 0x06, 0x53, 0xa0, 0x4d, 0xfb, 0x84, 0x1f, 0xd7, 0x84, 0xac, 0x9c, 0xc4, 0xcf, 0xd3, 0x4c, 0x88, 0x51, 0x2d, 0xe2, 0x12, 0x07, 0x4d, 0xfb, 0xa3, 0x02, 0x95, 0xba, 0xdf, 0x22, 0xf1, 0xaf, 0x25, 0x22, 0xc5, 0xfe, 0x1c, 0xd4, 0x23, 0xbd, 0x8e, 0xae, 0x42, 0x9d, 0x7a, 0x86, 0x2b, 0xcd, 0x64, 0x9a, 0xb6, 0x1b, 0xf0, 0xd3, 0xb5, 0x5d, 0xaf, 0x4b, 0x6f, 0x0f, 0x39, 0x0c, 0x50, 0x3d, 0x7c, 0x1b, 0xde, 0xa4, 0x53, 0xb5, 0xef, 0x14, 0x5b, 0xd8, 0x19, 0x18, 0x02, 0x05, 0x6b, 0xd9, 0xe0, 0x45, 0x5a, 0x40, 0x4b, 0x6a, 0xfe, 0x5b, 0x25, 0x97, 0x7f, 0x02, 0xf9, 0x02, 0xca, 0xba, 0x46, 0xf9, 0x88, 0xd9, 0x1b, 0x23, 0x50, 0xeb, 0xe4, 0x09, 0x1b, 0x55, 0x84, 0xd4, 0xf9, 0x38, 0xa4, 0x58, 0x03, 0x98, 0x4a, 0x52, 0x91, 0xbe, 0xad, 0xee, 0xad, 0xda, 0x48, 0x8d, 0xc7, 0xed, 0x2d, 0xc4, 0xaa, 0xe6, 0x9c, 0xa8, 0xae, 0x0b, 0xd4, 0x49, 0x2f, 0x9b, 0x29, 0x7c, 0x3f, 0xb2, 0x57, 0xde, 0x98, 0x6c, 0x16, 0x15, 0xd4, 0x4d, 0xee, 0x59, 0xe1, 0xe1, 0x4d, 0x34, 0xaf, 0x9f, 0xd7, 0x85, 0x2b, 0x13, 0xfd, 0xcb, 0x71, 0x3d, 0xd1, 0xa0, 0x3d, 0x34, 0x18, 0x84, 0xa3, 0x0e, 0xa1, 0xdc, 0x01, 0x04, 0xd6, 0x3a, 0x31, 0xd2, 0x91, 0xdf, 0x03, 0x5d, 0x31, 0x7f, 0xea, 0x98, 0xec, 0x44, 0xf5, 0xa8, 0x67, 0x15, 0x01, 0x47, 0x83, 0x17, 0x2e, 0x66, 0x7a, 0x74, 0x8f, 0x16, 0x2c, 0x5c, 0x26, 0xa8, 0xb3, 0x4a, 0x0f, 0x13, 0x3d, 0x89, 0xfb, 0x97, 0x1b, 0xf6, 0xe0, 0xa0, 0x15, 0x07, 0xef, 0xed, 0x01, 0x0c, 0xc7, 0xf1, 0x94, 0xb5, 0xe8, 0x7a, 0x77, 0xd5, 0x6a, 0x90, 0x9d, 0x65, 0xef, 0xa0, 0xd5, 0xcc, 0xd6, 0xda, 0x9b, 0x5e, 0xb1, 0xd7, 0x34, 0x22, 0xf9, 0x7f, 0xfa, 0xd8, 0x01, 0x2a, 0xf4, 0x3a, 0x29, 0x05, 0xa9, 0x83, 0x54, 0xb8, 0x36, 0x2e, 0x9c, 0x45, 0x9f, 0x00, 0x44, 0x33, 0x63, 0x48, 0xed, 0xed, 0x53, 0x66, 0x0d, 0x65, 0xa3, 0x8a, 0x9e, 0xfc, 0x42, 0xbe, 0x13, 0xa6, 0x67, 0x27, 0x90, 0x49, 0x6d, 0x87, 0x5a, 0x67, 0xe0, 0x07, 0x8d, 0xfd, 0xd8, 0x34, 0x0d, 0xab, 0x85, 0x47, 0xbe, 0x14, 0x0c, 0xa9, 0xf8, 0x88, 0x91, 0xb6, 0x35, 0xe1, 0x95, 0xc2, 0x0d, 0xaa, 0x83, 0x59, 0x65, 0x87, 0x85, 0xcb, 0xe3, 0xd0, 0x9c, 0xe8, 0xa5, 0x80, 0xf0, 0x09, 0x32, 0x4e, 0x65, 0x50, 0xb0, 0x19, 0x6e, 0x30, 0x58, 0x89, 0x26, 0x2f, 0x28, 0xf4, 0x9d, 0xea, 0xd7, 0x7e, 0x6f, 0x5a, 0x0e, 0x85, 0x9c, 0x57, 0xd5, 0x3c, 0x93, 0x5a, 0x4c, 0x95, 0x90, 0x87, 0x9b, 0x65, 0x28, 0xeb, 0x2b, 0xc3, 0x23, 0x02, 0x17, 0xb0, 0x89, 0x7c, 0xdd, 0xfe, 0xff, 0x40, 0x5a, 0x6a, 0x54, 0xb2, 0xf5, 0x0c, 0x58, 0x31, 0x1a, 0xf1, 0xed, 0xe4, 0xea, 0x06, 0x60, 0xb7, 0x30, 0x37, 0xf9, 0xa0, 0x97, 0xd9, 0xd0, 0x27, 0x1b, 0x45, 0xe3, 0x25, 0xbe, 0xc6, 0x66, 0xcc, 0x7c, 0xb6, 0x5a, 0xe7, 0x80, 0xe3, 0x61, 0x63, 0x98, 0x38, 0xd1, 0x0f, 0xe7, 0x99, 0x07, 0xa0, 0xda, 0x0e, 0xfe, 0xf8, 0x5d, 0x24, 0x20, 0xa8, 0x4e, 0x90, 0x5b, 0xb3, 0x31, 0x16, 0x78, 0x95, 0x26, 0xa9, 0xa8, 0x83, 0x19, 0xd4, 0x60, 0xf5, 0x39, 0x58, 0x67, 0x62, 0xab, 0x17, 0x2e, 0x4a, 0x7f, 0x30, 0x5f, 0x7a, 0xe3, 0x6c, 0xb8, 0x8c, 0x96, 0xd9, 0x1a, 0xad, 0xa0, 0xb4, 0xdd, 0xa3, 0x41, 0x8c, 0x67, 0x0e, 0x27, 0xa5, 0xfd, 0xed, 0xe3, 0x9b, 0xd8, 0x65, 0x9e, 0x47, 0x7c, 0xbe, 0x08, 0xe6, 0x45, 0xaf, 0x92, 0x78, 0x43, 0xdb, 0xdd, 0x67, 0x48, 0x9b, 0x72, 0x69, 0x3e, 0xfe, 0xb3, 0xa7, 0xbe, 0x0e, 0x12, 0x1f, 0xdf, 0x55, 0x80, 0x47, 0x4c, 0xa0, 0x28, 0xf3, 0x9a, 0x03, 0x5e, 0x78, 0xd8, 0x1d, 0xd2, 0x12, 0x67, 0x9d, 0x0a, 0x83, 0x0c, 0x05, 0x0f, 0xfd, 0x43, 0xaf, 0x66, 0x42, 0xd6, 0x0d, 0x41, 0x0a, 0xaf, 0x34, 0xf7, 0xa5, 0xea, 0x9c, 0xb2, 0xe1, 0x2f, 0x21, 0x67, 0x2e, 0x3f, 0x4e, 0x0c, 0x00, 0xcc, 0xdb, 0x05, 0x75, 0x8e, 0x74, 0xdf, 0x38, 0x93, 0xbd, 0x40, 0xa5, 0xd7, 0x92, 0x1e, 0x2e, 0x14, 0x93, 0x30, 0xfd, 0xdb, 0xe0, 0xa2, 0xda, 0xe4, 0x21, 0x0d, 0x50, 0xa3, 0xca, 0xa6, 0x0b, 0x1b, 0x9d, 0xb6, 0x85, 0xf7, 0x70, 0x4a, 0xe2, 0xd7, 0x30, 0x2b, 0x18, 0xe8, 0x26, 0x10, 0x52, 0xb7, 0x79, 0x13, 0x97, 0x47, 0xf4, 0x62, 0xa6, 0x61, 0x0a, 0x37, 0x25, 0x2b, 0x17, 0x0a, 0xfb, 0xfc, 0xe9, 0x05, 0xfb, 0x6f, 0x7f, 0xb8, 0xc2, 0xb6, 0x10, 0x0e, 0xe2, 0x31, 0x50, 0x7f, 0x40, 0x3f, 0xee, 0x88, 0xba, 0x55, 0x61, 0x58, 0x0d, 0x4d, 0xe4, 0xcd, 0xf6, 0x00, 0xbf, 0x9e, 0x98, 0x16, 0xc9, 0xda, 0x1e, 0x1d, 0x2b, 0x91, 0xa1, 0xd9, 0x66, 0xd0, 0x4c, 0xdb, 0x98, 0xd3, 0xbe, 0x55, 0xfb, 0x77, 0xaf, 0x2d, 0xae, 0xee, 0xd7, 0x50, 0xb8, 0xb6, 0x0b, 0x49, 0x4a, 0xcc, 0xaa, 0x12, 0x44, 0x1d, 0x37, 0x2a, 0xfb, 0x3d, 0x47, 0xe7, 0x39, 0x5b, 0x9e, 0x0e, 0x86, 0x75, 0x95, 0xa1, 0xa6, 0xc8, 0xbf, 0xf8, 0x63, 0x8b, 0xcb, 0x13, 0x8d, 0xdc, 0xac, 0x2f, 0x3e, 0xfb, 0xf8, 0x97, 0x62, 0xb6, 0x8e, 0xbd, 0x77, 0x24, 0x7c, 0x89, 0x92, 0x96, 0x20, 0xf1, 0xa3, 0xcb, 0x8d, 0xca, 0xf9, 0x63, 0x2f, 0xde, 0x09, 0x96, 0xb3, 0x3e, 0x6b, 0x26, 0x21, 0xda, 0x25, 0x92, 0x4b, 0x4e, 0x2c, 0x8d, 0x6b, 0xff, 0x28, 0xae, 0x08, 0x67, 0x78, 0x69, 0x19, 0xad, 0x76, 0x3e, 0x6d, 0x79, 0xfc, 0x30, 0x4a, 0x06, 0x27, 0x79, 0x55, 0x79, 0x5a, 0x7c, 0xb1, 0x71, 0x86, 0xfb, 0x6b, 0xdf, 0xa9, 0x8a, 0x16, 0x18, 0x95, 0x44, 0xb2, 0x28, 0xf3, 0xbc, 0xd3, 0x69, 0x87, 0x37, 0xff, 0x55, 0xb6, 0x18, 0x57, 0x99, 0x45, 0x9b, 0x79, 0x6a, 0x63, 0xc6, 0xa6, 0x1c, 0xea, 0x9d, 0x20, 0xf1, 0xe2, 0x96, 0xd6, 0x2f, 0x47, 0x4c, 0x43, 0x75, 0x0b, 0x77, 0x94, 0x4e, 0x5f, 0x1c, 0x09, 0x07, 0x2f, 0x01, 0x9d, 0xbe, 0xeb, 0x64, 0xe9, 0xbc, 0x8d, 0xec, 0x46, 0x05, 0xd8, 0xe0, 0x32, 0x2c, 0xdd, 0x97, 0xf5, 0x6c, 0xc4, 0x30, 0x84, 0xf5, 0xc9, 0x83, 0xa5, 0x84, 0x85, 0x56, 0x54, 0x36, 0x6f, 0xd5, 0x65, 0x9e, 0xa2, 0x3c, 0x6c, 0x15, 0xe1, 0xd7, 0xda, 0x51, 0xd8, 0x2c, 0x68, 0x3a, 0xa4, 0x77, 0xb9, 0xf8, 0x96, 0x56, 0x3a, 0x51, 0x34, 0xc6, 0x4e, 0x32, 0x81, 0x4e, 0xa8, 0x8b, 0x7f, 0x7a, 0xf7, 0x60, 0xf1, 0x8b, 0xc9, 0x1e, 0x65, 0x6d, 0xa9, 0x2b, 0x72, 0xe9, 0x8b, 0xc0, 0x3f, 0x1c, 0x6b, 0xfb, 0x44, 0x28, 0x30, 0x30, 0x55, 0x29, 0xd6, 0x81, 0xdc, 0x6b, 0xcc, 0xae, 0x66, 0xda, 0x9b, 0x2e, 0x61, 0xb9, 0xc9, 0x7e, 0x23, 0x97, 0xfd, 0xb9, 0x2f, 0x7f, 0x63, 0x69, 0xb4, 0x70, 0x52, 0x9c, 0x57, 0x0c, 0x2d, 0x3b, 0x32, 0x94, 0x87, 0x98, 0x1d, 0x14, 0x8a, 0x46, 0x2c, 0xdb, 0x99, 0x2d, 0x79, 0x2e, 0x34, 0xdd, 0x23, 0x3e, 0x1c, 0x23, 0x96, 0x57, 0xb8, 0xda, 0x0d, 0x59, 0xb8, 0x04, 0x56, 0x6c, 0xf8, 0x1a, 0xd5, 0xf0, 0xa7, 0xa0, 0xcc, 0xb3, 0xa8, 0xfb, 0xda, 0x67, 0x38, 0x87, 0xc1, 0x53, 0xd2, 0xe5, 0x6c, 0x48, 0x4f, 0x92, 0x30, 0xd7, 0x52, 0xbe, 0x52, 0xc1, 0xe3, 0x5b, 0xc9, 0xaf, 0x5a, 0x74, 0x46, 0x23, 0x7f, 0xc0, 0x72, 0xaf, 0xef, 0x77, 0x76, 0x65, 0xc2, 0x64, 0xc1, 0x8e, 0x6a, 0x3c, 0x05, 0x9f, 0xde, 0x2e, 0x83, 0x68, 0xf9, 0xbb, 0x89, 0x8f, 0x1c, 0xc8, 0x39, 0x3d, 0x1b, 0xf1, 0x8b, 0x17, 0x57, 0x21, 0x96, 0x70, 0x27, 0x5f, 0x0b, 0xbc, 0x7d, 0xeb, 0x02, 0x48, 0xc6, 0x8a, 0xf9, 0x29, 0x11, 0x1e, 0x19, 0x73, 0x74, 0x79, 0xbc, 0xab, 0xab, 0x73, 0x2d, 0x7e, 0x03, 0x3a, 0xae, 0xb2, 0x77, 0xea, 0xc0, 0x5e, 0x18, 0x5e, 0x9e, 0x56, 0xb2, 0x45, 0x0b, 0xea, 0xac, 0x78, 0x4d, 0xd0, 0x30, 0x8b, 0x7a, 0x5e, 0x8c, 0xa1, 0xf2, 0xfc, 0xd8, 0x85, 0x2d, 0xda, 0xd9, 0xf7, 0xb7, 0xde, 0x26, 0x44, 0x78, 0xe1, 0x89, 0x1a, 0x39, 0x1a, 0xa8, 0x99, 0x64, 0xda, 0xe5, 0xad, 0x0b, 0x7a, 0x82, 0x9c, 0x2c, 0x92, 0x09, 0xdb, 0x34, 0x6c, 0xeb, 0x26, 0xc1, 0xb9, 0x67, 0xcf, 0xac, 0x82, 0xad, 0x57, 0x47, 0x61, 0x44, 0x3b, 0xe3, 0xf0, 0xa9, 0x10, 0x96, 0x82, 0x39, 0xd2, 0x3b, 0x11, 0x50, 0x7a, 0xb9, 0x78, 0xb3, 0xce, 0x89, 0xe2, 0x2b, 0x7d, 0x72, 0x83, 0x73, 0x6b, 0x97, 0x86, 0x54, 0x4a, 0xb4, 0x46, 0x0f ] ];
+
+const sha256_long_mds = const [
+    '3c593aa539fdcdae516cdf2f15000f6634185c88f505b39775fb9ab137a10aa2',
+    '46500b6ae1ab40bde097ef168b0f3199049b55545a1588792d39d594f493dca7',
+    '5f4e16a72d6c9857da0ba009ccacd4f26d7f6bf6c1b78a2ed35e68fcb15b8e40',
+    '044d823532092c22a4b48181cfb2c796e1f5b98bcd713a21f70b5afcceef1d73',
+    'db593a375cb27df689cd78b5154949e5bc30094a05d704c0295d547385176662',
+    '0599f88c429a3d4fcbb0206fa57e344121afdf8e56f78e3f5e61ba3bcf134ec6',
+    '6c83f9b69754facc3155da93261ed99c38e4225e748e8ebcd04ed62719fa56db',
+    'f574ac85532bc0c6c4e7614a2e084dbc49fbc474cda593144af28c5cc5f293f8',
+    '19636dfc80fef6d47c7ab8fa620909ccc387126cec56415c9a898f64be728515',
+    '3380c8dae5c0b68bb264b757e2451c21cbe2b899fe7a871ab1bae6041f48e7ad',
+    'c31bc10bed1384826cc30369b2d0b5880422e1a34d0eea0b67f29f40de17ba46',
+    'c3cd7be2de832774c614ccf60d030d75dfacf3cc7e49a37af349a4c3c196b106',
+    '888e223d5a497fc679c3ecfe98bf7dc531a4adf3ccf0e6d586c8912ebf781af1',
+    'e65812200409ad7e1684a2df8e15685dfab7079449c52d032870d80acceab3f6',
+    '2916d4595a3ede77f4165357977cf3529c672dcf4c39e76ec3aa848dba6ff4f6',
+    'df5f9f0898e0fa1bd9c3d3196fa8f7e6b01331d11eb214f7e5629bb7a1b7eb20',
+    '46d6071814544b8de5db52d4b4d22023ba2e630146ef4e47b9b280341985f189',
+    '0a147f33ab036e8ae148061028c6a557e2eeb1a6ea71b3760548734942743557',
+    '07ddd5dafcf04956cc36c1ff290f07c1c0e5832cc8dd9aea502da677ea04fe64',
+    '2ace8ba5195f54a7c501234431e99232dbb1d1365edbb593a3dd3b5810326570',
+    '4c7118050c64cb293f54c5cc199e99aa87c0a7aaeb7256af498e82d535b994c7',
+    '906c5b84ec1e480195860d89f859fc7d3c5f67f585ef8b738ffec08a3c07a98b',
+    '09247dc00c0060232407a4e69050b5112c9f72a65d7b0ff077f6be180c482cdb',
+    '7b2e8b28951a825924aed1b26e9c197ec080558a97120f34d6e22e341a90c978',
+    'a5e93544e86eb9960dcfcebb6bcc461d82f119cae1947e340c7cea1c7f351c0b',
+    'c525eef8b2ca56547565c947bb7e964e2ecae7c9c82c29228b6c932d2ace181c',
+    '31600a05842b12ea927796eafa30e6b1634a97f9bb41a2f75abbb2aa921c17c3',
+    '7ce7f53dc2287da4cf28c9fe64d5515e484c9cc57fd81ec76e66fa38b760565e',
+    'e026d0e1228ef882d093fe4dbb2ec5134dd122877ac2b380d399bff447fc9fa1',
+    'cd26132e2c223d19d3a75ae0664f7475b478695d7824dad856c19417ea0b3794',
+    '176b0c71e213031a29f56009aac7ebec591ba24a8b162d80506b2df8f59e11a2',
+    '36423179904261f57bf7405853a319058065857e67a510128baf09a68c30b987',
+    '54290349fbb1e8327a65b871f3fc2c6d3975775e48dd1d7b2c368142bcfc8c27',
+    '683712362407cefd2968ce6373cbd86c1a6170493c84025be740129120d327bc',
+    '76e3a0221b6d29a43a0c2929baaf46ab00b85571d59ef2b3f0facb315621f4ec',
+    'a7c4cff2f73c911d7e3f2f82b20adb9cf2caafc9254cf5997215a11046846d0e',
+    '977495dc59e74389b65ee1a7a33295014abdcf7916f9e0d1ca39a7cd395e6c41',
+    '6a5f09b3e0a8ae5d795f2dbed00ee521aed5b0875d2e487a82b2c687b527c278',
+    '5ba431851b1e2be373d818c3c6884e53d82273219c3f1c36c9aae099fa6690e1',
+    'd305c4ce0161386004c267eaa17180eb2433280716c894ed4094c2597a582da1',
+    'f98918c63e3a9238e78dbd5bebe4e47eaeec0ae1627387dcd2a5ae4725f7e47c',
+    'cf17b0770212e87516c080aad008d50cb5481044626a325be730d54a66f66662',
+    '10e88348b55c5c0683f4d4d3ef56c485be9888bf00806040de25204d25df4ea6',
+    'd46ef45eb47aa54032fc8ea47150d10334b208dc6b7ac5e09e8718231e87cd1c',
+    '982c20c2493fc9ae405b74b65a022662c014a38ef3d707217e56e57afac05994',
+    '8e28867538bc2c6c94d3428f05b1458f428d3f950430b09238209efe6bb267d9',
+    '022aa46f368252ce0a7b2431d55ac4767455865dfe65d2e372f4e82691a14cb2',
+    '5d1f1f7c14e34f79468bb5de195a60f3b422c4e48757facf1df01d1b022e6764',
+    '6025dc79681355ec9f3886a74b39dc4d1d2e6c77180080e9d296e5ca7742d04e',
+    'f52b3c537f28d89f0df1efee21c70f74df186f3928296d19582d5c51286e98bc',
+    '1ca0be9286023fb0b947f07cad056e59cff9d2d16c7cefdbedc33950a9312685',
+    'd8101ed4097b4bde7abbc16cd854e4c122460dbbabf08a9f56f4f2b882f59b00',
+    '9570f18459f97be85bfc8fca837e0891ef248ba6295119679280a136d60e57f2',
+    '8ff4c479d1230d8dc53493395e89ca712533b80e1b97cb5af448e0e78fab0f7a',
+    'c4558c7ec68df61d6bb65238397d49cc320a8c213f7bffdd4a397552d83ec20e',
+    '7ebc665ab5e5a1babbbae9e86bd00a09bfe68c4ca91b9f0da092c853c7732c3f',
+    'cecddb12b508e6cddcf3e96635abec8bc6031d588b21a4a4859cbdd79aaee47a',
+    '03deb53fbacc9e3701311efbff2ee0566c27355b6f30a22848a5b8618f6c0d63',
+    '0b6180f72608560023802ef42e0d80f862759a2a6b107667d7819e07bef00b08',
+    '71b950c0085388ddf90444c0918d72aa700319e789441fcd2da539c12a32ee19',
+    'd5ebd0d3d544e46023979d06b666f35758b69628d95abb808fa65f51f03b81bf',
+    '740e25c81e510d27735af90e3f8091596092c8136edb60f4df910f7204c289d5',
+    '90df9cc3a3b904415331eba9cd52750c2c5cb73cb91b42caca7eee3788fc2b30',
+    '33b6229592ca719e4e46f35b287617fedadd3b7c38be3c8c1c9f446d2d9085b3' ];
diff --git a/mojo/public/dart/third_party/crypto/test/sha256_short_test_vectors.dart b/mojo/public/dart/third_party/crypto/test/sha256_short_test_vectors.dart
new file mode 100644
index 0000000..3b48a63
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/test/sha256_short_test_vectors.dart
@@ -0,0 +1,144 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of sha256_test;
+
+// Standard test vectors from:
+//   http://csrc.nist.gov/groups/STM/cavp/documents/shs/shabytetestvectors.zip
+
+const sha256_short_inputs = const [
+const [ ],
+const [ 0xd3 ],
+const [ 0x11, 0xaf ],
+const [ 0xb4, 0x19, 0x0e ],
+const [ 0x74, 0xba, 0x25, 0x21 ],
+const [ 0xc2, 0x99, 0x20, 0x96, 0x82 ],
+const [ 0xe1, 0xdc, 0x72, 0x4d, 0x56, 0x21 ],
+const [ 0x06, 0xe0, 0x76, 0xf5, 0xa4, 0x42, 0xd5 ],
+const [ 0x57, 0x38, 0xc9, 0x29, 0xc4, 0xf4, 0xcc, 0xb6 ],
+const [ 0x33, 0x34, 0xc5, 0x80, 0x75, 0xd3, 0xf4, 0x13, 0x9e ],
+const [ 0x74, 0xcb, 0x93, 0x81, 0xd8, 0x9f, 0x5a, 0xa7, 0x33, 0x68 ],
+const [ 0x76, 0xed, 0x24, 0xa0, 0xf4, 0x0a, 0x41, 0x22, 0x1e, 0xbf, 0xcf ],
+const [ 0x9b, 0xaf, 0x69, 0xcb, 0xa3, 0x17, 0xf4, 0x22, 0xfe, 0x26, 0xa9, 0xa0 ],
+const [ 0x68, 0x51, 0x1c, 0xdb, 0x2d, 0xbb, 0xf3, 0x53, 0x0d, 0x7f, 0xb6, 0x1c, 0xbc ],
+const [ 0xaf, 0x39, 0x7a, 0x8b, 0x8d, 0xd7, 0x3a, 0xb7, 0x02, 0xce, 0x8e, 0x53, 0xaa, 0x9f ],
+const [ 0x29, 0x4a, 0xf4, 0x80, 0x2e, 0x5e, 0x92, 0x5e, 0xb1, 0xc6, 0xcc, 0x9c, 0x72, 0x4f, 0x09 ],
+const [ 0x0a, 0x27, 0x84, 0x7c, 0xdc, 0x98, 0xbd, 0x6f, 0x62, 0x22, 0x0b, 0x04, 0x6e, 0xdd, 0x76, 0x2b ],
+const [ 0x1b, 0x50, 0x3f, 0xb9, 0xa7, 0x3b, 0x16, 0xad, 0xa3, 0xfc, 0xf1, 0x04, 0x26, 0x23, 0xae, 0x76, 0x10 ],
+const [ 0x59, 0xeb, 0x45, 0xbb, 0xbe, 0xb0, 0x54, 0xb0, 0xb9, 0x73, 0x34, 0xd5, 0x35, 0x80, 0xce, 0x03, 0xf6, 0x99 ],
+const [ 0x58, 0xe5, 0xa3, 0x25, 0x9c, 0xb0, 0xb6, 0xd1, 0x2c, 0x83, 0xf7, 0x23, 0x37, 0x9e, 0x35, 0xfd, 0x29, 0x8b, 0x60 ],
+const [ 0xc1, 0xef, 0x39, 0xce, 0xe5, 0x8e, 0x78, 0xf6, 0xfc, 0xdc, 0x12, 0xe0, 0x58, 0xb7, 0xf9, 0x02, 0xac, 0xd1, 0xa9, 0x3b ],
+const [ 0x9c, 0xab, 0x7d, 0x7d, 0xca, 0xec, 0x98, 0xcb, 0x3a, 0xc6, 0xc6, 0x4d, 0xd5, 0xd4, 0x47, 0x0d, 0x0b, 0x10, 0x3a, 0x81, 0x0c ],
+const [ 0xea, 0x15, 0x7c, 0x02, 0xeb, 0xaf, 0x1b, 0x22, 0xde, 0x22, 0x1b, 0x53, 0xf2, 0x35, 0x39, 0x36, 0xd2, 0x35, 0x9d, 0x1e, 0x1c, 0x97 ],
+const [ 0xda, 0x99, 0x9b, 0xc1, 0xf9, 0xc7, 0xac, 0xff, 0x32, 0x82, 0x8a, 0x73, 0xe6, 0x72, 0xd0, 0xa4, 0x92, 0xf6, 0xee, 0x89, 0x5c, 0x68, 0x67 ],
+const [ 0x47, 0x99, 0x13, 0x01, 0x15, 0x6d, 0x1d, 0x97, 0x7c, 0x03, 0x38, 0xef, 0xbc, 0xad, 0x41, 0x00, 0x41, 0x33, 0xae, 0xfb, 0xca, 0x6b, 0xcf, 0x7e ],
+const [ 0x2e, 0x7e, 0xa8, 0x4d, 0xa4, 0xbc, 0x4d, 0x7c, 0xfb, 0x46, 0x3e, 0x3f, 0x2c, 0x86, 0x47, 0x05, 0x7a, 0xff, 0xf3, 0xfb, 0xec, 0xec, 0xa1, 0xd2, 0x00 ],
+const [ 0x47, 0xc7, 0x70, 0xeb, 0x45, 0x49, 0xb6, 0xef, 0xf6, 0x38, 0x1d, 0x62, 0xe9, 0xbe, 0xb4, 0x64, 0xcd, 0x98, 0xd3, 0x41, 0xcc, 0x1c, 0x09, 0x98, 0x1a, 0x7a ],
+const [ 0xac, 0x4c, 0x26, 0xd8, 0xb4, 0x3b, 0x85, 0x79, 0xd8, 0xf6, 0x1c, 0x98, 0x07, 0x02, 0x6e, 0x83, 0xe9, 0xb5, 0x86, 0xe1, 0x15, 0x9b, 0xd4, 0x3b, 0x85, 0x19, 0x37 ],
+const [ 0x07, 0x77, 0xfc, 0x1e, 0x1c, 0xa4, 0x73, 0x04, 0xc2, 0xe2, 0x65, 0x69, 0x28, 0x38, 0x10, 0x9e, 0x26, 0xaa, 0xb9, 0xe5, 0xc4, 0xae, 0x4e, 0x86, 0x00, 0xdf, 0x4b, 0x1f ],
+const [ 0x1a, 0x57, 0x25, 0x1c, 0x43, 0x1d, 0x4e, 0x6c, 0x2e, 0x06, 0xd6, 0x52, 0x46, 0xa2, 0x96, 0x91, 0x50, 0x71, 0xa5, 0x31, 0x42, 0x5e, 0xcf, 0x25, 0x59, 0x89, 0x42, 0x2a, 0x66 ],
+const [ 0x9b, 0x24, 0x5f, 0xda, 0xd9, 0xba, 0xeb, 0x89, 0x0d, 0x9c, 0x0d, 0x0e, 0xff, 0x81, 0x6e, 0xfb, 0x4c, 0xa1, 0x38, 0x61, 0x0b, 0xc7, 0xd7, 0x8c, 0xb1, 0xa8, 0x01, 0xed, 0x32, 0x73 ],
+const [ 0x95, 0xa7, 0x65, 0x80, 0x9c, 0xaf, 0x30, 0xad, 0xa9, 0x0a, 0xd6, 0xd6, 0x1c, 0x2b, 0x4b, 0x30, 0x25, 0x0d, 0xf0, 0xa7, 0xce, 0x23, 0xb7, 0x75, 0x3c, 0x91, 0x87, 0xf4, 0x31, 0x9c, 0xe2 ],
+const [ 0x09, 0xfc, 0x1a, 0xcc, 0xc2, 0x30, 0xa2, 0x05, 0xe4, 0xa2, 0x08, 0xe6, 0x4a, 0x8f, 0x20, 0x42, 0x91, 0xf5, 0x81, 0xa1, 0x27, 0x56, 0x39, 0x2d, 0xa4, 0xb8, 0xc0, 0xcf, 0x5e, 0xf0, 0x2b, 0x95 ],
+const [ 0x05, 0x46, 0xf7, 0xb8, 0x68, 0x2b, 0x5b, 0x95, 0xfd, 0x32, 0x38, 0x5f, 0xaf, 0x25, 0x85, 0x4c, 0xb3, 0xf7, 0xb4, 0x0c, 0xc8, 0xfa, 0x22, 0x9f, 0xbd, 0x52, 0xb1, 0x69, 0x34, 0xaa, 0xb3, 0x88, 0xa7 ],
+const [ 0xb1, 0x2d, 0xb4, 0xa1, 0x02, 0x55, 0x29, 0xb3, 0xb7, 0xb1, 0xe4, 0x5c, 0x6d, 0xbc, 0x7b, 0xaa, 0x88, 0x97, 0xa0, 0x57, 0x6e, 0x66, 0xf6, 0x4b, 0xf3, 0xf8, 0x23, 0x61, 0x13, 0xa6, 0x27, 0x6e, 0xe7, 0x7d ],
+const [ 0xe6, 0x8c, 0xb6, 0xd8, 0xc1, 0x86, 0x6c, 0x0a, 0x71, 0xe7, 0x31, 0x3f, 0x83, 0xdc, 0x11, 0xa5, 0x80, 0x9c, 0xf5, 0xcf, 0xbe, 0xed, 0x1a, 0x58, 0x7c, 0xe9, 0xc2, 0xc9, 0x2e, 0x02, 0x2a, 0xbc, 0x16, 0x44, 0xbb ],
+const [ 0x4e, 0x3d, 0x8a, 0xc3, 0x6d, 0x61, 0xd9, 0xe5, 0x14, 0x80, 0x83, 0x11, 0x55, 0xb2, 0x53, 0xb3, 0x79, 0x69, 0xfe, 0x7e, 0xf4, 0x9d, 0xb3, 0xb3, 0x99, 0x26, 0xf3, 0xa0, 0x0b, 0x69, 0xa3, 0x67, 0x74, 0x36, 0x60, 0x00 ],
+const [ 0x03, 0xb2, 0x64, 0xbe, 0x51, 0xe4, 0xb9, 0x41, 0x86, 0x4f, 0x9b, 0x70, 0xb4, 0xc9, 0x58, 0xf5, 0x35, 0x5a, 0xac, 0x29, 0x4b, 0x4b, 0x87, 0xcb, 0x03, 0x7f, 0x11, 0xf8, 0x5f, 0x07, 0xeb, 0x57, 0xb3, 0xf0, 0xb8, 0x95, 0x50 ],
+const [ 0xd0, 0xfe, 0xfd, 0x96, 0x78, 0x7c, 0x65, 0xff, 0xa7, 0xf9, 0x10, 0xd6, 0xd0, 0xad, 0xa6, 0x3d, 0x64, 0xd5, 0xc4, 0x67, 0x99, 0x60, 0xe7, 0xf0, 0x6a, 0xeb, 0x8c, 0x70, 0xdf, 0xef, 0x95, 0x4f, 0x8e, 0x39, 0xef, 0xdb, 0x62, 0x9b ],
+const [ 0xb7, 0xc7, 0x9d, 0x7e, 0x5f, 0x1e, 0xec, 0xcd, 0xfe, 0xdf, 0x0e, 0x7b, 0xf4, 0x3e, 0x73, 0x0d, 0x44, 0x7e, 0x60, 0x7d, 0x8d, 0x14, 0x89, 0x82, 0x3d, 0x09, 0xe1, 0x12, 0x01, 0xa0, 0xb1, 0x25, 0x80, 0x39, 0xe7, 0xbd, 0x48, 0x75, 0xb1 ],
+const [ 0x64, 0xcd, 0x36, 0x3e, 0xcc, 0xe0, 0x5f, 0xdf, 0xda, 0x24, 0x86, 0xd0, 0x11, 0xa3, 0xdb, 0x95, 0xb5, 0x20, 0x6a, 0x19, 0xd3, 0x05, 0x40, 0x46, 0x81, 0x9d, 0xd0, 0xd3, 0x67, 0x83, 0x95, 0x5d, 0x7e, 0x5b, 0xf8, 0xba, 0x18, 0xbf, 0x73, 0x8a ],
+const [ 0x6a, 0xc6, 0xc6, 0x3d, 0x61, 0x8e, 0xaf, 0x00, 0xd9, 0x1c, 0x5e, 0x28, 0x07, 0xe8, 0x3c, 0x09, 0x39, 0x12, 0xb8, 0xe2, 0x02, 0xf7, 0x8e, 0x13, 0x97, 0x03, 0x49, 0x8a, 0x79, 0xc6, 0x06, 0x7f, 0x54, 0x49, 0x7c, 0x61, 0x27, 0xa2, 0x39, 0x10, 0xa6 ],
+const [ 0xd2, 0x68, 0x26, 0xdb, 0x9b, 0xae, 0xaa, 0x89, 0x26, 0x91, 0xb6, 0x89, 0x00, 0xb9, 0x61, 0x63, 0x20, 0x8e, 0x80, 0x6a, 0x1d, 0xa0, 0x77, 0x42, 0x9e, 0x45, 0x4f, 0xa0, 0x11, 0x84, 0x09, 0x51, 0xa0, 0x31, 0x32, 0x7e, 0x60, 0x5a, 0xb8, 0x2e, 0xcc, 0xe2 ],
+const [ 0x3f, 0x7a, 0x05, 0x9b, 0x65, 0xd6, 0xcb, 0x02, 0x49, 0x20, 0x4a, 0xac, 0x10, 0xb9, 0xf1, 0xa4, 0xac, 0x9e, 0x58, 0x68, 0xad, 0xeb, 0xbe, 0x93, 0x5a, 0x9e, 0xb5, 0xb9, 0x01, 0x9e, 0x1c, 0x93, 0x8b, 0xfc, 0x4e, 0x5c, 0x53, 0x78, 0x99, 0x7a, 0x39, 0x47, 0xf2 ],
+const [ 0x60, 0xff, 0xcb, 0x23, 0xd6, 0xb8, 0x8e, 0x48, 0x5b, 0x92, 0x0a, 0xf8, 0x1d, 0x10, 0x83, 0xf6, 0x29, 0x1d, 0x06, 0xac, 0x8c, 0xa3, 0xa9, 0x65, 0xb8, 0x59, 0x14, 0xbc, 0x2a, 0xdd, 0x40, 0x54, 0x4a, 0x02, 0x7f, 0xca, 0x93, 0x6b, 0xbd, 0xe8, 0xf3, 0x59, 0x05, 0x1c ],
+const [ 0x9e, 0xcd, 0x07, 0xb6, 0x84, 0xbb, 0x9e, 0x0e, 0x66, 0x92, 0xe3, 0x20, 0xce, 0xc4, 0x51, 0x0c, 0xa7, 0x9f, 0xcd, 0xb3, 0xa2, 0x21, 0x2c, 0x26, 0xd9, 0x0d, 0xf6, 0x5d, 0xb3, 0x3e, 0x69, 0x2d, 0x07, 0x3c, 0xc1, 0x74, 0x84, 0x0d, 0xb7, 0x97, 0x50, 0x4e, 0x48, 0x2e, 0xef ],
+const [ 0x9d, 0x64, 0xde, 0x71, 0x61, 0x89, 0x58, 0x84, 0xe7, 0xfa, 0x3d, 0x6e, 0x9e, 0xb9, 0x96, 0xe7, 0xeb, 0xe5, 0x11, 0xb0, 0x1f, 0xe1, 0x9c, 0xd4, 0xa6, 0xb3, 0x32, 0x2e, 0x80, 0xaa, 0xf5, 0x2b, 0xf6, 0x44, 0x7e, 0xd1, 0x85, 0x4e, 0x71, 0x00, 0x1f, 0x4d, 0x54, 0xf8, 0x93, 0x1d ],
+const [ 0xc4, 0xad, 0x3c, 0x5e, 0x78, 0xd9, 0x17, 0xec, 0xb0, 0xcb, 0xbc, 0xd1, 0xc4, 0x81, 0xfc, 0x2a, 0xaf, 0x23, 0x2f, 0x7e, 0x28, 0x97, 0x79, 0xf4, 0x0e, 0x50, 0x4c, 0xc3, 0x09, 0x66, 0x2e, 0xe9, 0x6f, 0xec, 0xbd, 0x20, 0x64, 0x7e, 0xf0, 0x0e, 0x46, 0x19, 0x9f, 0xbc, 0x48, 0x2f, 0x46 ],
+const [ 0x4e, 0xef, 0x51, 0x07, 0x45, 0x9b, 0xdd, 0xf8, 0xf2, 0x4f, 0xc7, 0x65, 0x6f, 0xd4, 0x89, 0x6d, 0xa8, 0x71, 0x1d, 0xb5, 0x04, 0x00, 0xc0, 0x16, 0x48, 0x47, 0xf6, 0x92, 0xb8, 0x86, 0xce, 0x8d, 0x7f, 0x4d, 0x67, 0x39, 0x50, 0x90, 0xb3, 0x53, 0x4e, 0xfd, 0x7b, 0x0d, 0x29, 0x8d, 0xa3, 0x4b ],
+const [ 0x04, 0x7d, 0x27, 0x58, 0xe7, 0xc2, 0xc9, 0x62, 0x3f, 0x9b, 0xdb, 0x93, 0xb6, 0x59, 0x7c, 0x5e, 0x84, 0xa0, 0xcd, 0x34, 0xe6, 0x10, 0x01, 0x4b, 0xcb, 0x25, 0xb4, 0x9e, 0xd0, 0x5c, 0x7e, 0x35, 0x6e, 0x98, 0xc7, 0xa6, 0x72, 0xc3, 0xdd, 0xdc, 0xae, 0xb8, 0x43, 0x17, 0xef, 0x61, 0x4d, 0x34, 0x2f ],
+const [ 0x3d, 0x83, 0xdf, 0x37, 0x17, 0x2c, 0x81, 0xaf, 0xd0, 0xde, 0x11, 0x51, 0x39, 0xfb, 0xf4, 0x39, 0x0c, 0x22, 0xe0, 0x98, 0xc5, 0xaf, 0x4c, 0x5a, 0xb4, 0x85, 0x24, 0x06, 0x51, 0x0b, 0xc0, 0xe6, 0xcf, 0x74, 0x17, 0x69, 0xf4, 0x44, 0x30, 0xc5, 0x27, 0x0f, 0xda, 0xe0, 0xcb, 0x84, 0x9d, 0x71, 0xcb, 0xab ],
+const [ 0x33, 0xfd, 0x9b, 0xc1, 0x7e, 0x2b, 0x27, 0x1f, 0xa0, 0x4c, 0x6b, 0x93, 0xc0, 0xbd, 0xea, 0xe9, 0x86, 0x54, 0xa7, 0x68, 0x2d, 0x31, 0xd9, 0xb4, 0xda, 0xb7, 0xe6, 0xf3, 0x2c, 0xd5, 0x8f, 0x2f, 0x14, 0x8a, 0x68, 0xfb, 0xe7, 0xa8, 0x8c, 0x5a, 0xb1, 0xd8, 0x8e, 0xdc, 0xcd, 0xde, 0xb3, 0x0a, 0xb2, 0x1e, 0x5e ],
+const [ 0x77, 0xa8, 0x79, 0xcf, 0xa1, 0x1d, 0x7f, 0xca, 0xc7, 0xa8, 0x28, 0x2c, 0xc3, 0x8a, 0x43, 0xdc, 0xf3, 0x76, 0x43, 0xcc, 0x90, 0x98, 0x37, 0x21, 0x3b, 0xd6, 0xfd, 0x95, 0xd9, 0x56, 0xb2, 0x19, 0xa1, 0x40, 0x6c, 0xbe, 0x73, 0xc5, 0x2c, 0xd5, 0x6c, 0x60, 0x0e, 0x55, 0xb7, 0x5b, 0xc3, 0x7e, 0xa6, 0x96, 0x41, 0xbc ],
+const [ 0x45, 0xa3, 0xe6, 0xb8, 0x65, 0x27, 0xf2, 0x0b, 0x45, 0x37, 0xf5, 0xaf, 0x96, 0xcf, 0xc5, 0xad, 0x87, 0x77, 0xa2, 0xdd, 0xe6, 0xcf, 0x75, 0x11, 0x88, 0x6c, 0x55, 0x90, 0xec, 0xe2, 0x4f, 0xc6, 0x1b, 0x22, 0x67, 0x39, 0xd2, 0x07, 0xda, 0xbf, 0xe3, 0x2b, 0xa6, 0xef, 0xd9, 0xff, 0x4c, 0xd5, 0xdb, 0x1b, 0xd5, 0xea, 0xd3 ],
+const [ 0x25, 0x36, 0x2a, 0x4b, 0x9d, 0x74, 0xbd, 0xe6, 0x12, 0x8c, 0x4f, 0xdc, 0x67, 0x23, 0x05, 0x90, 0x09, 0x47, 0xbc, 0x3a, 0xda, 0x9d, 0x9d, 0x31, 0x6e, 0xbc, 0xf1, 0x66, 0x7a, 0xd4, 0x36, 0x31, 0x89, 0x93, 0x72, 0x51, 0xf1, 0x49, 0xc7, 0x2e, 0x06, 0x4a, 0x48, 0x60, 0x8d, 0x94, 0x0b, 0x75, 0x74, 0xb1, 0x7f, 0xef, 0xc0, 0xdf ],
+const [ 0x3e, 0xbf, 0xb0, 0x6d, 0xb8, 0xc3, 0x8d, 0x5b, 0xa0, 0x37, 0xf1, 0x36, 0x3e, 0x11, 0x85, 0x50, 0xaa, 0xd9, 0x46, 0x06, 0xe2, 0x68, 0x35, 0xa0, 0x1a, 0xf0, 0x50, 0x78, 0x53, 0x3c, 0xc2, 0x5f, 0x2f, 0x39, 0x57, 0x3c, 0x04, 0xb6, 0x32, 0xf6, 0x2f, 0x68, 0xc2, 0x94, 0xab, 0x31, 0xf2, 0xa3, 0xe2, 0xa1, 0xa0, 0xd8, 0xc2, 0xbe, 0x51 ],
+const [ 0x2d, 0x52, 0x44, 0x7d, 0x12, 0x44, 0xd2, 0xeb, 0xc2, 0x86, 0x50, 0xe7, 0xb0, 0x56, 0x54, 0xba, 0xd3, 0x5b, 0x3a, 0x68, 0xee, 0xdc, 0x7f, 0x85, 0x15, 0x30, 0x6b, 0x49, 0x6d, 0x75, 0xf3, 0xe7, 0x33, 0x85, 0xdd, 0x1b, 0x00, 0x26, 0x25, 0x02, 0x4b, 0x81, 0xa0, 0x2f, 0x2f, 0xd6, 0xdf, 0xfb, 0x6e, 0x6d, 0x56, 0x1c, 0xb7, 0xd0, 0xbd, 0x7a ],
+const [ 0x4c, 0xac, 0xe4, 0x22, 0xe4, 0xa0, 0x15, 0xa7, 0x54, 0x92, 0xb3, 0xb3, 0xbb, 0xfb, 0xdf, 0x37, 0x58, 0xea, 0xff, 0x4f, 0xe5, 0x04, 0xb4, 0x6a, 0x26, 0xc9, 0x0d, 0xac, 0xc1, 0x19, 0xfa, 0x90, 0x50, 0xf6, 0x03, 0xd2, 0xb5, 0x8b, 0x39, 0x8c, 0xad, 0x6d, 0x6d, 0x9f, 0xa9, 0x22, 0xa1, 0x54, 0xd9, 0xe0, 0xbc, 0x43, 0x89, 0x96, 0x82, 0x74, 0xb0 ],
+const [ 0x86, 0x20, 0xb8, 0x6f, 0xbc, 0xaa, 0xce, 0x4f, 0xf3, 0xc2, 0x92, 0x1b, 0x84, 0x66, 0xdd, 0xd7, 0xba, 0xca, 0xe0, 0x7e, 0xef, 0xef, 0x69, 0x3c, 0xf1, 0x77, 0x62, 0xdc, 0xab, 0xb8, 0x9a, 0x84, 0x01, 0x0f, 0xc9, 0xa0, 0xfb, 0x76, 0xce, 0x1c, 0x26, 0x59, 0x3a, 0xd6, 0x37, 0xa6, 0x12, 0x53, 0xf2, 0x24, 0xd1, 0xb1, 0x4a, 0x05, 0xad, 0xdc, 0xca, 0xbe ],
+const [ 0xd1, 0xbe, 0x3f, 0x13, 0xfe, 0xba, 0xfe, 0xfc, 0x14, 0x41, 0x4d, 0x9f, 0xb7, 0xf6, 0x93, 0xdb, 0x16, 0xdc, 0x1a, 0xe2, 0x70, 0xc5, 0xb6, 0x47, 0xd8, 0x0d, 0xa8, 0x58, 0x35, 0x87, 0xc1, 0xad, 0x8c, 0xb8, 0xcb, 0x01, 0x82, 0x43, 0x24, 0x41, 0x1c, 0xa5, 0xac, 0xe3, 0xca, 0x22, 0xe1, 0x79, 0xa4, 0xff, 0x49, 0x86, 0xf3, 0xf2, 0x11, 0x90, 0xf3, 0xd7, 0xf3 ],
+const [ 0xf4, 0x99, 0xcc, 0x3f, 0x6e, 0x3c, 0xf7, 0xc3, 0x12, 0xff, 0xdf, 0xba, 0x61, 0xb1, 0x26, 0x0c, 0x37, 0x12, 0x9c, 0x1a, 0xfb, 0x39, 0x10, 0x47, 0x19, 0x33, 0x67, 0xb7, 0xb2, 0xed, 0xeb, 0x57, 0x92, 0x53, 0xe5, 0x1d, 0x62, 0xba, 0x6d, 0x91, 0x1e, 0x7b, 0x81, 0x8c, 0xca, 0xe1, 0x55, 0x3f, 0x61, 0x46, 0xea, 0x78, 0x0f, 0x78, 0xe2, 0x21, 0x9f, 0x62, 0x93, 0x09 ],
+const [ 0x6d, 0xd6, 0xef, 0xd6, 0xf6, 0xca, 0xa6, 0x3b, 0x72, 0x9a, 0xa8, 0x18, 0x6e, 0x30, 0x8b, 0xc1, 0xbd, 0xa0, 0x63, 0x07, 0xc0, 0x5a, 0x2c, 0x0a, 0xe5, 0xa3, 0x68, 0x4e, 0x6e, 0x46, 0x08, 0x11, 0x74, 0x86, 0x90, 0xdc, 0x2b, 0x58, 0x77, 0x59, 0x67, 0xcf, 0xcc, 0x64, 0x5f, 0xd8, 0x20, 0x64, 0xb1, 0x27, 0x9f, 0xdc, 0xa7, 0x71, 0x80, 0x3d, 0xb9, 0xdc, 0xa0, 0xff, 0x53 ],
+const [ 0x65, 0x11, 0xa2, 0x24, 0x2d, 0xdb, 0x27, 0x31, 0x78, 0xe1, 0x9a, 0x82, 0xc5, 0x7c, 0x85, 0xcb, 0x05, 0xa6, 0x88, 0x7f, 0xf2, 0x01, 0x4c, 0xf1, 0xa3, 0x1c, 0xb9, 0xba, 0x5d, 0xf1, 0x69, 0x5a, 0xad, 0xb2, 0x5c, 0x22, 0xb3, 0xc5, 0xed, 0x51, 0xc1, 0x0d, 0x04, 0x7d, 0x25, 0x6b, 0x8e, 0x34, 0x42, 0x84, 0x2a, 0xe4, 0xe6, 0xc5, 0x25, 0xf8, 0xd7, 0xa5, 0xa9, 0x44, 0xaf, 0x2a ],
+const [ 0xe2, 0xf7, 0x6e, 0x97, 0x60, 0x6a, 0x87, 0x2e, 0x31, 0x74, 0x39, 0xf1, 0xa0, 0x3f, 0xcd, 0x92, 0xe6, 0x32, 0xe5, 0xbd, 0x4e, 0x7c, 0xbc, 0x4e, 0x97, 0xf1, 0xaf, 0xc1, 0x9a, 0x16, 0xfd, 0xe9, 0x2d, 0x77, 0xcb, 0xe5, 0x46, 0x41, 0x6b, 0x51, 0x64, 0x0c, 0xdd, 0xb9, 0x2a, 0xf9, 0x96, 0x53, 0x4d, 0xfd, 0x81, 0xed, 0xb1, 0x7c, 0x44, 0x24, 0xcf, 0x1a, 0xc4, 0xd7, 0x5a, 0xce, 0xeb ],
+const [ 0x5a, 0x86, 0xb7, 0x37, 0xea, 0xea, 0x8e, 0xe9, 0x76, 0xa0, 0xa2, 0x4d, 0xa6, 0x3e, 0x7e, 0xd7, 0xee, 0xfa, 0xd1, 0x8a, 0x10, 0x1c, 0x12, 0x11, 0xe2, 0xb3, 0x65, 0x0c, 0x51, 0x87, 0xc2, 0xa8, 0xa6, 0x50, 0x54, 0x72, 0x08, 0x25, 0x1f, 0x6d, 0x42, 0x37, 0xe6, 0x61, 0xc7, 0xbf, 0x4c, 0x77, 0xf3, 0x35, 0x39, 0x03, 0x94, 0xc3, 0x7f, 0xa1, 0xa9, 0xf9, 0xbe, 0x83, 0x6a, 0xc2, 0x85, 0x09 ],
+];
+
+const sha256_short_mds = const [
+'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
+'28969cdfa74a12c82f3bad960b0b000aca2ac329deea5c2328ebc6f2ba9802c1',
+'5ca7133fa735326081558ac312c620eeca9970d1e70a4b95533d956f072d1f98',
+'dff2e73091f6c05e528896c4c831b9448653dc2ff043528f6769437bc7b975c2',
+'b16aa56be3880d18cd41e68384cf1ec8c17680c45a02b1575dc1518923ae8b0e',
+'f0887fe961c9cd3beab957e8222494abb969b1ce4c6557976df8b0f6d20e9166',
+'eca0a060b489636225b4fa64d267dabbe44273067ac679f20820bddc6b6a90ac',
+'3fd877e27450e6bbd5d74bb82f9870c64c66e109418baa8e6bbcff355e287926',
+'963bb88f27f512777aab6c8b1a02c70ec0ad651d428f870036e1917120fb48bf',
+'078da3d77ed43bd3037a433fd0341855023793f9afd08b4b08ea1e5597ceef20',
+'73d6fad1caaa75b43b21733561fd3958bdc555194a037c2addec19dc2d7a52bd',
+'044cef802901932e46dc46b2545e6c99c0fc323a0ed99b081bda4216857f38ac',
+'fe56287cd657e4afc50dba7a3a54c2a6324b886becdcd1fae473b769e551a09b',
+'af53430466715e99a602fc9f5945719b04dd24267e6a98471f7a7869bd3b4313',
+'d189498a3463b18e846b8ab1b41583b0b7efc789dad8a7fb885bbf8fb5b45c5c',
+'dcbaf335360de853b9cddfdafb90fa75567d0d3d58af8db9d764113aef570125',
+'80c25ec1600587e7f28b18b1b18e3cdc89928e39cab3bc25e4d4a4c139bcedc4',
+'d5c30315f72ed05fe519a1bf75ab5fd0ffec5ac1acb0daf66b6b769598594509',
+'32c38c54189f2357e96bd77eb00c2b9c341ebebacc2945f97804f59a93238288',
+'9b5b37816de8fcdf3ec10b745428708df8f391c550ea6746b2cafe019c2b6ace',
+'6dd52b0d8b48cc8146cebd0216fbf5f6ef7eeafc0ff2ff9d1422d6345555a142',
+'44d34809fc60d1fcafa7f37b794d1d3a765dd0d23194ebbe340f013f0c39b613',
+'9df5c16a3f580406f07d96149303d8c408869b32053b726cf3defd241e484957',
+'672b54e43f41ee77584bdf8bf854d97b6252c918f7ea2d26bc4097ea53a88f10',
+'feeb4b2b59fec8fdb1e55194a493d8c871757b5723675e93d3ac034b380b7fc9',
+'76e3acbc718836f2df8ad2d0d2d76f0cfa5fea0986be918f10bcee730df441b9',
+'6733809c73e53666c735b3bd3daf87ebc77c72756150a616a194108d71231272',
+'0e6e3c143c3a5f7f38505ed6adc9b48c18edf6dedf11635f6e8f9ac73c39fe9e',
+'ffb4fc03e054f8ecbc31470fc023bedcd4a406b9dd56c71da1b660dcc4842c65',
+'c644612cd326b38b1c6813b1daded34448805aef317c35f548dfb4a0d74b8106',
+'c0e29eeeb0d3a7707947e623cdc7d1899adc70dd7861205ea5e5813954fb7957',
+'a4139b74b102cf1e2fce229a6cd84c87501f50afa4c80feacf7d8cf5ed94f042',
+'4f44c1c7fbebb6f9601829f3897bfd650c56fa07844be76489076356ac1886a4',
+'b31ad3cd02b10db282b3576c059b746fb24ca6f09fef69402dc90ece7421cbb7',
+'1c38bf6bbfd32292d67d1d651fd9d5b623b6ec1e854406223f51d0df46968712',
+'c2684c0dbb85c232b6da4fb5147dd0624429ec7e657991edd95eda37a587269e',
+'bf9d5e5b5393053f055b380baed7e792ae85ad37c0ada5fd4519542ccc461cf3',
+'d1f8bd684001ac5a4b67bbf79f87de524d2da99ac014dec3e4187728f4557471',
+'49ba38db85c2796f85ffd57dd5ec337007414528ae33935b102d16a6b91ba6c1',
+'725e6f8d888ebaf908b7692259ab8839c3248edd22ca115bb13e025808654700',
+'32caef024f84e97c30b4a7b9d04b678b3d8a6eb2259dff5b7f7c011f090845f8',
+'4bb33e7c6916e08a9b3ed6bcef790aaaee0dcf2e7a01afb056182dea2dad7d63',
+'3ac7ac6bed82fdc8cd15b746f0ee7489158192c238f371c1883c9fe90b3e2831',
+'bfce809534eefe871273964d32f091fe756c71a7f512ef5f2300bcd57f699e74',
+'1d26f3e04f89b4eaa9dbed9231bb051eef2e8311ad26fe53d0bf0b821eaf7567',
+'0ffeb644a49e787ccc6970fe29705a4f4c2bfcfe7d19741c158333ff6982cc9c',
+'d048ee1524014adf9a56e60a388277de194c694cc787fc5a1b554ea9f07abfdf',
+'50dbf40066f8d270484ee2ef6632282dfa300a85a8530eceeb0e04275e1c1efd',
+'7c5d14ed83dab875ac25ce7feed6ef837d58e79dc601fb3c1fca48d4464e8b83',
+'7d53eccd03da37bf58c1962a8f0f708a5c5c447f6a7e9e26137c169d5bdd82e4',
+'99dc772e91ea02d9e421d552d61901016b9fd4ad2df4a8212c1ec5ba13893ab2',
+'cefdae1a3d75e792e8698d5e71f177cc761314e9ad5df9602c6e60ae65c4c267',
+'c99d64fa4dadd4bc8a389531c68b4590c6df0b9099c4d583bc00889fb7b98008',
+'4d12a849047c6acd4b2eee6be35fa9051b02d21d50d419543008c1d82c427072',
+'f8e4ccab6c979229f6066cc0cb0cfa81bb21447c16c68773be7e558e9f9d798d',
+'6595a2ef537a69ba8583dfbf7f5bec0ab1f93ce4c8ee1916eff44a93af5749c4',
+'cfb88d6faf2de3a69d36195acec2e255e2af2b7d933997f348e09f6ce5758360',
+'4d54b2d284a6794581224e08f675541c8feab6eefa3ac1cfe5da4e03e62f72e4',
+'dba490256c9720c54c612a5bd1ef573cd51dc12b3e7bd8c6db2eabe0aacb846b',
+'02804978eba6e1de65afdbc6a6091ed6b1ecee51e8bff40646a251de6678b7ef',
+'0b66c8b4fefebc8dc7da0bbedc1114f228aa63c37d5c30e91ab500f3eadfcec5',
+'c464a7bf6d180de4f744bb2fe5dc27a3f681334ffd54a9814650e60260a478e3',
+'d6859c0b5a0b66376a24f56b2ab104286ed0078634ba19112ace0d6d60a9c1ae',
+'18041bd4665083001fba8c5411d2d748e8abbfdcdfd9218cb02b68a78e7d4c23',
+'42e61e174fbb3897d6dd6cef3dd2802fe67b331953b06114a65c772859dfc1aa',
+];
diff --git a/mojo/public/dart/third_party/crypto/test/sha256_test.dart b/mojo/public/dart/third_party/crypto/test/sha256_test.dart
new file mode 100644
index 0000000..ae16054
--- /dev/null
+++ b/mojo/public/dart/third_party/crypto/test/sha256_test.dart
@@ -0,0 +1,311 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Library tag to allow Dartium to run the tests.
+library sha256_test;
+
+import "package:test/test.dart";
+import "package:crypto/crypto.dart";
+
+part 'sha256_long_test_vectors.dart';
+part 'sha256_short_test_vectors.dart';
+
+
+void main() {
+  test('expected values', _testExpectedValues);
+  test('invalid use', _testInvalidUse);
+  test('repeated digest', _testRepeatedDigest);
+  test('long inputs',
+      () => _testStandardVectors(sha256_long_inputs, sha256_long_mds));
+  test('short inputs',
+      () => _testStandardVectors(sha256_short_inputs, sha256_short_mds));
+}
+
+void _testExpectedValues() {
+  var expectedValues = const [
+      'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
+      '6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d',
+      'b413f47d13ee2fe6c845b2ee141af81de858df4ec549a58b7970bb96645bc8d2',
+      'ae4b3280e56e2faf83f414a6e3dabe9d5fbe18976544c05fed121accb85b53fc',
+      '054edec1d0211f624fed0cbca9d4f9400b0e491c43742af2c5b0abebf0c990d8',
+      '08bb5e5d6eaac1049ede0893d30ed022b1a4d9b5b48db414871f51c9cb35283d',
+      '17e88db187afd62c16e5debf3e6527cd006bc012bc90b51a810cd80c2d511f43',
+      '57355ac3303c148f11aef7cb179456b9232cde33a818dfda2c2fcb9325749a6b',
+      '8a851ff82ee7048ad09ec3847f1ddf44944104d2cbd17ef4e3db22c6785a0d45',
+      'f8348e0b1df00833cbbbd08f07abdecc10c0efb78829d7828c62a7f36d0cc549',
+      '1f825aa2f0020ef7cf91dfa30da4668d791c5d4824fc8e41354b89ec05795ab3',
+      '78a6273103d17c39a0b6126e226cec70e33337f4bc6a38067401b54a33e78ead',
+      'fff3a9bcdd37363d703c1c4f9512533686157868f0d4f16a0f02d0f1da24f9a2',
+      '86eba947d50c2c01570fe1bb5ca552958dabbdbb59b0657f0f26e21ff011e5c7',
+      'ab107f1bd632d3c3f5c724a99d024f7faa033f33c07696384b604bfe78ac352d',
+      '7071fc3188fde7e7e500d4768f1784bede1a22e991648dcab9dc3219acff1d4c',
+      'be45cb2605bf36bebde684841a28f0fd43c69850a3dce5fedba69928ee3a8991',
+      '3e5718fea51a8f3f5baca61c77afab473c1810f8b9db330273b4011ce92c787e',
+      '7a096cc12702bcfa647ee070d4f3ba4c2d1d715b484b55b825d0edba6545803b',
+      '5f9a753613d87b8a17302373c4aee56faa310d3b24b6ae1862d673aa22e1790f',
+      'e7aebf577f60412f0312d442c70a1fa6148c090bf5bab404caec29482ae779e8',
+      '75aee9dcc9fbe7ddc9394f5bc5d38d9f5ad361f0520f7ceab59616e38f5950b5',
+      '22cb4df00cddd6067ad5cfa2bba9857f21a06843e1a6e39ad1a68cb9a45ab8b7',
+      'f6a954a68555187d88cd9a026940d15ab2a7e24c7517d21ceeb028e93c96f318',
+      '1d64add2a6388367c9bc2d1f1b384b069a6ef382cdaaa89771dd103e28613a25',
+      'b729ce724d9a48d3884dbfcbee1d3793d922b29fa9d639e7290af4978263772b',
+      'b858da80d8a57dc546905fd147612ebddd3c9188620405d058f9ee5ab1e6bc52',
+      'd78750726155a89c9131d0ecf2704b973b8710865bf9e831845de4f2dcbc19da',
+      'dc27f8e8ee2d08a2bccbb2dbd6c8e07ffba194101fc3458c34ded55f72c0971a',
+      'd09bea65dff48928a14b79741de3274b646f55ac898b71a66fa3eae2d9facd77',
+      'f2192584b67da35dfc26f743e5f53bb0376046f899dc6dabd5e7b541ae86c32f',
+      '4f23c2ca8c5c962e50cd31e221bfb6d0adca19111dca8e0c62598ff146dd19c4',
+      '630dcd2966c4336691125448bbb25b4ff412a49c732db2c8abc1b8581bd710dd',
+      '5d8fcfefa9aeeb711fb8ed1e4b7d5c8a9bafa46e8e76e68aa18adce5a10df6ab',
+      '14cdbf171499f86bd18b262243d669067efbdbb5431a48289cf02f2b5448b3d4',
+      'f12dd12340cb84e4d0d9958d62be7c59bb8f7243a7420fd043177ac542a26aaa',
+      '5d7e2d9b1dcbc85e7c890036a2cf2f9fe7b66554f2df08cec6aa9c0a25c99c21',
+      'f4d285f47a1e4959a445ea6528e5df3efab041fa15aad94db1e2600b3f395518',
+      'a2fd0e15d72c9d18f383e40016f9ddc706673c54252084285aaa47a812552577',
+      '4aba23aea5e2a91b7807cf3026cdd10a1c38533ce55332683d4ccb88456e0703',
+      '5faa4eec3611556812c2d74b437c8c49add3f910f10063d801441f7d75cd5e3b',
+      '753629a6117f5a25d338dff10f4dd3d07e63eecc2eaf8eabe773f6399706fe67',
+      '40a1ed73b46030c8d7e88682078c5ab1ae5a2e524e066e8c8743c484de0e21e5',
+      'c033843682818c475e187d260d5e2edf0469862dfa3bb0c116f6816a29edbf60',
+      '17619ec4250ef65f083e2314ef30af796b6f1198d0fddfbb0f272930bf9bb991',
+      'a8e960c769a9508d098451e3d74dd5a2ac6c861eb0341ae94e9fc273597278c9',
+      '8ebfeb2e3a159e9f39ad7cc040e6678dade70d4f59a67d529fa76af301ab2946',
+      'ef8a7781a95c32fa02ebf511eda3dc6e273be59cb0f9e20a4f84d54f41427791',
+      '4dbdc2b2b62cb00749785bc84202236dbc3777d74660611b8e58812f0cfde6c3',
+      '7509fe148e2c426ed16c990f22fe8116905c82c561756e723f63223ace0e147e',
+      'a622e13829e488422ee72a5fc92cb11d25c3d0f185a1384b8138df5074c983bf',
+      '3309847cee454b4f99dcfe8fdc5511a7ba168ce0b6e5684ef73f9030d009b8b5',
+      'c4c6540a15fc140a784056fe6d9e13566fb614ecb2d9ac0331e264c386442acd',
+      '90962cc12ae9cdae32d7c33c4b93194b11fac835942ee41b98770c6141c66795',
+      '675f28acc0b90a72d1c3a570fe83ac565555db358cf01826dc8eefb2bf7ca0f3',
+      '463eb28e72f82e0a96c0a4cc53690c571281131f672aa229e0d45ae59b598b59',
+      'da2ae4d6b36748f2a318f23e7ab1dfdf45acdc9d049bd80e59de82a60895f562',
+      '2fe741af801cc238602ac0ec6a7b0c3a8a87c7fc7d7f02a3fe03d1c12eac4d8f',
+      'e03b18640c635b338a92b82cce4ff072f9f1aba9ac5261ee1340f592f35c0499',
+      'bd2de8f5dd15c73f68dfd26a614080c2e323b2b51b1b5ed9d7933e535d223bda',
+      '0ddde28e40838ef6f9853e887f597d6adb5f40eb35d5763c52e1e64d8ba3bfff',
+      '4b5c2783c91ceccb7c839213bcbb6a902d7fe8c2ec866877a51f433ea17f3e85',
+      'c89da82cbcd76ddf220e4e9091019b9866ffda72bee30de1effe6c99701a2221',
+      '29af2686fd53374a36b0846694cc342177e428d1647515f078784d69cdb9e488',
+      'fdeab9acf3710362bd2658cdc9a29e8f9c757fcf9811603a8c447cd1d9151108',
+      '4bfd2c8b6f1eec7a2afeb48b934ee4b2694182027e6d0fc075074f2fabb31781',
+      'b6dfd259f6e0d07deb658a88148f8253f9bbbb74ddd6db3edbe159a56bc35073',
+      '8fa5913b62847d42bb4b464e00a72c612d2ab0df2af0b9a96af8d323fa509077',
+      '7ded979c0153ebb9ef28a15a314d0b27b41c4f8eed700b54974b48eb3ecaf91c',
+      '1cf3aa651dcf35dbfe296e770ad7ebc4e00bcccd0224db296183dc952d0008c9',
+      '5767d69a906d4860db9079eb7e90ab4a543e5cb032fce846554aef6ceb600e1d',
+      '8189e3d54767d51e8d1942659a9e2905f9ec3ae72860c16a66e75b8cc9bd2087',
+      '107de2bc788e11029f7851f8e1b0b5afb4e34379c709fc840689ebd3d1f51b5b',
+      '169f6f093a9be82febe1a6a4471425697ec25d5040b472c5b1822aeea2625988',
+      '2087ebd358ae3ea2a092fc19c2dfee57c5f0860296bc7b057c14e1227c5cb9d1',
+      '182ab56f7739e43cee0b9ba1e92c4b2a81b088705516a5243910159744f21be9',
+      '081f6c68899a48a1be455a55416104921d2fe4bdae696f4b72f9d9626a47915e',
+      '5ce02376cc256861b78f87e34783814ba1aec6d09ab500d579ed8ee95c8afcc8',
+      'b93e407404e3e95f20fd647365e0e7f46afabe9af1ff083af996135e00d54009',
+      'e81fa832b37be8ed8f79da29987aa4d61310dcb14b2859dedf8fb1daa2541fd3',
+      'c56705fea5b110b8dc63688533ced21167e628017387c885423b835a55edd5ef',
+      'c2226285d08a245a17058ed2d24ad095b714f608ae364fddf119e0a7df890540',
+      'f9c270da8793221a6809ac685fdd4f5387e0fe1ee6aaf01c74f1e0a719621614',
+      'e69befd6ef7f685c36e343ac1702d87ad6a0e4ac8c0d5c521d04aad4ef0b7458',
+      '4e3033562ad74a7d43eb5ff5fc2382622c6307cb10e245ad62da77c4c63cb178',
+      '2ea17629472564a59e5eb845a2cdd04f442df2ff26bcc866e400f77158d612a1',
+      'b90223df74dd49a8a1461f340f2d7a90f96903ccbb5bc3c74ea3658fc8948b20',
+      'e0209f42b927ec9c0f6d6a76007ed540e9bdd6e427b3368a1ea6c5e7565972dd',
+      '10d9bd424114319c0999adf6288f74060cd8918ef1228827a6269b2bf0f0880c',
+      '7d1978a65ac94dbbcdc62e3d81850299fe157dd9b7bd9e01b170156210d2815a',
+      'e052dff9e1c94aaa49556f86fad55029a4875839fda57f5005f4c4403876b256',
+      '58d29459b2130a2e151252d408b95e6dac424c564062eb911cc76440cb926ca0',
+      '4e4530c392316f598e1bd07f32166380a8f712a33a48e9eb4247131ec5dc05d3',
+      'a09c9d3e42342c7dea44edb4aeb48cf6727cacd8032a12cf77a25829fc249d32',
+      'eb978d0f1ac03ce5c3510b5f4a16073a7a2bdc15c4ab7777dcf01030cc316667',
+      '7d1905a3ace827ea1ac51c4fa08c281ed3be87e7f4e928d696bfde35c8f2dc0f',
+      '08359b108fa567f5dcf319fa3434da6abbc1d595f426372666447f09cc5a87dc',
+      'a7b3830ffab0f2bbabbef6df0b169a7917008bf238880bbf8c20b8e000077312',
+      'b4f5d9b1555994c5ebaebd82918d560a3bf82962a171a1614e7551939e943366',
+      '014ecaea1b378900f1212898c6ddb01565d81af1d0ef78df5e28d46e9caf7cfc',
+      'bce0aff19cf5aa6a7469a30d61d04e4376e4bbf6381052ee9e7f33925c954d52',
+      '4565d7b898ccea3139ad260f9273115f806b30079d7683218c4e3ecd43af3b33',
+      'ddadeb660fe8902c9fb2db9b6cf237c9ce5b31753398085c4367eb5910b9cc13',
+      'c15a8928131f6687dd10f3c115ddf8d7c8f2df7e18d12c08c4fd16f666ce60ba',
+      'ae8e3d799b1353a39815f90eceebefa265cc448fe39faf2008cb20784cb2df9f',
+      '98545371a3d9981abe5ab4a32a1d7b2fadd9801d89da52a94a4f78a42740d21c',
+      '6323dce2f8b3a04dcea8d205602348c40403cb200c677eb1a1c0fe37edb6eb2f',
+      '8150f7c5da910d709ff02ddf85dd293c6a2672633de8cda30f2e0aa58b14b0c4',
+      '44d21db70716bd7644cb0d819fa6791805ebc526ea32996a60e41dc753fcfafc',
+      'b9b7c375cca45db19466ebd0fe7c9e147948cc42c1c90f0579728cfb2651956d',
+      'a47a551b01e55aaaa015531a4fa26a666f1ebd4ba4573898de712b8b5e0ca7e9',
+      '60780e9451bdc43cf4530ffc95cbb0c4eb24dae2c39f55f334d679e076c08065',
+      '09373f127d34e61dbbaa8bc4499c87074f2ddb10e1b465f506d7d70a15011979',
+      '13aaa9b5fb739cdb0e2af99d9ac0a409390adc4d1cb9b41f1ef94f8552060e92',
+      '5b0a32f1219524f5d72b00ba1a1b1c09a05ff10c83bb7a86042e42988f2afc06',
+      '32796a0a246ea67eb785eda2e045192b9d6e40b9fe2047b21ef0cee929039651',
+      'da9ab8930992a9f65eccec4c310882cab428a708e6c899181046a8c73af00855',
+      '9c94557382c966753c8cab0957eaedbe1d737b5fcb35c56c220ddd36f8a2d351',
+      'd32ab00929cb935b79d44e74c5a745db460ff794dea3b79be40c1cc5cf5388ef',
+      'da18797ed7c3a777f0847f429724a2d8cd5138e6ed2895c3fa1a6d39d18f7ec6',
+      'f52b23db1fbb6ded89ef42a23ce0c8922c45f25c50b568a93bf1c075420bbb7c',
+      '335a461692b30bba1d647cc71604e88e676c90e4c22455d0b8c83f4bd7c8ac9b',
+      '3d08c4d7bdda7ec922b0741df357de46e7bd102f9ab7a5c67624ab58da6d9d75',
+      'cc63be92e3a900cd067da89473b61b40579b54ef54f8305c2ffcc893743792e9',
+      '865447fc4fae01471f2fc973bfb448de00217521ef02e3214d5177ea89c3ef31',
+      '3daa582f9563601e290f3cd6d304bff7e25a9ee42a34ffbac5cf2bf40134e0d4',
+      '5dda7cb7c2282a55676f8ad5c448092f4a9ebd65338b07ed224fcd7b6c73f5ef',
+      '92ca0fa6651ee2f97b884b7246a562fa71250fedefe5ebf270d31c546bfea976',
+      '471fb943aa23c511f6f72f8d1652d9c880cfa392ad80503120547703e56a2be5',
+      '5099c6a56203f9687f7d33f4bfdf576d31dc91f6b695ecea38b2770c87631135',
+      '8d39b60b9c767c58975b270c1d6b13c9b4507e5aee7ad496a3528e4c7f880721',
+      '3acc128faf01077789746edcfd1051d90bc1591342402d9b3cdd06d7315702a4',
+      'ce1662d4c8b1f54d322593ee8ab385763e51dea92c9b4d56bc0e2f85111f0438',
+      'aacb65e7c9055b105cf02c47024cdf79a58229132e66ca0ddf0d74ef6a3fd5c8',
+      '478ab134487ede9921619f1eebac30646919d6ab7146c6928c44732ccc897929',
+      '6a053848cfe83c0fc8c8a81dd84f6b946c63193cd25cdd5dad45f08be8019e89',
+      'ffc555203945df4e81d75f316e4c25fdc0bc4e96412f4f469349eb716f001a7d',
+      '81d45be06329d63a2d8a8599d445676933bea1678fc586795b4ecbb838d4d158',
+      'd08809a9e5b00fc9266b3813679f40acd6c2596d3de4f28f4d20d98c440aa483',
+      'e1796a03c9ed287ef757eee771d116e4dfd8c416f6b5a9e592c1f0e81c0deaa1',
+      'b4a4e5d6560fa3e9629064546ac97f14cd4d023c097ccbf06838ccef4fdcd8f1',
+      '9b293d748d30240d3ddc496b722fc92d57f665271b060e82410d8de18970dc1d',
+      'ef145232e5b19630e0b389891f688161d047c269c7cf22dbff114514572f5813',
+      '985f19128703afeee38d22797c0cae5f450cc290a6a5b9253dd908420e9032ff',
+      '66f952a83339274eb287b64ef7b028d88915ac6df06a183f7c0436fa2b25107b',
+      '46af22be1b576de71971c25e88c18a3295f0ac762a412a11105cef20fa2f5840',
+      'e81901f41344683448a03db259d1071c9b2f91001781ae34a0b39a0988381fc2',
+      'a5c602c1401ad5029efffaf188f27f9b96b441631a77448551ee337b9dc0e7e8',
+      '8317b3fb2181158cfdccfaeb8f8a1736961476717801ae9de7c9a59dc395ef1c',
+      '7834d0515667e46923f3a6c054268e06bc2301491b8eda225d1f4317918206fe',
+      'f22b2e614e92d6453612b707385038300293d2cc292b148bc5335754b5ea30fd',
+      '1d683f2a7c58ac74fab45761235c3e9682f1329b6d96e260a7c67d2d58b233b6',
+      'f584eff8c5152fb6b2699806508cdb7148138ecb6dd564b02bfc021fd0ec586a',
+      'afa8661046fa83e7c261167f35f6379c00d3a3a9ca46c48fb0bad2c49dda7933',
+      '9fedc8a3aa430d6d911b714a151e5f17a4acf52f4239617eec7c9b9d7775612b',
+      '8de202b9c283c236da5d2cd5e556de9c1822c19dab36e09f690cf70d3c963e97',
+      '31b96fecbf0c2839a29c4acd7098c2701cab152d424e266cf07a16875604365e',
+      '3f1a0f65ee12f7efe64477247359af8ef02cf27d104481b4f5922f71432b8178',
+      'f4c34f764e0a9e37c080d28f01c4bbe24dad0cc65a88b1fa6b28802a4b799865',
+      '85ac7f3761f77772e28c3a9b658aa0e04d9dd3a6bc365c30324948b0ede18b88',
+      '448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184c719',
+      '97f5eac07cdc76f1f0faa10b0081cfaff3fab72095680a4516c723fde98916de',
+      '6b572b21caa06fc6a1bdab77da3bc07377919088ee96603628354c0b3800661d',
+      '27fcdcc7e2ee00f1dcb07aac445a436ab5dee2c14b04621acd387ec50e8efa50',
+      'e839cfc21e8e77997e643efa04f7150e6cc68864cbea745aefaf47a9363df709',
+      'ba6bad069acc2d0bedf36e2b6cc005d31eb76b0da9de46e09209ff004ae25200',
+      '7d3e6ad6d9017d79d15eb518ebbac828d64449c39f0942ee6e7798479e7615a4',
+      '697c581d18edb2692249fc07aae307d3cc263033cb32f16ef3c0b57429695a43',
+      '7f7193dd3c6c273cdd66488f8aa5dbe3542a22bf0fcda7d6fb93235178c4589e',
+      '6e944d621f9e13bc22d4ae68aaa8cb15605ed9680acd7f16e5b0f94149b634cd',
+      '491602f722b2a6ef3976a696e286d99e19259d3a4ffb957d18a7128a6fb37a8c',
+      'f2b51a1a5c12e9b07f152812895f2ab51a9727021e389555a58507ea7ff16e51',
+      'dfabc97f215403a3cc2bcf132a35fc832e87b7de0f2e7560f2ad9d8f06e38b63',
+      '73b1f1000c7677ebdcef2a2a25e27b06d9c163209add77a16f0e2b70e56d5c52',
+      '21803c877b81b590015dab430568cf4d7c0247eea6147a18ac4fc3492996cb79',
+      'b7e3c3ea326a5fd558d70efe2bc6469732a2894dfdeca106093611a4a8d4b025',
+      '5ae91d2295e6706191b760661d48e365441de12340006130c42c7b38faa48393',
+      'efe3f35371f700217362155403d2b3f912b751d69d6bf80a59a86d4911718651',
+      'af37eee16b62d9665944da23a7712f454640ceeb958f20fd33fdd1ee515dabd9',
+      '2537ac29dc1561ee49a0bc1aadb863c435a669d18d5e7e890ed3e11a014ce411',
+      'e360918d85b02d655ea572d081c83b019691e8665908d6a6fbf9d5673a13d892',
+      '37e7218560603527cc8db9a5a1da89fa27df1da7dd9c54c0c7a2405d8a5208a1',
+      '621009f0bf8ca1d70eedfa30eb6e2979794469b4e99ee385fd9501712b45cb6a',
+      'b1459345163aed1c356302a5230f8912564b04f340610b18ef1aa2c47b418981',
+      '82f63a1d007fd9796756abbbf51c246884dde3d79cf9cacacc901462ae75e3ff',
+      '78d8ce1ccd46cf92fb4e255f183bc9f355e5e494b3180c0da9154e17a1d61f74',
+      '8882ee8501069ba507a3a5f309e8e3f9dcfb13987ec293c60feba4f1fabc5ba7',
+      'c62efddbd622094486c1ededca74ad47c8ce4c7661d9f58c2723403bb42b45b6',
+      '93301c8548f3afc25d7e157eaf7c8dbf5edb029bd829136600593067cd4b0c5c',
+      '19961686c66d9e10e2ce38a14652121e533d5f04bbeea193210cb0a7b88396f3',
+      'b454dbe07fb100ea743cd193ea1953a9e6d62a07fde0f3325c362e4f3d7b694f',
+      'd280f473c251cb75c91880ea0eca2a2f1cda3152bef54a38c4a3aedad615c819',
+      '8b4a544837a1a0280fa8a7c82865c27a1064b3cc6281fda0753566b9bb104a87',
+      '7daafa7aed7d63d06a98b7b6f785eab5427d084f30d5c9ee6dd0d2f3ada329e6',
+      'dc0b1c61c4001cfe707c52875e026e4eefbafc09ab767f8f3ac55e9c78406e4a',
+      'cd855c9ecb3cd846efd1111aeb02c8563f7aef9988ac4c597fab35b4235604c5',
+      '28ece33729cdeff79a863cdfa359b51cebe29f8a947954306338c11a89866e62',
+      '59a6aed6a44d5a52565289ccc377966b6a1ab41ac339e72475f49bb136befa91',
+      '3458d07857503fcadabbc5dfc7b905bc373b77cb058d87feb35443a0aa7ce204',
+      '76ccea5a51d93c238bd3a745ff8acd3c848a15c85d12e3d5c9743ecc094773a4',
+      '1901da1c9f699b48f6b2636e65cbf73abf99d0441ef67f5c540a42f7051dec6f',
+      '747db6ff08731ff7908224c50f71f51fef1283e65341e2dbcdc664f0f41bf8c5',
+      '07ff1080d3d4aaed9cd77850c0207e75e7f9697bed15a8cda7057f6a24c010d2',
+      '8f0512e800a511953a28bf11bb5e9c305c4026867bc9a31f76cb96fc5bd87027',
+      'fed886fe3977e2d21a6b0db5977b8deee5b456d323f8c208d24b8adff08f11de',
+      'ea98780a92c30a1038d20bd3d0c87106353306bf9751df5c3c88f9d4b31a0088',
+      '121aea684d4d62866514564293f1928c6d4d9e9aa62f2bd2df94f392bf75a838',
+      '6f03900ba86980a79f6f8a5d633bd9e8dc9ca30690c86b31ce892d83115a2326',
+      '94e9c48301753f123bad54d917d13da64c18b1789da85dc8ed3d8427c56978f7',
+      'f934aea49262b4fd587eb74ebe2c69b857aca07876acadc23f89d6c0bbbccdd5',
+      '02d53b4529c38363c1ddc9053e3e58bcb6e3001f01c26aa7c4a9e17884cc71e5',
+      '018513c8e6cf9ba66351428984e5d44824fee364c26bed1533ca3ece8f3574c3',
+      '21209622b064b7f81c5a3524abe7c9708d4585ad4ea21b072ce76993afdd3bf9',
+      'aa361163f6b53f6e6de29daae28a336a8f7c05bf5e8a6eeaa46a51bcd66ac7f7',
+      'dedff2184de121c60ec94c4cb94a0450cac47257c56afa8f2e11c5f64d3dd661',
+      '1d64137df721078b35bdc1a3595a73cebcbe49865fb308c78791540d1d349cd7',
+      '9d42d74bac443eafbd9878145b745387eb1397174332564bc8fa6db414ab381f',
+      '11a6171d8d193f7cf83315199bb3a7e07e8e00c33e5b620855e0b879cfa4c68c',
+      'a9cda05987272ee71100f81f59ad3959b0978a576235c6836eccb65a9577126f',
+      'fd53126210abfcb0d6a56c90853b716d02acd8dfa319a60cf51b1a2b4ef6d7f3',
+      '17c1453315e3dc1890e8a1c2848d781d207ad73335450e9a236e44c8a2ad3b06',
+      'bd2e01835226c56a32ff58df38e6e179830335d4033a40d9c60d269b145c9f6a',
+      '3b7a22d9ef089d4aa382eff3deeba73d41e4af58b0967e9c8603d860431c3ec7',
+      '7a7f89f00b0e9b1b9e99490a7b9d9ce7740a403047efbb94ad35fd13a35b4ac6',
+      '7e47dde9a2e52a0067f80a149abf606ea4ec25690637632d34561432c0738877',
+      '5d5771856bd52662bd20e37424abf39e1f3b50264ff09ffd62b3dcc8f05d01f0',
+      '6c851b50e115cecfe3b4b910e6a7406af282f9dbcd4ce9cca0db8d488a125f01',
+      '5f6e61fa3cdc91285b09f1934b31e426108dfad7ff04c367651f4a59f5c78722',
+      'ada6b2683a885f5fef657b8c9b44a44f1e739af8b35c64a51c4072d2a86602c4',
+      '3a6a36895262b4af79fdc476e90a9ebc06320e64dd8417b8ebba5f6fec87eaac',
+      'c2c67787b86319330e4d0657bc2c0ad67482dff0647b925cc9b8c20a535edc37',
+      '6f473cf63f854fb1fa5ad59c463f640dda1a2a1bacac0e15ffa400e663a7f6e7',
+      '619a4c7ba6e34fd2246ef3ced6f1e13a5091aa8ea990b59a5e86479c9cb533bf',
+      '96e054622771ebf6d4ec206a04c68e0d8bacede86a71a1a546f5e2f8b59178fa',
+      'ca9dedc42398e60506e48a2ac95c19882db3c1adeb8da5877e6ad9db4b4c4cd0',
+      'f0f1ed236d1a3db9501ff5f2c5cd43d48f2fc30d59cce3155e7f0695c0d529f9',
+      '93b2ef94e81337432b267cd50347945f32d9b689b198ccd495215da088ac89b1',
+      '69e640e22c3ddd1e1d8391aa4db54aa6ac8aa60ff687a5986f1bea86c49651ab',
+      '6f58ce599facae90d94a287e9bf8cb06eaf17da2c293700eeb6bc087fec676b1',
+      '5e1c10284710f5c2db48f88de3d051579643a1ed042afa846a7844895351a77b',
+      'abf4bafcddb38bbf3855e47b5e61b75dedbcf42aa44ffd4bb85d0b08d97e2682',
+      '211882aeac8a599b0a55ec280e1a978923edef69cd86541bcbd58db864c45eac',
+      '632a48a7a9a3ac5966a5caa71d456ef1f95f402859df61157cb95ed951237714',
+      '6b9425a4c4d39c932fd310704bc144d283f1c090bea989c9b3e96fc0925da531',
+      '17610efb99d0f9e4eb1aa13eb1d86289c7dde37d17833ed23dd10e469e2543ff',
+      'f5e7bdf4880d87a14055bf371328fe7396315f4848900e7f2471c5edb2a4c23c',
+      '5b6cca1b8ac9199d191ea31152d47057fa329994b392db72eda29dbb60d1750c',
+      '4b96ec3b91e9f764ac0227ca7df451bd8294cd46298047b43b960ae1c0b0afc5',
+      'c6fefe1bfbe6f5364bf0e40447ffca27fde55f1cd815e1fa3bafb46a41c91749',
+      '552a69d052ae2980aa92ef44b4a8752fc585d70127d9df1ac53137e266786e4d',
+      '369d7da16156c5e2c0d519cdbab3996a7249e20d3e48c36a3a873e987190bd89',
+      'ef67e0723230f6c535ff556e45ca2174e1e97deed306e9e87f1b65579076ec06',
+      '2cb1e75cd7505a2783769276f30b122cb136fbbd03300510b71a7196ca670b37',
+      '1211b6885890be48f89934ec5246f1ce3cfff46c626cfcd686d5fdce9b1fb830',
+      'd6a8bdb01e763fb64f3a02512e7be905679a5add6bb408f8750d679d17cad92f',
+      '3f8591112c6bbe5c963965954e293108b7208ed2af893e500d859368c654eabe' ];
+
+  for (var i = 0; i < expectedValues.length; i++) {
+    var hash = new SHA256();
+    hash.add(new List<int>.generate(i, (j) => j, growable: false));
+    var d = hash.close();
+    expect(expectedValues[i], CryptoUtils.bytesToHex(d), reason: '$i');
+  }
+}
+
+void _testInvalidUse() {
+  var sha = new SHA256();
+  sha.close();
+  expect(() => sha.add([0]), throwsStateError);
+}
+
+void _testRepeatedDigest() {
+  var sha = new SHA256();
+  var digest = sha.close();
+  expect(digest, sha.close());
+}
+
+void _testStandardVectors(inputs, mds) {
+  for (var i = 0; i < inputs.length; i++) {
+    var hash = new SHA256();
+    hash.add(inputs[i]);
+    var d = hash.close();
+    expect(mds[i], CryptoUtils.bytesToHex(d), reason: '$i');
+  }
+}
diff --git a/mojo/public/dart/third_party/csslib/.gitignore b/mojo/public/dart/third_party/csslib/.gitignore
new file mode 100644
index 0000000..388eff0
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/.gitignore
@@ -0,0 +1,14 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.pub/
+build/
+packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/csslib/.status b/mojo/public/dart/third_party/csslib/.status
new file mode 100644
index 0000000..e9f2b00
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/.status
@@ -0,0 +1,3 @@
+# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
diff --git a/mojo/public/dart/third_party/csslib/CHANGELOG.md b/mojo/public/dart/third_party/csslib/CHANGELOG.md
new file mode 100644
index 0000000..4d14f0b
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/CHANGELOG.md
@@ -0,0 +1,34 @@
+## 0.12.1
+
+ * Fix to handling of escapes in strings.
+
+## 0.12.0+1
+
+* Allow the lastest version of `logging` package.
+
+## 0.12.0
+
+* Top-level methods in `parser.dart` now take `PreprocessorOptions` instead of
+  `List<String>`.
+
+* `PreprocessorOptions.inputFile` is now final.
+
+## 0.11.0+4
+
+* Cleanup some ambiguous and some incorrect type signatures.
+
+## 0.11.0+3
+
+* Improve the speed and memory efficiency of parsing.
+
+## 0.11.0+2
+
+* Fix another test that was failing on IE10.
+
+## 0.11.0+1
+
+* Fix a test that was failing on IE10.
+
+## 0.11.0
+
+* Switch from `source_maps`' `Span` class to `source_span`'s `SourceSpan` class.
diff --git a/mojo/public/dart/third_party/csslib/LICENSE b/mojo/public/dart/third_party/csslib/LICENSE
new file mode 100644
index 0000000..ee99930
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2013, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/csslib/README.md b/mojo/public/dart/third_party/csslib/README.md
new file mode 100644
index 0000000..e64fd9b
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/README.md
@@ -0,0 +1,82 @@
+csslib in Pure Dart
+===================
+
+This is a pure [Dart][dart] [CSS parser][cssparse]. Since it's 100%
+Dart you can use it safely from a script or server side app.
+
+Installation
+------------
+
+Add this to your `pubspec.yaml` (or create it):
+```yaml
+dependencies:
+  csslib: any
+```
+Then run the [Pub Package Manager][pub] (comes with the Dart SDK):
+
+    pub install
+
+Usage
+-----
+
+Parsing CSS is easy!
+```dart
+import 'package:csslib/parser.dart' show parse;
+import 'package:csslib/css.dart';
+
+main() {
+  var stylesheet = parse(
+      '.foo { color: red; left: 20px; top: 20px; width: 100px; height:200px }');
+  print(stylesheet.toString());
+}
+```
+
+You can pass a String or list of bytes to `parse`.
+
+
+Updating
+--------
+
+You can upgrade the library with:
+
+    pub update
+
+Disclaimer: the APIs are not finished. Updating may break your code. If that
+happens, you can check the
+[commit log](https://github.com/dart-lang/csslib/commits/master), to figure
+out what the change was.
+
+If you want to avoid breakage, you can also put the version constraint in your
+`pubspec.yaml` in place of the word `any`.
+
+Running Tests
+-------------
+
+All tests (both canary and suite) should be passing.  Canary are quick test
+verifies that basic CSS is working.  The suite tests are a comprehensive set of
+~11,000 tests.
+
+```bash
+export DART_SDK=path/to/dart/sdk
+
+# Make sure dependencies are installed
+pub install
+
+# Run command both canary and the suite tests
+test/run.sh
+```
+
+  Run only the canary test:
+
+```bash
+ test/run.sh canary
+```
+
+  Run only the suite tests:
+
+```bash
+ test/run.sh suite
+```
+
+[dart]: http://www.dartlang.org/
+[pub]: http://www.dartlang.org/docs/pub-package-manager/
diff --git a/mojo/public/dart/third_party/csslib/bin/css.dart b/mojo/public/dart/third_party/csslib/bin/css.dart
new file mode 100755
index 0000000..f64faac
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/bin/css.dart
@@ -0,0 +1,8 @@
+#!/usr/bin/env dart
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:csslib/css.dart' as css;
+
+void main(List<String> args) => css.main(args);
diff --git a/mojo/public/dart/third_party/csslib/codereview.settings b/mojo/public/dart/third_party/csslib/codereview.settings
new file mode 100644
index 0000000..904dba1
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: http://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/csslib/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/csslib/example/call_parser.dart b/mojo/public/dart/third_party/csslib/example/call_parser.dart
new file mode 100644
index 0000000..7179a17
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/example/call_parser.dart
@@ -0,0 +1,96 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+
+import 'package:csslib/parser.dart' as css;
+import 'package:csslib/visitor.dart';
+
+const _default = const css.PreprocessorOptions(
+    useColors: false,
+    checked: true,
+    warningsAsErrors: true,
+    inputFile: 'memory');
+
+/**
+ * Spin-up CSS parser in checked mode to detect any problematic CSS.  Normally,
+ * CSS will allow any property/value pairs regardless of validity; all of our
+ * tests (by default) will ensure that the CSS is really valid.
+ */
+StyleSheet parseCss(String cssInput,
+    {List errors, css.PreprocessorOptions opts}) {
+  return css.parse(cssInput,
+      errors: errors, options: opts == null ? _default : opts);
+}
+
+// Pretty printer for CSS.
+var emitCss = new CssPrinter();
+String prettyPrint(StyleSheet ss) =>
+    (emitCss..visitTree(ss, pretty: true)).toString();
+
+main() {
+  var errors = [];
+
+  // Parse a simple stylesheet.
+  print('1. Good CSS, parsed CSS emitted:');
+  print('   =============================');
+  var stylesheet = parseCss(
+      '@import "support/at-charset-019.css"; div { color: red; }'
+      'button[type] { background-color: red; }'
+      '.foo { '
+      'color: red; left: 20px; top: 20px; width: 100px; height:200px'
+      '}'
+      '#div {'
+      'color : #00F578; border-color: #878787;'
+      '}', errors: errors);
+
+  if (!errors.isEmpty) {
+    print("Got ${errors.length} errors.\n");
+    for (var error in errors) {
+      print(error);
+    }
+  } else {
+    print(prettyPrint(stylesheet));
+  }
+
+  // Parse a stylesheet with errors
+  print('2. Catch severe syntax errors:');
+  print('   ===========================');
+  var stylesheetError = parseCss('.foo #%^&*asdf{ '
+      'color: red; left: 20px; top: 20px; width: 100px; height:200px'
+      '}', errors: errors);
+
+  if (!errors.isEmpty) {
+    print("Got ${errors.length} errors.\n");
+    for (var error in errors) {
+      print(error);
+    }
+  } else {
+    print(stylesheetError.toString());
+  }
+
+  // Parse a stylesheet that warns (checks) problematic CSS.
+  print('3. Detect CSS problem with checking on:');
+  print('   ===================================');
+  stylesheetError = parseCss('# div1 { color: red; }', errors: errors);
+
+  if (!errors.isEmpty) {
+    print("Detected ${errors.length} problem in checked mode.\n");
+    for (var error in errors) {
+      print(error);
+    }
+  } else {
+    print(stylesheetError.toString());
+  }
+
+  // Parse a CSS selector.
+  print('4. Parse a selector only:');
+  print('   ======================');
+  var selectorAst = css.selector('#div .foo', errors: errors);
+  if (!errors.isEmpty) {
+    print("Got ${errors.length} errors.\n");
+    for (var error in errors) {
+      print(error);
+    }
+  } else {
+    print(prettyPrint(selectorAst));
+  }
+}
diff --git a/mojo/public/dart/third_party/csslib/example/call_parser.html b/mojo/public/dart/third_party/csslib/example/call_parser.html
new file mode 100644
index 0000000..8dc02e4
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/example/call_parser.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>Call CSS Parser from Browser (Dart2JS and Dartium)</title>
+  </head>
+  <body>
+    <h1>Dartium/Dart2JS Test</h1>
+    <script type="application/dart" src="call_parser.dart"></script>
+    <script src="packages/browser/dart.js"></script>
+  </body>
+</html>
diff --git a/mojo/public/dart/third_party/csslib/example/test.css b/mojo/public/dart/third_party/csslib/example/test.css
new file mode 100644
index 0000000..42aa048
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/example/test.css
@@ -0,0 +1,6 @@
+.foo #abc {
+  color: red;
+  width: 300px;
+  left: 50px;
+  right: 50px;
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/csslib/lib/css.dart b/mojo/public/dart/third_party/csslib/lib/css.dart
new file mode 100644
index 0000000..590e835
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/lib/css.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library css;
+
+import 'dart:io';
+
+import 'package:path/path.dart' as path;
+import 'package:source_span/source_span.dart';
+
+import 'parser.dart';
+import 'visitor.dart';
+import 'src/messages.dart';
+import 'src/options.dart';
+
+void main(List<String> arguments) {
+  // TODO(jmesserly): fix this to return a proper exit code
+  var options = PreprocessorOptions.parse(arguments);
+  if (options == null) return;
+
+  messages = new Messages(options: options);
+
+  _time('Total time spent on ${options.inputFile}', () {
+    _compile(options.inputFile, options.verbose);
+  }, true);
+}
+
+void _compile(String inputPath, bool verbose) {
+  var ext = path.extension(inputPath);
+  if (ext != '.css' && ext != '.scss') {
+    messages.error("Please provide a CSS/Sass file", null);
+    return;
+  }
+  try {
+    // Read the file.
+    var filename = path.basename(inputPath);
+    var contents = new File(inputPath).readAsStringSync();
+    var file = new SourceFile(contents, url: path.toUri(inputPath));
+
+    // Parse the CSS.
+    var tree = _time(
+        'Parse $filename', () => new Parser(file, contents).parse(), verbose);
+
+    _time('Analyzer $filename', () => new Analyzer([tree], messages), verbose)
+        .run();
+
+    // Emit the processed CSS.
+    var emitter = new CssPrinter();
+    _time('Codegen $filename', () => emitter.visitTree(tree, pretty: true),
+        verbose);
+
+    // Write the contents to a file.
+    var outPath = path.join(path.dirname(inputPath), '_$filename');
+    new File(outPath).writeAsStringSync(emitter.toString());
+  } catch (e) {
+    messages.error('error processing $inputPath. Original message:\n $e', null);
+  }
+}
+
+_time(String message, callback(), bool printTime) {
+  if (!printTime) return callback();
+  final watch = new Stopwatch();
+  watch.start();
+  var result = callback();
+  watch.stop();
+  final duration = watch.elapsedMilliseconds;
+  _printMessage(message, duration);
+  return result;
+}
+
+void _printMessage(String message, int duration) {
+  var buf = new StringBuffer();
+  buf.write(message);
+  for (int i = message.length; i < 60; i++) buf.write(' ');
+  buf.write(' -- ');
+  if (duration < 10) buf.write(' ');
+  if (duration < 100) buf.write(' ');
+  buf
+    ..write(duration)
+    ..write(' ms');
+  print(buf.toString());
+}
diff --git a/mojo/public/dart/third_party/csslib/lib/parser.dart b/mojo/public/dart/third_party/csslib/lib/parser.dart
new file mode 100644
index 0000000..8692693
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/lib/parser.dart
@@ -0,0 +1,2695 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library csslib.parser;
+
+import 'dart:math' as math;
+
+import 'package:source_span/source_span.dart';
+
+import "visitor.dart";
+import 'src/messages.dart';
+import 'src/options.dart';
+
+export 'src/options.dart';
+
+part 'src/analyzer.dart';
+part 'src/polyfill.dart';
+part 'src/property.dart';
+part 'src/token.dart';
+part 'src/tokenizer_base.dart';
+part 'src/tokenizer.dart';
+part 'src/tokenkind.dart';
+
+/** Used for parser lookup ahead (used for nested selectors Less support). */
+class ParserState extends TokenizerState {
+  final Token peekToken;
+  final Token previousToken;
+
+  ParserState(this.peekToken, this.previousToken, Tokenizer tokenizer)
+      : super(tokenizer);
+}
+
+// TODO(jmesserly): this should not be global
+void _createMessages({List<Message> errors, PreprocessorOptions options}) {
+  if (errors == null) errors = [];
+
+  if (options == null) {
+    options = new PreprocessorOptions(useColors: false, inputFile: 'memory');
+  }
+
+  messages = new Messages(options: options, printHandler: errors.add);
+}
+
+/** CSS checked mode enabled. */
+bool get isChecked => messages.options.checked;
+
+// TODO(terry): Remove nested name parameter.
+/** Parse and analyze the CSS file. */
+StyleSheet compile(input, {List<Message> errors, PreprocessorOptions options,
+    bool nested: true, bool polyfill: false, List<StyleSheet> includes: null}) {
+  if (includes == null) {
+    includes = [];
+  }
+
+  var source = _inputAsString(input);
+
+  _createMessages(errors: errors, options: options);
+
+  var file = new SourceFile(source);
+
+  var tree = new _Parser(file, source).parse();
+
+  analyze([tree], errors: errors, options: options);
+
+  if (polyfill) {
+    var processCss = new PolyFill(messages, true);
+    processCss.process(tree, includes: includes);
+  }
+
+  return tree;
+}
+
+/** Analyze the CSS file. */
+void analyze(List<StyleSheet> styleSheets,
+    {List<Message> errors, PreprocessorOptions options}) {
+  _createMessages(errors: errors, options: options);
+  new Analyzer(styleSheets, messages).run();
+}
+
+/**
+ * Parse the [input] CSS stylesheet into a tree. The [input] can be a [String],
+ * or [List<int>] of bytes and returns a [StyleSheet] AST.  The optional
+ * [errors] list will contain each error/warning as a [Message].
+ */
+StyleSheet parse(input, {List<Message> errors, PreprocessorOptions options}) {
+  var source = _inputAsString(input);
+
+  _createMessages(errors: errors, options: options);
+
+  var file = new SourceFile(source);
+  return new _Parser(file, source).parse();
+}
+
+/**
+ * Parse the [input] CSS selector into a tree. The [input] can be a [String],
+ * or [List<int>] of bytes and returns a [StyleSheet] AST.  The optional
+ * [errors] list will contain each error/warning as a [Message].
+ */
+// TODO(jmesserly): should rename "parseSelector" and return Selector
+StyleSheet selector(input, {List<Message> errors}) {
+  var source = _inputAsString(input);
+
+  _createMessages(errors: errors);
+
+  var file = new SourceFile(source);
+  return (new _Parser(file, source)..tokenizer.inSelector = true)
+      .parseSelector();
+}
+
+SelectorGroup parseSelectorGroup(input, {List<Message> errors}) {
+  var source = _inputAsString(input);
+
+  _createMessages(errors: errors);
+
+  var file = new SourceFile(source);
+  return (new _Parser(file, source)
+    // TODO(jmesserly): this fix should be applied to the parser. It's tricky
+    // because by the time the flag is set one token has already been fetched.
+    ..tokenizer.inSelector = true).processSelectorGroup();
+}
+
+String _inputAsString(input) {
+  String source;
+
+  if (input is String) {
+    source = input;
+  } else if (input is List) {
+    // TODO(terry): The parse function needs an "encoding" argument and will
+    //              default to whatever encoding CSS defaults to.
+    //
+    // Here's some info about CSS encodings:
+    // http://www.w3.org/International/questions/qa-css-charset.en.php
+    //
+    // As JMesserly suggests it will probably need a "preparser" html5lib
+    // (encoding_parser.dart) that interprets the bytes as ASCII and scans for
+    // @charset. But for now an "encoding" argument would work.  Often the
+    // HTTP header will indicate the correct encoding.
+    //
+    // See encoding helpers at: package:html5lib/lib/src/char_encodings.dart
+    // These helpers can decode in different formats given an encoding name
+    // (mostly unicode, ascii, windows-1252 which is html5 default encoding).
+    source = new String.fromCharCodes(input as List<int>);
+  } else {
+    // TODO(terry): Support RandomAccessFile using console.
+    throw new ArgumentError("'source' must be a String or "
+        "List<int> (of bytes). RandomAccessFile not supported from this "
+        "simple interface");
+  }
+
+  return source;
+}
+
+// TODO(terry): Consider removing this class when all usages can be eliminated
+//               or replaced with compile API.
+/** Public parsing interface for csslib. */
+class Parser {
+  final _Parser _parser;
+
+  // TODO(jmesserly): having file and text is redundant.
+  Parser(SourceFile file, String text, {int start: 0, String baseUrl})
+      : _parser = new _Parser(file, text, start: start, baseUrl: baseUrl);
+
+  StyleSheet parse() => _parser.parse();
+}
+
+/** A simple recursive descent parser for CSS. */
+class _Parser {
+  final Tokenizer tokenizer;
+
+  /** Base url of CSS file. */
+  final String _baseUrl;
+
+  /**
+   * File containing the source being parsed, used to report errors with
+   * source-span locations.
+   */
+  final SourceFile file;
+
+  Token _previousToken;
+  Token _peekToken;
+
+  _Parser(SourceFile file, String text, {int start: 0, String baseUrl})
+      : this.file = file,
+        _baseUrl = baseUrl,
+        tokenizer = new Tokenizer(file, text, true, start) {
+    _peekToken = tokenizer.next();
+  }
+
+  /** Main entry point for parsing an entire CSS file. */
+  StyleSheet parse() {
+    List<TreeNode> productions = [];
+
+    var start = _peekToken.span;
+    while (!_maybeEat(TokenKind.END_OF_FILE) && !_peekKind(TokenKind.RBRACE)) {
+      // TODO(terry): Need to handle charset.
+      var directive = processDirective();
+      if (directive != null) {
+        productions.add(directive);
+        _maybeEat(TokenKind.SEMICOLON);
+      } else {
+        RuleSet ruleset = processRuleSet();
+        if (ruleset != null) {
+          productions.add(ruleset);
+        } else {
+          break;
+        }
+      }
+    }
+
+    checkEndOfFile();
+
+    return new StyleSheet(productions, _makeSpan(start));
+  }
+
+  /** Main entry point for parsing a simple selector sequence. */
+  StyleSheet parseSelector() {
+    List<TreeNode> productions = [];
+
+    var start = _peekToken.span;
+    while (!_maybeEat(TokenKind.END_OF_FILE) && !_peekKind(TokenKind.RBRACE)) {
+      var selector = processSelector();
+      if (selector != null) {
+        productions.add(selector);
+      }
+    }
+
+    checkEndOfFile();
+
+    return new StyleSheet.selector(productions, _makeSpan(start));
+  }
+
+  /** Generate an error if [file] has not been completely consumed. */
+  void checkEndOfFile() {
+    if (!(_peekKind(TokenKind.END_OF_FILE) ||
+        _peekKind(TokenKind.INCOMPLETE_COMMENT))) {
+      _error('premature end of file unknown CSS', _peekToken.span);
+    }
+  }
+
+  /** Guard to break out of parser when an unexpected end of file is found. */
+  // TODO(jimhug): Failure to call this method can lead to inifinite parser
+  //   loops.  Consider embracing exceptions for more errors to reduce
+  //   the danger here.
+  bool isPrematureEndOfFile() {
+    if (_maybeEat(TokenKind.END_OF_FILE)) {
+      _error('unexpected end of file', _peekToken.span);
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+  ///////////////////////////////////////////////////////////////////
+  // Basic support methods
+  ///////////////////////////////////////////////////////////////////
+  int _peek() {
+    return _peekToken.kind;
+  }
+
+  Token _next({unicodeRange: false}) {
+    _previousToken = _peekToken;
+    _peekToken = tokenizer.next(unicodeRange: unicodeRange);
+    return _previousToken;
+  }
+
+  bool _peekKind(int kind) {
+    return _peekToken.kind == kind;
+  }
+
+  /* Is the next token a legal identifier?  This includes pseudo-keywords. */
+  bool _peekIdentifier() {
+    return TokenKind.isIdentifier(_peekToken.kind);
+  }
+
+  /** Marks the parser/tokenizer look ahead to support Less nested selectors. */
+  ParserState get _mark =>
+      new ParserState(_peekToken, _previousToken, tokenizer);
+
+  /** Restores the parser/tokenizer state to state remembered by _mark. */
+  void _restore(ParserState markedData) {
+    tokenizer.restore(markedData);
+    _peekToken = markedData.peekToken;
+    _previousToken = markedData.previousToken;
+  }
+
+  bool _maybeEat(int kind, {unicodeRange: false}) {
+    if (_peekToken.kind == kind) {
+      _previousToken = _peekToken;
+      _peekToken = tokenizer.next(unicodeRange: unicodeRange);
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+  void _eat(int kind, {unicodeRange: false}) {
+    if (!_maybeEat(kind, unicodeRange: unicodeRange)) {
+      _errorExpected(TokenKind.kindToString(kind));
+    }
+  }
+
+  void _errorExpected(String expected) {
+    var tok = _next();
+    var message;
+    try {
+      message = 'expected $expected, but found $tok';
+    } catch (e) {
+      message = 'parsing error expected $expected';
+    }
+    _error(message, tok.span);
+  }
+
+  void _error(String message, SourceSpan location) {
+    if (location == null) {
+      location = _peekToken.span;
+    }
+    messages.error(message, location);
+  }
+
+  void _warning(String message, SourceSpan location) {
+    if (location == null) {
+      location = _peekToken.span;
+    }
+    messages.warning(message, location);
+  }
+
+  SourceSpan _makeSpan(FileSpan start) {
+    // TODO(terry): there are places where we are creating spans before we eat
+    // the tokens, so using _previousToken is not always valid.
+    // TODO(nweiz): use < rather than compareTo when SourceSpan supports it.
+    if (_previousToken == null || _previousToken.span.compareTo(start) < 0) {
+      return start;
+    }
+    return start.expand(_previousToken.span);
+  }
+
+  ///////////////////////////////////////////////////////////////////
+  // Top level productions
+  ///////////////////////////////////////////////////////////////////
+
+  /**
+   * The media_query_list production below replaces the media_list production
+   * from CSS2 the new grammar is:
+   *
+   *   media_query_list
+   *    : S* [media_query [ ',' S* media_query ]* ]?
+   *   media_query
+   *    : [ONLY | NOT]? S* media_type S* [ AND S* expression ]*
+   *    | expression [ AND S* expression ]*
+   *   media_type
+   *    : IDENT
+   *   expression
+   *    : '(' S* media_feature S* [ ':' S* expr ]? ')' S*
+   *   media_feature
+   *    : IDENT
+   */
+  List<MediaQuery> processMediaQueryList() {
+    var mediaQueries = [];
+
+    bool firstTime = true;
+    var mediaQuery;
+    do {
+      mediaQuery = processMediaQuery(firstTime == true);
+      if (mediaQuery != null) {
+        mediaQueries.add(mediaQuery);
+        firstTime = false;
+        continue;
+      }
+
+      // Any more more media types separated by comma.
+      if (!_maybeEat(TokenKind.COMMA)) break;
+
+      // Yep more media types start again.
+      firstTime = true;
+    } while ((!firstTime && mediaQuery != null) || firstTime);
+
+    return mediaQueries;
+  }
+
+  MediaQuery processMediaQuery([bool startQuery = true]) {
+    // Grammar: [ONLY | NOT]? S* media_type S*
+    //          [ AND S* MediaExpr ]* | MediaExpr [ AND S* MediaExpr ]*
+
+    var start = _peekToken.span;
+
+    // Is it a unary media operator?
+    var op = _peekToken.text;
+    var opLen = op.length;
+    var unaryOp = TokenKind.matchMediaOperator(op, 0, opLen);
+    if (unaryOp != -1) {
+      if (isChecked) {
+        if (startQuery && unaryOp != TokenKind.MEDIA_OP_NOT ||
+            unaryOp != TokenKind.MEDIA_OP_ONLY) {
+          _warning("Only the unary operators NOT and ONLY allowed",
+              _makeSpan(start));
+        }
+        if (!startQuery && unaryOp != TokenKind.MEDIA_OP_AND) {
+          _warning("Only the binary AND operator allowed", _makeSpan(start));
+        }
+      }
+      _next();
+      start = _peekToken.span;
+    }
+
+    var type;
+    if (startQuery && unaryOp != TokenKind.MEDIA_OP_AND) {
+      // Get the media type.
+      if (_peekIdentifier()) type = identifier();
+    }
+
+    var exprs = [];
+
+    if (unaryOp == -1 || unaryOp == TokenKind.MEDIA_OP_AND) {
+      var andOp = false;
+      while (true) {
+        var expr = processMediaExpression(andOp);
+        if (expr == null) break;
+
+        exprs.add(expr);
+        op = _peekToken.text;
+        opLen = op.length;
+        andOp = TokenKind.matchMediaOperator(op, 0, opLen) ==
+            TokenKind.MEDIA_OP_AND;
+        if (!andOp) break;
+        _next();
+      }
+    }
+
+    if (unaryOp != -1 || type != null || exprs.length > 0) {
+      return new MediaQuery(unaryOp, type, exprs, _makeSpan(start));
+    }
+  }
+
+  MediaExpression processMediaExpression([bool andOperator = false]) {
+    var start = _peekToken.span;
+
+    // Grammar: '(' S* media_feature S* [ ':' S* expr ]? ')' S*
+    if (_maybeEat(TokenKind.LPAREN)) {
+      if (_peekIdentifier()) {
+        var feature = identifier(); // Media feature.
+        while (_maybeEat(TokenKind.COLON)) {
+          var startExpr = _peekToken.span;
+          var exprs = processExpr();
+          if (_maybeEat(TokenKind.RPAREN)) {
+            return new MediaExpression(
+                andOperator, feature, exprs, _makeSpan(startExpr));
+          } else if (isChecked) {
+            _warning("Missing parenthesis around media expression",
+                _makeSpan(start));
+            return null;
+          }
+        }
+      } else if (isChecked) {
+        _warning("Missing media feature in media expression", _makeSpan(start));
+        return null;
+      }
+    }
+  }
+
+  /**
+   * Directive grammar:
+   *
+   *  import:             '@import' [string | URI] media_list?
+   *  media:              '@media' media_query_list '{' ruleset '}'
+   *  page:               '@page' [':' IDENT]? '{' declarations '}'
+   *  stylet:             '@stylet' IDENT '{' ruleset '}'
+   *  media_query_list:   IDENT [',' IDENT]
+   *  keyframes:          '@-webkit-keyframes ...' (see grammar below).
+   *  font_face:          '@font-face' '{' declarations '}'
+   *  namespace:          '@namespace name url("xmlns")
+   *  host:               '@host '{' ruleset '}'
+   *  mixin:              '@mixin name [(args,...)] '{' declarations/ruleset '}'
+   *  include:            '@include name [(@arg,@arg1)]
+   *                      '@include name [(@arg...)]
+   *  content             '@content'
+   */
+  processDirective() {
+    var start = _peekToken.span;
+
+    var tokId = processVariableOrDirective();
+    if (tokId is VarDefinitionDirective) return tokId;
+    switch (tokId) {
+      case TokenKind.DIRECTIVE_IMPORT:
+        _next();
+
+        // @import "uri_string" or @import url("uri_string") are identical; only
+        // a url can follow an @import.
+        String importStr;
+        if (_peekIdentifier()) {
+          var func = processFunction(identifier());
+          if (func is UriTerm) {
+            importStr = func.text;
+          }
+        } else {
+          importStr = processQuotedString(false);
+        }
+
+        // Any medias?
+        var medias = processMediaQueryList();
+
+        if (importStr == null) {
+          _error('missing import string', _peekToken.span);
+        }
+
+        return new ImportDirective(importStr.trim(), medias, _makeSpan(start));
+
+      case TokenKind.DIRECTIVE_MEDIA:
+        _next();
+
+        // Any medias?
+        var media = processMediaQueryList();
+
+        List<TreeNode> rulesets = [];
+        if (_maybeEat(TokenKind.LBRACE)) {
+          while (!_maybeEat(TokenKind.END_OF_FILE)) {
+            RuleSet ruleset = processRuleSet();
+            if (ruleset == null) break;
+            rulesets.add(ruleset);
+          }
+
+          if (!_maybeEat(TokenKind.RBRACE)) {
+            _error('expected } after ruleset for @media', _peekToken.span);
+          }
+        } else {
+          _error('expected { after media before ruleset', _peekToken.span);
+        }
+        return new MediaDirective(media, rulesets, _makeSpan(start));
+
+      case TokenKind.DIRECTIVE_HOST:
+        _next();
+
+        List<TreeNode> rulesets = [];
+        if (_maybeEat(TokenKind.LBRACE)) {
+          while (!_maybeEat(TokenKind.END_OF_FILE)) {
+            RuleSet ruleset = processRuleSet();
+            if (ruleset == null) break;
+            rulesets.add(ruleset);
+          }
+
+          if (!_maybeEat(TokenKind.RBRACE)) {
+            _error('expected } after ruleset for @host', _peekToken.span);
+          }
+        } else {
+          _error('expected { after host before ruleset', _peekToken.span);
+        }
+        return new HostDirective(rulesets, _makeSpan(start));
+
+      case TokenKind.DIRECTIVE_PAGE:
+        /*
+         * @page S* IDENT? pseudo_page?
+         *      S* '{' S*
+         *      [ declaration | margin ]?
+         *      [ ';' S* [ declaration | margin ]? ]* '}' S*
+         *
+         * pseudo_page :
+         *      ':' [ "left" | "right" | "first" ]
+         *
+         * margin :
+         *      margin_sym S* '{' declaration [ ';' S* declaration? ]* '}' S*
+         *
+         * margin_sym : @top-left-corner, @top-left, @bottom-left, etc.
+         *
+         * See http://www.w3.org/TR/css3-page/#CSS21
+         */
+        _next();
+
+        // Page name
+        var name;
+        if (_peekIdentifier()) {
+          name = identifier();
+        }
+
+        // Any pseudo page?
+        var pseudoPage;
+        if (_maybeEat(TokenKind.COLON)) {
+          if (_peekIdentifier()) {
+            pseudoPage = identifier();
+            // TODO(terry): Normalize pseudoPage to lowercase.
+            if (isChecked &&
+                !(pseudoPage.name == 'left' ||
+                    pseudoPage.name == 'right' ||
+                    pseudoPage.name == 'first')) {
+              _warning(
+                  "Pseudo page must be left, top or first", pseudoPage.span);
+              return null;
+            }
+          }
+        }
+
+        String pseudoName = pseudoPage is Identifier ? pseudoPage.name : '';
+        String ident = name is Identifier ? name.name : '';
+        return new PageDirective(
+            ident, pseudoName, processMarginsDeclarations(), _makeSpan(start));
+
+      case TokenKind.DIRECTIVE_CHARSET:
+        // @charset S* STRING S* ';'
+        _next();
+
+        var charEncoding = processQuotedString(false);
+        if (isChecked && charEncoding == null) {
+          // Missing character encoding.
+          _warning('missing character encoding string', _makeSpan(start));
+        }
+
+        return new CharsetDirective(charEncoding, _makeSpan(start));
+
+      // TODO(terry): Workaround Dart2js bug continue not implemented in switch
+      //              see https://code.google.com/p/dart/issues/detail?id=8270
+      /*
+      case TokenKind.DIRECTIVE_MS_KEYFRAMES:
+        // TODO(terry): For now only IE 10 (are base level) supports @keyframes,
+        // -moz- has only been optional since Oct 2012 release of Firefox, not
+        // all versions of webkit support @keyframes and opera doesn't yet
+        // support w/o -o- prefix.  Add more warnings for other prefixes when
+        // they become optional.
+        if (isChecked) {
+          _warning('@-ms-keyframes should be @keyframes', _makeSpan(start));
+        }
+        continue keyframeDirective;
+
+      keyframeDirective:
+      */
+      case TokenKind.DIRECTIVE_KEYFRAMES:
+      case TokenKind.DIRECTIVE_WEB_KIT_KEYFRAMES:
+      case TokenKind.DIRECTIVE_MOZ_KEYFRAMES:
+      case TokenKind.DIRECTIVE_O_KEYFRAMES:
+      // TODO(terry): Remove workaround when bug 8270 is fixed.
+      case TokenKind.DIRECTIVE_MS_KEYFRAMES:
+        if (tokId == TokenKind.DIRECTIVE_MS_KEYFRAMES && isChecked) {
+          _warning('@-ms-keyframes should be @keyframes', _makeSpan(start));
+        }
+        // TODO(terry): End of workaround.
+
+        /*  Key frames grammar:
+         *
+         *  @[browser]? keyframes [IDENT|STRING] '{' keyframes-blocks '}';
+         *
+         *  browser: [-webkit-, -moz-, -ms-, -o-]
+         *
+         *  keyframes-blocks:
+         *    [keyframe-selectors '{' declarations '}']* ;
+         *
+         *  keyframe-selectors:
+         *    ['from'|'to'|PERCENTAGE] [',' ['from'|'to'|PERCENTAGE] ]* ;
+         */
+        _next();
+
+        var name;
+        if (_peekIdentifier()) {
+          name = identifier();
+        }
+
+        _eat(TokenKind.LBRACE);
+
+        var keyframe = new KeyFrameDirective(tokId, name, _makeSpan(start));
+
+        do {
+          Expressions selectors = new Expressions(_makeSpan(start));
+
+          do {
+            var term = processTerm();
+
+            // TODO(terry): Only allow from, to and PERCENTAGE ...
+
+            selectors.add(term);
+          } while (_maybeEat(TokenKind.COMMA));
+
+          keyframe.add(new KeyFrameBlock(
+              selectors, processDeclarations(), _makeSpan(start)));
+        } while (!_maybeEat(TokenKind.RBRACE) && !isPrematureEndOfFile());
+
+        return keyframe;
+
+      case TokenKind.DIRECTIVE_FONTFACE:
+        _next();
+        return new FontFaceDirective(processDeclarations(), _makeSpan(start));
+
+      case TokenKind.DIRECTIVE_STYLET:
+        /* Stylet grammar:
+         *
+         *  @stylet IDENT '{'
+         *    ruleset
+         *  '}'
+         */
+        _next();
+
+        var name;
+        if (_peekIdentifier()) {
+          name = identifier();
+        }
+
+        _eat(TokenKind.LBRACE);
+
+        List<TreeNode> productions = [];
+
+        start = _peekToken.span;
+        while (!_maybeEat(TokenKind.END_OF_FILE)) {
+          RuleSet ruleset = processRuleSet();
+          if (ruleset == null) {
+            break;
+          }
+          productions.add(ruleset);
+        }
+
+        _eat(TokenKind.RBRACE);
+
+        return new StyletDirective(name, productions, _makeSpan(start));
+
+      case TokenKind.DIRECTIVE_NAMESPACE:
+        /* Namespace grammar:
+         *
+         * @namespace S* [namespace_prefix S*]? [STRING|URI] S* ';' S*
+         * namespace_prefix : IDENT
+         *
+         */
+        _next();
+
+        var prefix;
+        if (_peekIdentifier()) {
+          prefix = identifier();
+        }
+
+        // The namespace URI can be either a quoted string url("uri_string")
+        // are identical.
+        String namespaceUri;
+        if (_peekIdentifier()) {
+          var func = processFunction(identifier());
+          if (func is UriTerm) {
+            namespaceUri = func.text;
+          }
+        } else {
+          if (prefix != null && prefix.name == 'url') {
+            var func = processFunction(prefix);
+            if (func is UriTerm) {
+              // @namespace url("");
+              namespaceUri = func.text;
+              prefix = null;
+            }
+          } else {
+            namespaceUri = processQuotedString(false);
+          }
+        }
+
+        return new NamespaceDirective(
+            prefix != null ? prefix.name : '', namespaceUri, _makeSpan(start));
+
+      case TokenKind.DIRECTIVE_MIXIN:
+        return processMixin();
+
+      case TokenKind.DIRECTIVE_INCLUDE:
+        return processInclude(_makeSpan(start));
+
+      case TokenKind.DIRECTIVE_CONTENT:
+        // TODO(terry): TBD
+        _warning("@content not implemented.", _makeSpan(start));
+        return null;
+    }
+    return null;
+  }
+
+  /**
+   * Parse the mixin beginning token offset [start]. Returns a [MixinDefinition]
+   * node.
+   *
+   * Mixin grammar:
+   *
+   *  @mixin IDENT [(args,...)] '{'
+   *    [ruleset | property | directive]*
+   *  '}'
+   */
+  MixinDefinition processMixin() {
+    _next();
+
+    var name = identifier();
+
+    List<VarDefinitionDirective> params = [];
+    // Any parameters?
+    if (_maybeEat(TokenKind.LPAREN)) {
+      var mustHaveParam = false;
+      var keepGoing = true;
+      while (keepGoing) {
+        var varDef = processVariableOrDirective(mixinParameter: true);
+        if (varDef is VarDefinitionDirective || varDef is VarDefinition) {
+          params.add(varDef);
+        } else if (mustHaveParam) {
+          _warning("Expecting parameter", _makeSpan(_peekToken.span));
+          keepGoing = false;
+        }
+        if (_maybeEat(TokenKind.COMMA)) {
+          mustHaveParam = true;
+          continue;
+        }
+        keepGoing = !_maybeEat(TokenKind.RPAREN);
+      }
+    }
+
+    _eat(TokenKind.LBRACE);
+
+    List<TreeNode> productions = [];
+    List<TreeNode> declarations = [];
+    var mixinDirective;
+
+    var start = _peekToken.span;
+    while (!_maybeEat(TokenKind.END_OF_FILE)) {
+      var directive = processDirective();
+      if (directive != null) {
+        productions.add(directive);
+        continue;
+      }
+
+      var declGroup = processDeclarations(checkBrace: false);
+      if (declGroup.declarations.any((decl) {
+        return decl is Declaration && decl is! IncludeMixinAtDeclaration;
+      })) {
+        var newDecls = [];
+        productions.forEach((include) {
+          // If declGroup has items that are declarations then we assume
+          // this mixin is a declaration mixin not a top-level mixin.
+          if (include is IncludeDirective) {
+            newDecls.add(new IncludeMixinAtDeclaration(include, include.span));
+          } else {
+            _warning("Error mixing of top-level vs declarations mixins",
+                _makeSpan(include.span));
+          }
+        });
+        declGroup.declarations.insertAll(0, newDecls);
+        productions = [];
+      } else {
+        // Declarations are just @includes make it a list of productions
+        // not a declaration group (anything else is a ruleset).  Make it a
+        // list of productions, not a declaration group.
+        for (var decl in declGroup.declarations) {
+          productions
+              .add(decl is IncludeMixinAtDeclaration ? decl.include : decl);
+        }
+        ;
+        declGroup.declarations.clear();
+      }
+
+      if (declGroup.declarations.isNotEmpty) {
+        if (productions.isEmpty) {
+          mixinDirective = new MixinDeclarationDirective(
+              name.name, params, false, declGroup, _makeSpan(start));
+          break;
+        } else {
+          for (var decl in declGroup.declarations) {
+            productions
+                .add(decl is IncludeMixinAtDeclaration ? decl.include : decl);
+          }
+        }
+      } else {
+        mixinDirective = new MixinRulesetDirective(
+            name.name, params, false, productions, _makeSpan(start));
+        break;
+      }
+    }
+
+    if (productions.isNotEmpty) {
+      mixinDirective = new MixinRulesetDirective(
+          name.name, params, false, productions, _makeSpan(start));
+    }
+
+    _eat(TokenKind.RBRACE);
+
+    return mixinDirective;
+  }
+
+  /**
+   * Returns a VarDefinitionDirective or VarDefinition if a varaible otherwise
+   * return the token id of a directive or -1 if neither.
+   */
+  processVariableOrDirective({bool mixinParameter: false}) {
+    var start = _peekToken.span;
+
+    var tokId = _peek();
+    // Handle case for @ directive (where there's a whitespace between the @
+    // sign and the directive name.  Technically, it's not valid grammar but
+    // a number of CSS tests test for whitespace between @ and name.
+    if (tokId == TokenKind.AT) {
+      _next();
+      tokId = _peek();
+      if (_peekIdentifier()) {
+        // Is it a directive?
+        var directive = _peekToken.text;
+        var directiveLen = directive.length;
+        tokId = TokenKind.matchDirectives(directive, 0, directiveLen);
+        if (tokId == -1) {
+          tokId = TokenKind.matchMarginDirectives(directive, 0, directiveLen);
+        }
+      }
+
+      if (tokId == -1) {
+        if (messages.options.lessSupport) {
+          // Less compatibility:
+          //    @name: value;      =>    var-name: value;       (VarDefinition)
+          //    property: @name;   =>    property: var(name);   (VarUsage)
+          var name;
+          if (_peekIdentifier()) {
+            name = identifier();
+          }
+
+          Expressions exprs;
+          if (mixinParameter && _maybeEat(TokenKind.COLON)) {
+            exprs = processExpr();
+          } else if (!mixinParameter) {
+            _eat(TokenKind.COLON);
+            exprs = processExpr();
+          }
+
+          var span = _makeSpan(start);
+          return new VarDefinitionDirective(
+              new VarDefinition(name, exprs, span), span);
+        } else if (isChecked) {
+          _error('unexpected directive @$_peekToken', _peekToken.span);
+        }
+      }
+    } else if (mixinParameter && _peekToken.kind == TokenKind.VAR_DEFINITION) {
+      _next();
+      var definedName;
+      if (_peekIdentifier()) definedName = identifier();
+
+      Expressions exprs;
+      if (_maybeEat(TokenKind.COLON)) {
+        exprs = processExpr();
+      }
+
+      return new VarDefinition(definedName, exprs, _makeSpan(start));
+    }
+
+    return tokId;
+  }
+
+  IncludeDirective processInclude(SourceSpan span, {bool eatSemiColon: true}) {
+    /* Stylet grammar:
+    *
+     *  @include IDENT [(args,...)];
+     */
+    _next();
+
+    var name;
+    if (_peekIdentifier()) {
+      name = identifier();
+    }
+
+    var params = [];
+
+    // Any parameters?  Parameters can be multiple terms per argument e.g.,
+    // 3px solid yellow, green is two parameters:
+    //    1. 3px solid yellow
+    //    2. green
+    // the first has 3 terms and the second has 1 term.
+    if (_maybeEat(TokenKind.LPAREN)) {
+      var terms = [];
+      var expr;
+      var keepGoing = true;
+      while (keepGoing && (expr = processTerm()) != null) {
+        // VarUsage is returns as a list
+        terms.add(expr is List ? expr[0] : expr);
+        keepGoing = !_peekKind(TokenKind.RPAREN);
+        if (keepGoing) {
+          if (_maybeEat(TokenKind.COMMA)) {
+            params.add(terms);
+            terms = [];
+          }
+        }
+      }
+      params.add(terms);
+      _maybeEat(TokenKind.RPAREN);
+    }
+
+    if (eatSemiColon) {
+      _eat(TokenKind.SEMICOLON);
+    }
+
+    return new IncludeDirective(name.name, params, span);
+  }
+
+  RuleSet processRuleSet([SelectorGroup selectorGroup]) {
+    if (selectorGroup == null) {
+      selectorGroup = processSelectorGroup();
+    }
+    if (selectorGroup != null) {
+      return new RuleSet(
+          selectorGroup, processDeclarations(), selectorGroup.span);
+    }
+  }
+
+  /**
+   * Look ahead to see if what should be a declaration is really a selector.
+   * If it's a selector than it's a nested selector.  This support's Less'
+   * nested selector syntax (requires a look ahead). E.g.,
+   *
+   *    div {
+   *      width : 20px;
+   *      span {
+   *        color: red;
+   *      }
+   *    }
+   *
+   * Two tag name selectors div and span equivalent to:
+   *
+   *    div {
+   *      width: 20px;
+   *    }
+   *    div span {
+   *      color: red;
+   *    }
+   *
+   * Return [:null:] if no selector or [SelectorGroup] if a selector was parsed.
+   */
+  SelectorGroup _nestedSelector() {
+    Messages oldMessages = messages;
+    _createMessages();
+
+    var markedData = _mark;
+
+    // Look a head do we have a nested selector instead of a declaration?
+    SelectorGroup selGroup = processSelectorGroup();
+
+    var nestedSelector = selGroup != null &&
+        _peekKind(TokenKind.LBRACE) &&
+        messages.messages.isEmpty;
+
+    if (!nestedSelector) {
+      // Not a selector so restore the world.
+      _restore(markedData);
+      messages = oldMessages;
+      return null;
+    } else {
+      // Remember any messages from look ahead.
+      oldMessages.mergeMessages(messages);
+      messages = oldMessages;
+      return selGroup;
+    }
+  }
+
+  DeclarationGroup processDeclarations({bool checkBrace: true}) {
+    var start = _peekToken.span;
+
+    if (checkBrace) _eat(TokenKind.LBRACE);
+
+    List decls = [];
+    List dartStyles = []; // List of latest styles exposed to Dart.
+
+    do {
+      var selectorGroup = _nestedSelector();
+      while (selectorGroup != null) {
+        // Nested selector so process as a ruleset.
+        var ruleset = processRuleSet(selectorGroup);
+        decls.add(ruleset);
+        selectorGroup = _nestedSelector();
+      }
+
+      Declaration decl = processDeclaration(dartStyles);
+      if (decl != null) {
+        if (decl.hasDartStyle) {
+          var newDartStyle = decl.dartStyle;
+
+          // Replace or add latest Dart style.
+          bool replaced = false;
+          for (var i = 0; i < dartStyles.length; i++) {
+            var dartStyle = dartStyles[i];
+            if (dartStyle.isSame(newDartStyle)) {
+              dartStyles[i] = newDartStyle;
+              replaced = true;
+              break;
+            }
+          }
+          if (!replaced) {
+            dartStyles.add(newDartStyle);
+          }
+        }
+        decls.add(decl);
+      }
+    } while (_maybeEat(TokenKind.SEMICOLON));
+
+    if (checkBrace) _eat(TokenKind.RBRACE);
+
+    // Fixup declaration to only have dartStyle that are live for this set of
+    // declarations.
+    for (var decl in decls) {
+      if (decl is Declaration) {
+        if (decl.hasDartStyle && dartStyles.indexOf(decl.dartStyle) < 0) {
+          // Dart style not live, ignore these styles in this Declarations.
+          decl.dartStyle = null;
+        }
+      }
+    }
+
+    return new DeclarationGroup(decls, _makeSpan(start));
+  }
+
+  List<DeclarationGroup> processMarginsDeclarations() {
+    List groups = [];
+
+    var start = _peekToken.span;
+
+    _eat(TokenKind.LBRACE);
+
+    List<Declaration> decls = [];
+    List dartStyles = []; // List of latest styles exposed to Dart.
+
+    do {
+      switch (_peek()) {
+        case TokenKind.MARGIN_DIRECTIVE_TOPLEFTCORNER:
+        case TokenKind.MARGIN_DIRECTIVE_TOPLEFT:
+        case TokenKind.MARGIN_DIRECTIVE_TOPCENTER:
+        case TokenKind.MARGIN_DIRECTIVE_TOPRIGHT:
+        case TokenKind.MARGIN_DIRECTIVE_TOPRIGHTCORNER:
+        case TokenKind.MARGIN_DIRECTIVE_BOTTOMLEFTCORNER:
+        case TokenKind.MARGIN_DIRECTIVE_BOTTOMLEFT:
+        case TokenKind.MARGIN_DIRECTIVE_BOTTOMCENTER:
+        case TokenKind.MARGIN_DIRECTIVE_BOTTOMRIGHT:
+        case TokenKind.MARGIN_DIRECTIVE_BOTTOMRIGHTCORNER:
+        case TokenKind.MARGIN_DIRECTIVE_LEFTTOP:
+        case TokenKind.MARGIN_DIRECTIVE_LEFTMIDDLE:
+        case TokenKind.MARGIN_DIRECTIVE_LEFTBOTTOM:
+        case TokenKind.MARGIN_DIRECTIVE_RIGHTTOP:
+        case TokenKind.MARGIN_DIRECTIVE_RIGHTMIDDLE:
+        case TokenKind.MARGIN_DIRECTIVE_RIGHTBOTTOM:
+          // Margin syms processed.
+          //   margin :
+          //      margin_sym S* '{' declaration [ ';' S* declaration? ]* '}' S*
+          //
+          //      margin_sym : @top-left-corner, @top-left, @bottom-left, etc.
+          var marginSym = _peek();
+
+          _next();
+
+          var declGroup = processDeclarations();
+          if (declGroup != null) {
+            groups.add(new MarginGroup(
+                marginSym, declGroup.declarations, _makeSpan(start)));
+          }
+          break;
+        default:
+          Declaration decl = processDeclaration(dartStyles);
+          if (decl != null) {
+            if (decl.hasDartStyle) {
+              var newDartStyle = decl.dartStyle;
+
+              // Replace or add latest Dart style.
+              bool replaced = false;
+              for (var i = 0; i < dartStyles.length; i++) {
+                var dartStyle = dartStyles[i];
+                if (dartStyle.isSame(newDartStyle)) {
+                  dartStyles[i] = newDartStyle;
+                  replaced = true;
+                  break;
+                }
+              }
+              if (!replaced) {
+                dartStyles.add(newDartStyle);
+              }
+            }
+            decls.add(decl);
+          }
+          _maybeEat(TokenKind.SEMICOLON);
+          break;
+      }
+    } while (!_maybeEat(TokenKind.RBRACE) && !isPrematureEndOfFile());
+
+    // Fixup declaration to only have dartStyle that are live for this set of
+    // declarations.
+    for (var decl in decls) {
+      if (decl.hasDartStyle && dartStyles.indexOf(decl.dartStyle) < 0) {
+        // Dart style not live, ignore these styles in this Declarations.
+        decl.dartStyle = null;
+      }
+    }
+
+    if (decls.length > 0) {
+      groups.add(new DeclarationGroup(decls, _makeSpan(start)));
+    }
+
+    return groups;
+  }
+
+  SelectorGroup processSelectorGroup() {
+    List<Selector> selectors = [];
+    var start = _peekToken.span;
+
+    do {
+      Selector selector = processSelector();
+      if (selector != null) {
+        selectors.add(selector);
+      }
+    } while (_maybeEat(TokenKind.COMMA));
+
+    if (selectors.length > 0) {
+      return new SelectorGroup(selectors, _makeSpan(start));
+    }
+  }
+
+  /**
+   * Return list of selectors
+   */
+  Selector processSelector() {
+    var simpleSequences = <SimpleSelectorSequence>[];
+    var start = _peekToken.span;
+    while (true) {
+      // First item is never descendant make sure it's COMBINATOR_NONE.
+      var selectorItem = simpleSelectorSequence(simpleSequences.length == 0);
+      if (selectorItem != null) {
+        simpleSequences.add(selectorItem);
+      } else {
+        break;
+      }
+    }
+
+    if (simpleSequences.length > 0) {
+      return new Selector(simpleSequences, _makeSpan(start));
+    }
+  }
+
+  simpleSelectorSequence(bool forceCombinatorNone) {
+    var start = _peekToken.span;
+    var combinatorType = TokenKind.COMBINATOR_NONE;
+    var thisOperator = false;
+
+    switch (_peek()) {
+      case TokenKind.PLUS:
+        _eat(TokenKind.PLUS);
+        combinatorType = TokenKind.COMBINATOR_PLUS;
+        break;
+      case TokenKind.GREATER:
+        _eat(TokenKind.GREATER);
+        combinatorType = TokenKind.COMBINATOR_GREATER;
+        break;
+      case TokenKind.TILDE:
+        _eat(TokenKind.TILDE);
+        combinatorType = TokenKind.COMBINATOR_TILDE;
+        break;
+      case TokenKind.AMPERSAND:
+        _eat(TokenKind.AMPERSAND);
+        thisOperator = true;
+        break;
+    }
+
+    // Check if WHITESPACE existed between tokens if so we're descendent.
+    if (combinatorType == TokenKind.COMBINATOR_NONE && !forceCombinatorNone) {
+      if (this._previousToken != null &&
+          this._previousToken.end != this._peekToken.start) {
+        combinatorType = TokenKind.COMBINATOR_DESCENDANT;
+      }
+    }
+
+    var span = _makeSpan(start);
+    var simpleSel = thisOperator
+        ? new ElementSelector(new ThisOperator(span), span)
+        : simpleSelector();
+    if (simpleSel == null &&
+        (combinatorType == TokenKind.COMBINATOR_PLUS ||
+            combinatorType == TokenKind.COMBINATOR_GREATER ||
+            combinatorType == TokenKind.COMBINATOR_TILDE)) {
+      // For "+ &", "~ &" or "> &" a selector sequence with no name is needed
+      // so that the & will have a combinator too.  This is needed to
+      // disambiguate selector expressions:
+      //    .foo&:hover     combinator before & is NONE
+      //    .foo &          combinator before & is DESCDENDANT
+      //    .foo > &        combinator before & is GREATER
+      simpleSel = new ElementSelector(new Identifier("", span), span);
+    }
+    if (simpleSel != null) {
+      return new SimpleSelectorSequence(simpleSel, span, combinatorType);
+    }
+  }
+
+  /**
+   * Simple selector grammar:
+   *
+   *    simple_selector_sequence
+   *       : [ type_selector | universal ]
+   *         [ HASH | class | attrib | pseudo | negation ]*
+   *       | [ HASH | class | attrib | pseudo | negation ]+
+   *    type_selector
+   *       : [ namespace_prefix ]? element_name
+   *    namespace_prefix
+   *       : [ IDENT | '*' ]? '|'
+   *    element_name
+   *       : IDENT
+   *    universal
+   *       : [ namespace_prefix ]? '*'
+   *    class
+   *       : '.' IDENT
+   */
+  simpleSelector() {
+    // TODO(terry): Natalie makes a good point parsing of namespace and element
+    //              are essentially the same (asterisk or identifier) other
+    //              than the error message for element.  Should consolidate the
+    //              code.
+    // TODO(terry): Need to handle attribute namespace too.
+    var first;
+    var start = _peekToken.span;
+    switch (_peek()) {
+      case TokenKind.ASTERISK:
+        // Mark as universal namespace.
+        var tok = _next();
+        first = new Wildcard(_makeSpan(tok.span));
+        break;
+      case TokenKind.IDENTIFIER:
+        first = identifier();
+        break;
+      default:
+        // Expecting simple selector.
+        // TODO(terry): Could be a synthesized token like value, etc.
+        if (TokenKind.isKindIdentifier(_peek())) {
+          first = identifier();
+        } else if (_peekKind(TokenKind.SEMICOLON)) {
+          // Can't be a selector if we found a semi-colon.
+          return null;
+        }
+        break;
+    }
+
+    if (_maybeEat(TokenKind.NAMESPACE)) {
+      var element;
+      switch (_peek()) {
+        case TokenKind.ASTERISK:
+          // Mark as universal element
+          var tok = _next();
+          element = new Wildcard(_makeSpan(tok.span));
+          break;
+        case TokenKind.IDENTIFIER:
+          element = identifier();
+          break;
+        default:
+          _error('expected element name or universal(*), but found $_peekToken',
+              _peekToken.span);
+          break;
+      }
+
+      return new NamespaceSelector(
+          first, new ElementSelector(element, element.span), _makeSpan(start));
+    } else if (first != null) {
+      return new ElementSelector(first, _makeSpan(start));
+    } else {
+      // Check for HASH | class | attrib | pseudo | negation
+      return simpleSelectorTail();
+    }
+  }
+
+  bool _anyWhiteSpaceBeforePeekToken(int kind) {
+    if (_previousToken != null &&
+        _peekToken != null &&
+        _previousToken.kind == kind) {
+      // If end of previous token isn't same as the start of peek token then
+      // there's something between these tokens probably whitespace.
+      return _previousToken.end != _peekToken.start;
+    }
+
+    return false;
+  }
+
+  /**
+   * type_selector | universal | HASH | class | attrib | pseudo
+   */
+  simpleSelectorTail() {
+    // Check for HASH | class | attrib | pseudo | negation
+    var start = _peekToken.span;
+    switch (_peek()) {
+      case TokenKind.HASH:
+        _eat(TokenKind.HASH);
+
+        var hasWhiteSpace = false;
+        if (_anyWhiteSpaceBeforePeekToken(TokenKind.HASH)) {
+          _warning("Not a valid ID selector expected #id", _makeSpan(start));
+          hasWhiteSpace = true;
+        }
+        if (_peekIdentifier()) {
+          var id = identifier();
+          if (hasWhiteSpace) {
+            // Generate bad selector id (normalized).
+            id.name = " ${id.name}";
+          }
+          return new IdSelector(id, _makeSpan(start));
+        }
+        return null;
+      case TokenKind.DOT:
+        _eat(TokenKind.DOT);
+
+        bool hasWhiteSpace = false;
+        if (_anyWhiteSpaceBeforePeekToken(TokenKind.DOT)) {
+          _warning("Not a valid class selector expected .className",
+              _makeSpan(start));
+          hasWhiteSpace = true;
+        }
+        var id = identifier();
+        if (hasWhiteSpace) {
+          // Generate bad selector class (normalized).
+          id.name = " ${id.name}";
+        }
+        return new ClassSelector(id, _makeSpan(start));
+      case TokenKind.COLON:
+        // :pseudo-class ::pseudo-element
+        return processPseudoSelector(start);
+      case TokenKind.LBRACK:
+        return processAttribute();
+      case TokenKind.DOUBLE:
+        _error('name must start with a alpha character, but found a number',
+            _peekToken.span);
+        _next();
+        break;
+    }
+  }
+
+  processPseudoSelector(FileSpan start) {
+    // :pseudo-class ::pseudo-element
+    // TODO(terry): '::' should be token.
+    _eat(TokenKind.COLON);
+    var pseudoElement = _maybeEat(TokenKind.COLON);
+
+    // TODO(terry): If no identifier specified consider optimizing out the
+    //              : or :: and making this a normal selector.  For now,
+    //              create an empty pseudoName.
+    var pseudoName;
+    if (_peekIdentifier()) {
+      pseudoName = identifier();
+    } else {
+      return null;
+    }
+
+    // Functional pseudo?
+
+    if (_peekToken.kind == TokenKind.LPAREN) {
+      if (!pseudoElement && pseudoName.name.toLowerCase() == 'not') {
+        _eat(TokenKind.LPAREN);
+
+        // Negation :   ':NOT(' S* negation_arg S* ')'
+        var negArg = simpleSelector();
+
+        _eat(TokenKind.RPAREN);
+        return new NegationSelector(negArg, _makeSpan(start));
+      } else {
+        // Special parsing for expressions in pseudo functions.  Minus is used
+        // as operator not identifier.
+        // TODO(jmesserly): we need to flip this before we eat the "(" as the
+        // next token will be fetched when we do that. I think we should try to
+        // refactor so we don't need this boolean; it seems fragile.
+        tokenizer.inSelectorExpression = true;
+        _eat(TokenKind.LPAREN);
+
+        // Handle function expression.
+        var span = _makeSpan(start);
+        var expr = processSelectorExpression();
+
+        tokenizer.inSelectorExpression = false;
+
+        // Used during selector look-a-head if not a SelectorExpression is
+        // bad.
+        if (expr is! SelectorExpression) {
+          _errorExpected("CSS expression");
+          return null;
+        }
+
+        _eat(TokenKind.RPAREN);
+        return (pseudoElement)
+            ? new PseudoElementFunctionSelector(pseudoName, expr, span)
+            : new PseudoClassFunctionSelector(pseudoName, expr, span);
+      }
+    }
+
+    // TODO(terry): Need to handle specific pseudo class/element name and
+    // backward compatible names that are : as well as :: as well as
+    // parameters.  Current, spec uses :: for pseudo-element and : for
+    // pseudo-class.  However, CSS2.1 allows for : to specify old
+    // pseudo-elements (:first-line, :first-letter, :before and :after) any
+    // new pseudo-elements defined would require a ::.
+    return pseudoElement
+        ? new PseudoElementSelector(pseudoName, _makeSpan(start))
+        : new PseudoClassSelector(pseudoName, _makeSpan(start));
+  }
+
+  /**
+   *  In CSS3, the expressions are identifiers, strings, or of the form "an+b".
+   *
+   *    : [ [ PLUS | '-' | DIMENSION | NUMBER | STRING | IDENT ] S* ]+
+   *
+   *    num               [0-9]+|[0-9]*\.[0-9]+
+   *    PLUS              '+'
+   *    DIMENSION         {num}{ident}
+   *    NUMBER            {num}
+   */
+  processSelectorExpression() {
+    var start = _peekToken.span;
+
+    var expressions = [];
+
+    Token termToken;
+    var value;
+
+    var keepParsing = true;
+    while (keepParsing) {
+      switch (_peek()) {
+        case TokenKind.PLUS:
+          start = _peekToken.span;
+          termToken = _next();
+          expressions.add(new OperatorPlus(_makeSpan(start)));
+          break;
+        case TokenKind.MINUS:
+          start = _peekToken.span;
+          termToken = _next();
+          expressions.add(new OperatorMinus(_makeSpan(start)));
+          break;
+        case TokenKind.INTEGER:
+          termToken = _next();
+          value = int.parse(termToken.text);
+          break;
+        case TokenKind.DOUBLE:
+          termToken = _next();
+          value = double.parse(termToken.text);
+          break;
+        case TokenKind.SINGLE_QUOTE:
+          value = processQuotedString(false);
+          value = "'${_escapeString(value, single: true)}'";
+          return new LiteralTerm(value, value, _makeSpan(start));
+        case TokenKind.DOUBLE_QUOTE:
+          value = processQuotedString(false);
+          value = '"${_escapeString(value)}"';
+          return new LiteralTerm(value, value, _makeSpan(start));
+        case TokenKind.IDENTIFIER:
+          value = identifier(); // Snarf up the ident we'll remap, maybe.
+          break;
+        default:
+          keepParsing = false;
+      }
+
+      if (keepParsing && value != null) {
+        var unitTerm;
+        // Don't process the dimension if MINUS or PLUS is next.
+        if (_peek() != TokenKind.MINUS && _peek() != TokenKind.PLUS) {
+          unitTerm = processDimension(termToken, value, _makeSpan(start));
+        }
+        if (unitTerm == null) {
+          unitTerm = new LiteralTerm(value, value.name, _makeSpan(start));
+        }
+        expressions.add(unitTerm);
+
+        value = null;
+      }
+    }
+
+    return new SelectorExpression(expressions, _makeSpan(start));
+  }
+
+  //  Attribute grammar:
+  //
+  //  attributes :
+  //    '[' S* IDENT S* [ ATTRIB_MATCHES S* [ IDENT | STRING ] S* ]? ']'
+  //
+  //  ATTRIB_MATCHES :
+  //    [ '=' | INCLUDES | DASHMATCH | PREFIXMATCH | SUFFIXMATCH | SUBSTRMATCH ]
+  //
+  //  INCLUDES:         '~='
+  //
+  //  DASHMATCH:        '|='
+  //
+  //  PREFIXMATCH:      '^='
+  //
+  //  SUFFIXMATCH:      '$='
+  //
+  //  SUBSTRMATCH:      '*='
+  //
+  //
+  AttributeSelector processAttribute() {
+    var start = _peekToken.span;
+
+    if (_maybeEat(TokenKind.LBRACK)) {
+      var attrName = identifier();
+
+      int op;
+      switch (_peek()) {
+        case TokenKind.EQUALS:
+        case TokenKind.INCLUDES: // ~=
+        case TokenKind.DASH_MATCH: // |=
+        case TokenKind.PREFIX_MATCH: // ^=
+        case TokenKind.SUFFIX_MATCH: // $=
+        case TokenKind.SUBSTRING_MATCH: // *=
+          op = _peek();
+          _next();
+          break;
+        default:
+          op = TokenKind.NO_MATCH;
+      }
+
+      var value;
+      if (op != TokenKind.NO_MATCH) {
+        // Operator hit so we require a value too.
+        if (_peekIdentifier()) {
+          value = identifier();
+        } else {
+          value = processQuotedString(false);
+        }
+
+        if (value == null) {
+          _error('expected attribute value string or ident', _peekToken.span);
+        }
+      }
+
+      _eat(TokenKind.RBRACK);
+
+      return new AttributeSelector(attrName, op, value, _makeSpan(start));
+    }
+  }
+
+  //  Declaration grammar:
+  //
+  //  declaration:  property ':' expr prio?
+  //
+  //  property:  IDENT [or IE hacks]
+  //  prio:      !important
+  //  expr:      (see processExpr)
+  //
+  // Here are the ugly IE hacks we need to support:
+  //   property: expr prio? \9; - IE8 and below property, /9 before semi-colon
+  //   *IDENT                   - IE7 or below
+  //   _IDENT                   - IE6 property (automatically a valid ident)
+  //
+  Declaration processDeclaration(List dartStyles) {
+    Declaration decl;
+
+    var start = _peekToken.span;
+
+    // IE7 hack of * before property name if so the property is IE7 or below.
+    var ie7 = _peekKind(TokenKind.ASTERISK);
+    if (ie7) {
+      _next();
+    }
+
+    // IDENT ':' expr '!important'?
+    if (TokenKind.isIdentifier(_peekToken.kind)) {
+      var propertyIdent = identifier();
+
+      var ieFilterProperty = propertyIdent.name.toLowerCase() == 'filter';
+
+      _eat(TokenKind.COLON);
+
+      Expressions exprs = processExpr(ieFilterProperty);
+
+      var dartComposite = _styleForDart(propertyIdent, exprs, dartStyles);
+
+      // Handle !important (prio)
+      var importantPriority = _maybeEat(TokenKind.IMPORTANT);
+
+      decl = new Declaration(
+          propertyIdent, exprs, dartComposite, _makeSpan(start),
+          important: importantPriority, ie7: ie7);
+    } else if (_peekToken.kind == TokenKind.VAR_DEFINITION) {
+      _next();
+      var definedName;
+      if (_peekIdentifier()) definedName = identifier();
+
+      _eat(TokenKind.COLON);
+
+      Expressions exprs = processExpr();
+
+      decl = new VarDefinition(definedName, exprs, _makeSpan(start));
+    } else if (_peekToken.kind == TokenKind.DIRECTIVE_INCLUDE) {
+      // @include mixinName in the declaration area.
+      var span = _makeSpan(start);
+      var include = processInclude(span, eatSemiColon: false);
+      decl = new IncludeMixinAtDeclaration(include, span);
+    } else if (_peekToken.kind == TokenKind.DIRECTIVE_EXTEND) {
+      var simpleSequences = <TreeNode>[];
+
+      _next();
+      var span = _makeSpan(start);
+      var selector = simpleSelector();
+      if (selector == null) {
+        _warning("@extends expecting simple selector name", span);
+      } else {
+        simpleSequences.add(selector);
+      }
+      if (_peekKind(TokenKind.COLON)) {
+        var pseudoSelector = processPseudoSelector(_peekToken.span);
+        if (pseudoSelector is PseudoElementSelector ||
+            pseudoSelector is PseudoClassSelector) {
+          simpleSequences.add(pseudoSelector);
+        } else {
+          _warning("not a valid selector", span);
+        }
+      }
+      decl = new ExtendDeclaration(simpleSequences, span);
+    }
+
+    return decl;
+  }
+
+  /** List of styles exposed to the Dart UI framework. */
+  static const int _fontPartFont = 0;
+  static const int _fontPartVariant = 1;
+  static const int _fontPartWeight = 2;
+  static const int _fontPartSize = 3;
+  static const int _fontPartFamily = 4;
+  static const int _fontPartStyle = 5;
+  static const int _marginPartMargin = 6;
+  static const int _marginPartLeft = 7;
+  static const int _marginPartTop = 8;
+  static const int _marginPartRight = 9;
+  static const int _marginPartBottom = 10;
+  static const int _lineHeightPart = 11;
+  static const int _borderPartBorder = 12;
+  static const int _borderPartLeft = 13;
+  static const int _borderPartTop = 14;
+  static const int _borderPartRight = 15;
+  static const int _borderPartBottom = 16;
+  static const int _borderPartWidth = 17;
+  static const int _borderPartLeftWidth = 18;
+  static const int _borderPartTopWidth = 19;
+  static const int _borderPartRightWidth = 20;
+  static const int _borderPartBottomWidth = 21;
+  static const int _heightPart = 22;
+  static const int _widthPart = 23;
+  static const int _paddingPartPadding = 24;
+  static const int _paddingPartLeft = 25;
+  static const int _paddingPartTop = 26;
+  static const int _paddingPartRight = 27;
+  static const int _paddingPartBottom = 28;
+
+  static const Map<String, int> _stylesToDart = const {
+    'font': _fontPartFont,
+    'font-family': _fontPartFamily,
+    'font-size': _fontPartSize,
+    'font-style': _fontPartStyle,
+    'font-variant': _fontPartVariant,
+    'font-weight': _fontPartWeight,
+    'line-height': _lineHeightPart,
+    'margin': _marginPartMargin,
+    'margin-left': _marginPartLeft,
+    'margin-right': _marginPartRight,
+    'margin-top': _marginPartTop,
+    'margin-bottom': _marginPartBottom,
+    'border': _borderPartBorder,
+    'border-left': _borderPartLeft,
+    'border-right': _borderPartRight,
+    'border-top': _borderPartTop,
+    'border-bottom': _borderPartBottom,
+    'border-width': _borderPartWidth,
+    'border-left-width': _borderPartLeftWidth,
+    'border-top-width': _borderPartTopWidth,
+    'border-right-width': _borderPartRightWidth,
+    'border-bottom-width': _borderPartBottomWidth,
+    'height': _heightPart,
+    'width': _widthPart,
+    'padding': _paddingPartPadding,
+    'padding-left': _paddingPartLeft,
+    'padding-top': _paddingPartTop,
+    'padding-right': _paddingPartRight,
+    'padding-bottom': _paddingPartBottom
+  };
+
+  static const Map<String, int> _nameToFontWeight = const {
+    'bold': FontWeight.bold,
+    'normal': FontWeight.normal
+  };
+
+  static int _findStyle(String styleName) => _stylesToDart[styleName];
+
+  DartStyleExpression _styleForDart(
+      Identifier property, Expressions exprs, List dartStyles) {
+    var styleType = _findStyle(property.name.toLowerCase());
+    if (styleType != null) {
+      return buildDartStyleNode(styleType, exprs, dartStyles);
+    }
+  }
+
+  FontExpression _mergeFontStyles(FontExpression fontExpr, List dartStyles) {
+    // Merge all font styles for this class selector.
+    for (var dartStyle in dartStyles) {
+      if (dartStyle.isFont) {
+        fontExpr = new FontExpression.merge(dartStyle, fontExpr);
+      }
+    }
+
+    return fontExpr;
+  }
+
+  DartStyleExpression buildDartStyleNode(
+      int styleType, Expressions exprs, List dartStyles) {
+    switch (styleType) {
+      /*
+       * Properties in order:
+       *
+       *   font-style font-variant font-weight font-size/line-height font-family
+       *
+       * The font-size and font-family values are required. If other values are
+       * missing; a default, if it exist, will be used.
+       */
+      case _fontPartFont:
+        var processor = new ExpressionsProcessor(exprs);
+        return _mergeFontStyles(processor.processFont(), dartStyles);
+      case _fontPartFamily:
+        var processor = new ExpressionsProcessor(exprs);
+
+        try {
+          return _mergeFontStyles(processor.processFontFamily(), dartStyles);
+        } catch (fontException) {
+          _error(fontException, _peekToken.span);
+        }
+        break;
+      case _fontPartSize:
+        var processor = new ExpressionsProcessor(exprs);
+        return _mergeFontStyles(processor.processFontSize(), dartStyles);
+      case _fontPartStyle:
+        /* Possible style values:
+         *   normal [default]
+         *   italic
+         *   oblique
+         *   inherit
+         */
+        // TODO(terry): TBD
+        break;
+      case _fontPartVariant:
+        /* Possible variant values:
+         *   normal  [default]
+         *   small-caps
+         *   inherit
+         */
+        // TODO(terry): TBD
+        break;
+      case _fontPartWeight:
+        /* Possible weight values:
+         *   normal [default]
+         *   bold
+         *   bolder
+         *   lighter
+         *   100 - 900
+         *   inherit
+         */
+        // TODO(terry): Only 'normal', 'bold', or values of 100-900 supoorted
+        //              need to handle bolder, lighter, and inherit.  See
+        //              https://github.com/dart-lang/csslib/issues/1
+        var expr = exprs.expressions[0];
+        if (expr is NumberTerm) {
+          var fontExpr = new FontExpression(expr.span, weight: expr.value);
+          return _mergeFontStyles(fontExpr, dartStyles);
+        } else if (expr is LiteralTerm) {
+          int weight = _nameToFontWeight[expr.value.toString()];
+          if (weight != null) {
+            var fontExpr = new FontExpression(expr.span, weight: weight);
+            return _mergeFontStyles(fontExpr, dartStyles);
+          }
+        }
+        break;
+      case _lineHeightPart:
+        if (exprs.expressions.length == 1) {
+          var expr = exprs.expressions[0];
+          if (expr is UnitTerm) {
+            UnitTerm unitTerm = expr;
+            // TODO(terry): Need to handle other units and LiteralTerm normal
+            //              See https://github.com/dart-lang/csslib/issues/2.
+            if (unitTerm.unit == TokenKind.UNIT_LENGTH_PX ||
+                unitTerm.unit == TokenKind.UNIT_LENGTH_PT) {
+              var fontExpr = new FontExpression(expr.span,
+                  lineHeight: new LineHeight(expr.value, inPixels: true));
+              return _mergeFontStyles(fontExpr, dartStyles);
+            } else if (isChecked) {
+              _warning("Unexpected unit for line-height", expr.span);
+            }
+          } else if (expr is NumberTerm) {
+            var fontExpr = new FontExpression(expr.span,
+                lineHeight: new LineHeight(expr.value, inPixels: false));
+            return _mergeFontStyles(fontExpr, dartStyles);
+          } else if (isChecked) {
+            _warning("Unexpected value for line-height", expr.span);
+          }
+        }
+        break;
+      case _marginPartMargin:
+        return new MarginExpression.boxEdge(exprs.span, processFourNums(exprs));
+      case _borderPartBorder:
+        for (var expr in exprs.expressions) {
+          var v = marginValue(expr);
+          if (v != null) {
+            final box = new BoxEdge.uniform(v);
+            return new BorderExpression.boxEdge(exprs.span, box);
+          }
+        }
+        break;
+      case _borderPartWidth:
+        var v = marginValue(exprs.expressions[0]);
+        if (v != null) {
+          final box = new BoxEdge.uniform(v);
+          return new BorderExpression.boxEdge(exprs.span, box);
+        }
+        break;
+      case _paddingPartPadding:
+        return new PaddingExpression.boxEdge(
+            exprs.span, processFourNums(exprs));
+      case _marginPartLeft:
+      case _marginPartTop:
+      case _marginPartRight:
+      case _marginPartBottom:
+      case _borderPartLeft:
+      case _borderPartTop:
+      case _borderPartRight:
+      case _borderPartBottom:
+      case _borderPartLeftWidth:
+      case _borderPartTopWidth:
+      case _borderPartRightWidth:
+      case _borderPartBottomWidth:
+      case _heightPart:
+      case _widthPart:
+      case _paddingPartLeft:
+      case _paddingPartTop:
+      case _paddingPartRight:
+      case _paddingPartBottom:
+        if (exprs.expressions.length > 0) {
+          return processOneNumber(exprs, styleType);
+        }
+        break;
+      default:
+        // Don't handle it.
+        return null;
+    }
+  }
+
+  // TODO(terry): Look at handling width of thin, thick, etc. any none numbers
+  //              to convert to a number.
+  DartStyleExpression processOneNumber(Expressions exprs, int part) {
+    var value = marginValue(exprs.expressions[0]);
+    if (value != null) {
+      switch (part) {
+        case _marginPartLeft:
+          return new MarginExpression(exprs.span, left: value);
+        case _marginPartTop:
+          return new MarginExpression(exprs.span, top: value);
+        case _marginPartRight:
+          return new MarginExpression(exprs.span, right: value);
+        case _marginPartBottom:
+          return new MarginExpression(exprs.span, bottom: value);
+        case _borderPartLeft:
+        case _borderPartLeftWidth:
+          return new BorderExpression(exprs.span, left: value);
+        case _borderPartTop:
+        case _borderPartTopWidth:
+          return new BorderExpression(exprs.span, top: value);
+        case _borderPartRight:
+        case _borderPartRightWidth:
+          return new BorderExpression(exprs.span, right: value);
+        case _borderPartBottom:
+        case _borderPartBottomWidth:
+          return new BorderExpression(exprs.span, bottom: value);
+        case _heightPart:
+          return new HeightExpression(exprs.span, value);
+        case _widthPart:
+          return new WidthExpression(exprs.span, value);
+        case _paddingPartLeft:
+          return new PaddingExpression(exprs.span, left: value);
+        case _paddingPartTop:
+          return new PaddingExpression(exprs.span, top: value);
+        case _paddingPartRight:
+          return new PaddingExpression(exprs.span, right: value);
+        case _paddingPartBottom:
+          return new PaddingExpression(exprs.span, bottom: value);
+      }
+    }
+  }
+
+  /**
+   * Margins are of the format:
+   *
+   *   top,right,bottom,left      (4 parameters)
+   *   top,right/left, bottom     (3 parameters)
+   *   top/bottom,right/left      (2 parameters)
+   *   top/right/bottom/left      (1 parameter)
+   *
+   * The values of the margins can be a unit or unitless or auto.
+   */
+  BoxEdge processFourNums(Expressions exprs) {
+    num top;
+    num right;
+    num bottom;
+    num left;
+
+    int totalExprs = exprs.expressions.length;
+    switch (totalExprs) {
+      case 1:
+        top = marginValue(exprs.expressions[0]);
+        right = top;
+        bottom = top;
+        left = top;
+        break;
+      case 2:
+        top = marginValue(exprs.expressions[0]);
+        bottom = top;
+        right = marginValue(exprs.expressions[1]);
+        left = right;
+        break;
+      case 3:
+        top = marginValue(exprs.expressions[0]);
+        right = marginValue(exprs.expressions[1]);
+        left = right;
+        bottom = marginValue(exprs.expressions[2]);
+        break;
+      case 4:
+        top = marginValue(exprs.expressions[0]);
+        right = marginValue(exprs.expressions[1]);
+        bottom = marginValue(exprs.expressions[2]);
+        left = marginValue(exprs.expressions[3]);
+        break;
+      default:
+        return null;
+    }
+
+    return new BoxEdge.clockwiseFromTop(top, right, bottom, left);
+  }
+
+  // TODO(terry): Need to handle auto.
+  marginValue(var exprTerm) {
+    if (exprTerm is UnitTerm || exprTerm is NumberTerm) {
+      return exprTerm.value;
+    }
+  }
+
+  //  Expression grammar:
+  //
+  //  expression:   term [ operator? term]*
+  //
+  //  operator:     '/' | ','
+  //  term:         (see processTerm)
+  //
+  Expressions processExpr([bool ieFilter = false]) {
+    var start = _peekToken.span;
+    var expressions = new Expressions(_makeSpan(start));
+
+    var keepGoing = true;
+    var expr;
+    while (keepGoing && (expr = processTerm(ieFilter)) != null) {
+      var op;
+
+      var opStart = _peekToken.span;
+
+      switch (_peek()) {
+        case TokenKind.SLASH:
+          op = new OperatorSlash(_makeSpan(opStart));
+          break;
+        case TokenKind.COMMA:
+          op = new OperatorComma(_makeSpan(opStart));
+          break;
+        case TokenKind.BACKSLASH:
+          // Backslash outside of string; detected IE8 or older signaled by \9 at
+          // end of an expression.
+          var ie8Start = _peekToken.span;
+
+          _next();
+          if (_peekKind(TokenKind.INTEGER)) {
+            var numToken = _next();
+            var value = int.parse(numToken.text);
+            if (value == 9) {
+              op = new IE8Term(_makeSpan(ie8Start));
+            } else if (isChecked) {
+              _warning(
+                  "\$value is not valid in an expression", _makeSpan(start));
+            }
+          }
+          break;
+      }
+
+      if (expr != null) {
+        if (expr is List) {
+          expr.forEach((exprItem) {
+            expressions.add(exprItem);
+          });
+        } else {
+          expressions.add(expr);
+        }
+      } else {
+        keepGoing = false;
+      }
+
+      if (op != null) {
+        expressions.add(op);
+        if (op is IE8Term) {
+          keepGoing = false;
+        } else {
+          _next();
+        }
+      }
+    }
+
+    return expressions;
+  }
+
+  static const int MAX_UNICODE = 0x10FFFF;
+
+  //  Term grammar:
+  //
+  //  term:
+  //    unary_operator?
+  //    [ term_value ]
+  //    | STRING S* | IDENT S* | URI S* | UNICODERANGE S* | hexcolor
+  //
+  //  term_value:
+  //    NUMBER S* | PERCENTAGE S* | LENGTH S* | EMS S* | EXS S* | ANGLE S* |
+  //    TIME S* | FREQ S* | function
+  //
+  //  NUMBER:       {num}
+  //  PERCENTAGE:   {num}%
+  //  LENGTH:       {num}['px' | 'cm' | 'mm' | 'in' | 'pt' | 'pc']
+  //  EMS:          {num}'em'
+  //  EXS:          {num}'ex'
+  //  ANGLE:        {num}['deg' | 'rad' | 'grad']
+  //  TIME:         {num}['ms' | 's']
+  //  FREQ:         {num}['hz' | 'khz']
+  //  function:     IDENT '(' expr ')'
+  //
+  processTerm([bool ieFilter = false]) {
+    var start = _peekToken.span;
+    Token t; // token for term's value
+    var value; // value of term (numeric values)
+
+    var unary = "";
+    switch (_peek()) {
+      case TokenKind.HASH:
+        this._eat(TokenKind.HASH);
+        if (!_anyWhiteSpaceBeforePeekToken(TokenKind.HASH)) {
+          String hexText;
+          if (_peekKind(TokenKind.INTEGER)) {
+            String hexText1 = _peekToken.text;
+            _next();
+            if (_peekIdentifier()) {
+              hexText = '$hexText1${identifier().name}';
+            } else {
+              hexText = hexText1;
+            }
+          } else if (_peekIdentifier()) {
+            hexText = identifier().name;
+          }
+          if (hexText != null) {
+            return _parseHex(hexText, _makeSpan(start));
+          }
+        }
+
+        if (isChecked) {
+          _warning("Expected hex number", _makeSpan(start));
+        }
+        // Construct the bad hex value with a #<space>number.
+        return _parseHex(" ${processTerm().text}", _makeSpan(start));
+      case TokenKind.INTEGER:
+        t = _next();
+        value = int.parse("${unary}${t.text}");
+        break;
+      case TokenKind.DOUBLE:
+        t = _next();
+        value = double.parse("${unary}${t.text}");
+        break;
+      case TokenKind.SINGLE_QUOTE:
+        value = processQuotedString(false);
+        value = "'${_escapeString(value, single: true)}'";
+        return new LiteralTerm(value, value, _makeSpan(start));
+      case TokenKind.DOUBLE_QUOTE:
+        value = processQuotedString(false);
+        value = '"${_escapeString(value)}"';
+        return new LiteralTerm(value, value, _makeSpan(start));
+      case TokenKind.LPAREN:
+        _next();
+
+        GroupTerm group = new GroupTerm(_makeSpan(start));
+
+        var term;
+        do {
+          term = processTerm();
+          if (term != null && term is LiteralTerm) {
+            group.add(term);
+          }
+        } while (term != null &&
+            !_maybeEat(TokenKind.RPAREN) &&
+            !isPrematureEndOfFile());
+
+        return group;
+      case TokenKind.LBRACK:
+        _next();
+
+        var term = processTerm();
+        if (!(term is NumberTerm)) {
+          _error('Expecting a positive number', _makeSpan(start));
+        }
+
+        _eat(TokenKind.RBRACK);
+
+        return new ItemTerm(term.value, term.text, _makeSpan(start));
+      case TokenKind.IDENTIFIER:
+        var nameValue = identifier(); // Snarf up the ident we'll remap, maybe.
+
+        if (!ieFilter && _maybeEat(TokenKind.LPAREN)) {
+          // FUNCTION
+          return processFunction(nameValue);
+        }
+        if (ieFilter) {
+          if (_maybeEat(TokenKind.COLON) &&
+              nameValue.name.toLowerCase() == 'progid') {
+            // IE filter:progid:
+            return processIEFilter(start);
+          } else {
+            // Handle filter:<name> where name is any filter e.g., alpha, chroma,
+            // Wave, blur, etc.
+            return processIEFilter(start);
+          }
+        }
+
+        // TODO(terry): Need to have a list of known identifiers today only
+        //              'from' is special.
+        if (nameValue.name == 'from') {
+          return new LiteralTerm(nameValue, nameValue.name, _makeSpan(start));
+        }
+
+        // What kind of identifier is it, named color?
+        var colorEntry = TokenKind.matchColorName(nameValue.name);
+        if (colorEntry == null) {
+          if (isChecked) {
+            var propName = nameValue.name;
+            var errMsg = TokenKind.isPredefinedName(propName)
+                ? "Improper use of property value ${propName}"
+                : "Unknown property value ${propName}";
+            _warning(errMsg, _makeSpan(start));
+          }
+          return new LiteralTerm(nameValue, nameValue.name, _makeSpan(start));
+        }
+
+        // Yes, process the color as an RGB value.
+        var rgbColor =
+            TokenKind.decimalToHex(TokenKind.colorValue(colorEntry), 6);
+        return _parseHex(rgbColor, _makeSpan(start));
+      case TokenKind.UNICODE_RANGE:
+        var first;
+        var second;
+        var firstNumber;
+        var secondNumber;
+        _eat(TokenKind.UNICODE_RANGE, unicodeRange: true);
+        if (_maybeEat(TokenKind.HEX_INTEGER, unicodeRange: true)) {
+          first = _previousToken.text;
+          firstNumber = int.parse('0x$first');
+          if (firstNumber > MAX_UNICODE) {
+            _error("unicode range must be less than 10FFFF", _makeSpan(start));
+          }
+          if (_maybeEat(TokenKind.MINUS, unicodeRange: true)) {
+            if (_maybeEat(TokenKind.HEX_INTEGER, unicodeRange: true)) {
+              second = _previousToken.text;
+              secondNumber = int.parse('0x$second');
+              if (secondNumber > MAX_UNICODE) {
+                _error(
+                    "unicode range must be less than 10FFFF", _makeSpan(start));
+              }
+              if (firstNumber > secondNumber) {
+                _error("unicode first range can not be greater than last",
+                    _makeSpan(start));
+              }
+            }
+          }
+        } else if (_maybeEat(TokenKind.HEX_RANGE, unicodeRange: true)) {
+          first = _previousToken.text;
+        }
+
+        return new UnicodeRangeTerm(first, second, _makeSpan(start));
+      case TokenKind.AT:
+        if (messages.options.lessSupport) {
+          _next();
+
+          var expr = processExpr();
+          if (isChecked && expr.expressions.length > 1) {
+            _error("only @name for Less syntax", _peekToken.span);
+          }
+
+          var param = expr.expressions[0];
+          var varUsage = new VarUsage(param.text, [], _makeSpan(start));
+          expr.expressions[0] = varUsage;
+          return expr.expressions;
+        }
+        break;
+    }
+
+    return processDimension(t, value, _makeSpan(start));
+  }
+
+  /** Process all dimension units. */
+  LiteralTerm processDimension(Token t, var value, SourceSpan span) {
+    LiteralTerm term;
+    var unitType = this._peek();
+
+    switch (unitType) {
+      case TokenKind.UNIT_EM:
+        term = new EmTerm(value, t.text, span);
+        _next(); // Skip the unit
+        break;
+      case TokenKind.UNIT_EX:
+        term = new ExTerm(value, t.text, span);
+        _next(); // Skip the unit
+        break;
+      case TokenKind.UNIT_LENGTH_PX:
+      case TokenKind.UNIT_LENGTH_CM:
+      case TokenKind.UNIT_LENGTH_MM:
+      case TokenKind.UNIT_LENGTH_IN:
+      case TokenKind.UNIT_LENGTH_PT:
+      case TokenKind.UNIT_LENGTH_PC:
+        term = new LengthTerm(value, t.text, span, unitType);
+        _next(); // Skip the unit
+        break;
+      case TokenKind.UNIT_ANGLE_DEG:
+      case TokenKind.UNIT_ANGLE_RAD:
+      case TokenKind.UNIT_ANGLE_GRAD:
+      case TokenKind.UNIT_ANGLE_TURN:
+        term = new AngleTerm(value, t.text, span, unitType);
+        _next(); // Skip the unit
+        break;
+      case TokenKind.UNIT_TIME_MS:
+      case TokenKind.UNIT_TIME_S:
+        term = new TimeTerm(value, t.text, span, unitType);
+        _next(); // Skip the unit
+        break;
+      case TokenKind.UNIT_FREQ_HZ:
+      case TokenKind.UNIT_FREQ_KHZ:
+        term = new FreqTerm(value, t.text, span, unitType);
+        _next(); // Skip the unit
+        break;
+      case TokenKind.PERCENT:
+        term = new PercentageTerm(value, t.text, span);
+        _next(); // Skip the %
+        break;
+      case TokenKind.UNIT_FRACTION:
+        term = new FractionTerm(value, t.text, span);
+        _next(); // Skip the unit
+        break;
+      case TokenKind.UNIT_RESOLUTION_DPI:
+      case TokenKind.UNIT_RESOLUTION_DPCM:
+      case TokenKind.UNIT_RESOLUTION_DPPX:
+        term = new ResolutionTerm(value, t.text, span, unitType);
+        _next(); // Skip the unit
+        break;
+      case TokenKind.UNIT_CH:
+        term = new ChTerm(value, t.text, span, unitType);
+        _next(); // Skip the unit
+        break;
+      case TokenKind.UNIT_REM:
+        term = new RemTerm(value, t.text, span, unitType);
+        _next(); // Skip the unit
+        break;
+      case TokenKind.UNIT_VIEWPORT_VW:
+      case TokenKind.UNIT_VIEWPORT_VH:
+      case TokenKind.UNIT_VIEWPORT_VMIN:
+      case TokenKind.UNIT_VIEWPORT_VMAX:
+        term = new ViewportTerm(value, t.text, span, unitType);
+        _next(); // Skip the unit
+        break;
+      default:
+        if (value != null && t != null) {
+          term = (value is Identifier)
+              ? new LiteralTerm(value, value.name, span)
+              : new NumberTerm(value, t.text, span);
+        }
+        break;
+    }
+
+    return term;
+  }
+
+  String processQuotedString([bool urlString = false]) {
+    var start = _peekToken.span;
+
+    // URI term sucks up everything inside of quotes(' or ") or between parens
+    var stopToken = urlString ? TokenKind.RPAREN : -1;
+
+    // Note: disable skipping whitespace tokens inside a string.
+    // TODO(jmesserly): the layering here feels wrong.
+    var inString = tokenizer._inString;
+    tokenizer._inString = false;
+
+    switch (_peek()) {
+      case TokenKind.SINGLE_QUOTE:
+        stopToken = TokenKind.SINGLE_QUOTE;
+        _next(); // Skip the SINGLE_QUOTE.
+        start = _peekToken.span;
+        break;
+      case TokenKind.DOUBLE_QUOTE:
+        stopToken = TokenKind.DOUBLE_QUOTE;
+        _next(); // Skip the DOUBLE_QUOTE.
+        start = _peekToken.span;
+        break;
+      default:
+        if (urlString) {
+          if (_peek() == TokenKind.LPAREN) {
+            _next(); // Skip the LPAREN.
+            start = _peekToken.span;
+          }
+          stopToken = TokenKind.RPAREN;
+        } else {
+          _error('unexpected string', _makeSpan(start));
+        }
+        break;
+    }
+
+    // Gobble up everything until we hit our stop token.
+    var stringValue = new StringBuffer();
+    while (_peek() != stopToken && _peek() != TokenKind.END_OF_FILE) {
+      stringValue.write(_next().text);
+    }
+
+    tokenizer._inString = inString;
+
+    // All characters between quotes is the string.
+    if (stopToken != TokenKind.RPAREN) {
+      _next(); // Skip the SINGLE_QUOTE or DOUBLE_QUOTE;
+    }
+
+    return stringValue.toString();
+  }
+
+  // TODO(terry): Should probably understand IE's non-standard filter syntax to
+  //              fully support calc, var(), etc.
+  /**
+   * IE's filter property breaks CSS value parsing.  IE's format can be:
+   *
+   *    filter: progid:DXImageTransform.MS.gradient(Type=0, Color='#9d8b83');
+   *
+   * We'll just parse everything after the 'progid:' look for the left paren
+   * then parse to the right paren ignoring everything in between.
+   */
+  processIEFilter(FileSpan startAfterProgidColon) {
+    var parens = 0;
+
+    while (_peek() != TokenKind.END_OF_FILE) {
+      switch (_peek()) {
+        case TokenKind.LPAREN:
+          _eat(TokenKind.LPAREN);
+          parens++;
+          break;
+        case TokenKind.RPAREN:
+          _eat(TokenKind.RPAREN);
+          if (--parens == 0) {
+            var tok = tokenizer.makeIEFilter(
+                startAfterProgidColon.start.offset, _peekToken.start);
+            return new LiteralTerm(tok.text, tok.text, tok.span);
+          }
+          break;
+        default:
+          _eat(_peek());
+      }
+    }
+  }
+
+  //  Function grammar:
+  //
+  //  function:     IDENT '(' expr ')'
+  //
+  processFunction(Identifier func) {
+    var start = _peekToken.span;
+
+    var name = func.name;
+
+    switch (name) {
+      case 'url':
+        // URI term sucks up everything inside of quotes(' or ") or between parens
+        var urlParam = processQuotedString(true);
+
+        // TODO(terry): Better error messge and checking for mismatched quotes.
+        if (_peek() == TokenKind.END_OF_FILE) {
+          _error("problem parsing URI", _peekToken.span);
+        }
+
+        if (_peek() == TokenKind.RPAREN) {
+          _next();
+        }
+
+        return new UriTerm(urlParam, _makeSpan(start));
+      case 'calc':
+        // TODO(terry): Implement expression handling...
+        break;
+      case 'var':
+        // TODO(terry): Consider handling var in IE specific filter/progid.  This
+        //              will require parsing entire IE specific syntax e.g.,
+        //              param = value or progid:com_id, etc. for example:
+        //
+        //    var-blur: Blur(Add = 0, Direction = 225, Strength = 10);
+        //    var-gradient: progid:DXImageTransform.Microsoft.gradient"
+        //      (GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');
+        var expr = processExpr();
+        if (!_maybeEat(TokenKind.RPAREN)) {
+          _error("problem parsing var expected ), ", _peekToken.span);
+        }
+        if (isChecked &&
+            expr.expressions.where((e) => e is OperatorComma).length > 1) {
+          _error("too many parameters to var()", _peekToken.span);
+        }
+
+        var paramName = expr.expressions[0].text;
+
+        // [0] - var name, [1] - OperatorComma, [2] - default value.
+        var defaultValues =
+            expr.expressions.length >= 3 ? expr.expressions.sublist(2) : [];
+        return new VarUsage(paramName, defaultValues, _makeSpan(start));
+      default:
+        var expr = processExpr();
+        if (!_maybeEat(TokenKind.RPAREN)) {
+          _error("problem parsing function expected ), ", _peekToken.span);
+        }
+
+        return new FunctionTerm(name, name, expr, _makeSpan(start));
+    }
+
+    return null;
+  }
+
+  Identifier identifier() {
+    var tok = _next();
+
+    if (!TokenKind.isIdentifier(tok.kind) &&
+        !TokenKind.isKindIdentifier(tok.kind)) {
+      if (isChecked) {
+        _warning('expected identifier, but found $tok', tok.span);
+      }
+      return new Identifier("", _makeSpan(tok.span));
+    }
+
+    return new Identifier(tok.text, _makeSpan(tok.span));
+  }
+
+  // TODO(terry): Move this to base <= 36 and into shared code.
+  static int _hexDigit(int c) {
+    if (c >= 48 /*0*/ && c <= 57 /*9*/) {
+      return c - 48;
+    } else if (c >= 97 /*a*/ && c <= 102 /*f*/) {
+      return c - 87;
+    } else if (c >= 65 /*A*/ && c <= 70 /*F*/) {
+      return c - 55;
+    } else {
+      return -1;
+    }
+  }
+
+  HexColorTerm _parseHex(String hexText, SourceSpan span) {
+    var hexValue = 0;
+
+    for (var i = 0; i < hexText.length; i++) {
+      var digit = _hexDigit(hexText.codeUnitAt(i));
+      if (digit < 0) {
+        _warning('Bad hex number', span);
+        return new HexColorTerm(new BAD_HEX_VALUE(), hexText, span);
+      }
+      hexValue = (hexValue << 4) + digit;
+    }
+
+    // Make 3 character hex value #RRGGBB => #RGB iff:
+    // high/low nibble of RR is the same, high/low nibble of GG is the same and
+    // high/low nibble of BB is the same.
+    if (hexText.length == 6 &&
+        hexText[0] == hexText[1] &&
+        hexText[2] == hexText[3] &&
+        hexText[4] == hexText[5]) {
+      hexText = '${hexText[0]}${hexText[2]}${hexText[4]}';
+    } else if (hexText.length == 4 &&
+        hexText[0] == hexText[1] &&
+        hexText[2] == hexText[3]) {
+      hexText = '${hexText[0]}${hexText[2]}';
+    } else if (hexText.length == 2 && hexText[0] == hexText[1]) {
+      hexText = '${hexText[0]}';
+    }
+    return new HexColorTerm(hexValue, hexText, span);
+  }
+}
+
+class ExpressionsProcessor {
+  final Expressions _exprs;
+  int _index = 0;
+
+  ExpressionsProcessor(this._exprs);
+
+  // TODO(terry): Only handles ##px unit.
+  FontExpression processFontSize() {
+    /* font-size[/line-height]
+     *
+     * Possible size values:
+     *   xx-small
+     *   small
+     *   medium [default]
+     *   large
+     *   x-large
+     *   xx-large
+     *   smaller
+     *   larger
+     *   ##length in px, pt, etc.
+     *   ##%, percent of parent elem's font-size
+     *   inherit
+     */
+    LengthTerm size;
+    LineHeight lineHt;
+    var nextIsLineHeight = false;
+    for (; _index < _exprs.expressions.length; _index++) {
+      var expr = _exprs.expressions[_index];
+      if (size == null && expr is LengthTerm) {
+        // font-size part.
+        size = expr;
+      } else if (size != null) {
+        if (expr is OperatorSlash) {
+          // LineHeight could follow?
+          nextIsLineHeight = true;
+        } else if (nextIsLineHeight && expr is LengthTerm) {
+          assert(expr.unit == TokenKind.UNIT_LENGTH_PX);
+          lineHt = new LineHeight(expr.value, inPixels: true);
+          nextIsLineHeight = false;
+          _index++;
+          break;
+        } else {
+          break;
+        }
+      } else {
+        break;
+      }
+    }
+
+    return new FontExpression(_exprs.span, size: size, lineHeight: lineHt);
+  }
+
+  FontExpression processFontFamily() {
+    var family = <String>[];
+
+    /* Possible family values:
+     * font-family: arial, Times new roman ,Lucida Sans Unicode,Courier;
+     * font-family: "Times New Roman", arial, Lucida Sans Unicode, Courier;
+     */
+    var moreFamilies = false;
+
+    for (; _index < _exprs.expressions.length; _index++) {
+      Expression expr = _exprs.expressions[_index];
+      if (expr is LiteralTerm) {
+        if (family.length == 0 || moreFamilies) {
+          // It's font-family now.
+          family.add(expr.toString());
+          moreFamilies = false;
+        } else if (isChecked) {
+          messages.warning('Only font-family can be a list', _exprs.span);
+        }
+      } else if (expr is OperatorComma && family.length > 0) {
+        moreFamilies = true;
+      } else {
+        break;
+      }
+    }
+
+    return new FontExpression(_exprs.span, family: family);
+  }
+
+  FontExpression processFont() {
+    // Process all parts of the font expression.
+    FontExpression fontSize;
+    FontExpression fontFamily;
+    for (; _index < _exprs.expressions.length; _index++) {
+      // Order is font-size font-family
+      if (fontSize == null) {
+        fontSize = processFontSize();
+      }
+      if (fontFamily == null) {
+        fontFamily = processFontFamily();
+      }
+      //TODO(terry): Handle font-weight, font-style, and font-variant. See
+      //               https://github.com/dart-lang/csslib/issues/3
+      //               https://github.com/dart-lang/csslib/issues/4
+      //               https://github.com/dart-lang/csslib/issues/5
+    }
+
+    return new FontExpression(_exprs.span,
+        size: fontSize.font.size,
+        lineHeight: fontSize.font.lineHeight,
+        family: fontFamily.font.family);
+  }
+}
+
+/**
+ * Escapes [text] for use in a CSS string.
+ * [single] specifies single quote `'` vs double quote `"`.
+ */
+String _escapeString(String text, {bool single: false}) {
+  StringBuffer result = null;
+
+  for (int i = 0; i < text.length; i++) {
+    var code = text.codeUnitAt(i);
+    String replace = null;
+    switch (code) {
+      case 34 /*'"'*/ :
+        if (!single) replace = r'\"';
+        break;
+      case 39 /*"'"*/ :
+        if (single) replace = r"\'";
+        break;
+    }
+
+    if (replace != null && result == null) {
+      result = new StringBuffer(text.substring(0, i));
+    }
+
+    if (result != null) result.write(replace != null ? replace : text[i]);
+  }
+
+  return result == null ? text : result.toString();
+}
diff --git a/mojo/public/dart/third_party/csslib/lib/src/analyzer.dart b/mojo/public/dart/third_party/csslib/lib/src/analyzer.dart
new file mode 100644
index 0000000..4fdd833
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/lib/src/analyzer.dart
@@ -0,0 +1,1015 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of csslib.parser;
+
+// TODO(terry): Add optimizing phase to remove duplicated selectors in the same
+//              selector group (e.g., .btn, .btn { color: red; }).  Also, look
+//              at simplifying selectors expressions too (much harder).
+// TODO(terry): Detect invalid directive usage.  All @imports must occur before
+//              all rules other than @charset directive.  Any @import directive
+//              after any non @charset or @import directive are ignored. e.g.,
+//                  @import "a.css";
+//                  div { color: red; }
+//                  @import "b.css";
+//              becomes:
+//                  @import "a.css";
+//                  div { color: red; }
+// <http://www.w3.org/TR/css3-syntax/#at-rules>
+
+/**
+ * Analysis phase will validate/fixup any new CSS feature or any SASS style
+ * feature.
+ */
+class Analyzer {
+  final List<StyleSheet> _styleSheets;
+  final Messages _messages;
+
+  Analyzer(this._styleSheets, this._messages);
+
+  // TODO(terry): Currently each feature walks the AST each time.  Once we have
+  //               our complete feature set consider benchmarking the cost and
+  //               possibly combine in one walk.
+  void run() {
+    // Expand top-level @include.
+    _styleSheets.forEach(
+        (styleSheet) => TopLevelIncludes.expand(_messages, _styleSheets));
+
+    // Expand @include in declarations.
+    _styleSheets.forEach(
+        (styleSheet) => DeclarationIncludes.expand(_messages, _styleSheets));
+
+    // Remove all @mixin and @include
+    _styleSheets.forEach((styleSheet) => MixinsAndIncludes.remove(styleSheet));
+
+    // Expand any nested selectors using selector desendant combinator to
+    // signal CSS inheritance notation.
+    _styleSheets.forEach((styleSheet) => new ExpandNestedSelectors()
+      ..visitStyleSheet(styleSheet)
+      ..flatten(styleSheet));
+
+    // Expand any @extend.
+    _styleSheets.forEach((styleSheet) {
+      var allExtends = new AllExtends()..visitStyleSheet(styleSheet);
+      new InheritExtends(_messages, allExtends)..visitStyleSheet(styleSheet);
+    });
+  }
+}
+
+/**
+ * Traverse all rulesets looking for nested ones.  If a ruleset is in a
+ * declaration group (implies nested selector) then generate new ruleset(s) at
+ * level 0 of CSS using selector inheritance syntax (flattens the nesting).
+ *
+ * How the AST works for a rule [RuleSet] and nested rules.  First of all a
+ * CSS rule [RuleSet] consist of a selector and a declaration e.g.,
+ *
+ *    selector {
+ *      declaration
+ *    }
+ *
+ * AST structure of a [RuleSet] is:
+ *
+ *    RuleSet
+ *       SelectorGroup
+ *         List<Selector>
+ *            List<SimpleSelectorSequence>
+ *              Combinator      // +, >, ~, DESCENDENT, or NONE
+ *              SimpleSelector  // class, id, element, namespace, attribute
+ *        DeclarationGroup
+ *          List                // Declaration or RuleSet
+ *
+ * For the simple rule:
+ *
+ *    div + span { color: red; }
+ *
+ * the AST [RuleSet] is:
+ *
+ *    RuleSet
+ *       SelectorGroup
+ *         List<Selector>
+ *          [0]
+ *            List<SimpleSelectorSequence>
+ *              [0] Combinator = COMBINATOR_NONE
+ *                  ElementSelector (name = div)
+ *              [1] Combinator = COMBINATOR_PLUS
+ *                  ElementSelector (name = span)
+ *        DeclarationGroup
+ *          List                // Declarations or RuleSets
+ *            [0]
+ *              Declaration (property = color, expression = red)
+ *
+ * Usually a SelectorGroup contains 1 Selector.  Consider the selectors:
+ *
+ *    div { color: red; }
+ *    a { color: red; }
+ *
+ * are equivalent to
+ *
+ *    div, a { color : red; }
+ *
+ * In the above the RuleSet would have a SelectorGroup with 2 selectors e.g.,
+ *
+ *    RuleSet
+ *       SelectorGroup
+ *         List<Selector>
+ *          [0]
+ *            List<SimpleSelectorSequence>
+ *              [0] Combinator = COMBINATOR_NONE
+ *                  ElementSelector (name = div)
+ *          [1]
+ *            List<SimpleSelectorSequence>
+ *              [0] Combinator = COMBINATOR_NONE
+ *                  ElementSelector (name = a)
+ *        DeclarationGroup
+ *          List                // Declarations or RuleSets
+ *            [0]
+ *              Declaration (property = color, expression = red)
+ *
+ * For a nested rule e.g.,
+ *
+ *    div {
+ *      color : blue;
+ *      a { color : red; }
+ *    }
+ *
+ * Would map to the follow CSS rules:
+ *
+ *    div { color: blue; }
+ *    div a { color: red; }
+ *
+ * The AST for the former nested rule is:
+ *
+ *    RuleSet
+ *       SelectorGroup
+ *         List<Selector>
+ *          [0]
+ *            List<SimpleSelectorSequence>
+ *              [0] Combinator = COMBINATOR_NONE
+ *                  ElementSelector (name = div)
+ *        DeclarationGroup
+ *          List                // Declarations or RuleSets
+ *            [0]
+ *              Declaration (property = color, expression = blue)
+ *            [1]
+ *              RuleSet
+ *                SelectorGroup
+ *                  List<Selector>
+ *                    [0]
+ *                      List<SimpleSelectorSequence>
+ *                        [0] Combinator = COMBINATOR_NONE
+ *                            ElementSelector (name = a)
+ *                DeclarationGroup
+ *                  List                // Declarations or RuleSets
+ *                    [0]
+ *                      Declaration (property = color, expression = red)
+ *
+ * Nested rules is a terse mechanism to describe CSS inheritance.  The analyzer
+ * will flatten and expand the nested rules to it's flatten strucure.  Using the
+ * all parent [RuleSets] (selector expressions) and applying each nested
+ * [RuleSet] to the list of [Selectors] in a [SelectorGroup].
+ *
+ * Then result is a style sheet where all nested rules have been flatten and
+ * expanded.
+ */
+class ExpandNestedSelectors extends Visitor {
+  /** Parent [RuleSet] if a nested rule otherwise [:null:]. */
+  RuleSet _parentRuleSet;
+
+  /** Top-most rule if nested rules. */
+  SelectorGroup _topLevelSelectorGroup;
+
+  /** SelectorGroup at each nesting level. */
+  SelectorGroup _nestedSelectorGroup;
+
+  /** Declaration (sans the nested selectors). */
+  DeclarationGroup _flatDeclarationGroup;
+
+  /** Each nested selector get's a flatten RuleSet. */
+  List<RuleSet> _expandedRuleSets = [];
+
+  /** Maping of a nested rule set to the fully expanded list of RuleSet(s). */
+  final Map<RuleSet, List<RuleSet>> _expansions = new Map();
+
+  void visitRuleSet(RuleSet node) {
+    final oldParent = _parentRuleSet;
+
+    var oldNestedSelectorGroups = _nestedSelectorGroup;
+
+    if (_nestedSelectorGroup == null) {
+      // Create top-level selector (may have nested rules).
+      final newSelectors = node.selectorGroup.selectors.toList();
+      _topLevelSelectorGroup = new SelectorGroup(newSelectors, node.span);
+      _nestedSelectorGroup = _topLevelSelectorGroup;
+    } else {
+      // Generate new selector groups from the nested rules.
+      _nestedSelectorGroup = _mergeToFlatten(node);
+    }
+
+    _parentRuleSet = node;
+
+    super.visitRuleSet(node);
+
+    _parentRuleSet = oldParent;
+
+    // Remove nested rules; they're all flatten and in the _expandedRuleSets.
+    node.declarationGroup.declarations
+        .removeWhere((declaration) => declaration is RuleSet);
+
+    _nestedSelectorGroup = oldNestedSelectorGroups;
+
+    // If any expandedRuleSets and we're back at the top-level rule set then
+    // there were nested rule set(s).
+    if (_parentRuleSet == null) {
+      if (!_expandedRuleSets.isEmpty) {
+        // Remember ruleset to replace with these flattened rulesets.
+        _expansions[node] = _expandedRuleSets;
+        _expandedRuleSets = [];
+      }
+      assert(_flatDeclarationGroup == null);
+      assert(_nestedSelectorGroup == null);
+    }
+  }
+
+  /**
+   * Build up the list of all inherited sequences from the parent selector
+   * [node] is the current nested selector and it's parent is the last entry in
+   * the [_nestedSelectorGroup].
+   */
+  SelectorGroup _mergeToFlatten(RuleSet node) {
+    // Create a new SelectorGroup for this nesting level.
+    var nestedSelectors = _nestedSelectorGroup.selectors;
+    var selectors = node.selectorGroup.selectors;
+
+    // Create a merged set of previous parent selectors and current selectors.
+    var newSelectors = [];
+    for (Selector selector in selectors) {
+      for (Selector nestedSelector in nestedSelectors) {
+        var seq = _mergeNestedSelector(nestedSelector.simpleSelectorSequences,
+            selector.simpleSelectorSequences);
+        newSelectors.add(new Selector(seq, node.span));
+      }
+    }
+
+    return new SelectorGroup(newSelectors, node.span);
+  }
+
+  /**
+   * Merge the nested selector sequences [current] to the [parent] sequences or
+   * substitue any & with the parent selector.
+   */
+  List<SimpleSelectorSequence> _mergeNestedSelector(
+      List<SimpleSelectorSequence> parent,
+      List<SimpleSelectorSequence> current) {
+
+    // If any & operator then the parent selector will be substituted otherwise
+    // the parent selector is pre-pended to the current selector.
+    var hasThis = current.any((s) => s.simpleSelector.isThis);
+
+    var newSequence = [];
+
+    if (!hasThis) {
+      // If no & in the sector group then prefix with the parent selector.
+      newSequence.addAll(parent);
+      newSequence.addAll(_convertToDescendentSequence(current));
+    } else {
+      for (var sequence in current) {
+        if (sequence.simpleSelector.isThis) {
+          // Substitue the & with the parent selector and only use a combinator
+          // descendant if & is prefix by a sequence with an empty name e.g.,
+          // "... + &", "&", "... ~ &", etc.
+          var hasPrefix = !newSequence.isEmpty &&
+              !newSequence.last.simpleSelector.name.isEmpty;
+          newSequence.addAll(
+              hasPrefix ? _convertToDescendentSequence(parent) : parent);
+        } else {
+          newSequence.add(sequence);
+        }
+      }
+    }
+
+    return newSequence;
+  }
+
+  /**
+   * Return selector sequences with first sequence combinator being a
+   * descendant.  Used for nested selectors when the parent selector needs to
+   * be prefixed to a nested selector or to substitute the this (&) with the
+   * parent selector.
+   */
+  List<SimpleSelectorSequence> _convertToDescendentSequence(
+      List<SimpleSelectorSequence> sequences) {
+    if (sequences.isEmpty) return sequences;
+
+    var newSequences = [];
+    var first = sequences.first;
+    newSequences.add(new SimpleSelectorSequence(
+        first.simpleSelector, first.span, TokenKind.COMBINATOR_DESCENDANT));
+    newSequences.addAll(sequences.skip(1));
+
+    return newSequences;
+  }
+
+  void visitDeclarationGroup(DeclarationGroup node) {
+    var span = node.span;
+
+    var currentGroup = new DeclarationGroup([], span);
+
+    var oldGroup = _flatDeclarationGroup;
+    _flatDeclarationGroup = currentGroup;
+
+    var expandedLength = _expandedRuleSets.length;
+
+    super.visitDeclarationGroup(node);
+
+    // We're done with the group.
+    _flatDeclarationGroup = oldGroup;
+
+    // No nested rule to process it's a top-level rule.
+    if (_nestedSelectorGroup == _topLevelSelectorGroup) return;
+
+    // If flatten selector's declaration is empty skip this selector, no need
+    // to emit an empty nested selector.
+    if (currentGroup.declarations.isEmpty) return;
+
+    var selectorGroup = _nestedSelectorGroup;
+
+    // Build new rule set from the nested selectors and declarations.
+    var newRuleSet = new RuleSet(selectorGroup, currentGroup, span);
+
+    // Place in order so outer-most rule is first.
+    if (expandedLength == _expandedRuleSets.length) {
+      _expandedRuleSets.add(newRuleSet);
+    } else {
+      _expandedRuleSets.insert(expandedLength, newRuleSet);
+    }
+  }
+
+  // Record all declarations in a nested selector (Declaration, VarDefinition
+  // and MarginGroup) but not the nested rule in the Declaration.
+
+  void visitDeclaration(Declaration node) {
+    if (_parentRuleSet != null) {
+      _flatDeclarationGroup.declarations.add(node);
+    }
+    super.visitDeclaration(node);
+  }
+
+  void visitVarDefinition(VarDefinition node) {
+    if (_parentRuleSet != null) {
+      _flatDeclarationGroup.declarations.add(node);
+    }
+    super.visitVarDefinition(node);
+  }
+
+  void visitExtendDeclaration(ExtendDeclaration node) {
+    if (_parentRuleSet != null) {
+      _flatDeclarationGroup.declarations.add(node);
+    }
+    super.visitExtendDeclaration(node);
+  }
+
+  void visitMarginGroup(MarginGroup node) {
+    if (_parentRuleSet != null) {
+      _flatDeclarationGroup.declarations.add(node);
+    }
+    super.visitMarginGroup(node);
+  }
+
+  /**
+   * Replace the rule set that contains nested rules with the flatten rule sets.
+   */
+  void flatten(StyleSheet styleSheet) {
+    // TODO(terry): Iterate over topLevels instead of _expansions it's already
+    //              a map (this maybe quadratic).
+    _expansions.forEach((RuleSet ruleSet, List<RuleSet> newRules) {
+      var index = styleSheet.topLevels.indexOf(ruleSet);
+      if (index == -1) {
+        // Check any @media directives for nested rules and replace them.
+        var found = _MediaRulesReplacer.replace(styleSheet, ruleSet, newRules);
+        assert(found);
+      } else {
+        styleSheet.topLevels.insertAll(index + 1, newRules);
+      }
+    });
+    _expansions.clear();
+  }
+}
+
+class _MediaRulesReplacer extends Visitor {
+  RuleSet _ruleSet;
+  List<RuleSet> _newRules;
+  bool _foundAndReplaced = false;
+
+  /**
+   * Look for the [ruleSet] inside of an @media directive; if found then replace
+   * with the [newRules].  If [ruleSet] is found and replaced return true.
+   */
+  static bool replace(
+      StyleSheet styleSheet, RuleSet ruleSet, List<RuleSet> newRules) {
+    var visitor = new _MediaRulesReplacer(ruleSet, newRules);
+    visitor.visitStyleSheet(styleSheet);
+    return visitor._foundAndReplaced;
+  }
+
+  _MediaRulesReplacer(this._ruleSet, this._newRules);
+
+  visitMediaDirective(MediaDirective node) {
+    var index = node.rulesets.indexOf(_ruleSet);
+    if (index != -1) {
+      node.rulesets.insertAll(index + 1, _newRules);
+      _foundAndReplaced = true;
+    }
+  }
+}
+
+/**
+ * Expand all @include at the top-level the ruleset(s) associated with the
+ * mixin.
+ */
+class TopLevelIncludes extends Visitor {
+  StyleSheet _styleSheet;
+  final Messages _messages;
+  /** Map of variable name key to it's definition. */
+  final Map<String, MixinDefinition> map = new Map<String, MixinDefinition>();
+  MixinDefinition currDef;
+
+  static void expand(Messages messages, List<StyleSheet> styleSheets) {
+    new TopLevelIncludes(messages, styleSheets);
+  }
+
+  bool _anyRulesets(MixinRulesetDirective def) =>
+      def.rulesets.any((rule) => rule is RuleSet);
+
+  TopLevelIncludes(this._messages, List<StyleSheet> styleSheets) {
+    for (var styleSheet in styleSheets) {
+      visitTree(styleSheet);
+    }
+  }
+
+  void visitStyleSheet(StyleSheet ss) {
+    _styleSheet = ss;
+    super.visitStyleSheet(ss);
+    _styleSheet = null;
+  }
+
+  void visitIncludeDirective(IncludeDirective node) {
+    if (map.containsKey(node.name)) {
+      var mixinDef = map[node.name];
+      if (mixinDef is MixinRulesetDirective) {
+        _TopLevelIncludeReplacer.replace(
+            _messages, _styleSheet, node, mixinDef.rulesets);
+      } else if (currDef is MixinRulesetDirective && _anyRulesets(currDef)) {
+        // currDef is MixinRulesetDirective
+        MixinRulesetDirective mixinRuleset = currDef;
+        int index = mixinRuleset.rulesets.indexOf(node as dynamic);
+        mixinRuleset.rulesets.replaceRange(index, index + 1, [new NoOp()]);
+        _messages.warning(
+            'Using declaration mixin ${node.name} as top-level mixin',
+            node.span);
+      }
+    } else {
+      if (currDef is MixinRulesetDirective) {
+        MixinRulesetDirective rulesetDirect = currDef as MixinRulesetDirective;
+        var index = 0;
+        rulesetDirect.rulesets.forEach((entry) {
+          if (entry == node) {
+            rulesetDirect.rulesets.replaceRange(index, index + 1, [new NoOp()]);
+            _messages.warning('Undefined mixin ${node.name}', node.span);
+          }
+          index++;
+        });
+      }
+    }
+    super.visitIncludeDirective(node);
+  }
+
+  void visitMixinRulesetDirective(MixinRulesetDirective node) {
+    currDef = node;
+
+    super.visitMixinRulesetDirective(node);
+
+    // Replace with latest top-level mixin definition.
+    map[node.name] = node;
+    currDef = null;
+  }
+
+  void visitMixinDeclarationDirective(MixinDeclarationDirective node) {
+    currDef = node;
+
+    super.visitMixinDeclarationDirective(node);
+
+    // Replace with latest mixin definition.
+    map[node.name] = node;
+    currDef = null;
+  }
+}
+
+/** @include as a top-level with ruleset(s). */
+class _TopLevelIncludeReplacer extends Visitor {
+  final Messages _messages;
+  final IncludeDirective _include;
+  final List<RuleSet> _newRules;
+  bool _foundAndReplaced = false;
+
+  /**
+   * Look for the [ruleSet] inside of an @media directive; if found then replace
+   * with the [newRules].  If [ruleSet] is found and replaced return true.
+   */
+  static bool replace(Messages messages, StyleSheet styleSheet,
+      IncludeDirective include, List<RuleSet> newRules) {
+    var visitor = new _TopLevelIncludeReplacer(messages, include, newRules);
+    visitor.visitStyleSheet(styleSheet);
+    return visitor._foundAndReplaced;
+  }
+
+  _TopLevelIncludeReplacer(this._messages, this._include, this._newRules);
+
+  visitStyleSheet(StyleSheet node) {
+    var index = node.topLevels.indexOf(_include);
+    if (index != -1) {
+      node.topLevels.insertAll(index + 1, _newRules);
+      node.topLevels.replaceRange(index, index + 1, [new NoOp()]);
+      _foundAndReplaced = true;
+    }
+    super.visitStyleSheet(node);
+  }
+
+  void visitMixinRulesetDirective(MixinRulesetDirective node) {
+    var index = node.rulesets.indexOf(_include as dynamic);
+    if (index != -1) {
+      node.rulesets.insertAll(index + 1, _newRules);
+      // Only the resolve the @include once.
+      node.rulesets.replaceRange(index, index + 1, [new NoOp()]);
+      _foundAndReplaced = true;
+    }
+    super.visitMixinRulesetDirective(node);
+  }
+}
+
+/**
+ * Utility function to match an include to a list of either Declarations or
+ * RuleSets, depending on type of mixin (ruleset or declaration).  The include
+ * can be an include in a declaration or an include directive (top-level).
+ */
+int _findInclude(List list, var node) {
+  IncludeDirective matchNode =
+      (node is IncludeMixinAtDeclaration) ? node.include : node;
+
+  var index = 0;
+  for (var item in list) {
+    var includeNode = (item is IncludeMixinAtDeclaration) ? item.include : item;
+    if (includeNode == matchNode) return index;
+    index++;
+  }
+  return -1;
+}
+
+/**
+ * Stamp out a mixin with the defined args substituted with the user's
+ * parameters.
+ */
+class CallMixin extends Visitor {
+  final MixinDefinition mixinDef;
+  List _definedArgs;
+  Expressions _currExpressions;
+  int _currIndex = -1;
+
+  final varUsages = new Map<String, Map<Expressions, Set<int>>>();
+
+  /** Only var defs with more than one expression (comma separated). */
+  final Map<String, VarDefinition> varDefs;
+
+  CallMixin(this.mixinDef, [this.varDefs]) {
+    if (mixinDef is MixinRulesetDirective) {
+      visitMixinRulesetDirective(mixinDef);
+    } else {
+      visitMixinDeclarationDirective(mixinDef);
+    }
+  }
+
+  /**
+   * Given a mixin's defined arguments return a cloned mixin defintion that has
+   * replaced all defined arguments with user's supplied VarUsages.
+   */
+  MixinDefinition transform(List callArgs) {
+    // TODO(terry): Handle default arguments and varArgs.
+    // Transform mixin with callArgs.
+    for (var index = 0; index < _definedArgs.length; index++) {
+      var definedArg = _definedArgs[index];
+      VarDefinition varDef;
+      if (definedArg is VarDefinition) {
+        varDef = definedArg;
+      } else if (definedArg is VarDefinitionDirective) {
+        VarDefinitionDirective varDirective = definedArg;
+        varDef = varDirective.def;
+      }
+      var callArg = callArgs[index];
+
+      // Is callArg a var definition with multi-args (expressions > 1).
+      var defArgs = _varDefsAsCallArgs(callArg);
+      if (defArgs.isNotEmpty) {
+        // Replace call args with the var def parameters.
+        callArgs.insertAll(index, defArgs);
+        callArgs.removeAt(index + defArgs.length);
+        callArg = callArgs[index];
+      }
+
+      var expressions = varUsages[varDef.definedName];
+      expressions.forEach((k, v) {
+        for (var usagesIndex in v) {
+          k.expressions.replaceRange(usagesIndex, usagesIndex + 1, callArg);
+        }
+      });
+    }
+
+    // Clone the mixin
+    return mixinDef.clone();
+  }
+
+  /** Rip apart var def with multiple parameters. */
+  List<List<TreeNode>> _varDefsAsCallArgs(var callArg) {
+    var defArgs = [];
+    if (callArg is List && callArg[0] is VarUsage) {
+      var varDef = varDefs[callArg[0].name];
+      var expressions = varDef.expression.expressions;
+      assert(expressions.length > 1);
+      for (var expr in expressions) {
+        if (expr is! OperatorComma) {
+          defArgs.add([expr]);
+        }
+      }
+    }
+    return defArgs;
+  }
+
+  void visitExpressions(Expressions node) {
+    var oldExpressions = _currExpressions;
+    var oldIndex = _currIndex;
+
+    _currExpressions = node;
+    for (_currIndex = 0; _currIndex < node.expressions.length; _currIndex++) {
+      node.expressions[_currIndex].visit(this);
+    }
+
+    _currIndex = oldIndex;
+    _currExpressions = oldExpressions;
+  }
+
+  void _addExpression(Map<Expressions, Set<int>> expressions) {
+    var indexSet = new Set<int>();
+    indexSet.add(_currIndex);
+    expressions[_currExpressions] = indexSet;
+  }
+
+  void visitVarUsage(VarUsage node) {
+    assert(_currIndex != -1);
+    assert(_currExpressions != null);
+    if (varUsages.containsKey(node.name)) {
+      Map<Expressions, Set<int>> expressions = varUsages[node.name];
+      Set<int> allIndexes = expressions[_currExpressions];
+      if (allIndexes == null) {
+        _addExpression(expressions);
+      } else {
+        allIndexes.add(_currIndex);
+      }
+    } else {
+      var newExpressions = new Map<Expressions, Set<int>>();
+      _addExpression(newExpressions);
+      varUsages[node.name] = newExpressions;
+    }
+    super.visitVarUsage(node);
+  }
+
+  void visitMixinDeclarationDirective(MixinDeclarationDirective node) {
+    _definedArgs = node.definedArgs;
+    super.visitMixinDeclarationDirective(node);
+  }
+
+  void visitMixinRulesetDirective(MixinRulesetDirective node) {
+    _definedArgs = node.definedArgs;
+    super.visitMixinRulesetDirective(node);
+  }
+}
+
+/** Expand all @include inside of a declaration associated with a mixin. */
+class DeclarationIncludes extends Visitor {
+  StyleSheet _styleSheet;
+  final Messages _messages;
+  /** Map of variable name key to it's definition. */
+  final Map<String, MixinDefinition> map = new Map<String, MixinDefinition>();
+  /** Cache of mixin called with parameters. */
+  final Map<String, CallMixin> callMap = new Map<String, CallMixin>();
+  MixinDefinition currDef;
+  DeclarationGroup currDeclGroup;
+
+  /** Var definitions with more than 1 expression. */
+  final Map<String, VarDefinition> varDefs = new Map<String, VarDefinition>();
+
+  static void expand(Messages messages, List<StyleSheet> styleSheets) {
+    new DeclarationIncludes(messages, styleSheets);
+  }
+
+  DeclarationIncludes(this._messages, List<StyleSheet> styleSheets) {
+    for (var styleSheet in styleSheets) {
+      visitTree(styleSheet);
+    }
+  }
+
+  bool _allIncludes(rulesets) =>
+      rulesets.every((rule) => rule is IncludeDirective || rule is NoOp);
+
+  CallMixin _createCallDeclMixin(MixinDefinition mixinDef) {
+    callMap.putIfAbsent(mixinDef.name,
+        () => callMap[mixinDef.name] = new CallMixin(mixinDef, varDefs));
+    return callMap[mixinDef.name];
+  }
+
+  void visitStyleSheet(StyleSheet ss) {
+    _styleSheet = ss;
+    super.visitStyleSheet(ss);
+    _styleSheet = null;
+  }
+
+  void visitDeclarationGroup(DeclarationGroup node) {
+    currDeclGroup = node;
+    super.visitDeclarationGroup(node);
+    currDeclGroup = null;
+  }
+
+  void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) {
+    if (map.containsKey(node.include.name)) {
+      var mixinDef = map[node.include.name];
+
+      // Fix up any mixin that is really a Declaration but has includes.
+      if (mixinDef is MixinRulesetDirective) {
+        if (!_allIncludes(mixinDef.rulesets) && currDeclGroup != null) {
+          var index = _findInclude(currDeclGroup.declarations, node);
+          if (index != -1) {
+            currDeclGroup.declarations.replaceRange(
+                index, index + 1, [new NoOp()]);
+          }
+          _messages.warning(
+              "Using top-level mixin ${node.include.name} as a declaration",
+              node.span);
+        } else {
+          // We're a list of @include(s) inside of a mixin ruleset - convert
+          // to a list of IncludeMixinAtDeclaration(s).
+          var origRulesets = mixinDef.rulesets;
+          var rulesets = [];
+          if (origRulesets.every((ruleset) => ruleset is IncludeDirective)) {
+            origRulesets.forEach((ruleset) {
+              rulesets
+                  .add(new IncludeMixinAtDeclaration(ruleset, ruleset.span));
+            });
+            _IncludeReplacer.replace(_styleSheet, node, rulesets);
+          }
+        }
+      }
+
+      if (mixinDef.definedArgs.length > 0 && node.include.args.length > 0) {
+        var callMixin = _createCallDeclMixin(mixinDef);
+        mixinDef = callMixin.transform(node.include.args);
+      }
+
+      if (mixinDef is MixinDeclarationDirective) {
+        _IncludeReplacer.replace(
+            _styleSheet, node, mixinDef.declarations.declarations);
+      }
+    } else {
+      _messages.warning("Undefined mixin ${node.include.name}", node.span);
+    }
+
+    super.visitIncludeMixinAtDeclaration(node);
+  }
+
+  void visitIncludeDirective(IncludeDirective node) {
+    if (map.containsKey(node.name)) {
+      var mixinDef = map[node.name];
+      if (currDef is MixinDeclarationDirective &&
+          mixinDef is MixinDeclarationDirective) {
+        _IncludeReplacer.replace(
+            _styleSheet, node, mixinDef.declarations.declarations);
+      } else if (currDef is MixinDeclarationDirective) {
+        var decls =
+            (currDef as MixinDeclarationDirective).declarations.declarations;
+        var index = _findInclude(decls, node);
+        if (index != -1) {
+          decls.replaceRange(index, index + 1, [new NoOp()]);
+        }
+      }
+    }
+
+    super.visitIncludeDirective(node);
+  }
+
+  void visitMixinRulesetDirective(MixinRulesetDirective node) {
+    currDef = node;
+
+    super.visitMixinRulesetDirective(node);
+
+    // Replace with latest top-level mixin definition.
+    map[node.name] = node;
+    currDef = null;
+  }
+
+  void visitMixinDeclarationDirective(MixinDeclarationDirective node) {
+    currDef = node;
+
+    super.visitMixinDeclarationDirective(node);
+
+    // Replace with latest mixin definition.
+    map[node.name] = node;
+    currDef = null;
+  }
+
+  void visitVarDefinition(VarDefinition node) {
+    // Only record var definitions that have multiple expressions (comma
+    // separated for mixin parameter substitution.
+    var exprs = (node.expression as Expressions).expressions;
+    if (exprs.length > 1) {
+      varDefs[node.definedName] = node;
+    }
+    super.visitVarDefinition(node);
+  }
+
+  void visitVarDefinitionDirective(VarDefinitionDirective node) {
+    visitVarDefinition(node.def);
+  }
+}
+
+/** @include as a top-level with ruleset(s). */
+class _IncludeReplacer extends Visitor {
+  final _include;
+  final List<Declaration> _newDeclarations;
+  bool _foundAndReplaced = false;
+
+  /**
+   * Look for the [ruleSet] inside of a @media directive; if found then replace
+   * with the [newRules].
+   */
+  static void replace(
+      StyleSheet ss, var include, List<Declaration> newDeclarations) {
+    var visitor = new _IncludeReplacer(include, newDeclarations);
+    visitor.visitStyleSheet(ss);
+  }
+
+  _IncludeReplacer(this._include, this._newDeclarations);
+
+  void visitDeclarationGroup(DeclarationGroup node) {
+    var index = _findInclude(node.declarations, _include);
+    if (index != -1) {
+      node.declarations.insertAll(index + 1, _newDeclarations);
+      // Change @include to NoOp so it's processed only once.
+      node.declarations.replaceRange(index, index + 1, [new NoOp()]);
+      _foundAndReplaced = true;
+    }
+    super.visitDeclarationGroup(node);
+  }
+}
+
+/**
+ * Remove all @mixin and @include and any NoOp used as placeholder for @include.
+ */
+class MixinsAndIncludes extends Visitor {
+  static void remove(StyleSheet styleSheet) {
+    new MixinsAndIncludes()..visitStyleSheet(styleSheet);
+  }
+
+  bool _nodesToRemove(node) =>
+      node is IncludeDirective || node is MixinDefinition || node is NoOp;
+
+  void visitStyleSheet(StyleSheet ss) {
+    var index = ss.topLevels.length;
+    while (--index >= 0) {
+      if (_nodesToRemove(ss.topLevels[index])) {
+        ss.topLevels.removeAt(index);
+      }
+    }
+    super.visitStyleSheet(ss);
+  }
+
+  void visitDeclarationGroup(DeclarationGroup node) {
+    var index = node.declarations.length;
+    while (--index >= 0) {
+      if (_nodesToRemove(node.declarations[index])) {
+        node.declarations.removeAt(index);
+      }
+    }
+    super.visitDeclarationGroup(node);
+  }
+}
+
+/** Find all @extend to create inheritance. */
+class AllExtends extends Visitor {
+  final Map<String, List<SelectorGroup>> inherits =
+      new Map<String, List<SelectorGroup>>();
+
+  SelectorGroup _currSelectorGroup;
+  int _currDeclIndex;
+  List<int> _extendsToRemove = [];
+
+  void visitRuleSet(RuleSet node) {
+    var oldSelectorGroup = _currSelectorGroup;
+    _currSelectorGroup = node.selectorGroup;
+
+    super.visitRuleSet(node);
+
+    _currSelectorGroup = oldSelectorGroup;
+  }
+
+  void visitExtendDeclaration(ExtendDeclaration node) {
+    var inheritName = "";
+    for (var selector in node.selectors) {
+      inheritName += selector.toString();
+    }
+    if (inherits.containsKey(inheritName)) {
+      inherits[inheritName].add(_currSelectorGroup);
+    } else {
+      inherits[inheritName] = [_currSelectorGroup];
+    }
+
+    // Remove this @extend
+    _extendsToRemove.add(_currDeclIndex);
+
+    super.visitExtendDeclaration(node);
+  }
+
+  void visitDeclarationGroup(DeclarationGroup node) {
+    var oldDeclIndex = _currDeclIndex;
+
+    var decls = node.declarations;
+    for (_currDeclIndex = 0; _currDeclIndex < decls.length; _currDeclIndex++) {
+      decls[_currDeclIndex].visit(this);
+    }
+
+    if (_extendsToRemove.isNotEmpty) {
+      var removeTotal = _extendsToRemove.length - 1;
+      for (var index = removeTotal; index >= 0; index--) {
+        decls.removeAt(_extendsToRemove[index]);
+      }
+      _extendsToRemove.clear();
+    }
+
+    _currDeclIndex = oldDeclIndex;
+  }
+}
+
+// TODO(terry): Need to handle merging selector sequences
+// TODO(terry): Need to handle @extend-Only selectors.
+// TODO(terry): Need to handle !optional glag.
+/**
+ * Changes any selector that matches @extend.
+ */
+class InheritExtends extends Visitor {
+  final Messages _messages;
+  final AllExtends _allExtends;
+
+  InheritExtends(this._messages, this._allExtends);
+
+  void visitSelectorGroup(SelectorGroup node) {
+    for (var selectorsIndex = 0;
+        selectorsIndex < node.selectors.length;
+        selectorsIndex++) {
+      var selectors = node.selectors[selectorsIndex];
+      var isLastNone = false;
+      var selectorName = "";
+      for (var index = 0;
+          index < selectors.simpleSelectorSequences.length;
+          index++) {
+        var simpleSeq = selectors.simpleSelectorSequences[index];
+        var namePart = simpleSeq.simpleSelector.toString();
+        selectorName = (isLastNone) ? (selectorName + namePart) : namePart;
+        List<SelectorGroup> matches = _allExtends.inherits[selectorName];
+        if (matches != null) {
+          for (var match in matches) {
+            // Create a new group.
+            var newSelectors = selectors.clone();
+            var newSeq = match.selectors[0].clone();
+            if (isLastNone) {
+              // Add the inherited selector.
+              node.selectors.add(newSeq);
+            } else {
+              // Replace the selector sequence to the left of the pseudo class
+              // or pseudo element.
+
+              // Make new selector seq combinator the same as the original.
+              var orgCombinator =
+                  newSelectors.simpleSelectorSequences[index].combinator;
+              newSeq.simpleSelectorSequences[0].combinator = orgCombinator;
+
+              newSelectors.simpleSelectorSequences.replaceRange(
+                  index, index + 1, newSeq.simpleSelectorSequences);
+              node.selectors.add(newSelectors);
+            }
+            isLastNone = false;
+          }
+        } else {
+          isLastNone = simpleSeq.isCombinatorNone;
+        }
+      }
+    }
+    super.visitSelectorGroup(node);
+  }
+}
diff --git a/mojo/public/dart/third_party/csslib/lib/src/css_printer.dart b/mojo/public/dart/third_party/csslib/lib/src/css_printer.dart
new file mode 100644
index 0000000..125b5ae
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/lib/src/css_printer.dart
@@ -0,0 +1,516 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of csslib.visitor;
+
+/**
+ * Visitor that produces a formatted string representation of the CSS tree.
+ */
+class CssPrinter extends Visitor {
+  StringBuffer _buff = new StringBuffer();
+  bool prettyPrint = true;
+
+  /**
+   * Walk the [tree] Stylesheet. [pretty] if true emits line breaks, extra
+   * spaces, friendly property values, etc., if false emits compacted output.
+   */
+  void visitTree(StyleSheet tree, {bool pretty: false}) {
+    prettyPrint = pretty;
+    _buff = new StringBuffer();
+    visitStyleSheet(tree);
+  }
+
+  /** Appends [str] to the output buffer. */
+  void emit(String str) {
+    _buff.write(str);
+  }
+
+  /** Returns the output buffer. */
+  String toString() => _buff.toString().trim();
+
+  String get _newLine => prettyPrint ? '\n' : ' ';
+  String get _sp => prettyPrint ? ' ' : '';
+
+  // TODO(terry): When adding obfuscation we'll need isOptimized (compact w/
+  //              obufuscation) and have isTesting (compact no obfuscation) and
+  //              isCompact would be !prettyPrint.  We'll need another boolean
+  //              flag for obfuscation.
+  bool get _isTesting => !prettyPrint;
+
+  void visitCssComment(CssComment node) {
+    emit('/* ${node.comment} */');
+  }
+
+  void visitCommentDefinition(CommentDefinition node) {
+    emit('<!-- ${node.comment} -->');
+  }
+
+  void visitMediaExpression(MediaExpression node) {
+    emit(node.andOperator ? ' AND ' : ' ');
+    emit('(${node.mediaFeature}:');
+    visitExpressions(node.exprs);
+    emit(')');
+  }
+
+  void visitMediaQuery(MediaQuery query) {
+    var unary = query.hasUnary ? ' ${query.unary}' : '';
+    var mediaType = query.hasMediaType ? ' ${query.mediaType}' : '';
+    emit('$unary$mediaType');
+    for (var expression in query.expressions) {
+      visitMediaExpression(expression);
+    }
+  }
+
+  void emitMediaQueries(queries) {
+    var queriesLen = queries.length;
+    for (var i = 0; i < queriesLen; i++) {
+      var query = queries[i];
+      if (query.hasMediaType && i > 0) emit(',');
+      visitMediaQuery(query);
+    }
+  }
+
+  void visitMediaDirective(MediaDirective node) {
+    emit(' @media');
+    emitMediaQueries(node.mediaQueries);
+    emit(' {');
+    for (var ruleset in node.rulesets) {
+      ruleset.visit(this);
+    }
+    emit('$_newLine\}');
+  }
+
+  void visitHostDirective(HostDirective node) {
+    emit('\n@host {');
+    for (var ruleset in node.rulesets) {
+      ruleset.visit(this);
+    }
+    emit('$_newLine\}');
+  }
+
+  /**
+   *  @page : pseudoPage {
+   *    decls
+   *  }
+   */
+  void visitPageDirective(PageDirective node) {
+    emit('$_newLine@page');
+    if (node.hasIdent || node.hasPseudoPage) {
+      if (node.hasIdent) emit(' ');
+      emit(node._ident);
+      emit(node.hasPseudoPage ? ':${node._pseudoPage}' : '');
+    }
+    emit(' ');
+
+    var declsMargin = node._declsMargin;
+    var declsMarginLength = declsMargin.length;
+    for (var i = 0; i < declsMarginLength; i++) {
+      if (i > 0) emit(_newLine);
+      emit('{$_newLine');
+      declsMargin[i].visit(this);
+      emit('}');
+    }
+  }
+
+  /** @charset "charset encoding" */
+  void visitCharsetDirective(CharsetDirective node) {
+    emit('$_newLine@charset "${node.charEncoding}";');
+  }
+
+  void visitImportDirective(ImportDirective node) {
+    bool isStartingQuote(String ch) => ('\'"'.indexOf(ch[0]) >= 0);
+
+    if (_isTesting) {
+      // Emit assuming url() was parsed; most suite tests use url function.
+      emit(' @import url(${node.import})');
+    } else if (isStartingQuote(node.import)) {
+      emit(' @import ${node.import}');
+    } else {
+      // url(...) isn't needed only a URI can follow an @import directive; emit
+      // url as a string.
+      emit(' @import "${node.import}"');
+    }
+    emitMediaQueries(node.mediaQueries);
+    emit(';');
+  }
+
+  void visitKeyFrameDirective(KeyFrameDirective node) {
+    emit('$_newLine${node.keyFrameName} ');
+    node.name.visit(this);
+    emit('$_sp{$_newLine');
+    for (final block in node._blocks) {
+      block.visit(this);
+    }
+    emit('}');
+  }
+
+  void visitFontFaceDirective(FontFaceDirective node) {
+    emit('$_newLine@font-face ');
+    emit('$_sp{$_newLine');
+    node._declarations.visit(this);
+    emit('}');
+  }
+
+  void visitKeyFrameBlock(KeyFrameBlock node) {
+    emit('$_sp$_sp');
+    node._blockSelectors.visit(this);
+    emit('$_sp{$_newLine');
+    node._declarations.visit(this);
+    emit('$_sp$_sp}$_newLine');
+  }
+
+  void visitStyletDirective(StyletDirective node) {
+    emit('/* @stylet export as ${node.dartClassName} */\n');
+  }
+
+  void visitNamespaceDirective(NamespaceDirective node) {
+    bool isStartingQuote(String ch) => ('\'"'.indexOf(ch) >= 0);
+
+    if (isStartingQuote(node._uri)) {
+      emit(' @namespace ${node.prefix}"${node._uri}"');
+    } else {
+      if (_isTesting) {
+        // Emit exactly was we parsed.
+        emit(' @namespace ${node.prefix}url(${node._uri})');
+      } else {
+        // url(...) isn't needed only a URI can follow a:
+        //    @namespace prefix directive.
+        emit(' @namespace ${node.prefix}${node._uri}');
+      }
+    }
+    emit(';');
+  }
+
+  void visitVarDefinitionDirective(VarDefinitionDirective node) {
+    visitVarDefinition(node.def);
+    emit(';$_newLine');
+  }
+
+  void visitMixinRulesetDirective(MixinRulesetDirective node) {
+    emit('@mixin ${node.name} {');
+    for (var ruleset in node.rulesets) {
+      ruleset.visit(this);
+    }
+    emit('}');
+  }
+
+  void visitMixinDeclarationDirective(MixinDeclarationDirective node) {
+    emit('@mixin ${node.name} {\n');
+    visitDeclarationGroup(node.declarations);
+    emit('}');
+  }
+
+  /**
+   * Added optional newLine for handling @include at top-level vs/ inside of
+   * a declaration group.
+   */
+  void visitIncludeDirective(IncludeDirective node, [bool topLevel = true]) {
+    if (topLevel) emit(_newLine);
+    emit('@include ${node.name}');
+    emit(';');
+  }
+
+  void visitContentDirective(ContentDirective node) {
+    // TODO(terry): TBD
+  }
+
+  void visitRuleSet(RuleSet node) {
+    emit("$_newLine");
+    node._selectorGroup.visit(this);
+    emit(" {$_newLine");
+    node._declarationGroup.visit(this);
+    emit("}");
+  }
+
+  void visitDeclarationGroup(DeclarationGroup node) {
+    var declarations = node.declarations;
+    var declarationsLength = declarations.length;
+    for (var i = 0; i < declarationsLength; i++) {
+      if (i > 0) emit(_newLine);
+      emit("$_sp$_sp");
+      declarations[i].visit(this);
+      emit(";");
+    }
+    if (declarationsLength > 0) emit(_newLine);
+  }
+
+  void visitMarginGroup(MarginGroup node) {
+    var margin_sym_name =
+        TokenKind.idToValue(TokenKind.MARGIN_DIRECTIVES, node.margin_sym);
+
+    emit("@$margin_sym_name {$_newLine");
+
+    visitDeclarationGroup(node);
+
+    emit("}$_newLine");
+  }
+
+  void visitDeclaration(Declaration node) {
+    String importantAsString() => node.important ? '$_sp!important' : '';
+
+    emit("${node.property}: ");
+    node._expression.visit(this);
+
+    emit("${importantAsString()}");
+  }
+
+  void visitVarDefinition(VarDefinition node) {
+    emit("var-${node.definedName}: ");
+    node._expression.visit(this);
+  }
+
+  void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) {
+    // Don't emit a new line we're inside of a declaration group.
+    visitIncludeDirective(node.include, false);
+  }
+
+  void visitExtendDeclaration(ExtendDeclaration node) {
+    emit("@extend ");
+    for (var selector in node.selectors) {
+      selector.visit(this);
+    }
+  }
+
+  void visitSelectorGroup(SelectorGroup node) {
+    var selectors = node.selectors;
+    var selectorsLength = selectors.length;
+    for (var i = 0; i < selectorsLength; i++) {
+      if (i > 0) emit(',$_sp');
+      selectors[i].visit(this);
+    }
+  }
+
+  void visitSimpleSelectorSequence(SimpleSelectorSequence node) {
+    emit('${node._combinatorToString}');
+    node.simpleSelector.visit(this);
+  }
+
+  void visitSimpleSelector(SimpleSelector node) {
+    emit(node.name);
+  }
+
+  void visitNamespaceSelector(NamespaceSelector node) {
+    emit(node.toString());
+  }
+
+  void visitElementSelector(ElementSelector node) {
+    emit(node.toString());
+  }
+
+  void visitAttributeSelector(AttributeSelector node) {
+    emit(node.toString());
+  }
+
+  void visitIdSelector(IdSelector node) {
+    emit(node.toString());
+  }
+
+  void visitClassSelector(ClassSelector node) {
+    emit(node.toString());
+  }
+
+  void visitPseudoClassSelector(PseudoClassSelector node) {
+    emit(node.toString());
+  }
+
+  void visitPseudoElementSelector(PseudoElementSelector node) {
+    emit(node.toString());
+  }
+
+  void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) {
+    emit(":${node.name}(");
+    node.expression.visit(this);
+    emit(')');
+  }
+
+  void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) {
+    emit("::${node.name}(");
+    node.expression.visit(this);
+    emit(')');
+  }
+
+  void visitNegationSelector(NegationSelector node) {
+    emit(':not(');
+    node.negationArg.visit(this);
+    emit(')');
+  }
+
+  void visitSelectorExpression(SelectorExpression node) {
+    var expressions = node.expressions;
+    var expressionsLength = expressions.length;
+    for (var i = 0; i < expressionsLength; i++) {
+      // Add space seperator between terms without an operator.
+      var expression = expressions[i];
+      expression.visit(this);
+    }
+  }
+
+  void visitUnicodeRangeTerm(UnicodeRangeTerm node) {
+    if (node.hasSecond) {
+      emit("U+${node.first}-${node.second}");
+    } else {
+      emit("U+${node.first}");
+    }
+  }
+
+  void visitLiteralTerm(LiteralTerm node) {
+    emit(node.text);
+  }
+
+  void visitHexColorTerm(HexColorTerm node) {
+    var mappedName;
+    if (_isTesting && (node.value is! BAD_HEX_VALUE)) {
+      mappedName = TokenKind.hexToColorName(node.value);
+    }
+    if (mappedName == null) {
+      mappedName = '#${node.text}';
+    }
+
+    emit(mappedName);
+  }
+
+  void visitNumberTerm(NumberTerm node) {
+    visitLiteralTerm(node);
+  }
+
+  void visitUnitTerm(UnitTerm node) {
+    emit(node.toString());
+  }
+
+  void visitLengthTerm(LengthTerm node) {
+    emit(node.toString());
+  }
+
+  void visitPercentageTerm(PercentageTerm node) {
+    emit('${node.text}%');
+  }
+
+  void visitEmTerm(EmTerm node) {
+    emit('${node.text}em');
+  }
+
+  void visitExTerm(ExTerm node) {
+    emit('${node.text}ex');
+  }
+
+  void visitAngleTerm(AngleTerm node) {
+    emit(node.toString());
+  }
+
+  void visitTimeTerm(TimeTerm node) {
+    emit(node.toString());
+  }
+
+  void visitFreqTerm(FreqTerm node) {
+    emit(node.toString());
+  }
+
+  void visitFractionTerm(FractionTerm node) {
+    emit('${node.text}fr');
+  }
+
+  void visitUriTerm(UriTerm node) {
+    emit('url("${node.text}")');
+  }
+
+  void visitResolutionTerm(ResolutionTerm node) {
+    emit(node.toString());
+  }
+
+  void visitViewportTerm(ViewportTerm node) {
+    emit(node.toString());
+  }
+
+  void visitFunctionTerm(FunctionTerm node) {
+    // TODO(terry): Optimize rgb to a hexcolor.
+    emit('${node.text}(');
+    node._params.visit(this);
+    emit(')');
+  }
+
+  void visitGroupTerm(GroupTerm node) {
+    emit('(');
+    var terms = node._terms;
+    var termsLength = terms.length;
+    for (var i = 0; i < termsLength; i++) {
+      if (i > 0) emit('$_sp');
+      terms[i].visit(this);
+    }
+    emit(')');
+  }
+
+  void visitItemTerm(ItemTerm node) {
+    emit('[${node.text}]');
+  }
+
+  void visitIE8Term(IE8Term node) {
+    visitLiteralTerm(node);
+  }
+
+  void visitOperatorSlash(OperatorSlash node) {
+    emit('/');
+  }
+
+  void visitOperatorComma(OperatorComma node) {
+    emit(',');
+  }
+
+  void visitOperatorPlus(OperatorPlus node) {
+    emit('+');
+  }
+
+  void visitOperatorMinus(OperatorMinus node) {
+    emit('-');
+  }
+
+  void visitVarUsage(VarUsage node) {
+    emit('var(${node.name}');
+    if (!node.defaultValues.isEmpty) {
+      emit(',');
+      for (var defaultValue in node.defaultValues) {
+        emit(' ');
+        defaultValue.visit(this);
+      }
+    }
+    emit(')');
+  }
+
+  void visitExpressions(Expressions node) {
+    var expressions = node.expressions;
+    var expressionsLength = expressions.length;
+    for (var i = 0; i < expressionsLength; i++) {
+      // Add space seperator between terms without an operator.
+      // TODO(terry): Should have a BinaryExpression to solve this problem.
+      var expression = expressions[i];
+      if (i > 0 &&
+          !(expression is OperatorComma || expression is OperatorSlash)) {
+        emit(' ');
+      }
+      expression.visit(this);
+    }
+  }
+
+  void visitBinaryExpression(BinaryExpression node) {
+    // TODO(terry): TBD
+    throw UnimplementedError;
+  }
+
+  void visitUnaryExpression(UnaryExpression node) {
+    // TODO(terry): TBD
+    throw UnimplementedError;
+  }
+
+  void visitIdentifier(Identifier node) {
+    emit(node.name);
+  }
+
+  void visitWildcard(Wildcard node) {
+    emit('*');
+  }
+
+  void visitDartStyleExpression(DartStyleExpression node) {
+    // TODO(terry): TBD
+    throw UnimplementedError;
+  }
+}
diff --git a/mojo/public/dart/third_party/csslib/lib/src/messages.dart b/mojo/public/dart/third_party/csslib/lib/src/messages.dart
new file mode 100644
index 0000000..595bf6c
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/lib/src/messages.dart
@@ -0,0 +1,130 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library csslib.src.messages;
+
+import 'package:logging/logging.dart' show Level;
+import 'package:source_span/source_span.dart';
+
+import 'options.dart';
+
+// TODO(terry): Remove the global messages, use some object that tracks
+//              compilation state.
+
+/** The global [Messages] for tracking info/warnings/messages. */
+Messages messages;
+
+// Color constants used for generating messages.
+final String GREEN_COLOR = '\u001b[32m';
+final String RED_COLOR = '\u001b[31m';
+final String MAGENTA_COLOR = '\u001b[35m';
+final String NO_COLOR = '\u001b[0m';
+
+/** Map between error levels and their display color. */
+final Map<Level, String> _ERROR_COLORS = (() {
+  var colorsMap = new Map<Level, String>();
+  colorsMap[Level.SEVERE] = RED_COLOR;
+  colorsMap[Level.WARNING] = MAGENTA_COLOR;
+  colorsMap[Level.INFO] = GREEN_COLOR;
+  return colorsMap;
+})();
+
+/** Map between error levels and their friendly name. */
+final Map<Level, String> _ERROR_LABEL = (() {
+  var labels = new Map<Level, String>();
+  labels[Level.SEVERE] = 'error';
+  labels[Level.WARNING] = 'warning';
+  labels[Level.INFO] = 'info';
+  return labels;
+})();
+
+/** A single message from the compiler. */
+class Message {
+  final Level level;
+  final String message;
+  final SourceSpan span;
+  final bool useColors;
+
+  Message(this.level, this.message, {SourceSpan span, bool useColors: false})
+      : this.span = span,
+        this.useColors = useColors;
+
+  String toString() {
+    var output = new StringBuffer();
+    bool colors = useColors && _ERROR_COLORS.containsKey(level);
+    var levelColor = colors ? _ERROR_COLORS[level] : null;
+    if (colors) output.write(levelColor);
+    output
+      ..write(_ERROR_LABEL[level])
+      ..write(' ');
+    if (colors) output.write(NO_COLOR);
+
+    if (span == null) {
+      output.write(message);
+    } else {
+      output.write('on ');
+      output.write(span.message(message, color: levelColor));
+    }
+
+    return output.toString();
+  }
+}
+
+typedef void PrintHandler(Message obj);
+
+/**
+ * This class tracks and prints information, warnings, and errors emitted by the
+ * compiler.
+ */
+class Messages {
+  /** Called on every error. Set to blank function to supress printing. */
+  final PrintHandler printHandler;
+
+  final PreprocessorOptions options;
+
+  final List<Message> messages = <Message>[];
+
+  Messages({PreprocessorOptions options, this.printHandler: print})
+      : options = options != null ? options : new PreprocessorOptions();
+
+  /** Report a compile-time CSS error. */
+  void error(String message, SourceSpan span) {
+    var msg = new Message(Level.SEVERE, message,
+        span: span, useColors: options.useColors);
+
+    messages.add(msg);
+
+    printHandler(msg);
+  }
+
+  /** Report a compile-time CSS warning. */
+  void warning(String message, SourceSpan span) {
+    if (options.warningsAsErrors) {
+      error(message, span);
+    } else {
+      var msg = new Message(Level.WARNING, message,
+          span: span, useColors: options.useColors);
+
+      messages.add(msg);
+    }
+  }
+
+  /** Report and informational message about what the compiler is doing. */
+  void info(String message, SourceSpan span) {
+    var msg = new Message(Level.INFO, message,
+        span: span, useColors: options.useColors);
+
+    messages.add(msg);
+
+    if (options.verbose) printHandler(msg);
+  }
+
+  /** Merge [newMessages] to this message lsit. */
+  void mergeMessages(Messages newMessages) {
+    messages.addAll(newMessages.messages);
+    newMessages.messages
+        .where((message) => message.level == Level.SEVERE || options.verbose)
+        .forEach(printHandler);
+  }
+}
diff --git a/mojo/public/dart/third_party/csslib/lib/src/options.dart b/mojo/public/dart/third_party/csslib/lib/src/options.dart
new file mode 100644
index 0000000..95e8a2f
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/lib/src/options.dart
@@ -0,0 +1,111 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library csslib.src.options;
+
+import 'package:args/args.dart';
+
+class PreprocessorOptions {
+  /** Generate polyfill code (e.g., var, etc.) */
+  final bool polyfill;
+
+  /** Report warnings as errors. */
+  final bool warningsAsErrors;
+
+  /** Throw an exception on warnings (not used by command line tool). */
+  final bool throwOnWarnings;
+
+  /** Throw an exception on errors (not used by command line tool). */
+  final bool throwOnErrors;
+
+  /** True to show informational messages. The `--verbose` flag. */
+  final bool verbose;
+
+  /** True to show warning messages for bad CSS.  The '--checked' flag. */
+  final bool checked;
+
+  // TODO(terry): Add mixin support and nested rules.
+  /**
+   * Subset of Less commands enabled; disable with '--no-less'.
+   * Less syntax supported:
+   * - @name at root level statically defines variables resolved at compilation
+   * time.  Essentially a directive e.g., @var-name.
+   */
+  final bool lessSupport;
+
+  /** Whether to use colors to print messages on the terminal. */
+  final bool useColors;
+
+  /** File to process by the compiler. */
+  final String inputFile;
+
+  const PreprocessorOptions({this.verbose: false, this.checked: false,
+      this.lessSupport: true, this.warningsAsErrors: false,
+      this.throwOnErrors: false, this.throwOnWarnings: false,
+      this.useColors: true, this.polyfill: false, this.inputFile});
+
+  PreprocessorOptions.fromArgs(ArgResults args)
+      : warningsAsErrors = args['warnings_as_errors'],
+        throwOnWarnings = args['throw_on_warnings'],
+        throwOnErrors = args['throw_on_errors'],
+        verbose = args['verbose'],
+        checked = args['checked'],
+        lessSupport = args['less'],
+        useColors = args['colors'],
+        polyfill = args['polyfill'],
+        inputFile = args.rest.length > 0 ? args.rest[0] : null;
+
+  // tool.dart [options...] <css file>
+  static PreprocessorOptions parse(List<String> arguments) {
+    var parser = new ArgParser()
+      ..addFlag('verbose',
+          abbr: 'v',
+          defaultsTo: false,
+          negatable: false,
+          help: 'Display detail info')
+      ..addFlag('checked',
+          defaultsTo: false,
+          negatable: false,
+          help: 'Validate CSS values invalid value display a warning message')
+      ..addFlag('less',
+          defaultsTo: true,
+          negatable: true,
+          help: 'Supports subset of Less syntax')
+      ..addFlag('suppress_warnings',
+          defaultsTo: true, help: 'Warnings not displayed')
+      ..addFlag('warnings_as_errors',
+          defaultsTo: false, help: 'Warning handled as errors')
+      ..addFlag('throw_on_errors',
+          defaultsTo: false, help: 'Throw on errors encountered')
+      ..addFlag('throw_on_warnings',
+          defaultsTo: false, help: 'Throw on warnings encountered')
+      ..addFlag('colors',
+          defaultsTo: true, help: 'Display errors/warnings in colored text')
+      ..addFlag('polyfill',
+          defaultsTo: false, help: 'Generate polyfill for new CSS features')
+      ..addFlag('help',
+          abbr: 'h',
+          defaultsTo: false,
+          negatable: false,
+          help: 'Displays this help message');
+
+    try {
+      var results = parser.parse(arguments);
+      if (results['help'] || results.rest.length == 0) {
+        showUsage(parser);
+        return null;
+      }
+      return new PreprocessorOptions.fromArgs(results);
+    } on FormatException catch (e) {
+      print(e.message);
+      showUsage(parser);
+      return null;
+    }
+  }
+
+  static showUsage(parser) {
+    print('Usage: css [options...] input.css');
+    print(parser.getUsage());
+  }
+}
diff --git a/mojo/public/dart/third_party/csslib/lib/src/polyfill.dart b/mojo/public/dart/third_party/csslib/lib/src/polyfill.dart
new file mode 100644
index 0000000..9b682ce
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/lib/src/polyfill.dart
@@ -0,0 +1,256 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of csslib.parser;
+
+/**
+ * CSS polyfill emits CSS to be understood by older parsers that which do not
+ * understand (var, calc, etc.).
+ */
+class PolyFill {
+  final Messages _messages;
+  final bool _warningsAsErrors;
+  Map<String, VarDefinition> _allVarDefinitions =
+      new Map<String, VarDefinition>();
+
+  Set<StyleSheet> allStyleSheets = new Set<StyleSheet>();
+
+  /**
+   * [_pseudoElements] list of known pseudo attributes found in HTML, any
+   * CSS pseudo-elements 'name::custom-element' is mapped to the manged name
+   * associated with the pseudo-element key.
+   */
+  PolyFill(this._messages, this._warningsAsErrors);
+
+  /**
+   * Run the analyzer on every file that is a style sheet or any component that
+   * has a style tag.
+   */
+  void process(StyleSheet styleSheet, {List<StyleSheet> includes: null}) {
+    if (includes != null) {
+      processVarDefinitions(includes);
+    }
+    processVars(styleSheet);
+
+    // Remove all var definitions for this style sheet.
+    new _RemoveVarDefinitions().visitTree(styleSheet);
+  }
+
+  /** Process all includes looking for var definitions. */
+  void processVarDefinitions(List<StyleSheet> includes) {
+    for (var include in includes) {
+      _allVarDefinitions = (new _VarDefinitionsIncludes(_allVarDefinitions)
+        ..visitTree(include)).varDefs;
+    }
+  }
+
+  void processVars(StyleSheet styleSheet) {
+    // Build list of all var definitions.
+    var mainStyleSheetVarDefs = (new _VarDefAndUsage(
+        this._messages, _allVarDefinitions)..visitTree(styleSheet)).varDefs;
+
+    // Resolve all definitions to a non-VarUsage (terminal expression).
+    mainStyleSheetVarDefs.forEach((key, value) {
+      for (var _ in (value.expression as Expressions).expressions) {
+        mainStyleSheetVarDefs[key] =
+            _findTerminalVarDefinition(_allVarDefinitions, value);
+      }
+    });
+  }
+}
+
+/** Build list of all var definitions in all includes. */
+class _VarDefinitionsIncludes extends Visitor {
+  final Map<String, VarDefinition> varDefs;
+
+  _VarDefinitionsIncludes(this.varDefs);
+
+  void visitTree(StyleSheet tree) {
+    visitStyleSheet(tree);
+  }
+
+  visitVarDefinition(VarDefinition node) {
+    // Replace with latest variable definition.
+    varDefs[node.definedName] = node;
+    super.visitVarDefinition(node);
+  }
+
+  void visitVarDefinitionDirective(VarDefinitionDirective node) {
+    visitVarDefinition(node.def);
+  }
+}
+
+/**
+ * Find var- definitions in a style sheet.
+ * [found] list of known definitions.
+ */
+class _VarDefAndUsage extends Visitor {
+  final Messages _messages;
+  final Map<String, VarDefinition> _knownVarDefs;
+  final Map<String, VarDefinition> varDefs = new Map<String, VarDefinition>();
+
+  VarDefinition currVarDefinition;
+  List<Expression> currentExpressions;
+
+  _VarDefAndUsage(this._messages, this._knownVarDefs);
+
+  void visitTree(StyleSheet tree) {
+    visitStyleSheet(tree);
+  }
+
+  visitVarDefinition(VarDefinition node) {
+    // Replace with latest variable definition.
+    currVarDefinition = node;
+
+    _knownVarDefs[node.definedName] = node;
+    varDefs[node.definedName] = node;
+
+    super.visitVarDefinition(node);
+
+    currVarDefinition = null;
+  }
+
+  void visitVarDefinitionDirective(VarDefinitionDirective node) {
+    visitVarDefinition(node.def);
+  }
+
+  void visitExpressions(Expressions node) {
+    currentExpressions = node.expressions;
+    super.visitExpressions(node);
+    currentExpressions = null;
+  }
+
+  void visitVarUsage(VarUsage node) {
+    if (currVarDefinition != null && currVarDefinition.badUsage) return;
+
+    // Don't process other var() inside of a varUsage.  That implies that the
+    // default is a var() too.  Also, don't process any var() inside of a
+    // varDefinition (they're just place holders until we've resolved all real
+    // usages.
+    var expressions = currentExpressions;
+    var index = expressions.indexOf(node);
+    assert(index >= 0);
+    var def = _knownVarDefs[node.name];
+    if (def != null) {
+      if (def.badUsage) {
+        // Remove any expressions pointing to a bad var definition.
+        expressions.removeAt(index);
+        return;
+      }
+      _resolveVarUsage(currentExpressions, index,
+          _findTerminalVarDefinition(_knownVarDefs, def));
+    } else if (node.defaultValues.any((e) => e is VarUsage)) {
+      // Don't have a VarDefinition need to use default values resolve all
+      // default values.
+      var terminalDefaults = <Expression>[];
+      for (var defaultValue in node.defaultValues) {
+        terminalDefaults.addAll(resolveUsageTerminal(defaultValue));
+      }
+      expressions.replaceRange(index, index + 1, terminalDefaults);
+    } else if (node.defaultValues.isNotEmpty) {
+      // No VarDefinition but default value is a terminal expression; use it.
+      expressions.replaceRange(index, index + 1, node.defaultValues);
+    } else {
+      if (currVarDefinition != null) {
+        currVarDefinition.badUsage = true;
+        var mainStyleSheetDef = varDefs[node.name];
+        if (mainStyleSheetDef != null) {
+          varDefs.remove(currVarDefinition.property);
+        }
+      }
+      // Remove var usage that points at an undefined definition.
+      expressions.removeAt(index);
+      _messages.warning("Variable is not defined.", node.span);
+    }
+
+    var oldExpressions = currentExpressions;
+    currentExpressions = node.defaultValues;
+    super.visitVarUsage(node);
+    currentExpressions = oldExpressions;
+  }
+
+  List<Expression> resolveUsageTerminal(VarUsage usage) {
+    var result = [];
+
+    var varDef = _knownVarDefs[usage.name];
+    var expressions;
+    if (varDef == null) {
+      // VarDefinition not found try the defaultValues.
+      expressions = usage.defaultValues;
+    } else {
+      // Use the VarDefinition found.
+      expressions = (varDef.expression as Expressions).expressions;
+    }
+
+    for (var expr in expressions) {
+      if (expr is VarUsage) {
+        // Get terminal value.
+        result.addAll(resolveUsageTerminal(expr));
+      }
+    }
+
+    // We're at a terminal just return the VarDefinition expression.
+    if (result.isEmpty && varDef != null) {
+      result = (varDef.expression as Expressions).expressions;
+    }
+
+    return result;
+  }
+
+  _resolveVarUsage(List<Expression> expressions, int index, VarDefinition def) {
+    var defExpressions = (def.expression as Expressions).expressions;
+    expressions.replaceRange(index, index + 1, defExpressions);
+  }
+}
+
+/** Remove all var definitions. */
+class _RemoveVarDefinitions extends Visitor {
+  void visitTree(StyleSheet tree) {
+    visitStyleSheet(tree);
+  }
+
+  void visitStyleSheet(StyleSheet ss) {
+    ss.topLevels.removeWhere((e) => e is VarDefinitionDirective);
+    super.visitStyleSheet(ss);
+  }
+
+  void visitDeclarationGroup(DeclarationGroup node) {
+    node.declarations.removeWhere((e) => e is VarDefinition);
+    super.visitDeclarationGroup(node);
+  }
+}
+
+/** Find terminal definition (non VarUsage implies real CSS value). */
+VarDefinition _findTerminalVarDefinition(
+    Map<String, VarDefinition> varDefs, VarDefinition varDef) {
+  var expressions = varDef.expression as Expressions;
+  for (var expr in expressions.expressions) {
+    if (expr is VarUsage) {
+      var usageName = (expr as VarUsage).name;
+      var foundDef = varDefs[usageName];
+
+      // If foundDef is unknown check if defaultValues; if it exist then resolve
+      // to terminal value.
+      if (foundDef == null) {
+        // We're either a VarUsage or terminal definition if in varDefs;
+        // either way replace VarUsage with it's default value because the
+        // VarDefinition isn't found.
+        var defaultValues = (expr as VarUsage).defaultValues;
+        var replaceExprs = expressions.expressions;
+        assert(replaceExprs.length == 1);
+        replaceExprs.replaceRange(0, 1, defaultValues);
+        return varDef;
+      }
+      if (foundDef is VarDefinition) {
+        return _findTerminalVarDefinition(varDefs, foundDef);
+      }
+    } else {
+      // Return real CSS property.
+      return varDef;
+    }
+  }
+
+  // Didn't point to a var definition that existed.
+  return varDef;
+}
diff --git a/mojo/public/dart/third_party/csslib/lib/src/property.dart b/mojo/public/dart/third_party/csslib/lib/src/property.dart
new file mode 100644
index 0000000..5d6dc14
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/lib/src/property.dart
@@ -0,0 +1,1233 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/** Representations of CSS styles. */
+
+part of csslib.parser;
+
+// TODO(terry): Prune down this file we do need some of the code in this file
+//              for darker, lighter, how to represent a Font, etc but alot of
+//              the complexity can be removed.
+//              See https://github.com/dart-lang/csslib/issues/7
+
+/**
+ * Base for all style properties (e.g., Color, Font, Border, Margin, etc.)
+ */
+abstract class _StyleProperty {
+  /**
+   * Returns the expression part of a CSS declaration.  Declaration is:
+   *
+   *     property:expression;
+   *
+   * E.g., if property is color then expression could be rgba(255,255,0) the
+   *       CSS declaration would be 'color:rgba(255,255,0);'.
+   *
+   * then _cssExpression would return 'rgba(255,255,0)'.  See
+   * <http://www.w3.org/TR/CSS21/grammar.html>
+   */
+  String get cssExpression;
+}
+
+/**
+ * Base interface for Color, HSL and RGB.
+ */
+abstract class ColorBase {
+  /**
+   * Canonical form for color #rrggbb with alpha blending (0.0 == full
+   * transparency and 1.0 == fully opaque). If _argb length is 6 it's an
+   * rrggbb otherwise it's aarrggbb.
+   */
+  String toHexArgbString();
+
+  /**
+   * Return argb as a value (int).
+   */
+  int get argbValue;
+}
+
+/**
+ * General purpse Color class.  Represent a color as an ARGB value that can be
+ * converted to and from num, hex string, hsl, hsla, rgb, rgba and SVG pre-
+ * defined color constant.
+ */
+class Color implements _StyleProperty, ColorBase {
+  // If _argb length is 6 it's an rrggbb otherwise it's aarrggbb.
+  final String _argb;
+
+  // TODO(terry): Look at reducing Rgba and Hsla classes as factories for
+  //              converting from Color to an Rgba or Hsla for reading only.
+  //              Usefulness of creating an Rgba or Hsla is limited.
+
+  /**
+   * Create a color with an integer representing the rgb value of red, green,
+   * and blue.  The value 0xffffff is the color white #ffffff (CSS style).
+   * The [rgb] value of 0xffd700 would map to #ffd700 or the constant
+   * Color.gold, where ff is red intensity, d7 is green intensity, and 00 is
+   * blue intensity.
+   */
+  Color(int rgb, [num alpha]) : this._argb = Color._rgbToArgbString(rgb, alpha);
+
+  /**
+   * RGB takes three values. The [red], [green], and [blue] parameters are
+   * the intensity of those components where '0' is the least and '256' is the
+   * greatest.
+   *
+   * If [alpha] is provided, it is the level of translucency which ranges from
+   * '0' (completely transparent) to '1.0' (completely opaque).  It will
+   * internally be mapped to an int between '0' and '255' like the other color
+   * components.
+   */
+  Color.createRgba(int red, int green, int blue, [num alpha])
+      : this._argb = Color.convertToHexString(Color._clamp(red, 0, 255),
+          Color._clamp(green, 0, 255), Color._clamp(blue, 0, 255),
+          alpha != null ? Color._clamp(alpha, 0, 1) : alpha);
+
+  /**
+   * Creates a new color from a CSS color string. For more information, see
+   * <https://developer.mozilla.org/en/CSS/color>.
+   */
+  Color.css(String color) : this._argb = Color._convertCssToArgb(color);
+
+  // TODO(jmesserly): I found the use of percents a bit suprising.
+  /**
+   * HSL takes three values.  The [hueDegree] degree on the color wheel; '0' is
+   * the least and '100' is the greatest.  The value '0' or '360' is red, '120'
+   * is green, '240' is blue. Numbers in between reflect different shades.
+   * The [saturationPercent] percentage; where'0' is the least and '100' is the
+   * greatest (100 represents full color).  The [lightnessPercent] percentage;
+   * where'0' is the least and '100' is the greatest.  The value 0 is dark or
+   * black, 100 is light or white and 50 is a medium lightness.
+   *
+   * If [alpha] is provided, it is the level of translucency which ranges from
+   * '0' (completely transparent foreground) to '1.0' (completely opaque
+   * foreground).
+   */
+  Color.createHsla(num hueDegree, num saturationPercent, num lightnessPercent,
+      [num alpha])
+      : this._argb = new Hsla(Color._clamp(hueDegree, 0, 360) / 360,
+          Color._clamp(saturationPercent, 0, 100) / 100,
+          Color._clamp(lightnessPercent, 0, 100) / 100,
+          alpha != null ? Color._clamp(alpha, 0, 1) : alpha).toHexArgbString();
+
+  /**
+   * The hslaRaw takes three values.  The [hue] degree on the color wheel; '0'
+   * is the least and '1' is the greatest.  The value '0' or '1' is red, the
+   * ratio of 120/360 is green, and the ratio of 240/360 is blue.  Numbers in
+   * between reflect different shades.  The [saturation] is a percentage; '0'
+   * is the least and '1' is the greatest.  The value of '1' is equivalent to
+   * 100% (full colour).  The [lightness] is a percentage; '0' is the least and
+   * '1' is the greatest.  The value of '0' is dark (black), the value of '1'
+   * is light (white), and the value of '.50' is a medium lightness.
+   *
+   * The fourth optional parameter is:
+   *   [alpha]      level of translucency range of values is 0..1, zero is a
+   *                completely transparent foreground and 1 is a completely
+   *                opaque foreground.
+   */
+  Color.hslaRaw(num hue, num saturation, num lightness, [num alpha])
+      : this._argb = new Hsla(Color._clamp(hue, 0, 1),
+          Color._clamp(saturation, 0, 1), Color._clamp(lightness, 0, 1),
+          alpha != null ? Color._clamp(alpha, 0, 1) : alpha).toHexArgbString();
+
+  /**
+   * Generate a real constant for pre-defined colors (no leading #).
+   */
+  const Color.hex(this._argb);
+
+  // TODO(jmesserly): this is needed by the example so leave it exposed for now.
+  String toString() => cssExpression;
+
+  // TODO(terry): Regardless of how color is set (rgb, num, css or hsl) we'll
+  //              always return a rgb or rgba loses fidelity when debugging in
+  //              CSS if user uses hsl and would like to edit as hsl, etc.  If
+  //              this is an issue we should keep the original value and not re-
+  //              create the CSS from the normalized value.
+  String get cssExpression {
+    if (_argb.length == 6) {
+      return "#$_argb"; // RGB only, no alpha blending.
+    } else {
+      num alpha = Color.hexToInt(_argb.substring(0, 2));
+      String a = (alpha / 255).toStringAsPrecision(2);
+      int r = Color.hexToInt(_argb.substring(2, 4));
+      int g = Color.hexToInt(_argb.substring(4, 6));
+      int b = Color.hexToInt(_argb.substring(6, 8));
+      return "rgba($r,$g,$b,$a)";
+    }
+  }
+
+  Rgba get rgba {
+    int nextIndex = 0;
+    num a;
+    if (_argb.length == 8) {
+      // Get alpha blending value 0..255
+      int alpha = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2));
+      // Convert to value from 0..1
+      a = double.parse((alpha / 255).toStringAsPrecision(2));
+      nextIndex += 2;
+    }
+    int r = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2));
+    nextIndex += 2;
+    int g = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2));
+    nextIndex += 2;
+    int b = Color.hexToInt(_argb.substring(nextIndex, nextIndex + 2));
+    return new Rgba(r, g, b, a);
+  }
+
+  Hsla get hsla => new Hsla.fromRgba(rgba);
+
+  int get argbValue => Color.hexToInt(_argb);
+
+  bool operator ==(other) => Color.equal(this, other);
+
+  String toHexArgbString() => _argb;
+
+  Color darker(num amount) {
+    Rgba newRgba = Color._createNewTintShadeFromRgba(rgba, -amount);
+    return new Color.hex("${newRgba.toHexArgbString()}");
+  }
+
+  Color lighter(num amount) {
+    Rgba newRgba = Color._createNewTintShadeFromRgba(rgba, amount);
+    return new Color.hex("${newRgba.toHexArgbString()}");
+  }
+
+  static bool equal(ColorBase curr, other) {
+    if (other is Color) {
+      Color o = other;
+      return o.toHexArgbString() == curr.toHexArgbString();
+    } else if (other is Rgba) {
+      Rgba rgb = other;
+      return rgb.toHexArgbString() == curr.toHexArgbString();
+    } else if (other is Hsla) {
+      Hsla hsla = other;
+      return hsla.toHexArgbString() == curr.toHexArgbString();
+    } else {
+      return false;
+    }
+  }
+
+  int get hashCode => _argb.hashCode;
+
+  // Conversion routines:
+
+  static String _rgbToArgbString(int rgba, num alpha) {
+    int a;
+    // If alpha is defined then adjust from 0..1 to 0..255 value, if not set
+    // then a is left as undefined and passed to convertToHexString.
+    if (alpha != null) {
+      a = (Color._clamp(alpha, 0, 1) * 255).round();
+    }
+
+    int r = (rgba & 0xff0000) >> 0x10;
+    int g = (rgba & 0xff00) >> 8;
+    int b = rgba & 0xff;
+
+    return Color.convertToHexString(r, g, b, a);
+  }
+
+  static const int _rgbCss = 1;
+  static const int _rgbaCss = 2;
+  static const int _hslCss = 3;
+  static const int _hslaCss = 4;
+  /**
+   * Parse CSS expressions of the from #rgb, rgb(r,g,b), rgba(r,g,b,a),
+   * hsl(h,s,l), hsla(h,s,l,a) and SVG colors (e.g., darkSlateblue, etc.) and
+   * convert to argb.
+   */
+  static String _convertCssToArgb(String value) {
+    // TODO(terry): Better parser/regex for converting CSS properties.
+    String color = value.trim().replaceAll("\\s", "");
+    if (color[0] == '#') {
+      String v = color.substring(1);
+      Color.hexToInt(v); // Valid hexadecimal, throws if not.
+      return v;
+    } else if (color.length > 0 && color[color.length - 1] == ')') {
+      int type;
+      if (color.indexOf("rgb(") == 0 || color.indexOf("RGB(") == 0) {
+        color = color.substring(4);
+        type = _rgbCss;
+      } else if (color.indexOf("rgba(") == 0 || color.indexOf("RGBA(") == 0) {
+        type = _rgbaCss;
+        color = color.substring(5);
+      } else if (color.indexOf("hsl(") == 0 || color.indexOf("HSL(") == 0) {
+        type = _hslCss;
+        color = color.substring(4);
+      } else if (color.indexOf("hsla(") == 0 || color.indexOf("HSLA(") == 0) {
+        type = _hslaCss;
+        color = color.substring(5);
+      } else {
+        throw new UnsupportedError('CSS property not implemented');
+      }
+
+      color = color.substring(0, color.length - 1); // Strip close paren.
+
+      var args = <num>[];
+      List<String> params = color.split(",");
+      for (String param in params) {
+        args.add(double.parse(param));
+      }
+      switch (type) {
+        case _rgbCss:
+          return Color.convertToHexString(args[0], args[1], args[2]);
+        case _rgbaCss:
+          return Color.convertToHexString(args[0], args[1], args[2], args[3]);
+        case _hslCss:
+          return new Hsla(args[0], args[1], args[2]).toHexArgbString();
+        case _hslaCss:
+          return new Hsla(args[0], args[1], args[2], args[3]).toHexArgbString();
+        default:
+          // Type not defined UnsupportedOperationException should have thrown.
+          assert(true);
+          break;
+      }
+    }
+  }
+
+  static int hexToInt(String hex) => int.parse(hex, radix: 16);
+
+  static String convertToHexString(int r, int g, int b, [num a]) {
+    String rHex = Color._numAs2DigitHex(Color._clamp(r, 0, 255));
+    String gHex = Color._numAs2DigitHex(Color._clamp(g, 0, 255));
+    String bHex = Color._numAs2DigitHex(Color._clamp(b, 0, 255));
+    String aHex = (a != null)
+        ? Color._numAs2DigitHex((Color._clamp(a, 0, 1) * 255).round())
+        : "";
+
+    // TODO(terry) 15.toRadixString(16) return 'F' on Dartium not f as in JS.
+    //             bug: <http://code.google.com/p/dart/issues/detail?id=2670>
+    return "$aHex$rHex$gHex$bHex".toLowerCase();
+  }
+
+  static String _numAs2DigitHex(num v) {
+    // TODO(terry): v.toInt().toRadixString instead of v.toRadixString
+    //              Bug <http://code.google.com/p/dart/issues/detail?id=2671>.
+    String hex = v.toInt().toRadixString(16);
+    if (hex.length == 1) {
+      hex = "0${hex}";
+    }
+    return hex;
+  }
+
+  static num _clamp(num value, num min, num max) =>
+      math.max(math.min(max, value), min);
+
+  /**
+   * Change the tint (make color lighter) or shade (make color darker) of all
+   * parts of [rgba] (r, g and b).  The [amount] is percentage darker between
+   * -1 to 0 for darker and 0 to 1 for lighter; '0' is no change.  The [amount]
+   * will darken or lighten the rgb values; it will not change the alpha value.
+   * If [amount] is outside of the value -1 to +1 then [amount] is changed to
+   * either the min or max direction -1 or 1.
+   *
+   * Darker will approach the color #000000 (black) and lighter will approach
+   * the color #ffffff (white).
+   */
+  static Rgba _createNewTintShadeFromRgba(Rgba rgba, num amount) {
+    int r, g, b;
+    num tintShade = Color._clamp(amount, -1, 1);
+    if (amount < 0 && rgba.r == 255 && rgba.g == 255 && rgba.b == 255) {
+      // TODO(terry): See TODO in _changeTintShadeColor; eliminate this test
+      //              by converting to HSL and adjust lightness although this
+      //              is fastest lighter/darker algorithm.
+      // Darkening white special handling.
+      r = Color._clamp((255 + (255 * tintShade)).round().toInt(), 0, 255);
+      g = Color._clamp((255 + (255 * tintShade)).round().toInt(), 0, 255);
+      b = Color._clamp((255 + (255 * tintShade)).round().toInt(), 0, 255);
+    } else {
+      // All other colors then darkening white go here.
+      r = Color._changeTintShadeColor(rgba.r, tintShade).round().toInt();
+      g = Color._changeTintShadeColor(rgba.g, tintShade).round().toInt();
+      b = Color._changeTintShadeColor(rgba.b, tintShade).round().toInt();
+    }
+    return new Rgba(r, g, b, rgba.a);
+  }
+
+  // TODO(terry): This does an okay lighter/darker; better would be convert to
+  //              HSL then change the lightness.
+  /**
+   * The parameter [v] is the color to change (r, g, or b) in the range '0' to
+   * '255'. The parameter [delta] is a number between '-1' and '1'.  A value
+   * between '-1' and '0' is darker and a value between '0' and '1' is lighter
+   * ('0' imples no change).
+   */
+  static num _changeTintShadeColor(num v, num delta) =>
+      Color._clamp(((1 - delta) * v + (delta * 255)).round(), 0, 255);
+
+  // Predefined CSS colors see <http://www.w3.org/TR/css3-color/>
+  static final Color transparent = const Color.hex("00ffffff"); // Alpha 0.0
+  static final Color aliceBlue = const Color.hex("0f08ff");
+  static final Color antiqueWhite = const Color.hex("0faebd7");
+  static final Color aqua = const Color.hex("00ffff");
+  static final Color aquaMarine = const Color.hex("7fffd4");
+  static final Color azure = const Color.hex("f0ffff");
+  static final Color beige = const Color.hex("f5f5dc");
+  static final Color bisque = const Color.hex("ffe4c4");
+  static final Color black = const Color.hex("000000");
+  static final Color blanchedAlmond = const Color.hex("ffebcd");
+  static final Color blue = const Color.hex("0000ff");
+  static final Color blueViolet = const Color.hex("8a2be2");
+  static final Color brown = const Color.hex("a52a2a");
+  static final Color burlyWood = const Color.hex("deb887");
+  static final Color cadetBlue = const Color.hex("5f9ea0");
+  static final Color chartreuse = const Color.hex("7fff00");
+  static final Color chocolate = const Color.hex("d2691e");
+  static final Color coral = const Color.hex("ff7f50");
+  static final Color cornFlowerBlue = const Color.hex("6495ed");
+  static final Color cornSilk = const Color.hex("fff8dc");
+  static final Color crimson = const Color.hex("dc143c");
+  static final Color cyan = const Color.hex("00ffff");
+  static final Color darkBlue = const Color.hex("00008b");
+  static final Color darkCyan = const Color.hex("008b8b");
+  static final Color darkGoldenRod = const Color.hex("b8860b");
+  static final Color darkGray = const Color.hex("a9a9a9");
+  static final Color darkGreen = const Color.hex("006400");
+  static final Color darkGrey = const Color.hex("a9a9a9");
+  static final Color darkKhaki = const Color.hex("bdb76b");
+  static final Color darkMagenta = const Color.hex("8b008b");
+  static final Color darkOliveGreen = const Color.hex("556b2f");
+  static final Color darkOrange = const Color.hex("ff8c00");
+  static final Color darkOrchid = const Color.hex("9932cc");
+  static final Color darkRed = const Color.hex("8b0000");
+  static final Color darkSalmon = const Color.hex("e9967a");
+  static final Color darkSeaGreen = const Color.hex("8fbc8f");
+  static final Color darkSlateBlue = const Color.hex("483d8b");
+  static final Color darkSlateGray = const Color.hex("2f4f4f");
+  static final Color darkSlateGrey = const Color.hex("2f4f4f");
+  static final Color darkTurquoise = const Color.hex("00ced1");
+  static final Color darkViolet = const Color.hex("9400d3");
+  static final Color deepPink = const Color.hex("ff1493");
+  static final Color deepSkyBlue = const Color.hex("00bfff");
+  static final Color dimGray = const Color.hex("696969");
+  static final Color dimGrey = const Color.hex("696969");
+  static final Color dodgerBlue = const Color.hex("1e90ff");
+  static final Color fireBrick = const Color.hex("b22222");
+  static final Color floralWhite = const Color.hex("fffaf0");
+  static final Color forestGreen = const Color.hex("228b22");
+  static final Color fuchsia = const Color.hex("ff00ff");
+  static final Color gainsboro = const Color.hex("dcdcdc");
+  static final Color ghostWhite = const Color.hex("f8f8ff");
+  static final Color gold = const Color.hex("ffd700");
+  static final Color goldenRod = const Color.hex("daa520");
+  static final Color gray = const Color.hex("808080");
+  static final Color green = const Color.hex("008000");
+  static final Color greenYellow = const Color.hex("adff2f");
+  static final Color grey = const Color.hex("808080");
+  static final Color honeydew = const Color.hex("f0fff0");
+  static final Color hotPink = const Color.hex("ff69b4");
+  static final Color indianRed = const Color.hex("cd5c5c");
+  static final Color indigo = const Color.hex("4b0082");
+  static final Color ivory = const Color.hex("fffff0");
+  static final Color khaki = const Color.hex("f0e68c");
+  static final Color lavender = const Color.hex("e6e6fa");
+  static final Color lavenderBlush = const Color.hex("fff0f5");
+  static final Color lawnGreen = const Color.hex("7cfc00");
+  static final Color lemonChiffon = const Color.hex("fffacd");
+  static final Color lightBlue = const Color.hex("add8e6");
+  static final Color lightCoral = const Color.hex("f08080");
+  static final Color lightCyan = const Color.hex("e0ffff");
+  static final Color lightGoldenRodYellow = const Color.hex("fafad2");
+  static final Color lightGray = const Color.hex("d3d3d3");
+  static final Color lightGreen = const Color.hex("90ee90");
+  static final Color lightGrey = const Color.hex("d3d3d3");
+  static final Color lightPink = const Color.hex("ffb6c1");
+  static final Color lightSalmon = const Color.hex("ffa07a");
+  static final Color lightSeaGreen = const Color.hex("20b2aa");
+  static final Color lightSkyBlue = const Color.hex("87cefa");
+  static final Color lightSlateGray = const Color.hex("778899");
+  static final Color lightSlateGrey = const Color.hex("778899");
+  static final Color lightSteelBlue = const Color.hex("b0c4de");
+  static final Color lightYellow = const Color.hex("ffffe0");
+  static final Color lime = const Color.hex("00ff00");
+  static final Color limeGreen = const Color.hex("32cd32");
+  static final Color linen = const Color.hex("faf0e6");
+  static final Color magenta = const Color.hex("ff00ff");
+  static final Color maroon = const Color.hex("800000");
+  static final Color mediumAquaMarine = const Color.hex("66cdaa");
+  static final Color mediumBlue = const Color.hex("0000cd");
+  static final Color mediumOrchid = const Color.hex("ba55d3");
+  static final Color mediumPurple = const Color.hex("9370db");
+  static final Color mediumSeaGreen = const Color.hex("3cb371");
+  static final Color mediumSlateBlue = const Color.hex("7b68ee");
+  static final Color mediumSpringGreen = const Color.hex("00fa9a");
+  static final Color mediumTurquoise = const Color.hex("48d1cc");
+  static final Color mediumVioletRed = const Color.hex("c71585");
+  static final Color midnightBlue = const Color.hex("191970");
+  static final Color mintCream = const Color.hex("f5fffa");
+  static final Color mistyRose = const Color.hex("ffe4e1");
+  static final Color moccasin = const Color.hex("ffe4b5");
+  static final Color navajoWhite = const Color.hex("ffdead");
+  static final Color navy = const Color.hex("000080");
+  static final Color oldLace = const Color.hex("fdf5e6");
+  static final Color olive = const Color.hex("808000");
+  static final Color oliveDrab = const Color.hex("6b8e23");
+  static final Color orange = const Color.hex("ffa500");
+  static final Color orangeRed = const Color.hex("ff4500");
+  static final Color orchid = const Color.hex("da70d6");
+  static final Color paleGoldenRod = const Color.hex("eee8aa");
+  static final Color paleGreen = const Color.hex("98fb98");
+  static final Color paleTurquoise = const Color.hex("afeeee");
+  static final Color paleVioletRed = const Color.hex("db7093");
+  static final Color papayaWhip = const Color.hex("ffefd5");
+  static final Color peachPuff = const Color.hex("ffdab9");
+  static final Color peru = const Color.hex("cd85ef");
+  static final Color pink = const Color.hex("ffc0cb");
+  static final Color plum = const Color.hex("dda0dd");
+  static final Color powderBlue = const Color.hex("b0e0e6");
+  static final Color purple = const Color.hex("800080");
+  static final Color red = const Color.hex("ff0000");
+  static final Color rosyBrown = const Color.hex("bc8f8f");
+  static final Color royalBlue = const Color.hex("4169e1");
+  static final Color saddleBrown = const Color.hex("8b4513");
+  static final Color salmon = const Color.hex("fa8072");
+  static final Color sandyBrown = const Color.hex("f4a460");
+  static final Color seaGreen = const Color.hex("2e8b57");
+  static final Color seashell = const Color.hex("fff5ee");
+  static final Color sienna = const Color.hex("a0522d");
+  static final Color silver = const Color.hex("c0c0c0");
+  static final Color skyBlue = const Color.hex("87ceeb");
+  static final Color slateBlue = const Color.hex("6a5acd");
+  static final Color slateGray = const Color.hex("708090");
+  static final Color slateGrey = const Color.hex("708090");
+  static final Color snow = const Color.hex("fffafa");
+  static final Color springGreen = const Color.hex("00ff7f");
+  static final Color steelBlue = const Color.hex("4682b4");
+  static final Color tan = const Color.hex("d2b48c");
+  static final Color teal = const Color.hex("008080");
+  static final Color thistle = const Color.hex("d8bfd8");
+  static final Color tomato = const Color.hex("ff6347");
+  static final Color turquoise = const Color.hex("40e0d0");
+  static final Color violet = const Color.hex("ee82ee");
+  static final Color wheat = const Color.hex("f5deb3");
+  static final Color white = const Color.hex("ffffff");
+  static final Color whiteSmoke = const Color.hex("f5f5f5");
+  static final Color yellow = const Color.hex("ffff00");
+  static final Color yellowGreen = const Color.hex("9acd32");
+}
+
+/**
+ * Rgba class for users that want to interact with a color as a RGBA value.
+ */
+class Rgba implements _StyleProperty, ColorBase {
+  // TODO(terry): Consider consolidating rgba to a single 32-bit int, make sure
+  //              it works under JS and Dart VM.
+  final int r;
+  final int g;
+  final int b;
+  final num a;
+
+  Rgba(int red, int green, int blue, [num alpha])
+      : this.r = Color._clamp(red, 0, 255),
+        this.g = Color._clamp(green, 0, 255),
+        this.b = Color._clamp(blue, 0, 255),
+        this.a = (alpha != null) ? Color._clamp(alpha, 0, 1) : alpha;
+
+  factory Rgba.fromString(String hexValue) =>
+      new Color.css("#${Color._convertCssToArgb(hexValue)}").rgba;
+
+  factory Rgba.fromColor(Color color) => color.rgba;
+
+  factory Rgba.fromArgbValue(num value) {
+    return new Rgba(((value.toInt() & 0xff000000) >> 0x18), /* a */
+        ((value.toInt() & 0xff0000) >> 0x10), /* r */
+        ((value.toInt() & 0xff00) >> 8), /* g */
+        ((value.toInt() & 0xff))); /* b */
+  }
+
+  factory Rgba.fromHsla(Hsla hsla) {
+    // Convert to Rgba.
+    // See site <http://easyrgb.com/index.php?X=MATH> for good documentation
+    // and color conversion routines.
+
+    num h = hsla.hue;
+    num s = hsla.saturation;
+    num l = hsla.lightness;
+    num a = hsla.alpha;
+
+    int r;
+    int g;
+    int b;
+
+    if (s == 0) {
+      r = (l * 255).round().toInt();
+      g = r;
+      b = r;
+    } else {
+      num var2;
+
+      if (l < 0.5) {
+        var2 = l * (1 + s);
+      } else {
+        var2 = (l + s) - (s * l);
+      }
+      num var1 = 2 * l - var2;
+
+      r = (255 * Rgba._hueToRGB(var1, var2, h + (1 / 3))).round().toInt();
+      g = (255 * Rgba._hueToRGB(var1, var2, h)).round().toInt();
+      b = (255 * Rgba._hueToRGB(var1, var2, h - (1 / 3))).round().toInt();
+    }
+
+    return new Rgba(r, g, b, a);
+  }
+
+  static num _hueToRGB(num v1, num v2, num vH) {
+    if (vH < 0) {
+      vH += 1;
+    }
+
+    if (vH > 1) {
+      vH -= 1;
+    }
+
+    if ((6 * vH) < 1) {
+      return (v1 + (v2 - v1) * 6 * vH);
+    }
+
+    if ((2 * vH) < 1) {
+      return v2;
+    }
+
+    if ((3 * vH) < 2) {
+      return (v1 + (v2 - v1) * ((2 / 3 - vH) * 6));
+    }
+
+    return v1;
+  }
+
+  bool operator ==(other) => Color.equal(this, other);
+
+  String get cssExpression {
+    if (a == null) {
+      return "#${Color.convertToHexString(r, g, b)}";
+    } else {
+      return "rgba($r,$g,$b,$a)";
+    }
+  }
+
+  String toHexArgbString() => Color.convertToHexString(r, g, b, a);
+
+  int get argbValue {
+    int value = 0;
+    if (a != null) {
+      value = (a.toInt() << 0x18);
+    }
+    value += (r << 0x10);
+    value += (g << 0x08);
+    value += b;
+    return value;
+  }
+
+  Color get color => new Color.createRgba(r, g, b, a);
+  Hsla get hsla => new Hsla.fromRgba(this);
+
+  Rgba darker(num amount) => Color._createNewTintShadeFromRgba(this, -amount);
+  Rgba lighter(num amount) => Color._createNewTintShadeFromRgba(this, amount);
+
+  int get hashCode => toHexArgbString().hashCode;
+}
+
+/**
+ * Hsl class support to interact with a color as a hsl with hue, saturation, and
+ * lightness with optional alpha blending.  The hue is a ratio of 360 degrees
+ * 360° = 1 or 0, (1° == (1/360)), saturation and lightness is a 0..1 fraction
+ * (1 == 100%) and alpha is a 0..1 fraction.
+ */
+class Hsla implements _StyleProperty, ColorBase {
+  final num _h; // Value from 0..1
+  final num _s; // Value from 0..1
+  final num _l; // Value from 0..1
+  final num _a; // Value from 0..1
+
+  /**
+   * [hue] is a 0..1 fraction of 360 degrees (360 == 0).
+   * [saturation] is a 0..1 fraction (100% == 1).
+   * [lightness] is a 0..1 fraction (100% == 1).
+   * [alpha] is a 0..1 fraction, alpha blending between 0..1, 1 == 100% opaque.
+   */
+  Hsla(num hue, num saturation, num lightness, [num alpha])
+      : this._h = (hue == 1) ? 0 : Color._clamp(hue, 0, 1),
+        this._s = Color._clamp(saturation, 0, 1),
+        this._l = Color._clamp(lightness, 0, 1),
+        this._a = (alpha != null) ? Color._clamp(alpha, 0, 1) : alpha;
+
+  factory Hsla.fromString(String hexValue) {
+    Rgba rgba = new Color.css("#${Color._convertCssToArgb(hexValue)}").rgba;
+    return _createFromRgba(rgba.r, rgba.g, rgba.b, rgba.a);
+  }
+
+  factory Hsla.fromColor(Color color) {
+    Rgba rgba = color.rgba;
+    return _createFromRgba(rgba.r, rgba.g, rgba.b, rgba.a);
+  }
+
+  factory Hsla.fromArgbValue(num value) {
+    num a = (value.toInt() & 0xff000000) >> 0x18;
+    int r = (value.toInt() & 0xff0000) >> 0x10;
+    int g = (value.toInt() & 0xff00) >> 8;
+    int b = value.toInt() & 0xff;
+
+    // Convert alpha to 0..1 from (0..255).
+    if (a != null) {
+      a = double.parse((a / 255).toStringAsPrecision(2));
+    }
+
+    return _createFromRgba(r, g, b, a);
+  }
+
+  factory Hsla.fromRgba(Rgba rgba) =>
+      _createFromRgba(rgba.r, rgba.g, rgba.b, rgba.a);
+
+  static Hsla _createFromRgba(num r, num g, num b, num a) {
+    // Convert RGB to hsl.
+    // See site <http://easyrgb.com/index.php?X=MATH> for good documentation
+    // and color conversion routines.
+    r /= 255;
+    g /= 255;
+    b /= 255;
+
+    // Hue, saturation and lightness.
+    num h;
+    num s;
+    num l;
+
+    num minRgb = math.min(r, math.min(g, b));
+    num maxRgb = math.max(r, math.max(g, b));
+    l = (maxRgb + minRgb) / 2;
+    if (l <= 0) {
+      return new Hsla(0, 0, l); // Black;
+    }
+
+    num vm = maxRgb - minRgb;
+    s = vm;
+    if (s > 0) {
+      s /= (l < 0.5) ? (maxRgb + minRgb) : (2 - maxRgb - minRgb);
+    } else {
+      return new Hsla(0, 0, l); // White
+    }
+
+    num r2, g2, b2;
+    r2 = (maxRgb - r) / vm;
+    g2 = (maxRgb - g) / vm;
+    b2 = (maxRgb - b) / vm;
+    if (r == maxRgb) {
+      h = (g == minRgb) ? 5.0 + b2 : 1 - g2;
+    } else if (g == maxRgb) {
+      h = (b == minRgb) ? 1 + r2 : 3 - b2;
+    } else {
+      h = (r == minRgb) ? 3 + g2 : 5 - r2;
+    }
+    h /= 6;
+
+    return new Hsla(h, s, l, a);
+  }
+
+  /**
+   * Returns 0..1 fraction (ratio of 360°, e.g. 1° == 1/360).
+   */
+  num get hue => _h;
+
+  /**
+   * Returns 0..1 fraction (1 == 100%)
+   */
+  num get saturation => _s;
+
+  /**
+   * Returns 0..1 fraction (1 == 100%).
+   */
+  num get lightness => _l;
+
+  /**
+   * Returns number as degrees 0..360.
+   */
+  num get hueDegrees => (_h * 360).round();
+
+  /**
+   * Returns number as percentage 0..100
+   */
+  num get saturationPercentage => (_s * 100).round();
+
+  /**
+   * Returns number as percentage 0..100.
+   */
+  num get lightnessPercentage => (_l * 100).round();
+
+  /**
+   * Returns number as 0..1
+   */
+  num get alpha => _a;
+
+  bool operator ==(other) => Color.equal(this, other);
+
+  String get cssExpression => (_a == null)
+      ? "hsl($hueDegrees,$saturationPercentage,$lightnessPercentage)"
+      : "hsla($hueDegrees,$saturationPercentage,$lightnessPercentage,$_a)";
+
+  String toHexArgbString() => new Rgba.fromHsla(this).toHexArgbString();
+
+  int get argbValue => Color.hexToInt(this.toHexArgbString());
+
+  Color get color => new Color.createHsla(_h, _s, _l, _a);
+  Rgba get rgba => new Rgba.fromHsla(this);
+
+  Hsla darker(num amount) =>
+      new Hsla.fromRgba(new Rgba.fromHsla(this).darker(amount));
+
+  Hsla lighter(num amount) =>
+      new Hsla.fromRgba(new Rgba.fromHsla(this).lighter(amount));
+
+  int get hashCode => toHexArgbString().hashCode;
+}
+
+/** X,Y position. */
+class PointXY implements _StyleProperty {
+  final num x, y;
+  const PointXY(this.x, this.y);
+
+  String get cssExpression {
+    // TODO(terry): TBD
+  }
+}
+
+// TODO(terry): Implement style and color.
+/**
+ * Supports border for measuring with layout.
+ */
+class Border implements _StyleProperty {
+  final int top, left, bottom, right;
+
+  // TODO(terry): Just like CSS, 1-arg -> set all properties, 2-args -> top and
+  //               bottom are first arg, left and right are second, 3-args, and
+  //               4-args -> tlbr or trbl.
+  const Border([this.top, this.left, this.bottom, this.right]);
+
+  // TODO(terry): Consider using Size or width and height.
+  Border.uniform(num amount)
+      : top = amount,
+        left = amount,
+        bottom = amount,
+        right = amount;
+
+  int get width => left + right;
+  int get height => top + bottom;
+
+  String get cssExpression {
+    return (top == left && bottom == right && top == right)
+        ? "${left}px"
+        : "${top != null ? '$top' : '0'}px ${
+      right != null ? '$right' : '0'}px ${
+      bottom != null ? '$bottom' : '0'}px ${
+      left != null ? '$left' : '0'}px";
+  }
+}
+
+/** Font style constants. */
+class FontStyle {
+  /** Font style [normal] default. */
+  static const String normal = "normal";
+  /**
+   * Font style [italic] use explicity crafted italic font otherwise inclined
+   * on the fly like oblique.
+   */
+  static const String italic = "italic";
+  /**
+   * Font style [oblique] is rarely used. The normal style of a font is inclined
+   * on the fly to the right by 8-12 degrees.
+   */
+  static const String oblique = "oblique";
+}
+
+/** Font variant constants. */
+class FontVariant {
+  /** Font style [normal] default. */
+  static const String normal = "normal";
+  /** Font variant [smallCaps]. */
+  static const String smallCaps = "small-caps";
+}
+
+/** Font weight constants values 100, 200, 300, 400, 500, 600, 700, 800, 900. */
+class FontWeight {
+  /** Font weight normal [default] */
+  static const int normal = 400;
+  /** Font weight bold */
+  static const int bold = 700;
+
+  static const int wt100 = 100;
+  static const int wt200 = 200;
+  static const int wt300 = 300;
+  static const int wt400 = 400;
+  static const int wt500 = 500;
+  static const int wt600 = 600;
+  static const int wt700 = 700;
+  static const int wt800 = 800;
+  static const int wt900 = 900;
+}
+
+/** Generic font family names. */
+class FontGeneric {
+  /** Generic family sans-serif font (w/o serifs). */
+  static const String sansSerif = "sans-serif";
+  /** Generic family serif font. */
+  static const String serif = "serif";
+  /** Generic family fixed-width font. */
+  static const monospace = "monospace";
+  /** Generic family emulate handwriting font. */
+  static const String cursive = "cursive";
+  /** Generic family decorative font. */
+  static const String fantasy = "fantasy";
+}
+
+/**
+ * List of most common font families across different platforms.  Use the
+ * collection names in the Font class (e.g., Font.SANS_SERIF, Font.FONT_SERIF,
+ * Font.MONOSPACE, Font.CURSIVE or Font.FANTASY).  These work best on all
+ * platforms using the fonts that best match availability on each platform.
+ * See <http://www.angelfire.com/al4/rcollins/style/fonts.html> for a good
+ * description of fonts available between platforms and browsers.
+ */
+class FontFamily {
+  /** Sans-Serif font for Windows similar to Helvetica on Mac bold/italic. */
+  static const String arial = "arial";
+  /** Sans-Serif font for Windows less common already bolded. */
+  static const String arialBlack = "arial black";
+  /** Sans-Serif font for Mac since 1984, similar to Arial/Helvetica. */
+  static const String geneva = "geneva";
+  /** Sans-Serif font for Windows most readable sans-serif font for displays. */
+  static const String verdana = "verdana";
+  /** Sans-Serif font for Mac since 1984 is identical to Arial. */
+  static const String helvetica = "helvetica";
+
+  /** Serif font for Windows traditional font with “old-style” numerals. */
+  static const String georgia = "georgia";
+  /**
+   * Serif font for Mac. PCs may have the non-scalable Times use Times New
+   * Roman instead.  Times is more compact than Times New Roman.
+   */
+  static const String times = "times";
+  /**
+   * Serif font for Windows most common serif font and default serif font for
+   * most browsers.
+   */
+  static const String timesNewRoman = "times new roman";
+
+  /**
+   * Monospace font for Mac/Windows most common. Scalable on Mac not scalable
+   * on Windows.
+   */
+  static const String courier = "courier";
+  /** Monospace font for Mac/Windows scalable on both platforms. */
+  static const String courierNew = "courier new";
+
+  /** Cursive font for Windows and default cursive font for IE. */
+  static const String comicSansMs = "comic sans ms";
+  /** Cursive font for Mac on Macs 2000 and newer. */
+  static const String textile = "textile";
+  /** Cursive font for older Macs. */
+  static const String appleChancery = "apple chancery";
+  /** Cursive font for some PCs. */
+  static const String zaphChancery = "zaph chancery";
+
+  /** Fantasy font on most Mac/Windows/Linux platforms. */
+  static const String impact = "impact";
+  /** Fantasy font for Windows. */
+  static const String webdings = "webdings";
+}
+
+class LineHeight {
+  final num height;
+  final bool inPixels;
+  const LineHeight(this.height, {this.inPixels: true});
+}
+
+// TODO(terry): Support @font-face fule.
+/**
+ * Font style support for size, family, weight, style, variant, and lineheight.
+ */
+class Font implements _StyleProperty {
+  /** Collection of most common sans-serif fonts in order. */
+  static const List<String> sansSerif = const [
+    FontFamily.arial,
+    FontFamily.verdana,
+    FontFamily.geneva,
+    FontFamily.helvetica,
+    FontGeneric.sansSerif
+  ];
+
+  /** Collection of most common serif fonts in order. */
+  static const List<String> serif = const [
+    FontFamily.georgia,
+    FontFamily.timesNewRoman,
+    FontFamily.times,
+    FontGeneric.serif
+  ];
+  /** Collection of most common monospace fonts in order. */
+  static const List<String> monospace = const [
+    FontFamily.courierNew,
+    FontFamily.courier,
+    FontGeneric.monospace
+  ];
+  /** Collection of most common cursive fonts in order. */
+  static const List<String> cursive = const [
+    FontFamily.textile,
+    FontFamily.appleChancery,
+    FontFamily.zaphChancery,
+    FontGeneric.fantasy
+  ];
+  /** Collection of most common fantasy fonts in order. */
+  static const List<String> fantasy = const [
+    FontFamily.comicSansMs,
+    FontFamily.impact,
+    FontFamily.webdings,
+    FontGeneric.fantasy
+  ];
+
+  // TODO(terry): Should support the values xx-small, small, large, xx-large,
+  //              etc. (mapped to a pixel sized font)?
+  /** Font size in pixels. */
+  final num size;
+
+  // TODO(terry): _family should be an immutable list, wrapper class to do this
+  //              should exist in Dart.
+  /**
+   * Family specifies a list of fonts, the browser will sequentially select the
+   * the first known/supported font.  There are two types of font families the
+   * family-name (e.g., arial, times, courier, etc) or the generic-family (e.g.,
+   * serif, sans-seric, etc.)
+   */
+  final List<String> family;
+
+  /** Font weight from 100, 200, 300, 400, 500, 600, 700, 800, 900 */
+  final int weight;
+
+  /** Style of a font normal, italic, oblique. */
+  final String style;
+
+  /**
+   * Font variant NORMAL (default) or SMALL_CAPS.  Different set of font glyph
+   * lower case letters designed to have to fit within the font-height and
+   * weight of the corresponding lowercase letters.
+   */
+  final String variant;
+
+  final LineHeight lineHeight;
+
+  // TODO(terry): Size and computedLineHeight are in pixels.  Need to figure out
+  //              how to handle in other units (specified in other units) like
+  //              points, inches, etc.  Do we have helpers like Units.Points(12)
+  //              where 12 is in points and that's converted to pixels?
+  // TODO(terry): lineHeight is computed as 1.2 although CSS_RESET is 1.0 we
+  //              need to be consistent some browsers use 1 others 1.2.
+  // TODO(terry): There is a school of thought "Golden Ratio Typography".
+  // Where width to display the text is also important in computing the line
+  // height.  Classic typography suggest the ratio be 1.5.  See
+  // <http://www.pearsonified.com/2011/12/golden-ratio-typography.php> and
+  // <http://meyerweb.com/eric/thoughts/2008/05/06/line-height-abnormal/>.
+  /**
+   * Create a font using [size] of font in pixels, [family] name of font(s)
+   * using [FontFamily], [style] of the font using [FontStyle], [variant] using
+   * [FontVariant], and [lineHeight] extra space (leading) around the font in
+   * pixels, if not specified it's 1.2 the font size.
+   */
+  const Font({this.size, this.family, this.weight, this.style, this.variant,
+      this.lineHeight});
+
+  /**
+   * Merge the two fonts and return the result. See [Style.merge] for
+   * more information.
+   */
+  factory Font.merge(Font a, Font b) {
+    if (a == null) return b;
+    if (b == null) return a;
+    return new Font._merge(a, b);
+  }
+
+  Font._merge(Font a, Font b)
+      : size = _mergeVal(a.size, b.size),
+        family = _mergeVal(a.family, b.family),
+        weight = _mergeVal(a.weight, b.weight),
+        style = _mergeVal(a.style, b.style),
+        variant = _mergeVal(a.variant, b.variant),
+        lineHeight = _mergeVal(a.lineHeight, b.lineHeight);
+
+  /**
+   * Shorthand CSS format for font is:
+   *
+   *    font-style font-variant font-weight font-size/line-height font-family
+   *
+   * The font-size and font-family values are required. If any of the other
+   * values are missing the default value is used.
+   */
+  String get cssExpression {
+    // TODO(jimhug): include variant, style, other options
+    if (weight != null) {
+      // TODO(jacobr): is this really correct for lineHeight?
+      if (lineHeight != null) {
+        return "$weight ${size}px/$lineHeightInPixels $_fontsAsString";
+      }
+      return '$weight ${size}px $_fontsAsString';
+    }
+
+    return '${size}px $_fontsAsString';
+  }
+
+  Font scale(num ratio) => new Font(
+      size: size * ratio,
+      family: family,
+      weight: weight,
+      style: style,
+      variant: variant);
+
+  /**
+   * The lineHeight, provides an indirect means to specify the leading. The
+   * leading is the difference between the font-size height and the (used)
+   * value of line height in pixels.  If lineHeight is not specified it's
+   * automatically computed as 1.2 of the font size.  Firefox is 1.2, Safari is
+   * ~1.2, and CSS suggest a ration from 1 to 1.2 of the font-size when
+   * computing line-height. The Font class constructor has the computation for
+   * _lineHeight.
+   */
+  num get lineHeightInPixels {
+    if (lineHeight != null) {
+      if (lineHeight.inPixels) {
+        return lineHeight.height;
+      } else {
+        return (size != null) ? lineHeight.height * size : null;
+      }
+    } else {
+      return (size != null) ? size * 1.2 : null;
+    }
+  }
+
+  int get hashCode {
+    // TODO(jimhug): Lot's of potential collisions here. List of fonts, etc.
+    return size.toInt() % family[0].hashCode;
+  }
+
+  bool operator ==(other) {
+    if (other is! Font) return false;
+    Font o = other;
+    return o.size == size &&
+        o.family == family &&
+        o.weight == weight &&
+        o.lineHeight == lineHeight &&
+        o.style == style &&
+        o.variant == variant;
+  }
+
+  // TODO(terry): This is fragile should probably just iterate through the list
+  //              of fonts construction the font-family string.
+  /** Return fonts as a comma seperated list sans the square brackets. */
+  String get _fontsAsString {
+    String fonts = family.toString();
+    return fonts.length > 2 ? fonts.substring(1, fonts.length - 1) : "";
+  }
+}
+
+/**
+ * This class stores the sizes of the box edges in the CSS [box model][]. Each
+ * edge area is placed around the sides of the content box. The innermost area
+ * is the [Style.padding] area which has a background and surrounds the content.
+ * The content and padding area is surrounded by the [Style.border], which
+ * itself is surrounded by the transparent [Style.margin]. This box represents
+ * the eges of padding, border, or margin depending on which accessor was used
+ * to retrieve it.
+ *
+ * [box model]: https://developer.mozilla.org/en/CSS/box_model
+ */
+class BoxEdge {
+  /** The size of the left edge, or null if the style has no edge. */
+  final num left;
+
+  /** The size of the top edge, or null if the style has no edge. */
+  final num top;
+
+  /** The size of the right edge, or null if the style has no edge. */
+  final num right;
+
+  /** The size of the bottom edge, or null if the style has no edge. */
+  final num bottom;
+
+  /**
+   * Creates a box edge with the specified [left], [top], [right], and
+   * [bottom] width.
+   */
+  const BoxEdge([this.left, this.top, this.right, this.bottom]);
+
+  /**
+   * Creates a box edge with the specified [top], [right], [bottom], and
+   * [left] width. This matches the typical CSS order:
+   * <https://developer.mozilla.org/en/CSS/margin>
+   * <https://developer.mozilla.org/en/CSS/border-width>
+   * <https://developer.mozilla.org/en/CSS/padding>.
+   */
+  const BoxEdge.clockwiseFromTop(this.top, this.right, this.bottom, this.left);
+
+  /**
+   * This is a helper to creates a box edge with the same [left], [top]
+   * [right], and [bottom] widths.
+   */
+  const BoxEdge.uniform(num size)
+      : top = size,
+        left = size,
+        bottom = size,
+        right = size;
+
+  /**
+   * Takes a possibly null box edge, with possibly null metrics, and fills
+   * them in with 0 instead.
+   */
+  factory BoxEdge.nonNull(BoxEdge other) {
+    if (other == null) return const BoxEdge(0, 0, 0, 0);
+    num left = other.left;
+    num top = other.top;
+    num right = other.right;
+    num bottom = other.bottom;
+    bool make = false;
+    if (left == null) {
+      make = true;
+      left = 0;
+    }
+    if (top == null) {
+      make = true;
+      top = 0;
+    }
+    if (right == null) {
+      make = true;
+      right = 0;
+    }
+    if (bottom == null) {
+      make = true;
+      bottom = 0;
+    }
+    return make ? new BoxEdge(left, top, right, bottom) : other;
+  }
+
+  /**
+   * Merge the two box edge sizes and return the result. See [Style.merge] for
+   * more information.
+   */
+  factory BoxEdge.merge(BoxEdge x, BoxEdge y) {
+    if (x == null) return y;
+    if (y == null) return x;
+    return new BoxEdge._merge(x, y);
+  }
+
+  BoxEdge._merge(BoxEdge x, BoxEdge y)
+      : left = _mergeVal(x.left, y.left),
+        top = _mergeVal(x.top, y.top),
+        right = _mergeVal(x.right, y.right),
+        bottom = _mergeVal(x.bottom, y.bottom);
+
+  /**
+   * The total size of the horizontal edges. Equal to [left] + [right], where
+   * null is interpreted as 0px.
+   */
+  num get width => (left != null ? left : 0) + (right != null ? right : 0);
+
+  /**
+   * The total size of the vertical edges. Equal to [top] + [bottom], where
+   * null is interpreted as 0px.
+   */
+  num get height => (top != null ? top : 0) + (bottom != null ? bottom : 0);
+}
+
+_mergeVal(x, y) => y != null ? y : x;
diff --git a/mojo/public/dart/third_party/csslib/lib/src/token.dart b/mojo/public/dart/third_party/csslib/lib/src/token.dart
new file mode 100644
index 0000000..e30484d
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/lib/src/token.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of csslib.parser;
+
+/**
+ * A single token in the Dart language.
+ */
+class Token {
+  /** A member of [TokenKind] specifying what kind of token this is. */
+  final int kind;
+
+  /** The location where this token was parsed from. */
+  final FileSpan span;
+
+  /** The start offset of this token. */
+  int get start => span.start.offset;
+
+  /** The end offset of this token. */
+  int get end => span.end.offset;
+
+  /** Returns the source text corresponding to this [Token]. */
+  String get text => span.text;
+
+  Token(this.kind, this.span);
+
+  /** Returns a pretty representation of this token for error messages. **/
+  String toString() {
+    var kindText = TokenKind.kindToString(kind);
+    var actualText = text.trim();
+    if (kindText != actualText) {
+      if (actualText.length > 10) {
+        actualText = '${actualText.substring(0, 8)}...';
+      }
+      return '$kindText($actualText)';
+    } else {
+      return kindText;
+    }
+  }
+}
+
+/** A token containing a parsed literal value. */
+class LiteralToken extends Token {
+  var value;
+  LiteralToken(int kind, FileSpan span, this.value) : super(kind, span);
+}
+
+/** A token containing error information. */
+class ErrorToken extends Token {
+  String message;
+  ErrorToken(int kind, FileSpan span, this.message) : super(kind, span);
+}
+
+/**
+ * CSS ident-token.
+ *
+ * See <http://dev.w3.org/csswg/css-syntax/#typedef-ident-token> and
+ * <http://dev.w3.org/csswg/css-syntax/#ident-token-diagram>.
+ */
+class IdentifierToken extends Token {
+  final String text;
+
+  IdentifierToken(this.text, int kind, FileSpan span) : super(kind, span);
+}
diff --git a/mojo/public/dart/third_party/csslib/lib/src/tokenizer.dart b/mojo/public/dart/third_party/csslib/lib/src/tokenizer.dart
new file mode 100644
index 0000000..d423104
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/lib/src/tokenizer.dart
@@ -0,0 +1,456 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of csslib.parser;
+
+class Tokenizer extends TokenizerBase {
+  /** U+ prefix for unicode characters. */
+  final UNICODE_U = 'U'.codeUnitAt(0);
+  final UNICODE_LOWER_U = 'u'.codeUnitAt(0);
+  final UNICODE_PLUS = '+'.codeUnitAt(0);
+
+  final QUESTION_MARK = '?'.codeUnitAt(0);
+
+  /** CDATA keyword. */
+  final List CDATA_NAME = 'CDATA'.codeUnits;
+
+  Tokenizer(SourceFile file, String text, bool skipWhitespace, [int index = 0])
+      : super(file, text, skipWhitespace, index);
+
+  Token next({unicodeRange: false}) {
+    // keep track of our starting position
+    _startIndex = _index;
+
+    int ch;
+    ch = _nextChar();
+    switch (ch) {
+      case TokenChar.NEWLINE:
+      case TokenChar.RETURN:
+      case TokenChar.SPACE:
+      case TokenChar.TAB:
+        return finishWhitespace();
+      case TokenChar.END_OF_FILE:
+        return _finishToken(TokenKind.END_OF_FILE);
+      case TokenChar.AT:
+        int peekCh = _peekChar();
+        if (TokenizerHelpers.isIdentifierStart(peekCh)) {
+          var oldIndex = _index;
+          var oldStartIndex = _startIndex;
+
+          _startIndex = _index;
+          ch = _nextChar();
+          finishIdentifier();
+
+          // Is it a directive?
+          int tokId = TokenKind.matchDirectives(
+              _text, _startIndex, _index - _startIndex);
+          if (tokId == -1) {
+            // No, is it a margin directive?
+            tokId = TokenKind.matchMarginDirectives(
+                _text, _startIndex, _index - _startIndex);
+          }
+
+          if (tokId != -1) {
+            return _finishToken(tokId);
+          } else {
+            // Didn't find a CSS directive or margin directive so the @name is
+            // probably the Less definition '@name: value_variable_definition'.
+            _startIndex = oldStartIndex;
+            _index = oldIndex;
+          }
+        }
+        return _finishToken(TokenKind.AT);
+      case TokenChar.DOT:
+        int start = _startIndex; // Start where the dot started.
+        if (maybeEatDigit()) {
+          // looks like a number dot followed by digit(s).
+          Token number = finishNumber();
+          if (number.kind == TokenKind.INTEGER) {
+            // It's a number but it's preceeded by a dot, so make it a double.
+            _startIndex = start;
+            return _finishToken(TokenKind.DOUBLE);
+          } else {
+            // Don't allow dot followed by a double (e.g,  '..1').
+            return _errorToken();
+          }
+        }
+        // It's really a dot.
+        return _finishToken(TokenKind.DOT);
+      case TokenChar.LPAREN:
+        return _finishToken(TokenKind.LPAREN);
+      case TokenChar.RPAREN:
+        return _finishToken(TokenKind.RPAREN);
+      case TokenChar.LBRACE:
+        return _finishToken(TokenKind.LBRACE);
+      case TokenChar.RBRACE:
+        return _finishToken(TokenKind.RBRACE);
+      case TokenChar.LBRACK:
+        return _finishToken(TokenKind.LBRACK);
+      case TokenChar.RBRACK:
+        if (_maybeEatChar(TokenChar.RBRACK) &&
+            _maybeEatChar(TokenChar.GREATER)) {
+          // ]]>
+          return next();
+        }
+        return _finishToken(TokenKind.RBRACK);
+      case TokenChar.HASH:
+        return _finishToken(TokenKind.HASH);
+      case TokenChar.PLUS:
+        if (maybeEatDigit()) return finishNumber();
+        return _finishToken(TokenKind.PLUS);
+      case TokenChar.MINUS:
+        if (inSelectorExpression || unicodeRange) {
+          // If parsing in pseudo function expression then minus is an operator
+          // not part of identifier e.g., interval value range (e.g. U+400-4ff)
+          // or minus operator in selector expression.
+          return _finishToken(TokenKind.MINUS);
+        } else if (maybeEatDigit()) {
+          return finishNumber();
+        } else if (TokenizerHelpers.isIdentifierStart(ch)) {
+          return finishIdentifier();
+        }
+        return _finishToken(TokenKind.MINUS);
+      case TokenChar.GREATER:
+        return _finishToken(TokenKind.GREATER);
+      case TokenChar.TILDE:
+        if (_maybeEatChar(TokenChar.EQUALS)) {
+          return _finishToken(TokenKind.INCLUDES); // ~=
+        }
+        return _finishToken(TokenKind.TILDE);
+      case TokenChar.ASTERISK:
+        if (_maybeEatChar(TokenChar.EQUALS)) {
+          return _finishToken(TokenKind.SUBSTRING_MATCH); // *=
+        }
+        return _finishToken(TokenKind.ASTERISK);
+      case TokenChar.AMPERSAND:
+        return _finishToken(TokenKind.AMPERSAND);
+      case TokenChar.NAMESPACE:
+        if (_maybeEatChar(TokenChar.EQUALS)) {
+          return _finishToken(TokenKind.DASH_MATCH); // |=
+        }
+        return _finishToken(TokenKind.NAMESPACE);
+      case TokenChar.COLON:
+        return _finishToken(TokenKind.COLON);
+      case TokenChar.COMMA:
+        return _finishToken(TokenKind.COMMA);
+      case TokenChar.SEMICOLON:
+        return _finishToken(TokenKind.SEMICOLON);
+      case TokenChar.PERCENT:
+        return _finishToken(TokenKind.PERCENT);
+      case TokenChar.SINGLE_QUOTE:
+        return _finishToken(TokenKind.SINGLE_QUOTE);
+      case TokenChar.DOUBLE_QUOTE:
+        return _finishToken(TokenKind.DOUBLE_QUOTE);
+      case TokenChar.SLASH:
+        if (_maybeEatChar(TokenChar.ASTERISK)) return finishMultiLineComment();
+        return _finishToken(TokenKind.SLASH);
+      case TokenChar.LESS: // <!--
+        if (_maybeEatChar(TokenChar.BANG)) {
+          if (_maybeEatChar(TokenChar.MINUS) &&
+              _maybeEatChar(TokenChar.MINUS)) {
+            return finishMultiLineComment();
+          } else if (_maybeEatChar(TokenChar.LBRACK) &&
+              _maybeEatChar(CDATA_NAME[0]) &&
+              _maybeEatChar(CDATA_NAME[1]) &&
+              _maybeEatChar(CDATA_NAME[2]) &&
+              _maybeEatChar(CDATA_NAME[3]) &&
+              _maybeEatChar(CDATA_NAME[4]) &&
+              _maybeEatChar(TokenChar.LBRACK)) {
+            // <![CDATA[
+            return next();
+          }
+        }
+        return _finishToken(TokenKind.LESS);
+      case TokenChar.EQUALS:
+        return _finishToken(TokenKind.EQUALS);
+      case TokenChar.CARET:
+        if (_maybeEatChar(TokenChar.EQUALS)) {
+          return _finishToken(TokenKind.PREFIX_MATCH); // ^=
+        }
+        return _finishToken(TokenKind.CARET);
+      case TokenChar.DOLLAR:
+        if (_maybeEatChar(TokenChar.EQUALS)) {
+          return _finishToken(TokenKind.SUFFIX_MATCH); // $=
+        }
+        return _finishToken(TokenKind.DOLLAR);
+      case TokenChar.BANG:
+        Token tok = finishIdentifier();
+        return (tok == null) ? _finishToken(TokenKind.BANG) : tok;
+      default:
+        // TODO(jmesserly): this is used for IE8 detection; I'm not sure it's
+        // appropriate outside of a few specific places; certainly shouldn't
+        // be parsed in selectors.
+        if (!inSelector && ch == TokenChar.BACKSLASH) {
+          return _finishToken(TokenKind.BACKSLASH);
+        }
+
+        if (unicodeRange) {
+          // Three types of unicode ranges:
+          //   - single code point (e.g. U+416)
+          //   - interval value range (e.g. U+400-4ff)
+          //   - range where trailing ‘?’ characters imply ‘any digit value’
+          //   (e.g. U+4??)
+          if (maybeEatHexDigit()) {
+            var t = finishHexNumber();
+            // Any question marks then it's a HEX_RANGE not HEX_NUMBER.
+            if (maybeEatQuestionMark()) finishUnicodeRange();
+            return t;
+          } else if (maybeEatQuestionMark()) {
+            // HEX_RANGE U+N???
+            return finishUnicodeRange();
+          } else {
+            return _errorToken();
+          }
+        } else if ((ch == UNICODE_U || ch == UNICODE_LOWER_U) &&
+            (_peekChar() == UNICODE_PLUS)) {
+          // Unicode range: U+uNumber[-U+uNumber]
+          //   uNumber = 0..10FFFF
+          _nextChar(); // Skip +
+          _startIndex = _index; // Starts at the number
+          return _finishToken(TokenKind.UNICODE_RANGE);
+        } else if (varDef(ch)) {
+          return _finishToken(TokenKind.VAR_DEFINITION);
+        } else if (varUsage(ch)) {
+          return _finishToken(TokenKind.VAR_USAGE);
+        } else if (TokenizerHelpers.isIdentifierStart(ch)) {
+          return finishIdentifier();
+        } else if (TokenizerHelpers.isDigit(ch)) {
+          return finishNumber();
+        }
+        return _errorToken();
+    }
+  }
+
+  bool varDef(int ch) {
+    return ch == 'v'.codeUnitAt(0) &&
+        _maybeEatChar('a'.codeUnitAt(0)) &&
+        _maybeEatChar('r'.codeUnitAt(0)) &&
+        _maybeEatChar('-'.codeUnitAt(0));
+  }
+
+  bool varUsage(int ch) {
+    return ch == 'v'.codeUnitAt(0) &&
+        _maybeEatChar('a'.codeUnitAt(0)) &&
+        _maybeEatChar('r'.codeUnitAt(0)) &&
+        (_peekChar() == '-'.codeUnitAt(0));
+  }
+
+  Token _errorToken([String message = null]) {
+    return _finishToken(TokenKind.ERROR);
+  }
+
+  int getIdentifierKind() {
+    // Is the identifier a unit type?
+    int tokId = -1;
+
+    // Don't match units in selectors or selector expressions.
+    if (!inSelectorExpression && !inSelector) {
+      tokId = TokenKind.matchUnits(_text, _startIndex, _index - _startIndex);
+    }
+    if (tokId == -1) {
+      tokId = (_text.substring(_startIndex, _index) == '!important')
+          ? TokenKind.IMPORTANT
+          : -1;
+    }
+
+    return tokId >= 0 ? tokId : TokenKind.IDENTIFIER;
+  }
+
+  Token finishIdentifier() {
+    // If we encounter an escape sequence, remember it so we can post-process
+    // to unescape.
+    var chars = [];
+
+    // backup so we can start with the first character
+    int validateFrom = _index;
+    _index = _startIndex;
+    while (_index < _text.length) {
+      int ch = _text.codeUnitAt(_index);
+
+      // If the previous character was "\" we need to escape. T
+      // http://www.w3.org/TR/CSS21/syndata.html#characters
+      // if followed by hexadecimal digits, create the appropriate character.
+      // otherwise, include the character in the identifier and don't treat it
+      // specially.
+      if (ch == 92 /*\*/ && _inString) {
+        int startHex = ++_index;
+        eatHexDigits(startHex + 6);
+        if (_index != startHex) {
+          // Parse the hex digits and add that character.
+          chars.add(int.parse('0x' + _text.substring(startHex, _index)));
+
+          if (_index == _text.length) break;
+
+          // if we stopped the hex because of a whitespace char, skip it
+          ch = _text.codeUnitAt(_index);
+          if (_index - startHex != 6 &&
+              (ch == TokenChar.SPACE ||
+                  ch == TokenChar.TAB ||
+                  ch == TokenChar.RETURN ||
+                  ch == TokenChar.NEWLINE)) {
+            _index++;
+          }
+        } else {
+          // not a digit, just add the next character literally
+          if (_index == _text.length) break;
+          chars.add(_text.codeUnitAt(_index++));
+        }
+      } else if (_index < validateFrom ||
+          (inSelectorExpression
+              ? TokenizerHelpers.isIdentifierPartExpr(ch)
+              : TokenizerHelpers.isIdentifierPart(ch))) {
+        chars.add(ch);
+        _index++;
+      } else {
+        // Not an identifier or escaped character.
+        break;
+      }
+    }
+
+    var span = _file.span(_startIndex, _index);
+    var text = new String.fromCharCodes(chars);
+
+    return new IdentifierToken(text, getIdentifierKind(), span);
+  }
+
+  Token finishNumber() {
+    eatDigits();
+
+    if (_peekChar() == 46 /*.*/) {
+      // Handle the case of 1.toString().
+      _nextChar();
+      if (TokenizerHelpers.isDigit(_peekChar())) {
+        eatDigits();
+        return _finishToken(TokenKind.DOUBLE);
+      } else {
+        _index -= 1;
+      }
+    }
+
+    return _finishToken(TokenKind.INTEGER);
+  }
+
+  bool maybeEatDigit() {
+    if (_index < _text.length &&
+        TokenizerHelpers.isDigit(_text.codeUnitAt(_index))) {
+      _index += 1;
+      return true;
+    }
+    return false;
+  }
+
+  Token finishHexNumber() {
+    eatHexDigits(_text.length);
+    return _finishToken(TokenKind.HEX_INTEGER);
+  }
+
+  void eatHexDigits(int end) {
+    end = math.min(end, _text.length);
+    while (_index < end) {
+      if (TokenizerHelpers.isHexDigit(_text.codeUnitAt(_index))) {
+        _index += 1;
+      } else {
+        return;
+      }
+    }
+  }
+
+  bool maybeEatHexDigit() {
+    if (_index < _text.length &&
+        TokenizerHelpers.isHexDigit(_text.codeUnitAt(_index))) {
+      _index += 1;
+      return true;
+    }
+    return false;
+  }
+
+  bool maybeEatQuestionMark() {
+    if (_index < _text.length && _text.codeUnitAt(_index) == QUESTION_MARK) {
+      _index += 1;
+      return true;
+    }
+    return false;
+  }
+
+  void eatQuestionMarks() {
+    while (_index < _text.length) {
+      if (_text.codeUnitAt(_index) == QUESTION_MARK) {
+        _index += 1;
+      } else {
+        return;
+      }
+    }
+  }
+
+  Token finishUnicodeRange() {
+    eatQuestionMarks();
+    return _finishToken(TokenKind.HEX_RANGE);
+  }
+
+  Token finishMultiLineComment() {
+    while (true) {
+      int ch = _nextChar();
+      if (ch == 0) {
+        return _finishToken(TokenKind.INCOMPLETE_COMMENT);
+      } else if (ch == 42 /*'*'*/) {
+        if (_maybeEatChar(47 /*'/'*/)) {
+          if (_inString) {
+            return next();
+          } else {
+            return _finishToken(TokenKind.COMMENT);
+          }
+        }
+      } else if (ch == TokenChar.MINUS) {
+        /* Check if close part of Comment Definition --> (CDC). */
+        if (_maybeEatChar(TokenChar.MINUS)) {
+          if (_maybeEatChar(TokenChar.GREATER)) {
+            if (_inString) {
+              return next();
+            } else {
+              return _finishToken(TokenKind.HTML_COMMENT);
+            }
+          }
+        }
+      }
+    }
+    return _errorToken();
+  }
+}
+
+/** Static helper methods. */
+class TokenizerHelpers {
+  static bool isIdentifierStart(int c) {
+    return isIdentifierStartExpr(c) || c == 45 /*-*/;
+  }
+
+  static bool isDigit(int c) {
+    return (c >= 48 /*0*/ && c <= 57 /*9*/);
+  }
+
+  static bool isHexDigit(int c) {
+    return (isDigit(c) ||
+        (c >= 97 /*a*/ && c <= 102 /*f*/) ||
+        (c >= 65 /*A*/ && c <= 70 /*F*/));
+  }
+
+  static bool isIdentifierPart(int c) {
+    return isIdentifierPartExpr(c) || c == 45 /*-*/;
+  }
+
+  /** Pseudo function expressions identifiers can't have a minus sign. */
+  static bool isIdentifierStartExpr(int c) {
+    return ((c >= 97 /*a*/ && c <= 122 /*z*/) ||
+        (c >= 65 /*A*/ && c <= 90 /*Z*/) ||
+        // Note: Unicode 10646 chars U+00A0 or higher are allowed, see:
+        // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+        // http://www.w3.org/TR/CSS21/syndata.html#characters
+        // Also, escaped character should be allowed.
+        c == 95 /*_*/ || c >= 0xA0 || c == 92 /*\*/);
+  }
+
+  /** Pseudo function expressions identifiers can't have a minus sign. */
+  static bool isIdentifierPartExpr(int c) {
+    return (isIdentifierStartExpr(c) || isDigit(c));
+  }
+}
diff --git a/mojo/public/dart/third_party/csslib/lib/src/tokenizer_base.dart b/mojo/public/dart/third_party/csslib/lib/src/tokenizer_base.dart
new file mode 100644
index 0000000..663c987
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/lib/src/tokenizer_base.dart
@@ -0,0 +1,418 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Generated by scripts/tokenizer_gen.py.
+
+part of csslib.parser;
+
+/** Tokenizer state to support look ahead for Less' nested selectors. */
+class TokenizerState {
+  final int index;
+  final int startIndex;
+  final bool inSelectorExpression;
+  final bool inSelector;
+
+  TokenizerState(TokenizerBase base)
+      : index = base._index,
+        startIndex = base._startIndex,
+        inSelectorExpression = base.inSelectorExpression,
+        inSelector = base.inSelector;
+}
+
+/**
+ * The base class for our tokenizer. The hand coded parts are in this file, with
+ * the generated parts in the subclass Tokenizer.
+ */
+abstract class TokenizerBase {
+  final SourceFile _file;
+  final String _text;
+
+  bool _inString;
+
+  /**
+   * Changes tokenization when in a pseudo function expression.  If true then
+   * minus signs are handled as operators instead of identifiers.
+   */
+  bool inSelectorExpression = false;
+
+  /**
+   * Changes tokenization when in selectors. If true, it prevents identifiers
+   * from being treated as units. This would break things like ":lang(fr)" or
+   * the HTML (unknown) tag name "px", which is legal to use in a selector.
+   */
+  // TODO(jmesserly): is this a problem elsewhere? "fr" for example will be
+  // processed as a "fraction" unit token, preventing it from working in
+  // places where an identifier is expected. This was breaking selectors like:
+  //     :lang(fr)
+  // The assumption that "fr" always means fraction (and similar issue with
+  // other units) doesn't seem valid. We probably should defer this
+  // analysis until we reach places in the parser where units are expected.
+  // I'm not sure this is tokenizing as described in the specs:
+  //     http://dev.w3.org/csswg/css-syntax/
+  //     http://dev.w3.org/csswg/selectors4/
+  bool inSelector = false;
+
+  int _index = 0;
+  int _startIndex = 0;
+
+  TokenizerBase(this._file, this._text, this._inString,
+      [this._index = 0]);
+
+  Token next();
+  int getIdentifierKind();
+
+  /** Snapshot of Tokenizer scanning state. */
+  TokenizerState get mark => new TokenizerState(this);
+
+  /** Restore Tokenizer scanning state. */
+  void restore(TokenizerState markedData) {
+    _index = markedData.index;
+    _startIndex = markedData.startIndex;
+    inSelectorExpression = markedData.inSelectorExpression;
+    inSelector = markedData.inSelector;
+  }
+
+  int _nextChar() {
+    if (_index < _text.length) {
+      return _text.codeUnitAt(_index++);
+    } else {
+      return 0;
+    }
+  }
+
+  int _peekChar() {
+    if (_index < _text.length) {
+      return _text.codeUnitAt(_index);
+    } else {
+      return 0;
+    }
+  }
+
+  bool _maybeEatChar(int ch) {
+    if (_index < _text.length) {
+      if (_text.codeUnitAt(_index) == ch) {
+        _index++;
+        return true;
+      } else {
+        return false;
+      }
+    } else {
+      return false;
+    }
+  }
+
+  Token _finishToken(int kind) {
+    return new Token(kind, _file.span(_startIndex, _index));
+  }
+
+  Token _errorToken([String message = null]) {
+    return new ErrorToken(
+        TokenKind.ERROR, _file.span(_startIndex, _index), message);
+  }
+
+  Token finishWhitespace() {
+    _index--;
+    while (_index < _text.length) {
+      final ch = _text.codeUnitAt(_index++);
+      if (ch == TokenChar.SPACE ||
+          ch == TokenChar.TAB ||
+          ch == TokenChar.RETURN) {
+        // do nothing
+      } else if (ch == TokenChar.NEWLINE) {
+        if (!_inString) {
+          return _finishToken(TokenKind.WHITESPACE); // note the newline?
+        }
+      } else {
+        _index--;
+        if (_inString) {
+          return next();
+        } else {
+          return _finishToken(TokenKind.WHITESPACE);
+        }
+      }
+    }
+    return _finishToken(TokenKind.END_OF_FILE);
+  }
+
+  Token finishMultiLineComment() {
+    int nesting = 1;
+    do {
+      int ch = _nextChar();
+      if (ch == 0) {
+        return _errorToken();
+      } else if (ch == TokenChar.ASTERISK) {
+        if (_maybeEatChar(TokenChar.SLASH)) {
+          nesting--;
+        }
+      } else if (ch == TokenChar.SLASH) {
+        if (_maybeEatChar(TokenChar.ASTERISK)) {
+          nesting++;
+        }
+      }
+    } while (nesting > 0);
+
+    if (_inString) {
+      return next();
+    } else {
+      return _finishToken(TokenKind.COMMENT);
+    }
+  }
+
+  void eatDigits() {
+    while (_index < _text.length) {
+      if (TokenizerHelpers.isDigit(_text.codeUnitAt(_index))) {
+        _index++;
+      } else {
+        return;
+      }
+    }
+  }
+
+  static int _hexDigit(int c) {
+    if (c >= 48 /*0*/ && c <= 57 /*9*/) {
+      return c - 48;
+    } else if (c >= 97 /*a*/ && c <= 102 /*f*/) {
+      return c - 87;
+    } else if (c >= 65 /*A*/ && c <= 70 /*F*/) {
+      return c - 55;
+    } else {
+      return -1;
+    }
+  }
+
+  int readHex([int hexLength]) {
+    int maxIndex;
+    if (hexLength == null) {
+      maxIndex = _text.length - 1;
+    } else {
+      // TODO(jimhug): What if this is too long?
+      maxIndex = _index + hexLength;
+      if (maxIndex >= _text.length) return -1;
+    }
+    var result = 0;
+    while (_index < maxIndex) {
+      final digit = _hexDigit(_text.codeUnitAt(_index));
+      if (digit == -1) {
+        if (hexLength == null) {
+          return result;
+        } else {
+          return -1;
+        }
+      }
+      _hexDigit(_text.codeUnitAt(_index));
+      // Multiply by 16 rather than shift by 4 since that will result in a
+      // correct value for numbers that exceed the 32 bit precision of JS
+      // 'integers'.
+      // TODO: Figure out a better solution to integer truncation. Issue 638.
+      result = (result * 16) + digit;
+      _index++;
+    }
+
+    return result;
+  }
+
+  Token finishNumber() {
+    eatDigits();
+
+    if (_peekChar() == TokenChar.DOT) {
+      // Handle the case of 1.toString().
+      _nextChar();
+      if (TokenizerHelpers.isDigit(_peekChar())) {
+        eatDigits();
+        return finishNumberExtra(TokenKind.DOUBLE);
+      } else {
+        _index--;
+      }
+    }
+
+    return finishNumberExtra(TokenKind.INTEGER);
+  }
+
+  Token finishNumberExtra(int kind) {
+    if (_maybeEatChar(101 /*e*/) || _maybeEatChar(69 /*E*/)) {
+      kind = TokenKind.DOUBLE;
+      _maybeEatChar(TokenKind.MINUS);
+      _maybeEatChar(TokenKind.PLUS);
+      eatDigits();
+    }
+    if (_peekChar() != 0 && TokenizerHelpers.isIdentifierStart(_peekChar())) {
+      _nextChar();
+      return _errorToken("illegal character in number");
+    }
+
+    return _finishToken(kind);
+  }
+
+  Token _makeStringToken(List<int> buf, bool isPart) {
+    final s = new String.fromCharCodes(buf);
+    final kind = isPart ? TokenKind.STRING_PART : TokenKind.STRING;
+    return new LiteralToken(kind, _file.span(_startIndex, _index), s);
+  }
+
+  Token makeIEFilter(int start, int end) {
+    var filter = _text.substring(start, end);
+    return new LiteralToken(TokenKind.STRING, _file.span(start, end), filter);
+  }
+
+  Token _makeRawStringToken(bool isMultiline) {
+    var s;
+    if (isMultiline) {
+      // Skip initial newline in multiline strings
+      int start = _startIndex + 4;
+      if (_text[start] == '\n') start++;
+      s = _text.substring(start, _index - 3);
+    } else {
+      s = _text.substring(_startIndex + 2, _index - 1);
+    }
+    return new LiteralToken(
+        TokenKind.STRING, _file.span(_startIndex, _index), s);
+  }
+
+  Token finishMultilineString(int quote) {
+    var buf = <int>[];
+    while (true) {
+      int ch = _nextChar();
+      if (ch == 0) {
+        return _errorToken();
+      } else if (ch == quote) {
+        if (_maybeEatChar(quote)) {
+          if (_maybeEatChar(quote)) {
+            return _makeStringToken(buf, false);
+          }
+          buf.add(quote);
+        }
+        buf.add(quote);
+      } else if (ch == TokenChar.BACKSLASH) {
+        var escapeVal = readEscapeSequence();
+        if (escapeVal == -1) {
+          return _errorToken("invalid hex escape sequence");
+        } else {
+          buf.add(escapeVal);
+        }
+      } else {
+        buf.add(ch);
+      }
+    }
+  }
+
+  Token finishString(int quote) {
+    if (_maybeEatChar(quote)) {
+      if (_maybeEatChar(quote)) {
+        // skip an initial newline
+        _maybeEatChar(TokenChar.NEWLINE);
+        return finishMultilineString(quote);
+      } else {
+        return _makeStringToken(new List<int>(), false);
+      }
+    }
+    return finishStringBody(quote);
+  }
+
+  Token finishRawString(int quote) {
+    if (_maybeEatChar(quote)) {
+      if (_maybeEatChar(quote)) {
+        return finishMultilineRawString(quote);
+      } else {
+        return _makeStringToken(<int>[], false);
+      }
+    }
+    while (true) {
+      int ch = _nextChar();
+      if (ch == quote) {
+        return _makeRawStringToken(false);
+      } else if (ch == 0) {
+        return _errorToken();
+      }
+    }
+  }
+
+  Token finishMultilineRawString(int quote) {
+    while (true) {
+      int ch = _nextChar();
+      if (ch == 0) {
+        return _errorToken();
+      } else if (ch == quote && _maybeEatChar(quote) && _maybeEatChar(quote)) {
+        return _makeRawStringToken(true);
+      }
+    }
+  }
+
+  Token finishStringBody(int quote) {
+    var buf = new List<int>();
+    while (true) {
+      int ch = _nextChar();
+      if (ch == quote) {
+        return _makeStringToken(buf, false);
+      } else if (ch == 0) {
+        return _errorToken();
+      } else if (ch == TokenChar.BACKSLASH) {
+        var escapeVal = readEscapeSequence();
+        if (escapeVal == -1) {
+          return _errorToken("invalid hex escape sequence");
+        } else {
+          buf.add(escapeVal);
+        }
+      } else {
+        buf.add(ch);
+      }
+    }
+  }
+
+  int readEscapeSequence() {
+    final ch = _nextChar();
+    int hexValue;
+    switch (ch) {
+      case 110 /*n*/ :
+        return TokenChar.NEWLINE;
+      case 114 /*r*/ :
+        return TokenChar.RETURN;
+      case 102 /*f*/ :
+        return TokenChar.FF;
+      case 98 /*b*/ :
+        return TokenChar.BACKSPACE;
+      case 116 /*t*/ :
+        return TokenChar.TAB;
+      case 118 /*v*/ :
+        return TokenChar.FF;
+      case 120 /*x*/ :
+        hexValue = readHex(2);
+        break;
+      case 117 /*u*/ :
+        if (_maybeEatChar(TokenChar.LBRACE)) {
+          hexValue = readHex();
+          if (!_maybeEatChar(TokenChar.RBRACE)) {
+            return -1;
+          }
+        } else {
+          hexValue = readHex(4);
+        }
+        break;
+      default:
+        return ch;
+    }
+
+    if (hexValue == -1) return -1;
+
+    // According to the Unicode standard the high and low surrogate halves
+    // used by UTF-16 (U+D800 through U+DFFF) and values above U+10FFFF
+    // are not legal Unicode values.
+    if (hexValue < 0xD800 || hexValue > 0xDFFF && hexValue <= 0xFFFF) {
+      return hexValue;
+    } else if (hexValue <= 0x10FFFF) {
+      messages.error('unicode values greater than 2 bytes not implemented yet',
+          _file.span(_startIndex, _startIndex + 1));
+      return -1;
+    } else {
+      return -1;
+    }
+  }
+
+  Token finishDot() {
+    if (TokenizerHelpers.isDigit(_peekChar())) {
+      eatDigits();
+      return finishNumberExtra(TokenKind.DOUBLE);
+    } else {
+      return _finishToken(TokenKind.DOT);
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/csslib/lib/src/tokenkind.dart b/mojo/public/dart/third_party/csslib/lib/src/tokenkind.dart
new file mode 100644
index 0000000..617f062
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/lib/src/tokenkind.dart
@@ -0,0 +1,782 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of csslib.parser;
+
+// TODO(terry): Need to be consistent with tokens either they're ASCII tokens
+//              e.g., ASTERISK or they're CSS e.g., PSEUDO, COMBINATOR_*.
+class TokenKind {
+  // Common shared tokens used in TokenizerBase.
+  static const int UNUSED = 0; // Unused place holder...
+  static const int END_OF_FILE = 1; // EOF
+  static const int LPAREN = 2; // (
+  static const int RPAREN = 3; // )
+  static const int LBRACK = 4; // [
+  static const int RBRACK = 5; // ]
+  static const int LBRACE = 6; // {
+  static const int RBRACE = 7; // }
+  static const int DOT = 8; // .
+  static const int SEMICOLON = 9; // ;
+
+  // Unique tokens for CSS.
+  static const int AT = 10; // @
+  static const int HASH = 11; // #
+  static const int PLUS = 12; // +
+  static const int GREATER = 13; // >
+  static const int TILDE = 14; // ~
+  static const int ASTERISK = 15; // *
+  static const int NAMESPACE = 16; // |
+  static const int COLON = 17; // :
+  static const int PRIVATE_NAME = 18; // _ prefix private class or id
+  static const int COMMA = 19; // ,
+  static const int SPACE = 20;
+  static const int TAB = 21; // /t
+  static const int NEWLINE = 22; // /n
+  static const int RETURN = 23; // /r
+  static const int PERCENT = 24; // %
+  static const int SINGLE_QUOTE = 25; // '
+  static const int DOUBLE_QUOTE = 26; // "
+  static const int SLASH = 27; // /
+  static const int EQUALS = 28; // =
+  static const int CARET = 30; // ^
+  static const int DOLLAR = 31; // $
+  static const int LESS = 32; // <
+  static const int BANG = 33; // !
+  static const int MINUS = 34; // -
+  static const int BACKSLASH = 35; // \
+  static const int AMPERSAND = 36; // &
+
+  // WARNING: Tokens from this point and above must have the corresponding ASCII
+  //          character in the TokenChar list at the bottom of this file.  The
+  //          order of the above tokens should be the same order as TokenChar.
+
+  /** [TokenKind] representing integer tokens. */
+  static const int INTEGER = 60;
+
+  /** [TokenKind] representing hex integer tokens. */
+  static const int HEX_INTEGER = 61;
+
+  /** [TokenKind] representing double tokens. */
+  static const int DOUBLE = 62;
+
+  /** [TokenKind] representing whitespace tokens. */
+  static const int WHITESPACE = 63;
+
+  /** [TokenKind] representing comment tokens. */
+  static const int COMMENT = 64;
+
+  /** [TokenKind] representing error tokens. */
+  static const int ERROR = 65;
+
+  /** [TokenKind] representing incomplete string tokens. */
+  static const int INCOMPLETE_STRING = 66;
+
+  /** [TokenKind] representing incomplete comment tokens. */
+  static const int INCOMPLETE_COMMENT = 67;
+
+  static const int VAR_DEFINITION = 400; // var-NNN-NNN
+  static const int VAR_USAGE = 401; // var(NNN-NNN [,default])
+
+  // Synthesized Tokens (no character associated with TOKEN).
+  static const int STRING = 500;
+  static const int STRING_PART = 501;
+  static const int NUMBER = 502;
+  static const int HEX_NUMBER = 503;
+  static const int HTML_COMMENT = 504; // <!--
+  static const int IMPORTANT = 505; // !important
+  static const int CDATA_START = 506; // <![CDATA[
+  static const int CDATA_END = 507; // ]]>
+  // U+uNumber[-U+uNumber]
+  // uNumber = 0..10FFFF | ?[?]*
+  static const int UNICODE_RANGE = 508;
+  static const int HEX_RANGE = 509; // ? in the hex range
+  static const int IDENTIFIER = 511;
+
+  // Uniquely synthesized tokens for CSS.
+  static const int SELECTOR_EXPRESSION = 512;
+  static const int COMBINATOR_NONE = 513;
+  static const int COMBINATOR_DESCENDANT = 514; // Space combinator
+  static const int COMBINATOR_PLUS = 515; // + combinator
+  static const int COMBINATOR_GREATER = 516; // > combinator
+  static const int COMBINATOR_TILDE = 517; // ~ combinator
+
+  static const int UNARY_OP_NONE = 518; // No unary operator present.
+
+  // Attribute match types:
+  static const int INCLUDES = 530; // '~='
+  static const int DASH_MATCH = 531; // '|='
+  static const int PREFIX_MATCH = 532; // '^='
+  static const int SUFFIX_MATCH = 533; // '$='
+  static const int SUBSTRING_MATCH = 534; // '*='
+  static const int NO_MATCH = 535; // No operator.
+
+  // Unit types:
+  static const int UNIT_EM = 600;
+  static const int UNIT_EX = 601;
+  static const int UNIT_LENGTH_PX = 602;
+  static const int UNIT_LENGTH_CM = 603;
+  static const int UNIT_LENGTH_MM = 604;
+  static const int UNIT_LENGTH_IN = 605;
+  static const int UNIT_LENGTH_PT = 606;
+  static const int UNIT_LENGTH_PC = 607;
+  static const int UNIT_ANGLE_DEG = 608;
+  static const int UNIT_ANGLE_RAD = 609;
+  static const int UNIT_ANGLE_GRAD = 610;
+  static const int UNIT_ANGLE_TURN = 611;
+  static const int UNIT_TIME_MS = 612;
+  static const int UNIT_TIME_S = 613;
+  static const int UNIT_FREQ_HZ = 614;
+  static const int UNIT_FREQ_KHZ = 615;
+  static const int UNIT_PERCENT = 616;
+  static const int UNIT_FRACTION = 617;
+  static const int UNIT_RESOLUTION_DPI = 618;
+  static const int UNIT_RESOLUTION_DPCM = 619;
+  static const int UNIT_RESOLUTION_DPPX = 620;
+  static const int UNIT_CH = 621; // Measure of "0" U+0030 glyph.
+  static const int UNIT_REM = 622; // computed value ‘font-size’ on root elem.
+  static const int UNIT_VIEWPORT_VW = 623;
+  static const int UNIT_VIEWPORT_VH = 624;
+  static const int UNIT_VIEWPORT_VMIN = 625;
+  static const int UNIT_VIEWPORT_VMAX = 626;
+
+  // Directives (@nnnn)
+  static const int DIRECTIVE_NONE = 640;
+  static const int DIRECTIVE_IMPORT = 641;
+  static const int DIRECTIVE_MEDIA = 642;
+  static const int DIRECTIVE_PAGE = 643;
+  static const int DIRECTIVE_CHARSET = 644;
+  static const int DIRECTIVE_STYLET = 645;
+  static const int DIRECTIVE_KEYFRAMES = 646;
+  static const int DIRECTIVE_WEB_KIT_KEYFRAMES = 647;
+  static const int DIRECTIVE_MOZ_KEYFRAMES = 648;
+  static const int DIRECTIVE_MS_KEYFRAMES = 649;
+  static const int DIRECTIVE_O_KEYFRAMES = 650;
+  static const int DIRECTIVE_FONTFACE = 651;
+  static const int DIRECTIVE_NAMESPACE = 652;
+  static const int DIRECTIVE_HOST = 653;
+  static const int DIRECTIVE_MIXIN = 654;
+  static const int DIRECTIVE_INCLUDE = 655;
+  static const int DIRECTIVE_CONTENT = 656;
+  static const int DIRECTIVE_EXTEND = 657;
+
+  // Media query operators
+  static const int MEDIA_OP_ONLY = 665; // Unary.
+  static const int MEDIA_OP_NOT = 666; // Unary.
+  static const int MEDIA_OP_AND = 667; // Binary.
+
+  // Directives inside of a @page (margin sym).
+  static const int MARGIN_DIRECTIVE_TOPLEFTCORNER = 670;
+  static const int MARGIN_DIRECTIVE_TOPLEFT = 671;
+  static const int MARGIN_DIRECTIVE_TOPCENTER = 672;
+  static const int MARGIN_DIRECTIVE_TOPRIGHT = 673;
+  static const int MARGIN_DIRECTIVE_TOPRIGHTCORNER = 674;
+  static const int MARGIN_DIRECTIVE_BOTTOMLEFTCORNER = 675;
+  static const int MARGIN_DIRECTIVE_BOTTOMLEFT = 676;
+  static const int MARGIN_DIRECTIVE_BOTTOMCENTER = 677;
+  static const int MARGIN_DIRECTIVE_BOTTOMRIGHT = 678;
+  static const int MARGIN_DIRECTIVE_BOTTOMRIGHTCORNER = 679;
+  static const int MARGIN_DIRECTIVE_LEFTTOP = 680;
+  static const int MARGIN_DIRECTIVE_LEFTMIDDLE = 681;
+  static const int MARGIN_DIRECTIVE_LEFTBOTTOM = 682;
+  static const int MARGIN_DIRECTIVE_RIGHTTOP = 683;
+  static const int MARGIN_DIRECTIVE_RIGHTMIDDLE = 684;
+  static const int MARGIN_DIRECTIVE_RIGHTBOTTOM = 685;
+
+  // Simple selector type.
+  static const int CLASS_NAME = 700; // .class
+  static const int ELEMENT_NAME = 701; // tagName
+  static const int HASH_NAME = 702; // #elementId
+  static const int ATTRIBUTE_NAME = 703; // [attrib]
+  static const int PSEUDO_ELEMENT_NAME = 704; // ::pseudoElement
+  static const int PSEUDO_CLASS_NAME = 705; // :pseudoClass
+  static const int NEGATION = 706; // NOT
+
+  static const List<Map<int, String>> _DIRECTIVES = const [
+    const {'type': TokenKind.DIRECTIVE_IMPORT, 'value': 'import'},
+    const {'type': TokenKind.DIRECTIVE_MEDIA, 'value': 'media'},
+    const {'type': TokenKind.DIRECTIVE_PAGE, 'value': 'page'},
+    const {'type': TokenKind.DIRECTIVE_CHARSET, 'value': 'charset'},
+    const {'type': TokenKind.DIRECTIVE_STYLET, 'value': 'stylet'},
+    const {'type': TokenKind.DIRECTIVE_KEYFRAMES, 'value': 'keyframes'},
+    const {
+      'type': TokenKind.DIRECTIVE_WEB_KIT_KEYFRAMES,
+      'value': '-webkit-keyframes'
+    },
+    const {
+      'type': TokenKind.DIRECTIVE_MOZ_KEYFRAMES,
+      'value': '-moz-keyframes'
+    },
+    const {'type': TokenKind.DIRECTIVE_MS_KEYFRAMES, 'value': '-ms-keyframes'},
+    const {'type': TokenKind.DIRECTIVE_O_KEYFRAMES, 'value': '-o-keyframes'},
+    const {'type': TokenKind.DIRECTIVE_FONTFACE, 'value': 'font-face'},
+    const {'type': TokenKind.DIRECTIVE_NAMESPACE, 'value': 'namespace'},
+    const {'type': TokenKind.DIRECTIVE_HOST, 'value': 'host'},
+    const {'type': TokenKind.DIRECTIVE_MIXIN, 'value': 'mixin'},
+    const {'type': TokenKind.DIRECTIVE_INCLUDE, 'value': 'include'},
+    const {'type': TokenKind.DIRECTIVE_CONTENT, 'value': 'content'},
+    const {'type': TokenKind.DIRECTIVE_EXTEND, 'value': 'extend'},
+  ];
+
+  static const List<Map<int, String>> MEDIA_OPERATORS = const [
+    const {'type': TokenKind.MEDIA_OP_ONLY, 'value': 'only'},
+    const {'type': TokenKind.MEDIA_OP_NOT, 'value': 'not'},
+    const {'type': TokenKind.MEDIA_OP_AND, 'value': 'and'},
+  ];
+
+  static const List<Map<int, String>> MARGIN_DIRECTIVES = const [
+    const {
+      'type': TokenKind.MARGIN_DIRECTIVE_TOPLEFTCORNER,
+      'value': 'top-left-corner'
+    },
+    const {'type': TokenKind.MARGIN_DIRECTIVE_TOPLEFT, 'value': 'top-left'},
+    const {'type': TokenKind.MARGIN_DIRECTIVE_TOPCENTER, 'value': 'top-center'},
+    const {'type': TokenKind.MARGIN_DIRECTIVE_TOPRIGHT, 'value': 'top-right'},
+    const {
+      'type': TokenKind.MARGIN_DIRECTIVE_TOPRIGHTCORNER,
+      'value': 'top-right-corner'
+    },
+    const {
+      'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMLEFTCORNER,
+      'value': 'bottom-left-corner'
+    },
+    const {
+      'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMLEFT,
+      'value': 'bottom-left'
+    },
+    const {
+      'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMCENTER,
+      'value': 'bottom-center'
+    },
+    const {
+      'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMRIGHT,
+      'value': 'bottom-right'
+    },
+    const {
+      'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMRIGHTCORNER,
+      'value': 'bottom-right-corner'
+    },
+    const {'type': TokenKind.MARGIN_DIRECTIVE_LEFTTOP, 'value': 'left-top'},
+    const {
+      'type': TokenKind.MARGIN_DIRECTIVE_LEFTMIDDLE,
+      'value': 'left-middle'
+    },
+    const {
+      'type': TokenKind.MARGIN_DIRECTIVE_LEFTBOTTOM,
+      'value': 'right-bottom'
+    },
+    const {'type': TokenKind.MARGIN_DIRECTIVE_RIGHTTOP, 'value': 'right-top'},
+    const {
+      'type': TokenKind.MARGIN_DIRECTIVE_RIGHTMIDDLE,
+      'value': 'right-middle'
+    },
+    const {
+      'type': TokenKind.MARGIN_DIRECTIVE_RIGHTBOTTOM,
+      'value': 'right-bottom'
+    },
+  ];
+
+  static const List<Map> _UNITS = const [
+    const {'unit': TokenKind.UNIT_EM, 'value': 'em'},
+    const {'unit': TokenKind.UNIT_EX, 'value': 'ex'},
+    const {'unit': TokenKind.UNIT_LENGTH_PX, 'value': 'px'},
+    const {'unit': TokenKind.UNIT_LENGTH_CM, 'value': 'cm'},
+    const {'unit': TokenKind.UNIT_LENGTH_MM, 'value': 'mm'},
+    const {'unit': TokenKind.UNIT_LENGTH_IN, 'value': 'in'},
+    const {'unit': TokenKind.UNIT_LENGTH_PT, 'value': 'pt'},
+    const {'unit': TokenKind.UNIT_LENGTH_PC, 'value': 'pc'},
+    const {'unit': TokenKind.UNIT_ANGLE_DEG, 'value': 'deg'},
+    const {'unit': TokenKind.UNIT_ANGLE_RAD, 'value': 'rad'},
+    const {'unit': TokenKind.UNIT_ANGLE_GRAD, 'value': 'grad'},
+    const {'unit': TokenKind.UNIT_ANGLE_TURN, 'value': 'turn'},
+    const {'unit': TokenKind.UNIT_TIME_MS, 'value': 'ms'},
+    const {'unit': TokenKind.UNIT_TIME_S, 'value': 's'},
+    const {'unit': TokenKind.UNIT_FREQ_HZ, 'value': 'hz'},
+    const {'unit': TokenKind.UNIT_FREQ_KHZ, 'value': 'khz'},
+    const {'unit': TokenKind.UNIT_FRACTION, 'value': 'fr'},
+    const {'unit': TokenKind.UNIT_RESOLUTION_DPI, 'value': 'dpi'},
+    const {'unit': TokenKind.UNIT_RESOLUTION_DPCM, 'value': 'dpcm'},
+    const {'unit': TokenKind.UNIT_RESOLUTION_DPPX, 'value': 'dppx'},
+    const {'unit': TokenKind.UNIT_CH, 'value': 'ch'},
+    const {'unit': TokenKind.UNIT_REM, 'value': 'rem'},
+    const {'unit': TokenKind.UNIT_VIEWPORT_VW, 'value': 'vw'},
+    const {'unit': TokenKind.UNIT_VIEWPORT_VH, 'value': 'vh'},
+    const {'unit': TokenKind.UNIT_VIEWPORT_VMIN, 'value': 'vmin'},
+    const {'unit': TokenKind.UNIT_VIEWPORT_VMAX, 'value': 'vmax'},
+  ];
+
+  // Some more constants:
+  static const int ASCII_UPPER_A = 65; // ASCII value for uppercase A
+  static const int ASCII_UPPER_Z = 90; // ASCII value for uppercase Z
+
+  // Extended color keywords:
+  static const List<Map> _EXTENDED_COLOR_NAMES = const [
+    const {'name': 'aliceblue', 'value': 0xF08FF},
+    const {'name': 'antiquewhite', 'value': 0xFAEBD7},
+    const {'name': 'aqua', 'value': 0x00FFFF},
+    const {'name': 'aquamarine', 'value': 0x7FFFD4},
+    const {'name': 'azure', 'value': 0xF0FFFF},
+    const {'name': 'beige', 'value': 0xF5F5DC},
+    const {'name': 'bisque', 'value': 0xFFE4C4},
+    const {'name': 'black', 'value': 0x000000},
+    const {'name': 'blanchedalmond', 'value': 0xFFEBCD},
+    const {'name': 'blue', 'value': 0x0000FF},
+    const {'name': 'blueviolet', 'value': 0x8A2BE2},
+    const {'name': 'brown', 'value': 0xA52A2A},
+    const {'name': 'burlywood', 'value': 0xDEB887},
+    const {'name': 'cadetblue', 'value': 0x5F9EA0},
+    const {'name': 'chartreuse', 'value': 0x7FFF00},
+    const {'name': 'chocolate', 'value': 0xD2691E},
+    const {'name': 'coral', 'value': 0xFF7F50},
+    const {'name': 'cornflowerblue', 'value': 0x6495ED},
+    const {'name': 'cornsilk', 'value': 0xFFF8DC},
+    const {'name': 'crimson', 'value': 0xDC143C},
+    const {'name': 'cyan', 'value': 0x00FFFF},
+    const {'name': 'darkblue', 'value': 0x00008B},
+    const {'name': 'darkcyan', 'value': 0x008B8B},
+    const {'name': 'darkgoldenrod', 'value': 0xB8860B},
+    const {'name': 'darkgray', 'value': 0xA9A9A9},
+    const {'name': 'darkgreen', 'value': 0x006400},
+    const {'name': 'darkgrey', 'value': 0xA9A9A9},
+    const {'name': 'darkkhaki', 'value': 0xBDB76B},
+    const {'name': 'darkmagenta', 'value': 0x8B008B},
+    const {'name': 'darkolivegreen', 'value': 0x556B2F},
+    const {'name': 'darkorange', 'value': 0xFF8C00},
+    const {'name': 'darkorchid', 'value': 0x9932CC},
+    const {'name': 'darkred', 'value': 0x8B0000},
+    const {'name': 'darksalmon', 'value': 0xE9967A},
+    const {'name': 'darkseagreen', 'value': 0x8FBC8F},
+    const {'name': 'darkslateblue', 'value': 0x483D8B},
+    const {'name': 'darkslategray', 'value': 0x2F4F4F},
+    const {'name': 'darkslategrey', 'value': 0x2F4F4F},
+    const {'name': 'darkturquoise', 'value': 0x00CED1},
+    const {'name': 'darkviolet', 'value': 0x9400D3},
+    const {'name': 'deeppink', 'value': 0xFF1493},
+    const {'name': 'deepskyblue', 'value': 0x00BFFF},
+    const {'name': 'dimgray', 'value': 0x696969},
+    const {'name': 'dimgrey', 'value': 0x696969},
+    const {'name': 'dodgerblue', 'value': 0x1E90FF},
+    const {'name': 'firebrick', 'value': 0xB22222},
+    const {'name': 'floralwhite', 'value': 0xFFFAF0},
+    const {'name': 'forestgreen', 'value': 0x228B22},
+    const {'name': 'fuchsia', 'value': 0xFF00FF},
+    const {'name': 'gainsboro', 'value': 0xDCDCDC},
+    const {'name': 'ghostwhite', 'value': 0xF8F8FF},
+    const {'name': 'gold', 'value': 0xFFD700},
+    const {'name': 'goldenrod', 'value': 0xDAA520},
+    const {'name': 'gray', 'value': 0x808080},
+    const {'name': 'green', 'value': 0x008000},
+    const {'name': 'greenyellow', 'value': 0xADFF2F},
+    const {'name': 'grey', 'value': 0x808080},
+    const {'name': 'honeydew', 'value': 0xF0FFF0},
+    const {'name': 'hotpink', 'value': 0xFF69B4},
+    const {'name': 'indianred', 'value': 0xCD5C5C},
+    const {'name': 'indigo', 'value': 0x4B0082},
+    const {'name': 'ivory', 'value': 0xFFFFF0},
+    const {'name': 'khaki', 'value': 0xF0E68C},
+    const {'name': 'lavender', 'value': 0xE6E6FA},
+    const {'name': 'lavenderblush', 'value': 0xFFF0F5},
+    const {'name': 'lawngreen', 'value': 0x7CFC00},
+    const {'name': 'lemonchiffon', 'value': 0xFFFACD},
+    const {'name': 'lightblue', 'value': 0xADD8E6},
+    const {'name': 'lightcoral', 'value': 0xF08080},
+    const {'name': 'lightcyan', 'value': 0xE0FFFF},
+    const {'name': 'lightgoldenrodyellow', 'value': 0xFAFAD2},
+    const {'name': 'lightgray', 'value': 0xD3D3D3},
+    const {'name': 'lightgreen', 'value': 0x90EE90},
+    const {'name': 'lightgrey', 'value': 0xD3D3D3},
+    const {'name': 'lightpink', 'value': 0xFFB6C1},
+    const {'name': 'lightsalmon', 'value': 0xFFA07A},
+    const {'name': 'lightseagreen', 'value': 0x20B2AA},
+    const {'name': 'lightskyblue', 'value': 0x87CEFA},
+    const {'name': 'lightslategray', 'value': 0x778899},
+    const {'name': 'lightslategrey', 'value': 0x778899},
+    const {'name': 'lightsteelblue', 'value': 0xB0C4DE},
+    const {'name': 'lightyellow', 'value': 0xFFFFE0},
+    const {'name': 'lime', 'value': 0x00FF00},
+    const {'name': 'limegreen', 'value': 0x32CD32},
+    const {'name': 'linen', 'value': 0xFAF0E6},
+    const {'name': 'magenta', 'value': 0xFF00FF},
+    const {'name': 'maroon', 'value': 0x800000},
+    const {'name': 'mediumaquamarine', 'value': 0x66CDAA},
+    const {'name': 'mediumblue', 'value': 0x0000CD},
+    const {'name': 'mediumorchid', 'value': 0xBA55D3},
+    const {'name': 'mediumpurple', 'value': 0x9370DB},
+    const {'name': 'mediumseagreen', 'value': 0x3CB371},
+    const {'name': 'mediumslateblue', 'value': 0x7B68EE},
+    const {'name': 'mediumspringgreen', 'value': 0x00FA9A},
+    const {'name': 'mediumturquoise', 'value': 0x48D1CC},
+    const {'name': 'mediumvioletred', 'value': 0xC71585},
+    const {'name': 'midnightblue', 'value': 0x191970},
+    const {'name': 'mintcream', 'value': 0xF5FFFA},
+    const {'name': 'mistyrose', 'value': 0xFFE4E1},
+    const {'name': 'moccasin', 'value': 0xFFE4B5},
+    const {'name': 'navajowhite', 'value': 0xFFDEAD},
+    const {'name': 'navy', 'value': 0x000080},
+    const {'name': 'oldlace', 'value': 0xFDF5E6},
+    const {'name': 'olive', 'value': 0x808000},
+    const {'name': 'olivedrab', 'value': 0x6B8E23},
+    const {'name': 'orange', 'value': 0xFFA500},
+    const {'name': 'orangered', 'value': 0xFF4500},
+    const {'name': 'orchid', 'value': 0xDA70D6},
+    const {'name': 'palegoldenrod', 'value': 0xEEE8AA},
+    const {'name': 'palegreen', 'value': 0x98FB98},
+    const {'name': 'paleturquoise', 'value': 0xAFEEEE},
+    const {'name': 'palevioletred', 'value': 0xDB7093},
+    const {'name': 'papayawhip', 'value': 0xFFEFD5},
+    const {'name': 'peachpuff', 'value': 0xFFDAB9},
+    const {'name': 'peru', 'value': 0xCD853F},
+    const {'name': 'pink', 'value': 0xFFC0CB},
+    const {'name': 'plum', 'value': 0xDDA0DD},
+    const {'name': 'powderblue', 'value': 0xB0E0E6},
+    const {'name': 'purple', 'value': 0x800080},
+    const {'name': 'red', 'value': 0xFF0000},
+    const {'name': 'rosybrown', 'value': 0xBC8F8F},
+    const {'name': 'royalblue', 'value': 0x4169E1},
+    const {'name': 'saddlebrown', 'value': 0x8B4513},
+    const {'name': 'salmon', 'value': 0xFA8072},
+    const {'name': 'sandybrown', 'value': 0xF4A460},
+    const {'name': 'seagreen', 'value': 0x2E8B57},
+    const {'name': 'seashell', 'value': 0xFFF5EE},
+    const {'name': 'sienna', 'value': 0xA0522D},
+    const {'name': 'silver', 'value': 0xC0C0C0},
+    const {'name': 'skyblue', 'value': 0x87CEEB},
+    const {'name': 'slateblue', 'value': 0x6A5ACD},
+    const {'name': 'slategray', 'value': 0x708090},
+    const {'name': 'slategrey', 'value': 0x708090},
+    const {'name': 'snow', 'value': 0xFFFAFA},
+    const {'name': 'springgreen', 'value': 0x00FF7F},
+    const {'name': 'steelblue', 'value': 0x4682B4},
+    const {'name': 'tan', 'value': 0xD2B48C},
+    const {'name': 'teal', 'value': 0x008080},
+    const {'name': 'thistle', 'value': 0xD8BFD8},
+    const {'name': 'tomato', 'value': 0xFF6347},
+    const {'name': 'turquoise', 'value': 0x40E0D0},
+    const {'name': 'violet', 'value': 0xEE82EE},
+    const {'name': 'wheat', 'value': 0xF5DEB3},
+    const {'name': 'white', 'value': 0xFFFFFF},
+    const {'name': 'whitesmoke', 'value': 0xF5F5F5},
+    const {'name': 'yellow', 'value': 0xFFFF00},
+    const {'name': 'yellowgreen', 'value': 0x9ACD32},
+  ];
+
+  // TODO(terry): Should used Dart mirroring for parameter values and types
+  //              especially for enumeration (e.g., counter's second parameter
+  //              is list-style-type which is an enumerated list for ordering
+  //              of a list 'circle', 'decimal', 'lower-roman', 'square', etc.
+  //              see http://www.w3schools.com/cssref/pr_list-style-type.asp
+  //              for list of possible values.
+
+  /**
+   * Check if name is a pre-defined CSS name.  Used by error handler to report
+   * if name is unknown or used improperly.
+   */
+  static bool isPredefinedName(String name) {
+    var nameLen = name.length;
+    // TODO(terry): Add more pre-defined names (hidden, bolder, inherit, etc.).
+    if (matchUnits(name, 0, nameLen) == -1 ||
+        matchDirectives(name, 0, nameLen) == -1 ||
+        matchMarginDirectives(name, 0, nameLen) == -1 ||
+        matchColorName(name) == null) {
+      return false;
+    }
+
+    return true;
+  }
+
+  /** Return the token that matches the unit ident found. */
+  static int matchList(
+      var identList, String tokenField, String text, int offset, int length) {
+    for (final entry in identList) {
+      String ident = entry['value'];
+
+      if (length == ident.length) {
+        int idx = offset;
+        bool match = true;
+        for (int i = 0; i < ident.length; i++) {
+          int identChar = ident.codeUnitAt(i);
+          int char = text.codeUnitAt(idx++);
+          // Compare lowercase to lowercase then check if char is uppercase.
+          match = match &&
+              (char == identChar ||
+                  ((char >= ASCII_UPPER_A && char <= ASCII_UPPER_Z) &&
+                      (char + 32) == identChar));
+          if (!match) {
+            break;
+          }
+        }
+
+        if (match) {
+          // Completely matched; return the token for this unit.
+          return entry[tokenField];
+        }
+      }
+    }
+
+    return -1; // Not a unit token.
+  }
+
+  /** Return the token that matches the unit ident found. */
+  static int matchUnits(String text, int offset, int length) {
+    return matchList(_UNITS, 'unit', text, offset, length);
+  }
+
+  /** Return the token that matches the directive name found. */
+  static int matchDirectives(String text, int offset, int length) {
+    return matchList(_DIRECTIVES, 'type', text, offset, length);
+  }
+
+  /** Return the token that matches the margin directive name found. */
+  static int matchMarginDirectives(String text, int offset, int length) {
+    return matchList(MARGIN_DIRECTIVES, 'type', text, offset, length);
+  }
+
+  /** Return the token that matches the media operator found. */
+  static int matchMediaOperator(String text, int offset, int length) {
+    return matchList(MEDIA_OPERATORS, 'type', text, offset, length);
+  }
+
+  static String idToValue(var identList, int tokenId) {
+    for (var entry in identList) {
+      if (tokenId == entry['type']) {
+        return entry['value'];
+      }
+    }
+
+    return null;
+  }
+
+  /** Return the unit token as its pretty name. */
+  static String unitToString(int unitTokenToFind) {
+    if (unitTokenToFind == TokenKind.PERCENT) {
+      return '%';
+    } else {
+      for (final entry in _UNITS) {
+        int unit = entry['unit'];
+        if (unit == unitTokenToFind) {
+          return entry['value'];
+        }
+      }
+    }
+
+    return '<BAD UNIT>'; // Not a unit token.
+  }
+
+  /**
+   * Match color name, case insensitive match and return the associated color
+   * entry from _EXTENDED_COLOR_NAMES list, return [:null:] if not found.
+   */
+  static Map matchColorName(String text) {
+    var name = text.toLowerCase();
+    return _EXTENDED_COLOR_NAMES.firstWhere((e) => e['name'] == name,
+        orElse: () => null);
+  }
+
+  /** Return RGB value as [int] from a color entry in _EXTENDED_COLOR_NAMES. */
+  static int colorValue(Map entry) {
+    assert(entry != null);
+    return entry['value'];
+  }
+
+  static String hexToColorName(hexValue) {
+    for (final entry in _EXTENDED_COLOR_NAMES) {
+      if (entry['value'] == hexValue) {
+        return entry['name'];
+      }
+    }
+
+    return null;
+  }
+
+  static String decimalToHex(int number, [int minDigits = 1]) {
+    final String _HEX_DIGITS = '0123456789abcdef';
+
+    List<String> result = new List<String>();
+
+    int dividend = number >> 4;
+    int remain = number % 16;
+    result.add(_HEX_DIGITS[remain]);
+    while (dividend != 0) {
+      remain = dividend % 16;
+      dividend >>= 4;
+      result.add(_HEX_DIGITS[remain]);
+    }
+
+    StringBuffer invertResult = new StringBuffer();
+    int paddings = minDigits - result.length;
+    while (paddings-- > 0) {
+      invertResult.write('0');
+    }
+    for (int i = result.length - 1; i >= 0; i--) {
+      invertResult.write(result[i]);
+    }
+
+    return invertResult.toString();
+  }
+
+  static String kindToString(int kind) {
+    switch (kind) {
+      case TokenKind.UNUSED:
+        return "ERROR";
+      case TokenKind.END_OF_FILE:
+        return "end of file";
+      case TokenKind.LPAREN:
+        return "(";
+      case TokenKind.RPAREN:
+        return ")";
+      case TokenKind.LBRACK:
+        return "[";
+      case TokenKind.RBRACK:
+        return "]";
+      case TokenKind.LBRACE:
+        return "{";
+      case TokenKind.RBRACE:
+        return "}";
+      case TokenKind.DOT:
+        return ".";
+      case TokenKind.SEMICOLON:
+        return ";";
+      case TokenKind.AT:
+        return "@";
+      case TokenKind.HASH:
+        return "#";
+      case TokenKind.PLUS:
+        return "+";
+      case TokenKind.GREATER:
+        return ">";
+      case TokenKind.TILDE:
+        return "~";
+      case TokenKind.ASTERISK:
+        return "*";
+      case TokenKind.NAMESPACE:
+        return "|";
+      case TokenKind.COLON:
+        return ":";
+      case TokenKind.PRIVATE_NAME:
+        return "_";
+      case TokenKind.COMMA:
+        return ",";
+      case TokenKind.SPACE:
+        return " ";
+      case TokenKind.TAB:
+        return "\t";
+      case TokenKind.NEWLINE:
+        return "\n";
+      case TokenKind.RETURN:
+        return "\r";
+      case TokenKind.PERCENT:
+        return "%";
+      case TokenKind.SINGLE_QUOTE:
+        return "'";
+      case TokenKind.DOUBLE_QUOTE:
+        return "\"";
+      case TokenKind.SLASH:
+        return "/";
+      case TokenKind.EQUALS:
+        return '=';
+      case TokenKind.CARET:
+        return '^';
+      case TokenKind.DOLLAR:
+        return '\$';
+      case TokenKind.LESS:
+        return '<';
+      case TokenKind.BANG:
+        return '!';
+      case TokenKind.MINUS:
+        return '-';
+      case TokenKind.BACKSLASH:
+        return '\\';
+      default:
+        throw "Unknown TOKEN";
+    }
+  }
+
+  static bool isKindIdentifier(int kind) {
+    switch (kind) {
+      // Synthesized tokens.
+      case TokenKind.DIRECTIVE_IMPORT:
+      case TokenKind.DIRECTIVE_MEDIA:
+      case TokenKind.DIRECTIVE_PAGE:
+      case TokenKind.DIRECTIVE_CHARSET:
+      case TokenKind.DIRECTIVE_STYLET:
+      case TokenKind.DIRECTIVE_KEYFRAMES:
+      case TokenKind.DIRECTIVE_WEB_KIT_KEYFRAMES:
+      case TokenKind.DIRECTIVE_MOZ_KEYFRAMES:
+      case TokenKind.DIRECTIVE_MS_KEYFRAMES:
+      case TokenKind.DIRECTIVE_O_KEYFRAMES:
+      case TokenKind.DIRECTIVE_FONTFACE:
+      case TokenKind.DIRECTIVE_NAMESPACE:
+      case TokenKind.DIRECTIVE_HOST:
+      case TokenKind.DIRECTIVE_MIXIN:
+      case TokenKind.DIRECTIVE_INCLUDE:
+      case TokenKind.DIRECTIVE_CONTENT:
+      case TokenKind.UNIT_EM:
+      case TokenKind.UNIT_EX:
+      case TokenKind.UNIT_LENGTH_PX:
+      case TokenKind.UNIT_LENGTH_CM:
+      case TokenKind.UNIT_LENGTH_MM:
+      case TokenKind.UNIT_LENGTH_IN:
+      case TokenKind.UNIT_LENGTH_PT:
+      case TokenKind.UNIT_LENGTH_PC:
+      case TokenKind.UNIT_ANGLE_DEG:
+      case TokenKind.UNIT_ANGLE_RAD:
+      case TokenKind.UNIT_ANGLE_GRAD:
+      case TokenKind.UNIT_TIME_MS:
+      case TokenKind.UNIT_TIME_S:
+      case TokenKind.UNIT_FREQ_HZ:
+      case TokenKind.UNIT_FREQ_KHZ:
+      case TokenKind.UNIT_FRACTION:
+        return true;
+      default:
+        return false;
+    }
+  }
+
+  static bool isIdentifier(int kind) {
+    return kind == IDENTIFIER;
+  }
+}
+
+// Note: these names should match TokenKind names
+class TokenChar {
+  static const int UNUSED = -1;
+  static const int END_OF_FILE = 0;
+  static const int LPAREN = 0x28; // "(".codeUnitAt(0)
+  static const int RPAREN = 0x29; // ")".codeUnitAt(0)
+  static const int LBRACK = 0x5b; // "[".codeUnitAt(0)
+  static const int RBRACK = 0x5d; // "]".codeUnitAt(0)
+  static const int LBRACE = 0x7b; // "{".codeUnitAt(0)
+  static const int RBRACE = 0x7d; // "}".codeUnitAt(0)
+  static const int DOT = 0x2e; // ".".codeUnitAt(0)
+  static const int SEMICOLON = 0x3b; // ";".codeUnitAt(0)
+  static const int AT = 0x40; // "@".codeUnitAt(0)
+  static const int HASH = 0x23; // "#".codeUnitAt(0)
+  static const int PLUS = 0x2b; // "+".codeUnitAt(0)
+  static const int GREATER = 0x3e; // ">".codeUnitAt(0)
+  static const int TILDE = 0x7e; // "~".codeUnitAt(0)
+  static const int ASTERISK = 0x2a; // "*".codeUnitAt(0)
+  static const int NAMESPACE = 0x7c; // "|".codeUnitAt(0)
+  static const int COLON = 0x3a; // ":".codeUnitAt(0)
+  static const int PRIVATE_NAME = 0x5f; // "_".codeUnitAt(0)
+  static const int COMMA = 0x2c; // ",".codeUnitAt(0)
+  static const int SPACE = 0x20; // " ".codeUnitAt(0)
+  static const int TAB = 0x9; // "\t".codeUnitAt(0)
+  static const int NEWLINE = 0xa; // "\n".codeUnitAt(0)
+  static const int RETURN = 0xd; // "\r".codeUnitAt(0)
+  static const int BACKSPACE = 0x8; // "/b".codeUnitAt(0)
+  static const int FF = 0xc; // "/f".codeUnitAt(0)
+  static const int VT = 0xb; // "/v".codeUnitAt(0)
+  static const int PERCENT = 0x25; // "%".codeUnitAt(0)
+  static const int SINGLE_QUOTE = 0x27; // "'".codeUnitAt(0)
+  static const int DOUBLE_QUOTE = 0x22; // '"'.codeUnitAt(0)
+  static const int SLASH = 0x2f; // "/".codeUnitAt(0)
+  static const int EQUALS = 0x3d; // "=".codeUnitAt(0)
+  static const int OR = 0x7c; // "|".codeUnitAt(0)
+  static const int CARET = 0x5e; // "^".codeUnitAt(0)
+  static const int DOLLAR = 0x24; // "\$".codeUnitAt(0)
+  static const int LESS = 0x3c; // "<".codeUnitAt(0)
+  static const int BANG = 0x21; // "!".codeUnitAt(0)
+  static const int MINUS = 0x2d; // "-".codeUnitAt(0)
+  static const int BACKSLASH = 0x5c; // "\".codeUnitAt(0)
+  static const int AMPERSAND = 0x26; // "&".codeUnitAt(0)
+}
diff --git a/mojo/public/dart/third_party/csslib/lib/src/tree.dart b/mojo/public/dart/third_party/csslib/lib/src/tree.dart
new file mode 100644
index 0000000..5dad435
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/lib/src/tree.dart
@@ -0,0 +1,1425 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of csslib.visitor;
+
+/////////////////////////////////////////////////////////////////////////
+// CSS specific types:
+/////////////////////////////////////////////////////////////////////////
+
+class Identifier extends TreeNode {
+  String name;
+
+  Identifier(this.name, SourceSpan span) : super(span);
+
+  Identifier clone() => new Identifier(name, span);
+
+  visit(VisitorBase visitor) => visitor.visitIdentifier(this);
+
+  String toString() => name;
+}
+
+class Wildcard extends TreeNode {
+  Wildcard(SourceSpan span) : super(span);
+  Wildcard clone() => new Wildcard(span);
+  visit(VisitorBase visitor) => visitor.visitWildcard(this);
+
+  String get name => '*';
+}
+
+class ThisOperator extends TreeNode {
+  ThisOperator(SourceSpan span) : super(span);
+  ThisOperator clone() => new ThisOperator(span);
+  visit(VisitorBase visitor) => visitor.visitThisOperator(this);
+
+  String get name => '&';
+}
+
+class Negation extends TreeNode {
+  Negation(SourceSpan span) : super(span);
+  Negation clone() => new Negation(span);
+  visit(VisitorBase visitor) => visitor.visitNegation(this);
+
+  String get name => 'not';
+}
+
+// /*  ....   */
+class CssComment extends TreeNode {
+  final String comment;
+
+  CssComment(this.comment, SourceSpan span) : super(span);
+  CssComment clone() => new CssComment(comment, span);
+  visit(VisitorBase visitor) => visitor.visitCssComment(this);
+}
+
+// CDO/CDC (Comment Definition Open <!-- and Comment Definition Close -->).
+class CommentDefinition extends CssComment {
+  CommentDefinition(String comment, SourceSpan span) : super(comment, span);
+  CommentDefinition clone() => new CommentDefinition(comment, span);
+  visit(VisitorBase visitor) => visitor.visitCommentDefinition(this);
+}
+
+class SelectorGroup extends TreeNode {
+  final List<Selector> selectors;
+
+  SelectorGroup(this.selectors, SourceSpan span) : super(span);
+
+  SelectorGroup clone() => new SelectorGroup(selectors, span);
+
+  visit(VisitorBase visitor) => visitor.visitSelectorGroup(this);
+}
+
+class Selector extends TreeNode {
+  final List<SimpleSelectorSequence> simpleSelectorSequences;
+
+  Selector(this.simpleSelectorSequences, SourceSpan span) : super(span);
+
+  void add(SimpleSelectorSequence seq) => simpleSelectorSequences.add(seq);
+
+  int get length => simpleSelectorSequences.length;
+
+  Selector clone() {
+    var simpleSequences =
+        simpleSelectorSequences.map((ss) => ss.clone()).toList();
+
+    return new Selector(simpleSequences, span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitSelector(this);
+}
+
+class SimpleSelectorSequence extends TreeNode {
+  /** +, >, ~, NONE */
+  int combinator;
+  final SimpleSelector simpleSelector;
+
+  SimpleSelectorSequence(this.simpleSelector, SourceSpan span,
+      [int combinator = TokenKind.COMBINATOR_NONE])
+      : combinator = combinator,
+        super(span);
+
+  bool get isCombinatorNone => combinator == TokenKind.COMBINATOR_NONE;
+  bool get isCombinatorPlus => combinator == TokenKind.COMBINATOR_PLUS;
+  bool get isCombinatorGreater => combinator == TokenKind.COMBINATOR_GREATER;
+  bool get isCombinatorTilde => combinator == TokenKind.COMBINATOR_TILDE;
+  bool get isCombinatorDescendant =>
+      combinator == TokenKind.COMBINATOR_DESCENDANT;
+
+  String get _combinatorToString => isCombinatorDescendant
+      ? ' '
+      : isCombinatorPlus
+          ? ' + '
+          : isCombinatorGreater ? ' > ' : isCombinatorTilde ? ' ~ ' : '';
+
+  SimpleSelectorSequence clone() =>
+      new SimpleSelectorSequence(simpleSelector, span, combinator);
+
+  visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this);
+
+  String toString() => simpleSelector.name;
+}
+
+/* All other selectors (element, #id, .class, attribute, pseudo, negation,
+ * namespace, *) are derived from this selector.
+ */
+abstract class SimpleSelector extends TreeNode {
+  final _name; // Wildcard, ThisOperator, Identifier, Negation, others?
+
+  SimpleSelector(this._name, SourceSpan span) : super(span);
+
+  String get name => _name.name;
+
+  bool get isWildcard => _name is Wildcard;
+
+  bool get isThis => _name is ThisOperator;
+
+  visit(VisitorBase visitor) => visitor.visitSimpleSelector(this);
+}
+
+// element name
+class ElementSelector extends SimpleSelector {
+  ElementSelector(name, SourceSpan span) : super(name, span);
+  visit(VisitorBase visitor) => visitor.visitElementSelector(this);
+
+  ElementSelector clone() => new ElementSelector(_name, span);
+
+  String toString() => name;
+}
+
+// namespace|element
+class NamespaceSelector extends SimpleSelector {
+  final _namespace; // null, Wildcard or Identifier
+
+  NamespaceSelector(this._namespace, var name, SourceSpan span)
+      : super(name, span);
+
+  String get namespace =>
+      _namespace is Wildcard ? '*' : _namespace == null ? '' : _namespace.name;
+
+  bool get isNamespaceWildcard => _namespace is Wildcard;
+
+  SimpleSelector get nameAsSimpleSelector => _name;
+
+  NamespaceSelector clone() => new NamespaceSelector(_namespace, "", span);
+
+  visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this);
+
+  String toString() => "$namespace|${nameAsSimpleSelector.name}";
+}
+
+// [attr op value]
+class AttributeSelector extends SimpleSelector {
+  final int _op;
+  final _value;
+
+  AttributeSelector(Identifier name, this._op, this._value, SourceSpan span)
+      : super(name, span);
+
+  int get operatorKind => _op;
+
+  get value => _value;
+
+  String matchOperator() {
+    switch (_op) {
+      case TokenKind.EQUALS:
+        return '=';
+      case TokenKind.INCLUDES:
+        return '~=';
+      case TokenKind.DASH_MATCH:
+        return '|=';
+      case TokenKind.PREFIX_MATCH:
+        return '^=';
+      case TokenKind.SUFFIX_MATCH:
+        return '\$=';
+      case TokenKind.SUBSTRING_MATCH:
+        return '*=';
+      case TokenKind.NO_MATCH:
+        return '';
+    }
+  }
+
+  // Return the TokenKind for operator used by visitAttributeSelector.
+  String matchOperatorAsTokenString() {
+    switch (_op) {
+      case TokenKind.EQUALS:
+        return 'EQUALS';
+      case TokenKind.INCLUDES:
+        return 'INCLUDES';
+      case TokenKind.DASH_MATCH:
+        return 'DASH_MATCH';
+      case TokenKind.PREFIX_MATCH:
+        return 'PREFIX_MATCH';
+      case TokenKind.SUFFIX_MATCH:
+        return 'SUFFIX_MATCH';
+      case TokenKind.SUBSTRING_MATCH:
+        return 'SUBSTRING_MATCH';
+    }
+  }
+
+  String valueToString() {
+    if (_value != null) {
+      if (_value is Identifier) {
+        return _value.name;
+      } else {
+        return '"${_value}"';
+      }
+    } else {
+      return '';
+    }
+  }
+
+  AttributeSelector clone() => new AttributeSelector(_name, _op, _value, span);
+
+  visit(VisitorBase visitor) => visitor.visitAttributeSelector(this);
+
+  String toString() => "[$name${matchOperator()}${valueToString()}]";
+}
+
+// #id
+class IdSelector extends SimpleSelector {
+  IdSelector(Identifier name, SourceSpan span) : super(name, span);
+  IdSelector clone() => new IdSelector(_name, span);
+  visit(VisitorBase visitor) => visitor.visitIdSelector(this);
+
+  String toString() => "#$_name";
+}
+
+// .class
+class ClassSelector extends SimpleSelector {
+  ClassSelector(Identifier name, SourceSpan span) : super(name, span);
+  ClassSelector clone() => new ClassSelector(_name, span);
+  visit(VisitorBase visitor) => visitor.visitClassSelector(this);
+
+  String toString() => ".$_name";
+}
+
+// :pseudoClass
+class PseudoClassSelector extends SimpleSelector {
+  PseudoClassSelector(Identifier name, SourceSpan span) : super(name, span);
+  visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this);
+
+  PseudoClassSelector clone() => new PseudoClassSelector(_name, span);
+
+  String toString() => ":$name";
+}
+
+// ::pseudoElement
+class PseudoElementSelector extends SimpleSelector {
+  PseudoElementSelector(Identifier name, SourceSpan span) : super(name, span);
+  visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this);
+
+  PseudoElementSelector clone() => new PseudoElementSelector(_name, span);
+
+  String toString() => "::$name";
+}
+
+// :pseudoClassFunction(expression)
+class PseudoClassFunctionSelector extends PseudoClassSelector {
+  final SelectorExpression expression;
+
+  PseudoClassFunctionSelector(Identifier name, this.expression, SourceSpan span)
+      : super(name, span);
+
+  PseudoClassFunctionSelector clone() =>
+      new PseudoClassFunctionSelector(_name, expression, span);
+
+  visit(VisitorBase visitor) => visitor.visitPseudoClassFunctionSelector(this);
+}
+
+// ::pseudoElementFunction(expression)
+class PseudoElementFunctionSelector extends PseudoElementSelector {
+  final SelectorExpression expression;
+
+  PseudoElementFunctionSelector(
+      Identifier name, this.expression, SourceSpan span)
+      : super(name, span);
+
+  PseudoElementFunctionSelector clone() =>
+      new PseudoElementFunctionSelector(_name, expression, span);
+
+  visit(VisitorBase visitor) =>
+      visitor.visitPseudoElementFunctionSelector(this);
+}
+
+class SelectorExpression extends TreeNode {
+  final List<Expression> expressions;
+
+  SelectorExpression(this.expressions, SourceSpan span) : super(span);
+
+  SelectorExpression clone() {
+    return new SelectorExpression(
+        expressions.map((e) => e.clone()).toList(), span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitSelectorExpression(this);
+}
+
+// :NOT(negation_arg)
+class NegationSelector extends SimpleSelector {
+  final SimpleSelector negationArg;
+
+  NegationSelector(this.negationArg, SourceSpan span)
+      : super(new Negation(span), span);
+
+  NegationSelector clone() => new NegationSelector(negationArg, span);
+
+  visit(VisitorBase visitor) => visitor.visitNegationSelector(this);
+}
+
+class NoOp extends TreeNode {
+  NoOp() : super(null);
+
+  NoOp clone() => new NoOp();
+
+  visit(VisitorBase visitor) => visitor.visitNoOp(this);
+}
+
+class StyleSheet extends TreeNode {
+  /**
+   * Contains charset, ruleset, directives (media, page, etc.), and selectors.
+   */
+  final List<TreeNode> topLevels;
+
+  StyleSheet(this.topLevels, SourceSpan span) : super(span) {
+    for (final node in topLevels) {
+      assert(node is TopLevelProduction || node is Directive);
+    }
+  }
+
+  /** Selectors only in this tree. */
+  StyleSheet.selector(this.topLevels, SourceSpan span) : super(span);
+
+  StyleSheet clone() {
+    var clonedTopLevels = topLevels.map((e) => e.clone()).toList();
+    return new StyleSheet(clonedTopLevels, span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitStyleSheet(this);
+}
+
+class TopLevelProduction extends TreeNode {
+  TopLevelProduction(SourceSpan span) : super(span);
+  TopLevelProduction clone() => new TopLevelProduction(span);
+  visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this);
+}
+
+class RuleSet extends TopLevelProduction {
+  final SelectorGroup _selectorGroup;
+  final DeclarationGroup _declarationGroup;
+
+  RuleSet(this._selectorGroup, this._declarationGroup, SourceSpan span)
+      : super(span);
+
+  SelectorGroup get selectorGroup => _selectorGroup;
+  DeclarationGroup get declarationGroup => _declarationGroup;
+
+  RuleSet clone() {
+    var cloneSelectorGroup = _selectorGroup.clone();
+    var cloneDeclarationGroup = _declarationGroup.clone();
+    return new RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitRuleSet(this);
+}
+
+class Directive extends TreeNode {
+  Directive(SourceSpan span) : super(span);
+
+  bool get isBuiltIn => true; // Known CSS directive?
+  bool get isExtension => false; // SCSS extension?
+
+  Directive clone() => new Directive(span);
+  visit(VisitorBase visitor) => visitor.visitDirective(this);
+}
+
+class ImportDirective extends Directive {
+  /** import name specified. */
+  final String import;
+
+  /** Any media queries for this import. */
+  final List<MediaQuery> mediaQueries;
+
+  ImportDirective(this.import, this.mediaQueries, SourceSpan span)
+      : super(span);
+
+  ImportDirective clone() {
+    var cloneMediaQueries = [];
+    for (var mediaQuery in mediaQueries) {
+      cloneMediaQueries.add(mediaQuery.clone());
+    }
+    return new ImportDirective(import, cloneMediaQueries, span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitImportDirective(this);
+}
+
+/**
+ *  MediaExpression grammar:
+ *    '(' S* media_feature S* [ ':' S* expr ]? ')' S*
+ */
+class MediaExpression extends TreeNode {
+  final bool andOperator;
+  final Identifier _mediaFeature;
+  final Expressions exprs;
+
+  MediaExpression(
+      this.andOperator, this._mediaFeature, this.exprs, SourceSpan span)
+      : super(span);
+
+  String get mediaFeature => _mediaFeature.name;
+
+  MediaExpression clone() {
+    var clonedExprs = exprs.clone();
+    return new MediaExpression(andOperator, _mediaFeature, clonedExprs, span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitMediaExpression(this);
+}
+
+/**
+ * MediaQuery grammar:
+ *    : [ONLY | NOT]? S* media_type S* [ AND S* media_expression ]*
+ *    | media_expression [ AND S* media_expression ]*
+ *   media_type
+ *    : IDENT
+ *   media_expression
+ *    : '(' S* media_feature S* [ ':' S* expr ]? ')' S*
+ *   media_feature
+ *    : IDENT
+ */
+class MediaQuery extends TreeNode {
+  /** not, only or no operator. */
+  final int _mediaUnary;
+  final Identifier _mediaType;
+  final List<MediaExpression> expressions;
+
+  MediaQuery(
+      this._mediaUnary, this._mediaType, this.expressions, SourceSpan span)
+      : super(span);
+
+  bool get hasMediaType => _mediaType != null;
+  String get mediaType => _mediaType.name;
+
+  bool get hasUnary => _mediaUnary != -1;
+  String get unary =>
+      TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase();
+
+  MediaQuery clone() {
+    var cloneExpressions = [];
+    for (var expr in expressions) {
+      cloneExpressions.add(expr.clone());
+    }
+    return new MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span);
+  }
+  visit(VisitorBase visitor) => visitor.visitMediaQuery(this);
+}
+
+class MediaDirective extends Directive {
+  final List<MediaQuery> mediaQueries;
+  final List<RuleSet> rulesets;
+
+  MediaDirective(this.mediaQueries, this.rulesets, SourceSpan span)
+      : super(span);
+
+  MediaDirective clone() {
+    var cloneQueries = [];
+    for (var mediaQuery in mediaQueries) {
+      cloneQueries.add(mediaQuery.clone());
+    }
+    var cloneRulesets = [];
+    for (var ruleset in rulesets) {
+      cloneRulesets.add(ruleset.clone());
+    }
+    return new MediaDirective(cloneQueries, cloneRulesets, span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitMediaDirective(this);
+}
+
+class HostDirective extends Directive {
+  final List<RuleSet> rulesets;
+
+  HostDirective(this.rulesets, SourceSpan span) : super(span);
+
+  HostDirective clone() {
+    var cloneRulesets = [];
+    for (var ruleset in rulesets) {
+      cloneRulesets.add(ruleset.clone());
+    }
+    return new HostDirective(cloneRulesets, span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitHostDirective(this);
+}
+
+class PageDirective extends Directive {
+  final String _ident;
+  final String _pseudoPage;
+  final List<DeclarationGroup> _declsMargin;
+
+  PageDirective(
+      this._ident, this._pseudoPage, this._declsMargin, SourceSpan span)
+      : super(span);
+
+  PageDirective clone() {
+    var cloneDeclsMargin = [];
+    for (var declMargin in _declsMargin) {
+      cloneDeclsMargin.add(declMargin.clone());
+    }
+    return new PageDirective(_ident, _pseudoPage, cloneDeclsMargin, span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitPageDirective(this);
+
+  bool get hasIdent => _ident != null && _ident.length > 0;
+  bool get hasPseudoPage => _pseudoPage != null && _pseudoPage.length > 0;
+}
+
+class CharsetDirective extends Directive {
+  final String charEncoding;
+
+  CharsetDirective(this.charEncoding, SourceSpan span) : super(span);
+  CharsetDirective clone() => new CharsetDirective(charEncoding, span);
+  visit(VisitorBase visitor) => visitor.visitCharsetDirective(this);
+}
+
+class KeyFrameDirective extends Directive {
+  /*
+   * Either @keyframe or keyframe prefixed with @-webkit-, @-moz-, @-ms-, @-o-.
+   */
+  final int _keyframeName;
+  final name;
+  final List<KeyFrameBlock> _blocks;
+
+  KeyFrameDirective(this._keyframeName, this.name, SourceSpan span)
+      : _blocks = [],
+        super(span);
+
+  add(KeyFrameBlock block) {
+    _blocks.add(block);
+  }
+
+  String get keyFrameName {
+    switch (_keyframeName) {
+      case TokenKind.DIRECTIVE_KEYFRAMES:
+      case TokenKind.DIRECTIVE_MS_KEYFRAMES:
+        return '@keyframes';
+      case TokenKind.DIRECTIVE_WEB_KIT_KEYFRAMES:
+        return '@-webkit-keyframes';
+      case TokenKind.DIRECTIVE_MOZ_KEYFRAMES:
+        return '@-moz-keyframes';
+      case TokenKind.DIRECTIVE_O_KEYFRAMES:
+        return '@-o-keyframes';
+    }
+  }
+
+  KeyFrameDirective clone() {
+    var cloneBlocks = [];
+    for (var block in _blocks) {
+      cloneBlocks.add(block.clone());
+    }
+    return new KeyFrameDirective(_keyframeName, cloneBlocks, span);
+  }
+  visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this);
+}
+
+class KeyFrameBlock extends Expression {
+  final Expressions _blockSelectors;
+  final DeclarationGroup _declarations;
+
+  KeyFrameBlock(this._blockSelectors, this._declarations, SourceSpan span)
+      : super(span);
+
+  KeyFrameBlock clone() =>
+      new KeyFrameBlock(_blockSelectors.clone(), _declarations.clone(), span);
+  visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this);
+}
+
+class FontFaceDirective extends Directive {
+  final DeclarationGroup _declarations;
+
+  FontFaceDirective(this._declarations, SourceSpan span) : super(span);
+
+  FontFaceDirective clone() =>
+      new FontFaceDirective(_declarations.clone(), span);
+  visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this);
+}
+
+class StyletDirective extends Directive {
+  final String dartClassName;
+  final List<RuleSet> rulesets;
+
+  StyletDirective(this.dartClassName, this.rulesets, SourceSpan span)
+      : super(span);
+
+  bool get isBuiltIn => false;
+  bool get isExtension => true;
+
+  StyletDirective clone() {
+    var cloneRulesets = [];
+    for (var ruleset in rulesets) {
+      cloneRulesets.add(ruleset.clone());
+    }
+    return new StyletDirective(dartClassName, cloneRulesets, span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitStyletDirective(this);
+}
+
+class NamespaceDirective extends Directive {
+  /** Namespace prefix. */
+  final String _prefix;
+
+  /** URI associated with this namespace. */
+  final String _uri;
+
+  NamespaceDirective(this._prefix, this._uri, SourceSpan span) : super(span);
+
+  NamespaceDirective clone() => new NamespaceDirective(_prefix, _uri, span);
+
+  visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this);
+
+  String get prefix => _prefix.length > 0 ? '$_prefix ' : '';
+}
+
+/** To support Less syntax @name: expression */
+class VarDefinitionDirective extends Directive {
+  final VarDefinition def;
+
+  VarDefinitionDirective(this.def, SourceSpan span) : super(span);
+
+  VarDefinitionDirective clone() =>
+      new VarDefinitionDirective(def.clone(), span);
+
+  visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this);
+}
+
+class MixinDefinition extends Directive {
+  final String name;
+  final List definedArgs;
+  final bool varArgs;
+
+  MixinDefinition(this.name, this.definedArgs, this.varArgs, SourceSpan span)
+      : super(span);
+
+  MixinDefinition clone() {
+    var cloneDefinedArgs = [];
+    for (var definedArg in definedArgs) {
+      cloneDefinedArgs.add(definedArg.clone());
+    }
+    return new MixinDefinition(name, cloneDefinedArgs, varArgs, span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitMixinDefinition(this);
+}
+
+/** Support a Sass @mixin. See http://sass-lang.com for description. */
+class MixinRulesetDirective extends MixinDefinition {
+  final List<RuleSet> rulesets;
+
+  MixinRulesetDirective(String name, List<VarDefinitionDirective> args,
+      bool varArgs, this.rulesets, SourceSpan span)
+      : super(name, args, varArgs, span);
+
+  MixinRulesetDirective clone() {
+    var clonedArgs = [];
+    for (var arg in definedArgs) {
+      clonedArgs.add(arg.clone());
+    }
+    var clonedRulesets = [];
+    for (var ruleset in rulesets) {
+      clonedRulesets.add(ruleset.clone());
+    }
+    return new MixinRulesetDirective(
+        name, clonedArgs, varArgs, clonedRulesets, span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this);
+}
+
+class MixinDeclarationDirective extends MixinDefinition {
+  final DeclarationGroup declarations;
+
+  MixinDeclarationDirective(String name, List<VarDefinitionDirective> args,
+      bool varArgs, this.declarations, SourceSpan span)
+      : super(name, args, varArgs, span);
+
+  MixinDeclarationDirective clone() {
+    var clonedArgs = [];
+    for (var arg in definedArgs) {
+      clonedArgs.add(arg.clone());
+    }
+    return new MixinDeclarationDirective(
+        name, clonedArgs, varArgs, declarations.clone(), span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this);
+}
+
+/** To support consuming a SASS mixin @include. */
+class IncludeDirective extends Directive {
+  final String name;
+  final List<List<TreeNode>> args;
+
+  IncludeDirective(this.name, this.args, SourceSpan span) : super(span);
+
+  IncludeDirective clone() {
+    var cloneArgs = [];
+    for (var arg in args) {
+      for (var term in arg) {
+        cloneArgs.add(term.clone());
+      }
+    }
+    return new IncludeDirective(name, cloneArgs, span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitIncludeDirective(this);
+}
+
+/** To support SASS @content. */
+class ContentDirective extends Directive {
+  ContentDirective(SourceSpan span) : super(span);
+
+  visit(VisitorBase visitor) => visitor.visitContentDirective(this);
+}
+
+class Declaration extends TreeNode {
+  final Identifier _property;
+  final Expression _expression;
+  /** Style exposed to Dart. */
+  dynamic dartStyle;
+  final bool important;
+
+  /**
+   * IE CSS hacks that can only be read by a particular IE version.
+   *   7 implies IE 7 or older property (e.g., *background: blue;)
+   *   Note:  IE 8 or older property (e.g., background: green\9;) is handled
+   *          by IE8Term in declaration expression handling.
+   *   Note:  IE 6 only property with a leading underscore is a valid IDENT
+   *          since an ident can start with underscore (e.g., _background: red;)
+   */
+  final bool isIE7;
+
+  Declaration(this._property, this._expression, this.dartStyle, SourceSpan span,
+      {important: false, ie7: false})
+      : this.important = important,
+        this.isIE7 = ie7,
+        super(span);
+
+  String get property => isIE7 ? '*${_property.name}' : _property.name;
+  Expression get expression => _expression;
+
+  bool get hasDartStyle => dartStyle != null;
+
+  Declaration clone() => new Declaration(
+      _property.clone(), _expression.clone(), dartStyle, span,
+      important: important);
+
+  visit(VisitorBase visitor) => visitor.visitDeclaration(this);
+}
+
+// TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and
+//              dynamic when in a declaration.  Currently, Less syntax
+//              '@foo: expression' and 'var-foo: expression' in a declaration
+//              are statically resolved. Better solution, if @foo or var-foo
+//              are top-level are then statically resolved and var-foo in a
+//              declaration group (surrounded by a selector) would be dynamic.
+class VarDefinition extends Declaration {
+  bool badUsage = false;
+
+  VarDefinition(Identifier definedName, Expression expr, SourceSpan span)
+      : super(definedName, expr, null, span);
+
+  String get definedName => _property.name;
+
+  VarDefinition clone() => new VarDefinition(
+      _property.clone(), expression != null ? expression.clone() : null, span);
+
+  visit(VisitorBase visitor) => visitor.visitVarDefinition(this);
+}
+
+/**
+ * Node for usage of @include mixin[(args,...)] found in a declaration group
+ * instead of at a ruleset (toplevel) e.g.,
+ * div {
+ *   @include mixin1;
+ * }
+ */
+class IncludeMixinAtDeclaration extends Declaration {
+  final IncludeDirective include;
+
+  IncludeMixinAtDeclaration(this.include, SourceSpan span)
+      : super(null, null, null, span);
+
+  IncludeMixinAtDeclaration clone() =>
+      new IncludeMixinAtDeclaration(include.clone(), span);
+
+  visit(VisitorBase visitor) => visitor.visitIncludeMixinAtDeclaration(this);
+}
+
+class ExtendDeclaration extends Declaration {
+  final List<TreeNode> selectors;
+
+  ExtendDeclaration(this.selectors, SourceSpan span)
+      : super(null, null, null, span);
+
+  ExtendDeclaration clone() {
+    var newSelector = selectors.map((s) => s.clone()).toList();
+    return new ExtendDeclaration(newSelector, span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this);
+}
+
+class DeclarationGroup extends TreeNode {
+  /** Can be either Declaration or RuleSet (if nested selector). */
+  final List declarations;
+
+  DeclarationGroup(this.declarations, SourceSpan span) : super(span);
+
+  DeclarationGroup clone() {
+    var clonedDecls = declarations.map((d) => d.clone()).toList();
+    return new DeclarationGroup(clonedDecls, span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this);
+}
+
+class MarginGroup extends DeclarationGroup {
+  final int margin_sym; // TokenType for for @margin sym.
+
+  MarginGroup(this.margin_sym, List<Declaration> decls, SourceSpan span)
+      : super(decls, span);
+  MarginGroup clone() =>
+      new MarginGroup(margin_sym, super.clone() as dynamic, span);
+  visit(VisitorBase visitor) => visitor.visitMarginGroup(this);
+}
+
+class VarUsage extends Expression {
+  final String name;
+  final List<Expression> defaultValues;
+
+  VarUsage(this.name, this.defaultValues, SourceSpan span) : super(span);
+
+  VarUsage clone() {
+    var clonedValues = [];
+    for (var expr in defaultValues) {
+      clonedValues.add(expr.clone());
+    }
+    return new VarUsage(name, clonedValues, span);
+  }
+
+  visit(VisitorBase visitor) => visitor.visitVarUsage(this);
+}
+
+class OperatorSlash extends Expression {
+  OperatorSlash(SourceSpan span) : super(span);
+  OperatorSlash clone() => new OperatorSlash(span);
+  visit(VisitorBase visitor) => visitor.visitOperatorSlash(this);
+}
+
+class OperatorComma extends Expression {
+  OperatorComma(SourceSpan span) : super(span);
+  OperatorComma clone() => new OperatorComma(span);
+  visit(VisitorBase visitor) => visitor.visitOperatorComma(this);
+}
+
+class OperatorPlus extends Expression {
+  OperatorPlus(SourceSpan span) : super(span);
+  OperatorPlus clone() => new OperatorPlus(span);
+  visit(VisitorBase visitor) => visitor.visitOperatorPlus(this);
+}
+
+class OperatorMinus extends Expression {
+  OperatorMinus(SourceSpan span) : super(span);
+  OperatorMinus clone() => new OperatorMinus(span);
+  visit(VisitorBase visitor) => visitor.visitOperatorMinus(this);
+}
+
+class UnicodeRangeTerm extends Expression {
+  final String first;
+  final String second;
+
+  UnicodeRangeTerm(this.first, this.second, SourceSpan span) : super(span);
+
+  bool get hasSecond => second != null;
+
+  UnicodeRangeTerm clone() => new UnicodeRangeTerm(first, second, span);
+
+  visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this);
+}
+
+class LiteralTerm extends Expression {
+  // TODO(terry): value and text fields can be made final once all CSS resources
+  //              are copied/symlink'd in the build tool and UriVisitor in
+  //              web_ui is removed.
+  dynamic value;
+  String text;
+
+  LiteralTerm(this.value, this.text, SourceSpan span) : super(span);
+
+  LiteralTerm clone() => new LiteralTerm(value, text, span);
+
+  visit(VisitorBase visitor) => visitor.visitLiteralTerm(this);
+}
+
+class NumberTerm extends LiteralTerm {
+  NumberTerm(value, String t, SourceSpan span) : super(value, t, span);
+  NumberTerm clone() => new NumberTerm(value, text, span);
+  visit(VisitorBase visitor) => visitor.visitNumberTerm(this);
+}
+
+class UnitTerm extends LiteralTerm {
+  final int unit;
+
+  UnitTerm(value, String t, SourceSpan span, this.unit) : super(value, t, span);
+
+  UnitTerm clone() => new UnitTerm(value, text, span, unit);
+
+  visit(VisitorBase visitor) => visitor.visitUnitTerm(this);
+
+  String unitToString() => TokenKind.unitToString(unit);
+
+  String toString() => '$text${unitToString()}';
+}
+
+class LengthTerm extends UnitTerm {
+  LengthTerm(value, String t, SourceSpan span,
+      [int unit = TokenKind.UNIT_LENGTH_PX])
+      : super(value, t, span, unit) {
+    assert(this.unit == TokenKind.UNIT_LENGTH_PX ||
+        this.unit == TokenKind.UNIT_LENGTH_CM ||
+        this.unit == TokenKind.UNIT_LENGTH_MM ||
+        this.unit == TokenKind.UNIT_LENGTH_IN ||
+        this.unit == TokenKind.UNIT_LENGTH_PT ||
+        this.unit == TokenKind.UNIT_LENGTH_PC);
+  }
+  LengthTerm clone() => new LengthTerm(value, text, span, unit);
+  visit(VisitorBase visitor) => visitor.visitLengthTerm(this);
+}
+
+class PercentageTerm extends LiteralTerm {
+  PercentageTerm(value, String t, SourceSpan span) : super(value, t, span);
+  PercentageTerm clone() => new PercentageTerm(value, text, span);
+  visit(VisitorBase visitor) => visitor.visitPercentageTerm(this);
+}
+
+class EmTerm extends LiteralTerm {
+  EmTerm(value, String t, SourceSpan span) : super(value, t, span);
+  EmTerm clone() => new EmTerm(value, text, span);
+  visit(VisitorBase visitor) => visitor.visitEmTerm(this);
+}
+
+class ExTerm extends LiteralTerm {
+  ExTerm(value, String t, SourceSpan span) : super(value, t, span);
+  ExTerm clone() => new ExTerm(value, text, span);
+  visit(VisitorBase visitor) => visitor.visitExTerm(this);
+}
+
+class AngleTerm extends UnitTerm {
+  AngleTerm(var value, String t, SourceSpan span,
+      [int unit = TokenKind.UNIT_LENGTH_PX])
+      : super(value, t, span, unit) {
+    assert(this.unit == TokenKind.UNIT_ANGLE_DEG ||
+        this.unit == TokenKind.UNIT_ANGLE_RAD ||
+        this.unit == TokenKind.UNIT_ANGLE_GRAD ||
+        this.unit == TokenKind.UNIT_ANGLE_TURN);
+  }
+
+  AngleTerm clone() => new AngleTerm(value, text, span, unit);
+  visit(VisitorBase visitor) => visitor.visitAngleTerm(this);
+}
+
+class TimeTerm extends UnitTerm {
+  TimeTerm(var value, String t, SourceSpan span,
+      [int unit = TokenKind.UNIT_LENGTH_PX])
+      : super(value, t, span, unit) {
+    assert(this.unit == TokenKind.UNIT_ANGLE_DEG ||
+        this.unit == TokenKind.UNIT_TIME_MS ||
+        this.unit == TokenKind.UNIT_TIME_S);
+  }
+
+  TimeTerm clone() => new TimeTerm(value, text, span, unit);
+  visit(VisitorBase visitor) => visitor.visitTimeTerm(this);
+}
+
+class FreqTerm extends UnitTerm {
+  FreqTerm(var value, String t, SourceSpan span,
+      [int unit = TokenKind.UNIT_LENGTH_PX])
+      : super(value, t, span, unit) {
+    assert(unit == TokenKind.UNIT_FREQ_HZ || unit == TokenKind.UNIT_FREQ_KHZ);
+  }
+
+  FreqTerm clone() => new FreqTerm(value, text, span, unit);
+  visit(VisitorBase visitor) => visitor.visitFreqTerm(this);
+}
+
+class FractionTerm extends LiteralTerm {
+  FractionTerm(var value, String t, SourceSpan span) : super(value, t, span);
+
+  FractionTerm clone() => new FractionTerm(value, text, span);
+  visit(VisitorBase visitor) => visitor.visitFractionTerm(this);
+}
+
+class UriTerm extends LiteralTerm {
+  UriTerm(String value, SourceSpan span) : super(value, value, span);
+
+  UriTerm clone() => new UriTerm(value, span);
+  visit(VisitorBase visitor) => visitor.visitUriTerm(this);
+}
+
+class ResolutionTerm extends UnitTerm {
+  ResolutionTerm(var value, String t, SourceSpan span,
+      [int unit = TokenKind.UNIT_LENGTH_PX])
+      : super(value, t, span, unit) {
+    assert(unit == TokenKind.UNIT_RESOLUTION_DPI ||
+        unit == TokenKind.UNIT_RESOLUTION_DPCM ||
+        unit == TokenKind.UNIT_RESOLUTION_DPPX);
+  }
+
+  ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit);
+  visit(VisitorBase visitor) => visitor.visitResolutionTerm(this);
+}
+
+class ChTerm extends UnitTerm {
+  ChTerm(var value, String t, SourceSpan span,
+      [int unit = TokenKind.UNIT_LENGTH_PX])
+      : super(value, t, span, unit) {
+    assert(unit == TokenKind.UNIT_CH);
+  }
+
+  ChTerm clone() => new ChTerm(value, text, span, unit);
+  visit(VisitorBase visitor) => visitor.visitChTerm(this);
+}
+
+class RemTerm extends UnitTerm {
+  RemTerm(var value, String t, SourceSpan span,
+      [int unit = TokenKind.UNIT_LENGTH_PX])
+      : super(value, t, span, unit) {
+    assert(unit == TokenKind.UNIT_REM);
+  }
+
+  RemTerm clone() => new RemTerm(value, text, span, unit);
+  visit(VisitorBase visitor) => visitor.visitRemTerm(this);
+}
+
+class ViewportTerm extends UnitTerm {
+  ViewportTerm(var value, String t, SourceSpan span,
+      [int unit = TokenKind.UNIT_LENGTH_PX])
+      : super(value, t, span, unit) {
+    assert(unit == TokenKind.UNIT_VIEWPORT_VW ||
+        unit == TokenKind.UNIT_VIEWPORT_VH ||
+        unit == TokenKind.UNIT_VIEWPORT_VMIN ||
+        unit == TokenKind.UNIT_VIEWPORT_VMAX);
+  }
+
+  ViewportTerm clone() => new ViewportTerm(value, text, span, unit);
+  visit(VisitorBase visitor) => visitor.visitViewportTerm(this);
+}
+
+/** Type to signal a bad hex value for HexColorTerm.value. */
+class BAD_HEX_VALUE {}
+
+class HexColorTerm extends LiteralTerm {
+  HexColorTerm(var value, String t, SourceSpan span) : super(value, t, span);
+
+  HexColorTerm clone() => new HexColorTerm(value, text, span);
+  visit(VisitorBase visitor) => visitor.visitHexColorTerm(this);
+}
+
+class FunctionTerm extends LiteralTerm {
+  final Expressions _params;
+
+  FunctionTerm(var value, String t, this._params, SourceSpan span)
+      : super(value, t, span);
+
+  FunctionTerm clone() => new FunctionTerm(value, text, _params.clone(), span);
+  visit(VisitorBase visitor) => visitor.visitFunctionTerm(this);
+}
+
+/**
+ * A "\9" was encountered at the end of the expression and before a semi-colon.
+ * This is an IE trick to ignore a property or value except by IE 8 and older
+ * browsers.
+ */
+class IE8Term extends LiteralTerm {
+  IE8Term(SourceSpan span) : super('\\9', '\\9', span);
+  IE8Term clone() => new IE8Term(span);
+  visit(VisitorBase visitor) => visitor.visitIE8Term(this);
+}
+
+class GroupTerm extends Expression {
+  final List<LiteralTerm> _terms;
+
+  GroupTerm(SourceSpan span)
+      : _terms = [],
+        super(span);
+
+  void add(LiteralTerm term) {
+    _terms.add(term);
+  }
+
+  GroupTerm clone() => new GroupTerm(span);
+  visit(VisitorBase visitor) => visitor.visitGroupTerm(this);
+}
+
+class ItemTerm extends NumberTerm {
+  ItemTerm(var value, String t, SourceSpan span) : super(value, t, span);
+
+  ItemTerm clone() => new ItemTerm(value, text, span);
+  visit(VisitorBase visitor) => visitor.visitItemTerm(this);
+}
+
+class Expressions extends Expression {
+  final List<Expression> expressions = [];
+
+  Expressions(SourceSpan span) : super(span);
+
+  void add(Expression expression) {
+    expressions.add(expression);
+  }
+
+  Expressions clone() {
+    var clonedExprs = new Expressions(span);
+    for (var expr in expressions) {
+      clonedExprs.add(expr.clone());
+    }
+    return clonedExprs;
+  }
+  visit(VisitorBase visitor) => visitor.visitExpressions(this);
+}
+
+class BinaryExpression extends Expression {
+  final Token op;
+  final Expression x;
+  final Expression y;
+
+  BinaryExpression(this.op, this.x, this.y, SourceSpan span) : super(span);
+
+  BinaryExpression clone() =>
+      new BinaryExpression(op, x.clone(), y.clone(), span);
+  visit(VisitorBase visitor) => visitor.visitBinaryExpression(this);
+}
+
+class UnaryExpression extends Expression {
+  final Token op;
+  final Expression self;
+
+  UnaryExpression(this.op, this.self, SourceSpan span) : super(span);
+
+  UnaryExpression clone() => new UnaryExpression(op, self.clone(), span);
+  visit(VisitorBase visitor) => visitor.visitUnaryExpression(this);
+}
+
+abstract class DartStyleExpression extends TreeNode {
+  static const int unknownType = 0;
+  static const int fontStyle = 1;
+  static const int marginStyle = 2;
+  static const int borderStyle = 3;
+  static const int paddingStyle = 4;
+  static const int heightStyle = 5;
+  static const int widthStyle = 6;
+
+  final int _styleType;
+  int priority;
+
+  DartStyleExpression(this._styleType, SourceSpan span) : super(span);
+
+  /*
+   * Merges give 2 DartStyleExpression (or derived from DartStyleExpression,
+   * e.g., FontExpression, etc.) will merge if the two expressions are of the
+   * same property name (implies same exact type e.g, FontExpression).
+   */
+  merged(DartStyleExpression newDartExpr);
+
+  bool get isUnknown => _styleType == 0 || _styleType == null;
+  bool get isFont => _styleType == fontStyle;
+  bool get isMargin => _styleType == marginStyle;
+  bool get isBorder => _styleType == borderStyle;
+  bool get isPadding => _styleType == paddingStyle;
+  bool get isHeight => _styleType == heightStyle;
+  bool get isWidth => _styleType == widthStyle;
+  bool get isBoxExpression => isMargin || isBorder || isPadding;
+
+  bool isSame(DartStyleExpression other) => this._styleType == other._styleType;
+
+  visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this);
+}
+
+class FontExpression extends DartStyleExpression {
+  final Font font;
+
+  //   font-style font-variant font-weight font-size/line-height font-family
+  // TODO(terry): Only px/pt for now need to handle all possible units to
+  //              support calc expressions on units.
+  FontExpression(SourceSpan span, {dynamic size, List<String> family,
+      int weight, String style, String variant, LineHeight lineHeight})
+      : font = new Font(
+          size: size is LengthTerm ? size.value : size,
+          family: family,
+          weight: weight,
+          style: style,
+          variant: variant,
+          lineHeight: lineHeight),
+        super(DartStyleExpression.fontStyle, span);
+
+  FontExpression merged(DartStyleExpression newFontExpr) {
+    if (newFontExpr is FontExpression && this.isFont && newFontExpr.isFont) {
+      return new FontExpression.merge(this, newFontExpr);
+    }
+    return null;
+  }
+
+  /**
+   * Merge the two FontExpression and return the result.
+   */
+  factory FontExpression.merge(FontExpression x, FontExpression y) {
+    return new FontExpression._merge(x, y, y.span);
+  }
+
+  FontExpression._merge(FontExpression x, FontExpression y, SourceSpan span)
+      : font = new Font.merge(x.font, y.font),
+        super(DartStyleExpression.fontStyle, span);
+
+  FontExpression clone() => new FontExpression(span,
+      size: font.size,
+      family: font.family,
+      weight: font.weight,
+      style: font.style,
+      variant: font.variant,
+      lineHeight: font.lineHeight);
+
+  visit(VisitorBase visitor) => visitor.visitFontExpression(this);
+}
+
+abstract class BoxExpression extends DartStyleExpression {
+  final BoxEdge box;
+
+  BoxExpression(int styleType, SourceSpan span, this.box)
+      : super(styleType, span);
+
+  visit(VisitorBase visitor) => visitor.visitBoxExpression(this);
+
+  String get formattedBoxEdge {
+    if (box.top == box.left && box.top == box.bottom && box.top == box.right) {
+      return '.uniform(${box.top})';
+    } else {
+      var left = box.left == null ? 0 : box.left;
+      var top = box.top == null ? 0 : box.top;
+      var right = box.right == null ? 0 : box.right;
+      var bottom = box.bottom == null ? 0 : box.bottom;
+      return '.clockwiseFromTop($top,$right,$bottom,$left)';
+    }
+  }
+}
+
+class MarginExpression extends BoxExpression {
+  // TODO(terry): Does auto for margin need to be exposed to Dart UI framework?
+  /** Margin expression ripped apart. */
+  MarginExpression(SourceSpan span, {num top, num right, num bottom, num left})
+      : super(DartStyleExpression.marginStyle, span,
+          new BoxEdge(left, top, right, bottom));
+
+  MarginExpression.boxEdge(SourceSpan span, BoxEdge box)
+      : super(DartStyleExpression.marginStyle, span, box);
+
+  merged(DartStyleExpression newMarginExpr) {
+    if (newMarginExpr is MarginExpression &&
+        this.isMargin &&
+        newMarginExpr.isMargin) {
+      return new MarginExpression.merge(this, newMarginExpr);
+    }
+
+    return null;
+  }
+
+  /**
+   * Merge the two MarginExpressions and return the result.
+   */
+  factory MarginExpression.merge(MarginExpression x, MarginExpression y) {
+    return new MarginExpression._merge(x, y, y.span);
+  }
+
+  MarginExpression._merge(
+      MarginExpression x, MarginExpression y, SourceSpan span)
+      : super(x._styleType, span, new BoxEdge.merge(x.box, y.box));
+
+  MarginExpression clone() => new MarginExpression(span,
+      top: box.top, right: box.right, bottom: box.bottom, left: box.left);
+
+  visit(VisitorBase visitor) => visitor.visitMarginExpression(this);
+}
+
+class BorderExpression extends BoxExpression {
+  /** Border expression ripped apart. */
+  BorderExpression(SourceSpan span, {num top, num right, num bottom, num left})
+      : super(DartStyleExpression.borderStyle, span,
+          new BoxEdge(left, top, right, bottom));
+
+  BorderExpression.boxEdge(SourceSpan span, BoxEdge box)
+      : super(DartStyleExpression.borderStyle, span, box);
+
+  merged(DartStyleExpression newBorderExpr) {
+    if (newBorderExpr is BorderExpression &&
+        this.isBorder &&
+        newBorderExpr.isBorder) {
+      return new BorderExpression.merge(this, newBorderExpr);
+    }
+
+    return null;
+  }
+
+  /**
+   * Merge the two BorderExpression and return the result.
+   */
+  factory BorderExpression.merge(BorderExpression x, BorderExpression y) {
+    return new BorderExpression._merge(x, y, y.span);
+  }
+
+  BorderExpression._merge(
+      BorderExpression x, BorderExpression y, SourceSpan span)
+      : super(DartStyleExpression.borderStyle, span,
+          new BoxEdge.merge(x.box, y.box));
+
+  BorderExpression clone() => new BorderExpression(span,
+      top: box.top, right: box.right, bottom: box.bottom, left: box.left);
+
+  visit(VisitorBase visitor) => visitor.visitBorderExpression(this);
+}
+
+class HeightExpression extends DartStyleExpression {
+  final height;
+
+  HeightExpression(SourceSpan span, this.height)
+      : super(DartStyleExpression.heightStyle, span);
+
+  merged(DartStyleExpression newHeightExpr) {
+    if (newHeightExpr is DartStyleExpression &&
+        this.isHeight &&
+        newHeightExpr.isHeight) {
+      return newHeightExpr;
+    }
+
+    return null;
+  }
+
+  HeightExpression clone() => new HeightExpression(span, height);
+  visit(VisitorBase visitor) => visitor.visitHeightExpression(this);
+}
+
+class WidthExpression extends DartStyleExpression {
+  final width;
+
+  WidthExpression(SourceSpan span, this.width)
+      : super(DartStyleExpression.widthStyle, span);
+
+  merged(DartStyleExpression newWidthExpr) {
+    if (newWidthExpr is WidthExpression &&
+        this.isWidth &&
+        newWidthExpr.isWidth) {
+      return newWidthExpr;
+    }
+
+    return null;
+  }
+
+  WidthExpression clone() => new WidthExpression(span, width);
+  visit(VisitorBase visitor) => visitor.visitWidthExpression(this);
+}
+
+class PaddingExpression extends BoxExpression {
+  /** Padding expression ripped apart. */
+  PaddingExpression(SourceSpan span, {num top, num right, num bottom, num left})
+      : super(DartStyleExpression.paddingStyle, span,
+          new BoxEdge(left, top, right, bottom));
+
+  PaddingExpression.boxEdge(SourceSpan span, BoxEdge box)
+      : super(DartStyleExpression.paddingStyle, span, box);
+
+  merged(DartStyleExpression newPaddingExpr) {
+    if (newPaddingExpr is PaddingExpression &&
+        this.isPadding &&
+        newPaddingExpr.isPadding) {
+      return new PaddingExpression.merge(this, newPaddingExpr);
+    }
+
+    return null;
+  }
+
+  /**
+   * Merge the two PaddingExpression and return the result.
+   */
+  factory PaddingExpression.merge(PaddingExpression x, PaddingExpression y) {
+    return new PaddingExpression._merge(x, y, y.span);
+  }
+
+  PaddingExpression._merge(
+      PaddingExpression x, PaddingExpression y, SourceSpan span)
+      : super(DartStyleExpression.paddingStyle, span,
+          new BoxEdge.merge(x.box, y.box));
+
+  PaddingExpression clone() => new PaddingExpression(span,
+      top: box.top, right: box.right, bottom: box.bottom, left: box.left);
+  visit(VisitorBase visitor) => visitor.visitPaddingExpression(this);
+}
diff --git a/mojo/public/dart/third_party/csslib/lib/src/tree_base.dart b/mojo/public/dart/third_party/csslib/lib/src/tree_base.dart
new file mode 100644
index 0000000..095b493
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/lib/src/tree_base.dart
@@ -0,0 +1,97 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of csslib.visitor;
+
+/**
+ * The base type for all nodes in a CSS abstract syntax tree.
+ */
+abstract class TreeNode {
+  /** The source code this [TreeNode] represents. */
+  final SourceSpan span;
+
+  TreeNode(this.span);
+
+  TreeNode clone();
+
+  /** Classic double-dispatch visitor for implementing passes. */
+  void visit(VisitorBase visitor);
+
+  /** A multiline string showing the node and its children. */
+  String toDebugString() {
+    var to = new TreeOutput();
+    var tp = new _TreePrinter(to, true);
+    this.visit(tp);
+    return to.buf.toString();
+  }
+}
+
+/** The base type for expressions. */
+abstract class Expression extends TreeNode {
+  Expression(SourceSpan span) : super(span);
+}
+
+/** Simple class to provide a textual dump of trees for debugging. */
+class TreeOutput {
+  int depth = 0;
+  final StringBuffer buf = new StringBuffer();
+  VisitorBase printer;
+
+  void write(String s) {
+    for (int i = 0; i < depth; i++) {
+      buf.write(' ');
+    }
+    buf.write(s);
+  }
+
+  void writeln(String s) {
+    write(s);
+    buf.write('\n');
+  }
+
+  void heading(String name, [span]) {
+    write(name);
+    if (span != null) {
+      buf.write('  (${span.message('')})');
+    }
+    buf.write('\n');
+  }
+
+  String toValue(value) {
+    if (value == null) return 'null';
+    else if (value is Identifier) return value.name;
+    else return value.toString();
+  }
+
+  void writeNode(String label, TreeNode node) {
+    write('${label}: ');
+    depth += 1;
+    if (node != null) node.visit(printer);
+    else writeln('null');
+    depth -= 1;
+  }
+
+  void writeValue(String label, value) {
+    var v = toValue(value);
+    writeln('${label}: ${v}');
+  }
+
+  void writeNodeList(String label, List<TreeNode> list) {
+    writeln('${label} [');
+    if (list != null) {
+      depth += 1;
+      for (var node in list) {
+        if (node != null) {
+          node.visit(printer);
+        } else {
+          writeln('null');
+        }
+      }
+      depth -= 1;
+      writeln(']');
+    }
+  }
+
+  String toString() => buf.toString();
+}
diff --git a/mojo/public/dart/third_party/csslib/lib/src/tree_printer.dart b/mojo/public/dart/third_party/csslib/lib/src/tree_printer.dart
new file mode 100644
index 0000000..030a868
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/lib/src/tree_printer.dart
@@ -0,0 +1,558 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of csslib.visitor;
+
+// TODO(terry): Enable class for debug only; when conditional imports enabled.
+
+/** Helper function to dump the CSS AST. */
+String treeToDebugString(StyleSheet styleSheet, [bool useSpan = false]) {
+  var to = new TreeOutput();
+  new _TreePrinter(to, useSpan)..visitTree(styleSheet);
+  return to.toString();
+}
+
+/** Tree dump for debug output of the CSS AST. */
+class _TreePrinter extends Visitor {
+  final TreeOutput output;
+  final bool useSpan;
+  _TreePrinter(this.output, this.useSpan) {
+    output.printer = this;
+  }
+
+  void visitTree(StyleSheet tree) => visitStylesheet(tree);
+
+  void heading(String heading, node) {
+    if (useSpan) {
+      output.heading(heading, node.span);
+    } else {
+      output.heading(heading);
+    }
+  }
+
+  void visitStylesheet(StyleSheet node) {
+    heading('Stylesheet', node);
+    output.depth++;
+    super.visitStyleSheet(node);
+    output.depth--;
+  }
+
+  void visitTopLevelProduction(TopLevelProduction node) {
+    heading('TopLevelProduction', node);
+  }
+
+  void visitDirective(Directive node) {
+    heading('Directive', node);
+  }
+
+  void visitCssComment(CssComment node) {
+    heading('Comment', node);
+    output.depth++;
+    output.writeValue('comment value', node.comment);
+    output.depth--;
+  }
+
+  void visitCommentDefinition(CommentDefinition node) {
+    heading('CommentDefinition (CDO/CDC)', node);
+    output.depth++;
+    output.writeValue('comment value', node.comment);
+    output.depth--;
+  }
+
+  void visitMediaExpression(MediaExpression node) {
+    heading('MediaExpression', node);
+    output.writeValue('feature', node.mediaFeature);
+    if (node.andOperator) output.writeValue('AND operator', '');
+    visitExpressions(node.exprs);
+  }
+
+  void visitMediaQueries(MediaQuery query) {
+    output.heading('MediaQueries');
+    output.writeValue('unary', query.unary);
+    output.writeValue('media type', query.mediaType);
+    output.writeNodeList('media expressions', query.expressions);
+  }
+
+  void visitMediaDirective(MediaDirective node) {
+    heading('MediaDirective', node);
+    output.depth++;
+    output.writeNodeList('media queries', node.mediaQueries);
+    output.writeNodeList('rule sets', node.rulesets);
+    super.visitMediaDirective(node);
+    output.depth--;
+  }
+
+  void visitPageDirective(PageDirective node) {
+    heading('PageDirective', node);
+    output.depth++;
+    output.writeValue('pseudo page', node._pseudoPage);
+    super.visitPageDirective(node);
+    output.depth;
+  }
+
+  void visitCharsetDirective(CharsetDirective node) {
+    heading('Charset Directive', node);
+    output.writeValue('charset encoding', node.charEncoding);
+  }
+
+  void visitImportDirective(ImportDirective node) {
+    heading('ImportDirective', node);
+    output.depth++;
+    output.writeValue('import', node.import);
+    super.visitImportDirective(node);
+    output.writeNodeList('media', node.mediaQueries);
+    output.depth--;
+  }
+
+  void visitContentDirective(ContentDirective node) {
+    print("ContentDirective not implemented");
+  }
+
+  void visitKeyFrameDirective(KeyFrameDirective node) {
+    heading('KeyFrameDirective', node);
+    output.depth++;
+    output.writeValue('keyframe', node.keyFrameName);
+    output.writeValue('name', node.name);
+    output.writeNodeList('blocks', node._blocks);
+    output.depth--;
+  }
+
+  void visitKeyFrameBlock(KeyFrameBlock node) {
+    heading('KeyFrameBlock', node);
+    output.depth++;
+    super.visitKeyFrameBlock(node);
+    output.depth--;
+  }
+
+  void visitFontFaceDirective(FontFaceDirective node) {
+    // TODO(terry): To Be Implemented
+  }
+
+  void visitStyletDirective(StyletDirective node) {
+    heading('StyletDirective', node);
+    output.writeValue('dartClassName', node.dartClassName);
+    output.depth++;
+    output.writeNodeList('rulesets', node.rulesets);
+    output.depth--;
+  }
+
+  void visitNamespaceDirective(NamespaceDirective node) {
+    heading('NamespaceDirective', node);
+    output.depth++;
+    output.writeValue('prefix', node._prefix);
+    output.writeValue('uri', node._uri);
+    output.depth--;
+  }
+
+  void visitVarDefinitionDirective(VarDefinitionDirective node) {
+    heading('Less variable definition', node);
+    output.depth++;
+    visitVarDefinition(node.def);
+    output.depth--;
+  }
+
+  void visitMixinRulesetDirective(MixinRulesetDirective node) {
+    heading('Mixin top-level ${node.name}', node);
+    output.writeNodeList('parameters', node.definedArgs);
+    output.depth++;
+    _visitNodeList(node.rulesets);
+    output.depth--;
+  }
+
+  void visitMixinDeclarationDirective(MixinDeclarationDirective node) {
+    heading('Mixin declaration ${node.name}', node);
+    output.writeNodeList('parameters', node.definedArgs);
+    output.depth++;
+    visitDeclarationGroup(node.declarations);
+    output.depth--;
+  }
+
+  /**
+   * Added optional newLine for handling @include at top-level vs/ inside of
+   * a declaration group.
+   */
+  void visitIncludeDirective(IncludeDirective node) {
+    heading('IncludeDirective ${node.name}', node);
+    var flattened = node.args.expand((e) => e).toList();
+    output.writeNodeList('parameters', flattened);
+  }
+
+  void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) {
+    heading('IncludeMixinAtDeclaration ${node.include.name}', node);
+    output.depth++;
+    visitIncludeDirective(node.include);
+    output.depth--;
+  }
+
+  void visitExtendDeclaration(ExtendDeclaration node) {
+    heading('ExtendDeclaration', node);
+    output.depth++;
+    _visitNodeList(node.selectors);
+    output.depth--;
+  }
+
+  void visitRuleSet(RuleSet node) {
+    heading('Ruleset', node);
+    output.depth++;
+    super.visitRuleSet(node);
+    output.depth--;
+  }
+
+  void visitDeclarationGroup(DeclarationGroup node) {
+    heading('DeclarationGroup', node);
+    output.depth++;
+    output.writeNodeList('declarations', node.declarations);
+    output.depth--;
+  }
+
+  void visitMarginGroup(MarginGroup node) {
+    heading('MarginGroup', node);
+    output.depth++;
+    output.writeValue('@directive', node.margin_sym);
+    output.writeNodeList('declarations', node.declarations);
+    output.depth--;
+  }
+
+  void visitDeclaration(Declaration node) {
+    heading('Declaration', node);
+    output.depth++;
+    if (node.isIE7) output.write('IE7 property');
+    output.write('property');
+    super.visitDeclaration(node);
+    output.writeNode('expression', node._expression);
+    if (node.important) {
+      output.writeValue('!important', 'true');
+    }
+    output.depth--;
+  }
+
+  void visitVarDefinition(VarDefinition node) {
+    heading('Var', node);
+    output.depth++;
+    output.write('defintion');
+    super.visitVarDefinition(node);
+    output.writeNode('expression', node._expression);
+    output.depth--;
+  }
+
+  void visitSelectorGroup(SelectorGroup node) {
+    heading('Selector Group', node);
+    output.depth++;
+    output.writeNodeList('selectors', node.selectors);
+    output.depth--;
+  }
+
+  void visitSelector(Selector node) {
+    heading('Selector', node);
+    output.depth++;
+    output.writeNodeList(
+        'simpleSelectorsSequences', node.simpleSelectorSequences);
+    output.depth--;
+  }
+
+  void visitSimpleSelectorSequence(SimpleSelectorSequence node) {
+    heading('SimpleSelectorSequence', node);
+    output.depth++;
+    if (node.isCombinatorNone) {
+      output.writeValue('combinator', "NONE");
+    } else if (node.isCombinatorDescendant) {
+      output.writeValue('combinator', "descendant");
+    } else if (node.isCombinatorPlus) {
+      output.writeValue('combinator', "+");
+    } else if (node.isCombinatorGreater) {
+      output.writeValue('combinator', ">");
+    } else if (node.isCombinatorTilde) {
+      output.writeValue('combinator', "~");
+    } else {
+      output.writeValue('combinator', "ERROR UNKNOWN");
+    }
+
+    super.visitSimpleSelectorSequence(node);
+
+    output.depth--;
+  }
+
+  void visitNamespaceSelector(NamespaceSelector node) {
+    heading('Namespace Selector', node);
+    output.depth++;
+
+    super.visitNamespaceSelector(node);
+
+    visitSimpleSelector(node.nameAsSimpleSelector);
+    output.depth--;
+  }
+
+  void visitElementSelector(ElementSelector node) {
+    heading('Element Selector', node);
+    output.depth++;
+    super.visitElementSelector(node);
+    output.depth--;
+  }
+
+  void visitAttributeSelector(AttributeSelector node) {
+    heading('AttributeSelector', node);
+    output.depth++;
+    super.visitAttributeSelector(node);
+    String tokenStr = node.matchOperatorAsTokenString();
+    output.writeValue('operator', '${node.matchOperator()} (${tokenStr})');
+    output.writeValue('value', node.valueToString());
+    output.depth--;
+  }
+
+  void visitIdSelector(IdSelector node) {
+    heading('Id Selector', node);
+    output.depth++;
+    super.visitIdSelector(node);
+    output.depth--;
+  }
+
+  void visitClassSelector(ClassSelector node) {
+    heading('Class Selector', node);
+    output.depth++;
+    super.visitClassSelector(node);
+    output.depth--;
+  }
+
+  void visitPseudoClassSelector(PseudoClassSelector node) {
+    heading('Pseudo Class Selector', node);
+    output.depth++;
+    super.visitPseudoClassSelector(node);
+    output.depth--;
+  }
+
+  void visitPseudoElementSelector(PseudoElementSelector node) {
+    heading('Pseudo Element Selector', node);
+    output.depth++;
+    super.visitPseudoElementSelector(node);
+    output.depth--;
+  }
+
+  void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) {
+    heading('Pseudo Class Function Selector', node);
+    output.depth++;
+    visitSelectorExpression(node.expression);
+    super.visitPseudoClassFunctionSelector(node);
+    output.depth--;
+  }
+
+  void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) {
+    heading('Pseudo Element Function Selector', node);
+    output.depth++;
+    visitSelectorExpression(node.expression);
+    super.visitPseudoElementFunctionSelector(node);
+    output.depth--;
+  }
+
+  void visitSelectorExpression(SelectorExpression node) {
+    heading('Selector Expression', node);
+    output.depth++;
+    output.writeNodeList('expressions', node.expressions);
+    output.depth--;
+  }
+
+  void visitNegationSelector(NegationSelector node) {
+    super.visitNegationSelector(node);
+    output.depth++;
+    heading('Negation Selector', node);
+    output.writeNode('Negation arg', node.negationArg);
+    output.depth--;
+  }
+
+  void visitUnicodeRangeTerm(UnicodeRangeTerm node) {
+    heading('UnicodeRangeTerm', node);
+    output.depth++;
+    output.writeValue('1st value', node.first);
+    output.writeValue('2nd value', node.second);
+    output.depth--;
+  }
+
+  void visitLiteralTerm(LiteralTerm node) {
+    heading('LiteralTerm', node);
+    output.depth++;
+    output.writeValue('value', node.text);
+    output.depth--;
+  }
+
+  void visitHexColorTerm(HexColorTerm node) {
+    heading('HexColorTerm', node);
+    output.depth++;
+    output.writeValue('hex value', node.text);
+    output.writeValue('decimal value', node.value);
+    output.depth--;
+  }
+
+  void visitNumberTerm(NumberTerm node) {
+    heading('NumberTerm', node);
+    output.depth++;
+    output.writeValue('value', node.text);
+    output.depth--;
+  }
+
+  void visitUnitTerm(UnitTerm node) {
+    output.depth++;
+    output.writeValue('value', node.text);
+    output.writeValue('unit', node.unitToString());
+    output.depth--;
+  }
+
+  void visitLengthTerm(LengthTerm node) {
+    heading('LengthTerm', node);
+    super.visitLengthTerm(node);
+  }
+
+  void visitPercentageTerm(PercentageTerm node) {
+    heading('PercentageTerm', node);
+    output.depth++;
+    super.visitPercentageTerm(node);
+    output.depth--;
+  }
+
+  void visitEmTerm(EmTerm node) {
+    heading('EmTerm', node);
+    output.depth++;
+    super.visitEmTerm(node);
+    output.depth--;
+  }
+
+  void visitExTerm(ExTerm node) {
+    heading('ExTerm', node);
+    output.depth++;
+    super.visitExTerm(node);
+    output.depth--;
+  }
+
+  void visitAngleTerm(AngleTerm node) {
+    heading('AngleTerm', node);
+    super.visitAngleTerm(node);
+  }
+
+  void visitTimeTerm(TimeTerm node) {
+    heading('TimeTerm', node);
+    super.visitTimeTerm(node);
+  }
+
+  void visitFreqTerm(FreqTerm node) {
+    heading('FreqTerm', node);
+    super.visitFreqTerm(node);
+  }
+
+  void visitFractionTerm(FractionTerm node) {
+    heading('FractionTerm', node);
+    output.depth++;
+    super.visitFractionTerm(node);
+    output.depth--;
+  }
+
+  void visitUriTerm(UriTerm node) {
+    heading('UriTerm', node);
+    output.depth++;
+    super.visitUriTerm(node);
+    output.depth--;
+  }
+
+  void visitFunctionTerm(FunctionTerm node) {
+    heading('FunctionTerm', node);
+    output.depth++;
+    super.visitFunctionTerm(node);
+    output.depth--;
+  }
+
+  void visitGroupTerm(GroupTerm node) {
+    heading('GroupTerm', node);
+    output.depth++;
+    output.writeNodeList('grouped terms', node._terms);
+    output.depth--;
+  }
+
+  void visitItemTerm(ItemTerm node) {
+    heading('ItemTerm', node);
+    super.visitItemTerm(node);
+  }
+
+  void visitIE8Term(IE8Term node) {
+    heading('IE8Term', node);
+    visitLiteralTerm(node);
+  }
+
+  void visitOperatorSlash(OperatorSlash node) {
+    heading('OperatorSlash', node);
+  }
+
+  void visitOperatorComma(OperatorComma node) {
+    heading('OperatorComma', node);
+  }
+
+  void visitOperatorPlus(OperatorPlus node) {
+    heading('OperatorPlus', node);
+  }
+
+  void visitOperatorMinus(OperatorMinus node) {
+    heading('OperatorMinus', node);
+  }
+
+  void visitVarUsage(VarUsage node) {
+    heading('Var', node);
+    output.depth++;
+    output.write('usage ${node.name}');
+    output.writeNodeList('default values', node.defaultValues);
+    output.depth--;
+  }
+
+  void visitExpressions(Expressions node) {
+    heading('Expressions', node);
+    output.depth++;
+    output.writeNodeList('expressions', node.expressions);
+    output.depth--;
+  }
+
+  void visitBinaryExpression(BinaryExpression node) {
+    heading('BinaryExpression', node);
+    // TODO(terry): TBD
+  }
+
+  void visitUnaryExpression(UnaryExpression node) {
+    heading('UnaryExpression', node);
+    // TODO(terry): TBD
+  }
+
+  void visitIdentifier(Identifier node) {
+    heading('Identifier(${output.toValue(node.name)})', node);
+  }
+
+  void visitWildcard(Wildcard node) {
+    heading('Wildcard(*)', node);
+  }
+
+  void visitDartStyleExpression(DartStyleExpression node) {
+    heading('DartStyleExpression', node);
+  }
+
+  void visitFontExpression(FontExpression node) {
+    heading('Dart Style FontExpression', node);
+  }
+
+  void visitBoxExpression(BoxExpression node) {
+    heading('Dart Style BoxExpression', node);
+  }
+
+  void visitMarginExpression(MarginExpression node) {
+    heading('Dart Style MarginExpression', node);
+  }
+
+  void visitBorderExpression(BorderExpression node) {
+    heading('Dart Style BorderExpression', node);
+  }
+
+  void visitHeightExpression(HeightExpression node) {
+    heading('Dart Style HeightExpression', node);
+  }
+
+  void visitPaddingExpression(PaddingExpression node) {
+    heading('Dart Style PaddingExpression', node);
+  }
+
+  void visitWidthExpression(WidthExpression node) {
+    heading('Dart Style WidthExpression', node);
+  }
+}
diff --git a/mojo/public/dart/third_party/csslib/lib/src/validate.dart b/mojo/public/dart/third_party/csslib/lib/src/validate.dart
new file mode 100644
index 0000000..d45cd95
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/lib/src/validate.dart
@@ -0,0 +1,125 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library csslib.src.validate;
+
+import 'package:csslib/visitor.dart';
+import 'package:source_span/source_span.dart';
+
+/** Can be thrown on any Css runtime problem includes source location. */
+class CssSelectorException extends SourceSpanException {
+  CssSelectorException(String message, [SourceSpan span])
+      : super(message, span);
+}
+
+List<String> classes = [];
+List<String> ids = [];
+
+class Validate {
+  static int _classNameCheck(var selector, int matches) {
+    if (selector.isCombinatorDescendant() ||
+        (selector.isCombinatorNone() && matches == 0)) {
+      if (matches < 0) {
+        String tooMany = selector.simpleSelector.toString();
+        throw new CssSelectorException(
+            'Can not mix Id selector with class selector(s). Id '
+            'selector must be singleton too many starting at $tooMany');
+      }
+
+      return matches + 1;
+    } else {
+      String error = selector.toString();
+      throw new CssSelectorException(
+          'Selectors can not have combinators (>, +, or ~) before $error');
+    }
+  }
+
+  static int _elementIdCheck(var selector, int matches) {
+    if (selector.isCombinatorNone() && matches == 0) {
+      // Perfect just one element id returns matches of -1.
+      return -1;
+    } else if (selector.isCombinatorDescendant()) {
+      String tooMany = selector.simpleSelector.toString();
+      throw new CssSelectorException(
+          'Use of Id selector must be singleton starting at $tooMany');
+    } else {
+      String error = selector.simpleSelector.toString();
+      throw new CssSelectorException(
+          'Selectors can not have combinators (>, +, or ~) before $error');
+    }
+  }
+
+  // Validate the @{css expression} only .class and #elementId are valid inside
+  // of @{...}.
+  static template(List<Selector> selectors) {
+    var errorSelector; // signal which selector didn't match.
+    bool found = false; // signal if a selector is matched.
+    int matches = 0; // < 0 IdSelectors, > 0 ClassSelector
+
+    // At most one selector group (any number of simple selector sequences).
+    assert(selectors.length <= 1);
+
+    for (final sels in selectors) {
+      for (final selector in sels.simpleSelectorSequences) {
+        found = false;
+        var simpleSelector = selector.simpleSelector;
+        if (simpleSelector is ClassSelector) {
+          // Any class name starting with an underscore is a private class name
+          // that doesn't have to match the world of known classes.
+          if (!simpleSelector.name.startsWith('_')) {
+            // TODO(terry): For now iterate through all classes look for faster
+            //              mechanism hash map, etc.
+            for (final className in classes) {
+              if (selector.simpleSelector.name == className) {
+                matches = _classNameCheck(selector, matches);
+                found = true; // .class found.
+                break;
+              }
+              for (final className2 in classes) {
+                print(className2);
+              }
+            }
+          } else {
+            // Don't check any class name that is prefixed with an underscore.
+            // However, signal as found and bump up matches; it's a valid class
+            // name.
+            matches = _classNameCheck(selector, matches);
+            found = true; // ._class are always okay.
+          }
+        } else if (simpleSelector is IdSelector) {
+          // Any element id starting with an underscore is a private element id
+          // that doesn't have to match the world of known elemtn ids.
+          if (!simpleSelector.name.startsWith('_')) {
+            for (final id in ids) {
+              if (simpleSelector.name == id) {
+                matches = _elementIdCheck(selector, matches);
+                found = true; // #id found.
+                break;
+              }
+            }
+          } else {
+            // Don't check any element ID that is prefixed with an underscore.
+            // Signal as found and bump up matches; it's a valid element ID.
+            matches = _elementIdCheck(selector, matches);
+            found = true; // #_id are always okay
+          }
+        } else {
+          String badSelector = simpleSelector.toString();
+          throw new CssSelectorException(
+              'Invalid template selector $badSelector');
+        }
+
+        if (!found) {
+          String unknownName = simpleSelector.toString();
+          throw new CssSelectorException('Unknown selector name $unknownName');
+        }
+      }
+    }
+
+    // Every selector must match.
+    Selector selector = selectors[0];
+    assert((matches >= 0 ? matches : -matches) ==
+        selector.simpleSelectorSequences.length);
+  }
+}
diff --git a/mojo/public/dart/third_party/csslib/lib/visitor.dart b/mojo/public/dart/third_party/csslib/lib/visitor.dart
new file mode 100644
index 0000000..fa0f8d2
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/lib/visitor.dart
@@ -0,0 +1,455 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library csslib.visitor;
+
+import 'package:source_span/source_span.dart';
+import 'parser.dart';
+
+part 'src/css_printer.dart';
+part 'src/tree.dart';
+part 'src/tree_base.dart';
+part 'src/tree_printer.dart';
+
+abstract class VisitorBase {
+  void visitCssComment(CssComment node);
+  void visitCommentDefinition(CommentDefinition node);
+  void visitStyleSheet(StyleSheet node);
+  void visitNoOp(NoOp node);
+  void visitTopLevelProduction(TopLevelProduction node);
+  void visitDirective(Directive node);
+  void visitMediaExpression(MediaExpression node);
+  void visitMediaQuery(MediaQuery node);
+  void visitMediaDirective(MediaDirective node);
+  void visitHostDirective(HostDirective node);
+  void visitPageDirective(PageDirective node);
+  void visitCharsetDirective(CharsetDirective node);
+  void visitImportDirective(ImportDirective node);
+  void visitKeyFrameDirective(KeyFrameDirective node);
+  void visitKeyFrameBlock(KeyFrameBlock node);
+  void visitFontFaceDirective(FontFaceDirective node);
+  void visitStyletDirective(StyletDirective node);
+  void visitNamespaceDirective(NamespaceDirective node);
+  void visitVarDefinitionDirective(VarDefinitionDirective node);
+  void visitMixinDefinition(MixinDefinition node);
+  void visitMixinRulesetDirective(MixinRulesetDirective node);
+  void visitMixinDeclarationDirective(MixinDeclarationDirective node);
+  void visitIncludeDirective(IncludeDirective node);
+  void visitContentDirective(ContentDirective node);
+
+  void visitRuleSet(RuleSet node);
+  void visitDeclarationGroup(DeclarationGroup node);
+  void visitMarginGroup(MarginGroup node);
+  void visitDeclaration(Declaration node);
+  void visitVarDefinition(VarDefinition node);
+  void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node);
+  void visitExtendDeclaration(ExtendDeclaration node);
+  void visitSelectorGroup(SelectorGroup node);
+  void visitSelector(Selector node);
+  void visitSimpleSelectorSequence(SimpleSelectorSequence node);
+  void visitSimpleSelector(SimpleSelector node);
+  void visitElementSelector(ElementSelector node);
+  void visitNamespaceSelector(NamespaceSelector node);
+  void visitAttributeSelector(AttributeSelector node);
+  void visitIdSelector(IdSelector node);
+  void visitClassSelector(ClassSelector node);
+  void visitPseudoClassSelector(PseudoClassSelector node);
+  void visitPseudoElementSelector(PseudoElementSelector node);
+  void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node);
+  void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node);
+  void visitNegationSelector(NegationSelector node);
+  void visitSelectorExpression(SelectorExpression node);
+
+  void visitUnicodeRangeTerm(UnicodeRangeTerm node);
+  void visitLiteralTerm(LiteralTerm node);
+  void visitHexColorTerm(HexColorTerm node);
+  void visitNumberTerm(NumberTerm node);
+  void visitUnitTerm(UnitTerm node);
+  void visitLengthTerm(LengthTerm node);
+  void visitPercentageTerm(PercentageTerm node);
+  void visitEmTerm(EmTerm node);
+  void visitExTerm(ExTerm node);
+  void visitAngleTerm(AngleTerm node);
+  void visitTimeTerm(TimeTerm node);
+  void visitFreqTerm(FreqTerm node);
+  void visitFractionTerm(FractionTerm node);
+  void visitUriTerm(UriTerm node);
+  void visitResolutionTerm(ResolutionTerm node);
+  void visitChTerm(ChTerm node);
+  void visitRemTerm(RemTerm node);
+  void visitViewportTerm(ViewportTerm node);
+  void visitFunctionTerm(FunctionTerm node);
+  void visitGroupTerm(GroupTerm node);
+  void visitItemTerm(ItemTerm node);
+  void visitIE8Term(IE8Term node);
+  void visitOperatorSlash(OperatorSlash node);
+  void visitOperatorComma(OperatorComma node);
+  void visitOperatorPlus(OperatorPlus node);
+  void visitOperatorMinus(OperatorMinus node);
+  void visitVarUsage(VarUsage node);
+
+  void visitExpressions(Expressions node);
+  void visitBinaryExpression(BinaryExpression node);
+  void visitUnaryExpression(UnaryExpression node);
+
+  void visitIdentifier(Identifier node);
+  void visitWildcard(Wildcard node);
+  void visitThisOperator(ThisOperator node);
+  void visitNegation(Negation node);
+
+  void visitDartStyleExpression(DartStyleExpression node);
+  void visitFontExpression(FontExpression node);
+  void visitBoxExpression(BoxExpression node);
+  void visitMarginExpression(MarginExpression node);
+  void visitBorderExpression(BorderExpression node);
+  void visitHeightExpression(HeightExpression node);
+  void visitPaddingExpression(PaddingExpression node);
+  void visitWidthExpression(WidthExpression node);
+}
+
+/** Base vistor class for the style sheet AST. */
+class Visitor implements VisitorBase {
+  /** Helper function to walk a list of nodes. */
+  void _visitNodeList(List<TreeNode> list) {
+    // Don't use iterable otherwise the list can't grow while using Visitor.
+    // It certainly can't have items deleted before the index being iterated
+    // but items could be added after the index.
+    for (var index = 0; index < list.length; index++) {
+      list[index].visit(this);
+    }
+  }
+
+  void visitTree(StyleSheet tree) => visitStyleSheet(tree);
+
+  void visitStyleSheet(StyleSheet ss) {
+    _visitNodeList(ss.topLevels);
+  }
+
+  void visitNoOp(NoOp node) {}
+
+  void visitTopLevelProduction(TopLevelProduction node) {}
+
+  void visitDirective(Directive node) {}
+
+  void visitCssComment(CssComment node) {}
+
+  void visitCommentDefinition(CommentDefinition node) {}
+
+  void visitMediaExpression(MediaExpression node) {
+    visitExpressions(node.exprs);
+  }
+
+  void visitMediaQuery(MediaQuery node) {
+    for (var mediaExpr in node.expressions) {
+      visitMediaExpression(mediaExpr);
+    }
+  }
+
+  void visitMediaDirective(MediaDirective node) {
+    for (var mediaQuery in node.mediaQueries) {
+      visitMediaQuery(mediaQuery);
+    }
+    for (var ruleset in node.rulesets) {
+      visitRuleSet(ruleset);
+    }
+  }
+
+  void visitHostDirective(HostDirective node) {
+    for (var ruleset in node.rulesets) {
+      visitRuleSet(ruleset);
+    }
+  }
+
+  void visitPageDirective(PageDirective node) {
+    for (var declGroup in node._declsMargin) {
+      if (declGroup is MarginGroup) {
+        visitMarginGroup(declGroup);
+      } else {
+        visitDeclarationGroup(declGroup);
+      }
+    }
+  }
+
+  void visitCharsetDirective(CharsetDirective node) {}
+
+  void visitImportDirective(ImportDirective node) {
+    for (var mediaQuery in node.mediaQueries) {
+      visitMediaQuery(mediaQuery);
+    }
+  }
+
+  void visitKeyFrameDirective(KeyFrameDirective node) {
+    visitIdentifier(node.name);
+    _visitNodeList(node._blocks);
+  }
+
+  void visitKeyFrameBlock(KeyFrameBlock node) {
+    visitExpressions(node._blockSelectors);
+    visitDeclarationGroup(node._declarations);
+  }
+
+  void visitFontFaceDirective(FontFaceDirective node) {
+    visitDeclarationGroup(node._declarations);
+  }
+
+  void visitStyletDirective(StyletDirective node) {
+    _visitNodeList(node.rulesets);
+  }
+
+  void visitNamespaceDirective(NamespaceDirective node) {}
+
+  void visitVarDefinitionDirective(VarDefinitionDirective node) {
+    visitVarDefinition(node.def);
+  }
+
+  void visitMixinRulesetDirective(MixinRulesetDirective node) {
+    _visitNodeList(node.rulesets);
+  }
+
+  void visitMixinDefinition(MixinDefinition node) {}
+
+  void visitMixinDeclarationDirective(MixinDeclarationDirective node) {
+    visitDeclarationGroup(node.declarations);
+  }
+
+  void visitIncludeDirective(IncludeDirective node) {
+    for (var index = 0; index < node.args.length; index++) {
+      var param = node.args[index];
+      _visitNodeList(param);
+    }
+  }
+
+  void visitContentDirective(ContentDirective node) {
+    // TODO(terry): TBD
+  }
+
+  void visitRuleSet(RuleSet node) {
+    visitSelectorGroup(node._selectorGroup);
+    visitDeclarationGroup(node._declarationGroup);
+  }
+
+  void visitDeclarationGroup(DeclarationGroup node) {
+    _visitNodeList(node.declarations);
+  }
+
+  void visitMarginGroup(MarginGroup node) => visitDeclarationGroup(node);
+
+  void visitDeclaration(Declaration node) {
+    visitIdentifier(node._property);
+    if (node._expression != null) node._expression.visit(this);
+  }
+
+  void visitVarDefinition(VarDefinition node) {
+    visitIdentifier(node._property);
+    if (node._expression != null) node._expression.visit(this);
+  }
+
+  void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) {
+    visitIncludeDirective(node.include);
+  }
+
+  void visitExtendDeclaration(ExtendDeclaration node) {
+    _visitNodeList(node.selectors);
+  }
+
+  void visitSelectorGroup(SelectorGroup node) {
+    _visitNodeList(node.selectors);
+  }
+
+  void visitSelector(Selector node) {
+    _visitNodeList(node.simpleSelectorSequences);
+  }
+
+  void visitSimpleSelectorSequence(SimpleSelectorSequence node) {
+    node.simpleSelector.visit(this);
+  }
+
+  void visitSimpleSelector(SimpleSelector node) => node._name.visit(this);
+
+  void visitNamespaceSelector(NamespaceSelector node) {
+    if (node._namespace != null) node._namespace.visit(this);
+    if (node.nameAsSimpleSelector != null) {
+      node.nameAsSimpleSelector.visit(this);
+    }
+  }
+
+  void visitElementSelector(ElementSelector node) => visitSimpleSelector(node);
+
+  void visitAttributeSelector(AttributeSelector node) {
+    visitSimpleSelector(node);
+  }
+
+  void visitIdSelector(IdSelector node) => visitSimpleSelector(node);
+
+  void visitClassSelector(ClassSelector node) => visitSimpleSelector(node);
+
+  void visitPseudoClassSelector(PseudoClassSelector node) =>
+      visitSimpleSelector(node);
+
+  void visitPseudoElementSelector(PseudoElementSelector node) =>
+      visitSimpleSelector(node);
+
+  void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) =>
+      visitSimpleSelector(node);
+
+  void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) =>
+      visitSimpleSelector(node);
+
+  void visitNegationSelector(NegationSelector node) =>
+      visitSimpleSelector(node);
+
+  void visitSelectorExpression(SelectorExpression node) {
+    _visitNodeList(node.expressions);
+  }
+
+  void visitUnicodeRangeTerm(UnicodeRangeTerm node) {}
+
+  void visitLiteralTerm(LiteralTerm node) {}
+
+  void visitHexColorTerm(HexColorTerm node) {}
+
+  void visitNumberTerm(NumberTerm node) {}
+
+  void visitUnitTerm(UnitTerm node) {}
+
+  void visitLengthTerm(LengthTerm node) {
+    visitUnitTerm(node);
+  }
+
+  void visitPercentageTerm(PercentageTerm node) {
+    visitLiteralTerm(node);
+  }
+
+  void visitEmTerm(EmTerm node) {
+    visitLiteralTerm(node);
+  }
+
+  void visitExTerm(ExTerm node) {
+    visitLiteralTerm(node);
+  }
+
+  void visitAngleTerm(AngleTerm node) {
+    visitUnitTerm(node);
+  }
+
+  void visitTimeTerm(TimeTerm node) {
+    visitUnitTerm(node);
+  }
+
+  void visitFreqTerm(FreqTerm node) {
+    visitUnitTerm(node);
+  }
+
+  void visitFractionTerm(FractionTerm node) {
+    visitLiteralTerm(node);
+  }
+
+  void visitUriTerm(UriTerm node) {
+    visitLiteralTerm(node);
+  }
+
+  void visitResolutionTerm(ResolutionTerm node) {
+    visitUnitTerm(node);
+  }
+
+  void visitChTerm(ChTerm node) {
+    visitUnitTerm(node);
+  }
+
+  void visitRemTerm(RemTerm node) {
+    visitUnitTerm(node);
+  }
+
+  void visitViewportTerm(ViewportTerm node) {
+    visitUnitTerm(node);
+  }
+
+  void visitFunctionTerm(FunctionTerm node) {
+    visitLiteralTerm(node);
+    visitExpressions(node._params);
+  }
+
+  void visitGroupTerm(GroupTerm node) {
+    for (var term in node._terms) {
+      term.visit(this);
+    }
+  }
+
+  void visitItemTerm(ItemTerm node) {
+    visitNumberTerm(node);
+  }
+
+  void visitIE8Term(IE8Term node) {}
+
+  void visitOperatorSlash(OperatorSlash node) {}
+
+  void visitOperatorComma(OperatorComma node) {}
+
+  void visitOperatorPlus(OperatorPlus node) {}
+
+  void visitOperatorMinus(OperatorMinus node) {}
+
+  void visitVarUsage(VarUsage node) {
+    _visitNodeList(node.defaultValues);
+  }
+
+  void visitExpressions(Expressions node) {
+    _visitNodeList(node.expressions);
+  }
+
+  void visitBinaryExpression(BinaryExpression node) {
+    // TODO(terry): TBD
+    throw UnimplementedError;
+  }
+
+  void visitUnaryExpression(UnaryExpression node) {
+    // TODO(terry): TBD
+    throw UnimplementedError;
+  }
+
+  void visitIdentifier(Identifier node) {}
+
+  void visitWildcard(Wildcard node) {}
+
+  void visitThisOperator(ThisOperator node) {}
+
+  void visitNegation(Negation node) {}
+
+  void visitDartStyleExpression(DartStyleExpression node) {}
+
+  void visitFontExpression(FontExpression node) {
+    // TODO(terry): TBD
+    throw UnimplementedError;
+  }
+
+  void visitBoxExpression(BoxExpression node) {
+    // TODO(terry): TBD
+    throw UnimplementedError;
+  }
+
+  void visitMarginExpression(MarginExpression node) {
+    // TODO(terry): TBD
+    throw UnimplementedError;
+  }
+
+  void visitBorderExpression(BorderExpression node) {
+    // TODO(terry): TBD
+    throw UnimplementedError;
+  }
+
+  void visitHeightExpression(HeightExpression node) {
+    // TODO(terry): TB
+    throw UnimplementedError;
+  }
+
+  void visitPaddingExpression(PaddingExpression node) {
+    // TODO(terry): TBD
+    throw UnimplementedError;
+  }
+
+  void visitWidthExpression(WidthExpression node) {
+    // TODO(terry): TBD
+    throw UnimplementedError;
+  }
+}
diff --git a/mojo/public/dart/third_party/csslib/pubspec.yaml b/mojo/public/dart/third_party/csslib/pubspec.yaml
new file mode 100644
index 0000000..70923da
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/pubspec.yaml
@@ -0,0 +1,15 @@
+name: csslib
+version: 0.12.1
+author: Polymer.dart Team <web-ui-dev@dartlang.org>
+description: A library for parsing CSS.
+homepage: https://github.com/dart-lang/csslib
+environment:
+  sdk: '>=1.1.0 <2.0.0'
+dependencies:
+  args: '>=0.9.0 <0.14.0'
+  logging: '>=0.9.0 <0.12.0'
+  path: '>=0.9.0 <2.0.0'
+  source_span: '>=1.0.0 <2.0.0'
+dev_dependencies:
+  browser: '>=0.9.0 <0.11.0'
+  test: '>=0.12.0 <0.13.0'
diff --git a/mojo/public/dart/third_party/csslib/test/big_1_test.dart b/mojo/public/dart/third_party/csslib/test/big_1_test.dart
new file mode 100644
index 0000000..f92ea82
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/test/big_1_test.dart
@@ -0,0 +1,1166 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library big_1_test;
+
+import 'package:test/test.dart';
+import 'testing.dart';
+
+compilePolyfillAndValidate(String input, String generated) {
+  var errors = [];
+  var stylesheet = polyFillCompileCss(input, errors: errors, opts: options);
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+}
+
+void big_test() {
+  var input = r'''
+/********************************************************************
+ * Kennedy colors
+ ********************************************************************/
+@kennedy-red: #dd4b39;
+@kennedy-blue: #4d90fe;
+@kennedy-green: #3d9400;
+
+/********************************************************************
+ * link colors
+ ********************************************************************/
+@link-color-1: #1155cc;
+@link-color-2: #666666;
+
+/********************************************************************
+ * text and header colors
+ ********************************************************************/
+@text-color-emphasized-1: #222222;
+@text-color-emphasized-2: #333333;
+@text-color-regular: #666666;
+@text-color-deemphasized-1: #777777;
+@text-color-deemphasized-2: #999999;
+
+/********************************************************************
+ * icon colors
+ ********************************************************************/
+@zippy-icon-color: #b2b2b2;
+@zippy-icon-color-hover: #666666;
+
+@mutate-icon-color: #b2b2b2;
+
+@silhouette-color: #8bb7fe;
+
+/********************************************************************
+ * Panel and Card colors
+ ********************************************************************/
+@panel-header-color: #f7f7f7;
+@panel-body-color: #ffffff;
+@panel-border-color: #dcdcdc;
+
+/********************************************************************
+ * App area colors
+ ********************************************************************/
+ @apparea-background-color: #f2f2f2;
+
+/********************************************************************
+ * Table colors
+ ********************************************************************/
+@table-row-numbers: #666666;
+@table-row-item-links: #1155cc;
+@table-row-item: #666666;
+
+/* Borders */
+@table-border-color: #dcdcdc;
+@table-header-border-color: #dcdcdc;
+@table-row-data-border-color: #eaeaea;
+
+/* General column - USED: We are not currently spec'ing different colors
+ * for the currently sorted/unsorted on column.
+ */
+@table-header-label-color: #666666;
+@table-header-background-color: #f8f8f8;
+@table-column-background-color: #ffffff;
+
+
+/* Sorted column - UNUSED: We are not currently spec'ing different colors
+ * for the currently sorted/unsorted on column.
+ */
+@table-sorted-header-label-color: #666666;
+@table-sorted-header-background-color: #e6e6e6;
+@table-sorted-column-background-color: #f8f8f8;
+
+/* Unsorted column - UNUSED: We are not currently spec'ing different colors
+ * for the currently sorted/unsorted on column.
+ */
+@table-unsorted-header-label-color: #999999;
+@table-unsorted-header-background-color: #f8f8f8;
+@table-unsorted-column-background-color: #ffffff;
+
+@acux-border-color-1: #e5e5e5;
+@acux-border-color-2: #3b7bea;
+@acux-link-color: #3b7bea;
+@acux-shell-background-color: #f2f2f2;
+
+/********************************************************************
+ * Tooltip and popup colors
+ ********************************************************************/
+@tooltip-border-color: #333;
+@tooltip-color: #fff;
+@popup-border-color: #fff;
+
+/* Border radii */
+@button-radius: 2px;
+
+@mixin button-gradient(@from, @to) {
+  background-color: @from;
+  background-image: -webkit-linear-gradient(top, @from, @to);
+  background-image: linear-gradient(top, @from, @to);
+}
+
+@mixin button-transition(@property, @time) {
+  -webkit-transition: @property @time;
+  transition: @property @time;
+}
+
+@mixin text-not-selectable() {
+  -webkit-user-select: none;
+  user-select: none;
+}
+
+/*
+ * Buttons and their states
+ */
+@mixin btn-base {
+  display: inline-block;
+  min-width: 62px;
+  text-align: center;
+  font-size: 11px;
+  font-weight: bold;
+  height: 28px;
+  padding: 0 8px;
+  line-height: 27px;
+  border-radius: @button-radius;
+  cursor: default;
+
+  color: #444;
+  border: 1px solid rgba(0,0,0,0.1);
+  @include button-transition(all, 0.218s);
+  @include button-gradient(#f5f5f5, #f1f1f1);
+
+  &:hover {
+    border: 1px solid #C6C6C6;
+    color: #222;
+    box-shadow: 0px 1px 1px rgba(0,0,0,0.1);
+    @include button-transition(all, 0s);
+    @include button-gradient(#f8f8f8, #f1f1f1);
+  }
+
+  &:active {
+    border: 1px solid #C6C6C6;
+    color: #666;
+    box-shadow: inset 0px 1px 2px rgba(0,0,0,0.1);
+    @include button-gradient(#f6f6f6, #f1f1f1);
+  }
+
+  &:focus {
+    outline: none;
+    border: 1px solid #4D90FE;
+    z-index: 4 !important;
+  }
+
+  &.selected, &.popup-open {
+    border: 1px solid #CCC;
+    color: #666;
+    box-shadow: inset 0px 1px 2px rgba(0,0,0,0.1);
+    @include button-gradient(#EEEEEE, #E0E0E0);
+  }
+
+  &.disabled, &.disabled:hover, &.disabled:active,
+  &[disabled], &[disabled]:hover, &[disabled]:active {
+    background: none;
+    color: #b8b8b8;
+    border: 1px solid rgba(0,0,0,0.05);
+    cursor: default;
+    pointer-events: none;
+  }
+
+  &.flat {
+    background: none;
+    border-color: transparent;
+    padding: 0;
+    box-shadow: none;
+  }
+
+  &.invalid {
+    outline: none;
+    border: 1px solid @kennedy-red;
+    box-shadow: inset 0px 1px 2px rgba(0,0,0,0.3);
+  }
+}
+
+.btn-container {
+  padding: 10px;
+}
+
+.btn {
+  @include btn-base;
+}
+
+.btn-small {
+  /* TODO(prsd): Implement using a mix-in. */
+  min-width: 30px;
+}
+
+.btn-left {
+  @include btn-base;
+  border-radius: @button-radius 0 0 @button-radius;
+  margin-right: 0;
+  padding: 0;
+  min-width: 30px;
+}
+
+.btn-right {
+  @include btn-base;
+  border-radius: 0 @button-radius @button-radius 0;
+  border-left: none;
+  margin-left: 0;
+  padding: 0;
+  min-width: 30px;
+}
+
+.btn + .btn {
+  margin-left: 5px;
+}
+
+/* Primary Button and it's states */
+.btn-primary {
+  color: #FFF !important;
+  width: 94px;
+  border-color: #3079ed;
+  @include button-gradient(#4d90fe, #4787ed);
+
+  &:hover, &:active {
+    border-color: #2f5bb7;
+    @include button-gradient(#4d90fe, #357ae8);
+  }
+
+  &:focus {
+    border-color: #4D90FE;
+    box-shadow:inset 0 0 0 1px rgba(255,255,255,0.5);
+  }
+
+  &:focus:hover {
+    box-shadow:inset 0 0 0 1px #fff, 0px 1px 1px rgba(0,0,0,0.1);
+  }
+
+  &.disabled, &.disabled:hover, &.disabled:active,
+  &[disabled], &[disabled]:hover, &[disabled]:active {
+    border-color:#3079ed;
+    background-color: #4d90fe;
+    opacity: 0.7;
+  }
+}
+
+/* Checkbox displayed as a toggled button
+ * Invisible checkbox followed by a label with 'for' set to checkbox */
+input[type="checkbox"].toggle-button {
+  display: none;
+
+  & + label {
+    @extend .btn;
+  }
+
+  &:checked + label,
+  & + label.popup-open {
+    border: 1px solid #CCC;
+    color: #666;
+    box-shadow: inset 0px 1px 2px rgba(0,0,0,0.1);
+    @include button-gradient(#EEEEEE, #E0E0E0);
+  }
+}
+
+.txt-input {
+  display:inline-block;
+  *display:inline;
+  *zoom:1;
+  padding:4px 12px;
+  margin-bottom:0;
+  font-size:14px;
+  line-height:20px;
+  vertical-align:middle;
+  color:#333333;
+  border-color:#e6e6e6 #e6e6e6 #bfbfbf;
+  border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  border:1px solid #cccccc;
+  *border:0;
+  border-bottom-color:#b3b3b3;
+  -webkit-border-radius:4px;
+  -moz-border-radius:4px;
+  border-radius:4px;
+  *margin-left:.3em;
+  -webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px
+  rgba(0,0,0,.05);
+  -moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+  box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+}
+
+input[type="text"], input:not([type]), .txt-input {
+  height: 29px;
+  background-color: white;
+  padding: 4px 0 4px 8px;
+  color: 333;
+  border: 1px solid #d9d9d9;
+  border-top: 1px solid #c0c0c0;
+  display: inline-block;
+  vertical-align: top;
+  box-sizing: border-box;
+  border-radius: 1px;
+
+  &:hover {
+    border: 1px solid #b9b9b9;
+    border-top: 1px solid #a0a0a0;
+    box-shadow: inset 0px 1px 2px rgba(0,0,0,0.1);
+  }
+
+  &:focus {
+    outline: none;
+    border: 1px solid @kennedy-blue;
+    box-shadow: inset 0px 1px 2px rgba(0,0,0,0.3);
+  }
+
+  &.disabled, &.disabled:hover, &.disabled:active, &:disabled {
+    background: #fff;
+    border: 1px solid #f3f3f3;
+    border: 1px solid rgba(0,0,0,0.05);
+    color: #b8b8b8;
+    cursor: default;
+    pointer-events: none;
+  }
+
+  &.invalid, &:focus:invalid, &:required:invalid {
+    outline: none;
+    border: 1px solid @kennedy-red;
+    box-shadow: inset 0px 1px 2px rgba(0,0,0,0.3);
+  }
+}
+
+/* Text area */
+textarea {
+  @extend .txt-input;
+  height: 3em;
+}
+
+/* Hide the spin button in datepickers */
+input[type="date"]::-webkit-inner-spin-button,
+input[type="datetime"]::-webkit-inner-spin-button,
+input[type="datetime-local"]::-webkit-inner-spin-button,
+input[type="month"]::-webkit-inner-spin-button,
+input[type="time"]::-webkit-inner-spin-button,
+input[type="week"]::-webkit-inner-spin-button {
+  display: none;
+}
+
+
+/*
+ * Selects & Dropdowns
+ */
+.dropdown-menu,
+.popup {
+  width: auto;
+  padding: 0;
+  margin: 0 0 0 1px;
+  background: white;
+  text-align: left;
+  z-index: 1000;
+  outline: 1px solid rgba(0,0,0,0.2);
+  white-space: nowrap;
+  list-style: none;
+  box-shadow: 0px 2px 4px rgba(0,0,0,0.2);
+  @include button-transition(opacity, 0.218s);
+}
+
+.popup {
+  padding: 0 0 6px;
+}
+.dropdown-menu,
+.popup {
+  pointer-events: all;
+}
+
+.popup ul {
+  margin: 0;
+  padding: 0;
+}
+.popup li {
+  list-style-type: none;
+  padding: 5px 10px;
+  cursor: default;
+}
+.popup .header {
+  padding: 5px 10px;
+}
+
+ /* existing styles defined here */
+.popup .divider,
+.dropdown-menu .divider {
+  width:100%;
+  height:1px;
+  padding: 0;
+  overflow:hidden;
+  background-color:#c0c0c0;
+  border-bottom:1px solid @popup-border-color;
+}
+
+.dropdown-menu {
+  max-height: 600px;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.popup {
+  overflow: hidden;
+}
+
+.dropdown-menuitem,
+.dropdown-menu > li {
+  display: block;
+  padding: 6px 44px 6px 16px;
+  color: #666;
+  font-size:13px;
+  font-weight: normal;
+  cursor: default;
+  margin: 0;
+  text-decoration: none;
+  @include text-not-selectable();
+
+  &.disabled {
+    color: #CCC;
+    background-color: #FFF;
+  }
+
+  &:hover, &.selected {
+    color: #222;
+    background-color: #F1F1F1;
+  }
+}
+
+.dropdown-menuheader {
+  padding: 6px 44px 6px 16px;
+  color: #666;
+  font-size:11px;
+  font-weight: bold;
+  cursor: default;
+  margin: 0;
+  text-decoration: none;
+  background-color: #F1F1F1;
+  @include text-not-selectable();
+}
+
+li.dropdown-menudivider {
+  width:100%;
+  height:1px;
+  padding: 0;
+  overflow:hidden;
+  background-color:#D0D0D0;
+  border-bottom:1px solid #ffffff;
+}
+
+.btn-container {
+  padding: 10px;
+}
+
+/*
+ * Modal dialogs
+ */
+
+.modal-frame {
+  position: relative;
+  background-color: white;
+  outline: 1px solid rgba(0, 0, 0, 0.2);
+  padding: 30px 42px;
+  min-width: 480px;
+  z-index: 9000;
+  pointer-events: auto;
+  box-shadow: 0 4px 16px 0 rgba(0,0,0,0.2);
+
+  @include button-transition(all, 0.218s);
+
+  &.medium {
+    padding: 28px 32px;
+    min-width: 280px;
+  }
+
+  &.small {
+    padding: 16px 20px;
+  }
+
+}
+
+.modal-backdrop {
+  background-color: rgba(0,0,0,0.1);
+  position: fixed;
+  height: 100%;
+  width: 100%;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  z-index: 99;
+  margin: 0;
+
+  display: none;
+  opacity: 0;
+  @include button-transition(all, 0.218s);
+
+  &.visible {
+    display: -webkit-flex;
+    display: flex;
+    -webkit-align-items: center;
+    align-items: center;
+    -webkit-justify-content: space-around;
+    justify-content: space-around;
+    opacity: 1;
+  }
+}
+
+/*
+ * Scrollbars
+ */
+
+::-webkit-scrollbar {
+  width: 10px;
+  height: 10px;
+  background: white;
+}
+
+::-webkit-scrollbar-button {
+  height: 0px;
+  width: 0px;
+
+  &:start:decrement,
+  &:end:increment {
+    display: block;
+  }
+
+  &:vertical:start:increment,
+  &:vertical:end:decrement {
+    display: none;
+  }
+}
+
+::-webkit-scrollbar-thumb {
+  background-color: rgba(0, 0, 0, .2);
+  background-clip: padding-box;
+  border: solid transparent;
+  border-width: 1px 1px 1px 2px;
+  min-height: 28px;
+  padding: 100px 0 0;
+  box-shadow: inset 1px 1px 0 rgba(0, 0, 0, .1),
+              inset 0 -1px 0 rgba(0, 0, 0, .07);
+
+  &:hover {
+    background-color: rgba(0,0,0,0.4);
+    -webkit-box-shadow: inset 1px 1px 1px rgba(0,0,0,0.25);
+  }
+
+  &:active {
+    -webkit-box-shadow: inset 1px 1px 3px rgba(0,0,0,0.35);
+    background-color: rgba(0,0,0,0.5);
+  }
+
+  &:vertical {
+    border-top: 0px solid transparent;
+    border-bottom: 0px solid transparent;
+    border-right: 0px solid transparent;
+    border-left: 1px solid transparent;
+  }
+
+  &:horizontal {
+    border-top: 1px solid transparent;
+    border-bottom: 0px solid transparent;
+    border-right: 0px solid transparent;
+    border-left: 0px solid transparent;
+  }
+}
+
+::-webkit-scrollbar-track {
+  background-clip: padding-box;
+  background-color: white;
+
+  &:hover {
+    background-color: rgba(0,0,0,0.05);
+    -webkit-box-shadow: inset 1px 0px 0px  rgba(0,0,0,0.10);
+  }
+
+  &:active {
+    background-color: rgba(0,0,0,0.05);
+    -webkit-box-shadow: inset 1px 0px 0px  rgba(0,0,0,0.14),
+                        inset -1px -1px 0px  rgba(0,0,0,0.07);
+  }
+
+  &:vertical {
+    border-right: 0px solid transparent;
+    border-left: 1px solid transparent;
+  }
+
+  &:horizontal {
+    border-bottom: 0px solid transparent;
+    border-top: 1px solid transparent;
+  }
+}
+
+/* Tooltips */
+.tooltip {
+  background: @tooltip-border-color;
+  border-radius: 2px;
+  color: @tooltip-color;
+  padding: 4px 8px;
+  font-size: 10px;
+}
+
+.tooltip a,
+.tooltip div,
+.tooltip span {
+  color: @tooltip-color;
+}
+''';
+
+  var generated = r'''.btn-container {
+  padding: 10px;
+}
+.btn, input[type="checkbox"].toggle-button + label {
+  display: inline-block;
+  min-width: 62px;
+  text-align: center;
+  font-size: 11px;
+  font-weight: bold;
+  height: 28px;
+  padding: 0 8px;
+  line-height: 27px;
+  border-radius: 2px;
+  cursor: default;
+  color: #444;
+  border: 1px solid rgba(0, 0, 0, 0.1);
+  -webkit-transition: all 0.218s;
+  transition: all 0.218s;
+  background-color: #f5f5f5;
+  background-image: -webkit-linear-gradient(top, #f5f5f5, #f1f1f1);
+  background-image: linear-gradient(top, #f5f5f5, #f1f1f1);
+}
+.btn:hover, input[type="checkbox"].toggle-button + label:hover {
+  border: 1px solid #C6C6C6;
+  color: #222;
+  box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);
+  -webkit-transition: all 0s;
+  transition: all 0s;
+  background-color: #f8f8f8;
+  background-image: -webkit-linear-gradient(top, #f8f8f8, #f1f1f1);
+  background-image: linear-gradient(top, #f8f8f8, #f1f1f1);
+}
+.btn:active, input[type="checkbox"].toggle-button + label:active {
+  border: 1px solid #C6C6C6;
+  color: #666;
+  box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.1);
+  background-color: #f6f6f6;
+  background-image: -webkit-linear-gradient(top, #f6f6f6, #f1f1f1);
+  background-image: linear-gradient(top, #f6f6f6, #f1f1f1);
+}
+.btn:focus, input[type="checkbox"].toggle-button + label:focus {
+  outline: none;
+  border: 1px solid #4D90FE;
+  z-index: 4 !important;
+}
+.btn.selected, .btn.popup-open, input[type="checkbox"].toggle-button + label.selected, input[type="checkbox"].toggle-button + label.popup-open {
+  border: 1px solid #CCC;
+  color: #666;
+  box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.1);
+  background-color: #EEE;
+  background-image: -webkit-linear-gradient(top, #EEE, #E0E0E0);
+  background-image: linear-gradient(top, #EEE, #E0E0E0);
+}
+.btn.disabled, .btn.disabled:hover, .btn.disabled:active, .btn[disabled], .btn[disabled]:hover, .btn[disabled]:active, input[type="checkbox"].toggle-button + label.disabled, input[type="checkbox"].toggle-button + label.disabled:hover, input[type="checkbox"].toggle-button + label.disabled:active, input[type="checkbox"].toggle-button + label[disabled], input[type="checkbox"].toggle-button + label[disabled]:hover, input[type="checkbox"].toggle-button + label[disabled]:active {
+  background: none;
+  color: #b8b8b8;
+  border: 1px solid rgba(0, 0, 0, 0.05);
+  cursor: default;
+  pointer-events: none;
+}
+.btn.flat, input[type="checkbox"].toggle-button + label.flat {
+  background: none;
+  border-color: transparent;
+  padding: 0;
+  box-shadow: none;
+}
+.btn.invalid, input[type="checkbox"].toggle-button + label.invalid {
+  outline: none;
+  border: 1px solid #dd4b39;
+  box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.3);
+}
+.btn-small {
+  min-width: 30px;
+}
+.btn-left {
+  display: inline-block;
+  min-width: 62px;
+  text-align: center;
+  font-size: 11px;
+  font-weight: bold;
+  height: 28px;
+  padding: 0 8px;
+  line-height: 27px;
+  border-radius: 2px;
+  cursor: default;
+  color: #444;
+  border: 1px solid rgba(0, 0, 0, 0.1);
+  -webkit-transition: all 0.218s;
+  transition: all 0.218s;
+  background-color: #f5f5f5;
+  background-image: -webkit-linear-gradient(top, #f5f5f5, #f1f1f1);
+  background-image: linear-gradient(top, #f5f5f5, #f1f1f1);
+  border-radius: 2px 0 0 2px;
+  margin-right: 0;
+  padding: 0;
+  min-width: 30px;
+}
+.btn-left:hover {
+  border: 1px solid #C6C6C6;
+  color: #222;
+  box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);
+  -webkit-transition: all 0s;
+  transition: all 0s;
+  background-color: #f8f8f8;
+  background-image: -webkit-linear-gradient(top, #f8f8f8, #f1f1f1);
+  background-image: linear-gradient(top, #f8f8f8, #f1f1f1);
+}
+.btn-left:active {
+  border: 1px solid #C6C6C6;
+  color: #666;
+  box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.1);
+  background-color: #f6f6f6;
+  background-image: -webkit-linear-gradient(top, #f6f6f6, #f1f1f1);
+  background-image: linear-gradient(top, #f6f6f6, #f1f1f1);
+}
+.btn-left:focus {
+  outline: none;
+  border: 1px solid #4D90FE;
+  z-index: 4 !important;
+}
+.btn-left.selected, .btn-left.popup-open {
+  border: 1px solid #CCC;
+  color: #666;
+  box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.1);
+  background-color: #EEE;
+  background-image: -webkit-linear-gradient(top, #EEE, #E0E0E0);
+  background-image: linear-gradient(top, #EEE, #E0E0E0);
+}
+.btn-left.disabled, .btn-left.disabled:hover, .btn-left.disabled:active, .btn-left[disabled], .btn-left[disabled]:hover, .btn-left[disabled]:active {
+  background: none;
+  color: #b8b8b8;
+  border: 1px solid rgba(0, 0, 0, 0.05);
+  cursor: default;
+  pointer-events: none;
+}
+.btn-left.flat {
+  background: none;
+  border-color: transparent;
+  padding: 0;
+  box-shadow: none;
+}
+.btn-left.invalid {
+  outline: none;
+  border: 1px solid #dd4b39;
+  box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.3);
+}
+.btn-right {
+  display: inline-block;
+  min-width: 62px;
+  text-align: center;
+  font-size: 11px;
+  font-weight: bold;
+  height: 28px;
+  padding: 0 8px;
+  line-height: 27px;
+  border-radius: 2px;
+  cursor: default;
+  color: #444;
+  border: 1px solid rgba(0, 0, 0, 0.1);
+  -webkit-transition: all 0.218s;
+  transition: all 0.218s;
+  background-color: #f5f5f5;
+  background-image: -webkit-linear-gradient(top, #f5f5f5, #f1f1f1);
+  background-image: linear-gradient(top, #f5f5f5, #f1f1f1);
+  border-radius: 0 2px 2px 0;
+  border-left: none;
+  margin-left: 0;
+  padding: 0;
+  min-width: 30px;
+}
+.btn-right:hover {
+  border: 1px solid #C6C6C6;
+  color: #222;
+  box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);
+  -webkit-transition: all 0s;
+  transition: all 0s;
+  background-color: #f8f8f8;
+  background-image: -webkit-linear-gradient(top, #f8f8f8, #f1f1f1);
+  background-image: linear-gradient(top, #f8f8f8, #f1f1f1);
+}
+.btn-right:active {
+  border: 1px solid #C6C6C6;
+  color: #666;
+  box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.1);
+  background-color: #f6f6f6;
+  background-image: -webkit-linear-gradient(top, #f6f6f6, #f1f1f1);
+  background-image: linear-gradient(top, #f6f6f6, #f1f1f1);
+}
+.btn-right:focus {
+  outline: none;
+  border: 1px solid #4D90FE;
+  z-index: 4 !important;
+}
+.btn-right.selected, .btn-right.popup-open {
+  border: 1px solid #CCC;
+  color: #666;
+  box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.1);
+  background-color: #EEE;
+  background-image: -webkit-linear-gradient(top, #EEE, #E0E0E0);
+  background-image: linear-gradient(top, #EEE, #E0E0E0);
+}
+.btn-right.disabled, .btn-right.disabled:hover, .btn-right.disabled:active, .btn-right[disabled], .btn-right[disabled]:hover, .btn-right[disabled]:active {
+  background: none;
+  color: #b8b8b8;
+  border: 1px solid rgba(0, 0, 0, 0.05);
+  cursor: default;
+  pointer-events: none;
+}
+.btn-right.flat {
+  background: none;
+  border-color: transparent;
+  padding: 0;
+  box-shadow: none;
+}
+.btn-right.invalid {
+  outline: none;
+  border: 1px solid #dd4b39;
+  box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.3);
+}
+.btn + .btn, input[type="checkbox"].toggle-button + label + .btn, .btn + input[type="checkbox"].toggle-button + label, input[type="checkbox"].toggle-button + label + input[type="checkbox"].toggle-button + label, input[type="checkbox"].toggle-button + label + input[type="checkbox"].toggle-button + label {
+  margin-left: 5px;
+}
+.btn-primary {
+  color: #FFF !important;
+  width: 94px;
+  border-color: #3079ed;
+  background-color: #4d90fe;
+  background-image: -webkit-linear-gradient(top, #4d90fe, #4787ed);
+  background-image: linear-gradient(top, #4d90fe, #4787ed);
+}
+.btn-primary:hover, .btn-primary:active {
+  border-color: #2f5bb7;
+  background-color: #4d90fe;
+  background-image: -webkit-linear-gradient(top, #4d90fe, #357ae8);
+  background-image: linear-gradient(top, #4d90fe, #357ae8);
+}
+.btn-primary:focus {
+  border-color: #4D90FE;
+  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.5);
+}
+.btn-primary:focus:hover {
+  box-shadow: inset 0 0 0 1px #fff, 0px 1px 1px rgba(0, 0, 0, 0.1);
+}
+.btn-primary.disabled, .btn-primary.disabled:hover, .btn-primary.disabled:active, .btn-primary[disabled], .btn-primary[disabled]:hover, .btn-primary[disabled]:active {
+  border-color: #3079ed;
+  background-color: #4d90fe;
+  opacity: 0.7;
+}
+input[type="checkbox"].toggle-button {
+  display: none;
+}
+input[type="checkbox"].toggle-button + label {
+}
+input[type="checkbox"].toggle-button:checked + label, input[type="checkbox"].toggle-button + label.popup-open {
+  border: 1px solid #CCC;
+  color: #666;
+  box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.1);
+  background-color: #EEE;
+  background-image: -webkit-linear-gradient(top, #EEE, #E0E0E0);
+  background-image: linear-gradient(top, #EEE, #E0E0E0);
+}
+.txt-input, textarea {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+  padding: 4px 12px;
+  margin-bottom: 0;
+  font-size: 14px;
+  line-height: 20px;
+  vertical-align: middle;
+  color: #333;
+  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  border: 1px solid #ccc;
+  *border: 0;
+  border-bottom-color: #b3b3b3;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  *margin-left: .3em;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05);
+  -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05);
+}
+input[type="text"], input:not([type]), .txt-input, textarea {
+  height: 29px;
+  background-color: #fff;
+  padding: 4px 0 4px 8px;
+  color: 333;
+  border: 1px solid #d9d9d9;
+  border-top: 1px solid #c0c0c0;
+  display: inline-block;
+  vertical-align: top;
+  box-sizing: border-box;
+  border-radius: 1px;
+}
+input[type="text"]:hover, input:not([type]):hover, .txt-input:hover, textarea:hover {
+  border: 1px solid #b9b9b9;
+  border-top: 1px solid #a0a0a0;
+  box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.1);
+}
+input[type="text"]:focus, input:not([type]):focus, .txt-input:focus, textarea:focus {
+  outline: none;
+  border: 1px solid #4d90fe;
+  box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.3);
+}
+input[type="text"].disabled, input:not([type]).disabled, .txt-input.disabled, input[type="text"].disabled:hover, input:not([type]).disabled:hover, .txt-input.disabled:hover, input[type="text"].disabled:active, input:not([type]).disabled:active, .txt-input.disabled:active, input[type="text"]:disabled, input:not([type]):disabled, .txt-input:disabled, textarea.disabled, textarea.disabled:hover, textarea.disabled:active, textarea:disabled {
+  background: #fff;
+  border: 1px solid #f3f3f3;
+  border: 1px solid rgba(0, 0, 0, 0.05);
+  color: #b8b8b8;
+  cursor: default;
+  pointer-events: none;
+}
+input[type="text"].invalid, input:not([type]).invalid, .txt-input.invalid, input[type="text"]:focus:invalid, input:not([type]):focus:invalid, .txt-input:focus:invalid, input[type="text"]:required:invalid, input:not([type]):required:invalid, .txt-input:required:invalid, textarea.invalid, textarea:focus:invalid, textarea:required:invalid {
+  outline: none;
+  border: 1px solid #dd4b39;
+  box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.3);
+}
+textarea {
+  height: 3em;
+}
+input[type="date"]::-webkit-inner-spin-button, input[type="datetime"]::-webkit-inner-spin-button, input[type="datetime-local"]::-webkit-inner-spin-button, input[type="month"]::-webkit-inner-spin-button, input[type="time"]::-webkit-inner-spin-button, input[type="week"]::-webkit-inner-spin-button {
+  display: none;
+}
+.dropdown-menu, .popup {
+  width: auto;
+  padding: 0;
+  margin: 0 0 0 1px;
+  background: #fff;
+  text-align: left;
+  z-index: 1000;
+  outline: 1px solid rgba(0, 0, 0, 0.2);
+  white-space: nowrap;
+  list-style: none;
+  box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2);
+  -webkit-transition: opacity 0.218s;
+  transition: opacity 0.218s;
+}
+.popup {
+  padding: 0 0 6px;
+}
+.dropdown-menu, .popup {
+  pointer-events: all;
+}
+.popup ul {
+  margin: 0;
+  padding: 0;
+}
+.popup li {
+  list-style-type: none;
+  padding: 5px 10px;
+  cursor: default;
+}
+.popup .header {
+  padding: 5px 10px;
+}
+.popup .divider, .dropdown-menu .divider {
+  width: 100%;
+  height: 1px;
+  padding: 0;
+  overflow: hidden;
+  background-color: #c0c0c0;
+  border-bottom: 1px solid #fff;
+}
+.dropdown-menu {
+  max-height: 600px;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.popup {
+  overflow: hidden;
+}
+.dropdown-menuitem, .dropdown-menu > li {
+  display: block;
+  padding: 6px 44px 6px 16px;
+  color: #666;
+  font-size: 13px;
+  font-weight: normal;
+  cursor: default;
+  margin: 0;
+  text-decoration: none;
+  -webkit-user-select: none;
+  user-select: none;
+}
+.dropdown-menuitem.disabled, .dropdown-menu > li.disabled {
+  color: #CCC;
+  background-color: #FFF;
+}
+.dropdown-menuitem:hover, .dropdown-menu > li:hover, .dropdown-menuitem.selected, .dropdown-menu > li.selected {
+  color: #222;
+  background-color: #F1F1F1;
+}
+.dropdown-menuheader {
+  padding: 6px 44px 6px 16px;
+  color: #666;
+  font-size: 11px;
+  font-weight: bold;
+  cursor: default;
+  margin: 0;
+  text-decoration: none;
+  background-color: #F1F1F1;
+  -webkit-user-select: none;
+  user-select: none;
+}
+li.dropdown-menudivider {
+  width: 100%;
+  height: 1px;
+  padding: 0;
+  overflow: hidden;
+  background-color: #D0D0D0;
+  border-bottom: 1px solid #fff;
+}
+.btn-container {
+  padding: 10px;
+}
+.modal-frame {
+  position: relative;
+  background-color: #fff;
+  outline: 1px solid rgba(0, 0, 0, 0.2);
+  padding: 30px 42px;
+  min-width: 480px;
+  z-index: 9000;
+  pointer-events: auto;
+  box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.2);
+  -webkit-transition: all 0.218s;
+  transition: all 0.218s;
+}
+.modal-frame.medium {
+  padding: 28px 32px;
+  min-width: 280px;
+}
+.modal-frame.small {
+  padding: 16px 20px;
+}
+.modal-backdrop {
+  background-color: rgba(0, 0, 0, 0.1);
+  position: fixed;
+  height: 100%;
+  width: 100%;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  z-index: 99;
+  margin: 0;
+  display: none;
+  opacity: 0;
+  -webkit-transition: all 0.218s;
+  transition: all 0.218s;
+}
+.modal-backdrop.visible {
+  display: -webkit-flex;
+  display: flex;
+  -webkit-align-items: center;
+  align-items: center;
+  -webkit-justify-content: space-around;
+  justify-content: space-around;
+  opacity: 1;
+}
+::-webkit-scrollbar {
+  width: 10px;
+  height: 10px;
+  background: #fff;
+}
+::-webkit-scrollbar-button {
+  height: 0px;
+  width: 0px;
+}
+::-webkit-scrollbar-button:start:decrement, ::-webkit-scrollbar-button:end:increment {
+  display: block;
+}
+::-webkit-scrollbar-button:vertical:start:increment, ::-webkit-scrollbar-button:vertical:end:decrement {
+  display: none;
+}
+::-webkit-scrollbar-thumb {
+  background-color: rgba(0, 0, 0, .2);
+  background-clip: padding-box;
+  border: solid transparent;
+  border-width: 1px 1px 1px 2px;
+  min-height: 28px;
+  padding: 100px 0 0;
+  box-shadow: inset 1px 1px 0 rgba(0, 0, 0, .1), inset 0 -1px 0 rgba(0, 0, 0, .07);
+}
+::-webkit-scrollbar-thumb:hover {
+  background-color: rgba(0, 0, 0, 0.4);
+  -webkit-box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.25);
+}
+::-webkit-scrollbar-thumb:active {
+  -webkit-box-shadow: inset 1px 1px 3px rgba(0, 0, 0, 0.35);
+  background-color: rgba(0, 0, 0, 0.5);
+}
+::-webkit-scrollbar-thumb:vertical {
+  border-top: 0px solid transparent;
+  border-bottom: 0px solid transparent;
+  border-right: 0px solid transparent;
+  border-left: 1px solid transparent;
+}
+::-webkit-scrollbar-thumb:horizontal {
+  border-top: 1px solid transparent;
+  border-bottom: 0px solid transparent;
+  border-right: 0px solid transparent;
+  border-left: 0px solid transparent;
+}
+::-webkit-scrollbar-track {
+  background-clip: padding-box;
+  background-color: #fff;
+}
+::-webkit-scrollbar-track:hover {
+  background-color: rgba(0, 0, 0, 0.05);
+  -webkit-box-shadow: inset 1px 0px 0px rgba(0, 0, 0, 0.10);
+}
+::-webkit-scrollbar-track:active {
+  background-color: rgba(0, 0, 0, 0.05);
+  -webkit-box-shadow: inset 1px 0px 0px rgba(0, 0, 0, 0.14), inset -1px -1px 0px rgba(0, 0, 0, 0.07);
+}
+::-webkit-scrollbar-track:vertical {
+  border-right: 0px solid transparent;
+  border-left: 1px solid transparent;
+}
+::-webkit-scrollbar-track:horizontal {
+  border-bottom: 0px solid transparent;
+  border-top: 1px solid transparent;
+}
+.tooltip {
+  background: #333;
+  border-radius: 2px;
+  color: #fff;
+  padding: 4px 8px;
+  font-size: 10px;
+}
+.tooltip a, .tooltip div, .tooltip span {
+  color: #fff;
+}''';
+
+  compilePolyfillAndValidate(input, generated);
+}
+
+main() {
+  test('big #1', big_test);
+}
diff --git a/mojo/public/dart/third_party/csslib/test/compiler_test.dart b/mojo/public/dart/third_party/csslib/test/compiler_test.dart
new file mode 100644
index 0000000..df5a44a
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/test/compiler_test.dart
@@ -0,0 +1,740 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library compiler_test;
+
+import 'dart:convert';
+import 'package:test/test.dart';
+import 'package:csslib/parser.dart';
+import 'package:csslib/visitor.dart';
+import 'testing.dart';
+
+void testClass() {
+  var errors = [];
+  var input = ".foobar {}";
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+
+  walkTree(stylesheet);
+
+  expect(stylesheet.topLevels.length, 1);
+
+  expect(stylesheet.topLevels[0] is RuleSet, true);
+
+  var ruleset = stylesheet.topLevels[0];
+  expect(ruleset.selectorGroup.selectors.length, 1);
+  expect(ruleset.declarationGroup.declarations.length, 0);
+
+  var selectorSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences;
+  expect(selectorSeqs.length, 1);
+  final simpSelector = selectorSeqs[0].simpleSelector;
+  expect(simpSelector is ClassSelector, true);
+  expect(selectorSeqs[0].isCombinatorNone, true);
+  expect(simpSelector.name, "foobar");
+}
+
+void testClass2() {
+  var errors = [];
+  var input = ".foobar .bar .no-story {}";
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+
+  walkTree(stylesheet);
+
+  expect(stylesheet.topLevels.length, 1);
+
+  expect(stylesheet.topLevels[0] is RuleSet, true);
+  var ruleset = stylesheet.topLevels[0];
+  expect(ruleset.selectorGroup.selectors.length, 1);
+  expect(ruleset.declarationGroup.declarations.length, 0);
+
+  var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences;
+  expect(simpleSeqs.length, 3);
+
+  var simpSelector0 = simpleSeqs[0].simpleSelector;
+  expect(simpSelector0 is ClassSelector, true);
+  expect(simpleSeqs[0].isCombinatorNone, true);
+  expect(simpSelector0.name, "foobar");
+
+  var simpSelector1 = simpleSeqs[1].simpleSelector;
+  expect(simpSelector1 is ClassSelector, true);
+  expect(simpleSeqs[1].isCombinatorDescendant, true);
+  expect(simpSelector1.name, "bar");
+
+  var simpSelector2 = simpleSeqs[2].simpleSelector;
+  expect(simpSelector2 is ClassSelector, true);
+  expect(simpleSeqs[2].isCombinatorDescendant, true);
+  expect(simpSelector2.name, "no-story");
+}
+
+void testId() {
+  var errors = [];
+  var input = "#elemId {}";
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+
+  walkTree(stylesheet);
+
+  expect(stylesheet.topLevels.length, 1);
+
+  expect(stylesheet.topLevels[0] is RuleSet, true);
+  var ruleset = stylesheet.topLevels[0];
+  expect(ruleset.selectorGroup.selectors.length, 1);
+  expect(ruleset.declarationGroup.declarations.length, 0);
+
+  var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences;
+
+  expect(simpleSeqs.length, 1);
+  var simpSelector = simpleSeqs[0].simpleSelector;
+  expect(simpSelector is IdSelector, true);
+  expect(simpleSeqs[0].isCombinatorNone, true);
+  expect(simpSelector.name, "elemId");
+}
+
+void testElement() {
+  var errors = [];
+  var input = "div {}";
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+
+  walkTree(stylesheet);
+
+  expect(stylesheet.topLevels.length, 1);
+
+  expect(stylesheet.topLevels[0] is RuleSet, true);
+  var ruleset = stylesheet.topLevels[0];
+  expect(ruleset.selectorGroup.selectors.length, 1);
+  expect(ruleset.declarationGroup.declarations.length, 0);
+
+  var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences;
+
+  expect(simpleSeqs.length, 1);
+
+  final simpSelector = simpleSeqs[0].simpleSelector;
+  expect(simpSelector is ElementSelector, true);
+  expect(simpleSeqs[0].isCombinatorNone, true);
+  expect(simpSelector.name, "div");
+
+  input = "div div span {}";
+  stylesheet = parseCss(input, errors: errors..clear());
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+
+  walkTree(stylesheet);
+
+  expect(stylesheet.topLevels.length, 1);
+
+  expect(stylesheet.topLevels[0] is RuleSet, true);
+  ruleset = stylesheet.topLevels[0];
+  expect(ruleset.selectorGroup.selectors.length, 1);
+  expect(ruleset.declarationGroup.declarations.length, 0);
+
+  simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences;
+
+  expect(simpleSeqs.length, 3);
+
+  var simpSelector0 = simpleSeqs[0].simpleSelector;
+  expect(simpSelector0 is ElementSelector, true);
+  expect(simpleSeqs[0].isCombinatorNone, true);
+  expect(simpSelector0.name, "div");
+
+  var simpSelector1 = simpleSeqs[1].simpleSelector;
+  expect(simpSelector1 is ElementSelector, true);
+  expect(simpleSeqs[1].isCombinatorDescendant, true);
+  expect(simpSelector1.name, "div");
+
+  var simpSelector2 = simpleSeqs[2].simpleSelector;
+  expect(simpSelector2 is ElementSelector, true);
+  expect(simpleSeqs[2].isCombinatorDescendant, true);
+  expect(simpSelector2.name, "span");
+}
+
+void testNamespace() {
+  var errors = [];
+  var input = "ns1|div {}";
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+
+  walkTree(stylesheet);
+
+  expect(stylesheet.topLevels.length, 1);
+
+  expect(stylesheet.topLevels[0] is RuleSet, true);
+  var ruleset = stylesheet.topLevels[0];
+  expect(ruleset.selectorGroup.selectors.length, 1);
+  expect(ruleset.declarationGroup.declarations.length, 0);
+
+  var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences;
+
+  expect(simpleSeqs.length, 1);
+  var simpSelector = simpleSeqs[0].simpleSelector;
+  expect(simpSelector is NamespaceSelector, true);
+  expect(simpleSeqs[0].isCombinatorNone, true);
+  expect(simpSelector.isNamespaceWildcard, false);
+  expect(simpSelector.namespace, "ns1");
+  var elementSelector = simpSelector.nameAsSimpleSelector;
+  expect(elementSelector is ElementSelector, true);
+  expect(elementSelector.isWildcard, false);
+  expect(elementSelector.name, "div");
+}
+
+void testNamespace2() {
+  var errors = [];
+  var input = "ns1|div div ns2|span .foobar {}";
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+
+  walkTree(stylesheet);
+
+  expect(stylesheet.topLevels.length, 1);
+
+  expect(stylesheet.topLevels[0] is RuleSet, true);
+  var ruleset = stylesheet.topLevels[0];
+  expect(ruleset.selectorGroup.selectors.length, 1);
+  expect(ruleset.declarationGroup.declarations.length, 0);
+
+  var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences;
+
+  expect(simpleSeqs.length, 4);
+
+  var simpSelector0 = simpleSeqs[0].simpleSelector;
+  expect(simpSelector0 is NamespaceSelector, true);
+  expect(simpleSeqs[0].isCombinatorNone, true);
+  expect(simpSelector0.namespace, "ns1");
+  var elementSelector0 = simpSelector0.nameAsSimpleSelector;
+  expect(elementSelector0 is ElementSelector, true);
+  expect(elementSelector0.isWildcard, false);
+  expect(elementSelector0.name, "div");
+
+  var simpSelector1 = simpleSeqs[1].simpleSelector;
+  expect(simpSelector1 is ElementSelector, true);
+  expect(simpleSeqs[1].isCombinatorDescendant, true);
+  expect(simpSelector1.name, "div");
+
+  var simpSelector2 = simpleSeqs[2].simpleSelector;
+  expect(simpSelector2 is NamespaceSelector, true);
+  expect(simpleSeqs[2].isCombinatorDescendant, true);
+  expect(simpSelector2.namespace, "ns2");
+  var elementSelector2 = simpSelector2.nameAsSimpleSelector;
+  expect(elementSelector2 is ElementSelector, true);
+  expect(elementSelector2.isWildcard, false);
+  expect(elementSelector2.name, "span");
+
+  var simpSelector3 = simpleSeqs[3].simpleSelector;
+  expect(simpSelector3 is ClassSelector, true);
+  expect(simpleSeqs[3].isCombinatorDescendant, true);
+  expect(simpSelector3.name, "foobar");
+}
+
+void testSelectorGroups() {
+  var errors = [];
+  var input =
+      "div, .foobar ,#elemId, .xyzzy .test, ns1|div div #elemId .foobar {}";
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+
+  walkTree(stylesheet);
+
+  expect(stylesheet.topLevels.length, 1);
+
+  expect(stylesheet.topLevels[0] is RuleSet, true);
+  var ruleset = stylesheet.topLevels[0];
+  expect(ruleset.selectorGroup.selectors.length, 5);
+  expect(ruleset.declarationGroup.declarations.length, 0);
+
+  var groupSelector0 = ruleset.selectorGroup.selectors[0];
+  expect(groupSelector0.simpleSelectorSequences.length, 1);
+  var selector0 = groupSelector0.simpleSelectorSequences[0];
+  var simpleSelector0 = selector0.simpleSelector;
+  expect(simpleSelector0 is ElementSelector, true);
+  expect(selector0.isCombinatorNone, true);
+  expect(simpleSelector0.name, "div");
+
+  var groupSelector1 = ruleset.selectorGroup.selectors[1];
+  expect(groupSelector1.simpleSelectorSequences.length, 1);
+  var selector1 = groupSelector1.simpleSelectorSequences[0];
+  var simpleSelector1 = selector1.simpleSelector;
+  expect(simpleSelector1 is ClassSelector, true);
+  expect(selector1.isCombinatorNone, true);
+  expect(simpleSelector1.name, "foobar");
+
+  var groupSelector2 = ruleset.selectorGroup.selectors[2];
+  expect(groupSelector2.simpleSelectorSequences.length, 1);
+  var selector2 = groupSelector2.simpleSelectorSequences[0];
+  var simpleSelector2 = selector2.simpleSelector;
+  expect(simpleSelector2 is IdSelector, true);
+  expect(selector2.isCombinatorNone, true);
+  expect(simpleSelector2.name, "elemId");
+
+  var groupSelector3 = ruleset.selectorGroup.selectors[3];
+  expect(groupSelector3.simpleSelectorSequences.length, 2);
+
+  var selector30 = groupSelector3.simpleSelectorSequences[0];
+  var simpleSelector30 = selector30.simpleSelector;
+  expect(simpleSelector30 is ClassSelector, true);
+  expect(selector30.isCombinatorNone, true);
+  expect(simpleSelector30.name, "xyzzy");
+
+  var selector31 = groupSelector3.simpleSelectorSequences[1];
+  var simpleSelector31 = selector31.simpleSelector;
+  expect(simpleSelector31 is ClassSelector, true);
+  expect(selector31.isCombinatorDescendant, true);
+  expect(simpleSelector31.name, "test");
+
+  var groupSelector4 = ruleset.selectorGroup.selectors[4];
+  expect(groupSelector4.simpleSelectorSequences.length, 4);
+
+  var selector40 = groupSelector4.simpleSelectorSequences[0];
+  var simpleSelector40 = selector40.simpleSelector;
+  expect(simpleSelector40 is NamespaceSelector, true);
+  expect(selector40.isCombinatorNone, true);
+  expect(simpleSelector40.namespace, "ns1");
+  var elementSelector = simpleSelector40.nameAsSimpleSelector;
+  expect(elementSelector is ElementSelector, true);
+  expect(elementSelector.isWildcard, false);
+  expect(elementSelector.name, "div");
+
+  var selector41 = groupSelector4.simpleSelectorSequences[1];
+  var simpleSelector41 = selector41.simpleSelector;
+  expect(simpleSelector41 is ElementSelector, true);
+  expect(selector41.isCombinatorDescendant, true);
+  expect(simpleSelector41.name, "div");
+
+  var selector42 = groupSelector4.simpleSelectorSequences[2];
+  var simpleSelector42 = selector42.simpleSelector;
+  expect(simpleSelector42 is IdSelector, true);
+  expect(selector42.isCombinatorDescendant, true);
+  expect(simpleSelector42.name, "elemId");
+
+  var selector43 = groupSelector4.simpleSelectorSequences[3];
+  var simpleSelector43 = selector43.simpleSelector;
+  expect(selector43.isCombinatorDescendant, true);
+  expect(simpleSelector43.name, "foobar");
+}
+
+void testCombinator() {
+  var errors = [];
+  var input = ".foobar > .bar + .no-story ~ myNs|div #elemId {}";
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+
+  walkTree(stylesheet);
+
+  expect(stylesheet.topLevels.length, 1);
+
+  expect(stylesheet.topLevels[0] is RuleSet, true);
+  var ruleset = stylesheet.topLevels[0];
+  expect(ruleset.selectorGroup.selectors.length, 1);
+  expect(ruleset.declarationGroup.declarations.length, 0);
+
+  var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences;
+
+  expect(simpleSeqs.length, 5);
+
+  var selector0 = simpleSeqs[0];
+  var simpleSelector0 = selector0.simpleSelector;
+  expect(simpleSelector0 is ClassSelector, true);
+  expect(selector0.isCombinatorNone, true);
+  expect(simpleSelector0.name, "foobar");
+
+  var selector1 = simpleSeqs[1];
+  var simpleSelector1 = selector1.simpleSelector;
+  expect(simpleSelector1 is ClassSelector, true);
+  expect(selector1.isCombinatorGreater, true);
+  expect(simpleSelector1.name, "bar");
+
+  var selector2 = simpleSeqs[2];
+  var simpleSelector2 = selector2.simpleSelector;
+  expect(simpleSelector2 is ClassSelector, true);
+  expect(selector2.isCombinatorPlus, true);
+  expect(simpleSelector2.name, "no-story");
+
+  var selector3 = simpleSeqs[3];
+  var simpleSelector3 = selector3.simpleSelector;
+  expect(simpleSelector3 is NamespaceSelector, true);
+  expect(selector3.isCombinatorTilde, true);
+  expect(simpleSelector3.namespace, "myNs");
+  var elementSelector = simpleSelector3.nameAsSimpleSelector;
+  expect(elementSelector is ElementSelector, true);
+  expect(elementSelector.isWildcard, false);
+  expect(elementSelector.name, "div");
+
+  var selector4 = simpleSeqs[4];
+  var simpleSelector4 = selector4.simpleSelector;
+  expect(simpleSelector4 is IdSelector, true);
+  expect(selector4.isCombinatorDescendant, true);
+  expect(simpleSelector4.name, "elemId");
+}
+
+void testWildcard() {
+  var errors = [];
+  var input = "* {}";
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+
+  walkTree(stylesheet);
+
+  expect(stylesheet.topLevels.length, 1);
+
+  expect(stylesheet.topLevels[0] is RuleSet, true);
+  var ruleset = stylesheet.topLevels[0];
+  expect(ruleset.selectorGroup.selectors.length, 1);
+  expect(ruleset.declarationGroup.declarations.length, 0);
+
+  var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences;
+
+  expect(simpleSeqs.length, 1);
+  var simpSelector = simpleSeqs[0].simpleSelector;
+  expect(simpSelector is ElementSelector, true);
+  expect(simpleSeqs[0].isCombinatorNone, true);
+  expect(simpSelector.isWildcard, true);
+  expect(simpSelector.name, "*");
+
+  input = "*.foobar {}";
+  stylesheet = parseCss(input, errors: errors..clear());
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+
+  walkTree(stylesheet);
+
+  expect(stylesheet.topLevels.length, 1);
+
+  expect(stylesheet.topLevels[0] is RuleSet, true);
+  ruleset = stylesheet.topLevels[0];
+  expect(ruleset.selectorGroup.selectors.length, 1);
+  expect(ruleset.declarationGroup.declarations.length, 0);
+
+  simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences;
+
+  expect(simpleSeqs.length, 2);
+
+  var selector0 = simpleSeqs[0];
+  var simpleSelector0 = selector0.simpleSelector;
+  expect(simpleSelector0 is ElementSelector, true);
+  expect(selector0.isCombinatorNone, true);
+  expect(simpleSelector0.isWildcard, true);
+  expect(simpleSelector0.name, "*");
+
+  var selector1 = simpleSeqs[1];
+  var simpleSelector1 = selector1.simpleSelector;
+  expect(simpleSelector1 is ClassSelector, true);
+  expect(selector1.isCombinatorNone, true);
+  expect(simpleSelector1.name, "foobar");
+
+  input = "myNs|*.foobar {}";
+  stylesheet = parseCss(input, errors: errors..clear());
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+
+  walkTree(stylesheet);
+
+  expect(stylesheet.topLevels.length, 1);
+
+  expect(stylesheet.topLevels[0] is RuleSet, true);
+  ruleset = stylesheet.topLevels[0];
+  expect(ruleset.selectorGroup.selectors.length, 1);
+  expect(ruleset.declarationGroup.declarations.length, 0);
+
+  simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences;
+
+  expect(simpleSeqs.length, 2);
+
+  selector0 = simpleSeqs[0];
+  simpleSelector0 = selector0.simpleSelector;
+  expect(simpleSelector0 is NamespaceSelector, true);
+  expect(selector0.isCombinatorNone, true);
+  expect(simpleSelector0.isNamespaceWildcard, false);
+  var elementSelector = simpleSelector0.nameAsSimpleSelector;
+  expect("myNs", simpleSelector0.namespace);
+  expect(elementSelector.isWildcard, true);
+  expect("*", elementSelector.name);
+
+  selector1 = simpleSeqs[1];
+  simpleSelector1 = selector1.simpleSelector;
+  expect(simpleSelector1 is ClassSelector, true);
+  expect(selector1.isCombinatorNone, true);
+  expect("foobar", simpleSelector1.name);
+
+  input = "*|*.foobar {}";
+  stylesheet = parseCss(input, errors: errors..clear());
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+
+  walkTree(stylesheet);
+
+  expect(stylesheet.topLevels[0] is RuleSet, true);
+  ruleset = stylesheet.topLevels[0];
+  expect(ruleset.selectorGroup.selectors.length, 1);
+  expect(ruleset.declarationGroup.declarations.length, 0);
+
+  simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences;
+
+  expect(simpleSeqs.length, 2);
+
+  selector0 = simpleSeqs[0];
+  simpleSelector0 = selector0.simpleSelector;
+  expect(simpleSelector0 is NamespaceSelector, true);
+  expect(selector0.isCombinatorNone, true);
+  expect(simpleSelector0.isNamespaceWildcard, true);
+  expect("*", simpleSelector0.namespace);
+  elementSelector = simpleSelector0.nameAsSimpleSelector;
+  expect(elementSelector.isWildcard, true);
+  expect("*", elementSelector.name);
+
+  selector1 = simpleSeqs[1];
+  simpleSelector1 = selector1.simpleSelector;
+  expect(simpleSelector1 is ClassSelector, true);
+  expect(selector1.isCombinatorNone, true);
+  expect("foobar", simpleSelector1.name);
+}
+
+/** Test List<int> as input to parser. */
+void testArrayOfChars() {
+  var errors = [];
+  var input = '<![CDATA[.foo { '
+      'color: red; left: 20px; top: 20px; width: 100px; height:200px'
+      '}'
+      '#div {'
+      'color : #00F578; border-color: #878787;'
+      '}]]>';
+
+  var stylesheet = parse(UTF8.encode(input), errors: errors);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+
+  expect(prettyPrint(stylesheet), r'''
+.foo {
+  color: #f00;
+  left: 20px;
+  top: 20px;
+  width: 100px;
+  height: 200px;
+}
+#div {
+  color: #00F578;
+  border-color: #878787;
+}''');
+}
+
+void testPseudo() {
+  var errors = [];
+
+  final input = r'''
+html:lang(fr-ca) { quotes: '" ' ' "' }
+zoom: { }
+
+a:link { color: red }
+:link  { color: blue }
+
+a:focus { background: yellow }
+a:focus:hover { background: white }
+
+p.special:first-letter {color: #ffd800}
+
+p:not(#example){
+  background-color: yellow;
+}
+
+input:not([DISABLED]){
+  background-color: yellow;
+}
+
+html|*:not(:link):not(:visited) {
+  border: 1px solid black;
+}
+
+*:not(FOO) {
+  height: 20px;
+}
+
+*|*:not(*) {
+  color: orange;
+}
+
+*|*:not(:hover) {
+  color: magenta;
+}
+
+p:nth-child(3n-3) { }
+
+div:nth-child(2n) { color : red; }
+''';
+
+  var stylesheet = parseCss(input, errors: errors, opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), r'''
+html:lang(fr-ca) {
+  quotes: '" ' ' "';
+}
+zoom {
+}
+a:link {
+  color: #f00;
+}
+:link {
+  color: #00f;
+}
+a:focus {
+  background: #ff0;
+}
+a:focus:hover {
+  background: #fff;
+}
+p.special:first-letter {
+  color: #ffd800;
+}
+p:not(#example) {
+  background-color: #ff0;
+}
+input:not([DISABLED]) {
+  background-color: #ff0;
+}
+html|*:not(:link):not(:visited) {
+  border: 1px solid #000;
+}
+*:not(FOO) {
+  height: 20px;
+}
+*|*:not(*) {
+  color: #ffa500;
+}
+*|*:not(:hover) {
+  color: #f0f;
+}
+p:nth-child(3n-3) {
+}
+div:nth-child(2n) {
+  color: #f00;
+}''');
+}
+
+void testAttribute() {
+  // TODO(terry): Implement
+}
+
+void testNegation() {
+  // TODO(terry): Implement
+}
+
+void testHost() {
+  var errors = [];
+  var input = '@host { '
+      ':scope {'
+      'white-space: nowrap;'
+      'overflow-style: marquee-line;'
+      'overflow-x: marquee;'
+      '}'
+      '* { color: red; }'
+      '*:hover { font-weight: bold; }'
+      ':nth-child(odd) { color: blue; }'
+      '}';
+  var stylesheet = parseCss(input, errors: errors, opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), r'''
+@host {
+:scope {
+  white-space: nowrap;
+  overflow-style: marquee-line;
+  overflow-x: marquee;
+}
+* {
+  color: #f00;
+}
+*:hover {
+  font-weight: bold;
+}
+:nth-child(odd) {
+  color: #00f;
+}
+}''');
+}
+
+void testStringEscape() {
+  var errors = [];
+  var input = r'''a { foo: '{"text" : "a\\\""}' }''';
+  var stylesheet = parseCss(input, errors: errors, opts: simpleOptions);
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+
+  expect(prettyPrint(stylesheet), r'''
+a {
+  foo: '{"text" : "a\\\""}';
+}''');
+}
+
+// TODO(terry): Move to emitter_test.dart when real emitter exist.
+void testEmitter() {
+  var errors = [];
+  var input = '.foo { '
+      'color: red; left: 20px; top: 20px; width: 100px; height:200px'
+      '}'
+      '#div {'
+      'color : #00F578; border-color: #878787;'
+      '}';
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+
+  walkTree(stylesheet);
+
+  expect(prettyPrint(stylesheet), r'''
+.foo {
+  color: #f00;
+  left: 20px;
+  top: 20px;
+  width: 100px;
+  height: 200px;
+}
+#div {
+  color: #00F578;
+  border-color: #878787;
+}''');
+}
+
+main() {
+  test('Classes', testClass);
+  test('Classes 2', testClass2);
+  test('Ids', testId);
+  test('Elements', testElement);
+  test('Namespace', testNamespace);
+  test('Namespace 2', testNamespace2);
+  test('Selector Groups', testSelectorGroups);
+  test('Combinator', testCombinator);
+  test('Wildcards', testWildcard);
+  test('Pseudo', testPseudo);
+  test('Attributes', testAttribute);
+  test('Negation', testNegation);
+  test('@host', testHost);
+  test('stringEscape', testStringEscape);
+  test('Parse List<int> as input', testArrayOfChars);
+  test('Simple Emitter', testEmitter);
+}
diff --git a/mojo/public/dart/third_party/csslib/test/debug_test.dart b/mojo/public/dart/third_party/csslib/test/debug_test.dart
new file mode 100644
index 0000000..94898eb
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/test/debug_test.dart
@@ -0,0 +1,30 @@
+library debug;
+
+import 'package:test/test.dart';
+import 'testing.dart';
+
+void main() {
+  test("excercise debug", () {
+    var style = parseCss(_input);
+
+    var debugValue = style.toDebugString();
+    expect(debugValue, isNotNull);
+
+    var style2 = style.clone();
+
+    expect(style2.toDebugString(), debugValue);
+  });
+}
+
+const String _input = r'''
+.foo {
+background-color: #191919;
+width: 10PX;
+height: 22mM !important;
+border-width: 20cm;
+margin-width: 33%;
+border-height: 30EM;
+width: .6in;
+length: 1.2in;
+-web-stuff: -10Px;
+}''';
diff --git a/mojo/public/dart/third_party/csslib/test/declaration_test.dart b/mojo/public/dart/third_party/csslib/test/declaration_test.dart
new file mode 100644
index 0000000..8326a03
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/test/declaration_test.dart
@@ -0,0 +1,1024 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library declaration_test;
+
+import 'package:test/test.dart';
+
+import 'testing.dart';
+
+void testSimpleTerms() {
+  var errors = [];
+  final String input = r'''
+@ import url("test.css");
+.foo {
+  background-color: #191919;
+  width: 10PX;
+  height: 22mM !important;
+  border-width: 20cm;
+  margin-width: 33%;
+  border-height: 30EM;
+  width: .6in;
+  length: 1.2in;
+  -web-stuff: -10Px;
+}''';
+  final String generated = r'''
+@import "test.css";
+.foo {
+  background-color: #191919;
+  width: 10px;
+  height: 22mm !important;
+  border-width: 20cm;
+  margin-width: 33%;
+  border-height: 30em;
+  width: .6in;
+  length: 1.2in;
+  -web-stuff: -10px;
+}''';
+
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+
+  final String input2 = r'''
+* {
+  border-color: green;
+}''';
+  final String generated2 = r'''
+* {
+  border-color: #008000;
+}''';
+
+  stylesheet = parseCss(input2, errors: errors..clear());
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated2);
+}
+
+/**
+ * Declarations with comments, references with single-quotes, double-quotes,
+ * no quotes.  Hex values with # and letters, and functions (rgba, url, etc.)
+ */
+void testDeclarations() {
+  var errors = [];
+  final String input = r'''
+.more {
+  color: white;
+  color: black;
+  color: cyan;
+  color: red;
+  color: #aabbcc;  /* test -- 3 */
+  color: blue;
+  background-image: url(http://test.jpeg);
+  background-image: url("http://double_quote.html");
+  background-image: url('http://single_quote.html');
+  color: rgba(10,20,255);  <!-- test CDO/CDC  -->
+  color: #123aef;   /* hex # part integer and part identifier */
+}''';
+  final String generated = r'''
+.more {
+  color: #fff;
+  color: #000;
+  color: #0ff;
+  color: #f00;
+  color: #abc;
+  color: #00f;
+  background-image: url("http://test.jpeg");
+  background-image: url("http://double_quote.html");
+  background-image: url("http://single_quote.html");
+  color: rgba(10, 20, 255);
+  color: #123aef;
+}''';
+
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+}
+
+void testIdentifiers() {
+  var errors = [];
+  final String input = r'''
+#da {
+  height: 100px;
+}
+#foo {
+  width: 10px;
+  color: #ff00cc;
+}
+''';
+  final String generated = r'''
+#da {
+  height: 100px;
+}
+#foo {
+  width: 10px;
+  color: #f0c;
+}''';
+
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(stylesheet != null, true);
+  expect(prettyPrint(stylesheet), generated);
+}
+
+void testComposites() {
+  var errors = [];
+  final String input = r'''
+.xyzzy {
+  border: 10px 80px 90px 100px;
+  width: 99%;
+}
+@-webkit-keyframes pulsate {
+  0% {
+    -webkit-transform: translate3d(0, 0, 0) scale(1.0);
+  }
+}''';
+  final String generated = r'''
+.xyzzy {
+  border: 10px 80px 90px 100px;
+  width: 99%;
+}
+@-webkit-keyframes pulsate {
+  0% {
+  -webkit-transform: translate3d(0, 0, 0) scale(1.0);
+  }
+}''';
+
+  var stylesheet = parseCss(input, errors: errors);
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+}
+
+void testUnits() {
+  var errors = [];
+  final String input = r'''
+#id-1 {
+  transition: color 0.4s;
+  animation-duration: 500ms;
+  top: 1em;
+  left: 200ex;
+  right: 300px;
+  bottom: 400cm;
+  border-width: 2.5mm;
+  margin-top: .5in;
+  margin-left: 5pc;
+  margin-right: 5ex;
+  margin-bottom: 5ch;
+  font-size: 10pt;
+  padding-top: 22rem;
+  padding-left: 33vw;
+  padding-right: 34vh;
+  padding-bottom: 3vmin;
+  transform: rotate(20deg);
+  voice-pitch: 10hz;
+}
+#id-2 {
+  left: 2fr;
+  font-size: 10vmax;
+  transform: rotatex(20rad);
+  voice-pitch: 10khz;
+  -web-kit-resolution: 2dpi;    /* Bogus property name testing dpi unit. */
+}
+#id-3 {
+  -web-kit-resolution: 3dpcm;   /* Bogus property name testing dpi unit. */
+  transform: rotatey(20grad);
+}
+#id-4 {
+  -web-kit-resolution: 4dppx;   /* Bogus property name testing dpi unit. */
+  transform: rotatez(20turn);
+}
+''';
+
+  final String generated = r'''
+#id-1 {
+  transition: color 0.4s;
+  animation-duration: 500ms;
+  top: 1em;
+  left: 200ex;
+  right: 300px;
+  bottom: 400cm;
+  border-width: 2.5mm;
+  margin-top: .5in;
+  margin-left: 5pc;
+  margin-right: 5ex;
+  margin-bottom: 5ch;
+  font-size: 10pt;
+  padding-top: 22rem;
+  padding-left: 33vw;
+  padding-right: 34vh;
+  padding-bottom: 3vmin;
+  transform: rotate(20deg);
+  voice-pitch: 10hz;
+}
+#id-2 {
+  left: 2fr;
+  font-size: 10vmax;
+  transform: rotatex(20rad);
+  voice-pitch: 10khz;
+  -web-kit-resolution: 2dpi;
+}
+#id-3 {
+  -web-kit-resolution: 3dpcm;
+  transform: rotatey(20grad);
+}
+#id-4 {
+  -web-kit-resolution: 4dppx;
+  transform: rotatez(20turn);
+}''';
+
+  var stylesheet = parseCss(input, errors: errors, opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+}
+
+void testUnicode() {
+  var errors = [];
+  final String input = r'''
+.toggle:after {
+  content: '✔';
+  line-height: 43px;
+  font-size: 20px;
+  color: #d9d9d9;
+  text-shadow: 0 -1px 0 #bfbfbf;
+}
+''';
+
+  final String generated = r'''
+.toggle:after {
+  content: '✔';
+  line-height: 43px;
+  font-size: 20px;
+  color: #d9d9d9;
+  text-shadow: 0 -1px 0 #bfbfbf;
+}''';
+
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+}
+
+void testNewerCss() {
+  var errors = [];
+  final String input = r'''
+@media screen,print {
+  .foobar_screen {
+    width: 10px;
+  }
+}
+@page {
+  height: 22px;
+  size: 3in 3in;
+}
+@page : left {
+  width: 10px;
+}
+@page bar : left { @top-left { margin: 8px; } }
+@charset "ISO-8859-1";
+@charset 'ASCII';''';
+
+  final String generated = r'''
+@media screen, print {
+.foobar_screen {
+  width: 10px;
+}
+}
+@page {
+  height: 22px;
+  size: 3in 3in;
+}
+@page:left {
+  width: 10px;
+}
+@page bar:left {
+@top-left {
+  margin: 8px;
+}
+}
+@charset "ISO-8859-1";
+@charset "ASCII";''';
+
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+}
+
+void testMediaQueries() {
+  var errors = [];
+  String input = '''
+@media screen and (-webkit-min-device-pixel-ratio:0) {
+  .todo-item .toggle {
+    background: none;
+  }
+  #todo-item .toggle {
+    height: 40px;
+  }
+}''';
+  String generated = '''
+@media screen AND (-webkit-min-device-pixel-ratio:0) {
+.todo-item .toggle {
+  background: none;
+}
+#todo-item .toggle {
+  height: 40px;
+}
+}''';
+
+  var stylesheet = parseCss(input, errors: errors, opts: simpleOptions);
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+
+  input = '''
+  @media handheld and (min-width: 20em),
+         screen and (min-width: 20em) {
+    #id { color: red; }
+    .myclass { height: 20px; }
+  }
+  @media print and (min-resolution: 300dpi) {
+    #anotherId {
+      color: #fff;
+    }
+  }
+  @media print and (min-resolution: 280dpcm) {
+    #finalId {
+      color: #aaa;
+    }
+    .class2 {
+      border: 20px;
+    }
+  }''';
+  generated =
+      '''@media handheld AND (min-width:20em), screen AND (min-width:20em) {
+#id {
+  color: #f00;
+}
+.myclass {
+  height: 20px;
+}
+} @media print AND (min-resolution:300dpi) {
+#anotherId {
+  color: #fff;
+}
+} @media print AND (min-resolution:280dpcm) {
+#finalId {
+  color: #aaa;
+}
+.class2 {
+  border: 20px;
+}
+}''';
+
+  stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+
+  input = '''
+@media only screen and (min-device-width: 4000px) and
+    (min-device-height: 2000px), screen (another: 100px) {
+      html {
+        font-size: 10em;
+      }
+    }''';
+  generated = '@media ONLY screen AND (min-device-width:4000px) '
+      'AND (min-device-height:2000px), screen (another:100px) {\n'
+      'html {\n  font-size: 10em;\n}\n}';
+
+  stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+
+  input = '''
+@media screen,print (min-device-width: 4000px) and
+    (min-device-height: 2000px), screen (another: 100px) {
+      html {
+        font-size: 10em;
+      }
+    }''';
+  generated = '@media screen, print (min-device-width:4000px) AND '
+      '(min-device-height:2000px), screen (another:100px) {\n'
+      'html {\n  font-size: 10em;\n}\n}';
+
+  stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+
+  input = '''
+@import "test.css" ONLY screen, NOT print (min-device-width: 4000px);''';
+  generated =
+      '@import "test.css" ONLY screen, NOT print (min-device-width:4000px);';
+
+  stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+}
+
+void testFontFace() {
+  var errors = [];
+
+  final String input = '''
+@font-face {
+  font-family: BBCBengali;
+  src: url(fonts/BBCBengali.ttf) format("opentype");
+  unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???;
+}''';
+  final String generated = '''@font-face  {
+  font-family: BBCBengali;
+  src: url("fonts/BBCBengali.ttf") format("opentype");
+  unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???;
+}''';
+  var stylesheet = parseCss(input, errors: errors, opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+
+  final String input1 = '''
+@font-face {
+  font-family: Gentium;
+  src: url(http://example.com/fonts/Gentium.ttf);
+  src: url(http://example.com/fonts/Gentium.ttf);
+}''';
+  final String generated1 = '''@font-face  {
+  font-family: Gentium;
+  src: url("http://example.com/fonts/Gentium.ttf");
+  src: url("http://example.com/fonts/Gentium.ttf");
+}''';
+
+  stylesheet = parseCss(input1, errors: errors..clear(), opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated1);
+
+  final String input2 = '''
+@font-face {
+src: url(ideal-sans-serif.woff) format("woff"),
+     url(basic-sans-serif.ttf) format("opentype"),
+     local(Gentium Bold);
+}''';
+  final String generated2 = '@font-face  {\n'
+      '  src: url("ideal-sans-serif.woff") '
+      'format("woff"), url("basic-sans-serif.ttf") '
+      'format("opentype"), local(Gentium Bold);\n}';
+
+  stylesheet = parseCss(input2, errors: errors..clear(), opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated2);
+
+  final String input3 = '''@font-face {
+  font-family: MyGentium Text Ornaments;
+  src: local(Gentium Bold),   /* full font name */
+       local(Gentium-Bold),   /* Postscript name */
+       url(GentiumBold.ttf);  /* otherwise, download it */
+  font-weight: bold;
+}''';
+  final String generated3 = '''@font-face  {
+  font-family: MyGentium Text Ornaments;
+  src: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf");
+  font-weight: bold;
+}''';
+
+  stylesheet = parseCss(input3, errors: errors..clear(), opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated3);
+
+  final String input4 = '''
+@font-face {
+  font-family: STIXGeneral;
+  src: local(STIXGeneral), url(/stixfonts/STIXGeneral.otf);
+  unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
+}''';
+  final String generated4 = '''@font-face  {
+  font-family: STIXGeneral;
+  src: local(STIXGeneral), url("/stixfonts/STIXGeneral.otf");
+  unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
+}''';
+  stylesheet = parseCss(input4, errors: errors..clear(), opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated4);
+}
+
+void testCssFile() {
+  var errors = [];
+  final String input = r'''
+@import 'simple.css'
+@import "test.css" print
+@import url(test.css) screen, print
+@import url(http://google.com/maps/maps.css);
+
+div[href^='test'] {
+  height: 10px;
+}
+
+@-webkit-keyframes pulsate {
+  from {
+    -webkit-transform: translate3d(0, 0, 0) scale(1.0);
+  }
+  10% {
+    -webkit-transform: translate3d(0, 0, 0) scale(1.0);
+  }
+  30% {
+    -webkit-transform: translate3d(0, 2, 0) scale(1.0);
+  }
+}
+
+.foobar {
+    grid-columns: 10px ("content" 1fr 10px)[4];
+}
+
+.test-background {
+  background:  url(http://www.foo.com/bar.png);
+}
+''';
+
+  final String generated = '@import "simple.css"; '
+      '@import "test.css" print; '
+      '@import "test.css" screen, print; '
+      '@import "http://google.com/maps/maps.css";\n'
+      'div[href^="test"] {\n'
+      '  height: 10px;\n'
+      '}\n'
+      '@-webkit-keyframes pulsate {\n'
+      '  from {\n'
+      '  -webkit-transform: translate3d(0, 0, 0) scale(1.0);\n'
+      '  }\n'
+      '  10% {\n'
+      '  -webkit-transform: translate3d(0, 0, 0) scale(1.0);\n'
+      '  }\n'
+      '  30% {\n'
+      '  -webkit-transform: translate3d(0, 2, 0) scale(1.0);\n'
+      '  }\n'
+      '}\n'
+      '.foobar {\n'
+      '  grid-columns: 10px ("content" 1fr 10px) [4];\n'
+      '}\n'
+      '.test-background {\n'
+      '  background: url("http://www.foo.com/bar.png");\n'
+      '}';
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+}
+
+void testCompactEmitter() {
+  var errors = [];
+
+  // Check !import compactly emitted.
+  final String input = r'''
+div {
+  color: green !important;
+}
+''';
+  final String generated = "div { color: green!important; }";
+
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(compactOuptut(stylesheet), generated);
+
+  // Check namespace directive compactly emitted.
+  final String input2 = "@namespace a url(http://www.example.org/a);";
+  final String generated2 = "@namespace a url(http://www.example.org/a);";
+
+  var stylesheet2 = parseCss(input2, errors: errors..clear());
+
+  expect(stylesheet2 != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(compactOuptut(stylesheet2), generated2);
+}
+
+void testNotSelectors() {
+  var errors = [];
+
+  final String input = r'''
+.details:not(.open-details) x-element,
+.details:not(.open-details) .summary {
+  overflow: hidden;
+}
+
+.details:not(.open-details) x-icon {
+  margin-left: 99px;
+}
+
+.kind-class .details:not(.open-details) x-icon {
+  margin-left: 0px;
+}
+
+.name {
+  margin-left: 0px;
+}
+
+.details:not(.open-details) .the-class {
+  width: 80px;
+}
+
+*:focus
+{
+  outline: none;
+}
+
+body > h2:not(:first-of-type):not(:last-of-type) {
+  color: red;
+}
+
+.details-1:not([DISABLED]) {
+  outline: none;
+}
+
+html|*:not(:link):not(:visited) {
+  width: 92%;
+}
+
+*|*:not(*) {
+  font-weight: bold;
+}
+
+*:not(:not([disabled])) { color: blue; }
+''';
+  final String generated = r'''
+.details:not(.open-details) x-element, .details:not(.open-details) .summary {
+  overflow: hidden;
+}
+.details:not(.open-details) x-icon {
+  margin-left: 99px;
+}
+.kind-class .details:not(.open-details) x-icon {
+  margin-left: 0px;
+}
+.name {
+  margin-left: 0px;
+}
+.details:not(.open-details) .the-class {
+  width: 80px;
+}
+*:focus {
+  outline: none;
+}
+body > h2:not(:first-of-type):not(:last-of-type) {
+  color: #f00;
+}
+.details-1:not([DISABLED]) {
+  outline: none;
+}
+html|*:not(:link):not(:visited) {
+  width: 92%;
+}
+*|*:not(*) {
+  font-weight: bold;
+}
+*:not(:not([disabled])) {
+  color: #00f;
+}''';
+
+  var stylesheet = parseCss(input, errors: errors, opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+}
+
+void testIE() {
+  var errors = [];
+  final String input = ".test {\n"
+      "  filter: progid:DXImageTransform.Microsoft.gradient"
+      "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n"
+      "}";
+  final String generated = ".test {\n"
+      "  filter: progid:DXImageTransform.Microsoft.gradient"
+      "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n"
+      "}";
+
+  var stylesheet = parseCss(input, errors: errors, opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+
+  final String input2 = ".test {\n"
+      "  filter: progid:DXImageTransform.Microsoft.gradient"
+      "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670')\n"
+      "        progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n"
+      "}";
+
+  final String generated2 = ".test {\n"
+      "  filter: progid:DXImageTransform.Microsoft.gradient"
+      "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670')\n"
+      "         progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n"
+      "}";
+
+  stylesheet = parseCss(input2, errors: errors..clear(), opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated2);
+
+  final String input3 = '''
+div {
+  filter: alpha(opacity=80);          /* IE7 and under */
+  -ms-filter: "Alpha(Opacity=40)";    /* IE8 and newer */
+
+  Filter: Blur(Add = 0, Direction = 225, Strength = 10);
+  Filter: FlipV;
+  Filter: Gray;
+  FILTER: Chroma(Color = #000000) Mask(Color=#00FF00);
+  Filter: Alpha(Opacity=100, FinishOpacity=0, Style=2, StartX=20, StartY=40,
+      FinishX=0, FinishY=0) Wave(Add=0, Freq=5, LightStrength=20,
+      Phase=220, Strength=10);
+}
+''';
+  final String generated3 = 'div {\n  filter: alpha(opacity=80);\n'
+      '  -ms-filter: "Alpha(Opacity=40)";\n'
+      '  Filter: Blur(Add = 0, Direction = 225, Strength = 10);\n'
+      '  Filter: FlipV;\n  Filter: Gray;\n'
+      '  FILTER: Chroma(Color = #000000)  Mask(Color=#00FF00);\n'
+      '  Filter: Alpha(Opacity=100, FinishOpacity=0, Style=2, '
+      'StartX=20, StartY=40,\n'
+      '      FinishX=0, FinishY=0)  Wave(Add=0, Freq=5, LightStrength=20,\n'
+      '      Phase=220, Strength=10);\n}';
+
+  stylesheet = parseCss(input3, errors: errors..clear(), opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated3);
+}
+
+/**
+ *  Test IE specific declaration syntax:
+ *    IE6 property name prefixed with _ (normal CSS property name can start
+ *    with an underscore).
+ *
+ *    IE7 or below property add asterisk before the CSS property.
+ *
+ *    IE8 or below add \9 at end of declaration expression e.g.,
+ *        background: red\9;
+ */
+void testIEDeclaration() {
+  var errors = [];
+
+  final input = '''
+.testIE-6 {
+  _zoom : 5;
+}
+.clearfix {
+  *zoom: 1;
+}
+audio, video {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+}
+input {
+  *overflow: visible;
+  line-height: normal;
+}
+.uneditable-input:focus {
+  border-color: rgba(82, 168, 236, 0.8);
+  outline: 0;
+  outline: thin dotted \\9; /* IE6-9 */
+}
+
+input[type="radio"], input[type="checkbox"] {
+  margin-top: 1px \\9;
+  *margin-top: 0;
+}
+
+input.search-query {
+  padding-right: 14px;
+  padding-right: 4px \\9;
+  padding-left: 14px;
+  padding-left: 4px \\9; /* IE7-8 no border-radius, don't indent padding. */
+}
+
+.btn.active {
+  background-color: #cccccc \\9;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+from {
+background-position: 40px 0;
+}
+to {
+background-position: 0 0;
+}
+}
+
+@-moz-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+@-ms-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+@-o-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+@keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}''';
+
+  final generated = '''.testIE-6 {
+  _zoom: 5;
+}
+.clearfix {
+  *zoom: 1;
+}
+audio, video {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+}
+input {
+  *overflow: visible;
+  line-height: normal;
+}
+.uneditable-input:focus {
+  border-color: rgba(82, 168, 236, 0.8);
+  outline: 0;
+  outline: thin dotted \\9;
+}
+input[type="radio"], input[type="checkbox"] {
+  margin-top: 1px \\9;
+  *margin-top: 0;
+}
+input.search-query {
+  padding-right: 14px;
+  padding-right: 4px \\9;
+  padding-left: 14px;
+  padding-left: 4px \\9;
+}
+.btn.active {
+  background-color: #ccc \\9;
+}
+@-webkit-keyframes progress-bar-stripes {
+  from {
+  background-position: 40px 0;
+  }
+  to {
+  background-position: 0 0;
+  }
+}
+@-moz-keyframes progress-bar-stripes {
+  from {
+  background-position: 40px 0;
+  }
+  to {
+  background-position: 0 0;
+  }
+}
+@keyframes progress-bar-stripes {
+  from {
+  background-position: 40px 0;
+  }
+  to {
+  background-position: 0 0;
+  }
+}
+@-o-keyframes progress-bar-stripes {
+  from {
+  background-position: 40px 0;
+  }
+  to {
+  background-position: 0 0;
+  }
+}
+@keyframes progress-bar-stripes {
+  from {
+  background-position: 40px 0;
+  }
+  to {
+  background-position: 0 0;
+  }
+}''';
+
+  var stylesheet = parseCss(input, errors: errors, opts: simpleOptions);
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+}
+
+void testHangs() {
+  var errors = [];
+
+  // Bad hexvalue had caused a hang in processTerm.
+  final input = r'''#a { color: #ebebeburl(0/IE8+9+); }''';
+  var stylesheet = parseCss(input, errors: errors, opts: options);
+
+  expect(stylesheet != null, true);
+  expect(errors.length, 3, reason: errors.toString());
+
+  var errorMessage = errors[0];
+  expect(errorMessage.message, contains('Bad hex number'));
+  expect(errorMessage.span, isNotNull);
+  expect(errorMessage.span.start.line, 0);
+  expect(errorMessage.span.start.column, 12);
+  expect(errorMessage.span.text, '#ebebeburl');
+
+  errorMessage = errors[1];
+  expect(errorMessage.message, contains('expected }, but found +'));
+  expect(errorMessage.span, isNotNull);
+  expect(errorMessage.span.start.line, 0);
+  expect(errorMessage.span.start.column, 30);
+  expect(errorMessage.span.text, '+');
+
+  errorMessage = errors[2];
+  expect(errorMessage.message, contains('premature end of file unknown CSS'));
+  expect(errorMessage.span, isNotNull);
+  expect(errorMessage.span.start.line, 0);
+  expect(errorMessage.span.start.column, 31);
+  expect(errorMessage.span.text, ')');
+
+  // Missing closing parenthesis for keyframes.
+  final input2 = r'''@-ms-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+''';
+
+  stylesheet = parseCss(input2, errors: errors..clear(), opts: options);
+
+  expect(stylesheet != null, true);
+
+  expect(errors.length, 1, reason: errors.toString());
+
+  errorMessage = errors[0];
+  expect(errorMessage.message, contains('unexpected end of file'));
+  expect(errorMessage.span, isNotNull);
+  expect(errorMessage.span.start.line, 7);
+  expect(errorMessage.span.start.column, 0);
+  expect(errorMessage.span.text.trim(), '');
+}
+
+main() {
+  test('Simple Terms', testSimpleTerms);
+  test('Declarations', testDeclarations);
+  test('Identifiers', testIdentifiers);
+  test('Composites', testComposites);
+  test('Units', testUnits);
+  test('Unicode', testUnicode);
+  test('Newer CSS', testNewerCss);
+  test('Media Queries', testMediaQueries);
+  test('Font-Face', testFontFace);
+  test('CSS file', testCssFile);
+  test('Compact Emitter', testCompactEmitter);
+  test('Selector Negation', testNotSelectors);
+  test('IE stuff', testIE);
+  test('IE declaration syntax', testIEDeclaration);
+  test('Hanging bugs', testHangs);
+}
diff --git a/mojo/public/dart/third_party/csslib/test/error_test.dart b/mojo/public/dart/third_party/csslib/test/error_test.dart
new file mode 100644
index 0000000..fc9ecf6
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/test/error_test.dart
@@ -0,0 +1,354 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library error_test;
+
+import 'package:csslib/src/messages.dart';
+import 'package:test/test.dart';
+
+import 'testing.dart';
+
+/**
+ * Test for unsupported font-weights values of bolder, lighter and inherit.
+ */
+void testUnsupportedFontWeights() {
+  var errors = [];
+
+  // TODO(terry): Need to support bolder.
+  // font-weight value bolder.
+  var input = ".foobar { font-weight: bolder; }";
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(errors.isEmpty, false);
+  expect(errors[0].toString(), r'''
+error on line 1, column 24: Unknown property value bolder
+.foobar { font-weight: bolder; }
+                       ^^^^^^''');
+  expect(stylesheet != null, true);
+
+  expect(prettyPrint(stylesheet), r'''
+.foobar {
+  font-weight: bolder;
+}''');
+
+  // TODO(terry): Need to support lighter.
+  // font-weight value lighter.
+  input = ".foobar { font-weight: lighter; }";
+  stylesheet = parseCss(input, errors: errors..clear());
+
+  expect(errors.isEmpty, false);
+  expect(errors[0].toString(), r'''
+error on line 1, column 24: Unknown property value lighter
+.foobar { font-weight: lighter; }
+                       ^^^^^^^''');
+  expect(stylesheet != null, true);
+  expect(prettyPrint(stylesheet), r'''
+.foobar {
+  font-weight: lighter;
+}''');
+
+  // TODO(terry): Need to support inherit.
+  // font-weight value inherit.
+  input = ".foobar { font-weight: inherit; }";
+  stylesheet = parseCss(input, errors: errors..clear());
+
+  expect(errors.isEmpty, false);
+  expect(errors[0].toString(), r'''
+error on line 1, column 24: Unknown property value inherit
+.foobar { font-weight: inherit; }
+                       ^^^^^^^''');
+  expect(stylesheet != null, true);
+  expect(prettyPrint(stylesheet), r'''
+.foobar {
+  font-weight: inherit;
+}''');
+}
+
+/**
+ * Test for unsupported line-height values of units other than px, pt and
+ * inherit.
+ */
+void testUnsupportedLineHeights() {
+  var errors = [];
+
+  // line-height value in percentge unit.
+  var input = ".foobar { line-height: 120%; }";
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(errors.isEmpty, false);
+  expect(errors[0].toString(), r'''
+error on line 1, column 24: Unexpected value for line-height
+.foobar { line-height: 120%; }
+                       ^^^''');
+  expect(stylesheet != null, true);
+  expect(prettyPrint(stylesheet), r'''
+.foobar {
+  line-height: 120%;
+}''');
+
+  // TODO(terry): Need to support all units.
+  // line-height value in cm unit.
+  input = ".foobar { line-height: 20cm; }";
+  stylesheet = parseCss(input, errors: errors..clear());
+
+  expect(errors.isEmpty, false);
+  expect(errors[0].toString(), r'''
+error on line 1, column 24: Unexpected unit for line-height
+.foobar { line-height: 20cm; }
+                       ^^''');
+  expect(stylesheet != null, true);
+  expect(prettyPrint(stylesheet), r'''
+.foobar {
+  line-height: 20cm;
+}''');
+
+  // TODO(terry): Need to support inherit.
+  // line-height value inherit.
+  input = ".foobar { line-height: inherit; }";
+  stylesheet = parseCss(input, errors: errors..clear());
+
+  expect(errors.isEmpty, false);
+  expect(errors[0].toString(), r'''
+error on line 1, column 24: Unknown property value inherit
+.foobar { line-height: inherit; }
+                       ^^^^^^^''');
+  expect(stylesheet != null, true);
+  expect(prettyPrint(stylesheet), r'''
+.foobar {
+  line-height: inherit;
+}''');
+}
+
+/** Test for bad selectors. */
+void testBadSelectors() {
+  var errors = [];
+
+  // Invalid id selector.
+  var input = "# foo { color: #ff00ff; }";
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(errors.isEmpty, false);
+  expect(errors[0].toString(), r'''
+error on line 1, column 1: Not a valid ID selector expected #id
+# foo { color: #ff00ff; }
+^''');
+  expect(stylesheet != null, true);
+  expect(prettyPrint(stylesheet), r'''
+# foo {
+  color: #f0f;
+}''');
+
+  // Invalid class selector.
+  input = ". foo { color: #ff00ff; }";
+  stylesheet = parseCss(input, errors: errors..clear());
+
+  expect(errors.isEmpty, false);
+  expect(errors[0].toString(), r'''
+error on line 1, column 1: Not a valid class selector expected .className
+. foo { color: #ff00ff; }
+^''');
+  expect(stylesheet != null, true);
+  expect(prettyPrint(stylesheet), r'''
+. foo {
+  color: #f0f;
+}''');
+}
+
+/** Test for bad hex values. */
+void testBadHexValues() {
+  var errors = [];
+
+  // Invalid hex value.
+  var input = ".foobar { color: #AH787; }";
+  var stylesheet = parseCss(input, errors: errors);
+
+  expect(errors.isEmpty, false);
+  expect(errors[0].toString(), r'''
+error on line 1, column 18: Bad hex number
+.foobar { color: #AH787; }
+                 ^^^^^^''');
+  expect(stylesheet != null, true);
+  expect(prettyPrint(stylesheet), r'''
+.foobar {
+  color: #AH787;
+}''');
+
+  // Bad color constant.
+  input = ".foobar { color: redder; }";
+  stylesheet = parseCss(input, errors: errors..clear());
+
+  expect(errors.isEmpty, false);
+  expect(errors[0].toString(), r'''
+error on line 1, column 18: Unknown property value redder
+.foobar { color: redder; }
+                 ^^^^^^''');
+
+  expect(stylesheet != null, true);
+  expect(prettyPrint(stylesheet), r'''
+.foobar {
+  color: redder;
+}''');
+
+  // Bad hex color #<space>ffffff.
+  input = ".foobar { color: # ffffff; }";
+  stylesheet = parseCss(input, errors: errors..clear());
+
+  expect(errors.isEmpty, false);
+  expect(errors[0].toString(), r'''
+error on line 1, column 18: Expected hex number
+.foobar { color: # ffffff; }
+                 ^''');
+
+  expect(stylesheet != null, true);
+  expect(prettyPrint(stylesheet), r'''
+.foobar {
+  color: # ffffff;
+}''');
+
+  // Bad hex color #<space>123fff.
+  input = ".foobar { color: # 123fff; }";
+  stylesheet = parseCss(input, errors: errors..clear());
+
+  expect(errors.isEmpty, false);
+  expect(errors[0].toString(), r'''
+error on line 1, column 18: Expected hex number
+.foobar { color: # 123fff; }
+                 ^''');
+
+  expect(stylesheet != null, true);
+
+  // Formating is off with an extra space.  However, the entire value is bad
+  // and isn't processed anyway.
+  expect(prettyPrint(stylesheet), r'''
+.foobar {
+  color: # 123 fff;
+}''');
+}
+
+void testBadUnicode() {
+  var errors = [];
+  final String input = '''
+@font-face {
+  src: url(fonts/BBCBengali.ttf) format("opentype");
+  unicode-range: U+400-200;
+}''';
+
+  parseCss(input, errors: errors);
+
+  expect(errors.isEmpty, false);
+  expect(errors[0].toString(),
+      'error on line 3, column 20: unicode first range can not be greater than '
+      'last\n'
+      '  unicode-range: U+400-200;\n'
+      '                   ^^^^^^^');
+
+  final String input2 = '''
+@font-face {
+  src: url(fonts/BBCBengali.ttf) format("opentype");
+  unicode-range: U+12FFFF;
+}''';
+
+  parseCss(input2, errors: errors..clear());
+
+  expect(errors.isEmpty, false);
+  expect(errors[0].toString(),
+      'error on line 3, column 20: unicode range must be less than 10FFFF\n'
+      '  unicode-range: U+12FFFF;\n'
+      '                   ^^^^^^');
+}
+
+void testBadNesting() {
+  var errors = [];
+
+  // Test for bad declaration in a nested rule.
+  final String input = '''
+div {
+  width: 20px;
+  span + ul { color: blue; }
+  span + ul > #aaaa {
+    color: #ffghghgh;
+  }
+  background-color: red;
+}
+''';
+
+  parseCss(input, errors: errors);
+  expect(errors.length, 1);
+  var errorMessage = messages.messages[0];
+  expect(errorMessage.message, contains('Bad hex number'));
+  expect(errorMessage.span, isNotNull);
+  expect(errorMessage.span.start.line, 4);
+  expect(errorMessage.span.start.column, 11);
+  expect(errorMessage.span.text, '#ffghghgh');
+
+  // Test for bad selector syntax.
+  final String input2 = '''
+div {
+  span + ul #aaaa > (3333)  {
+    color: #ffghghgh;
+  }
+}
+''';
+  parseCss(input2, errors: errors..clear());
+  expect(errors.length, 4);
+  errorMessage = messages.messages[0];
+  expect(errorMessage.message, contains(':, but found +'));
+  expect(errorMessage.span, isNotNull);
+  expect(errorMessage.span.start.line, 1);
+  expect(errorMessage.span.start.column, 7);
+  expect(errorMessage.span.text, '+');
+
+  errorMessage = messages.messages[1];
+  expect(errorMessage.message, contains('Unknown property value ul'));
+  expect(errorMessage.span, isNotNull);
+  expect(errorMessage.span.start.line, 1);
+  expect(errorMessage.span.start.column, 9);
+  expect(errorMessage.span.text, 'ul');
+
+  errorMessage = messages.messages[2];
+  expect(errorMessage.message, contains('expected }, but found >'));
+  expect(errorMessage.span, isNotNull);
+  expect(errorMessage.span.start.line, 1);
+  expect(errorMessage.span.start.column, 18);
+  expect(errorMessage.span.text, '>');
+
+  errorMessage = messages.messages[3];
+  expect(errorMessage.message, contains('premature end of file unknown CSS'));
+  expect(errorMessage.span, isNotNull);
+  expect(errorMessage.span.start.line, 1);
+  expect(errorMessage.span.start.column, 20);
+  expect(errorMessage.span.text, '(');
+
+  // Test for missing close braces and bad declaration.
+  final String input3 = '''
+div {
+  span {
+    color: #green;
+}
+''';
+  parseCss(input3, errors: errors..clear());
+  expect(errors.length, 2);
+  errorMessage = messages.messages[0];
+  expect(errorMessage.message, contains('Bad hex number'));
+  expect(errorMessage.span, isNotNull);
+  expect(errorMessage.span.start.line, 2);
+  expect(errorMessage.span.start.column, 11);
+  expect(errorMessage.span.text, '#green');
+
+  errorMessage = messages.messages[1];
+  expect(errorMessage.message, contains('expected }, but found end of file'));
+  expect(errorMessage.span, isNotNull);
+  expect(errorMessage.span.start.line, 3);
+  expect(errorMessage.span.start.column, 1);
+  expect(errorMessage.span.text, '\n');
+}
+
+main() {
+  test('font-weight value errors', testUnsupportedFontWeights);
+  test('line-height value errors', testUnsupportedLineHeights);
+  test('bad selectors', testBadSelectors);
+  test('bad Hex values', testBadHexValues);
+  test('bad unicode ranges', testBadUnicode);
+  test('nested rules', testBadNesting);
+}
diff --git a/mojo/public/dart/third_party/csslib/test/extend_test.dart b/mojo/public/dart/third_party/csslib/test/extend_test.dart
new file mode 100644
index 0000000..49c8a9c
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/test/extend_test.dart
@@ -0,0 +1,234 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library extend_test;
+
+import 'package:test/test.dart';
+
+import 'testing.dart';
+
+compileAndValidate(String input, String generated) {
+  var errors = [];
+  var stylesheet = compileCss(input, errors: errors, opts: options);
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+}
+
+void simpleExtend() {
+  compileAndValidate(r'''
+.error {
+  border: 1px red;
+  background-color: #fdd;
+}
+.seriousError {
+  @extend .error;
+  border-width: 3px;
+}
+''', r'''.error, .seriousError {
+  border: 1px #f00;
+  background-color: #fdd;
+}
+.seriousError {
+  border-width: 3px;
+}''');
+}
+
+void complexSelectors() {
+  compileAndValidate(r'''
+.error {
+  border: 1px #f00;
+  background-color: #fdd;
+}
+.error.intrusion {
+  background-image: url("/image/hacked.png");
+}
+.seriousError {
+  @extend .error;
+  border-width: 3px;
+}
+''', r'''.error, .seriousError {
+  border: 1px #f00;
+  background-color: #fdd;
+}
+.error.intrusion, .seriousError.intrusion {
+  background-image: url("/image/hacked.png");
+}
+.seriousError {
+  border-width: 3px;
+}''');
+
+  compileAndValidate(r'''
+a:hover {
+  text-decoration: underline;
+}
+.hoverlink {
+  @extend a:hover;
+}
+''', r'''a:hover, .hoverlink {
+  text-decoration: underline;
+}
+.hoverlink {
+}''');
+}
+
+void multipleExtends() {
+  compileAndValidate(r'''
+.error {
+  border: 1px #f00;
+  background-color: #fdd;
+}
+.attention {
+  font-size: 3em;
+  background-color: #ff0;
+}
+.seriousError {
+  @extend .error;
+  @extend .attention;
+  border-width: 3px;
+}
+''', r'''.error, .seriousError {
+  border: 1px #f00;
+  background-color: #fdd;
+}
+.attention, .seriousError {
+  font-size: 3em;
+  background-color: #ff0;
+}
+.seriousError {
+  border-width: 3px;
+}''');
+}
+
+void chaining() {
+  compileAndValidate(r'''
+.error {
+  border: 1px #f00;
+  background-color: #fdd;
+}
+.seriousError {
+  @extend .error;
+  border-width: 3px;
+}
+.criticalError {
+  @extend .seriousError;
+  position: fixed;
+  top: 10%;
+  bottom: 10%;
+  left: 10%;
+  right: 10%;
+}
+''', r'''.error, .seriousError, .criticalError {
+  border: 1px #f00;
+  background-color: #fdd;
+}
+.seriousError, .criticalError {
+  border-width: 3px;
+}
+.criticalError {
+  position: fixed;
+  top: 10%;
+  bottom: 10%;
+  left: 10%;
+  right: 10%;
+}''');
+}
+
+void nestedSelectors() {
+  compileAndValidate(r'''
+a {
+  color: blue;
+  &:hover {
+    text-decoration: underline;
+  }
+}
+
+#fake-links .link {
+  @extend a;
+}
+''', r'''a, #fake-links .link {
+  color: #00f;
+}
+a:hover, #fake-links .link:hover {
+  text-decoration: underline;
+}
+#fake-links .link {
+}''');
+}
+
+void nestedMulty() {
+  compileAndValidate(r'''
+.btn {
+  display: inline-block;
+}
+
+input[type="checkbox"].toggle-button {
+  color: red;
+
+  + label {
+    @extend .btn;
+  }
+}
+''', r'''.btn, input[type="checkbox"].toggle-button label {
+  display: inline-block;
+}
+input[type="checkbox"].toggle-button {
+  color: #f00;
+}
+input[type="checkbox"].toggle-button label {
+}''');
+}
+
+void nWayExtends() {
+  compileAndValidate(r'''
+.btn > .btn {
+  margin-left: 5px;
+}
+input.second + label {
+  @extend .btn;
+}
+''', '.btn > .btn, '
+      'input.second + label > .btn, '
+      '.btn > input.second + label, '
+      'input.second + label > input.second + label, '
+      'input.second + label > input.second + label {\n'
+      '  margin-left: 5px;\n}\n'
+      'input.second + label {\n'
+      '}');
+
+  // TODO(terry): Optimize merge selectors would be:
+  //
+  // .btn + .btn, input.second + label + .btn, input.second.btn + label {
+  //    margin-left: 5px;
+  //  }
+  //  input.second + label {
+  //    color: blue;
+  //  }
+  compileAndValidate(r'''
+.btn + .btn {
+  margin-left: 5px;
+}
+input.second + label {
+  @extend .btn;
+  color: blue;
+}
+''', '.btn + .btn, '
+      'input.second + label + .btn, '
+      '.btn + input.second + label, '
+      'input.second + label + input.second + label, '
+      'input.second + label + input.second + label {\n'
+      '  margin-left: 5px;\n}\n'
+      'input.second + label {\n'
+      '  color: #00f;\n}');
+}
+
+main() {
+  test("Simple Extend", simpleExtend);
+  test("complex", complexSelectors);
+  test("multiple", multipleExtends);
+  test("chaining", chaining);
+  test("nested selectors", nestedSelectors);
+  test("nested many selector sequences", nestedMulty);
+  test("N-way extends", nWayExtends);
+}
diff --git a/mojo/public/dart/third_party/csslib/test/mixin_test.dart b/mojo/public/dart/third_party/csslib/test/mixin_test.dart
new file mode 100644
index 0000000..c94c9c0
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/test/mixin_test.dart
@@ -0,0 +1,659 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library mixin_test;
+
+import 'package:test/test.dart';
+
+import 'testing.dart';
+
+compileAndValidate(String input, String generated) {
+  var errors = [];
+  var stylesheet = compileCss(input, errors: errors, opts: options);
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+}
+
+compilePolyfillAndValidate(String input, String generated) {
+  var errors = [];
+  var stylesheet = polyFillCompileCss(input, errors: errors, opts: options);
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+}
+
+void topLevelMixin() {
+  compileAndValidate(r'''
+@mixin silly-links {
+  a {
+    color: blue;
+    background-color: red;
+  }
+}
+
+@include silly-links;
+''', r'''a {
+  color: #00f;
+  background-color: #f00;
+}''');
+}
+
+void topLevelMixinTwoIncludes() {
+  compileAndValidate(r'''
+@mixin a {
+  a {
+    color: blue;
+    background-color: red;
+  }
+}
+@mixin b {
+  span {
+    color: black;
+    background-color: orange;
+  }
+}
+@include a;
+@include b;
+''', r'''a {
+  color: #00f;
+  background-color: #f00;
+}
+span {
+  color: #000;
+  background-color: #ffa500;
+}''');
+}
+
+/** Tests top-level mixins that includes another mixin. */
+void topLevelMixinMultiRulesets() {
+  compileAndValidate(r'''
+@mixin a {
+  a {
+    color: blue;
+    background-color: red;
+  }
+}
+@mixin b {
+  #foo-id {
+    border-top: 1px solid red;
+    border-bottom: 2px solid green;
+  }
+}
+@mixin c {
+  span {
+    color: black;
+    background-color: orange;
+  }
+  @include b;
+}
+@include a;
+@include c;
+''', r'''a {
+  color: #00f;
+  background-color: #f00;
+}
+span {
+  color: #000;
+  background-color: #ffa500;
+}
+#foo-id {
+  border-top: 1px solid #f00;
+  border-bottom: 2px solid #008000;
+}''');
+}
+
+void topLevelMixinDeeplyNestedRulesets() {
+  compileAndValidate(r'''
+@mixin a {
+  a {
+    color: blue;
+    background-color: red;
+  }
+}
+@mixin b {
+  #foo-id {
+    border-top: 1px solid red;
+    border-bottom: 2px solid green;
+  }
+}
+@mixin f {
+  #split-bar div {
+    border: 1px solid lightgray;
+  }
+}
+@mixin e {
+  #split-bar:visited {
+    color: gray;
+  }
+  @include f;
+}
+@mixin d {
+  a:hover {
+    cursor: arrow;
+  }
+  @include e
+}
+@mixin c {
+  @include a;
+  span {
+    color: black;
+    background-color: orange;
+  }
+  @include b;
+  @include d;
+}
+@include c;
+''', r'''a {
+  color: #00f;
+  background-color: #f00;
+}
+span {
+  color: #000;
+  background-color: #ffa500;
+}
+#foo-id {
+  border-top: 1px solid #f00;
+  border-bottom: 2px solid #008000;
+}
+a:hover {
+  cursor: arrow;
+}
+#split-bar:visited {
+  color: #808080;
+}
+#split-bar div {
+  border: 1px solid #d3d3d3;
+}''');
+}
+
+/** Tests selector groups and other combinators. */
+void topLevelMixinSelectors() {
+  compileAndValidate(r'''
+@mixin a {
+  a, b {
+    color: blue;
+    background-color: red;
+  }
+  div > span {
+    color: black;
+    background-color: orange;
+  }
+}
+
+@include a;
+''', r'''a, b {
+  color: #00f;
+  background-color: #f00;
+}
+div > span {
+  color: #000;
+  background-color: #ffa500;
+}''');
+}
+
+void declSimpleMixin() {
+  compileAndValidate(r'''
+@mixin div-border {
+  border: 2px dashed red;
+}
+div {
+  @include div-border;
+}
+''', r'''div {
+  border: 2px dashed #f00;
+}''');
+}
+
+void declMixinTwoIncludes() {
+  compileAndValidate(r'''
+@mixin div-border {
+  border: 2px dashed red;
+}
+@mixin div-color {
+  color: blue;
+}
+div {
+  @include div-border;
+  @include div-color;
+}
+''', r'''div {
+  border: 2px dashed #f00;
+  color: #00f;
+}''');
+}
+
+void declMixinNestedIncludes() {
+  compileAndValidate(r'''
+@mixin div-border {
+  border: 2px dashed red;
+}
+@mixin div-padding {
+  padding: .5em;
+}
+@mixin div-margin {
+  margin: 5px;
+}
+@mixin div-color {
+  @include div-padding;
+  color: blue;
+  @include div-margin;
+}
+div {
+  @include div-border;
+  @include div-color;
+}
+''', r'''div {
+  border: 2px dashed #f00;
+  padding: .5em;
+  color: #00f;
+  margin: 5px;
+}''');
+}
+
+void declMixinDeeperNestedIncludes() {
+  compileAndValidate(r'''
+@mixin div-border {
+  border: 2px dashed red;
+}
+@mixin div-padding {
+  padding: .5em;
+}
+@mixin div-margin {
+  margin: 5px;
+}
+@mixin div-color {
+  @include div-padding;
+  @include div-margin;
+}
+div {
+  @include div-border;
+  @include div-color;
+}
+''', r'''div {
+  border: 2px dashed #f00;
+  padding: .5em;
+  margin: 5px;
+}''');
+}
+
+void mixinArg() {
+  compileAndValidate(r'''
+@mixin div-border-1 {
+  border: 2px dashed red;
+}
+@mixin div-border-2() {
+  border: 22px solid blue;
+}
+@mixin div-left(@dist) {
+  margin-left: @dist;
+}
+@mixin div-right(var-margin) {
+  margin-right: var(margin);
+}
+div-1 {
+  @include div-left(10px);
+  @include div-right(100px);
+  @include div-border-1;
+}
+div-2 {
+  @include div-left(20em);
+  @include div-right(5in);
+  @include div-border-2();
+}
+div-3 {
+  @include div-border-1();
+}
+div-4 {
+  @include div-border-2;
+}
+''', r'''div-1 {
+  margin-left: 10px;
+  margin-right: 100px;
+  border: 2px dashed #f00;
+}
+div-2 {
+  margin-left: 20em;
+  margin-right: 5in;
+  border: 22px solid #00f;
+}
+div-3 {
+  border: 2px dashed #f00;
+}
+div-4 {
+  border: 22px solid #00f;
+}''');
+}
+
+void mixinArgs() {
+  compileAndValidate(r'''
+@mixin box-shadow(@shadows...) {
+  -moz-box-shadow: @shadows;
+  -webkit-box-shadow: @shadows;
+  box-shadow: var(shadows);
+}
+
+.shadows {
+  @include box-shadow(0px 4px 5px #666, 2px 6px 10px #999);
+}''', r'''
+.shadowed {
+  -moz-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
+  -webkit-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
+  box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
+}
+''');
+}
+
+void mixinManyArgs() {
+  compileAndValidate(r'''
+@mixin border(@border-values) {
+  border: @border-values
+}
+
+.primary {
+  @include border(3px solid green);
+}
+''', r'''
+.primary {
+  border: 3px solid #008000;
+}''');
+
+  compileAndValidate(r'''
+@mixin setup(@border-color, @border-style, @border-size, @color) {
+  border: @border-size @border-style @border-color;
+  color: @color;
+}
+
+.primary {
+  @include setup(red, solid, 5px, blue);
+}
+''', r'''
+.primary {
+  border: 5px solid #f00;
+  color: #00f;
+}''');
+
+  // Test passing a declaration that is multiple parameters.
+  compileAndValidate(r'''
+@mixin colors(@text, @background, @border) {
+  color: @text;
+  background-color: @background;
+  border-color: @border;
+}
+
+@values: #ff0000, #00ff00, #0000ff;
+.primary {
+  @include colors(@values);
+}
+''', r'''var-values: #f00, #0f0, #00f;
+
+.primary {
+  color: #f00;
+  background-color: #0f0;
+  border-color: #00f;
+}''');
+
+  compilePolyfillAndValidate(r'''
+@mixin colors(@text, @background, @border) {
+  color: @text;
+  background-color: @background;
+  border-color: @border;
+}
+
+@values: #ff0000, #00ff00, #0000ff;
+.primary {
+  @include colors(@values);
+}
+''', r'''.primary {
+  color: #f00;
+  background-color: #0f0;
+  border-color: #00f;
+}''');
+}
+
+void badDeclarationInclude() {
+  final errors = [];
+  final input = r'''
+@mixin a {
+  #foo-id {
+    color: red;
+  }
+}
+@mixin b {
+  span {
+    border: 2px dashed red;
+    @include a;
+  }
+}
+@include b;
+''';
+
+  var stylesheet = compileCss(input, errors: errors, opts: options);
+
+  expect(stylesheet != null, true);
+  expect(errors.isNotEmpty, true);
+  expect(errors.length, 1, reason: errors.toString());
+  var error = errors[0];
+  expect(error.message, 'Using top-level mixin a as a declaration');
+  expect(error.span.start.line, 8);
+  expect(error.span.end.offset, 105);
+}
+
+void badTopInclude() {
+  final errors = [];
+  final input = r'''
+@mixin b {
+  color: red;
+}
+
+@mixin a {
+  span {
+    border: 2px dashed red;
+  }
+  @include b;
+}
+
+@include a;
+  ''';
+
+  var stylesheet = compileCss(input, errors: errors, opts: options);
+  expect(stylesheet != null, true);
+  expect(errors.length, 1, reason: errors.toString());
+  var error = errors[0];
+  expect(error.message, 'Using declaration mixin b as top-level mixin');
+  expect(error.span.start.line, 8);
+  expect(error.span.end.offset, 90);
+}
+
+void emptyMixin() {
+  final errors = [];
+  final input = r'''
+@mixin a {
+}
+@mixin b {
+  border: 2px dashed red;
+  @include a;
+}
+div {
+  @include b;
+}
+  ''';
+
+  var generated = r'''div {
+  border: 2px dashed #f00;
+}''';
+
+  var stylesheet = compileCss(input, errors: errors, opts: options);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+}
+
+void undefinedTopLevel() {
+  final errors = [];
+  final input = r'''
+@mixin a {
+  @include b;
+}
+@mixin b {
+  span {
+    border: 2px dashed red;
+  }
+  @include a;
+}
+
+@include b;
+
+  ''';
+
+  var stylesheet = compileCss(input, errors: errors, opts: options);
+
+  expect(stylesheet != null, true);
+  expect(errors.isNotEmpty, true);
+  expect(errors.length, 1, reason: errors.toString());
+  var error = errors[0];
+  expect(error.message, 'Undefined mixin b');
+  expect(error.span.start.line, 1);
+  expect(error.span.start.offset, 14);
+}
+
+void undefinedDeclaration() {
+  final errors = [];
+  final input = r'''
+@mixin a {
+  @include b;
+}
+@mixin b {
+  border: 2px dashed red;
+  @include a;
+}
+div {
+  @include b;
+}
+  ''';
+
+  var stylesheet = compileCss(input, errors: errors, opts: options);
+
+  expect(stylesheet != null, true);
+  expect(errors.isNotEmpty, true);
+  expect(errors.length, 1, reason: errors.toString());
+  var error = errors[0];
+  expect(error.message, 'Undefined mixin b');
+  expect(error.span.start.line, 1);
+  expect(error.span.start.offset, 14);
+}
+
+void includeGrammar() {
+  compileAndValidate(r'''
+@mixin a {
+  foo { color: red }
+}
+
+@mixin b {
+  @include a;
+  @include a;
+}
+
+@include b;
+''', r'''foo {
+  color: #f00;
+}
+foo {
+  color: #f00;
+}''');
+
+  compileAndValidate(r'''
+@mixin a {
+  color: red
+}
+
+foo {
+  @include a;
+  @include a
+}
+''', r'''foo {
+  color: #f00;
+  color: #f00;
+}''');
+
+  var errors = [];
+  var input = r'''
+@mixin a {
+  foo { color: red }
+}
+
+@mixin b {
+  @include a
+  @include a
+}
+
+@include b
+''';
+
+  var stylesheet = compileCss(input, errors: errors, opts: options);
+
+  expect(stylesheet != null, true);
+
+  expect(errors.isNotEmpty, true);
+  expect(errors.length, 6, reason: errors.toString());
+  var error = errors[0];
+  expect(error.message, 'parsing error expected ;');
+  expect(error.span.start.line, 6);
+  expect(error.span.end.offset, 69);
+  error = errors[1];
+  expect(error.message, 'expected :, but found }');
+  expect(error.span.start.line, 7);
+  expect(error.span.end.offset, 73);
+  error = errors[2];
+  expect(error.message, 'parsing error expected }');
+  expect(error.span.start.line, 9);
+  expect(error.span.end.offset, 83);
+  error = errors[3];
+  expect(error.message, 'expected {, but found end of file()');
+  expect(error.span.start.line, 9);
+  expect(error.span.end.offset, 86);
+  error = errors[4];
+  expect(error.message, 'expected }, but found end of file()');
+  expect(error.span.start.line, 10);
+  expect(error.span.end.offset, 86);
+  error = errors[5];
+  expect(error.message, 'Using top-level mixin a as a declaration');
+  expect(error.span.start.line, 5);
+  expect(error.span.end.offset, 56);
+}
+
+main() {
+  group('Basic mixin', () {
+    test('include grammar', includeGrammar);
+    test('empty mixin content', emptyMixin);
+  });
+
+  group('Top-level mixin', () {
+    test('simple mixin', topLevelMixin);
+    test('mixin with two @includes', topLevelMixinTwoIncludes);
+    test('multi rulesets', topLevelMixinMultiRulesets);
+    test('multi rulesets and nesting', topLevelMixinDeeplyNestedRulesets);
+    test('selector groups', topLevelMixinSelectors);
+  });
+
+  group('Declaration mixin', () {
+    test('simple', declSimpleMixin);
+    test('with two @includes', declMixinTwoIncludes);
+    test('with includes', declMixinNestedIncludes);
+    test('with deeper nesting', declMixinDeeperNestedIncludes);
+  });
+
+  group('Mixin arguments', () {
+    test('simple arg', mixinArg);
+    test('multiple args and var decls as args', mixinManyArgs);
+  });
+
+  group('Mixin warnings', () {
+    test('undefined top-level', undefinedTopLevel);
+    test('undefined declaration', undefinedDeclaration);
+    test('detect bad top-level as declaration', badDeclarationInclude);
+    test('detect bad declaration as top-level', badTopInclude);
+  });
+}
diff --git a/mojo/public/dart/third_party/csslib/test/nested_test.dart b/mojo/public/dart/third_party/csslib/test/nested_test.dart
new file mode 100644
index 0000000..1848ef1
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/test/nested_test.dart
@@ -0,0 +1,631 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library nested_test;
+
+import 'package:test/test.dart';
+
+import 'testing.dart';
+
+compileAndValidate(String input, String generated) {
+  var errors = [];
+  var stylesheet = compileCss(input, errors: errors, opts: simpleOptions);
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+}
+
+selectorVariations() {
+  final input1 = r'''html { color: red; }''';
+  final generated1 = r'''html {
+  color: #f00;
+}''';
+  compileAndValidate(input1, generated1);
+
+  final input2 = r'''button { span { height: 200 } }''';
+  final generated2 = r'''button {
+}
+button span {
+  height: 200;
+}''';
+  compileAndValidate(input2, generated2);
+
+  final input3 = r'''div { color: red; } button { span { height: 200 } }''';
+  final generated3 = r'''div {
+  color: #f00;
+}
+button {
+}
+button span {
+  height: 200;
+}''';
+  compileAndValidate(input3, generated3);
+
+  final input4 = r'''#header { color: red; h1 { font-size: 26px; } }''';
+  final generated4 = r'''#header {
+  color: #f00;
+}
+#header h1 {
+  font-size: 26px;
+}''';
+  compileAndValidate(input4, generated4);
+
+  final input5 = r'''
+#header {
+  color: red;
+  h1 { font-size: 26px; }
+  background-color: blue;
+}''';
+  final generated5 = r'''#header {
+  color: #f00;
+  background-color: #00f;
+}
+#header h1 {
+  font-size: 26px;
+}''';
+  compileAndValidate(input5, generated5);
+
+  final input6 = r'''html { body {color: red; }}''';
+  final generated6 = r'''html {
+}
+html body {
+  color: #f00;
+}''';
+  compileAndValidate(input6, generated6);
+
+  final input7 = r'''html body {color: red; }''';
+  final generated7 = r'''html body {
+  color: #f00;
+}''';
+  compileAndValidate(input7, generated7);
+
+  final input8 = r'''
+html, body { color: red; }
+button { height: 200 }
+body { width: 300px; }''';
+  final generated8 = r'''html, body {
+  color: #f00;
+}
+button {
+  height: 200;
+}
+body {
+  width: 300px;
+}''';
+  compileAndValidate(input8, generated8);
+
+  final input9 = '''
+html, body {
+  color: red;
+  button { height: 200 }
+  div { width: 300px; }
+}''';
+  final generated9 = r'''html, body {
+  color: #f00;
+}
+html button, body button {
+  height: 200;
+}
+html div, body div {
+  width: 300px;
+}''';
+  compileAndValidate(input9, generated9);
+
+  final input10 = '''
+html {
+  color: red;
+  button, div { height: 200 }
+  body { width: 300px; }
+}''';
+  final generated10 = r'''html {
+  color: #f00;
+}
+html button, html div {
+  height: 200;
+}
+html body {
+  width: 300px;
+}''';
+  compileAndValidate(input10, generated10);
+
+  final input11 = '''
+html, body {
+  color: red;
+  button, div { height: 200 }
+  table { width: 300px; }
+}''';
+  final generated11 = r'''html, body {
+  color: #f00;
+}
+html button, body button, html div, body div {
+  height: 200;
+}
+html table, body table {
+  width: 300px;
+}''';
+  compileAndValidate(input11, generated11);
+
+  final input12 = '''
+html, body {
+  color: red;
+  button, div {
+    span, a, ul { height: 200 }
+  }
+  table { width: 300px; }
+}''';
+  final generated12 = r'''html, body {
+  color: #f00;
+}
+'''
+      'html button span, body button span, html div span, body div span, '
+      'html button a, body button a, html div a, body div a, html button ul, '
+      r'''body button ul, html div ul, body div ul {
+  height: 200;
+}
+html table, body table {
+  width: 300px;
+}''';
+  compileAndValidate(input12, generated12);
+
+  final input13 = r'''
+#header {
+  div {
+  width: 100px;
+  a { height: 200px; }
+  }
+  color: blue;
+}
+span { color: #1f1f1f; }
+''';
+  final generated13 = r'''#header {
+  color: #00f;
+}
+#header div {
+  width: 100px;
+}
+#header div a {
+  height: 200px;
+}
+span {
+  color: #1f1f1f;
+}''';
+  compileAndValidate(input13, generated13);
+}
+
+void simpleNest() {
+  final input = '''
+div span { color: green; }
+#header {
+  color: red;
+  h1 {
+    font-size: 26px;
+    font-weight: bold;
+  }
+  p {
+    font-size: 12px;
+    a {
+      text-decoration: none;
+    }
+  }
+  background-color: blue;
+}
+div > span[attr="foo"] { color: yellow; }
+''';
+
+  final generated = r'''div span {
+  color: #008000;
+}
+#header {
+  color: #f00;
+  background-color: #00f;
+}
+#header h1 {
+  font-size: 26px;
+  font-weight: bold;
+}
+#header p {
+  font-size: 12px;
+}
+#header p a {
+  text-decoration: none;
+}
+div > span[attr="foo"] {
+  color: #ff0;
+}''';
+  compileAndValidate(input, generated);
+}
+
+void complexNest() {
+  final input = '''
+@font-face  { font-family: arial; }
+div { color: #f0f0f0; }
+#header + div {
+  color: url(abc.png);
+  *[attr="bar"] {
+    font-size: 26px;
+    font-weight: bold;
+  }
+  p~ul {
+    font-size: 12px;
+    :not(p) {
+      text-decoration: none;
+      div > span[attr="foo"] { color: yellow; }
+    }
+  }
+  background-color: blue;
+  span {
+    color: red;
+    .one { color: blue; }
+    .two { color: green; }
+    .three { color: yellow; }
+    .four {
+       .four-1 { background-color: #00000f; }
+       .four-2 { background-color: #0000ff; }
+       .four-3 { background-color: #000fff; }
+       .four-4 {
+         height: 44px;
+         .four-4-1 { height: 10px; }
+         .four-4-2 { height: 20px; }
+         .four-4-3 { height: 30px; }
+         width: 44px;
+       }
+    }
+  }
+}
+span { color: #1f1f2f; }
+''';
+
+  final generated = r'''@font-face  {
+  font-family: arial;
+}
+div {
+  color: #f0f0f0;
+}
+#header + div {
+  color: url("abc.png");
+  background-color: #00f;
+}
+#header + div *[attr="bar"] {
+  font-size: 26px;
+  font-weight: bold;
+}
+#header + div p ~ ul {
+  font-size: 12px;
+}
+#header + div p ~ ul :not(p) {
+  text-decoration: none;
+}
+#header + div p ~ ul :not(p) div > span[attr="foo"] {
+  color: #ff0;
+}
+#header + div span {
+  color: #f00;
+}
+#header + div span .one {
+  color: #00f;
+}
+#header + div span .two {
+  color: #008000;
+}
+#header + div span .three {
+  color: #ff0;
+}
+#header + div span .four .four-1 {
+  background-color: #00000f;
+}
+#header + div span .four .four-2 {
+  background-color: #00f;
+}
+#header + div span .four .four-3 {
+  background-color: #000fff;
+}
+#header + div span .four .four-4 {
+  height: 44px;
+  width: 44px;
+}
+#header + div span .four .four-4 .four-4-1 {
+  height: 10px;
+}
+#header + div span .four .four-4 .four-4-2 {
+  height: 20px;
+}
+#header + div span .four .four-4 .four-4-3 {
+  height: 30px;
+}
+span {
+  color: #1f1f2f;
+}''';
+
+  compileAndValidate(input, generated);
+}
+
+void mediaNesting() {
+  final input = r'''
+@media screen and (-webkit-min-device-pixel-ratio:0) {
+  #toggle-all {
+    image: url(test.jpb);
+    div, table {
+      background: none;
+      a { width: 100px; }
+    }
+    color: red;
+  }
+}
+''';
+  final generated = r'''@media screen AND (-webkit-min-device-pixel-ratio:0) {
+#toggle-all {
+  image: url("test.jpb");
+  color: #f00;
+}
+#toggle-all div, #toggle-all table {
+  background: none;
+}
+#toggle-all div a, #toggle-all table a {
+  width: 100px;
+}
+}''';
+
+  compileAndValidate(input, generated);
+}
+
+void simpleThis() {
+  final input = '''#header {
+  h1 {
+    font-size: 26px;
+    font-weight: bold;
+  }
+  p { font-size: 12px;
+    a { text-decoration: none;
+      &:hover { border-width: 1px }
+    }
+  }
+}
+''';
+
+  final generated = r'''#header {
+}
+#header h1 {
+  font-size: 26px;
+  font-weight: bold;
+}
+#header p {
+  font-size: 12px;
+}
+#header p a {
+  text-decoration: none;
+}
+#header p a:hover {
+  border-width: 1px;
+}''';
+
+  compileAndValidate(input, generated);
+}
+
+void complexThis() {
+  final input1 = r'''
+.light {
+  .leftCol {
+    .textLink {
+      color: fooL1;
+      &:hover { color: barL1;}
+    }
+    .picLink {
+      background-image: url(/fooL1.jpg);
+      &:hover { background-image: url(/barL1.jpg);}
+    }
+    .textWithIconLink {
+      color: fooL2;
+      background-image: url(/fooL2.jpg);
+      &:hover { color: barL2; background-image: url(/barL2.jpg);}
+    }
+  }
+}''';
+
+  final generated1 = r'''.light {
+}
+.light .leftCol .textLink {
+  color: fooL1;
+}
+.light .leftCol .textLink:hover {
+  color: barL1;
+}
+.light .leftCol .picLink {
+  background-image: url("/fooL1.jpg");
+}
+.light .leftCol .picLink:hover {
+  background-image: url("/barL1.jpg");
+}
+.light .leftCol .textWithIconLink {
+  color: fooL2;
+  background-image: url("/fooL2.jpg");
+}
+.light .leftCol .textWithIconLink:hover {
+  color: barL2;
+  background-image: url("/barL2.jpg");
+}''';
+
+  compileAndValidate(input1, generated1);
+
+  final input2 = r'''
+.textLink {
+  .light .leftCol & {
+    color: fooL1;
+    &:hover { color: barL1; }
+  }
+  .light .rightCol & {
+    color: fooL3;
+    &:hover { color: barL3; }
+  }
+}''';
+
+  final generated2 = r'''
+.textLink {
+}
+.light .leftCol .textLink {
+  color: fooL1;
+}
+.light .leftCol .textLink:hover {
+  color: barL1;
+}
+.light .rightCol .textLink {
+  color: fooL3;
+}
+.light .rightCol .textLink:hover {
+  color: barL3;
+}''';
+
+  compileAndValidate(input2, generated2);
+}
+
+variationsThis() {
+  final input1 = r'''
+.textLink {
+  a {
+    light .leftCol & {
+      color: red;
+    }
+  }
+}''';
+  final generated1 = r'''.textLink {
+}
+light .leftCol .textLink a {
+  color: #f00;
+}''';
+
+  compileAndValidate(input1, generated1);
+
+  final input2 = r'''.textLink {
+  a {
+    & light .leftCol & {
+      color: red;
+    }
+  }
+}''';
+  final generated2 = r'''.textLink {
+}
+.textLink a light .leftCol .textLink a {
+  color: #f00;
+}''';
+  compileAndValidate(input2, generated2);
+
+  final input3 = r'''
+.textLink {
+  a {
+    & light .leftCol { color: red; }
+  }
+}''';
+  final generated3 = r'''.textLink {
+}
+.textLink a light .leftCol {
+  color: #f00;
+}''';
+  compileAndValidate(input3, generated3);
+
+  final input4 = r'''
+.textLink {
+  a {
+    & light .leftCol { color: red; }
+    &:hover { width: 100px; }
+  }
+}''';
+  final generated4 = r'''.textLink {
+}
+.textLink a light .leftCol {
+  color: #f00;
+}
+.textLink a:hover {
+  width: 100px;
+}''';
+  compileAndValidate(input4, generated4);
+
+  final input5 = r'''.textLink { a { &:hover { color: red; } } }''';
+  final generated5 = r'''.textLink {
+}
+.textLink a:hover {
+  color: #f00;
+}''';
+
+  compileAndValidate(input5, generated5);
+
+  final input6 = r'''.textLink { &:hover { color: red; } }''';
+  final generated6 = r'''.textLink {
+}
+.textLink:hover {
+  color: #f00;
+}''';
+  compileAndValidate(input6, generated6);
+
+  final input7 = r'''.textLink { a { & + & { color: red; } } }''';
+  final generated7 = r'''.textLink {
+}
+.textLink a + .textLink a {
+  color: #f00;
+}''';
+  compileAndValidate(input7, generated7);
+
+  final input8 = r'''.textLink { a { & { color: red; } } }''';
+  final generated8 = r'''.textLink {
+}
+.textLink a {
+  color: #f00;
+}''';
+  compileAndValidate(input8, generated8);
+
+  final input9 = r'''.textLink { a { & ~ & { color: red; } } }''';
+  final generated9 = r'''.textLink {
+}
+.textLink a ~ .textLink a {
+  color: #f00;
+}''';
+  compileAndValidate(input9, generated9);
+
+  final input10 = r'''.textLink { a { & & { color: red; } } }''';
+  final generated10 = r'''.textLink {
+}
+.textLink a .textLink a {
+  color: #f00;
+}''';
+  compileAndValidate(input10, generated10);
+}
+
+thisCombinator() {
+  var input = r'''
+.btn {
+  color: red;
+}
+.btn + .btn {
+  margin-left: 5px;
+}
+input.second {
+  & + label {
+    color: blue;
+  }
+}
+''';
+
+  var generated = r'''.btn {
+  color: #f00;
+}
+.btn + .btn {
+  margin-left: 5px;
+}
+input.second {
+}
+input.second + label {
+  color: #00f;
+}''';
+
+  compileAndValidate(input, generated);
+}
+
+main() {
+  test('Selector and Nested Variations', selectorVariations);
+  test('Simple nesting', simpleNest);
+  test('Complex nesting', complexNest);
+  test('@media nesting', mediaNesting);
+  test('Simple &', simpleThis);
+  test("Variations &", variationsThis);
+  test('Complex &', complexThis);
+  test('& with + selector', thisCombinator);
+}
diff --git a/mojo/public/dart/third_party/csslib/test/selector_test.dart b/mojo/public/dart/third_party/csslib/test/selector_test.dart
new file mode 100644
index 0000000..aefab16
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/test/selector_test.dart
@@ -0,0 +1,68 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library selector_test;
+
+import 'package:csslib/parser.dart';
+import 'package:test/test.dart';
+
+import 'testing.dart';
+
+void testSelectorSuccesses() {
+  var errors = [];
+  var selectorAst = selector('#div .foo', errors: errors);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect('#div .foo', compactOuptut(selectorAst));
+
+  // Valid selectors for class names.
+  selectorAst = selector('.foo', errors: errors..clear());
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect('.foo', compactOuptut(selectorAst));
+
+  selectorAst = selector('.foobar .xyzzy', errors: errors..clear());
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect('.foobar .xyzzy', compactOuptut(selectorAst));
+
+  selectorAst = selector('.foobar .a-story .xyzzy', errors: errors..clear());
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect('.foobar .a-story .xyzzy', compactOuptut(selectorAst));
+
+  selectorAst =
+      selector('.foobar .xyzzy .a-story .b-story', errors: errors..clear());
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect('.foobar .xyzzy .a-story .b-story', compactOuptut(selectorAst));
+
+  // Valid selectors for element IDs.
+  selectorAst = selector('#id1', errors: errors..clear());
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect('#id1', compactOuptut(selectorAst));
+
+  selectorAst = selector('#id-number-3', errors: errors..clear());
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect('#id-number-3', compactOuptut(selectorAst));
+
+  selectorAst = selector('#_privateId', errors: errors..clear());
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect('#_privateId', compactOuptut(selectorAst));
+}
+
+// TODO(terry): Move this failure case to a failure_test.dart when the analyzer
+//              and validator exit then they'll be a bunch more checks.
+void testSelectorFailures() {
+  var errors = [];
+
+  // Test for invalid class name (can't start with number).
+  selector('.foobar .1a-story .xyzzy', errors: errors);
+  expect(errors.isEmpty, false);
+  expect(errors[0].toString(),
+      'error on line 1, column 9: name must start with a alpha character, but '
+      'found a number\n'
+      '.foobar .1a-story .xyzzy\n'
+      '        ^^');
+}
+
+main() {
+  test('Valid Selectors', testSelectorSuccesses);
+  test('Invalid Selectors', testSelectorFailures);
+}
diff --git a/mojo/public/dart/third_party/csslib/test/testing.dart b/mojo/public/dart/third_party/csslib/test/testing.dart
new file mode 100644
index 0000000..de2aab1
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/test/testing.dart
@@ -0,0 +1,86 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/** Common definitions used for setting up the test environment. */
+library testing;
+
+import 'package:csslib/parser.dart';
+import 'package:csslib/visitor.dart';
+import 'package:csslib/src/messages.dart';
+import 'package:csslib/src/options.dart';
+
+export 'package:csslib/src/options.dart';
+
+const simpleOptionsWithCheckedAndWarningsAsErrors = const PreprocessorOptions(
+    useColors: false,
+    checked: true,
+    warningsAsErrors: true,
+    inputFile: 'memory');
+
+const simpleOptions =
+    const PreprocessorOptions(useColors: false, inputFile: 'memory');
+
+const options = const PreprocessorOptions(
+    useColors: false, warningsAsErrors: true, inputFile: 'memory');
+
+/**
+ * Spin-up CSS parser in checked mode to detect any problematic CSS.  Normally,
+ * CSS will allow any property/value pairs regardless of validity; all of our
+ * tests (by default) will ensure that the CSS is really valid.
+ */
+StyleSheet parseCss(String cssInput,
+    {List<Message> errors, PreprocessorOptions opts}) => parse(cssInput,
+        errors: errors,
+        options: opts == null
+            ? simpleOptionsWithCheckedAndWarningsAsErrors
+            : opts);
+
+/**
+ * Spin-up CSS parser in checked mode to detect any problematic CSS.  Normally,
+ * CSS will allow any property/value pairs regardless of validity; all of our
+ * tests (by default) will ensure that the CSS is really valid.
+ */
+StyleSheet compileCss(String cssInput, {List<Message> errors,
+    PreprocessorOptions opts, bool polyfill: false,
+    List<StyleSheet> includes: null}) => compile(cssInput,
+        errors: errors,
+        options: opts == null
+            ? simpleOptionsWithCheckedAndWarningsAsErrors
+            : opts,
+        polyfill: polyfill,
+        includes: includes);
+
+StyleSheet polyFillCompileCss(input,
+        {List<Message> errors, PreprocessorOptions opts}) =>
+    compileCss(input, errors: errors, polyfill: true, opts: opts);
+
+/** CSS emitter walks the style sheet tree and emits readable CSS. */
+final _emitCss = new CssPrinter();
+
+/** Simple Visitor does nothing but walk tree. */
+final _cssVisitor = new Visitor();
+
+/** Pretty printer for CSS. */
+String prettyPrint(StyleSheet ss) {
+  // Walk the tree testing basic Vistor class.
+  walkTree(ss);
+  return (_emitCss..visitTree(ss, pretty: true)).toString();
+}
+
+/**
+ * Helper function to emit compact (non-pretty printed) CSS for suite test
+ * comparsions.  Spaces, new lines, etc. are reduced for easier comparsions of
+ * expected suite test results.
+ */
+String compactOuptut(StyleSheet ss) {
+  walkTree(ss);
+  return (_emitCss..visitTree(ss, pretty: false)).toString();
+}
+
+/** Walks the style sheet tree does nothing; insures the basic walker works. */
+void walkTree(StyleSheet ss) {
+  _cssVisitor..visitTree(ss);
+}
+
+String dumpTree(StyleSheet ss) => treeToDebugString(ss);
diff --git a/mojo/public/dart/third_party/csslib/test/var_test.dart b/mojo/public/dart/third_party/csslib/test/var_test.dart
new file mode 100644
index 0000000..d47fd78
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/test/var_test.dart
@@ -0,0 +1,924 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library var_test;
+
+import 'package:test/test.dart';
+
+import 'testing.dart';
+
+compileAndValidate(String input, String generated) {
+  var errors = [];
+  var stylesheet = compileCss(input, errors: errors, opts: options);
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+}
+
+compilePolyfillAndValidate(String input, String generated) {
+  var errors = [];
+  var stylesheet = polyFillCompileCss(input, errors: errors, opts: options);
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+}
+
+void simpleVar() {
+  final input = ''':root {
+  var-color-background: red;
+  var-color-foreground: blue;
+
+  var-c: #00ff00;
+  var-b: var(c);
+  var-a: var(b);
+}
+.testIt {
+  color: var(color-foreground);
+  background: var(color-background);
+}
+''';
+
+  final generated = ''':root {
+  var-color-background: #f00;
+  var-color-foreground: #00f;
+  var-c: #0f0;
+  var-b: var(c);
+  var-a: var(b);
+}
+.testIt {
+  color: var(color-foreground);
+  background: var(color-background);
+}''';
+
+  final generatedPolyfill = ''':root {
+}
+.testIt {
+  color: #00f;
+  background: #f00;
+}''';
+
+  compileAndValidate(input, generated);
+  compilePolyfillAndValidate(input, generatedPolyfill);
+}
+
+void expressionsVar() {
+  final input = ''':root {
+  var-color-background: red;
+  var-color-foreground: blue;
+
+  var-c: #00ff00;
+  var-b: var(c);
+  var-a: var(b);
+
+  var-image: url(test.png);
+
+  var-b-width: 20cm;
+  var-m-width: 33%;
+  var-b-height: 30EM;
+  var-width: .6in;
+  var-length: 1.2in;
+  var-web-stuff: -10Px;
+  var-rgba: rgba(10,20,255);
+  var-transition: color 0.4s;
+  var-transform: rotate(20deg);
+  var-content: "✔";
+  var-text-shadow: 0 -1px 0 #bfbfbf;
+  var-font-family: Gentium;
+  var-src: url("http://example.com/fonts/Gentium.ttf");
+  var-src-1: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf");
+  var-unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
+  var-unicode-range-1: U+0A-FF, U+980-9FF, U+????, U+3???;
+  var-grid-columns: 10px ("content" 1fr 10px) [4];
+}
+
+.testIt {
+  color: var(color-foreground);
+  background: var(c);
+  background-image: var(image);
+
+  border-width: var(b-width);
+  margin-width: var(m-width);
+  border-height: var(b-height);
+  width: var(width);
+  length: var(length);
+  -web-stuff: var(web-stuff);
+  background-color: var(rgba);
+
+  transition: var(transition);
+  transform: var(transform);
+  content: var(content);
+  text-shadow: var(text-shadow);
+}
+
+@font-face {
+  font-family: var(font-family);
+  src: var(src);
+  unicode-range: var(unicode-range);
+}
+
+@font-face {
+  font-family: var(font-family);
+  src: var(src-1);
+  unicode-range: var(unicode-range-1);
+}
+
+.foobar {
+    grid-columns: var(grid-columns);
+}
+''';
+
+  final generated = ''':root {
+  var-color-background: #f00;
+  var-color-foreground: #00f;
+  var-c: #0f0;
+  var-b: var(c);
+  var-a: var(b);
+  var-image: url("test.png");
+  var-b-width: 20cm;
+  var-m-width: 33%;
+  var-b-height: 30em;
+  var-width: .6in;
+  var-length: 1.2in;
+  var-web-stuff: -10px;
+  var-rgba: rgba(10, 20, 255);
+  var-transition: color 0.4s;
+  var-transform: rotate(20deg);
+  var-content: "✔";
+  var-text-shadow: 0 -1px 0 #bfbfbf;
+  var-font-family: Gentium;
+  var-src: url("http://example.com/fonts/Gentium.ttf");
+  var-src-1: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf");
+  var-unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
+  var-unicode-range-1: U+0A-FF, U+980-9FF, U+????, U+3???;
+  var-grid-columns: 10px ("content" 1fr 10px) [4];
+}
+.testIt {
+  color: var(color-foreground);
+  background: var(c);
+  background-image: var(image);
+  border-width: var(b-width);
+  margin-width: var(m-width);
+  border-height: var(b-height);
+  width: var(width);
+  length: var(length);
+  -web-stuff: var(web-stuff);
+  background-color: var(rgba);
+  transition: var(transition);
+  transform: var(transform);
+  content: var(content);
+  text-shadow: var(text-shadow);
+}
+@font-face  {
+  font-family: var(font-family);
+  src: var(src);
+  unicode-range: var(unicode-range);
+}
+@font-face  {
+  font-family: var(font-family);
+  src: var(src-1);
+  unicode-range: var(unicode-range-1);
+}
+.foobar {
+  grid-columns: var(grid-columns);
+}''';
+
+  compileAndValidate(input, generated);
+
+  var generatedPolyfill = r''':root {
+}
+.testIt {
+  color: #00f;
+  background: #0f0;
+  background-image: url("test.png");
+  border-width: 20cm;
+  margin-width: 33%;
+  border-height: 30em;
+  width: .6in;
+  length: 1.2in;
+  -web-stuff: -10px;
+  background-color: rgba(10, 20, 255);
+  transition: color 0.4s;
+  transform: rotate(20deg);
+  content: "✔";
+  text-shadow: 0 -1px 0 #bfbfbf;
+}
+@font-face  {
+  font-family: Gentium;
+  src: url("http://example.com/fonts/Gentium.ttf");
+  unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
+}
+@font-face  {
+  font-family: Gentium;
+  src: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf");
+  unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???;
+}
+.foobar {
+  grid-columns: 10px ("content" 1fr 10px) [4];
+}''';
+
+  compilePolyfillAndValidate(input, generatedPolyfill);
+}
+
+void defaultVar() {
+  final input = '''
+:root {
+  var-color-background: red;
+  var-color-foreground: blue;
+
+  var-a: var(b, #0a0);
+  var-b: var(c, #0b0);
+  var-c: #00ff00;
+
+  var-image: url(test.png);
+
+  var-b-width: 20cm;
+  var-m-width: 33%;
+  var-b-height: 30EM;
+}
+
+.test {
+  background-color: var(test, orange);
+}
+
+body {
+  background: var(a) var(image) no-repeat right top;
+}
+
+div {
+  background: var(color-background) url('img_tree.png') no-repeat right top;
+}
+
+.test-2 {
+  background: var(color-background) var(image-2, url('img_1.png'))
+              no-repeat right top;
+}
+
+.test-3 {
+  background: var(color-background) var(image) no-repeat right top;
+}
+
+.test-4 {
+  background: #ffff00 var(image) no-repeat right top;
+}
+
+.test-5 {
+  background: var(test-color, var(a)) var(image) no-repeat right top;
+}
+
+.test-6 {
+  border: red var(a-1, solid 20px);
+}
+''';
+
+  final generated = ''':root {
+  var-color-background: #f00;
+  var-color-foreground: #00f;
+  var-a: var(b, #0a0);
+  var-b: var(c, #0b0);
+  var-c: #0f0;
+  var-image: url("test.png");
+  var-b-width: 20cm;
+  var-m-width: 33%;
+  var-b-height: 30em;
+}
+.test {
+  background-color: var(test, #ffa500);
+}
+body {
+  background: var(a) var(image) no-repeat right top;
+}
+div {
+  background: var(color-background) url("img_tree.png") no-repeat right top;
+}
+.test-2 {
+  background: var(color-background) var(image-2, url("img_1.png")) no-repeat right top;
+}
+.test-3 {
+  background: var(color-background) var(image) no-repeat right top;
+}
+.test-4 {
+  background: #ff0 var(image) no-repeat right top;
+}
+.test-5 {
+  background: var(test-color, var(a)) var(image) no-repeat right top;
+}
+.test-6 {
+  border: #f00 var(a-1, solid 20px);
+}''';
+
+  compileAndValidate(input, generated);
+
+  var generatedPolyfill = r''':root {
+}
+.test {
+  background-color: #ffa500;
+}
+body {
+  background: #0a0 url("test.png") no-repeat right top;
+}
+div {
+  background: #f00 url("img_tree.png") no-repeat right top;
+}
+.test-2 {
+  background: #f00 url("img_1.png") no-repeat right top;
+}
+.test-3 {
+  background: #f00 url("test.png") no-repeat right top;
+}
+.test-4 {
+  background: #ff0 url("test.png") no-repeat right top;
+}
+.test-5 {
+  background: #0a0 url("test.png") no-repeat right top;
+}
+.test-6 {
+  border: #f00 solid 20px;
+}''';
+
+  compilePolyfillAndValidate(input, generatedPolyfill);
+}
+
+void undefinedVars() {
+  final errors = [];
+  final input = ''':root {
+  var-color-background: red;
+  var-color-foreground: blue;
+
+  var-a: var(b);
+  var-b: var(c);
+  var-c: #00ff00;
+
+  var-one: var(two);
+  var-two: var(one);
+
+  var-four: var(five);
+  var-five: var(six);
+  var-six: var(four);
+
+  var-def-1: var(def-2);
+  var-def-2: var(def-3);
+  var-def-3: var(def-2);
+}
+
+.testIt {
+  color: var(color-foreground);
+  background: var(color-background);
+}
+.test-1 {
+  color: var(c);
+}
+.test-2 {
+  color: var(one);
+  background: var(six);
+}
+''';
+
+  final generatedPolyfill = ''':root {
+}
+.testIt {
+  color: #00f;
+  background: #f00;
+}
+.test-1 {
+  color: #0f0;
+}
+.test-2 {
+  color: ;
+  background: ;
+}''';
+
+  var errorStrings = [
+    'error on line 5, column 14: Variable is not defined.\n'
+        '  var-a: var(b);\n'
+        '             ^^',
+    'error on line 6, column 14: Variable is not defined.\n'
+        '  var-b: var(c);\n'
+        '             ^^',
+    'error on line 9, column 16: Variable is not defined.\n'
+        '  var-one: var(two);\n'
+        '               ^^^^',
+    'error on line 12, column 17: Variable is not defined.\n'
+        '  var-four: var(five);\n'
+        '                ^^^^^',
+    'error on line 13, column 17: Variable is not defined.\n'
+        '  var-five: var(six);\n'
+        '                ^^^^',
+    'error on line 16, column 18: Variable is not defined.\n'
+        '  var-def-1: var(def-2);\n'
+        '                 ^^^^^^',
+    'error on line 17, column 18: Variable is not defined.\n'
+        '  var-def-2: var(def-3);\n'
+        '                 ^^^^^^',
+  ];
+
+  var generated = r''':root {
+  var-color-background: #f00;
+  var-color-foreground: #00f;
+  var-a: var(b);
+  var-b: var(c);
+  var-c: #0f0;
+  var-one: var(two);
+  var-two: var(one);
+  var-four: var(five);
+  var-five: var(six);
+  var-six: var(four);
+  var-def-1: var(def-2);
+  var-def-2: var(def-3);
+  var-def-3: var(def-2);
+}
+.testIt {
+  color: var(color-foreground);
+  background: var(color-background);
+}
+.test-1 {
+  color: var(c);
+}
+.test-2 {
+  color: var(one);
+  background: var(six);
+}''';
+  int testBitMap = 0;
+
+  compileAndValidate(input, generated);
+
+  var stylesheet =
+      polyFillCompileCss(input, errors: errors..clear(), opts: options);
+
+  expect(stylesheet != null, true);
+
+  expect(errors.length, errorStrings.length, reason: errors.toString());
+  testBitMap = 0;
+
+  outer: for (var error in errors) {
+    var errorString = error.toString();
+    for (int i = 0; i < errorStrings.length; i++) {
+      if (errorString == errorStrings[i]) {
+        testBitMap |= 1 << i;
+        continue outer;
+      }
+    }
+    fail("Unexpected error string: $errorString");
+  }
+  expect(testBitMap, equals((1 << errorStrings.length) - 1));
+  expect(prettyPrint(stylesheet), generatedPolyfill);
+}
+
+parserVar() {
+  final input = ''':root {
+  var-color-background: red;
+  var-color-foreground: blue;
+
+  var-c: #00ff00;
+  var-b: var(c);
+  var-a: var(b);
+
+  var-image: url(test.png);
+
+  var-b-width: 20cm;
+  var-m-width: 33%;
+  var-b-height: 30EM;
+  var-width: .6in;
+  var-length: 1.2in;
+  var-web-stuff: -10Px;
+  var-rgba: rgba(10,20,255);
+  var-transition: color 0.4s;
+  var-transform: rotate(20deg);
+  var-content: "✔";
+  var-text-shadow: 0 -1px 0 #bfbfbf;
+  var-font-family: Gentium;
+  var-src: url("http://example.com/fonts/Gentium.ttf");
+  var-src-1: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf");
+  var-unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
+  var-unicode-range-1: U+0A-FF, U+980-9FF, U+????, U+3???;
+  var-grid-columns: 10px ("content" 1fr 10px) [4];
+}
+
+.testIt {
+  color: var(color-foreground);
+  background: var(c);
+  background-image: var(image);
+
+  border-width: var(b-width);
+  margin-width: var(m-width);
+  border-height: var(b-height);
+  width: var(width);
+  length: var(length);
+  -web-stuff: var(web-stuff);
+  background-color: var(rgba);
+
+  transition: var(transition);
+  transform: var(transform);
+  content: var(content);
+  text-shadow: var(text-shadow);
+}
+
+@font-face {
+  font-family: var(font-family);
+  src: var(src);
+  unicode-range: var(unicode-range);
+}
+
+@font-face {
+  font-family: var(font-family);
+  src: var(src-1);
+  unicode-range: var(unicode-range-1);
+}
+
+.foobar {
+    grid-columns: var(grid-columns);
+}
+''';
+
+  final generated = ''':root {
+  var-color-background: #f00;
+  var-color-foreground: #00f;
+  var-c: #0f0;
+  var-b: var(c);
+  var-a: var(b);
+  var-image: url("test.png");
+  var-b-width: 20cm;
+  var-m-width: 33%;
+  var-b-height: 30em;
+  var-width: .6in;
+  var-length: 1.2in;
+  var-web-stuff: -10px;
+  var-rgba: rgba(10, 20, 255);
+  var-transition: color 0.4s;
+  var-transform: rotate(20deg);
+  var-content: "✔";
+  var-text-shadow: 0 -1px 0 #bfbfbf;
+  var-font-family: Gentium;
+  var-src: url("http://example.com/fonts/Gentium.ttf");
+  var-src-1: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf");
+  var-unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
+  var-unicode-range-1: U+0A-FF, U+980-9FF, U+????, U+3???;
+  var-grid-columns: 10px ("content" 1fr 10px) [4];
+}
+.testIt {
+  color: var(color-foreground);
+  background: var(c);
+  background-image: var(image);
+  border-width: var(b-width);
+  margin-width: var(m-width);
+  border-height: var(b-height);
+  width: var(width);
+  length: var(length);
+  -web-stuff: var(web-stuff);
+  background-color: var(rgba);
+  transition: var(transition);
+  transform: var(transform);
+  content: var(content);
+  text-shadow: var(text-shadow);
+}
+@font-face  {
+  font-family: var(font-family);
+  src: var(src);
+  unicode-range: var(unicode-range);
+}
+@font-face  {
+  font-family: var(font-family);
+  src: var(src-1);
+  unicode-range: var(unicode-range-1);
+}
+.foobar {
+  grid-columns: var(grid-columns);
+}''';
+
+  compileAndValidate(input, generated);
+
+  var generatedPolyfill = r''':root {
+}
+.testIt {
+  color: #00f;
+  background: #0f0;
+  background-image: url("test.png");
+  border-width: 20cm;
+  margin-width: 33%;
+  border-height: 30em;
+  width: .6in;
+  length: 1.2in;
+  -web-stuff: -10px;
+  background-color: rgba(10, 20, 255);
+  transition: color 0.4s;
+  transform: rotate(20deg);
+  content: "✔";
+  text-shadow: 0 -1px 0 #bfbfbf;
+}
+@font-face  {
+  font-family: Gentium;
+  src: url("http://example.com/fonts/Gentium.ttf");
+  unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
+}
+@font-face  {
+  font-family: Gentium;
+  src: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf");
+  unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???;
+}
+.foobar {
+  grid-columns: 10px ("content" 1fr 10px) [4];
+}''';
+  compilePolyfillAndValidate(input, generatedPolyfill);
+}
+
+testVar() {
+  final errors = [];
+  final input = '''
+@color-background: red;
+@color-foreground: blue;
+
+.test {
+  background-color: var(color-background);
+  color: var(color-foreground);
+}
+''';
+  final generated = '''
+var-color-background: #f00;
+var-color-foreground: #00f;
+
+.test {
+  background-color: var(color-background);
+  color: var(color-foreground);
+}''';
+
+  var stylesheet = parseCss(input, errors: errors, opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+
+  compileAndValidate(input, generated);
+
+  final input2 = '''
+@color-background: red;
+@color-foreground: blue;
+
+.test {
+  background-color: @color-background;
+  color: @color-foreground;
+}
+''';
+  final generated2 = '''var-color-background: #f00;
+var-color-foreground: #00f;
+
+.test {
+  background-color: var(color-background);
+  color: var(color-foreground);
+}''';
+
+  stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated2);
+
+  compileAndValidate(input2, generated2);
+}
+
+testLess() {
+  final errors = [];
+  final input = '''
+@color-background: red;
+@color-foreground: blue;
+
+.test {
+  background-color: var(color-background);
+  color: var(color-foreground);
+}
+''';
+  final generated = '''var-color-background: #f00;
+var-color-foreground: #00f;
+
+.test {
+  background-color: var(color-background);
+  color: var(color-foreground);
+}''';
+
+  var stylesheet = parseCss(input, errors: errors, opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated);
+
+  compileAndValidate(input, generated);
+
+  final input2 = '''
+@color-background: red;
+@color-foreground: blue;
+
+.test {
+  background-color: @color-background;
+  color: @color-foreground;
+}
+''';
+  final generated2 = '''var-color-background: #f00;
+var-color-foreground: #00f;
+
+.test {
+  background-color: var(color-background);
+  color: var(color-foreground);
+}''';
+
+  stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions);
+
+  expect(stylesheet != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet), generated2);
+
+  compileAndValidate(input2, generated2);
+}
+
+void polyfill() {
+  compilePolyfillAndValidate(r'''
+@color-background: red;
+@color-foreground: blue;
+.test {
+  background-color: @color-background;
+  color: @color-foreground;
+}''', r'''.test {
+  background-color: #f00;
+  color: #00f;
+}''');
+}
+
+void testIndirects() {
+  compilePolyfillAndValidate('''
+:root {
+  var-redef: #0f0;
+
+  var-a1: #fff;
+  var-a2: var(a1);
+  var-a3: var(a2);
+
+  var-redef: #000;
+}
+.test {
+  background-color: @a1;
+  color: @a2;
+  border-color: @a3;
+}
+.test-1 {
+  color: @redef;
+}''', r''':root {
+}
+.test {
+  background-color: #fff;
+  color: #fff;
+  border-color: #fff;
+}
+.test-1 {
+  color: #000;
+}''');
+}
+
+void includes() {
+  var errors = [];
+  var file1Input = r'''
+:root {
+  var-redef: #0f0;
+
+  var-a1: #fff;
+  var-a2: var(a1);
+  var-a3: var(a2);
+
+  var-redef: #000;
+}
+.test-1 {
+  background-color: @a1;
+  color: @a2;
+  border-color: @a3;
+}
+.test-1a {
+  color: @redef;
+}
+''';
+
+  var file2Input = r'''
+:root {
+  var-redef: #0b0;
+  var-b3: var(a3);
+}
+.test-2 {
+  color: var(b3);
+  background-color: var(redef);
+  border-color: var(a3);
+}
+''';
+
+  var input = r'''
+:root {
+  var-redef: #0c0;
+}
+.test-main {
+  color: var(b3);
+  background-color: var(redef);
+  border-color: var(a3);
+}
+''';
+
+  var generated1 = r''':root {
+  var-redef: #0f0;
+  var-a1: #fff;
+  var-a2: var(a1);
+  var-a3: var(a2);
+  var-redef: #000;
+}
+.test-1 {
+  background-color: var(a1);
+  color: var(a2);
+  border-color: var(a3);
+}
+.test-1a {
+  color: var(redef);
+}''';
+
+  var stylesheet1 = compileCss(file1Input, errors: errors, opts: options);
+  expect(stylesheet1 != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet1), generated1);
+
+  var generated2 = r''':root {
+  var-redef: #0b0;
+  var-b3: var(a3);
+}
+.test-2 {
+  color: var(b3);
+  background-color: var(redef);
+  border-color: var(a3);
+}''';
+
+  var stylesheet2 = compileCss(file2Input,
+      includes: [stylesheet1], errors: errors..clear(), opts: options);
+  expect(stylesheet2 != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheet2), generated2);
+
+  var generatedPolyfill1 = r''':root {
+}
+.test-1 {
+  background-color: #fff;
+  color: #fff;
+  border-color: #fff;
+}
+.test-1a {
+  color: #000;
+}''';
+  var styleSheet1Polyfill = compileCss(file1Input,
+      errors: errors..clear(), polyfill: true, opts: options);
+  expect(styleSheet1Polyfill != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(styleSheet1Polyfill), generatedPolyfill1);
+
+  var generatedPolyfill2 = r''':root {
+}
+.test-2 {
+  color: #fff;
+  background-color: #0b0;
+  border-color: #fff;
+}''';
+  var styleSheet2Polyfill = compileCss(file2Input,
+      includes: [stylesheet1],
+      errors: errors..clear(),
+      polyfill: true,
+      opts: options);
+  expect(styleSheet2Polyfill != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(styleSheet2Polyfill), generatedPolyfill2);
+
+  // Make sure includes didn't change.
+  expect(prettyPrint(stylesheet1), generated1);
+
+  var generatedPolyfill = r''':root {
+}
+.test-main {
+  color: #fff;
+  background-color: #0c0;
+  border-color: #fff;
+}''';
+  var stylesheetPolyfill = compileCss(input,
+      includes: [stylesheet1, stylesheet2],
+      errors: errors..clear(),
+      polyfill: true,
+      opts: options);
+
+  expect(stylesheetPolyfill != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+  expect(prettyPrint(stylesheetPolyfill), generatedPolyfill);
+
+  // Make sure includes didn't change.
+  expect(prettyPrint(stylesheet1), generated1);
+  expect(prettyPrint(stylesheet2), generated2);
+}
+
+main() {
+  test('Simple var', simpleVar);
+  test('Expressions var', expressionsVar);
+  test('Default value in var()', defaultVar);
+  test('CSS Parser only var', parserVar);
+  test('Var syntax', testVar);
+  test('Indirects', testIndirects);
+  test('Forward Refs', undefinedVars);
+  test('Less syntax', testLess);
+  test('Polyfill', polyfill);
+  test('Multi-file', includes);
+}
diff --git a/mojo/public/dart/third_party/csslib/test/visitor_test.dart b/mojo/public/dart/third_party/csslib/test/visitor_test.dart
new file mode 100644
index 0000000..803b106
--- /dev/null
+++ b/mojo/public/dart/third_party/csslib/test/visitor_test.dart
@@ -0,0 +1,113 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library visitor_test;
+
+import 'package:csslib/visitor.dart';
+import 'package:test/test.dart';
+
+import 'testing.dart';
+
+class ClassVisitor extends Visitor {
+  final List expectedClasses;
+  final Set<String> foundClasses = new Set();
+
+  ClassVisitor(this.expectedClasses);
+
+  void visitClassSelector(ClassSelector node) {
+    foundClasses.add(node.name);
+  }
+
+  bool get matches {
+    bool match = true;
+    foundClasses.forEach((value) {
+      match = match && expectedClasses.contains(value);
+    });
+    expectedClasses.forEach((value) {
+      match = match && foundClasses.contains(value);
+    });
+
+    return match;
+  }
+}
+
+void testClassVisitors() {
+  var errors = [];
+  var in1 = '.foobar { }';
+
+  var s = parseCss(in1, errors: errors);
+
+  expect(s != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+
+  var clsVisits = new ClassVisitor(['foobar'])..visitTree(s);
+  expect(clsVisits.matches, true);
+
+  in1 = '''
+      .foobar1 { }
+      .xyzzy .foo #my-div { color: red; }
+      div.hello { font: arial; }
+    ''';
+
+  s = parseCss(in1, errors: errors..clear(), opts: simpleOptions);
+
+  expect(s != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+
+  clsVisits = new ClassVisitor(['foobar1', 'xyzzy', 'foo', 'hello'])
+    ..visitTree(s);
+  expect(clsVisits.matches, true);
+
+  expect(prettyPrint(s), r'''
+.foobar1 {
+}
+.xyzzy .foo #my-div {
+  color: #f00;
+}
+div.hello {
+  font: arial;
+}''');
+}
+
+class PolyfillEmitter extends CssPrinter {
+  final String _prefix;
+
+  PolyfillEmitter(this._prefix);
+
+  void visitClassSelector(ClassSelector node) {
+    emit('.${_prefix}_${node.name}');
+  }
+}
+
+String polyfillPrint(String prefix, StyleSheet ss) =>
+    (new PolyfillEmitter(prefix)..visitTree(ss, pretty: true)).toString();
+
+void testPolyFill() {
+  var errors = [];
+  final input = r'''
+.foobar { }
+div.xyzzy { }
+#foo .foo .bar .foobar { }
+''';
+
+  final generated = r'''
+.myComponent_foobar {
+}
+div.myComponent_xyzzy {
+}
+#foo .myComponent_foo .myComponent_bar .myComponent_foobar {
+}''';
+
+  var s = parseCss(input, errors: errors);
+  expect(s != null, true);
+  expect(errors.isEmpty, true, reason: errors.toString());
+
+  final emitted = polyfillPrint('myComponent', s);
+  expect(emitted, generated);
+}
+
+main() {
+  test('Class Visitors', testClassVisitors);
+  test('Polyfill', testPolyFill);
+}
diff --git a/mojo/public/dart/third_party/glob/.gitignore b/mojo/public/dart/third_party/glob/.gitignore
new file mode 100644
index 0000000..7dbf035
--- /dev/null
+++ b/mojo/public/dart/third_party/glob/.gitignore
@@ -0,0 +1,15 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.pub/
+build/
+packages
+.packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/glob/.test_config b/mojo/public/dart/third_party/glob/.test_config
new file mode 100644
index 0000000..531426a
--- /dev/null
+++ b/mojo/public/dart/third_party/glob/.test_config
@@ -0,0 +1,5 @@
+{
+  "test_package": {
+    "platforms": ["vm"]
+  }
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/glob/CHANGELOG.md b/mojo/public/dart/third_party/glob/CHANGELOG.md
new file mode 100644
index 0000000..f8c00bc
--- /dev/null
+++ b/mojo/public/dart/third_party/glob/CHANGELOG.md
@@ -0,0 +1,25 @@
+## 1.0.5
+
+* Narrow the dependency on `path`. Previously, this allowed versions that didn't
+  support all the functionality this package needs.
+
+* Upgrade to the new test runner.
+
+## 1.0.4
+
+* Added overlooked `collection` dependency.
+
+## 1.0.3
+
+* Fix a bug where `Glob.list()` and `Glob.listSync()` would incorrectly throw
+  exceptions when a directory didn't exist on the filesystem.
+
+## 1.0.2
+
+* Fixed `Glob.list()` on Windows.
+
+## 1.0.1
+
+* Fix several analyzer warnings.
+
+* Fix the tests on Windows.
diff --git a/mojo/public/dart/third_party/glob/LICENSE b/mojo/public/dart/third_party/glob/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/mojo/public/dart/third_party/glob/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/glob/README.md b/mojo/public/dart/third_party/glob/README.md
new file mode 100644
index 0000000..5091a1e
--- /dev/null
+++ b/mojo/public/dart/third_party/glob/README.md
@@ -0,0 +1,124 @@
+`glob` is a file and directory globbing library that supports both checking
+whether a path matches a glob and listing all entities that match a glob.
+
+A "glob" is a pattern designed specifically to match files and directories. Most
+shells support globs natively.
+
+## Usage
+
+To construct a glob, just use `new Glob()`. As with `RegExp`s, it's a good idea
+to keep around a glob if you'll be using it more than once so that it doesn't
+have to be compiled over and over. You can check whether a path matches the glob
+using `Glob.matches()`:
+
+```dart
+import 'package:glob/glob.dart';
+
+final dartFile = new Glob("**.dart");
+
+// Print all command-line arguments that are Dart files.
+void main(List<String> arguments) {
+  for (var argument in arguments) {
+    if (dartFile.matches(argument)) print(argument);
+  }
+}
+```
+
+You can also list all files that match a glob using `Glob.list()` or
+`Glob.listSync()`:
+
+```dart
+import 'package:glob/glob.dart';
+
+final dartFile = new Glob("**.dart");
+
+// Recursively list all Dart files in the current directory.
+void main(List<String> arguments) {
+  for (var entity in dartFile.listSync()) {
+    print(entity.path);
+  }
+}
+```
+
+## Syntax
+
+The glob syntax hews closely to the widely-known Bash glob syntax, with a few
+exceptions that are outlined below.
+
+In order to be as cross-platform and as close to the Bash syntax as possible,
+all globs use POSIX path syntax, including using `/` as a directory separator
+regardless of which platform they're on. This is true even for Windows roots;
+for example, a glob matching all files in the C drive would be `C:/*`.
+
+### Match any characters in a filename: `*`
+
+The `*` character matches zero or more of any character other than `/`. This
+means that it can be used to match all files in a given directory that match a
+pattern without also matching files in a subdirectory. For example, `lib/*.dart`
+will match `lib/glob.dart` but not `lib/src/utils.dart`.
+
+### Match any characters across directories: `**`
+
+`**` is like `*`, but matches `/` as well. It's useful for matching files or
+listing directories recursively. For example, `lib/**.dart` will match both
+`lib/glob.dart` and `lib/src/utils.dart`.
+
+If `**` appears at the beginning of a glob, it won't match absolute paths or
+paths beginning with `../`. For example, `**.dart` won't match `/foo.dart`,
+although `/**.dart` will. This is to ensure that listing a bunch of paths and
+checking whether they match a glob produces the same results as listing that
+glob. In the previous example, `/foo.dart` wouldn't be listed for `**.dart`, so
+it shouldn't be matched by it either.
+
+This is an extension to Bash glob syntax that's widely supported by other glob
+implementations.
+
+### Match any single character: `?`
+
+The `?` character matches a single character other than `/`. Unlike `*`, it
+won't match any more or fewer than one character. For example, `test?.dart` will
+match `test1.dart` but not `test10.dart` or `test.dart`.
+
+### Match a range of characters: `[...]`
+
+The `[...]` construction matches one of several characters. It can contain
+individual characters, such as `[abc]`, in which case it will match any of those
+characters; it can contain ranges, such as `[a-zA-Z]`, in which case it will
+match any characters that fall within the range; or it can contain a mix of
+both. It will only ever match a single character. For example,
+`test[a-zA-Z_].dart` will match `testx.dart`, `testA.dart`, and `test_.dart`,
+but not `test-.dart`.
+
+If it starts with `^` or `!`, the construction will instead match all characters
+*not* mentioned. For example, `test[^a-z].dart` will match `test1.dart` but not
+`testa.dart`.
+
+This construction never matches `/`.
+
+### Match one of several possibilities: `{...,...}`
+
+The `{...,...}` construction matches one of several options, each of which is a
+glob itself. For example, `lib/{*.dart,src/*}` matches `lib/glob.dart` and
+`lib/src/data.txt`. It can contain any number of options greater than one, and
+can even contain nested options.
+
+This is an extension to Bash glob syntax, although it is supported by other
+layers of Bash and is often used in conjunction with globs.
+
+### Escaping a character: `\`
+
+The `\` character can be used in any context to escape a character that would
+otherwise be semantically meaningful. For example, `\*.dart` matches `*.dart`
+but not `test.dart`.
+
+### Syntax errors
+
+Because they're used as part of the shell, almost all strings are valid Bash
+globs. This implementation is more picky, and performs some validation to ensure
+that globs are meaningful. For instance, unclosed `{` and `[` are disallowed.
+
+### Reserved syntax: `(...)`
+
+Parentheses are reserved in case this package adds support for Bash extended
+globbing in the future. For the time being, using them will throw an error
+unless they're escaped.
diff --git a/mojo/public/dart/third_party/glob/codereview.settings b/mojo/public/dart/third_party/glob/codereview.settings
new file mode 100644
index 0000000..88a854a
--- /dev/null
+++ b/mojo/public/dart/third_party/glob/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: http://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/glob/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/glob/lib/glob.dart b/mojo/public/dart/third_party/glob/lib/glob.dart
new file mode 100644
index 0000000..2d2a83f
--- /dev/null
+++ b/mojo/public/dart/third_party/glob/lib/glob.dart
@@ -0,0 +1,179 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library glob;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+
+import 'src/ast.dart';
+import 'src/list_tree.dart';
+import 'src/parser.dart';
+import 'src/utils.dart';
+
+/// Regular expression used to quote globs.
+final _quoteRegExp = new RegExp(r'[*{[?\\}\],\-()]');
+
+/// A glob for matching and listing files and directories.
+///
+/// A glob matches an entire string as a path. Although the glob pattern uses
+/// POSIX syntax, it can match against POSIX, Windows, or URL paths. The format
+/// it expects paths to use is based on the `context` parameter to [new Glob];
+/// it defaults to the current system's syntax.
+///
+/// Paths are normalized before being matched against a glob, so for example the
+/// glob `foo/bar` matches the path `foo/./bar`. A relative glob can match an
+/// absolute path and vice versa; globs and paths are both interpreted as
+/// relative to `context.current`, which defaults to the current working
+/// directory.
+///
+/// When used as a [Pattern], a glob will return either one or zero matches for
+/// a string depending on whether the entire string matches the glob. These
+/// matches don't currently have capture groups, although this may change in the
+/// future.
+class Glob implements Pattern {
+  /// The pattern used to create this glob.
+  final String pattern;
+
+  /// The context in which paths matched against this glob are interpreted.
+  final p.Context context;
+
+  /// If true, a path matches if it matches the glob itself or is recursively
+  /// contained within a directory that matches.
+  final bool recursive;
+
+  /// The parsed AST of the glob.
+  final AstNode _ast;
+
+  ListTree _listTree;
+
+  /// Whether [context]'s current directory is absolute.
+  bool get _contextIsAbsolute {
+    if (_contextIsAbsoluteCache == null) {
+      _contextIsAbsoluteCache = context.isAbsolute(context.current);
+    }
+    return _contextIsAbsoluteCache;
+  }
+  bool _contextIsAbsoluteCache;
+
+  /// Whether [pattern] could match absolute paths.
+  bool get _patternCanMatchAbsolute {
+    if (_patternCanMatchAbsoluteCache == null) {
+      _patternCanMatchAbsoluteCache = _ast.canMatchAbsolute;
+    }
+    return _patternCanMatchAbsoluteCache;
+  }
+  bool _patternCanMatchAbsoluteCache;
+
+  /// Whether [pattern] could match relative paths.
+  bool get _patternCanMatchRelative {
+    if (_patternCanMatchRelativeCache == null) {
+      _patternCanMatchRelativeCache = _ast.canMatchRelative;
+    }
+    return _patternCanMatchRelativeCache;
+  }
+  bool _patternCanMatchRelativeCache;
+
+  /// Returns [contents] with characters that are meaningful in globs
+  /// backslash-escaped.
+  static String quote(String contents) =>
+      contents.replaceAllMapped(_quoteRegExp, (match) => '\\${match[0]}');
+
+  /// Creates a new glob with [pattern].
+  ///
+  /// Paths matched against the glob are interpreted according to [context]. It
+  /// defaults to the system context.
+  ///
+  /// If [recursive] is true, this glob will match and list not only the files
+  /// and directories it explicitly lists, but anything beneath those as well.
+  Glob(String pattern, {p.Context context, bool recursive: false})
+      : this._(
+          pattern,
+          context == null ? p.context : context,
+          recursive);
+
+  // Internal constructor used to fake local variables for [context] and [ast].
+  Glob._(String pattern, p.Context context, bool recursive)
+      : pattern = pattern,
+        context = context,
+        recursive = recursive,
+        _ast = new Parser(pattern + (recursive ? "{,/**}" : ""), context)
+            .parse();
+
+  /// Lists all [FileSystemEntity]s beneath [root] that match the glob.
+  ///
+  /// This works much like [Directory.list], but it only lists directories that
+  /// could contain entities that match the glob. It provides no guarantees
+  /// about the order of the returned entities, although it does guarantee that
+  /// only one entity with a given path will be returned.
+  ///
+  /// [root] defaults to the current working directory.
+  ///
+  /// [followLinks] works the same as for [Directory.list].
+  Stream<FileSystemEntity> list({String root, bool followLinks: true}) {
+    if (context.style != p.style) {
+      throw new StateError("Can't list glob \"$this\"; it matches "
+          "${context.style} paths, but this platform uses ${p.style} paths.");
+    }
+
+    if (_listTree == null) _listTree = new ListTree(_ast);
+    return _listTree.list(root: root, followLinks: followLinks);
+  }
+
+  /// Synchronously lists all [FileSystemEntity]s beneath [root] that match the
+  /// glob.
+  ///
+  /// This works much like [Directory.listSync], but it only lists directories
+  /// that could contain entities that match the glob. It provides no guarantees
+  /// about the order of the returned entities, although it does guarantee that
+  /// only one entity with a given path will be returned.
+  ///
+  /// [root] defaults to the current working directory.
+  ///
+  /// [followLinks] works the same as for [Directory.list].
+  List<FileSystemEntity> listSync({String root, bool followLinks: true}) {
+    if (context.style != p.style) {
+      throw new StateError("Can't list glob \"$this\"; it matches "
+          "${context.style} paths, but this platform uses ${p.style} paths.");
+    }
+
+    if (_listTree == null) _listTree = new ListTree(_ast);
+    return _listTree.listSync(root: root, followLinks: followLinks);
+  }
+
+  /// Returns whether this glob matches [path].
+  bool matches(String path) => matchAsPrefix(path) != null;
+
+  Match matchAsPrefix(String path, [int start = 0]) {
+    // Globs are like anchored RegExps in that they only match entire paths, so
+    // if the match starts anywhere after the first character it can't succeed.
+    if (start != 0) return null;
+
+    if (_patternCanMatchAbsolute &&
+        (_contextIsAbsolute || context.isAbsolute(path))) {
+      var absolutePath = context.normalize(context.absolute(path));
+      if (_ast.matches(toPosixPath(context, absolutePath))) {
+        return new GlobMatch(path, this);
+      }
+    }
+
+    if (_patternCanMatchRelative) {
+      var relativePath = context.relative(path);
+      if (_ast.matches(toPosixPath(context, relativePath))) {
+        return new GlobMatch(path, this);
+      }
+    }
+
+    return null;
+  }
+
+  Iterable<Match> allMatches(String path, [int start = 0]) {
+    var match = matchAsPrefix(path, start);
+    return match == null ? [] : [match];
+  }
+
+  String toString() => pattern;
+}
diff --git a/mojo/public/dart/third_party/glob/lib/src/ast.dart b/mojo/public/dart/third_party/glob/lib/src/ast.dart
new file mode 100644
index 0000000..1913477
--- /dev/null
+++ b/mojo/public/dart/third_party/glob/lib/src/ast.dart
@@ -0,0 +1,372 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library glob.ast;
+
+import 'package:path/path.dart' as p;
+import 'package:collection/collection.dart';
+
+import 'utils.dart';
+
+const _SEPARATOR = 0x2F; // "/"
+
+/// A node in the abstract syntax tree for a glob.
+abstract class AstNode {
+  /// The cached regular expression that this AST was compiled into.
+  RegExp _regExp;
+
+  /// Whether this glob could match an absolute path.
+  ///
+  /// Either this or [canMatchRelative] or both will be true.
+  final bool canMatchAbsolute = false;
+
+  /// Whether this glob could match a relative path.
+  ///
+  /// Either this or [canMatchRelative] or both will be true.
+  final bool canMatchRelative = true;
+
+  /// Returns a new glob with all the options bubbled to the top level.
+  ///
+  /// In particular, this returns a glob AST with two guarantees:
+  ///
+  /// 1. There are no [OptionsNode]s other than the one at the top level.
+  /// 2. It matches the same set of paths as [this].
+  ///
+  /// For example, given the glob `{foo,bar}/{click/clack}`, this would return
+  /// `{foo/click,foo/clack,bar/click,bar/clack}`.
+  OptionsNode flattenOptions() => new OptionsNode([new SequenceNode([this])]);
+
+  /// Returns whether this glob matches [string].
+  bool matches(String string) {
+    if (_regExp == null) _regExp = new RegExp('^${_toRegExp()}\$');
+    return _regExp.hasMatch(string);
+  }
+
+  /// Subclasses should override this to return a regular expression component.
+  String _toRegExp();
+}
+
+/// A sequence of adjacent AST nodes.
+class SequenceNode extends AstNode {
+  /// The nodes in the sequence.
+  final List<AstNode> nodes;
+
+  bool get canMatchAbsolute => nodes.first.canMatchAbsolute;
+  bool get canMatchRelative => nodes.first.canMatchRelative;
+
+  SequenceNode(Iterable<AstNode> nodes)
+      : nodes = nodes.toList();
+
+  OptionsNode flattenOptions() {
+    if (nodes.isEmpty) return new OptionsNode([this]);
+
+    var sequences = nodes.first.flattenOptions().options
+        .map((sequence) => sequence.nodes);
+    for (var node in nodes.skip(1)) {
+      // Concatenate all sequences in the next options node ([nextSequences])
+      // onto all previous sequences ([sequences]).
+      var nextSequences = node.flattenOptions().options;
+      sequences = sequences.expand((sequence) {
+        return nextSequences.map((nextSequence) {
+          return sequence.toList()..addAll(nextSequence.nodes);
+        });
+      });
+    }
+
+    return new OptionsNode(sequences.map((sequence) {
+      // Combine any adjacent LiteralNodes in [sequence].
+      return new SequenceNode(sequence.fold([], (combined, node) {
+        if (combined.isEmpty || combined.last is! LiteralNode ||
+            node is! LiteralNode) {
+          return combined..add(node);
+        }
+
+        combined[combined.length - 1] =
+            new LiteralNode(combined.last.text + node.text);
+        return combined;
+      }));
+    }));
+  }
+
+  /// Splits this glob into components along its path separators.
+  ///
+  /// For example, given the glob `foo/*/*.dart`, this would return three globs:
+  /// `foo`, `*`, and `*.dart`.
+  ///
+  /// Path separators within options nodes are not split. For example,
+  /// `foo/{bar,baz/bang}/qux` will return three globs: `foo`, `{bar,baz/bang}`,
+  /// and `qux`.
+  ///
+  /// [context] is used to determine what absolute roots look like for this
+  /// glob.
+  List<SequenceNode> split(p.Context context) {
+    var componentsToReturn = [];
+    var currentComponent;
+
+    addNode(node) {
+      if (currentComponent == null) currentComponent = [];
+      currentComponent.add(node);
+    }
+
+    finishComponent() {
+      if (currentComponent == null) return;
+      componentsToReturn.add(new SequenceNode(currentComponent));
+      currentComponent = null;
+    }
+
+    for (var node in nodes) {
+      if (node is! LiteralNode || !node.text.contains('/')) {
+        addNode(node);
+        continue;
+      }
+
+      var text = node.text;
+      if (context.style == p.Style.windows) text = text.replaceAll("/", "\\");
+      var components = context.split(text);
+
+      // If the first component is absolute, that means it's a separator (on
+      // Windows some non-separator things are also absolute, but it's invalid
+      // to have "C:" show up in the middle of a path anyway).
+      if (context.isAbsolute(components.first)) {
+        // If this is the first component, it's the root.
+        if (componentsToReturn.isEmpty && currentComponent == null) {
+          var root = components.first;
+          if (context.style == p.Style.windows) {
+            // Above, we switched to backslashes to make [context.split] handle
+            // roots properly. That means that if there is a root, it'll still
+            // have backslashes, where forward slashes are required for globs.
+            // So we switch it back here.
+            root = root.replaceAll("\\", "/");
+          }
+          addNode(new LiteralNode(root));
+        }
+        finishComponent();
+        components = components.skip(1);
+        if (components.isEmpty) continue;
+      }
+
+      // For each component except the last one, add a separate sequence to
+      // [sequences] containing only that component.
+      for (var component in components.take(components.length - 1)) {
+        addNode(new LiteralNode(component));
+        finishComponent();
+      }
+
+      // For the final component, only end its sequence (by adding a new empty
+      // sequence) if it ends with a separator.
+      addNode(new LiteralNode(components.last));
+      if (node.text.endsWith('/')) finishComponent();
+    }
+
+    finishComponent();
+    return componentsToReturn;
+  }
+
+  String _toRegExp() => nodes.map((node) => node._toRegExp()).join();
+
+  bool operator==(Object other) => other is SequenceNode &&
+      const IterableEquality().equals(nodes, other.nodes);
+
+  int get hashCode => const IterableEquality().hash(nodes);
+
+  String toString() => nodes.join();
+}
+
+/// A node matching zero or more non-separator characters.
+class StarNode extends AstNode {
+  StarNode();
+
+  String _toRegExp() => '[^/]*';
+
+  bool operator==(Object other) => other is StarNode;
+
+  int get hashCode => 0;
+
+  String toString() => '*';
+}
+
+/// A node matching zero or more characters that may be separators.
+class DoubleStarNode extends AstNode {
+  /// The path context for the glob.
+  ///
+  /// This is used to determine what absolute paths look like.
+  final p.Context _context;
+
+  DoubleStarNode(this._context);
+
+  String _toRegExp() {
+    // Double star shouldn't match paths with a leading "../", since these paths
+    // wouldn't be listed with this glob. We only check for "../" at the
+    // beginning since the paths are normalized before being checked against the
+    // glob.
+    var buffer = new StringBuffer()..write(r'(?!^(?:\.\./|');
+
+    // A double star at the beginning of the glob also shouldn't match absolute
+    // paths, since those also wouldn't be listed. Which root patterns we look
+    // for depends on the style of path we're matching.
+    if (_context.style == p.Style.posix) {
+      buffer.write(r'/');
+    } else if (_context.style == p.Style.windows) {
+      buffer.write(r'//|[A-Za-z]:/');
+    } else {
+      assert(_context.style == p.Style.url);
+      buffer.write(r'[a-zA-Z][-+.a-zA-Z\d]*://|/');
+    }
+
+    // Use `[^]` rather than `.` so that it matches newlines as well.
+    buffer.write(r'))[^]*');
+
+    return buffer.toString();
+  }
+
+  bool operator==(Object other) => other is DoubleStarNode;
+
+  int get hashCode => 1;
+
+  String toString() => '**';
+}
+
+/// A node matching a single non-separator character.
+class AnyCharNode extends AstNode {
+  AnyCharNode();
+
+  String _toRegExp() => '[^/]';
+
+  bool operator==(Object other) => other is AnyCharNode;
+
+  int get hashCode => 2;
+
+  String toString() => '?';
+}
+
+/// A node matching a single character in a range of options.
+class RangeNode extends AstNode {
+  /// The ranges matched by this node.
+  ///
+  /// The ends of the ranges are unicode code points.
+  final Set<Range> ranges;
+
+  /// Whether this range was negated.
+  final bool negated;
+
+  RangeNode(Iterable<Range> ranges, {this.negated})
+      : ranges = ranges.toSet();
+
+  OptionsNode flattenOptions() {
+    if (negated || ranges.any((range) => !range.isSingleton)) {
+      return super.flattenOptions();
+    }
+
+    // If a range explicitly lists a set of characters, return each character as
+    // a separate expansion.
+    return new OptionsNode(ranges.map((range) {
+      return new SequenceNode([
+        new LiteralNode(new String.fromCharCodes([range.min]))
+      ]);
+    }));
+  }
+
+  String _toRegExp() {
+    var buffer = new StringBuffer();
+
+    var containsSeparator = ranges.any((range) => range.contains(_SEPARATOR));
+    if (!negated && containsSeparator) {
+      // Add `(?!/)` because ranges are never allowed to match separators.
+      buffer.write('(?!/)');
+    }
+
+    buffer.write('[');
+    if (negated) {
+      buffer.write('^');
+      // If the range doesn't itself exclude separators, exclude them ourselves,
+      // since ranges are never allowed to match them.
+      if (!containsSeparator) buffer.write('/');
+    }
+
+    for (var range in ranges) {
+      var start = new String.fromCharCodes([range.min]);
+      buffer.write(regExpQuote(start));
+      if (range.isSingleton) continue;
+      buffer.write('-');
+      buffer.write(regExpQuote(new String.fromCharCodes([range.max])));
+    }
+
+    buffer.write(']');
+    return buffer.toString();
+  }
+
+  bool operator==(Object other) {
+    if (other is! RangeNode) return false;
+    if ((other as RangeNode).negated != negated) return false;
+    return const SetEquality().equals(ranges, (other as RangeNode).ranges);
+  }
+
+  int get hashCode => (negated ? 1 : 3) * const SetEquality().hash(ranges);
+
+  String toString() {
+    var buffer = new StringBuffer()..write('[');
+    for (var range in ranges) {
+      buffer.writeCharCode(range.min);
+      if (range.isSingleton) continue;
+      buffer.write('-');
+      buffer.writeCharCode(range.max);
+    }
+    buffer.write(']');
+    return buffer.toString();
+  }
+}
+
+/// A node that matches one of several options.
+class OptionsNode extends AstNode {
+  /// The options to match.
+  final List<SequenceNode> options;
+
+  bool get canMatchAbsolute => options.any((node) => node.canMatchAbsolute);
+  bool get canMatchRelative => options.any((node) => node.canMatchRelative);
+
+  OptionsNode(Iterable<SequenceNode> options)
+      : options = options.toList();
+
+  OptionsNode flattenOptions() => new OptionsNode(
+      options.expand((option) => option.flattenOptions().options));
+
+  String _toRegExp() =>
+      '(?:${options.map((option) => option._toRegExp()).join("|")})';
+
+  bool operator==(Object other) => other is OptionsNode &&
+      const UnorderedIterableEquality().equals(options, other.options);
+
+  int get hashCode => const UnorderedIterableEquality().hash(options);
+
+  String toString() => '{${options.join(',')}}';
+}
+
+/// A node that matches a literal string.
+class LiteralNode extends AstNode {
+  /// The string to match.
+  final String text;
+
+  /// The path context for the glob.
+  ///
+  /// This is used to determine whether this could match an absolute path.
+  final p.Context _context;
+
+  bool get canMatchAbsolute {
+    var nativeText = _context.style == p.Style.windows ?
+        text.replaceAll('/', '\\') : text;
+    return _context.isAbsolute(nativeText);
+  }
+
+  bool get canMatchRelative => !canMatchAbsolute;
+
+  LiteralNode(this.text, [this._context]);
+
+  String _toRegExp() => regExpQuote(text);
+
+  bool operator==(Object other) => other is LiteralNode && other.text == text;
+
+  int get hashCode => text.hashCode;
+
+  String toString() => text;
+}
diff --git a/mojo/public/dart/third_party/glob/lib/src/list_tree.dart b/mojo/public/dart/third_party/glob/lib/src/list_tree.dart
new file mode 100644
index 0000000..3667d63
--- /dev/null
+++ b/mojo/public/dart/third_party/glob/lib/src/list_tree.dart
@@ -0,0 +1,420 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library glob.list_tree;
+
+import 'dart:io';
+import 'dart:async';
+
+import 'package:path/path.dart' as p;
+
+import 'ast.dart';
+import 'stream_pool.dart';
+import 'utils.dart';
+
+/// The errno for a file or directory not existing on Mac and Linux.
+const _ENOENT = 2;
+
+/// Another errno we see on Windows when trying to list a non-existent
+/// directory.
+const _ENOENT_WIN = 3;
+
+/// A structure built from a glob that efficiently lists filesystem entities
+/// that match that glob.
+///
+/// This structure is designed to list the minimal number of physical
+/// directories necessary to find everything that matches the glob. For example,
+/// for the glob `foo/{bar,baz}/*`, there's no need to list the working
+/// directory or even `foo/`; only `foo/bar` and `foo/baz` should be listed.
+///
+/// This works by creating a tree of [_ListTreeNode]s, each of which corresponds
+/// to a single of directory nesting in the source glob. Each node has child
+/// nodes associated with globs ([_ListTreeNode.children]), as well as its own
+/// glob ([_ListTreeNode._validator]) that indicates which entities within that
+/// node's directory should be returned.
+///
+/// For example, the glob `foo/{*.dart,b*/*.txt}` creates the following tree:
+///
+///     .
+///     '-- "foo" (validator: "*.dart")
+///         '-- "b*" (validator: "*.txt"
+///
+/// If a node doesn't have a validator, we know we don't have to list it
+/// explicitly.
+///
+/// Nodes can also be marked as "recursive", which means they need to be listed
+/// recursively (usually to support `**`). In this case, they will have no
+/// children; instead, their validator will just encompass the globs that would
+/// otherwise be in their children. For example, the glob
+/// `foo/{**.dart,bar/*.txt}` creates a recursive node for `foo` with the
+/// validator `**.dart,bar/*.txt`.
+///
+/// If the glob contains multiple filesystem roots (e.g. `{C:/,D:/}*.dart`),
+/// each root will have its own tree of nodes. Relative globs use `.` as their
+/// root instead.
+class ListTree {
+  /// A map from filesystem roots to the list tree for those roots.
+  ///
+  /// A relative glob will use `.` as its root.
+  final _trees = new Map<String, _ListTreeNode>();
+
+  /// Whether paths listed might overlap.
+  ///
+  /// If they do, we need to filter out overlapping paths.
+  bool _canOverlap;
+
+  ListTree(AstNode glob) {
+    // The first step in constructing a tree from the glob is to simplify the
+    // problem by eliminating options. [glob.flattenOptions] bubbles all options
+    // (and certain ranges) up to the top level of the glob so we can deal with
+    // them one at a time.
+    var options = glob.flattenOptions();
+
+    for (var option in options.options) {
+      // Since each option doesn't include its own options, we can safely split
+      // it into path components.
+      var components = option.split(p.context);
+      var firstNode = components.first.nodes.first;
+      var root = '.';
+
+      // Determine the root for this option, if it's absolute. If it's not, the
+      // root's just ".".
+      if (firstNode is LiteralNode) {
+        var text = firstNode.text;
+        if (Platform.isWindows) text.replaceAll("/", "\\");
+        if (p.isAbsolute(text)) {
+          // If the path is absolute, the root should be the only thing in the
+          // first component.
+          assert(components.first.nodes.length == 1);
+          root = firstNode.text;
+          components.removeAt(0);
+        }
+      }
+
+      _addGlob(root, components);
+    }
+
+    _canOverlap = _computeCanOverlap();
+  }
+
+  /// Add the glob represented by [components] to the tree under [root].
+  void _addGlob(String root, List<AstNode> components) {
+    // The first [parent] represents the root directory itself. It may be null
+    // here if this is the first option with this particular [root]. If so,
+    // we'll create it below.
+    //
+    // As we iterate through [components], [parent] will be set to
+    // progressively more nested nodes.
+    var parent = _trees[root];
+    for (var i = 0; i < components.length; i++) {
+      var component = components[i];
+      var recursive = component.nodes.any((node) => node is DoubleStarNode);
+      var complete = i == components.length - 1;
+
+      // If the parent node for this level of nesting already exists, the new
+      // option will be added to it as additional validator options and/or
+      // additional children.
+      //
+      // If the parent doesn't exist, we'll create it in one of the else
+      // clauses below.
+      if (parent != null) {
+        if (parent.isRecursive || recursive) {
+          // If [component] is recursive, mark [parent] as recursive. This
+          // will cause all of its children to be folded into its validator.
+          // If [parent] was already recursive, this is a no-op.
+          parent.makeRecursive();
+
+          // Add [component] and everything nested beneath it as an option to
+          // [parent]. Since [parent] is recursive, it will recursively list
+          // everything beneath it and filter them with one big glob.
+          parent.addOption(_join(components.sublist(i)));
+          return;
+        } else if (complete) {
+          // If [component] is the last component, add it to [parent]'s
+          // validator but not to its children.
+          parent.addOption(component);
+        } else {
+          // On the other hand if there are more components, add [component]
+          // to [parent]'s children and not its validator. Since we process
+          // each option's components separately, the same component is never
+          // both a validator and a child.
+          if (!parent.children.containsKey(component)) {
+            parent.children[component] = new _ListTreeNode();
+          }
+          parent = parent.children[component];
+        }
+      } else if (recursive) {
+        _trees[root] = new _ListTreeNode.recursive(
+            _join(components.sublist(i)));
+        return;
+      } else if (complete) {
+        _trees[root] = new _ListTreeNode()..addOption(component);
+      } else {
+        _trees[root] = new _ListTreeNode();
+        _trees[root].children[component] = new _ListTreeNode();
+        parent = _trees[root].children[component];
+      }
+    }
+  }
+
+  /// Computes the value for [_canOverlap].
+  bool _computeCanOverlap() {
+    // If this can list a relative path and an absolute path, the former may be
+    // contained within the latter.
+    if (_trees.length > 1 && _trees.containsKey('.')) return true;
+
+    // Otherwise, this can only overlap if the tree beneath any given root could
+    // overlap internally.
+    return _trees.values.any((node) => node.canOverlap);
+  }
+
+  /// List all entities that match this glob beneath [root].
+  Stream<FileSystemEntity> list({String root, bool followLinks: true}) {
+    if (root == null) root = '.';
+    var pool = new StreamPool();
+    for (var rootDir in _trees.keys) {
+      var dir = rootDir == '.' ? root : rootDir;
+      pool.add(_trees[rootDir].list(dir, followLinks: followLinks));
+    }
+    pool.closeWhenEmpty();
+
+    if (!_canOverlap) return pool.stream;
+
+    // TODO(nweiz): Rather than filtering here, avoid double-listing directories
+    // in the first place.
+    var seen = new Set();
+    return pool.stream.where((entity) {
+      if (seen.contains(entity.path)) return false;
+      seen.add(entity.path);
+      return true;
+    });
+  }
+
+  /// Synchronosuly list all entities that match this glob beneath [root].
+  List<FileSystemEntity> listSync({String root, bool followLinks: true}) {
+    if (root == null) root = '.';
+
+    var result = _trees.keys.expand((rootDir) {
+      var dir = rootDir == '.' ? root : rootDir;
+      return _trees[rootDir].listSync(dir, followLinks: followLinks);
+    });
+
+    if (!_canOverlap) return result.toList();
+
+    // TODO(nweiz): Rather than filtering here, avoid double-listing directories
+    // in the first place.
+    var seen = new Set();
+    return result.where((entity) {
+      if (seen.contains(entity.path)) return false;
+      seen.add(entity.path);
+      return true;
+    }).toList();
+  }
+}
+
+/// A single node in a [ListTree].
+class _ListTreeNode {
+  /// This node's child nodes, by their corresponding globs.
+  ///
+  /// Each child node will only be listed on directories that match its glob.
+  ///
+  /// This may be `null`, indicating that this node should be listed
+  /// recursively.
+  Map<SequenceNode, _ListTreeNode> children;
+
+  /// This node's validator.
+  ///
+  /// This determines which entities will ultimately be emitted when [list] is
+  /// called.
+  OptionsNode _validator;
+
+  /// Whether this node is recursive.
+  ///
+  /// A recursive node has no children and is listed recursively.
+  bool get isRecursive => children == null;
+
+  /// Whether this node doesn't itself need to be listed.
+  ///
+  /// If a node has no validator and all of its children are literal filenames,
+  /// there's no need to list its contents. We can just directly traverse into
+  /// its children.
+  bool get _isIntermediate {
+    if (_validator != null) return false;
+    return children.keys.every((sequence) =>
+        sequence.nodes.length == 1 && sequence.nodes.first is LiteralNode);
+  }
+
+  /// Returns whether listing this node might return overlapping results.
+  bool get canOverlap {
+    // A recusive node can never overlap with itself, because it will only ever
+    // involve a single call to [Directory.list] that's then filtered with
+    // [_validator].
+    if (isRecursive) return false;
+
+    // If there's more than one child node and at least one of the children is
+    // dynamic (that is, matches more than just a literal string), there may be
+    // overlap.
+    if (children.length > 1 && children.keys.any((sequence) =>
+          sequence.nodes.length > 1 || sequence.nodes.single is! LiteralNode)) {
+      return true;
+    }
+
+    return children.values.any((node) => node.canOverlap);
+  }
+
+  /// Creates a node with no children and no validator.
+  _ListTreeNode()
+      : children = new Map<SequenceNode, _ListTreeNode>(),
+        _validator = null;
+
+  /// Creates a recursive node the given [validator].
+  _ListTreeNode.recursive(SequenceNode validator)
+      : children = null,
+        _validator = new OptionsNode([validator]);
+
+  /// Transforms this into recursive node, folding all its children into its
+  /// validator.
+  void makeRecursive() {
+    if (isRecursive) return;
+    _validator = new OptionsNode(children.keys.map((sequence) {
+      var child = children[sequence];
+      child.makeRecursive();
+      return _join([sequence, child._validator]);
+    }));
+    children = null;
+  }
+
+  /// Adds [validator] to this node's existing validator.
+  void addOption(SequenceNode validator) {
+    if (_validator == null) {
+      _validator = new OptionsNode([validator]);
+    } else {
+      _validator.options.add(validator);
+    }
+  }
+
+  /// Lists all entities within [dir] matching this node or its children.
+  ///
+  /// This may return duplicate entities. These will be filtered out in
+  /// [ListTree.list].
+  Stream<FileSystemEntity> list(String dir, {bool followLinks: true}) {
+    if (isRecursive) {
+      return new Directory(dir).list(recursive: true, followLinks: followLinks)
+          .where((entity) => _matches(entity.path.substring(dir.length + 1)));
+    }
+
+    var resultPool = new StreamPool();
+
+    // Don't spawn extra [Directory.list] calls when we already know exactly
+    // which subdirectories we're interested in.
+    if (_isIntermediate) {
+      children.forEach((sequence, child) {
+        resultPool.add(child.list(p.join(dir, sequence.nodes.single.text),
+            followLinks: followLinks));
+      });
+      resultPool.closeWhenEmpty();
+      return resultPool.stream;
+    }
+
+    var resultController = new StreamController(sync: true);
+    resultPool.add(resultController.stream);
+    new Directory(dir).list(followLinks: followLinks).listen((entity) {
+      var basename = entity.path.substring(dir.length + 1);
+      if (_matches(basename)) resultController.add(entity);
+
+      children.forEach((sequence, child) {
+        if (entity is! Directory) return;
+        if (!sequence.matches(basename)) return;
+        var stream = child.list(p.join(dir, basename), followLinks: followLinks)
+            .handleError((_) {}, test: (error) {
+          // Ignore errors from directories not existing. We do this here so
+          // that we only ignore warnings below wild cards. For example, the
+          // glob "foo/bar/*/baz" should fail if "foo/bar" doesn't exist but
+          // succeed if "foo/bar/qux/baz" doesn't exist.
+          return error is FileSystemException &&
+              (error.osError.errorCode == _ENOENT ||
+              error.osError.errorCode == _ENOENT_WIN);
+        });
+        resultPool.add(stream);
+      });
+    },
+        onError: resultController.addError,
+        onDone: resultController.close);
+
+    resultPool.closeWhenEmpty();
+    return resultPool.stream;
+  }
+
+  /// Synchronously lists all entities within [dir] matching this node or its
+  /// children.
+  ///
+  /// This may return duplicate entities. These will be filtered out in
+  /// [ListTree.listSync].
+  Iterable<FileSystemEntity> listSync(String dir, {bool followLinks: true}) {
+    if (isRecursive) {
+      return new Directory(dir)
+          .listSync(recursive: true, followLinks: followLinks)
+          .where((entity) => _matches(entity.path.substring(dir.length + 1)));
+    }
+
+    // Don't spawn extra [Directory.listSync] calls when we already know exactly
+    // which subdirectories we're interested in.
+    if (_isIntermediate) {
+      return children.keys.expand((sequence) {
+        return children[sequence].listSync(
+            p.join(dir, sequence.nodes.single.text), followLinks: followLinks);
+      });
+    }
+
+    return new Directory(dir).listSync(followLinks: followLinks)
+        .expand((entity) {
+      var entities = [];
+      var basename = entity.path.substring(dir.length + 1);
+      if (_matches(basename)) entities.add(entity);
+      if (entity is! Directory) return entities;
+
+      entities.addAll(children.keys
+          .where((sequence) => sequence.matches(basename))
+          .expand((sequence) {
+        try {
+          return children[sequence].listSync(
+              p.join(dir, basename), followLinks: followLinks).toList();
+        } on FileSystemException catch (error) {
+          // Ignore errors from directories not existing. We do this here so
+          // that we only ignore warnings below wild cards. For example, the
+          // glob "foo/bar/*/baz" should fail if "foo/bar" doesn't exist but
+          // succeed if "foo/bar/qux/baz" doesn't exist.
+          if (error.osError.errorCode == _ENOENT ||
+              error.osError.errorCode == _ENOENT_WIN) {
+            return const [];
+          } else {
+            rethrow;
+          }
+        }
+      }));
+
+      return entities;
+    });
+  }
+
+  /// Returns whether the native [path] matches [_validator].
+  bool _matches(String path) {
+    if (_validator == null) return false;
+    return _validator.matches(toPosixPath(p.context, path));
+  }
+
+  String toString() => "($_validator) $children";
+}
+
+/// Joins each [components] into a new glob where each component is separated by
+/// a path separator.
+SequenceNode _join(Iterable<AstNode> components) {
+  var componentsList = components.toList();
+  var nodes = [componentsList.removeAt(0)];
+  for (var component in componentsList) {
+    nodes.add(new LiteralNode('/'));
+    nodes.add(component);
+  }
+  return new SequenceNode(nodes);
+}
diff --git a/mojo/public/dart/third_party/glob/lib/src/parser.dart b/mojo/public/dart/third_party/glob/lib/src/parser.dart
new file mode 100644
index 0000000..5dac146
--- /dev/null
+++ b/mojo/public/dart/third_party/glob/lib/src/parser.dart
@@ -0,0 +1,173 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library glob.single_component;
+
+import 'package:path/path.dart' as p;
+import 'package:string_scanner/string_scanner.dart';
+
+import 'ast.dart';
+import 'utils.dart';
+
+const _HYPHEN = 0x2D;
+const _SLASH = 0x2F;
+
+/// A parser for globs.
+class Parser {
+  /// The scanner used to scan the source.
+  final StringScanner _scanner;
+
+  /// The path context for the glob.
+  final p.Context _context;
+
+  Parser(String component, this._context)
+      : _scanner = new StringScanner(component);
+
+  /// Parses an entire glob.
+  SequenceNode parse() => _parseSequence();
+
+  /// Parses a [SequenceNode].
+  ///
+  /// If [inOptions] is true, this is parsing within an [OptionsNode].
+  SequenceNode _parseSequence({bool inOptions: false}) {
+    var nodes = [];
+
+    if (_scanner.isDone) {
+      _scanner.error('expected a glob.', position: 0, length: 0);
+    }
+
+    while (!_scanner.isDone) {
+      if (inOptions && (_scanner.matches(',') || _scanner.matches('}'))) break;
+      nodes.add(_parseNode(inOptions: inOptions));
+    }
+
+    return new SequenceNode(nodes);
+  }
+
+  /// Parses an [AstNode].
+  ///
+  /// If [inOptions] is true, this is parsing within an [OptionsNode].
+  AstNode _parseNode({bool inOptions: false}) {
+    var star = _parseStar();
+    if (star != null) return star;
+
+    var anyChar = _parseAnyChar();
+    if (anyChar != null) return anyChar;
+
+    var range = _parseRange();
+    if (range != null) return range;
+
+    var options = _parseOptions();
+    if (options != null) return options;
+
+    return _parseLiteral(inOptions: inOptions);
+  }
+
+  /// Tries to parse a [StarNode] or a [DoubleStarNode].
+  ///
+  /// Returns `null` if there's not one to parse.
+  AstNode _parseStar() {
+    if (!_scanner.scan('*')) return null;
+    return _scanner.scan('*') ? new DoubleStarNode(_context) : new StarNode();
+  }
+
+  /// Tries to parse an [AnyCharNode].
+  ///
+  /// Returns `null` if there's not one to parse.
+  AstNode _parseAnyChar() {
+    if (!_scanner.scan('?')) return null;
+    return new AnyCharNode();
+  }
+
+  /// Tries to parse an [RangeNode].
+  ///
+  /// Returns `null` if there's not one to parse.
+  AstNode _parseRange() {
+    if (!_scanner.scan('[')) return null;
+    if (_scanner.matches(']')) _scanner.error('unexpected "]".');
+    var negated = _scanner.scan('!') || _scanner.scan('^');
+
+    readRangeChar() {
+      var char = _scanner.readChar();
+      if (negated || char != _SLASH) return char;
+      _scanner.error('"/" may not be used in a range.',
+          position: _scanner.position - 1);
+    }
+
+    var ranges = [];
+    while (!_scanner.scan(']')) {
+      var start = _scanner.position;
+      // Allow a backslash to escape a character.
+      _scanner.scan('\\');
+      var char = readRangeChar();
+
+      if (_scanner.scan('-')) {
+        if (_scanner.matches(']')) {
+          ranges.add(new Range.singleton(char));
+          ranges.add(new Range.singleton(_HYPHEN));
+          continue;
+        }
+
+        // Allow a backslash to escape a character.
+        _scanner.scan('\\');
+
+        var end = readRangeChar();
+
+        if (end < char) {
+          _scanner.error("Range out of order.",
+              position: start,
+              length: _scanner.position - start);
+        }
+        ranges.add(new Range(char, end));
+      } else {
+        ranges.add(new Range.singleton(char));
+      }
+    }
+
+    return new RangeNode(ranges, negated: negated);
+  }
+
+  /// Tries to parse an [OptionsNode].
+  ///
+  /// Returns `null` if there's not one to parse.
+  AstNode _parseOptions() {
+    if (!_scanner.scan('{')) return null;
+    if (_scanner.matches('}')) _scanner.error('unexpected "}".');
+
+    var options = [];
+    do {
+      options.add(_parseSequence(inOptions: true));
+    } while (_scanner.scan(','));
+
+    // Don't allow single-option blocks.
+    if (options.length == 1) _scanner.expect(',');
+    _scanner.expect('}');
+
+    return new OptionsNode(options);
+  }
+
+  /// Parses a [LiteralNode].
+  AstNode _parseLiteral({bool inOptions: false}) {
+    // If we're in an options block, we want to stop parsing as soon as we hit a
+    // comma. Otherwise, commas are fair game for literals.
+    var regExp = new RegExp(
+        inOptions ? r'[^*{[?\\}\],()]*' : r'[^*{[?\\}\]()]*');
+
+    _scanner.scan(regExp);
+    var buffer = new StringBuffer()..write(_scanner.lastMatch[0]);
+
+    while (_scanner.scan('\\')) {
+      buffer.writeCharCode(_scanner.readChar());
+      _scanner.scan(regExp);
+      buffer.write(_scanner.lastMatch[0]);
+    }
+
+    for (var char in const [']', '(', ')']) {
+      if (_scanner.matches(char)) _scanner.error('unexpected "$char"');
+    }
+    if (!inOptions && _scanner.matches('}')) _scanner.error('unexpected "}"');
+
+    return new LiteralNode(buffer.toString(), _context);
+  }
+}
diff --git a/mojo/public/dart/third_party/glob/lib/src/stream_pool.dart b/mojo/public/dart/third_party/glob/lib/src/stream_pool.dart
new file mode 100644
index 0000000..6417513
--- /dev/null
+++ b/mojo/public/dart/third_party/glob/lib/src/stream_pool.dart
@@ -0,0 +1,76 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library glob.stream_pool;
+
+import 'dart:async';
+
+/// A pool of streams whose events are unified and emitted through a central
+/// stream.
+class StreamPool<T> {
+  /// The stream through which all events from streams in the pool are emitted.
+  Stream<T> get stream => _controller.stream;
+  final StreamController<T> _controller;
+
+  /// Subscriptions to the streams that make up the pool.
+  final _subscriptions = new Map<Stream<T>, StreamSubscription<T>>();
+
+  /// Whether this pool should be closed when it becomes empty.
+  bool _closeWhenEmpty = false;
+
+  /// Creates a new stream pool that only supports a single subscriber.
+  ///
+  /// Any events from broadcast streams in the pool will be buffered until a
+  /// listener is subscribed.
+  StreamPool()
+      // Create the controller as sync so that any sync input streams will be
+      // forwarded synchronously. Async input streams will have their asynchrony
+      // preserved, since _controller.add will be called asynchronously.
+      : _controller = new StreamController<T>(sync: true);
+
+  /// Creates a new stream pool where [stream] can be listened to more than
+  /// once.
+  ///
+  /// Any events from buffered streams in the pool will be emitted immediately,
+  /// regardless of whether [stream] has any subscribers.
+  StreamPool.broadcast()
+      // Create the controller as sync so that any sync input streams will be
+      // forwarded synchronously. Async input streams will have their asynchrony
+      // preserved, since _controller.add will be called asynchronously.
+      : _controller = new StreamController<T>.broadcast(sync: true);
+
+  /// Adds [stream] as a member of this pool.
+  ///
+  /// Any events from [stream] will be emitted through [this.stream]. If
+  /// [stream] is sync, they'll be emitted synchronously; if [stream] is async,
+  /// they'll be emitted asynchronously.
+  void add(Stream<T> stream) {
+    if (_subscriptions.containsKey(stream)) return;
+    _subscriptions[stream] = stream.listen(_controller.add,
+        onError: _controller.addError,
+        onDone: () => remove(stream));
+  }
+
+  /// Removes [stream] as a member of this pool.
+  void remove(Stream<T> stream) {
+    var subscription = _subscriptions.remove(stream);
+    if (subscription != null) subscription.cancel();
+    if (_closeWhenEmpty && _subscriptions.isEmpty) close();
+  }
+
+  /// Removes all streams from this pool and closes [stream].
+  void close() {
+    for (var subscription in _subscriptions.values) {
+      subscription.cancel();
+    }
+    _subscriptions.clear();
+    _controller.close();
+  }
+
+  /// The next time this pool becomes empty, close it.
+  void closeWhenEmpty() {
+    if (_subscriptions.isEmpty) close();
+    _closeWhenEmpty = true;
+  }
+}
diff --git a/mojo/public/dart/third_party/glob/lib/src/utils.dart b/mojo/public/dart/third_party/glob/lib/src/utils.dart
new file mode 100644
index 0000000..f17f2ed
--- /dev/null
+++ b/mojo/public/dart/third_party/glob/lib/src/utils.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library glob.utils;
+
+import 'package:path/path.dart' as p;
+
+/// A range from [min] to [max], inclusive.
+class Range {
+  /// The minimum value included by the range.
+  final int min;
+
+  /// The maximum value included by the range.
+  final int max;
+
+  /// Whether this range covers only a single number.
+  bool get isSingleton => min == max;
+
+  Range(this.min, this.max);
+
+  /// Returns a range that covers only [value].
+  Range.singleton(int value)
+      : this(value, value);
+
+  /// Whether [this] contains [value].
+  bool contains(int value) => value >= min && value <= max;
+
+  bool operator==(Object other) => other is Range &&
+      other.min == min && other.max == max;
+
+  int get hashCode => 3 * min + 7 * max;
+}
+
+/// An implementation of [Match] constructed by [Glob]s.
+class GlobMatch implements Match {
+  final String input;
+  final Pattern pattern;
+  final int start = 0;
+
+  int get end => input.length;
+  int get groupCount => 0;
+
+  GlobMatch(this.input, this.pattern);
+
+  String operator [](int group) => this.group(group);
+
+  String group(int group) {
+    if (group != 0) throw new RangeError.range(group, 0, 0);
+    return input;
+  }
+
+  List<String> groups(List<int> groupIndices) =>
+      groupIndices.map((index) => group(index)).toList();
+}
+
+final _quote = new RegExp(r"[+*?{}|[\]\\().^$-]");
+
+/// Returns [contents] with characters that are meaningful in regular
+/// expressions backslash-escaped.
+String regExpQuote(String contents) =>
+    contents.replaceAllMapped(_quote, (char) => "\\${char[0]}");
+
+/// Returns [path] with all its separators replaced with forward slashes.
+///
+/// This is useful when converting from Windows paths to globs.
+String separatorToForwardSlash(String path) {
+  if (p.style != p.Style.windows) return path;
+  return path.replaceAll('\\', '/');
+}
+
+/// Returns [path] which follows [context] converted to the POSIX format that
+/// globs match against.
+String toPosixPath(p.Context context, String path) {
+  if (context.style == p.Style.windows) return path.replaceAll('\\', '/');
+  if (context.style == p.Style.url) return Uri.decodeFull(path);
+  return path;
+}
diff --git a/mojo/public/dart/third_party/glob/pubspec.yaml b/mojo/public/dart/third_party/glob/pubspec.yaml
new file mode 100644
index 0000000..eb7816c
--- /dev/null
+++ b/mojo/public/dart/third_party/glob/pubspec.yaml
@@ -0,0 +1,12 @@
+name: glob
+version: 1.0.5
+author: "Dart Team <misc@dartlang.org>"
+homepage: https://github.com/dart-lang/glob
+description: Bash-style filename globbing.
+dependencies:
+  collection: ">=1.1.0 <2.0.0"
+  path: ">=1.3.0 <2.0.0"
+  string_scanner: ">=0.1.0 <0.2.0"
+dev_dependencies:
+  test: ">=0.12.0 <0.13.0"
+  scheduled_test: ">=0.12.0 <0.13.0"
diff --git a/mojo/public/dart/third_party/glob/test/glob_test.dart b/mojo/public/dart/third_party/glob/test/glob_test.dart
new file mode 100644
index 0000000..a742f20
--- /dev/null
+++ b/mojo/public/dart/third_party/glob/test/glob_test.dart
@@ -0,0 +1,94 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:glob/glob.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group("Glob.quote()", () {
+    test("quotes all active characters", () {
+      expect(Glob.quote("*{[?\\}],-"), equals(r"\*\{\[\?\\\}\]\,\-"));
+    });
+
+    test("doesn't quote inactive characters", () {
+      expect(Glob.quote("abc~`_+="), equals("abc~`_+="));
+    });
+  });
+
+  group("Glob.matches()", () {
+    test("returns whether the path matches the glob", () {
+      var glob = new Glob("foo*");
+      expect(glob.matches("foobar"), isTrue);
+      expect(glob.matches("baz"), isFalse);
+    });
+
+    test("only matches the entire path", () {
+      var glob = new Glob("foo");
+      expect(glob.matches("foo/bar"), isFalse);
+      expect(glob.matches("bar/foo"), isFalse);
+    });
+  });
+
+  group("Glob.matchAsPrefix()", () {
+    test("returns a match if the path matches the glob", () {
+      var glob = new Glob("foo*");
+      expect(glob.matchAsPrefix("foobar"), new isInstanceOf<Match>());
+      expect(glob.matchAsPrefix("baz"), isNull);
+    });
+
+    test("returns null for start > 0", () {
+      var glob = new Glob("*");
+      expect(glob.matchAsPrefix("foobar", 1), isNull);
+    });
+  });
+
+  group("Glob.allMatches()", () {
+    test("returns a single match if the path matches the glob", () {
+      var matches = new Glob("foo*").allMatches("foobar");
+      expect(matches, hasLength(1));
+      expect(matches.first, new isInstanceOf<Match>());
+    });
+
+    test("returns an empty list if the path doesn't match the glob", () {
+      expect(new Glob("foo*").allMatches("baz"), isEmpty);
+    });
+
+    test("returns no matches for start > 0", () {
+      var glob = new Glob("*");
+      expect(glob.allMatches("foobar", 1), isEmpty);
+    });
+  });
+
+  group("GlobMatch", () {
+    var glob = new Glob("foo*");
+    var match = glob.matchAsPrefix("foobar");
+
+    test("returns the string as input", () {
+      expect(match.input, equals("foobar"));
+    });
+
+    test("returns the glob as the pattern", () {
+      expect(match.pattern, equals(glob));
+    });
+
+    test("returns the span of the string for start and end", () {
+      expect(match.start, equals(0));
+      expect(match.end, equals("foobar".length));
+    });
+
+    test("has a single group that contains the whole string", () {
+      expect(match.groupCount, equals(0));
+      expect(match[0], equals("foobar"));
+      expect(match.group(0), equals("foobar"));
+      expect(match.groups([0]), equals(["foobar"]));
+    });
+
+    test("throws a range error for an invalid group", () {
+      expect(() => match[1], throwsRangeError);
+      expect(() => match[-1], throwsRangeError);
+      expect(() => match.group(1), throwsRangeError);
+      expect(() => match.groups([1]), throwsRangeError);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/glob/test/list_test.dart b/mojo/public/dart/third_party/glob/test/list_test.dart
new file mode 100644
index 0000000..3327524
--- /dev/null
+++ b/mojo/public/dart/third_party/glob/test/list_test.dart
@@ -0,0 +1,313 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:glob/glob.dart';
+import 'package:glob/src/utils.dart';
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_test.dart';
+
+String sandbox;
+
+void main() {
+  setUp(() {
+    scheduleSandbox();
+
+    d.dir("foo", [
+      d.file("bar"),
+      d.dir("baz", [
+        d.file("bang"),
+        d.file("qux")
+      ])
+    ]).create();
+  });
+
+  group("list()", () {
+    test("fails if the context doesn't match the system context", () {
+      expect(new Glob("*", context: p.url).list, throwsStateError);
+    });
+
+    test("reports exceptions for non-existent directories", () {
+      schedule(() {
+        expect(new Glob("non/existent/**").list().toList(),
+            throwsA(new isInstanceOf<FileSystemException>()));
+      });
+    });
+  });
+
+  group("listSync()", () {
+    test("fails if the context doesn't match the system context", () {
+      expect(new Glob("*", context: p.url).listSync, throwsStateError);
+    });
+
+    test("reports exceptions for non-existent directories", () {
+      schedule(() {
+        expect(new Glob("non/existent/**").listSync,
+            throwsA(new isInstanceOf<FileSystemException>()));
+      });
+    });
+  });
+
+  syncAndAsync((list) {
+    group("literals", () {
+      test("lists a single literal", () {
+        expect(list("foo/baz/qux"),
+            completion(equals([p.join("foo", "baz", "qux")])));
+      });
+
+      test("lists a non-matching literal", () {
+        expect(list("foo/baz/nothing"), completion(isEmpty));
+      });
+    });
+
+    group("star", () {
+      test("lists within filenames but not across directories", () {
+        expect(list("foo/b*"), completion(unorderedEquals([
+          p.join("foo", "bar"),
+          p.join("foo", "baz")
+        ])));
+      });
+
+      test("lists the empy string", () {
+        expect(list("foo/bar*"), completion(equals([p.join("foo", "bar")])));
+      });
+    });
+
+    group("double star", () {
+      test("lists within filenames", () {
+        expect(list("foo/baz/**"), completion(unorderedEquals([
+          p.join("foo", "baz", "qux"),
+          p.join("foo", "baz", "bang")
+        ])));
+      });
+
+      test("lists the empty string", () {
+        expect(list("foo/bar**"), completion(equals([p.join("foo", "bar")])));
+      });
+
+      test("lists recursively", () {
+        expect(list("foo/**"), completion(unorderedEquals([
+          p.join("foo", "bar"),
+          p.join("foo", "baz"),
+          p.join("foo", "baz", "qux"),
+          p.join("foo", "baz", "bang")
+        ])));
+      });
+
+      test("combines with literals", () {
+        expect(list("foo/ba**"), completion(unorderedEquals([
+          p.join("foo", "bar"),
+          p.join("foo", "baz"),
+          p.join("foo", "baz", "qux"),
+          p.join("foo", "baz", "bang")
+        ])));
+      });
+
+      test("lists recursively in the middle of a glob", () {
+        d.dir("deep", [
+          d.dir("a", [
+            d.dir("b", [
+              d.dir("c", [
+                d.file("d"),
+                d.file("long-file")
+              ]),
+              d.dir("long-dir", [d.file("x")])
+            ])
+          ])
+        ]).create();
+
+        expect(list("deep/**/?/?"), completion(unorderedEquals([
+          p.join("deep", "a", "b", "c"),
+          p.join("deep", "a", "b", "c", "d")
+        ])));
+      });
+    });
+
+    group("any char", () {
+      test("matches a character", () {
+        expect(list("foo/ba?"), completion(unorderedEquals([
+          p.join("foo", "bar"),
+          p.join("foo", "baz")
+        ])));
+      });
+
+      test("doesn't match a separator", () {
+        expect(list("foo?bar"), completion(isEmpty));
+      });
+    });
+
+    group("range", () {
+      test("matches a range of characters", () {
+        expect(list("foo/ba[a-z]"), completion(unorderedEquals([
+          p.join("foo", "bar"),
+          p.join("foo", "baz")
+        ])));
+      });
+
+      test("matches a specific list of characters", () {
+        expect(list("foo/ba[rz]"), completion(unorderedEquals([
+          p.join("foo", "bar"),
+          p.join("foo", "baz")
+        ])));
+      });
+
+      test("doesn't match outside its range", () {
+        expect(list("foo/ba[a-x]"),
+            completion(unorderedEquals([p.join("foo", "bar")])));
+      });
+
+      test("doesn't match outside its specific list", () {
+        expect(list("foo/ba[rx]"),
+            completion(unorderedEquals([p.join("foo", "bar")])));
+      });
+    });
+
+    test("the same file shouldn't be non-recursively listed multiple times",
+        () {
+      d.dir("multi", [
+        d.dir("start-end", [d.file("file")])
+      ]).create();
+
+      expect(list("multi/{start-*/f*,*-end/*e}"),
+          completion(equals([p.join("multi", "start-end", "file")])));
+    });
+
+    test("the same file shouldn't be recursively listed multiple times", () {
+      d.dir("multi", [
+        d.dir("a", [
+          d.dir("b", [
+            d.file("file"),
+            d.dir("c", [
+              d.file("file")
+            ])
+          ]),
+          d.dir("x", [
+            d.dir("y", [
+              d.file("file")
+            ])
+          ])
+        ])
+      ]).create();
+
+      expect(list("multi/{*/*/*/file,a/**/file}"), completion(unorderedEquals([
+        p.join("multi", "a", "b", "file"),
+        p.join("multi", "a", "b", "c", "file"),
+        p.join("multi", "a", "x", "y", "file")
+      ])));
+    });
+
+    group("with symlinks", () {
+      setUp(() {
+        schedule(() {
+          return new Link(p.join(sandbox, "dir", "link"))
+              .create(p.join(sandbox, "foo", "baz"), recursive: true);
+        }, "symlink foo/baz to dir/link");
+      });
+
+      test("follows symlinks by default", () {
+        expect(list("dir/**"), completion(unorderedEquals([
+          p.join("dir", "link"),
+          p.join("dir", "link", "bang"),
+          p.join("dir", "link", "qux")
+        ])));
+      });
+
+      test("doesn't follow symlinks with followLinks: false", () {
+        expect(list("dir/**", followLinks: false),
+            completion(equals([p.join("dir", "link")])));
+      });
+
+      test("shouldn't crash on broken symlinks", () {
+        schedule(() {
+          return new Directory(p.join(sandbox, "foo")).delete(recursive: true);
+        });
+
+        expect(list("dir/**"), completion(equals([p.join("dir", "link")])));
+      });
+    });
+
+    test("always lists recursively with recursive: true", () {
+      expect(list("foo", recursive: true), completion(unorderedEquals([
+        "foo",
+        p.join("foo", "bar"),
+        p.join("foo", "baz"),
+        p.join("foo", "baz", "qux"),
+        p.join("foo", "baz", "bang")
+      ])));
+    });
+
+    test("lists an absolute glob", () {
+      expect(schedule(() {
+        var pattern = separatorToForwardSlash(
+            p.absolute(p.join(sandbox, 'foo/baz/**')));
+
+        return list(pattern);
+      }), completion(unorderedEquals([
+        p.join("foo", "baz", "bang"),
+        p.join("foo", "baz", "qux")
+      ])));
+    });
+
+    test("lists a subdirectory that sometimes exists", () {
+      d.dir("top", [
+        d.dir("dir1", [
+          d.dir("subdir", [d.file("file")])
+        ]),
+        d.dir("dir2", [])
+      ]).create();
+
+      expect(list("top/*/subdir/**"),
+          completion(equals([p.join("top", "dir1", "subdir", "file")])));
+    });
+  });
+}
+
+typedef Future<List<String>> ListFn(String glob,
+    {bool recursive, bool followLinks});
+
+/// Runs [callback] in two groups with two values of [listFn]: one that uses
+/// [Glob.list], one that uses [Glob.listSync].
+void syncAndAsync(callback(ListFn listFn)) {
+  group("async", () {
+    callback((glob, {recursive: false, followLinks: true}) {
+      return schedule(() {
+        return new Glob(glob, recursive: recursive)
+            .list(root: sandbox, followLinks: followLinks)
+            .map((entity) => p.relative(entity.path, from: sandbox))
+            .toList();
+      }, 'listing $glob');
+    });
+  });
+
+  group("sync", () {
+    callback((glob, {recursive: false, followLinks: true}) {
+      return schedule(() {
+        return new Glob(glob, recursive: recursive)
+            .listSync(root: sandbox, followLinks: followLinks)
+            .map((entity) => p.relative(entity.path, from: sandbox))
+            .toList();
+      }, 'listing $glob');
+    });
+  });
+}
+
+void scheduleSandbox() {
+  schedule(() {
+    return Directory.systemTemp.createTemp('glob_').then((dir) {
+      sandbox = dir.path;
+      d.defaultRoot = sandbox;
+    });
+  }, 'creating sandbox');
+
+  currentSchedule.onComplete.schedule(() {
+    d.defaultRoot = null;
+    if (sandbox == null) return null;
+    var oldSandbox = sandbox;
+    sandbox = null;
+    return new Directory(oldSandbox).delete(recursive: true);
+  });
+}
diff --git a/mojo/public/dart/third_party/glob/test/match_test.dart b/mojo/public/dart/third_party/glob/test/match_test.dart
new file mode 100644
index 0000000..90b5b7f
--- /dev/null
+++ b/mojo/public/dart/third_party/glob/test/match_test.dart
@@ -0,0 +1,294 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:glob/glob.dart';
+import 'package:glob/src/utils.dart';
+import 'package:path/path.dart' as p;
+import 'package:test/test.dart';
+
+const RAW_ASCII_WITHOUT_SLASH = "\t\n\r !\"#\$%&'()*+`-.0123456789:;<=>?@ABCDEF"
+    "GHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~";
+
+// URL-encode the path for a URL context.
+final asciiWithoutSlash = p.style == p.Style.url ?
+    Uri.encodeFull(RAW_ASCII_WITHOUT_SLASH) : RAW_ASCII_WITHOUT_SLASH;
+
+void main() {
+  test("literals match exactly", () {
+    expect("foo", contains(new Glob("foo")));
+    expect("foo/bar", contains(new Glob("foo/bar")));
+    expect("foo*", contains(new Glob(r"foo\*")));
+  });
+
+  test("backslashes match nothing on Windows", () {
+    expect(r"foo\bar",
+        isNot(contains(new Glob(r"foo\\bar", context: p.windows))));
+  });
+
+  group("star", () {
+    test("matches non-separator characters", () {
+      var glob = new Glob("*");
+      expect(asciiWithoutSlash, contains(glob));
+    });
+
+    test("matches the empty string", () {
+      expect("foo", contains(new Glob("foo*")));
+      expect("", contains(new Glob("*")));
+    });
+
+    test("doesn't match separators", () {
+      var glob = new Glob("*");
+      expect("foo/bar", isNot(contains(glob)));
+    });
+  });
+
+  group("double star", () {
+    test("matches non-separator characters", () {
+      var glob = new Glob("**");
+      expect(asciiWithoutSlash, contains(glob));
+    });
+
+    test("matches the empty string", () {
+      var glob = new Glob("foo**");
+      expect("foo", contains(glob));
+    });
+
+    test("matches any level of nesting", () {
+      var glob = new Glob("**");
+      expect("a", contains(glob));
+      expect("a/b/c/d/e/f", contains(glob));
+    });
+
+    test("doesn't match unresolved dot dots", () {
+      expect("../foo/bar", isNot(contains(new Glob("**"))));
+    });
+
+    test("matches entities containing dot dots", () {
+      expect("..foo/bar", contains(new Glob("**")));
+      expect("foo../bar", contains(new Glob("**")));
+      expect("foo/..bar", contains(new Glob("**")));
+      expect("foo/bar..", contains(new Glob("**")));
+    });
+  });
+
+  group("any char", () {
+    test("matches any non-separator character", () {
+      var glob = new Glob("foo?");
+      for (var char in RAW_ASCII_WITHOUT_SLASH.split('')) {
+        if (p.style == p.Style.url) char = Uri.encodeFull(char);
+        expect("foo$char", contains(glob));
+      }
+    });
+
+    test("doesn't match a separator", () {
+      expect("foo/bar", isNot(contains(new Glob("foo?bar"))));
+    });
+  });
+
+  group("range", () {
+    test("can match individual characters", () {
+      var glob = new Glob("foo[a<.*]");
+      expect("fooa", contains(glob));
+      expect("foo<", contains(glob));
+      expect("foo.", contains(glob));
+      expect("foo*", contains(glob));
+      expect("foob", isNot(contains(glob)));
+      expect("foo>", isNot(contains(glob)));
+    });
+
+    test("can match a range of characters", () {
+      var glob = new Glob("foo[a-z]");
+      expect("fooa", contains(glob));
+      expect("foon", contains(glob));
+      expect("fooz", contains(glob));
+      expect("foo`", isNot(contains(glob)));
+      expect("foo{", isNot(contains(glob)));
+    });
+
+    test("can match multiple ranges of characters", () {
+      var glob = new Glob("foo[a-zA-Z]");
+      expect("fooa", contains(glob));
+      expect("foon", contains(glob));
+      expect("fooz", contains(glob));
+      expect("fooA", contains(glob));
+      expect("fooN", contains(glob));
+      expect("fooZ", contains(glob));
+      expect("foo?", isNot(contains(glob)));
+      expect("foo{", isNot(contains(glob)));
+    });
+
+    test("can match individual characters and ranges of characters", () {
+      var glob = new Glob("foo[a-z_A-Z]");
+      expect("fooa", contains(glob));
+      expect("foon", contains(glob));
+      expect("fooz", contains(glob));
+      expect("fooA", contains(glob));
+      expect("fooN", contains(glob));
+      expect("fooZ", contains(glob));
+      expect("foo_", contains(glob));
+      expect("foo?", isNot(contains(glob)));
+      expect("foo{", isNot(contains(glob)));
+    });
+
+    test("can be negated", () {
+      var glob = new Glob("foo[^a<.*]");
+      expect("fooa", isNot(contains(glob)));
+      expect("foo<", isNot(contains(glob)));
+      expect("foo.", isNot(contains(glob)));
+      expect("foo*", isNot(contains(glob)));
+      expect("foob", contains(glob));
+      expect("foo>", contains(glob));
+    });
+
+    test("never matches separators", () {
+      // "\t-~" contains "/".
+      expect("foo/bar", isNot(contains(new Glob("foo[\t-~]bar"))));
+      expect("foo/bar", isNot(contains(new Glob("foo[^a]bar"))));
+    });
+
+    test("allows dangling -", () {
+      expect("-", contains(new Glob(r"[-]")));
+
+      var glob = new Glob(r"[a-]");
+      expect("-", contains(glob));
+      expect("a", contains(glob));
+
+      glob = new Glob(r"[-b]");
+      expect("-", contains(glob));
+      expect("b", contains(glob));
+    });
+
+    test("allows multiple -s", () {
+      expect("-", contains(new Glob(r"[--]")));
+      expect("-", contains(new Glob(r"[---]")));
+
+      var glob = new Glob(r"[--a]");
+      expect("-", contains(glob));
+      expect("a", contains(glob));
+    });
+
+    test("allows negated /", () {
+      expect("foo-bar", contains(new Glob("foo[^/]bar")));
+    });
+
+    test("doesn't choke on RegExp-active characters", () {
+      var glob = new Glob(r"foo[\]].*");
+      expect("foobar", isNot(contains(glob)));
+      expect("foo].*", contains(glob));
+    });
+  });
+
+  group("options", () {
+    test("match if any of the options match", () {
+      var glob = new Glob("foo/{bar,baz,bang}");
+      expect("foo/bar", contains(glob));
+      expect("foo/baz", contains(glob));
+      expect("foo/bang", contains(glob));
+      expect("foo/qux", isNot(contains(glob)));
+    });
+
+    test("can contain nested operators", () {
+      var glob = new Glob("foo/{ba?,*az,ban{g,f}}");
+      expect("foo/bar", contains(glob));
+      expect("foo/baz", contains(glob));
+      expect("foo/bang", contains(glob));
+      expect("foo/qux", isNot(contains(glob)));
+    });
+
+    test("can conditionally match separators", () {
+      var glob = new Glob("foo/{bar,baz/bang}");
+      expect("foo/bar", contains(glob));
+      expect("foo/baz/bang", contains(glob));
+      expect("foo/baz", isNot(contains(glob)));
+      expect("foo/bar/bang", isNot(contains(glob)));
+    });
+  });
+
+  group("normalization", () {
+    test("extra slashes are ignored", () {
+      expect("foo//bar", contains(new Glob("foo/bar")));
+      expect("foo/", contains(new Glob("*")));
+    });
+
+    test("dot directories are ignored", () {
+      expect("foo/./bar", contains(new Glob("foo/bar")));
+      expect("foo/.", contains(new Glob("foo")));
+    });
+
+    test("dot dot directories are resolved", () {
+      expect("foo/../bar", contains(new Glob("bar")));
+      expect("../foo/bar", contains(new Glob("../foo/bar")));
+      expect("foo/../../bar", contains(new Glob("../bar")));
+    });
+
+    test("Windows separators are converted in a Windows context", () {
+      expect(r"foo\bar", contains(new Glob("foo/bar", context: p.windows)));
+      expect(r"foo\bar/baz",
+          contains(new Glob("foo/bar/baz", context: p.windows)));
+    });
+  });
+
+  test("an absolute path can be matched by a relative glob", () {
+    var path = p.absolute('foo/bar');
+    expect(path, contains(new Glob("foo/bar")));
+  });
+
+  test("a relative path can be matched by an absolute glob", () {
+    var pattern = separatorToForwardSlash(p.absolute('foo/bar'));
+    expect('foo/bar', contains(new Glob(pattern)));
+  });
+
+  group("with recursive: true", () {
+    var glob = new Glob("foo/bar", recursive: true);
+
+    test("still matches basic files", () {
+      expect("foo/bar", contains(glob));
+    });
+
+    test("matches subfiles", () {
+      expect("foo/bar/baz", contains(glob));
+      expect("foo/bar/baz/bang", contains(glob));
+    });
+
+    test("doesn't match suffixes", () {
+      expect("foo/barbaz", isNot(contains(glob)));
+      expect("foo/barbaz/bang", isNot(contains(glob)));
+    });
+  });
+
+  test("absolute POSIX paths", () {
+    expect("/foo/bar", contains(new Glob("/foo/bar", context: p.posix)));
+    expect("/foo/bar", isNot(contains(new Glob("**", context: p.posix))));
+    expect("/foo/bar", contains(new Glob("/**", context: p.posix)));
+  });
+
+  test("absolute Windows paths", () {
+    expect(r"C:\foo\bar", contains(new Glob("C:/foo/bar", context: p.windows)));
+    expect(r"C:\foo\bar", isNot(contains(new Glob("**", context: p.windows))));
+    expect(r"C:\foo\bar", contains(new Glob("C:/**", context: p.windows)));
+
+    expect(r"\\foo\bar\baz",
+        contains(new Glob("//foo/bar/baz", context: p.windows)));
+    expect(r"\\foo\bar\baz",
+        isNot(contains(new Glob("**", context: p.windows))));
+    expect(r"\\foo\bar\baz", contains(new Glob("//**", context: p.windows)));
+    expect(r"\\foo\bar\baz",
+        contains(new Glob("//foo/**", context: p.windows)));
+  });
+
+  test("absolute URL paths", () {
+    expect(r"http://foo.com/bar",
+        contains(new Glob("http://foo.com/bar", context: p.url)));
+    expect(r"http://foo.com/bar",
+        isNot(contains(new Glob("**", context: p.url))));
+    expect(r"http://foo.com/bar",
+        contains(new Glob("http://**", context: p.url)));
+    expect(r"http://foo.com/bar",
+        contains(new Glob("http://foo.com/**", context: p.url)));
+
+    expect("/foo/bar", contains(new Glob("/foo/bar", context: p.url)));
+    expect("/foo/bar", isNot(contains(new Glob("**", context: p.url))));
+    expect("/foo/bar", contains(new Glob("/**", context: p.url)));
+  });
+}
diff --git a/mojo/public/dart/third_party/glob/test/parse_test.dart b/mojo/public/dart/third_party/glob/test/parse_test.dart
new file mode 100644
index 0000000..77dba95
--- /dev/null
+++ b/mojo/public/dart/third_party/glob/test/parse_test.dart
@@ -0,0 +1,96 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:glob/glob.dart';
+import 'package:path/path.dart' as p;
+import 'package:test/test.dart';
+
+void main() {
+  test("supports backslash-escaped characters", () {
+    expect(r"*[]{,}?()", contains(new Glob(r"\*\[\]\{\,\}\?\(\)")));
+    if (p.style != p.Style.windows) {
+      expect(r"foo\bar", contains(new Glob(r"foo\\bar")));
+    }
+  });
+
+  test("disallows an empty glob", () {
+    expect(() => new Glob(""), throwsFormatException);
+  });
+
+  group("range", () {
+    test("supports either ^ or ! for negated ranges", () {
+      var bang = new Glob("fo[!a-z]");
+      expect("foo", isNot(contains(bang)));
+      expect("fo2", contains(bang));
+
+      var caret = new Glob("fo[^a-z]");
+      expect("foo", isNot(contains(caret)));
+      expect("fo2", contains(caret));
+    });
+
+    test("supports backslash-escaped characters", () {
+      var glob = new Glob(r"fo[\*\--\]]");
+      expect("fo]", contains(glob));
+      expect("fo-", contains(glob));
+      expect("fo*", contains(glob));
+    });
+
+    test("disallows inverted ranges", () {
+      expect(() => new Glob(r"[z-a]"), throwsFormatException);
+    });
+
+    test("disallows empty ranges", () {
+      expect(() => new Glob(r"[]"), throwsFormatException);
+    });
+
+    test("disallows unclosed ranges", () {
+      expect(() => new Glob(r"[abc"), throwsFormatException);
+      expect(() => new Glob(r"[-"), throwsFormatException);
+    });
+
+    test("disallows dangling ]", () {
+      expect(() => new Glob(r"abc]"), throwsFormatException);
+    });
+
+    test("disallows explicit /", () {
+      expect(() => new Glob(r"[/]"), throwsFormatException);
+      expect(() => new Glob(r"[ -/]"), throwsFormatException);
+      expect(() => new Glob(r"[/-~]"), throwsFormatException);
+    });
+  });
+
+  group("options", () {
+    test("allows empty branches", () {
+      var glob = new Glob("foo{,bar}");
+      expect("foo", contains(glob));
+      expect("foobar", contains(glob));
+    });
+
+    test("disallows empty options", () {
+      expect(() => new Glob("{}"), throwsFormatException);
+    });
+
+    test("disallows single options", () {
+      expect(() => new Glob("{foo}"), throwsFormatException);
+    });
+
+    test("disallows unclosed options", () {
+      expect(() => new Glob("{foo,bar"), throwsFormatException);
+      expect(() => new Glob("{foo,"), throwsFormatException);
+    });
+
+    test("disallows dangling }", () {
+      expect(() => new Glob("foo}"), throwsFormatException);
+    });
+
+    test("disallows dangling ] in options", () {
+      expect(() => new Glob(r"{abc]}"), throwsFormatException);
+    });
+  });
+
+  test("disallows unescaped parens", () {
+    expect(() => new Glob("foo(bar"), throwsFormatException);
+    expect(() => new Glob("foo)bar"), throwsFormatException);
+  });
+}
diff --git a/mojo/public/dart/third_party/html/.gitignore b/mojo/public/dart/third_party/html/.gitignore
new file mode 100644
index 0000000..e979170
--- /dev/null
+++ b/mojo/public/dart/third_party/html/.gitignore
@@ -0,0 +1,17 @@
+# Don’t commit the following directories created by pub.
+.pub
+build/
+packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.dart.precompiled.js
+*.js_
+*.js.deps
+*.js.map
+*.sw?
+.idea/
+.pub/
+
+# Include when developing application packages.
+pubspec.lock
diff --git a/mojo/public/dart/third_party/html/.status b/mojo/public/dart/third_party/html/.status
new file mode 100644
index 0000000..3bfc352
--- /dev/null
+++ b/mojo/public/dart/third_party/html/.status
@@ -0,0 +1,28 @@
+# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Don't run any test-like files that show up in packages directories. It
+# shouldn't be necessary to run "pub install" in these packages, but if you do
+# it shouldn't break the tests.
+*/packages/*/*: Skip
+*/*/packages/*/*: Skip
+*/*/*/packages/*/*: Skip
+*/*/*/*/packages/*/*: Skip
+*/*/*/*/*/packages/*/*: Skip
+
+build/*: Skip  # nothing requires pub-build
+
+[ $runtime == vm && $mode == debug]
+test/tokenizer_test: Skip  # Times out
+
+[ $runtime == vm && ( $arch == simarm || $arch == simmips ) ]
+test/tokenizer_test: Pass, Slow
+
+[ $browser ]
+test/parser_test: Skip
+test/tokenizer_test: Skip
+test/selectors/*: Skip
+
+[ $runtime == vm ]
+test/browser/browser_test: Skip
diff --git a/mojo/public/dart/third_party/html/CHANGELOG.md b/mojo/public/dart/third_party/html/CHANGELOG.md
new file mode 100644
index 0000000..588c735
--- /dev/null
+++ b/mojo/public/dart/third_party/html/CHANGELOG.md
@@ -0,0 +1,33 @@
+# changelog
+
+This file contains highlights of what changes on each version of the html
+package.
+
+#### Pub version 0.12.2
+  * Added `Element.endSourceSpan`, containing the span of a closing tag.
+
+#### Pub version 0.12.0+1
+  * Support `csslib` version `0.12.0`.
+
+#### Rename to package:html 0.12.0
+  * package has been renamed to `html`
+
+#### Pub version 0.12.0
+  * switch from `source_maps`' `Span` class to `source_span`'s
+    `SourceSpan` class.
+
+#### Pub version 0.11.0+2
+  * expand the version constraint for csslib.
+
+#### Pub version 0.10.0+1
+  * use a more recent source_maps version.
+
+#### Pub version 0.10.0
+  * fix how document fragments are added in NodeList.add/addAll/insertAll.
+
+#### Pub version 0.9.2-dev
+  * add Node.text, Node.append, Document.documentElement
+  * add Text.data, deprecate Node.value and Text.value.
+  * deprecate Node.$dom_nodeType
+  * added querySelector/querySelectorAll, deprecated query/queryAll.
+    This matches the current APIs in dart:html.
diff --git a/mojo/public/dart/third_party/html/LICENSE b/mojo/public/dart/third_party/html/LICENSE
new file mode 100644
index 0000000..d5ee641
--- /dev/null
+++ b/mojo/public/dart/third_party/html/LICENSE
@@ -0,0 +1,23 @@
+Copyright (c) 2006-2012 The Authors
+
+Contributors:
+James Graham - jg307@cam.ac.uk
+Anne van Kesteren - annevankesteren@gmail.com
+Lachlan Hunt - lachlan.hunt@lachy.id.au
+Matt McDonald - kanashii@kanashii.ca
+Sam Ruby - rubys@intertwingly.net
+Ian Hickson (Google) - ian@hixie.ch
+Thomas Broyer - t.broyer@ltgt.net
+Jacques Distler - distler@golem.ph.utexas.edu
+Henri Sivonen - hsivonen@iki.fi
+Adam Barth - abarth@webkit.org
+Eric Seidel - eric@webkit.org
+The Mozilla Foundation (contributions from Henri Sivonen since 2008)
+David Flanagan (Mozilla) - dflanagan@mozilla.com
+Google Inc. (contributed the Dart port) - misc@dartlang.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/mojo/public/dart/third_party/html/README.md b/mojo/public/dart/third_party/html/README.md
new file mode 100644
index 0000000..27db3ce
--- /dev/null
+++ b/mojo/public/dart/third_party/html/README.md
@@ -0,0 +1,55 @@
+html5 parser in dart
+====================
+
+This is a pure [Dart][dart] [html5 parser][html5parse]. It's a port of
+[html5lib](https://github.com/html5lib/html5lib-python) from Python. Since it's 100%
+Dart you can use it safely from a script or server side app.
+
+Eventually the parse tree API will be compatible with [dart:html][d_html], so
+the same code will work on the client and the server.
+
+(Formerly known as _html5lib_.)
+
+Installation
+------------
+
+Add this to your `pubspec.yaml` (or create it):
+```yaml
+dependencies:
+  html: any
+```
+Then run the [Pub Package Manager][pub] (comes with the Dart SDK):
+
+    pub install
+
+Usage
+-----
+
+Parsing HTML is easy!
+```dart
+import 'package:html/parser.dart' show parse;
+import 'package:html/dom.dart';
+
+main() {
+  var document = parse(
+      '<body>Hello world! <a href="www.html5rocks.com">HTML5 rocks!');
+  print(document.outerHtml);
+}
+```
+
+You can pass a String or list of bytes to `parse`.
+There's also `parseFragment` for parsing a document fragment, and `HtmlParser`
+if you want more low level control.
+
+Running Tests
+-------------
+
+```bash
+./test/run.sh
+```
+
+[dart]: http://www.dartlang.org/
+[html5parse]: http://dev.w3.org/html5/spec/parsing.html
+[d_html]: http://api.dartlang.org/docs/continuous/dart_html.html
+[files]: http://html5lib.googlecode.com/hg/python/html5lib/
+[pub]: http://www.dartlang.org/docs/pub-package-manager/
diff --git a/mojo/public/dart/third_party/html/codereview.settings b/mojo/public/dart/third_party/html/codereview.settings
new file mode 100644
index 0000000..caca72f
--- /dev/null
+++ b/mojo/public/dart/third_party/html/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: http://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/html/commit/
+CC_LIST: reviews@dartlang.org
diff --git a/mojo/public/dart/third_party/html/lib/dom.dart b/mojo/public/dart/third_party/html/lib/dom.dart
new file mode 100644
index 0000000..9e64759
--- /dev/null
+++ b/mojo/public/dart/third_party/html/lib/dom.dart
@@ -0,0 +1,1004 @@
+/// A simple tree API that results from parsing html. Intended to be compatible
+/// with dart:html, but it is missing many types and APIs.
+library dom;
+
+// TODO(jmesserly): lots to do here. Originally I wanted to generate this using
+// our Blink IDL generator, but another idea is to directly use the excellent
+// http://dom.spec.whatwg.org/ and http://html.spec.whatwg.org/ and just
+// implement that.
+
+import 'dart:collection';
+import 'package:source_span/source_span.dart';
+
+import 'src/constants.dart';
+import 'src/css_class_set.dart';
+import 'src/list_proxy.dart';
+import 'src/query_selector.dart' as query;
+import 'src/token.dart';
+import 'src/tokenizer.dart';
+import 'dom_parsing.dart';
+import 'parser.dart';
+
+export 'src/css_class_set.dart' show CssClassSet;
+
+// TODO(jmesserly): this needs to be replaced by an AttributeMap for attributes
+// that exposes namespace info.
+class AttributeName implements Comparable {
+  /// The namespace prefix, e.g. `xlink`.
+  final String prefix;
+
+  /// The attribute name, e.g. `title`.
+  final String name;
+
+  /// The namespace url, e.g. `http://www.w3.org/1999/xlink`
+  final String namespace;
+
+  const AttributeName(this.prefix, this.name, this.namespace);
+
+  String toString() {
+    // Implement:
+    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#serializing-html-fragments
+    // If we get here we know we are xml, xmlns, or xlink, because of
+    // [HtmlParser.adjustForeignAttriubtes] is the only place we create
+    // an AttributeName.
+    return prefix != null ? '$prefix:$name' : name;
+  }
+
+  int get hashCode {
+    int h = prefix.hashCode;
+    h = 37 * (h & 0x1FFFFF) + name.hashCode;
+    h = 37 * (h & 0x1FFFFF) + namespace.hashCode;
+    return h & 0x3FFFFFFF;
+  }
+
+  int compareTo(other) {
+    // Not sure about this sort order
+    if (other is! AttributeName) return 1;
+    int cmp = (prefix != null ? prefix : "")
+        .compareTo((other.prefix != null ? other.prefix : ""));
+    if (cmp != 0) return cmp;
+    cmp = name.compareTo(other.name);
+    if (cmp != 0) return cmp;
+    return namespace.compareTo(other.namespace);
+  }
+
+  bool operator ==(x) {
+    if (x is! AttributeName) return false;
+    return prefix == x.prefix && name == x.name && namespace == x.namespace;
+  }
+}
+
+// http://dom.spec.whatwg.org/#parentnode
+abstract class _ParentNode implements Node {
+  // TODO(jmesserly): this is only a partial implementation
+
+  /// Seaches for the first descendant node matching the given selectors, using
+  /// a preorder traversal.
+  ///
+  /// NOTE: Not all selectors from
+  /// [selectors level 4](http://dev.w3.org/csswg/selectors-4/)
+  /// are implemented. For example, nth-child does not implement An+B syntax
+  /// and *-of-type is not implemented. If a selector is not implemented this
+  /// method will throw [UniplmentedError].
+  Element querySelector(String selector) => query.querySelector(this, selector);
+
+  /// Returns all descendant nodes matching the given selectors, using a
+  /// preorder traversal.
+  ///
+  /// NOTE: Not all selectors from
+  /// [selectors level 4](http://dev.w3.org/csswg/selectors-4/)
+  /// are implemented. For example, nth-child does not implement An+B syntax
+  /// and *-of-type is not implemented. If a selector is not implemented this
+  /// method will throw [UniplmentedError].
+  List<Element> querySelectorAll(String selector) =>
+      query.querySelectorAll(this, selector);
+}
+
+// http://dom.spec.whatwg.org/#interface-nonelementparentnode
+abstract class _NonElementParentNode implements _ParentNode {
+  // TODO(jmesserly): could be faster, should throw on invalid id.
+  Element getElementById(String id) => querySelector('#$id');
+}
+
+// This doesn't exist as an interface in the spec, but it's useful to merge
+// common methods from these:
+// http://dom.spec.whatwg.org/#interface-document
+// http://dom.spec.whatwg.org/#element
+abstract class _ElementAndDocument implements _ParentNode {
+  // TODO(jmesserly): could be faster, should throw on invalid tag/class names.
+
+  List<Element> getElementsByTagName(String localName) =>
+      querySelectorAll(localName);
+
+  List<Element> getElementsByClassName(String classNames) => querySelectorAll(
+      classNames.splitMapJoin(' ',
+          onNonMatch: (m) => m.isNotEmpty ? '.$m' : m, onMatch: (m) => ''));
+}
+
+/// Really basic implementation of a DOM-core like Node.
+abstract class Node {
+  static const int ATTRIBUTE_NODE = 2;
+  static const int CDATA_SECTION_NODE = 4;
+  static const int COMMENT_NODE = 8;
+  static const int DOCUMENT_FRAGMENT_NODE = 11;
+  static const int DOCUMENT_NODE = 9;
+  static const int DOCUMENT_TYPE_NODE = 10;
+  static const int ELEMENT_NODE = 1;
+  static const int ENTITY_NODE = 6;
+  static const int ENTITY_REFERENCE_NODE = 5;
+  static const int NOTATION_NODE = 12;
+  static const int PROCESSING_INSTRUCTION_NODE = 7;
+  static const int TEXT_NODE = 3;
+
+  /// The parent of the current node (or null for the document node).
+  Node parentNode;
+
+  /// The parent element of this node.
+  ///
+  /// Returns null if this node either does not have a parent or its parent is
+  /// not an element.
+  Element get parent => parentNode is Element ? parentNode : null;
+
+  // TODO(jmesserly): should move to Element.
+  /// A map holding name, value pairs for attributes of the node.
+  ///
+  /// Note that attribute order needs to be stable for serialization, so we use
+  /// a LinkedHashMap. Each key is a [String] or [AttributeName].
+  LinkedHashMap<dynamic, String> attributes = new LinkedHashMap();
+
+  /// A list of child nodes of the current node. This must
+  /// include all elements but not necessarily other node types.
+  final NodeList nodes = new NodeList._();
+
+  List<Element> _elements;
+
+  // TODO(jmesserly): consider using an Expando for this, and put it in
+  // dom_parsing. Need to check the performance affect.
+  /// The source span of this node, if it was created by the [HtmlParser].
+  FileSpan sourceSpan;
+
+  /// The attribute spans if requested. Otherwise null.
+  LinkedHashMap<dynamic, FileSpan> _attributeSpans;
+  LinkedHashMap<dynamic, FileSpan> _attributeValueSpans;
+
+  Node._() {
+    nodes._parent = this;
+  }
+
+  /// If [sourceSpan] is available, this contains the spans of each attribute.
+  /// The span of an attribute is the entire attribute, including the name and
+  /// quotes (if any). For example, the span of "attr" in `<a attr="value">`
+  /// would be the text `attr="value"`.
+  LinkedHashMap<dynamic, FileSpan> get attributeSpans {
+    _ensureAttributeSpans();
+    return _attributeSpans;
+  }
+
+  /// If [sourceSpan] is available, this contains the spans of each attribute's
+  /// value. Unlike [attributeSpans], this span will inlcude only the value.
+  /// For example, the value span of "attr" in `<a attr="value">` would be the
+  /// text `value`.
+  LinkedHashMap<dynamic, FileSpan> get attributeValueSpans {
+    _ensureAttributeSpans();
+    return _attributeValueSpans;
+  }
+
+  List<Element> get children {
+    if (_elements == null) {
+      _elements = new FilteredElementList(this);
+    }
+    return _elements;
+  }
+
+  /// Returns a copy of this node.
+  ///
+  /// If [deep] is `true`, then all of this node's children and decendents are
+  /// copied as well. If [deep] is `false`, then only this node is copied.
+  Node clone(bool deep);
+
+  int get nodeType;
+
+  // http://domparsing.spec.whatwg.org/#extensions-to-the-element-interface
+  String get _outerHtml {
+    var str = new StringBuffer();
+    _addOuterHtml(str);
+    return str.toString();
+  }
+
+  String get _innerHtml {
+    var str = new StringBuffer();
+    _addInnerHtml(str);
+    return str.toString();
+  }
+
+  // Implemented per: http://dom.spec.whatwg.org/#dom-node-textcontent
+  String get text => null;
+  set text(String value) {}
+
+  void append(Node node) => nodes.add(node);
+
+  Node get firstChild => nodes.isNotEmpty ? nodes[0] : null;
+
+  void _addOuterHtml(StringBuffer str);
+
+  void _addInnerHtml(StringBuffer str) {
+    for (Node child in nodes) child._addOuterHtml(str);
+  }
+
+  Node remove() {
+    // TODO(jmesserly): is parent == null an error?
+    if (parentNode != null) {
+      parentNode.nodes.remove(this);
+    }
+    return this;
+  }
+
+  /// Insert [node] as a child of the current node, before [refNode] in the
+  /// list of child nodes. Raises [UnsupportedOperationException] if [refNode]
+  /// is not a child of the current node. If refNode is null, this adds to the
+  /// end of the list.
+  void insertBefore(Node node, Node refNode) {
+    if (refNode == null) {
+      nodes.add(node);
+    } else {
+      nodes.insert(nodes.indexOf(refNode), node);
+    }
+  }
+
+  /// Replaces this node with another node.
+  Node replaceWith(Node otherNode) {
+    if (parentNode == null) {
+      throw new UnsupportedError('Node must have a parent to replace it.');
+    }
+    parentNode.nodes[parentNode.nodes.indexOf(this)] = otherNode;
+    return this;
+  }
+
+  // TODO(jmesserly): should this be a property or remove?
+  /// Return true if the node has children or text.
+  bool hasContent() => nodes.length > 0;
+
+  /// Move all the children of the current node to [newParent].
+  /// This is needed so that trees that don't store text as nodes move the
+  /// text in the correct way.
+  void reparentChildren(Node newParent) {
+    newParent.nodes.addAll(nodes);
+    nodes.clear();
+  }
+
+  bool hasChildNodes() => !nodes.isEmpty;
+
+  bool contains(Node node) => nodes.contains(node);
+
+  /// Initialize [attributeSpans] using [sourceSpan].
+  void _ensureAttributeSpans() {
+    if (_attributeSpans != null) return;
+
+    _attributeSpans = new LinkedHashMap<dynamic, FileSpan>();
+    _attributeValueSpans = new LinkedHashMap<dynamic, FileSpan>();
+
+    if (sourceSpan == null) return;
+
+    var tokenizer = new HtmlTokenizer(sourceSpan.text,
+        generateSpans: true, attributeSpans: true);
+
+    tokenizer.moveNext();
+    var token = tokenizer.current as StartTagToken;
+
+    if (token.attributeSpans == null) return; // no attributes
+
+    for (var attr in token.attributeSpans) {
+      var offset = sourceSpan.start.offset;
+      _attributeSpans[attr.name] =
+          sourceSpan.file.span(offset + attr.start, offset + attr.end);
+      if (attr.startValue != null) {
+        _attributeValueSpans[attr.name] = sourceSpan.file.span(
+            offset + attr.startValue, offset + attr.endValue);
+      }
+    }
+  }
+
+  _clone(Node shallowClone, bool deep) {
+    if (deep) {
+      for (var child in nodes) {
+        shallowClone.append(child.clone(true));
+      }
+    }
+    return shallowClone;
+  }
+}
+
+class Document extends Node
+    with _ParentNode, _NonElementParentNode, _ElementAndDocument {
+  Document() : super._();
+  factory Document.html(String html) => parse(html);
+
+  int get nodeType => Node.DOCUMENT_NODE;
+
+  // TODO(jmesserly): optmize this if needed
+  Element get documentElement => querySelector('html');
+  Element get head => documentElement.querySelector('head');
+  Element get body => documentElement.querySelector('body');
+
+  /// Returns a fragment of HTML or XML that represents the element and its
+  /// contents.
+  // TODO(jmesserly): this API is not specified in:
+  // <http://domparsing.spec.whatwg.org/> nor is it in dart:html, instead
+  // only Element has outerHtml. However it is quite useful. Should we move it
+  // to dom_parsing, where we keep other custom APIs?
+  String get outerHtml => _outerHtml;
+
+  String toString() => "#document";
+
+  void _addOuterHtml(StringBuffer str) => _addInnerHtml(str);
+
+  Document clone(bool deep) => _clone(new Document(), deep);
+
+  Element createElement(String tag) => new Element.tag(tag);
+
+  // TODO(jmesserly): this is only a partial implementation of:
+  // http://dom.spec.whatwg.org/#dom-document-createelementns
+  Element createElementNS(String namespaceUri, String tag) {
+    if (namespaceUri == '') namespaceUri = null;
+    return new Element._(tag, namespaceUri);
+  }
+
+  DocumentFragment createDocumentFragment() => new DocumentFragment();
+}
+
+class DocumentFragment extends Node with _ParentNode, _NonElementParentNode {
+  DocumentFragment() : super._();
+  factory DocumentFragment.html(String html) => parseFragment(html);
+
+  int get nodeType => Node.DOCUMENT_FRAGMENT_NODE;
+
+  /// Returns a fragment of HTML or XML that represents the element and its
+  /// contents.
+  // TODO(jmesserly): this API is not specified in:
+  // <http://domparsing.spec.whatwg.org/> nor is it in dart:html, instead
+  // only Element has outerHtml. However it is quite useful. Should we move it
+  // to dom_parsing, where we keep other custom APIs?
+  String get outerHtml => _outerHtml;
+
+  String toString() => "#document-fragment";
+
+  DocumentFragment clone(bool deep) => _clone(new DocumentFragment(), deep);
+
+  void _addOuterHtml(StringBuffer str) => _addInnerHtml(str);
+
+  String get text => _getText(this);
+  set text(String value) => _setText(this, value);
+}
+
+class DocumentType extends Node {
+  final String name;
+  final String publicId;
+  final String systemId;
+
+  DocumentType(String name, this.publicId, this.systemId)
+      // Note: once Node.tagName is removed, don't pass "name" to super
+      : name = name,
+        super._();
+
+  int get nodeType => Node.DOCUMENT_TYPE_NODE;
+
+  String toString() {
+    if (publicId != null || systemId != null) {
+      // TODO(jmesserly): the html5 serialization spec does not add these. But
+      // it seems useful, and the parser can handle it, so for now keeping it.
+      var pid = publicId != null ? publicId : '';
+      var sid = systemId != null ? systemId : '';
+      return '<!DOCTYPE $name "$pid" "$sid">';
+    } else {
+      return '<!DOCTYPE $name>';
+    }
+  }
+
+  void _addOuterHtml(StringBuffer str) {
+    str.write(toString());
+  }
+
+  DocumentType clone(bool deep) => new DocumentType(name, publicId, systemId);
+}
+
+class Text extends Node {
+  /// The text node's data, stored as either a String or StringBuffer.
+  /// We support storing a StringBuffer here to support fast [appendData].
+  /// It will flatten back to a String on read.
+  var _data;
+
+  Text(String data) : _data = data != null ? data : '', super._();
+
+  int get nodeType => Node.TEXT_NODE;
+
+  String get data => _data = _data.toString();
+  set data(String value) {
+    _data = value != null ? value : '';
+  }
+
+  String toString() => '"$data"';
+
+  void _addOuterHtml(StringBuffer str) => writeTextNodeAsHtml(str, this);
+
+  Text clone(bool deep) => new Text(data);
+
+  void appendData(String data) {
+    if (_data is! StringBuffer) _data = new StringBuffer(_data);
+    StringBuffer sb = _data;
+    sb.write(data);
+  }
+
+  String get text => data;
+  set text(String value) {
+    data = value;
+  }
+}
+
+// TODO(jmesserly): Elements should have a pointer back to their document
+class Element extends Node with _ParentNode, _ElementAndDocument {
+  final String namespaceUri;
+
+  /// The [local name](http://dom.spec.whatwg.org/#concept-element-local-name)
+  /// of this element.
+  final String localName;
+
+  // TODO(jmesserly): consider using an Expando for this, and put it in
+  // dom_parsing. Need to check the performance affect.
+  /// The source span of the end tag this element, if it was created by the
+  /// [HtmlParser]. May be `null` if does not have an implicit end tag.
+  FileSpan endSourceSpan;
+
+  Element._(this.localName, [this.namespaceUri]) : super._();
+
+  Element.tag(this.localName)
+      : namespaceUri = Namespaces.html,
+        super._();
+
+  static final _START_TAG_REGEXP = new RegExp('<(\\w+)');
+
+  static final _CUSTOM_PARENT_TAG_MAP = const {
+    'body': 'html',
+    'head': 'html',
+    'caption': 'table',
+    'td': 'tr',
+    'colgroup': 'table',
+    'col': 'colgroup',
+    'tr': 'tbody',
+    'tbody': 'table',
+    'tfoot': 'table',
+    'thead': 'table',
+    'track': 'audio',
+  };
+
+  // TODO(jmesserly): this is from dart:html _ElementFactoryProvider...
+  // TODO(jmesserly): have a look at fixing some things in dart:html, in
+  // particular: is the parent tag map complete? Is it faster without regexp?
+  // TODO(jmesserly): for our version we can do something smarter in the parser.
+  // All we really need is to set the correct parse state.
+  factory Element.html(String html) {
+
+    // TODO(jacobr): this method can be made more robust and performant.
+    // 1) Cache the dummy parent elements required to use innerHTML rather than
+    //    creating them every call.
+    // 2) Verify that the html does not contain leading or trailing text nodes.
+    // 3) Verify that the html does not contain both <head> and <body> tags.
+    // 4) Detatch the created element from its dummy parent.
+    String parentTag = 'div';
+    String tag;
+    final match = _START_TAG_REGEXP.firstMatch(html);
+    if (match != null) {
+      tag = match.group(1).toLowerCase();
+      if (_CUSTOM_PARENT_TAG_MAP.containsKey(tag)) {
+        parentTag = _CUSTOM_PARENT_TAG_MAP[tag];
+      }
+    }
+
+    var fragment = parseFragment(html, container: parentTag);
+    Element element;
+    if (fragment.children.length == 1) {
+      element = fragment.children[0];
+    } else if (parentTag == 'html' && fragment.children.length == 2) {
+      // You'll always get a head and a body when starting from html.
+      element = fragment.children[tag == 'head' ? 0 : 1];
+    } else {
+      throw new ArgumentError('HTML had ${fragment.children.length} '
+          'top level elements but 1 expected');
+    }
+    element.remove();
+    return element;
+  }
+
+  int get nodeType => Node.ELEMENT_NODE;
+
+  // TODO(jmesserly): we can make this faster
+  Element get previousElementSibling {
+    if (parentNode == null) return null;
+    var siblings = parentNode.nodes;
+    for (int i = siblings.indexOf(this) - 1; i >= 0; i--) {
+      var s = siblings[i];
+      if (s is Element) return s;
+    }
+    return null;
+  }
+
+  Element get nextElementSibling {
+    if (parentNode == null) return null;
+    var siblings = parentNode.nodes;
+    for (int i = siblings.indexOf(this) + 1; i < siblings.length; i++) {
+      var s = siblings[i];
+      if (s is Element) return s;
+    }
+    return null;
+  }
+
+  String toString() {
+    var prefix = Namespaces.getPrefix(namespaceUri);
+    return "<${prefix == null ? '' : '$prefix '}$localName>";
+  }
+
+  String get text => _getText(this);
+  set text(String value) => _setText(this, value);
+
+  /// Returns a fragment of HTML or XML that represents the element and its
+  /// contents.
+  String get outerHtml => _outerHtml;
+
+  /// Returns a fragment of HTML or XML that represents the element's contents.
+  /// Can be set, to replace the contents of the element with nodes parsed from
+  /// the given string.
+  String get innerHtml => _innerHtml;
+  // TODO(jmesserly): deprecate in favor of:
+  // <https://api.dartlang.org/apidocs/channels/stable/#dart-dom-html.Element@id_setInnerHtml>
+  set innerHtml(String value) {
+    nodes.clear();
+    // TODO(jmesserly): should be able to get the same effect by adding the
+    // fragment directly.
+    nodes.addAll(parseFragment(value, container: localName).nodes);
+  }
+
+  void _addOuterHtml(StringBuffer str) {
+    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#serializing-html-fragments
+    // Element is the most complicated one.
+    str.write('<');
+    str.write(_getSerializationPrefix(namespaceUri));
+    str.write(localName);
+
+    if (attributes.length > 0) {
+      attributes.forEach((key, v) {
+        // Note: AttributeName.toString handles serialization of attribute
+        // namespace, if needed.
+        str.write(' ');
+        str.write(key);
+        str.write('="');
+        str.write(htmlSerializeEscape(v, attributeMode: true));
+        str.write('"');
+      });
+    }
+
+    str.write('>');
+
+    if (nodes.length > 0) {
+      if (localName == 'pre' ||
+          localName == 'textarea' ||
+          localName == 'listing') {
+        final first = nodes[0];
+        if (first is Text && first.data.startsWith('\n')) {
+          // These nodes will remove a leading \n at parse time, so if we still
+          // have one, it means we started with two. Add it back.
+          str.write('\n');
+        }
+      }
+
+      _addInnerHtml(str);
+    }
+
+    // void elements must not have an end tag
+    // http://dev.w3.org/html5/markup/syntax.html#void-elements
+    if (!isVoidElement(localName)) str.write('</$localName>');
+  }
+
+  static String _getSerializationPrefix(String uri) {
+    if (uri == null ||
+        uri == Namespaces.html ||
+        uri == Namespaces.mathml ||
+        uri == Namespaces.svg) {
+      return '';
+    }
+    var prefix = Namespaces.getPrefix(uri);
+    // TODO(jmesserly): the spec doesn't define "qualified name".
+    // I'm not sure if this is correct, but it should parse reasonably.
+    return prefix == null ? '' : '$prefix:';
+  }
+
+  Element clone(bool deep) {
+    var result = new Element._(localName, namespaceUri)
+      ..attributes = new LinkedHashMap.from(attributes);
+    return _clone(result, deep);
+  }
+
+  // http://dom.spec.whatwg.org/#dom-element-id
+  String get id {
+    var result = attributes['id'];
+    return result != null ? result : '';
+  }
+
+  set id(String value) {
+    attributes['id'] = '$value';
+  }
+
+  // http://dom.spec.whatwg.org/#dom-element-classname
+  String get className {
+    var result = attributes['class'];
+    return result != null ? result : '';
+  }
+
+  set className(String value) {
+    attributes['class'] = '$value';
+  }
+
+  /**
+   * The set of CSS classes applied to this element.
+   *
+   * This set makes it easy to add, remove or toggle the classes applied to
+   * this element.
+   *
+   *     element.classes.add('selected');
+   *     element.classes.toggle('isOnline');
+   *     element.classes.remove('selected');
+   */
+  CssClassSet get classes => new ElementCssClassSet(this);
+}
+
+class Comment extends Node {
+  String data;
+
+  Comment(this.data) : super._();
+
+  int get nodeType => Node.COMMENT_NODE;
+
+  String toString() => "<!-- $data -->";
+
+  void _addOuterHtml(StringBuffer str) {
+    str.write("<!--$data-->");
+  }
+
+  Comment clone(bool deep) => new Comment(data);
+
+  String get text => data;
+  set text(String value) {
+    this.data = value;
+  }
+}
+
+// TODO(jmesserly): fix this to extend one of the corelib classes if possible.
+// (The requirement to remove the node from the old node list makes it tricky.)
+// TODO(jmesserly): is there any way to share code with the _NodeListImpl?
+class NodeList extends ListProxy<Node> {
+  // Note: this is conceptually final, but because of circular reference
+  // between Node and NodeList we initialize it after construction.
+  Node _parent;
+
+  NodeList._();
+
+  Node get first => this[0];
+
+  Node _setParent(Node node) {
+    // Note: we need to remove the node from its previous parent node, if any,
+    // before updating its parent pointer to point at our parent.
+    node.remove();
+    node.parentNode = _parent;
+    return node;
+  }
+
+  void add(Node value) {
+    if (value is DocumentFragment) {
+      addAll(value.nodes);
+    } else {
+      super.add(_setParent(value));
+    }
+  }
+
+  void addLast(Node value) => add(value);
+
+  void addAll(Iterable<Node> collection) {
+    // Note: we need to be careful if collection is another NodeList.
+    // In particular:
+    //   1. we need to copy the items before updating their parent pointers,
+    //     _flattenDocFragments does a copy internally.
+    //   2. we should update parent pointers in reverse order. That way they
+    //      are removed from the original NodeList (if any) from the end, which
+    //      is faster.
+    var list = _flattenDocFragments(collection);
+    for (var node in list.reversed) _setParent(node);
+    super.addAll(list);
+  }
+
+  void insert(int index, Node value) {
+    if (value is DocumentFragment) {
+      insertAll(index, value.nodes);
+    } else {
+      super.insert(index, _setParent(value));
+    }
+  }
+
+  Node removeLast() => super.removeLast()..parentNode = null;
+
+  Node removeAt(int i) => super.removeAt(i)..parentNode = null;
+
+  void clear() {
+    for (var node in this) node.parentNode = null;
+    super.clear();
+  }
+
+  void operator []=(int index, Node value) {
+    if (value is DocumentFragment) {
+      removeAt(index);
+      insertAll(index, value.nodes);
+    } else {
+      this[index].parentNode = null;
+      super[index] = _setParent(value);
+    }
+  }
+
+  // TODO(jmesserly): These aren't implemented in DOM _NodeListImpl, see
+  // http://code.google.com/p/dart/issues/detail?id=5371
+  void setRange(int start, int rangeLength, List<Node> from,
+      [int startFrom = 0]) {
+    if (from is NodeList) {
+      // Note: this is presumed to make a copy
+      from = from.sublist(startFrom, startFrom + rangeLength);
+    }
+    // Note: see comment in [addAll]. We need to be careful about the order of
+    // operations if [from] is also a NodeList.
+    for (int i = rangeLength - 1; i >= 0; i--) {
+      this[start + i] = from[startFrom + i];
+    }
+  }
+
+  void replaceRange(int start, int end, Iterable<Node> newContents) {
+    removeRange(start, end);
+    insertAll(start, newContents);
+  }
+
+  void removeRange(int start, int rangeLength) {
+    for (int i = start; i < rangeLength; i++) this[i].parentNode = null;
+    super.removeRange(start, rangeLength);
+  }
+
+  void removeWhere(bool test(Element e)) {
+    for (var node in where(test)) {
+      node.parentNode = null;
+    }
+    super.removeWhere(test);
+  }
+
+  void retainWhere(bool test(Element e)) {
+    for (var node in where((n) => !test(n))) {
+      node.parentNode = null;
+    }
+    super.retainWhere(test);
+  }
+
+  void insertAll(int index, Iterable<Node> collection) {
+    // Note: we need to be careful how we copy nodes. See note in addAll.
+    var list = _flattenDocFragments(collection);
+    for (var node in list.reversed) _setParent(node);
+    super.insertAll(index, list);
+  }
+
+  _flattenDocFragments(Iterable<Node> collection) {
+    // Note: this function serves two purposes:
+    //  * it flattens document fragments
+    //  * it creates a copy of [collections] when `collection is NodeList`.
+    var result = [];
+    for (var node in collection) {
+      if (node is DocumentFragment) {
+        result.addAll(node.nodes);
+      } else {
+        result.add(node);
+      }
+    }
+    return result;
+  }
+}
+
+/// An indexable collection of a node's descendants in the document tree,
+/// filtered so that only elements are in the collection.
+// TODO(jmesserly): this was copied from dart:html
+// TODO(jmesserly): "implements List<Element>" is a workaround for analyzer bug.
+class FilteredElementList extends IterableBase<Element> with ListMixin<Element>
+    implements List<Element> {
+  final Node _node;
+  final List<Node> _childNodes;
+
+  /// Creates a collection of the elements that descend from a node.
+  ///
+  /// Example usage:
+  ///
+  ///     var filteredElements = new FilteredElementList(query("#container"));
+  ///     // filteredElements is [a, b, c].
+  FilteredElementList(Node node)
+      : _childNodes = node.nodes,
+        _node = node;
+
+  // We can't memoize this, since it's possible that children will be messed
+  // with externally to this class.
+  //
+  // TODO(nweiz): we don't always need to create a new list. For example
+  // forEach, every, any, ... could directly work on the _childNodes.
+  List<Element> get _filtered =>
+      new List<Element>.from(_childNodes.where((n) => n is Element));
+
+  void forEach(void f(Element element)) {
+    _filtered.forEach(f);
+  }
+
+  void operator []=(int index, Element value) {
+    this[index].replaceWith(value);
+  }
+
+  void set length(int newLength) {
+    final len = this.length;
+    if (newLength >= len) {
+      return;
+    } else if (newLength < 0) {
+      throw new ArgumentError("Invalid list length");
+    }
+
+    removeRange(newLength, len);
+  }
+
+  String join([String separator = ""]) => _filtered.join(separator);
+
+  void add(Element value) {
+    _childNodes.add(value);
+  }
+
+  void addAll(Iterable<Element> iterable) {
+    for (Element element in iterable) {
+      add(element);
+    }
+  }
+
+  bool contains(Element element) {
+    return element is Element && _childNodes.contains(element);
+  }
+
+  Iterable<Element> get reversed => _filtered.reversed;
+
+  void sort([int compare(Element a, Element b)]) {
+    throw new UnsupportedError('TODO(jacobr): should we impl?');
+  }
+
+  void setRange(int start, int end, Iterable<Element> iterable,
+      [int skipCount = 0]) {
+    throw new UnimplementedError();
+  }
+
+  void fillRange(int start, int end, [Element fillValue]) {
+    throw new UnimplementedError();
+  }
+
+  void replaceRange(int start, int end, Iterable<Element> iterable) {
+    throw new UnimplementedError();
+  }
+
+  void removeRange(int start, int end) {
+    _filtered.sublist(start, end).forEach((el) => el.remove());
+  }
+
+  void clear() {
+    // Currently, ElementList#clear clears even non-element nodes, so we follow
+    // that behavior.
+    _childNodes.clear();
+  }
+
+  Element removeLast() {
+    final result = this.last;
+    if (result != null) {
+      result.remove();
+    }
+    return result;
+  }
+
+  Iterable map(f(Element element)) => _filtered.map(f);
+  Iterable<Element> where(bool f(Element element)) => _filtered.where(f);
+  Iterable expand(Iterable f(Element element)) => _filtered.expand(f);
+
+  void insert(int index, Element value) {
+    _childNodes.insert(index, value);
+  }
+
+  void insertAll(int index, Iterable<Element> iterable) {
+    _childNodes.insertAll(index, iterable);
+  }
+
+  Element removeAt(int index) {
+    final result = this[index];
+    result.remove();
+    return result;
+  }
+
+  bool remove(Object element) {
+    if (element is! Element) return false;
+    for (int i = 0; i < length; i++) {
+      Element indexElement = this[i];
+      if (identical(indexElement, element)) {
+        indexElement.remove();
+        return true;
+      }
+    }
+    return false;
+  }
+
+  Element reduce(Element combine(Element value, Element element)) {
+    return _filtered.reduce(combine);
+  }
+
+  dynamic fold(dynamic initialValue,
+      dynamic combine(dynamic previousValue, Element element)) {
+    return _filtered.fold(initialValue, combine);
+  }
+
+  bool every(bool f(Element element)) => _filtered.every(f);
+  bool any(bool f(Element element)) => _filtered.any(f);
+  List<Element> toList({bool growable: true}) =>
+      new List<Element>.from(this, growable: growable);
+  Set<Element> toSet() => new Set<Element>.from(this);
+  Element firstWhere(bool test(Element value), {Element orElse()}) {
+    return _filtered.firstWhere(test, orElse: orElse);
+  }
+
+  Element lastWhere(bool test(Element value), {Element orElse()}) {
+    return _filtered.lastWhere(test, orElse: orElse);
+  }
+
+  Element singleWhere(bool test(Element value)) {
+    return _filtered.singleWhere(test);
+  }
+
+  Element elementAt(int index) {
+    return this[index];
+  }
+
+  bool get isEmpty => _filtered.isEmpty;
+  int get length => _filtered.length;
+  Element operator [](int index) => _filtered[index];
+  Iterator<Element> get iterator => _filtered.iterator;
+  List<Element> sublist(int start, [int end]) => _filtered.sublist(start, end);
+  Iterable<Element> getRange(int start, int end) =>
+      _filtered.getRange(start, end);
+  int indexOf(Element element, [int start = 0]) =>
+      _filtered.indexOf(element, start);
+
+  int lastIndexOf(Element element, [int start = null]) {
+    if (start == null) start = length - 1;
+    return _filtered.lastIndexOf(element, start);
+  }
+
+  Element get first => _filtered.first;
+
+  Element get last => _filtered.last;
+
+  Element get single => _filtered.single;
+}
+
+// http://dom.spec.whatwg.org/#dom-node-textcontent
+// For Element and DocumentFragment
+String _getText(Node node) =>
+    (new _ConcatTextVisitor()..visit(node)).toString();
+
+void _setText(Node node, String value) {
+  node.nodes.clear();
+  node.append(new Text(value));
+}
+
+class _ConcatTextVisitor extends TreeVisitor {
+  final _str = new StringBuffer();
+
+  String toString() => _str.toString();
+
+  visitText(Text node) {
+    _str.write(node.data);
+  }
+}
diff --git a/mojo/public/dart/third_party/html/lib/dom_parsing.dart b/mojo/public/dart/third_party/html/lib/dom_parsing.dart
new file mode 100644
index 0000000..5575dcd
--- /dev/null
+++ b/mojo/public/dart/third_party/html/lib/dom_parsing.dart
@@ -0,0 +1,203 @@
+/// This library contains extra APIs that aren't in the DOM, but are useful
+/// when interacting with the parse tree.
+library dom_parsing;
+
+import 'dom.dart';
+import 'src/constants.dart' show rcdataElements;
+
+/// A simple tree visitor for the DOM nodes.
+class TreeVisitor {
+  visit(Node node) {
+    switch (node.nodeType) {
+      case Node.ELEMENT_NODE:
+        return visitElement(node);
+      case Node.TEXT_NODE:
+        return visitText(node);
+      case Node.COMMENT_NODE:
+        return visitComment(node);
+      case Node.DOCUMENT_FRAGMENT_NODE:
+        return visitDocumentFragment(node);
+      case Node.DOCUMENT_NODE:
+        return visitDocument(node);
+      case Node.DOCUMENT_TYPE_NODE:
+        return visitDocumentType(node);
+      default:
+        throw new UnsupportedError('DOM node type ${node.nodeType}');
+    }
+  }
+
+  visitChildren(Node node) {
+    // Allow for mutations (remove works) while iterating.
+    for (var child in node.nodes.toList()) visit(child);
+  }
+
+  /// The fallback handler if the more specific visit method hasn't been
+  /// overriden. Only use this from a subclass of [TreeVisitor], otherwise
+  /// call [visit] instead.
+  visitNodeFallback(Node node) => visitChildren(node);
+
+  visitDocument(Document node) => visitNodeFallback(node);
+
+  visitDocumentType(DocumentType node) => visitNodeFallback(node);
+
+  visitText(Text node) => visitNodeFallback(node);
+
+  // TODO(jmesserly): visit attributes.
+  visitElement(Element node) => visitNodeFallback(node);
+
+  visitComment(Comment node) => visitNodeFallback(node);
+
+  visitDocumentFragment(DocumentFragment node) => visitNodeFallback(node);
+}
+
+/// Converts the DOM tree into an HTML string with code markup suitable for
+/// displaying the HTML's source code with CSS colors for different parts of the
+/// markup. See also [CodeMarkupVisitor].
+String htmlToCodeMarkup(Node node) {
+  return (new CodeMarkupVisitor()..visit(node)).toString();
+}
+
+/// Converts the DOM tree into an HTML string with code markup suitable for
+/// displaying the HTML's source code with CSS colors for different parts of the
+/// markup. See also [htmlToCodeMarkup].
+class CodeMarkupVisitor extends TreeVisitor {
+  final StringBuffer _str;
+
+  CodeMarkupVisitor() : _str = new StringBuffer();
+
+  String toString() => _str.toString();
+
+  visitDocument(Document node) {
+    _str.write("<pre>");
+    visitChildren(node);
+    _str.write("</pre>");
+  }
+
+  visitDocumentType(DocumentType node) {
+    _str.write('<code class="markup doctype">&lt;!DOCTYPE ${node.name}>'
+        '</code>');
+  }
+
+  visitText(Text node) {
+    writeTextNodeAsHtml(_str, node);
+  }
+
+  visitElement(Element node) {
+    final tag = node.localName;
+    _str.write('&lt;<code class="markup element-name">$tag</code>');
+    if (node.attributes.length > 0) {
+      node.attributes.forEach((key, v) {
+        v = htmlSerializeEscape(v, attributeMode: true);
+        _str.write(' <code class="markup attribute-name">$key</code>'
+            '=<code class="markup attribute-value">"$v"</code>');
+      });
+    }
+    if (node.nodes.length > 0) {
+      _str.write(">");
+      visitChildren(node);
+    } else if (isVoidElement(tag)) {
+      _str.write(">");
+      return;
+    }
+    _str.write('&lt;/<code class="markup element-name">$tag</code>>');
+  }
+
+  visitComment(Comment node) {
+    var data = htmlSerializeEscape(node.data);
+    _str.write('<code class="markup comment">&lt;!--${data}--></code>');
+  }
+}
+
+// TODO(jmesserly): reconcile this with dart:web htmlEscape.
+// This one might be more useful, as it is HTML5 spec compliant.
+/// Escapes [text] for use in the
+/// [HTML fragment serialization algorithm][1]. In particular, as described
+/// in the [specification][2]:
+///
+/// - Replace any occurrence of the `&` character by the string `&amp;`.
+/// - Replace any occurrences of the U+00A0 NO-BREAK SPACE character by the
+///   string `&nbsp;`.
+/// - If the algorithm was invoked in [attributeMode], replace any occurrences
+///   of the `"` character by the string `&quot;`.
+/// - If the algorithm was not invoked in [attributeMode], replace any
+///   occurrences of the `<` character by the string `&lt;`, and any occurrences
+///   of the `>` character by the string `&gt;`.
+///
+/// [1]: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#serializing-html-fragments
+/// [2]: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString
+String htmlSerializeEscape(String text, {bool attributeMode: false}) {
+  // TODO(jmesserly): is it faster to build up a list of codepoints?
+  // StringBuffer seems cleaner assuming Dart can unbox 1-char strings.
+  StringBuffer result = null;
+  for (int i = 0; i < text.length; i++) {
+    var ch = text[i];
+    String replace = null;
+    switch (ch) {
+      case '&':
+        replace = '&amp;';
+        break;
+      case '\u00A0' /*NO-BREAK SPACE*/ :
+        replace = '&nbsp;';
+        break;
+      case '"':
+        if (attributeMode) replace = '&quot;';
+        break;
+      case '<':
+        if (!attributeMode) replace = '&lt;';
+        break;
+      case '>':
+        if (!attributeMode) replace = '&gt;';
+        break;
+    }
+    if (replace != null) {
+      if (result == null) result = new StringBuffer(text.substring(0, i));
+      result.write(replace);
+    } else if (result != null) {
+      result.write(ch);
+    }
+  }
+
+  return result != null ? result.toString() : text;
+}
+
+/// Returns true if this tag name is a void element.
+/// This method is useful to a pretty printer, because void elements must not
+/// have an end tag.
+/// See also: <http://dev.w3.org/html5/markup/syntax.html#void-elements>.
+bool isVoidElement(String tagName) {
+  switch (tagName) {
+    case "area":
+    case "base":
+    case "br":
+    case "col":
+    case "command":
+    case "embed":
+    case "hr":
+    case "img":
+    case "input":
+    case "keygen":
+    case "link":
+    case "meta":
+    case "param":
+    case "source":
+    case "track":
+    case "wbr":
+      return true;
+  }
+  return false;
+}
+
+/// Serialize text node according to:
+/// <http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#html-fragment-serialization-algorithm>
+void writeTextNodeAsHtml(StringBuffer str, Text node) {
+  // Don't escape text for certain elements, notably <script>.
+  final parent = node.parentNode;
+  if (parent is Element) {
+    var tag = parent.localName;
+    if (rcdataElements.contains(tag) || tag == 'plaintext') {
+      str.write(node.data);
+      return;
+    }
+  }
+  str.write(htmlSerializeEscape(node.data));
+}
diff --git a/mojo/public/dart/third_party/html/lib/parser.dart b/mojo/public/dart/third_party/html/lib/parser.dart
new file mode 100644
index 0000000..dc95941
--- /dev/null
+++ b/mojo/public/dart/third_party/html/lib/parser.dart
@@ -0,0 +1,3822 @@
+/// This library has a parser for HTML5 documents, that lets you parse HTML
+/// easily from a script or server side application:
+///
+///     import 'package:html/parser.dart' show parse;
+///     import 'package:html/dom.dart';
+///     main() {
+///       var document = parse(
+///           '<body>Hello world! <a href="www.html5rocks.com">HTML5 rocks!');
+///       print(document.outerHtml);
+///     }
+///
+/// The resulting document you get back has a DOM-like API for easy tree
+/// traversal and manipulation.
+library parser;
+
+import 'dart:collection';
+import 'dart:math';
+import 'package:source_span/source_span.dart';
+
+import 'src/treebuilder.dart';
+import 'src/constants.dart';
+import 'src/encoding_parser.dart';
+import 'src/token.dart';
+import 'src/tokenizer.dart';
+import 'src/utils.dart';
+import 'dom.dart';
+
+/// Parse the [input] html5 document into a tree. The [input] can be
+/// a [String], [List<int>] of bytes or an [HtmlTokenizer].
+///
+/// If [input] is not a [HtmlTokenizer], you can optionally specify the file's
+/// [encoding], which must be a string. If specified that encoding will be
+/// used regardless of any BOM or later declaration (such as in a meta element).
+///
+/// Set [generateSpans] if you want to generate [SourceSpan]s, otherwise the
+/// [Node.sourceSpan] property will be `null`. When using [generateSpans] you
+/// can additionally pass [sourceUrl] to indicate where the [input] was
+/// extracted from.
+Document parse(input,
+    {String encoding, bool generateSpans: false, String sourceUrl}) {
+  var p = new HtmlParser(input,
+      encoding: encoding, generateSpans: generateSpans, sourceUrl: sourceUrl);
+  return p.parse();
+}
+
+/// Parse the [input] html5 document fragment into a tree. The [input] can be
+/// a [String], [List<int>] of bytes or an [HtmlTokenizer]. The [container]
+/// element can optionally be specified, otherwise it defaults to "div".
+///
+/// If [input] is not a [HtmlTokenizer], you can optionally specify the file's
+/// [encoding], which must be a string. If specified, that encoding will be used,
+/// regardless of any BOM or later declaration (such as in a meta element).
+///
+/// Set [generateSpans] if you want to generate [SourceSpan]s, otherwise the
+/// [Node.sourceSpan] property will be `null`. When using [generateSpans] you can
+/// additionally pass [sourceUrl] to indicate where the [input] was extracted
+/// from.
+DocumentFragment parseFragment(input, {String container: "div", String encoding,
+    bool generateSpans: false, String sourceUrl}) {
+  var p = new HtmlParser(input,
+      encoding: encoding, generateSpans: generateSpans, sourceUrl: sourceUrl);
+  return p.parseFragment(container);
+}
+
+/// Parser for HTML, which generates a tree structure from a stream of
+/// (possibly malformed) characters.
+class HtmlParser {
+  /// Raise an exception on the first error encountered.
+  final bool strict;
+
+  /// True to generate [SourceSpan]s for the [Node.sourceSpan] property.
+  final bool generateSpans;
+
+  final HtmlTokenizer tokenizer;
+
+  final TreeBuilder tree;
+
+  final List<ParseError> errors = <ParseError>[];
+
+  String container;
+
+  bool firstStartTag = false;
+
+  // TODO(jmesserly): use enum?
+  /// "quirks" / "limited quirks" / "no quirks"
+  String compatMode = "no quirks";
+
+  /// innerHTML container when parsing document fragment.
+  String innerHTML;
+
+  Phase phase;
+
+  Phase lastPhase;
+
+  Phase originalPhase;
+
+  Phase beforeRCDataPhase;
+
+  bool framesetOK;
+
+  // These fields hold the different phase singletons. At any given time one
+  // of them will be active.
+  InitialPhase _initialPhase;
+  BeforeHtmlPhase _beforeHtmlPhase;
+  BeforeHeadPhase _beforeHeadPhase;
+  InHeadPhase _inHeadPhase;
+  AfterHeadPhase _afterHeadPhase;
+  InBodyPhase _inBodyPhase;
+  TextPhase _textPhase;
+  InTablePhase _inTablePhase;
+  InTableTextPhase _inTableTextPhase;
+  InCaptionPhase _inCaptionPhase;
+  InColumnGroupPhase _inColumnGroupPhase;
+  InTableBodyPhase _inTableBodyPhase;
+  InRowPhase _inRowPhase;
+  InCellPhase _inCellPhase;
+  InSelectPhase _inSelectPhase;
+  InSelectInTablePhase _inSelectInTablePhase;
+  InForeignContentPhase _inForeignContentPhase;
+  AfterBodyPhase _afterBodyPhase;
+  InFramesetPhase _inFramesetPhase;
+  AfterFramesetPhase _afterFramesetPhase;
+  AfterAfterBodyPhase _afterAfterBodyPhase;
+  AfterAfterFramesetPhase _afterAfterFramesetPhase;
+
+  /// Create an HtmlParser and configure the [tree] builder and [strict] mode.
+  /// The [input] can be a [String], [List<int>] of bytes or an [HtmlTokenizer].
+  ///
+  /// If [input] is not a [HtmlTokenizer], you can specify a few more arguments.
+  ///
+  /// The [encoding] must be a string that indicates the encoding. If specified,
+  /// that encoding will be used, regardless of any BOM or later declaration
+  /// (such as in a meta element).
+  ///
+  /// Set [parseMeta] to false if you want to disable parsing the meta element.
+  ///
+  /// Set [lowercaseElementName] or [lowercaseAttrName] to false to disable the
+  /// automatic conversion of element and attribute names to lower case. Note
+  /// that standard way to parse HTML is to lowercase, which is what the browser
+  /// DOM will do if you request [Node.outerHTML], for example.
+  HtmlParser(input, {String encoding, bool parseMeta: true,
+      bool lowercaseElementName: true, bool lowercaseAttrName: true,
+      this.strict: false, bool generateSpans: false, String sourceUrl,
+      TreeBuilder tree})
+      : generateSpans = generateSpans,
+        tree = tree != null ? tree : new TreeBuilder(true),
+        tokenizer = (input is HtmlTokenizer
+            ? input
+            : new HtmlTokenizer(input,
+                encoding: encoding,
+                parseMeta: parseMeta,
+                lowercaseElementName: lowercaseElementName,
+                lowercaseAttrName: lowercaseAttrName,
+                generateSpans: generateSpans,
+                sourceUrl: sourceUrl)) {
+    tokenizer.parser = this;
+    _initialPhase = new InitialPhase(this);
+    _beforeHtmlPhase = new BeforeHtmlPhase(this);
+    _beforeHeadPhase = new BeforeHeadPhase(this);
+    _inHeadPhase = new InHeadPhase(this);
+    // TODO(jmesserly): html5lib did not implement the no script parsing mode
+    // More information here:
+    // http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#scripting-flag
+    // http://www.whatwg.org/specs/web-apps/current-work/multipage/tree-construction.html#parsing-main-inheadnoscript
+    // "inHeadNoscript": new InHeadNoScriptPhase(this);
+    _afterHeadPhase = new AfterHeadPhase(this);
+    _inBodyPhase = new InBodyPhase(this);
+    _textPhase = new TextPhase(this);
+    _inTablePhase = new InTablePhase(this);
+    _inTableTextPhase = new InTableTextPhase(this);
+    _inCaptionPhase = new InCaptionPhase(this);
+    _inColumnGroupPhase = new InColumnGroupPhase(this);
+    _inTableBodyPhase = new InTableBodyPhase(this);
+    _inRowPhase = new InRowPhase(this);
+    _inCellPhase = new InCellPhase(this);
+    _inSelectPhase = new InSelectPhase(this);
+    _inSelectInTablePhase = new InSelectInTablePhase(this);
+    _inForeignContentPhase = new InForeignContentPhase(this);
+    _afterBodyPhase = new AfterBodyPhase(this);
+    _inFramesetPhase = new InFramesetPhase(this);
+    _afterFramesetPhase = new AfterFramesetPhase(this);
+    _afterAfterBodyPhase = new AfterAfterBodyPhase(this);
+    _afterAfterFramesetPhase = new AfterAfterFramesetPhase(this);
+  }
+
+  bool get innerHTMLMode => innerHTML != null;
+
+  /// Parse an html5 document into a tree.
+  /// After parsing, [errors] will be populated with parse errors, if any.
+  Document parse() {
+    innerHTML = null;
+    _parse();
+    return tree.getDocument();
+  }
+
+  /// Parse an html5 document fragment into a tree.
+  /// Pass a [container] to change the type of the containing element.
+  /// After parsing, [errors] will be populated with parse errors, if any.
+  DocumentFragment parseFragment([String container = "div"]) {
+    if (container == null) throw new ArgumentError('container');
+    innerHTML = container.toLowerCase();
+    _parse();
+    return tree.getFragment();
+  }
+
+  void _parse() {
+    reset();
+
+    while (true) {
+      try {
+        mainLoop();
+        break;
+      } on ReparseException catch (e) {
+        // Note: this happens if we start parsing but the character encoding
+        // changes. So we should only need to restart very early in the parse.
+        reset();
+      }
+    }
+  }
+
+  void reset() {
+    tokenizer.reset();
+
+    tree.reset();
+    firstStartTag = false;
+    errors.clear();
+    // "quirks" / "limited quirks" / "no quirks"
+    compatMode = "no quirks";
+
+    if (innerHTMLMode) {
+      if (cdataElements.contains(innerHTML)) {
+        tokenizer.state = tokenizer.rcdataState;
+      } else if (rcdataElements.contains(innerHTML)) {
+        tokenizer.state = tokenizer.rawtextState;
+      } else if (innerHTML == 'plaintext') {
+        tokenizer.state = tokenizer.plaintextState;
+      } else {
+        // state already is data state
+        // tokenizer.state = tokenizer.dataState;
+      }
+      phase = _beforeHtmlPhase;
+      _beforeHtmlPhase.insertHtmlElement();
+      resetInsertionMode();
+    } else {
+      phase = _initialPhase;
+    }
+
+    lastPhase = null;
+    beforeRCDataPhase = null;
+    framesetOK = true;
+  }
+
+  bool isHTMLIntegrationPoint(Element element) {
+    if (element.localName == "annotation-xml" &&
+        element.namespaceUri == Namespaces.mathml) {
+      var enc = element.attributes["encoding"];
+      if (enc != null) enc = asciiUpper2Lower(enc);
+      return enc == "text/html" || enc == "application/xhtml+xml";
+    } else {
+      return htmlIntegrationPointElements
+          .contains(new Pair(element.namespaceUri, element.localName));
+    }
+  }
+
+  bool isMathMLTextIntegrationPoint(Element element) {
+    return mathmlTextIntegrationPointElements
+        .contains(new Pair(element.namespaceUri, element.localName));
+  }
+
+  bool inForeignContent(Token token, int type) {
+    if (tree.openElements.length == 0) return false;
+
+    var node = tree.openElements.last;
+    if (node.namespaceUri == tree.defaultNamespace) return false;
+
+    if (isMathMLTextIntegrationPoint(node)) {
+      if (type == TokenKind.startTag &&
+          (token as StartTagToken).name != "mglyph" &&
+          (token as StartTagToken).name != "malignmark") {
+        return false;
+      }
+      if (type == TokenKind.characters || type == TokenKind.spaceCharacters) {
+        return false;
+      }
+    }
+
+    if (node.localName == "annotation-xml" &&
+        type == TokenKind.startTag &&
+        (token as StartTagToken).name == "svg") {
+      return false;
+    }
+
+    if (isHTMLIntegrationPoint(node)) {
+      if (type == TokenKind.startTag ||
+          type == TokenKind.characters ||
+          type == TokenKind.spaceCharacters) {
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  void mainLoop() {
+    while (tokenizer.moveNext()) {
+      var token = tokenizer.current;
+      var newToken = token;
+      int type;
+      while (newToken != null) {
+        type = newToken.kind;
+
+        // Note: avoid "is" test here, see http://dartbug.com/4795
+        if (type == TokenKind.parseError) {
+          ParseErrorToken error = newToken;
+          parseError(error.span, error.data, error.messageParams);
+          newToken = null;
+        } else {
+          Phase phase_ = phase;
+          if (inForeignContent(token, type)) {
+            phase_ = _inForeignContentPhase;
+          }
+
+          switch (type) {
+            case TokenKind.characters:
+              newToken = phase_.processCharacters(newToken);
+              break;
+            case TokenKind.spaceCharacters:
+              newToken = phase_.processSpaceCharacters(newToken);
+              break;
+            case TokenKind.startTag:
+              newToken = phase_.processStartTag(newToken);
+              break;
+            case TokenKind.endTag:
+              newToken = phase_.processEndTag(newToken);
+              break;
+            case TokenKind.comment:
+              newToken = phase_.processComment(newToken);
+              break;
+            case TokenKind.doctype:
+              newToken = phase_.processDoctype(newToken);
+              break;
+          }
+        }
+      }
+
+      if (token is StartTagToken) {
+        if (token.selfClosing && !token.selfClosingAcknowledged) {
+          parseError(token.span, "non-void-element-with-trailing-solidus", {
+            "name": token.name
+          });
+        }
+      }
+    }
+
+    // When the loop finishes it's EOF
+    var reprocess = true;
+    var reprocessPhases = [];
+    while (reprocess) {
+      reprocessPhases.add(phase);
+      reprocess = phase.processEOF();
+      if (reprocess) {
+        assert(!reprocessPhases.contains(phase));
+      }
+    }
+  }
+
+  /// The last span available. Used for EOF errors if we don't have something
+  /// better.
+  SourceSpan get _lastSpan {
+    if (tokenizer.stream.fileInfo == null) return null;
+    var pos = tokenizer.stream.position;
+    return tokenizer.stream.fileInfo.location(pos).pointSpan();
+  }
+
+  void parseError(SourceSpan span, String errorcode,
+      [Map datavars = const {}]) {
+    if (!generateSpans && span == null) {
+      span = _lastSpan;
+    }
+
+    var err = new ParseError(errorcode, span, datavars);
+    errors.add(err);
+    if (strict) throw err;
+  }
+
+  void adjustMathMLAttributes(StartTagToken token) {
+    var orig = token.data.remove("definitionurl");
+    if (orig != null) {
+      token.data["definitionURL"] = orig;
+    }
+  }
+
+  void adjustSVGAttributes(StartTagToken token) {
+    final replacements = const {
+      "attributename": "attributeName",
+      "attributetype": "attributeType",
+      "basefrequency": "baseFrequency",
+      "baseprofile": "baseProfile",
+      "calcmode": "calcMode",
+      "clippathunits": "clipPathUnits",
+      "contentscripttype": "contentScriptType",
+      "contentstyletype": "contentStyleType",
+      "diffuseconstant": "diffuseConstant",
+      "edgemode": "edgeMode",
+      "externalresourcesrequired": "externalResourcesRequired",
+      "filterres": "filterRes",
+      "filterunits": "filterUnits",
+      "glyphref": "glyphRef",
+      "gradienttransform": "gradientTransform",
+      "gradientunits": "gradientUnits",
+      "kernelmatrix": "kernelMatrix",
+      "kernelunitlength": "kernelUnitLength",
+      "keypoints": "keyPoints",
+      "keysplines": "keySplines",
+      "keytimes": "keyTimes",
+      "lengthadjust": "lengthAdjust",
+      "limitingconeangle": "limitingConeAngle",
+      "markerheight": "markerHeight",
+      "markerunits": "markerUnits",
+      "markerwidth": "markerWidth",
+      "maskcontentunits": "maskContentUnits",
+      "maskunits": "maskUnits",
+      "numoctaves": "numOctaves",
+      "pathlength": "pathLength",
+      "patterncontentunits": "patternContentUnits",
+      "patterntransform": "patternTransform",
+      "patternunits": "patternUnits",
+      "pointsatx": "pointsAtX",
+      "pointsaty": "pointsAtY",
+      "pointsatz": "pointsAtZ",
+      "preservealpha": "preserveAlpha",
+      "preserveaspectratio": "preserveAspectRatio",
+      "primitiveunits": "primitiveUnits",
+      "refx": "refX",
+      "refy": "refY",
+      "repeatcount": "repeatCount",
+      "repeatdur": "repeatDur",
+      "requiredextensions": "requiredExtensions",
+      "requiredfeatures": "requiredFeatures",
+      "specularconstant": "specularConstant",
+      "specularexponent": "specularExponent",
+      "spreadmethod": "spreadMethod",
+      "startoffset": "startOffset",
+      "stddeviation": "stdDeviation",
+      "stitchtiles": "stitchTiles",
+      "surfacescale": "surfaceScale",
+      "systemlanguage": "systemLanguage",
+      "tablevalues": "tableValues",
+      "targetx": "targetX",
+      "targety": "targetY",
+      "textlength": "textLength",
+      "viewbox": "viewBox",
+      "viewtarget": "viewTarget",
+      "xchannelselector": "xChannelSelector",
+      "ychannelselector": "yChannelSelector",
+      "zoomandpan": "zoomAndPan"
+    };
+    for (var originalName in token.data.keys.toList()) {
+      var svgName = replacements[originalName];
+      if (svgName != null) {
+        token.data[svgName] = token.data.remove(originalName);
+      }
+    }
+  }
+
+  void adjustForeignAttributes(StartTagToken token) {
+    // TODO(jmesserly): I don't like mixing non-string objects with strings in
+    // the Node.attributes Map. Is there another solution?
+    final replacements = const {
+      "xlink:actuate":
+          const AttributeName("xlink", "actuate", Namespaces.xlink),
+      "xlink:arcrole":
+          const AttributeName("xlink", "arcrole", Namespaces.xlink),
+      "xlink:href": const AttributeName("xlink", "href", Namespaces.xlink),
+      "xlink:role": const AttributeName("xlink", "role", Namespaces.xlink),
+      "xlink:show": const AttributeName("xlink", "show", Namespaces.xlink),
+      "xlink:title": const AttributeName("xlink", "title", Namespaces.xlink),
+      "xlink:type": const AttributeName("xlink", "type", Namespaces.xlink),
+      "xml:base": const AttributeName("xml", "base", Namespaces.xml),
+      "xml:lang": const AttributeName("xml", "lang", Namespaces.xml),
+      "xml:space": const AttributeName("xml", "space", Namespaces.xml),
+      "xmlns": const AttributeName(null, "xmlns", Namespaces.xmlns),
+      "xmlns:xlink": const AttributeName("xmlns", "xlink", Namespaces.xmlns)
+    };
+
+    for (var originalName in token.data.keys.toList()) {
+      var foreignName = replacements[originalName];
+      if (foreignName != null) {
+        token.data[foreignName] = token.data.remove(originalName);
+      }
+    }
+  }
+
+  void resetInsertionMode() {
+    // The name of this method is mostly historical. (It's also used in the
+    // specification.)
+    for (var node in tree.openElements.reversed) {
+      var nodeName = node.localName;
+      bool last = node == tree.openElements[0];
+      if (last) {
+        assert(innerHTMLMode);
+        nodeName = innerHTML;
+      }
+      // Check for conditions that should only happen in the innerHTML
+      // case
+      switch (nodeName) {
+        case "select":
+        case "colgroup":
+        case "head":
+        case "html":
+          assert(innerHTMLMode);
+          break;
+      }
+      if (!last && node.namespaceUri != tree.defaultNamespace) {
+        continue;
+      }
+      switch (nodeName) {
+        case "select":
+          phase = _inSelectPhase;
+          return;
+        case "td":
+          phase = _inCellPhase;
+          return;
+        case "th":
+          phase = _inCellPhase;
+          return;
+        case "tr":
+          phase = _inRowPhase;
+          return;
+        case "tbody":
+          phase = _inTableBodyPhase;
+          return;
+        case "thead":
+          phase = _inTableBodyPhase;
+          return;
+        case "tfoot":
+          phase = _inTableBodyPhase;
+          return;
+        case "caption":
+          phase = _inCaptionPhase;
+          return;
+        case "colgroup":
+          phase = _inColumnGroupPhase;
+          return;
+        case "table":
+          phase = _inTablePhase;
+          return;
+        case "head":
+          phase = _inBodyPhase;
+          return;
+        case "body":
+          phase = _inBodyPhase;
+          return;
+        case "frameset":
+          phase = _inFramesetPhase;
+          return;
+        case "html":
+          phase = _beforeHeadPhase;
+          return;
+      }
+    }
+    phase = _inBodyPhase;
+  }
+
+  /// Generic RCDATA/RAWTEXT Parsing algorithm
+  /// [contentType] - RCDATA or RAWTEXT
+  void parseRCDataRawtext(Token token, String contentType) {
+    assert(contentType == "RAWTEXT" || contentType == "RCDATA");
+
+    tree.insertElement(token);
+
+    if (contentType == "RAWTEXT") {
+      tokenizer.state = tokenizer.rawtextState;
+    } else {
+      tokenizer.state = tokenizer.rcdataState;
+    }
+
+    originalPhase = phase;
+    phase = _textPhase;
+  }
+}
+
+/// Base class for helper object that implements each phase of processing.
+class Phase {
+  // Order should be (they can be omitted):
+  // * EOF
+  // * Comment
+  // * Doctype
+  // * SpaceCharacters
+  // * Characters
+  // * StartTag
+  //   - startTag* methods
+  // * EndTag
+  //   - endTag* methods
+
+  final HtmlParser parser;
+
+  final TreeBuilder tree;
+
+  Phase(HtmlParser parser)
+      : parser = parser,
+        tree = parser.tree;
+
+  bool processEOF() {
+    throw new UnimplementedError();
+  }
+
+  Token processComment(CommentToken token) {
+    // For most phases the following is correct. Where it's not it will be
+    // overridden.
+    tree.insertComment(token, tree.openElements.last);
+    return null;
+  }
+
+  Token processDoctype(DoctypeToken token) {
+    parser.parseError(token.span, "unexpected-doctype");
+    return null;
+  }
+
+  Token processCharacters(CharactersToken token) {
+    tree.insertText(token.data, token.span);
+    return null;
+  }
+
+  Token processSpaceCharacters(SpaceCharactersToken token) {
+    tree.insertText(token.data, token.span);
+    return null;
+  }
+
+  Token processStartTag(StartTagToken token) {
+    throw new UnimplementedError();
+  }
+
+  Token startTagHtml(StartTagToken token) {
+    if (parser.firstStartTag == false && token.name == "html") {
+      parser.parseError(token.span, "non-html-root");
+    }
+    // XXX Need a check here to see if the first start tag token emitted is
+    // this token... If it's not, invoke parser.parseError().
+    tree.openElements[0].sourceSpan = token.span;
+    token.data.forEach((attr, value) {
+      tree.openElements[0].attributes.putIfAbsent(attr, () => value);
+    });
+    parser.firstStartTag = false;
+    return null;
+  }
+
+  Token processEndTag(EndTagToken token) {
+    throw new UnimplementedError();
+  }
+
+  /// Helper method for popping openElements.
+  void popOpenElementsUntil(EndTagToken token) {
+    String name = token.name;
+    var node = tree.openElements.removeLast();
+    while (node.localName != name) {
+      node = tree.openElements.removeLast();
+    }
+    if (node != null) {
+      node.endSourceSpan = token.span;
+    }
+  }
+}
+
+class InitialPhase extends Phase {
+  InitialPhase(parser) : super(parser);
+
+  Token processSpaceCharacters(SpaceCharactersToken token) {
+    return null;
+  }
+
+  Token processComment(CommentToken token) {
+    tree.insertComment(token, tree.document);
+    return null;
+  }
+
+  Token processDoctype(DoctypeToken token) {
+    var name = token.name;
+    String publicId = token.publicId;
+    var systemId = token.systemId;
+    var correct = token.correct;
+
+    if ((name != "html" ||
+        publicId != null ||
+        systemId != null && systemId != "about:legacy-compat")) {
+      parser.parseError(token.span, "unknown-doctype");
+    }
+
+    if (publicId == null) {
+      publicId = "";
+    }
+
+    tree.insertDoctype(token);
+
+    if (publicId != "") {
+      publicId = asciiUpper2Lower(publicId);
+    }
+
+    if (!correct || token.name != "html" || startsWithAny(publicId, const [
+      "+//silmaril//dtd html pro v0r11 19970101//",
+      "-//advasoft ltd//dtd html 3.0 aswedit + extensions//",
+      "-//as//dtd html 3.0 aswedit + extensions//",
+      "-//ietf//dtd html 2.0 level 1//",
+      "-//ietf//dtd html 2.0 level 2//",
+      "-//ietf//dtd html 2.0 strict level 1//",
+      "-//ietf//dtd html 2.0 strict level 2//",
+      "-//ietf//dtd html 2.0 strict//",
+      "-//ietf//dtd html 2.0//",
+      "-//ietf//dtd html 2.1e//",
+      "-//ietf//dtd html 3.0//",
+      "-//ietf//dtd html 3.2 final//",
+      "-//ietf//dtd html 3.2//",
+      "-//ietf//dtd html 3//",
+      "-//ietf//dtd html level 0//",
+      "-//ietf//dtd html level 1//",
+      "-//ietf//dtd html level 2//",
+      "-//ietf//dtd html level 3//",
+      "-//ietf//dtd html strict level 0//",
+      "-//ietf//dtd html strict level 1//",
+      "-//ietf//dtd html strict level 2//",
+      "-//ietf//dtd html strict level 3//",
+      "-//ietf//dtd html strict//",
+      "-//ietf//dtd html//",
+      "-//metrius//dtd metrius presentational//",
+      "-//microsoft//dtd internet explorer 2.0 html strict//",
+      "-//microsoft//dtd internet explorer 2.0 html//",
+      "-//microsoft//dtd internet explorer 2.0 tables//",
+      "-//microsoft//dtd internet explorer 3.0 html strict//",
+      "-//microsoft//dtd internet explorer 3.0 html//",
+      "-//microsoft//dtd internet explorer 3.0 tables//",
+      "-//netscape comm. corp.//dtd html//",
+      "-//netscape comm. corp.//dtd strict html//",
+      "-//o'reilly and associates//dtd html 2.0//",
+      "-//o'reilly and associates//dtd html extended 1.0//",
+      "-//o'reilly and associates//dtd html extended relaxed 1.0//",
+      "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//",
+      "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//",
+      "-//spyglass//dtd html 2.0 extended//",
+      "-//sq//dtd html 2.0 hotmetal + extensions//",
+      "-//sun microsystems corp.//dtd hotjava html//",
+      "-//sun microsystems corp.//dtd hotjava strict html//",
+      "-//w3c//dtd html 3 1995-03-24//",
+      "-//w3c//dtd html 3.2 draft//",
+      "-//w3c//dtd html 3.2 final//",
+      "-//w3c//dtd html 3.2//",
+      "-//w3c//dtd html 3.2s draft//",
+      "-//w3c//dtd html 4.0 frameset//",
+      "-//w3c//dtd html 4.0 transitional//",
+      "-//w3c//dtd html experimental 19960712//",
+      "-//w3c//dtd html experimental 970421//",
+      "-//w3c//dtd w3 html//",
+      "-//w3o//dtd w3 html 3.0//",
+      "-//webtechs//dtd mozilla html 2.0//",
+      "-//webtechs//dtd mozilla html//"
+    ]) ||
+        const [
+      "-//w3o//dtd w3 html strict 3.0//en//",
+      "-/w3c/dtd html 4.0 transitional/en",
+      "html"
+    ].contains(publicId) ||
+        startsWithAny(publicId, const [
+      "-//w3c//dtd html 4.01 frameset//",
+      "-//w3c//dtd html 4.01 transitional//"
+    ]) &&
+            systemId == null ||
+        systemId != null &&
+            systemId.toLowerCase() ==
+                "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd") {
+      parser.compatMode = "quirks";
+    } else if (startsWithAny(publicId, const [
+      "-//w3c//dtd xhtml 1.0 frameset//",
+      "-//w3c//dtd xhtml 1.0 transitional//"
+    ]) ||
+        startsWithAny(publicId, const [
+      "-//w3c//dtd html 4.01 frameset//",
+      "-//w3c//dtd html 4.01 transitional//"
+    ]) &&
+        systemId != null) {
+      parser.compatMode = "limited quirks";
+    }
+    parser.phase = parser._beforeHtmlPhase;
+    return null;
+  }
+
+  void anythingElse() {
+    parser.compatMode = "quirks";
+    parser.phase = parser._beforeHtmlPhase;
+  }
+
+  Token processCharacters(CharactersToken token) {
+    parser.parseError(token.span, "expected-doctype-but-got-chars");
+    anythingElse();
+    return token;
+  }
+
+  Token processStartTag(StartTagToken token) {
+    parser.parseError(
+        token.span, "expected-doctype-but-got-start-tag", {"name": token.name});
+    anythingElse();
+    return token;
+  }
+
+  Token processEndTag(EndTagToken token) {
+    parser.parseError(
+        token.span, "expected-doctype-but-got-end-tag", {"name": token.name});
+    anythingElse();
+    return token;
+  }
+
+  bool processEOF() {
+    parser.parseError(parser._lastSpan, "expected-doctype-but-got-eof");
+    anythingElse();
+    return true;
+  }
+}
+
+class BeforeHtmlPhase extends Phase {
+  BeforeHtmlPhase(parser) : super(parser);
+
+  // helper methods
+  void insertHtmlElement() {
+    tree.insertRoot(new StartTagToken("html", data: {}));
+    parser.phase = parser._beforeHeadPhase;
+  }
+
+  // other
+  bool processEOF() {
+    insertHtmlElement();
+    return true;
+  }
+
+  Token processComment(CommentToken token) {
+    tree.insertComment(token, tree.document);
+    return null;
+  }
+
+  Token processSpaceCharacters(SpaceCharactersToken token) {
+    return null;
+  }
+
+  Token processCharacters(CharactersToken token) {
+    insertHtmlElement();
+    return token;
+  }
+
+  Token processStartTag(StartTagToken token) {
+    if (token.name == "html") {
+      parser.firstStartTag = true;
+    }
+    insertHtmlElement();
+    return token;
+  }
+
+  Token processEndTag(EndTagToken token) {
+    switch (token.name) {
+      case "head":
+      case "body":
+      case "html":
+      case "br":
+        insertHtmlElement();
+        return token;
+      default:
+        parser.parseError(
+            token.span, "unexpected-end-tag-before-html", {"name": token.name});
+        return null;
+    }
+  }
+}
+
+class BeforeHeadPhase extends Phase {
+  BeforeHeadPhase(parser) : super(parser);
+
+  processStartTag(StartTagToken token) {
+    switch (token.name) {
+      case 'html':
+        return startTagHtml(token);
+      case 'head':
+        return startTagHead(token);
+      default:
+        return startTagOther(token);
+    }
+  }
+
+  processEndTag(EndTagToken token) {
+    switch (token.name) {
+      case "head":
+      case "body":
+      case "html":
+      case "br":
+        return endTagImplyHead(token);
+      default:
+        return endTagOther(token);
+    }
+  }
+
+  bool processEOF() {
+    startTagHead(new StartTagToken("head", data: {}));
+    return true;
+  }
+
+  Token processSpaceCharacters(SpaceCharactersToken token) {
+    return null;
+  }
+
+  Token processCharacters(CharactersToken token) {
+    startTagHead(new StartTagToken("head", data: {}));
+    return token;
+  }
+
+  Token startTagHtml(StartTagToken token) {
+    return parser._inBodyPhase.processStartTag(token);
+  }
+
+  void startTagHead(StartTagToken token) {
+    tree.insertElement(token);
+    tree.headPointer = tree.openElements.last;
+    parser.phase = parser._inHeadPhase;
+  }
+
+  Token startTagOther(StartTagToken token) {
+    startTagHead(new StartTagToken("head", data: {}));
+    return token;
+  }
+
+  Token endTagImplyHead(EndTagToken token) {
+    startTagHead(new StartTagToken("head", data: {}));
+    return token;
+  }
+
+  void endTagOther(EndTagToken token) {
+    parser.parseError(
+        token.span, "end-tag-after-implied-root", {"name": token.name});
+  }
+}
+
+class InHeadPhase extends Phase {
+  InHeadPhase(parser) : super(parser);
+
+  processStartTag(StartTagToken token) {
+    switch (token.name) {
+      case "html":
+        return startTagHtml(token);
+      case "title":
+        return startTagTitle(token);
+      case "noscript":
+      case "noframes":
+      case "style":
+        return startTagNoScriptNoFramesStyle(token);
+      case "script":
+        return startTagScript(token);
+      case "base":
+      case "basefont":
+      case "bgsound":
+      case "command":
+      case "link":
+        return startTagBaseLinkCommand(token);
+      case "meta":
+        return startTagMeta(token);
+      case "head":
+        return startTagHead(token);
+      default:
+        return startTagOther(token);
+    }
+  }
+
+  processEndTag(EndTagToken token) {
+    switch (token.name) {
+      case "head":
+        return endTagHead(token);
+      case "br":
+      case "html":
+      case "body":
+        return endTagHtmlBodyBr(token);
+      default:
+        return endTagOther(token);
+    }
+  }
+
+  // the real thing
+  bool processEOF() {
+    anythingElse();
+    return true;
+  }
+
+  Token processCharacters(CharactersToken token) {
+    anythingElse();
+    return token;
+  }
+
+  Token startTagHtml(StartTagToken token) {
+    return parser._inBodyPhase.processStartTag(token);
+  }
+
+  void startTagHead(StartTagToken token) {
+    parser.parseError(token.span, "two-heads-are-not-better-than-one");
+  }
+
+  void startTagBaseLinkCommand(StartTagToken token) {
+    tree.insertElement(token);
+    tree.openElements.removeLast();
+    token.selfClosingAcknowledged = true;
+  }
+
+  void startTagMeta(StartTagToken token) {
+    tree.insertElement(token);
+    tree.openElements.removeLast();
+    token.selfClosingAcknowledged = true;
+
+    var attributes = token.data;
+    if (!parser.tokenizer.stream.charEncodingCertain) {
+      var charset = attributes["charset"];
+      var content = attributes["content"];
+      if (charset != null) {
+        parser.tokenizer.stream.changeEncoding(charset);
+      } else if (content != null) {
+        var data = new EncodingBytes(content);
+        var codec = new ContentAttrParser(data).parse();
+        parser.tokenizer.stream.changeEncoding(codec);
+      }
+    }
+  }
+
+  void startTagTitle(StartTagToken token) {
+    parser.parseRCDataRawtext(token, "RCDATA");
+  }
+
+  void startTagNoScriptNoFramesStyle(StartTagToken token) {
+    // Need to decide whether to implement the scripting-disabled case
+    parser.parseRCDataRawtext(token, "RAWTEXT");
+  }
+
+  void startTagScript(StartTagToken token) {
+    tree.insertElement(token);
+    parser.tokenizer.state = parser.tokenizer.scriptDataState;
+    parser.originalPhase = parser.phase;
+    parser.phase = parser._textPhase;
+  }
+
+  Token startTagOther(StartTagToken token) {
+    anythingElse();
+    return token;
+  }
+
+  void endTagHead(EndTagToken token) {
+    var node = parser.tree.openElements.removeLast();
+    assert(node.localName == "head");
+    node.endSourceSpan = token.span;
+    parser.phase = parser._afterHeadPhase;
+  }
+
+  Token endTagHtmlBodyBr(EndTagToken token) {
+    anythingElse();
+    return token;
+  }
+
+  void endTagOther(EndTagToken token) {
+    parser.parseError(token.span, "unexpected-end-tag", {"name": token.name});
+  }
+
+  void anythingElse() {
+    endTagHead(new EndTagToken("head"));
+  }
+}
+
+// XXX If we implement a parser for which scripting is disabled we need to
+// implement this phase.
+//
+// class InHeadNoScriptPhase extends Phase {
+
+class AfterHeadPhase extends Phase {
+  AfterHeadPhase(parser) : super(parser);
+
+  processStartTag(StartTagToken token) {
+    switch (token.name) {
+      case "html":
+        return startTagHtml(token);
+      case "body":
+        return startTagBody(token);
+      case "frameset":
+        return startTagFrameset(token);
+      case "base":
+      case "basefont":
+      case "bgsound":
+      case "link":
+      case "meta":
+      case "noframes":
+      case "script":
+      case "style":
+      case "title":
+        return startTagFromHead(token);
+      case "head":
+        return startTagHead(token);
+      default:
+        return startTagOther(token);
+    }
+  }
+
+  processEndTag(EndTagToken token) {
+    switch (token.name) {
+      case "body":
+      case "html":
+      case "br":
+        return endTagHtmlBodyBr(token);
+      default:
+        return endTagOther(token);
+    }
+  }
+
+  bool processEOF() {
+    anythingElse();
+    return true;
+  }
+
+  Token processCharacters(CharactersToken token) {
+    anythingElse();
+    return token;
+  }
+
+  Token startTagHtml(StartTagToken token) {
+    return parser._inBodyPhase.processStartTag(token);
+  }
+
+  void startTagBody(StartTagToken token) {
+    parser.framesetOK = false;
+    tree.insertElement(token);
+    parser.phase = parser._inBodyPhase;
+  }
+
+  void startTagFrameset(StartTagToken token) {
+    tree.insertElement(token);
+    parser.phase = parser._inFramesetPhase;
+  }
+
+  void startTagFromHead(StartTagToken token) {
+    parser.parseError(token.span, "unexpected-start-tag-out-of-my-head", {
+      "name": token.name
+    });
+    tree.openElements.add(tree.headPointer);
+    parser._inHeadPhase.processStartTag(token);
+    for (var node in tree.openElements.reversed) {
+      if (node.localName == "head") {
+        tree.openElements.remove(node);
+        break;
+      }
+    }
+  }
+
+  void startTagHead(StartTagToken token) {
+    parser.parseError(token.span, "unexpected-start-tag", {"name": token.name});
+  }
+
+  Token startTagOther(StartTagToken token) {
+    anythingElse();
+    return token;
+  }
+
+  Token endTagHtmlBodyBr(EndTagToken token) {
+    anythingElse();
+    return token;
+  }
+
+  void endTagOther(EndTagToken token) {
+    parser.parseError(token.span, "unexpected-end-tag", {"name": token.name});
+  }
+
+  void anythingElse() {
+    tree.insertElement(new StartTagToken("body", data: {}));
+    parser.phase = parser._inBodyPhase;
+    parser.framesetOK = true;
+  }
+}
+
+typedef Token TokenProccessor(Token token);
+
+class InBodyPhase extends Phase {
+  bool dropNewline = false;
+
+  // http://www.whatwg.org/specs/web-apps/current-work///parsing-main-inbody
+  // the really-really-really-very crazy mode
+  InBodyPhase(parser) : super(parser);
+
+  processStartTag(StartTagToken token) {
+    switch (token.name) {
+      case "html":
+        return startTagHtml(token);
+      case "base":
+      case "basefont":
+      case "bgsound":
+      case "command":
+      case "link":
+      case "meta":
+      case "noframes":
+      case "script":
+      case "style":
+      case "title":
+        return startTagProcessInHead(token);
+      case "body":
+        return startTagBody(token);
+      case "frameset":
+        return startTagFrameset(token);
+      case "address":
+      case "article":
+      case "aside":
+      case "blockquote":
+      case "center":
+      case "details":
+      case "details":
+      case "dir":
+      case "div":
+      case "dl":
+      case "fieldset":
+      case "figcaption":
+      case "figure":
+      case "footer":
+      case "header":
+      case "hgroup":
+      case "menu":
+      case "nav":
+      case "ol":
+      case "p":
+      case "section":
+      case "summary":
+      case "ul":
+        return startTagCloseP(token);
+      // headingElements
+      case "h1":
+      case "h2":
+      case "h3":
+      case "h4":
+      case "h5":
+      case "h6":
+        return startTagHeading(token);
+      case "pre":
+      case "listing":
+        return startTagPreListing(token);
+      case "form":
+        return startTagForm(token);
+      case "li":
+      case "dd":
+      case "dt":
+        return startTagListItem(token);
+      case "plaintext":
+        return startTagPlaintext(token);
+      case "a":
+        return startTagA(token);
+      case "b":
+      case "big":
+      case "code":
+      case "em":
+      case "font":
+      case "i":
+      case "s":
+      case "small":
+      case "strike":
+      case "strong":
+      case "tt":
+      case "u":
+        return startTagFormatting(token);
+      case "nobr":
+        return startTagNobr(token);
+      case "button":
+        return startTagButton(token);
+      case "applet":
+      case "marquee":
+      case "object":
+        return startTagAppletMarqueeObject(token);
+      case "xmp":
+        return startTagXmp(token);
+      case "table":
+        return startTagTable(token);
+      case "area":
+      case "br":
+      case "embed":
+      case "img":
+      case "keygen":
+      case "wbr":
+        return startTagVoidFormatting(token);
+      case "param":
+      case "source":
+      case "track":
+        return startTagParamSource(token);
+      case "input":
+        return startTagInput(token);
+      case "hr":
+        return startTagHr(token);
+      case "image":
+        return startTagImage(token);
+      case "isindex":
+        return startTagIsIndex(token);
+      case "textarea":
+        return startTagTextarea(token);
+      case "iframe":
+        return startTagIFrame(token);
+      case "noembed":
+      case "noframes":
+      case "noscript":
+        return startTagRawtext(token);
+      case "select":
+        return startTagSelect(token);
+      case "rp":
+      case "rt":
+        return startTagRpRt(token);
+      case "option":
+      case "optgroup":
+        return startTagOpt(token);
+      case "math":
+        return startTagMath(token);
+      case "svg":
+        return startTagSvg(token);
+      case "caption":
+      case "col":
+      case "colgroup":
+      case "frame":
+      case "head":
+      case "tbody":
+      case "td":
+      case "tfoot":
+      case "th":
+      case "thead":
+      case "tr":
+        return startTagMisplaced(token);
+      default:
+        return startTagOther(token);
+    }
+  }
+
+  processEndTag(EndTagToken token) {
+    switch (token.name) {
+      case "body":
+        return endTagBody(token);
+      case "html":
+        return endTagHtml(token);
+      case "address":
+      case "article":
+      case "aside":
+      case "blockquote":
+      case "center":
+      case "details":
+      case "dir":
+      case "div":
+      case "dl":
+      case "fieldset":
+      case "figcaption":
+      case "figure":
+      case "footer":
+      case "header":
+      case "hgroup":
+      case "listing":
+      case "menu":
+      case "nav":
+      case "ol":
+      case "pre":
+      case "section":
+      case "summary":
+      case "ul":
+        return endTagBlock(token);
+      case "form":
+        return endTagForm(token);
+      case "p":
+        return endTagP(token);
+      case "dd":
+      case "dt":
+      case "li":
+        return endTagListItem(token);
+      // headingElements
+      case "h1":
+      case "h2":
+      case "h3":
+      case "h4":
+      case "h5":
+      case "h6":
+        return endTagHeading(token);
+      case "a":
+      case "b":
+      case "big":
+      case "code":
+      case "em":
+      case "font":
+      case "i":
+      case "nobr":
+      case "s":
+      case "small":
+      case "strike":
+      case "strong":
+      case "tt":
+      case "u":
+        return endTagFormatting(token);
+      case "applet":
+      case "marquee":
+      case "object":
+        return endTagAppletMarqueeObject(token);
+      case "br":
+        return endTagBr(token);
+      default:
+        return endTagOther(token);
+    }
+  }
+
+  bool isMatchingFormattingElement(Element node1, Element node2) {
+    if (node1.localName != node2.localName ||
+        node1.namespaceUri != node2.namespaceUri) {
+      return false;
+    } else if (node1.attributes.length != node2.attributes.length) {
+      return false;
+    } else {
+      for (var key in node1.attributes.keys) {
+        if (node1.attributes[key] != node2.attributes[key]) {
+          return false;
+        }
+      }
+    }
+    return true;
+  }
+
+  // helper
+  void addFormattingElement(token) {
+    tree.insertElement(token);
+    var element = tree.openElements.last;
+
+    var matchingElements = [];
+    for (Node node in tree.activeFormattingElements.reversed) {
+      if (node == Marker) {
+        break;
+      } else if (isMatchingFormattingElement(node, element)) {
+        matchingElements.add(node);
+      }
+    }
+
+    assert(matchingElements.length <= 3);
+    if (matchingElements.length == 3) {
+      tree.activeFormattingElements.remove(matchingElements.last);
+    }
+    tree.activeFormattingElements.add(element);
+  }
+
+  // the real deal
+  bool processEOF() {
+    for (var node in tree.openElements.reversed) {
+      switch (node.localName) {
+        case "dd":
+        case "dt":
+        case "li":
+        case "p":
+        case "tbody":
+        case "td":
+        case "tfoot":
+        case "th":
+        case "thead":
+        case "tr":
+        case "body":
+        case "html":
+          continue;
+      }
+      parser.parseError(node.sourceSpan, "expected-closing-tag-but-got-eof");
+      break;
+    }
+    //Stop parsing
+    return false;
+  }
+
+  void processSpaceCharactersDropNewline(StringToken token) {
+    // Sometimes (start of <pre>, <listing>, and <textarea> blocks) we
+    // want to drop leading newlines
+    var data = token.data;
+    dropNewline = false;
+    if (data.startsWith("\n")) {
+      var lastOpen = tree.openElements.last;
+      if (const ["pre", "listing", "textarea"].contains(lastOpen.localName) &&
+          !lastOpen.hasContent()) {
+        data = data.substring(1);
+      }
+    }
+    if (data.length > 0) {
+      tree.reconstructActiveFormattingElements();
+      tree.insertText(data, token.span);
+    }
+  }
+
+  Token processCharacters(CharactersToken token) {
+    if (token.data == "\u0000") {
+      //The tokenizer should always emit null on its own
+      return null;
+    }
+    tree.reconstructActiveFormattingElements();
+    tree.insertText(token.data, token.span);
+    if (parser.framesetOK && !allWhitespace(token.data)) {
+      parser.framesetOK = false;
+    }
+    return null;
+  }
+
+  Token processSpaceCharacters(SpaceCharactersToken token) {
+    if (dropNewline) {
+      processSpaceCharactersDropNewline(token);
+    } else {
+      tree.reconstructActiveFormattingElements();
+      tree.insertText(token.data, token.span);
+    }
+    return null;
+  }
+
+  Token startTagProcessInHead(StartTagToken token) {
+    return parser._inHeadPhase.processStartTag(token);
+  }
+
+  void startTagBody(StartTagToken token) {
+    parser.parseError(token.span, "unexpected-start-tag", {"name": "body"});
+    if (tree.openElements.length == 1 ||
+        tree.openElements[1].localName != "body") {
+      assert(parser.innerHTMLMode);
+    } else {
+      parser.framesetOK = false;
+      token.data.forEach((attr, value) {
+        tree.openElements[1].attributes.putIfAbsent(attr, () => value);
+      });
+    }
+  }
+
+  void startTagFrameset(StartTagToken token) {
+    parser.parseError(token.span, "unexpected-start-tag", {"name": "frameset"});
+    if ((tree.openElements.length == 1 ||
+        tree.openElements[1].localName != "body")) {
+      assert(parser.innerHTMLMode);
+    } else if (parser.framesetOK) {
+      if (tree.openElements[1].parentNode != null) {
+        tree.openElements[1].parentNode.nodes.remove(tree.openElements[1]);
+      }
+      while (tree.openElements.last.localName != "html") {
+        tree.openElements.removeLast();
+      }
+      tree.insertElement(token);
+      parser.phase = parser._inFramesetPhase;
+    }
+  }
+
+  void startTagCloseP(StartTagToken token) {
+    if (tree.elementInScope("p", variant: "button")) {
+      endTagP(new EndTagToken("p"));
+    }
+    tree.insertElement(token);
+  }
+
+  void startTagPreListing(StartTagToken token) {
+    if (tree.elementInScope("p", variant: "button")) {
+      endTagP(new EndTagToken("p"));
+    }
+    tree.insertElement(token);
+    parser.framesetOK = false;
+    dropNewline = true;
+  }
+
+  void startTagForm(StartTagToken token) {
+    if (tree.formPointer != null) {
+      parser.parseError(token.span, "unexpected-start-tag", {"name": "form"});
+    } else {
+      if (tree.elementInScope("p", variant: "button")) {
+        endTagP(new EndTagToken("p"));
+      }
+      tree.insertElement(token);
+      tree.formPointer = tree.openElements.last;
+    }
+  }
+
+  void startTagListItem(StartTagToken token) {
+    parser.framesetOK = false;
+
+    final stopNamesMap = const {
+      "li": const ["li"],
+      "dt": const ["dt", "dd"],
+      "dd": const ["dt", "dd"]
+    };
+    var stopNames = stopNamesMap[token.name];
+    for (var node in tree.openElements.reversed) {
+      if (stopNames.contains(node.localName)) {
+        parser.phase.processEndTag(new EndTagToken(node.localName));
+        break;
+      }
+      if (specialElements.contains(getElementNameTuple(node)) &&
+          !const ["address", "div", "p"].contains(node.localName)) {
+        break;
+      }
+    }
+
+    if (tree.elementInScope("p", variant: "button")) {
+      parser.phase.processEndTag(new EndTagToken("p"));
+    }
+
+    tree.insertElement(token);
+  }
+
+  void startTagPlaintext(StartTagToken token) {
+    if (tree.elementInScope("p", variant: "button")) {
+      endTagP(new EndTagToken("p"));
+    }
+    tree.insertElement(token);
+    parser.tokenizer.state = parser.tokenizer.plaintextState;
+  }
+
+  void startTagHeading(StartTagToken token) {
+    if (tree.elementInScope("p", variant: "button")) {
+      endTagP(new EndTagToken("p"));
+    }
+    if (headingElements.contains(tree.openElements.last.localName)) {
+      parser.parseError(
+          token.span, "unexpected-start-tag", {"name": token.name});
+      tree.openElements.removeLast();
+    }
+    tree.insertElement(token);
+  }
+
+  void startTagA(StartTagToken token) {
+    var afeAElement = tree.elementInActiveFormattingElements("a");
+    if (afeAElement != null) {
+      parser.parseError(token.span, "unexpected-start-tag-implies-end-tag", {
+        "startName": "a",
+        "endName": "a"
+      });
+      endTagFormatting(new EndTagToken("a"));
+      tree.openElements.remove(afeAElement);
+      tree.activeFormattingElements.remove(afeAElement);
+    }
+    tree.reconstructActiveFormattingElements();
+    addFormattingElement(token);
+  }
+
+  void startTagFormatting(StartTagToken token) {
+    tree.reconstructActiveFormattingElements();
+    addFormattingElement(token);
+  }
+
+  void startTagNobr(StartTagToken token) {
+    tree.reconstructActiveFormattingElements();
+    if (tree.elementInScope("nobr")) {
+      parser.parseError(token.span, "unexpected-start-tag-implies-end-tag", {
+        "startName": "nobr",
+        "endName": "nobr"
+      });
+      processEndTag(new EndTagToken("nobr"));
+      // XXX Need tests that trigger the following
+      tree.reconstructActiveFormattingElements();
+    }
+    addFormattingElement(token);
+  }
+
+  Token startTagButton(StartTagToken token) {
+    if (tree.elementInScope("button")) {
+      parser.parseError(token.span, "unexpected-start-tag-implies-end-tag", {
+        "startName": "button",
+        "endName": "button"
+      });
+      processEndTag(new EndTagToken("button"));
+      return token;
+    } else {
+      tree.reconstructActiveFormattingElements();
+      tree.insertElement(token);
+      parser.framesetOK = false;
+    }
+    return null;
+  }
+
+  void startTagAppletMarqueeObject(StartTagToken token) {
+    tree.reconstructActiveFormattingElements();
+    tree.insertElement(token);
+    tree.activeFormattingElements.add(Marker);
+    parser.framesetOK = false;
+  }
+
+  void startTagXmp(StartTagToken token) {
+    if (tree.elementInScope("p", variant: "button")) {
+      endTagP(new EndTagToken("p"));
+    }
+    tree.reconstructActiveFormattingElements();
+    parser.framesetOK = false;
+    parser.parseRCDataRawtext(token, "RAWTEXT");
+  }
+
+  void startTagTable(StartTagToken token) {
+    if (parser.compatMode != "quirks") {
+      if (tree.elementInScope("p", variant: "button")) {
+        processEndTag(new EndTagToken("p"));
+      }
+    }
+    tree.insertElement(token);
+    parser.framesetOK = false;
+    parser.phase = parser._inTablePhase;
+  }
+
+  void startTagVoidFormatting(StartTagToken token) {
+    tree.reconstructActiveFormattingElements();
+    tree.insertElement(token);
+    tree.openElements.removeLast();
+    token.selfClosingAcknowledged = true;
+    parser.framesetOK = false;
+  }
+
+  void startTagInput(StartTagToken token) {
+    var savedFramesetOK = parser.framesetOK;
+    startTagVoidFormatting(token);
+    if (asciiUpper2Lower(token.data["type"]) == "hidden") {
+      //input type=hidden doesn't change framesetOK
+      parser.framesetOK = savedFramesetOK;
+    }
+  }
+
+  void startTagParamSource(StartTagToken token) {
+    tree.insertElement(token);
+    tree.openElements.removeLast();
+    token.selfClosingAcknowledged = true;
+  }
+
+  void startTagHr(StartTagToken token) {
+    if (tree.elementInScope("p", variant: "button")) {
+      endTagP(new EndTagToken("p"));
+    }
+    tree.insertElement(token);
+    tree.openElements.removeLast();
+    token.selfClosingAcknowledged = true;
+    parser.framesetOK = false;
+  }
+
+  void startTagImage(StartTagToken token) {
+    // No really...
+    parser.parseError(token.span, "unexpected-start-tag-treated-as", {
+      "originalName": "image",
+      "newName": "img"
+    });
+    processStartTag(new StartTagToken("img",
+        data: token.data, selfClosing: token.selfClosing));
+  }
+
+  void startTagIsIndex(StartTagToken token) {
+    parser.parseError(token.span, "deprecated-tag", {"name": "isindex"});
+    if (tree.formPointer != null) {
+      return;
+    }
+    var formAttrs = {};
+    var dataAction = token.data["action"];
+    if (dataAction != null) {
+      formAttrs["action"] = dataAction;
+    }
+    processStartTag(new StartTagToken("form", data: formAttrs));
+    processStartTag(new StartTagToken("hr", data: {}));
+    processStartTag(new StartTagToken("label", data: {}));
+    // XXX Localization ...
+    var prompt = token.data["prompt"];
+    if (prompt == null) {
+      prompt = "This is a searchable index. Enter search keywords: ";
+    }
+    processCharacters(new CharactersToken(prompt));
+    var attributes = new LinkedHashMap.from(token.data);
+    attributes.remove('action');
+    attributes.remove('prompt');
+    attributes["name"] = "isindex";
+    processStartTag(new StartTagToken(
+        "input", data: attributes, selfClosing: token.selfClosing));
+    processEndTag(new EndTagToken("label"));
+    processStartTag(new StartTagToken("hr", data: {}));
+    processEndTag(new EndTagToken("form"));
+  }
+
+  void startTagTextarea(StartTagToken token) {
+    tree.insertElement(token);
+    parser.tokenizer.state = parser.tokenizer.rcdataState;
+    dropNewline = true;
+    parser.framesetOK = false;
+  }
+
+  void startTagIFrame(StartTagToken token) {
+    parser.framesetOK = false;
+    startTagRawtext(token);
+  }
+
+  /// iframe, noembed noframes, noscript(if scripting enabled).
+  void startTagRawtext(StartTagToken token) {
+    parser.parseRCDataRawtext(token, "RAWTEXT");
+  }
+
+  void startTagOpt(StartTagToken token) {
+    if (tree.openElements.last.localName == "option") {
+      parser.phase.processEndTag(new EndTagToken("option"));
+    }
+    tree.reconstructActiveFormattingElements();
+    parser.tree.insertElement(token);
+  }
+
+  void startTagSelect(StartTagToken token) {
+    tree.reconstructActiveFormattingElements();
+    tree.insertElement(token);
+    parser.framesetOK = false;
+
+    if (parser._inTablePhase == parser.phase ||
+        parser._inCaptionPhase == parser.phase ||
+        parser._inColumnGroupPhase == parser.phase ||
+        parser._inTableBodyPhase == parser.phase ||
+        parser._inRowPhase == parser.phase ||
+        parser._inCellPhase == parser.phase) {
+      parser.phase = parser._inSelectInTablePhase;
+    } else {
+      parser.phase = parser._inSelectPhase;
+    }
+  }
+
+  void startTagRpRt(StartTagToken token) {
+    if (tree.elementInScope("ruby")) {
+      tree.generateImpliedEndTags();
+      var last = tree.openElements.last;
+      if (last.localName != "ruby") {
+        parser.parseError(last.sourceSpan, 'undefined-error');
+      }
+    }
+    tree.insertElement(token);
+  }
+
+  void startTagMath(StartTagToken token) {
+    tree.reconstructActiveFormattingElements();
+    parser.adjustMathMLAttributes(token);
+    parser.adjustForeignAttributes(token);
+    token.namespace = Namespaces.mathml;
+    tree.insertElement(token);
+    //Need to get the parse error right for the case where the token
+    //has a namespace not equal to the xmlns attribute
+    if (token.selfClosing) {
+      tree.openElements.removeLast();
+      token.selfClosingAcknowledged = true;
+    }
+  }
+
+  void startTagSvg(StartTagToken token) {
+    tree.reconstructActiveFormattingElements();
+    parser.adjustSVGAttributes(token);
+    parser.adjustForeignAttributes(token);
+    token.namespace = Namespaces.svg;
+    tree.insertElement(token);
+    //Need to get the parse error right for the case where the token
+    //has a namespace not equal to the xmlns attribute
+    if (token.selfClosing) {
+      tree.openElements.removeLast();
+      token.selfClosingAcknowledged = true;
+    }
+  }
+
+  /// Elements that should be children of other elements that have a
+  /// different insertion mode; here they are ignored
+  /// "caption", "col", "colgroup", "frame", "frameset", "head",
+  /// "option", "optgroup", "tbody", "td", "tfoot", "th", "thead",
+  /// "tr", "noscript"
+  void startTagMisplaced(StartTagToken token) {
+    parser.parseError(
+        token.span, "unexpected-start-tag-ignored", {"name": token.name});
+  }
+
+  Token startTagOther(StartTagToken token) {
+    tree.reconstructActiveFormattingElements();
+    tree.insertElement(token);
+    return null;
+  }
+
+  void endTagP(EndTagToken token) {
+    if (!tree.elementInScope("p", variant: "button")) {
+      startTagCloseP(new StartTagToken("p", data: {}));
+      parser.parseError(token.span, "unexpected-end-tag", {"name": "p"});
+      endTagP(new EndTagToken("p"));
+    } else {
+      tree.generateImpliedEndTags("p");
+      if (tree.openElements.last.localName != "p") {
+        parser.parseError(token.span, "unexpected-end-tag", {"name": "p"});
+      }
+      popOpenElementsUntil(token);
+    }
+  }
+
+  void endTagBody(EndTagToken token) {
+    if (!tree.elementInScope("body")) {
+      parser.parseError(token.span, 'undefined-error');
+      return;
+    } else if (tree.openElements.last.localName == "body") {
+      tree.openElements.last.endSourceSpan = token.span;
+    } else {
+      for (Element node in slice(tree.openElements, 2)) {
+        switch (node.localName) {
+          case "dd":
+          case "dt":
+          case "li":
+          case "optgroup":
+          case "option":
+          case "p":
+          case "rp":
+          case "rt":
+          case "tbody":
+          case "td":
+          case "tfoot":
+          case "th":
+          case "thead":
+          case "tr":
+          case "body":
+          case "html":
+            continue;
+        }
+        // Not sure this is the correct name for the parse error
+        parser.parseError(token.span, "expected-one-end-tag-but-got-another", {
+          "gotName": "body",
+          "expectedName": node.localName
+        });
+        break;
+      }
+    }
+    parser.phase = parser._afterBodyPhase;
+  }
+
+  Token endTagHtml(EndTagToken token) {
+    //We repeat the test for the body end tag token being ignored here
+    if (tree.elementInScope("body")) {
+      endTagBody(new EndTagToken("body"));
+      return token;
+    }
+    return null;
+  }
+
+  void endTagBlock(EndTagToken token) {
+    //Put us back in the right whitespace handling mode
+    if (token.name == "pre") {
+      dropNewline = false;
+    }
+    var inScope = tree.elementInScope(token.name);
+    if (inScope) {
+      tree.generateImpliedEndTags();
+    }
+    if (tree.openElements.last.localName != token.name) {
+      parser.parseError(token.span, "end-tag-too-early", {"name": token.name});
+    }
+    if (inScope) {
+      popOpenElementsUntil(token);
+    }
+  }
+
+  void endTagForm(EndTagToken token) {
+    var node = tree.formPointer;
+    tree.formPointer = null;
+    if (node == null || !tree.elementInScope(node)) {
+      parser.parseError(token.span, "unexpected-end-tag", {"name": "form"});
+    } else {
+      tree.generateImpliedEndTags();
+      if (tree.openElements.last != node) {
+        parser.parseError(
+            token.span, "end-tag-too-early-ignored", {"name": "form"});
+      }
+      tree.openElements.remove(node);
+      node.endSourceSpan = token.span;
+    }
+  }
+
+  void endTagListItem(EndTagToken token) {
+    var variant;
+    if (token.name == "li") {
+      variant = "list";
+    } else {
+      variant = null;
+    }
+    if (!tree.elementInScope(token.name, variant: variant)) {
+      parser.parseError(token.span, "unexpected-end-tag", {"name": token.name});
+    } else {
+      tree.generateImpliedEndTags(token.name);
+      if (tree.openElements.last.localName != token.name) {
+        parser.parseError(
+            token.span, "end-tag-too-early", {"name": token.name});
+      }
+      popOpenElementsUntil(token);
+    }
+  }
+
+  void endTagHeading(EndTagToken token) {
+    for (var item in headingElements) {
+      if (tree.elementInScope(item)) {
+        tree.generateImpliedEndTags();
+        break;
+      }
+    }
+    if (tree.openElements.last.localName != token.name) {
+      parser.parseError(token.span, "end-tag-too-early", {"name": token.name});
+    }
+
+    for (var item in headingElements) {
+      if (tree.elementInScope(item)) {
+        Element node = tree.openElements.removeLast();
+        while (!headingElements.contains(node.localName)) {
+          node = tree.openElements.removeLast();
+        }
+        if (node != null) {
+          node.endSourceSpan = token.span;
+        }
+        break;
+      }
+    }
+  }
+
+  /// The much-feared adoption agency algorithm.
+  endTagFormatting(EndTagToken token) {
+    // http://www.whatwg.org/specs/web-apps/current-work/multipage/tree-construction.html#adoptionAgency
+    // TODO(jmesserly): the comments here don't match the numbered steps in the
+    // updated spec. This needs a pass over it to verify that it still matches.
+    // In particular the html5lib Python code skiped "step 4", I'm not sure why.
+    // XXX Better parseError messages appreciated.
+    int outerLoopCounter = 0;
+    while (outerLoopCounter < 8) {
+      outerLoopCounter += 1;
+
+      // Step 1 paragraph 1
+      var formattingElement =
+          tree.elementInActiveFormattingElements(token.name);
+      if (formattingElement == null ||
+          (tree.openElements.contains(formattingElement) &&
+              !tree.elementInScope(formattingElement.localName))) {
+        parser.parseError(
+            token.span, "adoption-agency-1.1", {"name": token.name});
+        return;
+        // Step 1 paragraph 2
+      } else if (!tree.openElements.contains(formattingElement)) {
+        parser.parseError(
+            token.span, "adoption-agency-1.2", {"name": token.name});
+        tree.activeFormattingElements.remove(formattingElement);
+        return;
+      }
+
+      // Step 1 paragraph 3
+      if (formattingElement != tree.openElements.last) {
+        parser.parseError(
+            token.span, "adoption-agency-1.3", {"name": token.name});
+      }
+
+      // Step 2
+      // Start of the adoption agency algorithm proper
+      var afeIndex = tree.openElements.indexOf(formattingElement);
+      Node furthestBlock = null;
+      for (Node element in slice(tree.openElements, afeIndex)) {
+        if (specialElements.contains(getElementNameTuple(element))) {
+          furthestBlock = element;
+          break;
+        }
+      }
+      // Step 3
+      if (furthestBlock == null) {
+        Element element = tree.openElements.removeLast();
+        while (element != formattingElement) {
+          element = tree.openElements.removeLast();
+        }
+        if (element != null) {
+          element.endSourceSpan = token.span;
+        }
+        tree.activeFormattingElements.remove(element);
+        return;
+      }
+
+      var commonAncestor = tree.openElements[afeIndex - 1];
+
+      // Step 5
+      // The bookmark is supposed to help us identify where to reinsert
+      // nodes in step 12. We have to ensure that we reinsert nodes after
+      // the node before the active formatting element. Note the bookmark
+      // can move in step 7.4
+      var bookmark = tree.activeFormattingElements.indexOf(formattingElement);
+
+      // Step 6
+      Node lastNode = furthestBlock;
+      var node = furthestBlock;
+      int innerLoopCounter = 0;
+
+      var index = tree.openElements.indexOf(node);
+      while (innerLoopCounter < 3) {
+        innerLoopCounter += 1;
+
+        // Node is element before node in open elements
+        index -= 1;
+        node = tree.openElements[index];
+        if (!tree.activeFormattingElements.contains(node)) {
+          tree.openElements.remove(node);
+          continue;
+        }
+        // Step 6.3
+        if (node == formattingElement) {
+          break;
+        }
+        // Step 6.4
+        if (lastNode == furthestBlock) {
+          bookmark = (tree.activeFormattingElements.indexOf(node) + 1);
+        }
+        // Step 6.5
+        //cite = node.parent
+        var clone = node.clone(false);
+        // Replace node with clone
+        tree.activeFormattingElements[
+            tree.activeFormattingElements.indexOf(node)] = clone;
+        tree.openElements[tree.openElements.indexOf(node)] = clone;
+        node = clone;
+
+        // Step 6.6
+        // Remove lastNode from its parents, if any
+        if (lastNode.parentNode != null) {
+          lastNode.parentNode.nodes.remove(lastNode);
+        }
+        node.nodes.add(lastNode);
+        // Step 7.7
+        lastNode = node;
+        // End of inner loop
+      }
+
+      // Step 7
+      // Foster parent lastNode if commonAncestor is a
+      // table, tbody, tfoot, thead, or tr we need to foster parent the
+      // lastNode
+      if (lastNode.parentNode != null) {
+        lastNode.parentNode.nodes.remove(lastNode);
+      }
+
+      if (const [
+        "table",
+        "tbody",
+        "tfoot",
+        "thead",
+        "tr"
+      ].contains(commonAncestor.localName)) {
+        var nodePos = tree.getTableMisnestedNodePosition();
+        nodePos[0].insertBefore(lastNode, nodePos[1]);
+      } else {
+        commonAncestor.nodes.add(lastNode);
+      }
+
+      // Step 8
+      var clone = formattingElement.clone(false);
+
+      // Step 9
+      furthestBlock.reparentChildren(clone);
+
+      // Step 10
+      furthestBlock.nodes.add(clone);
+
+      // Step 11
+      tree.activeFormattingElements.remove(formattingElement);
+      tree.activeFormattingElements.insert(
+          min(bookmark, tree.activeFormattingElements.length), clone);
+
+      // Step 12
+      tree.openElements.remove(formattingElement);
+      tree.openElements.insert(
+          tree.openElements.indexOf(furthestBlock) + 1, clone);
+    }
+  }
+
+  void endTagAppletMarqueeObject(EndTagToken token) {
+    if (tree.elementInScope(token.name)) {
+      tree.generateImpliedEndTags();
+    }
+    if (tree.openElements.last.localName != token.name) {
+      parser.parseError(token.span, "end-tag-too-early", {"name": token.name});
+    }
+    if (tree.elementInScope(token.name)) {
+      popOpenElementsUntil(token);
+      tree.clearActiveFormattingElements();
+    }
+  }
+
+  void endTagBr(EndTagToken token) {
+    parser.parseError(token.span, "unexpected-end-tag-treated-as", {
+      "originalName": "br",
+      "newName": "br element"
+    });
+    tree.reconstructActiveFormattingElements();
+    tree.insertElement(new StartTagToken("br", data: {}));
+    tree.openElements.removeLast();
+  }
+
+  void endTagOther(EndTagToken token) {
+    for (var node in tree.openElements.reversed) {
+      if (node.localName == token.name) {
+        tree.generateImpliedEndTags(token.name);
+        if (tree.openElements.last.localName != token.name) {
+          parser.parseError(
+              token.span, "unexpected-end-tag", {"name": token.name});
+        }
+        while (tree.openElements.removeLast() != node);
+        node.endSourceSpan = token.span;
+        break;
+      } else {
+        if (specialElements.contains(getElementNameTuple(node))) {
+          parser.parseError(
+              token.span, "unexpected-end-tag", {"name": token.name});
+          break;
+        }
+      }
+    }
+  }
+}
+
+class TextPhase extends Phase {
+  TextPhase(parser) : super(parser);
+
+  // "Tried to process start tag %s in RCDATA/RAWTEXT mode"%token.name
+  processStartTag(StartTagToken token) {
+    assert(false);
+  }
+
+  processEndTag(EndTagToken token) {
+    if (token.name == 'script') return endTagScript(token);
+    return endTagOther(token);
+  }
+
+  Token processCharacters(CharactersToken token) {
+    tree.insertText(token.data, token.span);
+    return null;
+  }
+
+  bool processEOF() {
+    var last = tree.openElements.last;
+    parser.parseError(last.sourceSpan, "expected-named-closing-tag-but-got-eof",
+        {'name': last.localName});
+    tree.openElements.removeLast();
+    parser.phase = parser.originalPhase;
+    return true;
+  }
+
+  void endTagScript(EndTagToken token) {
+    var node = tree.openElements.removeLast();
+    assert(node.localName == "script");
+    parser.phase = parser.originalPhase;
+    //The rest of this method is all stuff that only happens if
+    //document.write works
+  }
+
+  void endTagOther(EndTagToken token) {
+    tree.openElements.removeLast();
+    parser.phase = parser.originalPhase;
+  }
+}
+
+class InTablePhase extends Phase {
+  // http://www.whatwg.org/specs/web-apps/current-work///in-table
+  InTablePhase(parser) : super(parser);
+
+  processStartTag(StartTagToken token) {
+    switch (token.name) {
+      case "html":
+        return startTagHtml(token);
+      case "caption":
+        return startTagCaption(token);
+      case "colgroup":
+        return startTagColgroup(token);
+      case "col":
+        return startTagCol(token);
+      case "tbody":
+      case "tfoot":
+      case "thead":
+        return startTagRowGroup(token);
+      case "td":
+      case "th":
+      case "tr":
+        return startTagImplyTbody(token);
+      case "table":
+        return startTagTable(token);
+      case "style":
+      case "script":
+        return startTagStyleScript(token);
+      case "input":
+        return startTagInput(token);
+      case "form":
+        return startTagForm(token);
+      default:
+        return startTagOther(token);
+    }
+  }
+
+  processEndTag(EndTagToken token) {
+    switch (token.name) {
+      case "table":
+        return endTagTable(token);
+      case "body":
+      case "caption":
+      case "col":
+      case "colgroup":
+      case "html":
+      case "tbody":
+      case "td":
+      case "tfoot":
+      case "th":
+      case "thead":
+      case "tr":
+        return endTagIgnore(token);
+      default:
+        return endTagOther(token);
+    }
+  }
+
+  // helper methods
+  void clearStackToTableContext() {
+    // "clear the stack back to a table context"
+    while (tree.openElements.last.localName != "table" &&
+        tree.openElements.last.localName != "html") {
+      //parser.parseError(token.span, "unexpected-implied-end-tag-in-table",
+      //  {"name":  tree.openElements.last.name})
+      tree.openElements.removeLast();
+    }
+    // When the current node is <html> it's an innerHTML case
+  }
+
+  // processing methods
+  bool processEOF() {
+    var last = tree.openElements.last;
+    if (last.localName != "html") {
+      parser.parseError(last.sourceSpan, "eof-in-table");
+    } else {
+      assert(parser.innerHTMLMode);
+    }
+    //Stop parsing
+    return false;
+  }
+
+  Token processSpaceCharacters(SpaceCharactersToken token) {
+    var originalPhase = parser.phase;
+    parser.phase = parser._inTableTextPhase;
+    parser._inTableTextPhase.originalPhase = originalPhase;
+    parser.phase.processSpaceCharacters(token);
+    return null;
+  }
+
+  Token processCharacters(CharactersToken token) {
+    var originalPhase = parser.phase;
+    parser.phase = parser._inTableTextPhase;
+    parser._inTableTextPhase.originalPhase = originalPhase;
+    parser.phase.processCharacters(token);
+    return null;
+  }
+
+  void insertText(CharactersToken token) {
+    // If we get here there must be at least one non-whitespace character
+    // Do the table magic!
+    tree.insertFromTable = true;
+    parser._inBodyPhase.processCharacters(token);
+    tree.insertFromTable = false;
+  }
+
+  void startTagCaption(StartTagToken token) {
+    clearStackToTableContext();
+    tree.activeFormattingElements.add(Marker);
+    tree.insertElement(token);
+    parser.phase = parser._inCaptionPhase;
+  }
+
+  void startTagColgroup(StartTagToken token) {
+    clearStackToTableContext();
+    tree.insertElement(token);
+    parser.phase = parser._inColumnGroupPhase;
+  }
+
+  Token startTagCol(StartTagToken token) {
+    startTagColgroup(new StartTagToken("colgroup", data: {}));
+    return token;
+  }
+
+  void startTagRowGroup(StartTagToken token) {
+    clearStackToTableContext();
+    tree.insertElement(token);
+    parser.phase = parser._inTableBodyPhase;
+  }
+
+  Token startTagImplyTbody(StartTagToken token) {
+    startTagRowGroup(new StartTagToken("tbody", data: {}));
+    return token;
+  }
+
+  Token startTagTable(StartTagToken token) {
+    parser.parseError(token.span, "unexpected-start-tag-implies-end-tag", {
+      "startName": "table",
+      "endName": "table"
+    });
+    parser.phase.processEndTag(new EndTagToken("table"));
+    if (!parser.innerHTMLMode) {
+      return token;
+    }
+    return null;
+  }
+
+  Token startTagStyleScript(StartTagToken token) {
+    return parser._inHeadPhase.processStartTag(token);
+  }
+
+  void startTagInput(StartTagToken token) {
+    if (asciiUpper2Lower(token.data["type"]) == "hidden") {
+      parser.parseError(token.span, "unexpected-hidden-input-in-table");
+      tree.insertElement(token);
+      // XXX associate with form
+      tree.openElements.removeLast();
+    } else {
+      startTagOther(token);
+    }
+  }
+
+  void startTagForm(StartTagToken token) {
+    parser.parseError(token.span, "unexpected-form-in-table");
+    if (tree.formPointer == null) {
+      tree.insertElement(token);
+      tree.formPointer = tree.openElements.last;
+      tree.openElements.removeLast();
+    }
+  }
+
+  void startTagOther(StartTagToken token) {
+    parser.parseError(token.span, "unexpected-start-tag-implies-table-voodoo", {
+      "name": token.name
+    });
+    // Do the table magic!
+    tree.insertFromTable = true;
+    parser._inBodyPhase.processStartTag(token);
+    tree.insertFromTable = false;
+  }
+
+  void endTagTable(EndTagToken token) {
+    if (tree.elementInScope("table", variant: "table")) {
+      tree.generateImpliedEndTags();
+      var last = tree.openElements.last;
+      if (last.localName != "table") {
+        parser.parseError(token.span, "end-tag-too-early-named", {
+          "gotName": "table",
+          "expectedName": last.localName
+        });
+      }
+      while (tree.openElements.last.localName != "table") {
+        tree.openElements.removeLast();
+      }
+      var node = tree.openElements.removeLast();
+      node.endSourceSpan = token.span;
+      parser.resetInsertionMode();
+    } else {
+      // innerHTML case
+      assert(parser.innerHTMLMode);
+      parser.parseError(token.span, "undefined-error");
+    }
+  }
+
+  void endTagIgnore(EndTagToken token) {
+    parser.parseError(token.span, "unexpected-end-tag", {"name": token.name});
+  }
+
+  void endTagOther(EndTagToken token) {
+    parser.parseError(token.span, "unexpected-end-tag-implies-table-voodoo", {
+      "name": token.name
+    });
+    // Do the table magic!
+    tree.insertFromTable = true;
+    parser._inBodyPhase.processEndTag(token);
+    tree.insertFromTable = false;
+  }
+}
+
+class InTableTextPhase extends Phase {
+  Phase originalPhase;
+  List<StringToken> characterTokens;
+
+  InTableTextPhase(parser)
+      : characterTokens = <StringToken>[],
+        super(parser);
+
+  void flushCharacters() {
+    if (characterTokens.length == 0) return;
+
+    // TODO(sigmund,jmesserly): remove '' (dartbug.com/8480)
+    var data = characterTokens.map((t) => t.data).join('');
+    var span = null;
+
+    if (parser.generateSpans) {
+      span = characterTokens[0].span.expand(characterTokens.last.span);
+    }
+
+    if (!allWhitespace(data)) {
+      parser._inTablePhase.insertText(new CharactersToken(data)..span = span);
+    } else if (data.length > 0) {
+      tree.insertText(data, span);
+    }
+    characterTokens = <StringToken>[];
+  }
+
+  Token processComment(CommentToken token) {
+    flushCharacters();
+    parser.phase = originalPhase;
+    return token;
+  }
+
+  bool processEOF() {
+    flushCharacters();
+    parser.phase = originalPhase;
+    return true;
+  }
+
+  Token processCharacters(CharactersToken token) {
+    if (token.data == "\u0000") {
+      return null;
+    }
+    characterTokens.add(token);
+    return null;
+  }
+
+  Token processSpaceCharacters(SpaceCharactersToken token) {
+    //pretty sure we should never reach here
+    characterTokens.add(token);
+    // XXX assert(false);
+    return null;
+  }
+
+  Token processStartTag(StartTagToken token) {
+    flushCharacters();
+    parser.phase = originalPhase;
+    return token;
+  }
+
+  Token processEndTag(EndTagToken token) {
+    flushCharacters();
+    parser.phase = originalPhase;
+    return token;
+  }
+}
+
+class InCaptionPhase extends Phase {
+  // http://www.whatwg.org/specs/web-apps/current-work///in-caption
+  InCaptionPhase(parser) : super(parser);
+
+  processStartTag(StartTagToken token) {
+    switch (token.name) {
+      case "html":
+        return startTagHtml(token);
+      case "caption":
+      case "col":
+      case "colgroup":
+      case "tbody":
+      case "td":
+      case "tfoot":
+      case "th":
+      case "thead":
+      case "tr":
+        return startTagTableElement(token);
+      default:
+        return startTagOther(token);
+    }
+  }
+
+  processEndTag(EndTagToken token) {
+    switch (token.name) {
+      case "caption":
+        return endTagCaption(token);
+      case "table":
+        return endTagTable(token);
+      case "body":
+      case "col":
+      case "colgroup":
+      case "html":
+      case "tbody":
+      case "td":
+      case "tfoot":
+      case "th":
+      case "thead":
+      case "tr":
+        return endTagIgnore(token);
+      default:
+        return endTagOther(token);
+    }
+  }
+
+  bool ignoreEndTagCaption() {
+    return !tree.elementInScope("caption", variant: "table");
+  }
+
+  bool processEOF() {
+    parser._inBodyPhase.processEOF();
+    return false;
+  }
+
+  Token processCharacters(CharactersToken token) {
+    return parser._inBodyPhase.processCharacters(token);
+  }
+
+  Token startTagTableElement(StartTagToken token) {
+    parser.parseError(token.span, "undefined-error");
+    //XXX Have to duplicate logic here to find out if the tag is ignored
+    var ignoreEndTag = ignoreEndTagCaption();
+    parser.phase.processEndTag(new EndTagToken("caption"));
+    if (!ignoreEndTag) {
+      return token;
+    }
+    return null;
+  }
+
+  Token startTagOther(StartTagToken token) {
+    return parser._inBodyPhase.processStartTag(token);
+  }
+
+  void endTagCaption(EndTagToken token) {
+    if (!ignoreEndTagCaption()) {
+      // AT this code is quite similar to endTagTable in "InTable"
+      tree.generateImpliedEndTags();
+      if (tree.openElements.last.localName != "caption") {
+        parser.parseError(token.span, "expected-one-end-tag-but-got-another", {
+          "gotName": "caption",
+          "expectedName": tree.openElements.last.localName
+        });
+      }
+      while (tree.openElements.last.localName != "caption") {
+        tree.openElements.removeLast();
+      }
+      var node = tree.openElements.removeLast();
+      node.endSourceSpan = token.span;
+      tree.clearActiveFormattingElements();
+      parser.phase = parser._inTablePhase;
+    } else {
+      // innerHTML case
+      assert(parser.innerHTMLMode);
+      parser.parseError(token.span, "undefined-error");
+    }
+  }
+
+  Token endTagTable(EndTagToken token) {
+    parser.parseError(token.span, "undefined-error");
+    var ignoreEndTag = ignoreEndTagCaption();
+    parser.phase.processEndTag(new EndTagToken("caption"));
+    if (!ignoreEndTag) {
+      return token;
+    }
+    return null;
+  }
+
+  void endTagIgnore(EndTagToken token) {
+    parser.parseError(token.span, "unexpected-end-tag", {"name": token.name});
+  }
+
+  Token endTagOther(EndTagToken token) {
+    return parser._inBodyPhase.processEndTag(token);
+  }
+}
+
+class InColumnGroupPhase extends Phase {
+  // http://www.whatwg.org/specs/web-apps/current-work///in-column
+  InColumnGroupPhase(parser) : super(parser);
+
+  processStartTag(StartTagToken token) {
+    switch (token.name) {
+      case "html":
+        return startTagHtml(token);
+      case "col":
+        return startTagCol(token);
+      default:
+        return startTagOther(token);
+    }
+  }
+
+  processEndTag(EndTagToken token) {
+    switch (token.name) {
+      case "colgroup":
+        return endTagColgroup(token);
+      case "col":
+        return endTagCol(token);
+      default:
+        return endTagOther(token);
+    }
+  }
+
+  bool ignoreEndTagColgroup() {
+    return tree.openElements.last.localName == "html";
+  }
+
+  bool processEOF() {
+    var ignoreEndTag = ignoreEndTagColgroup();
+    if (ignoreEndTag) {
+      assert(parser.innerHTMLMode);
+      return false;
+    } else {
+      endTagColgroup(new EndTagToken("colgroup"));
+      return true;
+    }
+  }
+
+  Token processCharacters(CharactersToken token) {
+    var ignoreEndTag = ignoreEndTagColgroup();
+    endTagColgroup(new EndTagToken("colgroup"));
+    return ignoreEndTag ? null : token;
+  }
+
+  void startTagCol(StartTagToken token) {
+    tree.insertElement(token);
+    tree.openElements.removeLast();
+  }
+
+  Token startTagOther(StartTagToken token) {
+    var ignoreEndTag = ignoreEndTagColgroup();
+    endTagColgroup(new EndTagToken("colgroup"));
+    return ignoreEndTag ? null : token;
+  }
+
+  void endTagColgroup(EndTagToken token) {
+    if (ignoreEndTagColgroup()) {
+      // innerHTML case
+      assert(parser.innerHTMLMode);
+      parser.parseError(token.span, "undefined-error");
+    } else {
+      var node = tree.openElements.removeLast();
+      node.endSourceSpan = token.span;
+      parser.phase = parser._inTablePhase;
+    }
+  }
+
+  void endTagCol(EndTagToken token) {
+    parser.parseError(token.span, "no-end-tag", {"name": "col"});
+  }
+
+  Token endTagOther(EndTagToken token) {
+    var ignoreEndTag = ignoreEndTagColgroup();
+    endTagColgroup(new EndTagToken("colgroup"));
+    return ignoreEndTag ? null : token;
+  }
+}
+
+class InTableBodyPhase extends Phase {
+  // http://www.whatwg.org/specs/web-apps/current-work///in-table0
+  InTableBodyPhase(parser) : super(parser);
+
+  processStartTag(StartTagToken token) {
+    switch (token.name) {
+      case "html":
+        return startTagHtml(token);
+      case "tr":
+        return startTagTr(token);
+      case "td":
+      case "th":
+        return startTagTableCell(token);
+      case "caption":
+      case "col":
+      case "colgroup":
+      case "tbody":
+      case "tfoot":
+      case "thead":
+        return startTagTableOther(token);
+      default:
+        return startTagOther(token);
+    }
+  }
+
+  processEndTag(EndTagToken token) {
+    switch (token.name) {
+      case "tbody":
+      case "tfoot":
+      case "thead":
+        return endTagTableRowGroup(token);
+      case "table":
+        return endTagTable(token);
+      case "body":
+      case "caption":
+      case "col":
+      case "colgroup":
+      case "html":
+      case "td":
+      case "th":
+      case "tr":
+        return endTagIgnore(token);
+      default:
+        return endTagOther(token);
+    }
+  }
+
+  // helper methods
+  void clearStackToTableBodyContext() {
+    var tableTags = const ["tbody", "tfoot", "thead", "html"];
+    while (!tableTags.contains(tree.openElements.last.localName)) {
+      //XXX parser.parseError(token.span, "unexpected-implied-end-tag-in-table",
+      //  {"name": tree.openElements.last.name})
+      tree.openElements.removeLast();
+    }
+    if (tree.openElements.last.localName == "html") {
+      assert(parser.innerHTMLMode);
+    }
+  }
+
+  // the rest
+  bool processEOF() {
+    parser._inTablePhase.processEOF();
+    return false;
+  }
+
+  Token processSpaceCharacters(SpaceCharactersToken token) {
+    return parser._inTablePhase.processSpaceCharacters(token);
+  }
+
+  Token processCharacters(CharactersToken token) {
+    return parser._inTablePhase.processCharacters(token);
+  }
+
+  void startTagTr(StartTagToken token) {
+    clearStackToTableBodyContext();
+    tree.insertElement(token);
+    parser.phase = parser._inRowPhase;
+  }
+
+  Token startTagTableCell(StartTagToken token) {
+    parser.parseError(
+        token.span, "unexpected-cell-in-table-body", {"name": token.name});
+    startTagTr(new StartTagToken("tr", data: {}));
+    return token;
+  }
+
+  Token startTagTableOther(token) => endTagTable(token);
+
+  Token startTagOther(StartTagToken token) {
+    return parser._inTablePhase.processStartTag(token);
+  }
+
+  void endTagTableRowGroup(EndTagToken token) {
+    if (tree.elementInScope(token.name, variant: "table")) {
+      clearStackToTableBodyContext();
+      var node = tree.openElements.removeLast();
+      node.endSourceSpan = token.span;
+      parser.phase = parser._inTablePhase;
+    } else {
+      parser.parseError(
+          token.span, "unexpected-end-tag-in-table-body", {"name": token.name});
+    }
+  }
+
+  Token endTagTable(TagToken token) {
+    // XXX AT Any ideas on how to share this with endTagTable?
+    if (tree.elementInScope("tbody", variant: "table") ||
+        tree.elementInScope("thead", variant: "table") ||
+        tree.elementInScope("tfoot", variant: "table")) {
+      clearStackToTableBodyContext();
+      endTagTableRowGroup(new EndTagToken(tree.openElements.last.localName));
+      return token;
+    } else {
+      // innerHTML case
+      assert(parser.innerHTMLMode);
+      parser.parseError(token.span, "undefined-error");
+    }
+    return null;
+  }
+
+  void endTagIgnore(EndTagToken token) {
+    parser.parseError(
+        token.span, "unexpected-end-tag-in-table-body", {"name": token.name});
+  }
+
+  Token endTagOther(EndTagToken token) {
+    return parser._inTablePhase.processEndTag(token);
+  }
+}
+
+class InRowPhase extends Phase {
+  // http://www.whatwg.org/specs/web-apps/current-work///in-row
+  InRowPhase(parser) : super(parser);
+
+  processStartTag(StartTagToken token) {
+    switch (token.name) {
+      case "html":
+        return startTagHtml(token);
+      case "td":
+      case "th":
+        return startTagTableCell(token);
+      case "caption":
+      case "col":
+      case "colgroup":
+      case "tbody":
+      case "tfoot":
+      case "thead":
+      case "tr":
+        return startTagTableOther(token);
+      default:
+        return startTagOther(token);
+    }
+  }
+
+  processEndTag(EndTagToken token) {
+    switch (token.name) {
+      case "tr":
+        return endTagTr(token);
+      case "table":
+        return endTagTable(token);
+      case "tbody":
+      case "tfoot":
+      case "thead":
+        return endTagTableRowGroup(token);
+      case "body":
+      case "caption":
+      case "col":
+      case "colgroup":
+      case "html":
+      case "td":
+      case "th":
+        return endTagIgnore(token);
+      default:
+        return endTagOther(token);
+    }
+  }
+
+  // helper methods (XXX unify this with other table helper methods)
+  void clearStackToTableRowContext() {
+    while (true) {
+      var last = tree.openElements.last;
+      if (last.localName == "tr" || last.localName == "html") break;
+
+      parser.parseError(last.sourceSpan,
+          "unexpected-implied-end-tag-in-table-row", {
+        "name": tree.openElements.last.localName
+      });
+      tree.openElements.removeLast();
+    }
+  }
+
+  bool ignoreEndTagTr() {
+    return !tree.elementInScope("tr", variant: "table");
+  }
+
+  // the rest
+  bool processEOF() {
+    parser._inTablePhase.processEOF();
+    return false;
+  }
+
+  Token processSpaceCharacters(SpaceCharactersToken token) {
+    return parser._inTablePhase.processSpaceCharacters(token);
+  }
+
+  Token processCharacters(CharactersToken token) {
+    return parser._inTablePhase.processCharacters(token);
+  }
+
+  void startTagTableCell(StartTagToken token) {
+    clearStackToTableRowContext();
+    tree.insertElement(token);
+    parser.phase = parser._inCellPhase;
+    tree.activeFormattingElements.add(Marker);
+  }
+
+  Token startTagTableOther(StartTagToken token) {
+    bool ignoreEndTag = ignoreEndTagTr();
+    endTagTr(new EndTagToken("tr"));
+    // XXX how are we sure it's always ignored in the innerHTML case?
+    return ignoreEndTag ? null : token;
+  }
+
+  Token startTagOther(StartTagToken token) {
+    return parser._inTablePhase.processStartTag(token);
+  }
+
+  void endTagTr(EndTagToken token) {
+    if (!ignoreEndTagTr()) {
+      clearStackToTableRowContext();
+      var node = tree.openElements.removeLast();
+      node.endSourceSpan = token.span;
+      parser.phase = parser._inTableBodyPhase;
+    } else {
+      // innerHTML case
+      assert(parser.innerHTMLMode);
+      parser.parseError(token.span, "undefined-error");
+    }
+  }
+
+  Token endTagTable(EndTagToken token) {
+    var ignoreEndTag = ignoreEndTagTr();
+    endTagTr(new EndTagToken("tr"));
+    // Reprocess the current tag if the tr end tag was not ignored
+    // XXX how are we sure it's always ignored in the innerHTML case?
+    return ignoreEndTag ? null : token;
+  }
+
+  Token endTagTableRowGroup(EndTagToken token) {
+    if (tree.elementInScope(token.name, variant: "table")) {
+      endTagTr(new EndTagToken("tr"));
+      return token;
+    } else {
+      parser.parseError(token.span, "undefined-error");
+      return null;
+    }
+  }
+
+  void endTagIgnore(EndTagToken token) {
+    parser.parseError(
+        token.span, "unexpected-end-tag-in-table-row", {"name": token.name});
+  }
+
+  Token endTagOther(EndTagToken token) {
+    return parser._inTablePhase.processEndTag(token);
+  }
+}
+
+class InCellPhase extends Phase {
+  // http://www.whatwg.org/specs/web-apps/current-work///in-cell
+  InCellPhase(parser) : super(parser);
+
+  processStartTag(StartTagToken token) {
+    switch (token.name) {
+      case "html":
+        return startTagHtml(token);
+      case "caption":
+      case "col":
+      case "colgroup":
+      case "tbody":
+      case "td":
+      case "tfoot":
+      case "th":
+      case "thead":
+      case "tr":
+        return startTagTableOther(token);
+      default:
+        return startTagOther(token);
+    }
+  }
+
+  processEndTag(EndTagToken token) {
+    switch (token.name) {
+      case "td":
+      case "th":
+        return endTagTableCell(token);
+      case "body":
+      case "caption":
+      case "col":
+      case "colgroup":
+      case "html":
+        return endTagIgnore(token);
+      case "table":
+      case "tbody":
+      case "tfoot":
+      case "thead":
+      case "tr":
+        return endTagImply(token);
+      default:
+        return endTagOther(token);
+    }
+  }
+
+  // helper
+  void closeCell() {
+    if (tree.elementInScope("td", variant: "table")) {
+      endTagTableCell(new EndTagToken("td"));
+    } else if (tree.elementInScope("th", variant: "table")) {
+      endTagTableCell(new EndTagToken("th"));
+    }
+  }
+
+  // the rest
+  bool processEOF() {
+    parser._inBodyPhase.processEOF();
+    return false;
+  }
+
+  Token processCharacters(CharactersToken token) {
+    return parser._inBodyPhase.processCharacters(token);
+  }
+
+  Token startTagTableOther(StartTagToken token) {
+    if (tree.elementInScope("td", variant: "table") ||
+        tree.elementInScope("th", variant: "table")) {
+      closeCell();
+      return token;
+    } else {
+      // innerHTML case
+      assert(parser.innerHTMLMode);
+      parser.parseError(token.span, "undefined-error");
+      return null;
+    }
+  }
+
+  Token startTagOther(StartTagToken token) {
+    return parser._inBodyPhase.processStartTag(token);
+  }
+
+  void endTagTableCell(EndTagToken token) {
+    if (tree.elementInScope(token.name, variant: "table")) {
+      tree.generateImpliedEndTags(token.name);
+      if (tree.openElements.last.localName != token.name) {
+        parser.parseError(
+            token.span, "unexpected-cell-end-tag", {"name": token.name});
+        popOpenElementsUntil(token);
+      } else {
+        var node = tree.openElements.removeLast();
+        node.endSourceSpan = token.span;
+      }
+      tree.clearActiveFormattingElements();
+      parser.phase = parser._inRowPhase;
+    } else {
+      parser.parseError(token.span, "unexpected-end-tag", {"name": token.name});
+    }
+  }
+
+  void endTagIgnore(EndTagToken token) {
+    parser.parseError(token.span, "unexpected-end-tag", {"name": token.name});
+  }
+
+  Token endTagImply(EndTagToken token) {
+    if (tree.elementInScope(token.name, variant: "table")) {
+      closeCell();
+      return token;
+    } else {
+      // sometimes innerHTML case
+      parser.parseError(token.span, "undefined-error");
+    }
+    return null;
+  }
+
+  Token endTagOther(EndTagToken token) {
+    return parser._inBodyPhase.processEndTag(token);
+  }
+}
+
+class InSelectPhase extends Phase {
+  InSelectPhase(parser) : super(parser);
+
+  processStartTag(StartTagToken token) {
+    switch (token.name) {
+      case "html":
+        return startTagHtml(token);
+      case "option":
+        return startTagOption(token);
+      case "optgroup":
+        return startTagOptgroup(token);
+      case "select":
+        return startTagSelect(token);
+      case "input":
+      case "keygen":
+      case "textarea":
+        return startTagInput(token);
+      case "script":
+        return startTagScript(token);
+      default:
+        return startTagOther(token);
+    }
+  }
+
+  processEndTag(EndTagToken token) {
+    switch (token.name) {
+      case "option":
+        return endTagOption(token);
+      case "optgroup":
+        return endTagOptgroup(token);
+      case "select":
+        return endTagSelect(token);
+      default:
+        return endTagOther(token);
+    }
+  }
+
+  // http://www.whatwg.org/specs/web-apps/current-work///in-select
+  bool processEOF() {
+    var last = tree.openElements.last;
+    if (last.localName != "html") {
+      parser.parseError(last.sourceSpan, "eof-in-select");
+    } else {
+      assert(parser.innerHTMLMode);
+    }
+    return false;
+  }
+
+  Token processCharacters(CharactersToken token) {
+    if (token.data == "\u0000") {
+      return null;
+    }
+    tree.insertText(token.data, token.span);
+    return null;
+  }
+
+  void startTagOption(StartTagToken token) {
+    // We need to imply </option> if <option> is the current node.
+    if (tree.openElements.last.localName == "option") {
+      tree.openElements.removeLast();
+    }
+    tree.insertElement(token);
+  }
+
+  void startTagOptgroup(StartTagToken token) {
+    if (tree.openElements.last.localName == "option") {
+      tree.openElements.removeLast();
+    }
+    if (tree.openElements.last.localName == "optgroup") {
+      tree.openElements.removeLast();
+    }
+    tree.insertElement(token);
+  }
+
+  void startTagSelect(StartTagToken token) {
+    parser.parseError(token.span, "unexpected-select-in-select");
+    endTagSelect(new EndTagToken("select"));
+  }
+
+  Token startTagInput(StartTagToken token) {
+    parser.parseError(token.span, "unexpected-input-in-select");
+    if (tree.elementInScope("select", variant: "select")) {
+      endTagSelect(new EndTagToken("select"));
+      return token;
+    } else {
+      assert(parser.innerHTMLMode);
+    }
+    return null;
+  }
+
+  Token startTagScript(StartTagToken token) {
+    return parser._inHeadPhase.processStartTag(token);
+  }
+
+  Token startTagOther(StartTagToken token) {
+    parser.parseError(
+        token.span, "unexpected-start-tag-in-select", {"name": token.name});
+    return null;
+  }
+
+  void endTagOption(EndTagToken token) {
+    if (tree.openElements.last.localName == "option") {
+      var node = tree.openElements.removeLast();
+      node.endSourceSpan = token.span;
+    } else {
+      parser.parseError(
+          token.span, "unexpected-end-tag-in-select", {"name": "option"});
+    }
+  }
+
+  void endTagOptgroup(EndTagToken token) {
+    // </optgroup> implicitly closes <option>
+    if (tree.openElements.last.localName == "option" &&
+        tree.openElements[tree.openElements.length - 2].localName ==
+            "optgroup") {
+      tree.openElements.removeLast();
+    }
+    // It also closes </optgroup>
+    if (tree.openElements.last.localName == "optgroup") {
+      var node = tree.openElements.removeLast();
+      node.endSourceSpan = token.span;
+      // But nothing else
+    } else {
+      parser.parseError(
+          token.span, "unexpected-end-tag-in-select", {"name": "optgroup"});
+    }
+  }
+
+  void endTagSelect(EndTagToken token) {
+    if (tree.elementInScope("select", variant: "select")) {
+      popOpenElementsUntil(token);
+      parser.resetInsertionMode();
+    } else {
+      // innerHTML case
+      assert(parser.innerHTMLMode);
+      parser.parseError(token.span, "undefined-error");
+    }
+  }
+
+  void endTagOther(EndTagToken token) {
+    parser.parseError(
+        token.span, "unexpected-end-tag-in-select", {"name": token.name});
+  }
+}
+
+class InSelectInTablePhase extends Phase {
+  InSelectInTablePhase(parser) : super(parser);
+
+  processStartTag(StartTagToken token) {
+    switch (token.name) {
+      case "caption":
+      case "table":
+      case "tbody":
+      case "tfoot":
+      case "thead":
+      case "tr":
+      case "td":
+      case "th":
+        return startTagTable(token);
+      default:
+        return startTagOther(token);
+    }
+  }
+
+  processEndTag(EndTagToken token) {
+    switch (token.name) {
+      case "caption":
+      case "table":
+      case "tbody":
+      case "tfoot":
+      case "thead":
+      case "tr":
+      case "td":
+      case "th":
+        return endTagTable(token);
+      default:
+        return endTagOther(token);
+    }
+  }
+
+  bool processEOF() {
+    parser._inSelectPhase.processEOF();
+    return false;
+  }
+
+  Token processCharacters(CharactersToken token) {
+    return parser._inSelectPhase.processCharacters(token);
+  }
+
+  Token startTagTable(StartTagToken token) {
+    parser.parseError(token.span,
+        "unexpected-table-element-start-tag-in-select-in-table", {
+      "name": token.name
+    });
+    endTagOther(new EndTagToken("select"));
+    return token;
+  }
+
+  Token startTagOther(StartTagToken token) {
+    return parser._inSelectPhase.processStartTag(token);
+  }
+
+  Token endTagTable(EndTagToken token) {
+    parser.parseError(token.span,
+        "unexpected-table-element-end-tag-in-select-in-table", {
+      "name": token.name
+    });
+    if (tree.elementInScope(token.name, variant: "table")) {
+      endTagOther(new EndTagToken("select"));
+      return token;
+    }
+    return null;
+  }
+
+  Token endTagOther(EndTagToken token) {
+    return parser._inSelectPhase.processEndTag(token);
+  }
+}
+
+class InForeignContentPhase extends Phase {
+  // TODO(jmesserly): this is sorted so we could binary search.
+  static const breakoutElements = const [
+    'b',
+    'big',
+    'blockquote',
+    'body',
+    'br',
+    'center',
+    'code',
+    'dd',
+    'div',
+    'dl',
+    'dt',
+    'em',
+    'embed',
+    'h1',
+    'h2',
+    'h3',
+    'h4',
+    'h5',
+    'h6',
+    'head',
+    'hr',
+    'i',
+    'img',
+    'li',
+    'listing',
+    'menu',
+    'meta',
+    'nobr',
+    'ol',
+    'p',
+    'pre',
+    'ruby',
+    's',
+    'small',
+    'span',
+    'strike',
+    'strong',
+    'sub',
+    'sup',
+    'table',
+    'tt',
+    'u',
+    'ul',
+    'var'
+  ];
+
+  InForeignContentPhase(parser) : super(parser);
+
+  void adjustSVGTagNames(token) {
+    final replacements = const {
+      "altglyph": "altGlyph",
+      "altglyphdef": "altGlyphDef",
+      "altglyphitem": "altGlyphItem",
+      "animatecolor": "animateColor",
+      "animatemotion": "animateMotion",
+      "animatetransform": "animateTransform",
+      "clippath": "clipPath",
+      "feblend": "feBlend",
+      "fecolormatrix": "feColorMatrix",
+      "fecomponenttransfer": "feComponentTransfer",
+      "fecomposite": "feComposite",
+      "feconvolvematrix": "feConvolveMatrix",
+      "fediffuselighting": "feDiffuseLighting",
+      "fedisplacementmap": "feDisplacementMap",
+      "fedistantlight": "feDistantLight",
+      "feflood": "feFlood",
+      "fefunca": "feFuncA",
+      "fefuncb": "feFuncB",
+      "fefuncg": "feFuncG",
+      "fefuncr": "feFuncR",
+      "fegaussianblur": "feGaussianBlur",
+      "feimage": "feImage",
+      "femerge": "feMerge",
+      "femergenode": "feMergeNode",
+      "femorphology": "feMorphology",
+      "feoffset": "feOffset",
+      "fepointlight": "fePointLight",
+      "fespecularlighting": "feSpecularLighting",
+      "fespotlight": "feSpotLight",
+      "fetile": "feTile",
+      "feturbulence": "feTurbulence",
+      "foreignobject": "foreignObject",
+      "glyphref": "glyphRef",
+      "lineargradient": "linearGradient",
+      "radialgradient": "radialGradient",
+      "textpath": "textPath"
+    };
+
+    var replace = replacements[token.name];
+    if (replace != null) {
+      token.name = replace;
+    }
+  }
+
+  Token processCharacters(CharactersToken token) {
+    if (token.data == "\u0000") {
+      token.replaceData("\uFFFD");
+    } else if (parser.framesetOK && !allWhitespace(token.data)) {
+      parser.framesetOK = false;
+    }
+    return super.processCharacters(token);
+  }
+
+  Token processStartTag(StartTagToken token) {
+    var currentNode = tree.openElements.last;
+    if (breakoutElements.contains(token.name) ||
+        (token.name == "font" &&
+            (token.data.containsKey("color") ||
+                token.data.containsKey("face") ||
+                token.data.containsKey("size")))) {
+      parser.parseError(token.span,
+          "unexpected-html-element-in-foreign-content", {'name': token.name});
+      while (tree.openElements.last.namespaceUri != tree.defaultNamespace &&
+          !parser.isHTMLIntegrationPoint(tree.openElements.last) &&
+          !parser.isMathMLTextIntegrationPoint(tree.openElements.last)) {
+        tree.openElements.removeLast();
+      }
+      return token;
+    } else {
+      if (currentNode.namespaceUri == Namespaces.mathml) {
+        parser.adjustMathMLAttributes(token);
+      } else if (currentNode.namespaceUri == Namespaces.svg) {
+        adjustSVGTagNames(token);
+        parser.adjustSVGAttributes(token);
+      }
+      parser.adjustForeignAttributes(token);
+      token.namespace = currentNode.namespaceUri;
+      tree.insertElement(token);
+      if (token.selfClosing) {
+        tree.openElements.removeLast();
+        token.selfClosingAcknowledged = true;
+      }
+      return null;
+    }
+  }
+
+  Token processEndTag(EndTagToken token) {
+    var nodeIndex = tree.openElements.length - 1;
+    var node = tree.openElements.last;
+    if (asciiUpper2Lower(node.localName) != token.name) {
+      parser.parseError(token.span, "unexpected-end-tag", {"name": token.name});
+    }
+
+    var newToken = null;
+    while (true) {
+      if (asciiUpper2Lower(node.localName) == token.name) {
+        //XXX this isn't in the spec but it seems necessary
+        if (parser.phase == parser._inTableTextPhase) {
+          InTableTextPhase inTableText = parser.phase;
+          inTableText.flushCharacters();
+          parser.phase = inTableText.originalPhase;
+        }
+        while (tree.openElements.removeLast() != node) {
+          assert(tree.openElements.length > 0);
+        }
+        newToken = null;
+        break;
+      }
+      nodeIndex -= 1;
+
+      node = tree.openElements[nodeIndex];
+      if (node.namespaceUri != tree.defaultNamespace) {
+        continue;
+      } else {
+        newToken = parser.phase.processEndTag(token);
+        break;
+      }
+    }
+    return newToken;
+  }
+}
+
+class AfterBodyPhase extends Phase {
+  AfterBodyPhase(parser) : super(parser);
+
+  processStartTag(StartTagToken token) {
+    if (token.name == "html") return startTagHtml(token);
+    return startTagOther(token);
+  }
+
+  processEndTag(EndTagToken token) {
+    if (token.name == "html") return endTagHtml(token);
+    return endTagOther(token);
+  }
+
+  //Stop parsing
+  bool processEOF() => false;
+
+  Token processComment(CommentToken token) {
+    // This is needed because data is to be appended to the <html> element
+    // here and not to whatever is currently open.
+    tree.insertComment(token, tree.openElements[0]);
+    return null;
+  }
+
+  Token processCharacters(CharactersToken token) {
+    parser.parseError(token.span, "unexpected-char-after-body");
+    parser.phase = parser._inBodyPhase;
+    return token;
+  }
+
+  Token startTagHtml(StartTagToken token) {
+    return parser._inBodyPhase.processStartTag(token);
+  }
+
+  Token startTagOther(StartTagToken token) {
+    parser.parseError(
+        token.span, "unexpected-start-tag-after-body", {"name": token.name});
+    parser.phase = parser._inBodyPhase;
+    return token;
+  }
+
+  void endTagHtml(Token token) {
+    for (var node in tree.openElements.reversed) {
+      if (node.localName == 'html') {
+        node.endSourceSpan = token.span;
+        break;
+      }
+    }
+    if (parser.innerHTMLMode) {
+      parser.parseError(token.span, "unexpected-end-tag-after-body-innerhtml");
+    } else {
+      parser.phase = parser._afterAfterBodyPhase;
+    }
+  }
+
+  Token endTagOther(EndTagToken token) {
+    parser.parseError(
+        token.span, "unexpected-end-tag-after-body", {"name": token.name});
+    parser.phase = parser._inBodyPhase;
+    return token;
+  }
+}
+
+class InFramesetPhase extends Phase {
+  // http://www.whatwg.org/specs/web-apps/current-work///in-frameset
+  InFramesetPhase(parser) : super(parser);
+
+  processStartTag(StartTagToken token) {
+    switch (token.name) {
+      case "html":
+        return startTagHtml(token);
+      case "frameset":
+        return startTagFrameset(token);
+      case "frame":
+        return startTagFrame(token);
+      case "noframes":
+        return startTagNoframes(token);
+      default:
+        return startTagOther(token);
+    }
+  }
+
+  processEndTag(EndTagToken token) {
+    switch (token.name) {
+      case "frameset":
+        return endTagFrameset(token);
+      default:
+        return endTagOther(token);
+    }
+  }
+
+  bool processEOF() {
+    var last = tree.openElements.last;
+    if (last.localName != "html") {
+      parser.parseError(last.sourceSpan, "eof-in-frameset");
+    } else {
+      assert(parser.innerHTMLMode);
+    }
+    return false;
+  }
+
+  Token processCharacters(CharactersToken token) {
+    parser.parseError(token.span, "unexpected-char-in-frameset");
+    return null;
+  }
+
+  void startTagFrameset(StartTagToken token) {
+    tree.insertElement(token);
+  }
+
+  void startTagFrame(StartTagToken token) {
+    tree.insertElement(token);
+    tree.openElements.removeLast();
+  }
+
+  Token startTagNoframes(StartTagToken token) {
+    return parser._inBodyPhase.processStartTag(token);
+  }
+
+  Token startTagOther(StartTagToken token) {
+    parser.parseError(
+        token.span, "unexpected-start-tag-in-frameset", {"name": token.name});
+    return null;
+  }
+
+  void endTagFrameset(EndTagToken token) {
+    if (tree.openElements.last.localName == "html") {
+      // innerHTML case
+      parser.parseError(
+          token.span, "unexpected-frameset-in-frameset-innerhtml");
+    } else {
+      var node = tree.openElements.removeLast();
+      node.endSourceSpan = token.span;
+    }
+    if (!parser.innerHTMLMode &&
+        tree.openElements.last.localName != "frameset") {
+      // If we're not in innerHTML mode and the the current node is not a
+      // "frameset" element (anymore) then switch.
+      parser.phase = parser._afterFramesetPhase;
+    }
+  }
+
+  void endTagOther(EndTagToken token) {
+    parser.parseError(
+        token.span, "unexpected-end-tag-in-frameset", {"name": token.name});
+  }
+}
+
+class AfterFramesetPhase extends Phase {
+  // http://www.whatwg.org/specs/web-apps/current-work///after3
+  AfterFramesetPhase(parser) : super(parser);
+
+  processStartTag(StartTagToken token) {
+    switch (token.name) {
+      case "html":
+        return startTagHtml(token);
+      case "noframes":
+        return startTagNoframes(token);
+      default:
+        return startTagOther(token);
+    }
+  }
+
+  processEndTag(EndTagToken token) {
+    switch (token.name) {
+      case "html":
+        return endTagHtml(token);
+      default:
+        return endTagOther(token);
+    }
+  }
+
+  // Stop parsing
+  bool processEOF() => false;
+
+  Token processCharacters(CharactersToken token) {
+    parser.parseError(token.span, "unexpected-char-after-frameset");
+    return null;
+  }
+
+  Token startTagNoframes(StartTagToken token) {
+    return parser._inHeadPhase.processStartTag(token);
+  }
+
+  void startTagOther(StartTagToken token) {
+    parser.parseError(token.span, "unexpected-start-tag-after-frameset", {
+      "name": token.name
+    });
+  }
+
+  void endTagHtml(EndTagToken token) {
+    parser.phase = parser._afterAfterFramesetPhase;
+  }
+
+  void endTagOther(EndTagToken token) {
+    parser.parseError(
+        token.span, "unexpected-end-tag-after-frameset", {"name": token.name});
+  }
+}
+
+class AfterAfterBodyPhase extends Phase {
+  AfterAfterBodyPhase(parser) : super(parser);
+
+  processStartTag(StartTagToken token) {
+    if (token.name == 'html') return startTagHtml(token);
+    return startTagOther(token);
+  }
+
+  bool processEOF() => false;
+
+  Token processComment(CommentToken token) {
+    tree.insertComment(token, tree.document);
+    return null;
+  }
+
+  Token processSpaceCharacters(SpaceCharactersToken token) {
+    return parser._inBodyPhase.processSpaceCharacters(token);
+  }
+
+  Token processCharacters(CharactersToken token) {
+    parser.parseError(token.span, "expected-eof-but-got-char");
+    parser.phase = parser._inBodyPhase;
+    return token;
+  }
+
+  Token startTagHtml(StartTagToken token) {
+    return parser._inBodyPhase.processStartTag(token);
+  }
+
+  Token startTagOther(StartTagToken token) {
+    parser.parseError(
+        token.span, "expected-eof-but-got-start-tag", {"name": token.name});
+    parser.phase = parser._inBodyPhase;
+    return token;
+  }
+
+  Token processEndTag(EndTagToken token) {
+    parser.parseError(
+        token.span, "expected-eof-but-got-end-tag", {"name": token.name});
+    parser.phase = parser._inBodyPhase;
+    return token;
+  }
+}
+
+class AfterAfterFramesetPhase extends Phase {
+  AfterAfterFramesetPhase(parser) : super(parser);
+
+  processStartTag(StartTagToken token) {
+    switch (token.name) {
+      case "html":
+        return startTagHtml(token);
+      case "noframes":
+        return startTagNoFrames(token);
+      default:
+        return startTagOther(token);
+    }
+  }
+
+  bool processEOF() => false;
+
+  Token processComment(CommentToken token) {
+    tree.insertComment(token, tree.document);
+    return null;
+  }
+
+  Token processSpaceCharacters(SpaceCharactersToken token) {
+    return parser._inBodyPhase.processSpaceCharacters(token);
+  }
+
+  Token processCharacters(CharactersToken token) {
+    parser.parseError(token.span, "expected-eof-but-got-char");
+    return null;
+  }
+
+  Token startTagHtml(StartTagToken token) {
+    return parser._inBodyPhase.processStartTag(token);
+  }
+
+  Token startTagNoFrames(StartTagToken token) {
+    return parser._inHeadPhase.processStartTag(token);
+  }
+
+  void startTagOther(StartTagToken token) {
+    parser.parseError(
+        token.span, "expected-eof-but-got-start-tag", {"name": token.name});
+  }
+
+  Token processEndTag(EndTagToken token) {
+    parser.parseError(
+        token.span, "expected-eof-but-got-end-tag", {"name": token.name});
+    return null;
+  }
+}
+
+/// Error in parsed document.
+class ParseError implements SourceSpanException {
+  final String errorCode;
+  final SourceSpan span;
+  final Map data;
+
+  ParseError(this.errorCode, this.span, this.data);
+
+  int get line => span.start.line;
+
+  int get column => span.start.column;
+
+  /// Gets the human readable error message for this error. Use
+  /// [span.getLocationMessage] or [toString] to get a message including span
+  /// information. If there is a file associated with the span, both
+  /// [span.getLocationMessage] and [toString] are equivalent. Otherwise,
+  /// [span.getLocationMessage] will not show any source url information, but
+  /// [toString] will include 'ParserError:' as a prefix.
+  String get message => formatStr(errorMessages[errorCode], data);
+
+  String toString({color}) {
+    var res = span.message(message, color: color);
+    return span.sourceUrl == null ? 'ParserError on $res' : 'On $res';
+  }
+}
+
+/// Convenience function to get the pair of namespace and localName.
+Pair<String, String> getElementNameTuple(Element e) {
+  var ns = e.namespaceUri;
+  if (ns == null) ns = Namespaces.html;
+  return new Pair(ns, e.localName);
+}
diff --git a/mojo/public/dart/third_party/html/lib/parser_console.dart b/mojo/public/dart/third_party/html/lib/parser_console.dart
new file mode 100644
index 0000000..515f891
--- /dev/null
+++ b/mojo/public/dart/third_party/html/lib/parser_console.dart
@@ -0,0 +1,42 @@
+/// This library adds `dart:io` support to the HTML5 parser. Call
+/// [initDartIOSupport] before calling the [parse] methods and they will accept
+/// a [RandomAccessFile] as input, in addition to the other input types.
+library parser_console;
+
+import 'dart:io';
+import 'parser.dart';
+import 'src/inputstream.dart' as inputstream;
+
+/// Adds support to the [HtmlParser] for running on a console VM. In particular
+/// this means it will be able to handle `dart:io` and [RandomAccessFile]s as
+/// input to the various [parse] methods.
+void useConsole() {
+  inputstream.consoleSupport = new _ConsoleSupport();
+}
+
+class _ConsoleSupport extends inputstream.ConsoleSupport {
+  List<int> bytesFromFile(source) {
+    if (source is! RandomAccessFile) return null;
+    return readAllBytesFromFile(source);
+  }
+}
+
+// TODO(jmesserly): this should be `RandomAccessFile.readAllBytes`.
+/// Synchronously reads all bytes from the [file].
+List<int> readAllBytesFromFile(RandomAccessFile file) {
+  int length = file.lengthSync();
+  var bytes = new List<int>(length);
+
+  int bytesRead = 0;
+  while (bytesRead < length) {
+    int read = file.readIntoSync(bytes, bytesRead, length - bytesRead);
+    if (read <= 0) {
+      // This could happen if, for example, the file was resized while
+      // we're reading. Just shrink the bytes array and move on.
+      bytes = bytes.sublist(0, bytesRead);
+      break;
+    }
+    bytesRead += read;
+  }
+  return bytes;
+}
diff --git a/mojo/public/dart/third_party/html/lib/src/char_encodings.dart b/mojo/public/dart/third_party/html/lib/src/char_encodings.dart
new file mode 100644
index 0000000..5ddf727
--- /dev/null
+++ b/mojo/public/dart/third_party/html/lib/src/char_encodings.dart
@@ -0,0 +1,223 @@
+/// Decodes bytes using the correct name. See [decodeBytes].
+library char_encodings;
+
+import 'dart:collection';
+import 'package:utf/utf.dart';
+
+// TODO(jmesserly): this function is conspicuously absent from dart:utf.
+/// Returns true if the [bytes] starts with a UTF-8 byte order mark.
+/// Since UTF-8 doesn't have byte order, it's somewhat of a misnomer, but it is
+/// used in HTML to detect the UTF-
+bool hasUtf8Bom(List<int> bytes, [int offset = 0, int length]) {
+  int end = length != null ? offset + length : bytes.length;
+  return (offset + 3) <= end &&
+      bytes[offset] == 0xEF &&
+      bytes[offset + 1] == 0xBB &&
+      bytes[offset + 2] == 0xBF;
+}
+
+// TODO(jmesserly): it's unfortunate that this has to be one-shot on the entire
+// file, but dart:utf does not expose stream-based decoders yet.
+/// Decodes the [bytes] with the provided [encoding] and returns an iterable for
+/// the codepoints. Supports the major unicode encodings as well as ascii and
+/// and windows-1252 encodings.
+Iterable<int> decodeBytes(String encoding, List<int> bytes, [int offset = 0,
+    int length,
+    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+  if (length == null) length = bytes.length;
+  final replace = replacementCodepoint;
+  switch (encoding) {
+    case 'ascii':
+      bytes = bytes.sublist(offset, offset + length);
+      // TODO(jmesserly): this was taken from runtime/bin/string_stream.dart
+      for (int byte in bytes) {
+        if (byte > 127) {
+          // TODO(jmesserly): ideally this would be DecoderException, like the
+          // one thrown in runtime/bin/string_stream.dart, but we don't want to
+          // depend on dart:io.
+          throw new FormatException("Illegal ASCII character $byte");
+        }
+      }
+      return bytes;
+
+    case 'windows-1252':
+    case 'cp1252':
+      return decodeWindows1252AsIterable(bytes, offset, length, replace);
+
+    case 'utf-8':
+      // NOTE: to match the behavior of the other decode functions, we eat the
+      // utf-8 BOM here.
+      if (hasUtf8Bom(bytes, offset, length)) {
+        offset += 3;
+        length -= 3;
+      }
+      return decodeUtf8AsIterable(bytes, offset, length, replace);
+
+    case 'utf-16':
+      return decodeUtf16AsIterable(bytes, offset, length, replace);
+    case 'utf-16-be':
+      return decodeUtf16beAsIterable(bytes, offset, length, true, replace);
+    case 'utf-16-le':
+      return decodeUtf16leAsIterable(bytes, offset, length, true, replace);
+
+    case 'utf-32':
+      return decodeUtf32AsIterable(bytes, offset, length, replace);
+    case 'utf-32-be':
+      return decodeUtf32beAsIterable(bytes, offset, length, true, replace);
+    case 'utf-32-le':
+      return decodeUtf32leAsIterable(bytes, offset, length, true, replace);
+
+    default:
+      throw new ArgumentError('Encoding $encoding not supported');
+  }
+}
+
+// TODO(jmesserly): use dart:utf once http://dartbug.com/6476 is fixed.
+/// Returns the code points for the [input]. This works like [String.charCodes]
+/// but it decodes UTF-16 surrogate pairs.
+List<int> toCodepoints(String input) {
+  var newCodes = <int>[];
+  for (int i = 0; i < input.length; i++) {
+    var c = input.codeUnitAt(i);
+    if (0xD800 <= c && c <= 0xDBFF) {
+      int next = i + 1;
+      if (next < input.length) {
+        var d = input.codeUnitAt(next);
+        if (0xDC00 <= d && d <= 0xDFFF) {
+          c = 0x10000 + ((c - 0xD800) << 10) + (d - 0xDC00);
+          i = next;
+        }
+      }
+    }
+    newCodes.add(c);
+  }
+  return newCodes;
+}
+
+/// Decodes [windows-1252](http://en.wikipedia.org/wiki/Windows-1252) bytes as
+/// an iterable. Thus, the consumer can only convert as much of the input as
+/// needed. Set the [replacementCharacter] to null to throw an [ArgumentError]
+/// rather than replace the bad value.
+IterableWindows1252Decoder decodeWindows1252AsIterable(List<int> bytes,
+    [int offset = 0, int length,
+    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+  return new IterableWindows1252Decoder(
+      bytes, offset, length, replacementCodepoint);
+}
+
+/// Return type of [decodeWindows1252AsIterable] and variants. The Iterable type
+/// provides an iterator on demand and the iterator will only translate bytes
+/// as requested by the user of the iterator. (Note: results are not cached.)
+class IterableWindows1252Decoder extends IterableBase<int> {
+  final List<int> bytes;
+  final int offset;
+  final int length;
+  final int replacementCodepoint;
+
+  IterableWindows1252Decoder(List<int> this.bytes, [int this.offset = 0,
+      int this.length = null,
+      int this.replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
+
+  Windows1252Decoder get iterator =>
+      new Windows1252Decoder(bytes, offset, length, replacementCodepoint);
+}
+
+/// Provides an iterator of Unicode codepoints from windows-1252 encoded bytes.
+/// The parameters can set an offset into a list of bytes (as int), limit the
+/// length of the values to be decoded, and override the default Unicode
+/// replacement character. Set the replacementCharacter to null to throw an
+/// ArgumentError rather than replace the bad value. The return value
+/// from this method can be used as an Iterable (e.g. in a for-loop).
+class Windows1252Decoder implements Iterator<int> {
+  final int replacementCodepoint;
+  final List<int> _bytes;
+  int _offset;
+  final int _length;
+
+  Windows1252Decoder(List<int> bytes, [int offset = 0, int length,
+      this.replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT])
+      : _bytes = bytes,
+        _offset = offset - 1,
+        _length = length == null ? bytes.length : length;
+
+  bool get _inRange => _offset >= 0 && _offset < _length;
+  int get current => _inRange ? _mapChar(_bytes[_offset]) : null;
+
+  bool moveNext() {
+    _offset++;
+    return _inRange;
+  }
+
+  int _mapChar(int char) {
+    // TODO(jmesserly): this is duplicating entitiesWindows1252 and
+    // replacementCharacters from constants.dart
+    switch (char) {
+      case 0x80:
+        return 0x20AC; // EURO SIGN
+      case 0x82:
+        return 0x201A; // SINGLE LOW-9 QUOTATION MARK
+      case 0x83:
+        return 0x0192; // LATIN SMALL LETTER F WITH HOOK
+      case 0x84:
+        return 0x201E; // DOUBLE LOW-9 QUOTATION MARK
+      case 0x85:
+        return 0x2026; // HORIZONTAL ELLIPSIS
+      case 0x86:
+        return 0x2020; // DAGGER
+      case 0x87:
+        return 0x2021; // DOUBLE DAGGER
+      case 0x88:
+        return 0x02C6; // MODIFIER LETTER CIRCUMFLEX ACCENT
+      case 0x89:
+        return 0x2030; // PER MILLE SIGN
+      case 0x8A:
+        return 0x0160; // LATIN CAPITAL LETTER S WITH CARON
+      case 0x8B:
+        return 0x2039; // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+      case 0x8C:
+        return 0x0152; // LATIN CAPITAL LIGATURE OE
+      case 0x8E:
+        return 0x017D; // LATIN CAPITAL LETTER Z WITH CARON
+      case 0x91:
+        return 0x2018; // LEFT SINGLE QUOTATION MARK
+      case 0x92:
+        return 0x2019; // RIGHT SINGLE QUOTATION MARK
+      case 0x93:
+        return 0x201C; // LEFT DOUBLE QUOTATION MARK
+      case 0x94:
+        return 0x201D; // RIGHT DOUBLE QUOTATION MARK
+      case 0x95:
+        return 0x2022; // BULLET
+      case 0x96:
+        return 0x2013; // EN DASH
+      case 0x97:
+        return 0x2014; // EM DASH
+      case 0x98:
+        return 0x02DC; // SMALL TILDE
+      case 0x99:
+        return 0x2122; // TRADE MARK SIGN
+      case 0x9A:
+        return 0x0161; // LATIN SMALL LETTER S WITH CARON
+      case 0x9B:
+        return 0x203A; // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+      case 0x9C:
+        return 0x0153; // LATIN SMALL LIGATURE OE
+      case 0x9E:
+        return 0x017E; // LATIN SMALL LETTER Z WITH CARON
+      case 0x9F:
+        return 0x0178; // LATIN CAPITAL LETTER Y WITH DIAERESIS
+
+      case 0x81:
+      case 0x8D:
+      case 0x8F:
+      case 0x90:
+      case 0x9D:
+        if (replacementCodepoint == null) {
+          throw new ArgumentError(
+              "Invalid windows-1252 code point $char at $_offset");
+        }
+        return replacementCodepoint;
+    }
+    return char;
+  }
+}
diff --git a/mojo/public/dart/third_party/html/lib/src/constants.dart b/mojo/public/dart/third_party/html/lib/src/constants.dart
new file mode 100644
index 0000000..e85e43a
--- /dev/null
+++ b/mojo/public/dart/third_party/html/lib/src/constants.dart
@@ -0,0 +1,3082 @@
+library constants;
+
+import 'utils.dart';
+
+// TODO(jmesserly): fix up the const lists. For the bigger ones, we need faster
+// lookup than linear search "contains". In the Python code they were
+// frozensets.
+
+final String EOF = null;
+
+class ReparseException implements Exception {
+  final String message;
+  ReparseException(this.message);
+  String toString() => "ReparseException: $message";
+}
+
+// TODO(jmesserly): assuming the programmatic name is not important, it would be
+// good to make these "static const" fields on an ErrorMessage class.
+/// These are error messages emitted by [HtmlParser]. The values use Python
+/// style string formatting, as implemented by [formatStr]. That function only
+/// supports the subset of format functionality used here.
+const Map<String, String> errorMessages = const {
+  "null-character": "Null character in input stream, replaced with U+FFFD.",
+  "invalid-codepoint": "Invalid codepoint in stream.",
+  "incorrectly-placed-solidus": "Solidus (/) incorrectly placed in tag.",
+  "incorrect-cr-newline-entity":
+      "Incorrect CR newline entity, replaced with LF.",
+  "illegal-windows-1252-entity":
+      "Entity used with illegal number (windows-1252 reference).",
+  "cant-convert-numeric-entity":
+      "Numeric entity couldn't be converted to character "
+      "(codepoint U+%(charAsInt)08x).",
+  "illegal-codepoint-for-numeric-entity":
+      "Numeric entity represents an illegal codepoint: "
+      "U+%(charAsInt)08x.",
+  "numeric-entity-without-semicolon": "Numeric entity didn't end with ';'.",
+  "expected-numeric-entity-but-got-eof":
+      "Numeric entity expected. Got end of file instead.",
+  "expected-numeric-entity": "Numeric entity expected but none found.",
+  "named-entity-without-semicolon": "Named entity didn't end with ';'.",
+  "expected-named-entity": "Named entity expected. Got none.",
+  "attributes-in-end-tag": "End tag contains unexpected attributes.",
+  'self-closing-flag-on-end-tag':
+      "End tag contains unexpected self-closing flag.",
+  "expected-tag-name-but-got-right-bracket":
+      "Expected tag name. Got '>' instead.",
+  "expected-tag-name-but-got-question-mark":
+      "Expected tag name. Got '?' instead. (HTML doesn't "
+      "support processing instructions.)",
+  "expected-tag-name": "Expected tag name. Got something else instead",
+  "expected-closing-tag-but-got-right-bracket":
+      "Expected closing tag. Got '>' instead. Ignoring '</>'.",
+  "expected-closing-tag-but-got-eof":
+      "Expected closing tag. Unexpected end of file.",
+  "expected-closing-tag-but-got-char":
+      "Expected closing tag. Unexpected character '%(data)s' found.",
+  "eof-in-tag-name": "Unexpected end of file in the tag name.",
+  "expected-attribute-name-but-got-eof":
+      "Unexpected end of file. Expected attribute name instead.",
+  "eof-in-attribute-name": "Unexpected end of file in attribute name.",
+  "invalid-character-in-attribute-name": "Invalid character in attribute name",
+  "duplicate-attribute": "Dropped duplicate attribute on tag.",
+  "expected-end-of-tag-name-but-got-eof":
+      "Unexpected end of file. Expected = or end of tag.",
+  "expected-attribute-value-but-got-eof":
+      "Unexpected end of file. Expected attribute value.",
+  "expected-attribute-value-but-got-right-bracket":
+      "Expected attribute value. Got '>' instead.",
+  'equals-in-unquoted-attribute-value': "Unexpected = in unquoted attribute",
+  'unexpected-character-in-unquoted-attribute-value':
+      "Unexpected character in unquoted attribute",
+  "invalid-character-after-attribute-name":
+      "Unexpected character after attribute name.",
+  "unexpected-character-after-attribute-value":
+      "Unexpected character after attribute value.",
+  "eof-in-attribute-value-double-quote":
+      "Unexpected end of file in attribute value (\".",
+  "eof-in-attribute-value-single-quote":
+      "Unexpected end of file in attribute value (').",
+  "eof-in-attribute-value-no-quotes":
+      "Unexpected end of file in attribute value.",
+  "unexpected-EOF-after-solidus-in-tag":
+      "Unexpected end of file in tag. Expected >",
+  "unexpected-character-after-soldius-in-tag":
+      "Unexpected character after / in tag. Expected >",
+  "expected-dashes-or-doctype": "Expected '--' or 'DOCTYPE'. Not found.",
+  "unexpected-bang-after-double-dash-in-comment":
+      "Unexpected ! after -- in comment",
+  "unexpected-space-after-double-dash-in-comment":
+      "Unexpected space after -- in comment",
+  "incorrect-comment": "Incorrect comment.",
+  "eof-in-comment": "Unexpected end of file in comment.",
+  "eof-in-comment-end-dash": "Unexpected end of file in comment (-)",
+  "unexpected-dash-after-double-dash-in-comment":
+      "Unexpected '-' after '--' found in comment.",
+  "eof-in-comment-double-dash": "Unexpected end of file in comment (--).",
+  "eof-in-comment-end-space-state": "Unexpected end of file in comment.",
+  "eof-in-comment-end-bang-state": "Unexpected end of file in comment.",
+  "unexpected-char-in-comment": "Unexpected character in comment found.",
+  "need-space-after-doctype": "No space after literal string 'DOCTYPE'.",
+  "expected-doctype-name-but-got-right-bracket":
+      "Unexpected > character. Expected DOCTYPE name.",
+  "expected-doctype-name-but-got-eof":
+      "Unexpected end of file. Expected DOCTYPE name.",
+  "eof-in-doctype-name": "Unexpected end of file in DOCTYPE name.",
+  "eof-in-doctype": "Unexpected end of file in DOCTYPE.",
+  "expected-space-or-right-bracket-in-doctype":
+      "Expected space or '>'. Got '%(data)s'",
+  "unexpected-end-of-doctype": "Unexpected end of DOCTYPE.",
+  "unexpected-char-in-doctype": "Unexpected character in DOCTYPE.",
+  "eof-in-innerhtml": "XXX innerHTML EOF",
+  "unexpected-doctype": "Unexpected DOCTYPE. Ignored.",
+  "non-html-root": "html needs to be the first start tag.",
+  "expected-doctype-but-got-eof": "Unexpected End of file. Expected DOCTYPE.",
+  "unknown-doctype": "Erroneous DOCTYPE.",
+  "expected-doctype-but-got-chars":
+      "Unexpected non-space characters. Expected DOCTYPE.",
+  "expected-doctype-but-got-start-tag":
+      "Unexpected start tag (%(name)s). Expected DOCTYPE.",
+  "expected-doctype-but-got-end-tag":
+      "Unexpected end tag (%(name)s). Expected DOCTYPE.",
+  "end-tag-after-implied-root":
+      "Unexpected end tag (%(name)s) after the (implied) root element.",
+  "expected-named-closing-tag-but-got-eof":
+      "Unexpected end of file. Expected end tag (%(name)s).",
+  "two-heads-are-not-better-than-one":
+      "Unexpected start tag head in existing head. Ignored.",
+  "unexpected-end-tag": "Unexpected end tag (%(name)s). Ignored.",
+  "unexpected-start-tag-out-of-my-head":
+      "Unexpected start tag (%(name)s) that can be in head. Moved.",
+  "unexpected-start-tag": "Unexpected start tag (%(name)s).",
+  "missing-end-tag": "Missing end tag (%(name)s).",
+  "missing-end-tags": "Missing end tags (%(name)s).",
+  "unexpected-start-tag-implies-end-tag":
+      "Unexpected start tag (%(startName)s) "
+      "implies end tag (%(endName)s).",
+  "unexpected-start-tag-treated-as":
+      "Unexpected start tag (%(originalName)s). Treated as %(newName)s.",
+  "deprecated-tag": "Unexpected start tag %(name)s. Don't use it!",
+  "unexpected-start-tag-ignored": "Unexpected start tag %(name)s. Ignored.",
+  "expected-one-end-tag-but-got-another": "Unexpected end tag (%(gotName)s). "
+      "Missing end tag (%(expectedName)s).",
+  "end-tag-too-early":
+      "End tag (%(name)s) seen too early. Expected other end tag.",
+  "end-tag-too-early-named":
+      "Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).",
+  "end-tag-too-early-ignored": "End tag (%(name)s) seen too early. Ignored.",
+  "adoption-agency-1.1": "End tag (%(name)s) violates step 1, "
+      "paragraph 1 of the adoption agency algorithm.",
+  "adoption-agency-1.2": "End tag (%(name)s) violates step 1, "
+      "paragraph 2 of the adoption agency algorithm.",
+  "adoption-agency-1.3": "End tag (%(name)s) violates step 1, "
+      "paragraph 3 of the adoption agency algorithm.",
+  "unexpected-end-tag-treated-as":
+      "Unexpected end tag (%(originalName)s). Treated as %(newName)s.",
+  "no-end-tag": "This element (%(name)s) has no end tag.",
+  "unexpected-implied-end-tag-in-table":
+      "Unexpected implied end tag (%(name)s) in the table phase.",
+  "unexpected-implied-end-tag-in-table-body":
+      "Unexpected implied end tag (%(name)s) in the table body phase.",
+  "unexpected-char-implies-table-voodoo": "Unexpected non-space characters in "
+      "table context caused voodoo mode.",
+  "unexpected-hidden-input-in-table":
+      "Unexpected input with type hidden in table context.",
+  "unexpected-form-in-table": "Unexpected form in table context.",
+  "unexpected-start-tag-implies-table-voodoo":
+      "Unexpected start tag (%(name)s) in "
+      "table context caused voodoo mode.",
+  "unexpected-end-tag-implies-table-voodoo": "Unexpected end tag (%(name)s) in "
+      "table context caused voodoo mode.",
+  "unexpected-cell-in-table-body": "Unexpected table cell start tag (%(name)s) "
+      "in the table body phase.",
+  "unexpected-cell-end-tag": "Got table cell end tag (%(name)s) "
+      "while required end tags are missing.",
+  "unexpected-end-tag-in-table-body":
+      "Unexpected end tag (%(name)s) in the table body phase. Ignored.",
+  "unexpected-implied-end-tag-in-table-row":
+      "Unexpected implied end tag (%(name)s) in the table row phase.",
+  "unexpected-end-tag-in-table-row":
+      "Unexpected end tag (%(name)s) in the table row phase. Ignored.",
+  "unexpected-select-in-select":
+      "Unexpected select start tag in the select phase "
+      "treated as select end tag.",
+  "unexpected-input-in-select":
+      "Unexpected input start tag in the select phase.",
+  "unexpected-start-tag-in-select":
+      "Unexpected start tag token (%(name)s in the select phase. "
+      "Ignored.",
+  "unexpected-end-tag-in-select":
+      "Unexpected end tag (%(name)s) in the select phase. Ignored.",
+  "unexpected-table-element-start-tag-in-select-in-table":
+      "Unexpected table element start tag (%(name)s) in the select in table phase.",
+  "unexpected-table-element-end-tag-in-select-in-table":
+      "Unexpected table element end tag (%(name)s) in the select in table phase.",
+  "unexpected-char-after-body":
+      "Unexpected non-space characters in the after body phase.",
+  "unexpected-start-tag-after-body": "Unexpected start tag token (%(name)s)"
+      " in the after body phase.",
+  "unexpected-end-tag-after-body": "Unexpected end tag token (%(name)s)"
+      " in the after body phase.",
+  "unexpected-char-in-frameset":
+      "Unepxected characters in the frameset phase. Characters ignored.",
+  "unexpected-start-tag-in-frameset": "Unexpected start tag token (%(name)s)"
+      " in the frameset phase. Ignored.",
+  "unexpected-frameset-in-frameset-innerhtml":
+      "Unexpected end tag token (frameset) "
+      "in the frameset phase (innerHTML).",
+  "unexpected-end-tag-in-frameset": "Unexpected end tag token (%(name)s)"
+      " in the frameset phase. Ignored.",
+  "unexpected-char-after-frameset": "Unexpected non-space characters in the "
+      "after frameset phase. Ignored.",
+  "unexpected-start-tag-after-frameset": "Unexpected start tag (%(name)s)"
+      " in the after frameset phase. Ignored.",
+  "unexpected-end-tag-after-frameset": "Unexpected end tag (%(name)s)"
+      " in the after frameset phase. Ignored.",
+  "unexpected-end-tag-after-body-innerhtml":
+      "Unexpected end tag after body(innerHtml)",
+  "expected-eof-but-got-char":
+      "Unexpected non-space characters. Expected end of file.",
+  "expected-eof-but-got-start-tag": "Unexpected start tag (%(name)s)"
+      ". Expected end of file.",
+  "expected-eof-but-got-end-tag": "Unexpected end tag (%(name)s)"
+      ". Expected end of file.",
+  "eof-in-table": "Unexpected end of file. Expected table content.",
+  "eof-in-select": "Unexpected end of file. Expected select content.",
+  "eof-in-frameset": "Unexpected end of file. Expected frameset content.",
+  "eof-in-script-in-script": "Unexpected end of file. Expected script content.",
+  "eof-in-foreign-lands": "Unexpected end of file. Expected foreign content",
+  "non-void-element-with-trailing-solidus":
+      "Trailing solidus not allowed on element %(name)s",
+  "unexpected-html-element-in-foreign-content":
+      "Element %(name)s not allowed in a non-html context",
+  "unexpected-end-tag-before-html":
+      "Unexpected end tag (%(name)s) before html.",
+  "undefined-error": "Undefined error (this sucks and should be fixed)",
+};
+
+class Namespaces {
+  static const html = "http://www.w3.org/1999/xhtml";
+  static const mathml = "http://www.w3.org/1998/Math/MathML";
+  static const svg = "http://www.w3.org/2000/svg";
+  static const xlink = "http://www.w3.org/1999/xlink";
+  static const xml = "http://www.w3.org/XML/1998/namespace";
+  static const xmlns = "http://www.w3.org/2000/xmlns/";
+  Namespaces._();
+
+  static String getPrefix(String url) {
+    switch (url) {
+      case html:
+        return 'html';
+      case mathml:
+        return 'math';
+      case svg:
+        return 'svg';
+      case xlink:
+        return 'xlink';
+      case xml:
+        return 'xml';
+      case xmlns:
+        return 'xmlns';
+      default:
+        return null;
+    }
+  }
+}
+
+const List scopingElements = const [
+  const Pair(Namespaces.html, "applet"),
+  const Pair(Namespaces.html, "caption"),
+  const Pair(Namespaces.html, "html"),
+  const Pair(Namespaces.html, "marquee"),
+  const Pair(Namespaces.html, "object"),
+  const Pair(Namespaces.html, "table"),
+  const Pair(Namespaces.html, "td"),
+  const Pair(Namespaces.html, "th"),
+  const Pair(Namespaces.mathml, "mi"),
+  const Pair(Namespaces.mathml, "mo"),
+  const Pair(Namespaces.mathml, "mn"),
+  const Pair(Namespaces.mathml, "ms"),
+  const Pair(Namespaces.mathml, "mtext"),
+  const Pair(Namespaces.mathml, "annotation-xml"),
+  const Pair(Namespaces.svg, "foreignObject"),
+  const Pair(Namespaces.svg, "desc"),
+  const Pair(Namespaces.svg, "title")
+];
+
+const formattingElements = const [
+  const Pair(Namespaces.html, "a"),
+  const Pair(Namespaces.html, "b"),
+  const Pair(Namespaces.html, "big"),
+  const Pair(Namespaces.html, "code"),
+  const Pair(Namespaces.html, "em"),
+  const Pair(Namespaces.html, "font"),
+  const Pair(Namespaces.html, "i"),
+  const Pair(Namespaces.html, "nobr"),
+  const Pair(Namespaces.html, "s"),
+  const Pair(Namespaces.html, "small"),
+  const Pair(Namespaces.html, "strike"),
+  const Pair(Namespaces.html, "strong"),
+  const Pair(Namespaces.html, "tt"),
+  const Pair(Namespaces.html, "")
+];
+
+const specialElements = const [
+  const Pair(Namespaces.html, "address"),
+  const Pair(Namespaces.html, "applet"),
+  const Pair(Namespaces.html, "area"),
+  const Pair(Namespaces.html, "article"),
+  const Pair(Namespaces.html, "aside"),
+  const Pair(Namespaces.html, "base"),
+  const Pair(Namespaces.html, "basefont"),
+  const Pair(Namespaces.html, "bgsound"),
+  const Pair(Namespaces.html, "blockquote"),
+  const Pair(Namespaces.html, "body"),
+  const Pair(Namespaces.html, "br"),
+  const Pair(Namespaces.html, "button"),
+  const Pair(Namespaces.html, "caption"),
+  const Pair(Namespaces.html, "center"),
+  const Pair(Namespaces.html, "col"),
+  const Pair(Namespaces.html, "colgroup"),
+  const Pair(Namespaces.html, "command"),
+  const Pair(Namespaces.html, "dd"),
+  const Pair(Namespaces.html, "details"),
+  const Pair(Namespaces.html, "dir"),
+  const Pair(Namespaces.html, "div"),
+  const Pair(Namespaces.html, "dl"),
+  const Pair(Namespaces.html, "dt"),
+  const Pair(Namespaces.html, "embed"),
+  const Pair(Namespaces.html, "fieldset"),
+  const Pair(Namespaces.html, "figure"),
+  const Pair(Namespaces.html, "footer"),
+  const Pair(Namespaces.html, "form"),
+  const Pair(Namespaces.html, "frame"),
+  const Pair(Namespaces.html, "frameset"),
+  const Pair(Namespaces.html, "h1"),
+  const Pair(Namespaces.html, "h2"),
+  const Pair(Namespaces.html, "h3"),
+  const Pair(Namespaces.html, "h4"),
+  const Pair(Namespaces.html, "h5"),
+  const Pair(Namespaces.html, "h6"),
+  const Pair(Namespaces.html, "head"),
+  const Pair(Namespaces.html, "header"),
+  const Pair(Namespaces.html, "hr"),
+  const Pair(Namespaces.html, "html"),
+  const Pair(Namespaces.html, "iframe"),
+  // Note that image is commented out in the spec as "this isn't an
+  // element that can end up on the stack, so it doesn't matter,"
+  const Pair(Namespaces.html, "image"),
+  const Pair(Namespaces.html, "img"),
+  const Pair(Namespaces.html, "input"),
+  const Pair(Namespaces.html, "isindex"),
+  const Pair(Namespaces.html, "li"),
+  const Pair(Namespaces.html, "link"),
+  const Pair(Namespaces.html, "listing"),
+  const Pair(Namespaces.html, "marquee"),
+  const Pair(Namespaces.html, "men"),
+  const Pair(Namespaces.html, "meta"),
+  const Pair(Namespaces.html, "nav"),
+  const Pair(Namespaces.html, "noembed"),
+  const Pair(Namespaces.html, "noframes"),
+  const Pair(Namespaces.html, "noscript"),
+  const Pair(Namespaces.html, "object"),
+  const Pair(Namespaces.html, "ol"),
+  const Pair(Namespaces.html, "p"),
+  const Pair(Namespaces.html, "param"),
+  const Pair(Namespaces.html, "plaintext"),
+  const Pair(Namespaces.html, "pre"),
+  const Pair(Namespaces.html, "script"),
+  const Pair(Namespaces.html, "section"),
+  const Pair(Namespaces.html, "select"),
+  const Pair(Namespaces.html, "style"),
+  const Pair(Namespaces.html, "table"),
+  const Pair(Namespaces.html, "tbody"),
+  const Pair(Namespaces.html, "td"),
+  const Pair(Namespaces.html, "textarea"),
+  const Pair(Namespaces.html, "tfoot"),
+  const Pair(Namespaces.html, "th"),
+  const Pair(Namespaces.html, "thead"),
+  const Pair(Namespaces.html, "title"),
+  const Pair(Namespaces.html, "tr"),
+  const Pair(Namespaces.html, "ul"),
+  const Pair(Namespaces.html, "wbr"),
+  const Pair(Namespaces.html, "xmp"),
+  const Pair(Namespaces.svg, "foreignObject")
+];
+
+const htmlIntegrationPointElements = const [
+  const Pair(Namespaces.mathml, "annotaion-xml"),
+  const Pair(Namespaces.svg, "foreignObject"),
+  const Pair(Namespaces.svg, "desc"),
+  const Pair(Namespaces.svg, "title")
+];
+
+const mathmlTextIntegrationPointElements = const [
+  const Pair(Namespaces.mathml, "mi"),
+  const Pair(Namespaces.mathml, "mo"),
+  const Pair(Namespaces.mathml, "mn"),
+  const Pair(Namespaces.mathml, "ms"),
+  const Pair(Namespaces.mathml, "mtext")
+];
+
+const spaceCharacters = " \n\r\t\u000C";
+
+const int NEWLINE = 10;
+const int RETURN = 13;
+
+bool isWhitespace(String char) {
+  if (char == null) return false;
+  return isWhitespaceCC(char.codeUnitAt(0));
+}
+
+bool isWhitespaceCC(int charCode) {
+  switch (charCode) {
+    case 9: // '\t'
+    case NEWLINE: // '\n'
+    case 12: // '\f'
+    case RETURN: // '\r'
+    case 32: // ' '
+      return true;
+  }
+  return false;
+}
+
+const List<String> tableInsertModeElements = const [
+  "table",
+  "tbody",
+  "tfoot",
+  "thead",
+  "tr"
+];
+
+// TODO(jmesserly): remove these in favor of the test functions
+const asciiLetters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
+
+const ZERO = 48;
+const LOWER_A = 97;
+const LOWER_Z = 122;
+const UPPER_A = 65;
+const UPPER_Z = 90;
+
+bool isLetterOrDigit(String char) => isLetter(char) || isDigit(char);
+
+// Note: this is intentially ASCII only
+bool isLetter(String char) {
+  if (char == null) return false;
+  int cc = char.codeUnitAt(0);
+  return cc >= LOWER_A && cc <= LOWER_Z || cc >= UPPER_A && cc <= UPPER_Z;
+}
+
+bool isDigit(String char) {
+  if (char == null) return false;
+  int cc = char.codeUnitAt(0);
+  return cc >= ZERO && cc < ZERO + 10;
+}
+
+bool isHexDigit(String char) {
+  if (char == null) return false;
+  switch (char.codeUnitAt(0)) {
+    case 48:
+    case 49:
+    case 50:
+    case 51:
+    case 52: // '0' - '4'
+    case 53:
+    case 54:
+    case 55:
+    case 56:
+    case 57: // '5' - '9'
+    case 65:
+    case 66:
+    case 67:
+    case 68:
+    case 69:
+    case 70: // 'A' - 'F'
+    case 97:
+    case 98:
+    case 99:
+    case 100:
+    case 101:
+    case 102: // 'a' - 'f'
+      return true;
+  }
+  return false;
+}
+
+// Note: based on the original Python code, I assume we only want to convert
+// ASCII chars to.toLowerCase() case, unlike Dart's toLowerCase function.
+String asciiUpper2Lower(String text) {
+  if (text == null) return null;
+  var result = new List<int>(text.length);
+  for (int i = 0; i < text.length; i++) {
+    var c = text.codeUnitAt(i);
+    if (c >= UPPER_A && c <= UPPER_Z) {
+      c += LOWER_A - UPPER_A;
+    }
+    result[i] = c;
+  }
+  return new String.fromCharCodes(result);
+}
+
+// Heading elements need to be ordered
+const headingElements = const ["h1", "h2", "h3", "h4", "h5", "h6"];
+
+const cdataElements = const ['title', 'textarea'];
+
+const rcdataElements = const [
+  'style',
+  'script',
+  'xmp',
+  'iframe',
+  'noembed',
+  'noframes',
+  'noscript'
+];
+
+const Map<String, List<String>> booleanAttributes = const {
+  "": const ["irrelevant",],
+  "style": const ["scoped",],
+  "img": const ["ismap",],
+  "audio": const ["autoplay", "controls"],
+  "video": const ["autoplay", "controls"],
+  "script": const ["defer", "async"],
+  "details": const ["open",],
+  "datagrid": const ["multiple", "disabled"],
+  "command": const ["hidden", "disabled", "checked", "default"],
+  "hr": const ["noshade"],
+  "men": const ["autosubmit",],
+  "fieldset": const ["disabled", "readonly"],
+  "option": const ["disabled", "readonly", "selected"],
+  "optgroup": const ["disabled", "readonly"],
+  "button": const ["disabled", "autofocus"],
+  "input": const [
+    "disabled",
+    "readonly",
+    "required",
+    "autofocus",
+    "checked",
+    "ismap"
+  ],
+  "select": const ["disabled", "readonly", "autofocus", "multiple"],
+  "output": const ["disabled", "readonly"],
+};
+
+// entitiesWindows1252 has to be _ordered_ and needs to have an index. It
+// therefore can't be a frozenset.
+const List<int> entitiesWindows1252 = const [
+  8364, // 0x80  0x20AC  EURO SIGN
+  65533, // 0x81          UNDEFINED
+  8218, // 0x82  0x201A  SINGLE LOW-9 QUOTATION MARK
+  402, // 0x83  0x0192  LATIN SMALL LETTER F WITH HOOK
+  8222, // 0x84  0x201E  DOUBLE LOW-9 QUOTATION MARK
+  8230, // 0x85  0x2026  HORIZONTAL ELLIPSIS
+  8224, // 0x86  0x2020  DAGGER
+  8225, // 0x87  0x2021  DOUBLE DAGGER
+  710, // 0x88  0x02C6  MODIFIER LETTER CIRCUMFLEX ACCENT
+  8240, // 0x89  0x2030  PER MILLE SIGN
+  352, // 0x8A  0x0160  LATIN CAPITAL LETTER S WITH CARON
+  8249, // 0x8B  0x2039  SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+  338, // 0x8C  0x0152  LATIN CAPITAL LIGATURE OE
+  65533, // 0x8D          UNDEFINED
+  381, // 0x8E  0x017D  LATIN CAPITAL LETTER Z WITH CARON
+  65533, // 0x8F          UNDEFINED
+  65533, // 0x90          UNDEFINED
+  8216, // 0x91  0x2018  LEFT SINGLE QUOTATION MARK
+  8217, // 0x92  0x2019  RIGHT SINGLE QUOTATION MARK
+  8220, // 0x93  0x201C  LEFT DOUBLE QUOTATION MARK
+  8221, // 0x94  0x201D  RIGHT DOUBLE QUOTATION MARK
+  8226, // 0x95  0x2022  BULLET
+  8211, // 0x96  0x2013  EN DASH
+  8212, // 0x97  0x2014  EM DASH
+  732, // 0x98  0x02DC  SMALL TILDE
+  8482, // 0x99  0x2122  TRADE MARK SIGN
+  353, // 0x9A  0x0161  LATIN SMALL LETTER S WITH CARON
+  8250, // 0x9B  0x203A  SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+  339, // 0x9C  0x0153  LATIN SMALL LIGATURE OE
+  65533, // 0x9D          UNDEFINED
+  382, // 0x9E  0x017E  LATIN SMALL LETTER Z WITH CARON
+  376 // 0x9F  0x0178  LATIN CAPITAL LETTER Y WITH DIAERESIS
+];
+
+const xmlEntities = const ['lt;', 'gt;', 'amp;', 'apos;', 'quot;'];
+
+const Map<String, String> entities = const {
+  "AElig": "\xc6",
+  "AElig;": "\xc6",
+  "AMP": "&",
+  "AMP;": "&",
+  "Aacute": "\xc1",
+  "Aacute;": "\xc1",
+  "Abreve;": "\u0102",
+  "Acirc": "\xc2",
+  "Acirc;": "\xc2",
+  "Acy;": "\u0410",
+  "Afr;": "\u{01d504}",
+  "Agrave": "\xc0",
+  "Agrave;": "\xc0",
+  "Alpha;": "\u0391",
+  "Amacr;": "\u0100",
+  "And;": "\u2a53",
+  "Aogon;": "\u0104",
+  "Aopf;": "\u{01d538}",
+  "ApplyFunction;": "\u2061",
+  "Aring": "\xc5",
+  "Aring;": "\xc5",
+  "Ascr;": "\u{01d49c}",
+  "Assign;": "\u2254",
+  "Atilde": "\xc3",
+  "Atilde;": "\xc3",
+  "Auml": "\xc4",
+  "Auml;": "\xc4",
+  "Backslash;": "\u2216",
+  "Barv;": "\u2ae7",
+  "Barwed;": "\u2306",
+  "Bcy;": "\u0411",
+  "Because;": "\u2235",
+  "Bernoullis;": "\u212c",
+  "Beta;": "\u0392",
+  "Bfr;": "\u{01d505}",
+  "Bopf;": "\u{01d539}",
+  "Breve;": "\u02d8",
+  "Bscr;": "\u212c",
+  "Bumpeq;": "\u224e",
+  "CHcy;": "\u0427",
+  "COPY": "\xa9",
+  "COPY;": "\xa9",
+  "Cacute;": "\u0106",
+  "Cap;": "\u22d2",
+  "CapitalDifferentialD;": "\u2145",
+  "Cayleys;": "\u212d",
+  "Ccaron;": "\u010c",
+  "Ccedil": "\xc7",
+  "Ccedil;": "\xc7",
+  "Ccirc;": "\u0108",
+  "Cconint;": "\u2230",
+  "Cdot;": "\u010a",
+  "Cedilla;": "\xb8",
+  "CenterDot;": "\xb7",
+  "Cfr;": "\u212d",
+  "Chi;": "\u03a7",
+  "CircleDot;": "\u2299",
+  "CircleMinus;": "\u2296",
+  "CirclePlus;": "\u2295",
+  "CircleTimes;": "\u2297",
+  "ClockwiseContourIntegral;": "\u2232",
+  "CloseCurlyDoubleQuote;": "\u201d",
+  "CloseCurlyQuote;": "\u2019",
+  "Colon;": "\u2237",
+  "Colone;": "\u2a74",
+  "Congruent;": "\u2261",
+  "Conint;": "\u222f",
+  "ContourIntegral;": "\u222e",
+  "Copf;": "\u2102",
+  "Coproduct;": "\u2210",
+  "CounterClockwiseContourIntegral;": "\u2233",
+  "Cross;": "\u2a2f",
+  "Cscr;": "\u{01d49e}",
+  "Cup;": "\u22d3",
+  "CupCap;": "\u224d",
+  "DD;": "\u2145",
+  "DDotrahd;": "\u2911",
+  "DJcy;": "\u0402",
+  "DScy;": "\u0405",
+  "DZcy;": "\u040f",
+  "Dagger;": "\u2021",
+  "Darr;": "\u21a1",
+  "Dashv;": "\u2ae4",
+  "Dcaron;": "\u010e",
+  "Dcy;": "\u0414",
+  "Del;": "\u2207",
+  "Delta;": "\u0394",
+  "Dfr;": "\u{01d507}",
+  "DiacriticalAcute;": "\xb4",
+  "DiacriticalDot;": "\u02d9",
+  "DiacriticalDoubleAcute;": "\u02dd",
+  "DiacriticalGrave;": "`",
+  "DiacriticalTilde;": "\u02dc",
+  "Diamond;": "\u22c4",
+  "DifferentialD;": "\u2146",
+  "Dopf;": "\u{01d53b}",
+  "Dot;": "\xa8",
+  "DotDot;": "\u20dc",
+  "DotEqual;": "\u2250",
+  "DoubleContourIntegral;": "\u222f",
+  "DoubleDot;": "\xa8",
+  "DoubleDownArrow;": "\u21d3",
+  "DoubleLeftArrow;": "\u21d0",
+  "DoubleLeftRightArrow;": "\u21d4",
+  "DoubleLeftTee;": "\u2ae4",
+  "DoubleLongLeftArrow;": "\u27f8",
+  "DoubleLongLeftRightArrow;": "\u27fa",
+  "DoubleLongRightArrow;": "\u27f9",
+  "DoubleRightArrow;": "\u21d2",
+  "DoubleRightTee;": "\u22a8",
+  "DoubleUpArrow;": "\u21d1",
+  "DoubleUpDownArrow;": "\u21d5",
+  "DoubleVerticalBar;": "\u2225",
+  "DownArrow;": "\u2193",
+  "DownArrowBar;": "\u2913",
+  "DownArrowUpArrow;": "\u21f5",
+  "DownBreve;": "\u0311",
+  "DownLeftRightVector;": "\u2950",
+  "DownLeftTeeVector;": "\u295e",
+  "DownLeftVector;": "\u21bd",
+  "DownLeftVectorBar;": "\u2956",
+  "DownRightTeeVector;": "\u295f",
+  "DownRightVector;": "\u21c1",
+  "DownRightVectorBar;": "\u2957",
+  "DownTee;": "\u22a4",
+  "DownTeeArrow;": "\u21a7",
+  "Downarrow;": "\u21d3",
+  "Dscr;": "\u{01d49f}",
+  "Dstrok;": "\u0110",
+  "ENG;": "\u014a",
+  "ETH": "\xd0",
+  "ETH;": "\xd0",
+  "Eacute": "\xc9",
+  "Eacute;": "\xc9",
+  "Ecaron;": "\u011a",
+  "Ecirc": "\xca",
+  "Ecirc;": "\xca",
+  "Ecy;": "\u042d",
+  "Edot;": "\u0116",
+  "Efr;": "\u{01d508}",
+  "Egrave": "\xc8",
+  "Egrave;": "\xc8",
+  "Element;": "\u2208",
+  "Emacr;": "\u0112",
+  "EmptySmallSquare;": "\u25fb",
+  "EmptyVerySmallSquare;": "\u25ab",
+  "Eogon;": "\u0118",
+  "Eopf;": "\u{01d53c}",
+  "Epsilon;": "\u0395",
+  "Equal;": "\u2a75",
+  "EqualTilde;": "\u2242",
+  "Equilibrium;": "\u21cc",
+  "Escr;": "\u2130",
+  "Esim;": "\u2a73",
+  "Eta;": "\u0397",
+  "Euml": "\xcb",
+  "Euml;": "\xcb",
+  "Exists;": "\u2203",
+  "ExponentialE;": "\u2147",
+  "Fcy;": "\u0424",
+  "Ffr;": "\u{01d509}",
+  "FilledSmallSquare;": "\u25fc",
+  "FilledVerySmallSquare;": "\u25aa",
+  "Fopf;": "\u{01d53d}",
+  "ForAll;": "\u2200",
+  "Fouriertrf;": "\u2131",
+  "Fscr;": "\u2131",
+  "GJcy;": "\u0403",
+  "GT": ">",
+  "GT;": ">",
+  "Gamma;": "\u0393",
+  "Gammad;": "\u03dc",
+  "Gbreve;": "\u011e",
+  "Gcedil;": "\u0122",
+  "Gcirc;": "\u011c",
+  "Gcy;": "\u0413",
+  "Gdot;": "\u0120",
+  "Gfr;": "\u{01d50a}",
+  "Gg;": "\u22d9",
+  "Gopf;": "\u{01d53e}",
+  "GreaterEqual;": "\u2265",
+  "GreaterEqualLess;": "\u22db",
+  "GreaterFullEqual;": "\u2267",
+  "GreaterGreater;": "\u2aa2",
+  "GreaterLess;": "\u2277",
+  "GreaterSlantEqual;": "\u2a7e",
+  "GreaterTilde;": "\u2273",
+  "Gscr;": "\u{01d4a2}",
+  "Gt;": "\u226b",
+  "HARDcy;": "\u042a",
+  "Hacek;": "\u02c7",
+  "Hat;": "^",
+  "Hcirc;": "\u0124",
+  "Hfr;": "\u210c",
+  "HilbertSpace;": "\u210b",
+  "Hopf;": "\u210d",
+  "HorizontalLine;": "\u2500",
+  "Hscr;": "\u210b",
+  "Hstrok;": "\u0126",
+  "HumpDownHump;": "\u224e",
+  "HumpEqual;": "\u224f",
+  "IEcy;": "\u0415",
+  "IJlig;": "\u0132",
+  "IOcy;": "\u0401",
+  "Iacute": "\xcd",
+  "Iacute;": "\xcd",
+  "Icirc": "\xce",
+  "Icirc;": "\xce",
+  "Icy;": "\u0418",
+  "Idot;": "\u0130",
+  "Ifr;": "\u2111",
+  "Igrave": "\xcc",
+  "Igrave;": "\xcc",
+  "Im;": "\u2111",
+  "Imacr;": "\u012a",
+  "ImaginaryI;": "\u2148",
+  "Implies;": "\u21d2",
+  "Int;": "\u222c",
+  "Integral;": "\u222b",
+  "Intersection;": "\u22c2",
+  "InvisibleComma;": "\u2063",
+  "InvisibleTimes;": "\u2062",
+  "Iogon;": "\u012e",
+  "Iopf;": "\u{01d540}",
+  "Iota;": "\u0399",
+  "Iscr;": "\u2110",
+  "Itilde;": "\u0128",
+  "Iukcy;": "\u0406",
+  "Iuml": "\xcf",
+  "Iuml;": "\xcf",
+  "Jcirc;": "\u0134",
+  "Jcy;": "\u0419",
+  "Jfr;": "\u{01d50d}",
+  "Jopf;": "\u{01d541}",
+  "Jscr;": "\u{01d4a5}",
+  "Jsercy;": "\u0408",
+  "Jukcy;": "\u0404",
+  "KHcy;": "\u0425",
+  "KJcy;": "\u040c",
+  "Kappa;": "\u039a",
+  "Kcedil;": "\u0136",
+  "Kcy;": "\u041a",
+  "Kfr;": "\u{01d50e}",
+  "Kopf;": "\u{01d542}",
+  "Kscr;": "\u{01d4a6}",
+  "LJcy;": "\u0409",
+  "LT": "<",
+  "LT;": "<",
+  "Lacute;": "\u0139",
+  "Lambda;": "\u039b",
+  "Lang;": "\u27ea",
+  "Laplacetrf;": "\u2112",
+  "Larr;": "\u219e",
+  "Lcaron;": "\u013d",
+  "Lcedil;": "\u013b",
+  "Lcy;": "\u041b",
+  "LeftAngleBracket;": "\u27e8",
+  "LeftArrow;": "\u2190",
+  "LeftArrowBar;": "\u21e4",
+  "LeftArrowRightArrow;": "\u21c6",
+  "LeftCeiling;": "\u2308",
+  "LeftDoubleBracket;": "\u27e6",
+  "LeftDownTeeVector;": "\u2961",
+  "LeftDownVector;": "\u21c3",
+  "LeftDownVectorBar;": "\u2959",
+  "LeftFloor;": "\u230a",
+  "LeftRightArrow;": "\u2194",
+  "LeftRightVector;": "\u294e",
+  "LeftTee;": "\u22a3",
+  "LeftTeeArrow;": "\u21a4",
+  "LeftTeeVector;": "\u295a",
+  "LeftTriangle;": "\u22b2",
+  "LeftTriangleBar;": "\u29cf",
+  "LeftTriangleEqual;": "\u22b4",
+  "LeftUpDownVector;": "\u2951",
+  "LeftUpTeeVector;": "\u2960",
+  "LeftUpVector;": "\u21bf",
+  "LeftUpVectorBar;": "\u2958",
+  "LeftVector;": "\u21bc",
+  "LeftVectorBar;": "\u2952",
+  "Leftarrow;": "\u21d0",
+  "Leftrightarrow;": "\u21d4",
+  "LessEqualGreater;": "\u22da",
+  "LessFullEqual;": "\u2266",
+  "LessGreater;": "\u2276",
+  "LessLess;": "\u2aa1",
+  "LessSlantEqual;": "\u2a7d",
+  "LessTilde;": "\u2272",
+  "Lfr;": "\u{01d50f}",
+  "Ll;": "\u22d8",
+  "Lleftarrow;": "\u21da",
+  "Lmidot;": "\u013f",
+  "LongLeftArrow;": "\u27f5",
+  "LongLeftRightArrow;": "\u27f7",
+  "LongRightArrow;": "\u27f6",
+  "Longleftarrow;": "\u27f8",
+  "Longleftrightarrow;": "\u27fa",
+  "Longrightarrow;": "\u27f9",
+  "Lopf;": "\u{01d543}",
+  "LowerLeftArrow;": "\u2199",
+  "LowerRightArrow;": "\u2198",
+  "Lscr;": "\u2112",
+  "Lsh;": "\u21b0",
+  "Lstrok;": "\u0141",
+  "Lt;": "\u226a",
+  "Map;": "\u2905",
+  "Mcy;": "\u041c",
+  "MediumSpace;": "\u205f",
+  "Mellintrf;": "\u2133",
+  "Mfr;": "\u{01d510}",
+  "MinusPlus;": "\u2213",
+  "Mopf;": "\u{01d544}",
+  "Mscr;": "\u2133",
+  "Mu;": "\u039c",
+  "NJcy;": "\u040a",
+  "Nacute;": "\u0143",
+  "Ncaron;": "\u0147",
+  "Ncedil;": "\u0145",
+  "Ncy;": "\u041d",
+  "NegativeMediumSpace;": "\u200b",
+  "NegativeThickSpace;": "\u200b",
+  "NegativeThinSpace;": "\u200b",
+  "NegativeVeryThinSpace;": "\u200b",
+  "NestedGreaterGreater;": "\u226b",
+  "NestedLessLess;": "\u226a",
+  "NewLine;": "\n",
+  "Nfr;": "\u{01d511}",
+  "NoBreak;": "\u2060",
+  "NonBreakingSpace;": "\xa0",
+  "Nopf;": "\u2115",
+  "Not;": "\u2aec",
+  "NotCongruent;": "\u2262",
+  "NotCupCap;": "\u226d",
+  "NotDoubleVerticalBar;": "\u2226",
+  "NotElement;": "\u2209",
+  "NotEqual;": "\u2260",
+  "NotEqualTilde;": "\u2242\u0338",
+  "NotExists;": "\u2204",
+  "NotGreater;": "\u226f",
+  "NotGreaterEqual;": "\u2271",
+  "NotGreaterFullEqual;": "\u2267\u0338",
+  "NotGreaterGreater;": "\u226b\u0338",
+  "NotGreaterLess;": "\u2279",
+  "NotGreaterSlantEqual;": "\u2a7e\u0338",
+  "NotGreaterTilde;": "\u2275",
+  "NotHumpDownHump;": "\u224e\u0338",
+  "NotHumpEqual;": "\u224f\u0338",
+  "NotLeftTriangle;": "\u22ea",
+  "NotLeftTriangleBar;": "\u29cf\u0338",
+  "NotLeftTriangleEqual;": "\u22ec",
+  "NotLess;": "\u226e",
+  "NotLessEqual;": "\u2270",
+  "NotLessGreater;": "\u2278",
+  "NotLessLess;": "\u226a\u0338",
+  "NotLessSlantEqual;": "\u2a7d\u0338",
+  "NotLessTilde;": "\u2274",
+  "NotNestedGreaterGreater;": "\u2aa2\u0338",
+  "NotNestedLessLess;": "\u2aa1\u0338",
+  "NotPrecedes;": "\u2280",
+  "NotPrecedesEqual;": "\u2aaf\u0338",
+  "NotPrecedesSlantEqual;": "\u22e0",
+  "NotReverseElement;": "\u220c",
+  "NotRightTriangle;": "\u22eb",
+  "NotRightTriangleBar;": "\u29d0\u0338",
+  "NotRightTriangleEqual;": "\u22ed",
+  "NotSquareSubset;": "\u228f\u0338",
+  "NotSquareSubsetEqual;": "\u22e2",
+  "NotSquareSuperset;": "\u2290\u0338",
+  "NotSquareSupersetEqual;": "\u22e3",
+  "NotSubset;": "\u2282\u20d2",
+  "NotSubsetEqual;": "\u2288",
+  "NotSucceeds;": "\u2281",
+  "NotSucceedsEqual;": "\u2ab0\u0338",
+  "NotSucceedsSlantEqual;": "\u22e1",
+  "NotSucceedsTilde;": "\u227f\u0338",
+  "NotSuperset;": "\u2283\u20d2",
+  "NotSupersetEqual;": "\u2289",
+  "NotTilde;": "\u2241",
+  "NotTildeEqual;": "\u2244",
+  "NotTildeFullEqual;": "\u2247",
+  "NotTildeTilde;": "\u2249",
+  "NotVerticalBar;": "\u2224",
+  "Nscr;": "\u{01d4a9}",
+  "Ntilde": "\xd1",
+  "Ntilde;": "\xd1",
+  "Nu;": "\u039d",
+  "OElig;": "\u0152",
+  "Oacute": "\xd3",
+  "Oacute;": "\xd3",
+  "Ocirc": "\xd4",
+  "Ocirc;": "\xd4",
+  "Ocy;": "\u041e",
+  "Odblac;": "\u0150",
+  "Ofr;": "\u{01d512}",
+  "Ograve": "\xd2",
+  "Ograve;": "\xd2",
+  "Omacr;": "\u014c",
+  "Omega;": "\u03a9",
+  "Omicron;": "\u039f",
+  "Oopf;": "\u{01d546}",
+  "OpenCurlyDoubleQuote;": "\u201c",
+  "OpenCurlyQuote;": "\u2018",
+  "Or;": "\u2a54",
+  "Oscr;": "\u{01d4aa}",
+  "Oslash": "\xd8",
+  "Oslash;": "\xd8",
+  "Otilde": "\xd5",
+  "Otilde;": "\xd5",
+  "Otimes;": "\u2a37",
+  "Ouml": "\xd6",
+  "Ouml;": "\xd6",
+  "OverBar;": "\u203e",
+  "OverBrace;": "\u23de",
+  "OverBracket;": "\u23b4",
+  "OverParenthesis;": "\u23dc",
+  "PartialD;": "\u2202",
+  "Pcy;": "\u041f",
+  "Pfr;": "\u{01d513}",
+  "Phi;": "\u03a6",
+  "Pi;": "\u03a0",
+  "PlusMinus;": "\xb1",
+  "Poincareplane;": "\u210c",
+  "Popf;": "\u2119",
+  "Pr;": "\u2abb",
+  "Precedes;": "\u227a",
+  "PrecedesEqual;": "\u2aaf",
+  "PrecedesSlantEqual;": "\u227c",
+  "PrecedesTilde;": "\u227e",
+  "Prime;": "\u2033",
+  "Product;": "\u220f",
+  "Proportion;": "\u2237",
+  "Proportional;": "\u221d",
+  "Pscr;": "\u{01d4ab}",
+  "Psi;": "\u03a8",
+  "QUOT": "\"",
+  "QUOT;": "\"",
+  "Qfr;": "\u{01d514}",
+  "Qopf;": "\u211a",
+  "Qscr;": "\u{01d4ac}",
+  "RBarr;": "\u2910",
+  "REG": "\xae",
+  "REG;": "\xae",
+  "Racute;": "\u0154",
+  "Rang;": "\u27eb",
+  "Rarr;": "\u21a0",
+  "Rarrtl;": "\u2916",
+  "Rcaron;": "\u0158",
+  "Rcedil;": "\u0156",
+  "Rcy;": "\u0420",
+  "Re;": "\u211c",
+  "ReverseElement;": "\u220b",
+  "ReverseEquilibrium;": "\u21cb",
+  "ReverseUpEquilibrium;": "\u296f",
+  "Rfr;": "\u211c",
+  "Rho;": "\u03a1",
+  "RightAngleBracket;": "\u27e9",
+  "RightArrow;": "\u2192",
+  "RightArrowBar;": "\u21e5",
+  "RightArrowLeftArrow;": "\u21c4",
+  "RightCeiling;": "\u2309",
+  "RightDoubleBracket;": "\u27e7",
+  "RightDownTeeVector;": "\u295d",
+  "RightDownVector;": "\u21c2",
+  "RightDownVectorBar;": "\u2955",
+  "RightFloor;": "\u230b",
+  "RightTee;": "\u22a2",
+  "RightTeeArrow;": "\u21a6",
+  "RightTeeVector;": "\u295b",
+  "RightTriangle;": "\u22b3",
+  "RightTriangleBar;": "\u29d0",
+  "RightTriangleEqual;": "\u22b5",
+  "RightUpDownVector;": "\u294f",
+  "RightUpTeeVector;": "\u295c",
+  "RightUpVector;": "\u21be",
+  "RightUpVectorBar;": "\u2954",
+  "RightVector;": "\u21c0",
+  "RightVectorBar;": "\u2953",
+  "Rightarrow;": "\u21d2",
+  "Ropf;": "\u211d",
+  "RoundImplies;": "\u2970",
+  "Rrightarrow;": "\u21db",
+  "Rscr;": "\u211b",
+  "Rsh;": "\u21b1",
+  "RuleDelayed;": "\u29f4",
+  "SHCHcy;": "\u0429",
+  "SHcy;": "\u0428",
+  "SOFTcy;": "\u042c",
+  "Sacute;": "\u015a",
+  "Sc;": "\u2abc",
+  "Scaron;": "\u0160",
+  "Scedil;": "\u015e",
+  "Scirc;": "\u015c",
+  "Scy;": "\u0421",
+  "Sfr;": "\u{01d516}",
+  "ShortDownArrow;": "\u2193",
+  "ShortLeftArrow;": "\u2190",
+  "ShortRightArrow;": "\u2192",
+  "ShortUpArrow;": "\u2191",
+  "Sigma;": "\u03a3",
+  "SmallCircle;": "\u2218",
+  "Sopf;": "\u{01d54a}",
+  "Sqrt;": "\u221a",
+  "Square;": "\u25a1",
+  "SquareIntersection;": "\u2293",
+  "SquareSubset;": "\u228f",
+  "SquareSubsetEqual;": "\u2291",
+  "SquareSuperset;": "\u2290",
+  "SquareSupersetEqual;": "\u2292",
+  "SquareUnion;": "\u2294",
+  "Sscr;": "\u{01d4ae}",
+  "Star;": "\u22c6",
+  "Sub;": "\u22d0",
+  "Subset;": "\u22d0",
+  "SubsetEqual;": "\u2286",
+  "Succeeds;": "\u227b",
+  "SucceedsEqual;": "\u2ab0",
+  "SucceedsSlantEqual;": "\u227d",
+  "SucceedsTilde;": "\u227f",
+  "SuchThat;": "\u220b",
+  "Sum;": "\u2211",
+  "Sup;": "\u22d1",
+  "Superset;": "\u2283",
+  "SupersetEqual;": "\u2287",
+  "Supset;": "\u22d1",
+  "THORN": "\xde",
+  "THORN;": "\xde",
+  "TRADE;": "\u2122",
+  "TSHcy;": "\u040b",
+  "TScy;": "\u0426",
+  "Tab;": "\t",
+  "Tau;": "\u03a4",
+  "Tcaron;": "\u0164",
+  "Tcedil;": "\u0162",
+  "Tcy;": "\u0422",
+  "Tfr;": "\u{01d517}",
+  "Therefore;": "\u2234",
+  "Theta;": "\u0398",
+  "ThickSpace;": "\u205f\u200a",
+  "ThinSpace;": "\u2009",
+  "Tilde;": "\u223c",
+  "TildeEqual;": "\u2243",
+  "TildeFullEqual;": "\u2245",
+  "TildeTilde;": "\u2248",
+  "Topf;": "\u{01d54b}",
+  "TripleDot;": "\u20db",
+  "Tscr;": "\u{01d4af}",
+  "Tstrok;": "\u0166",
+  "Uacute": "\xda",
+  "Uacute;": "\xda",
+  "Uarr;": "\u219f",
+  "Uarrocir;": "\u2949",
+  "Ubrcy;": "\u040e",
+  "Ubreve;": "\u016c",
+  "Ucirc": "\xdb",
+  "Ucirc;": "\xdb",
+  "Ucy;": "\u0423",
+  "Udblac;": "\u0170",
+  "Ufr;": "\u{01d518}",
+  "Ugrave": "\xd9",
+  "Ugrave;": "\xd9",
+  "Umacr;": "\u016a",
+  "UnderBar;": "_",
+  "UnderBrace;": "\u23df",
+  "UnderBracket;": "\u23b5",
+  "UnderParenthesis;": "\u23dd",
+  "Union;": "\u22c3",
+  "UnionPlus;": "\u228e",
+  "Uogon;": "\u0172",
+  "Uopf;": "\u{01d54c}",
+  "UpArrow;": "\u2191",
+  "UpArrowBar;": "\u2912",
+  "UpArrowDownArrow;": "\u21c5",
+  "UpDownArrow;": "\u2195",
+  "UpEquilibrium;": "\u296e",
+  "UpTee;": "\u22a5",
+  "UpTeeArrow;": "\u21a5",
+  "Uparrow;": "\u21d1",
+  "Updownarrow;": "\u21d5",
+  "UpperLeftArrow;": "\u2196",
+  "UpperRightArrow;": "\u2197",
+  "Upsi;": "\u03d2",
+  "Upsilon;": "\u03a5",
+  "Uring;": "\u016e",
+  "Uscr;": "\u{01d4b0}",
+  "Utilde;": "\u0168",
+  "Uuml": "\xdc",
+  "Uuml;": "\xdc",
+  "VDash;": "\u22ab",
+  "Vbar;": "\u2aeb",
+  "Vcy;": "\u0412",
+  "Vdash;": "\u22a9",
+  "Vdashl;": "\u2ae6",
+  "Vee;": "\u22c1",
+  "Verbar;": "\u2016",
+  "Vert;": "\u2016",
+  "VerticalBar;": "\u2223",
+  "VerticalLine;": "|",
+  "VerticalSeparator;": "\u2758",
+  "VerticalTilde;": "\u2240",
+  "VeryThinSpace;": "\u200a",
+  "Vfr;": "\u{01d519}",
+  "Vopf;": "\u{01d54d}",
+  "Vscr;": "\u{01d4b1}",
+  "Vvdash;": "\u22aa",
+  "Wcirc;": "\u0174",
+  "Wedge;": "\u22c0",
+  "Wfr;": "\u{01d51a}",
+  "Wopf;": "\u{01d54e}",
+  "Wscr;": "\u{01d4b2}",
+  "Xfr;": "\u{01d51b}",
+  "Xi;": "\u039e",
+  "Xopf;": "\u{01d54f}",
+  "Xscr;": "\u{01d4b3}",
+  "YAcy;": "\u042f",
+  "YIcy;": "\u0407",
+  "YUcy;": "\u042e",
+  "Yacute": "\xdd",
+  "Yacute;": "\xdd",
+  "Ycirc;": "\u0176",
+  "Ycy;": "\u042b",
+  "Yfr;": "\u{01d51c}",
+  "Yopf;": "\u{01d550}",
+  "Yscr;": "\u{01d4b4}",
+  "Yuml;": "\u0178",
+  "ZHcy;": "\u0416",
+  "Zacute;": "\u0179",
+  "Zcaron;": "\u017d",
+  "Zcy;": "\u0417",
+  "Zdot;": "\u017b",
+  "ZeroWidthSpace;": "\u200b",
+  "Zeta;": "\u0396",
+  "Zfr;": "\u2128",
+  "Zopf;": "\u2124",
+  "Zscr;": "\u{01d4b5}",
+  "aacute": "\xe1",
+  "aacute;": "\xe1",
+  "abreve;": "\u0103",
+  "ac;": "\u223e",
+  "acE;": "\u223e\u0333",
+  "acd;": "\u223f",
+  "acirc": "\xe2",
+  "acirc;": "\xe2",
+  "acute": "\xb4",
+  "acute;": "\xb4",
+  "acy;": "\u0430",
+  "aelig": "\xe6",
+  "aelig;": "\xe6",
+  "af;": "\u2061",
+  "afr;": "\u{01d51e}",
+  "agrave": "\xe0",
+  "agrave;": "\xe0",
+  "alefsym;": "\u2135",
+  "aleph;": "\u2135",
+  "alpha;": "\u03b1",
+  "amacr;": "\u0101",
+  "amalg;": "\u2a3f",
+  "amp": "&",
+  "amp;": "&",
+  "and;": "\u2227",
+  "andand;": "\u2a55",
+  "andd;": "\u2a5c",
+  "andslope;": "\u2a58",
+  "andv;": "\u2a5a",
+  "ang;": "\u2220",
+  "ange;": "\u29a4",
+  "angle;": "\u2220",
+  "angmsd;": "\u2221",
+  "angmsdaa;": "\u29a8",
+  "angmsdab;": "\u29a9",
+  "angmsdac;": "\u29aa",
+  "angmsdad;": "\u29ab",
+  "angmsdae;": "\u29ac",
+  "angmsdaf;": "\u29ad",
+  "angmsdag;": "\u29ae",
+  "angmsdah;": "\u29af",
+  "angrt;": "\u221f",
+  "angrtvb;": "\u22be",
+  "angrtvbd;": "\u299d",
+  "angsph;": "\u2222",
+  "angst;": "\xc5",
+  "angzarr;": "\u237c",
+  "aogon;": "\u0105",
+  "aopf;": "\u{01d552}",
+  "ap;": "\u2248",
+  "apE;": "\u2a70",
+  "apacir;": "\u2a6f",
+  "ape;": "\u224a",
+  "apid;": "\u224b",
+  "apos;": "'",
+  "approx;": "\u2248",
+  "approxeq;": "\u224a",
+  "aring": "\xe5",
+  "aring;": "\xe5",
+  "ascr;": "\u{01d4b6}",
+  "ast;": "*",
+  "asymp;": "\u2248",
+  "asympeq;": "\u224d",
+  "atilde": "\xe3",
+  "atilde;": "\xe3",
+  "auml": "\xe4",
+  "auml;": "\xe4",
+  "awconint;": "\u2233",
+  "awint;": "\u2a11",
+  "bNot;": "\u2aed",
+  "backcong;": "\u224c",
+  "backepsilon;": "\u03f6",
+  "backprime;": "\u2035",
+  "backsim;": "\u223d",
+  "backsimeq;": "\u22cd",
+  "barvee;": "\u22bd",
+  "barwed;": "\u2305",
+  "barwedge;": "\u2305",
+  "bbrk;": "\u23b5",
+  "bbrktbrk;": "\u23b6",
+  "bcong;": "\u224c",
+  "bcy;": "\u0431",
+  "bdquo;": "\u201e",
+  "becaus;": "\u2235",
+  "because;": "\u2235",
+  "bemptyv;": "\u29b0",
+  "bepsi;": "\u03f6",
+  "bernou;": "\u212c",
+  "beta;": "\u03b2",
+  "beth;": "\u2136",
+  "between;": "\u226c",
+  "bfr;": "\u{01d51f}",
+  "bigcap;": "\u22c2",
+  "bigcirc;": "\u25ef",
+  "bigcup;": "\u22c3",
+  "bigodot;": "\u2a00",
+  "bigoplus;": "\u2a01",
+  "bigotimes;": "\u2a02",
+  "bigsqcup;": "\u2a06",
+  "bigstar;": "\u2605",
+  "bigtriangledown;": "\u25bd",
+  "bigtriangleup;": "\u25b3",
+  "biguplus;": "\u2a04",
+  "bigvee;": "\u22c1",
+  "bigwedge;": "\u22c0",
+  "bkarow;": "\u290d",
+  "blacklozenge;": "\u29eb",
+  "blacksquare;": "\u25aa",
+  "blacktriangle;": "\u25b4",
+  "blacktriangledown;": "\u25be",
+  "blacktriangleleft;": "\u25c2",
+  "blacktriangleright;": "\u25b8",
+  "blank;": "\u2423",
+  "blk12;": "\u2592",
+  "blk14;": "\u2591",
+  "blk34;": "\u2593",
+  "block;": "\u2588",
+  "bne;": "=\u20e5",
+  "bnequiv;": "\u2261\u20e5",
+  "bnot;": "\u2310",
+  "bopf;": "\u{01d553}",
+  "bot;": "\u22a5",
+  "bottom;": "\u22a5",
+  "bowtie;": "\u22c8",
+  "boxDL;": "\u2557",
+  "boxDR;": "\u2554",
+  "boxDl;": "\u2556",
+  "boxDr;": "\u2553",
+  "boxH;": "\u2550",
+  "boxHD;": "\u2566",
+  "boxHU;": "\u2569",
+  "boxHd;": "\u2564",
+  "boxHu;": "\u2567",
+  "boxUL;": "\u255d",
+  "boxUR;": "\u255a",
+  "boxUl;": "\u255c",
+  "boxUr;": "\u2559",
+  "boxV;": "\u2551",
+  "boxVH;": "\u256c",
+  "boxVL;": "\u2563",
+  "boxVR;": "\u2560",
+  "boxVh;": "\u256b",
+  "boxVl;": "\u2562",
+  "boxVr;": "\u255f",
+  "boxbox;": "\u29c9",
+  "boxdL;": "\u2555",
+  "boxdR;": "\u2552",
+  "boxdl;": "\u2510",
+  "boxdr;": "\u250c",
+  "boxh;": "\u2500",
+  "boxhD;": "\u2565",
+  "boxhU;": "\u2568",
+  "boxhd;": "\u252c",
+  "boxhu;": "\u2534",
+  "boxminus;": "\u229f",
+  "boxplus;": "\u229e",
+  "boxtimes;": "\u22a0",
+  "boxuL;": "\u255b",
+  "boxuR;": "\u2558",
+  "boxul;": "\u2518",
+  "boxur;": "\u2514",
+  "boxv;": "\u2502",
+  "boxvH;": "\u256a",
+  "boxvL;": "\u2561",
+  "boxvR;": "\u255e",
+  "boxvh;": "\u253c",
+  "boxvl;": "\u2524",
+  "boxvr;": "\u251c",
+  "bprime;": "\u2035",
+  "breve;": "\u02d8",
+  "brvbar": "\xa6",
+  "brvbar;": "\xa6",
+  "bscr;": "\u{01d4b7}",
+  "bsemi;": "\u204f",
+  "bsim;": "\u223d",
+  "bsime;": "\u22cd",
+  "bsol;": "\\",
+  "bsolb;": "\u29c5",
+  "bsolhsub;": "\u27c8",
+  "bull;": "\u2022",
+  "bullet;": "\u2022",
+  "bump;": "\u224e",
+  "bumpE;": "\u2aae",
+  "bumpe;": "\u224f",
+  "bumpeq;": "\u224f",
+  "cacute;": "\u0107",
+  "cap;": "\u2229",
+  "capand;": "\u2a44",
+  "capbrcup;": "\u2a49",
+  "capcap;": "\u2a4b",
+  "capcup;": "\u2a47",
+  "capdot;": "\u2a40",
+  "caps;": "\u2229\ufe00",
+  "caret;": "\u2041",
+  "caron;": "\u02c7",
+  "ccaps;": "\u2a4d",
+  "ccaron;": "\u010d",
+  "ccedil": "\xe7",
+  "ccedil;": "\xe7",
+  "ccirc;": "\u0109",
+  "ccups;": "\u2a4c",
+  "ccupssm;": "\u2a50",
+  "cdot;": "\u010b",
+  "cedil": "\xb8",
+  "cedil;": "\xb8",
+  "cemptyv;": "\u29b2",
+  "cent": "\xa2",
+  "cent;": "\xa2",
+  "centerdot;": "\xb7",
+  "cfr;": "\u{01d520}",
+  "chcy;": "\u0447",
+  "check;": "\u2713",
+  "checkmark;": "\u2713",
+  "chi;": "\u03c7",
+  "cir;": "\u25cb",
+  "cirE;": "\u29c3",
+  "circ;": "\u02c6",
+  "circeq;": "\u2257",
+  "circlearrowleft;": "\u21ba",
+  "circlearrowright;": "\u21bb",
+  "circledR;": "\xae",
+  "circledS;": "\u24c8",
+  "circledast;": "\u229b",
+  "circledcirc;": "\u229a",
+  "circleddash;": "\u229d",
+  "cire;": "\u2257",
+  "cirfnint;": "\u2a10",
+  "cirmid;": "\u2aef",
+  "cirscir;": "\u29c2",
+  "clubs;": "\u2663",
+  "clubsuit;": "\u2663",
+  "colon;": ":",
+  "colone;": "\u2254",
+  "coloneq;": "\u2254",
+  "comma;": ",",
+  "commat;": "@",
+  "comp;": "\u2201",
+  "compfn;": "\u2218",
+  "complement;": "\u2201",
+  "complexes;": "\u2102",
+  "cong;": "\u2245",
+  "congdot;": "\u2a6d",
+  "conint;": "\u222e",
+  "copf;": "\u{01d554}",
+  "coprod;": "\u2210",
+  "copy": "\xa9",
+  "copy;": "\xa9",
+  "copysr;": "\u2117",
+  "crarr;": "\u21b5",
+  "cross;": "\u2717",
+  "cscr;": "\u{01d4b8}",
+  "csub;": "\u2acf",
+  "csube;": "\u2ad1",
+  "csup;": "\u2ad0",
+  "csupe;": "\u2ad2",
+  "ctdot;": "\u22ef",
+  "cudarrl;": "\u2938",
+  "cudarrr;": "\u2935",
+  "cuepr;": "\u22de",
+  "cuesc;": "\u22df",
+  "cularr;": "\u21b6",
+  "cularrp;": "\u293d",
+  "cup;": "\u222a",
+  "cupbrcap;": "\u2a48",
+  "cupcap;": "\u2a46",
+  "cupcup;": "\u2a4a",
+  "cupdot;": "\u228d",
+  "cupor;": "\u2a45",
+  "cups;": "\u222a\ufe00",
+  "curarr;": "\u21b7",
+  "curarrm;": "\u293c",
+  "curlyeqprec;": "\u22de",
+  "curlyeqsucc;": "\u22df",
+  "curlyvee;": "\u22ce",
+  "curlywedge;": "\u22cf",
+  "curren": "\xa4",
+  "curren;": "\xa4",
+  "curvearrowleft;": "\u21b6",
+  "curvearrowright;": "\u21b7",
+  "cuvee;": "\u22ce",
+  "cuwed;": "\u22cf",
+  "cwconint;": "\u2232",
+  "cwint;": "\u2231",
+  "cylcty;": "\u232d",
+  "dArr;": "\u21d3",
+  "dHar;": "\u2965",
+  "dagger;": "\u2020",
+  "daleth;": "\u2138",
+  "darr;": "\u2193",
+  "dash;": "\u2010",
+  "dashv;": "\u22a3",
+  "dbkarow;": "\u290f",
+  "dblac;": "\u02dd",
+  "dcaron;": "\u010f",
+  "dcy;": "\u0434",
+  "dd;": "\u2146",
+  "ddagger;": "\u2021",
+  "ddarr;": "\u21ca",
+  "ddotseq;": "\u2a77",
+  "deg": "\xb0",
+  "deg;": "\xb0",
+  "delta;": "\u03b4",
+  "demptyv;": "\u29b1",
+  "dfisht;": "\u297f",
+  "dfr;": "\u{01d521}",
+  "dharl;": "\u21c3",
+  "dharr;": "\u21c2",
+  "diam;": "\u22c4",
+  "diamond;": "\u22c4",
+  "diamondsuit;": "\u2666",
+  "diams;": "\u2666",
+  "die;": "\xa8",
+  "digamma;": "\u03dd",
+  "disin;": "\u22f2",
+  "div;": "\xf7",
+  "divide": "\xf7",
+  "divide;": "\xf7",
+  "divideontimes;": "\u22c7",
+  "divonx;": "\u22c7",
+  "djcy;": "\u0452",
+  "dlcorn;": "\u231e",
+  "dlcrop;": "\u230d",
+  "dollar;": "\$",
+  "dopf;": "\u{01d555}",
+  "dot;": "\u02d9",
+  "doteq;": "\u2250",
+  "doteqdot;": "\u2251",
+  "dotminus;": "\u2238",
+  "dotplus;": "\u2214",
+  "dotsquare;": "\u22a1",
+  "doublebarwedge;": "\u2306",
+  "downarrow;": "\u2193",
+  "downdownarrows;": "\u21ca",
+  "downharpoonleft;": "\u21c3",
+  "downharpoonright;": "\u21c2",
+  "drbkarow;": "\u2910",
+  "drcorn;": "\u231f",
+  "drcrop;": "\u230c",
+  "dscr;": "\u{01d4b9}",
+  "dscy;": "\u0455",
+  "dsol;": "\u29f6",
+  "dstrok;": "\u0111",
+  "dtdot;": "\u22f1",
+  "dtri;": "\u25bf",
+  "dtrif;": "\u25be",
+  "duarr;": "\u21f5",
+  "duhar;": "\u296f",
+  "dwangle;": "\u29a6",
+  "dzcy;": "\u045f",
+  "dzigrarr;": "\u27ff",
+  "eDDot;": "\u2a77",
+  "eDot;": "\u2251",
+  "eacute": "\xe9",
+  "eacute;": "\xe9",
+  "easter;": "\u2a6e",
+  "ecaron;": "\u011b",
+  "ecir;": "\u2256",
+  "ecirc": "\xea",
+  "ecirc;": "\xea",
+  "ecolon;": "\u2255",
+  "ecy;": "\u044d",
+  "edot;": "\u0117",
+  "ee;": "\u2147",
+  "efDot;": "\u2252",
+  "efr;": "\u{01d522}",
+  "eg;": "\u2a9a",
+  "egrave": "\xe8",
+  "egrave;": "\xe8",
+  "egs;": "\u2a96",
+  "egsdot;": "\u2a98",
+  "el;": "\u2a99",
+  "elinters;": "\u23e7",
+  "ell;": "\u2113",
+  "els;": "\u2a95",
+  "elsdot;": "\u2a97",
+  "emacr;": "\u0113",
+  "empty;": "\u2205",
+  "emptyset;": "\u2205",
+  "emptyv;": "\u2205",
+  "emsp13;": "\u2004",
+  "emsp14;": "\u2005",
+  "emsp;": "\u2003",
+  "eng;": "\u014b",
+  "ensp;": "\u2002",
+  "eogon;": "\u0119",
+  "eopf;": "\u{01d556}",
+  "epar;": "\u22d5",
+  "eparsl;": "\u29e3",
+  "eplus;": "\u2a71",
+  "epsi;": "\u03b5",
+  "epsilon;": "\u03b5",
+  "epsiv;": "\u03f5",
+  "eqcirc;": "\u2256",
+  "eqcolon;": "\u2255",
+  "eqsim;": "\u2242",
+  "eqslantgtr;": "\u2a96",
+  "eqslantless;": "\u2a95",
+  "equals;": "=",
+  "equest;": "\u225f",
+  "equiv;": "\u2261",
+  "equivDD;": "\u2a78",
+  "eqvparsl;": "\u29e5",
+  "erDot;": "\u2253",
+  "erarr;": "\u2971",
+  "escr;": "\u212f",
+  "esdot;": "\u2250",
+  "esim;": "\u2242",
+  "eta;": "\u03b7",
+  "eth": "\xf0",
+  "eth;": "\xf0",
+  "euml": "\xeb",
+  "euml;": "\xeb",
+  "euro;": "\u20ac",
+  "excl;": "!",
+  "exist;": "\u2203",
+  "expectation;": "\u2130",
+  "exponentiale;": "\u2147",
+  "fallingdotseq;": "\u2252",
+  "fcy;": "\u0444",
+  "female;": "\u2640",
+  "ffilig;": "\ufb03",
+  "fflig;": "\ufb00",
+  "ffllig;": "\ufb04",
+  "ffr;": "\u{01d523}",
+  "filig;": "\ufb01",
+  "fjlig;": "fj",
+  "flat;": "\u266d",
+  "fllig;": "\ufb02",
+  "fltns;": "\u25b1",
+  "fnof;": "\u0192",
+  "fopf;": "\u{01d557}",
+  "forall;": "\u2200",
+  "fork;": "\u22d4",
+  "forkv;": "\u2ad9",
+  "fpartint;": "\u2a0d",
+  "frac12": "\xbd",
+  "frac12;": "\xbd",
+  "frac13;": "\u2153",
+  "frac14": "\xbc",
+  "frac14;": "\xbc",
+  "frac15;": "\u2155",
+  "frac16;": "\u2159",
+  "frac18;": "\u215b",
+  "frac23;": "\u2154",
+  "frac25;": "\u2156",
+  "frac34": "\xbe",
+  "frac34;": "\xbe",
+  "frac35;": "\u2157",
+  "frac38;": "\u215c",
+  "frac45;": "\u2158",
+  "frac56;": "\u215a",
+  "frac58;": "\u215d",
+  "frac78;": "\u215e",
+  "frasl;": "\u2044",
+  "frown;": "\u2322",
+  "fscr;": "\u{01d4bb}",
+  "gE;": "\u2267",
+  "gEl;": "\u2a8c",
+  "gacute;": "\u01f5",
+  "gamma;": "\u03b3",
+  "gammad;": "\u03dd",
+  "gap;": "\u2a86",
+  "gbreve;": "\u011f",
+  "gcirc;": "\u011d",
+  "gcy;": "\u0433",
+  "gdot;": "\u0121",
+  "ge;": "\u2265",
+  "gel;": "\u22db",
+  "geq;": "\u2265",
+  "geqq;": "\u2267",
+  "geqslant;": "\u2a7e",
+  "ges;": "\u2a7e",
+  "gescc;": "\u2aa9",
+  "gesdot;": "\u2a80",
+  "gesdoto;": "\u2a82",
+  "gesdotol;": "\u2a84",
+  "gesl;": "\u22db\ufe00",
+  "gesles;": "\u2a94",
+  "gfr;": "\u{01d524}",
+  "gg;": "\u226b",
+  "ggg;": "\u22d9",
+  "gimel;": "\u2137",
+  "gjcy;": "\u0453",
+  "gl;": "\u2277",
+  "glE;": "\u2a92",
+  "gla;": "\u2aa5",
+  "glj;": "\u2aa4",
+  "gnE;": "\u2269",
+  "gnap;": "\u2a8a",
+  "gnapprox;": "\u2a8a",
+  "gne;": "\u2a88",
+  "gneq;": "\u2a88",
+  "gneqq;": "\u2269",
+  "gnsim;": "\u22e7",
+  "gopf;": "\u{01d558}",
+  "grave;": "`",
+  "gscr;": "\u210a",
+  "gsim;": "\u2273",
+  "gsime;": "\u2a8e",
+  "gsiml;": "\u2a90",
+  "gt": ">",
+  "gt;": ">",
+  "gtcc;": "\u2aa7",
+  "gtcir;": "\u2a7a",
+  "gtdot;": "\u22d7",
+  "gtlPar;": "\u2995",
+  "gtquest;": "\u2a7c",
+  "gtrapprox;": "\u2a86",
+  "gtrarr;": "\u2978",
+  "gtrdot;": "\u22d7",
+  "gtreqless;": "\u22db",
+  "gtreqqless;": "\u2a8c",
+  "gtrless;": "\u2277",
+  "gtrsim;": "\u2273",
+  "gvertneqq;": "\u2269\ufe00",
+  "gvnE;": "\u2269\ufe00",
+  "hArr;": "\u21d4",
+  "hairsp;": "\u200a",
+  "half;": "\xbd",
+  "hamilt;": "\u210b",
+  "hardcy;": "\u044a",
+  "harr;": "\u2194",
+  "harrcir;": "\u2948",
+  "harrw;": "\u21ad",
+  "hbar;": "\u210f",
+  "hcirc;": "\u0125",
+  "hearts;": "\u2665",
+  "heartsuit;": "\u2665",
+  "hellip;": "\u2026",
+  "hercon;": "\u22b9",
+  "hfr;": "\u{01d525}",
+  "hksearow;": "\u2925",
+  "hkswarow;": "\u2926",
+  "hoarr;": "\u21ff",
+  "homtht;": "\u223b",
+  "hookleftarrow;": "\u21a9",
+  "hookrightarrow;": "\u21aa",
+  "hopf;": "\u{01d559}",
+  "horbar;": "\u2015",
+  "hscr;": "\u{01d4bd}",
+  "hslash;": "\u210f",
+  "hstrok;": "\u0127",
+  "hybull;": "\u2043",
+  "hyphen;": "\u2010",
+  "iacute": "\xed",
+  "iacute;": "\xed",
+  "ic;": "\u2063",
+  "icirc": "\xee",
+  "icirc;": "\xee",
+  "icy;": "\u0438",
+  "iecy;": "\u0435",
+  "iexcl": "\xa1",
+  "iexcl;": "\xa1",
+  "iff;": "\u21d4",
+  "ifr;": "\u{01d526}",
+  "igrave": "\xec",
+  "igrave;": "\xec",
+  "ii;": "\u2148",
+  "iiiint;": "\u2a0c",
+  "iiint;": "\u222d",
+  "iinfin;": "\u29dc",
+  "iiota;": "\u2129",
+  "ijlig;": "\u0133",
+  "imacr;": "\u012b",
+  "image;": "\u2111",
+  "imagline;": "\u2110",
+  "imagpart;": "\u2111",
+  "imath;": "\u0131",
+  "imof;": "\u22b7",
+  "imped;": "\u01b5",
+  "in;": "\u2208",
+  "incare;": "\u2105",
+  "infin;": "\u221e",
+  "infintie;": "\u29dd",
+  "inodot;": "\u0131",
+  "int;": "\u222b",
+  "intcal;": "\u22ba",
+  "integers;": "\u2124",
+  "intercal;": "\u22ba",
+  "intlarhk;": "\u2a17",
+  "intprod;": "\u2a3c",
+  "iocy;": "\u0451",
+  "iogon;": "\u012f",
+  "iopf;": "\u{01d55a}",
+  "iota;": "\u03b9",
+  "iprod;": "\u2a3c",
+  "iquest": "\xbf",
+  "iquest;": "\xbf",
+  "iscr;": "\u{01d4be}",
+  "isin;": "\u2208",
+  "isinE;": "\u22f9",
+  "isindot;": "\u22f5",
+  "isins;": "\u22f4",
+  "isinsv;": "\u22f3",
+  "isinv;": "\u2208",
+  "it;": "\u2062",
+  "itilde;": "\u0129",
+  "iukcy;": "\u0456",
+  "iuml": "\xef",
+  "iuml;": "\xef",
+  "jcirc;": "\u0135",
+  "jcy;": "\u0439",
+  "jfr;": "\u{01d527}",
+  "jmath;": "\u0237",
+  "jopf;": "\u{01d55b}",
+  "jscr;": "\u{01d4bf}",
+  "jsercy;": "\u0458",
+  "jukcy;": "\u0454",
+  "kappa;": "\u03ba",
+  "kappav;": "\u03f0",
+  "kcedil;": "\u0137",
+  "kcy;": "\u043a",
+  "kfr;": "\u{01d528}",
+  "kgreen;": "\u0138",
+  "khcy;": "\u0445",
+  "kjcy;": "\u045c",
+  "kopf;": "\u{01d55c}",
+  "kscr;": "\u{01d4c0}",
+  "lAarr;": "\u21da",
+  "lArr;": "\u21d0",
+  "lAtail;": "\u291b",
+  "lBarr;": "\u290e",
+  "lE;": "\u2266",
+  "lEg;": "\u2a8b",
+  "lHar;": "\u2962",
+  "lacute;": "\u013a",
+  "laemptyv;": "\u29b4",
+  "lagran;": "\u2112",
+  "lambda;": "\u03bb",
+  "lang;": "\u27e8",
+  "langd;": "\u2991",
+  "langle;": "\u27e8",
+  "lap;": "\u2a85",
+  "laquo": "\xab",
+  "laquo;": "\xab",
+  "larr;": "\u2190",
+  "larrb;": "\u21e4",
+  "larrbfs;": "\u291f",
+  "larrfs;": "\u291d",
+  "larrhk;": "\u21a9",
+  "larrlp;": "\u21ab",
+  "larrpl;": "\u2939",
+  "larrsim;": "\u2973",
+  "larrtl;": "\u21a2",
+  "lat;": "\u2aab",
+  "latail;": "\u2919",
+  "late;": "\u2aad",
+  "lates;": "\u2aad\ufe00",
+  "lbarr;": "\u290c",
+  "lbbrk;": "\u2772",
+  "lbrace;": "{",
+  "lbrack;": "[",
+  "lbrke;": "\u298b",
+  "lbrksld;": "\u298f",
+  "lbrkslu;": "\u298d",
+  "lcaron;": "\u013e",
+  "lcedil;": "\u013c",
+  "lceil;": "\u2308",
+  "lcub;": "{",
+  "lcy;": "\u043b",
+  "ldca;": "\u2936",
+  "ldquo;": "\u201c",
+  "ldquor;": "\u201e",
+  "ldrdhar;": "\u2967",
+  "ldrushar;": "\u294b",
+  "ldsh;": "\u21b2",
+  "le;": "\u2264",
+  "leftarrow;": "\u2190",
+  "leftarrowtail;": "\u21a2",
+  "leftharpoondown;": "\u21bd",
+  "leftharpoonup;": "\u21bc",
+  "leftleftarrows;": "\u21c7",
+  "leftrightarrow;": "\u2194",
+  "leftrightarrows;": "\u21c6",
+  "leftrightharpoons;": "\u21cb",
+  "leftrightsquigarrow;": "\u21ad",
+  "leftthreetimes;": "\u22cb",
+  "leg;": "\u22da",
+  "leq;": "\u2264",
+  "leqq;": "\u2266",
+  "leqslant;": "\u2a7d",
+  "les;": "\u2a7d",
+  "lescc;": "\u2aa8",
+  "lesdot;": "\u2a7f",
+  "lesdoto;": "\u2a81",
+  "lesdotor;": "\u2a83",
+  "lesg;": "\u22da\ufe00",
+  "lesges;": "\u2a93",
+  "lessapprox;": "\u2a85",
+  "lessdot;": "\u22d6",
+  "lesseqgtr;": "\u22da",
+  "lesseqqgtr;": "\u2a8b",
+  "lessgtr;": "\u2276",
+  "lesssim;": "\u2272",
+  "lfisht;": "\u297c",
+  "lfloor;": "\u230a",
+  "lfr;": "\u{01d529}",
+  "lg;": "\u2276",
+  "lgE;": "\u2a91",
+  "lhard;": "\u21bd",
+  "lharu;": "\u21bc",
+  "lharul;": "\u296a",
+  "lhblk;": "\u2584",
+  "ljcy;": "\u0459",
+  "ll;": "\u226a",
+  "llarr;": "\u21c7",
+  "llcorner;": "\u231e",
+  "llhard;": "\u296b",
+  "lltri;": "\u25fa",
+  "lmidot;": "\u0140",
+  "lmoust;": "\u23b0",
+  "lmoustache;": "\u23b0",
+  "lnE;": "\u2268",
+  "lnap;": "\u2a89",
+  "lnapprox;": "\u2a89",
+  "lne;": "\u2a87",
+  "lneq;": "\u2a87",
+  "lneqq;": "\u2268",
+  "lnsim;": "\u22e6",
+  "loang;": "\u27ec",
+  "loarr;": "\u21fd",
+  "lobrk;": "\u27e6",
+  "longleftarrow;": "\u27f5",
+  "longleftrightarrow;": "\u27f7",
+  "longmapsto;": "\u27fc",
+  "longrightarrow;": "\u27f6",
+  "looparrowleft;": "\u21ab",
+  "looparrowright;": "\u21ac",
+  "lopar;": "\u2985",
+  "lopf;": "\u{01d55d}",
+  "loplus;": "\u2a2d",
+  "lotimes;": "\u2a34",
+  "lowast;": "\u2217",
+  "lowbar;": "_",
+  "loz;": "\u25ca",
+  "lozenge;": "\u25ca",
+  "lozf;": "\u29eb",
+  "lpar;": "(",
+  "lparlt;": "\u2993",
+  "lrarr;": "\u21c6",
+  "lrcorner;": "\u231f",
+  "lrhar;": "\u21cb",
+  "lrhard;": "\u296d",
+  "lrm;": "\u200e",
+  "lrtri;": "\u22bf",
+  "lsaquo;": "\u2039",
+  "lscr;": "\u{01d4c1}",
+  "lsh;": "\u21b0",
+  "lsim;": "\u2272",
+  "lsime;": "\u2a8d",
+  "lsimg;": "\u2a8f",
+  "lsqb;": "[",
+  "lsquo;": "\u2018",
+  "lsquor;": "\u201a",
+  "lstrok;": "\u0142",
+  "lt": "<",
+  "lt;": "<",
+  "ltcc;": "\u2aa6",
+  "ltcir;": "\u2a79",
+  "ltdot;": "\u22d6",
+  "lthree;": "\u22cb",
+  "ltimes;": "\u22c9",
+  "ltlarr;": "\u2976",
+  "ltquest;": "\u2a7b",
+  "ltrPar;": "\u2996",
+  "ltri;": "\u25c3",
+  "ltrie;": "\u22b4",
+  "ltrif;": "\u25c2",
+  "lurdshar;": "\u294a",
+  "luruhar;": "\u2966",
+  "lvertneqq;": "\u2268\ufe00",
+  "lvnE;": "\u2268\ufe00",
+  "mDDot;": "\u223a",
+  "macr": "\xaf",
+  "macr;": "\xaf",
+  "male;": "\u2642",
+  "malt;": "\u2720",
+  "maltese;": "\u2720",
+  "map;": "\u21a6",
+  "mapsto;": "\u21a6",
+  "mapstodown;": "\u21a7",
+  "mapstoleft;": "\u21a4",
+  "mapstoup;": "\u21a5",
+  "marker;": "\u25ae",
+  "mcomma;": "\u2a29",
+  "mcy;": "\u043c",
+  "mdash;": "\u2014",
+  "measuredangle;": "\u2221",
+  "mfr;": "\u{01d52a}",
+  "mho;": "\u2127",
+  "micro": "\xb5",
+  "micro;": "\xb5",
+  "mid;": "\u2223",
+  "midast;": "*",
+  "midcir;": "\u2af0",
+  "middot": "\xb7",
+  "middot;": "\xb7",
+  "minus;": "\u2212",
+  "minusb;": "\u229f",
+  "minusd;": "\u2238",
+  "minusdu;": "\u2a2a",
+  "mlcp;": "\u2adb",
+  "mldr;": "\u2026",
+  "mnplus;": "\u2213",
+  "models;": "\u22a7",
+  "mopf;": "\u{01d55e}",
+  "mp;": "\u2213",
+  "mscr;": "\u{01d4c2}",
+  "mstpos;": "\u223e",
+  "mu;": "\u03bc",
+  "multimap;": "\u22b8",
+  "mumap;": "\u22b8",
+  "nGg;": "\u22d9\u0338",
+  "nGt;": "\u226b\u20d2",
+  "nGtv;": "\u226b\u0338",
+  "nLeftarrow;": "\u21cd",
+  "nLeftrightarrow;": "\u21ce",
+  "nLl;": "\u22d8\u0338",
+  "nLt;": "\u226a\u20d2",
+  "nLtv;": "\u226a\u0338",
+  "nRightarrow;": "\u21cf",
+  "nVDash;": "\u22af",
+  "nVdash;": "\u22ae",
+  "nabla;": "\u2207",
+  "nacute;": "\u0144",
+  "nang;": "\u2220\u20d2",
+  "nap;": "\u2249",
+  "napE;": "\u2a70\u0338",
+  "napid;": "\u224b\u0338",
+  "napos;": "\u0149",
+  "napprox;": "\u2249",
+  "natur;": "\u266e",
+  "natural;": "\u266e",
+  "naturals;": "\u2115",
+  "nbsp": "\xa0",
+  "nbsp;": "\xa0",
+  "nbump;": "\u224e\u0338",
+  "nbumpe;": "\u224f\u0338",
+  "ncap;": "\u2a43",
+  "ncaron;": "\u0148",
+  "ncedil;": "\u0146",
+  "ncong;": "\u2247",
+  "ncongdot;": "\u2a6d\u0338",
+  "ncup;": "\u2a42",
+  "ncy;": "\u043d",
+  "ndash;": "\u2013",
+  "ne;": "\u2260",
+  "neArr;": "\u21d7",
+  "nearhk;": "\u2924",
+  "nearr;": "\u2197",
+  "nearrow;": "\u2197",
+  "nedot;": "\u2250\u0338",
+  "nequiv;": "\u2262",
+  "nesear;": "\u2928",
+  "nesim;": "\u2242\u0338",
+  "nexist;": "\u2204",
+  "nexists;": "\u2204",
+  "nfr;": "\u{01d52b}",
+  "ngE;": "\u2267\u0338",
+  "nge;": "\u2271",
+  "ngeq;": "\u2271",
+  "ngeqq;": "\u2267\u0338",
+  "ngeqslant;": "\u2a7e\u0338",
+  "nges;": "\u2a7e\u0338",
+  "ngsim;": "\u2275",
+  "ngt;": "\u226f",
+  "ngtr;": "\u226f",
+  "nhArr;": "\u21ce",
+  "nharr;": "\u21ae",
+  "nhpar;": "\u2af2",
+  "ni;": "\u220b",
+  "nis;": "\u22fc",
+  "nisd;": "\u22fa",
+  "niv;": "\u220b",
+  "njcy;": "\u045a",
+  "nlArr;": "\u21cd",
+  "nlE;": "\u2266\u0338",
+  "nlarr;": "\u219a",
+  "nldr;": "\u2025",
+  "nle;": "\u2270",
+  "nleftarrow;": "\u219a",
+  "nleftrightarrow;": "\u21ae",
+  "nleq;": "\u2270",
+  "nleqq;": "\u2266\u0338",
+  "nleqslant;": "\u2a7d\u0338",
+  "nles;": "\u2a7d\u0338",
+  "nless;": "\u226e",
+  "nlsim;": "\u2274",
+  "nlt;": "\u226e",
+  "nltri;": "\u22ea",
+  "nltrie;": "\u22ec",
+  "nmid;": "\u2224",
+  "nopf;": "\u{01d55f}",
+  "not": "\xac",
+  "not;": "\xac",
+  "notin;": "\u2209",
+  "notinE;": "\u22f9\u0338",
+  "notindot;": "\u22f5\u0338",
+  "notinva;": "\u2209",
+  "notinvb;": "\u22f7",
+  "notinvc;": "\u22f6",
+  "notni;": "\u220c",
+  "notniva;": "\u220c",
+  "notnivb;": "\u22fe",
+  "notnivc;": "\u22fd",
+  "npar;": "\u2226",
+  "nparallel;": "\u2226",
+  "nparsl;": "\u2afd\u20e5",
+  "npart;": "\u2202\u0338",
+  "npolint;": "\u2a14",
+  "npr;": "\u2280",
+  "nprcue;": "\u22e0",
+  "npre;": "\u2aaf\u0338",
+  "nprec;": "\u2280",
+  "npreceq;": "\u2aaf\u0338",
+  "nrArr;": "\u21cf",
+  "nrarr;": "\u219b",
+  "nrarrc;": "\u2933\u0338",
+  "nrarrw;": "\u219d\u0338",
+  "nrightarrow;": "\u219b",
+  "nrtri;": "\u22eb",
+  "nrtrie;": "\u22ed",
+  "nsc;": "\u2281",
+  "nsccue;": "\u22e1",
+  "nsce;": "\u2ab0\u0338",
+  "nscr;": "\u{01d4c3}",
+  "nshortmid;": "\u2224",
+  "nshortparallel;": "\u2226",
+  "nsim;": "\u2241",
+  "nsime;": "\u2244",
+  "nsimeq;": "\u2244",
+  "nsmid;": "\u2224",
+  "nspar;": "\u2226",
+  "nsqsube;": "\u22e2",
+  "nsqsupe;": "\u22e3",
+  "nsub;": "\u2284",
+  "nsubE;": "\u2ac5\u0338",
+  "nsube;": "\u2288",
+  "nsubset;": "\u2282\u20d2",
+  "nsubseteq;": "\u2288",
+  "nsubseteqq;": "\u2ac5\u0338",
+  "nsucc;": "\u2281",
+  "nsucceq;": "\u2ab0\u0338",
+  "nsup;": "\u2285",
+  "nsupE;": "\u2ac6\u0338",
+  "nsupe;": "\u2289",
+  "nsupset;": "\u2283\u20d2",
+  "nsupseteq;": "\u2289",
+  "nsupseteqq;": "\u2ac6\u0338",
+  "ntgl;": "\u2279",
+  "ntilde": "\xf1",
+  "ntilde;": "\xf1",
+  "ntlg;": "\u2278",
+  "ntriangleleft;": "\u22ea",
+  "ntrianglelefteq;": "\u22ec",
+  "ntriangleright;": "\u22eb",
+  "ntrianglerighteq;": "\u22ed",
+  "nu;": "\u03bd",
+  "num;": "#",
+  "numero;": "\u2116",
+  "numsp;": "\u2007",
+  "nvDash;": "\u22ad",
+  "nvHarr;": "\u2904",
+  "nvap;": "\u224d\u20d2",
+  "nvdash;": "\u22ac",
+  "nvge;": "\u2265\u20d2",
+  "nvgt;": ">\u20d2",
+  "nvinfin;": "\u29de",
+  "nvlArr;": "\u2902",
+  "nvle;": "\u2264\u20d2",
+  "nvlt;": "<\u20d2",
+  "nvltrie;": "\u22b4\u20d2",
+  "nvrArr;": "\u2903",
+  "nvrtrie;": "\u22b5\u20d2",
+  "nvsim;": "\u223c\u20d2",
+  "nwArr;": "\u21d6",
+  "nwarhk;": "\u2923",
+  "nwarr;": "\u2196",
+  "nwarrow;": "\u2196",
+  "nwnear;": "\u2927",
+  "oS;": "\u24c8",
+  "oacute": "\xf3",
+  "oacute;": "\xf3",
+  "oast;": "\u229b",
+  "ocir;": "\u229a",
+  "ocirc": "\xf4",
+  "ocirc;": "\xf4",
+  "ocy;": "\u043e",
+  "odash;": "\u229d",
+  "odblac;": "\u0151",
+  "odiv;": "\u2a38",
+  "odot;": "\u2299",
+  "odsold;": "\u29bc",
+  "oelig;": "\u0153",
+  "ofcir;": "\u29bf",
+  "ofr;": "\u{01d52c}",
+  "ogon;": "\u02db",
+  "ograve": "\xf2",
+  "ograve;": "\xf2",
+  "ogt;": "\u29c1",
+  "ohbar;": "\u29b5",
+  "ohm;": "\u03a9",
+  "oint;": "\u222e",
+  "olarr;": "\u21ba",
+  "olcir;": "\u29be",
+  "olcross;": "\u29bb",
+  "oline;": "\u203e",
+  "olt;": "\u29c0",
+  "omacr;": "\u014d",
+  "omega;": "\u03c9",
+  "omicron;": "\u03bf",
+  "omid;": "\u29b6",
+  "ominus;": "\u2296",
+  "oopf;": "\u{01d560}",
+  "opar;": "\u29b7",
+  "operp;": "\u29b9",
+  "oplus;": "\u2295",
+  "or;": "\u2228",
+  "orarr;": "\u21bb",
+  "ord;": "\u2a5d",
+  "order;": "\u2134",
+  "orderof;": "\u2134",
+  "ordf": "\xaa",
+  "ordf;": "\xaa",
+  "ordm": "\xba",
+  "ordm;": "\xba",
+  "origof;": "\u22b6",
+  "oror;": "\u2a56",
+  "orslope;": "\u2a57",
+  "orv;": "\u2a5b",
+  "oscr;": "\u2134",
+  "oslash": "\xf8",
+  "oslash;": "\xf8",
+  "osol;": "\u2298",
+  "otilde": "\xf5",
+  "otilde;": "\xf5",
+  "otimes;": "\u2297",
+  "otimesas;": "\u2a36",
+  "ouml": "\xf6",
+  "ouml;": "\xf6",
+  "ovbar;": "\u233d",
+  "par;": "\u2225",
+  "para": "\xb6",
+  "para;": "\xb6",
+  "parallel;": "\u2225",
+  "parsim;": "\u2af3",
+  "parsl;": "\u2afd",
+  "part;": "\u2202",
+  "pcy;": "\u043f",
+  "percnt;": "%",
+  "period;": ".",
+  "permil;": "\u2030",
+  "perp;": "\u22a5",
+  "pertenk;": "\u2031",
+  "pfr;": "\u{01d52d}",
+  "phi;": "\u03c6",
+  "phiv;": "\u03d5",
+  "phmmat;": "\u2133",
+  "phone;": "\u260e",
+  "pi;": "\u03c0",
+  "pitchfork;": "\u22d4",
+  "piv;": "\u03d6",
+  "planck;": "\u210f",
+  "planckh;": "\u210e",
+  "plankv;": "\u210f",
+  "plus;": "+",
+  "plusacir;": "\u2a23",
+  "plusb;": "\u229e",
+  "pluscir;": "\u2a22",
+  "plusdo;": "\u2214",
+  "plusdu;": "\u2a25",
+  "pluse;": "\u2a72",
+  "plusmn": "\xb1",
+  "plusmn;": "\xb1",
+  "plussim;": "\u2a26",
+  "plustwo;": "\u2a27",
+  "pm;": "\xb1",
+  "pointint;": "\u2a15",
+  "popf;": "\u{01d561}",
+  "pound": "\xa3",
+  "pound;": "\xa3",
+  "pr;": "\u227a",
+  "prE;": "\u2ab3",
+  "prap;": "\u2ab7",
+  "prcue;": "\u227c",
+  "pre;": "\u2aaf",
+  "prec;": "\u227a",
+  "precapprox;": "\u2ab7",
+  "preccurlyeq;": "\u227c",
+  "preceq;": "\u2aaf",
+  "precnapprox;": "\u2ab9",
+  "precneqq;": "\u2ab5",
+  "precnsim;": "\u22e8",
+  "precsim;": "\u227e",
+  "prime;": "\u2032",
+  "primes;": "\u2119",
+  "prnE;": "\u2ab5",
+  "prnap;": "\u2ab9",
+  "prnsim;": "\u22e8",
+  "prod;": "\u220f",
+  "profalar;": "\u232e",
+  "profline;": "\u2312",
+  "profsurf;": "\u2313",
+  "prop;": "\u221d",
+  "propto;": "\u221d",
+  "prsim;": "\u227e",
+  "prurel;": "\u22b0",
+  "pscr;": "\u{01d4c5}",
+  "psi;": "\u03c8",
+  "puncsp;": "\u2008",
+  "qfr;": "\u{01d52e}",
+  "qint;": "\u2a0c",
+  "qopf;": "\u{01d562}",
+  "qprime;": "\u2057",
+  "qscr;": "\u{01d4c6}",
+  "quaternions;": "\u210d",
+  "quatint;": "\u2a16",
+  "quest;": "?",
+  "questeq;": "\u225f",
+  "quot": "\"",
+  "quot;": "\"",
+  "rAarr;": "\u21db",
+  "rArr;": "\u21d2",
+  "rAtail;": "\u291c",
+  "rBarr;": "\u290f",
+  "rHar;": "\u2964",
+  "race;": "\u223d\u0331",
+  "racute;": "\u0155",
+  "radic;": "\u221a",
+  "raemptyv;": "\u29b3",
+  "rang;": "\u27e9",
+  "rangd;": "\u2992",
+  "range;": "\u29a5",
+  "rangle;": "\u27e9",
+  "raquo": "\xbb",
+  "raquo;": "\xbb",
+  "rarr;": "\u2192",
+  "rarrap;": "\u2975",
+  "rarrb;": "\u21e5",
+  "rarrbfs;": "\u2920",
+  "rarrc;": "\u2933",
+  "rarrfs;": "\u291e",
+  "rarrhk;": "\u21aa",
+  "rarrlp;": "\u21ac",
+  "rarrpl;": "\u2945",
+  "rarrsim;": "\u2974",
+  "rarrtl;": "\u21a3",
+  "rarrw;": "\u219d",
+  "ratail;": "\u291a",
+  "ratio;": "\u2236",
+  "rationals;": "\u211a",
+  "rbarr;": "\u290d",
+  "rbbrk;": "\u2773",
+  "rbrace;": "}",
+  "rbrack;": "]",
+  "rbrke;": "\u298c",
+  "rbrksld;": "\u298e",
+  "rbrkslu;": "\u2990",
+  "rcaron;": "\u0159",
+  "rcedil;": "\u0157",
+  "rceil;": "\u2309",
+  "rcub;": "}",
+  "rcy;": "\u0440",
+  "rdca;": "\u2937",
+  "rdldhar;": "\u2969",
+  "rdquo;": "\u201d",
+  "rdquor;": "\u201d",
+  "rdsh;": "\u21b3",
+  "real;": "\u211c",
+  "realine;": "\u211b",
+  "realpart;": "\u211c",
+  "reals;": "\u211d",
+  "rect;": "\u25ad",
+  "reg": "\xae",
+  "reg;": "\xae",
+  "rfisht;": "\u297d",
+  "rfloor;": "\u230b",
+  "rfr;": "\u{01d52f}",
+  "rhard;": "\u21c1",
+  "rharu;": "\u21c0",
+  "rharul;": "\u296c",
+  "rho;": "\u03c1",
+  "rhov;": "\u03f1",
+  "rightarrow;": "\u2192",
+  "rightarrowtail;": "\u21a3",
+  "rightharpoondown;": "\u21c1",
+  "rightharpoonup;": "\u21c0",
+  "rightleftarrows;": "\u21c4",
+  "rightleftharpoons;": "\u21cc",
+  "rightrightarrows;": "\u21c9",
+  "rightsquigarrow;": "\u219d",
+  "rightthreetimes;": "\u22cc",
+  "ring;": "\u02da",
+  "risingdotseq;": "\u2253",
+  "rlarr;": "\u21c4",
+  "rlhar;": "\u21cc",
+  "rlm;": "\u200f",
+  "rmoust;": "\u23b1",
+  "rmoustache;": "\u23b1",
+  "rnmid;": "\u2aee",
+  "roang;": "\u27ed",
+  "roarr;": "\u21fe",
+  "robrk;": "\u27e7",
+  "ropar;": "\u2986",
+  "ropf;": "\u{01d563}",
+  "roplus;": "\u2a2e",
+  "rotimes;": "\u2a35",
+  "rpar;": ")",
+  "rpargt;": "\u2994",
+  "rppolint;": "\u2a12",
+  "rrarr;": "\u21c9",
+  "rsaquo;": "\u203a",
+  "rscr;": "\u{01d4c7}",
+  "rsh;": "\u21b1",
+  "rsqb;": "]",
+  "rsquo;": "\u2019",
+  "rsquor;": "\u2019",
+  "rthree;": "\u22cc",
+  "rtimes;": "\u22ca",
+  "rtri;": "\u25b9",
+  "rtrie;": "\u22b5",
+  "rtrif;": "\u25b8",
+  "rtriltri;": "\u29ce",
+  "ruluhar;": "\u2968",
+  "rx;": "\u211e",
+  "sacute;": "\u015b",
+  "sbquo;": "\u201a",
+  "sc;": "\u227b",
+  "scE;": "\u2ab4",
+  "scap;": "\u2ab8",
+  "scaron;": "\u0161",
+  "sccue;": "\u227d",
+  "sce;": "\u2ab0",
+  "scedil;": "\u015f",
+  "scirc;": "\u015d",
+  "scnE;": "\u2ab6",
+  "scnap;": "\u2aba",
+  "scnsim;": "\u22e9",
+  "scpolint;": "\u2a13",
+  "scsim;": "\u227f",
+  "scy;": "\u0441",
+  "sdot;": "\u22c5",
+  "sdotb;": "\u22a1",
+  "sdote;": "\u2a66",
+  "seArr;": "\u21d8",
+  "searhk;": "\u2925",
+  "searr;": "\u2198",
+  "searrow;": "\u2198",
+  "sect": "\xa7",
+  "sect;": "\xa7",
+  "semi;": ";",
+  "seswar;": "\u2929",
+  "setminus;": "\u2216",
+  "setmn;": "\u2216",
+  "sext;": "\u2736",
+  "sfr;": "\u{01d530}",
+  "sfrown;": "\u2322",
+  "sharp;": "\u266f",
+  "shchcy;": "\u0449",
+  "shcy;": "\u0448",
+  "shortmid;": "\u2223",
+  "shortparallel;": "\u2225",
+  "shy": "\xad",
+  "shy;": "\xad",
+  "sigma;": "\u03c3",
+  "sigmaf;": "\u03c2",
+  "sigmav;": "\u03c2",
+  "sim;": "\u223c",
+  "simdot;": "\u2a6a",
+  "sime;": "\u2243",
+  "simeq;": "\u2243",
+  "simg;": "\u2a9e",
+  "simgE;": "\u2aa0",
+  "siml;": "\u2a9d",
+  "simlE;": "\u2a9f",
+  "simne;": "\u2246",
+  "simplus;": "\u2a24",
+  "simrarr;": "\u2972",
+  "slarr;": "\u2190",
+  "smallsetminus;": "\u2216",
+  "smashp;": "\u2a33",
+  "smeparsl;": "\u29e4",
+  "smid;": "\u2223",
+  "smile;": "\u2323",
+  "smt;": "\u2aaa",
+  "smte;": "\u2aac",
+  "smtes;": "\u2aac\ufe00",
+  "softcy;": "\u044c",
+  "sol;": "/",
+  "solb;": "\u29c4",
+  "solbar;": "\u233f",
+  "sopf;": "\u{01d564}",
+  "spades;": "\u2660",
+  "spadesuit;": "\u2660",
+  "spar;": "\u2225",
+  "sqcap;": "\u2293",
+  "sqcaps;": "\u2293\ufe00",
+  "sqcup;": "\u2294",
+  "sqcups;": "\u2294\ufe00",
+  "sqsub;": "\u228f",
+  "sqsube;": "\u2291",
+  "sqsubset;": "\u228f",
+  "sqsubseteq;": "\u2291",
+  "sqsup;": "\u2290",
+  "sqsupe;": "\u2292",
+  "sqsupset;": "\u2290",
+  "sqsupseteq;": "\u2292",
+  "squ;": "\u25a1",
+  "square;": "\u25a1",
+  "squarf;": "\u25aa",
+  "squf;": "\u25aa",
+  "srarr;": "\u2192",
+  "sscr;": "\u{01d4c8}",
+  "ssetmn;": "\u2216",
+  "ssmile;": "\u2323",
+  "sstarf;": "\u22c6",
+  "star;": "\u2606",
+  "starf;": "\u2605",
+  "straightepsilon;": "\u03f5",
+  "straightphi;": "\u03d5",
+  "strns;": "\xaf",
+  "sub;": "\u2282",
+  "subE;": "\u2ac5",
+  "subdot;": "\u2abd",
+  "sube;": "\u2286",
+  "subedot;": "\u2ac3",
+  "submult;": "\u2ac1",
+  "subnE;": "\u2acb",
+  "subne;": "\u228a",
+  "subplus;": "\u2abf",
+  "subrarr;": "\u2979",
+  "subset;": "\u2282",
+  "subseteq;": "\u2286",
+  "subseteqq;": "\u2ac5",
+  "subsetneq;": "\u228a",
+  "subsetneqq;": "\u2acb",
+  "subsim;": "\u2ac7",
+  "subsub;": "\u2ad5",
+  "subsup;": "\u2ad3",
+  "succ;": "\u227b",
+  "succapprox;": "\u2ab8",
+  "succcurlyeq;": "\u227d",
+  "succeq;": "\u2ab0",
+  "succnapprox;": "\u2aba",
+  "succneqq;": "\u2ab6",
+  "succnsim;": "\u22e9",
+  "succsim;": "\u227f",
+  "sum;": "\u2211",
+  "sung;": "\u266a",
+  "sup1": "\xb9",
+  "sup1;": "\xb9",
+  "sup2": "\xb2",
+  "sup2;": "\xb2",
+  "sup3": "\xb3",
+  "sup3;": "\xb3",
+  "sup;": "\u2283",
+  "supE;": "\u2ac6",
+  "supdot;": "\u2abe",
+  "supdsub;": "\u2ad8",
+  "supe;": "\u2287",
+  "supedot;": "\u2ac4",
+  "suphsol;": "\u27c9",
+  "suphsub;": "\u2ad7",
+  "suplarr;": "\u297b",
+  "supmult;": "\u2ac2",
+  "supnE;": "\u2acc",
+  "supne;": "\u228b",
+  "supplus;": "\u2ac0",
+  "supset;": "\u2283",
+  "supseteq;": "\u2287",
+  "supseteqq;": "\u2ac6",
+  "supsetneq;": "\u228b",
+  "supsetneqq;": "\u2acc",
+  "supsim;": "\u2ac8",
+  "supsub;": "\u2ad4",
+  "supsup;": "\u2ad6",
+  "swArr;": "\u21d9",
+  "swarhk;": "\u2926",
+  "swarr;": "\u2199",
+  "swarrow;": "\u2199",
+  "swnwar;": "\u292a",
+  "szlig": "\xdf",
+  "szlig;": "\xdf",
+  "target;": "\u2316",
+  "tau;": "\u03c4",
+  "tbrk;": "\u23b4",
+  "tcaron;": "\u0165",
+  "tcedil;": "\u0163",
+  "tcy;": "\u0442",
+  "tdot;": "\u20db",
+  "telrec;": "\u2315",
+  "tfr;": "\u{01d531}",
+  "there4;": "\u2234",
+  "therefore;": "\u2234",
+  "theta;": "\u03b8",
+  "thetasym;": "\u03d1",
+  "thetav;": "\u03d1",
+  "thickapprox;": "\u2248",
+  "thicksim;": "\u223c",
+  "thinsp;": "\u2009",
+  "thkap;": "\u2248",
+  "thksim;": "\u223c",
+  "thorn": "\xfe",
+  "thorn;": "\xfe",
+  "tilde;": "\u02dc",
+  "times": "\xd7",
+  "times;": "\xd7",
+  "timesb;": "\u22a0",
+  "timesbar;": "\u2a31",
+  "timesd;": "\u2a30",
+  "tint;": "\u222d",
+  "toea;": "\u2928",
+  "top;": "\u22a4",
+  "topbot;": "\u2336",
+  "topcir;": "\u2af1",
+  "topf;": "\u{01d565}",
+  "topfork;": "\u2ada",
+  "tosa;": "\u2929",
+  "tprime;": "\u2034",
+  "trade;": "\u2122",
+  "triangle;": "\u25b5",
+  "triangledown;": "\u25bf",
+  "triangleleft;": "\u25c3",
+  "trianglelefteq;": "\u22b4",
+  "triangleq;": "\u225c",
+  "triangleright;": "\u25b9",
+  "trianglerighteq;": "\u22b5",
+  "tridot;": "\u25ec",
+  "trie;": "\u225c",
+  "triminus;": "\u2a3a",
+  "triplus;": "\u2a39",
+  "trisb;": "\u29cd",
+  "tritime;": "\u2a3b",
+  "trpezium;": "\u23e2",
+  "tscr;": "\u{01d4c9}",
+  "tscy;": "\u0446",
+  "tshcy;": "\u045b",
+  "tstrok;": "\u0167",
+  "twixt;": "\u226c",
+  "twoheadleftarrow;": "\u219e",
+  "twoheadrightarrow;": "\u21a0",
+  "uArr;": "\u21d1",
+  "uHar;": "\u2963",
+  "uacute": "\xfa",
+  "uacute;": "\xfa",
+  "uarr;": "\u2191",
+  "ubrcy;": "\u045e",
+  "ubreve;": "\u016d",
+  "ucirc": "\xfb",
+  "ucirc;": "\xfb",
+  "ucy;": "\u0443",
+  "udarr;": "\u21c5",
+  "udblac;": "\u0171",
+  "udhar;": "\u296e",
+  "ufisht;": "\u297e",
+  "ufr;": "\u{01d532}",
+  "ugrave": "\xf9",
+  "ugrave;": "\xf9",
+  "uharl;": "\u21bf",
+  "uharr;": "\u21be",
+  "uhblk;": "\u2580",
+  "ulcorn;": "\u231c",
+  "ulcorner;": "\u231c",
+  "ulcrop;": "\u230f",
+  "ultri;": "\u25f8",
+  "umacr;": "\u016b",
+  "uml": "\xa8",
+  "uml;": "\xa8",
+  "uogon;": "\u0173",
+  "uopf;": "\u{01d566}",
+  "uparrow;": "\u2191",
+  "updownarrow;": "\u2195",
+  "upharpoonleft;": "\u21bf",
+  "upharpoonright;": "\u21be",
+  "uplus;": "\u228e",
+  "upsi;": "\u03c5",
+  "upsih;": "\u03d2",
+  "upsilon;": "\u03c5",
+  "upuparrows;": "\u21c8",
+  "urcorn;": "\u231d",
+  "urcorner;": "\u231d",
+  "urcrop;": "\u230e",
+  "uring;": "\u016f",
+  "urtri;": "\u25f9",
+  "uscr;": "\u{01d4ca}",
+  "utdot;": "\u22f0",
+  "utilde;": "\u0169",
+  "utri;": "\u25b5",
+  "utrif;": "\u25b4",
+  "uuarr;": "\u21c8",
+  "uuml": "\xfc",
+  "uuml;": "\xfc",
+  "uwangle;": "\u29a7",
+  "vArr;": "\u21d5",
+  "vBar;": "\u2ae8",
+  "vBarv;": "\u2ae9",
+  "vDash;": "\u22a8",
+  "vangrt;": "\u299c",
+  "varepsilon;": "\u03f5",
+  "varkappa;": "\u03f0",
+  "varnothing;": "\u2205",
+  "varphi;": "\u03d5",
+  "varpi;": "\u03d6",
+  "varpropto;": "\u221d",
+  "varr;": "\u2195",
+  "varrho;": "\u03f1",
+  "varsigma;": "\u03c2",
+  "varsubsetneq;": "\u228a\ufe00",
+  "varsubsetneqq;": "\u2acb\ufe00",
+  "varsupsetneq;": "\u228b\ufe00",
+  "varsupsetneqq;": "\u2acc\ufe00",
+  "vartheta;": "\u03d1",
+  "vartriangleleft;": "\u22b2",
+  "vartriangleright;": "\u22b3",
+  "vcy;": "\u0432",
+  "vdash;": "\u22a2",
+  "vee;": "\u2228",
+  "veebar;": "\u22bb",
+  "veeeq;": "\u225a",
+  "vellip;": "\u22ee",
+  "verbar;": "|",
+  "vert;": "|",
+  "vfr;": "\u{01d533}",
+  "vltri;": "\u22b2",
+  "vnsub;": "\u2282\u20d2",
+  "vnsup;": "\u2283\u20d2",
+  "vopf;": "\u{01d567}",
+  "vprop;": "\u221d",
+  "vrtri;": "\u22b3",
+  "vscr;": "\u{01d4cb}",
+  "vsubnE;": "\u2acb\ufe00",
+  "vsubne;": "\u228a\ufe00",
+  "vsupnE;": "\u2acc\ufe00",
+  "vsupne;": "\u228b\ufe00",
+  "vzigzag;": "\u299a",
+  "wcirc;": "\u0175",
+  "wedbar;": "\u2a5f",
+  "wedge;": "\u2227",
+  "wedgeq;": "\u2259",
+  "weierp;": "\u2118",
+  "wfr;": "\u{01d534}",
+  "wopf;": "\u{01d568}",
+  "wp;": "\u2118",
+  "wr;": "\u2240",
+  "wreath;": "\u2240",
+  "wscr;": "\u{01d4cc}",
+  "xcap;": "\u22c2",
+  "xcirc;": "\u25ef",
+  "xcup;": "\u22c3",
+  "xdtri;": "\u25bd",
+  "xfr;": "\u{01d535}",
+  "xhArr;": "\u27fa",
+  "xharr;": "\u27f7",
+  "xi;": "\u03be",
+  "xlArr;": "\u27f8",
+  "xlarr;": "\u27f5",
+  "xmap;": "\u27fc",
+  "xnis;": "\u22fb",
+  "xodot;": "\u2a00",
+  "xopf;": "\u{01d569}",
+  "xoplus;": "\u2a01",
+  "xotime;": "\u2a02",
+  "xrArr;": "\u27f9",
+  "xrarr;": "\u27f6",
+  "xscr;": "\u{01d4cd}",
+  "xsqcup;": "\u2a06",
+  "xuplus;": "\u2a04",
+  "xutri;": "\u25b3",
+  "xvee;": "\u22c1",
+  "xwedge;": "\u22c0",
+  "yacute": "\xfd",
+  "yacute;": "\xfd",
+  "yacy;": "\u044f",
+  "ycirc;": "\u0177",
+  "ycy;": "\u044b",
+  "yen": "\xa5",
+  "yen;": "\xa5",
+  "yfr;": "\u{01d536}",
+  "yicy;": "\u0457",
+  "yopf;": "\u{01d56a}",
+  "yscr;": "\u{01d4ce}",
+  "yucy;": "\u044e",
+  "yuml": "\xff",
+  "yuml;": "\xff",
+  "zacute;": "\u017a",
+  "zcaron;": "\u017e",
+  "zcy;": "\u0437",
+  "zdot;": "\u017c",
+  "zeetrf;": "\u2128",
+  "zeta;": "\u03b6",
+  "zfr;": "\u{01d537}",
+  "zhcy;": "\u0436",
+  "zigrarr;": "\u21dd",
+  "zopf;": "\u{01d56b}",
+  "zscr;": "\u{01d4cf}",
+  "zwj;": "\u200d",
+  "zwnj;": "\u200c",
+};
+
+const Map<int, String> replacementCharacters = const {
+  0x00: "\uFFFD",
+  0x0d: "\u000D",
+  0x80: "\u20AC",
+  0x81: "\u0081",
+  0x82: "\u201A",
+  0x83: "\u0192",
+  0x84: "\u201E",
+  0x85: "\u2026",
+  0x86: "\u2020",
+  0x87: "\u2021",
+  0x88: "\u02C6",
+  0x89: "\u2030",
+  0x8A: "\u0160",
+  0x8B: "\u2039",
+  0x8C: "\u0152",
+  0x8D: "\u008D",
+  0x8E: "\u017D",
+  0x8F: "\u008F",
+  0x90: "\u0090",
+  0x91: "\u2018",
+  0x92: "\u2019",
+  0x93: "\u201C",
+  0x94: "\u201D",
+  0x95: "\u2022",
+  0x96: "\u2013",
+  0x97: "\u2014",
+  0x98: "\u02DC",
+  0x99: "\u2122",
+  0x9A: "\u0161",
+  0x9B: "\u203A",
+  0x9C: "\u0153",
+  0x9D: "\u009D",
+  0x9E: "\u017E",
+  0x9F: "\u0178"
+};
+
+const Map<String, String> encodings = const {
+  '437': 'cp437',
+  '850': 'cp850',
+  '852': 'cp852',
+  '855': 'cp855',
+  '857': 'cp857',
+  '860': 'cp860',
+  '861': 'cp861',
+  '862': 'cp862',
+  '863': 'cp863',
+  '865': 'cp865',
+  '866': 'cp866',
+  '869': 'cp869',
+  'ansix341968': 'ascii',
+  'ansix341986': 'ascii',
+  'arabic': 'iso8859-6',
+  'ascii': 'ascii',
+  'asmo708': 'iso8859-6',
+  'big5': 'big5',
+  'big5hkscs': 'big5hkscs',
+  'chinese': 'gbk',
+  'cp037': 'cp037',
+  'cp1026': 'cp1026',
+  'cp154': 'ptcp154',
+  'cp367': 'ascii',
+  'cp424': 'cp424',
+  'cp437': 'cp437',
+  'cp500': 'cp500',
+  'cp775': 'cp775',
+  'cp819': 'windows-1252',
+  'cp850': 'cp850',
+  'cp852': 'cp852',
+  'cp855': 'cp855',
+  'cp857': 'cp857',
+  'cp860': 'cp860',
+  'cp861': 'cp861',
+  'cp862': 'cp862',
+  'cp863': 'cp863',
+  'cp864': 'cp864',
+  'cp865': 'cp865',
+  'cp866': 'cp866',
+  'cp869': 'cp869',
+  'cp936': 'gbk',
+  'cpgr': 'cp869',
+  'cpis': 'cp861',
+  'csascii': 'ascii',
+  'csbig5': 'big5',
+  'cseuckr': 'cp949',
+  'cseucpkdfmtjapanese': 'euc_jp',
+  'csgb2312': 'gbk',
+  'cshproman8': 'hp-roman8',
+  'csibm037': 'cp037',
+  'csibm1026': 'cp1026',
+  'csibm424': 'cp424',
+  'csibm500': 'cp500',
+  'csibm855': 'cp855',
+  'csibm857': 'cp857',
+  'csibm860': 'cp860',
+  'csibm861': 'cp861',
+  'csibm863': 'cp863',
+  'csibm864': 'cp864',
+  'csibm865': 'cp865',
+  'csibm866': 'cp866',
+  'csibm869': 'cp869',
+  'csiso2022jp': 'iso2022_jp',
+  'csiso2022jp2': 'iso2022_jp_2',
+  'csiso2022kr': 'iso2022_kr',
+  'csiso58gb231280': 'gbk',
+  'csisolatin1': 'windows-1252',
+  'csisolatin2': 'iso8859-2',
+  'csisolatin3': 'iso8859-3',
+  'csisolatin4': 'iso8859-4',
+  'csisolatin5': 'windows-1254',
+  'csisolatin6': 'iso8859-10',
+  'csisolatinarabic': 'iso8859-6',
+  'csisolatincyrillic': 'iso8859-5',
+  'csisolatingreek': 'iso8859-7',
+  'csisolatinhebrew': 'iso8859-8',
+  'cskoi8r': 'koi8-r',
+  'csksc56011987': 'cp949',
+  'cspc775baltic': 'cp775',
+  'cspc850multilingual': 'cp850',
+  'cspc862latinhebrew': 'cp862',
+  'cspc8codepage437': 'cp437',
+  'cspcp852': 'cp852',
+  'csptcp154': 'ptcp154',
+  'csshiftjis': 'shift_jis',
+  'csunicode11utf7': 'utf-7',
+  'cyrillic': 'iso8859-5',
+  'cyrillicasian': 'ptcp154',
+  'ebcdiccpbe': 'cp500',
+  'ebcdiccpca': 'cp037',
+  'ebcdiccpch': 'cp500',
+  'ebcdiccphe': 'cp424',
+  'ebcdiccpnl': 'cp037',
+  'ebcdiccpus': 'cp037',
+  'ebcdiccpwt': 'cp037',
+  'ecma114': 'iso8859-6',
+  'ecma118': 'iso8859-7',
+  'elot928': 'iso8859-7',
+  'eucjp': 'euc_jp',
+  'euckr': 'cp949',
+  'extendedunixcodepackedformatforjapanese': 'euc_jp',
+  'gb18030': 'gb18030',
+  'gb2312': 'gbk',
+  'gb231280': 'gbk',
+  'gbk': 'gbk',
+  'greek': 'iso8859-7',
+  'greek8': 'iso8859-7',
+  'hebrew': 'iso8859-8',
+  'hproman8': 'hp-roman8',
+  'hzgb2312': 'hz',
+  'ibm037': 'cp037',
+  'ibm1026': 'cp1026',
+  'ibm367': 'ascii',
+  'ibm424': 'cp424',
+  'ibm437': 'cp437',
+  'ibm500': 'cp500',
+  'ibm775': 'cp775',
+  'ibm819': 'windows-1252',
+  'ibm850': 'cp850',
+  'ibm852': 'cp852',
+  'ibm855': 'cp855',
+  'ibm857': 'cp857',
+  'ibm860': 'cp860',
+  'ibm861': 'cp861',
+  'ibm862': 'cp862',
+  'ibm863': 'cp863',
+  'ibm864': 'cp864',
+  'ibm865': 'cp865',
+  'ibm866': 'cp866',
+  'ibm869': 'cp869',
+  'iso2022jp': 'iso2022_jp',
+  'iso2022jp2': 'iso2022_jp_2',
+  'iso2022kr': 'iso2022_kr',
+  'iso646irv1991': 'ascii',
+  'iso646us': 'ascii',
+  'iso88591': 'windows-1252',
+  'iso885910': 'iso8859-10',
+  'iso8859101992': 'iso8859-10',
+  'iso885911987': 'windows-1252',
+  'iso885913': 'iso8859-13',
+  'iso885914': 'iso8859-14',
+  'iso8859141998': 'iso8859-14',
+  'iso885915': 'iso8859-15',
+  'iso885916': 'iso8859-16',
+  'iso8859162001': 'iso8859-16',
+  'iso88592': 'iso8859-2',
+  'iso885921987': 'iso8859-2',
+  'iso88593': 'iso8859-3',
+  'iso885931988': 'iso8859-3',
+  'iso88594': 'iso8859-4',
+  'iso885941988': 'iso8859-4',
+  'iso88595': 'iso8859-5',
+  'iso885951988': 'iso8859-5',
+  'iso88596': 'iso8859-6',
+  'iso885961987': 'iso8859-6',
+  'iso88597': 'iso8859-7',
+  'iso885971987': 'iso8859-7',
+  'iso88598': 'iso8859-8',
+  'iso885981988': 'iso8859-8',
+  'iso88599': 'windows-1254',
+  'iso885991989': 'windows-1254',
+  'isoceltic': 'iso8859-14',
+  'isoir100': 'windows-1252',
+  'isoir101': 'iso8859-2',
+  'isoir109': 'iso8859-3',
+  'isoir110': 'iso8859-4',
+  'isoir126': 'iso8859-7',
+  'isoir127': 'iso8859-6',
+  'isoir138': 'iso8859-8',
+  'isoir144': 'iso8859-5',
+  'isoir148': 'windows-1254',
+  'isoir149': 'cp949',
+  'isoir157': 'iso8859-10',
+  'isoir199': 'iso8859-14',
+  'isoir226': 'iso8859-16',
+  'isoir58': 'gbk',
+  'isoir6': 'ascii',
+  'koi8r': 'koi8-r',
+  'koi8u': 'koi8-u',
+  'korean': 'cp949',
+  'ksc5601': 'cp949',
+  'ksc56011987': 'cp949',
+  'ksc56011989': 'cp949',
+  'l1': 'windows-1252',
+  'l10': 'iso8859-16',
+  'l2': 'iso8859-2',
+  'l3': 'iso8859-3',
+  'l4': 'iso8859-4',
+  'l5': 'windows-1254',
+  'l6': 'iso8859-10',
+  'l8': 'iso8859-14',
+  'latin1': 'windows-1252',
+  'latin10': 'iso8859-16',
+  'latin2': 'iso8859-2',
+  'latin3': 'iso8859-3',
+  'latin4': 'iso8859-4',
+  'latin5': 'windows-1254',
+  'latin6': 'iso8859-10',
+  'latin8': 'iso8859-14',
+  'latin9': 'iso8859-15',
+  'ms936': 'gbk',
+  'mskanji': 'shift_jis',
+  'pt154': 'ptcp154',
+  'ptcp154': 'ptcp154',
+  'r8': 'hp-roman8',
+  'roman8': 'hp-roman8',
+  'shiftjis': 'shift_jis',
+  'tis620': 'cp874',
+  'unicode11utf7': 'utf-7',
+  'us': 'ascii',
+  'usascii': 'ascii',
+  'utf16': 'utf-16',
+  'utf16be': 'utf-16-be',
+  'utf16le': 'utf-16-le',
+  'utf8': 'utf-8',
+  'windows1250': 'cp1250',
+  'windows1251': 'cp1251',
+  'windows1252': 'cp1252',
+  'windows1253': 'cp1253',
+  'windows1254': 'cp1254',
+  'windows1255': 'cp1255',
+  'windows1256': 'cp1256',
+  'windows1257': 'cp1257',
+  'windows1258': 'cp1258',
+  'windows936': 'gbk',
+  'x-x-big5': 'big5'
+};
diff --git a/mojo/public/dart/third_party/html/lib/src/css_class_set.dart b/mojo/public/dart/third_party/html/lib/src/css_class_set.dart
new file mode 100644
index 0000000..2e131a5
--- /dev/null
+++ b/mojo/public/dart/third_party/html/lib/src/css_class_set.dart
@@ -0,0 +1,330 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// TODO(jmesserly): everything in this file is copied straight from "dart:html".
+library html.dom.src;
+
+import 'dart:collection';
+import 'package:html/dom.dart';
+
+class ElementCssClassSet extends CssClassSetImpl {
+  final Element _element;
+
+  ElementCssClassSet(this._element);
+
+  Set<String> readClasses() {
+    var s = new LinkedHashSet<String>();
+    var classname = _element.className;
+
+    for (String name in classname.split(' ')) {
+      String trimmed = name.trim();
+      if (!trimmed.isEmpty) {
+        s.add(trimmed);
+      }
+    }
+    return s;
+  }
+
+  void writeClasses(Set<String> s) {
+    _element.className = s.join(' ');
+  }
+}
+
+/** A Set that stores the CSS class names for an element. */
+abstract class CssClassSet implements Set<String> {
+
+  /**
+   * Adds the class [value] to the element if it is not on it, removes it if it
+   * is.
+   *
+   * If [shouldAdd] is true, then we always add that [value] to the element. If
+   * [shouldAdd] is false then we always remove [value] from the element.
+   */
+  bool toggle(String value, [bool shouldAdd]);
+
+  /**
+   * Returns [:true:] if classes cannot be added or removed from this
+   * [:CssClassSet:].
+   */
+  bool get frozen;
+
+  /**
+   * Determine if this element contains the class [value].
+   *
+   * This is the Dart equivalent of jQuery's
+   * [hasClass](http://api.jquery.com/hasClass/).
+   */
+  bool contains(String value);
+
+  /**
+   * Add the class [value] to element.
+   *
+   * This is the Dart equivalent of jQuery's
+   * [addClass](http://api.jquery.com/addClass/).
+   *
+   * If this corresponds to one element. Returns true if [value] was added to
+   * the set, otherwise false.
+   *
+   * If this corresponds to many elements, null is always returned.
+   */
+  bool add(String value);
+
+  /**
+   * Remove the class [value] from element, and return true on successful
+   * removal.
+   *
+   * This is the Dart equivalent of jQuery's
+   * [removeClass](http://api.jquery.com/removeClass/).
+   */
+  bool remove(Object value);
+
+  /**
+   * Add all classes specified in [iterable] to element.
+   *
+   * This is the Dart equivalent of jQuery's
+   * [addClass](http://api.jquery.com/addClass/).
+   */
+  void addAll(Iterable<String> iterable);
+
+  /**
+   * Remove all classes specified in [iterable] from element.
+   *
+   * This is the Dart equivalent of jQuery's
+   * [removeClass](http://api.jquery.com/removeClass/).
+   */
+  void removeAll(Iterable<String> iterable);
+
+  /**
+   * Toggles all classes specified in [iterable] on element.
+   *
+   * Iterate through [iterable]'s items, and add it if it is not on it, or
+   * remove it if it is. This is the Dart equivalent of jQuery's
+   * [toggleClass](http://api.jquery.com/toggleClass/).
+   * If [shouldAdd] is true, then we always add all the classes in [iterable]
+   * element. If [shouldAdd] is false then we always remove all the classes in
+   * [iterable] from the element.
+   */
+  void toggleAll(Iterable<String> iterable, [bool shouldAdd]);
+}
+
+abstract class CssClassSetImpl implements CssClassSet {
+  String toString() {
+    return readClasses().join(' ');
+  }
+
+  /**
+   * Adds the class [value] to the element if it is not on it, removes it if it
+   * is.
+   *
+   * If [shouldAdd] is true, then we always add that [value] to the element. If
+   * [shouldAdd] is false then we always remove [value] from the element.
+   */
+  bool toggle(String value, [bool shouldAdd]) {
+    Set<String> s = readClasses();
+    bool result = false;
+    if (shouldAdd == null) shouldAdd = !s.contains(value);
+    if (shouldAdd) {
+      s.add(value);
+      result = true;
+    } else {
+      s.remove(value);
+    }
+    writeClasses(s);
+    return result;
+  }
+
+  /**
+   * Returns [:true:] if classes cannot be added or removed from this
+   * [:CssClassSet:].
+   */
+  bool get frozen => false;
+
+  // interface Iterable - BEGIN
+  Iterator<String> get iterator => readClasses().iterator;
+  // interface Iterable - END
+
+  // interface Collection - BEGIN
+  void forEach(void f(String element)) {
+    readClasses().forEach(f);
+  }
+
+  String join([String separator = ""]) => readClasses().join(separator);
+
+  Iterable map(f(String element)) => readClasses().map(f);
+
+  Iterable<String> where(bool f(String element)) => readClasses().where(f);
+
+  Iterable expand(Iterable f(String element)) => readClasses().expand(f);
+
+  bool every(bool f(String element)) => readClasses().every(f);
+
+  bool any(bool f(String element)) => readClasses().any(f);
+
+  bool get isEmpty => readClasses().isEmpty;
+
+  bool get isNotEmpty => readClasses().isNotEmpty;
+
+  int get length => readClasses().length;
+
+  String reduce(String combine(String value, String element)) {
+    return readClasses().reduce(combine);
+  }
+
+  dynamic fold(dynamic initialValue,
+      dynamic combine(dynamic previousValue, String element)) {
+    return readClasses().fold(initialValue, combine);
+  }
+  // interface Collection - END
+
+  // interface Set - BEGIN
+  /**
+   * Determine if this element contains the class [value].
+   *
+   * This is the Dart equivalent of jQuery's
+   * [hasClass](http://api.jquery.com/hasClass/).
+   */
+  bool contains(String value) => readClasses().contains(value);
+
+  /** Lookup from the Set interface. Not interesting for a String set. */
+  String lookup(String value) => contains(value) ? value : null;
+
+  /**
+   * Add the class [value] to element.
+   *
+   * This is the Dart equivalent of jQuery's
+   * [addClass](http://api.jquery.com/addClass/).
+   */
+  bool add(String value) {
+    // TODO - figure out if we need to do any validation here
+    // or if the browser natively does enough.
+    return modify((s) => s.add(value));
+  }
+
+  /**
+   * Remove the class [value] from element, and return true on successful
+   * removal.
+   *
+   * This is the Dart equivalent of jQuery's
+   * [removeClass](http://api.jquery.com/removeClass/).
+   */
+  bool remove(Object value) {
+    if (value is! String) return false;
+    Set<String> s = readClasses();
+    bool result = s.remove(value);
+    writeClasses(s);
+    return result;
+  }
+
+  /**
+   * Add all classes specified in [iterable] to element.
+   *
+   * This is the Dart equivalent of jQuery's
+   * [addClass](http://api.jquery.com/addClass/).
+   */
+  void addAll(Iterable<String> iterable) {
+    // TODO - see comment above about validation.
+    modify((s) => s.addAll(iterable));
+  }
+
+  /**
+   * Remove all classes specified in [iterable] from element.
+   *
+   * This is the Dart equivalent of jQuery's
+   * [removeClass](http://api.jquery.com/removeClass/).
+   */
+  void removeAll(Iterable<String> iterable) {
+    modify((s) => s.removeAll(iterable));
+  }
+
+  /**
+   * Toggles all classes specified in [iterable] on element.
+   *
+   * Iterate through [iterable]'s items, and add it if it is not on it, or
+   * remove it if it is. This is the Dart equivalent of jQuery's
+   * [toggleClass](http://api.jquery.com/toggleClass/).
+   * If [shouldAdd] is true, then we always add all the classes in [iterable]
+   * element. If [shouldAdd] is false then we always remove all the classes in
+   * [iterable] from the element.
+   */
+  void toggleAll(Iterable<String> iterable, [bool shouldAdd]) {
+    iterable.forEach((e) => toggle(e, shouldAdd));
+  }
+
+  void retainAll(Iterable<String> iterable) {
+    modify((s) => s.retainAll(iterable));
+  }
+
+  void removeWhere(bool test(String name)) {
+    modify((s) => s.removeWhere(test));
+  }
+
+  void retainWhere(bool test(String name)) {
+    modify((s) => s.retainWhere(test));
+  }
+
+  bool containsAll(Iterable<String> collection) =>
+      readClasses().containsAll(collection);
+
+  Set<String> intersection(Set<String> other) =>
+      readClasses().intersection(other);
+
+  Set<String> union(Set<String> other) => readClasses().union(other);
+
+  Set<String> difference(Set<String> other) => readClasses().difference(other);
+
+  String get first => readClasses().first;
+  String get last => readClasses().last;
+  String get single => readClasses().single;
+  List<String> toList({bool growable: true}) =>
+      readClasses().toList(growable: growable);
+  Set<String> toSet() => readClasses().toSet();
+  Iterable<String> take(int n) => readClasses().take(n);
+  Iterable<String> takeWhile(bool test(String value)) =>
+      readClasses().takeWhile(test);
+  Iterable<String> skip(int n) => readClasses().skip(n);
+  Iterable<String> skipWhile(bool test(String value)) =>
+      readClasses().skipWhile(test);
+  dynamic firstWhere(bool test(String value), {Object orElse()}) =>
+      readClasses().firstWhere(test, orElse: orElse);
+  dynamic lastWhere(bool test(String value), {Object orElse()}) =>
+      readClasses().lastWhere(test, orElse: orElse);
+  String singleWhere(bool test(String value)) =>
+      readClasses().singleWhere(test);
+  String elementAt(int index) => readClasses().elementAt(index);
+
+  void clear() {
+    modify((s) => s.clear());
+  }
+  // interface Set - END
+
+  /**
+   * Helper method used to modify the set of css classes on this element.
+   *
+   *   f - callback with:
+   *   s - a Set of all the css class name currently on this element.
+   *
+   *   After f returns, the modified set is written to the
+   *       className property of this element.
+   */
+  modify(f(Set<String> s)) {
+    Set<String> s = readClasses();
+    var ret = f(s);
+    writeClasses(s);
+    return ret;
+  }
+
+  /**
+   * Read the class names from the Element class property,
+   * and put them into a set (duplicates are discarded).
+   * This is intended to be overridden by specific implementations.
+   */
+  Set<String> readClasses();
+
+  /**
+   * Join all the elements of a set into one string and write
+   * back to the element.
+   * This is intended to be overridden by specific implementations.
+   */
+  void writeClasses(Set<String> s);
+}
diff --git a/mojo/public/dart/third_party/html/lib/src/encoding_parser.dart b/mojo/public/dart/third_party/html/lib/src/encoding_parser.dart
new file mode 100644
index 0000000..fd64ff9
--- /dev/null
+++ b/mojo/public/dart/third_party/html/lib/src/encoding_parser.dart
@@ -0,0 +1,370 @@
+library encoding_parser;
+
+import 'constants.dart';
+import 'inputstream.dart';
+
+// TODO(jmesserly): I converted StopIteration to StateError("No more elements").
+// Seems strange to throw this from outside of an iterator though.
+/// String-like object with an associated position and various extra methods
+/// If the position is ever greater than the string length then an exception is
+/// raised.
+class EncodingBytes {
+  final String _bytes;
+  int _position = -1;
+
+  EncodingBytes(this._bytes);
+
+  int get length => _bytes.length;
+
+  String next() {
+    var p = _position = _position + 1;
+    if (p >= length) {
+      throw new StateError("No more elements");
+    } else if (p < 0) {
+      throw new RangeError(p);
+    }
+    return _bytes[p];
+  }
+
+  String previous() {
+    var p = _position;
+    if (p >= length) {
+      throw new StateError("No more elements");
+    } else if (p < 0) {
+      throw new RangeError(p);
+    }
+    _position = p = p - 1;
+    return _bytes[p];
+  }
+
+  set position(int value) {
+    if (_position >= length) {
+      throw new StateError("No more elements");
+    }
+    _position = value;
+  }
+
+  int get position {
+    if (_position >= length) {
+      throw new StateError("No more elements");
+    }
+    if (_position >= 0) {
+      return _position;
+    } else {
+      return 0;
+    }
+  }
+
+  String get currentByte => _bytes[position];
+
+  /// Skip past a list of characters. Defaults to skipping [isWhitespace].
+  String skipChars([CharPreciate skipChars]) {
+    if (skipChars == null) skipChars = isWhitespace;
+    var p = position; // use property for the error-checking
+    while (p < length) {
+      var c = _bytes[p];
+      if (!skipChars(c)) {
+        _position = p;
+        return c;
+      }
+      p += 1;
+    }
+    _position = p;
+    return null;
+  }
+
+  String skipUntil(CharPreciate untilChars) {
+    var p = position;
+    while (p < length) {
+      var c = _bytes[p];
+      if (untilChars(c)) {
+        _position = p;
+        return c;
+      }
+      p += 1;
+    }
+    return null;
+  }
+
+  /// Look for a sequence of bytes at the start of a string. If the bytes
+  /// are found return true and advance the position to the byte after the
+  /// match. Otherwise return false and leave the position alone.
+  bool matchBytes(String bytes) {
+    var p = position;
+    if (_bytes.length < p + bytes.length) {
+      return false;
+    }
+    var data = _bytes.substring(p, p + bytes.length);
+    if (data == bytes) {
+      position += bytes.length;
+      return true;
+    }
+    return false;
+  }
+
+  /// Look for the next sequence of bytes matching a given sequence. If
+  /// a match is found advance the position to the last byte of the match
+  bool jumpTo(String bytes) {
+    var newPosition = _bytes.indexOf(bytes, position);
+    if (newPosition >= 0) {
+      _position = newPosition + bytes.length - 1;
+      return true;
+    } else {
+      throw new StateError("No more elements");
+    }
+  }
+
+  String slice(int start, [int end]) {
+    if (end == null) end = length;
+    if (end < 0) end += length;
+    return _bytes.substring(start, end - start);
+  }
+}
+
+/// Mini parser for detecting character encoding from meta elements.
+class EncodingParser {
+  final EncodingBytes data;
+  String encoding;
+
+  /// [bytes] - the data to work on for encoding detection.
+  EncodingParser(List<int> bytes)
+      // Note: this is intentionally interpreting bytes as codepoints.
+      : data = new EncodingBytes(new String.fromCharCodes(bytes).toLowerCase());
+
+  String getEncoding() {
+    final methodDispatch = [
+      ["<!--", handleComment],
+      ["<meta", handleMeta],
+      ["</", handlePossibleEndTag],
+      ["<!", handleOther],
+      ["<?", handleOther],
+      ["<", handlePossibleStartTag]
+    ];
+
+    try {
+      for (;;) {
+        for (var dispatch in methodDispatch) {
+          if (data.matchBytes(dispatch[0])) {
+            var keepParsing = dispatch[1]();
+            if (keepParsing) break;
+
+            // We found an encoding. Stop.
+            return encoding;
+          }
+        }
+        data.position += 1;
+      }
+    } on StateError catch (e) {
+      // Catch this here to match behavior of Python's StopIteration
+      // TODO(jmesserly): refactor to not use exceptions
+    }
+    return encoding;
+  }
+
+  /// Skip over comments.
+  bool handleComment() => data.jumpTo("-->");
+
+  bool handleMeta() {
+    if (!isWhitespace(data.currentByte)) {
+      // if we have <meta not followed by a space so just keep going
+      return true;
+    }
+    // We have a valid meta element we want to search for attributes
+    while (true) {
+      // Try to find the next attribute after the current position
+      var attr = getAttribute();
+      if (attr == null) return true;
+
+      if (attr[0] == "charset") {
+        var tentativeEncoding = attr[1];
+        var codec = codecName(tentativeEncoding);
+        if (codec != null) {
+          encoding = codec;
+          return false;
+        }
+      } else if (attr[0] == "content") {
+        var contentParser = new ContentAttrParser(new EncodingBytes(attr[1]));
+        var tentativeEncoding = contentParser.parse();
+        var codec = codecName(tentativeEncoding);
+        if (codec != null) {
+          encoding = codec;
+          return false;
+        }
+      }
+    }
+    return true; // unreachable
+  }
+
+  bool handlePossibleStartTag() => handlePossibleTag(false);
+
+  bool handlePossibleEndTag() {
+    data.next();
+    return handlePossibleTag(true);
+  }
+
+  bool handlePossibleTag(bool endTag) {
+    if (!isLetter(data.currentByte)) {
+      //If the next byte is not an ascii letter either ignore this
+      //fragment (possible start tag case) or treat it according to
+      //handleOther
+      if (endTag) {
+        data.previous();
+        handleOther();
+      }
+      return true;
+    }
+
+    var c = data.skipUntil(isSpaceOrAngleBracket);
+    if (c == "<") {
+      // return to the first step in the overall "two step" algorithm
+      // reprocessing the < byte
+      data.previous();
+    } else {
+      //Read all attributes
+      var attr = getAttribute();
+      while (attr != null) {
+        attr = getAttribute();
+      }
+    }
+    return true;
+  }
+
+  bool handleOther() => data.jumpTo(">");
+
+  /// Return a name,value pair for the next attribute in the stream,
+  /// if one is found, or null
+  List<String> getAttribute() {
+    // Step 1 (skip chars)
+    var c = data.skipChars((x) => x == "/" || isWhitespace(x));
+    // Step 2
+    if (c == ">" || c == null) {
+      return null;
+    }
+    // Step 3
+    var attrName = [];
+    var attrValue = [];
+    // Step 4 attribute name
+    while (true) {
+      if (c == null) {
+        return null;
+      } else if (c == "=" && attrName.length > 0) {
+        break;
+      } else if (isWhitespace(c)) {
+        // Step 6!
+        c = data.skipChars();
+        c = data.next();
+        break;
+      } else if (c == "/" || c == ">") {
+        return [attrName.join(), ""];
+      } else if (isLetter(c)) {
+        attrName.add(c.toLowerCase());
+      } else {
+        attrName.add(c);
+      }
+      // Step 5
+      c = data.next();
+    }
+    // Step 7
+    if (c != "=") {
+      data.previous();
+      return [attrName.join(), ""];
+    }
+    // Step 8
+    data.next();
+    // Step 9
+    c = data.skipChars();
+    // Step 10
+    if (c == "'" || c == '"') {
+      // 10.1
+      var quoteChar = c;
+      while (true) {
+        // 10.2
+        c = data.next();
+        if (c == quoteChar) {
+          // 10.3
+          data.next();
+          return [attrName.join(), attrValue.join()];
+        } else if (isLetter(c)) {
+          // 10.4
+          attrValue.add(c.toLowerCase());
+        } else {
+          // 10.5
+          attrValue.add(c);
+        }
+      }
+    } else if (c == ">") {
+      return [attrName.join(), ""];
+    } else if (c == null) {
+      return null;
+    } else if (isLetter(c)) {
+      attrValue.add(c.toLowerCase());
+    } else {
+      attrValue.add(c);
+    }
+    // Step 11
+    while (true) {
+      c = data.next();
+      if (isSpaceOrAngleBracket(c)) {
+        return [attrName.join(), attrValue.join()];
+      } else if (c == null) {
+        return null;
+      } else if (isLetter(c)) {
+        attrValue.add(c.toLowerCase());
+      } else {
+        attrValue.add(c);
+      }
+    }
+    return null; // unreachable
+  }
+}
+
+class ContentAttrParser {
+  final EncodingBytes data;
+
+  ContentAttrParser(this.data);
+
+  String parse() {
+    try {
+      // Check if the attr name is charset
+      // otherwise return
+      data.jumpTo("charset");
+      data.position += 1;
+      data.skipChars();
+      if (data.currentByte != "=") {
+        // If there is no = sign keep looking for attrs
+        return null;
+      }
+      data.position += 1;
+      data.skipChars();
+      // Look for an encoding between matching quote marks
+      if (data.currentByte == '"' || data.currentByte == "'") {
+        var quoteMark = data.currentByte;
+        data.position += 1;
+        var oldPosition = data.position;
+        if (data.jumpTo(quoteMark)) {
+          return data.slice(oldPosition, data.position);
+        } else {
+          return null;
+        }
+      } else {
+        // Unquoted value
+        var oldPosition = data.position;
+        try {
+          data.skipUntil(isWhitespace);
+          return data.slice(oldPosition, data.position);
+        } on StateError catch (e) {
+          //Return the whole remaining value
+          return data.slice(oldPosition);
+        }
+      }
+    } on StateError catch (e) {
+      return null;
+    }
+  }
+}
+
+bool isSpaceOrAngleBracket(String char) {
+  return char == ">" || char == "<" || isWhitespace(char);
+}
+
+typedef bool CharPreciate(String char);
diff --git a/mojo/public/dart/third_party/html/lib/src/inputstream.dart b/mojo/public/dart/third_party/html/lib/src/inputstream.dart
new file mode 100644
index 0000000..cb40bc9
--- /dev/null
+++ b/mojo/public/dart/third_party/html/lib/src/inputstream.dart
@@ -0,0 +1,318 @@
+library inputstream;
+
+import 'dart:collection';
+import 'package:utf/utf.dart';
+import 'package:source_span/source_span.dart';
+import 'char_encodings.dart';
+import 'constants.dart';
+import 'utils.dart';
+import 'encoding_parser.dart';
+
+/// Hooks to call into dart:io without directly referencing it.
+class ConsoleSupport {
+  List<int> bytesFromFile(source) => null;
+}
+
+// TODO(jmesserly): use lazy init here when supported.
+ConsoleSupport consoleSupport = new ConsoleSupport();
+
+/// Provides a unicode stream of characters to the HtmlTokenizer.
+///
+/// This class takes care of character encoding and removing or replacing
+/// incorrect byte-sequences and also provides column and line tracking.
+class HtmlInputStream {
+  /// Number of bytes to use when looking for a meta element with
+  /// encoding information.
+  static const int numBytesMeta = 512;
+
+  /// Encoding to use if no other information can be found.
+  static const String defaultEncoding = 'windows-1252';
+
+  /// The name of the character encoding.
+  String charEncodingName;
+
+  /// True if we are certain about [charEncodingName], false for tenative.
+  bool charEncodingCertain = true;
+
+  final bool generateSpans;
+
+  /// Location where the contents of the stream were found.
+  final String sourceUrl;
+
+  List<int> _rawBytes;
+
+  /// Raw UTF-16 codes, used if a Dart String is passed in.
+  Iterable<int> _rawChars;
+
+  Queue<String> errors;
+
+  SourceFile fileInfo;
+
+  List<int> _lineStarts;
+
+  List<int> _chars;
+
+  int _offset;
+
+  /// Initialises the HtmlInputStream.
+  ///
+  /// HtmlInputStream(source, [encoding]) -> Normalized stream from source
+  /// for use by html5lib.
+  ///
+  /// [source] can be either a [String] or a [List<int>] containing the raw
+  /// bytes, or a file if [consoleSupport] is initialized.
+  ///
+  /// The optional encoding parameter must be a string that indicates
+  /// the encoding.  If specified, that encoding will be used,
+  /// regardless of any BOM or later declaration (such as in a meta
+  /// element)
+  ///
+  /// [parseMeta] - Look for a <meta> element containing encoding information
+  HtmlInputStream(source, [String encoding, bool parseMeta = true,
+      this.generateSpans = false, this.sourceUrl])
+      : charEncodingName = codecName(encoding) {
+    if (source is String) {
+      _rawChars = toCodepoints(source);
+      charEncodingName = 'utf-8';
+      charEncodingCertain = true;
+    } else if (source is List<int>) {
+      _rawBytes = source;
+    } else {
+      // TODO(jmesserly): it's unfortunate we need to read all bytes in advance,
+      // but it's necessary because of how the UTF decoders work.
+      _rawBytes = consoleSupport.bytesFromFile(source);
+
+      if (_rawBytes == null) {
+        // TODO(jmesserly): we should accept some kind of stream API too.
+        // Unfortunately dart:io InputStream is async only, which won't work.
+        throw new ArgumentError("'source' must be a String or "
+            "List<int> (of bytes). You can also pass a RandomAccessFile if you"
+            "`import 'package:html/parser_console.dart'` and call "
+            "`useConsole()`.");
+      }
+    }
+
+    // Detect encoding iff no explicit "transport level" encoding is supplied
+    if (charEncodingName == null) {
+      detectEncoding(parseMeta);
+    }
+
+    reset();
+  }
+
+  void reset() {
+    errors = new Queue<String>();
+
+    _offset = 0;
+    _lineStarts = <int>[0];
+    _chars = <int>[];
+
+    if (_rawChars == null) {
+      _rawChars = decodeBytes(charEncodingName, _rawBytes);
+    }
+
+    bool skipNewline = false;
+    for (var c in _rawChars) {
+      if (skipNewline) {
+        skipNewline = false;
+        if (c == NEWLINE) continue;
+      }
+
+      if (invalidUnicode(c)) errors.add('invalid-codepoint');
+
+      if (0xD800 <= c && c <= 0xDFFF) {
+        c = 0xFFFD;
+      } else if (c == RETURN) {
+        skipNewline = true;
+        c = NEWLINE;
+      }
+
+      _chars.add(c);
+      if (c == NEWLINE) _lineStarts.add(_chars.length);
+    }
+
+    // Free decoded characters if they aren't needed anymore.
+    if (_rawBytes != null) _rawChars = null;
+
+    // TODO(sigmund): Don't parse the file at all if spans aren't being
+    // generated.
+    fileInfo = new SourceFile.decoded(_chars, url: sourceUrl);
+  }
+
+  void detectEncoding([bool parseMeta = true]) {
+    // First look for a BOM
+    // This will also read past the BOM if present
+    charEncodingName = detectBOM();
+    charEncodingCertain = true;
+
+    // If there is no BOM need to look for meta elements with encoding
+    // information
+    if (charEncodingName == null && parseMeta) {
+      charEncodingName = detectEncodingMeta();
+      charEncodingCertain = false;
+    }
+    // If all else fails use the default encoding
+    if (charEncodingName == null) {
+      charEncodingCertain = false;
+      charEncodingName = defaultEncoding;
+    }
+
+    // Substitute for equivalent encodings:
+    if (charEncodingName.toLowerCase() == 'iso-8859-1') {
+      charEncodingName = 'windows-1252';
+    }
+  }
+
+  void changeEncoding(String newEncoding) {
+    if (_rawBytes == null) {
+      // We should never get here -- if encoding is certain we won't try to
+      // change it.
+      throw new StateError('cannot change encoding when parsing a String.');
+    }
+
+    newEncoding = codecName(newEncoding);
+    if (const ['utf-16', 'utf-16-be', 'utf-16-le'].contains(newEncoding)) {
+      newEncoding = 'utf-8';
+    }
+    if (newEncoding == null) {
+      return;
+    } else if (newEncoding == charEncodingName) {
+      charEncodingCertain = true;
+    } else {
+      charEncodingName = newEncoding;
+      charEncodingCertain = true;
+      _rawChars = null;
+      reset();
+      throw new ReparseException(
+          'Encoding changed from $charEncodingName to $newEncoding');
+    }
+  }
+
+  /// Attempts to detect at BOM at the start of the stream. If
+  /// an encoding can be determined from the BOM return the name of the
+  /// encoding otherwise return null.
+  String detectBOM() {
+    // Try detecting the BOM using bytes from the string
+    if (hasUtf8Bom(_rawBytes)) {
+      return 'utf-8';
+    }
+    // Note: we don't need to remember whether it was big or little endian
+    // because the decoder will do that later. It will also eat the BOM for us.
+    if (hasUtf16Bom(_rawBytes)) {
+      return 'utf-16';
+    }
+    if (hasUtf32Bom(_rawBytes)) {
+      return 'utf-32';
+    }
+    return null;
+  }
+
+  /// Report the encoding declared by the meta element.
+  String detectEncodingMeta() {
+    var parser = new EncodingParser(slice(_rawBytes, 0, numBytesMeta));
+    var encoding = parser.getEncoding();
+
+    if (const ['utf-16', 'utf-16-be', 'utf-16-le'].contains(encoding)) {
+      encoding = 'utf-8';
+    }
+
+    return encoding;
+  }
+
+  /// Returns the current offset in the stream, i.e. the number of codepoints
+  /// since the start of the file.
+  int get position => _offset;
+
+  /// Read one character from the stream or queue if available. Return
+  /// EOF when EOF is reached.
+  String char() {
+    if (_offset >= _chars.length) return EOF;
+    return new String.fromCharCodes([_chars[_offset++]]);
+  }
+
+  String peekChar() {
+    if (_offset >= _chars.length) return EOF;
+    return new String.fromCharCodes([_chars[_offset]]);
+  }
+
+  /// Returns a string of characters from the stream up to but not
+  /// including any character in 'characters' or EOF.
+  String charsUntil(String characters, [bool opposite = false]) {
+    int start = _offset;
+    String c;
+    while ((c = peekChar()) != null && characters.contains(c) == opposite) {
+      _offset++;
+    }
+
+    return new String.fromCharCodes(_chars.sublist(start, _offset));
+  }
+
+  void unget(String ch) {
+    // Only one character is allowed to be ungotten at once - it must
+    // be consumed again before any further call to unget
+    if (ch != null) {
+      _offset--;
+      assert(peekChar() == ch);
+    }
+  }
+}
+
+// TODO(jmesserly): the Python code used a regex to check for this. But
+// Dart doesn't let you create a regexp with invalid characters.
+bool invalidUnicode(int c) {
+  if (0x0001 <= c && c <= 0x0008) return true;
+  if (0x000E <= c && c <= 0x001F) return true;
+  if (0x007F <= c && c <= 0x009F) return true;
+  if (0xD800 <= c && c <= 0xDFFF) return true;
+  if (0xFDD0 <= c && c <= 0xFDEF) return true;
+  switch (c) {
+    case 0x000B:
+    case 0xFFFE:
+    case 0xFFFF:
+    case 0x01FFFE:
+    case 0x01FFFF:
+    case 0x02FFFE:
+    case 0x02FFFF:
+    case 0x03FFFE:
+    case 0x03FFFF:
+    case 0x04FFFE:
+    case 0x04FFFF:
+    case 0x05FFFE:
+    case 0x05FFFF:
+    case 0x06FFFE:
+    case 0x06FFFF:
+    case 0x07FFFE:
+    case 0x07FFFF:
+    case 0x08FFFE:
+    case 0x08FFFF:
+    case 0x09FFFE:
+    case 0x09FFFF:
+    case 0x0AFFFE:
+    case 0x0AFFFF:
+    case 0x0BFFFE:
+    case 0x0BFFFF:
+    case 0x0CFFFE:
+    case 0x0CFFFF:
+    case 0x0DFFFE:
+    case 0x0DFFFF:
+    case 0x0EFFFE:
+    case 0x0EFFFF:
+    case 0x0FFFFE:
+    case 0x0FFFFF:
+    case 0x10FFFE:
+    case 0x10FFFF:
+      return true;
+  }
+  return false;
+}
+
+/// Return the python codec name corresponding to an encoding or null if the
+/// string doesn't correspond to a valid encoding.
+String codecName(String encoding) {
+  final asciiPunctuation = new RegExp(
+      "[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E]");
+
+  if (encoding == null) return null;
+  var canonicalName = encoding.replaceAll(asciiPunctuation, '').toLowerCase();
+  return encodings[canonicalName];
+}
diff --git a/mojo/public/dart/third_party/html/lib/src/list_proxy.dart b/mojo/public/dart/third_party/html/lib/src/list_proxy.dart
new file mode 100644
index 0000000..99acdb6
--- /dev/null
+++ b/mojo/public/dart/third_party/html/lib/src/list_proxy.dart
@@ -0,0 +1,105 @@
+// TODO(jmesserly): remove this once we have a subclassable growable list
+// in our libraries.
+
+/// A [List] proxy that you can subclass.
+library list_proxy;
+
+import 'dart:collection';
+import 'dart:math' show Random;
+
+// TOOD(jmesserly): this needs to be removed, but fixing NodeList is tricky.
+class ListProxy<E> extends IterableBase<E> implements List<E> {
+
+  /// The inner [List<T>] with the actual storage.
+  final List<E> _list;
+
+  /// Creates a list proxy.
+  /// You can optionally specify the list to use for [storage] of the items,
+  /// otherwise this will create a [List<E>].
+  ListProxy([List<E> storage]) : _list = storage != null ? storage : <E>[];
+
+  // TODO(jmesserly): This should be on List.
+  // See http://code.google.com/p/dart/issues/detail?id=947
+  bool remove(E item) {
+    int i = indexOf(item);
+    if (i == -1) return false;
+    removeAt(i);
+    return true;
+  }
+
+  void insert(int index, E item) => _list.insert(index, item);
+
+  // Override from Iterable to fix performance
+  // Length and last become O(1) instead of O(N)
+  // The others are just different constant factor.
+  int get length => _list.length;
+  E get last => _list.last;
+  E get first => _list.first;
+  E get single => _list.single;
+
+  // From Iterable
+  Iterator<E> get iterator => _list.iterator;
+
+  // From List
+  E operator [](int index) => _list[index];
+  operator []=(int index, E value) {
+    _list[index] = value;
+  }
+  set length(int value) {
+    _list.length = value;
+  }
+  void add(E value) {
+    _list.add(value);
+  }
+
+  void addLast(E value) {
+    add(value);
+  }
+  void addAll(Iterable<E> collection) {
+    _list.addAll(collection);
+  }
+  void sort([int compare(E a, E b)]) {
+    _list.sort(compare);
+  }
+  void shuffle([Random random]) {
+    _list.shuffle(random);
+  }
+
+  int indexOf(E element, [int start = 0]) => _list.indexOf(element, start);
+  int lastIndexOf(E element, [int start]) => _list.lastIndexOf(element, start);
+  void clear() {
+    _list.clear();
+  }
+
+  E removeAt(int index) => _list.removeAt(index);
+  E removeLast() => _list.removeLast();
+
+  void removeWhere(bool test(E element)) => _list.removeWhere(test);
+  void retainWhere(bool test(E element)) => _list.retainWhere(test);
+
+  List<E> sublist(int start, [int end]) => _list.sublist(start, end);
+
+  List<E> getRange(int start, int end) => _list.getRange(start, end);
+
+  void setRange(int start, int length, List<E> from, [int startFrom = 0]) {
+    _list.setRange(start, length, from, startFrom);
+  }
+  void removeRange(int start, int length) {
+    _list.removeRange(start, length);
+  }
+  void insertAll(int index, Iterable<E> iterable) {
+    _list.insertAll(index, iterable);
+  }
+
+  Iterable<E> get reversed => _list.reversed;
+
+  Map<int, E> asMap() => _list.asMap();
+
+  void replaceRange(int start, int end, Iterable<E> newContents) =>
+      _list.replaceRange(start, end, newContents);
+
+  void setAll(int index, Iterable<E> iterable) => _list.setAll(index, iterable);
+
+  void fillRange(int start, int end, [E fillValue]) =>
+      _list.fillRange(start, end, fillValue);
+}
diff --git a/mojo/public/dart/third_party/html/lib/src/query_selector.dart b/mojo/public/dart/third_party/html/lib/src/query_selector.dart
new file mode 100644
index 0000000..e586d1a
--- /dev/null
+++ b/mojo/public/dart/third_party/html/lib/src/query_selector.dart
@@ -0,0 +1,293 @@
+/// Query selector implementation for our DOM.
+library html.src.query;
+
+import 'package:csslib/parser.dart' as css;
+import 'package:csslib/parser.dart' show TokenKind;
+import 'package:csslib/visitor.dart'; // the CSSOM
+import 'package:html/dom.dart';
+import 'package:html/src/constants.dart' show isWhitespaceCC;
+
+bool matches(Node node, String selector) =>
+    new SelectorEvaluator().matches(node, _parseSelectorList(selector));
+
+Element querySelector(Node node, String selector) =>
+    new SelectorEvaluator().querySelector(node, _parseSelectorList(selector));
+
+List<Element> querySelectorAll(Node node, String selector) {
+  var results = [];
+  new SelectorEvaluator().querySelectorAll(
+      node, _parseSelectorList(selector), results);
+  return results;
+}
+
+// http://dev.w3.org/csswg/selectors-4/#grouping
+SelectorGroup _parseSelectorList(String selector) {
+  var errors = [];
+  var group = css.parseSelectorGroup(selector, errors: errors);
+  if (group == null || errors.isNotEmpty) {
+    throw new FormatException("'$selector' is not a valid selector: $errors");
+  }
+  return group;
+}
+
+class SelectorEvaluator extends Visitor {
+  /// The current HTML element to match against.
+  Element _element;
+
+  bool matches(Element element, SelectorGroup selector) {
+    _element = element;
+    return visitSelectorGroup(selector);
+  }
+
+  Element querySelector(Node root, SelectorGroup selector) {
+    for (var node in root.nodes) {
+      if (node is! Element) continue;
+      if (matches(node, selector)) return node;
+      var result = querySelector(node, selector);
+      if (result != null) return result;
+    }
+    return null;
+  }
+
+  void querySelectorAll(
+      Node root, SelectorGroup selector, List<Element> results) {
+    for (var node in root.nodes) {
+      if (node is! Element) continue;
+      if (matches(node, selector)) results.add(node);
+      querySelectorAll(node, selector, results);
+    }
+  }
+
+  bool visitSelectorGroup(SelectorGroup group) =>
+      group.selectors.any(visitSelector);
+
+  bool visitSelector(Selector selector) {
+    var old = _element;
+    var result = true;
+
+    // Note: evaluate selectors right-to-left as it's more efficient.
+    int combinator = null;
+    for (var s in selector.simpleSelectorSequences.reversed) {
+      if (combinator == null) {
+        result = s.simpleSelector.visit(this);
+      } else if (combinator == TokenKind.COMBINATOR_DESCENDANT) {
+        // descendant combinator
+        // http://dev.w3.org/csswg/selectors-4/#descendant-combinators
+        do {
+          _element = _element.parent;
+        } while (_element != null && !s.simpleSelector.visit(this));
+
+        if (_element == null) result = false;
+      } else if (combinator == TokenKind.COMBINATOR_TILDE) {
+        // Following-sibling combinator
+        // http://dev.w3.org/csswg/selectors-4/#general-sibling-combinators
+        do {
+          _element = _element.previousElementSibling;
+        } while (_element != null && !s.simpleSelector.visit(this));
+
+        if (_element == null) result = false;
+      }
+
+      if (!result) break;
+
+      switch (s.combinator) {
+        case TokenKind.COMBINATOR_PLUS:
+          // Next-sibling combinator
+          // http://dev.w3.org/csswg/selectors-4/#adjacent-sibling-combinators
+          _element = _element.previousElementSibling;
+          break;
+        case TokenKind.COMBINATOR_GREATER:
+          // Child combinator
+          // http://dev.w3.org/csswg/selectors-4/#child-combinators
+          _element = _element.parent;
+          break;
+        case TokenKind.COMBINATOR_DESCENDANT:
+        case TokenKind.COMBINATOR_TILDE:
+          // We need to iterate through all siblings or parents.
+          // For now, just remember what the combinator was.
+          combinator = s.combinator;
+          break;
+        case TokenKind.COMBINATOR_NONE:
+          break;
+        default:
+          throw _unsupported(selector);
+      }
+
+      if (_element == null) {
+        result = false;
+        break;
+      }
+    }
+
+    _element = old;
+    return result;
+  }
+
+  _unimplemented(SimpleSelector selector) => new UnimplementedError(
+      "'$selector' selector of type "
+      "${selector.runtimeType} is not implemented");
+
+  _unsupported(selector) =>
+      new FormatException("'$selector' is not a valid selector");
+
+  bool visitPseudoClassSelector(PseudoClassSelector selector) {
+    switch (selector.name) {
+      // http://dev.w3.org/csswg/selectors-4/#structural-pseudos
+
+      // http://dev.w3.org/csswg/selectors-4/#the-root-pseudo
+      case 'root':
+        // TODO(jmesserly): fix when we have a .ownerDocument pointer
+        // return _element == _element.ownerDocument.rootElement;
+        return _element.localName == 'html' && _element.parentNode == null;
+
+      // http://dev.w3.org/csswg/selectors-4/#the-empty-pseudo
+      case 'empty':
+        return _element.nodes
+            .any((n) => !(n is Element || n is Text && n.text.isNotEmpty));
+
+      // http://dev.w3.org/csswg/selectors-4/#the-blank-pseudo
+      case 'blank':
+        return _element.nodes.any((n) => !(n is Element ||
+            n is Text && n.text.runes.any((r) => !isWhitespaceCC(r))));
+
+      // http://dev.w3.org/csswg/selectors-4/#the-first-child-pseudo
+      case 'first-child':
+        return _element.previousElementSibling == null;
+
+      // http://dev.w3.org/csswg/selectors-4/#the-last-child-pseudo
+      case 'last-child':
+        return _element.nextElementSibling == null;
+
+      // http://dev.w3.org/csswg/selectors-4/#the-only-child-pseudo
+      case 'only-child':
+        return _element.previousElementSibling == null &&
+            _element.nextElementSibling == null;
+
+      // http://dev.w3.org/csswg/selectors-4/#link
+      case 'link':
+        return _element.attributes['href'] != null;
+
+      case 'visited':
+        // Always return false since we aren't a browser. This is allowed per:
+        // http://dev.w3.org/csswg/selectors-4/#visited-pseudo
+        return false;
+    }
+
+    // :before, :after, :first-letter/line can't match DOM elements.
+    if (_isLegacyPsuedoClass(selector.name)) return false;
+
+    throw _unimplemented(selector);
+  }
+
+  bool visitPseudoElementSelector(PseudoElementSelector selector) {
+    // :before, :after, :first-letter/line can't match DOM elements.
+    if (_isLegacyPsuedoClass(selector.name)) return false;
+
+    throw _unimplemented(selector);
+  }
+
+  static bool _isLegacyPsuedoClass(String name) {
+    switch (name) {
+      case 'before':
+      case 'after':
+      case 'first-line':
+      case 'first-letter':
+        return true;
+      default:
+        return false;
+    }
+  }
+
+  bool visitPseudoElementFunctionSelector(PseudoElementFunctionSelector s) =>
+      throw _unimplemented(s);
+
+  bool visitPseudoClassFunctionSelector(PseudoClassFunctionSelector selector) {
+    switch (selector.name) {
+      // http://dev.w3.org/csswg/selectors-4/#child-index
+
+      // http://dev.w3.org/csswg/selectors-4/#the-nth-child-pseudo
+      case 'nth-child':
+        // TODO(jmesserly): support An+B syntax too.
+        var exprs = selector.expression.expressions;
+        if (exprs.length == 1 && exprs[0] is LiteralTerm) {
+          LiteralTerm literal = exprs[0];
+          var parent = _element.parentNode;
+          return parent != null &&
+              literal.value > 0 &&
+              parent.nodes.indexOf(_element) == literal.value;
+        }
+        break;
+
+      // http://dev.w3.org/csswg/selectors-4/#the-lang-pseudo
+      case 'lang':
+        // TODO(jmesserly): shouldn't need to get the raw text here, but csslib
+        // gets confused by the "-" in the expression, such as in "es-AR".
+        var toMatch = selector.expression.span.text;
+        var lang = _getInheritedLanguage(_element);
+        // TODO(jmesserly): implement wildcards in level 4
+        return lang != null && lang.startsWith(toMatch);
+    }
+    throw _unimplemented(selector);
+  }
+
+  static String _getInheritedLanguage(Node node) {
+    while (node != null) {
+      var lang = node.attributes['lang'];
+      if (lang != null) return lang;
+      node = node.parent;
+    }
+    return null;
+  }
+
+  bool visitNamespaceSelector(NamespaceSelector selector) {
+    // Match element tag name
+    if (!selector.nameAsSimpleSelector.visit(this)) return false;
+
+    if (selector.isNamespaceWildcard) return true;
+
+    if (selector.namespace == '') return _element.namespaceUri == null;
+
+    throw _unimplemented(selector);
+  }
+
+  bool visitElementSelector(ElementSelector selector) =>
+      selector.isWildcard || _element.localName == selector.name.toLowerCase();
+
+  bool visitIdSelector(IdSelector selector) => _element.id == selector.name;
+
+  bool visitClassSelector(ClassSelector selector) =>
+      _element.classes.contains(selector.name);
+
+  // TODO(jmesserly): negation should support any selectors in level 4,
+  // not just simple selectors.
+  // http://dev.w3.org/csswg/selectors-4/#negation
+  bool visitNegationSelector(NegationSelector selector) =>
+      !selector.negationArg.visit(this);
+
+  bool visitAttributeSelector(AttributeSelector selector) {
+    // Match name first
+    var value = _element.attributes[selector.name.toLowerCase()];
+    if (value == null) return false;
+
+    if (selector.operatorKind == TokenKind.NO_MATCH) return true;
+
+    var select = '${selector.value}';
+    switch (selector.operatorKind) {
+      case TokenKind.EQUALS:
+        return value == select;
+      case TokenKind.INCLUDES:
+        return value.split(' ').any((v) => v.isNotEmpty && v == select);
+      case TokenKind.DASH_MATCH:
+        return value.startsWith(select) &&
+            (value.length == select.length || value[select.length] == '-');
+      case TokenKind.PREFIX_MATCH:
+        return value.startsWith(select);
+      case TokenKind.SUFFIX_MATCH:
+        return value.endsWith(select);
+      case TokenKind.SUBSTRING_MATCH:
+        return value.contains(select);
+      default:
+        throw _unsupported(selector);
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/html/lib/src/token.dart b/mojo/public/dart/third_party/html/lib/src/token.dart
new file mode 100644
index 0000000..9a2843c
--- /dev/null
+++ b/mojo/public/dart/third_party/html/lib/src/token.dart
@@ -0,0 +1,141 @@
+/// This library contains token types used by the html5 tokenizer.
+library token;
+
+import 'dart:collection';
+import 'package:source_span/source_span.dart';
+
+/// An html5 token.
+abstract class Token {
+  FileSpan span;
+
+  int get kind;
+}
+
+abstract class TagToken extends Token {
+  String name;
+
+  bool selfClosing;
+
+  TagToken(this.name, this.selfClosing);
+}
+
+class StartTagToken extends TagToken {
+  /// The tag's attributes. A map from the name to the value, where the name
+  /// can be a [String] or [AttributeName].
+  LinkedHashMap<dynamic, String> data;
+
+  /// The attribute spans if requested. Otherwise null.
+  List<TagAttribute> attributeSpans;
+
+  bool selfClosingAcknowledged;
+
+  /// The namespace. This is filled in later during tree building.
+  String namespace;
+
+  StartTagToken(String name, {this.data, bool selfClosing: false,
+      this.selfClosingAcknowledged: false, this.namespace})
+      : super(name, selfClosing);
+
+  int get kind => TokenKind.startTag;
+}
+
+class EndTagToken extends TagToken {
+  EndTagToken(String name, {bool selfClosing: false})
+      : super(name, selfClosing);
+
+  int get kind => TokenKind.endTag;
+}
+
+abstract class StringToken extends Token {
+  StringBuffer _buffer;
+
+  String _string;
+  String get data {
+    if (_string == null) {
+      _string = _buffer.toString();
+      _buffer = null;
+    }
+    return _string;
+  }
+
+  StringToken(string)
+      : _string = string,
+        _buffer = string == null ? new StringBuffer() : null;
+
+  StringToken add(String data) {
+    _buffer.write(data);
+    return this;
+  }
+}
+
+class ParseErrorToken extends StringToken {
+  /// Extra information that goes along with the error message.
+  Map messageParams;
+
+  ParseErrorToken(String data, {this.messageParams}) : super(data);
+
+  int get kind => TokenKind.parseError;
+}
+
+class CharactersToken extends StringToken {
+  CharactersToken([String data]) : super(data);
+
+  int get kind => TokenKind.characters;
+
+  /// Replaces the token's [data]. This should only be used to wholly replace
+  /// data, not to append data.
+  void replaceData(String newData) {
+    _string = newData;
+    _buffer = null;
+  }
+}
+
+class SpaceCharactersToken extends StringToken {
+  SpaceCharactersToken([String data]) : super(data);
+
+  int get kind => TokenKind.spaceCharacters;
+}
+
+class CommentToken extends StringToken {
+  CommentToken([String data]) : super(data);
+
+  int get kind => TokenKind.comment;
+}
+
+class DoctypeToken extends Token {
+  String publicId;
+  String systemId;
+  String name = "";
+  bool correct;
+
+  DoctypeToken({this.publicId, this.systemId, this.correct: false});
+
+  int get kind => TokenKind.doctype;
+}
+
+/// These are used by the tokenizer to build up the attribute map.
+/// They're also used by [StartTagToken.attributeSpans] if attribute spans are
+/// requested.
+class TagAttribute {
+  String name;
+  String value;
+
+  // The spans of the attribute. This is not used unless we are computing an
+  // attribute span on demand.
+  int start;
+  int end;
+  int startValue;
+  int endValue;
+
+  TagAttribute();
+}
+
+class TokenKind {
+  static const int spaceCharacters = 0;
+  static const int characters = 1;
+  static const int startTag = 2;
+  static const int endTag = 3;
+  static const int comment = 4;
+  static const int doctype = 5;
+  static const int parseError = 6;
+}
diff --git a/mojo/public/dart/third_party/html/lib/src/tokenizer.dart b/mojo/public/dart/third_party/html/lib/src/tokenizer.dart
new file mode 100644
index 0000000..3273858
--- /dev/null
+++ b/mojo/public/dart/third_party/html/lib/src/tokenizer.dart
@@ -0,0 +1,1908 @@
+library tokenizer;
+
+import 'dart:collection';
+import 'package:html/parser.dart' show HtmlParser;
+import 'constants.dart';
+import 'inputstream.dart';
+import 'token.dart';
+import 'utils.dart';
+
+// Group entities by their first character, for faster lookups
+
+// TODO(jmesserly): we could use a better data structure here like a trie, if
+// we had it implemented in Dart.
+Map<String, List<String>> entitiesByFirstChar = (() {
+  var result = {};
+  for (var k in entities.keys) {
+    result.putIfAbsent(k[0], () => []).add(k);
+  }
+  return result;
+})();
+
+// TODO(jmesserly): lots of ways to make this faster:
+// - use char codes everywhere instead of 1-char strings
+// - use switch instead of contains, indexOf
+// - use switch instead of the sequential if tests
+// - avoid string concat
+
+/// This class takes care of tokenizing HTML.
+class HtmlTokenizer implements Iterator<Token> {
+  // TODO(jmesserly): a lot of these could be made private
+
+  final HtmlInputStream stream;
+
+  final bool lowercaseElementName;
+
+  final bool lowercaseAttrName;
+
+  /// True to generate spans in for [Token.span].
+  final bool generateSpans;
+
+  /// True to generate spans for attributes.
+  final bool attributeSpans;
+
+  /// This reference to the parser is used for correct CDATA handling.
+  /// The [HtmlParser] will set this at construction time.
+  HtmlParser parser;
+
+  final Queue<Token> tokenQueue;
+
+  /// Holds the token that is currently being processed.
+  Token currentToken;
+
+  /// Holds a reference to the method to be invoked for the next parser state.
+  // TODO(jmesserly): the type should be "Predicate" but a dart2js checked mode
+  // bug prevents us from doing that. See http://dartbug.com/12465
+  Function state;
+
+  final StringBuffer _buffer = new StringBuffer();
+
+  int _lastOffset;
+
+  // TODO(jmesserly): ideally this would be a LinkedHashMap and we wouldn't add
+  // an item until it's ready. But the code doesn't have a clear notion of when
+  // it's "done" with the attribute.
+  List<TagAttribute> _attributes;
+  Set<String> _attributeNames;
+
+  HtmlTokenizer(doc, {String encoding, bool parseMeta: true,
+      this.lowercaseElementName: true, this.lowercaseAttrName: true,
+      bool generateSpans: false, String sourceUrl, this.attributeSpans: false})
+      : stream = new HtmlInputStream(
+          doc, encoding, parseMeta, generateSpans, sourceUrl),
+        tokenQueue = new Queue(),
+        generateSpans = generateSpans {
+    reset();
+  }
+
+  TagToken get currentTagToken => currentToken;
+  DoctypeToken get currentDoctypeToken => currentToken;
+  StringToken get currentStringToken => currentToken;
+
+  Token _current;
+  Token get current => _current;
+
+  final StringBuffer _attributeName = new StringBuffer();
+  final StringBuffer _attributeValue = new StringBuffer();
+
+  void _markAttributeEnd(int offset) {
+    _attributes.last.value = '$_attributeValue';
+    if (attributeSpans) _attributes.last.end = stream.position + offset;
+  }
+
+  void _markAttributeValueStart(int offset) {
+    if (attributeSpans) _attributes.last.startValue = stream.position + offset;
+  }
+
+  void _markAttributeValueEnd(int offset) {
+    if (attributeSpans) _attributes.last.endValue = stream.position + offset;
+    _markAttributeEnd(offset);
+  }
+
+  // Note: we could track the name span here, if we need it.
+  void _markAttributeNameEnd(int offset) => _markAttributeEnd(offset);
+
+  void _addAttribute(String name) {
+    if (_attributes == null) _attributes = [];
+    _attributeName.clear();
+    _attributeName.write(name);
+    _attributeValue.clear();
+    var attr = new TagAttribute();
+    _attributes.add(attr);
+    if (attributeSpans) attr.start = stream.position - name.length;
+  }
+
+  /// This is where the magic happens.
+  ///
+  /// We do our usually processing through the states and when we have a token
+  /// to return we yield the token which pauses processing until the next token
+  /// is requested.
+  bool moveNext() {
+    // Start processing. When EOF is reached state will return false;
+    // instead of true and the loop will terminate.
+    while (stream.errors.length == 0 && tokenQueue.length == 0) {
+      if (!state()) {
+        _current = null;
+        return false;
+      }
+    }
+    if (stream.errors.length > 0) {
+      _current = new ParseErrorToken(stream.errors.removeFirst());
+    } else {
+      assert(tokenQueue.length > 0);
+      _current = tokenQueue.removeFirst();
+    }
+    return true;
+  }
+
+  /// Resets the tokenizer state. Calling this does not reset the [stream] or
+  /// the [parser].
+  void reset() {
+    _lastOffset = 0;
+    tokenQueue.clear();
+    currentToken = null;
+    _buffer.clear();
+    _attributes = null;
+    _attributeNames = null;
+    state = dataState;
+  }
+
+  /// Adds a token to the queue. Sets the span if needed.
+  void _addToken(Token token) {
+    if (generateSpans && token.span == null) {
+      int offset = stream.position;
+      token.span = stream.fileInfo.span(_lastOffset, offset);
+      if (token is! ParseErrorToken) {
+        _lastOffset = offset;
+      }
+    }
+    tokenQueue.add(token);
+  }
+
+  /// This function returns either U+FFFD or the character based on the
+  /// decimal or hexadecimal representation. It also discards ";" if present.
+  /// If not present it will add a [ParseErrorToken].
+  String consumeNumberEntity(bool isHex) {
+    var allowed = isDigit;
+    var radix = 10;
+    if (isHex) {
+      allowed = isHexDigit;
+      radix = 16;
+    }
+
+    var charStack = [];
+
+    // Consume all the characters that are in range while making sure we
+    // don't hit an EOF.
+    var c = stream.char();
+    while (allowed(c) && c != EOF) {
+      charStack.add(c);
+      c = stream.char();
+    }
+
+    // Convert the set of characters consumed to an int.
+    var charAsInt = parseIntRadix(charStack.join(), radix);
+
+    // Certain characters get replaced with others
+    var char = replacementCharacters[charAsInt];
+    if (char != null) {
+      _addToken(new ParseErrorToken("illegal-codepoint-for-numeric-entity",
+          messageParams: {"charAsInt": charAsInt}));
+    } else if ((0xD800 <= charAsInt && charAsInt <= 0xDFFF) ||
+        (charAsInt > 0x10FFFF)) {
+      char = "\uFFFD";
+      _addToken(new ParseErrorToken("illegal-codepoint-for-numeric-entity",
+          messageParams: {"charAsInt": charAsInt}));
+    } else {
+      // Should speed up this check somehow (e.g. move the set to a constant)
+      if ((0x0001 <= charAsInt && charAsInt <= 0x0008) ||
+          (0x000E <= charAsInt && charAsInt <= 0x001F) ||
+          (0x007F <= charAsInt && charAsInt <= 0x009F) ||
+          (0xFDD0 <= charAsInt && charAsInt <= 0xFDEF) ||
+          const [
+        0x000B,
+        0xFFFE,
+        0xFFFF,
+        0x1FFFE,
+        0x1FFFF,
+        0x2FFFE,
+        0x2FFFF,
+        0x3FFFE,
+        0x3FFFF,
+        0x4FFFE,
+        0x4FFFF,
+        0x5FFFE,
+        0x5FFFF,
+        0x6FFFE,
+        0x6FFFF,
+        0x7FFFE,
+        0x7FFFF,
+        0x8FFFE,
+        0x8FFFF,
+        0x9FFFE,
+        0x9FFFF,
+        0xAFFFE,
+        0xAFFFF,
+        0xBFFFE,
+        0xBFFFF,
+        0xCFFFE,
+        0xCFFFF,
+        0xDFFFE,
+        0xDFFFF,
+        0xEFFFE,
+        0xEFFFF,
+        0xFFFFE,
+        0xFFFFF,
+        0x10FFFE,
+        0x10FFFF
+      ].contains(charAsInt)) {
+        _addToken(new ParseErrorToken("illegal-codepoint-for-numeric-entity",
+            messageParams: {"charAsInt": charAsInt}));
+      }
+      char = new String.fromCharCodes([charAsInt]);
+    }
+
+    // Discard the ; if present. Otherwise, put it back on the queue and
+    // invoke parseError on parser.
+    if (c != ";") {
+      _addToken(new ParseErrorToken("numeric-entity-without-semicolon"));
+      stream.unget(c);
+    }
+    return char;
+  }
+
+  void consumeEntity({String allowedChar, bool fromAttribute: false}) {
+    // Initialise to the default output for when no entity is matched
+    var output = "&";
+
+    var charStack = [stream.char()];
+    if (isWhitespace(charStack[0]) ||
+        charStack[0] == '<' ||
+        charStack[0] == '&' ||
+        charStack[0] == EOF ||
+        allowedChar == charStack[0]) {
+      stream.unget(charStack[0]);
+    } else if (charStack[0] == "#") {
+      // Read the next character to see if it's hex or decimal
+      bool hex = false;
+      charStack.add(stream.char());
+      if (charStack.last == 'x' || charStack.last == 'X') {
+        hex = true;
+        charStack.add(stream.char());
+      }
+
+      // charStack.last should be the first digit
+      if (hex && isHexDigit(charStack.last) ||
+          (!hex && isDigit(charStack.last))) {
+        // At least one digit found, so consume the whole number
+        stream.unget(charStack.last);
+        output = consumeNumberEntity(hex);
+      } else {
+        // No digits found
+        _addToken(new ParseErrorToken("expected-numeric-entity"));
+        stream.unget(charStack.removeLast());
+        output = "&${charStack.join()}";
+      }
+    } else {
+      // At this point in the process might have named entity. Entities
+      // are stored in the global variable "entities".
+      //
+      // Consume characters and compare to these to a substring of the
+      // entity names in the list until the substring no longer matches.
+      var filteredEntityList = entitiesByFirstChar[charStack[0]];
+      if (filteredEntityList == null) filteredEntityList = const [];
+
+      while (charStack.last != EOF) {
+        var name = charStack.join();
+        filteredEntityList =
+            filteredEntityList.where((e) => e.startsWith(name)).toList();
+
+        if (filteredEntityList.length == 0) {
+          break;
+        }
+        charStack.add(stream.char());
+      }
+
+      // At this point we have a string that starts with some characters
+      // that may match an entity
+      String entityName = null;
+
+      // Try to find the longest entity the string will match to take care
+      // of &noti for instance.
+
+      int entityLen;
+      for (entityLen = charStack.length - 1; entityLen > 1; entityLen--) {
+        var possibleEntityName = charStack.sublist(0, entityLen).join();
+        if (entities.containsKey(possibleEntityName)) {
+          entityName = possibleEntityName;
+          break;
+        }
+      }
+
+      if (entityName != null) {
+        var lastChar = entityName[entityName.length - 1];
+        if (lastChar != ";") {
+          _addToken(new ParseErrorToken("named-entity-without-semicolon"));
+        }
+        if (lastChar != ";" &&
+            fromAttribute &&
+            (isLetterOrDigit(charStack[entityLen]) ||
+                charStack[entityLen] == '=')) {
+          stream.unget(charStack.removeLast());
+          output = "&${charStack.join()}";
+        } else {
+          output = entities[entityName];
+          stream.unget(charStack.removeLast());
+          output = '${output}${slice(charStack, entityLen).join()}';
+        }
+      } else {
+        _addToken(new ParseErrorToken("expected-named-entity"));
+        stream.unget(charStack.removeLast());
+        output = "&${charStack.join()}";
+      }
+    }
+    if (fromAttribute) {
+      _attributeValue.write(output);
+    } else {
+      var token;
+      if (isWhitespace(output)) {
+        token = new SpaceCharactersToken(output);
+      } else {
+        token = new CharactersToken(output);
+      }
+      _addToken(token);
+    }
+  }
+
+  /// This method replaces the need for "entityInAttributeValueState".
+  void processEntityInAttribute(String allowedChar) {
+    consumeEntity(allowedChar: allowedChar, fromAttribute: true);
+  }
+
+  /// This method is a generic handler for emitting the tags. It also sets
+  /// the state to "data" because that's what's needed after a token has been
+  /// emitted.
+  void emitCurrentToken() {
+    var token = currentToken;
+    // Add token to the queue to be yielded
+    if (token is TagToken) {
+      if (lowercaseElementName) {
+        token.name = asciiUpper2Lower(token.name);
+      }
+      if (token is EndTagToken) {
+        if (_attributes != null) {
+          _addToken(new ParseErrorToken("attributes-in-end-tag"));
+        }
+        if (token.selfClosing) {
+          _addToken(new ParseErrorToken("this-closing-flag-on-end-tag"));
+        }
+      } else if (token is StartTagToken) {
+        // HTML5 specific normalizations to the token stream.
+        // Convert the list into a map where first key wins.
+        token.data = new LinkedHashMap<Object, String>();
+        if (_attributes != null) {
+          for (var attr in _attributes) {
+            token.data.putIfAbsent(attr.name, () => attr.value);
+          }
+          if (attributeSpans) token.attributeSpans = _attributes;
+        }
+      }
+      _attributes = null;
+      _attributeNames = null;
+    }
+    _addToken(token);
+    state = dataState;
+  }
+
+  // Below are the various tokenizer states worked out.
+
+  bool dataState() {
+    var data = stream.char();
+    if (data == "&") {
+      state = entityDataState;
+    } else if (data == "<") {
+      state = tagOpenState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      _addToken(new CharactersToken("\u0000"));
+    } else if (data == EOF) {
+      // Tokenization ends.
+      return false;
+    } else if (isWhitespace(data)) {
+      // Directly after emitting a token you switch back to the "data
+      // state". At that point spaceCharacters are important so they are
+      // emitted separately.
+      _addToken(new SpaceCharactersToken(
+          '${data}${stream.charsUntil(spaceCharacters, true)}'));
+      // No need to update lastFourChars here, since the first space will
+      // have already been appended to lastFourChars and will have broken
+      // any <!-- or --> sequences
+    } else {
+      var chars = stream.charsUntil("&<\u0000");
+      _addToken(new CharactersToken('${data}${chars}'));
+    }
+    return true;
+  }
+
+  bool entityDataState() {
+    consumeEntity();
+    state = dataState;
+    return true;
+  }
+
+  bool rcdataState() {
+    var data = stream.char();
+    if (data == "&") {
+      state = characterReferenceInRcdata;
+    } else if (data == "<") {
+      state = rcdataLessThanSignState;
+    } else if (data == EOF) {
+      // Tokenization ends.
+      return false;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      _addToken(new CharactersToken("\uFFFD"));
+    } else if (isWhitespace(data)) {
+      // Directly after emitting a token you switch back to the "data
+      // state". At that point spaceCharacters are important so they are
+      // emitted separately.
+      _addToken(new SpaceCharactersToken(
+          '${data}${stream.charsUntil(spaceCharacters, true)}'));
+    } else {
+      var chars = stream.charsUntil("&<");
+      _addToken(new CharactersToken('${data}${chars}'));
+    }
+    return true;
+  }
+
+  bool characterReferenceInRcdata() {
+    consumeEntity();
+    state = rcdataState;
+    return true;
+  }
+
+  bool rawtextState() {
+    var data = stream.char();
+    if (data == "<") {
+      state = rawtextLessThanSignState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      _addToken(new CharactersToken("\uFFFD"));
+    } else if (data == EOF) {
+      // Tokenization ends.
+      return false;
+    } else {
+      var chars = stream.charsUntil("<\u0000");
+      _addToken(new CharactersToken("${data}${chars}"));
+    }
+    return true;
+  }
+
+  bool scriptDataState() {
+    var data = stream.char();
+    if (data == "<") {
+      state = scriptDataLessThanSignState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      _addToken(new CharactersToken("\uFFFD"));
+    } else if (data == EOF) {
+      // Tokenization ends.
+      return false;
+    } else {
+      var chars = stream.charsUntil("<\u0000");
+      _addToken(new CharactersToken("${data}${chars}"));
+    }
+    return true;
+  }
+
+  bool plaintextState() {
+    var data = stream.char();
+    if (data == EOF) {
+      // Tokenization ends.
+      return false;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      _addToken(new CharactersToken("\uFFFD"));
+    } else {
+      _addToken(new CharactersToken('${data}${stream.charsUntil("\u0000")}'));
+    }
+    return true;
+  }
+
+  bool tagOpenState() {
+    var data = stream.char();
+    if (data == "!") {
+      state = markupDeclarationOpenState;
+    } else if (data == "/") {
+      state = closeTagOpenState;
+    } else if (isLetter(data)) {
+      currentToken = new StartTagToken(data);
+      state = tagNameState;
+    } else if (data == ">") {
+      // XXX In theory it could be something besides a tag name. But
+      // do we really care?
+      _addToken(new ParseErrorToken("expected-tag-name-but-got-right-bracket"));
+      _addToken(new CharactersToken("<>"));
+      state = dataState;
+    } else if (data == "?") {
+      // XXX In theory it could be something besides a tag name. But
+      // do we really care?
+      _addToken(new ParseErrorToken("expected-tag-name-but-got-question-mark"));
+      stream.unget(data);
+      state = bogusCommentState;
+    } else {
+      // XXX
+      _addToken(new ParseErrorToken("expected-tag-name"));
+      _addToken(new CharactersToken("<"));
+      stream.unget(data);
+      state = dataState;
+    }
+    return true;
+  }
+
+  bool closeTagOpenState() {
+    var data = stream.char();
+    if (isLetter(data)) {
+      currentToken = new EndTagToken(data);
+      state = tagNameState;
+    } else if (data == ">") {
+      _addToken(
+          new ParseErrorToken("expected-closing-tag-but-got-right-bracket"));
+      state = dataState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("expected-closing-tag-but-got-eof"));
+      _addToken(new CharactersToken("</"));
+      state = dataState;
+    } else {
+      // XXX data can be _'_...
+      _addToken(new ParseErrorToken("expected-closing-tag-but-got-char",
+          messageParams: {"data": data}));
+      stream.unget(data);
+      state = bogusCommentState;
+    }
+    return true;
+  }
+
+  bool tagNameState() {
+    var data = stream.char();
+    if (isWhitespace(data)) {
+      state = beforeAttributeNameState;
+    } else if (data == ">") {
+      emitCurrentToken();
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-tag-name"));
+      state = dataState;
+    } else if (data == "/") {
+      state = selfClosingStartTagState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      currentTagToken.name = '${currentTagToken.name}\uFFFD';
+    } else {
+      currentTagToken.name = '${currentTagToken.name}$data';
+      // (Don't use charsUntil here, because tag names are
+      // very short and it's faster to not do anything fancy)
+    }
+    return true;
+  }
+
+  bool rcdataLessThanSignState() {
+    var data = stream.char();
+    if (data == "/") {
+      _buffer.clear();
+      state = rcdataEndTagOpenState;
+    } else {
+      _addToken(new CharactersToken("<"));
+      stream.unget(data);
+      state = rcdataState;
+    }
+    return true;
+  }
+
+  bool rcdataEndTagOpenState() {
+    var data = stream.char();
+    if (isLetter(data)) {
+      _buffer.write(data);
+      state = rcdataEndTagNameState;
+    } else {
+      _addToken(new CharactersToken("</"));
+      stream.unget(data);
+      state = rcdataState;
+    }
+    return true;
+  }
+
+  bool _tokenIsAppropriate() {
+    // TODO(jmesserly): this should use case insensitive compare instead.
+    return currentToken is TagToken &&
+        currentTagToken.name.toLowerCase() == '$_buffer'.toLowerCase();
+  }
+
+  bool rcdataEndTagNameState() {
+    var appropriate = _tokenIsAppropriate();
+    var data = stream.char();
+    if (isWhitespace(data) && appropriate) {
+      currentToken = new EndTagToken('$_buffer');
+      state = beforeAttributeNameState;
+    } else if (data == "/" && appropriate) {
+      currentToken = new EndTagToken('$_buffer');
+      state = selfClosingStartTagState;
+    } else if (data == ">" && appropriate) {
+      currentToken = new EndTagToken('$_buffer');
+      emitCurrentToken();
+      state = dataState;
+    } else if (isLetter(data)) {
+      _buffer.write(data);
+    } else {
+      _addToken(new CharactersToken("</$_buffer"));
+      stream.unget(data);
+      state = rcdataState;
+    }
+    return true;
+  }
+
+  bool rawtextLessThanSignState() {
+    var data = stream.char();
+    if (data == "/") {
+      _buffer.clear();
+      state = rawtextEndTagOpenState;
+    } else {
+      _addToken(new CharactersToken("<"));
+      stream.unget(data);
+      state = rawtextState;
+    }
+    return true;
+  }
+
+  bool rawtextEndTagOpenState() {
+    var data = stream.char();
+    if (isLetter(data)) {
+      _buffer.write(data);
+      state = rawtextEndTagNameState;
+    } else {
+      _addToken(new CharactersToken("</"));
+      stream.unget(data);
+      state = rawtextState;
+    }
+    return true;
+  }
+
+  bool rawtextEndTagNameState() {
+    var appropriate = _tokenIsAppropriate();
+    var data = stream.char();
+    if (isWhitespace(data) && appropriate) {
+      currentToken = new EndTagToken('$_buffer');
+      state = beforeAttributeNameState;
+    } else if (data == "/" && appropriate) {
+      currentToken = new EndTagToken('$_buffer');
+      state = selfClosingStartTagState;
+    } else if (data == ">" && appropriate) {
+      currentToken = new EndTagToken('$_buffer');
+      emitCurrentToken();
+      state = dataState;
+    } else if (isLetter(data)) {
+      _buffer.write(data);
+    } else {
+      _addToken(new CharactersToken("</$_buffer"));
+      stream.unget(data);
+      state = rawtextState;
+    }
+    return true;
+  }
+
+  bool scriptDataLessThanSignState() {
+    var data = stream.char();
+    if (data == "/") {
+      _buffer.clear();
+      state = scriptDataEndTagOpenState;
+    } else if (data == "!") {
+      _addToken(new CharactersToken("<!"));
+      state = scriptDataEscapeStartState;
+    } else {
+      _addToken(new CharactersToken("<"));
+      stream.unget(data);
+      state = scriptDataState;
+    }
+    return true;
+  }
+
+  bool scriptDataEndTagOpenState() {
+    var data = stream.char();
+    if (isLetter(data)) {
+      _buffer.write(data);
+      state = scriptDataEndTagNameState;
+    } else {
+      _addToken(new CharactersToken("</"));
+      stream.unget(data);
+      state = scriptDataState;
+    }
+    return true;
+  }
+
+  bool scriptDataEndTagNameState() {
+    var appropriate = _tokenIsAppropriate();
+    var data = stream.char();
+    if (isWhitespace(data) && appropriate) {
+      currentToken = new EndTagToken('$_buffer');
+      state = beforeAttributeNameState;
+    } else if (data == "/" && appropriate) {
+      currentToken = new EndTagToken('$_buffer');
+      state = selfClosingStartTagState;
+    } else if (data == ">" && appropriate) {
+      currentToken = new EndTagToken('$_buffer');
+      emitCurrentToken();
+      state = dataState;
+    } else if (isLetter(data)) {
+      _buffer.write(data);
+    } else {
+      _addToken(new CharactersToken("</$_buffer"));
+      stream.unget(data);
+      state = scriptDataState;
+    }
+    return true;
+  }
+
+  bool scriptDataEscapeStartState() {
+    var data = stream.char();
+    if (data == "-") {
+      _addToken(new CharactersToken("-"));
+      state = scriptDataEscapeStartDashState;
+    } else {
+      stream.unget(data);
+      state = scriptDataState;
+    }
+    return true;
+  }
+
+  bool scriptDataEscapeStartDashState() {
+    var data = stream.char();
+    if (data == "-") {
+      _addToken(new CharactersToken("-"));
+      state = scriptDataEscapedDashDashState;
+    } else {
+      stream.unget(data);
+      state = scriptDataState;
+    }
+    return true;
+  }
+
+  bool scriptDataEscapedState() {
+    var data = stream.char();
+    if (data == "-") {
+      _addToken(new CharactersToken("-"));
+      state = scriptDataEscapedDashState;
+    } else if (data == "<") {
+      state = scriptDataEscapedLessThanSignState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      _addToken(new CharactersToken("\uFFFD"));
+    } else if (data == EOF) {
+      state = dataState;
+    } else {
+      var chars = stream.charsUntil("<-\u0000");
+      _addToken(new CharactersToken("${data}${chars}"));
+    }
+    return true;
+  }
+
+  bool scriptDataEscapedDashState() {
+    var data = stream.char();
+    if (data == "-") {
+      _addToken(new CharactersToken("-"));
+      state = scriptDataEscapedDashDashState;
+    } else if (data == "<") {
+      state = scriptDataEscapedLessThanSignState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      _addToken(new CharactersToken("\uFFFD"));
+      state = scriptDataEscapedState;
+    } else if (data == EOF) {
+      state = dataState;
+    } else {
+      _addToken(new CharactersToken(data));
+      state = scriptDataEscapedState;
+    }
+    return true;
+  }
+
+  bool scriptDataEscapedDashDashState() {
+    var data = stream.char();
+    if (data == "-") {
+      _addToken(new CharactersToken("-"));
+    } else if (data == "<") {
+      state = scriptDataEscapedLessThanSignState;
+    } else if (data == ">") {
+      _addToken(new CharactersToken(">"));
+      state = scriptDataState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      _addToken(new CharactersToken("\uFFFD"));
+      state = scriptDataEscapedState;
+    } else if (data == EOF) {
+      state = dataState;
+    } else {
+      _addToken(new CharactersToken(data));
+      state = scriptDataEscapedState;
+    }
+    return true;
+  }
+
+  bool scriptDataEscapedLessThanSignState() {
+    var data = stream.char();
+    if (data == "/") {
+      _buffer.clear();
+      state = scriptDataEscapedEndTagOpenState;
+    } else if (isLetter(data)) {
+      _addToken(new CharactersToken("<$data"));
+      _buffer.clear();
+      _buffer.write(data);
+      state = scriptDataDoubleEscapeStartState;
+    } else {
+      _addToken(new CharactersToken("<"));
+      stream.unget(data);
+      state = scriptDataEscapedState;
+    }
+    return true;
+  }
+
+  bool scriptDataEscapedEndTagOpenState() {
+    var data = stream.char();
+    if (isLetter(data)) {
+      _buffer.clear();
+      _buffer.write(data);
+      state = scriptDataEscapedEndTagNameState;
+    } else {
+      _addToken(new CharactersToken("</"));
+      stream.unget(data);
+      state = scriptDataEscapedState;
+    }
+    return true;
+  }
+
+  bool scriptDataEscapedEndTagNameState() {
+    var appropriate = _tokenIsAppropriate();
+    var data = stream.char();
+    if (isWhitespace(data) && appropriate) {
+      currentToken = new EndTagToken('$_buffer');
+      state = beforeAttributeNameState;
+    } else if (data == "/" && appropriate) {
+      currentToken = new EndTagToken('$_buffer');
+      state = selfClosingStartTagState;
+    } else if (data == ">" && appropriate) {
+      currentToken = new EndTagToken('$_buffer');
+      emitCurrentToken();
+      state = dataState;
+    } else if (isLetter(data)) {
+      _buffer.write(data);
+    } else {
+      _addToken(new CharactersToken("</$_buffer"));
+      stream.unget(data);
+      state = scriptDataEscapedState;
+    }
+    return true;
+  }
+
+  bool scriptDataDoubleEscapeStartState() {
+    var data = stream.char();
+    if (isWhitespace(data) || data == "/" || data == ">") {
+      _addToken(new CharactersToken(data));
+      if ('$_buffer'.toLowerCase() == "script") {
+        state = scriptDataDoubleEscapedState;
+      } else {
+        state = scriptDataEscapedState;
+      }
+    } else if (isLetter(data)) {
+      _addToken(new CharactersToken(data));
+      _buffer.write(data);
+    } else {
+      stream.unget(data);
+      state = scriptDataEscapedState;
+    }
+    return true;
+  }
+
+  bool scriptDataDoubleEscapedState() {
+    var data = stream.char();
+    if (data == "-") {
+      _addToken(new CharactersToken("-"));
+      state = scriptDataDoubleEscapedDashState;
+    } else if (data == "<") {
+      _addToken(new CharactersToken("<"));
+      state = scriptDataDoubleEscapedLessThanSignState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      _addToken(new CharactersToken("\uFFFD"));
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-script-in-script"));
+      state = dataState;
+    } else {
+      _addToken(new CharactersToken(data));
+    }
+    return true;
+  }
+
+  bool scriptDataDoubleEscapedDashState() {
+    var data = stream.char();
+    if (data == "-") {
+      _addToken(new CharactersToken("-"));
+      state = scriptDataDoubleEscapedDashDashState;
+    } else if (data == "<") {
+      _addToken(new CharactersToken("<"));
+      state = scriptDataDoubleEscapedLessThanSignState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      _addToken(new CharactersToken("\uFFFD"));
+      state = scriptDataDoubleEscapedState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-script-in-script"));
+      state = dataState;
+    } else {
+      _addToken(new CharactersToken(data));
+      state = scriptDataDoubleEscapedState;
+    }
+    return true;
+  }
+
+  // TODO(jmesserly): report bug in original code
+  // (was "Dash" instead of "DashDash")
+  bool scriptDataDoubleEscapedDashDashState() {
+    var data = stream.char();
+    if (data == "-") {
+      _addToken(new CharactersToken("-"));
+    } else if (data == "<") {
+      _addToken(new CharactersToken("<"));
+      state = scriptDataDoubleEscapedLessThanSignState;
+    } else if (data == ">") {
+      _addToken(new CharactersToken(">"));
+      state = scriptDataState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      _addToken(new CharactersToken("\uFFFD"));
+      state = scriptDataDoubleEscapedState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-script-in-script"));
+      state = dataState;
+    } else {
+      _addToken(new CharactersToken(data));
+      state = scriptDataDoubleEscapedState;
+    }
+    return true;
+  }
+
+  bool scriptDataDoubleEscapedLessThanSignState() {
+    var data = stream.char();
+    if (data == "/") {
+      _addToken(new CharactersToken("/"));
+      _buffer.clear();
+      state = scriptDataDoubleEscapeEndState;
+    } else {
+      stream.unget(data);
+      state = scriptDataDoubleEscapedState;
+    }
+    return true;
+  }
+
+  bool scriptDataDoubleEscapeEndState() {
+    var data = stream.char();
+    if (isWhitespace(data) || data == "/" || data == ">") {
+      _addToken(new CharactersToken(data));
+      if ('$_buffer'.toLowerCase() == "script") {
+        state = scriptDataEscapedState;
+      } else {
+        state = scriptDataDoubleEscapedState;
+      }
+    } else if (isLetter(data)) {
+      _addToken(new CharactersToken(data));
+      _buffer.write(data);
+    } else {
+      stream.unget(data);
+      state = scriptDataDoubleEscapedState;
+    }
+    return true;
+  }
+
+  bool beforeAttributeNameState() {
+    var data = stream.char();
+    if (isWhitespace(data)) {
+      stream.charsUntil(spaceCharacters, true);
+    } else if (isLetter(data)) {
+      _addAttribute(data);
+      state = attributeNameState;
+    } else if (data == ">") {
+      emitCurrentToken();
+    } else if (data == "/") {
+      state = selfClosingStartTagState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("expected-attribute-name-but-got-eof"));
+      state = dataState;
+    } else if ("'\"=<".contains(data)) {
+      _addToken(new ParseErrorToken("invalid-character-in-attribute-name"));
+      _addAttribute(data);
+      state = attributeNameState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      _addAttribute("\uFFFD");
+      state = attributeNameState;
+    } else {
+      _addAttribute(data);
+      state = attributeNameState;
+    }
+    return true;
+  }
+
+  bool attributeNameState() {
+    var data = stream.char();
+    bool leavingThisState = true;
+    bool emitToken = false;
+    if (data == "=") {
+      state = beforeAttributeValueState;
+    } else if (isLetter(data)) {
+      _attributeName.write(data);
+      _attributeName.write(stream.charsUntil(asciiLetters, true));
+      leavingThisState = false;
+    } else if (data == ">") {
+      // XXX If we emit here the attributes are converted to a dict
+      // without being checked and when the code below runs we error
+      // because data is a dict not a list
+      emitToken = true;
+    } else if (isWhitespace(data)) {
+      state = afterAttributeNameState;
+    } else if (data == "/") {
+      state = selfClosingStartTagState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      _attributeName.write('\uFFFD');
+      leavingThisState = false;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-attribute-name"));
+      state = dataState;
+    } else if ("'\"<".contains(data)) {
+      _addToken(new ParseErrorToken("invalid-character-in-attribute-name"));
+      _attributeName.write(data);
+      leavingThisState = false;
+    } else {
+      _attributeName.write(data);
+      leavingThisState = false;
+    }
+
+    if (leavingThisState) {
+      _markAttributeNameEnd(-1);
+
+      // Attributes are not dropped at this stage. That happens when the
+      // start tag token is emitted so values can still be safely appended
+      // to attributes, but we do want to report the parse error in time.
+      var attrName = _attributeName.toString();
+      if (lowercaseAttrName) {
+        attrName = asciiUpper2Lower(attrName);
+      }
+      _attributes.last.name = attrName;
+      if (_attributeNames == null) _attributeNames = new Set();
+      if (_attributeNames.contains(attrName)) {
+        _addToken(new ParseErrorToken("duplicate-attribute"));
+      }
+      _attributeNames.add(attrName);
+
+      // XXX Fix for above XXX
+      if (emitToken) {
+        emitCurrentToken();
+      }
+    }
+    return true;
+  }
+
+  bool afterAttributeNameState() {
+    var data = stream.char();
+    if (isWhitespace(data)) {
+      stream.charsUntil(spaceCharacters, true);
+    } else if (data == "=") {
+      state = beforeAttributeValueState;
+    } else if (data == ">") {
+      emitCurrentToken();
+    } else if (isLetter(data)) {
+      _addAttribute(data);
+      state = attributeNameState;
+    } else if (data == "/") {
+      state = selfClosingStartTagState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      _addAttribute("\uFFFD");
+      state = attributeNameState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("expected-end-of-tag-but-got-eof"));
+      state = dataState;
+    } else if ("'\"<".contains(data)) {
+      _addToken(new ParseErrorToken("invalid-character-after-attribute-name"));
+      _addAttribute(data);
+      state = attributeNameState;
+    } else {
+      _addAttribute(data);
+      state = attributeNameState;
+    }
+    return true;
+  }
+
+  bool beforeAttributeValueState() {
+    var data = stream.char();
+    if (isWhitespace(data)) {
+      stream.charsUntil(spaceCharacters, true);
+    } else if (data == "\"") {
+      _markAttributeValueStart(0);
+      state = attributeValueDoubleQuotedState;
+    } else if (data == "&") {
+      state = attributeValueUnQuotedState;
+      stream.unget(data);
+      _markAttributeValueStart(0);
+    } else if (data == "'") {
+      _markAttributeValueStart(0);
+      state = attributeValueSingleQuotedState;
+    } else if (data == ">") {
+      _addToken(new ParseErrorToken(
+          "expected-attribute-value-but-got-right-bracket"));
+      emitCurrentToken();
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      _markAttributeValueStart(-1);
+      _attributeValue.write('\uFFFD');
+      state = attributeValueUnQuotedState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("expected-attribute-value-but-got-eof"));
+      state = dataState;
+    } else if ("=<`".contains(data)) {
+      _addToken(new ParseErrorToken("equals-in-unquoted-attribute-value"));
+      _markAttributeValueStart(-1);
+      _attributeValue.write(data);
+      state = attributeValueUnQuotedState;
+    } else {
+      _markAttributeValueStart(-1);
+      _attributeValue.write(data);
+      state = attributeValueUnQuotedState;
+    }
+    return true;
+  }
+
+  bool attributeValueDoubleQuotedState() {
+    var data = stream.char();
+    if (data == "\"") {
+      _markAttributeValueEnd(-1);
+      _markAttributeEnd(0);
+      state = afterAttributeValueState;
+    } else if (data == "&") {
+      processEntityInAttribute('"');
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      _attributeValue.write('\uFFFD');
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-attribute-value-double-quote"));
+      _markAttributeValueEnd(-1);
+      state = dataState;
+    } else {
+      _attributeValue.write(data);
+      _attributeValue.write(stream.charsUntil("\"&"));
+    }
+    return true;
+  }
+
+  bool attributeValueSingleQuotedState() {
+    var data = stream.char();
+    if (data == "'") {
+      _markAttributeValueEnd(-1);
+      _markAttributeEnd(0);
+      state = afterAttributeValueState;
+    } else if (data == "&") {
+      processEntityInAttribute("'");
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      _attributeValue.write('\uFFFD');
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-attribute-value-single-quote"));
+      _markAttributeValueEnd(-1);
+      state = dataState;
+    } else {
+      _attributeValue.write(data);
+      _attributeValue.write(stream.charsUntil("\'&"));
+    }
+    return true;
+  }
+
+  bool attributeValueUnQuotedState() {
+    var data = stream.char();
+    if (isWhitespace(data)) {
+      _markAttributeValueEnd(-1);
+      state = beforeAttributeNameState;
+    } else if (data == "&") {
+      processEntityInAttribute(">");
+    } else if (data == ">") {
+      _markAttributeValueEnd(-1);
+      emitCurrentToken();
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-attribute-value-no-quotes"));
+      _markAttributeValueEnd(-1);
+      state = dataState;
+    } else if ('"\'=<`'.contains(data)) {
+      _addToken(new ParseErrorToken(
+          "unexpected-character-in-unquoted-attribute-value"));
+      _attributeValue.write(data);
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      _attributeValue.write('\uFFFD');
+    } else {
+      _attributeValue.write(data);
+      _attributeValue.write(stream.charsUntil("&>\"\'=<`$spaceCharacters"));
+    }
+    return true;
+  }
+
+  bool afterAttributeValueState() {
+    var data = stream.char();
+    if (isWhitespace(data)) {
+      state = beforeAttributeNameState;
+    } else if (data == ">") {
+      emitCurrentToken();
+    } else if (data == "/") {
+      state = selfClosingStartTagState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("unexpected-EOF-after-attribute-value"));
+      stream.unget(data);
+      state = dataState;
+    } else {
+      _addToken(
+          new ParseErrorToken("unexpected-character-after-attribute-value"));
+      stream.unget(data);
+      state = beforeAttributeNameState;
+    }
+    return true;
+  }
+
+  bool selfClosingStartTagState() {
+    var data = stream.char();
+    if (data == ">") {
+      currentTagToken.selfClosing = true;
+      emitCurrentToken();
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("unexpected-EOF-after-solidus-in-tag"));
+      stream.unget(data);
+      state = dataState;
+    } else {
+      _addToken(
+          new ParseErrorToken("unexpected-character-after-soldius-in-tag"));
+      stream.unget(data);
+      state = beforeAttributeNameState;
+    }
+    return true;
+  }
+
+  bool bogusCommentState() {
+    // Make a new comment token and give it as value all the characters
+    // until the first > or EOF (charsUntil checks for EOF automatically)
+    // and emit it.
+    var data = stream.charsUntil(">");
+    data = data.replaceAll("\u0000", "\uFFFD");
+    _addToken(new CommentToken(data));
+
+    // Eat the character directly after the bogus comment which is either a
+    // ">" or an EOF.
+    stream.char();
+    state = dataState;
+    return true;
+  }
+
+  bool markupDeclarationOpenState() {
+    var charStack = [stream.char()];
+    if (charStack.last == "-") {
+      charStack.add(stream.char());
+      if (charStack.last == "-") {
+        currentToken = new CommentToken();
+        state = commentStartState;
+        return true;
+      }
+    } else if (charStack.last == 'd' || charStack.last == 'D') {
+      var matched = true;
+      for (var expected in const ['oO', 'cC', 'tT', 'yY', 'pP', 'eE']) {
+        var char = stream.char();
+        charStack.add(char);
+        if (char == EOF || !expected.contains(char)) {
+          matched = false;
+          break;
+        }
+      }
+      if (matched) {
+        currentToken = new DoctypeToken(correct: true);
+        state = doctypeState;
+        return true;
+      }
+    } else if (charStack.last == "[" &&
+        parser != null &&
+        parser.tree.openElements.length > 0 &&
+        parser.tree.openElements.last.namespaceUri !=
+            parser.tree.defaultNamespace) {
+      var matched = true;
+      for (var expected in const ["C", "D", "A", "T", "A", "["]) {
+        charStack.add(stream.char());
+        if (charStack.last != expected) {
+          matched = false;
+          break;
+        }
+      }
+      if (matched) {
+        state = cdataSectionState;
+        return true;
+      }
+    }
+
+    _addToken(new ParseErrorToken("expected-dashes-or-doctype"));
+
+    while (charStack.length > 0) {
+      stream.unget(charStack.removeLast());
+    }
+    state = bogusCommentState;
+    return true;
+  }
+
+  bool commentStartState() {
+    var data = stream.char();
+    if (data == "-") {
+      state = commentStartDashState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      currentStringToken.add('\uFFFD');
+    } else if (data == ">") {
+      _addToken(new ParseErrorToken("incorrect-comment"));
+      _addToken(currentToken);
+      state = dataState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-comment"));
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      currentStringToken.add(data);
+      state = commentState;
+    }
+    return true;
+  }
+
+  bool commentStartDashState() {
+    var data = stream.char();
+    if (data == "-") {
+      state = commentEndState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      currentStringToken.add('-\uFFFD');
+    } else if (data == ">") {
+      _addToken(new ParseErrorToken("incorrect-comment"));
+      _addToken(currentToken);
+      state = dataState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-comment"));
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      currentStringToken.add('-').add(data);
+      state = commentState;
+    }
+    return true;
+  }
+
+  bool commentState() {
+    var data = stream.char();
+    if (data == "-") {
+      state = commentEndDashState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      currentStringToken.add('\uFFFD');
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-comment"));
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      currentStringToken.add(data).add(stream.charsUntil("-\u0000"));
+    }
+    return true;
+  }
+
+  bool commentEndDashState() {
+    var data = stream.char();
+    if (data == "-") {
+      state = commentEndState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      currentStringToken.add('-\uFFFD');
+      state = commentState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-comment-end-dash"));
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      currentStringToken.add('-').add(data);
+      state = commentState;
+    }
+    return true;
+  }
+
+  bool commentEndState() {
+    var data = stream.char();
+    if (data == ">") {
+      _addToken(currentToken);
+      state = dataState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      currentStringToken.add('--\uFFFD');
+      state = commentState;
+    } else if (data == "!") {
+      _addToken(
+          new ParseErrorToken("unexpected-bang-after-double-dash-in-comment"));
+      state = commentEndBangState;
+    } else if (data == "-") {
+      _addToken(
+          new ParseErrorToken("unexpected-dash-after-double-dash-in-comment"));
+      currentStringToken.add(data);
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-comment-double-dash"));
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      // XXX
+      _addToken(new ParseErrorToken("unexpected-char-in-comment"));
+      currentStringToken.add('--').add(data);
+      state = commentState;
+    }
+    return true;
+  }
+
+  bool commentEndBangState() {
+    var data = stream.char();
+    if (data == ">") {
+      _addToken(currentToken);
+      state = dataState;
+    } else if (data == "-") {
+      currentStringToken.add('--!');
+      state = commentEndDashState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      currentStringToken.add('--!\uFFFD');
+      state = commentState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-comment-end-bang-state"));
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      currentStringToken.add('--!').add(data);
+      state = commentState;
+    }
+    return true;
+  }
+
+  bool doctypeState() {
+    var data = stream.char();
+    if (isWhitespace(data)) {
+      state = beforeDoctypeNameState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("expected-doctype-name-but-got-eof"));
+      currentDoctypeToken.correct = false;
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      _addToken(new ParseErrorToken("need-space-after-doctype"));
+      stream.unget(data);
+      state = beforeDoctypeNameState;
+    }
+    return true;
+  }
+
+  bool beforeDoctypeNameState() {
+    var data = stream.char();
+    if (isWhitespace(data)) {
+      return true;
+    } else if (data == ">") {
+      _addToken(
+          new ParseErrorToken("expected-doctype-name-but-got-right-bracket"));
+      currentDoctypeToken.correct = false;
+      _addToken(currentToken);
+      state = dataState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      currentDoctypeToken.name = "\uFFFD";
+      state = doctypeNameState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("expected-doctype-name-but-got-eof"));
+      currentDoctypeToken.correct = false;
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      currentDoctypeToken.name = data;
+      state = doctypeNameState;
+    }
+    return true;
+  }
+
+  bool doctypeNameState() {
+    var data = stream.char();
+    if (isWhitespace(data)) {
+      currentDoctypeToken.name = asciiUpper2Lower(currentDoctypeToken.name);
+      state = afterDoctypeNameState;
+    } else if (data == ">") {
+      currentDoctypeToken.name = asciiUpper2Lower(currentDoctypeToken.name);
+      _addToken(currentToken);
+      state = dataState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      currentDoctypeToken.name = "${currentDoctypeToken.name}\uFFFD";
+      state = doctypeNameState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-doctype-name"));
+      currentDoctypeToken.correct = false;
+      currentDoctypeToken.name = asciiUpper2Lower(currentDoctypeToken.name);
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      currentDoctypeToken.name = '${currentDoctypeToken.name}$data';
+    }
+    return true;
+  }
+
+  bool afterDoctypeNameState() {
+    var data = stream.char();
+    if (isWhitespace(data)) {
+      return true;
+    } else if (data == ">") {
+      _addToken(currentToken);
+      state = dataState;
+    } else if (data == EOF) {
+      currentDoctypeToken.correct = false;
+      stream.unget(data);
+      _addToken(new ParseErrorToken("eof-in-doctype"));
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      if (data == "p" || data == "P") {
+        // TODO(jmesserly): would be nice to have a helper for this.
+        var matched = true;
+        for (var expected in const ["uU", "bB", "lL", "iI", "cC"]) {
+          data = stream.char();
+          if (data == EOF || !expected.contains(data)) {
+            matched = false;
+            break;
+          }
+        }
+        if (matched) {
+          state = afterDoctypePublicKeywordState;
+          return true;
+        }
+      } else if (data == "s" || data == "S") {
+        var matched = true;
+        for (var expected in const ["yY", "sS", "tT", "eE", "mM"]) {
+          data = stream.char();
+          if (data == EOF || !expected.contains(data)) {
+            matched = false;
+            break;
+          }
+        }
+        if (matched) {
+          state = afterDoctypeSystemKeywordState;
+          return true;
+        }
+      }
+
+      // All the characters read before the current 'data' will be
+      // [a-zA-Z], so they're garbage in the bogus doctype and can be
+      // discarded; only the latest character might be '>' or EOF
+      // and needs to be ungetted
+      stream.unget(data);
+      _addToken(new ParseErrorToken(
+          "expected-space-or-right-bracket-in-doctype",
+          messageParams: {"data": data}));
+      currentDoctypeToken.correct = false;
+      state = bogusDoctypeState;
+    }
+    return true;
+  }
+
+  bool afterDoctypePublicKeywordState() {
+    var data = stream.char();
+    if (isWhitespace(data)) {
+      state = beforeDoctypePublicIdentifierState;
+    } else if (data == "'" || data == '"') {
+      _addToken(new ParseErrorToken("unexpected-char-in-doctype"));
+      stream.unget(data);
+      state = beforeDoctypePublicIdentifierState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-doctype"));
+      currentDoctypeToken.correct = false;
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      stream.unget(data);
+      state = beforeDoctypePublicIdentifierState;
+    }
+    return true;
+  }
+
+  bool beforeDoctypePublicIdentifierState() {
+    var data = stream.char();
+    if (isWhitespace(data)) {
+      return true;
+    } else if (data == "\"") {
+      currentDoctypeToken.publicId = "";
+      state = doctypePublicIdentifierDoubleQuotedState;
+    } else if (data == "'") {
+      currentDoctypeToken.publicId = "";
+      state = doctypePublicIdentifierSingleQuotedState;
+    } else if (data == ">") {
+      _addToken(new ParseErrorToken("unexpected-end-of-doctype"));
+      currentDoctypeToken.correct = false;
+      _addToken(currentToken);
+      state = dataState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-doctype"));
+      currentDoctypeToken.correct = false;
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      _addToken(new ParseErrorToken("unexpected-char-in-doctype"));
+      currentDoctypeToken.correct = false;
+      state = bogusDoctypeState;
+    }
+    return true;
+  }
+
+  bool doctypePublicIdentifierDoubleQuotedState() {
+    var data = stream.char();
+    if (data == '"') {
+      state = afterDoctypePublicIdentifierState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      currentDoctypeToken.publicId = "${currentDoctypeToken.publicId}\uFFFD";
+    } else if (data == ">") {
+      _addToken(new ParseErrorToken("unexpected-end-of-doctype"));
+      currentDoctypeToken.correct = false;
+      _addToken(currentToken);
+      state = dataState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-doctype"));
+      currentDoctypeToken.correct = false;
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      currentDoctypeToken.publicId = '${currentDoctypeToken.publicId}$data';
+    }
+    return true;
+  }
+
+  bool doctypePublicIdentifierSingleQuotedState() {
+    var data = stream.char();
+    if (data == "'") {
+      state = afterDoctypePublicIdentifierState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      currentDoctypeToken.publicId = "${currentDoctypeToken.publicId}\uFFFD";
+    } else if (data == ">") {
+      _addToken(new ParseErrorToken("unexpected-end-of-doctype"));
+      currentDoctypeToken.correct = false;
+      _addToken(currentToken);
+      state = dataState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-doctype"));
+      currentDoctypeToken.correct = false;
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      currentDoctypeToken.publicId = '${currentDoctypeToken.publicId}$data';
+    }
+    return true;
+  }
+
+  bool afterDoctypePublicIdentifierState() {
+    var data = stream.char();
+    if (isWhitespace(data)) {
+      state = betweenDoctypePublicAndSystemIdentifiersState;
+    } else if (data == ">") {
+      _addToken(currentToken);
+      state = dataState;
+    } else if (data == '"') {
+      _addToken(new ParseErrorToken("unexpected-char-in-doctype"));
+      currentDoctypeToken.systemId = "";
+      state = doctypeSystemIdentifierDoubleQuotedState;
+    } else if (data == "'") {
+      _addToken(new ParseErrorToken("unexpected-char-in-doctype"));
+      currentDoctypeToken.systemId = "";
+      state = doctypeSystemIdentifierSingleQuotedState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-doctype"));
+      currentDoctypeToken.correct = false;
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      _addToken(new ParseErrorToken("unexpected-char-in-doctype"));
+      currentDoctypeToken.correct = false;
+      state = bogusDoctypeState;
+    }
+    return true;
+  }
+
+  bool betweenDoctypePublicAndSystemIdentifiersState() {
+    var data = stream.char();
+    if (isWhitespace(data)) {
+      return true;
+    } else if (data == ">") {
+      _addToken(currentToken);
+      state = dataState;
+    } else if (data == '"') {
+      currentDoctypeToken.systemId = "";
+      state = doctypeSystemIdentifierDoubleQuotedState;
+    } else if (data == "'") {
+      currentDoctypeToken.systemId = "";
+      state = doctypeSystemIdentifierSingleQuotedState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-doctype"));
+      currentDoctypeToken.correct = false;
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      _addToken(new ParseErrorToken("unexpected-char-in-doctype"));
+      currentDoctypeToken.correct = false;
+      state = bogusDoctypeState;
+    }
+    return true;
+  }
+
+  bool afterDoctypeSystemKeywordState() {
+    var data = stream.char();
+    if (isWhitespace(data)) {
+      state = beforeDoctypeSystemIdentifierState;
+    } else if (data == "'" || data == '"') {
+      _addToken(new ParseErrorToken("unexpected-char-in-doctype"));
+      stream.unget(data);
+      state = beforeDoctypeSystemIdentifierState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-doctype"));
+      currentDoctypeToken.correct = false;
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      stream.unget(data);
+      state = beforeDoctypeSystemIdentifierState;
+    }
+    return true;
+  }
+
+  bool beforeDoctypeSystemIdentifierState() {
+    var data = stream.char();
+    if (isWhitespace(data)) {
+      return true;
+    } else if (data == "\"") {
+      currentDoctypeToken.systemId = "";
+      state = doctypeSystemIdentifierDoubleQuotedState;
+    } else if (data == "'") {
+      currentDoctypeToken.systemId = "";
+      state = doctypeSystemIdentifierSingleQuotedState;
+    } else if (data == ">") {
+      _addToken(new ParseErrorToken("unexpected-char-in-doctype"));
+      currentDoctypeToken.correct = false;
+      _addToken(currentToken);
+      state = dataState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-doctype"));
+      currentDoctypeToken.correct = false;
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      _addToken(new ParseErrorToken("unexpected-char-in-doctype"));
+      currentDoctypeToken.correct = false;
+      state = bogusDoctypeState;
+    }
+    return true;
+  }
+
+  bool doctypeSystemIdentifierDoubleQuotedState() {
+    var data = stream.char();
+    if (data == "\"") {
+      state = afterDoctypeSystemIdentifierState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      currentDoctypeToken.systemId = "${currentDoctypeToken.systemId}\uFFFD";
+    } else if (data == ">") {
+      _addToken(new ParseErrorToken("unexpected-end-of-doctype"));
+      currentDoctypeToken.correct = false;
+      _addToken(currentToken);
+      state = dataState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-doctype"));
+      currentDoctypeToken.correct = false;
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      currentDoctypeToken.systemId = '${currentDoctypeToken.systemId}$data';
+    }
+    return true;
+  }
+
+  bool doctypeSystemIdentifierSingleQuotedState() {
+    var data = stream.char();
+    if (data == "'") {
+      state = afterDoctypeSystemIdentifierState;
+    } else if (data == "\u0000") {
+      _addToken(new ParseErrorToken("invalid-codepoint"));
+      currentDoctypeToken.systemId = "${currentDoctypeToken.systemId}\uFFFD";
+    } else if (data == ">") {
+      _addToken(new ParseErrorToken("unexpected-end-of-doctype"));
+      currentDoctypeToken.correct = false;
+      _addToken(currentToken);
+      state = dataState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-doctype"));
+      currentDoctypeToken.correct = false;
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      currentDoctypeToken.systemId = '${currentDoctypeToken.systemId}$data';
+    }
+    return true;
+  }
+
+  bool afterDoctypeSystemIdentifierState() {
+    var data = stream.char();
+    if (isWhitespace(data)) {
+      return true;
+    } else if (data == ">") {
+      _addToken(currentToken);
+      state = dataState;
+    } else if (data == EOF) {
+      _addToken(new ParseErrorToken("eof-in-doctype"));
+      currentDoctypeToken.correct = false;
+      _addToken(currentToken);
+      state = dataState;
+    } else {
+      _addToken(new ParseErrorToken("unexpected-char-in-doctype"));
+      state = bogusDoctypeState;
+    }
+    return true;
+  }
+
+  bool bogusDoctypeState() {
+    var data = stream.char();
+    if (data == ">") {
+      _addToken(currentToken);
+      state = dataState;
+    } else if (data == EOF) {
+      // XXX EMIT
+      stream.unget(data);
+      _addToken(currentToken);
+      state = dataState;
+    }
+    return true;
+  }
+
+  bool cdataSectionState() {
+    var data = [];
+    int matchedEnd = 0;
+    while (true) {
+      var ch = stream.char();
+      if (ch == EOF) {
+        break;
+      }
+      // Deal with null here rather than in the parser
+      if (ch == "\u0000") {
+        _addToken(new ParseErrorToken("invalid-codepoint"));
+        ch = "\uFFFD";
+      }
+      data.add(ch);
+      // TODO(jmesserly): it'd be nice if we had an easier way to match the end,
+      // perhaps with a "peek" API.
+      if (ch == "]" && matchedEnd < 2) {
+        matchedEnd++;
+      } else if (ch == ">" && matchedEnd == 2) {
+        // Remove "]]>" from the end.
+        data.removeLast();
+        data.removeLast();
+        data.removeLast();
+        break;
+      } else {
+        matchedEnd = 0;
+      }
+    }
+
+    if (data.length > 0) {
+      _addToken(new CharactersToken(data.join()));
+    }
+    state = dataState;
+    return true;
+  }
+}
diff --git a/mojo/public/dart/third_party/html/lib/src/treebuilder.dart b/mojo/public/dart/third_party/html/lib/src/treebuilder.dart
new file mode 100644
index 0000000..83e679a
--- /dev/null
+++ b/mojo/public/dart/third_party/html/lib/src/treebuilder.dart
@@ -0,0 +1,408 @@
+/// Internals to the tree builders.
+library treebuilder;
+
+import 'dart:collection';
+import 'package:html/dom.dart';
+import 'package:html/parser.dart' show getElementNameTuple;
+import 'package:source_span/source_span.dart';
+import 'constants.dart';
+import 'list_proxy.dart';
+import 'token.dart';
+import 'utils.dart';
+
+// The scope markers are inserted when entering object elements,
+// marquees, table cells, and table captions, and are used to prevent formatting
+// from "leaking" into tables, object elements, and marquees.
+const Node Marker = null;
+
+// TODO(jmesserly): this should extend ListBase<Element>, but my simple attempt
+// didn't work.
+class ActiveFormattingElements extends ListProxy<Element> {
+  ActiveFormattingElements() : super();
+
+  // Override the "add" method.
+  // TODO(jmesserly): I'd rather not override this; can we do this in the
+  // calling code instead?
+  void add(Element node) {
+    int equalCount = 0;
+    if (node != Marker) {
+      for (var element in reversed) {
+        if (element == Marker) {
+          break;
+        }
+        if (_nodesEqual(element, node)) {
+          equalCount += 1;
+        }
+        if (equalCount == 3) {
+          remove(element);
+          break;
+        }
+      }
+    }
+    super.add(node);
+  }
+}
+
+// TODO(jmesserly): this should exist in corelib...
+bool _mapEquals(Map a, Map b) {
+  if (a.length != b.length) return false;
+  if (a.length == 0) return true;
+
+  for (var keyA in a.keys) {
+    var valB = b[keyA];
+    if (valB == null && !b.containsKey(keyA)) {
+      return false;
+    }
+
+    if (a[keyA] != valB) {
+      return false;
+    }
+  }
+  return true;
+}
+
+bool _nodesEqual(Element node1, Element node2) {
+  return getElementNameTuple(node1) == getElementNameTuple(node2) &&
+      _mapEquals(node1.attributes, node2.attributes);
+}
+
+/// Basic treebuilder implementation.
+class TreeBuilder {
+  final String defaultNamespace;
+
+  Document document;
+
+  final List<Element> openElements = <Element>[];
+
+  final activeFormattingElements = new ActiveFormattingElements();
+
+  Node headPointer;
+
+  Element formPointer;
+
+  /// Switch the function used to insert an element from the
+  /// normal one to the misnested table one and back again
+  bool insertFromTable;
+
+  TreeBuilder(bool namespaceHTMLElements)
+      : defaultNamespace = namespaceHTMLElements ? Namespaces.html : null {
+    reset();
+  }
+
+  void reset() {
+    openElements.clear();
+    activeFormattingElements.clear();
+
+    //XXX - rename these to headElement, formElement
+    headPointer = null;
+    formPointer = null;
+
+    insertFromTable = false;
+
+    document = new Document();
+  }
+
+  bool elementInScope(target, {String variant}) {
+    //If we pass a node in we match that. if we pass a string
+    //match any node with that name
+    bool exactNode = target is Node;
+
+    List listElements1 = scopingElements;
+    List listElements2 = const [];
+    bool invert = false;
+    if (variant != null) {
+      switch (variant) {
+        case "button":
+          listElements2 = const [const Pair(Namespaces.html, "button")];
+          break;
+        case "list":
+          listElements2 = const [
+            const Pair(Namespaces.html, "ol"),
+            const Pair(Namespaces.html, "ul")
+          ];
+          break;
+        case "table":
+          listElements1 = const [
+            const Pair(Namespaces.html, "html"),
+            const Pair(Namespaces.html, "table")
+          ];
+          break;
+        case "select":
+          listElements1 = const [
+            const Pair(Namespaces.html, "optgroup"),
+            const Pair(Namespaces.html, "option")
+          ];
+          invert = true;
+          break;
+        default:
+          throw new StateError('We should never reach this point');
+      }
+    }
+
+    for (var node in openElements.reversed) {
+      if (!exactNode && node.localName == target ||
+          exactNode && node == target) {
+        return true;
+      } else if (invert !=
+          (listElements1.contains(getElementNameTuple(node)) ||
+              listElements2.contains(getElementNameTuple(node)))) {
+        return false;
+      }
+    }
+
+    throw new StateError('We should never reach this point');
+  }
+
+  void reconstructActiveFormattingElements() {
+    // Within this algorithm the order of steps described in the
+    // specification is not quite the same as the order of steps in the
+    // code. It should still do the same though.
+
+    // Step 1: stop the algorithm when there's nothing to do.
+    if (activeFormattingElements.length == 0) {
+      return;
+    }
+
+    // Step 2 and step 3: we start with the last element. So i is -1.
+    int i = activeFormattingElements.length - 1;
+    var entry = activeFormattingElements[i];
+    if (entry == Marker || openElements.contains(entry)) {
+      return;
+    }
+
+    // Step 6
+    while (entry != Marker && !openElements.contains(entry)) {
+      if (i == 0) {
+        //This will be reset to 0 below
+        i = -1;
+        break;
+      }
+      i -= 1;
+      // Step 5: let entry be one earlier in the list.
+      entry = activeFormattingElements[i];
+    }
+
+    while (true) {
+      // Step 7
+      i += 1;
+
+      // Step 8
+      entry = activeFormattingElements[i];
+
+      // TODO(jmesserly): optimize this. No need to create a token.
+      var cloneToken = new StartTagToken(entry.localName,
+          namespace: entry.namespaceUri,
+          data: new LinkedHashMap.from(entry.attributes))
+        ..span = entry.sourceSpan;
+
+      // Step 9
+      var element = insertElement(cloneToken);
+
+      // Step 10
+      activeFormattingElements[i] = element;
+
+      // Step 11
+      if (element == activeFormattingElements.last) {
+        break;
+      }
+    }
+  }
+
+  void clearActiveFormattingElements() {
+    var entry = activeFormattingElements.removeLast();
+    while (activeFormattingElements.length > 0 && entry != Marker) {
+      entry = activeFormattingElements.removeLast();
+    }
+  }
+
+  /// Check if an element exists between the end of the active
+  /// formatting elements and the last marker. If it does, return it, else
+  /// return null.
+  Element elementInActiveFormattingElements(String name) {
+    for (var item in activeFormattingElements.reversed) {
+      // Check for Marker first because if it's a Marker it doesn't have a
+      // name attribute.
+      if (item == Marker) {
+        break;
+      } else if (item.localName == name) {
+        return item;
+      }
+    }
+    return null;
+  }
+
+  void insertRoot(Token token) {
+    var element = createElement(token);
+    openElements.add(element);
+    document.nodes.add(element);
+  }
+
+  void insertDoctype(DoctypeToken token) {
+    var doctype = new DocumentType(token.name, token.publicId, token.systemId)
+      ..sourceSpan = token.span;
+    document.nodes.add(doctype);
+  }
+
+  void insertComment(StringToken token, [Node parent]) {
+    if (parent == null) {
+      parent = openElements.last;
+    }
+    parent.nodes.add(new Comment(token.data)..sourceSpan = token.span);
+  }
+
+  /// Create an element but don't insert it anywhere
+  Element createElement(StartTagToken token) {
+    var name = token.name;
+    var namespace = token.namespace;
+    if (namespace == null) namespace = defaultNamespace;
+    var element = document.createElementNS(namespace, name)
+      ..attributes = token.data
+      ..sourceSpan = token.span;
+    return element;
+  }
+
+  Element insertElement(StartTagToken token) {
+    if (insertFromTable) return insertElementTable(token);
+    return insertElementNormal(token);
+  }
+
+  Element insertElementNormal(StartTagToken token) {
+    var name = token.name;
+    var namespace = token.namespace;
+    if (namespace == null) namespace = defaultNamespace;
+    var element = document.createElementNS(namespace, name)
+      ..attributes = token.data
+      ..sourceSpan = token.span;
+    openElements.last.nodes.add(element);
+    openElements.add(element);
+    return element;
+  }
+
+  Element insertElementTable(token) {
+    /// Create an element and insert it into the tree
+    var element = createElement(token);
+    if (!tableInsertModeElements.contains(openElements.last.localName)) {
+      return insertElementNormal(token);
+    } else {
+      // We should be in the InTable mode. This means we want to do
+      // special magic element rearranging
+      var nodePos = getTableMisnestedNodePosition();
+      if (nodePos[1] == null) {
+        // TODO(jmesserly): I don't think this is reachable. If insertFromTable
+        // is true, there will be a <table> element open, and it always has a
+        // parent pointer.
+        nodePos[0].nodes.add(element);
+      } else {
+        nodePos[0].insertBefore(element, nodePos[1]);
+      }
+      openElements.add(element);
+    }
+    return element;
+  }
+
+  /// Insert text data.
+  void insertText(String data, FileSpan span) {
+    var parent = openElements.last;
+
+    if (!insertFromTable ||
+        insertFromTable &&
+            !tableInsertModeElements.contains(openElements.last.localName)) {
+      _insertText(parent, data, span);
+    } else {
+      // We should be in the InTable mode. This means we want to do
+      // special magic element rearranging
+      var nodePos = getTableMisnestedNodePosition();
+      _insertText(nodePos[0], data, span, nodePos[1]);
+    }
+  }
+
+  /// Insert [data] as text in the current node, positioned before the
+  /// start of node [refNode] or to the end of the node's text.
+  static void _insertText(Node parent, String data, FileSpan span,
+      [Element refNode]) {
+    var nodes = parent.nodes;
+    if (refNode == null) {
+      if (nodes.length > 0 && nodes.last is Text) {
+        Text last = nodes.last;
+        last.appendData(data);
+
+        if (span != null) {
+          last.sourceSpan =
+              span.file.span(last.sourceSpan.start.offset, span.end.offset);
+        }
+      } else {
+        nodes.add(new Text(data)..sourceSpan = span);
+      }
+    } else {
+      int index = nodes.indexOf(refNode);
+      if (index > 0 && nodes[index - 1] is Text) {
+        Text last = nodes[index - 1];
+        last.appendData(data);
+      } else {
+        nodes.insert(index, new Text(data)..sourceSpan = span);
+      }
+    }
+  }
+
+  /// Get the foster parent element, and sibling to insert before
+  /// (or null) when inserting a misnested table node
+  List<Node> getTableMisnestedNodePosition() {
+    // The foster parent element is the one which comes before the most
+    // recently opened table element
+    // XXX - this is really inelegant
+    Node lastTable = null;
+    Node fosterParent = null;
+    var insertBefore = null;
+    for (var elm in openElements.reversed) {
+      if (elm.localName == "table") {
+        lastTable = elm;
+        break;
+      }
+    }
+    if (lastTable != null) {
+      // XXX - we should really check that this parent is actually a
+      // node here
+      if (lastTable.parentNode != null) {
+        fosterParent = lastTable.parentNode;
+        insertBefore = lastTable;
+      } else {
+        fosterParent = openElements[openElements.indexOf(lastTable) - 1];
+      }
+    } else {
+      fosterParent = openElements[0];
+    }
+    return [fosterParent, insertBefore];
+  }
+
+  void generateImpliedEndTags([String exclude]) {
+    var name = openElements.last.localName;
+    // XXX td, th and tr are not actually needed
+    if (name != exclude &&
+        const [
+      "dd",
+      "dt",
+      "li",
+      "option",
+      "optgroup",
+      "p",
+      "rp",
+      "rt"
+    ].contains(name)) {
+      openElements.removeLast();
+      // XXX This is not entirely what the specification says. We should
+      // investigate it more closely.
+      generateImpliedEndTags(exclude);
+    }
+  }
+
+  /// Return the final tree.
+  Document getDocument() => document;
+
+  /// Return the final fragment.
+  DocumentFragment getFragment() {
+    //XXX assert innerHTML
+    var fragment = new DocumentFragment();
+    openElements[0].reparentChildren(fragment);
+    return fragment;
+  }
+}
diff --git a/mojo/public/dart/third_party/html/lib/src/utils.dart b/mojo/public/dart/third_party/html/lib/src/utils.dart
new file mode 100644
index 0000000..fb58cf1
--- /dev/null
+++ b/mojo/public/dart/third_party/html/lib/src/utils.dart
@@ -0,0 +1,123 @@
+/// Misc things that were useful when porting the code from Python.
+library utils;
+
+import 'constants.dart';
+
+typedef bool Predicate();
+
+class Pair<F, S> {
+  final F first;
+  final S second;
+
+  const Pair(this.first, this.second);
+
+  int get hashCode => 37 * first.hashCode + second.hashCode;
+  bool operator ==(other) => other.first == first && other.second == second;
+}
+
+int parseIntRadix(String str, [int radix = 10]) {
+  int val = 0;
+  for (int i = 0; i < str.length; i++) {
+    var digit = str.codeUnitAt(i);
+    if (digit >= LOWER_A) {
+      digit += 10 - LOWER_A;
+    } else if (digit >= UPPER_A) {
+      digit += 10 - UPPER_A;
+    } else {
+      digit -= ZERO;
+    }
+    val = val * radix + digit;
+  }
+  return val;
+}
+
+bool any(List<bool> iterable) => iterable.any((f) => f);
+
+bool startsWithAny(String str, List<String> prefixes) {
+  for (var prefix in prefixes) {
+    if (str.startsWith(prefix)) {
+      return true;
+    }
+  }
+  return false;
+}
+
+// Like the python [:] operator.
+List slice(List list, int start, [int end]) {
+  if (end == null) end = list.length;
+  if (end < 0) end += list.length;
+
+  // Ensure the indexes are in bounds.
+  if (end < start) end = start;
+  if (end > list.length) end = list.length;
+  return list.sublist(start, end);
+}
+
+bool allWhitespace(String str) {
+  for (int i = 0; i < str.length; i++) {
+    if (!isWhitespaceCC(str.codeUnitAt(i))) return false;
+  }
+  return true;
+}
+
+String padWithZeros(String str, int size) {
+  if (str.length == size) return str;
+  var result = new StringBuffer();
+  size -= str.length;
+  for (int i = 0; i < size; i++) result.write('0');
+  result.write(str);
+  return result.toString();
+}
+
+// TODO(jmesserly): this implementation is pretty wrong, but I need something
+// quick until dartbug.com/1694 is fixed.
+/// Format a string like Python's % string format operator. Right now this only
+/// supports a [data] dictionary used with %s or %08x. Those were the only
+/// things needed for [errorMessages].
+String formatStr(String format, Map data) {
+  if (data == null) return format;
+  data.forEach((key, value) {
+    var result = new StringBuffer();
+    var search = '%($key)';
+    int last = 0,
+        match;
+    while ((match = format.indexOf(search, last)) >= 0) {
+      result.write(format.substring(last, match));
+      match += search.length;
+
+      int digits = match;
+      while (isDigit(format[digits])) {
+        digits++;
+      }
+      int numberSize;
+      if (digits > match) {
+        numberSize = int.parse(format.substring(match, digits));
+        match = digits;
+      }
+
+      switch (format[match]) {
+        case 's':
+          result.write(value);
+          break;
+        case 'd':
+          var number = value.toString();
+          result.write(padWithZeros(number, numberSize));
+          break;
+        case 'x':
+          var number = value.toRadixString(16);
+          result.write(padWithZeros(number, numberSize));
+          break;
+        default:
+          throw "not implemented: formatStr does not support format "
+              "character ${format[match]}";
+      }
+
+      last = match + 1;
+    }
+
+    result.write(format.substring(last, format.length));
+    format = result.toString();
+  });
+
+  return format;
+}
diff --git a/mojo/public/dart/third_party/html/pubspec.yaml b/mojo/public/dart/third_party/html/pubspec.yaml
new file mode 100644
index 0000000..15c83c7
--- /dev/null
+++ b/mojo/public/dart/third_party/html/pubspec.yaml
@@ -0,0 +1,14 @@
+name: html
+version: 0.12.2
+author: Dart Team <misc@dartlang.org>
+description: A library for working with HTML documents. Previously known as html5lib.
+homepage: https://github.com/dart-lang/html
+environment:
+  sdk: '>=1.2.0 <2.0.0'
+dependencies:
+  csslib: '>=0.10.0 <0.13.0'
+  source_span: '>=1.0.0 <2.0.0'
+  utf: '>=0.9.0 <0.10.0'
+dev_dependencies:
+  path: '>=0.9.0 <2.0.0'
+  unittest: '>=0.10.0 <0.12.0'
diff --git a/mojo/public/dart/third_party/html/test/data/parser_feature/raw_file.html b/mojo/public/dart/third_party/html/test/data/parser_feature/raw_file.html
new file mode 100644
index 0000000..bcdbf76
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/parser_feature/raw_file.html
@@ -0,0 +1,6 @@
+<!doctype html>
+<html>
+<body>
+Hello world!
+</body>
+</html>
diff --git a/mojo/public/dart/third_party/html/test/data/tokenizer/contentModelFlags.test b/mojo/public/dart/third_party/html/test/data/tokenizer/contentModelFlags.test
new file mode 100644
index 0000000..a8b1695
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tokenizer/contentModelFlags.test
@@ -0,0 +1,75 @@
+{"tests": [
+
+{"description":"PLAINTEXT content model flag",
+"initialStates":["PLAINTEXT state"],
+"lastStartTag":"plaintext",
+"input":"<head>&body;",
+"output":[["Character", "<head>&body;"]]},
+
+{"description":"End tag closing RCDATA or RAWTEXT",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"foo</xmp>",
+"output":[["Character", "foo"], ["EndTag", "xmp"]]},
+
+{"description":"End tag closing RCDATA or RAWTEXT (case-insensitivity)",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"foo</xMp>",
+"output":[["Character", "foo"], ["EndTag", "xmp"]]},
+
+{"description":"End tag closing RCDATA or RAWTEXT (ending with space)",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"foo</xmp ",
+"output":[["Character", "foo"], "ParseError"]},
+
+{"description":"End tag closing RCDATA or RAWTEXT (ending with EOF)",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"foo</xmp",
+"output":[["Character", "foo</xmp"]]},
+
+{"description":"End tag closing RCDATA or RAWTEXT (ending with slash)",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"foo</xmp/",
+"output":[["Character", "foo"], "ParseError"]},
+
+{"description":"End tag not closing RCDATA or RAWTEXT (ending with left-angle-bracket)",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"foo</xmp<",
+"output":[["Character", "foo</xmp<"]]},
+
+{"description":"End tag with incorrect name in RCDATA or RAWTEXT",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"</foo>bar</xmp>",
+"output":[["Character", "</foo>bar"], ["EndTag", "xmp"]]},
+
+{"description":"End tag with incorrect name in RCDATA or RAWTEXT (starting like correct name)",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"</foo>bar</xmpaar>",
+"output":[["Character", "</foo>bar</xmpaar>"]]},
+
+{"description":"End tag closing RCDATA or RAWTEXT, switching back to PCDATA",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"foo</xmp></baz>",
+"output":[["Character", "foo"], ["EndTag", "xmp"], ["EndTag", "baz"]]},
+
+{"description":"RAWTEXT w/ something looking like an entity",
+"initialStates":["RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"&foo;",
+"output":[["Character", "&foo;"]]},
+
+{"description":"RCDATA w/ an entity",
+"initialStates":["RCDATA state"],
+"lastStartTag":"textarea",
+"input":"&lt;",
+"output":[["Character", "<"]]}
+
+]}
diff --git a/mojo/public/dart/third_party/html/test/data/tokenizer/domjs.test b/mojo/public/dart/third_party/html/test/data/tokenizer/domjs.test
new file mode 100644
index 0000000..74771e2
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tokenizer/domjs.test
@@ -0,0 +1,90 @@
+{
+    "tests": [
+        {
+            "description":"CR in bogus comment state",
+            "input":"<?\u000d",
+            "output":["ParseError", ["Comment", "?\u000a"]]
+        },
+        {
+            "description":"CRLF in bogus comment state",
+            "input":"<?\u000d\u000a",
+            "output":["ParseError", ["Comment", "?\u000a"]]
+        },
+        {
+            "description":"NUL in RCDATA and RAWTEXT",
+            "doubleEscaped":true,
+            "initialStates":["RCDATA state", "RAWTEXT state"],
+            "input":"\\u0000",
+            "output":["ParseError", ["Character", "\\uFFFD"]]
+        },
+        {
+            "description":"skip first BOM but not later ones",
+            "input":"\uFEFFfoo\uFEFFbar",
+            "output":[["Character", "foo\uFEFFbar"]]
+        },
+        {
+            "description":"Non BMP-charref in in RCDATA",
+            "initialStates":["RCDATA state"],
+            "input":"&NotEqualTilde;",
+            "output":[["Character", "\u2242\u0338"]]
+        },
+        {
+            "description":"Bad charref in in RCDATA",
+            "initialStates":["RCDATA state"],
+            "input":"&NotEqualTild;",
+            "output":["ParseError", ["Character", "&NotEqualTild;"]]
+        },
+        {
+            "description":"lowercase endtags in RCDATA and RAWTEXT",
+            "initialStates":["RCDATA state", "RAWTEXT state"],
+            "lastStartTag":"xmp",
+            "input":"</XMP>",
+            "output":[["EndTag","xmp"]]
+        },
+        {
+            "description":"bad endtag in RCDATA and RAWTEXT",
+            "initialStates":["RCDATA state", "RAWTEXT state"],
+            "lastStartTag":"xmp",
+            "input":"</ XMP>",
+            "output":[["Character","</ XMP>"]]
+        },
+        {
+            "description":"bad endtag in RCDATA and RAWTEXT",
+            "initialStates":["RCDATA state", "RAWTEXT state"],
+            "lastStartTag":"xmp",
+            "input":"</xm>",
+            "output":[["Character","</xm>"]]
+        },
+        {
+            "description":"bad endtag in RCDATA and RAWTEXT",
+            "initialStates":["RCDATA state", "RAWTEXT state"],
+            "lastStartTag":"xmp",
+            "input":"</xm ",
+            "output":[["Character","</xm "]]
+        },
+        {
+            "description":"bad endtag in RCDATA and RAWTEXT",
+            "initialStates":["RCDATA state", "RAWTEXT state"],
+            "lastStartTag":"xmp",
+            "input":"</xm/",
+            "output":[["Character","</xm/"]]
+        },
+        {
+            "description":"Non BMP-charref in attribute",
+            "input":"<p id=\"&NotEqualTilde;\">",
+            "output":[["StartTag", "p", {"id":"\u2242\u0338"}]]
+        },
+        {
+            "description":"--!NUL in comment ",
+            "doubleEscaped":true,
+            "input":"<!----!\\u0000-->",
+            "output":["ParseError", ["Comment", "--!\\uFFFD"]]
+        },
+        {
+            "description":"space EOF after doctype ",
+            "input":"<!DOCTYPE html ",
+            "output":["ParseError", ["DOCTYPE", "html", null, null , false]]
+        }
+
+    ]
+}
diff --git a/mojo/public/dart/third_party/html/test/data/tokenizer/entities.test b/mojo/public/dart/third_party/html/test/data/tokenizer/entities.test
new file mode 100644
index 0000000..1cb17a7
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tokenizer/entities.test
@@ -0,0 +1,283 @@
+{"tests": [
+
+{"description": "Undefined named entity in attribute value ending in semicolon and whose name starts with a known entity name.",
+"input":"<h a='&noti;'>",
+"output": ["ParseError", ["StartTag", "h", {"a": "&noti;"}]]},
+
+{"description": "Entity name followed by the equals sign in an attribute value.",
+"input":"<h a='&lang='>",
+"output": ["ParseError", ["StartTag", "h", {"a": "&lang="}]]},
+
+{"description": "CR as numeric entity",
+"input":"&#013;",
+"output": ["ParseError", ["Character", "\r"]]},
+
+{"description": "CR as hexadecimal numeric entity",
+"input":"&#x00D;",
+"output": ["ParseError", ["Character", "\r"]]},
+
+{"description": "Windows-1252 EURO SIGN numeric entity.",
+"input":"&#0128;",
+"output": ["ParseError", ["Character", "\u20AC"]]},
+
+{"description": "Windows-1252 REPLACEMENT CHAR numeric entity.",
+"input":"&#0129;",
+"output": ["ParseError", ["Character", "\u0081"]]},
+
+{"description": "Windows-1252 SINGLE LOW-9 QUOTATION MARK numeric entity.",
+"input":"&#0130;",
+"output": ["ParseError", ["Character", "\u201A"]]},
+
+{"description": "Windows-1252 LATIN SMALL LETTER F WITH HOOK numeric entity.",
+"input":"&#0131;",
+"output": ["ParseError", ["Character", "\u0192"]]},
+
+{"description": "Windows-1252 DOUBLE LOW-9 QUOTATION MARK numeric entity.",
+"input":"&#0132;",
+"output": ["ParseError", ["Character", "\u201E"]]},
+
+{"description": "Windows-1252 HORIZONTAL ELLIPSIS numeric entity.",
+"input":"&#0133;",
+"output": ["ParseError", ["Character", "\u2026"]]},
+
+{"description": "Windows-1252 DAGGER numeric entity.",
+"input":"&#0134;",
+"output": ["ParseError", ["Character", "\u2020"]]},
+
+{"description": "Windows-1252 DOUBLE DAGGER numeric entity.",
+"input":"&#0135;",
+"output": ["ParseError", ["Character", "\u2021"]]},
+
+{"description": "Windows-1252 MODIFIER LETTER CIRCUMFLEX ACCENT numeric entity.",
+"input":"&#0136;",
+"output": ["ParseError", ["Character", "\u02C6"]]},
+
+{"description": "Windows-1252 PER MILLE SIGN numeric entity.",
+"input":"&#0137;",
+"output": ["ParseError", ["Character", "\u2030"]]},
+
+{"description": "Windows-1252 LATIN CAPITAL LETTER S WITH CARON numeric entity.",
+"input":"&#0138;",
+"output": ["ParseError", ["Character", "\u0160"]]},
+
+{"description": "Windows-1252 SINGLE LEFT-POINTING ANGLE QUOTATION MARK numeric entity.",
+"input":"&#0139;",
+"output": ["ParseError", ["Character", "\u2039"]]},
+
+{"description": "Windows-1252 LATIN CAPITAL LIGATURE OE numeric entity.",
+"input":"&#0140;",
+"output": ["ParseError", ["Character", "\u0152"]]},
+
+{"description": "Windows-1252 REPLACEMENT CHAR numeric entity.",
+"input":"&#0141;",
+"output": ["ParseError", ["Character", "\u008D"]]},
+
+{"description": "Windows-1252 LATIN CAPITAL LETTER Z WITH CARON numeric entity.",
+"input":"&#0142;",
+"output": ["ParseError", ["Character", "\u017D"]]},
+
+{"description": "Windows-1252 REPLACEMENT CHAR numeric entity.",
+"input":"&#0143;",
+"output": ["ParseError", ["Character", "\u008F"]]},
+
+{"description": "Windows-1252 REPLACEMENT CHAR numeric entity.",
+"input":"&#0144;",
+"output": ["ParseError", ["Character", "\u0090"]]},
+
+{"description": "Windows-1252 LEFT SINGLE QUOTATION MARK numeric entity.",
+"input":"&#0145;",
+"output": ["ParseError", ["Character", "\u2018"]]},
+
+{"description": "Windows-1252 RIGHT SINGLE QUOTATION MARK numeric entity.",
+"input":"&#0146;",
+"output": ["ParseError", ["Character", "\u2019"]]},
+
+{"description": "Windows-1252 LEFT DOUBLE QUOTATION MARK numeric entity.",
+"input":"&#0147;",
+"output": ["ParseError", ["Character", "\u201C"]]},
+
+{"description": "Windows-1252 RIGHT DOUBLE QUOTATION MARK numeric entity.",
+"input":"&#0148;",
+"output": ["ParseError", ["Character", "\u201D"]]},
+
+{"description": "Windows-1252 BULLET numeric entity.",
+"input":"&#0149;",
+"output": ["ParseError", ["Character", "\u2022"]]},
+
+{"description": "Windows-1252 EN DASH numeric entity.",
+"input":"&#0150;",
+"output": ["ParseError", ["Character", "\u2013"]]},
+
+{"description": "Windows-1252 EM DASH numeric entity.",
+"input":"&#0151;",
+"output": ["ParseError", ["Character", "\u2014"]]},
+
+{"description": "Windows-1252 SMALL TILDE numeric entity.",
+"input":"&#0152;",
+"output": ["ParseError", ["Character", "\u02DC"]]},
+
+{"description": "Windows-1252 TRADE MARK SIGN numeric entity.",
+"input":"&#0153;",
+"output": ["ParseError", ["Character", "\u2122"]]},
+
+{"description": "Windows-1252 LATIN SMALL LETTER S WITH CARON numeric entity.",
+"input":"&#0154;",
+"output": ["ParseError", ["Character", "\u0161"]]},
+
+{"description": "Windows-1252 SINGLE RIGHT-POINTING ANGLE QUOTATION MARK numeric entity.",
+"input":"&#0155;",
+"output": ["ParseError", ["Character", "\u203A"]]},
+
+{"description": "Windows-1252 LATIN SMALL LIGATURE OE numeric entity.",
+"input":"&#0156;",
+"output": ["ParseError", ["Character", "\u0153"]]},
+
+{"description": "Windows-1252 REPLACEMENT CHAR numeric entity.",
+"input":"&#0157;",
+"output": ["ParseError", ["Character", "\u009D"]]},
+
+{"description": "Windows-1252 EURO SIGN hexadecimal numeric entity.",
+"input":"&#x080;",
+"output": ["ParseError", ["Character", "\u20AC"]]},
+
+{"description": "Windows-1252 REPLACEMENT CHAR hexadecimal numeric entity.",
+"input":"&#x081;",
+"output": ["ParseError", ["Character", "\u0081"]]},
+
+{"description": "Windows-1252 SINGLE LOW-9 QUOTATION MARK hexadecimal numeric entity.",
+"input":"&#x082;",
+"output": ["ParseError", ["Character", "\u201A"]]},
+
+{"description": "Windows-1252 LATIN SMALL LETTER F WITH HOOK hexadecimal numeric entity.",
+"input":"&#x083;",
+"output": ["ParseError", ["Character", "\u0192"]]},
+
+{"description": "Windows-1252 DOUBLE LOW-9 QUOTATION MARK hexadecimal numeric entity.",
+"input":"&#x084;",
+"output": ["ParseError", ["Character", "\u201E"]]},
+
+{"description": "Windows-1252 HORIZONTAL ELLIPSIS hexadecimal numeric entity.",
+"input":"&#x085;",
+"output": ["ParseError", ["Character", "\u2026"]]},
+
+{"description": "Windows-1252 DAGGER hexadecimal numeric entity.",
+"input":"&#x086;",
+"output": ["ParseError", ["Character", "\u2020"]]},
+
+{"description": "Windows-1252 DOUBLE DAGGER hexadecimal numeric entity.",
+"input":"&#x087;",
+"output": ["ParseError", ["Character", "\u2021"]]},
+
+{"description": "Windows-1252 MODIFIER LETTER CIRCUMFLEX ACCENT hexadecimal numeric entity.",
+"input":"&#x088;",
+"output": ["ParseError", ["Character", "\u02C6"]]},
+
+{"description": "Windows-1252 PER MILLE SIGN hexadecimal numeric entity.",
+"input":"&#x089;",
+"output": ["ParseError", ["Character", "\u2030"]]},
+
+{"description": "Windows-1252 LATIN CAPITAL LETTER S WITH CARON hexadecimal numeric entity.",
+"input":"&#x08A;",
+"output": ["ParseError", ["Character", "\u0160"]]},
+
+{"description": "Windows-1252 SINGLE LEFT-POINTING ANGLE QUOTATION MARK hexadecimal numeric entity.",
+"input":"&#x08B;",
+"output": ["ParseError", ["Character", "\u2039"]]},
+
+{"description": "Windows-1252 LATIN CAPITAL LIGATURE OE hexadecimal numeric entity.",
+"input":"&#x08C;",
+"output": ["ParseError", ["Character", "\u0152"]]},
+
+{"description": "Windows-1252 REPLACEMENT CHAR hexadecimal numeric entity.",
+"input":"&#x08D;",
+"output": ["ParseError", ["Character", "\u008D"]]},
+
+{"description": "Windows-1252 LATIN CAPITAL LETTER Z WITH CARON hexadecimal numeric entity.",
+"input":"&#x08E;",
+"output": ["ParseError", ["Character", "\u017D"]]},
+
+{"description": "Windows-1252 REPLACEMENT CHAR hexadecimal numeric entity.",
+"input":"&#x08F;",
+"output": ["ParseError", ["Character", "\u008F"]]},
+
+{"description": "Windows-1252 REPLACEMENT CHAR hexadecimal numeric entity.",
+"input":"&#x090;",
+"output": ["ParseError", ["Character", "\u0090"]]},
+
+{"description": "Windows-1252 LEFT SINGLE QUOTATION MARK hexadecimal numeric entity.",
+"input":"&#x091;",
+"output": ["ParseError", ["Character", "\u2018"]]},
+
+{"description": "Windows-1252 RIGHT SINGLE QUOTATION MARK hexadecimal numeric entity.",
+"input":"&#x092;",
+"output": ["ParseError", ["Character", "\u2019"]]},
+
+{"description": "Windows-1252 LEFT DOUBLE QUOTATION MARK hexadecimal numeric entity.",
+"input":"&#x093;",
+"output": ["ParseError", ["Character", "\u201C"]]},
+
+{"description": "Windows-1252 RIGHT DOUBLE QUOTATION MARK hexadecimal numeric entity.",
+"input":"&#x094;",
+"output": ["ParseError", ["Character", "\u201D"]]},
+
+{"description": "Windows-1252 BULLET hexadecimal numeric entity.",
+"input":"&#x095;",
+"output": ["ParseError", ["Character", "\u2022"]]},
+
+{"description": "Windows-1252 EN DASH hexadecimal numeric entity.",
+"input":"&#x096;",
+"output": ["ParseError", ["Character", "\u2013"]]},
+
+{"description": "Windows-1252 EM DASH hexadecimal numeric entity.",
+"input":"&#x097;",
+"output": ["ParseError", ["Character", "\u2014"]]},
+
+{"description": "Windows-1252 SMALL TILDE hexadecimal numeric entity.",
+"input":"&#x098;",
+"output": ["ParseError", ["Character", "\u02DC"]]},
+
+{"description": "Windows-1252 TRADE MARK SIGN hexadecimal numeric entity.",
+"input":"&#x099;",
+"output": ["ParseError", ["Character", "\u2122"]]},
+
+{"description": "Windows-1252 LATIN SMALL LETTER S WITH CARON hexadecimal numeric entity.",
+"input":"&#x09A;",
+"output": ["ParseError", ["Character", "\u0161"]]},
+
+{"description": "Windows-1252 SINGLE RIGHT-POINTING ANGLE QUOTATION MARK hexadecimal numeric entity.",
+"input":"&#x09B;",
+"output": ["ParseError", ["Character", "\u203A"]]},
+
+{"description": "Windows-1252 LATIN SMALL LIGATURE OE hexadecimal numeric entity.",
+"input":"&#x09C;",
+"output": ["ParseError", ["Character", "\u0153"]]},
+
+{"description": "Windows-1252 REPLACEMENT CHAR hexadecimal numeric entity.",
+"input":"&#x09D;",
+"output": ["ParseError", ["Character", "\u009D"]]},
+
+{"description": "Windows-1252 LATIN SMALL LETTER Z WITH CARON hexadecimal numeric entity.",
+"input":"&#x09E;",
+"output": ["ParseError", ["Character", "\u017E"]]},
+
+{"description": "Windows-1252 LATIN CAPITAL LETTER Y WITH DIAERESIS hexadecimal numeric entity.",
+"input":"&#x09F;",
+"output": ["ParseError", ["Character", "\u0178"]]},
+
+{"description": "Decimal numeric entity followed by hex character a.",
+"input":"&#97a",
+"output": ["ParseError", ["Character", "aa"]]},
+
+{"description": "Decimal numeric entity followed by hex character A.",
+"input":"&#97A",
+"output": ["ParseError", ["Character", "aA"]]},
+
+{"description": "Decimal numeric entity followed by hex character f.",
+"input":"&#97f",
+"output": ["ParseError", ["Character", "af"]]},
+
+{"description": "Decimal numeric entity followed by hex character A.",
+"input":"&#97F",
+"output": ["ParseError", ["Character", "aF"]]}
+
+]}
diff --git a/mojo/public/dart/third_party/html/test/data/tokenizer/escapeFlag.test b/mojo/public/dart/third_party/html/test/data/tokenizer/escapeFlag.test
new file mode 100644
index 0000000..18cb430
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tokenizer/escapeFlag.test
@@ -0,0 +1,33 @@
+{"tests": [
+
+{"description":"Commented close tag in RCDATA or RAWTEXT",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"foo<!--</xmp>--></xmp>",
+"output":[["Character", "foo<!--"], ["EndTag", "xmp"], ["Character", "-->"], ["EndTag", "xmp"]]},
+
+{"description":"Bogus comment in RCDATA or RAWTEXT",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"foo<!-->baz</xmp>",
+"output":[["Character", "foo<!-->baz"], ["EndTag", "xmp"]]},
+
+{"description":"End tag surrounded by bogus comment in RCDATA or RAWTEXT",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"foo<!--></xmp><!-->baz</xmp>",
+"output":[["Character", "foo<!-->"], ["EndTag", "xmp"], "ParseError", ["Comment", ""], ["Character", "baz"], ["EndTag", "xmp"]]},
+
+{"description":"Commented entities in RCDATA",
+"initialStates":["RCDATA state"],
+"lastStartTag":"xmp",
+"input":" &amp; <!-- &amp; --> &amp; </xmp>",
+"output":[["Character", " & <!-- & --> & "], ["EndTag", "xmp"]]},
+
+{"description":"Incorrect comment ending sequences in RCDATA or RAWTEXT",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"foo<!-- x --x>x-- >x--!>x--<></xmp>",
+"output":[["Character", "foo<!-- x --x>x-- >x--!>x--<>"], ["EndTag", "xmp"]]}
+
+]}
diff --git a/mojo/public/dart/third_party/html/test/data/tokenizer/namedEntities.test b/mojo/public/dart/third_party/html/test/data/tokenizer/namedEntities.test
new file mode 100644
index 0000000..4a51c9c
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tokenizer/namedEntities.test
@@ -0,0 +1,44189 @@
+{
+    "tests": [
+        {
+            "input": "&AElig", 
+            "description": "Named entity: AElig without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00c6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&AElig;", 
+            "description": "Named entity: AElig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&AMP", 
+            "description": "Named entity: AMP without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&"
+                ]
+            ]
+        }, 
+        {
+            "input": "&AMP;", 
+            "description": "Named entity: AMP; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Aacute", 
+            "description": "Named entity: Aacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00c1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Aacute;", 
+            "description": "Named entity: Aacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Abreve", 
+            "description": "Bad named entity: Abreve without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Abreve"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Abreve;", 
+            "description": "Named entity: Abreve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0102"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Acirc", 
+            "description": "Named entity: Acirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Acirc;", 
+            "description": "Named entity: Acirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Acy", 
+            "description": "Bad named entity: Acy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Acy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Acy;", 
+            "description": "Named entity: Acy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0410"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Afr", 
+            "description": "Bad named entity: Afr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Afr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Afr;", 
+            "description": "Named entity: Afr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd04"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Agrave", 
+            "description": "Named entity: Agrave without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00c0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Agrave;", 
+            "description": "Named entity: Agrave; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Alpha", 
+            "description": "Bad named entity: Alpha without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Alpha"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Alpha;", 
+            "description": "Named entity: Alpha; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0391"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Amacr", 
+            "description": "Bad named entity: Amacr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Amacr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Amacr;", 
+            "description": "Named entity: Amacr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0100"
+                ]
+            ]
+        }, 
+        {
+            "input": "&And", 
+            "description": "Bad named entity: And without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&And"
+                ]
+            ]
+        }, 
+        {
+            "input": "&And;", 
+            "description": "Named entity: And; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a53"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Aogon", 
+            "description": "Bad named entity: Aogon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Aogon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Aogon;", 
+            "description": "Named entity: Aogon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0104"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Aopf", 
+            "description": "Bad named entity: Aopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Aopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Aopf;", 
+            "description": "Named entity: Aopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd38"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ApplyFunction", 
+            "description": "Bad named entity: ApplyFunction without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ApplyFunction"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ApplyFunction;", 
+            "description": "Named entity: ApplyFunction; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2061"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Aring", 
+            "description": "Named entity: Aring without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00c5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Aring;", 
+            "description": "Named entity: Aring; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ascr", 
+            "description": "Bad named entity: Ascr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Ascr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ascr;", 
+            "description": "Named entity: Ascr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udc9c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Assign", 
+            "description": "Bad named entity: Assign without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Assign"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Assign;", 
+            "description": "Named entity: Assign; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2254"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Atilde", 
+            "description": "Named entity: Atilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Atilde;", 
+            "description": "Named entity: Atilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Auml", 
+            "description": "Named entity: Auml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00c4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Auml;", 
+            "description": "Named entity: Auml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Backslash", 
+            "description": "Bad named entity: Backslash without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Backslash"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Backslash;", 
+            "description": "Named entity: Backslash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2216"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Barv", 
+            "description": "Bad named entity: Barv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Barv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Barv;", 
+            "description": "Named entity: Barv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ae7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Barwed", 
+            "description": "Bad named entity: Barwed without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Barwed"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Barwed;", 
+            "description": "Named entity: Barwed; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2306"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Bcy", 
+            "description": "Bad named entity: Bcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Bcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Bcy;", 
+            "description": "Named entity: Bcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0411"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Because", 
+            "description": "Bad named entity: Because without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Because"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Because;", 
+            "description": "Named entity: Because; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2235"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Bernoullis", 
+            "description": "Bad named entity: Bernoullis without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Bernoullis"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Bernoullis;", 
+            "description": "Named entity: Bernoullis; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u212c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Beta", 
+            "description": "Bad named entity: Beta without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Beta"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Beta;", 
+            "description": "Named entity: Beta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0392"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Bfr", 
+            "description": "Bad named entity: Bfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Bfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Bfr;", 
+            "description": "Named entity: Bfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd05"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Bopf", 
+            "description": "Bad named entity: Bopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Bopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Bopf;", 
+            "description": "Named entity: Bopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd39"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Breve", 
+            "description": "Bad named entity: Breve without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Breve"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Breve;", 
+            "description": "Named entity: Breve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02d8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Bscr", 
+            "description": "Bad named entity: Bscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Bscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Bscr;", 
+            "description": "Named entity: Bscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u212c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Bumpeq", 
+            "description": "Bad named entity: Bumpeq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Bumpeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Bumpeq;", 
+            "description": "Named entity: Bumpeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CHcy", 
+            "description": "Bad named entity: CHcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&CHcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CHcy;", 
+            "description": "Named entity: CHcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0427"
+                ]
+            ]
+        }, 
+        {
+            "input": "&COPY", 
+            "description": "Named entity: COPY without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&COPY;", 
+            "description": "Named entity: COPY; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cacute", 
+            "description": "Bad named entity: Cacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Cacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cacute;", 
+            "description": "Named entity: Cacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0106"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cap", 
+            "description": "Bad named entity: Cap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Cap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cap;", 
+            "description": "Named entity: Cap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CapitalDifferentialD", 
+            "description": "Bad named entity: CapitalDifferentialD without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&CapitalDifferentialD"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CapitalDifferentialD;", 
+            "description": "Named entity: CapitalDifferentialD; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2145"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cayleys", 
+            "description": "Bad named entity: Cayleys without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Cayleys"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cayleys;", 
+            "description": "Named entity: Cayleys; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u212d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ccaron", 
+            "description": "Bad named entity: Ccaron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Ccaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ccaron;", 
+            "description": "Named entity: Ccaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u010c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ccedil", 
+            "description": "Named entity: Ccedil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00c7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ccedil;", 
+            "description": "Named entity: Ccedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ccirc", 
+            "description": "Bad named entity: Ccirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Ccirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ccirc;", 
+            "description": "Named entity: Ccirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0108"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cconint", 
+            "description": "Bad named entity: Cconint without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Cconint"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cconint;", 
+            "description": "Named entity: Cconint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2230"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cdot", 
+            "description": "Bad named entity: Cdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Cdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cdot;", 
+            "description": "Named entity: Cdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u010a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cedilla", 
+            "description": "Bad named entity: Cedilla without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Cedilla"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cedilla;", 
+            "description": "Named entity: Cedilla; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CenterDot", 
+            "description": "Bad named entity: CenterDot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&CenterDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CenterDot;", 
+            "description": "Named entity: CenterDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cfr", 
+            "description": "Bad named entity: Cfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Cfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cfr;", 
+            "description": "Named entity: Cfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u212d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Chi", 
+            "description": "Bad named entity: Chi without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Chi"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Chi;", 
+            "description": "Named entity: Chi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03a7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CircleDot", 
+            "description": "Bad named entity: CircleDot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&CircleDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CircleDot;", 
+            "description": "Named entity: CircleDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2299"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CircleMinus", 
+            "description": "Bad named entity: CircleMinus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&CircleMinus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CircleMinus;", 
+            "description": "Named entity: CircleMinus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2296"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CirclePlus", 
+            "description": "Bad named entity: CirclePlus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&CirclePlus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CirclePlus;", 
+            "description": "Named entity: CirclePlus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2295"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CircleTimes", 
+            "description": "Bad named entity: CircleTimes without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&CircleTimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CircleTimes;", 
+            "description": "Named entity: CircleTimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2297"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ClockwiseContourIntegral", 
+            "description": "Bad named entity: ClockwiseContourIntegral without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ClockwiseContourIntegral"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ClockwiseContourIntegral;", 
+            "description": "Named entity: ClockwiseContourIntegral; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2232"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CloseCurlyDoubleQuote", 
+            "description": "Bad named entity: CloseCurlyDoubleQuote without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&CloseCurlyDoubleQuote"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CloseCurlyDoubleQuote;", 
+            "description": "Named entity: CloseCurlyDoubleQuote; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u201d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CloseCurlyQuote", 
+            "description": "Bad named entity: CloseCurlyQuote without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&CloseCurlyQuote"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CloseCurlyQuote;", 
+            "description": "Named entity: CloseCurlyQuote; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2019"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Colon", 
+            "description": "Bad named entity: Colon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Colon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Colon;", 
+            "description": "Named entity: Colon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2237"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Colone", 
+            "description": "Bad named entity: Colone without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Colone"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Colone;", 
+            "description": "Named entity: Colone; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a74"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Congruent", 
+            "description": "Bad named entity: Congruent without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Congruent"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Congruent;", 
+            "description": "Named entity: Congruent; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2261"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Conint", 
+            "description": "Bad named entity: Conint without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Conint"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Conint;", 
+            "description": "Named entity: Conint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ContourIntegral", 
+            "description": "Bad named entity: ContourIntegral without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ContourIntegral"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ContourIntegral;", 
+            "description": "Named entity: ContourIntegral; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Copf", 
+            "description": "Bad named entity: Copf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Copf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Copf;", 
+            "description": "Named entity: Copf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2102"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Coproduct", 
+            "description": "Bad named entity: Coproduct without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Coproduct"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Coproduct;", 
+            "description": "Named entity: Coproduct; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2210"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CounterClockwiseContourIntegral", 
+            "description": "Bad named entity: CounterClockwiseContourIntegral without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&CounterClockwiseContourIntegral"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CounterClockwiseContourIntegral;", 
+            "description": "Named entity: CounterClockwiseContourIntegral; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2233"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cross", 
+            "description": "Bad named entity: Cross without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Cross"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cross;", 
+            "description": "Named entity: Cross; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a2f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cscr", 
+            "description": "Bad named entity: Cscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Cscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cscr;", 
+            "description": "Named entity: Cscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udc9e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cup", 
+            "description": "Bad named entity: Cup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Cup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cup;", 
+            "description": "Named entity: Cup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CupCap", 
+            "description": "Bad named entity: CupCap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&CupCap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CupCap;", 
+            "description": "Named entity: CupCap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DD", 
+            "description": "Bad named entity: DD without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DD"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DD;", 
+            "description": "Named entity: DD; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2145"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DDotrahd", 
+            "description": "Bad named entity: DDotrahd without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DDotrahd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DDotrahd;", 
+            "description": "Named entity: DDotrahd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2911"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DJcy", 
+            "description": "Bad named entity: DJcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DJcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DJcy;", 
+            "description": "Named entity: DJcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0402"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DScy", 
+            "description": "Bad named entity: DScy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DScy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DScy;", 
+            "description": "Named entity: DScy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0405"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DZcy", 
+            "description": "Bad named entity: DZcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DZcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DZcy;", 
+            "description": "Named entity: DZcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u040f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dagger", 
+            "description": "Bad named entity: Dagger without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Dagger"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dagger;", 
+            "description": "Named entity: Dagger; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2021"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Darr", 
+            "description": "Bad named entity: Darr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Darr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Darr;", 
+            "description": "Named entity: Darr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dashv", 
+            "description": "Bad named entity: Dashv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Dashv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dashv;", 
+            "description": "Named entity: Dashv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ae4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dcaron", 
+            "description": "Bad named entity: Dcaron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Dcaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dcaron;", 
+            "description": "Named entity: Dcaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u010e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dcy", 
+            "description": "Bad named entity: Dcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Dcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dcy;", 
+            "description": "Named entity: Dcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0414"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Del", 
+            "description": "Bad named entity: Del without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Del"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Del;", 
+            "description": "Named entity: Del; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2207"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Delta", 
+            "description": "Bad named entity: Delta without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Delta"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Delta;", 
+            "description": "Named entity: Delta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0394"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dfr", 
+            "description": "Bad named entity: Dfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Dfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dfr;", 
+            "description": "Named entity: Dfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd07"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DiacriticalAcute", 
+            "description": "Bad named entity: DiacriticalAcute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DiacriticalAcute"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DiacriticalAcute;", 
+            "description": "Named entity: DiacriticalAcute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DiacriticalDot", 
+            "description": "Bad named entity: DiacriticalDot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DiacriticalDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DiacriticalDot;", 
+            "description": "Named entity: DiacriticalDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02d9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DiacriticalDoubleAcute", 
+            "description": "Bad named entity: DiacriticalDoubleAcute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DiacriticalDoubleAcute"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DiacriticalDoubleAcute;", 
+            "description": "Named entity: DiacriticalDoubleAcute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02dd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DiacriticalGrave", 
+            "description": "Bad named entity: DiacriticalGrave without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DiacriticalGrave"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DiacriticalGrave;", 
+            "description": "Named entity: DiacriticalGrave; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "`"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DiacriticalTilde", 
+            "description": "Bad named entity: DiacriticalTilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DiacriticalTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DiacriticalTilde;", 
+            "description": "Named entity: DiacriticalTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02dc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Diamond", 
+            "description": "Bad named entity: Diamond without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Diamond"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Diamond;", 
+            "description": "Named entity: Diamond; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DifferentialD", 
+            "description": "Bad named entity: DifferentialD without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DifferentialD"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DifferentialD;", 
+            "description": "Named entity: DifferentialD; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2146"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dopf", 
+            "description": "Bad named entity: Dopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Dopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dopf;", 
+            "description": "Named entity: Dopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd3b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dot", 
+            "description": "Bad named entity: Dot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Dot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dot;", 
+            "description": "Named entity: Dot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DotDot", 
+            "description": "Bad named entity: DotDot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DotDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DotDot;", 
+            "description": "Named entity: DotDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u20dc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DotEqual", 
+            "description": "Bad named entity: DotEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DotEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DotEqual;", 
+            "description": "Named entity: DotEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2250"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleContourIntegral", 
+            "description": "Bad named entity: DoubleContourIntegral without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DoubleContourIntegral"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleContourIntegral;", 
+            "description": "Named entity: DoubleContourIntegral; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleDot", 
+            "description": "Bad named entity: DoubleDot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DoubleDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleDot;", 
+            "description": "Named entity: DoubleDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleDownArrow", 
+            "description": "Bad named entity: DoubleDownArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DoubleDownArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleDownArrow;", 
+            "description": "Named entity: DoubleDownArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleLeftArrow", 
+            "description": "Bad named entity: DoubleLeftArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DoubleLeftArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleLeftArrow;", 
+            "description": "Named entity: DoubleLeftArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleLeftRightArrow", 
+            "description": "Bad named entity: DoubleLeftRightArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DoubleLeftRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleLeftRightArrow;", 
+            "description": "Named entity: DoubleLeftRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleLeftTee", 
+            "description": "Bad named entity: DoubleLeftTee without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DoubleLeftTee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleLeftTee;", 
+            "description": "Named entity: DoubleLeftTee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ae4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleLongLeftArrow", 
+            "description": "Bad named entity: DoubleLongLeftArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DoubleLongLeftArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleLongLeftArrow;", 
+            "description": "Named entity: DoubleLongLeftArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleLongLeftRightArrow", 
+            "description": "Bad named entity: DoubleLongLeftRightArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DoubleLongLeftRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleLongLeftRightArrow;", 
+            "description": "Named entity: DoubleLongLeftRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27fa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleLongRightArrow", 
+            "description": "Bad named entity: DoubleLongRightArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DoubleLongRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleLongRightArrow;", 
+            "description": "Named entity: DoubleLongRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleRightArrow", 
+            "description": "Bad named entity: DoubleRightArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DoubleRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleRightArrow;", 
+            "description": "Named entity: DoubleRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleRightTee", 
+            "description": "Bad named entity: DoubleRightTee without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DoubleRightTee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleRightTee;", 
+            "description": "Named entity: DoubleRightTee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleUpArrow", 
+            "description": "Bad named entity: DoubleUpArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DoubleUpArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleUpArrow;", 
+            "description": "Named entity: DoubleUpArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleUpDownArrow", 
+            "description": "Bad named entity: DoubleUpDownArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DoubleUpDownArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleUpDownArrow;", 
+            "description": "Named entity: DoubleUpDownArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleVerticalBar", 
+            "description": "Bad named entity: DoubleVerticalBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DoubleVerticalBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleVerticalBar;", 
+            "description": "Named entity: DoubleVerticalBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2225"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownArrow", 
+            "description": "Bad named entity: DownArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DownArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownArrow;", 
+            "description": "Named entity: DownArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2193"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownArrowBar", 
+            "description": "Bad named entity: DownArrowBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DownArrowBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownArrowBar;", 
+            "description": "Named entity: DownArrowBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2913"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownArrowUpArrow", 
+            "description": "Bad named entity: DownArrowUpArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DownArrowUpArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownArrowUpArrow;", 
+            "description": "Named entity: DownArrowUpArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownBreve", 
+            "description": "Bad named entity: DownBreve without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DownBreve"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownBreve;", 
+            "description": "Named entity: DownBreve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0311"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownLeftRightVector", 
+            "description": "Bad named entity: DownLeftRightVector without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DownLeftRightVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownLeftRightVector;", 
+            "description": "Named entity: DownLeftRightVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2950"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownLeftTeeVector", 
+            "description": "Bad named entity: DownLeftTeeVector without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DownLeftTeeVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownLeftTeeVector;", 
+            "description": "Named entity: DownLeftTeeVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u295e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownLeftVector", 
+            "description": "Bad named entity: DownLeftVector without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DownLeftVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownLeftVector;", 
+            "description": "Named entity: DownLeftVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownLeftVectorBar", 
+            "description": "Bad named entity: DownLeftVectorBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DownLeftVectorBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownLeftVectorBar;", 
+            "description": "Named entity: DownLeftVectorBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2956"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownRightTeeVector", 
+            "description": "Bad named entity: DownRightTeeVector without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DownRightTeeVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownRightTeeVector;", 
+            "description": "Named entity: DownRightTeeVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u295f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownRightVector", 
+            "description": "Bad named entity: DownRightVector without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DownRightVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownRightVector;", 
+            "description": "Named entity: DownRightVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownRightVectorBar", 
+            "description": "Bad named entity: DownRightVectorBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DownRightVectorBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownRightVectorBar;", 
+            "description": "Named entity: DownRightVectorBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2957"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownTee", 
+            "description": "Bad named entity: DownTee without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DownTee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownTee;", 
+            "description": "Named entity: DownTee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownTeeArrow", 
+            "description": "Bad named entity: DownTeeArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&DownTeeArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownTeeArrow;", 
+            "description": "Named entity: DownTeeArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Downarrow", 
+            "description": "Bad named entity: Downarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Downarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Downarrow;", 
+            "description": "Named entity: Downarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dscr", 
+            "description": "Bad named entity: Dscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Dscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dscr;", 
+            "description": "Named entity: Dscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udc9f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dstrok", 
+            "description": "Bad named entity: Dstrok without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Dstrok"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dstrok;", 
+            "description": "Named entity: Dstrok; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0110"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ENG", 
+            "description": "Bad named entity: ENG without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ENG"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ENG;", 
+            "description": "Named entity: ENG; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u014a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ETH", 
+            "description": "Named entity: ETH without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00d0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ETH;", 
+            "description": "Named entity: ETH; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00d0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Eacute", 
+            "description": "Named entity: Eacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00c9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Eacute;", 
+            "description": "Named entity: Eacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ecaron", 
+            "description": "Bad named entity: Ecaron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Ecaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ecaron;", 
+            "description": "Named entity: Ecaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u011a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ecirc", 
+            "description": "Named entity: Ecirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ca"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ecirc;", 
+            "description": "Named entity: Ecirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ca"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ecy", 
+            "description": "Bad named entity: Ecy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Ecy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ecy;", 
+            "description": "Named entity: Ecy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u042d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Edot", 
+            "description": "Bad named entity: Edot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Edot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Edot;", 
+            "description": "Named entity: Edot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0116"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Efr", 
+            "description": "Bad named entity: Efr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Efr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Efr;", 
+            "description": "Named entity: Efr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd08"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Egrave", 
+            "description": "Named entity: Egrave without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00c8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Egrave;", 
+            "description": "Named entity: Egrave; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Element", 
+            "description": "Bad named entity: Element without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Element"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Element;", 
+            "description": "Named entity: Element; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2208"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Emacr", 
+            "description": "Bad named entity: Emacr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Emacr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Emacr;", 
+            "description": "Named entity: Emacr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0112"
+                ]
+            ]
+        }, 
+        {
+            "input": "&EmptySmallSquare", 
+            "description": "Bad named entity: EmptySmallSquare without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&EmptySmallSquare"
+                ]
+            ]
+        }, 
+        {
+            "input": "&EmptySmallSquare;", 
+            "description": "Named entity: EmptySmallSquare; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25fb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&EmptyVerySmallSquare", 
+            "description": "Bad named entity: EmptyVerySmallSquare without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&EmptyVerySmallSquare"
+                ]
+            ]
+        }, 
+        {
+            "input": "&EmptyVerySmallSquare;", 
+            "description": "Named entity: EmptyVerySmallSquare; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25ab"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Eogon", 
+            "description": "Bad named entity: Eogon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Eogon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Eogon;", 
+            "description": "Named entity: Eogon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0118"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Eopf", 
+            "description": "Bad named entity: Eopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Eopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Eopf;", 
+            "description": "Named entity: Eopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd3c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Epsilon", 
+            "description": "Bad named entity: Epsilon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Epsilon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Epsilon;", 
+            "description": "Named entity: Epsilon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0395"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Equal", 
+            "description": "Bad named entity: Equal without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Equal"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Equal;", 
+            "description": "Named entity: Equal; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a75"
+                ]
+            ]
+        }, 
+        {
+            "input": "&EqualTilde", 
+            "description": "Bad named entity: EqualTilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&EqualTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "&EqualTilde;", 
+            "description": "Named entity: EqualTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2242"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Equilibrium", 
+            "description": "Bad named entity: Equilibrium without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Equilibrium"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Equilibrium;", 
+            "description": "Named entity: Equilibrium; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21cc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Escr", 
+            "description": "Bad named entity: Escr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Escr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Escr;", 
+            "description": "Named entity: Escr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2130"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Esim", 
+            "description": "Bad named entity: Esim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Esim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Esim;", 
+            "description": "Named entity: Esim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a73"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Eta", 
+            "description": "Bad named entity: Eta without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Eta"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Eta;", 
+            "description": "Named entity: Eta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0397"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Euml", 
+            "description": "Named entity: Euml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00cb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Euml;", 
+            "description": "Named entity: Euml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00cb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Exists", 
+            "description": "Bad named entity: Exists without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Exists"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Exists;", 
+            "description": "Named entity: Exists; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2203"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ExponentialE", 
+            "description": "Bad named entity: ExponentialE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ExponentialE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ExponentialE;", 
+            "description": "Named entity: ExponentialE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2147"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Fcy", 
+            "description": "Bad named entity: Fcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Fcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Fcy;", 
+            "description": "Named entity: Fcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0424"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ffr", 
+            "description": "Bad named entity: Ffr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Ffr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ffr;", 
+            "description": "Named entity: Ffr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd09"
+                ]
+            ]
+        }, 
+        {
+            "input": "&FilledSmallSquare", 
+            "description": "Bad named entity: FilledSmallSquare without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&FilledSmallSquare"
+                ]
+            ]
+        }, 
+        {
+            "input": "&FilledSmallSquare;", 
+            "description": "Named entity: FilledSmallSquare; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25fc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&FilledVerySmallSquare", 
+            "description": "Bad named entity: FilledVerySmallSquare without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&FilledVerySmallSquare"
+                ]
+            ]
+        }, 
+        {
+            "input": "&FilledVerySmallSquare;", 
+            "description": "Named entity: FilledVerySmallSquare; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25aa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Fopf", 
+            "description": "Bad named entity: Fopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Fopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Fopf;", 
+            "description": "Named entity: Fopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd3d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ForAll", 
+            "description": "Bad named entity: ForAll without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ForAll"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ForAll;", 
+            "description": "Named entity: ForAll; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2200"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Fouriertrf", 
+            "description": "Bad named entity: Fouriertrf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Fouriertrf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Fouriertrf;", 
+            "description": "Named entity: Fouriertrf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2131"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Fscr", 
+            "description": "Bad named entity: Fscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Fscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Fscr;", 
+            "description": "Named entity: Fscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2131"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GJcy", 
+            "description": "Bad named entity: GJcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&GJcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GJcy;", 
+            "description": "Named entity: GJcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0403"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GT", 
+            "description": "Named entity: GT without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    ">"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GT;", 
+            "description": "Named entity: GT; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    ">"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gamma", 
+            "description": "Bad named entity: Gamma without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Gamma"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gamma;", 
+            "description": "Named entity: Gamma; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0393"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gammad", 
+            "description": "Bad named entity: Gammad without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Gammad"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gammad;", 
+            "description": "Named entity: Gammad; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03dc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gbreve", 
+            "description": "Bad named entity: Gbreve without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Gbreve"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gbreve;", 
+            "description": "Named entity: Gbreve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u011e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gcedil", 
+            "description": "Bad named entity: Gcedil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Gcedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gcedil;", 
+            "description": "Named entity: Gcedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0122"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gcirc", 
+            "description": "Bad named entity: Gcirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Gcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gcirc;", 
+            "description": "Named entity: Gcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u011c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gcy", 
+            "description": "Bad named entity: Gcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Gcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gcy;", 
+            "description": "Named entity: Gcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0413"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gdot", 
+            "description": "Bad named entity: Gdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Gdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gdot;", 
+            "description": "Named entity: Gdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0120"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gfr", 
+            "description": "Bad named entity: Gfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Gfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gfr;", 
+            "description": "Named entity: Gfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd0a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gg", 
+            "description": "Bad named entity: Gg without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Gg"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gg;", 
+            "description": "Named entity: Gg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gopf", 
+            "description": "Bad named entity: Gopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Gopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gopf;", 
+            "description": "Named entity: Gopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd3e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterEqual", 
+            "description": "Bad named entity: GreaterEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&GreaterEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterEqual;", 
+            "description": "Named entity: GreaterEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2265"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterEqualLess", 
+            "description": "Bad named entity: GreaterEqualLess without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&GreaterEqualLess"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterEqualLess;", 
+            "description": "Named entity: GreaterEqualLess; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22db"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterFullEqual", 
+            "description": "Bad named entity: GreaterFullEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&GreaterFullEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterFullEqual;", 
+            "description": "Named entity: GreaterFullEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2267"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterGreater", 
+            "description": "Bad named entity: GreaterGreater without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&GreaterGreater"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterGreater;", 
+            "description": "Named entity: GreaterGreater; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterLess", 
+            "description": "Bad named entity: GreaterLess without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&GreaterLess"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterLess;", 
+            "description": "Named entity: GreaterLess; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2277"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterSlantEqual", 
+            "description": "Bad named entity: GreaterSlantEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&GreaterSlantEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterSlantEqual;", 
+            "description": "Named entity: GreaterSlantEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterTilde", 
+            "description": "Bad named entity: GreaterTilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&GreaterTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterTilde;", 
+            "description": "Named entity: GreaterTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2273"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gscr", 
+            "description": "Bad named entity: Gscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Gscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gscr;", 
+            "description": "Named entity: Gscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udca2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gt", 
+            "description": "Bad named entity: Gt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Gt"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gt;", 
+            "description": "Named entity: Gt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&HARDcy", 
+            "description": "Bad named entity: HARDcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&HARDcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&HARDcy;", 
+            "description": "Named entity: HARDcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u042a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hacek", 
+            "description": "Bad named entity: Hacek without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Hacek"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hacek;", 
+            "description": "Named entity: Hacek; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02c7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hat", 
+            "description": "Bad named entity: Hat without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Hat"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hat;", 
+            "description": "Named entity: Hat; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "^"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hcirc", 
+            "description": "Bad named entity: Hcirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Hcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hcirc;", 
+            "description": "Named entity: Hcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0124"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hfr", 
+            "description": "Bad named entity: Hfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Hfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hfr;", 
+            "description": "Named entity: Hfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&HilbertSpace", 
+            "description": "Bad named entity: HilbertSpace without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&HilbertSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": "&HilbertSpace;", 
+            "description": "Named entity: HilbertSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hopf", 
+            "description": "Bad named entity: Hopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Hopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hopf;", 
+            "description": "Named entity: Hopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&HorizontalLine", 
+            "description": "Bad named entity: HorizontalLine without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&HorizontalLine"
+                ]
+            ]
+        }, 
+        {
+            "input": "&HorizontalLine;", 
+            "description": "Named entity: HorizontalLine; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2500"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hscr", 
+            "description": "Bad named entity: Hscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Hscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hscr;", 
+            "description": "Named entity: Hscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hstrok", 
+            "description": "Bad named entity: Hstrok without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Hstrok"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hstrok;", 
+            "description": "Named entity: Hstrok; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0126"
+                ]
+            ]
+        }, 
+        {
+            "input": "&HumpDownHump", 
+            "description": "Bad named entity: HumpDownHump without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&HumpDownHump"
+                ]
+            ]
+        }, 
+        {
+            "input": "&HumpDownHump;", 
+            "description": "Named entity: HumpDownHump; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&HumpEqual", 
+            "description": "Bad named entity: HumpEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&HumpEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&HumpEqual;", 
+            "description": "Named entity: HumpEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&IEcy", 
+            "description": "Bad named entity: IEcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&IEcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&IEcy;", 
+            "description": "Named entity: IEcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0415"
+                ]
+            ]
+        }, 
+        {
+            "input": "&IJlig", 
+            "description": "Bad named entity: IJlig without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&IJlig"
+                ]
+            ]
+        }, 
+        {
+            "input": "&IJlig;", 
+            "description": "Named entity: IJlig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0132"
+                ]
+            ]
+        }, 
+        {
+            "input": "&IOcy", 
+            "description": "Bad named entity: IOcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&IOcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&IOcy;", 
+            "description": "Named entity: IOcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0401"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Iacute", 
+            "description": "Named entity: Iacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00cd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Iacute;", 
+            "description": "Named entity: Iacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00cd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Icirc", 
+            "description": "Named entity: Icirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ce"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Icirc;", 
+            "description": "Named entity: Icirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ce"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Icy", 
+            "description": "Bad named entity: Icy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Icy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Icy;", 
+            "description": "Named entity: Icy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0418"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Idot", 
+            "description": "Bad named entity: Idot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Idot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Idot;", 
+            "description": "Named entity: Idot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0130"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ifr", 
+            "description": "Bad named entity: Ifr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Ifr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ifr;", 
+            "description": "Named entity: Ifr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2111"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Igrave", 
+            "description": "Named entity: Igrave without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00cc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Igrave;", 
+            "description": "Named entity: Igrave; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00cc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Im", 
+            "description": "Bad named entity: Im without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Im"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Im;", 
+            "description": "Named entity: Im; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2111"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Imacr", 
+            "description": "Bad named entity: Imacr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Imacr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Imacr;", 
+            "description": "Named entity: Imacr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u012a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ImaginaryI", 
+            "description": "Bad named entity: ImaginaryI without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ImaginaryI"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ImaginaryI;", 
+            "description": "Named entity: ImaginaryI; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2148"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Implies", 
+            "description": "Bad named entity: Implies without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Implies"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Implies;", 
+            "description": "Named entity: Implies; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Int", 
+            "description": "Bad named entity: Int without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Int"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Int;", 
+            "description": "Named entity: Int; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Integral", 
+            "description": "Bad named entity: Integral without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Integral"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Integral;", 
+            "description": "Named entity: Integral; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Intersection", 
+            "description": "Bad named entity: Intersection without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Intersection"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Intersection;", 
+            "description": "Named entity: Intersection; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&InvisibleComma", 
+            "description": "Bad named entity: InvisibleComma without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&InvisibleComma"
+                ]
+            ]
+        }, 
+        {
+            "input": "&InvisibleComma;", 
+            "description": "Named entity: InvisibleComma; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2063"
+                ]
+            ]
+        }, 
+        {
+            "input": "&InvisibleTimes", 
+            "description": "Bad named entity: InvisibleTimes without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&InvisibleTimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "&InvisibleTimes;", 
+            "description": "Named entity: InvisibleTimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2062"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Iogon", 
+            "description": "Bad named entity: Iogon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Iogon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Iogon;", 
+            "description": "Named entity: Iogon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u012e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Iopf", 
+            "description": "Bad named entity: Iopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Iopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Iopf;", 
+            "description": "Named entity: Iopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd40"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Iota", 
+            "description": "Bad named entity: Iota without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Iota"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Iota;", 
+            "description": "Named entity: Iota; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0399"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Iscr", 
+            "description": "Bad named entity: Iscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Iscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Iscr;", 
+            "description": "Named entity: Iscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2110"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Itilde", 
+            "description": "Bad named entity: Itilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Itilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Itilde;", 
+            "description": "Named entity: Itilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0128"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Iukcy", 
+            "description": "Bad named entity: Iukcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Iukcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Iukcy;", 
+            "description": "Named entity: Iukcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0406"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Iuml", 
+            "description": "Named entity: Iuml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00cf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Iuml;", 
+            "description": "Named entity: Iuml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00cf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jcirc", 
+            "description": "Bad named entity: Jcirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Jcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jcirc;", 
+            "description": "Named entity: Jcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0134"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jcy", 
+            "description": "Bad named entity: Jcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Jcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jcy;", 
+            "description": "Named entity: Jcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0419"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jfr", 
+            "description": "Bad named entity: Jfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Jfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jfr;", 
+            "description": "Named entity: Jfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd0d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jopf", 
+            "description": "Bad named entity: Jopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Jopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jopf;", 
+            "description": "Named entity: Jopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd41"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jscr", 
+            "description": "Bad named entity: Jscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Jscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jscr;", 
+            "description": "Named entity: Jscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udca5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jsercy", 
+            "description": "Bad named entity: Jsercy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Jsercy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jsercy;", 
+            "description": "Named entity: Jsercy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0408"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jukcy", 
+            "description": "Bad named entity: Jukcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Jukcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jukcy;", 
+            "description": "Named entity: Jukcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0404"
+                ]
+            ]
+        }, 
+        {
+            "input": "&KHcy", 
+            "description": "Bad named entity: KHcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&KHcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&KHcy;", 
+            "description": "Named entity: KHcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0425"
+                ]
+            ]
+        }, 
+        {
+            "input": "&KJcy", 
+            "description": "Bad named entity: KJcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&KJcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&KJcy;", 
+            "description": "Named entity: KJcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u040c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Kappa", 
+            "description": "Bad named entity: Kappa without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Kappa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Kappa;", 
+            "description": "Named entity: Kappa; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u039a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Kcedil", 
+            "description": "Bad named entity: Kcedil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Kcedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Kcedil;", 
+            "description": "Named entity: Kcedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0136"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Kcy", 
+            "description": "Bad named entity: Kcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Kcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Kcy;", 
+            "description": "Named entity: Kcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u041a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Kfr", 
+            "description": "Bad named entity: Kfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Kfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Kfr;", 
+            "description": "Named entity: Kfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd0e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Kopf", 
+            "description": "Bad named entity: Kopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Kopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Kopf;", 
+            "description": "Named entity: Kopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd42"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Kscr", 
+            "description": "Bad named entity: Kscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Kscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Kscr;", 
+            "description": "Named entity: Kscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udca6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LJcy", 
+            "description": "Bad named entity: LJcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LJcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LJcy;", 
+            "description": "Named entity: LJcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0409"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LT", 
+            "description": "Named entity: LT without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "<"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LT;", 
+            "description": "Named entity: LT; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "<"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lacute", 
+            "description": "Bad named entity: Lacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Lacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lacute;", 
+            "description": "Named entity: Lacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0139"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lambda", 
+            "description": "Bad named entity: Lambda without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Lambda"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lambda;", 
+            "description": "Named entity: Lambda; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u039b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lang", 
+            "description": "Bad named entity: Lang without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Lang"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lang;", 
+            "description": "Named entity: Lang; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27ea"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Laplacetrf", 
+            "description": "Bad named entity: Laplacetrf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Laplacetrf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Laplacetrf;", 
+            "description": "Named entity: Laplacetrf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2112"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Larr", 
+            "description": "Bad named entity: Larr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Larr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Larr;", 
+            "description": "Named entity: Larr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u219e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lcaron", 
+            "description": "Bad named entity: Lcaron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Lcaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lcaron;", 
+            "description": "Named entity: Lcaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u013d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lcedil", 
+            "description": "Bad named entity: Lcedil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Lcedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lcedil;", 
+            "description": "Named entity: Lcedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u013b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lcy", 
+            "description": "Bad named entity: Lcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Lcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lcy;", 
+            "description": "Named entity: Lcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u041b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftAngleBracket", 
+            "description": "Bad named entity: LeftAngleBracket without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftAngleBracket"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftAngleBracket;", 
+            "description": "Named entity: LeftAngleBracket; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27e8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftArrow", 
+            "description": "Bad named entity: LeftArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftArrow;", 
+            "description": "Named entity: LeftArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2190"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftArrowBar", 
+            "description": "Bad named entity: LeftArrowBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftArrowBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftArrowBar;", 
+            "description": "Named entity: LeftArrowBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21e4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftArrowRightArrow", 
+            "description": "Bad named entity: LeftArrowRightArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftArrowRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftArrowRightArrow;", 
+            "description": "Named entity: LeftArrowRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftCeiling", 
+            "description": "Bad named entity: LeftCeiling without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftCeiling"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftCeiling;", 
+            "description": "Named entity: LeftCeiling; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2308"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftDoubleBracket", 
+            "description": "Bad named entity: LeftDoubleBracket without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftDoubleBracket"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftDoubleBracket;", 
+            "description": "Named entity: LeftDoubleBracket; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27e6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftDownTeeVector", 
+            "description": "Bad named entity: LeftDownTeeVector without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftDownTeeVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftDownTeeVector;", 
+            "description": "Named entity: LeftDownTeeVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2961"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftDownVector", 
+            "description": "Bad named entity: LeftDownVector without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftDownVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftDownVector;", 
+            "description": "Named entity: LeftDownVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftDownVectorBar", 
+            "description": "Bad named entity: LeftDownVectorBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftDownVectorBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftDownVectorBar;", 
+            "description": "Named entity: LeftDownVectorBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2959"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftFloor", 
+            "description": "Bad named entity: LeftFloor without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftFloor"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftFloor;", 
+            "description": "Named entity: LeftFloor; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u230a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftRightArrow", 
+            "description": "Bad named entity: LeftRightArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftRightArrow;", 
+            "description": "Named entity: LeftRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2194"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftRightVector", 
+            "description": "Bad named entity: LeftRightVector without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftRightVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftRightVector;", 
+            "description": "Named entity: LeftRightVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u294e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftTee", 
+            "description": "Bad named entity: LeftTee without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftTee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftTee;", 
+            "description": "Named entity: LeftTee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftTeeArrow", 
+            "description": "Bad named entity: LeftTeeArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftTeeArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftTeeArrow;", 
+            "description": "Named entity: LeftTeeArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftTeeVector", 
+            "description": "Bad named entity: LeftTeeVector without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftTeeVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftTeeVector;", 
+            "description": "Named entity: LeftTeeVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u295a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftTriangle", 
+            "description": "Bad named entity: LeftTriangle without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftTriangle"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftTriangle;", 
+            "description": "Named entity: LeftTriangle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftTriangleBar", 
+            "description": "Bad named entity: LeftTriangleBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftTriangleBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftTriangleBar;", 
+            "description": "Named entity: LeftTriangleBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29cf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftTriangleEqual", 
+            "description": "Bad named entity: LeftTriangleEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftTriangleEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftTriangleEqual;", 
+            "description": "Named entity: LeftTriangleEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftUpDownVector", 
+            "description": "Bad named entity: LeftUpDownVector without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftUpDownVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftUpDownVector;", 
+            "description": "Named entity: LeftUpDownVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2951"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftUpTeeVector", 
+            "description": "Bad named entity: LeftUpTeeVector without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftUpTeeVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftUpTeeVector;", 
+            "description": "Named entity: LeftUpTeeVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2960"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftUpVector", 
+            "description": "Bad named entity: LeftUpVector without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftUpVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftUpVector;", 
+            "description": "Named entity: LeftUpVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftUpVectorBar", 
+            "description": "Bad named entity: LeftUpVectorBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftUpVectorBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftUpVectorBar;", 
+            "description": "Named entity: LeftUpVectorBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2958"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftVector", 
+            "description": "Bad named entity: LeftVector without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftVector;", 
+            "description": "Named entity: LeftVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftVectorBar", 
+            "description": "Bad named entity: LeftVectorBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LeftVectorBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftVectorBar;", 
+            "description": "Named entity: LeftVectorBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2952"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Leftarrow", 
+            "description": "Bad named entity: Leftarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Leftarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Leftarrow;", 
+            "description": "Named entity: Leftarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Leftrightarrow", 
+            "description": "Bad named entity: Leftrightarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Leftrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Leftrightarrow;", 
+            "description": "Named entity: Leftrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LessEqualGreater", 
+            "description": "Bad named entity: LessEqualGreater without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LessEqualGreater"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LessEqualGreater;", 
+            "description": "Named entity: LessEqualGreater; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22da"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LessFullEqual", 
+            "description": "Bad named entity: LessFullEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LessFullEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LessFullEqual;", 
+            "description": "Named entity: LessFullEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2266"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LessGreater", 
+            "description": "Bad named entity: LessGreater without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LessGreater"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LessGreater;", 
+            "description": "Named entity: LessGreater; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2276"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LessLess", 
+            "description": "Bad named entity: LessLess without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LessLess"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LessLess;", 
+            "description": "Named entity: LessLess; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LessSlantEqual", 
+            "description": "Bad named entity: LessSlantEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LessSlantEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LessSlantEqual;", 
+            "description": "Named entity: LessSlantEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LessTilde", 
+            "description": "Bad named entity: LessTilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LessTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LessTilde;", 
+            "description": "Named entity: LessTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2272"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lfr", 
+            "description": "Bad named entity: Lfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Lfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lfr;", 
+            "description": "Named entity: Lfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd0f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ll", 
+            "description": "Bad named entity: Ll without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Ll"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ll;", 
+            "description": "Named entity: Ll; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lleftarrow", 
+            "description": "Bad named entity: Lleftarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Lleftarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lleftarrow;", 
+            "description": "Named entity: Lleftarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21da"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lmidot", 
+            "description": "Bad named entity: Lmidot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Lmidot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lmidot;", 
+            "description": "Named entity: Lmidot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u013f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LongLeftArrow", 
+            "description": "Bad named entity: LongLeftArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LongLeftArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LongLeftArrow;", 
+            "description": "Named entity: LongLeftArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LongLeftRightArrow", 
+            "description": "Bad named entity: LongLeftRightArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LongLeftRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LongLeftRightArrow;", 
+            "description": "Named entity: LongLeftRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LongRightArrow", 
+            "description": "Bad named entity: LongRightArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LongRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LongRightArrow;", 
+            "description": "Named entity: LongRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Longleftarrow", 
+            "description": "Bad named entity: Longleftarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Longleftarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Longleftarrow;", 
+            "description": "Named entity: Longleftarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Longleftrightarrow", 
+            "description": "Bad named entity: Longleftrightarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Longleftrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Longleftrightarrow;", 
+            "description": "Named entity: Longleftrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27fa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Longrightarrow", 
+            "description": "Bad named entity: Longrightarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Longrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Longrightarrow;", 
+            "description": "Named entity: Longrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lopf", 
+            "description": "Bad named entity: Lopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Lopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lopf;", 
+            "description": "Named entity: Lopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd43"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LowerLeftArrow", 
+            "description": "Bad named entity: LowerLeftArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LowerLeftArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LowerLeftArrow;", 
+            "description": "Named entity: LowerLeftArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2199"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LowerRightArrow", 
+            "description": "Bad named entity: LowerRightArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&LowerRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LowerRightArrow;", 
+            "description": "Named entity: LowerRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2198"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lscr", 
+            "description": "Bad named entity: Lscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Lscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lscr;", 
+            "description": "Named entity: Lscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2112"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lsh", 
+            "description": "Bad named entity: Lsh without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Lsh"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lsh;", 
+            "description": "Named entity: Lsh; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lstrok", 
+            "description": "Bad named entity: Lstrok without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Lstrok"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lstrok;", 
+            "description": "Named entity: Lstrok; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0141"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lt", 
+            "description": "Bad named entity: Lt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Lt"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lt;", 
+            "description": "Named entity: Lt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Map", 
+            "description": "Bad named entity: Map without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Map"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Map;", 
+            "description": "Named entity: Map; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2905"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Mcy", 
+            "description": "Bad named entity: Mcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Mcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Mcy;", 
+            "description": "Named entity: Mcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u041c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&MediumSpace", 
+            "description": "Bad named entity: MediumSpace without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&MediumSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": "&MediumSpace;", 
+            "description": "Named entity: MediumSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u205f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Mellintrf", 
+            "description": "Bad named entity: Mellintrf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Mellintrf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Mellintrf;", 
+            "description": "Named entity: Mellintrf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2133"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Mfr", 
+            "description": "Bad named entity: Mfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Mfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Mfr;", 
+            "description": "Named entity: Mfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd10"
+                ]
+            ]
+        }, 
+        {
+            "input": "&MinusPlus", 
+            "description": "Bad named entity: MinusPlus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&MinusPlus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&MinusPlus;", 
+            "description": "Named entity: MinusPlus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2213"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Mopf", 
+            "description": "Bad named entity: Mopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Mopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Mopf;", 
+            "description": "Named entity: Mopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd44"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Mscr", 
+            "description": "Bad named entity: Mscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Mscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Mscr;", 
+            "description": "Named entity: Mscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2133"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Mu", 
+            "description": "Bad named entity: Mu without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Mu"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Mu;", 
+            "description": "Named entity: Mu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u039c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NJcy", 
+            "description": "Bad named entity: NJcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NJcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NJcy;", 
+            "description": "Named entity: NJcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u040a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Nacute", 
+            "description": "Bad named entity: Nacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Nacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Nacute;", 
+            "description": "Named entity: Nacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0143"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ncaron", 
+            "description": "Bad named entity: Ncaron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Ncaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ncaron;", 
+            "description": "Named entity: Ncaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0147"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ncedil", 
+            "description": "Bad named entity: Ncedil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Ncedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ncedil;", 
+            "description": "Named entity: Ncedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0145"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ncy", 
+            "description": "Bad named entity: Ncy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Ncy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ncy;", 
+            "description": "Named entity: Ncy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u041d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NegativeMediumSpace", 
+            "description": "Bad named entity: NegativeMediumSpace without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NegativeMediumSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NegativeMediumSpace;", 
+            "description": "Named entity: NegativeMediumSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NegativeThickSpace", 
+            "description": "Bad named entity: NegativeThickSpace without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NegativeThickSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NegativeThickSpace;", 
+            "description": "Named entity: NegativeThickSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NegativeThinSpace", 
+            "description": "Bad named entity: NegativeThinSpace without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NegativeThinSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NegativeThinSpace;", 
+            "description": "Named entity: NegativeThinSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NegativeVeryThinSpace", 
+            "description": "Bad named entity: NegativeVeryThinSpace without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NegativeVeryThinSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NegativeVeryThinSpace;", 
+            "description": "Named entity: NegativeVeryThinSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NestedGreaterGreater", 
+            "description": "Bad named entity: NestedGreaterGreater without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NestedGreaterGreater"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NestedGreaterGreater;", 
+            "description": "Named entity: NestedGreaterGreater; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NestedLessLess", 
+            "description": "Bad named entity: NestedLessLess without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NestedLessLess"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NestedLessLess;", 
+            "description": "Named entity: NestedLessLess; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NewLine", 
+            "description": "Bad named entity: NewLine without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NewLine"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NewLine;", 
+            "description": "Named entity: NewLine; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\n"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Nfr", 
+            "description": "Bad named entity: Nfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Nfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Nfr;", 
+            "description": "Named entity: Nfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd11"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NoBreak", 
+            "description": "Bad named entity: NoBreak without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NoBreak"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NoBreak;", 
+            "description": "Named entity: NoBreak; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2060"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NonBreakingSpace", 
+            "description": "Bad named entity: NonBreakingSpace without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NonBreakingSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NonBreakingSpace;", 
+            "description": "Named entity: NonBreakingSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Nopf", 
+            "description": "Bad named entity: Nopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Nopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Nopf;", 
+            "description": "Named entity: Nopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2115"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Not", 
+            "description": "Bad named entity: Not without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Not"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Not;", 
+            "description": "Named entity: Not; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aec"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotCongruent", 
+            "description": "Bad named entity: NotCongruent without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotCongruent"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotCongruent;", 
+            "description": "Named entity: NotCongruent; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2262"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotCupCap", 
+            "description": "Bad named entity: NotCupCap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotCupCap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotCupCap;", 
+            "description": "Named entity: NotCupCap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotDoubleVerticalBar", 
+            "description": "Bad named entity: NotDoubleVerticalBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotDoubleVerticalBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotDoubleVerticalBar;", 
+            "description": "Named entity: NotDoubleVerticalBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2226"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotElement", 
+            "description": "Bad named entity: NotElement without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotElement"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotElement;", 
+            "description": "Named entity: NotElement; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2209"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotEqual", 
+            "description": "Bad named entity: NotEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotEqual;", 
+            "description": "Named entity: NotEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2260"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotEqualTilde", 
+            "description": "Bad named entity: NotEqualTilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotEqualTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotEqualTilde;", 
+            "description": "Named entity: NotEqualTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2242\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotExists", 
+            "description": "Bad named entity: NotExists without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotExists"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotExists;", 
+            "description": "Named entity: NotExists; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2204"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreater", 
+            "description": "Bad named entity: NotGreater without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotGreater"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreater;", 
+            "description": "Named entity: NotGreater; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreaterEqual", 
+            "description": "Bad named entity: NotGreaterEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotGreaterEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreaterEqual;", 
+            "description": "Named entity: NotGreaterEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2271"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreaterFullEqual", 
+            "description": "Bad named entity: NotGreaterFullEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotGreaterFullEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreaterFullEqual;", 
+            "description": "Named entity: NotGreaterFullEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2267\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreaterGreater", 
+            "description": "Bad named entity: NotGreaterGreater without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotGreaterGreater"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreaterGreater;", 
+            "description": "Named entity: NotGreaterGreater; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226b\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreaterLess", 
+            "description": "Bad named entity: NotGreaterLess without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotGreaterLess"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreaterLess;", 
+            "description": "Named entity: NotGreaterLess; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2279"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreaterSlantEqual", 
+            "description": "Bad named entity: NotGreaterSlantEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotGreaterSlantEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreaterSlantEqual;", 
+            "description": "Named entity: NotGreaterSlantEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7e\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreaterTilde", 
+            "description": "Bad named entity: NotGreaterTilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotGreaterTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreaterTilde;", 
+            "description": "Named entity: NotGreaterTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2275"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotHumpDownHump", 
+            "description": "Bad named entity: NotHumpDownHump without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotHumpDownHump"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotHumpDownHump;", 
+            "description": "Named entity: NotHumpDownHump; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224e\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotHumpEqual", 
+            "description": "Bad named entity: NotHumpEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotHumpEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotHumpEqual;", 
+            "description": "Named entity: NotHumpEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224f\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLeftTriangle", 
+            "description": "Bad named entity: NotLeftTriangle without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotLeftTriangle"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLeftTriangle;", 
+            "description": "Named entity: NotLeftTriangle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ea"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLeftTriangleBar", 
+            "description": "Bad named entity: NotLeftTriangleBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotLeftTriangleBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLeftTriangleBar;", 
+            "description": "Named entity: NotLeftTriangleBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29cf\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLeftTriangleEqual", 
+            "description": "Bad named entity: NotLeftTriangleEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotLeftTriangleEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLeftTriangleEqual;", 
+            "description": "Named entity: NotLeftTriangleEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ec"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLess", 
+            "description": "Bad named entity: NotLess without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotLess"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLess;", 
+            "description": "Named entity: NotLess; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLessEqual", 
+            "description": "Bad named entity: NotLessEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotLessEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLessEqual;", 
+            "description": "Named entity: NotLessEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2270"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLessGreater", 
+            "description": "Bad named entity: NotLessGreater without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotLessGreater"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLessGreater;", 
+            "description": "Named entity: NotLessGreater; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2278"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLessLess", 
+            "description": "Bad named entity: NotLessLess without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotLessLess"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLessLess;", 
+            "description": "Named entity: NotLessLess; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226a\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLessSlantEqual", 
+            "description": "Bad named entity: NotLessSlantEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotLessSlantEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLessSlantEqual;", 
+            "description": "Named entity: NotLessSlantEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7d\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLessTilde", 
+            "description": "Bad named entity: NotLessTilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotLessTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLessTilde;", 
+            "description": "Named entity: NotLessTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2274"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotNestedGreaterGreater", 
+            "description": "Bad named entity: NotNestedGreaterGreater without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotNestedGreaterGreater"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotNestedGreaterGreater;", 
+            "description": "Named entity: NotNestedGreaterGreater; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa2\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotNestedLessLess", 
+            "description": "Bad named entity: NotNestedLessLess without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotNestedLessLess"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotNestedLessLess;", 
+            "description": "Named entity: NotNestedLessLess; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa1\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotPrecedes", 
+            "description": "Bad named entity: NotPrecedes without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotPrecedes"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotPrecedes;", 
+            "description": "Named entity: NotPrecedes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2280"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotPrecedesEqual", 
+            "description": "Bad named entity: NotPrecedesEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotPrecedesEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotPrecedesEqual;", 
+            "description": "Named entity: NotPrecedesEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aaf\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotPrecedesSlantEqual", 
+            "description": "Bad named entity: NotPrecedesSlantEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotPrecedesSlantEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotPrecedesSlantEqual;", 
+            "description": "Named entity: NotPrecedesSlantEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotReverseElement", 
+            "description": "Bad named entity: NotReverseElement without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotReverseElement"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotReverseElement;", 
+            "description": "Named entity: NotReverseElement; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u220c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotRightTriangle", 
+            "description": "Bad named entity: NotRightTriangle without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotRightTriangle"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotRightTriangle;", 
+            "description": "Named entity: NotRightTriangle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22eb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotRightTriangleBar", 
+            "description": "Bad named entity: NotRightTriangleBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotRightTriangleBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotRightTriangleBar;", 
+            "description": "Named entity: NotRightTriangleBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29d0\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotRightTriangleEqual", 
+            "description": "Bad named entity: NotRightTriangleEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotRightTriangleEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotRightTriangleEqual;", 
+            "description": "Named entity: NotRightTriangleEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ed"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSquareSubset", 
+            "description": "Bad named entity: NotSquareSubset without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotSquareSubset"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSquareSubset;", 
+            "description": "Named entity: NotSquareSubset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228f\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSquareSubsetEqual", 
+            "description": "Bad named entity: NotSquareSubsetEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotSquareSubsetEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSquareSubsetEqual;", 
+            "description": "Named entity: NotSquareSubsetEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSquareSuperset", 
+            "description": "Bad named entity: NotSquareSuperset without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotSquareSuperset"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSquareSuperset;", 
+            "description": "Named entity: NotSquareSuperset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2290\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSquareSupersetEqual", 
+            "description": "Bad named entity: NotSquareSupersetEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotSquareSupersetEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSquareSupersetEqual;", 
+            "description": "Named entity: NotSquareSupersetEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSubset", 
+            "description": "Bad named entity: NotSubset without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotSubset"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSubset;", 
+            "description": "Named entity: NotSubset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2282\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSubsetEqual", 
+            "description": "Bad named entity: NotSubsetEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotSubsetEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSubsetEqual;", 
+            "description": "Named entity: NotSubsetEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2288"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSucceeds", 
+            "description": "Bad named entity: NotSucceeds without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotSucceeds"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSucceeds;", 
+            "description": "Named entity: NotSucceeds; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2281"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSucceedsEqual", 
+            "description": "Bad named entity: NotSucceedsEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotSucceedsEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSucceedsEqual;", 
+            "description": "Named entity: NotSucceedsEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab0\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSucceedsSlantEqual", 
+            "description": "Bad named entity: NotSucceedsSlantEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotSucceedsSlantEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSucceedsSlantEqual;", 
+            "description": "Named entity: NotSucceedsSlantEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSucceedsTilde", 
+            "description": "Bad named entity: NotSucceedsTilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotSucceedsTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSucceedsTilde;", 
+            "description": "Named entity: NotSucceedsTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227f\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSuperset", 
+            "description": "Bad named entity: NotSuperset without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotSuperset"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSuperset;", 
+            "description": "Named entity: NotSuperset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2283\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSupersetEqual", 
+            "description": "Bad named entity: NotSupersetEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotSupersetEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSupersetEqual;", 
+            "description": "Named entity: NotSupersetEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2289"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotTilde", 
+            "description": "Bad named entity: NotTilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotTilde;", 
+            "description": "Named entity: NotTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2241"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotTildeEqual", 
+            "description": "Bad named entity: NotTildeEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotTildeEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotTildeEqual;", 
+            "description": "Named entity: NotTildeEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2244"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotTildeFullEqual", 
+            "description": "Bad named entity: NotTildeFullEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotTildeFullEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotTildeFullEqual;", 
+            "description": "Named entity: NotTildeFullEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2247"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotTildeTilde", 
+            "description": "Bad named entity: NotTildeTilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotTildeTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotTildeTilde;", 
+            "description": "Named entity: NotTildeTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2249"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotVerticalBar", 
+            "description": "Bad named entity: NotVerticalBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&NotVerticalBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotVerticalBar;", 
+            "description": "Named entity: NotVerticalBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2224"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Nscr", 
+            "description": "Bad named entity: Nscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Nscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Nscr;", 
+            "description": "Named entity: Nscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udca9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ntilde", 
+            "description": "Named entity: Ntilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00d1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ntilde;", 
+            "description": "Named entity: Ntilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00d1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Nu", 
+            "description": "Bad named entity: Nu without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Nu"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Nu;", 
+            "description": "Named entity: Nu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u039d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OElig", 
+            "description": "Bad named entity: OElig without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&OElig"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OElig;", 
+            "description": "Named entity: OElig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0152"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Oacute", 
+            "description": "Named entity: Oacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00d3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Oacute;", 
+            "description": "Named entity: Oacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00d3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ocirc", 
+            "description": "Named entity: Ocirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00d4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ocirc;", 
+            "description": "Named entity: Ocirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00d4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ocy", 
+            "description": "Bad named entity: Ocy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Ocy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ocy;", 
+            "description": "Named entity: Ocy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u041e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Odblac", 
+            "description": "Bad named entity: Odblac without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Odblac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Odblac;", 
+            "description": "Named entity: Odblac; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0150"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ofr", 
+            "description": "Bad named entity: Ofr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Ofr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ofr;", 
+            "description": "Named entity: Ofr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd12"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ograve", 
+            "description": "Named entity: Ograve without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ograve;", 
+            "description": "Named entity: Ograve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Omacr", 
+            "description": "Bad named entity: Omacr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Omacr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Omacr;", 
+            "description": "Named entity: Omacr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u014c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Omega", 
+            "description": "Bad named entity: Omega without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Omega"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Omega;", 
+            "description": "Named entity: Omega; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03a9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Omicron", 
+            "description": "Bad named entity: Omicron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Omicron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Omicron;", 
+            "description": "Named entity: Omicron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u039f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Oopf", 
+            "description": "Bad named entity: Oopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Oopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Oopf;", 
+            "description": "Named entity: Oopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd46"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OpenCurlyDoubleQuote", 
+            "description": "Bad named entity: OpenCurlyDoubleQuote without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&OpenCurlyDoubleQuote"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OpenCurlyDoubleQuote;", 
+            "description": "Named entity: OpenCurlyDoubleQuote; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u201c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OpenCurlyQuote", 
+            "description": "Bad named entity: OpenCurlyQuote without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&OpenCurlyQuote"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OpenCurlyQuote;", 
+            "description": "Named entity: OpenCurlyQuote; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2018"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Or", 
+            "description": "Bad named entity: Or without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Or"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Or;", 
+            "description": "Named entity: Or; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a54"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Oscr", 
+            "description": "Bad named entity: Oscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Oscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Oscr;", 
+            "description": "Named entity: Oscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcaa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Oslash", 
+            "description": "Named entity: Oslash without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00d8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Oslash;", 
+            "description": "Named entity: Oslash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00d8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Otilde", 
+            "description": "Named entity: Otilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00d5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Otilde;", 
+            "description": "Named entity: Otilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00d5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Otimes", 
+            "description": "Bad named entity: Otimes without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Otimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Otimes;", 
+            "description": "Named entity: Otimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a37"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ouml", 
+            "description": "Named entity: Ouml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00d6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ouml;", 
+            "description": "Named entity: Ouml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00d6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OverBar", 
+            "description": "Bad named entity: OverBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&OverBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OverBar;", 
+            "description": "Named entity: OverBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u203e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OverBrace", 
+            "description": "Bad named entity: OverBrace without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&OverBrace"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OverBrace;", 
+            "description": "Named entity: OverBrace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23de"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OverBracket", 
+            "description": "Bad named entity: OverBracket without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&OverBracket"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OverBracket;", 
+            "description": "Named entity: OverBracket; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OverParenthesis", 
+            "description": "Bad named entity: OverParenthesis without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&OverParenthesis"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OverParenthesis;", 
+            "description": "Named entity: OverParenthesis; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23dc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&PartialD", 
+            "description": "Bad named entity: PartialD without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&PartialD"
+                ]
+            ]
+        }, 
+        {
+            "input": "&PartialD;", 
+            "description": "Named entity: PartialD; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2202"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Pcy", 
+            "description": "Bad named entity: Pcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Pcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Pcy;", 
+            "description": "Named entity: Pcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u041f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Pfr", 
+            "description": "Bad named entity: Pfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Pfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Pfr;", 
+            "description": "Named entity: Pfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd13"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Phi", 
+            "description": "Bad named entity: Phi without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Phi"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Phi;", 
+            "description": "Named entity: Phi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03a6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Pi", 
+            "description": "Bad named entity: Pi without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Pi"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Pi;", 
+            "description": "Named entity: Pi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03a0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&PlusMinus", 
+            "description": "Bad named entity: PlusMinus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&PlusMinus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&PlusMinus;", 
+            "description": "Named entity: PlusMinus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Poincareplane", 
+            "description": "Bad named entity: Poincareplane without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Poincareplane"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Poincareplane;", 
+            "description": "Named entity: Poincareplane; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Popf", 
+            "description": "Bad named entity: Popf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Popf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Popf;", 
+            "description": "Named entity: Popf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2119"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Pr", 
+            "description": "Bad named entity: Pr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Pr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Pr;", 
+            "description": "Named entity: Pr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2abb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Precedes", 
+            "description": "Bad named entity: Precedes without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Precedes"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Precedes;", 
+            "description": "Named entity: Precedes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&PrecedesEqual", 
+            "description": "Bad named entity: PrecedesEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&PrecedesEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&PrecedesEqual;", 
+            "description": "Named entity: PrecedesEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aaf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&PrecedesSlantEqual", 
+            "description": "Bad named entity: PrecedesSlantEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&PrecedesSlantEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&PrecedesSlantEqual;", 
+            "description": "Named entity: PrecedesSlantEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&PrecedesTilde", 
+            "description": "Bad named entity: PrecedesTilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&PrecedesTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "&PrecedesTilde;", 
+            "description": "Named entity: PrecedesTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Prime", 
+            "description": "Bad named entity: Prime without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Prime"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Prime;", 
+            "description": "Named entity: Prime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2033"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Product", 
+            "description": "Bad named entity: Product without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Product"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Product;", 
+            "description": "Named entity: Product; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u220f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Proportion", 
+            "description": "Bad named entity: Proportion without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Proportion"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Proportion;", 
+            "description": "Named entity: Proportion; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2237"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Proportional", 
+            "description": "Bad named entity: Proportional without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Proportional"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Proportional;", 
+            "description": "Named entity: Proportional; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u221d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Pscr", 
+            "description": "Bad named entity: Pscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Pscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Pscr;", 
+            "description": "Named entity: Pscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcab"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Psi", 
+            "description": "Bad named entity: Psi without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Psi"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Psi;", 
+            "description": "Named entity: Psi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03a8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&QUOT", 
+            "description": "Named entity: QUOT without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\""
+                ]
+            ]
+        }, 
+        {
+            "input": "&QUOT;", 
+            "description": "Named entity: QUOT; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\""
+                ]
+            ]
+        }, 
+        {
+            "input": "&Qfr", 
+            "description": "Bad named entity: Qfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Qfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Qfr;", 
+            "description": "Named entity: Qfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd14"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Qopf", 
+            "description": "Bad named entity: Qopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Qopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Qopf;", 
+            "description": "Named entity: Qopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Qscr", 
+            "description": "Bad named entity: Qscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Qscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Qscr;", 
+            "description": "Named entity: Qscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RBarr", 
+            "description": "Bad named entity: RBarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RBarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RBarr;", 
+            "description": "Named entity: RBarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2910"
+                ]
+            ]
+        }, 
+        {
+            "input": "&REG", 
+            "description": "Named entity: REG without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&REG;", 
+            "description": "Named entity: REG; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Racute", 
+            "description": "Bad named entity: Racute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Racute"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Racute;", 
+            "description": "Named entity: Racute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0154"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rang", 
+            "description": "Bad named entity: Rang without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Rang"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rang;", 
+            "description": "Named entity: Rang; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27eb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rarr", 
+            "description": "Bad named entity: Rarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Rarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rarr;", 
+            "description": "Named entity: Rarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rarrtl", 
+            "description": "Bad named entity: Rarrtl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Rarrtl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rarrtl;", 
+            "description": "Named entity: Rarrtl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2916"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rcaron", 
+            "description": "Bad named entity: Rcaron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Rcaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rcaron;", 
+            "description": "Named entity: Rcaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0158"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rcedil", 
+            "description": "Bad named entity: Rcedil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Rcedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rcedil;", 
+            "description": "Named entity: Rcedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0156"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rcy", 
+            "description": "Bad named entity: Rcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Rcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rcy;", 
+            "description": "Named entity: Rcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0420"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Re", 
+            "description": "Bad named entity: Re without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Re"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Re;", 
+            "description": "Named entity: Re; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ReverseElement", 
+            "description": "Bad named entity: ReverseElement without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ReverseElement"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ReverseElement;", 
+            "description": "Named entity: ReverseElement; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u220b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ReverseEquilibrium", 
+            "description": "Bad named entity: ReverseEquilibrium without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ReverseEquilibrium"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ReverseEquilibrium;", 
+            "description": "Named entity: ReverseEquilibrium; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21cb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ReverseUpEquilibrium", 
+            "description": "Bad named entity: ReverseUpEquilibrium without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ReverseUpEquilibrium"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ReverseUpEquilibrium;", 
+            "description": "Named entity: ReverseUpEquilibrium; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u296f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rfr", 
+            "description": "Bad named entity: Rfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Rfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rfr;", 
+            "description": "Named entity: Rfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rho", 
+            "description": "Bad named entity: Rho without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Rho"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rho;", 
+            "description": "Named entity: Rho; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03a1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightAngleBracket", 
+            "description": "Bad named entity: RightAngleBracket without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightAngleBracket"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightAngleBracket;", 
+            "description": "Named entity: RightAngleBracket; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27e9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightArrow", 
+            "description": "Bad named entity: RightArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightArrow;", 
+            "description": "Named entity: RightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2192"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightArrowBar", 
+            "description": "Bad named entity: RightArrowBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightArrowBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightArrowBar;", 
+            "description": "Named entity: RightArrowBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21e5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightArrowLeftArrow", 
+            "description": "Bad named entity: RightArrowLeftArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightArrowLeftArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightArrowLeftArrow;", 
+            "description": "Named entity: RightArrowLeftArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightCeiling", 
+            "description": "Bad named entity: RightCeiling without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightCeiling"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightCeiling;", 
+            "description": "Named entity: RightCeiling; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2309"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightDoubleBracket", 
+            "description": "Bad named entity: RightDoubleBracket without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightDoubleBracket"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightDoubleBracket;", 
+            "description": "Named entity: RightDoubleBracket; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27e7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightDownTeeVector", 
+            "description": "Bad named entity: RightDownTeeVector without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightDownTeeVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightDownTeeVector;", 
+            "description": "Named entity: RightDownTeeVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u295d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightDownVector", 
+            "description": "Bad named entity: RightDownVector without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightDownVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightDownVector;", 
+            "description": "Named entity: RightDownVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightDownVectorBar", 
+            "description": "Bad named entity: RightDownVectorBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightDownVectorBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightDownVectorBar;", 
+            "description": "Named entity: RightDownVectorBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2955"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightFloor", 
+            "description": "Bad named entity: RightFloor without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightFloor"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightFloor;", 
+            "description": "Named entity: RightFloor; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u230b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightTee", 
+            "description": "Bad named entity: RightTee without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightTee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightTee;", 
+            "description": "Named entity: RightTee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightTeeArrow", 
+            "description": "Bad named entity: RightTeeArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightTeeArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightTeeArrow;", 
+            "description": "Named entity: RightTeeArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightTeeVector", 
+            "description": "Bad named entity: RightTeeVector without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightTeeVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightTeeVector;", 
+            "description": "Named entity: RightTeeVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u295b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightTriangle", 
+            "description": "Bad named entity: RightTriangle without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightTriangle"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightTriangle;", 
+            "description": "Named entity: RightTriangle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightTriangleBar", 
+            "description": "Bad named entity: RightTriangleBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightTriangleBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightTriangleBar;", 
+            "description": "Named entity: RightTriangleBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29d0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightTriangleEqual", 
+            "description": "Bad named entity: RightTriangleEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightTriangleEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightTriangleEqual;", 
+            "description": "Named entity: RightTriangleEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightUpDownVector", 
+            "description": "Bad named entity: RightUpDownVector without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightUpDownVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightUpDownVector;", 
+            "description": "Named entity: RightUpDownVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u294f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightUpTeeVector", 
+            "description": "Bad named entity: RightUpTeeVector without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightUpTeeVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightUpTeeVector;", 
+            "description": "Named entity: RightUpTeeVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u295c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightUpVector", 
+            "description": "Bad named entity: RightUpVector without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightUpVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightUpVector;", 
+            "description": "Named entity: RightUpVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21be"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightUpVectorBar", 
+            "description": "Bad named entity: RightUpVectorBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightUpVectorBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightUpVectorBar;", 
+            "description": "Named entity: RightUpVectorBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2954"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightVector", 
+            "description": "Bad named entity: RightVector without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightVector;", 
+            "description": "Named entity: RightVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightVectorBar", 
+            "description": "Bad named entity: RightVectorBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RightVectorBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightVectorBar;", 
+            "description": "Named entity: RightVectorBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2953"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rightarrow", 
+            "description": "Bad named entity: Rightarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Rightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rightarrow;", 
+            "description": "Named entity: Rightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ropf", 
+            "description": "Bad named entity: Ropf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Ropf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ropf;", 
+            "description": "Named entity: Ropf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RoundImplies", 
+            "description": "Bad named entity: RoundImplies without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RoundImplies"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RoundImplies;", 
+            "description": "Named entity: RoundImplies; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2970"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rrightarrow", 
+            "description": "Bad named entity: Rrightarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Rrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rrightarrow;", 
+            "description": "Named entity: Rrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21db"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rscr", 
+            "description": "Bad named entity: Rscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Rscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rscr;", 
+            "description": "Named entity: Rscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rsh", 
+            "description": "Bad named entity: Rsh without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Rsh"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rsh;", 
+            "description": "Named entity: Rsh; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RuleDelayed", 
+            "description": "Bad named entity: RuleDelayed without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&RuleDelayed"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RuleDelayed;", 
+            "description": "Named entity: RuleDelayed; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29f4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SHCHcy", 
+            "description": "Bad named entity: SHCHcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&SHCHcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SHCHcy;", 
+            "description": "Named entity: SHCHcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0429"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SHcy", 
+            "description": "Bad named entity: SHcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&SHcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SHcy;", 
+            "description": "Named entity: SHcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0428"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SOFTcy", 
+            "description": "Bad named entity: SOFTcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&SOFTcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SOFTcy;", 
+            "description": "Named entity: SOFTcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u042c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sacute", 
+            "description": "Bad named entity: Sacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Sacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sacute;", 
+            "description": "Named entity: Sacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u015a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sc", 
+            "description": "Bad named entity: Sc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Sc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sc;", 
+            "description": "Named entity: Sc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2abc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Scaron", 
+            "description": "Bad named entity: Scaron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Scaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Scaron;", 
+            "description": "Named entity: Scaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0160"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Scedil", 
+            "description": "Bad named entity: Scedil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Scedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Scedil;", 
+            "description": "Named entity: Scedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u015e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Scirc", 
+            "description": "Bad named entity: Scirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Scirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Scirc;", 
+            "description": "Named entity: Scirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u015c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Scy", 
+            "description": "Bad named entity: Scy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Scy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Scy;", 
+            "description": "Named entity: Scy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0421"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sfr", 
+            "description": "Bad named entity: Sfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Sfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sfr;", 
+            "description": "Named entity: Sfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd16"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ShortDownArrow", 
+            "description": "Bad named entity: ShortDownArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ShortDownArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ShortDownArrow;", 
+            "description": "Named entity: ShortDownArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2193"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ShortLeftArrow", 
+            "description": "Bad named entity: ShortLeftArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ShortLeftArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ShortLeftArrow;", 
+            "description": "Named entity: ShortLeftArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2190"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ShortRightArrow", 
+            "description": "Bad named entity: ShortRightArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ShortRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ShortRightArrow;", 
+            "description": "Named entity: ShortRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2192"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ShortUpArrow", 
+            "description": "Bad named entity: ShortUpArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ShortUpArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ShortUpArrow;", 
+            "description": "Named entity: ShortUpArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2191"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sigma", 
+            "description": "Bad named entity: Sigma without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Sigma"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sigma;", 
+            "description": "Named entity: Sigma; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03a3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SmallCircle", 
+            "description": "Bad named entity: SmallCircle without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&SmallCircle"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SmallCircle;", 
+            "description": "Named entity: SmallCircle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2218"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sopf", 
+            "description": "Bad named entity: Sopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Sopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sopf;", 
+            "description": "Named entity: Sopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd4a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sqrt", 
+            "description": "Bad named entity: Sqrt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Sqrt"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sqrt;", 
+            "description": "Named entity: Sqrt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u221a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Square", 
+            "description": "Bad named entity: Square without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Square"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Square;", 
+            "description": "Named entity: Square; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25a1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SquareIntersection", 
+            "description": "Bad named entity: SquareIntersection without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&SquareIntersection"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SquareIntersection;", 
+            "description": "Named entity: SquareIntersection; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2293"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SquareSubset", 
+            "description": "Bad named entity: SquareSubset without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&SquareSubset"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SquareSubset;", 
+            "description": "Named entity: SquareSubset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SquareSubsetEqual", 
+            "description": "Bad named entity: SquareSubsetEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&SquareSubsetEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SquareSubsetEqual;", 
+            "description": "Named entity: SquareSubsetEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2291"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SquareSuperset", 
+            "description": "Bad named entity: SquareSuperset without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&SquareSuperset"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SquareSuperset;", 
+            "description": "Named entity: SquareSuperset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2290"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SquareSupersetEqual", 
+            "description": "Bad named entity: SquareSupersetEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&SquareSupersetEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SquareSupersetEqual;", 
+            "description": "Named entity: SquareSupersetEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2292"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SquareUnion", 
+            "description": "Bad named entity: SquareUnion without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&SquareUnion"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SquareUnion;", 
+            "description": "Named entity: SquareUnion; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2294"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sscr", 
+            "description": "Bad named entity: Sscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Sscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sscr;", 
+            "description": "Named entity: Sscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Star", 
+            "description": "Bad named entity: Star without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Star"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Star;", 
+            "description": "Named entity: Star; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sub", 
+            "description": "Bad named entity: Sub without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Sub"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sub;", 
+            "description": "Named entity: Sub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Subset", 
+            "description": "Bad named entity: Subset without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Subset"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Subset;", 
+            "description": "Named entity: Subset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SubsetEqual", 
+            "description": "Bad named entity: SubsetEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&SubsetEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SubsetEqual;", 
+            "description": "Named entity: SubsetEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2286"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Succeeds", 
+            "description": "Bad named entity: Succeeds without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Succeeds"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Succeeds;", 
+            "description": "Named entity: Succeeds; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SucceedsEqual", 
+            "description": "Bad named entity: SucceedsEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&SucceedsEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SucceedsEqual;", 
+            "description": "Named entity: SucceedsEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SucceedsSlantEqual", 
+            "description": "Bad named entity: SucceedsSlantEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&SucceedsSlantEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SucceedsSlantEqual;", 
+            "description": "Named entity: SucceedsSlantEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SucceedsTilde", 
+            "description": "Bad named entity: SucceedsTilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&SucceedsTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SucceedsTilde;", 
+            "description": "Named entity: SucceedsTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SuchThat", 
+            "description": "Bad named entity: SuchThat without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&SuchThat"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SuchThat;", 
+            "description": "Named entity: SuchThat; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u220b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sum", 
+            "description": "Bad named entity: Sum without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Sum"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sum;", 
+            "description": "Named entity: Sum; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2211"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sup", 
+            "description": "Bad named entity: Sup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Sup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sup;", 
+            "description": "Named entity: Sup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Superset", 
+            "description": "Bad named entity: Superset without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Superset"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Superset;", 
+            "description": "Named entity: Superset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2283"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SupersetEqual", 
+            "description": "Bad named entity: SupersetEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&SupersetEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SupersetEqual;", 
+            "description": "Named entity: SupersetEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2287"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Supset", 
+            "description": "Bad named entity: Supset without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Supset"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Supset;", 
+            "description": "Named entity: Supset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&THORN", 
+            "description": "Named entity: THORN without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00de"
+                ]
+            ]
+        }, 
+        {
+            "input": "&THORN;", 
+            "description": "Named entity: THORN; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00de"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TRADE", 
+            "description": "Bad named entity: TRADE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&TRADE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TRADE;", 
+            "description": "Named entity: TRADE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2122"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TSHcy", 
+            "description": "Bad named entity: TSHcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&TSHcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TSHcy;", 
+            "description": "Named entity: TSHcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u040b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TScy", 
+            "description": "Bad named entity: TScy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&TScy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TScy;", 
+            "description": "Named entity: TScy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0426"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tab", 
+            "description": "Bad named entity: Tab without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Tab"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tab;", 
+            "description": "Named entity: Tab; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\t"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tau", 
+            "description": "Bad named entity: Tau without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Tau"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tau;", 
+            "description": "Named entity: Tau; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03a4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tcaron", 
+            "description": "Bad named entity: Tcaron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Tcaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tcaron;", 
+            "description": "Named entity: Tcaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0164"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tcedil", 
+            "description": "Bad named entity: Tcedil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Tcedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tcedil;", 
+            "description": "Named entity: Tcedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0162"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tcy", 
+            "description": "Bad named entity: Tcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Tcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tcy;", 
+            "description": "Named entity: Tcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0422"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tfr", 
+            "description": "Bad named entity: Tfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Tfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tfr;", 
+            "description": "Named entity: Tfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd17"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Therefore", 
+            "description": "Bad named entity: Therefore without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Therefore"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Therefore;", 
+            "description": "Named entity: Therefore; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2234"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Theta", 
+            "description": "Bad named entity: Theta without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Theta"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Theta;", 
+            "description": "Named entity: Theta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0398"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ThickSpace", 
+            "description": "Bad named entity: ThickSpace without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ThickSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ThickSpace;", 
+            "description": "Named entity: ThickSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u205f\u200a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ThinSpace", 
+            "description": "Bad named entity: ThinSpace without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ThinSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ThinSpace;", 
+            "description": "Named entity: ThinSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2009"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tilde", 
+            "description": "Bad named entity: Tilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Tilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tilde;", 
+            "description": "Named entity: Tilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TildeEqual", 
+            "description": "Bad named entity: TildeEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&TildeEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TildeEqual;", 
+            "description": "Named entity: TildeEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2243"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TildeFullEqual", 
+            "description": "Bad named entity: TildeFullEqual without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&TildeFullEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TildeFullEqual;", 
+            "description": "Named entity: TildeFullEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2245"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TildeTilde", 
+            "description": "Bad named entity: TildeTilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&TildeTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TildeTilde;", 
+            "description": "Named entity: TildeTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2248"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Topf", 
+            "description": "Bad named entity: Topf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Topf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Topf;", 
+            "description": "Named entity: Topf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd4b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TripleDot", 
+            "description": "Bad named entity: TripleDot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&TripleDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TripleDot;", 
+            "description": "Named entity: TripleDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u20db"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tscr", 
+            "description": "Bad named entity: Tscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Tscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tscr;", 
+            "description": "Named entity: Tscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcaf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tstrok", 
+            "description": "Bad named entity: Tstrok without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Tstrok"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tstrok;", 
+            "description": "Named entity: Tstrok; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0166"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uacute", 
+            "description": "Named entity: Uacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00da"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uacute;", 
+            "description": "Named entity: Uacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00da"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uarr", 
+            "description": "Bad named entity: Uarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Uarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uarr;", 
+            "description": "Named entity: Uarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u219f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uarrocir", 
+            "description": "Bad named entity: Uarrocir without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Uarrocir"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uarrocir;", 
+            "description": "Named entity: Uarrocir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2949"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ubrcy", 
+            "description": "Bad named entity: Ubrcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Ubrcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ubrcy;", 
+            "description": "Named entity: Ubrcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u040e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ubreve", 
+            "description": "Bad named entity: Ubreve without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Ubreve"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ubreve;", 
+            "description": "Named entity: Ubreve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u016c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ucirc", 
+            "description": "Named entity: Ucirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00db"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ucirc;", 
+            "description": "Named entity: Ucirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00db"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ucy", 
+            "description": "Bad named entity: Ucy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Ucy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ucy;", 
+            "description": "Named entity: Ucy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0423"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Udblac", 
+            "description": "Bad named entity: Udblac without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Udblac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Udblac;", 
+            "description": "Named entity: Udblac; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0170"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ufr", 
+            "description": "Bad named entity: Ufr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Ufr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ufr;", 
+            "description": "Named entity: Ufr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd18"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ugrave", 
+            "description": "Named entity: Ugrave without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00d9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ugrave;", 
+            "description": "Named entity: Ugrave; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00d9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Umacr", 
+            "description": "Bad named entity: Umacr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Umacr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Umacr;", 
+            "description": "Named entity: Umacr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u016a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UnderBar", 
+            "description": "Bad named entity: UnderBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&UnderBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UnderBar;", 
+            "description": "Named entity: UnderBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "_"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UnderBrace", 
+            "description": "Bad named entity: UnderBrace without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&UnderBrace"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UnderBrace;", 
+            "description": "Named entity: UnderBrace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23df"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UnderBracket", 
+            "description": "Bad named entity: UnderBracket without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&UnderBracket"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UnderBracket;", 
+            "description": "Named entity: UnderBracket; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UnderParenthesis", 
+            "description": "Bad named entity: UnderParenthesis without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&UnderParenthesis"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UnderParenthesis;", 
+            "description": "Named entity: UnderParenthesis; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23dd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Union", 
+            "description": "Bad named entity: Union without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Union"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Union;", 
+            "description": "Named entity: Union; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UnionPlus", 
+            "description": "Bad named entity: UnionPlus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&UnionPlus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UnionPlus;", 
+            "description": "Named entity: UnionPlus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uogon", 
+            "description": "Bad named entity: Uogon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Uogon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uogon;", 
+            "description": "Named entity: Uogon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0172"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uopf", 
+            "description": "Bad named entity: Uopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Uopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uopf;", 
+            "description": "Named entity: Uopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd4c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpArrow", 
+            "description": "Bad named entity: UpArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&UpArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpArrow;", 
+            "description": "Named entity: UpArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2191"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpArrowBar", 
+            "description": "Bad named entity: UpArrowBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&UpArrowBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpArrowBar;", 
+            "description": "Named entity: UpArrowBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2912"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpArrowDownArrow", 
+            "description": "Bad named entity: UpArrowDownArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&UpArrowDownArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpArrowDownArrow;", 
+            "description": "Named entity: UpArrowDownArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpDownArrow", 
+            "description": "Bad named entity: UpDownArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&UpDownArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpDownArrow;", 
+            "description": "Named entity: UpDownArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2195"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpEquilibrium", 
+            "description": "Bad named entity: UpEquilibrium without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&UpEquilibrium"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpEquilibrium;", 
+            "description": "Named entity: UpEquilibrium; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u296e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpTee", 
+            "description": "Bad named entity: UpTee without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&UpTee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpTee;", 
+            "description": "Named entity: UpTee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpTeeArrow", 
+            "description": "Bad named entity: UpTeeArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&UpTeeArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpTeeArrow;", 
+            "description": "Named entity: UpTeeArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uparrow", 
+            "description": "Bad named entity: Uparrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Uparrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uparrow;", 
+            "description": "Named entity: Uparrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Updownarrow", 
+            "description": "Bad named entity: Updownarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Updownarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Updownarrow;", 
+            "description": "Named entity: Updownarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpperLeftArrow", 
+            "description": "Bad named entity: UpperLeftArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&UpperLeftArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpperLeftArrow;", 
+            "description": "Named entity: UpperLeftArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2196"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpperRightArrow", 
+            "description": "Bad named entity: UpperRightArrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&UpperRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpperRightArrow;", 
+            "description": "Named entity: UpperRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2197"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Upsi", 
+            "description": "Bad named entity: Upsi without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Upsi"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Upsi;", 
+            "description": "Named entity: Upsi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Upsilon", 
+            "description": "Bad named entity: Upsilon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Upsilon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Upsilon;", 
+            "description": "Named entity: Upsilon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03a5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uring", 
+            "description": "Bad named entity: Uring without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Uring"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uring;", 
+            "description": "Named entity: Uring; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u016e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uscr", 
+            "description": "Bad named entity: Uscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Uscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uscr;", 
+            "description": "Named entity: Uscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcb0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Utilde", 
+            "description": "Bad named entity: Utilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Utilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Utilde;", 
+            "description": "Named entity: Utilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0168"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uuml", 
+            "description": "Named entity: Uuml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00dc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uuml;", 
+            "description": "Named entity: Uuml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00dc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&VDash", 
+            "description": "Bad named entity: VDash without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&VDash"
+                ]
+            ]
+        }, 
+        {
+            "input": "&VDash;", 
+            "description": "Named entity: VDash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ab"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vbar", 
+            "description": "Bad named entity: Vbar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Vbar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vbar;", 
+            "description": "Named entity: Vbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aeb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vcy", 
+            "description": "Bad named entity: Vcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Vcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vcy;", 
+            "description": "Named entity: Vcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0412"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vdash", 
+            "description": "Bad named entity: Vdash without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Vdash"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vdash;", 
+            "description": "Named entity: Vdash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vdashl", 
+            "description": "Bad named entity: Vdashl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Vdashl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vdashl;", 
+            "description": "Named entity: Vdashl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ae6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vee", 
+            "description": "Bad named entity: Vee without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Vee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vee;", 
+            "description": "Named entity: Vee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Verbar", 
+            "description": "Bad named entity: Verbar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Verbar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Verbar;", 
+            "description": "Named entity: Verbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2016"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vert", 
+            "description": "Bad named entity: Vert without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Vert"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vert;", 
+            "description": "Named entity: Vert; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2016"
+                ]
+            ]
+        }, 
+        {
+            "input": "&VerticalBar", 
+            "description": "Bad named entity: VerticalBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&VerticalBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&VerticalBar;", 
+            "description": "Named entity: VerticalBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2223"
+                ]
+            ]
+        }, 
+        {
+            "input": "&VerticalLine", 
+            "description": "Bad named entity: VerticalLine without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&VerticalLine"
+                ]
+            ]
+        }, 
+        {
+            "input": "&VerticalLine;", 
+            "description": "Named entity: VerticalLine; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "|"
+                ]
+            ]
+        }, 
+        {
+            "input": "&VerticalSeparator", 
+            "description": "Bad named entity: VerticalSeparator without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&VerticalSeparator"
+                ]
+            ]
+        }, 
+        {
+            "input": "&VerticalSeparator;", 
+            "description": "Named entity: VerticalSeparator; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2758"
+                ]
+            ]
+        }, 
+        {
+            "input": "&VerticalTilde", 
+            "description": "Bad named entity: VerticalTilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&VerticalTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "&VerticalTilde;", 
+            "description": "Named entity: VerticalTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2240"
+                ]
+            ]
+        }, 
+        {
+            "input": "&VeryThinSpace", 
+            "description": "Bad named entity: VeryThinSpace without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&VeryThinSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": "&VeryThinSpace;", 
+            "description": "Named entity: VeryThinSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vfr", 
+            "description": "Bad named entity: Vfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Vfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vfr;", 
+            "description": "Named entity: Vfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd19"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vopf", 
+            "description": "Bad named entity: Vopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Vopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vopf;", 
+            "description": "Named entity: Vopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd4d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vscr", 
+            "description": "Bad named entity: Vscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Vscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vscr;", 
+            "description": "Named entity: Vscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcb1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vvdash", 
+            "description": "Bad named entity: Vvdash without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Vvdash"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vvdash;", 
+            "description": "Named entity: Vvdash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22aa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Wcirc", 
+            "description": "Bad named entity: Wcirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Wcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Wcirc;", 
+            "description": "Named entity: Wcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0174"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Wedge", 
+            "description": "Bad named entity: Wedge without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Wedge"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Wedge;", 
+            "description": "Named entity: Wedge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Wfr", 
+            "description": "Bad named entity: Wfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Wfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Wfr;", 
+            "description": "Named entity: Wfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd1a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Wopf", 
+            "description": "Bad named entity: Wopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Wopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Wopf;", 
+            "description": "Named entity: Wopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd4e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Wscr", 
+            "description": "Bad named entity: Wscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Wscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Wscr;", 
+            "description": "Named entity: Wscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcb2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Xfr", 
+            "description": "Bad named entity: Xfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Xfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Xfr;", 
+            "description": "Named entity: Xfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd1b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Xi", 
+            "description": "Bad named entity: Xi without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Xi"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Xi;", 
+            "description": "Named entity: Xi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u039e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Xopf", 
+            "description": "Bad named entity: Xopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Xopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Xopf;", 
+            "description": "Named entity: Xopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd4f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Xscr", 
+            "description": "Bad named entity: Xscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Xscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Xscr;", 
+            "description": "Named entity: Xscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcb3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&YAcy", 
+            "description": "Bad named entity: YAcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&YAcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&YAcy;", 
+            "description": "Named entity: YAcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u042f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&YIcy", 
+            "description": "Bad named entity: YIcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&YIcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&YIcy;", 
+            "description": "Named entity: YIcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0407"
+                ]
+            ]
+        }, 
+        {
+            "input": "&YUcy", 
+            "description": "Bad named entity: YUcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&YUcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&YUcy;", 
+            "description": "Named entity: YUcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u042e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Yacute", 
+            "description": "Named entity: Yacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00dd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Yacute;", 
+            "description": "Named entity: Yacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00dd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ycirc", 
+            "description": "Bad named entity: Ycirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Ycirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ycirc;", 
+            "description": "Named entity: Ycirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0176"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ycy", 
+            "description": "Bad named entity: Ycy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Ycy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ycy;", 
+            "description": "Named entity: Ycy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u042b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Yfr", 
+            "description": "Bad named entity: Yfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Yfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Yfr;", 
+            "description": "Named entity: Yfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd1c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Yopf", 
+            "description": "Bad named entity: Yopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Yopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Yopf;", 
+            "description": "Named entity: Yopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd50"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Yscr", 
+            "description": "Bad named entity: Yscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Yscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Yscr;", 
+            "description": "Named entity: Yscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcb4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Yuml", 
+            "description": "Bad named entity: Yuml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Yuml"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Yuml;", 
+            "description": "Named entity: Yuml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0178"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ZHcy", 
+            "description": "Bad named entity: ZHcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ZHcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ZHcy;", 
+            "description": "Named entity: ZHcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0416"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zacute", 
+            "description": "Bad named entity: Zacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Zacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zacute;", 
+            "description": "Named entity: Zacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0179"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zcaron", 
+            "description": "Bad named entity: Zcaron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Zcaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zcaron;", 
+            "description": "Named entity: Zcaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u017d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zcy", 
+            "description": "Bad named entity: Zcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Zcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zcy;", 
+            "description": "Named entity: Zcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0417"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zdot", 
+            "description": "Bad named entity: Zdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Zdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zdot;", 
+            "description": "Named entity: Zdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u017b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ZeroWidthSpace", 
+            "description": "Bad named entity: ZeroWidthSpace without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ZeroWidthSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ZeroWidthSpace;", 
+            "description": "Named entity: ZeroWidthSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zeta", 
+            "description": "Bad named entity: Zeta without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Zeta"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zeta;", 
+            "description": "Named entity: Zeta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0396"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zfr", 
+            "description": "Bad named entity: Zfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Zfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zfr;", 
+            "description": "Named entity: Zfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2128"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zopf", 
+            "description": "Bad named entity: Zopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Zopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zopf;", 
+            "description": "Named entity: Zopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2124"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zscr", 
+            "description": "Bad named entity: Zscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&Zscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zscr;", 
+            "description": "Named entity: Zscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcb5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&aacute", 
+            "description": "Named entity: aacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00e1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&aacute;", 
+            "description": "Named entity: aacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00e1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&abreve", 
+            "description": "Bad named entity: abreve without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&abreve"
+                ]
+            ]
+        }, 
+        {
+            "input": "&abreve;", 
+            "description": "Named entity: abreve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0103"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ac", 
+            "description": "Bad named entity: ac without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ac;", 
+            "description": "Named entity: ac; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&acE", 
+            "description": "Bad named entity: acE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&acE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&acE;", 
+            "description": "Named entity: acE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223e\u0333"
+                ]
+            ]
+        }, 
+        {
+            "input": "&acd", 
+            "description": "Bad named entity: acd without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&acd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&acd;", 
+            "description": "Named entity: acd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&acirc", 
+            "description": "Named entity: acirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00e2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&acirc;", 
+            "description": "Named entity: acirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00e2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&acute", 
+            "description": "Named entity: acute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&acute;", 
+            "description": "Named entity: acute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&acy", 
+            "description": "Bad named entity: acy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&acy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&acy;", 
+            "description": "Named entity: acy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0430"
+                ]
+            ]
+        }, 
+        {
+            "input": "&aelig", 
+            "description": "Named entity: aelig without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00e6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&aelig;", 
+            "description": "Named entity: aelig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00e6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&af", 
+            "description": "Bad named entity: af without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&af"
+                ]
+            ]
+        }, 
+        {
+            "input": "&af;", 
+            "description": "Named entity: af; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2061"
+                ]
+            ]
+        }, 
+        {
+            "input": "&afr", 
+            "description": "Bad named entity: afr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&afr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&afr;", 
+            "description": "Named entity: afr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd1e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&agrave", 
+            "description": "Named entity: agrave without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00e0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&agrave;", 
+            "description": "Named entity: agrave; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00e0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&alefsym", 
+            "description": "Bad named entity: alefsym without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&alefsym"
+                ]
+            ]
+        }, 
+        {
+            "input": "&alefsym;", 
+            "description": "Named entity: alefsym; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2135"
+                ]
+            ]
+        }, 
+        {
+            "input": "&aleph", 
+            "description": "Bad named entity: aleph without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&aleph"
+                ]
+            ]
+        }, 
+        {
+            "input": "&aleph;", 
+            "description": "Named entity: aleph; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2135"
+                ]
+            ]
+        }, 
+        {
+            "input": "&alpha", 
+            "description": "Bad named entity: alpha without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&alpha"
+                ]
+            ]
+        }, 
+        {
+            "input": "&alpha;", 
+            "description": "Named entity: alpha; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&amacr", 
+            "description": "Bad named entity: amacr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&amacr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&amacr;", 
+            "description": "Named entity: amacr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0101"
+                ]
+            ]
+        }, 
+        {
+            "input": "&amalg", 
+            "description": "Bad named entity: amalg without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&amalg"
+                ]
+            ]
+        }, 
+        {
+            "input": "&amalg;", 
+            "description": "Named entity: amalg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a3f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&amp", 
+            "description": "Named entity: amp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&"
+                ]
+            ]
+        }, 
+        {
+            "input": "&amp;", 
+            "description": "Named entity: amp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&"
+                ]
+            ]
+        }, 
+        {
+            "input": "&and", 
+            "description": "Bad named entity: and without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&and"
+                ]
+            ]
+        }, 
+        {
+            "input": "&and;", 
+            "description": "Named entity: and; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2227"
+                ]
+            ]
+        }, 
+        {
+            "input": "&andand", 
+            "description": "Bad named entity: andand without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&andand"
+                ]
+            ]
+        }, 
+        {
+            "input": "&andand;", 
+            "description": "Named entity: andand; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a55"
+                ]
+            ]
+        }, 
+        {
+            "input": "&andd", 
+            "description": "Bad named entity: andd without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&andd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&andd;", 
+            "description": "Named entity: andd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a5c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&andslope", 
+            "description": "Bad named entity: andslope without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&andslope"
+                ]
+            ]
+        }, 
+        {
+            "input": "&andslope;", 
+            "description": "Named entity: andslope; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a58"
+                ]
+            ]
+        }, 
+        {
+            "input": "&andv", 
+            "description": "Bad named entity: andv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&andv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&andv;", 
+            "description": "Named entity: andv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a5a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ang", 
+            "description": "Bad named entity: ang without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ang"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ang;", 
+            "description": "Named entity: ang; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2220"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ange", 
+            "description": "Bad named entity: ange without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ange"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ange;", 
+            "description": "Named entity: ange; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29a4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angle", 
+            "description": "Bad named entity: angle without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&angle"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angle;", 
+            "description": "Named entity: angle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2220"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsd", 
+            "description": "Bad named entity: angmsd without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&angmsd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsd;", 
+            "description": "Named entity: angmsd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2221"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdaa", 
+            "description": "Bad named entity: angmsdaa without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&angmsdaa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdaa;", 
+            "description": "Named entity: angmsdaa; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29a8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdab", 
+            "description": "Bad named entity: angmsdab without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&angmsdab"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdab;", 
+            "description": "Named entity: angmsdab; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29a9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdac", 
+            "description": "Bad named entity: angmsdac without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&angmsdac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdac;", 
+            "description": "Named entity: angmsdac; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29aa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdad", 
+            "description": "Bad named entity: angmsdad without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&angmsdad"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdad;", 
+            "description": "Named entity: angmsdad; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29ab"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdae", 
+            "description": "Bad named entity: angmsdae without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&angmsdae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdae;", 
+            "description": "Named entity: angmsdae; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29ac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdaf", 
+            "description": "Bad named entity: angmsdaf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&angmsdaf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdaf;", 
+            "description": "Named entity: angmsdaf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29ad"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdag", 
+            "description": "Bad named entity: angmsdag without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&angmsdag"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdag;", 
+            "description": "Named entity: angmsdag; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29ae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdah", 
+            "description": "Bad named entity: angmsdah without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&angmsdah"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdah;", 
+            "description": "Named entity: angmsdah; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29af"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angrt", 
+            "description": "Bad named entity: angrt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&angrt"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angrt;", 
+            "description": "Named entity: angrt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u221f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angrtvb", 
+            "description": "Bad named entity: angrtvb without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&angrtvb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angrtvb;", 
+            "description": "Named entity: angrtvb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22be"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angrtvbd", 
+            "description": "Bad named entity: angrtvbd without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&angrtvbd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angrtvbd;", 
+            "description": "Named entity: angrtvbd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u299d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angsph", 
+            "description": "Bad named entity: angsph without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&angsph"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angsph;", 
+            "description": "Named entity: angsph; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2222"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angst", 
+            "description": "Bad named entity: angst without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&angst"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angst;", 
+            "description": "Named entity: angst; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angzarr", 
+            "description": "Bad named entity: angzarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&angzarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angzarr;", 
+            "description": "Named entity: angzarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u237c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&aogon", 
+            "description": "Bad named entity: aogon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&aogon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&aogon;", 
+            "description": "Named entity: aogon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0105"
+                ]
+            ]
+        }, 
+        {
+            "input": "&aopf", 
+            "description": "Bad named entity: aopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&aopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&aopf;", 
+            "description": "Named entity: aopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd52"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ap", 
+            "description": "Bad named entity: ap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ap;", 
+            "description": "Named entity: ap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2248"
+                ]
+            ]
+        }, 
+        {
+            "input": "&apE", 
+            "description": "Bad named entity: apE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&apE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&apE;", 
+            "description": "Named entity: apE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a70"
+                ]
+            ]
+        }, 
+        {
+            "input": "&apacir", 
+            "description": "Bad named entity: apacir without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&apacir"
+                ]
+            ]
+        }, 
+        {
+            "input": "&apacir;", 
+            "description": "Named entity: apacir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a6f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ape", 
+            "description": "Bad named entity: ape without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ape"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ape;", 
+            "description": "Named entity: ape; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&apid", 
+            "description": "Bad named entity: apid without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&apid"
+                ]
+            ]
+        }, 
+        {
+            "input": "&apid;", 
+            "description": "Named entity: apid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&apos", 
+            "description": "Bad named entity: apos without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&apos"
+                ]
+            ]
+        }, 
+        {
+            "input": "&apos;", 
+            "description": "Named entity: apos; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "'"
+                ]
+            ]
+        }, 
+        {
+            "input": "&approx", 
+            "description": "Bad named entity: approx without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&approx"
+                ]
+            ]
+        }, 
+        {
+            "input": "&approx;", 
+            "description": "Named entity: approx; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2248"
+                ]
+            ]
+        }, 
+        {
+            "input": "&approxeq", 
+            "description": "Bad named entity: approxeq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&approxeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&approxeq;", 
+            "description": "Named entity: approxeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&aring", 
+            "description": "Named entity: aring without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00e5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&aring;", 
+            "description": "Named entity: aring; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00e5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ascr", 
+            "description": "Bad named entity: ascr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ascr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ascr;", 
+            "description": "Named entity: ascr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcb6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ast", 
+            "description": "Bad named entity: ast without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ast"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ast;", 
+            "description": "Named entity: ast; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "*"
+                ]
+            ]
+        }, 
+        {
+            "input": "&asymp", 
+            "description": "Bad named entity: asymp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&asymp"
+                ]
+            ]
+        }, 
+        {
+            "input": "&asymp;", 
+            "description": "Named entity: asymp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2248"
+                ]
+            ]
+        }, 
+        {
+            "input": "&asympeq", 
+            "description": "Bad named entity: asympeq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&asympeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&asympeq;", 
+            "description": "Named entity: asympeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&atilde", 
+            "description": "Named entity: atilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00e3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&atilde;", 
+            "description": "Named entity: atilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00e3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&auml", 
+            "description": "Named entity: auml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00e4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&auml;", 
+            "description": "Named entity: auml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00e4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&awconint", 
+            "description": "Bad named entity: awconint without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&awconint"
+                ]
+            ]
+        }, 
+        {
+            "input": "&awconint;", 
+            "description": "Named entity: awconint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2233"
+                ]
+            ]
+        }, 
+        {
+            "input": "&awint", 
+            "description": "Bad named entity: awint without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&awint"
+                ]
+            ]
+        }, 
+        {
+            "input": "&awint;", 
+            "description": "Named entity: awint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a11"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bNot", 
+            "description": "Bad named entity: bNot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bNot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bNot;", 
+            "description": "Named entity: bNot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aed"
+                ]
+            ]
+        }, 
+        {
+            "input": "&backcong", 
+            "description": "Bad named entity: backcong without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&backcong"
+                ]
+            ]
+        }, 
+        {
+            "input": "&backcong;", 
+            "description": "Named entity: backcong; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&backepsilon", 
+            "description": "Bad named entity: backepsilon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&backepsilon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&backepsilon;", 
+            "description": "Named entity: backepsilon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03f6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&backprime", 
+            "description": "Bad named entity: backprime without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&backprime"
+                ]
+            ]
+        }, 
+        {
+            "input": "&backprime;", 
+            "description": "Named entity: backprime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2035"
+                ]
+            ]
+        }, 
+        {
+            "input": "&backsim", 
+            "description": "Bad named entity: backsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&backsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&backsim;", 
+            "description": "Named entity: backsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&backsimeq", 
+            "description": "Bad named entity: backsimeq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&backsimeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&backsimeq;", 
+            "description": "Named entity: backsimeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22cd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&barvee", 
+            "description": "Bad named entity: barvee without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&barvee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&barvee;", 
+            "description": "Named entity: barvee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22bd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&barwed", 
+            "description": "Bad named entity: barwed without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&barwed"
+                ]
+            ]
+        }, 
+        {
+            "input": "&barwed;", 
+            "description": "Named entity: barwed; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2305"
+                ]
+            ]
+        }, 
+        {
+            "input": "&barwedge", 
+            "description": "Bad named entity: barwedge without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&barwedge"
+                ]
+            ]
+        }, 
+        {
+            "input": "&barwedge;", 
+            "description": "Named entity: barwedge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2305"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bbrk", 
+            "description": "Bad named entity: bbrk without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bbrk"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bbrk;", 
+            "description": "Named entity: bbrk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bbrktbrk", 
+            "description": "Bad named entity: bbrktbrk without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bbrktbrk"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bbrktbrk;", 
+            "description": "Named entity: bbrktbrk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23b6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bcong", 
+            "description": "Bad named entity: bcong without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bcong"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bcong;", 
+            "description": "Named entity: bcong; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bcy", 
+            "description": "Bad named entity: bcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bcy;", 
+            "description": "Named entity: bcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0431"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bdquo", 
+            "description": "Bad named entity: bdquo without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bdquo"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bdquo;", 
+            "description": "Named entity: bdquo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u201e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&becaus", 
+            "description": "Bad named entity: becaus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&becaus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&becaus;", 
+            "description": "Named entity: becaus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2235"
+                ]
+            ]
+        }, 
+        {
+            "input": "&because", 
+            "description": "Bad named entity: because without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&because"
+                ]
+            ]
+        }, 
+        {
+            "input": "&because;", 
+            "description": "Named entity: because; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2235"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bemptyv", 
+            "description": "Bad named entity: bemptyv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bemptyv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bemptyv;", 
+            "description": "Named entity: bemptyv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29b0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bepsi", 
+            "description": "Bad named entity: bepsi without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bepsi"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bepsi;", 
+            "description": "Named entity: bepsi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03f6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bernou", 
+            "description": "Bad named entity: bernou without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bernou"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bernou;", 
+            "description": "Named entity: bernou; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u212c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&beta", 
+            "description": "Bad named entity: beta without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&beta"
+                ]
+            ]
+        }, 
+        {
+            "input": "&beta;", 
+            "description": "Named entity: beta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03b2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&beth", 
+            "description": "Bad named entity: beth without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&beth"
+                ]
+            ]
+        }, 
+        {
+            "input": "&beth;", 
+            "description": "Named entity: beth; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2136"
+                ]
+            ]
+        }, 
+        {
+            "input": "&between", 
+            "description": "Bad named entity: between without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&between"
+                ]
+            ]
+        }, 
+        {
+            "input": "&between;", 
+            "description": "Named entity: between; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bfr", 
+            "description": "Bad named entity: bfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bfr;", 
+            "description": "Named entity: bfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd1f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigcap", 
+            "description": "Bad named entity: bigcap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bigcap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigcap;", 
+            "description": "Named entity: bigcap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigcirc", 
+            "description": "Bad named entity: bigcirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bigcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigcirc;", 
+            "description": "Named entity: bigcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25ef"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigcup", 
+            "description": "Bad named entity: bigcup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bigcup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigcup;", 
+            "description": "Named entity: bigcup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigodot", 
+            "description": "Bad named entity: bigodot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bigodot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigodot;", 
+            "description": "Named entity: bigodot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigoplus", 
+            "description": "Bad named entity: bigoplus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bigoplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigoplus;", 
+            "description": "Named entity: bigoplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a01"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigotimes", 
+            "description": "Bad named entity: bigotimes without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bigotimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigotimes;", 
+            "description": "Named entity: bigotimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a02"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigsqcup", 
+            "description": "Bad named entity: bigsqcup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bigsqcup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigsqcup;", 
+            "description": "Named entity: bigsqcup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a06"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigstar", 
+            "description": "Bad named entity: bigstar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bigstar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigstar;", 
+            "description": "Named entity: bigstar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2605"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigtriangledown", 
+            "description": "Bad named entity: bigtriangledown without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bigtriangledown"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigtriangledown;", 
+            "description": "Named entity: bigtriangledown; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25bd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigtriangleup", 
+            "description": "Bad named entity: bigtriangleup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bigtriangleup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigtriangleup;", 
+            "description": "Named entity: bigtriangleup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&biguplus", 
+            "description": "Bad named entity: biguplus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&biguplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&biguplus;", 
+            "description": "Named entity: biguplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a04"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigvee", 
+            "description": "Bad named entity: bigvee without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bigvee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigvee;", 
+            "description": "Named entity: bigvee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigwedge", 
+            "description": "Bad named entity: bigwedge without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bigwedge"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigwedge;", 
+            "description": "Named entity: bigwedge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bkarow", 
+            "description": "Bad named entity: bkarow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bkarow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bkarow;", 
+            "description": "Named entity: bkarow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u290d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blacklozenge", 
+            "description": "Bad named entity: blacklozenge without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&blacklozenge"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blacklozenge;", 
+            "description": "Named entity: blacklozenge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29eb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blacksquare", 
+            "description": "Bad named entity: blacksquare without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&blacksquare"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blacksquare;", 
+            "description": "Named entity: blacksquare; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25aa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blacktriangle", 
+            "description": "Bad named entity: blacktriangle without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&blacktriangle"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blacktriangle;", 
+            "description": "Named entity: blacktriangle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blacktriangledown", 
+            "description": "Bad named entity: blacktriangledown without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&blacktriangledown"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blacktriangledown;", 
+            "description": "Named entity: blacktriangledown; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25be"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blacktriangleleft", 
+            "description": "Bad named entity: blacktriangleleft without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&blacktriangleleft"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blacktriangleleft;", 
+            "description": "Named entity: blacktriangleleft; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blacktriangleright", 
+            "description": "Bad named entity: blacktriangleright without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&blacktriangleright"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blacktriangleright;", 
+            "description": "Named entity: blacktriangleright; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blank", 
+            "description": "Bad named entity: blank without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&blank"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blank;", 
+            "description": "Named entity: blank; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2423"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blk12", 
+            "description": "Bad named entity: blk12 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&blk12"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blk12;", 
+            "description": "Named entity: blk12; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2592"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blk14", 
+            "description": "Bad named entity: blk14 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&blk14"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blk14;", 
+            "description": "Named entity: blk14; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2591"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blk34", 
+            "description": "Bad named entity: blk34 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&blk34"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blk34;", 
+            "description": "Named entity: blk34; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2593"
+                ]
+            ]
+        }, 
+        {
+            "input": "&block", 
+            "description": "Bad named entity: block without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&block"
+                ]
+            ]
+        }, 
+        {
+            "input": "&block;", 
+            "description": "Named entity: block; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2588"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bne", 
+            "description": "Bad named entity: bne without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bne"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bne;", 
+            "description": "Named entity: bne; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "=\u20e5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bnequiv", 
+            "description": "Bad named entity: bnequiv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bnequiv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bnequiv;", 
+            "description": "Named entity: bnequiv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2261\u20e5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bnot", 
+            "description": "Bad named entity: bnot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bnot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bnot;", 
+            "description": "Named entity: bnot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2310"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bopf", 
+            "description": "Bad named entity: bopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bopf;", 
+            "description": "Named entity: bopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd53"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bot", 
+            "description": "Bad named entity: bot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bot;", 
+            "description": "Named entity: bot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bottom", 
+            "description": "Bad named entity: bottom without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bottom"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bottom;", 
+            "description": "Named entity: bottom; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bowtie", 
+            "description": "Bad named entity: bowtie without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bowtie"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bowtie;", 
+            "description": "Named entity: bowtie; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxDL", 
+            "description": "Bad named entity: boxDL without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxDL"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxDL;", 
+            "description": "Named entity: boxDL; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2557"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxDR", 
+            "description": "Bad named entity: boxDR without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxDR"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxDR;", 
+            "description": "Named entity: boxDR; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2554"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxDl", 
+            "description": "Bad named entity: boxDl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxDl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxDl;", 
+            "description": "Named entity: boxDl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2556"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxDr", 
+            "description": "Bad named entity: boxDr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxDr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxDr;", 
+            "description": "Named entity: boxDr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2553"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxH", 
+            "description": "Bad named entity: boxH without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxH"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxH;", 
+            "description": "Named entity: boxH; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2550"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxHD", 
+            "description": "Bad named entity: boxHD without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxHD"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxHD;", 
+            "description": "Named entity: boxHD; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2566"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxHU", 
+            "description": "Bad named entity: boxHU without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxHU"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxHU;", 
+            "description": "Named entity: boxHU; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2569"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxHd", 
+            "description": "Bad named entity: boxHd without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxHd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxHd;", 
+            "description": "Named entity: boxHd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2564"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxHu", 
+            "description": "Bad named entity: boxHu without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxHu"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxHu;", 
+            "description": "Named entity: boxHu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2567"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxUL", 
+            "description": "Bad named entity: boxUL without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxUL"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxUL;", 
+            "description": "Named entity: boxUL; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u255d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxUR", 
+            "description": "Bad named entity: boxUR without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxUR"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxUR;", 
+            "description": "Named entity: boxUR; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u255a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxUl", 
+            "description": "Bad named entity: boxUl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxUl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxUl;", 
+            "description": "Named entity: boxUl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u255c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxUr", 
+            "description": "Bad named entity: boxUr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxUr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxUr;", 
+            "description": "Named entity: boxUr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2559"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxV", 
+            "description": "Bad named entity: boxV without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxV"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxV;", 
+            "description": "Named entity: boxV; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2551"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxVH", 
+            "description": "Bad named entity: boxVH without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxVH"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxVH;", 
+            "description": "Named entity: boxVH; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u256c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxVL", 
+            "description": "Bad named entity: boxVL without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxVL"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxVL;", 
+            "description": "Named entity: boxVL; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2563"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxVR", 
+            "description": "Bad named entity: boxVR without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxVR"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxVR;", 
+            "description": "Named entity: boxVR; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2560"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxVh", 
+            "description": "Bad named entity: boxVh without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxVh"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxVh;", 
+            "description": "Named entity: boxVh; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u256b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxVl", 
+            "description": "Bad named entity: boxVl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxVl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxVl;", 
+            "description": "Named entity: boxVl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2562"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxVr", 
+            "description": "Bad named entity: boxVr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxVr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxVr;", 
+            "description": "Named entity: boxVr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u255f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxbox", 
+            "description": "Bad named entity: boxbox without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxbox"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxbox;", 
+            "description": "Named entity: boxbox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29c9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxdL", 
+            "description": "Bad named entity: boxdL without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxdL"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxdL;", 
+            "description": "Named entity: boxdL; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2555"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxdR", 
+            "description": "Bad named entity: boxdR without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxdR"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxdR;", 
+            "description": "Named entity: boxdR; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2552"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxdl", 
+            "description": "Bad named entity: boxdl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxdl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxdl;", 
+            "description": "Named entity: boxdl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2510"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxdr", 
+            "description": "Bad named entity: boxdr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxdr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxdr;", 
+            "description": "Named entity: boxdr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u250c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxh", 
+            "description": "Bad named entity: boxh without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxh"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxh;", 
+            "description": "Named entity: boxh; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2500"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxhD", 
+            "description": "Bad named entity: boxhD without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxhD"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxhD;", 
+            "description": "Named entity: boxhD; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2565"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxhU", 
+            "description": "Bad named entity: boxhU without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxhU"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxhU;", 
+            "description": "Named entity: boxhU; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2568"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxhd", 
+            "description": "Bad named entity: boxhd without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxhd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxhd;", 
+            "description": "Named entity: boxhd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u252c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxhu", 
+            "description": "Bad named entity: boxhu without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxhu"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxhu;", 
+            "description": "Named entity: boxhu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2534"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxminus", 
+            "description": "Bad named entity: boxminus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxminus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxminus;", 
+            "description": "Named entity: boxminus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u229f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxplus", 
+            "description": "Bad named entity: boxplus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxplus;", 
+            "description": "Named entity: boxplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u229e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxtimes", 
+            "description": "Bad named entity: boxtimes without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxtimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxtimes;", 
+            "description": "Named entity: boxtimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxuL", 
+            "description": "Bad named entity: boxuL without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxuL"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxuL;", 
+            "description": "Named entity: boxuL; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u255b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxuR", 
+            "description": "Bad named entity: boxuR without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxuR"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxuR;", 
+            "description": "Named entity: boxuR; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2558"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxul", 
+            "description": "Bad named entity: boxul without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxul"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxul;", 
+            "description": "Named entity: boxul; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2518"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxur", 
+            "description": "Bad named entity: boxur without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxur"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxur;", 
+            "description": "Named entity: boxur; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2514"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxv", 
+            "description": "Bad named entity: boxv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxv;", 
+            "description": "Named entity: boxv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2502"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxvH", 
+            "description": "Bad named entity: boxvH without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxvH"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxvH;", 
+            "description": "Named entity: boxvH; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u256a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxvL", 
+            "description": "Bad named entity: boxvL without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxvL"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxvL;", 
+            "description": "Named entity: boxvL; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2561"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxvR", 
+            "description": "Bad named entity: boxvR without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxvR"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxvR;", 
+            "description": "Named entity: boxvR; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u255e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxvh", 
+            "description": "Bad named entity: boxvh without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxvh"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxvh;", 
+            "description": "Named entity: boxvh; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u253c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxvl", 
+            "description": "Bad named entity: boxvl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxvl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxvl;", 
+            "description": "Named entity: boxvl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2524"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxvr", 
+            "description": "Bad named entity: boxvr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&boxvr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxvr;", 
+            "description": "Named entity: boxvr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u251c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bprime", 
+            "description": "Bad named entity: bprime without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bprime"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bprime;", 
+            "description": "Named entity: bprime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2035"
+                ]
+            ]
+        }, 
+        {
+            "input": "&breve", 
+            "description": "Bad named entity: breve without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&breve"
+                ]
+            ]
+        }, 
+        {
+            "input": "&breve;", 
+            "description": "Named entity: breve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02d8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&brvbar", 
+            "description": "Named entity: brvbar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&brvbar;", 
+            "description": "Named entity: brvbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bscr", 
+            "description": "Bad named entity: bscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bscr;", 
+            "description": "Named entity: bscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcb7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bsemi", 
+            "description": "Bad named entity: bsemi without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bsemi"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bsemi;", 
+            "description": "Named entity: bsemi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u204f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bsim", 
+            "description": "Bad named entity: bsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bsim;", 
+            "description": "Named entity: bsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bsime", 
+            "description": "Bad named entity: bsime without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bsime"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bsime;", 
+            "description": "Named entity: bsime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22cd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bsol", 
+            "description": "Bad named entity: bsol without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bsol"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bsol;", 
+            "description": "Named entity: bsol; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\\"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bsolb", 
+            "description": "Bad named entity: bsolb without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bsolb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bsolb;", 
+            "description": "Named entity: bsolb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29c5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bsolhsub", 
+            "description": "Bad named entity: bsolhsub without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bsolhsub"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bsolhsub;", 
+            "description": "Named entity: bsolhsub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27c8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bull", 
+            "description": "Bad named entity: bull without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bull"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bull;", 
+            "description": "Named entity: bull; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2022"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bullet", 
+            "description": "Bad named entity: bullet without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bullet"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bullet;", 
+            "description": "Named entity: bullet; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2022"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bump", 
+            "description": "Bad named entity: bump without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bump"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bump;", 
+            "description": "Named entity: bump; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bumpE", 
+            "description": "Bad named entity: bumpE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bumpE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bumpE;", 
+            "description": "Named entity: bumpE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bumpe", 
+            "description": "Bad named entity: bumpe without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bumpe"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bumpe;", 
+            "description": "Named entity: bumpe; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bumpeq", 
+            "description": "Bad named entity: bumpeq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&bumpeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bumpeq;", 
+            "description": "Named entity: bumpeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cacute", 
+            "description": "Bad named entity: cacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cacute;", 
+            "description": "Named entity: cacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0107"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cap", 
+            "description": "Bad named entity: cap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cap;", 
+            "description": "Named entity: cap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2229"
+                ]
+            ]
+        }, 
+        {
+            "input": "&capand", 
+            "description": "Bad named entity: capand without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&capand"
+                ]
+            ]
+        }, 
+        {
+            "input": "&capand;", 
+            "description": "Named entity: capand; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a44"
+                ]
+            ]
+        }, 
+        {
+            "input": "&capbrcup", 
+            "description": "Bad named entity: capbrcup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&capbrcup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&capbrcup;", 
+            "description": "Named entity: capbrcup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a49"
+                ]
+            ]
+        }, 
+        {
+            "input": "&capcap", 
+            "description": "Bad named entity: capcap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&capcap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&capcap;", 
+            "description": "Named entity: capcap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a4b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&capcup", 
+            "description": "Bad named entity: capcup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&capcup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&capcup;", 
+            "description": "Named entity: capcup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a47"
+                ]
+            ]
+        }, 
+        {
+            "input": "&capdot", 
+            "description": "Bad named entity: capdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&capdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&capdot;", 
+            "description": "Named entity: capdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a40"
+                ]
+            ]
+        }, 
+        {
+            "input": "&caps", 
+            "description": "Bad named entity: caps without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&caps"
+                ]
+            ]
+        }, 
+        {
+            "input": "&caps;", 
+            "description": "Named entity: caps; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2229\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&caret", 
+            "description": "Bad named entity: caret without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&caret"
+                ]
+            ]
+        }, 
+        {
+            "input": "&caret;", 
+            "description": "Named entity: caret; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2041"
+                ]
+            ]
+        }, 
+        {
+            "input": "&caron", 
+            "description": "Bad named entity: caron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&caron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&caron;", 
+            "description": "Named entity: caron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02c7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ccaps", 
+            "description": "Bad named entity: ccaps without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ccaps"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ccaps;", 
+            "description": "Named entity: ccaps; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a4d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ccaron", 
+            "description": "Bad named entity: ccaron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ccaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ccaron;", 
+            "description": "Named entity: ccaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u010d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ccedil", 
+            "description": "Named entity: ccedil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00e7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ccedil;", 
+            "description": "Named entity: ccedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00e7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ccirc", 
+            "description": "Bad named entity: ccirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ccirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ccirc;", 
+            "description": "Named entity: ccirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0109"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ccups", 
+            "description": "Bad named entity: ccups without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ccups"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ccups;", 
+            "description": "Named entity: ccups; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a4c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ccupssm", 
+            "description": "Bad named entity: ccupssm without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ccupssm"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ccupssm;", 
+            "description": "Named entity: ccupssm; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a50"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cdot", 
+            "description": "Bad named entity: cdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cdot;", 
+            "description": "Named entity: cdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u010b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cedil", 
+            "description": "Named entity: cedil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00b8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cedil;", 
+            "description": "Named entity: cedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cemptyv", 
+            "description": "Bad named entity: cemptyv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cemptyv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cemptyv;", 
+            "description": "Named entity: cemptyv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29b2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cent", 
+            "description": "Named entity: cent without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cent;", 
+            "description": "Named entity: cent; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&centerdot;", 
+            "description": "Named entity: centerdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cfr", 
+            "description": "Bad named entity: cfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cfr;", 
+            "description": "Named entity: cfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd20"
+                ]
+            ]
+        }, 
+        {
+            "input": "&chcy", 
+            "description": "Bad named entity: chcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&chcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&chcy;", 
+            "description": "Named entity: chcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0447"
+                ]
+            ]
+        }, 
+        {
+            "input": "&check", 
+            "description": "Bad named entity: check without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&check"
+                ]
+            ]
+        }, 
+        {
+            "input": "&check;", 
+            "description": "Named entity: check; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2713"
+                ]
+            ]
+        }, 
+        {
+            "input": "&checkmark", 
+            "description": "Bad named entity: checkmark without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&checkmark"
+                ]
+            ]
+        }, 
+        {
+            "input": "&checkmark;", 
+            "description": "Named entity: checkmark; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2713"
+                ]
+            ]
+        }, 
+        {
+            "input": "&chi", 
+            "description": "Bad named entity: chi without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&chi"
+                ]
+            ]
+        }, 
+        {
+            "input": "&chi;", 
+            "description": "Named entity: chi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cir", 
+            "description": "Bad named entity: cir without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cir"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cir;", 
+            "description": "Named entity: cir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25cb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cirE", 
+            "description": "Bad named entity: cirE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cirE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cirE;", 
+            "description": "Named entity: cirE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circ", 
+            "description": "Bad named entity: circ without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&circ"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circ;", 
+            "description": "Named entity: circ; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02c6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circeq", 
+            "description": "Bad named entity: circeq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&circeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circeq;", 
+            "description": "Named entity: circeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2257"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circlearrowleft", 
+            "description": "Bad named entity: circlearrowleft without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&circlearrowleft"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circlearrowleft;", 
+            "description": "Named entity: circlearrowleft; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ba"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circlearrowright", 
+            "description": "Bad named entity: circlearrowright without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&circlearrowright"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circlearrowright;", 
+            "description": "Named entity: circlearrowright; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circledR", 
+            "description": "Bad named entity: circledR without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&circledR"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circledR;", 
+            "description": "Named entity: circledR; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circledS", 
+            "description": "Bad named entity: circledS without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&circledS"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circledS;", 
+            "description": "Named entity: circledS; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u24c8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circledast", 
+            "description": "Bad named entity: circledast without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&circledast"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circledast;", 
+            "description": "Named entity: circledast; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u229b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circledcirc", 
+            "description": "Bad named entity: circledcirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&circledcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circledcirc;", 
+            "description": "Named entity: circledcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u229a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circleddash", 
+            "description": "Bad named entity: circleddash without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&circleddash"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circleddash;", 
+            "description": "Named entity: circleddash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u229d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cire", 
+            "description": "Bad named entity: cire without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cire"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cire;", 
+            "description": "Named entity: cire; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2257"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cirfnint", 
+            "description": "Bad named entity: cirfnint without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cirfnint"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cirfnint;", 
+            "description": "Named entity: cirfnint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a10"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cirmid", 
+            "description": "Bad named entity: cirmid without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cirmid"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cirmid;", 
+            "description": "Named entity: cirmid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aef"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cirscir", 
+            "description": "Bad named entity: cirscir without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cirscir"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cirscir;", 
+            "description": "Named entity: cirscir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&clubs", 
+            "description": "Bad named entity: clubs without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&clubs"
+                ]
+            ]
+        }, 
+        {
+            "input": "&clubs;", 
+            "description": "Named entity: clubs; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2663"
+                ]
+            ]
+        }, 
+        {
+            "input": "&clubsuit", 
+            "description": "Bad named entity: clubsuit without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&clubsuit"
+                ]
+            ]
+        }, 
+        {
+            "input": "&clubsuit;", 
+            "description": "Named entity: clubsuit; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2663"
+                ]
+            ]
+        }, 
+        {
+            "input": "&colon", 
+            "description": "Bad named entity: colon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&colon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&colon;", 
+            "description": "Named entity: colon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    ":"
+                ]
+            ]
+        }, 
+        {
+            "input": "&colone", 
+            "description": "Bad named entity: colone without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&colone"
+                ]
+            ]
+        }, 
+        {
+            "input": "&colone;", 
+            "description": "Named entity: colone; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2254"
+                ]
+            ]
+        }, 
+        {
+            "input": "&coloneq", 
+            "description": "Bad named entity: coloneq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&coloneq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&coloneq;", 
+            "description": "Named entity: coloneq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2254"
+                ]
+            ]
+        }, 
+        {
+            "input": "&comma", 
+            "description": "Bad named entity: comma without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&comma"
+                ]
+            ]
+        }, 
+        {
+            "input": "&comma;", 
+            "description": "Named entity: comma; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    ","
+                ]
+            ]
+        }, 
+        {
+            "input": "&commat", 
+            "description": "Bad named entity: commat without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&commat"
+                ]
+            ]
+        }, 
+        {
+            "input": "&commat;", 
+            "description": "Named entity: commat; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "@"
+                ]
+            ]
+        }, 
+        {
+            "input": "&comp", 
+            "description": "Bad named entity: comp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&comp"
+                ]
+            ]
+        }, 
+        {
+            "input": "&comp;", 
+            "description": "Named entity: comp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2201"
+                ]
+            ]
+        }, 
+        {
+            "input": "&compfn", 
+            "description": "Bad named entity: compfn without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&compfn"
+                ]
+            ]
+        }, 
+        {
+            "input": "&compfn;", 
+            "description": "Named entity: compfn; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2218"
+                ]
+            ]
+        }, 
+        {
+            "input": "&complement", 
+            "description": "Bad named entity: complement without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&complement"
+                ]
+            ]
+        }, 
+        {
+            "input": "&complement;", 
+            "description": "Named entity: complement; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2201"
+                ]
+            ]
+        }, 
+        {
+            "input": "&complexes", 
+            "description": "Bad named entity: complexes without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&complexes"
+                ]
+            ]
+        }, 
+        {
+            "input": "&complexes;", 
+            "description": "Named entity: complexes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2102"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cong", 
+            "description": "Bad named entity: cong without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cong"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cong;", 
+            "description": "Named entity: cong; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2245"
+                ]
+            ]
+        }, 
+        {
+            "input": "&congdot", 
+            "description": "Bad named entity: congdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&congdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&congdot;", 
+            "description": "Named entity: congdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a6d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&conint", 
+            "description": "Bad named entity: conint without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&conint"
+                ]
+            ]
+        }, 
+        {
+            "input": "&conint;", 
+            "description": "Named entity: conint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&copf", 
+            "description": "Bad named entity: copf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&copf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&copf;", 
+            "description": "Named entity: copf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd54"
+                ]
+            ]
+        }, 
+        {
+            "input": "&coprod", 
+            "description": "Bad named entity: coprod without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&coprod"
+                ]
+            ]
+        }, 
+        {
+            "input": "&coprod;", 
+            "description": "Named entity: coprod; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2210"
+                ]
+            ]
+        }, 
+        {
+            "input": "&copy", 
+            "description": "Named entity: copy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&copy;", 
+            "description": "Named entity: copy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&copysr;", 
+            "description": "Named entity: copysr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2117"
+                ]
+            ]
+        }, 
+        {
+            "input": "&crarr", 
+            "description": "Bad named entity: crarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&crarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&crarr;", 
+            "description": "Named entity: crarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cross", 
+            "description": "Bad named entity: cross without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cross"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cross;", 
+            "description": "Named entity: cross; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2717"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cscr", 
+            "description": "Bad named entity: cscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cscr;", 
+            "description": "Named entity: cscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcb8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&csub", 
+            "description": "Bad named entity: csub without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&csub"
+                ]
+            ]
+        }, 
+        {
+            "input": "&csub;", 
+            "description": "Named entity: csub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2acf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&csube", 
+            "description": "Bad named entity: csube without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&csube"
+                ]
+            ]
+        }, 
+        {
+            "input": "&csube;", 
+            "description": "Named entity: csube; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ad1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&csup", 
+            "description": "Bad named entity: csup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&csup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&csup;", 
+            "description": "Named entity: csup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ad0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&csupe", 
+            "description": "Bad named entity: csupe without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&csupe"
+                ]
+            ]
+        }, 
+        {
+            "input": "&csupe;", 
+            "description": "Named entity: csupe; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ad2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ctdot", 
+            "description": "Bad named entity: ctdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ctdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ctdot;", 
+            "description": "Named entity: ctdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ef"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cudarrl", 
+            "description": "Bad named entity: cudarrl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cudarrl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cudarrl;", 
+            "description": "Named entity: cudarrl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2938"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cudarrr", 
+            "description": "Bad named entity: cudarrr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cudarrr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cudarrr;", 
+            "description": "Named entity: cudarrr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2935"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cuepr", 
+            "description": "Bad named entity: cuepr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cuepr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cuepr;", 
+            "description": "Named entity: cuepr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22de"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cuesc", 
+            "description": "Bad named entity: cuesc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cuesc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cuesc;", 
+            "description": "Named entity: cuesc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22df"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cularr", 
+            "description": "Bad named entity: cularr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cularr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cularr;", 
+            "description": "Named entity: cularr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cularrp", 
+            "description": "Bad named entity: cularrp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cularrp"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cularrp;", 
+            "description": "Named entity: cularrp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u293d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cup", 
+            "description": "Bad named entity: cup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cup;", 
+            "description": "Named entity: cup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cupbrcap", 
+            "description": "Bad named entity: cupbrcap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cupbrcap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cupbrcap;", 
+            "description": "Named entity: cupbrcap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a48"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cupcap", 
+            "description": "Bad named entity: cupcap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cupcap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cupcap;", 
+            "description": "Named entity: cupcap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a46"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cupcup", 
+            "description": "Bad named entity: cupcup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cupcup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cupcup;", 
+            "description": "Named entity: cupcup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a4a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cupdot", 
+            "description": "Bad named entity: cupdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cupdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cupdot;", 
+            "description": "Named entity: cupdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cupor", 
+            "description": "Bad named entity: cupor without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cupor"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cupor;", 
+            "description": "Named entity: cupor; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a45"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cups", 
+            "description": "Bad named entity: cups without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cups"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cups;", 
+            "description": "Named entity: cups; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222a\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curarr", 
+            "description": "Bad named entity: curarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&curarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curarr;", 
+            "description": "Named entity: curarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curarrm", 
+            "description": "Bad named entity: curarrm without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&curarrm"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curarrm;", 
+            "description": "Named entity: curarrm; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u293c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curlyeqprec", 
+            "description": "Bad named entity: curlyeqprec without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&curlyeqprec"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curlyeqprec;", 
+            "description": "Named entity: curlyeqprec; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22de"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curlyeqsucc", 
+            "description": "Bad named entity: curlyeqsucc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&curlyeqsucc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curlyeqsucc;", 
+            "description": "Named entity: curlyeqsucc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22df"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curlyvee", 
+            "description": "Bad named entity: curlyvee without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&curlyvee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curlyvee;", 
+            "description": "Named entity: curlyvee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ce"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curlywedge", 
+            "description": "Bad named entity: curlywedge without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&curlywedge"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curlywedge;", 
+            "description": "Named entity: curlywedge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22cf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curren", 
+            "description": "Named entity: curren without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curren;", 
+            "description": "Named entity: curren; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curvearrowleft", 
+            "description": "Bad named entity: curvearrowleft without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&curvearrowleft"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curvearrowleft;", 
+            "description": "Named entity: curvearrowleft; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curvearrowright", 
+            "description": "Bad named entity: curvearrowright without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&curvearrowright"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curvearrowright;", 
+            "description": "Named entity: curvearrowright; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cuvee", 
+            "description": "Bad named entity: cuvee without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cuvee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cuvee;", 
+            "description": "Named entity: cuvee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ce"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cuwed", 
+            "description": "Bad named entity: cuwed without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cuwed"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cuwed;", 
+            "description": "Named entity: cuwed; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22cf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cwconint", 
+            "description": "Bad named entity: cwconint without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cwconint"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cwconint;", 
+            "description": "Named entity: cwconint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2232"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cwint", 
+            "description": "Bad named entity: cwint without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cwint"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cwint;", 
+            "description": "Named entity: cwint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2231"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cylcty", 
+            "description": "Bad named entity: cylcty without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&cylcty"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cylcty;", 
+            "description": "Named entity: cylcty; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u232d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dArr", 
+            "description": "Bad named entity: dArr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dArr;", 
+            "description": "Named entity: dArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dHar", 
+            "description": "Bad named entity: dHar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dHar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dHar;", 
+            "description": "Named entity: dHar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2965"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dagger", 
+            "description": "Bad named entity: dagger without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dagger"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dagger;", 
+            "description": "Named entity: dagger; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2020"
+                ]
+            ]
+        }, 
+        {
+            "input": "&daleth", 
+            "description": "Bad named entity: daleth without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&daleth"
+                ]
+            ]
+        }, 
+        {
+            "input": "&daleth;", 
+            "description": "Named entity: daleth; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2138"
+                ]
+            ]
+        }, 
+        {
+            "input": "&darr", 
+            "description": "Bad named entity: darr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&darr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&darr;", 
+            "description": "Named entity: darr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2193"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dash", 
+            "description": "Bad named entity: dash without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dash"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dash;", 
+            "description": "Named entity: dash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2010"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dashv", 
+            "description": "Bad named entity: dashv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dashv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dashv;", 
+            "description": "Named entity: dashv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dbkarow", 
+            "description": "Bad named entity: dbkarow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dbkarow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dbkarow;", 
+            "description": "Named entity: dbkarow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u290f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dblac", 
+            "description": "Bad named entity: dblac without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dblac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dblac;", 
+            "description": "Named entity: dblac; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02dd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dcaron", 
+            "description": "Bad named entity: dcaron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dcaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dcaron;", 
+            "description": "Named entity: dcaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u010f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dcy", 
+            "description": "Bad named entity: dcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dcy;", 
+            "description": "Named entity: dcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0434"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dd", 
+            "description": "Bad named entity: dd without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dd;", 
+            "description": "Named entity: dd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2146"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ddagger", 
+            "description": "Bad named entity: ddagger without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ddagger"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ddagger;", 
+            "description": "Named entity: ddagger; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2021"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ddarr", 
+            "description": "Bad named entity: ddarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ddarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ddarr;", 
+            "description": "Named entity: ddarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ca"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ddotseq", 
+            "description": "Bad named entity: ddotseq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ddotseq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ddotseq;", 
+            "description": "Named entity: ddotseq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a77"
+                ]
+            ]
+        }, 
+        {
+            "input": "&deg", 
+            "description": "Named entity: deg without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00b0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&deg;", 
+            "description": "Named entity: deg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&delta", 
+            "description": "Bad named entity: delta without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&delta"
+                ]
+            ]
+        }, 
+        {
+            "input": "&delta;", 
+            "description": "Named entity: delta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&demptyv", 
+            "description": "Bad named entity: demptyv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&demptyv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&demptyv;", 
+            "description": "Named entity: demptyv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dfisht", 
+            "description": "Bad named entity: dfisht without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dfisht"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dfisht;", 
+            "description": "Named entity: dfisht; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u297f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dfr", 
+            "description": "Bad named entity: dfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dfr;", 
+            "description": "Named entity: dfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd21"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dharl", 
+            "description": "Bad named entity: dharl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dharl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dharl;", 
+            "description": "Named entity: dharl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dharr", 
+            "description": "Bad named entity: dharr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dharr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dharr;", 
+            "description": "Named entity: dharr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&diam", 
+            "description": "Bad named entity: diam without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&diam"
+                ]
+            ]
+        }, 
+        {
+            "input": "&diam;", 
+            "description": "Named entity: diam; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&diamond", 
+            "description": "Bad named entity: diamond without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&diamond"
+                ]
+            ]
+        }, 
+        {
+            "input": "&diamond;", 
+            "description": "Named entity: diamond; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&diamondsuit", 
+            "description": "Bad named entity: diamondsuit without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&diamondsuit"
+                ]
+            ]
+        }, 
+        {
+            "input": "&diamondsuit;", 
+            "description": "Named entity: diamondsuit; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2666"
+                ]
+            ]
+        }, 
+        {
+            "input": "&diams", 
+            "description": "Bad named entity: diams without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&diams"
+                ]
+            ]
+        }, 
+        {
+            "input": "&diams;", 
+            "description": "Named entity: diams; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2666"
+                ]
+            ]
+        }, 
+        {
+            "input": "&die", 
+            "description": "Bad named entity: die without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&die"
+                ]
+            ]
+        }, 
+        {
+            "input": "&die;", 
+            "description": "Named entity: die; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&digamma", 
+            "description": "Bad named entity: digamma without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&digamma"
+                ]
+            ]
+        }, 
+        {
+            "input": "&digamma;", 
+            "description": "Named entity: digamma; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03dd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&disin", 
+            "description": "Bad named entity: disin without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&disin"
+                ]
+            ]
+        }, 
+        {
+            "input": "&disin;", 
+            "description": "Named entity: disin; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&div", 
+            "description": "Bad named entity: div without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&div"
+                ]
+            ]
+        }, 
+        {
+            "input": "&div;", 
+            "description": "Named entity: div; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&divide", 
+            "description": "Named entity: divide without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00f7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&divide;", 
+            "description": "Named entity: divide; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&divideontimes;", 
+            "description": "Named entity: divideontimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&divonx", 
+            "description": "Bad named entity: divonx without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&divonx"
+                ]
+            ]
+        }, 
+        {
+            "input": "&divonx;", 
+            "description": "Named entity: divonx; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&djcy", 
+            "description": "Bad named entity: djcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&djcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&djcy;", 
+            "description": "Named entity: djcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0452"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dlcorn", 
+            "description": "Bad named entity: dlcorn without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dlcorn"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dlcorn;", 
+            "description": "Named entity: dlcorn; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u231e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dlcrop", 
+            "description": "Bad named entity: dlcrop without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dlcrop"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dlcrop;", 
+            "description": "Named entity: dlcrop; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u230d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dollar", 
+            "description": "Bad named entity: dollar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dollar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dollar;", 
+            "description": "Named entity: dollar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "$"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dopf", 
+            "description": "Bad named entity: dopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dopf;", 
+            "description": "Named entity: dopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd55"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dot", 
+            "description": "Bad named entity: dot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dot;", 
+            "description": "Named entity: dot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02d9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&doteq", 
+            "description": "Bad named entity: doteq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&doteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&doteq;", 
+            "description": "Named entity: doteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2250"
+                ]
+            ]
+        }, 
+        {
+            "input": "&doteqdot", 
+            "description": "Bad named entity: doteqdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&doteqdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&doteqdot;", 
+            "description": "Named entity: doteqdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2251"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dotminus", 
+            "description": "Bad named entity: dotminus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dotminus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dotminus;", 
+            "description": "Named entity: dotminus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2238"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dotplus", 
+            "description": "Bad named entity: dotplus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dotplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dotplus;", 
+            "description": "Named entity: dotplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2214"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dotsquare", 
+            "description": "Bad named entity: dotsquare without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dotsquare"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dotsquare;", 
+            "description": "Named entity: dotsquare; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&doublebarwedge", 
+            "description": "Bad named entity: doublebarwedge without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&doublebarwedge"
+                ]
+            ]
+        }, 
+        {
+            "input": "&doublebarwedge;", 
+            "description": "Named entity: doublebarwedge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2306"
+                ]
+            ]
+        }, 
+        {
+            "input": "&downarrow", 
+            "description": "Bad named entity: downarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&downarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&downarrow;", 
+            "description": "Named entity: downarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2193"
+                ]
+            ]
+        }, 
+        {
+            "input": "&downdownarrows", 
+            "description": "Bad named entity: downdownarrows without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&downdownarrows"
+                ]
+            ]
+        }, 
+        {
+            "input": "&downdownarrows;", 
+            "description": "Named entity: downdownarrows; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ca"
+                ]
+            ]
+        }, 
+        {
+            "input": "&downharpoonleft", 
+            "description": "Bad named entity: downharpoonleft without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&downharpoonleft"
+                ]
+            ]
+        }, 
+        {
+            "input": "&downharpoonleft;", 
+            "description": "Named entity: downharpoonleft; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&downharpoonright", 
+            "description": "Bad named entity: downharpoonright without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&downharpoonright"
+                ]
+            ]
+        }, 
+        {
+            "input": "&downharpoonright;", 
+            "description": "Named entity: downharpoonright; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&drbkarow", 
+            "description": "Bad named entity: drbkarow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&drbkarow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&drbkarow;", 
+            "description": "Named entity: drbkarow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2910"
+                ]
+            ]
+        }, 
+        {
+            "input": "&drcorn", 
+            "description": "Bad named entity: drcorn without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&drcorn"
+                ]
+            ]
+        }, 
+        {
+            "input": "&drcorn;", 
+            "description": "Named entity: drcorn; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u231f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&drcrop", 
+            "description": "Bad named entity: drcrop without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&drcrop"
+                ]
+            ]
+        }, 
+        {
+            "input": "&drcrop;", 
+            "description": "Named entity: drcrop; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u230c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dscr", 
+            "description": "Bad named entity: dscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dscr;", 
+            "description": "Named entity: dscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcb9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dscy", 
+            "description": "Bad named entity: dscy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dscy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dscy;", 
+            "description": "Named entity: dscy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0455"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dsol", 
+            "description": "Bad named entity: dsol without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dsol"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dsol;", 
+            "description": "Named entity: dsol; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29f6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dstrok", 
+            "description": "Bad named entity: dstrok without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dstrok"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dstrok;", 
+            "description": "Named entity: dstrok; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0111"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dtdot", 
+            "description": "Bad named entity: dtdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dtdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dtdot;", 
+            "description": "Named entity: dtdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dtri", 
+            "description": "Bad named entity: dtri without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dtri"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dtri;", 
+            "description": "Named entity: dtri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25bf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dtrif", 
+            "description": "Bad named entity: dtrif without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dtrif"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dtrif;", 
+            "description": "Named entity: dtrif; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25be"
+                ]
+            ]
+        }, 
+        {
+            "input": "&duarr", 
+            "description": "Bad named entity: duarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&duarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&duarr;", 
+            "description": "Named entity: duarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&duhar", 
+            "description": "Bad named entity: duhar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&duhar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&duhar;", 
+            "description": "Named entity: duhar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u296f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dwangle", 
+            "description": "Bad named entity: dwangle without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dwangle"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dwangle;", 
+            "description": "Named entity: dwangle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29a6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dzcy", 
+            "description": "Bad named entity: dzcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dzcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dzcy;", 
+            "description": "Named entity: dzcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u045f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dzigrarr", 
+            "description": "Bad named entity: dzigrarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&dzigrarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dzigrarr;", 
+            "description": "Named entity: dzigrarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27ff"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eDDot", 
+            "description": "Bad named entity: eDDot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&eDDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eDDot;", 
+            "description": "Named entity: eDDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a77"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eDot", 
+            "description": "Bad named entity: eDot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&eDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eDot;", 
+            "description": "Named entity: eDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2251"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eacute", 
+            "description": "Named entity: eacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00e9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eacute;", 
+            "description": "Named entity: eacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00e9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&easter", 
+            "description": "Bad named entity: easter without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&easter"
+                ]
+            ]
+        }, 
+        {
+            "input": "&easter;", 
+            "description": "Named entity: easter; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a6e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ecaron", 
+            "description": "Bad named entity: ecaron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ecaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ecaron;", 
+            "description": "Named entity: ecaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u011b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ecir", 
+            "description": "Bad named entity: ecir without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ecir"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ecir;", 
+            "description": "Named entity: ecir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2256"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ecirc", 
+            "description": "Named entity: ecirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ea"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ecirc;", 
+            "description": "Named entity: ecirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ea"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ecolon", 
+            "description": "Bad named entity: ecolon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ecolon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ecolon;", 
+            "description": "Named entity: ecolon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2255"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ecy", 
+            "description": "Bad named entity: ecy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ecy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ecy;", 
+            "description": "Named entity: ecy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u044d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&edot", 
+            "description": "Bad named entity: edot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&edot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&edot;", 
+            "description": "Named entity: edot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0117"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ee", 
+            "description": "Bad named entity: ee without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ee;", 
+            "description": "Named entity: ee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2147"
+                ]
+            ]
+        }, 
+        {
+            "input": "&efDot", 
+            "description": "Bad named entity: efDot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&efDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&efDot;", 
+            "description": "Named entity: efDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2252"
+                ]
+            ]
+        }, 
+        {
+            "input": "&efr", 
+            "description": "Bad named entity: efr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&efr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&efr;", 
+            "description": "Named entity: efr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd22"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eg", 
+            "description": "Bad named entity: eg without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&eg"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eg;", 
+            "description": "Named entity: eg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a9a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&egrave", 
+            "description": "Named entity: egrave without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00e8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&egrave;", 
+            "description": "Named entity: egrave; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00e8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&egs", 
+            "description": "Bad named entity: egs without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&egs"
+                ]
+            ]
+        }, 
+        {
+            "input": "&egs;", 
+            "description": "Named entity: egs; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a96"
+                ]
+            ]
+        }, 
+        {
+            "input": "&egsdot", 
+            "description": "Bad named entity: egsdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&egsdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&egsdot;", 
+            "description": "Named entity: egsdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a98"
+                ]
+            ]
+        }, 
+        {
+            "input": "&el", 
+            "description": "Bad named entity: el without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&el"
+                ]
+            ]
+        }, 
+        {
+            "input": "&el;", 
+            "description": "Named entity: el; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a99"
+                ]
+            ]
+        }, 
+        {
+            "input": "&elinters", 
+            "description": "Bad named entity: elinters without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&elinters"
+                ]
+            ]
+        }, 
+        {
+            "input": "&elinters;", 
+            "description": "Named entity: elinters; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23e7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ell", 
+            "description": "Bad named entity: ell without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ell"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ell;", 
+            "description": "Named entity: ell; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2113"
+                ]
+            ]
+        }, 
+        {
+            "input": "&els", 
+            "description": "Bad named entity: els without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&els"
+                ]
+            ]
+        }, 
+        {
+            "input": "&els;", 
+            "description": "Named entity: els; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a95"
+                ]
+            ]
+        }, 
+        {
+            "input": "&elsdot", 
+            "description": "Bad named entity: elsdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&elsdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&elsdot;", 
+            "description": "Named entity: elsdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a97"
+                ]
+            ]
+        }, 
+        {
+            "input": "&emacr", 
+            "description": "Bad named entity: emacr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&emacr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&emacr;", 
+            "description": "Named entity: emacr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0113"
+                ]
+            ]
+        }, 
+        {
+            "input": "&empty", 
+            "description": "Bad named entity: empty without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&empty"
+                ]
+            ]
+        }, 
+        {
+            "input": "&empty;", 
+            "description": "Named entity: empty; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2205"
+                ]
+            ]
+        }, 
+        {
+            "input": "&emptyset", 
+            "description": "Bad named entity: emptyset without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&emptyset"
+                ]
+            ]
+        }, 
+        {
+            "input": "&emptyset;", 
+            "description": "Named entity: emptyset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2205"
+                ]
+            ]
+        }, 
+        {
+            "input": "&emptyv", 
+            "description": "Bad named entity: emptyv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&emptyv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&emptyv;", 
+            "description": "Named entity: emptyv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2205"
+                ]
+            ]
+        }, 
+        {
+            "input": "&emsp", 
+            "description": "Bad named entity: emsp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&emsp"
+                ]
+            ]
+        }, 
+        {
+            "input": "&emsp13", 
+            "description": "Bad named entity: emsp13 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&emsp13"
+                ]
+            ]
+        }, 
+        {
+            "input": "&emsp13;", 
+            "description": "Named entity: emsp13; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2004"
+                ]
+            ]
+        }, 
+        {
+            "input": "&emsp14", 
+            "description": "Bad named entity: emsp14 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&emsp14"
+                ]
+            ]
+        }, 
+        {
+            "input": "&emsp14;", 
+            "description": "Named entity: emsp14; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2005"
+                ]
+            ]
+        }, 
+        {
+            "input": "&emsp;", 
+            "description": "Named entity: emsp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2003"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eng", 
+            "description": "Bad named entity: eng without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&eng"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eng;", 
+            "description": "Named entity: eng; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u014b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ensp", 
+            "description": "Bad named entity: ensp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ensp"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ensp;", 
+            "description": "Named entity: ensp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2002"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eogon", 
+            "description": "Bad named entity: eogon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&eogon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eogon;", 
+            "description": "Named entity: eogon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0119"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eopf", 
+            "description": "Bad named entity: eopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&eopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eopf;", 
+            "description": "Named entity: eopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd56"
+                ]
+            ]
+        }, 
+        {
+            "input": "&epar", 
+            "description": "Bad named entity: epar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&epar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&epar;", 
+            "description": "Named entity: epar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eparsl", 
+            "description": "Bad named entity: eparsl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&eparsl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eparsl;", 
+            "description": "Named entity: eparsl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29e3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eplus", 
+            "description": "Bad named entity: eplus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&eplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eplus;", 
+            "description": "Named entity: eplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a71"
+                ]
+            ]
+        }, 
+        {
+            "input": "&epsi", 
+            "description": "Bad named entity: epsi without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&epsi"
+                ]
+            ]
+        }, 
+        {
+            "input": "&epsi;", 
+            "description": "Named entity: epsi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&epsilon", 
+            "description": "Bad named entity: epsilon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&epsilon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&epsilon;", 
+            "description": "Named entity: epsilon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&epsiv", 
+            "description": "Bad named entity: epsiv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&epsiv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&epsiv;", 
+            "description": "Named entity: epsiv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eqcirc", 
+            "description": "Bad named entity: eqcirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&eqcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eqcirc;", 
+            "description": "Named entity: eqcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2256"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eqcolon", 
+            "description": "Bad named entity: eqcolon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&eqcolon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eqcolon;", 
+            "description": "Named entity: eqcolon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2255"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eqsim", 
+            "description": "Bad named entity: eqsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&eqsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eqsim;", 
+            "description": "Named entity: eqsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2242"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eqslantgtr", 
+            "description": "Bad named entity: eqslantgtr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&eqslantgtr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eqslantgtr;", 
+            "description": "Named entity: eqslantgtr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a96"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eqslantless", 
+            "description": "Bad named entity: eqslantless without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&eqslantless"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eqslantless;", 
+            "description": "Named entity: eqslantless; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a95"
+                ]
+            ]
+        }, 
+        {
+            "input": "&equals", 
+            "description": "Bad named entity: equals without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&equals"
+                ]
+            ]
+        }, 
+        {
+            "input": "&equals;", 
+            "description": "Named entity: equals; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "="
+                ]
+            ]
+        }, 
+        {
+            "input": "&equest", 
+            "description": "Bad named entity: equest without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&equest"
+                ]
+            ]
+        }, 
+        {
+            "input": "&equest;", 
+            "description": "Named entity: equest; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u225f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&equiv", 
+            "description": "Bad named entity: equiv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&equiv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&equiv;", 
+            "description": "Named entity: equiv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2261"
+                ]
+            ]
+        }, 
+        {
+            "input": "&equivDD", 
+            "description": "Bad named entity: equivDD without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&equivDD"
+                ]
+            ]
+        }, 
+        {
+            "input": "&equivDD;", 
+            "description": "Named entity: equivDD; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a78"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eqvparsl", 
+            "description": "Bad named entity: eqvparsl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&eqvparsl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eqvparsl;", 
+            "description": "Named entity: eqvparsl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29e5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&erDot", 
+            "description": "Bad named entity: erDot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&erDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&erDot;", 
+            "description": "Named entity: erDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2253"
+                ]
+            ]
+        }, 
+        {
+            "input": "&erarr", 
+            "description": "Bad named entity: erarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&erarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&erarr;", 
+            "description": "Named entity: erarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2971"
+                ]
+            ]
+        }, 
+        {
+            "input": "&escr", 
+            "description": "Bad named entity: escr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&escr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&escr;", 
+            "description": "Named entity: escr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u212f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&esdot", 
+            "description": "Bad named entity: esdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&esdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&esdot;", 
+            "description": "Named entity: esdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2250"
+                ]
+            ]
+        }, 
+        {
+            "input": "&esim", 
+            "description": "Bad named entity: esim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&esim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&esim;", 
+            "description": "Named entity: esim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2242"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eta", 
+            "description": "Bad named entity: eta without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&eta"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eta;", 
+            "description": "Named entity: eta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03b7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eth", 
+            "description": "Named entity: eth without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00f0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eth;", 
+            "description": "Named entity: eth; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&euml", 
+            "description": "Named entity: euml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00eb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&euml;", 
+            "description": "Named entity: euml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00eb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&euro", 
+            "description": "Bad named entity: euro without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&euro"
+                ]
+            ]
+        }, 
+        {
+            "input": "&euro;", 
+            "description": "Named entity: euro; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u20ac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&excl", 
+            "description": "Bad named entity: excl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&excl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&excl;", 
+            "description": "Named entity: excl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "!"
+                ]
+            ]
+        }, 
+        {
+            "input": "&exist", 
+            "description": "Bad named entity: exist without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&exist"
+                ]
+            ]
+        }, 
+        {
+            "input": "&exist;", 
+            "description": "Named entity: exist; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2203"
+                ]
+            ]
+        }, 
+        {
+            "input": "&expectation", 
+            "description": "Bad named entity: expectation without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&expectation"
+                ]
+            ]
+        }, 
+        {
+            "input": "&expectation;", 
+            "description": "Named entity: expectation; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2130"
+                ]
+            ]
+        }, 
+        {
+            "input": "&exponentiale", 
+            "description": "Bad named entity: exponentiale without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&exponentiale"
+                ]
+            ]
+        }, 
+        {
+            "input": "&exponentiale;", 
+            "description": "Named entity: exponentiale; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2147"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fallingdotseq", 
+            "description": "Bad named entity: fallingdotseq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&fallingdotseq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fallingdotseq;", 
+            "description": "Named entity: fallingdotseq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2252"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fcy", 
+            "description": "Bad named entity: fcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&fcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fcy;", 
+            "description": "Named entity: fcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0444"
+                ]
+            ]
+        }, 
+        {
+            "input": "&female", 
+            "description": "Bad named entity: female without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&female"
+                ]
+            ]
+        }, 
+        {
+            "input": "&female;", 
+            "description": "Named entity: female; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2640"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ffilig", 
+            "description": "Bad named entity: ffilig without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ffilig"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ffilig;", 
+            "description": "Named entity: ffilig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ufb03"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fflig", 
+            "description": "Bad named entity: fflig without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&fflig"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fflig;", 
+            "description": "Named entity: fflig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ufb00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ffllig", 
+            "description": "Bad named entity: ffllig without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ffllig"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ffllig;", 
+            "description": "Named entity: ffllig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ufb04"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ffr", 
+            "description": "Bad named entity: ffr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ffr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ffr;", 
+            "description": "Named entity: ffr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd23"
+                ]
+            ]
+        }, 
+        {
+            "input": "&filig", 
+            "description": "Bad named entity: filig without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&filig"
+                ]
+            ]
+        }, 
+        {
+            "input": "&filig;", 
+            "description": "Named entity: filig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ufb01"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fjlig", 
+            "description": "Bad named entity: fjlig without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&fjlig"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fjlig;", 
+            "description": "Named entity: fjlig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "fj"
+                ]
+            ]
+        }, 
+        {
+            "input": "&flat", 
+            "description": "Bad named entity: flat without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&flat"
+                ]
+            ]
+        }, 
+        {
+            "input": "&flat;", 
+            "description": "Named entity: flat; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u266d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fllig", 
+            "description": "Bad named entity: fllig without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&fllig"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fllig;", 
+            "description": "Named entity: fllig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ufb02"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fltns", 
+            "description": "Bad named entity: fltns without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&fltns"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fltns;", 
+            "description": "Named entity: fltns; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fnof", 
+            "description": "Bad named entity: fnof without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&fnof"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fnof;", 
+            "description": "Named entity: fnof; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0192"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fopf", 
+            "description": "Bad named entity: fopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&fopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fopf;", 
+            "description": "Named entity: fopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd57"
+                ]
+            ]
+        }, 
+        {
+            "input": "&forall", 
+            "description": "Bad named entity: forall without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&forall"
+                ]
+            ]
+        }, 
+        {
+            "input": "&forall;", 
+            "description": "Named entity: forall; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2200"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fork", 
+            "description": "Bad named entity: fork without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&fork"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fork;", 
+            "description": "Named entity: fork; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&forkv", 
+            "description": "Bad named entity: forkv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&forkv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&forkv;", 
+            "description": "Named entity: forkv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ad9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fpartint", 
+            "description": "Bad named entity: fpartint without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&fpartint"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fpartint;", 
+            "description": "Named entity: fpartint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a0d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac12", 
+            "description": "Named entity: frac12 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00bd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac12;", 
+            "description": "Named entity: frac12; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00bd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac13", 
+            "description": "Bad named entity: frac13 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&frac13"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac13;", 
+            "description": "Named entity: frac13; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2153"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac14", 
+            "description": "Named entity: frac14 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00bc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac14;", 
+            "description": "Named entity: frac14; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00bc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac15", 
+            "description": "Bad named entity: frac15 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&frac15"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac15;", 
+            "description": "Named entity: frac15; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2155"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac16", 
+            "description": "Bad named entity: frac16 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&frac16"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac16;", 
+            "description": "Named entity: frac16; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2159"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac18", 
+            "description": "Bad named entity: frac18 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&frac18"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac18;", 
+            "description": "Named entity: frac18; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u215b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac23", 
+            "description": "Bad named entity: frac23 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&frac23"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac23;", 
+            "description": "Named entity: frac23; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2154"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac25", 
+            "description": "Bad named entity: frac25 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&frac25"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac25;", 
+            "description": "Named entity: frac25; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2156"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac34", 
+            "description": "Named entity: frac34 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00be"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac34;", 
+            "description": "Named entity: frac34; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00be"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac35", 
+            "description": "Bad named entity: frac35 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&frac35"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac35;", 
+            "description": "Named entity: frac35; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2157"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac38", 
+            "description": "Bad named entity: frac38 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&frac38"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac38;", 
+            "description": "Named entity: frac38; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u215c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac45", 
+            "description": "Bad named entity: frac45 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&frac45"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac45;", 
+            "description": "Named entity: frac45; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2158"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac56", 
+            "description": "Bad named entity: frac56 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&frac56"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac56;", 
+            "description": "Named entity: frac56; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u215a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac58", 
+            "description": "Bad named entity: frac58 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&frac58"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac58;", 
+            "description": "Named entity: frac58; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u215d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac78", 
+            "description": "Bad named entity: frac78 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&frac78"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac78;", 
+            "description": "Named entity: frac78; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u215e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frasl", 
+            "description": "Bad named entity: frasl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&frasl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frasl;", 
+            "description": "Named entity: frasl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2044"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frown", 
+            "description": "Bad named entity: frown without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&frown"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frown;", 
+            "description": "Named entity: frown; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2322"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fscr", 
+            "description": "Bad named entity: fscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&fscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fscr;", 
+            "description": "Named entity: fscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcbb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gE", 
+            "description": "Bad named entity: gE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gE;", 
+            "description": "Named entity: gE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2267"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gEl", 
+            "description": "Bad named entity: gEl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gEl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gEl;", 
+            "description": "Named entity: gEl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a8c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gacute", 
+            "description": "Bad named entity: gacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gacute;", 
+            "description": "Named entity: gacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u01f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gamma", 
+            "description": "Bad named entity: gamma without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gamma"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gamma;", 
+            "description": "Named entity: gamma; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03b3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gammad", 
+            "description": "Bad named entity: gammad without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gammad"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gammad;", 
+            "description": "Named entity: gammad; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03dd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gap", 
+            "description": "Bad named entity: gap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gap;", 
+            "description": "Named entity: gap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a86"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gbreve", 
+            "description": "Bad named entity: gbreve without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gbreve"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gbreve;", 
+            "description": "Named entity: gbreve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u011f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gcirc", 
+            "description": "Bad named entity: gcirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gcirc;", 
+            "description": "Named entity: gcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u011d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gcy", 
+            "description": "Bad named entity: gcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gcy;", 
+            "description": "Named entity: gcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0433"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gdot", 
+            "description": "Bad named entity: gdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gdot;", 
+            "description": "Named entity: gdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0121"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ge", 
+            "description": "Bad named entity: ge without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ge"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ge;", 
+            "description": "Named entity: ge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2265"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gel", 
+            "description": "Bad named entity: gel without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gel"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gel;", 
+            "description": "Named entity: gel; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22db"
+                ]
+            ]
+        }, 
+        {
+            "input": "&geq", 
+            "description": "Bad named entity: geq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&geq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&geq;", 
+            "description": "Named entity: geq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2265"
+                ]
+            ]
+        }, 
+        {
+            "input": "&geqq", 
+            "description": "Bad named entity: geqq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&geqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&geqq;", 
+            "description": "Named entity: geqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2267"
+                ]
+            ]
+        }, 
+        {
+            "input": "&geqslant", 
+            "description": "Bad named entity: geqslant without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&geqslant"
+                ]
+            ]
+        }, 
+        {
+            "input": "&geqslant;", 
+            "description": "Named entity: geqslant; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ges", 
+            "description": "Bad named entity: ges without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ges"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ges;", 
+            "description": "Named entity: ges; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gescc", 
+            "description": "Bad named entity: gescc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gescc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gescc;", 
+            "description": "Named entity: gescc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gesdot", 
+            "description": "Bad named entity: gesdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gesdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gesdot;", 
+            "description": "Named entity: gesdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a80"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gesdoto", 
+            "description": "Bad named entity: gesdoto without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gesdoto"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gesdoto;", 
+            "description": "Named entity: gesdoto; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a82"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gesdotol", 
+            "description": "Bad named entity: gesdotol without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gesdotol"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gesdotol;", 
+            "description": "Named entity: gesdotol; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a84"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gesl", 
+            "description": "Bad named entity: gesl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gesl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gesl;", 
+            "description": "Named entity: gesl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22db\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gesles", 
+            "description": "Bad named entity: gesles without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gesles"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gesles;", 
+            "description": "Named entity: gesles; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a94"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gfr", 
+            "description": "Bad named entity: gfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gfr;", 
+            "description": "Named entity: gfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd24"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gg", 
+            "description": "Bad named entity: gg without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gg"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gg;", 
+            "description": "Named entity: gg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ggg", 
+            "description": "Bad named entity: ggg without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ggg"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ggg;", 
+            "description": "Named entity: ggg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gimel", 
+            "description": "Bad named entity: gimel without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gimel"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gimel;", 
+            "description": "Named entity: gimel; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2137"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gjcy", 
+            "description": "Bad named entity: gjcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gjcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gjcy;", 
+            "description": "Named entity: gjcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0453"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gl", 
+            "description": "Bad named entity: gl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gl;", 
+            "description": "Named entity: gl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2277"
+                ]
+            ]
+        }, 
+        {
+            "input": "&glE", 
+            "description": "Bad named entity: glE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&glE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&glE;", 
+            "description": "Named entity: glE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a92"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gla", 
+            "description": "Bad named entity: gla without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gla"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gla;", 
+            "description": "Named entity: gla; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&glj", 
+            "description": "Bad named entity: glj without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&glj"
+                ]
+            ]
+        }, 
+        {
+            "input": "&glj;", 
+            "description": "Named entity: glj; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gnE", 
+            "description": "Bad named entity: gnE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gnE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gnE;", 
+            "description": "Named entity: gnE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2269"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gnap", 
+            "description": "Bad named entity: gnap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gnap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gnap;", 
+            "description": "Named entity: gnap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a8a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gnapprox", 
+            "description": "Bad named entity: gnapprox without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gnapprox"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gnapprox;", 
+            "description": "Named entity: gnapprox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a8a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gne", 
+            "description": "Bad named entity: gne without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gne"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gne;", 
+            "description": "Named entity: gne; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a88"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gneq", 
+            "description": "Bad named entity: gneq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gneq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gneq;", 
+            "description": "Named entity: gneq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a88"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gneqq", 
+            "description": "Bad named entity: gneqq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gneqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gneqq;", 
+            "description": "Named entity: gneqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2269"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gnsim", 
+            "description": "Bad named entity: gnsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gnsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gnsim;", 
+            "description": "Named entity: gnsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gopf", 
+            "description": "Bad named entity: gopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gopf;", 
+            "description": "Named entity: gopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd58"
+                ]
+            ]
+        }, 
+        {
+            "input": "&grave", 
+            "description": "Bad named entity: grave without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&grave"
+                ]
+            ]
+        }, 
+        {
+            "input": "&grave;", 
+            "description": "Named entity: grave; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "`"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gscr", 
+            "description": "Bad named entity: gscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gscr;", 
+            "description": "Named entity: gscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gsim", 
+            "description": "Bad named entity: gsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gsim;", 
+            "description": "Named entity: gsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2273"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gsime", 
+            "description": "Bad named entity: gsime without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gsime"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gsime;", 
+            "description": "Named entity: gsime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a8e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gsiml", 
+            "description": "Bad named entity: gsiml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gsiml"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gsiml;", 
+            "description": "Named entity: gsiml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a90"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gt", 
+            "description": "Named entity: gt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    ">"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gt;", 
+            "description": "Named entity: gt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    ">"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gtcc;", 
+            "description": "Named entity: gtcc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gtcir;", 
+            "description": "Named entity: gtcir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gtdot;", 
+            "description": "Named entity: gtdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gtlPar;", 
+            "description": "Named entity: gtlPar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2995"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gtquest;", 
+            "description": "Named entity: gtquest; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gtrapprox;", 
+            "description": "Named entity: gtrapprox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a86"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gtrarr;", 
+            "description": "Named entity: gtrarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2978"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gtrdot;", 
+            "description": "Named entity: gtrdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gtreqless;", 
+            "description": "Named entity: gtreqless; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22db"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gtreqqless;", 
+            "description": "Named entity: gtreqqless; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a8c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gtrless;", 
+            "description": "Named entity: gtrless; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2277"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gtrsim;", 
+            "description": "Named entity: gtrsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2273"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gvertneqq", 
+            "description": "Bad named entity: gvertneqq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gvertneqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gvertneqq;", 
+            "description": "Named entity: gvertneqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2269\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gvnE", 
+            "description": "Bad named entity: gvnE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&gvnE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gvnE;", 
+            "description": "Named entity: gvnE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2269\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hArr", 
+            "description": "Bad named entity: hArr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hArr;", 
+            "description": "Named entity: hArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hairsp", 
+            "description": "Bad named entity: hairsp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hairsp"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hairsp;", 
+            "description": "Named entity: hairsp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&half", 
+            "description": "Bad named entity: half without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&half"
+                ]
+            ]
+        }, 
+        {
+            "input": "&half;", 
+            "description": "Named entity: half; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00bd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hamilt", 
+            "description": "Bad named entity: hamilt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hamilt"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hamilt;", 
+            "description": "Named entity: hamilt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hardcy", 
+            "description": "Bad named entity: hardcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hardcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hardcy;", 
+            "description": "Named entity: hardcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u044a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&harr", 
+            "description": "Bad named entity: harr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&harr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&harr;", 
+            "description": "Named entity: harr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2194"
+                ]
+            ]
+        }, 
+        {
+            "input": "&harrcir", 
+            "description": "Bad named entity: harrcir without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&harrcir"
+                ]
+            ]
+        }, 
+        {
+            "input": "&harrcir;", 
+            "description": "Named entity: harrcir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2948"
+                ]
+            ]
+        }, 
+        {
+            "input": "&harrw", 
+            "description": "Bad named entity: harrw without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&harrw"
+                ]
+            ]
+        }, 
+        {
+            "input": "&harrw;", 
+            "description": "Named entity: harrw; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ad"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hbar", 
+            "description": "Bad named entity: hbar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hbar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hbar;", 
+            "description": "Named entity: hbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hcirc", 
+            "description": "Bad named entity: hcirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hcirc;", 
+            "description": "Named entity: hcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0125"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hearts", 
+            "description": "Bad named entity: hearts without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hearts"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hearts;", 
+            "description": "Named entity: hearts; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2665"
+                ]
+            ]
+        }, 
+        {
+            "input": "&heartsuit", 
+            "description": "Bad named entity: heartsuit without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&heartsuit"
+                ]
+            ]
+        }, 
+        {
+            "input": "&heartsuit;", 
+            "description": "Named entity: heartsuit; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2665"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hellip", 
+            "description": "Bad named entity: hellip without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hellip"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hellip;", 
+            "description": "Named entity: hellip; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2026"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hercon", 
+            "description": "Bad named entity: hercon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hercon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hercon;", 
+            "description": "Named entity: hercon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hfr", 
+            "description": "Bad named entity: hfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hfr;", 
+            "description": "Named entity: hfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd25"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hksearow", 
+            "description": "Bad named entity: hksearow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hksearow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hksearow;", 
+            "description": "Named entity: hksearow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2925"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hkswarow", 
+            "description": "Bad named entity: hkswarow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hkswarow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hkswarow;", 
+            "description": "Named entity: hkswarow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2926"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hoarr", 
+            "description": "Bad named entity: hoarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hoarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hoarr;", 
+            "description": "Named entity: hoarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ff"
+                ]
+            ]
+        }, 
+        {
+            "input": "&homtht", 
+            "description": "Bad named entity: homtht without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&homtht"
+                ]
+            ]
+        }, 
+        {
+            "input": "&homtht;", 
+            "description": "Named entity: homtht; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hookleftarrow", 
+            "description": "Bad named entity: hookleftarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hookleftarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hookleftarrow;", 
+            "description": "Named entity: hookleftarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hookrightarrow", 
+            "description": "Bad named entity: hookrightarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hookrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hookrightarrow;", 
+            "description": "Named entity: hookrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21aa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hopf", 
+            "description": "Bad named entity: hopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hopf;", 
+            "description": "Named entity: hopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd59"
+                ]
+            ]
+        }, 
+        {
+            "input": "&horbar", 
+            "description": "Bad named entity: horbar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&horbar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&horbar;", 
+            "description": "Named entity: horbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2015"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hscr", 
+            "description": "Bad named entity: hscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hscr;", 
+            "description": "Named entity: hscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcbd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hslash", 
+            "description": "Bad named entity: hslash without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hslash"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hslash;", 
+            "description": "Named entity: hslash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hstrok", 
+            "description": "Bad named entity: hstrok without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hstrok"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hstrok;", 
+            "description": "Named entity: hstrok; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0127"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hybull", 
+            "description": "Bad named entity: hybull without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hybull"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hybull;", 
+            "description": "Named entity: hybull; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2043"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hyphen", 
+            "description": "Bad named entity: hyphen without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&hyphen"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hyphen;", 
+            "description": "Named entity: hyphen; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2010"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iacute", 
+            "description": "Named entity: iacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ed"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iacute;", 
+            "description": "Named entity: iacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ed"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ic", 
+            "description": "Bad named entity: ic without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ic"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ic;", 
+            "description": "Named entity: ic; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2063"
+                ]
+            ]
+        }, 
+        {
+            "input": "&icirc", 
+            "description": "Named entity: icirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&icirc;", 
+            "description": "Named entity: icirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&icy", 
+            "description": "Bad named entity: icy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&icy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&icy;", 
+            "description": "Named entity: icy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0438"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iecy", 
+            "description": "Bad named entity: iecy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&iecy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iecy;", 
+            "description": "Named entity: iecy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0435"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iexcl", 
+            "description": "Named entity: iexcl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iexcl;", 
+            "description": "Named entity: iexcl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iff", 
+            "description": "Bad named entity: iff without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&iff"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iff;", 
+            "description": "Named entity: iff; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ifr", 
+            "description": "Bad named entity: ifr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ifr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ifr;", 
+            "description": "Named entity: ifr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd26"
+                ]
+            ]
+        }, 
+        {
+            "input": "&igrave", 
+            "description": "Named entity: igrave without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ec"
+                ]
+            ]
+        }, 
+        {
+            "input": "&igrave;", 
+            "description": "Named entity: igrave; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ec"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ii", 
+            "description": "Bad named entity: ii without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ii"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ii;", 
+            "description": "Named entity: ii; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2148"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iiiint", 
+            "description": "Bad named entity: iiiint without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&iiiint"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iiiint;", 
+            "description": "Named entity: iiiint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a0c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iiint", 
+            "description": "Bad named entity: iiint without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&iiint"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iiint;", 
+            "description": "Named entity: iiint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iinfin", 
+            "description": "Bad named entity: iinfin without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&iinfin"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iinfin;", 
+            "description": "Named entity: iinfin; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29dc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iiota", 
+            "description": "Bad named entity: iiota without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&iiota"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iiota;", 
+            "description": "Named entity: iiota; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2129"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ijlig", 
+            "description": "Bad named entity: ijlig without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ijlig"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ijlig;", 
+            "description": "Named entity: ijlig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0133"
+                ]
+            ]
+        }, 
+        {
+            "input": "&imacr", 
+            "description": "Bad named entity: imacr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&imacr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&imacr;", 
+            "description": "Named entity: imacr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u012b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&image", 
+            "description": "Bad named entity: image without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&image"
+                ]
+            ]
+        }, 
+        {
+            "input": "&image;", 
+            "description": "Named entity: image; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2111"
+                ]
+            ]
+        }, 
+        {
+            "input": "&imagline", 
+            "description": "Bad named entity: imagline without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&imagline"
+                ]
+            ]
+        }, 
+        {
+            "input": "&imagline;", 
+            "description": "Named entity: imagline; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2110"
+                ]
+            ]
+        }, 
+        {
+            "input": "&imagpart", 
+            "description": "Bad named entity: imagpart without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&imagpart"
+                ]
+            ]
+        }, 
+        {
+            "input": "&imagpart;", 
+            "description": "Named entity: imagpart; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2111"
+                ]
+            ]
+        }, 
+        {
+            "input": "&imath", 
+            "description": "Bad named entity: imath without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&imath"
+                ]
+            ]
+        }, 
+        {
+            "input": "&imath;", 
+            "description": "Named entity: imath; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0131"
+                ]
+            ]
+        }, 
+        {
+            "input": "&imof", 
+            "description": "Bad named entity: imof without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&imof"
+                ]
+            ]
+        }, 
+        {
+            "input": "&imof;", 
+            "description": "Named entity: imof; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&imped", 
+            "description": "Bad named entity: imped without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&imped"
+                ]
+            ]
+        }, 
+        {
+            "input": "&imped;", 
+            "description": "Named entity: imped; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u01b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&in", 
+            "description": "Bad named entity: in without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&in"
+                ]
+            ]
+        }, 
+        {
+            "input": "&in;", 
+            "description": "Named entity: in; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2208"
+                ]
+            ]
+        }, 
+        {
+            "input": "&incare", 
+            "description": "Bad named entity: incare without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&incare"
+                ]
+            ]
+        }, 
+        {
+            "input": "&incare;", 
+            "description": "Named entity: incare; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2105"
+                ]
+            ]
+        }, 
+        {
+            "input": "&infin", 
+            "description": "Bad named entity: infin without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&infin"
+                ]
+            ]
+        }, 
+        {
+            "input": "&infin;", 
+            "description": "Named entity: infin; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u221e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&infintie", 
+            "description": "Bad named entity: infintie without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&infintie"
+                ]
+            ]
+        }, 
+        {
+            "input": "&infintie;", 
+            "description": "Named entity: infintie; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29dd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&inodot", 
+            "description": "Bad named entity: inodot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&inodot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&inodot;", 
+            "description": "Named entity: inodot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0131"
+                ]
+            ]
+        }, 
+        {
+            "input": "&int", 
+            "description": "Bad named entity: int without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&int"
+                ]
+            ]
+        }, 
+        {
+            "input": "&int;", 
+            "description": "Named entity: int; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&intcal", 
+            "description": "Bad named entity: intcal without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&intcal"
+                ]
+            ]
+        }, 
+        {
+            "input": "&intcal;", 
+            "description": "Named entity: intcal; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ba"
+                ]
+            ]
+        }, 
+        {
+            "input": "&integers", 
+            "description": "Bad named entity: integers without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&integers"
+                ]
+            ]
+        }, 
+        {
+            "input": "&integers;", 
+            "description": "Named entity: integers; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2124"
+                ]
+            ]
+        }, 
+        {
+            "input": "&intercal", 
+            "description": "Bad named entity: intercal without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&intercal"
+                ]
+            ]
+        }, 
+        {
+            "input": "&intercal;", 
+            "description": "Named entity: intercal; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ba"
+                ]
+            ]
+        }, 
+        {
+            "input": "&intlarhk", 
+            "description": "Bad named entity: intlarhk without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&intlarhk"
+                ]
+            ]
+        }, 
+        {
+            "input": "&intlarhk;", 
+            "description": "Named entity: intlarhk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a17"
+                ]
+            ]
+        }, 
+        {
+            "input": "&intprod", 
+            "description": "Bad named entity: intprod without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&intprod"
+                ]
+            ]
+        }, 
+        {
+            "input": "&intprod;", 
+            "description": "Named entity: intprod; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a3c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iocy", 
+            "description": "Bad named entity: iocy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&iocy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iocy;", 
+            "description": "Named entity: iocy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0451"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iogon", 
+            "description": "Bad named entity: iogon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&iogon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iogon;", 
+            "description": "Named entity: iogon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u012f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iopf", 
+            "description": "Bad named entity: iopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&iopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iopf;", 
+            "description": "Named entity: iopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd5a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iota", 
+            "description": "Bad named entity: iota without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&iota"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iota;", 
+            "description": "Named entity: iota; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03b9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iprod", 
+            "description": "Bad named entity: iprod without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&iprod"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iprod;", 
+            "description": "Named entity: iprod; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a3c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iquest", 
+            "description": "Named entity: iquest without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00bf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iquest;", 
+            "description": "Named entity: iquest; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00bf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iscr", 
+            "description": "Bad named entity: iscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&iscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iscr;", 
+            "description": "Named entity: iscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcbe"
+                ]
+            ]
+        }, 
+        {
+            "input": "&isin", 
+            "description": "Bad named entity: isin without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&isin"
+                ]
+            ]
+        }, 
+        {
+            "input": "&isin;", 
+            "description": "Named entity: isin; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2208"
+                ]
+            ]
+        }, 
+        {
+            "input": "&isinE", 
+            "description": "Bad named entity: isinE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&isinE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&isinE;", 
+            "description": "Named entity: isinE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&isindot", 
+            "description": "Bad named entity: isindot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&isindot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&isindot;", 
+            "description": "Named entity: isindot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&isins", 
+            "description": "Bad named entity: isins without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&isins"
+                ]
+            ]
+        }, 
+        {
+            "input": "&isins;", 
+            "description": "Named entity: isins; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&isinsv", 
+            "description": "Bad named entity: isinsv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&isinsv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&isinsv;", 
+            "description": "Named entity: isinsv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&isinv", 
+            "description": "Bad named entity: isinv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&isinv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&isinv;", 
+            "description": "Named entity: isinv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2208"
+                ]
+            ]
+        }, 
+        {
+            "input": "&it", 
+            "description": "Bad named entity: it without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&it"
+                ]
+            ]
+        }, 
+        {
+            "input": "&it;", 
+            "description": "Named entity: it; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2062"
+                ]
+            ]
+        }, 
+        {
+            "input": "&itilde", 
+            "description": "Bad named entity: itilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&itilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "&itilde;", 
+            "description": "Named entity: itilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0129"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iukcy", 
+            "description": "Bad named entity: iukcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&iukcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iukcy;", 
+            "description": "Named entity: iukcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0456"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iuml", 
+            "description": "Named entity: iuml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ef"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iuml;", 
+            "description": "Named entity: iuml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ef"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jcirc", 
+            "description": "Bad named entity: jcirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&jcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jcirc;", 
+            "description": "Named entity: jcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0135"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jcy", 
+            "description": "Bad named entity: jcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&jcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jcy;", 
+            "description": "Named entity: jcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0439"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jfr", 
+            "description": "Bad named entity: jfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&jfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jfr;", 
+            "description": "Named entity: jfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd27"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jmath", 
+            "description": "Bad named entity: jmath without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&jmath"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jmath;", 
+            "description": "Named entity: jmath; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0237"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jopf", 
+            "description": "Bad named entity: jopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&jopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jopf;", 
+            "description": "Named entity: jopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd5b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jscr", 
+            "description": "Bad named entity: jscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&jscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jscr;", 
+            "description": "Named entity: jscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcbf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jsercy", 
+            "description": "Bad named entity: jsercy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&jsercy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jsercy;", 
+            "description": "Named entity: jsercy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0458"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jukcy", 
+            "description": "Bad named entity: jukcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&jukcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jukcy;", 
+            "description": "Named entity: jukcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0454"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kappa", 
+            "description": "Bad named entity: kappa without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&kappa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kappa;", 
+            "description": "Named entity: kappa; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03ba"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kappav", 
+            "description": "Bad named entity: kappav without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&kappav"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kappav;", 
+            "description": "Named entity: kappav; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03f0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kcedil", 
+            "description": "Bad named entity: kcedil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&kcedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kcedil;", 
+            "description": "Named entity: kcedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0137"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kcy", 
+            "description": "Bad named entity: kcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&kcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kcy;", 
+            "description": "Named entity: kcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u043a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kfr", 
+            "description": "Bad named entity: kfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&kfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kfr;", 
+            "description": "Named entity: kfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd28"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kgreen", 
+            "description": "Bad named entity: kgreen without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&kgreen"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kgreen;", 
+            "description": "Named entity: kgreen; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0138"
+                ]
+            ]
+        }, 
+        {
+            "input": "&khcy", 
+            "description": "Bad named entity: khcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&khcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&khcy;", 
+            "description": "Named entity: khcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0445"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kjcy", 
+            "description": "Bad named entity: kjcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&kjcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kjcy;", 
+            "description": "Named entity: kjcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u045c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kopf", 
+            "description": "Bad named entity: kopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&kopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kopf;", 
+            "description": "Named entity: kopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd5c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kscr", 
+            "description": "Bad named entity: kscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&kscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kscr;", 
+            "description": "Named entity: kscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcc0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lAarr", 
+            "description": "Bad named entity: lAarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lAarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lAarr;", 
+            "description": "Named entity: lAarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21da"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lArr", 
+            "description": "Bad named entity: lArr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lArr;", 
+            "description": "Named entity: lArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lAtail", 
+            "description": "Bad named entity: lAtail without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lAtail"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lAtail;", 
+            "description": "Named entity: lAtail; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u291b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lBarr", 
+            "description": "Bad named entity: lBarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lBarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lBarr;", 
+            "description": "Named entity: lBarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u290e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lE", 
+            "description": "Bad named entity: lE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lE;", 
+            "description": "Named entity: lE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2266"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lEg", 
+            "description": "Bad named entity: lEg without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lEg"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lEg;", 
+            "description": "Named entity: lEg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a8b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lHar", 
+            "description": "Bad named entity: lHar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lHar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lHar;", 
+            "description": "Named entity: lHar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2962"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lacute", 
+            "description": "Bad named entity: lacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lacute;", 
+            "description": "Named entity: lacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u013a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&laemptyv", 
+            "description": "Bad named entity: laemptyv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&laemptyv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&laemptyv;", 
+            "description": "Named entity: laemptyv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lagran", 
+            "description": "Bad named entity: lagran without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lagran"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lagran;", 
+            "description": "Named entity: lagran; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2112"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lambda", 
+            "description": "Bad named entity: lambda without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lambda"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lambda;", 
+            "description": "Named entity: lambda; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03bb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lang", 
+            "description": "Bad named entity: lang without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lang"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lang;", 
+            "description": "Named entity: lang; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27e8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&langd", 
+            "description": "Bad named entity: langd without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&langd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&langd;", 
+            "description": "Named entity: langd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2991"
+                ]
+            ]
+        }, 
+        {
+            "input": "&langle", 
+            "description": "Bad named entity: langle without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&langle"
+                ]
+            ]
+        }, 
+        {
+            "input": "&langle;", 
+            "description": "Named entity: langle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27e8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lap", 
+            "description": "Bad named entity: lap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lap;", 
+            "description": "Named entity: lap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a85"
+                ]
+            ]
+        }, 
+        {
+            "input": "&laquo", 
+            "description": "Named entity: laquo without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ab"
+                ]
+            ]
+        }, 
+        {
+            "input": "&laquo;", 
+            "description": "Named entity: laquo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ab"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larr", 
+            "description": "Bad named entity: larr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&larr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larr;", 
+            "description": "Named entity: larr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2190"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrb", 
+            "description": "Bad named entity: larrb without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&larrb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrb;", 
+            "description": "Named entity: larrb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21e4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrbfs", 
+            "description": "Bad named entity: larrbfs without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&larrbfs"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrbfs;", 
+            "description": "Named entity: larrbfs; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u291f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrfs", 
+            "description": "Bad named entity: larrfs without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&larrfs"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrfs;", 
+            "description": "Named entity: larrfs; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u291d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrhk", 
+            "description": "Bad named entity: larrhk without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&larrhk"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrhk;", 
+            "description": "Named entity: larrhk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrlp", 
+            "description": "Bad named entity: larrlp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&larrlp"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrlp;", 
+            "description": "Named entity: larrlp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ab"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrpl", 
+            "description": "Bad named entity: larrpl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&larrpl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrpl;", 
+            "description": "Named entity: larrpl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2939"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrsim", 
+            "description": "Bad named entity: larrsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&larrsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrsim;", 
+            "description": "Named entity: larrsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2973"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrtl", 
+            "description": "Bad named entity: larrtl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&larrtl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrtl;", 
+            "description": "Named entity: larrtl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lat", 
+            "description": "Bad named entity: lat without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lat"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lat;", 
+            "description": "Named entity: lat; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aab"
+                ]
+            ]
+        }, 
+        {
+            "input": "&latail", 
+            "description": "Bad named entity: latail without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&latail"
+                ]
+            ]
+        }, 
+        {
+            "input": "&latail;", 
+            "description": "Named entity: latail; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2919"
+                ]
+            ]
+        }, 
+        {
+            "input": "&late", 
+            "description": "Bad named entity: late without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&late"
+                ]
+            ]
+        }, 
+        {
+            "input": "&late;", 
+            "description": "Named entity: late; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aad"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lates", 
+            "description": "Bad named entity: lates without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lates"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lates;", 
+            "description": "Named entity: lates; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aad\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbarr", 
+            "description": "Bad named entity: lbarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lbarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbarr;", 
+            "description": "Named entity: lbarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u290c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbbrk", 
+            "description": "Bad named entity: lbbrk without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lbbrk"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbbrk;", 
+            "description": "Named entity: lbbrk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2772"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbrace", 
+            "description": "Bad named entity: lbrace without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lbrace"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbrace;", 
+            "description": "Named entity: lbrace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "{"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbrack", 
+            "description": "Bad named entity: lbrack without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lbrack"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbrack;", 
+            "description": "Named entity: lbrack; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "["
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbrke", 
+            "description": "Bad named entity: lbrke without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lbrke"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbrke;", 
+            "description": "Named entity: lbrke; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u298b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbrksld", 
+            "description": "Bad named entity: lbrksld without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lbrksld"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbrksld;", 
+            "description": "Named entity: lbrksld; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u298f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbrkslu", 
+            "description": "Bad named entity: lbrkslu without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lbrkslu"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbrkslu;", 
+            "description": "Named entity: lbrkslu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u298d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lcaron", 
+            "description": "Bad named entity: lcaron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lcaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lcaron;", 
+            "description": "Named entity: lcaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u013e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lcedil", 
+            "description": "Bad named entity: lcedil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lcedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lcedil;", 
+            "description": "Named entity: lcedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u013c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lceil", 
+            "description": "Bad named entity: lceil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lceil"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lceil;", 
+            "description": "Named entity: lceil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2308"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lcub", 
+            "description": "Bad named entity: lcub without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lcub"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lcub;", 
+            "description": "Named entity: lcub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "{"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lcy", 
+            "description": "Bad named entity: lcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lcy;", 
+            "description": "Named entity: lcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u043b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ldca", 
+            "description": "Bad named entity: ldca without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ldca"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ldca;", 
+            "description": "Named entity: ldca; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2936"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ldquo", 
+            "description": "Bad named entity: ldquo without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ldquo"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ldquo;", 
+            "description": "Named entity: ldquo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u201c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ldquor", 
+            "description": "Bad named entity: ldquor without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ldquor"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ldquor;", 
+            "description": "Named entity: ldquor; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u201e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ldrdhar", 
+            "description": "Bad named entity: ldrdhar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ldrdhar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ldrdhar;", 
+            "description": "Named entity: ldrdhar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2967"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ldrushar", 
+            "description": "Bad named entity: ldrushar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ldrushar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ldrushar;", 
+            "description": "Named entity: ldrushar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u294b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ldsh", 
+            "description": "Bad named entity: ldsh without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ldsh"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ldsh;", 
+            "description": "Named entity: ldsh; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&le", 
+            "description": "Bad named entity: le without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&le"
+                ]
+            ]
+        }, 
+        {
+            "input": "&le;", 
+            "description": "Named entity: le; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2264"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftarrow", 
+            "description": "Bad named entity: leftarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&leftarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftarrow;", 
+            "description": "Named entity: leftarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2190"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftarrowtail", 
+            "description": "Bad named entity: leftarrowtail without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&leftarrowtail"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftarrowtail;", 
+            "description": "Named entity: leftarrowtail; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftharpoondown", 
+            "description": "Bad named entity: leftharpoondown without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&leftharpoondown"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftharpoondown;", 
+            "description": "Named entity: leftharpoondown; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftharpoonup", 
+            "description": "Bad named entity: leftharpoonup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&leftharpoonup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftharpoonup;", 
+            "description": "Named entity: leftharpoonup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftleftarrows", 
+            "description": "Bad named entity: leftleftarrows without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&leftleftarrows"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftleftarrows;", 
+            "description": "Named entity: leftleftarrows; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftrightarrow", 
+            "description": "Bad named entity: leftrightarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&leftrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftrightarrow;", 
+            "description": "Named entity: leftrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2194"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftrightarrows", 
+            "description": "Bad named entity: leftrightarrows without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&leftrightarrows"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftrightarrows;", 
+            "description": "Named entity: leftrightarrows; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftrightharpoons", 
+            "description": "Bad named entity: leftrightharpoons without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&leftrightharpoons"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftrightharpoons;", 
+            "description": "Named entity: leftrightharpoons; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21cb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftrightsquigarrow", 
+            "description": "Bad named entity: leftrightsquigarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&leftrightsquigarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftrightsquigarrow;", 
+            "description": "Named entity: leftrightsquigarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ad"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftthreetimes", 
+            "description": "Bad named entity: leftthreetimes without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&leftthreetimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftthreetimes;", 
+            "description": "Named entity: leftthreetimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22cb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leg", 
+            "description": "Bad named entity: leg without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&leg"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leg;", 
+            "description": "Named entity: leg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22da"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leq", 
+            "description": "Bad named entity: leq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&leq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leq;", 
+            "description": "Named entity: leq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2264"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leqq", 
+            "description": "Bad named entity: leqq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&leqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leqq;", 
+            "description": "Named entity: leqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2266"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leqslant", 
+            "description": "Bad named entity: leqslant without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&leqslant"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leqslant;", 
+            "description": "Named entity: leqslant; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&les", 
+            "description": "Bad named entity: les without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&les"
+                ]
+            ]
+        }, 
+        {
+            "input": "&les;", 
+            "description": "Named entity: les; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lescc", 
+            "description": "Bad named entity: lescc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lescc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lescc;", 
+            "description": "Named entity: lescc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesdot", 
+            "description": "Bad named entity: lesdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lesdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesdot;", 
+            "description": "Named entity: lesdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesdoto", 
+            "description": "Bad named entity: lesdoto without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lesdoto"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesdoto;", 
+            "description": "Named entity: lesdoto; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a81"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesdotor", 
+            "description": "Bad named entity: lesdotor without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lesdotor"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesdotor;", 
+            "description": "Named entity: lesdotor; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a83"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesg", 
+            "description": "Bad named entity: lesg without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lesg"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesg;", 
+            "description": "Named entity: lesg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22da\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesges", 
+            "description": "Bad named entity: lesges without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lesges"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesges;", 
+            "description": "Named entity: lesges; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a93"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lessapprox", 
+            "description": "Bad named entity: lessapprox without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lessapprox"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lessapprox;", 
+            "description": "Named entity: lessapprox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a85"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lessdot", 
+            "description": "Bad named entity: lessdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lessdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lessdot;", 
+            "description": "Named entity: lessdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesseqgtr", 
+            "description": "Bad named entity: lesseqgtr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lesseqgtr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesseqgtr;", 
+            "description": "Named entity: lesseqgtr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22da"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesseqqgtr", 
+            "description": "Bad named entity: lesseqqgtr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lesseqqgtr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesseqqgtr;", 
+            "description": "Named entity: lesseqqgtr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a8b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lessgtr", 
+            "description": "Bad named entity: lessgtr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lessgtr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lessgtr;", 
+            "description": "Named entity: lessgtr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2276"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesssim", 
+            "description": "Bad named entity: lesssim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lesssim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesssim;", 
+            "description": "Named entity: lesssim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2272"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lfisht", 
+            "description": "Bad named entity: lfisht without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lfisht"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lfisht;", 
+            "description": "Named entity: lfisht; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u297c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lfloor", 
+            "description": "Bad named entity: lfloor without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lfloor"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lfloor;", 
+            "description": "Named entity: lfloor; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u230a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lfr", 
+            "description": "Bad named entity: lfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lfr;", 
+            "description": "Named entity: lfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd29"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lg", 
+            "description": "Bad named entity: lg without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lg"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lg;", 
+            "description": "Named entity: lg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2276"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lgE", 
+            "description": "Bad named entity: lgE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lgE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lgE;", 
+            "description": "Named entity: lgE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a91"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lhard", 
+            "description": "Bad named entity: lhard without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lhard"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lhard;", 
+            "description": "Named entity: lhard; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lharu", 
+            "description": "Bad named entity: lharu without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lharu"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lharu;", 
+            "description": "Named entity: lharu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lharul", 
+            "description": "Bad named entity: lharul without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lharul"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lharul;", 
+            "description": "Named entity: lharul; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u296a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lhblk", 
+            "description": "Bad named entity: lhblk without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lhblk"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lhblk;", 
+            "description": "Named entity: lhblk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2584"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ljcy", 
+            "description": "Bad named entity: ljcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ljcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ljcy;", 
+            "description": "Named entity: ljcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0459"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ll", 
+            "description": "Bad named entity: ll without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ll"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ll;", 
+            "description": "Named entity: ll; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&llarr", 
+            "description": "Bad named entity: llarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&llarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&llarr;", 
+            "description": "Named entity: llarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&llcorner", 
+            "description": "Bad named entity: llcorner without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&llcorner"
+                ]
+            ]
+        }, 
+        {
+            "input": "&llcorner;", 
+            "description": "Named entity: llcorner; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u231e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&llhard", 
+            "description": "Bad named entity: llhard without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&llhard"
+                ]
+            ]
+        }, 
+        {
+            "input": "&llhard;", 
+            "description": "Named entity: llhard; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u296b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lltri", 
+            "description": "Bad named entity: lltri without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lltri"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lltri;", 
+            "description": "Named entity: lltri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25fa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lmidot", 
+            "description": "Bad named entity: lmidot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lmidot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lmidot;", 
+            "description": "Named entity: lmidot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0140"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lmoust", 
+            "description": "Bad named entity: lmoust without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lmoust"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lmoust;", 
+            "description": "Named entity: lmoust; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23b0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lmoustache", 
+            "description": "Bad named entity: lmoustache without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lmoustache"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lmoustache;", 
+            "description": "Named entity: lmoustache; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23b0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lnE", 
+            "description": "Bad named entity: lnE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lnE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lnE;", 
+            "description": "Named entity: lnE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2268"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lnap", 
+            "description": "Bad named entity: lnap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lnap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lnap;", 
+            "description": "Named entity: lnap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a89"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lnapprox", 
+            "description": "Bad named entity: lnapprox without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lnapprox"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lnapprox;", 
+            "description": "Named entity: lnapprox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a89"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lne", 
+            "description": "Bad named entity: lne without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lne"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lne;", 
+            "description": "Named entity: lne; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a87"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lneq", 
+            "description": "Bad named entity: lneq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lneq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lneq;", 
+            "description": "Named entity: lneq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a87"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lneqq", 
+            "description": "Bad named entity: lneqq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lneqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lneqq;", 
+            "description": "Named entity: lneqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2268"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lnsim", 
+            "description": "Bad named entity: lnsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lnsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lnsim;", 
+            "description": "Named entity: lnsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&loang", 
+            "description": "Bad named entity: loang without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&loang"
+                ]
+            ]
+        }, 
+        {
+            "input": "&loang;", 
+            "description": "Named entity: loang; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27ec"
+                ]
+            ]
+        }, 
+        {
+            "input": "&loarr", 
+            "description": "Bad named entity: loarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&loarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&loarr;", 
+            "description": "Named entity: loarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21fd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lobrk", 
+            "description": "Bad named entity: lobrk without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lobrk"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lobrk;", 
+            "description": "Named entity: lobrk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27e6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&longleftarrow", 
+            "description": "Bad named entity: longleftarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&longleftarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&longleftarrow;", 
+            "description": "Named entity: longleftarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&longleftrightarrow", 
+            "description": "Bad named entity: longleftrightarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&longleftrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&longleftrightarrow;", 
+            "description": "Named entity: longleftrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&longmapsto", 
+            "description": "Bad named entity: longmapsto without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&longmapsto"
+                ]
+            ]
+        }, 
+        {
+            "input": "&longmapsto;", 
+            "description": "Named entity: longmapsto; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27fc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&longrightarrow", 
+            "description": "Bad named entity: longrightarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&longrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&longrightarrow;", 
+            "description": "Named entity: longrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&looparrowleft", 
+            "description": "Bad named entity: looparrowleft without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&looparrowleft"
+                ]
+            ]
+        }, 
+        {
+            "input": "&looparrowleft;", 
+            "description": "Named entity: looparrowleft; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ab"
+                ]
+            ]
+        }, 
+        {
+            "input": "&looparrowright", 
+            "description": "Bad named entity: looparrowright without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&looparrowright"
+                ]
+            ]
+        }, 
+        {
+            "input": "&looparrowright;", 
+            "description": "Named entity: looparrowright; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lopar", 
+            "description": "Bad named entity: lopar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lopar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lopar;", 
+            "description": "Named entity: lopar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2985"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lopf", 
+            "description": "Bad named entity: lopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lopf;", 
+            "description": "Named entity: lopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd5d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&loplus", 
+            "description": "Bad named entity: loplus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&loplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&loplus;", 
+            "description": "Named entity: loplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a2d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lotimes", 
+            "description": "Bad named entity: lotimes without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lotimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lotimes;", 
+            "description": "Named entity: lotimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a34"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lowast", 
+            "description": "Bad named entity: lowast without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lowast"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lowast;", 
+            "description": "Named entity: lowast; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2217"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lowbar", 
+            "description": "Bad named entity: lowbar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lowbar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lowbar;", 
+            "description": "Named entity: lowbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "_"
+                ]
+            ]
+        }, 
+        {
+            "input": "&loz", 
+            "description": "Bad named entity: loz without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&loz"
+                ]
+            ]
+        }, 
+        {
+            "input": "&loz;", 
+            "description": "Named entity: loz; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25ca"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lozenge", 
+            "description": "Bad named entity: lozenge without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lozenge"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lozenge;", 
+            "description": "Named entity: lozenge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25ca"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lozf", 
+            "description": "Bad named entity: lozf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lozf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lozf;", 
+            "description": "Named entity: lozf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29eb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lpar", 
+            "description": "Bad named entity: lpar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lpar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lpar;", 
+            "description": "Named entity: lpar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "("
+                ]
+            ]
+        }, 
+        {
+            "input": "&lparlt", 
+            "description": "Bad named entity: lparlt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lparlt"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lparlt;", 
+            "description": "Named entity: lparlt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2993"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lrarr", 
+            "description": "Bad named entity: lrarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lrarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lrarr;", 
+            "description": "Named entity: lrarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lrcorner", 
+            "description": "Bad named entity: lrcorner without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lrcorner"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lrcorner;", 
+            "description": "Named entity: lrcorner; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u231f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lrhar", 
+            "description": "Bad named entity: lrhar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lrhar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lrhar;", 
+            "description": "Named entity: lrhar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21cb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lrhard", 
+            "description": "Bad named entity: lrhard without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lrhard"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lrhard;", 
+            "description": "Named entity: lrhard; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u296d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lrm", 
+            "description": "Bad named entity: lrm without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lrm"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lrm;", 
+            "description": "Named entity: lrm; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lrtri", 
+            "description": "Bad named entity: lrtri without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lrtri"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lrtri;", 
+            "description": "Named entity: lrtri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22bf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsaquo", 
+            "description": "Bad named entity: lsaquo without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lsaquo"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsaquo;", 
+            "description": "Named entity: lsaquo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2039"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lscr", 
+            "description": "Bad named entity: lscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lscr;", 
+            "description": "Named entity: lscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcc1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsh", 
+            "description": "Bad named entity: lsh without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lsh"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsh;", 
+            "description": "Named entity: lsh; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsim", 
+            "description": "Bad named entity: lsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsim;", 
+            "description": "Named entity: lsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2272"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsime", 
+            "description": "Bad named entity: lsime without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lsime"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsime;", 
+            "description": "Named entity: lsime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a8d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsimg", 
+            "description": "Bad named entity: lsimg without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lsimg"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsimg;", 
+            "description": "Named entity: lsimg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a8f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsqb", 
+            "description": "Bad named entity: lsqb without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lsqb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsqb;", 
+            "description": "Named entity: lsqb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "["
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsquo", 
+            "description": "Bad named entity: lsquo without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lsquo"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsquo;", 
+            "description": "Named entity: lsquo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2018"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsquor", 
+            "description": "Bad named entity: lsquor without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lsquor"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsquor;", 
+            "description": "Named entity: lsquor; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u201a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lstrok", 
+            "description": "Bad named entity: lstrok without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lstrok"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lstrok;", 
+            "description": "Named entity: lstrok; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0142"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lt", 
+            "description": "Named entity: lt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "<"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lt;", 
+            "description": "Named entity: lt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "<"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ltcc;", 
+            "description": "Named entity: ltcc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ltcir;", 
+            "description": "Named entity: ltcir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a79"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ltdot;", 
+            "description": "Named entity: ltdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lthree;", 
+            "description": "Named entity: lthree; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22cb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ltimes;", 
+            "description": "Named entity: ltimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ltlarr;", 
+            "description": "Named entity: ltlarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2976"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ltquest;", 
+            "description": "Named entity: ltquest; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ltrPar;", 
+            "description": "Named entity: ltrPar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2996"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ltri;", 
+            "description": "Named entity: ltri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ltrie;", 
+            "description": "Named entity: ltrie; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ltrif;", 
+            "description": "Named entity: ltrif; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lurdshar", 
+            "description": "Bad named entity: lurdshar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lurdshar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lurdshar;", 
+            "description": "Named entity: lurdshar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u294a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&luruhar", 
+            "description": "Bad named entity: luruhar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&luruhar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&luruhar;", 
+            "description": "Named entity: luruhar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2966"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lvertneqq", 
+            "description": "Bad named entity: lvertneqq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lvertneqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lvertneqq;", 
+            "description": "Named entity: lvertneqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2268\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lvnE", 
+            "description": "Bad named entity: lvnE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&lvnE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lvnE;", 
+            "description": "Named entity: lvnE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2268\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mDDot", 
+            "description": "Bad named entity: mDDot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&mDDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mDDot;", 
+            "description": "Named entity: mDDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&macr", 
+            "description": "Named entity: macr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00af"
+                ]
+            ]
+        }, 
+        {
+            "input": "&macr;", 
+            "description": "Named entity: macr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00af"
+                ]
+            ]
+        }, 
+        {
+            "input": "&male", 
+            "description": "Bad named entity: male without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&male"
+                ]
+            ]
+        }, 
+        {
+            "input": "&male;", 
+            "description": "Named entity: male; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2642"
+                ]
+            ]
+        }, 
+        {
+            "input": "&malt", 
+            "description": "Bad named entity: malt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&malt"
+                ]
+            ]
+        }, 
+        {
+            "input": "&malt;", 
+            "description": "Named entity: malt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2720"
+                ]
+            ]
+        }, 
+        {
+            "input": "&maltese", 
+            "description": "Bad named entity: maltese without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&maltese"
+                ]
+            ]
+        }, 
+        {
+            "input": "&maltese;", 
+            "description": "Named entity: maltese; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2720"
+                ]
+            ]
+        }, 
+        {
+            "input": "&map", 
+            "description": "Bad named entity: map without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&map"
+                ]
+            ]
+        }, 
+        {
+            "input": "&map;", 
+            "description": "Named entity: map; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mapsto", 
+            "description": "Bad named entity: mapsto without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&mapsto"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mapsto;", 
+            "description": "Named entity: mapsto; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mapstodown", 
+            "description": "Bad named entity: mapstodown without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&mapstodown"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mapstodown;", 
+            "description": "Named entity: mapstodown; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mapstoleft", 
+            "description": "Bad named entity: mapstoleft without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&mapstoleft"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mapstoleft;", 
+            "description": "Named entity: mapstoleft; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mapstoup", 
+            "description": "Bad named entity: mapstoup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&mapstoup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mapstoup;", 
+            "description": "Named entity: mapstoup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&marker", 
+            "description": "Bad named entity: marker without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&marker"
+                ]
+            ]
+        }, 
+        {
+            "input": "&marker;", 
+            "description": "Named entity: marker; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25ae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mcomma", 
+            "description": "Bad named entity: mcomma without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&mcomma"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mcomma;", 
+            "description": "Named entity: mcomma; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a29"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mcy", 
+            "description": "Bad named entity: mcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&mcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mcy;", 
+            "description": "Named entity: mcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u043c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mdash", 
+            "description": "Bad named entity: mdash without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&mdash"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mdash;", 
+            "description": "Named entity: mdash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2014"
+                ]
+            ]
+        }, 
+        {
+            "input": "&measuredangle", 
+            "description": "Bad named entity: measuredangle without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&measuredangle"
+                ]
+            ]
+        }, 
+        {
+            "input": "&measuredangle;", 
+            "description": "Named entity: measuredangle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2221"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mfr", 
+            "description": "Bad named entity: mfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&mfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mfr;", 
+            "description": "Named entity: mfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd2a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mho", 
+            "description": "Bad named entity: mho without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&mho"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mho;", 
+            "description": "Named entity: mho; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2127"
+                ]
+            ]
+        }, 
+        {
+            "input": "&micro", 
+            "description": "Named entity: micro without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&micro;", 
+            "description": "Named entity: micro; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mid", 
+            "description": "Bad named entity: mid without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&mid"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mid;", 
+            "description": "Named entity: mid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2223"
+                ]
+            ]
+        }, 
+        {
+            "input": "&midast", 
+            "description": "Bad named entity: midast without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&midast"
+                ]
+            ]
+        }, 
+        {
+            "input": "&midast;", 
+            "description": "Named entity: midast; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "*"
+                ]
+            ]
+        }, 
+        {
+            "input": "&midcir", 
+            "description": "Bad named entity: midcir without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&midcir"
+                ]
+            ]
+        }, 
+        {
+            "input": "&midcir;", 
+            "description": "Named entity: midcir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2af0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&middot", 
+            "description": "Named entity: middot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00b7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&middot;", 
+            "description": "Named entity: middot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&minus", 
+            "description": "Bad named entity: minus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&minus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&minus;", 
+            "description": "Named entity: minus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2212"
+                ]
+            ]
+        }, 
+        {
+            "input": "&minusb", 
+            "description": "Bad named entity: minusb without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&minusb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&minusb;", 
+            "description": "Named entity: minusb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u229f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&minusd", 
+            "description": "Bad named entity: minusd without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&minusd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&minusd;", 
+            "description": "Named entity: minusd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2238"
+                ]
+            ]
+        }, 
+        {
+            "input": "&minusdu", 
+            "description": "Bad named entity: minusdu without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&minusdu"
+                ]
+            ]
+        }, 
+        {
+            "input": "&minusdu;", 
+            "description": "Named entity: minusdu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a2a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mlcp", 
+            "description": "Bad named entity: mlcp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&mlcp"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mlcp;", 
+            "description": "Named entity: mlcp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2adb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mldr", 
+            "description": "Bad named entity: mldr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&mldr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mldr;", 
+            "description": "Named entity: mldr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2026"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mnplus", 
+            "description": "Bad named entity: mnplus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&mnplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mnplus;", 
+            "description": "Named entity: mnplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2213"
+                ]
+            ]
+        }, 
+        {
+            "input": "&models", 
+            "description": "Bad named entity: models without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&models"
+                ]
+            ]
+        }, 
+        {
+            "input": "&models;", 
+            "description": "Named entity: models; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mopf", 
+            "description": "Bad named entity: mopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&mopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mopf;", 
+            "description": "Named entity: mopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd5e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mp", 
+            "description": "Bad named entity: mp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&mp"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mp;", 
+            "description": "Named entity: mp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2213"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mscr", 
+            "description": "Bad named entity: mscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&mscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mscr;", 
+            "description": "Named entity: mscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcc2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mstpos", 
+            "description": "Bad named entity: mstpos without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&mstpos"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mstpos;", 
+            "description": "Named entity: mstpos; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mu", 
+            "description": "Bad named entity: mu without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&mu"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mu;", 
+            "description": "Named entity: mu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03bc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&multimap", 
+            "description": "Bad named entity: multimap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&multimap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&multimap;", 
+            "description": "Named entity: multimap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mumap", 
+            "description": "Bad named entity: mumap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&mumap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mumap;", 
+            "description": "Named entity: mumap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nGg", 
+            "description": "Bad named entity: nGg without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nGg"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nGg;", 
+            "description": "Named entity: nGg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d9\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nGt", 
+            "description": "Bad named entity: nGt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nGt"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nGt;", 
+            "description": "Named entity: nGt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226b\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nGtv", 
+            "description": "Bad named entity: nGtv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nGtv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nGtv;", 
+            "description": "Named entity: nGtv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226b\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nLeftarrow", 
+            "description": "Bad named entity: nLeftarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nLeftarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nLeftarrow;", 
+            "description": "Named entity: nLeftarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21cd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nLeftrightarrow", 
+            "description": "Bad named entity: nLeftrightarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nLeftrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nLeftrightarrow;", 
+            "description": "Named entity: nLeftrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ce"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nLl", 
+            "description": "Bad named entity: nLl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nLl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nLl;", 
+            "description": "Named entity: nLl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d8\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nLt", 
+            "description": "Bad named entity: nLt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nLt"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nLt;", 
+            "description": "Named entity: nLt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226a\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nLtv", 
+            "description": "Bad named entity: nLtv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nLtv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nLtv;", 
+            "description": "Named entity: nLtv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226a\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nRightarrow", 
+            "description": "Bad named entity: nRightarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nRightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nRightarrow;", 
+            "description": "Named entity: nRightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21cf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nVDash", 
+            "description": "Bad named entity: nVDash without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nVDash"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nVDash;", 
+            "description": "Named entity: nVDash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22af"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nVdash", 
+            "description": "Bad named entity: nVdash without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nVdash"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nVdash;", 
+            "description": "Named entity: nVdash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nabla", 
+            "description": "Bad named entity: nabla without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nabla"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nabla;", 
+            "description": "Named entity: nabla; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2207"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nacute", 
+            "description": "Bad named entity: nacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nacute;", 
+            "description": "Named entity: nacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0144"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nang", 
+            "description": "Bad named entity: nang without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nang"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nang;", 
+            "description": "Named entity: nang; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2220\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nap", 
+            "description": "Bad named entity: nap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nap;", 
+            "description": "Named entity: nap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2249"
+                ]
+            ]
+        }, 
+        {
+            "input": "&napE", 
+            "description": "Bad named entity: napE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&napE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&napE;", 
+            "description": "Named entity: napE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a70\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&napid", 
+            "description": "Bad named entity: napid without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&napid"
+                ]
+            ]
+        }, 
+        {
+            "input": "&napid;", 
+            "description": "Named entity: napid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224b\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&napos", 
+            "description": "Bad named entity: napos without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&napos"
+                ]
+            ]
+        }, 
+        {
+            "input": "&napos;", 
+            "description": "Named entity: napos; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0149"
+                ]
+            ]
+        }, 
+        {
+            "input": "&napprox", 
+            "description": "Bad named entity: napprox without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&napprox"
+                ]
+            ]
+        }, 
+        {
+            "input": "&napprox;", 
+            "description": "Named entity: napprox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2249"
+                ]
+            ]
+        }, 
+        {
+            "input": "&natur", 
+            "description": "Bad named entity: natur without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&natur"
+                ]
+            ]
+        }, 
+        {
+            "input": "&natur;", 
+            "description": "Named entity: natur; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u266e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&natural", 
+            "description": "Bad named entity: natural without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&natural"
+                ]
+            ]
+        }, 
+        {
+            "input": "&natural;", 
+            "description": "Named entity: natural; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u266e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&naturals", 
+            "description": "Bad named entity: naturals without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&naturals"
+                ]
+            ]
+        }, 
+        {
+            "input": "&naturals;", 
+            "description": "Named entity: naturals; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2115"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nbsp", 
+            "description": "Named entity: nbsp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nbsp;", 
+            "description": "Named entity: nbsp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nbump", 
+            "description": "Bad named entity: nbump without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nbump"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nbump;", 
+            "description": "Named entity: nbump; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224e\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nbumpe", 
+            "description": "Bad named entity: nbumpe without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nbumpe"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nbumpe;", 
+            "description": "Named entity: nbumpe; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224f\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncap", 
+            "description": "Bad named entity: ncap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ncap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncap;", 
+            "description": "Named entity: ncap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a43"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncaron", 
+            "description": "Bad named entity: ncaron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ncaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncaron;", 
+            "description": "Named entity: ncaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0148"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncedil", 
+            "description": "Bad named entity: ncedil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ncedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncedil;", 
+            "description": "Named entity: ncedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0146"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncong", 
+            "description": "Bad named entity: ncong without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ncong"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncong;", 
+            "description": "Named entity: ncong; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2247"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncongdot", 
+            "description": "Bad named entity: ncongdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ncongdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncongdot;", 
+            "description": "Named entity: ncongdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a6d\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncup", 
+            "description": "Bad named entity: ncup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ncup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncup;", 
+            "description": "Named entity: ncup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a42"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncy", 
+            "description": "Bad named entity: ncy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ncy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncy;", 
+            "description": "Named entity: ncy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u043d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ndash", 
+            "description": "Bad named entity: ndash without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ndash"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ndash;", 
+            "description": "Named entity: ndash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2013"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ne", 
+            "description": "Bad named entity: ne without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ne"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ne;", 
+            "description": "Named entity: ne; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2260"
+                ]
+            ]
+        }, 
+        {
+            "input": "&neArr", 
+            "description": "Bad named entity: neArr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&neArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&neArr;", 
+            "description": "Named entity: neArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nearhk", 
+            "description": "Bad named entity: nearhk without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nearhk"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nearhk;", 
+            "description": "Named entity: nearhk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2924"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nearr", 
+            "description": "Bad named entity: nearr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nearr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nearr;", 
+            "description": "Named entity: nearr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2197"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nearrow", 
+            "description": "Bad named entity: nearrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nearrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nearrow;", 
+            "description": "Named entity: nearrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2197"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nedot", 
+            "description": "Bad named entity: nedot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nedot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nedot;", 
+            "description": "Named entity: nedot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2250\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nequiv", 
+            "description": "Bad named entity: nequiv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nequiv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nequiv;", 
+            "description": "Named entity: nequiv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2262"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nesear", 
+            "description": "Bad named entity: nesear without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nesear"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nesear;", 
+            "description": "Named entity: nesear; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2928"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nesim", 
+            "description": "Bad named entity: nesim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nesim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nesim;", 
+            "description": "Named entity: nesim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2242\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nexist", 
+            "description": "Bad named entity: nexist without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nexist"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nexist;", 
+            "description": "Named entity: nexist; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2204"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nexists", 
+            "description": "Bad named entity: nexists without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nexists"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nexists;", 
+            "description": "Named entity: nexists; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2204"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nfr", 
+            "description": "Bad named entity: nfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nfr;", 
+            "description": "Named entity: nfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd2b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngE", 
+            "description": "Bad named entity: ngE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ngE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngE;", 
+            "description": "Named entity: ngE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2267\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nge", 
+            "description": "Bad named entity: nge without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nge"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nge;", 
+            "description": "Named entity: nge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2271"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngeq", 
+            "description": "Bad named entity: ngeq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ngeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngeq;", 
+            "description": "Named entity: ngeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2271"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngeqq", 
+            "description": "Bad named entity: ngeqq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ngeqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngeqq;", 
+            "description": "Named entity: ngeqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2267\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngeqslant", 
+            "description": "Bad named entity: ngeqslant without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ngeqslant"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngeqslant;", 
+            "description": "Named entity: ngeqslant; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7e\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nges", 
+            "description": "Bad named entity: nges without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nges"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nges;", 
+            "description": "Named entity: nges; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7e\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngsim", 
+            "description": "Bad named entity: ngsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ngsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngsim;", 
+            "description": "Named entity: ngsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2275"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngt", 
+            "description": "Bad named entity: ngt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ngt"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngt;", 
+            "description": "Named entity: ngt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngtr", 
+            "description": "Bad named entity: ngtr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ngtr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngtr;", 
+            "description": "Named entity: ngtr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nhArr", 
+            "description": "Bad named entity: nhArr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nhArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nhArr;", 
+            "description": "Named entity: nhArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ce"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nharr", 
+            "description": "Bad named entity: nharr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nharr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nharr;", 
+            "description": "Named entity: nharr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nhpar", 
+            "description": "Bad named entity: nhpar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nhpar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nhpar;", 
+            "description": "Named entity: nhpar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2af2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ni", 
+            "description": "Bad named entity: ni without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ni"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ni;", 
+            "description": "Named entity: ni; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u220b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nis", 
+            "description": "Bad named entity: nis without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nis"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nis;", 
+            "description": "Named entity: nis; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22fc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nisd", 
+            "description": "Bad named entity: nisd without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nisd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nisd;", 
+            "description": "Named entity: nisd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22fa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&niv", 
+            "description": "Bad named entity: niv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&niv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&niv;", 
+            "description": "Named entity: niv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u220b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&njcy", 
+            "description": "Bad named entity: njcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&njcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&njcy;", 
+            "description": "Named entity: njcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u045a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nlArr", 
+            "description": "Bad named entity: nlArr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nlArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nlArr;", 
+            "description": "Named entity: nlArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21cd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nlE", 
+            "description": "Bad named entity: nlE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nlE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nlE;", 
+            "description": "Named entity: nlE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2266\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nlarr", 
+            "description": "Bad named entity: nlarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nlarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nlarr;", 
+            "description": "Named entity: nlarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u219a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nldr", 
+            "description": "Bad named entity: nldr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nldr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nldr;", 
+            "description": "Named entity: nldr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2025"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nle", 
+            "description": "Bad named entity: nle without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nle"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nle;", 
+            "description": "Named entity: nle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2270"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nleftarrow", 
+            "description": "Bad named entity: nleftarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nleftarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nleftarrow;", 
+            "description": "Named entity: nleftarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u219a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nleftrightarrow", 
+            "description": "Bad named entity: nleftrightarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nleftrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nleftrightarrow;", 
+            "description": "Named entity: nleftrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nleq", 
+            "description": "Bad named entity: nleq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nleq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nleq;", 
+            "description": "Named entity: nleq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2270"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nleqq", 
+            "description": "Bad named entity: nleqq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nleqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nleqq;", 
+            "description": "Named entity: nleqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2266\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nleqslant", 
+            "description": "Bad named entity: nleqslant without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nleqslant"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nleqslant;", 
+            "description": "Named entity: nleqslant; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7d\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nles", 
+            "description": "Bad named entity: nles without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nles"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nles;", 
+            "description": "Named entity: nles; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7d\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nless", 
+            "description": "Bad named entity: nless without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nless"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nless;", 
+            "description": "Named entity: nless; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nlsim", 
+            "description": "Bad named entity: nlsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nlsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nlsim;", 
+            "description": "Named entity: nlsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2274"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nlt", 
+            "description": "Bad named entity: nlt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nlt"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nlt;", 
+            "description": "Named entity: nlt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nltri", 
+            "description": "Bad named entity: nltri without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nltri"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nltri;", 
+            "description": "Named entity: nltri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ea"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nltrie", 
+            "description": "Bad named entity: nltrie without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nltrie"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nltrie;", 
+            "description": "Named entity: nltrie; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ec"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nmid", 
+            "description": "Bad named entity: nmid without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nmid"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nmid;", 
+            "description": "Named entity: nmid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2224"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nopf", 
+            "description": "Bad named entity: nopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nopf;", 
+            "description": "Named entity: nopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd5f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&not", 
+            "description": "Named entity: not without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&not;", 
+            "description": "Named entity: not; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&notin;", 
+            "description": "Named entity: notin; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2209"
+                ]
+            ]
+        }, 
+        {
+            "input": "&notinE;", 
+            "description": "Named entity: notinE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f9\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&notindot;", 
+            "description": "Named entity: notindot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f5\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&notinva;", 
+            "description": "Named entity: notinva; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2209"
+                ]
+            ]
+        }, 
+        {
+            "input": "&notinvb;", 
+            "description": "Named entity: notinvb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&notinvc;", 
+            "description": "Named entity: notinvc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&notni;", 
+            "description": "Named entity: notni; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u220c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&notniva;", 
+            "description": "Named entity: notniva; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u220c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&notnivb;", 
+            "description": "Named entity: notnivb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22fe"
+                ]
+            ]
+        }, 
+        {
+            "input": "&notnivc;", 
+            "description": "Named entity: notnivc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22fd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&npar", 
+            "description": "Bad named entity: npar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&npar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&npar;", 
+            "description": "Named entity: npar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2226"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nparallel", 
+            "description": "Bad named entity: nparallel without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nparallel"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nparallel;", 
+            "description": "Named entity: nparallel; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2226"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nparsl", 
+            "description": "Bad named entity: nparsl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nparsl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nparsl;", 
+            "description": "Named entity: nparsl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2afd\u20e5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&npart", 
+            "description": "Bad named entity: npart without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&npart"
+                ]
+            ]
+        }, 
+        {
+            "input": "&npart;", 
+            "description": "Named entity: npart; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2202\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&npolint", 
+            "description": "Bad named entity: npolint without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&npolint"
+                ]
+            ]
+        }, 
+        {
+            "input": "&npolint;", 
+            "description": "Named entity: npolint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a14"
+                ]
+            ]
+        }, 
+        {
+            "input": "&npr", 
+            "description": "Bad named entity: npr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&npr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&npr;", 
+            "description": "Named entity: npr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2280"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nprcue", 
+            "description": "Bad named entity: nprcue without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nprcue"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nprcue;", 
+            "description": "Named entity: nprcue; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&npre", 
+            "description": "Bad named entity: npre without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&npre"
+                ]
+            ]
+        }, 
+        {
+            "input": "&npre;", 
+            "description": "Named entity: npre; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aaf\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nprec", 
+            "description": "Bad named entity: nprec without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nprec"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nprec;", 
+            "description": "Named entity: nprec; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2280"
+                ]
+            ]
+        }, 
+        {
+            "input": "&npreceq", 
+            "description": "Bad named entity: npreceq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&npreceq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&npreceq;", 
+            "description": "Named entity: npreceq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aaf\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrArr", 
+            "description": "Bad named entity: nrArr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nrArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrArr;", 
+            "description": "Named entity: nrArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21cf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrarr", 
+            "description": "Bad named entity: nrarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nrarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrarr;", 
+            "description": "Named entity: nrarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u219b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrarrc", 
+            "description": "Bad named entity: nrarrc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nrarrc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrarrc;", 
+            "description": "Named entity: nrarrc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2933\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrarrw", 
+            "description": "Bad named entity: nrarrw without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nrarrw"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrarrw;", 
+            "description": "Named entity: nrarrw; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u219d\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrightarrow", 
+            "description": "Bad named entity: nrightarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrightarrow;", 
+            "description": "Named entity: nrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u219b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrtri", 
+            "description": "Bad named entity: nrtri without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nrtri"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrtri;", 
+            "description": "Named entity: nrtri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22eb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrtrie", 
+            "description": "Bad named entity: nrtrie without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nrtrie"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrtrie;", 
+            "description": "Named entity: nrtrie; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ed"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsc", 
+            "description": "Bad named entity: nsc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsc;", 
+            "description": "Named entity: nsc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2281"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsccue", 
+            "description": "Bad named entity: nsccue without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsccue"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsccue;", 
+            "description": "Named entity: nsccue; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsce", 
+            "description": "Bad named entity: nsce without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsce"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsce;", 
+            "description": "Named entity: nsce; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab0\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nscr", 
+            "description": "Bad named entity: nscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nscr;", 
+            "description": "Named entity: nscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcc3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nshortmid", 
+            "description": "Bad named entity: nshortmid without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nshortmid"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nshortmid;", 
+            "description": "Named entity: nshortmid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2224"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nshortparallel", 
+            "description": "Bad named entity: nshortparallel without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nshortparallel"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nshortparallel;", 
+            "description": "Named entity: nshortparallel; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2226"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsim", 
+            "description": "Bad named entity: nsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsim;", 
+            "description": "Named entity: nsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2241"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsime", 
+            "description": "Bad named entity: nsime without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsime"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsime;", 
+            "description": "Named entity: nsime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2244"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsimeq", 
+            "description": "Bad named entity: nsimeq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsimeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsimeq;", 
+            "description": "Named entity: nsimeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2244"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsmid", 
+            "description": "Bad named entity: nsmid without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsmid"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsmid;", 
+            "description": "Named entity: nsmid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2224"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nspar", 
+            "description": "Bad named entity: nspar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nspar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nspar;", 
+            "description": "Named entity: nspar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2226"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsqsube", 
+            "description": "Bad named entity: nsqsube without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsqsube"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsqsube;", 
+            "description": "Named entity: nsqsube; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsqsupe", 
+            "description": "Bad named entity: nsqsupe without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsqsupe"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsqsupe;", 
+            "description": "Named entity: nsqsupe; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsub", 
+            "description": "Bad named entity: nsub without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsub"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsub;", 
+            "description": "Named entity: nsub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2284"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsubE", 
+            "description": "Bad named entity: nsubE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsubE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsubE;", 
+            "description": "Named entity: nsubE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac5\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsube", 
+            "description": "Bad named entity: nsube without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsube"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsube;", 
+            "description": "Named entity: nsube; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2288"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsubset", 
+            "description": "Bad named entity: nsubset without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsubset"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsubset;", 
+            "description": "Named entity: nsubset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2282\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsubseteq", 
+            "description": "Bad named entity: nsubseteq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsubseteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsubseteq;", 
+            "description": "Named entity: nsubseteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2288"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsubseteqq", 
+            "description": "Bad named entity: nsubseteqq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsubseteqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsubseteqq;", 
+            "description": "Named entity: nsubseteqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac5\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsucc", 
+            "description": "Bad named entity: nsucc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsucc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsucc;", 
+            "description": "Named entity: nsucc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2281"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsucceq", 
+            "description": "Bad named entity: nsucceq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsucceq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsucceq;", 
+            "description": "Named entity: nsucceq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab0\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsup", 
+            "description": "Bad named entity: nsup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsup;", 
+            "description": "Named entity: nsup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2285"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsupE", 
+            "description": "Bad named entity: nsupE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsupE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsupE;", 
+            "description": "Named entity: nsupE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac6\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsupe", 
+            "description": "Bad named entity: nsupe without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsupe"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsupe;", 
+            "description": "Named entity: nsupe; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2289"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsupset", 
+            "description": "Bad named entity: nsupset without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsupset"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsupset;", 
+            "description": "Named entity: nsupset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2283\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsupseteq", 
+            "description": "Bad named entity: nsupseteq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsupseteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsupseteq;", 
+            "description": "Named entity: nsupseteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2289"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsupseteqq", 
+            "description": "Bad named entity: nsupseteqq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nsupseteqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsupseteqq;", 
+            "description": "Named entity: nsupseteqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac6\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ntgl", 
+            "description": "Bad named entity: ntgl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ntgl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ntgl;", 
+            "description": "Named entity: ntgl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2279"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ntilde", 
+            "description": "Named entity: ntilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00f1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ntilde;", 
+            "description": "Named entity: ntilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ntlg", 
+            "description": "Bad named entity: ntlg without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ntlg"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ntlg;", 
+            "description": "Named entity: ntlg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2278"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ntriangleleft", 
+            "description": "Bad named entity: ntriangleleft without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ntriangleleft"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ntriangleleft;", 
+            "description": "Named entity: ntriangleleft; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ea"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ntrianglelefteq", 
+            "description": "Bad named entity: ntrianglelefteq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ntrianglelefteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ntrianglelefteq;", 
+            "description": "Named entity: ntrianglelefteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ec"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ntriangleright", 
+            "description": "Bad named entity: ntriangleright without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ntriangleright"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ntriangleright;", 
+            "description": "Named entity: ntriangleright; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22eb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ntrianglerighteq", 
+            "description": "Bad named entity: ntrianglerighteq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ntrianglerighteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ntrianglerighteq;", 
+            "description": "Named entity: ntrianglerighteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ed"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nu", 
+            "description": "Bad named entity: nu without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nu"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nu;", 
+            "description": "Named entity: nu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03bd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&num", 
+            "description": "Bad named entity: num without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&num"
+                ]
+            ]
+        }, 
+        {
+            "input": "&num;", 
+            "description": "Named entity: num; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "#"
+                ]
+            ]
+        }, 
+        {
+            "input": "&numero", 
+            "description": "Bad named entity: numero without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&numero"
+                ]
+            ]
+        }, 
+        {
+            "input": "&numero;", 
+            "description": "Named entity: numero; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2116"
+                ]
+            ]
+        }, 
+        {
+            "input": "&numsp", 
+            "description": "Bad named entity: numsp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&numsp"
+                ]
+            ]
+        }, 
+        {
+            "input": "&numsp;", 
+            "description": "Named entity: numsp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2007"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvDash", 
+            "description": "Bad named entity: nvDash without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nvDash"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvDash;", 
+            "description": "Named entity: nvDash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ad"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvHarr", 
+            "description": "Bad named entity: nvHarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nvHarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvHarr;", 
+            "description": "Named entity: nvHarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2904"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvap", 
+            "description": "Bad named entity: nvap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nvap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvap;", 
+            "description": "Named entity: nvap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224d\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvdash", 
+            "description": "Bad named entity: nvdash without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nvdash"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvdash;", 
+            "description": "Named entity: nvdash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvge", 
+            "description": "Bad named entity: nvge without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nvge"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvge;", 
+            "description": "Named entity: nvge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2265\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvgt", 
+            "description": "Bad named entity: nvgt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nvgt"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvgt;", 
+            "description": "Named entity: nvgt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    ">\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvinfin", 
+            "description": "Bad named entity: nvinfin without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nvinfin"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvinfin;", 
+            "description": "Named entity: nvinfin; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29de"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvlArr", 
+            "description": "Bad named entity: nvlArr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nvlArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvlArr;", 
+            "description": "Named entity: nvlArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2902"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvle", 
+            "description": "Bad named entity: nvle without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nvle"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvle;", 
+            "description": "Named entity: nvle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2264\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvlt", 
+            "description": "Bad named entity: nvlt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nvlt"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvlt;", 
+            "description": "Named entity: nvlt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "<\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvltrie", 
+            "description": "Bad named entity: nvltrie without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nvltrie"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvltrie;", 
+            "description": "Named entity: nvltrie; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b4\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvrArr", 
+            "description": "Bad named entity: nvrArr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nvrArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvrArr;", 
+            "description": "Named entity: nvrArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2903"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvrtrie", 
+            "description": "Bad named entity: nvrtrie without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nvrtrie"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvrtrie;", 
+            "description": "Named entity: nvrtrie; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b5\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvsim", 
+            "description": "Bad named entity: nvsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nvsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvsim;", 
+            "description": "Named entity: nvsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223c\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nwArr", 
+            "description": "Bad named entity: nwArr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nwArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nwArr;", 
+            "description": "Named entity: nwArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nwarhk", 
+            "description": "Bad named entity: nwarhk without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nwarhk"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nwarhk;", 
+            "description": "Named entity: nwarhk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2923"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nwarr", 
+            "description": "Bad named entity: nwarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nwarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nwarr;", 
+            "description": "Named entity: nwarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2196"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nwarrow", 
+            "description": "Bad named entity: nwarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nwarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nwarrow;", 
+            "description": "Named entity: nwarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2196"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nwnear", 
+            "description": "Bad named entity: nwnear without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&nwnear"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nwnear;", 
+            "description": "Named entity: nwnear; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2927"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oS", 
+            "description": "Bad named entity: oS without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&oS"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oS;", 
+            "description": "Named entity: oS; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u24c8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oacute", 
+            "description": "Named entity: oacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00f3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oacute;", 
+            "description": "Named entity: oacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oast", 
+            "description": "Bad named entity: oast without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&oast"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oast;", 
+            "description": "Named entity: oast; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u229b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ocir", 
+            "description": "Bad named entity: ocir without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ocir"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ocir;", 
+            "description": "Named entity: ocir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u229a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ocirc", 
+            "description": "Named entity: ocirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00f4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ocirc;", 
+            "description": "Named entity: ocirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ocy", 
+            "description": "Bad named entity: ocy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ocy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ocy;", 
+            "description": "Named entity: ocy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u043e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&odash", 
+            "description": "Bad named entity: odash without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&odash"
+                ]
+            ]
+        }, 
+        {
+            "input": "&odash;", 
+            "description": "Named entity: odash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u229d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&odblac", 
+            "description": "Bad named entity: odblac without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&odblac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&odblac;", 
+            "description": "Named entity: odblac; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0151"
+                ]
+            ]
+        }, 
+        {
+            "input": "&odiv", 
+            "description": "Bad named entity: odiv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&odiv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&odiv;", 
+            "description": "Named entity: odiv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a38"
+                ]
+            ]
+        }, 
+        {
+            "input": "&odot", 
+            "description": "Bad named entity: odot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&odot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&odot;", 
+            "description": "Named entity: odot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2299"
+                ]
+            ]
+        }, 
+        {
+            "input": "&odsold", 
+            "description": "Bad named entity: odsold without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&odsold"
+                ]
+            ]
+        }, 
+        {
+            "input": "&odsold;", 
+            "description": "Named entity: odsold; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29bc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oelig", 
+            "description": "Bad named entity: oelig without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&oelig"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oelig;", 
+            "description": "Named entity: oelig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0153"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ofcir", 
+            "description": "Bad named entity: ofcir without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ofcir"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ofcir;", 
+            "description": "Named entity: ofcir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29bf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ofr", 
+            "description": "Bad named entity: ofr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ofr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ofr;", 
+            "description": "Named entity: ofr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd2c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ogon", 
+            "description": "Bad named entity: ogon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ogon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ogon;", 
+            "description": "Named entity: ogon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02db"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ograve", 
+            "description": "Named entity: ograve without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00f2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ograve;", 
+            "description": "Named entity: ograve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ogt", 
+            "description": "Bad named entity: ogt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ogt"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ogt;", 
+            "description": "Named entity: ogt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29c1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ohbar", 
+            "description": "Bad named entity: ohbar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ohbar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ohbar;", 
+            "description": "Named entity: ohbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ohm", 
+            "description": "Bad named entity: ohm without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ohm"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ohm;", 
+            "description": "Named entity: ohm; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03a9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oint", 
+            "description": "Bad named entity: oint without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&oint"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oint;", 
+            "description": "Named entity: oint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&olarr", 
+            "description": "Bad named entity: olarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&olarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&olarr;", 
+            "description": "Named entity: olarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ba"
+                ]
+            ]
+        }, 
+        {
+            "input": "&olcir", 
+            "description": "Bad named entity: olcir without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&olcir"
+                ]
+            ]
+        }, 
+        {
+            "input": "&olcir;", 
+            "description": "Named entity: olcir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29be"
+                ]
+            ]
+        }, 
+        {
+            "input": "&olcross", 
+            "description": "Bad named entity: olcross without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&olcross"
+                ]
+            ]
+        }, 
+        {
+            "input": "&olcross;", 
+            "description": "Named entity: olcross; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29bb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oline", 
+            "description": "Bad named entity: oline without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&oline"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oline;", 
+            "description": "Named entity: oline; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u203e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&olt", 
+            "description": "Bad named entity: olt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&olt"
+                ]
+            ]
+        }, 
+        {
+            "input": "&olt;", 
+            "description": "Named entity: olt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29c0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&omacr", 
+            "description": "Bad named entity: omacr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&omacr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&omacr;", 
+            "description": "Named entity: omacr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u014d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&omega", 
+            "description": "Bad named entity: omega without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&omega"
+                ]
+            ]
+        }, 
+        {
+            "input": "&omega;", 
+            "description": "Named entity: omega; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&omicron", 
+            "description": "Bad named entity: omicron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&omicron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&omicron;", 
+            "description": "Named entity: omicron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03bf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&omid", 
+            "description": "Bad named entity: omid without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&omid"
+                ]
+            ]
+        }, 
+        {
+            "input": "&omid;", 
+            "description": "Named entity: omid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29b6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ominus", 
+            "description": "Bad named entity: ominus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ominus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ominus;", 
+            "description": "Named entity: ominus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2296"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oopf", 
+            "description": "Bad named entity: oopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&oopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oopf;", 
+            "description": "Named entity: oopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd60"
+                ]
+            ]
+        }, 
+        {
+            "input": "&opar", 
+            "description": "Bad named entity: opar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&opar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&opar;", 
+            "description": "Named entity: opar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29b7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&operp", 
+            "description": "Bad named entity: operp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&operp"
+                ]
+            ]
+        }, 
+        {
+            "input": "&operp;", 
+            "description": "Named entity: operp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29b9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oplus", 
+            "description": "Bad named entity: oplus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&oplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oplus;", 
+            "description": "Named entity: oplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2295"
+                ]
+            ]
+        }, 
+        {
+            "input": "&or", 
+            "description": "Bad named entity: or without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&or"
+                ]
+            ]
+        }, 
+        {
+            "input": "&or;", 
+            "description": "Named entity: or; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2228"
+                ]
+            ]
+        }, 
+        {
+            "input": "&orarr", 
+            "description": "Bad named entity: orarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&orarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&orarr;", 
+            "description": "Named entity: orarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ord", 
+            "description": "Bad named entity: ord without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ord"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ord;", 
+            "description": "Named entity: ord; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a5d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&order", 
+            "description": "Bad named entity: order without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&order"
+                ]
+            ]
+        }, 
+        {
+            "input": "&order;", 
+            "description": "Named entity: order; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2134"
+                ]
+            ]
+        }, 
+        {
+            "input": "&orderof", 
+            "description": "Bad named entity: orderof without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&orderof"
+                ]
+            ]
+        }, 
+        {
+            "input": "&orderof;", 
+            "description": "Named entity: orderof; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2134"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ordf", 
+            "description": "Named entity: ordf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00aa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ordf;", 
+            "description": "Named entity: ordf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00aa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ordm", 
+            "description": "Named entity: ordm without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ba"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ordm;", 
+            "description": "Named entity: ordm; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ba"
+                ]
+            ]
+        }, 
+        {
+            "input": "&origof", 
+            "description": "Bad named entity: origof without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&origof"
+                ]
+            ]
+        }, 
+        {
+            "input": "&origof;", 
+            "description": "Named entity: origof; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oror", 
+            "description": "Bad named entity: oror without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&oror"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oror;", 
+            "description": "Named entity: oror; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a56"
+                ]
+            ]
+        }, 
+        {
+            "input": "&orslope", 
+            "description": "Bad named entity: orslope without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&orslope"
+                ]
+            ]
+        }, 
+        {
+            "input": "&orslope;", 
+            "description": "Named entity: orslope; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a57"
+                ]
+            ]
+        }, 
+        {
+            "input": "&orv", 
+            "description": "Bad named entity: orv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&orv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&orv;", 
+            "description": "Named entity: orv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a5b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oscr", 
+            "description": "Bad named entity: oscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&oscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oscr;", 
+            "description": "Named entity: oscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2134"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oslash", 
+            "description": "Named entity: oslash without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00f8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oslash;", 
+            "description": "Named entity: oslash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&osol", 
+            "description": "Bad named entity: osol without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&osol"
+                ]
+            ]
+        }, 
+        {
+            "input": "&osol;", 
+            "description": "Named entity: osol; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2298"
+                ]
+            ]
+        }, 
+        {
+            "input": "&otilde", 
+            "description": "Named entity: otilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&otilde;", 
+            "description": "Named entity: otilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&otimes", 
+            "description": "Bad named entity: otimes without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&otimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "&otimes;", 
+            "description": "Named entity: otimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2297"
+                ]
+            ]
+        }, 
+        {
+            "input": "&otimesas", 
+            "description": "Bad named entity: otimesas without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&otimesas"
+                ]
+            ]
+        }, 
+        {
+            "input": "&otimesas;", 
+            "description": "Named entity: otimesas; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a36"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ouml", 
+            "description": "Named entity: ouml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00f6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ouml;", 
+            "description": "Named entity: ouml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ovbar", 
+            "description": "Bad named entity: ovbar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ovbar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ovbar;", 
+            "description": "Named entity: ovbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u233d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&par", 
+            "description": "Bad named entity: par without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&par"
+                ]
+            ]
+        }, 
+        {
+            "input": "&par;", 
+            "description": "Named entity: par; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2225"
+                ]
+            ]
+        }, 
+        {
+            "input": "&para", 
+            "description": "Named entity: para without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00b6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&para;", 
+            "description": "Named entity: para; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&parallel;", 
+            "description": "Named entity: parallel; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2225"
+                ]
+            ]
+        }, 
+        {
+            "input": "&parsim", 
+            "description": "Bad named entity: parsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&parsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&parsim;", 
+            "description": "Named entity: parsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2af3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&parsl", 
+            "description": "Bad named entity: parsl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&parsl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&parsl;", 
+            "description": "Named entity: parsl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2afd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&part", 
+            "description": "Bad named entity: part without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&part"
+                ]
+            ]
+        }, 
+        {
+            "input": "&part;", 
+            "description": "Named entity: part; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2202"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pcy", 
+            "description": "Bad named entity: pcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&pcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pcy;", 
+            "description": "Named entity: pcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u043f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&percnt", 
+            "description": "Bad named entity: percnt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&percnt"
+                ]
+            ]
+        }, 
+        {
+            "input": "&percnt;", 
+            "description": "Named entity: percnt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "%"
+                ]
+            ]
+        }, 
+        {
+            "input": "&period", 
+            "description": "Bad named entity: period without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&period"
+                ]
+            ]
+        }, 
+        {
+            "input": "&period;", 
+            "description": "Named entity: period; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "."
+                ]
+            ]
+        }, 
+        {
+            "input": "&permil", 
+            "description": "Bad named entity: permil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&permil"
+                ]
+            ]
+        }, 
+        {
+            "input": "&permil;", 
+            "description": "Named entity: permil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2030"
+                ]
+            ]
+        }, 
+        {
+            "input": "&perp", 
+            "description": "Bad named entity: perp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&perp"
+                ]
+            ]
+        }, 
+        {
+            "input": "&perp;", 
+            "description": "Named entity: perp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pertenk", 
+            "description": "Bad named entity: pertenk without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&pertenk"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pertenk;", 
+            "description": "Named entity: pertenk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2031"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pfr", 
+            "description": "Bad named entity: pfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&pfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pfr;", 
+            "description": "Named entity: pfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd2d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&phi", 
+            "description": "Bad named entity: phi without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&phi"
+                ]
+            ]
+        }, 
+        {
+            "input": "&phi;", 
+            "description": "Named entity: phi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&phiv", 
+            "description": "Bad named entity: phiv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&phiv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&phiv;", 
+            "description": "Named entity: phiv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03d5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&phmmat", 
+            "description": "Bad named entity: phmmat without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&phmmat"
+                ]
+            ]
+        }, 
+        {
+            "input": "&phmmat;", 
+            "description": "Named entity: phmmat; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2133"
+                ]
+            ]
+        }, 
+        {
+            "input": "&phone", 
+            "description": "Bad named entity: phone without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&phone"
+                ]
+            ]
+        }, 
+        {
+            "input": "&phone;", 
+            "description": "Named entity: phone; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u260e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pi", 
+            "description": "Bad named entity: pi without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&pi"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pi;", 
+            "description": "Named entity: pi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pitchfork", 
+            "description": "Bad named entity: pitchfork without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&pitchfork"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pitchfork;", 
+            "description": "Named entity: pitchfork; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&piv", 
+            "description": "Bad named entity: piv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&piv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&piv;", 
+            "description": "Named entity: piv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03d6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&planck", 
+            "description": "Bad named entity: planck without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&planck"
+                ]
+            ]
+        }, 
+        {
+            "input": "&planck;", 
+            "description": "Named entity: planck; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&planckh", 
+            "description": "Bad named entity: planckh without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&planckh"
+                ]
+            ]
+        }, 
+        {
+            "input": "&planckh;", 
+            "description": "Named entity: planckh; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plankv", 
+            "description": "Bad named entity: plankv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&plankv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plankv;", 
+            "description": "Named entity: plankv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plus", 
+            "description": "Bad named entity: plus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&plus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plus;", 
+            "description": "Named entity: plus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "+"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plusacir", 
+            "description": "Bad named entity: plusacir without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&plusacir"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plusacir;", 
+            "description": "Named entity: plusacir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a23"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plusb", 
+            "description": "Bad named entity: plusb without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&plusb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plusb;", 
+            "description": "Named entity: plusb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u229e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pluscir", 
+            "description": "Bad named entity: pluscir without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&pluscir"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pluscir;", 
+            "description": "Named entity: pluscir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a22"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plusdo", 
+            "description": "Bad named entity: plusdo without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&plusdo"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plusdo;", 
+            "description": "Named entity: plusdo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2214"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plusdu", 
+            "description": "Bad named entity: plusdu without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&plusdu"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plusdu;", 
+            "description": "Named entity: plusdu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a25"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pluse", 
+            "description": "Bad named entity: pluse without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&pluse"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pluse;", 
+            "description": "Named entity: pluse; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a72"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plusmn", 
+            "description": "Named entity: plusmn without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plusmn;", 
+            "description": "Named entity: plusmn; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plussim", 
+            "description": "Bad named entity: plussim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&plussim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plussim;", 
+            "description": "Named entity: plussim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a26"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plustwo", 
+            "description": "Bad named entity: plustwo without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&plustwo"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plustwo;", 
+            "description": "Named entity: plustwo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a27"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pm", 
+            "description": "Bad named entity: pm without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&pm"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pm;", 
+            "description": "Named entity: pm; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pointint", 
+            "description": "Bad named entity: pointint without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&pointint"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pointint;", 
+            "description": "Named entity: pointint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a15"
+                ]
+            ]
+        }, 
+        {
+            "input": "&popf", 
+            "description": "Bad named entity: popf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&popf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&popf;", 
+            "description": "Named entity: popf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd61"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pound", 
+            "description": "Named entity: pound without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pound;", 
+            "description": "Named entity: pound; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pr", 
+            "description": "Bad named entity: pr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&pr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pr;", 
+            "description": "Named entity: pr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prE", 
+            "description": "Bad named entity: prE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&prE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prE;", 
+            "description": "Named entity: prE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prap", 
+            "description": "Bad named entity: prap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&prap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prap;", 
+            "description": "Named entity: prap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prcue", 
+            "description": "Bad named entity: prcue without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&prcue"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prcue;", 
+            "description": "Named entity: prcue; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pre", 
+            "description": "Bad named entity: pre without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&pre"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pre;", 
+            "description": "Named entity: pre; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aaf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prec", 
+            "description": "Bad named entity: prec without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&prec"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prec;", 
+            "description": "Named entity: prec; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&precapprox", 
+            "description": "Bad named entity: precapprox without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&precapprox"
+                ]
+            ]
+        }, 
+        {
+            "input": "&precapprox;", 
+            "description": "Named entity: precapprox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&preccurlyeq", 
+            "description": "Bad named entity: preccurlyeq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&preccurlyeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&preccurlyeq;", 
+            "description": "Named entity: preccurlyeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&preceq", 
+            "description": "Bad named entity: preceq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&preceq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&preceq;", 
+            "description": "Named entity: preceq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aaf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&precnapprox", 
+            "description": "Bad named entity: precnapprox without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&precnapprox"
+                ]
+            ]
+        }, 
+        {
+            "input": "&precnapprox;", 
+            "description": "Named entity: precnapprox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&precneqq", 
+            "description": "Bad named entity: precneqq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&precneqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&precneqq;", 
+            "description": "Named entity: precneqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&precnsim", 
+            "description": "Bad named entity: precnsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&precnsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&precnsim;", 
+            "description": "Named entity: precnsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&precsim", 
+            "description": "Bad named entity: precsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&precsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&precsim;", 
+            "description": "Named entity: precsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prime", 
+            "description": "Bad named entity: prime without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&prime"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prime;", 
+            "description": "Named entity: prime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2032"
+                ]
+            ]
+        }, 
+        {
+            "input": "&primes", 
+            "description": "Bad named entity: primes without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&primes"
+                ]
+            ]
+        }, 
+        {
+            "input": "&primes;", 
+            "description": "Named entity: primes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2119"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prnE", 
+            "description": "Bad named entity: prnE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&prnE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prnE;", 
+            "description": "Named entity: prnE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prnap", 
+            "description": "Bad named entity: prnap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&prnap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prnap;", 
+            "description": "Named entity: prnap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prnsim", 
+            "description": "Bad named entity: prnsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&prnsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prnsim;", 
+            "description": "Named entity: prnsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prod", 
+            "description": "Bad named entity: prod without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&prod"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prod;", 
+            "description": "Named entity: prod; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u220f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&profalar", 
+            "description": "Bad named entity: profalar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&profalar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&profalar;", 
+            "description": "Named entity: profalar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u232e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&profline", 
+            "description": "Bad named entity: profline without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&profline"
+                ]
+            ]
+        }, 
+        {
+            "input": "&profline;", 
+            "description": "Named entity: profline; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2312"
+                ]
+            ]
+        }, 
+        {
+            "input": "&profsurf", 
+            "description": "Bad named entity: profsurf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&profsurf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&profsurf;", 
+            "description": "Named entity: profsurf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2313"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prop", 
+            "description": "Bad named entity: prop without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&prop"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prop;", 
+            "description": "Named entity: prop; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u221d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&propto", 
+            "description": "Bad named entity: propto without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&propto"
+                ]
+            ]
+        }, 
+        {
+            "input": "&propto;", 
+            "description": "Named entity: propto; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u221d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prsim", 
+            "description": "Bad named entity: prsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&prsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prsim;", 
+            "description": "Named entity: prsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prurel", 
+            "description": "Bad named entity: prurel without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&prurel"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prurel;", 
+            "description": "Named entity: prurel; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pscr", 
+            "description": "Bad named entity: pscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&pscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pscr;", 
+            "description": "Named entity: pscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcc5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&psi", 
+            "description": "Bad named entity: psi without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&psi"
+                ]
+            ]
+        }, 
+        {
+            "input": "&psi;", 
+            "description": "Named entity: psi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&puncsp", 
+            "description": "Bad named entity: puncsp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&puncsp"
+                ]
+            ]
+        }, 
+        {
+            "input": "&puncsp;", 
+            "description": "Named entity: puncsp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2008"
+                ]
+            ]
+        }, 
+        {
+            "input": "&qfr", 
+            "description": "Bad named entity: qfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&qfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&qfr;", 
+            "description": "Named entity: qfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd2e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&qint", 
+            "description": "Bad named entity: qint without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&qint"
+                ]
+            ]
+        }, 
+        {
+            "input": "&qint;", 
+            "description": "Named entity: qint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a0c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&qopf", 
+            "description": "Bad named entity: qopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&qopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&qopf;", 
+            "description": "Named entity: qopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd62"
+                ]
+            ]
+        }, 
+        {
+            "input": "&qprime", 
+            "description": "Bad named entity: qprime without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&qprime"
+                ]
+            ]
+        }, 
+        {
+            "input": "&qprime;", 
+            "description": "Named entity: qprime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2057"
+                ]
+            ]
+        }, 
+        {
+            "input": "&qscr", 
+            "description": "Bad named entity: qscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&qscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&qscr;", 
+            "description": "Named entity: qscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcc6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&quaternions", 
+            "description": "Bad named entity: quaternions without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&quaternions"
+                ]
+            ]
+        }, 
+        {
+            "input": "&quaternions;", 
+            "description": "Named entity: quaternions; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&quatint", 
+            "description": "Bad named entity: quatint without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&quatint"
+                ]
+            ]
+        }, 
+        {
+            "input": "&quatint;", 
+            "description": "Named entity: quatint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a16"
+                ]
+            ]
+        }, 
+        {
+            "input": "&quest", 
+            "description": "Bad named entity: quest without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&quest"
+                ]
+            ]
+        }, 
+        {
+            "input": "&quest;", 
+            "description": "Named entity: quest; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "?"
+                ]
+            ]
+        }, 
+        {
+            "input": "&questeq", 
+            "description": "Bad named entity: questeq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&questeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&questeq;", 
+            "description": "Named entity: questeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u225f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&quot", 
+            "description": "Named entity: quot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\""
+                ]
+            ]
+        }, 
+        {
+            "input": "&quot;", 
+            "description": "Named entity: quot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\""
+                ]
+            ]
+        }, 
+        {
+            "input": "&rAarr", 
+            "description": "Bad named entity: rAarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rAarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rAarr;", 
+            "description": "Named entity: rAarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21db"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rArr", 
+            "description": "Bad named entity: rArr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rArr;", 
+            "description": "Named entity: rArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rAtail", 
+            "description": "Bad named entity: rAtail without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rAtail"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rAtail;", 
+            "description": "Named entity: rAtail; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u291c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rBarr", 
+            "description": "Bad named entity: rBarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rBarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rBarr;", 
+            "description": "Named entity: rBarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u290f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rHar", 
+            "description": "Bad named entity: rHar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rHar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rHar;", 
+            "description": "Named entity: rHar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2964"
+                ]
+            ]
+        }, 
+        {
+            "input": "&race", 
+            "description": "Bad named entity: race without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&race"
+                ]
+            ]
+        }, 
+        {
+            "input": "&race;", 
+            "description": "Named entity: race; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223d\u0331"
+                ]
+            ]
+        }, 
+        {
+            "input": "&racute", 
+            "description": "Bad named entity: racute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&racute"
+                ]
+            ]
+        }, 
+        {
+            "input": "&racute;", 
+            "description": "Named entity: racute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0155"
+                ]
+            ]
+        }, 
+        {
+            "input": "&radic", 
+            "description": "Bad named entity: radic without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&radic"
+                ]
+            ]
+        }, 
+        {
+            "input": "&radic;", 
+            "description": "Named entity: radic; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u221a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&raemptyv", 
+            "description": "Bad named entity: raemptyv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&raemptyv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&raemptyv;", 
+            "description": "Named entity: raemptyv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29b3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rang", 
+            "description": "Bad named entity: rang without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rang"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rang;", 
+            "description": "Named entity: rang; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27e9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rangd", 
+            "description": "Bad named entity: rangd without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rangd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rangd;", 
+            "description": "Named entity: rangd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2992"
+                ]
+            ]
+        }, 
+        {
+            "input": "&range", 
+            "description": "Bad named entity: range without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&range"
+                ]
+            ]
+        }, 
+        {
+            "input": "&range;", 
+            "description": "Named entity: range; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29a5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rangle", 
+            "description": "Bad named entity: rangle without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rangle"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rangle;", 
+            "description": "Named entity: rangle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27e9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&raquo", 
+            "description": "Named entity: raquo without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00bb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&raquo;", 
+            "description": "Named entity: raquo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00bb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarr", 
+            "description": "Bad named entity: rarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarr;", 
+            "description": "Named entity: rarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2192"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrap", 
+            "description": "Bad named entity: rarrap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rarrap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrap;", 
+            "description": "Named entity: rarrap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2975"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrb", 
+            "description": "Bad named entity: rarrb without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rarrb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrb;", 
+            "description": "Named entity: rarrb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21e5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrbfs", 
+            "description": "Bad named entity: rarrbfs without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rarrbfs"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrbfs;", 
+            "description": "Named entity: rarrbfs; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2920"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrc", 
+            "description": "Bad named entity: rarrc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rarrc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrc;", 
+            "description": "Named entity: rarrc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2933"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrfs", 
+            "description": "Bad named entity: rarrfs without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rarrfs"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrfs;", 
+            "description": "Named entity: rarrfs; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u291e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrhk", 
+            "description": "Bad named entity: rarrhk without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rarrhk"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrhk;", 
+            "description": "Named entity: rarrhk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21aa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrlp", 
+            "description": "Bad named entity: rarrlp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rarrlp"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrlp;", 
+            "description": "Named entity: rarrlp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrpl", 
+            "description": "Bad named entity: rarrpl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rarrpl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrpl;", 
+            "description": "Named entity: rarrpl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2945"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrsim", 
+            "description": "Bad named entity: rarrsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rarrsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrsim;", 
+            "description": "Named entity: rarrsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2974"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrtl", 
+            "description": "Bad named entity: rarrtl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rarrtl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrtl;", 
+            "description": "Named entity: rarrtl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrw", 
+            "description": "Bad named entity: rarrw without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rarrw"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrw;", 
+            "description": "Named entity: rarrw; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u219d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ratail", 
+            "description": "Bad named entity: ratail without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ratail"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ratail;", 
+            "description": "Named entity: ratail; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u291a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ratio", 
+            "description": "Bad named entity: ratio without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ratio"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ratio;", 
+            "description": "Named entity: ratio; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2236"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rationals", 
+            "description": "Bad named entity: rationals without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rationals"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rationals;", 
+            "description": "Named entity: rationals; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbarr", 
+            "description": "Bad named entity: rbarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rbarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbarr;", 
+            "description": "Named entity: rbarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u290d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbbrk", 
+            "description": "Bad named entity: rbbrk without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rbbrk"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbbrk;", 
+            "description": "Named entity: rbbrk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2773"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbrace", 
+            "description": "Bad named entity: rbrace without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rbrace"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbrace;", 
+            "description": "Named entity: rbrace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "}"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbrack", 
+            "description": "Bad named entity: rbrack without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rbrack"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbrack;", 
+            "description": "Named entity: rbrack; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "]"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbrke", 
+            "description": "Bad named entity: rbrke without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rbrke"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbrke;", 
+            "description": "Named entity: rbrke; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u298c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbrksld", 
+            "description": "Bad named entity: rbrksld without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rbrksld"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbrksld;", 
+            "description": "Named entity: rbrksld; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u298e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbrkslu", 
+            "description": "Bad named entity: rbrkslu without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rbrkslu"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbrkslu;", 
+            "description": "Named entity: rbrkslu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2990"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rcaron", 
+            "description": "Bad named entity: rcaron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rcaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rcaron;", 
+            "description": "Named entity: rcaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0159"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rcedil", 
+            "description": "Bad named entity: rcedil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rcedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rcedil;", 
+            "description": "Named entity: rcedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0157"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rceil", 
+            "description": "Bad named entity: rceil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rceil"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rceil;", 
+            "description": "Named entity: rceil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2309"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rcub", 
+            "description": "Bad named entity: rcub without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rcub"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rcub;", 
+            "description": "Named entity: rcub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "}"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rcy", 
+            "description": "Bad named entity: rcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rcy;", 
+            "description": "Named entity: rcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0440"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rdca", 
+            "description": "Bad named entity: rdca without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rdca"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rdca;", 
+            "description": "Named entity: rdca; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2937"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rdldhar", 
+            "description": "Bad named entity: rdldhar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rdldhar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rdldhar;", 
+            "description": "Named entity: rdldhar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2969"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rdquo", 
+            "description": "Bad named entity: rdquo without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rdquo"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rdquo;", 
+            "description": "Named entity: rdquo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u201d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rdquor", 
+            "description": "Bad named entity: rdquor without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rdquor"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rdquor;", 
+            "description": "Named entity: rdquor; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u201d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rdsh", 
+            "description": "Bad named entity: rdsh without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rdsh"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rdsh;", 
+            "description": "Named entity: rdsh; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&real", 
+            "description": "Bad named entity: real without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&real"
+                ]
+            ]
+        }, 
+        {
+            "input": "&real;", 
+            "description": "Named entity: real; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&realine", 
+            "description": "Bad named entity: realine without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&realine"
+                ]
+            ]
+        }, 
+        {
+            "input": "&realine;", 
+            "description": "Named entity: realine; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&realpart", 
+            "description": "Bad named entity: realpart without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&realpart"
+                ]
+            ]
+        }, 
+        {
+            "input": "&realpart;", 
+            "description": "Named entity: realpart; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&reals", 
+            "description": "Bad named entity: reals without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&reals"
+                ]
+            ]
+        }, 
+        {
+            "input": "&reals;", 
+            "description": "Named entity: reals; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rect", 
+            "description": "Bad named entity: rect without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rect"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rect;", 
+            "description": "Named entity: rect; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25ad"
+                ]
+            ]
+        }, 
+        {
+            "input": "&reg", 
+            "description": "Named entity: reg without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&reg;", 
+            "description": "Named entity: reg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rfisht", 
+            "description": "Bad named entity: rfisht without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rfisht"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rfisht;", 
+            "description": "Named entity: rfisht; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u297d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rfloor", 
+            "description": "Bad named entity: rfloor without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rfloor"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rfloor;", 
+            "description": "Named entity: rfloor; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u230b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rfr", 
+            "description": "Bad named entity: rfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rfr;", 
+            "description": "Named entity: rfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd2f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rhard", 
+            "description": "Bad named entity: rhard without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rhard"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rhard;", 
+            "description": "Named entity: rhard; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rharu", 
+            "description": "Bad named entity: rharu without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rharu"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rharu;", 
+            "description": "Named entity: rharu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rharul", 
+            "description": "Bad named entity: rharul without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rharul"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rharul;", 
+            "description": "Named entity: rharul; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u296c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rho", 
+            "description": "Bad named entity: rho without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rho"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rho;", 
+            "description": "Named entity: rho; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rhov", 
+            "description": "Bad named entity: rhov without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rhov"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rhov;", 
+            "description": "Named entity: rhov; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03f1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightarrow", 
+            "description": "Bad named entity: rightarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightarrow;", 
+            "description": "Named entity: rightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2192"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightarrowtail", 
+            "description": "Bad named entity: rightarrowtail without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rightarrowtail"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightarrowtail;", 
+            "description": "Named entity: rightarrowtail; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightharpoondown", 
+            "description": "Bad named entity: rightharpoondown without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rightharpoondown"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightharpoondown;", 
+            "description": "Named entity: rightharpoondown; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightharpoonup", 
+            "description": "Bad named entity: rightharpoonup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rightharpoonup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightharpoonup;", 
+            "description": "Named entity: rightharpoonup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightleftarrows", 
+            "description": "Bad named entity: rightleftarrows without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rightleftarrows"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightleftarrows;", 
+            "description": "Named entity: rightleftarrows; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightleftharpoons", 
+            "description": "Bad named entity: rightleftharpoons without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rightleftharpoons"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightleftharpoons;", 
+            "description": "Named entity: rightleftharpoons; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21cc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightrightarrows", 
+            "description": "Bad named entity: rightrightarrows without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rightrightarrows"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightrightarrows;", 
+            "description": "Named entity: rightrightarrows; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightsquigarrow", 
+            "description": "Bad named entity: rightsquigarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rightsquigarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightsquigarrow;", 
+            "description": "Named entity: rightsquigarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u219d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightthreetimes", 
+            "description": "Bad named entity: rightthreetimes without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rightthreetimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightthreetimes;", 
+            "description": "Named entity: rightthreetimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22cc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ring", 
+            "description": "Bad named entity: ring without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ring"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ring;", 
+            "description": "Named entity: ring; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02da"
+                ]
+            ]
+        }, 
+        {
+            "input": "&risingdotseq", 
+            "description": "Bad named entity: risingdotseq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&risingdotseq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&risingdotseq;", 
+            "description": "Named entity: risingdotseq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2253"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rlarr", 
+            "description": "Bad named entity: rlarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rlarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rlarr;", 
+            "description": "Named entity: rlarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rlhar", 
+            "description": "Bad named entity: rlhar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rlhar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rlhar;", 
+            "description": "Named entity: rlhar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21cc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rlm", 
+            "description": "Bad named entity: rlm without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rlm"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rlm;", 
+            "description": "Named entity: rlm; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rmoust", 
+            "description": "Bad named entity: rmoust without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rmoust"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rmoust;", 
+            "description": "Named entity: rmoust; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rmoustache", 
+            "description": "Bad named entity: rmoustache without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rmoustache"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rmoustache;", 
+            "description": "Named entity: rmoustache; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rnmid", 
+            "description": "Bad named entity: rnmid without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rnmid"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rnmid;", 
+            "description": "Named entity: rnmid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&roang", 
+            "description": "Bad named entity: roang without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&roang"
+                ]
+            ]
+        }, 
+        {
+            "input": "&roang;", 
+            "description": "Named entity: roang; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27ed"
+                ]
+            ]
+        }, 
+        {
+            "input": "&roarr", 
+            "description": "Bad named entity: roarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&roarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&roarr;", 
+            "description": "Named entity: roarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21fe"
+                ]
+            ]
+        }, 
+        {
+            "input": "&robrk", 
+            "description": "Bad named entity: robrk without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&robrk"
+                ]
+            ]
+        }, 
+        {
+            "input": "&robrk;", 
+            "description": "Named entity: robrk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27e7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ropar", 
+            "description": "Bad named entity: ropar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ropar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ropar;", 
+            "description": "Named entity: ropar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2986"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ropf", 
+            "description": "Bad named entity: ropf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ropf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ropf;", 
+            "description": "Named entity: ropf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd63"
+                ]
+            ]
+        }, 
+        {
+            "input": "&roplus", 
+            "description": "Bad named entity: roplus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&roplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&roplus;", 
+            "description": "Named entity: roplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a2e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rotimes", 
+            "description": "Bad named entity: rotimes without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rotimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rotimes;", 
+            "description": "Named entity: rotimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a35"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rpar", 
+            "description": "Bad named entity: rpar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rpar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rpar;", 
+            "description": "Named entity: rpar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    ")"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rpargt", 
+            "description": "Bad named entity: rpargt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rpargt"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rpargt;", 
+            "description": "Named entity: rpargt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2994"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rppolint", 
+            "description": "Bad named entity: rppolint without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rppolint"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rppolint;", 
+            "description": "Named entity: rppolint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a12"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rrarr", 
+            "description": "Bad named entity: rrarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rrarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rrarr;", 
+            "description": "Named entity: rrarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rsaquo", 
+            "description": "Bad named entity: rsaquo without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rsaquo"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rsaquo;", 
+            "description": "Named entity: rsaquo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u203a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rscr", 
+            "description": "Bad named entity: rscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rscr;", 
+            "description": "Named entity: rscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcc7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rsh", 
+            "description": "Bad named entity: rsh without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rsh"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rsh;", 
+            "description": "Named entity: rsh; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rsqb", 
+            "description": "Bad named entity: rsqb without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rsqb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rsqb;", 
+            "description": "Named entity: rsqb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "]"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rsquo", 
+            "description": "Bad named entity: rsquo without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rsquo"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rsquo;", 
+            "description": "Named entity: rsquo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2019"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rsquor", 
+            "description": "Bad named entity: rsquor without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rsquor"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rsquor;", 
+            "description": "Named entity: rsquor; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2019"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rthree", 
+            "description": "Bad named entity: rthree without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rthree"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rthree;", 
+            "description": "Named entity: rthree; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22cc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rtimes", 
+            "description": "Bad named entity: rtimes without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rtimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rtimes;", 
+            "description": "Named entity: rtimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ca"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rtri", 
+            "description": "Bad named entity: rtri without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rtri"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rtri;", 
+            "description": "Named entity: rtri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rtrie", 
+            "description": "Bad named entity: rtrie without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rtrie"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rtrie;", 
+            "description": "Named entity: rtrie; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rtrif", 
+            "description": "Bad named entity: rtrif without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rtrif"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rtrif;", 
+            "description": "Named entity: rtrif; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rtriltri", 
+            "description": "Bad named entity: rtriltri without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rtriltri"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rtriltri;", 
+            "description": "Named entity: rtriltri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29ce"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ruluhar", 
+            "description": "Bad named entity: ruluhar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ruluhar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ruluhar;", 
+            "description": "Named entity: ruluhar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2968"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rx", 
+            "description": "Bad named entity: rx without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&rx"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rx;", 
+            "description": "Named entity: rx; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sacute", 
+            "description": "Bad named entity: sacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sacute;", 
+            "description": "Named entity: sacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u015b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sbquo", 
+            "description": "Bad named entity: sbquo without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sbquo"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sbquo;", 
+            "description": "Named entity: sbquo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u201a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sc", 
+            "description": "Bad named entity: sc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sc;", 
+            "description": "Named entity: sc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scE", 
+            "description": "Bad named entity: scE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&scE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scE;", 
+            "description": "Named entity: scE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scap", 
+            "description": "Bad named entity: scap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&scap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scap;", 
+            "description": "Named entity: scap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scaron", 
+            "description": "Bad named entity: scaron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&scaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scaron;", 
+            "description": "Named entity: scaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0161"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sccue", 
+            "description": "Bad named entity: sccue without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sccue"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sccue;", 
+            "description": "Named entity: sccue; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sce", 
+            "description": "Bad named entity: sce without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sce"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sce;", 
+            "description": "Named entity: sce; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scedil", 
+            "description": "Bad named entity: scedil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&scedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scedil;", 
+            "description": "Named entity: scedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u015f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scirc", 
+            "description": "Bad named entity: scirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&scirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scirc;", 
+            "description": "Named entity: scirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u015d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scnE", 
+            "description": "Bad named entity: scnE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&scnE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scnE;", 
+            "description": "Named entity: scnE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scnap", 
+            "description": "Bad named entity: scnap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&scnap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scnap;", 
+            "description": "Named entity: scnap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aba"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scnsim", 
+            "description": "Bad named entity: scnsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&scnsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scnsim;", 
+            "description": "Named entity: scnsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scpolint", 
+            "description": "Bad named entity: scpolint without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&scpolint"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scpolint;", 
+            "description": "Named entity: scpolint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a13"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scsim", 
+            "description": "Bad named entity: scsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&scsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scsim;", 
+            "description": "Named entity: scsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scy", 
+            "description": "Bad named entity: scy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&scy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scy;", 
+            "description": "Named entity: scy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0441"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sdot", 
+            "description": "Bad named entity: sdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sdot;", 
+            "description": "Named entity: sdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sdotb", 
+            "description": "Bad named entity: sdotb without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sdotb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sdotb;", 
+            "description": "Named entity: sdotb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sdote", 
+            "description": "Bad named entity: sdote without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sdote"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sdote;", 
+            "description": "Named entity: sdote; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a66"
+                ]
+            ]
+        }, 
+        {
+            "input": "&seArr", 
+            "description": "Bad named entity: seArr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&seArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&seArr;", 
+            "description": "Named entity: seArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&searhk", 
+            "description": "Bad named entity: searhk without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&searhk"
+                ]
+            ]
+        }, 
+        {
+            "input": "&searhk;", 
+            "description": "Named entity: searhk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2925"
+                ]
+            ]
+        }, 
+        {
+            "input": "&searr", 
+            "description": "Bad named entity: searr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&searr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&searr;", 
+            "description": "Named entity: searr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2198"
+                ]
+            ]
+        }, 
+        {
+            "input": "&searrow", 
+            "description": "Bad named entity: searrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&searrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&searrow;", 
+            "description": "Named entity: searrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2198"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sect", 
+            "description": "Named entity: sect without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sect;", 
+            "description": "Named entity: sect; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&semi", 
+            "description": "Bad named entity: semi without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&semi"
+                ]
+            ]
+        }, 
+        {
+            "input": "&semi;", 
+            "description": "Named entity: semi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    ";"
+                ]
+            ]
+        }, 
+        {
+            "input": "&seswar", 
+            "description": "Bad named entity: seswar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&seswar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&seswar;", 
+            "description": "Named entity: seswar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2929"
+                ]
+            ]
+        }, 
+        {
+            "input": "&setminus", 
+            "description": "Bad named entity: setminus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&setminus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&setminus;", 
+            "description": "Named entity: setminus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2216"
+                ]
+            ]
+        }, 
+        {
+            "input": "&setmn", 
+            "description": "Bad named entity: setmn without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&setmn"
+                ]
+            ]
+        }, 
+        {
+            "input": "&setmn;", 
+            "description": "Named entity: setmn; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2216"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sext", 
+            "description": "Bad named entity: sext without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sext"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sext;", 
+            "description": "Named entity: sext; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2736"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sfr", 
+            "description": "Bad named entity: sfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sfr;", 
+            "description": "Named entity: sfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd30"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sfrown", 
+            "description": "Bad named entity: sfrown without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sfrown"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sfrown;", 
+            "description": "Named entity: sfrown; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2322"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sharp", 
+            "description": "Bad named entity: sharp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sharp"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sharp;", 
+            "description": "Named entity: sharp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u266f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&shchcy", 
+            "description": "Bad named entity: shchcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&shchcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&shchcy;", 
+            "description": "Named entity: shchcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0449"
+                ]
+            ]
+        }, 
+        {
+            "input": "&shcy", 
+            "description": "Bad named entity: shcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&shcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&shcy;", 
+            "description": "Named entity: shcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0448"
+                ]
+            ]
+        }, 
+        {
+            "input": "&shortmid", 
+            "description": "Bad named entity: shortmid without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&shortmid"
+                ]
+            ]
+        }, 
+        {
+            "input": "&shortmid;", 
+            "description": "Named entity: shortmid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2223"
+                ]
+            ]
+        }, 
+        {
+            "input": "&shortparallel", 
+            "description": "Bad named entity: shortparallel without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&shortparallel"
+                ]
+            ]
+        }, 
+        {
+            "input": "&shortparallel;", 
+            "description": "Named entity: shortparallel; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2225"
+                ]
+            ]
+        }, 
+        {
+            "input": "&shy", 
+            "description": "Named entity: shy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ad"
+                ]
+            ]
+        }, 
+        {
+            "input": "&shy;", 
+            "description": "Named entity: shy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ad"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sigma", 
+            "description": "Bad named entity: sigma without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sigma"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sigma;", 
+            "description": "Named entity: sigma; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sigmaf", 
+            "description": "Bad named entity: sigmaf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sigmaf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sigmaf;", 
+            "description": "Named entity: sigmaf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sigmav", 
+            "description": "Bad named entity: sigmav without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sigmav"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sigmav;", 
+            "description": "Named entity: sigmav; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sim", 
+            "description": "Bad named entity: sim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sim;", 
+            "description": "Named entity: sim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simdot", 
+            "description": "Bad named entity: simdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&simdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simdot;", 
+            "description": "Named entity: simdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a6a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sime", 
+            "description": "Bad named entity: sime without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sime"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sime;", 
+            "description": "Named entity: sime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2243"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simeq", 
+            "description": "Bad named entity: simeq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&simeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simeq;", 
+            "description": "Named entity: simeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2243"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simg", 
+            "description": "Bad named entity: simg without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&simg"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simg;", 
+            "description": "Named entity: simg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a9e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simgE", 
+            "description": "Bad named entity: simgE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&simgE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simgE;", 
+            "description": "Named entity: simgE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&siml", 
+            "description": "Bad named entity: siml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&siml"
+                ]
+            ]
+        }, 
+        {
+            "input": "&siml;", 
+            "description": "Named entity: siml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a9d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simlE", 
+            "description": "Bad named entity: simlE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&simlE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simlE;", 
+            "description": "Named entity: simlE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a9f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simne", 
+            "description": "Bad named entity: simne without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&simne"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simne;", 
+            "description": "Named entity: simne; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2246"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simplus", 
+            "description": "Bad named entity: simplus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&simplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simplus;", 
+            "description": "Named entity: simplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a24"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simrarr", 
+            "description": "Bad named entity: simrarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&simrarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simrarr;", 
+            "description": "Named entity: simrarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2972"
+                ]
+            ]
+        }, 
+        {
+            "input": "&slarr", 
+            "description": "Bad named entity: slarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&slarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&slarr;", 
+            "description": "Named entity: slarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2190"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smallsetminus", 
+            "description": "Bad named entity: smallsetminus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&smallsetminus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smallsetminus;", 
+            "description": "Named entity: smallsetminus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2216"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smashp", 
+            "description": "Bad named entity: smashp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&smashp"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smashp;", 
+            "description": "Named entity: smashp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a33"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smeparsl", 
+            "description": "Bad named entity: smeparsl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&smeparsl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smeparsl;", 
+            "description": "Named entity: smeparsl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29e4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smid", 
+            "description": "Bad named entity: smid without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&smid"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smid;", 
+            "description": "Named entity: smid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2223"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smile", 
+            "description": "Bad named entity: smile without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&smile"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smile;", 
+            "description": "Named entity: smile; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2323"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smt", 
+            "description": "Bad named entity: smt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&smt"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smt;", 
+            "description": "Named entity: smt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aaa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smte", 
+            "description": "Bad named entity: smte without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&smte"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smte;", 
+            "description": "Named entity: smte; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smtes", 
+            "description": "Bad named entity: smtes without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&smtes"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smtes;", 
+            "description": "Named entity: smtes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aac\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&softcy", 
+            "description": "Bad named entity: softcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&softcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&softcy;", 
+            "description": "Named entity: softcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u044c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sol", 
+            "description": "Bad named entity: sol without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sol"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sol;", 
+            "description": "Named entity: sol; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "/"
+                ]
+            ]
+        }, 
+        {
+            "input": "&solb", 
+            "description": "Bad named entity: solb without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&solb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&solb;", 
+            "description": "Named entity: solb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29c4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&solbar", 
+            "description": "Bad named entity: solbar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&solbar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&solbar;", 
+            "description": "Named entity: solbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u233f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sopf", 
+            "description": "Bad named entity: sopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sopf;", 
+            "description": "Named entity: sopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd64"
+                ]
+            ]
+        }, 
+        {
+            "input": "&spades", 
+            "description": "Bad named entity: spades without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&spades"
+                ]
+            ]
+        }, 
+        {
+            "input": "&spades;", 
+            "description": "Named entity: spades; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2660"
+                ]
+            ]
+        }, 
+        {
+            "input": "&spadesuit", 
+            "description": "Bad named entity: spadesuit without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&spadesuit"
+                ]
+            ]
+        }, 
+        {
+            "input": "&spadesuit;", 
+            "description": "Named entity: spadesuit; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2660"
+                ]
+            ]
+        }, 
+        {
+            "input": "&spar", 
+            "description": "Bad named entity: spar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&spar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&spar;", 
+            "description": "Named entity: spar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2225"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqcap", 
+            "description": "Bad named entity: sqcap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sqcap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqcap;", 
+            "description": "Named entity: sqcap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2293"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqcaps", 
+            "description": "Bad named entity: sqcaps without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sqcaps"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqcaps;", 
+            "description": "Named entity: sqcaps; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2293\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqcup", 
+            "description": "Bad named entity: sqcup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sqcup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqcup;", 
+            "description": "Named entity: sqcup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2294"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqcups", 
+            "description": "Bad named entity: sqcups without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sqcups"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqcups;", 
+            "description": "Named entity: sqcups; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2294\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsub", 
+            "description": "Bad named entity: sqsub without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sqsub"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsub;", 
+            "description": "Named entity: sqsub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsube", 
+            "description": "Bad named entity: sqsube without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sqsube"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsube;", 
+            "description": "Named entity: sqsube; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2291"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsubset", 
+            "description": "Bad named entity: sqsubset without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sqsubset"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsubset;", 
+            "description": "Named entity: sqsubset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsubseteq", 
+            "description": "Bad named entity: sqsubseteq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sqsubseteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsubseteq;", 
+            "description": "Named entity: sqsubseteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2291"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsup", 
+            "description": "Bad named entity: sqsup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sqsup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsup;", 
+            "description": "Named entity: sqsup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2290"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsupe", 
+            "description": "Bad named entity: sqsupe without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sqsupe"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsupe;", 
+            "description": "Named entity: sqsupe; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2292"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsupset", 
+            "description": "Bad named entity: sqsupset without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sqsupset"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsupset;", 
+            "description": "Named entity: sqsupset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2290"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsupseteq", 
+            "description": "Bad named entity: sqsupseteq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sqsupseteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsupseteq;", 
+            "description": "Named entity: sqsupseteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2292"
+                ]
+            ]
+        }, 
+        {
+            "input": "&squ", 
+            "description": "Bad named entity: squ without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&squ"
+                ]
+            ]
+        }, 
+        {
+            "input": "&squ;", 
+            "description": "Named entity: squ; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25a1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&square", 
+            "description": "Bad named entity: square without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&square"
+                ]
+            ]
+        }, 
+        {
+            "input": "&square;", 
+            "description": "Named entity: square; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25a1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&squarf", 
+            "description": "Bad named entity: squarf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&squarf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&squarf;", 
+            "description": "Named entity: squarf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25aa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&squf", 
+            "description": "Bad named entity: squf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&squf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&squf;", 
+            "description": "Named entity: squf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25aa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&srarr", 
+            "description": "Bad named entity: srarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&srarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&srarr;", 
+            "description": "Named entity: srarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2192"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sscr", 
+            "description": "Bad named entity: sscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sscr;", 
+            "description": "Named entity: sscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcc8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ssetmn", 
+            "description": "Bad named entity: ssetmn without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ssetmn"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ssetmn;", 
+            "description": "Named entity: ssetmn; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2216"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ssmile", 
+            "description": "Bad named entity: ssmile without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ssmile"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ssmile;", 
+            "description": "Named entity: ssmile; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2323"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sstarf", 
+            "description": "Bad named entity: sstarf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sstarf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sstarf;", 
+            "description": "Named entity: sstarf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&star", 
+            "description": "Bad named entity: star without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&star"
+                ]
+            ]
+        }, 
+        {
+            "input": "&star;", 
+            "description": "Named entity: star; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2606"
+                ]
+            ]
+        }, 
+        {
+            "input": "&starf", 
+            "description": "Bad named entity: starf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&starf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&starf;", 
+            "description": "Named entity: starf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2605"
+                ]
+            ]
+        }, 
+        {
+            "input": "&straightepsilon", 
+            "description": "Bad named entity: straightepsilon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&straightepsilon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&straightepsilon;", 
+            "description": "Named entity: straightepsilon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&straightphi", 
+            "description": "Bad named entity: straightphi without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&straightphi"
+                ]
+            ]
+        }, 
+        {
+            "input": "&straightphi;", 
+            "description": "Named entity: straightphi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03d5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&strns", 
+            "description": "Bad named entity: strns without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&strns"
+                ]
+            ]
+        }, 
+        {
+            "input": "&strns;", 
+            "description": "Named entity: strns; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00af"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sub", 
+            "description": "Bad named entity: sub without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sub"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sub;", 
+            "description": "Named entity: sub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2282"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subE", 
+            "description": "Bad named entity: subE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&subE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subE;", 
+            "description": "Named entity: subE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subdot", 
+            "description": "Bad named entity: subdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&subdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subdot;", 
+            "description": "Named entity: subdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2abd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sube", 
+            "description": "Bad named entity: sube without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sube"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sube;", 
+            "description": "Named entity: sube; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2286"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subedot", 
+            "description": "Bad named entity: subedot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&subedot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subedot;", 
+            "description": "Named entity: subedot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&submult", 
+            "description": "Bad named entity: submult without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&submult"
+                ]
+            ]
+        }, 
+        {
+            "input": "&submult;", 
+            "description": "Named entity: submult; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subnE", 
+            "description": "Bad named entity: subnE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&subnE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subnE;", 
+            "description": "Named entity: subnE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2acb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subne", 
+            "description": "Bad named entity: subne without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&subne"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subne;", 
+            "description": "Named entity: subne; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subplus", 
+            "description": "Bad named entity: subplus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&subplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subplus;", 
+            "description": "Named entity: subplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2abf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subrarr", 
+            "description": "Bad named entity: subrarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&subrarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subrarr;", 
+            "description": "Named entity: subrarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2979"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subset", 
+            "description": "Bad named entity: subset without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&subset"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subset;", 
+            "description": "Named entity: subset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2282"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subseteq", 
+            "description": "Bad named entity: subseteq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&subseteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subseteq;", 
+            "description": "Named entity: subseteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2286"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subseteqq", 
+            "description": "Bad named entity: subseteqq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&subseteqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subseteqq;", 
+            "description": "Named entity: subseteqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subsetneq", 
+            "description": "Bad named entity: subsetneq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&subsetneq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subsetneq;", 
+            "description": "Named entity: subsetneq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subsetneqq", 
+            "description": "Bad named entity: subsetneqq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&subsetneqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subsetneqq;", 
+            "description": "Named entity: subsetneqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2acb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subsim", 
+            "description": "Bad named entity: subsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&subsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subsim;", 
+            "description": "Named entity: subsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subsub", 
+            "description": "Bad named entity: subsub without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&subsub"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subsub;", 
+            "description": "Named entity: subsub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ad5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subsup", 
+            "description": "Bad named entity: subsup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&subsup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subsup;", 
+            "description": "Named entity: subsup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ad3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succ", 
+            "description": "Bad named entity: succ without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&succ"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succ;", 
+            "description": "Named entity: succ; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succapprox", 
+            "description": "Bad named entity: succapprox without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&succapprox"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succapprox;", 
+            "description": "Named entity: succapprox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succcurlyeq", 
+            "description": "Bad named entity: succcurlyeq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&succcurlyeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succcurlyeq;", 
+            "description": "Named entity: succcurlyeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succeq", 
+            "description": "Bad named entity: succeq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&succeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succeq;", 
+            "description": "Named entity: succeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succnapprox", 
+            "description": "Bad named entity: succnapprox without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&succnapprox"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succnapprox;", 
+            "description": "Named entity: succnapprox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aba"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succneqq", 
+            "description": "Bad named entity: succneqq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&succneqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succneqq;", 
+            "description": "Named entity: succneqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succnsim", 
+            "description": "Bad named entity: succnsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&succnsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succnsim;", 
+            "description": "Named entity: succnsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succsim", 
+            "description": "Bad named entity: succsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&succsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succsim;", 
+            "description": "Named entity: succsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sum", 
+            "description": "Bad named entity: sum without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sum"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sum;", 
+            "description": "Named entity: sum; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2211"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sung", 
+            "description": "Bad named entity: sung without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sung"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sung;", 
+            "description": "Named entity: sung; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u266a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sup", 
+            "description": "Bad named entity: sup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&sup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sup1", 
+            "description": "Named entity: sup1 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00b9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sup1;", 
+            "description": "Named entity: sup1; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sup2", 
+            "description": "Named entity: sup2 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00b2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sup2;", 
+            "description": "Named entity: sup2; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sup3", 
+            "description": "Named entity: sup3 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00b3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sup3;", 
+            "description": "Named entity: sup3; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sup;", 
+            "description": "Named entity: sup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2283"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supE", 
+            "description": "Bad named entity: supE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&supE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supE;", 
+            "description": "Named entity: supE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supdot", 
+            "description": "Bad named entity: supdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&supdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supdot;", 
+            "description": "Named entity: supdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2abe"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supdsub", 
+            "description": "Bad named entity: supdsub without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&supdsub"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supdsub;", 
+            "description": "Named entity: supdsub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ad8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supe", 
+            "description": "Bad named entity: supe without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&supe"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supe;", 
+            "description": "Named entity: supe; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2287"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supedot", 
+            "description": "Bad named entity: supedot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&supedot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supedot;", 
+            "description": "Named entity: supedot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&suphsol", 
+            "description": "Bad named entity: suphsol without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&suphsol"
+                ]
+            ]
+        }, 
+        {
+            "input": "&suphsol;", 
+            "description": "Named entity: suphsol; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27c9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&suphsub", 
+            "description": "Bad named entity: suphsub without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&suphsub"
+                ]
+            ]
+        }, 
+        {
+            "input": "&suphsub;", 
+            "description": "Named entity: suphsub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ad7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&suplarr", 
+            "description": "Bad named entity: suplarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&suplarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&suplarr;", 
+            "description": "Named entity: suplarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u297b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supmult", 
+            "description": "Bad named entity: supmult without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&supmult"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supmult;", 
+            "description": "Named entity: supmult; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supnE", 
+            "description": "Bad named entity: supnE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&supnE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supnE;", 
+            "description": "Named entity: supnE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2acc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supne", 
+            "description": "Bad named entity: supne without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&supne"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supne;", 
+            "description": "Named entity: supne; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supplus", 
+            "description": "Bad named entity: supplus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&supplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supplus;", 
+            "description": "Named entity: supplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supset", 
+            "description": "Bad named entity: supset without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&supset"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supset;", 
+            "description": "Named entity: supset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2283"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supseteq", 
+            "description": "Bad named entity: supseteq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&supseteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supseteq;", 
+            "description": "Named entity: supseteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2287"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supseteqq", 
+            "description": "Bad named entity: supseteqq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&supseteqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supseteqq;", 
+            "description": "Named entity: supseteqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supsetneq", 
+            "description": "Bad named entity: supsetneq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&supsetneq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supsetneq;", 
+            "description": "Named entity: supsetneq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supsetneqq", 
+            "description": "Bad named entity: supsetneqq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&supsetneqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supsetneqq;", 
+            "description": "Named entity: supsetneqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2acc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supsim", 
+            "description": "Bad named entity: supsim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&supsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supsim;", 
+            "description": "Named entity: supsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supsub", 
+            "description": "Bad named entity: supsub without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&supsub"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supsub;", 
+            "description": "Named entity: supsub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ad4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supsup", 
+            "description": "Bad named entity: supsup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&supsup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supsup;", 
+            "description": "Named entity: supsup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ad6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&swArr", 
+            "description": "Bad named entity: swArr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&swArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&swArr;", 
+            "description": "Named entity: swArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&swarhk", 
+            "description": "Bad named entity: swarhk without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&swarhk"
+                ]
+            ]
+        }, 
+        {
+            "input": "&swarhk;", 
+            "description": "Named entity: swarhk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2926"
+                ]
+            ]
+        }, 
+        {
+            "input": "&swarr", 
+            "description": "Bad named entity: swarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&swarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&swarr;", 
+            "description": "Named entity: swarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2199"
+                ]
+            ]
+        }, 
+        {
+            "input": "&swarrow", 
+            "description": "Bad named entity: swarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&swarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&swarrow;", 
+            "description": "Named entity: swarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2199"
+                ]
+            ]
+        }, 
+        {
+            "input": "&swnwar", 
+            "description": "Bad named entity: swnwar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&swnwar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&swnwar;", 
+            "description": "Named entity: swnwar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u292a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&szlig", 
+            "description": "Named entity: szlig without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00df"
+                ]
+            ]
+        }, 
+        {
+            "input": "&szlig;", 
+            "description": "Named entity: szlig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00df"
+                ]
+            ]
+        }, 
+        {
+            "input": "&target", 
+            "description": "Bad named entity: target without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&target"
+                ]
+            ]
+        }, 
+        {
+            "input": "&target;", 
+            "description": "Named entity: target; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2316"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tau", 
+            "description": "Bad named entity: tau without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&tau"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tau;", 
+            "description": "Named entity: tau; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tbrk", 
+            "description": "Bad named entity: tbrk without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&tbrk"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tbrk;", 
+            "description": "Named entity: tbrk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tcaron", 
+            "description": "Bad named entity: tcaron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&tcaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tcaron;", 
+            "description": "Named entity: tcaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0165"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tcedil", 
+            "description": "Bad named entity: tcedil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&tcedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tcedil;", 
+            "description": "Named entity: tcedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0163"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tcy", 
+            "description": "Bad named entity: tcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&tcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tcy;", 
+            "description": "Named entity: tcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0442"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tdot", 
+            "description": "Bad named entity: tdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&tdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tdot;", 
+            "description": "Named entity: tdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u20db"
+                ]
+            ]
+        }, 
+        {
+            "input": "&telrec", 
+            "description": "Bad named entity: telrec without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&telrec"
+                ]
+            ]
+        }, 
+        {
+            "input": "&telrec;", 
+            "description": "Named entity: telrec; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2315"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tfr", 
+            "description": "Bad named entity: tfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&tfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tfr;", 
+            "description": "Named entity: tfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd31"
+                ]
+            ]
+        }, 
+        {
+            "input": "&there4", 
+            "description": "Bad named entity: there4 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&there4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&there4;", 
+            "description": "Named entity: there4; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2234"
+                ]
+            ]
+        }, 
+        {
+            "input": "&therefore", 
+            "description": "Bad named entity: therefore without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&therefore"
+                ]
+            ]
+        }, 
+        {
+            "input": "&therefore;", 
+            "description": "Named entity: therefore; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2234"
+                ]
+            ]
+        }, 
+        {
+            "input": "&theta", 
+            "description": "Bad named entity: theta without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&theta"
+                ]
+            ]
+        }, 
+        {
+            "input": "&theta;", 
+            "description": "Named entity: theta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03b8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thetasym", 
+            "description": "Bad named entity: thetasym without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&thetasym"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thetasym;", 
+            "description": "Named entity: thetasym; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03d1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thetav", 
+            "description": "Bad named entity: thetav without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&thetav"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thetav;", 
+            "description": "Named entity: thetav; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03d1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thickapprox", 
+            "description": "Bad named entity: thickapprox without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&thickapprox"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thickapprox;", 
+            "description": "Named entity: thickapprox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2248"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thicksim", 
+            "description": "Bad named entity: thicksim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&thicksim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thicksim;", 
+            "description": "Named entity: thicksim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thinsp", 
+            "description": "Bad named entity: thinsp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&thinsp"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thinsp;", 
+            "description": "Named entity: thinsp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2009"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thkap", 
+            "description": "Bad named entity: thkap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&thkap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thkap;", 
+            "description": "Named entity: thkap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2248"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thksim", 
+            "description": "Bad named entity: thksim without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&thksim"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thksim;", 
+            "description": "Named entity: thksim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thorn", 
+            "description": "Named entity: thorn without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00fe"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thorn;", 
+            "description": "Named entity: thorn; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00fe"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tilde", 
+            "description": "Bad named entity: tilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&tilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tilde;", 
+            "description": "Named entity: tilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02dc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&times", 
+            "description": "Named entity: times without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00d7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&times;", 
+            "description": "Named entity: times; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00d7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&timesb;", 
+            "description": "Named entity: timesb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&timesbar;", 
+            "description": "Named entity: timesbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a31"
+                ]
+            ]
+        }, 
+        {
+            "input": "&timesd;", 
+            "description": "Named entity: timesd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a30"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tint", 
+            "description": "Bad named entity: tint without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&tint"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tint;", 
+            "description": "Named entity: tint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&toea", 
+            "description": "Bad named entity: toea without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&toea"
+                ]
+            ]
+        }, 
+        {
+            "input": "&toea;", 
+            "description": "Named entity: toea; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2928"
+                ]
+            ]
+        }, 
+        {
+            "input": "&top", 
+            "description": "Bad named entity: top without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&top"
+                ]
+            ]
+        }, 
+        {
+            "input": "&top;", 
+            "description": "Named entity: top; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&topbot", 
+            "description": "Bad named entity: topbot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&topbot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&topbot;", 
+            "description": "Named entity: topbot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2336"
+                ]
+            ]
+        }, 
+        {
+            "input": "&topcir", 
+            "description": "Bad named entity: topcir without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&topcir"
+                ]
+            ]
+        }, 
+        {
+            "input": "&topcir;", 
+            "description": "Named entity: topcir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2af1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&topf", 
+            "description": "Bad named entity: topf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&topf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&topf;", 
+            "description": "Named entity: topf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd65"
+                ]
+            ]
+        }, 
+        {
+            "input": "&topfork", 
+            "description": "Bad named entity: topfork without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&topfork"
+                ]
+            ]
+        }, 
+        {
+            "input": "&topfork;", 
+            "description": "Named entity: topfork; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ada"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tosa", 
+            "description": "Bad named entity: tosa without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&tosa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tosa;", 
+            "description": "Named entity: tosa; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2929"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tprime", 
+            "description": "Bad named entity: tprime without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&tprime"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tprime;", 
+            "description": "Named entity: tprime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2034"
+                ]
+            ]
+        }, 
+        {
+            "input": "&trade", 
+            "description": "Bad named entity: trade without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&trade"
+                ]
+            ]
+        }, 
+        {
+            "input": "&trade;", 
+            "description": "Named entity: trade; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2122"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triangle", 
+            "description": "Bad named entity: triangle without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&triangle"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triangle;", 
+            "description": "Named entity: triangle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triangledown", 
+            "description": "Bad named entity: triangledown without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&triangledown"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triangledown;", 
+            "description": "Named entity: triangledown; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25bf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triangleleft", 
+            "description": "Bad named entity: triangleleft without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&triangleleft"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triangleleft;", 
+            "description": "Named entity: triangleleft; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&trianglelefteq", 
+            "description": "Bad named entity: trianglelefteq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&trianglelefteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&trianglelefteq;", 
+            "description": "Named entity: trianglelefteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triangleq", 
+            "description": "Bad named entity: triangleq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&triangleq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triangleq;", 
+            "description": "Named entity: triangleq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u225c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triangleright", 
+            "description": "Bad named entity: triangleright without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&triangleright"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triangleright;", 
+            "description": "Named entity: triangleright; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&trianglerighteq", 
+            "description": "Bad named entity: trianglerighteq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&trianglerighteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&trianglerighteq;", 
+            "description": "Named entity: trianglerighteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tridot", 
+            "description": "Bad named entity: tridot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&tridot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tridot;", 
+            "description": "Named entity: tridot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25ec"
+                ]
+            ]
+        }, 
+        {
+            "input": "&trie", 
+            "description": "Bad named entity: trie without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&trie"
+                ]
+            ]
+        }, 
+        {
+            "input": "&trie;", 
+            "description": "Named entity: trie; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u225c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triminus", 
+            "description": "Bad named entity: triminus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&triminus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triminus;", 
+            "description": "Named entity: triminus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a3a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triplus", 
+            "description": "Bad named entity: triplus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&triplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triplus;", 
+            "description": "Named entity: triplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a39"
+                ]
+            ]
+        }, 
+        {
+            "input": "&trisb", 
+            "description": "Bad named entity: trisb without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&trisb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&trisb;", 
+            "description": "Named entity: trisb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29cd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tritime", 
+            "description": "Bad named entity: tritime without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&tritime"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tritime;", 
+            "description": "Named entity: tritime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a3b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&trpezium", 
+            "description": "Bad named entity: trpezium without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&trpezium"
+                ]
+            ]
+        }, 
+        {
+            "input": "&trpezium;", 
+            "description": "Named entity: trpezium; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23e2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tscr", 
+            "description": "Bad named entity: tscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&tscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tscr;", 
+            "description": "Named entity: tscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcc9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tscy", 
+            "description": "Bad named entity: tscy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&tscy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tscy;", 
+            "description": "Named entity: tscy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0446"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tshcy", 
+            "description": "Bad named entity: tshcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&tshcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tshcy;", 
+            "description": "Named entity: tshcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u045b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tstrok", 
+            "description": "Bad named entity: tstrok without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&tstrok"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tstrok;", 
+            "description": "Named entity: tstrok; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0167"
+                ]
+            ]
+        }, 
+        {
+            "input": "&twixt", 
+            "description": "Bad named entity: twixt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&twixt"
+                ]
+            ]
+        }, 
+        {
+            "input": "&twixt;", 
+            "description": "Named entity: twixt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&twoheadleftarrow", 
+            "description": "Bad named entity: twoheadleftarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&twoheadleftarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&twoheadleftarrow;", 
+            "description": "Named entity: twoheadleftarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u219e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&twoheadrightarrow", 
+            "description": "Bad named entity: twoheadrightarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&twoheadrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&twoheadrightarrow;", 
+            "description": "Named entity: twoheadrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uArr", 
+            "description": "Bad named entity: uArr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&uArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uArr;", 
+            "description": "Named entity: uArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uHar", 
+            "description": "Bad named entity: uHar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&uHar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uHar;", 
+            "description": "Named entity: uHar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2963"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uacute", 
+            "description": "Named entity: uacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00fa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uacute;", 
+            "description": "Named entity: uacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00fa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uarr", 
+            "description": "Bad named entity: uarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&uarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uarr;", 
+            "description": "Named entity: uarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2191"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ubrcy", 
+            "description": "Bad named entity: ubrcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ubrcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ubrcy;", 
+            "description": "Named entity: ubrcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u045e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ubreve", 
+            "description": "Bad named entity: ubreve without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ubreve"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ubreve;", 
+            "description": "Named entity: ubreve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u016d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ucirc", 
+            "description": "Named entity: ucirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00fb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ucirc;", 
+            "description": "Named entity: ucirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00fb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ucy", 
+            "description": "Bad named entity: ucy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ucy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ucy;", 
+            "description": "Named entity: ucy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0443"
+                ]
+            ]
+        }, 
+        {
+            "input": "&udarr", 
+            "description": "Bad named entity: udarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&udarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&udarr;", 
+            "description": "Named entity: udarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&udblac", 
+            "description": "Bad named entity: udblac without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&udblac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&udblac;", 
+            "description": "Named entity: udblac; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0171"
+                ]
+            ]
+        }, 
+        {
+            "input": "&udhar", 
+            "description": "Bad named entity: udhar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&udhar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&udhar;", 
+            "description": "Named entity: udhar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u296e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ufisht", 
+            "description": "Bad named entity: ufisht without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ufisht"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ufisht;", 
+            "description": "Named entity: ufisht; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u297e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ufr", 
+            "description": "Bad named entity: ufr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ufr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ufr;", 
+            "description": "Named entity: ufr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd32"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ugrave", 
+            "description": "Named entity: ugrave without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00f9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ugrave;", 
+            "description": "Named entity: ugrave; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uharl", 
+            "description": "Bad named entity: uharl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&uharl"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uharl;", 
+            "description": "Named entity: uharl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uharr", 
+            "description": "Bad named entity: uharr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&uharr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uharr;", 
+            "description": "Named entity: uharr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21be"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uhblk", 
+            "description": "Bad named entity: uhblk without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&uhblk"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uhblk;", 
+            "description": "Named entity: uhblk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2580"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ulcorn", 
+            "description": "Bad named entity: ulcorn without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ulcorn"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ulcorn;", 
+            "description": "Named entity: ulcorn; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u231c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ulcorner", 
+            "description": "Bad named entity: ulcorner without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ulcorner"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ulcorner;", 
+            "description": "Named entity: ulcorner; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u231c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ulcrop", 
+            "description": "Bad named entity: ulcrop without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ulcrop"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ulcrop;", 
+            "description": "Named entity: ulcrop; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u230f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ultri", 
+            "description": "Bad named entity: ultri without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ultri"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ultri;", 
+            "description": "Named entity: ultri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25f8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&umacr", 
+            "description": "Bad named entity: umacr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&umacr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&umacr;", 
+            "description": "Named entity: umacr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u016b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uml", 
+            "description": "Named entity: uml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uml;", 
+            "description": "Named entity: uml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uogon", 
+            "description": "Bad named entity: uogon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&uogon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uogon;", 
+            "description": "Named entity: uogon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0173"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uopf", 
+            "description": "Bad named entity: uopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&uopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uopf;", 
+            "description": "Named entity: uopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd66"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uparrow", 
+            "description": "Bad named entity: uparrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&uparrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uparrow;", 
+            "description": "Named entity: uparrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2191"
+                ]
+            ]
+        }, 
+        {
+            "input": "&updownarrow", 
+            "description": "Bad named entity: updownarrow without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&updownarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "&updownarrow;", 
+            "description": "Named entity: updownarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2195"
+                ]
+            ]
+        }, 
+        {
+            "input": "&upharpoonleft", 
+            "description": "Bad named entity: upharpoonleft without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&upharpoonleft"
+                ]
+            ]
+        }, 
+        {
+            "input": "&upharpoonleft;", 
+            "description": "Named entity: upharpoonleft; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&upharpoonright", 
+            "description": "Bad named entity: upharpoonright without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&upharpoonright"
+                ]
+            ]
+        }, 
+        {
+            "input": "&upharpoonright;", 
+            "description": "Named entity: upharpoonright; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21be"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uplus", 
+            "description": "Bad named entity: uplus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&uplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uplus;", 
+            "description": "Named entity: uplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&upsi", 
+            "description": "Bad named entity: upsi without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&upsi"
+                ]
+            ]
+        }, 
+        {
+            "input": "&upsi;", 
+            "description": "Named entity: upsi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&upsih", 
+            "description": "Bad named entity: upsih without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&upsih"
+                ]
+            ]
+        }, 
+        {
+            "input": "&upsih;", 
+            "description": "Named entity: upsih; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&upsilon", 
+            "description": "Bad named entity: upsilon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&upsilon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&upsilon;", 
+            "description": "Named entity: upsilon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&upuparrows", 
+            "description": "Bad named entity: upuparrows without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&upuparrows"
+                ]
+            ]
+        }, 
+        {
+            "input": "&upuparrows;", 
+            "description": "Named entity: upuparrows; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&urcorn", 
+            "description": "Bad named entity: urcorn without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&urcorn"
+                ]
+            ]
+        }, 
+        {
+            "input": "&urcorn;", 
+            "description": "Named entity: urcorn; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u231d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&urcorner", 
+            "description": "Bad named entity: urcorner without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&urcorner"
+                ]
+            ]
+        }, 
+        {
+            "input": "&urcorner;", 
+            "description": "Named entity: urcorner; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u231d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&urcrop", 
+            "description": "Bad named entity: urcrop without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&urcrop"
+                ]
+            ]
+        }, 
+        {
+            "input": "&urcrop;", 
+            "description": "Named entity: urcrop; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u230e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uring", 
+            "description": "Bad named entity: uring without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&uring"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uring;", 
+            "description": "Named entity: uring; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u016f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&urtri", 
+            "description": "Bad named entity: urtri without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&urtri"
+                ]
+            ]
+        }, 
+        {
+            "input": "&urtri;", 
+            "description": "Named entity: urtri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25f9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uscr", 
+            "description": "Bad named entity: uscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&uscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uscr;", 
+            "description": "Named entity: uscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcca"
+                ]
+            ]
+        }, 
+        {
+            "input": "&utdot", 
+            "description": "Bad named entity: utdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&utdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&utdot;", 
+            "description": "Named entity: utdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&utilde", 
+            "description": "Bad named entity: utilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&utilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "&utilde;", 
+            "description": "Named entity: utilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0169"
+                ]
+            ]
+        }, 
+        {
+            "input": "&utri", 
+            "description": "Bad named entity: utri without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&utri"
+                ]
+            ]
+        }, 
+        {
+            "input": "&utri;", 
+            "description": "Named entity: utri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&utrif", 
+            "description": "Bad named entity: utrif without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&utrif"
+                ]
+            ]
+        }, 
+        {
+            "input": "&utrif;", 
+            "description": "Named entity: utrif; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uuarr", 
+            "description": "Bad named entity: uuarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&uuarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uuarr;", 
+            "description": "Named entity: uuarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uuml", 
+            "description": "Named entity: uuml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00fc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uuml;", 
+            "description": "Named entity: uuml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00fc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uwangle", 
+            "description": "Bad named entity: uwangle without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&uwangle"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uwangle;", 
+            "description": "Named entity: uwangle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29a7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vArr", 
+            "description": "Bad named entity: vArr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vArr;", 
+            "description": "Named entity: vArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vBar", 
+            "description": "Bad named entity: vBar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vBar;", 
+            "description": "Named entity: vBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ae8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vBarv", 
+            "description": "Bad named entity: vBarv without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vBarv"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vBarv;", 
+            "description": "Named entity: vBarv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ae9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vDash", 
+            "description": "Bad named entity: vDash without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vDash"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vDash;", 
+            "description": "Named entity: vDash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vangrt", 
+            "description": "Bad named entity: vangrt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vangrt"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vangrt;", 
+            "description": "Named entity: vangrt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u299c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varepsilon", 
+            "description": "Bad named entity: varepsilon without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&varepsilon"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varepsilon;", 
+            "description": "Named entity: varepsilon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varkappa", 
+            "description": "Bad named entity: varkappa without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&varkappa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varkappa;", 
+            "description": "Named entity: varkappa; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03f0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varnothing", 
+            "description": "Bad named entity: varnothing without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&varnothing"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varnothing;", 
+            "description": "Named entity: varnothing; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2205"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varphi", 
+            "description": "Bad named entity: varphi without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&varphi"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varphi;", 
+            "description": "Named entity: varphi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03d5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varpi", 
+            "description": "Bad named entity: varpi without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&varpi"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varpi;", 
+            "description": "Named entity: varpi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03d6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varpropto", 
+            "description": "Bad named entity: varpropto without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&varpropto"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varpropto;", 
+            "description": "Named entity: varpropto; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u221d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varr", 
+            "description": "Bad named entity: varr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&varr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varr;", 
+            "description": "Named entity: varr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2195"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varrho", 
+            "description": "Bad named entity: varrho without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&varrho"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varrho;", 
+            "description": "Named entity: varrho; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03f1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varsigma", 
+            "description": "Bad named entity: varsigma without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&varsigma"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varsigma;", 
+            "description": "Named entity: varsigma; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varsubsetneq", 
+            "description": "Bad named entity: varsubsetneq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&varsubsetneq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varsubsetneq;", 
+            "description": "Named entity: varsubsetneq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228a\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varsubsetneqq", 
+            "description": "Bad named entity: varsubsetneqq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&varsubsetneqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varsubsetneqq;", 
+            "description": "Named entity: varsubsetneqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2acb\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varsupsetneq", 
+            "description": "Bad named entity: varsupsetneq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&varsupsetneq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varsupsetneq;", 
+            "description": "Named entity: varsupsetneq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228b\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varsupsetneqq", 
+            "description": "Bad named entity: varsupsetneqq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&varsupsetneqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varsupsetneqq;", 
+            "description": "Named entity: varsupsetneqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2acc\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vartheta", 
+            "description": "Bad named entity: vartheta without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vartheta"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vartheta;", 
+            "description": "Named entity: vartheta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03d1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vartriangleleft", 
+            "description": "Bad named entity: vartriangleleft without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vartriangleleft"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vartriangleleft;", 
+            "description": "Named entity: vartriangleleft; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vartriangleright", 
+            "description": "Bad named entity: vartriangleright without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vartriangleright"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vartriangleright;", 
+            "description": "Named entity: vartriangleright; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vcy", 
+            "description": "Bad named entity: vcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vcy;", 
+            "description": "Named entity: vcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0432"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vdash", 
+            "description": "Bad named entity: vdash without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vdash"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vdash;", 
+            "description": "Named entity: vdash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vee", 
+            "description": "Bad named entity: vee without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vee;", 
+            "description": "Named entity: vee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2228"
+                ]
+            ]
+        }, 
+        {
+            "input": "&veebar", 
+            "description": "Bad named entity: veebar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&veebar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&veebar;", 
+            "description": "Named entity: veebar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22bb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&veeeq", 
+            "description": "Bad named entity: veeeq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&veeeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&veeeq;", 
+            "description": "Named entity: veeeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u225a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vellip", 
+            "description": "Bad named entity: vellip without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vellip"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vellip;", 
+            "description": "Named entity: vellip; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&verbar", 
+            "description": "Bad named entity: verbar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&verbar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&verbar;", 
+            "description": "Named entity: verbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "|"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vert", 
+            "description": "Bad named entity: vert without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vert"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vert;", 
+            "description": "Named entity: vert; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "|"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vfr", 
+            "description": "Bad named entity: vfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vfr;", 
+            "description": "Named entity: vfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd33"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vltri", 
+            "description": "Bad named entity: vltri without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vltri"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vltri;", 
+            "description": "Named entity: vltri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vnsub", 
+            "description": "Bad named entity: vnsub without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vnsub"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vnsub;", 
+            "description": "Named entity: vnsub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2282\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vnsup", 
+            "description": "Bad named entity: vnsup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vnsup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vnsup;", 
+            "description": "Named entity: vnsup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2283\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vopf", 
+            "description": "Bad named entity: vopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vopf;", 
+            "description": "Named entity: vopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd67"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vprop", 
+            "description": "Bad named entity: vprop without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vprop"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vprop;", 
+            "description": "Named entity: vprop; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u221d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vrtri", 
+            "description": "Bad named entity: vrtri without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vrtri"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vrtri;", 
+            "description": "Named entity: vrtri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vscr", 
+            "description": "Bad named entity: vscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vscr;", 
+            "description": "Named entity: vscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udccb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vsubnE", 
+            "description": "Bad named entity: vsubnE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vsubnE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vsubnE;", 
+            "description": "Named entity: vsubnE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2acb\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vsubne", 
+            "description": "Bad named entity: vsubne without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vsubne"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vsubne;", 
+            "description": "Named entity: vsubne; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228a\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vsupnE", 
+            "description": "Bad named entity: vsupnE without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vsupnE"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vsupnE;", 
+            "description": "Named entity: vsupnE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2acc\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vsupne", 
+            "description": "Bad named entity: vsupne without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vsupne"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vsupne;", 
+            "description": "Named entity: vsupne; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228b\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vzigzag", 
+            "description": "Bad named entity: vzigzag without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&vzigzag"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vzigzag;", 
+            "description": "Named entity: vzigzag; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u299a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wcirc", 
+            "description": "Bad named entity: wcirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&wcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wcirc;", 
+            "description": "Named entity: wcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0175"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wedbar", 
+            "description": "Bad named entity: wedbar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&wedbar"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wedbar;", 
+            "description": "Named entity: wedbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a5f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wedge", 
+            "description": "Bad named entity: wedge without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&wedge"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wedge;", 
+            "description": "Named entity: wedge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2227"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wedgeq", 
+            "description": "Bad named entity: wedgeq without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&wedgeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wedgeq;", 
+            "description": "Named entity: wedgeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2259"
+                ]
+            ]
+        }, 
+        {
+            "input": "&weierp", 
+            "description": "Bad named entity: weierp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&weierp"
+                ]
+            ]
+        }, 
+        {
+            "input": "&weierp;", 
+            "description": "Named entity: weierp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2118"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wfr", 
+            "description": "Bad named entity: wfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&wfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wfr;", 
+            "description": "Named entity: wfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd34"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wopf", 
+            "description": "Bad named entity: wopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&wopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wopf;", 
+            "description": "Named entity: wopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd68"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wp", 
+            "description": "Bad named entity: wp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&wp"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wp;", 
+            "description": "Named entity: wp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2118"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wr", 
+            "description": "Bad named entity: wr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&wr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wr;", 
+            "description": "Named entity: wr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2240"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wreath", 
+            "description": "Bad named entity: wreath without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&wreath"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wreath;", 
+            "description": "Named entity: wreath; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2240"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wscr", 
+            "description": "Bad named entity: wscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&wscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wscr;", 
+            "description": "Named entity: wscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udccc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xcap", 
+            "description": "Bad named entity: xcap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xcap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xcap;", 
+            "description": "Named entity: xcap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xcirc", 
+            "description": "Bad named entity: xcirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xcirc;", 
+            "description": "Named entity: xcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25ef"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xcup", 
+            "description": "Bad named entity: xcup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xcup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xcup;", 
+            "description": "Named entity: xcup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xdtri", 
+            "description": "Bad named entity: xdtri without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xdtri"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xdtri;", 
+            "description": "Named entity: xdtri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25bd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xfr", 
+            "description": "Bad named entity: xfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xfr;", 
+            "description": "Named entity: xfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd35"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xhArr", 
+            "description": "Bad named entity: xhArr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xhArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xhArr;", 
+            "description": "Named entity: xhArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27fa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xharr", 
+            "description": "Bad named entity: xharr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xharr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xharr;", 
+            "description": "Named entity: xharr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xi", 
+            "description": "Bad named entity: xi without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xi"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xi;", 
+            "description": "Named entity: xi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03be"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xlArr", 
+            "description": "Bad named entity: xlArr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xlArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xlArr;", 
+            "description": "Named entity: xlArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xlarr", 
+            "description": "Bad named entity: xlarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xlarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xlarr;", 
+            "description": "Named entity: xlarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xmap", 
+            "description": "Bad named entity: xmap without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xmap"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xmap;", 
+            "description": "Named entity: xmap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27fc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xnis", 
+            "description": "Bad named entity: xnis without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xnis"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xnis;", 
+            "description": "Named entity: xnis; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22fb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xodot", 
+            "description": "Bad named entity: xodot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xodot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xodot;", 
+            "description": "Named entity: xodot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xopf", 
+            "description": "Bad named entity: xopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xopf;", 
+            "description": "Named entity: xopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd69"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xoplus", 
+            "description": "Bad named entity: xoplus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xoplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xoplus;", 
+            "description": "Named entity: xoplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a01"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xotime", 
+            "description": "Bad named entity: xotime without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xotime"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xotime;", 
+            "description": "Named entity: xotime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a02"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xrArr", 
+            "description": "Bad named entity: xrArr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xrArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xrArr;", 
+            "description": "Named entity: xrArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xrarr", 
+            "description": "Bad named entity: xrarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xrarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xrarr;", 
+            "description": "Named entity: xrarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xscr", 
+            "description": "Bad named entity: xscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xscr;", 
+            "description": "Named entity: xscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udccd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xsqcup", 
+            "description": "Bad named entity: xsqcup without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xsqcup"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xsqcup;", 
+            "description": "Named entity: xsqcup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a06"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xuplus", 
+            "description": "Bad named entity: xuplus without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xuplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xuplus;", 
+            "description": "Named entity: xuplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a04"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xutri", 
+            "description": "Bad named entity: xutri without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xutri"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xutri;", 
+            "description": "Named entity: xutri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xvee", 
+            "description": "Bad named entity: xvee without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xvee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xvee;", 
+            "description": "Named entity: xvee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xwedge", 
+            "description": "Bad named entity: xwedge without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&xwedge"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xwedge;", 
+            "description": "Named entity: xwedge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yacute", 
+            "description": "Named entity: yacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00fd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yacute;", 
+            "description": "Named entity: yacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00fd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yacy", 
+            "description": "Bad named entity: yacy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&yacy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yacy;", 
+            "description": "Named entity: yacy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u044f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ycirc", 
+            "description": "Bad named entity: ycirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ycirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ycirc;", 
+            "description": "Named entity: ycirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0177"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ycy", 
+            "description": "Bad named entity: ycy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&ycy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ycy;", 
+            "description": "Named entity: ycy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u044b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yen", 
+            "description": "Named entity: yen without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yen;", 
+            "description": "Named entity: yen; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yfr", 
+            "description": "Bad named entity: yfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&yfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yfr;", 
+            "description": "Named entity: yfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd36"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yicy", 
+            "description": "Bad named entity: yicy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&yicy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yicy;", 
+            "description": "Named entity: yicy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0457"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yopf", 
+            "description": "Bad named entity: yopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&yopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yopf;", 
+            "description": "Named entity: yopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd6a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yscr", 
+            "description": "Bad named entity: yscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&yscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yscr;", 
+            "description": "Named entity: yscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcce"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yucy", 
+            "description": "Bad named entity: yucy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&yucy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yucy;", 
+            "description": "Named entity: yucy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u044e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yuml", 
+            "description": "Named entity: yuml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ff"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yuml;", 
+            "description": "Named entity: yuml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ff"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zacute", 
+            "description": "Bad named entity: zacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&zacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zacute;", 
+            "description": "Named entity: zacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u017a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zcaron", 
+            "description": "Bad named entity: zcaron without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&zcaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zcaron;", 
+            "description": "Named entity: zcaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u017e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zcy", 
+            "description": "Bad named entity: zcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&zcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zcy;", 
+            "description": "Named entity: zcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0437"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zdot", 
+            "description": "Bad named entity: zdot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&zdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zdot;", 
+            "description": "Named entity: zdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u017c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zeetrf", 
+            "description": "Bad named entity: zeetrf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&zeetrf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zeetrf;", 
+            "description": "Named entity: zeetrf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2128"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zeta", 
+            "description": "Bad named entity: zeta without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&zeta"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zeta;", 
+            "description": "Named entity: zeta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03b6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zfr", 
+            "description": "Bad named entity: zfr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&zfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zfr;", 
+            "description": "Named entity: zfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd37"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zhcy", 
+            "description": "Bad named entity: zhcy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&zhcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zhcy;", 
+            "description": "Named entity: zhcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0436"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zigrarr", 
+            "description": "Bad named entity: zigrarr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&zigrarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zigrarr;", 
+            "description": "Named entity: zigrarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21dd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zopf", 
+            "description": "Bad named entity: zopf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&zopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zopf;", 
+            "description": "Named entity: zopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd6b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zscr", 
+            "description": "Bad named entity: zscr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&zscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zscr;", 
+            "description": "Named entity: zscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udccf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zwj", 
+            "description": "Bad named entity: zwj without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&zwj"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zwj;", 
+            "description": "Named entity: zwj; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zwnj", 
+            "description": "Bad named entity: zwnj without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&zwnj"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zwnj;", 
+            "description": "Named entity: zwnj; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200c"
+                ]
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/html/test/data/tokenizer/numericEntities.test b/mojo/public/dart/third_party/html/test/data/tokenizer/numericEntities.test
new file mode 100644
index 0000000..36c8228
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tokenizer/numericEntities.test
@@ -0,0 +1,1313 @@
+{"tests": [
+
+{"description": "Invalid numeric entity character U+0000",
+"input": "&#x0000;",
+"output": ["ParseError", ["Character", "\uFFFD"]]},
+
+{"description": "Invalid numeric entity character U+0001",
+"input": "&#x0001;",
+"output": ["ParseError", ["Character", "\u0001"]]},
+
+{"description": "Invalid numeric entity character U+0002",
+"input": "&#x0002;",
+"output": ["ParseError", ["Character", "\u0002"]]},
+
+{"description": "Invalid numeric entity character U+0003",
+"input": "&#x0003;",
+"output": ["ParseError", ["Character", "\u0003"]]},
+
+{"description": "Invalid numeric entity character U+0004",
+"input": "&#x0004;",
+"output": ["ParseError", ["Character", "\u0004"]]},
+
+{"description": "Invalid numeric entity character U+0005",
+"input": "&#x0005;",
+"output": ["ParseError", ["Character", "\u0005"]]},
+
+{"description": "Invalid numeric entity character U+0006",
+"input": "&#x0006;",
+"output": ["ParseError", ["Character", "\u0006"]]},
+
+{"description": "Invalid numeric entity character U+0007",
+"input": "&#x0007;",
+"output": ["ParseError", ["Character", "\u0007"]]},
+
+{"description": "Invalid numeric entity character U+0008",
+"input": "&#x0008;",
+"output": ["ParseError", ["Character", "\u0008"]]},
+
+{"description": "Invalid numeric entity character U+000B",
+"input": "&#x000b;",
+"output": ["ParseError", ["Character", "\u000b"]]},
+
+{"description": "Invalid numeric entity character U+000E",
+"input": "&#x000e;",
+"output": ["ParseError", ["Character", "\u000e"]]},
+
+{"description": "Invalid numeric entity character U+000F",
+"input": "&#x000f;",
+"output": ["ParseError", ["Character", "\u000f"]]},
+
+{"description": "Invalid numeric entity character U+0010",
+"input": "&#x0010;",
+"output": ["ParseError", ["Character", "\u0010"]]},
+
+{"description": "Invalid numeric entity character U+0011",
+"input": "&#x0011;",
+"output": ["ParseError", ["Character", "\u0011"]]},
+
+{"description": "Invalid numeric entity character U+0012",
+"input": "&#x0012;",
+"output": ["ParseError", ["Character", "\u0012"]]},
+
+{"description": "Invalid numeric entity character U+0013",
+"input": "&#x0013;",
+"output": ["ParseError", ["Character", "\u0013"]]},
+
+{"description": "Invalid numeric entity character U+0014",
+"input": "&#x0014;",
+"output": ["ParseError", ["Character", "\u0014"]]},
+
+{"description": "Invalid numeric entity character U+0015",
+"input": "&#x0015;",
+"output": ["ParseError", ["Character", "\u0015"]]},
+
+{"description": "Invalid numeric entity character U+0016",
+"input": "&#x0016;",
+"output": ["ParseError", ["Character", "\u0016"]]},
+
+{"description": "Invalid numeric entity character U+0017",
+"input": "&#x0017;",
+"output": ["ParseError", ["Character", "\u0017"]]},
+
+{"description": "Invalid numeric entity character U+0018",
+"input": "&#x0018;",
+"output": ["ParseError", ["Character", "\u0018"]]},
+
+{"description": "Invalid numeric entity character U+0019",
+"input": "&#x0019;",
+"output": ["ParseError", ["Character", "\u0019"]]},
+
+{"description": "Invalid numeric entity character U+001A",
+"input": "&#x001a;",
+"output": ["ParseError", ["Character", "\u001a"]]},
+
+{"description": "Invalid numeric entity character U+001B",
+"input": "&#x001b;",
+"output": ["ParseError", ["Character", "\u001b"]]},
+
+{"description": "Invalid numeric entity character U+001C",
+"input": "&#x001c;",
+"output": ["ParseError", ["Character", "\u001c"]]},
+
+{"description": "Invalid numeric entity character U+001D",
+"input": "&#x001d;",
+"output": ["ParseError", ["Character", "\u001d"]]},
+
+{"description": "Invalid numeric entity character U+001E",
+"input": "&#x001e;",
+"output": ["ParseError", ["Character", "\u001e"]]},
+
+{"description": "Invalid numeric entity character U+001F",
+"input": "&#x001f;",
+"output": ["ParseError", ["Character", "\u001f"]]},
+
+{"description": "Invalid numeric entity character U+007F",
+"input": "&#x007f;",
+"output": ["ParseError", ["Character", "\u007f"]]},
+
+{"description": "Invalid numeric entity character U+D800",
+"input": "&#xd800;",
+"output": ["ParseError", ["Character", "\uFFFD"]]},
+
+{"description": "Invalid numeric entity character U+DFFF",
+"input": "&#xdfff;",
+"output": ["ParseError", ["Character", "\uFFFD"]]},
+
+{"description": "Invalid numeric entity character U+FDD0",
+"input": "&#xfdd0;",
+"output": ["ParseError", ["Character", "\ufdd0"]]},
+
+{"description": "Invalid numeric entity character U+FDD1",
+"input": "&#xfdd1;",
+"output": ["ParseError", ["Character", "\ufdd1"]]},
+
+{"description": "Invalid numeric entity character U+FDD2",
+"input": "&#xfdd2;",
+"output": ["ParseError", ["Character", "\ufdd2"]]},
+
+{"description": "Invalid numeric entity character U+FDD3",
+"input": "&#xfdd3;",
+"output": ["ParseError", ["Character", "\ufdd3"]]},
+
+{"description": "Invalid numeric entity character U+FDD4",
+"input": "&#xfdd4;",
+"output": ["ParseError", ["Character", "\ufdd4"]]},
+
+{"description": "Invalid numeric entity character U+FDD5",
+"input": "&#xfdd5;",
+"output": ["ParseError", ["Character", "\ufdd5"]]},
+
+{"description": "Invalid numeric entity character U+FDD6",
+"input": "&#xfdd6;",
+"output": ["ParseError", ["Character", "\ufdd6"]]},
+
+{"description": "Invalid numeric entity character U+FDD7",
+"input": "&#xfdd7;",
+"output": ["ParseError", ["Character", "\ufdd7"]]},
+
+{"description": "Invalid numeric entity character U+FDD8",
+"input": "&#xfdd8;",
+"output": ["ParseError", ["Character", "\ufdd8"]]},
+
+{"description": "Invalid numeric entity character U+FDD9",
+"input": "&#xfdd9;",
+"output": ["ParseError", ["Character", "\ufdd9"]]},
+
+{"description": "Invalid numeric entity character U+FDDA",
+"input": "&#xfdda;",
+"output": ["ParseError", ["Character", "\ufdda"]]},
+
+{"description": "Invalid numeric entity character U+FDDB",
+"input": "&#xfddb;",
+"output": ["ParseError", ["Character", "\ufddb"]]},
+
+{"description": "Invalid numeric entity character U+FDDC",
+"input": "&#xfddc;",
+"output": ["ParseError", ["Character", "\ufddc"]]},
+
+{"description": "Invalid numeric entity character U+FDDD",
+"input": "&#xfddd;",
+"output": ["ParseError", ["Character", "\ufddd"]]},
+
+{"description": "Invalid numeric entity character U+FDDE",
+"input": "&#xfdde;",
+"output": ["ParseError", ["Character", "\ufdde"]]},
+
+{"description": "Invalid numeric entity character U+FDDF",
+"input": "&#xfddf;",
+"output": ["ParseError", ["Character", "\ufddf"]]},
+
+{"description": "Invalid numeric entity character U+FDE0",
+"input": "&#xfde0;",
+"output": ["ParseError", ["Character", "\ufde0"]]},
+
+{"description": "Invalid numeric entity character U+FDE1",
+"input": "&#xfde1;",
+"output": ["ParseError", ["Character", "\ufde1"]]},
+
+{"description": "Invalid numeric entity character U+FDE2",
+"input": "&#xfde2;",
+"output": ["ParseError", ["Character", "\ufde2"]]},
+
+{"description": "Invalid numeric entity character U+FDE3",
+"input": "&#xfde3;",
+"output": ["ParseError", ["Character", "\ufde3"]]},
+
+{"description": "Invalid numeric entity character U+FDE4",
+"input": "&#xfde4;",
+"output": ["ParseError", ["Character", "\ufde4"]]},
+
+{"description": "Invalid numeric entity character U+FDE5",
+"input": "&#xfde5;",
+"output": ["ParseError", ["Character", "\ufde5"]]},
+
+{"description": "Invalid numeric entity character U+FDE6",
+"input": "&#xfde6;",
+"output": ["ParseError", ["Character", "\ufde6"]]},
+
+{"description": "Invalid numeric entity character U+FDE7",
+"input": "&#xfde7;",
+"output": ["ParseError", ["Character", "\ufde7"]]},
+
+{"description": "Invalid numeric entity character U+FDE8",
+"input": "&#xfde8;",
+"output": ["ParseError", ["Character", "\ufde8"]]},
+
+{"description": "Invalid numeric entity character U+FDE9",
+"input": "&#xfde9;",
+"output": ["ParseError", ["Character", "\ufde9"]]},
+
+{"description": "Invalid numeric entity character U+FDEA",
+"input": "&#xfdea;",
+"output": ["ParseError", ["Character", "\ufdea"]]},
+
+{"description": "Invalid numeric entity character U+FDEB",
+"input": "&#xfdeb;",
+"output": ["ParseError", ["Character", "\ufdeb"]]},
+
+{"description": "Invalid numeric entity character U+FDEC",
+"input": "&#xfdec;",
+"output": ["ParseError", ["Character", "\ufdec"]]},
+
+{"description": "Invalid numeric entity character U+FDED",
+"input": "&#xfded;",
+"output": ["ParseError", ["Character", "\ufded"]]},
+
+{"description": "Invalid numeric entity character U+FDEE",
+"input": "&#xfdee;",
+"output": ["ParseError", ["Character", "\ufdee"]]},
+
+{"description": "Invalid numeric entity character U+FDEF",
+"input": "&#xfdef;",
+"output": ["ParseError", ["Character", "\ufdef"]]},
+
+{"description": "Invalid numeric entity character U+FFFE",
+"input": "&#xfffe;",
+"output": ["ParseError", ["Character", "\ufffe"]]},
+
+{"description": "Invalid numeric entity character U+FFFF",
+"input": "&#xffff;",
+"output": ["ParseError", ["Character", "\uffff"]]},
+
+{"description": "Invalid numeric entity character U+1FFFE",
+"input": "&#x1fffe;",
+"output": ["ParseError", ["Character", "\uD83F\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+1FFFF",
+"input": "&#x1ffff;",
+"output": ["ParseError", ["Character", "\uD83F\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+2FFFE",
+"input": "&#x2fffe;",
+"output": ["ParseError", ["Character", "\uD87F\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+2FFFF",
+"input": "&#x2ffff;",
+"output": ["ParseError", ["Character", "\uD87F\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+3FFFE",
+"input": "&#x3fffe;",
+"output": ["ParseError", ["Character", "\uD8BF\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+3FFFF",
+"input": "&#x3ffff;",
+"output": ["ParseError", ["Character", "\uD8BF\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+4FFFE",
+"input": "&#x4fffe;",
+"output": ["ParseError", ["Character", "\uD8FF\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+4FFFF",
+"input": "&#x4ffff;",
+"output": ["ParseError", ["Character", "\uD8FF\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+5FFFE",
+"input": "&#x5fffe;",
+"output": ["ParseError", ["Character", "\uD93F\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+5FFFF",
+"input": "&#x5ffff;",
+"output": ["ParseError", ["Character", "\uD93F\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+6FFFE",
+"input": "&#x6fffe;",
+"output": ["ParseError", ["Character", "\uD97F\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+6FFFF",
+"input": "&#x6ffff;",
+"output": ["ParseError", ["Character", "\uD97F\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+7FFFE",
+"input": "&#x7fffe;",
+"output": ["ParseError", ["Character", "\uD9BF\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+7FFFF",
+"input": "&#x7ffff;",
+"output": ["ParseError", ["Character", "\uD9BF\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+8FFFE",
+"input": "&#x8fffe;",
+"output": ["ParseError", ["Character", "\uD9FF\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+8FFFF",
+"input": "&#x8ffff;",
+"output": ["ParseError", ["Character", "\uD9FF\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+9FFFE",
+"input": "&#x9fffe;",
+"output": ["ParseError", ["Character", "\uDA3F\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+9FFFF",
+"input": "&#x9ffff;",
+"output": ["ParseError", ["Character", "\uDA3F\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+AFFFE",
+"input": "&#xafffe;",
+"output": ["ParseError", ["Character", "\uDA7F\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+AFFFF",
+"input": "&#xaffff;",
+"output": ["ParseError", ["Character", "\uDA7F\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+BFFFE",
+"input": "&#xbfffe;",
+"output": ["ParseError", ["Character", "\uDABF\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+BFFFF",
+"input": "&#xbffff;",
+"output": ["ParseError", ["Character", "\uDABF\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+CFFFE",
+"input": "&#xcfffe;",
+"output": ["ParseError", ["Character", "\uDAFF\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+CFFFF",
+"input": "&#xcffff;",
+"output": ["ParseError", ["Character", "\uDAFF\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+DFFFE",
+"input": "&#xdfffe;",
+"output": ["ParseError", ["Character", "\uDB3F\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+DFFFF",
+"input": "&#xdffff;",
+"output": ["ParseError", ["Character", "\uDB3F\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+EFFFE",
+"input": "&#xefffe;",
+"output": ["ParseError", ["Character", "\uDB7F\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+EFFFF",
+"input": "&#xeffff;",
+"output": ["ParseError", ["Character", "\uDB7F\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+FFFFE",
+"input": "&#xffffe;",
+"output": ["ParseError", ["Character", "\uDBBF\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+FFFFF",
+"input": "&#xfffff;",
+"output": ["ParseError", ["Character", "\uDBBF\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+10FFFE",
+"input": "&#x10fffe;",
+"output": ["ParseError", ["Character", "\uDBFF\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+10FFFF",
+"input": "&#x10ffff;",
+"output": ["ParseError", ["Character", "\uDBFF\uDFFF"]]},
+
+{"description": "Valid numeric entity character U+0009",
+"input": "&#x0009;",
+"output": [["Character", "\u0009"]]},
+
+{"description": "Valid numeric entity character U+000A",
+"input": "&#x000a;",
+"output": [["Character", "\u000A"]]},
+
+{"description": "Valid numeric entity character U+0020",
+"input": "&#x0020;",
+"output": [["Character", "\u0020"]]},
+
+{"description": "Valid numeric entity character U+0021",
+"input": "&#x0021;",
+"output": [["Character", "\u0021"]]},
+
+{"description": "Valid numeric entity character U+0022",
+"input": "&#x0022;",
+"output": [["Character", "\u0022"]]},
+
+{"description": "Valid numeric entity character U+0023",
+"input": "&#x0023;",
+"output": [["Character", "\u0023"]]},
+
+{"description": "Valid numeric entity character U+0024",
+"input": "&#x0024;",
+"output": [["Character", "\u0024"]]},
+
+{"description": "Valid numeric entity character U+0025",
+"input": "&#x0025;",
+"output": [["Character", "\u0025"]]},
+
+{"description": "Valid numeric entity character U+0026",
+"input": "&#x0026;",
+"output": [["Character", "\u0026"]]},
+
+{"description": "Valid numeric entity character U+0027",
+"input": "&#x0027;",
+"output": [["Character", "\u0027"]]},
+
+{"description": "Valid numeric entity character U+0028",
+"input": "&#x0028;",
+"output": [["Character", "\u0028"]]},
+
+{"description": "Valid numeric entity character U+0029",
+"input": "&#x0029;",
+"output": [["Character", "\u0029"]]},
+
+{"description": "Valid numeric entity character U+002A",
+"input": "&#x002a;",
+"output": [["Character", "\u002A"]]},
+
+{"description": "Valid numeric entity character U+002B",
+"input": "&#x002b;",
+"output": [["Character", "\u002B"]]},
+
+{"description": "Valid numeric entity character U+002C",
+"input": "&#x002c;",
+"output": [["Character", "\u002C"]]},
+
+{"description": "Valid numeric entity character U+002D",
+"input": "&#x002d;",
+"output": [["Character", "\u002D"]]},
+
+{"description": "Valid numeric entity character U+002E",
+"input": "&#x002e;",
+"output": [["Character", "\u002E"]]},
+
+{"description": "Valid numeric entity character U+002F",
+"input": "&#x002f;",
+"output": [["Character", "\u002F"]]},
+
+{"description": "Valid numeric entity character U+0030",
+"input": "&#x0030;",
+"output": [["Character", "\u0030"]]},
+
+{"description": "Valid numeric entity character U+0031",
+"input": "&#x0031;",
+"output": [["Character", "\u0031"]]},
+
+{"description": "Valid numeric entity character U+0032",
+"input": "&#x0032;",
+"output": [["Character", "\u0032"]]},
+
+{"description": "Valid numeric entity character U+0033",
+"input": "&#x0033;",
+"output": [["Character", "\u0033"]]},
+
+{"description": "Valid numeric entity character U+0034",
+"input": "&#x0034;",
+"output": [["Character", "\u0034"]]},
+
+{"description": "Valid numeric entity character U+0035",
+"input": "&#x0035;",
+"output": [["Character", "\u0035"]]},
+
+{"description": "Valid numeric entity character U+0036",
+"input": "&#x0036;",
+"output": [["Character", "\u0036"]]},
+
+{"description": "Valid numeric entity character U+0037",
+"input": "&#x0037;",
+"output": [["Character", "\u0037"]]},
+
+{"description": "Valid numeric entity character U+0038",
+"input": "&#x0038;",
+"output": [["Character", "\u0038"]]},
+
+{"description": "Valid numeric entity character U+0039",
+"input": "&#x0039;",
+"output": [["Character", "\u0039"]]},
+
+{"description": "Valid numeric entity character U+003A",
+"input": "&#x003a;",
+"output": [["Character", "\u003A"]]},
+
+{"description": "Valid numeric entity character U+003B",
+"input": "&#x003b;",
+"output": [["Character", "\u003B"]]},
+
+{"description": "Valid numeric entity character U+003C",
+"input": "&#x003c;",
+"output": [["Character", "\u003C"]]},
+
+{"description": "Valid numeric entity character U+003D",
+"input": "&#x003d;",
+"output": [["Character", "\u003D"]]},
+
+{"description": "Valid numeric entity character U+003E",
+"input": "&#x003e;",
+"output": [["Character", "\u003E"]]},
+
+{"description": "Valid numeric entity character U+003F",
+"input": "&#x003f;",
+"output": [["Character", "\u003F"]]},
+
+{"description": "Valid numeric entity character U+0040",
+"input": "&#x0040;",
+"output": [["Character", "\u0040"]]},
+
+{"description": "Valid numeric entity character U+0041",
+"input": "&#x0041;",
+"output": [["Character", "\u0041"]]},
+
+{"description": "Valid numeric entity character U+0042",
+"input": "&#x0042;",
+"output": [["Character", "\u0042"]]},
+
+{"description": "Valid numeric entity character U+0043",
+"input": "&#x0043;",
+"output": [["Character", "\u0043"]]},
+
+{"description": "Valid numeric entity character U+0044",
+"input": "&#x0044;",
+"output": [["Character", "\u0044"]]},
+
+{"description": "Valid numeric entity character U+0045",
+"input": "&#x0045;",
+"output": [["Character", "\u0045"]]},
+
+{"description": "Valid numeric entity character U+0046",
+"input": "&#x0046;",
+"output": [["Character", "\u0046"]]},
+
+{"description": "Valid numeric entity character U+0047",
+"input": "&#x0047;",
+"output": [["Character", "\u0047"]]},
+
+{"description": "Valid numeric entity character U+0048",
+"input": "&#x0048;",
+"output": [["Character", "\u0048"]]},
+
+{"description": "Valid numeric entity character U+0049",
+"input": "&#x0049;",
+"output": [["Character", "\u0049"]]},
+
+{"description": "Valid numeric entity character U+004A",
+"input": "&#x004a;",
+"output": [["Character", "\u004A"]]},
+
+{"description": "Valid numeric entity character U+004B",
+"input": "&#x004b;",
+"output": [["Character", "\u004B"]]},
+
+{"description": "Valid numeric entity character U+004C",
+"input": "&#x004c;",
+"output": [["Character", "\u004C"]]},
+
+{"description": "Valid numeric entity character U+004D",
+"input": "&#x004d;",
+"output": [["Character", "\u004D"]]},
+
+{"description": "Valid numeric entity character U+004E",
+"input": "&#x004e;",
+"output": [["Character", "\u004E"]]},
+
+{"description": "Valid numeric entity character U+004F",
+"input": "&#x004f;",
+"output": [["Character", "\u004F"]]},
+
+{"description": "Valid numeric entity character U+0050",
+"input": "&#x0050;",
+"output": [["Character", "\u0050"]]},
+
+{"description": "Valid numeric entity character U+0051",
+"input": "&#x0051;",
+"output": [["Character", "\u0051"]]},
+
+{"description": "Valid numeric entity character U+0052",
+"input": "&#x0052;",
+"output": [["Character", "\u0052"]]},
+
+{"description": "Valid numeric entity character U+0053",
+"input": "&#x0053;",
+"output": [["Character", "\u0053"]]},
+
+{"description": "Valid numeric entity character U+0054",
+"input": "&#x0054;",
+"output": [["Character", "\u0054"]]},
+
+{"description": "Valid numeric entity character U+0055",
+"input": "&#x0055;",
+"output": [["Character", "\u0055"]]},
+
+{"description": "Valid numeric entity character U+0056",
+"input": "&#x0056;",
+"output": [["Character", "\u0056"]]},
+
+{"description": "Valid numeric entity character U+0057",
+"input": "&#x0057;",
+"output": [["Character", "\u0057"]]},
+
+{"description": "Valid numeric entity character U+0058",
+"input": "&#x0058;",
+"output": [["Character", "\u0058"]]},
+
+{"description": "Valid numeric entity character U+0059",
+"input": "&#x0059;",
+"output": [["Character", "\u0059"]]},
+
+{"description": "Valid numeric entity character U+005A",
+"input": "&#x005a;",
+"output": [["Character", "\u005A"]]},
+
+{"description": "Valid numeric entity character U+005B",
+"input": "&#x005b;",
+"output": [["Character", "\u005B"]]},
+
+{"description": "Valid numeric entity character U+005C",
+"input": "&#x005c;",
+"output": [["Character", "\u005C"]]},
+
+{"description": "Valid numeric entity character U+005D",
+"input": "&#x005d;",
+"output": [["Character", "\u005D"]]},
+
+{"description": "Valid numeric entity character U+005E",
+"input": "&#x005e;",
+"output": [["Character", "\u005E"]]},
+
+{"description": "Valid numeric entity character U+005F",
+"input": "&#x005f;",
+"output": [["Character", "\u005F"]]},
+
+{"description": "Valid numeric entity character U+0060",
+"input": "&#x0060;",
+"output": [["Character", "\u0060"]]},
+
+{"description": "Valid numeric entity character U+0061",
+"input": "&#x0061;",
+"output": [["Character", "\u0061"]]},
+
+{"description": "Valid numeric entity character U+0062",
+"input": "&#x0062;",
+"output": [["Character", "\u0062"]]},
+
+{"description": "Valid numeric entity character U+0063",
+"input": "&#x0063;",
+"output": [["Character", "\u0063"]]},
+
+{"description": "Valid numeric entity character U+0064",
+"input": "&#x0064;",
+"output": [["Character", "\u0064"]]},
+
+{"description": "Valid numeric entity character U+0065",
+"input": "&#x0065;",
+"output": [["Character", "\u0065"]]},
+
+{"description": "Valid numeric entity character U+0066",
+"input": "&#x0066;",
+"output": [["Character", "\u0066"]]},
+
+{"description": "Valid numeric entity character U+0067",
+"input": "&#x0067;",
+"output": [["Character", "\u0067"]]},
+
+{"description": "Valid numeric entity character U+0068",
+"input": "&#x0068;",
+"output": [["Character", "\u0068"]]},
+
+{"description": "Valid numeric entity character U+0069",
+"input": "&#x0069;",
+"output": [["Character", "\u0069"]]},
+
+{"description": "Valid numeric entity character U+006A",
+"input": "&#x006a;",
+"output": [["Character", "\u006A"]]},
+
+{"description": "Valid numeric entity character U+006B",
+"input": "&#x006b;",
+"output": [["Character", "\u006B"]]},
+
+{"description": "Valid numeric entity character U+006C",
+"input": "&#x006c;",
+"output": [["Character", "\u006C"]]},
+
+{"description": "Valid numeric entity character U+006D",
+"input": "&#x006d;",
+"output": [["Character", "\u006D"]]},
+
+{"description": "Valid numeric entity character U+006E",
+"input": "&#x006e;",
+"output": [["Character", "\u006E"]]},
+
+{"description": "Valid numeric entity character U+006F",
+"input": "&#x006f;",
+"output": [["Character", "\u006F"]]},
+
+{"description": "Valid numeric entity character U+0070",
+"input": "&#x0070;",
+"output": [["Character", "\u0070"]]},
+
+{"description": "Valid numeric entity character U+0071",
+"input": "&#x0071;",
+"output": [["Character", "\u0071"]]},
+
+{"description": "Valid numeric entity character U+0072",
+"input": "&#x0072;",
+"output": [["Character", "\u0072"]]},
+
+{"description": "Valid numeric entity character U+0073",
+"input": "&#x0073;",
+"output": [["Character", "\u0073"]]},
+
+{"description": "Valid numeric entity character U+0074",
+"input": "&#x0074;",
+"output": [["Character", "\u0074"]]},
+
+{"description": "Valid numeric entity character U+0075",
+"input": "&#x0075;",
+"output": [["Character", "\u0075"]]},
+
+{"description": "Valid numeric entity character U+0076",
+"input": "&#x0076;",
+"output": [["Character", "\u0076"]]},
+
+{"description": "Valid numeric entity character U+0077",
+"input": "&#x0077;",
+"output": [["Character", "\u0077"]]},
+
+{"description": "Valid numeric entity character U+0078",
+"input": "&#x0078;",
+"output": [["Character", "\u0078"]]},
+
+{"description": "Valid numeric entity character U+0079",
+"input": "&#x0079;",
+"output": [["Character", "\u0079"]]},
+
+{"description": "Valid numeric entity character U+007A",
+"input": "&#x007a;",
+"output": [["Character", "\u007A"]]},
+
+{"description": "Valid numeric entity character U+007B",
+"input": "&#x007b;",
+"output": [["Character", "\u007B"]]},
+
+{"description": "Valid numeric entity character U+007C",
+"input": "&#x007c;",
+"output": [["Character", "\u007C"]]},
+
+{"description": "Valid numeric entity character U+007D",
+"input": "&#x007d;",
+"output": [["Character", "\u007D"]]},
+
+{"description": "Valid numeric entity character U+007E",
+"input": "&#x007e;",
+"output": [["Character", "\u007E"]]},
+
+{"description": "Valid numeric entity character U+00A0",
+"input": "&#x00a0;",
+"output": [["Character", "\u00A0"]]},
+
+{"description": "Valid numeric entity character U+00A1",
+"input": "&#x00a1;",
+"output": [["Character", "\u00A1"]]},
+
+{"description": "Valid numeric entity character U+00A2",
+"input": "&#x00a2;",
+"output": [["Character", "\u00A2"]]},
+
+{"description": "Valid numeric entity character U+00A3",
+"input": "&#x00a3;",
+"output": [["Character", "\u00A3"]]},
+
+{"description": "Valid numeric entity character U+00A4",
+"input": "&#x00a4;",
+"output": [["Character", "\u00A4"]]},
+
+{"description": "Valid numeric entity character U+00A5",
+"input": "&#x00a5;",
+"output": [["Character", "\u00A5"]]},
+
+{"description": "Valid numeric entity character U+00A6",
+"input": "&#x00a6;",
+"output": [["Character", "\u00A6"]]},
+
+{"description": "Valid numeric entity character U+00A7",
+"input": "&#x00a7;",
+"output": [["Character", "\u00A7"]]},
+
+{"description": "Valid numeric entity character U+00A8",
+"input": "&#x00a8;",
+"output": [["Character", "\u00A8"]]},
+
+{"description": "Valid numeric entity character U+00A9",
+"input": "&#x00a9;",
+"output": [["Character", "\u00A9"]]},
+
+{"description": "Valid numeric entity character U+00AA",
+"input": "&#x00aa;",
+"output": [["Character", "\u00AA"]]},
+
+{"description": "Valid numeric entity character U+00AB",
+"input": "&#x00ab;",
+"output": [["Character", "\u00AB"]]},
+
+{"description": "Valid numeric entity character U+00AC",
+"input": "&#x00ac;",
+"output": [["Character", "\u00AC"]]},
+
+{"description": "Valid numeric entity character U+00AD",
+"input": "&#x00ad;",
+"output": [["Character", "\u00AD"]]},
+
+{"description": "Valid numeric entity character U+00AE",
+"input": "&#x00ae;",
+"output": [["Character", "\u00AE"]]},
+
+{"description": "Valid numeric entity character U+00AF",
+"input": "&#x00af;",
+"output": [["Character", "\u00AF"]]},
+
+{"description": "Valid numeric entity character U+00B0",
+"input": "&#x00b0;",
+"output": [["Character", "\u00B0"]]},
+
+{"description": "Valid numeric entity character U+00B1",
+"input": "&#x00b1;",
+"output": [["Character", "\u00B1"]]},
+
+{"description": "Valid numeric entity character U+00B2",
+"input": "&#x00b2;",
+"output": [["Character", "\u00B2"]]},
+
+{"description": "Valid numeric entity character U+00B3",
+"input": "&#x00b3;",
+"output": [["Character", "\u00B3"]]},
+
+{"description": "Valid numeric entity character U+00B4",
+"input": "&#x00b4;",
+"output": [["Character", "\u00B4"]]},
+
+{"description": "Valid numeric entity character U+00B5",
+"input": "&#x00b5;",
+"output": [["Character", "\u00B5"]]},
+
+{"description": "Valid numeric entity character U+00B6",
+"input": "&#x00b6;",
+"output": [["Character", "\u00B6"]]},
+
+{"description": "Valid numeric entity character U+00B7",
+"input": "&#x00b7;",
+"output": [["Character", "\u00B7"]]},
+
+{"description": "Valid numeric entity character U+00B8",
+"input": "&#x00b8;",
+"output": [["Character", "\u00B8"]]},
+
+{"description": "Valid numeric entity character U+00B9",
+"input": "&#x00b9;",
+"output": [["Character", "\u00B9"]]},
+
+{"description": "Valid numeric entity character U+00BA",
+"input": "&#x00ba;",
+"output": [["Character", "\u00BA"]]},
+
+{"description": "Valid numeric entity character U+00BB",
+"input": "&#x00bb;",
+"output": [["Character", "\u00BB"]]},
+
+{"description": "Valid numeric entity character U+00BC",
+"input": "&#x00bc;",
+"output": [["Character", "\u00BC"]]},
+
+{"description": "Valid numeric entity character U+00BD",
+"input": "&#x00bd;",
+"output": [["Character", "\u00BD"]]},
+
+{"description": "Valid numeric entity character U+00BE",
+"input": "&#x00be;",
+"output": [["Character", "\u00BE"]]},
+
+{"description": "Valid numeric entity character U+00BF",
+"input": "&#x00bf;",
+"output": [["Character", "\u00BF"]]},
+
+{"description": "Valid numeric entity character U+00C0",
+"input": "&#x00c0;",
+"output": [["Character", "\u00C0"]]},
+
+{"description": "Valid numeric entity character U+00C1",
+"input": "&#x00c1;",
+"output": [["Character", "\u00C1"]]},
+
+{"description": "Valid numeric entity character U+00C2",
+"input": "&#x00c2;",
+"output": [["Character", "\u00C2"]]},
+
+{"description": "Valid numeric entity character U+00C3",
+"input": "&#x00c3;",
+"output": [["Character", "\u00C3"]]},
+
+{"description": "Valid numeric entity character U+00C4",
+"input": "&#x00c4;",
+"output": [["Character", "\u00C4"]]},
+
+{"description": "Valid numeric entity character U+00C5",
+"input": "&#x00c5;",
+"output": [["Character", "\u00C5"]]},
+
+{"description": "Valid numeric entity character U+00C6",
+"input": "&#x00c6;",
+"output": [["Character", "\u00C6"]]},
+
+{"description": "Valid numeric entity character U+00C7",
+"input": "&#x00c7;",
+"output": [["Character", "\u00C7"]]},
+
+{"description": "Valid numeric entity character U+00C8",
+"input": "&#x00c8;",
+"output": [["Character", "\u00C8"]]},
+
+{"description": "Valid numeric entity character U+00C9",
+"input": "&#x00c9;",
+"output": [["Character", "\u00C9"]]},
+
+{"description": "Valid numeric entity character U+00CA",
+"input": "&#x00ca;",
+"output": [["Character", "\u00CA"]]},
+
+{"description": "Valid numeric entity character U+00CB",
+"input": "&#x00cb;",
+"output": [["Character", "\u00CB"]]},
+
+{"description": "Valid numeric entity character U+00CC",
+"input": "&#x00cc;",
+"output": [["Character", "\u00CC"]]},
+
+{"description": "Valid numeric entity character U+00CD",
+"input": "&#x00cd;",
+"output": [["Character", "\u00CD"]]},
+
+{"description": "Valid numeric entity character U+00CE",
+"input": "&#x00ce;",
+"output": [["Character", "\u00CE"]]},
+
+{"description": "Valid numeric entity character U+00CF",
+"input": "&#x00cf;",
+"output": [["Character", "\u00CF"]]},
+
+{"description": "Valid numeric entity character U+00D0",
+"input": "&#x00d0;",
+"output": [["Character", "\u00D0"]]},
+
+{"description": "Valid numeric entity character U+00D1",
+"input": "&#x00d1;",
+"output": [["Character", "\u00D1"]]},
+
+{"description": "Valid numeric entity character U+00D2",
+"input": "&#x00d2;",
+"output": [["Character", "\u00D2"]]},
+
+{"description": "Valid numeric entity character U+00D3",
+"input": "&#x00d3;",
+"output": [["Character", "\u00D3"]]},
+
+{"description": "Valid numeric entity character U+00D4",
+"input": "&#x00d4;",
+"output": [["Character", "\u00D4"]]},
+
+{"description": "Valid numeric entity character U+00D5",
+"input": "&#x00d5;",
+"output": [["Character", "\u00D5"]]},
+
+{"description": "Valid numeric entity character U+00D6",
+"input": "&#x00d6;",
+"output": [["Character", "\u00D6"]]},
+
+{"description": "Valid numeric entity character U+00D7",
+"input": "&#x00d7;",
+"output": [["Character", "\u00D7"]]},
+
+{"description": "Valid numeric entity character U+00D8",
+"input": "&#x00d8;",
+"output": [["Character", "\u00D8"]]},
+
+{"description": "Valid numeric entity character U+00D9",
+"input": "&#x00d9;",
+"output": [["Character", "\u00D9"]]},
+
+{"description": "Valid numeric entity character U+00DA",
+"input": "&#x00da;",
+"output": [["Character", "\u00DA"]]},
+
+{"description": "Valid numeric entity character U+00DB",
+"input": "&#x00db;",
+"output": [["Character", "\u00DB"]]},
+
+{"description": "Valid numeric entity character U+00DC",
+"input": "&#x00dc;",
+"output": [["Character", "\u00DC"]]},
+
+{"description": "Valid numeric entity character U+00DD",
+"input": "&#x00dd;",
+"output": [["Character", "\u00DD"]]},
+
+{"description": "Valid numeric entity character U+00DE",
+"input": "&#x00de;",
+"output": [["Character", "\u00DE"]]},
+
+{"description": "Valid numeric entity character U+00DF",
+"input": "&#x00df;",
+"output": [["Character", "\u00DF"]]},
+
+{"description": "Valid numeric entity character U+00E0",
+"input": "&#x00e0;",
+"output": [["Character", "\u00E0"]]},
+
+{"description": "Valid numeric entity character U+00E1",
+"input": "&#x00e1;",
+"output": [["Character", "\u00E1"]]},
+
+{"description": "Valid numeric entity character U+00E2",
+"input": "&#x00e2;",
+"output": [["Character", "\u00E2"]]},
+
+{"description": "Valid numeric entity character U+00E3",
+"input": "&#x00e3;",
+"output": [["Character", "\u00E3"]]},
+
+{"description": "Valid numeric entity character U+00E4",
+"input": "&#x00e4;",
+"output": [["Character", "\u00E4"]]},
+
+{"description": "Valid numeric entity character U+00E5",
+"input": "&#x00e5;",
+"output": [["Character", "\u00E5"]]},
+
+{"description": "Valid numeric entity character U+00E6",
+"input": "&#x00e6;",
+"output": [["Character", "\u00E6"]]},
+
+{"description": "Valid numeric entity character U+00E7",
+"input": "&#x00e7;",
+"output": [["Character", "\u00E7"]]},
+
+{"description": "Valid numeric entity character U+00E8",
+"input": "&#x00e8;",
+"output": [["Character", "\u00E8"]]},
+
+{"description": "Valid numeric entity character U+00E9",
+"input": "&#x00e9;",
+"output": [["Character", "\u00E9"]]},
+
+{"description": "Valid numeric entity character U+00EA",
+"input": "&#x00ea;",
+"output": [["Character", "\u00EA"]]},
+
+{"description": "Valid numeric entity character U+00EB",
+"input": "&#x00eb;",
+"output": [["Character", "\u00EB"]]},
+
+{"description": "Valid numeric entity character U+00EC",
+"input": "&#x00ec;",
+"output": [["Character", "\u00EC"]]},
+
+{"description": "Valid numeric entity character U+00ED",
+"input": "&#x00ed;",
+"output": [["Character", "\u00ED"]]},
+
+{"description": "Valid numeric entity character U+00EE",
+"input": "&#x00ee;",
+"output": [["Character", "\u00EE"]]},
+
+{"description": "Valid numeric entity character U+00EF",
+"input": "&#x00ef;",
+"output": [["Character", "\u00EF"]]},
+
+{"description": "Valid numeric entity character U+00F0",
+"input": "&#x00f0;",
+"output": [["Character", "\u00F0"]]},
+
+{"description": "Valid numeric entity character U+00F1",
+"input": "&#x00f1;",
+"output": [["Character", "\u00F1"]]},
+
+{"description": "Valid numeric entity character U+00F2",
+"input": "&#x00f2;",
+"output": [["Character", "\u00F2"]]},
+
+{"description": "Valid numeric entity character U+00F3",
+"input": "&#x00f3;",
+"output": [["Character", "\u00F3"]]},
+
+{"description": "Valid numeric entity character U+00F4",
+"input": "&#x00f4;",
+"output": [["Character", "\u00F4"]]},
+
+{"description": "Valid numeric entity character U+00F5",
+"input": "&#x00f5;",
+"output": [["Character", "\u00F5"]]},
+
+{"description": "Valid numeric entity character U+00F6",
+"input": "&#x00f6;",
+"output": [["Character", "\u00F6"]]},
+
+{"description": "Valid numeric entity character U+00F7",
+"input": "&#x00f7;",
+"output": [["Character", "\u00F7"]]},
+
+{"description": "Valid numeric entity character U+00F8",
+"input": "&#x00f8;",
+"output": [["Character", "\u00F8"]]},
+
+{"description": "Valid numeric entity character U+00F9",
+"input": "&#x00f9;",
+"output": [["Character", "\u00F9"]]},
+
+{"description": "Valid numeric entity character U+00FA",
+"input": "&#x00fa;",
+"output": [["Character", "\u00FA"]]},
+
+{"description": "Valid numeric entity character U+00FB",
+"input": "&#x00fb;",
+"output": [["Character", "\u00FB"]]},
+
+{"description": "Valid numeric entity character U+00FC",
+"input": "&#x00fc;",
+"output": [["Character", "\u00FC"]]},
+
+{"description": "Valid numeric entity character U+00FD",
+"input": "&#x00fd;",
+"output": [["Character", "\u00FD"]]},
+
+{"description": "Valid numeric entity character U+00FE",
+"input": "&#x00fe;",
+"output": [["Character", "\u00FE"]]},
+
+{"description": "Valid numeric entity character U+00FF",
+"input": "&#x00ff;",
+"output": [["Character", "\u00FF"]]},
+
+{"description": "Valid numeric entity character U+D7FF",
+"input": "&#xd7ff;",
+"output": [["Character", "\uD7FF"]]},
+
+{"description": "Valid numeric entity character U+E000",
+"input": "&#xe000;",
+"output": [["Character", "\uE000"]]},
+
+{"description": "Valid numeric entity character U+FDCF",
+"input": "&#xfdcf;",
+"output": [["Character", "\uFDCF"]]},
+
+{"description": "Valid numeric entity character U+FDF0",
+"input": "&#xfdf0;",
+"output": [["Character", "\uFDF0"]]},
+
+{"description": "Valid numeric entity character U+FFFD",
+"input": "&#xfffd;",
+"output": [["Character", "\uFFFD"]]},
+
+{"description": "Valid numeric entity character U+10000",
+"input": "&#x10000;",
+"output": [["Character", "\uD800\uDC00"]]},
+
+{"description": "Valid numeric entity character U+1FFFD",
+"input": "&#x1fffd;",
+"output": [["Character", "\uD83F\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+20000",
+"input": "&#x20000;",
+"output": [["Character", "\uD840\uDC00"]]},
+
+{"description": "Valid numeric entity character U+2FFFD",
+"input": "&#x2fffd;",
+"output": [["Character", "\uD87F\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+30000",
+"input": "&#x30000;",
+"output": [["Character", "\uD880\uDC00"]]},
+
+{"description": "Valid numeric entity character U+3FFFD",
+"input": "&#x3fffd;",
+"output": [["Character", "\uD8BF\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+40000",
+"input": "&#x40000;",
+"output": [["Character", "\uD8C0\uDC00"]]},
+
+{"description": "Valid numeric entity character U+4FFFD",
+"input": "&#x4fffd;",
+"output": [["Character", "\uD8FF\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+50000",
+"input": "&#x50000;",
+"output": [["Character", "\uD900\uDC00"]]},
+
+{"description": "Valid numeric entity character U+5FFFD",
+"input": "&#x5fffd;",
+"output": [["Character", "\uD93F\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+60000",
+"input": "&#x60000;",
+"output": [["Character", "\uD940\uDC00"]]},
+
+{"description": "Valid numeric entity character U+6FFFD",
+"input": "&#x6fffd;",
+"output": [["Character", "\uD97F\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+70000",
+"input": "&#x70000;",
+"output": [["Character", "\uD980\uDC00"]]},
+
+{"description": "Valid numeric entity character U+7FFFD",
+"input": "&#x7fffd;",
+"output": [["Character", "\uD9BF\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+80000",
+"input": "&#x80000;",
+"output": [["Character", "\uD9C0\uDC00"]]},
+
+{"description": "Valid numeric entity character U+8FFFD",
+"input": "&#x8fffd;",
+"output": [["Character", "\uD9FF\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+90000",
+"input": "&#x90000;",
+"output": [["Character", "\uDA00\uDC00"]]},
+
+{"description": "Valid numeric entity character U+9FFFD",
+"input": "&#x9fffd;",
+"output": [["Character", "\uDA3F\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+A0000",
+"input": "&#xa0000;",
+"output": [["Character", "\uDA40\uDC00"]]},
+
+{"description": "Valid numeric entity character U+AFFFD",
+"input": "&#xafffd;",
+"output": [["Character", "\uDA7F\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+B0000",
+"input": "&#xb0000;",
+"output": [["Character", "\uDA80\uDC00"]]},
+
+{"description": "Valid numeric entity character U+BFFFD",
+"input": "&#xbfffd;",
+"output": [["Character", "\uDABF\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+C0000",
+"input": "&#xc0000;",
+"output": [["Character", "\uDAC0\uDC00"]]},
+
+{"description": "Valid numeric entity character U+CFFFD",
+"input": "&#xcfffd;",
+"output": [["Character", "\uDAFF\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+D0000",
+"input": "&#xd0000;",
+"output": [["Character", "\uDB00\uDC00"]]},
+
+{"description": "Valid numeric entity character U+DFFFD",
+"input": "&#xdfffd;",
+"output": [["Character", "\uDB3F\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+E0000",
+"input": "&#xe0000;",
+"output": [["Character", "\uDB40\uDC00"]]},
+
+{"description": "Valid numeric entity character U+EFFFD",
+"input": "&#xefffd;",
+"output": [["Character", "\uDB7F\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+F0000",
+"input": "&#xf0000;",
+"output": [["Character", "\uDB80\uDC00"]]},
+
+{"description": "Valid numeric entity character U+FFFFD",
+"input": "&#xffffd;",
+"output": [["Character", "\uDBBF\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+100000",
+"input": "&#x100000;",
+"output": [["Character", "\uDBC0\uDC00"]]},
+
+{"description": "Valid numeric entity character U+10FFFD",
+"input": "&#x10fffd;",
+"output": [["Character", "\uDBFF\uDFFD"]]}
+
+]}
+
+
diff --git a/mojo/public/dart/third_party/html/test/data/tokenizer/pendingSpecChanges.test b/mojo/public/dart/third_party/html/test/data/tokenizer/pendingSpecChanges.test
new file mode 100644
index 0000000..1b7dc3c
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tokenizer/pendingSpecChanges.test
@@ -0,0 +1,7 @@
+{"tests": [
+
+{"description":"<!---- >",
+"input":"<!---- >",
+"output":["ParseError", "ParseError", ["Comment","-- >"]]}
+
+]}
diff --git a/mojo/public/dart/third_party/html/test/data/tokenizer/test1.test b/mojo/public/dart/third_party/html/test/data/tokenizer/test1.test
new file mode 100644
index 0000000..5de66f5
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tokenizer/test1.test
@@ -0,0 +1,196 @@
+{"tests": [
+
+{"description":"Correct Doctype lowercase",
+"input":"<!DOCTYPE html>",
+"output":[["DOCTYPE", "html", null, null, true]]},
+
+{"description":"Correct Doctype uppercase",
+"input":"<!DOCTYPE HTML>",
+"output":[["DOCTYPE", "html", null, null, true]]},
+
+{"description":"Correct Doctype mixed case",
+"input":"<!DOCTYPE HtMl>", 
+"output":[["DOCTYPE", "html", null, null, true]]},
+
+{"description":"Correct Doctype case with EOF",
+"input":"<!DOCTYPE HtMl", 
+"output":["ParseError", ["DOCTYPE", "html", null, null, false]]},
+
+{"description":"Truncated doctype start",
+"input":"<!DOC>", 
+"output":["ParseError", ["Comment", "DOC"]]},
+
+{"description":"Doctype in error",
+"input":"<!DOCTYPE foo>", 
+"output":[["DOCTYPE", "foo", null, null, true]]},
+
+{"description":"Single Start Tag",
+"input":"<h>",
+"output":[["StartTag", "h", {}]]},
+
+{"description":"Empty end tag",
+"input":"</>",
+"output":["ParseError"]},
+
+{"description":"Empty start tag",
+"input":"<>",
+"output":["ParseError", ["Character", "<>"]]},
+
+{"description":"Start Tag w/attribute",
+"input":"<h a='b'>",
+"output":[["StartTag", "h", {"a":"b"}]]},
+
+{"description":"Start Tag w/attribute no quotes",
+"input":"<h a=b>",
+"output":[["StartTag", "h", {"a":"b"}]]},
+
+{"description":"Start/End Tag",
+"input":"<h></h>",
+"output":[["StartTag", "h", {}], ["EndTag", "h"]]},
+
+{"description":"Two unclosed start tags",
+"input":"<p>One<p>Two",
+"output":[["StartTag", "p", {}], ["Character", "One"], ["StartTag", "p", {}], ["Character", "Two"]]},
+
+{"description":"End Tag w/attribute",
+"input":"<h></h a='b'>",
+"output":[["StartTag", "h", {}], "ParseError", ["EndTag", "h"]]},
+
+{"description":"Multiple atts",
+"input":"<h a='b' c='d'>",
+"output":[["StartTag", "h", {"a":"b", "c":"d"}]]},
+
+{"description":"Multiple atts no space",
+"input":"<h a='b'c='d'>",
+"output":["ParseError", ["StartTag", "h", {"a":"b", "c":"d"}]]},
+
+{"description":"Repeated attr",
+ "input":"<h a='b' a='d'>",
+ "output":["ParseError", ["StartTag", "h", {"a":"b"}]]},
+
+{"description":"Simple comment",
+ "input":"<!--comment-->",
+ "output":[["Comment", "comment"]]},
+
+{"description":"Comment, Central dash no space",
+ "input":"<!----->",
+ "output":["ParseError", ["Comment", "-"]]},
+
+{"description":"Comment, two central dashes",
+"input":"<!-- --comment -->",
+"output":["ParseError", ["Comment", " --comment "]]},
+
+{"description":"Unfinished comment",
+"input":"<!--comment",
+"output":["ParseError", ["Comment", "comment"]]},
+
+{"description":"Start of a comment",
+"input":"<!-",
+"output":["ParseError", ["Comment", "-"]]},
+
+{"description":"Short comment",
+ "input":"<!-->",
+ "output":["ParseError", ["Comment", ""]]},
+
+{"description":"Short comment two",
+ "input":"<!--->",
+ "output":["ParseError", ["Comment", ""]]},
+
+{"description":"Short comment three",
+ "input":"<!---->",
+ "output":[["Comment", ""]]},
+
+
+{"description":"Ampersand EOF",
+"input":"&",
+"output":[["Character", "&"]]},
+
+{"description":"Ampersand ampersand EOF",
+"input":"&&",
+"output":[["Character", "&&"]]},
+
+{"description":"Ampersand space EOF",
+"input":"& ",
+"output":[["Character", "& "]]},
+
+{"description":"Unfinished entity",
+"input":"&f",
+"output":["ParseError", ["Character", "&f"]]},
+
+{"description":"Ampersand, number sign",
+"input":"&#",
+"output":["ParseError", ["Character", "&#"]]},
+
+{"description":"Unfinished numeric entity",
+"input":"&#x",
+"output":["ParseError", ["Character", "&#x"]]},
+
+{"description":"Entity with trailing semicolon (1)",
+"input":"I'm &not;it",
+"output":[["Character","I'm \u00ACit"]]},
+
+{"description":"Entity with trailing semicolon (2)",
+"input":"I'm &notin;",
+"output":[["Character","I'm \u2209"]]},
+
+{"description":"Entity without trailing semicolon (1)",
+"input":"I'm &notit",
+"output":[["Character","I'm "], "ParseError", ["Character", "\u00ACit"]]},
+
+{"description":"Entity without trailing semicolon (2)",
+"input":"I'm &notin",
+"output":[["Character","I'm "], "ParseError", ["Character", "\u00ACin"]]},
+
+{"description":"Partial entity match at end of file",
+"input":"I'm &no",
+"output":[["Character","I'm "], "ParseError", ["Character", "&no"]]},
+
+{"description":"Non-ASCII character reference name",
+"input":"&\u00AC;",
+"output":["ParseError", ["Character", "&\u00AC;"]]},
+
+{"description":"ASCII decimal entity",
+"input":"&#0036;",
+"output":[["Character","$"]]},
+
+{"description":"ASCII hexadecimal entity",
+"input":"&#x3f;",
+"output":[["Character","?"]]},
+
+{"description":"Hexadecimal entity in attribute",
+"input":"<h a='&#x3f;'></h>",
+"output":[["StartTag", "h", {"a":"?"}], ["EndTag", "h"]]},
+
+{"description":"Entity in attribute without semicolon ending in x",
+"input":"<h a='&notx'>",
+"output":["ParseError", ["StartTag", "h", {"a":"&notx"}]]},
+
+{"description":"Entity in attribute without semicolon ending in 1",
+"input":"<h a='&not1'>",
+"output":["ParseError", ["StartTag", "h", {"a":"&not1"}]]},
+
+{"description":"Entity in attribute without semicolon ending in i",
+"input":"<h a='&noti'>",
+"output":["ParseError", ["StartTag", "h", {"a":"&noti"}]]},
+
+{"description":"Entity in attribute without semicolon",
+"input":"<h a='&COPY'>",
+"output":["ParseError", ["StartTag", "h", {"a":"\u00A9"}]]},
+
+{"description":"Unquoted attribute ending in ampersand",
+"input":"<s o=& t>",
+"output":[["StartTag","s",{"o":"&","t":""}]]},
+
+{"description":"Unquoted attribute at end of tag with final character of &, with tag followed by characters",
+"input":"<a a=a&>foo",
+"output":[["StartTag", "a", {"a":"a&"}], ["Character", "foo"]]},
+
+{"description":"plaintext element",
+ "input":"<plaintext>foobar",
+ "output":[["StartTag","plaintext",{}], ["Character","foobar"]]},
+
+{"description":"Open angled bracket in unquoted attribute value state",
+ "input":"<a a=f<>",
+ "output":["ParseError", ["StartTag", "a", {"a":"f<"}]]}
+
+]}
diff --git a/mojo/public/dart/third_party/html/test/data/tokenizer/test2.test b/mojo/public/dart/third_party/html/test/data/tokenizer/test2.test
new file mode 100644
index 0000000..e157514
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tokenizer/test2.test
@@ -0,0 +1,179 @@
+{"tests": [
+
+{"description":"DOCTYPE without name",
+"input":"<!DOCTYPE>",
+"output":["ParseError", "ParseError", ["DOCTYPE", "", null, null, false]]},
+
+{"description":"DOCTYPE without space before name",
+"input":"<!DOCTYPEhtml>",
+"output":["ParseError", ["DOCTYPE", "html", null, null, true]]},
+
+{"description":"Incorrect DOCTYPE without a space before name",
+"input":"<!DOCTYPEfoo>",
+"output":["ParseError", ["DOCTYPE", "foo", null, null, true]]},
+
+{"description":"DOCTYPE with publicId",
+"input":"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML Transitional 4.01//EN\">",
+"output":[["DOCTYPE", "html", "-//W3C//DTD HTML Transitional 4.01//EN", null, true]]},
+
+{"description":"DOCTYPE with EOF after PUBLIC",
+"input":"<!DOCTYPE html PUBLIC",
+"output":["ParseError", ["DOCTYPE", "html", null, null, false]]},
+
+{"description":"DOCTYPE with EOF after PUBLIC '",
+"input":"<!DOCTYPE html PUBLIC '",
+"output":["ParseError", ["DOCTYPE", "html", "", null, false]]},
+
+{"description":"DOCTYPE with EOF after PUBLIC 'x",
+"input":"<!DOCTYPE html PUBLIC 'x",
+"output":["ParseError", ["DOCTYPE", "html", "x", null, false]]},
+
+{"description":"DOCTYPE with systemId",
+"input":"<!DOCTYPE html SYSTEM \"-//W3C//DTD HTML Transitional 4.01//EN\">",
+"output":[["DOCTYPE", "html", null, "-//W3C//DTD HTML Transitional 4.01//EN", true]]},
+
+{"description":"DOCTYPE with publicId and systemId",
+"input":"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML Transitional 4.01//EN\" \"-//W3C//DTD HTML Transitional 4.01//EN\">",
+"output":[["DOCTYPE", "html", "-//W3C//DTD HTML Transitional 4.01//EN", "-//W3C//DTD HTML Transitional 4.01//EN", true]]},
+
+{"description":"DOCTYPE with > in double-quoted publicId",
+"input":"<!DOCTYPE html PUBLIC \">x",
+"output":["ParseError", ["DOCTYPE", "html", "", null, false], ["Character", "x"]]},
+
+{"description":"DOCTYPE with > in single-quoted publicId",
+"input":"<!DOCTYPE html PUBLIC '>x",
+"output":["ParseError", ["DOCTYPE", "html", "", null, false], ["Character", "x"]]},
+
+{"description":"DOCTYPE with > in double-quoted systemId",
+"input":"<!DOCTYPE html PUBLIC \"foo\" \">x",
+"output":["ParseError", ["DOCTYPE", "html", "foo", "", false], ["Character", "x"]]},
+
+{"description":"DOCTYPE with > in single-quoted systemId",
+"input":"<!DOCTYPE html PUBLIC 'foo' '>x",
+"output":["ParseError", ["DOCTYPE", "html", "foo", "", false], ["Character", "x"]]},
+
+{"description":"Incomplete doctype",
+"input":"<!DOCTYPE html ",
+"output":["ParseError", ["DOCTYPE", "html", null, null, false]]},
+
+{"description":"Numeric entity representing the NUL character",
+"input":"&#0000;",
+"output":["ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"Hexadecimal entity representing the NUL character",
+"input":"&#x0000;",
+"output":["ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"Numeric entity representing a codepoint after 1114111 (U+10FFFF)",
+"input":"&#2225222;",
+"output":["ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"Hexadecimal entity representing a codepoint after 1114111 (U+10FFFF)",
+"input":"&#x1010FFFF;",
+"output":["ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"Hexadecimal entity pair representing a surrogate pair",
+"input":"&#xD869;&#xDED6;",
+"output":["ParseError", ["Character", "\uFFFD"], "ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"Hexadecimal entity with mixed uppercase and lowercase",
+"input":"&#xaBcD;",
+"output":[["Character", "\uABCD"]]},
+
+{"description":"Entity without a name",
+"input":"&;",
+"output":["ParseError", ["Character", "&;"]]},
+
+{"description":"Unescaped ampersand in attribute value",
+"input":"<h a='&'>",
+"output":[["StartTag", "h", { "a":"&" }]]},
+
+{"description":"StartTag containing <",
+"input":"<a<b>",
+"output":[["StartTag", "a<b", { }]]},
+
+{"description":"Non-void element containing trailing /",
+"input":"<h/>",
+"output":[["StartTag","h",{},true]]},
+
+{"description":"Void element with permitted slash",
+"input":"<br/>",
+"output":[["StartTag","br",{},true]]},
+
+{"description":"Void element with permitted slash (with attribute)",
+"input":"<br foo='bar'/>",
+"output":[["StartTag","br",{"foo":"bar"},true]]},
+
+{"description":"StartTag containing /",
+"input":"<h/a='b'>",
+"output":["ParseError", ["StartTag", "h", { "a":"b" }]]},
+
+{"description":"Double-quoted attribute value",
+"input":"<h a=\"b\">",
+"output":[["StartTag", "h", { "a":"b" }]]},
+
+{"description":"Unescaped </",
+"input":"</",
+"output":["ParseError", ["Character", "</"]]},
+
+{"description":"Illegal end tag name",
+"input":"</1>",
+"output":["ParseError", ["Comment", "1"]]},
+
+{"description":"Simili processing instruction",
+"input":"<?namespace>",
+"output":["ParseError", ["Comment", "?namespace"]]},
+
+{"description":"A bogus comment stops at >, even if preceeded by two dashes",
+"input":"<?foo-->",
+"output":["ParseError", ["Comment", "?foo--"]]},
+
+{"description":"Unescaped <",
+"input":"foo < bar",
+"output":[["Character", "foo "], "ParseError", ["Character", "< bar"]]},
+
+{"description":"Null Byte Replacement",
+"input":"\u0000",
+"output":["ParseError", ["Character", "\u0000"]]},
+
+{"description":"Comment with dash",
+"input":"<!---x",
+"output":["ParseError", ["Comment", "-x"]]},
+
+{"description":"Entity + newline",
+"input":"\nx\n&gt;\n",
+"output":[["Character","\nx\n>\n"]]},
+
+{"description":"Start tag with no attributes but space before the greater-than sign",
+"input":"<h >",
+"output":[["StartTag", "h", {}]]},
+
+{"description":"Empty attribute followed by uppercase attribute",
+"input":"<h a B=''>",
+"output":[["StartTag", "h", {"a":"", "b":""}]]},
+
+{"description":"Double-quote after attribute name",
+"input":"<h a \">",
+"output":["ParseError", ["StartTag", "h", {"a":"", "\"":""}]]},
+
+{"description":"Single-quote after attribute name",
+"input":"<h a '>",
+"output":["ParseError", ["StartTag", "h", {"a":"", "'":""}]]},
+
+{"description":"Empty end tag with following characters",
+"input":"a</>bc",
+"output":[["Character", "a"], "ParseError", ["Character", "bc"]]},
+
+{"description":"Empty end tag with following tag",
+"input":"a</><b>c",
+"output":[["Character", "a"], "ParseError", ["StartTag", "b", {}], ["Character", "c"]]},
+
+{"description":"Empty end tag with following comment",
+"input":"a</><!--b-->c",
+"output":[["Character", "a"], "ParseError", ["Comment", "b"], ["Character", "c"]]},
+
+{"description":"Empty end tag with following end tag",
+"input":"a</></b>c",
+"output":[["Character", "a"], "ParseError", ["EndTag", "b"], ["Character", "c"]]}
+
+]}
diff --git a/mojo/public/dart/third_party/html/test/data/tokenizer/test3.test b/mojo/public/dart/third_party/html/test/data/tokenizer/test3.test
new file mode 100644
index 0000000..58519e8
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tokenizer/test3.test
@@ -0,0 +1,6047 @@
+{"tests": [
+
+{"description":"",
+"input":"",
+"output":[]},
+
+{"description":"\\u0009",
+"input":"\u0009",
+"output":[["Character", "\u0009"]]},
+
+{"description":"\\u000A",
+"input":"\u000A",
+"output":[["Character", "\u000A"]]},
+
+{"description":"\\u000B",
+"input":"\u000B",
+"output":["ParseError", ["Character", "\u000B"]]},
+
+{"description":"\\u000C",
+"input":"\u000C",
+"output":[["Character", "\u000C"]]},
+
+{"description":" ",
+"input":" ",
+"output":[["Character", " "]]},
+
+{"description":"!",
+"input":"!",
+"output":[["Character", "!"]]},
+
+{"description":"\"",
+"input":"\"",
+"output":[["Character", "\""]]},
+
+{"description":"%",
+"input":"%",
+"output":[["Character", "%"]]},
+
+{"description":"&",
+"input":"&",
+"output":[["Character", "&"]]},
+
+{"description":"'",
+"input":"'",
+"output":[["Character", "'"]]},
+
+{"description":",",
+"input":",",
+"output":[["Character", ","]]},
+
+{"description":"-",
+"input":"-",
+"output":[["Character", "-"]]},
+
+{"description":".",
+"input":".",
+"output":[["Character", "."]]},
+
+{"description":"/",
+"input":"/",
+"output":[["Character", "/"]]},
+
+{"description":"0",
+"input":"0",
+"output":[["Character", "0"]]},
+
+{"description":"1",
+"input":"1",
+"output":[["Character", "1"]]},
+
+{"description":"9",
+"input":"9",
+"output":[["Character", "9"]]},
+
+{"description":";",
+"input":";",
+"output":[["Character", ";"]]},
+
+{"description":"<",
+"input":"<",
+"output":["ParseError", ["Character", "<"]]},
+
+{"description":"<\\u0000",
+"input":"<\u0000",
+"output":["ParseError", ["Character", "<"], "ParseError", ["Character", "\u0000"]]},
+
+{"description":"<\\u0009",
+"input":"<\u0009",
+"output":["ParseError", ["Character", "<\u0009"]]},
+
+{"description":"<\\u000A",
+"input":"<\u000A",
+"output":["ParseError", ["Character", "<\u000A"]]},
+
+{"description":"<\\u000B",
+"input":"<\u000B",
+"output":["ParseError", "ParseError", ["Character", "<\u000B"]]},
+
+{"description":"<\\u000C",
+"input":"<\u000C",
+"output":["ParseError", ["Character", "<\u000C"]]},
+
+{"description":"< ",
+"input":"< ",
+"output":["ParseError", ["Character", "< "]]},
+
+{"description":"<!",
+"input":"<!",
+"output":["ParseError", ["Comment", ""]]},
+
+{"description":"<!\\u0000",
+"input":"<!\u0000",
+"output":["ParseError", ["Comment", "\uFFFD"]]},
+
+{"description":"<!\\u0009",
+"input":"<!\u0009",
+"output":["ParseError", ["Comment", "\u0009"]]},
+
+{"description":"<!\\u000A",
+"input":"<!\u000A",
+"output":["ParseError", ["Comment", "\u000A"]]},
+
+{"description":"<!\\u000B",
+"input":"<!\u000B",
+"output":["ParseError", "ParseError", ["Comment", "\u000B"]]},
+
+{"description":"<!\\u000C",
+"input":"<!\u000C",
+"output":["ParseError", ["Comment", "\u000C"]]},
+
+{"description":"<! ",
+"input":"<! ",
+"output":["ParseError", ["Comment", " "]]},
+
+{"description":"<!!",
+"input":"<!!",
+"output":["ParseError", ["Comment", "!"]]},
+
+{"description":"<!\"",
+"input":"<!\"",
+"output":["ParseError", ["Comment", "\""]]},
+
+{"description":"<!&",
+"input":"<!&",
+"output":["ParseError", ["Comment", "&"]]},
+
+{"description":"<!'",
+"input":"<!'",
+"output":["ParseError", ["Comment", "'"]]},
+
+{"description":"<!-",
+"input":"<!-",
+"output":["ParseError", ["Comment", "-"]]},
+
+{"description":"<!--",
+"input":"<!--",
+"output":["ParseError", ["Comment", ""]]},
+
+{"description":"<!--\\u0000",
+"input":"<!--\u0000",
+"output":["ParseError", "ParseError", ["Comment", "\uFFFD"]]},
+
+{"description":"<!--\\u0009",
+"input":"<!--\u0009",
+"output":["ParseError", ["Comment", "\u0009"]]},
+
+{"description":"<!--\\u000A",
+"input":"<!--\u000A",
+"output":["ParseError", ["Comment", "\u000A"]]},
+
+{"description":"<!--\\u000B",
+"input":"<!--\u000B",
+"output":["ParseError", "ParseError", ["Comment", "\u000B"]]},
+
+{"description":"<!--\\u000C",
+"input":"<!--\u000C",
+"output":["ParseError", ["Comment", "\u000C"]]},
+
+{"description":"<!-- ",
+"input":"<!-- ",
+"output":["ParseError", ["Comment", " "]]},
+
+{"description":"<!-- \\u0000",
+"input":"<!-- \u0000",
+"output":["ParseError", "ParseError", ["Comment", " \uFFFD"]]},
+
+{"description":"<!-- \\u0009",
+"input":"<!-- \u0009",
+"output":["ParseError", ["Comment", " \u0009"]]},
+
+{"description":"<!-- \\u000A",
+"input":"<!-- \u000A",
+"output":["ParseError", ["Comment", " \u000A"]]},
+
+{"description":"<!-- \\u000B",
+"input":"<!-- \u000B",
+"output":["ParseError", "ParseError", ["Comment", " \u000B"]]},
+
+{"description":"<!-- \\u000C",
+"input":"<!-- \u000C",
+"output":["ParseError", ["Comment", " \u000C"]]},
+
+{"description":"<!--  ",
+"input":"<!--  ",
+"output":["ParseError", ["Comment", "  "]]},
+
+{"description":"<!-- !",
+"input":"<!-- !",
+"output":["ParseError", ["Comment", " !"]]},
+
+{"description":"<!-- \"",
+"input":"<!-- \"",
+"output":["ParseError", ["Comment", " \""]]},
+
+{"description":"<!-- &",
+"input":"<!-- &",
+"output":["ParseError", ["Comment", " &"]]},
+
+{"description":"<!-- '",
+"input":"<!-- '",
+"output":["ParseError", ["Comment", " '"]]},
+
+{"description":"<!-- ,",
+"input":"<!-- ,",
+"output":["ParseError", ["Comment", " ,"]]},
+
+{"description":"<!-- -",
+"input":"<!-- -",
+"output":["ParseError", ["Comment", " "]]},
+
+{"description":"<!-- -\\u0000",
+"input":"<!-- -\u0000",
+"output":["ParseError", "ParseError", ["Comment", " -\uFFFD"]]},
+
+{"description":"<!-- -\\u0009",
+"input":"<!-- -\u0009",
+"output":["ParseError", ["Comment", " -\u0009"]]},
+
+{"description":"<!-- -\\u000A",
+"input":"<!-- -\u000A",
+"output":["ParseError", ["Comment", " -\u000A"]]},
+
+{"description":"<!-- -\\u000B",
+"input":"<!-- -\u000B",
+"output":["ParseError", "ParseError", ["Comment", " -\u000B"]]},
+
+{"description":"<!-- -\\u000C",
+"input":"<!-- -\u000C",
+"output":["ParseError", ["Comment", " -\u000C"]]},
+
+{"description":"<!-- - ",
+"input":"<!-- - ",
+"output":["ParseError", ["Comment", " - "]]},
+
+{"description":"<!-- -!",
+"input":"<!-- -!",
+"output":["ParseError", ["Comment", " -!"]]},
+
+{"description":"<!-- -\"",
+"input":"<!-- -\"",
+"output":["ParseError", ["Comment", " -\""]]},
+
+{"description":"<!-- -&",
+"input":"<!-- -&",
+"output":["ParseError", ["Comment", " -&"]]},
+
+{"description":"<!-- -'",
+"input":"<!-- -'",
+"output":["ParseError", ["Comment", " -'"]]},
+
+{"description":"<!-- -,",
+"input":"<!-- -,",
+"output":["ParseError", ["Comment", " -,"]]},
+
+{"description":"<!-- --",
+"input":"<!-- --",
+"output":["ParseError", ["Comment", " "]]},
+
+{"description":"<!-- -.",
+"input":"<!-- -.",
+"output":["ParseError", ["Comment", " -."]]},
+
+{"description":"<!-- -/",
+"input":"<!-- -/",
+"output":["ParseError", ["Comment", " -/"]]},
+
+{"description":"<!-- -0",
+"input":"<!-- -0",
+"output":["ParseError", ["Comment", " -0"]]},
+
+{"description":"<!-- -1",
+"input":"<!-- -1",
+"output":["ParseError", ["Comment", " -1"]]},
+
+{"description":"<!-- -9",
+"input":"<!-- -9",
+"output":["ParseError", ["Comment", " -9"]]},
+
+{"description":"<!-- -<",
+"input":"<!-- -<",
+"output":["ParseError", ["Comment", " -<"]]},
+
+{"description":"<!-- -=",
+"input":"<!-- -=",
+"output":["ParseError", ["Comment", " -="]]},
+
+{"description":"<!-- ->",
+"input":"<!-- ->",
+"output":["ParseError", ["Comment", " ->"]]},
+
+{"description":"<!-- -?",
+"input":"<!-- -?",
+"output":["ParseError", ["Comment", " -?"]]},
+
+{"description":"<!-- -@",
+"input":"<!-- -@",
+"output":["ParseError", ["Comment", " -@"]]},
+
+{"description":"<!-- -A",
+"input":"<!-- -A",
+"output":["ParseError", ["Comment", " -A"]]},
+
+{"description":"<!-- -B",
+"input":"<!-- -B",
+"output":["ParseError", ["Comment", " -B"]]},
+
+{"description":"<!-- -Y",
+"input":"<!-- -Y",
+"output":["ParseError", ["Comment", " -Y"]]},
+
+{"description":"<!-- -Z",
+"input":"<!-- -Z",
+"output":["ParseError", ["Comment", " -Z"]]},
+
+{"description":"<!-- -`",
+"input":"<!-- -`",
+"output":["ParseError", ["Comment", " -`"]]},
+
+{"description":"<!-- -a",
+"input":"<!-- -a",
+"output":["ParseError", ["Comment", " -a"]]},
+
+{"description":"<!-- -b",
+"input":"<!-- -b",
+"output":["ParseError", ["Comment", " -b"]]},
+
+{"description":"<!-- -y",
+"input":"<!-- -y",
+"output":["ParseError", ["Comment", " -y"]]},
+
+{"description":"<!-- -z",
+"input":"<!-- -z",
+"output":["ParseError", ["Comment", " -z"]]},
+
+{"description":"<!-- -{",
+"input":"<!-- -{",
+"output":["ParseError", ["Comment", " -{"]]},
+
+{"description":"<!-- -\\uDBC0\\uDC00",
+"input":"<!-- -\uDBC0\uDC00",
+"output":["ParseError", ["Comment", " -\uDBC0\uDC00"]]},
+
+{"description":"<!-- .",
+"input":"<!-- .",
+"output":["ParseError", ["Comment", " ."]]},
+
+{"description":"<!-- /",
+"input":"<!-- /",
+"output":["ParseError", ["Comment", " /"]]},
+
+{"description":"<!-- 0",
+"input":"<!-- 0",
+"output":["ParseError", ["Comment", " 0"]]},
+
+{"description":"<!-- 1",
+"input":"<!-- 1",
+"output":["ParseError", ["Comment", " 1"]]},
+
+{"description":"<!-- 9",
+"input":"<!-- 9",
+"output":["ParseError", ["Comment", " 9"]]},
+
+{"description":"<!-- <",
+"input":"<!-- <",
+"output":["ParseError", ["Comment", " <"]]},
+
+{"description":"<!-- =",
+"input":"<!-- =",
+"output":["ParseError", ["Comment", " ="]]},
+
+{"description":"<!-- >",
+"input":"<!-- >",
+"output":["ParseError", ["Comment", " >"]]},
+
+{"description":"<!-- ?",
+"input":"<!-- ?",
+"output":["ParseError", ["Comment", " ?"]]},
+
+{"description":"<!-- @",
+"input":"<!-- @",
+"output":["ParseError", ["Comment", " @"]]},
+
+{"description":"<!-- A",
+"input":"<!-- A",
+"output":["ParseError", ["Comment", " A"]]},
+
+{"description":"<!-- B",
+"input":"<!-- B",
+"output":["ParseError", ["Comment", " B"]]},
+
+{"description":"<!-- Y",
+"input":"<!-- Y",
+"output":["ParseError", ["Comment", " Y"]]},
+
+{"description":"<!-- Z",
+"input":"<!-- Z",
+"output":["ParseError", ["Comment", " Z"]]},
+
+{"description":"<!-- `",
+"input":"<!-- `",
+"output":["ParseError", ["Comment", " `"]]},
+
+{"description":"<!-- a",
+"input":"<!-- a",
+"output":["ParseError", ["Comment", " a"]]},
+
+{"description":"<!-- b",
+"input":"<!-- b",
+"output":["ParseError", ["Comment", " b"]]},
+
+{"description":"<!-- y",
+"input":"<!-- y",
+"output":["ParseError", ["Comment", " y"]]},
+
+{"description":"<!-- z",
+"input":"<!-- z",
+"output":["ParseError", ["Comment", " z"]]},
+
+{"description":"<!-- {",
+"input":"<!-- {",
+"output":["ParseError", ["Comment", " {"]]},
+
+{"description":"<!-- \\uDBC0\\uDC00",
+"input":"<!-- \uDBC0\uDC00",
+"output":["ParseError", ["Comment", " \uDBC0\uDC00"]]},
+
+{"description":"<!--!",
+"input":"<!--!",
+"output":["ParseError", ["Comment", "!"]]},
+
+{"description":"<!--\"",
+"input":"<!--\"",
+"output":["ParseError", ["Comment", "\""]]},
+
+{"description":"<!--&",
+"input":"<!--&",
+"output":["ParseError", ["Comment", "&"]]},
+
+{"description":"<!--'",
+"input":"<!--'",
+"output":["ParseError", ["Comment", "'"]]},
+
+{"description":"<!--,",
+"input":"<!--,",
+"output":["ParseError", ["Comment", ","]]},
+
+{"description":"<!---",
+"input":"<!---",
+"output":["ParseError", ["Comment", ""]]},
+
+{"description":"<!---\\u0000",
+"input":"<!---\u0000",
+"output":["ParseError", "ParseError", ["Comment", "-\uFFFD"]]},
+
+{"description":"<!---\\u0009",
+"input":"<!---\u0009",
+"output":["ParseError", ["Comment", "-\u0009"]]},
+
+{"description":"<!---\\u000A",
+"input":"<!---\u000A",
+"output":["ParseError", ["Comment", "-\u000A"]]},
+
+{"description":"<!---\\u000B",
+"input":"<!---\u000B",
+"output":["ParseError", "ParseError", ["Comment", "-\u000B"]]},
+
+{"description":"<!---\\u000C",
+"input":"<!---\u000C",
+"output":["ParseError", ["Comment", "-\u000C"]]},
+
+{"description":"<!--- ",
+"input":"<!--- ",
+"output":["ParseError", ["Comment", "- "]]},
+
+{"description":"<!---!",
+"input":"<!---!",
+"output":["ParseError", ["Comment", "-!"]]},
+
+{"description":"<!---\"",
+"input":"<!---\"",
+"output":["ParseError", ["Comment", "-\""]]},
+
+{"description":"<!---&",
+"input":"<!---&",
+"output":["ParseError", ["Comment", "-&"]]},
+
+{"description":"<!---'",
+"input":"<!---'",
+"output":["ParseError", ["Comment", "-'"]]},
+
+{"description":"<!---,",
+"input":"<!---,",
+"output":["ParseError", ["Comment", "-,"]]},
+
+{"description":"<!----",
+"input":"<!----",
+"output":["ParseError", ["Comment", ""]]},
+
+{"description":"<!----\\u0000",
+"input":"<!----\u0000",
+"output":["ParseError", "ParseError", ["Comment", "--\uFFFD"]]},
+
+{"description":"<!----\\u0009",
+"input":"<!----\u0009",
+"output":["ParseError", "ParseError", ["Comment", "--\u0009"]]},
+
+{"description":"<!----\\u000A",
+"input":"<!----\u000A",
+"output":["ParseError", "ParseError", ["Comment", "--\u000A"]]},
+
+{"description":"<!----\\u000B",
+"input":"<!----\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["Comment", "--\u000B"]]},
+
+{"description":"<!----\\u000C",
+"input":"<!----\u000C",
+"output":["ParseError", "ParseError", ["Comment", "--\u000C"]]},
+
+{"description":"<!---- ",
+"input":"<!---- ",
+"output":["ParseError", "ParseError", ["Comment", "-- "]]},
+
+{"description":"<!---- -",
+"input":"<!---- -",
+"output":["ParseError", "ParseError", ["Comment", "-- "]]},
+
+{"description":"<!---- --",
+"input":"<!---- --",
+"output":["ParseError", "ParseError", ["Comment", "-- "]]},
+
+{"description":"<!---- -->",
+"input":"<!---- -->",
+"output":["ParseError", ["Comment", "-- "]]},
+
+{"description":"<!----  -->",
+"input":"<!----  -->",
+"output":["ParseError", ["Comment", "--  "]]},
+
+{"description":"<!---- a-->",
+"input":"<!---- a-->",
+"output":["ParseError", ["Comment", "-- a"]]},
+
+{"description":"<!----!",
+"input":"<!----!",
+"output":["ParseError", "ParseError", ["Comment", ""]]},
+
+{"description":"<!----!>",
+"input":"<!----!>",
+"output":["ParseError", ["Comment", ""]]},
+
+{"description":"<!----!a",
+"input":"<!----!a",
+"output":["ParseError", "ParseError", ["Comment", "--!a"]]},
+
+{"description":"<!----!a-",
+"input":"<!----!a-",
+"output":["ParseError", "ParseError", ["Comment", "--!a"]]},
+
+{"description":"<!----!a--",
+"input":"<!----!a--",
+"output":["ParseError", "ParseError", ["Comment", "--!a"]]},
+
+{"description":"<!----!a-->",
+"input":"<!----!a-->",
+"output":["ParseError", ["Comment", "--!a"]]},
+
+{"description":"<!----!-",
+"input":"<!----!-",
+"output":["ParseError", "ParseError", ["Comment", "--!"]]},
+
+{"description":"<!----!--",
+"input":"<!----!--",
+"output":["ParseError", "ParseError", ["Comment", "--!"]]},
+
+{"description":"<!----!-->",
+"input":"<!----!-->",
+"output":["ParseError", ["Comment", "--!"]]},
+
+{"description":"<!----\"",
+"input":"<!----\"",
+"output":["ParseError", "ParseError", ["Comment", "--\""]]},
+
+{"description":"<!----&",
+"input":"<!----&",
+"output":["ParseError", "ParseError", ["Comment", "--&"]]},
+
+{"description":"<!----'",
+"input":"<!----'",
+"output":["ParseError", "ParseError", ["Comment", "--'"]]},
+
+{"description":"<!----,",
+"input":"<!----,",
+"output":["ParseError", "ParseError", ["Comment", "--,"]]},
+
+{"description":"<!-----",
+"input":"<!-----",
+"output":["ParseError", "ParseError", ["Comment", "-"]]},
+
+{"description":"<!----.",
+"input":"<!----.",
+"output":["ParseError", "ParseError", ["Comment", "--."]]},
+
+{"description":"<!----/",
+"input":"<!----/",
+"output":["ParseError", "ParseError", ["Comment", "--/"]]},
+
+{"description":"<!----0",
+"input":"<!----0",
+"output":["ParseError", "ParseError", ["Comment", "--0"]]},
+
+{"description":"<!----1",
+"input":"<!----1",
+"output":["ParseError", "ParseError", ["Comment", "--1"]]},
+
+{"description":"<!----9",
+"input":"<!----9",
+"output":["ParseError", "ParseError", ["Comment", "--9"]]},
+
+{"description":"<!----<",
+"input":"<!----<",
+"output":["ParseError", "ParseError", ["Comment", "--<"]]},
+
+{"description":"<!----=",
+"input":"<!----=",
+"output":["ParseError", "ParseError", ["Comment", "--="]]},
+
+{"description":"<!---->",
+"input":"<!---->",
+"output":[["Comment", ""]]},
+
+{"description":"<!----?",
+"input":"<!----?",
+"output":["ParseError", "ParseError", ["Comment", "--?"]]},
+
+{"description":"<!----@",
+"input":"<!----@",
+"output":["ParseError", "ParseError", ["Comment", "--@"]]},
+
+{"description":"<!----A",
+"input":"<!----A",
+"output":["ParseError", "ParseError", ["Comment", "--A"]]},
+
+{"description":"<!----B",
+"input":"<!----B",
+"output":["ParseError", "ParseError", ["Comment", "--B"]]},
+
+{"description":"<!----Y",
+"input":"<!----Y",
+"output":["ParseError", "ParseError", ["Comment", "--Y"]]},
+
+{"description":"<!----Z",
+"input":"<!----Z",
+"output":["ParseError", "ParseError", ["Comment", "--Z"]]},
+
+{"description":"<!----`",
+"input":"<!----`",
+"output":["ParseError", "ParseError", ["Comment", "--`"]]},
+
+{"description":"<!----a",
+"input":"<!----a",
+"output":["ParseError", "ParseError", ["Comment", "--a"]]},
+
+{"description":"<!----b",
+"input":"<!----b",
+"output":["ParseError", "ParseError", ["Comment", "--b"]]},
+
+{"description":"<!----y",
+"input":"<!----y",
+"output":["ParseError", "ParseError", ["Comment", "--y"]]},
+
+{"description":"<!----z",
+"input":"<!----z",
+"output":["ParseError", "ParseError", ["Comment", "--z"]]},
+
+{"description":"<!----{",
+"input":"<!----{",
+"output":["ParseError", "ParseError", ["Comment", "--{"]]},
+
+{"description":"<!----\\uDBC0\\uDC00",
+"input":"<!----\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["Comment", "--\uDBC0\uDC00"]]},
+
+{"description":"<!---.",
+"input":"<!---.",
+"output":["ParseError", ["Comment", "-."]]},
+
+{"description":"<!---/",
+"input":"<!---/",
+"output":["ParseError", ["Comment", "-/"]]},
+
+{"description":"<!---0",
+"input":"<!---0",
+"output":["ParseError", ["Comment", "-0"]]},
+
+{"description":"<!---1",
+"input":"<!---1",
+"output":["ParseError", ["Comment", "-1"]]},
+
+{"description":"<!---9",
+"input":"<!---9",
+"output":["ParseError", ["Comment", "-9"]]},
+
+{"description":"<!---<",
+"input":"<!---<",
+"output":["ParseError", ["Comment", "-<"]]},
+
+{"description":"<!---=",
+"input":"<!---=",
+"output":["ParseError", ["Comment", "-="]]},
+
+{"description":"<!--->",
+"input":"<!--->",
+"output":["ParseError", ["Comment", ""]]},
+
+{"description":"<!---?",
+"input":"<!---?",
+"output":["ParseError", ["Comment", "-?"]]},
+
+{"description":"<!---@",
+"input":"<!---@",
+"output":["ParseError", ["Comment", "-@"]]},
+
+{"description":"<!---A",
+"input":"<!---A",
+"output":["ParseError", ["Comment", "-A"]]},
+
+{"description":"<!---B",
+"input":"<!---B",
+"output":["ParseError", ["Comment", "-B"]]},
+
+{"description":"<!---Y",
+"input":"<!---Y",
+"output":["ParseError", ["Comment", "-Y"]]},
+
+{"description":"<!---Z",
+"input":"<!---Z",
+"output":["ParseError", ["Comment", "-Z"]]},
+
+{"description":"<!---`",
+"input":"<!---`",
+"output":["ParseError", ["Comment", "-`"]]},
+
+{"description":"<!---a",
+"input":"<!---a",
+"output":["ParseError", ["Comment", "-a"]]},
+
+{"description":"<!---b",
+"input":"<!---b",
+"output":["ParseError", ["Comment", "-b"]]},
+
+{"description":"<!---y",
+"input":"<!---y",
+"output":["ParseError", ["Comment", "-y"]]},
+
+{"description":"<!---z",
+"input":"<!---z",
+"output":["ParseError", ["Comment", "-z"]]},
+
+{"description":"<!---{",
+"input":"<!---{",
+"output":["ParseError", ["Comment", "-{"]]},
+
+{"description":"<!---\\uDBC0\\uDC00",
+"input":"<!---\uDBC0\uDC00",
+"output":["ParseError", ["Comment", "-\uDBC0\uDC00"]]},
+
+{"description":"<!--.",
+"input":"<!--.",
+"output":["ParseError", ["Comment", "."]]},
+
+{"description":"<!--/",
+"input":"<!--/",
+"output":["ParseError", ["Comment", "/"]]},
+
+{"description":"<!--0",
+"input":"<!--0",
+"output":["ParseError", ["Comment", "0"]]},
+
+{"description":"<!--1",
+"input":"<!--1",
+"output":["ParseError", ["Comment", "1"]]},
+
+{"description":"<!--9",
+"input":"<!--9",
+"output":["ParseError", ["Comment", "9"]]},
+
+{"description":"<!--<",
+"input":"<!--<",
+"output":["ParseError", ["Comment", "<"]]},
+
+{"description":"<!--=",
+"input":"<!--=",
+"output":["ParseError", ["Comment", "="]]},
+
+{"description":"<!-->",
+"input":"<!-->",
+"output":["ParseError", ["Comment", ""]]},
+
+{"description":"<!--?",
+"input":"<!--?",
+"output":["ParseError", ["Comment", "?"]]},
+
+{"description":"<!--@",
+"input":"<!--@",
+"output":["ParseError", ["Comment", "@"]]},
+
+{"description":"<!--A",
+"input":"<!--A",
+"output":["ParseError", ["Comment", "A"]]},
+
+{"description":"<!--B",
+"input":"<!--B",
+"output":["ParseError", ["Comment", "B"]]},
+
+{"description":"<!--Y",
+"input":"<!--Y",
+"output":["ParseError", ["Comment", "Y"]]},
+
+{"description":"<!--Z",
+"input":"<!--Z",
+"output":["ParseError", ["Comment", "Z"]]},
+
+{"description":"<!--`",
+"input":"<!--`",
+"output":["ParseError", ["Comment", "`"]]},
+
+{"description":"<!--a",
+"input":"<!--a",
+"output":["ParseError", ["Comment", "a"]]},
+
+{"description":"<!--b",
+"input":"<!--b",
+"output":["ParseError", ["Comment", "b"]]},
+
+{"description":"<!--y",
+"input":"<!--y",
+"output":["ParseError", ["Comment", "y"]]},
+
+{"description":"<!--z",
+"input":"<!--z",
+"output":["ParseError", ["Comment", "z"]]},
+
+{"description":"<!--{",
+"input":"<!--{",
+"output":["ParseError", ["Comment", "{"]]},
+
+{"description":"<!--\\uDBC0\\uDC00",
+"input":"<!--\uDBC0\uDC00",
+"output":["ParseError", ["Comment", "\uDBC0\uDC00"]]},
+
+{"description":"<!/",
+"input":"<!/",
+"output":["ParseError", ["Comment", "/"]]},
+
+{"description":"<!0",
+"input":"<!0",
+"output":["ParseError", ["Comment", "0"]]},
+
+{"description":"<!1",
+"input":"<!1",
+"output":["ParseError", ["Comment", "1"]]},
+
+{"description":"<!9",
+"input":"<!9",
+"output":["ParseError", ["Comment", "9"]]},
+
+{"description":"<!<",
+"input":"<!<",
+"output":["ParseError", ["Comment", "<"]]},
+
+{"description":"<!=",
+"input":"<!=",
+"output":["ParseError", ["Comment", "="]]},
+
+{"description":"<!>",
+"input":"<!>",
+"output":["ParseError", ["Comment", ""]]},
+
+{"description":"<!?",
+"input":"<!?",
+"output":["ParseError", ["Comment", "?"]]},
+
+{"description":"<!@",
+"input":"<!@",
+"output":["ParseError", ["Comment", "@"]]},
+
+{"description":"<!A",
+"input":"<!A",
+"output":["ParseError", ["Comment", "A"]]},
+
+{"description":"<!B",
+"input":"<!B",
+"output":["ParseError", ["Comment", "B"]]},
+
+{"description":"<!DOCTYPE",
+"input":"<!DOCTYPE",
+"output":["ParseError", ["DOCTYPE", "", null, null, false]]},
+
+{"description":"<!DOCTYPE\\u0000",
+"input":"<!DOCTYPE\u0000",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "\uFFFD", null, null, false]]},
+
+{"description":"<!DOCTYPE\\u0008",
+"input":"<!DOCTYPE\u0008",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "\u0008", null, null, false]]},
+
+{"description":"<!DOCTYPE\\u0009",
+"input":"<!DOCTYPE\u0009",
+"output":["ParseError", ["DOCTYPE", "", null, null, false]]},
+
+{"description":"<!DOCTYPE\\u000A",
+"input":"<!DOCTYPE\u000A",
+"output":["ParseError", ["DOCTYPE", "", null, null, false]]},
+
+{"description":"<!DOCTYPE\\u000B",
+"input":"<!DOCTYPE\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "\u000B", null, null, false]]},
+
+{"description":"<!DOCTYPE\\u000C",
+"input":"<!DOCTYPE\u000C",
+"output":["ParseError", ["DOCTYPE", "", null, null, false]]},
+
+{"description":"<!DOCTYPE\\u000D",
+"input":"<!DOCTYPE\u000D",
+"output":["ParseError", ["DOCTYPE", "", null, null, false]]},
+
+{"description":"<!DOCTYPE\\u001F",
+"input":"<!DOCTYPE\u001F",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "\u001F", null, null, false]]},
+
+{"description":"<!DOCTYPE ",
+"input":"<!DOCTYPE ",
+"output":["ParseError", ["DOCTYPE", "", null, null, false]]},
+
+{"description":"<!DOCTYPE \\u0000",
+"input":"<!DOCTYPE \u0000",
+"output":["ParseError", "ParseError", ["DOCTYPE", "\uFFFD", null, null, false]]},
+
+{"description":"<!DOCTYPE \\u0008",
+"input":"<!DOCTYPE \u0008",
+"output":["ParseError", "ParseError", ["DOCTYPE", "\u0008", null, null, false]]},
+
+{"description":"<!DOCTYPE \\u0009",
+"input":"<!DOCTYPE \u0009",
+"output":["ParseError", ["DOCTYPE", "", null, null, false]]},
+
+{"description":"<!DOCTYPE \\u000A",
+"input":"<!DOCTYPE \u000A",
+"output":["ParseError", ["DOCTYPE", "", null, null, false]]},
+
+{"description":"<!DOCTYPE \\u000B",
+"input":"<!DOCTYPE \u000B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "\u000B", null, null, false]]},
+
+{"description":"<!DOCTYPE \\u000C",
+"input":"<!DOCTYPE \u000C",
+"output":["ParseError", ["DOCTYPE", "", null, null, false]]},
+
+{"description":"<!DOCTYPE \\u000D",
+"input":"<!DOCTYPE \u000D",
+"output":["ParseError", ["DOCTYPE", "", null, null, false]]},
+
+{"description":"<!DOCTYPE \\u001F",
+"input":"<!DOCTYPE \u001F",
+"output":["ParseError", "ParseError", ["DOCTYPE", "\u001F", null, null, false]]},
+
+{"description":"<!DOCTYPE  ",
+"input":"<!DOCTYPE  ",
+"output":["ParseError", ["DOCTYPE", "", null, null, false]]},
+
+{"description":"<!DOCTYPE !",
+"input":"<!DOCTYPE !",
+"output":["ParseError", ["DOCTYPE", "!", null, null, false]]},
+
+{"description":"<!DOCTYPE \"",
+"input":"<!DOCTYPE \"",
+"output":["ParseError", ["DOCTYPE", "\"", null, null, false]]},
+
+{"description":"<!DOCTYPE &",
+"input":"<!DOCTYPE &",
+"output":["ParseError", ["DOCTYPE", "&", null, null, false]]},
+
+{"description":"<!DOCTYPE '",
+"input":"<!DOCTYPE '",
+"output":["ParseError", ["DOCTYPE", "'", null, null, false]]},
+
+{"description":"<!DOCTYPE -",
+"input":"<!DOCTYPE -",
+"output":["ParseError", ["DOCTYPE", "-", null, null, false]]},
+
+{"description":"<!DOCTYPE /",
+"input":"<!DOCTYPE /",
+"output":["ParseError", ["DOCTYPE", "/", null, null, false]]},
+
+{"description":"<!DOCTYPE 0",
+"input":"<!DOCTYPE 0",
+"output":["ParseError", ["DOCTYPE", "0", null, null, false]]},
+
+{"description":"<!DOCTYPE 1",
+"input":"<!DOCTYPE 1",
+"output":["ParseError", ["DOCTYPE", "1", null, null, false]]},
+
+{"description":"<!DOCTYPE 9",
+"input":"<!DOCTYPE 9",
+"output":["ParseError", ["DOCTYPE", "9", null, null, false]]},
+
+{"description":"<!DOCTYPE <",
+"input":"<!DOCTYPE <",
+"output":["ParseError", ["DOCTYPE", "<", null, null, false]]},
+
+{"description":"<!DOCTYPE =",
+"input":"<!DOCTYPE =",
+"output":["ParseError", ["DOCTYPE", "=", null, null, false]]},
+
+{"description":"<!DOCTYPE >",
+"input":"<!DOCTYPE >",
+"output":["ParseError", ["DOCTYPE", "", null, null, false]]},
+
+{"description":"<!DOCTYPE ?",
+"input":"<!DOCTYPE ?",
+"output":["ParseError", ["DOCTYPE", "?", null, null, false]]},
+
+{"description":"<!DOCTYPE @",
+"input":"<!DOCTYPE @",
+"output":["ParseError", ["DOCTYPE", "@", null, null, false]]},
+
+{"description":"<!DOCTYPE A",
+"input":"<!DOCTYPE A",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE B",
+"input":"<!DOCTYPE B",
+"output":["ParseError", ["DOCTYPE", "b", null, null, false]]},
+
+{"description":"<!DOCTYPE Y",
+"input":"<!DOCTYPE Y",
+"output":["ParseError", ["DOCTYPE", "y", null, null, false]]},
+
+{"description":"<!DOCTYPE Z",
+"input":"<!DOCTYPE Z",
+"output":["ParseError", ["DOCTYPE", "z", null, null, false]]},
+
+{"description":"<!DOCTYPE [",
+"input":"<!DOCTYPE [",
+"output":["ParseError", ["DOCTYPE", "[", null, null, false]]},
+
+{"description":"<!DOCTYPE `",
+"input":"<!DOCTYPE `",
+"output":["ParseError", ["DOCTYPE", "`", null, null, false]]},
+
+{"description":"<!DOCTYPE a",
+"input":"<!DOCTYPE a",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a\\u0000",
+"input":"<!DOCTYPE a\u0000",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a\uFFFD", null, null, false]]},
+
+{"description":"<!DOCTYPE a\\u0008",
+"input":"<!DOCTYPE a\u0008",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a\u0008", null, null, false]]},
+
+{"description":"<!DOCTYPE a\\u0009",
+"input":"<!DOCTYPE a\u0009",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a\\u000A",
+"input":"<!DOCTYPE a\u000A",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a\\u000B",
+"input":"<!DOCTYPE a\u000B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a\u000B", null, null, false]]},
+
+{"description":"<!DOCTYPE a\\u000C",
+"input":"<!DOCTYPE a\u000C",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a\\u000D",
+"input":"<!DOCTYPE a\u000D",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a\\u001F",
+"input":"<!DOCTYPE a\u001F",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a\u001F", null, null, false]]},
+
+{"description":"<!DOCTYPE a ",
+"input":"<!DOCTYPE a ",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a \\u0000",
+"input":"<!DOCTYPE a \u0000",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a \\u0008",
+"input":"<!DOCTYPE a \u0008",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a \\u0009",
+"input":"<!DOCTYPE a \u0009",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a \\u000A",
+"input":"<!DOCTYPE a \u000A",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a \\u000B",
+"input":"<!DOCTYPE a \u000B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a \\u000C",
+"input":"<!DOCTYPE a \u000C",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a \\u000D",
+"input":"<!DOCTYPE a \u000D",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a \\u001F",
+"input":"<!DOCTYPE a \u001F",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a  ",
+"input":"<!DOCTYPE a  ",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a !",
+"input":"<!DOCTYPE a !",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a \"",
+"input":"<!DOCTYPE a \"",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a &",
+"input":"<!DOCTYPE a &",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a '",
+"input":"<!DOCTYPE a '",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a -",
+"input":"<!DOCTYPE a -",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a /",
+"input":"<!DOCTYPE a /",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a 0",
+"input":"<!DOCTYPE a 0",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a 1",
+"input":"<!DOCTYPE a 1",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a 9",
+"input":"<!DOCTYPE a 9",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a <",
+"input":"<!DOCTYPE a <",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a =",
+"input":"<!DOCTYPE a =",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a >",
+"input":"<!DOCTYPE a >",
+"output":[["DOCTYPE", "a", null, null, true]]},
+
+{"description":"<!DOCTYPE a ?",
+"input":"<!DOCTYPE a ?",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a @",
+"input":"<!DOCTYPE a @",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a A",
+"input":"<!DOCTYPE a A",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a B",
+"input":"<!DOCTYPE a B",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC",
+"input":"<!DOCTYPE a PUBLIC",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\\u0000",
+"input":"<!DOCTYPE a PUBLIC\u0000",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\\u0008",
+"input":"<!DOCTYPE a PUBLIC\u0008",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\\u0009",
+"input":"<!DOCTYPE a PUBLIC\u0009",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\\u000A",
+"input":"<!DOCTYPE a PUBLIC\u000A",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\\u000B",
+"input":"<!DOCTYPE a PUBLIC\u000B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\\u000C",
+"input":"<!DOCTYPE a PUBLIC\u000C",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\\u000D",
+"input":"<!DOCTYPE a PUBLIC\u000D",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\\u001F",
+"input":"<!DOCTYPE a PUBLIC\u001F",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC ",
+"input":"<!DOCTYPE a PUBLIC ",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC!",
+"input":"<!DOCTYPE a PUBLIC!",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"",
+"input":"<!DOCTYPE a PUBLIC\"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"\\u0000",
+"input":"<!DOCTYPE a PUBLIC\"\u0000",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\uFFFD", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"\\u0009",
+"input":"<!DOCTYPE a PUBLIC\"\u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\u0009", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"\\u000A",
+"input":"<!DOCTYPE a PUBLIC\"\u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\u000A", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"\\u000B",
+"input":"<!DOCTYPE a PUBLIC\"\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000B", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"\\u000C",
+"input":"<!DOCTYPE a PUBLIC\"\u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\u000C", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\" ",
+"input":"<!DOCTYPE a PUBLIC\" ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", " ", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"!",
+"input":"<!DOCTYPE a PUBLIC\"!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "!", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"\"",
+"input":"<!DOCTYPE a PUBLIC\"\"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"#",
+"input":"<!DOCTYPE a PUBLIC\"#",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "#", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"&",
+"input":"<!DOCTYPE a PUBLIC\"&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "&", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"'",
+"input":"<!DOCTYPE a PUBLIC\"'",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "'", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"-",
+"input":"<!DOCTYPE a PUBLIC\"-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "-", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"/",
+"input":"<!DOCTYPE a PUBLIC\"/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "/", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"0",
+"input":"<!DOCTYPE a PUBLIC\"0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "0", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"1",
+"input":"<!DOCTYPE a PUBLIC\"1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "1", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"9",
+"input":"<!DOCTYPE a PUBLIC\"9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "9", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"<",
+"input":"<!DOCTYPE a PUBLIC\"<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "<", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"=",
+"input":"<!DOCTYPE a PUBLIC\"=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "=", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\">",
+"input":"<!DOCTYPE a PUBLIC\">",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"?",
+"input":"<!DOCTYPE a PUBLIC\"?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "?", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"@",
+"input":"<!DOCTYPE a PUBLIC\"@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "@", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"A",
+"input":"<!DOCTYPE a PUBLIC\"A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "A", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"B",
+"input":"<!DOCTYPE a PUBLIC\"B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "B", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"Y",
+"input":"<!DOCTYPE a PUBLIC\"Y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "Y", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"Z",
+"input":"<!DOCTYPE a PUBLIC\"Z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "Z", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"`",
+"input":"<!DOCTYPE a PUBLIC\"`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "`", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"a",
+"input":"<!DOCTYPE a PUBLIC\"a",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "a", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"b",
+"input":"<!DOCTYPE a PUBLIC\"b",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "b", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"y",
+"input":"<!DOCTYPE a PUBLIC\"y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "y", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"z",
+"input":"<!DOCTYPE a PUBLIC\"z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "z", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"{",
+"input":"<!DOCTYPE a PUBLIC\"{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "{", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"\\uDBC0\\uDC00",
+"input":"<!DOCTYPE a PUBLIC\"\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\uDBC0\uDC00", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC#",
+"input":"<!DOCTYPE a PUBLIC#",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC&",
+"input":"<!DOCTYPE a PUBLIC&",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'",
+"input":"<!DOCTYPE a PUBLIC'",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'\\u0000",
+"input":"<!DOCTYPE a PUBLIC'\u0000",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\uFFFD", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'\\u0009",
+"input":"<!DOCTYPE a PUBLIC'\u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\u0009", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'\\u000A",
+"input":"<!DOCTYPE a PUBLIC'\u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\u000A", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'\\u000B",
+"input":"<!DOCTYPE a PUBLIC'\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000B", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'\\u000C",
+"input":"<!DOCTYPE a PUBLIC'\u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\u000C", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC' ",
+"input":"<!DOCTYPE a PUBLIC' ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", " ", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'!",
+"input":"<!DOCTYPE a PUBLIC'!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "!", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'\"",
+"input":"<!DOCTYPE a PUBLIC'\"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\"", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'&",
+"input":"<!DOCTYPE a PUBLIC'&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "&", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''",
+"input":"<!DOCTYPE a PUBLIC''",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''\\u0000",
+"input":"<!DOCTYPE a PUBLIC''\u0000",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''\\u0008",
+"input":"<!DOCTYPE a PUBLIC''\u0008",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''\\u0009",
+"input":"<!DOCTYPE a PUBLIC''\u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''\\u000A",
+"input":"<!DOCTYPE a PUBLIC''\u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''\\u000B",
+"input":"<!DOCTYPE a PUBLIC''\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''\\u000C",
+"input":"<!DOCTYPE a PUBLIC''\u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''\\u000D",
+"input":"<!DOCTYPE a PUBLIC''\u000D",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''\\u001F",
+"input":"<!DOCTYPE a PUBLIC''\u001F",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'' ",
+"input":"<!DOCTYPE a PUBLIC'' ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''!",
+"input":"<!DOCTYPE a PUBLIC''!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''\"",
+"input":"<!DOCTYPE a PUBLIC''\"",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", "", false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''#",
+"input":"<!DOCTYPE a PUBLIC''#",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''&",
+"input":"<!DOCTYPE a PUBLIC''&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'''",
+"input":"<!DOCTYPE a PUBLIC'''",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", "", false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''(",
+"input":"<!DOCTYPE a PUBLIC''(",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''-",
+"input":"<!DOCTYPE a PUBLIC''-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''/",
+"input":"<!DOCTYPE a PUBLIC''/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''0",
+"input":"<!DOCTYPE a PUBLIC''0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''1",
+"input":"<!DOCTYPE a PUBLIC''1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''9",
+"input":"<!DOCTYPE a PUBLIC''9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''<",
+"input":"<!DOCTYPE a PUBLIC''<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''=",
+"input":"<!DOCTYPE a PUBLIC''=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''>",
+"input":"<!DOCTYPE a PUBLIC''>",
+"output":["ParseError", ["DOCTYPE", "a", "", null, true]]},
+
+{"description":"<!DOCTYPE a PUBLIC''?",
+"input":"<!DOCTYPE a PUBLIC''?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''@",
+"input":"<!DOCTYPE a PUBLIC''@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''A",
+"input":"<!DOCTYPE a PUBLIC''A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''B",
+"input":"<!DOCTYPE a PUBLIC''B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''Y",
+"input":"<!DOCTYPE a PUBLIC''Y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''Z",
+"input":"<!DOCTYPE a PUBLIC''Z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''`",
+"input":"<!DOCTYPE a PUBLIC''`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''a",
+"input":"<!DOCTYPE a PUBLIC''a",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''b",
+"input":"<!DOCTYPE a PUBLIC''b",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''y",
+"input":"<!DOCTYPE a PUBLIC''y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''z",
+"input":"<!DOCTYPE a PUBLIC''z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''{",
+"input":"<!DOCTYPE a PUBLIC''{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''\\uDBC0\\uDC00",
+"input":"<!DOCTYPE a PUBLIC''\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'(",
+"input":"<!DOCTYPE a PUBLIC'(",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "(", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'-",
+"input":"<!DOCTYPE a PUBLIC'-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "-", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'/",
+"input":"<!DOCTYPE a PUBLIC'/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "/", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'0",
+"input":"<!DOCTYPE a PUBLIC'0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "0", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'1",
+"input":"<!DOCTYPE a PUBLIC'1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "1", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'9",
+"input":"<!DOCTYPE a PUBLIC'9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "9", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'<",
+"input":"<!DOCTYPE a PUBLIC'<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "<", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'=",
+"input":"<!DOCTYPE a PUBLIC'=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "=", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'>",
+"input":"<!DOCTYPE a PUBLIC'>",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'?",
+"input":"<!DOCTYPE a PUBLIC'?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "?", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'@",
+"input":"<!DOCTYPE a PUBLIC'@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "@", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'A",
+"input":"<!DOCTYPE a PUBLIC'A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "A", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'B",
+"input":"<!DOCTYPE a PUBLIC'B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "B", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'Y",
+"input":"<!DOCTYPE a PUBLIC'Y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "Y", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'Z",
+"input":"<!DOCTYPE a PUBLIC'Z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "Z", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'`",
+"input":"<!DOCTYPE a PUBLIC'`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "`", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'a",
+"input":"<!DOCTYPE a PUBLIC'a",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "a", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'b",
+"input":"<!DOCTYPE a PUBLIC'b",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "b", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'y",
+"input":"<!DOCTYPE a PUBLIC'y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "y", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'z",
+"input":"<!DOCTYPE a PUBLIC'z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "z", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'{",
+"input":"<!DOCTYPE a PUBLIC'{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "{", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'\\uDBC0\\uDC00",
+"input":"<!DOCTYPE a PUBLIC'\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\uDBC0\uDC00", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC(",
+"input":"<!DOCTYPE a PUBLIC(",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC-",
+"input":"<!DOCTYPE a PUBLIC-",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC/",
+"input":"<!DOCTYPE a PUBLIC/",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC0",
+"input":"<!DOCTYPE a PUBLIC0",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC1",
+"input":"<!DOCTYPE a PUBLIC1",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC9",
+"input":"<!DOCTYPE a PUBLIC9",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC<",
+"input":"<!DOCTYPE a PUBLIC<",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC=",
+"input":"<!DOCTYPE a PUBLIC=",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC>",
+"input":"<!DOCTYPE a PUBLIC>",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC?",
+"input":"<!DOCTYPE a PUBLIC?",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC@",
+"input":"<!DOCTYPE a PUBLIC@",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLICA",
+"input":"<!DOCTYPE a PUBLICA",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLICB",
+"input":"<!DOCTYPE a PUBLICB",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLICY",
+"input":"<!DOCTYPE a PUBLICY",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLICZ",
+"input":"<!DOCTYPE a PUBLICZ",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC`",
+"input":"<!DOCTYPE a PUBLIC`",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLICa",
+"input":"<!DOCTYPE a PUBLICa",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLICb",
+"input":"<!DOCTYPE a PUBLICb",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLICy",
+"input":"<!DOCTYPE a PUBLICy",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLICz",
+"input":"<!DOCTYPE a PUBLICz",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC{",
+"input":"<!DOCTYPE a PUBLIC{",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\\uDBC0\\uDC00",
+"input":"<!DOCTYPE a PUBLIC\uDBC0\uDC00",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM",
+"input":"<!DOCTYPE a SYSTEM",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\\u0000",
+"input":"<!DOCTYPE a SYSTEM\u0000",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\\u0008",
+"input":"<!DOCTYPE a SYSTEM\u0008",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\\u0009",
+"input":"<!DOCTYPE a SYSTEM\u0009",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\\u000A",
+"input":"<!DOCTYPE a SYSTEM\u000A",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\\u000B",
+"input":"<!DOCTYPE a SYSTEM\u000B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\\u000C",
+"input":"<!DOCTYPE a SYSTEM\u000C",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\\u000D",
+"input":"<!DOCTYPE a SYSTEM\u000D",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\\u001F",
+"input":"<!DOCTYPE a SYSTEM\u001F",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM ",
+"input":"<!DOCTYPE a SYSTEM ",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM!",
+"input":"<!DOCTYPE a SYSTEM!",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"",
+"input":"<!DOCTYPE a SYSTEM\"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"\\u0000",
+"input":"<!DOCTYPE a SYSTEM\"\u0000",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\uFFFD", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"\\u0009",
+"input":"<!DOCTYPE a SYSTEM\"\u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\u0009", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"\\u000A",
+"input":"<!DOCTYPE a SYSTEM\"\u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000A", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"\\u000B",
+"input":"<!DOCTYPE a SYSTEM\"\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000B", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"\\u000C",
+"input":"<!DOCTYPE a SYSTEM\"\u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000C", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\" ",
+"input":"<!DOCTYPE a SYSTEM\" ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, " ", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"!",
+"input":"<!DOCTYPE a SYSTEM\"!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "!", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"\"",
+"input":"<!DOCTYPE a SYSTEM\"\"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"#",
+"input":"<!DOCTYPE a SYSTEM\"#",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "#", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"&",
+"input":"<!DOCTYPE a SYSTEM\"&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "&", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"'",
+"input":"<!DOCTYPE a SYSTEM\"'",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "'", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"-",
+"input":"<!DOCTYPE a SYSTEM\"-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "-", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"/",
+"input":"<!DOCTYPE a SYSTEM\"/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "/", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"0",
+"input":"<!DOCTYPE a SYSTEM\"0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "0", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"1",
+"input":"<!DOCTYPE a SYSTEM\"1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "1", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"9",
+"input":"<!DOCTYPE a SYSTEM\"9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "9", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"<",
+"input":"<!DOCTYPE a SYSTEM\"<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "<", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"=",
+"input":"<!DOCTYPE a SYSTEM\"=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "=", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\">",
+"input":"<!DOCTYPE a SYSTEM\">",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"?",
+"input":"<!DOCTYPE a SYSTEM\"?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "?", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"@",
+"input":"<!DOCTYPE a SYSTEM\"@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "@", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"A",
+"input":"<!DOCTYPE a SYSTEM\"A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "A", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"B",
+"input":"<!DOCTYPE a SYSTEM\"B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "B", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"Y",
+"input":"<!DOCTYPE a SYSTEM\"Y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "Y", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"Z",
+"input":"<!DOCTYPE a SYSTEM\"Z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "Z", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"`",
+"input":"<!DOCTYPE a SYSTEM\"`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "`", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"a",
+"input":"<!DOCTYPE a SYSTEM\"a",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "a", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"b",
+"input":"<!DOCTYPE a SYSTEM\"b",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "b", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"y",
+"input":"<!DOCTYPE a SYSTEM\"y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "y", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"z",
+"input":"<!DOCTYPE a SYSTEM\"z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "z", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"{",
+"input":"<!DOCTYPE a SYSTEM\"{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "{", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"\\uDBC0\\uDC00",
+"input":"<!DOCTYPE a SYSTEM\"\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\uDBC0\uDC00", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM#",
+"input":"<!DOCTYPE a SYSTEM#",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM&",
+"input":"<!DOCTYPE a SYSTEM&",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'",
+"input":"<!DOCTYPE a SYSTEM'",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'\\u0000",
+"input":"<!DOCTYPE a SYSTEM'\u0000",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\uFFFD", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'\\u0009",
+"input":"<!DOCTYPE a SYSTEM'\u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\u0009", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'\\u000A",
+"input":"<!DOCTYPE a SYSTEM'\u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000A", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'\\u000B",
+"input":"<!DOCTYPE a SYSTEM'\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000B", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'\\u000C",
+"input":"<!DOCTYPE a SYSTEM'\u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000C", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM' ",
+"input":"<!DOCTYPE a SYSTEM' ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, " ", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'!",
+"input":"<!DOCTYPE a SYSTEM'!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "!", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'\"",
+"input":"<!DOCTYPE a SYSTEM'\"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\"", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'&",
+"input":"<!DOCTYPE a SYSTEM'&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "&", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM''",
+"input":"<!DOCTYPE a SYSTEM''",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM''\\u0000",
+"input":"<!DOCTYPE a SYSTEM''\u0000",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''\\u0008",
+"input":"<!DOCTYPE a SYSTEM''\u0008",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''\\u0009",
+"input":"<!DOCTYPE a SYSTEM''\u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM''\\u000A",
+"input":"<!DOCTYPE a SYSTEM''\u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM''\\u000B",
+"input":"<!DOCTYPE a SYSTEM''\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''\\u000C",
+"input":"<!DOCTYPE a SYSTEM''\u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM''\\u000D",
+"input":"<!DOCTYPE a SYSTEM''\u000D",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM''\\u001F",
+"input":"<!DOCTYPE a SYSTEM''\u001F",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM'' ",
+"input":"<!DOCTYPE a SYSTEM'' ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM''!",
+"input":"<!DOCTYPE a SYSTEM''!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''\"",
+"input":"<!DOCTYPE a SYSTEM''\"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''&",
+"input":"<!DOCTYPE a SYSTEM''&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM'''",
+"input":"<!DOCTYPE a SYSTEM'''",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''-",
+"input":"<!DOCTYPE a SYSTEM''-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''/",
+"input":"<!DOCTYPE a SYSTEM''/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''0",
+"input":"<!DOCTYPE a SYSTEM''0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''1",
+"input":"<!DOCTYPE a SYSTEM''1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''9",
+"input":"<!DOCTYPE a SYSTEM''9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''<",
+"input":"<!DOCTYPE a SYSTEM''<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''=",
+"input":"<!DOCTYPE a SYSTEM''=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''>",
+"input":"<!DOCTYPE a SYSTEM''>",
+"output":["ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''?",
+"input":"<!DOCTYPE a SYSTEM''?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''@",
+"input":"<!DOCTYPE a SYSTEM''@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''A",
+"input":"<!DOCTYPE a SYSTEM''A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''B",
+"input":"<!DOCTYPE a SYSTEM''B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''Y",
+"input":"<!DOCTYPE a SYSTEM''Y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''Z",
+"input":"<!DOCTYPE a SYSTEM''Z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''`",
+"input":"<!DOCTYPE a SYSTEM''`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''a",
+"input":"<!DOCTYPE a SYSTEM''a",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''b",
+"input":"<!DOCTYPE a SYSTEM''b",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''y",
+"input":"<!DOCTYPE a SYSTEM''y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''z",
+"input":"<!DOCTYPE a SYSTEM''z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''{",
+"input":"<!DOCTYPE a SYSTEM''{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''\\uDBC0\\uDC00",
+"input":"<!DOCTYPE a SYSTEM''\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM'(",
+"input":"<!DOCTYPE a SYSTEM'(",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "(", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'-",
+"input":"<!DOCTYPE a SYSTEM'-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "-", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'/",
+"input":"<!DOCTYPE a SYSTEM'/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "/", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'0",
+"input":"<!DOCTYPE a SYSTEM'0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "0", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'1",
+"input":"<!DOCTYPE a SYSTEM'1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "1", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'9",
+"input":"<!DOCTYPE a SYSTEM'9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "9", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'<",
+"input":"<!DOCTYPE a SYSTEM'<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "<", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'=",
+"input":"<!DOCTYPE a SYSTEM'=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "=", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'>",
+"input":"<!DOCTYPE a SYSTEM'>",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'?",
+"input":"<!DOCTYPE a SYSTEM'?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "?", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'@",
+"input":"<!DOCTYPE a SYSTEM'@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "@", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'A",
+"input":"<!DOCTYPE a SYSTEM'A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "A", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'B",
+"input":"<!DOCTYPE a SYSTEM'B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "B", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'Y",
+"input":"<!DOCTYPE a SYSTEM'Y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "Y", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'Z",
+"input":"<!DOCTYPE a SYSTEM'Z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "Z", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'`",
+"input":"<!DOCTYPE a SYSTEM'`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "`", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'a",
+"input":"<!DOCTYPE a SYSTEM'a",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "a", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'b",
+"input":"<!DOCTYPE a SYSTEM'b",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "b", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'y",
+"input":"<!DOCTYPE a SYSTEM'y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "y", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'z",
+"input":"<!DOCTYPE a SYSTEM'z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "z", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'{",
+"input":"<!DOCTYPE a SYSTEM'{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "{", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'\\uDBC0\\uDC00",
+"input":"<!DOCTYPE a SYSTEM'\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\uDBC0\uDC00", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM(",
+"input":"<!DOCTYPE a SYSTEM(",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM-",
+"input":"<!DOCTYPE a SYSTEM-",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM/",
+"input":"<!DOCTYPE a SYSTEM/",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM0",
+"input":"<!DOCTYPE a SYSTEM0",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM1",
+"input":"<!DOCTYPE a SYSTEM1",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM9",
+"input":"<!DOCTYPE a SYSTEM9",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM<",
+"input":"<!DOCTYPE a SYSTEM<",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM=",
+"input":"<!DOCTYPE a SYSTEM=",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM>",
+"input":"<!DOCTYPE a SYSTEM>",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM?",
+"input":"<!DOCTYPE a SYSTEM?",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM@",
+"input":"<!DOCTYPE a SYSTEM@",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEMA",
+"input":"<!DOCTYPE a SYSTEMA",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEMB",
+"input":"<!DOCTYPE a SYSTEMB",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEMY",
+"input":"<!DOCTYPE a SYSTEMY",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEMZ",
+"input":"<!DOCTYPE a SYSTEMZ",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM`",
+"input":"<!DOCTYPE a SYSTEM`",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEMa",
+"input":"<!DOCTYPE a SYSTEMa",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEMb",
+"input":"<!DOCTYPE a SYSTEMb",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEMy",
+"input":"<!DOCTYPE a SYSTEMy",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEMz",
+"input":"<!DOCTYPE a SYSTEMz",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM{",
+"input":"<!DOCTYPE a SYSTEM{",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\\uDBC0\\uDC00",
+"input":"<!DOCTYPE a SYSTEM\uDBC0\uDC00",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a Y",
+"input":"<!DOCTYPE a Y",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a Z",
+"input":"<!DOCTYPE a Z",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a `",
+"input":"<!DOCTYPE a `",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a",
+"input":"<!DOCTYPE a a",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a\\u0000",
+"input":"<!DOCTYPE a a\u0000",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a\\u0009",
+"input":"<!DOCTYPE a a\u0009",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a\\u000A",
+"input":"<!DOCTYPE a a\u000A",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a\\u000B",
+"input":"<!DOCTYPE a a\u000B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a\\u000C",
+"input":"<!DOCTYPE a a\u000C",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a ",
+"input":"<!DOCTYPE a a ",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a!",
+"input":"<!DOCTYPE a a!",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a\"",
+"input":"<!DOCTYPE a a\"",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a&",
+"input":"<!DOCTYPE a a&",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a'",
+"input":"<!DOCTYPE a a'",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a-",
+"input":"<!DOCTYPE a a-",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a/",
+"input":"<!DOCTYPE a a/",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a0",
+"input":"<!DOCTYPE a a0",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a1",
+"input":"<!DOCTYPE a a1",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a9",
+"input":"<!DOCTYPE a a9",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a<",
+"input":"<!DOCTYPE a a<",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a=",
+"input":"<!DOCTYPE a a=",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a>",
+"input":"<!DOCTYPE a a>",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a?",
+"input":"<!DOCTYPE a a?",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a@",
+"input":"<!DOCTYPE a a@",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a aA",
+"input":"<!DOCTYPE a aA",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a aB",
+"input":"<!DOCTYPE a aB",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a aY",
+"input":"<!DOCTYPE a aY",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a aZ",
+"input":"<!DOCTYPE a aZ",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a`",
+"input":"<!DOCTYPE a a`",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a aa",
+"input":"<!DOCTYPE a aa",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a ab",
+"input":"<!DOCTYPE a ab",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a ay",
+"input":"<!DOCTYPE a ay",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a az",
+"input":"<!DOCTYPE a az",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a{",
+"input":"<!DOCTYPE a a{",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a\\uDBC0\\uDC00",
+"input":"<!DOCTYPE a a\uDBC0\uDC00",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a b",
+"input":"<!DOCTYPE a b",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a y",
+"input":"<!DOCTYPE a y",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a z",
+"input":"<!DOCTYPE a z",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a {",
+"input":"<!DOCTYPE a {",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a \\uDBC0\\uDC00",
+"input":"<!DOCTYPE a \uDBC0\uDC00",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a!",
+"input":"<!DOCTYPE a!",
+"output":["ParseError", ["DOCTYPE", "a!", null, null, false]]},
+
+{"description":"<!DOCTYPE a\"",
+"input":"<!DOCTYPE a\"",
+"output":["ParseError", ["DOCTYPE", "a\"", null, null, false]]},
+
+{"description":"<!DOCTYPE a&",
+"input":"<!DOCTYPE a&",
+"output":["ParseError", ["DOCTYPE", "a&", null, null, false]]},
+
+{"description":"<!DOCTYPE a'",
+"input":"<!DOCTYPE a'",
+"output":["ParseError", ["DOCTYPE", "a'", null, null, false]]},
+
+{"description":"<!DOCTYPE a-",
+"input":"<!DOCTYPE a-",
+"output":["ParseError", ["DOCTYPE", "a-", null, null, false]]},
+
+{"description":"<!DOCTYPE a/",
+"input":"<!DOCTYPE a/",
+"output":["ParseError", ["DOCTYPE", "a/", null, null, false]]},
+
+{"description":"<!DOCTYPE a0",
+"input":"<!DOCTYPE a0",
+"output":["ParseError", ["DOCTYPE", "a0", null, null, false]]},
+
+{"description":"<!DOCTYPE a1",
+"input":"<!DOCTYPE a1",
+"output":["ParseError", ["DOCTYPE", "a1", null, null, false]]},
+
+{"description":"<!DOCTYPE a9",
+"input":"<!DOCTYPE a9",
+"output":["ParseError", ["DOCTYPE", "a9", null, null, false]]},
+
+{"description":"<!DOCTYPE a<",
+"input":"<!DOCTYPE a<",
+"output":["ParseError", ["DOCTYPE", "a<", null, null, false]]},
+
+{"description":"<!DOCTYPE a=",
+"input":"<!DOCTYPE a=",
+"output":["ParseError", ["DOCTYPE", "a=", null, null, false]]},
+
+{"description":"<!DOCTYPE a>",
+"input":"<!DOCTYPE a>",
+"output":[["DOCTYPE", "a", null, null, true]]},
+
+{"description":"<!DOCTYPE a?",
+"input":"<!DOCTYPE a?",
+"output":["ParseError", ["DOCTYPE", "a?", null, null, false]]},
+
+{"description":"<!DOCTYPE a@",
+"input":"<!DOCTYPE a@",
+"output":["ParseError", ["DOCTYPE", "a@", null, null, false]]},
+
+{"description":"<!DOCTYPE aA",
+"input":"<!DOCTYPE aA",
+"output":["ParseError", ["DOCTYPE", "aa", null, null, false]]},
+
+{"description":"<!DOCTYPE aB",
+"input":"<!DOCTYPE aB",
+"output":["ParseError", ["DOCTYPE", "ab", null, null, false]]},
+
+{"description":"<!DOCTYPE aY",
+"input":"<!DOCTYPE aY",
+"output":["ParseError", ["DOCTYPE", "ay", null, null, false]]},
+
+{"description":"<!DOCTYPE aZ",
+"input":"<!DOCTYPE aZ",
+"output":["ParseError", ["DOCTYPE", "az", null, null, false]]},
+
+{"description":"<!DOCTYPE a[",
+"input":"<!DOCTYPE a[",
+"output":["ParseError", ["DOCTYPE", "a[", null, null, false]]},
+
+{"description":"<!DOCTYPE a`",
+"input":"<!DOCTYPE a`",
+"output":["ParseError", ["DOCTYPE", "a`", null, null, false]]},
+
+{"description":"<!DOCTYPE aa",
+"input":"<!DOCTYPE aa",
+"output":["ParseError", ["DOCTYPE", "aa", null, null, false]]},
+
+{"description":"<!DOCTYPE ab",
+"input":"<!DOCTYPE ab",
+"output":["ParseError", ["DOCTYPE", "ab", null, null, false]]},
+
+{"description":"<!DOCTYPE ay",
+"input":"<!DOCTYPE ay",
+"output":["ParseError", ["DOCTYPE", "ay", null, null, false]]},
+
+{"description":"<!DOCTYPE az",
+"input":"<!DOCTYPE az",
+"output":["ParseError", ["DOCTYPE", "az", null, null, false]]},
+
+{"description":"<!DOCTYPE a{",
+"input":"<!DOCTYPE a{",
+"output":["ParseError", ["DOCTYPE", "a{", null, null, false]]},
+
+{"description":"<!DOCTYPE a\\uDBC0\\uDC00",
+"input":"<!DOCTYPE a\uDBC0\uDC00",
+"output":["ParseError", ["DOCTYPE", "a\uDBC0\uDC00", null, null, false]]},
+
+{"description":"<!DOCTYPE b",
+"input":"<!DOCTYPE b",
+"output":["ParseError", ["DOCTYPE", "b", null, null, false]]},
+
+{"description":"<!DOCTYPE y",
+"input":"<!DOCTYPE y",
+"output":["ParseError", ["DOCTYPE", "y", null, null, false]]},
+
+{"description":"<!DOCTYPE z",
+"input":"<!DOCTYPE z",
+"output":["ParseError", ["DOCTYPE", "z", null, null, false]]},
+
+{"description":"<!DOCTYPE {",
+"input":"<!DOCTYPE {",
+"output":["ParseError", ["DOCTYPE", "{", null, null, false]]},
+
+{"description":"<!DOCTYPE \\uDBC0\\uDC00",
+"input":"<!DOCTYPE \uDBC0\uDC00",
+"output":["ParseError", ["DOCTYPE", "\uDBC0\uDC00", null, null, false]]},
+
+{"description":"<!DOCTYPE!",
+"input":"<!DOCTYPE!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "!", null, null, false]]},
+
+{"description":"<!DOCTYPE\"",
+"input":"<!DOCTYPE\"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "\"", null, null, false]]},
+
+{"description":"<!DOCTYPE&",
+"input":"<!DOCTYPE&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "&", null, null, false]]},
+
+{"description":"<!DOCTYPE'",
+"input":"<!DOCTYPE'",
+"output":["ParseError", "ParseError", ["DOCTYPE", "'", null, null, false]]},
+
+{"description":"<!DOCTYPE-",
+"input":"<!DOCTYPE-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "-", null, null, false]]},
+
+{"description":"<!DOCTYPE/",
+"input":"<!DOCTYPE/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "/", null, null, false]]},
+
+{"description":"<!DOCTYPE0",
+"input":"<!DOCTYPE0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "0", null, null, false]]},
+
+{"description":"<!DOCTYPE1",
+"input":"<!DOCTYPE1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "1", null, null, false]]},
+
+{"description":"<!DOCTYPE9",
+"input":"<!DOCTYPE9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "9", null, null, false]]},
+
+{"description":"<!DOCTYPE<",
+"input":"<!DOCTYPE<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "<", null, null, false]]},
+
+{"description":"<!DOCTYPE=",
+"input":"<!DOCTYPE=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "=", null, null, false]]},
+
+{"description":"<!DOCTYPE>",
+"input":"<!DOCTYPE>",
+"output":["ParseError", "ParseError", ["DOCTYPE", "", null, null, false]]},
+
+{"description":"<!DOCTYPE?",
+"input":"<!DOCTYPE?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "?", null, null, false]]},
+
+{"description":"<!DOCTYPE@",
+"input":"<!DOCTYPE@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "@", null, null, false]]},
+
+{"description":"<!DOCTYPEA",
+"input":"<!DOCTYPEA",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEB",
+"input":"<!DOCTYPEB",
+"output":["ParseError", "ParseError", ["DOCTYPE", "b", null, null, false]]},
+
+{"description":"<!DOCTYPEY",
+"input":"<!DOCTYPEY",
+"output":["ParseError", "ParseError", ["DOCTYPE", "y", null, null, false]]},
+
+{"description":"<!DOCTYPEZ",
+"input":"<!DOCTYPEZ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "z", null, null, false]]},
+
+{"description":"<!DOCTYPE`",
+"input":"<!DOCTYPE`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "`", null, null, false]]},
+
+{"description":"<!DOCTYPEa",
+"input":"<!DOCTYPEa",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa\\u0000",
+"input":"<!DOCTYPEa\u0000",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a\uFFFD", null, null, false]]},
+
+{"description":"<!DOCTYPEa\\u0008",
+"input":"<!DOCTYPEa\u0008",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a\u0008", null, null, false]]},
+
+{"description":"<!DOCTYPEa\\u0009",
+"input":"<!DOCTYPEa\u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa\\u000A",
+"input":"<!DOCTYPEa\u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa\\u000B",
+"input":"<!DOCTYPEa\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a\u000B", null, null, false]]},
+
+{"description":"<!DOCTYPEa\\u000C",
+"input":"<!DOCTYPEa\u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa\\u000D",
+"input":"<!DOCTYPEa\u000D",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa\\u001F",
+"input":"<!DOCTYPEa\u001F",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a\u001F", null, null, false]]},
+
+{"description":"<!DOCTYPEa ",
+"input":"<!DOCTYPEa ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa \\u0000",
+"input":"<!DOCTYPEa \u0000",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa \\u0008",
+"input":"<!DOCTYPEa \u0008",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa \\u0009",
+"input":"<!DOCTYPEa \u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa \\u000A",
+"input":"<!DOCTYPEa \u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa \\u000B",
+"input":"<!DOCTYPEa \u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa \\u000C",
+"input":"<!DOCTYPEa \u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa \\u000D",
+"input":"<!DOCTYPEa \u000D",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa \\u001F",
+"input":"<!DOCTYPEa \u001F",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa  ",
+"input":"<!DOCTYPEa  ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa !",
+"input":"<!DOCTYPEa !",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa \"",
+"input":"<!DOCTYPEa \"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa &",
+"input":"<!DOCTYPEa &",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa '",
+"input":"<!DOCTYPEa '",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa -",
+"input":"<!DOCTYPEa -",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa /",
+"input":"<!DOCTYPEa /",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa 0",
+"input":"<!DOCTYPEa 0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa 1",
+"input":"<!DOCTYPEa 1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa 9",
+"input":"<!DOCTYPEa 9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa <",
+"input":"<!DOCTYPEa <",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa =",
+"input":"<!DOCTYPEa =",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa >",
+"input":"<!DOCTYPEa >",
+"output":["ParseError", ["DOCTYPE", "a", null, null, true]]},
+
+{"description":"<!DOCTYPEa ?",
+"input":"<!DOCTYPEa ?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa @",
+"input":"<!DOCTYPEa @",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa A",
+"input":"<!DOCTYPEa A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa B",
+"input":"<!DOCTYPEa B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC",
+"input":"<!DOCTYPEa PUBLIC",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\\u0000",
+"input":"<!DOCTYPEa PUBLIC\u0000",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\\u0008",
+"input":"<!DOCTYPEa PUBLIC\u0008",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\\u0009",
+"input":"<!DOCTYPEa PUBLIC\u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\\u000A",
+"input":"<!DOCTYPEa PUBLIC\u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\\u000B",
+"input":"<!DOCTYPEa PUBLIC\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\\u000C",
+"input":"<!DOCTYPEa PUBLIC\u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\\u000D",
+"input":"<!DOCTYPEa PUBLIC\u000D",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\\u001F",
+"input":"<!DOCTYPEa PUBLIC\u001F",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC ",
+"input":"<!DOCTYPEa PUBLIC ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC!",
+"input":"<!DOCTYPEa PUBLIC!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"",
+"input":"<!DOCTYPEa PUBLIC\"",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"\\u0000",
+"input":"<!DOCTYPEa PUBLIC\"\u0000",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\uFFFD", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"\\u0009",
+"input":"<!DOCTYPEa PUBLIC\"\u0009",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u0009", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"\\u000A",
+"input":"<!DOCTYPEa PUBLIC\"\u000A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000A", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"\\u000B",
+"input":"<!DOCTYPEa PUBLIC\"\u000B",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000B", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"\\u000C",
+"input":"<!DOCTYPEa PUBLIC\"\u000C",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000C", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\" ",
+"input":"<!DOCTYPEa PUBLIC\" ",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", " ", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"!",
+"input":"<!DOCTYPEa PUBLIC\"!",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "!", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"\"",
+"input":"<!DOCTYPEa PUBLIC\"\"",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"#",
+"input":"<!DOCTYPEa PUBLIC\"#",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "#", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"&",
+"input":"<!DOCTYPEa PUBLIC\"&",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "&", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"'",
+"input":"<!DOCTYPEa PUBLIC\"'",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "'", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"-",
+"input":"<!DOCTYPEa PUBLIC\"-",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "-", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"/",
+"input":"<!DOCTYPEa PUBLIC\"/",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "/", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"0",
+"input":"<!DOCTYPEa PUBLIC\"0",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "0", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"1",
+"input":"<!DOCTYPEa PUBLIC\"1",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "1", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"9",
+"input":"<!DOCTYPEa PUBLIC\"9",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "9", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"<",
+"input":"<!DOCTYPEa PUBLIC\"<",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "<", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"=",
+"input":"<!DOCTYPEa PUBLIC\"=",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "=", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\">",
+"input":"<!DOCTYPEa PUBLIC\">",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"?",
+"input":"<!DOCTYPEa PUBLIC\"?",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "?", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"@",
+"input":"<!DOCTYPEa PUBLIC\"@",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "@", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"A",
+"input":"<!DOCTYPEa PUBLIC\"A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "A", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"B",
+"input":"<!DOCTYPEa PUBLIC\"B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "B", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"Y",
+"input":"<!DOCTYPEa PUBLIC\"Y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "Y", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"Z",
+"input":"<!DOCTYPEa PUBLIC\"Z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "Z", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"`",
+"input":"<!DOCTYPEa PUBLIC\"`",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "`", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"a",
+"input":"<!DOCTYPEa PUBLIC\"a",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "a", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"b",
+"input":"<!DOCTYPEa PUBLIC\"b",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "b", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"y",
+"input":"<!DOCTYPEa PUBLIC\"y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "y", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"z",
+"input":"<!DOCTYPEa PUBLIC\"z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "z", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"{",
+"input":"<!DOCTYPEa PUBLIC\"{",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "{", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"\\uDBC0\\uDC00",
+"input":"<!DOCTYPEa PUBLIC\"\uDBC0\uDC00",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\uDBC0\uDC00", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC#",
+"input":"<!DOCTYPEa PUBLIC#",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC&",
+"input":"<!DOCTYPEa PUBLIC&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'",
+"input":"<!DOCTYPEa PUBLIC'",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'\\u0000",
+"input":"<!DOCTYPEa PUBLIC'\u0000",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\uFFFD", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'\\u0009",
+"input":"<!DOCTYPEa PUBLIC'\u0009",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u0009", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'\\u000A",
+"input":"<!DOCTYPEa PUBLIC'\u000A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000A", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'\\u000B",
+"input":"<!DOCTYPEa PUBLIC'\u000B",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000B", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'\\u000C",
+"input":"<!DOCTYPEa PUBLIC'\u000C",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000C", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC' ",
+"input":"<!DOCTYPEa PUBLIC' ",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", " ", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'!",
+"input":"<!DOCTYPEa PUBLIC'!",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "!", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'\"",
+"input":"<!DOCTYPEa PUBLIC'\"",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\"", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'&",
+"input":"<!DOCTYPEa PUBLIC'&",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "&", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''",
+"input":"<!DOCTYPEa PUBLIC''",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''\\u0000",
+"input":"<!DOCTYPEa PUBLIC''\u0000",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''\\u0008",
+"input":"<!DOCTYPEa PUBLIC''\u0008",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''\\u0009",
+"input":"<!DOCTYPEa PUBLIC''\u0009",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''\\u000A",
+"input":"<!DOCTYPEa PUBLIC''\u000A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''\\u000B",
+"input":"<!DOCTYPEa PUBLIC''\u000B",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''\\u000C",
+"input":"<!DOCTYPEa PUBLIC''\u000C",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''\\u000D",
+"input":"<!DOCTYPEa PUBLIC''\u000D",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''\\u001F",
+"input":"<!DOCTYPEa PUBLIC''\u001F",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'' ",
+"input":"<!DOCTYPEa PUBLIC'' ",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''!",
+"input":"<!DOCTYPEa PUBLIC''!",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''\"",
+"input":"<!DOCTYPEa PUBLIC''\"",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", "", false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''#",
+"input":"<!DOCTYPEa PUBLIC''#",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''&",
+"input":"<!DOCTYPEa PUBLIC''&",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'''",
+"input":"<!DOCTYPEa PUBLIC'''",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", "", false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''(",
+"input":"<!DOCTYPEa PUBLIC''(",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''-",
+"input":"<!DOCTYPEa PUBLIC''-",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''/",
+"input":"<!DOCTYPEa PUBLIC''/",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''0",
+"input":"<!DOCTYPEa PUBLIC''0",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''1",
+"input":"<!DOCTYPEa PUBLIC''1",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''9",
+"input":"<!DOCTYPEa PUBLIC''9",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''<",
+"input":"<!DOCTYPEa PUBLIC''<",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''=",
+"input":"<!DOCTYPEa PUBLIC''=",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''>",
+"input":"<!DOCTYPEa PUBLIC''>",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, true]]},
+
+{"description":"<!DOCTYPEa PUBLIC''?",
+"input":"<!DOCTYPEa PUBLIC''?",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''@",
+"input":"<!DOCTYPEa PUBLIC''@",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''A",
+"input":"<!DOCTYPEa PUBLIC''A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''B",
+"input":"<!DOCTYPEa PUBLIC''B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''Y",
+"input":"<!DOCTYPEa PUBLIC''Y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''Z",
+"input":"<!DOCTYPEa PUBLIC''Z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''`",
+"input":"<!DOCTYPEa PUBLIC''`",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''a",
+"input":"<!DOCTYPEa PUBLIC''a",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''b",
+"input":"<!DOCTYPEa PUBLIC''b",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''y",
+"input":"<!DOCTYPEa PUBLIC''y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''z",
+"input":"<!DOCTYPEa PUBLIC''z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''{",
+"input":"<!DOCTYPEa PUBLIC''{",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''\\uDBC0\\uDC00",
+"input":"<!DOCTYPEa PUBLIC''\uDBC0\uDC00",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'(",
+"input":"<!DOCTYPEa PUBLIC'(",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "(", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'-",
+"input":"<!DOCTYPEa PUBLIC'-",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "-", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'/",
+"input":"<!DOCTYPEa PUBLIC'/",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "/", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'0",
+"input":"<!DOCTYPEa PUBLIC'0",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "0", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'1",
+"input":"<!DOCTYPEa PUBLIC'1",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "1", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'9",
+"input":"<!DOCTYPEa PUBLIC'9",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "9", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'<",
+"input":"<!DOCTYPEa PUBLIC'<",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "<", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'=",
+"input":"<!DOCTYPEa PUBLIC'=",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "=", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'>",
+"input":"<!DOCTYPEa PUBLIC'>",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'?",
+"input":"<!DOCTYPEa PUBLIC'?",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "?", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'@",
+"input":"<!DOCTYPEa PUBLIC'@",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "@", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'A",
+"input":"<!DOCTYPEa PUBLIC'A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "A", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'B",
+"input":"<!DOCTYPEa PUBLIC'B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "B", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'Y",
+"input":"<!DOCTYPEa PUBLIC'Y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "Y", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'Z",
+"input":"<!DOCTYPEa PUBLIC'Z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "Z", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'`",
+"input":"<!DOCTYPEa PUBLIC'`",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "`", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'a",
+"input":"<!DOCTYPEa PUBLIC'a",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "a", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'b",
+"input":"<!DOCTYPEa PUBLIC'b",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "b", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'y",
+"input":"<!DOCTYPEa PUBLIC'y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "y", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'z",
+"input":"<!DOCTYPEa PUBLIC'z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "z", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'{",
+"input":"<!DOCTYPEa PUBLIC'{",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "{", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'\\uDBC0\\uDC00",
+"input":"<!DOCTYPEa PUBLIC'\uDBC0\uDC00",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\uDBC0\uDC00", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC(",
+"input":"<!DOCTYPEa PUBLIC(",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC-",
+"input":"<!DOCTYPEa PUBLIC-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC/",
+"input":"<!DOCTYPEa PUBLIC/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC0",
+"input":"<!DOCTYPEa PUBLIC0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC1",
+"input":"<!DOCTYPEa PUBLIC1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC9",
+"input":"<!DOCTYPEa PUBLIC9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC<",
+"input":"<!DOCTYPEa PUBLIC<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC=",
+"input":"<!DOCTYPEa PUBLIC=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC>",
+"input":"<!DOCTYPEa PUBLIC>",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC?",
+"input":"<!DOCTYPEa PUBLIC?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC@",
+"input":"<!DOCTYPEa PUBLIC@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLICA",
+"input":"<!DOCTYPEa PUBLICA",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLICB",
+"input":"<!DOCTYPEa PUBLICB",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLICY",
+"input":"<!DOCTYPEa PUBLICY",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLICZ",
+"input":"<!DOCTYPEa PUBLICZ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC`",
+"input":"<!DOCTYPEa PUBLIC`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLICa",
+"input":"<!DOCTYPEa PUBLICa",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLICb",
+"input":"<!DOCTYPEa PUBLICb",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLICy",
+"input":"<!DOCTYPEa PUBLICy",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLICz",
+"input":"<!DOCTYPEa PUBLICz",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC{",
+"input":"<!DOCTYPEa PUBLIC{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\\uDBC0\\uDC00",
+"input":"<!DOCTYPEa PUBLIC\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM",
+"input":"<!DOCTYPEa SYSTEM",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\\u0000",
+"input":"<!DOCTYPEa SYSTEM\u0000",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\\u0008",
+"input":"<!DOCTYPEa SYSTEM\u0008",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\\u0009",
+"input":"<!DOCTYPEa SYSTEM\u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\\u000A",
+"input":"<!DOCTYPEa SYSTEM\u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\\u000B",
+"input":"<!DOCTYPEa SYSTEM\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\\u000C",
+"input":"<!DOCTYPEa SYSTEM\u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\\u000D",
+"input":"<!DOCTYPEa SYSTEM\u000D",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\\u001F",
+"input":"<!DOCTYPEa SYSTEM\u001F",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM ",
+"input":"<!DOCTYPEa SYSTEM ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM!",
+"input":"<!DOCTYPEa SYSTEM!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"",
+"input":"<!DOCTYPEa SYSTEM\"",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"\\u0000",
+"input":"<!DOCTYPEa SYSTEM\"\u0000",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\uFFFD", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"\\u0009",
+"input":"<!DOCTYPEa SYSTEM\"\u0009",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u0009", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"\\u000A",
+"input":"<!DOCTYPEa SYSTEM\"\u000A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000A", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"\\u000B",
+"input":"<!DOCTYPEa SYSTEM\"\u000B",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000B", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"\\u000C",
+"input":"<!DOCTYPEa SYSTEM\"\u000C",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000C", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\" ",
+"input":"<!DOCTYPEa SYSTEM\" ",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, " ", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"!",
+"input":"<!DOCTYPEa SYSTEM\"!",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "!", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"\"",
+"input":"<!DOCTYPEa SYSTEM\"\"",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"#",
+"input":"<!DOCTYPEa SYSTEM\"#",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "#", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"&",
+"input":"<!DOCTYPEa SYSTEM\"&",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "&", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"'",
+"input":"<!DOCTYPEa SYSTEM\"'",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "'", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"-",
+"input":"<!DOCTYPEa SYSTEM\"-",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "-", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"/",
+"input":"<!DOCTYPEa SYSTEM\"/",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "/", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"0",
+"input":"<!DOCTYPEa SYSTEM\"0",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "0", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"1",
+"input":"<!DOCTYPEa SYSTEM\"1",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "1", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"9",
+"input":"<!DOCTYPEa SYSTEM\"9",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "9", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"<",
+"input":"<!DOCTYPEa SYSTEM\"<",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "<", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"=",
+"input":"<!DOCTYPEa SYSTEM\"=",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "=", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\">",
+"input":"<!DOCTYPEa SYSTEM\">",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"?",
+"input":"<!DOCTYPEa SYSTEM\"?",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "?", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"@",
+"input":"<!DOCTYPEa SYSTEM\"@",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "@", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"A",
+"input":"<!DOCTYPEa SYSTEM\"A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "A", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"B",
+"input":"<!DOCTYPEa SYSTEM\"B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "B", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"Y",
+"input":"<!DOCTYPEa SYSTEM\"Y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "Y", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"Z",
+"input":"<!DOCTYPEa SYSTEM\"Z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "Z", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"`",
+"input":"<!DOCTYPEa SYSTEM\"`",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "`", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"a",
+"input":"<!DOCTYPEa SYSTEM\"a",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "a", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"b",
+"input":"<!DOCTYPEa SYSTEM\"b",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "b", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"y",
+"input":"<!DOCTYPEa SYSTEM\"y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "y", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"z",
+"input":"<!DOCTYPEa SYSTEM\"z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "z", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"{",
+"input":"<!DOCTYPEa SYSTEM\"{",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "{", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"\\uDBC0\\uDC00",
+"input":"<!DOCTYPEa SYSTEM\"\uDBC0\uDC00",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\uDBC0\uDC00", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM#",
+"input":"<!DOCTYPEa SYSTEM#",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM&",
+"input":"<!DOCTYPEa SYSTEM&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'",
+"input":"<!DOCTYPEa SYSTEM'",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'\\u0000",
+"input":"<!DOCTYPEa SYSTEM'\u0000",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\uFFFD", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'\\u0009",
+"input":"<!DOCTYPEa SYSTEM'\u0009",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u0009", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'\\u000A",
+"input":"<!DOCTYPEa SYSTEM'\u000A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000A", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'\\u000B",
+"input":"<!DOCTYPEa SYSTEM'\u000B",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000B", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'\\u000C",
+"input":"<!DOCTYPEa SYSTEM'\u000C",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000C", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM' ",
+"input":"<!DOCTYPEa SYSTEM' ",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, " ", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'!",
+"input":"<!DOCTYPEa SYSTEM'!",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "!", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'\"",
+"input":"<!DOCTYPEa SYSTEM'\"",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\"", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'&",
+"input":"<!DOCTYPEa SYSTEM'&",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "&", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM''",
+"input":"<!DOCTYPEa SYSTEM''",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM''\\u0000",
+"input":"<!DOCTYPEa SYSTEM''\u0000",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''\\u0008",
+"input":"<!DOCTYPEa SYSTEM''\u0008",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''\\u0009",
+"input":"<!DOCTYPEa SYSTEM''\u0009",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM''\\u000A",
+"input":"<!DOCTYPEa SYSTEM''\u000A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM''\\u000B",
+"input":"<!DOCTYPEa SYSTEM''\u000B",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''\\u000C",
+"input":"<!DOCTYPEa SYSTEM''\u000C",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM''\\u000D",
+"input":"<!DOCTYPEa SYSTEM''\u000D",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM''\\u001F",
+"input":"<!DOCTYPEa SYSTEM''\u001F",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM'' ",
+"input":"<!DOCTYPEa SYSTEM'' ",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM''!",
+"input":"<!DOCTYPEa SYSTEM''!",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''\"",
+"input":"<!DOCTYPEa SYSTEM''\"",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''&",
+"input":"<!DOCTYPEa SYSTEM''&",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM'''",
+"input":"<!DOCTYPEa SYSTEM'''",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''-",
+"input":"<!DOCTYPEa SYSTEM''-",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''/",
+"input":"<!DOCTYPEa SYSTEM''/",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''0",
+"input":"<!DOCTYPEa SYSTEM''0",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''1",
+"input":"<!DOCTYPEa SYSTEM''1",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''9",
+"input":"<!DOCTYPEa SYSTEM''9",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''<",
+"input":"<!DOCTYPEa SYSTEM''<",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''=",
+"input":"<!DOCTYPEa SYSTEM''=",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''>",
+"input":"<!DOCTYPEa SYSTEM''>",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''?",
+"input":"<!DOCTYPEa SYSTEM''?",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''@",
+"input":"<!DOCTYPEa SYSTEM''@",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''A",
+"input":"<!DOCTYPEa SYSTEM''A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''B",
+"input":"<!DOCTYPEa SYSTEM''B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''Y",
+"input":"<!DOCTYPEa SYSTEM''Y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''Z",
+"input":"<!DOCTYPEa SYSTEM''Z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''`",
+"input":"<!DOCTYPEa SYSTEM''`",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''a",
+"input":"<!DOCTYPEa SYSTEM''a",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''b",
+"input":"<!DOCTYPEa SYSTEM''b",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''y",
+"input":"<!DOCTYPEa SYSTEM''y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''z",
+"input":"<!DOCTYPEa SYSTEM''z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''{",
+"input":"<!DOCTYPEa SYSTEM''{",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''\\uDBC0\\uDC00",
+"input":"<!DOCTYPEa SYSTEM''\uDBC0\uDC00",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM'(",
+"input":"<!DOCTYPEa SYSTEM'(",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "(", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'-",
+"input":"<!DOCTYPEa SYSTEM'-",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "-", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'/",
+"input":"<!DOCTYPEa SYSTEM'/",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "/", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'0",
+"input":"<!DOCTYPEa SYSTEM'0",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "0", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'1",
+"input":"<!DOCTYPEa SYSTEM'1",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "1", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'9",
+"input":"<!DOCTYPEa SYSTEM'9",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "9", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'<",
+"input":"<!DOCTYPEa SYSTEM'<",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "<", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'=",
+"input":"<!DOCTYPEa SYSTEM'=",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "=", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'>",
+"input":"<!DOCTYPEa SYSTEM'>",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'?",
+"input":"<!DOCTYPEa SYSTEM'?",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "?", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'@",
+"input":"<!DOCTYPEa SYSTEM'@",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "@", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'A",
+"input":"<!DOCTYPEa SYSTEM'A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "A", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'B",
+"input":"<!DOCTYPEa SYSTEM'B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "B", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'Y",
+"input":"<!DOCTYPEa SYSTEM'Y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "Y", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'Z",
+"input":"<!DOCTYPEa SYSTEM'Z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "Z", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'`",
+"input":"<!DOCTYPEa SYSTEM'`",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "`", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'a",
+"input":"<!DOCTYPEa SYSTEM'a",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "a", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'b",
+"input":"<!DOCTYPEa SYSTEM'b",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "b", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'y",
+"input":"<!DOCTYPEa SYSTEM'y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "y", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'z",
+"input":"<!DOCTYPEa SYSTEM'z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "z", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'{",
+"input":"<!DOCTYPEa SYSTEM'{",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "{", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'\\uDBC0\\uDC00",
+"input":"<!DOCTYPEa SYSTEM'\uDBC0\uDC00",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\uDBC0\uDC00", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM(",
+"input":"<!DOCTYPEa SYSTEM(",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM-",
+"input":"<!DOCTYPEa SYSTEM-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM/",
+"input":"<!DOCTYPEa SYSTEM/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM0",
+"input":"<!DOCTYPEa SYSTEM0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM1",
+"input":"<!DOCTYPEa SYSTEM1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM9",
+"input":"<!DOCTYPEa SYSTEM9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM<",
+"input":"<!DOCTYPEa SYSTEM<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM=",
+"input":"<!DOCTYPEa SYSTEM=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM>",
+"input":"<!DOCTYPEa SYSTEM>",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM?",
+"input":"<!DOCTYPEa SYSTEM?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM@",
+"input":"<!DOCTYPEa SYSTEM@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEMA",
+"input":"<!DOCTYPEa SYSTEMA",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEMB",
+"input":"<!DOCTYPEa SYSTEMB",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEMY",
+"input":"<!DOCTYPEa SYSTEMY",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEMZ",
+"input":"<!DOCTYPEa SYSTEMZ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM`",
+"input":"<!DOCTYPEa SYSTEM`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEMa",
+"input":"<!DOCTYPEa SYSTEMa",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEMb",
+"input":"<!DOCTYPEa SYSTEMb",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEMy",
+"input":"<!DOCTYPEa SYSTEMy",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEMz",
+"input":"<!DOCTYPEa SYSTEMz",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM{",
+"input":"<!DOCTYPEa SYSTEM{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\\uDBC0\\uDC00",
+"input":"<!DOCTYPEa SYSTEM\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa Y",
+"input":"<!DOCTYPEa Y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa Z",
+"input":"<!DOCTYPEa Z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa `",
+"input":"<!DOCTYPEa `",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a",
+"input":"<!DOCTYPEa a",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a\\u0000",
+"input":"<!DOCTYPEa a\u0000",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a\\u0009",
+"input":"<!DOCTYPEa a\u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a\\u000A",
+"input":"<!DOCTYPEa a\u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a\\u000B",
+"input":"<!DOCTYPEa a\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a\\u000C",
+"input":"<!DOCTYPEa a\u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a ",
+"input":"<!DOCTYPEa a ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a!",
+"input":"<!DOCTYPEa a!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a\"",
+"input":"<!DOCTYPEa a\"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a&",
+"input":"<!DOCTYPEa a&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a'",
+"input":"<!DOCTYPEa a'",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a-",
+"input":"<!DOCTYPEa a-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a/",
+"input":"<!DOCTYPEa a/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a0",
+"input":"<!DOCTYPEa a0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a1",
+"input":"<!DOCTYPEa a1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a9",
+"input":"<!DOCTYPEa a9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a<",
+"input":"<!DOCTYPEa a<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a=",
+"input":"<!DOCTYPEa a=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a>",
+"input":"<!DOCTYPEa a>",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a?",
+"input":"<!DOCTYPEa a?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a@",
+"input":"<!DOCTYPEa a@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa aA",
+"input":"<!DOCTYPEa aA",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa aB",
+"input":"<!DOCTYPEa aB",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa aY",
+"input":"<!DOCTYPEa aY",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa aZ",
+"input":"<!DOCTYPEa aZ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a`",
+"input":"<!DOCTYPEa a`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa aa",
+"input":"<!DOCTYPEa aa",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa ab",
+"input":"<!DOCTYPEa ab",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa ay",
+"input":"<!DOCTYPEa ay",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa az",
+"input":"<!DOCTYPEa az",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a{",
+"input":"<!DOCTYPEa a{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a\\uDBC0\\uDC00",
+"input":"<!DOCTYPEa a\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa b",
+"input":"<!DOCTYPEa b",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa y",
+"input":"<!DOCTYPEa y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa z",
+"input":"<!DOCTYPEa z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa {",
+"input":"<!DOCTYPEa {",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa \\uDBC0\\uDC00",
+"input":"<!DOCTYPEa \uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa!",
+"input":"<!DOCTYPEa!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a!", null, null, false]]},
+
+{"description":"<!DOCTYPEa\"",
+"input":"<!DOCTYPEa\"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a\"", null, null, false]]},
+
+{"description":"<!DOCTYPEa&",
+"input":"<!DOCTYPEa&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a&", null, null, false]]},
+
+{"description":"<!DOCTYPEa'",
+"input":"<!DOCTYPEa'",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a'", null, null, false]]},
+
+{"description":"<!DOCTYPEa-",
+"input":"<!DOCTYPEa-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a-", null, null, false]]},
+
+{"description":"<!DOCTYPEa/",
+"input":"<!DOCTYPEa/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a/", null, null, false]]},
+
+{"description":"<!DOCTYPEa0",
+"input":"<!DOCTYPEa0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a0", null, null, false]]},
+
+{"description":"<!DOCTYPEa1",
+"input":"<!DOCTYPEa1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a1", null, null, false]]},
+
+{"description":"<!DOCTYPEa9",
+"input":"<!DOCTYPEa9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a9", null, null, false]]},
+
+{"description":"<!DOCTYPEa<",
+"input":"<!DOCTYPEa<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a<", null, null, false]]},
+
+{"description":"<!DOCTYPEa=",
+"input":"<!DOCTYPEa=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a=", null, null, false]]},
+
+{"description":"<!DOCTYPEa>",
+"input":"<!DOCTYPEa>",
+"output":["ParseError", ["DOCTYPE", "a", null, null, true]]},
+
+{"description":"<!DOCTYPEa?",
+"input":"<!DOCTYPEa?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a?", null, null, false]]},
+
+{"description":"<!DOCTYPEa@",
+"input":"<!DOCTYPEa@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a@", null, null, false]]},
+
+{"description":"<!DOCTYPEaA",
+"input":"<!DOCTYPEaA",
+"output":["ParseError", "ParseError", ["DOCTYPE", "aa", null, null, false]]},
+
+{"description":"<!DOCTYPEaB",
+"input":"<!DOCTYPEaB",
+"output":["ParseError", "ParseError", ["DOCTYPE", "ab", null, null, false]]},
+
+{"description":"<!DOCTYPEaY",
+"input":"<!DOCTYPEaY",
+"output":["ParseError", "ParseError", ["DOCTYPE", "ay", null, null, false]]},
+
+{"description":"<!DOCTYPEaZ",
+"input":"<!DOCTYPEaZ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "az", null, null, false]]},
+
+{"description":"<!DOCTYPEa[",
+"input":"<!DOCTYPEa[",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a[", null, null, false]]},
+
+{"description":"<!DOCTYPEa`",
+"input":"<!DOCTYPEa`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a`", null, null, false]]},
+
+{"description":"<!DOCTYPEaa",
+"input":"<!DOCTYPEaa",
+"output":["ParseError", "ParseError", ["DOCTYPE", "aa", null, null, false]]},
+
+{"description":"<!DOCTYPEab",
+"input":"<!DOCTYPEab",
+"output":["ParseError", "ParseError", ["DOCTYPE", "ab", null, null, false]]},
+
+{"description":"<!DOCTYPEay",
+"input":"<!DOCTYPEay",
+"output":["ParseError", "ParseError", ["DOCTYPE", "ay", null, null, false]]},
+
+{"description":"<!DOCTYPEaz",
+"input":"<!DOCTYPEaz",
+"output":["ParseError", "ParseError", ["DOCTYPE", "az", null, null, false]]},
+
+{"description":"<!DOCTYPEa{",
+"input":"<!DOCTYPEa{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a{", null, null, false]]},
+
+{"description":"<!DOCTYPEa\\uDBC0\\uDC00",
+"input":"<!DOCTYPEa\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a\uDBC0\uDC00", null, null, false]]},
+
+{"description":"<!DOCTYPEb",
+"input":"<!DOCTYPEb",
+"output":["ParseError", "ParseError", ["DOCTYPE", "b", null, null, false]]},
+
+{"description":"<!DOCTYPEy",
+"input":"<!DOCTYPEy",
+"output":["ParseError", "ParseError", ["DOCTYPE", "y", null, null, false]]},
+
+{"description":"<!DOCTYPEz",
+"input":"<!DOCTYPEz",
+"output":["ParseError", "ParseError", ["DOCTYPE", "z", null, null, false]]},
+
+{"description":"<!DOCTYPE{",
+"input":"<!DOCTYPE{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "{", null, null, false]]},
+
+{"description":"<!DOCTYPE\\uDBC0\\uDC00",
+"input":"<!DOCTYPE\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "\uDBC0\uDC00", null, null, false]]},
+
+{"description":"<!Y",
+"input":"<!Y",
+"output":["ParseError", ["Comment", "Y"]]},
+
+{"description":"<!Z",
+"input":"<!Z",
+"output":["ParseError", ["Comment", "Z"]]},
+
+{"description":"<!`",
+"input":"<!`",
+"output":["ParseError", ["Comment", "`"]]},
+
+{"description":"<!a",
+"input":"<!a",
+"output":["ParseError", ["Comment", "a"]]},
+
+{"description":"<!b",
+"input":"<!b",
+"output":["ParseError", ["Comment", "b"]]},
+
+{"description":"<!y",
+"input":"<!y",
+"output":["ParseError", ["Comment", "y"]]},
+
+{"description":"<!z",
+"input":"<!z",
+"output":["ParseError", ["Comment", "z"]]},
+
+{"description":"<!{",
+"input":"<!{",
+"output":["ParseError", ["Comment", "{"]]},
+
+{"description":"<!\\uDBC0\\uDC00",
+"input":"<!\uDBC0\uDC00",
+"output":["ParseError", ["Comment", "\uDBC0\uDC00"]]},
+
+{"description":"<\"",
+"input":"<\"",
+"output":["ParseError", ["Character", "<\""]]},
+
+{"description":"<&",
+"input":"<&",
+"output":["ParseError", ["Character", "<&"]]},
+
+{"description":"<'",
+"input":"<'",
+"output":["ParseError", ["Character", "<'"]]},
+
+{"description":"<-",
+"input":"<-",
+"output":["ParseError", ["Character", "<-"]]},
+
+{"description":"<.",
+"input":"<.",
+"output":["ParseError", ["Character", "<."]]},
+
+{"description":"</",
+"input":"</",
+"output":["ParseError", ["Character", "</"]]},
+
+{"description":"</\\u0000",
+"input":"</\u0000",
+"output":["ParseError", ["Comment", "\uFFFD"]]},
+
+{"description":"</\\u0009",
+"input":"</\u0009",
+"output":["ParseError", ["Comment", "\u0009"]]},
+
+{"description":"</\\u000A",
+"input":"</\u000A",
+"output":["ParseError", ["Comment", "\u000A"]]},
+
+{"description":"</\\u000B",
+"input":"</\u000B",
+"output":["ParseError", "ParseError", ["Comment", "\u000B"]]},
+
+{"description":"</\\u000C",
+"input":"</\u000C",
+"output":["ParseError", ["Comment", "\u000C"]]},
+
+{"description":"</ ",
+"input":"</ ",
+"output":["ParseError", ["Comment", " "]]},
+
+{"description":"</!",
+"input":"</!",
+"output":["ParseError", ["Comment", "!"]]},
+
+{"description":"</\"",
+"input":"</\"",
+"output":["ParseError", ["Comment", "\""]]},
+
+{"description":"</&",
+"input":"</&",
+"output":["ParseError", ["Comment", "&"]]},
+
+{"description":"</'",
+"input":"</'",
+"output":["ParseError", ["Comment", "'"]]},
+
+{"description":"</-",
+"input":"</-",
+"output":["ParseError", ["Comment", "-"]]},
+
+{"description":"<//",
+"input":"<//",
+"output":["ParseError", ["Comment", "/"]]},
+
+{"description":"</0",
+"input":"</0",
+"output":["ParseError", ["Comment", "0"]]},
+
+{"description":"</1",
+"input":"</1",
+"output":["ParseError", ["Comment", "1"]]},
+
+{"description":"</9",
+"input":"</9",
+"output":["ParseError", ["Comment", "9"]]},
+
+{"description":"</<",
+"input":"</<",
+"output":["ParseError", ["Comment", "<"]]},
+
+{"description":"</=",
+"input":"</=",
+"output":["ParseError", ["Comment", "="]]},
+
+{"description":"</>",
+"input":"</>",
+"output":["ParseError"]},
+
+{"description":"</?",
+"input":"</?",
+"output":["ParseError", ["Comment", "?"]]},
+
+{"description":"</@",
+"input":"</@",
+"output":["ParseError", ["Comment", "@"]]},
+
+{"description":"</A>",
+"input":"</A>",
+"output":[["EndTag", "a"]]},
+
+{"description":"</B>",
+"input":"</B>",
+"output":[["EndTag", "b"]]},
+
+{"description":"</Y>",
+"input":"</Y>",
+"output":[["EndTag", "y"]]},
+
+{"description":"</Z>",
+"input":"</Z>",
+"output":[["EndTag", "z"]]},
+
+{"description":"</[",
+"input":"</[",
+"output":["ParseError", ["Comment", "["]]},
+
+{"description":"</`",
+"input":"</`",
+"output":["ParseError", ["Comment", "`"]]},
+
+{"description":"</a>",
+"input":"</a>",
+"output":[["EndTag", "a"]]},
+
+{"description":"</b>",
+"input":"</b>",
+"output":[["EndTag", "b"]]},
+
+{"description":"</y>",
+"input":"</y>",
+"output":[["EndTag", "y"]]},
+
+{"description":"</z>",
+"input":"</z>",
+"output":[["EndTag", "z"]]},
+
+{"description":"</{",
+"input":"</{",
+"output":["ParseError", ["Comment", "{"]]},
+
+{"description":"</\\uDBC0\\uDC00",
+"input":"</\uDBC0\uDC00",
+"output":["ParseError", ["Comment", "\uDBC0\uDC00"]]},
+
+{"description":"<0",
+"input":"<0",
+"output":["ParseError", ["Character", "<0"]]},
+
+{"description":"<1",
+"input":"<1",
+"output":["ParseError", ["Character", "<1"]]},
+
+{"description":"<9",
+"input":"<9",
+"output":["ParseError", ["Character", "<9"]]},
+
+{"description":"<<",
+"input":"<<",
+"output":["ParseError", ["Character", "<"], "ParseError", ["Character", "<"]]},
+
+{"description":"<=",
+"input":"<=",
+"output":["ParseError", ["Character", "<="]]},
+
+{"description":"<>",
+"input":"<>",
+"output":["ParseError", ["Character", "<>"]]},
+
+{"description":"<?",
+"input":"<?",
+"output":["ParseError", ["Comment", "?"]]},
+
+{"description":"<?\\u0000",
+"input":"<?\u0000",
+"output":["ParseError", ["Comment", "?\uFFFD"]]},
+
+{"description":"<?\\u0009",
+"input":"<?\u0009",
+"output":["ParseError", ["Comment", "?\u0009"]]},
+
+{"description":"<?\\u000A",
+"input":"<?\u000A",
+"output":["ParseError", ["Comment", "?\u000A"]]},
+
+{"description":"<?\\u000B",
+"input":"<?\u000B",
+"output":["ParseError", "ParseError", ["Comment", "?\u000B"]]},
+
+{"description":"<?\\u000C",
+"input":"<?\u000C",
+"output":["ParseError", ["Comment", "?\u000C"]]},
+
+{"description":"<? ",
+"input":"<? ",
+"output":["ParseError", ["Comment", "? "]]},
+
+{"description":"<?!",
+"input":"<?!",
+"output":["ParseError", ["Comment", "?!"]]},
+
+{"description":"<?\"",
+"input":"<?\"",
+"output":["ParseError", ["Comment", "?\""]]},
+
+{"description":"<?&",
+"input":"<?&",
+"output":["ParseError", ["Comment", "?&"]]},
+
+{"description":"<?'",
+"input":"<?'",
+"output":["ParseError", ["Comment", "?'"]]},
+
+{"description":"<?-",
+"input":"<?-",
+"output":["ParseError", ["Comment", "?-"]]},
+
+{"description":"<?/",
+"input":"<?/",
+"output":["ParseError", ["Comment", "?/"]]},
+
+{"description":"<?0",
+"input":"<?0",
+"output":["ParseError", ["Comment", "?0"]]},
+
+{"description":"<?1",
+"input":"<?1",
+"output":["ParseError", ["Comment", "?1"]]},
+
+{"description":"<?9",
+"input":"<?9",
+"output":["ParseError", ["Comment", "?9"]]},
+
+{"description":"<?<",
+"input":"<?<",
+"output":["ParseError", ["Comment", "?<"]]},
+
+{"description":"<?=",
+"input":"<?=",
+"output":["ParseError", ["Comment", "?="]]},
+
+{"description":"<?>",
+"input":"<?>",
+"output":["ParseError", ["Comment", "?"]]},
+
+{"description":"<??",
+"input":"<??",
+"output":["ParseError", ["Comment", "??"]]},
+
+{"description":"<?@",
+"input":"<?@",
+"output":["ParseError", ["Comment", "?@"]]},
+
+{"description":"<?A",
+"input":"<?A",
+"output":["ParseError", ["Comment", "?A"]]},
+
+{"description":"<?B",
+"input":"<?B",
+"output":["ParseError", ["Comment", "?B"]]},
+
+{"description":"<?Y",
+"input":"<?Y",
+"output":["ParseError", ["Comment", "?Y"]]},
+
+{"description":"<?Z",
+"input":"<?Z",
+"output":["ParseError", ["Comment", "?Z"]]},
+
+{"description":"<?`",
+"input":"<?`",
+"output":["ParseError", ["Comment", "?`"]]},
+
+{"description":"<?a",
+"input":"<?a",
+"output":["ParseError", ["Comment", "?a"]]},
+
+{"description":"<?b",
+"input":"<?b",
+"output":["ParseError", ["Comment", "?b"]]},
+
+{"description":"<?y",
+"input":"<?y",
+"output":["ParseError", ["Comment", "?y"]]},
+
+{"description":"<?z",
+"input":"<?z",
+"output":["ParseError", ["Comment", "?z"]]},
+
+{"description":"<?{",
+"input":"<?{",
+"output":["ParseError", ["Comment", "?{"]]},
+
+{"description":"<?\\uDBC0\\uDC00",
+"input":"<?\uDBC0\uDC00",
+"output":["ParseError", ["Comment", "?\uDBC0\uDC00"]]},
+
+{"description":"<@",
+"input":"<@",
+"output":["ParseError", ["Character", "<@"]]},
+
+{"description":"<A>",
+"input":"<A>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<B>",
+"input":"<B>",
+"output":[["StartTag", "b", {}]]},
+
+{"description":"<Y>",
+"input":"<Y>",
+"output":[["StartTag", "y", {}]]},
+
+{"description":"<Z>",
+"input":"<Z>",
+"output":[["StartTag", "z", {}]]},
+
+{"description":"<[",
+"input":"<[",
+"output":["ParseError", ["Character", "<["]]},
+
+{"description":"<`",
+"input":"<`",
+"output":["ParseError", ["Character", "<`"]]},
+
+{"description":"<a>",
+"input":"<a>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a\\u0000>",
+"input":"<a\u0000>",
+"output":["ParseError", ["StartTag", "a\uFFFD", {}]]},
+
+{"description":"<a\\u0008>",
+"input":"<a\u0008>",
+"output":["ParseError", ["StartTag", "a\u0008", {}]]},
+
+{"description":"<a\\u0009>",
+"input":"<a\u0009>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a\\u000A>",
+"input":"<a\u000A>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a\\u000B>",
+"input":"<a\u000B>",
+"output":["ParseError", ["StartTag", "a\u000B", {}]]},
+
+{"description":"<a\\u000C>",
+"input":"<a\u000C>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a\\u000D>",
+"input":"<a\u000D>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a\\u001F>",
+"input":"<a\u001F>",
+"output":["ParseError", ["StartTag", "a\u001F", {}]]},
+
+{"description":"<a >",
+"input":"<a >",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a \\u0000>",
+"input":"<a \u0000>",
+"output":["ParseError", ["StartTag", "a", {"\uFFFD":""}]]},
+
+{"description":"<a \\u0008>",
+"input":"<a \u0008>",
+"output":["ParseError", ["StartTag", "a", {"\u0008":""}]]},
+
+{"description":"<a \\u0009>",
+"input":"<a \u0009>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a \\u000A>",
+"input":"<a \u000A>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a \\u000B>",
+"input":"<a \u000B>",
+"output":["ParseError", ["StartTag", "a", {"\u000B":""}]]},
+
+{"description":"<a \\u000C>",
+"input":"<a \u000C>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a \\u000D>",
+"input":"<a \u000D>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a \\u001F>",
+"input":"<a \u001F>",
+"output":["ParseError", ["StartTag", "a", {"\u001F":""}]]},
+
+{"description":"<a  >",
+"input":"<a  >",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a !>",
+"input":"<a !>",
+"output":[["StartTag", "a", {"!":""}]]},
+
+{"description":"<a \">",
+"input":"<a \">",
+"output":["ParseError", ["StartTag", "a", {"\"":""}]]},
+
+{"description":"<a #>",
+"input":"<a #>",
+"output":[["StartTag", "a", {"#":""}]]},
+
+{"description":"<a &>",
+"input":"<a &>",
+"output":[["StartTag", "a", {"&":""}]]},
+
+{"description":"<a '>",
+"input":"<a '>",
+"output":["ParseError", ["StartTag", "a", {"'":""}]]},
+
+{"description":"<a (>",
+"input":"<a (>",
+"output":[["StartTag", "a", {"(":""}]]},
+
+{"description":"<a ->",
+"input":"<a ->",
+"output":[["StartTag", "a", {"-":""}]]},
+
+{"description":"<a .>",
+"input":"<a .>",
+"output":[["StartTag", "a", {".":""}]]},
+
+{"description":"<a />",
+"input":"<a />",
+"output":[["StartTag", "a", {}, true]]},
+
+{"description":"<a 0>",
+"input":"<a 0>",
+"output":[["StartTag", "a", {"0":""}]]},
+
+{"description":"<a 1>",
+"input":"<a 1>",
+"output":[["StartTag", "a", {"1":""}]]},
+
+{"description":"<a 9>",
+"input":"<a 9>",
+"output":[["StartTag", "a", {"9":""}]]},
+
+{"description":"<a <>",
+"input":"<a <>",
+"output":["ParseError", ["StartTag", "a", {"<":""}]]},
+
+{"description":"<a =>",
+"input":"<a =>",
+"output":["ParseError", ["StartTag", "a", {"=":""}]]},
+
+{"description":"<a >",
+"input":"<a >",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a ?>",
+"input":"<a ?>",
+"output":[["StartTag", "a", {"?":""}]]},
+
+{"description":"<a @>",
+"input":"<a @>",
+"output":[["StartTag", "a", {"@":""}]]},
+
+{"description":"<a A>",
+"input":"<a A>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a B>",
+"input":"<a B>",
+"output":[["StartTag", "a", {"b":""}]]},
+
+{"description":"<a Y>",
+"input":"<a Y>",
+"output":[["StartTag", "a", {"y":""}]]},
+
+{"description":"<a Z>",
+"input":"<a Z>",
+"output":[["StartTag", "a", {"z":""}]]},
+
+{"description":"<a [>",
+"input":"<a [>",
+"output":[["StartTag", "a", {"[":""}]]},
+
+{"description":"<a `>",
+"input":"<a `>",
+"output":[["StartTag", "a", {"`":""}]]},
+
+{"description":"<a a>",
+"input":"<a a>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a\\u0000>",
+"input":"<a a\u0000>",
+"output":["ParseError", ["StartTag", "a", {"a\uFFFD":""}]]},
+
+{"description":"<a a\\u0008>",
+"input":"<a a\u0008>",
+"output":["ParseError", ["StartTag", "a", {"a\u0008":""}]]},
+
+{"description":"<a a\\u0009>",
+"input":"<a a\u0009>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a\\u000A>",
+"input":"<a a\u000A>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a\\u000B>",
+"input":"<a a\u000B>",
+"output":["ParseError", ["StartTag", "a", {"a\u000B":""}]]},
+
+{"description":"<a a\\u000C>",
+"input":"<a a\u000C>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a\\u000D>",
+"input":"<a a\u000D>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a\\u001F>",
+"input":"<a a\u001F>",
+"output":["ParseError", ["StartTag", "a", {"a\u001F":""}]]},
+
+{"description":"<a a >",
+"input":"<a a >",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a \\u0000>",
+"input":"<a a \u0000>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "\uFFFD":""}]]},
+
+{"description":"<a a \\u0008>",
+"input":"<a a \u0008>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "\u0008":""}]]},
+
+{"description":"<a a \\u0009>",
+"input":"<a a \u0009>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a \\u000A>",
+"input":"<a a \u000A>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a \\u000B>",
+"input":"<a a \u000B>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "\u000B":""}]]},
+
+{"description":"<a a \\u000C>",
+"input":"<a a \u000C>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a \\u000D>",
+"input":"<a a \u000D>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a \\u001F>",
+"input":"<a a \u001F>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "\u001F":""}]]},
+
+{"description":"<a a  >",
+"input":"<a a  >",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a !>",
+"input":"<a a !>",
+"output":[["StartTag", "a", {"a":"", "!":""}]]},
+
+{"description":"<a a \">",
+"input":"<a a \">",
+"output":["ParseError", ["StartTag", "a", {"a":"", "\"":""}]]},
+
+{"description":"<a a #>",
+"input":"<a a #>",
+"output":[["StartTag", "a", {"a":"", "#":""}]]},
+
+{"description":"<a a &>",
+"input":"<a a &>",
+"output":[["StartTag", "a", {"a":"", "&":""}]]},
+
+{"description":"<a a '>",
+"input":"<a a '>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "'":""}]]},
+
+{"description":"<a a (>",
+"input":"<a a (>",
+"output":[["StartTag", "a", {"a":"", "(":""}]]},
+
+{"description":"<a a ->",
+"input":"<a a ->",
+"output":[["StartTag", "a", {"a":"", "-":""}]]},
+
+{"description":"<a a .>",
+"input":"<a a .>",
+"output":[["StartTag", "a", {"a":"", ".":""}]]},
+
+{"description":"<a a />",
+"input":"<a a />",
+"output":[["StartTag", "a", {"a":""}, true]]},
+
+{"description":"<a a 0>",
+"input":"<a a 0>",
+"output":[["StartTag", "a", {"a":"", "0":""}]]},
+
+{"description":"<a a 1>",
+"input":"<a a 1>",
+"output":[["StartTag", "a", {"a":"", "1":""}]]},
+
+{"description":"<a a 9>",
+"input":"<a a 9>",
+"output":[["StartTag", "a", {"a":"", "9":""}]]},
+
+{"description":"<a a <>",
+"input":"<a a <>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "<":""}]]},
+
+{"description":"<a a =>",
+"input":"<a a =>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a >",
+"input":"<a a >",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a ?>",
+"input":"<a a ?>",
+"output":[["StartTag", "a", {"a":"", "?":""}]]},
+
+{"description":"<a a @>",
+"input":"<a a @>",
+"output":[["StartTag", "a", {"a":"", "@":""}]]},
+
+{"description":"<a a A>",
+"input":"<a a A>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a B>",
+"input":"<a a B>",
+"output":[["StartTag", "a", {"a":"", "b":""}]]},
+
+{"description":"<a a Y>",
+"input":"<a a Y>",
+"output":[["StartTag", "a", {"a":"", "y":""}]]},
+
+{"description":"<a a Z>",
+"input":"<a a Z>",
+"output":[["StartTag", "a", {"a":"", "z":""}]]},
+
+{"description":"<a a [>",
+"input":"<a a [>",
+"output":[["StartTag", "a", {"a":"", "[":""}]]},
+
+{"description":"<a a `>",
+"input":"<a a `>",
+"output":[["StartTag", "a", {"a":"", "`":""}]]},
+
+{"description":"<a a a>",
+"input":"<a a a>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a b>",
+"input":"<a a b>",
+"output":[["StartTag", "a", {"a":"", "b":""}]]},
+
+{"description":"<a a y>",
+"input":"<a a y>",
+"output":[["StartTag", "a", {"a":"", "y":""}]]},
+
+{"description":"<a a z>",
+"input":"<a a z>",
+"output":[["StartTag", "a", {"a":"", "z":""}]]},
+
+{"description":"<a a {>",
+"input":"<a a {>",
+"output":[["StartTag", "a", {"a":"", "{":""}]]},
+
+{"description":"<a a \\uDBC0\\uDC00>",
+"input":"<a a \uDBC0\uDC00>",
+"output":[["StartTag", "a", {"a":"", "\uDBC0\uDC00":""}]]},
+
+{"description":"<a a!>",
+"input":"<a a!>",
+"output":[["StartTag", "a", {"a!":""}]]},
+
+{"description":"<a a\">",
+"input":"<a a\">",
+"output":["ParseError", ["StartTag", "a", {"a\"":""}]]},
+
+{"description":"<a a#>",
+"input":"<a a#>",
+"output":[["StartTag", "a", {"a#":""}]]},
+
+{"description":"<a a&>",
+"input":"<a a&>",
+"output":[["StartTag", "a", {"a&":""}]]},
+
+{"description":"<a a'>",
+"input":"<a a'>",
+"output":["ParseError", ["StartTag", "a", {"a'":""}]]},
+
+{"description":"<a a(>",
+"input":"<a a(>",
+"output":[["StartTag", "a", {"a(":""}]]},
+
+{"description":"<a a->",
+"input":"<a a->",
+"output":[["StartTag", "a", {"a-":""}]]},
+
+{"description":"<a a.>",
+"input":"<a a.>",
+"output":[["StartTag", "a", {"a.":""}]]},
+
+{"description":"<a a/>",
+"input":"<a a/>",
+"output":[["StartTag", "a", {"a":""}, true]]},
+
+{"description":"<a a0>",
+"input":"<a a0>",
+"output":[["StartTag", "a", {"a0":""}]]},
+
+{"description":"<a a1>",
+"input":"<a a1>",
+"output":[["StartTag", "a", {"a1":""}]]},
+
+{"description":"<a a9>",
+"input":"<a a9>",
+"output":[["StartTag", "a", {"a9":""}]]},
+
+{"description":"<a a<>",
+"input":"<a a<>",
+"output":["ParseError", ["StartTag", "a", {"a<":""}]]},
+
+{"description":"<a a=>",
+"input":"<a a=>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=\\u0000>",
+"input":"<a a=\u0000>",
+"output":["ParseError", ["StartTag", "a", {"a":"\uFFFD"}]]},
+
+{"description":"<a a=\\u0008>",
+"input":"<a a=\u0008>",
+"output":["ParseError", ["StartTag", "a", {"a":"\u0008"}]]},
+
+{"description":"<a a=\\u0009>",
+"input":"<a a=\u0009>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=\\u000A>",
+"input":"<a a=\u000A>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=\\u000B>",
+"input":"<a a=\u000B>",
+"output":["ParseError", ["StartTag", "a", {"a":"\u000B"}]]},
+
+{"description":"<a a=\\u000C>",
+"input":"<a a=\u000C>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=\\u000D>",
+"input":"<a a=\u000D>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=\\u001F>",
+"input":"<a a=\u001F>",
+"output":["ParseError", ["StartTag", "a", {"a":"\u001F"}]]},
+
+{"description":"<a a= >",
+"input":"<a a= >",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=!>",
+"input":"<a a=!>",
+"output":[["StartTag", "a", {"a":"!"}]]},
+
+{"description":"<a a=\"\">",
+"input":"<a a=\"\">",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=\"\\u0000\">",
+"input":"<a a=\"\u0000\">",
+"output":["ParseError", ["StartTag", "a", {"a":"\uFFFD"}]]},
+
+{"description":"<a a=\"\\u0009\">",
+"input":"<a a=\"\u0009\">",
+"output":[["StartTag", "a", {"a":"\u0009"}]]},
+
+{"description":"<a a=\"\\u000A\">",
+"input":"<a a=\"\u000A\">",
+"output":[["StartTag", "a", {"a":"\u000A"}]]},
+
+{"description":"<a a=\"\\u000B\">",
+"input":"<a a=\"\u000B\">",
+"output":["ParseError", ["StartTag", "a", {"a":"\u000B"}]]},
+
+{"description":"<a a=\"\\u000C\">",
+"input":"<a a=\"\u000C\">",
+"output":[["StartTag", "a", {"a":"\u000C"}]]},
+
+{"description":"<a a=\" \">",
+"input":"<a a=\" \">",
+"output":[["StartTag", "a", {"a":" "}]]},
+
+{"description":"<a a=\"!\">",
+"input":"<a a=\"!\">",
+"output":[["StartTag", "a", {"a":"!"}]]},
+
+{"description":"<a a=\"\">",
+"input":"<a a=\"\">",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=\"#\">",
+"input":"<a a=\"#\">",
+"output":[["StartTag", "a", {"a":"#"}]]},
+
+{"description":"<a a=\"%\">",
+"input":"<a a=\"%\">",
+"output":[["StartTag", "a", {"a":"%"}]]},
+
+{"description":"<a a=\"&\">",
+"input":"<a a=\"&\">",
+"output":[["StartTag", "a", {"a":"&"}]]},
+
+{"description":"<a a=\"'\">",
+"input":"<a a=\"'\">",
+"output":[["StartTag", "a", {"a":"'"}]]},
+
+{"description":"<a a=\"-\">",
+"input":"<a a=\"-\">",
+"output":[["StartTag", "a", {"a":"-"}]]},
+
+{"description":"<a a=\"/\">",
+"input":"<a a=\"/\">",
+"output":[["StartTag", "a", {"a":"/"}]]},
+
+{"description":"<a a=\"0\">",
+"input":"<a a=\"0\">",
+"output":[["StartTag", "a", {"a":"0"}]]},
+
+{"description":"<a a=\"1\">",
+"input":"<a a=\"1\">",
+"output":[["StartTag", "a", {"a":"1"}]]},
+
+{"description":"<a a=\"9\">",
+"input":"<a a=\"9\">",
+"output":[["StartTag", "a", {"a":"9"}]]},
+
+{"description":"<a a=\"<\">",
+"input":"<a a=\"<\">",
+"output":[["StartTag", "a", {"a":"<"}]]},
+
+{"description":"<a a=\"=\">",
+"input":"<a a=\"=\">",
+"output":[["StartTag", "a", {"a":"="}]]},
+
+{"description":"<a a=\">\">",
+"input":"<a a=\">\">",
+"output":[["StartTag", "a", {"a":">"}]]},
+
+{"description":"<a a=\"?\">",
+"input":"<a a=\"?\">",
+"output":[["StartTag", "a", {"a":"?"}]]},
+
+{"description":"<a a=\"@\">",
+"input":"<a a=\"@\">",
+"output":[["StartTag", "a", {"a":"@"}]]},
+
+{"description":"<a a=\"A\">",
+"input":"<a a=\"A\">",
+"output":[["StartTag", "a", {"a":"A"}]]},
+
+{"description":"<a a=\"B\">",
+"input":"<a a=\"B\">",
+"output":[["StartTag", "a", {"a":"B"}]]},
+
+{"description":"<a a=\"Y\">",
+"input":"<a a=\"Y\">",
+"output":[["StartTag", "a", {"a":"Y"}]]},
+
+{"description":"<a a=\"Z\">",
+"input":"<a a=\"Z\">",
+"output":[["StartTag", "a", {"a":"Z"}]]},
+
+{"description":"<a a=\"`\">",
+"input":"<a a=\"`\">",
+"output":[["StartTag", "a", {"a":"`"}]]},
+
+{"description":"<a a=\"a\">",
+"input":"<a a=\"a\">",
+"output":[["StartTag", "a", {"a":"a"}]]},
+
+{"description":"<a a=\"b\">",
+"input":"<a a=\"b\">",
+"output":[["StartTag", "a", {"a":"b"}]]},
+
+{"description":"<a a=\"y\">",
+"input":"<a a=\"y\">",
+"output":[["StartTag", "a", {"a":"y"}]]},
+
+{"description":"<a a=\"z\">",
+"input":"<a a=\"z\">",
+"output":[["StartTag", "a", {"a":"z"}]]},
+
+{"description":"<a a=\"{\">",
+"input":"<a a=\"{\">",
+"output":[["StartTag", "a", {"a":"{"}]]},
+
+{"description":"<a a=\"\\uDBC0\\uDC00\">",
+"input":"<a a=\"\uDBC0\uDC00\">",
+"output":[["StartTag", "a", {"a":"\uDBC0\uDC00"}]]},
+
+{"description":"<a a=#>",
+"input":"<a a=#>",
+"output":[["StartTag", "a", {"a":"#"}]]},
+
+{"description":"<a a=%>",
+"input":"<a a=%>",
+"output":[["StartTag", "a", {"a":"%"}]]},
+
+{"description":"<a a=&>",
+"input":"<a a=&>",
+"output":[["StartTag", "a", {"a":"&"}]]},
+
+{"description":"<a a=''>",
+"input":"<a a=''>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a='\\u0000'>",
+"input":"<a a='\u0000'>",
+"output":["ParseError", ["StartTag", "a", {"a":"\uFFFD"}]]},
+
+{"description":"<a a='\\u0009'>",
+"input":"<a a='\u0009'>",
+"output":[["StartTag", "a", {"a":"\u0009"}]]},
+
+{"description":"<a a='\\u000A'>",
+"input":"<a a='\u000A'>",
+"output":[["StartTag", "a", {"a":"\u000A"}]]},
+
+{"description":"<a a='\\u000B'>",
+"input":"<a a='\u000B'>",
+"output":["ParseError", ["StartTag", "a", {"a":"\u000B"}]]},
+
+{"description":"<a a='\\u000C'>",
+"input":"<a a='\u000C'>",
+"output":[["StartTag", "a", {"a":"\u000C"}]]},
+
+{"description":"<a a=' '>",
+"input":"<a a=' '>",
+"output":[["StartTag", "a", {"a":" "}]]},
+
+{"description":"<a a='!'>",
+"input":"<a a='!'>",
+"output":[["StartTag", "a", {"a":"!"}]]},
+
+{"description":"<a a='\"'>",
+"input":"<a a='\"'>",
+"output":[["StartTag", "a", {"a":"\""}]]},
+
+{"description":"<a a='%'>",
+"input":"<a a='%'>",
+"output":[["StartTag", "a", {"a":"%"}]]},
+
+{"description":"<a a='&'>",
+"input":"<a a='&'>",
+"output":[["StartTag", "a", {"a":"&"}]]},
+
+{"description":"<a a=''>",
+"input":"<a a=''>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=''\\u0000>",
+"input":"<a a=''\u0000>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "\uFFFD":""}]]},
+
+{"description":"<a a=''\\u0008>",
+"input":"<a a=''\u0008>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "\u0008":""}]]},
+
+{"description":"<a a=''\\u0009>",
+"input":"<a a=''\u0009>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=''\\u000A>",
+"input":"<a a=''\u000A>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=''\\u000B>",
+"input":"<a a=''\u000B>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "\u000B":""}]]},
+
+{"description":"<a a=''\\u000C>",
+"input":"<a a=''\u000C>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=''\\u000D>",
+"input":"<a a=''\u000D>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=''\\u001F>",
+"input":"<a a=''\u001F>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "\u001F":""}]]},
+
+{"description":"<a a='' >",
+"input":"<a a='' >",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=''!>",
+"input":"<a a=''!>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "!":""}]]},
+
+{"description":"<a a=''\">",
+"input":"<a a=''\">",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "\"":""}]]},
+
+{"description":"<a a=''&>",
+"input":"<a a=''&>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "&":""}]]},
+
+{"description":"<a a='''>",
+"input":"<a a='''>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "'":""}]]},
+
+{"description":"<a a=''->",
+"input":"<a a=''->",
+"output":["ParseError", ["StartTag", "a", {"a":"", "-":""}]]},
+
+{"description":"<a a=''.>",
+"input":"<a a=''.>",
+"output":["ParseError", ["StartTag", "a", {"a":"", ".":""}]]},
+
+{"description":"<a a=''/>",
+"input":"<a a=''/>",
+"output":[["StartTag", "a", {"a":""}, true]]},
+
+{"description":"<a a=''0>",
+"input":"<a a=''0>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "0":""}]]},
+
+{"description":"<a a=''1>",
+"input":"<a a=''1>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "1":""}]]},
+
+{"description":"<a a=''9>",
+"input":"<a a=''9>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "9":""}]]},
+
+{"description":"<a a=''<>",
+"input":"<a a=''<>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "<":""}]]},
+
+{"description":"<a a=''=>",
+"input":"<a a=''=>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "=":""}]]},
+
+{"description":"<a a=''>",
+"input":"<a a=''>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=''?>",
+"input":"<a a=''?>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "?":""}]]},
+
+{"description":"<a a=''@>",
+"input":"<a a=''@>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "@":""}]]},
+
+{"description":"<a a=''A>",
+"input":"<a a=''A>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=''B>",
+"input":"<a a=''B>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "b":""}]]},
+
+{"description":"<a a=''Y>",
+"input":"<a a=''Y>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "y":""}]]},
+
+{"description":"<a a=''Z>",
+"input":"<a a=''Z>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "z":""}]]},
+
+{"description":"<a a=''`>",
+"input":"<a a=''`>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "`":""}]]},
+
+{"description":"<a a=''a>",
+"input":"<a a=''a>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=''b>",
+"input":"<a a=''b>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "b":""}]]},
+
+{"description":"<a a=''y>",
+"input":"<a a=''y>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "y":""}]]},
+
+{"description":"<a a=''z>",
+"input":"<a a=''z>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "z":""}]]},
+
+{"description":"<a a=''{>",
+"input":"<a a=''{>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "{":""}]]},
+
+{"description":"<a a=''\\uDBC0\\uDC00>",
+"input":"<a a=''\uDBC0\uDC00>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "\uDBC0\uDC00":""}]]},
+
+{"description":"<a a='('>",
+"input":"<a a='('>",
+"output":[["StartTag", "a", {"a":"("}]]},
+
+{"description":"<a a='-'>",
+"input":"<a a='-'>",
+"output":[["StartTag", "a", {"a":"-"}]]},
+
+{"description":"<a a='/'>",
+"input":"<a a='/'>",
+"output":[["StartTag", "a", {"a":"/"}]]},
+
+{"description":"<a a='0'>",
+"input":"<a a='0'>",
+"output":[["StartTag", "a", {"a":"0"}]]},
+
+{"description":"<a a='1'>",
+"input":"<a a='1'>",
+"output":[["StartTag", "a", {"a":"1"}]]},
+
+{"description":"<a a='9'>",
+"input":"<a a='9'>",
+"output":[["StartTag", "a", {"a":"9"}]]},
+
+{"description":"<a a='<'>",
+"input":"<a a='<'>",
+"output":[["StartTag", "a", {"a":"<"}]]},
+
+{"description":"<a a='='>",
+"input":"<a a='='>",
+"output":[["StartTag", "a", {"a":"="}]]},
+
+{"description":"<a a='>'>",
+"input":"<a a='>'>",
+"output":[["StartTag", "a", {"a":">"}]]},
+
+{"description":"<a a='?'>",
+"input":"<a a='?'>",
+"output":[["StartTag", "a", {"a":"?"}]]},
+
+{"description":"<a a='@'>",
+"input":"<a a='@'>",
+"output":[["StartTag", "a", {"a":"@"}]]},
+
+{"description":"<a a='A'>",
+"input":"<a a='A'>",
+"output":[["StartTag", "a", {"a":"A"}]]},
+
+{"description":"<a a='B'>",
+"input":"<a a='B'>",
+"output":[["StartTag", "a", {"a":"B"}]]},
+
+{"description":"<a a='Y'>",
+"input":"<a a='Y'>",
+"output":[["StartTag", "a", {"a":"Y"}]]},
+
+{"description":"<a a='Z'>",
+"input":"<a a='Z'>",
+"output":[["StartTag", "a", {"a":"Z"}]]},
+
+{"description":"<a a='`'>",
+"input":"<a a='`'>",
+"output":[["StartTag", "a", {"a":"`"}]]},
+
+{"description":"<a a='a'>",
+"input":"<a a='a'>",
+"output":[["StartTag", "a", {"a":"a"}]]},
+
+{"description":"<a a='b'>",
+"input":"<a a='b'>",
+"output":[["StartTag", "a", {"a":"b"}]]},
+
+{"description":"<a a='y'>",
+"input":"<a a='y'>",
+"output":[["StartTag", "a", {"a":"y"}]]},
+
+{"description":"<a a='z'>",
+"input":"<a a='z'>",
+"output":[["StartTag", "a", {"a":"z"}]]},
+
+{"description":"<a a='{'>",
+"input":"<a a='{'>",
+"output":[["StartTag", "a", {"a":"{"}]]},
+
+{"description":"<a a='\\uDBC0\\uDC00'>",
+"input":"<a a='\uDBC0\uDC00'>",
+"output":[["StartTag", "a", {"a":"\uDBC0\uDC00"}]]},
+
+{"description":"<a a=(>",
+"input":"<a a=(>",
+"output":[["StartTag", "a", {"a":"("}]]},
+
+{"description":"<a a=->",
+"input":"<a a=->",
+"output":[["StartTag", "a", {"a":"-"}]]},
+
+{"description":"<a a=/>",
+"input":"<a a=/>",
+"output":[["StartTag", "a", {"a":"/"}]]},
+
+{"description":"<a a=0>",
+"input":"<a a=0>",
+"output":[["StartTag", "a", {"a":"0"}]]},
+
+{"description":"<a a=1>",
+"input":"<a a=1>",
+"output":[["StartTag", "a", {"a":"1"}]]},
+
+{"description":"<a a=9>",
+"input":"<a a=9>",
+"output":[["StartTag", "a", {"a":"9"}]]},
+
+{"description":"<a a=<>",
+"input":"<a a=<>",
+"output":["ParseError", ["StartTag", "a", {"a":"<"}]]},
+
+{"description":"<a a==>",
+"input":"<a a==>",
+"output":["ParseError", ["StartTag", "a", {"a":"="}]]},
+
+{"description":"<a a=>",
+"input":"<a a=>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=?>",
+"input":"<a a=?>",
+"output":[["StartTag", "a", {"a":"?"}]]},
+
+{"description":"<a a=@>",
+"input":"<a a=@>",
+"output":[["StartTag", "a", {"a":"@"}]]},
+
+{"description":"<a a=A>",
+"input":"<a a=A>",
+"output":[["StartTag", "a", {"a":"A"}]]},
+
+{"description":"<a a=B>",
+"input":"<a a=B>",
+"output":[["StartTag", "a", {"a":"B"}]]},
+
+{"description":"<a a=Y>",
+"input":"<a a=Y>",
+"output":[["StartTag", "a", {"a":"Y"}]]},
+
+{"description":"<a a=Z>",
+"input":"<a a=Z>",
+"output":[["StartTag", "a", {"a":"Z"}]]},
+
+{"description":"<a a=`>",
+"input":"<a a=`>",
+"output":["ParseError", ["StartTag", "a", {"a":"`"}]]},
+
+{"description":"<a a=a>",
+"input":"<a a=a>",
+"output":[["StartTag", "a", {"a":"a"}]]},
+
+{"description":"<a a=a\\u0000>",
+"input":"<a a=a\u0000>",
+"output":["ParseError", ["StartTag", "a", {"a":"a\uFFFD"}]]},
+
+{"description":"<a a=a\\u0008>",
+"input":"<a a=a\u0008>",
+"output":["ParseError", ["StartTag", "a", {"a":"a\u0008"}]]},
+
+{"description":"<a a=a\\u0009>",
+"input":"<a a=a\u0009>",
+"output":[["StartTag", "a", {"a":"a"}]]},
+
+{"description":"<a a=a\\u000A>",
+"input":"<a a=a\u000A>",
+"output":[["StartTag", "a", {"a":"a"}]]},
+
+{"description":"<a a=a\\u000B>",
+"input":"<a a=a\u000B>",
+"output":["ParseError", ["StartTag", "a", {"a":"a\u000B"}]]},
+
+{"description":"<a a=a\\u000C>",
+"input":"<a a=a\u000C>",
+"output":[["StartTag", "a", {"a":"a"}]]},
+
+{"description":"<a a=a\\u000D>",
+"input":"<a a=a\u000D>",
+"output":[["StartTag", "a", {"a":"a"}]]},
+
+{"description":"<a a=a\\u001F>",
+"input":"<a a=a\u001F>",
+"output":["ParseError", ["StartTag", "a", {"a":"a\u001F"}]]},
+
+{"description":"<a a=a >",
+"input":"<a a=a >",
+"output":[["StartTag", "a", {"a":"a"}]]},
+
+{"description":"<a a=a!>",
+"input":"<a a=a!>",
+"output":[["StartTag", "a", {"a":"a!"}]]},
+
+{"description":"<a a=a\">",
+"input":"<a a=a\">",
+"output":["ParseError", ["StartTag", "a", {"a":"a\""}]]},
+
+{"description":"<a a=a#>",
+"input":"<a a=a#>",
+"output":[["StartTag", "a", {"a":"a#"}]]},
+
+{"description":"<a a=a%>",
+"input":"<a a=a%>",
+"output":[["StartTag", "a", {"a":"a%"}]]},
+
+{"description":"<a a=a&>",
+"input":"<a a=a&>",
+"output":[["StartTag", "a", {"a":"a&"}]]},
+
+{"description":"<a a=a'>",
+"input":"<a a=a'>",
+"output":["ParseError", ["StartTag", "a", {"a":"a'"}]]},
+
+{"description":"<a a=a(>",
+"input":"<a a=a(>",
+"output":[["StartTag", "a", {"a":"a("}]]},
+
+{"description":"<a a=a->",
+"input":"<a a=a->",
+"output":[["StartTag", "a", {"a":"a-"}]]},
+
+{"description":"<a a=a/>",
+"input":"<a a=a/>",
+"output":[["StartTag", "a", {"a":"a/"}]]},
+
+{"description":"<a a=a0>",
+"input":"<a a=a0>",
+"output":[["StartTag", "a", {"a":"a0"}]]},
+
+{"description":"<a a=a1>",
+"input":"<a a=a1>",
+"output":[["StartTag", "a", {"a":"a1"}]]},
+
+{"description":"<a a=a9>",
+"input":"<a a=a9>",
+"output":[["StartTag", "a", {"a":"a9"}]]},
+
+{"description":"<a a=a<>",
+"input":"<a a=a<>",
+"output":["ParseError", ["StartTag", "a", {"a":"a<"}]]},
+
+{"description":"<a a=a=>",
+"input":"<a a=a=>",
+"output":["ParseError", ["StartTag", "a", {"a":"a="}]]},
+
+{"description":"<a a=a>",
+"input":"<a a=a>",
+"output":[["StartTag", "a", {"a":"a"}]]},
+
+{"description":"<a a=a?>",
+"input":"<a a=a?>",
+"output":[["StartTag", "a", {"a":"a?"}]]},
+
+{"description":"<a a=a@>",
+"input":"<a a=a@>",
+"output":[["StartTag", "a", {"a":"a@"}]]},
+
+{"description":"<a a=aA>",
+"input":"<a a=aA>",
+"output":[["StartTag", "a", {"a":"aA"}]]},
+
+{"description":"<a a=aB>",
+"input":"<a a=aB>",
+"output":[["StartTag", "a", {"a":"aB"}]]},
+
+{"description":"<a a=aY>",
+"input":"<a a=aY>",
+"output":[["StartTag", "a", {"a":"aY"}]]},
+
+{"description":"<a a=aZ>",
+"input":"<a a=aZ>",
+"output":[["StartTag", "a", {"a":"aZ"}]]},
+
+{"description":"<a a=a`>",
+"input":"<a a=a`>",
+"output":["ParseError", ["StartTag", "a", {"a":"a`"}]]},
+
+{"description":"<a a=aa>",
+"input":"<a a=aa>",
+"output":[["StartTag", "a", {"a":"aa"}]]},
+
+{"description":"<a a=ab>",
+"input":"<a a=ab>",
+"output":[["StartTag", "a", {"a":"ab"}]]},
+
+{"description":"<a a=ay>",
+"input":"<a a=ay>",
+"output":[["StartTag", "a", {"a":"ay"}]]},
+
+{"description":"<a a=az>",
+"input":"<a a=az>",
+"output":[["StartTag", "a", {"a":"az"}]]},
+
+{"description":"<a a=a{>",
+"input":"<a a=a{>",
+"output":[["StartTag", "a", {"a":"a{"}]]},
+
+{"description":"<a a=a\\uDBC0\\uDC00>",
+"input":"<a a=a\uDBC0\uDC00>",
+"output":[["StartTag", "a", {"a":"a\uDBC0\uDC00"}]]},
+
+{"description":"<a a=b>",
+"input":"<a a=b>",
+"output":[["StartTag", "a", {"a":"b"}]]},
+
+{"description":"<a a=y>",
+"input":"<a a=y>",
+"output":[["StartTag", "a", {"a":"y"}]]},
+
+{"description":"<a a=z>",
+"input":"<a a=z>",
+"output":[["StartTag", "a", {"a":"z"}]]},
+
+{"description":"<a a={>",
+"input":"<a a={>",
+"output":[["StartTag", "a", {"a":"{"}]]},
+
+{"description":"<a a=\\uDBC0\\uDC00>",
+"input":"<a a=\uDBC0\uDC00>",
+"output":[["StartTag", "a", {"a":"\uDBC0\uDC00"}]]},
+
+{"description":"<a a>",
+"input":"<a a>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a?>",
+"input":"<a a?>",
+"output":[["StartTag", "a", {"a?":""}]]},
+
+{"description":"<a a@>",
+"input":"<a a@>",
+"output":[["StartTag", "a", {"a@":""}]]},
+
+{"description":"<a aA>",
+"input":"<a aA>",
+"output":[["StartTag", "a", {"aa":""}]]},
+
+{"description":"<a aB>",
+"input":"<a aB>",
+"output":[["StartTag", "a", {"ab":""}]]},
+
+{"description":"<a aY>",
+"input":"<a aY>",
+"output":[["StartTag", "a", {"ay":""}]]},
+
+{"description":"<a aZ>",
+"input":"<a aZ>",
+"output":[["StartTag", "a", {"az":""}]]},
+
+{"description":"<a a[>",
+"input":"<a a[>",
+"output":[["StartTag", "a", {"a[":""}]]},
+
+{"description":"<a a`>",
+"input":"<a a`>",
+"output":[["StartTag", "a", {"a`":""}]]},
+
+{"description":"<a aa>",
+"input":"<a aa>",
+"output":[["StartTag", "a", {"aa":""}]]},
+
+{"description":"<a ab>",
+"input":"<a ab>",
+"output":[["StartTag", "a", {"ab":""}]]},
+
+{"description":"<a ay>",
+"input":"<a ay>",
+"output":[["StartTag", "a", {"ay":""}]]},
+
+{"description":"<a az>",
+"input":"<a az>",
+"output":[["StartTag", "a", {"az":""}]]},
+
+{"description":"<a a{>",
+"input":"<a a{>",
+"output":[["StartTag", "a", {"a{":""}]]},
+
+{"description":"<a a\\uDBC0\\uDC00>",
+"input":"<a a\uDBC0\uDC00>",
+"output":[["StartTag", "a", {"a\uDBC0\uDC00":""}]]},
+
+{"description":"<a b>",
+"input":"<a b>",
+"output":[["StartTag", "a", {"b":""}]]},
+
+{"description":"<a y>",
+"input":"<a y>",
+"output":[["StartTag", "a", {"y":""}]]},
+
+{"description":"<a z>",
+"input":"<a z>",
+"output":[["StartTag", "a", {"z":""}]]},
+
+{"description":"<a {>",
+"input":"<a {>",
+"output":[["StartTag", "a", {"{":""}]]},
+
+{"description":"<a \\uDBC0\\uDC00>",
+"input":"<a \uDBC0\uDC00>",
+"output":[["StartTag", "a", {"\uDBC0\uDC00":""}]]},
+
+{"description":"<a!>",
+"input":"<a!>",
+"output":[["StartTag", "a!", {}]]},
+
+{"description":"<a\">",
+"input":"<a\">",
+"output":[["StartTag", "a\"", {}]]},
+
+{"description":"<a&>",
+"input":"<a&>",
+"output":[["StartTag", "a&", {}]]},
+
+{"description":"<a'>",
+"input":"<a'>",
+"output":[["StartTag", "a'", {}]]},
+
+{"description":"<a->",
+"input":"<a->",
+"output":[["StartTag", "a-", {}]]},
+
+{"description":"<a.>",
+"input":"<a.>",
+"output":[["StartTag", "a.", {}]]},
+
+{"description":"<a/>",
+"input":"<a/>",
+"output":[["StartTag", "a", {}, true]]},
+
+{"description":"<a/\\u0000>",
+"input":"<a/\u0000>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"\uFFFD":""}]]},
+
+{"description":"<a/\\u0009>",
+"input":"<a/\u0009>",
+"output":["ParseError", ["StartTag", "a", {}]]},
+
+{"description":"<a/\\u000A>",
+"input":"<a/\u000A>",
+"output":["ParseError", ["StartTag", "a", {}]]},
+
+{"description":"<a/\\u000B>",
+"input":"<a/\u000B>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"\u000B":""}]]},
+
+{"description":"<a/\\u000C>",
+"input":"<a/\u000C>",
+"output":["ParseError", ["StartTag", "a", {}]]},
+
+{"description":"<a/ >",
+"input":"<a/ >",
+"output":["ParseError", ["StartTag", "a", {}]]},
+
+{"description":"<a/!>",
+"input":"<a/!>",
+"output":["ParseError", ["StartTag", "a", {"!":""}]]},
+
+{"description":"<a/\">",
+"input":"<a/\">",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"\"":""}]]},
+
+{"description":"<a/&>",
+"input":"<a/&>",
+"output":["ParseError", ["StartTag", "a", {"&":""}]]},
+
+{"description":"<a/'>",
+"input":"<a/'>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"'":""}]]},
+
+{"description":"<a/->",
+"input":"<a/->",
+"output":["ParseError", ["StartTag", "a", {"-":""}]]},
+
+{"description":"<a//>",
+"input":"<a//>",
+"output":["ParseError", ["StartTag", "a", {}, true]]},
+
+{"description":"<a/0>",
+"input":"<a/0>",
+"output":["ParseError", ["StartTag", "a", {"0":""}]]},
+
+{"description":"<a/1>",
+"input":"<a/1>",
+"output":["ParseError", ["StartTag", "a", {"1":""}]]},
+
+{"description":"<a/9>",
+"input":"<a/9>",
+"output":["ParseError", ["StartTag", "a", {"9":""}]]},
+
+{"description":"<a/<>",
+"input":"<a/<>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"<":""}]]},
+
+{"description":"<a/=>",
+"input":"<a/=>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"=":""}]]},
+
+{"description":"<a/>",
+"input":"<a/>",
+"output":[["StartTag", "a", {}, true]]},
+
+{"description":"<a/?>",
+"input":"<a/?>",
+"output":["ParseError", ["StartTag", "a", {"?":""}]]},
+
+{"description":"<a/@>",
+"input":"<a/@>",
+"output":["ParseError", ["StartTag", "a", {"@":""}]]},
+
+{"description":"<a/A>",
+"input":"<a/A>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a/B>",
+"input":"<a/B>",
+"output":["ParseError", ["StartTag", "a", {"b":""}]]},
+
+{"description":"<a/Y>",
+"input":"<a/Y>",
+"output":["ParseError", ["StartTag", "a", {"y":""}]]},
+
+{"description":"<a/Z>",
+"input":"<a/Z>",
+"output":["ParseError", ["StartTag", "a", {"z":""}]]},
+
+{"description":"<a/`>",
+"input":"<a/`>",
+"output":["ParseError", ["StartTag", "a", {"`":""}]]},
+
+{"description":"<a/a>",
+"input":"<a/a>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a/b>",
+"input":"<a/b>",
+"output":["ParseError", ["StartTag", "a", {"b":""}]]},
+
+{"description":"<a/y>",
+"input":"<a/y>",
+"output":["ParseError", ["StartTag", "a", {"y":""}]]},
+
+{"description":"<a/z>",
+"input":"<a/z>",
+"output":["ParseError", ["StartTag", "a", {"z":""}]]},
+
+{"description":"<a/{>",
+"input":"<a/{>",
+"output":["ParseError", ["StartTag", "a", {"{":""}]]},
+
+{"description":"<a/\\uDBC0\\uDC00>",
+"input":"<a/\uDBC0\uDC00>",
+"output":["ParseError", ["StartTag", "a", {"\uDBC0\uDC00":""}]]},
+
+{"description":"<a0>",
+"input":"<a0>",
+"output":[["StartTag", "a0", {}]]},
+
+{"description":"<a1>",
+"input":"<a1>",
+"output":[["StartTag", "a1", {}]]},
+
+{"description":"<a9>",
+"input":"<a9>",
+"output":[["StartTag", "a9", {}]]},
+
+{"description":"<a<>",
+"input":"<a<>",
+"output":[["StartTag", "a<", {}]]},
+
+{"description":"<a=>",
+"input":"<a=>",
+"output":[["StartTag", "a=", {}]]},
+
+{"description":"<a>",
+"input":"<a>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a?>",
+"input":"<a?>",
+"output":[["StartTag", "a?", {}]]},
+
+{"description":"<a@>",
+"input":"<a@>",
+"output":[["StartTag", "a@", {}]]},
+
+{"description":"<aA>",
+"input":"<aA>",
+"output":[["StartTag", "aa", {}]]},
+
+{"description":"<aB>",
+"input":"<aB>",
+"output":[["StartTag", "ab", {}]]},
+
+{"description":"<aY>",
+"input":"<aY>",
+"output":[["StartTag", "ay", {}]]},
+
+{"description":"<aZ>",
+"input":"<aZ>",
+"output":[["StartTag", "az", {}]]},
+
+{"description":"<a[>",
+"input":"<a[>",
+"output":[["StartTag", "a[", {}]]},
+
+{"description":"<a`>",
+"input":"<a`>",
+"output":[["StartTag", "a`", {}]]},
+
+{"description":"<aa>",
+"input":"<aa>",
+"output":[["StartTag", "aa", {}]]},
+
+{"description":"<ab>",
+"input":"<ab>",
+"output":[["StartTag", "ab", {}]]},
+
+{"description":"<ay>",
+"input":"<ay>",
+"output":[["StartTag", "ay", {}]]},
+
+{"description":"<az>",
+"input":"<az>",
+"output":[["StartTag", "az", {}]]},
+
+{"description":"<a{>",
+"input":"<a{>",
+"output":[["StartTag", "a{", {}]]},
+
+{"description":"<a\\uDBC0\\uDC00>",
+"input":"<a\uDBC0\uDC00>",
+"output":[["StartTag", "a\uDBC0\uDC00", {}]]},
+
+{"description":"<b>",
+"input":"<b>",
+"output":[["StartTag", "b", {}]]},
+
+{"description":"<y>",
+"input":"<y>",
+"output":[["StartTag", "y", {}]]},
+
+{"description":"<z>",
+"input":"<z>",
+"output":[["StartTag", "z", {}]]},
+
+{"description":"<{",
+"input":"<{",
+"output":["ParseError", ["Character", "<{"]]},
+
+{"description":"<\\uDBC0\\uDC00",
+"input":"<\uDBC0\uDC00",
+"output":["ParseError", ["Character", "<\uDBC0\uDC00"]]},
+
+{"description":"=",
+"input":"=",
+"output":[["Character", "="]]},
+
+{"description":">",
+"input":">",
+"output":[["Character", ">"]]},
+
+{"description":"?",
+"input":"?",
+"output":[["Character", "?"]]},
+
+{"description":"@",
+"input":"@",
+"output":[["Character", "@"]]},
+
+{"description":"A",
+"input":"A",
+"output":[["Character", "A"]]},
+
+{"description":"B",
+"input":"B",
+"output":[["Character", "B"]]},
+
+{"description":"Y",
+"input":"Y",
+"output":[["Character", "Y"]]},
+
+{"description":"Z",
+"input":"Z",
+"output":[["Character", "Z"]]},
+
+{"description":"`",
+"input":"`",
+"output":[["Character", "`"]]},
+
+{"description":"a",
+"input":"a",
+"output":[["Character", "a"]]},
+
+{"description":"b",
+"input":"b",
+"output":[["Character", "b"]]},
+
+{"description":"y",
+"input":"y",
+"output":[["Character", "y"]]},
+
+{"description":"z",
+"input":"z",
+"output":[["Character", "z"]]},
+
+{"description":"{",
+"input":"{",
+"output":[["Character", "{"]]},
+
+{"description":"\\uDBC0\\uDC00",
+"input":"\uDBC0\uDC00",
+"output":[["Character", "\uDBC0\uDC00"]]}
+
+]}
diff --git a/mojo/public/dart/third_party/html/test/data/tokenizer/test4.test b/mojo/public/dart/third_party/html/test/data/tokenizer/test4.test
new file mode 100644
index 0000000..80f859e
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tokenizer/test4.test
@@ -0,0 +1,344 @@
+{"tests": [
+
+{"description":"< in attribute name",
+"input":"<z/0  <>",
+"output":["ParseError", "ParseError", ["StartTag", "z", {"0": "", "<": ""}]]},
+
+{"description":"< in attribute value",
+"input":"<z x=<>",
+"output":["ParseError", ["StartTag", "z", {"x": "<"}]]},
+
+{"description":"= in unquoted attribute value",
+"input":"<z z=z=z>",
+"output":["ParseError", ["StartTag", "z", {"z": "z=z"}]]},
+
+{"description":"= attribute",
+"input":"<z =>",
+"output":["ParseError", ["StartTag", "z", {"=": ""}]]},
+
+{"description":"== attribute",
+"input":"<z ==>",
+"output":["ParseError", "ParseError", ["StartTag", "z", {"=": ""}]]},
+
+{"description":"=== attribute",
+"input":"<z ===>",
+"output":["ParseError", "ParseError", ["StartTag", "z", {"=": "="}]]},
+
+{"description":"==== attribute",
+"input":"<z ====>",
+"output":["ParseError", "ParseError", "ParseError", ["StartTag", "z", {"=": "=="}]]},
+
+{"description":"Allowed \" after ampersand in attribute value",
+"input":"<z z=\"&\">",
+"output":[["StartTag", "z", {"z": "&"}]]},
+
+{"description":"Non-allowed ' after ampersand in attribute value",
+"input":"<z z=\"&'\">",
+"output":["ParseError", ["StartTag", "z", {"z": "&'"}]]},
+
+{"description":"Allowed ' after ampersand in attribute value",
+"input":"<z z='&'>",
+"output":[["StartTag", "z", {"z": "&"}]]},
+
+{"description":"Non-allowed \" after ampersand in attribute value",
+"input":"<z z='&\"'>",
+"output":["ParseError", ["StartTag", "z", {"z": "&\""}]]},
+
+{"description":"Text after bogus character reference",
+"input":"<z z='&xlink_xmlns;'>bar<z>",
+"output":["ParseError",["StartTag","z",{"z":"&xlink_xmlns;"}],["Character","bar"],["StartTag","z",{}]]},
+
+{"description":"Text after hex character reference",
+"input":"<z z='&#x0020; foo'>bar<z>",
+"output":[["StartTag","z",{"z":"  foo"}],["Character","bar"],["StartTag","z",{}]]},
+
+{"description":"Attribute name starting with \"",
+"input":"<foo \"='bar'>",
+"output":["ParseError", ["StartTag", "foo", {"\"": "bar"}]]},
+
+{"description":"Attribute name starting with '",
+"input":"<foo '='bar'>",
+"output":["ParseError", ["StartTag", "foo", {"'": "bar"}]]},
+
+{"description":"Attribute name containing \"",
+"input":"<foo a\"b='bar'>",
+"output":["ParseError", ["StartTag", "foo", {"a\"b": "bar"}]]},
+
+{"description":"Attribute name containing '",
+"input":"<foo a'b='bar'>",
+"output":["ParseError", ["StartTag", "foo", {"a'b": "bar"}]]},
+
+{"description":"Unquoted attribute value containing '",
+"input":"<foo a=b'c>",
+"output":["ParseError", ["StartTag", "foo", {"a": "b'c"}]]},
+
+{"description":"Unquoted attribute value containing \"",
+"input":"<foo a=b\"c>",
+"output":["ParseError", ["StartTag", "foo", {"a": "b\"c"}]]},
+
+{"description":"Double-quoted attribute value not followed by whitespace",
+"input":"<foo a=\"b\"c>",
+"output":["ParseError", ["StartTag", "foo", {"a": "b", "c": ""}]]},
+
+{"description":"Single-quoted attribute value not followed by whitespace",
+"input":"<foo a='b'c>",
+"output":["ParseError", ["StartTag", "foo", {"a": "b", "c": ""}]]},
+
+{"description":"Quoted attribute followed by permitted /",
+"input":"<br a='b'/>",
+"output":[["StartTag","br",{"a":"b"},true]]},
+
+{"description":"Quoted attribute followed by non-permitted /",
+"input":"<bar a='b'/>",
+"output":[["StartTag","bar",{"a":"b"},true]]},
+
+{"description":"CR EOF after doctype name",
+"input":"<!doctype html \r",
+"output":["ParseError", ["DOCTYPE", "html", null, null, false]]},
+
+{"description":"CR EOF in tag name",
+"input":"<z\r",
+"output":["ParseError"]},
+
+{"description":"Slash EOF in tag name",
+"input":"<z/",
+"output":["ParseError"]},
+
+{"description":"Zero hex numeric entity",
+"input":"&#x0",
+"output":["ParseError", "ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"Zero decimal numeric entity",
+"input":"&#0",
+"output":["ParseError", "ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"Zero-prefixed hex numeric entity",
+"input":"&#x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041;",
+"output":[["Character", "A"]]},
+
+{"description":"Zero-prefixed decimal numeric entity",
+"input":"&#000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065;",
+"output":[["Character", "A"]]},
+
+{"description":"Empty hex numeric entities",
+"input":"&#x &#X ",
+"output":["ParseError", ["Character", "&#x "], "ParseError", ["Character", "&#X "]]},
+
+{"description":"Empty decimal numeric entities",
+"input":"&# &#; ",
+"output":["ParseError", ["Character", "&# "], "ParseError", ["Character", "&#; "]]},
+
+{"description":"Non-BMP numeric entity",
+"input":"&#x10000;",
+"output":[["Character", "\uD800\uDC00"]]},
+
+{"description":"Maximum non-BMP numeric entity",
+"input":"&#X10FFFF;",
+"output":["ParseError", ["Character", "\uDBFF\uDFFF"]]},
+
+{"description":"Above maximum numeric entity",
+"input":"&#x110000;",
+"output":["ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"32-bit hex numeric entity",
+"input":"&#x80000041;",
+"output":["ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"33-bit hex numeric entity",
+"input":"&#x100000041;",
+"output":["ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"33-bit decimal numeric entity",
+"input":"&#4294967361;",
+"output":["ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"65-bit hex numeric entity",
+"input":"&#x10000000000000041;",
+"output":["ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"65-bit decimal numeric entity",
+"input":"&#18446744073709551681;",
+"output":["ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"Surrogate code point edge cases",
+"input":"&#xD7FF;&#xD800;&#xD801;&#xDFFE;&#xDFFF;&#xE000;",
+"output":[["Character", "\uD7FF"], "ParseError", ["Character", "\uFFFD"], "ParseError", ["Character", "\uFFFD"], "ParseError", ["Character", "\uFFFD"], "ParseError", ["Character", "\uFFFD\uE000"]]},
+
+{"description":"Uppercase start tag name",
+"input":"<X>",
+"output":[["StartTag", "x", {}]]},
+
+{"description":"Uppercase end tag name",
+"input":"</X>",
+"output":[["EndTag", "x"]]},
+
+{"description":"Uppercase attribute name",
+"input":"<x X>",
+"output":[["StartTag", "x", { "x":"" }]]},
+
+{"description":"Tag/attribute name case edge values",
+"input":"<x@AZ[`az{ @AZ[`az{>",
+"output":[["StartTag", "x@az[`az{", { "@az[`az{":"" }]]},
+
+{"description":"Duplicate different-case attributes",
+"input":"<x x=1 x=2 X=3>",
+"output":["ParseError", "ParseError", ["StartTag", "x", { "x":"1" }]]},
+
+{"description":"Uppercase close tag attributes",
+"input":"</x X>",
+"output":["ParseError", ["EndTag", "x"]]},
+
+{"description":"Duplicate close tag attributes",
+"input":"</x x x>",
+"output":["ParseError", "ParseError", ["EndTag", "x"]]},
+
+{"description":"Permitted slash",
+"input":"<br/>",
+"output":[["StartTag","br",{},true]]},
+
+{"description":"Non-permitted slash",
+"input":"<xr/>",
+"output":[["StartTag","xr",{},true]]},
+
+{"description":"Permitted slash but in close tag",
+"input":"</br/>",
+"output":["ParseError", ["EndTag", "br"]]},
+
+{"description":"Doctype public case-sensitivity (1)",
+"input":"<!DoCtYpE HtMl PuBlIc \"AbC\" \"XyZ\">",
+"output":[["DOCTYPE", "html", "AbC", "XyZ", true]]},
+
+{"description":"Doctype public case-sensitivity (2)",
+"input":"<!dOcTyPe hTmL pUbLiC \"aBc\" \"xYz\">",
+"output":[["DOCTYPE", "html", "aBc", "xYz", true]]},
+
+{"description":"Doctype system case-sensitivity (1)",
+"input":"<!DoCtYpE HtMl SyStEm \"XyZ\">",
+"output":[["DOCTYPE", "html", null, "XyZ", true]]},
+
+{"description":"Doctype system case-sensitivity (2)",
+"input":"<!dOcTyPe hTmL sYsTeM \"xYz\">",
+"output":[["DOCTYPE", "html", null, "xYz", true]]},
+
+{"description":"U+0000 in lookahead region after non-matching character",
+"input":"<!doc>\u0000",
+"output":["ParseError", ["Comment", "doc"], "ParseError", ["Character", "\u0000"]],
+"ignoreErrorOrder":true},
+
+{"description":"U+0000 in lookahead region",
+"input":"<!doc\u0000",
+"output":["ParseError", ["Comment", "doc\uFFFD"]],
+"ignoreErrorOrder":true},
+
+{"description":"U+0080 in lookahead region",
+"input":"<!doc\u0080",
+"output":["ParseError", "ParseError", ["Comment", "doc\u0080"]],
+"ignoreErrorOrder":true},
+
+{"description":"U+FDD1 in lookahead region",
+"input":"<!doc\uFDD1",
+"output":["ParseError", "ParseError", ["Comment", "doc\uFDD1"]],
+"ignoreErrorOrder":true},
+
+{"description":"U+1FFFF in lookahead region",
+"input":"<!doc\uD83F\uDFFF",
+"output":["ParseError", "ParseError", ["Comment", "doc\uD83F\uDFFF"]],
+"ignoreErrorOrder":true},
+
+{"description":"CR followed by non-LF",
+"input":"\r?",
+"output":[["Character", "\n?"]]},
+
+{"description":"CR at EOF",
+"input":"\r",
+"output":[["Character", "\n"]]},
+
+{"description":"LF at EOF",
+"input":"\n",
+"output":[["Character", "\n"]]},
+
+{"description":"CR LF",
+"input":"\r\n",
+"output":[["Character", "\n"]]},
+
+{"description":"CR CR",
+"input":"\r\r",
+"output":[["Character", "\n\n"]]},
+
+{"description":"LF LF",
+"input":"\n\n",
+"output":[["Character", "\n\n"]]},
+
+{"description":"LF CR",
+"input":"\n\r",
+"output":[["Character", "\n\n"]]},
+
+{"description":"text CR CR CR text",
+"input":"text\r\r\rtext",
+"output":[["Character", "text\n\n\ntext"]]},
+
+{"description":"Doctype publik",
+"input":"<!DOCTYPE html PUBLIK \"AbC\" \"XyZ\">",
+"output":["ParseError", ["DOCTYPE", "html", null, null, false]]},
+
+{"description":"Doctype publi",
+"input":"<!DOCTYPE html PUBLI",
+"output":["ParseError", ["DOCTYPE", "html", null, null, false]]},
+
+{"description":"Doctype sistem",
+"input":"<!DOCTYPE html SISTEM \"AbC\">",
+"output":["ParseError", ["DOCTYPE", "html", null, null, false]]},
+
+{"description":"Doctype sys",
+"input":"<!DOCTYPE html SYS",
+"output":["ParseError", ["DOCTYPE", "html", null, null, false]]},
+
+{"description":"Doctype html x>text",
+"input":"<!DOCTYPE html x>text",
+"output":["ParseError", ["DOCTYPE", "html", null, null, false], ["Character", "text"]]},
+
+{"description":"Grave accent in unquoted attribute",
+"input":"<a a=aa`>",
+"output":["ParseError", ["StartTag", "a", {"a":"aa`"}]]},
+
+{"description":"EOF in tag name state ",
+"input":"<a",
+"output":["ParseError"]},
+
+{"description":"EOF in tag name state",
+"input":"<a",
+"output":["ParseError"]},
+
+{"description":"EOF in before attribute name state",
+"input":"<a ",
+"output":["ParseError"]},
+
+{"description":"EOF in attribute name state",
+"input":"<a a",
+"output":["ParseError"]},
+
+{"description":"EOF in after attribute name state",
+"input":"<a a ",
+"output":["ParseError"]},
+
+{"description":"EOF in before attribute value state",
+"input":"<a a =",
+"output":["ParseError"]},
+
+{"description":"EOF in attribute value (double quoted) state",
+"input":"<a a =\"a",
+"output":["ParseError"]},
+
+{"description":"EOF in attribute value (single quoted) state",
+"input":"<a a ='a",
+"output":["ParseError"]},
+
+{"description":"EOF in attribute value (unquoted) state",
+"input":"<a a =a",
+"output":["ParseError"]},
+
+{"description":"EOF in after attribute value state",
+"input":"<a a ='a'",
+"output":["ParseError"]}
+
+]}
diff --git a/mojo/public/dart/third_party/html/test/data/tokenizer/unicodeChars.test b/mojo/public/dart/third_party/html/test/data/tokenizer/unicodeChars.test
new file mode 100644
index 0000000..c778668
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tokenizer/unicodeChars.test
@@ -0,0 +1,1295 @@
+{"tests": [
+
+{"description": "Invalid Unicode character U+0001",
+"input": "\u0001",
+"output": ["ParseError", ["Character", "\u0001"]]},
+
+{"description": "Invalid Unicode character U+0002",
+"input": "\u0002",
+"output": ["ParseError", ["Character", "\u0002"]]},
+
+{"description": "Invalid Unicode character U+0003",
+"input": "\u0003",
+"output": ["ParseError", ["Character", "\u0003"]]},
+
+{"description": "Invalid Unicode character U+0004",
+"input": "\u0004",
+"output": ["ParseError", ["Character", "\u0004"]]},
+
+{"description": "Invalid Unicode character U+0005",
+"input": "\u0005",
+"output": ["ParseError", ["Character", "\u0005"]]},
+
+{"description": "Invalid Unicode character U+0006",
+"input": "\u0006",
+"output": ["ParseError", ["Character", "\u0006"]]},
+
+{"description": "Invalid Unicode character U+0007",
+"input": "\u0007",
+"output": ["ParseError", ["Character", "\u0007"]]},
+
+{"description": "Invalid Unicode character U+0008",
+"input": "\u0008",
+"output": ["ParseError", ["Character", "\u0008"]]},
+
+{"description": "Invalid Unicode character U+000B",
+"input": "\u000B",
+"output": ["ParseError", ["Character", "\u000B"]]},
+
+{"description": "Invalid Unicode character U+000E",
+"input": "\u000E",
+"output": ["ParseError", ["Character", "\u000E"]]},
+
+{"description": "Invalid Unicode character U+000F",
+"input": "\u000F",
+"output": ["ParseError", ["Character", "\u000F"]]},
+
+{"description": "Invalid Unicode character U+0010",
+"input": "\u0010",
+"output": ["ParseError", ["Character", "\u0010"]]},
+
+{"description": "Invalid Unicode character U+0011",
+"input": "\u0011",
+"output": ["ParseError", ["Character", "\u0011"]]},
+
+{"description": "Invalid Unicode character U+0012",
+"input": "\u0012",
+"output": ["ParseError", ["Character", "\u0012"]]},
+
+{"description": "Invalid Unicode character U+0013",
+"input": "\u0013",
+"output": ["ParseError", ["Character", "\u0013"]]},
+
+{"description": "Invalid Unicode character U+0014",
+"input": "\u0014",
+"output": ["ParseError", ["Character", "\u0014"]]},
+
+{"description": "Invalid Unicode character U+0015",
+"input": "\u0015",
+"output": ["ParseError", ["Character", "\u0015"]]},
+
+{"description": "Invalid Unicode character U+0016",
+"input": "\u0016",
+"output": ["ParseError", ["Character", "\u0016"]]},
+
+{"description": "Invalid Unicode character U+0017",
+"input": "\u0017",
+"output": ["ParseError", ["Character", "\u0017"]]},
+
+{"description": "Invalid Unicode character U+0018",
+"input": "\u0018",
+"output": ["ParseError", ["Character", "\u0018"]]},
+
+{"description": "Invalid Unicode character U+0019",
+"input": "\u0019",
+"output": ["ParseError", ["Character", "\u0019"]]},
+
+{"description": "Invalid Unicode character U+001A",
+"input": "\u001A",
+"output": ["ParseError", ["Character", "\u001A"]]},
+
+{"description": "Invalid Unicode character U+001B",
+"input": "\u001B",
+"output": ["ParseError", ["Character", "\u001B"]]},
+
+{"description": "Invalid Unicode character U+001C",
+"input": "\u001C",
+"output": ["ParseError", ["Character", "\u001C"]]},
+
+{"description": "Invalid Unicode character U+001D",
+"input": "\u001D",
+"output": ["ParseError", ["Character", "\u001D"]]},
+
+{"description": "Invalid Unicode character U+001E",
+"input": "\u001E",
+"output": ["ParseError", ["Character", "\u001E"]]},
+
+{"description": "Invalid Unicode character U+001F",
+"input": "\u001F",
+"output": ["ParseError", ["Character", "\u001F"]]},
+
+{"description": "Invalid Unicode character U+007F",
+"input": "\u007F",
+"output": ["ParseError", ["Character", "\u007F"]]},
+
+{"description": "Invalid Unicode character U+FDD0",
+"input": "\uFDD0",
+"output": ["ParseError", ["Character", "\uFDD0"]]},
+
+{"description": "Invalid Unicode character U+FDD1",
+"input": "\uFDD1",
+"output": ["ParseError", ["Character", "\uFDD1"]]},
+
+{"description": "Invalid Unicode character U+FDD2",
+"input": "\uFDD2",
+"output": ["ParseError", ["Character", "\uFDD2"]]},
+
+{"description": "Invalid Unicode character U+FDD3",
+"input": "\uFDD3",
+"output": ["ParseError", ["Character", "\uFDD3"]]},
+
+{"description": "Invalid Unicode character U+FDD4",
+"input": "\uFDD4",
+"output": ["ParseError", ["Character", "\uFDD4"]]},
+
+{"description": "Invalid Unicode character U+FDD5",
+"input": "\uFDD5",
+"output": ["ParseError", ["Character", "\uFDD5"]]},
+
+{"description": "Invalid Unicode character U+FDD6",
+"input": "\uFDD6",
+"output": ["ParseError", ["Character", "\uFDD6"]]},
+
+{"description": "Invalid Unicode character U+FDD7",
+"input": "\uFDD7",
+"output": ["ParseError", ["Character", "\uFDD7"]]},
+
+{"description": "Invalid Unicode character U+FDD8",
+"input": "\uFDD8",
+"output": ["ParseError", ["Character", "\uFDD8"]]},
+
+{"description": "Invalid Unicode character U+FDD9",
+"input": "\uFDD9",
+"output": ["ParseError", ["Character", "\uFDD9"]]},
+
+{"description": "Invalid Unicode character U+FDDA",
+"input": "\uFDDA",
+"output": ["ParseError", ["Character", "\uFDDA"]]},
+
+{"description": "Invalid Unicode character U+FDDB",
+"input": "\uFDDB",
+"output": ["ParseError", ["Character", "\uFDDB"]]},
+
+{"description": "Invalid Unicode character U+FDDC",
+"input": "\uFDDC",
+"output": ["ParseError", ["Character", "\uFDDC"]]},
+
+{"description": "Invalid Unicode character U+FDDD",
+"input": "\uFDDD",
+"output": ["ParseError", ["Character", "\uFDDD"]]},
+
+{"description": "Invalid Unicode character U+FDDE",
+"input": "\uFDDE",
+"output": ["ParseError", ["Character", "\uFDDE"]]},
+
+{"description": "Invalid Unicode character U+FDDF",
+"input": "\uFDDF",
+"output": ["ParseError", ["Character", "\uFDDF"]]},
+
+{"description": "Invalid Unicode character U+FDE0",
+"input": "\uFDE0",
+"output": ["ParseError", ["Character", "\uFDE0"]]},
+
+{"description": "Invalid Unicode character U+FDE1",
+"input": "\uFDE1",
+"output": ["ParseError", ["Character", "\uFDE1"]]},
+
+{"description": "Invalid Unicode character U+FDE2",
+"input": "\uFDE2",
+"output": ["ParseError", ["Character", "\uFDE2"]]},
+
+{"description": "Invalid Unicode character U+FDE3",
+"input": "\uFDE3",
+"output": ["ParseError", ["Character", "\uFDE3"]]},
+
+{"description": "Invalid Unicode character U+FDE4",
+"input": "\uFDE4",
+"output": ["ParseError", ["Character", "\uFDE4"]]},
+
+{"description": "Invalid Unicode character U+FDE5",
+"input": "\uFDE5",
+"output": ["ParseError", ["Character", "\uFDE5"]]},
+
+{"description": "Invalid Unicode character U+FDE6",
+"input": "\uFDE6",
+"output": ["ParseError", ["Character", "\uFDE6"]]},
+
+{"description": "Invalid Unicode character U+FDE7",
+"input": "\uFDE7",
+"output": ["ParseError", ["Character", "\uFDE7"]]},
+
+{"description": "Invalid Unicode character U+FDE8",
+"input": "\uFDE8",
+"output": ["ParseError", ["Character", "\uFDE8"]]},
+
+{"description": "Invalid Unicode character U+FDE9",
+"input": "\uFDE9",
+"output": ["ParseError", ["Character", "\uFDE9"]]},
+
+{"description": "Invalid Unicode character U+FDEA",
+"input": "\uFDEA",
+"output": ["ParseError", ["Character", "\uFDEA"]]},
+
+{"description": "Invalid Unicode character U+FDEB",
+"input": "\uFDEB",
+"output": ["ParseError", ["Character", "\uFDEB"]]},
+
+{"description": "Invalid Unicode character U+FDEC",
+"input": "\uFDEC",
+"output": ["ParseError", ["Character", "\uFDEC"]]},
+
+{"description": "Invalid Unicode character U+FDED",
+"input": "\uFDED",
+"output": ["ParseError", ["Character", "\uFDED"]]},
+
+{"description": "Invalid Unicode character U+FDEE",
+"input": "\uFDEE",
+"output": ["ParseError", ["Character", "\uFDEE"]]},
+
+{"description": "Invalid Unicode character U+FDEF",
+"input": "\uFDEF",
+"output": ["ParseError", ["Character", "\uFDEF"]]},
+
+{"description": "Invalid Unicode character U+FFFE",
+"input": "\uFFFE",
+"output": ["ParseError", ["Character", "\uFFFE"]]},
+
+{"description": "Invalid Unicode character U+FFFF",
+"input": "\uFFFF",
+"output": ["ParseError", ["Character", "\uFFFF"]]},
+
+{"description": "Invalid Unicode character U+1FFFE",
+"input": "\uD83F\uDFFE",
+"output": ["ParseError", ["Character", "\uD83F\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+1FFFF",
+"input": "\uD83F\uDFFF",
+"output": ["ParseError", ["Character", "\uD83F\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+2FFFE",
+"input": "\uD87F\uDFFE",
+"output": ["ParseError", ["Character", "\uD87F\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+2FFFF",
+"input": "\uD87F\uDFFF",
+"output": ["ParseError", ["Character", "\uD87F\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+3FFFE",
+"input": "\uD8BF\uDFFE",
+"output": ["ParseError", ["Character", "\uD8BF\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+3FFFF",
+"input": "\uD8BF\uDFFF",
+"output": ["ParseError", ["Character", "\uD8BF\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+4FFFE",
+"input": "\uD8FF\uDFFE",
+"output": ["ParseError", ["Character", "\uD8FF\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+4FFFF",
+"input": "\uD8FF\uDFFF",
+"output": ["ParseError", ["Character", "\uD8FF\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+5FFFE",
+"input": "\uD93F\uDFFE",
+"output": ["ParseError", ["Character", "\uD93F\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+5FFFF",
+"input": "\uD93F\uDFFF",
+"output": ["ParseError", ["Character", "\uD93F\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+6FFFE",
+"input": "\uD97F\uDFFE",
+"output": ["ParseError", ["Character", "\uD97F\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+6FFFF",
+"input": "\uD97F\uDFFF",
+"output": ["ParseError", ["Character", "\uD97F\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+7FFFE",
+"input": "\uD9BF\uDFFE",
+"output": ["ParseError", ["Character", "\uD9BF\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+7FFFF",
+"input": "\uD9BF\uDFFF",
+"output": ["ParseError", ["Character", "\uD9BF\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+8FFFE",
+"input": "\uD9FF\uDFFE",
+"output": ["ParseError", ["Character", "\uD9FF\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+8FFFF",
+"input": "\uD9FF\uDFFF",
+"output": ["ParseError", ["Character", "\uD9FF\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+9FFFE",
+"input": "\uDA3F\uDFFE",
+"output": ["ParseError", ["Character", "\uDA3F\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+9FFFF",
+"input": "\uDA3F\uDFFF",
+"output": ["ParseError", ["Character", "\uDA3F\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+AFFFE",
+"input": "\uDA7F\uDFFE",
+"output": ["ParseError", ["Character", "\uDA7F\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+AFFFF",
+"input": "\uDA7F\uDFFF",
+"output": ["ParseError", ["Character", "\uDA7F\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+BFFFE",
+"input": "\uDABF\uDFFE",
+"output": ["ParseError", ["Character", "\uDABF\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+BFFFF",
+"input": "\uDABF\uDFFF",
+"output": ["ParseError", ["Character", "\uDABF\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+CFFFE",
+"input": "\uDAFF\uDFFE",
+"output": ["ParseError", ["Character", "\uDAFF\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+CFFFF",
+"input": "\uDAFF\uDFFF",
+"output": ["ParseError", ["Character", "\uDAFF\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+DFFFE",
+"input": "\uDB3F\uDFFE",
+"output": ["ParseError", ["Character", "\uDB3F\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+DFFFF",
+"input": "\uDB3F\uDFFF",
+"output": ["ParseError", ["Character", "\uDB3F\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+EFFFE",
+"input": "\uDB7F\uDFFE",
+"output": ["ParseError", ["Character", "\uDB7F\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+EFFFF",
+"input": "\uDB7F\uDFFF",
+"output": ["ParseError", ["Character", "\uDB7F\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+FFFFE",
+"input": "\uDBBF\uDFFE",
+"output": ["ParseError", ["Character", "\uDBBF\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+FFFFF",
+"input": "\uDBBF\uDFFF",
+"output": ["ParseError", ["Character", "\uDBBF\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+10FFFE",
+"input": "\uDBFF\uDFFE",
+"output": ["ParseError", ["Character", "\uDBFF\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+10FFFF",
+"input": "\uDBFF\uDFFF",
+"output": ["ParseError", ["Character", "\uDBFF\uDFFF"]]},
+
+{"description": "Valid Unicode character U+0009",
+"input": "\u0009",
+"output": [["Character", "\u0009"]]},
+
+{"description": "Valid Unicode character U+000A",
+"input": "\u000A",
+"output": [["Character", "\u000A"]]},
+
+{"description": "Valid Unicode character U+0020",
+"input": "\u0020",
+"output": [["Character", "\u0020"]]},
+
+{"description": "Valid Unicode character U+0021",
+"input": "\u0021",
+"output": [["Character", "\u0021"]]},
+
+{"description": "Valid Unicode character U+0022",
+"input": "\u0022",
+"output": [["Character", "\u0022"]]},
+
+{"description": "Valid Unicode character U+0023",
+"input": "\u0023",
+"output": [["Character", "\u0023"]]},
+
+{"description": "Valid Unicode character U+0024",
+"input": "\u0024",
+"output": [["Character", "\u0024"]]},
+
+{"description": "Valid Unicode character U+0025",
+"input": "\u0025",
+"output": [["Character", "\u0025"]]},
+
+{"description": "Valid Unicode character U+0026",
+"input": "\u0026",
+"output": [["Character", "\u0026"]]},
+
+{"description": "Valid Unicode character U+0027",
+"input": "\u0027",
+"output": [["Character", "\u0027"]]},
+
+{"description": "Valid Unicode character U+0028",
+"input": "\u0028",
+"output": [["Character", "\u0028"]]},
+
+{"description": "Valid Unicode character U+0029",
+"input": "\u0029",
+"output": [["Character", "\u0029"]]},
+
+{"description": "Valid Unicode character U+002A",
+"input": "\u002A",
+"output": [["Character", "\u002A"]]},
+
+{"description": "Valid Unicode character U+002B",
+"input": "\u002B",
+"output": [["Character", "\u002B"]]},
+
+{"description": "Valid Unicode character U+002C",
+"input": "\u002C",
+"output": [["Character", "\u002C"]]},
+
+{"description": "Valid Unicode character U+002D",
+"input": "\u002D",
+"output": [["Character", "\u002D"]]},
+
+{"description": "Valid Unicode character U+002E",
+"input": "\u002E",
+"output": [["Character", "\u002E"]]},
+
+{"description": "Valid Unicode character U+002F",
+"input": "\u002F",
+"output": [["Character", "\u002F"]]},
+
+{"description": "Valid Unicode character U+0030",
+"input": "\u0030",
+"output": [["Character", "\u0030"]]},
+
+{"description": "Valid Unicode character U+0031",
+"input": "\u0031",
+"output": [["Character", "\u0031"]]},
+
+{"description": "Valid Unicode character U+0032",
+"input": "\u0032",
+"output": [["Character", "\u0032"]]},
+
+{"description": "Valid Unicode character U+0033",
+"input": "\u0033",
+"output": [["Character", "\u0033"]]},
+
+{"description": "Valid Unicode character U+0034",
+"input": "\u0034",
+"output": [["Character", "\u0034"]]},
+
+{"description": "Valid Unicode character U+0035",
+"input": "\u0035",
+"output": [["Character", "\u0035"]]},
+
+{"description": "Valid Unicode character U+0036",
+"input": "\u0036",
+"output": [["Character", "\u0036"]]},
+
+{"description": "Valid Unicode character U+0037",
+"input": "\u0037",
+"output": [["Character", "\u0037"]]},
+
+{"description": "Valid Unicode character U+0038",
+"input": "\u0038",
+"output": [["Character", "\u0038"]]},
+
+{"description": "Valid Unicode character U+0039",
+"input": "\u0039",
+"output": [["Character", "\u0039"]]},
+
+{"description": "Valid Unicode character U+003A",
+"input": "\u003A",
+"output": [["Character", "\u003A"]]},
+
+{"description": "Valid Unicode character U+003B",
+"input": "\u003B",
+"output": [["Character", "\u003B"]]},
+
+{"description": "Valid Unicode character U+003D",
+"input": "\u003D",
+"output": [["Character", "\u003D"]]},
+
+{"description": "Valid Unicode character U+003E",
+"input": "\u003E",
+"output": [["Character", "\u003E"]]},
+
+{"description": "Valid Unicode character U+003F",
+"input": "\u003F",
+"output": [["Character", "\u003F"]]},
+
+{"description": "Valid Unicode character U+0040",
+"input": "\u0040",
+"output": [["Character", "\u0040"]]},
+
+{"description": "Valid Unicode character U+0041",
+"input": "\u0041",
+"output": [["Character", "\u0041"]]},
+
+{"description": "Valid Unicode character U+0042",
+"input": "\u0042",
+"output": [["Character", "\u0042"]]},
+
+{"description": "Valid Unicode character U+0043",
+"input": "\u0043",
+"output": [["Character", "\u0043"]]},
+
+{"description": "Valid Unicode character U+0044",
+"input": "\u0044",
+"output": [["Character", "\u0044"]]},
+
+{"description": "Valid Unicode character U+0045",
+"input": "\u0045",
+"output": [["Character", "\u0045"]]},
+
+{"description": "Valid Unicode character U+0046",
+"input": "\u0046",
+"output": [["Character", "\u0046"]]},
+
+{"description": "Valid Unicode character U+0047",
+"input": "\u0047",
+"output": [["Character", "\u0047"]]},
+
+{"description": "Valid Unicode character U+0048",
+"input": "\u0048",
+"output": [["Character", "\u0048"]]},
+
+{"description": "Valid Unicode character U+0049",
+"input": "\u0049",
+"output": [["Character", "\u0049"]]},
+
+{"description": "Valid Unicode character U+004A",
+"input": "\u004A",
+"output": [["Character", "\u004A"]]},
+
+{"description": "Valid Unicode character U+004B",
+"input": "\u004B",
+"output": [["Character", "\u004B"]]},
+
+{"description": "Valid Unicode character U+004C",
+"input": "\u004C",
+"output": [["Character", "\u004C"]]},
+
+{"description": "Valid Unicode character U+004D",
+"input": "\u004D",
+"output": [["Character", "\u004D"]]},
+
+{"description": "Valid Unicode character U+004E",
+"input": "\u004E",
+"output": [["Character", "\u004E"]]},
+
+{"description": "Valid Unicode character U+004F",
+"input": "\u004F",
+"output": [["Character", "\u004F"]]},
+
+{"description": "Valid Unicode character U+0050",
+"input": "\u0050",
+"output": [["Character", "\u0050"]]},
+
+{"description": "Valid Unicode character U+0051",
+"input": "\u0051",
+"output": [["Character", "\u0051"]]},
+
+{"description": "Valid Unicode character U+0052",
+"input": "\u0052",
+"output": [["Character", "\u0052"]]},
+
+{"description": "Valid Unicode character U+0053",
+"input": "\u0053",
+"output": [["Character", "\u0053"]]},
+
+{"description": "Valid Unicode character U+0054",
+"input": "\u0054",
+"output": [["Character", "\u0054"]]},
+
+{"description": "Valid Unicode character U+0055",
+"input": "\u0055",
+"output": [["Character", "\u0055"]]},
+
+{"description": "Valid Unicode character U+0056",
+"input": "\u0056",
+"output": [["Character", "\u0056"]]},
+
+{"description": "Valid Unicode character U+0057",
+"input": "\u0057",
+"output": [["Character", "\u0057"]]},
+
+{"description": "Valid Unicode character U+0058",
+"input": "\u0058",
+"output": [["Character", "\u0058"]]},
+
+{"description": "Valid Unicode character U+0059",
+"input": "\u0059",
+"output": [["Character", "\u0059"]]},
+
+{"description": "Valid Unicode character U+005A",
+"input": "\u005A",
+"output": [["Character", "\u005A"]]},
+
+{"description": "Valid Unicode character U+005B",
+"input": "\u005B",
+"output": [["Character", "\u005B"]]},
+
+{"description": "Valid Unicode character U+005C",
+"input": "\u005C",
+"output": [["Character", "\u005C"]]},
+
+{"description": "Valid Unicode character U+005D",
+"input": "\u005D",
+"output": [["Character", "\u005D"]]},
+
+{"description": "Valid Unicode character U+005E",
+"input": "\u005E",
+"output": [["Character", "\u005E"]]},
+
+{"description": "Valid Unicode character U+005F",
+"input": "\u005F",
+"output": [["Character", "\u005F"]]},
+
+{"description": "Valid Unicode character U+0060",
+"input": "\u0060",
+"output": [["Character", "\u0060"]]},
+
+{"description": "Valid Unicode character U+0061",
+"input": "\u0061",
+"output": [["Character", "\u0061"]]},
+
+{"description": "Valid Unicode character U+0062",
+"input": "\u0062",
+"output": [["Character", "\u0062"]]},
+
+{"description": "Valid Unicode character U+0063",
+"input": "\u0063",
+"output": [["Character", "\u0063"]]},
+
+{"description": "Valid Unicode character U+0064",
+"input": "\u0064",
+"output": [["Character", "\u0064"]]},
+
+{"description": "Valid Unicode character U+0065",
+"input": "\u0065",
+"output": [["Character", "\u0065"]]},
+
+{"description": "Valid Unicode character U+0066",
+"input": "\u0066",
+"output": [["Character", "\u0066"]]},
+
+{"description": "Valid Unicode character U+0067",
+"input": "\u0067",
+"output": [["Character", "\u0067"]]},
+
+{"description": "Valid Unicode character U+0068",
+"input": "\u0068",
+"output": [["Character", "\u0068"]]},
+
+{"description": "Valid Unicode character U+0069",
+"input": "\u0069",
+"output": [["Character", "\u0069"]]},
+
+{"description": "Valid Unicode character U+006A",
+"input": "\u006A",
+"output": [["Character", "\u006A"]]},
+
+{"description": "Valid Unicode character U+006B",
+"input": "\u006B",
+"output": [["Character", "\u006B"]]},
+
+{"description": "Valid Unicode character U+006C",
+"input": "\u006C",
+"output": [["Character", "\u006C"]]},
+
+{"description": "Valid Unicode character U+006D",
+"input": "\u006D",
+"output": [["Character", "\u006D"]]},
+
+{"description": "Valid Unicode character U+006E",
+"input": "\u006E",
+"output": [["Character", "\u006E"]]},
+
+{"description": "Valid Unicode character U+006F",
+"input": "\u006F",
+"output": [["Character", "\u006F"]]},
+
+{"description": "Valid Unicode character U+0070",
+"input": "\u0070",
+"output": [["Character", "\u0070"]]},
+
+{"description": "Valid Unicode character U+0071",
+"input": "\u0071",
+"output": [["Character", "\u0071"]]},
+
+{"description": "Valid Unicode character U+0072",
+"input": "\u0072",
+"output": [["Character", "\u0072"]]},
+
+{"description": "Valid Unicode character U+0073",
+"input": "\u0073",
+"output": [["Character", "\u0073"]]},
+
+{"description": "Valid Unicode character U+0074",
+"input": "\u0074",
+"output": [["Character", "\u0074"]]},
+
+{"description": "Valid Unicode character U+0075",
+"input": "\u0075",
+"output": [["Character", "\u0075"]]},
+
+{"description": "Valid Unicode character U+0076",
+"input": "\u0076",
+"output": [["Character", "\u0076"]]},
+
+{"description": "Valid Unicode character U+0077",
+"input": "\u0077",
+"output": [["Character", "\u0077"]]},
+
+{"description": "Valid Unicode character U+0078",
+"input": "\u0078",
+"output": [["Character", "\u0078"]]},
+
+{"description": "Valid Unicode character U+0079",
+"input": "\u0079",
+"output": [["Character", "\u0079"]]},
+
+{"description": "Valid Unicode character U+007A",
+"input": "\u007A",
+"output": [["Character", "\u007A"]]},
+
+{"description": "Valid Unicode character U+007B",
+"input": "\u007B",
+"output": [["Character", "\u007B"]]},
+
+{"description": "Valid Unicode character U+007C",
+"input": "\u007C",
+"output": [["Character", "\u007C"]]},
+
+{"description": "Valid Unicode character U+007D",
+"input": "\u007D",
+"output": [["Character", "\u007D"]]},
+
+{"description": "Valid Unicode character U+007E",
+"input": "\u007E",
+"output": [["Character", "\u007E"]]},
+
+{"description": "Valid Unicode character U+00A0",
+"input": "\u00A0",
+"output": [["Character", "\u00A0"]]},
+
+{"description": "Valid Unicode character U+00A1",
+"input": "\u00A1",
+"output": [["Character", "\u00A1"]]},
+
+{"description": "Valid Unicode character U+00A2",
+"input": "\u00A2",
+"output": [["Character", "\u00A2"]]},
+
+{"description": "Valid Unicode character U+00A3",
+"input": "\u00A3",
+"output": [["Character", "\u00A3"]]},
+
+{"description": "Valid Unicode character U+00A4",
+"input": "\u00A4",
+"output": [["Character", "\u00A4"]]},
+
+{"description": "Valid Unicode character U+00A5",
+"input": "\u00A5",
+"output": [["Character", "\u00A5"]]},
+
+{"description": "Valid Unicode character U+00A6",
+"input": "\u00A6",
+"output": [["Character", "\u00A6"]]},
+
+{"description": "Valid Unicode character U+00A7",
+"input": "\u00A7",
+"output": [["Character", "\u00A7"]]},
+
+{"description": "Valid Unicode character U+00A8",
+"input": "\u00A8",
+"output": [["Character", "\u00A8"]]},
+
+{"description": "Valid Unicode character U+00A9",
+"input": "\u00A9",
+"output": [["Character", "\u00A9"]]},
+
+{"description": "Valid Unicode character U+00AA",
+"input": "\u00AA",
+"output": [["Character", "\u00AA"]]},
+
+{"description": "Valid Unicode character U+00AB",
+"input": "\u00AB",
+"output": [["Character", "\u00AB"]]},
+
+{"description": "Valid Unicode character U+00AC",
+"input": "\u00AC",
+"output": [["Character", "\u00AC"]]},
+
+{"description": "Valid Unicode character U+00AD",
+"input": "\u00AD",
+"output": [["Character", "\u00AD"]]},
+
+{"description": "Valid Unicode character U+00AE",
+"input": "\u00AE",
+"output": [["Character", "\u00AE"]]},
+
+{"description": "Valid Unicode character U+00AF",
+"input": "\u00AF",
+"output": [["Character", "\u00AF"]]},
+
+{"description": "Valid Unicode character U+00B0",
+"input": "\u00B0",
+"output": [["Character", "\u00B0"]]},
+
+{"description": "Valid Unicode character U+00B1",
+"input": "\u00B1",
+"output": [["Character", "\u00B1"]]},
+
+{"description": "Valid Unicode character U+00B2",
+"input": "\u00B2",
+"output": [["Character", "\u00B2"]]},
+
+{"description": "Valid Unicode character U+00B3",
+"input": "\u00B3",
+"output": [["Character", "\u00B3"]]},
+
+{"description": "Valid Unicode character U+00B4",
+"input": "\u00B4",
+"output": [["Character", "\u00B4"]]},
+
+{"description": "Valid Unicode character U+00B5",
+"input": "\u00B5",
+"output": [["Character", "\u00B5"]]},
+
+{"description": "Valid Unicode character U+00B6",
+"input": "\u00B6",
+"output": [["Character", "\u00B6"]]},
+
+{"description": "Valid Unicode character U+00B7",
+"input": "\u00B7",
+"output": [["Character", "\u00B7"]]},
+
+{"description": "Valid Unicode character U+00B8",
+"input": "\u00B8",
+"output": [["Character", "\u00B8"]]},
+
+{"description": "Valid Unicode character U+00B9",
+"input": "\u00B9",
+"output": [["Character", "\u00B9"]]},
+
+{"description": "Valid Unicode character U+00BA",
+"input": "\u00BA",
+"output": [["Character", "\u00BA"]]},
+
+{"description": "Valid Unicode character U+00BB",
+"input": "\u00BB",
+"output": [["Character", "\u00BB"]]},
+
+{"description": "Valid Unicode character U+00BC",
+"input": "\u00BC",
+"output": [["Character", "\u00BC"]]},
+
+{"description": "Valid Unicode character U+00BD",
+"input": "\u00BD",
+"output": [["Character", "\u00BD"]]},
+
+{"description": "Valid Unicode character U+00BE",
+"input": "\u00BE",
+"output": [["Character", "\u00BE"]]},
+
+{"description": "Valid Unicode character U+00BF",
+"input": "\u00BF",
+"output": [["Character", "\u00BF"]]},
+
+{"description": "Valid Unicode character U+00C0",
+"input": "\u00C0",
+"output": [["Character", "\u00C0"]]},
+
+{"description": "Valid Unicode character U+00C1",
+"input": "\u00C1",
+"output": [["Character", "\u00C1"]]},
+
+{"description": "Valid Unicode character U+00C2",
+"input": "\u00C2",
+"output": [["Character", "\u00C2"]]},
+
+{"description": "Valid Unicode character U+00C3",
+"input": "\u00C3",
+"output": [["Character", "\u00C3"]]},
+
+{"description": "Valid Unicode character U+00C4",
+"input": "\u00C4",
+"output": [["Character", "\u00C4"]]},
+
+{"description": "Valid Unicode character U+00C5",
+"input": "\u00C5",
+"output": [["Character", "\u00C5"]]},
+
+{"description": "Valid Unicode character U+00C6",
+"input": "\u00C6",
+"output": [["Character", "\u00C6"]]},
+
+{"description": "Valid Unicode character U+00C7",
+"input": "\u00C7",
+"output": [["Character", "\u00C7"]]},
+
+{"description": "Valid Unicode character U+00C8",
+"input": "\u00C8",
+"output": [["Character", "\u00C8"]]},
+
+{"description": "Valid Unicode character U+00C9",
+"input": "\u00C9",
+"output": [["Character", "\u00C9"]]},
+
+{"description": "Valid Unicode character U+00CA",
+"input": "\u00CA",
+"output": [["Character", "\u00CA"]]},
+
+{"description": "Valid Unicode character U+00CB",
+"input": "\u00CB",
+"output": [["Character", "\u00CB"]]},
+
+{"description": "Valid Unicode character U+00CC",
+"input": "\u00CC",
+"output": [["Character", "\u00CC"]]},
+
+{"description": "Valid Unicode character U+00CD",
+"input": "\u00CD",
+"output": [["Character", "\u00CD"]]},
+
+{"description": "Valid Unicode character U+00CE",
+"input": "\u00CE",
+"output": [["Character", "\u00CE"]]},
+
+{"description": "Valid Unicode character U+00CF",
+"input": "\u00CF",
+"output": [["Character", "\u00CF"]]},
+
+{"description": "Valid Unicode character U+00D0",
+"input": "\u00D0",
+"output": [["Character", "\u00D0"]]},
+
+{"description": "Valid Unicode character U+00D1",
+"input": "\u00D1",
+"output": [["Character", "\u00D1"]]},
+
+{"description": "Valid Unicode character U+00D2",
+"input": "\u00D2",
+"output": [["Character", "\u00D2"]]},
+
+{"description": "Valid Unicode character U+00D3",
+"input": "\u00D3",
+"output": [["Character", "\u00D3"]]},
+
+{"description": "Valid Unicode character U+00D4",
+"input": "\u00D4",
+"output": [["Character", "\u00D4"]]},
+
+{"description": "Valid Unicode character U+00D5",
+"input": "\u00D5",
+"output": [["Character", "\u00D5"]]},
+
+{"description": "Valid Unicode character U+00D6",
+"input": "\u00D6",
+"output": [["Character", "\u00D6"]]},
+
+{"description": "Valid Unicode character U+00D7",
+"input": "\u00D7",
+"output": [["Character", "\u00D7"]]},
+
+{"description": "Valid Unicode character U+00D8",
+"input": "\u00D8",
+"output": [["Character", "\u00D8"]]},
+
+{"description": "Valid Unicode character U+00D9",
+"input": "\u00D9",
+"output": [["Character", "\u00D9"]]},
+
+{"description": "Valid Unicode character U+00DA",
+"input": "\u00DA",
+"output": [["Character", "\u00DA"]]},
+
+{"description": "Valid Unicode character U+00DB",
+"input": "\u00DB",
+"output": [["Character", "\u00DB"]]},
+
+{"description": "Valid Unicode character U+00DC",
+"input": "\u00DC",
+"output": [["Character", "\u00DC"]]},
+
+{"description": "Valid Unicode character U+00DD",
+"input": "\u00DD",
+"output": [["Character", "\u00DD"]]},
+
+{"description": "Valid Unicode character U+00DE",
+"input": "\u00DE",
+"output": [["Character", "\u00DE"]]},
+
+{"description": "Valid Unicode character U+00DF",
+"input": "\u00DF",
+"output": [["Character", "\u00DF"]]},
+
+{"description": "Valid Unicode character U+00E0",
+"input": "\u00E0",
+"output": [["Character", "\u00E0"]]},
+
+{"description": "Valid Unicode character U+00E1",
+"input": "\u00E1",
+"output": [["Character", "\u00E1"]]},
+
+{"description": "Valid Unicode character U+00E2",
+"input": "\u00E2",
+"output": [["Character", "\u00E2"]]},
+
+{"description": "Valid Unicode character U+00E3",
+"input": "\u00E3",
+"output": [["Character", "\u00E3"]]},
+
+{"description": "Valid Unicode character U+00E4",
+"input": "\u00E4",
+"output": [["Character", "\u00E4"]]},
+
+{"description": "Valid Unicode character U+00E5",
+"input": "\u00E5",
+"output": [["Character", "\u00E5"]]},
+
+{"description": "Valid Unicode character U+00E6",
+"input": "\u00E6",
+"output": [["Character", "\u00E6"]]},
+
+{"description": "Valid Unicode character U+00E7",
+"input": "\u00E7",
+"output": [["Character", "\u00E7"]]},
+
+{"description": "Valid Unicode character U+00E8",
+"input": "\u00E8",
+"output": [["Character", "\u00E8"]]},
+
+{"description": "Valid Unicode character U+00E9",
+"input": "\u00E9",
+"output": [["Character", "\u00E9"]]},
+
+{"description": "Valid Unicode character U+00EA",
+"input": "\u00EA",
+"output": [["Character", "\u00EA"]]},
+
+{"description": "Valid Unicode character U+00EB",
+"input": "\u00EB",
+"output": [["Character", "\u00EB"]]},
+
+{"description": "Valid Unicode character U+00EC",
+"input": "\u00EC",
+"output": [["Character", "\u00EC"]]},
+
+{"description": "Valid Unicode character U+00ED",
+"input": "\u00ED",
+"output": [["Character", "\u00ED"]]},
+
+{"description": "Valid Unicode character U+00EE",
+"input": "\u00EE",
+"output": [["Character", "\u00EE"]]},
+
+{"description": "Valid Unicode character U+00EF",
+"input": "\u00EF",
+"output": [["Character", "\u00EF"]]},
+
+{"description": "Valid Unicode character U+00F0",
+"input": "\u00F0",
+"output": [["Character", "\u00F0"]]},
+
+{"description": "Valid Unicode character U+00F1",
+"input": "\u00F1",
+"output": [["Character", "\u00F1"]]},
+
+{"description": "Valid Unicode character U+00F2",
+"input": "\u00F2",
+"output": [["Character", "\u00F2"]]},
+
+{"description": "Valid Unicode character U+00F3",
+"input": "\u00F3",
+"output": [["Character", "\u00F3"]]},
+
+{"description": "Valid Unicode character U+00F4",
+"input": "\u00F4",
+"output": [["Character", "\u00F4"]]},
+
+{"description": "Valid Unicode character U+00F5",
+"input": "\u00F5",
+"output": [["Character", "\u00F5"]]},
+
+{"description": "Valid Unicode character U+00F6",
+"input": "\u00F6",
+"output": [["Character", "\u00F6"]]},
+
+{"description": "Valid Unicode character U+00F7",
+"input": "\u00F7",
+"output": [["Character", "\u00F7"]]},
+
+{"description": "Valid Unicode character U+00F8",
+"input": "\u00F8",
+"output": [["Character", "\u00F8"]]},
+
+{"description": "Valid Unicode character U+00F9",
+"input": "\u00F9",
+"output": [["Character", "\u00F9"]]},
+
+{"description": "Valid Unicode character U+00FA",
+"input": "\u00FA",
+"output": [["Character", "\u00FA"]]},
+
+{"description": "Valid Unicode character U+00FB",
+"input": "\u00FB",
+"output": [["Character", "\u00FB"]]},
+
+{"description": "Valid Unicode character U+00FC",
+"input": "\u00FC",
+"output": [["Character", "\u00FC"]]},
+
+{"description": "Valid Unicode character U+00FD",
+"input": "\u00FD",
+"output": [["Character", "\u00FD"]]},
+
+{"description": "Valid Unicode character U+00FE",
+"input": "\u00FE",
+"output": [["Character", "\u00FE"]]},
+
+{"description": "Valid Unicode character U+00FF",
+"input": "\u00FF",
+"output": [["Character", "\u00FF"]]},
+
+{"description": "Valid Unicode character U+D7FF",
+"input": "\uD7FF",
+"output": [["Character", "\uD7FF"]]},
+
+{"description": "Valid Unicode character U+E000",
+"input": "\uE000",
+"output": [["Character", "\uE000"]]},
+
+{"description": "Valid Unicode character U+FDCF",
+"input": "\uFDCF",
+"output": [["Character", "\uFDCF"]]},
+
+{"description": "Valid Unicode character U+FDF0",
+"input": "\uFDF0",
+"output": [["Character", "\uFDF0"]]},
+
+{"description": "Valid Unicode character U+FFFD",
+"input": "\uFFFD",
+"output": [["Character", "\uFFFD"]]},
+
+{"description": "Valid Unicode character U+10000",
+"input": "\uD800\uDC00",
+"output": [["Character", "\uD800\uDC00"]]},
+
+{"description": "Valid Unicode character U+1FFFD",
+"input": "\uD83F\uDFFD",
+"output": [["Character", "\uD83F\uDFFD"]]},
+
+{"description": "Valid Unicode character U+20000",
+"input": "\uD840\uDC00",
+"output": [["Character", "\uD840\uDC00"]]},
+
+{"description": "Valid Unicode character U+2FFFD",
+"input": "\uD87F\uDFFD",
+"output": [["Character", "\uD87F\uDFFD"]]},
+
+{"description": "Valid Unicode character U+30000",
+"input": "\uD880\uDC00",
+"output": [["Character", "\uD880\uDC00"]]},
+
+{"description": "Valid Unicode character U+3FFFD",
+"input": "\uD8BF\uDFFD",
+"output": [["Character", "\uD8BF\uDFFD"]]},
+
+{"description": "Valid Unicode character U+40000",
+"input": "\uD8C0\uDC00",
+"output": [["Character", "\uD8C0\uDC00"]]},
+
+{"description": "Valid Unicode character U+4FFFD",
+"input": "\uD8FF\uDFFD",
+"output": [["Character", "\uD8FF\uDFFD"]]},
+
+{"description": "Valid Unicode character U+50000",
+"input": "\uD900\uDC00",
+"output": [["Character", "\uD900\uDC00"]]},
+
+{"description": "Valid Unicode character U+5FFFD",
+"input": "\uD93F\uDFFD",
+"output": [["Character", "\uD93F\uDFFD"]]},
+
+{"description": "Valid Unicode character U+60000",
+"input": "\uD940\uDC00",
+"output": [["Character", "\uD940\uDC00"]]},
+
+{"description": "Valid Unicode character U+6FFFD",
+"input": "\uD97F\uDFFD",
+"output": [["Character", "\uD97F\uDFFD"]]},
+
+{"description": "Valid Unicode character U+70000",
+"input": "\uD980\uDC00",
+"output": [["Character", "\uD980\uDC00"]]},
+
+{"description": "Valid Unicode character U+7FFFD",
+"input": "\uD9BF\uDFFD",
+"output": [["Character", "\uD9BF\uDFFD"]]},
+
+{"description": "Valid Unicode character U+80000",
+"input": "\uD9C0\uDC00",
+"output": [["Character", "\uD9C0\uDC00"]]},
+
+{"description": "Valid Unicode character U+8FFFD",
+"input": "\uD9FF\uDFFD",
+"output": [["Character", "\uD9FF\uDFFD"]]},
+
+{"description": "Valid Unicode character U+90000",
+"input": "\uDA00\uDC00",
+"output": [["Character", "\uDA00\uDC00"]]},
+
+{"description": "Valid Unicode character U+9FFFD",
+"input": "\uDA3F\uDFFD",
+"output": [["Character", "\uDA3F\uDFFD"]]},
+
+{"description": "Valid Unicode character U+A0000",
+"input": "\uDA40\uDC00",
+"output": [["Character", "\uDA40\uDC00"]]},
+
+{"description": "Valid Unicode character U+AFFFD",
+"input": "\uDA7F\uDFFD",
+"output": [["Character", "\uDA7F\uDFFD"]]},
+
+{"description": "Valid Unicode character U+B0000",
+"input": "\uDA80\uDC00",
+"output": [["Character", "\uDA80\uDC00"]]},
+
+{"description": "Valid Unicode character U+BFFFD",
+"input": "\uDABF\uDFFD",
+"output": [["Character", "\uDABF\uDFFD"]]},
+
+{"description": "Valid Unicode character U+C0000",
+"input": "\uDAC0\uDC00",
+"output": [["Character", "\uDAC0\uDC00"]]},
+
+{"description": "Valid Unicode character U+CFFFD",
+"input": "\uDAFF\uDFFD",
+"output": [["Character", "\uDAFF\uDFFD"]]},
+
+{"description": "Valid Unicode character U+D0000",
+"input": "\uDB00\uDC00",
+"output": [["Character", "\uDB00\uDC00"]]},
+
+{"description": "Valid Unicode character U+DFFFD",
+"input": "\uDB3F\uDFFD",
+"output": [["Character", "\uDB3F\uDFFD"]]},
+
+{"description": "Valid Unicode character U+E0000",
+"input": "\uDB40\uDC00",
+"output": [["Character", "\uDB40\uDC00"]]},
+
+{"description": "Valid Unicode character U+EFFFD",
+"input": "\uDB7F\uDFFD",
+"output": [["Character", "\uDB7F\uDFFD"]]},
+
+{"description": "Valid Unicode character U+F0000",
+"input": "\uDB80\uDC00",
+"output": [["Character", "\uDB80\uDC00"]]},
+
+{"description": "Valid Unicode character U+FFFFD",
+"input": "\uDBBF\uDFFD",
+"output": [["Character", "\uDBBF\uDFFD"]]},
+
+{"description": "Valid Unicode character U+100000",
+"input": "\uDBC0\uDC00",
+"output": [["Character", "\uDBC0\uDC00"]]},
+
+{"description": "Valid Unicode character U+10FFFD",
+"input": "\uDBFF\uDFFD",
+"output": [["Character", "\uDBFF\uDFFD"]]}
+
+]}
diff --git a/mojo/public/dart/third_party/html/test/data/tokenizer/unicodeCharsProblematic.test b/mojo/public/dart/third_party/html/test/data/tokenizer/unicodeCharsProblematic.test
new file mode 100644
index 0000000..cf2fbe6
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tokenizer/unicodeCharsProblematic.test
@@ -0,0 +1,27 @@
+{"tests" : [
+{"description": "Invalid Unicode character U+DFFF",
+"doubleEscaped":true,
+"input": "\\uDFFF",
+"output":["ParseError", ["Character", "\\uFFFD"]]},
+
+{"description": "Invalid Unicode character U+D800",
+"doubleEscaped":true,
+"input": "\\uD800",
+"output":["ParseError", ["Character", "\\uFFFD"]]},
+
+{"description": "Invalid Unicode character U+DFFF with valid preceding character",
+"doubleEscaped":true,
+"input": "a\\uDFFF",
+"output":["ParseError", ["Character", "a\\uFFFD"]]},
+
+{"description": "Invalid Unicode character U+D800 with valid following character",
+"doubleEscaped":true,
+"input": "\\uD800a",
+"output":["ParseError", ["Character", "\\uFFFDa"]]},
+
+{"description":"CR followed by U+0000",
+"input":"\r\u0000",
+"output":[["Character", "\n"], "ParseError", ["Character", "\u0000"]],
+"ignoreErrorOrder":true}
+]
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/html/test/data/tokenizer/xmlViolation.test b/mojo/public/dart/third_party/html/test/data/tokenizer/xmlViolation.test
new file mode 100644
index 0000000..137d964
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tokenizer/xmlViolation.test
@@ -0,0 +1,22 @@
+{"xmlViolationTests": [
+
+{"description":"Non-XML character",
+"input":"a\uFFFFb",
+"ignoreErrorOrder":true,
+"output":["ParseError",["Character","a\uFFFDb"]]},
+
+{"description":"Non-XML space",
+"input":"a\u000Cb",
+"ignoreErrorOrder":true,
+"output":[["Character","a b"]]},
+
+{"description":"Double hyphen in comment",
+"input":"<!-- foo -- bar -->",
+"output":["ParseError",["Comment"," foo - - bar "]]},
+
+{"description":"FF between attributes",
+"input":"<a b=''\u000Cc=''>",
+"output":[["StartTag","a",{"b":"","c":""}]]}
+]}
+
+
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/adoption01.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/adoption01.dat
new file mode 100644
index 0000000..787e1b0
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/adoption01.dat
@@ -0,0 +1,194 @@
+#data
+<a><p></a></p>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|     <p>
+|       <a>
+
+#data
+<a>1<p>2</a>3</p>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       "1"
+|     <p>
+|       <a>
+|         "2"
+|       "3"
+
+#data
+<a>1<button>2</a>3</button>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       "1"
+|     <button>
+|       <a>
+|         "2"
+|       "3"
+
+#data
+<a>1<b>2</a>3</b>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       "1"
+|       <b>
+|         "2"
+|     <b>
+|       "3"
+
+#data
+<a>1<div>2<div>3</a>4</div>5</div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       "1"
+|     <div>
+|       <a>
+|         "2"
+|       <div>
+|         <a>
+|           "3"
+|         "4"
+|       "5"
+
+#data
+<table><a>1<p>2</a>3</p>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       "1"
+|     <p>
+|       <a>
+|         "2"
+|       "3"
+|     <table>
+
+#data
+<b><b><a><p></a>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <b>
+|         <a>
+|         <p>
+|           <a>
+
+#data
+<b><a><b><p></a>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <a>
+|         <b>
+|       <b>
+|         <p>
+|           <a>
+
+#data
+<a><b><b><p></a>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <b>
+|         <b>
+|     <b>
+|       <b>
+|         <p>
+|           <a>
+
+#data
+<p>1<s id="A">2<b id="B">3</p>4</s>5</b>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       "1"
+|       <s>
+|         id="A"
+|         "2"
+|         <b>
+|           id="B"
+|           "3"
+|     <s>
+|       id="A"
+|       <b>
+|         id="B"
+|         "4"
+|     <b>
+|       id="B"
+|       "5"
+
+#data
+<table><a>1<td>2</td>3</table>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       "1"
+|     <a>
+|       "3"
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "2"
+
+#data
+<table>A<td>B</td>C</table>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "AC"
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "B"
+
+#data
+<a><svg><tr><input></a>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <svg svg>
+|         <svg tr>
+|           <svg input>
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/adoption02.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/adoption02.dat
new file mode 100644
index 0000000..d18151b
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/adoption02.dat
@@ -0,0 +1,31 @@
+#data
+<b>1<i>2<p>3</b>4
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       "1"
+|       <i>
+|         "2"
+|     <i>
+|       <p>
+|         <b>
+|           "3"
+|         "4"
+
+#data
+<a><div><style></style><address><a>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|     <div>
+|       <a>
+|         <style>
+|       <address>
+|         <a>
+|         <a>
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/comments01.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/comments01.dat
new file mode 100644
index 0000000..44f1876
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/comments01.dat
@@ -0,0 +1,135 @@
+#data
+FOO<!-- BAR -->BAZ
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <!--  BAR  -->
+|     "BAZ"
+
+#data
+FOO<!-- BAR --!>BAZ
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <!--  BAR  -->
+|     "BAZ"
+
+#data
+FOO<!-- BAR --   >BAZ
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <!--  BAR --   >BAZ -->
+
+#data
+FOO<!-- BAR -- <QUX> -- MUX -->BAZ
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <!--  BAR -- <QUX> -- MUX  -->
+|     "BAZ"
+
+#data
+FOO<!-- BAR -- <QUX> -- MUX --!>BAZ
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <!--  BAR -- <QUX> -- MUX  -->
+|     "BAZ"
+
+#data
+FOO<!-- BAR -- <QUX> -- MUX -- >BAZ
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <!--  BAR -- <QUX> -- MUX -- >BAZ -->
+
+#data
+FOO<!---->BAZ
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <!--  -->
+|     "BAZ"
+
+#data
+FOO<!--->BAZ
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <!--  -->
+|     "BAZ"
+
+#data
+FOO<!-->BAZ
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <!--  -->
+|     "BAZ"
+
+#data
+<?xml version="1.0">Hi
+#errors
+#document
+| <!-- ?xml version="1.0" -->
+| <html>
+|   <head>
+|   <body>
+|     "Hi"
+
+#data
+<?xml version="1.0">
+#errors
+#document
+| <!-- ?xml version="1.0" -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<?xml version
+#errors
+#document
+| <!-- ?xml version -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+FOO<!----->BAZ
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <!-- - -->
+|     "BAZ"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/doctype01.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/doctype01.dat
new file mode 100644
index 0000000..ae45732
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/doctype01.dat
@@ -0,0 +1,370 @@
+#data
+<!DOCTYPE html>Hello
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!dOctYpE HtMl>Hello
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPEhtml>Hello
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE>Hello
+#errors
+#document
+| <!DOCTYPE >
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE >Hello
+#errors
+#document
+| <!DOCTYPE >
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato>Hello
+#errors
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato >Hello
+#errors
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato taco>Hello
+#errors
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato taco "ddd>Hello
+#errors
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato sYstEM>Hello
+#errors
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato sYstEM    >Hello
+#errors
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE   potato       sYstEM  ggg>Hello
+#errors
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato SYSTEM taco  >Hello
+#errors
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato SYSTEM 'taco"'>Hello
+#errors
+#document
+| <!DOCTYPE potato "" "taco"">
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato SYSTEM "taco">Hello
+#errors
+#document
+| <!DOCTYPE potato "" "taco">
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato SYSTEM "tai'co">Hello
+#errors
+#document
+| <!DOCTYPE potato "" "tai'co">
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato SYSTEMtaco "ddd">Hello
+#errors
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato grass SYSTEM taco>Hello
+#errors
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato pUbLIc>Hello
+#errors
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato pUbLIc >Hello
+#errors
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato pUbLIcgoof>Hello
+#errors
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato PUBLIC goof>Hello
+#errors
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato PUBLIC "go'of">Hello
+#errors
+#document
+| <!DOCTYPE potato "go'of" "">
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato PUBLIC 'go'of'>Hello
+#errors
+#document
+| <!DOCTYPE potato "go" "">
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato PUBLIC 'go:hh   of' >Hello
+#errors
+#document
+| <!DOCTYPE potato "go:hh   of" "">
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato PUBLIC "W3C-//dfdf" SYSTEM ggg>Hello
+#errors
+#document
+| <!DOCTYPE potato "W3C-//dfdf" "">
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+   "http://www.w3.org/TR/html4/strict.dtd">Hello
+#errors
+#document
+| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE ...>Hello
+#errors
+#document
+| <!DOCTYPE ...>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+#errors
+#document
+| <!DOCTYPE html "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
+#errors
+#document
+| <!DOCTYPE html "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE root-element [SYSTEM OR PUBLIC FPI] "uri" [ 
+<!-- internal declarations -->
+]>
+#errors
+#document
+| <!DOCTYPE root-element>
+| <html>
+|   <head>
+|   <body>
+|     "]>"
+
+#data
+<!DOCTYPE html PUBLIC
+  "-//WAPFORUM//DTD XHTML Mobile 1.0//EN"
+    "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
+#errors
+#document
+| <!DOCTYPE html "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE HTML SYSTEM "http://www.w3.org/DTD/HTML4-strict.dtd"><body><b>Mine!</b></body>
+#errors
+#document
+| <!DOCTYPE html "" "http://www.w3.org/DTD/HTML4-strict.dtd">
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       "Mine!"
+
+#data
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
+#errors
+#document
+| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"'http://www.w3.org/TR/html4/strict.dtd'>
+#errors
+#document
+| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01//EN"'http://www.w3.org/TR/html4/strict.dtd'>
+#errors
+#document
+| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE HTML PUBLIC'-//W3C//DTD HTML 4.01//EN''http://www.w3.org/TR/html4/strict.dtd'>
+#errors
+#document
+| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+| <html>
+|   <head>
+|   <body>
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/domjs-unsafe.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/domjs-unsafe.dat
new file mode 100644
index 0000000..905b94e
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/domjs-unsafe.dat
Binary files differ
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/entities01.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/entities01.dat
new file mode 100644
index 0000000..c8073b7
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/entities01.dat
@@ -0,0 +1,603 @@
+#data
+FOO&gt;BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO>BAR"
+
+#data
+FOO&gtBAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO>BAR"
+
+#data
+FOO&gt BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO> BAR"
+
+#data
+FOO&gt;;;BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO>;;BAR"
+
+#data
+I'm &notit; I tell you
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "I'm ¬it; I tell you"
+
+#data
+I'm &notin; I tell you
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "I'm ∉ I tell you"
+
+#data
+FOO& BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO& BAR"
+
+#data
+FOO&<BAR>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO&"
+|     <bar>
+
+#data
+FOO&&&&gt;BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO&&&>BAR"
+
+#data
+FOO&#41;BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO)BAR"
+
+#data
+FOO&#x41;BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOABAR"
+
+#data
+FOO&#X41;BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOABAR"
+
+#data
+FOO&#BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO&#BAR"
+
+#data
+FOO&#ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO&#ZOO"
+
+#data
+FOO&#xBAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOºR"
+
+#data
+FOO&#xZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO&#xZOO"
+
+#data
+FOO&#XZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO&#XZOO"
+
+#data
+FOO&#41BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO)BAR"
+
+#data
+FOO&#x41BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO䆺R"
+
+#data
+FOO&#x41ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOAZOO"
+
+#data
+FOO&#x0000;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO�ZOO"
+
+#data
+FOO&#x0078;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOxZOO"
+
+#data
+FOO&#x0079;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOyZOO"
+
+#data
+FOO&#x0080;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO€ZOO"
+
+#data
+FOO&#x0081;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOZOO"
+
+#data
+FOO&#x0082;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO‚ZOO"
+
+#data
+FOO&#x0083;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOƒZOO"
+
+#data
+FOO&#x0084;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO„ZOO"
+
+#data
+FOO&#x0085;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO…ZOO"
+
+#data
+FOO&#x0086;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO†ZOO"
+
+#data
+FOO&#x0087;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO‡ZOO"
+
+#data
+FOO&#x0088;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOˆZOO"
+
+#data
+FOO&#x0089;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO‰ZOO"
+
+#data
+FOO&#x008A;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOŠZOO"
+
+#data
+FOO&#x008B;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO‹ZOO"
+
+#data
+FOO&#x008C;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOŒZOO"
+
+#data
+FOO&#x008D;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOZOO"
+
+#data
+FOO&#x008E;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOŽZOO"
+
+#data
+FOO&#x008F;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOZOO"
+
+#data
+FOO&#x0090;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOZOO"
+
+#data
+FOO&#x0091;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO‘ZOO"
+
+#data
+FOO&#x0092;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO’ZOO"
+
+#data
+FOO&#x0093;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO“ZOO"
+
+#data
+FOO&#x0094;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO”ZOO"
+
+#data
+FOO&#x0095;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO•ZOO"
+
+#data
+FOO&#x0096;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO–ZOO"
+
+#data
+FOO&#x0097;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO—ZOO"
+
+#data
+FOO&#x0098;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO˜ZOO"
+
+#data
+FOO&#x0099;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO™ZOO"
+
+#data
+FOO&#x009A;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOšZOO"
+
+#data
+FOO&#x009B;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO›ZOO"
+
+#data
+FOO&#x009C;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOœZOO"
+
+#data
+FOO&#x009D;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOZOO"
+
+#data
+FOO&#x009E;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOžZOO"
+
+#data
+FOO&#x009F;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOŸZOO"
+
+#data
+FOO&#x00A0;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO ZOO"
+
+#data
+FOO&#xD7FF;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO퟿ZOO"
+
+#data
+FOO&#xD800;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO�ZOO"
+
+#data
+FOO&#xD801;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO�ZOO"
+
+#data
+FOO&#xDFFE;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO�ZOO"
+
+#data
+FOO&#xDFFF;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO�ZOO"
+
+#data
+FOO&#xE000;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOZOO"
+
+#data
+FOO&#x10FFFE;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO􏿾ZOO"
+
+#data
+FOO&#x1087D4;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO􈟔ZOO"
+
+#data
+FOO&#x10FFFF;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO􏿿ZOO"
+
+#data
+FOO&#x110000;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO�ZOO"
+
+#data
+FOO&#xFFFFFF;ZOO
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO�ZOO"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/entities02.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/entities02.dat
new file mode 100644
index 0000000..e2fb42a
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/entities02.dat
@@ -0,0 +1,249 @@
+#data
+<div bar="ZZ&gt;YY"></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ>YY"
+
+#data
+<div bar="ZZ&"></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&"
+
+#data
+<div bar='ZZ&'></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&"
+
+#data
+<div bar=ZZ&></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&"
+
+#data
+<div bar="ZZ&gt=YY"></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&gt=YY"
+
+#data
+<div bar="ZZ&gt0YY"></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&gt0YY"
+
+#data
+<div bar="ZZ&gt9YY"></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&gt9YY"
+
+#data
+<div bar="ZZ&gtaYY"></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&gtaYY"
+
+#data
+<div bar="ZZ&gtZYY"></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&gtZYY"
+
+#data
+<div bar="ZZ&gt YY"></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ> YY"
+
+#data
+<div bar="ZZ&gt"></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ>"
+
+#data
+<div bar='ZZ&gt'></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ>"
+
+#data
+<div bar=ZZ&gt></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ>"
+
+#data
+<div bar="ZZ&pound_id=23"></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ£_id=23"
+
+#data
+<div bar="ZZ&prod_id=23"></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&prod_id=23"
+
+#data
+<div bar="ZZ&pound;_id=23"></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ£_id=23"
+
+#data
+<div bar="ZZ&prod;_id=23"></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ∏_id=23"
+
+#data
+<div bar="ZZ&pound=23"></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&pound=23"
+
+#data
+<div bar="ZZ&prod=23"></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&prod=23"
+
+#data
+<div>ZZ&pound_id=23</div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "ZZ£_id=23"
+
+#data
+<div>ZZ&prod_id=23</div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "ZZ&prod_id=23"
+
+#data
+<div>ZZ&pound;_id=23</div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "ZZ£_id=23"
+
+#data
+<div>ZZ&prod;_id=23</div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "ZZ∏_id=23"
+
+#data
+<div>ZZ&pound=23</div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "ZZ£=23"
+
+#data
+<div>ZZ&prod=23</div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "ZZ&prod=23"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/html5test-com.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/html5test-com.dat
new file mode 100644
index 0000000..d7cb71d
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/html5test-com.dat
@@ -0,0 +1,246 @@
+#data
+<div<div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div<div>
+
+#data
+<div foo<bar=''>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       foo<bar=""
+
+#data
+<div foo=`bar`>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       foo="`bar`"
+
+#data
+<div \"foo=''>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       \"foo=""
+
+#data
+<a href='\nbar'></a>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       href="\nbar"
+
+#data
+<!DOCTYPE html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+
+#data
+&lang;&rang;
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "⟨⟩"
+
+#data
+&apos;
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "'"
+
+#data
+&ImaginaryI;
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "ⅈ"
+
+#data
+&Kopf;
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "𝕂"
+
+#data
+&notinva;
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "∉"
+
+#data
+<?import namespace="foo" implementation="#bar">
+#errors
+#document
+| <!-- ?import namespace="foo" implementation="#bar" -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!--foo--bar-->
+#errors
+#document
+| <!-- foo--bar -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<![CDATA[x]]>
+#errors
+#document
+| <!-- [CDATA[x]] -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<textarea><!--</textarea>--></textarea>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "<!--"
+|     "-->"
+
+#data
+<textarea><!--</textarea>-->
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "<!--"
+|     "-->"
+
+#data
+<style><!--</style>--></style>
+#errors
+#document
+| <html>
+|   <head>
+|     <style>
+|       "<!--"
+|   <body>
+|     "-->"
+
+#data
+<style><!--</style>-->
+#errors
+#document
+| <html>
+|   <head>
+|     <style>
+|       "<!--"
+|   <body>
+|     "-->"
+
+#data
+<ul><li>A </li> <li>B</li></ul>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ul>
+|       <li>
+|         "A "
+|       " "
+|       <li>
+|         "B"
+
+#data
+<table><form><input type=hidden><input></form><div></div></table>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <input>
+|     <div>
+|     <table>
+|       <form>
+|       <input>
+|         type="hidden"
+
+#data
+<i>A<b>B<p></i>C</b>D
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <i>
+|       "A"
+|       <b>
+|         "B"
+|     <b>
+|     <p>
+|       <b>
+|         <i>
+|         "C"
+|       "D"
+
+#data
+<div></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+
+#data
+<svg></svg>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+
+#data
+<math></math>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/inbody01.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/inbody01.dat
new file mode 100644
index 0000000..3f2bd37
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/inbody01.dat
@@ -0,0 +1,43 @@
+#data
+<button>1</foo>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <button>
+|       "1"
+
+#data
+<foo>1<p>2</foo>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <foo>
+|       "1"
+|       <p>
+|         "2"
+
+#data
+<dd>1</foo>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <dd>
+|       "1"
+
+#data
+<foo>1<dd>2</foo>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <foo>
+|       "1"
+|       <dd>
+|         "2"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/isindex.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/isindex.dat
new file mode 100644
index 0000000..88325ff
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/isindex.dat
@@ -0,0 +1,40 @@
+#data
+<isindex>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <form>
+|       <hr>
+|       <label>
+|         "This is a searchable index. Enter search keywords: "
+|         <input>
+|           name="isindex"
+|       <hr>
+
+#data
+<isindex name="A" action="B" prompt="C" foo="D">
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <form>
+|       action="B"
+|       <hr>
+|       <label>
+|         "C"
+|         <input>
+|           foo="D"
+|           name="isindex"
+|       <hr>
+
+#data
+<form><isindex>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <form>
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/pending-spec-changes-plain-text-unsafe.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/pending-spec-changes-plain-text-unsafe.dat
new file mode 100644
index 0000000..a5ebb1e
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/pending-spec-changes-plain-text-unsafe.dat
Binary files differ
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/pending-spec-changes.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/pending-spec-changes.dat
new file mode 100644
index 0000000..5a92084
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/pending-spec-changes.dat
@@ -0,0 +1,52 @@
+#data
+<input type="hidden"><frameset>
+#errors
+21: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”.
+31: “frameset” start tag seen.
+31: End of file seen and there were open elements.
+#document
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!DOCTYPE html><table><caption><svg>foo</table>bar
+#errors
+47: End tag “table” did not match the name of the current open element (“svg”).
+47: “table” closed but “caption” was still open.
+47: End tag “table” seen, but there were open elements.
+36: Unclosed element “svg”.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <svg svg>
+|           "foo"
+|     "bar"
+
+#data
+<table><tr><td><svg><desc><td></desc><circle>
+#errors
+7: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”.
+30: A table cell was implicitly closed, but there were open elements.
+26: Unclosed element “desc”.
+20: Unclosed element “svg”.
+37: Stray end tag “desc”.
+45: End of file seen and there were open elements.
+45: Unclosed element “circle”.
+7: Unclosed element “table”.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <svg svg>
+|               <svg desc>
+|           <td>
+|             <circle>
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/plain-text-unsafe.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/plain-text-unsafe.dat
new file mode 100644
index 0000000..04cc11f
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/plain-text-unsafe.dat
Binary files differ
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/scriptdata01.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/scriptdata01.dat
new file mode 100644
index 0000000..76b67f4
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/scriptdata01.dat
@@ -0,0 +1,308 @@
+#data
+FOO<script>'Hello'</script>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'Hello'"
+|     "BAR"
+
+#data
+FOO<script></script>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|     "BAR"
+
+#data
+FOO<script></script >BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|     "BAR"
+
+#data
+FOO<script></script/>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|     "BAR"
+
+#data
+FOO<script></script/ >BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|     "BAR"
+
+#data
+FOO<script type="text/plain"></scriptx>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       type="text/plain"
+|       "</scriptx>BAR"
+
+#data
+FOO<script></script foo=">" dd>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|     "BAR"
+
+#data
+FOO<script>'<'</script>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'<'"
+|     "BAR"
+
+#data
+FOO<script>'<!'</script>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'<!'"
+|     "BAR"
+
+#data
+FOO<script>'<!-'</script>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'<!-'"
+|     "BAR"
+
+#data
+FOO<script>'<!--'</script>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'<!--'"
+|     "BAR"
+
+#data
+FOO<script>'<!---'</script>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'<!---'"
+|     "BAR"
+
+#data
+FOO<script>'<!-->'</script>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'<!-->'"
+|     "BAR"
+
+#data
+FOO<script>'<!-->'</script>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'<!-->'"
+|     "BAR"
+
+#data
+FOO<script>'<!-- potato'</script>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'<!-- potato'"
+|     "BAR"
+
+#data
+FOO<script>'<!-- <sCrIpt'</script>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'<!-- <sCrIpt'"
+|     "BAR"
+
+#data
+FOO<script type="text/plain">'<!-- <sCrIpt>'</script>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       type="text/plain"
+|       "'<!-- <sCrIpt>'</script>BAR"
+
+#data
+FOO<script type="text/plain">'<!-- <sCrIpt> -'</script>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       type="text/plain"
+|       "'<!-- <sCrIpt> -'</script>BAR"
+
+#data
+FOO<script type="text/plain">'<!-- <sCrIpt> --'</script>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       type="text/plain"
+|       "'<!-- <sCrIpt> --'</script>BAR"
+
+#data
+FOO<script>'<!-- <sCrIpt> -->'</script>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'<!-- <sCrIpt> -->'"
+|     "BAR"
+
+#data
+FOO<script type="text/plain">'<!-- <sCrIpt> --!>'</script>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       type="text/plain"
+|       "'<!-- <sCrIpt> --!>'</script>BAR"
+
+#data
+FOO<script type="text/plain">'<!-- <sCrIpt> -- >'</script>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       type="text/plain"
+|       "'<!-- <sCrIpt> -- >'</script>BAR"
+
+#data
+FOO<script type="text/plain">'<!-- <sCrIpt '</script>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       type="text/plain"
+|       "'<!-- <sCrIpt '</script>BAR"
+
+#data
+FOO<script type="text/plain">'<!-- <sCrIpt/'</script>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       type="text/plain"
+|       "'<!-- <sCrIpt/'</script>BAR"
+
+#data
+FOO<script type="text/plain">'<!-- <sCrIpt\'</script>BAR
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       type="text/plain"
+|       "'<!-- <sCrIpt\'"
+|     "BAR"
+
+#data
+FOO<script type="text/plain">'<!-- <sCrIpt/'</script>BAR</script>QUX
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       type="text/plain"
+|       "'<!-- <sCrIpt/'</script>BAR"
+|     "QUX"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/scripted/adoption01.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/scripted/adoption01.dat
new file mode 100644
index 0000000..4e08d0e
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/scripted/adoption01.dat
@@ -0,0 +1,15 @@
+#data
+<p><b id="A"><script>document.getElementById("A").id = "B"</script></p>TEXT</b>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <b>
+|         id="B"
+|         <script>
+|           "document.getElementById("A").id = "B""
+|     <b>
+|       id="A"
+|       "TEXT"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/scripted/ark.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/scripted/ark.dat
new file mode 100644
index 0000000..acbac41
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/scripted/ark.dat
@@ -0,0 +1,26 @@
+#data
+<p><font size=4><font size=4><font size=4><script>document.getElementsByTagName("font")[2].setAttribute("size", "5");</script><font size=4><p>X
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <font>
+|         size="4"
+|         <font>
+|           size="4"
+|           <font>
+|             size="5"
+|             <script>
+|               "document.getElementsByTagName("font")[2].setAttribute("size", "5");"
+|             <font>
+|               size="4"
+|     <p>
+|       <font>
+|         size="4"
+|         <font>
+|           size="4"
+|           <font>
+|             size="4"
+|             "X"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/scripted/webkit01.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/scripted/webkit01.dat
new file mode 100644
index 0000000..ef4a41c
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/scripted/webkit01.dat
@@ -0,0 +1,28 @@
+#data
+1<script>document.write("2")</script>3
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "1"
+|     <script>
+|       "document.write("2")"
+|     "23"
+
+#data
+1<script>document.write("<script>document.write('2')</scr"+ "ipt><script>document.write('3')</scr" + "ipt>")</script>4
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "1"
+|     <script>
+|       "document.write("<script>document.write('2')</scr"+ "ipt><script>document.write('3')</scr" + "ipt>")"
+|     <script>
+|       "document.write('2')"
+|     "2"
+|     <script>
+|       "document.write('3')"
+|     "34"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tables01.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tables01.dat
new file mode 100644
index 0000000..c4b47e4
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tables01.dat
@@ -0,0 +1,212 @@
+#data
+<table><th>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <th>
+
+#data
+<table><td>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+
+#data
+<table><col foo='bar'>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <colgroup>
+|         <col>
+|           foo="bar"
+
+#data
+<table><colgroup></html>foo
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "foo"
+|     <table>
+|       <colgroup>
+
+#data
+<table></table><p>foo
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|     <p>
+|       "foo"
+
+#data
+<table></body></caption></col></colgroup></html></tbody></td></tfoot></th></thead></tr><td>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+
+#data
+<table><select><option>3</select></table>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+|         "3"
+|     <table>
+
+#data
+<table><select><table></table></select></table>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|     <table>
+|     <table>
+
+#data
+<table><select></table>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|     <table>
+
+#data
+<table><select><option>A<tr><td>B</td></tr></table>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+|         "A"
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "B"
+
+#data
+<table><td></body></caption></col></colgroup></html>foo
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "foo"
+
+#data
+<table><td>A</table>B
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "A"
+|     "B"
+
+#data
+<table><tr><caption>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|       <caption>
+
+#data
+<table><tr></body></caption></col></colgroup></html></td></th><td>foo
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "foo"
+
+#data
+<table><td><tr>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|         <tr>
+
+#data
+<table><td><button><td>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <button>
+|           <td>
+
+#data
+<table><tr><td><svg><desc><td>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <svg svg>
+|               <svg desc>
+|           <td>
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests1.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests1.dat
new file mode 100644
index 0000000..cbf8bdd
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests1.dat
@@ -0,0 +1,1952 @@
+#data
+Test
+#errors
+Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     "Test"
+
+#data
+<p>One<p>Two
+#errors
+Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       "One"
+|     <p>
+|       "Two"
+
+#data
+Line1<br>Line2<br>Line3<br>Line4
+#errors
+Line: 1 Col: 5 Unexpected non-space characters. Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     "Line1"
+|     <br>
+|     "Line2"
+|     <br>
+|     "Line3"
+|     <br>
+|     "Line4"
+
+#data
+<html>
+#errors
+Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<head>
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<body>
+#errors
+Line: 1 Col: 6 Unexpected start tag (body). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<html><head>
+#errors
+Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<html><head></head>
+#errors
+Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<html><head></head><body>
+#errors
+Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<html><head></head><body></body>
+#errors
+Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<html><head><body></body></html>
+#errors
+Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<html><head></body></html>
+#errors
+Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE.
+Line: 1 Col: 19 Unexpected end tag (body).
+Line: 1 Col: 26 Unexpected end tag (html).
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<html><head><body></html>
+#errors
+Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<html><body></html>
+#errors
+Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<body></html>
+#errors
+Line: 1 Col: 6 Unexpected start tag (body). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<head></html>
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+Line: 1 Col: 13 Unexpected end tag (html). Ignored.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+</head>
+#errors
+Line: 1 Col: 7 Unexpected end tag (head). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+</body>
+#errors
+Line: 1 Col: 7 Unexpected end tag (body). Expected DOCTYPE.
+Line: 1 Col: 7 Unexpected end tag (body) after the (implied) root element.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+</html>
+#errors
+Line: 1 Col: 7 Unexpected end tag (html). Expected DOCTYPE.
+Line: 1 Col: 7 Unexpected end tag (html) after the (implied) root element.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<b><table><td><i></table>
+#errors
+Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE.
+Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase.
+Line: 1 Col: 25 Got table cell end tag (td) while required end tags are missing.
+Line: 1 Col: 25 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <table>
+|         <tbody>
+|           <tr>
+|             <td>
+|               <i>
+
+#data
+<b><table><td></b><i></table>X
+#errors
+Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE.
+Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase.
+Line: 1 Col: 18 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 29 Got table cell end tag (td) while required end tags are missing.
+Line: 1 Col: 30 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <table>
+|         <tbody>
+|           <tr>
+|             <td>
+|               <i>
+|       "X"
+
+#data
+<h1>Hello<h2>World
+#errors
+4: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”.
+13: Heading cannot be a child of another heading.
+18: End of file seen and there were open elements.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <h1>
+|       "Hello"
+|     <h2>
+|       "World"
+
+#data
+<a><p>X<a>Y</a>Z</p></a>
+#errors
+Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE.
+Line: 1 Col: 10 Unexpected start tag (a) implies end tag (a).
+Line: 1 Col: 10 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 24 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|     <p>
+|       <a>
+|         "X"
+|       <a>
+|         "Y"
+|       "Z"
+
+#data
+<b><button>foo</b>bar
+#errors
+Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE.
+Line: 1 Col: 15 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|     <button>
+|       <b>
+|         "foo"
+|       "bar"
+
+#data
+<!DOCTYPE html><span><button>foo</span>bar
+#errors
+39: End tag “span” seen but there were unclosed elements.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <span>
+|       <button>
+|         "foobar"
+
+#data
+<p><b><div><marquee></p></b></div>X
+#errors
+Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE.
+Line: 1 Col: 11 Unexpected end tag (p). Ignored.
+Line: 1 Col: 24 Unexpected end tag (p). Ignored.
+Line: 1 Col: 28 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 34 End tag (div) seen too early. Expected other end tag.
+Line: 1 Col: 35 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <b>
+|     <div>
+|       <b>
+|         <marquee>
+|           <p>
+|           "X"
+
+#data
+<script><div></script></div><title><p></title><p><p>
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 28 Unexpected end tag (div). Ignored.
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<div>"
+|     <title>
+|       "<p>"
+|   <body>
+|     <p>
+|     <p>
+
+#data
+<!--><div>--<!-->
+#errors
+Line: 1 Col: 5 Incorrect comment.
+Line: 1 Col: 10 Unexpected start tag (div). Expected DOCTYPE.
+Line: 1 Col: 17 Incorrect comment.
+Line: 1 Col: 17 Expected closing tag. Unexpected end of file.
+#document
+| <!--  -->
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "--"
+|       <!--  -->
+
+#data
+<p><hr></p>
+#errors
+Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE.
+Line: 1 Col: 11 Unexpected end tag (p). Ignored.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <hr>
+|     <p>
+
+#data
+<select><b><option><select><option></b></select>X
+#errors
+Line: 1 Col: 8 Unexpected start tag (select). Expected DOCTYPE.
+Line: 1 Col: 11 Unexpected start tag token (b) in the select phase. Ignored.
+Line: 1 Col: 27 Unexpected select start tag in the select phase treated as select end tag.
+Line: 1 Col: 39 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 48 Unexpected end tag (select). Ignored.
+Line: 1 Col: 49 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+|     <option>
+|       "X"
+
+#data
+<a><table><td><a><table></table><a></tr><a></table><b>X</b>C<a>Y
+#errors
+Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE.
+Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase.
+Line: 1 Col: 35 Unexpected start tag (a) implies end tag (a).
+Line: 1 Col: 40 Got table cell end tag (td) while required end tags are missing.
+Line: 1 Col: 43 Unexpected start tag (a) in table context caused voodoo mode.
+Line: 1 Col: 43 Unexpected start tag (a) implies end tag (a).
+Line: 1 Col: 43 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 51 Unexpected implied end tag (a) in the table phase.
+Line: 1 Col: 63 Unexpected start tag (a) implies end tag (a).
+Line: 1 Col: 64 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <a>
+|       <table>
+|         <tbody>
+|           <tr>
+|             <td>
+|               <a>
+|                 <table>
+|               <a>
+|     <a>
+|       <b>
+|         "X"
+|       "C"
+|     <a>
+|       "Y"
+
+#data
+<a X>0<b>1<a Y>2
+#errors
+Line: 1 Col: 5 Unexpected start tag (a). Expected DOCTYPE.
+Line: 1 Col: 15 Unexpected start tag (a) implies end tag (a).
+Line: 1 Col: 15 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 16 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       x=""
+|       "0"
+|       <b>
+|         "1"
+|     <b>
+|       <a>
+|         y=""
+|         "2"
+
+#data
+<!-----><font><div>hello<table>excite!<b>me!<th><i>please!</tr><!--X-->
+#errors
+Line: 1 Col: 7 Unexpected '-' after '--' found in comment.
+Line: 1 Col: 14 Unexpected start tag (font). Expected DOCTYPE.
+Line: 1 Col: 38 Unexpected non-space characters in table context caused voodoo mode.
+Line: 1 Col: 41 Unexpected start tag (b) in table context caused voodoo mode.
+Line: 1 Col: 48 Unexpected implied end tag (b) in the table phase.
+Line: 1 Col: 48 Unexpected table cell start tag (th) in the table body phase.
+Line: 1 Col: 63 Got table cell end tag (th) while required end tags are missing.
+Line: 1 Col: 71 Unexpected end of file. Expected table content.
+#document
+| <!-- - -->
+| <html>
+|   <head>
+|   <body>
+|     <font>
+|       <div>
+|         "helloexcite!"
+|         <b>
+|           "me!"
+|         <table>
+|           <tbody>
+|             <tr>
+|               <th>
+|                 <i>
+|                   "please!"
+|             <!-- X -->
+
+#data
+<!DOCTYPE html><li>hello<li>world<ul>how<li>do</ul>you</body><!--do-->
+#errors
+Line: 1 Col: 61 Unexpected end tag (li). Missing end tag (body).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <li>
+|       "hello"
+|     <li>
+|       "world"
+|       <ul>
+|         "how"
+|         <li>
+|           "do"
+|       "you"
+|   <!-- do -->
+
+#data
+<!DOCTYPE html>A<option>B<optgroup>C<select>D</option>E
+#errors
+Line: 1 Col: 54 Unexpected end tag (option) in the select phase. Ignored.
+Line: 1 Col: 55 Expected closing tag. Unexpected end of file.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "A"
+|     <option>
+|       "B"
+|     <optgroup>
+|       "C"
+|       <select>
+|         "DE"
+
+#data
+<
+#errors
+Line: 1 Col: 1 Expected tag name. Got something else instead
+Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     "<"
+
+#data
+<#
+#errors
+Line: 1 Col: 1 Expected tag name. Got something else instead
+Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     "<#"
+
+#data
+</
+#errors
+Line: 1 Col: 2 Expected closing tag. Unexpected end of file.
+Line: 1 Col: 2 Unexpected non-space characters. Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     "</"
+
+#data
+</#
+#errors
+Line: 1 Col: 2 Expected closing tag. Unexpected character '#' found.
+Line: 1 Col: 3 Unexpected End of file. Expected DOCTYPE.
+#document
+| <!-- # -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<?
+#errors
+Line: 1 Col: 1 Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.)
+Line: 1 Col: 2 Unexpected End of file. Expected DOCTYPE.
+#document
+| <!-- ? -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<?#
+#errors
+Line: 1 Col: 1 Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.)
+Line: 1 Col: 3 Unexpected End of file. Expected DOCTYPE.
+#document
+| <!-- ?# -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!
+#errors
+Line: 1 Col: 2 Expected '--' or 'DOCTYPE'. Not found.
+Line: 1 Col: 2 Unexpected End of file. Expected DOCTYPE.
+#document
+| <!--  -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!#
+#errors
+Line: 1 Col: 3 Expected '--' or 'DOCTYPE'. Not found.
+Line: 1 Col: 3 Unexpected End of file. Expected DOCTYPE.
+#document
+| <!-- # -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<?COMMENT?>
+#errors
+Line: 1 Col: 1 Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.)
+Line: 1 Col: 11 Unexpected End of file. Expected DOCTYPE.
+#document
+| <!-- ?COMMENT? -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!COMMENT>
+#errors
+Line: 1 Col: 2 Expected '--' or 'DOCTYPE'. Not found.
+Line: 1 Col: 10 Unexpected End of file. Expected DOCTYPE.
+#document
+| <!-- COMMENT -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+</ COMMENT >
+#errors
+Line: 1 Col: 2 Expected closing tag. Unexpected character ' ' found.
+Line: 1 Col: 12 Unexpected End of file. Expected DOCTYPE.
+#document
+| <!--  COMMENT  -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<?COM--MENT?>
+#errors
+Line: 1 Col: 1 Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.)
+Line: 1 Col: 13 Unexpected End of file. Expected DOCTYPE.
+#document
+| <!-- ?COM--MENT? -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!COM--MENT>
+#errors
+Line: 1 Col: 2 Expected '--' or 'DOCTYPE'. Not found.
+Line: 1 Col: 12 Unexpected End of file. Expected DOCTYPE.
+#document
+| <!-- COM--MENT -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+</ COM--MENT >
+#errors
+Line: 1 Col: 2 Expected closing tag. Unexpected character ' ' found.
+Line: 1 Col: 14 Unexpected End of file. Expected DOCTYPE.
+#document
+| <!--  COM--MENT  -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><style> EOF
+#errors
+Line: 1 Col: 26 Unexpected end of file. Expected end tag (style).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <style>
+|       " EOF"
+|   <body>
+
+#data
+<!DOCTYPE html><script> <!-- </script> --> </script> EOF
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       " <!-- "
+|     " "
+|   <body>
+|     "-->  EOF"
+
+#data
+<b><p></b>TEST
+#errors
+Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE.
+Line: 1 Col: 10 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|     <p>
+|       <b>
+|       "TEST"
+
+#data
+<p id=a><b><p id=b></b>TEST
+#errors
+Line: 1 Col: 8 Unexpected start tag (p). Expected DOCTYPE.
+Line: 1 Col: 19 Unexpected end tag (p). Ignored.
+Line: 1 Col: 23 End tag (b) violates step 1, paragraph 2 of the adoption agency algorithm.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       id="a"
+|       <b>
+|     <p>
+|       id="b"
+|       "TEST"
+
+#data
+<b id=a><p><b id=b></p></b>TEST
+#errors
+Line: 1 Col: 8 Unexpected start tag (b). Expected DOCTYPE.
+Line: 1 Col: 23 Unexpected end tag (p). Ignored.
+Line: 1 Col: 27 End tag (b) violates step 1, paragraph 2 of the adoption agency algorithm.
+Line: 1 Col: 31 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       id="a"
+|       <p>
+|         <b>
+|           id="b"
+|       "TEST"
+
+#data
+<!DOCTYPE html><title>U-test</title><body><div><p>Test<u></p></div></body>
+#errors
+Line: 1 Col: 61 Unexpected end tag (p). Ignored.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <title>
+|       "U-test"
+|   <body>
+|     <div>
+|       <p>
+|         "Test"
+|         <u>
+
+#data
+<!DOCTYPE html><font><table></font></table></font>
+#errors
+Line: 1 Col: 35 Unexpected end tag (font) in table context caused voodoo mode.
+Line: 1 Col: 35 End tag (font) violates step 1, paragraph 1 of the adoption agency algorithm.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <font>
+|       <table>
+
+#data
+<font><p>hello<b>cruel</font>world
+#errors
+Line: 1 Col: 6 Unexpected start tag (font). Expected DOCTYPE.
+Line: 1 Col: 29 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 29 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 34 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <font>
+|     <p>
+|       <font>
+|         "hello"
+|         <b>
+|           "cruel"
+|       <b>
+|         "world"
+
+#data
+<b>Test</i>Test
+#errors
+Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE.
+Line: 1 Col: 11 End tag (i) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 15 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       "TestTest"
+
+#data
+<b>A<cite>B<div>C
+#errors
+Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE.
+Line: 1 Col: 17 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       "A"
+|       <cite>
+|         "B"
+|         <div>
+|           "C"
+
+#data
+<b>A<cite>B<div>C</cite>D
+#errors
+Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE.
+Line: 1 Col: 24 Unexpected end tag (cite). Ignored.
+Line: 1 Col: 25 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       "A"
+|       <cite>
+|         "B"
+|         <div>
+|           "CD"
+
+#data
+<b>A<cite>B<div>C</b>D
+#errors
+Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE.
+Line: 1 Col: 21 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 22 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       "A"
+|       <cite>
+|         "B"
+|     <div>
+|       <b>
+|         "C"
+|       "D"
+
+#data
+
+#errors
+Line: 1 Col: 0 Unexpected End of file. Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<DIV>
+#errors
+Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE.
+Line: 1 Col: 5 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+
+#data
+<DIV> abc
+#errors
+Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE.
+Line: 1 Col: 9 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc"
+
+#data
+<DIV> abc <B>
+#errors
+Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE.
+Line: 1 Col: 13 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+
+#data
+<DIV> abc <B> def
+#errors
+Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE.
+Line: 1 Col: 17 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def"
+
+#data
+<DIV> abc <B> def <I>
+#errors
+Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE.
+Line: 1 Col: 21 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def "
+|         <i>
+
+#data
+<DIV> abc <B> def <I> ghi
+#errors
+Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE.
+Line: 1 Col: 25 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def "
+|         <i>
+|           " ghi"
+
+#data
+<DIV> abc <B> def <I> ghi <P>
+#errors
+Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE.
+Line: 1 Col: 29 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def "
+|         <i>
+|           " ghi "
+|           <p>
+
+#data
+<DIV> abc <B> def <I> ghi <P> jkl
+#errors
+Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE.
+Line: 1 Col: 33 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def "
+|         <i>
+|           " ghi "
+|           <p>
+|             " jkl"
+
+#data
+<DIV> abc <B> def <I> ghi <P> jkl </B>
+#errors
+Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE.
+Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 38 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def "
+|         <i>
+|           " ghi "
+|       <i>
+|         <p>
+|           <b>
+|             " jkl "
+
+#data
+<DIV> abc <B> def <I> ghi <P> jkl </B> mno
+#errors
+Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE.
+Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 42 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def "
+|         <i>
+|           " ghi "
+|       <i>
+|         <p>
+|           <b>
+|             " jkl "
+|           " mno"
+
+#data
+<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I>
+#errors
+Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE.
+Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 47 End tag (i) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 47 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def "
+|         <i>
+|           " ghi "
+|       <i>
+|       <p>
+|         <i>
+|           <b>
+|             " jkl "
+|           " mno "
+
+#data
+<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr
+#errors
+Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE.
+Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 47 End tag (i) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 51 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def "
+|         <i>
+|           " ghi "
+|       <i>
+|       <p>
+|         <i>
+|           <b>
+|             " jkl "
+|           " mno "
+|         " pqr"
+
+#data
+<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr </P>
+#errors
+Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE.
+Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 47 End tag (i) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 56 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def "
+|         <i>
+|           " ghi "
+|       <i>
+|       <p>
+|         <i>
+|           <b>
+|             " jkl "
+|           " mno "
+|         " pqr "
+
+#data
+<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr </P> stu
+#errors
+Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE.
+Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 47 End tag (i) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 60 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def "
+|         <i>
+|           " ghi "
+|       <i>
+|       <p>
+|         <i>
+|           <b>
+|             " jkl "
+|           " mno "
+|         " pqr "
+|       " stu"
+
+#data
+<test attribute---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------->
+#errors
+Line: 1 Col: 1040 Unexpected start tag (test). Expected DOCTYPE.
+Line: 1 Col: 1040 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <test>
+|       attribute----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------=""
+
+#data
+<a href="blah">aba<table><a href="foo">br<tr><td></td></tr>x</table>aoe
+#errors
+Line: 1 Col: 15 Unexpected start tag (a). Expected DOCTYPE.
+Line: 1 Col: 39 Unexpected start tag (a) in table context caused voodoo mode.
+Line: 1 Col: 39 Unexpected start tag (a) implies end tag (a).
+Line: 1 Col: 39 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 45 Unexpected implied end tag (a) in the table phase.
+Line: 1 Col: 68 Unexpected implied end tag (a) in the table phase.
+Line: 1 Col: 71 Expected closing tag. Unexpected end of file.
+
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       href="blah"
+|       "aba"
+|       <a>
+|         href="foo"
+|         "br"
+|       <a>
+|         href="foo"
+|         "x"
+|       <table>
+|         <tbody>
+|           <tr>
+|             <td>
+|     <a>
+|       href="foo"
+|       "aoe"
+
+#data
+<a href="blah">aba<table><tr><td><a href="foo">br</td></tr>x</table>aoe
+#errors
+Line: 1 Col: 15 Unexpected start tag (a). Expected DOCTYPE.
+Line: 1 Col: 54 Got table cell end tag (td) while required end tags are missing.
+Line: 1 Col: 60 Unexpected non-space characters in table context caused voodoo mode.
+Line: 1 Col: 71 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       href="blah"
+|       "abax"
+|       <table>
+|         <tbody>
+|           <tr>
+|             <td>
+|               <a>
+|                 href="foo"
+|                 "br"
+|       "aoe"
+
+#data
+<table><a href="blah">aba<tr><td><a href="foo">br</td></tr>x</table>aoe
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 22 Unexpected start tag (a) in table context caused voodoo mode.
+Line: 1 Col: 29 Unexpected implied end tag (a) in the table phase.
+Line: 1 Col: 54 Got table cell end tag (td) while required end tags are missing.
+Line: 1 Col: 68 Unexpected implied end tag (a) in the table phase.
+Line: 1 Col: 71 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       href="blah"
+|       "aba"
+|     <a>
+|       href="blah"
+|       "x"
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <a>
+|               href="foo"
+|               "br"
+|     <a>
+|       href="blah"
+|       "aoe"
+
+#data
+<a href=a>aa<marquee>aa<a href=b>bb</marquee>aa
+#errors
+Line: 1 Col: 10 Unexpected start tag (a). Expected DOCTYPE.
+Line: 1 Col: 45 End tag (marquee) seen too early. Expected other end tag.
+Line: 1 Col: 47 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       href="a"
+|       "aa"
+|       <marquee>
+|         "aa"
+|         <a>
+|           href="b"
+|           "bb"
+|       "aa"
+
+#data
+<wbr><strike><code></strike><code><strike></code>
+#errors
+Line: 1 Col: 5 Unexpected start tag (wbr). Expected DOCTYPE.
+Line: 1 Col: 28 End tag (strike) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 49 Unexpected end tag (code). Ignored.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <wbr>
+|     <strike>
+|       <code>
+|     <code>
+|       <code>
+|         <strike>
+
+#data
+<!DOCTYPE html><spacer>foo
+#errors
+26: End of file seen and there were open elements.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <spacer>
+|       "foo"
+
+#data
+<title><meta></title><link><title><meta></title>
+#errors
+Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <title>
+|       "<meta>"
+|     <link>
+|     <title>
+|       "<meta>"
+|   <body>
+
+#data
+<style><!--</style><meta><script>--><link></script>
+#errors
+Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE.
+Line: 1 Col: 51 Unexpected end of file. Expected end tag (style).
+#document
+| <html>
+|   <head>
+|     <style>
+|       "<!--"
+|     <meta>
+|     <script>
+|       "--><link>"
+|   <body>
+
+#data
+<head><meta></head><link>
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+Line: 1 Col: 25 Unexpected start tag (link) that can be in head. Moved.
+#document
+| <html>
+|   <head>
+|     <meta>
+|     <link>
+|   <body>
+
+#data
+<table><tr><tr><td><td><span><th><span>X</table>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 33 Got table cell end tag (td) while required end tags are missing.
+Line: 1 Col: 48 Got table cell end tag (th) while required end tags are missing.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|         <tr>
+|           <td>
+|           <td>
+|             <span>
+|           <th>
+|             <span>
+|               "X"
+
+#data
+<body><body><base><link><meta><title><p></title><body><p></body>
+#errors
+Line: 1 Col: 6 Unexpected start tag (body). Expected DOCTYPE.
+Line: 1 Col: 12 Unexpected start tag (body).
+Line: 1 Col: 54 Unexpected start tag (body).
+Line: 1 Col: 64 Unexpected end tag (p). Missing end tag (body).
+#document
+| <html>
+|   <head>
+|   <body>
+|     <base>
+|     <link>
+|     <meta>
+|     <title>
+|       "<p>"
+|     <p>
+
+#data
+<textarea><p></textarea>
+#errors
+Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "<p>"
+
+#data
+<p><image></p>
+#errors
+Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE.
+Line: 1 Col: 10 Unexpected start tag (image). Treated as img.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <img>
+
+#data
+<a><table><a></table><p><a><div><a>
+#errors
+Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE.
+Line: 1 Col: 13 Unexpected start tag (a) in table context caused voodoo mode.
+Line: 1 Col: 13 Unexpected start tag (a) implies end tag (a).
+Line: 1 Col: 13 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 21 Unexpected end tag (table). Expected end tag (a).
+Line: 1 Col: 27 Unexpected start tag (a) implies end tag (a).
+Line: 1 Col: 27 End tag (a) violates step 1, paragraph 2 of the adoption agency algorithm.
+Line: 1 Col: 32 Unexpected end tag (p). Ignored.
+Line: 1 Col: 35 Unexpected start tag (a) implies end tag (a).
+Line: 1 Col: 35 End tag (a) violates step 1, paragraph 2 of the adoption agency algorithm.
+Line: 1 Col: 35 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <a>
+|       <table>
+|     <p>
+|       <a>
+|     <div>
+|       <a>
+
+#data
+<head></p><meta><p>
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+Line: 1 Col: 10 Unexpected end tag (p). Ignored.
+#document
+| <html>
+|   <head>
+|     <meta>
+|   <body>
+|     <p>
+
+#data
+<head></html><meta><p>
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+Line: 1 Col: 19 Unexpected start tag (meta).
+#document
+| <html>
+|   <head>
+|   <body>
+|     <meta>
+|     <p>
+
+#data
+<b><table><td><i></table>
+#errors
+Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE.
+Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase.
+Line: 1 Col: 25 Got table cell end tag (td) while required end tags are missing.
+Line: 1 Col: 25 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <table>
+|         <tbody>
+|           <tr>
+|             <td>
+|               <i>
+
+#data
+<b><table><td></b><i></table>
+#errors
+Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE.
+Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase.
+Line: 1 Col: 18 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 29 Got table cell end tag (td) while required end tags are missing.
+Line: 1 Col: 29 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <table>
+|         <tbody>
+|           <tr>
+|             <td>
+|               <i>
+
+#data
+<h1><h2>
+#errors
+4: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”.
+8: Heading cannot be a child of another heading.
+8: End of file seen and there were open elements.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <h1>
+|     <h2>
+
+#data
+<a><p><a></a></p></a>
+#errors
+Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE.
+Line: 1 Col: 9 Unexpected start tag (a) implies end tag (a).
+Line: 1 Col: 9 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 21 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|     <p>
+|       <a>
+|       <a>
+
+#data
+<b><button></b></button></b>
+#errors
+Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE.
+Line: 1 Col: 15 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|     <button>
+|       <b>
+
+#data
+<p><b><div><marquee></p></b></div>
+#errors
+Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE.
+Line: 1 Col: 11 Unexpected end tag (p). Ignored.
+Line: 1 Col: 24 Unexpected end tag (p). Ignored.
+Line: 1 Col: 28 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 34 End tag (div) seen too early. Expected other end tag.
+Line: 1 Col: 34 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <b>
+|     <div>
+|       <b>
+|         <marquee>
+|           <p>
+
+#data
+<script></script></div><title></title><p><p>
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 23 Unexpected end tag (div). Ignored.
+#document
+| <html>
+|   <head>
+|     <script>
+|     <title>
+|   <body>
+|     <p>
+|     <p>
+
+#data
+<p><hr></p>
+#errors
+Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE.
+Line: 1 Col: 11 Unexpected end tag (p). Ignored.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <hr>
+|     <p>
+
+#data
+<select><b><option><select><option></b></select>
+#errors
+Line: 1 Col: 8 Unexpected start tag (select). Expected DOCTYPE.
+Line: 1 Col: 11 Unexpected start tag token (b) in the select phase. Ignored.
+Line: 1 Col: 27 Unexpected select start tag in the select phase treated as select end tag.
+Line: 1 Col: 39 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 48 Unexpected end tag (select). Ignored.
+Line: 1 Col: 48 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+|     <option>
+
+#data
+<html><head><title></title><body></body></html>
+#errors
+Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <title>
+|   <body>
+
+#data
+<a><table><td><a><table></table><a></tr><a></table><a>
+#errors
+Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE.
+Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase.
+Line: 1 Col: 35 Unexpected start tag (a) implies end tag (a).
+Line: 1 Col: 40 Got table cell end tag (td) while required end tags are missing.
+Line: 1 Col: 43 Unexpected start tag (a) in table context caused voodoo mode.
+Line: 1 Col: 43 Unexpected start tag (a) implies end tag (a).
+Line: 1 Col: 43 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 51 Unexpected implied end tag (a) in the table phase.
+Line: 1 Col: 54 Unexpected start tag (a) implies end tag (a).
+Line: 1 Col: 54 End tag (a) violates step 1, paragraph 2 of the adoption agency algorithm.
+Line: 1 Col: 54 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <a>
+|       <table>
+|         <tbody>
+|           <tr>
+|             <td>
+|               <a>
+|                 <table>
+|               <a>
+|     <a>
+
+#data
+<ul><li></li><div><li></div><li><li><div><li><address><li><b><em></b><li></ul>
+#errors
+Line: 1 Col: 4 Unexpected start tag (ul). Expected DOCTYPE.
+Line: 1 Col: 45 Missing end tag (div, li).
+Line: 1 Col: 58 Missing end tag (address, li).
+Line: 1 Col: 69 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ul>
+|       <li>
+|       <div>
+|         <li>
+|       <li>
+|       <li>
+|         <div>
+|       <li>
+|         <address>
+|       <li>
+|         <b>
+|           <em>
+|       <li>
+
+#data
+<ul><li><ul></li><li>a</li></ul></li></ul>
+#errors
+XXX: fix me
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ul>
+|       <li>
+|         <ul>
+|           <li>
+|             "a"
+
+#data
+<frameset><frame><frameset><frame></frameset><noframes></noframes></frameset>
+#errors
+Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <frameset>
+|     <frame>
+|     <frameset>
+|       <frame>
+|     <noframes>
+
+#data
+<h1><table><td><h3></table><h3></h1>
+#errors
+4: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”.
+15: “td” start tag in table body.
+27: Unclosed elements.
+31: Heading cannot be a child of another heading.
+36: End tag “h1” seen but there were unclosed elements.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <h1>
+|       <table>
+|         <tbody>
+|           <tr>
+|             <td>
+|               <h3>
+|     <h3>
+
+#data
+<table><colgroup><col><colgroup><col><col><col><colgroup><col><col><thead><tr><td></table>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <colgroup>
+|         <col>
+|       <colgroup>
+|         <col>
+|         <col>
+|         <col>
+|       <colgroup>
+|         <col>
+|         <col>
+|       <thead>
+|         <tr>
+|           <td>
+
+#data
+<table><col><tbody><col><tr><col><td><col></table><col>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 37 Unexpected table cell start tag (td) in the table body phase.
+Line: 1 Col: 55 Unexpected start tag col. Ignored.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <colgroup>
+|         <col>
+|       <tbody>
+|       <colgroup>
+|         <col>
+|       <tbody>
+|         <tr>
+|       <colgroup>
+|         <col>
+|       <tbody>
+|         <tr>
+|           <td>
+|       <colgroup>
+|         <col>
+
+#data
+<table><colgroup><tbody><colgroup><tr><colgroup><td><colgroup></table><colgroup>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 52 Unexpected table cell start tag (td) in the table body phase.
+Line: 1 Col: 80 Unexpected start tag colgroup. Ignored.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <colgroup>
+|       <tbody>
+|       <colgroup>
+|       <tbody>
+|         <tr>
+|       <colgroup>
+|       <tbody>
+|         <tr>
+|           <td>
+|       <colgroup>
+
+#data
+</strong></b></em></i></u></strike></s></blink></tt></pre></big></small></font></select></h1></h2></h3></h4></h5></h6></body></br></a></img></title></span></style></script></table></th></td></tr></frame></area></link></param></hr></input></col></base></meta></basefont></bgsound></embed></spacer></p></dd></dt></caption></colgroup></tbody></tfoot></thead></address></blockquote></center></dir></div></dl></fieldset></listing></menu></ol></ul></li></nobr></wbr></form></button></marquee></object></html></frameset></head></iframe></image></isindex></noembed></noframes></noscript></optgroup></option></plaintext></textarea>
+#errors
+Line: 1 Col: 9 Unexpected end tag (strong). Expected DOCTYPE.
+Line: 1 Col: 9 Unexpected end tag (strong) after the (implied) root element.
+Line: 1 Col: 13 Unexpected end tag (b) after the (implied) root element.
+Line: 1 Col: 18 Unexpected end tag (em) after the (implied) root element.
+Line: 1 Col: 22 Unexpected end tag (i) after the (implied) root element.
+Line: 1 Col: 26 Unexpected end tag (u) after the (implied) root element.
+Line: 1 Col: 35 Unexpected end tag (strike) after the (implied) root element.
+Line: 1 Col: 39 Unexpected end tag (s) after the (implied) root element.
+Line: 1 Col: 47 Unexpected end tag (blink) after the (implied) root element.
+Line: 1 Col: 52 Unexpected end tag (tt) after the (implied) root element.
+Line: 1 Col: 58 Unexpected end tag (pre) after the (implied) root element.
+Line: 1 Col: 64 Unexpected end tag (big) after the (implied) root element.
+Line: 1 Col: 72 Unexpected end tag (small) after the (implied) root element.
+Line: 1 Col: 79 Unexpected end tag (font) after the (implied) root element.
+Line: 1 Col: 88 Unexpected end tag (select) after the (implied) root element.
+Line: 1 Col: 93 Unexpected end tag (h1) after the (implied) root element.
+Line: 1 Col: 98 Unexpected end tag (h2) after the (implied) root element.
+Line: 1 Col: 103 Unexpected end tag (h3) after the (implied) root element.
+Line: 1 Col: 108 Unexpected end tag (h4) after the (implied) root element.
+Line: 1 Col: 113 Unexpected end tag (h5) after the (implied) root element.
+Line: 1 Col: 118 Unexpected end tag (h6) after the (implied) root element.
+Line: 1 Col: 125 Unexpected end tag (body) after the (implied) root element.
+Line: 1 Col: 130 Unexpected end tag (br). Treated as br element.
+Line: 1 Col: 134 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 140 This element (img) has no end tag.
+Line: 1 Col: 148 Unexpected end tag (title). Ignored.
+Line: 1 Col: 155 Unexpected end tag (span). Ignored.
+Line: 1 Col: 163 Unexpected end tag (style). Ignored.
+Line: 1 Col: 172 Unexpected end tag (script). Ignored.
+Line: 1 Col: 180 Unexpected end tag (table). Ignored.
+Line: 1 Col: 185 Unexpected end tag (th). Ignored.
+Line: 1 Col: 190 Unexpected end tag (td). Ignored.
+Line: 1 Col: 195 Unexpected end tag (tr). Ignored.
+Line: 1 Col: 203 This element (frame) has no end tag.
+Line: 1 Col: 210 This element (area) has no end tag.
+Line: 1 Col: 217 Unexpected end tag (link). Ignored.
+Line: 1 Col: 225 This element (param) has no end tag.
+Line: 1 Col: 230 This element (hr) has no end tag.
+Line: 1 Col: 238 This element (input) has no end tag.
+Line: 1 Col: 244 Unexpected end tag (col). Ignored.
+Line: 1 Col: 251 Unexpected end tag (base). Ignored.
+Line: 1 Col: 258 Unexpected end tag (meta). Ignored.
+Line: 1 Col: 269 This element (basefont) has no end tag.
+Line: 1 Col: 279 This element (bgsound) has no end tag.
+Line: 1 Col: 287 This element (embed) has no end tag.
+Line: 1 Col: 296 This element (spacer) has no end tag.
+Line: 1 Col: 300 Unexpected end tag (p). Ignored.
+Line: 1 Col: 305 End tag (dd) seen too early. Expected other end tag.
+Line: 1 Col: 310 End tag (dt) seen too early. Expected other end tag.
+Line: 1 Col: 320 Unexpected end tag (caption). Ignored.
+Line: 1 Col: 331 Unexpected end tag (colgroup). Ignored.
+Line: 1 Col: 339 Unexpected end tag (tbody). Ignored.
+Line: 1 Col: 347 Unexpected end tag (tfoot). Ignored.
+Line: 1 Col: 355 Unexpected end tag (thead). Ignored.
+Line: 1 Col: 365 End tag (address) seen too early. Expected other end tag.
+Line: 1 Col: 378 End tag (blockquote) seen too early. Expected other end tag.
+Line: 1 Col: 387 End tag (center) seen too early. Expected other end tag.
+Line: 1 Col: 393 Unexpected end tag (dir). Ignored.
+Line: 1 Col: 399 End tag (div) seen too early. Expected other end tag.
+Line: 1 Col: 404 End tag (dl) seen too early. Expected other end tag.
+Line: 1 Col: 415 End tag (fieldset) seen too early. Expected other end tag.
+Line: 1 Col: 425 End tag (listing) seen too early. Expected other end tag.
+Line: 1 Col: 432 End tag (menu) seen too early. Expected other end tag.
+Line: 1 Col: 437 End tag (ol) seen too early. Expected other end tag.
+Line: 1 Col: 442 End tag (ul) seen too early. Expected other end tag.
+Line: 1 Col: 447 End tag (li) seen too early. Expected other end tag.
+Line: 1 Col: 454 End tag (nobr) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 460 This element (wbr) has no end tag.
+Line: 1 Col: 476 End tag (button) seen too early. Expected other end tag.
+Line: 1 Col: 486 End tag (marquee) seen too early. Expected other end tag.
+Line: 1 Col: 495 End tag (object) seen too early. Expected other end tag.
+Line: 1 Col: 513 Unexpected end tag (html). Ignored.
+Line: 1 Col: 513 Unexpected end tag (frameset). Ignored.
+Line: 1 Col: 520 Unexpected end tag (head). Ignored.
+Line: 1 Col: 529 Unexpected end tag (iframe). Ignored.
+Line: 1 Col: 537 This element (image) has no end tag.
+Line: 1 Col: 547 This element (isindex) has no end tag.
+Line: 1 Col: 557 Unexpected end tag (noembed). Ignored.
+Line: 1 Col: 568 Unexpected end tag (noframes). Ignored.
+Line: 1 Col: 579 Unexpected end tag (noscript). Ignored.
+Line: 1 Col: 590 Unexpected end tag (optgroup). Ignored.
+Line: 1 Col: 599 Unexpected end tag (option). Ignored.
+Line: 1 Col: 611 Unexpected end tag (plaintext). Ignored.
+Line: 1 Col: 622 Unexpected end tag (textarea). Ignored.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <br>
+|     <p>
+
+#data
+<table><tr></strong></b></em></i></u></strike></s></blink></tt></pre></big></small></font></select></h1></h2></h3></h4></h5></h6></body></br></a></img></title></span></style></script></table></th></td></tr></frame></area></link></param></hr></input></col></base></meta></basefont></bgsound></embed></spacer></p></dd></dt></caption></colgroup></tbody></tfoot></thead></address></blockquote></center></dir></div></dl></fieldset></listing></menu></ol></ul></li></nobr></wbr></form></button></marquee></object></html></frameset></head></iframe></image></isindex></noembed></noframes></noscript></optgroup></option></plaintext></textarea>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 20 Unexpected end tag (strong) in table context caused voodoo mode.
+Line: 1 Col: 20 End tag (strong) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 24 Unexpected end tag (b) in table context caused voodoo mode.
+Line: 1 Col: 24 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 29 Unexpected end tag (em) in table context caused voodoo mode.
+Line: 1 Col: 29 End tag (em) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 33 Unexpected end tag (i) in table context caused voodoo mode.
+Line: 1 Col: 33 End tag (i) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 37 Unexpected end tag (u) in table context caused voodoo mode.
+Line: 1 Col: 37 End tag (u) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 46 Unexpected end tag (strike) in table context caused voodoo mode.
+Line: 1 Col: 46 End tag (strike) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 50 Unexpected end tag (s) in table context caused voodoo mode.
+Line: 1 Col: 50 End tag (s) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 58 Unexpected end tag (blink) in table context caused voodoo mode.
+Line: 1 Col: 58 Unexpected end tag (blink). Ignored.
+Line: 1 Col: 63 Unexpected end tag (tt) in table context caused voodoo mode.
+Line: 1 Col: 63 End tag (tt) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 69 Unexpected end tag (pre) in table context caused voodoo mode.
+Line: 1 Col: 69 End tag (pre) seen too early. Expected other end tag.
+Line: 1 Col: 75 Unexpected end tag (big) in table context caused voodoo mode.
+Line: 1 Col: 75 End tag (big) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 83 Unexpected end tag (small) in table context caused voodoo mode.
+Line: 1 Col: 83 End tag (small) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 90 Unexpected end tag (font) in table context caused voodoo mode.
+Line: 1 Col: 90 End tag (font) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 99 Unexpected end tag (select) in table context caused voodoo mode.
+Line: 1 Col: 99 Unexpected end tag (select). Ignored.
+Line: 1 Col: 104 Unexpected end tag (h1) in table context caused voodoo mode.
+Line: 1 Col: 104 End tag (h1) seen too early. Expected other end tag.
+Line: 1 Col: 109 Unexpected end tag (h2) in table context caused voodoo mode.
+Line: 1 Col: 109 End tag (h2) seen too early. Expected other end tag.
+Line: 1 Col: 114 Unexpected end tag (h3) in table context caused voodoo mode.
+Line: 1 Col: 114 End tag (h3) seen too early. Expected other end tag.
+Line: 1 Col: 119 Unexpected end tag (h4) in table context caused voodoo mode.
+Line: 1 Col: 119 End tag (h4) seen too early. Expected other end tag.
+Line: 1 Col: 124 Unexpected end tag (h5) in table context caused voodoo mode.
+Line: 1 Col: 124 End tag (h5) seen too early. Expected other end tag.
+Line: 1 Col: 129 Unexpected end tag (h6) in table context caused voodoo mode.
+Line: 1 Col: 129 End tag (h6) seen too early. Expected other end tag.
+Line: 1 Col: 136 Unexpected end tag (body) in the table row phase. Ignored.
+Line: 1 Col: 141 Unexpected end tag (br) in table context caused voodoo mode.
+Line: 1 Col: 141 Unexpected end tag (br). Treated as br element.
+Line: 1 Col: 145 Unexpected end tag (a) in table context caused voodoo mode.
+Line: 1 Col: 145 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 151 Unexpected end tag (img) in table context caused voodoo mode.
+Line: 1 Col: 151 This element (img) has no end tag.
+Line: 1 Col: 159 Unexpected end tag (title) in table context caused voodoo mode.
+Line: 1 Col: 159 Unexpected end tag (title). Ignored.
+Line: 1 Col: 166 Unexpected end tag (span) in table context caused voodoo mode.
+Line: 1 Col: 166 Unexpected end tag (span). Ignored.
+Line: 1 Col: 174 Unexpected end tag (style) in table context caused voodoo mode.
+Line: 1 Col: 174 Unexpected end tag (style). Ignored.
+Line: 1 Col: 183 Unexpected end tag (script) in table context caused voodoo mode.
+Line: 1 Col: 183 Unexpected end tag (script). Ignored.
+Line: 1 Col: 196 Unexpected end tag (th). Ignored.
+Line: 1 Col: 201 Unexpected end tag (td). Ignored.
+Line: 1 Col: 206 Unexpected end tag (tr). Ignored.
+Line: 1 Col: 214 This element (frame) has no end tag.
+Line: 1 Col: 221 This element (area) has no end tag.
+Line: 1 Col: 228 Unexpected end tag (link). Ignored.
+Line: 1 Col: 236 This element (param) has no end tag.
+Line: 1 Col: 241 This element (hr) has no end tag.
+Line: 1 Col: 249 This element (input) has no end tag.
+Line: 1 Col: 255 Unexpected end tag (col). Ignored.
+Line: 1 Col: 262 Unexpected end tag (base). Ignored.
+Line: 1 Col: 269 Unexpected end tag (meta). Ignored.
+Line: 1 Col: 280 This element (basefont) has no end tag.
+Line: 1 Col: 290 This element (bgsound) has no end tag.
+Line: 1 Col: 298 This element (embed) has no end tag.
+Line: 1 Col: 307 This element (spacer) has no end tag.
+Line: 1 Col: 311 Unexpected end tag (p). Ignored.
+Line: 1 Col: 316 End tag (dd) seen too early. Expected other end tag.
+Line: 1 Col: 321 End tag (dt) seen too early. Expected other end tag.
+Line: 1 Col: 331 Unexpected end tag (caption). Ignored.
+Line: 1 Col: 342 Unexpected end tag (colgroup). Ignored.
+Line: 1 Col: 350 Unexpected end tag (tbody). Ignored.
+Line: 1 Col: 358 Unexpected end tag (tfoot). Ignored.
+Line: 1 Col: 366 Unexpected end tag (thead). Ignored.
+Line: 1 Col: 376 End tag (address) seen too early. Expected other end tag.
+Line: 1 Col: 389 End tag (blockquote) seen too early. Expected other end tag.
+Line: 1 Col: 398 End tag (center) seen too early. Expected other end tag.
+Line: 1 Col: 404 Unexpected end tag (dir). Ignored.
+Line: 1 Col: 410 End tag (div) seen too early. Expected other end tag.
+Line: 1 Col: 415 End tag (dl) seen too early. Expected other end tag.
+Line: 1 Col: 426 End tag (fieldset) seen too early. Expected other end tag.
+Line: 1 Col: 436 End tag (listing) seen too early. Expected other end tag.
+Line: 1 Col: 443 End tag (menu) seen too early. Expected other end tag.
+Line: 1 Col: 448 End tag (ol) seen too early. Expected other end tag.
+Line: 1 Col: 453 End tag (ul) seen too early. Expected other end tag.
+Line: 1 Col: 458 End tag (li) seen too early. Expected other end tag.
+Line: 1 Col: 465 End tag (nobr) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 471 This element (wbr) has no end tag.
+Line: 1 Col: 487 End tag (button) seen too early. Expected other end tag.
+Line: 1 Col: 497 End tag (marquee) seen too early. Expected other end tag.
+Line: 1 Col: 506 End tag (object) seen too early. Expected other end tag.
+Line: 1 Col: 524 Unexpected end tag (html). Ignored.
+Line: 1 Col: 524 Unexpected end tag (frameset). Ignored.
+Line: 1 Col: 531 Unexpected end tag (head). Ignored.
+Line: 1 Col: 540 Unexpected end tag (iframe). Ignored.
+Line: 1 Col: 548 This element (image) has no end tag.
+Line: 1 Col: 558 This element (isindex) has no end tag.
+Line: 1 Col: 568 Unexpected end tag (noembed). Ignored.
+Line: 1 Col: 579 Unexpected end tag (noframes). Ignored.
+Line: 1 Col: 590 Unexpected end tag (noscript). Ignored.
+Line: 1 Col: 601 Unexpected end tag (optgroup). Ignored.
+Line: 1 Col: 610 Unexpected end tag (option). Ignored.
+Line: 1 Col: 622 Unexpected end tag (plaintext). Ignored.
+Line: 1 Col: 633 Unexpected end tag (textarea). Ignored.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <br>
+|     <table>
+|       <tbody>
+|         <tr>
+|     <p>
+
+#data
+<frameset>
+#errors
+Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE.
+Line: 1 Col: 10 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <frameset>
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests10.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests10.dat
new file mode 100644
index 0000000..4f8df86
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests10.dat
@@ -0,0 +1,799 @@
+#data
+<!DOCTYPE html><svg></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+
+#data
+<!DOCTYPE html><svg></svg><![CDATA[a]]>
+#errors
+29: Bogus comment
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|     <!-- [CDATA[a]] -->
+
+#data
+<!DOCTYPE html><body><svg></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+
+#data
+<!DOCTYPE html><body><select><svg></svg></select>
+#errors
+35: Stray “svg” start tag.
+42: Stray end tag “svg”
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!DOCTYPE html><body><select><option><svg></svg></option></select>
+#errors
+43: Stray “svg” start tag.
+50: Stray end tag “svg”
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+
+#data
+<!DOCTYPE html><body><table><svg></svg></table>
+#errors
+34: Start tag “svg” seen in “table”.
+41: Stray end tag “svg”.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|     <table>
+
+#data
+<!DOCTYPE html><body><table><svg><g>foo</g></svg></table>
+#errors
+34: Start tag “svg” seen in “table”.
+46: Stray end tag “g”.
+53: Stray end tag “svg”.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg g>
+|         "foo"
+|     <table>
+
+#data
+<!DOCTYPE html><body><table><svg><g>foo</g><g>bar</g></svg></table>
+#errors
+34: Start tag “svg” seen in “table”.
+46: Stray end tag “g”.
+58: Stray end tag “g”.
+65: Stray end tag “svg”.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg g>
+|         "foo"
+|       <svg g>
+|         "bar"
+|     <table>
+
+#data
+<!DOCTYPE html><body><table><tbody><svg><g>foo</g><g>bar</g></svg></tbody></table>
+#errors
+41: Start tag “svg” seen in “table”.
+53: Stray end tag “g”.
+65: Stray end tag “g”.
+72: Stray end tag “svg”.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg g>
+|         "foo"
+|       <svg g>
+|         "bar"
+|     <table>
+|       <tbody>
+
+#data
+<!DOCTYPE html><body><table><tbody><tr><svg><g>foo</g><g>bar</g></svg></tr></tbody></table>
+#errors
+45: Start tag “svg” seen in “table”.
+57: Stray end tag “g”.
+69: Stray end tag “g”.
+76: Stray end tag “svg”.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg g>
+|         "foo"
+|       <svg g>
+|         "bar"
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<!DOCTYPE html><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg></td></tr></tbody></table>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <svg svg>
+|               <svg g>
+|                 "foo"
+|               <svg g>
+|                 "bar"
+
+#data
+<!DOCTYPE html><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg><p>baz</td></tr></tbody></table>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <svg svg>
+|               <svg g>
+|                 "foo"
+|               <svg g>
+|                 "bar"
+|             <p>
+|               "baz"
+
+#data
+<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g></svg><p>baz</caption></table>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <svg svg>
+|           <svg g>
+|             "foo"
+|           <svg g>
+|             "bar"
+|         <p>
+|           "baz"
+
+#data
+<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g><p>baz</table><p>quux
+#errors
+70: HTML start tag “p” in a foreign namespace context.
+81: “table” closed but “caption” was still open.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <svg svg>
+|           <svg g>
+|             "foo"
+|           <svg g>
+|             "bar"
+|         <p>
+|           "baz"
+|     <p>
+|       "quux"
+
+#data
+<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g>baz</table><p>quux
+#errors
+78: “table” closed but “caption” was still open.
+78: Unclosed elements on stack.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <svg svg>
+|           <svg g>
+|             "foo"
+|           <svg g>
+|             "bar"
+|           "baz"
+|     <p>
+|       "quux"
+
+#data
+<!DOCTYPE html><body><table><colgroup><svg><g>foo</g><g>bar</g><p>baz</table><p>quux
+#errors
+44: Start tag “svg” seen in “table”.
+56: Stray end tag “g”.
+68: Stray end tag “g”.
+71: HTML start tag “p” in a foreign namespace context.
+71: Start tag “p” seen in “table”.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg g>
+|         "foo"
+|       <svg g>
+|         "bar"
+|     <p>
+|       "baz"
+|     <table>
+|       <colgroup>
+|     <p>
+|       "quux"
+
+#data
+<!DOCTYPE html><body><table><tr><td><select><svg><g>foo</g><g>bar</g><p>baz</table><p>quux
+#errors
+50: Stray “svg” start tag.
+54: Stray “g” start tag.
+62: Stray end tag “g”
+66: Stray “g” start tag.
+74: Stray end tag “g”
+77: Stray “p” start tag.
+88: “table” end tag with “select” open.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <select>
+|               "foobarbaz"
+|     <p>
+|       "quux"
+
+#data
+<!DOCTYPE html><body><table><select><svg><g>foo</g><g>bar</g><p>baz</table><p>quux
+#errors
+36: Start tag “select” seen in “table”.
+42: Stray “svg” start tag.
+46: Stray “g” start tag.
+54: Stray end tag “g”
+58: Stray “g” start tag.
+66: Stray end tag “g”
+69: Stray “p” start tag.
+80: “table” end tag with “select” open.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       "foobarbaz"
+|     <table>
+|     <p>
+|       "quux"
+
+#data
+<!DOCTYPE html><body></body></html><svg><g>foo</g><g>bar</g><p>baz
+#errors
+41: Stray “svg” start tag.
+68: HTML start tag “p” in a foreign namespace context.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg g>
+|         "foo"
+|       <svg g>
+|         "bar"
+|     <p>
+|       "baz"
+
+#data
+<!DOCTYPE html><body></body><svg><g>foo</g><g>bar</g><p>baz
+#errors
+34: Stray “svg” start tag.
+61: HTML start tag “p” in a foreign namespace context.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg g>
+|         "foo"
+|       <svg g>
+|         "bar"
+|     <p>
+|       "baz"
+
+#data
+<!DOCTYPE html><frameset><svg><g></g><g></g><p><span>
+#errors
+31: Stray “svg” start tag.
+35: Stray “g” start tag.
+40: Stray end tag “g”
+44: Stray “g” start tag.
+49: Stray end tag “g”
+52: Stray “p” start tag.
+58: Stray “span” start tag.
+58: End of file seen and there were open elements.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!DOCTYPE html><frameset></frameset><svg><g></g><g></g><p><span>
+#errors
+42: Stray “svg” start tag.
+46: Stray “g” start tag.
+51: Stray end tag “g”
+55: Stray “g” start tag.
+60: Stray end tag “g”
+63: Stray “p” start tag.
+69: Stray “span” start tag.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!DOCTYPE html><body xlink:href=foo><svg xlink:href=foo></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     xlink:href="foo"
+|     <svg svg>
+|       xlink href="foo"
+
+#data
+<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo></g></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     xlink:href="foo"
+|     xml:lang="en"
+|     <svg svg>
+|       <svg g>
+|         xlink href="foo"
+|         xml lang="en"
+
+#data
+<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo /></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     xlink:href="foo"
+|     xml:lang="en"
+|     <svg svg>
+|       <svg g>
+|         xlink href="foo"
+|         xml lang="en"
+
+#data
+<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo />bar</svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     xlink:href="foo"
+|     xml:lang="en"
+|     <svg svg>
+|       <svg g>
+|         xlink href="foo"
+|         xml lang="en"
+|       "bar"
+
+#data
+<svg></path>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+
+#data
+<div><svg></div>a
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <svg svg>
+|     "a"
+
+#data
+<div><svg><path></div>a
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <svg svg>
+|         <svg path>
+|     "a"
+
+#data
+<div><svg><path></svg><path>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <svg svg>
+|         <svg path>
+|       <path>
+
+#data
+<div><svg><path><foreignObject><math></div>a
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <svg svg>
+|         <svg path>
+|           <svg foreignObject>
+|             <math math>
+|               "a"
+
+#data
+<div><svg><path><foreignObject><p></div>a
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <svg svg>
+|         <svg path>
+|           <svg foreignObject>
+|             <p>
+|               "a"
+
+#data
+<!DOCTYPE html><svg><desc><div><svg><ul>a
+#errors
+40: HTML start tag “ul” in a foreign namespace context.
+41: End of file in a foreign namespace context.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg desc>
+|         <div>
+|           <svg svg>
+|           <ul>
+|             "a"
+
+#data
+<!DOCTYPE html><svg><desc><svg><ul>a
+#errors
+35: HTML start tag “ul” in a foreign namespace context.
+36: End of file in a foreign namespace context.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg desc>
+|         <svg svg>
+|         <ul>
+|           "a"
+
+#data
+<!DOCTYPE html><p><svg><desc><p>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <svg svg>
+|         <svg desc>
+|           <p>
+
+#data
+<!DOCTYPE html><p><svg><title><p>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <svg svg>
+|         <svg title>
+|           <p>
+
+#data
+<div><svg><path><foreignObject><p></foreignObject><p>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <svg svg>
+|         <svg path>
+|           <svg foreignObject>
+|             <p>
+|             <p>
+
+#data
+<math><mi><div><object><div><span></span></div></object></div></mi><mi>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         <div>
+|           <object>
+|             <div>
+|               <span>
+|       <math mi>
+
+#data
+<math><mi><svg><foreignObject><div><div></div></div></foreignObject></svg></mi><mi>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         <svg svg>
+|           <svg foreignObject>
+|             <div>
+|               <div>
+|       <math mi>
+
+#data
+<svg><script></script><path>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg script>
+|       <svg path>
+
+#data
+<table><svg></svg><tr>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<math><mi><mglyph>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         <math mglyph>
+
+#data
+<math><mi><malignmark>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         <math malignmark>
+
+#data
+<math><mo><mglyph>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mo>
+|         <math mglyph>
+
+#data
+<math><mo><malignmark>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mo>
+|         <math malignmark>
+
+#data
+<math><mn><mglyph>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mn>
+|         <math mglyph>
+
+#data
+<math><mn><malignmark>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mn>
+|         <math malignmark>
+
+#data
+<math><ms><mglyph>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math ms>
+|         <math mglyph>
+
+#data
+<math><ms><malignmark>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math ms>
+|         <math malignmark>
+
+#data
+<math><mtext><mglyph>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mtext>
+|         <math mglyph>
+
+#data
+<math><mtext><malignmark>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mtext>
+|         <math malignmark>
+
+#data
+<math><annotation-xml><svg></svg></annotation-xml><mi>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         <svg svg>
+|       <math mi>
+
+#data
+<math><annotation-xml><svg><foreignObject><div><math><mi></mi></math><span></span></div></foreignObject><path></path></svg></annotation-xml><mi>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         <svg svg>
+|           <svg foreignObject>
+|             <div>
+|               <math math>
+|                 <math mi>
+|               <span>
+|           <svg path>
+|       <math mi>
+
+#data
+<math><annotation-xml><svg><foreignObject><math><mi><svg></svg></mi><mo></mo></math><span></span></foreignObject><path></path></svg></annotation-xml><mi>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         <svg svg>
+|           <svg foreignObject>
+|             <math math>
+|               <math mi>
+|                 <svg svg>
+|               <math mo>
+|             <span>
+|           <svg path>
+|       <math mi>
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests11.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests11.dat
new file mode 100644
index 0000000..638cde4
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests11.dat
@@ -0,0 +1,482 @@
+#data
+<!DOCTYPE html><body><svg attributeName='' attributeType='' baseFrequency='' baseProfile='' calcMode='' clipPathUnits='' contentScriptType='' contentStyleType='' diffuseConstant='' edgeMode='' externalResourcesRequired='' filterRes='' filterUnits='' glyphRef='' gradientTransform='' gradientUnits='' kernelMatrix='' kernelUnitLength='' keyPoints='' keySplines='' keyTimes='' lengthAdjust='' limitingConeAngle='' markerHeight='' markerUnits='' markerWidth='' maskContentUnits='' maskUnits='' numOctaves='' pathLength='' patternContentUnits='' patternTransform='' patternUnits='' pointsAtX='' pointsAtY='' pointsAtZ='' preserveAlpha='' preserveAspectRatio='' primitiveUnits='' refX='' refY='' repeatCount='' repeatDur='' requiredExtensions='' requiredFeatures='' specularConstant='' specularExponent='' spreadMethod='' startOffset='' stdDeviation='' stitchTiles='' surfaceScale='' systemLanguage='' tableValues='' targetX='' targetY='' textLength='' viewBox='' viewTarget='' xChannelSelector='' yChannelSelector='' zoomAndPan=''></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       attributeName=""
+|       attributeType=""
+|       baseFrequency=""
+|       baseProfile=""
+|       calcMode=""
+|       clipPathUnits=""
+|       contentScriptType=""
+|       contentStyleType=""
+|       diffuseConstant=""
+|       edgeMode=""
+|       externalResourcesRequired=""
+|       filterRes=""
+|       filterUnits=""
+|       glyphRef=""
+|       gradientTransform=""
+|       gradientUnits=""
+|       kernelMatrix=""
+|       kernelUnitLength=""
+|       keyPoints=""
+|       keySplines=""
+|       keyTimes=""
+|       lengthAdjust=""
+|       limitingConeAngle=""
+|       markerHeight=""
+|       markerUnits=""
+|       markerWidth=""
+|       maskContentUnits=""
+|       maskUnits=""
+|       numOctaves=""
+|       pathLength=""
+|       patternContentUnits=""
+|       patternTransform=""
+|       patternUnits=""
+|       pointsAtX=""
+|       pointsAtY=""
+|       pointsAtZ=""
+|       preserveAlpha=""
+|       preserveAspectRatio=""
+|       primitiveUnits=""
+|       refX=""
+|       refY=""
+|       repeatCount=""
+|       repeatDur=""
+|       requiredExtensions=""
+|       requiredFeatures=""
+|       specularConstant=""
+|       specularExponent=""
+|       spreadMethod=""
+|       startOffset=""
+|       stdDeviation=""
+|       stitchTiles=""
+|       surfaceScale=""
+|       systemLanguage=""
+|       tableValues=""
+|       targetX=""
+|       targetY=""
+|       textLength=""
+|       viewBox=""
+|       viewTarget=""
+|       xChannelSelector=""
+|       yChannelSelector=""
+|       zoomAndPan=""
+
+#data
+<!DOCTYPE html><BODY><SVG ATTRIBUTENAME='' ATTRIBUTETYPE='' BASEFREQUENCY='' BASEPROFILE='' CALCMODE='' CLIPPATHUNITS='' CONTENTSCRIPTTYPE='' CONTENTSTYLETYPE='' DIFFUSECONSTANT='' EDGEMODE='' EXTERNALRESOURCESREQUIRED='' FILTERRES='' FILTERUNITS='' GLYPHREF='' GRADIENTTRANSFORM='' GRADIENTUNITS='' KERNELMATRIX='' KERNELUNITLENGTH='' KEYPOINTS='' KEYSPLINES='' KEYTIMES='' LENGTHADJUST='' LIMITINGCONEANGLE='' MARKERHEIGHT='' MARKERUNITS='' MARKERWIDTH='' MASKCONTENTUNITS='' MASKUNITS='' NUMOCTAVES='' PATHLENGTH='' PATTERNCONTENTUNITS='' PATTERNTRANSFORM='' PATTERNUNITS='' POINTSATX='' POINTSATY='' POINTSATZ='' PRESERVEALPHA='' PRESERVEASPECTRATIO='' PRIMITIVEUNITS='' REFX='' REFY='' REPEATCOUNT='' REPEATDUR='' REQUIREDEXTENSIONS='' REQUIREDFEATURES='' SPECULARCONSTANT='' SPECULAREXPONENT='' SPREADMETHOD='' STARTOFFSET='' STDDEVIATION='' STITCHTILES='' SURFACESCALE='' SYSTEMLANGUAGE='' TABLEVALUES='' TARGETX='' TARGETY='' TEXTLENGTH='' VIEWBOX='' VIEWTARGET='' XCHANNELSELECTOR='' YCHANNELSELECTOR='' ZOOMANDPAN=''></SVG>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       attributeName=""
+|       attributeType=""
+|       baseFrequency=""
+|       baseProfile=""
+|       calcMode=""
+|       clipPathUnits=""
+|       contentScriptType=""
+|       contentStyleType=""
+|       diffuseConstant=""
+|       edgeMode=""
+|       externalResourcesRequired=""
+|       filterRes=""
+|       filterUnits=""
+|       glyphRef=""
+|       gradientTransform=""
+|       gradientUnits=""
+|       kernelMatrix=""
+|       kernelUnitLength=""
+|       keyPoints=""
+|       keySplines=""
+|       keyTimes=""
+|       lengthAdjust=""
+|       limitingConeAngle=""
+|       markerHeight=""
+|       markerUnits=""
+|       markerWidth=""
+|       maskContentUnits=""
+|       maskUnits=""
+|       numOctaves=""
+|       pathLength=""
+|       patternContentUnits=""
+|       patternTransform=""
+|       patternUnits=""
+|       pointsAtX=""
+|       pointsAtY=""
+|       pointsAtZ=""
+|       preserveAlpha=""
+|       preserveAspectRatio=""
+|       primitiveUnits=""
+|       refX=""
+|       refY=""
+|       repeatCount=""
+|       repeatDur=""
+|       requiredExtensions=""
+|       requiredFeatures=""
+|       specularConstant=""
+|       specularExponent=""
+|       spreadMethod=""
+|       startOffset=""
+|       stdDeviation=""
+|       stitchTiles=""
+|       surfaceScale=""
+|       systemLanguage=""
+|       tableValues=""
+|       targetX=""
+|       targetY=""
+|       textLength=""
+|       viewBox=""
+|       viewTarget=""
+|       xChannelSelector=""
+|       yChannelSelector=""
+|       zoomAndPan=""
+
+#data
+<!DOCTYPE html><body><svg attributename='' attributetype='' basefrequency='' baseprofile='' calcmode='' clippathunits='' contentscripttype='' contentstyletype='' diffuseconstant='' edgemode='' externalresourcesrequired='' filterres='' filterunits='' glyphref='' gradienttransform='' gradientunits='' kernelmatrix='' kernelunitlength='' keypoints='' keysplines='' keytimes='' lengthadjust='' limitingconeangle='' markerheight='' markerunits='' markerwidth='' maskcontentunits='' maskunits='' numoctaves='' pathlength='' patterncontentunits='' patterntransform='' patternunits='' pointsatx='' pointsaty='' pointsatz='' preservealpha='' preserveaspectratio='' primitiveunits='' refx='' refy='' repeatcount='' repeatdur='' requiredextensions='' requiredfeatures='' specularconstant='' specularexponent='' spreadmethod='' startoffset='' stddeviation='' stitchtiles='' surfacescale='' systemlanguage='' tablevalues='' targetx='' targety='' textlength='' viewbox='' viewtarget='' xchannelselector='' ychannelselector='' zoomandpan=''></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       attributeName=""
+|       attributeType=""
+|       baseFrequency=""
+|       baseProfile=""
+|       calcMode=""
+|       clipPathUnits=""
+|       contentScriptType=""
+|       contentStyleType=""
+|       diffuseConstant=""
+|       edgeMode=""
+|       externalResourcesRequired=""
+|       filterRes=""
+|       filterUnits=""
+|       glyphRef=""
+|       gradientTransform=""
+|       gradientUnits=""
+|       kernelMatrix=""
+|       kernelUnitLength=""
+|       keyPoints=""
+|       keySplines=""
+|       keyTimes=""
+|       lengthAdjust=""
+|       limitingConeAngle=""
+|       markerHeight=""
+|       markerUnits=""
+|       markerWidth=""
+|       maskContentUnits=""
+|       maskUnits=""
+|       numOctaves=""
+|       pathLength=""
+|       patternContentUnits=""
+|       patternTransform=""
+|       patternUnits=""
+|       pointsAtX=""
+|       pointsAtY=""
+|       pointsAtZ=""
+|       preserveAlpha=""
+|       preserveAspectRatio=""
+|       primitiveUnits=""
+|       refX=""
+|       refY=""
+|       repeatCount=""
+|       repeatDur=""
+|       requiredExtensions=""
+|       requiredFeatures=""
+|       specularConstant=""
+|       specularExponent=""
+|       spreadMethod=""
+|       startOffset=""
+|       stdDeviation=""
+|       stitchTiles=""
+|       surfaceScale=""
+|       systemLanguage=""
+|       tableValues=""
+|       targetX=""
+|       targetY=""
+|       textLength=""
+|       viewBox=""
+|       viewTarget=""
+|       xChannelSelector=""
+|       yChannelSelector=""
+|       zoomAndPan=""
+
+#data
+<!DOCTYPE html><body><math attributeName='' attributeType='' baseFrequency='' baseProfile='' calcMode='' clipPathUnits='' contentScriptType='' contentStyleType='' diffuseConstant='' edgeMode='' externalResourcesRequired='' filterRes='' filterUnits='' glyphRef='' gradientTransform='' gradientUnits='' kernelMatrix='' kernelUnitLength='' keyPoints='' keySplines='' keyTimes='' lengthAdjust='' limitingConeAngle='' markerHeight='' markerUnits='' markerWidth='' maskContentUnits='' maskUnits='' numOctaves='' pathLength='' patternContentUnits='' patternTransform='' patternUnits='' pointsAtX='' pointsAtY='' pointsAtZ='' preserveAlpha='' preserveAspectRatio='' primitiveUnits='' refX='' refY='' repeatCount='' repeatDur='' requiredExtensions='' requiredFeatures='' specularConstant='' specularExponent='' spreadMethod='' startOffset='' stdDeviation='' stitchTiles='' surfaceScale='' systemLanguage='' tableValues='' targetX='' targetY='' textLength='' viewBox='' viewTarget='' xChannelSelector='' yChannelSelector='' zoomAndPan=''></math>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       attributename=""
+|       attributetype=""
+|       basefrequency=""
+|       baseprofile=""
+|       calcmode=""
+|       clippathunits=""
+|       contentscripttype=""
+|       contentstyletype=""
+|       diffuseconstant=""
+|       edgemode=""
+|       externalresourcesrequired=""
+|       filterres=""
+|       filterunits=""
+|       glyphref=""
+|       gradienttransform=""
+|       gradientunits=""
+|       kernelmatrix=""
+|       kernelunitlength=""
+|       keypoints=""
+|       keysplines=""
+|       keytimes=""
+|       lengthadjust=""
+|       limitingconeangle=""
+|       markerheight=""
+|       markerunits=""
+|       markerwidth=""
+|       maskcontentunits=""
+|       maskunits=""
+|       numoctaves=""
+|       pathlength=""
+|       patterncontentunits=""
+|       patterntransform=""
+|       patternunits=""
+|       pointsatx=""
+|       pointsaty=""
+|       pointsatz=""
+|       preservealpha=""
+|       preserveaspectratio=""
+|       primitiveunits=""
+|       refx=""
+|       refy=""
+|       repeatcount=""
+|       repeatdur=""
+|       requiredextensions=""
+|       requiredfeatures=""
+|       specularconstant=""
+|       specularexponent=""
+|       spreadmethod=""
+|       startoffset=""
+|       stddeviation=""
+|       stitchtiles=""
+|       surfacescale=""
+|       systemlanguage=""
+|       tablevalues=""
+|       targetx=""
+|       targety=""
+|       textlength=""
+|       viewbox=""
+|       viewtarget=""
+|       xchannelselector=""
+|       ychannelselector=""
+|       zoomandpan=""
+
+#data
+<!DOCTYPE html><body><svg><altGlyph /><altGlyphDef /><altGlyphItem /><animateColor /><animateMotion /><animateTransform /><clipPath /><feBlend /><feColorMatrix /><feComponentTransfer /><feComposite /><feConvolveMatrix /><feDiffuseLighting /><feDisplacementMap /><feDistantLight /><feFlood /><feFuncA /><feFuncB /><feFuncG /><feFuncR /><feGaussianBlur /><feImage /><feMerge /><feMergeNode /><feMorphology /><feOffset /><fePointLight /><feSpecularLighting /><feSpotLight /><feTile /><feTurbulence /><foreignObject /><glyphRef /><linearGradient /><radialGradient /><textPath /></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg altGlyph>
+|       <svg altGlyphDef>
+|       <svg altGlyphItem>
+|       <svg animateColor>
+|       <svg animateMotion>
+|       <svg animateTransform>
+|       <svg clipPath>
+|       <svg feBlend>
+|       <svg feColorMatrix>
+|       <svg feComponentTransfer>
+|       <svg feComposite>
+|       <svg feConvolveMatrix>
+|       <svg feDiffuseLighting>
+|       <svg feDisplacementMap>
+|       <svg feDistantLight>
+|       <svg feFlood>
+|       <svg feFuncA>
+|       <svg feFuncB>
+|       <svg feFuncG>
+|       <svg feFuncR>
+|       <svg feGaussianBlur>
+|       <svg feImage>
+|       <svg feMerge>
+|       <svg feMergeNode>
+|       <svg feMorphology>
+|       <svg feOffset>
+|       <svg fePointLight>
+|       <svg feSpecularLighting>
+|       <svg feSpotLight>
+|       <svg feTile>
+|       <svg feTurbulence>
+|       <svg foreignObject>
+|       <svg glyphRef>
+|       <svg linearGradient>
+|       <svg radialGradient>
+|       <svg textPath>
+
+#data
+<!DOCTYPE html><body><svg><altglyph /><altglyphdef /><altglyphitem /><animatecolor /><animatemotion /><animatetransform /><clippath /><feblend /><fecolormatrix /><fecomponenttransfer /><fecomposite /><feconvolvematrix /><fediffuselighting /><fedisplacementmap /><fedistantlight /><feflood /><fefunca /><fefuncb /><fefuncg /><fefuncr /><fegaussianblur /><feimage /><femerge /><femergenode /><femorphology /><feoffset /><fepointlight /><fespecularlighting /><fespotlight /><fetile /><feturbulence /><foreignobject /><glyphref /><lineargradient /><radialgradient /><textpath /></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg altGlyph>
+|       <svg altGlyphDef>
+|       <svg altGlyphItem>
+|       <svg animateColor>
+|       <svg animateMotion>
+|       <svg animateTransform>
+|       <svg clipPath>
+|       <svg feBlend>
+|       <svg feColorMatrix>
+|       <svg feComponentTransfer>
+|       <svg feComposite>
+|       <svg feConvolveMatrix>
+|       <svg feDiffuseLighting>
+|       <svg feDisplacementMap>
+|       <svg feDistantLight>
+|       <svg feFlood>
+|       <svg feFuncA>
+|       <svg feFuncB>
+|       <svg feFuncG>
+|       <svg feFuncR>
+|       <svg feGaussianBlur>
+|       <svg feImage>
+|       <svg feMerge>
+|       <svg feMergeNode>
+|       <svg feMorphology>
+|       <svg feOffset>
+|       <svg fePointLight>
+|       <svg feSpecularLighting>
+|       <svg feSpotLight>
+|       <svg feTile>
+|       <svg feTurbulence>
+|       <svg foreignObject>
+|       <svg glyphRef>
+|       <svg linearGradient>
+|       <svg radialGradient>
+|       <svg textPath>
+
+#data
+<!DOCTYPE html><BODY><SVG><ALTGLYPH /><ALTGLYPHDEF /><ALTGLYPHITEM /><ANIMATECOLOR /><ANIMATEMOTION /><ANIMATETRANSFORM /><CLIPPATH /><FEBLEND /><FECOLORMATRIX /><FECOMPONENTTRANSFER /><FECOMPOSITE /><FECONVOLVEMATRIX /><FEDIFFUSELIGHTING /><FEDISPLACEMENTMAP /><FEDISTANTLIGHT /><FEFLOOD /><FEFUNCA /><FEFUNCB /><FEFUNCG /><FEFUNCR /><FEGAUSSIANBLUR /><FEIMAGE /><FEMERGE /><FEMERGENODE /><FEMORPHOLOGY /><FEOFFSET /><FEPOINTLIGHT /><FESPECULARLIGHTING /><FESPOTLIGHT /><FETILE /><FETURBULENCE /><FOREIGNOBJECT /><GLYPHREF /><LINEARGRADIENT /><RADIALGRADIENT /><TEXTPATH /></SVG>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg altGlyph>
+|       <svg altGlyphDef>
+|       <svg altGlyphItem>
+|       <svg animateColor>
+|       <svg animateMotion>
+|       <svg animateTransform>
+|       <svg clipPath>
+|       <svg feBlend>
+|       <svg feColorMatrix>
+|       <svg feComponentTransfer>
+|       <svg feComposite>
+|       <svg feConvolveMatrix>
+|       <svg feDiffuseLighting>
+|       <svg feDisplacementMap>
+|       <svg feDistantLight>
+|       <svg feFlood>
+|       <svg feFuncA>
+|       <svg feFuncB>
+|       <svg feFuncG>
+|       <svg feFuncR>
+|       <svg feGaussianBlur>
+|       <svg feImage>
+|       <svg feMerge>
+|       <svg feMergeNode>
+|       <svg feMorphology>
+|       <svg feOffset>
+|       <svg fePointLight>
+|       <svg feSpecularLighting>
+|       <svg feSpotLight>
+|       <svg feTile>
+|       <svg feTurbulence>
+|       <svg foreignObject>
+|       <svg glyphRef>
+|       <svg linearGradient>
+|       <svg radialGradient>
+|       <svg textPath>
+
+#data
+<!DOCTYPE html><body><math><altGlyph /><altGlyphDef /><altGlyphItem /><animateColor /><animateMotion /><animateTransform /><clipPath /><feBlend /><feColorMatrix /><feComponentTransfer /><feComposite /><feConvolveMatrix /><feDiffuseLighting /><feDisplacementMap /><feDistantLight /><feFlood /><feFuncA /><feFuncB /><feFuncG /><feFuncR /><feGaussianBlur /><feImage /><feMerge /><feMergeNode /><feMorphology /><feOffset /><fePointLight /><feSpecularLighting /><feSpotLight /><feTile /><feTurbulence /><foreignObject /><glyphRef /><linearGradient /><radialGradient /><textPath /></math>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math altglyph>
+|       <math altglyphdef>
+|       <math altglyphitem>
+|       <math animatecolor>
+|       <math animatemotion>
+|       <math animatetransform>
+|       <math clippath>
+|       <math feblend>
+|       <math fecolormatrix>
+|       <math fecomponenttransfer>
+|       <math fecomposite>
+|       <math feconvolvematrix>
+|       <math fediffuselighting>
+|       <math fedisplacementmap>
+|       <math fedistantlight>
+|       <math feflood>
+|       <math fefunca>
+|       <math fefuncb>
+|       <math fefuncg>
+|       <math fefuncr>
+|       <math fegaussianblur>
+|       <math feimage>
+|       <math femerge>
+|       <math femergenode>
+|       <math femorphology>
+|       <math feoffset>
+|       <math fepointlight>
+|       <math fespecularlighting>
+|       <math fespotlight>
+|       <math fetile>
+|       <math feturbulence>
+|       <math foreignobject>
+|       <math glyphref>
+|       <math lineargradient>
+|       <math radialgradient>
+|       <math textpath>
+
+#data
+<!DOCTYPE html><body><svg><solidColor /></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg solidcolor>
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests12.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests12.dat
new file mode 100644
index 0000000..63107d2
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests12.dat
@@ -0,0 +1,62 @@
+#data
+<!DOCTYPE html><body><p>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       "foo"
+|       <math math>
+|         <math mtext>
+|           <i>
+|             "baz"
+|         <math annotation-xml>
+|           <svg svg>
+|             <svg desc>
+|               <b>
+|                 "eggs"
+|             <svg g>
+|               <svg foreignObject>
+|                 <p>
+|                   "spam"
+|                 <table>
+|                   <tbody>
+|                     <tr>
+|                       <td>
+|                         <img>
+|             <svg g>
+|               "quux"
+|       "bar"
+
+#data
+<!DOCTYPE html><body>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "foo"
+|     <math math>
+|       <math mtext>
+|         <i>
+|           "baz"
+|       <math annotation-xml>
+|         <svg svg>
+|           <svg desc>
+|             <b>
+|               "eggs"
+|           <svg g>
+|             <svg foreignObject>
+|               <p>
+|                 "spam"
+|               <table>
+|                 <tbody>
+|                   <tr>
+|                     <td>
+|                       <img>
+|           <svg g>
+|             "quux"
+|     "bar"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests14.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests14.dat
new file mode 100644
index 0000000..b8713f8
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests14.dat
@@ -0,0 +1,74 @@
+#data
+<!DOCTYPE html><html><body><xyz:abc></xyz:abc>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <xyz:abc>
+
+#data
+<!DOCTYPE html><html><body><xyz:abc></xyz:abc><span></span>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <xyz:abc>
+|     <span>
+
+#data
+<!DOCTYPE html><html><html abc:def=gh><xyz:abc></xyz:abc>
+#errors
+15: Unexpected start tag html
+#document
+| <!DOCTYPE html>
+| <html>
+|   abc:def="gh"
+|   <head>
+|   <body>
+|     <xyz:abc>
+
+#data
+<!DOCTYPE html><html xml:lang=bar><html xml:lang=foo>
+#errors
+15: Unexpected start tag html
+#document
+| <!DOCTYPE html>
+| <html>
+|   xml:lang="bar"
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><html 123=456>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   123="456"
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><html 123=456><html 789=012>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   123="456"
+|   789="012"
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><html><body 789=012>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     789="012"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests15.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests15.dat
new file mode 100644
index 0000000..6ce1c0d
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests15.dat
@@ -0,0 +1,208 @@
+#data
+<!DOCTYPE html><p><b><i><u></p> <p>X
+#errors
+Line: 1 Col: 31 Unexpected end tag (p). Ignored.
+Line: 1 Col: 36 Expected closing tag. Unexpected end of file.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <b>
+|         <i>
+|           <u>
+|     <b>
+|       <i>
+|         <u>
+|           " "
+|           <p>
+|             "X"
+
+#data
+<p><b><i><u></p>
+<p>X
+#errors
+Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE.
+Line: 1 Col: 16 Unexpected end tag (p). Ignored.
+Line: 2 Col: 4 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <b>
+|         <i>
+|           <u>
+|     <b>
+|       <i>
+|         <u>
+|           "
+"
+|           <p>
+|             "X"
+
+#data
+<!doctype html></html> <head>
+#errors
+Line: 1 Col: 22 Unexpected end tag (html) after the (implied) root element.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     " "
+
+#data
+<!doctype html></body><meta>
+#errors
+Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <meta>
+
+#data
+<html></html><!-- foo -->
+#errors
+Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE.
+Line: 1 Col: 13 Unexpected end tag (html) after the (implied) root element.
+#document
+| <html>
+|   <head>
+|   <body>
+| <!--  foo  -->
+
+#data
+<!doctype html></body><title>X</title>
+#errors
+Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <title>
+|       "X"
+
+#data
+<!doctype html><table> X<meta></table>
+#errors
+Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode.
+Line: 1 Col: 30 Unexpected start tag (meta) in table context caused voodoo mode.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     " X"
+|     <meta>
+|     <table>
+
+#data
+<!doctype html><table> x</table>
+#errors
+Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     " x"
+|     <table>
+
+#data
+<!doctype html><table> x </table>
+#errors
+Line: 1 Col: 25 Unexpected non-space characters in table context caused voodoo mode.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     " x "
+|     <table>
+
+#data
+<!doctype html><table><tr> x</table>
+#errors
+Line: 1 Col: 28 Unexpected non-space characters in table context caused voodoo mode.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     " x"
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<!doctype html><table>X<style> <tr>x </style> </table>
+#errors
+Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "X"
+|     <table>
+|       <style>
+|         " <tr>x "
+|       " "
+
+#data
+<!doctype html><div><table><a>foo</a> <tr><td>bar</td> </tr></table></div>
+#errors
+Line: 1 Col: 30 Unexpected start tag (a) in table context caused voodoo mode.
+Line: 1 Col: 37 Unexpected end tag (a) in table context caused voodoo mode.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <a>
+|         "foo"
+|       <table>
+|         " "
+|         <tbody>
+|           <tr>
+|             <td>
+|               "bar"
+|             " "
+
+#data
+<frame></frame></frame><frameset><frame><frameset><frame></frameset><noframes></frameset><noframes>
+#errors
+6: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”.
+13: Stray start tag “frame”.
+21: Stray end tag “frame”.
+29: Stray end tag “frame”.
+39: “frameset” start tag after “body” already open.
+105: End of file seen inside an [R]CDATA element.
+105: End of file seen and there were open elements.
+XXX: These errors are wrong, please fix me!
+#document
+| <html>
+|   <head>
+|   <frameset>
+|     <frame>
+|     <frameset>
+|       <frame>
+|     <noframes>
+|       "</frameset><noframes>"
+
+#data
+<!DOCTYPE html><object></html>
+#errors
+1: Expected closing tag. Unexpected end of file
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <object>
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests16.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests16.dat
new file mode 100644
index 0000000..c8ef66f
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests16.dat
@@ -0,0 +1,2299 @@
+#data
+<!doctype html><script>
+#errors
+Line: 1 Col: 23 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|   <body>
+
+#data
+<!doctype html><script>a
+#errors
+Line: 1 Col: 24 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "a"
+|   <body>
+
+#data
+<!doctype html><script><
+#errors
+Line: 1 Col: 24 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<"
+|   <body>
+
+#data
+<!doctype html><script></
+#errors
+Line: 1 Col: 25 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</"
+|   <body>
+
+#data
+<!doctype html><script></S
+#errors
+Line: 1 Col: 26 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</S"
+|   <body>
+
+#data
+<!doctype html><script></SC
+#errors
+Line: 1 Col: 27 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</SC"
+|   <body>
+
+#data
+<!doctype html><script></SCR
+#errors
+Line: 1 Col: 28 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</SCR"
+|   <body>
+
+#data
+<!doctype html><script></SCRI
+#errors
+Line: 1 Col: 29 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</SCRI"
+|   <body>
+
+#data
+<!doctype html><script></SCRIP
+#errors
+Line: 1 Col: 30 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</SCRIP"
+|   <body>
+
+#data
+<!doctype html><script></SCRIPT
+#errors
+Line: 1 Col: 31 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</SCRIPT"
+|   <body>
+
+#data
+<!doctype html><script></SCRIPT 
+#errors
+Line: 1 Col: 32 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|   <body>
+
+#data
+<!doctype html><script></s
+#errors
+Line: 1 Col: 26 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</s"
+|   <body>
+
+#data
+<!doctype html><script></sc
+#errors
+Line: 1 Col: 27 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</sc"
+|   <body>
+
+#data
+<!doctype html><script></scr
+#errors
+Line: 1 Col: 28 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</scr"
+|   <body>
+
+#data
+<!doctype html><script></scri
+#errors
+Line: 1 Col: 29 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</scri"
+|   <body>
+
+#data
+<!doctype html><script></scrip
+#errors
+Line: 1 Col: 30 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</scrip"
+|   <body>
+
+#data
+<!doctype html><script></script
+#errors
+Line: 1 Col: 31 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</script"
+|   <body>
+
+#data
+<!doctype html><script></script 
+#errors
+Line: 1 Col: 32 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|   <body>
+
+#data
+<!doctype html><script><!
+#errors
+Line: 1 Col: 25 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!"
+|   <body>
+
+#data
+<!doctype html><script><!a
+#errors
+Line: 1 Col: 26 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!a"
+|   <body>
+
+#data
+<!doctype html><script><!-
+#errors
+Line: 1 Col: 26 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!-"
+|   <body>
+
+#data
+<!doctype html><script><!-a
+#errors
+Line: 1 Col: 27 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!-a"
+|   <body>
+
+#data
+<!doctype html><script><!--
+#errors
+Line: 1 Col: 27 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--"
+|   <body>
+
+#data
+<!doctype html><script><!--a
+#errors
+Line: 1 Col: 28 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--a"
+|   <body>
+
+#data
+<!doctype html><script><!--<
+#errors
+Line: 1 Col: 28 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<"
+|   <body>
+
+#data
+<!doctype html><script><!--<a
+#errors
+Line: 1 Col: 29 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<a"
+|   <body>
+
+#data
+<!doctype html><script><!--</
+#errors
+Line: 1 Col: 27 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--</"
+|   <body>
+
+#data
+<!doctype html><script><!--</script
+#errors
+Line: 1 Col: 35 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--</script"
+|   <body>
+
+#data
+<!doctype html><script><!--</script 
+#errors
+Line: 1 Col: 36 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--"
+|   <body>
+
+#data
+<!doctype html><script><!--<s
+#errors
+Line: 1 Col: 29 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<s"
+|   <body>
+
+#data
+<!doctype html><script><!--<script
+#errors
+Line: 1 Col: 34 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script"
+|   <body>
+
+#data
+<!doctype html><script><!--<script 
+#errors
+Line: 1 Col: 35 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script "
+|   <body>
+
+#data
+<!doctype html><script><!--<script <
+#errors
+Line: 1 Col: 36 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script <"
+|   <body>
+
+#data
+<!doctype html><script><!--<script <a
+#errors
+Line: 1 Col: 37 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script <a"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </
+#errors
+Line: 1 Col: 37 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </s
+#errors
+Line: 1 Col: 38 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </s"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script
+#errors
+Line: 1 Col: 43 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </scripta
+#errors
+Line: 1 Col: 44 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </scripta"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script 
+#errors
+Line: 1 Col: 44 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script "
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script>
+#errors
+Line: 1 Col: 44 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script>"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script/
+#errors
+Line: 1 Col: 44 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script/"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script <
+#errors
+Line: 1 Col: 45 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script <"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script <a
+#errors
+Line: 1 Col: 46 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script <a"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script </
+#errors
+Line: 1 Col: 46 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script </"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script </script
+#errors
+Line: 1 Col: 52 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script </script"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script </script 
+#errors
+Line: 1 Col: 53 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script "
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script </script/
+#errors
+Line: 1 Col: 53 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script "
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script </script>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script "
+|   <body>
+
+#data
+<!doctype html><script><!--<script -
+#errors
+Line: 1 Col: 36 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -"
+|   <body>
+
+#data
+<!doctype html><script><!--<script -a
+#errors
+Line: 1 Col: 37 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -a"
+|   <body>
+
+#data
+<!doctype html><script><!--<script -<
+#errors
+Line: 1 Col: 37 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -<"
+|   <body>
+
+#data
+<!doctype html><script><!--<script --
+#errors
+Line: 1 Col: 37 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --"
+|   <body>
+
+#data
+<!doctype html><script><!--<script --a
+#errors
+Line: 1 Col: 38 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --a"
+|   <body>
+
+#data
+<!doctype html><script><!--<script --<
+#errors
+Line: 1 Col: 38 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --<"
+|   <body>
+
+#data
+<!doctype html><script><!--<script -->
+#errors
+Line: 1 Col: 38 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -->"
+|   <body>
+
+#data
+<!doctype html><script><!--<script --><
+#errors
+Line: 1 Col: 39 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --><"
+|   <body>
+
+#data
+<!doctype html><script><!--<script --></
+#errors
+Line: 1 Col: 40 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --></"
+|   <body>
+
+#data
+<!doctype html><script><!--<script --></script
+#errors
+Line: 1 Col: 46 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --></script"
+|   <body>
+
+#data
+<!doctype html><script><!--<script --></script 
+#errors
+Line: 1 Col: 47 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -->"
+|   <body>
+
+#data
+<!doctype html><script><!--<script --></script/
+#errors
+Line: 1 Col: 47 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -->"
+|   <body>
+
+#data
+<!doctype html><script><!--<script --></script>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -->"
+|   <body>
+
+#data
+<!doctype html><script><!--<script><\/script>--></script>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script><\/script>-->"
+|   <body>
+
+#data
+<!doctype html><script><!--<script></scr'+'ipt>--></script>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></scr'+'ipt>-->"
+|   <body>
+
+#data
+<!doctype html><script><!--<script></script><script></script></script>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>"
+|   <body>
+
+#data
+<!doctype html><script><!--<script></script><script></script>--><!--</script>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>--><!--"
+|   <body>
+
+#data
+<!doctype html><script><!--<script></script><script></script>-- ></script>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>-- >"
+|   <body>
+
+#data
+<!doctype html><script><!--<script></script><script></script>- -></script>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>- ->"
+|   <body>
+
+#data
+<!doctype html><script><!--<script></script><script></script>- - ></script>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>- - >"
+|   <body>
+
+#data
+<!doctype html><script><!--<script></script><script></script>-></script>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>->"
+|   <body>
+
+#data
+<!doctype html><script><!--<script>--!></script>X
+#errors
+Line: 1 Col: 49 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script>--!></script>X"
+|   <body>
+
+#data
+<!doctype html><script><!--<scr'+'ipt></script>--></script>
+#errors
+Line: 1 Col: 59 Unexpected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<scr'+'ipt>"
+|   <body>
+|     "-->"
+
+#data
+<!doctype html><script><!--<script></scr'+'ipt></script>X
+#errors
+Line: 1 Col: 57 Unexpected end of file. Expected end tag (script).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></scr'+'ipt></script>X"
+|   <body>
+
+#data
+<!doctype html><style><!--<style></style>--></style>
+#errors
+Line: 1 Col: 52 Unexpected end tag (style).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <style>
+|       "<!--<style>"
+|   <body>
+|     "-->"
+
+#data
+<!doctype html><style><!--</style>X
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <style>
+|       "<!--"
+|   <body>
+|     "X"
+
+#data
+<!doctype html><style><!--...</style>...--></style>
+#errors
+Line: 1 Col: 51 Unexpected end tag (style).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <style>
+|       "<!--..."
+|   <body>
+|     "...-->"
+
+#data
+<!doctype html><style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <style>
+|       "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>"
+|   <body>
+|     "X"
+
+#data
+<!doctype html><style><!--...<style><!--...--!></style>--></style>
+#errors
+Line: 1 Col: 66 Unexpected end tag (style).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <style>
+|       "<!--...<style><!--...--!>"
+|   <body>
+|     "-->"
+
+#data
+<!doctype html><style><!--...</style><!-- --><style>@import ...</style>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <style>
+|       "<!--..."
+|     <!--   -->
+|     <style>
+|       "@import ..."
+|   <body>
+
+#data
+<!doctype html><style>...<style><!--...</style><!-- --></style>
+#errors
+Line: 1 Col: 63 Unexpected end tag (style).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <style>
+|       "...<style><!--..."
+|     <!--   -->
+|   <body>
+
+#data
+<!doctype html><style>...<!--[if IE]><style>...</style>X
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <style>
+|       "...<!--[if IE]><style>..."
+|   <body>
+|     "X"
+
+#data
+<!doctype html><title><!--<title></title>--></title>
+#errors
+Line: 1 Col: 52 Unexpected end tag (title).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <title>
+|       "<!--<title>"
+|   <body>
+|     "-->"
+
+#data
+<!doctype html><title>&lt;/title></title>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <title>
+|       "</title>"
+|   <body>
+
+#data
+<!doctype html><title>foo/title><link></head><body>X
+#errors
+Line: 1 Col: 52 Unexpected end of file. Expected end tag (title).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <title>
+|       "foo/title><link></head><body>X"
+|   <body>
+
+#data
+<!doctype html><noscript><!--<noscript></noscript>--></noscript>
+#errors
+Line: 1 Col: 64 Unexpected end tag (noscript).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <noscript>
+|       "<!--<noscript>"
+|   <body>
+|     "-->"
+
+#data
+<!doctype html><noscript><!--</noscript>X<noscript>--></noscript>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <noscript>
+|       "<!--"
+|   <body>
+|     "X"
+|     <noscript>
+|       "-->"
+
+#data
+<!doctype html><noscript><iframe></noscript>X
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <noscript>
+|       "<iframe>"
+|   <body>
+|     "X"
+
+#data
+<!doctype html><noframes><!--<noframes></noframes>--></noframes>
+#errors
+Line: 1 Col: 64 Unexpected end tag (noframes).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <noframes>
+|       "<!--<noframes>"
+|   <body>
+|     "-->"
+
+#data
+<!doctype html><noframes><body><script><!--...</script></body></noframes></html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <noframes>
+|       "<body><script><!--...</script></body>"
+|   <body>
+
+#data
+<!doctype html><textarea><!--<textarea></textarea>--></textarea>
+#errors
+Line: 1 Col: 64 Unexpected end tag (textarea).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "<!--<textarea>"
+|     "-->"
+
+#data
+<!doctype html><textarea>&lt;/textarea></textarea>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "</textarea>"
+
+#data
+<!doctype html><textarea>&lt;</textarea>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "<"
+
+#data
+<!doctype html><textarea>a&lt;b</textarea>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "a<b"
+
+#data
+<!doctype html><iframe><!--<iframe></iframe>--></iframe>
+#errors
+Line: 1 Col: 56 Unexpected end tag (iframe).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <iframe>
+|       "<!--<iframe>"
+|     "-->"
+
+#data
+<!doctype html><iframe>...<!--X->...<!--/X->...</iframe>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <iframe>
+|       "...<!--X->...<!--/X->..."
+
+#data
+<!doctype html><xmp><!--<xmp></xmp>--></xmp>
+#errors
+Line: 1 Col: 44 Unexpected end tag (xmp).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <xmp>
+|       "<!--<xmp>"
+|     "-->"
+
+#data
+<!doctype html><noembed><!--<noembed></noembed>--></noembed>
+#errors
+Line: 1 Col: 60 Unexpected end tag (noembed).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <noembed>
+|       "<!--<noembed>"
+|     "-->"
+
+#data
+<script>
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 8 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|   <body>
+
+#data
+<script>a
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 9 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "a"
+|   <body>
+
+#data
+<script><
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 9 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<"
+|   <body>
+
+#data
+<script></
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 10 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</"
+|   <body>
+
+#data
+<script></S
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 11 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</S"
+|   <body>
+
+#data
+<script></SC
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 12 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</SC"
+|   <body>
+
+#data
+<script></SCR
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 13 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</SCR"
+|   <body>
+
+#data
+<script></SCRI
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 14 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</SCRI"
+|   <body>
+
+#data
+<script></SCRIP
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 15 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</SCRIP"
+|   <body>
+
+#data
+<script></SCRIPT
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 16 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</SCRIPT"
+|   <body>
+
+#data
+<script></SCRIPT 
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 17 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|   <body>
+
+#data
+<script></s
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 11 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</s"
+|   <body>
+
+#data
+<script></sc
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 12 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</sc"
+|   <body>
+
+#data
+<script></scr
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 13 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</scr"
+|   <body>
+
+#data
+<script></scri
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 14 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</scri"
+|   <body>
+
+#data
+<script></scrip
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 15 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</scrip"
+|   <body>
+
+#data
+<script></script
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 16 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</script"
+|   <body>
+
+#data
+<script></script 
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 17 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|   <body>
+
+#data
+<script><!
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 10 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!"
+|   <body>
+
+#data
+<script><!a
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 11 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!a"
+|   <body>
+
+#data
+<script><!-
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 11 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!-"
+|   <body>
+
+#data
+<script><!-a
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 12 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!-a"
+|   <body>
+
+#data
+<script><!--
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 12 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--"
+|   <body>
+
+#data
+<script><!--a
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 13 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--a"
+|   <body>
+
+#data
+<script><!--<
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 13 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<"
+|   <body>
+
+#data
+<script><!--<a
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 14 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<a"
+|   <body>
+
+#data
+<script><!--</
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 14 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--</"
+|   <body>
+
+#data
+<script><!--</script
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 20 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--</script"
+|   <body>
+
+#data
+<script><!--</script 
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 21 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--"
+|   <body>
+
+#data
+<script><!--<s
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 14 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<s"
+|   <body>
+
+#data
+<script><!--<script
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 19 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script"
+|   <body>
+
+#data
+<script><!--<script 
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 20 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script "
+|   <body>
+
+#data
+<script><!--<script <
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 21 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script <"
+|   <body>
+
+#data
+<script><!--<script <a
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 22 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script <a"
+|   <body>
+
+#data
+<script><!--<script </
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 22 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </"
+|   <body>
+
+#data
+<script><!--<script </s
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 23 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </s"
+|   <body>
+
+#data
+<script><!--<script </script
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 28 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script"
+|   <body>
+
+#data
+<script><!--<script </scripta
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 29 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </scripta"
+|   <body>
+
+#data
+<script><!--<script </script 
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 29 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script "
+|   <body>
+
+#data
+<script><!--<script </script>
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 29 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script>"
+|   <body>
+
+#data
+<script><!--<script </script/
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 29 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script/"
+|   <body>
+
+#data
+<script><!--<script </script <
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 30 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script <"
+|   <body>
+
+#data
+<script><!--<script </script <a
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 31 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script <a"
+|   <body>
+
+#data
+<script><!--<script </script </
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 31 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script </"
+|   <body>
+
+#data
+<script><!--<script </script </script
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 38 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script </script"
+|   <body>
+
+#data
+<script><!--<script </script </script 
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 38 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script "
+|   <body>
+
+#data
+<script><!--<script </script </script/
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 38 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script "
+|   <body>
+
+#data
+<script><!--<script </script </script>
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script "
+|   <body>
+
+#data
+<script><!--<script -
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 21 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -"
+|   <body>
+
+#data
+<script><!--<script -a
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 22 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -a"
+|   <body>
+
+#data
+<script><!--<script --
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 22 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --"
+|   <body>
+
+#data
+<script><!--<script --a
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 23 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --a"
+|   <body>
+
+#data
+<script><!--<script -->
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 23 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -->"
+|   <body>
+
+#data
+<script><!--<script --><
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 24 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --><"
+|   <body>
+
+#data
+<script><!--<script --></
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 25 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --></"
+|   <body>
+
+#data
+<script><!--<script --></script
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 31 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --></script"
+|   <body>
+
+#data
+<script><!--<script --></script 
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 32 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -->"
+|   <body>
+
+#data
+<script><!--<script --></script/
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 32 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -->"
+|   <body>
+
+#data
+<script><!--<script --></script>
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -->"
+|   <body>
+
+#data
+<script><!--<script><\/script>--></script>
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script><\/script>-->"
+|   <body>
+
+#data
+<script><!--<script></scr'+'ipt>--></script>
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></scr'+'ipt>-->"
+|   <body>
+
+#data
+<script><!--<script></script><script></script></script>
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>"
+|   <body>
+
+#data
+<script><!--<script></script><script></script>--><!--</script>
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>--><!--"
+|   <body>
+
+#data
+<script><!--<script></script><script></script>-- ></script>
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>-- >"
+|   <body>
+
+#data
+<script><!--<script></script><script></script>- -></script>
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>- ->"
+|   <body>
+
+#data
+<script><!--<script></script><script></script>- - ></script>
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>- - >"
+|   <body>
+
+#data
+<script><!--<script></script><script></script>-></script>
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>->"
+|   <body>
+
+#data
+<script><!--<script>--!></script>X
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 34 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script>--!></script>X"
+|   <body>
+
+#data
+<script><!--<scr'+'ipt></script>--></script>
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 44 Unexpected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<scr'+'ipt>"
+|   <body>
+|     "-->"
+
+#data
+<script><!--<script></scr'+'ipt></script>X
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 42 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></scr'+'ipt></script>X"
+|   <body>
+
+#data
+<style><!--<style></style>--></style>
+#errors
+Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE.
+Line: 1 Col: 37 Unexpected end tag (style).
+#document
+| <html>
+|   <head>
+|     <style>
+|       "<!--<style>"
+|   <body>
+|     "-->"
+
+#data
+<style><!--</style>X
+#errors
+Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <style>
+|       "<!--"
+|   <body>
+|     "X"
+
+#data
+<style><!--...</style>...--></style>
+#errors
+Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE.
+Line: 1 Col: 36 Unexpected end tag (style).
+#document
+| <html>
+|   <head>
+|     <style>
+|       "<!--..."
+|   <body>
+|     "...-->"
+
+#data
+<style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X
+#errors
+Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <style>
+|       "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>"
+|   <body>
+|     "X"
+
+#data
+<style><!--...<style><!--...--!></style>--></style>
+#errors
+Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE.
+Line: 1 Col: 51 Unexpected end tag (style).
+#document
+| <html>
+|   <head>
+|     <style>
+|       "<!--...<style><!--...--!>"
+|   <body>
+|     "-->"
+
+#data
+<style><!--...</style><!-- --><style>@import ...</style>
+#errors
+Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <style>
+|       "<!--..."
+|     <!--   -->
+|     <style>
+|       "@import ..."
+|   <body>
+
+#data
+<style>...<style><!--...</style><!-- --></style>
+#errors
+Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE.
+Line: 1 Col: 48 Unexpected end tag (style).
+#document
+| <html>
+|   <head>
+|     <style>
+|       "...<style><!--..."
+|     <!--   -->
+|   <body>
+
+#data
+<style>...<!--[if IE]><style>...</style>X
+#errors
+Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <style>
+|       "...<!--[if IE]><style>..."
+|   <body>
+|     "X"
+
+#data
+<title><!--<title></title>--></title>
+#errors
+Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE.
+Line: 1 Col: 37 Unexpected end tag (title).
+#document
+| <html>
+|   <head>
+|     <title>
+|       "<!--<title>"
+|   <body>
+|     "-->"
+
+#data
+<title>&lt;/title></title>
+#errors
+Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <title>
+|       "</title>"
+|   <body>
+
+#data
+<title>foo/title><link></head><body>X
+#errors
+Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE.
+Line: 1 Col: 37 Unexpected end of file. Expected end tag (title).
+#document
+| <html>
+|   <head>
+|     <title>
+|       "foo/title><link></head><body>X"
+|   <body>
+
+#data
+<noscript><!--<noscript></noscript>--></noscript>
+#errors
+Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE.
+Line: 1 Col: 49 Unexpected end tag (noscript).
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       "<!--<noscript>"
+|   <body>
+|     "-->"
+
+#data
+<noscript><!--</noscript>X<noscript>--></noscript>
+#errors
+Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       "<!--"
+|   <body>
+|     "X"
+|     <noscript>
+|       "-->"
+
+#data
+<noscript><iframe></noscript>X
+#errors
+Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       "<iframe>"
+|   <body>
+|     "X"
+
+#data
+<noframes><!--<noframes></noframes>--></noframes>
+#errors
+Line: 1 Col: 10 Unexpected start tag (noframes). Expected DOCTYPE.
+Line: 1 Col: 49 Unexpected end tag (noframes).
+#document
+| <html>
+|   <head>
+|     <noframes>
+|       "<!--<noframes>"
+|   <body>
+|     "-->"
+
+#data
+<noframes><body><script><!--...</script></body></noframes></html>
+#errors
+Line: 1 Col: 10 Unexpected start tag (noframes). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <noframes>
+|       "<body><script><!--...</script></body>"
+|   <body>
+
+#data
+<textarea><!--<textarea></textarea>--></textarea>
+#errors
+Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE.
+Line: 1 Col: 49 Unexpected end tag (textarea).
+#document
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "<!--<textarea>"
+|     "-->"
+
+#data
+<textarea>&lt;/textarea></textarea>
+#errors
+Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "</textarea>"
+
+#data
+<iframe><!--<iframe></iframe>--></iframe>
+#errors
+Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE.
+Line: 1 Col: 41 Unexpected end tag (iframe).
+#document
+| <html>
+|   <head>
+|   <body>
+|     <iframe>
+|       "<!--<iframe>"
+|     "-->"
+
+#data
+<iframe>...<!--X->...<!--/X->...</iframe>
+#errors
+Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <iframe>
+|       "...<!--X->...<!--/X->..."
+
+#data
+<xmp><!--<xmp></xmp>--></xmp>
+#errors
+Line: 1 Col: 5 Unexpected start tag (xmp). Expected DOCTYPE.
+Line: 1 Col: 29 Unexpected end tag (xmp).
+#document
+| <html>
+|   <head>
+|   <body>
+|     <xmp>
+|       "<!--<xmp>"
+|     "-->"
+
+#data
+<noembed><!--<noembed></noembed>--></noembed>
+#errors
+Line: 1 Col: 9 Unexpected start tag (noembed). Expected DOCTYPE.
+Line: 1 Col: 45 Unexpected end tag (noembed).
+#document
+| <html>
+|   <head>
+|   <body>
+|     <noembed>
+|       "<!--<noembed>"
+|     "-->"
+
+#data
+<!doctype html><table>
+
+#errors
+Line 2 Col 0 Unexpected end of file. Expected table content.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       "
+"
+
+#data
+<!doctype html><table><td><span><font></span><span>
+#errors
+Line 1 Col 26 Unexpected table cell start tag (td) in the table body phase.
+Line 1 Col 45 Unexpected end tag (span).
+Line 1 Col 51 Expected closing tag. Unexpected end of file.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <span>
+|               <font>
+|             <font>
+|               <span>
+
+#data
+<!doctype html><form><table></form><form></table></form>
+#errors
+35: Stray end tag “form”.
+41: Start tag “form” seen in “table”.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <form>
+|       <table>
+|         <form>
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests17.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests17.dat
new file mode 100644
index 0000000..7b555f8
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests17.dat
@@ -0,0 +1,153 @@
+#data
+<!doctype html><table><tbody><select><tr>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<!doctype html><table><tr><select><td>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+
+#data
+<!doctype html><table><tr><td><select><td>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <select>
+|           <td>
+
+#data
+<!doctype html><table><tr><th><select><td>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <th>
+|             <select>
+|           <td>
+
+#data
+<!doctype html><table><caption><select><tr>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <select>
+|       <tbody>
+|         <tr>
+
+#data
+<!doctype html><select><tr>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!doctype html><select><td>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!doctype html><select><th>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!doctype html><select><tbody>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!doctype html><select><thead>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!doctype html><select><tfoot>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!doctype html><select><caption>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!doctype html><table><tr></table>a
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|     "a"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests18.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests18.dat
new file mode 100644
index 0000000..680e1f0
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests18.dat
@@ -0,0 +1,269 @@
+#data
+<!doctype html><plaintext></plaintext>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <plaintext>
+|       "</plaintext>"
+
+#data
+<!doctype html><table><plaintext></plaintext>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <plaintext>
+|       "</plaintext>"
+|     <table>
+
+#data
+<!doctype html><table><tbody><plaintext></plaintext>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <plaintext>
+|       "</plaintext>"
+|     <table>
+|       <tbody>
+
+#data
+<!doctype html><table><tbody><tr><plaintext></plaintext>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <plaintext>
+|       "</plaintext>"
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<!doctype html><table><tbody><tr><plaintext></plaintext>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <plaintext>
+|       "</plaintext>"
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<!doctype html><table><td><plaintext></plaintext>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <plaintext>
+|               "</plaintext>"
+
+#data
+<!doctype html><table><caption><plaintext></plaintext>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <plaintext>
+|           "</plaintext>"
+
+#data
+<!doctype html><table><tr><style></script></style>abc
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "abc"
+|     <table>
+|       <tbody>
+|         <tr>
+|           <style>
+|             "</script>"
+
+#data
+<!doctype html><table><tr><script></style></script>abc
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "abc"
+|     <table>
+|       <tbody>
+|         <tr>
+|           <script>
+|             "</style>"
+
+#data
+<!doctype html><table><caption><style></script></style>abc
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <style>
+|           "</script>"
+|         "abc"
+
+#data
+<!doctype html><table><td><style></script></style>abc
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <style>
+|               "</script>"
+|             "abc"
+
+#data
+<!doctype html><select><script></style></script>abc
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <script>
+|         "</style>"
+|       "abc"
+
+#data
+<!doctype html><table><select><script></style></script>abc
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <script>
+|         "</style>"
+|       "abc"
+|     <table>
+
+#data
+<!doctype html><table><tr><select><script></style></script>abc
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <script>
+|         "</style>"
+|       "abc"
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<!doctype html><frameset></frameset><noframes>abc
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|   <noframes>
+|     "abc"
+
+#data
+<!doctype html><frameset></frameset><noframes>abc</noframes><!--abc-->
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|   <noframes>
+|     "abc"
+|   <!-- abc -->
+
+#data
+<!doctype html><frameset></frameset></html><noframes>abc
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|   <noframes>
+|     "abc"
+
+#data
+<!doctype html><frameset></frameset></html><noframes>abc</noframes><!--abc-->
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|   <noframes>
+|     "abc"
+| <!-- abc -->
+
+#data
+<!doctype html><table><tr></tbody><tfoot>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|       <tfoot>
+
+#data
+<!doctype html><table><td><svg></svg>abc<td>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <svg svg>
+|             "abc"
+|           <td>
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests19.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests19.dat
new file mode 100644
index 0000000..0d62f5a
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests19.dat
@@ -0,0 +1,1237 @@
+#data
+<!doctype html><math><mn DefinitionUrl="foo">
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mn>
+|         definitionURL="foo"
+
+#data
+<!doctype html><html></p><!--foo-->
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <!-- foo -->
+|   <head>
+|   <body>
+
+#data
+<!doctype html><head></head></p><!--foo-->
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <!-- foo -->
+|   <body>
+
+#data
+<!doctype html><body><p><pre>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <pre>
+
+#data
+<!doctype html><body><p><listing>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <listing>
+
+#data
+<!doctype html><p><plaintext>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <plaintext>
+
+#data
+<!doctype html><p><h1>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <h1>
+
+#data
+<!doctype html><form><isindex>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <form>
+
+#data
+<!doctype html><isindex action="POST">
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <form>
+|       action="POST"
+|       <hr>
+|       <label>
+|         "This is a searchable index. Enter search keywords: "
+|         <input>
+|           name="isindex"
+|       <hr>
+
+#data
+<!doctype html><isindex prompt="this is isindex">
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <form>
+|       <hr>
+|       <label>
+|         "this is isindex"
+|         <input>
+|           name="isindex"
+|       <hr>
+
+#data
+<!doctype html><isindex type="hidden">
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <form>
+|       <hr>
+|       <label>
+|         "This is a searchable index. Enter search keywords: "
+|         <input>
+|           name="isindex"
+|           type="hidden"
+|       <hr>
+
+#data
+<!doctype html><isindex name="foo">
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <form>
+|       <hr>
+|       <label>
+|         "This is a searchable index. Enter search keywords: "
+|         <input>
+|           name="isindex"
+|       <hr>
+
+#data
+<!doctype html><ruby><p><rp>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       <p>
+|       <rp>
+
+#data
+<!doctype html><ruby><div><span><rp>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       <div>
+|         <span>
+|           <rp>
+
+#data
+<!doctype html><ruby><div><p><rp>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       <div>
+|         <p>
+|         <rp>
+
+#data
+<!doctype html><ruby><p><rt>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       <p>
+|       <rt>
+
+#data
+<!doctype html><ruby><div><span><rt>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       <div>
+|         <span>
+|           <rt>
+
+#data
+<!doctype html><ruby><div><p><rt>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       <div>
+|         <p>
+|         <rt>
+
+#data
+<!doctype html><math/><foo>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|     <foo>
+
+#data
+<!doctype html><svg/><foo>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|     <foo>
+
+#data
+<!doctype html><div></body><!--foo-->
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|   <!-- foo -->
+
+#data
+<!doctype html><h1><div><h3><span></h1>foo
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <h1>
+|       <div>
+|         <h3>
+|           <span>
+|         "foo"
+
+#data
+<!doctype html><p></h3>foo
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       "foo"
+
+#data
+<!doctype html><h3><li>abc</h2>foo
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <h3>
+|       <li>
+|         "abc"
+|     "foo"
+
+#data
+<!doctype html><table>abc<!--foo-->
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "abc"
+|     <table>
+|       <!-- foo -->
+
+#data
+<!doctype html><table>  <!--foo-->
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       "  "
+|       <!-- foo -->
+
+#data
+<!doctype html><table> b <!--foo-->
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     " b "
+|     <table>
+|       <!-- foo -->
+
+#data
+<!doctype html><select><option><option>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+|       <option>
+
+#data
+<!doctype html><select><option></optgroup>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+
+#data
+<!doctype html><select><option></optgroup>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+
+#data
+<!doctype html><p><math><mi><p><h1>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <math math>
+|         <math mi>
+|           <p>
+|           <h1>
+
+#data
+<!doctype html><p><math><mo><p><h1>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <math math>
+|         <math mo>
+|           <p>
+|           <h1>
+
+#data
+<!doctype html><p><math><mn><p><h1>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <math math>
+|         <math mn>
+|           <p>
+|           <h1>
+
+#data
+<!doctype html><p><math><ms><p><h1>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <math math>
+|         <math ms>
+|           <p>
+|           <h1>
+
+#data
+<!doctype html><p><math><mtext><p><h1>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <math math>
+|         <math mtext>
+|           <p>
+|           <h1>
+
+#data
+<!doctype html><frameset></noframes>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!doctype html><html c=d><body></html><html a=b>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   a="b"
+|   c="d"
+|   <head>
+|   <body>
+
+#data
+<!doctype html><html c=d><frameset></frameset></html><html a=b>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   a="b"
+|   c="d"
+|   <head>
+|   <frameset>
+
+#data
+<!doctype html><html><frameset></frameset></html><!--foo-->
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+| <!-- foo -->
+
+#data
+<!doctype html><html><frameset></frameset></html>  
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|   "  "
+
+#data
+<!doctype html><html><frameset></frameset></html>abc
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!doctype html><html><frameset></frameset></html><p>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!doctype html><html><frameset></frameset></html></p>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<html><frameset></frameset></html><!doctype html>
+#errors
+#document
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!doctype html><body><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!doctype html><p><frameset><frame>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|     <frame>
+
+#data
+<!doctype html><p>a<frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       "a"
+
+#data
+<!doctype html><p> <frameset><frame>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|     <frame>
+
+#data
+<!doctype html><pre><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <pre>
+
+#data
+<!doctype html><listing><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <listing>
+
+#data
+<!doctype html><li><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <li>
+
+#data
+<!doctype html><dd><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <dd>
+
+#data
+<!doctype html><dt><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <dt>
+
+#data
+<!doctype html><button><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <button>
+
+#data
+<!doctype html><applet><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <applet>
+
+#data
+<!doctype html><marquee><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <marquee>
+
+#data
+<!doctype html><object><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <object>
+
+#data
+<!doctype html><table><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+
+#data
+<!doctype html><area><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <area>
+
+#data
+<!doctype html><basefont><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <basefont>
+|   <frameset>
+
+#data
+<!doctype html><bgsound><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <bgsound>
+|   <frameset>
+
+#data
+<!doctype html><br><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <br>
+
+#data
+<!doctype html><embed><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <embed>
+
+#data
+<!doctype html><img><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <img>
+
+#data
+<!doctype html><input><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <input>
+
+#data
+<!doctype html><keygen><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <keygen>
+
+#data
+<!doctype html><wbr><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <wbr>
+
+#data
+<!doctype html><hr><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <hr>
+
+#data
+<!doctype html><textarea></textarea><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+
+#data
+<!doctype html><xmp></xmp><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <xmp>
+
+#data
+<!doctype html><iframe></iframe><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <iframe>
+
+#data
+<!doctype html><select></select><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!doctype html><svg></svg><frameset><frame>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|     <frame>
+
+#data
+<!doctype html><math></math><frameset><frame>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|     <frame>
+
+#data
+<!doctype html><svg><foreignObject><div> <frameset><frame>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|     <frame>
+
+#data
+<!doctype html><svg>a</svg><frameset><frame>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "a"
+
+#data
+<!doctype html><svg> </svg><frameset><frame>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|     <frame>
+
+#data
+<html>aaa<frameset></frameset>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "aaa"
+
+#data
+<html> a <frameset></frameset>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "a "
+
+#data
+<!doctype html><div><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!doctype html><div><body><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <div>
+
+#data
+<!doctype html><p><math></p>a
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <math math>
+|     "a"
+
+#data
+<!doctype html><p><math><mn><span></p>a
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <math math>
+|         <math mn>
+|           <span>
+|             <p>
+|             "a"
+
+#data
+<!doctype html><math></html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+
+#data
+<!doctype html><meta charset="ascii">
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <meta>
+|       charset="ascii"
+|   <body>
+
+#data
+<!doctype html><meta http-equiv="content-type" content="text/html;charset=ascii">
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <meta>
+|       content="text/html;charset=ascii"
+|       http-equiv="content-type"
+|   <body>
+
+#data
+<!doctype html><head><!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--><meta charset="utf8">
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <!-- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -->
+|     <meta>
+|       charset="utf8"
+|   <body>
+
+#data
+<!doctype html><html a=b><head></head><html c=d>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   a="b"
+|   c="d"
+|   <head>
+|   <body>
+
+#data
+<!doctype html><image/>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <img>
+
+#data
+<!doctype html>a<i>b<table>c<b>d</i>e</b>f
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "a"
+|     <i>
+|       "bc"
+|       <b>
+|         "de"
+|       "f"
+|       <table>
+
+#data
+<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <i>
+|       "a"
+|       <b>
+|         "b"
+|     <b>
+|     <div>
+|       <b>
+|         <i>
+|           "c"
+|           <a>
+|             "d"
+|         <a>
+|           "e"
+|       <a>
+|         "f"
+|     <table>
+
+#data
+<!doctype html><i>a<b>b<div>c<a>d</i>e</b>f
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <i>
+|       "a"
+|       <b>
+|         "b"
+|     <b>
+|     <div>
+|       <b>
+|         <i>
+|           "c"
+|           <a>
+|             "d"
+|         <a>
+|           "e"
+|       <a>
+|         "f"
+
+#data
+<!doctype html><table><i>a<b>b<div>c</i>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <i>
+|       "a"
+|       <b>
+|         "b"
+|     <b>
+|       <div>
+|         <i>
+|           "c"
+|     <table>
+
+#data
+<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <i>
+|       "a"
+|       <b>
+|         "b"
+|     <b>
+|     <div>
+|       <b>
+|         <i>
+|           "c"
+|           <a>
+|             "d"
+|         <a>
+|           "e"
+|       <a>
+|         "f"
+|     <table>
+
+#data
+<!doctype html><table><i>a<div>b<tr>c<b>d</i>e
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <i>
+|       "a"
+|       <div>
+|         "b"
+|     <i>
+|       "c"
+|       <b>
+|         "d"
+|     <b>
+|       "e"
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<!doctype html><table><td><table><i>a<div>b<b>c</i>d
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <i>
+|               "a"
+|             <div>
+|               <i>
+|                 "b"
+|                 <b>
+|                   "c"
+|               <b>
+|                 "d"
+|             <table>
+
+#data
+<!doctype html><body><bgsound>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <bgsound>
+
+#data
+<!doctype html><body><basefont>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <basefont>
+
+#data
+<!doctype html><a><b></a><basefont>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <b>
+|     <basefont>
+
+#data
+<!doctype html><a><b></a><bgsound>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <b>
+|     <bgsound>
+
+#data
+<!doctype html><figcaption><article></figcaption>a
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <figcaption>
+|       <article>
+|     "a"
+
+#data
+<!doctype html><summary><article></summary>a
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <summary>
+|       <article>
+|     "a"
+
+#data
+<!doctype html><p><a><plaintext>b
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <a>
+|     <plaintext>
+|       <a>
+|         "b"
+
+#data
+<!DOCTYPE html><div>a<a></div>b<p>c</p>d
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "a"
+|       <a>
+|     <a>
+|       "b"
+|       <p>
+|         "c"
+|       "d"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests2.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests2.dat
new file mode 100644
index 0000000..60d8592
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests2.dat
@@ -0,0 +1,763 @@
+#data
+<!DOCTYPE html>Test
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "Test"
+
+#data
+<textarea>test</div>test
+#errors
+Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE.
+Line: 1 Col: 24 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "test</div>test"
+
+#data
+<table><td>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase.
+Line: 1 Col: 11 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+
+#data
+<table><td>test</tbody></table>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "test"
+
+#data
+<frame>test
+#errors
+Line: 1 Col: 7 Unexpected start tag (frame). Expected DOCTYPE.
+Line: 1 Col: 7 Unexpected start tag frame. Ignored.
+#document
+| <html>
+|   <head>
+|   <body>
+|     "test"
+
+#data
+<!DOCTYPE html><frameset>test
+#errors
+Line: 1 Col: 29 Unepxected characters in the frameset phase. Characters ignored.
+Line: 1 Col: 29 Expected closing tag. Unexpected end of file.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!DOCTYPE html><frameset><!DOCTYPE html>
+#errors
+Line: 1 Col: 40 Unexpected DOCTYPE. Ignored.
+Line: 1 Col: 40 Expected closing tag. Unexpected end of file.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!DOCTYPE html><font><p><b>test</font>
+#errors
+Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <font>
+|     <p>
+|       <font>
+|         <b>
+|           "test"
+
+#data
+<!DOCTYPE html><dt><div><dd>
+#errors
+Line: 1 Col: 28 Missing end tag (div, dt).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <dt>
+|       <div>
+|     <dd>
+
+#data
+<script></x
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+Line: 1 Col: 11 Unexpected end of file. Expected end tag (script).
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</x"
+|   <body>
+
+#data
+<table><plaintext><td>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 18 Unexpected start tag (plaintext) in table context caused voodoo mode.
+Line: 1 Col: 22 Unexpected end of file. Expected table content.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <plaintext>
+|       "<td>"
+|     <table>
+
+#data
+<plaintext></plaintext>
+#errors
+Line: 1 Col: 11 Unexpected start tag (plaintext). Expected DOCTYPE.
+Line: 1 Col: 23 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <plaintext>
+|       "</plaintext>"
+
+#data
+<!DOCTYPE html><table><tr>TEST
+#errors
+Line: 1 Col: 30 Unexpected non-space characters in table context caused voodoo mode.
+Line: 1 Col: 30 Unexpected end of file. Expected table content.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "TEST"
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<!DOCTYPE html><body t1=1><body t2=2><body t3=3 t4=4>
+#errors
+Line: 1 Col: 37 Unexpected start tag (body).
+Line: 1 Col: 53 Unexpected start tag (body).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     t1="1"
+|     t2="2"
+|     t3="3"
+|     t4="4"
+
+#data
+</b test
+#errors
+Line: 1 Col: 8 Unexpected end of file in attribute name.
+Line: 1 Col: 8 End tag contains unexpected attributes.
+Line: 1 Col: 8 Unexpected end tag (b). Expected DOCTYPE.
+Line: 1 Col: 8 Unexpected end tag (b) after the (implied) root element.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html></b test<b &=&amp>X
+#errors
+Line: 1 Col: 32 Named entity didn't end with ';'.
+Line: 1 Col: 33 End tag contains unexpected attributes.
+Line: 1 Col: 33 Unexpected end tag (b) after the (implied) root element.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "X"
+
+#data
+<!doctypehtml><scrIPt type=text/x-foobar;baz>X</SCRipt
+#errors
+Line: 1 Col: 9 No space after literal string 'DOCTYPE'.
+Line: 1 Col: 54 Unexpected end of file in the tag name.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       type="text/x-foobar;baz"
+|       "X</SCRipt"
+|   <body>
+
+#data
+&
+#errors
+Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     "&"
+
+#data
+&#
+#errors
+Line: 1 Col: 1 Numeric entity expected. Got end of file instead.
+Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     "&#"
+
+#data
+&#X
+#errors
+Line: 1 Col: 3 Numeric entity expected but none found.
+Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     "&#X"
+
+#data
+&#x
+#errors
+Line: 1 Col: 3 Numeric entity expected but none found.
+Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     "&#x"
+
+#data
+&#45
+#errors
+Line: 1 Col: 4 Numeric entity didn't end with ';'.
+Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     "-"
+
+#data
+&x-test
+#errors
+Line: 1 Col: 1 Named entity expected. Got none.
+Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     "&x-test"
+
+#data
+<!doctypehtml><p><li>
+#errors
+Line: 1 Col: 9 No space after literal string 'DOCTYPE'.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <li>
+
+#data
+<!doctypehtml><p><dt>
+#errors
+Line: 1 Col: 9 No space after literal string 'DOCTYPE'.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <dt>
+
+#data
+<!doctypehtml><p><dd>
+#errors
+Line: 1 Col: 9 No space after literal string 'DOCTYPE'.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <dd>
+
+#data
+<!doctypehtml><p><form>
+#errors
+Line: 1 Col: 9 No space after literal string 'DOCTYPE'.
+Line: 1 Col: 23 Expected closing tag. Unexpected end of file.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <form>
+
+#data
+<!DOCTYPE html><p></P>X
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     "X"
+
+#data
+&AMP
+#errors
+Line: 1 Col: 4 Named entity didn't end with ';'.
+Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     "&"
+
+#data
+&AMp;
+#errors
+Line: 1 Col: 1 Named entity expected. Got none.
+Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     "&AMp;"
+
+#data
+<!DOCTYPE html><html><head></head><body><thisISasillyTESTelementNameToMakeSureCrazyTagNamesArePARSEDcorrectLY>
+#errors
+Line: 1 Col: 110 Expected closing tag. Unexpected end of file.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly>
+
+#data
+<!DOCTYPE html>X</body>X
+#errors
+Line: 1 Col: 24 Unexpected non-space characters in the after body phase.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "XX"
+
+#data
+<!DOCTYPE html><!-- X
+#errors
+Line: 1 Col: 21 Unexpected end of file in comment.
+#document
+| <!DOCTYPE html>
+| <!--  X -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><table><caption>test TEST</caption><td>test
+#errors
+Line: 1 Col: 54 Unexpected table cell start tag (td) in the table body phase.
+Line: 1 Col: 58 Expected closing tag. Unexpected end of file.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         "test TEST"
+|       <tbody>
+|         <tr>
+|           <td>
+|             "test"
+
+#data
+<!DOCTYPE html><select><option><optgroup>
+#errors
+Line: 1 Col: 41 Expected closing tag. Unexpected end of file.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+|       <optgroup>
+
+#data
+<!DOCTYPE html><select><optgroup><option></optgroup><option><select><option>
+#errors
+Line: 1 Col: 68 Unexpected select start tag in the select phase treated as select end tag.
+Line: 1 Col: 76 Expected closing tag. Unexpected end of file.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <optgroup>
+|         <option>
+|       <option>
+|     <option>
+
+#data
+<!DOCTYPE html><select><optgroup><option><optgroup>
+#errors
+Line: 1 Col: 51 Expected closing tag. Unexpected end of file.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <optgroup>
+|         <option>
+|       <optgroup>
+
+#data
+<!DOCTYPE html><datalist><option>foo</datalist>bar
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <datalist>
+|       <option>
+|         "foo"
+|     "bar"
+
+#data
+<!DOCTYPE html><font><input><input></font>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <font>
+|       <input>
+|       <input>
+
+#data
+<!DOCTYPE html><!-- XXX - XXX -->
+#errors
+#document
+| <!DOCTYPE html>
+| <!--  XXX - XXX  -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><!-- XXX - XXX
+#errors
+Line: 1 Col: 29 Unexpected end of file in comment (-)
+#document
+| <!DOCTYPE html>
+| <!--  XXX - XXX -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><!-- XXX - XXX - XXX -->
+#errors
+#document
+| <!DOCTYPE html>
+| <!--  XXX - XXX - XXX  -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<isindex test=x name=x>
+#errors
+Line: 1 Col: 23 Unexpected start tag (isindex). Expected DOCTYPE.
+Line: 1 Col: 23 Unexpected start tag isindex. Don't use it!
+#document
+| <html>
+|   <head>
+|   <body>
+|     <form>
+|       <hr>
+|       <label>
+|         "This is a searchable index. Enter search keywords: "
+|         <input>
+|           name="isindex"
+|           test="x"
+|       <hr>
+
+#data
+test
+test
+#errors
+Line: 2 Col: 4 Unexpected non-space characters. Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     "test
+test"
+
+#data
+<!DOCTYPE html><body><title>test</body></title>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <title>
+|       "test</body>"
+
+#data
+<!DOCTYPE html><body><title>X</title><meta name=z><link rel=foo><style>
+x { content:"</style" } </style>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <title>
+|       "X"
+|     <meta>
+|       name="z"
+|     <link>
+|       rel="foo"
+|     <style>
+|       "
+x { content:"</style" } "
+
+#data
+<!DOCTYPE html><select><optgroup></optgroup></select>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <optgroup>
+
+#data
+ 
+ 
+#errors
+Line: 2 Col: 1 Unexpected End of file. Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html>  <html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><script>
+</script>  <title>x</title>  </head>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "
+"
+|     "  "
+|     <title>
+|       "x"
+|     "  "
+|   <body>
+
+#data
+<!DOCTYPE html><html><body><html id=x>
+#errors
+Line: 1 Col: 38 html needs to be the first start tag.
+#document
+| <!DOCTYPE html>
+| <html>
+|   id="x"
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html>X</body><html id="x">
+#errors
+Line: 1 Col: 36 Unexpected start tag token (html) in the after body phase.
+Line: 1 Col: 36 html needs to be the first start tag.
+#document
+| <!DOCTYPE html>
+| <html>
+|   id="x"
+|   <head>
+|   <body>
+|     "X"
+
+#data
+<!DOCTYPE html><head><html id=x>
+#errors
+Line: 1 Col: 32 html needs to be the first start tag.
+#document
+| <!DOCTYPE html>
+| <html>
+|   id="x"
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html>X</html>X
+#errors
+Line: 1 Col: 24 Unexpected non-space characters in the after body phase.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "XX"
+
+#data
+<!DOCTYPE html>X</html> 
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "X "
+
+#data
+<!DOCTYPE html>X</html><p>X
+#errors
+Line: 1 Col: 26 Unexpected start tag (p).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "X"
+|     <p>
+|       "X"
+
+#data
+<!DOCTYPE html>X<p/x/y/z>
+#errors
+Line: 1 Col: 19 Expected a > after the /.
+Line: 1 Col: 21 Solidus (/) incorrectly placed in tag.
+Line: 1 Col: 23 Solidus (/) incorrectly placed in tag.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "X"
+|     <p>
+|       x=""
+|       y=""
+|       z=""
+
+#data
+<!DOCTYPE html><!--x--
+#errors
+Line: 1 Col: 22 Unexpected end of file in comment (--).
+#document
+| <!DOCTYPE html>
+| <!-- x -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><table><tr><td></p></table>
+#errors
+Line: 1 Col: 34 Unexpected end tag (p). Ignored.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <p>
+
+#data
+<!DOCTYPE <!DOCTYPE HTML>><!--<!--x-->-->
+#errors
+Line: 1 Col: 20 Expected space or '>'. Got ''
+Line: 1 Col: 25 Erroneous DOCTYPE.
+Line: 1 Col: 35 Unexpected character in comment found.
+#document
+| <!DOCTYPE <!doctype>
+| <html>
+|   <head>
+|   <body>
+|     ">"
+|     <!-- <!--x -->
+|     "-->"
+
+#data
+<!doctype html><div><form></form><div></div></div>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <form>
+|       <div>
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests20.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests20.dat
new file mode 100644
index 0000000..6bd8256
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests20.dat
@@ -0,0 +1,455 @@
+#data
+<!doctype html><p><button><button>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|       <button>
+
+#data
+<!doctype html><p><button><address>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <address>
+
+#data
+<!doctype html><p><button><blockquote>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <blockquote>
+
+#data
+<!doctype html><p><button><menu>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <menu>
+
+#data
+<!doctype html><p><button><p>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <p>
+
+#data
+<!doctype html><p><button><ul>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <ul>
+
+#data
+<!doctype html><p><button><h1>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <h1>
+
+#data
+<!doctype html><p><button><h6>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <h6>
+
+#data
+<!doctype html><p><button><listing>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <listing>
+
+#data
+<!doctype html><p><button><pre>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <pre>
+
+#data
+<!doctype html><p><button><form>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <form>
+
+#data
+<!doctype html><p><button><li>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <li>
+
+#data
+<!doctype html><p><button><dd>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <dd>
+
+#data
+<!doctype html><p><button><dt>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <dt>
+
+#data
+<!doctype html><p><button><plaintext>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <plaintext>
+
+#data
+<!doctype html><p><button><table>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <table>
+
+#data
+<!doctype html><p><button><hr>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <hr>
+
+#data
+<!doctype html><p><button><xmp>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <xmp>
+
+#data
+<!doctype html><p><button></p>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <p>
+
+#data
+<!doctype html><address><button></address>a
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <address>
+|       <button>
+|     "a"
+
+#data
+<!doctype html><address><button></address>a
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <address>
+|       <button>
+|     "a"
+
+#data
+<p><table></p>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <p>
+|       <table>
+
+#data
+<!doctype html><svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+
+#data
+<!doctype html><p><figcaption>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <figcaption>
+
+#data
+<!doctype html><p><summary>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <summary>
+
+#data
+<!doctype html><form><table><form>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <form>
+|       <table>
+
+#data
+<!doctype html><table><form><form>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <form>
+
+#data
+<!doctype html><table><form></table><form>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <form>
+
+#data
+<!doctype html><svg><foreignObject><p>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg foreignObject>
+|         <p>
+
+#data
+<!doctype html><svg><title>abc
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg title>
+|         "abc"
+
+#data
+<option><span><option>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <option>
+|       <span>
+|         <option>
+
+#data
+<option><option>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <option>
+|     <option>
+
+#data
+<math><annotation-xml><div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|     <div>
+
+#data
+<math><annotation-xml encoding="application/svg+xml"><div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         encoding="application/svg+xml"
+|     <div>
+
+#data
+<math><annotation-xml encoding="application/xhtml+xml"><div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         encoding="application/xhtml+xml"
+|         <div>
+
+#data
+<math><annotation-xml encoding="aPPlication/xhtmL+xMl"><div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         encoding="aPPlication/xhtmL+xMl"
+|         <div>
+
+#data
+<math><annotation-xml encoding="text/html"><div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         encoding="text/html"
+|         <div>
+
+#data
+<math><annotation-xml encoding="Text/htmL"><div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         encoding="Text/htmL"
+|         <div>
+
+#data
+<math><annotation-xml encoding=" text/html "><div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         encoding=" text/html "
+|     <div>
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests21.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests21.dat
new file mode 100644
index 0000000..1260ec0
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests21.dat
@@ -0,0 +1,221 @@
+#data
+<svg><![CDATA[foo]]>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "foo"
+
+#data
+<math><![CDATA[foo]]>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       "foo"
+
+#data
+<div><![CDATA[foo]]>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <!-- [CDATA[foo]] -->
+
+#data
+<svg><![CDATA[foo
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "foo"
+
+#data
+<svg><![CDATA[foo
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "foo"
+
+#data
+<svg><![CDATA[
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+
+#data
+<svg><![CDATA[]]>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+
+#data
+<svg><![CDATA[]] >]]>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "]] >"
+
+#data
+<svg><![CDATA[]] >]]>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "]] >"
+
+#data
+<svg><![CDATA[]]
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "]]"
+
+#data
+<svg><![CDATA[]
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "]"
+
+#data
+<svg><![CDATA[]>a
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "]>a"
+
+#data
+<svg><foreignObject><div><![CDATA[foo]]>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg foreignObject>
+|         <div>
+|           <!-- [CDATA[foo]] -->
+
+#data
+<svg><![CDATA[<svg>]]>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "<svg>"
+
+#data
+<svg><![CDATA[</svg>a]]>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "</svg>a"
+
+#data
+<svg><![CDATA[<svg>a
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "<svg>a"
+
+#data
+<svg><![CDATA[</svg>a
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "</svg>a"
+
+#data
+<svg><![CDATA[<svg>]]><path>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "<svg>"
+|       <svg path>
+
+#data
+<svg><![CDATA[<svg>]]></path>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "<svg>"
+
+#data
+<svg><![CDATA[<svg>]]><!--path-->
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "<svg>"
+|       <!-- path -->
+
+#data
+<svg><![CDATA[<svg>]]>path
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "<svg>path"
+
+#data
+<svg><![CDATA[<!--svg-->]]>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "<!--svg-->"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests22.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests22.dat
new file mode 100644
index 0000000..aab27b2
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests22.dat
@@ -0,0 +1,157 @@
+#data
+<a><b><big><em><strong><div>X</a>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <b>
+|         <big>
+|           <em>
+|             <strong>
+|     <big>
+|       <em>
+|         <strong>
+|           <div>
+|             <a>
+|               "X"
+
+#data
+<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8>A</a>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <b>
+|     <b>
+|       <div>
+|         id="1"
+|         <a>
+|         <div>
+|           id="2"
+|           <a>
+|           <div>
+|             id="3"
+|             <a>
+|             <div>
+|               id="4"
+|               <a>
+|               <div>
+|                 id="5"
+|                 <a>
+|                 <div>
+|                   id="6"
+|                   <a>
+|                   <div>
+|                     id="7"
+|                     <a>
+|                     <div>
+|                       id="8"
+|                       <a>
+|                         "A"
+
+#data
+<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8><div id=9>A</a>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <b>
+|     <b>
+|       <div>
+|         id="1"
+|         <a>
+|         <div>
+|           id="2"
+|           <a>
+|           <div>
+|             id="3"
+|             <a>
+|             <div>
+|               id="4"
+|               <a>
+|               <div>
+|                 id="5"
+|                 <a>
+|                 <div>
+|                   id="6"
+|                   <a>
+|                   <div>
+|                     id="7"
+|                     <a>
+|                     <div>
+|                       id="8"
+|                       <a>
+|                         <div>
+|                           id="9"
+|                           "A"
+
+#data
+<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8><div id=9><div id=10>A</a>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <b>
+|     <b>
+|       <div>
+|         id="1"
+|         <a>
+|         <div>
+|           id="2"
+|           <a>
+|           <div>
+|             id="3"
+|             <a>
+|             <div>
+|               id="4"
+|               <a>
+|               <div>
+|                 id="5"
+|                 <a>
+|                 <div>
+|                   id="6"
+|                   <a>
+|                   <div>
+|                     id="7"
+|                     <a>
+|                     <div>
+|                       id="8"
+|                       <a>
+|                         <div>
+|                           id="9"
+|                           <div>
+|                             id="10"
+|                             "A"
+
+#data
+<cite><b><cite><i><cite><i><cite><i><div>X</b>TEST
+#errors
+Line: 1 Col: 6 Unexpected start tag (cite). Expected DOCTYPE.
+Line: 1 Col: 46 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 50 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <cite>
+|       <b>
+|         <cite>
+|           <i>
+|             <cite>
+|               <i>
+|                 <cite>
+|                   <i>
+|       <i>
+|         <i>
+|           <div>
+|             <b>
+|               "X"
+|             "TEST"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests23.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests23.dat
new file mode 100644
index 0000000..34d2a73
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests23.dat
@@ -0,0 +1,155 @@
+#data
+<p><font size=4><font color=red><font size=4><font size=4><font size=4><font size=4><font size=4><font color=red><p>X
+#errors
+3: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”.
+116: Unclosed elements.
+117: End of file seen and there were open elements.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <font>
+|         size="4"
+|         <font>
+|           color="red"
+|           <font>
+|             size="4"
+|             <font>
+|               size="4"
+|               <font>
+|                 size="4"
+|                 <font>
+|                   size="4"
+|                   <font>
+|                     size="4"
+|                     <font>
+|                       color="red"
+|     <p>
+|       <font>
+|         color="red"
+|         <font>
+|           size="4"
+|           <font>
+|             size="4"
+|             <font>
+|               size="4"
+|               <font>
+|                 color="red"
+|                 "X"
+
+#data
+<p><font size=4><font size=4><font size=4><font size=4><p>X
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <font>
+|         size="4"
+|         <font>
+|           size="4"
+|           <font>
+|             size="4"
+|             <font>
+|               size="4"
+|     <p>
+|       <font>
+|         size="4"
+|         <font>
+|           size="4"
+|           <font>
+|             size="4"
+|             "X"
+
+#data
+<p><font size=4><font size=4><font size=4><font size="5"><font size=4><p>X
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <font>
+|         size="4"
+|         <font>
+|           size="4"
+|           <font>
+|             size="4"
+|             <font>
+|               size="5"
+|               <font>
+|                 size="4"
+|     <p>
+|       <font>
+|         size="4"
+|         <font>
+|           size="4"
+|           <font>
+|             size="5"
+|             <font>
+|               size="4"
+|               "X"
+
+#data
+<p><font size=4 id=a><font size=4 id=b><font size=4><font size=4><p>X
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <font>
+|         id="a"
+|         size="4"
+|         <font>
+|           id="b"
+|           size="4"
+|           <font>
+|             size="4"
+|             <font>
+|               size="4"
+|     <p>
+|       <font>
+|         id="a"
+|         size="4"
+|         <font>
+|           id="b"
+|           size="4"
+|           <font>
+|             size="4"
+|             <font>
+|               size="4"
+|               "X"
+
+#data
+<p><b id=a><b id=a><b id=a><b><object><b id=a><b id=a>X</object><p>Y
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <b>
+|         id="a"
+|         <b>
+|           id="a"
+|           <b>
+|             id="a"
+|             <b>
+|               <object>
+|                 <b>
+|                   id="a"
+|                   <b>
+|                     id="a"
+|                     "X"
+|     <p>
+|       <b>
+|         id="a"
+|         <b>
+|           id="a"
+|           <b>
+|             id="a"
+|             <b>
+|               "Y"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests24.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests24.dat
new file mode 100644
index 0000000..f6dc7eb
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests24.dat
@@ -0,0 +1,79 @@
+#data
+<!DOCTYPE html>&NotEqualTilde;
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "≂̸"
+
+#data
+<!DOCTYPE html>&NotEqualTilde;A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "≂̸A"
+
+#data
+<!DOCTYPE html>&ThickSpace;
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "  "
+
+#data
+<!DOCTYPE html>&ThickSpace;A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "  A"
+
+#data
+<!DOCTYPE html>&NotSubset;
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "⊂⃒"
+
+#data
+<!DOCTYPE html>&NotSubset;A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "⊂⃒A"
+
+#data
+<!DOCTYPE html>&Gopf;
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "𝔾"
+
+#data
+<!DOCTYPE html>&Gopf;A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "𝔾A"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests25.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests25.dat
new file mode 100644
index 0000000..00de729
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests25.dat
@@ -0,0 +1,219 @@
+#data
+<!DOCTYPE html><body><foo>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <foo>
+|       "A"
+
+#data
+<!DOCTYPE html><body><area>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <area>
+|     "A"
+
+#data
+<!DOCTYPE html><body><base>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <base>
+|     "A"
+
+#data
+<!DOCTYPE html><body><basefont>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <basefont>
+|     "A"
+
+#data
+<!DOCTYPE html><body><bgsound>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <bgsound>
+|     "A"
+
+#data
+<!DOCTYPE html><body><br>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <br>
+|     "A"
+
+#data
+<!DOCTYPE html><body><col>A
+#errors
+26: Stray start tag “col”.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "A"
+
+#data
+<!DOCTYPE html><body><command>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <command>
+|     "A"
+
+#data
+<!DOCTYPE html><body><embed>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <embed>
+|     "A"
+
+#data
+<!DOCTYPE html><body><frame>A
+#errors
+26: Stray start tag “frame”.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "A"
+
+#data
+<!DOCTYPE html><body><hr>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <hr>
+|     "A"
+
+#data
+<!DOCTYPE html><body><img>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <img>
+|     "A"
+
+#data
+<!DOCTYPE html><body><input>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <input>
+|     "A"
+
+#data
+<!DOCTYPE html><body><keygen>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <keygen>
+|     "A"
+
+#data
+<!DOCTYPE html><body><link>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <link>
+|     "A"
+
+#data
+<!DOCTYPE html><body><meta>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <meta>
+|     "A"
+
+#data
+<!DOCTYPE html><body><param>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <param>
+|     "A"
+
+#data
+<!DOCTYPE html><body><source>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <source>
+|     "A"
+
+#data
+<!DOCTYPE html><body><track>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <track>
+|     "A"
+
+#data
+<!DOCTYPE html><body><wbr>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <wbr>
+|     "A"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests26.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests26.dat
new file mode 100644
index 0000000..fae11ff
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests26.dat
@@ -0,0 +1,313 @@
+#data
+<!DOCTYPE html><body><a href='#1'><nobr>1<nobr></a><br><a href='#2'><nobr>2<nobr></a><br><a href='#3'><nobr>3<nobr></a>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       href="#1"
+|       <nobr>
+|         "1"
+|       <nobr>
+|     <nobr>
+|       <br>
+|       <a>
+|         href="#2"
+|     <a>
+|       href="#2"
+|       <nobr>
+|         "2"
+|       <nobr>
+|     <nobr>
+|       <br>
+|       <a>
+|         href="#3"
+|     <a>
+|       href="#3"
+|       <nobr>
+|         "3"
+|       <nobr>
+
+#data
+<!DOCTYPE html><body><b><nobr>1<nobr></b><i><nobr>2<nobr></i>3
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <nobr>
+|         "1"
+|       <nobr>
+|     <nobr>
+|       <i>
+|     <i>
+|       <nobr>
+|         "2"
+|       <nobr>
+|     <nobr>
+|       "3"
+
+#data
+<!DOCTYPE html><body><b><nobr>1<table><nobr></b><i><nobr>2<nobr></i>3
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <nobr>
+|         "1"
+|         <nobr>
+|           <i>
+|         <i>
+|           <nobr>
+|             "2"
+|           <nobr>
+|         <nobr>
+|           "3"
+|         <table>
+
+#data
+<!DOCTYPE html><body><b><nobr>1<table><tr><td><nobr></b><i><nobr>2<nobr></i>3
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <nobr>
+|         "1"
+|         <table>
+|           <tbody>
+|             <tr>
+|               <td>
+|                 <nobr>
+|                   <i>
+|                 <i>
+|                   <nobr>
+|                     "2"
+|                   <nobr>
+|                 <nobr>
+|                   "3"
+
+#data
+<!DOCTYPE html><body><b><nobr>1<div><nobr></b><i><nobr>2<nobr></i>3
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <nobr>
+|         "1"
+|     <div>
+|       <b>
+|         <nobr>
+|         <nobr>
+|       <nobr>
+|         <i>
+|       <i>
+|         <nobr>
+|           "2"
+|         <nobr>
+|       <nobr>
+|         "3"
+
+#data
+<!DOCTYPE html><body><b><nobr>1<nobr></b><div><i><nobr>2<nobr></i>3
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <nobr>
+|         "1"
+|       <nobr>
+|     <div>
+|       <nobr>
+|         <i>
+|       <i>
+|         <nobr>
+|           "2"
+|         <nobr>
+|       <nobr>
+|         "3"
+
+#data
+<!DOCTYPE html><body><b><nobr>1<nobr><ins></b><i><nobr>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <nobr>
+|         "1"
+|       <nobr>
+|         <ins>
+|     <nobr>
+|       <i>
+|     <i>
+|       <nobr>
+
+#data
+<!DOCTYPE html><body><b><nobr>1<ins><nobr></b><i>2
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <nobr>
+|         "1"
+|         <ins>
+|       <nobr>
+|     <nobr>
+|       <i>
+|         "2"
+
+#data
+<!DOCTYPE html><body><b>1<nobr></b><i><nobr>2</i>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       "1"
+|       <nobr>
+|     <nobr>
+|       <i>
+|     <i>
+|       <nobr>
+|         "2"
+
+#data
+<p><code x</code></p>
+
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <code>
+|         code=""
+|         x<=""
+|     <code>
+|       code=""
+|       x<=""
+|       "
+"
+
+#data
+<!DOCTYPE html><svg><foreignObject><p><i></p>a
+#errors
+45: End tag “p” seen, but there were open elements.
+41: Unclosed element “i”.
+46: End of file seen and there were open elements.
+35: Unclosed element “foreignObject”.
+20: Unclosed element “svg”.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg foreignObject>
+|         <p>
+|           <i>
+|         <i>
+|           "a"
+
+#data
+<!DOCTYPE html><table><tr><td><svg><foreignObject><p><i></p>a
+#errors
+56: End tag “p” seen, but there were open elements.
+52: Unclosed element “i”.
+57: End of file seen and there were open elements.
+46: Unclosed element “foreignObject”.
+31: Unclosed element “svg”.
+22: Unclosed element “table”.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <svg svg>
+|               <svg foreignObject>
+|                 <p>
+|                   <i>
+|                 <i>
+|                   "a"
+
+#data
+<!DOCTYPE html><math><mtext><p><i></p>a
+#errors
+38: End tag “p” seen, but there were open elements.
+34: Unclosed element “i”.
+39: End of file in a foreign namespace context.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mtext>
+|         <p>
+|           <i>
+|         <i>
+|           "a"
+
+#data
+<!DOCTYPE html><table><tr><td><math><mtext><p><i></p>a
+#errors
+53: End tag “p” seen, but there were open elements.
+49: Unclosed element “i”.
+54: End of file in a foreign namespace context.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <math math>
+|               <math mtext>
+|                 <p>
+|                   <i>
+|                 <i>
+|                   "a"
+
+#data
+<!DOCTYPE html><body><div><!/div>a
+#errors
+29: Bogus comment.
+34: End of file seen and there were open elements.
+26: Unclosed element “div”.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <!-- /div -->
+|       "a"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests3.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests3.dat
new file mode 100644
index 0000000..38dc501
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests3.dat
@@ -0,0 +1,305 @@
+#data
+<head></head><style></style>
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+Line: 1 Col: 20 Unexpected start tag (style) that can be in head. Moved.
+#document
+| <html>
+|   <head>
+|     <style>
+|   <body>
+
+#data
+<head></head><script></script>
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+Line: 1 Col: 21 Unexpected start tag (script) that can be in head. Moved.
+#document
+| <html>
+|   <head>
+|     <script>
+|   <body>
+
+#data
+<head></head><!-- --><style></style><!-- --><script></script>
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+Line: 1 Col: 28 Unexpected start tag (style) that can be in head. Moved.
+#document
+| <html>
+|   <head>
+|     <style>
+|     <script>
+|   <!--   -->
+|   <!--   -->
+|   <body>
+
+#data
+<head></head><!-- -->x<style></style><!-- --><script></script>
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <!--   -->
+|   <body>
+|     "x"
+|     <style>
+|     <!--   -->
+|     <script>
+
+#data
+<!DOCTYPE html><html><head></head><body><pre>
+</pre></body></html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <pre>
+
+#data
+<!DOCTYPE html><html><head></head><body><pre>
+foo</pre></body></html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <pre>
+|       "foo"
+
+#data
+<!DOCTYPE html><html><head></head><body><pre>
+
+foo</pre></body></html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <pre>
+|       "
+foo"
+
+#data
+<!DOCTYPE html><html><head></head><body><pre>
+foo
+</pre></body></html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <pre>
+|       "foo
+"
+
+#data
+<!DOCTYPE html><html><head></head><body><pre>x</pre><span>
+</span></body></html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <pre>
+|       "x"
+|     <span>
+|       "
+"
+
+#data
+<!DOCTYPE html><html><head></head><body><pre>x
+y</pre></body></html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <pre>
+|       "x
+y"
+
+#data
+<!DOCTYPE html><html><head></head><body><pre>x<div>
+y</pre></body></html>
+#errors
+Line: 2 Col: 7 End tag (pre) seen too early. Expected other end tag.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <pre>
+|       "x"
+|       <div>
+|         "
+y"
+
+#data
+<!DOCTYPE html><pre>&#x0a;&#x0a;A</pre>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <pre>
+|       "
+A"
+
+#data
+<!DOCTYPE html><HTML><META><HEAD></HEAD></HTML>
+#errors
+Line: 1 Col: 33 Unexpected start tag head in existing head. Ignored.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <meta>
+|   <body>
+
+#data
+<!DOCTYPE html><HTML><HEAD><head></HEAD></HTML>
+#errors
+Line: 1 Col: 33 Unexpected start tag head in existing head. Ignored.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+
+#data
+<textarea>foo<span>bar</span><i>baz
+#errors
+Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE.
+Line: 1 Col: 35 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "foo<span>bar</span><i>baz"
+
+#data
+<title>foo<span>bar</em><i>baz
+#errors
+Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE.
+Line: 1 Col: 30 Unexpected end of file. Expected end tag (title).
+#document
+| <html>
+|   <head>
+|     <title>
+|       "foo<span>bar</em><i>baz"
+|   <body>
+
+#data
+<!DOCTYPE html><textarea>
+</textarea>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+
+#data
+<!DOCTYPE html><textarea>
+foo</textarea>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "foo"
+
+#data
+<!DOCTYPE html><textarea>
+
+foo</textarea>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "
+foo"
+
+#data
+<!DOCTYPE html><html><head></head><body><ul><li><div><p><li></ul></body></html>
+#errors
+Line: 1 Col: 60 Missing end tag (div, li).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <ul>
+|       <li>
+|         <div>
+|           <p>
+|       <li>
+
+#data
+<!doctype html><nobr><nobr><nobr>
+#errors
+Line: 1 Col: 27 Unexpected start tag (nobr) implies end tag (nobr).
+Line: 1 Col: 33 Unexpected start tag (nobr) implies end tag (nobr).
+Line: 1 Col: 33 Expected closing tag. Unexpected end of file.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <nobr>
+|     <nobr>
+|     <nobr>
+
+#data
+<!doctype html><nobr><nobr></nobr><nobr>
+#errors
+Line: 1 Col: 27 Unexpected start tag (nobr) implies end tag (nobr).
+Line: 1 Col: 40 Expected closing tag. Unexpected end of file.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <nobr>
+|     <nobr>
+|     <nobr>
+
+#data
+<!doctype html><html><body><p><table></table></body></html>
+#errors
+Not known
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <table>
+
+#data
+<p><table></table>
+#errors
+Not known
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <table>
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests4.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests4.dat
new file mode 100644
index 0000000..3c50632
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests4.dat
@@ -0,0 +1,59 @@
+#data
+direct div content
+#errors
+#document-fragment
+div
+#document
+| "direct div content"
+
+#data
+direct textarea content
+#errors
+#document-fragment
+textarea
+#document
+| "direct textarea content"
+
+#data
+textarea content with <em>pseudo</em> <foo>markup
+#errors
+#document-fragment
+textarea
+#document
+| "textarea content with <em>pseudo</em> <foo>markup"
+
+#data
+this is &#x0043;DATA inside a <style> element
+#errors
+#document-fragment
+style
+#document
+| "this is &#x0043;DATA inside a <style> element"
+
+#data
+</plaintext>
+#errors
+#document-fragment
+plaintext
+#document
+| "</plaintext>"
+
+#data
+setting html's innerHTML
+#errors
+Line: 1 Col: 24 Unexpected EOF in inner html mode.
+#document-fragment
+html
+#document
+| <head>
+| <body>
+|   "setting html's innerHTML"
+
+#data
+<title>setting head's innerHTML</title>
+#errors
+#document-fragment
+head
+#document
+| <title>
+|   "setting head's innerHTML"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests5.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests5.dat
new file mode 100644
index 0000000..d7b5128
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests5.dat
@@ -0,0 +1,191 @@
+#data
+<style> <!-- </style>x
+#errors
+Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE.
+Line: 1 Col: 22 Unexpected end of file. Expected end tag (style).
+#document
+| <html>
+|   <head>
+|     <style>
+|       " <!-- "
+|   <body>
+|     "x"
+
+#data
+<style> <!-- </style> --> </style>x
+#errors
+Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <style>
+|       " <!-- "
+|     " "
+|   <body>
+|     "--> x"
+
+#data
+<style> <!--> </style>x
+#errors
+Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <style>
+|       " <!--> "
+|   <body>
+|     "x"
+
+#data
+<style> <!---> </style>x
+#errors
+Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <style>
+|       " <!---> "
+|   <body>
+|     "x"
+
+#data
+<iframe> <!---> </iframe>x
+#errors
+Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <iframe>
+|       " <!---> "
+|     "x"
+
+#data
+<iframe> <!--- </iframe>->x</iframe> --> </iframe>x
+#errors
+Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <iframe>
+|       " <!--- "
+|     "->x --> x"
+
+#data
+<script> <!-- </script> --> </script>x
+#errors
+Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <script>
+|       " <!-- "
+|     " "
+|   <body>
+|     "--> x"
+
+#data
+<title> <!-- </title> --> </title>x
+#errors
+Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <title>
+|       " <!-- "
+|     " "
+|   <body>
+|     "--> x"
+
+#data
+<textarea> <!--- </textarea>->x</textarea> --> </textarea>x
+#errors
+Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       " <!--- "
+|     "->x --> x"
+
+#data
+<style> <!</-- </style>x
+#errors
+Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <style>
+|       " <!</-- "
+|   <body>
+|     "x"
+
+#data
+<p><xmp></xmp>
+#errors
+XXX: Unknown
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <xmp>
+
+#data
+<xmp> <!-- > --> </xmp>
+#errors
+Line: 1 Col: 5 Unexpected start tag (xmp). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <xmp>
+|       " <!-- > --> "
+
+#data
+<title>&amp;</title>
+#errors
+Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <title>
+|       "&"
+|   <body>
+
+#data
+<title><!--&amp;--></title>
+#errors
+Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <title>
+|       "<!--&-->"
+|   <body>
+
+#data
+<title><!--</title>
+#errors
+Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE.
+Line: 1 Col: 19 Unexpected end of file. Expected end tag (title).
+#document
+| <html>
+|   <head>
+|     <title>
+|       "<!--"
+|   <body>
+
+#data
+<noscript><!--</noscript>--></noscript>
+#errors
+Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       "<!--"
+|   <body>
+|     "-->"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests6.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests6.dat
new file mode 100644
index 0000000..f28ece4
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests6.dat
@@ -0,0 +1,663 @@
+#data
+<!doctype html></head> <head>
+#errors
+Line: 1 Col: 29 Unexpected start tag head. Ignored.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   " "
+|   <body>
+
+#data
+<!doctype html><form><div></form><div>
+#errors
+33: End tag "form" seen but there were unclosed elements.
+38: End of file seen and there were open elements.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <form>
+|       <div>
+|         <div>
+
+#data
+<!doctype html><title>&amp;</title>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <title>
+|       "&"
+|   <body>
+
+#data
+<!doctype html><title><!--&amp;--></title>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <title>
+|       "<!--&-->"
+|   <body>
+
+#data
+<!doctype>
+#errors
+Line: 1 Col: 9 No space after literal string 'DOCTYPE'.
+Line: 1 Col: 10 Unexpected > character. Expected DOCTYPE name.
+Line: 1 Col: 10 Erroneous DOCTYPE.
+#document
+| <!DOCTYPE >
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!---x
+#errors
+Line: 1 Col: 6 Unexpected end of file in comment.
+Line: 1 Col: 6 Unexpected End of file. Expected DOCTYPE.
+#document
+| <!-- -x -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<body>
+<div>
+#errors
+Line: 1 Col: 6 Unexpected start tag (body).
+Line: 2 Col: 5 Expected closing tag. Unexpected end of file.
+#document-fragment
+div
+#document
+| "
+"
+| <div>
+
+#data
+<frameset></frameset>
+foo
+#errors
+Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE.
+Line: 2 Col: 3 Unexpected non-space characters in the after frameset phase. Ignored.
+#document
+| <html>
+|   <head>
+|   <frameset>
+|   "
+"
+
+#data
+<frameset></frameset>
+<noframes>
+#errors
+Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE.
+Line: 2 Col: 10 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <frameset>
+|   "
+"
+|   <noframes>
+
+#data
+<frameset></frameset>
+<div>
+#errors
+Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE.
+Line: 2 Col: 5 Unexpected start tag (div) in the after frameset phase. Ignored.
+#document
+| <html>
+|   <head>
+|   <frameset>
+|   "
+"
+
+#data
+<frameset></frameset>
+</html>
+#errors
+Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <frameset>
+|   "
+"
+
+#data
+<frameset></frameset>
+</div>
+#errors
+Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE.
+Line: 2 Col: 6 Unexpected end tag (div) in the after frameset phase. Ignored.
+#document
+| <html>
+|   <head>
+|   <frameset>
+|   "
+"
+
+#data
+<form><form>
+#errors
+Line: 1 Col: 6 Unexpected start tag (form). Expected DOCTYPE.
+Line: 1 Col: 12 Unexpected start tag (form).
+Line: 1 Col: 12 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <form>
+
+#data
+<button><button>
+#errors
+Line: 1 Col: 8 Unexpected start tag (button). Expected DOCTYPE.
+Line: 1 Col: 16 Unexpected start tag (button) implies end tag (button).
+Line: 1 Col: 16 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <button>
+|     <button>
+
+#data
+<table><tr><td></th>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 20 Unexpected end tag (th). Ignored.
+Line: 1 Col: 20 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+
+#data
+<table><caption><td>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 20 Unexpected end tag (td). Ignored.
+Line: 1 Col: 20 Unexpected table cell start tag (td) in the table body phase.
+Line: 1 Col: 20 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|       <tbody>
+|         <tr>
+|           <td>
+
+#data
+<table><caption><div>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 21 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <div>
+
+#data
+</caption><div>
+#errors
+Line: 1 Col: 10 Unexpected end tag (caption). Ignored.
+Line: 1 Col: 15 Expected closing tag. Unexpected end of file.
+#document-fragment
+caption
+#document
+| <div>
+
+#data
+<table><caption><div></caption>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 31 Unexpected end tag (caption). Missing end tag (div).
+Line: 1 Col: 31 Unexpected end of file. Expected table content.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <div>
+
+#data
+<table><caption></table>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 24 Unexpected end table tag in caption. Generates implied end caption.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+
+#data
+</table><div>
+#errors
+Line: 1 Col: 8 Unexpected end table tag in caption. Generates implied end caption.
+Line: 1 Col: 8 Unexpected end tag (caption). Ignored.
+Line: 1 Col: 13 Expected closing tag. Unexpected end of file.
+#document-fragment
+caption
+#document
+| <div>
+
+#data
+<table><caption></body></col></colgroup></html></tbody></td></tfoot></th></thead></tr>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 23 Unexpected end tag (body). Ignored.
+Line: 1 Col: 29 Unexpected end tag (col). Ignored.
+Line: 1 Col: 40 Unexpected end tag (colgroup). Ignored.
+Line: 1 Col: 47 Unexpected end tag (html). Ignored.
+Line: 1 Col: 55 Unexpected end tag (tbody). Ignored.
+Line: 1 Col: 60 Unexpected end tag (td). Ignored.
+Line: 1 Col: 68 Unexpected end tag (tfoot). Ignored.
+Line: 1 Col: 73 Unexpected end tag (th). Ignored.
+Line: 1 Col: 81 Unexpected end tag (thead). Ignored.
+Line: 1 Col: 86 Unexpected end tag (tr). Ignored.
+Line: 1 Col: 86 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+
+#data
+<table><caption><div></div>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 27 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <div>
+
+#data
+<table><tr><td></body></caption></col></colgroup></html>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 22 Unexpected end tag (body). Ignored.
+Line: 1 Col: 32 Unexpected end tag (caption). Ignored.
+Line: 1 Col: 38 Unexpected end tag (col). Ignored.
+Line: 1 Col: 49 Unexpected end tag (colgroup). Ignored.
+Line: 1 Col: 56 Unexpected end tag (html). Ignored.
+Line: 1 Col: 56 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+
+#data
+</table></tbody></tfoot></thead></tr><div>
+#errors
+Line: 1 Col: 8 Unexpected end tag (table). Ignored.
+Line: 1 Col: 16 Unexpected end tag (tbody). Ignored.
+Line: 1 Col: 24 Unexpected end tag (tfoot). Ignored.
+Line: 1 Col: 32 Unexpected end tag (thead). Ignored.
+Line: 1 Col: 37 Unexpected end tag (tr). Ignored.
+Line: 1 Col: 42 Expected closing tag. Unexpected end of file.
+#document-fragment
+td
+#document
+| <div>
+
+#data
+<table><colgroup>foo
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 20 Unexpected non-space characters in table context caused voodoo mode.
+Line: 1 Col: 20 Unexpected end of file. Expected table content.
+#document
+| <html>
+|   <head>
+|   <body>
+|     "foo"
+|     <table>
+|       <colgroup>
+
+#data
+foo<col>
+#errors
+Line: 1 Col: 3 Unexpected end tag (colgroup). Ignored.
+#document-fragment
+colgroup
+#document
+| <col>
+
+#data
+<table><colgroup></col>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 23 This element (col) has no end tag.
+Line: 1 Col: 23 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <colgroup>
+
+#data
+<frameset><div>
+#errors
+Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE.
+Line: 1 Col: 15 Unexpected start tag token (div) in the frameset phase. Ignored.
+Line: 1 Col: 15 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+</frameset><frame>
+#errors
+Line: 1 Col: 11 Unexpected end tag token (frameset) in the frameset phase (innerHTML).
+#document-fragment
+frameset
+#document
+| <frame>
+
+#data
+<frameset></div>
+#errors
+Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE.
+Line: 1 Col: 16 Unexpected end tag token (div) in the frameset phase. Ignored.
+Line: 1 Col: 16 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+</body><div>
+#errors
+Line: 1 Col: 7 Unexpected end tag (body). Ignored.
+Line: 1 Col: 12 Expected closing tag. Unexpected end of file.
+#document-fragment
+body
+#document
+| <div>
+
+#data
+<table><tr><div>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 16 Unexpected start tag (div) in table context caused voodoo mode.
+Line: 1 Col: 16 Unexpected end of file. Expected table content.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+</tr><td>
+#errors
+Line: 1 Col: 5 Unexpected end tag (tr). Ignored.
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+</tbody></tfoot></thead><td>
+#errors
+Line: 1 Col: 8 Unexpected end tag (tbody). Ignored.
+Line: 1 Col: 16 Unexpected end tag (tfoot). Ignored.
+Line: 1 Col: 24 Unexpected end tag (thead). Ignored.
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+<table><tr><div><td>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 16 Unexpected start tag (div) in table context caused voodoo mode.
+Line: 1 Col: 20 Unexpected implied end tag (div) in the table row phase.
+Line: 1 Col: 20 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+
+#data
+<caption><col><colgroup><tbody><tfoot><thead><tr>
+#errors
+Line: 1 Col: 9 Unexpected start tag (caption).
+Line: 1 Col: 14 Unexpected start tag (col).
+Line: 1 Col: 24 Unexpected start tag (colgroup).
+Line: 1 Col: 31 Unexpected start tag (tbody).
+Line: 1 Col: 38 Unexpected start tag (tfoot).
+Line: 1 Col: 45 Unexpected start tag (thead).
+Line: 1 Col: 49 Unexpected end of file. Expected table content.
+#document-fragment
+tbody
+#document
+| <tr>
+
+#data
+<table><tbody></thead>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 22 Unexpected end tag (thead) in the table body phase. Ignored.
+Line: 1 Col: 22 Unexpected end of file. Expected table content.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+
+#data
+</table><tr>
+#errors
+Line: 1 Col: 8 Unexpected end tag (table). Ignored.
+Line: 1 Col: 12 Unexpected end of file. Expected table content.
+#document-fragment
+tbody
+#document
+| <tr>
+
+#data
+<table><tbody></body></caption></col></colgroup></html></td></th></tr>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 21 Unexpected end tag (body) in the table body phase. Ignored.
+Line: 1 Col: 31 Unexpected end tag (caption) in the table body phase. Ignored.
+Line: 1 Col: 37 Unexpected end tag (col) in the table body phase. Ignored.
+Line: 1 Col: 48 Unexpected end tag (colgroup) in the table body phase. Ignored.
+Line: 1 Col: 55 Unexpected end tag (html) in the table body phase. Ignored.
+Line: 1 Col: 60 Unexpected end tag (td) in the table body phase. Ignored.
+Line: 1 Col: 65 Unexpected end tag (th) in the table body phase. Ignored.
+Line: 1 Col: 70 Unexpected end tag (tr) in the table body phase. Ignored.
+Line: 1 Col: 70 Unexpected end of file. Expected table content.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+
+#data
+<table><tbody></div>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 20 Unexpected end tag (div) in table context caused voodoo mode.
+Line: 1 Col: 20 End tag (div) seen too early. Expected other end tag.
+Line: 1 Col: 20 Unexpected end of file. Expected table content.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+
+#data
+<table><table>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 14 Unexpected start tag (table) implies end tag (table).
+Line: 1 Col: 14 Unexpected end of file. Expected table content.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|     <table>
+
+#data
+<table></body></caption></col></colgroup></html></tbody></td></tfoot></th></thead></tr>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 14 Unexpected end tag (body). Ignored.
+Line: 1 Col: 24 Unexpected end tag (caption). Ignored.
+Line: 1 Col: 30 Unexpected end tag (col). Ignored.
+Line: 1 Col: 41 Unexpected end tag (colgroup). Ignored.
+Line: 1 Col: 48 Unexpected end tag (html). Ignored.
+Line: 1 Col: 56 Unexpected end tag (tbody). Ignored.
+Line: 1 Col: 61 Unexpected end tag (td). Ignored.
+Line: 1 Col: 69 Unexpected end tag (tfoot). Ignored.
+Line: 1 Col: 74 Unexpected end tag (th). Ignored.
+Line: 1 Col: 82 Unexpected end tag (thead). Ignored.
+Line: 1 Col: 87 Unexpected end tag (tr). Ignored.
+Line: 1 Col: 87 Unexpected end of file. Expected table content.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+
+#data
+</table><tr>
+#errors
+Line: 1 Col: 8 Unexpected end tag (table). Ignored.
+Line: 1 Col: 12 Unexpected end of file. Expected table content.
+#document-fragment
+table
+#document
+| <tbody>
+|   <tr>
+
+#data
+<body></body></html>
+#errors
+Line: 1 Col: 20 Unexpected html end tag in inner html mode.
+Line: 1 Col: 20 Unexpected EOF in inner html mode.
+#document-fragment
+html
+#document
+| <head>
+| <body>
+
+#data
+<html><frameset></frameset></html> 
+#errors
+Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <frameset>
+|   " "
+
+#data
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"><html></html>
+#errors
+Line: 1 Col: 50 Erroneous DOCTYPE.
+Line: 1 Col: 63 Unexpected end tag (html) after the (implied) root element.
+#document
+| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "">
+| <html>
+|   <head>
+|   <body>
+
+#data
+<param><frameset></frameset>
+#errors
+Line: 1 Col: 7 Unexpected start tag (param). Expected DOCTYPE.
+Line: 1 Col: 17 Unexpected start tag (frameset).
+#document
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<source><frameset></frameset>
+#errors
+Line: 1 Col: 7 Unexpected start tag (source). Expected DOCTYPE.
+Line: 1 Col: 17 Unexpected start tag (frameset).
+#document
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<track><frameset></frameset>
+#errors
+Line: 1 Col: 7 Unexpected start tag (track). Expected DOCTYPE.
+Line: 1 Col: 17 Unexpected start tag (frameset).
+#document
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+</html><frameset></frameset>
+#errors
+7: End tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”.
+17: Stray “frameset” start tag.
+17: “frameset” start tag seen.
+#document
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+</body><frameset></frameset>
+#errors
+7: End tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”.
+17: Stray “frameset” start tag.
+17: “frameset” start tag seen.
+#document
+| <html>
+|   <head>
+|   <frameset>
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests7.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests7.dat
new file mode 100644
index 0000000..f5193c6
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests7.dat
@@ -0,0 +1,390 @@
+#data
+<!doctype html><body><title>X</title>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <title>
+|       "X"
+
+#data
+<!doctype html><table><title>X</title></table>
+#errors
+Line: 1 Col: 29 Unexpected start tag (title) in table context caused voodoo mode.
+Line: 1 Col: 38 Unexpected end tag (title) in table context caused voodoo mode.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <title>
+|       "X"
+|     <table>
+
+#data
+<!doctype html><head></head><title>X</title>
+#errors
+Line: 1 Col: 35 Unexpected start tag (title) that can be in head. Moved.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <title>
+|       "X"
+|   <body>
+
+#data
+<!doctype html></head><title>X</title>
+#errors
+Line: 1 Col: 29 Unexpected start tag (title) that can be in head. Moved.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <title>
+|       "X"
+|   <body>
+
+#data
+<!doctype html><table><meta></table>
+#errors
+Line: 1 Col: 28 Unexpected start tag (meta) in table context caused voodoo mode.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <meta>
+|     <table>
+
+#data
+<!doctype html><table>X<tr><td><table> <meta></table></table>
+#errors
+Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode.
+Line: 1 Col: 45 Unexpected start tag (meta) in table context caused voodoo mode.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "X"
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <meta>
+|             <table>
+|               " "
+
+#data
+<!doctype html><html> <head>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!doctype html> <head>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!doctype html><table><style> <tr>x </style> </table>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <style>
+|         " <tr>x "
+|       " "
+
+#data
+<!doctype html><table><TBODY><script> <tr>x </script> </table>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <script>
+|           " <tr>x "
+|         " "
+
+#data
+<!doctype html><p><applet><p>X</p></applet>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <applet>
+|         <p>
+|           "X"
+
+#data
+<!doctype html><listing>
+X</listing>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <listing>
+|       "X"
+
+#data
+<!doctype html><select><input>X
+#errors
+Line: 1 Col: 30 Unexpected input start tag in the select phase.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|     <input>
+|     "X"
+
+#data
+<!doctype html><select><select>X
+#errors
+Line: 1 Col: 31 Unexpected select start tag in the select phase treated as select end tag.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|     "X"
+
+#data
+<!doctype html><table><input type=hidDEN></table>
+#errors
+Line: 1 Col: 41 Unexpected input with type hidden in table context.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <input>
+|         type="hidDEN"
+
+#data
+<!doctype html><table>X<input type=hidDEN></table>
+#errors
+Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "X"
+|     <table>
+|       <input>
+|         type="hidDEN"
+
+#data
+<!doctype html><table>  <input type=hidDEN></table>
+#errors
+Line: 1 Col: 43 Unexpected input with type hidden in table context.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       "  "
+|       <input>
+|         type="hidDEN"
+
+#data
+<!doctype html><table>  <input type='hidDEN'></table>
+#errors
+Line: 1 Col: 45 Unexpected input with type hidden in table context.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       "  "
+|       <input>
+|         type="hidDEN"
+
+#data
+<!doctype html><table><input type=" hidden"><input type=hidDEN></table>
+#errors
+Line: 1 Col: 44 Unexpected start tag (input) in table context caused voodoo mode.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <input>
+|       type=" hidden"
+|     <table>
+|       <input>
+|         type="hidDEN"
+
+#data
+<!doctype html><table><select>X<tr>
+#errors
+Line: 1 Col: 30 Unexpected start tag (select) in table context caused voodoo mode.
+Line: 1 Col: 35 Unexpected table element start tag (trs) in the select in table phase.
+Line: 1 Col: 35 Unexpected end of file. Expected table content.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       "X"
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<!doctype html><select>X</select>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       "X"
+
+#data
+<!DOCTYPE hTmL><html></html>
+#errors
+Line: 1 Col: 28 Unexpected end tag (html) after the (implied) root element.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE HTML><html></html>
+#errors
+Line: 1 Col: 28 Unexpected end tag (html) after the (implied) root element.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+
+#data
+<body>X</body></body>
+#errors
+Line: 1 Col: 21 Unexpected end tag token (body) in the after body phase.
+Line: 1 Col: 21 Unexpected EOF in inner html mode.
+#document-fragment
+html
+#document
+| <head>
+| <body>
+|   "X"
+
+#data
+<div><p>a</x> b
+#errors
+Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE.
+Line: 1 Col: 13 Unexpected end tag (x). Ignored.
+Line: 1 Col: 15 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <p>
+|         "a b"
+
+#data
+<table><tr><td><code></code> </table>
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <code>
+|             " "
+
+#data
+<table><b><tr><td>aaa</td></tr>bbb</table>ccc
+#errors
+XXX: Fix me
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|     <b>
+|       "bbb"
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "aaa"
+|     <b>
+|       "ccc"
+
+#data
+A<table><tr> B</tr> B</table>
+#errors
+XXX: Fix me
+#document
+| <html>
+|   <head>
+|   <body>
+|     "A B B"
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+A<table><tr> B</tr> </em>C</table>
+#errors
+XXX: Fix me
+#document
+| <html>
+|   <head>
+|   <body>
+|     "A BC"
+|     <table>
+|       <tbody>
+|         <tr>
+|         " "
+
+#data
+<select><keygen>
+#errors
+Not known
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|     <keygen>
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests8.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests8.dat
new file mode 100644
index 0000000..90e6c91
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests8.dat
@@ -0,0 +1,148 @@
+#data
+<div>
+<div></div>
+</span>x
+#errors
+Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE.
+Line: 3 Col: 7 Unexpected end tag (span). Ignored.
+Line: 3 Col: 8 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "
+"
+|       <div>
+|       "
+x"
+
+#data
+<div>x<div></div>
+</span>x
+#errors
+Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE.
+Line: 2 Col: 7 Unexpected end tag (span). Ignored.
+Line: 2 Col: 8 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "x"
+|       <div>
+|       "
+x"
+
+#data
+<div>x<div></div>x</span>x
+#errors
+Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE.
+Line: 1 Col: 25 Unexpected end tag (span). Ignored.
+Line: 1 Col: 26 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "x"
+|       <div>
+|       "xx"
+
+#data
+<div>x<div></div>y</span>z
+#errors
+Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE.
+Line: 1 Col: 25 Unexpected end tag (span). Ignored.
+Line: 1 Col: 26 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "x"
+|       <div>
+|       "yz"
+
+#data
+<table><div>x<div></div>x</span>x
+#errors
+Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE.
+Line: 1 Col: 12 Unexpected start tag (div) in table context caused voodoo mode.
+Line: 1 Col: 18 Unexpected start tag (div) in table context caused voodoo mode.
+Line: 1 Col: 24 Unexpected end tag (div) in table context caused voodoo mode.
+Line: 1 Col: 32 Unexpected end tag (span) in table context caused voodoo mode.
+Line: 1 Col: 32 Unexpected end tag (span). Ignored.
+Line: 1 Col: 33 Unexpected end of file. Expected table content.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "x"
+|       <div>
+|       "xx"
+|     <table>
+
+#data
+x<table>x
+#errors
+Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE.
+Line: 1 Col: 9 Unexpected non-space characters in table context caused voodoo mode.
+Line: 1 Col: 9 Unexpected end of file. Expected table content.
+#document
+| <html>
+|   <head>
+|   <body>
+|     "xx"
+|     <table>
+
+#data
+x<table><table>x
+#errors
+Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE.
+Line: 1 Col: 15 Unexpected start tag (table) implies end tag (table).
+Line: 1 Col: 16 Unexpected non-space characters in table context caused voodoo mode.
+Line: 1 Col: 16 Unexpected end of file. Expected table content.
+#document
+| <html>
+|   <head>
+|   <body>
+|     "x"
+|     <table>
+|     "x"
+|     <table>
+
+#data
+<b>a<div></div><div></b>y
+#errors
+Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE.
+Line: 1 Col: 24 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 25 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       "a"
+|       <div>
+|     <div>
+|       <b>
+|       "y"
+
+#data
+<a><div><p></a>
+#errors
+Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE.
+Line: 1 Col: 15 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 15 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm.
+Line: 1 Col: 15 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|     <div>
+|       <a>
+|       <p>
+|         <a>
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests9.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests9.dat
new file mode 100644
index 0000000..554e27a
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests9.dat
@@ -0,0 +1,457 @@
+#data
+<!DOCTYPE html><math></math>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+
+#data
+<!DOCTYPE html><body><math></math>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+
+#data
+<!DOCTYPE html><math><mi>
+#errors
+25: End of file in a foreign namespace context.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+
+#data
+<!DOCTYPE html><math><annotation-xml><svg><u>
+#errors
+45: HTML start tag “u” in a foreign namespace context.
+45: End of file seen and there were open elements.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         <svg svg>
+|     <u>
+
+#data
+<!DOCTYPE html><body><select><math></math></select>
+#errors
+Line: 1 Col: 35 Unexpected start tag token (math) in the select phase. Ignored.
+Line: 1 Col: 42 Unexpected end tag (math) in the select phase. Ignored.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!DOCTYPE html><body><select><option><math></math></option></select>
+#errors
+Line: 1 Col: 43 Unexpected start tag token (math) in the select phase. Ignored.
+Line: 1 Col: 50 Unexpected end tag (math) in the select phase. Ignored.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+
+#data
+<!DOCTYPE html><body><table><math></math></table>
+#errors
+Line: 1 Col: 34 Unexpected start tag (math) in table context caused voodoo mode.
+Line: 1 Col: 41 Unexpected end tag (math) in table context caused voodoo mode.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|     <table>
+
+#data
+<!DOCTYPE html><body><table><math><mi>foo</mi></math></table>
+#errors
+Line: 1 Col: 34 Unexpected start tag (math) in table context caused voodoo mode.
+Line: 1 Col: 46 Unexpected end tag (mi) in table context caused voodoo mode.
+Line: 1 Col: 53 Unexpected end tag (math) in table context caused voodoo mode.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         "foo"
+|     <table>
+
+#data
+<!DOCTYPE html><body><table><math><mi>foo</mi><mi>bar</mi></math></table>
+#errors
+Line: 1 Col: 34 Unexpected start tag (math) in table context caused voodoo mode.
+Line: 1 Col: 46 Unexpected end tag (mi) in table context caused voodoo mode.
+Line: 1 Col: 58 Unexpected end tag (mi) in table context caused voodoo mode.
+Line: 1 Col: 65 Unexpected end tag (math) in table context caused voodoo mode.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         "foo"
+|       <math mi>
+|         "bar"
+|     <table>
+
+#data
+<!DOCTYPE html><body><table><tbody><math><mi>foo</mi><mi>bar</mi></math></tbody></table>
+#errors
+Line: 1 Col: 41 Unexpected start tag (math) in table context caused voodoo mode.
+Line: 1 Col: 53 Unexpected end tag (mi) in table context caused voodoo mode.
+Line: 1 Col: 65 Unexpected end tag (mi) in table context caused voodoo mode.
+Line: 1 Col: 72 Unexpected end tag (math) in table context caused voodoo mode.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         "foo"
+|       <math mi>
+|         "bar"
+|     <table>
+|       <tbody>
+
+#data
+<!DOCTYPE html><body><table><tbody><tr><math><mi>foo</mi><mi>bar</mi></math></tr></tbody></table>
+#errors
+Line: 1 Col: 45 Unexpected start tag (math) in table context caused voodoo mode.
+Line: 1 Col: 57 Unexpected end tag (mi) in table context caused voodoo mode.
+Line: 1 Col: 69 Unexpected end tag (mi) in table context caused voodoo mode.
+Line: 1 Col: 76 Unexpected end tag (math) in table context caused voodoo mode.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         "foo"
+|       <math mi>
+|         "bar"
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<!DOCTYPE html><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math></td></tr></tbody></table>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <math math>
+|               <math mi>
+|                 "foo"
+|               <math mi>
+|                 "bar"
+
+#data
+<!DOCTYPE html><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math><p>baz</td></tr></tbody></table>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <math math>
+|               <math mi>
+|                 "foo"
+|               <math mi>
+|                 "bar"
+|             <p>
+|               "baz"
+
+#data
+<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi></math><p>baz</caption></table>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <math math>
+|           <math mi>
+|             "foo"
+|           <math mi>
+|             "bar"
+|         <p>
+|           "baz"
+
+#data
+<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux
+#errors
+Line: 1 Col: 70 HTML start tag "p" in a foreign namespace context.
+Line: 1 Col: 81 Unexpected end table tag in caption. Generates implied end caption.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <math math>
+|           <math mi>
+|             "foo"
+|           <math mi>
+|             "bar"
+|         <p>
+|           "baz"
+|     <p>
+|       "quux"
+
+#data
+<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi>baz</table><p>quux
+#errors
+Line: 1 Col: 78 Unexpected end table tag in caption. Generates implied end caption.
+Line: 1 Col: 78 Unexpected end tag (caption). Missing end tag (math).
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <math math>
+|           <math mi>
+|             "foo"
+|           <math mi>
+|             "bar"
+|           "baz"
+|     <p>
+|       "quux"
+
+#data
+<!DOCTYPE html><body><table><colgroup><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux
+#errors
+Line: 1 Col: 44 Unexpected start tag (math) in table context caused voodoo mode.
+Line: 1 Col: 56 Unexpected end tag (mi) in table context caused voodoo mode.
+Line: 1 Col: 68 Unexpected end tag (mi) in table context caused voodoo mode.
+Line: 1 Col: 71 HTML start tag "p" in a foreign namespace context.
+Line: 1 Col: 71 Unexpected start tag (p) in table context caused voodoo mode.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         "foo"
+|       <math mi>
+|         "bar"
+|     <p>
+|       "baz"
+|     <table>
+|       <colgroup>
+|     <p>
+|       "quux"
+
+#data
+<!DOCTYPE html><body><table><tr><td><select><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux
+#errors
+Line: 1 Col: 50 Unexpected start tag token (math) in the select phase. Ignored.
+Line: 1 Col: 54 Unexpected start tag token (mi) in the select phase. Ignored.
+Line: 1 Col: 62 Unexpected end tag (mi) in the select phase. Ignored.
+Line: 1 Col: 66 Unexpected start tag token (mi) in the select phase. Ignored.
+Line: 1 Col: 74 Unexpected end tag (mi) in the select phase. Ignored.
+Line: 1 Col: 77 Unexpected start tag token (p) in the select phase. Ignored.
+Line: 1 Col: 88 Unexpected table element end tag (tables) in the select in table phase.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <select>
+|               "foobarbaz"
+|     <p>
+|       "quux"
+
+#data
+<!DOCTYPE html><body><table><select><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux
+#errors
+Line: 1 Col: 36 Unexpected start tag (select) in table context caused voodoo mode.
+Line: 1 Col: 42 Unexpected start tag token (math) in the select phase. Ignored.
+Line: 1 Col: 46 Unexpected start tag token (mi) in the select phase. Ignored.
+Line: 1 Col: 54 Unexpected end tag (mi) in the select phase. Ignored.
+Line: 1 Col: 58 Unexpected start tag token (mi) in the select phase. Ignored.
+Line: 1 Col: 66 Unexpected end tag (mi) in the select phase. Ignored.
+Line: 1 Col: 69 Unexpected start tag token (p) in the select phase. Ignored.
+Line: 1 Col: 80 Unexpected table element end tag (tables) in the select in table phase.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       "foobarbaz"
+|     <table>
+|     <p>
+|       "quux"
+
+#data
+<!DOCTYPE html><body></body></html><math><mi>foo</mi><mi>bar</mi><p>baz
+#errors
+Line: 1 Col: 41 Unexpected start tag (math).
+Line: 1 Col: 68 HTML start tag "p" in a foreign namespace context.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         "foo"
+|       <math mi>
+|         "bar"
+|     <p>
+|       "baz"
+
+#data
+<!DOCTYPE html><body></body><math><mi>foo</mi><mi>bar</mi><p>baz
+#errors
+Line: 1 Col: 34 Unexpected start tag token (math) in the after body phase.
+Line: 1 Col: 61 HTML start tag "p" in a foreign namespace context.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         "foo"
+|       <math mi>
+|         "bar"
+|     <p>
+|       "baz"
+
+#data
+<!DOCTYPE html><frameset><math><mi></mi><mi></mi><p><span>
+#errors
+Line: 1 Col: 31 Unexpected start tag token (math) in the frameset phase. Ignored.
+Line: 1 Col: 35 Unexpected start tag token (mi) in the frameset phase. Ignored.
+Line: 1 Col: 40 Unexpected end tag token (mi) in the frameset phase. Ignored.
+Line: 1 Col: 44 Unexpected start tag token (mi) in the frameset phase. Ignored.
+Line: 1 Col: 49 Unexpected end tag token (mi) in the frameset phase. Ignored.
+Line: 1 Col: 52 Unexpected start tag token (p) in the frameset phase. Ignored.
+Line: 1 Col: 58 Unexpected start tag token (span) in the frameset phase. Ignored.
+Line: 1 Col: 58 Expected closing tag. Unexpected end of file.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!DOCTYPE html><frameset></frameset><math><mi></mi><mi></mi><p><span>
+#errors
+Line: 1 Col: 42 Unexpected start tag (math) in the after frameset phase. Ignored.
+Line: 1 Col: 46 Unexpected start tag (mi) in the after frameset phase. Ignored.
+Line: 1 Col: 51 Unexpected end tag (mi) in the after frameset phase. Ignored.
+Line: 1 Col: 55 Unexpected start tag (mi) in the after frameset phase. Ignored.
+Line: 1 Col: 60 Unexpected end tag (mi) in the after frameset phase. Ignored.
+Line: 1 Col: 63 Unexpected start tag (p) in the after frameset phase. Ignored.
+Line: 1 Col: 69 Unexpected start tag (span) in the after frameset phase. Ignored.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!DOCTYPE html><body xlink:href=foo><math xlink:href=foo></math>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     xlink:href="foo"
+|     <math math>
+|       xlink href="foo"
+
+#data
+<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo></mi></math>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     xlink:href="foo"
+|     xml:lang="en"
+|     <math math>
+|       <math mi>
+|         xlink href="foo"
+|         xml lang="en"
+
+#data
+<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo /></math>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     xlink:href="foo"
+|     xml:lang="en"
+|     <math math>
+|       <math mi>
+|         xlink href="foo"
+|         xml lang="en"
+
+#data
+<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo />bar</math>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     xlink:href="foo"
+|     xml:lang="en"
+|     <math math>
+|       <math mi>
+|         xlink href="foo"
+|         xml lang="en"
+|       "bar"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tests_innerHTML_1.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tests_innerHTML_1.dat
new file mode 100644
index 0000000..6c78661
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tests_innerHTML_1.dat
@@ -0,0 +1,741 @@
+#data
+<body><span>
+#errors
+#document-fragment
+body
+#document
+| <span>
+
+#data
+<span><body>
+#errors
+#document-fragment
+body
+#document
+| <span>
+
+#data
+<span><body>
+#errors
+#document-fragment
+div
+#document
+| <span>
+
+#data
+<body><span>
+#errors
+#document-fragment
+html
+#document
+| <head>
+| <body>
+|   <span>
+
+#data
+<frameset><span>
+#errors
+#document-fragment
+body
+#document
+| <span>
+
+#data
+<span><frameset>
+#errors
+#document-fragment
+body
+#document
+| <span>
+
+#data
+<span><frameset>
+#errors
+#document-fragment
+div
+#document
+| <span>
+
+#data
+<frameset><span>
+#errors
+#document-fragment
+html
+#document
+| <head>
+| <frameset>
+
+#data
+<table><tr>
+#errors
+#document-fragment
+table
+#document
+| <tbody>
+|   <tr>
+
+#data
+</table><tr>
+#errors
+#document-fragment
+table
+#document
+| <tbody>
+|   <tr>
+
+#data
+<a>
+#errors
+#document-fragment
+table
+#document
+| <a>
+
+#data
+<a>
+#errors
+#document-fragment
+table
+#document
+| <a>
+
+#data
+<a><caption>a
+#errors
+#document-fragment
+table
+#document
+| <a>
+| <caption>
+|   "a"
+
+#data
+<a><colgroup><col>
+#errors
+#document-fragment
+table
+#document
+| <a>
+| <colgroup>
+|   <col>
+
+#data
+<a><tbody><tr>
+#errors
+#document-fragment
+table
+#document
+| <a>
+| <tbody>
+|   <tr>
+
+#data
+<a><tfoot><tr>
+#errors
+#document-fragment
+table
+#document
+| <a>
+| <tfoot>
+|   <tr>
+
+#data
+<a><thead><tr>
+#errors
+#document-fragment
+table
+#document
+| <a>
+| <thead>
+|   <tr>
+
+#data
+<a><tr>
+#errors
+#document-fragment
+table
+#document
+| <a>
+| <tbody>
+|   <tr>
+
+#data
+<a><th>
+#errors
+#document-fragment
+table
+#document
+| <a>
+| <tbody>
+|   <tr>
+|     <th>
+
+#data
+<a><td>
+#errors
+#document-fragment
+table
+#document
+| <a>
+| <tbody>
+|   <tr>
+|     <td>
+
+#data
+<table></table><tbody>
+#errors
+#document-fragment
+caption
+#document
+| <table>
+
+#data
+</table><span>
+#errors
+#document-fragment
+caption
+#document
+| <span>
+
+#data
+<span></table>
+#errors
+#document-fragment
+caption
+#document
+| <span>
+
+#data
+</caption><span>
+#errors
+#document-fragment
+caption
+#document
+| <span>
+
+#data
+<span></caption><span>
+#errors
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span><caption><span>
+#errors
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span><col><span>
+#errors
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span><colgroup><span>
+#errors
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span><html><span>
+#errors
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span><tbody><span>
+#errors
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span><td><span>
+#errors
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span><tfoot><span>
+#errors
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span><thead><span>
+#errors
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span><th><span>
+#errors
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span><tr><span>
+#errors
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span></table><span>
+#errors
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+</colgroup><col>
+#errors
+#document-fragment
+colgroup
+#document
+| <col>
+
+#data
+<a><col>
+#errors
+#document-fragment
+colgroup
+#document
+| <col>
+
+#data
+<caption><a>
+#errors
+#document-fragment
+tbody
+#document
+| <a>
+
+#data
+<col><a>
+#errors
+#document-fragment
+tbody
+#document
+| <a>
+
+#data
+<colgroup><a>
+#errors
+#document-fragment
+tbody
+#document
+| <a>
+
+#data
+<tbody><a>
+#errors
+#document-fragment
+tbody
+#document
+| <a>
+
+#data
+<tfoot><a>
+#errors
+#document-fragment
+tbody
+#document
+| <a>
+
+#data
+<thead><a>
+#errors
+#document-fragment
+tbody
+#document
+| <a>
+
+#data
+</table><a>
+#errors
+#document-fragment
+tbody
+#document
+| <a>
+
+#data
+<a><tr>
+#errors
+#document-fragment
+tbody
+#document
+| <a>
+| <tr>
+
+#data
+<a><td>
+#errors
+#document-fragment
+tbody
+#document
+| <a>
+| <tr>
+|   <td>
+
+#data
+<a><td>
+#errors
+#document-fragment
+tbody
+#document
+| <a>
+| <tr>
+|   <td>
+
+#data
+<a><td>
+#errors
+#document-fragment
+tbody
+#document
+| <a>
+| <tr>
+|   <td>
+
+#data
+<td><table><tbody><a><tr>
+#errors
+#document-fragment
+tbody
+#document
+| <tr>
+|   <td>
+|     <a>
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+</tr><td>
+#errors
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+<td><table><a><tr></tr><tr>
+#errors
+#document-fragment
+tr
+#document
+| <td>
+|   <a>
+|   <table>
+|     <tbody>
+|       <tr>
+|       <tr>
+
+#data
+<caption><td>
+#errors
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+<col><td>
+#errors
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+<colgroup><td>
+#errors
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+<tbody><td>
+#errors
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+<tfoot><td>
+#errors
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+<thead><td>
+#errors
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+<tr><td>
+#errors
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+</table><td>
+#errors
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+<td><table></table><td>
+#errors
+#document-fragment
+tr
+#document
+| <td>
+|   <table>
+| <td>
+
+#data
+<td><table></table><td>
+#errors
+#document-fragment
+tr
+#document
+| <td>
+|   <table>
+| <td>
+
+#data
+<caption><a>
+#errors
+#document-fragment
+td
+#document
+| <a>
+
+#data
+<col><a>
+#errors
+#document-fragment
+td
+#document
+| <a>
+
+#data
+<colgroup><a>
+#errors
+#document-fragment
+td
+#document
+| <a>
+
+#data
+<tbody><a>
+#errors
+#document-fragment
+td
+#document
+| <a>
+
+#data
+<tfoot><a>
+#errors
+#document-fragment
+td
+#document
+| <a>
+
+#data
+<th><a>
+#errors
+#document-fragment
+td
+#document
+| <a>
+
+#data
+<thead><a>
+#errors
+#document-fragment
+td
+#document
+| <a>
+
+#data
+<tr><a>
+#errors
+#document-fragment
+td
+#document
+| <a>
+
+#data
+</table><a>
+#errors
+#document-fragment
+td
+#document
+| <a>
+
+#data
+</tbody><a>
+#errors
+#document-fragment
+td
+#document
+| <a>
+
+#data
+</td><a>
+#errors
+#document-fragment
+td
+#document
+| <a>
+
+#data
+</tfoot><a>
+#errors
+#document-fragment
+td
+#document
+| <a>
+
+#data
+</thead><a>
+#errors
+#document-fragment
+td
+#document
+| <a>
+
+#data
+</th><a>
+#errors
+#document-fragment
+td
+#document
+| <a>
+
+#data
+</tr><a>
+#errors
+#document-fragment
+td
+#document
+| <a>
+
+#data
+<table><td><td>
+#errors
+#document-fragment
+td
+#document
+| <table>
+|   <tbody>
+|     <tr>
+|       <td>
+|       <td>
+
+#data
+</select><option>
+#errors
+#document-fragment
+select
+#document
+| <option>
+
+#data
+<input><option>
+#errors
+#document-fragment
+select
+#document
+| <option>
+
+#data
+<keygen><option>
+#errors
+#document-fragment
+select
+#document
+| <option>
+
+#data
+<textarea><option>
+#errors
+#document-fragment
+select
+#document
+| <option>
+
+#data
+</html><!--abc-->
+#errors
+#document-fragment
+html
+#document
+| <head>
+| <body>
+| <!-- abc -->
+
+#data
+</frameset><frame>
+#errors
+#document-fragment
+frameset
+#document
+| <frame>
+
+#data
+#errors
+#document-fragment
+html
+#document
+| <head>
+| <body>
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/tricky01.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/tricky01.dat
new file mode 100644
index 0000000..0841992
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/tricky01.dat
@@ -0,0 +1,261 @@
+#data
+<b><p>Bold </b> Not bold</p>
+Also not bold.
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|     <p>
+|       <b>
+|         "Bold "
+|       " Not bold"
+|     "
+Also not bold."
+
+#data
+<html>
+<font color=red><i>Italic and Red<p>Italic and Red </font> Just italic.</p> Italic only.</i> Plain
+<p>I should not be red. <font color=red>Red. <i>Italic and red.</p>
+<p>Italic and red. </i> Red.</font> I should not be red.</p>
+<b>Bold <i>Bold and italic</b> Only Italic </i> Plain
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <font>
+|       color="red"
+|       <i>
+|         "Italic and Red"
+|     <i>
+|       <p>
+|         <font>
+|           color="red"
+|           "Italic and Red "
+|         " Just italic."
+|       " Italic only."
+|     " Plain
+"
+|     <p>
+|       "I should not be red. "
+|       <font>
+|         color="red"
+|         "Red. "
+|         <i>
+|           "Italic and red."
+|     <font>
+|       color="red"
+|       <i>
+|         "
+"
+|     <p>
+|       <font>
+|         color="red"
+|         <i>
+|           "Italic and red. "
+|         " Red."
+|       " I should not be red."
+|     "
+"
+|     <b>
+|       "Bold "
+|       <i>
+|         "Bold and italic"
+|     <i>
+|       " Only Italic "
+|     " Plain"
+
+#data
+<html><body>
+<p><font size="7">First paragraph.</p>
+<p>Second paragraph.</p></font>
+<b><p><i>Bold and Italic</b> Italic</p>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "
+"
+|     <p>
+|       <font>
+|         size="7"
+|         "First paragraph."
+|     <font>
+|       size="7"
+|       "
+"
+|       <p>
+|         "Second paragraph."
+|     "
+"
+|     <b>
+|     <p>
+|       <b>
+|         <i>
+|           "Bold and Italic"
+|       <i>
+|         " Italic"
+
+#data
+<html>
+<dl>
+<dt><b>Boo
+<dd>Goo?
+</dl>
+</html>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <dl>
+|       "
+"
+|       <dt>
+|         <b>
+|           "Boo
+"
+|       <dd>
+|         <b>
+|           "Goo?
+"
+|     <b>
+|       "
+"
+
+#data
+<html><body>
+<label><a><div>Hello<div>World</div></a></label>  
+</body></html>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "
+"
+|     <label>
+|       <a>
+|       <div>
+|         <a>
+|           "Hello"
+|           <div>
+|             "World"
+|         "  
+"
+
+#data
+<table><center> <font>a</center> <img> <tr><td> </td> </tr> </table>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <center>
+|       " "
+|       <font>
+|         "a"
+|     <font>
+|       <img>
+|       " "
+|     <table>
+|       " "
+|       <tbody>
+|         <tr>
+|           <td>
+|             " "
+|           " "
+|         " "
+
+#data
+<table><tr><p><a><p>You should see this text.
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <a>
+|     <p>
+|       <a>
+|         "You should see this text."
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<TABLE>
+<TR>
+<CENTER><CENTER><TD></TD></TR><TR>
+<FONT>
+<TABLE><tr></tr></TABLE>
+</P>
+<a></font><font></a>
+This page contains an insanely badly-nested tag sequence.
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <center>
+|       <center>
+|     <font>
+|       "
+"
+|     <table>
+|       "
+"
+|       <tbody>
+|         <tr>
+|           "
+"
+|           <td>
+|         <tr>
+|           "
+"
+|     <table>
+|       <tbody>
+|         <tr>
+|     <font>
+|       "
+"
+|       <p>
+|       "
+"
+|       <a>
+|     <a>
+|       <font>
+|     <font>
+|       "
+This page contains an insanely badly-nested tag sequence."
+
+#data
+<html>
+<body>
+<b><nobr><div>This text is in a div inside a nobr</nobr>More text that should not be in the nobr, i.e., the
+nobr should have closed the div inside it implicitly. </b><pre>A pre tag outside everything else.</pre>
+</body>
+</html>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "
+"
+|     <b>
+|       <nobr>
+|     <div>
+|       <b>
+|         <nobr>
+|           "This text is in a div inside a nobr"
+|         "More text that should not be in the nobr, i.e., the
+nobr should have closed the div inside it implicitly. "
+|       <pre>
+|         "A pre tag outside everything else."
+|       "
+
+"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/webkit01.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/webkit01.dat
new file mode 100644
index 0000000..06bc436
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/webkit01.dat
@@ -0,0 +1,594 @@
+#data
+Test
+#errors
+Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|   <body>
+|     "Test"
+
+#data
+<div></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+
+#data
+<div>Test</div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "Test"
+
+#data
+<di
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<div>Hello</div>
+<script>
+console.log("PASS");
+</script>
+<div>Bye</div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "Hello"
+|     "
+"
+|     <script>
+|       "
+console.log("PASS");
+"
+|     "
+"
+|     <div>
+|       "Bye"
+
+#data
+<div foo="bar">Hello</div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       foo="bar"
+|       "Hello"
+
+#data
+<div>Hello</div>
+<script>
+console.log("FOO<span>BAR</span>BAZ");
+</script>
+<div>Bye</div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "Hello"
+|     "
+"
+|     <script>
+|       "
+console.log("FOO<span>BAR</span>BAZ");
+"
+|     "
+"
+|     <div>
+|       "Bye"
+
+#data
+<foo bar="baz"></foo><potato quack="duck"></potato>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <foo>
+|       bar="baz"
+|     <potato>
+|       quack="duck"
+
+#data
+<foo bar="baz"><potato quack="duck"></potato></foo>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <foo>
+|       bar="baz"
+|       <potato>
+|         quack="duck"
+
+#data
+<foo></foo bar="baz"><potato></potato quack="duck">
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <foo>
+|     <potato>
+
+#data
+</ tttt>
+#errors
+#document
+| <!--  tttt -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<div FOO ><img><img></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       foo=""
+|       <img>
+|       <img>
+
+#data
+<p>Test</p<p>Test2</p>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       "TestTest2"
+
+#data
+<rdar://problem/6869687>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <rdar:>
+|       6869687=""
+|       problem=""
+
+#data
+<A>test< /A>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       "test< /A>"
+
+#data
+&lt;
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "<"
+
+#data
+<body foo='bar'><body foo='baz' yo='mama'>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     foo="bar"
+|     yo="mama"
+
+#data
+<body></br foo="bar"></body>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <br>
+
+#data
+<bdy><br foo="bar"></body>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <bdy>
+|       <br>
+|         foo="bar"
+
+#data
+<body></body></br foo="bar">
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <br>
+
+#data
+<bdy></body><br foo="bar">
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <bdy>
+|       <br>
+|         foo="bar"
+
+#data
+<html><body></body></html><!-- Hi there -->
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+| <!--  Hi there  -->
+
+#data
+<html><body></body></html>x<!-- Hi there -->
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "x"
+|     <!--  Hi there  -->
+
+#data
+<html><body></body></html>x<!-- Hi there --></html><!-- Again -->
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "x"
+|     <!--  Hi there  -->
+| <!--  Again  -->
+
+#data
+<html><body></body></html>x<!-- Hi there --></body></html><!-- Again -->
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "x"
+|     <!--  Hi there  -->
+| <!--  Again  -->
+
+#data
+<html><body><ruby><div><rp>xx</rp></div></ruby></body></html>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       <div>
+|         <rp>
+|           "xx"
+
+#data
+<html><body><ruby><div><rt>xx</rt></div></ruby></body></html>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       <div>
+|         <rt>
+|           "xx"
+
+#data
+<html><frameset><!--1--><noframes>A</noframes><!--2--></frameset><!--3--><noframes>B</noframes><!--4--></html><!--5--><noframes>C</noframes><!--6-->
+#errors
+#document
+| <html>
+|   <head>
+|   <frameset>
+|     <!-- 1 -->
+|     <noframes>
+|       "A"
+|     <!-- 2 -->
+|   <!-- 3 -->
+|   <noframes>
+|     "B"
+|   <!-- 4 -->
+|   <noframes>
+|     "C"
+| <!-- 5 -->
+| <!-- 6 -->
+
+#data
+<select><option>A<select><option>B<select><option>C<select><option>D<select><option>E<select><option>F<select><option>G<select>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+|         "A"
+|     <option>
+|       "B"
+|       <select>
+|         <option>
+|           "C"
+|     <option>
+|       "D"
+|       <select>
+|         <option>
+|           "E"
+|     <option>
+|       "F"
+|       <select>
+|         <option>
+|           "G"
+
+#data
+<dd><dd><dt><dt><dd><li><li>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <dd>
+|     <dd>
+|     <dt>
+|     <dt>
+|     <dd>
+|       <li>
+|       <li>
+
+#data
+<div><b></div><div><nobr>a<nobr>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <b>
+|     <div>
+|       <b>
+|         <nobr>
+|           "a"
+|         <nobr>
+
+#data
+<head></head>
+<body></body>
+#errors
+#document
+| <html>
+|   <head>
+|   "
+"
+|   <body>
+
+#data
+<head></head> <style></style>ddd
+#errors
+#document
+| <html>
+|   <head>
+|     <style>
+|   " "
+|   <body>
+|     "ddd"
+
+#data
+<kbd><table></kbd><col><select><tr>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <kbd>
+|       <select>
+|       <table>
+|         <colgroup>
+|           <col>
+|         <tbody>
+|           <tr>
+
+#data
+<kbd><table></kbd><col><select><tr></table><div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <kbd>
+|       <select>
+|       <table>
+|         <colgroup>
+|           <col>
+|         <tbody>
+|           <tr>
+|       <div>
+
+#data
+<a><li><style></style><title></title></a>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|     <li>
+|       <a>
+|         <style>
+|         <title>
+
+#data
+<font></p><p><meta><title></title></font>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <font>
+|       <p>
+|     <p>
+|       <font>
+|         <meta>
+|         <title>
+
+#data
+<a><center><title></title><a>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|     <center>
+|       <a>
+|         <title>
+|       <a>
+
+#data
+<svg><title><div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg title>
+|         <div>
+
+#data
+<svg><title><rect><div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg title>
+|         <rect>
+|           <div>
+
+#data
+<svg><title><svg><div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg title>
+|         <svg svg>
+|         <div>
+
+#data
+<img <="" FAIL>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <img>
+|       <=""
+|       fail=""
+
+#data
+<ul><li><div id='foo'/>A</li><li>B<div>C</div></li></ul>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ul>
+|       <li>
+|         <div>
+|           id="foo"
+|           "A"
+|       <li>
+|         "B"
+|         <div>
+|           "C"
+
+#data
+<svg><em><desc></em>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|     <em>
+|       <desc>
+
+#data
+<svg><tfoot></mi><td>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg tfoot>
+|         <svg td>
+
+#data
+<math><mrow><mrow><mn>1</mn></mrow><mi>a</mi></mrow></math>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mrow>
+|         <math mrow>
+|           <math mn>
+|             "1"
+|         <math mi>
+|           "a"
+
+#data
+<!doctype html><input type="hidden"><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!doctype html><input type="button"><frameset>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <input>
+|       type="button"
diff --git a/mojo/public/dart/third_party/html/test/data/tree-construction/webkit02.dat b/mojo/public/dart/third_party/html/test/data/tree-construction/webkit02.dat
new file mode 100644
index 0000000..468879b
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/data/tree-construction/webkit02.dat
@@ -0,0 +1,94 @@
+#data
+<foo bar=qux/>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <foo>
+|       bar="qux/"
+
+#data
+<p id="status"><noscript><strong>A</strong></noscript><span>B</span></p>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       id="status"
+|       <noscript>
+|         "<strong>A</strong>"
+|       <span>
+|         "B"
+
+#data
+<div><sarcasm><div></div></sarcasm></div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <sarcasm>
+|         <div>
+
+#data
+<html><body><img src="" border="0" alt="><div>A</div></body></html>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<table><td></tbody>A
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "A"
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+
+#data
+<table><td></thead>A
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "A"
+
+#data
+<table><td></tfoot>A
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "A"
+
+#data
+<table><thead><td></tbody>A
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <thead>
+|         <tr>
+|           <td>
+|             "A"
diff --git a/mojo/public/dart/third_party/html/test/dom_test.dart b/mojo/public/dart/third_party/html/test/dom_test.dart
new file mode 100644
index 0000000..d4e0809
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/dom_test.dart
@@ -0,0 +1,190 @@
+/// Additional feature tests that aren't based on test data.
+library dom_test;
+
+import 'package:unittest/unittest.dart';
+import 'package:html/dom.dart';
+import 'package:html/parser.dart';
+
+main() {
+  group('Element', () {
+    test('classes', () {
+      final barBaz = new Element.html('<div class=" bar baz"></div>');
+      final quxBaz = new Element.html('<div class="qux  baz "></div>');
+      expect(barBaz.className, ' bar baz');
+      expect(quxBaz.className, 'qux  baz ');
+      expect(barBaz.classes, ['bar', 'baz']);
+      expect(quxBaz.classes, ['qux', 'baz']);
+    });
+  });
+
+  group('Document', () {
+    final doc = parse('<div id=foo>'
+        '<div class=" bar baz"></div>'
+        '<div class="qux  baz "></div>'
+        '<div id=Foo>');
+
+    test('getElementById', () {
+      var foo = doc.body.nodes[0];
+      var Foo = foo.nodes[2];
+      expect(foo.id, 'foo');
+      expect(Foo.id, 'Foo');
+      expect(doc.getElementById('foo'), foo);
+      expect(doc.getElementById('Foo'), Foo);
+    });
+
+    test('getElementsByClassName', () {
+      var foo = doc.body.nodes[0];
+      var barBaz = foo.nodes[0];
+      var quxBaz = foo.nodes[1];
+      expect(barBaz.className, ' bar baz');
+      expect(quxBaz.className, 'qux  baz ');
+      expect(doc.getElementsByClassName('baz'), [barBaz, quxBaz]);
+      expect(doc.getElementsByClassName('bar '), [barBaz]);
+      expect(doc.getElementsByClassName('  qux'), [quxBaz]);
+      expect(doc.getElementsByClassName(' baz qux'), [quxBaz]);
+    });
+
+    test('getElementsByTagName', () {
+      var foo = doc.body.nodes[0];
+      var barBaz = foo.nodes[0];
+      var quxBaz = foo.nodes[1];
+      var Foo = foo.nodes[2];
+      expect(doc.getElementsByTagName('div'), [foo, barBaz, quxBaz, Foo]);
+    });
+  });
+
+  group('fragments are flattened', () {
+    test('add', () {
+      var doc = parse('<body>');
+      doc.body.nodes.add(parseFragment('<x-foo>'));
+      expect(doc.body.nodes[0].localName, 'x-foo');
+      doc.body.nodes.add(parseFragment('<x-bar>'));
+      expect(doc.body.nodes[1].localName, 'x-bar');
+    });
+
+    test('addLast', () {
+      var doc = parse('<body>');
+      doc.body.nodes.addLast(parseFragment('<x-foo>'));
+      expect(doc.body.nodes[0].localName, 'x-foo');
+      doc.body.nodes.addLast(parseFragment('<x-bar>'));
+      expect(doc.body.nodes[1].localName, 'x-bar');
+    });
+
+    test('addAll', () {
+      var doc = parse('<body><x-a></x-a>');
+      doc.body.nodes.addAll([parseFragment('<x-b></x-b><x-c></x-c>')]);
+      expect(doc.body.nodes[0].localName, 'x-a');
+      expect(doc.body.nodes[1].localName, 'x-b');
+      expect(doc.body.nodes[2].localName, 'x-c');
+    });
+
+    test('insert', () {
+      var doc = parse('<body><x-a></x-a>');
+      doc.body.nodes.insert(0, parseFragment('<x-b></x-b><x-c></x-c>'));
+      expect(doc.body.nodes[0].localName, 'x-b');
+      expect(doc.body.nodes[1].localName, 'x-c');
+      expect(doc.body.nodes[2].localName, 'x-a');
+
+      doc = parse('<body><x-a></x-a>');
+      doc.body.nodes.insert(1, parseFragment('<x-b></x-b><x-c></x-c>'));
+      expect(doc.body.nodes[0].localName, 'x-a');
+      expect(doc.body.nodes[1].localName, 'x-b');
+      expect(doc.body.nodes[2].localName, 'x-c');
+
+      doc = parse('<body><x-a></x-a>');
+      doc.body.nodes.insert(0, parseFragment('<x-b></x-b>'));
+      doc.body.nodes.insert(1, parseFragment('<x-c></x-c>'));
+      expect(doc.body.nodes[0].localName, 'x-b');
+      expect(doc.body.nodes[1].localName, 'x-c');
+      expect(doc.body.nodes[2].localName, 'x-a');
+    });
+
+    test('insertAll', () {
+      var doc = parse('<body><x-a></x-a>');
+      doc.body.nodes.insertAll(0, [parseFragment('<x-b></x-b><x-c></x-c>')]);
+      expect(doc.body.nodes[0].localName, 'x-b');
+      expect(doc.body.nodes[1].localName, 'x-c');
+      expect(doc.body.nodes[2].localName, 'x-a');
+      expect(doc.body.nodes.length, 3);
+
+      doc = parse('<body><x-a></x-a>');
+      doc.body.nodes.insertAll(1, [parseFragment('<x-b></x-b><x-c></x-c>')]);
+      expect(doc.body.nodes[0].localName, 'x-a');
+      expect(doc.body.nodes[1].localName, 'x-b');
+      expect(doc.body.nodes[2].localName, 'x-c');
+
+      doc = parse('<body><x-a></x-a>');
+      doc.body.nodes.insertAll(0, [parseFragment('<x-b></x-b>')]);
+      doc.body.nodes.insertAll(1, [parseFragment('<x-c></x-c>')]);
+      expect(doc.body.nodes[0].localName, 'x-b');
+      expect(doc.body.nodes[1].localName, 'x-c');
+      expect(doc.body.nodes[2].localName, 'x-a');
+    });
+
+    test('operator []=', () {
+      var doc = parse('<body><x-a></x-a>');
+      doc.body.nodes[0] = parseFragment('<x-b></x-b><x-c></x-c>');
+      expect(doc.body.nodes[0].localName, 'x-b');
+      expect(doc.body.nodes[1].localName, 'x-c');
+      expect(doc.body.nodes.length, 2);
+
+      doc = parse('<body><x-a></x-a><x-b></x-b><x-c></x-c>');
+      doc.body.nodes[1] = parseFragment('<y-b></y-b><y-c></y-c>');
+      expect(doc.body.nodes[0].localName, 'x-a');
+      expect(doc.body.nodes[1].localName, 'y-b');
+      expect(doc.body.nodes[2].localName, 'y-c');
+      expect(doc.body.nodes[3].localName, 'x-c');
+      expect(doc.body.nodes.length, 4);
+    });
+
+    test('setRange', () {
+      var fragment = parseFragment('<y-b></y-b><y-c></y-c>');
+      var doc = parse('<body><x-a></x-a><x-b></x-b><x-c></x-c>');
+      doc.body.nodes.setRange(1, 2, fragment.nodes, 0);
+      expect(doc.body.nodes[0].localName, 'x-a');
+      expect(doc.body.nodes[1].localName, 'y-b');
+      expect(doc.body.nodes[2].localName, 'y-c');
+      expect(doc.body.nodes.length, 3);
+
+      fragment = parseFragment('<y-b></y-b><y-c></y-c>');
+      doc = parse('<body><x-a></x-a><x-b></x-b><x-c></x-c>');
+      doc.body.nodes.setRange(1, 1, [fragment], 0);
+      expect(doc.body.nodes[0].localName, 'x-a');
+      expect(doc.body.nodes[1].localName, 'y-b');
+      expect(doc.body.nodes[2].localName, 'y-c');
+      expect(doc.body.nodes[3].localName, 'x-c');
+      expect(doc.body.nodes.length, 4);
+    });
+
+    test('replaceRange', () {
+      var fragment = parseFragment('<y-b></y-b><y-c></y-c>');
+      var doc = parse('<body><x-a></x-a><x-b></x-b><x-c></x-c>');
+      doc.body.nodes.replaceRange(1, 2, fragment.nodes);
+      expect(doc.body.nodes[0].localName, 'x-a');
+      expect(doc.body.nodes[1].localName, 'y-b');
+      expect(doc.body.nodes[2].localName, 'y-c');
+      expect(doc.body.nodes[3].localName, 'x-c');
+      expect(doc.body.nodes.length, 4);
+
+      fragment = parseFragment('<y-b></y-b><y-c></y-c>');
+      doc = parse('<body><x-a></x-a><x-b></x-b><x-c></x-c>');
+      doc.body.nodes.replaceRange(1, 2, [fragment]);
+      expect(doc.body.nodes[0].localName, 'x-a');
+      expect(doc.body.nodes[1].localName, 'y-b');
+      expect(doc.body.nodes[2].localName, 'y-c');
+      expect(doc.body.nodes[3].localName, 'x-c');
+      expect(doc.body.nodes.length, 4);
+    });
+
+    test('replaceWith', () {
+      var fragment = parseFragment('<y-b></y-b><y-c></y-c>');
+      var doc = parse('<body><x-a></x-a><x-b></x-b><x-c></x-c>');
+      doc.body.nodes[1].replaceWith(fragment);
+      expect(doc.body.nodes[0].localName, 'x-a');
+      expect(doc.body.nodes[1].localName, 'y-b');
+      expect(doc.body.nodes[2].localName, 'y-c');
+      expect(doc.body.nodes[3].localName, 'x-c');
+      expect(doc.body.nodes.length, 4);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/html/test/parser_feature_test.dart b/mojo/public/dart/third_party/html/test/parser_feature_test.dart
new file mode 100644
index 0000000..54d68a9
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/parser_feature_test.dart
@@ -0,0 +1,476 @@
+/// Additional feature tests that aren't based on test data.
+library parser_feature_test;
+
+import 'package:unittest/unittest.dart';
+import 'package:html/dom.dart';
+import 'package:html/parser.dart';
+import 'package:html/src/constants.dart';
+import 'package:html/src/encoding_parser.dart';
+import 'package:html/src/treebuilder.dart';
+import 'package:source_span/source_span.dart';
+
+main() {
+  _testElementSpans();
+  test('doctype is cloneable', () {
+    var doc = parse('<!doctype HTML>');
+    DocumentType doctype = doc.nodes[0];
+    expect(doctype.clone(false).toString(), '<!DOCTYPE html>');
+  });
+
+  test('line counter', () {
+    // http://groups.google.com/group/html5lib-discuss/browse_frm/thread/f4f00e4a2f26d5c0
+    var doc = parse("<pre>\nx\n&gt;\n</pre>");
+    expect(doc.body.innerHtml, "<pre>x\n&gt;\n</pre>");
+  });
+
+  test('namespace html elements on', () {
+    var doc = new HtmlParser('', tree: new TreeBuilder(true)).parse();
+    expect(doc.nodes[0].namespaceUri, Namespaces.html);
+  });
+
+  test('namespace html elements off', () {
+    var doc = new HtmlParser('', tree: new TreeBuilder(false)).parse();
+    expect(doc.nodes[0].namespaceUri, null);
+  });
+
+  test('parse error spans - full', () {
+    var parser = new HtmlParser('''
+<!DOCTYPE html>
+<html>
+  <body>
+  <!DOCTYPE html>
+  </body>
+</html>
+''', generateSpans: true, sourceUrl: 'ParseError');
+    var doc = parser.parse();
+    expect(doc.body.outerHtml, '<body>\n  \n  \n\n</body>');
+    expect(parser.errors.length, 1);
+    ParseError error = parser.errors[0];
+    expect(error.errorCode, 'unexpected-doctype');
+
+    // Note: these values are 0-based, but the printed format is 1-based.
+    expect(error.span.start.line, 3);
+    expect(error.span.end.line, 3);
+    expect(error.span.start.column, 2);
+    expect(error.span.end.column, 17);
+    expect(error.span.text, '<!DOCTYPE html>');
+
+    expect(error.toString(), '''
+On line 4, column 3 of ParseError: Unexpected DOCTYPE. Ignored.
+  <!DOCTYPE html>
+  ^^^^^^^^^^^^^^^''');
+  });
+
+  test('parse error spans - minimal', () {
+    var parser = new HtmlParser('''
+<!DOCTYPE html>
+<html>
+  <body>
+  <!DOCTYPE html>
+  </body>
+</html>
+''');
+    var doc = parser.parse();
+    expect(doc.body.outerHtml, '<body>\n  \n  \n\n</body>');
+    expect(parser.errors.length, 1);
+    ParseError error = parser.errors[0];
+    expect(error.errorCode, 'unexpected-doctype');
+    expect(error.span.start.line, 3);
+    // Note: error position is at the end, not the beginning
+    expect(error.span.start.column, 17);
+  });
+
+  test('text spans should have the correct length', () {
+    var textContent = '\n  hello {{name}}';
+    var html = '<body><div>$textContent</div>';
+    var doc = parse(html, generateSpans: true);
+    Text text = doc.body.nodes[0].nodes[0];
+    expect(text, new isInstanceOf<Text>());
+    expect(text.data, textContent);
+    expect(text.sourceSpan.start.offset, html.indexOf(textContent));
+    expect(text.sourceSpan.length, textContent.length);
+  });
+
+  test('attribute spans', () {
+    var text = '<element name="x-foo" extends="x-bar" constructor="Foo">';
+    var doc = parse(text, generateSpans: true);
+    var elem = doc.querySelector('element');
+    expect(elem.sourceSpan.start.offset, 0);
+    expect(elem.sourceSpan.end.offset, text.length);
+    expect(elem.sourceSpan.text, text);
+
+    expect(elem.attributeSpans['quux'], null);
+
+    var span = elem.attributeSpans['extends'];
+    expect(span.start.offset, text.indexOf('extends'));
+    expect(span.text, 'extends="x-bar"');
+  });
+
+  test('attribute value spans', () {
+    var text = '<element name="x-foo" extends="x-bar" constructor="Foo">';
+    var doc = parse(text, generateSpans: true);
+    var elem = doc.querySelector('element');
+
+    expect(elem.attributeValueSpans['quux'], null);
+
+    var span = elem.attributeValueSpans['extends'];
+    expect(span.start.offset, text.indexOf('x-bar'));
+    expect(span.text, 'x-bar');
+  });
+
+  test('attribute spans if no attributes', () {
+    var text = '<element>';
+    var doc = parse(text, generateSpans: true);
+    var elem = doc.querySelector('element');
+
+    expect(elem.attributeSpans['quux'], null);
+    expect(elem.attributeValueSpans['quux'], null);
+  });
+
+  test('attribute spans if no attribute value', () {
+    var text = '<foo template>';
+    var doc = parse(text, generateSpans: true);
+    var elem = doc.querySelector('foo');
+
+    expect(
+        elem.attributeSpans['template'].start.offset, text.indexOf('template'));
+    expect(elem.attributeValueSpans.containsKey('template'), false);
+  });
+
+  test('attribute spans null if code parsed without spans', () {
+    var text = '<element name="x-foo" extends="x-bar" constructor="Foo">';
+    var doc = parse(text);
+    var elem = doc.querySelector('element');
+    expect(elem.sourceSpan, null);
+    expect(elem.attributeSpans['quux'], null);
+    expect(elem.attributeSpans['extends'], null);
+  });
+
+  test('void element innerHTML', () {
+    var doc = parse('<div></div>');
+    expect(doc.body.innerHtml, '<div></div>');
+    doc = parse('<body><script></script></body>');
+    expect(doc.body.innerHtml, '<script></script>');
+    doc = parse('<br>');
+    expect(doc.body.innerHtml, '<br>');
+    doc = parse('<br><foo><bar>');
+    expect(doc.body.innerHtml, '<br><foo><bar></bar></foo>');
+  });
+
+  test('empty document has html, body, and head', () {
+    var doc = parse('');
+    var html = '<html><head></head><body></body></html>';
+    expect(doc.outerHtml, html);
+    expect(doc.documentElement.outerHtml, html);
+    expect(doc.head.outerHtml, '<head></head>');
+    expect(doc.body.outerHtml, '<body></body>');
+  });
+
+  test('strange table case', () {
+    var doc = parse('<table><tbody><foo>').body;
+    expect(doc.innerHtml, '<foo></foo><table><tbody></tbody></table>');
+  });
+
+  group('html serialization', () {
+    test('attribute order', () {
+      // Note: the spec only requires a stable order.
+      // However, we preserve the input order via LinkedHashMap
+      var body = parse('<foo d=1 a=2 c=3 b=4>').body;
+      expect(body.innerHtml, '<foo d="1" a="2" c="3" b="4"></foo>');
+      expect(body.querySelector('foo').attributes.remove('a'), '2');
+      expect(body.innerHtml, '<foo d="1" c="3" b="4"></foo>');
+      body.querySelector('foo').attributes['a'] = '0';
+      expect(body.innerHtml, '<foo d="1" c="3" b="4" a="0"></foo>');
+    });
+
+    test('escaping Text node in <script>', () {
+      Element e = parseFragment('<script>a && b</script>').firstChild;
+      expect(e.outerHtml, '<script>a && b</script>');
+    });
+
+    test('escaping Text node in <span>', () {
+      Element e = parseFragment('<span>a && b</span>').firstChild;
+      expect(e.outerHtml, '<span>a &amp;&amp; b</span>');
+    });
+
+    test('Escaping attributes', () {
+      Element e = parseFragment('<div class="a<b>">').firstChild;
+      expect(e.outerHtml, '<div class="a<b>"></div>');
+      e = parseFragment('<div class=\'a"b\'>').firstChild;
+      expect(e.outerHtml, '<div class="a&quot;b"></div>');
+    });
+
+    test('Escaping non-breaking space', () {
+      var text = '<span>foO\u00A0bar</span>';
+      expect(text.codeUnitAt(text.indexOf('O') + 1), 0xA0);
+      Element e = parseFragment(text).firstChild;
+      expect(e.outerHtml, '<span>foO&nbsp;bar</span>');
+    });
+
+    test('Newline after <pre>', () {
+      Element e = parseFragment('<pre>\n\nsome text</span>').firstChild;
+      expect((e.firstChild as Text).data, '\nsome text');
+      expect(e.outerHtml, '<pre>\n\nsome text</pre>');
+
+      e = parseFragment('<pre>\nsome text</span>').firstChild;
+      expect((e.firstChild as Text).data, 'some text');
+      expect(e.outerHtml, '<pre>some text</pre>');
+    });
+
+    test('xml namespaces', () {
+      // Note: this is a nonsensical example, but it triggers the behavior
+      // we're looking for with attribute names in foreign content.
+      var doc = parse('''
+        <body>
+        <svg>
+        <desc xlink:type="simple"
+              xlink:href="http://example.com/logo.png"
+              xlink:show="new"></desc>
+      ''');
+      var n = doc.querySelector('desc');
+      var keys = n.attributes.keys.toList();
+      expect(keys[0], new isInstanceOf<AttributeName>());
+      expect(keys[0].prefix, 'xlink');
+      expect(keys[0].namespace, 'http://www.w3.org/1999/xlink');
+      expect(keys[0].name, 'type');
+
+      expect(n.outerHtml, '<desc xlink:type="simple" '
+          'xlink:href="http://example.com/logo.png" xlink:show="new"></desc>');
+    });
+  });
+
+  test('error printing without spans', () {
+    var parser = new HtmlParser('foo');
+    var doc = parser.parse();
+    expect(doc.body.innerHtml, 'foo');
+    expect(parser.errors.length, 1);
+    expect(parser.errors[0].errorCode, 'expected-doctype-but-got-chars');
+    expect(parser.errors[0].message,
+        'Unexpected non-space characters. Expected DOCTYPE.');
+    expect(parser.errors[0].toString(),
+        'ParserError on line 1, column 4: Unexpected non-space characters. '
+        'Expected DOCTYPE.\n'
+        'foo\n'
+        '  ^');
+  });
+
+  test('Element.text', () {
+    var doc = parseFragment('<div>foo<div>bar</div>baz</div>');
+    var e = doc.firstChild;
+    var text = e.firstChild;
+    expect((text as Text).data, 'foo');
+    expect(e.text, 'foobarbaz');
+
+    e.text = 'FOO';
+    expect(e.nodes.length, 1);
+    expect(e.firstChild, isNot(text), reason: 'should create a new tree');
+    expect((e.firstChild as Text).data, 'FOO');
+    expect(e.text, 'FOO');
+  });
+
+  test('Text.text', () {
+    var doc = parseFragment('<div>foo<div>bar</div>baz</div>');
+    var e = doc.firstChild;
+    Text text = e.firstChild;
+    expect(text.data, 'foo');
+    expect(text.text, 'foo');
+
+    text.text = 'FOO';
+    expect(text.data, 'FOO');
+    expect(e.text, 'FOObarbaz');
+    expect(text.text, 'FOO');
+  });
+
+  test('Comment.text', () {
+    var doc = parseFragment('<div><!--foo-->bar</div>');
+    var e = doc.firstChild;
+    var c = e.firstChild;
+    expect((c as Comment).data, 'foo');
+    expect(c.text, 'foo');
+    expect(e.text, 'bar');
+
+    c.text = 'qux';
+    expect(c.data, 'qux');
+    expect(c.text, 'qux');
+    expect(e.text, 'bar');
+  });
+
+  test('foreignObject end tag', () {
+    var p = new HtmlParser('''
+<svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg"
+     version="1.1">
+    <foreignObject width="320px" height="200px">
+        <x-flow></x-flow>
+    </foreignObject>
+</svg>''');
+    var doc = p.parseFragment();
+    expect(p.errors, isEmpty);
+    var svg = doc.querySelector('svg');
+    expect(svg.children[0].children[0].localName, 'x-flow');
+  });
+
+  group('Encoding pre-parser', () {
+    getEncoding(s) => new EncodingParser(s.codeUnits).getEncoding();
+
+    test('gets encoding from meta charset', () {
+      expect(getEncoding('<meta charset="utf-16">'), 'utf-16');
+    });
+
+    test('gets encoding from meta in head', () {
+      expect(getEncoding('<head><meta charset="utf-16">'), 'utf-16');
+    });
+
+    test('skips comments', () {
+      expect(getEncoding('<!--comment--><meta charset="utf-16">'), 'utf-16');
+    });
+
+    test('stops if no match', () {
+      // missing closing tag
+      expect(getEncoding('<meta charset="utf-16"'), null);
+    });
+
+    test('ignores whitespace', () {
+      expect(getEncoding('  <meta charset="utf-16">'), 'utf-16');
+    });
+  });
+}
+
+_testElementSpans() {
+  assertSpan(SourceSpan span, int offset, int end, String text) {
+    expect(span, isNotNull);
+    expect(span.start.offset, offset);
+    expect(span.end.offset, end);
+    expect(span.text, text);
+  }
+
+  group('element spans', () {
+    test('html and body', () {
+      var text = '<html><body>123</body></html>';
+      var doc = parse(text, generateSpans: true);
+      {
+        var elem = doc.querySelector('html');
+        assertSpan(elem.sourceSpan, 0, 6, '<html>');
+        assertSpan(elem.endSourceSpan, 22, 29, '</html>');
+      }
+      {
+        var elem = doc.querySelector('body');
+        assertSpan(elem.sourceSpan, 6, 12, '<body>');
+        assertSpan(elem.endSourceSpan, 15, 22, '</body>');
+      }
+    });
+
+    test('normal', () {
+      var text = '<div><element><span></span></element></div>';
+      var doc = parse(text, generateSpans: true);
+      var elem = doc.querySelector('element');
+      assertSpan(elem.sourceSpan, 5, 14, '<element>');
+      assertSpan(elem.endSourceSpan, 27, 37, '</element>');
+    });
+
+    test('block', () {
+      var text = '<div>123</div>';
+      var doc = parse(text, generateSpans: true);
+      var elem = doc.querySelector('div');
+      assertSpan(elem.sourceSpan, 0, 5, '<div>');
+      assertSpan(elem.endSourceSpan, 8, 14, '</div>');
+    });
+
+    test('form', () {
+      var text = '<form>123</form>';
+      var doc = parse(text, generateSpans: true);
+      var elem = doc.querySelector('form');
+      assertSpan(elem.sourceSpan, 0, 6, '<form>');
+      assertSpan(elem.endSourceSpan, 9, 16, '</form>');
+    });
+
+    test('p explicit end', () {
+      var text = '<p>123</p>';
+      var doc = parse(text, generateSpans: true);
+      var elem = doc.querySelector('p');
+      assertSpan(elem.sourceSpan, 0, 3, '<p>');
+      assertSpan(elem.endSourceSpan, 6, 10, '</p>');
+    });
+
+    test('p implicit end', () {
+      var text = '<div><p>123<p>456</div>';
+      var doc = parse(text, generateSpans: true);
+      var elem = doc.querySelector('p');
+      assertSpan(elem.sourceSpan, 5, 8, '<p>');
+      expect(elem.endSourceSpan, isNull);
+    });
+
+    test('li', () {
+      var text = '<li>123</li>';
+      var doc = parse(text, generateSpans: true);
+      var elem = doc.querySelector('li');
+      assertSpan(elem.sourceSpan, 0, 4, '<li>');
+      assertSpan(elem.endSourceSpan, 7, 12, '</li>');
+    });
+
+    test('heading', () {
+      var text = '<h1>123</h1>';
+      var doc = parse(text, generateSpans: true);
+      var elem = doc.querySelector('h1');
+      assertSpan(elem.sourceSpan, 0, 4, '<h1>');
+      assertSpan(elem.endSourceSpan, 7, 12, '</h1>');
+    });
+
+    test('formatting', () {
+      var text = '<b>123</b>';
+      var doc = parse(text, generateSpans: true);
+      var elem = doc.querySelector('b');
+      assertSpan(elem.sourceSpan, 0, 3, '<b>');
+      assertSpan(elem.endSourceSpan, 6, 10, '</b>');
+    });
+
+    test('table tbody', () {
+      var text = '<table><tbody>  </tbody></table>';
+      var doc = parse(text, generateSpans: true);
+      {
+        var elem = doc.querySelector('tbody');
+        assertSpan(elem.sourceSpan, 7, 14, '<tbody>');
+        assertSpan(elem.endSourceSpan, 16, 24, '</tbody>');
+      }
+    });
+
+    test('table tr td', () {
+      var text = '<table><tr><td>123</td></tr></table>';
+      var doc = parse(text, generateSpans: true);
+      {
+        var elem = doc.querySelector('table');
+        assertSpan(elem.sourceSpan, 0, 7, '<table>');
+        assertSpan(elem.endSourceSpan, 28, 36, '</table>');
+      }
+      {
+        var elem = doc.querySelector('tr');
+        assertSpan(elem.sourceSpan, 7, 11, '<tr>');
+        assertSpan(elem.endSourceSpan, 23, 28, '</tr>');
+      }
+      {
+        var elem = doc.querySelector('td');
+        assertSpan(elem.sourceSpan, 11, 15, '<td>');
+        assertSpan(elem.endSourceSpan, 18, 23, '</td>');
+      }
+    });
+
+    test('select optgroup option', () {
+      var text = '<select><optgroup><option>123</option></optgroup></select>';
+      var doc = parse(text, generateSpans: true);
+      {
+        var elem = doc.querySelector('select');
+        assertSpan(elem.sourceSpan, 0, 8, '<select>');
+        assertSpan(elem.endSourceSpan, 49, 58, '</select>');
+      }
+      {
+        var elem = doc.querySelector('optgroup');
+        assertSpan(elem.sourceSpan, 8, 18, '<optgroup>');
+        assertSpan(elem.endSourceSpan, 38, 49, '</optgroup>');
+      }
+      {
+        var elem = doc.querySelector('option');
+        assertSpan(elem.sourceSpan, 18, 26, '<option>');
+        assertSpan(elem.endSourceSpan, 29, 38, '</option>');
+      }
+    });
+  });
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/html/test/parser_test.dart b/mojo/public/dart/third_party/html/test/parser_test.dart
new file mode 100644
index 0000000..6f81086
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/parser_test.dart
@@ -0,0 +1,116 @@
+library parser_test;
+
+import 'dart:convert';
+import 'dart:io';
+import 'package:path/path.dart' as pathos;
+import 'package:unittest/unittest.dart';
+import 'package:html/dom.dart';
+import 'package:html/parser.dart';
+import 'package:html/parser_console.dart' as parser_console;
+import 'package:html/src/inputstream.dart' as inputstream;
+import 'support.dart';
+
+// Run the parse error checks
+// TODO(jmesserly): presumably we want this on by default?
+final checkParseErrors = false;
+
+String namespaceHtml(String expected) {
+  // TODO(jmesserly): this is a workaround for http://dartbug.com/2979
+  // We can't do regex replace directly =\
+  // final namespaceExpected = new RegExp(@"^(\s*)<(\S+)>", multiLine: true);
+  // return expected.replaceAll(namespaceExpected, @"$1<html $2>");
+  final namespaceExpected = new RegExp(r"^(\|\s*)<(\S+)>");
+  var lines = expected.split("\n");
+  for (int i = 0; i < lines.length; i++) {
+    var match = namespaceExpected.firstMatch(lines[i]);
+    if (match != null) {
+      lines[i] = "${match[1]}<html ${match[2]}>";
+    }
+  }
+  return lines.join("\n");
+}
+
+void runParserTest(String groupName, String innerHTML, String input,
+    String expected, List errors, TreeBuilderFactory treeCtor,
+    bool namespaceHTMLElements) {
+
+  // XXX - move this out into the setup function
+  // concatenate all consecutive character tokens into a single token
+  var builder = treeCtor(namespaceHTMLElements);
+  var parser = new HtmlParser(input, tree: builder);
+
+  Node document;
+  if (innerHTML != null) {
+    document = parser.parseFragment(innerHTML);
+  } else {
+    document = parser.parse();
+  }
+
+  var output = testSerializer(document);
+
+  if (namespaceHTMLElements) {
+    expected = namespaceHtml(expected);
+  }
+
+  expect(output, equals(expected),
+      reason: "\n\nInput:\n$input\n\nExpected:\n$expected\n\nReceived:\n$output");
+
+  if (checkParseErrors) {
+    expect(parser.errors.length, equals(errors.length),
+        reason: "\n\nInput:\n$input\n\nExpected errors (${errors.length}):\n"
+        "${errors.join('\n')}\n\n"
+        "Actual errors (${parser.errors.length}):\n"
+        "${parser.errors.map((e) => '$e').join('\n')}");
+  }
+}
+
+void main() {
+  test('dart:io', () {
+    // ensure IO support is unregistered
+    expect(inputstream.consoleSupport,
+        new isInstanceOf<inputstream.ConsoleSupport>());
+    var file = new File('$testDataDir/parser_feature/raw_file.html').openSync();
+    expect(() => parse(file), throwsA(new isInstanceOf<ArgumentError>()));
+    parser_console.useConsole();
+    expect(parse(file).body.innerHtml.trim(), 'Hello world!');
+  });
+
+  for (var path in getDataFiles('tree-construction')) {
+    if (!path.endsWith('.dat')) continue;
+
+    var tests = new TestData(path, "data");
+    var testName = pathos.basenameWithoutExtension(path);
+
+    group(testName, () {
+      for (var testData in tests) {
+        var input = testData['data'];
+        var errors = testData['errors'];
+        var innerHTML = testData['document-fragment'];
+        var expected = testData['document'];
+        if (errors != null) {
+          errors = errors.split("\n");
+        }
+
+        for (var treeCtor in treeTypes.values) {
+          for (var namespaceHTMLElements in const [false, true]) {
+            test(_nameFor(input), () {
+              runParserTest(testName, innerHTML, input, expected, errors,
+                  treeCtor, namespaceHTMLElements);
+            });
+          }
+        }
+      }
+    });
+  }
+}
+
+/// Extract the name for the test based on the test input data.
+_nameFor(String input) {
+  // Using JSON.decode to unescape other unicode characters
+  var escapeQuote = input
+      .replaceAll(new RegExp('\\\\.'), '_')
+      .replaceAll(new RegExp('\u0000'), '_')
+      .replaceAll('"', '\\"')
+      .replaceAll(new RegExp('[\n\r\t]'), '_');
+  return JSON.decode('"$escapeQuote"');
+}
diff --git a/mojo/public/dart/third_party/html/test/run.sh b/mojo/public/dart/third_party/html/test/run.sh
new file mode 100755
index 0000000..c060bd7
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/run.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+# Copyright (c) 2012, the Dart project authors.  Please see the LICENSE file
+# for details. All rights reserved. Use of this source code is governed by a
+# MIT-style license that can be found in the LICENSE file.
+
+# bail on error
+set -e
+
+# TODO(sigmund): replace with a real test runner
+DIR=$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd )
+
+# Note: dart_analyzer needs to be run from the root directory for proper path
+# canonicalization.
+pushd $DIR/..
+# TODO(jmesserly): switch to new analyzer. Note: it's missing a lot of the
+# tests for implemented members; we should get that fixed before switching.
+echo Analyzing library for warnings or type errors
+dartanalyzer --fatal-warnings lib/*.dart || \
+  echo "ignore analyzer errors"
+popd
+
+dart --checked test/run_all.dart $@
diff --git a/mojo/public/dart/third_party/html/test/run_all.dart b/mojo/public/dart/third_party/html/test/run_all.dart
new file mode 100755
index 0000000..14e6b34
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/run_all.dart
@@ -0,0 +1,30 @@
+#!/usr/bin/env dart
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.run_all;
+
+import 'package:unittest/compact_vm_config.dart';
+import 'package:unittest/unittest.dart';
+
+import 'dom_test.dart' as dom_test;
+import 'parser_feature_test.dart' as parser_feature_test;
+import 'parser_test.dart' as parser_test;
+import 'tokenizer_test.dart' as tokenizer_test;
+
+main(List<String> args) {
+  var pattern = new RegExp(args.length > 0 ? args[0] : '.');
+  useCompactVMConfiguration();
+
+  void addGroup(testFile, testMain) {
+    if (pattern.hasMatch(testFile)) {
+      group(testFile.replaceAll('_test.dart', ':'), testMain);
+    }
+  }
+
+  addGroup('dom_test.dart', dom_test.main);
+  addGroup('parser_feature_test.dart', parser_feature_test.main);
+  addGroup('parser_test.dart', parser_test.main);
+  addGroup('tokenizer_test.dart', tokenizer_test.main);
+}
diff --git a/mojo/public/dart/third_party/html/test/selectors/LICENSE b/mojo/public/dart/third_party/html/test/selectors/LICENSE
new file mode 100644
index 0000000..0dc0193
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/selectors/LICENSE
@@ -0,0 +1,9 @@
+Contents of this folder are ported from
+https://github.com/w3c/web-platform-tests/tree/master/selectors-api
+
+It is based on commit 96c61ac7c21f7f37526d1c03c4c6087734524130
+
+The original code is covered by the dual-licensing approach described in:
+
+    http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html
+    
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/html/test/selectors/README b/mojo/public/dart/third_party/html/test/selectors/README
new file mode 100644
index 0000000..d6e3852
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/selectors/README
@@ -0,0 +1,9 @@
+Contents of this folder are ported from
+https://github.com/w3c/web-platform-tests/tree/master/selectors-api
+
+It is based on commit 96c61ac7c21f7f37526d1c03c4c6087734524130
+
+It is used to test the implementation of querySelector/querySelectorAll.
+
+Not all code was ported; as the current implementation doesn't yet support
+all features of those methods.
diff --git a/mojo/public/dart/third_party/html/test/selectors/level1-content.html b/mojo/public/dart/third_party/html/test/selectors/level1-content.html
new file mode 100644
index 0000000..b90d918
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/selectors/level1-content.html
@@ -0,0 +1,377 @@
+<!DOCTYPE html>
+<html id="html" lang="en">
+<head id="head">
+	<meta id="meta" charset="UTF-8">
+	<title id="title">Selectors-API Test Suite: HTML with Selectors Level 2 using TestHarness: Test Document</title>
+
+	<!-- Links for :link and :visited pseudo-class test -->
+	<link id="pseudo-link-link1" href="">
+	<link id="pseudo-link-link2" href="http://example.org/">
+	<link id="pseudo-link-link3">
+	<style>
+	@namespace ns "http://www.w3.org/1999/xhtml";
+	 /* Declare the namespace prefix used in tests. This declaration should not be used by the API. */
+	</style>
+</head>
+<body id="body">
+<div id="root">
+	<div id="target"></div>
+
+	<div id="universal">
+		<p id="universal-p1">Universal selector tests inside element with <code id="universal-code1">id="universal"</code>.</p>
+		<hr id="universal-hr1">
+		<pre id="universal-pre1">Some preformatted text with some <span id="universal-span1">embedded code</span></pre>
+		<p id="universal-p2">This is a normal link: <a id="universal-a1" href="http://www.w3.org/">W3C</a></p>
+		<address id="universal-address1">Some more nested elements <code id="universal-code2"><a href="#" id="universal-a2">code hyperlink</a></code></address>
+	</div>
+
+	<div id="attr-presence">
+		<div class="attr-presence-div1" id="attr-presence-div1" align="center"></div>
+		<div class="attr-presence-div2" id="attr-presence-div2" align=""></div>
+		<div class="attr-presence-div3" id="attr-presence-div3" valign="center"></div>
+		<div class="attr-presence-div4" id="attr-presence-div4" alignv="center"></div>
+		<p id="attr-presence-p1"><a  id="attr-presence-a1" tItLe=""></a><span id="attr-presence-span1" TITLE="attr-presence-span1"></span></p>
+		<pre id="attr-presence-pre1" data-attr-presence="pre1"></pre>
+		<blockquote id="attr-presence-blockquote1" data-attr-presence="blockquote1"></blockquote>
+		<ul id="attr-presence-ul1" data-中文=""></ul>
+
+		<select id="attr-presence-select1">
+			<option id="attr-presence-select1-option1">A</option>
+			<option id="attr-presence-select1-option2">B</option>
+			<option id="attr-presence-select1-option3">C</option>
+			<option id="attr-presence-select1-option4">D</option>
+		</select>
+		<select id="attr-presence-select2">
+			<option id="attr-presence-select2-option1">A</option>
+			<option id="attr-presence-select2-option2">B</option>
+			<option id="attr-presence-select2-option3">C</option>
+			<option id="attr-presence-select2-option4" selected="selected">D</option>
+		</select>
+		<select id="attr-presence-select3" multiple="multiple">
+			<option id="attr-presence-select3-option1">A</option>
+			<option id="attr-presence-select3-option2" selected="">B</option>
+			<option id="attr-presence-select3-option3" selected="selected">C</option>
+			<option id="attr-presence-select3-option4">D</option>
+		</select>
+	</div>
+
+	<div id="attr-value">
+		<div id="attr-value-div1" align="center"></div>
+	    <div id="attr-value-div2" align=""></div>
+	    <div id="attr-value-div3" data-attr-value="&#xE9;"></div>
+	    <div id="attr-value-div4" data-attr-value_foo="&#xE9;"></div>
+
+		<form id="attr-value-form1">
+			<input id="attr-value-input1" type="text">
+			<input id="attr-value-input2" type="password">
+			<input id="attr-value-input3" type="hidden">
+			<input id="attr-value-input4" type="radio">
+			<input id="attr-value-input5" type="checkbox">
+			<input id="attr-value-input6" type="radio">
+			<input id="attr-value-input7" type="text">
+			<input id="attr-value-input8" type="hidden">
+			<input id="attr-value-input9" type="radio">
+		</form>
+
+		<div id="attr-value-div5" data-attr-value="中文"></div>
+	</div>
+
+	<div id="attr-whitespace">
+		<div id="attr-whitespace-div1" class="foo div1 bar"></div>
+	    <div id="attr-whitespace-div2" class=""></div>
+	    <div id="attr-whitespace-div3" class="foo div3 bar"></div>
+
+	    <div id="attr-whitespace-div4" data-attr-whitespace="foo &#xE9; bar"></div>
+	    <div id="attr-whitespace-div5" data-attr-whitespace_foo="&#xE9; foo"></div>
+
+		<a id="attr-whitespace-a1" rel="next bookmark"></a>
+		<a id="attr-whitespace-a2" rel="tag nofollow"></a>
+		<a id="attr-whitespace-a3" rel="tag bookmark"></a>
+		<a id="attr-whitespace-a4" rel="book mark"></a> <!-- Intentional space in "book mark" -->
+		<a id="attr-whitespace-a5" rel="nofollow"></a>
+		<a id="attr-whitespace-a6" rev="bookmark nofollow"></a>
+		<a id="attr-whitespace-a7" rel="prev next tag alternate nofollow author help icon noreferrer prefetch search stylesheet tag"></a>
+		
+		<p id="attr-whitespace-p1" title="Chinese 中文 characters"></p>
+	</div>
+
+	<div id="attr-hyphen">
+		<div id="attr-hyphen-div1"></div>
+	    <div id="attr-hyphen-div2" lang="fr"></div>
+	    <div id="attr-hyphen-div3" lang="en-AU"></div>
+	    <div id="attr-hyphen-div4" lang="es"></div>
+	</div>
+
+	<div id="attr-begins">
+		<a id="attr-begins-a1" href="http://www.example.org"></a>
+		<a id="attr-begins-a2" href="http://example.org/"></a>
+		<a id="attr-begins-a3" href="http://www.example.com/"></a>
+
+	    <div id="attr-begins-div1" lang="fr"></div>
+	    <div id="attr-begins-div2" lang="en-AU"></div>
+	    <div id="attr-begins-div3" lang="es"></div>
+	    <div id="attr-begins-div4" lang="en-US"></div>
+	    <div id="attr-begins-div5" lang="en"></div>
+
+		<p id="attr-begins-p1" class=" apple"></p> <!-- Intentional space in class value " apple". -->
+	</div>
+
+	<div id="attr-ends">
+		<a id="attr-ends-a1" href="http://www.example.org"></a>
+		<a id="attr-ends-a2" href="http://example.org/"></a>
+		<a id="attr-ends-a3" href="http://www.example.org"></a>
+
+	    <div id="attr-ends-div1" lang="fr"></div>
+	    <div id="attr-ends-div2" lang="de-CH"></div>
+	    <div id="attr-ends-div3" lang="es"></div>
+	    <div id="attr-ends-div4" lang="fr-CH"></div>
+
+		<p id="attr-ends-p1" class="apple "></p> <!-- Intentional space in class value "apple ". -->
+	</div>
+
+	<div id="attr-contains">
+		<a id="attr-contains-a1" href="http://www.example.org"></a>
+		<a id="attr-contains-a2" href="http://example.org/"></a>
+		<a id="attr-contains-a3" href="http://www.example.com/"></a>
+
+	    <div id="attr-contains-div1" lang="fr"></div>
+	    <div id="attr-contains-div2" lang="en-AU"></div>
+	    <div id="attr-contains-div3" lang="de-CH"></div>
+	    <div id="attr-contains-div4" lang="es"></div>
+	    <div id="attr-contains-div5" lang="fr-CH"></div>
+	    <div id="attr-contains-div6" lang="en-US"></div>
+
+		<p id="attr-contains-p1" class=" apple banana orange "></p>
+	</div>
+
+	<div id="pseudo-nth">
+		<table id="pseudo-nth-table1">
+			<tr id="pseudo-nth-tr1"><td id="pseudo-nth-td1"></td><td id="pseudo-nth-td2"></td><td id="pseudo-nth-td3"></td><td id="pseudo-nth-td4"></td><td id="pseudo-nth--td5"></td><td id="pseudo-nth-td6"></td></tr>
+			<tr id="pseudo-nth-tr2"><td id="pseudo-nth-td7"></td><td id="pseudo-nth-td8"></td><td id="pseudo-nth-td9"></td><td id="pseudo-nth-td10"></td><td id="pseudo-nth-td11"></td><td id="pseudo-nth-td12"></td></tr>
+			<tr id="pseudo-nth-tr3"><td id="pseudo-nth-td13"></td><td id="pseudo-nth-td14"></td><td id="pseudo-nth-td15"></td><td id="pseudo-nth-td16"></td><td id="pseudo-nth-td17"></td><td id="pseudo-nth-td18"></td></tr>
+		</table>
+		
+		<ol id="pseudo-nth-ol1">
+			<li id="pseudo-nth-li1"></li>
+			<li id="pseudo-nth-li2"></li>
+			<li id="pseudo-nth-li3"></li>
+			<li id="pseudo-nth-li4"></li>
+			<li id="pseudo-nth-li5"></li>
+			<li id="pseudo-nth-li6"></li>
+			<li id="pseudo-nth-li7"></li>
+			<li id="pseudo-nth-li8"></li>
+			<li id="pseudo-nth-li9"></li>
+			<li id="pseudo-nth-li10"></li>
+			<li id="pseudo-nth-li11"></li>
+			<li id="pseudo-nth-li12"></li>
+		</ol>
+
+		<p id="pseudo-nth-p1">
+			<span id="pseudo-nth-span1">span1</span>
+			<em id="pseudo-nth-em1">em1</em>
+			<!-- comment node-->
+			<em id="pseudo-nth-em2">em2</em>
+			<span id="pseudo-nth-span2">span2</span>
+			<strong id="pseudo-nth-strong1">strong1</strong>
+			<em id="pseudo-nth-em3">em3</em>
+			<span id="pseudo-nth-span3">span3</span>
+			<span id="pseudo-nth-span4">span4</span>
+			<strong id="pseudo-nth-strong2">strong2</strong>
+			<em id="pseudo-nth-em4">em4</em>
+		</p>
+	</div>
+
+	<div id="pseudo-first-child">
+		<div id="pseudo-first-child-div1"></div>
+		<div id="pseudo-first-child-div2"></div>
+		<div id="pseudo-first-child-div3"></div>
+
+		<p id="pseudo-first-child-p1"><span id="pseudo-first-child-span1"></span><span id="pseudo-first-child-span2"></span></p>
+		<p id="pseudo-first-child-p2"><span id="pseudo-first-child-span3"></span><span id="pseudo-first-child-span4"></span></p>
+		<p id="pseudo-first-child-p3"><span id="pseudo-first-child-span5"></span><span id="pseudo-first-child-span6"></span></p>
+	</div>
+
+	<div id="pseudo-last-child">
+		<p id="pseudo-last-child-p1"><span id="pseudo-last-child-span1"></span><span id="pseudo-last-child-span2"></span></p>
+		<p id="pseudo-last-child-p2"><span id="pseudo-last-child-span3"></span><span id="pseudo-last-child-span4"></span></p>
+		<p id="pseudo-last-child-p3"><span id="pseudo-last-child-span5"></span><span id="pseudo-last-child-span6"></span></p>
+
+		<div id="pseudo-last-child-div1"></div>
+		<div id="pseudo-last-child-div2"></div>
+		<div id="pseudo-last-child-div3"></div>
+	</div>
+
+	<div id="pseudo-only">
+		<p id="pseudo-only-p1">
+			<span id="pseudo-only-span1"></span>
+		</p>
+		<p id="pseudo-only-p2">
+			<span id="pseudo-only-span2"></span>
+			<span id="pseudo-only-span3"></span>
+		</p>
+		<p id="pseudo-only-p3">
+			<span id="pseudo-only-span4"></span>
+			<em id="pseudo-only-em1"></em>
+			<span id="pseudo-only-span5"></span>
+		</p>
+	</div>>
+
+	<div id="pseudo-empty">
+		<p id="pseudo-empty-p1"></p>
+		<p id="pseudo-empty-p2"><!-- comment node --></p>
+		<p id="pseudo-empty-p3"> </p>
+		<p id="pseudo-empty-p4">Text node</p>
+		<p id="pseudo-empty-p5"><span id="pseudo-empty-span1"></span></p>
+	</div>
+
+	<div id="pseudo-link">
+		<a id="pseudo-link-a1" href="">with href</a>
+		<a id="pseudo-link-a2" href="http://example.org/">with href</a>
+		<a id="pseudo-link-a3">without href</a>
+		<map name="pseudo-link-map1" id="pseudo-link-map1">
+			<area id="pseudo-link-area1" href="">
+			<area id="pseudo-link-area2">
+		</map>
+	</div>
+
+	<div id="pseudo-lang">
+		<div id="pseudo-lang-div1"></div>
+	    <div id="pseudo-lang-div2" lang="fr"></div>
+	    <div id="pseudo-lang-div3" lang="en-AU"></div>
+	    <div id="pseudo-lang-div4" lang="es"></div>
+	</div>
+
+	<div id="pseudo-ui">
+		<input id="pseudo-ui-input1" type="text">
+		<input id="pseudo-ui-input2" type="password">
+		<input id="pseudo-ui-input3" type="radio">
+		<input id="pseudo-ui-input4" type="radio" checked="checked">
+		<input id="pseudo-ui-input5" type="checkbox">
+		<input id="pseudo-ui-input6" type="checkbox" checked="checked">
+		<input id="pseudo-ui-input7" type="submit">
+		<input id="pseudo-ui-input8" type="button">
+		<input id="pseudo-ui-input9" type="hidden">
+		<textarea id="pseudo-ui-textarea1"></textarea>
+		<button id="pseudo-ui-button1">Enabled</button>
+
+		<input id="pseudo-ui-input10" disabled="disabled" type="text">
+		<input id="pseudo-ui-input11" disabled="disabled" type="password">
+		<input id="pseudo-ui-input12" disabled="disabled" type="radio">
+		<input id="pseudo-ui-input13" disabled="disabled" type="radio" checked="checked">
+		<input id="pseudo-ui-input14" disabled="disabled" type="checkbox">
+		<input id="pseudo-ui-input15" disabled="disabled" type="checkbox" checked="checked">
+		<input id="pseudo-ui-input16" disabled="disabled" type="submit">
+		<input id="pseudo-ui-input17" disabled="disabled" type="button">
+		<input id="pseudo-ui-input18" disabled="disabled" type="hidden">
+		<textarea id="pseudo-ui-textarea2" disabled="disabled"></textarea>
+		<button id="pseudo-ui-button2" disabled="disabled">Disabled</button>
+	</div>
+
+	<div id="not">
+		<div id="not-div1"></div>
+		<div id="not-div2"></div>
+		<div id="not-div3"></div>
+
+		<p id="not-p1"><span id="not-span1"></span><em id="not-em1"></em></p>
+		<p id="not-p2"><span id="not-span2"></span><em id="not-em2"></em></p>
+		<p id="not-p3"><span id="not-span3"></span><em id="not-em3"></em></p>
+	</div>
+
+	<div id="pseudo-element">All pseudo-element tests</div>
+
+	<div id="class">
+		<p id="class-p1" class="foo class-p bar"></p>
+		<p id="class-p2" class="class-p foo bar"></p>
+		<p id="class-p3" class="foo bar class-p"></p>
+
+		<!-- All permutations of the classes should match -->
+		<div id="class-div1" class="apple orange banana"></div>
+		<div id="class-div2" class="apple banana orange"></div>
+		<p id="class-p4" class="orange apple banana"></p>
+		<div id="class-div3" class="orange banana apple"></div>
+		<p id="class-p6" class="banana apple orange"></p>
+		<div id="class-div4" class="banana orange apple"></div>
+		<div id="class-div5" class="apple orange"></div>
+		<div id="class-div6" class="apple banana"></div>
+		<div id="class-div7" class="orange banana"></div>
+
+		<span id="class-span1" class="台北Táiběi 台北"></span>
+		<span id="class-span2" class="台北"></span>
+
+		<span id="class-span3" class="foo:bar"></span>
+		<span id="class-span4" class="test.foo[5]bar"></span>
+	</div>
+
+	<div id="id">
+		<div id="id-div1"></div>
+		<div id="id-div2"></div>
+
+		<ul id="id-ul1">
+			<li id="id-li-duplicate"></li>
+			<li id="id-li-duplicate"></li>
+			<li id="id-li-duplicate"></li>
+			<li id="id-li-duplicate"></li>
+		</ul>
+
+		<span id="台北Táiběi"></span>
+		<span id="台北"></span>
+
+		<span id="#foo:bar"></span>
+		<span id="test.foo[5]bar"></span>
+	</div>
+
+	<div id="descendant">
+		<div id="descendant-div1" class="descendant-div1">
+			<div id="descendant-div2" class="descendant-div2">
+				<div id="descendant-div3" class="descendant-div3">
+				</div>				
+			</div>
+		</div>
+		<div id="descendant-div4" class="descendant-div4"></div>
+	</div>
+
+	<div id="child">
+		<div id="child-div1" class="child-div1">
+			<div id="child-div2" class="child-div2">
+				<div id="child-div3" class="child-div3">
+				</div>				
+			</div>
+		</div>
+		<div id="child-div4" class="child-div4"></div>
+	</div>
+
+	<div id="adjacent">
+		<div id="adjacent-div1" class="adjacent-div1"></div>
+		<div id="adjacent-div2" class="adjacent-div2">
+			<div id="adjacent-div3" class="adjacent-div3"></div>
+		</div>
+		<div id="adjacent-div4" class="adjacent-div4">
+			<p id="adjacent-p1" class="adjacent-p1"></p>
+			<div id="adjacent-div5" class="adjacent-div5"></div>
+		</div>
+		<div id="adjacent-div6" class="adjacent-div6"></div>
+		<p id="adjacent-p2" class="adjacent-p2"></p>
+		<p id="adjacent-p3" class="adjacent-p3"></p>
+	</div>
+
+	<div id="sibling">
+		<div id="sibling-div1" class="sibling-div"></div>
+		<div id="sibling-div2" class="sibling-div">
+			<div id="sibling-div3" class="sibling-div"></div>
+		</div>
+		<div id="sibling-div4" class="sibling-div">
+			<p id="sibling-p1" class="sibling-p"></p>
+			<div id="sibling-div5" class="sibling-div"></div>
+		</div>
+		<div id="sibling-div6" class="sibling-div"></div>
+		<p id="sibling-p2" class="sibling-p"></p>
+		<p id="sibling-p3" class="sibling-p"></p>
+	</div>
+
+	<div id="group">
+		<em id="group-em1"></em>
+		<strong id="group-strong1"></strong>
+	</div>
+</div>
+</body>
+</html>
diff --git a/mojo/public/dart/third_party/html/test/selectors/level1_baseline_test.dart b/mojo/public/dart/third_party/html/test/selectors/level1_baseline_test.dart
new file mode 100644
index 0000000..e052843
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/selectors/level1_baseline_test.dart
@@ -0,0 +1,122 @@
+/// Test for the Selectors API ported from
+/// <https://github.com/w3c/web-platform-tests/tree/master/selectors-api>
+///
+/// Note, unlike the original we don't operate in-browser on a DOM loaded into
+/// an iframe, but instead operate over a parsed DOM.
+library html.test.selectors.level1_baseline_test;
+
+import 'dart:io';
+import 'package:html/dom.dart';
+import 'package:html/parser.dart';
+import 'package:unittest/unittest.dart';
+import 'level1_lib.dart' hide test;
+import 'selectors.dart';
+
+Document getTestContentDocument() {
+  var testPath = Platform.script.resolve('level1-content.html').toFilePath();
+  return parse(new File(testPath).readAsStringSync());
+}
+
+var testType = TEST_QSA_BASELINE; // Only run baseline tests.
+var docType = "html"; // Only run tests suitable for HTML
+
+main() {
+  /*
+   * This test suite tests Selectors API methods in 4 different contexts:
+   * 1. Document node
+   * 2. In-document Element node
+   * 3. Detached Element node (an element with no parent, not in the document)
+   * 4. Document Fragment node
+   *
+   * For each context, the following tests are run:
+   *
+   * The interface check tests ensure that each type of node exposes the Selectors API methods
+   *
+   * The special selector tests verify the result of passing special values for the selector parameter,
+   * to ensure that the correct WebIDL processing is performed, such as stringification of null and
+   * undefined and missing parameter. The universal selector is also tested here, rather than with the
+   * rest of ordinary selectors for practical reasons.
+   *
+   * The static list verification tests ensure that the node lists returned by the method remain unchanged
+   * due to subsequent document modication, and that a new list is generated each time the method is
+   * invoked based on the current state of the document.
+   *
+   * The invalid selector tests ensure that SyntaxError is thrown for invalid forms of selectors
+   *
+   * The valid selector tests check the result from querying many different types of selectors, with a
+   * list of expected elements. This checks that querySelector() always returns the first result from
+   * querySelectorAll(), and that all matching elements are correctly returned in tree-order. The tests
+   * can be limited by specifying the test types to run, using the testType variable. The constants for this
+   * can be found in selectors.js.
+   *
+   * All the selectors tested for both the valid and invalid selector tests are found in selectors.js.
+   * See comments in that file for documentation of the format used.
+   *
+   * The level1-lib.js file contains all the common test functions for running each of the aforementioned tests
+   */
+
+  // Prepare the nodes for testing
+  //doc = frame.contentDocument;                 // Document Node tests
+  doc = getTestContentDocument();
+
+  var element = doc.getElementById("root"); // In-document Element Node tests
+
+  //Setup the namespace tests
+  setupSpecialElements(element);
+
+  var outOfScope = element
+      .clone(true); // Append this to the body before running the in-document
+  // Element tests, but after running the Document tests. This
+  // tests that no elements that are not descendants of element
+  // are selected.
+
+  traverse(outOfScope, (elem) {
+    // Annotate each element as being a clone; used for verifying
+    elem.attributes["data-clone"] =
+        ""; // that none of these elements ever match.
+  });
+
+  var detached = element.clone(true); // Detached Element Node tests
+
+  var fragment = doc.createDocumentFragment(); // Fragment Node tests
+  fragment.append(element.clone(true));
+
+  // Setup Tests
+  interfaceCheck("Document", doc);
+  interfaceCheck("Detached Element", detached);
+  interfaceCheck("Fragment", fragment);
+  interfaceCheck("In-document Element", element);
+
+  runSpecialSelectorTests("Document", doc);
+  runSpecialSelectorTests("Detached Element", detached);
+  runSpecialSelectorTests("Fragment", fragment);
+  runSpecialSelectorTests("In-document Element", element);
+
+  verifyStaticList("Document", doc);
+  verifyStaticList("Detached Element", detached);
+  verifyStaticList("Fragment", fragment);
+  verifyStaticList("In-document Element", element);
+
+  // TODO(jmesserly): fix negative tests
+  //runInvalidSelectorTest("Document", doc, invalidSelectors);
+  //runInvalidSelectorTest("Detached Element", detached, invalidSelectors);
+  //runInvalidSelectorTest("Fragment", fragment, invalidSelectors);
+  //runInvalidSelectorTest("In-document Element", element, invalidSelectors);
+
+  runValidSelectorTest("Document", doc, validSelectors, testType, docType);
+  runValidSelectorTest(
+      "Detached Element", detached, validSelectors, testType, docType);
+  runValidSelectorTest("Fragment", fragment, validSelectors, testType, docType);
+
+  group('out of scope', () {
+    setUp(() {
+      doc.body.append(outOfScope); // Append before in-document Element tests.
+      // None of these elements should match
+    });
+    tearDown(() {
+      outOfScope.remove();
+    });
+    runValidSelectorTest(
+        "In-document Element", element, validSelectors, testType, docType);
+  });
+}
diff --git a/mojo/public/dart/third_party/html/test/selectors/level1_lib.dart b/mojo/public/dart/third_party/html/test/selectors/level1_lib.dart
new file mode 100644
index 0000000..3191353
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/selectors/level1_lib.dart
@@ -0,0 +1,303 @@
+/// Test for the Selectors API ported from
+/// <https://github.com/w3c/web-platform-tests/tree/master/selectors-api>
+///
+/// Note: tried to make minimal changes possible here. Hence some oddities such
+/// as [test] arguments having a different order, long lines, etc.
+///
+/// As usual with ports: being faithful to the original style is more important
+/// than other style goals, as it reduces friction to integrating changes
+/// from upstream.
+library html.test.selectors.level1_lib;
+
+import 'package:html/dom.dart';
+import 'package:unittest/unittest.dart' as unittest;
+
+Document doc;
+
+/*
+ * Create and append special elements that cannot be created correctly with HTML markup alone.
+ */
+setupSpecialElements(parent) {
+  // Setup null and undefined tests
+  parent.append(doc.createElement("null"));
+  parent.append(doc.createElement("undefined"));
+
+  // Setup namespace tests
+  var anyNS = doc.createElement("div");
+  var noNS = doc.createElement("div");
+  anyNS.id = "any-namespace";
+  noNS.id = "no-namespace";
+
+  var div;
+  div = [
+    doc.createElement("div"),
+    doc.createElementNS("http://www.w3.org/1999/xhtml", "div"),
+    doc.createElementNS("", "div"),
+    doc.createElementNS("http://www.example.org/ns", "div")
+  ];
+
+  div[0].id = "any-namespace-div1";
+  div[1].id = "any-namespace-div2";
+  div[2].attributes["id"] =
+      "any-namespace-div3"; // Non-HTML elements can't use .id property
+  div[3].attributes["id"] = "any-namespace-div4";
+
+  for (var i = 0; i < div.length; i++) {
+    anyNS.append(div[i]);
+  }
+
+  div = [
+    doc.createElement("div"),
+    doc.createElementNS("http://www.w3.org/1999/xhtml", "div"),
+    doc.createElementNS("", "div"),
+    doc.createElementNS("http://www.example.org/ns", "div")
+  ];
+
+  div[0].id = "no-namespace-div1";
+  div[1].id = "no-namespace-div2";
+  div[2].attributes["id"] =
+      "no-namespace-div3"; // Non-HTML elements can't use .id property
+  div[3].attributes["id"] = "no-namespace-div4";
+
+  for (var i = 0; i < div.length; i++) {
+    noNS.append(div[i]);
+  }
+
+  parent.append(anyNS);
+  parent.append(noNS);
+}
+
+/*
+ * Check that the querySelector and querySelectorAll methods exist on the given Node
+ */
+interfaceCheck(type, obj) {
+  test(() {
+    var q = obj.querySelector is Function;
+    assert_true(q, type + " supports querySelector.");
+  }, type + " supports querySelector");
+
+  test(() {
+    var qa = obj.querySelectorAll is Function;
+    assert_true(qa, type + " supports querySelectorAll.");
+  }, type + " supports querySelectorAll");
+
+  test(() {
+    var list = obj.querySelectorAll("div");
+    // TODO(jmesserly): testing List<Element> for now. It should return an
+    // ElementList which has extra properties. Needed for dart:html compat.
+    assert_true(list is List<Element>,
+        "The result should be an instance of a NodeList");
+  }, type + ".querySelectorAll returns NodeList instance");
+}
+
+/*
+ * Verify that the NodeList returned by querySelectorAll is static and and that a new list is created after
+ * each call. A static list should not be affected by subsequent changes to the DOM.
+ */
+verifyStaticList(type, root) {
+  var pre, post, preLength;
+
+  test(() {
+    pre = root.querySelectorAll("div");
+    preLength = pre.length;
+
+    var div = doc.createElement("div");
+    (root is Document ? root.body : root).append(div);
+
+    assert_equals(
+        pre.length, preLength, "The length of the NodeList should not change.");
+  }, type + ": static NodeList");
+
+  test(() {
+    post = root.querySelectorAll("div");
+    assert_equals(post.length, preLength + 1,
+        "The length of the new NodeList should be 1 more than the previous list.");
+  }, type + ": new NodeList");
+}
+
+/*
+ * Verify handling of special values for the selector parameter, including stringification of
+ * null and undefined, and the handling of the empty string.
+ */
+runSpecialSelectorTests(type, root) {
+  // Dart note: changed these tests because we don't have auto conversion to
+  // String like JavaScript does.
+  test(() {
+    // 1
+    assert_equals(root.querySelectorAll('null').length, 1,
+        "This should find one element with the tag name 'NULL'.");
+  }, type + ".querySelectorAll null");
+
+  test(() {
+    // 2
+    assert_equals(root.querySelectorAll('undefined').length, 1,
+        "This should find one element with the tag name 'UNDEFINED'.");
+  }, type + ".querySelectorAll undefined");
+
+  test(() {
+    // 3
+    assert_throws((e) => e is NoSuchMethodError, () {
+      root.querySelectorAll();
+    }, "This should throw a TypeError.");
+  }, type + ".querySelectorAll no parameter");
+
+  test(() {
+    // 4
+    var elm = root.querySelector('null');
+    assert_not_equals(elm, null, "This should find an element.");
+    // TODO(jmesserly): change "localName" back to "tagName" once implemented.
+    assert_equals(
+        elm.localName.toUpperCase(), "NULL", "The tag name should be 'NULL'.");
+  }, type + ".querySelector null");
+
+  test(() {
+    // 5
+    var elm = root.querySelector('undefined');
+    assert_not_equals(elm, 'undefined', "This should find an element.");
+    // TODO(jmesserly): change "localName" back to "tagName" once implemented.
+    assert_equals(elm.localName.toUpperCase(),
+        "UNDEFINED", "The tag name should be 'UNDEFINED'.");
+  }, type + ".querySelector undefined");
+
+  test(() {
+    // 6
+    assert_throws((e) => e is NoSuchMethodError, () {
+      root.querySelector();
+    }, "This should throw a TypeError.");
+  }, type + ".querySelector no parameter");
+
+  test(() {
+    // 7
+    var result = root.querySelectorAll("*");
+    var i = 0;
+    traverse(root, (elem) {
+      if (!identical(elem, root)) {
+        assert_equals(
+            elem, result[i], "The result in index $i should be in tree order.");
+        i++;
+      }
+    });
+  }, type + ".querySelectorAll tree order");
+}
+
+/*
+ * Execute queries with the specified valid selectors for both querySelector() and querySelectorAll()
+ * Only run these tests when results are expected. Don't run for syntax error tests.
+ */
+runValidSelectorTest(type, root, selectors, testType, docType) {
+  var nodeType = "";
+  switch (root.nodeType) {
+    case Node.DOCUMENT_NODE:
+      nodeType = "document";
+      break;
+    case Node.ELEMENT_NODE:
+      nodeType = root.parentNode != null ? "element" : "detached";
+      break;
+    case Node.DOCUMENT_FRAGMENT_NODE:
+      nodeType = "fragment";
+      break;
+    default:
+      throw new StateError("Reached unreachable code path.");
+  }
+
+  for (var i = 0; i < selectors.length; i++) {
+    var s = selectors[i];
+    var n = s["name"];
+    var q = s["selector"];
+    var e = s["expect"];
+
+    if ((s["exclude"] is! List ||
+            (s["exclude"].indexOf(nodeType) == -1 &&
+                s["exclude"].indexOf(docType) == -1)) &&
+        (s["testType"] & testType != 0)) {
+      //console.log("Running tests " + nodeType + ": " + s["testType"] + "&" + testType + "=" + (s["testType"] & testType) + ": " + JSON.stringify(s))
+      var foundall, found;
+
+      test(() {
+        foundall = root.querySelectorAll(q);
+        assert_not_equals(foundall, null, "The method should not return null.");
+        assert_equals(foundall.length, e.length,
+            "The method should return the expected number of matches.");
+
+        for (var i = 0; i < e.length; i++) {
+          assert_not_equals(
+              foundall[i], null, "The item in index $i should not be null.");
+          assert_equals(foundall[i].attributes["id"], e[i],
+              "The item in index $i should have the expected ID.");
+          assert_false(foundall[i].attributes.containsKey("data-clone"),
+              "This should not be a cloned element.");
+        }
+      }, type + ".querySelectorAll: " + n + ": " + q);
+
+      test(() {
+        found = root.querySelector(q);
+
+        if (e.length > 0) {
+          assert_not_equals(found, null, "The method should return a match.");
+          assert_equals(found.attributes["id"], e[0],
+              "The method should return the first match.");
+          assert_equals(found, foundall[0],
+              "The result should match the first item from querySelectorAll.");
+          assert_false(found.attributes.containsKey("data-clone"),
+              "This should not be annotated as a cloned element.");
+        } else {
+          assert_equals(found, null, "The method should not match anything.");
+        }
+      }, type + ".querySelector: " + n + ": " + q);
+    } else {
+      //console.log("Excluding for " + nodeType + ": " + s["testType"] + "&" + testType + "=" + (s["testType"] & testType) + ": " + JSON.stringify(s))
+    }
+  }
+}
+
+/*
+ * Execute queries with the specified invalid selectors for both querySelector() and querySelectorAll()
+ * Only run these tests when errors are expected. Don't run for valid selector tests.
+ */
+runInvalidSelectorTest(type, root, selectors) {
+  for (var i = 0; i < selectors.length; i++) {
+    var s = selectors[i];
+    var n = s["name"];
+    var q = s["selector"];
+
+    // Dart note: FormatException seems a reasonable mapping of SyntaxError
+    test(() {
+      assert_throws((e) => e is FormatException, () {
+        root.querySelector(q);
+      });
+    }, type + ".querySelector: " + n + ": " + q);
+
+    test(() {
+      assert_throws((e) => e is FormatException, () {
+        root.querySelectorAll(q);
+      });
+    }, type + ".querySelectorAll: " + n + ": " + q);
+  }
+}
+
+traverse(Node elem, fn) {
+  if (elem.nodeType == Node.ELEMENT_NODE) {
+    fn(elem);
+  }
+
+  // Dart note: changed this since our DOM API doesn't support nextNode yet.
+  for (var node in elem.nodes) {
+    traverse(node, fn);
+  }
+}
+
+test(Function body, String name) => unittest.test(name, body);
+
+assert_true(value, String reason) =>
+    unittest.expect(value, true, reason: reason);
+
+assert_false(value, String reason) =>
+    unittest.expect(value, false, reason: reason);
+
+assert_equals(x, y, reason) => unittest.expect(x, y, reason: reason);
+
+assert_not_equals(x, y, reason) =>
+    unittest.expect(x, unittest.isNot(y), reason: reason);
+
+assert_throws(exception, body, [reason]) =>
+    unittest.expect(body, unittest.throwsA(exception), reason: reason);
diff --git a/mojo/public/dart/third_party/html/test/selectors/selectors.dart b/mojo/public/dart/third_party/html/test/selectors/selectors.dart
new file mode 100644
index 0000000..d25b14b
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/selectors/selectors.dart
@@ -0,0 +1,1875 @@
+/// Test for the Selectors API ported from
+/// <https://github.com/w3c/web-platform-tests/tree/master/selectors-api>
+library html.test.selectors.selectors;
+
+// Bit-mapped flags to indicate which tests the selector is suitable for
+var TEST_QSA_BASELINE =
+    0x01; // querySelector() and querySelectorAll() baseline tests
+var TEST_QSA_ADDITIONAL =
+    0x02; // querySelector() and querySelectorAll() additional tests
+var TEST_FIND_BASELINE =
+    0x04; // find() and findAll() baseline tests, may be unsuitable for querySelector[All]
+var TEST_FIND_ADDITIONAL =
+    0x08; // find() and findAll() additional tests, may be unsuitable for querySelector[All]
+var TEST_MATCH_BASELINE = 0x10; // matches() baseline tests
+var TEST_MATCH_ADDITIONAL = 0x20; // matches() additional tests
+
+/*
+ * All of these invalid selectors should result in a SyntaxError being thrown by the APIs.
+ *
+ *   name:     A descriptive name of the selector being tested
+ *   selector: The selector to test
+ */
+var invalidSelectors = [
+  {'name': "Empty String", 'selector': ""},
+  {'name': "Invalid character", 'selector': "["},
+  {'name': "Invalid character", 'selector': "]"},
+  {'name': "Invalid character", 'selector': "("},
+  {'name': "Invalid character", 'selector': ")"},
+  {'name': "Invalid character", 'selector': "{"},
+  {'name': "Invalid character", 'selector': "}"},
+  {'name': "Invalid character", 'selector': "<"},
+  {'name': "Invalid character", 'selector': ">"},
+  {'name': "Invalid ID", 'selector': "#"},
+  {'name': "Invalid group of selectors", 'selector': "div,"},
+  {'name': "Invalid class", 'selector': "."},
+  {'name': "Invalid class", 'selector': ".5cm"},
+  {'name': "Invalid class", 'selector': "..test"},
+  {'name': "Invalid class", 'selector': ".foo..quux"},
+  {'name': "Invalid class", 'selector': ".bar."},
+  {'name': "Invalid combinator", 'selector': "div & address, p"},
+  {'name': "Invalid combinator", 'selector': "div >> address, p"},
+  {'name': "Invalid combinator", 'selector': "div ++ address, p"},
+  {'name': "Invalid combinator", 'selector': "div ~~ address, p"},
+  {'name': "Invalid [att=value] selector", 'selector': "[*=test]"},
+  {'name': "Invalid [att=value] selector", 'selector': "[*|*=test]"},
+  {
+    'name': "Invalid [att=value] selector",
+    'selector': "[class= space unquoted ]"
+  },
+  {'name': "Unknown pseudo-class", 'selector': "div:example"},
+  {'name': "Unknown pseudo-class", 'selector': ":example"},
+  {'name': "Unknown pseudo-element", 'selector': "div::example"},
+  {'name': "Unknown pseudo-element", 'selector': "::example"},
+  {'name': "Invalid pseudo-element", 'selector': ":::before"},
+  {'name': "Undeclared namespace", 'selector': "ns|div"},
+  {'name': "Undeclared namespace", 'selector': ":not(ns|div)"},
+  {'name': "Invalid namespace", 'selector': "^|div"},
+  {'name': "Invalid namespace", 'selector': "\$|div"}
+];
+
+/*
+ * All of these should be valid selectors, expected to match zero or more elements in the document.
+ * None should throw any errors.
+ *
+ *   name:     A descriptive name of the selector being tested
+ *   selector: The selector to test
+ *   'expect':   A list of IDs of the elements expected to be matched. List must be given in tree order.
+ *   'exclude':  An array of contexts to exclude from testing. The valid values are:
+ *             ["document", "element", "fragment", "detached", "html", "xhtml"]
+ *             The "html" and "xhtml" values represent the type of document being queried. These are useful
+ *             for tests that are affected by differences between HTML and XML, such as case sensitivity.
+ *   'level':    An integer indicating the CSS or Selectors level in which the selector being tested was introduced.
+ *   'testType': A bit-mapped flag indicating the type of test.
+ *
+ * Note: Interactive pseudo-classes (:active :hover and :focus) have not been tested in this test suite.
+ */
+var validSelectors = [
+  // Type Selector
+  {
+    'name': "Type selector, matching html element",
+    'selector': "html",
+    'expect': ["html"],
+    'exclude': ["element", "fragment", "detached"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "Type selector, matching html element",
+    'selector': "html",
+    'expect': [] /*no matches*/,
+    'exclude': ["document"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name': "Type selector, matching body element",
+    'selector': "body",
+    'expect': ["body"],
+    'exclude': ["element", "fragment", "detached"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "Type selector, matching body element",
+    'selector': "body",
+    'expect': [] /*no matches*/,
+    'exclude': ["document"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE
+  },
+
+  // Universal Selector
+  // Testing "*" for entire an entire context node is handled separately.
+  {
+    'name':
+        "Universal selector, matching all children of element with specified ID",
+    'selector': "#universal>*",
+    'expect': [
+      "universal-p1",
+      "universal-hr1",
+      "universal-pre1",
+      "universal-p2",
+      "universal-address1"
+    ],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Universal selector, matching all grandchildren of element with specified ID",
+    'selector': "#universal>*>*",
+    'expect': [
+      "universal-code1",
+      "universal-span1",
+      "universal-a1",
+      "universal-code2"
+    ],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Universal selector, matching all children of empty element with specified ID",
+    'selector': "#empty>*",
+    'expect': [] /*no matches*/,
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name':
+        "Universal selector, matching all descendants of element with specified ID",
+    'selector': "#universal *",
+    'expect': [
+      "universal-p1",
+      "universal-code1",
+      "universal-hr1",
+      "universal-pre1",
+      "universal-span1",
+      "universal-p2",
+      "universal-a1",
+      "universal-address1",
+      "universal-code2",
+      "universal-a2"
+    ],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+
+  // Attribute Selectors
+  // - presence                  [att]
+  {
+    'name': "Attribute presence selector, matching align attribute with value",
+    'selector': ".attr-presence-div1[align]",
+    'expect': ["attr-presence-div1"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute presence selector, matching align attribute with empty value",
+    'selector': ".attr-presence-div2[align]",
+    'expect': ["attr-presence-div2"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute presence selector, matching title attribute, case insensitivity",
+    'selector': "#attr-presence [TiTlE]",
+    'expect': ["attr-presence-a1", "attr-presence-span1"],
+    'exclude': ["xhtml"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute presence selector, not matching title attribute, case sensitivity",
+    'selector': "#attr-presence [TiTlE]",
+    'expect': [],
+    'exclude': ["html"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "Attribute presence selector, matching custom data-* attribute",
+    'selector': "[data-attr-presence]",
+    'expect': ["attr-presence-pre1", "attr-presence-blockquote1"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute presence selector, not matching attribute with similar name",
+    'selector': ".attr-presence-div3[align], .attr-presence-div4[align]",
+    'expect': [] /*no matches*/,
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name':
+        "Attribute presence selector, matching attribute with non-ASCII characters",
+    'selector': "ul[data-中文]",
+    'expect': ["attr-presence-ul1"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute presence selector, not matching default option without selected attribute",
+    'selector': "#attr-presence-select1 option[selected]",
+    'expect': [] /* no matches */,
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name':
+        "Attribute presence selector, matching option with selected attribute",
+    'selector': "#attr-presence-select2 option[selected]",
+    'expect': ["attr-presence-select2-option4"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute presence selector, matching multiple options with selected attributes",
+    'selector': "#attr-presence-select3 option[selected]",
+    'expect': [
+      "attr-presence-select3-option2",
+      "attr-presence-select3-option3"
+    ],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+
+  // - value                     [att=val]
+  {
+    'name': "Attribute value selector, matching align attribute with value",
+    'selector': "#attr-value [align=\"center\"]",
+    'expect': ["attr-value-div1"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute value selector, matching align attribute with empty value",
+    'selector': "#attr-value [align=\"\"]",
+    'expect': ["attr-value-div2"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute value selector, not matching align attribute with partial value",
+    'selector': "#attr-value [align=\"c\"]",
+    'expect': [] /*no matches*/,
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name':
+        "Attribute value selector, not matching align attribute with incorrect value",
+    'selector': "#attr-value [align=\"centera\"]",
+    'expect': [] /*no matches*/,
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name':
+        "Attribute value selector, matching custom data-* attribute with unicode escaped value",
+    'selector': "[data-attr-value=\"\\e9\"]",
+    'expect': ["attr-value-div3"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute value selector, matching custom data-* attribute with escaped character",
+    'selector': "[data-attr-value\_foo=\"\\e9\"]",
+    'expect': ["attr-value-div4"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute value selector with single-quoted value, matching multiple inputs with type attributes",
+    'selector':
+        "#attr-value input[type='hidden'],#attr-value input[type='radio']",
+    'expect': [
+      "attr-value-input3",
+      "attr-value-input4",
+      "attr-value-input6",
+      "attr-value-input8",
+      "attr-value-input9"
+    ],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute value selector with double-quoted value, matching multiple inputs with type attributes",
+    'selector':
+        "#attr-value input[type=\"hidden\"],#attr-value input[type='radio']",
+    'expect': [
+      "attr-value-input3",
+      "attr-value-input4",
+      "attr-value-input6",
+      "attr-value-input8",
+      "attr-value-input9"
+    ],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute value selector with unquoted value, matching multiple inputs with type attributes",
+    'selector': "#attr-value input[type=hidden],#attr-value input[type=radio]",
+    'expect': [
+      "attr-value-input3",
+      "attr-value-input4",
+      "attr-value-input6",
+      "attr-value-input8",
+      "attr-value-input9"
+    ],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute value selector, matching attribute with value using non-ASCII characters",
+    'selector': "[data-attr-value=中文]",
+    'expect': ["attr-value-div5"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+
+  // - whitespace-separated list [att~=val]
+  {
+    'name':
+        "Attribute whitespace-separated list selector, matching class attribute with value",
+    'selector': "#attr-whitespace [class~=\"div1\"]",
+    'expect': ["attr-whitespace-div1"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute whitespace-separated list selector, not matching class attribute with empty value",
+    'selector': "#attr-whitespace [class~=\"\"]",
+    'expect': [] /*no matches*/,
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name':
+        "Attribute whitespace-separated list selector, not matching class attribute with partial value",
+    'selector': "[data-attr-whitespace~=\"div\"]",
+    'expect': [] /*no matches*/,
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name':
+        "Attribute whitespace-separated list selector, matching custom data-* attribute with unicode escaped value",
+    'selector': "[data-attr-whitespace~=\"\\0000e9\"]",
+    'expect': ["attr-whitespace-div4"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute whitespace-separated list selector, matching custom data-* attribute with escaped character",
+    'selector': "[data-attr-whitespace\_foo~=\"\\e9\"]",
+    'expect': ["attr-whitespace-div5"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute whitespace-separated list selector with single-quoted value, matching multiple links with rel attributes",
+    'selector':
+        "#attr-whitespace a[rel~='bookmark'],  #attr-whitespace a[rel~='nofollow']",
+    'expect': [
+      "attr-whitespace-a1",
+      "attr-whitespace-a2",
+      "attr-whitespace-a3",
+      "attr-whitespace-a5",
+      "attr-whitespace-a7"
+    ],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute whitespace-separated list selector with double-quoted value, matching multiple links with rel attributes",
+    'selector':
+        "#attr-whitespace a[rel~=\"bookmark\"],#attr-whitespace a[rel~='nofollow']",
+    'expect': [
+      "attr-whitespace-a1",
+      "attr-whitespace-a2",
+      "attr-whitespace-a3",
+      "attr-whitespace-a5",
+      "attr-whitespace-a7"
+    ],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute whitespace-separated list selector with unquoted value, matching multiple links with rel attributes",
+    'selector':
+        "#attr-whitespace a[rel~=bookmark],    #attr-whitespace a[rel~=nofollow]",
+    'expect': [
+      "attr-whitespace-a1",
+      "attr-whitespace-a2",
+      "attr-whitespace-a3",
+      "attr-whitespace-a5",
+      "attr-whitespace-a7"
+    ],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute whitespace-separated list selector with double-quoted value, not matching value with space",
+    'selector': "#attr-whitespace a[rel~=\"book mark\"]",
+    'expect': [] /* no matches */,
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name':
+        "Attribute whitespace-separated list selector, matching title attribute with value using non-ASCII characters",
+    'selector': "#attr-whitespace [title~=中文]",
+    'expect': ["attr-whitespace-p1"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+
+  // - hyphen-separated list     [att|=val]
+  {
+    'name':
+        "Attribute hyphen-separated list selector, not matching unspecified lang attribute",
+    'selector': "#attr-hyphen-div1[lang|=\"en\"]",
+    'expect': [] /*no matches*/,
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name':
+        "Attribute hyphen-separated list selector, matching lang attribute with exact value",
+    'selector': "#attr-hyphen-div2[lang|=\"fr\"]",
+    'expect': ["attr-hyphen-div2"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute hyphen-separated list selector, matching lang attribute with partial value",
+    'selector': "#attr-hyphen-div3[lang|=\"en\"]",
+    'expect': ["attr-hyphen-div3"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute hyphen-separated list selector, not matching incorrect value",
+    'selector': "#attr-hyphen-div4[lang|=\"es-AR\"]",
+    'expect': [] /*no matches*/,
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+
+  // - substring begins-with     [att^=val] (Level 3)
+  {
+    'name':
+        "Attribute begins with selector, matching href attributes beginning with specified substring",
+    'selector': "#attr-begins a[href^=\"http://www\"]",
+    'expect': ["attr-begins-a1", "attr-begins-a3"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute begins with selector, matching lang attributes beginning with specified substring, ",
+    'selector': "#attr-begins [lang^=\"en-\"]",
+    'expect': ["attr-begins-div2", "attr-begins-div4"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute begins with selector, not matching class attribute not beginning with specified substring",
+    'selector': "#attr-begins [class^=apple]",
+    'expect': [] /*no matches*/,
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL
+  },
+  {
+    'name':
+        "Attribute begins with selector with single-quoted value, matching class attribute beginning with specified substring",
+    'selector': "#attr-begins [class^=' apple']",
+    'expect': ["attr-begins-p1"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute begins with selector with double-quoted value, matching class attribute beginning with specified substring",
+    'selector': "#attr-begins [class^=\" apple\"]",
+    'expect': ["attr-begins-p1"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute begins with selector with unquoted value, not matching class attribute not beginning with specified substring",
+    'selector': "#attr-begins [class^= apple]",
+    'expect': [] /*no matches*/,
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL
+  },
+
+  // - substring ends-with       [att\$=val] (Level 3)
+  {
+    'name':
+        "Attribute ends with selector, matching href attributes ending with specified substring",
+    'selector': "#attr-ends a[href\$=\".org\"]",
+    'expect': ["attr-ends-a1", "attr-ends-a3"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute ends with selector, matching lang attributes ending with specified substring, ",
+    'selector': "#attr-ends [lang\$=\"-CH\"]",
+    'expect': ["attr-ends-div2", "attr-ends-div4"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute ends with selector, not matching class attribute not ending with specified substring",
+    'selector': "#attr-ends [class\$=apple]",
+    'expect': [] /*no matches*/,
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL
+  },
+  {
+    'name':
+        "Attribute ends with selector with single-quoted value, matching class attribute ending with specified substring",
+    'selector': "#attr-ends [class\$='apple ']",
+    'expect': ["attr-ends-p1"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute ends with selector with double-quoted value, matching class attribute ending with specified substring",
+    'selector': "#attr-ends [class\$=\"apple \"]",
+    'expect': ["attr-ends-p1"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute ends with selector with unquoted value, not matching class attribute not ending with specified substring",
+    'selector': "#attr-ends [class\$=apple ]",
+    'expect': [] /*no matches*/,
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL
+  },
+
+  // - substring contains        [att*=val] (Level 3)
+  {
+    'name':
+        "Attribute contains selector, matching href attributes beginning with specified substring",
+    'selector': "#attr-contains a[href*=\"http://www\"]",
+    'expect': ["attr-contains-a1", "attr-contains-a3"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute contains selector, matching href attributes ending with specified substring",
+    'selector': "#attr-contains a[href*=\".org\"]",
+    'expect': ["attr-contains-a1", "attr-contains-a2"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute contains selector, matching href attributes containing specified substring",
+    'selector': "#attr-contains a[href*=\".example.\"]",
+    'expect': ["attr-contains-a1", "attr-contains-a3"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute contains selector, matching lang attributes beginning with specified substring, ",
+    'selector': "#attr-contains [lang*=\"en-\"]",
+    'expect': ["attr-contains-div2", "attr-contains-div6"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute contains selector, matching lang attributes ending with specified substring, ",
+    'selector': "#attr-contains [lang*=\"-CH\"]",
+    'expect': ["attr-contains-div3", "attr-contains-div5"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute contains selector with single-quoted value, matching class attribute beginning with specified substring",
+    'selector': "#attr-contains [class*=' apple']",
+    'expect': ["attr-contains-p1"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute contains selector with single-quoted value, matching class attribute ending with specified substring",
+    'selector': "#attr-contains [class*='orange ']",
+    'expect': ["attr-contains-p1"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute contains selector with single-quoted value, matching class attribute containing specified substring",
+    'selector': "#attr-contains [class*='ple banana ora']",
+    'expect': ["attr-contains-p1"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute contains selector with double-quoted value, matching class attribute beginning with specified substring",
+    'selector': "#attr-contains [class*=\" apple\"]",
+    'expect': ["attr-contains-p1"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute contains selector with double-quoted value, matching class attribute ending with specified substring",
+    'selector': "#attr-contains [class*=\"orange \"]",
+    'expect': ["attr-contains-p1"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute contains selector with double-quoted value, matching class attribute containing specified substring",
+    'selector': "#attr-contains [class*=\"ple banana ora\"]",
+    'expect': ["attr-contains-p1"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute contains selector with unquoted value, matching class attribute beginning with specified substring",
+    'selector': "#attr-contains [class*= apple]",
+    'expect': ["attr-contains-p1"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute contains selector with unquoted value, matching class attribute ending with specified substring",
+    'selector': "#attr-contains [class*=orange ]",
+    'expect': ["attr-contains-p1"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Attribute contains selector with unquoted value, matching class attribute containing specified substring",
+    'selector': "#attr-contains [class*= banana ]",
+    'expect': ["attr-contains-p1"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+
+  // Pseudo-classes
+  // - :root                 (Level 3)
+  {
+    'name': ":root pseudo-class selector, matching document root element",
+    'selector': ":root",
+    'expect': ["html"],
+    'exclude': ["element", "fragment", "detached"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name': ":root pseudo-class selector, not matching document root element",
+    'selector': ":root",
+    'expect': [] /*no matches*/,
+    'exclude': ["document"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL
+  },
+
+  // - :nth-child(n)         (Level 3)
+  {
+    'name': ":nth-child selector, matching the third child element",
+    'selector': "#pseudo-nth-table1 :nth-child(3)",
+    'expect': [
+      "pseudo-nth-td3",
+      "pseudo-nth-td9",
+      "pseudo-nth-tr3",
+      "pseudo-nth-td15"
+    ],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name': ":nth-child selector, matching every third child element",
+    'selector': "#pseudo-nth li:nth-child(3n)",
+    'expect': [
+      "pseudo-nth-li3",
+      "pseudo-nth-li6",
+      "pseudo-nth-li9",
+      "pseudo-nth-li12"
+    ],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":nth-child selector, matching every second child element, starting from the fourth",
+    'selector': "#pseudo-nth li:nth-child(2n+4)",
+    'expect': [
+      "pseudo-nth-li4",
+      "pseudo-nth-li6",
+      "pseudo-nth-li8",
+      "pseudo-nth-li10",
+      "pseudo-nth-li12"
+    ],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":nth-child selector, matching every fourth child element, starting from the third",
+    'selector': "#pseudo-nth-p1 :nth-child(4n-1)",
+    'expect': ["pseudo-nth-em2", "pseudo-nth-span3"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+
+  // - :nth-last-child       (Level 3)
+  {
+    'name': ":nth-last-child selector, matching the third last child element",
+    'selector': "#pseudo-nth-table1 :nth-last-child(3)",
+    'expect': [
+      "pseudo-nth-tr1",
+      "pseudo-nth-td4",
+      "pseudo-nth-td10",
+      "pseudo-nth-td16"
+    ],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":nth-last-child selector, matching every third child element from the end",
+    'selector': "#pseudo-nth li:nth-last-child(3n)",
+    'expect': [
+      "pseudo-nth-li1",
+      "pseudo-nth-li4",
+      "pseudo-nth-li7",
+      "pseudo-nth-li10"
+    ],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":nth-last-child selector, matching every second child element from the end, starting from the fourth last",
+    'selector': "#pseudo-nth li:nth-last-child(2n+4)",
+    'expect': [
+      "pseudo-nth-li1",
+      "pseudo-nth-li3",
+      "pseudo-nth-li5",
+      "pseudo-nth-li7",
+      "pseudo-nth-li9"
+    ],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":nth-last-child selector, matching every fourth element from the end, starting from the third last",
+    'selector': "#pseudo-nth-p1 :nth-last-child(4n-1)",
+    'expect': ["pseudo-nth-span2", "pseudo-nth-span4"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+
+  // - :nth-of-type(n)       (Level 3)
+  {
+    'name': ":nth-of-type selector, matching the third em element",
+    'selector': "#pseudo-nth-p1 em:nth-of-type(3)",
+    'expect': ["pseudo-nth-em3"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":nth-of-type selector, matching every second element of their type",
+    'selector': "#pseudo-nth-p1 :nth-of-type(2n)",
+    'expect': [
+      "pseudo-nth-em2",
+      "pseudo-nth-span2",
+      "pseudo-nth-span4",
+      "pseudo-nth-strong2",
+      "pseudo-nth-em4"
+    ],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":nth-of-type selector, matching every second elemetn of their type, starting from the first",
+    'selector': "#pseudo-nth-p1 span:nth-of-type(2n-1)",
+    'expect': ["pseudo-nth-span1", "pseudo-nth-span3"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+
+  // - :nth-last-of-type(n)  (Level 3)
+  {
+    'name': ":nth-last-of-type selector, matching the thrid last em element",
+    'selector': "#pseudo-nth-p1 em:nth-last-of-type(3)",
+    'expect': ["pseudo-nth-em2"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":nth-last-of-type selector, matching every second last element of their type",
+    'selector': "#pseudo-nth-p1 :nth-last-of-type(2n)",
+    'expect': [
+      "pseudo-nth-span1",
+      "pseudo-nth-em1",
+      "pseudo-nth-strong1",
+      "pseudo-nth-em3",
+      "pseudo-nth-span3"
+    ],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":nth-last-of-type selector, matching every second last element of their type, starting from the last",
+    'selector': "#pseudo-nth-p1 span:nth-last-of-type(2n-1)",
+    'expect': ["pseudo-nth-span2", "pseudo-nth-span4"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+
+  // - :first-of-type        (Level 3)
+  {
+    'name': ":first-of-type selector, matching the first em element",
+    'selector': "#pseudo-nth-p1 em:first-of-type",
+    'expect': ["pseudo-nth-em1"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":first-of-type selector, matching the first of every type of element",
+    'selector': "#pseudo-nth-p1 :first-of-type",
+    'expect': ["pseudo-nth-span1", "pseudo-nth-em1", "pseudo-nth-strong1"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":first-of-type selector, matching the first td element in each table row",
+    'selector': "#pseudo-nth-table1 tr :first-of-type",
+    'expect': ["pseudo-nth-td1", "pseudo-nth-td7", "pseudo-nth-td13"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+
+  // - :last-of-type         (Level 3)
+  {
+    'name': ":last-of-type selector, matching the last em elemnet",
+    'selector': "#pseudo-nth-p1 em:last-of-type",
+    'expect': ["pseudo-nth-em4"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":last-of-type selector, matching the last of every type of element",
+    'selector': "#pseudo-nth-p1 :last-of-type",
+    'expect': ["pseudo-nth-span4", "pseudo-nth-strong2", "pseudo-nth-em4"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":last-of-type selector, matching the last td element in each table row",
+    'selector': "#pseudo-nth-table1 tr :last-of-type",
+    'expect': ["pseudo-nth-td6", "pseudo-nth-td12", "pseudo-nth-td18"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+
+  // - :first-child
+  {
+    'name':
+        ":first-child pseudo-class selector, matching first child div element",
+    'selector': "#pseudo-first-child div:first-child",
+    'expect': ["pseudo-first-child-div1"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":first-child pseudo-class selector, doesn't match non-first-child elements",
+    'selector':
+        ".pseudo-first-child-div2:first-child, .pseudo-first-child-div3:first-child",
+    'expect': [] /*no matches*/,
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name':
+        ":first-child pseudo-class selector, matching first-child of multiple elements",
+    'selector': "#pseudo-first-child span:first-child",
+    'expect': [
+      "pseudo-first-child-span1",
+      "pseudo-first-child-span3",
+      "pseudo-first-child-span5"
+    ],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+
+  // - :last-child           (Level 3)
+  {
+    'name':
+        ":last-child pseudo-class selector, matching last child div element",
+    'selector': "#pseudo-last-child div:last-child",
+    'expect': ["pseudo-last-child-div3"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":last-child pseudo-class selector, doesn't match non-last-child elements",
+    'selector':
+        ".pseudo-last-child-div1:last-child, .pseudo-last-child-div2:first-child",
+    'expect': [] /*no matches*/,
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL
+  },
+  {
+    'name':
+        ":last-child pseudo-class selector, matching first-child of multiple elements",
+    'selector': "#pseudo-last-child span:last-child",
+    'expect': [
+      "pseudo-last-child-span2",
+      "pseudo-last-child-span4",
+      "pseudo-last-child-span6"
+    ],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+
+  // - :only-child           (Level 3)
+  {
+    'name':
+        ":pseudo-only-child pseudo-class selector, matching all only-child elements",
+    'selector': "#pseudo-only :only-child",
+    'expect': ["pseudo-only-span1"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":pseudo-only-child pseudo-class selector, matching only-child em elements",
+    'selector': "#pseudo-only em:only-child",
+    'expect': [] /*no matches*/,
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL
+  },
+
+  // - :only-of-type         (Level 3)
+  {
+    'name':
+        ":pseudo-only-of-type pseudo-class selector, matching all elements with no siblings of the same type",
+    'selector': "#pseudo-only :only-of-type",
+    'expect': ["pseudo-only-span1", "pseudo-only-em1"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":pseudo-only-of-type pseudo-class selector, matching em elements with no siblings of the same type",
+    'selector': "#pseudo-only em:only-of-type",
+    'expect': ["pseudo-only-em1"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+
+  // - :empty                (Level 3)
+  {
+    'name': ":empty pseudo-class selector, matching empty p elements",
+    'selector': "#pseudo-empty p:empty",
+    'expect': ["pseudo-empty-p1", "pseudo-empty-p2"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name': ":empty pseudo-class selector, matching all empty elements",
+    'selector': "#pseudo-empty :empty",
+    'expect': ["pseudo-empty-p1", "pseudo-empty-p2", "pseudo-empty-span1"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+
+  // - :link and :visited
+  // Implementations may treat all visited links as unvisited, so these cannot be tested separately.
+  // The only guarantee is that ":link,:visited" matches the set of all visited and unvisited links and that they are individually mutually exclusive sets.
+  {
+    'name':
+        ":link and :visited pseudo-class selectors, matching a and area elements with href attributes",
+    'selector': "#pseudo-link :link, #pseudo-link :visited",
+    'expect': ["pseudo-link-a1", "pseudo-link-a2", "pseudo-link-area1"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":link and :visited pseudo-class selectors, matching link elements with href attributes",
+    'selector': "#head :link, #head :visited",
+    'expect': ["pseudo-link-link1", "pseudo-link-link2"],
+    'exclude': ["element", "fragment", "detached"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":link and :visited pseudo-class selectors, not matching link elements with href attributes",
+    'selector': "#head :link, #head :visited",
+    'expect': [] /*no matches*/,
+    'exclude': ["document"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name':
+        ":link and :visited pseudo-class selectors, chained, mutually exclusive pseudo-classes match nothing",
+    'selector': ":link:visited",
+    'expect': [] /*no matches*/,
+    'exclude': ["document"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE
+  },
+
+  // - :target               (Level 3)
+  {
+    'name':
+        ":target pseudo-class selector, matching the element referenced by the URL fragment identifier",
+    'selector': ":target",
+    'expect': [] /*no matches*/,
+    'exclude': ["document", "element"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL
+  },
+  {
+    'name':
+        ":target pseudo-class selector, matching the element referenced by the URL fragment identifier",
+    'selector': ":target",
+    'expect': ["target"],
+    'exclude': ["fragment", "detached"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+
+  // - :lang()
+  {
+    'name': ":lang pseudo-class selector, matching inherited language",
+    'selector': "#pseudo-lang-div1:lang(en)",
+    'expect': ["pseudo-lang-div1"],
+    'exclude': ["detached", "fragment"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":lang pseudo-class selector, not matching element with no inherited language",
+    'selector': "#pseudo-lang-div1:lang(en)",
+    'expect': [] /*no matches*/,
+    'exclude': ["document", "element"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name':
+        ":lang pseudo-class selector, matching specified language with exact value",
+    'selector': "#pseudo-lang-div2:lang(fr)",
+    'expect': ["pseudo-lang-div2"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        ":lang pseudo-class selector, matching specified language with partial value",
+    'selector': "#pseudo-lang-div3:lang(en)",
+    'expect': ["pseudo-lang-div3"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name': ":lang pseudo-class selector, not matching incorrect language",
+    'selector': "#pseudo-lang-div4:lang(es-AR)",
+    'expect': [] /*no matches*/,
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+
+  // - :enabled              (Level 3)
+  {
+    'name':
+        ":enabled pseudo-class selector, matching all enabled form controls",
+    'selector': "#pseudo-ui :enabled",
+    'expect': [
+      "pseudo-ui-input1",
+      "pseudo-ui-input2",
+      "pseudo-ui-input3",
+      "pseudo-ui-input4",
+      "pseudo-ui-input5",
+      "pseudo-ui-input6",
+      "pseudo-ui-input7",
+      "pseudo-ui-input8",
+      "pseudo-ui-input9",
+      "pseudo-ui-textarea1",
+      "pseudo-ui-button1"
+    ],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+
+  // - :disabled             (Level 3)
+  {
+    'name':
+        ":enabled pseudo-class selector, matching all disabled form controls",
+    'selector': "#pseudo-ui :disabled",
+    'expect': [
+      "pseudo-ui-input10",
+      "pseudo-ui-input11",
+      "pseudo-ui-input12",
+      "pseudo-ui-input13",
+      "pseudo-ui-input14",
+      "pseudo-ui-input15",
+      "pseudo-ui-input16",
+      "pseudo-ui-input17",
+      "pseudo-ui-input18",
+      "pseudo-ui-textarea2",
+      "pseudo-ui-button2"
+    ],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+
+  // - :checked              (Level 3)
+  {
+    'name':
+        ":checked pseudo-class selector, matching checked radio buttons and checkboxes",
+    'selector': "#pseudo-ui :checked",
+    'expect': [
+      "pseudo-ui-input4",
+      "pseudo-ui-input6",
+      "pseudo-ui-input13",
+      "pseudo-ui-input15"
+    ],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+
+  // - :not(s)               (Level 3)
+  {
+    'name': ":not pseudo-class selector, matching ",
+    'selector': "#not>:not(div)",
+    'expect': ["not-p1", "not-p2", "not-p3"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name': ":not pseudo-class selector, matching ",
+    'selector': "#not * :not(:first-child)",
+    'expect': ["not-em1", "not-em2", "not-em3"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name': ":not pseudo-class selector, matching nothing",
+    'selector': ":not(*)",
+    'expect': [] /* no matches */,
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL
+  },
+  {
+    'name': ":not pseudo-class selector, matching nothing",
+    'selector': ":not(*|*)",
+    'expect': [] /* no matches */,
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL
+  },
+
+  // Pseudo-elements
+  // - ::first-line
+  {
+    'name':
+        ":first-line pseudo-element (one-colon syntax) selector, not matching any elements",
+    'selector': "#pseudo-element:first-line",
+    'expect': [] /*no matches*/,
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name':
+        "::first-line pseudo-element (two-colon syntax) selector, not matching any elements",
+    'selector': "#pseudo-element::first-line",
+    'expect': [] /*no matches*/,
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL
+  },
+
+  // - ::first-letter
+  {
+    'name':
+        ":first-letter pseudo-element (one-colon syntax) selector, not matching any elements",
+    'selector': "#pseudo-element:first-letter",
+    'expect': [] /*no matches*/,
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name':
+        "::first-letter pseudo-element (two-colon syntax) selector, not matching any elements",
+    'selector': "#pseudo-element::first-letter",
+    'expect': [] /*no matches*/,
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL
+  },
+
+  // - ::before
+  {
+    'name':
+        ":before pseudo-element (one-colon syntax) selector, not matching any elements",
+    'selector': "#pseudo-element:before",
+    'expect': [] /*no matches*/,
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name':
+        "::before pseudo-element (two-colon syntax) selector, not matching any elements",
+    'selector': "#pseudo-element::before",
+    'expect': [] /*no matches*/,
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL
+  },
+
+  // - ::after
+  {
+    'name':
+        ":after pseudo-element (one-colon syntax) selector, not matching any elements",
+    'selector': "#pseudo-element:after",
+    'expect': [] /*no matches*/,
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name':
+        "::after pseudo-element (two-colon syntax) selector, not matching any elements",
+    'selector': "#pseudo-element::after",
+    'expect': [] /*no matches*/,
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL
+  },
+
+  // Class Selectors
+  {
+    'name': "Class selector, matching element with specified class",
+    'selector': ".class-p",
+    'expect': ["class-p1", "class-p2", "class-p3"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Class selector, chained, matching only elements with all specified classes",
+    'selector': "#class .apple.orange.banana",
+    'expect': [
+      "class-div1",
+      "class-div2",
+      "class-p4",
+      "class-div3",
+      "class-p6",
+      "class-div4"
+    ],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "Class Selector, chained, with type selector",
+    'selector': "div.apple.banana.orange",
+    'expect': ["class-div1", "class-div2", "class-div3", "class-div4"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  // Caution: If copying and pasting the folowing non-ASCII classes, ensure unicode normalisation is not performed in the process.
+  {
+    'name':
+        "Class selector, matching element with class value using non-ASCII characters",
+    'selector': ".台北Táiběi",
+    'expect': ["class-span1"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Class selector, matching multiple elements with class value using non-ASCII characters",
+    'selector': ".台北",
+    'expect': ["class-span1", "class-span2"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Class selector, chained, matching element with multiple class values using non-ASCII characters",
+    'selector': ".台北Táiběi.台北",
+    'expect': ["class-span1"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Class selector, matching element with class with escaped character",
+    'selector': ".foo\\:bar",
+    'expect': ["class-span3"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Class selector, matching element with class with escaped character",
+    'selector': ".test\\.foo\\[5\\]bar",
+    'expect': ["class-span4"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+
+  // ID Selectors
+  {
+    'name': "ID selector, matching element with specified id",
+    'selector': "#id #id-div1",
+    'expect': ["id-div1"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "ID selector, chained, matching element with specified id",
+    'selector': "#id-div1, #id-div1",
+    'expect': ["id-div1"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "ID selector, chained, matching element with specified id",
+    'selector': "#id-div1, #id-div2",
+    'expect': ["id-div1", "id-div2"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "ID Selector, chained, with type selector",
+    'selector': "div#id-div1, div#id-div2",
+    'expect': ["id-div1", "id-div2"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "ID selector, not matching non-existent descendant",
+    'selector': "#id #none",
+    'expect': [] /*no matches*/,
+    'level': 1,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name': "ID selector, not matching non-existent ancestor",
+    'selector': "#none #id-div1",
+    'expect': [] /*no matches*/,
+    'level': 1,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name': "ID selector, matching multiple elements with duplicate id",
+    'selector': "#id-li-duplicate",
+    'expect': [
+      "id-li-duplicate",
+      "id-li-duplicate",
+      "id-li-duplicate",
+      "id-li-duplicate"
+    ],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+
+  // Caution: If copying and pasting the folowing non-ASCII IDs, ensure unicode normalisation is not performed in the process.
+  {
+    'name': "ID selector, matching id value using non-ASCII characters",
+    'selector': "#台北Táiběi",
+    'expect': ["台北Táiběi"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "ID selector, matching id value using non-ASCII characters",
+    'selector': "#台北",
+    'expect': ["台北"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "ID selector, matching id values using non-ASCII characters",
+    'selector': "#台北Táiběi, #台北",
+    'expect': ["台北Táiběi", "台北"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+
+  // XXX runMatchesTest() in level2-lib.js can't handle this because obtaining the expected nodes requires escaping characters when generating the selector from 'expect' values
+  {
+    'name': "ID selector, matching element with id with escaped character",
+    'selector': "#\\#foo\\:bar",
+    'expect': ["#foo:bar"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name': "ID selector, matching element with id with escaped character",
+    'selector': "#test\\.foo\\[5\\]bar",
+    'expect': ["test.foo[5]bar"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE
+  },
+
+  // Namespaces
+  // XXX runMatchesTest() in level2-lib.js can't handle these because non-HTML elements don't have a recognised id
+  {
+    'name': "Namespace selector, matching element with any namespace",
+    'selector': "#any-namespace *|div",
+    'expect': [
+      "any-namespace-div1",
+      "any-namespace-div2",
+      "any-namespace-div3",
+      "any-namespace-div4"
+    ],
+    'level': 3,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name': "Namespace selector, matching div elements in no namespace only",
+    'selector': "#no-namespace |div",
+    'expect': ["no-namespace-div3"],
+    'level': 3,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name': "Namespace selector, matching any elements in no namespace only",
+    'selector': "#no-namespace |*",
+    'expect': ["no-namespace-div3"],
+    'level': 3,
+    'testType': TEST_QSA_BASELINE
+  },
+
+  // Combinators
+  // - Descendant combinator ' '
+  {
+    'name':
+        "Descendant combinator, matching element that is a descendant of an element with id",
+    'selector': "#descendant div",
+    'expect': [
+      "descendant-div1",
+      "descendant-div2",
+      "descendant-div3",
+      "descendant-div4"
+    ],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Descendant combinator, matching element with id that is a descendant of an element",
+    'selector': "body #descendant-div1",
+    'expect': ["descendant-div1"],
+    'exclude': ["detached", "fragment"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Descendant combinator, matching element with id that is a descendant of an element",
+    'selector': "div #descendant-div1",
+    'expect': ["descendant-div1"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Descendant combinator, matching element with id that is a descendant of an element with id",
+    'selector': "#descendant #descendant-div2",
+    'expect': ["descendant-div2"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Descendant combinator, matching element with class that is a descendant of an element with id",
+    'selector': "#descendant .descendant-div2",
+    'expect': ["descendant-div2"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Descendant combinator, matching element with class that is a descendant of an element with class",
+    'selector': ".descendant-div1 .descendant-div3",
+    'expect': ["descendant-div3"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Descendant combinator, not matching element with id that is not a descendant of an element with id",
+    'selector': "#descendant-div1 #descendant-div4",
+    'expect': [] /*no matches*/,
+    'level': 1,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name': "Descendant combinator, whitespace characters",
+    'selector': "#descendant\t\r\n#descendant-div2",
+    'expect': ["descendant-div2"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+
+  // - Child combinator '>'
+  {
+    'name':
+        "Child combinator, matching element that is a child of an element with id",
+    'selector': "#child>div",
+    'expect': ["child-div1", "child-div4"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Child combinator, matching element with id that is a child of an element",
+    'selector': "div>#child-div1",
+    'expect': ["child-div1"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Child combinator, matching element with id that is a child of an element with id",
+    'selector': "#child>#child-div1",
+    'expect': ["child-div1"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Child combinator, matching element with id that is a child of an element with class",
+    'selector': "#child-div1>.child-div2",
+    'expect': ["child-div2"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Child combinator, matching element with class that is a child of an element with class",
+    'selector': ".child-div1>.child-div2",
+    'expect': ["child-div2"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Child combinator, not matching element with id that is not a child of an element with id",
+    'selector': "#child>#child-div3",
+    'expect': [] /*no matches*/,
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name':
+        "Child combinator, not matching element with id that is not a child of an element with class",
+    'selector': "#child-div1>.child-div3",
+    'expect': [] /*no matches*/,
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name':
+        "Child combinator, not matching element with class that is not a child of an element with class",
+    'selector': ".child-div1>.child-div3",
+    'expect': [] /*no matches*/,
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name': "Child combinator, surrounded by whitespace",
+    'selector': "#child-div1\t\r\n>\t\r\n#child-div2",
+    'expect': ["child-div2"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "Child combinator, whitespace after",
+    'selector': "#child-div1>\t\r\n#child-div2",
+    'expect': ["child-div2"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "Child combinator, whitespace before",
+    'selector': "#child-div1\t\r\n>#child-div2",
+    'expect': ["child-div2"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "Child combinator, no whitespace",
+    'selector': "#child-div1>#child-div2",
+    'expect': ["child-div2"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+
+  // - Adjacent sibling combinator '+'
+  {
+    'name':
+        "Adjacent sibling combinator, matching element that is an adjacent sibling of an element with id",
+    'selector': "#adjacent-div2+div",
+    'expect': ["adjacent-div4"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Adjacent sibling combinator, matching element with id that is an adjacent sibling of an element",
+    'selector': "div+#adjacent-div4",
+    'expect': ["adjacent-div4"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Adjacent sibling combinator, matching element with id that is an adjacent sibling of an element with id",
+    'selector': "#adjacent-div2+#adjacent-div4",
+    'expect': ["adjacent-div4"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Adjacent sibling combinator, matching element with class that is an adjacent sibling of an element with id",
+    'selector': "#adjacent-div2+.adjacent-div4",
+    'expect': ["adjacent-div4"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Adjacent sibling combinator, matching element with class that is an adjacent sibling of an element with class",
+    'selector': ".adjacent-div2+.adjacent-div4",
+    'expect': ["adjacent-div4"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Adjacent sibling combinator, matching p element that is an adjacent sibling of a div element",
+    'selector': "#adjacent div+p",
+    'expect': ["adjacent-p2"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "Adjacent sibling combinator, not matching element with id that is not an adjacent sibling of an element with id",
+    'selector': "#adjacent-div2+#adjacent-p2, #adjacent-div2+#adjacent-div1",
+    'expect': [] /*no matches*/,
+    'level': 2,
+    'testType': TEST_QSA_BASELINE
+  },
+  {
+    'name': "Adjacent sibling combinator, surrounded by whitespace",
+    'selector': "#adjacent-p2\t\r\n+\t\r\n#adjacent-p3",
+    'expect': ["adjacent-p3"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "Adjacent sibling combinator, whitespace after",
+    'selector': "#adjacent-p2+\t\r\n#adjacent-p3",
+    'expect': ["adjacent-p3"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "Adjacent sibling combinator, whitespace before",
+    'selector': "#adjacent-p2\t\r\n+#adjacent-p3",
+    'expect': ["adjacent-p3"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "Adjacent sibling combinator, no whitespace",
+    'selector': "#adjacent-p2+#adjacent-p3",
+    'expect': ["adjacent-p3"],
+    'level': 2,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+
+  // - General sibling combinator ~ (Level 3)
+  {
+    'name':
+        "General sibling combinator, matching element that is a sibling of an element with id",
+    'selector': "#sibling-div2~div",
+    'expect': ["sibling-div4", "sibling-div6"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "General sibling combinator, matching element with id that is a sibling of an element",
+    'selector': "div~#sibling-div4",
+    'expect': ["sibling-div4"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "General sibling combinator, matching element with id that is a sibling of an element with id",
+    'selector': "#sibling-div2~#sibling-div4",
+    'expect': ["sibling-div4"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "General sibling combinator, matching element with class that is a sibling of an element with id",
+    'selector': "#sibling-div2~.sibling-div",
+    'expect': ["sibling-div4", "sibling-div6"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "General sibling combinator, matching p element that is a sibling of a div element",
+    'selector': "#sibling div~p",
+    'expect': ["sibling-p2", "sibling-p3"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name':
+        "General sibling combinator, not matching element with id that is not a sibling after a p element",
+    'selector': "#sibling>p~div",
+    'expect': [] /*no matches*/,
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL
+  },
+  {
+    'name':
+        "General sibling combinator, not matching element with id that is not a sibling after an element with id",
+    'selector': "#sibling-div2~#sibling-div3, #sibling-div2~#sibling-div1",
+    'expect': [] /*no matches*/,
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL
+  },
+  {
+    'name': "General sibling combinator, surrounded by whitespace",
+    'selector': "#sibling-p2\t\r\n~\t\r\n#sibling-p3",
+    'expect': ["sibling-p3"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "General sibling combinator, whitespace after",
+    'selector': "#sibling-p2~\t\r\n#sibling-p3",
+    'expect': ["sibling-p3"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "General sibling combinator, whitespace before",
+    'selector': "#sibling-p2\t\r\n~#sibling-p3",
+    'expect': ["sibling-p3"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "General sibling combinator, no whitespace",
+    'selector': "#sibling-p2~#sibling-p3",
+    'expect': ["sibling-p3"],
+    'level': 3,
+    'testType': TEST_QSA_ADDITIONAL | TEST_MATCH_BASELINE
+  },
+
+  // Group of selectors (comma)
+  {
+    'name': "Syntax, group of selectors separator, surrounded by whitespace",
+    'selector': "#group em\t\r \n,\t\r \n#group strong",
+    'expect': ["group-em1", "group-strong1"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "Syntax, group of selectors separator, whitespace after",
+    'selector': "#group em,\t\r\n#group strong",
+    'expect': ["group-em1", "group-strong1"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "Syntax, group of selectors separator, whitespace before",
+    'selector': "#group em\t\r\n,#group strong",
+    'expect': ["group-em1", "group-strong1"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+  {
+    'name': "Syntax, group of selectors separator, no whitespace",
+    'selector': "#group em,#group strong",
+    'expect': ["group-em1", "group-strong1"],
+    'level': 1,
+    'testType': TEST_QSA_BASELINE | TEST_MATCH_BASELINE
+  },
+];
diff --git a/mojo/public/dart/third_party/html/test/support.dart b/mojo/public/dart/third_party/html/test/support.dart
new file mode 100644
index 0000000..1b4c0b4
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/support.dart
@@ -0,0 +1,164 @@
+/// Support code for the tests in this directory.
+library support;
+
+import 'dart:io';
+import 'dart:collection';
+import 'package:path/path.dart' as path;
+import 'package:html/src/treebuilder.dart';
+import 'package:html/dom.dart';
+import 'package:html/dom_parsing.dart';
+
+typedef TreeBuilder TreeBuilderFactory(bool namespaceHTMLElements);
+
+Map _treeTypes;
+Map<String, TreeBuilderFactory> get treeTypes {
+  if (_treeTypes == null) {
+    // TODO(jmesserly): add DOM here once it's implemented
+    _treeTypes = {"simpletree": (useNs) => new TreeBuilder(useNs)};
+  }
+  return _treeTypes;
+}
+
+final testDataDir = Platform.script.resolve('data').toFilePath();
+
+Iterable<String> getDataFiles(String subdirectory) {
+  var dir = new Directory(path.join(testDataDir, subdirectory));
+  return dir.listSync().where((f) => f is File).map((f) => f.path);
+}
+
+// TODO(jmesserly): make this class simpler. We could probably split on
+// "\n#" instead of newline and remove a lot of code.
+class TestData extends IterableBase<Map> {
+  final String _text;
+  final String newTestHeading;
+
+  TestData(String filename, [this.newTestHeading = "data"])
+      // Note: can't use readAsLinesSync here because it splits on \r
+      : _text = new File(filename).readAsStringSync();
+
+  // Note: in Python this was a generator, but since we can't do that in Dart,
+  // it's easier to convert it into an upfront computation.
+  Iterator<Map> get iterator => _getData().iterator;
+
+  List<Map> _getData() {
+    var data = <String, String>{};
+    var key = null;
+    var result = <Map>[];
+    var lines = _text.split('\n');
+    // Remove trailing newline to match Python
+    if (lines.last == '') {
+      lines.removeLast();
+    }
+    for (var line in lines) {
+      var heading = sectionHeading(line);
+      if (heading != null) {
+        if (data.length > 0 && heading == newTestHeading) {
+          // Remove trailing newline
+          data[key] = data[key].substring(0, data[key].length - 1);
+          result.add(normaliseOutput(data));
+          data = <String, String>{};
+        }
+        key = heading;
+        data[key] = "";
+      } else if (key != null) {
+        data[key] = '${data[key]}$line\n';
+      }
+    }
+
+    if (data.length > 0) {
+      result.add(normaliseOutput(data));
+    }
+    return result;
+  }
+
+  /// If the current heading is a test section heading return the heading,
+  /// otherwise return null.
+  static String sectionHeading(String line) {
+    return line.startsWith("#") ? line.substring(1).trim() : null;
+  }
+
+  static Map normaliseOutput(Map data) {
+    // Remove trailing newlines
+    data.forEach((key, value) {
+      if (value.endsWith("\n")) {
+        data[key] = value.substring(0, value.length - 1);
+      }
+    });
+    return data;
+  }
+}
+
+/// Serialize the [document] into the html5 test data format.
+testSerializer(document) {
+  return (new TestSerializer()..visit(document)).toString();
+}
+
+/// Serializes the DOM into test format. See [testSerializer].
+class TestSerializer extends TreeVisitor {
+  final StringBuffer _str;
+  int _indent = 0;
+  String _spaces = '';
+
+  TestSerializer() : _str = new StringBuffer();
+
+  String toString() => _str.toString();
+
+  int get indent => _indent;
+
+  set indent(int value) {
+    if (_indent == value) return;
+
+    var arr = new List<int>(value);
+    for (int i = 0; i < value; i++) {
+      arr[i] = 32;
+    }
+    _spaces = new String.fromCharCodes(arr);
+    _indent = value;
+  }
+
+  void _newline() {
+    if (_str.length > 0) _str.write('\n');
+    _str.write('|$_spaces');
+  }
+
+  visitNodeFallback(Node node) {
+    _newline();
+    _str.write(node);
+    visitChildren(node);
+  }
+
+  visitChildren(Node node) {
+    indent += 2;
+    for (var child in node.nodes) visit(child);
+    indent -= 2;
+  }
+
+  visitDocument(node) {
+    indent += 1;
+    for (var child in node.nodes) visit(child);
+    indent -= 1;
+  }
+
+  visitDocumentFragment(DocumentFragment node) => visitDocument(node);
+
+  visitElement(Element node) {
+    _newline();
+    _str.write(node);
+    if (node.attributes.length > 0) {
+      indent += 2;
+      var keys = new List.from(node.attributes.keys);
+      keys.sort((x, y) => x.compareTo(y));
+      for (var key in keys) {
+        var v = node.attributes[key];
+        if (key is AttributeName) {
+          AttributeName attr = key;
+          key = "${attr.prefix} ${attr.name}";
+        }
+        _newline();
+        _str.write('$key="$v"');
+      }
+      indent -= 2;
+    }
+    visitChildren(node);
+  }
+}
diff --git a/mojo/public/dart/third_party/html/test/tokenizer_test.dart b/mojo/public/dart/third_party/html/test/tokenizer_test.dart
new file mode 100644
index 0000000..bdac1fd
--- /dev/null
+++ b/mojo/public/dart/third_party/html/test/tokenizer_test.dart
@@ -0,0 +1,265 @@
+library tokenizer_test;
+
+// Note: mirrors used to match the getattr usage in the original test
+import 'dart:convert';
+import 'dart:io';
+import 'dart:mirrors';
+import 'package:path/path.dart' as pathos;
+import 'package:unittest/unittest.dart';
+import 'package:html/src/char_encodings.dart';
+import 'package:html/src/token.dart';
+import 'package:html/src/tokenizer.dart';
+import 'package:utf/utf.dart';
+import 'support.dart';
+
+class TokenizerTestParser {
+  String _state;
+  var _lastStartTag;
+  List outputTokens;
+
+  TokenizerTestParser(String initialState, [lastStartTag])
+      : _state = initialState,
+        _lastStartTag = lastStartTag;
+
+  List parse(String str) {
+    // Note: we need to pass bytes to the tokenizer if we want it to handle BOM.
+    var bytes = codepointsToUtf8(toCodepoints(str));
+    var tokenizer = new HtmlTokenizer(bytes, encoding: 'utf-8');
+    outputTokens = [];
+
+    // Note: we can't get a closure of the state method. However, we can
+    // create a new closure to invoke it via mirrors.
+    var mtok = reflect(tokenizer);
+    tokenizer.state = () => mtok.invoke(new Symbol(_state), const []).reflectee;
+
+    if (_lastStartTag != null) {
+      tokenizer.currentToken = new StartTagToken(_lastStartTag);
+    }
+
+    while (tokenizer.moveNext()) {
+      var token = tokenizer.current;
+      switch (token.kind) {
+        case TokenKind.characters:
+          processCharacters(token);
+          break;
+        case TokenKind.spaceCharacters:
+          processSpaceCharacters(token);
+          break;
+        case TokenKind.startTag:
+          processStartTag(token);
+          break;
+        case TokenKind.endTag:
+          processEndTag(token);
+          break;
+        case TokenKind.comment:
+          processComment(token);
+          break;
+        case TokenKind.doctype:
+          processDoctype(token);
+          break;
+        case TokenKind.parseError:
+          processParseError(token);
+          break;
+      }
+    }
+
+    return outputTokens;
+  }
+
+  void processDoctype(DoctypeToken token) {
+    outputTokens.add(
+        ["DOCTYPE", token.name, token.publicId, token.systemId, token.correct]);
+  }
+
+  void processStartTag(StartTagToken token) {
+    outputTokens.add(["StartTag", token.name, token.data, token.selfClosing]);
+  }
+
+  void processEndTag(EndTagToken token) {
+    outputTokens.add(["EndTag", token.name, token.selfClosing]);
+  }
+
+  void processComment(StringToken token) {
+    outputTokens.add(["Comment", token.data]);
+  }
+
+  void processSpaceCharacters(StringToken token) {
+    processCharacters(token);
+  }
+
+  void processCharacters(StringToken token) {
+    outputTokens.add(["Character", token.data]);
+  }
+
+  void processEOF(token) {}
+
+  void processParseError(StringToken token) {
+    // TODO(jmesserly): when debugging test failures it can be useful to add
+    // logging here like `print('ParseError $token');`. It would be nice to
+    // use the actual logging library.
+    outputTokens.add(["ParseError", token.data]);
+  }
+}
+
+List concatenateCharacterTokens(List tokens) {
+  var outputTokens = [];
+  for (var token in tokens) {
+    if (token.indexOf("ParseError") == -1 && token[0] == "Character") {
+      if (outputTokens.length > 0 &&
+          outputTokens.last.indexOf("ParseError") == -1 &&
+          outputTokens.last[0] == "Character") {
+        outputTokens.last[1] = '${outputTokens.last[1]}${token[1]}';
+      } else {
+        outputTokens.add(token);
+      }
+    } else {
+      outputTokens.add(token);
+    }
+  }
+  return outputTokens;
+}
+
+List normalizeTokens(List tokens) {
+  // TODO: convert tests to reflect arrays
+  for (int i = 0; i < tokens.length; i++) {
+    var token = tokens[i];
+    if (token[0] == 'ParseError') {
+      tokens[i] = token[0];
+    }
+  }
+  return tokens;
+}
+
+/// Test whether the test has passed or failed
+///
+/// If the ignoreErrorOrder flag is set to true we don't test the relative
+/// positions of parse errors and non parse errors.
+void expectTokensMatch(
+    List expectedTokens, List receivedTokens, bool ignoreErrorOrder,
+    [bool ignoreErrors = false, String message]) {
+  var checkSelfClosing = false;
+  for (var token in expectedTokens) {
+    if (token[0] == "StartTag" && token.length == 4 ||
+        token[0] == "EndTag" && token.length == 3) {
+      checkSelfClosing = true;
+      break;
+    }
+  }
+
+  if (!checkSelfClosing) {
+    for (var token in receivedTokens) {
+      if (token[0] == "StartTag" || token[0] == "EndTag") {
+        token.removeLast();
+      }
+    }
+  }
+
+  if (!ignoreErrorOrder && !ignoreErrors) {
+    expect(receivedTokens, equals(expectedTokens), reason: message);
+  } else {
+    // Sort the tokens into two groups; non-parse errors and parse errors
+    var expectedNonErrors = expectedTokens.where((t) => t != "ParseError");
+    var receivedNonErrors = receivedTokens.where((t) => t != "ParseError");
+
+    expect(receivedNonErrors, equals(expectedNonErrors), reason: message);
+    if (!ignoreErrors) {
+      var expectedParseErrors = expectedTokens.where((t) => t == "ParseError");
+      var receivedParseErrors = receivedTokens.where((t) => t == "ParseError");
+      expect(receivedParseErrors, equals(expectedParseErrors), reason: message);
+    }
+  }
+}
+
+void runTokenizerTest(Map testInfo) {
+  // XXX - move this out into the setup function
+  // concatenate all consecutive character tokens into a single token
+  if (testInfo.containsKey('doubleEscaped')) {
+    testInfo = unescape(testInfo);
+  }
+
+  var expected = concatenateCharacterTokens(testInfo['output']);
+  if (!testInfo.containsKey('lastStartTag')) {
+    testInfo['lastStartTag'] = null;
+  }
+  var parser = new TokenizerTestParser(
+      testInfo['initialState'], testInfo['lastStartTag']);
+  var tokens = parser.parse(testInfo['input']);
+  tokens = concatenateCharacterTokens(tokens);
+  var received = normalizeTokens(tokens);
+  var errorMsg = [
+    "\n\nInitial state:",
+    testInfo['initialState'],
+    "\nInput:",
+    testInfo['input'],
+    "\nExpected:",
+    expected,
+    "\nreceived:",
+    tokens
+  ].map((s) => '$s').join('\n');
+  var ignoreErrorOrder = testInfo['ignoreErrorOrder'];
+  if (ignoreErrorOrder == null) ignoreErrorOrder = false;
+
+  expectTokensMatch(expected, received, ignoreErrorOrder, true, errorMsg);
+}
+
+Map unescape(Map testInfo) {
+  // TODO(sigmundch,jmesserly): we currently use JSON.decode to unescape the
+  // unicode characters in the string, we should use a decoding that works with
+  // any control characters.
+  decode(inp) => inp == '\u0000' ? inp : JSON.decode('"$inp"');
+
+  testInfo["input"] = decode(testInfo["input"]);
+  for (var token in testInfo["output"]) {
+    if (token == "ParseError") {
+      continue;
+    } else {
+      token[1] = decode(token[1]);
+      if (token.length > 2) {
+        for (var pair in token[2]) {
+          var key = pair[0];
+          var value = pair[1];
+          token[2].remove(key);
+          token[2][decode(key)] = decode(value);
+        }
+      }
+    }
+  }
+  return testInfo;
+}
+
+String camelCase(String s) {
+  s = s.toLowerCase();
+  var result = new StringBuffer();
+  for (var match in new RegExp(r"\W+(\w)(\w+)").allMatches(s)) {
+    if (result.length == 0) result.write(s.substring(0, match.start));
+    result.write(match.group(1).toUpperCase());
+    result.write(match.group(2));
+  }
+  return result.toString();
+}
+
+void main() {
+  for (var path in getDataFiles('tokenizer')) {
+    if (!path.endsWith('.test')) continue;
+
+    var text = new File(path).readAsStringSync();
+    var tests = JSON.decode(text);
+    var testName = pathos.basenameWithoutExtension(path);
+    var testList = tests['tests'];
+    if (testList == null) continue;
+
+    group(testName, () {
+      for (int index = 0; index < testList.length; index++) {
+        final testInfo = testList[index];
+
+        testInfo.putIfAbsent("initialStates", () => ["Data state"]);
+        for (var initialState in testInfo["initialStates"]) {
+          test(testInfo["description"], () {
+            testInfo["initialState"] = camelCase(initialState);
+            runTokenizerTest(testInfo);
+          });
+        }
+      }
+    });
+  }
+}
diff --git a/mojo/public/dart/third_party/http_multi_server/.gitignore b/mojo/public/dart/third_party/http_multi_server/.gitignore
new file mode 100644
index 0000000..388eff0
--- /dev/null
+++ b/mojo/public/dart/third_party/http_multi_server/.gitignore
@@ -0,0 +1,14 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.pub/
+build/
+packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/http_multi_server/.status b/mojo/public/dart/third_party/http_multi_server/.status
new file mode 100644
index 0000000..ac80ccc
--- /dev/null
+++ b/mojo/public/dart/third_party/http_multi_server/.status
@@ -0,0 +1,18 @@
+# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Skip non-test files ending with "_test".
+packages/*: Skip
+*/packages/*: Skip
+*/*/packages/*: Skip
+*/*/*/packages/*: Skip
+*/*/*/*packages/*: Skip
+*/*/*/*/*packages/*: Skip
+
+# Only run tests from the build directory, since we don't care about the
+# difference between transformed an untransformed code.
+test/*: Skip
+
+[ $browser ]
+*: Skip # Uses dart:io
diff --git a/mojo/public/dart/third_party/http_multi_server/CHANGELOG.md b/mojo/public/dart/third_party/http_multi_server/CHANGELOG.md
new file mode 100644
index 0000000..df1b863
--- /dev/null
+++ b/mojo/public/dart/third_party/http_multi_server/CHANGELOG.md
@@ -0,0 +1,36 @@
+## 1.3.2
+
+* Eventually stop retrying port allocation if it fails repeatedly.
+
+* Properly detect socket errors caused by already-in-use addresses.
+
+## 1.3.1
+
+* `loopback()` and `loopbackSecure()` recover gracefully if an ephemeral port is
+  requested and the located port isn't available on both IPv4 and IPv6.
+
+## 1.3.0
+
+* Add support for `HttpServer.autoCompress`.
+
+## 1.2.0
+
+* Add support for `HttpServer.defaultResponseHeaders.clear`.
+
+* Fix `HttpServer.defaultResponseHeaders.remove` and `.removeAll`.
+
+## 1.1.0
+
+* Add support for `HttpServer.defaultResponseHeaders`.
+
+## 1.0.2
+
+* Remove the workaround for [issue 19815][].
+
+## 1.0.1
+
+* Ignore errors from one of the servers if others are still bound. In
+  particular, this works around [issue 19815][] on some Windows machines where
+  IPv6 failure isn't discovered until we try to connect to the socket.
+
+[issue 19815]: http://code.google.com/p/dart/issues/detail?id=19815
diff --git a/mojo/public/dart/third_party/http_multi_server/LICENSE b/mojo/public/dart/third_party/http_multi_server/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/mojo/public/dart/third_party/http_multi_server/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/http_multi_server/README.md b/mojo/public/dart/third_party/http_multi_server/README.md
new file mode 100644
index 0000000..e12c8d1
--- /dev/null
+++ b/mojo/public/dart/third_party/http_multi_server/README.md
@@ -0,0 +1,25 @@
+An implementation of `dart:io`'s [HttpServer][] that wraps multiple servers and
+forwards methods to all of them. It's useful for serving the same application on
+multiple network interfaces while still having a unified way of controlling the
+servers. In particular, it supports serving on both the IPv4 and IPv6 loopback
+addresses using [HttpMultiServer.loopback][].
+
+```dart
+import 'package:http_multi_server/http_multi_server.dart';
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:shelf/shelf_io.dart' as shelf_io;
+
+void main() {
+  // Both http://127.0.0.1:8080 and http://[::1]:8080 will be bound to the same
+  // server.
+  HttpMultiServer.loopback(8080).then((server) {
+    shelf_io.serveRequests(server, (request) {
+      return new shelf.Response.ok("Hello, world!");
+    });
+  });
+}
+```
+
+[HttpServer]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart-io.HttpServer
+
+[HttpMultiServer.loopback]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/http_multi_server/http_multi_server.HttpMultiServer#id_loopback
diff --git a/mojo/public/dart/third_party/http_multi_server/codereview.settings b/mojo/public/dart/third_party/http_multi_server/codereview.settings
new file mode 100644
index 0000000..23d9fd4
--- /dev/null
+++ b/mojo/public/dart/third_party/http_multi_server/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: http://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/http_multi_server/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/http_multi_server/lib/http_multi_server.dart b/mojo/public/dart/third_party/http_multi_server/lib/http_multi_server.dart
new file mode 100644
index 0000000..abad76e
--- /dev/null
+++ b/mojo/public/dart/third_party/http_multi_server/lib/http_multi_server.dart
@@ -0,0 +1,180 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http_multi_server;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'src/multi_headers.dart';
+import 'src/utils.dart';
+
+/// The error code for an error caused by a port already being in use.
+final _addressInUseErrno = _computeAddressInUseErrno();
+int _computeAddressInUseErrno() {
+  if (Platform.isWindows) return 10048;
+  if (Platform.isMacOS) return 48;
+  assert(Platform.isLinux);
+  return 98;
+}
+
+/// An implementation of `dart:io`'s [HttpServer] that wraps multiple servers
+/// and forwards methods to all of them.
+///
+/// This is useful for serving the same application on multiple network
+/// interfaces while still having a unified way of controlling the servers. In
+/// particular, it supports serving on both the IPv4 and IPv6 loopback addresses
+/// using [HttpMultiServer.loopback].
+class HttpMultiServer extends StreamView<HttpRequest> implements HttpServer {
+  /// The wrapped servers.
+  final Set<HttpServer> _servers;
+
+  /// Returns the default value of the `Server` header for all responses
+  /// generated by each server.
+  ///
+  /// If the wrapped servers have different default values, it's not defined
+  /// which value is returned.
+  String get serverHeader => _servers.first.serverHeader;
+  set serverHeader(String value) {
+    for (var server in _servers) {
+      server.serverHeader = value;
+    }
+  }
+
+  /// Returns the default set of headers added to all response objects.
+  ///
+  /// If the wrapped servers have different default headers, it's not defined
+  /// which header is returned for accessor methods.
+  final HttpHeaders defaultResponseHeaders;
+
+  Duration get idleTimeout => _servers.first.idleTimeout;
+  set idleTimeout(Duration value) {
+    for (var server in _servers) {
+      server.idleTimeout = value;
+    }
+  }
+
+  bool get autoCompress => _servers.first.autoCompress;
+  set autoCompress(bool value) {
+    for (var server in _servers) {
+      server.autoCompress = value;
+    }
+  }
+
+  /// Returns the port that one of the wrapped servers is listening on.
+  ///
+  /// If the wrapped servers are listening on different ports, it's not defined
+  /// which port is returned.
+  int get port => _servers.first.port;
+
+  /// Returns the address that one of the wrapped servers is listening on.
+  ///
+  /// If the wrapped servers are listening on different addresses, it's not
+  /// defined which address is returned.
+  InternetAddress get address => _servers.first.address;
+
+  set sessionTimeout(int value) {
+    for (var server in _servers) {
+      server.sessionTimeout = value;
+    }
+  }
+
+  /// Creates an [HttpMultiServer] wrapping [servers].
+  ///
+  /// All [servers] should have the same configuration and none should be
+  /// listened to when this is called.
+  HttpMultiServer(Iterable<HttpServer> servers)
+      : _servers = servers.toSet(),
+        defaultResponseHeaders = new MultiHeaders(
+            servers.map((server) => server.defaultResponseHeaders)),
+        super(mergeStreams(servers));
+
+  /// Creates an [HttpServer] listening on all available loopback addresses for
+  /// this computer.
+  ///
+  /// If this computer supports both IPv4 and IPv6, this returns an
+  /// [HttpMultiServer] listening to [port] on both loopback addresses.
+  /// Otherwise, it returns a normal [HttpServer] listening only on the IPv4
+  /// address.
+  ///
+  /// If [port] is 0, the same ephemeral port is used for both the IPv4 and IPv6
+  /// addresses.
+  static Future<HttpServer> loopback(int port, {int backlog}) {
+    if (backlog == null) backlog = 0;
+
+    return _loopback(port, (address, port) =>
+        HttpServer.bind(address, port, backlog: backlog));
+  }
+
+  /// Like [loopback], but supports HTTPS requests.
+  ///
+  /// The certificate with nickname or distinguished name (DN) [certificateName]
+  /// is looked up in the certificate database, and is used as the server
+  /// certificate. If [requestClientCertificate] is true, the server will
+  /// request clients to authenticate with a client certificate.
+  static Future<HttpServer> loopbackSecure(int port, {int backlog,
+      String certificateName, bool requestClientCertificate: false}) {
+    if (backlog == null) backlog = 0;
+
+    return _loopback(port, (address, port) =>
+        HttpServer.bindSecure(address, port, backlog: backlog,
+            certificateName: certificateName,
+            requestClientCertificate: requestClientCertificate));
+  }
+
+  /// A helper method for initializing loopback servers.
+  ///
+  /// [bind] should forward to either [HttpServer.bind] or
+  /// [HttpServer.bindSecure].
+  static Future<HttpServer> _loopback(int port,
+      Future<HttpServer> bind(InternetAddress address, int port),
+      [int remainingRetries]) {
+    if (remainingRetries == null) remainingRetries = 5;
+
+    return Future.wait([
+      supportsIpV6,
+      bind(InternetAddress.LOOPBACK_IP_V4, port)
+    ]).then((results) {
+      var supportsIpV6 = results[0];
+      var v4Server = results[1];
+
+      if (!supportsIpV6) return v4Server;
+
+      // Reuse the IPv4 server's port so that if [port] is 0, both servers use
+      // the same ephemeral port.
+      return bind(InternetAddress.LOOPBACK_IP_V6, v4Server.port)
+          .then((v6Server) {
+        return new HttpMultiServer([v4Server, v6Server]);
+      }).catchError((error) {
+        if (error is! SocketException) throw error;
+        if (error.osError.errorCode != _addressInUseErrno) throw error;
+        if (port != 0) throw error;
+        if (remainingRetries == 0) throw error;
+
+        // A port being available on IPv4 doesn't necessarily mean that the same
+        // port is available on IPv6. If it's not (which is rare in practice),
+        // we try again until we find one that's available on both.
+        v4Server.close();
+        return _loopback(port, bind, remainingRetries - 1);
+      });
+    });
+  }
+
+  Future close({bool force: false}) =>
+      Future.wait(_servers.map((server) => server.close(force: force)));
+
+  /// Returns an HttpConnectionsInfo object summarizing the total number of
+  /// current connections handled by all the servers.
+  HttpConnectionsInfo connectionsInfo() {
+    var info = new HttpConnectionsInfo();
+    for (var server in _servers) {
+      var subInfo = server.connectionsInfo();
+      info.total += subInfo.total;
+      info.active += subInfo.active;
+      info.idle += subInfo.idle;
+      info.closing += subInfo.closing;
+    }
+    return info;
+  }
+}
diff --git a/mojo/public/dart/third_party/http_multi_server/lib/src/multi_headers.dart b/mojo/public/dart/third_party/http_multi_server/lib/src/multi_headers.dart
new file mode 100644
index 0000000..fcd782c
--- /dev/null
+++ b/mojo/public/dart/third_party/http_multi_server/lib/src/multi_headers.dart
@@ -0,0 +1,123 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http_multi_server.multi_headers;
+
+import 'dart:io';
+
+/// A class that delegates header access and setting to many [HttpHeaders]
+/// instances.
+class MultiHeaders implements HttpHeaders {
+  /// The wrapped headers.
+  final Set<HttpHeaders> _headers;
+
+  bool get chunkedTransferEncoding => _headers.first.chunkedTransferEncoding;
+  set chunkedTransferEncoding(bool value) {
+    for (var headers in _headers) {
+      headers.chunkedTransferEncoding = value;
+    }
+  }
+
+  int get contentLength => _headers.first.contentLength;
+  set contentLength(int value) {
+    for (var headers in _headers) {
+      headers.contentLength = value;
+    }
+  }
+
+  ContentType get contentType => _headers.first.contentType;
+  set contentType(ContentType value) {
+    for (var headers in _headers) {
+      headers.contentType = value;
+    }
+  }
+
+  DateTime get date => _headers.first.date;
+  set date(DateTime value) {
+    for (var headers in _headers) {
+      headers.date = value;
+    }
+  }
+
+  DateTime get expires => _headers.first.expires;
+  set expires(DateTime value) {
+    for (var headers in _headers) {
+      headers.expires = value;
+    }
+  }
+
+  String get host => _headers.first.host;
+  set host(String value) {
+    for (var headers in _headers) {
+      headers.host = value;
+    }
+  }
+
+  DateTime get ifModifiedSince => _headers.first.ifModifiedSince;
+  set ifModifiedSince(DateTime value) {
+    for (var headers in _headers) {
+      headers.ifModifiedSince = value;
+    }
+  }
+
+  bool get persistentConnection => _headers.first.persistentConnection;
+  set persistentConnection(bool value) {
+    for (var headers in _headers) {
+      headers.persistentConnection = value;
+    }
+  }
+
+  int get port => _headers.first.port;
+  set port(int value) {
+    for (var headers in _headers) {
+      headers.port = value;
+    }
+  }
+
+  MultiHeaders(Iterable<HttpHeaders> headers)
+      : _headers = headers.toSet();
+
+  void add(String name, Object value) {
+    for (var headers in _headers) {
+      headers.add(name, value);
+    }
+  }
+
+  void forEach(void f(String name, List<String> values)) =>
+      _headers.first.forEach(f);
+
+  void noFolding(String name) {
+    for (var headers in _headers) {
+      headers.noFolding(name);
+    }
+  }
+
+  void remove(String name, Object value) {
+    for (var headers in _headers) {
+      headers.remove(name, value);
+    }
+  }
+
+  void removeAll(String name) {
+    for (var headers in _headers) {
+      headers.removeAll(name);
+    }
+  }
+
+  void set(String name, Object value) {
+    for (var headers in _headers) {
+      headers.set(name, value);
+    }
+  }
+
+  String value(String name) => _headers.first.value(name);
+
+  List<String> operator[](String name) => _headers.first[name];
+
+  void clear() {
+    for (var headers in _headers) {
+      headers.clear();
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/http_multi_server/lib/src/utils.dart b/mojo/public/dart/third_party/http_multi_server/lib/src/utils.dart
new file mode 100644
index 0000000..9e95aba
--- /dev/null
+++ b/mojo/public/dart/third_party/http_multi_server/lib/src/utils.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http_multi_server.utils;
+
+import 'dart:async';
+import 'dart:io';
+
+/// Merges all streams in [streams] into a single stream that emits all of their
+/// values.
+///
+/// The returned stream will be closed only when every stream in [streams] is
+/// closed.
+Stream mergeStreams(Iterable<Stream> streams) {
+  var subscriptions = new Set();
+  var controller;
+  controller = new StreamController(onListen: () {
+    for (var stream in streams) {
+      var subscription;
+      subscription = stream.listen(controller.add,
+          onError: controller.addError,
+          onDone: () {
+        subscriptions.remove(subscription);
+        if (subscriptions.isEmpty) controller.close();
+      });
+      subscriptions.add(subscription);
+    }
+  }, onCancel: () {
+    for (var subscription in subscriptions) {
+      subscription.cancel();
+    }
+  }, onPause: () {
+    for (var subscription in subscriptions) {
+      subscription.pause();
+    }
+  }, onResume: () {
+    for (var subscription in subscriptions) {
+      subscription.resume();
+    }
+  }, sync: true);
+
+  return controller.stream;
+}
+
+/// A cache for [supportsIpV6].
+bool _supportsIpV6;
+
+/// Returns whether this computer supports binding to IPv6 addresses.
+Future<bool> get supportsIpV6 {
+  if (_supportsIpV6 != null) return new Future.value(_supportsIpV6);
+
+  return ServerSocket.bind(InternetAddress.LOOPBACK_IP_V6, 0).then((socket) {
+    _supportsIpV6 = true;
+    socket.close();
+    return true;
+  }).catchError((error) {
+    if (error is! SocketException) throw error;
+    _supportsIpV6 = false;
+    return false;
+  });
+}
diff --git a/mojo/public/dart/third_party/http_multi_server/pubspec.yaml b/mojo/public/dart/third_party/http_multi_server/pubspec.yaml
new file mode 100644
index 0000000..2fb1188
--- /dev/null
+++ b/mojo/public/dart/third_party/http_multi_server/pubspec.yaml
@@ -0,0 +1,11 @@
+name: http_multi_server
+version: 1.3.2
+author: "Dart Team <misc@dartlang.org>"
+homepage: http://github.com/dart-lang/http_multi_server
+description:
+  A dart:io HttpServer wrapper that handles requests from multiple servers.
+dev_dependencies:
+  unittest: ">=0.11.0 <0.12.0"
+  http: ">=0.11.0 <0.12.0"
+environment:
+  sdk: ">=1.7.0-edge.40587 <2.0.0"
diff --git a/mojo/public/dart/third_party/http_multi_server/test/http_multi_server_test.dart b/mojo/public/dart/third_party/http_multi_server/test/http_multi_server_test.dart
new file mode 100644
index 0000000..2729fa0
--- /dev/null
+++ b/mojo/public/dart/third_party/http_multi_server/test/http_multi_server_test.dart
@@ -0,0 +1,171 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http_multi_server.test;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:http/http.dart' as http;
+import 'package:http_multi_server/http_multi_server.dart';
+import 'package:http_multi_server/src/utils.dart';
+import 'package:unittest/unittest.dart';
+
+void main() {
+  group("with multiple HttpServers", () {
+    var multiServer;
+    var subServer1;
+    var subServer2;
+    var subServer3;
+    setUp(() {
+      return Future.wait([
+        HttpServer.bind("127.0.0.1", 0).then((server) => subServer1 = server),
+        HttpServer.bind("127.0.0.1", 0).then((server) => subServer2 = server),
+        HttpServer.bind("127.0.0.1", 0).then((server) => subServer3 = server)
+      ]).then((servers) => multiServer = new HttpMultiServer(servers));
+    });
+
+    tearDown(() => multiServer.close());
+
+    test("listen listens to all servers", () {
+      multiServer.listen((request) {
+        request.response.write("got request");
+        request.response.close();
+      });
+
+      expect(_read(subServer1), completion(equals("got request")));
+      expect(_read(subServer2), completion(equals("got request")));
+      expect(_read(subServer3), completion(equals("got request")));
+    });
+
+    test("serverHeader= sets the value for all servers", () {
+      multiServer.serverHeader = "http_multi_server test";
+
+      multiServer.listen((request) {
+        request.response.write("got request");
+        request.response.close();
+      });
+
+      expect(_get(subServer1).then((response) {
+        expect(response.headers['server'], equals("http_multi_server test"));
+      }), completes);
+
+      expect(_get(subServer2).then((response) {
+        expect(response.headers['server'], equals("http_multi_server test"));
+      }), completes);
+
+      expect(_get(subServer3).then((response) {
+        expect(response.headers['server'], equals("http_multi_server test"));
+      }), completes);
+    });
+
+    test("autoCompress= sets the value for all servers", () {
+      multiServer.autoCompress = true;
+
+      multiServer.listen((request) {
+        request.response.write("got request");
+        request.response.close();
+      });
+
+      expect(_get(subServer1).then((response) {
+        expect(response.headers['content-encoding'], equals("gzip"));
+      }), completes);
+
+      expect(_get(subServer2).then((response) {
+        expect(response.headers['content-encoding'], equals("gzip"));
+      }), completes);
+
+      expect(_get(subServer3).then((response) {
+        expect(response.headers['content-encoding'], equals("gzip"));
+      }), completes);
+    });
+
+    test("headers.set sets the value for all servers", () {
+      multiServer.defaultResponseHeaders.set(
+          "server", "http_multi_server test");
+
+      multiServer.listen((request) {
+        request.response.write("got request");
+        request.response.close();
+      });
+
+      expect(_get(subServer1).then((response) {
+        expect(response.headers['server'], equals("http_multi_server test"));
+      }), completes);
+
+      expect(_get(subServer2).then((response) {
+        expect(response.headers['server'], equals("http_multi_server test"));
+      }), completes);
+
+      expect(_get(subServer3).then((response) {
+        expect(response.headers['server'], equals("http_multi_server test"));
+      }), completes);
+    });
+
+    test("connectionsInfo sums the values for all servers", () {
+      var pendingRequests = 0;
+      var awaitingResponseCompleter = new Completer();
+      var sendResponseCompleter = new Completer();
+      multiServer.listen((request) {
+        sendResponseCompleter.future.then((_) {
+          request.response.write("got request");
+          request.response.close();
+        });
+
+        pendingRequests++;
+        if (pendingRequests == 2) awaitingResponseCompleter.complete();
+      });
+
+      // Queue up some requests, then wait on [awaitingResponseCompleter] to
+      // make sure they're in-flight before we check [connectionsInfo].
+      expect(_get(subServer1), completes);
+      expect(_get(subServer2), completes);
+
+      return awaitingResponseCompleter.future.then((_) {
+        var info = multiServer.connectionsInfo();
+        expect(info.total, equals(2));
+        expect(info.active, equals(2));
+        expect(info.idle, equals(0));
+        expect(info.closing, equals(0));
+
+        sendResponseCompleter.complete();
+      });
+    });
+  });
+
+  group("HttpMultiServer.loopback", () {
+    var server;
+    setUp(() {
+      return HttpMultiServer.loopback(0).then((server_) => server = server_);
+    });
+
+    tearDown(() => server.close());
+
+    test("listens on all localhost interfaces", () {
+      server.listen((request) {
+        request.response.write("got request");
+        request.response.close();
+      });
+
+      expect(http.read("http://127.0.0.1:${server.port}/"),
+          completion(equals("got request")));
+
+      return supportsIpV6.then((supportsIpV6) {
+        if (!supportsIpV6) return;
+        expect(http.read("http://[::1]:${server.port}/"),
+            completion(equals("got request")));
+      });
+    });
+  });
+}
+
+/// Makes a GET request to the root of [server] and returns the response.
+Future<http.Response> _get(HttpServer server) => http.get(_urlFor(server));
+
+/// Makes a GET request to the root of [server] and returns the response body.
+Future<String> _read(HttpServer server) => http.read(_urlFor(server));
+
+/// Returns the URL for the root of [server].
+String _urlFor(HttpServer server) =>
+    "http://${server.address.host}:${server.port}/";
diff --git a/mojo/public/dart/third_party/http_parser/.gitignore b/mojo/public/dart/third_party/http_parser/.gitignore
new file mode 100644
index 0000000..7dbf035
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/.gitignore
@@ -0,0 +1,15 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.pub/
+build/
+packages
+.packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/http_parser/.test_config b/mojo/public/dart/third_party/http_parser/.test_config
new file mode 100644
index 0000000..412fc5c
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/.test_config
@@ -0,0 +1,3 @@
+{
+  "test_package": true
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/http_parser/CHANGELOG.md b/mojo/public/dart/third_party/http_parser/CHANGELOG.md
new file mode 100644
index 0000000..cdf85d4
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/CHANGELOG.md
@@ -0,0 +1,46 @@
+## 1.0.0
+
+This is 1.0.0 because the API is stable—there are no breaking changes.
+
+* Added an `AuthenticationChallenge` class for parsing and representing the
+  value of `WWW-Authenticate` and related headers.
+
+* Added a `CaseInsensitiveMap` class for representing case-insensitive HTTP
+  values.
+
+## 0.0.2+8
+
+* Bring in the latest `dart:io` WebSocket code.
+
+## 0.0.2+7
+
+* Add more detail to the readme.
+
+## 0.0.2+6
+
+* Updated homepage URL.
+
+## 0.0.2+5
+
+* Widen the version constraint on the `collection` package.
+
+## 0.0.2+4
+
+* Widen the `string_scanner` version constraint.
+
+## 0.0.2+3
+
+* Fix a library name conflict.
+
+## 0.0.2+2
+
+* Fixes for HTTP date formatting.
+
+## 0.0.2+1
+
+* Minor code refactoring.
+
+## 0.0.2
+
+* Added `CompatibleWebSocket`, for platform- and API-independent support for the
+  WebSocket API.
diff --git a/mojo/public/dart/third_party/http_parser/LICENSE b/mojo/public/dart/third_party/http_parser/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/http_parser/README.md b/mojo/public/dart/third_party/http_parser/README.md
new file mode 100644
index 0000000..1407c16
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/README.md
@@ -0,0 +1,18 @@
+`http_parser` is a platform-independent package for parsing and serializing
+various HTTP-related formats. It's designed to be usable on both the browser and
+the server, and thus avoids referencing any types from `dart:io` or `dart:html`.
+It includes:
+
+* Support for parsing and formatting dates according to [HTTP/1.1][2616], the
+  HTTP/1.1 standard.
+
+* A `MediaType` class that represents an HTTP media type, as used in `Accept`
+  and `Content-Type` headers. This class supports both parsing and formatting
+  media types according to [HTTP/1.1][2616].
+
+* A `CompatibleWebSocket` class that supports both the client and server sides
+  of the [WebSocket protocol][6455] independently of any specific server
+  implementation.
+
+[2616]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html
+[6455]: https://tools.ietf.org/html/rfc6455
diff --git a/mojo/public/dart/third_party/http_parser/codereview.settings b/mojo/public/dart/third_party/http_parser/codereview.settings
new file mode 100644
index 0000000..d8547c6
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: https://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/http_parser/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/http_parser/lib/http_parser.dart b/mojo/public/dart/third_party/http_parser/lib/http_parser.dart
new file mode 100644
index 0000000..77c75c0
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/lib/http_parser.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http_parser;
+
+export 'src/authentication_challenge.dart';
+export 'src/case_insensitive_map.dart';
+export 'src/http_date.dart';
+export 'src/media_type.dart';
+export 'src/web_socket.dart';
diff --git a/mojo/public/dart/third_party/http_parser/lib/src/authentication_challenge.dart b/mojo/public/dart/third_party/http_parser/lib/src/authentication_challenge.dart
new file mode 100644
index 0000000..773ee3b
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/lib/src/authentication_challenge.dart
@@ -0,0 +1,153 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http_paser.authentication_challenge;
+
+import 'dart:collection';
+
+import 'package:string_scanner/string_scanner.dart';
+
+import 'case_insensitive_map.dart';
+import 'scan.dart';
+import 'utils.dart';
+
+/// A single challenge in a WWW-Authenticate header, parsed as per [RFC 2617][].
+///
+/// [RFC 2617]: http://tools.ietf.org/html/rfc2617
+///
+/// Each WWW-Authenticate header contains one or more challenges, representing
+/// valid ways to authenticate with the server.
+class AuthenticationChallenge {
+  /// The scheme describing the type of authentication that's required, for
+  /// example "basic" or "digest".
+  ///
+  /// This is normalized to always be lower-case.
+  final String scheme;
+
+  /// The parameters describing how to authenticate.
+  ///
+  /// The semantics of these parameters are scheme-specific. The keys of this
+  /// map are case-insensitive.
+  final Map<String, String> parameters;
+
+  /// Parses a WWW-Authenticate header, which should contain one or more
+  /// challenges.
+  ///
+  /// Throws a [FormatException] if the header is invalid.
+  static List<AuthenticationChallenge> parseHeader(String header) {
+    return wrapFormatException("authentication header", header, () {
+      var scanner = new StringScanner(header);
+      scanner.scan(whitespace);
+      var challenges = parseList(scanner, () {
+        var scheme = _scanScheme(scanner, whitespaceName: '" " or "="');
+
+        // Manually parse the inner list. We need to do some lookahead to
+        // disambiguate between an auth param and another challenge.
+        var params = {};
+
+        // Consume initial empty values.
+        while (scanner.scan(",")) {
+          scanner.scan(whitespace);
+        }
+
+        _scanAuthParam(scanner, params);
+
+        var beforeComma = scanner.position;
+        while (scanner.scan(",")) {
+          scanner.scan(whitespace);
+
+          // Empty elements are allowed, but excluded from the results.
+          if (scanner.matches(",") || scanner.isDone) continue;
+
+          scanner.expect(token, name: "a token");
+          var name = scanner.lastMatch[0];
+          scanner.scan(whitespace);
+
+          // If there's no "=", then this is another challenge rather than a
+          // parameter for the current challenge.
+          if (!scanner.scan('=')) {
+            scanner.position = beforeComma;
+            break;
+          }
+
+          scanner.scan(whitespace);
+
+          if (scanner.scan(token)) {
+            params[name] = scanner.lastMatch[0];
+          } else {            
+            params[name] = expectQuotedString(
+                scanner, name: "a token or a quoted string");
+          }
+
+          scanner.scan(whitespace);
+          beforeComma = scanner.position;
+        }
+
+        return new AuthenticationChallenge(scheme, params);
+      });
+
+      scanner.expectDone();
+      return challenges;
+    });
+  }
+
+  /// Parses a single WWW-Authenticate challenge value.
+  ///
+  /// Throws a [FormatException] if the challenge is invalid.
+  factory AuthenticationChallenge.parse(String challenge) {
+    return wrapFormatException("authentication challenge", challenge, () {
+      var scanner = new StringScanner(challenge);
+      scanner.scan(whitespace);
+      var scheme = _scanScheme(scanner);
+
+      var params = {};
+      parseList(scanner, () => _scanAuthParam(scanner, params));
+
+      scanner.expectDone();
+      return new AuthenticationChallenge(scheme, params);
+    });
+  }
+
+  /// Scans a single scheme name and asserts that it's followed by a space.
+  ///
+  /// If [whitespaceName] is passed, it's used as the name for exceptions thrown
+  /// due to invalid trailing whitespace.
+  static String _scanScheme(StringScanner scanner, {String whitespaceName}) {
+    scanner.expect(token, name: "a token");
+    var scheme = scanner.lastMatch[0].toLowerCase();
+
+    scanner.scan(whitespace);
+
+    // The spec specifically requires a space between the scheme and its
+    // params.
+    if (scanner.lastMatch == null || !scanner.lastMatch[0].contains(" ")) {
+      scanner.expect(" ", name: whitespaceName);
+    }
+
+    return scheme;
+  }
+
+  /// Scans a single authentication parameter and stores its result in [params].
+  static void _scanAuthParam(StringScanner scanner, Map params) {
+    scanner.expect(token, name: "a token");
+    var name = scanner.lastMatch[0];
+    scanner.scan(whitespace);
+    scanner.expect('=');
+    scanner.scan(whitespace);
+
+    if (scanner.scan(token)) {
+      params[name] = scanner.lastMatch[0];
+    } else {            
+      params[name] = expectQuotedString(
+          scanner, name: "a token or a quoted string");
+    }
+
+    scanner.scan(whitespace);
+  }
+
+  /// Creates a new challenge value with [scheme] and [parameters].
+  AuthenticationChallenge(this.scheme, Map<String, String> parameters)
+      : parameters = new UnmodifiableMapView(
+            new CaseInsensitiveMap.from(parameters));
+}
diff --git a/mojo/public/dart/third_party/http_parser/lib/src/case_insensitive_map.dart b/mojo/public/dart/third_party/http_parser/lib/src/case_insensitive_map.dart
new file mode 100644
index 0000000..34e85b2
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/lib/src/case_insensitive_map.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http_parser.case_insensitive_map;
+
+import 'package:collection/collection.dart';
+
+/// A map from case-insensitive strings to values.
+///
+/// Much of HTTP is case-insensitive, so this is useful to have pre-defined.
+class CaseInsensitiveMap<V> extends CanonicalizedMap<String, String, V> {
+  CaseInsensitiveMap()
+      : super((key) => key.toLowerCase(), isValidKey: (key) => key != null);
+
+  CaseInsensitiveMap.from(Map<String, V> other)
+      : super.from(other, (key) => key.toLowerCase(),
+            isValidKey: (key) => key != null);
+}
diff --git a/mojo/public/dart/third_party/http_parser/lib/src/copy/bytes_builder.dart b/mojo/public/dart/third_party/http_parser/lib/src/copy/bytes_builder.dart
new file mode 100644
index 0000000..4ab83b3
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/lib/src/copy/bytes_builder.dart
@@ -0,0 +1,217 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This is a copy of "dart:io"'s BytesBuilder implementation, from
+// sdk/lib/io/bytes_builder.dart. It's copied here to make it available to
+// non-"dart:io" applications (issue 18348).
+//
+// Because it's copied directly, there are no modifications from the original.
+//
+// This is up-to-date as of sdk revision
+// 86227840d75d974feb238f8b3c59c038b99c05cf.
+library http_parser.copy.bytes_builder;
+
+import 'dart:math';
+import 'dart:typed_data';
+
+/**
+ * Builds a list of bytes, allowing bytes and lists of bytes to be added at the
+ * end.
+ *
+ * Used to efficiently collect bytes and lists of bytes.
+ */
+abstract class BytesBuilder {
+  /**
+   * Construct a new empty [BytesBuilder].
+   *
+   * If [copy] is true, the data is always copied when added to the list. If
+   * it [copy] is false, the data is only copied if needed. That means that if
+   * the lists are changed after added to the [BytesBuilder], it may effect the
+   * output. Default is `true`.
+   */
+  factory BytesBuilder({bool copy: true}) {
+    if (copy) {
+      return new _CopyingBytesBuilder();
+    } else {
+      return new _BytesBuilder();
+    }
+  }
+
+  /**
+   * Appends [bytes] to the current contents of the builder.
+   *
+   * Each value of [bytes] will be bit-representation truncated to the range
+   * 0 .. 255.
+   */
+  void add(List<int> bytes);
+
+  /**
+   * Append [byte] to the current contents of the builder.
+   *
+   * The [byte] will be bit-representation truncated to the range 0 .. 255.
+   */
+  void addByte(int byte);
+
+  /**
+   * Returns the contents of `this` and clears `this`.
+   *
+   * The list returned is a view of the the internal buffer, limited to the
+   * [length].
+   */
+  List<int> takeBytes();
+
+  /**
+   * Returns a copy of the current contents of the builder.
+   *
+   * Leaves the contents of the builder intact.
+   */
+  List<int> toBytes();
+
+  /**
+   * The number of bytes in the builder.
+   */
+  int get length;
+
+  /**
+   * Returns `true` if the buffer is empty.
+   */
+  bool get isEmpty;
+
+  /**
+   * Returns `true` if the buffer is not empty.
+   */
+  bool get isNotEmpty;
+
+  /**
+   * Clear the contents of the builder.
+   */
+  void clear();
+}
+
+
+class _CopyingBytesBuilder implements BytesBuilder {
+  // Start with 1024 bytes.
+  static const int _INIT_SIZE = 1024;
+
+  int _length = 0;
+  Uint8List _buffer;
+
+  void add(List<int> bytes) {
+    int bytesLength = bytes.length;
+    if (bytesLength == 0) return;
+    int required = _length + bytesLength;
+    if (_buffer == null) {
+      int size = _pow2roundup(required);
+      size = max(size, _INIT_SIZE);
+      _buffer = new Uint8List(size);
+    } else if (_buffer.length < required) {
+      // We will create a list in the range of 2-4 times larger than
+      // required.
+      int size = _pow2roundup(required) * 2;
+      var newBuffer = new Uint8List(size);
+      newBuffer.setRange(0, _buffer.length, _buffer);
+      _buffer = newBuffer;
+    }
+    assert(_buffer.length >= required);
+    if (bytes is Uint8List) {
+      _buffer.setRange(_length, required, bytes);
+    } else {
+      for (int i = 0; i < bytesLength; i++) {
+        _buffer[_length + i] = bytes[i];
+      }
+    }
+    _length = required;
+  }
+
+  void addByte(int byte) => add([byte]);
+
+  List<int> takeBytes() {
+    if (_buffer == null) return new Uint8List(0);
+    var buffer = new Uint8List.view(_buffer.buffer, 0, _length);
+    clear();
+    return buffer;
+  }
+
+  List<int> toBytes() {
+    if (_buffer == null) return new Uint8List(0);
+    return new Uint8List.fromList(
+        new Uint8List.view(_buffer.buffer, 0, _length));
+  }
+
+  int get length => _length;
+
+  bool get isEmpty => _length == 0;
+
+  bool get isNotEmpty => _length != 0;
+
+  void clear() {
+    _length = 0;
+    _buffer = null;
+  }
+
+  int _pow2roundup(int x) {
+    --x;
+    x |= x >> 1;
+    x |= x >> 2;
+    x |= x >> 4;
+    x |= x >> 8;
+    x |= x >> 16;
+    return x + 1;
+  }
+}
+
+
+class _BytesBuilder implements BytesBuilder {
+  int _length = 0;
+  final List _chunks = [];
+
+  void add(List<int> bytes) {
+    if (bytes is! Uint8List) {
+      bytes = new Uint8List.fromList(bytes);
+    }
+    _chunks.add(bytes);
+    _length += bytes.length;
+  }
+
+  void addByte(int byte) => add([byte]);
+
+  List<int> takeBytes() {
+    if (_chunks.length == 0) return new Uint8List(0);
+    if (_chunks.length == 1) {
+      var buffer = _chunks.single;
+      clear();
+      return buffer;
+    }
+    var buffer = new Uint8List(_length);
+    int offset = 0;
+    for (var chunk in _chunks) {
+      buffer.setRange(offset, offset + chunk.length, chunk);
+      offset += chunk.length;
+    }
+    clear();
+    return buffer;
+  }
+
+  List<int> toBytes() {
+    if (_chunks.length == 0) return new Uint8List(0);
+    var buffer = new Uint8List(_length);
+    int offset = 0;
+    for (var chunk in _chunks) {
+      buffer.setRange(offset, offset + chunk.length, chunk);
+      offset += chunk.length;
+    }
+    return buffer;
+  }
+
+  int get length => _length;
+
+  bool get isEmpty => _length == 0;
+
+  bool get isNotEmpty => _length != 0;
+
+  void clear() {
+    _length = 0;
+    _chunks.clear();
+  }
+}
diff --git a/mojo/public/dart/third_party/http_parser/lib/src/copy/io_sink.dart b/mojo/public/dart/third_party/http_parser/lib/src/copy/io_sink.dart
new file mode 100644
index 0000000..a23b44b
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/lib/src/copy/io_sink.dart
@@ -0,0 +1,147 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// The following code is copied from sdk/lib/io/io_sink.dart. The "dart:io"
+// implementation isn't used directly to support non-"dart:io" applications.
+//
+// Because it's copied directly, only modifications necessary to support the
+// desired public API and to remove "dart:io" dependencies have been made.
+//
+// This is up-to-date as of sdk revision
+// 86227840d75d974feb238f8b3c59c038b99c05cf.
+library http_parser.copy.io_sink;
+
+import 'dart:async';
+
+class StreamSinkImpl<T> implements StreamSink<T> {
+  final StreamConsumer<T> _target;
+  Completer _doneCompleter = new Completer();
+  Future _doneFuture;
+  StreamController<T> _controllerInstance;
+  Completer _controllerCompleter;
+  bool _isClosed = false;
+  bool _isBound = false;
+  bool _hasError = false;
+
+  StreamSinkImpl(this._target) {
+    _doneFuture = _doneCompleter.future;
+  }
+
+  void add(T data) {
+    if (_isClosed) return;
+    _controller.add(data);
+  }
+
+  void addError(error, [StackTrace stackTrace]) {
+    _controller.addError(error, stackTrace);
+  }
+
+  Future addStream(Stream<T> stream) {
+    if (_isBound) {
+      throw new StateError("StreamSink is already bound to a stream");
+    }
+    _isBound = true;
+    if (_hasError) return done;
+    // Wait for any sync operations to complete.
+    Future targetAddStream() {
+      return _target.addStream(stream)
+          .whenComplete(() {
+            _isBound = false;
+          });
+    }
+    if (_controllerInstance == null) return targetAddStream();
+    var future = _controllerCompleter.future;
+    _controllerInstance.close();
+    return future.then((_) => targetAddStream());
+  }
+
+  Future flush() {
+    if (_isBound) {
+      throw new StateError("StreamSink is bound to a stream");
+    }
+    if (_controllerInstance == null) return new Future.value(this);
+    // Adding an empty stream-controller will return a future that will complete
+    // when all data is done.
+    _isBound = true;
+    var future = _controllerCompleter.future;
+    _controllerInstance.close();
+    return future.whenComplete(() {
+          _isBound = false;
+        });
+  }
+
+  Future close() {
+    if (_isBound) {
+      throw new StateError("StreamSink is bound to a stream");
+    }
+    if (!_isClosed) {
+      _isClosed = true;
+      if (_controllerInstance != null) {
+        _controllerInstance.close();
+      } else {
+        _closeTarget();
+      }
+    }
+    return done;
+  }
+
+  void _closeTarget() {
+    _target.close().then(_completeDoneValue, onError: _completeDoneError);
+  }
+
+  Future get done => _doneFuture;
+
+  void _completeDoneValue(value) {
+    if (_doneCompleter == null) return;
+    _doneCompleter.complete(value);
+    _doneCompleter = null;
+  }
+
+  void _completeDoneError(error, StackTrace stackTrace) {
+    if (_doneCompleter == null) return;
+    _hasError = true;
+    _doneCompleter.completeError(error, stackTrace);
+    _doneCompleter = null;
+  }
+
+  StreamController<T> get _controller {
+    if (_isBound) {
+      throw new StateError("StreamSink is bound to a stream");
+    }
+    if (_isClosed) {
+      throw new StateError("StreamSink is closed");
+    }
+    if (_controllerInstance == null) {
+      _controllerInstance = new StreamController<T>(sync: true);
+      _controllerCompleter = new Completer();
+      _target.addStream(_controller.stream)
+          .then(
+              (_) {
+                if (_isBound) {
+                  // A new stream takes over - forward values to that stream.
+                  _controllerCompleter.complete(this);
+                  _controllerCompleter = null;
+                  _controllerInstance = null;
+                } else {
+                  // No new stream, .close was called. Close _target.
+                  _closeTarget();
+                }
+              },
+              onError: (error, stackTrace) {
+                if (_isBound) {
+                  // A new stream takes over - forward errors to that stream.
+                  _controllerCompleter.completeError(error, stackTrace);
+                  _controllerCompleter = null;
+                  _controllerInstance = null;
+                } else {
+                  // No new stream. No need to close target, as it have already
+                  // failed.
+                  _completeDoneError(error, stackTrace);
+                }
+              });
+    }
+    return _controllerInstance;
+  }
+}
+
diff --git a/mojo/public/dart/third_party/http_parser/lib/src/copy/web_socket.dart b/mojo/public/dart/third_party/http_parser/lib/src/copy/web_socket.dart
new file mode 100644
index 0000000..8c34bea
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/lib/src/copy/web_socket.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// The following code is copied from sdk/lib/io/websocket.dart. The "dart:io"
+// implementation isn't used directly to support non-"dart:io" applications.
+//
+// Because it's copied directly, only modifications necessary to support the
+// desired public API and to remove "dart:io" dependencies have been made.
+//
+// This is up-to-date as of sdk revision
+// 86227840d75d974feb238f8b3c59c038b99c05cf.
+library http_parser.copy.web_socket;
+
+/**
+ * Web socket status codes used when closing a web socket connection.
+ */
+abstract class WebSocketStatus {
+  static const int NORMAL_CLOSURE = 1000;
+  static const int GOING_AWAY = 1001;
+  static const int PROTOCOL_ERROR = 1002;
+  static const int UNSUPPORTED_DATA = 1003;
+  static const int RESERVED_1004  = 1004;
+  static const int NO_STATUS_RECEIVED = 1005;
+  static const int ABNORMAL_CLOSURE = 1006;
+  static const int INVALID_FRAME_PAYLOAD_DATA = 1007;
+  static const int POLICY_VIOLATION = 1008;
+  static const int MESSAGE_TOO_BIG = 1009;
+  static const int MISSING_MANDATORY_EXTENSION = 1010;
+  static const int INTERNAL_SERVER_ERROR = 1011;
+  static const int RESERVED_1015 = 1015;
+}
+
+abstract class WebSocket {
+  /**
+   * Possible states of the connection.
+   */
+  static const int CONNECTING = 0;
+  static const int OPEN = 1;
+  static const int CLOSING = 2;
+  static const int CLOSED = 3;
+}
diff --git a/mojo/public/dart/third_party/http_parser/lib/src/copy/web_socket_impl.dart b/mojo/public/dart/third_party/http_parser/lib/src/copy/web_socket_impl.dart
new file mode 100644
index 0000000..a53a289
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/lib/src/copy/web_socket_impl.dart
@@ -0,0 +1,863 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// The following code is copied from sdk/lib/io/websocket_impl.dart. The
+// "dart:io" implementation isn't used directly to support non-"dart:io"
+// applications.
+//
+// Because it's copied directly, only modifications necessary to support the
+// desired public API and to remove "dart:io" dependencies have been made.
+//
+// This is up-to-date as of sdk revision
+// 86227840d75d974feb238f8b3c59c038b99c05cf.
+library http_parser.copy.web_socket_impl;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:math';
+import 'dart:typed_data';
+
+import '../web_socket.dart';
+import 'bytes_builder.dart';
+import 'io_sink.dart';
+import 'web_socket.dart';
+
+const String webSocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
+
+final _random = new Random();
+
+// Matches _WebSocketOpcode.
+class _WebSocketMessageType {
+  static const int NONE = 0;
+  static const int TEXT = 1;
+  static const int BINARY = 2;
+}
+
+
+class _WebSocketOpcode {
+  static const int CONTINUATION = 0;
+  static const int TEXT = 1;
+  static const int BINARY = 2;
+  static const int RESERVED_3 = 3;
+  static const int RESERVED_4 = 4;
+  static const int RESERVED_5 = 5;
+  static const int RESERVED_6 = 6;
+  static const int RESERVED_7 = 7;
+  static const int CLOSE = 8;
+  static const int PING = 9;
+  static const int PONG = 10;
+  static const int RESERVED_B = 11;
+  static const int RESERVED_C = 12;
+  static const int RESERVED_D = 13;
+  static const int RESERVED_E = 14;
+  static const int RESERVED_F = 15;
+}
+
+/**
+ * The web socket protocol transformer handles the protocol byte stream
+ * which is supplied through the [:handleData:]. As the protocol is processed,
+ * it'll output frame data as either a List<int> or String.
+ *
+ * Important infomation about usage: Be sure you use cancelOnError, so the
+ * socket will be closed when the processer encounter an error. Not using it
+ * will lead to undefined behaviour.
+ */
+// TODO(ajohnsen): make this transformer reusable?
+class _WebSocketProtocolTransformer implements StreamTransformer, EventSink {
+  static const int START = 0;
+  static const int LEN_FIRST = 1;
+  static const int LEN_REST = 2;
+  static const int MASK = 3;
+  static const int PAYLOAD = 4;
+  static const int CLOSED = 5;
+  static const int FAILURE = 6;
+
+  int _state = START;
+  bool _fin = false;
+  int _opcode = -1;
+  int _len = -1;
+  bool _masked = false;
+  int _remainingLenBytes = -1;
+  int _remainingMaskingKeyBytes = 4;
+  int _remainingPayloadBytes = -1;
+  int _unmaskingIndex = 0;
+  int _currentMessageType = _WebSocketMessageType.NONE;
+  int closeCode = WebSocketStatus.NO_STATUS_RECEIVED;
+  String closeReason = "";
+
+  EventSink _eventSink;
+
+  final bool _serverSide;
+  final List _maskingBytes = new List(4);
+  final BytesBuilder _payload = new BytesBuilder(copy: false);
+
+  _WebSocketProtocolTransformer([this._serverSide = false]);
+
+  Stream bind(Stream stream) {
+    return new Stream.eventTransformed(
+        stream,
+        (EventSink eventSink) {
+          if (_eventSink != null) {
+            throw new StateError("WebSocket transformer already used.");
+          }
+          _eventSink = eventSink;
+          return this;
+        });
+  }
+
+  void addError(Object error, [StackTrace stackTrace]) =>
+      _eventSink.addError(error, stackTrace);
+
+  void close() => _eventSink.close();
+
+  /**
+   * Process data received from the underlying communication channel.
+   */
+  void add(Uint8List buffer) {
+    int count = buffer.length;
+    int index = 0;
+    int lastIndex = count;
+    if (_state == CLOSED) {
+      throw new CompatibleWebSocketException("Data on closed connection");
+    }
+    if (_state == FAILURE) {
+      throw new CompatibleWebSocketException("Data on failed connection");
+    }
+    while ((index < lastIndex) && _state != CLOSED && _state != FAILURE) {
+      int byte = buffer[index];
+      if (_state <= LEN_REST) {
+        if (_state == START) {
+          _fin = (byte & 0x80) != 0;
+          if ((byte & 0x70) != 0) {
+            // The RSV1, RSV2 bits RSV3 must be all zero.
+            throw new CompatibleWebSocketException("Protocol error");
+          }
+          _opcode = (byte & 0xF);
+          if (_opcode <= _WebSocketOpcode.BINARY) {
+            if (_opcode == _WebSocketOpcode.CONTINUATION) {
+              if (_currentMessageType == _WebSocketMessageType.NONE) {
+                throw new CompatibleWebSocketException("Protocol error");
+              }
+            } else {
+              assert(_opcode == _WebSocketOpcode.TEXT ||
+                     _opcode == _WebSocketOpcode.BINARY);
+              if (_currentMessageType != _WebSocketMessageType.NONE) {
+                throw new CompatibleWebSocketException("Protocol error");
+              }
+              _currentMessageType = _opcode;
+            }
+          } else if (_opcode >= _WebSocketOpcode.CLOSE &&
+                     _opcode <= _WebSocketOpcode.PONG) {
+            // Control frames cannot be fragmented.
+            if (!_fin) throw new CompatibleWebSocketException("Protocol error");
+          } else {
+            throw new CompatibleWebSocketException("Protocol error");
+          }
+          _state = LEN_FIRST;
+        } else if (_state == LEN_FIRST) {
+          _masked = (byte & 0x80) != 0;
+          _len = byte & 0x7F;
+          if (_isControlFrame() && _len > 125) {
+            throw new CompatibleWebSocketException("Protocol error");
+          }
+          if (_len == 126) {
+            _len = 0;
+            _remainingLenBytes = 2;
+            _state = LEN_REST;
+          } else if (_len == 127) {
+            _len = 0;
+            _remainingLenBytes = 8;
+            _state = LEN_REST;
+          } else {
+            assert(_len < 126);
+            _lengthDone();
+          }
+        } else {
+          assert(_state == LEN_REST);
+          _len = _len << 8 | byte;
+          _remainingLenBytes--;
+          if (_remainingLenBytes == 0) {
+            _lengthDone();
+          }
+        }
+      } else {
+        if (_state == MASK) {
+          _maskingBytes[4 - _remainingMaskingKeyBytes--] = byte;
+          if (_remainingMaskingKeyBytes == 0) {
+            _maskDone();
+          }
+        } else {
+          assert(_state == PAYLOAD);
+          // The payload is not handled one byte at a time but in blocks.
+          int payloadLength = min(lastIndex - index, _remainingPayloadBytes);
+          _remainingPayloadBytes -= payloadLength;
+          // Unmask payload if masked.
+          if (_masked) {
+            _unmask(index, payloadLength, buffer);
+          }
+          // Control frame and data frame share _payloads.
+          _payload.add(
+              new Uint8List.view(buffer.buffer, index, payloadLength));
+          index += payloadLength;
+          if (_isControlFrame()) {
+            if (_remainingPayloadBytes == 0) _controlFrameEnd();
+          } else {
+            if (_currentMessageType != _WebSocketMessageType.TEXT &&
+                _currentMessageType != _WebSocketMessageType.BINARY) {
+                throw new CompatibleWebSocketException("Protocol error");
+            }
+            if (_remainingPayloadBytes == 0) _messageFrameEnd();
+          }
+
+          // Hack - as we always do index++ below.
+          index--;
+        }
+      }
+
+      // Move to the next byte.
+      index++;
+    }
+  }
+
+  void _unmask(int index, int length, Uint8List buffer) {
+    const int BLOCK_SIZE = 16;
+    // Skip Int32x4-version if message is small.
+    if (length >= BLOCK_SIZE) {
+      // Start by aligning to 16 bytes.
+      final int startOffset = BLOCK_SIZE - (index & 15);
+      final int end = index + startOffset;
+      for (int i = index; i < end; i++) {
+        buffer[i] ^= _maskingBytes[_unmaskingIndex++ & 3];
+      }
+      index += startOffset;
+      length -= startOffset;
+      final int blockCount = length ~/ BLOCK_SIZE;
+      if (blockCount > 0) {
+        // Create mask block.
+        int mask = 0;
+        for (int i = 3; i >= 0; i--) {
+          mask = (mask << 8) | _maskingBytes[(_unmaskingIndex + i) & 3];
+        }
+        Int32x4 blockMask = new Int32x4(mask, mask, mask, mask);
+        Int32x4List blockBuffer = new Int32x4List.view(
+            buffer.buffer, index, blockCount);
+        for (int i = 0; i < blockBuffer.length; i++) {
+          blockBuffer[i] ^= blockMask;
+        }
+        final int bytes = blockCount * BLOCK_SIZE;
+        index += bytes;
+        length -= bytes;
+      }
+    }
+    // Handle end.
+    final int end = index + length;
+    for (int i = index; i < end; i++) {
+      buffer[i] ^= _maskingBytes[_unmaskingIndex++ & 3];
+    }
+  }
+
+  void _lengthDone() {
+    if (_masked) {
+      if (!_serverSide) {
+        throw new CompatibleWebSocketException(
+            "Received masked frame from server");
+      }
+      _state = MASK;
+    } else {
+      if (_serverSide) {
+        throw new CompatibleWebSocketException(
+            "Received unmasked frame from client");
+      }
+      _remainingPayloadBytes = _len;
+      _startPayload();
+    }
+  }
+
+  void _maskDone() {
+    _remainingPayloadBytes = _len;
+    _startPayload();
+  }
+
+  void _startPayload() {
+    // If there is no actual payload perform perform callbacks without
+    // going through the PAYLOAD state.
+    if (_remainingPayloadBytes == 0) {
+      if (_isControlFrame()) {
+        switch (_opcode) {
+          case _WebSocketOpcode.CLOSE:
+            _state = CLOSED;
+            _eventSink.close();
+            break;
+          case _WebSocketOpcode.PING:
+            _eventSink.add(new _WebSocketPing());
+            break;
+          case _WebSocketOpcode.PONG:
+            _eventSink.add(new _WebSocketPong());
+            break;
+        }
+        _prepareForNextFrame();
+      } else {
+        _messageFrameEnd();
+      }
+    } else {
+      _state = PAYLOAD;
+    }
+  }
+
+  void _messageFrameEnd() {
+    if (_fin) {
+      switch (_currentMessageType) {
+        case _WebSocketMessageType.TEXT:
+          _eventSink.add(UTF8.decode(_payload.takeBytes()));
+          break;
+        case _WebSocketMessageType.BINARY:
+          _eventSink.add(_payload.takeBytes());
+          break;
+      }
+      _currentMessageType = _WebSocketMessageType.NONE;
+    }
+    _prepareForNextFrame();
+  }
+
+  void _controlFrameEnd() {
+    switch (_opcode) {
+      case _WebSocketOpcode.CLOSE:
+        closeCode = WebSocketStatus.NO_STATUS_RECEIVED;
+        var payload = _payload.takeBytes();
+        if (payload.length > 0) {
+          if (payload.length == 1) {
+            throw new CompatibleWebSocketException("Protocol error");
+          }
+          closeCode = payload[0] << 8 | payload[1];
+          if (closeCode == WebSocketStatus.NO_STATUS_RECEIVED) {
+            throw new CompatibleWebSocketException("Protocol error");
+          }
+          if (payload.length > 2) {
+            closeReason = UTF8.decode(payload.sublist(2));
+          }
+        }
+        _state = CLOSED;
+        _eventSink.close();
+        break;
+
+      case _WebSocketOpcode.PING:
+        _eventSink.add(new _WebSocketPing(_payload.takeBytes()));
+        break;
+
+      case _WebSocketOpcode.PONG:
+        _eventSink.add(new _WebSocketPong(_payload.takeBytes()));
+        break;
+    }
+    _prepareForNextFrame();
+  }
+
+  bool _isControlFrame() {
+    return _opcode == _WebSocketOpcode.CLOSE ||
+           _opcode == _WebSocketOpcode.PING ||
+           _opcode == _WebSocketOpcode.PONG;
+  }
+
+  void _prepareForNextFrame() {
+    if (_state != CLOSED && _state != FAILURE) _state = START;
+    _fin = false;
+    _opcode = -1;
+    _len = -1;
+    _remainingLenBytes = -1;
+    _remainingMaskingKeyBytes = 4;
+    _remainingPayloadBytes = -1;
+    _unmaskingIndex = 0;
+  }
+}
+
+
+class _WebSocketPing {
+  final List<int> payload;
+  _WebSocketPing([this.payload = null]);
+}
+
+
+class _WebSocketPong {
+  final List<int> payload;
+  _WebSocketPong([this.payload = null]);
+}
+
+// TODO(ajohnsen): Make this transformer reusable.
+class _WebSocketOutgoingTransformer implements StreamTransformer, EventSink {
+  final WebSocketImpl webSocket;
+  EventSink _eventSink;
+
+  _WebSocketOutgoingTransformer(this.webSocket);
+
+  Stream bind(Stream stream) {
+    return new Stream.eventTransformed(
+        stream,
+        (EventSink eventSink) {
+          if (_eventSink != null) {
+            throw new StateError("WebSocket transformer already used");
+          }
+          _eventSink = eventSink;
+          return this;
+        });
+  }
+
+  void add(message) {
+    if (message is _WebSocketPong) {
+      addFrame(_WebSocketOpcode.PONG, message.payload);
+      return;
+    }
+    if (message is _WebSocketPing) {
+      addFrame(_WebSocketOpcode.PING, message.payload);
+      return;
+    }
+    List<int> data;
+    int opcode;
+    if (message != null) {
+      if (message is String) {
+        opcode = _WebSocketOpcode.TEXT;
+        data = UTF8.encode(message);
+      } else {
+        if (message is !List<int>) {
+          throw new ArgumentError(message);
+        }
+        opcode = _WebSocketOpcode.BINARY;
+        data = message;
+      }
+    } else {
+      opcode = _WebSocketOpcode.TEXT;
+    }
+    addFrame(opcode, data);
+  }
+
+  void addError(Object error, [StackTrace stackTrace]) =>
+      _eventSink.addError(error, stackTrace);
+
+  void close() {
+    int code = webSocket._outCloseCode;
+    String reason = webSocket._outCloseReason;
+    List<int> data;
+    if (code != null) {
+      data = new List<int>();
+      data.add((code >> 8) & 0xFF);
+      data.add(code & 0xFF);
+      if (reason != null) {
+        data.addAll(UTF8.encode(reason));
+      }
+    }
+    addFrame(_WebSocketOpcode.CLOSE, data);
+    _eventSink.close();
+  }
+
+  void addFrame(int opcode, List<int> data) =>
+      createFrame(opcode, data, webSocket._serverSide).forEach(_eventSink.add);
+
+  static Iterable createFrame(int opcode, List<int> data, bool serverSide) {
+    bool mask = !serverSide;  // Masking not implemented for server.
+    int dataLength = data == null ? 0 : data.length;
+    // Determine the header size.
+    int headerSize = (mask) ? 6 : 2;
+    if (dataLength > 65535) {
+      headerSize += 8;
+    } else if (dataLength > 125) {
+      headerSize += 2;
+    }
+    Uint8List header = new Uint8List(headerSize);
+    int index = 0;
+    // Set FIN and opcode.
+    header[index++] = 0x80 | opcode;
+    // Determine size and position of length field.
+    int lengthBytes = 1;
+    if (dataLength > 65535) {
+      header[index++] = 127;
+      lengthBytes = 8;
+    } else if (dataLength > 125) {
+      header[index++] = 126;
+      lengthBytes = 2;
+    }
+    // Write the length in network byte order into the header.
+    for (int i = 0; i < lengthBytes; i++) {
+      header[index++] = dataLength >> (((lengthBytes - 1) - i) * 8) & 0xFF;
+    }
+    if (mask) {
+      header[1] |= 1 << 7;
+      var maskBytes = [_random.nextInt(256), _random.nextInt(256),
+          _random.nextInt(256), _random.nextInt(256)];
+      header.setRange(index, index + 4, maskBytes);
+      index += 4;
+      if (data != null) {
+        Uint8List list;
+        // If this is a text message just do the masking inside the
+        // encoded data.
+        if (opcode == _WebSocketOpcode.TEXT && data is Uint8List) {
+          list = data;
+        } else {
+          if (data is Uint8List) {
+            list = new Uint8List.fromList(data);
+          } else {
+            list = new Uint8List(data.length);
+            for (int i = 0; i < data.length; i++) {
+              if (data[i] < 0 || 255 < data[i]) {
+                throw new ArgumentError(
+                    "List element is not a byte value "
+                    "(value ${data[i]} at index $i)");
+              }
+              list[i] = data[i];
+            }
+          }
+        }
+        const int BLOCK_SIZE = 16;
+        int blockCount = list.length ~/ BLOCK_SIZE;
+        if (blockCount > 0) {
+          // Create mask block.
+          int mask = 0;
+          for (int i = 3; i >= 0; i--) {
+            mask = (mask << 8) | maskBytes[i];
+          }
+          Int32x4 blockMask = new Int32x4(mask, mask, mask, mask);
+          Int32x4List blockBuffer = new Int32x4List.view(
+              list.buffer, 0, blockCount);
+          for (int i = 0; i < blockBuffer.length; i++) {
+            blockBuffer[i] ^= blockMask;
+          }
+        }
+        // Handle end.
+        for (int i = blockCount * BLOCK_SIZE; i < list.length; i++) {
+          list[i] ^= maskBytes[i & 3];
+        }
+        data = list;
+      }
+    }
+    assert(index == headerSize);
+    if (data == null) {
+      return [header];
+    } else {
+      return [header, data];
+    }
+  }
+}
+
+
+class _WebSocketConsumer implements StreamConsumer {
+  final WebSocketImpl webSocket;
+  final StreamSink<List<int>> sink;
+  StreamController _controller;
+  StreamSubscription _subscription;
+  bool _issuedPause = false;
+  bool _closed = false;
+  Completer _closeCompleter = new Completer();
+  Completer _completer;
+
+  _WebSocketConsumer(this.webSocket, this.sink);
+
+  void _onListen() {
+    if (_subscription != null) {
+      _subscription.cancel();
+    }
+  }
+
+  void _onPause() {
+    if (_subscription != null) {
+      _subscription.pause();
+    } else {
+      _issuedPause = true;
+    }
+  }
+
+  void _onResume() {
+    if (_subscription != null) {
+      _subscription.resume();
+    } else {
+      _issuedPause = false;
+    }
+  }
+
+  void _cancel() {
+    if (_subscription != null) {
+      var subscription = _subscription;
+      _subscription = null;
+      subscription.cancel();
+    }
+  }
+
+  _ensureController() {
+    if (_controller != null) return;
+    _controller = new StreamController(sync: true,
+                                       onPause: _onPause,
+                                       onResume: _onResume,
+                                       onCancel: _onListen);
+    var stream = _controller.stream.transform(
+        new _WebSocketOutgoingTransformer(webSocket));
+    sink.addStream(stream)
+        .then((_) {
+          _done();
+          _closeCompleter.complete(webSocket);
+        }, onError: (error, StackTrace stackTrace) {
+          _closed = true;
+          _cancel();
+          if (error is ArgumentError) {
+            if (!_done(error, stackTrace)) {
+              _closeCompleter.completeError(error, stackTrace);
+            }
+          } else {
+            _done();
+            _closeCompleter.complete(webSocket);
+          }
+        });
+  }
+
+  bool _done([error, StackTrace stackTrace]) {
+    if (_completer == null) return false;
+    if (error != null) {
+      _completer.completeError(error, stackTrace);
+    } else {
+      _completer.complete(webSocket);
+    }
+    _completer = null;
+    return true;
+  }
+
+  Future addStream(var stream) {
+    if (_closed) {
+      stream.listen(null).cancel();
+      return new Future.value(webSocket);
+    }
+    _ensureController();
+    _completer = new Completer();
+    _subscription = stream.listen(
+        (data) {
+          _controller.add(data);
+        },
+        onDone: _done,
+        onError: _done,
+        cancelOnError: true);
+    if (_issuedPause) {
+      _subscription.pause();
+      _issuedPause = false;
+    }
+    return _completer.future;
+  }
+
+  Future close() {
+    _ensureController();
+    Future closeSocket() {
+      return sink.close().catchError((_) {}).then((_) => webSocket);
+    }
+    _controller.close();
+    return _closeCompleter.future.then((_) => closeSocket());
+  }
+
+  void add(data) {
+    if (_closed) return;
+    _ensureController();
+    _controller.add(data);
+  }
+
+  void closeSocket() {
+    _closed = true;
+    _cancel();
+    close();
+  }
+}
+
+
+class WebSocketImpl extends Stream with _ServiceObject
+    implements CompatibleWebSocket {
+  // Use default Map so we keep order.
+  static Map<int, WebSocketImpl> _webSockets = new Map<int, WebSocketImpl>();
+
+  final String protocol;
+
+  StreamController _controller;
+  StreamSubscription _subscription;
+  StreamSink _sink;
+
+  final bool _serverSide;
+  int _readyState = WebSocket.CONNECTING;
+  bool _writeClosed = false;
+  int _closeCode;
+  String _closeReason;
+  Duration _pingInterval;
+  Timer _pingTimer;
+  _WebSocketConsumer _consumer;
+
+  int _outCloseCode;
+  String _outCloseReason;
+  Timer _closeTimer;
+
+  WebSocketImpl.fromSocket(Stream<List<int>> stream,
+      StreamSink<List<int>> sink, this.protocol, [this._serverSide = false]) {
+    _consumer = new _WebSocketConsumer(this, sink);
+    _sink = new StreamSinkImpl(_consumer);
+    _readyState = WebSocket.OPEN;
+
+    var transformer = new _WebSocketProtocolTransformer(_serverSide);
+    _subscription = stream.transform(transformer).listen(
+        (data) {
+          if (data is _WebSocketPing) {
+            if (!_writeClosed) _consumer.add(new _WebSocketPong(data.payload));
+          } else if (data is _WebSocketPong) {
+            // Simply set pingInterval, as it'll cancel any timers.
+            pingInterval = _pingInterval;
+          } else {
+            _controller.add(data);
+          }
+        },
+        onError: (error) {
+          if (_closeTimer != null) _closeTimer.cancel();
+          if (error is FormatException) {
+            _close(WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA);
+          } else {
+            _close(WebSocketStatus.PROTOCOL_ERROR);
+          }
+          // An error happened, set the close code set above.
+          _closeCode = _outCloseCode;
+          _closeReason = _outCloseReason;
+          _controller.close();
+        },
+        onDone: () {
+          if (_closeTimer != null) _closeTimer.cancel();
+          if (_readyState == WebSocket.OPEN) {
+            _readyState = WebSocket.CLOSING;
+            if (!_isReservedStatusCode(transformer.closeCode)) {
+              _close(transformer.closeCode);
+            } else {
+              _close();
+            }
+            _readyState = WebSocket.CLOSED;
+          }
+          // Protocol close, use close code from transformer.
+          _closeCode = transformer.closeCode;
+          _closeReason = transformer.closeReason;
+          _controller.close();
+        },
+        cancelOnError: true);
+    _subscription.pause();
+    _controller = new StreamController(sync: true,
+                                       onListen: () => _subscription.resume(),
+                                       onCancel: () {
+                                         _subscription.cancel();
+                                         _subscription = null;
+                                       },
+                                       onPause: _subscription.pause,
+                                       onResume: _subscription.resume);
+
+    _webSockets[_serviceId] = this;
+  }
+
+  StreamSubscription listen(void onData(message),
+                            {Function onError,
+                             void onDone(),
+                             bool cancelOnError}) {
+    return _controller.stream.listen(onData,
+                                     onError: onError,
+                                     onDone: onDone,
+                                     cancelOnError: cancelOnError);
+  }
+
+  Duration get pingInterval => _pingInterval;
+
+  void set pingInterval(Duration interval) {
+    if (_writeClosed) return;
+    if (_pingTimer != null) _pingTimer.cancel();
+    _pingInterval = interval;
+
+    if (_pingInterval == null) return;
+
+    _pingTimer = new Timer(_pingInterval, () {
+      if (_writeClosed) return;
+      _consumer.add(new _WebSocketPing());
+      _pingTimer = new Timer(_pingInterval, () {
+        // No pong received.
+        _close(WebSocketStatus.GOING_AWAY);
+      });
+    });
+  }
+
+  int get readyState => _readyState;
+
+  String get extensions => null;
+  int get closeCode => _closeCode;
+  String get closeReason => _closeReason;
+
+  void add(data) => _sink.add(data);
+  void addError(error, [StackTrace stackTrace]) =>
+      _sink.addError(error, stackTrace);
+  Future addStream(Stream stream) => _sink.addStream(stream);
+  Future get done => _sink.done;
+
+  Future close([int code, String reason]) {
+    if (_isReservedStatusCode(code)) {
+      throw new CompatibleWebSocketException("Reserved status code $code");
+    }
+    if (_outCloseCode == null) {
+      _outCloseCode = code;
+      _outCloseReason = reason;
+    }
+    if (!_controller.isClosed) {
+      // If a close has not yet been received from the other end then
+      //   1) make sure to listen on the stream so the close frame will be
+      //      processed if received.
+      //   2) set a timer terminate the connection if a close frame is
+      //      not received.
+      if (!_controller.hasListener && _subscription != null) {
+        _controller.stream.drain().catchError((_) => {});
+      }
+      if (_closeTimer == null) {
+        // When closing the web-socket, we no longer accept data.
+        _closeTimer = new Timer(const Duration(seconds: 5), () {
+          // Reuse code and reason from the local close.
+          _closeCode = _outCloseCode;
+          _closeReason = _outCloseReason;
+          if (_subscription != null) _subscription.cancel();
+          _controller.close();
+          _webSockets.remove(_serviceId);
+        });
+      }
+    }
+    return _sink.close();
+  }
+
+  void _close([int code, String reason]) {
+    if (_writeClosed) return;
+    if (_outCloseCode == null) {
+      _outCloseCode = code;
+      _outCloseReason = reason;
+    }
+    _writeClosed = true;
+    _consumer.closeSocket();
+    _webSockets.remove(_serviceId);
+  }
+
+  // The _toJSON, _serviceTypePath, and _serviceTypeName methods
+  // have been deleted for http_parser. The methods were unused in WebSocket
+  // code and produced warnings.
+
+  static bool _isReservedStatusCode(int code) {
+    return code != null &&
+           (code < WebSocketStatus.NORMAL_CLOSURE ||
+            code == WebSocketStatus.RESERVED_1004 ||
+            code == WebSocketStatus.NO_STATUS_RECEIVED ||
+            code == WebSocketStatus.ABNORMAL_CLOSURE ||
+            (code > WebSocketStatus.INTERNAL_SERVER_ERROR &&
+             code < WebSocketStatus.RESERVED_1015) ||
+            (code >= WebSocketStatus.RESERVED_1015 &&
+             code < 3000));
+  }
+}
+
+// The following code is from sdk/lib/io/service_object.dart.
+
+int _nextServiceId = 1;
+
+// TODO(ajohnsen): Use other way of getting a uniq id.
+abstract class _ServiceObject {
+  int __serviceId = 0;
+  int get _serviceId {
+    if (__serviceId == 0) __serviceId = _nextServiceId++;
+    return __serviceId;
+  }
+
+  // The _toJSON, _servicePath, _serviceTypePath, _serviceTypeName, and
+  // _serviceType methods have been deleted for http_parser. The methods were
+  // unused in WebSocket code and produced warnings.
+}
diff --git a/mojo/public/dart/third_party/http_parser/lib/src/http_date.dart b/mojo/public/dart/third_party/http_parser/lib/src/http_date.dart
new file mode 100644
index 0000000..9590536
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/lib/src/http_date.dart
@@ -0,0 +1,150 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http_parser.http_date;
+
+import 'package:string_scanner/string_scanner.dart';
+
+import 'utils.dart';
+
+const _WEEKDAYS = const ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
+const _MONTHS = const ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",
+    "Sep", "Oct", "Nov", "Dec"];
+
+final _shortWeekdayRegExp = new RegExp(r"Mon|Tue|Wed|Thu|Fri|Sat|Sun");
+final _longWeekdayRegExp =
+    new RegExp(r"Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday");
+final _monthRegExp =
+    new RegExp(r"Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec");
+final _digitRegExp = new RegExp(r"\d+");
+
+/// Return a HTTP-formatted string representation of [date].
+///
+/// This follows [RFC 822](http://tools.ietf.org/html/rfc822) as updated by [RFC
+/// 1123](http://tools.ietf.org/html/rfc1123).
+String formatHttpDate(DateTime date) {
+  date = date.toUtc();
+  var buffer = new StringBuffer()
+    ..write(_WEEKDAYS[date.weekday - 1])
+    ..write(", ")
+    ..write(date.day <= 9 ? "0" : "")
+    ..write(date.day.toString())
+    ..write(" ")
+    ..write(_MONTHS[date.month - 1])
+    ..write(" ")
+    ..write(date.year.toString())
+    ..write(date.hour <= 9 ? " 0" : " ")
+    ..write(date.hour.toString())
+    ..write(date.minute <= 9 ? ":0" : ":")
+    ..write(date.minute.toString())
+    ..write(date.second <= 9 ? ":0" : ":")
+    ..write(date.second.toString())
+    ..write(" GMT");
+  return buffer.toString();
+}
+
+/// Parses an HTTP-formatted date into a UTC [DateTime].
+///
+/// This follows [RFC
+/// 2616](http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3). It will
+/// throw a [FormatException] if [date] is invalid.
+DateTime parseHttpDate(String date) {
+  return wrapFormatException("HTTP date", date, () {
+    var scanner = new StringScanner(date);
+
+    if (scanner.scan(_longWeekdayRegExp)) {
+      // RFC 850 starts with a long weekday.
+      scanner.expect(", ");
+      var day = _parseInt(scanner, 2);
+      scanner.expect("-");
+      var month = _parseMonth(scanner);
+      scanner.expect("-");
+      var year = 1900 + _parseInt(scanner, 2);
+      scanner.expect(" ");
+      var time = _parseTime(scanner);
+      scanner.expect(" GMT");
+      scanner.expectDone();
+
+      return _makeDateTime(year, month, day, time);
+    }
+
+    // RFC 1123 and asctime both start with a short weekday.
+    scanner.expect(_shortWeekdayRegExp);
+    if (scanner.scan(", ")) {
+      // RFC 1123 follows the weekday with a comma.
+      var day = _parseInt(scanner, 2);
+      scanner.expect(" ");
+      var month = _parseMonth(scanner);
+      scanner.expect(" ");
+      var year = _parseInt(scanner, 4);
+      scanner.expect(" ");
+      var time = _parseTime(scanner);
+      scanner.expect(" GMT");
+      scanner.expectDone();
+
+      return _makeDateTime(year, month, day, time);
+    }
+
+    // asctime follows the weekday with a space.
+    scanner.expect(" ");
+    var month = _parseMonth(scanner);
+    scanner.expect(" ");
+    var day = scanner.scan(" ") ? _parseInt(scanner, 1) : _parseInt(scanner, 2);
+    scanner.expect(" ");
+    var time = _parseTime(scanner);
+    scanner.expect(" ");
+    var year = _parseInt(scanner, 4);
+    scanner.expectDone();
+
+    return _makeDateTime(year, month, day, time);
+  });
+}
+
+/// Parses a short-form month name to a form accepted by [DateTime].
+int _parseMonth(StringScanner scanner) {
+  scanner.expect(_monthRegExp);
+  // DateTime uses 1-indexed months.
+  return _MONTHS.indexOf(scanner.lastMatch[0]) + 1;
+}
+
+/// Parses an int an enforces that it has exactly [digits] digits.
+int _parseInt(StringScanner scanner, int digits) {
+  scanner.expect(_digitRegExp);
+  if (scanner.lastMatch[0].length != digits) {
+    scanner.error("expected a $digits-digit number.");
+  }
+
+  return int.parse(scanner.lastMatch[0]);
+}
+
+/// Parses an timestamp of the form "HH:MM:SS" on a 24-hour clock.
+DateTime _parseTime(StringScanner scanner) {
+  var hours = _parseInt(scanner, 2);
+  if (hours >= 24) scanner.error("hours may not be greater than 24.");
+  scanner.expect(':');
+
+  var minutes = _parseInt(scanner, 2);
+  if (minutes >= 60) scanner.error("minutes may not be greater than 60.");
+  scanner.expect(':');
+
+  var seconds = _parseInt(scanner, 2);
+  if (seconds >= 60) scanner.error("seconds may not be greater than 60.");
+
+  return new DateTime(1, 1, 1, hours, minutes, seconds);
+}
+
+/// Returns a UTC [DateTime] from the given components.
+///
+/// Validates that [day] is a valid day for [month]. If it's not, throws a
+/// [FormatException].
+DateTime _makeDateTime(int year, int month, int day, DateTime time) {
+  var dateTime =
+      new DateTime.utc(year, month, day, time.hour, time.minute, time.second);
+
+  // If [day] was too large, it will cause [month] to overflow.
+  if (dateTime.month != month) {
+    throw new FormatException("invalid day '$day' for month '$month'.");
+  }
+  return dateTime;
+}
diff --git a/mojo/public/dart/third_party/http_parser/lib/src/media_type.dart b/mojo/public/dart/third_party/http_parser/lib/src/media_type.dart
new file mode 100644
index 0000000..5bae0ec
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/lib/src/media_type.dart
@@ -0,0 +1,145 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http_parser.media_type;
+
+import 'package:collection/collection.dart';
+import 'package:string_scanner/string_scanner.dart';
+
+import 'scan.dart';
+import 'utils.dart';
+
+/// A regular expression matching a character that needs to be backslash-escaped
+/// in a quoted string.
+final _escapedChar = new RegExp(r'["\x00-\x1F\x7F]');
+
+/// A class representing an HTTP media type, as used in Accept and Content-Type
+/// headers.
+///
+/// This is immutable; new instances can be created based on an old instance by
+/// calling [change].
+class MediaType {
+  /// The primary identifier of the MIME type.
+  final String type;
+
+  /// The secondary identifier of the MIME type.
+  final String subtype;
+
+  /// The parameters to the media type.
+  ///
+  /// This map is immutable.
+  final Map<String, String> parameters;
+
+  /// The media type's MIME type.
+  String get mimeType => "$type/$subtype";
+
+  /// Parses a media type.
+  ///
+  /// This will throw a FormatError if the media type is invalid.
+  factory MediaType.parse(String mediaType) {
+    // This parsing is based on sections 3.6 and 3.7 of the HTTP spec:
+    // http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html.
+    return wrapFormatException("media type", mediaType, () {
+      var scanner = new StringScanner(mediaType);
+      scanner.scan(whitespace);
+      scanner.expect(token);
+      var type = scanner.lastMatch[0];
+      scanner.expect('/');
+      scanner.expect(token);
+      var subtype = scanner.lastMatch[0];
+      scanner.scan(whitespace);
+
+      var parameters = {};
+      while (scanner.scan(';')) {
+        scanner.scan(whitespace);
+        scanner.expect(token);
+        var attribute = scanner.lastMatch[0];
+        scanner.expect('=');
+
+        var value;
+        if (scanner.scan(token)) {
+          value = scanner.lastMatch[0];
+        } else {
+          value = expectQuotedString(scanner);
+        }
+
+        scanner.scan(whitespace);
+        parameters[attribute] = value;
+      }
+
+      scanner.expectDone();
+      return new MediaType(type, subtype, parameters);
+    });
+  }
+
+  MediaType(this.type, this.subtype, [Map<String, String> parameters])
+      : this.parameters = new UnmodifiableMapView(
+          parameters == null ? {} : new Map.from(parameters));
+
+  /// Returns a copy of this [MediaType] with some fields altered.
+  ///
+  /// [type] and [subtype] alter the corresponding fields. [mimeType] is parsed
+  /// and alters both the [type] and [subtype] fields; it cannot be passed along
+  /// with [type] or [subtype].
+  ///
+  /// [parameters] overwrites and adds to the corresponding field. If
+  /// [clearParameters] is passed, it replaces the corresponding field entirely
+  /// instead.
+  MediaType change({String type, String subtype, String mimeType,
+      Map<String, String> parameters, bool clearParameters: false}) {
+    if (mimeType != null) {
+      if (type != null) {
+        throw new ArgumentError("You may not pass both [type] and [mimeType].");
+      } else if (subtype != null) {
+        throw new ArgumentError("You may not pass both [subtype] and "
+            "[mimeType].");
+      }
+
+      var segments = mimeType.split('/');
+      if (segments.length != 2) {
+        throw new FormatException('Invalid mime type "$mimeType".');
+      }
+
+      type = segments[0];
+      subtype = segments[1];
+    }
+
+    if (type == null) type = this.type;
+    if (subtype == null) subtype = this.subtype;
+    if (parameters == null) parameters = {};
+
+    if (!clearParameters) {
+      var newParameters = parameters;
+      parameters = new Map.from(this.parameters);
+      parameters.addAll(newParameters);
+    }
+
+    return new MediaType(type, subtype, parameters);
+  }
+
+  /// Converts the media type to a string.
+  ///
+  /// This will produce a valid HTTP media type.
+  String toString() {
+    var buffer = new StringBuffer()
+      ..write(type)
+      ..write("/")
+      ..write(subtype);
+
+    parameters.forEach((attribute, value) {
+      buffer.write("; $attribute=");
+      if (nonToken.hasMatch(value)) {
+        buffer
+          ..write('"')
+          ..write(
+              value.replaceAllMapped(_escapedChar, (match) => "\\" + match[0]))
+          ..write('"');
+      } else {
+        buffer.write(value);
+      }
+    });
+
+    return buffer.toString();
+  }
+}
diff --git a/mojo/public/dart/third_party/http_parser/lib/src/scan.dart b/mojo/public/dart/third_party/http_parser/lib/src/scan.dart
new file mode 100644
index 0000000..d675b8b
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/lib/src/scan.dart
@@ -0,0 +1,77 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A library for broadly-useful functions and regular expressions for scanning
+/// HTTP entities.
+///
+/// Many of the regular expressions come from [section 2.2 of the HTTP
+/// spec][spec].
+///
+/// [spec]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html
+library http_parser.scan;
+
+import 'package:string_scanner/string_scanner.dart';
+
+/// An HTTP token.
+final token = new RegExp(r'[^()<>@,;:"\\/[\]?={} \t\x00-\x1F\x7F]+');
+
+/// Linear whitespace.
+final _lws = new RegExp(r"(?:\r\n)?[ \t]+");
+
+/// A quoted string.
+final _quotedString = new RegExp(r'"(?:[^"\x00-\x1F\x7F]|\\.)*"');
+
+/// A quoted pair.
+final _quotedPair = new RegExp(r'\\(.)');
+
+/// A character that is *not* a valid HTTP token.
+final nonToken = new RegExp(r'[()<>@,;:"\\/\[\]?={} \t\x00-\x1F\x7F]');
+
+/// A regular expression matching any number of [_lws] productions in a row.
+final whitespace = new RegExp("(?:${_lws.pattern})*");
+
+/// Parses a list of elements, as in `1#element` in the HTTP spec.
+///
+/// [scanner] is used to parse the elements, and [parseElement] is used to parse
+/// each one individually. The values returned by [parseElement] are collected
+/// in a list and returned.
+///
+/// Once this is finished, [scanner] will be at the next non-LWS character in
+/// the string, or the end of the string.
+List parseList(StringScanner scanner, parseElement()) {
+  var result = [];
+
+  // Consume initial empty values.
+  while (scanner.scan(",")) {
+    scanner.scan(whitespace);
+  }
+
+  result.add(parseElement());
+  scanner.scan(whitespace);
+
+  while (scanner.scan(",")) {
+    scanner.scan(whitespace);
+
+    // Empty elements are allowed, but excluded from the results.
+    if (scanner.matches(",") || scanner.isDone) continue;
+
+    result.add(parseElement());
+    scanner.scan(whitespace);
+  }
+
+  return result;
+}
+
+/// Parses a single quoted string, and returns its contents.
+///
+/// If [name] is passed, it's used to describe the expected value if it's not
+/// found.
+String expectQuotedString(StringScanner scanner, {String name}) {
+  if (name == null) name = "quoted string";
+  scanner.expect(_quotedString, name: name);
+  var string = scanner.lastMatch[0];
+  return string
+      .substring(1, string.length - 1)
+      .replaceAllMapped(_quotedPair, (match) => match[1]);
+}
diff --git a/mojo/public/dart/third_party/http_parser/lib/src/utils.dart b/mojo/public/dart/third_party/http_parser/lib/src/utils.dart
new file mode 100644
index 0000000..4dcee19
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/lib/src/utils.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:source_span/source_span.dart';
+
+/// Runs [body] and wraps any format exceptions it produces.
+///
+/// [name] should describe the type of thing being parsed, and [value] should be
+/// its actual value.
+wrapFormatException(String name, String value, body()) {
+  try {
+    return body();
+  } on SourceSpanFormatException catch (error) {
+    throw new SourceSpanFormatException(
+        'Invalid $name: ${error.message}', error.span, error.source);
+  } on FormatException catch (error) {
+    throw new FormatException(
+        'Invalid $name "$value": ${error.message}',
+        error.source,
+        error.offset);
+  }
+}
diff --git a/mojo/public/dart/third_party/http_parser/lib/src/web_socket.dart b/mojo/public/dart/third_party/http_parser/lib/src/web_socket.dart
new file mode 100644
index 0000000..e52c5f5
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/lib/src/web_socket.dart
@@ -0,0 +1,114 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http_parser.web_socket;
+
+import 'dart:async';
+
+import 'package:crypto/crypto.dart';
+
+import 'copy/web_socket_impl.dart';
+
+/// An implementation of the WebSocket protocol that's not specific to "dart:io"
+/// or to any particular HTTP API.
+///
+/// Because this is HTTP-API-agnostic, it doesn't handle the initial [WebSocket
+/// handshake][]. This needs to be handled manually by the user of the code.
+/// Once that's been done, [new CompatibleWebSocket] can be called with the
+/// underlying socket and it will handle the remainder of the protocol.
+///
+/// [WebSocket handshake]: https://tools.ietf.org/html/rfc6455#section-4
+abstract class CompatibleWebSocket implements Stream, StreamSink {
+  /// The interval for sending ping signals.
+  ///
+  /// If a ping message is not answered by a pong message from the peer, the
+  /// `WebSocket` is assumed disconnected and the connection is closed with a
+  /// [WebSocketStatus.GOING_AWAY] close code. When a ping signal is sent, the
+  /// pong message must be received within [pingInterval].
+  ///
+  /// There are never two outstanding pings at any given time, and the next ping
+  /// timer starts when the pong is received.
+  ///
+  /// By default, the [pingInterval] is `null`, indicating that ping messages
+  /// are disabled.
+  Duration pingInterval;
+
+  /// The [close code][] set when the WebSocket connection is closed.
+  ///
+  /// [close code]: https://tools.ietf.org/html/rfc6455#section-7.1.5
+  ///
+  /// Before the connection has been closed, this will be `null`.
+  int get closeCode;
+
+  /// The [close reason][] set when the WebSocket connection is closed.
+  ///
+  /// [close reason]: https://tools.ietf.org/html/rfc6455#section-7.1.6
+  ///
+  /// Before the connection has been closed, this will be `null`.
+  String get closeReason;
+
+  /// Signs a `Sec-WebSocket-Key` header sent by a WebSocket client as part of
+  /// the [initial handshake].
+  ///
+  /// The return value should be sent back to the client in a
+  /// `Sec-WebSocket-Accept` header.
+  ///
+  /// [initial handshake]: https://tools.ietf.org/html/rfc6455#section-4.2.2
+  static String signKey(String key) {
+    var hash = new SHA1();
+    // We use [codeUnits] here rather than UTF-8-decoding the string because
+    // [key] is expected to be base64 encoded, and so will be pure ASCII.
+    hash.add((key + webSocketGUID).codeUnits);
+    return CryptoUtils.bytesToBase64(hash.close());
+  }
+
+  /// Creates a new WebSocket handling messaging across an existing socket.
+  ///
+  /// Because this is HTTP-API-agnostic, the initial [WebSocket handshake][]
+  /// must have already been completed on the socket before this is called.
+  ///
+  /// If [stream] is also a [StreamSink] (for example, if it's a "dart:io"
+  /// `Socket`), it will be used for both sending and receiving data. Otherwise,
+  /// it will be used for receiving data and [sink] will be used for sending it.
+  ///
+  /// [protocol] should be the protocol negotiated by this handshake, if any.
+  ///
+  /// If this is a WebSocket server, [serverSide] should be `true` (the
+  /// default); if it's a client, [serverSide] should be `false`.
+  ///
+  /// [WebSocket handshake]: https://tools.ietf.org/html/rfc6455#section-4
+  factory CompatibleWebSocket(Stream<List<int>> stream,
+        {StreamSink<List<int>> sink, String protocol, bool serverSide: true}) {
+    if (sink == null) {
+      if (stream is! StreamSink) {
+        throw new ArgumentError("If stream isn't also a StreamSink, sink must "
+            "be passed explicitly.");
+      }
+      sink = stream as StreamSink;
+    }
+
+    return new WebSocketImpl.fromSocket(stream, sink, protocol, serverSide);
+  }
+
+  /// Closes the web socket connection.
+  ///
+  /// [closeCode] and [closeReason] are the [close code][] and [reason][] sent
+  /// to the remote peer, respectively. If they are omitted, the peer will see
+  /// a "no status received" code with no reason.
+  ///
+  /// [close code]: https://tools.ietf.org/html/rfc6455#section-7.1.5
+  /// [reason]: https://tools.ietf.org/html/rfc6455#section-7.1.6
+  Future close([int closeCode, String closeReason]);
+}
+
+/// An exception thrown by [CompatibleWebSocket].
+class CompatibleWebSocketException implements Exception {
+  final String message;
+
+  CompatibleWebSocketException([this.message]);
+
+  String toString() => message == null
+      ? "CompatibleWebSocketException" :
+        "CompatibleWebSocketException: $message";
+}
diff --git a/mojo/public/dart/third_party/http_parser/pubspec.yaml b/mojo/public/dart/third_party/http_parser/pubspec.yaml
new file mode 100644
index 0000000..06c3529
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/pubspec.yaml
@@ -0,0 +1,15 @@
+name: http_parser
+version: 1.0.0
+author: "Dart Team <misc@dartlang.org>"
+homepage: https://github.com/dart-lang/http_parser
+description: >
+  A platform-independent package for parsing and serializing HTTP formats.
+dependencies:
+  crypto: "^0.9.0"
+  collection: ">=0.9.1 <2.0.0"
+  source_span: "^1.0.0"
+  string_scanner: ">=0.0.0 <0.2.0"
+dev_dependencies:
+  test: "^0.12.0"
+environment:
+  sdk: ">=1.8.0 <2.0.0"
diff --git a/mojo/public/dart/third_party/http_parser/test/authentication_challenge_test.dart b/mojo/public/dart/third_party/http_parser/test/authentication_challenge_test.dart
new file mode 100644
index 0000000..4be4444
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/test/authentication_challenge_test.dart
@@ -0,0 +1,171 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:http_parser/http_parser.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group("parse", () {
+    _singleChallengeTests(
+        (challenge) => new AuthenticationChallenge.parse(challenge));
+  });
+
+  group("parseHeader", () {
+    group("with a single challenge", () {
+      _singleChallengeTests((challenge) {
+        var challenges = AuthenticationChallenge.parseHeader(challenge);
+        expect(challenges, hasLength(1));
+        return challenges.single;
+      });
+    });
+
+    test("parses multiple challenges", () {
+      var challenges = AuthenticationChallenge.parseHeader(
+          "scheme1 realm=fblthp, scheme2 realm=asdfg");
+      expect(challenges, hasLength(2));
+      expect(challenges.first.scheme, equals("scheme1"));
+      expect(challenges.first.parameters, equals({"realm": "fblthp"}));
+      expect(challenges.last.scheme, equals("scheme2"));
+      expect(challenges.last.parameters, equals({"realm": "asdfg"}));
+    });
+
+    test("parses multiple challenges with multiple parameters", () {
+      var challenges = AuthenticationChallenge.parseHeader(
+          "scheme1 realm=fblthp, foo=bar, scheme2 realm=asdfg, baz=bang");
+      expect(challenges, hasLength(2));
+
+      expect(challenges.first.scheme, equals("scheme1"));
+      expect(challenges.first.parameters, equals({
+        "realm": "fblthp",
+        "foo": "bar"
+      }));
+
+      expect(challenges.last.scheme, equals("scheme2"));
+      expect(challenges.last.parameters, equals({
+        "realm": "asdfg",
+        "baz": "bang"
+      }));
+    });
+  });
+}
+
+/// Tests to run for parsing a single challenge.
+///
+/// These are run on both [AuthenticationChallenge.parse] and
+/// [AuthenticationChallenge.parseHeader], since they use almost entirely
+/// separate code paths.
+void _singleChallengeTests(
+    AuthenticationChallenge parseChallenge(String challenge)) {
+  test("parses a simple challenge", () {
+    var challenge = parseChallenge("scheme realm=fblthp");
+    expect(challenge.scheme, equals("scheme"));
+    expect(challenge.parameters, equals({"realm": "fblthp"}));
+  });
+
+  test("parses multiple parameters", () {
+    var challenge = parseChallenge("scheme realm=fblthp, foo=bar, baz=qux");
+    expect(challenge.scheme, equals("scheme"));
+    expect(challenge.parameters, equals({
+      "realm": "fblthp",
+      "foo": "bar",
+      "baz": "qux"
+    }));
+  });
+
+  test("parses quoted string parameters", () {
+    var challenge = parseChallenge('scheme realm="fblthp, foo=bar", baz="qux"');
+    expect(challenge.scheme, equals("scheme"));
+    expect(challenge.parameters, equals({
+      "realm": "fblthp, foo=bar",
+      "baz": "qux"
+    }));
+  });
+
+  test("normalizes the case of the scheme", () {
+    var challenge = parseChallenge("ScHeMe realm=fblthp");
+    expect(challenge.scheme, equals("scheme"));
+    expect(challenge.parameters, equals({"realm": "fblthp"}));
+  });
+
+  test("normalizes the case of the parameter name", () {
+    var challenge = parseChallenge("scheme ReAlM=fblthp");
+    expect(challenge.scheme, equals("scheme"));
+    expect(challenge.parameters, containsPair("realm", "fblthp"));
+  });
+
+  test("doesn't normalize the case of the parameter value", () {
+    var challenge = parseChallenge("scheme realm=FbLtHp");
+    expect(challenge.scheme, equals("scheme"));
+    expect(challenge.parameters, containsPair("realm", "FbLtHp"));
+    expect(challenge.parameters, isNot(containsPair("realm", "fblthp")));
+  });
+
+  test("allows extra whitespace", () {
+    var challenge = parseChallenge(
+        "  scheme\t \trealm\t = \tfblthp\t, \tfoo\t\r\n =\tbar\t");
+    expect(challenge.scheme, equals("scheme"));
+    expect(challenge.parameters, equals({
+      "realm": "fblthp",
+      "foo": "bar"
+    }));
+  });
+
+  test("allows an empty parameter", () {
+    var challenge = parseChallenge(
+        "scheme realm=fblthp, , foo=bar");
+    expect(challenge.scheme, equals("scheme"));
+    expect(challenge.parameters, equals({
+      "realm": "fblthp",
+      "foo": "bar"
+    }));
+  });
+
+  test("allows a leading comma", () {
+    var challenge = parseChallenge(
+        "scheme , realm=fblthp, foo=bar,");
+    expect(challenge.scheme, equals("scheme"));
+    expect(challenge.parameters, equals({
+      "realm": "fblthp",
+      "foo": "bar"
+    }));
+  });
+
+  test("allows a trailing comma", () {
+    var challenge = parseChallenge(
+        "scheme realm=fblthp, foo=bar, ,");
+    expect(challenge.scheme, equals("scheme"));
+    expect(challenge.parameters, equals({
+      "realm": "fblthp",
+      "foo": "bar"
+    }));
+  });
+
+  test("disallows only a scheme", () {
+    expect(() => parseChallenge("scheme"),
+        throwsFormatException);
+  });
+
+  test("disallows a valueless parameter", () {
+    expect(() => parseChallenge("scheme realm"),
+        throwsFormatException);
+    expect(() => parseChallenge("scheme realm="),
+        throwsFormatException);
+    expect(() => parseChallenge("scheme realm, foo=bar"),
+        throwsFormatException);
+  });
+
+  test("requires a space after the scheme", () {
+    expect(() => parseChallenge("scheme\trealm"),
+        throwsFormatException);
+    expect(() => parseChallenge("scheme\r\n\trealm="),
+        throwsFormatException);
+  });
+
+  test("disallows junk after the parameters", () {
+    expect(() => parseChallenge("scheme realm=fblthp foo"),
+        throwsFormatException);
+    expect(() => parseChallenge("scheme realm=fblthp, foo=bar baz"),
+        throwsFormatException);
+  });
+}
diff --git a/mojo/public/dart/third_party/http_parser/test/case_insensitive_map_test.dart b/mojo/public/dart/third_party/http_parser/test/case_insensitive_map_test.dart
new file mode 100644
index 0000000..9bfa00a
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/test/case_insensitive_map_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:http_parser/http_parser.dart';
+import 'package:test/test.dart';
+
+void main() {
+  test("provides case-insensitive access to the map", () {
+    var map = new CaseInsensitiveMap();
+    map["fOo"] = "bAr";
+    expect(map, containsPair("FoO", "bAr"));
+
+    map["foo"] = "baz";
+    expect(map, containsPair("FOO", "baz"));
+  });
+
+  test("stores the original key cases", () {
+    var map = new CaseInsensitiveMap();
+    map["fOo"] = "bAr";
+    expect(map, equals({"fOo": "bAr"}));
+  });
+
+  test(".from() converts an existing map", () {
+    var map = new CaseInsensitiveMap.from({"fOo": "bAr"});
+    expect(map, containsPair("FoO", "bAr"));
+    expect(map, equals({"fOo": "bAr"}));
+  });
+}
diff --git a/mojo/public/dart/third_party/http_parser/test/http_date_test.dart b/mojo/public/dart/third_party/http_parser/test/http_date_test.dart
new file mode 100644
index 0000000..c0a2537
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/test/http_date_test.dart
@@ -0,0 +1,347 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http_parser.http_date_test;
+
+import 'package:http_parser/http_parser.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group('format', () {
+    test('many values with 9', () {
+      var date = new DateTime.utc(2014, 9, 9, 9, 9, 9);
+      var formatted = formatHttpDate(date);
+
+      expect(formatted, 'Tue, 09 Sep 2014 09:09:09 GMT');
+      var parsed = parseHttpDate(formatted);
+
+      expect(parsed, date);
+    });
+
+    test('end of year', () {
+      var date = new DateTime.utc(1999, 12, 31, 23, 59, 59);
+      var formatted = formatHttpDate(date);
+
+      expect(formatted, 'Fri, 31 Dec 1999 23:59:59 GMT');
+      var parsed = parseHttpDate(formatted);
+
+      expect(parsed, date);
+    });
+
+    test('start of year', () {
+      var date = new DateTime.utc(2000, 1, 1, 0, 0, 0);
+      var formatted = formatHttpDate(date);
+
+      expect(formatted, 'Sat, 01 Jan 2000 00:00:00 GMT');
+      var parsed = parseHttpDate(formatted);
+
+      expect(parsed, date);
+    });
+  });
+
+  group("parse", () {
+    group("RFC 1123", () {
+      test("parses the example date", () {
+        var date = parseHttpDate("Sun, 06 Nov 1994 08:49:37 GMT");
+        expect(date.day, equals(6));
+        expect(date.month, equals(DateTime.NOVEMBER));
+        expect(date.year, equals(1994));
+        expect(date.hour, equals(8));
+        expect(date.minute, equals(49));
+        expect(date.second, equals(37));
+        expect(date.timeZoneName, equals("UTC"));
+      });
+
+      test("whitespace is required", () {
+        expect(() => parseHttpDate("Sun,06 Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 199408:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 08:49:37GMT"),
+            throwsFormatException);
+      });
+
+      test("exactly one space is required", () {
+        expect(() => parseHttpDate("Sun,  06 Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06  Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov  1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994  08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 08:49:37  GMT"),
+            throwsFormatException);
+      });
+
+      test("requires precise number lengths", () {
+        expect(() => parseHttpDate("Sun, 6 Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 8:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 08:9:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 08:49:7 GMT"),
+            throwsFormatException);
+      });
+
+      test("requires reasonable numbers", () {
+        expect(() => parseHttpDate("Sun, 00 Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 31 Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 32 Aug 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 24:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 08:60:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 08:49:60 GMT"),
+            throwsFormatException);
+      });
+
+      test("only allows short weekday names", () {
+        expect(() => parseHttpDate("Sunday, 6 Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+      });
+
+      test("only allows short month names", () {
+        expect(() => parseHttpDate("Sun, 6 November 1994 08:49:37 GMT"),
+            throwsFormatException);
+      });
+
+      test("only allows GMT", () {
+        expect(() => parseHttpDate("Sun, 6 Nov 1994 08:49:37 PST"),
+            throwsFormatException);
+      });
+
+      test("disallows trailing whitespace", () {
+        expect(() => parseHttpDate("Sun, 6 Nov 1994 08:49:37 GMT "),
+            throwsFormatException);
+      });
+    });
+
+    group("RFC 850", () {
+      test("parses the example date", () {
+        var date = parseHttpDate("Sunday, 06-Nov-94 08:49:37 GMT");
+        expect(date.day, equals(6));
+        expect(date.month, equals(DateTime.NOVEMBER));
+        expect(date.year, equals(1994));
+        expect(date.hour, equals(8));
+        expect(date.minute, equals(49));
+        expect(date.second, equals(37));
+        expect(date.timeZoneName, equals("UTC"));
+      });
+
+      test("whitespace is required", () {
+        expect(() => parseHttpDate("Sunday,06-Nov-94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-9408:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 08:49:37GMT"),
+            throwsFormatException);
+      });
+
+      test("exactly one space is required", () {
+        expect(() => parseHttpDate("Sunday,  06-Nov-94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94  08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 08:49:37  GMT"),
+            throwsFormatException);
+      });
+
+      test("requires precise number lengths", () {
+        expect(() => parseHttpDate("Sunday, 6-Nov-94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 8:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 08:9:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 08:49:7 GMT"),
+            throwsFormatException);
+      });
+
+      test("requires reasonable numbers", () {
+        expect(() => parseHttpDate("Sunday, 00-Nov-94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 31-Nov-94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 32-Aug-94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 24:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 08:60:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 08:49:60 GMT"),
+            throwsFormatException);
+      });
+
+      test("only allows long weekday names", () {
+        expect(() => parseHttpDate("Sun, 6-Nov-94 08:49:37 GMT"),
+            throwsFormatException);
+      });
+
+      test("only allows short month names", () {
+        expect(() => parseHttpDate("Sunday, 6-November-94 08:49:37 GMT"),
+            throwsFormatException);
+      });
+
+      test("only allows GMT", () {
+        expect(() => parseHttpDate("Sunday, 6-Nov-94 08:49:37 PST"),
+            throwsFormatException);
+      });
+
+      test("disallows trailing whitespace", () {
+        expect(() => parseHttpDate("Sunday, 6-Nov-94 08:49:37 GMT "),
+            throwsFormatException);
+      });
+    });
+
+    group("asctime()", () {
+      test("parses the example date", () {
+        var date = parseHttpDate("Sun Nov  6 08:49:37 1994");
+        expect(date.day, equals(6));
+        expect(date.month, equals(DateTime.NOVEMBER));
+        expect(date.year, equals(1994));
+        expect(date.hour, equals(8));
+        expect(date.minute, equals(49));
+        expect(date.second, equals(37));
+        expect(date.timeZoneName, equals("UTC"));
+      });
+
+      test("parses a date with a two-digit day", () {
+        var date = parseHttpDate("Sun Nov 16 08:49:37 1994");
+        expect(date.day, equals(16));
+        expect(date.month, equals(DateTime.NOVEMBER));
+        expect(date.year, equals(1994));
+        expect(date.hour, equals(8));
+        expect(date.minute, equals(49));
+        expect(date.second, equals(37));
+        expect(date.timeZoneName, equals("UTC"));
+      });
+
+      test("whitespace is required", () {
+        expect(() => parseHttpDate("SunNov  6 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov6 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  608:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:49:371994"),
+            throwsFormatException);
+      });
+
+      test("the right amount of whitespace is required", () {
+        expect(() => parseHttpDate("Sun  Nov  6 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov   6 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov 6 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6  08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:49:37  1994"),
+            throwsFormatException);
+      });
+
+      test("requires precise number lengths", () {
+        expect(() => parseHttpDate("Sun Nov 016 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 8:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:9:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:49:7 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:49:37 94"),
+            throwsFormatException);
+      });
+
+      test("requires reasonable numbers", () {
+        expect(() => parseHttpDate("Sun Nov 0 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov 31 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Aug 32 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 24:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:60:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:49:60 1994"),
+            throwsFormatException);
+      });
+
+      test("only allows short weekday names", () {
+        expect(() => parseHttpDate("Sunday Nov 0 08:49:37 1994"),
+            throwsFormatException);
+      });
+
+      test("only allows short month names", () {
+        expect(() => parseHttpDate("Sun November 0 08:49:37 1994"),
+            throwsFormatException);
+      });
+
+      test("disallows trailing whitespace", () {
+        expect(() => parseHttpDate("Sun November 0 08:49:37 1994 "),
+            throwsFormatException);
+      });
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/http_parser/test/media_type_test.dart b/mojo/public/dart/third_party/http_parser/test/media_type_test.dart
new file mode 100644
index 0000000..0a9f904
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/test/media_type_test.dart
@@ -0,0 +1,154 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http_parser.media_type_test;
+
+import 'package:http_parser/http_parser.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group("parse", () {
+    test("parses a simple MIME type", () {
+      var type = new MediaType.parse("text/plain");
+      expect(type.type, equals("text"));
+      expect(type.subtype, equals("plain"));
+    });
+
+    test("allows leading whitespace", () {
+      expect(new MediaType.parse(" text/plain").mimeType, equals("text/plain"));
+      expect(
+          new MediaType.parse("\ttext/plain").mimeType, equals("text/plain"));
+    });
+
+    test("allows trailing whitespace", () {
+      expect(new MediaType.parse("text/plain ").mimeType, equals("text/plain"));
+      expect(
+          new MediaType.parse("text/plain\t").mimeType, equals("text/plain"));
+    });
+
+    test("disallows separators in the MIME type", () {
+      expect(() => new MediaType.parse("te(xt/plain"), throwsFormatException);
+      expect(() => new MediaType.parse("text/pla=in"), throwsFormatException);
+    });
+
+    test("disallows whitespace around the slash", () {
+      expect(() => new MediaType.parse("text /plain"), throwsFormatException);
+      expect(() => new MediaType.parse("text/ plain"), throwsFormatException);
+    });
+
+    test("parses parameters", () {
+      var type = new MediaType.parse("text/plain;foo=bar;baz=bang");
+      expect(type.mimeType, equals("text/plain"));
+      expect(type.parameters, equals({"foo": "bar", "baz": "bang"}));
+    });
+
+    test("allows whitespace around the semicolon", () {
+      var type = new MediaType.parse("text/plain ; foo=bar ; baz=bang");
+      expect(type.mimeType, equals("text/plain"));
+      expect(type.parameters, equals({"foo": "bar", "baz": "bang"}));
+    });
+
+    test("disallows whitespace around the equals", () {
+      expect(() => new MediaType.parse("text/plain; foo =bar"),
+          throwsFormatException);
+      expect(() => new MediaType.parse("text/plain; foo= bar"),
+          throwsFormatException);
+    });
+
+    test("disallows separators in the parameters", () {
+      expect(() => new MediaType.parse("text/plain; fo:o=bar"),
+          throwsFormatException);
+      expect(() => new MediaType.parse("text/plain; foo=b@ar"),
+          throwsFormatException);
+    });
+
+    test("parses quoted parameters", () {
+      var type = new MediaType.parse(
+          'text/plain; foo="bar space"; baz="bang\\\\escape"');
+      expect(type.mimeType, equals("text/plain"));
+      expect(
+          type.parameters, equals({"foo": "bar space", "baz": "bang\\escape"}));
+    });
+  });
+
+  group("change", () {
+    var type;
+    setUp(() {
+      type = new MediaType.parse("text/plain; foo=bar; baz=bang");
+    });
+
+    test("uses the existing fields by default", () {
+      var newType = type.change();
+      expect(newType.type, equals("text"));
+      expect(newType.subtype, equals("plain"));
+      expect(newType.parameters, equals({"foo": "bar", "baz": "bang"}));
+    });
+
+    test("[type] overrides the existing type", () {
+      expect(type.change(type: "new").type, equals("new"));
+    });
+
+    test("[subtype] overrides the existing subtype", () {
+      expect(type.change(subtype: "new").subtype, equals("new"));
+    });
+
+    test("[mimeType] overrides the existing type and subtype", () {
+      var newType = type.change(mimeType: "image/png");
+      expect(newType.type, equals("image"));
+      expect(newType.subtype, equals("png"));
+    });
+
+    test("[parameters] overrides and adds to existing parameters", () {
+      expect(
+          type.change(parameters: {"foo": "zap", "qux": "fblthp"}).parameters,
+          equals({"foo": "zap", "baz": "bang", "qux": "fblthp"}));
+    });
+
+    test("[clearParameters] removes existing parameters", () {
+      expect(type.change(clearParameters: true).parameters, isEmpty);
+    });
+
+    test("[clearParameters] with [parameters] removes before adding", () {
+      var newType =
+          type.change(parameters: {"foo": "zap"}, clearParameters: true);
+      expect(newType.parameters, equals({"foo": "zap"}));
+    });
+
+    test("[type] with [mimeType] is illegal", () {
+      expect(() => type.change(type: "new", mimeType: "image/png"),
+          throwsArgumentError);
+    });
+
+    test("[subtype] with [mimeType] is illegal", () {
+      expect(() => type.change(subtype: "new", mimeType: "image/png"),
+          throwsArgumentError);
+    });
+  });
+
+  group("toString", () {
+    test("serializes a simple MIME type", () {
+      expect(new MediaType("text", "plain").toString(), equals("text/plain"));
+    });
+
+    test("serializes a token parameter as a token", () {
+      expect(new MediaType("text", "plain", {"foo": "bar"}).toString(),
+          equals("text/plain; foo=bar"));
+    });
+
+    test("serializes a non-token parameter as a quoted string", () {
+      expect(new MediaType("text", "plain", {"foo": "bar baz"}).toString(),
+          equals('text/plain; foo="bar baz"'));
+    });
+
+    test("escapes a quoted string as necessary", () {
+      expect(new MediaType("text", "plain", {"foo": 'bar"\x7Fbaz'}).toString(),
+          equals('text/plain; foo="bar\\"\\\x7Fbaz"'));
+    });
+
+    test("serializes multiple parameters", () {
+      expect(new MediaType("text", "plain", {"foo": "bar", "baz": "bang"})
+          .toString(), equals("text/plain; foo=bar; baz=bang"));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/http_parser/test/web_socket_test.dart b/mojo/public/dart/third_party/http_parser/test/web_socket_test.dart
new file mode 100644
index 0000000..61bf0cc
--- /dev/null
+++ b/mojo/public/dart/third_party/http_parser/test/web_socket_test.dart
@@ -0,0 +1,99 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn('vm')
+
+library http_parser.web_socket_test;
+
+import 'dart:io';
+
+import 'package:http_parser/http_parser.dart';
+import 'package:test/test.dart';
+
+void main() {
+  test("a client can communicate with a WebSocket server", () {
+    return HttpServer.bind("localhost", 0).then((server) {
+      server.transform(new WebSocketTransformer()).listen((webSocket) {
+        webSocket.add("hello!");
+        webSocket.listen((request) {
+          expect(request, equals("ping"));
+          webSocket.add("pong");
+          webSocket.close();
+        });
+      });
+
+      var client = new HttpClient();
+      return client
+          .openUrl("GET", Uri.parse("http://localhost:${server.port}"))
+          .then((request) {
+        request.headers
+          ..set("Connection", "Upgrade")
+          ..set("Upgrade", "websocket")
+          ..set("Sec-WebSocket-Key", "x3JJHMbDL1EzLkh9GBhXDw==")
+          ..set("Sec-WebSocket-Version", "13");
+        return request.close();
+      }).then((response) => response.detachSocket()).then((socket) {
+        var webSocket = new CompatibleWebSocket(socket, serverSide: false);
+
+        var n = 0;
+        return webSocket.listen((message) {
+          if (n == 0) {
+            expect(message, equals("hello!"));
+            webSocket.add("ping");
+          } else if (n == 1) {
+            expect(message, equals("pong"));
+            webSocket.close();
+            server.close();
+          } else {
+            fail("Only expected two messages.");
+          }
+          n++;
+        }).asFuture();
+      });
+    });
+  });
+
+  test("a server can communicate with a WebSocket client", () {
+    return HttpServer.bind("localhost", 0).then((server) {
+      server.listen((request) {
+        var response = request.response;
+        response.statusCode = 101;
+        response.headers
+          ..set("Connection", "Upgrade")
+          ..set("Upgrade", "websocket")
+          ..set("Sec-WebSocket-Accept", CompatibleWebSocket
+              .signKey(request.headers.value('Sec-WebSocket-Key')));
+        response.contentLength = 0;
+        response.detachSocket().then((socket) {
+          var webSocket = new CompatibleWebSocket(socket);
+          webSocket.add("hello!");
+          webSocket.first.then((request) {
+            expect(request, equals("ping"));
+            webSocket.add("pong");
+            webSocket.close();
+          });
+        });
+      });
+
+      return WebSocket
+          .connect('ws://localhost:${server.port}')
+          .then((webSocket) {
+        var n = 0;
+        return webSocket.listen((message) {
+          if (n == 0) {
+            expect(message, equals("hello!"));
+            webSocket.add("ping");
+          } else if (n == 1) {
+            expect(message, equals("pong"));
+            webSocket.close();
+            server.close();
+          } else {
+            fail("Only expected two messages.");
+          }
+          n++;
+        }).asFuture();
+      });
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/logging/.gitignore b/mojo/public/dart/third_party/logging/.gitignore
new file mode 100644
index 0000000..388eff0
--- /dev/null
+++ b/mojo/public/dart/third_party/logging/.gitignore
@@ -0,0 +1,14 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.pub/
+build/
+packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/logging/.status b/mojo/public/dart/third_party/logging/.status
new file mode 100644
index 0000000..ff095a2
--- /dev/null
+++ b/mojo/public/dart/third_party/logging/.status
@@ -0,0 +1,15 @@
+# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Skip non-test files ending with "_test".
+packages/*: Skip
+*/packages/*: Skip
+*/*/packages/*: Skip
+*/*/*/packages/*: Skip
+*/*/*/*packages/*: Skip
+*/*/*/*/*packages/*: Skip
+
+# Only run tests from the build directory, since we don't care about the
+# difference between transformed an untransformed code.
+test/*: Skip
diff --git a/mojo/public/dart/third_party/logging/AUTHORS b/mojo/public/dart/third_party/logging/AUTHORS
new file mode 100644
index 0000000..0617765
--- /dev/null
+++ b/mojo/public/dart/third_party/logging/AUTHORS
@@ -0,0 +1,9 @@
+# Names should be added to this file with this pattern:
+#
+# For individuals:
+#   Name <email address>
+#
+# For organizations:
+#   Organization <fnmatch pattern>
+#
+Google Inc. <*@google.com>
diff --git a/mojo/public/dart/third_party/logging/CHANGELOG.md b/mojo/public/dart/third_party/logging/CHANGELOG.md
new file mode 100644
index 0000000..d04354d
--- /dev/null
+++ b/mojo/public/dart/third_party/logging/CHANGELOG.md
@@ -0,0 +1,26 @@
+## 0.11.1+1
+
+* Include default error with the auto-generated stack traces.
+
+## 0.11.1
+
+* Add support for automatically logging the stack trace on error messages. Note
+  this can be expensive, so it is off by default.
+
+## 0.11.0
+
+* Revert change in `0.10.0`. `stackTrace` must be an instance of `StackTrace`.
+  Use the `Trace` class from the [stack_trace package][] to convert strings.
+
+[stack_trace package]: https://pub.dartlang.org/packages/stack_trace
+
+## 0.10.0
+
+* Change type of `stackTrace` from `StackTrace` to `Object`.
+
+## 0.9.3
+
+* Added optional `LogRecord.zone` field.
+
+* Record current zone (or user specified zone) when creating new `LogRecord`s.
+
diff --git a/mojo/public/dart/third_party/logging/LICENSE b/mojo/public/dart/third_party/logging/LICENSE
new file mode 100644
index 0000000..ee99930
--- /dev/null
+++ b/mojo/public/dart/third_party/logging/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2013, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/logging/PATENTS b/mojo/public/dart/third_party/logging/PATENTS
new file mode 100644
index 0000000..6954196
--- /dev/null
+++ b/mojo/public/dart/third_party/logging/PATENTS
@@ -0,0 +1,23 @@
+Additional IP Rights Grant (Patents)
+
+"This implementation" means the copyrightable works distributed by
+Google as part of the Dart Project.
+
+Google hereby grants to you a perpetual, worldwide, non-exclusive,
+no-charge, royalty-free, irrevocable (except as stated in this
+section) patent license to make, have made, use, offer to sell, sell,
+import, transfer, and otherwise run, modify and propagate the contents
+of this implementation of Dart, where such license applies only to
+those patent claims, both currently owned by Google and acquired in
+the future, licensable by Google that are necessarily infringed by
+this implementation of Dart. This grant does not include claims that
+would be infringed only as a consequence of further modification of
+this implementation. If you or your agent or exclusive licensee
+institute or order or agree to the institution of patent litigation
+against any entity (including a cross-claim or counterclaim in a
+lawsuit) alleging that this implementation of Dart or any code
+incorporated within this implementation of Dart constitutes direct or
+contributory patent infringement, or inducement of patent
+infringement, then any patent rights granted to you under this License
+for this implementation of Dart shall terminate as of the date such
+litigation is filed.
diff --git a/mojo/public/dart/third_party/logging/README.md b/mojo/public/dart/third_party/logging/README.md
new file mode 100644
index 0000000..de5b8c5
--- /dev/null
+++ b/mojo/public/dart/third_party/logging/README.md
@@ -0,0 +1,49 @@
+## Initializing
+
+By default, the logging package does not do anything useful with the
+log messages. You must configure the logging level and add a handler
+for the log messages.
+
+Here is a simple logging configuration that logs all messages
+via `print`.
+
+```dart
+Logger.root.level = Level.ALL;
+Logger.root.onRecord.listen((LogRecord rec) {
+  print('${rec.level.name}: ${rec.time}: ${rec.message}');
+});
+```
+
+First, set the root [Level]. All messages at or above the level are
+sent to the [onRecord] stream.
+
+Then, listen on the [onRecord] stream for [LogRecord] events. The
+[LogRecord] class has various properties for the message, error,
+logger name, and more.
+
+## Logging messages
+
+Create a [Logger] with a unique name to easily identify the source
+of the log messages.
+
+```dart
+final Logger log = new Logger('MyClassName');
+```
+
+Here is an example of logging a debug message and an error:
+
+```dart
+var future = doSomethingAsync().then((result) {
+  log.fine('Got the result: $result');
+  processResult(result);
+}).catchError((e, stackTrace) => log.severe('Oh noes!', e, stackTrace));
+```
+
+When logging more complex messages, you can pass a closure instead
+that will be evaluated only if the message is actually logged:
+
+```dart
+log.fine(() => [1, 2, 3, 4, 5].map((e) => e * 4).join("-"));
+```
+
+See the [Logger] class for the different logging methods.
diff --git a/mojo/public/dart/third_party/logging/codereview.settings b/mojo/public/dart/third_party/logging/codereview.settings
new file mode 100644
index 0000000..ae2cae6
--- /dev/null
+++ b/mojo/public/dart/third_party/logging/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: http://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/logging/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/logging/lib/logging.dart b/mojo/public/dart/third_party/logging/lib/logging.dart
new file mode 100644
index 0000000..f1641dc
--- /dev/null
+++ b/mojo/public/dart/third_party/logging/lib/logging.dart
@@ -0,0 +1,352 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ */
+library logging;
+
+import 'dart:async';
+import 'dart:collection';
+
+/**
+ * Whether to allow fine-grain logging and configuration of loggers in a
+ * hierarchy. When false, all logging is merged in the root logger.
+ */
+bool hierarchicalLoggingEnabled = false;
+
+/**
+ * Automatically record stack traces for any message of this level or above.
+ * Because this is expensive, this is off by default.
+ */
+Level recordStackTraceAtLevel = Level.OFF;
+
+/**
+ * Level for the root-logger. This will be the level of all loggers if
+ * [hierarchicalLoggingEnabled] is false.
+ */
+Level _rootLevel = Level.INFO;
+
+/**
+ * Use a [Logger] to log debug messages. [Logger]s are named using a
+ * hierarchical dot-separated name convention.
+ */
+class Logger {
+  /** Simple name of this logger. */
+  final String name;
+
+  /** The full name of this logger, which includes the parent's full name. */
+  String get fullName =>
+      (parent == null || parent.name == '') ? name : '${parent.fullName}.$name';
+
+  /** Parent of this logger in the hierarchy of loggers. */
+  final Logger parent;
+
+  /** Logging [Level] used for entries generated on this logger. */
+  Level _level;
+
+  final Map<String, Logger> _children;
+
+  /** Children in the hierarchy of loggers, indexed by their simple names. */
+  final Map<String, Logger> children;
+
+  /** Controller used to notify when log entries are added to this logger. */
+  StreamController<LogRecord> _controller;
+
+  /**
+   * Singleton constructor. Calling `new Logger(name)` will return the same
+   * actual instance whenever it is called with the same string name.
+   */
+  factory Logger(String name) {
+    return _loggers.putIfAbsent(name, () => new Logger._named(name));
+  }
+
+  factory Logger._named(String name) {
+    if (name.startsWith('.')) {
+      throw new ArgumentError("name shouldn't start with a '.'");
+    }
+    // Split hierarchical names (separated with '.').
+    int dot = name.lastIndexOf('.');
+    Logger parent = null;
+    String thisName;
+    if (dot == -1) {
+      if (name != '') parent = new Logger('');
+      thisName = name;
+    } else {
+      parent = new Logger(name.substring(0, dot));
+      thisName = name.substring(dot + 1);
+    }
+    return new Logger._internal(thisName, parent, new Map<String, Logger>());
+  }
+
+  Logger._internal(this.name, this.parent, Map<String, Logger> children)
+      : this._children = children,
+        this.children = new UnmodifiableMapView(children) {
+    if (parent != null) parent._children[name] = this;
+  }
+
+  /**
+   * Effective level considering the levels established in this logger's parents
+   * (when [hierarchicalLoggingEnabled] is true).
+   */
+  Level get level {
+    if (hierarchicalLoggingEnabled) {
+      if (_level != null) return _level;
+      if (parent != null) return parent.level;
+    }
+    return _rootLevel;
+  }
+
+  /** Override the level for this particular [Logger] and its children. */
+  void set level(Level value) {
+    if (hierarchicalLoggingEnabled && parent != null) {
+      _level = value;
+    } else {
+      if (parent != null) {
+        throw new UnsupportedError(
+            'Please set "hierarchicalLoggingEnabled" to true if you want to '
+            'change the level on a non-root logger.');
+      }
+      _rootLevel = value;
+    }
+  }
+
+  /**
+   * Returns an stream of messages added to this [Logger]. You can listen for
+   * messages using the standard stream APIs, for instance:
+   *    logger.onRecord.listen((record) { ... });
+   */
+  Stream<LogRecord> get onRecord => _getStream();
+
+  void clearListeners() {
+    if (hierarchicalLoggingEnabled || parent == null) {
+      if (_controller != null) {
+        _controller.close();
+        _controller = null;
+      }
+    } else {
+      root.clearListeners();
+    }
+  }
+
+  /** Whether a message for [value]'s level is loggable in this logger. */
+  bool isLoggable(Level value) => (value >= level);
+
+  /**
+   * Adds a log record for a [message] at a particular [logLevel] if
+   * `isLoggable(logLevel)` is true.
+   *
+   * Use this method to create log entries for user-defined levels. To record a
+   * message at a predefined level (e.g. [Level.INFO], [Level.WARNING], etc) you
+   * can use their specialized methods instead (e.g. [info], [warning], etc).
+   *
+   * If [message] is a [Function], it will be lazy evaluated. Additionally, if
+   * [message] or its evaluated value is not a [String], then 'toString()' will
+   * be called on it and the result will be logged.
+   *
+   * The log record will contain a field for the zone in which this call was
+   * made.
+   * This can be advantagous if a log listener wants to handle records of
+   * different zones differently (e.g. group log records by http-request if each
+   * http-request handler runs in it's own zone).
+   */
+  void log(Level logLevel, message,
+      [Object error, StackTrace stackTrace, Zone zone]) {
+    if (isLoggable(logLevel)) {
+      if (message is Function) message = message();
+      if (message is! String) message = message.toString();
+      if (stackTrace == null && logLevel >= recordStackTraceAtLevel) {
+        try {
+          throw "autogenerated stack trace for $logLevel $message";
+        } catch (e, t) {
+          stackTrace = t;
+          if (error == null) error = e;
+        }
+      }
+      if (zone == null) zone = Zone.current;
+
+      var record =
+          new LogRecord(logLevel, message, fullName, error, stackTrace, zone);
+
+      if (hierarchicalLoggingEnabled) {
+        var target = this;
+        while (target != null) {
+          target._publish(record);
+          target = target.parent;
+        }
+      } else {
+        root._publish(record);
+      }
+    }
+  }
+
+  /** Log message at level [Level.FINEST]. */
+  void finest(message, [Object error, StackTrace stackTrace]) =>
+      log(Level.FINEST, message, error, stackTrace);
+
+  /** Log message at level [Level.FINER]. */
+  void finer(message, [Object error, StackTrace stackTrace]) =>
+      log(Level.FINER, message, error, stackTrace);
+
+  /** Log message at level [Level.FINE]. */
+  void fine(message, [Object error, StackTrace stackTrace]) =>
+      log(Level.FINE, message, error, stackTrace);
+
+  /** Log message at level [Level.CONFIG]. */
+  void config(message, [Object error, StackTrace stackTrace]) =>
+      log(Level.CONFIG, message, error, stackTrace);
+
+  /** Log message at level [Level.INFO]. */
+  void info(message, [Object error, StackTrace stackTrace]) =>
+      log(Level.INFO, message, error, stackTrace);
+
+  /** Log message at level [Level.WARNING]. */
+  void warning(message, [Object error, StackTrace stackTrace]) =>
+      log(Level.WARNING, message, error, stackTrace);
+
+  /** Log message at level [Level.SEVERE]. */
+  void severe(message, [Object error, StackTrace stackTrace]) =>
+      log(Level.SEVERE, message, error, stackTrace);
+
+  /** Log message at level [Level.SHOUT]. */
+  void shout(message, [Object error, StackTrace stackTrace]) =>
+      log(Level.SHOUT, message, error, stackTrace);
+
+  Stream<LogRecord> _getStream() {
+    if (hierarchicalLoggingEnabled || parent == null) {
+      if (_controller == null) {
+        _controller = new StreamController<LogRecord>.broadcast(sync: true);
+      }
+      return _controller.stream;
+    } else {
+      return root._getStream();
+    }
+  }
+
+  void _publish(LogRecord record) {
+    if (_controller != null) {
+      _controller.add(record);
+    }
+  }
+
+  /** Top-level root [Logger]. */
+  static final Logger root = new Logger('');
+
+  /** All [Logger]s in the system. */
+  static final Map<String, Logger> _loggers = <String, Logger>{};
+}
+
+/** Handler callback to process log entries as they are added to a [Logger]. */
+typedef void LoggerHandler(LogRecord);
+
+/**
+ * [Level]s to control logging output. Logging can be enabled to include all
+ * levels above certain [Level]. [Level]s are ordered using an integer
+ * value [Level.value]. The predefined [Level] constants below are sorted as
+ * follows (in descending order): [Level.SHOUT], [Level.SEVERE],
+ * [Level.WARNING], [Level.INFO], [Level.CONFIG], [Level.FINE], [Level.FINER],
+ * [Level.FINEST], and [Level.ALL].
+ *
+ * We recommend using one of the predefined logging levels. If you define your
+ * own level, make sure you use a value between those used in [Level.ALL] and
+ * [Level.OFF].
+ */
+class Level implements Comparable<Level> {
+  final String name;
+
+  /**
+   * Unique value for this level. Used to order levels, so filtering can exclude
+   * messages whose level is under certain value.
+   */
+  final int value;
+
+  const Level(this.name, this.value);
+
+  /** Special key to turn on logging for all levels ([value] = 0). */
+  static const Level ALL = const Level('ALL', 0);
+
+  /** Special key to turn off all logging ([value] = 2000). */
+  static const Level OFF = const Level('OFF', 2000);
+
+  /** Key for highly detailed tracing ([value] = 300). */
+  static const Level FINEST = const Level('FINEST', 300);
+
+  /** Key for fairly detailed tracing ([value] = 400). */
+  static const Level FINER = const Level('FINER', 400);
+
+  /** Key for tracing information ([value] = 500). */
+  static const Level FINE = const Level('FINE', 500);
+
+  /** Key for static configuration messages ([value] = 700). */
+  static const Level CONFIG = const Level('CONFIG', 700);
+
+  /** Key for informational messages ([value] = 800). */
+  static const Level INFO = const Level('INFO', 800);
+
+  /** Key for potential problems ([value] = 900). */
+  static const Level WARNING = const Level('WARNING', 900);
+
+  /** Key for serious failures ([value] = 1000). */
+  static const Level SEVERE = const Level('SEVERE', 1000);
+
+  /** Key for extra debugging loudness ([value] = 1200). */
+  static const Level SHOUT = const Level('SHOUT', 1200);
+
+  static const List<Level> LEVELS = const [
+    ALL,
+    FINEST,
+    FINER,
+    FINE,
+    CONFIG,
+    INFO,
+    WARNING,
+    SEVERE,
+    SHOUT,
+    OFF
+  ];
+
+  bool operator ==(other) => other is Level && value == other.value;
+  bool operator <(Level other) => value < other.value;
+  bool operator <=(Level other) => value <= other.value;
+  bool operator >(Level other) => value > other.value;
+  bool operator >=(Level other) => value >= other.value;
+  int compareTo(Level other) => value - other.value;
+  int get hashCode => value;
+  String toString() => name;
+}
+
+/**
+ * A log entry representation used to propagate information from [Logger] to
+ * individual [Handler]s.
+ */
+class LogRecord {
+  final Level level;
+  final String message;
+
+  /** Logger where this record is stored. */
+  final String loggerName;
+
+  /** Time when this record was created. */
+  final DateTime time;
+
+  /** Unique sequence number greater than all log records created before it. */
+  final int sequenceNumber;
+
+  static int _nextNumber = 0;
+
+  /** Associated error (if any) when recording errors messages. */
+  final Object error;
+
+  /** Associated stackTrace (if any) when recording errors messages. */
+  final StackTrace stackTrace;
+
+  /** Zone of the calling code which resulted in this LogRecord. */
+  final Zone zone;
+
+  LogRecord(this.level, this.message, this.loggerName,
+      [this.error, this.stackTrace, this.zone])
+      : time = new DateTime.now(),
+        sequenceNumber = LogRecord._nextNumber++;
+
+  String toString() => '[${level.name}] $loggerName: $message';
+}
diff --git a/mojo/public/dart/third_party/logging/pubspec.yaml b/mojo/public/dart/third_party/logging/pubspec.yaml
new file mode 100644
index 0000000..2206dbe
--- /dev/null
+++ b/mojo/public/dart/third_party/logging/pubspec.yaml
@@ -0,0 +1,12 @@
+name: logging
+version: 0.11.1+1
+author: Dart Team <misc@dartlang.org>
+description: >
+  Provides APIs for debugging and error logging. This library introduces
+  abstractions similar to those used in other languages, such as the Closure
+  JS Logger and java.util.logging.Logger.
+homepage: https://github.com/dart-lang/logging
+environment:
+  sdk: '>=1.5.0 <2.0.0'
+dev_dependencies:
+  test: '>=0.12.0 <0.13.0'
diff --git a/mojo/public/dart/third_party/logging/test/logging_test.dart b/mojo/public/dart/third_party/logging/test/logging_test.dart
new file mode 100644
index 0000000..60017b3
--- /dev/null
+++ b/mojo/public/dart/third_party/logging/test/logging_test.dart
@@ -0,0 +1,586 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library logging_test;
+
+import 'dart:async';
+
+import 'package:logging/logging.dart';
+import 'package:test/test.dart';
+
+void main() {
+  test('level comparison is a valid comparator', () {
+    var level1 = const Level('NOT_REAL1', 253);
+    expect(level1 == level1, isTrue);
+    expect(level1 <= level1, isTrue);
+    expect(level1 >= level1, isTrue);
+    expect(level1 < level1, isFalse);
+    expect(level1 > level1, isFalse);
+
+    var level2 = const Level('NOT_REAL2', 455);
+    expect(level1 <= level2, isTrue);
+    expect(level1 < level2, isTrue);
+    expect(level2 >= level1, isTrue);
+    expect(level2 > level1, isTrue);
+
+    var level3 = const Level('NOT_REAL3', 253);
+    expect(level1, isNot(same(level3))); // different instances
+    expect(level1, equals(level3)); // same value.
+  });
+
+  test('default levels are in order', () {
+    final levels = Level.LEVELS;
+
+    for (int i = 0; i < levels.length; i++) {
+      for (int j = i + 1; j < levels.length; j++) {
+        expect(levels[i] < levels[j], isTrue);
+      }
+    }
+  });
+
+  test('levels are comparable', () {
+    final unsorted = [
+      Level.INFO,
+      Level.CONFIG,
+      Level.FINE,
+      Level.SHOUT,
+      Level.OFF,
+      Level.FINER,
+      Level.ALL,
+      Level.WARNING,
+      Level.FINEST,
+      Level.SEVERE,
+    ];
+
+    final sorted = Level.LEVELS;
+
+    expect(unsorted, isNot(orderedEquals(sorted)));
+
+    unsorted.sort();
+    expect(unsorted, orderedEquals(sorted));
+  });
+
+  test('levels are hashable', () {
+    var map = new Map<Level, String>();
+    map[Level.INFO] = 'info';
+    map[Level.SHOUT] = 'shout';
+    expect(map[Level.INFO], same('info'));
+    expect(map[Level.SHOUT], same('shout'));
+  });
+
+  test('logger name cannot start with a "." ', () {
+    expect(() => new Logger('.c'), throwsArgumentError);
+  });
+
+  test('logger naming is hierarchical', () {
+    Logger c = new Logger('a.b.c');
+    expect(c.name, equals('c'));
+    expect(c.parent.name, equals('b'));
+    expect(c.parent.parent.name, equals('a'));
+    expect(c.parent.parent.parent.name, equals(''));
+    expect(c.parent.parent.parent.parent, isNull);
+  });
+
+  test('logger full name', () {
+    Logger c = new Logger('a.b.c');
+    expect(c.fullName, equals('a.b.c'));
+    expect(c.parent.fullName, equals('a.b'));
+    expect(c.parent.parent.fullName, equals('a'));
+    expect(c.parent.parent.parent.fullName, equals(''));
+    expect(c.parent.parent.parent.parent, isNull);
+  });
+
+  test('logger parent-child links are correct', () {
+    Logger a = new Logger('a');
+    Logger b = new Logger('a.b');
+    Logger c = new Logger('a.c');
+    expect(a, same(b.parent));
+    expect(a, same(c.parent));
+    expect(a.children['b'], same(b));
+    expect(a.children['c'], same(c));
+  });
+
+  test('loggers are singletons', () {
+    Logger a1 = new Logger('a');
+    Logger a2 = new Logger('a');
+    Logger b = new Logger('a.b');
+    Logger root = Logger.root;
+    expect(a1, same(a2));
+    expect(a1, same(b.parent));
+    expect(root, same(a1.parent));
+    expect(root, same(new Logger('')));
+  });
+
+  test('cannot directly manipulate Logger.children', () {
+    var loggerAB = new Logger('a.b');
+    var loggerA = loggerAB.parent;
+
+    expect(loggerA.children['b'], same(loggerAB), reason: 'can read Children');
+
+    expect(() {
+      loggerAB.children['test'] = null;
+    }, throwsUnsupportedError, reason: 'Children is read-only');
+  });
+
+  test('stackTrace gets throw to LogRecord', () {
+    Logger.root.level = Level.INFO;
+
+    var records = new List<LogRecord>();
+
+    var sub = Logger.root.onRecord.listen(records.add);
+
+    try {
+      throw new UnsupportedError('test exception');
+    } catch (error, stack) {
+      Logger.root.log(Level.SEVERE, 'severe', error, stack);
+      Logger.root.warning('warning', error, stack);
+    }
+
+    Logger.root.log(Level.SHOUT, 'shout');
+
+    sub.cancel();
+
+    expect(records, hasLength(3));
+
+    var severe = records[0];
+    expect(severe.message, 'severe');
+    expect(severe.error is UnsupportedError, isTrue);
+    expect(severe.stackTrace is StackTrace, isTrue);
+
+    var warning = records[1];
+    expect(warning.message, 'warning');
+    expect(warning.error is UnsupportedError, isTrue);
+    expect(warning.stackTrace is StackTrace, isTrue);
+
+    var shout = records[2];
+    expect(shout.message, 'shout');
+    expect(shout.error, isNull);
+    expect(shout.stackTrace, isNull);
+  });
+
+  group('zone gets recorded to LogRecord', () {
+    test('root zone', () {
+      var root = Logger.root;
+
+      var recordingZone = Zone.current;
+      var records = new List<LogRecord>();
+      root.onRecord.listen(records.add);
+      root.info('hello');
+
+      expect(records, hasLength(1));
+      expect(records.first.zone, equals(recordingZone));
+    });
+
+    test('child zone', () {
+      var root = Logger.root;
+
+      var recordingZone;
+      var records = new List<LogRecord>();
+      root.onRecord.listen(records.add);
+
+      runZoned(() {
+        recordingZone = Zone.current;
+        root.info('hello');
+      });
+
+      expect(records, hasLength(1));
+      expect(records.first.zone, equals(recordingZone));
+    });
+
+    test('custom zone', () {
+      var root = Logger.root;
+
+      var recordingZone;
+      var records = new List<LogRecord>();
+      root.onRecord.listen(records.add);
+
+      runZoned(() {
+        recordingZone = Zone.current;
+      });
+
+      runZoned(() => root.log(Level.INFO, 'hello', null, null, recordingZone));
+
+      expect(records, hasLength(1));
+      expect(records.first.zone, equals(recordingZone));
+    });
+  });
+
+  group('mutating levels', () {
+    Logger root = Logger.root;
+    Logger a = new Logger('a');
+    Logger b = new Logger('a.b');
+    Logger c = new Logger('a.b.c');
+    Logger d = new Logger('a.b.c.d');
+    Logger e = new Logger('a.b.c.d.e');
+
+    setUp(() {
+      hierarchicalLoggingEnabled = true;
+      root.level = Level.INFO;
+      a.level = null;
+      b.level = null;
+      c.level = null;
+      d.level = null;
+      e.level = null;
+      root.clearListeners();
+      a.clearListeners();
+      b.clearListeners();
+      c.clearListeners();
+      d.clearListeners();
+      e.clearListeners();
+      hierarchicalLoggingEnabled = false;
+      root.level = Level.INFO;
+    });
+
+    test('cannot set level if hierarchy is disabled', () {
+      expect(() {
+        a.level = Level.FINE;
+      }, throwsUnsupportedError);
+    });
+
+    test('loggers effective level - no hierarchy', () {
+      expect(root.level, equals(Level.INFO));
+      expect(a.level, equals(Level.INFO));
+      expect(b.level, equals(Level.INFO));
+
+      root.level = Level.SHOUT;
+
+      expect(root.level, equals(Level.SHOUT));
+      expect(a.level, equals(Level.SHOUT));
+      expect(b.level, equals(Level.SHOUT));
+    });
+
+    test('loggers effective level - with hierarchy', () {
+      hierarchicalLoggingEnabled = true;
+      expect(root.level, equals(Level.INFO));
+      expect(a.level, equals(Level.INFO));
+      expect(b.level, equals(Level.INFO));
+      expect(c.level, equals(Level.INFO));
+
+      root.level = Level.SHOUT;
+      b.level = Level.FINE;
+
+      expect(root.level, equals(Level.SHOUT));
+      expect(a.level, equals(Level.SHOUT));
+      expect(b.level, equals(Level.FINE));
+      expect(c.level, equals(Level.FINE));
+    });
+
+    test('isLoggable is appropriate', () {
+      hierarchicalLoggingEnabled = true;
+      root.level = Level.SEVERE;
+      c.level = Level.ALL;
+      e.level = Level.OFF;
+
+      expect(root.isLoggable(Level.SHOUT), isTrue);
+      expect(root.isLoggable(Level.SEVERE), isTrue);
+      expect(root.isLoggable(Level.WARNING), isFalse);
+      expect(c.isLoggable(Level.FINEST), isTrue);
+      expect(c.isLoggable(Level.FINE), isTrue);
+      expect(e.isLoggable(Level.SHOUT), isFalse);
+    });
+
+    test('add/remove handlers - no hierarchy', () {
+      int calls = 0;
+      var handler = (_) {
+        calls++;
+      };
+      final sub = c.onRecord.listen(handler);
+      root.info("foo");
+      root.info("foo");
+      expect(calls, equals(2));
+      sub.cancel();
+      root.info("foo");
+      expect(calls, equals(2));
+    });
+
+    test('add/remove handlers - with hierarchy', () {
+      hierarchicalLoggingEnabled = true;
+      int calls = 0;
+      var handler = (_) {
+        calls++;
+      };
+      c.onRecord.listen(handler);
+      root.info("foo");
+      root.info("foo");
+      expect(calls, equals(0));
+    });
+
+    test('logging methods store appropriate level', () {
+      root.level = Level.ALL;
+      var rootMessages = [];
+      root.onRecord.listen((record) {
+        rootMessages.add('${record.level}: ${record.message}');
+      });
+
+      root.finest('1');
+      root.finer('2');
+      root.fine('3');
+      root.config('4');
+      root.info('5');
+      root.warning('6');
+      root.severe('7');
+      root.shout('8');
+
+      expect(rootMessages, equals([
+        'FINEST: 1',
+        'FINER: 2',
+        'FINE: 3',
+        'CONFIG: 4',
+        'INFO: 5',
+        'WARNING: 6',
+        'SEVERE: 7',
+        'SHOUT: 8'
+      ]));
+    });
+
+    test('logging methods store exception', () {
+      root.level = Level.ALL;
+      var rootMessages = [];
+      root.onRecord.listen((r) {
+        rootMessages.add('${r.level}: ${r.message} ${r.error}');
+      });
+
+      root.finest('1');
+      root.finer('2');
+      root.fine('3');
+      root.config('4');
+      root.info('5');
+      root.warning('6');
+      root.severe('7');
+      root.shout('8');
+      root.finest('1', 'a');
+      root.finer('2', 'b');
+      root.fine('3', ['c']);
+      root.config('4', 'd');
+      root.info('5', 'e');
+      root.warning('6', 'f');
+      root.severe('7', 'g');
+      root.shout('8', 'h');
+
+      expect(rootMessages, equals([
+        'FINEST: 1 null',
+        'FINER: 2 null',
+        'FINE: 3 null',
+        'CONFIG: 4 null',
+        'INFO: 5 null',
+        'WARNING: 6 null',
+        'SEVERE: 7 null',
+        'SHOUT: 8 null',
+        'FINEST: 1 a',
+        'FINER: 2 b',
+        'FINE: 3 [c]',
+        'CONFIG: 4 d',
+        'INFO: 5 e',
+        'WARNING: 6 f',
+        'SEVERE: 7 g',
+        'SHOUT: 8 h'
+      ]));
+    });
+
+    test('message logging - no hierarchy', () {
+      root.level = Level.WARNING;
+      var rootMessages = [];
+      var aMessages = [];
+      var cMessages = [];
+      c.onRecord.listen((record) {
+        cMessages.add('${record.level}: ${record.message}');
+      });
+      a.onRecord.listen((record) {
+        aMessages.add('${record.level}: ${record.message}');
+      });
+      root.onRecord.listen((record) {
+        rootMessages.add('${record.level}: ${record.message}');
+      });
+
+      root.info('1');
+      root.fine('2');
+      root.shout('3');
+
+      b.info('4');
+      b.severe('5');
+      b.warning('6');
+      b.fine('7');
+
+      c.fine('8');
+      c.warning('9');
+      c.shout('10');
+
+      expect(rootMessages, equals([
+        // 'INFO: 1' is not loggable
+        // 'FINE: 2' is not loggable
+        'SHOUT: 3',
+        // 'INFO: 4' is not loggable
+        'SEVERE: 5',
+        'WARNING: 6',
+        // 'FINE: 7' is not loggable
+        // 'FINE: 8' is not loggable
+        'WARNING: 9',
+        'SHOUT: 10'
+      ]));
+
+      // no hierarchy means we all hear the same thing.
+      expect(aMessages, equals(rootMessages));
+      expect(cMessages, equals(rootMessages));
+    });
+
+    test('message logging - with hierarchy', () {
+      hierarchicalLoggingEnabled = true;
+
+      b.level = Level.WARNING;
+
+      var rootMessages = [];
+      var aMessages = [];
+      var cMessages = [];
+      c.onRecord.listen((record) {
+        cMessages.add('${record.level}: ${record.message}');
+      });
+      a.onRecord.listen((record) {
+        aMessages.add('${record.level}: ${record.message}');
+      });
+      root.onRecord.listen((record) {
+        rootMessages.add('${record.level}: ${record.message}');
+      });
+
+      root.info('1');
+      root.fine('2');
+      root.shout('3');
+
+      b.info('4');
+      b.severe('5');
+      b.warning('6');
+      b.fine('7');
+
+      c.fine('8');
+      c.warning('9');
+      c.shout('10');
+
+      expect(rootMessages, equals([
+        'INFO: 1',
+        // 'FINE: 2' is not loggable
+        'SHOUT: 3',
+        // 'INFO: 4' is not loggable
+        'SEVERE: 5',
+        'WARNING: 6',
+        // 'FINE: 7' is not loggable
+        // 'FINE: 8' is not loggable
+        'WARNING: 9',
+        'SHOUT: 10'
+      ]));
+
+      expect(aMessages, equals([
+        // 1,2 and 3 are lower in the hierarchy
+        // 'INFO: 4' is not loggable
+        'SEVERE: 5',
+        'WARNING: 6',
+        // 'FINE: 7' is not loggable
+        // 'FINE: 8' is not loggable
+        'WARNING: 9',
+        'SHOUT: 10'
+      ]));
+
+      expect(cMessages, equals([
+        // 1 - 7 are lower in the hierarchy
+        // 'FINE: 8' is not loggable
+        'WARNING: 9',
+        'SHOUT: 10'
+      ]));
+    });
+
+    test('message logging - lazy functions', () {
+      root.level = Level.INFO;
+      var messages = [];
+      root.onRecord.listen((record) {
+        messages.add('${record.level}: ${record.message}');
+      });
+
+      var callCount = 0;
+      var myClosure = () => "${++callCount}";
+
+      root.info(myClosure);
+      root.finer(myClosure); // Should not get evaluated.
+      root.warning(myClosure);
+
+      expect(messages, equals(['INFO: 1', 'WARNING: 2',]));
+    });
+
+    test('message logging - calls toString', () {
+      root.level = Level.INFO;
+      var messages = [];
+      root.onRecord.listen((record) {
+        messages.add('${record.level}: ${record.message}');
+      });
+
+      root.info(5);
+      root.info(false);
+      root.info([1, 2, 3]);
+      root.info(() => 10);
+
+      expect(messages,
+          equals(['INFO: 5', 'INFO: false', 'INFO: [1, 2, 3]', 'INFO: 10',]));
+    });
+  });
+
+  group('recordStackTraceAtLevel', () {
+    var root = Logger.root;
+    tearDown(() {
+      recordStackTraceAtLevel = Level.OFF;
+      root.clearListeners();
+    });
+
+    test('no stack trace by default', () {
+      var records = new List<LogRecord>();
+      root.onRecord.listen(records.add);
+      root.severe('hello');
+      root.warning('hello');
+      root.info('hello');
+      expect(records, hasLength(3));
+      expect(records[0].stackTrace, isNull);
+      expect(records[1].stackTrace, isNull);
+      expect(records[2].stackTrace, isNull);
+    });
+
+    test('trace recorded only on requested levels', () {
+      var records = new List<LogRecord>();
+      recordStackTraceAtLevel = Level.WARNING;
+      root.onRecord.listen(records.add);
+      root.severe('hello');
+      root.warning('hello');
+      root.info('hello');
+      expect(records, hasLength(3));
+      expect(records[0].stackTrace, isNotNull);
+      expect(records[1].stackTrace, isNotNull);
+      expect(records[2].stackTrace, isNull);
+    });
+
+    test('provided trace is used if given', () {
+      var trace;
+      try {
+        throw 'trace';
+      } catch(e, t) {
+        trace = t;
+      }
+      var records = new List<LogRecord>();
+      recordStackTraceAtLevel = Level.WARNING;
+      root.onRecord.listen(records.add);
+      root.severe('hello');
+      root.warning('hello', 'a', trace);
+      expect(records, hasLength(2));
+      expect(records[0].stackTrace, isNot(equals(trace)));
+      expect(records[1].stackTrace, trace);
+    });
+
+    test('error also generated when generating a trace', () {
+      var records = new List<LogRecord>();
+      recordStackTraceAtLevel = Level.WARNING;
+      root.onRecord.listen(records.add);
+      root.severe('hello');
+      root.warning('hello');
+      root.info('hello');
+      expect(records, hasLength(3));
+      expect(records[0].error, isNotNull);
+      expect(records[1].error, isNotNull);
+      expect(records[2].error, isNull);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/matcher/.gitignore b/mojo/public/dart/third_party/matcher/.gitignore
new file mode 100644
index 0000000..388eff0
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/.gitignore
@@ -0,0 +1,14 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.pub/
+build/
+packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/matcher/.status b/mojo/public/dart/third_party/matcher/.status
new file mode 100644
index 0000000..ddb02ed
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/.status
@@ -0,0 +1,18 @@
+# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Skip non-test files ending with "_test".
+packages/*: Skip
+*/packages/*: Skip
+*/*/packages/*: Skip
+*/*/*/packages/*: Skip
+*/*/*/*packages/*: Skip
+*/*/*/*/*packages/*: Skip
+
+# Only run tests from the build directory, since we don't care about the
+# difference between transformed an untransformed code.
+test/*: Skip
+
+[ $browser ]
+*: RuntimeError # new unittest package does not support browser tests
diff --git a/mojo/public/dart/third_party/matcher/CHANGELOG.md b/mojo/public/dart/third_party/matcher/CHANGELOG.md
new file mode 100644
index 0000000..1ccacda
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/CHANGELOG.md
@@ -0,0 +1,102 @@
+## 0.12.0+1
+
+* Fix test files to use `test` instead of `unittest` pkg.
+
+## 0.12.0
+
+* Moved a number of members to the
+  [`unittest`](https://pub.dartlang.org/packages/unittest) package.
+  * `TestFailure`, `ErrorFormatter`, `expect`, `fail`, and 'wrapAsync'.
+  * `completes`, `completion`, `throws`, and `throwsA` Matchers.
+  * The `Throws` class.
+  * All of the `throws...Error` Matchers.
+
+* Removed `FailureHandler`, `DefaultFailureHandler`,
+  `configureExpectFailureHandler`, and `getOrCreateExpectFailureHandler`.
+  Now that `expect` is in the `unittest` package, these are no longer needed.
+
+* Removed the `name` parameter for `isInstanceOf`. This was previously
+  deprecated, and is no longer necessary since all language implementations now
+  support converting the type parameter to a string directly.
+
+## 0.11.4+4
+
+* Deprecate the name parameter to `isInstanceOf`. All language implementations
+  now support converting the type parameter to a string directly.
+
+## 0.11.4+3
+
+* Fix the examples for `equalsIgnoringWhitespace`.
+
+## 0.11.4+2
+
+* Improve the formatting of strings that contain unprintable ASCII characters.
+
+## 0.11.4+1
+
+* Correctly match and print `String`s containing characters that must be
+  represented as escape sequences.
+
+## 0.11.4
+
+* Remove the type checks in the `isEmpty` and `isNotEmpty` matchers and simply
+  access the `isEmpty` respectively `isNotEmpty` fields. This allows them to
+  work with custom collections. See [Issue
+  21792](https://code.google.com/p/dart/issues/detail?id=21792) and [Issue
+  21562](https://code.google.com/p/dart/issues/detail?id=21562)
+
+## 0.11.3+1
+
+* Fix the `prints` matcher test on dart2js.
+
+## 0.11.3
+
+* Add a `prints` matcher that matches output a callback emits via `print`.
+
+## 0.11.2
+
+* Add an `isNotEmpty` matcher.
+
+## 0.11.1+1
+
+* Refactored libraries and tests.
+
+* Fixed spelling mistake.
+
+## 0.11.1
+
+* Added `isNaN` and `isNotNaN` matchers.
+
+## 0.11.0
+
+* Removed deprecated matchers.
+
+## 0.10.1+1
+
+* Get the tests passing when run on dart2js in minified mode.
+
+## 0.10.1
+
+* Compare sets order-independently when using `equals()`.
+
+## 0.10.0+3
+
+* Removed `@deprecated` annotation on matchers due to 
+[Issue 19173](https://code.google.com/p/dart/issues/detail?id=19173)
+
+## 0.10.0+2
+
+* Added types to a number of constants.
+
+## 0.10.0+1
+
+* Matchers related to bad language use have been removed. These represent code
+structure that should rarely or never be validated in tests.
+    * `isAbstractClassInstantiationError`
+    * `throwsAbstractClassInstantiationError`
+    * `isFallThroughError`
+    * `throwsFallThroughError`
+
+* Added types to a number of method arguments.
+
+* The structure of the library and test code has been updated.
diff --git a/mojo/public/dart/third_party/matcher/LICENSE b/mojo/public/dart/third_party/matcher/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/matcher/README.md b/mojo/public/dart/third_party/matcher/README.md
new file mode 100644
index 0000000..beff308
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/README.md
@@ -0,0 +1,7 @@
+Support for specifying test expectations, such as for unit tests.
+
+The matcher library provides a third-generation assertion mechanism, drawing
+inspiration from [Hamcrest](https://code.google.com/p/hamcrest/).
+
+For more information, see
+[Unit Testing with Dart](https://www.dartlang.org/articles/dart-unit-tests/).
diff --git a/mojo/public/dart/third_party/matcher/codereview.settings b/mojo/public/dart/third_party/matcher/codereview.settings
new file mode 100644
index 0000000..2fd4dde
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: https://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/matcher/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/matcher/lib/matcher.dart b/mojo/public/dart/third_party/matcher/lib/matcher.dart
new file mode 100644
index 0000000..c719fb1
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/lib/matcher.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Support for specifying test expectations, such as for unit tests.
+library matcher;
+
+export 'src/core_matchers.dart';
+export 'src/description.dart';
+export 'src/error_matchers.dart';
+export 'src/interfaces.dart';
+export 'src/iterable_matchers.dart';
+export 'src/map_matchers.dart';
+export 'src/numeric_matchers.dart';
+export 'src/operator_matchers.dart';
+export 'src/string_matchers.dart';
+export 'src/util.dart';
diff --git a/mojo/public/dart/third_party/matcher/lib/mirror_matchers.dart b/mojo/public/dart/third_party/matcher/lib/mirror_matchers.dart
new file mode 100644
index 0000000..d244831
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/lib/mirror_matchers.dart
@@ -0,0 +1,79 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// The mirror matchers library provides some additional matchers that
+/// make use of `dart:mirrors`.
+library matcher.mirror_matchers;
+
+import 'dart:mirrors';
+
+import 'matcher.dart';
+
+/// Returns a matcher that checks if a class instance has a property
+/// with name [name], and optionally, if that property in turn satisfies
+/// a [matcher].
+Matcher hasProperty(String name, [matcher]) =>
+    new _HasProperty(name, matcher == null ? null : wrapMatcher(matcher));
+
+class _HasProperty extends Matcher {
+  final String _name;
+  final Matcher _matcher;
+
+  const _HasProperty(this._name, [this._matcher]);
+
+  bool matches(item, Map matchState) {
+    var mirror = reflect(item);
+    var classMirror = mirror.type;
+    var symbol = new Symbol(_name);
+    var candidate = classMirror.declarations[symbol];
+    if (candidate == null) {
+      addStateInfo(matchState, {'reason': 'has no property named "$_name"'});
+      return false;
+    }
+    bool isInstanceField = candidate is VariableMirror && !candidate.isStatic;
+    bool isInstanceGetter =
+        candidate is MethodMirror && candidate.isGetter && !candidate.isStatic;
+    if (!(isInstanceField || isInstanceGetter)) {
+      addStateInfo(matchState, {
+        'reason':
+            'has a member named "$_name", but it is not an instance property'
+      });
+      return false;
+    }
+    if (_matcher == null) return true;
+    var result = mirror.getField(symbol);
+    var resultMatches = _matcher.matches(result.reflectee, matchState);
+    if (!resultMatches) {
+      addStateInfo(matchState, {'value': result.reflectee});
+    }
+    return resultMatches;
+  }
+
+  Description describe(Description description) {
+    description.add('has property "$_name"');
+    if (_matcher != null) {
+      description.add(' which matches ').addDescriptionOf(_matcher);
+    }
+    return description;
+  }
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    var reason = matchState == null ? null : matchState['reason'];
+    if (reason != null) {
+      mismatchDescription.add(reason);
+    } else {
+      mismatchDescription
+          .add('has property "$_name" with value ')
+          .addDescriptionOf(matchState['value']);
+      var innerDescription = new StringDescription();
+      _matcher.describeMismatch(
+          matchState['value'], innerDescription, matchState['state'], verbose);
+      if (innerDescription.length > 0) {
+        mismatchDescription.add(' which ').add(innerDescription.toString());
+      }
+    }
+    return mismatchDescription;
+  }
+}
diff --git a/mojo/public/dart/third_party/matcher/lib/src/core_matchers.dart b/mojo/public/dart/third_party/matcher/lib/src/core_matchers.dart
new file mode 100644
index 0000000..1b001f9
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/lib/src/core_matchers.dart
@@ -0,0 +1,643 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.core_matchers;
+
+import 'description.dart';
+import 'interfaces.dart';
+import 'util.dart';
+
+/// Returns a matcher that matches the isEmpty property.
+const Matcher isEmpty = const _Empty();
+
+class _Empty extends Matcher {
+  const _Empty();
+
+  bool matches(item, Map matchState) => item.isEmpty;
+
+  Description describe(Description description) => description.add('empty');
+}
+
+/// Returns a matcher that matches the isNotEmpty property.
+const Matcher isNotEmpty = const _NotEmpty();
+
+class _NotEmpty extends Matcher {
+  const _NotEmpty();
+
+  bool matches(item, Map matchState) => item.isNotEmpty;
+
+  Description describe(Description description) => description.add('non-empty');
+}
+
+/// A matcher that matches any null value.
+const Matcher isNull = const _IsNull();
+
+/// A matcher that matches any non-null value.
+const Matcher isNotNull = const _IsNotNull();
+
+class _IsNull extends Matcher {
+  const _IsNull();
+  bool matches(item, Map matchState) => item == null;
+  Description describe(Description description) => description.add('null');
+}
+
+class _IsNotNull extends Matcher {
+  const _IsNotNull();
+  bool matches(item, Map matchState) => item != null;
+  Description describe(Description description) => description.add('not null');
+}
+
+/// A matcher that matches the Boolean value true.
+const Matcher isTrue = const _IsTrue();
+
+/// A matcher that matches anything except the Boolean value true.
+const Matcher isFalse = const _IsFalse();
+
+class _IsTrue extends Matcher {
+  const _IsTrue();
+  bool matches(item, Map matchState) => item == true;
+  Description describe(Description description) => description.add('true');
+}
+
+class _IsFalse extends Matcher {
+  const _IsFalse();
+  bool matches(item, Map matchState) => item == false;
+  Description describe(Description description) => description.add('false');
+}
+
+/// A matcher that matches the numeric value NaN.
+const Matcher isNaN = const _IsNaN();
+
+/// A matcher that matches any non-NaN value.
+const Matcher isNotNaN = const _IsNotNaN();
+
+class _IsNaN extends Matcher {
+  const _IsNaN();
+  bool matches(item, Map matchState) => double.NAN.compareTo(item) == 0;
+  Description describe(Description description) => description.add('NaN');
+}
+
+class _IsNotNaN extends Matcher {
+  const _IsNotNaN();
+  bool matches(item, Map matchState) => double.NAN.compareTo(item) != 0;
+  Description describe(Description description) => description.add('not NaN');
+}
+
+/// Returns a matches that matches if the value is the same instance
+/// as [expected], using [identical].
+Matcher same(expected) => new _IsSameAs(expected);
+
+class _IsSameAs extends Matcher {
+  final _expected;
+  const _IsSameAs(this._expected);
+  bool matches(item, Map matchState) => identical(item, _expected);
+  // If all types were hashable we could show a hash here.
+  Description describe(Description description) =>
+      description.add('same instance as ').addDescriptionOf(_expected);
+}
+
+/// Returns a matcher that matches if the value is structurally equal to
+/// [expected].
+///
+/// If [expected] is a [Matcher], then it matches using that. Otherwise it tests
+/// for equality using `==` on the expected value.
+///
+/// For [Iterable]s and [Map]s, this will recursively match the elements. To
+/// handle cyclic structures a recursion depth [limit] can be provided. The
+/// default limit is 100. [Set]s will be compared order-independently.
+Matcher equals(expected, [int limit = 100]) => expected is String
+    ? new _StringEqualsMatcher(expected)
+    : new _DeepMatcher(expected, limit);
+
+class _DeepMatcher extends Matcher {
+  final _expected;
+  final int _limit;
+  var count;
+
+  _DeepMatcher(this._expected, [int limit = 1000]) : this._limit = limit;
+
+  // Returns a pair (reason, location)
+  List _compareIterables(expected, actual, matcher, depth, location) {
+    if (actual is! Iterable) return ['is not Iterable', location];
+
+    var expectedIterator = expected.iterator;
+    var actualIterator = actual.iterator;
+    for (var index = 0; ; index++) {
+      // Advance in lockstep.
+      var expectedNext = expectedIterator.moveNext();
+      var actualNext = actualIterator.moveNext();
+
+      // If we reached the end of both, we succeeded.
+      if (!expectedNext && !actualNext) return null;
+
+      // Fail if their lengths are different.
+      var newLocation = '${location}[${index}]';
+      if (!expectedNext) return ['longer than expected', newLocation];
+      if (!actualNext) return ['shorter than expected', newLocation];
+
+      // Match the elements.
+      var rp = matcher(
+          expectedIterator.current, actualIterator.current, newLocation, depth);
+      if (rp != null) return rp;
+    }
+  }
+
+  List _compareSets(Set expected, actual, matcher, depth, location) {
+    if (actual is! Iterable) return ['is not Iterable', location];
+    actual = actual.toSet();
+
+    for (var expectedElement in expected) {
+      if (actual.every((actualElement) =>
+          matcher(expectedElement, actualElement, location, depth) != null)) {
+        return ['does not contain $expectedElement', location];
+      }
+    }
+
+    if (actual.length > expected.length) {
+      return ['larger than expected', location];
+    } else if (actual.length < expected.length) {
+      return ['smaller than expected', location];
+    } else {
+      return null;
+    }
+  }
+
+  List _recursiveMatch(expected, actual, String location, int depth) {
+    // If the expected value is a matcher, try to match it.
+    if (expected is Matcher) {
+      var matchState = {};
+      if (expected.matches(actual, matchState)) return null;
+
+      var description = new StringDescription();
+      expected.describe(description);
+      return ['does not match $description', location];
+    } else {
+      // Otherwise, test for equality.
+      try {
+        if (expected == actual) return null;
+      } catch (e) {
+        // TODO(gram): Add a test for this case.
+        return ['== threw "$e"', location];
+      }
+    }
+
+    if (depth > _limit) return ['recursion depth limit exceeded', location];
+
+    // If _limit is 1 we can only recurse one level into object.
+    if (depth == 0 || _limit > 1) {
+      if (expected is Set) {
+        return _compareSets(
+            expected, actual, _recursiveMatch, depth + 1, location);
+      } else if (expected is Iterable) {
+        return _compareIterables(
+            expected, actual, _recursiveMatch, depth + 1, location);
+      } else if (expected is Map) {
+        if (actual is! Map) return ['expected a map', location];
+
+        var err = (expected.length == actual.length)
+            ? ''
+            : 'has different length and ';
+        for (var key in expected.keys) {
+          if (!actual.containsKey(key)) {
+            return ["${err}is missing map key '$key'", location];
+          }
+        }
+
+        for (var key in actual.keys) {
+          if (!expected.containsKey(key)) {
+            return ["${err}has extra map key '$key'", location];
+          }
+        }
+
+        for (var key in expected.keys) {
+          var rp = _recursiveMatch(
+              expected[key], actual[key], "${location}['${key}']", depth + 1);
+          if (rp != null) return rp;
+        }
+
+        return null;
+      }
+    }
+
+    var description = new StringDescription();
+
+    // If we have recursed, show the expected value too; if not, expect() will
+    // show it for us.
+    if (depth > 0) {
+      description
+          .add('was ')
+          .addDescriptionOf(actual)
+          .add(' instead of ')
+          .addDescriptionOf(expected);
+      return [description.toString(), location];
+    }
+
+    // We're not adding any value to the actual value.
+    return ["", location];
+  }
+
+  String _match(expected, actual, Map matchState) {
+    var rp = _recursiveMatch(expected, actual, '', 0);
+    if (rp == null) return null;
+    var reason;
+    if (rp[0].length > 0) {
+      if (rp[1].length > 0) {
+        reason = "${rp[0]} at location ${rp[1]}";
+      } else {
+        reason = rp[0];
+      }
+    } else {
+      reason = '';
+    }
+    // Cache the failure reason in the matchState.
+    addStateInfo(matchState, {'reason': reason});
+    return reason;
+  }
+
+  bool matches(item, Map matchState) =>
+      _match(_expected, item, matchState) == null;
+
+  Description describe(Description description) =>
+      description.addDescriptionOf(_expected);
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    var reason = matchState['reason'];
+    // If we didn't get a good reason, that would normally be a
+    // simple 'is <value>' message. We only add that if the mismatch
+    // description is non empty (so we are supplementing the mismatch
+    // description).
+    if (reason.length == 0 && mismatchDescription.length > 0) {
+      mismatchDescription.add('is ').addDescriptionOf(item);
+    } else {
+      mismatchDescription.add(reason);
+    }
+    return mismatchDescription;
+  }
+}
+
+/// A special equality matcher for strings.
+class _StringEqualsMatcher extends Matcher {
+  final String _value;
+
+  _StringEqualsMatcher(this._value);
+
+  bool get showActualValue => true;
+
+  bool matches(item, Map matchState) => _value == item;
+
+  Description describe(Description description) =>
+      description.addDescriptionOf(_value);
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (item is! String) {
+      return mismatchDescription.addDescriptionOf(item).add('is not a string');
+    } else {
+      var buff = new StringBuffer();
+      buff.write('is different.');
+      var escapedItem = escape(item);
+      var escapedValue = escape(_value);
+      int minLength = escapedItem.length < escapedValue.length
+          ? escapedItem.length
+          : escapedValue.length;
+      var start = 0;
+      for (; start < minLength; start++) {
+        if (escapedValue.codeUnitAt(start) != escapedItem.codeUnitAt(start)) {
+          break;
+        }
+      }
+      if (start == minLength) {
+        if (escapedValue.length < escapedItem.length) {
+          buff.write(' Both strings start the same, but the given value also'
+              ' has the following trailing characters: ');
+          _writeTrailing(buff, escapedItem, escapedValue.length);
+        } else {
+          buff.write(' Both strings start the same, but the given value is'
+              ' missing the following trailing characters: ');
+          _writeTrailing(buff, escapedValue, escapedItem.length);
+        }
+      } else {
+        buff.write('\nExpected: ');
+        _writeLeading(buff, escapedValue, start);
+        _writeTrailing(buff, escapedValue, start);
+        buff.write('\n  Actual: ');
+        _writeLeading(buff, escapedItem, start);
+        _writeTrailing(buff, escapedItem, start);
+        buff.write('\n          ');
+        for (int i = (start > 10 ? 14 : start); i > 0; i--) buff.write(' ');
+        buff.write('^\n Differ at offset $start');
+      }
+
+      return mismatchDescription.replace(buff.toString());
+    }
+  }
+
+  static void _writeLeading(StringBuffer buff, String s, int start) {
+    if (start > 10) {
+      buff.write('... ');
+      buff.write(s.substring(start - 10, start));
+    } else {
+      buff.write(s.substring(0, start));
+    }
+  }
+
+  static void _writeTrailing(StringBuffer buff, String s, int start) {
+    if (start + 10 > s.length) {
+      buff.write(s.substring(start));
+    } else {
+      buff.write(s.substring(start, start + 10));
+      buff.write(' ...');
+    }
+  }
+}
+
+/// A matcher that matches any value.
+const Matcher anything = const _IsAnything();
+
+class _IsAnything extends Matcher {
+  const _IsAnything();
+  bool matches(item, Map matchState) => true;
+  Description describe(Description description) => description.add('anything');
+}
+
+/// Returns a matcher that matches if an object is an instance
+/// of [type] (or a subtype).
+///
+/// As types are not first class objects in Dart we can only
+/// approximate this test by using a generic wrapper class.
+///
+/// For example, to test whether 'bar' is an instance of type
+/// 'Foo', we would write:
+///
+///     expect(bar, new isInstanceOf<Foo>());
+class isInstanceOf<T> extends Matcher {
+  const isInstanceOf();
+
+  bool matches(obj, Map matchState) => obj is T;
+
+  Description describe(Description description) =>
+      description.add('an instance of $T');
+}
+
+/// A matcher that matches a function call against no exception.
+///
+/// The function will be called once. Any exceptions will be silently swallowed.
+/// The value passed to expect() should be a reference to the function.
+/// Note that the function cannot take arguments; to handle this
+/// a wrapper will have to be created.
+const Matcher returnsNormally = const _ReturnsNormally();
+
+class _ReturnsNormally extends Matcher {
+  const _ReturnsNormally();
+
+  bool matches(f, Map matchState) {
+    try {
+      f();
+      return true;
+    } catch (e, s) {
+      addStateInfo(matchState, {'exception': e, 'stack': s});
+      return false;
+    }
+  }
+
+  Description describe(Description description) =>
+      description.add("return normally");
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    mismatchDescription.add('threw ').addDescriptionOf(matchState['exception']);
+    if (verbose) {
+      mismatchDescription.add(' at ').add(matchState['stack'].toString());
+    }
+    return mismatchDescription;
+  }
+}
+
+/*
+ * Matchers for different exception types. Ideally we should just be able to
+ * use something like:
+ *
+ * final Matcher throwsException =
+ *     const _Throws(const isInstanceOf<Exception>());
+ *
+ * Unfortunately instanceOf is not working with dart2js.
+ *
+ * Alternatively, if static functions could be used in const expressions,
+ * we could use:
+ *
+ * bool _isException(x) => x is Exception;
+ * final Matcher isException = const _Predicate(_isException, "Exception");
+ * final Matcher throwsException = const _Throws(isException);
+ *
+ * But currently using static functions in const expressions is not supported.
+ * For now the only solution for all platforms seems to be separate classes
+ * for each exception type.
+ */
+
+abstract class TypeMatcher extends Matcher {
+  final String _name;
+  const TypeMatcher(this._name);
+  Description describe(Description description) => description.add(_name);
+}
+
+/// A matcher for Map types.
+const Matcher isMap = const _IsMap();
+
+class _IsMap extends TypeMatcher {
+  const _IsMap() : super("Map");
+  bool matches(item, Map matchState) => item is Map;
+}
+
+/// A matcher for List types.
+const Matcher isList = const _IsList();
+
+class _IsList extends TypeMatcher {
+  const _IsList() : super("List");
+  bool matches(item, Map matchState) => item is List;
+}
+
+/// Returns a matcher that matches if an object has a length property
+/// that matches [matcher].
+Matcher hasLength(matcher) => new _HasLength(wrapMatcher(matcher));
+
+class _HasLength extends Matcher {
+  final Matcher _matcher;
+  const _HasLength([Matcher matcher = null]) : this._matcher = matcher;
+
+  bool matches(item, Map matchState) {
+    try {
+      // This is harmless code that will throw if no length property
+      // but subtle enough that an optimizer shouldn't strip it out.
+      if (item.length * item.length >= 0) {
+        return _matcher.matches(item.length, matchState);
+      }
+    } catch (e) {}
+    return false;
+  }
+
+  Description describe(Description description) =>
+      description.add('an object with length of ').addDescriptionOf(_matcher);
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    try {
+      // We want to generate a different description if there is no length
+      // property; we use the same trick as in matches().
+      if (item.length * item.length >= 0) {
+        return mismatchDescription
+            .add('has length of ')
+            .addDescriptionOf(item.length);
+      }
+    } catch (e) {}
+    return mismatchDescription.add('has no length property');
+  }
+}
+
+/// Returns a matcher that matches if the match argument contains the expected
+/// value.
+///
+/// For [String]s this means substring matching;
+/// for [Map]s it means the map has the key, and for [Iterable]s
+/// it means the iterable has a matching element. In the case of iterables,
+/// [expected] can itself be a matcher.
+Matcher contains(expected) => new _Contains(expected);
+
+class _Contains extends Matcher {
+  final _expected;
+
+  const _Contains(this._expected);
+
+  bool matches(item, Map matchState) {
+    if (item is String) {
+      return item.indexOf(_expected) >= 0;
+    } else if (item is Iterable) {
+      if (_expected is Matcher) {
+        return item.any((e) => _expected.matches(e, matchState));
+      } else {
+        return item.contains(_expected);
+      }
+    } else if (item is Map) {
+      return item.containsKey(_expected);
+    }
+    return false;
+  }
+
+  Description describe(Description description) =>
+      description.add('contains ').addDescriptionOf(_expected);
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (item is String || item is Iterable || item is Map) {
+      return super.describeMismatch(
+          item, mismatchDescription, matchState, verbose);
+    } else {
+      return mismatchDescription.add('is not a string, map or iterable');
+    }
+  }
+}
+
+/// Returns a matcher that matches if the match argument is in
+/// the expected value. This is the converse of [contains].
+Matcher isIn(expected) => new _In(expected);
+
+class _In extends Matcher {
+  final _expected;
+
+  const _In(this._expected);
+
+  bool matches(item, Map matchState) {
+    if (_expected is String) {
+      return _expected.indexOf(item) >= 0;
+    } else if (_expected is Iterable) {
+      return _expected.any((e) => e == item);
+    } else if (_expected is Map) {
+      return _expected.containsKey(item);
+    }
+    return false;
+  }
+
+  Description describe(Description description) =>
+      description.add('is in ').addDescriptionOf(_expected);
+}
+
+/// Returns a matcher that uses an arbitrary function that returns
+/// true or false for the actual value.
+///
+/// For example:
+///
+///     expect(v, predicate((x) => ((x % 2) == 0), "is even"))
+Matcher predicate(bool f(value), [String description = 'satisfies function']) =>
+    new _Predicate(f, description);
+
+typedef bool _PredicateFunction(value);
+
+class _Predicate extends Matcher {
+  final _PredicateFunction _matcher;
+  final String _description;
+
+  const _Predicate(this._matcher, this._description);
+
+  bool matches(item, Map matchState) => _matcher(item);
+
+  Description describe(Description description) =>
+      description.add(_description);
+}
+
+/// A useful utility class for implementing other matchers through inheritance.
+/// Derived classes should call the base constructor with a feature name and
+/// description, and an instance matcher, and should implement the
+/// [featureValueOf] abstract method.
+///
+/// The feature description will typically describe the item and the feature,
+/// while the feature name will just name the feature. For example, we may
+/// have a Widget class where each Widget has a price; we could make a
+/// [CustomMatcher] that can make assertions about prices with:
+///
+///     class HasPrice extends CustomMatcher {
+///       const HasPrice(matcher) :
+///           super("Widget with price that is", "price", matcher);
+///       featureValueOf(actual) => actual.price;
+///     }
+///
+/// and then use this for example like:
+///
+///      expect(inventoryItem, new HasPrice(greaterThan(0)));
+class CustomMatcher extends Matcher {
+  final String _featureDescription;
+  final String _featureName;
+  final Matcher _matcher;
+
+  CustomMatcher(this._featureDescription, this._featureName, matcher)
+      : this._matcher = wrapMatcher(matcher);
+
+  /// Override this to extract the interesting feature.
+  featureValueOf(actual) => actual;
+
+  bool matches(item, Map matchState) {
+    var f = featureValueOf(item);
+    if (_matcher.matches(f, matchState)) return true;
+    addStateInfo(matchState, {'feature': f});
+    return false;
+  }
+
+  Description describe(Description description) =>
+      description.add(_featureDescription).add(' ').addDescriptionOf(_matcher);
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    mismatchDescription
+        .add('has ')
+        .add(_featureName)
+        .add(' with value ')
+        .addDescriptionOf(matchState['feature']);
+    var innerDescription = new StringDescription();
+    _matcher.describeMismatch(
+        matchState['feature'], innerDescription, matchState['state'], verbose);
+    if (innerDescription.length > 0) {
+      mismatchDescription.add(' which ').add(innerDescription.toString());
+    }
+    return mismatchDescription;
+  }
+}
diff --git a/mojo/public/dart/third_party/matcher/lib/src/description.dart b/mojo/public/dart/third_party/matcher/lib/src/description.dart
new file mode 100644
index 0000000..1da5a3a
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/lib/src/description.dart
@@ -0,0 +1,68 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.description;
+
+import 'interfaces.dart';
+import 'pretty_print.dart';
+
+/// The default implementation of [Description]. This should rarely need
+/// substitution, although conceivably it is a place where other languages
+/// could be supported.
+class StringDescription implements Description {
+  final StringBuffer _out = new StringBuffer();
+
+  /// Initialize the description with initial contents [init].
+  StringDescription([String init = '']) {
+    _out.write(init);
+  }
+
+  int get length => _out.length;
+
+  /// Get the description as a string.
+  String toString() => _out.toString();
+
+  /// Append [text] to the description.
+  Description add(String text) {
+    _out.write(text);
+    return this;
+  }
+
+  /// Change the value of the description.
+  Description replace(String text) {
+    _out.clear();
+    return add(text);
+  }
+
+  /// Appends a description of [value]. If it is an IMatcher use its
+  /// describe method; if it is a string use its literal value after
+  /// escaping any embedded control characters; otherwise use its
+  /// toString() value and wrap it in angular "quotes".
+  Description addDescriptionOf(value) {
+    if (value is Matcher) {
+      value.describe(this);
+    } else {
+      add(prettyPrint(value, maxLineLength: 80, maxItems: 25));
+    }
+    return this;
+  }
+
+  /// Append an [Iterable] [list] of objects to the description, using the
+  /// specified [separator] and framing the list with [start]
+  /// and [end].
+  Description addAll(
+      String start, String separator, String end, Iterable list) {
+    var separate = false;
+    add(start);
+    for (var item in list) {
+      if (separate) {
+        add(separator);
+      }
+      addDescriptionOf(item);
+      separate = true;
+    }
+    add(end);
+    return this;
+  }
+}
diff --git a/mojo/public/dart/third_party/matcher/lib/src/error_matchers.dart b/mojo/public/dart/third_party/matcher/lib/src/error_matchers.dart
new file mode 100644
index 0000000..821e731
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/lib/src/error_matchers.dart
@@ -0,0 +1,97 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.error_matchers;
+
+import 'core_matchers.dart';
+import 'interfaces.dart';
+
+/// A matcher for ArgumentErrors.
+const Matcher isArgumentError = const _ArgumentError();
+
+class _ArgumentError extends TypeMatcher {
+  const _ArgumentError() : super("ArgumentError");
+  bool matches(item, Map matchState) => item is ArgumentError;
+}
+
+/// A matcher for ConcurrentModificationError.
+const Matcher isConcurrentModificationError =
+    const _ConcurrentModificationError();
+
+class _ConcurrentModificationError extends TypeMatcher {
+  const _ConcurrentModificationError() : super("ConcurrentModificationError");
+  bool matches(item, Map matchState) => item is ConcurrentModificationError;
+}
+
+/// A matcher for CyclicInitializationError.
+const Matcher isCyclicInitializationError = const _CyclicInitializationError();
+
+class _CyclicInitializationError extends TypeMatcher {
+  const _CyclicInitializationError() : super("CyclicInitializationError");
+  bool matches(item, Map matchState) => item is CyclicInitializationError;
+}
+
+/// A matcher for Exceptions.
+const Matcher isException = const _Exception();
+
+class _Exception extends TypeMatcher {
+  const _Exception() : super("Exception");
+  bool matches(item, Map matchState) => item is Exception;
+}
+
+/// A matcher for FormatExceptions.
+const Matcher isFormatException = const _FormatException();
+
+class _FormatException extends TypeMatcher {
+  const _FormatException() : super("FormatException");
+  bool matches(item, Map matchState) => item is FormatException;
+}
+
+/// A matcher for NoSuchMethodErrors.
+const Matcher isNoSuchMethodError = const _NoSuchMethodError();
+
+class _NoSuchMethodError extends TypeMatcher {
+  const _NoSuchMethodError() : super("NoSuchMethodError");
+  bool matches(item, Map matchState) => item is NoSuchMethodError;
+}
+
+/// A matcher for NullThrownError.
+const Matcher isNullThrownError = const _NullThrownError();
+
+class _NullThrownError extends TypeMatcher {
+  const _NullThrownError() : super("NullThrownError");
+  bool matches(item, Map matchState) => item is NullThrownError;
+}
+
+/// A matcher for RangeErrors.
+const Matcher isRangeError = const _RangeError();
+
+class _RangeError extends TypeMatcher {
+  const _RangeError() : super("RangeError");
+  bool matches(item, Map matchState) => item is RangeError;
+}
+
+/// A matcher for StateErrors.
+const Matcher isStateError = const _StateError();
+
+class _StateError extends TypeMatcher {
+  const _StateError() : super("StateError");
+  bool matches(item, Map matchState) => item is StateError;
+}
+
+/// A matcher for UnimplementedErrors.
+const Matcher isUnimplementedError = const _UnimplementedError();
+
+class _UnimplementedError extends TypeMatcher {
+  const _UnimplementedError() : super("UnimplementedError");
+  bool matches(item, Map matchState) => item is UnimplementedError;
+}
+
+/// A matcher for UnsupportedError.
+const Matcher isUnsupportedError = const _UnsupportedError();
+
+class _UnsupportedError extends TypeMatcher {
+  const _UnsupportedError() : super("UnsupportedError");
+  bool matches(item, Map matchState) => item is UnsupportedError;
+}
diff --git a/mojo/public/dart/third_party/matcher/lib/src/interfaces.dart b/mojo/public/dart/third_party/matcher/lib/src/interfaces.dart
new file mode 100644
index 0000000..984d862
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/lib/src/interfaces.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.interfaces;
+
+// To decouple the reporting of errors, and allow for extensibility of
+// matchers, we make use of some interfaces.
+
+/// Matchers build up their error messages by appending to
+/// Description objects. This interface is implemented by
+/// StringDescription. This interface is unlikely to need
+/// other implementations, but could be useful to replace in
+/// some cases - e.g. language conversion.
+abstract class Description {
+  int get length;
+
+  /// Change the value of the description.
+  Description replace(String text);
+
+  /// This is used to add arbitrary text to the description.
+  Description add(String text);
+
+  /// This is used to add a meaningful description of a value.
+  Description addDescriptionOf(value);
+
+  /// This is used to add a description of an [Iterable] [list],
+  /// with appropriate [start] and [end] markers and inter-element [separator].
+  Description addAll(String start, String separator, String end, Iterable list);
+}
+
+/// [expect] Matchers must implement/extend the Matcher class.
+/// The base Matcher class has a generic implementation of [describeMismatch]
+/// so this does not need to be provided unless a more clear description is
+/// required. The other two methods ([matches] and [describe])
+/// must always be provided as they are highly matcher-specific.
+abstract class Matcher {
+  const Matcher();
+
+  /// This does the matching of the actual vs expected values.
+  /// [item] is the actual value. [matchState] can be supplied
+  /// and may be used to add details about the mismatch that are too
+  /// costly to determine in [describeMismatch].
+  bool matches(item, Map matchState);
+
+  /// This builds a textual description of the matcher.
+  Description describe(Description description);
+
+  /// This builds a textual description of a specific mismatch. [item]
+  /// is the value that was tested by [matches]; [matchState] is
+  /// the [Map] that was passed to and supplemented by [matches]
+  /// with additional information about the mismatch, and [mismatchDescription]
+  /// is the [Description] that is being built to decribe the mismatch.
+  /// A few matchers make use of the [verbose] flag to provide detailed
+  /// information that is not typically included but can be of help in
+  /// diagnosing failures, such as stack traces.
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) =>
+      mismatchDescription;
+}
diff --git a/mojo/public/dart/third_party/matcher/lib/src/iterable_matchers.dart b/mojo/public/dart/third_party/matcher/lib/src/iterable_matchers.dart
new file mode 100644
index 0000000..7185e92
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/lib/src/iterable_matchers.dart
@@ -0,0 +1,267 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.iterable_matchers;
+
+import 'core_matchers.dart';
+import 'description.dart';
+import 'interfaces.dart';
+import 'util.dart';
+
+/// Returns a matcher which matches [Iterable]s in which all elements
+/// match the given [matcher].
+Matcher everyElement(matcher) => new _EveryElement(wrapMatcher(matcher));
+
+class _EveryElement extends _IterableMatcher {
+  final Matcher _matcher;
+
+  _EveryElement(Matcher this._matcher);
+
+  bool matches(item, Map matchState) {
+    if (item is! Iterable) {
+      return false;
+    }
+    var i = 0;
+    for (var element in item) {
+      if (!_matcher.matches(element, matchState)) {
+        addStateInfo(matchState, {'index': i, 'element': element});
+        return false;
+      }
+      ++i;
+    }
+    return true;
+  }
+
+  Description describe(Description description) =>
+      description.add('every element(').addDescriptionOf(_matcher).add(')');
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (matchState['index'] != null) {
+      var index = matchState['index'];
+      var element = matchState['element'];
+      mismatchDescription
+          .add('has value ')
+          .addDescriptionOf(element)
+          .add(' which ');
+      var subDescription = new StringDescription();
+      _matcher.describeMismatch(
+          element, subDescription, matchState['state'], verbose);
+      if (subDescription.length > 0) {
+        mismatchDescription.add(subDescription.toString());
+      } else {
+        mismatchDescription.add("doesn't match ");
+        _matcher.describe(mismatchDescription);
+      }
+      mismatchDescription.add(' at index $index');
+      return mismatchDescription;
+    }
+    return super.describeMismatch(
+        item, mismatchDescription, matchState, verbose);
+  }
+}
+
+/// Returns a matcher which matches [Iterable]s in which at least one
+/// element matches the given [matcher].
+Matcher anyElement(matcher) => new _AnyElement(wrapMatcher(matcher));
+
+class _AnyElement extends _IterableMatcher {
+  final Matcher _matcher;
+
+  _AnyElement(this._matcher);
+
+  bool matches(item, Map matchState) {
+    return item.any((e) => _matcher.matches(e, matchState));
+  }
+
+  Description describe(Description description) =>
+      description.add('some element ').addDescriptionOf(_matcher);
+}
+
+/// Returns a matcher which matches [Iterable]s that have the same
+/// length and the same elements as [expected], in the same order.
+///
+/// This is equivalent to [equals] but does not recurse.
+Matcher orderedEquals(Iterable expected) => new _OrderedEquals(expected);
+
+class _OrderedEquals extends Matcher {
+  final Iterable _expected;
+  Matcher _matcher;
+
+  _OrderedEquals(this._expected) {
+    _matcher = equals(_expected, 1);
+  }
+
+  bool matches(item, Map matchState) =>
+      (item is Iterable) && _matcher.matches(item, matchState);
+
+  Description describe(Description description) =>
+      description.add('equals ').addDescriptionOf(_expected).add(' ordered');
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (item is! Iterable) {
+      return mismatchDescription.add('is not an Iterable');
+    } else {
+      return _matcher.describeMismatch(
+          item, mismatchDescription, matchState, verbose);
+    }
+  }
+}
+
+/// Returns a matcher which matches [Iterable]s that have the same length and
+/// the same elements as [expected], but not necessarily in the same order.
+///
+/// Note that this is O(n^2) so should only be used on small objects.
+Matcher unorderedEquals(Iterable expected) => new _UnorderedEquals(expected);
+
+class _UnorderedEquals extends _UnorderedMatches {
+  final List _expectedValues;
+
+  _UnorderedEquals(Iterable expected)
+      : _expectedValues = expected.toList(),
+        super(expected.map(equals));
+
+  Description describe(Description description) => description
+      .add('equals ')
+      .addDescriptionOf(_expectedValues)
+      .add(' unordered');
+}
+
+/// Iterable matchers match against [Iterable]s. We add this intermediate
+/// class to give better mismatch error messages than the base Matcher class.
+abstract class _IterableMatcher extends Matcher {
+  const _IterableMatcher();
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (item is! Iterable) {
+      return mismatchDescription.addDescriptionOf(item).add(' not an Iterable');
+    } else {
+      return super.describeMismatch(
+          item, mismatchDescription, matchState, verbose);
+    }
+  }
+}
+
+/// Returns a matcher which matches [Iterable]s whose elements match the
+/// matchers in [expected], but not necessarily in the same order.
+///
+///  Note that this is `O(n^2)` and so should only be used on small objects.
+Matcher unorderedMatches(Iterable expected) => new _UnorderedMatches(expected);
+
+class _UnorderedMatches extends Matcher {
+  final List<Matcher> _expected;
+
+  _UnorderedMatches(Iterable expected)
+      : _expected = expected.map(wrapMatcher).toList();
+
+  String _test(item) {
+    if (item is! Iterable) return 'not iterable';
+    item = item.toList();
+
+    // Check the lengths are the same.
+    if (_expected.length > item.length) {
+      return 'has too few elements (${item.length} < ${_expected.length})';
+    } else if (_expected.length < item.length) {
+      return 'has too many elements (${item.length} > ${_expected.length})';
+    }
+
+    var matched = new List<bool>.filled(item.length, false);
+    var expectedPosition = 0;
+    for (var expectedMatcher in _expected) {
+      var actualPosition = 0;
+      var gotMatch = false;
+      for (var actualElement in item) {
+        if (!matched[actualPosition]) {
+          if (expectedMatcher.matches(actualElement, {})) {
+            matched[actualPosition] = gotMatch = true;
+            break;
+          }
+        }
+        ++actualPosition;
+      }
+
+      if (!gotMatch) {
+        return new StringDescription()
+            .add('has no match for ')
+            .addDescriptionOf(expectedMatcher)
+            .add(' at index ${expectedPosition}')
+            .toString();
+      }
+
+      ++expectedPosition;
+    }
+    return null;
+  }
+
+  bool matches(item, Map mismatchState) => _test(item) == null;
+
+  Description describe(Description description) => description
+      .add('matches ')
+      .addAll('[', ', ', ']', _expected)
+      .add(' unordered');
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) =>
+      mismatchDescription.add(_test(item));
+}
+
+/// A pairwise matcher for [Iterable]s.
+///
+/// The [comparator] function, taking an expected and an actual argument, and
+/// returning whether they match, will be applied to each pair in order.
+/// [description] should be a meaningful name for the comparator.
+Matcher pairwiseCompare(
+    Iterable expected, bool comparator(a, b), String description) =>
+        new _PairwiseCompare(expected, comparator, description);
+
+typedef bool _Comparator(a, b);
+
+class _PairwiseCompare extends _IterableMatcher {
+  final Iterable _expected;
+  final _Comparator _comparator;
+  final String _description;
+
+  _PairwiseCompare(this._expected, this._comparator, this._description);
+
+  bool matches(item, Map matchState) {
+    if (item is! Iterable) return false;
+    if (item.length != _expected.length) return false;
+    var iterator = item.iterator;
+    var i = 0;
+    for (var e in _expected) {
+      iterator.moveNext();
+      if (!_comparator(e, iterator.current)) {
+        addStateInfo(matchState, {
+          'index': i,
+          'expected': e,
+          'actual': iterator.current
+        });
+        return false;
+      }
+      i++;
+    }
+    return true;
+  }
+
+  Description describe(Description description) =>
+      description.add('pairwise $_description ').addDescriptionOf(_expected);
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (item is! Iterable) {
+      return mismatchDescription.add('is not an Iterable');
+    } else if (item.length != _expected.length) {
+      return mismatchDescription
+          .add('has length ${item.length} instead of ${_expected.length}');
+    } else {
+      return mismatchDescription
+          .add('has ')
+          .addDescriptionOf(matchState["actual"])
+          .add(' which is not $_description ')
+          .addDescriptionOf(matchState["expected"])
+          .add(' at index ${matchState["index"]}');
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/matcher/lib/src/map_matchers.dart b/mojo/public/dart/third_party/matcher/lib/src/map_matchers.dart
new file mode 100644
index 0000000..8facbf5
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/lib/src/map_matchers.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.map_matchers;
+
+import 'interfaces.dart';
+import 'util.dart';
+
+/// Returns a matcher which matches maps containing the given [value].
+Matcher containsValue(value) => new _ContainsValue(value);
+
+class _ContainsValue extends Matcher {
+  final _value;
+
+  const _ContainsValue(this._value);
+
+  bool matches(item, Map matchState) => item.containsValue(_value);
+  Description describe(Description description) =>
+      description.add('contains value ').addDescriptionOf(_value);
+}
+
+/// Returns a matcher which matches maps containing the key-value pair
+/// with [key] => [value].
+Matcher containsPair(key, value) =>
+    new _ContainsMapping(key, wrapMatcher(value));
+
+class _ContainsMapping extends Matcher {
+  final _key;
+  final Matcher _valueMatcher;
+
+  const _ContainsMapping(this._key, Matcher this._valueMatcher);
+
+  bool matches(item, Map matchState) =>
+      item.containsKey(_key) && _valueMatcher.matches(item[_key], matchState);
+
+  Description describe(Description description) {
+    return description
+        .add('contains pair ')
+        .addDescriptionOf(_key)
+        .add(' => ')
+        .addDescriptionOf(_valueMatcher);
+  }
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (!item.containsKey(_key)) {
+      return mismatchDescription
+          .add(" doesn't contain key ")
+          .addDescriptionOf(_key);
+    } else {
+      mismatchDescription
+          .add(' contains key ')
+          .addDescriptionOf(_key)
+          .add(' but with value ');
+      _valueMatcher.describeMismatch(
+          item[_key], mismatchDescription, matchState, verbose);
+      return mismatchDescription;
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/matcher/lib/src/numeric_matchers.dart b/mojo/public/dart/third_party/matcher/lib/src/numeric_matchers.dart
new file mode 100644
index 0000000..770999d
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/lib/src/numeric_matchers.dart
@@ -0,0 +1,202 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.numeric_matchers;
+
+import 'interfaces.dart';
+
+/// Returns a matcher which matches if the match argument is greater
+/// than the given [value].
+Matcher greaterThan(value) =>
+    new _OrderingComparison(value, false, false, true, 'a value greater than');
+
+/// Returns a matcher which matches if the match argument is greater
+/// than or equal to the given [value].
+Matcher greaterThanOrEqualTo(value) => new _OrderingComparison(
+    value, true, false, true, 'a value greater than or equal to');
+
+/// Returns a matcher which matches if the match argument is less
+/// than the given [value].
+Matcher lessThan(value) =>
+    new _OrderingComparison(value, false, true, false, 'a value less than');
+
+/// Returns a matcher which matches if the match argument is less
+/// than or equal to the given [value].
+Matcher lessThanOrEqualTo(value) => new _OrderingComparison(
+    value, true, true, false, 'a value less than or equal to');
+
+/// A matcher which matches if the match argument is zero.
+const Matcher isZero =
+    const _OrderingComparison(0, true, false, false, 'a value equal to');
+
+/// A matcher which matches if the match argument is non-zero.
+const Matcher isNonZero =
+    const _OrderingComparison(0, false, true, true, 'a value not equal to');
+
+/// A matcher which matches if the match argument is positive.
+const Matcher isPositive =
+    const _OrderingComparison(0, false, false, true, 'a positive value', false);
+
+/// A matcher which matches if the match argument is zero or negative.
+const Matcher isNonPositive = const _OrderingComparison(
+    0, true, true, false, 'a non-positive value', false);
+
+/// A matcher which matches if the match argument is negative.
+const Matcher isNegative =
+    const _OrderingComparison(0, false, true, false, 'a negative value', false);
+
+/// A matcher which matches if the match argument is zero or positive.
+const Matcher isNonNegative = const _OrderingComparison(
+    0, true, false, true, 'a non-negative value', false);
+
+bool _isNumeric(value) {
+  return value is num;
+}
+
+// TODO(kevmoo) Note that matchers that use _OrderingComparison only use
+// `==` and `<` operators to evaluate the match. Or change the matcher.
+class _OrderingComparison extends Matcher {
+  /// Expected value.
+  final _value;
+  /// What to return if actual == expected
+  final bool _equalValue;
+  /// What to return if actual < expected
+  final bool _lessThanValue;
+  /// What to return if actual > expected
+  final bool _greaterThanValue;
+  /// Textual name of the inequality
+  final String _comparisonDescription;
+  /// Whether to include the expected value in the description
+  final bool _valueInDescription;
+
+  const _OrderingComparison(this._value, this._equalValue, this._lessThanValue,
+      this._greaterThanValue, this._comparisonDescription,
+      [bool valueInDescription = true])
+      : this._valueInDescription = valueInDescription;
+
+  bool matches(item, Map matchState) {
+    if (item == _value) {
+      return _equalValue;
+    } else if (item < _value) {
+      return _lessThanValue;
+    } else {
+      return _greaterThanValue;
+    }
+  }
+
+  Description describe(Description description) {
+    if (_valueInDescription) {
+      return description
+          .add(_comparisonDescription)
+          .add(' ')
+          .addDescriptionOf(_value);
+    } else {
+      return description.add(_comparisonDescription);
+    }
+  }
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    mismatchDescription.add('is not ');
+    return describe(mismatchDescription);
+  }
+}
+
+/// Returns a matcher which matches if the match argument is within [delta]
+/// of some [value].
+///
+/// In other words, this matches if the match argument is greater than
+/// than or equal [value]-[delta] and less than or equal to [value]+[delta].
+Matcher closeTo(num value, num delta) => new _IsCloseTo(value, delta);
+
+class _IsCloseTo extends Matcher {
+  final num _value, _delta;
+
+  const _IsCloseTo(this._value, this._delta);
+
+  bool matches(item, Map matchState) {
+    if (!_isNumeric(item)) {
+      return false;
+    }
+    var diff = item - _value;
+    if (diff < 0) diff = -diff;
+    return (diff <= _delta);
+  }
+
+  Description describe(Description description) => description
+      .add('a numeric value within ')
+      .addDescriptionOf(_delta)
+      .add(' of ')
+      .addDescriptionOf(_value);
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (item is! num) {
+      return mismatchDescription.add(' not numeric');
+    } else {
+      var diff = item - _value;
+      if (diff < 0) diff = -diff;
+      return mismatchDescription.add(' differs by ').addDescriptionOf(diff);
+    }
+  }
+}
+
+/// Returns a matcher which matches if the match argument is greater
+/// than or equal to [low] and less than or equal to [high].
+Matcher inInclusiveRange(num low, num high) =>
+    new _InRange(low, high, true, true);
+
+/// Returns a matcher which matches if the match argument is greater
+/// than [low] and less than [high].
+Matcher inExclusiveRange(num low, num high) =>
+    new _InRange(low, high, false, false);
+
+/// Returns a matcher which matches if the match argument is greater
+/// than [low] and less than or equal to [high].
+Matcher inOpenClosedRange(num low, num high) =>
+    new _InRange(low, high, false, true);
+
+/// Returns a matcher which matches if the match argument is greater
+/// than or equal to a [low] and less than [high].
+Matcher inClosedOpenRange(num low, num high) =>
+    new _InRange(low, high, true, false);
+
+class _InRange extends Matcher {
+  final num _low, _high;
+  final bool _lowMatchValue, _highMatchValue;
+
+  const _InRange(
+      this._low, this._high, this._lowMatchValue, this._highMatchValue);
+
+  bool matches(value, Map matchState) {
+    if (value is! num) {
+      return false;
+    }
+    if (value < _low || value > _high) {
+      return false;
+    }
+    if (value == _low) {
+      return _lowMatchValue;
+    }
+    if (value == _high) {
+      return _highMatchValue;
+    }
+    return true;
+  }
+
+  Description describe(Description description) => description.add(
+      "be in range from "
+      "$_low (${_lowMatchValue ? 'inclusive' : 'exclusive'}) to "
+      "$_high (${_highMatchValue ? 'inclusive' : 'exclusive'})");
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (item is! num) {
+      return mismatchDescription.addDescriptionOf(item).add(' not numeric');
+    } else {
+      return super.describeMismatch(
+          item, mismatchDescription, matchState, verbose);
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/matcher/lib/src/operator_matchers.dart b/mojo/public/dart/third_party/matcher/lib/src/operator_matchers.dart
new file mode 100644
index 0000000..6824c5b
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/lib/src/operator_matchers.dart
@@ -0,0 +1,113 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.operator_matchers;
+
+import 'interfaces.dart';
+import 'util.dart';
+
+/// This returns a matcher that inverts [matcher] to its logical negation.
+Matcher isNot(matcher) => new _IsNot(wrapMatcher(matcher));
+
+class _IsNot extends Matcher {
+  final Matcher _matcher;
+
+  const _IsNot(this._matcher);
+
+  bool matches(item, Map matchState) => !_matcher.matches(item, matchState);
+
+  Description describe(Description description) =>
+      description.add('not ').addDescriptionOf(_matcher);
+}
+
+/// This returns a matcher that matches if all of the matchers passed as
+/// arguments (up to 7) match.
+///
+/// Instead of passing the matchers separately they can be passed as a single
+/// List argument. Any argument that is not a matcher is implicitly wrapped in a
+/// Matcher to check for equality.
+Matcher allOf(arg0, [arg1, arg2, arg3, arg4, arg5, arg6]) {
+  return new _AllOf(_wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6));
+}
+
+class _AllOf extends Matcher {
+  final List<Matcher> _matchers;
+
+  const _AllOf(this._matchers);
+
+  bool matches(item, Map matchState) {
+    for (var matcher in _matchers) {
+      if (!matcher.matches(item, matchState)) {
+        addStateInfo(matchState, {'matcher': matcher});
+        return false;
+      }
+    }
+    return true;
+  }
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    var matcher = matchState['matcher'];
+    matcher.describeMismatch(
+        item, mismatchDescription, matchState['state'], verbose);
+    return mismatchDescription;
+  }
+
+  Description describe(Description description) =>
+      description.addAll('(', ' and ', ')', _matchers);
+}
+
+/// Matches if any of the given matchers evaluate to true.
+///
+/// The arguments can be a set of matchers as separate parameters
+/// (up to 7), or a List of matchers.
+///
+/// The matchers are evaluated from left to right using short-circuit
+/// evaluation, so evaluation stops as soon as a matcher returns true.
+///
+/// Any argument that is not a matcher is implicitly wrapped in a
+/// Matcher to check for equality.
+Matcher anyOf(arg0, [arg1, arg2, arg3, arg4, arg5, arg6]) {
+  return new _AnyOf(_wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6));
+}
+
+class _AnyOf extends Matcher {
+  final List<Matcher> _matchers;
+
+  const _AnyOf(this._matchers);
+
+  bool matches(item, Map matchState) {
+    for (var matcher in _matchers) {
+      if (matcher.matches(item, matchState)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  Description describe(Description description) =>
+      description.addAll('(', ' or ', ')', _matchers);
+}
+
+List<Matcher> _wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6) {
+  Iterable<Matcher> matchers;
+  if (arg0 is List) {
+    if (arg1 != null ||
+        arg2 != null ||
+        arg3 != null ||
+        arg4 != null ||
+        arg5 != null ||
+        arg6 != null) {
+      throw new ArgumentError('If arg0 is a List, all other arguments must be'
+          ' null.');
+    }
+
+    matchers = arg0;
+  } else {
+    matchers =
+        [arg0, arg1, arg2, arg3, arg4, arg5, arg6].where((e) => e != null);
+  }
+
+  return matchers.map((e) => wrapMatcher(e)).toList();
+}
diff --git a/mojo/public/dart/third_party/matcher/lib/src/pretty_print.dart b/mojo/public/dart/third_party/matcher/lib/src/pretty_print.dart
new file mode 100644
index 0000000..c20102b
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/lib/src/pretty_print.dart
@@ -0,0 +1,136 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.pretty_print;
+
+import 'description.dart';
+import 'interfaces.dart';
+import 'util.dart';
+
+/// Returns a pretty-printed representation of [object].
+///
+/// If [maxLineLength] is passed, this will attempt to ensure that each line is
+/// no longer than [maxLineLength] characters long. This isn't guaranteed, since
+/// individual objects may have string representations that are too long, but
+/// most lines will be less than [maxLineLength] long.
+///
+/// If [maxItems] is passed, [Iterable]s and [Map]s will only print their first
+/// [maxItems] members or key/value pairs, respectively.
+String prettyPrint(object, {int maxLineLength, int maxItems}) {
+  String _prettyPrint(object, int indent, Set seen, bool top) {
+    // If the object is a matcher, use its description.
+    if (object is Matcher) {
+      var description = new StringDescription();
+      object.describe(description);
+      return "<$description>";
+    }
+
+    // Avoid looping infinitely on recursively-nested data structures.
+    if (seen.contains(object)) return "(recursive)";
+    seen = seen.union(new Set.from([object]));
+    String pp(child) => _prettyPrint(child, indent + 2, seen, false);
+
+    if (object is Iterable) {
+      // Print the type name for non-List iterables.
+      var type = object is List ? "" : _typeName(object) + ":";
+
+      // Truncate the list of strings if it's longer than [maxItems].
+      var strings = object.map(pp).toList();
+      if (maxItems != null && strings.length > maxItems) {
+        strings.replaceRange(maxItems - 1, strings.length, ['...']);
+      }
+
+      // If the printed string is short and doesn't contain a newline, print it
+      // as a single line.
+      var singleLine = "$type[${strings.join(', ')}]";
+      if ((maxLineLength == null ||
+              singleLine.length + indent <= maxLineLength) &&
+          !singleLine.contains("\n")) {
+        return singleLine;
+      }
+
+      // Otherwise, print each member on its own line.
+      return "$type[\n" + strings.map((string) {
+        return _indent(indent + 2) + string;
+      }).join(",\n") + "\n" + _indent(indent) + "]";
+    } else if (object is Map) {
+      // Convert the contents of the map to string representations.
+      var strings = object.keys.map((key) {
+        return '${pp(key)}: ${pp(object[key])}';
+      }).toList();
+
+      // Truncate the list of strings if it's longer than [maxItems].
+      if (maxItems != null && strings.length > maxItems) {
+        strings.replaceRange(maxItems - 1, strings.length, ['...']);
+      }
+
+      // If the printed string is short and doesn't contain a newline, print it
+      // as a single line.
+      var singleLine = "{${strings.join(", ")}}";
+      if ((maxLineLength == null ||
+              singleLine.length + indent <= maxLineLength) &&
+          !singleLine.contains("\n")) {
+        return singleLine;
+      }
+
+      // Otherwise, print each key/value pair on its own line.
+      return "{\n" + strings.map((string) {
+        return _indent(indent + 2) + string;
+      }).join(",\n") + "\n" + _indent(indent) + "}";
+    } else if (object is String) {
+      // Escape strings and print each line on its own line.
+      var lines = object.split("\n");
+      return "'" +
+          lines.map(_escapeString).join("\\n'\n${_indent(indent + 2)}'") +
+          "'";
+    } else {
+      var value = object.toString().replaceAll("\n", _indent(indent) + "\n");
+      var defaultToString = value.startsWith("Instance of ");
+
+      // If this is the top-level call to [prettyPrint], wrap the value on angle
+      // brackets to set it apart visually.
+      if (top) value = "<$value>";
+
+      // Print the type of objects with custom [toString] methods. Primitive
+      // objects and objects that don't implement a custom [toString] don't need
+      // to have their types printed.
+      if (object is num ||
+          object is bool ||
+          object is Function ||
+          object == null ||
+          defaultToString) {
+        return value;
+      } else {
+        return "${_typeName(object)}:$value";
+      }
+    }
+  }
+
+  return _prettyPrint(object, 0, new Set(), true);
+}
+
+String _indent(int length) => new List.filled(length, ' ').join('');
+
+/// Returns the name of the type of [x], or "Unknown" if the type name can't be
+/// determined.
+String _typeName(x) {
+  // dart2js blows up on some objects (e.g. window.navigator).
+  // So we play safe here.
+  try {
+    if (x == null) return "null";
+    var type = x.runtimeType.toString();
+    // TODO(nweiz): if the object's type is private, find a public superclass to
+    // display once there's a portable API to do that.
+    return type.startsWith("_") ? "?" : type;
+  } catch (e) {
+    return "?";
+  }
+}
+
+/// Returns [source] with any control characters replaced by their escape
+/// sequences.
+///
+/// This doesn't add quotes to the string, but it does escape single quote
+/// characters so that single quotes can be applied externally.
+String _escapeString(String source) => escape(source).replaceAll("'", r"\'");
diff --git a/mojo/public/dart/third_party/matcher/lib/src/string_matchers.dart b/mojo/public/dart/third_party/matcher/lib/src/string_matchers.dart
new file mode 100644
index 0000000..4643434
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/lib/src/string_matchers.dart
@@ -0,0 +1,201 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.string_matchers;
+
+import 'interfaces.dart';
+
+/// Returns a matcher which matches if the match argument is a string and
+/// is equal to [value] when compared case-insensitively.
+Matcher equalsIgnoringCase(String value) => new _IsEqualIgnoringCase(value);
+
+class _IsEqualIgnoringCase extends _StringMatcher {
+  final String _value;
+  final String _matchValue;
+
+  _IsEqualIgnoringCase(String value)
+      : _value = value,
+        _matchValue = value.toLowerCase();
+
+  bool matches(item, Map matchState) =>
+      item is String && _matchValue == item.toLowerCase();
+
+  Description describe(Description description) =>
+      description.addDescriptionOf(_value).add(' ignoring case');
+}
+
+/// Returns a matcher which matches if the match argument is a string and
+/// is equal to [value], ignoring whitespace.
+///
+/// In this matcher, "ignoring whitespace" means comparing with all runs of
+/// whitespace collapsed to single space characters and leading and trailing
+/// whitespace removed.
+///
+/// For example, the following will all match successfully:
+///
+///     expect("hello   world", equalsIgnoringWhitespace("hello world"));
+///     expect("  hello world", equalsIgnoringWhitespace("hello world"));
+///     expect("hello world  ", equalsIgnoringWhitespace("hello world"));
+///
+/// The following will not match:
+///
+///     expect("helloworld", equalsIgnoringWhitespace("hello world"));
+///     expect("he llo world", equalsIgnoringWhitespace("hello world"));
+Matcher equalsIgnoringWhitespace(String value) =>
+    new _IsEqualIgnoringWhitespace(value);
+
+class _IsEqualIgnoringWhitespace extends _StringMatcher {
+  final String _value;
+  final String _matchValue;
+
+  _IsEqualIgnoringWhitespace(String value)
+      : _value = value,
+        _matchValue = collapseWhitespace(value);
+
+  bool matches(item, Map matchState) =>
+      item is String && _matchValue == collapseWhitespace(item);
+
+  Description describe(Description description) =>
+      description.addDescriptionOf(_matchValue).add(' ignoring whitespace');
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (item is String) {
+      return mismatchDescription
+          .add('is ')
+          .addDescriptionOf(collapseWhitespace(item))
+          .add(' with whitespace compressed');
+    } else {
+      return super.describeMismatch(
+          item, mismatchDescription, matchState, verbose);
+    }
+  }
+}
+
+/// Returns a matcher that matches if the match argument is a string and
+/// starts with [prefixString].
+Matcher startsWith(String prefixString) => new _StringStartsWith(prefixString);
+
+class _StringStartsWith extends _StringMatcher {
+  final String _prefix;
+
+  const _StringStartsWith(this._prefix);
+
+  bool matches(item, Map matchState) =>
+      item is String && item.startsWith(_prefix);
+
+  Description describe(Description description) =>
+      description.add('a string starting with ').addDescriptionOf(_prefix);
+}
+
+/// Returns a matcher that matches if the match argument is a string and
+/// ends with [suffixString].
+Matcher endsWith(String suffixString) => new _StringEndsWith(suffixString);
+
+class _StringEndsWith extends _StringMatcher {
+  final String _suffix;
+
+  const _StringEndsWith(this._suffix);
+
+  bool matches(item, Map matchState) =>
+      item is String && item.endsWith(_suffix);
+
+  Description describe(Description description) =>
+      description.add('a string ending with ').addDescriptionOf(_suffix);
+}
+
+/// Returns a matcher that matches if the match argument is a string and
+/// contains a given list of [substrings] in relative order.
+///
+/// For example, `stringContainsInOrder(["a", "e", "i", "o", "u"])` will match
+/// "abcdefghijklmnopqrstuvwxyz".
+
+Matcher stringContainsInOrder(List<String> substrings) =>
+    new _StringContainsInOrder(substrings);
+
+class _StringContainsInOrder extends _StringMatcher {
+  final List<String> _substrings;
+
+  const _StringContainsInOrder(this._substrings);
+
+  bool matches(item, Map matchState) {
+    if (!(item is String)) {
+      return false;
+    }
+    var from_index = 0;
+    for (var s in _substrings) {
+      from_index = item.indexOf(s, from_index);
+      if (from_index < 0) return false;
+    }
+    return true;
+  }
+
+  Description describe(Description description) => description.addAll(
+      'a string containing ', ', ', ' in order', _substrings);
+}
+
+/// Returns a matcher that matches if the match argument is a string and
+/// matches the regular expression given by [re].
+///
+/// [re] can be a [RegExp] instance or a [String]; in the latter case it will be
+/// used to create a RegExp instance.
+Matcher matches(re) => new _MatchesRegExp(re);
+
+class _MatchesRegExp extends _StringMatcher {
+  RegExp _regexp;
+
+  _MatchesRegExp(re) {
+    if (re is String) {
+      _regexp = new RegExp(re);
+    } else if (re is RegExp) {
+      _regexp = re;
+    } else {
+      throw new ArgumentError('matches requires a regexp or string');
+    }
+  }
+
+  bool matches(item, Map matchState) =>
+      item is String ? _regexp.hasMatch(item) : false;
+
+  Description describe(Description description) =>
+      description.add("match '${_regexp.pattern}'");
+}
+
+// String matchers match against a string. We add this intermediate
+// class to give better mismatch error messages than the base Matcher class.
+abstract class _StringMatcher extends Matcher {
+  const _StringMatcher();
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (!(item is String)) {
+      return mismatchDescription.addDescriptionOf(item).add(' not a string');
+    } else {
+      return super.describeMismatch(
+          item, mismatchDescription, matchState, verbose);
+    }
+  }
+}
+
+/// Utility function to collapse whitespace runs to single spaces
+/// and strip leading/trailing whitespace.
+String collapseWhitespace(String string) {
+  var result = new StringBuffer();
+  var skipSpace = true;
+  for (var i = 0; i < string.length; i++) {
+    var character = string[i];
+    if (_isWhitespace(character)) {
+      if (!skipSpace) {
+        result.write(' ');
+        skipSpace = true;
+      }
+    } else {
+      result.write(character);
+      skipSpace = false;
+    }
+  }
+  return result.toString().trim();
+}
+
+bool _isWhitespace(String ch) =>
+    ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t';
diff --git a/mojo/public/dart/third_party/matcher/lib/src/util.dart b/mojo/public/dart/third_party/matcher/lib/src/util.dart
new file mode 100644
index 0000000..8706009
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/lib/src/util.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.util;
+
+import 'core_matchers.dart';
+import 'interfaces.dart';
+
+/// A [Map] between whitespace characters and their escape sequences.
+const _escapeMap = const {
+  '\n': r'\n',
+  '\r': r'\r',
+  '\f': r'\f',
+  '\b': r'\b',
+  '\t': r'\t',
+  '\v': r'\v',
+  '\x7F': r'\x7F', // delete
+};
+
+/// A [RegExp] that matches whitespace characters that should be escaped.
+final _escapeRegExp = new RegExp(
+    "[\\x00-\\x07\\x0E-\\x1F${_escapeMap.keys.map(_getHexLiteral).join()}]");
+
+/// Useful utility for nesting match states.
+void addStateInfo(Map matchState, Map values) {
+  var innerState = new Map.from(matchState);
+  matchState.clear();
+  matchState['state'] = innerState;
+  matchState.addAll(values);
+}
+
+/// Takes an argument and returns an equivalent [Matcher].
+///
+/// If the argument is already a matcher this does nothing,
+/// else if the argument is a function, it generates a predicate
+/// function matcher, else it generates an equals matcher.
+Matcher wrapMatcher(x) {
+  if (x is Matcher) {
+    return x;
+  } else if (x is Function) {
+    return predicate(x);
+  } else {
+    return equals(x);
+  }
+}
+
+/// Returns [str] with all whitespace characters represented as their escape
+/// sequences.
+///
+/// Backslash characters are escaped as `\\`
+String escape(String str) {
+  str = str.replaceAll('\\', r'\\');
+  return str.replaceAllMapped(_escapeRegExp, (match) {
+    var mapped = _escapeMap[match[0]];
+    if (mapped != null) return mapped;
+    return _getHexLiteral(match[0]);
+  });
+}
+
+/// Given single-character string, return the hex-escaped equivalent.
+String _getHexLiteral(String input) {
+  int rune = input.runes.single;
+  return r'\x' + rune.toRadixString(16).toUpperCase().padLeft(2, '0');
+}
diff --git a/mojo/public/dart/third_party/matcher/pubspec.yaml b/mojo/public/dart/third_party/matcher/pubspec.yaml
new file mode 100644
index 0000000..ea8f4ab
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/pubspec.yaml
@@ -0,0 +1,9 @@
+name: matcher
+version: 0.12.0+1
+author: Dart Team <misc@dartlang.org>
+description: Support for specifying test expectations
+homepage: https://github.com/dart-lang/matcher
+environment:
+  sdk: '>=1.0.0 <2.0.0'
+dev_dependencies:
+  test: '>=0.12.0 <0.13.0'
diff --git a/mojo/public/dart/third_party/matcher/test/core_matchers_test.dart b/mojo/public/dart/third_party/matcher/test/core_matchers_test.dart
new file mode 100644
index 0000000..32e30f0
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/test/core_matchers_test.dart
@@ -0,0 +1,202 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.core_matchers_test;
+
+import 'package:matcher/matcher.dart';
+import 'package:test/test.dart' show test, group;
+
+import 'test_utils.dart';
+
+void main() {
+  test('isTrue', () {
+    shouldPass(true, isTrue);
+    shouldFail(false, isTrue, "Expected: true Actual: <false>");
+  });
+
+  test('isFalse', () {
+    shouldPass(false, isFalse);
+    shouldFail(10, isFalse, "Expected: false Actual: <10>");
+    shouldFail(true, isFalse, "Expected: false Actual: <true>");
+  });
+
+  test('isNull', () {
+    shouldPass(null, isNull);
+    shouldFail(false, isNull, "Expected: null Actual: <false>");
+  });
+
+  test('isNotNull', () {
+    shouldPass(false, isNotNull);
+    shouldFail(null, isNotNull, "Expected: not null Actual: <null>");
+  });
+
+  test('isNaN', () {
+    shouldPass(double.NAN, isNaN);
+    shouldFail(3.1, isNaN, "Expected: NaN Actual: <3.1>");
+  });
+
+  test('isNotNaN', () {
+    shouldPass(3.1, isNotNaN);
+    shouldFail(double.NAN, isNotNaN, "Expected: not NaN Actual: <NaN>");
+  });
+
+  test('same', () {
+    var a = new Map();
+    var b = new Map();
+    shouldPass(a, same(a));
+    shouldFail(b, same(a), "Expected: same instance as {} Actual: {}");
+  });
+
+  test('equals', () {
+    var a = new Map();
+    var b = new Map();
+    shouldPass(a, equals(a));
+    shouldPass(a, equals(b));
+  });
+
+  test('equals with a set', () {
+    var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
+    var set1 = numbers.toSet();
+    numbers.shuffle();
+    var set2 = numbers.toSet();
+
+    shouldPass(set2, equals(set1));
+    shouldPass(numbers, equals(set1));
+    shouldFail([
+      1,
+      2,
+      3,
+      4,
+      5,
+      6,
+      7,
+      8,
+      9
+    ], equals(set1), matches(r"Expected: .*:\[1, 2, 3, 4, 5, 6, 7, 8, 9, 10\]"
+        r"  Actual: \[1, 2, 3, 4, 5, 6, 7, 8, 9\]"
+        r"   Which: does not contain 10"));
+    shouldFail([
+      1,
+      2,
+      3,
+      4,
+      5,
+      6,
+      7,
+      8,
+      9,
+      10,
+      11
+    ], equals(set1), matches(r"Expected: .*:\[1, 2, 3, 4, 5, 6, 7, 8, 9, 10\]"
+        r"  Actual: \[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11\]"
+        r"   Which: larger than expected"));
+  });
+
+  test('anything', () {
+    var a = new Map();
+    shouldPass(0, anything);
+    shouldPass(null, anything);
+    shouldPass(a, anything);
+    shouldFail(a, isNot(anything), "Expected: not anything Actual: {}");
+  });
+
+  test('returnsNormally', () {
+    shouldPass(doesNotThrow, returnsNormally);
+    shouldFail(doesThrow, returnsNormally, matches(r"Expected: return normally"
+        r"  Actual: <Closure(: \(\) => dynamic "
+        r"from Function 'doesThrow': static\.)?>"
+        r"   Which: threw 'X'"));
+  });
+
+  test('hasLength', () {
+    var a = new Map();
+    var b = new List();
+    shouldPass(a, hasLength(0));
+    shouldPass(b, hasLength(0));
+    shouldPass('a', hasLength(1));
+    shouldFail(0, hasLength(0),
+        "Expected: an object with length of <0> "
+        "Actual: <0> "
+        "Which: has no length property");
+
+    b.add(0);
+    shouldPass(b, hasLength(1));
+    shouldFail(b, hasLength(2), "Expected: an object with length of <2> "
+        "Actual: [0] "
+        "Which: has length of <1>");
+
+    b.add(0);
+    shouldFail(b, hasLength(1), "Expected: an object with length of <1> "
+        "Actual: [0, 0] "
+        "Which: has length of <2>");
+    shouldPass(b, hasLength(2));
+  });
+
+  test('scalar type mismatch', () {
+    shouldFail('error', equals(5.1), "Expected: <5.1> "
+        "Actual: 'error'");
+  });
+
+  test('nested type mismatch', () {
+    shouldFail(['error'], equals([5.1]), "Expected: [5.1] "
+        "Actual: ['error'] "
+        "Which: was 'error' instead of <5.1> at location [0]");
+  });
+
+  test('doubly-nested type mismatch', () {
+    shouldFail([['error']], equals([[5.1]]), "Expected: [[5.1]] "
+        "Actual: [['error']] "
+        "Which: was 'error' instead of <5.1> at location [0][0]");
+  });
+
+  test('doubly nested inequality', () {
+    var actual1 = [['foo', 'bar'], ['foo'], 3, []];
+    var expected1 = [['foo', 'bar'], ['foo'], 4, []];
+    var reason1 = "Expected: [['foo', 'bar'], ['foo'], 4, []] "
+        "Actual: [['foo', 'bar'], ['foo'], 3, []] "
+        "Which: was <3> instead of <4> at location [2]";
+
+    var actual2 = [['foo', 'barry'], ['foo'], 4, []];
+    var expected2 = [['foo', 'bar'], ['foo'], 4, []];
+    var reason2 = "Expected: [['foo', 'bar'], ['foo'], 4, []] "
+        "Actual: [['foo', 'barry'], ['foo'], 4, []] "
+        "Which: was 'barry' instead of 'bar' at location [0][1]";
+
+    var actual3 = [['foo', 'bar'], ['foo'], 4, {'foo': 'bar'}];
+    var expected3 = [['foo', 'bar'], ['foo'], 4, {'foo': 'barry'}];
+    var reason3 = "Expected: [['foo', 'bar'], ['foo'], 4, {'foo': 'barry'}] "
+        "Actual: [['foo', 'bar'], ['foo'], 4, {'foo': 'bar'}] "
+        "Which: was 'bar' instead of 'barry' at location [3]['foo']";
+
+    shouldFail(actual1, equals(expected1), reason1);
+    shouldFail(actual2, equals(expected2), reason2);
+    shouldFail(actual3, equals(expected3), reason3);
+  });
+
+  test('isInstanceOf', () {
+    shouldFail(0, new isInstanceOf<String>(),
+        "Expected: an instance of String Actual: <0>");
+    shouldPass('cow', new isInstanceOf<String>());
+  });
+
+  group('Predicate Matchers', () {
+    test('isInstanceOf', () {
+      shouldFail(0, predicate((x) => x is String, "an instance of String"),
+          "Expected: an instance of String Actual: <0>");
+      shouldPass('cow', predicate((x) => x is String, "an instance of String"));
+    });
+  });
+
+  test("Feature Matcher", () {
+    var w = new Widget();
+    w.price = 10;
+    shouldPass(w, new HasPrice(10));
+    shouldPass(w, new HasPrice(greaterThan(0)));
+    shouldFail(w, new HasPrice(greaterThan(10)),
+        "Expected: Widget with a price that is a value greater than <10> "
+        "Actual: <Instance of 'Widget'> "
+        "Which: has price with value <10> which is not "
+        "a value greater than <10>");
+  });
+}
diff --git a/mojo/public/dart/third_party/matcher/test/escape_test.dart b/mojo/public/dart/third_party/matcher/test/escape_test.dart
new file mode 100644
index 0000000..35a18bc
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/test/escape_test.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.escape_test;
+
+import 'package:matcher/src/util.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group('escaping should work with', () {
+    _testEscaping('no escaped chars', 'Hello, world!', 'Hello, world!');
+    _testEscaping('newline', '\n', r'\n');
+    _testEscaping('carriage return', '\r', r'\r');
+    _testEscaping('form feed', '\f', r'\f');
+    _testEscaping('backspace', '\b', r'\b');
+    _testEscaping('tab', '\t', r'\t');
+    _testEscaping('vertical tab', '\v', r'\v');
+    _testEscaping('null byte', '\x00', r'\x00');
+    _testEscaping('ASCII control character', '\x11', r'\x11');
+    _testEscaping('delete', '\x7F', r'\x7F');
+    _testEscaping('escape combos', r'\n', r'\\n');
+    _testEscaping('All characters',
+        'A new line\nA charriage return\rA form feed\fA backspace\b'
+        'A tab\tA vertical tab\vA slash\\A null byte\x00A control char\x1D'
+        'A delete\x7F',
+        r'A new line\nA charriage return\rA form feed\fA backspace\b'
+        r'A tab\tA vertical tab\vA slash\\A null byte\x00A control char\x1D'
+        r'A delete\x7F');
+  });
+
+  group('unequal strings remain unequal when escaped', () {
+    _testUnequalStrings('with a newline', '\n', r'\n');
+    _testUnequalStrings('with slash literals', '\\', r'\\');
+  });
+}
+
+/// Creates a [test] with name [name] that verifies [source] escapes to value
+/// [target].
+void _testEscaping(String name, String source, String target) {
+  test(name, () {
+    var escaped = escape(source);
+    expect(escaped == target, isTrue,
+        reason: "Expected escaped value: $target\n"
+        "  Actual escaped value: $escaped");
+  });
+}
+
+/// Creates a [test] with name [name] that ensures two different [String] values
+/// [s1] and [s2] remain unequal when escaped.
+void _testUnequalStrings(String name, String s1, String s2) {
+  test(name, () {
+    // Explicitly not using the equals matcher
+    expect(s1 != s2, isTrue, reason: 'The source values should be unequal');
+
+    var escapedS1 = escape(s1);
+    var escapedS2 = escape(s2);
+
+    // Explicitly not using the equals matcher
+    expect(escapedS1 != escapedS2, isTrue,
+        reason: 'Unequal strings, when escaped, should remain unequal.');
+  });
+}
diff --git a/mojo/public/dart/third_party/matcher/test/iterable_matchers_test.dart b/mojo/public/dart/third_party/matcher/test/iterable_matchers_test.dart
new file mode 100644
index 0000000..54bc2c9
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/test/iterable_matchers_test.dart
@@ -0,0 +1,187 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.iterable_matchers_test;
+
+import 'package:matcher/matcher.dart';
+import 'package:test/test.dart' show test, group;
+
+import 'test_utils.dart';
+
+void main() {
+  test('isEmpty', () {
+    shouldPass([], isEmpty);
+    shouldFail([1], isEmpty, "Expected: empty Actual: [1]");
+  });
+
+  test('isNotEmpty', () {
+    shouldFail([], isNotEmpty, "Expected: non-empty Actual: []");
+    shouldPass([1], isNotEmpty);
+  });
+
+  test('contains', () {
+    var d = [1, 2];
+    shouldPass(d, contains(1));
+    shouldFail(d, contains(0), "Expected: contains <0> "
+        "Actual: [1, 2]");
+  });
+
+  test('equals with matcher element', () {
+    var d = ['foo', 'bar'];
+    shouldPass(d, equals(['foo', startsWith('ba')]));
+    shouldFail(d, equals(['foo', endsWith('ba')]),
+        "Expected: ['foo', <a string ending with 'ba'>] "
+        "Actual: ['foo', 'bar'] "
+        "Which: does not match a string ending with 'ba' at location [1]");
+  });
+
+  test('isIn', () {
+    var d = [1, 2];
+    shouldPass(1, isIn(d));
+    shouldFail(0, isIn(d), "Expected: is in [1, 2] Actual: <0>");
+  });
+
+  test('everyElement', () {
+    var d = [1, 2];
+    var e = [1, 1, 1];
+    shouldFail(d, everyElement(1), "Expected: every element(<1>) "
+        "Actual: [1, 2] "
+        "Which: has value <2> which doesn't match <1> at index 1");
+    shouldPass(e, everyElement(1));
+  });
+
+  test('nested everyElement', () {
+    var d = [['foo', 'bar'], ['foo'], []];
+    var e = [['foo', 'bar'], ['foo'], 3, []];
+    shouldPass(d, everyElement(anyOf(isEmpty, contains('foo'))));
+    shouldFail(d, everyElement(everyElement(equals('foo'))),
+        "Expected: every element(every element('foo')) "
+        "Actual: [['foo', 'bar'], ['foo'], []] "
+        "Which: has value ['foo', 'bar'] which has value 'bar' "
+        "which is different. Expected: foo Actual: bar ^ "
+        "Differ at offset 0 at index 1 at index 0");
+    shouldFail(d,
+        everyElement(allOf(hasLength(greaterThan(0)), contains('foo'))),
+        "Expected: every element((an object with length of a value "
+        "greater than <0> and contains 'foo')) "
+        "Actual: [['foo', 'bar'], ['foo'], []] "
+        "Which: has value [] which has length of <0> at index 2");
+    shouldFail(d,
+        everyElement(allOf(contains('foo'), hasLength(greaterThan(0)))),
+        "Expected: every element((contains 'foo' and "
+        "an object with length of a value greater than <0>)) "
+        "Actual: [['foo', 'bar'], ['foo'], []] "
+        "Which: has value [] which doesn't match (contains 'foo' and "
+        "an object with length of a value greater than <0>) at index 2");
+    shouldFail(e,
+        everyElement(allOf(contains('foo'), hasLength(greaterThan(0)))),
+        "Expected: every element((contains 'foo' and an object with "
+        "length of a value greater than <0>)) "
+        "Actual: [['foo', 'bar'], ['foo'], 3, []] "
+        "Which: has value <3> which is not a string, map or iterable "
+        "at index 2");
+  });
+
+  test('anyElement', () {
+    var d = [1, 2];
+    var e = [1, 1, 1];
+    shouldPass(d, anyElement(2));
+    shouldFail(
+        e, anyElement(2), "Expected: some element <2> Actual: [1, 1, 1]");
+  });
+
+  test('orderedEquals', () {
+    shouldPass([null], orderedEquals([null]));
+    var d = [1, 2];
+    shouldPass(d, orderedEquals([1, 2]));
+    shouldFail(d, orderedEquals([2, 1]), "Expected: equals [2, 1] ordered "
+        "Actual: [1, 2] "
+        "Which: was <1> instead of <2> at location [0]");
+  });
+
+  test('unorderedEquals', () {
+    var d = [1, 2];
+    shouldPass(d, unorderedEquals([2, 1]));
+    shouldFail(d, unorderedEquals([1]), "Expected: equals [1] unordered "
+        "Actual: [1, 2] "
+        "Which: has too many elements (2 > 1)");
+    shouldFail(d, unorderedEquals([3, 2, 1]),
+        "Expected: equals [3, 2, 1] unordered "
+        "Actual: [1, 2] "
+        "Which: has too few elements (2 < 3)");
+    shouldFail(d, unorderedEquals([3, 1]), "Expected: equals [3, 1] unordered "
+        "Actual: [1, 2] "
+        "Which: has no match for <3> at index 0");
+  });
+
+  test('unorderedMatchess', () {
+    var d = [1, 2];
+    shouldPass(d, unorderedMatches([2, 1]));
+    shouldPass(d, unorderedMatches([greaterThan(1), greaterThan(0)]));
+    shouldFail(d, unorderedMatches([greaterThan(0)]),
+        "Expected: matches [a value greater than <0>] unordered "
+        "Actual: [1, 2] "
+        "Which: has too many elements (2 > 1)");
+    shouldFail(d, unorderedMatches([3, 2, 1]),
+        "Expected: matches [<3>, <2>, <1>] unordered "
+        "Actual: [1, 2] "
+        "Which: has too few elements (2 < 3)");
+    shouldFail(d, unorderedMatches([3, 1]),
+        "Expected: matches [<3>, <1>] unordered "
+        "Actual: [1, 2] "
+        "Which: has no match for <3> at index 0");
+    shouldFail(d, unorderedMatches([greaterThan(3), greaterThan(0)]),
+        "Expected: matches [a value greater than <3>, a value greater than "
+        "<0>] unordered "
+        "Actual: [1, 2] "
+        "Which: has no match for a value greater than <3> at index 0");
+  });
+
+  test('pairwise compare', () {
+    var c = [1, 2];
+    var d = [1, 2, 3];
+    var e = [1, 4, 9];
+    shouldFail('x', pairwiseCompare(e, (e, a) => a <= e, "less than or equal"),
+        "Expected: pairwise less than or equal [1, 4, 9] "
+        "Actual: 'x' "
+        "Which: is not an Iterable");
+    shouldFail(c, pairwiseCompare(e, (e, a) => a <= e, "less than or equal"),
+        "Expected: pairwise less than or equal [1, 4, 9] "
+        "Actual: [1, 2] "
+        "Which: has length 2 instead of 3");
+    shouldPass(d, pairwiseCompare(e, (e, a) => a <= e, "less than or equal"));
+    shouldFail(d, pairwiseCompare(e, (e, a) => a < e, "less than"),
+        "Expected: pairwise less than [1, 4, 9] "
+        "Actual: [1, 2, 3] "
+        "Which: has <1> which is not less than <1> at index 0");
+    shouldPass(d, pairwiseCompare(e, (e, a) => a * a == e, "square root of"));
+    shouldFail(d, pairwiseCompare(e, (e, a) => a + a == e, "double"),
+        "Expected: pairwise double [1, 4, 9] "
+        "Actual: [1, 2, 3] "
+        "Which: has <1> which is not double <1> at index 0");
+  });
+
+  test('isEmpty', () {
+    var d = new SimpleIterable(0);
+    var e = new SimpleIterable(1);
+    shouldPass(d, isEmpty);
+    shouldFail(e, isEmpty, "Expected: empty "
+        "Actual: SimpleIterable:[1]");
+  });
+
+  test('isNotEmpty', () {
+    var d = new SimpleIterable(0);
+    var e = new SimpleIterable(1);
+    shouldPass(e, isNotEmpty);
+    shouldFail(d, isNotEmpty, "Expected: non-empty "
+        "Actual: SimpleIterable:[]");
+  });
+
+  test('contains', () {
+    var d = new SimpleIterable(3);
+    shouldPass(d, contains(2));
+    shouldFail(d, contains(5), "Expected: contains <5> "
+        "Actual: SimpleIterable:[3, 2, 1]");
+  });
+}
diff --git a/mojo/public/dart/third_party/matcher/test/mirror_matchers_test.dart b/mojo/public/dart/third_party/matcher/test/mirror_matchers_test.dart
new file mode 100644
index 0000000..f1781c1
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/test/mirror_matchers_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.mirror_test;
+
+import 'package:matcher/mirror_matchers.dart';
+import 'package:test/test.dart' show test;
+
+import 'test_utils.dart';
+
+class C {
+  var instanceField = 1;
+  get instanceGetter => 2;
+  static var staticField = 3;
+  static get staticGetter => 4;
+}
+
+void main() {
+  test('hasProperty', () {
+    var foo = [3];
+    shouldPass(foo, hasProperty('length', 1));
+    shouldFail(foo, hasProperty('foo'), 'Expected: has property "foo" '
+        'Actual: [3] '
+        'Which: has no property named "foo"');
+    shouldFail(foo, hasProperty('length', 2),
+        'Expected: has property "length" which matches <2> '
+        'Actual: [3] '
+        'Which: has property "length" with value <1>');
+    var c = new C();
+    shouldPass(c, hasProperty('instanceField', 1));
+    shouldPass(c, hasProperty('instanceGetter', 2));
+    shouldFail(c, hasProperty('staticField'),
+        'Expected: has property "staticField" '
+        'Actual: <Instance of \'C\'> '
+        'Which: has a member named "staticField",'
+        ' but it is not an instance property');
+    shouldFail(c, hasProperty('staticGetter'),
+        'Expected: has property "staticGetter" '
+        'Actual: <Instance of \'C\'> '
+        'Which: has a member named "staticGetter",'
+        ' but it is not an instance property');
+  });
+}
diff --git a/mojo/public/dart/third_party/matcher/test/numeric_matchers_test.dart b/mojo/public/dart/third_party/matcher/test/numeric_matchers_test.dart
new file mode 100644
index 0000000..d62bad6
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/test/numeric_matchers_test.dart
@@ -0,0 +1,141 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.numeric_matchers_test;
+
+import 'package:matcher/matcher.dart';
+import 'package:test/test.dart' show test, group;
+
+import 'test_utils.dart';
+
+void main() {
+  test('greaterThan', () {
+    shouldPass(10, greaterThan(9));
+    shouldFail(9, greaterThan(10), "Expected: a value greater than <10> "
+        "Actual: <9> "
+        "Which: is not a value greater than <10>");
+  });
+
+  test('greaterThanOrEqualTo', () {
+    shouldPass(10, greaterThanOrEqualTo(10));
+    shouldFail(9, greaterThanOrEqualTo(10),
+        "Expected: a value greater than or equal to <10> "
+        "Actual: <9> "
+        "Which: is not a value greater than or equal to <10>");
+  });
+
+  test('lessThan', () {
+    shouldFail(10, lessThan(9), "Expected: a value less than <9> "
+        "Actual: <10> "
+        "Which: is not a value less than <9>");
+    shouldPass(9, lessThan(10));
+  });
+
+  test('lessThanOrEqualTo', () {
+    shouldPass(10, lessThanOrEqualTo(10));
+    shouldFail(11, lessThanOrEqualTo(10),
+        "Expected: a value less than or equal to <10> "
+        "Actual: <11> "
+        "Which: is not a value less than or equal to <10>");
+  });
+
+  test('isZero', () {
+    shouldPass(0, isZero);
+    shouldFail(1, isZero, "Expected: a value equal to <0> "
+        "Actual: <1> "
+        "Which: is not a value equal to <0>");
+  });
+
+  test('isNonZero', () {
+    shouldFail(0, isNonZero, "Expected: a value not equal to <0> "
+        "Actual: <0> "
+        "Which: is not a value not equal to <0>");
+    shouldPass(1, isNonZero);
+  });
+
+  test('isPositive', () {
+    shouldFail(-1, isPositive, "Expected: a positive value "
+        "Actual: <-1> "
+        "Which: is not a positive value");
+    shouldFail(0, isPositive, "Expected: a positive value "
+        "Actual: <0> "
+        "Which: is not a positive value");
+    shouldPass(1, isPositive);
+  });
+
+  test('isNegative', () {
+    shouldPass(-1, isNegative);
+    shouldFail(0, isNegative, "Expected: a negative value "
+        "Actual: <0> "
+        "Which: is not a negative value");
+  });
+
+  test('isNonPositive', () {
+    shouldPass(-1, isNonPositive);
+    shouldPass(0, isNonPositive);
+    shouldFail(1, isNonPositive, "Expected: a non-positive value "
+        "Actual: <1> "
+        "Which: is not a non-positive value");
+  });
+
+  test('isNonNegative', () {
+    shouldPass(1, isNonNegative);
+    shouldPass(0, isNonNegative);
+    shouldFail(-1, isNonNegative, "Expected: a non-negative value "
+        "Actual: <-1> "
+        "Which: is not a non-negative value");
+  });
+
+  test('closeTo', () {
+    shouldPass(0, closeTo(0, 1));
+    shouldPass(-1, closeTo(0, 1));
+    shouldPass(1, closeTo(0, 1));
+    shouldFail(1.001, closeTo(0, 1),
+        "Expected: a numeric value within <1> of <0> "
+        "Actual: <1.001> "
+        "Which: differs by <1.001>");
+    shouldFail(-1.001, closeTo(0, 1),
+        "Expected: a numeric value within <1> of <0> "
+        "Actual: <-1.001> "
+        "Which: differs by <1.001>");
+  });
+
+  test('inInclusiveRange', () {
+    shouldFail(-1, inInclusiveRange(0, 2),
+        "Expected: be in range from 0 (inclusive) to 2 (inclusive) "
+        "Actual: <-1>");
+    shouldPass(0, inInclusiveRange(0, 2));
+    shouldPass(1, inInclusiveRange(0, 2));
+    shouldPass(2, inInclusiveRange(0, 2));
+    shouldFail(3, inInclusiveRange(0, 2),
+        "Expected: be in range from 0 (inclusive) to 2 (inclusive) "
+        "Actual: <3>");
+  });
+
+  test('inExclusiveRange', () {
+    shouldFail(0, inExclusiveRange(0, 2),
+        "Expected: be in range from 0 (exclusive) to 2 (exclusive) "
+        "Actual: <0>");
+    shouldPass(1, inExclusiveRange(0, 2));
+    shouldFail(2, inExclusiveRange(0, 2),
+        "Expected: be in range from 0 (exclusive) to 2 (exclusive) "
+        "Actual: <2>");
+  });
+
+  test('inOpenClosedRange', () {
+    shouldFail(0, inOpenClosedRange(0, 2),
+        "Expected: be in range from 0 (exclusive) to 2 (inclusive) "
+        "Actual: <0>");
+    shouldPass(1, inOpenClosedRange(0, 2));
+    shouldPass(2, inOpenClosedRange(0, 2));
+  });
+
+  test('inClosedOpenRange', () {
+    shouldPass(0, inClosedOpenRange(0, 2));
+    shouldPass(1, inClosedOpenRange(0, 2));
+    shouldFail(2, inClosedOpenRange(0, 2),
+        "Expected: be in range from 0 (inclusive) to 2 (exclusive) "
+        "Actual: <2>");
+  });
+}
diff --git a/mojo/public/dart/third_party/matcher/test/operator_matchers_test.dart b/mojo/public/dart/third_party/matcher/test/operator_matchers_test.dart
new file mode 100644
index 0000000..003eb34
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/test/operator_matchers_test.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.operator_matchers_test;
+
+import 'package:matcher/matcher.dart';
+import 'package:test/test.dart'
+    show test, group, expect, throwsArgumentError;
+
+import 'test_utils.dart';
+
+void main() {
+  test('anyOf', () {
+    // with a list
+    shouldFail(
+        0, anyOf([equals(1), equals(2)]), "Expected: (<1> or <2>) Actual: <0>");
+    shouldPass(1, anyOf([equals(1), equals(2)]));
+
+    // with individual items
+    shouldFail(
+        0, anyOf(equals(1), equals(2)), "Expected: (<1> or <2>) Actual: <0>");
+    shouldPass(1, anyOf(equals(1), equals(2)));
+  });
+
+  test('allOf', () {
+    // with a list
+    shouldPass(1, allOf([lessThan(10), greaterThan(0)]));
+    shouldFail(-1, allOf([lessThan(10), greaterThan(0)]),
+        "Expected: (a value less than <10> and a value greater than <0>) "
+        "Actual: <-1> "
+        "Which: is not a value greater than <0>");
+
+    // with individual items
+    shouldPass(1, allOf(lessThan(10), greaterThan(0)));
+    shouldFail(-1, allOf(lessThan(10), greaterThan(0)),
+        "Expected: (a value less than <10> and a value greater than <0>) "
+        "Actual: <-1> "
+        "Which: is not a value greater than <0>");
+
+    // with maximum items
+    shouldPass(1, allOf(lessThan(10), lessThan(9), lessThan(8),
+        lessThan(7), lessThan(6), lessThan(5), lessThan(4)));
+    shouldFail(4, allOf(lessThan(10), lessThan(9), lessThan(8), lessThan(7),
+            lessThan(6), lessThan(5), lessThan(4)),
+        "Expected: (a value less than <10> and a value less than <9> and a "
+        "value less than <8> and a value less than <7> and a value less than "
+        "<6> and a value less than <5> and a value less than <4>) "
+        "Actual: <4> "
+        "Which: is not a value less than <4>");
+  });
+
+  test('If the first argument is a List, the rest must be null', () {
+    expect(() => allOf([], 5), throwsArgumentError);
+    expect(
+        () => anyOf([], null, null, null, null, null, 42), throwsArgumentError);
+  });
+}
diff --git a/mojo/public/dart/third_party/matcher/test/pretty_print_test.dart b/mojo/public/dart/third_party/matcher/test/pretty_print_test.dart
new file mode 100644
index 0000000..1319b9c
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/test/pretty_print_test.dart
@@ -0,0 +1,237 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.pretty_print_test;
+
+import 'dart:collection';
+
+import 'package:matcher/matcher.dart';
+import 'package:matcher/src/pretty_print.dart';
+import 'package:test/test.dart' show group, test, expect;
+
+class DefaultToString {}
+
+class CustomToString {
+  String toString() => "string representation";
+}
+
+class _PrivateName {
+  String toString() => "string representation";
+}
+
+class _PrivateNameIterable extends IterableMixin {
+  Iterator get iterator => [1, 2, 3].iterator;
+}
+
+void main() {
+  test('with primitive objects', () {
+    expect(prettyPrint(12), equals('<12>'));
+    expect(prettyPrint(12.13), equals('<12.13>'));
+    expect(prettyPrint(true), equals('<true>'));
+    expect(prettyPrint(null), equals('<null>'));
+    expect(prettyPrint(() => 12), matches(r'<Closure(: \(\) => dynamic)?>'));
+  });
+
+  group('with a string', () {
+    test('containing simple characters', () {
+      expect(prettyPrint('foo'), equals("'foo'"));
+    });
+
+    test('containing newlines', () {
+      expect(prettyPrint('foo\nbar\nbaz'), equals("'foo\\n'\n"
+          "  'bar\\n'\n"
+          "  'baz'"));
+    });
+
+    test('containing escapable characters', () {
+      expect(
+          prettyPrint("foo\rbar\tbaz'qux\v"), equals(r"'foo\rbar\tbaz\'qux\v'"));
+    });
+  });
+
+  group('with an iterable', () {
+    test('containing primitive objects', () {
+      expect(prettyPrint([1, true, 'foo']), equals("[1, true, 'foo']"));
+    });
+
+    test('containing a multiline string', () {
+      expect(prettyPrint(['foo', 'bar\nbaz\nbip', 'qux']), equals("[\n"
+          "  'foo',\n"
+          "  'bar\\n'\n"
+          "    'baz\\n'\n"
+          "    'bip',\n"
+          "  'qux'\n"
+          "]"));
+    });
+
+    test('containing a matcher', () {
+      expect(prettyPrint(['foo', endsWith('qux')]),
+          equals("['foo', <a string ending with 'qux'>]"));
+    });
+
+    test("that's under maxLineLength", () {
+      expect(prettyPrint([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxLineLength: 30),
+          equals("[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]"));
+    });
+
+    test("that's over maxLineLength", () {
+      expect(prettyPrint([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxLineLength: 29),
+          equals("[\n"
+              "  0,\n"
+              "  1,\n"
+              "  2,\n"
+              "  3,\n"
+              "  4,\n"
+              "  5,\n"
+              "  6,\n"
+              "  7,\n"
+              "  8,\n"
+              "  9\n"
+              "]"));
+    });
+
+    test("factors indentation into maxLineLength", () {
+      expect(prettyPrint(["foo\nbar", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],],
+          maxLineLength: 30), equals("[\n"
+          "  'foo\\n'\n"
+          "    'bar',\n"
+          "  [\n"
+          "    0,\n"
+          "    1,\n"
+          "    2,\n"
+          "    3,\n"
+          "    4,\n"
+          "    5,\n"
+          "    6,\n"
+          "    7,\n"
+          "    8,\n"
+          "    9\n"
+          "  ]\n"
+          "]"));
+    });
+
+    test("that's under maxItems", () {
+      expect(prettyPrint([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxItems: 10),
+          equals("[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]"));
+    });
+
+    test("that's over maxItems", () {
+      expect(prettyPrint([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxItems: 9),
+          equals("[0, 1, 2, 3, 4, 5, 6, 7, ...]"));
+    });
+
+    test("that's recursive", () {
+      var list = [1, 2, 3];
+      list.add(list);
+      expect(prettyPrint(list), equals("[1, 2, 3, (recursive)]"));
+    });
+  });
+
+  group("with a map", () {
+    test('containing primitive objects', () {
+      expect(prettyPrint({'foo': 1, 'bar': true}),
+          equals("{'foo': 1, 'bar': true}"));
+    });
+
+    test('containing a multiline string key', () {
+      expect(prettyPrint({'foo\nbar': 1, 'bar': true}), equals("{\n"
+          "  'foo\\n'\n"
+          "    'bar': 1,\n"
+          "  'bar': true\n"
+          "}"));
+    });
+
+    test('containing a multiline string value', () {
+      expect(prettyPrint({'foo': 'bar\nbaz', 'qux': true}), equals("{\n"
+          "  'foo': 'bar\\n'\n"
+          "    'baz',\n"
+          "  'qux': true\n"
+          "}"));
+    });
+
+    test('containing a multiline string key/value pair', () {
+      expect(prettyPrint({'foo\nbar': 'baz\nqux'}), equals("{\n"
+          "  'foo\\n'\n"
+          "    'bar': 'baz\\n'\n"
+          "    'qux'\n"
+          "}"));
+    });
+
+    test('containing a matcher key', () {
+      expect(prettyPrint({endsWith('bar'): 'qux'}),
+          equals("{<a string ending with 'bar'>: 'qux'}"));
+    });
+
+    test('containing a matcher value', () {
+      expect(prettyPrint({'foo': endsWith('qux')}),
+          equals("{'foo': <a string ending with 'qux'>}"));
+    });
+
+    test("that's under maxLineLength", () {
+      expect(prettyPrint({'0': 1, '2': 3, '4': 5, '6': 7}, maxLineLength: 32),
+          equals("{'0': 1, '2': 3, '4': 5, '6': 7}"));
+    });
+
+    test("that's over maxLineLength", () {
+      expect(prettyPrint({'0': 1, '2': 3, '4': 5, '6': 7}, maxLineLength: 31),
+          equals("{\n"
+              "  '0': 1,\n"
+              "  '2': 3,\n"
+              "  '4': 5,\n"
+              "  '6': 7\n"
+              "}"));
+    });
+
+    test("factors indentation into maxLineLength", () {
+      expect(prettyPrint(["foo\nbar", {'0': 1, '2': 3, '4': 5, '6': 7}],
+          maxLineLength: 32), equals("[\n"
+          "  'foo\\n'\n"
+          "    'bar',\n"
+          "  {\n"
+          "    '0': 1,\n"
+          "    '2': 3,\n"
+          "    '4': 5,\n"
+          "    '6': 7\n"
+          "  }\n"
+          "]"));
+    });
+
+    test("that's under maxItems", () {
+      expect(prettyPrint({'0': 1, '2': 3, '4': 5, '6': 7}, maxItems: 4),
+          equals("{'0': 1, '2': 3, '4': 5, '6': 7}"));
+    });
+
+    test("that's over maxItems", () {
+      expect(prettyPrint({'0': 1, '2': 3, '4': 5, '6': 7}, maxItems: 3),
+          equals("{'0': 1, '2': 3, ...}"));
+    });
+  });
+  group('with an object', () {
+    test('with a default [toString]', () {
+      expect(prettyPrint(new DefaultToString()),
+          equals("<Instance of 'DefaultToString'>"));
+    });
+
+    test('with a custom [toString]', () {
+      expect(prettyPrint(new CustomToString()),
+          equals('CustomToString:<string representation>'));
+    });
+
+    test('with a custom [toString] and a private name', () {
+      expect(
+          prettyPrint(new _PrivateName()), equals('?:<string representation>'));
+    });
+  });
+
+  group('with an iterable', () {
+    test("that's not a list", () {
+      expect(prettyPrint([1, 2, 3, 4].map((n) => n * 2)),
+          equals("MappedListIterable:[2, 4, 6, 8]"));
+    });
+
+    test("that's not a list and has a private name", () {
+      expect(prettyPrint(new _PrivateNameIterable()), equals("?:[1, 2, 3]"));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/matcher/test/string_matchers_test.dart b/mojo/public/dart/third_party/matcher/test/string_matchers_test.dart
new file mode 100644
index 0000000..38fa129
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/test/string_matchers_test.dart
@@ -0,0 +1,113 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.string_matchers_test;
+
+import 'package:matcher/matcher.dart';
+import 'package:test/test.dart' show test, group, expect;
+
+import 'test_utils.dart';
+
+void main() {
+  test('Reports mismatches in whitespace and escape sequences', () {
+    shouldFail('before\nafter', equals('before\\nafter'),
+        contains('Differ at offset 7'));
+  });
+
+  test('collapseWhitespace', () {
+    var source = '\t\r\n hello\t\r\n world\r\t \n';
+    expect(collapseWhitespace(source), 'hello world');
+  });
+
+  test('isEmpty', () {
+    shouldPass('', isEmpty);
+    shouldFail(null, isEmpty, startsWith("Expected: empty  Actual: <null>"));
+    shouldFail(0, isEmpty, startsWith("Expected: empty  Actual: <0>"));
+    shouldFail('a', isEmpty, startsWith("Expected: empty  Actual: 'a'"));
+  });
+
+  // Regression test for: https://code.google.com/p/dart/issues/detail?id=21562
+  test('isNot(isEmpty)', () {
+    shouldPass('a', isNot(isEmpty));
+    shouldFail('', isNot(isEmpty), 'Expected: not empty Actual: \'\'');
+    shouldFail(null, isNot(isEmpty),
+        startsWith('Expected: not empty  Actual: <null>'));
+  });
+
+  test('isNotEmpty', () {
+    shouldFail('', isNotEmpty, startsWith("Expected: non-empty  Actual: ''"));
+    shouldFail(
+        null, isNotEmpty, startsWith("Expected: non-empty  Actual: <null>"));
+    shouldFail(0, isNotEmpty, startsWith("Expected: non-empty  Actual: <0>"));
+    shouldPass('a', isNotEmpty);
+  });
+
+  test('equalsIgnoringCase', () {
+    shouldPass('hello', equalsIgnoringCase('HELLO'));
+    shouldFail('hi', equalsIgnoringCase('HELLO'),
+        "Expected: 'HELLO' ignoring case Actual: 'hi'");
+  });
+
+  test('equalsIgnoringWhitespace', () {
+    shouldPass(' hello   world  ', equalsIgnoringWhitespace('hello world'));
+    shouldFail(' helloworld  ', equalsIgnoringWhitespace('hello world'),
+        "Expected: 'hello world' ignoring whitespace "
+        "Actual: ' helloworld ' "
+        "Which: is 'helloworld' with whitespace compressed");
+  });
+
+  test('startsWith', () {
+    shouldPass('hello', startsWith(''));
+    shouldPass('hello', startsWith('hell'));
+    shouldPass('hello', startsWith('hello'));
+    shouldFail('hello', startsWith('hello '),
+        "Expected: a string starting with 'hello ' "
+        "Actual: 'hello'");
+  });
+
+  test('endsWith', () {
+    shouldPass('hello', endsWith(''));
+    shouldPass('hello', endsWith('lo'));
+    shouldPass('hello', endsWith('hello'));
+    shouldFail('hello', endsWith(' hello'),
+        "Expected: a string ending with ' hello' "
+        "Actual: 'hello'");
+  });
+
+  test('contains', () {
+    shouldPass('hello', contains(''));
+    shouldPass('hello', contains('h'));
+    shouldPass('hello', contains('o'));
+    shouldPass('hello', contains('hell'));
+    shouldPass('hello', contains('hello'));
+    shouldFail(
+        'hello', contains(' '), "Expected: contains ' ' Actual: 'hello'");
+  });
+
+  test('stringContainsInOrder', () {
+    shouldPass('goodbye cruel world', stringContainsInOrder(['']));
+    shouldPass('goodbye cruel world', stringContainsInOrder(['goodbye']));
+    shouldPass('goodbye cruel world', stringContainsInOrder(['cruel']));
+    shouldPass('goodbye cruel world', stringContainsInOrder(['world']));
+    shouldPass(
+        'goodbye cruel world', stringContainsInOrder(['good', 'bye', 'world']));
+    shouldPass(
+        'goodbye cruel world', stringContainsInOrder(['goodbye', 'cruel']));
+    shouldPass(
+        'goodbye cruel world', stringContainsInOrder(['cruel', 'world']));
+    shouldPass('goodbye cruel world',
+        stringContainsInOrder(['goodbye', 'cruel', 'world']));
+    shouldFail('goodbye cruel world',
+        stringContainsInOrder(['goo', 'cruel', 'bye']),
+        "Expected: a string containing 'goo', 'cruel', 'bye' in order "
+        "Actual: 'goodbye cruel world'");
+  });
+
+  test('matches', () {
+    shouldPass('c0d', matches('[a-z][0-9][a-z]'));
+    shouldPass('c0d', matches(new RegExp('[a-z][0-9][a-z]')));
+    shouldFail('cOd', matches('[a-z][0-9][a-z]'),
+        "Expected: match '[a-z][0-9][a-z]' Actual: 'cOd'");
+  });
+}
diff --git a/mojo/public/dart/third_party/matcher/test/test_utils.dart b/mojo/public/dart/third_party/matcher/test/test_utils.dart
new file mode 100644
index 0000000..f95c2b9
--- /dev/null
+++ b/mojo/public/dart/third_party/matcher/test/test_utils.dart
@@ -0,0 +1,86 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.test_utils;
+
+import 'dart:collection';
+
+import 'package:test/test.dart';
+
+void shouldFail(value, Matcher matcher, expected) {
+  var failed = false;
+  try {
+    expect(value, matcher);
+  } on TestFailure catch (err) {
+    failed = true;
+
+    var _errorString = err.message;
+
+    if (expected is String) {
+      expect(_errorString, equalsIgnoringWhitespace(expected));
+    } else {
+      expect(_errorString.replaceAll('\n', ''), expected);
+    }
+  }
+
+  expect(failed, isTrue, reason: 'Expected to fail.');
+}
+
+void shouldPass(value, Matcher matcher) {
+  expect(value, matcher);
+}
+
+doesNotThrow() {}
+doesThrow() {
+  throw 'X';
+}
+
+class Widget {
+  int price;
+}
+
+class HasPrice extends CustomMatcher {
+  HasPrice(matcher) : super("Widget with a price that is", "price", matcher);
+  featureValueOf(actual) => actual.price;
+}
+
+class SimpleIterable extends IterableBase<int> {
+  final int count;
+
+  SimpleIterable(this.count);
+
+  bool contains(int val) => count < val ? false : true;
+
+  bool any(bool f(element)) {
+    for (var i = 0; i <= count; i++) {
+      if (f(i)) return true;
+    }
+    return false;
+  }
+
+  String toString() => "<[$count]>";
+
+  Iterator get iterator {
+    return new _SimpleIterator(count);
+  }
+}
+
+class _SimpleIterator implements Iterator<int> {
+  int _count;
+  int _current;
+
+  _SimpleIterator(this._count);
+
+  bool moveNext() {
+    if (_count > 0) {
+      _current = _count;
+      _count--;
+      return true;
+    }
+    _current = null;
+    return false;
+  }
+
+  int get current => _current;
+}
diff --git a/mojo/public/dart/third_party/mime/CHANGELOG.md b/mojo/public/dart/third_party/mime/CHANGELOG.md
new file mode 100644
index 0000000..98abd3a
--- /dev/null
+++ b/mojo/public/dart/third_party/mime/CHANGELOG.md
@@ -0,0 +1,13 @@
+# 0.9.3
+
+* Fixed erroneous behavior for listening and when pausing/resuming
+  stream of parts.
+
+# 0.9.2
+
+* Fixed erroneous behavior when pausing/canceling stream of parts but already
+  listened to one part.
+
+# 0.9.1
+
+* Handle parsing of MIME multipart content with no parts.
diff --git a/mojo/public/dart/third_party/mime/LICENSE b/mojo/public/dart/third_party/mime/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/mojo/public/dart/third_party/mime/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/mime/README.md b/mojo/public/dart/third_party/mime/README.md
new file mode 100644
index 0000000..dd69358
--- /dev/null
+++ b/mojo/public/dart/third_party/mime/README.md
@@ -0,0 +1,48 @@
+#MIME type package
+
+Package for working with MIME type definitions and for processing
+streams of MIME multipart media types.
+
+##Determining the MIME type for a file
+
+The `MimeTypeResolver` class can be used to determine the MIME type of
+a file. It supports both using the extension of the file name and
+looking at magic bytes from the begining of the file.
+
+There is a builtin instance of `MimeTypeResolver` accessible through
+the top level function `lookupMimeType`. This builtin instance has
+the most common file name extensions and magic bytes registered.
+
+    print(lookupMimeType('test.html'));  // Will print text/html
+    print(lookupMimeType('test', [0xFF, 0xD8]));  // Will print image/jpeg
+    print(lookupMimeType('test.html', [0xFF, 0xD8]));  // Will print image/jpeg
+
+You can build you own resolver by creating an instance of
+`MimeTypeResolver` and adding file name extensions and magic bytes
+using `addExtension` and `addMagicNumber`.
+
+##Processing MIME multipart media types
+
+The class `MimeMultipartTransformer` is used to process a `Stream` of
+bytes encoded using a MIME multipart media types encoding. The
+transformer provides a new `Stream` of `MimeMultipart` objects each of
+which have the headers and the content of each part. The content of a
+part is provided as a stream of bytes.
+
+Below is an example showing how to process an HTTP request and print
+the length of the content of each part.
+
+    // HTTP request with content type multipart/form-data.
+    HttpRequest request = ...;
+    // Determine the boundary form the content type header
+    String boundary = request.headers.contentType.parameters['boundary'];
+
+    // Process the body just calculating the length of each part.
+    request.transform(new MimeMultipartTransformer(boundary))
+        .map((part) => part.fold(0, (p, d) => p + d))
+        .listen((length) => print('Part with length $length'));
+
+Take a look at the `HttpBodyHandler` in the [http_server][1] package for
+handling different content types in a HTTP request.
+
+[1]: https://pub.dartlang.org/packages/http_server
diff --git a/mojo/public/dart/third_party/mime/lib/mime.dart b/mojo/public/dart/third_party/mime/lib/mime.dart
new file mode 100644
index 0000000..dce6774
--- /dev/null
+++ b/mojo/public/dart/third_party/mime/lib/mime.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Help for working with file format identifiers
+ * such as `text/html` and `image/png`.
+ *
+ * More details, including a list of types, are in the Wikipedia article
+ * [Internet media type](http://en.wikipedia.org/wiki/Internet_media_type).
+ * For information on installing and importing this library, see the
+ * [mime package on pub.dartlang.org]
+ * (http://pub.dartlang.org/packages/mime).
+ */
+library mime;
+
+export 'src/mime_multipart_transformer.dart';
+export 'src/mime_shared.dart';
+export 'src/mime_type.dart';
diff --git a/mojo/public/dart/third_party/mime/lib/src/bound_multipart_stream.dart b/mojo/public/dart/third_party/mime/lib/src/bound_multipart_stream.dart
new file mode 100644
index 0000000..ab06dab
--- /dev/null
+++ b/mojo/public/dart/third_party/mime/lib/src/bound_multipart_stream.dart
@@ -0,0 +1,395 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+library mime.bound_multipart_stream;
+
+import 'dart:async';
+import 'dart:convert';
+
+import 'mime_shared.dart';
+import 'char_code.dart';
+
+// Bytes for '()<>@,;:\\"/[]?={} \t'.
+const _SEPARATORS = const [40, 41, 60, 62, 64, 44, 59, 58, 92, 34, 47, 91, 93,
+                           63, 61, 123, 125, 32, 9];
+
+bool _isTokenChar(int byte) {
+  return byte > 31 && byte < 128 && _SEPARATORS.indexOf(byte) == -1;
+}
+
+int _toLowerCase(int byte) {
+  const delta = CharCode.LOWER_A - CharCode.UPPER_A;
+  return (CharCode.UPPER_A <= byte && byte <= CharCode.UPPER_Z) ?
+      byte + delta : byte;
+}
+
+void _expectByteValue(int val1, int val2) {
+  if (val1 != val2) {
+    throw new MimeMultipartException("Failed to parse multipart mime 1");
+  }
+}
+
+void _expectWhitespace(int byte) {
+  if (byte != CharCode.SP && byte != CharCode.HT) {
+    throw new MimeMultipartException("Failed to parse multipart mime 2");
+  }
+}
+
+class _MimeMultipart extends MimeMultipart {
+  final Map<String, String> headers;
+  final Stream<List<int>> _stream;
+
+  _MimeMultipart(this.headers, this._stream);
+
+  StreamSubscription<List<int>> listen(void onData(List<int> data),
+                                       {void onDone(),
+                                        Function onError,
+                                        bool cancelOnError}) {
+    return _stream.listen(onData,
+                          onDone: onDone,
+                          onError: onError,
+                          cancelOnError: cancelOnError);
+  }
+}
+
+class BoundMultipartStream {
+   static const int _START = 0;
+   static const int _BOUNDARY_ENDING = 1;
+   static const int _BOUNDARY_END = 2;
+   static const int _HEADER_START = 3;
+   static const int _HEADER_FIELD = 4;
+   static const int _HEADER_VALUE_START = 5;
+   static const int _HEADER_VALUE = 6;
+   static const int _HEADER_VALUE_FOLDING_OR_ENDING = 7;
+   static const int _HEADER_VALUE_FOLD_OR_END = 8;
+   static const int _HEADER_ENDING = 9;
+   static const int _CONTENT = 10;
+   static const int _LAST_BOUNDARY_DASH2 = 11;
+   static const int _LAST_BOUNDARY_ENDING = 12;
+   static const int _LAST_BOUNDARY_END = 13;
+   static const int _DONE = 14;
+   static const int _FAIL = 15;
+
+   final List<int> _boundary;
+   final List<int> _headerField = [];
+   final List<int> _headerValue = [];
+
+   // The following states belong to `_controller`, state changes will not be
+   // immediately acted upon but rather only after the current
+   // `_multipartController` is done.
+   static const int _CONTROLLER_STATE_IDLE = 0;
+   static const int _CONTROLLER_STATE_ACTIVE = 1;
+   static const int _CONTROLLER_STATE_PAUSED = 2;
+   static const int _CONTROLLER_STATE_CANCELED = 3;
+
+   int _controllerState = _CONTROLLER_STATE_IDLE;
+
+   StreamController _controller;
+
+   Stream<MimeMultipart> get stream => _controller.stream;
+
+   StreamSubscription _subscription;
+
+   StreamController _multipartController;
+   Map<String, String> _headers;
+
+   int _state = _START;
+   int _boundaryIndex = 2;
+
+   // Current index in the data buffer. If index is negative then it
+   // is the index into the artificial prefix of the boundary string.
+   int _index;
+   List<int> _buffer;
+
+   BoundMultipartStream(this._boundary, Stream<List<int>> stream) {
+     _controller = new StreamController(
+         sync: true,
+         onPause: _pauseStream,
+         onResume: _resumeStream,
+         onCancel: () {
+           _controllerState = _CONTROLLER_STATE_CANCELED;
+           _tryPropagateControllerState();
+         },
+         onListen: () {
+           _controllerState = _CONTROLLER_STATE_ACTIVE;
+           _subscription = stream.listen(
+               (data) {
+                 assert(_buffer == null);
+                 _subscription.pause();
+                 _buffer = data;
+                 _index = 0;
+                 _parse();
+               },
+               onDone: () {
+                 if (_state != _DONE) {
+                   _controller.addError(
+                       new MimeMultipartException("Bad multipart ending"));
+                 }
+                 _controller.close();
+               },
+               onError: _controller.addError);
+         });
+   }
+
+   void _resumeStream() {
+     assert (_controllerState == _CONTROLLER_STATE_PAUSED);
+     _controllerState = _CONTROLLER_STATE_ACTIVE;
+     _tryPropagateControllerState();
+   }
+
+   void _pauseStream() {
+     _controllerState = _CONTROLLER_STATE_PAUSED;
+     _tryPropagateControllerState();
+   }
+
+   void _tryPropagateControllerState() {
+     if (_multipartController == null) {
+       switch (_controllerState) {
+         case _CONTROLLER_STATE_ACTIVE:
+           if (_subscription.isPaused) _subscription.resume();
+           break;
+         case _CONTROLLER_STATE_PAUSED:
+           if (!_subscription.isPaused) _subscription.pause();
+           break;
+         case _CONTROLLER_STATE_CANCELED:
+           _subscription.cancel();
+            break;
+         default:
+           throw new StateError("This code should never be reached.");
+       }
+     }
+   }
+
+   void _parse() {
+     // Number of boundary bytes to artificially place before the supplied data.
+     int boundaryPrefix = 0;
+     // Position where content starts. Will be null if no known content
+     // start exists. Will be negative of the content starts in the
+     // boundary prefix. Will be zero or position if the content starts
+     // in the current buffer.
+     int contentStartIndex;
+
+     // Function to report content data for the current part. The data
+     // reported is from the current content start index up til the
+     // current index. As the data can be artificially prefixed with a
+     // prefix of the boundary both the content start index and index
+     // can be negative.
+     void reportData() {
+       if (contentStartIndex < 0) {
+         var contentLength = boundaryPrefix + _index - _boundaryIndex;
+         if (contentLength <= boundaryPrefix) {
+           _multipartController.add(
+               _boundary.sublist(0, contentLength));
+         } else {
+           _multipartController.add(
+               _boundary.sublist(0, boundaryPrefix));
+           _multipartController.add(
+               _buffer.sublist(0, contentLength - boundaryPrefix));
+         }
+       } else {
+         var contentEndIndex = _index - _boundaryIndex;
+         _multipartController.add(
+             _buffer.sublist(contentStartIndex, contentEndIndex));
+       }
+     }
+
+     if (_state == _CONTENT && _boundaryIndex == 0) {
+       contentStartIndex = 0;
+     } else {
+       contentStartIndex = null;
+     }
+     // The data to parse might be "artificially" prefixed with a
+     // partial match of the boundary.
+     boundaryPrefix = _boundaryIndex;
+
+     while ((_index < _buffer.length) && _state != _FAIL && _state != _DONE) {
+       int byte;
+       if (_index < 0) {
+         byte = _boundary[boundaryPrefix + _index];
+       } else {
+         byte = _buffer[_index];
+       }
+       switch (_state) {
+         case _START:
+           if (byte == _boundary[_boundaryIndex]) {
+             _boundaryIndex++;
+             if (_boundaryIndex == _boundary.length) {
+               _state = _BOUNDARY_ENDING;
+               _boundaryIndex = 0;
+             }
+           } else {
+             // Restart matching of the boundary.
+             _index = _index - _boundaryIndex;
+             _boundaryIndex = 0;
+           }
+           break;
+
+         case _BOUNDARY_ENDING:
+           if (byte == CharCode.CR) {
+             _state = _BOUNDARY_END;
+           } else if (byte == CharCode.DASH) {
+             _state = _LAST_BOUNDARY_DASH2;
+           } else {
+             _expectWhitespace(byte);
+           }
+           break;
+
+         case _BOUNDARY_END:
+           _expectByteValue(byte, CharCode.LF);
+           if (_multipartController != null) {
+             _multipartController.close();
+             _multipartController = null;
+             _tryPropagateControllerState();
+           }
+           _state = _HEADER_START;
+           break;
+
+         case _HEADER_START:
+           _headers = new Map<String, String>();
+           if (byte == CharCode.CR) {
+             _state = _HEADER_ENDING;
+           } else {
+             // Start of new header field.
+             _headerField.add(_toLowerCase(byte));
+             _state = _HEADER_FIELD;
+           }
+           break;
+
+         case _HEADER_FIELD:
+           if (byte == CharCode.COLON) {
+             _state = _HEADER_VALUE_START;
+           } else {
+             if (!_isTokenChar(byte)) {
+               throw new MimeMultipartException("Invalid header field name");
+             }
+             _headerField.add(_toLowerCase(byte));
+           }
+           break;
+
+         case _HEADER_VALUE_START:
+           if (byte == CharCode.CR) {
+             _state = _HEADER_VALUE_FOLDING_OR_ENDING;
+           } else if (byte != CharCode.SP && byte != CharCode.HT) {
+             // Start of new header value.
+             _headerValue.add(byte);
+             _state = _HEADER_VALUE;
+           }
+           break;
+
+         case _HEADER_VALUE:
+           if (byte == CharCode.CR) {
+             _state = _HEADER_VALUE_FOLDING_OR_ENDING;
+           } else {
+             _headerValue.add(byte);
+           }
+           break;
+
+         case _HEADER_VALUE_FOLDING_OR_ENDING:
+           _expectByteValue(byte, CharCode.LF);
+           _state = _HEADER_VALUE_FOLD_OR_END;
+           break;
+
+         case _HEADER_VALUE_FOLD_OR_END:
+           if (byte == CharCode.SP || byte == CharCode.HT) {
+             _state = _HEADER_VALUE_START;
+           } else {
+             String headerField = UTF8.decode(_headerField);
+             String headerValue = UTF8.decode(_headerValue);
+             _headers[headerField.toLowerCase()] = headerValue;
+             _headerField.clear();
+             _headerValue.clear();
+             if (byte == CharCode.CR) {
+               _state = _HEADER_ENDING;
+             } else {
+               // Start of new header field.
+               _headerField.add(_toLowerCase(byte));
+               _state = _HEADER_FIELD;
+             }
+           }
+           break;
+
+         case _HEADER_ENDING:
+           _expectByteValue(byte, CharCode.LF);
+           _multipartController = new StreamController(
+               sync: true,
+               onListen: () {
+                 if (_subscription.isPaused) _subscription.resume();
+               },
+               onPause: _subscription.pause,
+               onResume: _subscription.resume);
+           _controller.add(
+               new _MimeMultipart(_headers, _multipartController.stream));
+           _headers = null;
+           _state = _CONTENT;
+           contentStartIndex = _index + 1;
+           break;
+
+         case _CONTENT:
+           if (byte == _boundary[_boundaryIndex]) {
+             _boundaryIndex++;
+             if (_boundaryIndex == _boundary.length) {
+               if (contentStartIndex != null) {
+                 _index++;
+                 reportData();
+                 _index--;
+               }
+               _multipartController.close();
+               _multipartController = null;
+               _tryPropagateControllerState();
+               _boundaryIndex = 0;
+               _state = _BOUNDARY_ENDING;
+             }
+           } else {
+             // Restart matching of the boundary.
+             _index = _index - _boundaryIndex;
+             if (contentStartIndex == null) contentStartIndex = _index;
+             _boundaryIndex = 0;
+           }
+           break;
+
+         case _LAST_BOUNDARY_DASH2:
+           _expectByteValue(byte, CharCode.DASH);
+           _state = _LAST_BOUNDARY_ENDING;
+           break;
+
+         case _LAST_BOUNDARY_ENDING:
+           if (byte == CharCode.CR) {
+             _state = _LAST_BOUNDARY_END;
+           } else {
+             _expectWhitespace(byte);
+           }
+           break;
+
+         case _LAST_BOUNDARY_END:
+           _expectByteValue(byte, CharCode.LF);
+           if (_multipartController != null) {
+             _multipartController.close();
+             _multipartController = null;
+             _tryPropagateControllerState();
+           }
+           _state = _DONE;
+           break;
+
+         default:
+           // Should be unreachable.
+           assert(false);
+           break;
+       }
+
+       // Move to the next byte.
+       _index++;
+     }
+
+     // Report any known content.
+     if (_state == _CONTENT && contentStartIndex != null) {
+       reportData();
+     }
+
+     // Resume if at end.
+     if (_index == _buffer.length) {
+       _buffer = null;
+       _index = null;
+       _subscription.resume();
+     }
+   }
+}
diff --git a/mojo/public/dart/third_party/mime/lib/src/char_code.dart b/mojo/public/dart/third_party/mime/lib/src/char_code.dart
new file mode 100644
index 0000000..f455e68
--- /dev/null
+++ b/mojo/public/dart/third_party/mime/lib/src/char_code.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+library mime.char_code;
+
+class CharCode {
+  static const int HT = 9;
+  static const int LF = 10;
+  static const int CR = 13;
+  static const int SP = 32;
+  static const int DASH = 45;
+  static const int COLON = 58;
+  static const int UPPER_A = 65;
+  static const int UPPER_Z = 90;
+  static const int LOWER_A = 97;
+}
diff --git a/mojo/public/dart/third_party/mime/lib/src/default_extension_map.dart b/mojo/public/dart/third_party/mime/lib/src/default_extension_map.dart
new file mode 100644
index 0000000..ae0d7df
--- /dev/null
+++ b/mojo/public/dart/third_party/mime/lib/src/default_extension_map.dart
@@ -0,0 +1,990 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library mime.extension_map;
+
+// TODO(ajohnsen): Use const map once Issue 7559 is fixed.
+final Map<String, String> defaultExtensionMap = <String, String>{
+'123':'application/vnd.lotus-1-2-3',
+'3dml':'text/vnd.in3d.3dml',
+'3ds':'image/x-3ds',
+'3g2':'video/3gpp2',
+'3gp':'video/3gpp',
+'7z':'application/x-7z-compressed',
+'aab':'application/x-authorware-bin',
+'aac':'audio/x-aac',
+'aam':'application/x-authorware-map',
+'aas':'application/x-authorware-seg',
+'abw':'application/x-abiword',
+'ac':'application/pkix-attr-cert',
+'acc':'application/vnd.americandynamics.acc',
+'ace':'application/x-ace-compressed',
+'acu':'application/vnd.acucobol',
+'acutc':'application/vnd.acucorp',
+'adp':'audio/adpcm',
+'aep':'application/vnd.audiograph',
+'afm':'application/x-font-type1',
+'afp':'application/vnd.ibm.modcap',
+'ahead':'application/vnd.ahead.space',
+'ai':'application/postscript',
+'aif':'audio/x-aiff',
+'aifc':'audio/x-aiff',
+'aiff':'audio/x-aiff',
+'air':'application/vnd.adobe.air-application-installer-package+zip',
+'ait':'application/vnd.dvb.ait',
+'ami':'application/vnd.amiga.ami',
+'apk':'application/vnd.android.package-archive',
+'appcache':'text/cache-manifest',
+'application':'application/x-ms-application',
+'apr':'application/vnd.lotus-approach',
+'arc':'application/x-freearc',
+'asc':'application/pgp-signature',
+'asf':'video/x-ms-asf',
+'asm':'text/x-asm',
+'aso':'application/vnd.accpac.simply.aso',
+'asx':'video/x-ms-asf',
+'atc':'application/vnd.acucorp',
+'atom':'application/atom+xml',
+'atomcat':'application/atomcat+xml',
+'atomsvc':'application/atomsvc+xml',
+'atx':'application/vnd.antix.game-component',
+'au':'audio/basic',
+'avi':'video/x-msvideo',
+'aw':'application/applixware',
+'azf':'application/vnd.airzip.filesecure.azf',
+'azs':'application/vnd.airzip.filesecure.azs',
+'azw':'application/vnd.amazon.ebook',
+'bat':'application/x-msdownload',
+'bcpio':'application/x-bcpio',
+'bdf':'application/x-font-bdf',
+'bdm':'application/vnd.syncml.dm+wbxml',
+'bed':'application/vnd.realvnc.bed',
+'bh2':'application/vnd.fujitsu.oasysprs',
+'bin':'application/octet-stream',
+'blb':'application/x-blorb',
+'blorb':'application/x-blorb',
+'bmi':'application/vnd.bmi',
+'bmp':'image/bmp',
+'book':'application/vnd.framemaker',
+'box':'application/vnd.previewsystems.box',
+'boz':'application/x-bzip2',
+'bpk':'application/octet-stream',
+'btif':'image/prs.btif',
+'bz':'application/x-bzip',
+'bz2':'application/x-bzip2',
+'c':'text/x-c',
+'c11amc':'application/vnd.cluetrust.cartomobile-config',
+'c11amz':'application/vnd.cluetrust.cartomobile-config-pkg',
+'c4d':'application/vnd.clonk.c4group',
+'c4f':'application/vnd.clonk.c4group',
+'c4g':'application/vnd.clonk.c4group',
+'c4p':'application/vnd.clonk.c4group',
+'c4u':'application/vnd.clonk.c4group',
+'cab':'application/vnd.ms-cab-compressed',
+'caf':'audio/x-caf',
+'cap':'application/vnd.tcpdump.pcap',
+'car':'application/vnd.curl.car',
+'cat':'application/vnd.ms-pki.seccat',
+'cb7':'application/x-cbr',
+'cba':'application/x-cbr',
+'cbr':'application/x-cbr',
+'cbt':'application/x-cbr',
+'cbz':'application/x-cbr',
+'cc':'text/x-c',
+'cct':'application/x-director',
+'ccxml':'application/ccxml+xml',
+'cdbcmsg':'application/vnd.contact.cmsg',
+'cdf':'application/x-netcdf',
+'cdkey':'application/vnd.mediastation.cdkey',
+'cdmia':'application/cdmi-capability',
+'cdmic':'application/cdmi-container',
+'cdmid':'application/cdmi-domain',
+'cdmio':'application/cdmi-object',
+'cdmiq':'application/cdmi-queue',
+'cdx':'chemical/x-cdx',
+'cdxml':'application/vnd.chemdraw+xml',
+'cdy':'application/vnd.cinderella',
+'cer':'application/pkix-cert',
+'cfs':'application/x-cfs-compressed',
+'cgm':'image/cgm',
+'chat':'application/x-chat',
+'chm':'application/vnd.ms-htmlhelp',
+'chrt':'application/vnd.kde.kchart',
+'cif':'chemical/x-cif',
+'cii':'application/vnd.anser-web-certificate-issue-initiation',
+'cil':'application/vnd.ms-artgalry',
+'cla':'application/vnd.claymore',
+'class':'application/java-vm',
+'clkk':'application/vnd.crick.clicker.keyboard',
+'clkp':'application/vnd.crick.clicker.palette',
+'clkt':'application/vnd.crick.clicker.template',
+'clkw':'application/vnd.crick.clicker.wordbank',
+'clkx':'application/vnd.crick.clicker',
+'clp':'application/x-msclip',
+'cmc':'application/vnd.cosmocaller',
+'cmdf':'chemical/x-cmdf',
+'cml':'chemical/x-cml',
+'cmp':'application/vnd.yellowriver-custom-menu',
+'cmx':'image/x-cmx',
+'cod':'application/vnd.rim.cod',
+'com':'application/x-msdownload',
+'conf':'text/plain',
+'cpio':'application/x-cpio',
+'cpp':'text/x-c',
+'cpt':'application/mac-compactpro',
+'crd':'application/x-mscardfile',
+'crl':'application/pkix-crl',
+'crt':'application/x-x509-ca-cert',
+'cryptonote':'application/vnd.rig.cryptonote',
+'csh':'application/x-csh',
+'csml':'chemical/x-csml',
+'csp':'application/vnd.commonspace',
+'css':'text/css',
+'cst':'application/x-director',
+'csv':'text/csv',
+'cu':'application/cu-seeme',
+'curl':'text/vnd.curl',
+'cww':'application/prs.cww',
+'cxt':'application/x-director',
+'cxx':'text/x-c',
+'dae':'model/vnd.collada+xml',
+'daf':'application/vnd.mobius.daf',
+'dart':'application/dart',
+'dataless':'application/vnd.fdsn.seed',
+'davmount':'application/davmount+xml',
+'dbk':'application/docbook+xml',
+'dcr':'application/x-director',
+'dcurl':'text/vnd.curl.dcurl',
+'dd2':'application/vnd.oma.dd2+xml',
+'ddd':'application/vnd.fujixerox.ddd',
+'deb':'application/x-debian-package',
+'def':'text/plain',
+'deploy':'application/octet-stream',
+'der':'application/x-x509-ca-cert',
+'dfac':'application/vnd.dreamfactory',
+'dgc':'application/x-dgc-compressed',
+'dic':'text/x-c',
+'dir':'application/x-director',
+'dis':'application/vnd.mobius.dis',
+'dist':'application/octet-stream',
+'distz':'application/octet-stream',
+'djv':'image/vnd.djvu',
+'djvu':'image/vnd.djvu',
+'dll':'application/x-msdownload',
+'dmg':'application/x-apple-diskimage',
+'dmp':'application/vnd.tcpdump.pcap',
+'dms':'application/octet-stream',
+'dna':'application/vnd.dna',
+'doc':'application/msword',
+'docm':'application/vnd.ms-word.document.macroenabled.12',
+'docx':'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+'dot':'application/msword',
+'dotm':'application/vnd.ms-word.template.macroenabled.12',
+'dotx':'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
+'dp':'application/vnd.osgi.dp',
+'dpg':'application/vnd.dpgraph',
+'dra':'audio/vnd.dra',
+'dsc':'text/prs.lines.tag',
+'dssc':'application/dssc+der',
+'dtb':'application/x-dtbook+xml',
+'dtd':'application/xml-dtd',
+'dts':'audio/vnd.dts',
+'dtshd':'audio/vnd.dts.hd',
+'dump':'application/octet-stream',
+'dvb':'video/vnd.dvb.file',
+'dvi':'application/x-dvi',
+'dwf':'model/vnd.dwf',
+'dwg':'image/vnd.dwg',
+'dxf':'image/vnd.dxf',
+'dxp':'application/vnd.spotfire.dxp',
+'dxr':'application/x-director',
+'ecelp4800':'audio/vnd.nuera.ecelp4800',
+'ecelp7470':'audio/vnd.nuera.ecelp7470',
+'ecelp9600':'audio/vnd.nuera.ecelp9600',
+'ecma':'application/ecmascript',
+'edm':'application/vnd.novadigm.edm',
+'edx':'application/vnd.novadigm.edx',
+'efif':'application/vnd.picsel',
+'ei6':'application/vnd.pg.osasli',
+'elc':'application/octet-stream',
+'emf':'application/x-msmetafile',
+'eml':'message/rfc822',
+'emma':'application/emma+xml',
+'emz':'application/x-msmetafile',
+'eol':'audio/vnd.digital-winds',
+'eot':'application/vnd.ms-fontobject',
+'eps':'application/postscript',
+'epub':'application/epub+zip',
+'es3':'application/vnd.eszigno3+xml',
+'esa':'application/vnd.osgi.subsystem',
+'esf':'application/vnd.epson.esf',
+'et3':'application/vnd.eszigno3+xml',
+'etx':'text/x-setext',
+'eva':'application/x-eva',
+'evy':'application/x-envoy',
+'exe':'application/x-msdownload',
+'exi':'application/exi',
+'ext':'application/vnd.novadigm.ext',
+'ez':'application/andrew-inset',
+'ez2':'application/vnd.ezpix-album',
+'ez3':'application/vnd.ezpix-package',
+'f':'text/x-fortran',
+'f4v':'video/x-f4v',
+'f77':'text/x-fortran',
+'f90':'text/x-fortran',
+'fbs':'image/vnd.fastbidsheet',
+'fcdt':'application/vnd.adobe.formscentral.fcdt',
+'fcs':'application/vnd.isac.fcs',
+'fdf':'application/vnd.fdf',
+'fe_launch':'application/vnd.denovo.fcselayout-link',
+'fg5':'application/vnd.fujitsu.oasysgp',
+'fgd':'application/x-director',
+'fh':'image/x-freehand',
+'fh4':'image/x-freehand',
+'fh5':'image/x-freehand',
+'fh7':'image/x-freehand',
+'fhc':'image/x-freehand',
+'fig':'application/x-xfig',
+'flac':'audio/x-flac',
+'fli':'video/x-fli',
+'flo':'application/vnd.micrografx.flo',
+'flv':'video/x-flv',
+'flw':'application/vnd.kde.kivio',
+'flx':'text/vnd.fmi.flexstor',
+'fly':'text/vnd.fly',
+'fm':'application/vnd.framemaker',
+'fnc':'application/vnd.frogans.fnc',
+'for':'text/x-fortran',
+'fpx':'image/vnd.fpx',
+'frame':'application/vnd.framemaker',
+'fsc':'application/vnd.fsc.weblaunch',
+'fst':'image/vnd.fst',
+'ftc':'application/vnd.fluxtime.clip',
+'fti':'application/vnd.anser-web-funds-transfer-initiation',
+'fvt':'video/vnd.fvt',
+'fxp':'application/vnd.adobe.fxp',
+'fxpl':'application/vnd.adobe.fxp',
+'fzs':'application/vnd.fuzzysheet',
+'g2w':'application/vnd.geoplan',
+'g3':'image/g3fax',
+'g3w':'application/vnd.geospace',
+'gac':'application/vnd.groove-account',
+'gam':'application/x-tads',
+'gbr':'application/rpki-ghostbusters',
+'gca':'application/x-gca-compressed',
+'gdl':'model/vnd.gdl',
+'geo':'application/vnd.dynageo',
+'gex':'application/vnd.geometry-explorer',
+'ggb':'application/vnd.geogebra.file',
+'ggt':'application/vnd.geogebra.tool',
+'ghf':'application/vnd.groove-help',
+'gif':'image/gif',
+'gim':'application/vnd.groove-identity-message',
+'gml':'application/gml+xml',
+'gmx':'application/vnd.gmx',
+'gnumeric':'application/x-gnumeric',
+'gph':'application/vnd.flographit',
+'gpx':'application/gpx+xml',
+'gqf':'application/vnd.grafeq',
+'gqs':'application/vnd.grafeq',
+'gram':'application/srgs',
+'gramps':'application/x-gramps-xml',
+'gre':'application/vnd.geometry-explorer',
+'grv':'application/vnd.groove-injector',
+'grxml':'application/srgs+xml',
+'gsf':'application/x-font-ghostscript',
+'gtar':'application/x-gtar',
+'gtm':'application/vnd.groove-tool-message',
+'gtw':'model/vnd.gtw',
+'gv':'text/vnd.graphviz',
+'gxf':'application/gxf',
+'gxt':'application/vnd.geonext',
+'h':'text/x-c',
+'h261':'video/h261',
+'h263':'video/h263',
+'h264':'video/h264',
+'hal':'application/vnd.hal+xml',
+'hbci':'application/vnd.hbci',
+'hdf':'application/x-hdf',
+'hh':'text/x-c',
+'hlp':'application/winhlp',
+'hpgl':'application/vnd.hp-hpgl',
+'hpid':'application/vnd.hp-hpid',
+'hps':'application/vnd.hp-hps',
+'hqx':'application/mac-binhex40',
+'htke':'application/vnd.kenameaapp',
+'htm':'text/html',
+'html':'text/html',
+'hvd':'application/vnd.yamaha.hv-dic',
+'hvp':'application/vnd.yamaha.hv-voice',
+'hvs':'application/vnd.yamaha.hv-script',
+'i2g':'application/vnd.intergeo',
+'icc':'application/vnd.iccprofile',
+'ice':'x-conference/x-cooltalk',
+'icm':'application/vnd.iccprofile',
+'ico':'image/x-icon',
+'ics':'text/calendar',
+'ief':'image/ief',
+'ifb':'text/calendar',
+'ifm':'application/vnd.shana.informed.formdata',
+'iges':'model/iges',
+'igl':'application/vnd.igloader',
+'igm':'application/vnd.insors.igm',
+'igs':'model/iges',
+'igx':'application/vnd.micrografx.igx',
+'iif':'application/vnd.shana.informed.interchange',
+'imp':'application/vnd.accpac.simply.imp',
+'ims':'application/vnd.ms-ims',
+'in':'text/plain',
+'ink':'application/inkml+xml',
+'inkml':'application/inkml+xml',
+'install':'application/x-install-instructions',
+'iota':'application/vnd.astraea-software.iota',
+'ipfix':'application/ipfix',
+'ipk':'application/vnd.shana.informed.package',
+'irm':'application/vnd.ibm.rights-management',
+'irp':'application/vnd.irepository.package+xml',
+'iso':'application/x-iso9660-image',
+'itp':'application/vnd.shana.informed.formtemplate',
+'ivp':'application/vnd.immervision-ivp',
+'ivu':'application/vnd.immervision-ivu',
+'jad':'text/vnd.sun.j2me.app-descriptor',
+'jam':'application/vnd.jam',
+'jar':'application/java-archive',
+'java':'text/x-java-source',
+'jisp':'application/vnd.jisp',
+'jlt':'application/vnd.hp-jlyt',
+'jnlp':'application/x-java-jnlp-file',
+'joda':'application/vnd.joost.joda-archive',
+'jpe':'image/jpeg',
+'jpeg':'image/jpeg',
+'jpg':'image/jpeg',
+'jpgm':'video/jpm',
+'jpgv':'video/jpeg',
+'jpm':'video/jpm',
+'js':'application/javascript',
+'json':'application/json',
+'jsonml':'application/jsonml+json',
+'kar':'audio/midi',
+'karbon':'application/vnd.kde.karbon',
+'kfo':'application/vnd.kde.kformula',
+'kia':'application/vnd.kidspiration',
+'kml':'application/vnd.google-earth.kml+xml',
+'kmz':'application/vnd.google-earth.kmz',
+'kne':'application/vnd.kinar',
+'knp':'application/vnd.kinar',
+'kon':'application/vnd.kde.kontour',
+'kpr':'application/vnd.kde.kpresenter',
+'kpt':'application/vnd.kde.kpresenter',
+'kpxx':'application/vnd.ds-keypoint',
+'ksp':'application/vnd.kde.kspread',
+'ktr':'application/vnd.kahootz',
+'ktx':'image/ktx',
+'ktz':'application/vnd.kahootz',
+'kwd':'application/vnd.kde.kword',
+'kwt':'application/vnd.kde.kword',
+'lasxml':'application/vnd.las.las+xml',
+'latex':'application/x-latex',
+'lbd':'application/vnd.llamagraphics.life-balance.desktop',
+'lbe':'application/vnd.llamagraphics.life-balance.exchange+xml',
+'les':'application/vnd.hhe.lesson-player',
+'lha':'application/x-lzh-compressed',
+'link66':'application/vnd.route66.link66+xml',
+'list':'text/plain',
+'list3820':'application/vnd.ibm.modcap',
+'listafp':'application/vnd.ibm.modcap',
+'lnk':'application/x-ms-shortcut',
+'log':'text/plain',
+'lostxml':'application/lost+xml',
+'lrf':'application/octet-stream',
+'lrm':'application/vnd.ms-lrm',
+'ltf':'application/vnd.frogans.ltf',
+'lvp':'audio/vnd.lucent.voice',
+'lwp':'application/vnd.lotus-wordpro',
+'lzh':'application/x-lzh-compressed',
+'m13':'application/x-msmediaview',
+'m14':'application/x-msmediaview',
+'m1v':'video/mpeg',
+'m21':'application/mp21',
+'m2a':'audio/mpeg',
+'m2v':'video/mpeg',
+'m3a':'audio/mpeg',
+'m3u':'audio/x-mpegurl',
+'m3u8':'application/vnd.apple.mpegurl',
+'m4u':'video/vnd.mpegurl',
+'m4v':'video/x-m4v',
+'ma':'application/mathematica',
+'mads':'application/mads+xml',
+'mag':'application/vnd.ecowin.chart',
+'maker':'application/vnd.framemaker',
+'man':'text/troff',
+'mar':'application/octet-stream',
+'mathml':'application/mathml+xml',
+'mb':'application/mathematica',
+'mbk':'application/vnd.mobius.mbk',
+'mbox':'application/mbox',
+'mc1':'application/vnd.medcalcdata',
+'mcd':'application/vnd.mcd',
+'mcurl':'text/vnd.curl.mcurl',
+'mdb':'application/x-msaccess',
+'mdi':'image/vnd.ms-modi',
+'me':'text/troff',
+'mesh':'model/mesh',
+'meta4':'application/metalink4+xml',
+'metalink':'application/metalink+xml',
+'mets':'application/mets+xml',
+'mfm':'application/vnd.mfmp',
+'mft':'application/rpki-manifest',
+'mgp':'application/vnd.osgeo.mapguide.package',
+'mgz':'application/vnd.proteus.magazine',
+'mid':'audio/midi',
+'midi':'audio/midi',
+'mie':'application/x-mie',
+'mif':'application/vnd.mif',
+'mime':'message/rfc822',
+'mj2':'video/mj2',
+'mjp2':'video/mj2',
+'mk3d':'video/x-matroska',
+'mka':'audio/x-matroska',
+'mks':'video/x-matroska',
+'mkv':'video/x-matroska',
+'mlp':'application/vnd.dolby.mlp',
+'mmd':'application/vnd.chipnuts.karaoke-mmd',
+'mmf':'application/vnd.smaf',
+'mmr':'image/vnd.fujixerox.edmics-mmr',
+'mng':'video/x-mng',
+'mny':'application/x-msmoney',
+'mobi':'application/x-mobipocket-ebook',
+'mods':'application/mods+xml',
+'mov':'video/quicktime',
+'movie':'video/x-sgi-movie',
+'mp2':'audio/mpeg',
+'mp21':'application/mp21',
+'mp2a':'audio/mpeg',
+'mp3':'audio/mpeg',
+'mp4':'video/mp4',
+'mp4a':'audio/mp4',
+'mp4s':'application/mp4',
+'mp4v':'video/mp4',
+'mpc':'application/vnd.mophun.certificate',
+'mpe':'video/mpeg',
+'mpeg':'video/mpeg',
+'mpg':'video/mpeg',
+'mpg4':'video/mp4',
+'mpga':'audio/mpeg',
+'mpkg':'application/vnd.apple.installer+xml',
+'mpm':'application/vnd.blueice.multipass',
+'mpn':'application/vnd.mophun.application',
+'mpp':'application/vnd.ms-project',
+'mpt':'application/vnd.ms-project',
+'mpy':'application/vnd.ibm.minipay',
+'mqy':'application/vnd.mobius.mqy',
+'mrc':'application/marc',
+'mrcx':'application/marcxml+xml',
+'ms':'text/troff',
+'mscml':'application/mediaservercontrol+xml',
+'mseed':'application/vnd.fdsn.mseed',
+'mseq':'application/vnd.mseq',
+'msf':'application/vnd.epson.msf',
+'msh':'model/mesh',
+'msi':'application/x-msdownload',
+'msl':'application/vnd.mobius.msl',
+'msty':'application/vnd.muvee.style',
+'mts':'model/vnd.mts',
+'mus':'application/vnd.musician',
+'musicxml':'application/vnd.recordare.musicxml+xml',
+'mvb':'application/x-msmediaview',
+'mwf':'application/vnd.mfer',
+'mxf':'application/mxf',
+'mxl':'application/vnd.recordare.musicxml',
+'mxml':'application/xv+xml',
+'mxs':'application/vnd.triscape.mxs',
+'mxu':'video/vnd.mpegurl',
+'n-gage':'application/vnd.nokia.n-gage.symbian.install',
+'n3':'text/n3',
+'nb':'application/mathematica',
+'nbp':'application/vnd.wolfram.player',
+'nc':'application/x-netcdf',
+'ncx':'application/x-dtbncx+xml',
+'nfo':'text/x-nfo',
+'ngdat':'application/vnd.nokia.n-gage.data',
+'nitf':'application/vnd.nitf',
+'nlu':'application/vnd.neurolanguage.nlu',
+'nml':'application/vnd.enliven',
+'nnd':'application/vnd.noblenet-directory',
+'nns':'application/vnd.noblenet-sealer',
+'nnw':'application/vnd.noblenet-web',
+'npx':'image/vnd.net-fpx',
+'nsc':'application/x-conference',
+'nsf':'application/vnd.lotus-notes',
+'ntf':'application/vnd.nitf',
+'nzb':'application/x-nzb',
+'oa2':'application/vnd.fujitsu.oasys2',
+'oa3':'application/vnd.fujitsu.oasys3',
+'oas':'application/vnd.fujitsu.oasys',
+'obd':'application/x-msbinder',
+'obj':'application/x-tgif',
+'oda':'application/oda',
+'odb':'application/vnd.oasis.opendocument.database',
+'odc':'application/vnd.oasis.opendocument.chart',
+'odf':'application/vnd.oasis.opendocument.formula',
+'odft':'application/vnd.oasis.opendocument.formula-template',
+'odg':'application/vnd.oasis.opendocument.graphics',
+'odi':'application/vnd.oasis.opendocument.image',
+'odm':'application/vnd.oasis.opendocument.text-master',
+'odp':'application/vnd.oasis.opendocument.presentation',
+'ods':'application/vnd.oasis.opendocument.spreadsheet',
+'odt':'application/vnd.oasis.opendocument.text',
+'oga':'audio/ogg',
+'ogg':'audio/ogg',
+'ogv':'video/ogg',
+'ogx':'application/ogg',
+'omdoc':'application/omdoc+xml',
+'onepkg':'application/onenote',
+'onetmp':'application/onenote',
+'onetoc':'application/onenote',
+'onetoc2':'application/onenote',
+'opf':'application/oebps-package+xml',
+'opml':'text/x-opml',
+'oprc':'application/vnd.palm',
+'org':'application/vnd.lotus-organizer',
+'osf':'application/vnd.yamaha.openscoreformat',
+'osfpvg':'application/vnd.yamaha.openscoreformat.osfpvg+xml',
+'otc':'application/vnd.oasis.opendocument.chart-template',
+'otf':'application/x-font-otf',
+'otg':'application/vnd.oasis.opendocument.graphics-template',
+'oth':'application/vnd.oasis.opendocument.text-web',
+'oti':'application/vnd.oasis.opendocument.image-template',
+'otp':'application/vnd.oasis.opendocument.presentation-template',
+'ots':'application/vnd.oasis.opendocument.spreadsheet-template',
+'ott':'application/vnd.oasis.opendocument.text-template',
+'oxps':'application/oxps',
+'oxt':'application/vnd.openofficeorg.extension',
+'p':'text/x-pascal',
+'p10':'application/pkcs10',
+'p12':'application/x-pkcs12',
+'p7b':'application/x-pkcs7-certificates',
+'p7c':'application/pkcs7-mime',
+'p7m':'application/pkcs7-mime',
+'p7r':'application/x-pkcs7-certreqresp',
+'p7s':'application/pkcs7-signature',
+'p8':'application/pkcs8',
+'pas':'text/x-pascal',
+'paw':'application/vnd.pawaafile',
+'pbd':'application/vnd.powerbuilder6',
+'pbm':'image/x-portable-bitmap',
+'pcap':'application/vnd.tcpdump.pcap',
+'pcf':'application/x-font-pcf',
+'pcl':'application/vnd.hp-pcl',
+'pclxl':'application/vnd.hp-pclxl',
+'pct':'image/x-pict',
+'pcurl':'application/vnd.curl.pcurl',
+'pcx':'image/x-pcx',
+'pdb':'application/vnd.palm',
+'pdf':'application/pdf',
+'pfa':'application/x-font-type1',
+'pfb':'application/x-font-type1',
+'pfm':'application/x-font-type1',
+'pfr':'application/font-tdpfr',
+'pfx':'application/x-pkcs12',
+'pgm':'image/x-portable-graymap',
+'pgn':'application/x-chess-pgn',
+'pgp':'application/pgp-encrypted',
+'pic':'image/x-pict',
+'pkg':'application/octet-stream',
+'pki':'application/pkixcmp',
+'pkipath':'application/pkix-pkipath',
+'plb':'application/vnd.3gpp.pic-bw-large',
+'plc':'application/vnd.mobius.plc',
+'plf':'application/vnd.pocketlearn',
+'pls':'application/pls+xml',
+'pml':'application/vnd.ctc-posml',
+'png':'image/png',
+'pnm':'image/x-portable-anymap',
+'portpkg':'application/vnd.macports.portpkg',
+'pot':'application/vnd.ms-powerpoint',
+'potm':'application/vnd.ms-powerpoint.template.macroenabled.12',
+'potx':'application/vnd.openxmlformats-officedocument.presentationml.template',
+'ppam':'application/vnd.ms-powerpoint.addin.macroenabled.12',
+'ppd':'application/vnd.cups-ppd',
+'ppm':'image/x-portable-pixmap',
+'pps':'application/vnd.ms-powerpoint',
+'ppsm':'application/vnd.ms-powerpoint.slideshow.macroenabled.12',
+'ppsx':'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
+'ppt':'application/vnd.ms-powerpoint',
+'pptm':'application/vnd.ms-powerpoint.presentation.macroenabled.12',
+'pptx':'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+'pqa':'application/vnd.palm',
+'prc':'application/x-mobipocket-ebook',
+'pre':'application/vnd.lotus-freelance',
+'prf':'application/pics-rules',
+'ps':'application/postscript',
+'psb':'application/vnd.3gpp.pic-bw-small',
+'psd':'image/vnd.adobe.photoshop',
+'psf':'application/x-font-linux-psf',
+'pskcxml':'application/pskc+xml',
+'ptid':'application/vnd.pvi.ptid1',
+'pub':'application/x-mspublisher',
+'pvb':'application/vnd.3gpp.pic-bw-var',
+'pwn':'application/vnd.3m.post-it-notes',
+'pya':'audio/vnd.ms-playready.media.pya',
+'pyv':'video/vnd.ms-playready.media.pyv',
+'qam':'application/vnd.epson.quickanime',
+'qbo':'application/vnd.intu.qbo',
+'qfx':'application/vnd.intu.qfx',
+'qps':'application/vnd.publishare-delta-tree',
+'qt':'video/quicktime',
+'qwd':'application/vnd.quark.quarkxpress',
+'qwt':'application/vnd.quark.quarkxpress',
+'qxb':'application/vnd.quark.quarkxpress',
+'qxd':'application/vnd.quark.quarkxpress',
+'qxl':'application/vnd.quark.quarkxpress',
+'qxt':'application/vnd.quark.quarkxpress',
+'ra':'audio/x-pn-realaudio',
+'ram':'audio/x-pn-realaudio',
+'rar':'application/x-rar-compressed',
+'ras':'image/x-cmu-raster',
+'rcprofile':'application/vnd.ipunplugged.rcprofile',
+'rdf':'application/rdf+xml',
+'rdz':'application/vnd.data-vision.rdz',
+'rep':'application/vnd.businessobjects',
+'res':'application/x-dtbresource+xml',
+'rgb':'image/x-rgb',
+'rif':'application/reginfo+xml',
+'rip':'audio/vnd.rip',
+'ris':'application/x-research-info-systems',
+'rl':'application/resource-lists+xml',
+'rlc':'image/vnd.fujixerox.edmics-rlc',
+'rld':'application/resource-lists-diff+xml',
+'rm':'application/vnd.rn-realmedia',
+'rmi':'audio/midi',
+'rmp':'audio/x-pn-realaudio-plugin',
+'rms':'application/vnd.jcp.javame.midlet-rms',
+'rmvb':'application/vnd.rn-realmedia-vbr',
+'rnc':'application/relax-ng-compact-syntax',
+'roa':'application/rpki-roa',
+'roff':'text/troff',
+'rp9':'application/vnd.cloanto.rp9',
+'rpss':'application/vnd.nokia.radio-presets',
+'rpst':'application/vnd.nokia.radio-preset',
+'rq':'application/sparql-query',
+'rs':'application/rls-services+xml',
+'rsd':'application/rsd+xml',
+'rss':'application/rss+xml',
+'rtf':'application/rtf',
+'rtx':'text/richtext',
+'s':'text/x-asm',
+'s3m':'audio/s3m',
+'saf':'application/vnd.yamaha.smaf-audio',
+'sbml':'application/sbml+xml',
+'sc':'application/vnd.ibm.secure-container',
+'scd':'application/x-msschedule',
+'scm':'application/vnd.lotus-screencam',
+'scq':'application/scvp-cv-request',
+'scs':'application/scvp-cv-response',
+'scurl':'text/vnd.curl.scurl',
+'sda':'application/vnd.stardivision.draw',
+'sdc':'application/vnd.stardivision.calc',
+'sdd':'application/vnd.stardivision.impress',
+'sdkd':'application/vnd.solent.sdkm+xml',
+'sdkm':'application/vnd.solent.sdkm+xml',
+'sdp':'application/sdp',
+'sdw':'application/vnd.stardivision.writer',
+'see':'application/vnd.seemail',
+'seed':'application/vnd.fdsn.seed',
+'sema':'application/vnd.sema',
+'semd':'application/vnd.semd',
+'semf':'application/vnd.semf',
+'ser':'application/java-serialized-object',
+'setpay':'application/set-payment-initiation',
+'setreg':'application/set-registration-initiation',
+'sfd-hdstx':'application/vnd.hydrostatix.sof-data',
+'sfs':'application/vnd.spotfire.sfs',
+'sfv':'text/x-sfv',
+'sgi':'image/sgi',
+'sgl':'application/vnd.stardivision.writer-global',
+'sgm':'text/sgml',
+'sgml':'text/sgml',
+'sh':'application/x-sh',
+'shar':'application/x-shar',
+'shf':'application/shf+xml',
+'sid':'image/x-mrsid-image',
+'sig':'application/pgp-signature',
+'sil':'audio/silk',
+'silo':'model/mesh',
+'sis':'application/vnd.symbian.install',
+'sisx':'application/vnd.symbian.install',
+'sit':'application/x-stuffit',
+'sitx':'application/x-stuffitx',
+'skd':'application/vnd.koan',
+'skm':'application/vnd.koan',
+'skp':'application/vnd.koan',
+'skt':'application/vnd.koan',
+'sldm':'application/vnd.ms-powerpoint.slide.macroenabled.12',
+'sldx':'application/vnd.openxmlformats-officedocument.presentationml.slide',
+'slt':'application/vnd.epson.salt',
+'sm':'application/vnd.stepmania.stepchart',
+'smf':'application/vnd.stardivision.math',
+'smi':'application/smil+xml',
+'smil':'application/smil+xml',
+'smv':'video/x-smv',
+'smzip':'application/vnd.stepmania.package',
+'snd':'audio/basic',
+'snf':'application/x-font-snf',
+'so':'application/octet-stream',
+'spc':'application/x-pkcs7-certificates',
+'spf':'application/vnd.yamaha.smaf-phrase',
+'spl':'application/x-futuresplash',
+'spot':'text/vnd.in3d.spot',
+'spp':'application/scvp-vp-response',
+'spq':'application/scvp-vp-request',
+'spx':'audio/ogg',
+'sql':'application/x-sql',
+'src':'application/x-wais-source',
+'srt':'application/x-subrip',
+'sru':'application/sru+xml',
+'srx':'application/sparql-results+xml',
+'ssdl':'application/ssdl+xml',
+'sse':'application/vnd.kodak-descriptor',
+'ssf':'application/vnd.epson.ssf',
+'ssml':'application/ssml+xml',
+'st':'application/vnd.sailingtracker.track',
+'stc':'application/vnd.sun.xml.calc.template',
+'std':'application/vnd.sun.xml.draw.template',
+'stf':'application/vnd.wt.stf',
+'sti':'application/vnd.sun.xml.impress.template',
+'stk':'application/hyperstudio',
+'stl':'application/vnd.ms-pki.stl',
+'str':'application/vnd.pg.format',
+'stw':'application/vnd.sun.xml.writer.template',
+'sub':'text/vnd.dvb.subtitle',
+'sus':'application/vnd.sus-calendar',
+'susp':'application/vnd.sus-calendar',
+'sv4cpio':'application/x-sv4cpio',
+'sv4crc':'application/x-sv4crc',
+'svc':'application/vnd.dvb.service',
+'svd':'application/vnd.svd',
+'svg':'image/svg+xml',
+'svgz':'image/svg+xml',
+'swa':'application/x-director',
+'swf':'application/x-shockwave-flash',
+'swi':'application/vnd.aristanetworks.swi',
+'sxc':'application/vnd.sun.xml.calc',
+'sxd':'application/vnd.sun.xml.draw',
+'sxg':'application/vnd.sun.xml.writer.global',
+'sxi':'application/vnd.sun.xml.impress',
+'sxm':'application/vnd.sun.xml.math',
+'sxw':'application/vnd.sun.xml.writer',
+'t':'text/troff',
+'t3':'application/x-t3vm-image',
+'taglet':'application/vnd.mynfc',
+'tao':'application/vnd.tao.intent-module-archive',
+'tar':'application/x-tar',
+'tcap':'application/vnd.3gpp2.tcap',
+'tcl':'application/x-tcl',
+'teacher':'application/vnd.smart.teacher',
+'tei':'application/tei+xml',
+'teicorpus':'application/tei+xml',
+'tex':'application/x-tex',
+'texi':'application/x-texinfo',
+'texinfo':'application/x-texinfo',
+'text':'text/plain',
+'tfi':'application/thraud+xml',
+'tfm':'application/x-tex-tfm',
+'tga':'image/x-tga',
+'thmx':'application/vnd.ms-officetheme',
+'tif':'image/tiff',
+'tiff':'image/tiff',
+'tmo':'application/vnd.tmobile-livetv',
+'torrent':'application/x-bittorrent',
+'tpl':'application/vnd.groove-tool-template',
+'tpt':'application/vnd.trid.tpt',
+'tr':'text/troff',
+'tra':'application/vnd.trueapp',
+'trm':'application/x-msterminal',
+'tsd':'application/timestamped-data',
+'tsv':'text/tab-separated-values',
+'ttc':'application/x-font-ttf',
+'ttf':'application/x-font-ttf',
+'ttl':'text/turtle',
+'twd':'application/vnd.simtech-mindmapper',
+'twds':'application/vnd.simtech-mindmapper',
+'txd':'application/vnd.genomatix.tuxedo',
+'txf':'application/vnd.mobius.txf',
+'txt':'text/plain',
+'u32':'application/x-authorware-bin',
+'udeb':'application/x-debian-package',
+'ufd':'application/vnd.ufdl',
+'ufdl':'application/vnd.ufdl',
+'ulx':'application/x-glulx',
+'umj':'application/vnd.umajin',
+'unityweb':'application/vnd.unity',
+'uoml':'application/vnd.uoml+xml',
+'uri':'text/uri-list',
+'uris':'text/uri-list',
+'urls':'text/uri-list',
+'ustar':'application/x-ustar',
+'utz':'application/vnd.uiq.theme',
+'uu':'text/x-uuencode',
+'uva':'audio/vnd.dece.audio',
+'uvd':'application/vnd.dece.data',
+'uvf':'application/vnd.dece.data',
+'uvg':'image/vnd.dece.graphic',
+'uvh':'video/vnd.dece.hd',
+'uvi':'image/vnd.dece.graphic',
+'uvm':'video/vnd.dece.mobile',
+'uvp':'video/vnd.dece.pd',
+'uvs':'video/vnd.dece.sd',
+'uvt':'application/vnd.dece.ttml+xml',
+'uvu':'video/vnd.uvvu.mp4',
+'uvv':'video/vnd.dece.video',
+'uvva':'audio/vnd.dece.audio',
+'uvvd':'application/vnd.dece.data',
+'uvvf':'application/vnd.dece.data',
+'uvvg':'image/vnd.dece.graphic',
+'uvvh':'video/vnd.dece.hd',
+'uvvi':'image/vnd.dece.graphic',
+'uvvm':'video/vnd.dece.mobile',
+'uvvp':'video/vnd.dece.pd',
+'uvvs':'video/vnd.dece.sd',
+'uvvt':'application/vnd.dece.ttml+xml',
+'uvvu':'video/vnd.uvvu.mp4',
+'uvvv':'video/vnd.dece.video',
+'uvvx':'application/vnd.dece.unspecified',
+'uvvz':'application/vnd.dece.zip',
+'uvx':'application/vnd.dece.unspecified',
+'uvz':'application/vnd.dece.zip',
+'vcard':'text/vcard',
+'vcd':'application/x-cdlink',
+'vcf':'text/x-vcard',
+'vcg':'application/vnd.groove-vcard',
+'vcs':'text/x-vcalendar',
+'vcx':'application/vnd.vcx',
+'vis':'application/vnd.visionary',
+'viv':'video/vnd.vivo',
+'vob':'video/x-ms-vob',
+'vor':'application/vnd.stardivision.writer',
+'vox':'application/x-authorware-bin',
+'vrml':'model/vrml',
+'vsd':'application/vnd.visio',
+'vsf':'application/vnd.vsf',
+'vss':'application/vnd.visio',
+'vst':'application/vnd.visio',
+'vsw':'application/vnd.visio',
+'vtu':'model/vnd.vtu',
+'vxml':'application/voicexml+xml',
+'w3d':'application/x-director',
+'wad':'application/x-doom',
+'wav':'audio/x-wav',
+'wax':'audio/x-ms-wax',
+'wbmp':'image/vnd.wap.wbmp',
+'wbs':'application/vnd.criticaltools.wbs+xml',
+'wbxml':'application/vnd.wap.wbxml',
+'wcm':'application/vnd.ms-works',
+'wdb':'application/vnd.ms-works',
+'wdp':'image/vnd.ms-photo',
+'weba':'audio/webm',
+'webm':'video/webm',
+'webp':'image/webp',
+'wg':'application/vnd.pmi.widget',
+'wgt':'application/widget',
+'wks':'application/vnd.ms-works',
+'wm':'video/x-ms-wm',
+'wma':'audio/x-ms-wma',
+'wmd':'application/x-ms-wmd',
+'wmf':'application/x-msmetafile',
+'wml':'text/vnd.wap.wml',
+'wmlc':'application/vnd.wap.wmlc',
+'wmls':'text/vnd.wap.wmlscript',
+'wmlsc':'application/vnd.wap.wmlscriptc',
+'wmv':'video/x-ms-wmv',
+'wmx':'video/x-ms-wmx',
+'wmz':'application/x-ms-wmz',
+'woff':'application/x-font-woff',
+'wpd':'application/vnd.wordperfect',
+'wpl':'application/vnd.ms-wpl',
+'wps':'application/vnd.ms-works',
+'wqd':'application/vnd.wqd',
+'wri':'application/x-mswrite',
+'wrl':'model/vrml',
+'wsdl':'application/wsdl+xml',
+'wspolicy':'application/wspolicy+xml',
+'wtb':'application/vnd.webturbo',
+'wvx':'video/x-ms-wvx',
+'x32':'application/x-authorware-bin',
+'x3d':'model/x3d+xml',
+'x3db':'model/x3d+binary',
+'x3dbz':'model/x3d+binary',
+'x3dv':'model/x3d+vrml',
+'x3dvz':'model/x3d+vrml',
+'x3dz':'model/x3d+xml',
+'xaml':'application/xaml+xml',
+'xap':'application/x-silverlight-app',
+'xar':'application/vnd.xara',
+'xbap':'application/x-ms-xbap',
+'xbd':'application/vnd.fujixerox.docuworks.binder',
+'xbm':'image/x-xbitmap',
+'xdf':'application/xcap-diff+xml',
+'xdm':'application/vnd.syncml.dm+xml',
+'xdp':'application/vnd.adobe.xdp+xml',
+'xdssc':'application/dssc+xml',
+'xdw':'application/vnd.fujixerox.docuworks',
+'xenc':'application/xenc+xml',
+'xer':'application/patch-ops-error+xml',
+'xfdf':'application/vnd.adobe.xfdf',
+'xfdl':'application/vnd.xfdl',
+'xht':'application/xhtml+xml',
+'xhtml':'application/xhtml+xml',
+'xhvml':'application/xv+xml',
+'xif':'image/vnd.xiff',
+'xla':'application/vnd.ms-excel',
+'xlam':'application/vnd.ms-excel.addin.macroenabled.12',
+'xlc':'application/vnd.ms-excel',
+'xlf':'application/x-xliff+xml',
+'xlm':'application/vnd.ms-excel',
+'xls':'application/vnd.ms-excel',
+'xlsb':'application/vnd.ms-excel.sheet.binary.macroenabled.12',
+'xlsm':'application/vnd.ms-excel.sheet.macroenabled.12',
+'xlsx':'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+'xlt':'application/vnd.ms-excel',
+'xltm':'application/vnd.ms-excel.template.macroenabled.12',
+'xltx':'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
+'xlw':'application/vnd.ms-excel',
+'xm':'audio/xm',
+'xml':'application/xml',
+'xo':'application/vnd.olpc-sugar',
+'xop':'application/xop+xml',
+'xpi':'application/x-xpinstall',
+'xpl':'application/xproc+xml',
+'xpm':'image/x-xpixmap',
+'xpr':'application/vnd.is-xpr',
+'xps':'application/vnd.ms-xpsdocument',
+'xpw':'application/vnd.intercon.formnet',
+'xpx':'application/vnd.intercon.formnet',
+'xsl':'application/xml',
+'xslt':'application/xslt+xml',
+'xsm':'application/vnd.syncml+xml',
+'xspf':'application/xspf+xml',
+'xul':'application/vnd.mozilla.xul+xml',
+'xvm':'application/xv+xml',
+'xvml':'application/xv+xml',
+'xwd':'image/x-xwindowdump',
+'xyz':'chemical/x-xyz',
+'xz':'application/x-xz',
+'yang':'application/yang',
+'yin':'application/yin+xml',
+'z1':'application/x-zmachine',
+'z2':'application/x-zmachine',
+'z3':'application/x-zmachine',
+'z4':'application/x-zmachine',
+'z5':'application/x-zmachine',
+'z6':'application/x-zmachine',
+'z7':'application/x-zmachine',
+'z8':'application/x-zmachine',
+'zaz':'application/vnd.zzazz.deck+xml',
+'zip':'application/zip',
+'zir':'application/vnd.zul',
+'zirz':'application/vnd.zul',
+'zmm':'application/vnd.handheld-entertainment+xml',
+};
diff --git a/mojo/public/dart/third_party/mime/lib/src/magic_number.dart b/mojo/public/dart/third_party/mime/lib/src/magic_number.dart
new file mode 100644
index 0000000..3efb2ee
--- /dev/null
+++ b/mojo/public/dart/third_party/mime/lib/src/magic_number.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library mime.magic_number;
+
+class MagicNumber {
+  final String mimeType;
+  final List<int> numbers;
+  final List<int> mask;
+
+  const MagicNumber(this.mimeType, this.numbers, {this.mask});
+
+  bool matches(List<int> header) {
+    if (header.length < numbers.length) return false;
+
+    for (int i = 0; i < numbers.length; i++) {
+      if (mask != null) {
+        if ((mask[i] & numbers[i]) != (mask[i] & header[i])) return false;
+      } else {
+        if (numbers[i] != header[i]) return false;
+      }
+    }
+
+    return true;
+  }
+
+}
+
+const int DEFAULT_MAGIC_NUMBERS_MAX_LENGTH = 12;
+
+const List<MagicNumber> DEFAULT_MAGIC_NUMBERS = const [
+  const MagicNumber('application/pdf', const [0x25, 0x50, 0x44, 0x46]),
+  const MagicNumber('application/postscript', const [0x25, 0x51]),
+  const MagicNumber('image/gif', const [0x47, 0x49, 0x46, 0x38, 0x37, 0x61]),
+  const MagicNumber('image/gif', const [0x47, 0x49, 0x46, 0x38, 0x39, 0x61]),
+  const MagicNumber('image/jpeg', const [0xFF, 0xD8]),
+  const MagicNumber('image/png',
+      const [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]),
+  const MagicNumber('image/tiff', const [0x49, 0x49, 0x2A, 0x00]),
+  const MagicNumber('image/tiff', const [0x4D, 0x4D, 0x00, 0x2A]),
+  const MagicNumber(
+      'video/mp4',
+      const [0x00, 0x00, 0x00, 0x00, 0x66, 0x74,
+             0x79, 0x70, 0x33, 0x67, 0x70, 0x35],
+      mask: const [0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF,
+                   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])
+];
diff --git a/mojo/public/dart/third_party/mime/lib/src/mime_multipart_transformer.dart b/mojo/public/dart/third_party/mime/lib/src/mime_multipart_transformer.dart
new file mode 100644
index 0000000..3afff2d
--- /dev/null
+++ b/mojo/public/dart/third_party/mime/lib/src/mime_multipart_transformer.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+library mime.multipart_transformer;
+
+import 'dart:async';
+import 'dart:typed_data';
+
+import 'bound_multipart_stream.dart';
+import 'mime_shared.dart';
+import 'char_code.dart';
+
+
+Uint8List _getBoundary(String boundary) {
+  var charCodes = boundary.codeUnits;
+
+  var boundaryList = new Uint8List(4 + charCodes.length);
+  // Set-up the matching boundary preceding it with CRLF and two
+  // dashes.
+  boundaryList[0] = CharCode.CR;
+  boundaryList[1] = CharCode.LF;
+  boundaryList[2] = CharCode.DASH;
+  boundaryList[3] = CharCode.DASH;
+  boundaryList.setRange(4, 4 + charCodes.length, charCodes);
+  return boundaryList;
+}
+
+/**
+ * Parser for MIME multipart types of data as described in RFC 2046
+ * section 5.1.1. The data is transformed into [MimeMultipart] objects, each
+ * of them streaming the multipart data.
+ */
+class MimeMultipartTransformer
+    implements StreamTransformer<List<int>, MimeMultipart> {
+
+  final List<int> _boundary;
+
+  /**
+   * Construct a new MIME multipart parser with the boundary
+   * [boundary]. The boundary should be as specified in the content
+   * type parameter, that is without the -- prefix.
+   */
+  MimeMultipartTransformer(String boundary)
+      : _boundary = _getBoundary(boundary);
+
+  Stream<MimeMultipart> bind(Stream<List<int>> stream) {
+    return new BoundMultipartStream(_boundary, stream).stream;
+  }
+}
diff --git a/mojo/public/dart/third_party/mime/lib/src/mime_shared.dart b/mojo/public/dart/third_party/mime/lib/src/mime_shared.dart
new file mode 100644
index 0000000..6d14e0a
--- /dev/null
+++ b/mojo/public/dart/third_party/mime/lib/src/mime_shared.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+library mime.shared;
+
+import 'dart:async';
+
+class MimeMultipartException implements Exception {
+  final String message;
+
+  const MimeMultipartException([String this.message = ""]);
+
+  String toString() => "MimeMultipartException: $message";
+}
+
+/**
+ * A Mime Multipart class representing each part parsed by
+ * [MimeMultipartTransformer]. The data is streamed in as it become available.
+ */
+abstract class MimeMultipart extends Stream<List<int>> {
+  Map<String, String> get headers;
+}
diff --git a/mojo/public/dart/third_party/mime/lib/src/mime_type.dart b/mojo/public/dart/third_party/mime/lib/src/mime_type.dart
new file mode 100644
index 0000000..744eead
--- /dev/null
+++ b/mojo/public/dart/third_party/mime/lib/src/mime_type.dart
@@ -0,0 +1,128 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library mime.mime_type;
+
+import 'default_extension_map.dart';
+import 'magic_number.dart';
+
+final MimeTypeResolver _globalResolver = new MimeTypeResolver();
+
+/**
+ * The maximum number of bytes needed, to match all default magic-numbers.
+ */
+int get defaultMagicNumbersMaxLength => _globalResolver.magicNumbersMaxLength;
+
+/**
+ * Extract the extension from [path] and use that for MIME-type lookup, using
+ * the default extension map.
+ *
+ * If no matching MIME-type was found, `null` is returned.
+ *
+ * If [headerBytes] is present, a match for known magic-numbers will be
+ * performed first. This allows the correct mime-type to be found, even though
+ * a file have been saved using the wrong file-name extension. If less than
+ * [defaultMagicNumbersMaxLength] bytes was provided, some magic-numbers won't
+ * be matched against.
+ */
+String lookupMimeType(String path, {List<int> headerBytes}) =>
+    _globalResolver.lookup(path, headerBytes: headerBytes);
+
+/**
+ * MIME-type resolver class, used to customize the lookup of mime-types.
+ */
+class MimeTypeResolver {
+  final Map<String, String> _extensionMap = {};
+  final List<MagicNumber> _magicNumbers = [];
+  final bool _useDefault;
+  int _magicNumbersMaxLength;
+
+  /**
+   * Create a new empty [MimeTypeResolver].
+   */
+  MimeTypeResolver.empty() : _useDefault = false, _magicNumbersMaxLength = 0;
+
+  /**
+   * Create a new [MimeTypeResolver] containing the default scope.
+   */
+  MimeTypeResolver() :
+      _useDefault = true,
+      _magicNumbersMaxLength = DEFAULT_MAGIC_NUMBERS_MAX_LENGTH;
+
+  /**
+   * Get the maximum number of bytes required to match all magic numbers, when
+   * performing [lookup] with headerBytes present.
+   */
+  int get magicNumbersMaxLength => _magicNumbersMaxLength;
+
+  /**
+   * Extract the extension from [path] and use that for MIME-type lookup.
+   *
+   * If no matching MIME-type was found, `null` is returned.
+   *
+   * If [headerBytes] is present, a match for known magic-numbers will be
+   * performed first. This allows the correct mime-type to be found, even though
+   * a file have been saved using the wrong file-name extension. If less than
+   * [magicNumbersMaxLength] bytes was provided, some magic-numbers won't
+   * be matched against.
+   */
+  String lookup(String path, {List<int> headerBytes}) {
+    String result;
+    if (headerBytes != null) {
+      result = _matchMagic(headerBytes, _magicNumbers);
+      if (result != null) return result;
+      if (_useDefault) {
+        result = _matchMagic(headerBytes, DEFAULT_MAGIC_NUMBERS);
+        if (result != null) return result;
+      }
+    }
+    var ext = _ext(path);
+    result = _extensionMap[ext];
+    if (result != null) return result;
+    if (_useDefault) {
+      result = defaultExtensionMap[ext];
+      if (result != null) return result;
+    }
+    return null;
+  }
+
+  /**
+   * Add a new MIME-type mapping to the [MimeTypeResolver]. If the [extension]
+   * is already present in the [MimeTypeResolver], it'll be overwritten.
+   */
+  void addExtension(String extension, String mimeType) {
+    _extensionMap[extension] = mimeType;
+  }
+
+  /**
+   * Add a new magic-number mapping to the [MimeTypeResolver].
+   *
+   * If [mask] is present,the [mask] is used to only perform matching on
+   * selective bits. The [mask] must have the same length as [bytes].
+   */
+  void addMagicNumber(List<int> bytes, String mimeType, {List<int> mask}) {
+    if (mask != null && bytes.length != mask.length) {
+      throw new ArgumentError('Bytes and mask are of different lengths');
+    }
+    if (bytes.length > _magicNumbersMaxLength) {
+      _magicNumbersMaxLength = bytes.length;
+    }
+    _magicNumbers.add(new MagicNumber(mimeType, bytes, mask: mask));
+  }
+
+  static String _matchMagic(List<int> headerBytes,
+                            List<MagicNumber> magicNumbers) {
+    for (var mn in magicNumbers) {
+      if (mn.matches(headerBytes)) return mn.mimeType;
+    }
+    return null;
+  }
+
+  static String _ext(String path) {
+    int index = path.lastIndexOf('.');
+    if (index < 0 || index + 1 >= path.length) return path;
+    return path.substring(index + 1).toLowerCase();
+  }
+}
+
diff --git a/mojo/public/dart/third_party/mime/pubspec.yaml b/mojo/public/dart/third_party/mime/pubspec.yaml
new file mode 100644
index 0000000..2de7eca
--- /dev/null
+++ b/mojo/public/dart/third_party/mime/pubspec.yaml
@@ -0,0 +1,9 @@
+name: mime
+version: 0.9.3
+author: Dart Team <misc@dartlang.org>
+description: Helper-package for working with MIME.
+homepage: http://www.dartlang.org
+environment:
+  sdk: '>=1.0.0 <2.0.0'
+dev_dependencies:
+  unittest: '>=0.9.0 <0.12.0'
diff --git a/mojo/public/dart/third_party/mime/test/mime_multipart_transformer_test.dart b/mojo/public/dart/third_party/mime/test/mime_multipart_transformer_test.dart
new file mode 100644
index 0000000..5038999
--- /dev/null
+++ b/mojo/public/dart/third_party/mime/test/mime_multipart_transformer_test.dart
@@ -0,0 +1,465 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:math';
+
+import "package:unittest/unittest.dart";
+import "package:mime/mime.dart";
+
+void _writeInChunks(List<int> data,
+                    int chunkSize,
+                    StreamController<List<int>> controller) {
+  if (chunkSize == -1) chunkSize = data.length;
+
+  int written = 0;
+  for (int pos = 0; pos < data.length; pos += chunkSize) {
+    int remaining = data.length - pos;
+    int writeLength = min(chunkSize, remaining);
+    controller.add(data.sublist(pos, pos + writeLength));
+    written += writeLength;
+  }
+  controller.close();
+}
+
+
+enum TestMode {
+  IMMEDIATE_LISTEN,
+  DELAY_LISTEN,
+  PAUSE_RESUME
+}
+
+void _runParseTest(String message,
+                   String boundary,
+                   TestMode mode,
+                   [List<Map> expectedHeaders,
+                    List expectedParts,
+                    bool expectError = false]) {
+  Future testWrite(List<int> data, [int chunkSize = -1]) {
+    StreamController controller = new StreamController(sync: true);
+
+    var stream = controller.stream.transform(
+        new MimeMultipartTransformer(boundary));
+    int i = 0;
+    var completer = new Completer();
+    var futures = [];
+    stream.listen((multipart) {
+      int part = i++;
+      if (expectedHeaders != null) {
+        expect(multipart.headers, equals(expectedHeaders[part]));
+      }
+      switch (mode) {
+        case TestMode.IMMEDIATE_LISTEN:
+          futures.add(multipart.fold([], (buffer, data) => buffer..addAll(data))
+              .then((data) {
+                if (expectedParts[part] != null) {
+                  expect(data, equals(expectedParts[part].codeUnits));
+                }
+              }));
+          break;
+
+        case TestMode.DELAY_LISTEN:
+          futures.add(new Future(() {
+            return multipart.fold([], (buffer, data) => buffer..addAll(data))
+                .then((data) {
+                  if (expectedParts[part] != null) {
+                    expect(data, equals(expectedParts[part].codeUnits));
+                  }
+                });
+          }));
+          break;
+
+        case TestMode.PAUSE_RESUME:
+          var completer = new Completer();
+          futures.add(completer.future);
+          var buffer = [];
+          var subscription;
+          subscription = multipart.listen(
+              (data) {
+                buffer.addAll(data);
+                subscription.pause();
+                new Future(() => subscription.resume());
+              },
+              onDone: () {
+                if (expectedParts[part] != null) {
+                  expect(buffer, equals(expectedParts[part].codeUnits));
+                }
+                completer.complete();
+              });
+          break;
+      }
+    }, onError: (error) {
+      if (!expectError) throw error;
+    }, onDone: () {
+      if (expectedParts != null) {
+        expect(i, equals(expectedParts.length));
+      }
+      Future.wait(futures).then(completer.complete);
+    });
+
+    _writeInChunks(data, chunkSize, controller);
+
+    return completer.future;
+  }
+
+  Future testFirstPartOnly(List<int> data, [int chunkSize = -1]) {
+    var completer = new Completer();
+    var controller = new StreamController(sync: true);
+
+    var stream = controller.stream.transform(
+        new MimeMultipartTransformer(boundary));
+
+    var subscription;
+    subscription = stream.first.then((multipart) {
+      if (expectedHeaders != null) {
+        expect(multipart.headers, equals(expectedHeaders[0]));
+      }
+      return (multipart.fold([], (b, d) => b..addAll(d)).then((data) {
+        if (expectedParts != null && expectedParts[0] != null) {
+          expect(data, equals(expectedParts[0].codeUnits));
+        }
+      }));
+    }).then((_) {
+      completer.complete();
+    });
+
+    _writeInChunks(data, chunkSize, controller);
+
+    return completer.future;
+  }
+
+  Future testCompletePartAfterCancel(List<int> data,
+                                     int parts,
+                                     [int chunkSize = -1]) {
+    var completer = new Completer();
+    var controller = new StreamController(sync: true);
+    var stream = controller.stream.transform(
+        new MimeMultipartTransformer(boundary));
+    var subscription;
+    int i = 0;
+    var futures = [];
+    subscription = stream.listen((multipart) {
+      int partIndex = i;
+
+      if (partIndex >= parts) {
+        throw 'Expected no more parts, but got one.';
+      }
+
+      if (expectedHeaders != null) {
+        expect(multipart.headers, equals(expectedHeaders[partIndex]));
+      }
+      futures.add((multipart.fold([], (b, d) => b..addAll(d)).then((data) {
+        if (expectedParts != null && expectedParts[partIndex] != null) {
+          expect(data, equals(expectedParts[partIndex].codeUnits));
+        }
+      })));
+
+      if (partIndex == (parts - 1)) {
+        subscription.cancel();
+        Future.wait(futures).then(completer.complete);
+      }
+      i++;
+    });
+
+    _writeInChunks(data, chunkSize, controller);
+
+    return completer.future;
+  }
+
+  // Test parsing the data three times delivering the data in
+  // different chunks.
+  List<int> data = message.codeUnits;
+  test('test', () {
+    expect(Future.wait([
+        testWrite(data),
+        testWrite(data, 10),
+        testWrite(data, 2),
+        testWrite(data, 1),
+    ]), completes);
+  });
+
+  if (expectedParts.length > 0) {
+    test('test-first-part-only', () {
+      expect(Future.wait([
+          testFirstPartOnly(data),
+          testFirstPartOnly(data, 10),
+          testFirstPartOnly(data, 2),
+          testFirstPartOnly(data, 1),
+      ]), completes);
+    });
+
+    test('test-n-parts-only', () {
+      int numPartsExpected = expectedParts.length - 1;
+      if (numPartsExpected == 0) numPartsExpected = 1;
+
+      expect(Future.wait([
+        testCompletePartAfterCancel(data, numPartsExpected),
+        testCompletePartAfterCancel(data, numPartsExpected, 10),
+        testCompletePartAfterCancel(data, numPartsExpected, 2),
+        testCompletePartAfterCancel(data, numPartsExpected, 1),
+      ]), completes);
+    });
+  }
+}
+
+void _testParse(String message,
+                String boundary,
+               [List<Map> expectedHeaders,
+                List expectedParts,
+                bool expectError = false]) {
+  _runParseTest(
+      message, boundary, TestMode.IMMEDIATE_LISTEN,
+      expectedHeaders, expectedParts, expectError);
+  _runParseTest(
+      message, boundary, TestMode.DELAY_LISTEN,
+      expectedHeaders, expectedParts, expectError);
+  _runParseTest(
+      message, boundary, TestMode.PAUSE_RESUME,
+      expectedHeaders, expectedParts, expectError);
+}
+
+void _testParseValid() {
+  // Empty message from Chrome form post.
+  var message = '------WebKitFormBoundaryU3FBruSkJKG0Yor1--\r\n';
+  _testParse(message, "----WebKitFormBoundaryU3FBruSkJKG0Yor1", [], []);
+
+  // Sample from Wikipedia.
+  message = """
+This is a message with multiple parts in MIME format.\r
+--frontier\r
+Content-Type: text/plain\r
+\r
+This is the body of the message.\r
+--frontier\r
+Content-Type: application/octet-stream\r
+Content-Transfer-Encoding: base64\r
+\r
+PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg
+Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg=\r
+--frontier--\r\n""";
+  var headers1 = <String, String>{"content-type": "text/plain"};
+  var headers2 = <String, String>{"content-type": "application/octet-stream",
+                              "content-transfer-encoding": "base64"};
+  var body1 = "This is the body of the message.";
+  var body2 = """
+PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg
+Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg=""";
+  _testParse(message, "frontier", [headers1, headers2], [body1, body2]);
+
+  // Sample from HTML 4.01 Specification.
+  message = """
+\r\n--AaB03x\r
+Content-Disposition: form-data; name=\"submit-name\"\r
+\r
+Larry\r
+--AaB03x\r
+Content-Disposition: form-data; name=\"files\"; filename=\"file1.txt\"\r
+Content-Type: text/plain\r
+\r
+... contents of file1.txt ...\r
+--AaB03x--\r\n""";
+  headers1 = <String, String>{
+      "content-disposition": "form-data; name=\"submit-name\""};
+  headers2 = <String, String>{
+      "content-type": "text/plain",
+      "content-disposition": "form-data; name=\"files\"; filename=\"file1.txt\""
+  };
+  body1 = "Larry";
+  body2 = "... contents of file1.txt ...";
+  _testParse(message, "AaB03x", [headers1, headers2], [body1, body2]);
+
+  // Longer form from submitting the following from Chrome.
+  //
+  // <html>
+  // <body>
+  // <FORM action="http://127.0.0.1:1234/"
+  //     enctype="multipart/form-data"
+  //     method="post">
+  //  <P>
+  //  Text: <INPUT type="text" name="text_input">
+  //  Password: <INPUT type="password" name="password_input">
+  //  Checkbox: <INPUT type="checkbox" name="checkbox_input">
+  //  Radio: <INPUT type="radio" name="radio_input">
+  //  Send <INPUT type="submit">
+  //  </P>
+  // </FORM>
+  // </body>
+  // </html>
+
+  message = """
+\r\n------WebKitFormBoundaryQ3cgYAmGRF8yOeYB\r
+Content-Disposition: form-data; name=\"text_input\"\r
+\r
+text\r
+------WebKitFormBoundaryQ3cgYAmGRF8yOeYB\r
+Content-Disposition: form-data; name=\"password_input\"\r
+\r
+password\r
+------WebKitFormBoundaryQ3cgYAmGRF8yOeYB\r
+Content-Disposition: form-data; name=\"checkbox_input\"\r
+\r
+on\r
+------WebKitFormBoundaryQ3cgYAmGRF8yOeYB\r
+Content-Disposition: form-data; name=\"radio_input\"\r
+\r
+on\r
+------WebKitFormBoundaryQ3cgYAmGRF8yOeYB--\r\n""";
+  headers1 = <String, String>{
+      "content-disposition": "form-data; name=\"text_input\""};
+  headers2 = <String, String>{
+      "content-disposition": "form-data; name=\"password_input\""};
+  var headers3 = <String, String>{
+      "content-disposition": "form-data; name=\"checkbox_input\""};
+  var headers4 = <String, String>{
+      "content-disposition": "form-data; name=\"radio_input\""};
+  body1 = "text";
+  body2 = "password";
+  var body3 = "on";
+  var body4 = "on";
+  _testParse(message,
+            "----WebKitFormBoundaryQ3cgYAmGRF8yOeYB",
+            [headers1, headers2, headers3, headers4],
+            [body1, body2, body3, body4]);
+
+  // Same form from Firefox.
+  message = """
+\r\n-----------------------------52284550912143824192005403738\r
+Content-Disposition: form-data; name=\"text_input\"\r
+\r
+text\r
+-----------------------------52284550912143824192005403738\r
+Content-Disposition: form-data; name=\"password_input\"\r
+\r
+password\r
+-----------------------------52284550912143824192005403738\r
+Content-Disposition: form-data; name=\"checkbox_input\"\r
+\r
+on\r
+-----------------------------52284550912143824192005403738\r
+Content-Disposition: form-data; name=\"radio_input\"\r
+\r
+on\r
+-----------------------------52284550912143824192005403738--\r\n""";
+  _testParse(message,
+            "---------------------------52284550912143824192005403738",
+            [headers1, headers2, headers3, headers4],
+            [body1, body2, body3, body4]);
+
+  // And Internet Explorer
+  message = """
+\r\n-----------------------------7dc8f38c60326\r
+Content-Disposition: form-data; name=\"text_input\"\r
+\r
+text\r
+-----------------------------7dc8f38c60326\r
+Content-Disposition: form-data; name=\"password_input\"\r
+\r
+password\r
+-----------------------------7dc8f38c60326\r
+Content-Disposition: form-data; name=\"checkbox_input\"\r
+\r
+on\r
+-----------------------------7dc8f38c60326\r
+Content-Disposition: form-data; name=\"radio_input\"\r
+\r
+on\r
+-----------------------------7dc8f38c60326--\r\n""";
+  _testParse(message,
+            "---------------------------7dc8f38c60326",
+            [headers1, headers2, headers3, headers4],
+            [body1, body2, body3, body4]);
+
+  // Test boundary prefix inside prefix and content.
+  message = """
+-\r
+--\r
+--b\r
+--bo\r
+--bou\r
+--boun\r
+--bound\r
+--bounda\r
+--boundar\r
+--boundary\r
+Content-Type: text/plain\r
+\r
+-\r
+--\r
+--b\r
+--bo\r
+--bou\r
+--boun\r
+--bound\r\r
+--bounda\r\r\r
+--boundar\r\r\r\r
+--boundary\r
+Content-Type: text/plain\r
+\r
+--boundar\r
+--bounda\r
+--bound\r
+--boun\r
+--bou\r
+--bo\r
+--b\r\r\r\r
+--\r\r\r
+-\r\r
+--boundary--\r\n""";
+  var headers = <String, String>{"content-type": "text/plain"};
+  body1 = """
+-\r
+--\r
+--b\r
+--bo\r
+--bou\r
+--boun\r
+--bound\r\r
+--bounda\r\r\r
+--boundar\r\r\r""";
+  body2 = """
+--boundar\r
+--bounda\r
+--bound\r
+--boun\r
+--bou\r
+--bo\r
+--b\r\r\r\r
+--\r\r\r
+-\r""";
+  _testParse(message, "boundary", [headers, headers], [body1, body2]);
+
+  // Without initial CRLF.
+  message = """
+--xxx\r
+\r
+\r
+Body 1\r
+--xxx\r
+\r
+\r
+Body2\r
+--xxx--\r\n""";
+  _testParse(message, "xxx", null, ["\r\nBody 1", "\r\nBody2"]);
+}
+
+void _testParseInvalid() {
+  // Missing end boundary.
+  var message = """
+\r
+--xxx\r
+\r
+\r
+Body 1\r
+--xxx\r
+\r
+\r
+Body2\r
+--xxx\r\n""";
+  _testParse(message, "xxx", null, [null, null], true);
+}
+
+void main() {
+  _testParseValid();
+  _testParseInvalid();
+}
diff --git a/mojo/public/dart/third_party/mime/test/mime_type_test.dart b/mojo/public/dart/third_party/mime/test/mime_type_test.dart
new file mode 100644
index 0000000..23cc10e
--- /dev/null
+++ b/mojo/public/dart/third_party/mime/test/mime_type_test.dart
@@ -0,0 +1,111 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:math' as math;
+
+import 'package:unittest/unittest.dart';
+import 'package:mime/mime.dart';
+import 'package:mime/src/magic_number.dart';
+
+void _expectMimeType(String path,
+                    String expectedMimeType,
+                    {List<int> headerBytes,
+                     MimeTypeResolver resolver}) {
+  String mimeType;
+  if (resolver == null) {
+    mimeType = lookupMimeType(path, headerBytes: headerBytes);
+  } else {
+    mimeType = resolver.lookup(path, headerBytes: headerBytes);
+  }
+
+  expect(mimeType, expectedMimeType);
+}
+
+void main() {
+  group('global-lookup', () {
+    test('by-path', () {
+      _expectMimeType('file.dart', 'application/dart');
+      // Test mixed-case
+      _expectMimeType('file.DaRT', 'application/dart');
+      _expectMimeType('file.html', 'text/html');
+      _expectMimeType('file.xhtml', 'application/xhtml+xml');
+      _expectMimeType('file.jpeg', 'image/jpeg');
+      _expectMimeType('file.jpg', 'image/jpeg');
+      _expectMimeType('file.png', 'image/png');
+      _expectMimeType('file.gif', 'image/gif');
+      _expectMimeType('file.cc', 'text/x-c');
+      _expectMimeType('file.c', 'text/x-c');
+      _expectMimeType('file.css', 'text/css');
+      _expectMimeType('file.js', 'application/javascript');
+      _expectMimeType('file.ps', 'application/postscript');
+      _expectMimeType('file.pdf', 'application/pdf');
+      _expectMimeType('file.tiff', 'image/tiff');
+      _expectMimeType('file.tif', 'image/tiff');
+    });
+
+    test('unknown-mime-type', () {
+      _expectMimeType('file.unsupported-extension', null);
+    });
+
+    test('by-header-bytes', () {
+      _expectMimeType('file.jpg',
+                     'image/png',
+                     headerBytes: [0x89, 0x50, 0x4E, 0x47,
+                                   0x0D, 0x0A, 0x1A, 0x0A]);
+      _expectMimeType('file.jpg',
+                     'image/gif',
+                     headerBytes: [0x47, 0x49, 0x46, 0x38, 0x39,
+                                   0x61, 0x0D, 0x0A, 0x1A, 0x0A]);
+      _expectMimeType('file.gif',
+                     'image/jpeg',
+                     headerBytes: [0xFF, 0xD8, 0x46, 0x38, 0x39,
+                                   0x61, 0x0D, 0x0A, 0x1A, 0x0A]);
+      _expectMimeType('file.mp4',
+                     'video/mp4',
+                     headerBytes: [0x00, 0x00, 0x00, 0x04, 0x66, 0x74,
+                                   0x79, 0x70, 0x33, 0x67, 0x70, 0x35]);
+    });
+  });
+
+  group('custom-resolver', () {
+    test('override-extension', () {
+      var resolver = new MimeTypeResolver();
+      resolver.addExtension('jpg', 'my-mime-type');
+      _expectMimeType('file.jpg', 'my-mime-type', resolver: resolver);
+    });
+
+    test('fallthrough-extension', () {
+      var resolver = new MimeTypeResolver();
+      resolver.addExtension('jpg2', 'my-mime-type');
+      _expectMimeType('file.jpg', 'image/jpeg', resolver: resolver);
+    });
+
+    test('with-mask', () {
+      var resolver = new MimeTypeResolver.empty();
+      resolver.addMagicNumber([0x01, 0x02, 0x03],
+                              'my-mime-type',
+                              mask: [0x01, 0xFF, 0xFE]);
+      _expectMimeType('file',
+                     'my-mime-type',
+                     headerBytes: [0x01, 0x02, 0x03],
+                     resolver: resolver);
+      _expectMimeType('file',
+                     null,
+                     headerBytes: [0x01, 0x03, 0x03],
+                     resolver: resolver);
+      _expectMimeType('file',
+                     'my-mime-type',
+                     headerBytes: [0xFF, 0x02, 0x02],
+                     resolver: resolver);
+    });
+  });
+
+  test('default magic number', () {
+    var actualMaxBytes = DEFAULT_MAGIC_NUMBERS.fold(0, (previous, magic) {
+      return math.max(previous, magic.numbers.length);
+    });
+
+    expect(defaultMagicNumbersMaxLength, actualMaxBytes);
+  });
+}
diff --git a/mojo/public/dart/third_party/package_config/.gitignore b/mojo/public/dart/third_party/package_config/.gitignore
new file mode 100644
index 0000000..b46f3df
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/.gitignore
@@ -0,0 +1,8 @@
+.idea
+.pub
+packages
+build
+.project
+.settings
+pubspec.lock
+.packages
diff --git a/mojo/public/dart/third_party/package_config/.travis.yml b/mojo/public/dart/third_party/package_config/.travis.yml
new file mode 100644
index 0000000..7a20d25
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/.travis.yml
@@ -0,0 +1,4 @@
+language: dart
+dart: dev
+script: ./tool/travis.sh
+sudo: false
diff --git a/mojo/public/dart/third_party/package_config/AUTHORS b/mojo/public/dart/third_party/package_config/AUTHORS
new file mode 100644
index 0000000..e8063a8
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/AUTHORS
@@ -0,0 +1,6 @@
+# Below is a list of people and organizations that have contributed
+# to the project. Names should be added to the list like so:
+#
+#   Name/Organization <email address>
+
+Google Inc.
diff --git a/mojo/public/dart/third_party/package_config/CHANGELOG.md b/mojo/public/dart/third_party/package_config/CHANGELOG.md
new file mode 100644
index 0000000..f4e355e
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/CHANGELOG.md
@@ -0,0 +1,16 @@
+# Changelog
+
+## 0.1.3-dev
+
+- Invalid test cleanup (to keepup with changes in `Uri`).
+
+## 0.1.1
+
+- Syntax updates.
+
+
+## 0.1.0
+
+- Initial implementation.
+
+
diff --git a/mojo/public/dart/third_party/package_config/CONTRIBUTING.md b/mojo/public/dart/third_party/package_config/CONTRIBUTING.md
new file mode 100644
index 0000000..6f5e0ea
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/CONTRIBUTING.md
@@ -0,0 +1,33 @@
+Want to contribute? Great! First, read this page (including the small print at
+the end).
+
+### Before you contribute
+Before we can use your code, you must sign the
+[Google Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual)
+(CLA), which you can do online. The CLA is necessary mainly because you own the
+copyright to your changes, even after your contribution becomes part of our
+codebase, so we need your permission to use and distribute your code. We also
+need to be sure of various other things—for instance that you'll tell us if you
+know that your code infringes on other people's patents. You don't have to sign
+the CLA until after you've submitted your code for review and a member has
+approved it, but you must do it before we can put your code into our codebase.
+
+Before you start working on a larger contribution, you should get in touch with
+us first through the issue tracker with your idea so that we can help out and
+possibly guide you. Coordinating up front makes it much easier to avoid
+frustration later on.
+
+### Code reviews
+All submissions, including submissions by project members, require review.
+
+### File headers
+All files in the project must start with the following header.
+
+    // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+    // for details. All rights reserved. Use of this source code is governed by a
+    // BSD-style license that can be found in the LICENSE file.
+
+### The small print
+Contributions made by corporations are covered by a different agreement than the
+one above, the
+[Software Grant and Corporate Contributor License Agreement](https://developers.google.com/open-source/cla/corporate).
diff --git a/mojo/public/dart/third_party/package_config/LICENSE b/mojo/public/dart/third_party/package_config/LICENSE
new file mode 100644
index 0000000..de31e1a
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2015, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/package_config/README.md b/mojo/public/dart/third_party/package_config/README.md
new file mode 100644
index 0000000..9a0995d
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/README.md
@@ -0,0 +1,13 @@
+# package_config
+
+Support for working with **Package Resolution Configuration** files as described 
+in this [DEP](https://github.com/lrhn/dep-pkgspec/blob/master/DEP-pkgspec.md), 
+under review [here] (https://github.com/dart-lang/dart_enhancement_proposals/issues/5).
+
+[![Build Status](https://travis-ci.org/dart-lang/package_config.svg?branch=master)](https://travis-ci.org/dart-lang/package_config) [![pub package](http://img.shields.io/pub/v/package_config.svg)](https://pub.dartlang.org/packages/package_config) 
+
+## Features and bugs
+
+Please file feature requests and bugs at the [issue tracker][tracker].
+
+[tracker]: https://github.com/dart-lang/package_config/issues
diff --git a/mojo/public/dart/third_party/package_config/lib/discovery.dart b/mojo/public/dart/third_party/package_config/lib/discovery.dart
new file mode 100644
index 0000000..8e42af7
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/lib/discovery.dart
@@ -0,0 +1,228 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library package_config.discovery;
+
+import "dart:async";
+import "dart:io";
+import "dart:typed_data" show Uint8List;
+
+import "package:path/path.dart" as path;
+
+import "packages.dart";
+import "packages_file.dart" as pkgfile show parse;
+import "src/packages_impl.dart";
+import "src/packages_io_impl.dart";
+
+/// Reads a package resolution file and creates a [Packages] object from it.
+///
+/// The [packagesFile] must exist and be loadable.
+/// Currently that means the URI must have a `file`, `http` or `https` scheme,
+/// and that the file can be loaded and its contents parsed correctly.
+///
+/// If the [loader] is provided, it is used to fetch non-`file` URIs, and
+/// it can support other schemes or set up more complex HTTP requests.
+///
+/// This function can be used to load an explicitly configured package
+/// resolution file, for example one specified using a `--packages`
+/// command-line parameter.
+Future<Packages> loadPackagesFile(Uri packagesFile,
+                                  {Future<List<int>> loader(Uri uri)}) {
+  Packages parseBytes(List<int> bytes) {
+    Map<String, Uri> packageMap = pkgfile.parse(bytes, packagesFile);
+    return new MapPackages(packageMap);
+  }
+  if (packagesFile.scheme == "file") {
+    File file = new File.fromUri(packagesFile);
+    return file.readAsBytes().then(parseBytes);
+  }
+  if (loader == null) {
+    return _httpGet(packagesFile).then(parseBytes);
+  }
+  return loader(packagesFile).then(parseBytes);
+}
+
+
+/// Create a [Packages] object for a package directory.
+///
+/// The [packagesDir] URI should refer to a directory.
+/// Package names are resolved as relative to sub-directories of the
+/// package directory.
+///
+/// This function can be used for explicitly configured package directories,
+/// for example one specified using a `--package-root` comand-line parameter.
+Packages getPackagesDirectory(Uri packagesDir) {
+  if (packagesDir.scheme == "file") {
+    Directory directory = new Directory.fromUri(packagesDir);
+    return new FilePackagesDirectoryPackages(directory);
+  }
+  if (!packagesDir.path.endsWith('/')) {
+    packagesDir = packagesDir.replace(path: packagesDir.path + '/');
+  }
+  return new NonFilePackagesDirectoryPackages(packagesDir);
+}
+
+
+/// Discover the package configuration for a Dart script.
+///
+/// The [baseUri] points to either the Dart script or its directory.
+/// A package resolution strategy is found by going through the following steps,
+/// and stopping when something is found.
+///
+/// * Check if a `.packages` file exists in the same directory.
+/// * If `baseUri`'s scheme is not `file`, then assume a `packages` directory
+///   in the same directory, and resolve packages relative to that.
+/// * If `baseUri`'s scheme *is* `file`:
+///   * Check if a `packages` directory exists.
+///   * Otherwise check each successive parent directory of `baseUri` for a
+///     `.packages` file.
+///
+/// If any of these tests succeed, a `Packages` class is returned.
+/// Returns the constant [noPackages] if no resolution strategy is found.
+///
+/// This function currently only supports `file`, `http` and `https` URIs.
+/// It needs to be able to load a `.packages` file from the URI, so only
+/// recognized schemes are accepted.
+///
+/// To support other schemes, or more complex HTTP requests,
+/// an optional [loader] function can be supplied.
+/// It's called to load the `.packages` file for a non-`file` scheme.
+/// The loader function returns the *contents* of the file
+/// identified by the URI it's given.
+/// The content should be a UTF-8 encoded `.packages` file, and must return an
+/// error future if loading fails for any reason.
+Future<Packages> findPackages(Uri baseUri,
+                              {Future<List<int>> loader(Uri unsupportedUri)}) {
+  if (baseUri.scheme == "file") {
+    return new Future<Packages>.sync(() => findPackagesFromFile(baseUri));
+  } else if (loader != null) {
+    return findPackagesFromNonFile(baseUri, loader: loader);
+  } else if (baseUri.scheme == "http" || baseUri.scheme == "https") {
+    return findPackagesFromNonFile(baseUri, loader: _httpGet);
+  } else {
+    return new Future<Packages>.value(Packages.noPackages);
+  }
+}
+
+/// Find the location of the package resolution file/directory for a Dart file.
+///
+/// Checks for a `.packages` file in the [workingDirectory].
+/// If not found, checks for a `packages` directory in the same directory.
+/// If still not found, starts checking parent directories for
+/// `.packages` until reaching the root directory.
+///
+/// Returns a [File] object of a `.packages` file if one is found, or a
+/// [Directory] object for the `packages/` directory if that is found.
+FileSystemEntity _findPackagesFile(String workingDirectory) {
+  var dir = new Directory(workingDirectory);
+  if (!dir.isAbsolute) dir = dir.absolute;
+  if (!dir.existsSync()) {
+    throw new ArgumentError.value(
+        workingDirectory, "workingDirectory", "Directory does not exist.");
+  }
+  File checkForConfigFile(Directory directory) {
+    assert(directory.isAbsolute);
+    var file = new File(path.join(directory.path, ".packages"));
+    if (file.existsSync()) return file;
+    return null;
+  }
+  // Check for $cwd/.packages
+  var packagesCfgFile = checkForConfigFile(dir);
+  if (packagesCfgFile != null) return packagesCfgFile;
+  // Check for $cwd/packages/
+  var packagesDir = new Directory(path.join(dir.path, "packages"));
+  if (packagesDir.existsSync()) return packagesDir;
+  // Check for cwd(/..)+/.packages
+  var parentDir = dir.parent;
+  while (parentDir.path != dir.path) {
+    packagesCfgFile = checkForConfigFile(parentDir);
+    if (packagesCfgFile != null) break;
+    dir = parentDir;
+    parentDir = dir.parent;
+  }
+  return packagesCfgFile;
+}
+
+/// Finds a package resolution strategy for a local Dart script.
+///
+/// The [fileBaseUri] points to either a Dart script or the directory of the
+/// script. The `fileBaseUri` must be a `file:` URI.
+///
+/// This function first tries to locate a `.packages` file in the `fileBaseUri`
+/// directory. If that is not found, it instead checks for the presence of
+/// a `packages/` directory in the same place.
+/// If that also fails, it starts checking parent directories for a `.packages`
+/// file, and stops if it finds it.
+/// Otherwise it gives up and returns [Packages.noPackages].
+Packages findPackagesFromFile(Uri fileBaseUri) {
+  Uri baseDirectoryUri = fileBaseUri;
+  if (!fileBaseUri.path.endsWith('/')) {
+    baseDirectoryUri = baseDirectoryUri.resolve(".");
+  }
+  String baseDirectoryPath = baseDirectoryUri.toFilePath();
+  FileSystemEntity location = _findPackagesFile(baseDirectoryPath);
+  if (location == null) return Packages.noPackages;
+  if (location is File) {
+    List<int> fileBytes = location.readAsBytesSync();
+    Map<String, Uri> map =
+        pkgfile.parse(fileBytes, new Uri.file(location.path));
+    return new MapPackages(map);
+  }
+  assert(location is Directory);
+  return new FilePackagesDirectoryPackages(location);
+}
+
+/// Finds a package resolution strategy for a Dart script.
+///
+/// The [nonFileUri] points to either a Dart script or the directory of the
+/// script.
+/// The [nonFileUri] should not be a `file:` URI since the algorithm for
+/// finding a package resolution strategy is more elaborate for `file:` URIs.
+/// In that case, use [findPackagesFromFile].
+///
+/// This function first tries to locate a `.packages` file in the [nonFileUri]
+/// directory. If that is not found, it instead assumes a `packages/` directory
+/// in the same place.
+///
+/// By default, this function only works for `http:` and `https:` URIs.
+/// To support other schemes, a loader must be provided, which is used to
+/// try to load the `.packages` file. The loader should return the contents
+/// of the requested `.packages` file as bytes, which will be assumed to be
+/// UTF-8 encoded.
+Future<Packages> findPackagesFromNonFile(Uri nonFileUri,
+                                         {Future<List<int>> loader(Uri name)}) {
+  if (loader == null) loader = _httpGet;
+  Uri packagesFileUri = nonFileUri.resolve(".packages");
+  return loader(packagesFileUri).then((List<int> fileBytes) {
+    Map<String, Uri> map = pkgfile.parse(fileBytes, packagesFileUri);
+    return new MapPackages(map);
+  }, onError: (_) {
+    // Didn't manage to load ".packages". Assume a "packages/" directory.
+    Uri packagesDirectoryUri = nonFileUri.resolve("packages/");
+    return new NonFilePackagesDirectoryPackages(packagesDirectoryUri);
+  });
+}
+
+/// Fetches a file over http.
+Future<List<int>> _httpGet(Uri uri) async {
+  HttpClient client = new HttpClient();
+  HttpClientRequest request = await client.getUrl(uri);
+  HttpClientResponse response = await request.close();
+  if (response.statusCode != HttpStatus.OK) {
+    throw 'Failure getting $uri: '
+        '${response.statusCode} ${response.reasonPhrase}';
+  }
+  List<List<int>> splitContent = await response.toList();
+  int totalLength = 0;
+  for (var list in splitContent) {
+    totalLength += list.length;
+  }
+  Uint8List result = new Uint8List(totalLength);
+  int offset = 0;
+  for (List<int> contentPart in splitContent) {
+    result.setRange(offset, offset + contentPart.length, contentPart);
+    offset += contentPart.length;
+  }
+  return result;
+}
diff --git a/mojo/public/dart/third_party/package_config/lib/discovery_analysis.dart b/mojo/public/dart/third_party/package_config/lib/discovery_analysis.dart
new file mode 100644
index 0000000..af4df07
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/lib/discovery_analysis.dart
@@ -0,0 +1,166 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Analyse a directory structure and find packages resolvers for each
+/// sub-directory.
+///
+/// The resolvers are generally the same that would be found by using
+/// the `discovery.dart` library on each sub-directory in turn,
+/// but more efficiently and with some heuristics for directories that
+/// wouldn't otherwise have a package resolution strategy, or that are
+/// determined to be "package directories" themselves.
+library package_config.discovery_analysis;
+
+import "dart:io" show File, Directory;
+import "dart:collection" show HashMap;
+
+import "package:path/path.dart" as path;
+
+import "packages.dart";
+import "packages_file.dart" as pkgfile;
+import "src/packages_impl.dart";
+import "src/packages_io_impl.dart";
+
+/// Associates a [Packages] package resolution strategy with a directory.
+///
+/// The package resolution applies to the directory and any sub-directory
+/// that doesn't have its own overriding child [PackageContext].
+abstract class PackageContext {
+  /// The directory that introduced the [packages] resolver.
+  Directory get directory;
+
+  /// A [Packages] resolver that applies to the directory.
+  ///
+  /// Introduced either by a `.packages` file or a `packages/` directory.
+  Packages get packages;
+
+  /// Child contexts that apply to sub-directories of [directory].
+  List<PackageContext> get children;
+
+  /// Look up the [PackageContext] that applies to a specific directory.
+  ///
+  /// The directory must be inside [directory].
+  PackageContext operator[](Directory directory);
+
+  /// A map from directory to package resolver.
+  ///
+  /// Has an entry for this package context and for each child context
+  /// contained in this one.
+  Map<Directory, Packages> asMap();
+
+  /// Analyze [directory] and sub-directories for package resolution strategies.
+  ///
+  /// Returns a mapping from sub-directories to [Packages] objects.
+  ///
+  /// The analysis assumes that there are no `.packages` files in a parent
+  /// directory of `directory`. If there is, its corresponding `Packages` object
+  /// should be provided as `root`.
+  static PackageContext findAll(Directory directory,
+                                {Packages root: Packages.noPackages}) {
+    if (!directory.existsSync()) {
+      throw new ArgumentError("Directory not found: $directory");
+    }
+    List contexts = [];
+    void findRoots(Directory directory) {
+      Packages packages;
+      List oldContexts;
+      File packagesFile = new File(path.join(directory.path, ".packages"));
+      if (packagesFile.existsSync()) {
+        packages = _loadPackagesFile(packagesFile);
+        oldContexts = contexts;
+        contexts = [];
+      } else {
+        Directory packagesDir =
+            new Directory(path.join(directory.path, "packages"));
+        if (packagesDir.existsSync()) {
+          packages = new FilePackagesDirectoryPackages(packagesDir);
+          oldContexts = contexts;
+          contexts = [];
+        }
+      }
+      for (var entry in directory.listSync()) {
+        if (entry is Directory) {
+          if (packages == null || !entry.path.endsWith("/packages")) {
+            findRoots(entry);
+          }
+        }
+      }
+      if (packages != null) {
+        oldContexts.add(new _PackageContext(directory, packages, contexts));
+        contexts = oldContexts;
+      }
+    }
+    findRoots(directory);
+    // If the root is not itself context root, add a the wrapper context.
+    if (contexts.length == 1 &&
+        contexts[0].directory == directory) {
+      return contexts[0];
+    }
+    return new _PackageContext(directory, root, contexts);
+  }
+}
+
+class _PackageContext implements PackageContext {
+  final Directory directory;
+  final Packages packages;
+  final List<PackageContext> children;
+  _PackageContext(this.directory, this.packages, List<PackageContext> children)
+      : children = new List<PackageContext>.unmodifiable(children);
+
+  Map<Directory, Packages> asMap() {
+    var result = new HashMap<Directory, Packages>();
+    recurse(_PackageContext current) {
+      result[current.directory] = current.packages;
+      for (var child in current.children) {
+        recurse(child);
+      }
+    }
+    recurse(this);
+    return result;
+  }
+
+  PackageContext operator[](Directory directory) {
+    String path = directory.path;
+    if (!path.startsWith(this.directory.path)) {
+      throw new ArgumentError("Not inside $path: $directory");
+    }
+    _PackageContext current = this;
+    // The current path is know to agree with directory until deltaIndex.
+    int deltaIndex = current.directory.path.length;
+    List children = current.children;
+    int i = 0;
+    while (i < children.length) {
+      // TODO(lrn): Sort children and use binary search.
+      _PackageContext child = children[i];
+      String childPath = child.directory.path;
+      if (_stringsAgree(path, childPath, deltaIndex, childPath.length)) {
+        deltaIndex = childPath.length;
+        if (deltaIndex == path.length) {
+          return child;
+        }
+        current = child;
+        children = current.children;
+        i = 0;
+        continue;
+      }
+      i++;
+    }
+    return current;
+  }
+
+  static bool _stringsAgree(String a, String b, int start, int end) {
+    if (a.length < end || b.length < end) return false;
+    for (int i = start; i < end; i++) {
+      if (a.codeUnitAt(i) != b.codeUnitAt(i)) return false;
+    }
+    return true;
+  }
+}
+
+Packages _loadPackagesFile(File file) {
+  var uri = new Uri.file(file.path);
+  var bytes = file.readAsBytesSync();
+  var map = pkgfile.parse(bytes, uri);
+  return new MapPackages(map);
+}
diff --git a/mojo/public/dart/third_party/package_config/lib/packages.dart b/mojo/public/dart/third_party/package_config/lib/packages.dart
new file mode 100644
index 0000000..dbaa06d
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/lib/packages.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library package_config.packages;
+
+import "src/packages_impl.dart";
+
+/// A package resolution strategy.
+///
+/// Allows converting a `package:` URI to a different kind of URI.
+///
+/// May also allow listing the available packages and converting
+/// to a `Map<String, Uri>` that gives the base location of each available
+/// package. In some cases there is no way to find the available packages,
+/// in which case [packages] and [asMap] will throw if used.
+/// One such case is if the packages are resolved relative to a
+/// `packages/` directory available over HTTP.
+abstract class Packages {
+
+  /// A [Packages] resolver containing no packages.
+  ///
+  /// This constant object is returned by [find] above if no
+  /// package resolution strategy is found.
+  static const Packages noPackages = const NoPackages();
+
+  /// Resolve a package URI into a non-package URI.
+  ///
+  /// Translates a `package:` URI, according to the package resolution
+  /// strategy, into a URI that can be loaded.
+  /// By default, only `file`, `http` and `https` URIs are returned.
+  /// Custom `Packages` objects may return other URIs.
+  ///
+  /// If resolution fails because a package with the requested package name
+  /// is not available, the [notFound] function is called.
+  /// If no `notFound` function is provided, it defaults to throwing an error.
+  ///
+  /// The [packageUri] must be a valid package URI.
+  Uri resolve(Uri packageUri, {Uri notFound(Uri packageUri)});
+
+  /// Return the names of the available packages.
+  ///
+  /// Returns an iterable that allows iterating the names of available packages.
+  ///
+  /// Some `Packages` objects are unable to find the package names,
+  /// and getting `packages` from such a `Packages` object will throw.
+  Iterable<String> get packages;
+
+  /// Return the names-to-base-URI mapping of the available packages.
+  ///
+  /// Returns a map from package name to a base URI.
+  /// The [resolve] method will resolve a package URI with a specific package
+  /// name to a path extending the base URI that this map gives for that
+  /// package name.
+  ///
+  /// Some `Packages` objects are unable to find the package names,
+  /// and calling `asMap` on such a `Packages` object will throw.
+  Map<String, Uri> asMap();
+}
diff --git a/mojo/public/dart/third_party/package_config/lib/packages_file.dart b/mojo/public/dart/third_party/package_config/lib/packages_file.dart
new file mode 100644
index 0000000..f30781d
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/lib/packages_file.dart
@@ -0,0 +1,190 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library package_config.packages_file;
+
+import "package:charcode/ascii.dart";
+import "src/util.dart" show isValidPackageName;
+
+/// Parses a `.packages` file into a map from package name to base URI.
+///
+/// The [source] is the byte content of a `.packages` file, assumed to be
+/// UTF-8 encoded. In practice, all significant parts of the file must be ASCII,
+/// so Latin-1 or Windows-1252 encoding will also work fine.
+///
+/// If the file content is available as a string, its [String.codeUnits] can
+/// be used as the `source` argument of this function.
+///
+/// The [baseLocation] is used as a base URI to resolve all relative
+/// URI references against.
+/// If the content was read from a file, `baseLocation` should be the
+/// location of that file.
+///
+/// Returns a simple mapping from package name to package location.
+Map<String, Uri> parse(List<int> source, Uri baseLocation) {
+  int index = 0;
+  Map<String, Uri> result = <String, Uri>{};
+  while (index < source.length) {
+    bool isComment = false;
+    int start = index;
+    int separatorIndex = -1;
+    int end = source.length;
+    int char = source[index++];
+    if (char == $cr || char == $lf) {
+      continue;
+    }
+    if (char == $colon) {
+      throw new FormatException("Missing package name", source, index - 1);
+    }
+    isComment = char == $hash;
+    while (index < source.length) {
+      char = source[index++];
+      if (char == $colon && separatorIndex < 0) {
+        separatorIndex = index - 1;
+      } else if (char == $cr || char == $lf) {
+        end = index - 1;
+        break;
+      }
+    }
+    if (isComment) continue;
+    if (separatorIndex < 0) {
+      throw new FormatException("No ':' on line", source, index - 1);
+    }
+    var packageName = new String.fromCharCodes(source, start, separatorIndex);
+    if (!isValidPackageName(packageName)) {
+      throw new FormatException("Not a valid package name", packageName, 0);
+    }
+    var packageUri = new String.fromCharCodes(source, separatorIndex + 1, end);
+    var packageLocation = Uri.parse(packageUri);
+    packageLocation = baseLocation.resolveUri(packageLocation);
+    if (!packageLocation.path.endsWith('/')) {
+      packageLocation =
+          packageLocation.replace(path: packageLocation.path + "/");
+    }
+    if (result.containsKey(packageName)) {
+      throw new FormatException(
+          "Same package name occured twice.", source, start);
+    }
+    result[packageName] = packageLocation;
+  }
+  return result;
+}
+
+/// Writes the mapping to a [StringSink].
+///
+/// If [comment] is provided, the output will contain this comment
+/// with `# ` in front of each line.
+/// Lines are defined as ending in line feed (`'\n'`). If the final
+/// line of the comment doesn't end in a line feed, one will be added.
+///
+/// If [baseUri] is provided, package locations will be made relative
+/// to the base URI, if possible, before writing.
+///
+/// All the keys of [packageMapping] must be valid package names,
+/// and the values must be URIs that do not have the `package:` scheme.
+void write(StringSink output, Map<String, Uri> packageMapping,
+           {Uri baseUri, String comment}) {
+  if (baseUri != null && !baseUri.isAbsolute) {
+    throw new ArgumentError.value(baseUri, "baseUri", "Must be absolute");
+  }
+
+  if (comment != null) {
+    var lines = comment.split('\n');
+    if (lines.last.isEmpty) lines.removeLast();
+    for (var commentLine in lines) {
+      output.write('# ');
+      output.writeln(commentLine);
+    }
+  } else {
+    output.write("# generated by package:package_config at ");
+    output.write(new DateTime.now());
+    output.writeln();
+  }
+
+  packageMapping.forEach((String packageName, Uri uri) {
+    // Validate packageName.
+    if (!isValidPackageName(packageName)) {
+      throw new ArgumentError('"$packageName" is not a valid package name');
+    }
+    if (uri.scheme == "package") {
+      throw new ArgumentError.value(
+          "Package location must not be a package: URI", uri.toString());
+    }
+    output.write(packageName);
+    output.write(':');
+    // If baseUri provided, make uri relative.
+    if (baseUri != null) {
+      uri = _relativize(uri, baseUri);
+    }
+    output.write(uri);
+    if (!uri.path.endsWith('/')) {
+      output.write('/');
+    }
+    output.writeln();
+  });
+}
+
+/// Attempts to return a relative URI for [uri].
+///
+/// The result URI satisfies `baseUri.resolveUri(result) == uri`,
+/// but may be relative.
+/// The `baseUri` must be absolute.
+Uri _relativize(Uri uri, Uri baseUri) {
+  assert(baseUri.isAbsolute);
+  if (uri.hasQuery || uri.hasFragment) {
+    uri = new Uri(
+        scheme: uri.scheme,
+        userInfo: uri.hasAuthority ? uri.userInfo : null,
+        host: uri.hasAuthority ? uri.host : null,
+        port: uri.hasAuthority ? uri.port : null,
+        path: uri.path);
+  }
+
+  // Already relative. We assume the caller knows what they are doing.
+  if (!uri.isAbsolute) return uri;
+
+  if (baseUri.scheme != uri.scheme) {
+    return uri;
+  }
+
+  // If authority differs, we could remove the scheme, but it's not worth it.
+  if (uri.hasAuthority != baseUri.hasAuthority) return uri;
+  if (uri.hasAuthority) {
+    if (uri.userInfo != baseUri.userInfo ||
+        uri.host.toLowerCase() != baseUri.host.toLowerCase() ||
+        uri.port != baseUri.port) {
+      return uri;
+    }
+  }
+
+  baseUri = _normalizePath(baseUri);
+  List<String> base = baseUri.pathSegments.toList();
+  if (base.isNotEmpty) {
+    base = new List<String>.from(base)..removeLast();
+  }
+  uri = _normalizePath(uri);
+  List<String> target = uri.pathSegments.toList();
+  if (target.isNotEmpty && target.last.isEmpty) target.removeLast();
+  int index = 0;
+  while (index < base.length && index < target.length) {
+    if (base[index] != target[index]) {
+      break;
+    }
+    index++;
+  }
+  if (index == base.length) {
+    if (index == target.length) {
+      return new Uri(path: "./");
+    }
+    return new Uri(path: target.skip(index).join('/'));
+  } else if (index > 0) {
+    return new Uri(
+        path: '../' * (base.length - index) + target.skip(index).join('/'));
+  } else {
+    return uri;
+  }
+}
+
+// TODO: inline to uri.normalizePath() when we move to 1.11
+Uri _normalizePath(Uri uri) => new Uri().resolveUri(uri);
diff --git a/mojo/public/dart/third_party/package_config/lib/src/packages_impl.dart b/mojo/public/dart/third_party/package_config/lib/src/packages_impl.dart
new file mode 100644
index 0000000..e85f755
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/lib/src/packages_impl.dart
@@ -0,0 +1,94 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Implementations of [Packages] that may be used in either server or browser
+/// based applications. For implementations that can only run in the browser,
+/// see [package_config.packages_io_impl].
+library package_config.packages_impl;
+
+import "dart:collection" show UnmodifiableMapView;
+import "../packages.dart";
+import "util.dart" show checkValidPackageUri;
+
+/// A [Packages] null-object.
+class NoPackages implements Packages {
+  const NoPackages();
+
+  Uri resolve(Uri packageUri, {Uri notFound(Uri packageUri)}) {
+    String packageName = checkValidPackageUri(packageUri);
+    if (notFound != null) return notFound(packageUri);
+    throw new ArgumentError.value(packageUri, "packageUri",
+                                  'No package named "$packageName"');
+  }
+
+  Iterable<String> get packages => new Iterable<String>.generate(0);
+
+  Map<String, Uri> asMap() => const<String,Uri>{};
+}
+
+/// Base class for [Packages] implementations.
+///
+/// This class implements the [resolve] method in terms of a private
+/// member
+abstract class PackagesBase implements Packages {
+  Uri resolve(Uri packageUri, {Uri notFound(Uri packageUri)}) {
+    packageUri = _normalizePath(packageUri);
+    String packageName = checkValidPackageUri(packageUri);
+    Uri packageBase = getBase(packageName);
+    if (packageBase == null) {
+      if (notFound != null) return notFound(packageUri);
+      throw new ArgumentError.value(packageUri, "packageUri",
+                                    'No package named "$packageName"');
+    }
+    String packagePath = packageUri.path.substring(packageName.length + 1);
+    return packageBase.resolve(packagePath);
+  }
+
+  /// Find a base location for a package name.
+  ///
+  /// Returns `null` if no package exists with that name, and that can be
+  /// determined.
+  Uri getBase(String packageName);
+
+  // TODO: inline to uri.normalizePath() when we move to 1.11
+  static Uri _normalizePath(Uri uri) => new Uri().resolveUri(uri);
+}
+
+/// A [Packages] implementation based on an existing map.
+class MapPackages extends PackagesBase {
+  final Map<String, Uri> _mapping;
+  MapPackages(this._mapping);
+
+  Uri getBase(String packageName) => _mapping[packageName];
+
+  Iterable<String> get packages => _mapping.keys;
+
+  Map<String, Uri> asMap() => new UnmodifiableMapView<String, Uri>(_mapping);
+}
+
+/// A [Packages] implementation based on a remote (e.g., HTTP) directory.
+///
+/// There is no way to detect which packages exist short of trying to use
+/// them. You can't necessarily check whether a directory exists,
+/// except by checking for a know file in the directory.
+class NonFilePackagesDirectoryPackages extends PackagesBase {
+  final Uri _packageBase;
+  NonFilePackagesDirectoryPackages(this._packageBase);
+
+  Uri getBase(String packageName) => _packageBase.resolve("$packageName/");
+
+  Error _failListingPackages() {
+    return new UnsupportedError(
+        "Cannot list packages for a ${_packageBase.scheme}: "
+        "based package root");
+  }
+
+  Iterable<String> get packages {
+    throw _failListingPackages();
+  }
+
+  Map<String, Uri> asMap() {
+    throw _failListingPackages();
+  }
+}
diff --git a/mojo/public/dart/third_party/package_config/lib/src/packages_io_impl.dart b/mojo/public/dart/third_party/package_config/lib/src/packages_io_impl.dart
new file mode 100644
index 0000000..21b61fd
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/lib/src/packages_io_impl.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Implementations of [Packages] that can only be used in server based
+/// applications.
+library package_config.packages_io_impl;
+
+import "dart:collection" show UnmodifiableMapView;
+import "dart:io" show Directory;
+import "package:path/path.dart" as path;
+import "packages_impl.dart";
+
+/// A [Packages] implementation based on a local directory.
+class FilePackagesDirectoryPackages extends PackagesBase {
+  final Directory _packageDir;
+  FilePackagesDirectoryPackages(this._packageDir);
+
+  Uri getBase(String packageName) =>
+    new Uri.file(path.join(_packageDir.path, packageName, '.'));
+
+  Iterable<String> _listPackageNames() {
+    return _packageDir.listSync()
+    .where((e) => e is Directory)
+    .map((e) => path.basename(e.path));
+  }
+
+  Iterable<String> get packages => _listPackageNames();
+
+  Map<String, Uri> asMap() {
+    var result = <String, Uri>{};
+    for (var packageName in _listPackageNames()) {
+      result[packageName] = getBase(packageName);
+    }
+    return new UnmodifiableMapView<String, Uri>(result);
+  }
+}
diff --git a/mojo/public/dart/third_party/package_config/lib/src/util.dart b/mojo/public/dart/third_party/package_config/lib/src/util.dart
new file mode 100644
index 0000000..badf640
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/lib/src/util.dart
@@ -0,0 +1,97 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Utility methods used by more than one library in the package.
+library package_config.util;
+
+import "package:charcode/ascii.dart";
+
+// All ASCII characters that are valid in a package name, with space
+// for all the invalid ones (including space).
+const String _validPackageNameCharacters =
+    r"                                 !  $ &'()*+,-. 0123456789 ; =  "
+    r"@ABCDEFGHIJKLMNOPQRSTUVWXYZ    _ abcdefghijklmnopqrstuvwxyz   ~ ";
+
+/// Tests whether something is a valid Dart package name.
+bool isValidPackageName(String string) {
+  return _findInvalidCharacter(string) < 0;
+}
+
+/// Check if a string is a valid package name.
+///
+/// Valid package names contain only characters in [_validPackageNameCharacters]
+/// and must contain at least one non-'.' character.
+///
+/// Returns `-1` if the string is valid.
+/// Otherwise returns the index of the first invalid character,
+/// or `string.length` if the string contains no non-'.' character.
+int _findInvalidCharacter(String string) {
+  // Becomes non-zero if any non-'.' character is encountered.
+  int nonDot = 0;
+  for (int i = 0; i < string.length; i++) {
+    var c = string.codeUnitAt(i);
+    if (c > 0x7f || _validPackageNameCharacters.codeUnitAt(c) <= $space) {
+      return i;
+    }
+    nonDot += c ^ $dot;
+  }
+  if (nonDot == 0) return string.length;
+  return -1;
+}
+
+/// Validate that a Uri is a valid package:URI.
+String checkValidPackageUri(Uri packageUri) {
+  if (packageUri.scheme != "package") {
+    throw new ArgumentError.value(packageUri, "packageUri",
+                                  "Not a package: URI");
+  }
+  if (packageUri.hasAuthority) {
+    throw new ArgumentError.value(packageUri, "packageUri",
+                                  "Package URIs must not have a host part");
+  }
+  if (packageUri.hasQuery) {
+    // A query makes no sense if resolved to a file: URI.
+    throw new ArgumentError.value(packageUri, "packageUri",
+                                  "Package URIs must not have a query part");
+  }
+  if (packageUri.hasFragment) {
+    // We could leave the fragment after the URL when resolving,
+    // but it would be odd if "package:foo/foo.dart#1" and
+    // "package:foo/foo.dart#2" were considered different libraries.
+    // Keep the syntax open in case we ever get multiple libraries in one file.
+    throw new ArgumentError.value(packageUri, "packageUri",
+                                  "Package URIs must not have a fragment part");
+  }
+  if (packageUri.path.startsWith('/')) {
+    throw new ArgumentError.value(packageUri, "packageUri",
+                                  "Package URIs must not start with a '/'");
+  }
+  int firstSlash = packageUri.path.indexOf('/');
+  if (firstSlash == -1) {
+    throw new ArgumentError.value(packageUri, "packageUri",
+        "Package URIs must start with the package name followed by a '/'");
+  }
+  String packageName = packageUri.path.substring(0, firstSlash);
+  int badIndex = _findInvalidCharacter(packageName);
+  if (badIndex >= 0) {
+    if (packageName.isEmpty) {
+      throw new ArgumentError.value(packageUri, "packageUri",
+          "Package names mus be non-empty");
+    }
+    if (badIndex == packageName.length) {
+      throw new ArgumentError.value(packageUri, "packageUri",
+          "Package names must contain at least one non-'.' character");
+    }
+    assert(badIndex < packageName.length);
+    int badCharCode = packageName.codeUnitAt(badIndex);
+    var badChar = "U+" + badCharCode.toRadixString(16).padLeft(4, '0');
+    if (badCharCode >= 0x20 && badCharCode <= 0x7e) {
+      // Printable character.
+      badChar = "'${packageName[badIndex]}' ($badChar)";
+    }
+    throw new ArgumentError.value(packageUri, "packageUri",
+        "Package names must not contain $badChar");
+  }
+  return packageName;
+}
diff --git a/mojo/public/dart/third_party/package_config/pubspec.yaml b/mojo/public/dart/third_party/package_config/pubspec.yaml
new file mode 100644
index 0000000..f2c4e06
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/pubspec.yaml
@@ -0,0 +1,15 @@
+name: package_config
+version: 0.1.3
+description: Support for working with Package Resolution config files.
+author: Dart Team <misc@dartlang.org>
+homepage: https://github.com/dart-lang/package_config
+
+environment:
+  sdk: '>=1.11.0-dev.0.0 <2.0.0'
+
+dependencies:
+  charcode: ^1.1.0
+  path: ^1.0.0
+
+dev_dependencies:
+  test: '>=0.12.0 <0.13.0'
diff --git a/mojo/public/dart/third_party/package_config/test/all.dart b/mojo/public/dart/third_party/package_config/test/all.dart
new file mode 100644
index 0000000..78e6cff
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/test/all.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:test/test.dart";
+
+import "discovery_analysis_test.dart" as discovery_analysis;
+import "discovery_test.dart" as discovery;
+import "parse_test.dart" as parse;
+import "parse_write_test.dart" as parse_write;
+
+main() {
+  group("parse:", parse.main);
+  group("discovery:", discovery.main);
+  group("discovery-analysis:", discovery_analysis.main);
+  group("parse/write:", parse_write.main);
+}
diff --git a/mojo/public/dart/third_party/package_config/test/discovery_analysis_test.dart b/mojo/public/dart/third_party/package_config/test/discovery_analysis_test.dart
new file mode 100644
index 0000000..f33a4a8
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/test/discovery_analysis_test.dart
@@ -0,0 +1,124 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library package_config.discovery_analysis_test;
+
+import "dart:async";
+import "dart:io";
+
+import "package:package_config/discovery_analysis.dart";
+import "package:package_config/packages.dart";
+import "package:path/path.dart" as path;
+import "package:test/test.dart";
+
+main() {
+  fileTest("basic",
+           {".packages": packagesFile,
+            "foo": {".packages": packagesFile},
+            "bar": {"packages": {"foo": {}, "bar":{}, "baz": {}}},
+            "baz": {}},
+           (Directory directory) {
+    var dirUri = new Uri.directory(directory.path);
+    PackageContext ctx = PackageContext.findAll(directory);
+    PackageContext root = ctx[directory];
+    expect(root, same(ctx));
+    validatePackagesFile(root.packages, dirUri);
+    var fooDir = sub(directory, "foo");
+    PackageContext foo = ctx[fooDir];
+    expect(identical(root, foo), isFalse);
+    validatePackagesFile(foo.packages, dirUri.resolve("foo/"));
+    var barDir = sub(directory, "bar");
+    PackageContext bar = ctx[sub(directory, "bar")];
+    validatePackagesDir(bar.packages, dirUri.resolve("bar/"));
+    PackageContext barbar = ctx[sub(barDir, "bar")];
+    expect(barbar, same(bar));  // inherited.
+    PackageContext baz = ctx[sub(directory, "baz")];
+    expect(baz, same(root));  // inherited.
+
+    var map = ctx.asMap();
+    expect(map.keys.map((dir) => dir.path),
+           unorderedEquals([directory.path, fooDir.path, barDir.path]));
+  });
+}
+
+Directory sub(Directory parent, String dirName) {
+  return new Directory(path.join(parent.path, dirName));
+}
+
+const packagesFile = """
+# A comment
+foo:file:///dart/packages/foo/
+bar:http://example.com/dart/packages/bar/
+baz:packages/baz/
+""";
+
+void validatePackagesFile(Packages resolver, Uri location) {
+  expect(resolver, isNotNull);
+  expect(resolver.resolve(pkg("foo", "bar/baz")),
+         equals(Uri.parse("file:///dart/packages/foo/bar/baz")));
+  expect(resolver.resolve(pkg("bar", "baz/qux")),
+         equals(Uri.parse("http://example.com/dart/packages/bar/baz/qux")));
+  expect(resolver.resolve(pkg("baz", "qux/foo")),
+         equals(location.resolve("packages/baz/qux/foo")));
+  expect(resolver.packages, unorderedEquals(["foo", "bar", "baz"]));
+}
+
+void validatePackagesDir(Packages resolver, Uri location) {
+  // Expect three packages: foo, bar and baz
+  expect(resolver, isNotNull);
+  expect(resolver.resolve(pkg("foo", "bar/baz")),
+         equals(location.resolve("packages/foo/bar/baz")));
+  expect(resolver.resolve(pkg("bar", "baz/qux")),
+         equals(location.resolve("packages/bar/baz/qux")));
+  expect(resolver.resolve(pkg("baz", "qux/foo")),
+         equals(location.resolve("packages/baz/qux/foo")));
+  if (location.scheme == "file") {
+    expect(resolver.packages, unorderedEquals(["foo", "bar", "baz"]));
+  } else {
+    expect(() => resolver.packages, throws);
+  }
+}
+
+Uri pkg(String packageName, String packagePath) {
+  var path;
+  if (packagePath.startsWith('/')) {
+    path = "$packageName$packagePath";
+  } else {
+    path = "$packageName/$packagePath";
+  }
+  return new Uri(scheme: "package", path: path);
+}
+
+/// Create a directory structure from [description] and run [fileTest].
+///
+/// Description is a map, each key is a file entry. If the value is a map,
+/// it's a sub-dir, otherwise it's a file and the value is the content
+/// as a string.
+void fileTest(String name,
+              Map description,
+              Future fileTest(Directory directory)) {
+  group("file-test", () {
+    Directory tempDir = Directory.systemTemp.createTempSync("file-test");
+    setUp(() {
+      _createFiles(tempDir, description);
+    });
+    tearDown(() {
+      tempDir.deleteSync(recursive: true);
+    });
+    test(name, () => fileTest(tempDir));
+  });
+}
+
+void _createFiles(Directory target, Map description) {
+  description.forEach((name, content) {
+    if (content is Map) {
+      Directory subDir = new Directory(path.join(target.path, name));
+      subDir.createSync();
+      _createFiles(subDir, content);
+    } else {
+      File file = new File(path.join(target.path, name));
+      file.writeAsStringSync(content, flush: true);
+    }
+  });
+}
diff --git a/mojo/public/dart/third_party/package_config/test/discovery_test.dart b/mojo/public/dart/third_party/package_config/test/discovery_test.dart
new file mode 100644
index 0000000..4f780c2
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/test/discovery_test.dart
@@ -0,0 +1,335 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library package_config.discovery_test;
+
+import "dart:async";
+import "dart:io";
+import "package:test/test.dart";
+import "package:package_config/packages.dart";
+import "package:package_config/discovery.dart";
+import "package:path/path.dart" as path;
+
+const packagesFile = """
+# A comment
+foo:file:///dart/packages/foo/
+bar:http://example.com/dart/packages/bar/
+baz:packages/baz/
+""";
+
+void validatePackagesFile(Packages resolver, Uri location) {
+  expect(resolver, isNotNull);
+  expect(resolver.resolve(pkg("foo", "bar/baz")),
+         equals(Uri.parse("file:///dart/packages/foo/bar/baz")));
+  expect(resolver.resolve(pkg("bar", "baz/qux")),
+         equals(Uri.parse("http://example.com/dart/packages/bar/baz/qux")));
+  expect(resolver.resolve(pkg("baz", "qux/foo")),
+         equals(location.resolve("packages/baz/qux/foo")));
+  expect(resolver.packages, unorderedEquals(["foo", "bar", "baz"]));
+}
+
+void validatePackagesDir(Packages resolver, Uri location) {
+  // Expect three packages: foo, bar and baz
+  expect(resolver, isNotNull);
+  expect(resolver.resolve(pkg("foo", "bar/baz")),
+         equals(location.resolve("packages/foo/bar/baz")));
+  expect(resolver.resolve(pkg("bar", "baz/qux")),
+         equals(location.resolve("packages/bar/baz/qux")));
+  expect(resolver.resolve(pkg("baz", "qux/foo")),
+         equals(location.resolve("packages/baz/qux/foo")));
+  if (location.scheme == "file") {
+    expect(resolver.packages, unorderedEquals(["foo", "bar", "baz"]));
+  } else {
+    expect(() => resolver.packages, throws);
+  }
+}
+
+
+Uri pkg(String packageName, String packagePath) {
+  var path;
+  if (packagePath.startsWith('/')) {
+    path = "$packageName$packagePath";
+  } else {
+    path = "$packageName/$packagePath";
+  }
+  return new Uri(scheme: "package", path: path);
+}
+
+main() {
+  generalTest(".packages",
+              {".packages": packagesFile,
+               "script.dart": "main(){}",
+               "packages": {"shouldNotBeFound": {}}},
+              (Uri location) async {
+    Packages resolver;
+    resolver = await findPackages(location);
+    validatePackagesFile(resolver, location);
+    resolver = await findPackages(location.resolve("script.dart"));
+    validatePackagesFile(resolver, location);
+    var specificDiscovery = (location.scheme == "file")
+        ? findPackagesFromFile
+        : findPackagesFromNonFile;
+    resolver = await specificDiscovery(location);
+    validatePackagesFile(resolver, location);
+    resolver = await specificDiscovery(location.resolve("script.dart"));
+    validatePackagesFile(resolver, location);
+  });
+
+  generalTest("packages/",
+              {"packages": { "foo": {}, "bar": {}, "baz": {}},
+               "script.dart": "main(){}"},
+              (Uri location) async {
+    Packages resolver;
+    bool isFile = (location.scheme == "file");
+    resolver = await findPackages(location);
+    validatePackagesDir(resolver, location);
+    resolver = await findPackages(location.resolve("script.dart"));
+    validatePackagesDir(resolver, location);
+    var specificDiscovery = isFile
+        ? findPackagesFromFile
+        : findPackagesFromNonFile;
+    resolver = await specificDiscovery(location);
+    validatePackagesDir(resolver, location);
+    resolver = await specificDiscovery(location.resolve("script.dart"));
+    validatePackagesDir(resolver, location);
+  });
+
+  generalTest("underscore packages",
+              {"packages": {"_foo": {}}},
+              (Uri location) async {
+    Packages resolver = await findPackages(location);
+    expect(resolver.resolve(pkg("_foo", "foo.dart")),
+           equals(location.resolve("packages/_foo/foo.dart")));
+  });
+
+  fileTest(".packages recursive",
+           {".packages": packagesFile, "subdir": {"script.dart": "main(){}"}},
+           (Uri location) async {
+    Packages resolver;
+    resolver = await findPackages(location.resolve("subdir/"));
+    validatePackagesFile(resolver, location);
+    resolver = await findPackages(location.resolve("subdir/script.dart"));
+    validatePackagesFile(resolver, location);
+    resolver = await findPackagesFromFile(location.resolve("subdir/"));
+    validatePackagesFile(resolver, location);
+    resolver =
+        await findPackagesFromFile(location.resolve("subdir/script.dart"));
+    validatePackagesFile(resolver, location);
+  });
+
+  httpTest(".packages not recursive",
+           {".packages": packagesFile, "subdir": {"script.dart": "main(){}"}},
+           (Uri location) async {
+    Packages resolver;
+    var subdir = location.resolve("subdir/");
+    resolver = await findPackages(subdir);
+    validatePackagesDir(resolver, subdir);
+    resolver = await findPackages(subdir.resolve("script.dart"));
+    validatePackagesDir(resolver, subdir);
+    resolver = await findPackagesFromNonFile(subdir);
+    validatePackagesDir(resolver, subdir);
+    resolver = await findPackagesFromNonFile(subdir.resolve("script.dart"));
+    validatePackagesDir(resolver, subdir);
+  });
+
+  fileTest("no packages",
+          {"script.dart": "main(){}"},
+          (Uri location) async {
+    // A file: location with no .packages or packages returns
+    // Packages.noPackages.
+    Packages resolver;
+    resolver = await findPackages(location);
+    expect(resolver, same(Packages.noPackages));
+    resolver = await findPackages(location.resolve("script.dart"));
+    expect(resolver, same(Packages.noPackages));
+    resolver = findPackagesFromFile(location);
+    expect(resolver, same(Packages.noPackages));
+    resolver = findPackagesFromFile(location.resolve("script.dart"));
+    expect(resolver, same(Packages.noPackages));
+  });
+
+  httpTest("no packages",
+           {"script.dart": "main(){}"},
+           (Uri location) async {
+    // A non-file: location with no .packages or packages/:
+    // Assumes a packages dir exists, and resolves relative to that.
+    Packages resolver;
+    resolver = await findPackages(location);
+    validatePackagesDir(resolver, location);
+    resolver = await findPackages(location.resolve("script.dart"));
+    validatePackagesDir(resolver, location);
+    resolver = await findPackagesFromNonFile(location);
+    validatePackagesDir(resolver, location);
+    resolver = await findPackagesFromNonFile(location.resolve("script.dart"));
+    validatePackagesDir(resolver, location);
+  });
+
+  test(".packages w/ loader", () async {
+    Uri location = Uri.parse("krutch://example.com/path/");
+    Future loader(Uri file) async {
+      if (file.path.endsWith(".packages")) {
+        return packagesFile.codeUnits;
+      }
+      throw "not found";
+    }
+    // A non-file: location with no .packages or packages/:
+    // Assumes a packages dir exists, and resolves relative to that.
+    Packages resolver;
+    resolver = await findPackages(location, loader: loader);
+    validatePackagesFile(resolver, location);
+    resolver = await findPackages(location.resolve("script.dart"),
+                                  loader: loader);
+    validatePackagesFile(resolver, location);
+    resolver = await findPackagesFromNonFile(location, loader: loader);
+    validatePackagesFile(resolver, location);
+    resolver = await findPackagesFromNonFile(location.resolve("script.dart"),
+                                             loader: loader);
+    validatePackagesFile(resolver, location);
+  });
+
+  test("no packages w/ loader", () async {
+    Uri location = Uri.parse("krutch://example.com/path/");
+    Future loader(Uri file) async {
+      throw "not found";
+    }
+    // A non-file: location with no .packages or packages/:
+    // Assumes a packages dir exists, and resolves relative to that.
+    Packages resolver;
+    resolver = await findPackages(location, loader: loader);
+    validatePackagesDir(resolver, location);
+    resolver = await findPackages(location.resolve("script.dart"),
+                                  loader: loader);
+    validatePackagesDir(resolver, location);
+    resolver = await findPackagesFromNonFile(location, loader: loader);
+    validatePackagesDir(resolver, location);
+    resolver = await findPackagesFromNonFile(location.resolve("script.dart"),
+                                             loader:loader);
+    validatePackagesDir(resolver, location);
+  });
+
+  generalTest("loadPackagesFile",
+              {".packages": packagesFile},
+              (Uri directory) async {
+    Uri file = directory.resolve(".packages");
+    Packages resolver = await loadPackagesFile(file);
+    validatePackagesFile(resolver, file);
+  });
+
+  generalTest("loadPackagesFile non-default name",
+              {"pheldagriff": packagesFile},
+              (Uri directory) async {
+    Uri file = directory.resolve("pheldagriff");
+    Packages resolver = await loadPackagesFile(file);
+    validatePackagesFile(resolver, file);
+  });
+
+  test("loadPackagesFile w/ loader", () async {
+    loader(Uri uri) async => packagesFile.codeUnits;
+    Uri file = Uri.parse("krutz://example.com/.packages");
+    Packages resolver = await loadPackagesFile(file, loader: loader);
+    validatePackagesFile(resolver, file);
+  });
+
+  generalTest("loadPackagesFile not found",
+               {},
+               (Uri directory) async {
+    Uri file = directory.resolve(".packages");
+    expect(loadPackagesFile(file), throws);
+  });
+
+  generalTest("loadPackagesFile syntax error",
+               {".packages": "syntax error"},
+               (Uri directory) async {
+    Uri file = directory.resolve(".packages");
+    expect(loadPackagesFile(file), throws);
+  });
+
+  generalTest("getPackagesDir",
+              {"packages": {"foo": {}, "bar": {}, "baz": {}}},
+              (Uri directory) async {
+    Uri packages = directory.resolve("packages/");
+    Packages resolver = getPackagesDirectory(packages);
+    Uri resolved = resolver.resolve(pkg("foo","flip/flop"));
+    expect(resolved, packages.resolve("foo/flip/flop"));
+  });
+}
+
+/// Create a directory structure from [description] and run [fileTest].
+///
+/// Description is a map, each key is a file entry. If the value is a map,
+/// it's a sub-dir, otherwise it's a file and the value is the content
+/// as a string.
+void fileTest(String name,
+              Map description,
+              Future fileTest(Uri directory)) {
+  group("file-test", () {
+    Directory tempDir = Directory.systemTemp.createTempSync("file-test");
+    setUp(() {
+      _createFiles(tempDir, description);
+    });
+    tearDown(() {
+      tempDir.deleteSync(recursive: true);
+    });
+    test(name, () => fileTest(new Uri.file(path.join(tempDir.path, "."))));
+  });
+}
+
+/// HTTP-server the directory structure from [description] and run [htpTest].
+///
+/// Description is a map, each key is a file entry. If the value is a map,
+/// it's a sub-dir, otherwise it's a file and the value is the content
+/// as a string.
+void httpTest(String name, Map description, Future httpTest(Uri directory)) {
+  group("http-test", () {
+    var serverSub;
+    var uri;
+    setUp(() {
+      return HttpServer
+        .bind(InternetAddress.LOOPBACK_IP_V4, 0)
+        .then((server) {
+          uri = new Uri(scheme: "http",
+                        host: "127.0.0.1",
+                        port: server.port,
+                        path: "/");
+          serverSub = server.listen((HttpRequest request) {
+            // No error handling.
+            var path = request.uri.path;
+            if (path.startsWith('/')) path = path.substring(1);
+            if (path.endsWith('/')) path = path.substring(0, path.length - 1);
+            var parts = path.split('/');
+            var fileOrDir = description;
+            for (int i = 0; i < parts.length; i++) {
+              fileOrDir = fileOrDir[parts[i]];
+              if (fileOrDir == null) {
+                request.response.statusCode = 404;
+                request.response.close();
+              }
+            }
+            request.response.write(fileOrDir);
+            request.response.close();
+          });
+        });
+    });
+    tearDown(() => serverSub.cancel());
+    test(name, () => httpTest(uri));
+  });
+}
+
+void generalTest(String name, Map description, Future action(Uri location)) {
+  fileTest(name, description, action);
+  httpTest(name, description, action);
+}
+
+void _createFiles(Directory target, Map description) {
+  description.forEach((name, content) {
+    if (content is Map) {
+      Directory subDir = new Directory(path.join(target.path, name));
+      subDir.createSync();
+      _createFiles(subDir, content);
+    } else {
+      File file = new File(path.join(target.path, name));
+      file.writeAsStringSync(content, flush: true);
+    }
+  });
+}
diff --git a/mojo/public/dart/third_party/package_config/test/parse_test.dart b/mojo/public/dart/third_party/package_config/test/parse_test.dart
new file mode 100644
index 0000000..8ed5c2e
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/test/parse_test.dart
@@ -0,0 +1,167 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library package_config.parse_test;
+
+import "package:package_config/packages.dart";
+import "package:package_config/packages_file.dart" show parse;
+import "package:package_config/src/packages_impl.dart";
+import "package:test/test.dart";
+
+main() {
+  var base = Uri.parse("file:///one/two/three/packages.map");
+  test("empty", () {
+    var packages = doParse(emptySample, base);
+    expect(packages.asMap(), isEmpty);
+  });
+  test("comment only", () {
+    var packages = doParse(commentOnlySample, base);
+    expect(packages.asMap(), isEmpty);
+  });
+  test("empty lines only", () {
+    var packages = doParse(emptyLinesSample, base);
+    expect(packages.asMap(), isEmpty);
+  });
+
+  test("empty lines only", () {
+    var packages = doParse(emptyLinesSample, base);
+    expect(packages.asMap(), isEmpty);
+  });
+
+  test("single", () {
+    var packages = doParse(singleRelativeSample, base);
+    expect(packages.packages.toList(), equals(["foo"]));
+    expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")),
+        equals(base.resolve("../test/").resolve("bar/baz.dart")));
+  });
+
+  test("single no slash", () {
+    var packages = doParse(singleRelativeSampleNoSlash, base);
+    expect(packages.packages.toList(), equals(["foo"]));
+    expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")),
+        equals(base.resolve("../test/").resolve("bar/baz.dart")));
+  });
+
+  test("single no newline", () {
+    var packages = doParse(singleRelativeSampleNoNewline, base);
+    expect(packages.packages.toList(), equals(["foo"]));
+    expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")),
+        equals(base.resolve("../test/").resolve("bar/baz.dart")));
+  });
+
+  test("single absolute authority", () {
+    var packages = doParse(singleAbsoluteSample, base);
+    expect(packages.packages.toList(), equals(["foo"]));
+    expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")),
+        equals(Uri.parse("http://example.com/some/where/bar/baz.dart")));
+  });
+
+  test("single empty path", () {
+    var packages = doParse(singleEmptyPathSample, base);
+    expect(packages.packages.toList(), equals(["foo"]));
+    expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")),
+        equals(base.replace(path: "${base.path}/bar/baz.dart")));
+  });
+
+  test("single absolute path", () {
+    var packages = doParse(singleAbsolutePathSample, base);
+    expect(packages.packages.toList(), equals(["foo"]));
+    expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")),
+        equals(base.replace(path: "/test/bar/baz.dart")));
+  });
+
+  test("multiple", () {
+    var packages = doParse(multiRelativeSample, base);
+    expect(
+        packages.packages.toList()..sort(), equals(["bar", "foo"]));
+    expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")),
+        equals(base.resolve("../test/").resolve("bar/baz.dart")));
+    expect(packages.resolve(Uri.parse("package:bar/foo/baz.dart")),
+        equals(base.resolve("../test2/").resolve("foo/baz.dart")));
+  });
+
+  test("dot-dot 1", () {
+    var packages = doParse(singleRelativeSample, base);
+    expect(packages.packages.toList(), equals(["foo"]));
+    expect(packages.resolve(Uri.parse("package:foo/qux/../bar/baz.dart")),
+        equals(base.resolve("../test/").resolve("bar/baz.dart")));
+  });
+
+  test("all valid chars can be used in URI segment", () {
+    var packages = doParse(allValidCharsSample, base);
+    expect(packages.packages.toList(), equals([allValidChars]));
+    expect(packages.resolve(Uri.parse("package:$allValidChars/bar/baz.dart")),
+        equals(base.resolve("../test/").resolve("bar/baz.dart")));
+  });
+
+  test("no invalid chars accepted", () {
+    var map = {};
+    for (int i = 0; i < allValidChars.length; i++) {
+      map[allValidChars.codeUnitAt(i)] = true;
+    }
+    for (int i = 0; i <= 255; i++) {
+      if (map[i] == true) continue;
+      var char = new String.fromCharCode(i);
+      expect(() => doParse("x${char}x:x", null), throws);
+    }
+  });
+
+  test("no escapes", () {
+    expect(() => doParse("x%41x:x", base), throws);
+  });
+
+  test("same name twice", () {
+    expect(() => doParse(singleRelativeSample * 2, base), throws);
+  });
+
+  for (String invalidSample in invalid) {
+    test("invalid '$invalidSample'", () {
+      var result;
+      try {
+        result = doParse(invalidSample, base);
+      } on FormatException {
+        // expected
+        return;
+      }
+      fail("Resolved to $result");
+    });
+  }
+}
+
+Packages doParse(String sample, Uri baseUri) {
+  Map<String, Uri> map = parse(sample.codeUnits, baseUri);
+  return new MapPackages(map);
+}
+
+// Valid samples.
+var emptySample                   = "";
+var commentOnlySample             = "# comment only\n";
+var emptyLinesSample              = "\n\n\r\n";
+var singleRelativeSample          = "foo:../test/\n";
+var singleRelativeSampleNoSlash   = "foo:../test\n";
+var singleRelativeSampleNoNewline = "foo:../test/";
+var singleAbsoluteSample          = "foo:http://example.com/some/where/\n";
+var singleEmptyPathSample         = "foo:\n";
+var singleAbsolutePathSample      = "foo:/test/\n";
+var multiRelativeSample           = "foo:../test/\nbar:../test2/\n";
+// All valid path segment characters in an URI.
+var allValidChars =
+    r"!$&'()*+,-.0123456789;="
+    r"@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~";
+
+var allValidCharsSample = "${allValidChars}:../test/\n";
+
+// Invalid samples.
+var invalid = [
+  ":baz.dart",  // empty.
+  "foobar=baz.dart",  // no colon (but an equals, which is not the same)
+  ".:../test/",  // dot segment
+  "..:../test/",  // dot-dot segment
+  "...:../test/",  // dot-dot-dot segment
+  "foo/bar:../test/",  // slash in name
+  "/foo:../test/",  // slash at start of name
+  "?:../test/",  // invalid characters.
+  "[:../test/",  // invalid characters.
+  "x#:../test/",  // invalid characters.
+];
diff --git a/mojo/public/dart/third_party/package_config/test/parse_write_test.dart b/mojo/public/dart/third_party/package_config/test/parse_write_test.dart
new file mode 100644
index 0000000..6a185db
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/test/parse_write_test.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library package_config.parse_write_test;
+
+import "package:package_config/packages_file.dart";
+import "package:test/test.dart";
+
+main() {
+  testBase(baseDirString) {
+    var baseDir = Uri.parse(baseDirString);
+    group("${baseDir.scheme} base", () {
+      Uri packagesFile = baseDir.resolve(".packages");
+
+      roundTripTest(String name, Map<String, Uri> map) {
+        group(name, () {
+          test("write with no baseUri", () {
+            var content = writeToString(map).codeUnits;
+            var resultMap = parse(content, packagesFile);
+            expect(resultMap, map);
+          });
+
+          test("write with base directory", () {
+            var content = writeToString(map, baseUri: baseDir).codeUnits;
+            var resultMap = parse(content, packagesFile);
+            expect(resultMap, map);
+          });
+
+          test("write with base .packages file", () {
+            var content = writeToString(map, baseUri: packagesFile).codeUnits;
+            var resultMap = parse(content, packagesFile);
+            expect(resultMap, map);
+          });
+        });
+      }
+      var lowerDir = baseDir.resolve("path3/path4/");
+      var higherDir = baseDir.resolve("../");
+      var parallelDir = baseDir.resolve("../path3/");
+      var rootDir = baseDir.resolve("/");
+      var fileDir = Uri.parse("file:///path1/part2/");
+      var httpDir = Uri.parse("http://example.com/path1/path2/");
+      var otherDir = Uri.parse("other:/path1/path2/");
+
+      roundTripTest("empty", {});
+      roundTripTest("lower directory", {"foo": lowerDir});
+      roundTripTest("higher directory", {"foo": higherDir});
+      roundTripTest("parallel directory", {"foo": parallelDir});
+      roundTripTest("same directory", {"foo": baseDir});
+      roundTripTest("root directory", {"foo": rootDir});
+      roundTripTest("file directory", {"foo": fileDir});
+      roundTripTest("http directory", {"foo": httpDir});
+      roundTripTest("other scheme directory", {"foo": otherDir});
+      roundTripTest("multiple same-type directories",
+                    {"foo": lowerDir, "bar": higherDir, "baz": parallelDir});
+      roundTripTest("multiple scheme directories",
+                    {"foo": fileDir, "bar": httpDir, "baz": otherDir});
+      roundTripTest("multiple scheme directories and mutliple same type",
+                    {"foo": fileDir, "bar": httpDir, "baz": otherDir,
+                     "qux": lowerDir, "hip": higherDir, "dep": parallelDir});
+    });
+  }
+
+  testBase("file:///base1/base2/");
+  testBase("http://example.com/base1/base2/");
+  testBase("other:/base1/base2/");
+
+  // Check that writing adds the comment.
+  test("write preserves comment", () {
+    var comment = "comment line 1\ncomment line 2\ncomment line 3";
+    var result = writeToString({}, comment: comment);
+    // Comment with "# " before each line and "\n" after last.
+    var expectedComment =
+        "# comment line 1\n# comment line 2\n# comment line 3\n";
+    expect(result, startsWith(expectedComment));
+  });
+}
+
+String writeToString(Map map, {Uri baseUri, String comment}) {
+  var buffer = new StringBuffer();
+  write(buffer, map, baseUri: baseUri, comment: comment);
+  return buffer.toString();
+}
diff --git a/mojo/public/dart/third_party/package_config/tool/travis.sh b/mojo/public/dart/third_party/package_config/tool/travis.sh
new file mode 100755
index 0000000..6d8cfe3
--- /dev/null
+++ b/mojo/public/dart/third_party/package_config/tool/travis.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+# Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Fast fail the script on failures.		
+set -e
+
+# Verify that the libraries are error free.
+dartanalyzer --fatal-warnings \
+  lib/packages.dart \
+  test/all.dart
+
+# Run the tests.
+dart test/all.dart
+
diff --git a/mojo/public/dart/third_party/path/.gitignore b/mojo/public/dart/third_party/path/.gitignore
new file mode 100644
index 0000000..388eff0
--- /dev/null
+++ b/mojo/public/dart/third_party/path/.gitignore
@@ -0,0 +1,14 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.pub/
+build/
+packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/path/.status b/mojo/public/dart/third_party/path/.status
new file mode 100644
index 0000000..bfc58fc
--- /dev/null
+++ b/mojo/public/dart/third_party/path/.status
@@ -0,0 +1,21 @@
+# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Skip non-test files ending with "_test".
+packages/*: Skip
+*/packages/*: Skip
+*/*/packages/*: Skip
+*/*/*/packages/*: Skip
+*/*/*/*packages/*: Skip
+*/*/*/*/*packages/*: Skip
+
+# Only run tests from the build directory, since we don't care about the
+# difference between transformed an untransformed code.
+test/*: Skip
+
+[ $browser ]
+build/test/io_test: Fail, OK # Uses dart:io.
+
+[ $runtime == vm ]
+build/test/browser_test: Fail, OK # Uses dart:html
diff --git a/mojo/public/dart/third_party/path/CHANGELOG.md b/mojo/public/dart/third_party/path/CHANGELOG.md
new file mode 100644
index 0000000..457be80
--- /dev/null
+++ b/mojo/public/dart/third_party/path/CHANGELOG.md
@@ -0,0 +1,56 @@
+## 1.3.6
+
+* Ensure that `path.toUri` preserves trailing slashes for relative paths.
+
+## 1.3.5
+
+* Added type annotations to top-level and static fields.
+
+## 1.3.4
+
+* Fix dev_compiler warnings.
+
+## 1.3.3
+
+* Performance improvement in `Context.relative` - don't call `current` if `from`
+  is not relative.
+
+## 1.3.2
+
+* Fix some analyzer hints.
+
+## 1.3.1
+
+* Add a number of performance improvements.
+
+## 1.3.0
+
+* Expose a top-level `context` field that provides access to a `Context` object
+  for the current system.
+
+## 1.2.3
+
+* Don't cache path Context based on cwd, as cwd involves a system-call to
+  compute.
+
+## 1.2.2
+
+* Remove the documentation link from the pubspec so this is linked to
+  pub.dartlang.org by default.
+
+# 1.2.1
+
+* Many members on `Style` that provided access to patterns and functions used
+  internally for parsing paths have been deprecated.
+
+* Manually parse paths (rather than using RegExps to do so) for better
+  performance.
+
+# 1.2.0
+
+* Added `path.prettyUri`, which produces a human-readable representation of a
+  URI.
+
+# 1.1.0
+
+* `path.fromUri` now accepts strings as well as `Uri` objects.
diff --git a/mojo/public/dart/third_party/path/LICENSE b/mojo/public/dart/third_party/path/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/mojo/public/dart/third_party/path/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/path/README.md b/mojo/public/dart/third_party/path/README.md
new file mode 100644
index 0000000..5a172cd
--- /dev/null
+++ b/mojo/public/dart/third_party/path/README.md
@@ -0,0 +1,93 @@
+A comprehensive, cross-platform path manipulation library for Dart.
+
+The path package provides common operations for manipulating paths:
+joining, splitting, normalizing, etc.
+
+We've tried very hard to make this library do the "right" thing on whatever
+platform you run it on, including in the browser. When you use the top-level
+functions, it will assume the current platform's path style and work with
+that. If you want to explicitly work with paths of a specific style, you can
+construct a `path.Context` for that style.
+
+## Using
+
+The path library was designed to be imported with a prefix, though you don't
+have to if you don't want to:
+
+```dart
+import 'package:path/path.dart' as path;
+```
+
+The most common way to use the library is through the top-level functions.
+These manipulate path strings based on your current working directory and
+the path style (POSIX, Windows, or URLs) of the host platform. For example:
+
+```dart
+path.join("directory", "file.txt");
+```
+
+This calls the top-level [join] function to join "directory" and
+"file.txt" using the current platform's directory separator.
+
+If you want to work with paths for a specific platform regardless of the
+underlying platform that the program is running on, you can create a
+[Context] and give it an explicit [Style]:
+
+```dart
+var context = new path.Context(style: Style.windows);
+context.join("directory", "file.txt");
+```
+
+This will join "directory" and "file.txt" using the Windows path separator,
+even when the program is run on a POSIX machine.
+
+## FAQ
+
+### Where can I use this?
+
+Pathos runs on the Dart VM and in the browser under both dart2js and Dartium.
+Under dart2js, it currently returns "." as the current working directory, while
+under Dartium it returns the current URL.
+
+### Why doesn't this make paths first-class objects?
+
+When you have path *objects*, then every API that takes a path has to decide if
+it accepts strings, path objects, or both.
+
+ *  Accepting strings is the most convenient, but then it seems weird to have
+    these path objects that aren't actually accepted by anything that needs a
+    path. Once you've created a path, you have to always call `.toString()` on
+    it before you can do anything useful with it.
+
+ *  Requiring objects forces users to wrap path strings in these objects, which
+    is tedious. It also means coupling that API to whatever library defines this
+    path class. If there are multiple "path" libraries that each define their
+    own path types, then any library that works with paths has to pick which one
+    it uses.
+
+ *  Taking both means you can't type your API. That defeats the purpose of
+    having a path type: why have a type if your APIs can't annotate that they
+    expect it?
+
+Given that, we've decided this library should simply treat paths as strings.
+
+### How cross-platform is this?
+
+We believe this library handles most of the corner cases of Windows paths
+(POSIX paths are generally pretty straightforward):
+
+ *  It understands that *both* "/" and "\" are valid path separators, not just
+    "\".
+
+ *  It can accurately tell if a path is absolute based on drive-letters or UNC
+    prefix.
+
+ *  It understands that "/foo" is not an absolute path on Windows.
+
+ *  It knows that "C:\foo\one.txt" and "c:/foo\two.txt" are two files in the
+    same directory.
+
+### What is a "path" in the browser?
+
+If you use this package in a browser, then it considers the "platform" to be
+the browser itself and uses URL strings to represent "browser paths".
diff --git a/mojo/public/dart/third_party/path/benchmark/benchmark.dart b/mojo/public/dart/third_party/path/benchmark/benchmark.dart
new file mode 100644
index 0000000..419eee0
--- /dev/null
+++ b/mojo/public/dart/third_party/path/benchmark/benchmark.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../lib/path.dart' as path;
+
+void runBenchmark(String name, Function func, List files) {
+  // Warmup.
+  for (int i = 0; i < 10000; i++) {
+    for (var p in files) {
+      func(p);
+    }
+  }
+  var count = 100000;
+  var sw = new Stopwatch()..start();
+  for (int i = 0; i < count; i++) {
+    for (var p in files) {
+      func(p);
+    }
+  }
+  print("$name: ${count / sw.elapsedMicroseconds} iter/us (${sw.elapsed})");
+}
+
+main(args) {
+  for (var style in [path.Style.posix, path.Style.url, path.Style.windows]) {
+    var context = new path.Context(style: style);
+    var files = COMMON_PATHS.toList()..addAll(STYLE_PATHS[style]);
+
+    void benchmark(name, func) {
+      name = style.name + '-' + name;
+      if (args.isEmpty || args.any((arg) => name.contains(arg))) {
+        runBenchmark(name, func, files);
+      }
+    }
+
+    benchmark('basename', context.basename);
+    benchmark('basenameWithoutExtension', context.basenameWithoutExtension);
+    benchmark('dirname', context.dirname);
+    benchmark('extension', context.extension);
+    benchmark('rootPrefix', context.rootPrefix);
+    benchmark('isAbsolute', context.isAbsolute);
+    benchmark('isRelative', context.isRelative);
+    benchmark('isRootRelative', context.isRootRelative);
+    benchmark('normalize', context.normalize);
+    benchmark('relative', context.relative);
+    benchmark('toUri', context.toUri);
+    benchmark('prettyUri', context.prettyUri);
+  }
+}
+
+const COMMON_PATHS = const ['.', '..', 'out/ReleaseIA32/packages'];
+
+final STYLE_PATHS = {
+  path.Style.posix: [
+    '/home/user/dart/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart',
+  ],
+  path.Style.url: [
+    'https://example.server.org/443643002/path?top=yes#fragment',
+  ],
+  path.Style.windows: [
+    r'C:\User\me\',
+    r'\\server\share\my\folders\some\file.data',
+  ],
+};
diff --git a/mojo/public/dart/third_party/path/codereview.settings b/mojo/public/dart/third_party/path/codereview.settings
new file mode 100644
index 0000000..1ff4094
--- /dev/null
+++ b/mojo/public/dart/third_party/path/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: https://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/path/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/path/lib/path.dart b/mojo/public/dart/third_party/path/lib/path.dart
new file mode 100644
index 0000000..af9efe5
--- /dev/null
+++ b/mojo/public/dart/third_party/path/lib/path.dart
@@ -0,0 +1,381 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A comprehensive, cross-platform path manipulation library.
+///
+/// ## Installing ##
+///
+/// Use [pub][] to install this package. Add the following to your
+/// `pubspec.yaml` file.
+///
+///     dependencies:
+///       path: any
+///
+/// Then run `pub install`.
+///
+/// For more information, see the [path package on pub.dartlang.org][pkg].
+///
+/// [pub]: http://pub.dartlang.org
+/// [pkg]: http://pub.dartlang.org/packages/path
+///
+/// ## Usage ##
+///
+/// The path library was designed to be imported with a prefix, though you don't
+/// have to if you don't want to:
+///
+///     import 'package:path/path.dart' as path;
+///
+/// The most common way to use the library is through the top-level functions.
+/// These manipulate path strings based on your current working directory and
+/// the path style (POSIX, Windows, or URLs) of the host platform. For example:
+///
+///     path.join("directory", "file.txt");
+///
+/// This calls the top-level [join] function to join "directory" and "file.txt"
+/// using the current platform's directory separator.
+///
+/// If you want to work with paths for a specific platform regardless of the
+/// underlying platform that the program is running on, you can create a
+/// [Context] and give it an explicit [Style]:
+///
+///     var context = new path.Context(style: Style.windows);
+///     context.join("directory", "file.txt");
+///
+/// This will join "directory" and "file.txt" using the Windows path separator,
+/// even when the program is run on a POSIX machine.
+library path;
+
+import 'src/context.dart';
+import 'src/style.dart';
+
+export 'src/context.dart' hide createInternal;
+export 'src/path_exception.dart';
+export 'src/style.dart';
+
+/// A default context for manipulating POSIX paths.
+final Context posix = new Context(style: Style.posix);
+
+/// A default context for manipulating Windows paths.
+final Context windows = new Context(style: Style.windows);
+
+/// A default context for manipulating URLs.
+final Context url = new Context(style: Style.url);
+
+/// The system path context.
+///
+/// This differs from a context created with [new Context] in that its
+/// [Context.current] is always the current working directory, rather than being
+/// set once when the context is created.
+final Context context = createInternal();
+
+/// Returns the [Style] of the current context.
+///
+/// This is the style that all top-level path functions will use.
+Style get style => context.style;
+
+/// Gets the path to the current working directory.
+///
+/// In the browser, this means the current URL, without the last file segment.
+String get current {
+  var uri = Uri.base;
+  if (Style.platform == Style.url) {
+    return uri.resolve('.').toString();
+  } else {
+    var path = uri.toFilePath();
+    // Remove trailing '/' or '\'.
+    int lastIndex = path.length - 1;
+    assert(path[lastIndex] == '/' || path[lastIndex] == '\\');
+    return path.substring(0, lastIndex);
+  }
+}
+
+/// Gets the path separator for the current platform. This is `\` on Windows
+/// and `/` on other platforms (including the browser).
+String get separator => context.separator;
+
+/// Creates a new path by appending the given path parts to [current].
+/// Equivalent to [join()] with [current] as the first argument. Example:
+///
+///     path.absolute('path', 'to/foo'); // -> '/your/current/dir/path/to/foo'
+String absolute(String part1, [String part2, String part3, String part4,
+    String part5, String part6, String part7]) =>
+        context.absolute(part1, part2, part3, part4, part5, part6, part7);
+
+/// Gets the part of [path] after the last separator.
+///
+///     path.basename('path/to/foo.dart'); // -> 'foo.dart'
+///     path.basename('path/to');          // -> 'to'
+///
+/// Trailing separators are ignored.
+///
+///     path.basename('path/to/'); // -> 'to'
+String basename(String path) => context.basename(path);
+
+/// Gets the part of [path] after the last separator, and without any trailing
+/// file extension.
+///
+///     path.basenameWithoutExtension('path/to/foo.dart'); // -> 'foo'
+///
+/// Trailing separators are ignored.
+///
+///     path.basenameWithoutExtension('path/to/foo.dart/'); // -> 'foo'
+String basenameWithoutExtension(String path) =>
+    context.basenameWithoutExtension(path);
+
+/// Gets the part of [path] before the last separator.
+///
+///     path.dirname('path/to/foo.dart'); // -> 'path/to'
+///     path.dirname('path/to');          // -> 'path'
+///
+/// Trailing separators are ignored.
+///
+///     path.dirname('path/to/'); // -> 'path'
+///
+/// If an absolute path contains no directories, only a root, then the root
+/// is returned.
+///
+///     path.dirname('/');  // -> '/' (posix)
+///     path.dirname('c:\');  // -> 'c:\' (windows)
+///
+/// If a relative path has no directories, then '.' is returned.
+///
+///     path.dirname('foo');  // -> '.'
+///     path.dirname('');  // -> '.'
+String dirname(String path) => context.dirname(path);
+
+/// Gets the file extension of [path]: the portion of [basename] from the last
+/// `.` to the end (including the `.` itself).
+///
+///     path.extension('path/to/foo.dart');    // -> '.dart'
+///     path.extension('path/to/foo');         // -> ''
+///     path.extension('path.to/foo');         // -> ''
+///     path.extension('path/to/foo.dart.js'); // -> '.js'
+///
+/// If the file name starts with a `.`, then that is not considered the
+/// extension:
+///
+///     path.extension('~/.bashrc');    // -> ''
+///     path.extension('~/.notes.txt'); // -> '.txt'
+String extension(String path) => context.extension(path);
+
+// TODO(nweiz): add a UNC example for Windows once issue 7323 is fixed.
+/// Returns the root of [path], if it's absolute, or the empty string if it's
+/// relative.
+///
+///     // Unix
+///     path.rootPrefix('path/to/foo'); // -> ''
+///     path.rootPrefix('/path/to/foo'); // -> '/'
+///
+///     // Windows
+///     path.rootPrefix(r'path\to\foo'); // -> ''
+///     path.rootPrefix(r'C:\path\to\foo'); // -> r'C:\'
+///
+///     // URL
+///     path.rootPrefix('path/to/foo'); // -> ''
+///     path.rootPrefix('http://dartlang.org/path/to/foo');
+///       // -> 'http://dartlang.org'
+String rootPrefix(String path) => context.rootPrefix(path);
+
+/// Returns `true` if [path] is an absolute path and `false` if it is a
+/// relative path.
+///
+/// On POSIX systems, absolute paths start with a `/` (forward slash). On
+/// Windows, an absolute path starts with `\\`, or a drive letter followed by
+/// `:/` or `:\`. For URLs, absolute paths either start with a protocol and
+/// optional hostname (e.g. `http://dartlang.org`, `file://`) or with a `/`.
+///
+/// URLs that start with `/` are known as "root-relative", since they're
+/// relative to the root of the current URL. Since root-relative paths are still
+/// absolute in every other sense, [isAbsolute] will return true for them. They
+/// can be detected using [isRootRelative].
+bool isAbsolute(String path) => context.isAbsolute(path);
+
+/// Returns `true` if [path] is a relative path and `false` if it is absolute.
+/// On POSIX systems, absolute paths start with a `/` (forward slash). On
+/// Windows, an absolute path starts with `\\`, or a drive letter followed by
+/// `:/` or `:\`.
+bool isRelative(String path) => context.isRelative(path);
+
+/// Returns `true` if [path] is a root-relative path and `false` if it's not.
+///
+/// URLs that start with `/` are known as "root-relative", since they're
+/// relative to the root of the current URL. Since root-relative paths are still
+/// absolute in every other sense, [isAbsolute] will return true for them. They
+/// can be detected using [isRootRelative].
+///
+/// No POSIX and Windows paths are root-relative.
+bool isRootRelative(String path) => context.isRootRelative(path);
+
+/// Joins the given path parts into a single path using the current platform's
+/// [separator]. Example:
+///
+///     path.join('path', 'to', 'foo'); // -> 'path/to/foo'
+///
+/// If any part ends in a path separator, then a redundant separator will not
+/// be added:
+///
+///     path.join('path/', 'to', 'foo'); // -> 'path/to/foo
+///
+/// If a part is an absolute path, then anything before that will be ignored:
+///
+///     path.join('path', '/to', 'foo'); // -> '/to/foo'
+String join(String part1, [String part2, String part3, String part4,
+    String part5, String part6, String part7, String part8]) =>
+        context.join(part1, part2, part3, part4, part5, part6, part7, part8);
+
+/// Joins the given path parts into a single path using the current platform's
+/// [separator]. Example:
+///
+///     path.joinAll(['path', 'to', 'foo']); // -> 'path/to/foo'
+///
+/// If any part ends in a path separator, then a redundant separator will not
+/// be added:
+///
+///     path.joinAll(['path/', 'to', 'foo']); // -> 'path/to/foo
+///
+/// If a part is an absolute path, then anything before that will be ignored:
+///
+///     path.joinAll(['path', '/to', 'foo']); // -> '/to/foo'
+///
+/// For a fixed number of parts, [join] is usually terser.
+String joinAll(Iterable<String> parts) => context.joinAll(parts);
+
+// TODO(nweiz): add a UNC example for Windows once issue 7323 is fixed.
+/// Splits [path] into its components using the current platform's [separator].
+///
+///     path.split('path/to/foo'); // -> ['path', 'to', 'foo']
+///
+/// The path will *not* be normalized before splitting.
+///
+///     path.split('path/../foo'); // -> ['path', '..', 'foo']
+///
+/// If [path] is absolute, the root directory will be the first element in the
+/// array. Example:
+///
+///     // Unix
+///     path.split('/path/to/foo'); // -> ['/', 'path', 'to', 'foo']
+///
+///     // Windows
+///     path.split(r'C:\path\to\foo'); // -> [r'C:\', 'path', 'to', 'foo']
+///
+///     // Browser
+///     path.split('http://dartlang.org/path/to/foo');
+///       // -> ['http://dartlang.org', 'path', 'to', 'foo']
+List<String> split(String path) => context.split(path);
+
+/// Normalizes [path], simplifying it by handling `..`, and `.`, and
+/// removing redundant path separators whenever possible.
+///
+///     path.normalize('path/./to/..//file.text'); // -> 'path/file.txt'
+String normalize(String path) => context.normalize(path);
+
+/// Attempts to convert [path] to an equivalent relative path from the current
+/// directory.
+///
+///     // Given current directory is /root/path:
+///     path.relative('/root/path/a/b.dart'); // -> 'a/b.dart'
+///     path.relative('/root/other.dart'); // -> '../other.dart'
+///
+/// If the [from] argument is passed, [path] is made relative to that instead.
+///
+///     path.relative('/root/path/a/b.dart',
+///         from: '/root/path'); // -> 'a/b.dart'
+///     path.relative('/root/other.dart',
+///         from: '/root/path'); // -> '../other.dart'
+///
+/// If [path] and/or [from] are relative paths, they are assumed to be relative
+/// to the current directory.
+///
+/// Since there is no relative path from one drive letter to another on Windows,
+/// or from one hostname to another for URLs, this will return an absolute path
+/// in those cases.
+///
+///     // Windows
+///     path.relative(r'D:\other', from: r'C:\home'); // -> 'D:\other'
+///
+///     // URL
+///     path.relative('http://dartlang.org', from: 'http://pub.dartlang.org');
+///       // -> 'http://dartlang.org'
+String relative(String path, {String from}) =>
+    context.relative(path, from: from);
+
+/// Returns `true` if [child] is a path beneath `parent`, and `false` otherwise.
+///
+///     path.isWithin('/root/path', '/root/path/a'); // -> true
+///     path.isWithin('/root/path', '/root/other'); // -> false
+///     path.isWithin('/root/path', '/root/path') // -> false
+bool isWithin(String parent, String child) => context.isWithin(parent, child);
+
+/// Removes a trailing extension from the last part of [path].
+///
+///     withoutExtension('path/to/foo.dart'); // -> 'path/to/foo'
+String withoutExtension(String path) => context.withoutExtension(path);
+
+/// Returns the path represented by [uri], which may be a [String] or a [Uri].
+///
+/// For POSIX and Windows styles, [uri] must be a `file:` URI. For the URL
+/// style, this will just convert [uri] to a string.
+///
+///     // POSIX
+///     context.fromUri('file:///path/to/foo')
+///       // -> '/path/to/foo'
+///
+///     // Windows
+///     context.fromUri('file:///C:/path/to/foo')
+///       // -> r'C:\path\to\foo'
+///
+///     // URL
+///     context.fromUri('http://dartlang.org/path/to/foo')
+///       // -> 'http://dartlang.org/path/to/foo'
+///
+/// If [uri] is relative, a relative path will be returned.
+///
+///     path.fromUri('path/to/foo'); // -> 'path/to/foo'
+String fromUri(uri) => context.fromUri(uri);
+
+/// Returns the URI that represents [path].
+///
+/// For POSIX and Windows styles, this will return a `file:` URI. For the URL
+/// style, this will just convert [path] to a [Uri].
+///
+///     // POSIX
+///     path.toUri('/path/to/foo')
+///       // -> Uri.parse('file:///path/to/foo')
+///
+///     // Windows
+///     path.toUri(r'C:\path\to\foo')
+///       // -> Uri.parse('file:///C:/path/to/foo')
+///
+///     // URL
+///     path.toUri('http://dartlang.org/path/to/foo')
+///       // -> Uri.parse('http://dartlang.org/path/to/foo')
+///
+/// If [path] is relative, a relative URI will be returned.
+///
+///     path.toUri('path/to/foo')
+///       // -> Uri.parse('path/to/foo')
+Uri toUri(String path) => context.toUri(path);
+
+/// Returns a terse, human-readable representation of [uri].
+///
+/// [uri] can be a [String] or a [Uri]. If it can be made relative to the
+/// current working directory, that's done. Otherwise, it's returned as-is. This
+/// gracefully handles non-`file:` URIs for [Style.posix] and [Style.windows].
+///
+/// The returned value is meant for human consumption, and may be either URI-
+/// or path-formatted.
+///
+///     // POSIX at "/root/path"
+///     path.prettyUri('file:///root/path/a/b.dart'); // -> 'a/b.dart'
+///     path.prettyUri('http://dartlang.org/'); // -> 'http://dartlang.org'
+///
+///     // Windows at "C:\root\path"
+///     path.prettyUri('file:///C:/root/path/a/b.dart'); // -> r'a\b.dart'
+///     path.prettyUri('http://dartlang.org/'); // -> 'http://dartlang.org'
+///
+///     // URL at "http://dartlang.org/root/path"
+///     path.prettyUri('http://dartlang.org/root/path/a/b.dart');
+///         // -> r'a/b.dart'
+///     path.prettyUri('file:///root/path'); // -> 'file:///root/path'
+String prettyUri(uri) => context.prettyUri(uri);
diff --git a/mojo/public/dart/third_party/path/lib/src/characters.dart b/mojo/public/dart/third_party/path/lib/src/characters.dart
new file mode 100644
index 0000000..ff196a6
--- /dev/null
+++ b/mojo/public/dart/third_party/path/lib/src/characters.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// This library contains character-code definitions.
+library path.characters;
+
+const PLUS = 0x2b;
+const MINUS = 0x2d;
+const PERIOD = 0x2e;
+const SLASH = 0x2f;
+const ZERO = 0x30;
+const NINE = 0x39;
+const COLON = 0x3a;
+const UPPER_A = 0x41;
+const UPPER_Z = 0x5a;
+const LOWER_A = 0x61;
+const LOWER_Z = 0x7a;
+const BACKSLASH = 0x5c;
diff --git a/mojo/public/dart/third_party/path/lib/src/context.dart b/mojo/public/dart/third_party/path/lib/src/context.dart
new file mode 100644
index 0000000..db055a1
--- /dev/null
+++ b/mojo/public/dart/third_party/path/lib/src/context.dart
@@ -0,0 +1,574 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library path.context;
+
+import 'internal_style.dart';
+import 'style.dart';
+import 'parsed_path.dart';
+import 'path_exception.dart';
+import '../path.dart' as p;
+
+Context createInternal() => new Context._internal();
+
+/// An instantiable class for manipulating paths. Unlike the top-level
+/// functions, this lets you explicitly select what platform the paths will use.
+class Context {
+  /// Creates a new path context for the given style and current directory.
+  ///
+  /// If [style] is omitted, it uses the host operating system's path style. If
+  /// only [current] is omitted, it defaults ".". If *both* [style] and
+  /// [current] are omitted, [current] defaults to the real current working
+  /// directory.
+  ///
+  /// On the browser, [style] defaults to [Style.url] and [current] defaults to
+  /// the current URL.
+  factory Context({Style style, String current}) {
+    if (current == null) {
+      if (style == null) {
+        current = p.current;
+      } else {
+        current = ".";
+      }
+    }
+
+    if (style == null) {
+      style = Style.platform;
+    } else if (style is! InternalStyle) {
+      throw new ArgumentError("Only styles defined by the path package are "
+          "allowed.");
+    }
+
+    return new Context._(style as InternalStyle, current);
+  }
+
+  /// Create a [Context] to be used internally within path.
+  Context._internal()
+      : style = Style.platform as InternalStyle,
+        _current = null;
+
+  Context._(this.style, this._current);
+
+  /// The style of path that this context works with.
+  final InternalStyle style;
+
+  /// The current directory given when Context was created. If null, current
+  /// directory is evaluated from 'p.current'.
+  final String _current;
+
+  /// The current directory that relative paths are relative to.
+  String get current => _current != null ? _current : p.current;
+
+  /// Gets the path separator for the context's [style]. On Mac and Linux,
+  /// this is `/`. On Windows, it's `\`.
+  String get separator => style.separator;
+
+  /// Creates a new path by appending the given path parts to [current].
+  /// Equivalent to [join()] with [current] as the first argument. Example:
+  ///
+  ///     var context = new Context(current: '/root');
+  ///     context.absolute('path', 'to', 'foo'); // -> '/root/path/to/foo'
+  ///
+  /// If [current] isn't absolute, this won't return an absolute path.
+  String absolute(String part1, [String part2, String part3, String part4,
+      String part5, String part6, String part7]) {
+    return join(current, part1, part2, part3, part4, part5, part6, part7);
+  }
+
+  /// Gets the part of [path] after the last separator on the context's
+  /// platform.
+  ///
+  ///     context.basename('path/to/foo.dart'); // -> 'foo.dart'
+  ///     context.basename('path/to');          // -> 'to'
+  ///
+  /// Trailing separators are ignored.
+  ///
+  ///     context.basename('path/to/'); // -> 'to'
+  String basename(String path) => _parse(path).basename;
+
+  /// Gets the part of [path] after the last separator on the context's
+  /// platform, and without any trailing file extension.
+  ///
+  ///     context.basenameWithoutExtension('path/to/foo.dart'); // -> 'foo'
+  ///
+  /// Trailing separators are ignored.
+  ///
+  ///     context.basenameWithoutExtension('path/to/foo.dart/'); // -> 'foo'
+  String basenameWithoutExtension(String path) =>
+      _parse(path).basenameWithoutExtension;
+
+  /// Gets the part of [path] before the last separator.
+  ///
+  ///     context.dirname('path/to/foo.dart'); // -> 'path/to'
+  ///     context.dirname('path/to');          // -> 'path'
+  ///
+  /// Trailing separators are ignored.
+  ///
+  ///     context.dirname('path/to/'); // -> 'path'
+  String dirname(String path) {
+    var parsed = _parse(path);
+    parsed.removeTrailingSeparators();
+    if (parsed.parts.isEmpty) return parsed.root == null ? '.' : parsed.root;
+    if (parsed.parts.length == 1) {
+      return parsed.root == null ? '.' : parsed.root;
+    }
+    parsed.parts.removeLast();
+    parsed.separators.removeLast();
+    parsed.removeTrailingSeparators();
+    return parsed.toString();
+  }
+
+  /// Gets the file extension of [path]: the portion of [basename] from the last
+  /// `.` to the end (including the `.` itself).
+  ///
+  ///     context.extension('path/to/foo.dart'); // -> '.dart'
+  ///     context.extension('path/to/foo'); // -> ''
+  ///     context.extension('path.to/foo'); // -> ''
+  ///     context.extension('path/to/foo.dart.js'); // -> '.js'
+  ///
+  /// If the file name starts with a `.`, then it is not considered an
+  /// extension:
+  ///
+  ///     context.extension('~/.bashrc');    // -> ''
+  ///     context.extension('~/.notes.txt'); // -> '.txt'
+  String extension(String path) => _parse(path).extension;
+
+  // TODO(nweiz): add a UNC example for Windows once issue 7323 is fixed.
+  /// Returns the root of [path] if it's absolute, or an empty string if it's
+  /// relative.
+  ///
+  ///     // Unix
+  ///     context.rootPrefix('path/to/foo'); // -> ''
+  ///     context.rootPrefix('/path/to/foo'); // -> '/'
+  ///
+  ///     // Windows
+  ///     context.rootPrefix(r'path\to\foo'); // -> ''
+  ///     context.rootPrefix(r'C:\path\to\foo'); // -> r'C:\'
+  ///
+  ///     // URL
+  ///     context.rootPrefix('path/to/foo'); // -> ''
+  ///     context.rootPrefix('http://dartlang.org/path/to/foo');
+  ///       // -> 'http://dartlang.org'
+  String rootPrefix(String path) => path.substring(0, style.rootLength(path));
+
+  /// Returns `true` if [path] is an absolute path and `false` if it is a
+  /// relative path.
+  ///
+  /// On POSIX systems, absolute paths start with a `/` (forward slash). On
+  /// Windows, an absolute path starts with `\\`, or a drive letter followed by
+  /// `:/` or `:\`. For URLs, absolute paths either start with a protocol and
+  /// optional hostname (e.g. `http://dartlang.org`, `file://`) or with a `/`.
+  ///
+  /// URLs that start with `/` are known as "root-relative", since they're
+  /// relative to the root of the current URL. Since root-relative paths are
+  /// still absolute in every other sense, [isAbsolute] will return true for
+  /// them. They can be detected using [isRootRelative].
+  bool isAbsolute(String path) => style.rootLength(path) > 0;
+
+  /// Returns `true` if [path] is a relative path and `false` if it is absolute.
+  /// On POSIX systems, absolute paths start with a `/` (forward slash). On
+  /// Windows, an absolute path starts with `\\`, or a drive letter followed by
+  /// `:/` or `:\`.
+  bool isRelative(String path) => !this.isAbsolute(path);
+
+  /// Returns `true` if [path] is a root-relative path and `false` if it's not.
+  ///
+  /// URLs that start with `/` are known as "root-relative", since they're
+  /// relative to the root of the current URL. Since root-relative paths are
+  /// still absolute in every other sense, [isAbsolute] will return true for
+  /// them. They can be detected using [isRootRelative].
+  ///
+  /// No POSIX and Windows paths are root-relative.
+  bool isRootRelative(String path) => style.isRootRelative(path);
+
+  /// Joins the given path parts into a single path. Example:
+  ///
+  ///     context.join('path', 'to', 'foo'); // -> 'path/to/foo'
+  ///
+  /// If any part ends in a path separator, then a redundant separator will not
+  /// be added:
+  ///
+  ///     context.join('path/', 'to', 'foo'); // -> 'path/to/foo
+  ///
+  /// If a part is an absolute path, then anything before that will be ignored:
+  ///
+  ///     context.join('path', '/to', 'foo'); // -> '/to/foo'
+  ///
+  String join(String part1, [String part2, String part3, String part4,
+      String part5, String part6, String part7, String part8]) {
+    var parts = <String>[
+      part1,
+      part2,
+      part3,
+      part4,
+      part5,
+      part6,
+      part7,
+      part8
+    ];
+    _validateArgList("join", parts);
+    return joinAll(parts.where((part) => part != null));
+  }
+
+  /// Joins the given path parts into a single path. Example:
+  ///
+  ///     context.joinAll(['path', 'to', 'foo']); // -> 'path/to/foo'
+  ///
+  /// If any part ends in a path separator, then a redundant separator will not
+  /// be added:
+  ///
+  ///     context.joinAll(['path/', 'to', 'foo']); // -> 'path/to/foo
+  ///
+  /// If a part is an absolute path, then anything before that will be ignored:
+  ///
+  ///     context.joinAll(['path', '/to', 'foo']); // -> '/to/foo'
+  ///
+  /// For a fixed number of parts, [join] is usually terser.
+  String joinAll(Iterable<String> parts) {
+    var buffer = new StringBuffer();
+    var needsSeparator = false;
+    var isAbsoluteAndNotRootRelative = false;
+
+    for (var part in parts.where((part) => part != '')) {
+      if (this.isRootRelative(part) && isAbsoluteAndNotRootRelative) {
+        // If the new part is root-relative, it preserves the previous root but
+        // replaces the path after it.
+        var parsed = _parse(part);
+        parsed.root = this.rootPrefix(buffer.toString());
+        if (style.needsSeparator(parsed.root)) {
+          parsed.separators[0] = style.separator;
+        }
+        buffer.clear();
+        buffer.write(parsed.toString());
+      } else if (this.isAbsolute(part)) {
+        isAbsoluteAndNotRootRelative = !this.isRootRelative(part);
+        // An absolute path discards everything before it.
+        buffer.clear();
+        buffer.write(part);
+      } else {
+        if (part.length > 0 && style.containsSeparator(part[0])) {
+          // The part starts with a separator, so we don't need to add one.
+        } else if (needsSeparator) {
+          buffer.write(separator);
+        }
+
+        buffer.write(part);
+      }
+
+      // Unless this part ends with a separator, we'll need to add one before
+      // the next part.
+      needsSeparator = style.needsSeparator(part);
+    }
+
+    return buffer.toString();
+  }
+
+  // TODO(nweiz): add a UNC example for Windows once issue 7323 is fixed.
+  /// Splits [path] into its components using the current platform's
+  /// [separator]. Example:
+  ///
+  ///     context.split('path/to/foo'); // -> ['path', 'to', 'foo']
+  ///
+  /// The path will *not* be normalized before splitting.
+  ///
+  ///     context.split('path/../foo'); // -> ['path', '..', 'foo']
+  ///
+  /// If [path] is absolute, the root directory will be the first element in the
+  /// array. Example:
+  ///
+  ///     // Unix
+  ///     context.split('/path/to/foo'); // -> ['/', 'path', 'to', 'foo']
+  ///
+  ///     // Windows
+  ///     context.split(r'C:\path\to\foo'); // -> [r'C:\', 'path', 'to', 'foo']
+  List<String> split(String path) {
+    var parsed = _parse(path);
+    // Filter out empty parts that exist due to multiple separators in a row.
+    parsed.parts = parsed.parts.where((part) => !part.isEmpty).toList();
+    if (parsed.root != null) parsed.parts.insert(0, parsed.root);
+    return parsed.parts;
+  }
+
+  /// Normalizes [path], simplifying it by handling `..`, and `.`, and
+  /// removing redundant path separators whenever possible.
+  ///
+  ///     context.normalize('path/./to/..//file.text'); // -> 'path/file.txt'
+  String normalize(String path) {
+    var parsed = _parse(path);
+    parsed.normalize();
+    return parsed.toString();
+  }
+
+  /// Attempts to convert [path] to an equivalent relative path relative to
+  /// [root].
+  ///
+  ///     var context = new Context(current: '/root/path');
+  ///     context.relative('/root/path/a/b.dart'); // -> 'a/b.dart'
+  ///     context.relative('/root/other.dart'); // -> '../other.dart'
+  ///
+  /// If the [from] argument is passed, [path] is made relative to that instead.
+  ///
+  ///     context.relative('/root/path/a/b.dart',
+  ///         from: '/root/path'); // -> 'a/b.dart'
+  ///     context.relative('/root/other.dart',
+  ///         from: '/root/path'); // -> '../other.dart'
+  ///
+  /// If [path] and/or [from] are relative paths, they are assumed to be
+  /// relative to [current].
+  ///
+  /// Since there is no relative path from one drive letter to another on
+  /// Windows, this will return an absolute path in that case.
+  ///
+  ///     context.relative(r'D:\other', from: r'C:\other'); // -> 'D:\other'
+  ///
+  /// This will also return an absolute path if an absolute [path] is passed to
+  /// a context with a relative path for [current].
+  ///
+  ///     var context = new Context(r'some/relative/path');
+  ///     context.relative(r'/absolute/path'); // -> '/absolute/path'
+  ///
+  /// If [root] is relative, it may be impossible to determine a path from
+  /// [from] to [path]. For example, if [root] and [path] are "." and [from] is
+  /// "/", no path can be determined. In this case, a [PathException] will be
+  /// thrown.
+  String relative(String path, {String from}) {
+    // Avoid calling [current] since it is slow and calling join() when
+    // [from] is absolute does nothing.
+    if (from == null) {
+      from = current;
+    } else if (this.isRelative(from) || this.isRootRelative(from)) {
+      from = this.join(current, from);
+    }
+
+    // We can't determine the path from a relative path to an absolute path.
+    if (this.isRelative(from) && this.isAbsolute(path)) {
+      return this.normalize(path);
+    }
+
+    // If the given path is relative, resolve it relative to the context's
+    // current directory.
+    if (this.isRelative(path) || this.isRootRelative(path)) {
+      path = this.absolute(path);
+    }
+
+    // If the path is still relative and `from` is absolute, we're unable to
+    // find a path from `from` to `path`.
+    if (this.isRelative(path) && this.isAbsolute(from)) {
+      throw new PathException('Unable to find a path to "$path" from "$from".');
+    }
+
+    var fromParsed = _parse(from)..normalize();
+    var pathParsed = _parse(path)..normalize();
+
+    if (fromParsed.parts.length > 0 && fromParsed.parts[0] == '.') {
+      return pathParsed.toString();
+    }
+
+    // If the root prefixes don't match (for example, different drive letters
+    // on Windows), then there is no relative path, so just return the absolute
+    // one. In Windows, drive letters are case-insenstive and we allow
+    // calculation of relative paths, even if a path has not been normalized.
+    if (fromParsed.root != pathParsed.root &&
+        ((fromParsed.root == null || pathParsed.root == null) ||
+            fromParsed.root.toLowerCase().replaceAll('/', '\\') !=
+                pathParsed.root.toLowerCase().replaceAll('/', '\\'))) {
+      return pathParsed.toString();
+    }
+
+    // Strip off their common prefix.
+    while (fromParsed.parts.length > 0 &&
+        pathParsed.parts.length > 0 &&
+        fromParsed.parts[0] == pathParsed.parts[0]) {
+      fromParsed.parts.removeAt(0);
+      fromParsed.separators.removeAt(1);
+      pathParsed.parts.removeAt(0);
+      pathParsed.separators.removeAt(1);
+    }
+
+    // If there are any directories left in the from path, we need to walk up
+    // out of them. If a directory left in the from path is '..', it cannot
+    // be cancelled by adding a '..'.
+    if (fromParsed.parts.length > 0 && fromParsed.parts[0] == '..') {
+      throw new PathException('Unable to find a path to "$path" from "$from".');
+    }
+    pathParsed.parts.insertAll(
+        0, new List.filled(fromParsed.parts.length, '..'));
+    pathParsed.separators[0] = '';
+    pathParsed.separators.insertAll(
+        1, new List.filled(fromParsed.parts.length, style.separator));
+
+    // Corner case: the paths completely collapsed.
+    if (pathParsed.parts.length == 0) return '.';
+
+    // Corner case: path was '.' and some '..' directories were added in front.
+    // Don't add a final '/.' in that case.
+    if (pathParsed.parts.length > 1 && pathParsed.parts.last == '.') {
+      pathParsed.parts.removeLast();
+      pathParsed.separators
+        ..removeLast()
+        ..removeLast()
+        ..add('');
+    }
+
+    // Make it relative.
+    pathParsed.root = '';
+    pathParsed.removeTrailingSeparators();
+
+    return pathParsed.toString();
+  }
+
+  /// Returns `true` if [child] is a path beneath `parent`, and `false`
+  /// otherwise.
+  ///
+  ///     path.isWithin('/root/path', '/root/path/a'); // -> true
+  ///     path.isWithin('/root/path', '/root/other'); // -> false
+  ///     path.isWithin('/root/path', '/root/path'); // -> false
+  bool isWithin(String parent, String child) {
+    var relative;
+    try {
+      relative = this.relative(child, from: parent);
+    } on PathException catch (_) {
+      // If no relative path from [parent] to [child] is found, [child]
+      // definitely isn't a child of [parent].
+      return false;
+    }
+
+    var parts = this.split(relative);
+    return this.isRelative(relative) &&
+        parts.first != '..' &&
+        parts.first != '.';
+  }
+
+  /// Removes a trailing extension from the last part of [path].
+  ///
+  ///     context.withoutExtension('path/to/foo.dart'); // -> 'path/to/foo'
+  String withoutExtension(String path) {
+    var parsed = _parse(path);
+
+    for (var i = parsed.parts.length - 1; i >= 0; i--) {
+      if (!parsed.parts[i].isEmpty) {
+        parsed.parts[i] = parsed.basenameWithoutExtension;
+        break;
+      }
+    }
+
+    return parsed.toString();
+  }
+
+  /// Returns the path represented by [uri], which may be a [String] or a [Uri].
+  ///
+  /// For POSIX and Windows styles, [uri] must be a `file:` URI. For the URL
+  /// style, this will just convert [uri] to a string.
+  ///
+  ///     // POSIX
+  ///     context.fromUri('file:///path/to/foo')
+  ///       // -> '/path/to/foo'
+  ///
+  ///     // Windows
+  ///     context.fromUri('file:///C:/path/to/foo')
+  ///       // -> r'C:\path\to\foo'
+  ///
+  ///     // URL
+  ///     context.fromUri('http://dartlang.org/path/to/foo')
+  ///       // -> 'http://dartlang.org/path/to/foo'
+  ///
+  /// If [uri] is relative, a relative path will be returned.
+  ///
+  ///     path.fromUri('path/to/foo'); // -> 'path/to/foo'
+  String fromUri(uri) {
+    if (uri is String) uri = Uri.parse(uri);
+    return style.pathFromUri(uri);
+  }
+
+  /// Returns the URI that represents [path].
+  ///
+  /// For POSIX and Windows styles, this will return a `file:` URI. For the URL
+  /// style, this will just convert [path] to a [Uri].
+  ///
+  ///     // POSIX
+  ///     context.toUri('/path/to/foo')
+  ///       // -> Uri.parse('file:///path/to/foo')
+  ///
+  ///     // Windows
+  ///     context.toUri(r'C:\path\to\foo')
+  ///       // -> Uri.parse('file:///C:/path/to/foo')
+  ///
+  ///     // URL
+  ///     context.toUri('http://dartlang.org/path/to/foo')
+  ///       // -> Uri.parse('http://dartlang.org/path/to/foo')
+  Uri toUri(String path) {
+    if (isRelative(path)) {
+      return style.relativePathToUri(path);
+    } else {
+      return style.absolutePathToUri(join(current, path));
+    }
+  }
+
+  /// Returns a terse, human-readable representation of [uri].
+  ///
+  /// [uri] can be a [String] or a [Uri]. If it can be made relative to the
+  /// current working directory, that's done. Otherwise, it's returned as-is.
+  /// This gracefully handles non-`file:` URIs for [Style.posix] and
+  /// [Style.windows].
+  ///
+  /// The returned value is meant for human consumption, and may be either URI-
+  /// or path-formatted.
+  ///
+  ///     // POSIX
+  ///     var context = new Context(current: '/root/path');
+  ///     context.prettyUri('file:///root/path/a/b.dart'); // -> 'a/b.dart'
+  ///     context.prettyUri('http://dartlang.org/'); // -> 'http://dartlang.org'
+  ///
+  ///     // Windows
+  ///     var context = new Context(current: r'C:\root\path');
+  ///     context.prettyUri('file:///C:/root/path/a/b.dart'); // -> r'a\b.dart'
+  ///     context.prettyUri('http://dartlang.org/'); // -> 'http://dartlang.org'
+  ///
+  ///     // URL
+  ///     var context = new Context(current: 'http://dartlang.org/root/path');
+  ///     context.prettyUri('http://dartlang.org/root/path/a/b.dart');
+  ///         // -> r'a/b.dart'
+  ///     context.prettyUri('file:///root/path'); // -> 'file:///root/path'
+  String prettyUri(uri) {
+    if (uri is String) uri = Uri.parse(uri);
+    if (uri.scheme == 'file' && style == Style.url) return uri.toString();
+    if (uri.scheme != 'file' && uri.scheme != '' && style != Style.url) {
+      return uri.toString();
+    }
+
+    var path = normalize(fromUri(uri));
+    var rel = relative(path);
+
+    // Only return a relative path if it's actually shorter than the absolute
+    // path. This avoids ugly things like long "../" chains to get to the root
+    // and then go back down.
+    return split(rel).length > split(path).length ? path : rel;
+  }
+
+  ParsedPath _parse(String path) => new ParsedPath.parse(path, style);
+}
+
+/// Validates that there are no non-null arguments following a null one and
+/// throws an appropriate [ArgumentError] on failure.
+_validateArgList(String method, List<String> args) {
+  for (var i = 1; i < args.length; i++) {
+    // Ignore nulls hanging off the end.
+    if (args[i] == null || args[i - 1] != null) continue;
+
+    var numArgs;
+    for (numArgs = args.length; numArgs >= 1; numArgs--) {
+      if (args[numArgs - 1] != null) break;
+    }
+
+    // Show the arguments.
+    var message = new StringBuffer();
+    message.write("$method(");
+    message.write(args
+        .take(numArgs)
+        .map((arg) => arg == null ? "null" : '"$arg"')
+        .join(", "));
+    message.write("): part ${i - 1} was null, but part $i was not.");
+    throw new ArgumentError(message.toString());
+  }
+}
diff --git a/mojo/public/dart/third_party/path/lib/src/internal_style.dart b/mojo/public/dart/third_party/path/lib/src/internal_style.dart
new file mode 100644
index 0000000..549f95b
--- /dev/null
+++ b/mojo/public/dart/third_party/path/lib/src/internal_style.dart
@@ -0,0 +1,71 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library path.internal_style;
+
+import 'context.dart';
+import 'style.dart';
+
+/// The internal interface for the [Style] type.
+///
+/// Users should be able to pass around instances of [Style] like an enum, but
+/// the members that [Context] uses should be hidden from them. Those members
+/// are defined on this class instead.
+abstract class InternalStyle extends Style {
+  /// The default path separator for this style.
+  ///
+  /// On POSIX, this is `/`. On Windows, it's `\`.
+  String get separator;
+
+  /// Returns whether [path] contains a separator.
+  bool containsSeparator(String path);
+
+  /// Returns whether [codeUnit] is the character code of a separator.
+  bool isSeparator(int codeUnit);
+
+  /// Returns whether this path component needs a separator after it.
+  ///
+  /// Windows and POSIX styles just need separators when the previous component
+  /// doesn't already end in a separator, but the URL always needs to place a
+  /// separator between the root and the first component, even if the root
+  /// already ends in a separator character. For example, to join "file://" and
+  /// "usr", an additional "/" is needed (making "file:///usr").
+  bool needsSeparator(String path);
+
+  /// Returns the number of characters of the root part.
+  ///
+  /// Returns 0 if the path is relative.
+  ///
+  /// If the path is root-relative, the root length is 1.
+  int rootLength(String path);
+
+  /// Gets the root prefix of [path] if path is absolute. If [path] is relative,
+  /// returns `null`.
+  String getRoot(String path) {
+    var length = rootLength(path);
+    if (length > 0) return path.substring(0, length);
+    return isRootRelative(path) ? path[0] : null;
+  }
+
+  /// Returns whether [path] is root-relative.
+  ///
+  /// If [path] is relative or absolute and not root-relative, returns `false`.
+  bool isRootRelative(String path);
+
+  /// Returns the path represented by [uri] in this style.
+  String pathFromUri(Uri uri);
+
+  /// Returns the URI that represents the relative path made of [parts].
+  Uri relativePathToUri(String path) {
+    var segments = context.split(path);
+
+    // Ensure that a trailing slash in the path produces a trailing slash in the
+    // URL.
+    if (isSeparator(path.codeUnitAt(path.length - 1))) segments.add('');
+    return new Uri(pathSegments: segments);
+  }
+
+  /// Returns the URI that represents [path], which is assumed to be absolute.
+  Uri absolutePathToUri(String path);
+}
diff --git a/mojo/public/dart/third_party/path/lib/src/parsed_path.dart b/mojo/public/dart/third_party/path/lib/src/parsed_path.dart
new file mode 100644
index 0000000..d37e2d3
--- /dev/null
+++ b/mojo/public/dart/third_party/path/lib/src/parsed_path.dart
@@ -0,0 +1,183 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library path.parsed_path;
+
+import 'internal_style.dart';
+import 'style.dart';
+
+class ParsedPath {
+  /// The [InternalStyle] that was used to parse this path.
+  InternalStyle style;
+
+  /// The absolute root portion of the path, or `null` if the path is relative.
+  /// On POSIX systems, this will be `null` or "/". On Windows, it can be
+  /// `null`, "//" for a UNC path, or something like "C:\" for paths with drive
+  /// letters.
+  String root;
+
+  /// Whether this path is root-relative.
+  ///
+  /// See [Context.isRootRelative].
+  bool isRootRelative;
+
+  /// The path-separated parts of the path. All but the last will be
+  /// directories.
+  List<String> parts;
+
+  /// The path separators preceding each part.
+  ///
+  /// The first one will be an empty string unless the root requires a separator
+  /// between it and the path. The last one will be an empty string unless the
+  /// path ends with a trailing separator.
+  List<String> separators;
+
+  /// The file extension of the last non-empty part, or "" if it doesn't have
+  /// one.
+  String get extension => _splitExtension()[1];
+
+  /// `true` if this is an absolute path.
+  bool get isAbsolute => root != null;
+
+  factory ParsedPath.parse(String path, InternalStyle style) {
+    // Remove the root prefix, if any.
+    var root = style.getRoot(path);
+    var isRootRelative = style.isRootRelative(path);
+    if (root != null) path = path.substring(root.length);
+
+    // Split the parts on path separators.
+    var parts = <String>[];
+    var separators = <String>[];
+
+    var start = 0;
+
+    if (path.isNotEmpty && style.isSeparator(path.codeUnitAt(0))) {
+      separators.add(path[0]);
+      start = 1;
+    } else {
+      separators.add('');
+    }
+
+    for (var i = start; i < path.length; i++) {
+      if (style.isSeparator(path.codeUnitAt(i))) {
+        parts.add(path.substring(start, i));
+        separators.add(path[i]);
+        start = i + 1;
+      }
+    }
+
+    // Add the final part, if any.
+    if (start < path.length) {
+      parts.add(path.substring(start));
+      separators.add('');
+    }
+
+    return new ParsedPath._(style, root, isRootRelative, parts, separators);
+  }
+
+  ParsedPath._(
+      this.style, this.root, this.isRootRelative, this.parts, this.separators);
+
+  String get basename {
+    var copy = this.clone();
+    copy.removeTrailingSeparators();
+    if (copy.parts.isEmpty) return root == null ? '' : root;
+    return copy.parts.last;
+  }
+
+  String get basenameWithoutExtension => _splitExtension()[0];
+
+  bool get hasTrailingSeparator =>
+      !parts.isEmpty && (parts.last == '' || separators.last != '');
+
+  void removeTrailingSeparators() {
+    while (!parts.isEmpty && parts.last == '') {
+      parts.removeLast();
+      separators.removeLast();
+    }
+    if (separators.length > 0) separators[separators.length - 1] = '';
+  }
+
+  void normalize() {
+    // Handle '.', '..', and empty parts.
+    var leadingDoubles = 0;
+    var newParts = <String>[];
+    for (var part in parts) {
+      if (part == '.' || part == '') {
+        // Do nothing. Ignore it.
+      } else if (part == '..') {
+        // Pop the last part off.
+        if (newParts.length > 0) {
+          newParts.removeLast();
+        } else {
+          // Backed out past the beginning, so preserve the "..".
+          leadingDoubles++;
+        }
+      } else {
+        newParts.add(part);
+      }
+    }
+
+    // A relative path can back out from the start directory.
+    if (!isAbsolute) {
+      newParts.insertAll(0, new List.filled(leadingDoubles, '..'));
+    }
+
+    // If we collapsed down to nothing, do ".".
+    if (newParts.length == 0 && !isAbsolute) {
+      newParts.add('.');
+    }
+
+    // Canonicalize separators.
+    var newSeparators = new List<String>.generate(
+        newParts.length, (_) => style.separator, growable: true);
+    newSeparators.insert(0, isAbsolute &&
+        newParts.length > 0 &&
+        style.needsSeparator(root) ? style.separator : '');
+
+    parts = newParts;
+    separators = newSeparators;
+
+    // Normalize the Windows root if needed.
+    if (root != null && style == Style.windows) {
+      root = root.replaceAll('/', '\\');
+    }
+    removeTrailingSeparators();
+  }
+
+  String toString() {
+    var builder = new StringBuffer();
+    if (root != null) builder.write(root);
+    for (var i = 0; i < parts.length; i++) {
+      builder.write(separators[i]);
+      builder.write(parts[i]);
+    }
+    builder.write(separators.last);
+
+    return builder.toString();
+  }
+
+  /// Splits the last non-empty part of the path into a `[basename, extension`]
+  /// pair.
+  ///
+  /// Returns a two-element list. The first is the name of the file without any
+  /// extension. The second is the extension or "" if it has none.
+  List<String> _splitExtension() {
+    var file = parts.lastWhere((p) => p != '', orElse: () => null);
+
+    if (file == null) return ['', ''];
+    if (file == '..') return ['..', ''];
+
+    var lastDot = file.lastIndexOf('.');
+
+    // If there is no dot, or it's the first character, like '.bashrc', it
+    // doesn't count.
+    if (lastDot <= 0) return [file, ''];
+
+    return [file.substring(0, lastDot), file.substring(lastDot)];
+  }
+
+  ParsedPath clone() => new ParsedPath._(style, root, isRootRelative,
+      new List.from(parts), new List.from(separators));
+}
diff --git a/mojo/public/dart/third_party/path/lib/src/path_exception.dart b/mojo/public/dart/third_party/path/lib/src/path_exception.dart
new file mode 100644
index 0000000..49bd268
--- /dev/null
+++ b/mojo/public/dart/third_party/path/lib/src/path_exception.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library path.path_exception;
+
+/// An exception class that's thrown when a path operation is unable to be
+/// computed accurately.
+class PathException implements Exception {
+  String message;
+
+  PathException(this.message);
+
+  String toString() => "PathException: $message";
+}
diff --git a/mojo/public/dart/third_party/path/lib/src/style.dart b/mojo/public/dart/third_party/path/lib/src/style.dart
new file mode 100644
index 0000000..e0e0e01
--- /dev/null
+++ b/mojo/public/dart/third_party/path/lib/src/style.dart
@@ -0,0 +1,88 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library path.style;
+
+import 'context.dart';
+import 'style/posix.dart';
+import 'style/url.dart';
+import 'style/windows.dart';
+
+/// An enum type describing a "flavor" of path.
+abstract class Style {
+  /// POSIX-style paths use "/" (forward slash) as separators. Absolute paths
+  /// start with "/". Used by UNIX, Linux, Mac OS X, and others.
+  static final Style posix = new PosixStyle();
+
+  /// Windows paths use "\" (backslash) as separators. Absolute paths start with
+  /// a drive letter followed by a colon (example, "C:") or two backslashes
+  /// ("\\") for UNC paths.
+  // TODO(rnystrom): The UNC root prefix should include the drive name too, not
+  // just the "\\".
+  static final Style windows = new WindowsStyle();
+
+  /// URLs aren't filesystem paths, but they're supported to make it easier to
+  /// manipulate URL paths in the browser.
+  ///
+  /// URLs use "/" (forward slash) as separators. Absolute paths either start
+  /// with a protocol and optional hostname (e.g. `http://dartlang.org`,
+  /// `file://`) or with "/".
+  static final Style url = new UrlStyle();
+
+  /// The style of the host platform.
+  ///
+  /// When running on the command line, this will be [windows] or [posix] based
+  /// on the host operating system. On a browser, this will be [url].
+  static final Style platform = _getPlatformStyle();
+
+  /// Gets the type of the host platform.
+  static Style _getPlatformStyle() {
+    // If we're running a Dart file in the browser from a `file:` URI,
+    // [Uri.base] will point to a file. If we're running on the standalone,
+    // it will point to a directory. We can use that fact to determine which
+    // style to use.
+    if (Uri.base.scheme != 'file') return Style.url;
+    if (!Uri.base.path.endsWith('/')) return Style.url;
+    if (new Uri(path: 'a/b').toFilePath() == 'a\\b') return Style.windows;
+    return Style.posix;
+  }
+
+  /// The name of this path style. Will be "posix" or "windows".
+  String get name;
+
+  /// A [Context] that uses this style.
+  Context get context => new Context(style: this);
+
+  @Deprecated("Most Style members will be removed in path 2.0.")
+  String get separator;
+
+  @Deprecated("Most Style members will be removed in path 2.0.")
+  Pattern get separatorPattern;
+
+  @Deprecated("Most Style members will be removed in path 2.0.")
+  Pattern get needsSeparatorPattern;
+
+  @Deprecated("Most Style members will be removed in path 2.0.")
+  Pattern get rootPattern;
+
+  @Deprecated("Most Style members will be removed in path 2.0.")
+  Pattern get relativeRootPattern;
+
+  @Deprecated("Most style members will be removed in path 2.0.")
+  String getRoot(String path);
+
+  @Deprecated("Most style members will be removed in path 2.0.")
+  String getRelativeRoot(String path);
+
+  @Deprecated("Most style members will be removed in path 2.0.")
+  String pathFromUri(Uri uri);
+
+  @Deprecated("Most style members will be removed in path 2.0.")
+  Uri relativePathToUri(String path);
+
+  @Deprecated("Most style members will be removed in path 2.0.")
+  Uri absolutePathToUri(String path);
+
+  String toString() => name;
+}
diff --git a/mojo/public/dart/third_party/path/lib/src/style/posix.dart b/mojo/public/dart/third_party/path/lib/src/style/posix.dart
new file mode 100644
index 0000000..74aeb4c
--- /dev/null
+++ b/mojo/public/dart/third_party/path/lib/src/style/posix.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library path.style.posix;
+
+import '../characters.dart' as chars;
+import '../parsed_path.dart';
+import '../internal_style.dart';
+
+/// The style for POSIX paths.
+class PosixStyle extends InternalStyle {
+  PosixStyle();
+
+  final name = 'posix';
+  final separator = '/';
+  final separators = const ['/'];
+
+  // Deprecated properties.
+
+  final separatorPattern = new RegExp(r'/');
+  final needsSeparatorPattern = new RegExp(r'[^/]$');
+  final rootPattern = new RegExp(r'^/');
+  final relativeRootPattern = null;
+
+  bool containsSeparator(String path) => path.contains('/');
+
+  bool isSeparator(int codeUnit) => codeUnit == chars.SLASH;
+
+  bool needsSeparator(String path) =>
+      path.isNotEmpty && !isSeparator(path.codeUnitAt(path.length - 1));
+
+  int rootLength(String path) {
+    if (path.isNotEmpty && isSeparator(path.codeUnitAt(0))) return 1;
+    return 0;
+  }
+
+  bool isRootRelative(String path) => false;
+
+  String getRelativeRoot(String path) => null;
+
+  String pathFromUri(Uri uri) {
+    if (uri.scheme == '' || uri.scheme == 'file') {
+      return Uri.decodeComponent(uri.path);
+    }
+    throw new ArgumentError("Uri $uri must have scheme 'file:'.");
+  }
+
+  Uri absolutePathToUri(String path) {
+    var parsed = new ParsedPath.parse(path, this);
+    if (parsed.parts.isEmpty) {
+      // If the path is a bare root (e.g. "/"), [components] will
+      // currently be empty. We add two empty components so the URL constructor
+      // produces "file:///", with a trailing slash.
+      parsed.parts.addAll(["", ""]);
+    } else if (parsed.hasTrailingSeparator) {
+      // If the path has a trailing slash, add a single empty component so the
+      // URI has a trailing slash as well.
+      parsed.parts.add("");
+    }
+
+    return new Uri(scheme: 'file', pathSegments: parsed.parts);
+  }
+}
diff --git a/mojo/public/dart/third_party/path/lib/src/style/url.dart b/mojo/public/dart/third_party/path/lib/src/style/url.dart
new file mode 100644
index 0000000..255f22a
--- /dev/null
+++ b/mojo/public/dart/third_party/path/lib/src/style/url.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library path.style.url;
+
+import '../characters.dart' as chars;
+import '../internal_style.dart';
+
+/// The style for URL paths.
+class UrlStyle extends InternalStyle {
+  UrlStyle();
+
+  final name = 'url';
+  final separator = '/';
+  final separators = const ['/'];
+
+  // Deprecated properties.
+
+  final separatorPattern = new RegExp(r'/');
+  final needsSeparatorPattern =
+      new RegExp(r"(^[a-zA-Z][-+.a-zA-Z\d]*://|[^/])$");
+  final rootPattern = new RegExp(r"[a-zA-Z][-+.a-zA-Z\d]*://[^/]*");
+  final relativeRootPattern = new RegExp(r"^/");
+
+  bool containsSeparator(String path) => path.contains('/');
+
+  bool isSeparator(int codeUnit) => codeUnit == chars.SLASH;
+
+  bool needsSeparator(String path) {
+    if (path.isEmpty) return false;
+
+    // A URL that doesn't end in "/" always needs a separator.
+    if (!isSeparator(path.codeUnitAt(path.length - 1))) return true;
+
+    // A URI that's just "scheme://" needs an extra separator, despite ending
+    // with "/".
+    return path.endsWith("://") && rootLength(path) == path.length;
+  }
+
+  int rootLength(String path) {
+    if (path.isEmpty) return 0;
+    if (isSeparator(path.codeUnitAt(0))) return 1;
+    var index = path.indexOf("/");
+    if (index > 0 && path.startsWith('://', index - 1)) {
+      // The root part is up until the next '/', or the full path. Skip
+      // '://' and search for '/' after that.
+      index = path.indexOf('/', index + 2);
+      if (index > 0) return index;
+      return path.length;
+    }
+    return 0;
+  }
+
+  bool isRootRelative(String path) =>
+      path.isNotEmpty && isSeparator(path.codeUnitAt(0));
+
+  String getRelativeRoot(String path) => isRootRelative(path) ? '/' : null;
+
+  String pathFromUri(Uri uri) => uri.toString();
+
+  Uri relativePathToUri(String path) => Uri.parse(path);
+  Uri absolutePathToUri(String path) => Uri.parse(path);
+}
diff --git a/mojo/public/dart/third_party/path/lib/src/style/windows.dart b/mojo/public/dart/third_party/path/lib/src/style/windows.dart
new file mode 100644
index 0000000..f38efa5
--- /dev/null
+++ b/mojo/public/dart/third_party/path/lib/src/style/windows.dart
@@ -0,0 +1,125 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library path.style.windows;
+
+import '../characters.dart' as chars;
+import '../internal_style.dart';
+import '../parsed_path.dart';
+import '../utils.dart';
+
+/// The style for Windows paths.
+class WindowsStyle extends InternalStyle {
+  WindowsStyle();
+
+  final name = 'windows';
+  final separator = '\\';
+  final separators = const ['/', '\\'];
+
+  // Deprecated properties.
+
+  final separatorPattern = new RegExp(r'[/\\]');
+  final needsSeparatorPattern = new RegExp(r'[^/\\]$');
+  final rootPattern = new RegExp(r'^(\\\\[^\\]+\\[^\\/]+|[a-zA-Z]:[/\\])');
+  final relativeRootPattern = new RegExp(r"^[/\\](?![/\\])");
+
+  bool containsSeparator(String path) => path.contains('/');
+
+  bool isSeparator(int codeUnit) =>
+      codeUnit == chars.SLASH || codeUnit == chars.BACKSLASH;
+
+  bool needsSeparator(String path) {
+    if (path.isEmpty) return false;
+    return !isSeparator(path.codeUnitAt(path.length - 1));
+  }
+
+  int rootLength(String path) {
+    if (path.isEmpty) return 0;
+    if (path.codeUnitAt(0) == chars.SLASH) return 1;
+    if (path.codeUnitAt(0) == chars.BACKSLASH) {
+      if (path.length < 2 || path.codeUnitAt(1) != chars.BACKSLASH) return 1;
+      // The path is a network share. Search for up to two '\'s, as they are
+      // the server and share - and part of the root part.
+      var index = path.indexOf('\\', 2);
+      if (index > 0) {
+        index = path.indexOf('\\', index + 1);
+        if (index > 0) return index;
+      }
+      return path.length;
+    }
+    // If the path is of the form 'C:/' or 'C:\', with C being any letter, it's
+    // a root part.
+    if (path.length < 3) return 0;
+    // Check for the letter.
+    if (!isAlphabetic(path.codeUnitAt(0))) return 0;
+    // Check for the ':'.
+    if (path.codeUnitAt(1) != chars.COLON) return 0;
+    // Check for either '/' or '\'.
+    if (!isSeparator(path.codeUnitAt(2))) return 0;
+    return 3;
+  }
+
+  bool isRootRelative(String path) => rootLength(path) == 1;
+
+  String getRelativeRoot(String path) {
+    var length = rootLength(path);
+    if (length == 1) return path[0];
+    return null;
+  }
+
+  String pathFromUri(Uri uri) {
+    if (uri.scheme != '' && uri.scheme != 'file') {
+      throw new ArgumentError("Uri $uri must have scheme 'file:'.");
+    }
+
+    var path = uri.path;
+    if (uri.host == '') {
+      // Drive-letter paths look like "file:///C:/path/to/file". The
+      // replaceFirst removes the extra initial slash.
+      if (path.startsWith('/')) path = path.replaceFirst("/", "");
+    } else {
+      // Network paths look like "file://hostname/path/to/file".
+      path = '\\\\${uri.host}$path';
+    }
+    return Uri.decodeComponent(path.replaceAll("/", "\\"));
+  }
+
+  Uri absolutePathToUri(String path) {
+    var parsed = new ParsedPath.parse(path, this);
+    if (parsed.root.startsWith(r'\\')) {
+      // Network paths become "file://server/share/path/to/file".
+
+      // The root is of the form "\\server\share". We want "server" to be the
+      // URI host, and "share" to be the first element of the path.
+      var rootParts = parsed.root.split('\\').where((part) => part != '');
+      parsed.parts.insert(0, rootParts.last);
+
+      if (parsed.hasTrailingSeparator) {
+        // If the path has a trailing slash, add a single empty component so the
+        // URI has a trailing slash as well.
+        parsed.parts.add("");
+      }
+
+      return new Uri(
+          scheme: 'file', host: rootParts.first, pathSegments: parsed.parts);
+    } else {
+      // Drive-letter paths become "file:///C:/path/to/file".
+
+      // If the path is a bare root (e.g. "C:\"), [parsed.parts] will currently
+      // be empty. We add an empty component so the URL constructor produces
+      // "file:///C:/", with a trailing slash. We also add an empty component if
+      // the URL otherwise has a trailing slash.
+      if (parsed.parts.length == 0 || parsed.hasTrailingSeparator) {
+        parsed.parts.add("");
+      }
+
+      // Get rid of the trailing "\" in "C:\" because the URI constructor will
+      // add a separator on its own.
+      parsed.parts.insert(
+          0, parsed.root.replaceAll("/", "").replaceAll("\\", ""));
+
+      return new Uri(scheme: 'file', pathSegments: parsed.parts);
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/path/lib/src/utils.dart b/mojo/public/dart/third_party/path/lib/src/utils.dart
new file mode 100644
index 0000000..e320749
--- /dev/null
+++ b/mojo/public/dart/third_party/path/lib/src/utils.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library path.utils;
+
+import 'characters.dart' as chars;
+
+/// Returns whether [char] is the code for an ASCII letter (uppercase or
+/// lowercase).
+bool isAlphabetic(int char) =>
+    (char >= chars.UPPER_A && char <= chars.UPPER_Z) ||
+        (char >= chars.LOWER_A && char <= chars.LOWER_Z);
+
+/// Returns whether [char] is the code for an ASCII digit.
+bool isNumeric(int char) => char >= chars.ZERO && char <= chars.NINE;
diff --git a/mojo/public/dart/third_party/path/pubspec.yaml b/mojo/public/dart/third_party/path/pubspec.yaml
new file mode 100644
index 0000000..6ba3a15
--- /dev/null
+++ b/mojo/public/dart/third_party/path/pubspec.yaml
@@ -0,0 +1,12 @@
+name: path
+version: 1.3.6
+author: Dart Team <misc@dartlang.org>
+description: >
+ A string-based path manipulation library. All of the path operations you know
+ and love, with solid support on both Windows and POSIX (Linux and Mac OS X)
+ machines.
+homepage: http://github.com/dart-lang/path
+dev_dependencies:
+  unittest: ">=0.9.0 <0.12.0"
+environment:
+  sdk: ">=1.0.0 <2.0.0"
diff --git a/mojo/public/dart/third_party/path/test/browser_test.dart b/mojo/public/dart/third_party/path/test/browser_test.dart
new file mode 100644
index 0000000..0b56c7a
--- /dev/null
+++ b/mojo/public/dart/third_party/path/test/browser_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:html';
+
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:path/path.dart' as path;
+
+main() {
+  useHtmlConfiguration();
+
+  group('new Context()', () {
+    test('uses the window location if root and style are omitted', () {
+      var context = new path.Context();
+      expect(context.current,
+          Uri.parse(window.location.href).resolve('.').toString());
+    });
+
+    test('uses "." if root is omitted', () {
+      var context = new path.Context(style: path.Style.platform);
+      expect(context.current, ".");
+    });
+
+    test('uses the host platform if style is omitted', () {
+      var context = new path.Context();
+      expect(context.style, path.Style.platform);
+    });
+  });
+
+  test('Style.platform is url', () {
+    expect(path.Style.platform, path.Style.url);
+  });
+
+  test('current', () {
+    expect(
+        path.current, Uri.parse(window.location.href).resolve('.').toString());
+  });
+}
diff --git a/mojo/public/dart/third_party/path/test/io_test.dart b/mojo/public/dart/third_party/path/test/io_test.dart
new file mode 100644
index 0000000..e855522
--- /dev/null
+++ b/mojo/public/dart/third_party/path/test/io_test.dart
@@ -0,0 +1,56 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io' as io;
+
+import 'package:unittest/unittest.dart';
+import 'package:path/path.dart' as path;
+
+main() {
+  group('new Context()', () {
+    test('uses the current directory if root and style are omitted', () {
+      var context = new path.Context();
+      expect(context.current, io.Directory.current.path);
+    });
+
+    test('uses "." if root is omitted', () {
+      var context = new path.Context(style: path.Style.platform);
+      expect(context.current, ".");
+    });
+
+    test('uses the host platform if style is omitted', () {
+      var context = new path.Context();
+      expect(context.style, path.Style.platform);
+    });
+  });
+
+  test('Style.platform returns the host platform style', () {
+    if (io.Platform.operatingSystem == 'windows') {
+      expect(path.Style.platform, path.Style.windows);
+    } else {
+      expect(path.Style.platform, path.Style.posix);
+    }
+  });
+
+  test('current', () {
+    expect(path.current, io.Directory.current.path);
+  });
+
+  test('registers changes to the working directory', () {
+    var dir = io.Directory.current.path;
+    try {
+      expect(path.absolute('foo/bar'), equals(path.join(dir, 'foo/bar')));
+      expect(
+          path.absolute('foo/bar'), equals(path.context.join(dir, 'foo/bar')));
+
+      io.Directory.current = path.dirname(dir);
+      expect(path.normalize(path.absolute('foo/bar')),
+          equals(path.normalize(path.join(dir, '../foo/bar'))));
+      expect(path.normalize(path.absolute('foo/bar')),
+          equals(path.normalize(path.context.join(dir, '../foo/bar'))));
+    } finally {
+      io.Directory.current = dir;
+    }
+  });
+}
diff --git a/mojo/public/dart/third_party/path/test/path_test.dart b/mojo/public/dart/third_party/path/test/path_test.dart
new file mode 100644
index 0000000..19397cf
--- /dev/null
+++ b/mojo/public/dart/third_party/path/test/path_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:unittest/unittest.dart';
+import 'package:path/path.dart' as path;
+
+main() {
+  group('path.Style', () {
+    test('name', () {
+      expect(path.Style.posix.name, 'posix');
+      expect(path.Style.windows.name, 'windows');
+    });
+
+    test('separator', () {
+      expect(path.Style.posix.separator, '/');
+      expect(path.Style.windows.separator, '\\');
+    });
+
+    test('toString()', () {
+      expect(path.Style.posix.toString(), 'posix');
+      expect(path.Style.windows.toString(), 'windows');
+    });
+  });
+
+  group('new Context()', () {
+    test('uses the given current directory', () {
+      var context = new path.Context(current: '/a/b/c');
+      expect(context.current, '/a/b/c');
+    });
+
+    test('uses the given style', () {
+      var context = new path.Context(style: path.Style.windows);
+      expect(context.style, path.Style.windows);
+    });
+  });
+
+  test('posix is a default Context for the POSIX style', () {
+    expect(path.posix.style, path.Style.posix);
+    expect(path.posix.current, ".");
+  });
+
+  test('windows is a default Context for the Windows style', () {
+    expect(path.windows.style, path.Style.windows);
+    expect(path.windows.current, ".");
+  });
+
+  test('url is a default Context for the URL style', () {
+    expect(path.url.style, path.Style.url);
+    expect(path.url.current, ".");
+  });
+}
diff --git a/mojo/public/dart/third_party/path/test/posix_test.dart b/mojo/public/dart/third_party/path/test/posix_test.dart
new file mode 100644
index 0000000..2368d99
--- /dev/null
+++ b/mojo/public/dart/third_party/path/test/posix_test.dart
@@ -0,0 +1,538 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library path.test.posix_test;
+
+import 'package:unittest/unittest.dart';
+import 'package:path/path.dart' as path;
+
+import 'utils.dart';
+
+main() {
+  var context =
+      new path.Context(style: path.Style.posix, current: '/root/path');
+
+  test('separator', () {
+    expect(context.separator, '/');
+  });
+
+  test('extension', () {
+    expect(context.extension(''), '');
+    expect(context.extension('.'), '');
+    expect(context.extension('..'), '');
+    expect(context.extension('foo.dart'), '.dart');
+    expect(context.extension('foo.dart.js'), '.js');
+    expect(context.extension('a.b/c'), '');
+    expect(context.extension('a.b/c.d'), '.d');
+    expect(context.extension('~/.bashrc'), '');
+    expect(context.extension(r'a.b\c'), r'.b\c');
+    expect(context.extension('foo.dart/'), '.dart');
+    expect(context.extension('foo.dart//'), '.dart');
+  });
+
+  test('rootPrefix', () {
+    expect(context.rootPrefix(''), '');
+    expect(context.rootPrefix('a'), '');
+    expect(context.rootPrefix('a/b'), '');
+    expect(context.rootPrefix('/a/c'), '/');
+    expect(context.rootPrefix('/'), '/');
+  });
+
+  test('dirname', () {
+    expect(context.dirname(''), '.');
+    expect(context.dirname('.'), '.');
+    expect(context.dirname('..'), '.');
+    expect(context.dirname('../..'), '..');
+    expect(context.dirname('a'), '.');
+    expect(context.dirname('a/b'), 'a');
+    expect(context.dirname('a/b/c'), 'a/b');
+    expect(context.dirname('a/b.c'), 'a');
+    expect(context.dirname('a/'), '.');
+    expect(context.dirname('a/.'), 'a');
+    expect(context.dirname('a/..'), 'a');
+    expect(context.dirname(r'a\b/c'), r'a\b');
+    expect(context.dirname('/a'), '/');
+    expect(context.dirname('///a'), '/');
+    expect(context.dirname('/'), '/');
+    expect(context.dirname('///'), '/');
+    expect(context.dirname('a/b/'), 'a');
+    expect(context.dirname(r'a/b\c'), 'a');
+    expect(context.dirname('a//'), '.');
+    expect(context.dirname('a/b//'), 'a');
+    expect(context.dirname('a//b'), 'a');
+  });
+
+  test('basename', () {
+    expect(context.basename(''), '');
+    expect(context.basename('.'), '.');
+    expect(context.basename('..'), '..');
+    expect(context.basename('.foo'), '.foo');
+    expect(context.basename('a'), 'a');
+    expect(context.basename('a/b'), 'b');
+    expect(context.basename('a/b/c'), 'c');
+    expect(context.basename('a/b.c'), 'b.c');
+    expect(context.basename('a/'), 'a');
+    expect(context.basename('a/.'), '.');
+    expect(context.basename('a/..'), '..');
+    expect(context.basename(r'a\b/c'), 'c');
+    expect(context.basename('/a'), 'a');
+    expect(context.basename('/'), '/');
+    expect(context.basename('a/b/'), 'b');
+    expect(context.basename(r'a/b\c'), r'b\c');
+    expect(context.basename('a//'), 'a');
+    expect(context.basename('a/b//'), 'b');
+    expect(context.basename('a//b'), 'b');
+  });
+
+  test('basenameWithoutExtension', () {
+    expect(context.basenameWithoutExtension(''), '');
+    expect(context.basenameWithoutExtension('.'), '.');
+    expect(context.basenameWithoutExtension('..'), '..');
+    expect(context.basenameWithoutExtension('a'), 'a');
+    expect(context.basenameWithoutExtension('a/b'), 'b');
+    expect(context.basenameWithoutExtension('a/b/c'), 'c');
+    expect(context.basenameWithoutExtension('a/b.c'), 'b');
+    expect(context.basenameWithoutExtension('a/'), 'a');
+    expect(context.basenameWithoutExtension('a/.'), '.');
+    expect(context.basenameWithoutExtension(r'a/b\c'), r'b\c');
+    expect(context.basenameWithoutExtension('a/.bashrc'), '.bashrc');
+    expect(context.basenameWithoutExtension('a/b/c.d.e'), 'c.d');
+    expect(context.basenameWithoutExtension('a//'), 'a');
+    expect(context.basenameWithoutExtension('a/b//'), 'b');
+    expect(context.basenameWithoutExtension('a//b'), 'b');
+    expect(context.basenameWithoutExtension('a/b.c/'), 'b');
+    expect(context.basenameWithoutExtension('a/b.c//'), 'b');
+    expect(context.basenameWithoutExtension('a/b c.d e'), 'b c');
+  });
+
+  test('isAbsolute', () {
+    expect(context.isAbsolute(''), false);
+    expect(context.isAbsolute('a'), false);
+    expect(context.isAbsolute('a/b'), false);
+    expect(context.isAbsolute('/a'), true);
+    expect(context.isAbsolute('/a/b'), true);
+    expect(context.isAbsolute('~'), false);
+    expect(context.isAbsolute('.'), false);
+    expect(context.isAbsolute('..'), false);
+    expect(context.isAbsolute('.foo'), false);
+    expect(context.isAbsolute('../a'), false);
+    expect(context.isAbsolute('C:/a'), false);
+    expect(context.isAbsolute(r'C:\a'), false);
+    expect(context.isAbsolute(r'\\a'), false);
+  });
+
+  test('isRelative', () {
+    expect(context.isRelative(''), true);
+    expect(context.isRelative('a'), true);
+    expect(context.isRelative('a/b'), true);
+    expect(context.isRelative('/a'), false);
+    expect(context.isRelative('/a/b'), false);
+    expect(context.isRelative('~'), true);
+    expect(context.isRelative('.'), true);
+    expect(context.isRelative('..'), true);
+    expect(context.isRelative('.foo'), true);
+    expect(context.isRelative('../a'), true);
+    expect(context.isRelative('C:/a'), true);
+    expect(context.isRelative(r'C:\a'), true);
+    expect(context.isRelative(r'\\a'), true);
+  });
+
+  group('join', () {
+    test('allows up to eight parts', () {
+      expect(context.join('a'), 'a');
+      expect(context.join('a', 'b'), 'a/b');
+      expect(context.join('a', 'b', 'c'), 'a/b/c');
+      expect(context.join('a', 'b', 'c', 'd'), 'a/b/c/d');
+      expect(context.join('a', 'b', 'c', 'd', 'e'), 'a/b/c/d/e');
+      expect(context.join('a', 'b', 'c', 'd', 'e', 'f'), 'a/b/c/d/e/f');
+      expect(context.join('a', 'b', 'c', 'd', 'e', 'f', 'g'), 'a/b/c/d/e/f/g');
+      expect(context.join('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'),
+          'a/b/c/d/e/f/g/h');
+    });
+
+    test('does not add separator if a part ends in one', () {
+      expect(context.join('a/', 'b', 'c/', 'd'), 'a/b/c/d');
+      expect(context.join('a\\', 'b'), r'a\/b');
+    });
+
+    test('ignores parts before an absolute path', () {
+      expect(context.join('a', '/', 'b', 'c'), '/b/c');
+      expect(context.join('a', '/b', '/c', 'd'), '/c/d');
+      expect(context.join('a', r'c:\b', 'c', 'd'), r'a/c:\b/c/d');
+      expect(context.join('a', r'\\b', 'c', 'd'), r'a/\\b/c/d');
+    });
+
+    test('ignores trailing nulls', () {
+      expect(context.join('a', null), equals('a'));
+      expect(context.join('a', 'b', 'c', null, null), equals('a/b/c'));
+    });
+
+    test('ignores empty strings', () {
+      expect(context.join(''), '');
+      expect(context.join('', ''), '');
+      expect(context.join('', 'a'), 'a');
+      expect(context.join('a', '', 'b', '', '', '', 'c'), 'a/b/c');
+      expect(context.join('a', 'b', ''), 'a/b');
+    });
+
+    test('disallows intermediate nulls', () {
+      expect(() => context.join('a', null, 'b'), throwsArgumentError);
+      expect(() => context.join(null, 'a'), throwsArgumentError);
+    });
+
+    test('join does not modify internal ., .., or trailing separators', () {
+      expect(context.join('a/', 'b/c/'), 'a/b/c/');
+      expect(context.join('a/b/./c/..//', 'd/.././..//e/f//'),
+          'a/b/./c/..//d/.././..//e/f//');
+      expect(context.join('a/b', 'c/../../../..'), 'a/b/c/../../../..');
+      expect(context.join('a', 'b${context.separator}'), 'a/b/');
+    });
+  });
+
+  group('joinAll', () {
+    test('allows more than eight parts', () {
+      expect(context.joinAll(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']),
+          'a/b/c/d/e/f/g/h/i');
+    });
+
+    test('does not add separator if a part ends in one', () {
+      expect(context.joinAll(['a/', 'b', 'c/', 'd']), 'a/b/c/d');
+      expect(context.joinAll(['a\\', 'b']), r'a\/b');
+    });
+
+    test('ignores parts before an absolute path', () {
+      expect(context.joinAll(['a', '/', 'b', 'c']), '/b/c');
+      expect(context.joinAll(['a', '/b', '/c', 'd']), '/c/d');
+      expect(context.joinAll(['a', r'c:\b', 'c', 'd']), r'a/c:\b/c/d');
+      expect(context.joinAll(['a', r'\\b', 'c', 'd']), r'a/\\b/c/d');
+    });
+  });
+
+  group('split', () {
+    test('simple cases', () {
+      expect(context.split(''), []);
+      expect(context.split('.'), ['.']);
+      expect(context.split('..'), ['..']);
+      expect(context.split('foo'), equals(['foo']));
+      expect(context.split('foo/bar.txt'), equals(['foo', 'bar.txt']));
+      expect(context.split('foo/bar/baz'), equals(['foo', 'bar', 'baz']));
+      expect(context.split('foo/../bar/./baz'),
+          equals(['foo', '..', 'bar', '.', 'baz']));
+      expect(context.split('foo//bar///baz'), equals(['foo', 'bar', 'baz']));
+      expect(context.split('foo/\\/baz'), equals(['foo', '\\', 'baz']));
+      expect(context.split('.'), equals(['.']));
+      expect(context.split(''), equals([]));
+      expect(context.split('foo/'), equals(['foo']));
+      expect(context.split('//'), equals(['/']));
+    });
+
+    test('includes the root for absolute paths', () {
+      expect(context.split('/foo/bar/baz'), equals(['/', 'foo', 'bar', 'baz']));
+      expect(context.split('/'), equals(['/']));
+    });
+  });
+
+  group('normalize', () {
+    test('simple cases', () {
+      expect(context.normalize(''), '.');
+      expect(context.normalize('.'), '.');
+      expect(context.normalize('..'), '..');
+      expect(context.normalize('a'), 'a');
+      expect(context.normalize('/'), '/');
+      expect(context.normalize(r'\'), r'\');
+      expect(context.normalize('C:/'), 'C:');
+      expect(context.normalize(r'C:\'), r'C:\');
+      expect(context.normalize(r'\\'), r'\\');
+      expect(context.normalize('a/./\xc5\u0bf8-;\u{1f085}\u{00}/c/d/../'),
+          'a/\xc5\u0bf8-;\u{1f085}\u{00}/c');
+    });
+
+    test('collapses redundant separators', () {
+      expect(context.normalize(r'a/b/c'), r'a/b/c');
+      expect(context.normalize(r'a//b///c////d'), r'a/b/c/d');
+    });
+
+    test('does not collapse separators for other platform', () {
+      expect(context.normalize(r'a\\b\\\c'), r'a\\b\\\c');
+    });
+
+    test('eliminates "." parts', () {
+      expect(context.normalize('./'), '.');
+      expect(context.normalize('/.'), '/');
+      expect(context.normalize('/./'), '/');
+      expect(context.normalize('./.'), '.');
+      expect(context.normalize('a/./b'), 'a/b');
+      expect(context.normalize('a/.b/c'), 'a/.b/c');
+      expect(context.normalize('a/././b/./c'), 'a/b/c');
+      expect(context.normalize('././a'), 'a');
+      expect(context.normalize('a/./.'), 'a');
+    });
+
+    test('eliminates ".." parts', () {
+      expect(context.normalize('..'), '..');
+      expect(context.normalize('../'), '..');
+      expect(context.normalize('../../..'), '../../..');
+      expect(context.normalize('../../../'), '../../..');
+      expect(context.normalize('/..'), '/');
+      expect(context.normalize('/../../..'), '/');
+      expect(context.normalize('/../../../a'), '/a');
+      expect(context.normalize('c:/..'), '.');
+      expect(context.normalize('A:/../../..'), '../..');
+      expect(context.normalize('a/..'), '.');
+      expect(context.normalize('a/b/..'), 'a');
+      expect(context.normalize('a/../b'), 'b');
+      expect(context.normalize('a/./../b'), 'b');
+      expect(context.normalize('a/b/c/../../d/e/..'), 'a/d');
+      expect(context.normalize('a/b/../../../../c'), '../../c');
+      expect(context.normalize(r'z/a/b/../../..\../c'), r'z/..\../c');
+      expect(context.normalize(r'a/b\c/../d'), 'a/d');
+    });
+
+    test('does not walk before root on absolute paths', () {
+      expect(context.normalize('..'), '..');
+      expect(context.normalize('../'), '..');
+      expect(context.normalize('http://dartlang.org/..'), 'http:');
+      expect(context.normalize('http://dartlang.org/../../a'), 'a');
+      expect(context.normalize('file:///..'), '.');
+      expect(context.normalize('file:///../../a'), '../a');
+      expect(context.normalize('/..'), '/');
+      expect(context.normalize('a/..'), '.');
+      expect(context.normalize('../a'), '../a');
+      expect(context.normalize('/../a'), '/a');
+      expect(context.normalize('c:/../a'), 'a');
+      expect(context.normalize('/../a'), '/a');
+      expect(context.normalize('a/b/..'), 'a');
+      expect(context.normalize('../a/b/..'), '../a');
+      expect(context.normalize('a/../b'), 'b');
+      expect(context.normalize('a/./../b'), 'b');
+      expect(context.normalize('a/b/c/../../d/e/..'), 'a/d');
+      expect(context.normalize('a/b/../../../../c'), '../../c');
+      expect(context.normalize('a/b/c/../../..d/./.e/f././'), 'a/..d/.e/f.');
+    });
+
+    test('removes trailing separators', () {
+      expect(context.normalize('./'), '.');
+      expect(context.normalize('.//'), '.');
+      expect(context.normalize('a/'), 'a');
+      expect(context.normalize('a/b/'), 'a/b');
+      expect(context.normalize(r'a/b\'), r'a/b\');
+      expect(context.normalize('a/b///'), 'a/b');
+    });
+  });
+
+  group('relative', () {
+    group('from absolute root', () {
+      test('given absolute path in root', () {
+        expect(context.relative('/'), '../..');
+        expect(context.relative('/root'), '..');
+        expect(context.relative('/root/path'), '.');
+        expect(context.relative('/root/path/a'), 'a');
+        expect(context.relative('/root/path/a/b.txt'), 'a/b.txt');
+        expect(context.relative('/root/a/b.txt'), '../a/b.txt');
+      });
+
+      test('given absolute path outside of root', () {
+        expect(context.relative('/a/b'), '../../a/b');
+        expect(context.relative('/root/path/a'), 'a');
+        expect(context.relative('/root/path/a/b.txt'), 'a/b.txt');
+        expect(context.relative('/root/a/b.txt'), '../a/b.txt');
+      });
+
+      test('given relative path', () {
+        // The path is considered relative to the root, so it basically just
+        // normalizes.
+        expect(context.relative(''), '.');
+        expect(context.relative('.'), '.');
+        expect(context.relative('a'), 'a');
+        expect(context.relative('a/b.txt'), 'a/b.txt');
+        expect(context.relative('../a/b.txt'), '../a/b.txt');
+        expect(context.relative('a/./b/../c.txt'), 'a/c.txt');
+      });
+
+      // Regression
+      test('from root-only path', () {
+        expect(context.relative('/', from: '/'), '.');
+        expect(context.relative('/root/path', from: '/'), 'root/path');
+      });
+    });
+
+    group('from relative root', () {
+      var r = new path.Context(style: path.Style.posix, current: 'foo/bar');
+
+      test('given absolute path', () {
+        expect(r.relative('/'), equals('/'));
+        expect(r.relative('/a/b'), equals('/a/b'));
+      });
+
+      test('given relative path', () {
+        // The path is considered relative to the root, so it basically just
+        // normalizes.
+        expect(r.relative(''), '.');
+        expect(r.relative('.'), '.');
+        expect(r.relative('..'), '..');
+        expect(r.relative('a'), 'a');
+        expect(r.relative('a/b.txt'), 'a/b.txt');
+        expect(r.relative('../a/b.txt'), '../a/b.txt');
+        expect(r.relative('a/./b/../c.txt'), 'a/c.txt');
+      });
+    });
+
+    test('from a root with extension', () {
+      var r = new path.Context(style: path.Style.posix, current: '/dir.ext');
+      expect(r.relative('/dir.ext/file'), 'file');
+    });
+
+    test('with a root parameter', () {
+      expect(context.relative('/foo/bar/baz', from: '/foo/bar'), equals('baz'));
+      expect(context.relative('..', from: '/foo/bar'), equals('../../root'));
+      expect(context.relative('/foo/bar/baz', from: 'foo/bar'),
+          equals('../../../../foo/bar/baz'));
+      expect(context.relative('..', from: 'foo/bar'), equals('../../..'));
+    });
+
+    test('with a root parameter and a relative root', () {
+      var r =
+          new path.Context(style: path.Style.posix, current: 'relative/root');
+      expect(r.relative('/foo/bar/baz', from: '/foo/bar'), equals('baz'));
+      expect(() => r.relative('..', from: '/foo/bar'), throwsPathException);
+      expect(
+          r.relative('/foo/bar/baz', from: 'foo/bar'), equals('/foo/bar/baz'));
+      expect(r.relative('..', from: 'foo/bar'), equals('../../..'));
+    });
+
+    test('from a . root', () {
+      var r = new path.Context(style: path.Style.posix, current: '.');
+      expect(r.relative('/foo/bar/baz'), equals('/foo/bar/baz'));
+      expect(r.relative('foo/bar/baz'), equals('foo/bar/baz'));
+    });
+  });
+
+  group('isWithin', () {
+    test('simple cases', () {
+      expect(context.isWithin('foo/bar', 'foo/bar'), isFalse);
+      expect(context.isWithin('foo/bar', 'foo/bar/baz'), isTrue);
+      expect(context.isWithin('foo/bar', 'foo/baz'), isFalse);
+      expect(context.isWithin('foo/bar', '../path/foo/bar/baz'), isTrue);
+      expect(context.isWithin('/', '/foo/bar'), isTrue);
+      expect(context.isWithin('baz', '/root/path/baz/bang'), isTrue);
+      expect(context.isWithin('baz', '/root/path/bang/baz'), isFalse);
+    });
+
+    test('from a relative root', () {
+      var r = new path.Context(style: path.Style.posix, current: 'foo/bar');
+      expect(r.isWithin('.', 'a/b/c'), isTrue);
+      expect(r.isWithin('.', '../a/b/c'), isFalse);
+      expect(r.isWithin('.', '../../a/foo/b/c'), isFalse);
+      expect(r.isWithin('/', '/baz/bang'), isTrue);
+      expect(r.isWithin('.', '/baz/bang'), isFalse);
+    });
+  });
+
+  group('absolute', () {
+    test('allows up to seven parts', () {
+      expect(context.absolute('a'), '/root/path/a');
+      expect(context.absolute('a', 'b'), '/root/path/a/b');
+      expect(context.absolute('a', 'b', 'c'), '/root/path/a/b/c');
+      expect(context.absolute('a', 'b', 'c', 'd'), '/root/path/a/b/c/d');
+      expect(context.absolute('a', 'b', 'c', 'd', 'e'), '/root/path/a/b/c/d/e');
+      expect(context.absolute('a', 'b', 'c', 'd', 'e', 'f'),
+          '/root/path/a/b/c/d/e/f');
+      expect(context.absolute('a', 'b', 'c', 'd', 'e', 'f', 'g'),
+          '/root/path/a/b/c/d/e/f/g');
+    });
+
+    test('does not add separator if a part ends in one', () {
+      expect(context.absolute('a/', 'b', 'c/', 'd'), '/root/path/a/b/c/d');
+      expect(context.absolute(r'a\', 'b'), r'/root/path/a\/b');
+    });
+
+    test('ignores parts before an absolute path', () {
+      expect(context.absolute('a', '/b', '/c', 'd'), '/c/d');
+      expect(
+          context.absolute('a', r'c:\b', 'c', 'd'), r'/root/path/a/c:\b/c/d');
+      expect(context.absolute('a', r'\\b', 'c', 'd'), r'/root/path/a/\\b/c/d');
+    });
+  });
+
+  test('withoutExtension', () {
+    expect(context.withoutExtension(''), '');
+    expect(context.withoutExtension('a'), 'a');
+    expect(context.withoutExtension('.a'), '.a');
+    expect(context.withoutExtension('a.b'), 'a');
+    expect(context.withoutExtension('a/b.c'), 'a/b');
+    expect(context.withoutExtension('a/b.c.d'), 'a/b.c');
+    expect(context.withoutExtension('a/'), 'a/');
+    expect(context.withoutExtension('a/b/'), 'a/b/');
+    expect(context.withoutExtension('a/.'), 'a/.');
+    expect(context.withoutExtension('a/.b'), 'a/.b');
+    expect(context.withoutExtension('a.b/c'), 'a.b/c');
+    expect(context.withoutExtension(r'a.b\c'), r'a');
+    expect(context.withoutExtension(r'a/b\c'), r'a/b\c');
+    expect(context.withoutExtension(r'a/b\c.d'), r'a/b\c');
+    expect(context.withoutExtension('a/b.c/'), 'a/b/');
+    expect(context.withoutExtension('a/b.c//'), 'a/b//');
+  });
+
+  group('fromUri', () {
+    test('with a URI', () {
+      expect(context.fromUri(Uri.parse('file:///path/to/foo')), '/path/to/foo');
+      expect(
+          context.fromUri(Uri.parse('file:///path/to/foo/')), '/path/to/foo/');
+      expect(context.fromUri(Uri.parse('file:///')), '/');
+      expect(context.fromUri(Uri.parse('foo/bar')), 'foo/bar');
+      expect(context.fromUri(Uri.parse('/path/to/foo')), '/path/to/foo');
+      expect(context.fromUri(Uri.parse('///path/to/foo')), '/path/to/foo');
+      expect(context.fromUri(Uri.parse('file:///path/to/foo%23bar')),
+          '/path/to/foo#bar');
+      expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
+          r'_{_}_`_^_ _"_%_');
+      expect(() => context.fromUri(Uri.parse('http://dartlang.org')),
+          throwsArgumentError);
+    });
+
+    test('with a string', () {
+      expect(context.fromUri('file:///path/to/foo'), '/path/to/foo');
+    });
+  });
+
+  test('toUri', () {
+    expect(context.toUri('/path/to/foo'), Uri.parse('file:///path/to/foo'));
+    expect(context.toUri('/path/to/foo/'), Uri.parse('file:///path/to/foo/'));
+    expect(context.toUri('path/to/foo/'), Uri.parse('path/to/foo/'));
+    expect(context.toUri('/'), Uri.parse('file:///'));
+    expect(context.toUri('foo/bar'), Uri.parse('foo/bar'));
+    expect(context.toUri('/path/to/foo#bar'),
+        Uri.parse('file:///path/to/foo%23bar'));
+    expect(context.toUri(r'/_{_}_`_^_ _"_%_'),
+        Uri.parse('file:///_%7B_%7D_%60_%5E_%20_%22_%25_'));
+    expect(context.toUri(r'_{_}_`_^_ _"_%_'),
+        Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_'));
+  });
+
+  group('prettyUri', () {
+    test('with a file: URI', () {
+      expect(context.prettyUri('file:///root/path/a/b'), 'a/b');
+      expect(context.prettyUri('file:///root/path/a/../b'), 'b');
+      expect(context.prettyUri('file:///other/path/a/b'), '/other/path/a/b');
+      expect(context.prettyUri('file:///root/other'), '../other');
+    });
+
+    test('with an http: URI', () {
+      expect(context.prettyUri('http://dartlang.org/a/b'),
+          'http://dartlang.org/a/b');
+    });
+
+    test('with a relative URI', () {
+      expect(context.prettyUri('a/b'), 'a/b');
+    });
+
+    test('with a root-relative URI', () {
+      expect(context.prettyUri('/a/b'), '/a/b');
+    });
+
+    test('with a Uri object', () {
+      expect(context.prettyUri(Uri.parse('a/b')), 'a/b');
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/path/test/relative_test.dart b/mojo/public/dart/third_party/path/test/relative_test.dart
new file mode 100644
index 0000000..57a9046
--- /dev/null
+++ b/mojo/public/dart/third_party/path/test/relative_test.dart
@@ -0,0 +1,87 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Test "relative" on all styles of path.Context, on all platforms.
+
+import "package:unittest/unittest.dart";
+import "package:path/path.dart" as path;
+
+import "utils.dart";
+
+void main() {
+  test("test relative", () {
+    relativeTest(new path.Context(style: path.Style.posix, current: '.'), '/');
+    relativeTest(new path.Context(style: path.Style.posix, current: '/'), '/');
+    relativeTest(
+        new path.Context(style: path.Style.windows, current: r'd:\'), r'c:\');
+    relativeTest(
+        new path.Context(style: path.Style.windows, current: '.'), r'c:\');
+    relativeTest(new path.Context(style: path.Style.url, current: 'file:///'),
+        'http://myserver/');
+    relativeTest(new path.Context(style: path.Style.url, current: '.'),
+        'http://myserver/');
+    relativeTest(
+        new path.Context(style: path.Style.url, current: 'file:///'), '/');
+    relativeTest(new path.Context(style: path.Style.url, current: '.'), '/');
+  });
+}
+
+void relativeTest(path.Context context, String prefix) {
+  var isRelative = (context.current == '.');
+  // Cases where the arguments are absolute paths.
+  expectRelative(result, pathArg, fromArg) {
+    expect(context.relative(pathArg, from: fromArg), context.normalize(result));
+  }
+
+  expectRelative('c/d', '${prefix}a/b/c/d', '${prefix}a/b');
+  expectRelative('c/d', '${prefix}a/b/c/d', '${prefix}a/b/');
+  expectRelative('.', '${prefix}a', '${prefix}a');
+  // Trailing slashes in the inputs have no effect.
+  expectRelative('../../z/x/y', '${prefix}a/b/z/x/y', '${prefix}a/b/c/d/');
+  expectRelative('../../z/x/y', '${prefix}a/b/z/x/y', '${prefix}a/b/c/d');
+  expectRelative('../../z/x/y', '${prefix}a/b/z/x/y/', '${prefix}a/b/c/d');
+  expectRelative('../../../z/x/y', '${prefix}z/x/y', '${prefix}a/b/c');
+  expectRelative('../../../z/x/y', '${prefix}z/x/y', '${prefix}a/b/c/');
+
+  // Cases where the arguments are relative paths.
+  expectRelative('c/d', 'a/b/c/d', 'a/b');
+  expectRelative('.', 'a/b/c', 'a/b/c');
+  expectRelative('.', 'a/d/../b/c', 'a/b/c/');
+  expectRelative('.', '', '');
+  expectRelative('.', '.', '');
+  expectRelative('.', '', '.');
+  expectRelative('.', '.', '.');
+  expectRelative('.', '..', '..');
+  if (isRelative) expectRelative('..', '..', '.');
+  expectRelative('a', 'a', '');
+  expectRelative('a', 'a', '.');
+  expectRelative('..', '.', 'a');
+  expectRelative('.', 'a/b/f/../c', 'a/e/../b/c');
+  expectRelative('d', 'a/b/f/../c/d', 'a/e/../b/c');
+  expectRelative('..', 'a/b/f/../c', 'a/e/../b/c/e/');
+  expectRelative('../..', '', 'a/b/');
+  if (isRelative) expectRelative('../../..', '..', 'a/b/');
+  expectRelative('../b/c/d', 'b/c/d/', 'a/');
+  expectRelative('../a/b/c', 'x/y/a//b/./f/../c', 'x//y/z');
+
+  // Case where from is an exact substring of path.
+  expectRelative('a/b', '${prefix}x/y//a/b', '${prefix}x/y/');
+  expectRelative('a/b', 'x/y//a/b', 'x/y/');
+  expectRelative('../ya/b', '${prefix}x/ya/b', '${prefix}x/y');
+  expectRelative('../ya/b', 'x/ya/b', 'x/y');
+  expectRelative('../b', 'x/y/../b', 'x/y/.');
+  expectRelative('a/b/c', 'x/y/a//b/./f/../c', 'x/y');
+  expectRelative('.', '${prefix}x/y//', '${prefix}x/y/');
+  expectRelative('.', '${prefix}x/y/', '${prefix}x/y');
+
+  // Should always throw - no relative path can be constructed.
+  if (isRelative) {
+    expect(() => context.relative('.', from: '..'), throwsPathException);
+    expect(() => context.relative('a/b', from: '../../d'), throwsPathException);
+    expect(() => context.relative('a/b', from: '${prefix}a/b'),
+        throwsPathException);
+    // An absolute path relative from a relative path returns the absolute path.
+    expectRelative('${prefix}a/b', '${prefix}a/b', 'c/d');
+  }
+}
diff --git a/mojo/public/dart/third_party/path/test/url_test.dart b/mojo/public/dart/third_party/path/test/url_test.dart
new file mode 100644
index 0000000..854e19a
--- /dev/null
+++ b/mojo/public/dart/third_party/path/test/url_test.dart
@@ -0,0 +1,766 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:unittest/unittest.dart';
+import 'package:path/path.dart' as path;
+
+main() {
+  var context = new path.Context(
+      style: path.Style.url, current: 'http://dartlang.org/root/path');
+
+  test('separator', () {
+    expect(context.separator, '/');
+  });
+
+  test('extension', () {
+    expect(context.extension(''), '');
+    expect(context.extension('foo.dart'), '.dart');
+    expect(context.extension('foo.dart.js'), '.js');
+    expect(context.extension('a.b/c'), '');
+    expect(context.extension('a.b/c.d'), '.d');
+    expect(context.extension(r'a.b\c'), r'.b\c');
+    expect(context.extension('foo.dart/'), '.dart');
+    expect(context.extension('foo.dart//'), '.dart');
+  });
+
+  test('rootPrefix', () {
+    expect(context.rootPrefix(''), '');
+    expect(context.rootPrefix('a'), '');
+    expect(context.rootPrefix('a/b'), '');
+    expect(
+        context.rootPrefix('http://dartlang.org/a/c'), 'http://dartlang.org');
+    expect(context.rootPrefix('file:///a/c'), 'file://');
+    expect(context.rootPrefix('/a/c'), '/');
+    expect(context.rootPrefix('http://dartlang.org/'), 'http://dartlang.org');
+    expect(context.rootPrefix('file:///'), 'file://');
+    expect(context.rootPrefix('http://dartlang.org'), 'http://dartlang.org');
+    expect(context.rootPrefix('file://'), 'file://');
+    expect(context.rootPrefix('/'), '/');
+    expect(context.rootPrefix('foo/bar://'), '');
+  });
+
+  test('dirname', () {
+    expect(context.dirname(''), '.');
+    expect(context.dirname('a'), '.');
+    expect(context.dirname('a/b'), 'a');
+    expect(context.dirname('a/b/c'), 'a/b');
+    expect(context.dirname('a/b.c'), 'a');
+    expect(context.dirname('a/'), '.');
+    expect(context.dirname('a/.'), 'a');
+    expect(context.dirname(r'a\b/c'), r'a\b');
+    expect(context.dirname('http://dartlang.org/a'), 'http://dartlang.org');
+    expect(context.dirname('file:///a'), 'file://');
+    expect(context.dirname('/a'), '/');
+    expect(context.dirname('http://dartlang.org///a'), 'http://dartlang.org');
+    expect(context.dirname('file://///a'), 'file://');
+    expect(context.dirname('///a'), '/');
+    expect(context.dirname('http://dartlang.org/'), 'http://dartlang.org');
+    expect(context.dirname('http://dartlang.org'), 'http://dartlang.org');
+    expect(context.dirname('file:///'), 'file://');
+    expect(context.dirname('file://'), 'file://');
+    expect(context.dirname('/'), '/');
+    expect(context.dirname('http://dartlang.org///'), 'http://dartlang.org');
+    expect(context.dirname('file://///'), 'file://');
+    expect(context.dirname('///'), '/');
+    expect(context.dirname('a/b/'), 'a');
+    expect(context.dirname(r'a/b\c'), 'a');
+    expect(context.dirname('a//'), '.');
+    expect(context.dirname('a/b//'), 'a');
+    expect(context.dirname('a//b'), 'a');
+  });
+
+  test('basename', () {
+    expect(context.basename(''), '');
+    expect(context.basename('a'), 'a');
+    expect(context.basename('a/b'), 'b');
+    expect(context.basename('a/b/c'), 'c');
+    expect(context.basename('a/b.c'), 'b.c');
+    expect(context.basename('a/'), 'a');
+    expect(context.basename('a/.'), '.');
+    expect(context.basename(r'a\b/c'), 'c');
+    expect(context.basename('http://dartlang.org/a'), 'a');
+    expect(context.basename('file:///a'), 'a');
+    expect(context.basename('/a'), 'a');
+    expect(context.basename('http://dartlang.org/'), 'http://dartlang.org');
+    expect(context.basename('http://dartlang.org'), 'http://dartlang.org');
+    expect(context.basename('file:///'), 'file://');
+    expect(context.basename('file://'), 'file://');
+    expect(context.basename('/'), '/');
+    expect(context.basename('a/b/'), 'b');
+    expect(context.basename(r'a/b\c'), r'b\c');
+    expect(context.basename('a//'), 'a');
+    expect(context.basename('a/b//'), 'b');
+    expect(context.basename('a//b'), 'b');
+    expect(context.basename('a b/c d.e f'), 'c d.e f');
+  });
+
+  test('basenameWithoutExtension', () {
+    expect(context.basenameWithoutExtension(''), '');
+    expect(context.basenameWithoutExtension('.'), '.');
+    expect(context.basenameWithoutExtension('..'), '..');
+    expect(context.basenameWithoutExtension('a'), 'a');
+    expect(context.basenameWithoutExtension('a/b'), 'b');
+    expect(context.basenameWithoutExtension('a/b/c'), 'c');
+    expect(context.basenameWithoutExtension('a/b.c'), 'b');
+    expect(context.basenameWithoutExtension('a/'), 'a');
+    expect(context.basenameWithoutExtension('a/.'), '.');
+    expect(context.basenameWithoutExtension(r'a/b\c'), r'b\c');
+    expect(context.basenameWithoutExtension('a/.bashrc'), '.bashrc');
+    expect(context.basenameWithoutExtension('a/b/c.d.e'), 'c.d');
+    expect(context.basenameWithoutExtension('a//'), 'a');
+    expect(context.basenameWithoutExtension('a/b//'), 'b');
+    expect(context.basenameWithoutExtension('a//b'), 'b');
+    expect(context.basenameWithoutExtension('a/b.c/'), 'b');
+    expect(context.basenameWithoutExtension('a/b.c//'), 'b');
+    expect(context.basenameWithoutExtension('a/b c.d e.f g'), 'b c.d e');
+  });
+
+  test('isAbsolute', () {
+    expect(context.isAbsolute(''), false);
+    expect(context.isAbsolute('a'), false);
+    expect(context.isAbsolute('a/b'), false);
+    expect(context.isAbsolute('http://dartlang.org/a'), true);
+    expect(context.isAbsolute('file:///a'), true);
+    expect(context.isAbsolute('/a'), true);
+    expect(context.isAbsolute('http://dartlang.org/a/b'), true);
+    expect(context.isAbsolute('file:///a/b'), true);
+    expect(context.isAbsolute('/a/b'), true);
+    expect(context.isAbsolute('http://dartlang.org/'), true);
+    expect(context.isAbsolute('file:///'), true);
+    expect(context.isAbsolute('http://dartlang.org'), true);
+    expect(context.isAbsolute('file://'), true);
+    expect(context.isAbsolute('/'), true);
+    expect(context.isAbsolute('~'), false);
+    expect(context.isAbsolute('.'), false);
+    expect(context.isAbsolute('../a'), false);
+    expect(context.isAbsolute('C:/a'), false);
+    expect(context.isAbsolute(r'C:\a'), false);
+    expect(context.isAbsolute(r'\\a'), false);
+  });
+
+  test('isRelative', () {
+    expect(context.isRelative(''), true);
+    expect(context.isRelative('a'), true);
+    expect(context.isRelative('a/b'), true);
+    expect(context.isRelative('http://dartlang.org/a'), false);
+    expect(context.isRelative('file:///a'), false);
+    expect(context.isRelative('/a'), false);
+    expect(context.isRelative('http://dartlang.org/a/b'), false);
+    expect(context.isRelative('file:///a/b'), false);
+    expect(context.isRelative('/a/b'), false);
+    expect(context.isRelative('http://dartlang.org/'), false);
+    expect(context.isRelative('file:///'), false);
+    expect(context.isRelative('http://dartlang.org'), false);
+    expect(context.isRelative('file://'), false);
+    expect(context.isRelative('/'), false);
+    expect(context.isRelative('~'), true);
+    expect(context.isRelative('.'), true);
+    expect(context.isRelative('../a'), true);
+    expect(context.isRelative('C:/a'), true);
+    expect(context.isRelative(r'C:\a'), true);
+    expect(context.isRelative(r'\\a'), true);
+  });
+
+  test('isRootRelative', () {
+    expect(context.isRootRelative(''), false);
+    expect(context.isRootRelative('a'), false);
+    expect(context.isRootRelative('a/b'), false);
+    expect(context.isRootRelative('http://dartlang.org/a'), false);
+    expect(context.isRootRelative('file:///a'), false);
+    expect(context.isRootRelative('/a'), true);
+    expect(context.isRootRelative('http://dartlang.org/a/b'), false);
+    expect(context.isRootRelative('file:///a/b'), false);
+    expect(context.isRootRelative('/a/b'), true);
+    expect(context.isRootRelative('http://dartlang.org/'), false);
+    expect(context.isRootRelative('file:///'), false);
+    expect(context.isRootRelative('http://dartlang.org'), false);
+    expect(context.isRootRelative('file://'), false);
+    expect(context.isRootRelative('/'), true);
+    expect(context.isRootRelative('~'), false);
+    expect(context.isRootRelative('.'), false);
+    expect(context.isRootRelative('../a'), false);
+    expect(context.isRootRelative('C:/a'), false);
+    expect(context.isRootRelative(r'C:\a'), false);
+    expect(context.isRootRelative(r'\\a'), false);
+  });
+
+  group('join', () {
+    test('allows up to eight parts', () {
+      expect(context.join('a'), 'a');
+      expect(context.join('a', 'b'), 'a/b');
+      expect(context.join('a', 'b', 'c'), 'a/b/c');
+      expect(context.join('a', 'b', 'c', 'd'), 'a/b/c/d');
+      expect(context.join('a', 'b', 'c', 'd', 'e'), 'a/b/c/d/e');
+      expect(context.join('a', 'b', 'c', 'd', 'e', 'f'), 'a/b/c/d/e/f');
+      expect(context.join('a', 'b', 'c', 'd', 'e', 'f', 'g'), 'a/b/c/d/e/f/g');
+      expect(context.join('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'),
+          'a/b/c/d/e/f/g/h');
+    });
+
+    test('does not add separator if a part ends in one', () {
+      expect(context.join('a/', 'b', 'c/', 'd'), 'a/b/c/d');
+      expect(context.join('a\\', 'b'), r'a\/b');
+    });
+
+    test('ignores parts before an absolute path', () {
+      expect(context.join('a', 'http://dartlang.org', 'b', 'c'),
+          'http://dartlang.org/b/c');
+      expect(context.join('a', 'file://', 'b', 'c'), 'file:///b/c');
+      expect(context.join('a', '/', 'b', 'c'), '/b/c');
+      expect(context.join('a', '/b', 'http://dartlang.org/c', 'd'),
+          'http://dartlang.org/c/d');
+      expect(context.join(
+              'a', 'http://google.com/b', 'http://dartlang.org/c', 'd'),
+          'http://dartlang.org/c/d');
+      expect(context.join('a', '/b', '/c', 'd'), '/c/d');
+      expect(context.join('a', r'c:\b', 'c', 'd'), r'a/c:\b/c/d');
+      expect(context.join('a', r'\\b', 'c', 'd'), r'a/\\b/c/d');
+    });
+
+    test('preserves roots before a root-relative path', () {
+      expect(context.join('http://dartlang.org', 'a', '/b', 'c'),
+          'http://dartlang.org/b/c');
+      expect(context.join('file://', 'a', '/b', 'c'), 'file:///b/c');
+      expect(context.join('file://', 'a', '/b', 'c', '/d'), 'file:///d');
+    });
+
+    test('ignores trailing nulls', () {
+      expect(context.join('a', null), equals('a'));
+      expect(context.join('a', 'b', 'c', null, null), equals('a/b/c'));
+    });
+
+    test('ignores empty strings', () {
+      expect(context.join(''), '');
+      expect(context.join('', ''), '');
+      expect(context.join('', 'a'), 'a');
+      expect(context.join('a', '', 'b', '', '', '', 'c'), 'a/b/c');
+      expect(context.join('a', 'b', ''), 'a/b');
+    });
+
+    test('disallows intermediate nulls', () {
+      expect(() => context.join('a', null, 'b'), throwsArgumentError);
+      expect(() => context.join(null, 'a'), throwsArgumentError);
+    });
+
+    test('Join does not modify internal ., .., or trailing separators', () {
+      expect(context.join('a/', 'b/c/'), 'a/b/c/');
+      expect(context.join('a/b/./c/..//', 'd/.././..//e/f//'),
+          'a/b/./c/..//d/.././..//e/f//');
+      expect(context.join('a/b', 'c/../../../..'), 'a/b/c/../../../..');
+      expect(context.join('a', 'b${context.separator}'), 'a/b/');
+    });
+  });
+
+  group('joinAll', () {
+    test('allows more than eight parts', () {
+      expect(context.joinAll(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']),
+          'a/b/c/d/e/f/g/h/i');
+    });
+
+    test('ignores parts before an absolute path', () {
+      expect(context.joinAll(['a', 'http://dartlang.org', 'b', 'c']),
+          'http://dartlang.org/b/c');
+      expect(context.joinAll(['a', 'file://', 'b', 'c']), 'file:///b/c');
+      expect(context.joinAll(['a', '/', 'b', 'c']), '/b/c');
+      expect(context.joinAll(['a', '/b', 'http://dartlang.org/c', 'd']),
+          'http://dartlang.org/c/d');
+      expect(context.joinAll([
+        'a',
+        'http://google.com/b',
+        'http://dartlang.org/c',
+        'd'
+      ]), 'http://dartlang.org/c/d');
+      expect(context.joinAll(['a', '/b', '/c', 'd']), '/c/d');
+      expect(context.joinAll(['a', r'c:\b', 'c', 'd']), r'a/c:\b/c/d');
+      expect(context.joinAll(['a', r'\\b', 'c', 'd']), r'a/\\b/c/d');
+    });
+
+    test('preserves roots before a root-relative path', () {
+      expect(context.joinAll(['http://dartlang.org', 'a', '/b', 'c']),
+          'http://dartlang.org/b/c');
+      expect(context.joinAll(['file://', 'a', '/b', 'c']), 'file:///b/c');
+      expect(context.joinAll(['file://', 'a', '/b', 'c', '/d']), 'file:///d');
+    });
+  });
+
+  group('split', () {
+    test('simple cases', () {
+      expect(context.split(''), []);
+      expect(context.split('.'), ['.']);
+      expect(context.split('..'), ['..']);
+      expect(context.split('foo'), equals(['foo']));
+      expect(context.split('foo/bar.txt'), equals(['foo', 'bar.txt']));
+      expect(context.split('foo/bar/baz'), equals(['foo', 'bar', 'baz']));
+      expect(context.split('foo/../bar/./baz'),
+          equals(['foo', '..', 'bar', '.', 'baz']));
+      expect(context.split('foo//bar///baz'), equals(['foo', 'bar', 'baz']));
+      expect(context.split('foo/\\/baz'), equals(['foo', '\\', 'baz']));
+      expect(context.split('.'), equals(['.']));
+      expect(context.split(''), equals([]));
+      expect(context.split('foo/'), equals(['foo']));
+      expect(context.split('http://dartlang.org//'),
+          equals(['http://dartlang.org']));
+      expect(context.split('file:////'), equals(['file://']));
+      expect(context.split('//'), equals(['/']));
+    });
+
+    test('includes the root for absolute paths', () {
+      expect(context.split('http://dartlang.org/foo/bar/baz'),
+          equals(['http://dartlang.org', 'foo', 'bar', 'baz']));
+      expect(context.split('file:///foo/bar/baz'),
+          equals(['file://', 'foo', 'bar', 'baz']));
+      expect(context.split('/foo/bar/baz'), equals(['/', 'foo', 'bar', 'baz']));
+      expect(context.split('http://dartlang.org/'),
+          equals(['http://dartlang.org']));
+      expect(context.split('http://dartlang.org'),
+          equals(['http://dartlang.org']));
+      expect(context.split('file:///'), equals(['file://']));
+      expect(context.split('file://'), equals(['file://']));
+      expect(context.split('/'), equals(['/']));
+    });
+  });
+
+  group('normalize', () {
+    test('simple cases', () {
+      expect(context.normalize(''), '.');
+      expect(context.normalize('.'), '.');
+      expect(context.normalize('..'), '..');
+      expect(context.normalize('a'), 'a');
+      expect(context.normalize('http://dartlang.org/'), 'http://dartlang.org');
+      expect(context.normalize('http://dartlang.org'), 'http://dartlang.org');
+      expect(context.normalize('file://'), 'file://');
+      expect(context.normalize('file:///'), 'file://');
+      expect(context.normalize('/'), '/');
+      expect(context.normalize(r'\'), r'\');
+      expect(context.normalize('C:/'), 'C:');
+      expect(context.normalize(r'C:\'), r'C:\');
+      expect(context.normalize(r'\\'), r'\\');
+      expect(context.normalize('a/./\xc5\u0bf8-;\u{1f085}\u{00}/c/d/../'),
+          'a/\xc5\u0bf8-;\u{1f085}\u{00}/c');
+    });
+
+    test('collapses redundant separators', () {
+      expect(context.normalize(r'a/b/c'), r'a/b/c');
+      expect(context.normalize(r'a//b///c////d'), r'a/b/c/d');
+    });
+
+    test('does not collapse separators for other platform', () {
+      expect(context.normalize(r'a\\b\\\c'), r'a\\b\\\c');
+    });
+
+    test('eliminates "." parts', () {
+      expect(context.normalize('./'), '.');
+      expect(context.normalize('http://dartlang.org/.'), 'http://dartlang.org');
+      expect(context.normalize('file:///.'), 'file://');
+      expect(context.normalize('/.'), '/');
+      expect(
+          context.normalize('http://dartlang.org/./'), 'http://dartlang.org');
+      expect(context.normalize('file:///./'), 'file://');
+      expect(context.normalize('/./'), '/');
+      expect(context.normalize('./.'), '.');
+      expect(context.normalize('a/./b'), 'a/b');
+      expect(context.normalize('a/.b/c'), 'a/.b/c');
+      expect(context.normalize('a/././b/./c'), 'a/b/c');
+      expect(context.normalize('././a'), 'a');
+      expect(context.normalize('a/./.'), 'a');
+    });
+
+    test('eliminates ".." parts', () {
+      expect(context.normalize('..'), '..');
+      expect(context.normalize('../'), '..');
+      expect(context.normalize('../../..'), '../../..');
+      expect(context.normalize('../../../'), '../../..');
+      expect(
+          context.normalize('http://dartlang.org/..'), 'http://dartlang.org');
+      expect(context.normalize('file:///..'), 'file://');
+      expect(context.normalize('/..'), '/');
+      expect(context.normalize('http://dartlang.org/../../..'),
+          'http://dartlang.org');
+      expect(context.normalize('file:///../../..'), 'file://');
+      expect(context.normalize('/../../..'), '/');
+      expect(context.normalize('http://dartlang.org/../../../a'),
+          'http://dartlang.org/a');
+      expect(context.normalize('file:///../../../a'), 'file:///a');
+      expect(context.normalize('/../../../a'), '/a');
+      expect(context.normalize('c:/..'), '.');
+      expect(context.normalize('A:/../../..'), '../..');
+      expect(context.normalize('a/..'), '.');
+      expect(context.normalize('a/b/..'), 'a');
+      expect(context.normalize('a/../b'), 'b');
+      expect(context.normalize('a/./../b'), 'b');
+      expect(context.normalize('a/b/c/../../d/e/..'), 'a/d');
+      expect(context.normalize('a/b/../../../../c'), '../../c');
+      expect(context.normalize('z/a/b/../../..\../c'), 'z/..\../c');
+      expect(context.normalize('a/b\c/../d'), 'a/d');
+    });
+
+    test('does not walk before root on absolute paths', () {
+      expect(context.normalize('..'), '..');
+      expect(context.normalize('../'), '..');
+      expect(
+          context.normalize('http://dartlang.org/..'), 'http://dartlang.org');
+      expect(context.normalize('http://dartlang.org/../a'),
+          'http://dartlang.org/a');
+      expect(context.normalize('file:///..'), 'file://');
+      expect(context.normalize('file:///../a'), 'file:///a');
+      expect(context.normalize('/..'), '/');
+      expect(context.normalize('a/..'), '.');
+      expect(context.normalize('../a'), '../a');
+      expect(context.normalize('/../a'), '/a');
+      expect(context.normalize('c:/../a'), 'a');
+      expect(context.normalize('/../a'), '/a');
+      expect(context.normalize('a/b/..'), 'a');
+      expect(context.normalize('../a/b/..'), '../a');
+      expect(context.normalize('a/../b'), 'b');
+      expect(context.normalize('a/./../b'), 'b');
+      expect(context.normalize('a/b/c/../../d/e/..'), 'a/d');
+      expect(context.normalize('a/b/../../../../c'), '../../c');
+      expect(context.normalize('a/b/c/../../..d/./.e/f././'), 'a/..d/.e/f.');
+    });
+
+    test('removes trailing separators', () {
+      expect(context.normalize('./'), '.');
+      expect(context.normalize('.//'), '.');
+      expect(context.normalize('a/'), 'a');
+      expect(context.normalize('a/b/'), 'a/b');
+      expect(context.normalize(r'a/b\'), r'a/b\');
+      expect(context.normalize('a/b///'), 'a/b');
+    });
+  });
+
+  group('relative', () {
+    group('from absolute root', () {
+      test('given absolute path in root', () {
+        expect(context.relative('http://dartlang.org'), '../..');
+        expect(context.relative('http://dartlang.org/'), '../..');
+        expect(context.relative('/'), '../..');
+        expect(context.relative('http://dartlang.org/root'), '..');
+        expect(context.relative('/root'), '..');
+        expect(context.relative('http://dartlang.org/root/path'), '.');
+        expect(context.relative('/root/path'), '.');
+        expect(context.relative('http://dartlang.org/root/path/a'), 'a');
+        expect(context.relative('/root/path/a'), 'a');
+        expect(context.relative('http://dartlang.org/root/path/a/b.txt'),
+            'a/b.txt');
+        expect(context.relative('/root/path/a/b.txt'), 'a/b.txt');
+        expect(
+            context.relative('http://dartlang.org/root/a/b.txt'), '../a/b.txt');
+        expect(context.relative('/root/a/b.txt'), '../a/b.txt');
+      });
+
+      test('given absolute path outside of root', () {
+        expect(context.relative('http://dartlang.org/a/b'), '../../a/b');
+        expect(context.relative('/a/b'), '../../a/b');
+        expect(context.relative('http://dartlang.org/root/path/a'), 'a');
+        expect(context.relative('/root/path/a'), 'a');
+        expect(context.relative('http://dartlang.org/root/path/a/b.txt'),
+            'a/b.txt');
+        expect(context.relative('http://dartlang.org/root/path/a/b.txt'),
+            'a/b.txt');
+        expect(
+            context.relative('http://dartlang.org/root/a/b.txt'), '../a/b.txt');
+      });
+
+      test('given absolute path with different hostname/protocol', () {
+        expect(context.relative(r'http://google.com/a/b'),
+            r'http://google.com/a/b');
+        expect(context.relative(r'file:///a/b'), r'file:///a/b');
+      });
+
+      test('given relative path', () {
+        // The path is considered relative to the root, so it basically just
+        // normalizes.
+        expect(context.relative(''), '.');
+        expect(context.relative('.'), '.');
+        expect(context.relative('a'), 'a');
+        expect(context.relative('a/b.txt'), 'a/b.txt');
+        expect(context.relative('../a/b.txt'), '../a/b.txt');
+        expect(context.relative('a/./b/../c.txt'), 'a/c.txt');
+      });
+
+      // Regression
+      test('from root-only path', () {
+        expect(context.relative('http://dartlang.org',
+            from: 'http://dartlang.org'), '.');
+        expect(context.relative('http://dartlang.org/root/path',
+            from: 'http://dartlang.org'), 'root/path');
+      });
+    });
+
+    group('from relative root', () {
+      var r = new path.Context(style: path.Style.url, current: 'foo/bar');
+
+      test('given absolute path', () {
+        expect(r.relative('http://google.com/'), equals('http://google.com'));
+        expect(r.relative('http://google.com'), equals('http://google.com'));
+        expect(r.relative('file:///'), equals('file://'));
+        expect(r.relative('file://'), equals('file://'));
+        expect(r.relative('/'), equals('/'));
+        expect(r.relative('/a/b'), equals('/a/b'));
+      });
+
+      test('given relative path', () {
+        // The path is considered relative to the root, so it basically just
+        // normalizes.
+        expect(r.relative(''), '.');
+        expect(r.relative('.'), '.');
+        expect(r.relative('..'), '..');
+        expect(r.relative('a'), 'a');
+        expect(r.relative('a/b.txt'), 'a/b.txt');
+        expect(r.relative('../a/b.txt'), '../a/b.txt');
+        expect(r.relative('a/./b/../c.txt'), 'a/c.txt');
+      });
+    });
+
+    group('from root-relative root', () {
+      var r = new path.Context(style: path.Style.url, current: '/foo/bar');
+
+      test('given absolute path', () {
+        expect(r.relative('http://google.com/'), equals('http://google.com'));
+        expect(r.relative('http://google.com'), equals('http://google.com'));
+        expect(r.relative('file:///'), equals('file://'));
+        expect(r.relative('file://'), equals('file://'));
+        expect(r.relative('/'), equals('../..'));
+        expect(r.relative('/a/b'), equals('../../a/b'));
+      });
+
+      test('given relative path', () {
+        // The path is considered relative to the root, so it basically just
+        // normalizes.
+        expect(r.relative(''), '.');
+        expect(r.relative('.'), '.');
+        expect(r.relative('..'), '..');
+        expect(r.relative('a'), 'a');
+        expect(r.relative('a/b.txt'), 'a/b.txt');
+        expect(r.relative('../a/b.txt'), '../a/b.txt');
+        expect(r.relative('a/./b/../c.txt'), 'a/c.txt');
+      });
+    });
+
+    test('from a root with extension', () {
+      var r = new path.Context(style: path.Style.url, current: '/dir.ext');
+      expect(r.relative('/dir.ext/file'), 'file');
+    });
+
+    test('with a root parameter', () {
+      expect(context.relative('/foo/bar/baz', from: '/foo/bar'), equals('baz'));
+      expect(
+          context.relative('/foo/bar/baz', from: 'http://dartlang.org/foo/bar'),
+          equals('baz'));
+      expect(
+          context.relative('http://dartlang.org/foo/bar/baz', from: '/foo/bar'),
+          equals('baz'));
+      expect(context.relative('http://dartlang.org/foo/bar/baz',
+          from: 'file:///foo/bar'), equals('http://dartlang.org/foo/bar/baz'));
+      expect(context.relative('http://dartlang.org/foo/bar/baz',
+          from: 'http://dartlang.org/foo/bar'), equals('baz'));
+      expect(context.relative('/foo/bar/baz', from: 'file:///foo/bar'),
+          equals('http://dartlang.org/foo/bar/baz'));
+      expect(context.relative('file:///foo/bar/baz', from: '/foo/bar'),
+          equals('file:///foo/bar/baz'));
+
+      expect(context.relative('..', from: '/foo/bar'), equals('../../root'));
+      expect(context.relative('..', from: 'http://dartlang.org/foo/bar'),
+          equals('../../root'));
+      expect(context.relative('..', from: 'file:///foo/bar'),
+          equals('http://dartlang.org/root'));
+      expect(context.relative('..', from: '/foo/bar'), equals('../../root'));
+
+      expect(
+          context.relative('http://dartlang.org/foo/bar/baz', from: 'foo/bar'),
+          equals('../../../../foo/bar/baz'));
+      expect(context.relative('file:///foo/bar/baz', from: 'foo/bar'),
+          equals('file:///foo/bar/baz'));
+      expect(context.relative('/foo/bar/baz', from: 'foo/bar'),
+          equals('../../../../foo/bar/baz'));
+
+      expect(context.relative('..', from: 'foo/bar'), equals('../../..'));
+    });
+
+    test('with a root parameter and a relative root', () {
+      var r = new path.Context(style: path.Style.url, current: 'relative/root');
+      expect(r.relative('/foo/bar/baz', from: '/foo/bar'), equals('baz'));
+      expect(r.relative('/foo/bar/baz', from: 'http://dartlang.org/foo/bar'),
+          equals('/foo/bar/baz'));
+      expect(r.relative('http://dartlang.org/foo/bar/baz', from: '/foo/bar'),
+          equals('http://dartlang.org/foo/bar/baz'));
+      expect(r.relative('http://dartlang.org/foo/bar/baz',
+          from: 'file:///foo/bar'), equals('http://dartlang.org/foo/bar/baz'));
+      expect(r.relative('http://dartlang.org/foo/bar/baz',
+          from: 'http://dartlang.org/foo/bar'), equals('baz'));
+
+      expect(r.relative('http://dartlang.org/foo/bar/baz', from: 'foo/bar'),
+          equals('http://dartlang.org/foo/bar/baz'));
+      expect(r.relative('file:///foo/bar/baz', from: 'foo/bar'),
+          equals('file:///foo/bar/baz'));
+      expect(
+          r.relative('/foo/bar/baz', from: 'foo/bar'), equals('/foo/bar/baz'));
+
+      expect(r.relative('..', from: 'foo/bar'), equals('../../..'));
+    });
+
+    test('from a . root', () {
+      var r = new path.Context(style: path.Style.url, current: '.');
+      expect(r.relative('http://dartlang.org/foo/bar/baz'),
+          equals('http://dartlang.org/foo/bar/baz'));
+      expect(r.relative('file:///foo/bar/baz'), equals('file:///foo/bar/baz'));
+      expect(r.relative('/foo/bar/baz'), equals('/foo/bar/baz'));
+      expect(r.relative('foo/bar/baz'), equals('foo/bar/baz'));
+    });
+  });
+
+  group('isWithin', () {
+    test('simple cases', () {
+      expect(context.isWithin('foo/bar', 'foo/bar'), isFalse);
+      expect(context.isWithin('foo/bar', 'foo/bar/baz'), isTrue);
+      expect(context.isWithin('foo/bar', 'foo/baz'), isFalse);
+      expect(context.isWithin('foo/bar', '../path/foo/bar/baz'), isTrue);
+      expect(context.isWithin(
+          'http://dartlang.org', 'http://dartlang.org/foo/bar'), isTrue);
+      expect(context.isWithin(
+          'http://dartlang.org', 'http://pub.dartlang.org/foo/bar'), isFalse);
+      expect(context.isWithin('http://dartlang.org', '/foo/bar'), isTrue);
+      expect(context.isWithin('http://dartlang.org/foo', '/foo/bar'), isTrue);
+      expect(context.isWithin('http://dartlang.org/foo', '/bar/baz'), isFalse);
+      expect(context.isWithin('baz', 'http://dartlang.org/root/path/baz/bang'),
+          isTrue);
+      expect(context.isWithin('baz', 'http://dartlang.org/root/path/bang/baz'),
+          isFalse);
+    });
+
+    test('from a relative root', () {
+      var r = new path.Context(style: path.Style.url, current: 'foo/bar');
+      expect(r.isWithin('.', 'a/b/c'), isTrue);
+      expect(r.isWithin('.', '../a/b/c'), isFalse);
+      expect(r.isWithin('.', '../../a/foo/b/c'), isFalse);
+      expect(r.isWithin('http://dartlang.org/', 'http://dartlang.org/baz/bang'),
+          isTrue);
+      expect(r.isWithin('.', 'http://dartlang.org/baz/bang'), isFalse);
+    });
+  });
+
+  group('absolute', () {
+    test('allows up to seven parts', () {
+      expect(context.absolute('a'), 'http://dartlang.org/root/path/a');
+      expect(context.absolute('a', 'b'), 'http://dartlang.org/root/path/a/b');
+      expect(context.absolute('a', 'b', 'c'),
+          'http://dartlang.org/root/path/a/b/c');
+      expect(context.absolute('a', 'b', 'c', 'd'),
+          'http://dartlang.org/root/path/a/b/c/d');
+      expect(context.absolute('a', 'b', 'c', 'd', 'e'),
+          'http://dartlang.org/root/path/a/b/c/d/e');
+      expect(context.absolute('a', 'b', 'c', 'd', 'e', 'f'),
+          'http://dartlang.org/root/path/a/b/c/d/e/f');
+      expect(context.absolute('a', 'b', 'c', 'd', 'e', 'f', 'g'),
+          'http://dartlang.org/root/path/a/b/c/d/e/f/g');
+    });
+
+    test('does not add separator if a part ends in one', () {
+      expect(context.absolute('a/', 'b', 'c/', 'd'),
+          'http://dartlang.org/root/path/a/b/c/d');
+      expect(
+          context.absolute(r'a\', 'b'), r'http://dartlang.org/root/path/a\/b');
+    });
+
+    test('ignores parts before an absolute path', () {
+      expect(context.absolute('a', '/b', '/c', 'd'), 'http://dartlang.org/c/d');
+      expect(context.absolute('a', '/b', 'file:///c', 'd'), 'file:///c/d');
+      expect(context.absolute('a', r'c:\b', 'c', 'd'),
+          r'http://dartlang.org/root/path/a/c:\b/c/d');
+      expect(context.absolute('a', r'\\b', 'c', 'd'),
+          r'http://dartlang.org/root/path/a/\\b/c/d');
+    });
+  });
+
+  test('withoutExtension', () {
+    expect(context.withoutExtension(''), '');
+    expect(context.withoutExtension('a'), 'a');
+    expect(context.withoutExtension('.a'), '.a');
+    expect(context.withoutExtension('a.b'), 'a');
+    expect(context.withoutExtension('a/b.c'), 'a/b');
+    expect(context.withoutExtension('a/b.c.d'), 'a/b.c');
+    expect(context.withoutExtension('a/'), 'a/');
+    expect(context.withoutExtension('a/b/'), 'a/b/');
+    expect(context.withoutExtension('a/.'), 'a/.');
+    expect(context.withoutExtension('a/.b'), 'a/.b');
+    expect(context.withoutExtension('a.b/c'), 'a.b/c');
+    expect(context.withoutExtension(r'a.b\c'), r'a');
+    expect(context.withoutExtension(r'a/b\c'), r'a/b\c');
+    expect(context.withoutExtension(r'a/b\c.d'), r'a/b\c');
+    expect(context.withoutExtension('a/b.c/'), 'a/b/');
+    expect(context.withoutExtension('a/b.c//'), 'a/b//');
+  });
+
+  group('fromUri', () {
+    test('with a URI', () {
+      expect(context.fromUri(Uri.parse('http://dartlang.org/path/to/foo')),
+          'http://dartlang.org/path/to/foo');
+      expect(context.fromUri(Uri.parse('http://dartlang.org/path/to/foo/')),
+          'http://dartlang.org/path/to/foo/');
+      expect(context.fromUri(Uri.parse('file:///path/to/foo')),
+          'file:///path/to/foo');
+      expect(context.fromUri(Uri.parse('foo/bar')), 'foo/bar');
+      expect(
+          context.fromUri(Uri.parse('http://dartlang.org/path/to/foo%23bar')),
+          'http://dartlang.org/path/to/foo%23bar');
+      // Since the resulting "path" is also a URL, special characters should
+      // remain percent-encoded in the result.
+      expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
+          r'_%7B_%7D_%60_%5E_%20_%22_%25_');
+    });
+
+    test('with a string', () {
+      expect(context.fromUri('http://dartlang.org/path/to/foo'),
+          'http://dartlang.org/path/to/foo');
+    });
+  });
+
+  test('toUri', () {
+    expect(context.toUri('http://dartlang.org/path/to/foo'),
+        Uri.parse('http://dartlang.org/path/to/foo'));
+    expect(context.toUri('http://dartlang.org/path/to/foo/'),
+        Uri.parse('http://dartlang.org/path/to/foo/'));
+    expect(context.toUri('path/to/foo/'), Uri.parse('path/to/foo/'));
+    expect(
+        context.toUri('file:///path/to/foo'), Uri.parse('file:///path/to/foo'));
+    expect(context.toUri('foo/bar'), Uri.parse('foo/bar'));
+    expect(context.toUri('http://dartlang.org/path/to/foo%23bar'),
+        Uri.parse('http://dartlang.org/path/to/foo%23bar'));
+    // Since the input path is also a URI, special characters should already
+    // be percent encoded there too.
+    expect(context.toUri(r'http://foo.com/_%7B_%7D_%60_%5E_%20_%22_%25_'),
+        Uri.parse('http://foo.com/_%7B_%7D_%60_%5E_%20_%22_%25_'));
+    expect(context.toUri(r'_%7B_%7D_%60_%5E_%20_%22_%25_'),
+        Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_'));
+  });
+
+  group('prettyUri', () {
+    test('with a file: URI', () {
+      expect(context.prettyUri(Uri.parse('file:///root/path/a/b')),
+          'file:///root/path/a/b');
+    });
+
+    test('with an http: URI', () {
+      expect(context.prettyUri('http://dartlang.org/root/path/a/b'), 'a/b');
+      expect(context.prettyUri('http://dartlang.org/root/path/a/../b'), 'b');
+      expect(context.prettyUri('http://dartlang.org/other/path/a/b'),
+          'http://dartlang.org/other/path/a/b');
+      expect(context.prettyUri('http://pub.dartlang.org/root/path'),
+          'http://pub.dartlang.org/root/path');
+      expect(context.prettyUri('http://dartlang.org/root/other'), '../other');
+    });
+
+    test('with a relative URI', () {
+      expect(context.prettyUri('a/b'), 'a/b');
+    });
+
+    test('with a root-relative URI', () {
+      expect(context.prettyUri('/a/b'), '/a/b');
+    });
+
+    test('with a Uri object', () {
+      expect(context.prettyUri(Uri.parse('a/b')), 'a/b');
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/path/test/utils.dart b/mojo/public/dart/third_party/path/test/utils.dart
new file mode 100644
index 0000000..1730798
--- /dev/null
+++ b/mojo/public/dart/third_party/path/test/utils.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library path.test.utils;
+
+import "package:unittest/unittest.dart";
+import "package:path/path.dart" as path;
+
+/// A matcher for a closure that throws a [path.PathException].
+final throwsPathException = throwsA(new isInstanceOf<path.PathException>());
diff --git a/mojo/public/dart/third_party/path/test/windows_test.dart b/mojo/public/dart/third_party/path/test/windows_test.dart
new file mode 100644
index 0000000..6942837
--- /dev/null
+++ b/mojo/public/dart/third_party/path/test/windows_test.dart
@@ -0,0 +1,676 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library path.test.windows_test;
+
+import 'package:unittest/unittest.dart';
+import 'package:path/path.dart' as path;
+
+import 'utils.dart';
+
+main() {
+  var context =
+      new path.Context(style: path.Style.windows, current: r'C:\root\path');
+
+  group('separator', () {
+    expect(context.separator, '\\');
+  });
+
+  test('extension', () {
+    expect(context.extension(''), '');
+    expect(context.extension('.'), '');
+    expect(context.extension('..'), '');
+    expect(context.extension('a/..'), '');
+    expect(context.extension('foo.dart'), '.dart');
+    expect(context.extension('foo.dart.js'), '.js');
+    expect(context.extension('foo bar\gule fisk.dart.js'), '.js');
+    expect(context.extension(r'a.b\c'), '');
+    expect(context.extension('a.b/c.d'), '.d');
+    expect(context.extension(r'~\.bashrc'), '');
+    expect(context.extension(r'a.b/c'), r'');
+    expect(context.extension(r'foo.dart\'), '.dart');
+    expect(context.extension(r'foo.dart\\'), '.dart');
+  });
+
+  test('rootPrefix', () {
+    expect(context.rootPrefix(''), '');
+    expect(context.rootPrefix('a'), '');
+    expect(context.rootPrefix(r'a\b'), '');
+    expect(context.rootPrefix(r'C:\a\c'), r'C:\');
+    expect(context.rootPrefix('C:\\'), r'C:\');
+    expect(context.rootPrefix('C:/'), 'C:/');
+    expect(context.rootPrefix(r'\\server\share\a\b'), r'\\server\share');
+    expect(context.rootPrefix(r'\\server\share'), r'\\server\share');
+    expect(context.rootPrefix(r'\\server\'), r'\\server\');
+    expect(context.rootPrefix(r'\\server'), r'\\server');
+    expect(context.rootPrefix(r'\a\b'), r'\');
+    expect(context.rootPrefix(r'/a/b'), r'/');
+    expect(context.rootPrefix(r'\'), r'\');
+    expect(context.rootPrefix(r'/'), r'/');
+  });
+
+  test('dirname', () {
+    expect(context.dirname(r''), '.');
+    expect(context.dirname(r'a'), '.');
+    expect(context.dirname(r'a\b'), 'a');
+    expect(context.dirname(r'a\b\c'), r'a\b');
+    expect(context.dirname(r'a\b.c'), 'a');
+    expect(context.dirname(r'a\'), '.');
+    expect(context.dirname('a/'), '.');
+    expect(context.dirname(r'a\.'), 'a');
+    expect(context.dirname(r'a\b/c'), r'a\b');
+    expect(context.dirname(r'C:\a'), r'C:\');
+    expect(context.dirname(r'C:\\\a'), r'C:\');
+    expect(context.dirname(r'C:\'), r'C:\');
+    expect(context.dirname(r'C:\\\'), r'C:\');
+    expect(context.dirname(r'a\b\'), r'a');
+    expect(context.dirname(r'a/b\c'), 'a/b');
+    expect(context.dirname(r'a\\'), r'.');
+    expect(context.dirname(r'a\b\\'), 'a');
+    expect(context.dirname(r'a\\b'), 'a');
+    expect(context.dirname(r'foo bar\gule fisk'), 'foo bar');
+    expect(context.dirname(r'\\server\share'), r'\\server\share');
+    expect(context.dirname(r'\\server\share\dir'), r'\\server\share');
+    expect(context.dirname(r'\a'), r'\');
+    expect(context.dirname(r'/a'), r'/');
+    expect(context.dirname(r'\'), r'\');
+    expect(context.dirname(r'/'), r'/');
+  });
+
+  test('basename', () {
+    expect(context.basename(r''), '');
+    expect(context.basename(r'.'), '.');
+    expect(context.basename(r'..'), '..');
+    expect(context.basename(r'.hest'), '.hest');
+    expect(context.basename(r'a'), 'a');
+    expect(context.basename(r'a\b'), 'b');
+    expect(context.basename(r'a\b\c'), 'c');
+    expect(context.basename(r'a\b.c'), 'b.c');
+    expect(context.basename(r'a\'), 'a');
+    expect(context.basename(r'a/'), 'a');
+    expect(context.basename(r'a\.'), '.');
+    expect(context.basename(r'a\b/c'), r'c');
+    expect(context.basename(r'C:\a'), 'a');
+    expect(context.basename(r'C:\'), r'C:\');
+    expect(context.basename(r'a\b\'), 'b');
+    expect(context.basename(r'a/b\c'), 'c');
+    expect(context.basename(r'a\\'), 'a');
+    expect(context.basename(r'a\b\\'), 'b');
+    expect(context.basename(r'a\\b'), 'b');
+    expect(context.basename(r'a\\b'), 'b');
+    expect(context.basename(r'a\fisk hest.ma pa'), 'fisk hest.ma pa');
+    expect(context.basename(r'\\server\share'), r'\\server\share');
+    expect(context.basename(r'\\server\share\dir'), r'dir');
+    expect(context.basename(r'\a'), r'a');
+    expect(context.basename(r'/a'), r'a');
+    expect(context.basename(r'\'), r'\');
+    expect(context.basename(r'/'), r'/');
+  });
+
+  test('basenameWithoutExtension', () {
+    expect(context.basenameWithoutExtension(''), '');
+    expect(context.basenameWithoutExtension('.'), '.');
+    expect(context.basenameWithoutExtension('..'), '..');
+    expect(context.basenameWithoutExtension('.hest'), '.hest');
+    expect(context.basenameWithoutExtension('a'), 'a');
+    expect(context.basenameWithoutExtension(r'a\b'), 'b');
+    expect(context.basenameWithoutExtension(r'a\b\c'), 'c');
+    expect(context.basenameWithoutExtension(r'a\b.c'), 'b');
+    expect(context.basenameWithoutExtension(r'a\'), 'a');
+    expect(context.basenameWithoutExtension(r'a\.'), '.');
+    expect(context.basenameWithoutExtension(r'a\b/c'), r'c');
+    expect(context.basenameWithoutExtension(r'a\.bashrc'), '.bashrc');
+    expect(context.basenameWithoutExtension(r'a\b\c.d.e'), 'c.d');
+    expect(context.basenameWithoutExtension(r'a\\'), 'a');
+    expect(context.basenameWithoutExtension(r'a\b\\'), 'b');
+    expect(context.basenameWithoutExtension(r'a\\b'), 'b');
+    expect(context.basenameWithoutExtension(r'a\b.c\'), 'b');
+    expect(context.basenameWithoutExtension(r'a\b.c\\'), 'b');
+    expect(context.basenameWithoutExtension(r'C:\f h.ma pa.f s'), 'f h.ma pa');
+  });
+
+  test('isAbsolute', () {
+    expect(context.isAbsolute(''), false);
+    expect(context.isAbsolute('.'), false);
+    expect(context.isAbsolute('..'), false);
+    expect(context.isAbsolute('a'), false);
+    expect(context.isAbsolute(r'a\b'), false);
+    expect(context.isAbsolute(r'\a\b'), true);
+    expect(context.isAbsolute(r'\'), true);
+    expect(context.isAbsolute(r'/a/b'), true);
+    expect(context.isAbsolute(r'/'), true);
+    expect(context.isAbsolute('~'), false);
+    expect(context.isAbsolute('.'), false);
+    expect(context.isAbsolute(r'..\a'), false);
+    expect(context.isAbsolute(r'a:/a\b'), true);
+    expect(context.isAbsolute(r'D:/a/b'), true);
+    expect(context.isAbsolute(r'c:\'), true);
+    expect(context.isAbsolute(r'B:\'), true);
+    expect(context.isAbsolute(r'c:\a'), true);
+    expect(context.isAbsolute(r'C:\a'), true);
+    expect(context.isAbsolute(r'\\server\share'), true);
+    expect(context.isAbsolute(r'\\server\share\path'), true);
+  });
+
+  test('isRelative', () {
+    expect(context.isRelative(''), true);
+    expect(context.isRelative('.'), true);
+    expect(context.isRelative('..'), true);
+    expect(context.isRelative('a'), true);
+    expect(context.isRelative(r'a\b'), true);
+    expect(context.isRelative(r'\a\b'), false);
+    expect(context.isRelative(r'\'), false);
+    expect(context.isRelative(r'/a/b'), false);
+    expect(context.isRelative(r'/'), false);
+    expect(context.isRelative('~'), true);
+    expect(context.isRelative('.'), true);
+    expect(context.isRelative(r'..\a'), true);
+    expect(context.isRelative(r'a:/a\b'), false);
+    expect(context.isRelative(r'D:/a/b'), false);
+    expect(context.isRelative(r'c:\'), false);
+    expect(context.isRelative(r'B:\'), false);
+    expect(context.isRelative(r'c:\a'), false);
+    expect(context.isRelative(r'C:\a'), false);
+    expect(context.isRelative(r'\\server\share'), false);
+    expect(context.isRelative(r'\\server\share\path'), false);
+  });
+
+  test('isRootRelative', () {
+    expect(context.isRootRelative(''), false);
+    expect(context.isRootRelative('.'), false);
+    expect(context.isRootRelative('..'), false);
+    expect(context.isRootRelative('a'), false);
+    expect(context.isRootRelative(r'a\b'), false);
+    expect(context.isRootRelative(r'\a\b'), true);
+    expect(context.isRootRelative(r'\'), true);
+    expect(context.isRootRelative(r'/a/b'), true);
+    expect(context.isRootRelative(r'/'), true);
+    expect(context.isRootRelative('~'), false);
+    expect(context.isRootRelative('.'), false);
+    expect(context.isRootRelative(r'..\a'), false);
+    expect(context.isRootRelative(r'a:/a\b'), false);
+    expect(context.isRootRelative(r'D:/a/b'), false);
+    expect(context.isRootRelative(r'c:\'), false);
+    expect(context.isRootRelative(r'B:\'), false);
+    expect(context.isRootRelative(r'c:\a'), false);
+    expect(context.isRootRelative(r'C:\a'), false);
+    expect(context.isRootRelative(r'\\server\share'), false);
+    expect(context.isRootRelative(r'\\server\share\path'), false);
+  });
+
+  group('join', () {
+    test('allows up to eight parts', () {
+      expect(context.join('a'), 'a');
+      expect(context.join('a', 'b'), r'a\b');
+      expect(context.join('a', 'b', 'c'), r'a\b\c');
+      expect(context.join('a', 'b', 'c', 'd'), r'a\b\c\d');
+      expect(context.join('a', 'b', 'c', 'd', 'e'), r'a\b\c\d\e');
+      expect(context.join('a', 'b', 'c', 'd', 'e', 'f'), r'a\b\c\d\e\f');
+      expect(context.join('a', 'b', 'c', 'd', 'e', 'f', 'g'), r'a\b\c\d\e\f\g');
+      expect(context.join('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'),
+          r'a\b\c\d\e\f\g\h');
+    });
+
+    test('does not add separator if a part ends or begins in one', () {
+      expect(context.join(r'a\', 'b', r'c\', 'd'), r'a\b\c\d');
+      expect(context.join('a/', 'b'), r'a/b');
+    });
+
+    test('ignores parts before an absolute path', () {
+      expect(context.join('a', r'\b', r'\c', 'd'), r'\c\d');
+      expect(context.join('a', '/b', '/c', 'd'), r'/c\d');
+      expect(context.join('a', r'c:\b', 'c', 'd'), r'c:\b\c\d');
+      expect(context.join('a', r'\\b\c', r'\\d\e', 'f'), r'\\d\e\f');
+      expect(context.join('a', r'c:\b', r'\c', 'd'), r'c:\c\d');
+      expect(context.join('a', r'\\b\c\d', r'\e', 'f'), r'\\b\c\e\f');
+    });
+
+    test('ignores trailing nulls', () {
+      expect(context.join('a', null), equals('a'));
+      expect(context.join('a', 'b', 'c', null, null), equals(r'a\b\c'));
+    });
+
+    test('ignores empty strings', () {
+      expect(context.join(''), '');
+      expect(context.join('', ''), '');
+      expect(context.join('', 'a'), 'a');
+      expect(context.join('a', '', 'b', '', '', '', 'c'), r'a\b\c');
+      expect(context.join('a', 'b', ''), r'a\b');
+    });
+
+    test('disallows intermediate nulls', () {
+      expect(() => context.join('a', null, 'b'), throwsArgumentError);
+      expect(() => context.join(null, 'a'), throwsArgumentError);
+    });
+
+    test('join does not modify internal ., .., or trailing separators', () {
+      expect(context.join('a/', 'b/c/'), 'a/b/c/');
+      expect(context.join(r'a\b\./c\..\\', r'd\..\.\..\\e\f\\'),
+          r'a\b\./c\..\\d\..\.\..\\e\f\\');
+      expect(context.join(r'a\b', r'c\..\..\..\..'), r'a\b\c\..\..\..\..');
+      expect(context.join(r'a', 'b${context.separator}'), r'a\b\');
+    });
+  });
+
+  group('joinAll', () {
+    test('allows more than eight parts', () {
+      expect(context.joinAll(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']),
+          r'a\b\c\d\e\f\g\h\i');
+    });
+
+    test('does not add separator if a part ends or begins in one', () {
+      expect(context.joinAll([r'a\', 'b', r'c\', 'd']), r'a\b\c\d');
+      expect(context.joinAll(['a/', 'b']), r'a/b');
+    });
+
+    test('ignores parts before an absolute path', () {
+      expect(context.joinAll(['a', r'\b', r'\c', 'd']), r'\c\d');
+      expect(context.joinAll(['a', '/b', '/c', 'd']), r'/c\d');
+      expect(context.joinAll(['a', r'c:\b', 'c', 'd']), r'c:\b\c\d');
+      expect(context.joinAll(['a', r'\\b\c', r'\\d\e', 'f']), r'\\d\e\f');
+      expect(context.joinAll(['a', r'c:\b', r'\c', 'd']), r'c:\c\d');
+      expect(context.joinAll(['a', r'\\b\c\d', r'\e', 'f']), r'\\b\c\e\f');
+    });
+  });
+
+  group('split', () {
+    test('simple cases', () {
+      expect(context.split(''), []);
+      expect(context.split('.'), ['.']);
+      expect(context.split('..'), ['..']);
+      expect(context.split('foo'), equals(['foo']));
+      expect(context.split(r'foo\bar.txt'), equals(['foo', 'bar.txt']));
+      expect(context.split(r'foo\bar/baz'), equals(['foo', 'bar', 'baz']));
+      expect(context.split(r'foo\..\bar\.\baz'),
+          equals(['foo', '..', 'bar', '.', 'baz']));
+      expect(context.split(r'foo\\bar\\\baz'), equals(['foo', 'bar', 'baz']));
+      expect(context.split(r'foo\/\baz'), equals(['foo', 'baz']));
+      expect(context.split('.'), equals(['.']));
+      expect(context.split(''), equals([]));
+      expect(context.split('foo/'), equals(['foo']));
+      expect(context.split(r'C:\'), equals([r'C:\']));
+    });
+
+    test('includes the root for absolute paths', () {
+      expect(context.split(r'C:\foo\bar\baz'),
+          equals([r'C:\', 'foo', 'bar', 'baz']));
+      expect(context.split(r'C:\\'), equals([r'C:\']));
+
+      expect(context.split(r'\\server\share\foo\bar\baz'),
+          equals([r'\\server\share', 'foo', 'bar', 'baz']));
+      expect(context.split(r'\\server\share'), equals([r'\\server\share']));
+
+      expect(
+          context.split(r'\foo\bar\baz'), equals([r'\', 'foo', 'bar', 'baz']));
+      expect(context.split(r'\'), equals([r'\']));
+    });
+  });
+
+  group('normalize', () {
+    test('simple cases', () {
+      expect(context.normalize(''), '.');
+      expect(context.normalize('.'), '.');
+      expect(context.normalize('..'), '..');
+      expect(context.normalize('a'), 'a');
+      expect(context.normalize('/a/b'), r'\a\b');
+      expect(context.normalize(r'\'), r'\');
+      expect(context.normalize(r'\a\b'), r'\a\b');
+      expect(context.normalize('/'), r'\');
+      expect(context.normalize('C:/'), r'C:\');
+      expect(context.normalize(r'C:\'), r'C:\');
+      expect(context.normalize(r'\\server\share'), r'\\server\share');
+      expect(context.normalize('a\\.\\\xc5\u0bf8-;\u{1f085}\u{00}\\c\\d\\..\\'),
+          'a\\\xc5\u0bf8-;\u{1f085}\u{00}\x5cc');
+    });
+
+    test('collapses redundant separators', () {
+      expect(context.normalize(r'a\b\c'), r'a\b\c');
+      expect(context.normalize(r'a\\b\\\c\\\\d'), r'a\b\c\d');
+    });
+
+    test('eliminates "." parts', () {
+      expect(context.normalize(r'.\'), '.');
+      expect(context.normalize(r'c:\.'), r'c:\');
+      expect(context.normalize(r'B:\.\'), r'B:\');
+      expect(context.normalize(r'\\server\share\.'), r'\\server\share');
+      expect(context.normalize(r'.\.'), '.');
+      expect(context.normalize(r'a\.\b'), r'a\b');
+      expect(context.normalize(r'a\.b\c'), r'a\.b\c');
+      expect(context.normalize(r'a\./.\b\.\c'), r'a\b\c');
+      expect(context.normalize(r'.\./a'), 'a');
+      expect(context.normalize(r'a/.\.'), 'a');
+      expect(context.normalize(r'\.'), r'\');
+      expect(context.normalize('/.'), r'\');
+    });
+
+    test('eliminates ".." parts', () {
+      expect(context.normalize('..'), '..');
+      expect(context.normalize(r'..\'), '..');
+      expect(context.normalize(r'..\..\..'), r'..\..\..');
+      expect(context.normalize(r'../..\..\'), r'..\..\..');
+      expect(context.normalize(r'\\server\share\..'), r'\\server\share');
+      expect(
+          context.normalize(r'\\server\share\..\../..\a'), r'\\server\share\a');
+      expect(context.normalize(r'c:\..'), r'c:\');
+      expect(context.normalize(r'A:/..\..\..'), r'A:\');
+      expect(context.normalize(r'b:\..\..\..\a'), r'b:\a');
+      expect(context.normalize(r'b:\r\..\..\..\a\c\.\..'), r'b:\a');
+      expect(context.normalize(r'a\..'), '.');
+      expect(context.normalize(r'..\a'), r'..\a');
+      expect(context.normalize(r'c:\..\a'), r'c:\a');
+      expect(context.normalize(r'\..\a'), r'\a');
+      expect(context.normalize(r'a\b\..'), 'a');
+      expect(context.normalize(r'..\a\b\..'), r'..\a');
+      expect(context.normalize(r'a\..\b'), 'b');
+      expect(context.normalize(r'a\.\..\b'), 'b');
+      expect(context.normalize(r'a\b\c\..\..\d\e\..'), r'a\d');
+      expect(context.normalize(r'a\b\..\..\..\..\c'), r'..\..\c');
+      expect(context.normalize(r'a/b/c/../../..d/./.e/f././'), r'a\..d\.e\f.');
+    });
+
+    test('removes trailing separators', () {
+      expect(context.normalize(r'.\'), '.');
+      expect(context.normalize(r'.\\'), '.');
+      expect(context.normalize(r'a/'), 'a');
+      expect(context.normalize(r'a\b\'), r'a\b');
+      expect(context.normalize(r'a\b\\\'), r'a\b');
+    });
+
+    test('normalizes separators', () {
+      expect(context.normalize(r'a/b\c'), r'a\b\c');
+    });
+  });
+
+  group('relative', () {
+    group('from absolute root', () {
+      test('given absolute path in root', () {
+        expect(context.relative(r'C:\'), r'..\..');
+        expect(context.relative(r'C:\root'), '..');
+        expect(context.relative(r'\root'), '..');
+        expect(context.relative(r'C:\root\path'), '.');
+        expect(context.relative(r'\root\path'), '.');
+        expect(context.relative(r'C:\root\path\a'), 'a');
+        expect(context.relative(r'\root\path\a'), 'a');
+        expect(context.relative(r'C:\root\path\a\b.txt'), r'a\b.txt');
+        expect(context.relative(r'C:\root\a\b.txt'), r'..\a\b.txt');
+        expect(context.relative(r'C:/'), r'..\..');
+        expect(context.relative(r'C:/root'), '..');
+        expect(context.relative(r'c:\'), r'..\..');
+        expect(context.relative(r'c:\root'), '..');
+      });
+
+      test('given absolute path outside of root', () {
+        expect(context.relative(r'C:\a\b'), r'..\..\a\b');
+        expect(context.relative(r'\a\b'), r'..\..\a\b');
+        expect(context.relative(r'C:\root\path\a'), 'a');
+        expect(context.relative(r'C:\root\path\a\b.txt'), r'a\b.txt');
+        expect(context.relative(r'C:\root\a\b.txt'), r'..\a\b.txt');
+        expect(context.relative(r'C:/a/b'), r'..\..\a\b');
+        expect(context.relative(r'C:/root/path/a'), 'a');
+        expect(context.relative(r'c:\a\b'), r'..\..\a\b');
+        expect(context.relative(r'c:\root\path\a'), 'a');
+      });
+
+      test('given absolute path on different drive', () {
+        expect(context.relative(r'D:\a\b'), r'D:\a\b');
+      });
+
+      test('given relative path', () {
+        // The path is considered relative to the root, so it basically just
+        // normalizes.
+        expect(context.relative(''), '.');
+        expect(context.relative('.'), '.');
+        expect(context.relative('a'), 'a');
+        expect(context.relative(r'a\b.txt'), r'a\b.txt');
+        expect(context.relative(r'..\a\b.txt'), r'..\a\b.txt');
+        expect(context.relative(r'a\.\b\..\c.txt'), r'a\c.txt');
+      });
+
+      // Regression
+      test('from root-only path', () {
+        expect(context.relative(r'C:\', from: r'C:\'), '.');
+        expect(context.relative(r'C:\root\path', from: r'C:\'), r'root\path');
+      });
+    });
+
+    group('from relative root', () {
+      var r = new path.Context(style: path.Style.windows, current: r'foo\bar');
+
+      test('given absolute path', () {
+        expect(r.relative(r'C:\'), equals(r'C:\'));
+        expect(r.relative(r'C:\a\b'), equals(r'C:\a\b'));
+        expect(r.relative(r'\'), equals(r'\'));
+        expect(r.relative(r'\a\b'), equals(r'\a\b'));
+      });
+
+      test('given relative path', () {
+        // The path is considered relative to the root, so it basically just
+        // normalizes.
+        expect(r.relative(''), '.');
+        expect(r.relative('.'), '.');
+        expect(r.relative('..'), '..');
+        expect(r.relative('a'), 'a');
+        expect(r.relative(r'a\b.txt'), r'a\b.txt');
+        expect(r.relative(r'..\a/b.txt'), r'..\a\b.txt');
+        expect(r.relative(r'a\./b\../c.txt'), r'a\c.txt');
+      });
+    });
+
+    group('from root-relative root', () {
+      var r = new path.Context(style: path.Style.windows, current: r'\foo\bar');
+
+      test('given absolute path', () {
+        expect(r.relative(r'C:\'), equals(r'C:\'));
+        expect(r.relative(r'C:\a\b'), equals(r'C:\a\b'));
+        expect(r.relative(r'\'), equals(r'..\..'));
+        expect(r.relative(r'\a\b'), equals(r'..\..\a\b'));
+        expect(r.relative('/'), equals(r'..\..'));
+        expect(r.relative('/a/b'), equals(r'..\..\a\b'));
+      });
+
+      test('given relative path', () {
+        // The path is considered relative to the root, so it basically just
+        // normalizes.
+        expect(r.relative(''), '.');
+        expect(r.relative('.'), '.');
+        expect(r.relative('..'), '..');
+        expect(r.relative('a'), 'a');
+        expect(r.relative(r'a\b.txt'), r'a\b.txt');
+        expect(r.relative(r'..\a/b.txt'), r'..\a\b.txt');
+        expect(r.relative(r'a\./b\../c.txt'), r'a\c.txt');
+      });
+    });
+
+    test('from a root with extension', () {
+      var r =
+          new path.Context(style: path.Style.windows, current: r'C:\dir.ext');
+      expect(r.relative(r'C:\dir.ext\file'), 'file');
+    });
+
+    test('with a root parameter', () {
+      expect(context.relative(r'C:\foo\bar\baz', from: r'C:\foo\bar'),
+          equals('baz'));
+      expect(
+          context.relative('..', from: r'C:\foo\bar'), equals(r'..\..\root'));
+      expect(context.relative('..', from: r'D:\foo\bar'), equals(r'C:\root'));
+      expect(context.relative(r'C:\foo\bar\baz', from: r'foo\bar'),
+          equals(r'..\..\..\..\foo\bar\baz'));
+      expect(context.relative('..', from: r'foo\bar'), equals(r'..\..\..'));
+    });
+
+    test('with a root parameter and a relative root', () {
+      var r = new path.Context(
+          style: path.Style.windows, current: r'relative\root');
+      expect(r.relative(r'C:\foo\bar\baz', from: r'C:\foo\bar'), equals('baz'));
+      expect(() => r.relative('..', from: r'C:\foo\bar'), throwsPathException);
+      expect(r.relative(r'C:\foo\bar\baz', from: r'foo\bar'),
+          equals(r'C:\foo\bar\baz'));
+      expect(r.relative('..', from: r'foo\bar'), equals(r'..\..\..'));
+    });
+
+    test('given absolute with different root prefix', () {
+      expect(context.relative(r'D:\a\b'), r'D:\a\b');
+      expect(context.relative(r'\\server\share\a\b'), r'\\server\share\a\b');
+    });
+
+    test('from a . root', () {
+      var r = new path.Context(style: path.Style.windows, current: '.');
+      expect(r.relative(r'C:\foo\bar\baz'), equals(r'C:\foo\bar\baz'));
+      expect(r.relative(r'foo\bar\baz'), equals(r'foo\bar\baz'));
+      expect(r.relative(r'\foo\bar\baz'), equals(r'\foo\bar\baz'));
+    });
+  });
+
+  group('isWithin', () {
+    test('simple cases', () {
+      expect(context.isWithin(r'foo\bar', r'foo\bar'), isFalse);
+      expect(context.isWithin(r'foo\bar', r'foo\bar\baz'), isTrue);
+      expect(context.isWithin(r'foo\bar', r'foo\baz'), isFalse);
+      expect(context.isWithin(r'foo\bar', r'..\path\foo\bar\baz'), isTrue);
+      expect(context.isWithin(r'C:\', r'C:\foo\bar'), isTrue);
+      expect(context.isWithin(r'C:\', r'D:\foo\bar'), isFalse);
+      expect(context.isWithin(r'C:\', r'\foo\bar'), isTrue);
+      expect(context.isWithin(r'C:\foo', r'\foo\bar'), isTrue);
+      expect(context.isWithin(r'C:\foo', r'\bar\baz'), isFalse);
+      expect(context.isWithin(r'baz', r'C:\root\path\baz\bang'), isTrue);
+      expect(context.isWithin(r'baz', r'C:\root\path\bang\baz'), isFalse);
+    });
+
+    test('from a relative root', () {
+      var r = new path.Context(style: path.Style.windows, current: r'foo\bar');
+      expect(r.isWithin('.', r'a\b\c'), isTrue);
+      expect(r.isWithin('.', r'..\a\b\c'), isFalse);
+      expect(r.isWithin('.', r'..\..\a\foo\b\c'), isFalse);
+      expect(r.isWithin(r'C:\', r'C:\baz\bang'), isTrue);
+      expect(r.isWithin('.', r'C:\baz\bang'), isFalse);
+    });
+  });
+
+  group('absolute', () {
+    test('allows up to seven parts', () {
+      expect(context.absolute('a'), r'C:\root\path\a');
+      expect(context.absolute('a', 'b'), r'C:\root\path\a\b');
+      expect(context.absolute('a', 'b', 'c'), r'C:\root\path\a\b\c');
+      expect(context.absolute('a', 'b', 'c', 'd'), r'C:\root\path\a\b\c\d');
+      expect(
+          context.absolute('a', 'b', 'c', 'd', 'e'), r'C:\root\path\a\b\c\d\e');
+      expect(context.absolute('a', 'b', 'c', 'd', 'e', 'f'),
+          r'C:\root\path\a\b\c\d\e\f');
+      expect(context.absolute('a', 'b', 'c', 'd', 'e', 'f', 'g'),
+          r'C:\root\path\a\b\c\d\e\f\g');
+    });
+
+    test('does not add separator if a part ends in one', () {
+      expect(context.absolute(r'a\', 'b', r'c\', 'd'), r'C:\root\path\a\b\c\d');
+      expect(context.absolute('a/', 'b'), r'C:\root\path\a/b');
+    });
+
+    test('ignores parts before an absolute path', () {
+      expect(context.absolute('a', '/b', '/c', 'd'), r'C:\c\d');
+      expect(context.absolute('a', r'\b', r'\c', 'd'), r'C:\c\d');
+      expect(context.absolute('a', r'c:\b', 'c', 'd'), r'c:\b\c\d');
+      expect(context.absolute('a', r'\\b\c', r'\\d\e', 'f'), r'\\d\e\f');
+    });
+  });
+
+  test('withoutExtension', () {
+    expect(context.withoutExtension(''), '');
+    expect(context.withoutExtension('a'), 'a');
+    expect(context.withoutExtension('.a'), '.a');
+    expect(context.withoutExtension('a.b'), 'a');
+    expect(context.withoutExtension(r'a\b.c'), r'a\b');
+    expect(context.withoutExtension(r'a\b.c.d'), r'a\b.c');
+    expect(context.withoutExtension(r'a\'), r'a\');
+    expect(context.withoutExtension(r'a\b\'), r'a\b\');
+    expect(context.withoutExtension(r'a\.'), r'a\.');
+    expect(context.withoutExtension(r'a\.b'), r'a\.b');
+    expect(context.withoutExtension(r'a.b\c'), r'a.b\c');
+    expect(context.withoutExtension(r'a/b.c/d'), r'a/b.c/d');
+    expect(context.withoutExtension(r'a\b/c'), r'a\b/c');
+    expect(context.withoutExtension(r'a\b/c.d'), r'a\b/c');
+    expect(context.withoutExtension(r'a.b/c'), r'a.b/c');
+    expect(context.withoutExtension(r'a\b.c\'), r'a\b\');
+  });
+
+  group('fromUri', () {
+    test('with a URI', () {
+      expect(context.fromUri(Uri.parse('file:///C:/path/to/foo')),
+          r'C:\path\to\foo');
+      expect(context.fromUri(Uri.parse('file://server/share/path/to/foo')),
+          r'\\server\share\path\to\foo');
+      expect(context.fromUri(Uri.parse('file:///C:/')), r'C:\');
+      expect(
+          context.fromUri(Uri.parse('file://server/share')), r'\\server\share');
+      expect(context.fromUri(Uri.parse('foo/bar')), r'foo\bar');
+      expect(context.fromUri(Uri.parse('/C:/path/to/foo')), r'C:\path\to\foo');
+      expect(
+          context.fromUri(Uri.parse('///C:/path/to/foo')), r'C:\path\to\foo');
+      expect(context.fromUri(Uri.parse('//server/share/path/to/foo')),
+          r'\\server\share\path\to\foo');
+      expect(context.fromUri(Uri.parse('file:///C:/path/to/foo%23bar')),
+          r'C:\path\to\foo#bar');
+      expect(
+          context.fromUri(Uri.parse('file://server/share/path/to/foo%23bar')),
+          r'\\server\share\path\to\foo#bar');
+      expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
+          r'_{_}_`_^_ _"_%_');
+      expect(() => context.fromUri(Uri.parse('http://dartlang.org')),
+          throwsArgumentError);
+    });
+
+    test('with a string', () {
+      expect(context.fromUri('file:///C:/path/to/foo'), r'C:\path\to\foo');
+    });
+  });
+
+  test('toUri', () {
+    expect(
+        context.toUri(r'C:\path\to\foo'), Uri.parse('file:///C:/path/to/foo'));
+    expect(context.toUri(r'C:\path\to\foo\'),
+        Uri.parse('file:///C:/path/to/foo/'));
+    expect(context.toUri(r'path\to\foo\'), Uri.parse('path/to/foo/'));
+    expect(context.toUri(r'C:\'), Uri.parse('file:///C:/'));
+    expect(context.toUri(r'\\server\share'), Uri.parse('file://server/share'));
+    expect(
+        context.toUri(r'\\server\share\'), Uri.parse('file://server/share/'));
+    expect(context.toUri(r'foo\bar'), Uri.parse('foo/bar'));
+    expect(context.toUri(r'C:\path\to\foo#bar'),
+        Uri.parse('file:///C:/path/to/foo%23bar'));
+    expect(context.toUri(r'\\server\share\path\to\foo#bar'),
+        Uri.parse('file://server/share/path/to/foo%23bar'));
+    expect(context.toUri(r'C:\_{_}_`_^_ _"_%_'),
+        Uri.parse('file:///C:/_%7B_%7D_%60_%5E_%20_%22_%25_'));
+    expect(context.toUri(r'_{_}_`_^_ _"_%_'),
+        Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_'));
+  });
+
+  group('prettyUri', () {
+    test('with a file: URI', () {
+      expect(context.prettyUri('file:///C:/root/path/a/b'), r'a\b');
+      expect(context.prettyUri('file:///C:/root/path/a/../b'), r'b');
+      expect(
+          context.prettyUri('file:///C:/other/path/a/b'), r'C:\other\path\a\b');
+      expect(
+          context.prettyUri('file:///D:/root/path/a/b'), r'D:\root\path\a\b');
+      expect(context.prettyUri('file:///C:/root/other'), r'..\other');
+    });
+
+    test('with an http: URI', () {
+      expect(context.prettyUri('http://dartlang.org/a/b'),
+          'http://dartlang.org/a/b');
+    });
+
+    test('with a relative URI', () {
+      expect(context.prettyUri('a/b'), r'a\b');
+    });
+
+    test('with a root-relative URI', () {
+      expect(context.prettyUri('/D:/a/b'), r'D:\a\b');
+    });
+
+    test('with a Uri object', () {
+      expect(context.prettyUri(Uri.parse('a/b')), r'a\b');
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/plugin/._AUTHORS b/mojo/public/dart/third_party/plugin/._AUTHORS
new file mode 100644
index 0000000..8fb8ff1
--- /dev/null
+++ b/mojo/public/dart/third_party/plugin/._AUTHORS
Binary files differ
diff --git a/mojo/public/dart/third_party/plugin/._CHANGELOG.md b/mojo/public/dart/third_party/plugin/._CHANGELOG.md
new file mode 100644
index 0000000..8fb8ff1
--- /dev/null
+++ b/mojo/public/dart/third_party/plugin/._CHANGELOG.md
Binary files differ
diff --git a/mojo/public/dart/third_party/plugin/._CONTRIBUTING.md b/mojo/public/dart/third_party/plugin/._CONTRIBUTING.md
new file mode 100644
index 0000000..8fb8ff1
--- /dev/null
+++ b/mojo/public/dart/third_party/plugin/._CONTRIBUTING.md
Binary files differ
diff --git a/mojo/public/dart/third_party/plugin/._LICENSE b/mojo/public/dart/third_party/plugin/._LICENSE
new file mode 100644
index 0000000..8fb8ff1
--- /dev/null
+++ b/mojo/public/dart/third_party/plugin/._LICENSE
Binary files differ
diff --git a/mojo/public/dart/third_party/plugin/._README.md b/mojo/public/dart/third_party/plugin/._README.md
new file mode 100644
index 0000000..8fb8ff1
--- /dev/null
+++ b/mojo/public/dart/third_party/plugin/._README.md
Binary files differ
diff --git a/mojo/public/dart/third_party/plugin/.gitignore b/mojo/public/dart/third_party/plugin/.gitignore
new file mode 100644
index 0000000..938f99e
--- /dev/null
+++ b/mojo/public/dart/third_party/plugin/.gitignore
@@ -0,0 +1,7 @@
+.idea
+.pub
+packages
+build
+.project
+.settings
+pubspec.lock
diff --git a/mojo/public/dart/third_party/plugin/AUTHORS b/mojo/public/dart/third_party/plugin/AUTHORS
new file mode 100644
index 0000000..e8063a8
--- /dev/null
+++ b/mojo/public/dart/third_party/plugin/AUTHORS
@@ -0,0 +1,6 @@
+# Below is a list of people and organizations that have contributed
+# to the project. Names should be added to the list like so:
+#
+#   Name/Organization <email address>
+
+Google Inc.
diff --git a/mojo/public/dart/third_party/plugin/CHANGELOG.md b/mojo/public/dart/third_party/plugin/CHANGELOG.md
new file mode 100644
index 0000000..2a2d63c
--- /dev/null
+++ b/mojo/public/dart/third_party/plugin/CHANGELOG.md
@@ -0,0 +1,5 @@
+# Changelog
+
+## 0.0.1
+
+- Initial version
diff --git a/mojo/public/dart/third_party/plugin/CONTRIBUTING.md b/mojo/public/dart/third_party/plugin/CONTRIBUTING.md
new file mode 100644
index 0000000..6f5e0ea
--- /dev/null
+++ b/mojo/public/dart/third_party/plugin/CONTRIBUTING.md
@@ -0,0 +1,33 @@
+Want to contribute? Great! First, read this page (including the small print at
+the end).
+
+### Before you contribute
+Before we can use your code, you must sign the
+[Google Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual)
+(CLA), which you can do online. The CLA is necessary mainly because you own the
+copyright to your changes, even after your contribution becomes part of our
+codebase, so we need your permission to use and distribute your code. We also
+need to be sure of various other things—for instance that you'll tell us if you
+know that your code infringes on other people's patents. You don't have to sign
+the CLA until after you've submitted your code for review and a member has
+approved it, but you must do it before we can put your code into our codebase.
+
+Before you start working on a larger contribution, you should get in touch with
+us first through the issue tracker with your idea so that we can help out and
+possibly guide you. Coordinating up front makes it much easier to avoid
+frustration later on.
+
+### Code reviews
+All submissions, including submissions by project members, require review.
+
+### File headers
+All files in the project must start with the following header.
+
+    // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+    // for details. All rights reserved. Use of this source code is governed by a
+    // BSD-style license that can be found in the LICENSE file.
+
+### The small print
+Contributions made by corporations are covered by a different agreement than the
+one above, the
+[Software Grant and Corporate Contributor License Agreement](https://developers.google.com/open-source/cla/corporate).
diff --git a/mojo/public/dart/third_party/plugin/LICENSE b/mojo/public/dart/third_party/plugin/LICENSE
new file mode 100644
index 0000000..de31e1a
--- /dev/null
+++ b/mojo/public/dart/third_party/plugin/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2015, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/plugin/README.md b/mojo/public/dart/third_party/plugin/README.md
new file mode 100644
index 0000000..3d5c062
--- /dev/null
+++ b/mojo/public/dart/third_party/plugin/README.md
@@ -0,0 +1,33 @@
+# plugin
+
+Support for building plugins in Dart.
+
+This project defines a simple framework for defining plugins. A _plugin_ is the
+unit of extensibility for a host application.
+
+An _extension point_ represents one way of extending the host application. For
+example, a file viewer application might define an extension point to allow
+viewers for new file types to be added to the application.
+
+The host application must provide at least one extension point that plugins can
+extend. Every extension point must have a unique name associated with it, and
+should specify the type of the objects that will be accepted as extensions. In
+the example above, the extension point might require that all extensions
+implement the interface FileViewer.
+
+Any plugin can define extension points that other plugins can extend. The host
+application contributes its own extension point(s) by defining a plugin.
+
+An _extension_ is an object that a plugin associates with a particular extension
+point. To continue the example, a plugin that supports the viewing of .gif files
+would create an instance of GifFileViewer, a class that implements FileViewer.
+
+The framework in this package then connects the defined extensions with the
+defined extension points so that the separately contributed plugins can
+coordinate to accomplish the larger goal.
+
+## Features and bugs
+
+Please file feature requests and bugs at the [issue tracker][tracker].
+
+[tracker]: https://github.com/dart-lang/plugin/issues
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/plugin/lib/manager.dart b/mojo/public/dart/third_party/plugin/lib/manager.dart
new file mode 100644
index 0000000..4fd6e73
--- /dev/null
+++ b/mojo/public/dart/third_party/plugin/lib/manager.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library plugin.manager;
+
+import 'package:plugin/src/plugin_impl.dart';
+import 'package:plugin/plugin.dart';
+
+/**
+ * An object that manages the extension points for the host application.
+ */
+abstract class ExtensionManager {
+  /**
+   * Initialize a newly created manager.
+   */
+  factory ExtensionManager() = ExtensionManagerImpl;
+
+  /**
+   * Process each of the given [plugins] by allowing them to register extension
+   * points and extensions.
+   *
+   * An [ExtensionError] will be thrown if any of the plugins throws such an
+   * exception while registering with this manager.
+   */
+  void processPlugins(List<Plugin> plugins);
+}
diff --git a/mojo/public/dart/third_party/plugin/lib/plugin.dart b/mojo/public/dart/third_party/plugin/lib/plugin.dart
new file mode 100644
index 0000000..b0176f8
--- /dev/null
+++ b/mojo/public/dart/third_party/plugin/lib/plugin.dart
@@ -0,0 +1,130 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library plugin;
+
+/**
+ * A function used to register the given [extension] to the extension point with
+ * the given unique [identifier].
+ *
+ * An [ExtensionError] will be thrown if the [extension] is not appropriate
+ * for the extension point, such as an [extension] that does not implement the
+ * required interface.
+ */
+typedef void RegisterExtension(String identifier, Object extension);
+
+/**
+ * A function used to register an extension point with the given simple
+ * [identifier]. If given, the [validator] will be used to validate extensions
+ * to the extension point.
+ *
+ * An [ExtensionError] will be thrown if the extension point cannot be
+ * registered, such as when a plugin attempts to define two extension points
+ * with the same simple identifier.
+ */
+typedef ExtensionPoint RegisterExtensionPoint(String identifier,
+    [ValidateExtension validateExtension]);
+
+/**
+ * A function used by a plugin to validate an [extension] to a extension point.
+ *
+ * An [ExtensionError] should be thrown if the [extension] is not valid for the
+ * extension point, such as an [extension] that does not implement the required
+ * interface.
+ */
+typedef void ValidateExtension(Object extension);
+
+/**
+ * An exception indicating that an error occurred while attempting to register
+ * either an extension or an extension point.
+ *
+ * Clients are not expected to subtype this class.
+ */
+class ExtensionError implements Exception {
+  /**
+   * The message describing the error that occurred.
+   */
+  final String message;
+
+  /**
+   * Initialize a newly created error to have the given message.
+   */
+  ExtensionError(this.message);
+}
+
+/**
+ * A representation of an extension point.
+ *
+ * Clients are not expected to subtype this class.
+ */
+abstract class ExtensionPoint {
+  /**
+   * Return an immutable list containing all of the extensions that were
+   * registered for this extension point.
+   */
+  List<Object> get extensions;
+
+  /**
+   * Return the plugin that defined this extension point.
+   */
+  Plugin get plugin;
+
+  /**
+   * Return the identifier used to uniquely identify this extension point within
+   * the defining plugin.
+   */
+  String get simpleIdentifier;
+
+  /**
+   * Return the identifier used to uniquely identify this extension point. The
+   * unique identifier is the identifier for the plugin, followed by a period
+   * (`.`), followed by the [simpleIdentifier] for the extension point.
+   */
+  String get uniqueIdentifier;
+}
+
+/**
+ * A contribution to the host application that can extend the behavior of the
+ * application while also allowing other plugins to extend it's behavior.
+ *
+ * Clients are expected to subtype this class when implementing plugins.
+ */
+abstract class Plugin {
+  /**
+   * Return the identifier used to uniquely identify this plugin.
+   */
+  String get uniqueIdentifier;
+
+  /**
+   * Use the [register] function to register all of the extension points
+   * contributed by this plugin.
+   *
+   * Clients should not invoke the [register] function after this method has
+   * returned.
+   */
+  void registerExtensionPoints(RegisterExtensionPoint register);
+
+  /**
+   * Use the [register] function to register all of the extensions contributed
+   * by this plugin.
+   *
+   * Clients should not invoke the [register] function after this method has
+   * returned.
+   */
+  void registerExtensions(RegisterExtension register);
+
+  /**
+   * Return a unique identifier created from the unique identifier from the
+   * [plugin] and the [simpleIdentifier].
+   */
+  static String buildUniqueIdentifier(Plugin plugin, String simpleIdentifier) =>
+      join(plugin.uniqueIdentifier, simpleIdentifier);
+
+  /**
+   * Return an identifier created by joining the [pluginIdentifier] and the
+   * [simpleIdentifier].
+   */
+  static String join(String pluginIdentifier, String simpleIdentifier) =>
+      '$pluginIdentifier.$simpleIdentifier';
+}
diff --git a/mojo/public/dart/third_party/plugin/lib/src/plugin_impl.dart b/mojo/public/dart/third_party/plugin/lib/src/plugin_impl.dart
new file mode 100644
index 0000000..a65a0d3
--- /dev/null
+++ b/mojo/public/dart/third_party/plugin/lib/src/plugin_impl.dart
@@ -0,0 +1,119 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library plugin.src.plugin_impl;
+
+import 'dart:collection';
+
+import 'package:plugin/manager.dart';
+import 'package:plugin/plugin.dart';
+
+/**
+ * A concrete implementation of an [ExtensionManager].
+ */
+class ExtensionManagerImpl implements ExtensionManager {
+  /**
+   * A table mapping the id's of extension points to the corresponding
+   * extension points.
+   */
+  Map<String, ExtensionPointImpl> extensionPoints =
+      new HashMap<String, ExtensionPointImpl>();
+
+  @override
+  void processPlugins(List<Plugin> plugins) {
+    for (Plugin plugin in plugins) {
+      plugin.registerExtensionPoints((String identifier,
+              [ValidateExtension validateExtension]) =>
+          registerExtensionPoint(plugin, identifier, validateExtension));
+    }
+    for (Plugin plugin in plugins) {
+      plugin.registerExtensions(registerExtension);
+    }
+  }
+
+  /**
+   * Register an [extension] to the extension point with the given unique
+   * [identifier].
+   */
+  void registerExtension(String identifier, Object extension) {
+    ExtensionPointImpl extensionPoint = extensionPoints[identifier];
+    if (extensionPoint == null) {
+      throw new ExtensionError(
+          'There is no extension point with the id "$identifier"');
+    }
+    extensionPoint.add(extension);
+  }
+
+  /**
+   * Register an extension point being defined by the given [plugin] with the
+   * given simple [identifier] and [validateExtension].
+   */
+  ExtensionPoint registerExtensionPoint(
+      Plugin plugin, String identifier, ValidateExtension validateExtension) {
+    String uniqueIdentifier = Plugin.buildUniqueIdentifier(plugin, identifier);
+    if (extensionPoints.containsKey(uniqueIdentifier)) {
+      throw new ExtensionError(
+          'There is already an extension point with the id "$identifier"');
+    }
+    ExtensionPointImpl extensionPoint =
+        new ExtensionPointImpl(plugin, identifier, validateExtension);
+    extensionPoints[uniqueIdentifier] = extensionPoint;
+    return extensionPoint;
+  }
+}
+
+/**
+ * A concrete representation of an extension point.
+ */
+class ExtensionPointImpl implements ExtensionPoint {
+  @override
+  final Plugin plugin;
+
+  @override
+  final String simpleIdentifier;
+
+  /**
+   * The function used to validate extensions to this extension point.
+   */
+  final ValidateExtension validateExtension;
+
+  /**
+   * The list of extensions to this extension point.
+   */
+  final List<Object> _extensions = <Object>[];
+
+  /**
+   * Initialize a newly create extension point to belong to the given [plugin]
+   * and have the given [simpleIdentifier]. If [validateExtension] is non-`null`
+   * it will be used to validate extensions associated with this extension
+   * point.
+   */
+  ExtensionPointImpl(
+      this.plugin, this.simpleIdentifier, this.validateExtension);
+
+  /**
+   * Return a list containing all of the extensions that have been registered
+   * for this extension point.
+   */
+  List<Object> get extensions => new UnmodifiableListView(_extensions);
+
+  /**
+   * Return the identifier used to uniquely identify this extension point. The
+   * unique identifier is the identifier for the plugin, followed by a period
+   * (`.`), followed by the [simpleIdentifier] for the extension point.
+   */
+  String get uniqueIdentifier =>
+      Plugin.buildUniqueIdentifier(plugin, simpleIdentifier);
+
+  /**
+   * Validate that the given [extension] is appropriate for this extension
+   * point, and if it is then add it to the list of registered exceptions.
+   */
+  void add(Object extension) {
+    if (validateExtension != null) {
+      validateExtension(extension);
+    }
+    _extensions.add(extension);
+  }
+}
diff --git a/mojo/public/dart/third_party/plugin/pubspec.yaml b/mojo/public/dart/third_party/plugin/pubspec.yaml
new file mode 100644
index 0000000..886bd86
--- /dev/null
+++ b/mojo/public/dart/third_party/plugin/pubspec.yaml
@@ -0,0 +1,9 @@
+name: plugin
+version: 0.1.0
+author: Dart Team <misc@dartlang.org>
+description: Support for building plugins.
+homepage: https://github.com/dart-lang/plugin
+environment:
+  sdk: '>=1.0.0 <2.0.0'
+dev_dependencies:
+  unittest: any
diff --git a/mojo/public/dart/third_party/plugin/test/plugin_impl_test.dart b/mojo/public/dart/third_party/plugin/test/plugin_impl_test.dart
new file mode 100644
index 0000000..5d2902f
--- /dev/null
+++ b/mojo/public/dart/third_party/plugin/test/plugin_impl_test.dart
@@ -0,0 +1,174 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.operation;
+
+import 'package:plugin/plugin.dart';
+import 'package:plugin/src/plugin_impl.dart';
+import 'package:unittest/unittest.dart';
+
+main() {
+  groupSep = ' | ';
+
+  group('ExtensionManager', () {
+    test('processPlugins', () {
+      TestPlugin plugin1 = new TestPlugin('plugin1');
+      TestPlugin plugin2 = new TestPlugin('plugin1');
+      ExtensionManagerImpl manager = new ExtensionManagerImpl();
+      manager.processPlugins([plugin1, plugin2]);
+      expect(plugin1.extensionPointsRegistered, true);
+      expect(plugin1.extensionsRegistered, true);
+      expect(plugin2.extensionPointsRegistered, true);
+      expect(plugin2.extensionsRegistered, true);
+    });
+
+    test('registerExtension - valid', () {
+      Plugin plugin = new TestPlugin('plugin');
+      ExtensionManagerImpl manager = new ExtensionManagerImpl();
+      ExtensionPoint point =
+          manager.registerExtensionPoint(plugin, 'point', null);
+      expect(point, isNotNull);
+      Object extension = 'extension';
+      manager.registerExtension('plugin.point', extension);
+      List<Object> extensions = point.extensions;
+      expect(extensions, isNotNull);
+      expect(extensions, hasLength(1));
+      expect(extensions[0], extension);
+    });
+
+    test('registerExtension - non existent', () {
+      ExtensionManagerImpl manager = new ExtensionManagerImpl();
+      expect(() => manager.registerExtension('does not exist', 'extension'),
+          throwsA(new isInstanceOf<ExtensionError>()));
+      ;
+    });
+
+    test('registerExtensionPoint - non-conflicting', () {
+      Plugin plugin1 = new TestPlugin('plugin1');
+      Plugin plugin2 = new TestPlugin('plugin2');
+      ExtensionManagerImpl manager = new ExtensionManagerImpl();
+      expect(
+          manager.registerExtensionPoint(plugin1, 'point1', null), isNotNull);
+      expect(
+          manager.registerExtensionPoint(plugin1, 'point2', null), isNotNull);
+      expect(
+          manager.registerExtensionPoint(plugin2, 'point1', null), isNotNull);
+      expect(
+          manager.registerExtensionPoint(plugin2, 'point2', null), isNotNull);
+    });
+
+    test('registerExtensionPoint - conflicting - same plugin', () {
+      Plugin plugin1 = new TestPlugin('plugin1');
+      ExtensionManagerImpl manager = new ExtensionManagerImpl();
+      expect(
+          manager.registerExtensionPoint(plugin1, 'point1', null), isNotNull);
+      expect(() => manager.registerExtensionPoint(plugin1, 'point1', null),
+          throwsA(new isInstanceOf<ExtensionError>()));
+    });
+
+    test('registerExtensionPoint - conflicting - different plugins', () {
+      Plugin plugin1 = new TestPlugin('plugin1');
+      Plugin plugin2 = new TestPlugin('plugin1');
+      ExtensionManagerImpl manager = new ExtensionManagerImpl();
+      expect(
+          manager.registerExtensionPoint(plugin1, 'point1', null), isNotNull);
+      expect(() => manager.registerExtensionPoint(plugin2, 'point1', null),
+          throwsA(new isInstanceOf<ExtensionError>()));
+    });
+  });
+
+  group('ExtensionPointImpl', () {
+    test('extensions - empty', () {
+      Plugin plugin = new TestPlugin('plugin');
+      ExtensionPointImpl point = new ExtensionPointImpl(plugin, 'point', null);
+      List<Object> extensions = point.extensions;
+      expect(extensions, isNotNull);
+      expect(extensions, isEmpty);
+    });
+
+    test('uniqueIdentifier', () {
+      Plugin plugin = new TestPlugin('plugin');
+      ExtensionPointImpl point = new ExtensionPointImpl(plugin, 'point', null);
+      expect(point.uniqueIdentifier, 'plugin.point');
+    });
+
+    test('add - single', () {
+      Plugin plugin = new TestPlugin('plugin');
+      ExtensionPointImpl point = new ExtensionPointImpl(plugin, 'point', null);
+      Object extension = 'extension';
+      point.add(extension);
+      List<Object> extensions = point.extensions;
+      expect(extensions, isNotNull);
+      expect(extensions, hasLength(1));
+      expect(extensions[0], extension);
+    });
+
+    test('add - multiple', () {
+      Plugin plugin = new TestPlugin('plugin');
+      ExtensionPointImpl point = new ExtensionPointImpl(plugin, 'point', null);
+      point.add('extension 1');
+      point.add('extension 2');
+      point.add('extension 3');
+      List<Object> extensions = point.extensions;
+      expect(extensions, isNotNull);
+      expect(extensions, hasLength(3));
+    });
+
+    test('add - with validator - valid', () {
+      Plugin plugin = new TestPlugin('plugin');
+      ExtensionPointImpl point = new ExtensionPointImpl(plugin, 'point',
+          (Object extension) {
+        if (extension is! String) {
+          throw new ExtensionError('');
+        }
+      });
+      point.add('extension');
+    });
+
+    test('add - with validator - invalid', () {
+      Plugin plugin = new TestPlugin('plugin');
+      ExtensionPointImpl point = new ExtensionPointImpl(plugin, 'point',
+          (Object extension) {
+        if (extension is! String) {
+          throw new ExtensionError('');
+        }
+      });
+      expect(() => point.add(1), throwsA(new isInstanceOf<ExtensionError>()));
+    });
+  });
+}
+
+/**
+ * A simple plugin that can be used by tests.
+ */
+class TestPlugin extends Plugin {
+  /**
+   * A flag indicating whether the method [registerExtensionPoints] has been
+   * invoked.
+   */
+  bool extensionPointsRegistered = false;
+
+  /**
+   * A flag indicating whether the method [registerExtensions] has been invoked.
+   */
+  bool extensionsRegistered = false;
+
+  @override
+  String uniqueIdentifier;
+
+  /**
+   * Initialize a newly created plugin to have the given identifier.
+   */
+  TestPlugin(this.uniqueIdentifier);
+
+  @override
+  void registerExtensionPoints(RegisterExtensionPoint register) {
+    extensionPointsRegistered = true;
+  }
+
+  @override
+  void registerExtensions(RegisterExtension register) {
+    extensionsRegistered = true;
+  }
+}
diff --git a/mojo/public/dart/third_party/pool/.gitignore b/mojo/public/dart/third_party/pool/.gitignore
new file mode 100644
index 0000000..388eff0
--- /dev/null
+++ b/mojo/public/dart/third_party/pool/.gitignore
@@ -0,0 +1,14 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.pub/
+build/
+packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/pool/.status b/mojo/public/dart/third_party/pool/.status
new file mode 100644
index 0000000..ff095a2
--- /dev/null
+++ b/mojo/public/dart/third_party/pool/.status
@@ -0,0 +1,15 @@
+# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Skip non-test files ending with "_test".
+packages/*: Skip
+*/packages/*: Skip
+*/*/packages/*: Skip
+*/*/*/packages/*: Skip
+*/*/*/*packages/*: Skip
+*/*/*/*/*packages/*: Skip
+
+# Only run tests from the build directory, since we don't care about the
+# difference between transformed an untransformed code.
+test/*: Skip
diff --git a/mojo/public/dart/third_party/pool/CHANGELOG.md b/mojo/public/dart/third_party/pool/CHANGELOG.md
new file mode 100644
index 0000000..ec8fd79
--- /dev/null
+++ b/mojo/public/dart/third_party/pool/CHANGELOG.md
@@ -0,0 +1,12 @@
+## 1.1.0
+
+* Add `PoolResource.allowRelease()`, which allows a resource to indicate that it
+  can be released without forcing it to deallocate immediately.
+
+## 1.0.2
+
+* Fixed the homepage.
+
+## 1.0.1
+
+* A `TimeoutException` is now correctly thrown if the pool detects a deadlock.
diff --git a/mojo/public/dart/third_party/pool/LICENSE b/mojo/public/dart/third_party/pool/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/mojo/public/dart/third_party/pool/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/pool/README.md b/mojo/public/dart/third_party/pool/README.md
new file mode 100644
index 0000000..8987288
--- /dev/null
+++ b/mojo/public/dart/third_party/pool/README.md
@@ -0,0 +1,53 @@
+The pool package exposes a `Pool` class which makes it easy to manage a limited
+pool of resources.
+
+The easiest way to use a pool is by calling `withResource`. This runs a callback
+and returns its result, but only once there aren't too many other callbacks
+currently running.
+
+```dart
+// Create a Pool that will only allocate 10 resources at once. After 30 seconds
+// of inactivity with all resources checked out, the pool will throw an error.
+final pool = new Pool(10, timeout: new Duration(seconds: 30));
+
+Future<String> readFile(String path) {
+  // Since the call to [File.readAsString] is within [withResource], no more
+  // than ten files will be open at once.
+  return pool.withResource(() => return new File(path).readAsString());
+}
+```
+
+For more fine-grained control, the user can also explicitly request generic
+`PoolResource` objects that can later be released back into the pool. This is
+what `withResource` does under the covers: requests a resource, then releases it
+once the callback completes.
+
+`Pool` ensures that only a limited number of resources are allocated at once.
+It's the caller's responsibility to ensure that the corresponding physical
+resource is only consumed when a `PoolResource` is allocated.
+
+```dart
+class PooledFile implements RandomAccessFile {
+  final RandomAccessFile _file;
+  final PoolResource _resource;
+
+  static Future<PooledFile> open(String path) {
+    return pool.request().then((resource) {
+      return new File(path).open().then((file) {
+        return new PooledFile._(file, resource);
+      });
+    });
+  }
+
+  PooledFile(this._file, this._resource);
+
+  // ...
+
+  Future<RandomAccessFile> close() {
+    return _file.close.then((_) {
+      _resource.release();
+      return this;
+    });
+  }
+}
+```
diff --git a/mojo/public/dart/third_party/pool/codereview.settings b/mojo/public/dart/third_party/pool/codereview.settings
new file mode 100644
index 0000000..b474c08
--- /dev/null
+++ b/mojo/public/dart/third_party/pool/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: http://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/pool/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/pool/lib/pool.dart b/mojo/public/dart/third_party/pool/lib/pool.dart
new file mode 100644
index 0000000..6941229
--- /dev/null
+++ b/mojo/public/dart/third_party/pool/lib/pool.dart
@@ -0,0 +1,206 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pool;
+
+import 'dart:async';
+import 'dart:collection';
+
+import 'package:stack_trace/stack_trace.dart';
+
+/// Manages an abstract pool of resources with a limit on how many may be in use
+/// at once.
+///
+/// When a resource is needed, the user should call [request]. When the returned
+/// future completes with a [PoolResource], the resource may be allocated. Once
+/// the resource has been released, the user should call [PoolResource.release].
+/// The pool will ensure that only a certain number of [PoolResource]s may be
+/// allocated at once.
+class Pool {
+  /// Completers for requests beyond the first [_maxAllocatedResources].
+  ///
+  /// When an item is released, the next element of [_requestedResources] will
+  /// be completed.
+  final _requestedResources = new Queue<Completer<PoolResource>>();
+
+  /// Callbacks that must be called before additional resources can be
+  /// allocated.
+  ///
+  /// See [PoolResource.allowRelease].
+  final _onReleaseCallbacks = new Queue<Function>();
+
+  /// Completers that will be completed once `onRelease` callbacks are done
+  /// running.
+  ///
+  /// These are kept in a queue to ensure that the earliest request completes
+  /// first regardless of what order the `onRelease` callbacks complete in.
+  final _onReleaseCompleters = new Queue<Completer<PoolResource>>();
+
+  /// The maximum number of resources that may be allocated at once.
+  final int _maxAllocatedResources;
+
+  /// The number of resources that are currently allocated.
+  int _allocatedResources = 0;
+
+  /// The timeout timer.
+  ///
+  /// If [_timeout] isn't null, this timer is set as soon as the resource limit
+  /// is reached and is reset every time an resource is released or a new
+  /// resource is requested. If it fires, that indicates that the caller became
+  /// deadlocked, likely due to files waiting for additional files to be read
+  /// before they could be closed.
+  Timer _timer;
+
+  /// The amount of time to wait before timing out the pending resources.
+  final Duration _timeout;
+
+  /// Creates a new pool with the given limit on how many resources may be
+  /// allocated at once.
+  ///
+  /// If [timeout] is passed, then if that much time passes without any activity
+  /// all pending [request] futures will throw a [TimeoutException]. This is
+  /// intended to avoid deadlocks.
+  Pool(this._maxAllocatedResources, {Duration timeout})
+      : _timeout = timeout;
+
+  /// Request a [PoolResource].
+  ///
+  /// If the maximum number of resources is already allocated, this will delay
+  /// until one of them is released.
+  Future<PoolResource> request() {
+    if (_allocatedResources < _maxAllocatedResources) {
+      _allocatedResources++;
+      return new Future.value(new PoolResource._(this));
+    } else if (_onReleaseCallbacks.isNotEmpty) {
+      return _runOnRelease(_onReleaseCallbacks.removeFirst());
+    } else {
+      var completer = new Completer<PoolResource>();
+      _requestedResources.add(completer);
+      _resetTimer();
+      return completer.future;
+    }
+  }
+
+  /// Requests a resource for the duration of [callback], which may return a
+  /// Future.
+  ///
+  /// The return value of [callback] is piped to the returned Future.
+  Future withResource(callback()) {
+    return request().then((resource) =>
+        Chain.track(new Future.sync(callback)).whenComplete(resource.release));
+  }
+
+  /// If there are any pending requests, this will fire the oldest one.
+  void _onResourceReleased() {
+    _resetTimer();
+
+    if (_requestedResources.isEmpty) {
+      _allocatedResources--;
+      return;
+    }
+
+    var pending = _requestedResources.removeFirst();
+    pending.complete(new PoolResource._(this));
+  }
+
+  /// If there are any pending requests, this will fire the oldest one after
+  /// running [onRelease].
+  void _onResourceReleaseAllowed(onRelease()) {
+    _resetTimer();
+
+    if (_requestedResources.isEmpty) {
+      _onReleaseCallbacks.add(
+          Zone.current.bindCallback(onRelease, runGuarded: false));
+      return;
+    }
+
+    var pending = _requestedResources.removeFirst();
+    pending.complete(_runOnRelease(onRelease));
+  }
+
+  /// Runs [onRelease] and returns a Future that completes to a resource once an
+  /// [onRelease] callback completes.
+  ///
+  /// Futures returned by [_runOnRelease] always complete in the order they were
+  /// created, even if earlier [onRelease] callbacks take longer to run.
+  Future<PoolResource> _runOnRelease(onRelease()) {
+    new Future.sync(onRelease).then((value) {
+      _onReleaseCompleters.removeFirst().complete(new PoolResource._(this));
+    }).catchError((error, stackTrace) {
+      _onReleaseCompleters.removeFirst().completeError(error, stackTrace);
+    });
+
+    var completer = new Completer.sync();
+    _onReleaseCompleters.add(completer);
+    return completer.future;
+  }
+
+  /// A resource has been requested, allocated, or released.
+  void _resetTimer() {
+    if (_timer != null) _timer.cancel();
+    if (_timeout == null || _requestedResources.isEmpty) {
+      _timer = null;
+    } else {
+      _timer = new Timer(_timeout, _onTimeout);
+    }
+  }
+
+  /// Handles [_timer] timing out by causing all pending resource completers to
+  /// emit exceptions.
+  void _onTimeout() {
+    for (var completer in _requestedResources) {
+      completer.completeError(
+          new TimeoutException("Pool deadlock: all resources have been "
+              "allocated for too long.",
+              _timeout),
+          new Chain.current());
+    }
+    _requestedResources.clear();
+    _timer = null;
+  }
+}
+
+/// A member of a [Pool].
+///
+/// A [PoolResource] is a token that indicates that a resource is allocated.
+/// When the associated resource is released, the user should call [release].
+class PoolResource {
+  final Pool _pool;
+
+  /// Whether [this] has been released yet.
+  bool _released = false;
+
+  PoolResource._(this._pool);
+
+  /// Tells the parent [Pool] that the resource associated with this resource is
+  /// no longer allocated, and that a new [PoolResource] may be allocated.
+  void release() {
+    if (_released) {
+      throw new StateError("A PoolResource may only be released once.");
+    }
+    _released = true;
+    _pool._onResourceReleased();
+  }
+
+  /// Tells the parent [Pool] that the resource associated with this resource is
+  /// no longer necessary, but should remain allocated until more resources are
+  /// needed.
+  ///
+  /// When [Pool.request] is called and there are no remaining available
+  /// resources, the [onRelease] callback is called. It should free the
+  /// resource, and it may return a Future or `null`. Once that completes, the
+  /// [Pool.request] call will complete to a new [PoolResource].
+  ///
+  /// This is useful when a resource's main function is complete, but it may
+  /// produce additional information later on. For example, an isolate's task
+  /// may be complete, but it could still emit asynchronous errors.
+  void allowRelease(onRelease()) {
+    if (_released) {
+      throw new StateError("A PoolResource may only be released once.");
+    }
+    _released = true;
+    _pool._onResourceReleaseAllowed(onRelease);
+  }
+}
+
diff --git a/mojo/public/dart/third_party/pool/pubspec.yaml b/mojo/public/dart/third_party/pool/pubspec.yaml
new file mode 100644
index 0000000..175c8dc
--- /dev/null
+++ b/mojo/public/dart/third_party/pool/pubspec.yaml
@@ -0,0 +1,12 @@
+name: pool
+version: 1.1.0
+author: Dart Team <misc@dartlang.org>
+description: A class for managing a finite pool of resources.
+homepage: https://github.com/dart-lang/pool
+dependencies:
+  stack_trace: ">=0.9.2 <2.0.0"
+environment:
+  sdk: ">=1.9.0 <2.0.0"
+dev_dependencies:
+  fake_async: ">=0.1.0 <0.2.0"
+  test: ">=0.12.0 <0.13.0"
diff --git a/mojo/public/dart/third_party/pool/test/pool_test.dart b/mojo/public/dart/third_party/pool/test/pool_test.dart
new file mode 100644
index 0000000..64bc3a6
--- /dev/null
+++ b/mojo/public/dart/third_party/pool/test/pool_test.dart
@@ -0,0 +1,296 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:fake_async/fake_async.dart';
+import 'package:pool/pool.dart';
+import 'package:stack_trace/stack_trace.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group("request()", () {
+    test("resources can be requested freely up to the limit", () {
+      var pool = new Pool(50);
+      for (var i = 0; i < 50; i++) {
+        expect(pool.request(), completes);
+      }
+    });
+
+    test("resources block past the limit", () {
+      new FakeAsync().run((async) {
+        var pool = new Pool(50);
+        for (var i = 0; i < 50; i++) {
+          expect(pool.request(), completes);
+        }
+        expect(pool.request(), doesNotComplete);
+
+        async.elapse(new Duration(seconds: 1));
+      });
+    });
+
+    test("a blocked resource is allocated when another is released", () {
+      new FakeAsync().run((async) {
+        var pool = new Pool(50);
+        for (var i = 0; i < 49; i++) {
+          expect(pool.request(), completes);
+        }
+
+        pool.request().then((lastAllocatedResource) {
+          // This will only complete once [lastAllocatedResource] is released.
+          expect(pool.request(), completes);
+
+          new Future.delayed(new Duration(microseconds: 1)).then((_) {
+            lastAllocatedResource.release();
+          });
+        });
+
+        async.elapse(new Duration(seconds: 1));
+      });
+    });
+  });
+
+  group("withResource()", () {
+    test("can be called freely up to the limit", () {
+      var pool = new Pool(50);
+      for (var i = 0; i < 50; i++) {
+        pool.withResource(expectAsync(() => new Completer().future));
+      }
+    });
+
+    test("blocks the callback past the limit", () {
+      new FakeAsync().run((async) {
+        var pool = new Pool(50);
+        for (var i = 0; i < 50; i++) {
+          pool.withResource(expectAsync(() => new Completer().future));
+        }
+        pool.withResource(expectNoAsync());
+
+        async.elapse(new Duration(seconds: 1));
+      });
+    });
+
+    test("a blocked resource is allocated when another is released", () {
+      new FakeAsync().run((async) {
+        var pool = new Pool(50);
+        for (var i = 0; i < 49; i++) {
+          pool.withResource(expectAsync(() => new Completer().future));
+        }
+
+        var completer = new Completer();
+        pool.withResource(() => completer.future);
+        var blockedResourceAllocated = false;
+        pool.withResource(() {
+          blockedResourceAllocated = true;
+        });
+
+        new Future.delayed(new Duration(microseconds: 1)).then((_) {
+          expect(blockedResourceAllocated, isFalse);
+          completer.complete();
+          return new Future.delayed(new Duration(microseconds: 1));
+        }).then((_) {
+          expect(blockedResourceAllocated, isTrue);
+        });
+
+        async.elapse(new Duration(seconds: 1));
+      });
+    });
+  });
+
+  group("with a timeout", () {
+    test("doesn't time out if there are no pending requests", () {
+      new FakeAsync().run((async) {
+        var pool = new Pool(50, timeout: new Duration(seconds: 5));
+        for (var i = 0; i < 50; i++) {
+          expect(pool.request(), completes);
+        }
+
+        async.elapse(new Duration(seconds: 6));
+      });
+    });
+
+    test("resets the timer if a resource is returned", () {
+      new FakeAsync().run((async) {
+        var pool = new Pool(50, timeout: new Duration(seconds: 5));
+        for (var i = 0; i < 49; i++) {
+          expect(pool.request(), completes);
+        }
+
+        pool.request().then((lastAllocatedResource) {
+          // This will only complete once [lastAllocatedResource] is released.
+          expect(pool.request(), completes);
+
+          new Future.delayed(new Duration(seconds: 3)).then((_) {
+            lastAllocatedResource.release();
+            expect(pool.request(), doesNotComplete);
+          });
+        });
+
+        async.elapse(new Duration(seconds: 6));
+      });
+    });
+
+    test("resets the timer if a resource is requested", () {
+      new FakeAsync().run((async) {
+        var pool = new Pool(50, timeout: new Duration(seconds: 5));
+        for (var i = 0; i < 50; i++) {
+          expect(pool.request(), completes);
+        }
+        expect(pool.request(), doesNotComplete);
+
+        new Future.delayed(new Duration(seconds: 3)).then((_) {
+          expect(pool.request(), doesNotComplete);
+        });
+
+        async.elapse(new Duration(seconds: 6));
+      });
+    });
+
+    test("times out if nothing happens", () {
+      new FakeAsync().run((async) {
+        var pool = new Pool(50, timeout: new Duration(seconds: 5));
+        for (var i = 0; i < 50; i++) {
+          expect(pool.request(), completes);
+        }
+        expect(pool.request(), throwsA(new isInstanceOf<TimeoutException>()));
+
+        async.elapse(new Duration(seconds: 6));
+      });
+    });
+  });
+
+  group("allowRelease()", () {
+    test("runs the callback once the resource limit is exceeded", () async {
+      var pool = new Pool(50);
+      var requests = [];
+      for (var i = 0; i < 49; i++) {
+        expect(pool.request(), completes);
+      }
+
+      var resource = await pool.request();
+      var onReleaseCalled = false;
+      resource.allowRelease(() => onReleaseCalled = true);
+      await new Future.delayed(Duration.ZERO);
+      expect(onReleaseCalled, isFalse);
+
+      expect(pool.request(), completes);
+      await new Future.delayed(Duration.ZERO);
+      expect(onReleaseCalled, isTrue);
+    });
+
+    test("runs the callback immediately if there are blocked requests",
+        () async {
+      var pool = new Pool(1);
+      var resource = await pool.request();
+
+      // This will be blocked until [resource.allowRelease] is called.
+      expect(pool.request(), completes);
+
+      var onReleaseCalled = false;
+      resource.allowRelease(() => onReleaseCalled = true);
+      await new Future.delayed(Duration.ZERO);
+      expect(onReleaseCalled, isTrue);
+    });
+
+    test("blocks the request until the callback completes", () async {
+      var pool = new Pool(1);
+      var resource = await pool.request();
+
+      var requestComplete = false;
+      pool.request().then((_) => requestComplete = true);
+
+      var completer = new Completer();
+      resource.allowRelease(() => completer.future);
+      await new Future.delayed(Duration.ZERO);
+      expect(requestComplete, isFalse);
+
+      completer.complete();
+      await new Future.delayed(Duration.ZERO);
+      expect(requestComplete, isTrue);
+    });
+
+    test("completes requests in request order regardless of callback order",
+        () async {
+      var pool = new Pool(2);
+      var resource1 = await pool.request();
+      var resource2 = await pool.request();
+
+      var request1Complete = false;
+      pool.request().then((_) => request1Complete = true);
+      var request2Complete = false;
+      pool.request().then((_) => request2Complete = true);
+
+      var onRelease1Called = false;
+      var completer1 = new Completer();
+      resource1.allowRelease(() {
+        onRelease1Called = true;
+        return completer1.future;
+      });
+      await new Future.delayed(Duration.ZERO);
+      expect(onRelease1Called, isTrue);
+
+      var onRelease2Called = false;
+      var completer2 = new Completer();
+      resource2.allowRelease(() {
+        onRelease2Called = true;
+        return completer2.future;
+      });
+      await new Future.delayed(Duration.ZERO);
+      expect(onRelease2Called, isTrue);
+      expect(request1Complete, isFalse);
+      expect(request2Complete, isFalse);
+
+      // Complete the second resource's onRelease callback first. Even though it
+      // was triggered by the second blocking request, it should complete the
+      // first one to preserve ordering.
+      completer2.complete();
+      await new Future.delayed(Duration.ZERO);
+      expect(request1Complete, isTrue);
+      expect(request2Complete, isFalse);
+
+      completer1.complete();
+      await new Future.delayed(Duration.ZERO);
+      expect(request1Complete, isTrue);
+      expect(request2Complete, isTrue);
+    });
+
+    test("runs onRequest in the zone it was created", () async {
+      var pool = new Pool(1);
+      var resource = await pool.request();
+
+      var outerZone = Zone.current;
+      runZoned(() {
+        var innerZone = Zone.current;
+        expect(innerZone, isNot(equals(outerZone)));
+
+        resource.allowRelease(expectAsync(() {
+          expect(Zone.current, equals(innerZone));
+        }));
+      });
+
+      pool.request();
+    });
+  });
+}
+
+/// Returns a function that will cause the test to fail if it's called.
+///
+/// This should only be called within a [FakeAsync.run] zone.
+Function expectNoAsync() {
+  var stack = new Trace.current(1);
+  return () => registerException(
+      new TestFailure("Expected function not to be called."), stack);
+}
+
+/// A matcher for Futures that asserts that they don't complete.
+///
+/// This should only be called within a [FakeAsync.run] zone.
+Matcher get doesNotComplete => predicate((future) {
+  expect(future, new isInstanceOf<Future>());
+
+  var stack = new Trace.current(1);
+  future.then((_) => registerException(
+      new TestFailure("Expected future not to complete."), stack));
+  return true;
+});
diff --git a/mojo/public/dart/third_party/pub_semver/.gitignore b/mojo/public/dart/third_party/pub_semver/.gitignore
new file mode 100644
index 0000000..7178642
--- /dev/null
+++ b/mojo/public/dart/third_party/pub_semver/.gitignore
@@ -0,0 +1,5 @@
+packages
+pubspec.lock
+
+# IntelliJ project.
+.idea
diff --git a/mojo/public/dart/third_party/pub_semver/CHANGELOG.md b/mojo/public/dart/third_party/pub_semver/CHANGELOG.md
new file mode 100644
index 0000000..58190a8
--- /dev/null
+++ b/mojo/public/dart/third_party/pub_semver/CHANGELOG.md
@@ -0,0 +1,39 @@
+# 1.2.1
+
+* Allow version ranges like `>=1.2.3-dev.1 <1.2.3` to match pre-release versions
+  of `1.2.3`. Previously, these didn't match, since the pre-release versions had
+  the same major, minor, and patch numbers as the max; now an exception has been
+  added if they also have the same major, minor, and patch numbers as the min
+  *and* the min is also a pre-release version.
+
+# 1.2.0
+
+* Add a `VersionConstraint.union()` method and a `new
+  VersionConstraint.unionOf()` constructor. These each return a constraint that
+  matches multiple existing constraints.
+
+* Add a `VersionConstraint.allowsAll()` method, which returns whether one
+  constraint is a superset of another.
+
+* Add a `VersionConstraint.allowsAny()` method, which returns whether one
+  constraint overlaps another.
+
+* `Version` now implements `VersionRange`.
+
+# 1.1.0
+
+* Add support for the `^` operator for compatible versions according to pub's
+  notion of compatibility. `^1.2.3` is equivalent to `>=1.2.3 <2.0.0`; `^0.1.2`
+  is equivalent to `>=0.1.2 <0.2.0`.
+
+* Add `Version.nextBreaking`, which returns the next version that introduces
+  breaking changes after a given version.
+
+* Add `new VersionConstraint.compatibleWith()`, which returns a range covering
+  all versions compatible with a given version.
+
+* Add a custom `VersionRange.hashCode` to make it properly hashable.
+
+# 1.0.0
+
+* Initial release.
diff --git a/mojo/public/dart/third_party/pub_semver/LICENSE b/mojo/public/dart/third_party/pub_semver/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/mojo/public/dart/third_party/pub_semver/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/pub_semver/README.md b/mojo/public/dart/third_party/pub_semver/README.md
new file mode 100644
index 0000000..b359754
--- /dev/null
+++ b/mojo/public/dart/third_party/pub_semver/README.md
@@ -0,0 +1,98 @@
+Handles version numbers and version constraints in the same way that [pub][]
+does. The semantics here very closely follow the [Semantic Versioning][semver]
+spec. It differs from semver in a few corner cases:
+
+ *  **Version ordering does take build suffixes into account.** This is unlike
+    semver 2.0.0 but like earlier versions of semver. Version `1.2.3+1` is
+    considered a lower number than `1.2.3+2`.
+
+    Since a package may have published multiple versions that differ only by
+    build suffix, pub still has to pick one of them *somehow*. Semver leaves
+    that issue unresolved, so we just say that build numbers are sorted like
+    pre-release suffixes.
+
+ *  **Pre-release versions are excluded from most max ranges.** Let's say a
+    user is depending on "foo" with constraint `>=1.0.0 <2.0.0` and that "foo"
+    has published these versions:
+
+     *  `1.0.0`
+     *  `1.1.0`
+     *  `1.2.0`
+     *  `2.0.0-alpha`
+     *  `2.0.0-beta`
+     *  `2.0.0`
+     *  `2.1.0`
+
+    Versions `2.0.0` and `2.1.0` are excluded by the constraint since neither
+    matches `<2.0.0`. However, since semver specifies that pre-release versions
+    are lower than the non-prerelease version (i.e. `2.0.0-beta < 2.0.0`, then
+    the `<2.0.0` constraint does technically allow those.
+
+    But that's almost never what the user wants. If their package doesn't work
+    with foo `2.0.0`, it's certainly not likely to work with experimental,
+    unstable versions of `2.0.0`'s API, which is what pre-release versions
+    represent.
+
+    To handle that, `<` version ranges don't allow pre-release versions of the
+    maximum unless the max is itself a pre-release, or the min is a pre-release
+    of the same version. In other words, a `<2.0.0` constraint will prohibit not
+    just `2.0.0` but any pre-release of `2.0.0`. However, `<2.0.0-beta` will
+    exclude `2.0.0-beta` but allow `2.0.0-alpha`. Likewise, `>2.0.0-alpha
+    <2.0.0` will exclude `2.0.0-alpha` but allow `2.0.0-beta`.
+
+ *  **Pre-release versions are avoided when possible.** The above case
+    handles pre-release versions at the top of the range, but what about in
+    the middle? What if "foo" has these versions:
+
+     *  `1.0.0`
+     *  `1.2.0-alpha`
+     *  `1.2.0`
+     *  `1.3.0-experimental`
+
+    When a number of versions are valid, pub chooses the best one where "best"
+    usually means "highest numbered". That follows the user's intuition that,
+    all else being equal, they want the latest and greatest. Here, that would
+    mean `1.3.0-experimental`. However, most users don't want to use unstable
+    versions of their dependencies.
+
+    We want pre-releases to be explicitly opt-in so that package consumers
+    don't get unpleasant surprises and so that package maintainers are free to
+    put out pre-releases and get feedback without dragging all of their users
+    onto the bleeding edge.
+
+    To accommodate that, when pub is choosing a version, it uses *priority*
+    order which is different from strict comparison ordering. Any stable
+    version is considered higher priority than any unstable version. The above
+    versions, in priority order, are:
+
+     *  `1.2.0-alpha`
+     *  `1.3.0-experimental`
+     *  `1.0.0`
+     *  `1.2.0`
+
+    This ensures that users only end up with an unstable version when there are
+    no alternatives. Usually this means they've picked a constraint that
+    specifically selects that unstable version -- they've deliberately opted
+    into it.
+
+ *  **There is a notion of compatibility between pre-1.0.0 versions.** Semver
+    deems all pre-1.0.0 versions to be incompatible.  This means that the only
+    way to ensure compatibility when depending on a pre-1.0.0 package is to
+    pin the dependency to an exact version. Pinned version constraints prevent
+    automatic patch and pre-release updates. To avoid this situation, pub
+    defines the "next breaking" version as the version which increments the
+    major version if it's greater than zero, and the minor version otherwise,
+    resets subsequent digits to zero, and strips any pre-release or build
+    suffix.  For example, here are some versions along with their next breaking
+    ones:
+
+    `0.0.3` -> `0.1.0`
+    `0.7.2-alpha` -> `0.8.0`
+    `1.2.3` -> `2.0.0`
+
+    To make use of this, pub defines a "^" operator which yields a version
+    constraint greater than or equal to a given version, but less than its next
+    breaking one.
+
+[pub]: http://pub.dartlang.org/
+[semver]: http://semver.org/
diff --git a/mojo/public/dart/third_party/pub_semver/codereview.settings b/mojo/public/dart/third_party/pub_semver/codereview.settings
new file mode 100644
index 0000000..94ddf0e
--- /dev/null
+++ b/mojo/public/dart/third_party/pub_semver/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: https://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/pub_semver/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/pub_semver/lib/pub_semver.dart b/mojo/public/dart/third_party/pub_semver/lib/pub_semver.dart
new file mode 100644
index 0000000..436e226
--- /dev/null
+++ b/mojo/public/dart/third_party/pub_semver/lib/pub_semver.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_semver;
+
+export 'src/version.dart';
+export 'src/version_constraint.dart';
+export 'src/version_range.dart';
diff --git a/mojo/public/dart/third_party/pub_semver/lib/src/patterns.dart b/mojo/public/dart/third_party/pub_semver/lib/src/patterns.dart
new file mode 100644
index 0000000..8b32900
--- /dev/null
+++ b/mojo/public/dart/third_party/pub_semver/lib/src/patterns.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_semver.src.patterns;
+
+/// Regex that matches a version number at the beginning of a string.
+final START_VERSION = new RegExp(
+    r'^'                                        // Start at beginning.
+    r'(\d+).(\d+).(\d+)'                        // Version number.
+    r'(-([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?'    // Pre-release.
+    r'(\+([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?'); // Build.
+
+/// Like [START_VERSION] but matches the entire string.
+final COMPLETE_VERSION = new RegExp(START_VERSION.pattern + r'$');
+
+/// Parses a comparison operator ("<", ">", "<=", or ">=") at the beginning of
+/// a string.
+final START_COMPARISON = new RegExp(r"^[<>]=?");
+
+/// The "compatible with" operator.
+const COMPATIBLE_WITH = "^";
diff --git a/mojo/public/dart/third_party/pub_semver/lib/src/utils.dart b/mojo/public/dart/third_party/pub_semver/lib/src/utils.dart
new file mode 100644
index 0000000..2853e5c
--- /dev/null
+++ b/mojo/public/dart/third_party/pub_semver/lib/src/utils.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_semver.src.utils;
+
+import 'version_range.dart';
+
+/// Returns whether [range1] is immediately next to, but not overlapping,
+/// [range2].
+bool areAdjacent(VersionRange range1, VersionRange range2) {
+  if (range1.max != range2.min) return false;
+
+  return (range1.includeMax && !range2.includeMin) ||
+      (!range1.includeMax && range2.includeMin);
+}
+
+/// A [Comparator] that compares the maximum versions of [range1] and [range2].
+int compareMax(VersionRange range1, VersionRange range2) {
+  if (range1.max < range2.max) return -1;
+  if (range1.max > range2.max) return 1;
+
+  if (!range1.includeMax && range2.includeMax) return -1;
+  if (range1.includeMax && !range2.includeMax) return 1;
+  return 0;
+}
diff --git a/mojo/public/dart/third_party/pub_semver/lib/src/version.dart b/mojo/public/dart/third_party/pub_semver/lib/src/version.dart
new file mode 100644
index 0000000..51972f7
--- /dev/null
+++ b/mojo/public/dart/third_party/pub_semver/lib/src/version.dart
@@ -0,0 +1,329 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_semver.src.version;
+
+import 'dart:math' as math;
+
+import 'package:collection/equality.dart';
+
+import 'patterns.dart';
+import 'version_constraint.dart';
+import 'version_range.dart';
+
+/// The equality operator to use for comparing version components.
+final _equality = const IterableEquality();
+
+/// A parsed semantic version number.
+class Version implements Comparable<Version>, VersionConstraint, VersionRange {
+  /// No released version: i.e. "0.0.0".
+  static Version get none => new Version(0, 0, 0);
+
+  /// Compares [a] and [b] to see which takes priority over the other.
+  ///
+  /// Returns `1` if [a] takes priority over [b] and `-1` if vice versa. If
+  /// [a] and [b] are equivalent, returns `0`.
+  ///
+  /// Unlike [compareTo], which *orders* versions, this determines which
+  /// version a user is likely to prefer. In particular, it prioritizes
+  /// pre-release versions lower than stable versions, regardless of their
+  /// version numbers. Pub uses this when determining which version to prefer
+  /// when a number of versions are allowed. In that case, it will always
+  /// choose a stable version when possible.
+  ///
+  /// When used to sort a list, orders in ascending priority so that the
+  /// highest priority version is *last* in the result.
+  static int prioritize(Version a, Version b) {
+    // Sort all prerelease versions after all normal versions. This way
+    // the solver will prefer stable packages over unstable ones.
+    if (a.isPreRelease && !b.isPreRelease) return -1;
+    if (!a.isPreRelease && b.isPreRelease) return 1;
+
+    return a.compareTo(b);
+  }
+
+  /// Like [prioritize], but lower version numbers are considered greater than
+  /// higher version numbers.
+  ///
+  /// This still considers prerelease versions to be lower than non-prerelease
+  /// versions. Pub uses this when downgrading -- it chooses the lowest version
+  /// but still excludes pre-release versions when possible.
+  static int antiprioritize(Version a, Version b) {
+    if (a.isPreRelease && !b.isPreRelease) return -1;
+    if (!a.isPreRelease && b.isPreRelease) return 1;
+
+    return b.compareTo(a);
+  }
+
+  /// The major version number: "1" in "1.2.3".
+  final int major;
+
+  /// The minor version number: "2" in "1.2.3".
+  final int minor;
+
+  /// The patch version number: "3" in "1.2.3".
+  final int patch;
+
+  /// The pre-release identifier: "foo" in "1.2.3-foo".
+  ///
+  /// This is split into a list of components, each of which may be either a
+  /// string or a non-negative integer. It may also be empty, indicating that
+  /// this version has no pre-release identifier.
+  final List preRelease;
+
+  /// The build identifier: "foo" in "1.2.3+foo".
+  ///
+  /// This is split into a list of components, each of which may be either a
+  /// string or a non-negative integer. It may also be empty, indicating that
+  /// this version has no build identifier.
+  final List build;
+
+  /// The original string representation of the version number.
+  ///
+  /// This preserves textual artifacts like leading zeros that may be left out
+  /// of the parsed version.
+  final String _text;
+
+  Version get min => this;
+  Version get max => this;
+  bool get includeMin => true;
+  bool get includeMax => true;
+
+  Version._(this.major, this.minor, this.patch, String preRelease, String build,
+            this._text)
+      : preRelease = preRelease == null ? [] : _splitParts(preRelease),
+        build = build == null ? [] : _splitParts(build) {
+    if (major < 0) throw new ArgumentError(
+        'Major version must be non-negative.');
+    if (minor < 0) throw new ArgumentError(
+        'Minor version must be non-negative.');
+    if (patch < 0) throw new ArgumentError(
+        'Patch version must be non-negative.');
+  }
+
+  /// Creates a new [Version] object.
+  factory Version(int major, int minor, int patch, {String pre, String build}) {
+    var text = "$major.$minor.$patch";
+    if (pre != null) text += "-$pre";
+    if (build != null) text += "+$build";
+
+    return new Version._(major, minor, patch, pre, build, text);
+  }
+
+  /// Creates a new [Version] by parsing [text].
+  factory Version.parse(String text) {
+    final match = COMPLETE_VERSION.firstMatch(text);
+    if (match == null) {
+      throw new FormatException('Could not parse "$text".');
+    }
+
+    try {
+      int major = int.parse(match[1]);
+      int minor = int.parse(match[2]);
+      int patch = int.parse(match[3]);
+
+      String preRelease = match[5];
+      String build = match[8];
+
+      return new Version._(major, minor, patch, preRelease, build, text);
+    } on FormatException {
+      throw new FormatException('Could not parse "$text".');
+    }
+  }
+
+  /// Returns the primary version out of a list of candidates.
+  ///
+  /// This is the highest-numbered stable (non-prerelease) version. If there
+  /// are no stable versions, it's just the highest-numbered version.
+  static Version primary(List<Version> versions) {
+    var primary;
+    for (var version in versions) {
+      if (primary == null || (!version.isPreRelease && primary.isPreRelease) ||
+          (version.isPreRelease == primary.isPreRelease && version > primary)) {
+        primary = version;
+      }
+    }
+    return primary;
+  }
+
+  /// Splits a string of dot-delimited identifiers into their component parts.
+  ///
+  /// Identifiers that are numeric are converted to numbers.
+  static List _splitParts(String text) {
+    return text.split('.').map((part) {
+      try {
+        return int.parse(part);
+      } on FormatException {
+        // Not a number.
+        return part;
+      }
+    }).toList();
+  }
+
+  bool operator ==(other) {
+    if (other is! Version) return false;
+    return major == other.major && minor == other.minor &&
+        patch == other.patch &&
+        _equality.equals(preRelease, other.preRelease) &&
+        _equality.equals(build, other.build);
+  }
+
+  int get hashCode => major ^ minor ^ patch ^ _equality.hash(preRelease) ^
+      _equality.hash(build);
+
+  bool operator <(Version other) => compareTo(other) < 0;
+  bool operator >(Version other) => compareTo(other) > 0;
+  bool operator <=(Version other) => compareTo(other) <= 0;
+  bool operator >=(Version other) => compareTo(other) >= 0;
+
+  bool get isAny => false;
+  bool get isEmpty => false;
+
+  /// Whether or not this is a pre-release version.
+  bool get isPreRelease => preRelease.isNotEmpty;
+
+  /// Gets the next major version number that follows this one.
+  ///
+  /// If this version is a pre-release of a major version release (i.e. the
+  /// minor and patch versions are zero), then it just strips the pre-release
+  /// suffix. Otherwise, it increments the major version and resets the minor
+  /// and patch.
+  Version get nextMajor {
+    if (isPreRelease && minor == 0 && patch == 0) {
+      return new Version(major, minor, patch);
+    }
+
+    return _incrementMajor();
+  }
+
+  /// Gets the next minor version number that follows this one.
+  ///
+  /// If this version is a pre-release of a minor version release (i.e. the
+  /// patch version is zero), then it just strips the pre-release suffix.
+  /// Otherwise, it increments the minor version and resets the patch.
+  Version get nextMinor {
+    if (isPreRelease && patch == 0) {
+      return new Version(major, minor, patch);
+    }
+
+    return _incrementMinor();
+  }
+
+  /// Gets the next patch version number that follows this one.
+  ///
+  /// If this version is a pre-release, then it just strips the pre-release
+  /// suffix. Otherwise, it increments the patch version.
+  Version get nextPatch {
+    if (isPreRelease) {
+      return new Version(major, minor, patch);
+    }
+
+    return _incrementPatch();
+  }
+
+  /// Gets the next breaking version number that follows this one.
+  ///
+  /// Increments [major] if it's greater than zero, otherwise [minor], resets
+  /// subsequent digits to zero, and strips any [preRelease] or [build]
+  /// suffix.
+  Version get nextBreaking {
+    if (major == 0) {
+      return _incrementMinor();
+    }
+
+    return _incrementMajor();
+  }
+
+  Version _incrementMajor() => new Version(major + 1, 0, 0);
+  Version _incrementMinor() => new Version(major, minor + 1, 0);
+  Version _incrementPatch() => new Version(major, minor, patch + 1);
+
+  /// Tests if [other] matches this version exactly.
+  bool allows(Version other) => this == other;
+
+  bool allowsAll(VersionConstraint other) => other.isEmpty || other == this;
+
+  bool allowsAny(VersionConstraint other) => other.allows(this);
+
+  VersionConstraint intersect(VersionConstraint other) =>
+      other.allows(this) ? this : VersionConstraint.empty;
+
+  VersionConstraint union(VersionConstraint other) {
+    if (other.allows(this)) return other;
+
+    if (other is VersionRange) {
+      if (other.min == this) {
+        return new VersionRange(
+            min: other.min, max: other.max,
+            includeMin: true, includeMax: other.includeMax);
+      }
+
+      if (other.max == this) {
+        return new VersionRange(
+            min: other.min, max: other.max,
+            includeMin: other.includeMin, includeMax: true);
+      }
+    }
+
+    return new VersionConstraint.unionOf([this, other]);
+  }
+
+  int compareTo(Version other) {
+    if (major != other.major) return major.compareTo(other.major);
+    if (minor != other.minor) return minor.compareTo(other.minor);
+    if (patch != other.patch) return patch.compareTo(other.patch);
+
+    // Pre-releases always come before no pre-release string.
+    if (!isPreRelease && other.isPreRelease) return 1;
+    if (!other.isPreRelease && isPreRelease) return -1;
+
+    var comparison = _compareLists(preRelease, other.preRelease);
+    if (comparison != 0) return comparison;
+
+    // Builds always come after no build string.
+    if (build.isEmpty && other.build.isNotEmpty) return -1;
+    if (other.build.isEmpty && build.isNotEmpty) return 1;
+    return _compareLists(build, other.build);
+  }
+
+  String toString() => _text;
+
+  /// Compares a dot-separated component of two versions.
+  ///
+  /// This is used for the pre-release and build version parts. This follows
+  /// Rule 12 of the Semantic Versioning spec (v2.0.0-rc.1).
+  int _compareLists(List a, List b) {
+    for (var i = 0; i < math.max(a.length, b.length); i++) {
+      var aPart = (i < a.length) ? a[i] : null;
+      var bPart = (i < b.length) ? b[i] : null;
+
+      if (aPart == bPart) continue;
+
+      // Missing parts come before present ones.
+      if (aPart == null) return -1;
+      if (bPart == null) return 1;
+
+      if (aPart is num) {
+        if (bPart is num) {
+          // Compare two numbers.
+          return aPart.compareTo(bPart);
+        } else {
+          // Numbers come before strings.
+          return -1;
+        }
+      } else {
+        if (bPart is num) {
+          // Strings come after numbers.
+          return 1;
+        } else {
+          // Compare two strings.
+          return aPart.compareTo(bPart);
+        }
+      }
+    }
+
+    // The lists are entirely equal.
+    return 0;
+  }
+}
diff --git a/mojo/public/dart/third_party/pub_semver/lib/src/version_constraint.dart b/mojo/public/dart/third_party/pub_semver/lib/src/version_constraint.dart
new file mode 100644
index 0000000..3f4d5b8
--- /dev/null
+++ b/mojo/public/dart/third_party/pub_semver/lib/src/version_constraint.dart
@@ -0,0 +1,225 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_semver.src.version_constraint;
+
+import 'patterns.dart';
+import 'version.dart';
+import 'version_range.dart';
+import 'version_union.dart';
+
+/// A [VersionConstraint] is a predicate that can determine whether a given
+/// version is valid or not.
+///
+/// For example, a ">= 2.0.0" constraint allows any version that is "2.0.0" or
+/// greater. Version objects themselves implement this to match a specific
+/// version.
+abstract class VersionConstraint {
+  /// A [VersionConstraint] that allows all versions.
+  static VersionConstraint any = new VersionRange();
+
+  /// A [VersionConstraint] that allows no versions -- the empty set.
+  static VersionConstraint empty = const _EmptyVersion();
+
+  /// Parses a version constraint.
+  ///
+  /// This string is one of:
+  ///
+  ///   * "any". [any] version.
+  ///   * "^" followed by a version string. Versions compatible with
+  ///     ([VersionConstraint.compatibleWith]) the version.
+  ///   * a series of version parts. Each part can be one of:
+  ///     * A version string like `1.2.3`. In other words, anything that can be
+  ///       parsed by [Version.parse()].
+  ///     * A comparison operator (`<`, `>`, `<=`, or `>=`) followed by a
+  ///       version string.
+  ///
+  /// Whitespace is ignored.
+  ///
+  /// Examples:
+  ///
+  ///     any
+  ///     ^0.7.2
+  ///     ^1.0.0-alpha
+  ///     1.2.3-alpha
+  ///     <=5.1.4
+  ///     >2.0.4 <= 2.4.6
+  factory VersionConstraint.parse(String text) {
+    var originalText = text;
+
+    skipWhitespace() {
+      text = text.trim();
+    }
+
+    skipWhitespace();
+
+    // Handle the "any" constraint.
+    if (text == "any") return any;
+
+    // Try to parse and consume a version number.
+    matchVersion() {
+      var version = START_VERSION.firstMatch(text);
+      if (version == null) return null;
+
+      text = text.substring(version.end);
+      return new Version.parse(version[0]);
+    }
+
+    // Try to parse and consume a comparison operator followed by a version.
+    matchComparison() {
+      var comparison = START_COMPARISON.firstMatch(text);
+      if (comparison == null) return null;
+
+      var op = comparison[0];
+      text = text.substring(comparison.end);
+      skipWhitespace();
+
+      var version = matchVersion();
+      if (version == null) {
+        throw new FormatException('Expected version number after "$op" in '
+            '"$originalText", got "$text".');
+      }
+
+      switch (op) {
+        case '<=': return new VersionRange(max: version, includeMax: true);
+        case '<': return new VersionRange(max: version, includeMax: false);
+        case '>=': return new VersionRange(min: version, includeMin: true);
+        case '>': return new VersionRange(min: version, includeMin: false);
+      }
+      throw "Unreachable.";
+    }
+
+    // Try to parse the "^" operator followed by a version.
+    matchCompatibleWith() {
+      if (!text.startsWith(COMPATIBLE_WITH)) return null;
+
+      text = text.substring(COMPATIBLE_WITH.length);
+      skipWhitespace();
+
+      var version = matchVersion();
+      if (version == null) {
+        throw new FormatException('Expected version number after '
+            '"$COMPATIBLE_WITH" in "$originalText", got "$text".');
+      }
+
+      if (text.isNotEmpty) {
+        throw new FormatException('Cannot include other constraints with '
+            '"$COMPATIBLE_WITH" constraint in "$originalText".');
+      }
+
+      return new VersionConstraint.compatibleWith(version);
+    }
+
+    var compatibleWith = matchCompatibleWith();
+    if (compatibleWith != null) return compatibleWith;
+
+    var constraints = [];
+
+    while (true) {
+      skipWhitespace();
+
+      if (text.isEmpty) break;
+
+      var version = matchVersion();
+      if (version != null) {
+        constraints.add(version);
+        continue;
+      }
+
+      var comparison = matchComparison();
+      if (comparison != null) {
+        constraints.add(comparison);
+        continue;
+      }
+
+      // If we got here, we couldn't parse the remaining string.
+      throw new FormatException('Could not parse version "$originalText". '
+          'Unknown text at "$text".');
+    }
+
+    if (constraints.isEmpty) {
+      throw new FormatException('Cannot parse an empty string.');
+    }
+
+    return new VersionConstraint.intersection(constraints);
+  }
+
+  /// Creates a version constraint which allows all versions that are
+  /// backward compatible with [version].
+  ///
+  /// Versions are considered backward compatible with [version] if they
+  /// are greater than or equal to [version], but less than the next breaking
+  /// version ([Version.nextBreaking]) of [version].
+  factory VersionConstraint.compatibleWith(Version version) =>
+      new _CompatibleWithVersionRange(version);
+
+  /// Creates a new version constraint that is the intersection of
+  /// [constraints].
+  ///
+  /// It only allows versions that all of those constraints allow. If
+  /// constraints is empty, then it returns a VersionConstraint that allows
+  /// all versions.
+  factory VersionConstraint.intersection(
+      Iterable<VersionConstraint> constraints) {
+    var constraint = new VersionRange();
+    for (var other in constraints) {
+      constraint = constraint.intersect(other);
+    }
+    return constraint;
+  }
+
+  /// Creates a new version constraint that is the union of [constraints].
+  ///
+  /// It allows any versions that any of those constraints allows. If
+  /// [constraints] is empty, this returns a constraint that allows no versions.
+  factory VersionConstraint.unionOf(
+          Iterable<VersionConstraint> constraints) =>
+      VersionUnion.create(constraints);
+
+  /// Returns `true` if this constraint allows no versions.
+  bool get isEmpty;
+
+  /// Returns `true` if this constraint allows all versions.
+  bool get isAny;
+
+  /// Returns `true` if this constraint allows [version].
+  bool allows(Version version);
+
+  /// Returns `true` if this constraint allows all the versions that [other]
+  /// allows.
+  bool allowsAll(VersionConstraint other);
+
+  /// Returns `true` if this constraint allows any of the versions that [other]
+  /// allows.
+  bool allowsAny(VersionConstraint other);
+
+  /// Creates a new [VersionConstraint] that only allows [Version]s allowed by
+  /// both this and [other].
+  VersionConstraint intersect(VersionConstraint other);
+
+  /// Creates a new [VersionConstraint] that allows [Versions]s allowed by
+  /// either this or [other].
+  VersionConstraint union(VersionConstraint other);
+}
+
+class _EmptyVersion implements VersionConstraint {
+  const _EmptyVersion();
+
+  bool get isEmpty => true;
+  bool get isAny => false;
+  bool allows(Version other) => false;
+  bool allowsAll(Version other) => other.isEmpty;
+  bool allowsAny(Version other) => false;
+  VersionConstraint intersect(VersionConstraint other) => this;
+  VersionConstraint union(VersionConstraint other) => other;
+  String toString() => '<empty>';
+}
+
+class _CompatibleWithVersionRange extends VersionRange {
+  _CompatibleWithVersionRange(Version version) : super(
+      min: version, includeMin: true,
+      max: version.nextBreaking, includeMax: false);
+
+  String toString() => '^$min';
+}
diff --git a/mojo/public/dart/third_party/pub_semver/lib/src/version_range.dart b/mojo/public/dart/third_party/pub_semver/lib/src/version_range.dart
new file mode 100644
index 0000000..5c53834
--- /dev/null
+++ b/mojo/public/dart/third_party/pub_semver/lib/src/version_range.dart
@@ -0,0 +1,337 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_semver.src.version_range;
+
+import 'version.dart';
+import 'version_constraint.dart';
+import 'version_union.dart';
+
+/// Constrains versions to a fall within a given range.
+///
+/// If there is a minimum, then this only allows versions that are at that
+/// minimum or greater. If there is a maximum, then only versions less than
+/// that are allowed. In other words, this allows `>= min, < max`.
+class VersionRange implements VersionConstraint {
+  /// The minimum end of the range.
+  ///
+  /// If [includeMin] is `true`, this will be the minimum allowed version.
+  /// Otherwise, it will be the highest version below the range that is not
+  /// allowed.
+  ///
+  /// This may be `null` in which case the range has no minimum end and allows
+  /// any version less than the maximum.
+  final Version min;
+
+  /// The maximum end of the range.
+  ///
+  /// If [includeMax] is `true`, this will be the maximum allowed version.
+  /// Otherwise, it will be the lowest version above the range that is not
+  /// allowed.
+  ///
+  /// This may be `null` in which case the range has no maximum end and allows
+  /// any version greater than the minimum.
+  final Version max;
+
+  /// If `true` then [min] is allowed by the range.
+  final bool includeMin;
+
+  /// If `true`, then [max] is allowed by the range.
+  final bool includeMax;
+
+  /// Creates a new version range from [min] to [max], either inclusive or
+  /// exclusive.
+  ///
+  /// If it is an error if [min] is greater than [max].
+  ///
+  /// Either [max] or [min] may be omitted to not clamp the range at that end.
+  /// If both are omitted, the range allows all versions.
+  ///
+  /// If [includeMin] is `true`, then the minimum end of the range is inclusive.
+  /// Likewise, passing [includeMax] as `true` makes the upper end inclusive.
+  VersionRange({this.min, this.max,
+      this.includeMin: false, this.includeMax: false}) {
+    if (min != null && max != null && min > max) {
+      throw new ArgumentError(
+          'Minimum version ("$min") must be less than maximum ("$max").');
+    }
+  }
+
+  bool operator ==(other) {
+    if (other is! VersionRange) return false;
+
+    return min == other.min &&
+           max == other.max &&
+           includeMin == other.includeMin &&
+           includeMax == other.includeMax;
+  }
+
+  int get hashCode => min.hashCode ^ (max.hashCode * 3) ^
+      (includeMin.hashCode * 5) ^ (includeMax.hashCode * 7);
+
+  bool get isEmpty => false;
+
+  bool get isAny => min == null && max == null;
+
+  /// Tests if [other] falls within this version range.
+  bool allows(Version other) {
+    if (min != null) {
+      if (other < min) return false;
+      if (!includeMin && other == min) return false;
+    }
+
+    if (max != null) {
+      if (other > max) return false;
+      if (!includeMax && other == max) return false;
+
+
+      // Disallow pre-release versions that have the same major, minor, and
+      // patch version as the max, but only if neither the max nor the min is a
+      // pre-release of that version. This ensures that "^1.2.3" doesn't include
+      // "2.0.0-pre", while also allowing both ">=2.0.0-pre.2 <2.0.0" and
+      // ">=1.2.3 <2.0.0-pre.7" to match "2.0.0-pre.5".
+      //
+      // It's worth noting that this is different than [NPM's semantics][]. NPM
+      // disallows **all** pre-release versions unless their major, minor, and
+      // patch numbers match those of a prerelease min or max. This ensures that
+      // no prerelease versions will ever be selected if the user doesn't
+      // explicitly allow them.
+      //
+      // [NPM's semantics]: https://www.npmjs.org/doc/misc/semver.html#prerelease-tags
+      //
+      // Instead, we ensure that release versions will always be preferred over
+      // prerelease versions by ordering the release versions first in
+      // [Version.prioritize]. This means that constraints like "any" or
+      // ">1.2.3" can still match prerelease versions if they're the only things
+      // available.
+      var maxIsReleaseOfOther = !includeMax &&
+          !max.isPreRelease && other.isPreRelease &&
+          _equalsWithoutPreRelease(other, max);
+      var minIsPreReleaseOfOther = min != null && min.isPreRelease &&
+          _equalsWithoutPreRelease(other, min);
+      if (maxIsReleaseOfOther && !minIsPreReleaseOfOther) return false;
+    }
+
+    return true;
+  }
+
+  bool _equalsWithoutPreRelease(Version version1, Version version2) =>
+      version1.major == version2.major &&
+          version1.minor == version2.minor &&
+          version1.patch == version2.patch;
+
+  bool allowsAll(VersionConstraint other) {
+    if (other.isEmpty) return true;
+    if (other is Version) return allows(other);
+
+    if (other is VersionUnion) {
+      return other.constraints.every((constraint) => allowsAll(constraint));
+    }
+
+    if (other is VersionRange) {
+      if (min != null) {
+        if (other.min == null) return false;
+        if (min > other.min) return false;
+        if (min == other.min && !includeMin && other.includeMin) return false;
+      }
+
+      if (max != null) {
+        if (other.max == null) return false;
+        if (max < other.max) return false;
+        if (max == other.max && !includeMax && other.includeMax) return false;
+      }
+
+      return true;
+    }
+
+    throw new ArgumentError('Unknown VersionConstraint type $other.');
+  }
+
+  bool allowsAny(VersionConstraint other) {
+    if (other.isEmpty) return false;
+    if (other is Version) return allows(other);
+
+    if (other is VersionUnion) {
+      return other.constraints.any((constraint) => allowsAny(constraint));
+    }
+
+    if (other is VersionRange) {
+      // If neither range has a minimum, they'll overlap at some point.
+      //
+      //     ...     this     ]
+      //     ...     other         ]
+      if (min == null && other.min == null) return true;
+
+      // If this range has a lower minimum than the other range, it overlaps as
+      // long as its maximum is higher than or the same as the other range's
+      // minimum.
+      //
+      //     [  this  ]            [  this  ]
+      //        [  other  ]                 [  other  ]
+      if (min == null || (other.min != null && min < other.min)) {
+        if (max == null) return true;
+        if (max > other.min) return true;
+        if (max < other.min) return false;
+        assert(max == other.min);
+        return includeMax && other.includeMin;
+      }
+
+      // If this range has a higher minimum than the other range, it overlaps as
+      // long as its minimum is lower than or the same as the other range's
+      // maximum.
+      //
+      //         [  this  ]               [  this  ]
+      //     [  other  ]        [  other  ]
+      if (other.max == null) return true;
+      if (min < other.max) return true;
+      if (min > other.max) return false;
+      assert(min == other.max);
+      return includeMin && other.includeMax;
+    }
+
+    throw new ArgumentError('Unknown VersionConstraint type $other.');
+  }
+
+  VersionConstraint intersect(VersionConstraint other) {
+    if (other.isEmpty) return other;
+    if (other is VersionUnion) return other.intersect(this);
+
+    // A range and a Version just yields the version if it's in the range.
+    if (other is Version) {
+      return allows(other) ? other : VersionConstraint.empty;
+    }
+
+    if (other is VersionRange) {
+      // Intersect the two ranges.
+      var intersectMin = min;
+      var intersectIncludeMin = includeMin;
+      var intersectMax = max;
+      var intersectIncludeMax = includeMax;
+
+      if (other.min == null) {
+        // Do nothing.
+      } else if (intersectMin == null || intersectMin < other.min) {
+        intersectMin = other.min;
+        intersectIncludeMin = other.includeMin;
+      } else if (intersectMin == other.min && !other.includeMin) {
+        // The edges are the same, but one is exclusive, make it exclusive.
+        intersectIncludeMin = false;
+      }
+
+      if (other.max == null) {
+        // Do nothing.
+      } else if (intersectMax == null || intersectMax > other.max) {
+        intersectMax = other.max;
+        intersectIncludeMax = other.includeMax;
+      } else if (intersectMax == other.max && !other.includeMax) {
+        // The edges are the same, but one is exclusive, make it exclusive.
+        intersectIncludeMax = false;
+      }
+
+      if (intersectMin == null && intersectMax == null) {
+        // Open range.
+        return new VersionRange();
+      }
+
+      // If the range is just a single version.
+      if (intersectMin == intersectMax) {
+        // If both ends are inclusive, allow that version.
+        if (intersectIncludeMin && intersectIncludeMax) return intersectMin;
+
+        // Otherwise, no versions.
+        return VersionConstraint.empty;
+      }
+
+      if (intersectMin != null && intersectMax != null &&
+          intersectMin > intersectMax) {
+        // Non-overlapping ranges, so empty.
+        return VersionConstraint.empty;
+      }
+
+      // If we got here, there is an actual range.
+      return new VersionRange(min: intersectMin, max: intersectMax,
+          includeMin: intersectIncludeMin, includeMax: intersectIncludeMax);
+    }
+
+    throw new ArgumentError('Unknown VersionConstraint type $other.');
+  }
+
+  VersionConstraint union(VersionConstraint other) {
+    if (other is Version) {
+      if (allows(other)) return this;
+
+      if (other == min) {
+        return new VersionRange(
+            min: this.min, max: this.max,
+            includeMin: true, includeMax: this.includeMax);
+      }
+
+      if (other == max) {
+        return new VersionRange(
+            min: this.min, max: this.max,
+            includeMin: this.includeMin, includeMax: true);
+      }
+
+      return new VersionConstraint.unionOf([this, other]);
+    }
+
+    if (other is VersionRange) {
+      // If the two ranges don't overlap, we won't be able to create a single
+      // VersionRange for both of them.
+      var edgesTouch = (max == other.min && (includeMax || other.includeMin)) ||
+          (min == other.max && (includeMin || other.includeMax));
+      if (!edgesTouch && !allowsAny(other)) {
+        return new VersionConstraint.unionOf([this, other]);
+      }
+
+      var unionMin = min;
+      var unionIncludeMin = includeMin;
+      var unionMax = max;
+      var unionIncludeMax = includeMax;
+
+      if (unionMin == null) {
+        // Do nothing.
+      } else if (other.min == null || other.min < min) {
+        unionMin = other.min;
+        unionIncludeMin = other.includeMin;
+      } else if (min == other.min && other.includeMin) {
+        // If the edges are the same but one is inclusive, make it inclusive.
+        unionIncludeMin = true;
+      }
+
+      if (unionMax == null) {
+        // Do nothing.
+      } else if (other.max == null || other.max > max) {
+        unionMax = other.max;
+        unionIncludeMax = other.includeMax;
+      } else if (max == other.max && other.includeMax) {
+        // If the edges are the same but one is inclusive, make it inclusive.
+        unionIncludeMax = true;
+      }
+
+      return new VersionRange(min: unionMin, max: unionMax,
+          includeMin: unionIncludeMin, includeMax: unionIncludeMax);
+    }
+
+    return new VersionConstraint.unionOf([this, other]);
+  }
+
+  String toString() {
+    var buffer = new StringBuffer();
+
+    if (min != null) {
+      buffer.write(includeMin ? '>=' : '>');
+      buffer.write(min);
+    }
+
+    if (max != null) {
+      if (min != null) buffer.write(' ');
+      buffer.write(includeMax ? '<=' : '<');
+      buffer.write(max);
+    }
+
+    if (min == null && max == null) buffer.write('any');
+    return buffer.toString();
+  }
+}
diff --git a/mojo/public/dart/third_party/pub_semver/lib/src/version_union.dart b/mojo/public/dart/third_party/pub_semver/lib/src/version_union.dart
new file mode 100644
index 0000000..ee9f657
--- /dev/null
+++ b/mojo/public/dart/third_party/pub_semver/lib/src/version_union.dart
@@ -0,0 +1,182 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_semver.src.version_union;
+
+import 'package:collection/collection.dart';
+
+import 'utils.dart';
+import 'version.dart';
+import 'version_constraint.dart';
+import 'version_range.dart';
+
+/// A (package-private) version constraint representing a union of multiple
+/// disjoint version constraints.
+///
+/// An instance of this will only be created if the version can't be represented
+/// as a non-compound value.
+class VersionUnion implements VersionConstraint {
+  /// The constraints that compose this union.
+  ///
+  /// This list has two invariants:
+  ///
+  /// * Its contents are sorted from lowest to highest matched versions.
+  /// * Its contents are disjoint and non-adjacent. In other words, for any two
+  ///   constraints next to each other in the list, there's some version between
+  ///   those constraints that they don't match.
+  final List<VersionRange> constraints;
+
+  bool get isEmpty => false;
+
+  bool get isAny => false;
+
+  /// Returns the union of [constraints].
+  ///
+  /// This ensures that an actual [VersionUnion] is only returned if necessary.
+  /// It also takes care of sorting and merging the constraints to ensure that
+  /// they're disjoint.
+  static VersionConstraint create(Iterable<VersionConstraint> constraints) {
+    var flattened = constraints.expand((constraint) {
+      if (constraint.isEmpty) return [];
+      if (constraint is VersionUnion) return constraint.constraints;
+      return [constraint];
+    }).toList();
+
+    if (flattened.isEmpty) return VersionConstraint.empty;
+
+    if (flattened.any((constraint) => constraint.isAny)) {
+      return VersionConstraint.any;
+    }
+
+    // Only allow Versions and VersionRanges here so we can more easily reason
+    // about everything in [flattened]. _EmptyVersions and VersionUnions are
+    // filtered out above.
+    for (var constraint in flattened) {
+      if (constraint is VersionRange) continue;
+      throw new ArgumentError('Unknown VersionConstraint type $constraint.');
+    }
+
+    (flattened as List).sort(compareMax);
+
+    var merged = [];
+    for (var constraint in flattened) {
+      // Merge this constraint with the previous one, but only if they touch.
+      if (merged.isEmpty ||
+          (!merged.last.allowsAny(constraint) &&
+              !areAdjacent(merged.last, constraint))) {
+        merged.add(constraint);
+      } else {
+        merged[merged.length - 1] = merged.last.union(constraint);
+      }
+    }
+
+    if (merged.length == 1) return merged.single;
+    return new VersionUnion._(merged);
+  }
+
+  VersionUnion._(this.constraints);
+
+  bool allows(Version version) =>
+      constraints.any((constraint) => constraint.allows(version));
+
+  bool allowsAll(VersionConstraint other) {
+    var ourConstraints = constraints.iterator;
+    var theirConstraints = _constraintsFor(other).iterator;
+
+    // Because both lists of constraints are ordered by minimum version, we can
+    // safely move through them linearly here.
+    ourConstraints.moveNext();
+    theirConstraints.moveNext();
+    while (ourConstraints.current != null && theirConstraints.current != null) {
+      if (ourConstraints.current.allowsAll(theirConstraints.current)) {
+        theirConstraints.moveNext();
+      } else {
+        ourConstraints.moveNext();
+      }
+    }
+
+    // If our constraints have allowed all of their constraints, we'll have
+    // consumed all of them.
+    return theirConstraints.current == null;
+  }
+
+  bool allowsAny(VersionConstraint other) {
+    var ourConstraints = constraints.iterator;
+    var theirConstraints = _constraintsFor(other).iterator;
+
+    // Because both lists of constraints are ordered by minimum version, we can
+    // safely move through them linearly here.
+    ourConstraints.moveNext();
+    theirConstraints.moveNext();
+    while (ourConstraints.current != null && theirConstraints.current != null) {
+      if (ourConstraints.current.allowsAny(theirConstraints.current)) {
+        return true;
+      }
+
+      // Move the constraint with the higher max value forward. This ensures
+      // that we keep both lists in sync as much as possible.
+      if (compareMax(ourConstraints.current, theirConstraints.current) < 0) {
+        ourConstraints.moveNext();
+      } else {
+        theirConstraints.moveNext();
+      }
+    }
+
+    return false;
+  }
+
+  VersionConstraint intersect(VersionConstraint other) {
+    var ourConstraints = constraints.iterator;
+    var theirConstraints = _constraintsFor(other).iterator;
+
+    // Because both lists of constraints are ordered by minimum version, we can
+    // safely move through them linearly here.
+    var newConstraints = [];
+    ourConstraints.moveNext();
+    theirConstraints.moveNext();
+    while (ourConstraints.current != null && theirConstraints.current != null) {
+      var intersection = ourConstraints.current
+          .intersect(theirConstraints.current);
+
+      if (!intersection.isEmpty) newConstraints.add(intersection);
+
+      // Move the constraint with the higher max value forward. This ensures
+      // that we keep both lists in sync as much as possible, and that large
+      // constraints have a chance to match multiple small constraints that they
+      // contain.
+      if (compareMax(ourConstraints.current, theirConstraints.current) < 0) {
+        ourConstraints.moveNext();
+      } else {
+        theirConstraints.moveNext();
+      }
+    }
+
+    if (newConstraints.isEmpty) return VersionConstraint.empty;
+    if (newConstraints.length == 1) return newConstraints.single;
+
+    return new VersionUnion._(newConstraints);
+  }
+
+  /// Returns [constraint] as a list of constraints.
+  ///
+  /// This is used to normalize constraints of various types.
+  List<VersionRange> _constraintsFor(VersionConstraint constraint) {
+    if (constraint.isEmpty) return [];
+    if (constraint is VersionUnion) return constraint.constraints;
+    if (constraint is VersionRange) return [constraint];
+    throw new ArgumentError('Unknown VersionConstraint type $constraint.');
+  }
+
+  VersionConstraint union(VersionConstraint other) =>
+      new VersionConstraint.unionOf([this, other]);
+
+  bool operator ==(other) {
+    if (other is! VersionUnion) return false;
+    return const ListEquality().equals(constraints, other.constraints);
+  }
+
+  int get hashCode => const ListEquality().hash(constraints);
+
+  String toString() => constraints.join(" or ");
+}
diff --git a/mojo/public/dart/third_party/pub_semver/pubspec.yaml b/mojo/public/dart/third_party/pub_semver/pubspec.yaml
new file mode 100644
index 0000000..33545a3
--- /dev/null
+++ b/mojo/public/dart/third_party/pub_semver/pubspec.yaml
@@ -0,0 +1,13 @@
+name: pub_semver
+version: 1.2.1
+author: Dart Team <misc@dartlang.org>
+description: >
+ Versions and version constraints implementing pub's versioning policy. This
+ is very similar to vanilla semver, with a few corner cases.
+homepage: http://github.com/dart-lang/pub_semver
+dependencies:
+  collection: ">=0.9.0 <2.0.0"
+dev_dependencies:
+  test: ">=0.12.0 <0.13.0"
+environment:
+  sdk: ">=1.0.0 <2.0.0"
diff --git a/mojo/public/dart/third_party/pub_semver/test/utils.dart b/mojo/public/dart/third_party/pub_semver/test/utils.dart
new file mode 100644
index 0000000..6fefdae
--- /dev/null
+++ b/mojo/public/dart/third_party/pub_semver/test/utils.dart
@@ -0,0 +1,100 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_semver.test.utils;
+
+import 'package:test/test.dart';
+
+import 'package:pub_semver/pub_semver.dart';
+
+/// Some stock example versions to use in tests.
+final v003 = new Version.parse('0.0.3');
+final v010 = new Version.parse('0.1.0');
+final v072 = new Version.parse('0.7.2');
+final v080 = new Version.parse('0.8.0');
+final v114 = new Version.parse('1.1.4');
+final v123 = new Version.parse('1.2.3');
+final v124 = new Version.parse('1.2.4');
+final v130 = new Version.parse('1.3.0');
+final v140 = new Version.parse('1.4.0');
+final v200 = new Version.parse('2.0.0');
+final v201 = new Version.parse('2.0.1');
+final v234 = new Version.parse('2.3.4');
+final v250 = new Version.parse('2.5.0');
+final v300 = new Version.parse('3.0.0');
+
+/// A [Matcher] that tests if a [VersionConstraint] allows or does not allow a
+/// given list of [Version]s.
+class _VersionConstraintMatcher implements Matcher {
+  final List<Version> _expected;
+  final bool _allow;
+
+  _VersionConstraintMatcher(this._expected, this._allow);
+
+  bool matches(item, Map matchState) => (item is VersionConstraint) &&
+      _expected.every((version) => item.allows(version) == _allow);
+
+  Description describe(Description description) {
+    description.addAll(' ${_allow ? "allows" : "does not allow"} versions ',
+        ', ', '', _expected);
+    return description;
+  }
+
+  Description describeMismatch(item, Description mismatchDescription,
+      Map matchState, bool verbose) {
+    if (item is! VersionConstraint) {
+      mismatchDescription.add('was not a VersionConstraint');
+      return mismatchDescription;
+    }
+
+    var first = true;
+    for (var version in _expected) {
+      if (item.allows(version) != _allow) {
+        if (first) {
+          if (_allow) {
+            mismatchDescription.addDescriptionOf(item).add(' did not allow ');
+          } else {
+            mismatchDescription.addDescriptionOf(item).add(' allowed ');
+          }
+        } else {
+          mismatchDescription.add(' and ');
+        }
+        first = false;
+
+        mismatchDescription.add(version.toString());
+      }
+    }
+
+    return mismatchDescription;
+  }
+}
+
+/// Gets a [Matcher] that validates that a [VersionConstraint] allows all
+/// given versions.
+Matcher allows(Version v1, [Version v2, Version v3, Version v4,
+    Version v5, Version v6, Version v7, Version v8]) {
+  var versions = _makeVersionList(v1, v2, v3, v4, v5, v6, v7, v8);
+  return new _VersionConstraintMatcher(versions, true);
+}
+
+/// Gets a [Matcher] that validates that a [VersionConstraint] allows none of
+/// the given versions.
+Matcher doesNotAllow(Version v1, [Version v2, Version v3, Version v4,
+    Version v5, Version v6, Version v7, Version v8]) {
+  var versions = _makeVersionList(v1, v2, v3, v4, v5, v6, v7, v8);
+  return new _VersionConstraintMatcher(versions, false);
+}
+
+List<Version> _makeVersionList(Version v1, [Version v2, Version v3, Version v4,
+    Version v5, Version v6, Version v7, Version v8]) {
+  var versions = [v1];
+  if (v2 != null) versions.add(v2);
+  if (v3 != null) versions.add(v3);
+  if (v4 != null) versions.add(v4);
+  if (v5 != null) versions.add(v5);
+  if (v6 != null) versions.add(v6);
+  if (v7 != null) versions.add(v7);
+  if (v8 != null) versions.add(v8);
+  return versions;
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/pub_semver/test/version_constraint_test.dart b/mojo/public/dart/third_party/pub_semver/test/version_constraint_test.dart
new file mode 100644
index 0000000..b383054
--- /dev/null
+++ b/mojo/public/dart/third_party/pub_semver/test/version_constraint_test.dart
@@ -0,0 +1,188 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_semver.test.version_constraint_test;
+
+import 'package:test/test.dart';
+
+import 'package:pub_semver/pub_semver.dart';
+
+import 'utils.dart';
+
+main() {
+  test('any', () {
+    expect(VersionConstraint.any.isAny, isTrue);
+    expect(VersionConstraint.any, allows(
+        new Version.parse('0.0.0-blah'),
+        new Version.parse('1.2.3'),
+        new Version.parse('12345.678.90')));
+  });
+
+  test('empty', () {
+    expect(VersionConstraint.empty.isEmpty, isTrue);
+    expect(VersionConstraint.empty.isAny, isFalse);
+    expect(VersionConstraint.empty, doesNotAllow(
+        new Version.parse('0.0.0-blah'),
+        new Version.parse('1.2.3'),
+        new Version.parse('12345.678.90')));
+  });
+
+  group('parse()', () {
+    test('parses an exact version', () {
+      var constraint = new VersionConstraint.parse('1.2.3-alpha');
+
+      expect(constraint is Version, isTrue);
+      expect(constraint, equals(new Version(1, 2, 3, pre: 'alpha')));
+    });
+
+    test('parses "any"', () {
+      var constraint = new VersionConstraint.parse('any');
+
+      expect(constraint is VersionConstraint, isTrue);
+      expect(constraint, allows(
+          new Version.parse('0.0.0'),
+          new Version.parse('1.2.3'),
+          new Version.parse('12345.678.90')));
+    });
+
+    test('parses a ">" minimum version', () {
+      var constraint = new VersionConstraint.parse('>1.2.3');
+
+      expect(constraint, allows(
+          new Version.parse('1.2.3+foo'),
+          new Version.parse('1.2.4')));
+      expect(constraint, doesNotAllow(
+          new Version.parse('1.2.1'),
+          new Version.parse('1.2.3-build'),
+          new Version.parse('1.2.3')));
+    });
+
+    test('parses a ">=" minimum version', () {
+      var constraint = new VersionConstraint.parse('>=1.2.3');
+
+      expect(constraint, allows(
+          new Version.parse('1.2.3'),
+          new Version.parse('1.2.3+foo'),
+          new Version.parse('1.2.4')));
+      expect(constraint, doesNotAllow(
+          new Version.parse('1.2.1'),
+          new Version.parse('1.2.3-build')));
+    });
+
+    test('parses a "<" maximum version', () {
+      var constraint = new VersionConstraint.parse('<1.2.3');
+
+      expect(constraint, allows(
+          new Version.parse('1.2.1'),
+          new Version.parse('1.2.2+foo')));
+      expect(constraint, doesNotAllow(
+          new Version.parse('1.2.3'),
+          new Version.parse('1.2.3+foo'),
+          new Version.parse('1.2.4')));
+    });
+
+    test('parses a "<=" maximum version', () {
+      var constraint = new VersionConstraint.parse('<=1.2.3');
+
+      expect(constraint, allows(
+          new Version.parse('1.2.1'),
+          new Version.parse('1.2.3-build'),
+          new Version.parse('1.2.3')));
+      expect(constraint, doesNotAllow(
+          new Version.parse('1.2.3+foo'),
+          new Version.parse('1.2.4')));
+    });
+
+    test('parses a series of space-separated constraints', () {
+      var constraint = new VersionConstraint.parse('>1.0.0 >=1.2.3 <1.3.0');
+
+      expect(constraint, allows(
+          new Version.parse('1.2.3'),
+          new Version.parse('1.2.5')));
+      expect(constraint, doesNotAllow(
+          new Version.parse('1.2.3-pre'),
+          new Version.parse('1.3.0'),
+          new Version.parse('3.4.5')));
+    });
+
+    test('ignores whitespace around comparison operators', () {
+      var constraint = new VersionConstraint.parse(' >1.0.0>=1.2.3 < 1.3.0');
+
+      expect(constraint, allows(
+          new Version.parse('1.2.3'),
+          new Version.parse('1.2.5')));
+      expect(constraint, doesNotAllow(
+          new Version.parse('1.2.3-pre'),
+          new Version.parse('1.3.0'),
+          new Version.parse('3.4.5')));
+    });
+
+    test('does not allow "any" to be mixed with other constraints', () {
+      expect(() => new VersionConstraint.parse('any 1.0.0'),
+          throwsFormatException);
+    });
+
+    test('parses a "^" version', () {
+      expect(new VersionConstraint.parse('^0.0.3'), equals(
+          new VersionConstraint.compatibleWith(v003)));
+
+      expect(new VersionConstraint.parse('^0.7.2'), equals(
+          new VersionConstraint.compatibleWith(v072)));
+
+      expect(new VersionConstraint.parse('^1.2.3'), equals(
+          new VersionConstraint.compatibleWith(v123)));
+
+      var min = new Version.parse('0.7.2-pre+1');
+      expect(new VersionConstraint.parse('^0.7.2-pre+1'), equals(
+          new VersionConstraint.compatibleWith(min)));
+    });
+
+    test('does not allow "^" to be mixed with other constraints', () {
+      expect(() => new VersionConstraint.parse('>=1.2.3 ^1.0.0'),
+          throwsFormatException);
+      expect(() => new VersionConstraint.parse('^1.0.0 <1.2.3'),
+          throwsFormatException);
+    });
+
+    test('ignores whitespace around "^"', () {
+      var constraint = new VersionConstraint.parse(' ^ 1.2.3 ');
+
+      expect(constraint, equals(
+          new VersionConstraint.compatibleWith(v123)));
+    });
+
+    test('throws FormatException on a bad string', () {
+      var bad = [
+         "", "   ",               // Empty string.
+         "foo",                   // Bad text.
+         ">foo",                  // Bad text after operator.
+         "^foo",                  // Bad text after "^".
+         "1.0.0 foo", "1.0.0foo", // Bad text after version.
+         "anything",              // Bad text after "any".
+         "<>1.0.0",               // Multiple operators.
+         "1.0.0<"                 // Trailing operator.
+      ];
+
+      for (var text in bad) {
+        expect(() => new VersionConstraint.parse(text),
+            throwsFormatException);
+      }
+    });
+  });
+
+  group('compatibleWith()', () {
+    test('returns the range of compatible versions', () {
+      var constraint = new VersionConstraint.compatibleWith(v072);
+
+      expect(constraint, equals(new VersionRange(min: v072, includeMin: true,
+          max: v072.nextBreaking)));
+    });
+
+    test('toString() uses "^"', () {
+      var constraint = new VersionConstraint.compatibleWith(v072);
+
+      expect(constraint.toString(), equals('^0.7.2'));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/pub_semver/test/version_range_test.dart b/mojo/public/dart/third_party/pub_semver/test/version_range_test.dart
new file mode 100644
index 0000000..6df6b31
--- /dev/null
+++ b/mojo/public/dart/third_party/pub_semver/test/version_range_test.dart
@@ -0,0 +1,450 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_semver.test.version_range_test;
+
+import 'package:test/test.dart';
+
+import 'package:pub_semver/pub_semver.dart';
+
+import 'utils.dart';
+
+main() {
+  group('constructor', () {
+    test('takes a min and max', () {
+      var range = new VersionRange(min: v123, max: v124);
+      expect(range.isAny, isFalse);
+      expect(range.min, equals(v123));
+      expect(range.max, equals(v124));
+    });
+
+    test('allows omitting max', () {
+      var range = new VersionRange(min: v123);
+      expect(range.isAny, isFalse);
+      expect(range.min, equals(v123));
+      expect(range.max, isNull);
+    });
+
+    test('allows omitting min and max', () {
+      var range = new VersionRange();
+      expect(range.isAny, isTrue);
+      expect(range.min, isNull);
+      expect(range.max, isNull);
+    });
+
+    test('takes includeMin', () {
+      var range = new VersionRange(min: v123, includeMin: true);
+      expect(range.includeMin, isTrue);
+    });
+
+    test('includeMin defaults to false if omitted', () {
+      var range = new VersionRange(min: v123);
+      expect(range.includeMin, isFalse);
+    });
+
+    test('takes includeMax', () {
+      var range = new VersionRange(max: v123, includeMax: true);
+      expect(range.includeMax, isTrue);
+    });
+
+    test('includeMax defaults to false if omitted', () {
+      var range = new VersionRange(max: v123);
+      expect(range.includeMax, isFalse);
+    });
+
+    test('throws if min > max', () {
+      expect(() => new VersionRange(min: v124, max: v123), throwsArgumentError);
+    });
+  });
+
+  group('allows()', () {
+    test('version must be greater than min', () {
+      var range = new VersionRange(min: v123);
+
+      expect(range, allows(
+          new Version.parse('1.3.3'),
+          new Version.parse('2.3.3')));
+      expect(range, doesNotAllow(
+          new Version.parse('1.2.2'),
+          new Version.parse('1.2.3')));
+    });
+
+    test('version must be min or greater if includeMin', () {
+      var range = new VersionRange(min: v123, includeMin: true);
+
+      expect(range, allows(
+          new Version.parse('1.2.3'),
+          new Version.parse('1.3.3'),
+          new Version.parse('2.3.3')));
+      expect(range, doesNotAllow(new Version.parse('1.2.2')));
+    });
+
+    test('pre-release versions of inclusive min are excluded', () {
+      var range = new VersionRange(min: v123, includeMin: true);
+
+      expect(range, allows(new Version.parse('1.2.4-dev')));
+      expect(range, doesNotAllow(new Version.parse('1.2.3-dev')));
+    });
+
+    test('version must be less than max', () {
+      var range = new VersionRange(max: v234);
+
+      expect(range, allows(new Version.parse('2.3.3')));
+      expect(range, doesNotAllow(
+          new Version.parse('2.3.4'),
+          new Version.parse('2.4.3')));
+    });
+
+    test('pre-release versions of non-pre-release max are excluded', () {
+      var range = new VersionRange(max: v234);
+
+      expect(range, allows(new Version.parse('2.3.3')));
+      expect(range, doesNotAllow(
+          new Version.parse('2.3.4-dev'),
+          new Version.parse('2.3.4')));
+    });
+
+    test('pre-release versions of non-pre-release max are included if min is a '
+        'pre-release of the same version', () {
+      var range = new VersionRange(
+          min: new Version.parse('2.3.4-dev.0'), max: v234);
+
+      expect(range, allows(new Version.parse('2.3.4-dev.1')));
+      expect(range, doesNotAllow(
+          new Version.parse('2.3.3'),
+          new Version.parse('2.3.4-dev'),
+          new Version.parse('2.3.4')));
+    });
+
+    test('pre-release versions of pre-release max are included', () {
+      var range = new VersionRange(max: new Version.parse('2.3.4-dev.2'));
+
+      expect(range, allows(
+          new Version.parse('2.3.4-dev.1')));
+      expect(range, doesNotAllow(
+          new Version.parse('2.3.4-dev.2'),
+          new Version.parse('2.3.4-dev.3')));
+    });
+
+    test('version must be max or less if includeMax', () {
+      var range = new VersionRange(min: v123, max: v234, includeMax: true);
+
+      expect(range, allows(
+          new Version.parse('2.3.3'),
+          new Version.parse('2.3.4'),
+          // Pre-releases of the max are allowed.
+          new Version.parse('2.3.4-dev')));
+      expect(range, doesNotAllow(new Version.parse('2.4.3')));
+    });
+
+    test('has no min if one was not set', () {
+      var range = new VersionRange(max: v123);
+
+      expect(range, allows(new Version.parse('0.0.0')));
+      expect(range, doesNotAllow(new Version.parse('1.2.3')));
+    });
+
+    test('has no max if one was not set', () {
+      var range = new VersionRange(min: v123);
+
+      expect(range, allows(
+          new Version.parse('1.3.3'),
+          new Version.parse('999.3.3')));
+      expect(range, doesNotAllow(new Version.parse('1.2.3')));
+    });
+
+    test('allows any version if there is no min or max', () {
+      var range = new VersionRange();
+
+      expect(range, allows(
+          new Version.parse('0.0.0'),
+          new Version.parse('999.99.9')));
+    });
+  });
+
+  group('allowsAll()', () {
+    test('allows an empty constraint', () {
+      expect(
+          new VersionRange(min: v123, max: v250)
+              .allowsAll(VersionConstraint.empty),
+          isTrue);
+    });
+
+    test('allows allowed versions', () {
+      var range = new VersionRange(min: v123, max: v250, includeMax: true);
+      expect(range.allowsAll(v123), isFalse);
+      expect(range.allowsAll(v124), isTrue);
+      expect(range.allowsAll(v250), isTrue);
+      expect(range.allowsAll(v300), isFalse);
+    });
+
+    test('with no min', () {
+      var range = new VersionRange(max: v250);
+      expect(range.allowsAll(new VersionRange(min: v080, max: v140)), isTrue);
+      expect(range.allowsAll(new VersionRange(min: v080, max: v300)), isFalse);
+      expect(range.allowsAll(new VersionRange(max: v140)), isTrue);
+      expect(range.allowsAll(new VersionRange(max: v300)), isFalse);
+      expect(range.allowsAll(range), isTrue);
+      expect(range.allowsAll(VersionConstraint.any), isFalse);
+    });
+
+    test('with no max', () {
+      var range = new VersionRange(min: v010);
+      expect(range.allowsAll(new VersionRange(min: v080, max: v140)), isTrue);
+      expect(range.allowsAll(new VersionRange(min: v003, max: v140)), isFalse);
+      expect(range.allowsAll(new VersionRange(min: v080)), isTrue);
+      expect(range.allowsAll(new VersionRange(min: v003)), isFalse);
+      expect(range.allowsAll(range), isTrue);
+      expect(range.allowsAll(VersionConstraint.any), isFalse);
+    });
+
+    test('with a min and max', () {
+      var range = new VersionRange(min: v010, max: v250);
+      expect(range.allowsAll(new VersionRange(min: v080, max: v140)), isTrue);
+      expect(range.allowsAll(new VersionRange(min: v080, max: v300)), isFalse);
+      expect(range.allowsAll(new VersionRange(min: v003, max: v140)), isFalse);
+      expect(range.allowsAll(new VersionRange(min: v080)), isFalse);
+      expect(range.allowsAll(new VersionRange(max: v140)), isFalse);
+      expect(range.allowsAll(range), isTrue);
+    });
+
+    test("allows a bordering range that's not more inclusive", () {
+      var exclusive = new VersionRange(min: v010, max: v250);
+      var inclusive = new VersionRange(
+          min: v010, includeMin: true, max: v250, includeMax: true);
+      expect(inclusive.allowsAll(exclusive), isTrue);
+      expect(inclusive.allowsAll(inclusive), isTrue);
+      expect(exclusive.allowsAll(inclusive), isFalse);
+      expect(exclusive.allowsAll(exclusive), isTrue);
+    });
+
+    test('allows unions that are completely contained', () {
+      var range = new VersionRange(min: v114, max: v200);
+      expect(
+          range.allowsAll(new VersionRange(min: v123, max: v124).union(v140)),
+          isTrue);
+      expect(
+          range.allowsAll(new VersionRange(min: v010, max: v124).union(v140)),
+          isFalse);
+      expect(
+          range.allowsAll(new VersionRange(min: v123, max: v234).union(v140)),
+          isFalse);
+    });
+  });
+
+  group('allowsAny()', () {
+    test('disallows an empty constraint', () {
+      expect(
+          new VersionRange(min: v123, max: v250)
+              .allowsAny(VersionConstraint.empty),
+          isFalse);
+    });
+
+    test('allows allowed versions', () {
+      var range = new VersionRange(min: v123, max: v250, includeMax: true);
+      expect(range.allowsAny(v123), isFalse);
+      expect(range.allowsAny(v124), isTrue);
+      expect(range.allowsAny(v250), isTrue);
+      expect(range.allowsAny(v300), isFalse);
+    });
+
+    test('with no min', () {
+      var range = new VersionRange(max: v200);
+      expect(range.allowsAny(new VersionRange(min: v140, max: v300)), isTrue);
+      expect(range.allowsAny(new VersionRange(min: v234, max: v300)), isFalse);
+      expect(range.allowsAny(new VersionRange(min: v140)), isTrue);
+      expect(range.allowsAny(new VersionRange(min: v234)), isFalse);
+      expect(range.allowsAny(range), isTrue);
+    });
+
+    test('with no max', () {
+      var range = new VersionRange(min: v072);
+      expect(range.allowsAny(new VersionRange(min: v003, max: v140)), isTrue);
+      expect(range.allowsAny(new VersionRange(min: v003, max: v010)), isFalse);
+      expect(range.allowsAny(new VersionRange(max: v080)), isTrue);
+      expect(range.allowsAny(new VersionRange(max: v003)), isFalse);
+      expect(range.allowsAny(range), isTrue);
+    });
+
+    test('with a min and max', () {
+      var range = new VersionRange(min: v072, max: v200);
+      expect(range.allowsAny(new VersionRange(min: v003, max: v140)), isTrue);
+      expect(range.allowsAny(new VersionRange(min: v140, max: v300)), isTrue);
+      expect(range.allowsAny(new VersionRange(min: v003, max: v010)), isFalse);
+      expect(range.allowsAny(new VersionRange(min: v234, max: v300)), isFalse);
+      expect(range.allowsAny(new VersionRange(max: v010)), isFalse);
+      expect(range.allowsAny(new VersionRange(min: v234)), isFalse);
+      expect(range.allowsAny(range), isTrue);
+    });
+
+    test('allows a bordering range when both are inclusive', () {
+      expect(new VersionRange(max: v250).allowsAny(new VersionRange(min: v250)),
+          isFalse);
+
+      expect(new VersionRange(max: v250, includeMax: true)
+              .allowsAny(new VersionRange(min: v250)),
+          isFalse);
+
+      expect(new VersionRange(max: v250)
+              .allowsAny(new VersionRange(min: v250, includeMin: true)),
+          isFalse);
+
+      expect(new VersionRange(max: v250, includeMax: true)
+              .allowsAny(new VersionRange(min: v250, includeMin: true)),
+          isTrue);
+
+      expect(new VersionRange(min: v250).allowsAny(new VersionRange(max: v250)),
+          isFalse);
+
+      expect(new VersionRange(min: v250, includeMin: true)
+              .allowsAny(new VersionRange(max: v250)),
+          isFalse);
+
+      expect(new VersionRange(min: v250)
+              .allowsAny(new VersionRange(max: v250, includeMax: true)),
+          isFalse);
+
+      expect(new VersionRange(min: v250, includeMin: true)
+              .allowsAny(new VersionRange(max: v250, includeMax: true)),
+          isTrue);
+    });
+
+    test('allows unions that are partially contained', () {
+      var range = new VersionRange(min: v114, max: v200);
+      expect(
+          range.allowsAny(new VersionRange(min: v010, max: v080).union(v140)),
+          isTrue);
+      expect(
+          range.allowsAny(new VersionRange(min: v123, max: v234).union(v300)),
+          isTrue);
+      expect(
+          range.allowsAny(new VersionRange(min: v234, max: v300).union(v010)),
+          isFalse);
+    });
+  });
+
+  group('intersect()', () {
+    test('two overlapping ranges', () {
+      var a = new VersionRange(min: v123, max: v250);
+      var b = new VersionRange(min: v200, max: v300);
+      var intersect = a.intersect(b);
+      expect(intersect.min, equals(v200));
+      expect(intersect.max, equals(v250));
+      expect(intersect.includeMin, isFalse);
+      expect(intersect.includeMax, isFalse);
+    });
+
+    test('a non-overlapping range allows no versions', () {
+      var a = new VersionRange(min: v114, max: v124);
+      var b = new VersionRange(min: v200, max: v250);
+      expect(a.intersect(b).isEmpty, isTrue);
+    });
+
+    test('adjacent ranges allow no versions if exclusive', () {
+      var a = new VersionRange(min: v114, max: v124, includeMax: false);
+      var b = new VersionRange(min: v124, max: v200, includeMin: true);
+      expect(a.intersect(b).isEmpty, isTrue);
+    });
+
+    test('adjacent ranges allow version if inclusive', () {
+      var a = new VersionRange(min: v114, max: v124, includeMax: true);
+      var b = new VersionRange(min: v124, max: v200, includeMin: true);
+      expect(a.intersect(b), equals(v124));
+    });
+
+    test('with an open range', () {
+      var open = new VersionRange();
+      var a = new VersionRange(min: v114, max: v124);
+      expect(open.intersect(open), equals(open));
+      expect(a.intersect(open), equals(a));
+    });
+
+    test('returns the version if the range allows it', () {
+      expect(new VersionRange(min: v114, max: v124).intersect(v123),
+          equals(v123));
+      expect(new VersionRange(min: v123, max: v124).intersect(v114).isEmpty,
+          isTrue);
+    });
+  });
+
+  group('union()', () {
+    test("with a version returns the range if it contains the version", () {
+      var range = new VersionRange(min: v114, max: v124);
+      expect(range.union(v123), equals(range));
+    });
+
+    test("with a version on the edge of the range, expands the range", () {
+      expect(new VersionRange(min: v114, max: v124).union(v124),
+          equals(new VersionRange(min: v114, max: v124, includeMax: true)));
+      expect(new VersionRange(min: v114, max: v124).union(v114),
+          equals(new VersionRange(min: v114, max: v124, includeMin: true)));
+    });
+
+    test("with a version allows both the range and the version if the range "
+        "doesn't contain the version", () {
+      var result = new VersionRange(min: v003, max: v114).union(v124);
+      expect(result, allows(v010));
+      expect(result, doesNotAllow(v123));
+      expect(result, allows(v124));
+    });
+
+    test("returns a VersionUnion for a disjoint range", () {
+      var result = new VersionRange(min: v003, max: v114)
+          .union(new VersionRange(min: v130, max: v200));
+      expect(result, allows(v080));
+      expect(result, doesNotAllow(v123));
+      expect(result, allows(v140));
+    });
+
+    test("considers open ranges disjoint", () {
+      var result = new VersionRange(min: v003, max: v114)
+          .union(new VersionRange(min: v114, max: v200));
+      expect(result, allows(v080));
+      expect(result, doesNotAllow(v114));
+      expect(result, allows(v140));
+
+      result = new VersionRange(min: v114, max: v200)
+          .union(new VersionRange(min: v003, max: v114));
+      expect(result, allows(v080));
+      expect(result, doesNotAllow(v114));
+      expect(result, allows(v140));
+    });
+
+    test("returns a merged range for an overlapping range", () {
+      var result = new VersionRange(min: v003, max: v114)
+          .union(new VersionRange(min: v080, max: v200));
+      expect(result, equals(new VersionRange(min: v003, max: v200)));
+    });
+
+    test("considers closed ranges overlapping", () {
+      var result = new VersionRange(min: v003, max: v114, includeMax: true)
+          .union(new VersionRange(min: v114, max: v200));
+      expect(result, equals(new VersionRange(min: v003, max: v200)));
+
+      result = new VersionRange(min: v003, max: v114)
+          .union(new VersionRange(min: v114, max: v200, includeMin: true));
+      expect(result, equals(new VersionRange(min: v003, max: v200)));
+
+      result = new VersionRange(min: v114, max: v200)
+          .union(new VersionRange(min: v003, max: v114, includeMax: true));
+      expect(result, equals(new VersionRange(min: v003, max: v200)));
+
+      result = new VersionRange(min: v114, max: v200, includeMin: true)
+          .union(new VersionRange(min: v003, max: v114));
+      expect(result, equals(new VersionRange(min: v003, max: v200)));
+    });
+
+    test("includes edges if either range does", () {
+      var result = new VersionRange(min: v003, max: v114, includeMin: true)
+          .union(new VersionRange(min: v003, max: v114, includeMax: true));
+      expect(result, equals(new VersionRange(
+          min: v003, max: v114, includeMin: true, includeMax: true)));
+    });
+  });
+
+  test('isEmpty', () {
+    expect(new VersionRange().isEmpty, isFalse);
+    expect(new VersionRange(min: v123, max: v124).isEmpty, isFalse);
+  });
+}
diff --git a/mojo/public/dart/third_party/pub_semver/test/version_test.dart b/mojo/public/dart/third_party/pub_semver/test/version_test.dart
new file mode 100644
index 0000000..e3d1b49
--- /dev/null
+++ b/mojo/public/dart/third_party/pub_semver/test/version_test.dart
@@ -0,0 +1,310 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_semver.test.version_test;
+
+import 'package:test/test.dart';
+
+import 'package:pub_semver/pub_semver.dart';
+
+import 'utils.dart';
+
+main() {
+  test('none', () {
+    expect(Version.none.toString(), equals('0.0.0'));
+  });
+
+  test('prioritize()', () {
+    // A correctly sorted list of versions in order of increasing priority.
+    var versions = [
+      '1.0.0-alpha',
+      '2.0.0-alpha',
+      '1.0.0',
+      '1.0.0+build',
+      '1.0.1',
+      '1.1.0',
+      '2.0.0'
+    ];
+
+    // Ensure that every pair of versions is prioritized in the order that it
+    // appears in the list.
+    for (var i = 0; i < versions.length; i++) {
+      for (var j = 0; j < versions.length; j++) {
+        var a = new Version.parse(versions[i]);
+        var b = new Version.parse(versions[j]);
+        expect(Version.prioritize(a, b), equals(i.compareTo(j)));
+      }
+    }
+  });
+
+  test('antiprioritize()', () {
+    // A correctly sorted list of versions in order of increasing antipriority.
+    var versions = [
+      '2.0.0-alpha',
+      '1.0.0-alpha',
+      '2.0.0',
+      '1.1.0',
+      '1.0.1',
+      '1.0.0+build',
+      '1.0.0'
+    ];
+
+    // Ensure that every pair of versions is prioritized in the order that it
+    // appears in the list.
+    for (var i = 0; i < versions.length; i++) {
+      for (var j = 0; j < versions.length; j++) {
+        var a = new Version.parse(versions[i]);
+        var b = new Version.parse(versions[j]);
+        expect(Version.antiprioritize(a, b), equals(i.compareTo(j)));
+      }
+    }
+  });
+
+  group('constructor', () {
+    test('throws on negative numbers', () {
+      expect(() => new Version(-1, 1, 1), throwsArgumentError);
+      expect(() => new Version(1, -1, 1), throwsArgumentError);
+      expect(() => new Version(1, 1, -1), throwsArgumentError);
+    });
+  });
+
+  group('comparison', () {
+    // A correctly sorted list of versions.
+    var versions = [
+      '1.0.0-alpha',
+      '1.0.0-alpha.1',
+      '1.0.0-beta.2',
+      '1.0.0-beta.11',
+      '1.0.0-rc.1',
+      '1.0.0-rc.1+build.1',
+      '1.0.0',
+      '1.0.0+0.3.7',
+      '1.3.7+build',
+      '1.3.7+build.2.b8f12d7',
+      '1.3.7+build.11.e0f985a',
+      '2.0.0',
+      '2.1.0',
+      '2.2.0',
+      '2.11.0',
+      '2.11.1'
+    ];
+
+    test('compareTo()', () {
+      // Ensure that every pair of versions compares in the order that it
+      // appears in the list.
+      for (var i = 0; i < versions.length; i++) {
+        for (var j = 0; j < versions.length; j++) {
+          var a = new Version.parse(versions[i]);
+          var b = new Version.parse(versions[j]);
+          expect(a.compareTo(b), equals(i.compareTo(j)));
+        }
+      }
+    });
+
+    test('operators', () {
+      for (var i = 0; i < versions.length; i++) {
+        for (var j = 0; j < versions.length; j++) {
+          var a = new Version.parse(versions[i]);
+          var b = new Version.parse(versions[j]);
+          expect(a < b, equals(i < j));
+          expect(a > b, equals(i > j));
+          expect(a <= b, equals(i <= j));
+          expect(a >= b, equals(i >= j));
+          expect(a == b, equals(i == j));
+          expect(a != b, equals(i != j));
+        }
+      }
+    });
+
+    test('equality', () {
+      expect(new Version.parse('01.2.3'), equals(new Version.parse('1.2.3')));
+      expect(new Version.parse('1.02.3'), equals(new Version.parse('1.2.3')));
+      expect(new Version.parse('1.2.03'), equals(new Version.parse('1.2.3')));
+      expect(new Version.parse('1.2.3-01'),
+          equals(new Version.parse('1.2.3-1')));
+      expect(new Version.parse('1.2.3+01'),
+          equals(new Version.parse('1.2.3+1')));
+    });
+  });
+
+  test('allows()', () {
+    expect(v123, allows(v123));
+    expect(v123, doesNotAllow(
+        new Version.parse('2.2.3'),
+        new Version.parse('1.3.3'),
+        new Version.parse('1.2.4'),
+        new Version.parse('1.2.3-dev'),
+        new Version.parse('1.2.3+build')));
+  });
+
+  test('allowsAll()', () {
+    expect(v123.allowsAll(v123), isTrue);
+    expect(v123.allowsAll(v003), isFalse);
+    expect(v123.allowsAll(new VersionRange(min: v114, max: v124)), isFalse);
+    expect(v123.allowsAll(VersionConstraint.any), isFalse);
+    expect(v123.allowsAll(VersionConstraint.empty), isTrue);
+  });
+
+  test('allowsAny()', () {
+    expect(v123.allowsAny(v123), isTrue);
+    expect(v123.allowsAny(v003), isFalse);
+    expect(v123.allowsAny(new VersionRange(min: v114, max: v124)), isTrue);
+    expect(v123.allowsAny(VersionConstraint.any), isTrue);
+    expect(v123.allowsAny(VersionConstraint.empty), isFalse);
+  });
+
+  test('intersect()', () {
+    // Intersecting the same version returns the version.
+    expect(v123.intersect(v123), equals(v123));
+
+    // Intersecting a different version allows no versions.
+    expect(v123.intersect(v114).isEmpty, isTrue);
+
+    // Intersecting a range returns the version if the range allows it.
+    expect(v123.intersect(new VersionRange(min: v114, max: v124)),
+        equals(v123));
+
+    // Intersecting a range allows no versions if the range doesn't allow it.
+    expect(v114.intersect(new VersionRange(min: v123, max: v124)).isEmpty,
+        isTrue);
+  });
+
+  group('union()', () {
+    test("with the same version returns the version", () {
+      expect(v123.union(v123), equals(v123));
+    });
+
+    test("with a different version returns a version that matches both", () {
+      var result = v123.union(v080);
+      expect(result, allows(v123));
+      expect(result, allows(v080));
+
+      // Nothing in between should match.
+      expect(result, doesNotAllow(v114));
+    });
+
+    test("with a range returns the range if it contains the version", () {
+      var range = new VersionRange(min: v114, max: v124);
+      expect(v123.union(range), equals(range));
+    });
+
+    test("with a range with the version on the edge, expands the range", () {
+      expect(v124.union(new VersionRange(min: v114, max: v124)),
+          equals(new VersionRange(min: v114, max: v124, includeMax: true)));
+      expect(v114.union(new VersionRange(min: v114, max: v124)),
+          equals(new VersionRange(min: v114, max: v124, includeMin: true)));
+    });
+
+    test("with a range allows both the range and the version if the range "
+        "doesn't contain the version", () {
+      var result = v123.union(new VersionRange(min: v003, max: v114));
+      expect(result, allows(v123));
+      expect(result, allows(v010));
+    });
+  });
+
+  test('isEmpty', () {
+    expect(v123.isEmpty, isFalse);
+  });
+
+  test('nextMajor', () {
+    expect(v123.nextMajor, equals(v200));
+    expect(v114.nextMajor, equals(v200));
+    expect(v200.nextMajor, equals(v300));
+
+    // Ignores pre-release if not on a major version.
+    expect(new Version.parse('1.2.3-dev').nextMajor, equals(v200));
+
+    // Just removes it if on a major version.
+    expect(new Version.parse('2.0.0-dev').nextMajor, equals(v200));
+
+    // Strips build suffix.
+    expect(new Version.parse('1.2.3+patch').nextMajor, equals(v200));
+  });
+
+  test('nextMinor', () {
+    expect(v123.nextMinor, equals(v130));
+    expect(v130.nextMinor, equals(v140));
+
+    // Ignores pre-release if not on a minor version.
+    expect(new Version.parse('1.2.3-dev').nextMinor, equals(v130));
+
+    // Just removes it if on a minor version.
+    expect(new Version.parse('1.3.0-dev').nextMinor, equals(v130));
+
+    // Strips build suffix.
+    expect(new Version.parse('1.2.3+patch').nextMinor, equals(v130));
+  });
+
+  test('nextPatch', () {
+    expect(v123.nextPatch, equals(v124));
+    expect(v200.nextPatch, equals(v201));
+
+    // Just removes pre-release version if present.
+    expect(new Version.parse('1.2.4-dev').nextPatch, equals(v124));
+
+    // Strips build suffix.
+    expect(new Version.parse('1.2.3+patch').nextPatch, equals(v124));
+  });
+
+  test('nextBreaking', () {
+    expect(v123.nextBreaking, equals(v200));
+    expect(v072.nextBreaking, equals(v080));
+    expect(v003.nextBreaking, equals(v010));
+
+    // Removes pre-release version if present.
+    expect(new Version.parse('1.2.3-dev').nextBreaking, equals(v200));
+
+    // Strips build suffix.
+    expect(new Version.parse('1.2.3+patch').nextBreaking, equals(v200));
+  });
+
+  test('parse()', () {
+    expect(new Version.parse('0.0.0'), equals(new Version(0, 0, 0)));
+    expect(new Version.parse('12.34.56'), equals(new Version(12, 34, 56)));
+
+    expect(new Version.parse('1.2.3-alpha.1'),
+        equals(new Version(1, 2, 3, pre: 'alpha.1')));
+    expect(new Version.parse('1.2.3-x.7.z-92'),
+        equals(new Version(1, 2, 3, pre: 'x.7.z-92')));
+
+    expect(new Version.parse('1.2.3+build.1'),
+        equals(new Version(1, 2, 3, build: 'build.1')));
+    expect(new Version.parse('1.2.3+x.7.z-92'),
+        equals(new Version(1, 2, 3, build: 'x.7.z-92')));
+
+    expect(new Version.parse('1.0.0-rc-1+build-1'),
+        equals(new Version(1, 0, 0, pre: 'rc-1', build: 'build-1')));
+
+    expect(() => new Version.parse('1.0'), throwsFormatException);
+    expect(() => new Version.parse('1.2.3.4'), throwsFormatException);
+    expect(() => new Version.parse('1234'), throwsFormatException);
+    expect(() => new Version.parse('-2.3.4'), throwsFormatException);
+    expect(() => new Version.parse('1.3-pre'), throwsFormatException);
+    expect(() => new Version.parse('1.3+build'), throwsFormatException);
+    expect(() => new Version.parse('1.3+bu?!3ild'), throwsFormatException);
+  });
+
+  group('toString()', () {
+    test('returns the version string', () {
+      expect(new Version(0, 0, 0).toString(), equals('0.0.0'));
+      expect(new Version(12, 34, 56).toString(), equals('12.34.56'));
+
+      expect(new Version(1, 2, 3, pre: 'alpha.1').toString(),
+          equals('1.2.3-alpha.1'));
+      expect(new Version(1, 2, 3, pre: 'x.7.z-92').toString(),
+          equals('1.2.3-x.7.z-92'));
+
+      expect(new Version(1, 2, 3, build: 'build.1').toString(),
+          equals('1.2.3+build.1'));
+      expect(new Version(1, 2, 3, pre: 'pre', build: 'bui').toString(),
+          equals('1.2.3-pre+bui'));
+    });
+
+    test('preserves leading zeroes', () {
+      expect(new Version.parse('001.02.0003-01.dev+pre.002').toString(),
+          equals('001.02.0003-01.dev+pre.002'));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/pub_semver/test/version_union_test.dart b/mojo/public/dart/third_party/pub_semver/test/version_union_test.dart
new file mode 100644
index 0000000..f3518a0
--- /dev/null
+++ b/mojo/public/dart/third_party/pub_semver/test/version_union_test.dart
@@ -0,0 +1,352 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+
+import 'package:pub_semver/pub_semver.dart';
+
+import 'utils.dart';
+
+main() {
+  group('factory', () {
+    test('ignores empty constraints', () {
+      expect(new VersionConstraint.unionOf([
+        VersionConstraint.empty,
+        VersionConstraint.empty,
+        v123,
+        VersionConstraint.empty
+      ]), equals(v123));
+
+      expect(new VersionConstraint.unionOf([
+        VersionConstraint.empty,
+        VersionConstraint.empty
+      ]), isEmpty);
+    });
+
+    test('returns an empty constraint for an empty list', () {
+      expect(new VersionConstraint.unionOf([]), isEmpty);
+    });
+
+    test('any constraints override everything', () {
+      expect(new VersionConstraint.unionOf([
+        v123,
+        VersionConstraint.any,
+        v200,
+        new VersionRange(min: v234, max: v250)
+      ]), equals(VersionConstraint.any));
+    });
+
+    test('flattens other unions', () {
+      expect(new VersionConstraint.unionOf([
+        v072,
+        new VersionConstraint.unionOf([v123, v124]),
+        v250
+      ]), equals(new VersionConstraint.unionOf([v072, v123, v124, v250])));
+    });
+
+    test('returns a single merged range as-is', () {
+      expect(new VersionConstraint.unionOf([
+        new VersionRange(min: v080, max: v140),
+        new VersionRange(min: v123, max: v200)
+      ]), equals(new VersionRange(min: v080, max: v200)));
+    });
+  });
+
+  group('equality', () {
+    test("doesn't depend on original order", () {
+      expect(new VersionConstraint.unionOf([
+        v250,
+        new VersionRange(min: v201, max: v234),
+        v124,
+        v072,
+        new VersionRange(min: v080, max: v114),
+        v123
+      ]), equals(new VersionConstraint.unionOf([
+        v072,
+        new VersionRange(min: v080, max: v114),
+        v123,
+        v124,
+        new VersionRange(min: v201, max: v234),
+        v250
+      ])));
+    });
+
+    test("merges overlapping ranges", () {
+      expect(new VersionConstraint.unionOf([
+        new VersionRange(min: v003, max: v072),
+        new VersionRange(min: v010, max: v080),
+        new VersionRange(min: v114, max: v124),
+        new VersionRange(min: v123, max: v130)
+      ]), equals(new VersionConstraint.unionOf([
+        new VersionRange(min: v003, max: v080),
+        new VersionRange(min: v114, max: v130)
+      ])));
+    });
+
+    test("merges adjacent ranges", () {
+      expect(new VersionConstraint.unionOf([
+        new VersionRange(min: v003, max: v072, includeMax: true),
+        new VersionRange(min: v072, max: v080),
+        new VersionRange(min: v114, max: v124),
+        new VersionRange(min: v124, max: v130, includeMin: true)
+      ]), equals(new VersionConstraint.unionOf([
+        new VersionRange(min: v003, max: v080),
+        new VersionRange(min: v114, max: v130)
+      ])));
+    });
+
+    test("doesn't merge not-quite-adjacent ranges", () {
+      expect(new VersionConstraint.unionOf([
+        new VersionRange(min: v003, max: v072),
+        new VersionRange(min: v072, max: v080)
+      ]), equals(new VersionConstraint.unionOf([
+        new VersionRange(min: v003, max: v072),
+        new VersionRange(min: v072, max: v080)
+      ])));
+    });
+ 
+    test("merges version numbers into ranges", () {
+      expect(new VersionConstraint.unionOf([
+        new VersionRange(min: v003, max: v072),
+        v010,
+        new VersionRange(min: v114, max: v124),
+        v123
+      ]), equals(new VersionConstraint.unionOf([
+        new VersionRange(min: v003, max: v072),
+        new VersionRange(min: v114, max: v124)
+      ])));
+    });
+ 
+    test("merges adjacent version numbers into ranges", () {
+      expect(new VersionConstraint.unionOf([
+        new VersionRange(min: v003, max: v072),
+        v072,
+        v114,
+        new VersionRange(min: v114, max: v124)
+      ]), equals(new VersionConstraint.unionOf([
+        new VersionRange(min: v003, max: v072, includeMax: true),
+        new VersionRange(min: v114, max: v124, includeMin: true)
+      ])));
+    });
+  });
+
+  test('isEmpty returns false', () {
+    expect(new VersionConstraint.unionOf([
+      new VersionRange(min: v003, max: v080),
+      new VersionRange(min: v123, max: v130),
+    ]), isNot(isEmpty));
+  });
+
+  test('isAny returns false', () {
+    expect(new VersionConstraint.unionOf([
+      new VersionRange(min: v003, max: v080),
+      new VersionRange(min: v123, max: v130),
+    ]).isAny, isFalse);
+  });
+
+  test('allows() allows anything the components allow', () {
+    var union = new VersionConstraint.unionOf([
+      new VersionRange(min: v003, max: v080),
+      new VersionRange(min: v123, max: v130),
+      v200
+    ]);
+
+    expect(union, allows(v010));
+    expect(union, doesNotAllow(v080));
+    expect(union, allows(v124));
+    expect(union, doesNotAllow(v140));
+    expect(union, allows(v200));
+  });
+
+  group('allowsAll()', () {
+    test('for a version, returns true if any component allows the version', () {
+      var union = new VersionConstraint.unionOf([
+        new VersionRange(min: v003, max: v080),
+        new VersionRange(min: v123, max: v130),
+        v200
+      ]);
+
+      expect(union.allowsAll(v010), isTrue);
+      expect(union.allowsAll(v080), isFalse);
+      expect(union.allowsAll(v124), isTrue);
+      expect(union.allowsAll(v140), isFalse);
+      expect(union.allowsAll(v200), isTrue);
+    });
+
+    test('for a version range, returns true if any component allows the whole '
+        'range', () {
+      var union = new VersionConstraint.unionOf([
+        new VersionRange(min: v003, max: v080),
+        new VersionRange(min: v123, max: v130)
+      ]);
+
+      expect(union.allowsAll(new VersionRange(min: v003, max: v080)), isTrue);
+      expect(union.allowsAll(new VersionRange(min: v010, max: v072)), isTrue);
+      expect(union.allowsAll(new VersionRange(min: v010, max: v124)), isFalse);
+    });
+
+    group('for a union,', () {
+      var union = new VersionConstraint.unionOf([
+        new VersionRange(min: v003, max: v080),
+        new VersionRange(min: v123, max: v130)
+      ]);
+
+      test('returns true if every constraint matches a different constraint',
+          () {
+        expect(union.allowsAll(new VersionConstraint.unionOf([
+          new VersionRange(min: v010, max: v072),
+          new VersionRange(min: v124, max: v130)
+        ])), isTrue);
+      });
+
+      test('returns true if every constraint matches the same constraint', () {
+        expect(union.allowsAll(new VersionConstraint.unionOf([
+          new VersionRange(min: v003, max: v010),
+          new VersionRange(min: v072, max: v080)
+        ])), isTrue);
+      });
+ 
+      test("returns false if there's an unmatched constraint", () {
+        expect(union.allowsAll(new VersionConstraint.unionOf([
+          new VersionRange(min: v010, max: v072),
+          new VersionRange(min: v124, max: v130),
+          new VersionRange(min: v140, max: v200)
+        ])), isFalse);
+      });
+
+      test("returns false if a constraint isn't fully matched", () {
+        expect(union.allowsAll(new VersionConstraint.unionOf([
+          new VersionRange(min: v010, max: v114),
+          new VersionRange(min: v124, max: v130)
+        ])), isFalse);
+      });
+    });
+  });
+
+  group('allowsAny()', () {
+    test('for a version, returns true if any component allows the version', () {
+      var union = new VersionConstraint.unionOf([
+        new VersionRange(min: v003, max: v080),
+        new VersionRange(min: v123, max: v130),
+        v200
+      ]);
+
+      expect(union.allowsAny(v010), isTrue);
+      expect(union.allowsAny(v080), isFalse);
+      expect(union.allowsAny(v124), isTrue);
+      expect(union.allowsAny(v140), isFalse);
+      expect(union.allowsAny(v200), isTrue);
+    });
+
+    test('for a version range, returns true if any component allows part of '
+        'the range', () {
+      var union = new VersionConstraint.unionOf([
+        new VersionRange(min: v003, max: v080),
+        v123
+      ]);
+
+      expect(union.allowsAny(new VersionRange(min: v010, max: v114)), isTrue);
+      expect(union.allowsAny(new VersionRange(min: v114, max: v124)), isTrue);
+      expect(union.allowsAny(new VersionRange(min: v124, max: v130)), isFalse);
+    });
+
+    group('for a union,', () {
+      var union = new VersionConstraint.unionOf([
+        new VersionRange(min: v010, max: v080),
+        new VersionRange(min: v123, max: v130)
+      ]);
+
+      test('returns true if any constraint matches', () {
+        expect(union.allowsAny(new VersionConstraint.unionOf([
+          v072,
+          new VersionRange(min: v200, max: v300)
+        ])), isTrue);
+
+        expect(union.allowsAny(new VersionConstraint.unionOf([
+          v003,
+          new VersionRange(min: v124, max: v300)
+        ])), isTrue);
+      });
+ 
+      test("returns false if no constraint matches", () {
+        expect(union.allowsAny(new VersionConstraint.unionOf([
+          v003,
+          new VersionRange(min: v130, max: v140),
+          new VersionRange(min: v140, max: v200)
+        ])), isFalse);
+      });
+    });
+  });
+
+  group("intersect()", () {
+    test("with an overlapping version, returns that version", () {
+      expect(new VersionConstraint.unionOf([
+        new VersionRange(min: v010, max: v080),
+        new VersionRange(min: v123, max: v140)
+      ]).intersect(v072), equals(v072));
+    });
+
+    test("with a non-overlapping version, returns an empty constraint", () {
+      expect(new VersionConstraint.unionOf([
+        new VersionRange(min: v010, max: v080),
+        new VersionRange(min: v123, max: v140)
+      ]).intersect(v300), isEmpty);
+    });
+
+    test("with an overlapping range, returns that range", () {
+      var range = new VersionRange(min: v072, max: v080);
+      expect(new VersionConstraint.unionOf([
+        new VersionRange(min: v010, max: v080),
+        new VersionRange(min: v123, max: v140)
+      ]).intersect(range), equals(range));
+    });
+
+    test("with a non-overlapping range, returns an empty constraint", () {
+      expect(new VersionConstraint.unionOf([
+        new VersionRange(min: v010, max: v080),
+        new VersionRange(min: v123, max: v140)
+      ]).intersect(new VersionRange(min: v080, max: v123)), isEmpty);
+    });
+
+    test("with a parially-overlapping range, returns the overlapping parts",
+        () {
+      expect(new VersionConstraint.unionOf([
+        new VersionRange(min: v010, max: v080),
+        new VersionRange(min: v123, max: v140)
+      ]).intersect(new VersionRange(min: v072, max: v130)),
+          equals(new VersionConstraint.unionOf([
+        new VersionRange(min: v072, max: v080),
+        new VersionRange(min: v123, max: v130)
+      ])));
+    });
+
+    group("for a union,", () {
+      var union = new VersionConstraint.unionOf([
+        new VersionRange(min: v003, max: v080),
+        new VersionRange(min: v123, max: v130)
+      ]);
+
+      test("returns the overlapping parts", () {
+        expect(union.intersect(new VersionConstraint.unionOf([
+          v010,
+          new VersionRange(min: v072, max: v124),
+          new VersionRange(min: v124, max: v130)
+        ])), equals(new VersionConstraint.unionOf([
+          v010,
+          new VersionRange(min: v072, max: v080),
+          new VersionRange(min: v123, max: v124),
+          new VersionRange(min: v124, max: v130)
+        ])));
+      });
+
+      test("drops parts that don't match", () {
+        expect(union.intersect(new VersionConstraint.unionOf([
+          v003,
+          new VersionRange(min: v072, max: v080),
+          new VersionRange(min: v080, max: v123)
+        ])), equals(new VersionRange(min: v072, max: v080)));
+      });
+    });
+  });
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/pubspec.yaml b/mojo/public/dart/third_party/pubspec.yaml
new file mode 100644
index 0000000..59bc1db
--- /dev/null
+++ b/mojo/public/dart/third_party/pubspec.yaml
@@ -0,0 +1,6 @@
+name: dummy_package
+dependencies:
+  test: any
+  unittest: '>=0.11.6 <0.12.0'
+  analyzer: any
+  path: any
diff --git a/mojo/public/dart/third_party/shelf/.gitignore b/mojo/public/dart/third_party/shelf/.gitignore
new file mode 100644
index 0000000..7dbf035
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/.gitignore
@@ -0,0 +1,15 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.pub/
+build/
+packages
+.packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/shelf/.test_config b/mojo/public/dart/third_party/shelf/.test_config
new file mode 100644
index 0000000..412fc5c
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/.test_config
@@ -0,0 +1,3 @@
+{
+  "test_package": true
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/shelf/.travis.yml b/mojo/public/dart/third_party/shelf/.travis.yml
new file mode 100644
index 0000000..e110e4e
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/.travis.yml
@@ -0,0 +1,6 @@
+language: dart
+sudo: false
+dart:
+  - stable
+  - dev
+script: ./tool/travis.sh
diff --git a/mojo/public/dart/third_party/shelf/CHANGELOG.md b/mojo/public/dart/third_party/shelf/CHANGELOG.md
new file mode 100644
index 0000000..a01f6e9
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/CHANGELOG.md
@@ -0,0 +1,199 @@
+## 0.6.3
+
+* Messages returned by `Request.change()` and `Response.change()` are marked
+  read whenever the original message is read, and vice-versa. This means that
+  it's possible to read a message on which `change()` has been called and to
+  call `change()` on a message more than once, as long as `read()` is called on
+  only one of those messages.
+
+## 0.6.2+1
+
+* Support `http_parser` 1.0.0.
+
+## 0.6.2
+
+* Added a `body` named argument to `change` method on `Request` and `Response`.
+
+## 0.6.1+3
+
+* Updated minimum SDK to `1.9.0`.
+
+* Allow an empty `url` parameter to be passed in to `new Request()`. This fits
+  the stated semantics of the class, and should not have been forbidden.
+
+## 0.6.1+2
+
+* `logRequests` outputs a better message a request has a query string.
+
+## 0.6.1+1
+
+* Don't throw a bogus exception for `null` responses.
+
+## 0.6.1
+
+* `shelf_io` now takes a `"shelf.io.buffer_output"` `Response.context` parameter
+  that controls `HttpResponse.bufferOutput`.
+
+* Fixed spelling errors in README and code comments.
+
+## 0.6.0
+
+**Breaking change:** The semantics of `Request.scriptName` and
+[`Request.url`][url] have been overhauled, and the former has been renamed to
+[`Request.handlerPath`][handlerPath]. `handlerPath` is now the root-relative URL
+path to the current handler, while `url`'s path is the relative path from the
+current handler to the requested. The new semantics are easier to describe and
+to understand.
+
+[url]: http://www.dartdocs.org/documentation/shelf/latest/index.html#shelf/shelf.Request@id_url
+[handlerPath]: http://www.dartdocs.org/documentation/shelf/latest/index.html#shelf/shelf.Request@id_handlerPath
+
+Practically speaking, the main difference is that the `/` at the beginning of
+`url`'s path has been moved to the end of `handlerPath`. This makes `url`'s path
+easier to parse using the `path` package.
+
+[`Request.change`][change]'s handling of `handlerPath` and `url` has also
+changed. Instead of taking both parameters separately and requiring that the
+user manually maintain all the associated guarantees, it now takes a single
+`path` parameter. This parameter is the relative path from the current
+`handlerPath` to the next one, and sets both `handlerPath` and `url` on the new
+`Request` accordingly.
+
+[change]: http://www.dartdocs.org/documentation/shelf/latest/index.html#shelf/shelf.Request@id_change
+
+## 0.5.7
+
+* Updated `Request` to support the `body` model from `Response`.
+
+## 0.5.6
+
+* Fixed `createMiddleware` to only catch errors if `errorHandler` is provided.
+
+* Updated `handleRequest` in `shelf_io` to more gracefully handle errors when
+  parsing `HttpRequest`.
+
+## 0.5.5+1
+
+* Updated `Request.change` to include the original `onHijack` callback if one
+  exists.
+
+## 0.5.5
+
+* Added default body text for `Response.forbidden` and `Response.notFound` if
+  null is provided.
+
+* Clarified documentation on a number of `Response` constructors.
+
+* Updated `README` links to point to latest docs on `www.dartdocs.org`.
+
+## 0.5.4+3
+
+* Widen the version constraint on the `collection` package.
+
+## 0.5.4+2
+
+* Updated headers map to use a more efficient case-insensitive backing store.
+
+## 0.5.4+1
+
+* Widen the version constraint for `stack_trace`.
+
+## 0.5.4
+
+* The `shelf_io` adapter now sends the `Date` HTTP header by default.
+
+* Fixed logic for setting Server header in `shelf_io`.
+
+## 0.5.3
+
+* Add new named parameters to `Request.change`: `scriptName` and `url`.
+
+## 0.5.2
+
+* Add a `Cascade` helper that runs handlers in sequence until one returns a
+  response that's neither a 404 nor a 405.
+
+* Add a `Request.change` method that copies a request with new header values.
+
+* Add a `Request.hijack` method that allows handlers to gain access to the
+  underlying HTTP socket.
+
+## 0.5.1+1
+
+* Capture all asynchronous errors thrown by handlers if they would otherwise be
+  top-leveled.
+
+* Add more detail to the README about handlers, middleware, and the rules for
+  implementing an adapter.
+
+## 0.5.1
+
+* Add a `context` map to `Request` and `Response` for passing data among
+  handlers and middleware.
+
+## 0.5.0+1
+
+* Allow `scheduled_test` development dependency up to v0.12.0
+
+## 0.5.0
+
+* Renamed `Stack` to `Pipeline`.
+
+## 0.4.0
+
+* Access to headers for `Request` and `Response` is now case-insensitive.
+
+* The constructor for `Request` has been simplified.
+
+* `Request` now exposes `url` which replaces `pathInfo`, `queryString`, and
+  `pathSegments`.
+
+## 0.3.0+9
+
+* Removed old testing infrastructure.
+
+* Updated documentation address.
+
+## 0.3.0+8
+
+* Added a dependency on the `http_parser` package.
+
+## 0.3.0+7
+
+* Removed unused dependency on the `mime` package.
+
+## 0.3.0+6
+
+* Added a dependency on the `string_scanner` package.
+
+## 0.3.0+5
+
+* Updated `pubspec` details for move to Dart SDK.
+
+## 0.3.0 2014-03-25
+
+* `Response`
+    * **NEW!** `int get contentLength`
+    * **NEW!** `DateTime get expires`
+    * **NEW!** `DateTime get lastModified`
+* `Request`
+    * **BREAKING** `contentLength` is now read from `headers`. The constructor
+      argument has been removed.
+    * **NEW!** supports an optional `Stream<List<int>> body` constructor argument.
+    * **NEW!** `Stream<List<int>> read()` and
+      `Future<String> readAsString([Encoding encoding])`
+    * **NEW!** `DateTime get ifModifiedSince`
+    * **NEW!** `String get mimeType`
+    * **NEW!** `Encoding get encoding`
+
+## 0.2.0 2014-03-06
+
+* **BREAKING** Removed `Shelf` prefix from all classes.
+* **BREAKING** `Response` has drastically different constructors.
+* *NEW!* `Response` now accepts a body of either `String` or
+  `Stream<List<int>>`.
+* *NEW!* `Response` now exposes `encoding` and `mimeType`.
+
+## 0.1.0 2014-03-02
+
+* First reviewed release
diff --git a/mojo/public/dart/third_party/shelf/LICENSE b/mojo/public/dart/third_party/shelf/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/shelf/README.md b/mojo/public/dart/third_party/shelf/README.md
new file mode 100644
index 0000000..b363709
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/README.md
@@ -0,0 +1,157 @@
+## Web Server Middleware for Dart
+
+[![Build Status](https://travis-ci.org/dart-lang/shelf.svg?branch=master)](https://travis-ci.org/dart-lang/shelf)
+[![Coverage Status](https://coveralls.io/repos/dart-lang/shelf/badge.svg?branch=master)](https://coveralls.io/r/dart-lang/shelf)
+
+## Introduction
+
+**Shelf** makes it easy to create and compose **web servers** and **parts of web
+servers**. How?
+
+* Expose a small set of simple types.
+* Map server logic into a simple function: a single argument for the request,
+the response is the return value.
+* Trivially mix and match synchronous and asynchronous processing.
+* Flexibility to return a simple string or a byte stream with the same model.
+
+## Example
+
+See `example/example_server.dart`
+
+```dart
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:shelf/shelf_io.dart' as io;
+
+void main() {
+  var handler = const shelf.Pipeline().addMiddleware(shelf.logRequests())
+      .addHandler(_echoRequest);
+
+  io.serve(handler, 'localhost', 8080).then((server) {
+    print('Serving at http://${server.address.host}:${server.port}');
+  });
+}
+
+shelf.Response _echoRequest(shelf.Request request) {
+  return new shelf.Response.ok('Request for "${request.url}"');
+}
+```
+
+## Handlers and Middleware
+
+A [handler][] is any function that handles a [shelf.Request][] and returns a
+[shelf.Response][]. It can either handle the request itself--for example, a
+static file server that looks up the requested URI on the filesystem--or it can
+do some processing and forward it to another handler--for example, a logger that
+prints information about requests and responses to the command line.
+
+[handler]: http://www.dartdocs.org/documentation/shelf/latest/index.html#shelf/shelf@id_Handler
+
+[shelf.Request]: http://www.dartdocs.org/documentation/shelf/latest/index.html#shelf/shelf.Request
+
+[shelf.Response]:  http://www.dartdocs.org/documentation/shelf/latest/index.html#shelf/shelf.Response
+
+The latter kind of handler is called "[middleware][]", since it sits in the
+middle of the server stack. Middleware can be thought of as a function that
+takes a handler and wraps it in another handler to provide additional
+functionality. A Shelf application is usually composed of many layers of
+middleware with one or more handlers at the very center; the [shelf.Pipeline][]
+class makes this sort of application easy to construct.
+
+[middleware]: http://www.dartdocs.org/documentation/shelf/latest/index.html#shelf/shelf@id_Middleware
+
+[shelf.Pipeline]:  http://www.dartdocs.org/documentation/shelf/latest/index.html#shelf/shelf.Pipeline
+
+Some middleware can also take multiple handlers and call one or more of them for
+each request. For example, a routing middleware might choose which handler to
+call based on the request's URI or HTTP method, while a cascading middleware
+might call each one in sequence until one returns a successful response.
+
+Middleware that routes requests between handlers should be sure to update each
+request's [`handlerPath`][handlerPath] and [`url`][url]. This allows inner
+handlers to know where they are in the application so they can do their own
+routing correctly. This can be easily accomplished using
+[`Request.change()`][change]:
+
+[handlerPath]: http://www.dartdocs.org/documentation/shelf/latest/index.html#shelf/shelf.Request@id_handlerPath
+[url]: http://www.dartdocs.org/documentation/shelf/latest/index.html#shelf/shelf.Request@id_url
+[change]: http://www.dartdocs.org/documentation/shelf/latest/index.html#shelf/shelf.Request@id_change
+
+```dart
+// In an imaginary routing middleware...
+var component = request.url.pathComponents.first;
+var handler = _handlers[component];
+if (handler == null) return new Response.notFound(null);
+
+// Create a new request just like this one but with whatever URL comes after
+// [component] instead.
+return handler(request.change(script: component));
+```
+
+## Adapters
+
+An adapter is any code that creates [shelf.Request][] objects, passes them to a
+handler, and deals with the resulting [shelf.Response][]. For the most part,
+adapters forward requests from and responses to an underlying HTTP server;
+[shelf_io.serve][] is this sort of adapter. An adapter might also synthesize
+HTTP requests within the browser using `window.location` and `window.history`,
+or it might pipe requests directly from an HTTP client to a Shelf handler.
+
+[shelf_io.serve]: http://www.dartdocs.org/documentation/shelf/latest/index.html#shelf/shelf-io@id_serve
+
+When implementing an adapter, some rules must be followed. The adapter must not
+pass the `url` or `handlerPath` parameters to [new shelf.Request][]; it should
+only pass `requestedUri`. If it passes the `context` parameter, all keys must
+begin with the adapter's package name followed by a period. If multiple headers
+with the same name are received, the adapter must collapse them into a single
+header separated by commas as per [RFC 2616 section 4.2][].
+
+[new shelf.Request]: http://www.dartdocs.org/documentation/shelf/latest/index.html#shelf/shelf.Request@id_Request-
+
+[RFC 2616 section 4.2]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html
+
+An adapter must handle all errors from the handler, including the handler
+returning a `null` response. It should print each error to the console if
+possible, then act as though the handler returned a 500 response. The adapter
+may include body data for the 500 response, but this body data must not include
+information about the error that occurred. This ensures that unexpected errors
+don't result in exposing internal information in production by default; if the
+user wants to return detailed error descriptions, they should explicitly include
+middleware to do so.
+
+An adapter should include information about itself in the Server header of the
+response by default. If the handler returns a response with the Server header
+set, that must take precedence over the adapter's default header.
+
+An adapter should include the Date header with the time the handler returns a
+response. If the handler returns a response with the Date header set, that must
+take precedence.
+
+An adapter should ensure that asynchronous errors thrown by the handler don't
+cause the application to crash, even if they aren't reported by the future
+chain. Specifically, these errors shouldn't be passed to the root zone's error
+handler; however, if the adapter is run within another error zone, it should
+allow these errors to be passed to that zone. The following function can be used
+to capture only errors that would otherwise be top-leveled:
+
+```dart
+/// Run [callback] and capture any errors that would otherwise be top-leveled.
+///
+/// If [this] is called in a non-root error zone, it will just run [callback]
+/// and return the result. Otherwise, it will capture any errors using
+/// [runZoned] and pass them to [onError].
+catchTopLevelErrors(callback(), void onError(error, StackTrace stackTrace)) {
+  if (Zone.current.inSameErrorZone(Zone.ROOT)) {
+    return runZoned(callback, onError: onError);
+  } else {
+    return callback();
+  }
+}
+```
+
+## Inspiration
+
+* [Connect](http://www.senchalabs.org/connect/) for NodeJS.
+    * Read [this great write-up](http://howtonode.org/connect-it) to understand
+      the overall philosophy of all of these models.
+* [Rack](http://rack.github.io/) for Ruby.
+* [WSGI](http://legacy.python.org/dev/peps/pep-3333/) for Python.
diff --git a/mojo/public/dart/third_party/shelf/codereview.settings b/mojo/public/dart/third_party/shelf/codereview.settings
new file mode 100644
index 0000000..5b6ee67
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: https://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/shelf/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/shelf/example/example_server.dart b/mojo/public/dart/third_party/shelf/example/example_server.dart
new file mode 100644
index 0000000..5abc65e
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/example/example_server.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:shelf/shelf_io.dart' as io;
+
+void main() {
+  var handler = const shelf.Pipeline()
+      .addMiddleware(shelf.logRequests())
+      .addHandler(_echoRequest);
+
+  io.serve(handler, 'localhost', 8080).then((server) {
+    print('Serving at http://${server.address.host}:${server.port}');
+  });
+}
+
+shelf.Response _echoRequest(shelf.Request request) {
+  return new shelf.Response.ok('Request for "${request.url}"');
+}
diff --git a/mojo/public/dart/third_party/shelf/lib/shelf.dart b/mojo/public/dart/third_party/shelf/lib/shelf.dart
new file mode 100644
index 0000000..98d7815
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/lib/shelf.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf;
+
+export 'src/cascade.dart';
+export 'src/handler.dart';
+export 'src/handlers/logger.dart';
+export 'src/hijack_exception.dart';
+export 'src/middleware.dart';
+export 'src/pipeline.dart';
+export 'src/request.dart';
+export 'src/response.dart';
diff --git a/mojo/public/dart/third_party/shelf/lib/shelf_io.dart b/mojo/public/dart/third_party/shelf/lib/shelf_io.dart
new file mode 100644
index 0000000..bc2835e
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/lib/shelf_io.dart
@@ -0,0 +1,167 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A Shelf adapter for handling [HttpRequest] objects from `dart:io`.
+///
+/// One can provide an instance of [HttpServer] as the `requests` parameter in
+/// [serveRequests].
+///
+/// This adapter supports request hijacking; see [Request.hijack]. It also
+/// supports the `"shelf.io.buffer_output"` `Response.context` property. If this
+/// property is `true` (the default), streamed responses will be buffered to
+/// improve performance; if it's `false`, all chunks will be pushed over the
+/// wire as they're received. See [`HttpResponse.bufferOutput`][bufferOutput]
+/// for more information.
+///
+/// [bufferOutput]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:io.HttpResponse#id_bufferOutput
+library shelf.io;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:stack_trace/stack_trace.dart';
+
+import 'shelf.dart';
+import 'src/util.dart';
+
+/// Starts an [HttpServer] that listens on the specified [address] and
+/// [port] and sends requests to [handler].
+///
+/// See the documentation for [HttpServer.bind] for more details on [address],
+/// [port], and [backlog].
+Future<HttpServer> serve(Handler handler, address, int port, {int backlog}) {
+  if (backlog == null) backlog = 0;
+  return HttpServer.bind(address, port, backlog: backlog).then((server) {
+    serveRequests(server, handler);
+    return server;
+  });
+}
+
+/// Serve a [Stream] of [HttpRequest]s.
+///
+/// [HttpServer] implements [Stream<HttpRequest>] so it can be passed directly
+/// to [serveRequests].
+///
+/// Errors thrown by [handler] while serving a request will be printed to the
+/// console and cause a 500 response with no body. Errors thrown asynchronously
+/// by [handler] will be printed to the console or, if there's an active error
+/// zone, passed to that zone.
+void serveRequests(Stream<HttpRequest> requests, Handler handler) {
+  catchTopLevelErrors(() {
+    requests.listen((request) => handleRequest(request, handler));
+  }, (error, stackTrace) {
+    _logError('Asynchronous error\n$error', stackTrace);
+  });
+}
+
+/// Uses [handler] to handle [request].
+///
+/// Returns a [Future] which completes when the request has been handled.
+Future handleRequest(HttpRequest request, Handler handler) {
+  var shelfRequest;
+  try {
+    shelfRequest = _fromHttpRequest(request);
+  } catch (error, stackTrace) {
+    var response = _logError('Error parsing request.\n$error', stackTrace);
+    return _writeResponse(response, request.response);
+  }
+
+  // TODO(nweiz): abstract out hijack handling to make it easier to implement an
+  // adapter.
+  return new Future.sync(() => handler(shelfRequest))
+      .catchError((error, stackTrace) {
+    if (error is HijackException) {
+      // A HijackException should bypass the response-writing logic entirely.
+      if (!shelfRequest.canHijack) throw error;
+
+      // If the request wasn't hijacked, we shouldn't be seeing this exception.
+      return _logError(
+          "Caught HijackException, but the request wasn't hijacked.",
+          stackTrace);
+    }
+
+    return _logError('Error thrown by handler.\n$error', stackTrace);
+  }).then((response) {
+    if (response == null) {
+      return _writeResponse(
+          _logError('null response from handler.'), request.response);
+    } else if (shelfRequest.canHijack) {
+      return _writeResponse(response, request.response);
+    }
+
+    var message = new StringBuffer()
+      ..writeln("Got a response for hijacked request "
+          "${shelfRequest.method} ${shelfRequest.requestedUri}:")
+      ..writeln(response.statusCode);
+    response.headers
+        .forEach((key, value) => message.writeln("${key}: ${value}"));
+    throw new Exception(message.toString().trim());
+  }).catchError((error, stackTrace) {
+    // Ignore HijackExceptions.
+    if (error is! HijackException) throw error;
+  });
+}
+
+/// Creates a new [Request] from the provided [HttpRequest].
+Request _fromHttpRequest(HttpRequest request) {
+  var headers = {};
+  request.headers.forEach((k, v) {
+    // Multiple header values are joined with commas.
+    // See http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-21#page-22
+    headers[k] = v.join(',');
+  });
+
+  onHijack(callback) {
+    return request.response
+        .detachSocket(writeHeaders: false)
+        .then((socket) => callback(socket, socket));
+  }
+
+  return new Request(request.method, request.requestedUri,
+      protocolVersion: request.protocolVersion,
+      headers: headers,
+      body: request,
+      onHijack: onHijack);
+}
+
+Future _writeResponse(Response response, HttpResponse httpResponse) {
+  if (response.context.containsKey("shelf.io.buffer_output")) {
+    httpResponse.bufferOutput = response.context["shelf.io.buffer_output"];
+  }
+
+  httpResponse.statusCode = response.statusCode;
+
+  response.headers.forEach((header, value) {
+    if (value == null) return;
+    httpResponse.headers.set(header, value);
+  });
+
+  if (!response.headers.containsKey(HttpHeaders.SERVER)) {
+    httpResponse.headers.set(HttpHeaders.SERVER, 'dart:io with Shelf');
+  }
+
+  if (!response.headers.containsKey(HttpHeaders.DATE)) {
+    httpResponse.headers.date = new DateTime.now().toUtc();
+  }
+
+  return httpResponse
+      .addStream(response.read())
+      .then((_) => httpResponse.close());
+}
+
+// TODO(kevmoo) A developer mode is needed to include error info in response
+// TODO(kevmoo) Make error output plugable. stderr, logging, etc
+Response _logError(String message, [StackTrace stackTrace]) {
+  var chain = new Chain.current();
+  if (stackTrace != null) {
+    chain = new Chain.forTrace(stackTrace);
+  }
+  chain = chain
+      .foldFrames((frame) => frame.isCore || frame.package == 'shelf').terse;
+
+  stderr.writeln('ERROR - ${new DateTime.now()}');
+  stderr.writeln(message);
+  stderr.writeln(chain);
+  return new Response.internalServerError();
+}
diff --git a/mojo/public/dart/third_party/shelf/lib/src/body.dart b/mojo/public/dart/third_party/shelf/lib/src/body.dart
new file mode 100644
index 0000000..5d39be5
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/lib/src/body.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.body;
+
+import 'dart:async';
+import 'dart:convert';
+
+/// The body of a request or response.
+///
+/// This tracks whether the body has been read. It's separate from [Message]
+/// because the message may be changed with [Message.change], but each instance
+/// should share a notion of whether the body was read.
+class Body {
+  /// The contents of the message body.
+  ///
+  /// This will be `null` after [read] is called.
+  Stream<List<int>> _stream;
+
+  Body._(this._stream);
+
+  /// Converts [body] to a byte stream and wraps it in a [Body].
+  ///
+  /// [body] may be either a [Body], a [String], a [Stream<List<int>>], or
+  /// `null`. If it's a [String], [encoding] will be used to convert it to a
+  /// [Stream<List<int>>].
+  factory Body(body, [Encoding encoding]) {
+    if (encoding == null) encoding = UTF8;
+
+    if (body is Body) return body;
+
+    var stream;
+    if (body == null) {
+      stream = new Stream.fromIterable([]);
+    } else if (body is String) {
+      stream = new Stream.fromIterable([encoding.encode(body)]);
+    } else if (body is Stream) {
+      stream = body;
+    } else {
+      throw new ArgumentError('Response body "$body" must be a String or a '
+          'Stream.');
+    }
+
+    return new Body._(stream);
+  }
+
+  /// Returns a [Stream] representing the body.
+  ///
+  /// Can only be called once.
+  Stream<List<int>> read() {
+    if (_stream == null) {
+      throw new StateError("The 'read' method can only be called once on a "
+          "shelf.Request/shelf.Response object.");
+    }
+    var stream = _stream;
+    _stream = null;
+    return stream;
+  }
+}
diff --git a/mojo/public/dart/third_party/shelf/lib/src/cascade.dart b/mojo/public/dart/third_party/shelf/lib/src/cascade.dart
new file mode 100644
index 0000000..cf57478
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/lib/src/cascade.dart
@@ -0,0 +1,91 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.cascade;
+
+import 'dart:async';
+
+import 'handler.dart';
+import 'response.dart';
+
+/// A typedef for [Cascade._shouldCascade].
+typedef bool _ShouldCascade(Response response);
+
+/// A helper that calls several handlers in sequence and returns the first
+/// acceptable response.
+///
+/// By default, a response is considered acceptable if it has a status other
+/// than 404 or 405; other statuses indicate that the handler understood the
+/// request.
+///
+/// If all handlers return unacceptable responses, the final response will be
+/// returned.
+///
+///     var handler = new Cascade()
+///         .add(webSocketHandler)
+///         .add(staticFileHandler)
+///         .add(application)
+///         .handler;
+class Cascade {
+  /// The function used to determine whether the cascade should continue on to
+  /// the next handler.
+  final _ShouldCascade _shouldCascade;
+
+  final Cascade _parent;
+  final Handler _handler;
+
+  /// Creates a new, empty cascade.
+  ///
+  /// If [statusCodes] is passed, responses with those status codes are
+  /// considered unacceptable. If [shouldCascade] is passed, responses for which
+  /// it returns `true` are considered unacceptable. [statusCode] and
+  /// [shouldCascade] may not both be passed.
+  Cascade({Iterable<int> statusCodes, bool shouldCascade(Response response)})
+      : _shouldCascade = _computeShouldCascade(statusCodes, shouldCascade),
+        _parent = null,
+        _handler = null {
+    if (statusCodes != null && shouldCascade != null) {
+      throw new ArgumentError("statusCodes and shouldCascade may not both be "
+          "passed.");
+    }
+  }
+
+  Cascade._(this._parent, this._handler, this._shouldCascade);
+
+  /// Returns a new cascade with [handler] added to the end.
+  ///
+  /// [handler] will only be called if all previous handlers in the cascade
+  /// return unacceptable responses.
+  Cascade add(Handler handler) => new Cascade._(this, handler, _shouldCascade);
+
+  /// Exposes this cascade as a single handler.
+  ///
+  /// This handler will call each inner handler in the cascade until one returns
+  /// an acceptable response, and return that. If no inner handlers return an
+  /// acceptable response, this will return the final response.
+  Handler get handler {
+    if (_handler == null) {
+      throw new StateError("Can't get a handler for a cascade with no inner "
+          "handlers.");
+    }
+
+    return (request) {
+      if (_parent._handler == null) return _handler(request);
+      return new Future.sync(() => _parent.handler(request)).then((response) {
+        if (_shouldCascade(response)) return _handler(request);
+        return response;
+      });
+    };
+  }
+}
+
+/// Computes the [Cascade._shouldCascade] function based on the user's
+/// parameters.
+Function _computeShouldCascade(
+    Iterable<int> statusCodes, Function shouldCascade) {
+  if (shouldCascade != null) return shouldCascade;
+  if (statusCodes == null) statusCodes = [404, 405];
+  statusCodes = statusCodes.toSet();
+  return (response) => statusCodes.contains(response.statusCode);
+}
diff --git a/mojo/public/dart/third_party/shelf/lib/src/handler.dart b/mojo/public/dart/third_party/shelf/lib/src/handler.dart
new file mode 100644
index 0000000..6ac3d31
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/lib/src/handler.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.typedef;
+
+import 'request.dart';
+
+/// The signature of a function which handles a [Request].
+///
+/// A [Handler] may receive a request directly from an HTTP server or it
+/// may be composed as part of a larger application.
+///
+/// Should return [Response] or [Future<Response>].
+//TODO(kevmoo): provide a more detailed explanation.
+typedef Handler(Request request);
diff --git a/mojo/public/dart/third_party/shelf/lib/src/handlers/logger.dart b/mojo/public/dart/third_party/shelf/lib/src/handlers/logger.dart
new file mode 100644
index 0000000..a4fbc65
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/lib/src/handlers/logger.dart
@@ -0,0 +1,85 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.handlers.logger;
+
+import 'dart:async';
+
+import 'package:stack_trace/stack_trace.dart';
+
+import '../hijack_exception.dart';
+import '../middleware.dart';
+
+/// Middleware which prints the time of the request, the elapsed time for the
+/// inner handlers, the response's status code and the request URI.
+///
+/// [logger] takes two parameters.
+///
+/// `msg` includes the request time, duration, request method, and requested
+/// path.
+///
+/// For successful requests, `msg` also includes the status code.
+///
+/// When an error is thrown, `isError` is true and `msg` contains the error
+/// description and stack trace.
+Middleware logRequests({void logger(String msg, bool isError)}) =>
+    (innerHandler) {
+  if (logger == null) logger = _defaultLogger;
+
+  return (request) {
+    var startTime = new DateTime.now();
+    var watch = new Stopwatch()..start();
+
+    return new Future.sync(() => innerHandler(request)).then((response) {
+      var msg = _getMessage(startTime, response.statusCode,
+          request.requestedUri, request.method, watch.elapsed);
+
+      logger(msg, false);
+
+      return response;
+    }, onError: (error, stackTrace) {
+      if (error is HijackException) throw error;
+
+      var msg = _getErrorMessage(startTime, request.requestedUri,
+          request.method, watch.elapsed, error, stackTrace);
+
+      logger(msg, true);
+
+      throw error;
+    });
+  };
+};
+
+String _formatQuery(String query) {
+  return query == '' ? '' : '?$query';
+}
+
+String _getMessage(DateTime requestTime, int statusCode, Uri requestedUri,
+    String method, Duration elapsedTime) {
+  return '${requestTime}\t$elapsedTime\t$method\t[${statusCode}]\t'
+      '${requestedUri.path}${_formatQuery(requestedUri.query)}';
+}
+
+String _getErrorMessage(DateTime requestTime, Uri requestedUri, String method,
+    Duration elapsedTime, Object error, StackTrace stack) {
+  var chain = new Chain.current();
+  if (stack != null) {
+    chain = new Chain.forTrace(stack)
+        .foldFrames((frame) => frame.isCore || frame.package == 'shelf').terse;
+  }
+
+  var msg = '${requestTime}\t$elapsedTime\t$method\t${requestedUri.path}'
+      '${_formatQuery(requestedUri.query)}\n$error';
+  if (chain == null) return msg;
+
+  return '$msg\n$chain';
+}
+
+void _defaultLogger(String msg, bool isError) {
+  if (isError) {
+    print('[ERROR] $msg');
+  } else {
+    print(msg);
+  }
+}
diff --git a/mojo/public/dart/third_party/shelf/lib/src/hijack_exception.dart b/mojo/public/dart/third_party/shelf/lib/src/hijack_exception.dart
new file mode 100644
index 0000000..56d5cec
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/lib/src/hijack_exception.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.hijack_exception;
+
+/// An exception used to indicate that a request has been hijacked.
+///
+/// This shouldn't be captured by any code other than the Shelf adapter that
+/// created the hijackable request. Middleware that captures exceptions should
+/// make sure to pass on HijackExceptions.
+///
+/// See also [Request.hijack].
+class HijackException {
+  const HijackException();
+
+  String toString() =>
+      "A shelf request's underlying data stream was hijacked.\n"
+      "This exception is used for control flow and should only be handled by a "
+      "Shelf adapter.";
+}
diff --git a/mojo/public/dart/third_party/shelf/lib/src/message.dart b/mojo/public/dart/third_party/shelf/lib/src/message.dart
new file mode 100644
index 0000000..0d41b53
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/lib/src/message.dart
@@ -0,0 +1,150 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.message;
+
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:http_parser/http_parser.dart';
+
+import 'body.dart';
+import 'shelf_unmodifiable_map.dart';
+import 'util.dart';
+
+Body getBody(Message message) => message._body;
+
+/// Represents logic shared between [Request] and [Response].
+abstract class Message {
+  /// The HTTP headers.
+  ///
+  /// The value is immutable.
+  final Map<String, String> headers;
+
+  /// Extra context that can be used by for middleware and handlers.
+  ///
+  /// For requests, this is used to pass data to inner middleware and handlers;
+  /// for responses, it's used to pass data to outer middleware and handlers.
+  ///
+  /// Context properties that are used by a particular package should begin with
+  /// that package's name followed by a period. For example, if [logRequests]
+  /// wanted to take a prefix, its property name would be `"shelf.prefix"`,
+  /// since it's in the `shelf` package.
+  ///
+  /// The value is immutable.
+  final Map<String, Object> context;
+
+  /// The streaming body of the message.
+  ///
+  /// This can be read via [read] or [readAsString].
+  final Body _body;
+
+  /// Creates a new [Message].
+  ///
+  /// [body] is the response body. It may be either a [String], a
+  /// [Stream<List<int>>], or `null` to indicate no body. If it's a [String],
+  /// [encoding] is used to encode it to a [Stream<List<int>>]. It defaults to
+  /// UTF-8.
+  ///
+  /// If [headers] is `null`, it is treated as empty.
+  ///
+  /// If [encoding] is passed, the "encoding" field of the Content-Type header
+  /// in [headers] will be set appropriately. If there is no existing
+  /// Content-Type header, it will be set to "application/octet-stream".
+  Message(body, {Encoding encoding, Map<String, String> headers,
+      Map<String, Object> context})
+      : this._body = new Body(body, encoding),
+        this.headers = new ShelfUnmodifiableMap<String>(
+            _adjustHeaders(headers, encoding), ignoreKeyCase: true),
+        this.context = new ShelfUnmodifiableMap<Object>(context,
+            ignoreKeyCase: false);
+
+  /// The contents of the content-length field in [headers].
+  ///
+  /// If not set, `null`.
+  int get contentLength {
+    if (_contentLengthCache != null) return _contentLengthCache;
+    if (!headers.containsKey('content-length')) return null;
+    _contentLengthCache = int.parse(headers['content-length']);
+    return _contentLengthCache;
+  }
+  int _contentLengthCache;
+
+  /// The MIME type of the message.
+  ///
+  /// This is parsed from the Content-Type header in [headers]. It contains only
+  /// the MIME type, without any Content-Type parameters.
+  ///
+  /// If [headers] doesn't have a Content-Type header, this will be `null`.
+  String get mimeType {
+    var contentType = _contentType;
+    if (contentType == null) return null;
+    return contentType.mimeType;
+  }
+
+  /// The encoding of the message body.
+  ///
+  /// This is parsed from the "charset" parameter of the Content-Type header in
+  /// [headers].
+  ///
+  /// If [headers] doesn't have a Content-Type header or it specifies an
+  /// encoding that [dart:convert] doesn't support, this will be `null`.
+  Encoding get encoding {
+    var contentType = _contentType;
+    if (contentType == null) return null;
+    if (!contentType.parameters.containsKey('charset')) return null;
+    return Encoding.getByName(contentType.parameters['charset']);
+  }
+
+  /// The parsed version of the Content-Type header in [headers].
+  ///
+  /// This is cached for efficient access.
+  MediaType get _contentType {
+    if (_contentTypeCache != null) return _contentTypeCache;
+    if (!headers.containsKey('content-type')) return null;
+    _contentTypeCache = new MediaType.parse(headers['content-type']);
+    return _contentTypeCache;
+  }
+  MediaType _contentTypeCache;
+
+  /// Returns a [Stream] representing the body.
+  ///
+  /// Can only be called once.
+  Stream<List<int>> read() => _body.read();
+
+  /// Returns a [Future] containing the body as a String.
+  ///
+  /// If [encoding] is passed, that's used to decode the body.
+  /// Otherwise the encoding is taken from the Content-Type header. If that
+  /// doesn't exist or doesn't have a "charset" parameter, UTF-8 is used.
+  ///
+  /// This calls [read] internally, which can only be called once.
+  Future<String> readAsString([Encoding encoding]) {
+    if (encoding == null) encoding = this.encoding;
+    if (encoding == null) encoding = UTF8;
+    return encoding.decodeStream(read());
+  }
+
+  /// Creates a new [Message] by copying existing values and applying specified
+  /// changes.
+  Message change({Map<String, String> headers, Map<String, Object> context,
+      body});
+}
+
+/// Adds information about [encoding] to [headers].
+///
+/// Returns a new map without modifying [headers].
+Map<String, String> _adjustHeaders(
+    Map<String, String> headers, Encoding encoding) {
+  if (headers == null) headers = const {};
+  if (encoding == null) return headers;
+  if (headers['content-type'] == null) {
+    return addHeader(headers, 'content-type',
+        'application/octet-stream; charset=${encoding.name}');
+  }
+
+  var contentType = new MediaType.parse(headers['content-type']).change(
+      parameters: {'charset': encoding.name});
+  return addHeader(headers, 'content-type', contentType.toString());
+}
diff --git a/mojo/public/dart/third_party/shelf/lib/src/middleware.dart b/mojo/public/dart/third_party/shelf/lib/src/middleware.dart
new file mode 100644
index 0000000..1d503d0
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/lib/src/middleware.dart
@@ -0,0 +1,76 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.middleware;
+
+import 'dart:async';
+
+import 'request.dart';
+import 'response.dart';
+import 'handler.dart';
+import 'hijack_exception.dart';
+
+/// A function which creates a new [Handler] by wrapping a [Handler].
+///
+/// You can extend the functions of a [Handler] by wrapping it in
+/// [Middleware] that can intercept and process a request before it it sent
+/// to a handler, a response after it is sent by a handler, or both.
+///
+/// Because [Middleware] consumes a [Handler] and returns a new
+/// [Handler], multiple [Middleware] instances can be composed
+/// together to offer rich functionality.
+///
+/// Common uses for middleware include caching, logging, and authentication.
+///
+/// Middleware that captures exceptions should be sure to pass
+/// [HijackException]s on without modification.
+///
+/// A simple [Middleware] can be created using [createMiddleware].
+typedef Handler Middleware(Handler innerHandler);
+
+/// Creates a [Middleware] using the provided functions.
+///
+/// If provided, [requestHandler] receives a [Request]. It can respond to
+/// the request by returning a [Response] or [Future<Response>].
+/// [requestHandler] can also return `null` for some or all requests in which
+/// case the request is sent to the inner [Handler].
+///
+/// If provided, [responseHandler] is called with the [Response] generated
+/// by the inner [Handler]. Responses generated by [requestHandler] are not
+/// sent to [responseHandler].
+///
+/// [responseHandler] should return either a [Response] or
+/// [Future<Response>]. It may return the response parameter it receives or
+/// create a new response object.
+///
+/// If provided, [errorHandler] receives errors thrown by the inner handler. It
+/// does not receive errors thrown by [requestHandler] or [responseHandler], nor
+/// does it receive [HijackException]s. It can either return a new response or
+/// throw an error.
+Middleware createMiddleware({requestHandler(Request request),
+    responseHandler(Response response),
+    errorHandler(error, StackTrace stackTrace)}) {
+  if (requestHandler == null) requestHandler = (request) => null;
+
+  if (responseHandler == null) responseHandler = (response) => response;
+
+  var onError = null;
+  if (errorHandler != null) {
+    onError = (error, stackTrace) {
+      if (error is HijackException) throw error;
+      return errorHandler(error, stackTrace);
+    };
+  }
+
+  return (Handler innerHandler) {
+    return (request) {
+      return new Future.sync(() => requestHandler(request)).then((response) {
+        if (response != null) return response;
+
+        return new Future.sync(() => innerHandler(request)).then(
+            (response) => responseHandler(response), onError: onError);
+      });
+    };
+  };
+}
diff --git a/mojo/public/dart/third_party/shelf/lib/src/pipeline.dart b/mojo/public/dart/third_party/shelf/lib/src/pipeline.dart
new file mode 100644
index 0000000..016e5fc
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/lib/src/pipeline.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.pipeline;
+
+import 'handler.dart';
+import 'middleware.dart';
+
+/// A helper that makes it easy to compose a set of [Middleware] and a
+/// [Handler].
+///
+///     var handler = const Pipeline()
+///         .addMiddleware(loggingMiddleware)
+///         .addMiddleware(cachingMiddleware)
+///         .addHandler(application);
+class Pipeline {
+  final Pipeline _parent;
+  final Middleware _middleware;
+
+  const Pipeline()
+      : _middleware = null,
+        _parent = null;
+
+  Pipeline._(this._middleware, this._parent);
+
+  /// Returns a new [Pipeline] with [middleware] added to the existing set of
+  /// [Middleware].
+  ///
+  /// [middleware] will be the last [Middleware] to process a request and
+  /// the first to process a response.
+  Pipeline addMiddleware(Middleware middleware) =>
+      new Pipeline._(middleware, this);
+
+  /// Returns a new [Handler] with [handler] as the final processor of a
+  /// [Request] if all of the middleware in the pipeline have passed the request
+  /// through.
+  Handler addHandler(Handler handler) {
+    if (_middleware == null) return handler;
+    return _parent.addHandler(_middleware(handler));
+  }
+
+  /// Exposes this pipeline of [Middleware] as a single middleware instance.
+  Middleware get middleware => addHandler;
+}
diff --git a/mojo/public/dart/third_party/shelf/lib/src/request.dart b/mojo/public/dart/third_party/shelf/lib/src/request.dart
new file mode 100644
index 0000000..5c5f44c
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/lib/src/request.dart
@@ -0,0 +1,355 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.request;
+
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:http_parser/http_parser.dart';
+
+import 'hijack_exception.dart';
+import 'message.dart';
+import 'util.dart';
+
+/// A callback provided by a Shelf handler that's passed to [Request.hijack].
+typedef void HijackCallback(
+    Stream<List<int>> stream, StreamSink<List<int>> sink);
+
+/// A callback provided by a Shelf adapter that's used by [Request.hijack] to
+/// provide a [HijackCallback] with a socket.
+typedef void OnHijackCallback(HijackCallback callback);
+
+/// Represents an HTTP request to be processed by a Shelf application.
+class Request extends Message {
+  /// The URL path from the current handler to the requested resource, relative
+  /// to [handlerPath], plus any query parameters.
+  ///
+  /// This should be used by handlers for determining which resource to serve,
+  /// in preference to [requestedUri]. This allows handlers to do the right
+  /// thing when they're mounted anywhere in the application. Routers should be
+  /// sure to update this when dispatching to a nested handler, using the
+  /// `path` parameter to [change].
+  ///
+  /// [url]'s path is always relative. It may be empty, if [requestedUri] ends
+  /// at this handler. [url] will always have the same query parameters as
+  /// [requestedUri].
+  ///
+  /// [handlerPath] and [url]'s path combine to create [requestedUri]'s path.
+  final Uri url;
+
+  /// The HTTP request method, such as "GET" or "POST".
+  final String method;
+
+  /// The URL path to the current handler.
+  ///
+  /// This allows a handler to know its location within the URL-space of an
+  /// application. Routers should be sure to update this when dispatching to a
+  /// nested handler, using the `path` parameter to [change].
+  ///
+  /// [handlerPath] is always a root-relative URL path; that is, it always
+  /// starts with `/`. It will also end with `/` whenever [url]'s path is
+  /// non-empty, or if [requestUri]'s path ends with `/`.
+  ///
+  /// [handlerPath] and [url]'s path combine to create [requestedUri]'s path.
+  final String handlerPath;
+
+  /// The HTTP protocol version used in the request, either "1.0" or "1.1".
+  final String protocolVersion;
+
+  /// The original [Uri] for the request.
+  final Uri requestedUri;
+
+  /// The callback wrapper for hijacking this request.
+  ///
+  /// This will be `null` if this request can't be hijacked.
+  final _OnHijack _onHijack;
+
+  /// Whether this request can be hijacked.
+  ///
+  /// This will be `false` either if the adapter doesn't support hijacking, or
+  /// if the request has already been hijacked.
+  bool get canHijack => _onHijack != null && !_onHijack.called;
+
+  /// If this is non-`null` and the requested resource hasn't been modified
+  /// since this date and time, the server should return a 304 Not Modified
+  /// response.
+  ///
+  /// This is parsed from the If-Modified-Since header in [headers]. If
+  /// [headers] doesn't have an If-Modified-Since header, this will be `null`.
+  DateTime get ifModifiedSince {
+    if (_ifModifiedSinceCache != null) return _ifModifiedSinceCache;
+    if (!headers.containsKey('if-modified-since')) return null;
+    _ifModifiedSinceCache = parseHttpDate(headers['if-modified-since']);
+    return _ifModifiedSinceCache;
+  }
+  DateTime _ifModifiedSinceCache;
+
+  /// Creates a new [Request].
+  ///
+  /// [handlerPath] must be root-relative. [url]'s path must be fully relative,
+  /// and it must have the same query parameters as [requestedUri].
+  /// [handlerPath] and [url]'s path must combine to be the path component of
+  /// [requestedUri]. If they're not passed, [handlerPath] will default to `/`
+  /// and [url] to `requestedUri.path` without the initial `/`. If only one is
+  /// passed, the other will be inferred.
+  ///
+  /// [body] is the request body. It may be either a [String], a
+  /// [Stream<List<int>>], or `null` to indicate no body.
+  /// If it's a [String], [encoding] is used to encode it to a
+  /// [Stream<List<int>>]. The default encoding is UTF-8.
+  ///
+  /// If [encoding] is passed, the "encoding" field of the Content-Type header
+  /// in [headers] will be set appropriately. If there is no existing
+  /// Content-Type header, it will be set to "application/octet-stream".
+  ///
+  /// The default value for [protocolVersion] is '1.1'.
+  ///
+  /// ## `onHijack`
+  ///
+  /// [onHijack] allows handlers to take control of the underlying socket for
+  /// the request. It should be passed by adapters that can provide access to
+  /// the bidirectional socket underlying the HTTP connection stream.
+  ///
+  /// The [onHijack] callback will only be called once per request. It will be
+  /// passed another callback which takes a byte stream and a byte sink.
+  /// [onHijack] must pass the stream and sink for the connection stream to this
+  /// callback, although it may do so asynchronously. Both parameters may be the
+  /// same object. If the user closes the sink, the adapter should ensure that
+  /// the stream is closed as well.
+  ///
+  /// If a request is hijacked, the adapter should expect to receive a
+  /// [HijackException] from the handler. This is a special exception used to
+  /// indicate that hijacking has occurred. The adapter should avoid either
+  /// sending a response or notifying the user of an error if a
+  /// [HijackException] is caught.
+  ///
+  /// An adapter can check whether a request was hijacked using [canHijack],
+  /// which will be `false` for a hijacked request. The adapter may throw an
+  /// error if a [HijackException] is received for a non-hijacked request, or if
+  /// no [HijackException] is received for a hijacked request.
+  ///
+  /// See also [hijack].
+  // TODO(kevmoo) finish documenting the rest of the arguments.
+  Request(String method, Uri requestedUri, {String protocolVersion,
+      Map<String, String> headers, String handlerPath, Uri url, body,
+      Encoding encoding, Map<String, Object> context,
+      OnHijackCallback onHijack})
+      : this._(method, requestedUri,
+          protocolVersion: protocolVersion,
+          headers: headers,
+          url: url,
+          handlerPath: handlerPath,
+          body: body,
+          encoding: encoding,
+          context: context,
+          onHijack: onHijack == null ? null : new _OnHijack(onHijack));
+
+  /// This constructor has the same signature as [new Request] except that
+  /// accepts [onHijack] as [_OnHijack].
+  ///
+  /// Any [Request] created by calling [change] will pass [_onHijack] from the
+  /// source [Request] to ensure that [hijack] can only be called once, even
+  /// from a changed [Request].
+  Request._(this.method, Uri requestedUri, {String protocolVersion,
+      Map<String, String> headers, String handlerPath, Uri url, body,
+      Encoding encoding, Map<String, Object> context, _OnHijack onHijack})
+      : this.requestedUri = requestedUri,
+        this.protocolVersion = protocolVersion == null
+            ? '1.1'
+            : protocolVersion,
+        this.url = _computeUrl(requestedUri, handlerPath, url),
+        this.handlerPath = _computeHandlerPath(requestedUri, handlerPath, url),
+        this._onHijack = onHijack,
+        super(body, encoding: encoding, headers: headers, context: context) {
+    if (method.isEmpty) throw new ArgumentError('method cannot be empty.');
+
+    if (!requestedUri.isAbsolute) {
+      throw new ArgumentError(
+          'requestedUri "$requestedUri" must be an absolute URL.');
+    }
+
+    if (requestedUri.fragment.isNotEmpty) {
+      throw new ArgumentError(
+          'requestedUri "$requestedUri" may not have a fragment.');
+    }
+
+    if (this.handlerPath + this.url.path != this.requestedUri.path) {
+      throw new ArgumentError('handlerPath "$handlerPath" and url "$url" must '
+          'combine to equal requestedUri path "${requestedUri.path}".');
+    }
+  }
+
+  /// Creates a new [Request] by copying existing values and applying specified
+  /// changes.
+  ///
+  /// New key-value pairs in [context] and [headers] will be added to the copied
+  /// [Request]. If [context] or [headers] includes a key that already exists,
+  /// the key-value pair will replace the corresponding entry in the copied
+  /// [Request]. All other context and header values from the [Request] will be
+  /// included in the copied [Request] unchanged.
+  ///
+  /// [body] is the request body. It may be either a [String] or a
+  /// [Stream<List<int>>].
+  ///
+  /// [path] is used to update both [handlerPath] and [url]. It's designed for
+  /// routing middleware, and represents the path from the current handler to
+  /// the next handler. It must be a prefix of [url]; [handlerPath] becomes
+  /// `handlerPath + "/" + path`, and [url] becomes relative to that. For
+  /// example:
+  ///
+  ///     print(request.handlerPath); // => /static/
+  ///     print(request.url);        // => dir/file.html
+  ///
+  ///     request = request.change(path: "dir");
+  ///     print(request.handlerPath); // => /static/dir/
+  ///     print(request.url);        // => file.html
+  Request change({Map<String, String> headers, Map<String, Object> context,
+      String path, body}) {
+    headers = updateMap(this.headers, headers);
+    context = updateMap(this.context, context);
+
+    if (body == null) body = getBody(this);
+
+    var handlerPath = this.handlerPath;
+    if (path != null) handlerPath += path;
+
+    return new Request._(this.method, this.requestedUri,
+        protocolVersion: this.protocolVersion,
+        headers: headers,
+        handlerPath: handlerPath,
+        body: body,
+        context: context,
+        onHijack: _onHijack);
+  }
+
+  /// Takes control of the underlying request socket.
+  ///
+  /// Synchronously, this throws a [HijackException] that indicates to the
+  /// adapter that it shouldn't emit a response itself. Asynchronously,
+  /// [callback] is called with a [Stream<List<int>>] and
+  /// [StreamSink<List<int>>], respectively, that provide access to the
+  /// underlying request socket.
+  ///
+  /// If the sink is closed, the stream will be closed as well. The stream and
+  /// sink may be the same object, as in the case of a `dart:io` `Socket`
+  /// object.
+  ///
+  /// This may only be called when using a Shelf adapter that supports
+  /// hijacking, such as the `dart:io` adapter. In addition, a given request may
+  /// only be hijacked once. [canHijack] can be used to detect whether this
+  /// request can be hijacked.
+  void hijack(HijackCallback callback) {
+    if (_onHijack == null) {
+      throw new StateError("This request can't be hijacked.");
+    }
+
+    _onHijack.run(callback);
+    throw const HijackException();
+  }
+}
+
+/// A class containing a callback for [Request.hijack] that also tracks whether
+/// the callback has been called.
+class _OnHijack {
+  /// The callback.
+  final OnHijackCallback _callback;
+
+  /// Whether [this] has been called.
+  bool called = false;
+
+  _OnHijack(this._callback);
+
+  /// Calls [this].
+  ///
+  /// Throws a [StateError] if [this] has already been called.
+  void run(HijackCallback callback) {
+    if (called) throw new StateError("This request has already been hijacked.");
+    called = true;
+    newFuture(() => _callback(callback));
+  }
+}
+
+/// Computes `url` from the provided [Request] constructor arguments.
+///
+/// If [url] is `null`, the value is inferred from [requestedUrl] and
+/// [handlerPath] if available. Otherwise [url] is returned.
+Uri _computeUrl(Uri requestedUri, String handlerPath, Uri url) {
+  if (handlerPath != null &&
+      handlerPath != requestedUri.path &&
+      !handlerPath.endsWith("/")) {
+    handlerPath += "/";
+  }
+
+  if (url != null) {
+    if (url.scheme.isNotEmpty || url.hasAuthority || url.fragment.isNotEmpty) {
+      throw new ArgumentError('url "$url" may contain only a path and query '
+          'parameters.');
+    }
+
+    if (!requestedUri.path.endsWith(url.path)) {
+      throw new ArgumentError('url "$url" must be a suffix of requestedUri '
+          '"$requestedUri".');
+    }
+
+    if (requestedUri.query != url.query) {
+      throw new ArgumentError('url "$url" must have the same query parameters '
+          'as requestedUri "$requestedUri".');
+    }
+
+    if (url.path.startsWith('/')) {
+      throw new ArgumentError('url "$url" must be relative.');
+    }
+
+    var startOfUrl = requestedUri.path.length - url.path.length;
+    if (url.path.isNotEmpty &&
+        requestedUri.path.substring(startOfUrl - 1, startOfUrl) != '/') {
+      throw new ArgumentError('url "$url" must be on a path boundary in '
+          'requestedUri "$requestedUri".');
+    }
+
+    return url;
+  } else if (handlerPath != null) {
+    return new Uri(
+        path: requestedUri.path.substring(handlerPath.length),
+        query: requestedUri.query);
+  } else {
+    // Skip the initial "/".
+    var path = requestedUri.path.substring(1);
+    return new Uri(path: path, query: requestedUri.query);
+  }
+}
+
+/// Computes `handlerPath` from the provided [Request] constructor arguments.
+///
+/// If [handlerPath] is `null`, the value is inferred from [requestedUrl] and
+/// [url] if available. Otherwise [handlerPath] is returned.
+String _computeHandlerPath(Uri requestedUri, String handlerPath, Uri url) {
+  if (handlerPath != null &&
+      handlerPath != requestedUri.path &&
+      !handlerPath.endsWith("/")) {
+    handlerPath += "/";
+  }
+
+  if (handlerPath != null) {
+    if (!requestedUri.path.startsWith(handlerPath)) {
+      throw new ArgumentError('handlerPath "$handlerPath" must be a prefix of '
+          'requestedUri path "${requestedUri.path}"');
+    }
+
+    if (!handlerPath.startsWith('/')) {
+      throw new ArgumentError(
+          'handlerPath "$handlerPath" must be root-relative.');
+    }
+
+    return handlerPath;
+  } else if (url != null) {
+    if (url.path.isEmpty) return requestedUri.path;
+
+    var index = requestedUri.path.indexOf(url.path);
+    return requestedUri.path.substring(0, index);
+  } else {
+    return '/';
+  }
+}
diff --git a/mojo/public/dart/third_party/shelf/lib/src/response.dart b/mojo/public/dart/third_party/shelf/lib/src/response.dart
new file mode 100644
index 0000000..79f8994
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/lib/src/response.dart
@@ -0,0 +1,271 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.response;
+
+import 'dart:convert';
+
+import 'package:http_parser/http_parser.dart';
+
+import 'message.dart';
+import 'util.dart';
+
+/// The response returned by a [Handler].
+class Response extends Message {
+  /// The HTTP status code of the response.
+  final int statusCode;
+
+  /// The date and time after which the response's data should be considered
+  /// stale.
+  ///
+  /// This is parsed from the Expires header in [headers]. If [headers] doesn't
+  /// have an Expires header, this will be `null`.
+  DateTime get expires {
+    if (_expiresCache != null) return _expiresCache;
+    if (!headers.containsKey('expires')) return null;
+    _expiresCache = parseHttpDate(headers['expires']);
+    return _expiresCache;
+  }
+  DateTime _expiresCache;
+
+  /// The date and time the source of the response's data was last modified.
+  ///
+  /// This is parsed from the Last-Modified header in [headers]. If [headers]
+  /// doesn't have a Last-Modified header, this will be `null`.
+  DateTime get lastModified {
+    if (_lastModifiedCache != null) return _lastModifiedCache;
+    if (!headers.containsKey('last-modified')) return null;
+    _lastModifiedCache = parseHttpDate(headers['last-modified']);
+    return _lastModifiedCache;
+  }
+  DateTime _lastModifiedCache;
+
+  /// Constructs a 200 OK response.
+  ///
+  /// This indicates that the request has succeeded.
+  ///
+  /// [body] is the response body. It may be either a [String], a
+  /// [Stream<List<int>>], or `null` to indicate no body. If it's a [String],
+  /// [encoding] is used to encode it to a [Stream<List<int>>]. It defaults to
+  /// UTF-8.
+  ///
+  /// If [encoding] is passed, the "encoding" field of the Content-Type header
+  /// in [headers] will be set appropriately. If there is no existing
+  /// Content-Type header, it will be set to "application/octet-stream".
+  Response.ok(body, {Map<String, String> headers, Encoding encoding,
+    Map<String, Object> context})
+      : this(200, body: body, headers: headers, encoding: encoding,
+          context: context);
+
+  /// Constructs a 301 Moved Permanently response.
+  ///
+  /// This indicates that the requested resource has moved permanently to a new
+  /// URI. [location] is that URI; it can be either a [String] or a [Uri]. It's
+  /// automatically set as the Location header in [headers].
+  ///
+  /// [body] is the response body. It may be either a [String], a
+  /// [Stream<List<int>>], or `null` to indicate no body. If it's a [String],
+  /// [encoding] is used to encode it to a [Stream<List<int>>]. It defaults to
+  /// UTF-8.
+  ///
+  /// If [encoding] is passed, the "encoding" field of the Content-Type header
+  /// in [headers] will be set appropriately. If there is no existing
+  /// Content-Type header, it will be set to "application/octet-stream".
+  Response.movedPermanently(location, {body, Map<String, String> headers,
+      Encoding encoding, Map<String, Object> context})
+      : this._redirect(301, location, body, headers, encoding,
+          context: context);
+
+  /// Constructs a 302 Found response.
+  ///
+  /// This indicates that the requested resource has moved temporarily to a new
+  /// URI. [location] is that URI; it can be either a [String] or a [Uri]. It's
+  /// automatically set as the Location header in [headers].
+  ///
+  /// [body] is the response body. It may be either a [String], a
+  /// [Stream<List<int>>], or `null` to indicate no body. If it's a [String],
+  /// [encoding] is used to encode it to a [Stream<List<int>>]. It defaults to
+  /// UTF-8.
+  ///
+  /// If [encoding] is passed, the "encoding" field of the Content-Type header
+  /// in [headers] will be set appropriately. If there is no existing
+  /// Content-Type header, it will be set to "application/octet-stream".
+  Response.found(location, {body, Map<String, String> headers,
+      Encoding encoding, Map<String, Object> context})
+      : this._redirect(302, location, body, headers, encoding,
+          context: context);
+
+  /// Constructs a 303 See Other response.
+  ///
+  /// This indicates that the response to the request should be retrieved using
+  /// a GET request to a new URI. [location] is that URI; it can be either a
+  /// [String] or a [Uri]. It's automatically set as the Location header in
+  /// [headers].
+  ///
+  /// [body] is the response body. It may be either a [String], a
+  /// [Stream<List<int>>], or `null` to indicate no body. If it's a [String],
+  /// [encoding] is used to encode it to a [Stream<List<int>>]. It defaults to
+  /// UTF-8.
+  ///
+  /// If [encoding] is passed, the "encoding" field of the Content-Type header
+  /// in [headers] will be set appropriately. If there is no existing
+  /// Content-Type header, it will be set to "application/octet-stream".
+  Response.seeOther(location, {body, Map<String, String> headers,
+      Encoding encoding, Map<String, Object> context})
+      : this._redirect(303, location, body, headers, encoding,
+          context: context);
+
+  /// Constructs a helper constructor for redirect responses.
+  Response._redirect(int statusCode, location, body,
+      Map<String, String> headers, Encoding encoding,
+      { Map<String, Object> context })
+      : this(statusCode,
+            body: body,
+            encoding: encoding,
+            headers: addHeader(
+                headers, 'location', _locationToString(location)),
+            context: context);
+
+  /// Constructs a 304 Not Modified response.
+  ///
+  /// This is used to respond to a conditional GET request that provided
+  /// information used to determine whether the requested resource has changed
+  /// since the last request. It indicates that the resource has not changed and
+  /// the old value should be used.
+  Response.notModified({Map<String, String> headers,
+    Map<String, Object> context})
+      : this(304, headers: addHeader(
+            headers, 'date', formatHttpDate(new DateTime.now())),
+            context: context);
+
+  /// Constructs a 403 Forbidden response.
+  ///
+  /// This indicates that the server is refusing to fulfill the request.
+  ///
+  /// [body] is the response body. It may be a [String], a [Stream<List<int>>],
+  /// or `null`. If it's a [String], [encoding] is used to encode it to a
+  /// [Stream<List<int>>]. The default encoding is UTF-8. If it's `null` or not
+  /// passed, a default error message is used.
+  ///
+  /// If [encoding] is passed, the "encoding" field of the Content-Type header
+  /// in [headers] will be set appropriately. If there is no existing
+  /// Content-Type header, it will be set to "application/octet-stream".
+  Response.forbidden(body, {Map<String, String> headers,
+      Encoding encoding, Map<String, Object> context})
+      : this(403,
+          headers: body == null ? _adjustErrorHeaders(headers) : headers,
+          body: body == null ? 'Forbidden' : body,
+          context: context);
+
+  /// Constructs a 404 Not Found response.
+  ///
+  /// This indicates that the server didn't find any resource matching the
+  /// requested URI.
+  ///
+  /// [body] is the response body. It may be a [String], a [Stream<List<int>>],
+  /// or `null`. If it's a [String], [encoding] is used to encode it to a
+  /// [Stream<List<int>>]. The default encoding is UTF-8. If it's `null` or not
+  /// passed, a default error message is used.
+  ///
+  /// If [encoding] is passed, the "encoding" field of the Content-Type header
+  /// in [headers] will be set appropriately. If there is no existing
+  /// Content-Type header, it will be set to "application/octet-stream".
+  Response.notFound(body, {Map<String, String> headers, Encoding encoding,
+    Map<String, Object> context})
+      : this(404,
+          headers: body == null ? _adjustErrorHeaders(headers) : headers,
+          body: body == null ? 'Not Found' : body,
+          context: context);
+
+  /// Constructs a 500 Internal Server Error response.
+  ///
+  /// This indicates that the server had an internal error that prevented it
+  /// from fulfilling the request.
+  ///
+  /// [body] is the response body. It may be a [String], a [Stream<List<int>>],
+  /// or `null`. If it's a [String], [encoding] is used to encode it to a
+  /// [Stream<List<int>>]. The default encoding is UTF-8. If it's `null` or not
+  /// passed, a default error message is used.
+  ///
+  /// If [encoding] is passed, the "encoding" field of the Content-Type header
+  /// in [headers] will be set appropriately. If there is no existing
+  /// Content-Type header, it will be set to "application/octet-stream".
+  Response.internalServerError({body, Map<String, String> headers,
+      Encoding encoding, Map<String, Object> context})
+      : this(500,
+            headers: body == null ? _adjustErrorHeaders(headers) : headers,
+            body: body == null ? 'Internal Server Error' : body,
+            context: context);
+
+  /// Constructs an HTTP response with the given [statusCode].
+  ///
+  /// [statusCode] must be greater than or equal to 100.
+  ///
+  /// [body] is the response body. It may be either a [String], a
+  /// [Stream<List<int>>], or `null` to indicate no body.
+  /// If it's a [String], [encoding] is used to encode it to a
+  /// [Stream<List<int>>]. The default encoding is UTF-8.
+  ///
+  /// If [encoding] is passed, the "encoding" field of the Content-Type header
+  /// in [headers] will be set appropriately. If there is no existing
+  /// Content-Type header, it will be set to "application/octet-stream".
+  Response(this.statusCode, {body, Map<String, String> headers,
+      Encoding encoding, Map<String, Object> context})
+      : super(body, encoding: encoding, headers: headers, context: context) {
+    if (statusCode < 100) {
+      throw new ArgumentError("Invalid status code: $statusCode.");
+    }
+  }
+
+  /// Creates a new [Response] by copying existing values and applying specified
+  /// changes.
+  ///
+  /// New key-value pairs in [context] and [headers] will be added to the copied
+  /// [Response].
+  ///
+  /// If [context] or [headers] includes a key that already exists, the
+  /// key-value pair will replace the corresponding entry in the copied
+  /// [Response].
+  ///
+  /// All other context and header values from the [Response] will be included
+  /// in the copied [Response] unchanged.
+  ///
+  /// [body] is the request body. It may be either a [String] or a
+  /// [Stream<List<int>>].
+  Response change(
+      {Map<String, String> headers, Map<String, Object> context, body}) {
+    headers = updateMap(this.headers, headers);
+    context = updateMap(this.context, context);
+
+    if (body == null) body = getBody(this);
+
+    return new Response(this.statusCode, body: body, headers: headers,
+        context: context);
+  }
+}
+
+/// Adds content-type information to [headers].
+///
+/// Returns a new map without modifying [headers]. This is used to add
+/// content-type information when creating a 500 response with a default body.
+Map<String, String> _adjustErrorHeaders(Map<String, String> headers) {
+  if (headers == null || headers['content-type'] == null) {
+    return addHeader(headers, 'content-type', 'text/plain');
+  }
+
+  var contentType = new MediaType.parse(headers['content-type'])
+      .change(mimeType: 'text/plain');
+  return addHeader(headers, 'content-type', contentType.toString());
+}
+
+/// Converts [location], which may be a [String] or a [Uri], to a [String].
+///
+/// Throws an [ArgumentError] if [location] isn't a [String] or a [Uri].
+String _locationToString(location) {
+  if (location is String) return location;
+  if (location is Uri) return location.toString();
+
+  throw new ArgumentError('Response location must be a String or Uri, was '
+      '"$location".');
+}
diff --git a/mojo/public/dart/third_party/shelf/lib/src/shelf_unmodifiable_map.dart b/mojo/public/dart/third_party/shelf/lib/src/shelf_unmodifiable_map.dart
new file mode 100644
index 0000000..d07ebfd
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/lib/src/shelf_unmodifiable_map.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.shelf_unmodifiable_map;
+
+import 'dart:collection';
+
+import 'package:collection/wrappers.dart' as pc;
+
+/// A simple wrapper over [pc.UnmodifiableMapView] which avoids re-wrapping
+/// itself.
+class ShelfUnmodifiableMap<V> extends UnmodifiableMapView<String, V> {
+  /// If [source] is a [ShelfUnmodifiableMap] with matching [ignoreKeyCase],
+  /// then [source] is returned.
+  ///
+  /// If [source] is `null` it is treated like an empty map.
+  ///
+  /// If [ignoreKeyCase] is `true`, the keys will have case-insensitive access.
+  ///
+  /// [source] is copied to a new [Map] to ensure changes to the parameter value
+  /// after constructions are not reflected.
+  factory ShelfUnmodifiableMap(Map<String, V> source,
+      {bool ignoreKeyCase: false}) {
+    if (source is ShelfUnmodifiableMap<V>) {
+      return source;
+    }
+
+    if (source == null || source.isEmpty) {
+      return const _EmptyShelfUnmodifiableMap();
+    }
+
+    if (ignoreKeyCase) {
+      source = new pc.CanonicalizedMap<String, String, V>.from(
+          source, (key) => key.toLowerCase(), isValidKey: (key) => key != null);
+    } else {
+      source = new Map<String, V>.from(source);
+    }
+
+    return new ShelfUnmodifiableMap<V>._(source);
+  }
+
+  ShelfUnmodifiableMap._(Map<String, V> source) : super(source);
+}
+
+/// An const empty implementation of [ShelfUnmodifiableMap].
+// TODO(kevmoo): Consider using MapView from dart:collection which has a const
+// ctor. Would require updating min SDK to 1.5.
+class _EmptyShelfUnmodifiableMap<V> extends pc.DelegatingMap<String, V>
+    implements ShelfUnmodifiableMap<V> {
+  const _EmptyShelfUnmodifiableMap() : super(const {});
+}
diff --git a/mojo/public/dart/third_party/shelf/lib/src/util.dart b/mojo/public/dart/third_party/shelf/lib/src/util.dart
new file mode 100644
index 0000000..6d9f2c1
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/lib/src/util.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.util;
+
+import 'dart:async';
+
+/// Like [new Future], but avoids around issue 11911 by using [new Future.value]
+/// under the covers.
+Future newFuture(callback()) => new Future.value().then((_) => callback());
+
+/// Run [callback] and capture any errors that would otherwise be top-leveled.
+///
+/// If [this] is called in a non-root error zone, it will just run [callback]
+/// and return the result. Otherwise, it will capture any errors using
+/// [runZoned] and pass them to [onError].
+catchTopLevelErrors(callback(), void onError(error, StackTrace stackTrace)) {
+  if (Zone.current.inSameErrorZone(Zone.ROOT)) {
+    return runZoned(callback, onError: onError);
+  } else {
+    return callback();
+  }
+}
+
+/// Returns a [Map] with the values from [original] and the values from
+/// [updates].
+///
+/// For keys that are the same between [original] and [updates], the value in
+/// [updates] is used.
+///
+/// If [updates] is `null` or empty, [original] is returned unchanged.
+Map updateMap(Map original, Map updates) {
+  if (updates == null || updates.isEmpty) return original;
+
+  return new Map.from(original)..addAll(updates);
+}
+
+/// Adds a header with [name] and [value] to [headers], which may be null.
+///
+/// Returns a new map without modifying [headers].
+Map<String, String> addHeader(
+    Map<String, String> headers, String name, String value) {
+  headers = headers == null ? {} : new Map.from(headers);
+  headers[name] = value;
+  return headers;
+}
diff --git a/mojo/public/dart/third_party/shelf/pubspec.yaml b/mojo/public/dart/third_party/shelf/pubspec.yaml
new file mode 100644
index 0000000..28fc35a
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/pubspec.yaml
@@ -0,0 +1,16 @@
+name: shelf
+version: 0.6.3
+author: Dart Team <misc@dartlang.org>
+description: Web Server Middleware for Dart
+homepage: https://github.com/dart-lang/shelf
+environment:
+  sdk: '>=1.9.0 <2.0.0'
+dependencies:
+  collection: '^1.0.0'
+  http_parser: '>=0.0.0 <2.0.0'
+  path: '^1.0.0'
+  stack_trace: '^1.0.0'
+dev_dependencies:
+  http: '>=0.9.2 <0.12.0'
+  scheduled_test: '^0.12.0'
+  test: '^0.12.0'
diff --git a/mojo/public/dart/third_party/shelf/test/cascade_test.dart b/mojo/public/dart/third_party/shelf/test/cascade_test.dart
new file mode 100644
index 0000000..7c73fcb
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/test/cascade_test.dart
@@ -0,0 +1,144 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.cascade_test;
+
+import 'dart:async';
+
+import 'package:shelf/shelf.dart';
+import 'package:test/test.dart';
+
+import 'test_util.dart';
+
+void main() {
+  group('a cascade with several handlers', () {
+    var handler;
+    setUp(() {
+      handler = new Cascade().add((request) {
+        if (request.headers['one'] == 'false') {
+          return new Response.notFound('handler 1');
+        } else {
+          return new Response.ok('handler 1');
+        }
+      }).add((request) {
+        if (request.headers['two'] == 'false') {
+          return new Response.notFound('handler 2');
+        } else {
+          return new Response.ok('handler 2');
+        }
+      }).add((request) {
+        if (request.headers['three'] == 'false') {
+          return new Response.notFound('handler 3');
+        } else {
+          return new Response.ok('handler 3');
+        }
+      }).handler;
+    });
+
+    test('the first response should be returned if it matches', () {
+      return makeSimpleRequest(handler).then((response) {
+        expect(response.statusCode, equals(200));
+        expect(response.readAsString(), completion(equals('handler 1')));
+      });
+    });
+
+    test("the second response should be returned if it matches and the first "
+        "doesn't", () {
+      return new Future.sync(() {
+        return handler(
+            new Request('GET', LOCALHOST_URI, headers: {'one': 'false'}));
+      }).then((response) {
+        expect(response.statusCode, equals(200));
+        expect(response.readAsString(), completion(equals('handler 2')));
+      });
+    });
+
+    test("the third response should be returned if it matches and the first "
+        "two don't", () {
+      return new Future.sync(() {
+        return handler(new Request('GET', LOCALHOST_URI,
+            headers: {'one': 'false', 'two': 'false'}));
+      }).then((response) {
+        expect(response.statusCode, equals(200));
+        expect(response.readAsString(), completion(equals('handler 3')));
+      });
+    });
+
+    test("the third response should be returned if no response matches", () {
+      return new Future.sync(() {
+        return handler(new Request('GET', LOCALHOST_URI,
+            headers: {'one': 'false', 'two': 'false', 'three': 'false'}));
+      }).then((response) {
+        expect(response.statusCode, equals(404));
+        expect(response.readAsString(), completion(equals('handler 3')));
+      });
+    });
+  });
+
+  test('a 404 response triggers a cascade by default', () {
+    var handler = new Cascade()
+        .add((_) => new Response.notFound('handler 1'))
+        .add((_) => new Response.ok('handler 2'))
+        .handler;
+
+    return makeSimpleRequest(handler).then((response) {
+      expect(response.statusCode, equals(200));
+      expect(response.readAsString(), completion(equals('handler 2')));
+    });
+  });
+
+  test('a 405 response triggers a cascade by default', () {
+    var handler = new Cascade()
+        .add((_) => new Response(405))
+        .add((_) => new Response.ok('handler 2'))
+        .handler;
+
+    return makeSimpleRequest(handler).then((response) {
+      expect(response.statusCode, equals(200));
+      expect(response.readAsString(), completion(equals('handler 2')));
+    });
+  });
+
+  test('[statusCodes] controls which statuses cause cascading', () {
+    var handler = new Cascade(statusCodes: [302, 403])
+        .add((_) => new Response.found('/'))
+        .add((_) => new Response.forbidden('handler 2'))
+        .add((_) => new Response.notFound('handler 3'))
+        .add((_) => new Response.ok('handler 4'))
+        .handler;
+
+    return makeSimpleRequest(handler).then((response) {
+      expect(response.statusCode, equals(404));
+      expect(response.readAsString(), completion(equals('handler 3')));
+    });
+  });
+
+  test('[shouldCascade] controls which responses cause cascading', () {
+    var handler = new Cascade(
+            shouldCascade: (response) => response.statusCode % 2 == 1)
+        .add((_) => new Response.movedPermanently('/'))
+        .add((_) => new Response.forbidden('handler 2'))
+        .add((_) => new Response.notFound('handler 3'))
+        .add((_) => new Response.ok('handler 4'))
+        .handler;
+
+    return makeSimpleRequest(handler).then((response) {
+      expect(response.statusCode, equals(404));
+      expect(response.readAsString(), completion(equals('handler 3')));
+    });
+  });
+
+  group('errors', () {
+    test('getting the handler for an empty cascade fails', () {
+      expect(() => new Cascade().handler, throwsStateError);
+    });
+
+    test('passing [statusCodes] and [shouldCascade] at the same time fails',
+        () {
+      expect(() =>
+              new Cascade(statusCodes: [404, 405], shouldCascade: (_) => false),
+          throwsArgumentError);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/shelf/test/create_middleware_test.dart b/mojo/public/dart/third_party/shelf/test/create_middleware_test.dart
new file mode 100644
index 0000000..b1058db
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/test/create_middleware_test.dart
@@ -0,0 +1,236 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.create_middleware_test;
+
+import 'dart:async';
+
+import 'package:shelf/shelf.dart';
+import 'package:test/test.dart';
+
+import 'test_util.dart';
+
+void main() {
+  test('forwards the request and response if both handlers are null', () {
+    var handler = const Pipeline()
+        .addMiddleware(createMiddleware())
+        .addHandler((request) {
+      return syncHandler(request, headers: {'from': 'innerHandler'});
+    });
+
+    return makeSimpleRequest(handler).then((response) {
+      expect(response.headers['from'], 'innerHandler');
+    });
+  });
+
+  group('requestHandler', () {
+    test('sync null response forwards to inner handler', () {
+      var handler = const Pipeline()
+          .addMiddleware(createMiddleware(requestHandler: (request) => null))
+          .addHandler(syncHandler);
+
+      return makeSimpleRequest(handler).then((response) {
+        expect(response.headers['from'], isNull);
+      });
+    });
+
+    test('async null response forwards to inner handler', () {
+      var handler = const Pipeline()
+          .addMiddleware(createMiddleware(
+              requestHandler: (request) => new Future.value(null)))
+          .addHandler(syncHandler);
+
+      return makeSimpleRequest(handler).then((response) {
+        expect(response.headers['from'], isNull);
+      });
+    });
+
+    test('sync response is returned', () {
+      var handler = const Pipeline()
+          .addMiddleware(createMiddleware(
+              requestHandler: (request) => _middlewareResponse))
+          .addHandler(_failHandler);
+
+      return makeSimpleRequest(handler).then((response) {
+        expect(response.headers['from'], 'middleware');
+      });
+    });
+
+    test('async response is returned', () {
+      var handler = const Pipeline()
+          .addMiddleware(createMiddleware(
+              requestHandler: (request) =>
+                  new Future.value(_middlewareResponse)))
+          .addHandler(_failHandler);
+
+      return makeSimpleRequest(handler).then((response) {
+        expect(response.headers['from'], 'middleware');
+      });
+    });
+
+    group('with responseHandler', () {
+      test('with sync result, responseHandler is not called', () {
+        var middleware = createMiddleware(
+            requestHandler: (request) => _middlewareResponse,
+            responseHandler: (response) => fail('should not be called'));
+
+        var handler =
+            const Pipeline().addMiddleware(middleware).addHandler(syncHandler);
+
+        return makeSimpleRequest(handler).then((response) {
+          expect(response.headers['from'], 'middleware');
+        });
+      });
+
+      test('with async result, responseHandler is not called', () {
+        var middleware = createMiddleware(
+            requestHandler: (request) => new Future.value(_middlewareResponse),
+            responseHandler: (response) => fail('should not be called'));
+        var handler =
+            const Pipeline().addMiddleware(middleware).addHandler(syncHandler);
+
+        return makeSimpleRequest(handler).then((response) {
+          expect(response.headers['from'], 'middleware');
+        });
+      });
+    });
+  });
+
+  group('responseHandler', () {
+    test('innerHandler sync response is seen, replaced value continues', () {
+      var handler = const Pipeline()
+          .addMiddleware(createMiddleware(responseHandler: (response) {
+        expect(response.headers['from'], 'handler');
+        return _middlewareResponse;
+      })).addHandler((request) {
+        return syncHandler(request, headers: {'from': 'handler'});
+      });
+
+      return makeSimpleRequest(handler).then((response) {
+        expect(response.headers['from'], 'middleware');
+      });
+    });
+
+    test('innerHandler async response is seen, async value continues', () {
+      var handler = const Pipeline()
+          .addMiddleware(createMiddleware(responseHandler: (response) {
+        expect(response.headers['from'], 'handler');
+        return new Future.value(_middlewareResponse);
+      })).addHandler((request) {
+        return new Future(
+            () => syncHandler(request, headers: {'from': 'handler'}));
+      });
+
+      return makeSimpleRequest(handler).then((response) {
+        expect(response.headers['from'], 'middleware');
+      });
+    });
+  });
+
+  group('error handling', () {
+    test('sync error thrown by requestHandler bubbles down', () {
+      var handler = const Pipeline()
+          .addMiddleware(createMiddleware(
+              requestHandler: (request) => throw 'middleware error'))
+          .addHandler(_failHandler);
+
+      expect(makeSimpleRequest(handler), throwsA('middleware error'));
+    });
+
+    test('async error thrown by requestHandler bubbles down', () {
+      var handler = const Pipeline()
+          .addMiddleware(createMiddleware(
+              requestHandler: (request) =>
+                  new Future.error('middleware error')))
+          .addHandler(_failHandler);
+
+      expect(makeSimpleRequest(handler), throwsA('middleware error'));
+    });
+
+    test('throw from responseHandler does not hit error handler', () {
+      var middleware = createMiddleware(responseHandler: (response) {
+        throw 'middleware error';
+      }, errorHandler: (e, s) => fail('should never get here'));
+
+      var handler =
+          const Pipeline().addMiddleware(middleware).addHandler(syncHandler);
+
+      expect(makeSimpleRequest(handler), throwsA('middleware error'));
+    });
+
+    test('requestHandler throw does not hit errorHandlers', () {
+      var middleware = createMiddleware(requestHandler: (request) {
+        throw 'middleware error';
+      }, errorHandler: (e, s) => fail('should never get here'));
+
+      var handler =
+          const Pipeline().addMiddleware(middleware).addHandler(syncHandler);
+
+      expect(makeSimpleRequest(handler), throwsA('middleware error'));
+    });
+
+    test('inner handler throws, is caught by errorHandler with response', () {
+      var middleware = createMiddleware(errorHandler: (error, stack) {
+        expect(error, 'bad handler');
+        return _middlewareResponse;
+      });
+
+      var handler = const Pipeline()
+          .addMiddleware(middleware)
+          .addHandler((request) {
+        throw 'bad handler';
+      });
+
+      return makeSimpleRequest(handler).then((response) {
+        expect(response.headers['from'], 'middleware');
+      });
+    });
+
+    test('inner handler throws, is caught by errorHandler and rethrown', () {
+      var middleware = createMiddleware(errorHandler: (error, stack) {
+        expect(error, 'bad handler');
+        throw error;
+      });
+
+      var handler = const Pipeline()
+          .addMiddleware(middleware)
+          .addHandler((request) {
+        throw 'bad handler';
+      });
+
+      expect(makeSimpleRequest(handler), throwsA('bad handler'));
+    });
+
+    test('error thrown by inner handler without a middleware errorHandler is '
+        'rethrown', () {
+      var middleware = createMiddleware();
+
+      var handler = const Pipeline()
+          .addMiddleware(middleware)
+          .addHandler((request) {
+        throw 'bad handler';
+      });
+
+      expect(makeSimpleRequest(handler), throwsA('bad handler'));
+    });
+
+    test("doesn't handle HijackException", () {
+      var middleware = createMiddleware(errorHandler: (error, stack) {
+        fail("error handler shouldn't be called");
+      });
+
+      var handler = const Pipeline()
+          .addMiddleware(middleware)
+          .addHandler((request) => throw const HijackException());
+
+      expect(makeSimpleRequest(handler),
+          throwsA(new isInstanceOf<HijackException>()));
+    });
+  });
+}
+
+_failHandler(Request request) => fail('should never get here');
+
+final Response _middlewareResponse =
+    new Response.ok('middleware content', headers: {'from': 'middleware'});
diff --git a/mojo/public/dart/third_party/shelf/test/hijack_test.dart b/mojo/public/dart/third_party/shelf/test/hijack_test.dart
new file mode 100644
index 0000000..a5dc852
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/test/hijack_test.dart
@@ -0,0 +1,96 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.hijack_test;
+
+import 'dart:async';
+
+import 'package:test/test.dart';
+import 'package:shelf/shelf.dart';
+
+import 'test_util.dart';
+
+void main() {
+  test('hijacking a non-hijackable request throws a StateError', () {
+    expect(() => new Request('GET', LOCALHOST_URI).hijack((_, __) => null),
+        throwsStateError);
+  });
+
+  test('hijacking a hijackable request throws a HijackException and calls '
+      'onHijack', () {
+    var request = new Request('GET', LOCALHOST_URI,
+        onHijack: expectAsync((callback) {
+      var streamController = new StreamController();
+      streamController.add([1, 2, 3]);
+      streamController.close();
+
+      var sinkController = new StreamController();
+      expect(sinkController.stream.first, completion(equals([4, 5, 6])));
+
+      callback(streamController.stream, sinkController);
+    }));
+
+    expect(() => request.hijack(expectAsync((stream, sink) {
+      expect(stream.first, completion(equals([1, 2, 3])));
+      sink.add([4, 5, 6]);
+      sink.close();
+    })), throwsA(new isInstanceOf<HijackException>()));
+  });
+
+  test('hijacking a hijackable request twice throws a StateError', () {
+    // Assert that the [onHijack] callback is only called once.
+    var request = new Request('GET', LOCALHOST_URI,
+        onHijack: expectAsync((_) => null, count: 1));
+
+    expect(() => request.hijack((_, __) => null),
+        throwsA(new isInstanceOf<HijackException>()));
+
+    expect(() => request.hijack((_, __) => null), throwsStateError);
+  });
+
+  group('calling change', () {
+    test('hijacking a non-hijackable request throws a StateError', () {
+      var request = new Request('GET', LOCALHOST_URI);
+      var newRequest = request.change();
+      expect(() => newRequest.hijack((_, __) => null), throwsStateError);
+    });
+
+    test('hijacking a hijackable request throws a HijackException and calls '
+        'onHijack', () {
+      var request = new Request('GET', LOCALHOST_URI,
+          onHijack: expectAsync((callback) {
+        var streamController = new StreamController();
+        streamController.add([1, 2, 3]);
+        streamController.close();
+
+        var sinkController = new StreamController();
+        expect(sinkController.stream.first, completion(equals([4, 5, 6])));
+
+        callback(streamController.stream, sinkController);
+      }));
+
+      var newRequest = request.change();
+
+      expect(() => newRequest.hijack(expectAsync((stream, sink) {
+        expect(stream.first, completion(equals([1, 2, 3])));
+        sink.add([4, 5, 6]);
+        sink.close();
+      })), throwsA(new isInstanceOf<HijackException>()));
+    });
+
+    test('hijacking the original request after calling change throws a '
+        'StateError', () {
+      // Assert that the [onHijack] callback is only called once.
+      var request = new Request('GET', LOCALHOST_URI,
+          onHijack: expectAsync((_) => null, count: 1));
+
+      var newRequest = request.change();
+
+      expect(() => newRequest.hijack((_, __) => null),
+          throwsA(new isInstanceOf<HijackException>()));
+
+      expect(() => request.hijack((_, __) => null), throwsStateError);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/shelf/test/log_middleware_test.dart b/mojo/public/dart/third_party/shelf/test/log_middleware_test.dart
new file mode 100644
index 0000000..d8fde15
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/test/log_middleware_test.dart
@@ -0,0 +1,71 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.log_middleware_test;
+
+import 'package:shelf/shelf.dart';
+import 'package:test/test.dart';
+
+import 'test_util.dart';
+
+void main() {
+  bool gotLog;
+
+  setUp(() {
+    gotLog = false;
+  });
+
+  var logger = (msg, isError) {
+    expect(gotLog, isFalse);
+    gotLog = true;
+    expect(isError, isFalse);
+    expect(msg, contains('GET'));
+    expect(msg, contains('[200]'));
+  };
+
+  test('logs a request with a synchronous response', () {
+    var handler = const Pipeline()
+        .addMiddleware(logRequests(logger: logger))
+        .addHandler(syncHandler);
+
+    return makeSimpleRequest(handler).then((response) {
+      expect(gotLog, isTrue);
+    });
+  });
+
+  test('logs a request with an asynchronous response', () {
+    var handler = const Pipeline()
+        .addMiddleware(logRequests(logger: logger))
+        .addHandler(asyncHandler);
+
+    return makeSimpleRequest(handler).then((response) {
+      expect(gotLog, isTrue);
+    });
+  });
+
+  test('logs a request with an asynchronous error response', () {
+    var handler = const Pipeline()
+        .addMiddleware(logRequests(logger: (msg, isError) {
+      expect(gotLog, isFalse);
+      gotLog = true;
+      expect(isError, isTrue);
+      expect(msg, contains('\tGET\t/'));
+      expect(msg, contains('testing logging throw'));
+    })).addHandler((request) {
+      throw 'testing logging throw';
+    });
+
+    expect(makeSimpleRequest(handler), throwsA('testing logging throw'));
+  });
+
+  test("doesn't log a HijackException", () {
+    var handler = const Pipeline()
+        .addMiddleware(logRequests(logger: logger))
+        .addHandler((request) => throw const HijackException());
+
+    expect(makeSimpleRequest(handler).whenComplete(() {
+      expect(gotLog, isFalse);
+    }), throwsA(new isInstanceOf<HijackException>()));
+  });
+}
diff --git a/mojo/public/dart/third_party/shelf/test/message_change_test.dart b/mojo/public/dart/third_party/shelf/test/message_change_test.dart
new file mode 100644
index 0000000..ed41de2
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/test/message_change_test.dart
@@ -0,0 +1,99 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.message_change_test;
+
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:test/test.dart';
+
+import 'package:shelf/shelf.dart';
+import 'package:shelf/src/message.dart';
+
+import 'test_util.dart';
+
+void main() {
+  group('Request', () {
+    _testChange(({body, headers, context}) {
+      return new Request('GET', LOCALHOST_URI, body: body,
+          headers: headers, context: context);
+    });
+  });
+
+  group('Response', () {
+    _testChange(({body, headers, context}) {
+      return new Response.ok(body, headers: headers, context: context);
+    });
+  });
+}
+
+/// Shared test method used by [Request] and [Response] tests to validate
+/// the behavior of `change` with different `headers` and `context` values.
+void _testChange(Message factory(
+    {body, Map<String, String> headers, Map<String, Object> context})) {
+  group('body', () {
+    test('with String', () async {
+      var request = factory(body: 'Hello, world');
+      var copy = request.change(body: 'Goodbye, world');
+
+      var newBody = await copy.readAsString();
+
+      expect(newBody, equals('Goodbye, world'));
+    });
+
+    test('with Stream', () async {
+      var request = factory(body: 'Hello, world');
+      var copy = request.change(
+          body: new Stream.fromIterable(['Goodbye, world'])
+            .transform(UTF8.encoder));
+
+      var newBody = await copy.readAsString();
+
+      expect(newBody, equals('Goodbye, world'));
+    });
+  });
+
+  test('with empty headers returns indentical instance', () {
+    var request = factory(headers: {'header1': 'header value 1'});
+    var copy = request.change(headers: {});
+
+    expect(copy.headers, same(request.headers));
+  });
+
+  test('with empty context returns identical instance', () {
+    var request = factory(context: {'context1': 'context value 1'});
+    var copy = request.change(context: {});
+
+    expect(copy.context, same(request.context));
+  });
+
+  test('new header values are added', () {
+    var request = factory(headers: {'test': 'test value'});
+    var copy = request.change(headers: {'test2': 'test2 value'});
+
+    expect(copy.headers, {'test': 'test value', 'test2': 'test2 value'});
+  });
+
+  test('existing header values are overwritten', () {
+    var request = factory(headers: {'test': 'test value'});
+    var copy = request.change(headers: {'test': 'new test value'});
+
+    expect(copy.headers, {'test': 'new test value'});
+  });
+
+  test('new context values are added', () {
+    var request = factory(context: {'test': 'test value'});
+    var copy = request.change(context: {'test2': 'test2 value'});
+
+    expect(copy.context, {'test': 'test value', 'test2': 'test2 value'});
+  });
+
+  test('existing context values are overwritten', () {
+    var request = factory(context: {'test': 'test value'});
+    var copy = request.change(context: {'test': 'new test value'});
+
+    expect(copy.context, {'test': 'new test value'});
+  });
+}
diff --git a/mojo/public/dart/third_party/shelf/test/message_test.dart b/mojo/public/dart/third_party/shelf/test/message_test.dart
new file mode 100644
index 0000000..8a5abed
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/test/message_test.dart
@@ -0,0 +1,240 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.message_test;
+
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:shelf/src/message.dart';
+import 'package:test/test.dart';
+
+import 'test_util.dart';
+
+class _TestMessage extends Message {
+  _TestMessage(Map<String, String> headers, Map<String, Object> context, body,
+      Encoding encoding)
+      : super(body, headers: headers, context: context, encoding: encoding);
+
+  Message change({Map<String, String> headers, Map<String, Object> context,
+      body}) {
+    throw new UnimplementedError();
+  }
+}
+
+Message _createMessage({Map<String, String> headers,
+    Map<String, Object> context, body, Encoding encoding}) {
+  return new _TestMessage(headers, context, body, encoding);
+}
+
+void main() {
+  group('headers', () {
+    test('message headers are case insensitive', () {
+      var message = _createMessage(headers: {'foo': 'bar'});
+
+      expect(message.headers, containsPair('foo', 'bar'));
+      expect(message.headers, containsPair('Foo', 'bar'));
+      expect(message.headers, containsPair('FOO', 'bar'));
+    });
+
+    test('null header value becomes empty, immutable', () {
+      var message = _createMessage();
+      expect(message.headers, isEmpty);
+      expect(() => message.headers['h1'] = 'value1', throwsUnsupportedError);
+    });
+
+    test('headers are immutable', () {
+      var message = _createMessage(headers: {'h1': 'value1'});
+      expect(() => message.headers['h1'] = 'value1', throwsUnsupportedError);
+      expect(() => message.headers['h1'] = 'value2', throwsUnsupportedError);
+      expect(() => message.headers['h2'] = 'value2', throwsUnsupportedError);
+    });
+  });
+
+  group('context', () {
+    test('is accessible', () {
+      var message = _createMessage(context: {'foo': 'bar'});
+      expect(message.context, containsPair('foo', 'bar'));
+    });
+
+    test('null context value becomes empty and immutable', () {
+      var message = _createMessage();
+      expect(message.context, isEmpty);
+      expect(() => message.context['key'] = 'value', throwsUnsupportedError);
+    });
+
+    test('is immutable', () {
+      var message = _createMessage(context: {'key': 'value'});
+      expect(() => message.context['key'] = 'value', throwsUnsupportedError);
+      expect(() => message.context['key2'] = 'value', throwsUnsupportedError);
+    });
+  });
+
+  group("readAsString", () {
+    test("supports a null body", () {
+      var request = _createMessage();
+      expect(request.readAsString(), completion(equals("")));
+    });
+
+    test("supports a Stream<List<int>> body", () {
+      var controller = new StreamController();
+      var request = _createMessage(body: controller.stream);
+      expect(request.readAsString(), completion(equals("hello, world")));
+
+      controller.add(HELLO_BYTES);
+      return new Future(() {
+        controller
+          ..add(WORLD_BYTES)
+          ..close();
+      });
+    });
+
+    test("defaults to UTF-8", () {
+      var request = _createMessage(body: new Stream.fromIterable([[195, 168]]));
+      expect(request.readAsString(), completion(equals("è")));
+    });
+
+    test("the content-type header overrides the default", () {
+      var request = _createMessage(
+          headers: {'content-type': 'text/plain; charset=iso-8859-1'},
+          body: new Stream.fromIterable([[195, 168]]));
+      expect(request.readAsString(), completion(equals("Ã¨")));
+    });
+
+    test("an explicit encoding overrides the content-type header", () {
+      var request = _createMessage(
+          headers: {'content-type': 'text/plain; charset=iso-8859-1'},
+          body: new Stream.fromIterable([[195, 168]]));
+      expect(request.readAsString(LATIN1), completion(equals("Ã¨")));
+    });
+  });
+
+  group("read", () {
+    test("supports a null body", () {
+      var request = _createMessage();
+      expect(request.read().toList(), completion(isEmpty));
+    });
+
+    test("supports a Stream<List<int>> body", () {
+      var controller = new StreamController();
+      var request = _createMessage(body: controller.stream);
+      expect(request.read().toList(),
+          completion(equals([HELLO_BYTES, WORLD_BYTES])));
+
+      controller.add(HELLO_BYTES);
+      return new Future(() {
+        controller
+          ..add(WORLD_BYTES)
+          ..close();
+      });
+    });
+
+    test("throws when calling read()/readAsString() multiple times", () {
+      var request;
+
+      request = _createMessage();
+      expect(request.read().toList(), completion(isEmpty));
+      expect(() => request.read(), throwsStateError);
+
+      request = _createMessage();
+      expect(request.readAsString(), completion(isEmpty));
+      expect(() => request.readAsString(), throwsStateError);
+
+      request = _createMessage();
+      expect(request.readAsString(), completion(isEmpty));
+      expect(() => request.read(), throwsStateError);
+
+      request = _createMessage();
+      expect(request.read().toList(), completion(isEmpty));
+      expect(() => request.readAsString(), throwsStateError);
+    });
+  });
+
+  group("contentLength", () {
+    test("is null without a content-length header", () {
+      var request = _createMessage();
+      expect(request.contentLength, isNull);
+    });
+
+    test("comes from the content-length header", () {
+      var request = _createMessage(headers: {'content-length': '42'});
+      expect(request.contentLength, 42);
+    });
+  });
+
+  group("mimeType", () {
+    test("is null without a content-type header", () {
+      expect(_createMessage().mimeType, isNull);
+    });
+
+    test("comes from the content-type header", () {
+      expect(_createMessage(headers: {'content-type': 'text/plain'}).mimeType,
+          equals('text/plain'));
+    });
+
+    test("doesn't include parameters", () {
+      expect(_createMessage(
+          headers: {
+        'content-type': 'text/plain; foo=bar; bar=baz'
+      }).mimeType, equals('text/plain'));
+    });
+  });
+
+  group("encoding", () {
+    test("is null without a content-type header", () {
+      expect(_createMessage().encoding, isNull);
+    });
+
+    test("is null without a charset parameter", () {
+      expect(_createMessage(headers: {'content-type': 'text/plain'}).encoding,
+          isNull);
+    });
+
+    test("is null with an unrecognized charset parameter", () {
+      expect(_createMessage(
+              headers: {'content-type': 'text/plain; charset=fblthp'}).encoding,
+          isNull);
+    });
+
+    test("comes from the content-type charset parameter", () {
+      expect(_createMessage(
+          headers: {
+        'content-type': 'text/plain; charset=iso-8859-1'
+      }).encoding, equals(LATIN1));
+    });
+
+    test("defaults to encoding a String as UTF-8", () {
+      expect(_createMessage(body: "è").read().toList(),
+          completion(equals([[195, 168]])));
+    });
+
+    test("uses the explicit encoding if available", () {
+      expect(_createMessage(body: "è", encoding: LATIN1).read().toList(),
+          completion(equals([[232]])));
+    });
+
+    test("adds an explicit encoding to the content-type", () {
+      var request = _createMessage(
+          body: "è", encoding: LATIN1, headers: {'content-type': 'text/plain'});
+      expect(request.headers,
+          containsPair('content-type', 'text/plain; charset=iso-8859-1'));
+    });
+
+    test("sets an absent content-type to application/octet-stream in order to "
+        "set the charset", () {
+      var request = _createMessage(body: "è", encoding: LATIN1);
+      expect(request.headers, containsPair(
+          'content-type', 'application/octet-stream; charset=iso-8859-1'));
+    });
+
+    test("overwrites an existing charset if given an explicit encoding", () {
+      var request = _createMessage(
+          body: "è",
+          encoding: LATIN1,
+          headers: {'content-type': 'text/plain; charset=whatever'});
+      expect(request.headers,
+          containsPair('content-type', 'text/plain; charset=iso-8859-1'));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/shelf/test/pipeline_test.dart b/mojo/public/dart/third_party/shelf/test/pipeline_test.dart
new file mode 100644
index 0000000..314ba20
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/test/pipeline_test.dart
@@ -0,0 +1,90 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.pipeline_test;
+
+import 'package:shelf/shelf.dart';
+import 'package:test/test.dart';
+
+import 'test_util.dart';
+
+void main() {
+  test('compose middleware with Pipeline', () {
+    int accessLocation = 0;
+
+    var middlewareA = createMiddleware(requestHandler: (request) {
+      expect(accessLocation, 0);
+      accessLocation = 1;
+      return null;
+    }, responseHandler: (response) {
+      expect(accessLocation, 4);
+      accessLocation = 5;
+      return response;
+    });
+
+    var middlewareB = createMiddleware(requestHandler: (request) {
+      expect(accessLocation, 1);
+      accessLocation = 2;
+      return null;
+    }, responseHandler: (response) {
+      expect(accessLocation, 3);
+      accessLocation = 4;
+      return response;
+    });
+
+    var handler = const Pipeline()
+        .addMiddleware(middlewareA)
+        .addMiddleware(middlewareB)
+        .addHandler((request) {
+      expect(accessLocation, 2);
+      accessLocation = 3;
+      return syncHandler(request);
+    });
+
+    return makeSimpleRequest(handler).then((response) {
+      expect(response, isNotNull);
+      expect(accessLocation, 5);
+    });
+  });
+
+  test('Pipeline can be used as middleware', () {
+    int accessLocation = 0;
+
+    var middlewareA = createMiddleware(requestHandler: (request) {
+      expect(accessLocation, 0);
+      accessLocation = 1;
+      return null;
+    }, responseHandler: (response) {
+      expect(accessLocation, 4);
+      accessLocation = 5;
+      return response;
+    });
+
+    var middlewareB = createMiddleware(requestHandler: (request) {
+      expect(accessLocation, 1);
+      accessLocation = 2;
+      return null;
+    }, responseHandler: (response) {
+      expect(accessLocation, 3);
+      accessLocation = 4;
+      return response;
+    });
+
+    var innerPipeline =
+        const Pipeline().addMiddleware(middlewareA).addMiddleware(middlewareB);
+
+    var handler = const Pipeline()
+        .addMiddleware(innerPipeline.middleware)
+        .addHandler((request) {
+      expect(accessLocation, 2);
+      accessLocation = 3;
+      return syncHandler(request);
+    });
+
+    return makeSimpleRequest(handler).then((response) {
+      expect(response, isNotNull);
+      expect(accessLocation, 5);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/shelf/test/request_test.dart b/mojo/public/dart/third_party/shelf/test/request_test.dart
new file mode 100644
index 0000000..d7d2031
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/test/request_test.dart
@@ -0,0 +1,308 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.request_test;
+
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:shelf/shelf.dart';
+import 'package:test/test.dart';
+
+import 'test_util.dart';
+
+Request _request({Map<String, String> headers, body, Encoding encoding}) {
+  return new Request("GET", LOCALHOST_URI,
+      headers: headers, body: body, encoding: encoding);
+}
+
+void main() {
+  group('constructor', () {
+    test('protocolVersion defaults to "1.1"', () {
+      var request = new Request('GET', LOCALHOST_URI);
+      expect(request.protocolVersion, '1.1');
+    });
+
+    test('provide non-default protocolVersion', () {
+      var request = new Request('GET', LOCALHOST_URI, protocolVersion: '1.0');
+      expect(request.protocolVersion, '1.0');
+    });
+
+    group("url", () {
+      test("defaults to the requestedUri's relativized path and query", () {
+        var request =
+            new Request('GET', Uri.parse("http://localhost/foo/bar?q=1"));
+        expect(request.url, equals(Uri.parse("foo/bar?q=1")));
+      });
+
+      test("is inferred from handlerPath if possible", () {
+        var request = new Request(
+            'GET', Uri.parse("http://localhost/foo/bar?q=1"),
+            handlerPath: '/foo/');
+        expect(request.url, equals(Uri.parse("bar?q=1")));
+      });
+
+      test("uses the given value if passed", () {
+        var request = new Request(
+            'GET', Uri.parse("http://localhost/foo/bar?q=1"),
+            url: Uri.parse("bar?q=1"));
+        expect(request.url, equals(Uri.parse("bar?q=1")));
+      });
+
+      test("may be empty", () {
+        var request = new Request(
+            'GET', Uri.parse("http://localhost/foo/bar"),
+            url: Uri.parse(""));
+        expect(request.url, equals(Uri.parse("")));
+      });
+    });
+
+    group("handlerPath", () {
+      test("defaults to '/'", () {
+        var request = new Request('GET', Uri.parse("http://localhost/foo/bar"));
+        expect(request.handlerPath, equals('/'));
+      });
+
+      test("is inferred from url if possible", () {
+        var request = new Request(
+            'GET', Uri.parse("http://localhost/foo/bar?q=1"),
+            url: Uri.parse("bar?q=1"));
+        expect(request.handlerPath, equals("/foo/"));
+      });
+
+      test("uses the given value if passed", () {
+        var request = new Request(
+            'GET', Uri.parse("http://localhost/foo/bar?q=1"),
+            handlerPath: '/foo/');
+        expect(request.handlerPath, equals("/foo/"));
+      });
+
+      test("adds a trailing slash to the given value if necessary", () {
+        var request = new Request(
+            'GET', Uri.parse("http://localhost/foo/bar?q=1"),
+            handlerPath: '/foo');
+        expect(request.handlerPath, equals("/foo/"));
+        expect(request.url, equals(Uri.parse("bar?q=1")));
+      });
+
+      test("may be a single slash", () {
+        var request = new Request(
+            'GET', Uri.parse("http://localhost/foo/bar?q=1"),
+            handlerPath: '/');
+        expect(request.handlerPath, equals("/"));
+        expect(request.url, equals(Uri.parse("foo/bar?q=1")));
+      });
+    });
+
+    group("errors", () {
+      group('requestedUri', () {
+        test('must be absolute', () {
+          expect(() => new Request('GET', Uri.parse('/path')),
+              throwsArgumentError);
+        });
+
+        test('may not have a fragment', () {
+          expect(() {
+            new Request('GET', Uri.parse('http://localhost/#fragment'));
+          }, throwsArgumentError);
+        });
+      });
+
+      group('url', () {
+        test('must be relative', () {
+          expect(() {
+            new Request('GET', Uri.parse('http://localhost/test'),
+                url: Uri.parse('http://localhost/test'));
+          }, throwsArgumentError);
+        });
+
+        test('may not be root-relative', () {
+          expect(() {
+            new Request('GET', Uri.parse('http://localhost/test'),
+                url: Uri.parse('/test'));
+          }, throwsArgumentError);
+        });
+
+        test('may not have a fragment', () {
+          expect(() {
+            new Request('GET', Uri.parse('http://localhost/test'),
+                url: Uri.parse('test#fragment'));
+          }, throwsArgumentError);
+        });
+
+        test('must be a suffix of requestedUri', () {
+          expect(() {
+            new Request('GET', Uri.parse('http://localhost/dir/test'),
+                url: Uri.parse('dir'));
+          }, throwsArgumentError);
+        });
+
+        test('must have the same query parameters as requestedUri', () {
+          expect(() {
+            new Request('GET', Uri.parse('http://localhost/test?q=1&r=2'),
+                url: Uri.parse('test?q=2&r=1'));
+          }, throwsArgumentError);
+
+          // Order matters for query parameters.
+          expect(() {
+            new Request('GET', Uri.parse('http://localhost/test?q=1&r=2'),
+                url: Uri.parse('test?r=2&q=1'));
+          }, throwsArgumentError);
+        });
+      });
+
+      group('handlerPath', () {
+        test('must be a prefix of requestedUri', () {
+          expect(() {
+            new Request('GET', Uri.parse('http://localhost/dir/test'),
+                handlerPath: '/test');
+          }, throwsArgumentError);
+        });
+
+        test('must start with "/"', () {
+          expect(() {
+            new Request('GET', Uri.parse('http://localhost/test'),
+                handlerPath: 'test');
+          }, throwsArgumentError);
+        });
+
+        test('must be the requestedUri path if url is empty', () {
+          expect(() {
+            new Request('GET', Uri.parse('http://localhost/test'),
+                handlerPath: '/',
+                url: Uri.parse(''));
+          }, throwsArgumentError);
+        });
+      });
+
+      group('handlerPath + url must', () {
+        test('be requestedUrl path', () {
+          expect(() {
+            new Request('GET', Uri.parse('http://localhost/foo/bar/baz'),
+                handlerPath: '/foo/', url: Uri.parse('baz'));
+          }, throwsArgumentError);
+        });
+
+        test('be on a path boundary', () {
+          expect(() {
+            new Request('GET', Uri.parse('http://localhost/foo/bar/baz'),
+                handlerPath: '/foo/ba', url: Uri.parse('r/baz'));
+          }, throwsArgumentError);
+        });
+      });
+    });
+  });
+
+  group("ifModifiedSince", () {
+    test("is null without an If-Modified-Since header", () {
+      var request = _request();
+      expect(request.ifModifiedSince, isNull);
+    });
+
+    test("comes from the Last-Modified header", () {
+      var request = _request(
+          headers: {'if-modified-since': 'Sun, 06 Nov 1994 08:49:37 GMT'});
+      expect(request.ifModifiedSince,
+          equals(DateTime.parse("1994-11-06 08:49:37z")));
+    });
+  });
+
+  group('change', () {
+    test('with no arguments returns instance with equal values', () {
+      var controller = new StreamController();
+
+      var uri = Uri.parse('https://test.example.com/static/file.html');
+
+      var request = new Request('GET', uri,
+          protocolVersion: '2.0',
+          headers: {'header1': 'header value 1'},
+          url: Uri.parse('file.html'),
+          handlerPath: '/static/',
+          body: controller.stream,
+          context: {'context1': 'context value 1'});
+
+      var copy = request.change();
+
+      expect(copy.method, request.method);
+      expect(copy.requestedUri, request.requestedUri);
+      expect(copy.protocolVersion, request.protocolVersion);
+      expect(copy.headers, same(request.headers));
+      expect(copy.url, request.url);
+      expect(copy.handlerPath, request.handlerPath);
+      expect(copy.context, same(request.context));
+      expect(copy.readAsString(), completion('hello, world'));
+
+      controller.add(HELLO_BYTES);
+      return new Future(() {
+        controller
+          ..add(WORLD_BYTES)
+          ..close();
+      });
+    });
+
+    group('with path', () {
+      test('updates handlerPath and url', () {
+        var uri = Uri.parse('https://test.example.com/static/dir/file.html');
+        var request = new Request('GET', uri,
+            handlerPath: '/static/', url: Uri.parse('dir/file.html'));
+        var copy = request.change(path: 'dir');
+
+        expect(copy.handlerPath, '/static/dir/');
+        expect(copy.url, Uri.parse('file.html'));
+      });
+
+      test('allows a trailing slash', () {
+        var uri = Uri.parse('https://test.example.com/static/dir/file.html');
+        var request = new Request('GET', uri,
+            handlerPath: '/static/', url: Uri.parse('dir/file.html'));
+        var copy = request.change(path: 'dir/');
+
+        expect(copy.handlerPath, '/static/dir/');
+        expect(copy.url, Uri.parse('file.html'));
+      });
+
+      test('throws if path does not match existing uri', () {
+        var uri = Uri.parse('https://test.example.com/static/dir/file.html');
+        var request = new Request('GET', uri,
+            handlerPath: '/static/', url: Uri.parse('dir/file.html'));
+
+        expect(() => request.change(path: 'wrong'), throwsArgumentError);
+      });
+
+      test("throws if path isn't a path boundary", () {
+        var uri = Uri.parse('https://test.example.com/static/dir/file.html');
+        var request = new Request('GET', uri,
+            handlerPath: '/static/', url: Uri.parse('dir/file.html'));
+
+        expect(() => request.change(path: 'di'), throwsArgumentError);
+      });
+    });
+
+    test("allows the original request to be read", () {
+      var request = _request();
+      var changed = request.change();
+
+      expect(request.read().toList(), completion(isEmpty));
+      expect(changed.read, throwsStateError);
+    });
+
+    test("allows the changed request to be read", () {
+      var request = _request();
+      var changed = request.change();
+
+      expect(changed.read().toList(), completion(isEmpty));
+      expect(request.read, throwsStateError);
+    });
+
+    test("allows another changed request to be read", () {
+      var request = _request();
+      var changed1 = request.change();
+      var changed2 = request.change();
+
+      expect(changed2.read().toList(), completion(isEmpty));
+      expect(changed1.read, throwsStateError);
+      expect(request.read, throwsStateError);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/shelf/test/response_test.dart b/mojo/public/dart/third_party/shelf/test/response_test.dart
new file mode 100644
index 0000000..57c5c1c
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/test/response_test.dart
@@ -0,0 +1,143 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.response_test;
+
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:shelf/shelf.dart' hide Request;
+import 'package:test/test.dart';
+
+import 'test_util.dart';
+
+void main() {
+  group("supports a String body", () {
+    test("readAsString", () {
+      var response = new Response.ok("hello, world");
+      expect(response.readAsString(), completion(equals("hello, world")));
+    });
+
+    test("read", () {
+      var helloWorldBytes = new List.from(HELLO_BYTES)..addAll(WORLD_BYTES);
+
+      var response = new Response.ok("hello, world");
+      expect(response.read().toList(), completion(equals([helloWorldBytes])));
+    });
+  });
+
+  group("new Response.internalServerError without a body", () {
+    test('sets the body to "Internal Server Error"', () {
+      var response = new Response.internalServerError();
+      expect(
+          response.readAsString(), completion(equals("Internal Server Error")));
+    });
+
+    test('sets the content-type header to text/plain', () {
+      var response = new Response.internalServerError();
+      expect(response.headers, containsPair('content-type', 'text/plain'));
+    });
+
+    test('preserves content-type parameters', () {
+      var response = new Response.internalServerError(
+          headers: {
+        'content-type': 'application/octet-stream; param=whatever'
+      });
+      expect(response.headers,
+          containsPair('content-type', 'text/plain; param=whatever'));
+    });
+  });
+
+  group("Response redirect", () {
+    test("sets the location header for a String", () {
+      var response = new Response.found('/foo');
+      expect(response.headers, containsPair('location', '/foo'));
+    });
+
+    test("sets the location header for a Uri", () {
+      var response = new Response.found(new Uri(path: '/foo'));
+      expect(response.headers, containsPair('location', '/foo'));
+    });
+  });
+
+  group("expires", () {
+    test("is null without an Expires header", () {
+      expect(new Response.ok("okay!").expires, isNull);
+    });
+
+    test("comes from the Expires header", () {
+      expect(new Response.ok("okay!",
+          headers: {
+        'expires': 'Sun, 06 Nov 1994 08:49:37 GMT'
+      }).expires, equals(DateTime.parse("1994-11-06 08:49:37z")));
+    });
+  });
+
+  group("lastModified", () {
+    test("is null without a Last-Modified header", () {
+      expect(new Response.ok("okay!").lastModified, isNull);
+    });
+
+    test("comes from the Last-Modified header", () {
+      expect(new Response.ok("okay!",
+          headers: {
+        'last-modified': 'Sun, 06 Nov 1994 08:49:37 GMT'
+      }).lastModified, equals(DateTime.parse("1994-11-06 08:49:37z")));
+    });
+  });
+
+  group('change', () {
+    test('with no arguments returns instance with equal values', () {
+      var controller = new StreamController();
+
+      var request = new Response(345,
+          body: 'hèllo, world',
+          encoding: LATIN1,
+          headers: {'header1': 'header value 1'},
+          context: {'context1': 'context value 1'});
+
+      var copy = request.change();
+
+      expect(copy.statusCode, request.statusCode);
+      expect(copy.readAsString(), completion('hèllo, world'));
+      expect(copy.headers, same(request.headers));
+      expect(copy.encoding, request.encoding);
+      expect(copy.context, same(request.context));
+
+      controller.add(HELLO_BYTES);
+      return new Future(() {
+        controller
+          ..add(WORLD_BYTES)
+          ..close();
+      });
+    });
+
+
+    test("allows the original response to be read", () {
+      var response = new Response.ok(null);
+      var changed = response.change();
+
+      expect(response.read().toList(), completion(isEmpty));
+      expect(changed.read, throwsStateError);
+    });
+
+    test("allows the changed response to be read", () {
+      var response = new Response.ok(null);
+      var changed = response.change();
+
+      expect(changed.read().toList(), completion(isEmpty));
+      expect(response.read, throwsStateError);
+    });
+
+    test("allows another changed response to be read", () {
+      var response = new Response.ok(null);
+      var changed1 = response.change();
+      var changed2 = response.change();
+
+      expect(changed2.read().toList(), completion(isEmpty));
+      expect(changed1.read, throwsStateError);
+      expect(response.read, throwsStateError);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/shelf/test/shelf_io_test.dart b/mojo/public/dart/third_party/shelf/test/shelf_io_test.dart
new file mode 100644
index 0000000..ea8002e
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/test/shelf_io_test.dart
@@ -0,0 +1,400 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn('vm')
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:http/http.dart' as http;
+import 'package:http_parser/http_parser.dart' as parser;
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:shelf/shelf.dart';
+import 'package:shelf/shelf_io.dart' as shelf_io;
+
+import 'test_util.dart';
+
+void main() {
+  test('sync handler returns a value to the client', () {
+    _scheduleServer(syncHandler);
+
+    return _scheduleGet().then((response) {
+      expect(response.statusCode, HttpStatus.OK);
+      expect(response.body, 'Hello from /');
+    });
+  });
+
+  test('async handler returns a value to the client', () {
+    _scheduleServer(asyncHandler);
+
+    return _scheduleGet().then((response) {
+      expect(response.statusCode, HttpStatus.OK);
+      expect(response.body, 'Hello from /');
+    });
+  });
+
+  test('sync null response leads to a 500', () {
+    _scheduleServer((request) => null);
+
+    return _scheduleGet().then((response) {
+      expect(response.statusCode, HttpStatus.INTERNAL_SERVER_ERROR);
+      expect(response.body, 'Internal Server Error');
+    });
+  });
+
+  test('async null response leads to a 500', () {
+    _scheduleServer((request) => new Future.value(null));
+
+    return _scheduleGet().then((response) {
+      expect(response.statusCode, HttpStatus.INTERNAL_SERVER_ERROR);
+      expect(response.body, 'Internal Server Error');
+    });
+  });
+
+  test('thrown error leads to a 500', () {
+    _scheduleServer((request) {
+      throw new UnsupportedError('test');
+    });
+
+    return _scheduleGet().then((response) {
+      expect(response.statusCode, HttpStatus.INTERNAL_SERVER_ERROR);
+      expect(response.body, 'Internal Server Error');
+    });
+  });
+
+  test('async error leads to a 500', () {
+    _scheduleServer((request) {
+      return new Future.error('test');
+    });
+
+    return _scheduleGet().then((response) {
+      expect(response.statusCode, HttpStatus.INTERNAL_SERVER_ERROR);
+      expect(response.body, 'Internal Server Error');
+    });
+  });
+
+  test('Request is populated correctly', () {
+    var path = '/foo/bar?qs=value';
+
+    _scheduleServer((request) {
+      expect(request.contentLength, 0);
+      expect(request.method, 'GET');
+
+      var expectedUrl = 'http://localhost:$_serverPort$path';
+      expect(request.requestedUri, Uri.parse(expectedUrl));
+
+      expect(request.url.path, 'foo/bar');
+      expect(request.url.pathSegments, ['foo', 'bar']);
+      expect(request.protocolVersion, '1.1');
+      expect(request.url.query, 'qs=value');
+      expect(request.handlerPath, '/');
+
+      return syncHandler(request);
+    });
+
+    return schedule(() => http.get('http://localhost:$_serverPort$path')).then(
+        (response) {
+      expect(response.statusCode, HttpStatus.OK);
+      expect(response.body, 'Hello from /foo/bar');
+    });
+  });
+
+  test('custom response headers are received by the client', () {
+    _scheduleServer((request) {
+      return new Response.ok('Hello from /',
+          headers: {'test-header': 'test-value', 'test-list': 'a, b, c'});
+    });
+
+    return _scheduleGet().then((response) {
+      expect(response.statusCode, HttpStatus.OK);
+      expect(response.headers['test-header'], 'test-value');
+      expect(response.body, 'Hello from /');
+    });
+  });
+
+  test('custom status code is received by the client', () {
+    _scheduleServer((request) {
+      return new Response(299, body: 'Hello from /');
+    });
+
+    return _scheduleGet().then((response) {
+      expect(response.statusCode, 299);
+      expect(response.body, 'Hello from /');
+    });
+  });
+
+  test('custom request headers are received by the handler', () {
+    _scheduleServer((request) {
+      expect(request.headers, containsPair('custom-header', 'client value'));
+
+      // dart:io HttpServer splits multi-value headers into an array
+      // validate that they are combined correctly
+      expect(request.headers, containsPair('multi-header', 'foo,bar,baz'));
+      return syncHandler(request);
+    });
+
+    var headers = {
+      'custom-header': 'client value',
+      'multi-header': 'foo,bar,baz'
+    };
+
+    return _scheduleGet(headers: headers).then((response) {
+      expect(response.statusCode, HttpStatus.OK);
+      expect(response.body, 'Hello from /');
+    });
+  });
+
+  test('post with empty content', () {
+    _scheduleServer((request) {
+      expect(request.mimeType, isNull);
+      expect(request.encoding, isNull);
+      expect(request.method, 'POST');
+      expect(request.contentLength, 0);
+
+      return request.readAsString().then((body) {
+        expect(body, '');
+        return syncHandler(request);
+      });
+    });
+
+    return _schedulePost().then((response) {
+      expect(response.statusCode, HttpStatus.OK);
+      expect(response.stream.bytesToString(), completion('Hello from /'));
+    });
+  });
+
+  test('post with request content', () {
+    _scheduleServer((request) {
+      expect(request.mimeType, 'text/plain');
+      expect(request.encoding, UTF8);
+      expect(request.method, 'POST');
+      expect(request.contentLength, 9);
+
+      return request.readAsString().then((body) {
+        expect(body, 'test body');
+        return syncHandler(request);
+      });
+    });
+
+    return _schedulePost(body: 'test body').then((response) {
+      expect(response.statusCode, HttpStatus.OK);
+      expect(response.stream.bytesToString(), completion('Hello from /'));
+    });
+  });
+
+  test('supports request hijacking', () {
+    _scheduleServer((request) {
+      expect(request.method, 'POST');
+
+      request.hijack(expectAsync((stream, sink) {
+        expect(stream.first, completion(equals("Hello".codeUnits)));
+
+        sink.add(("HTTP/1.1 404 Not Found\r\n"
+            "Date: Mon, 23 May 2005 22:38:34 GMT\r\n"
+            "Content-Length: 13\r\n"
+            "\r\n"
+            "Hello, world!").codeUnits);
+        sink.close();
+      }));
+    });
+
+    return _schedulePost(body: "Hello").then((response) {
+      expect(response.statusCode, HttpStatus.NOT_FOUND);
+      expect(response.headers["date"], "Mon, 23 May 2005 22:38:34 GMT");
+      expect(
+          response.stream.bytesToString(), completion(equals("Hello, world!")));
+    });
+  });
+
+  test('reports an error if a HijackException is thrown without hijacking', () {
+    _scheduleServer((request) => throw const HijackException());
+
+    return _scheduleGet().then((response) {
+      expect(response.statusCode, HttpStatus.INTERNAL_SERVER_ERROR);
+    });
+  });
+
+  test('passes asynchronous exceptions to the parent error zone', () {
+    return runZoned(() {
+      return shelf_io.serve((request) {
+        new Future(() => throw 'oh no');
+        return syncHandler(request);
+      }, 'localhost', 0).then((server) {
+        return http.get('http://localhost:${server.port}').then((response) {
+          expect(response.statusCode, HttpStatus.OK);
+          expect(response.body, 'Hello from /');
+          server.close();
+        });
+      });
+    }, onError: expectAsync((error) {
+      expect(error, equals('oh no'));
+    }));
+  });
+
+  test("doesn't pass asynchronous exceptions to the root error zone", () async {
+    var response = await Zone.ROOT.run(() async {
+      var server = await shelf_io.serve((request) {
+        new Future(() => throw 'oh no');
+        return syncHandler(request);
+      }, 'localhost', 0);
+
+      try {
+        return await http.get('http://localhost:${server.port}');
+      } finally {
+        server.close();
+      }
+    });
+
+    expect(response.statusCode, HttpStatus.OK);
+    expect(response.body, 'Hello from /');
+  });
+
+  test('a bad HTTP request results in a 500 response', () {
+    var socket;
+
+    _scheduleServer(syncHandler);
+
+    schedule(() {
+      return Socket.connect('localhost', _serverPort).then((value) {
+        socket = value;
+
+        currentSchedule.onComplete.schedule(() {
+          return socket.close();
+        }, 'close the socket');
+      });
+    });
+
+    schedule(() {
+      socket.write('GET / HTTP/1.1\r\n');
+      socket.write('Host: ^^super bad !@#host\r\n');
+      socket.write('\r\n');
+      return socket.close();
+    });
+
+    schedule(() {
+      return UTF8.decodeStream(socket).then((value) {
+        expect(value, contains('500 Internal Server Error'));
+      });
+    });
+  });
+
+  group('date header', () {
+    test('is sent by default', () {
+      _scheduleServer(syncHandler);
+
+      // Update beforeRequest to be one second earlier. HTTP dates only have
+      // second-level granularity and the request will likely take less than a
+      // second.
+      var beforeRequest = new DateTime.now().subtract(new Duration(seconds: 1));
+
+      return _scheduleGet().then((response) {
+        expect(response.headers, contains('date'));
+        var responseDate = parser.parseHttpDate(response.headers['date']);
+
+        expect(responseDate.isAfter(beforeRequest), isTrue);
+        expect(responseDate.isBefore(new DateTime.now()), isTrue);
+      });
+    });
+
+    test('defers to header in response', () {
+      var date = new DateTime.utc(1981, 6, 5);
+      _scheduleServer((request) {
+        return new Response.ok('test',
+            headers: {HttpHeaders.DATE: parser.formatHttpDate(date)});
+      });
+
+      return _scheduleGet().then((response) {
+        expect(response.headers, contains('date'));
+        var responseDate = parser.parseHttpDate(response.headers['date']);
+        expect(responseDate, date);
+      });
+    });
+  });
+
+  group('server header', () {
+    test('defaults to "dart:io with Shelf"', () {
+      _scheduleServer(syncHandler);
+
+      return _scheduleGet().then((response) {
+        expect(response.headers,
+            containsPair(HttpHeaders.SERVER, 'dart:io with Shelf'));
+      });
+    });
+
+    test('defers to header in response', () {
+      _scheduleServer((request) {
+        return new Response.ok('test',
+            headers: {HttpHeaders.SERVER: 'myServer'});
+      });
+
+      return _scheduleGet().then((response) {
+        expect(response.headers, containsPair(HttpHeaders.SERVER, 'myServer'));
+      });
+    });
+  });
+
+  test('respects the "shelf.io.buffer_output" context parameter', () {
+    var controller = new StreamController();
+    _scheduleServer((request) {
+      controller.add("Hello, ");
+
+      return new Response.ok(UTF8.encoder.bind(controller.stream),
+          context: {"shelf.io.buffer_output": false});
+    });
+
+    schedule(() {
+      var request = new http.Request(
+          "GET", Uri.parse('http://localhost:$_serverPort/'));
+
+      return request.send().then((response) {
+        var stream = new ScheduledStream(UTF8.decoder.bind(response.stream));
+
+        return stream.next().then((data) {
+          expect(data, equals("Hello, "));
+          controller.add("world!");
+          return stream.next();
+        }).then((data) {
+          expect(data, equals("world!"));
+          controller.close();
+          expect(stream.hasNext, completion(isFalse));
+        });
+      });
+    });
+  });
+}
+
+int _serverPort;
+
+Future _scheduleServer(Handler handler) {
+  return schedule(() => shelf_io.serve(handler, 'localhost', 0).then((server) {
+    currentSchedule.onComplete.schedule(() {
+      _serverPort = null;
+      return server.close(force: true);
+    });
+
+    _serverPort = server.port;
+  }));
+}
+
+Future<http.Response> _scheduleGet({Map<String, String> headers}) {
+  if (headers == null) headers = {};
+
+  return schedule(
+      () => http.get('http://localhost:$_serverPort/', headers: headers));
+}
+
+Future<http.StreamedResponse> _schedulePost(
+    {Map<String, String> headers, String body}) {
+  return schedule(() {
+    var request =
+        new http.Request('POST', Uri.parse('http://localhost:$_serverPort/'));
+
+    if (headers != null) request.headers.addAll(headers);
+    if (body != null) request.body = body;
+
+    return request.send();
+  });
+}
diff --git a/mojo/public/dart/third_party/shelf/test/test_all.dart b/mojo/public/dart/third_party/shelf/test/test_all.dart
new file mode 100644
index 0000000..64521d3
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/test/test_all.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+
+import 'cascade_test.dart' as cascade;
+import 'create_middleware_test.dart' as create_middleware;
+import 'hijack_test.dart' as hijack;
+import 'log_middleware_test.dart' as log_middleware;
+import 'message_change_test.dart' as message_change;
+import 'message_test.dart' as message;
+import 'pipeline_test.dart' as pipeline;
+import 'request_test.dart' as request;
+import 'response_test.dart' as response;
+import 'shelf_io_test.dart' as shelf_io;
+
+void main() {
+  group('cascade', cascade.main);
+  group('create_middleware', create_middleware.main);
+  group('hijack', hijack.main);
+  group('log_middleware', log_middleware.main);
+  group('message_change', message_change.main);
+  group('message', message.main);
+  group('pipeline', pipeline.main);
+  group('request', request.main);
+  group('response', response.main);
+  group('shelf_io', shelf_io.main);
+}
diff --git a/mojo/public/dart/third_party/shelf/test/test_util.dart b/mojo/public/dart/third_party/shelf/test/test_util.dart
new file mode 100644
index 0000000..3df1e56
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/test/test_util.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.test_util;
+
+import 'dart:async';
+
+import 'package:shelf/shelf.dart';
+
+// "hello,"
+const HELLO_BYTES = const [104, 101, 108, 108, 111, 44];
+
+// " world"
+const WORLD_BYTES = const [32, 119, 111, 114, 108, 100];
+
+/// A simple, synchronous handler for [Request].
+///
+/// By default, replies with a status code 200, empty headers, and
+/// `Hello from ${request.url.path}`.
+Response syncHandler(Request request,
+    {int statusCode, Map<String, String> headers}) {
+  if (statusCode == null) statusCode = 200;
+  return new Response(statusCode,
+      headers: headers, body: 'Hello from ${request.requestedUri.path}');
+}
+
+/// Calls [syncHandler] and wraps the response in a [Future].
+Future<Response> asyncHandler(Request request) =>
+    new Future(() => syncHandler(request));
+
+/// Makes a simple GET request to [handler] and returns the result.
+Future<Response> makeSimpleRequest(Handler handler) =>
+    new Future.sync(() => handler(_request));
+
+final _request = new Request('GET', LOCALHOST_URI);
+
+final LOCALHOST_URI = Uri.parse('http://localhost/');
diff --git a/mojo/public/dart/third_party/shelf/tool/travis.sh b/mojo/public/dart/third_party/shelf/tool/travis.sh
new file mode 100755
index 0000000..6b49862
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf/tool/travis.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+# Fast fail the script on failures.
+set -e
+
+pub run test
+
+# Install dart_coveralls; gather and send coverage data.
+if [ "$COVERALLS_TOKEN" ] && [ "$TRAVIS_DART_VERSION" = "stable" ]; then
+  pub global activate dart_coveralls
+
+  pub global run dart_coveralls report \
+    --exclude-test-files \
+    test/test_all.dart
+fi
diff --git a/mojo/public/dart/third_party/shelf_static/.gitignore b/mojo/public/dart/third_party/shelf_static/.gitignore
new file mode 100644
index 0000000..9bd4f34
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/.gitignore
@@ -0,0 +1,4 @@
+packages
+pubspec.lock
+/.pub
+.packages
diff --git a/mojo/public/dart/third_party/shelf_static/.travis.yml b/mojo/public/dart/third_party/shelf_static/.travis.yml
new file mode 100644
index 0000000..e110e4e
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/.travis.yml
@@ -0,0 +1,6 @@
+language: dart
+sudo: false
+dart:
+  - stable
+  - dev
+script: ./tool/travis.sh
diff --git a/mojo/public/dart/third_party/shelf_static/CHANGELOG.md b/mojo/public/dart/third_party/shelf_static/CHANGELOG.md
new file mode 100644
index 0000000..099d5c7
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/CHANGELOG.md
@@ -0,0 +1,61 @@
+## 0.2.3+1
+
+* Support `http_parser` 1.0.0.
+
+## 0.2.3
+
+* Added `listDirectories` argument to `createStaticHandler`. 
+
+## 0.2.2
+
+* Bumped up minimum SDK to 1.7.0.
+
+* Added support for `shelf` 0.6.0.
+
+## 0.2.1
+
+* Removed `Uri` format checks now that the core libraries is more strict. 
+
+## 0.2.0
+
+* Removed deprecated `getHandler`.
+
+* Send correct mime type for default document.
+
+## 0.1.4+6
+
+* Updated development dependencies.
+
+## 0.1.4+5
+
+* Handle differences in resolution between `DateTime` and HTTP date format.
+
+## 0.1.4+4
+
+* Using latest `shelf`. Cleaned up test code by using new features.
+
+## 0.1.4
+
+* Added named (optional) `defaultDocument` argument to `createStaticHandler`.
+
+## 0.1.3
+
+* `createStaticHandler` added `serveFilesOutsidePath` optional parameter.
+
+## 0.1.2
+
+* The preferred top-level method is now `createStaticHandler`. `getHandler` is deprecated.
+* Set `content-type` header if the mime type of the requested file can be determined from the file extension.
+* Respond with `304-Not modified` against `IF-MODIFIED-SINCE` request header.
+* Better error when provided a non-existant `fileSystemPath`.
+* Added `example/example_server.dart`.
+
+## 0.1.1+1
+
+* Removed work around for [issue](https://codereview.chromium.org/278783002/).
+
+## 0.1.1
+
+* Correctly handle requests when not hosted at the root of a site.
+* Send `last-modified` header.
+* Work around [known issue](https://codereview.chromium.org/278783002/) with HTTP date formatting.
diff --git a/mojo/public/dart/third_party/shelf_static/CONTRIBUTING.md b/mojo/public/dart/third_party/shelf_static/CONTRIBUTING.md
new file mode 100644
index 0000000..6f5e0ea
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/CONTRIBUTING.md
@@ -0,0 +1,33 @@
+Want to contribute? Great! First, read this page (including the small print at
+the end).
+
+### Before you contribute
+Before we can use your code, you must sign the
+[Google Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual)
+(CLA), which you can do online. The CLA is necessary mainly because you own the
+copyright to your changes, even after your contribution becomes part of our
+codebase, so we need your permission to use and distribute your code. We also
+need to be sure of various other things—for instance that you'll tell us if you
+know that your code infringes on other people's patents. You don't have to sign
+the CLA until after you've submitted your code for review and a member has
+approved it, but you must do it before we can put your code into our codebase.
+
+Before you start working on a larger contribution, you should get in touch with
+us first through the issue tracker with your idea so that we can help out and
+possibly guide you. Coordinating up front makes it much easier to avoid
+frustration later on.
+
+### Code reviews
+All submissions, including submissions by project members, require review.
+
+### File headers
+All files in the project must start with the following header.
+
+    // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+    // for details. All rights reserved. Use of this source code is governed by a
+    // BSD-style license that can be found in the LICENSE file.
+
+### The small print
+Contributions made by corporations are covered by a different agreement than the
+one above, the
+[Software Grant and Corporate Contributor License Agreement](https://developers.google.com/open-source/cla/corporate).
diff --git a/mojo/public/dart/third_party/shelf_static/LICENSE b/mojo/public/dart/third_party/shelf_static/LICENSE
new file mode 100644
index 0000000..de31e1a
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2015, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/shelf_static/README.md b/mojo/public/dart/third_party/shelf_static/README.md
new file mode 100644
index 0000000..ffe0e26
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/README.md
@@ -0,0 +1,17 @@
+`shelf_static` is a `Handler` for the Dart `shelf` package.
+
+[![Build Status](https://travis-ci.org/dart-lang/shelf_static.svg?branch=master)](https://travis-ci.org/dart-lang/shelf_static?branch=master)
+[![Coverage Status](https://coveralls.io/repos/dart-lang/shelf_static/badge.svg?branch=master&service=github)](https://coveralls.io/github/dart-lang/shelf_static?branch=master)
+
+### Example
+```dart
+import 'package:shelf/shelf_io.dart' as io;
+import 'package:shelf_static/shelf_static.dart';
+
+void main() {
+  var handler = createStaticHandler('example/files', 
+      defaultDocument: 'index.html');
+
+  io.serve(handler, 'localhost', 8080);
+}
+```
diff --git a/mojo/public/dart/third_party/shelf_static/codereview.settings b/mojo/public/dart/third_party/shelf_static/codereview.settings
new file mode 100644
index 0000000..74b8d3e
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: https://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/shelf_static/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/shelf_static/example/example_server.dart b/mojo/public/dart/third_party/shelf_static/example/example_server.dart
new file mode 100644
index 0000000..1233eef
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/example/example_server.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf_static.example;
+
+import 'dart:io';
+import 'package:args/args.dart';
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:shelf/shelf_io.dart' as io;
+import 'package:shelf_static/shelf_static.dart';
+
+void main(List<String> args) {
+  var parser = _getParser();
+
+  int port;
+  bool logging;
+  bool listDirectories;
+
+  try {
+    var result = parser.parse(args);
+    port = int.parse(result['port']);
+    logging = result['logging'];
+    listDirectories = result['list-directories'];
+  } on FormatException catch (e) {
+    stderr.writeln(e.message);
+    stderr.writeln(parser.usage);
+    // http://linux.die.net/include/sysexits.h
+    // #define EX_USAGE	64	/* command line usage error */
+    exit(64);
+  }
+
+  if (!FileSystemEntity.isFileSync('example/example_server.dart')) {
+    throw new StateError('Server expects to be started the '
+        'root of the project.');
+  }
+  var pipeline = const shelf.Pipeline();
+
+  if (logging) {
+    pipeline = pipeline.addMiddleware(shelf.logRequests());
+  }
+
+  var defaultDoc = _defaultDoc;
+  if (listDirectories) {
+    defaultDoc = null;
+  }
+
+  var handler = pipeline.addHandler(createStaticHandler('example/files',
+      defaultDocument: defaultDoc, listDirectories: listDirectories));
+
+  io.serve(handler, 'localhost', port).then((server) {
+    print('Serving at http://${server.address.host}:${server.port}');
+  });
+}
+
+ArgParser _getParser() => new ArgParser()
+  ..addFlag('logging', abbr: 'l', defaultsTo: true, negatable: true)
+  ..addOption('port', abbr: 'p', defaultsTo: '8080')
+  ..addFlag('list-directories',
+      abbr: 'f',
+      defaultsTo: false,
+      negatable: false,
+      help: 'List the files in the source directory instead of servering the default document - "$_defaultDoc".');
+
+const _defaultDoc = 'index.html';
diff --git a/mojo/public/dart/third_party/shelf_static/example/files/dart.png b/mojo/public/dart/third_party/shelf_static/example/files/dart.png
new file mode 100644
index 0000000..fd6de2a
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/example/files/dart.png
Binary files differ
diff --git a/mojo/public/dart/third_party/shelf_static/example/files/favicon.ico b/mojo/public/dart/third_party/shelf_static/example/files/favicon.ico
new file mode 100644
index 0000000..e605972
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/example/files/favicon.ico
Binary files differ
diff --git a/mojo/public/dart/third_party/shelf_static/example/files/index.html b/mojo/public/dart/third_party/shelf_static/example/files/index.html
new file mode 100644
index 0000000..7bf28d1
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/example/files/index.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+
+<html>
+  <head>
+  	<meta charset="utf-8">
+    <title>shelf_static</title>
+  </head>
+  <body>
+    <h1>Hello, shelf_static!</h1>
+    <img src='dart.png' alt='Dart logo' width='150' height='151'>
+  </body>
+</html>
diff --git a/mojo/public/dart/third_party/shelf_static/lib/shelf_static.dart b/mojo/public/dart/third_party/shelf_static/lib/shelf_static.dart
new file mode 100644
index 0000000..cc70247
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/lib/shelf_static.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf_static;
+
+export 'src/static_handler.dart';
diff --git a/mojo/public/dart/third_party/shelf_static/lib/src/directory_listing.dart b/mojo/public/dart/third_party/shelf_static/lib/src/directory_listing.dart
new file mode 100644
index 0000000..f1df7e3
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/lib/src/directory_listing.dart
@@ -0,0 +1,98 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf_static.directory_listing;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:path/path.dart' as path;
+import 'package:shelf/shelf.dart';
+
+String _getHeader(String sanitizedHeading) {
+  return '''<!DOCTYPE html>
+<html>
+<head>
+  <title>Directory listing for $sanitizedHeading</title>
+  <style>
+  html, body {
+    margin: 0;
+    padding: 0;
+  }
+  body {
+    font-family: sans-serif;
+  }
+  h1 {
+    background-color: #607D8B;
+    box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.37);
+    color: white;
+    font-size: 56px;
+    font-weight: normal;
+    line-height: 1.5;
+    margin: 0;
+    padding: 115px 30px 56px 30px;
+    white-space: nowrap;
+  }
+  ul {
+    list-style-type: none;
+    margin: 0;
+    padding: 0;
+  }
+  li {
+    margin: 0;
+    padding: 0;
+  }
+  a {
+    color: #212121;
+    text-decoration: none;
+    display: block;
+    font-size: 16px;
+    height: 48px;
+    line-height: 48px;
+    padding-left: 16px;
+    transition: background-color 200ms ease-in-out;
+  }
+  a:hover {
+    background-color: #EEEEEE;
+  }
+  </style>
+</head>
+<body>
+  <h1>$sanitizedHeading</h1>
+  <ul>
+''';
+}
+
+const String _trailer = '''  </ul>
+</body>
+</html>
+''';
+
+Response listDirectory(String fileSystemPath, String dirPath) {
+  StreamController<List<int>> controller = new StreamController<List<int>>();
+  Encoding encoding = new Utf8Codec();
+  HtmlEscape sanitizer = const HtmlEscape();
+
+  void add(String string) {
+    controller.add(encoding.encode(string));
+  }
+
+  String heading = path.relative(dirPath, from: fileSystemPath);
+  if (heading == '.') heading = '/';
+  else heading = '/$heading/';
+
+  add(_getHeader(sanitizer.convert(heading)));
+  new Directory(dirPath).list().listen((FileSystemEntity entity) {
+    String name = path.relative(entity.path, from: dirPath);
+    if (entity is Directory) name += '/';
+    String sanitizedName = sanitizer.convert(name);
+    add('    <li><a href="$sanitizedName">$sanitizedName</a></li>\n');
+  }, onDone: () {
+    add(_trailer);
+    controller.close();
+  });
+  return new Response.ok(controller.stream,
+      encoding: encoding, headers: {HttpHeaders.CONTENT_TYPE: 'text/html'});
+}
diff --git a/mojo/public/dart/third_party/shelf_static/lib/src/static_handler.dart b/mojo/public/dart/third_party/shelf_static/lib/src/static_handler.dart
new file mode 100644
index 0000000..c0afeb4
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/lib/src/static_handler.dart
@@ -0,0 +1,138 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf_static.static_handler;
+
+import 'dart:io';
+
+import 'package:http_parser/http_parser.dart';
+import 'package:mime/mime.dart' as mime;
+import 'package:path/path.dart' as p;
+import 'package:shelf/shelf.dart';
+
+import 'directory_listing.dart';
+import 'util.dart';
+
+// TODO option to exclude hidden files?
+
+/// Creates a Shelf [Handler] that serves files from the provided
+/// [fileSystemPath].
+///
+/// Accessing a path containing symbolic links will succeed only if the resolved
+/// path is within [fileSystemPath]. To allow access to paths outside of
+/// [fileSystemPath], set [serveFilesOutsidePath] to `true`.
+///
+/// When a existing directory is requested and a [defaultDocument] is specified
+/// the directory is checked for a file with that name. If it exists, it is
+/// served.
+///
+/// If no [defaultDocument] is found and [listDirectories] is true, then the
+/// handler produces a listing of the directory.
+Handler createStaticHandler(String fileSystemPath,
+    {bool serveFilesOutsidePath: false, String defaultDocument,
+    bool listDirectories: false}) {
+  var rootDir = new Directory(fileSystemPath);
+  if (!rootDir.existsSync()) {
+    throw new ArgumentError('A directory corresponding to fileSystemPath '
+        '"$fileSystemPath" could not be found');
+  }
+
+  fileSystemPath = rootDir.resolveSymbolicLinksSync();
+
+  if (defaultDocument != null) {
+    if (defaultDocument != p.basename(defaultDocument)) {
+      throw new ArgumentError('defaultDocument must be a file name.');
+    }
+  }
+
+  return (Request request) {
+    var segs = [fileSystemPath]..addAll(request.url.pathSegments);
+
+    var fsPath = p.joinAll(segs);
+
+    var entityType = FileSystemEntity.typeSync(fsPath, followLinks: true);
+
+    File file = null;
+
+    if (entityType == FileSystemEntityType.FILE) {
+      file = new File(fsPath);
+    } else if (entityType == FileSystemEntityType.DIRECTORY) {
+      file = _tryDefaultFile(fsPath, defaultDocument);
+      if (file == null && listDirectories) {
+        var uri = request.requestedUri;
+        if (!uri.path.endsWith('/')) return _redirectToAddTrailingSlash(uri);
+        return listDirectory(fileSystemPath, fsPath);
+      }
+    }
+
+    if (file == null) {
+      return new Response.notFound('Not Found');
+    }
+
+    if (!serveFilesOutsidePath) {
+      var resolvedPath = file.resolveSymbolicLinksSync();
+
+      // Do not serve a file outside of the original fileSystemPath
+      if (!p.isWithin(fileSystemPath, resolvedPath)) {
+        return new Response.notFound('Not Found');
+      }
+    }
+
+    // when serving the default document for a directory, if the requested
+    // path doesn't end with '/', redirect to the path with a trailing '/'
+    var uri = request.requestedUri;
+    if (entityType == FileSystemEntityType.DIRECTORY &&
+        !uri.path.endsWith('/')) {
+      return _redirectToAddTrailingSlash(uri);
+    }
+
+    var fileStat = file.statSync();
+    var ifModifiedSince = request.ifModifiedSince;
+
+    if (ifModifiedSince != null) {
+      var fileChangeAtSecResolution = toSecondResolution(fileStat.changed);
+      if (!fileChangeAtSecResolution.isAfter(ifModifiedSince)) {
+        return new Response.notModified();
+      }
+    }
+
+    var headers = <String, String>{
+      HttpHeaders.CONTENT_LENGTH: fileStat.size.toString(),
+      HttpHeaders.LAST_MODIFIED: formatHttpDate(fileStat.changed)
+    };
+
+    var contentType = mime.lookupMimeType(file.path);
+    if (contentType != null) {
+      headers[HttpHeaders.CONTENT_TYPE] = contentType;
+    }
+
+    return new Response.ok(file.openRead(), headers: headers);
+  };
+}
+
+Response _redirectToAddTrailingSlash(Uri uri) {
+  var location = new Uri(
+      scheme: uri.scheme,
+      userInfo: uri.userInfo,
+      host: uri.host,
+      port: uri.port,
+      path: uri.path + '/',
+      query: uri.query);
+
+  return new Response.movedPermanently(location.toString());
+}
+
+File _tryDefaultFile(String dirPath, String defaultFile) {
+  if (defaultFile == null) return null;
+
+  var filePath = p.join(dirPath, defaultFile);
+
+  var file = new File(filePath);
+
+  if (file.existsSync()) {
+    return file;
+  }
+
+  return null;
+}
diff --git a/mojo/public/dart/third_party/shelf_static/lib/src/util.dart b/mojo/public/dart/third_party/shelf_static/lib/src/util.dart
new file mode 100644
index 0000000..5db5e92
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/lib/src/util.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf_static.util;
+
+DateTime toSecondResolution(DateTime dt) {
+  if (dt.millisecond == 0) return dt;
+  return dt.subtract(new Duration(milliseconds: dt.millisecond));
+}
diff --git a/mojo/public/dart/third_party/shelf_static/pubspec.yaml b/mojo/public/dart/third_party/shelf_static/pubspec.yaml
new file mode 100644
index 0000000..553f335
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/pubspec.yaml
@@ -0,0 +1,16 @@
+name: shelf_static
+version: 0.2.3+1
+author: Dart Team <misc@dartlang.org>
+description: Static file server support for Shelf
+homepage: https://github.com/dart-lang/shelf_static
+environment:
+  sdk: '>=1.7.0 <2.0.0'
+dependencies:
+  http_parser: '>=0.0.2+2 <2.0.0'
+  mime: '>=0.9.0 <0.10.0'
+  path: '>=1.1.0 <2.0.0'
+  shelf: '>=0.5.7 <0.7.0'
+dev_dependencies:
+  args: '>=0.12.0 <0.14.0'
+  scheduled_test: '>=0.12.0 <0.13.0'
+  test: '>=0.12.0 <0.13.0'
diff --git a/mojo/public/dart/third_party/shelf_static/test/alternative_root_test.dart b/mojo/public/dart/third_party/shelf_static/test/alternative_root_test.dart
new file mode 100644
index 0000000..eb6bfd7
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/test/alternative_root_test.dart
@@ -0,0 +1,100 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf_static.alternative_root_test;
+
+import 'dart:io';
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import 'package:shelf_static/shelf_static.dart';
+import 'test_util.dart';
+
+void main() {
+  setUp(() {
+    var tempDir;
+    schedule(() {
+      return Directory.systemTemp.createTemp('shelf_static-test-').then((dir) {
+        tempDir = dir;
+        d.defaultRoot = tempDir.path;
+      });
+    });
+
+    d.file('root.txt', 'root txt').create();
+    d
+        .dir('files', [
+      d.file('test.txt', 'test txt content'),
+      d.file('with space.txt', 'with space content')
+    ])
+        .create();
+
+    currentSchedule.onComplete.schedule(() {
+      d.defaultRoot = null;
+      return tempDir.delete(recursive: true);
+    });
+  });
+
+  test('access root file', () {
+    schedule(() {
+      var handler = createStaticHandler(d.defaultRoot);
+
+      return makeRequest(handler, '/static/root.txt', handlerPath: 'static')
+          .then((response) {
+        expect(response.statusCode, HttpStatus.OK);
+        expect(response.contentLength, 8);
+        expect(response.readAsString(), completion('root txt'));
+      });
+    });
+  });
+
+  test('access root file with space', () {
+    schedule(() {
+      var handler = createStaticHandler(d.defaultRoot);
+
+      return makeRequest(handler, '/static/files/with%20space.txt',
+          handlerPath: 'static').then((response) {
+        expect(response.statusCode, HttpStatus.OK);
+        expect(response.contentLength, 18);
+        expect(response.readAsString(), completion('with space content'));
+      });
+    });
+  });
+
+  test('access root file with unencoded space', () {
+    schedule(() {
+      var handler = createStaticHandler(d.defaultRoot);
+
+      return makeRequest(handler, '/static/files/with%20space.txt',
+          handlerPath: 'static').then((response) {
+        expect(response.statusCode, HttpStatus.OK);
+        expect(response.contentLength, 18);
+        expect(response.readAsString(), completion('with space content'));
+      });
+    });
+  });
+
+  test('access file under directory', () {
+    schedule(() {
+      var handler = createStaticHandler(d.defaultRoot);
+
+      return makeRequest(handler, '/static/files/test.txt',
+          handlerPath: 'static').then((response) {
+        expect(response.statusCode, HttpStatus.OK);
+        expect(response.contentLength, 16);
+        expect(response.readAsString(), completion('test txt content'));
+      });
+    });
+  });
+
+  test('file not found', () {
+    schedule(() {
+      var handler = createStaticHandler(d.defaultRoot);
+
+      return makeRequest(handler, '/static/not_here.txt', handlerPath: 'static')
+          .then((response) {
+        expect(response.statusCode, HttpStatus.NOT_FOUND);
+      });
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/shelf_static/test/basic_file_test.dart b/mojo/public/dart/third_party/shelf_static/test/basic_file_test.dart
new file mode 100644
index 0000000..795e2db
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/test/basic_file_test.dart
@@ -0,0 +1,203 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf_static.basic_file_test;
+
+import 'dart:io';
+import 'package:http_parser/http_parser.dart';
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import 'package:shelf_static/shelf_static.dart';
+import 'test_util.dart';
+
+void main() {
+  setUp(() {
+    var tempDir;
+    schedule(() {
+      return Directory.systemTemp.createTemp('shelf_static-test-').then((dir) {
+        tempDir = dir;
+        d.defaultRoot = tempDir.path;
+      });
+    });
+
+    d.file('index.html', '<html></html>').create();
+    d.file('root.txt', 'root txt').create();
+    d.file('random.unknown', 'no clue').create();
+    d
+        .dir('files', [
+      d.file('test.txt', 'test txt content'),
+      d.file('with space.txt', 'with space content')
+    ])
+        .create();
+
+    currentSchedule.onComplete.schedule(() {
+      d.defaultRoot = null;
+      return tempDir.delete(recursive: true);
+    });
+  });
+
+  test('access root file', () {
+    schedule(() {
+      var handler = createStaticHandler(d.defaultRoot);
+
+      return makeRequest(handler, '/root.txt').then((response) {
+        expect(response.statusCode, HttpStatus.OK);
+        expect(response.contentLength, 8);
+        expect(response.readAsString(), completion('root txt'));
+      });
+    });
+  });
+
+  test('access root file with space', () {
+    schedule(() {
+      var handler = createStaticHandler(d.defaultRoot);
+
+      return makeRequest(handler, '/files/with%20space.txt').then((response) {
+        expect(response.statusCode, HttpStatus.OK);
+        expect(response.contentLength, 18);
+        expect(response.readAsString(), completion('with space content'));
+      });
+    });
+  });
+
+  test('access root file with unencoded space', () {
+    schedule(() {
+      var handler = createStaticHandler(d.defaultRoot);
+
+      return makeRequest(handler, '/files/with%20space.txt').then((response) {
+        expect(response.statusCode, HttpStatus.OK);
+        expect(response.contentLength, 18);
+        expect(response.readAsString(), completion('with space content'));
+      });
+    });
+  });
+
+  test('access file under directory', () {
+    schedule(() {
+      var handler = createStaticHandler(d.defaultRoot);
+
+      return makeRequest(handler, '/files/test.txt').then((response) {
+        expect(response.statusCode, HttpStatus.OK);
+        expect(response.contentLength, 16);
+        expect(response.readAsString(), completion('test txt content'));
+      });
+    });
+  });
+
+  test('file not found', () {
+    schedule(() {
+      var handler = createStaticHandler(d.defaultRoot);
+
+      return makeRequest(handler, '/not_here.txt').then((response) {
+        expect(response.statusCode, HttpStatus.NOT_FOUND);
+      });
+    });
+  });
+
+  test('last modified', () {
+    schedule(() {
+      var handler = createStaticHandler(d.defaultRoot);
+
+      var rootPath = p.join(d.defaultRoot, 'root.txt');
+      var modified = new File(rootPath).statSync().changed.toUtc();
+
+      return makeRequest(handler, '/root.txt').then((response) {
+        expect(response.lastModified, atSameTimeToSecond(modified));
+      });
+    });
+  });
+
+  group('if modified since', () {
+    test('same as last modified', () {
+      schedule(() {
+        var handler = createStaticHandler(d.defaultRoot);
+
+        var rootPath = p.join(d.defaultRoot, 'root.txt');
+        var modified = new File(rootPath).statSync().changed.toUtc();
+
+        var headers = {HttpHeaders.IF_MODIFIED_SINCE: formatHttpDate(modified)};
+
+        return makeRequest(handler, '/root.txt', headers: headers)
+            .then((response) {
+          expect(response.statusCode, HttpStatus.NOT_MODIFIED);
+          expect(response.contentLength, isNull);
+        });
+      });
+    });
+
+    test('before last modified', () {
+      schedule(() {
+        var handler = createStaticHandler(d.defaultRoot);
+
+        var rootPath = p.join(d.defaultRoot, 'root.txt');
+        var modified = new File(rootPath).statSync().changed.toUtc();
+
+        var headers = {
+          HttpHeaders.IF_MODIFIED_SINCE:
+              formatHttpDate(modified.subtract(const Duration(seconds: 1)))
+        };
+
+        return makeRequest(handler, '/root.txt', headers: headers)
+            .then((response) {
+          expect(response.statusCode, HttpStatus.OK);
+          expect(response.lastModified, atSameTimeToSecond(modified));
+        });
+      });
+    });
+
+    test('after last modified', () {
+      schedule(() {
+        var handler = createStaticHandler(d.defaultRoot);
+
+        var rootPath = p.join(d.defaultRoot, 'root.txt');
+        var modified = new File(rootPath).statSync().changed.toUtc();
+
+        var headers = {
+          HttpHeaders.IF_MODIFIED_SINCE:
+              formatHttpDate(modified.add(const Duration(seconds: 1)))
+        };
+
+        return makeRequest(handler, '/root.txt', headers: headers)
+            .then((response) {
+          expect(response.statusCode, HttpStatus.NOT_MODIFIED);
+          expect(response.contentLength, isNull);
+        });
+      });
+    });
+  });
+
+  group('content type', () {
+    test('root.txt should be text/plain', () {
+      schedule(() {
+        var handler = createStaticHandler(d.defaultRoot);
+
+        return makeRequest(handler, '/root.txt').then((response) {
+          expect(response.mimeType, 'text/plain');
+        });
+      });
+    });
+
+    test('index.html should be text/html', () {
+      schedule(() {
+        var handler = createStaticHandler(d.defaultRoot);
+
+        return makeRequest(handler, '/index.html').then((response) {
+          expect(response.mimeType, 'text/html');
+        });
+      });
+    });
+
+    test('random.unknown should be null', () {
+      schedule(() {
+        var handler = createStaticHandler(d.defaultRoot);
+
+        return makeRequest(handler, '/random.unknown').then((response) {
+          expect(response.mimeType, isNull);
+        });
+      });
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/shelf_static/test/default_document_test.dart b/mojo/public/dart/third_party/shelf_static/test/default_document_test.dart
new file mode 100644
index 0000000..e703bd4
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/test/default_document_test.dart
@@ -0,0 +1,159 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf_static.default_document_test;
+
+import 'dart:io';
+//import 'package:http_parser/http_parser.dart';
+//import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import 'package:shelf_static/shelf_static.dart';
+import 'test_util.dart';
+
+void main() {
+  setUp(() {
+    var tempDir;
+    schedule(() {
+      return Directory.systemTemp.createTemp('shelf_static-test-').then((dir) {
+        tempDir = dir;
+        d.defaultRoot = tempDir.path;
+      });
+    });
+
+    d.file('index.html', '<html></html>').create();
+    d.file('root.txt', 'root txt').create();
+    d
+        .dir('files', [
+      d.file('index.html', '<html><body>files</body></html>'),
+      d.file('with space.txt', 'with space content')
+    ])
+        .create();
+
+    currentSchedule.onComplete.schedule(() {
+      d.defaultRoot = null;
+      return tempDir.delete(recursive: true);
+    });
+  });
+
+  group('default document value', () {
+    test('cannot contain slashes', () {
+      var invalidValues = [
+        'file/foo.txt',
+        '/bar.txt',
+        '//bar.txt',
+        '//news/bar.txt',
+        'foo/../bar.txt'
+      ];
+
+      for (var val in invalidValues) {
+        expect(() => createStaticHandler(d.defaultRoot, defaultDocument: val),
+            throwsArgumentError);
+      }
+    });
+  });
+
+  group('no default document specified', () {
+    test('access "/index.html"', () {
+      schedule(() {
+        var handler = createStaticHandler(d.defaultRoot);
+
+        return makeRequest(handler, '/index.html').then((response) {
+          expect(response.statusCode, HttpStatus.OK);
+          expect(response.contentLength, 13);
+          expect(response.readAsString(), completion('<html></html>'));
+        });
+      });
+    });
+
+    test('access "/"', () {
+      schedule(() {
+        var handler = createStaticHandler(d.defaultRoot);
+
+        return makeRequest(handler, '/').then((response) {
+          expect(response.statusCode, HttpStatus.NOT_FOUND);
+        });
+      });
+    });
+
+    test('access "/files"', () {
+      schedule(() {
+        var handler = createStaticHandler(d.defaultRoot);
+
+        return makeRequest(handler, '/files').then((response) {
+          expect(response.statusCode, HttpStatus.NOT_FOUND);
+        });
+      });
+    });
+
+    test('access "/files/" dir', () {
+      schedule(() {
+        var handler = createStaticHandler(d.defaultRoot);
+
+        return makeRequest(handler, '/files/').then((response) {
+          expect(response.statusCode, HttpStatus.NOT_FOUND);
+        });
+      });
+    });
+  });
+
+  group('default document specified', () {
+    test('access "/index.html"', () {
+      schedule(() {
+        var handler =
+            createStaticHandler(d.defaultRoot, defaultDocument: 'index.html');
+
+        return makeRequest(handler, '/index.html').then((response) {
+          expect(response.statusCode, HttpStatus.OK);
+          expect(response.contentLength, 13);
+          expect(response.readAsString(), completion('<html></html>'));
+          expect(response.mimeType, 'text/html');
+        });
+      });
+    });
+
+    test('access "/"', () {
+      schedule(() {
+        var handler =
+            createStaticHandler(d.defaultRoot, defaultDocument: 'index.html');
+
+        return makeRequest(handler, '/').then((response) {
+          expect(response.statusCode, HttpStatus.OK);
+          expect(response.contentLength, 13);
+          expect(response.readAsString(), completion('<html></html>'));
+          expect(response.mimeType, 'text/html');
+        });
+      });
+    });
+
+    test('access "/files"', () {
+      schedule(() {
+        var handler =
+            createStaticHandler(d.defaultRoot, defaultDocument: 'index.html');
+
+        return makeRequest(handler, '/files').then((response) {
+          expect(response.statusCode, HttpStatus.MOVED_PERMANENTLY);
+          expect(response.headers,
+              containsPair(HttpHeaders.LOCATION, 'http://localhost/files/'));
+        });
+      });
+    });
+
+    test('access "/files/" dir', () {
+      schedule(() {
+        var handler =
+            createStaticHandler(d.defaultRoot, defaultDocument: 'index.html');
+
+        return makeRequest(handler, '/files/').then((response) {
+          expect(response.statusCode, HttpStatus.OK);
+          expect(response.contentLength, 31);
+          expect(response.readAsString(),
+              completion('<html><body>files</body></html>'));
+          expect(response.mimeType, 'text/html');
+        });
+      });
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/shelf_static/test/directory_listing_test.dart b/mojo/public/dart/third_party/shelf_static/test/directory_listing_test.dart
new file mode 100644
index 0000000..ad2b811
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/test/directory_listing_test.dart
@@ -0,0 +1,99 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf_static.directory_listing_test;
+
+import 'dart:io';
+
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:shelf_static/shelf_static.dart';
+
+import 'test_util.dart';
+
+void main() {
+  setUp(() {
+    var tempDir;
+    schedule(() {
+      return Directory.systemTemp.createTemp('shelf_static-test-').then((dir) {
+        tempDir = dir;
+        d.defaultRoot = tempDir.path;
+      });
+    });
+
+    d.file('index.html', '<html></html>').create();
+    d.file('root.txt', 'root txt').create();
+    d
+        .dir('files', [
+      d.file('index.html', '<html><body>files</body></html>'),
+      d.file('with space.txt', 'with space content'),
+      d.dir('empty subfolder', []),
+    ])
+        .create();
+
+    currentSchedule.onComplete.schedule(() {
+      d.defaultRoot = null;
+      return tempDir.delete(recursive: true);
+    });
+  });
+
+  group('list directories', () {
+    test('access "/"', () {
+      schedule(() async {
+        var handler = createStaticHandler(d.defaultRoot, listDirectories: true);
+
+        return makeRequest(handler, '/').then((response) {
+          expect(response.statusCode, HttpStatus.OK);
+          expect(response.readAsString(), completes);
+        });
+      });
+    });
+
+    test('access "/files"', () {
+      schedule(() async {
+        var handler = createStaticHandler(d.defaultRoot, listDirectories: true);
+
+        return makeRequest(handler, '/files').then((response) {
+          expect(response.statusCode, HttpStatus.MOVED_PERMANENTLY);
+          expect(response.headers,
+              containsPair(HttpHeaders.LOCATION, 'http://localhost/files/'));
+        });
+      });
+    });
+
+    test('access "/files/"', () {
+      schedule(() async {
+        var handler = createStaticHandler(d.defaultRoot, listDirectories: true);
+
+        return makeRequest(handler, '/files/').then((response) {
+          expect(response.statusCode, HttpStatus.OK);
+          expect(response.readAsString(), completes);
+        });
+      });
+    });
+
+    test('access "/files/empty subfolder"', () {
+      schedule(() async {
+        var handler = createStaticHandler(d.defaultRoot, listDirectories: true);
+
+        return makeRequest(handler, '/files/empty subfolder').then((response) {
+          expect(response.statusCode, HttpStatus.MOVED_PERMANENTLY);
+          expect(response.headers, containsPair(HttpHeaders.LOCATION,
+              'http://localhost/files/empty%20subfolder/'));
+        });
+      });
+    });
+
+    test('access "/files/empty subfolder/"', () {
+      schedule(() async {
+        var handler = createStaticHandler(d.defaultRoot, listDirectories: true);
+
+        return makeRequest(handler, '/files/empty subfolder/').then((response) {
+          expect(response.statusCode, HttpStatus.OK);
+          expect(response.readAsString(), completes);
+        });
+      });
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/shelf_static/test/get_handler_test.dart b/mojo/public/dart/third_party/shelf_static/test/get_handler_test.dart
new file mode 100644
index 0000000..1659a0e
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/test/get_handler_test.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf_static.get_handler_test;
+
+import 'dart:io';
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import 'package:shelf_static/shelf_static.dart';
+
+void main() {
+  setUp(() {
+    var tempDir;
+    schedule(() {
+      return Directory.systemTemp.createTemp('shelf_static-test-').then((dir) {
+        tempDir = dir;
+        d.defaultRoot = tempDir.path;
+      });
+    });
+
+    d.file('root.txt', 'root txt').create();
+    d
+        .dir('files', [
+      d.file('test.txt', 'test txt content'),
+      d.file('with space.txt', 'with space content')
+    ])
+        .create();
+
+    currentSchedule.onComplete.schedule(() {
+      d.defaultRoot = null;
+      return tempDir.delete(recursive: true);
+    });
+  });
+
+  test('non-existent relative path', () {
+    schedule(() {
+      expect(() => createStaticHandler('random/relative'), throwsArgumentError);
+    });
+  });
+
+  test('existing relative path', () {
+    schedule(() {
+      var existingRelative = p.relative(d.defaultRoot);
+      expect(() => createStaticHandler(existingRelative), returnsNormally);
+    });
+  });
+
+  test('non-existent absolute path', () {
+    schedule(() {
+      var nonExistingAbsolute = p.join(d.defaultRoot, 'not_here');
+      expect(
+          () => createStaticHandler(nonExistingAbsolute), throwsArgumentError);
+    });
+  });
+
+  test('existing absolute path', () {
+    schedule(() {
+      expect(() => createStaticHandler(d.defaultRoot), returnsNormally);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/shelf_static/test/sample_test.dart b/mojo/public/dart/third_party/shelf_static/test/sample_test.dart
new file mode 100644
index 0000000..ab7878f
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/test/sample_test.dart
@@ -0,0 +1,92 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf_static.sample_test;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import 'package:shelf/shelf.dart';
+import 'package:shelf_static/shelf_static.dart';
+
+import 'test_util.dart';
+
+void main() {
+  group('/index.html', () {
+    test('body is correct', () {
+      return _testFileContents('index.html');
+    });
+
+    test('mimeType is text/html', () {
+      return _requestFile('index.html').then((response) {
+        expect(response.mimeType, 'text/html');
+      });
+    });
+  });
+
+  group('/favicon.ico', () {
+    test('body is correct', () {
+      return _testFileContents('favicon.ico');
+    });
+
+    test('mimeType is text/html', () {
+      return _requestFile('favicon.ico').then((response) {
+        expect(response.mimeType, 'image/x-icon');
+      });
+    });
+  });
+
+  group('/dart.png', () {
+    test('body is correct', () {
+      return _testFileContents('dart.png');
+    });
+
+    test('mimeType is image/png', () {
+      return _requestFile('dart.png').then((response) {
+        expect(response.mimeType, 'image/png');
+      });
+    });
+  });
+}
+
+Future<Response> _requestFile(String filename) {
+  var uri = Uri.parse('http://localhost/$filename');
+
+  return _request(new Request('GET', uri));
+}
+
+Future _testFileContents(String filename) {
+  var filePath = p.join(_samplePath, filename);
+  var file = new File(filePath);
+  var fileContents = file.readAsBytesSync();
+  var fileStat = file.statSync();
+
+  return _requestFile(filename).then((response) {
+    expect(response.contentLength, fileStat.size);
+    expect(response.lastModified, atSameTimeToSecond(fileStat.changed.toUtc()));
+    return _expectCompletesWithBytes(response, fileContents);
+  });
+}
+
+Future _expectCompletesWithBytes(Response response, List<int> expectedBytes) {
+  return response.read().toList().then((List<List<int>> bytes) {
+    var flatBytes = bytes.expand((e) => e);
+    expect(flatBytes, orderedEquals(expectedBytes));
+  });
+}
+
+Future<Response> _request(Request request) {
+  var handler = createStaticHandler(_samplePath);
+
+  return new Future.sync(() => handler(request));
+}
+
+String get _samplePath {
+  var sampleDir = p.join(p.current, 'example', 'files');
+  assert(FileSystemEntity.isDirectorySync(sampleDir));
+  return sampleDir;
+}
diff --git a/mojo/public/dart/third_party/shelf_static/test/symbolic_link_test.dart b/mojo/public/dart/third_party/shelf_static/test/symbolic_link_test.dart
new file mode 100644
index 0000000..6e9d956
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/test/symbolic_link_test.dart
@@ -0,0 +1,183 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf_static.symbolic_link_test;
+
+import 'dart:io';
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import 'package:shelf_static/shelf_static.dart';
+import 'test_util.dart';
+
+void main() {
+  setUp(() {
+    var tempDir;
+    schedule(() {
+      return Directory.systemTemp.createTemp('shelf_static-test-').then((dir) {
+        tempDir = dir;
+        d.defaultRoot = tempDir.path;
+      });
+    });
+
+    d.dir('originals', [d.file('index.html', '<html></html>'),]).create();
+
+    d.dir('alt_root').create();
+
+    schedule(() {
+      var originalsDir = p.join(d.defaultRoot, 'originals');
+      var originalsIndex = p.join(originalsDir, 'index.html');
+
+      new Link(p.join(d.defaultRoot, 'link_index.html'))
+          .createSync(originalsIndex);
+
+      new Link(p.join(d.defaultRoot, 'link_dir')).createSync(originalsDir);
+
+      new Link(p.join(d.defaultRoot, 'alt_root', 'link_index.html'))
+          .createSync(originalsIndex);
+
+      new Link(p.join(d.defaultRoot, 'alt_root', 'link_dir'))
+          .createSync(originalsDir);
+    });
+
+    currentSchedule.onComplete.schedule(() {
+      d.defaultRoot = null;
+      return tempDir.delete(recursive: true);
+    });
+  });
+
+  group('access outside of root disabled', () {
+    test('access real file', () {
+      schedule(() {
+        var handler = createStaticHandler(d.defaultRoot);
+
+        return makeRequest(handler, '/originals/index.html').then((response) {
+          expect(response.statusCode, HttpStatus.OK);
+          expect(response.contentLength, 13);
+          expect(response.readAsString(), completion('<html></html>'));
+        });
+      });
+    });
+
+    group('links under root dir', () {
+      test('access sym linked file in real dir', () {
+        schedule(() {
+          var handler = createStaticHandler(d.defaultRoot);
+
+          return makeRequest(handler, '/link_index.html').then((response) {
+            expect(response.statusCode, HttpStatus.OK);
+            expect(response.contentLength, 13);
+            expect(response.readAsString(), completion('<html></html>'));
+          });
+        });
+      });
+
+      test('access file in sym linked dir', () {
+        schedule(() {
+          var handler = createStaticHandler(d.defaultRoot);
+
+          return makeRequest(handler, '/link_dir/index.html').then((response) {
+            expect(response.statusCode, HttpStatus.OK);
+            expect(response.contentLength, 13);
+            expect(response.readAsString(), completion('<html></html>'));
+          });
+        });
+      });
+    });
+
+    group('links not under root dir', () {
+      test('access sym linked file in real dir', () {
+        schedule(() {
+          var handler = createStaticHandler(p.join(d.defaultRoot, 'alt_root'));
+
+          return makeRequest(handler, '/link_index.html').then((response) {
+            expect(response.statusCode, HttpStatus.NOT_FOUND);
+          });
+        });
+      });
+
+      test('access file in sym linked dir', () {
+        schedule(() {
+          var handler = createStaticHandler(p.join(d.defaultRoot, 'alt_root'));
+
+          return makeRequest(handler, '/link_dir/index.html').then((response) {
+            expect(response.statusCode, HttpStatus.NOT_FOUND);
+          });
+        });
+      });
+    });
+  });
+
+  group('access outside of root enabled', () {
+    test('access real file', () {
+      schedule(() {
+        var handler =
+            createStaticHandler(d.defaultRoot, serveFilesOutsidePath: true);
+
+        return makeRequest(handler, '/originals/index.html').then((response) {
+          expect(response.statusCode, HttpStatus.OK);
+          expect(response.contentLength, 13);
+          expect(response.readAsString(), completion('<html></html>'));
+        });
+      });
+    });
+
+    group('links under root dir', () {
+      test('access sym linked file in real dir', () {
+        schedule(() {
+          var handler =
+              createStaticHandler(d.defaultRoot, serveFilesOutsidePath: true);
+
+          return makeRequest(handler, '/link_index.html').then((response) {
+            expect(response.statusCode, HttpStatus.OK);
+            expect(response.contentLength, 13);
+            expect(response.readAsString(), completion('<html></html>'));
+          });
+        });
+      });
+
+      test('access file in sym linked dir', () {
+        schedule(() {
+          var handler =
+              createStaticHandler(d.defaultRoot, serveFilesOutsidePath: true);
+
+          return makeRequest(handler, '/link_dir/index.html').then((response) {
+            expect(response.statusCode, HttpStatus.OK);
+            expect(response.contentLength, 13);
+            expect(response.readAsString(), completion('<html></html>'));
+          });
+        });
+      });
+    });
+
+    group('links not under root dir', () {
+      test('access sym linked file in real dir', () {
+        schedule(() {
+          var handler = createStaticHandler(p.join(d.defaultRoot, 'alt_root'),
+              serveFilesOutsidePath: true);
+
+          return makeRequest(handler, '/link_index.html').then((response) {
+            expect(response.statusCode, HttpStatus.OK);
+            expect(response.contentLength, 13);
+            expect(response.readAsString(), completion('<html></html>'));
+          });
+        });
+      });
+
+      test('access file in sym linked dir', () {
+        schedule(() {
+          var handler = createStaticHandler(p.join(d.defaultRoot, 'alt_root'),
+              serveFilesOutsidePath: true);
+
+          return makeRequest(handler, '/link_dir/index.html').then((response) {
+            expect(response.statusCode, HttpStatus.OK);
+            expect(response.contentLength, 13);
+            expect(response.readAsString(), completion('<html></html>'));
+          });
+        });
+      });
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/shelf_static/test/test_all.dart b/mojo/public/dart/third_party/shelf_static/test/test_all.dart
new file mode 100644
index 0000000..d2bd3fe
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/test/test_all.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf_static.test_all;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import 'alternative_root_test.dart' as alternative_root;
+import 'basic_file_test.dart' as basic_file;
+import 'default_document_test.dart' as default_document;
+import 'directory_listing_test.dart' as directory_listing;
+import 'get_handler_test.dart' as get_handler;
+import 'sample_test.dart' as sample;
+import 'symbolic_link_test.dart' as symbolic_link;
+
+void main() {
+  group('alternative_root', alternative_root.main);
+  group('basic_file', basic_file.main);
+  group('default_document', default_document.main);
+  group('directory_listing', directory_listing.main);
+  group('get_handler', get_handler.main);
+  group('sample', sample.main);
+  group('symbolic_link', symbolic_link.main);
+}
diff --git a/mojo/public/dart/third_party/shelf_static/test/test_util.dart b/mojo/public/dart/third_party/shelf_static/test/test_util.dart
new file mode 100644
index 0000000..b96abce
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/test/test_util.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf_static.test_util;
+
+import 'dart:async';
+
+import 'package:path/path.dart' as p;
+import 'package:shelf/shelf.dart';
+import 'package:shelf_static/src/util.dart';
+import 'package:test/test.dart';
+
+final p.Context _ctx = p.url;
+
+/// Makes a simple GET request to [handler] and returns the result.
+Future<Response> makeRequest(Handler handler, String path,
+    {String handlerPath, Map<String, String> headers}) {
+  var rootedHandler = _rootHandler(handlerPath, handler);
+  return new Future.sync(() => rootedHandler(_fromPath(path, headers)));
+}
+
+Request _fromPath(String path, Map<String, String> headers) =>
+    new Request('GET', Uri.parse('http://localhost' + path), headers: headers);
+
+Handler _rootHandler(String path, Handler handler) {
+  if (path == null || path.isEmpty) {
+    return handler;
+  }
+
+  return (Request request) {
+    if (!_ctx.isWithin("/$path", request.requestedUri.path)) {
+      return new Response.notFound('not found');
+    }
+    assert(request.handlerPath == '/');
+
+    var relativeRequest = request.change(path: path);
+
+    return handler(relativeRequest);
+  };
+}
+
+Matcher atSameTimeToSecond(value) =>
+    new _SecondResolutionDateTimeMatcher(value);
+
+class _SecondResolutionDateTimeMatcher extends Matcher {
+  final DateTime _target;
+
+  _SecondResolutionDateTimeMatcher(DateTime target)
+      : this._target = toSecondResolution(target);
+
+  bool matches(item, Map matchState) {
+    if (item is! DateTime) return false;
+
+    return datesEqualToSecond(_target, item);
+  }
+
+  Description describe(Description descirption) => descirption.add(
+      'Must be at the same moment as $_target with resolution '
+      'to the second.');
+}
+
+bool datesEqualToSecond(DateTime d1, DateTime d2) {
+  return toSecondResolution(d1).isAtSameMomentAs(toSecondResolution(d2));
+}
diff --git a/mojo/public/dart/third_party/shelf_static/tool/travis.sh b/mojo/public/dart/third_party/shelf_static/tool/travis.sh
new file mode 100755
index 0000000..0f7c725
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_static/tool/travis.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+# Fast fail the script on failures.
+set -e
+
+pub run test
+
+# Install dart_coveralls; gather and send coverage data.
+if [ "$COVERALLS_TOKEN" ] && [ "$TRAVIS_DART_VERSION" = "stable" ]; then
+  pub global activate dart_coveralls
+  pub global run dart_coveralls report \
+    --exclude-test-files \
+    --log-level warning \
+    test/test_all.dart
+fi
diff --git a/mojo/public/dart/third_party/shelf_web_socket/.gitignore b/mojo/public/dart/third_party/shelf_web_socket/.gitignore
new file mode 100644
index 0000000..7dbf035
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_web_socket/.gitignore
@@ -0,0 +1,15 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.pub/
+build/
+packages
+.packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/shelf_web_socket/.test_config b/mojo/public/dart/third_party/shelf_web_socket/.test_config
new file mode 100644
index 0000000..531426a
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_web_socket/.test_config
@@ -0,0 +1,5 @@
+{
+  "test_package": {
+    "platforms": ["vm"]
+  }
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/shelf_web_socket/CHANGELOG.md b/mojo/public/dart/third_party/shelf_web_socket/CHANGELOG.md
new file mode 100644
index 0000000..f69d1f1
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_web_socket/CHANGELOG.md
@@ -0,0 +1,16 @@
+## 0.0.1+4
+
+* Fix a link to `shelf` in the README.
+
+## 0.0.1+3
+
+* Support `http_parser` 1.0.0.
+
+## 0.0.1+2
+
+* Mark as compatible with version `0.6.0` of `shelf`.
+
+## 0.0.1+1
+
+* Properly parse the `Connection` header. This fixes an issue where Firefox was
+  unable to connect.
diff --git a/mojo/public/dart/third_party/shelf_web_socket/LICENSE b/mojo/public/dart/third_party/shelf_web_socket/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_web_socket/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/shelf_web_socket/README.md b/mojo/public/dart/third_party/shelf_web_socket/README.md
new file mode 100644
index 0000000..aa9379e
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_web_socket/README.md
@@ -0,0 +1,31 @@
+## Web Socket Handler for Shelf
+
+`shelf_web_socket` is a [Shelf][] handler for establishing [WebSocket][]
+connections. It exposes a single function, [webSocketHandler][], which calls an
+`onConnection` callback with a [CompatibleWebSocket][] object for every
+connection that's established.
+
+[Shelf]: https://pub.dartlang.org/packages/shelf
+
+[WebSocket]: https://tools.ietf.org/html/rfc6455
+
+[webSocketHandler]: https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/shelf_web_socket/shelf_web_socket.webSocketHandler
+
+[CompatibleWebSocket]: https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/http_parser/http_parser.CompatibleWebSocket
+
+```dart
+import 'package:shelf/shelf_io.dart' as shelf_io;
+import 'package:shelf_web_socket/shelf_web_socket.dart';
+
+void main() {
+  var handler = webSocketHandler((webSocket) {
+    webSocket.listen((message) {
+      webSocket.add("echo $message");
+    });
+  });
+
+  shelf_io.serve(handler, 'localhost', 8080).then((server) {
+    print('Serving at ws://${server.address.host}:${server.port}');
+  });
+}
+```
diff --git a/mojo/public/dart/third_party/shelf_web_socket/codereview.settings b/mojo/public/dart/third_party/shelf_web_socket/codereview.settings
new file mode 100644
index 0000000..a127a81
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_web_socket/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: http://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/shelf_web_socket/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/shelf_web_socket/lib/shelf_web_socket.dart b/mojo/public/dart/third_party/shelf_web_socket/lib/shelf_web_socket.dart
new file mode 100644
index 0000000..8aac366
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_web_socket/lib/shelf_web_socket.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf_web_socket;
+
+import 'package:shelf/shelf.dart';
+
+import 'src/web_socket_handler.dart';
+
+/// A typedef used to determine if a function takes two arguments or not.
+typedef _BinaryFunction(arg1, arg2);
+
+/// Creates a Shelf handler that upgrades HTTP requests to WebSocket
+/// connections.
+///
+/// Only valid WebSocket upgrade requests are upgraded. If a request doesn't
+/// look like a WebSocket upgrade request, a 404 Not Found is returned; if a
+/// request looks like an upgrade request but is invalid, a 400 Bad Request is
+/// returned; and if a request is a valid upgrade request but has an origin that
+/// doesn't match [allowedOrigins] (see below), a 403 Forbidden is returned.
+/// This means that this can be placed first in a [Cascade] and only upgrade
+/// requests will be handled.
+///
+/// The [onConnection] must take a [CompatibleWebSocket] as its first argument.
+/// It may also take a string, the [WebSocket subprotocol][], as its second
+/// argument. The subprotocol is determined by looking at the client's
+/// `Sec-WebSocket-Protocol` header and selecting the first entry that also
+/// appears in [protocols]. If no subprotocols are shared between the client and
+/// the server, `null` will be passed instead. Note that if [onConnection] takes
+/// two arguments, [protocols] must be passed.
+///
+/// [WebSocket subprotocol]: https://tools.ietf.org/html/rfc6455#section-1.9
+///
+/// If [allowedOrigins] is passed, browser connections will only be accepted if
+/// they're made by a script from one of the given origins. This ensures that
+/// malicious scripts running in the browser are unable to fake a WebSocket
+/// handshake. Note that non-browser programs can still make connections freely.
+/// See also the WebSocket spec's discussion of [origin considerations][].
+///
+/// [origin considerations]: https://tools.ietf.org/html/rfc6455#section-10.2
+Handler webSocketHandler(Function onConnection, {Iterable<String> protocols,
+      Iterable<String> allowedOrigins}) {
+  if (protocols != null) protocols = protocols.toSet();
+  if (allowedOrigins != null) {
+    allowedOrigins = allowedOrigins
+        .map((origin) => origin.toLowerCase()).toSet();
+  }
+
+  if (onConnection is! _BinaryFunction) {
+    if (protocols != null) {
+      throw new ArgumentError("If protocols is non-null, onConnection must "
+          "take two arguments, the WebSocket and the protocol.");
+    }
+
+    var innerOnConnection = onConnection;
+    onConnection = (webSocket, _) => innerOnConnection(webSocket);
+  }
+
+  return new WebSocketHandler(onConnection, protocols, allowedOrigins).handle;
+}
diff --git a/mojo/public/dart/third_party/shelf_web_socket/lib/src/web_socket_handler.dart b/mojo/public/dart/third_party/shelf_web_socket/lib/src/web_socket_handler.dart
new file mode 100644
index 0000000..7ab8e7e
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_web_socket/lib/src/web_socket_handler.dart
@@ -0,0 +1,135 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf_web_socket.web_socket_handler;
+
+import 'dart:convert';
+
+import 'package:http_parser/http_parser.dart';
+import 'package:shelf/shelf.dart';
+
+/// A class that exposes a handler for upgrading WebSocket requests.
+class WebSocketHandler {
+  /// The function to call when a request is upgraded.
+  final Function _onConnection;
+
+  /// The set of protocols the user supports, or `null`.
+  final Set<String> _protocols;
+
+  /// The set of allowed browser origin connections, or `null`..
+  final Set<String> _allowedOrigins;
+
+  WebSocketHandler(this._onConnection, this._protocols, this._allowedOrigins);
+
+  /// The [Handler].
+  Response handle(Request request) {
+    if (request.method != 'GET') return _notFound();
+
+    var connection = request.headers['Connection'];
+    if (connection == null) return _notFound();
+    var tokens = connection.toLowerCase().split(',')
+        .map((token) => token.trim());
+    if (!tokens.contains('upgrade')) return _notFound();
+
+    var upgrade = request.headers['Upgrade'];
+    if (upgrade == null) return _notFound();
+    if (upgrade.toLowerCase() != 'websocket') return _notFound();
+
+    var version = request.headers['Sec-WebSocket-Version'];
+    if (version == null) {
+      return _badRequest('missing Sec-WebSocket-Version header.');
+    } else if (version != '13') {
+      return _notFound();
+    }
+
+    if (request.protocolVersion != '1.1') {
+      return _badRequest('unexpected HTTP version '
+          '"${request.protocolVersion}".');
+    }
+
+    var key = request.headers['Sec-WebSocket-Key'];
+    if (key == null) return _badRequest('missing Sec-WebSocket-Key header.');
+
+    if (!request.canHijack) {
+      throw new ArgumentError("webSocketHandler may only be used with a server "
+          "that supports request hijacking.");
+    }
+
+    // The Origin header is always set by browser connections. By filtering out
+    // unexpected origins, we ensure that malicious JavaScript is unable to fake
+    // a WebSocket handshake.
+    var origin = request.headers['Origin'];
+    if (origin != null && _allowedOrigins != null &&
+        !_allowedOrigins.contains(origin.toLowerCase())) {
+      return _forbidden('invalid origin "$origin".');
+    }
+
+    var protocol = _chooseProtocol(request);
+    request.hijack((stream, byteSink) {
+      var sink = UTF8.encoder.startChunkedConversion(byteSink);
+      sink.add(
+          "HTTP/1.1 101 Switching Protocols\r\n"
+          "Upgrade: websocket\r\n"
+          "Connection: Upgrade\r\n"
+          "Sec-WebSocket-Accept: ${CompatibleWebSocket.signKey(key)}\r\n");
+      if (protocol != null) sink.add("Sec-WebSocket-Protocol: $protocol\r\n");
+      sink.add("\r\n");
+
+      _onConnection(new CompatibleWebSocket(stream, sink: byteSink), protocol);
+    });
+
+    // [request.hijack] is guaranteed to throw a [HijackException], so we'll
+    // never get here.
+    assert(false);
+    return null;
+  }
+
+  /// Selects a subprotocol to use for the given connection.
+  ///
+  /// If no matching protocol can be found, returns `null`.
+  String _chooseProtocol(Request request) {
+    var protocols = request.headers['Sec-WebSocket-Protocol'];
+    if (protocols == null) return null;
+    for (var protocol in protocols.split(',')) {
+      protocol = protocol.trim();
+      if (_protocols.contains(protocol)) return protocol;
+    }
+    return null;
+  }
+
+  /// Returns a 404 Not Found response.
+  Response _notFound() => _htmlResponse(404, "404 Not Found",
+      "Only WebSocket connections are supported.");
+
+  /// Returns a 400 Bad Request response.
+  ///
+  /// [message] will be HTML-escaped before being included in the response body.
+  Response _badRequest(String message) => _htmlResponse(400, "400 Bad Request",
+      "Invalid WebSocket upgrade request: $message");
+
+  /// Returns a 403 Forbidden response.
+  ///
+  /// [message] will be HTML-escaped before being included in the response body.
+  Response _forbidden(String message) => _htmlResponse(403, "403 Forbidden",
+      "WebSocket upgrade refused: $message");
+
+  /// Creates an HTTP response with the given [statusCode] and an HTML body with
+  /// [title] and [message].
+  ///
+  /// [title] and [message] will be automatically HTML-escaped.
+  Response _htmlResponse(int statusCode, String title, String message) {
+    title = HTML_ESCAPE.convert(title);
+    message = HTML_ESCAPE.convert(message);
+    return new Response(statusCode, body: """
+      <!doctype html>
+      <html>
+        <head><title>$title</title></head>
+        <body>
+          <h1>$title</h1>
+          <p>$message</p>
+        </body>
+      </html>
+    """, headers: {'content-type': 'text/html'});
+  }
+}
diff --git a/mojo/public/dart/third_party/shelf_web_socket/pubspec.yaml b/mojo/public/dart/third_party/shelf_web_socket/pubspec.yaml
new file mode 100644
index 0000000..1e17a13
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_web_socket/pubspec.yaml
@@ -0,0 +1,14 @@
+name: shelf_web_socket
+version: 0.0.1+4
+author: "Dart Team <misc@dartlang.org>"
+homepage: http://github.com/dart-lang/shelf_web_socket
+description: >
+  A WebSocket handler for Shelf.
+dependencies:
+  http_parser: ">=0.0.2 <2.0.0"
+  shelf: ">=0.5.2 <0.7.0"
+dev_dependencies:
+  http: ">=0.10.0 <0.12.0"
+  test: ">=0.12.0 <0.13.0"
+environment:
+  sdk: ">=1.4.0-dev.5.0 <2.0.0"
diff --git a/mojo/public/dart/third_party/shelf_web_socket/test/web_socket_test.dart b/mojo/public/dart/third_party/shelf_web_socket/test/web_socket_test.dart
new file mode 100644
index 0000000..06c0be3
--- /dev/null
+++ b/mojo/public/dart/third_party/shelf_web_socket/test/web_socket_test.dart
@@ -0,0 +1,181 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf_web_socket.web_socket_test;
+
+import 'dart:io';
+
+import 'package:http/http.dart' as http;
+import 'package:shelf/shelf_io.dart' as shelf_io;
+import 'package:shelf_web_socket/shelf_web_socket.dart';
+import 'package:test/test.dart';
+
+Map<String, String> get _handshakeHeaders => {
+  "Upgrade": "websocket",
+  "Connection": "Upgrade",
+  "Sec-WebSocket-Key": "x3JJHMbDL1EzLkh9GBhXDw==",
+  "Sec-WebSocket-Version": "13"
+};
+
+void main() {
+  test("can communicate with a dart:io WebSocket client", () {
+    return shelf_io.serve(webSocketHandler((webSocket) {
+      webSocket.add("hello!");
+      webSocket.first.then((request) {
+        expect(request, equals("ping"));
+        webSocket.add("pong");
+        webSocket.close();
+      });
+    }), "localhost", 0).then((server) {
+      return WebSocket.connect('ws://localhost:${server.port}')
+          .then((webSocket) {
+        var n = 0;
+        return webSocket.listen((message) {
+          if (n == 0) {
+            expect(message, equals("hello!"));
+            webSocket.add("ping");
+          } else if (n == 1) {
+            expect(message, equals("pong"));
+            webSocket.close();
+            server.close();
+          } else {
+            fail("Only expected two messages.");
+          }
+          n++;
+        }).asFuture();
+      }).whenComplete(server.close);
+    });
+  });
+
+  test("negotiates the sub-protocol", () {
+    return shelf_io.serve(webSocketHandler((webSocket, protocol) {
+      expect(protocol, equals("two"));
+      webSocket.close();
+    }, protocols: ["three", "two", "x"]), "localhost", 0).then((server) {
+      return WebSocket.connect('ws://localhost:${server.port}',
+          protocols: ["one", "two", "three"]).then((webSocket) {
+        expect(webSocket.protocol, equals("two"));
+        return webSocket.close();
+      }).whenComplete(server.close);
+    });
+  });
+
+  group("with a set of allowed origins", () {
+    var server;
+    var url;
+    setUp(() {
+      return shelf_io.serve(webSocketHandler((webSocket) {
+        webSocket.close();
+      }, allowedOrigins: ["pub.dartlang.org", "GoOgLe.CoM"]), "localhost", 0)
+          .then((server_) {
+        server = server_;
+        url = 'http://localhost:${server.port}/';
+      });
+    });
+
+    tearDown(() => server.close());
+
+    test("allows access with an allowed origin", () {
+      var headers = _handshakeHeaders;
+      headers['Origin'] = 'pub.dartlang.org';
+      expect(http.get(url, headers: headers), hasStatus(101));
+    });
+
+    test("forbids access with a non-allowed origin", () {
+      var headers = _handshakeHeaders;
+      headers['Origin'] = 'dartlang.org';
+      expect(http.get(url, headers: headers), hasStatus(403));
+    });
+
+    test("allows access with no origin", () {
+      expect(http.get(url, headers: _handshakeHeaders), hasStatus(101));
+    });
+
+    test("ignores the case of the client origin", () {
+      var headers = _handshakeHeaders;
+      headers['Origin'] = 'PuB.DaRtLaNg.OrG';
+      expect(http.get(url, headers: headers), hasStatus(101));
+    });
+
+    test("ignores the case of the server origin", () {
+      var headers = _handshakeHeaders;
+      headers['Origin'] = 'google.com';
+      expect(http.get(url, headers: headers), hasStatus(101));
+    });
+  });
+
+  // Regression test for issue 21894.
+  test("allows a Connection header with multiple values", () {
+    return shelf_io.serve(webSocketHandler((webSocket) {
+      webSocket.close();
+    }), "localhost", 0).then((server) {
+      var url = 'http://localhost:${server.port}/';
+
+      var headers = _handshakeHeaders;
+      headers['Connection'] = 'Other-Token, Upgrade';
+      expect(http.get(url, headers: headers).whenComplete(server.close),
+          hasStatus(101));
+    });
+  });
+
+  group("HTTP errors", () {
+    var server;
+    var url;
+    setUp(() {
+      return shelf_io.serve(webSocketHandler((_) {
+        fail("should not create a WebSocket");
+      }), "localhost", 0).then((server_) {
+        server = server_;
+        url = 'http://localhost:${server.port}/';
+      });
+    });
+
+    tearDown(() => server.close());
+
+    test("404s for non-GET requests", () {
+      expect(http.delete(url, headers: _handshakeHeaders), hasStatus(404));
+    });
+
+    test("404s for non-Upgrade requests", () {
+      var headers = _handshakeHeaders;
+      headers.remove('Connection');
+      expect(http.get(url, headers: headers), hasStatus(404));
+    });
+
+    test("404s for non-websocket upgrade requests", () {
+      var headers = _handshakeHeaders;
+      headers['Upgrade'] = 'fblthp';
+      expect(http.get(url, headers: headers), hasStatus(404));
+    });
+
+    test("400s for a missing Sec-WebSocket-Version", () {
+      var headers = _handshakeHeaders;
+      headers.remove('Sec-WebSocket-Version');
+      expect(http.get(url, headers: headers), hasStatus(400));
+    });
+
+    test("404s for an unknown Sec-WebSocket-Version", () {
+      var headers = _handshakeHeaders;
+      headers['Sec-WebSocket-Version'] = '15';
+      expect(http.get(url, headers: headers), hasStatus(404));
+    });
+
+    test("400s for a missing Sec-WebSocket-Key", () {
+      var headers = _handshakeHeaders;
+      headers.remove('Sec-WebSocket-Key');
+      expect(http.get(url, headers: headers), hasStatus(400));
+    });
+  });
+
+  test("throws an error if a unary function is provided with protocols", () {
+    expect(() => webSocketHandler((_) => null, protocols: ['foo']),
+        throwsArgumentError);
+  });
+}
+
+Matcher hasStatus(int status) => completion(predicate((response) {
+  expect(response, new isInstanceOf<http.Response>());
+  expect(response.statusCode, equals(status));
+  return true;
+}));
diff --git a/mojo/public/dart/third_party/source_map_stack_trace/.gitignore b/mojo/public/dart/third_party/source_map_stack_trace/.gitignore
new file mode 100644
index 0000000..89f7747
--- /dev/null
+++ b/mojo/public/dart/third_party/source_map_stack_trace/.gitignore
@@ -0,0 +1,8 @@
+.buildlog
+.DS_Store
+.idea
+.pub/
+.settings/
+build/
+packages
+pubspec.lock
diff --git a/mojo/public/dart/third_party/source_map_stack_trace/.status b/mojo/public/dart/third_party/source_map_stack_trace/.status
new file mode 100644
index 0000000..0788ce1
--- /dev/null
+++ b/mojo/public/dart/third_party/source_map_stack_trace/.status
@@ -0,0 +1,24 @@
+# Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Skip non-test files ending with "_test".
+packages/*: SkipByDesign
+*/packages/*: SkipByDesign
+*/*/packages/*: SkipByDesign
+*/*/*/packages/*: SkipByDesign
+*/*/*/*packages/*: SkipByDesign
+*/*/*/*/*packages/*: SkipByDesign
+
+# Only run tests from the test directory, since we don't care about the
+# difference between transformed an untransformed code.
+build/test/*: SkipByDesign
+build/test/*/*: SkipByDesign
+build/test/*/*/*: SkipByDesign
+build/test/*/*/*/*: SkipByDesign
+
+# Don't run library files as tests
+lib/*: SkipByDesign
+lib/*/*: SkipByDesign
+lib/*/*/*: SkipByDesign
+lib/*/*/*/*: SkipByDesign
diff --git a/mojo/public/dart/third_party/source_map_stack_trace/AUTHORS b/mojo/public/dart/third_party/source_map_stack_trace/AUTHORS
new file mode 100644
index 0000000..e8063a8
--- /dev/null
+++ b/mojo/public/dart/third_party/source_map_stack_trace/AUTHORS
@@ -0,0 +1,6 @@
+# Below is a list of people and organizations that have contributed
+# to the project. Names should be added to the list like so:
+#
+#   Name/Organization <email address>
+
+Google Inc.
diff --git a/mojo/public/dart/third_party/source_map_stack_trace/CHANGELOG.md b/mojo/public/dart/third_party/source_map_stack_trace/CHANGELOG.md
new file mode 100644
index 0000000..deb9c13
--- /dev/null
+++ b/mojo/public/dart/third_party/source_map_stack_trace/CHANGELOG.md
@@ -0,0 +1,19 @@
+## 1.0.4
+
+* Add compatibility for Dart 1.10-style name munging.
+
+## 1.0.3
+
+* Prefer "dart:" URLs to "package:" URLs.
+
+## 1.0.2
+
+* Fix an off-by-one bug that was causing line numbers to be slightly off.
+
+## 1.0.1
+
+* Don't crash when mapping stack chains.
+
+## 1.0.0
+
+* Initial release.
diff --git a/mojo/public/dart/third_party/source_map_stack_trace/CONTRIBUTING.md b/mojo/public/dart/third_party/source_map_stack_trace/CONTRIBUTING.md
new file mode 100644
index 0000000..6f5e0ea
--- /dev/null
+++ b/mojo/public/dart/third_party/source_map_stack_trace/CONTRIBUTING.md
@@ -0,0 +1,33 @@
+Want to contribute? Great! First, read this page (including the small print at
+the end).
+
+### Before you contribute
+Before we can use your code, you must sign the
+[Google Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual)
+(CLA), which you can do online. The CLA is necessary mainly because you own the
+copyright to your changes, even after your contribution becomes part of our
+codebase, so we need your permission to use and distribute your code. We also
+need to be sure of various other things—for instance that you'll tell us if you
+know that your code infringes on other people's patents. You don't have to sign
+the CLA until after you've submitted your code for review and a member has
+approved it, but you must do it before we can put your code into our codebase.
+
+Before you start working on a larger contribution, you should get in touch with
+us first through the issue tracker with your idea so that we can help out and
+possibly guide you. Coordinating up front makes it much easier to avoid
+frustration later on.
+
+### Code reviews
+All submissions, including submissions by project members, require review.
+
+### File headers
+All files in the project must start with the following header.
+
+    // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+    // for details. All rights reserved. Use of this source code is governed by a
+    // BSD-style license that can be found in the LICENSE file.
+
+### The small print
+Contributions made by corporations are covered by a different agreement than the
+one above, the
+[Software Grant and Corporate Contributor License Agreement](https://developers.google.com/open-source/cla/corporate).
diff --git a/mojo/public/dart/third_party/source_map_stack_trace/LICENSE b/mojo/public/dart/third_party/source_map_stack_trace/LICENSE
new file mode 100644
index 0000000..de31e1a
--- /dev/null
+++ b/mojo/public/dart/third_party/source_map_stack_trace/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2015, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/source_map_stack_trace/README.md b/mojo/public/dart/third_party/source_map_stack_trace/README.md
new file mode 100644
index 0000000..86772e5
--- /dev/null
+++ b/mojo/public/dart/third_party/source_map_stack_trace/README.md
@@ -0,0 +1,46 @@
+`source_map_stack_trace` is a package for converting stack traces generated by
+dart2js-compiled JavaScript code into readable native Dart stack traces using
+source maps. For example:
+
+```dart
+import 'package:source_map_stack_trace/source_map_stack_trace.dart';
+
+void main() {
+  var jsTrace = // Get a StackTrace generated by dart2js.
+  var mapping = // Get a source map mapping the JS to the Dart source.
+
+  // Convert jsTrace to refer to the Dart source instead.
+  var dartTrace = mapStackTrace(jsTrace, sourceMap);
+  print(dartTrace);
+}
+```
+
+This can convert the following JavaScript trace:
+
+```
+expect_async_test.dart.browser_test.dart.js 2636:15   dart.wrapException
+expect_async_test.dart.browser_test.dart.js 14661:15  main__closure16.call$0
+expect_async_test.dart.browser_test.dart.js 18237:26  Declarer_test__closure.call$1
+expect_async_test.dart.browser_test.dart.js 17905:23  StackZoneSpecification_registerUnaryCallback__closure.call$0
+expect_async_test.dart.browser_test.dart.js 17876:16  StackZoneSpecification._stack_zone_specification$_run$2
+expect_async_test.dart.browser_test.dart.js 17899:26  StackZoneSpecification_registerUnaryCallback_closure.call$1
+expect_async_test.dart.browser_test.dart.js 6115:16   _rootRunUnary
+expect_async_test.dart.browser_test.dart.js 8576:39   _CustomZone.runUnary$2
+expect_async_test.dart.browser_test.dart.js 7135:57   _Future__propagateToListeners_handleValueCallback.call$0
+expect_async_test.dart.browser_test.dart.js 7031:147  dart._Future.static._Future__propagateToListeners
+```
+
+to:
+
+```
+dart:_internal/compiler/js_lib/js_helper.dart 1210:1          wrapException
+test/frontend/expect_async_test.dart 24:5                     main.<fn>.<fn>
+package:test/src/backend/declarer.dart 45:48                  Declarer.test.<fn>.<fn>
+package:stack_trace/src/stack_zone_specification.dart 134:30  StackZoneSpecification.registerUnaryCallback.<fn>.<fn>
+package:stack_trace/src/stack_zone_specification.dart 210:7   StackZoneSpecification._run
+package:stack_trace/src/stack_zone_specification.dart 135:5   StackZoneSpecification.registerUnaryCallback.<fn>
+dart:async/zone.dart 904:14                                   _rootRunUnary
+dart:async/zone.dart 806:3                                    _CustomZone.runUnary
+dart:async/future_impl.dart 486:13                            _Future._propagateToListeners.handleValueCallback
+dart:async/future_impl.dart 567:32                            _Future._propagateToListeners
+```
diff --git a/mojo/public/dart/third_party/source_map_stack_trace/codereview.settings b/mojo/public/dart/third_party/source_map_stack_trace/codereview.settings
new file mode 100644
index 0000000..78c567f
--- /dev/null
+++ b/mojo/public/dart/third_party/source_map_stack_trace/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: https://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/source_map_stack_trace/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/source_map_stack_trace/lib/source_map_stack_trace.dart b/mojo/public/dart/third_party/source_map_stack_trace/lib/source_map_stack_trace.dart
new file mode 100644
index 0000000..893135f
--- /dev/null
+++ b/mojo/public/dart/third_party/source_map_stack_trace/lib/source_map_stack_trace.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library source_map_stack_trace;
+
+import 'package:path/path.dart' as p;
+import 'package:source_maps/source_maps.dart';
+import 'package:stack_trace/stack_trace.dart';
+
+/// Convert [stackTrace], a stack trace generated by dart2js-compiled
+/// JavaScript, to a native-looking stack trace using [sourceMap].
+///
+/// [minified] indicates whether or not the dart2js code was minified. If it
+/// hasn't, this tries to clean up the stack frame member names.
+///
+/// [packageRoot] is the URI (usually a `file:` URI) for the package root that
+/// was used by dart2js. It can be a [String] or a [Uri]. If it's passed, stack
+/// frames from packages will use `package:` URLs.
+///
+/// [sdkRoot] is the URI (usually a `file:` URI) for the SDK containing dart2js.
+/// It can be a [String] or a [Uri]. If it's passed, stack frames from the SDK
+/// will have `dart:` URLs.
+StackTrace mapStackTrace(Mapping sourceMap, StackTrace stackTrace,
+    {bool minified: false, packageRoot, sdkRoot}) {
+  if (stackTrace is Chain) {
+    return new Chain(stackTrace.traces.map((trace) {
+      return new Trace.from(mapStackTrace(sourceMap, trace,
+          minified: minified, packageRoot: packageRoot, sdkRoot: sdkRoot));
+    }));
+  }
+
+  if (packageRoot != null && packageRoot is! String && packageRoot is! Uri) {
+    throw new ArgumentError(
+        'packageRoot must be a String or a Uri, was "$packageRoot".');
+  }
+
+  if (sdkRoot != null && sdkRoot is! String && sdkRoot is! Uri) {
+    throw new ArgumentError(
+        'sdkRoot must be a String or a Uri, was "$sdkRoot".');
+  }
+
+  packageRoot = packageRoot == null ? null : packageRoot.toString();
+  var sdkLib = sdkRoot == null ? null : "$sdkRoot/lib";
+
+  var trace = new Trace.from(stackTrace);
+  return new Trace(trace.frames.map((frame) {
+    // If there's no line information, there's no way to translate this frame.
+    // We could return it as-is, but these lines are usually not useful anyways.
+    if (frame.line == null) return null;
+
+    // If there's no column, try using the first column of the line.
+    var column = frame.column == null ? 0 : frame.column;
+
+    // Subtract 1 because stack traces use 1-indexed lines and columns and
+    // source maps uses 0-indexed.
+    var span = sourceMap.spanFor(frame.line - 1, column - 1);
+
+    // If we can't find a source span, ignore the frame. It's probably something
+    // internal that the user doesn't care about.
+    if (span == null) return null;
+
+    var sourceUrl = span.sourceUrl.toString();
+    if (sdkRoot != null && p.url.isWithin(sdkLib, sourceUrl)) {
+      sourceUrl = "dart:" + p.url.relative(sourceUrl, from: sdkLib);
+    } else if (packageRoot != null && p.url.isWithin(packageRoot, sourceUrl)) {
+      sourceUrl = "package:" +
+          p.url.relative(sourceUrl, from: packageRoot);
+    }
+
+    return new Frame(
+        Uri.parse(sourceUrl),
+        span.start.line + 1,
+        span.start.column + 1,
+        // If the dart2js output is minified, there's no use trying to prettify
+        // its member names. Use the span's identifier if available, otherwise
+        // use the minified member name.
+        minified
+            ? (span.isIdentifier ? span.text : frame.member)
+            : _prettifyMember(frame.member));
+  }).where((frame) => frame != null));
+}
+
+/// Reformats a JS member name to make it look more Dart-like.
+String _prettifyMember(String member) {
+  return member
+      // Get rid of the noise that Firefox sometimes adds.
+      .replaceAll(new RegExp(r"/?<$"), "")
+      // Get rid of arity indicators.
+      .replaceAll(new RegExp(r"\$\d+$"), "")
+      // Convert closures to <fn>.
+      .replaceAllMapped(new RegExp(r"(_+)closure\d*\.call$"),
+          // The number of underscores before "closure" indicates how nested it
+          // is.
+          (match) => ".<fn>" * match[1].length)
+      // Get rid of explicitly-generated calls.
+      .replaceAll(new RegExp(r"\.call$"), "")
+      // Get rid of the top-level method prefix.
+      .replaceAll(new RegExp(r"^dart\."), "")
+      // Get rid of library namespaces.
+      .replaceAll(new RegExp(r"[a-zA-Z_0-9]+\$"), "")
+      // Get rid of the static method prefix. The class name also exists in the
+      // invocation, so we're not getting rid of any information.
+      .replaceAll(new RegExp(r"^[a-zA-Z_0-9]+.(static|dart)."), "")
+      // Convert underscores after identifiers to dots. This runs the risk of
+      // incorrectly converting members that contain underscores, but those are
+      // contrary to the style guide anyway.
+      .replaceAllMapped(new RegExp(r"([a-zA-Z0-9]+)_"),
+          (match) => match[1] + ".");
+}
diff --git a/mojo/public/dart/third_party/source_map_stack_trace/pubspec.yaml b/mojo/public/dart/third_party/source_map_stack_trace/pubspec.yaml
new file mode 100644
index 0000000..0933aa2
--- /dev/null
+++ b/mojo/public/dart/third_party/source_map_stack_trace/pubspec.yaml
@@ -0,0 +1,16 @@
+name: source_map_stack_trace
+version: 1.0.4
+description: >
+  A package for applying source maps to stack traces.
+author: Dart Team <misc@dartlang.org>
+homepage: https://github.com/dart-lang/source_map_stack_trace
+
+dependencies:
+  stack_trace: "^1.0.0"
+  source_maps: "^0.10.0"
+
+dev_dependencies:
+  test: "^0.12.0-dev.1"
+
+environment:
+  sdk: '>=1.8.0 <2.0.0'
diff --git a/mojo/public/dart/third_party/source_map_stack_trace/test/source_map_stack_trace_test.dart b/mojo/public/dart/third_party/source_map_stack_trace/test/source_map_stack_trace_test.dart
new file mode 100644
index 0000000..ffaaaee
--- /dev/null
+++ b/mojo/public/dart/third_party/source_map_stack_trace/test/source_map_stack_trace_test.dart
@@ -0,0 +1,197 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:source_maps/source_maps.dart';
+import 'package:source_span/source_span.dart';
+import 'package:stack_trace/stack_trace.dart';
+import 'package:source_map_stack_trace/source_map_stack_trace.dart';
+import 'package:test/test.dart';
+
+/// A simple [Mapping] for tests that don't need anything special.
+final _simpleMapping = parseJson(
+    (new SourceMapBuilder()
+        ..addSpan(
+            new SourceMapSpan.identifier(
+                new SourceLocation(1,
+                    line: 1, column: 3, sourceUrl: "foo.dart"),
+                "qux"),
+            new SourceSpan(
+                new SourceLocation(8, line: 5, column: 0),
+                new SourceLocation(18, line: 15, column: 0),
+                "\n" * 10)))
+        .build("foo.dart.js.map"));
+
+void main() {
+  test("maps a JS line and column to a Dart line and span", () {
+    var trace = new Trace.parse("foo.dart.js 10:11  foo");
+    var frame = mapStackTrace(_simpleMapping, trace).frames.first;
+    expect(frame.uri, equals(Uri.parse("foo.dart")));
+
+    // These are +1 because stack_trace is 1-based whereas source_span is
+    // 0-basd.
+    expect(frame.line, equals(2));
+    expect(frame.column, equals(4));
+  });
+
+  test("ignores JS frames without line info", () {
+    var trace = new Trace.parse("""
+foo.dart.js 10:11  foo
+foo.dart.js        bar
+foo.dart.js 10:11  baz
+""");
+    var frames = mapStackTrace(_simpleMapping, trace).frames;
+
+    expect(frames.length, equals(2));
+    expect(frames.first.member, equals("foo"));
+    expect(frames.last.member, equals("baz"));
+  });
+
+  test("ignores JS frames without corresponding spans", () {
+    var trace = new Trace.parse("""
+foo.dart.js 10:11  foo
+foo.dart.js 1:1   bar
+foo.dart.js 10:11  baz
+""");
+
+    var frames = mapStackTrace(_simpleMapping, trace).frames;
+
+    expect(frames.length, equals(2));
+    expect(frames.first.member, equals("foo"));
+    expect(frames.last.member, equals("baz"));
+  });
+
+  test("falls back to column 0 for unlisted column", () {
+    var trace = new Trace.parse("foo.dart.js 10  foo");
+    var builder = new SourceMapBuilder()
+        ..addSpan(
+            new SourceMapSpan.identifier(
+                new SourceLocation(1,
+                    line: 1, column: 3, sourceUrl: "foo.dart"),
+                "qux"),
+            new SourceSpan(
+                new SourceLocation(8, line: 5, column: 0),
+                new SourceLocation(12, line: 9, column: 1),
+                "\n" * 4));
+
+    var mapping = parseJson(builder.build("foo.dart.js.map"));
+    var frame = mapStackTrace(mapping, trace).frames.first;
+    expect(frame.uri, equals(Uri.parse("foo.dart")));
+    expect(frame.line, equals(2));
+    expect(frame.column, equals(4));
+  });
+
+  test("uses package: URIs for frames within packageRoot", () {
+    var trace = new Trace.parse("foo.dart.js 10  foo");
+    var builder = new SourceMapBuilder()
+        ..addSpan(
+            new SourceMapSpan.identifier(
+                new SourceLocation(1,
+                    line: 1, column: 3, sourceUrl: "packages/foo/foo.dart"),
+                "qux"),
+            new SourceSpan(
+                new SourceLocation(8, line: 5, column: 0),
+                new SourceLocation(12, line: 9, column: 1),
+                "\n" * 4));
+
+    var mapping = parseJson(builder.build("foo.dart.js.map"));
+    var frame = mapStackTrace(mapping, trace, packageRoot: "packages/")
+        .frames.first;
+    expect(frame.uri, equals(Uri.parse("package:foo/foo.dart")));
+    expect(frame.line, equals(2));
+    expect(frame.column, equals(4));
+  });
+
+  test("uses dart: URIs for frames within sdkRoot", () {
+    var trace = new Trace.parse("foo.dart.js 10  foo");
+    var builder = new SourceMapBuilder()
+        ..addSpan(
+            new SourceMapSpan.identifier(
+                new SourceLocation(1,
+                    line: 1, column: 3, sourceUrl: "sdk/lib/async/foo.dart"),
+                "qux"),
+            new SourceSpan(
+                new SourceLocation(8, line: 5, column: 0),
+                new SourceLocation(12, line: 9, column: 1),
+                "\n" * 4));
+
+    var mapping = parseJson(builder.build("foo.dart.js.map"));
+    var frame = mapStackTrace(mapping, trace, sdkRoot: "sdk/").frames.first;
+    expect(frame.uri, equals(Uri.parse("dart:async/foo.dart")));
+    expect(frame.line, equals(2));
+    expect(frame.column, equals(4));
+  });
+
+  test("converts a stack chain", () {
+    var trace = new Chain([
+      new Trace.parse("foo.dart.js 10:11  foo"),
+      new Trace.parse("foo.dart.js 10:11  bar")
+    ]);
+    var traces = mapStackTrace(_simpleMapping, trace).traces;
+
+    var frame = traces.first.frames.single;
+    expect(frame.uri, equals(Uri.parse("foo.dart")));
+    expect(frame.member, equals("foo"));
+    expect(frame.line, equals(2));
+    expect(frame.column, equals(4));
+
+    frame = traces.last.frames.single;
+    expect(frame.uri, equals(Uri.parse("foo.dart")));
+    expect(frame.member, equals("bar"));
+    expect(frame.line, equals(2));
+    expect(frame.column, equals(4));
+  });
+
+  group("cleans up", () {
+    test("Firefox junk", () {
+      expect(_prettify("foo/<"), equals("foo"));
+      expect(_prettify("foo<"), equals("foo"));
+    });
+
+    test("arity indicators", () {
+      expect(_prettify(r"foo$1"), equals("foo"));
+      expect(_prettify(r"foo$1234"), equals("foo"));
+    });
+
+    test("closures", () {
+      expect(_prettify("foo_closure.call"), equals("foo.<fn>"));
+    });
+
+    test("nested closures", () {
+      expect(_prettify("foo__closure.call"), equals("foo.<fn>.<fn>"));
+      expect(_prettify("foo____closure.call"),
+          equals("foo.<fn>.<fn>.<fn>.<fn>"));
+    });
+
+    test(".call", () {
+      expect(_prettify("foo.call"), equals("foo"));
+    });
+
+    test("top-level functions", () {
+      expect(_prettify("dart.foo"), equals("foo"));
+    });
+
+    test("library namespaces", () {
+      expect(_prettify(r"my_library$foo"), equals("foo"));
+    });
+
+    test("static methods", () {
+      expect(_prettify(r"Foo.static.foo"), equals("foo"));
+    });
+
+    test("instance methods", () {
+      expect(_prettify(r"Foo_bar__baz"), equals("Foo.bar._baz"));
+    });
+
+    test("lots of stuff", () {
+      expect(_prettify(r"lib$Foo.static.lib$Foo_closure.call$0/<"),
+          equals("Foo.<fn>"));
+    });
+  });
+}
+
+/// Runs the mapper's prettification logic on [member] and returns the result.
+String _prettify(String member) {
+  var trace = new Trace([new Frame(Uri.parse("foo.dart.js"), 10, 11, member)]);
+  return mapStackTrace(_simpleMapping, trace).frames.first.member;
+}
diff --git a/mojo/public/dart/third_party/source_maps/.gitignore b/mojo/public/dart/third_party/source_maps/.gitignore
new file mode 100644
index 0000000..388eff0
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/.gitignore
@@ -0,0 +1,14 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.pub/
+build/
+packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/source_maps/.status b/mojo/public/dart/third_party/source_maps/.status
new file mode 100644
index 0000000..befa7dd
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/.status
@@ -0,0 +1,20 @@
+# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Skip non-test files ending with "_test".
+packages/*: Skip
+*/packages/*: Skip
+*/*/packages/*: Skip
+*/*/*/packages/*: Skip
+*/*/*/*packages/*: Skip
+*/*/*/*/*packages/*: Skip
+
+# Only run tests from the build directory, since we don't care about the
+# difference between transformed an untransformed code.
+test/*: Skip
+
+[ $compiler == dart2js || $compiler == dart2dart ]
+build/test/vlq_test: RuntimeError # A VLQ test checks for large numbers that
+                                  # overflow in JS (numbers slightly larger than
+                                  # 32 bits where we do bitwise operations).
diff --git a/mojo/public/dart/third_party/source_maps/CHANGELOG.md b/mojo/public/dart/third_party/source_maps/CHANGELOG.md
new file mode 100644
index 0000000..3066293
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/CHANGELOG.md
@@ -0,0 +1,52 @@
+## 0.10.1
+
+* Add a `mapUrl` named argument to `parse` and `parseJson`. This argument is
+  used to resolve source URLs for source spans.
+
+## 0.10.0+2
+
+* Fix analyzer error (FileSpan has a new field since `source_span` 1.1.1)
+
+## 0.10.0+1
+
+* Remove an unnecessary warning printed when the "file" field is missing from a
+  Json formatted source map. This field is optional and its absence is not
+  unusual.
+
+## 0.10.0
+
+* Remove the `Span`, `Location` and `SourceFile` classes. Use the
+  corresponding `source_span` classes instead.
+
+## 0.9.4
+
+* Update `SpanFormatException` with `source` and `offset`.
+
+* All methods that take `Span`s, `Location`s, and `SourceFile`s as inputs now
+  also accept the corresponding `source_span` classes as well. Using the old
+  classes is now deprecated and will be unsupported in version 0.10.0.
+
+## 0.9.3
+
+* Support writing SingleMapping objects to source map version 3 format.
+* Support the `sourceRoot` field in the SingleMapping class.
+* Support updating the `targetUrl` field in the SingleMapping class.
+
+## 0.9.2+2
+
+* Fix a bug in `FixedSpan.getLocationMessage`.
+
+## 0.9.2+1
+
+* Minor readability improvements to `FixedSpan.getLocationMessage` and
+  `SpanException.toString`.
+
+## 0.9.2
+
+* Add `SpanException` and `SpanFormatException` classes.
+
+## 0.9.1
+
+* Support unmapped areas in source maps.
+
+* Increase the readability of location messages.
diff --git a/mojo/public/dart/third_party/source_maps/LICENSE b/mojo/public/dart/third_party/source_maps/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/source_maps/README.md b/mojo/public/dart/third_party/source_maps/README.md
new file mode 100644
index 0000000..5c7f638
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/README.md
@@ -0,0 +1,29 @@
+Source Maps
+===========
+
+This project implements a Dart pub package to work with source maps. The
+implementation is based on the [source map version 3 spec][spec] which was
+originated from the [Closure Compiler][closure] and has been implemented in
+Chrome and Firefox.
+
+In this package we provide:
+
+  * Data types defining file locations and spans: these are not part of the
+    original source map specification. These data types are great for tracking
+    source locations on source maps, but they can also be used by tools to
+    reporting useful error messages that include on source locations.
+  * A builder that creates a source map programatically and produces the encoded
+    source map format.
+  * A parser that reads the source map format and provides APIs to read the
+    mapping information.
+
+Some upcoming features we are planning to add to this package are:
+
+  * A printer that lets you generate code, but record source map information in
+    the process.
+  * A tool that can compose source maps together. This would be useful for
+    instance, if you have 2 tools that produce source maps and you call one with
+    the result of the other.
+
+[closure]: http://code.google.com/p/closure-compiler/wiki/SourceMaps
+[spec]: https://docs.google.com/a/google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit
diff --git a/mojo/public/dart/third_party/source_maps/codereview.settings b/mojo/public/dart/third_party/source_maps/codereview.settings
new file mode 100644
index 0000000..313ad0a
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: http://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/source_maps/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/source_maps/lib/builder.dart b/mojo/public/dart/third_party/source_maps/lib/builder.dart
new file mode 100644
index 0000000..091e220
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/lib/builder.dart
@@ -0,0 +1,88 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Contains a builder object useful for creating source maps programatically.
+library source_maps.builder;
+
+// TODO(sigmund): add a builder for multi-section mappings.
+
+import 'dart:convert';
+
+import 'package:source_span/source_span.dart';
+
+import 'parser.dart';
+import 'src/source_map_span.dart';
+
+/// Builds a source map given a set of mappings.
+class SourceMapBuilder {
+
+  final List<Entry> _entries = <Entry>[];
+
+  /// Adds an entry mapping the [targetOffset] to [source].
+  void addFromOffset(SourceLocation source, SourceFile targetFile,
+      int targetOffset, String identifier) {
+    if (targetFile == null) {
+      throw new ArgumentError('targetFile cannot be null');
+    }
+    _entries.add(
+        new Entry(source, targetFile.location(targetOffset), identifier));
+  }
+
+  /// Adds an entry mapping [target] to [source].
+  ///
+  /// If [isIdentifier] is true or if [target] is a [SourceMapSpan] with
+  /// `isIdentifier` set to true, this entry is considered to represent an
+  /// identifier whose value will be stored in the source map. [isIdenfier]
+  /// takes precedence over [target]'s `isIdentifier` value.
+  void addSpan(SourceSpan source, SourceSpan target, {bool isIdentifier}) {
+    if (isIdentifier == null) {
+      isIdentifier = source is SourceMapSpan ? source.isIdentifier : false;
+    }
+
+    var name = isIdentifier ? source.text : null;
+    _entries.add(new Entry(source.start, target.start, name));
+  }
+
+  /// Adds an entry mapping [target] to [source].
+  void addLocation(SourceLocation source, SourceLocation target,
+      String identifier) {
+    _entries.add(new Entry(source, target, identifier));
+  }
+
+  /// Encodes all mappings added to this builder as a json map.
+  Map build(String fileUrl) {
+    return new SingleMapping.fromEntries(this._entries, fileUrl).toJson();
+  }
+
+  /// Encodes all mappings added to this builder as a json string.
+  String toJson(String fileUrl) => JSON.encode(build(fileUrl));
+}
+
+/// An entry in the source map builder.
+class Entry implements Comparable {
+  /// Span denoting the original location in the input source file
+  final SourceLocation source;
+
+  /// Span indicating the corresponding location in the target file.
+  final SourceLocation target;
+
+  /// An identifier name, when this location is the start of an identifier.
+  final String identifierName;
+
+  /// Creates a new [Entry] mapping [target] to [source].
+  Entry(this.source, this.target, this.identifierName);
+
+  /// Implements [Comparable] to ensure that entries are ordered by their
+  /// location in the target file. We sort primarily by the target offset
+  /// because source map files are encoded by printing each mapping in order as
+  /// they appear in the target file.
+  int compareTo(Entry other) {
+    int res = target.compareTo(other.target);
+    if (res != 0) return res;
+    res = source.sourceUrl.toString().compareTo(
+        other.source.sourceUrl.toString());
+    if (res != 0) return res;
+    return source.compareTo(other.source);
+  }
+}
diff --git a/mojo/public/dart/third_party/source_maps/lib/parser.dart b/mojo/public/dart/third_party/source_maps/lib/parser.dart
new file mode 100644
index 0000000..a9fcff5
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/lib/parser.dart
@@ -0,0 +1,531 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Contains the top-level function to parse source maps version 3.
+library source_maps.parser;
+
+import 'dart:collection';
+import 'dart:convert';
+
+import 'package:source_span/source_span.dart';
+
+import 'builder.dart' as builder;
+import 'src/source_map_span.dart';
+import 'src/utils.dart';
+import 'src/vlq.dart';
+
+/// Parses a source map directly from a json string.
+///
+/// [mapUrl], which may be either a [String] or a [Uri], indicates the URL of
+/// the source map file itself. If it's passed, any URLs in the source
+/// map will be interpreted as relative to this URL when generating spans.
+// TODO(sigmund): evaluate whether other maps should have the json parsed, or
+// the string represenation.
+// TODO(tjblasi): Ignore the first line of [jsonMap] if the JSON safety string
+// `)]}'` begins the string representation of the map.
+Mapping parse(String jsonMap, {Map<String, Map> otherMaps, mapUrl}) =>
+  parseJson(JSON.decode(jsonMap), otherMaps: otherMaps, mapUrl: mapUrl);
+
+/// Parses a source map directly from a json map object.
+///
+/// [mapUrl], which may be either a [String] or a [Uri], indicates the URL of
+/// the source map file itself. If it's passed, any URLs in the source
+/// map will be interpreted as relative to this URL when generating spans.
+Mapping parseJson(Map map, {Map<String, Map> otherMaps, mapUrl}) {
+  if (map['version'] != 3) {
+    throw new ArgumentError(
+        'unexpected source map version: ${map["version"]}. '
+        'Only version 3 is supported.');
+  }
+
+  if (map.containsKey('sections')) {
+    if (map.containsKey('mappings') || map.containsKey('sources') ||
+        map.containsKey('names')) {
+      throw new FormatException('map containing "sections" '
+          'cannot contain "mappings", "sources", or "names".');
+    }
+    return new MultiSectionMapping.fromJson(map['sections'], otherMaps,
+        mapUrl: mapUrl);
+  }
+  return new SingleMapping.fromJson(map, mapUrl: mapUrl);
+}
+
+
+/// A mapping parsed out of a source map.
+abstract class Mapping {
+  /// Returns the span associated with [line] and [column].
+  SourceMapSpan spanFor(int line, int column, {Map<String, SourceFile> files});
+
+  /// Returns the span associated with [location].
+  SourceMapSpan spanForLocation(SourceLocation location,
+      {Map<String, SourceFile> files}) {
+    return spanFor(location.line, location.column, files: files);
+  }
+}
+
+/// A meta-level map containing sections.
+class MultiSectionMapping extends Mapping {
+  /// For each section, the start line offset.
+  final List<int> _lineStart = <int>[];
+
+  /// For each section, the start column offset.
+  final List<int> _columnStart = <int>[];
+
+  /// For each section, the actual source map information, which is not adjusted
+  /// for offsets.
+  final List<Mapping> _maps = <Mapping>[];
+
+  /// Creates a section mapping from json.
+  MultiSectionMapping.fromJson(List sections, Map<String, Map> otherMaps,
+      {mapUrl}) {
+    for (var section in sections) {
+      var offset = section['offset'];
+      if (offset == null) throw new FormatException('section missing offset');
+
+      var line = section['offset']['line'];
+      if (line == null) throw new FormatException('offset missing line');
+
+      var column = section['offset']['column'];
+      if (column == null) throw new FormatException('offset missing column');
+
+      _lineStart.add(line);
+      _columnStart.add(column);
+
+      var url = section['url'];
+      var map = section['map'];
+
+      if (url != null && map != null) {
+        throw new FormatException("section can't use both url and map entries");
+      } else if (url != null) {
+        if (otherMaps == null || otherMaps[url] == null) {
+          throw new FormatException(
+              'section contains refers to $url, but no map was '
+              'given for it. Make sure a map is passed in "otherMaps"');
+        }
+        _maps.add(parseJson(otherMaps[url], otherMaps: otherMaps, mapUrl: url));
+      } else if (map != null) {
+        _maps.add(parseJson(map, otherMaps: otherMaps, mapUrl: mapUrl));
+      } else {
+        throw new FormatException('section missing url or map');
+      }
+    }
+    if (_lineStart.length == 0) {
+      throw new FormatException('expected at least one section');
+    }
+  }
+
+  int _indexFor(line, column) {
+    for(int i = 0; i < _lineStart.length; i++) {
+      if (line < _lineStart[i]) return i - 1;
+      if (line == _lineStart[i] && column < _columnStart[i]) return i - 1;
+    }
+    return _lineStart.length - 1;
+  }
+
+  SourceMapSpan spanFor(int line, int column, {Map<String, SourceFile> files}) {
+    int index = _indexFor(line, column);
+    return _maps[index].spanFor(
+        line - _lineStart[index], column - _columnStart[index], files: files);
+  }
+
+  String toString() {
+    var buff = new StringBuffer("$runtimeType : [");
+    for (int i = 0; i < _lineStart.length; i++) {
+      buff..write('(')
+          ..write(_lineStart[i])
+          ..write(',')
+          ..write(_columnStart[i])
+          ..write(':')
+          ..write(_maps[i])
+          ..write(')');
+    }
+    buff.write(']');
+    return buff.toString();
+  }
+}
+
+/// A map containing direct source mappings.
+class SingleMapping extends Mapping {
+  /// Source urls used in the mapping, indexed by id.
+  final List<String> urls;
+
+  /// Source names used in the mapping, indexed by id.
+  final List<String> names;
+
+  /// Entries indicating the beginning of each span.
+  final List<TargetLineEntry> lines;
+
+  /// Url of the target file.
+  String targetUrl;
+
+  /// Source root prepended to all entries in [urls].
+  String sourceRoot;
+
+  final Uri _mapUrl;
+
+  SingleMapping._(this.targetUrl, this.urls, this.names, this.lines)
+      : _mapUrl = null;
+
+  factory SingleMapping.fromEntries(
+      Iterable<builder.Entry> entries, [String fileUrl]) {
+    // The entries needs to be sorted by the target offsets.
+    var sourceEntries = new List.from(entries)..sort();
+    var lines = <TargetLineEntry>[];
+
+    // Indices associated with file urls that will be part of the source map. We
+    // use a linked hash-map so that `_urls.keys[_urls[u]] == u`
+    var urls = new LinkedHashMap<String, int>();
+
+    // Indices associated with identifiers that will be part of the source map.
+    // We use a linked hash-map so that `_names.keys[_names[n]] == n`
+    var names = new LinkedHashMap<String, int>();
+
+    var lineNum;
+    var targetEntries;
+    for (var sourceEntry in sourceEntries) {
+      if (lineNum == null || sourceEntry.target.line > lineNum) {
+        lineNum = sourceEntry.target.line;
+        targetEntries = <TargetEntry>[];
+        lines.add(new TargetLineEntry(lineNum, targetEntries));
+      }
+
+      if (sourceEntry.source == null) {
+        targetEntries.add(new TargetEntry(sourceEntry.target.column));
+      } else {
+        var sourceUrl = sourceEntry.source.sourceUrl;
+        var urlId = urls.putIfAbsent(
+            sourceUrl == null ? '' : sourceUrl.toString(), () => urls.length);
+        var srcNameId = sourceEntry.identifierName == null ? null :
+            names.putIfAbsent(sourceEntry.identifierName, () => names.length);
+        targetEntries.add(new TargetEntry(
+            sourceEntry.target.column,
+            urlId,
+            sourceEntry.source.line,
+            sourceEntry.source.column,
+            srcNameId));
+      }
+    }
+    return new SingleMapping._(
+        fileUrl, urls.keys.toList(), names.keys.toList(), lines);
+  }
+
+  SingleMapping.fromJson(Map map, {mapUrl})
+      : targetUrl = map['file'],
+        urls = map['sources'],
+        names = map['names'],
+        sourceRoot = map['sourceRoot'],
+        lines = <TargetLineEntry>[],
+        _mapUrl = mapUrl is String ? Uri.parse(mapUrl) : mapUrl {
+    int line = 0;
+    int column = 0;
+    int srcUrlId = 0;
+    int srcLine = 0;
+    int srcColumn = 0;
+    int srcNameId = 0;
+    var tokenizer = new _MappingTokenizer(map['mappings']);
+    var entries = <TargetEntry>[];
+
+    while (tokenizer.hasTokens) {
+      if (tokenizer.nextKind.isNewLine) {
+        if (!entries.isEmpty) {
+          lines.add(new TargetLineEntry(line, entries));
+          entries = <TargetEntry>[];
+        }
+        line++;
+        column = 0;
+        tokenizer._consumeNewLine();
+        continue;
+      }
+
+      // Decode the next entry, using the previous encountered values to
+      // decode the relative values.
+      //
+      // We expect 1, 4, or 5 values. If present, values are expected in the
+      // following order:
+      //   0: the starting column in the current line of the generated file
+      //   1: the id of the original source file
+      //   2: the starting line in the original source
+      //   3: the starting column in the original source
+      //   4: the id of the original symbol name
+      // The values are relative to the previous encountered values.
+      if (tokenizer.nextKind.isNewSegment) throw _segmentError(0, line);
+      column += tokenizer._consumeValue();
+      if (!tokenizer.nextKind.isValue) {
+        entries.add(new TargetEntry(column));
+      } else {
+        srcUrlId += tokenizer._consumeValue();
+        if (srcUrlId >= urls.length) {
+          throw new StateError(
+              'Invalid source url id. $targetUrl, $line, $srcUrlId');
+        }
+        if (!tokenizer.nextKind.isValue) throw _segmentError(2, line);
+        srcLine += tokenizer._consumeValue();
+        if (!tokenizer.nextKind.isValue) throw _segmentError(3, line);
+        srcColumn += tokenizer._consumeValue();
+        if (!tokenizer.nextKind.isValue) {
+          entries.add(new TargetEntry(column, srcUrlId, srcLine, srcColumn));
+        } else {
+          srcNameId += tokenizer._consumeValue();
+          if (srcNameId >= names.length) {
+            throw new StateError(
+                'Invalid name id: $targetUrl, $line, $srcNameId');
+          }
+          entries.add(new TargetEntry(column, srcUrlId, srcLine, srcColumn,
+              srcNameId));
+        }
+      }
+      if (tokenizer.nextKind.isNewSegment) tokenizer._consumeNewSegment();
+    }
+    if (!entries.isEmpty) {
+      lines.add(new TargetLineEntry(line, entries));
+    }
+  }
+
+  /// Encodes the Mapping mappings as a json map.
+  Map toJson() {
+    var buff = new StringBuffer();
+    var line = 0;
+    var column = 0;
+    var srcLine = 0;
+    var srcColumn = 0;
+    var srcUrlId = 0;
+    var srcNameId = 0;
+    var first = true;
+
+    for (var entry in lines) {
+      int nextLine = entry.line;
+      if (nextLine > line) {
+        for (int i = line; i < nextLine; ++i) {
+          buff.write(';');
+        }
+        line = nextLine;
+        column = 0;
+        first = true;
+      }
+
+      for (var segment in entry.entries) {
+        if (!first) buff.write(',');
+        first = false;
+        column = _append(buff, column, segment.column);
+
+        // Encoding can be just the column offset if there is no source
+        // information.
+        var newUrlId = segment.sourceUrlId;
+        if (newUrlId == null) continue;
+        srcUrlId = _append(buff, srcUrlId, newUrlId);
+        srcLine = _append(buff, srcLine, segment.sourceLine);
+        srcColumn = _append(buff, srcColumn, segment.sourceColumn);
+
+        if (segment.sourceNameId == null) continue;
+        srcNameId = _append(buff, srcNameId, segment.sourceNameId);
+      }
+    }
+
+    var result = {
+      'version': 3,
+      'sourceRoot': sourceRoot == null ? '' : sourceRoot,
+      'sources': urls,
+      'names' : names,
+      'mappings' : buff.toString()
+    };
+    if (targetUrl != null) {
+      result['file'] = targetUrl;
+    }
+    return result;
+  }
+
+  /// Appends to [buff] a VLQ encoding of [newValue] using the difference
+  /// between [oldValue] and [newValue]
+  static int _append(StringBuffer buff, int oldValue, int newValue) {
+    buff.writeAll(encodeVlq(newValue - oldValue));
+    return newValue;
+  }
+
+  _segmentError(int seen, int line) => new StateError(
+      'Invalid entry in sourcemap, expected 1, 4, or 5'
+      ' values, but got $seen.\ntargeturl: $targetUrl, line: $line');
+
+  /// Returns [TargetLineEntry] which includes the location in the target [line]
+  /// number. In particular, the resulting entry is the last entry whose line
+  /// number is lower or equal to [line].
+  TargetLineEntry _findLine(int line) {
+    int index = binarySearch(lines, (e) => e.line > line);
+    return (index <= 0) ? null : lines[index - 1];
+  }
+
+  /// Returns [TargetEntry] which includes the location denoted by
+  /// [line], [column]. If [lineEntry] corresponds to [line], then this will be
+  /// the last entry whose column is lower or equal than [column]. If
+  /// [lineEntry] corresponds to a line prior to [line], then the result will be
+  /// the very last entry on that line.
+  TargetEntry _findColumn(int line, int column, TargetLineEntry lineEntry) {
+    if (lineEntry == null || lineEntry.entries.length == 0) return null;
+    if (lineEntry.line != line) return lineEntry.entries.last;
+    var entries = lineEntry.entries;
+    int index = binarySearch(entries, (e) => e.column > column);
+    return (index <= 0) ? null : entries[index - 1];
+  }
+
+  SourceMapSpan spanFor(int line, int column, {Map<String, SourceFile> files}) {
+    var entry = _findColumn(line, column, _findLine(line));
+    if (entry == null || entry.sourceUrlId == null) return null;
+    var url = urls[entry.sourceUrlId];
+    if (sourceRoot != null) {
+      url = '${sourceRoot}${url}';
+    }
+    if (files != null && files[url] != null) {
+      var file = files[url];
+      var start = file.getOffset(entry.sourceLine, entry.sourceColumn);
+      if (entry.sourceNameId != null) {
+        var text = names[entry.sourceNameId];
+        return new SourceMapFileSpan(
+            files[url].span(start, start + text.length),
+            isIdentifier: true);
+      } else {
+        return new SourceMapFileSpan(files[url].location(start).pointSpan());
+      }
+    } else {
+      var start = new SourceLocation(0,
+          sourceUrl: _mapUrl == null ? url : _mapUrl.resolve(url),
+          line: entry.sourceLine,
+          column: entry.sourceColumn);
+
+      // Offset and other context is not available.
+      if (entry.sourceNameId != null) {
+        return new SourceMapSpan.identifier(start, names[entry.sourceNameId]);
+      } else {
+        return new SourceMapSpan(start, start, '');
+      }
+    }
+  }
+
+  String toString() {
+    return (new StringBuffer("$runtimeType : [")
+        ..write('targetUrl: ')
+        ..write(targetUrl)
+        ..write(', sourceRoot: ')
+        ..write(sourceRoot)
+        ..write(', urls: ')
+        ..write(urls)
+        ..write(', names: ')
+        ..write(names)
+        ..write(', lines: ')
+        ..write(lines)
+        ..write(']')).toString();
+  }
+
+  String get debugString {
+    var buff = new StringBuffer();
+    for (var lineEntry in lines) {
+      var line = lineEntry.line;
+      for (var entry in lineEntry.entries) {
+        buff..write(targetUrl)
+            ..write(': ')
+            ..write(line)
+            ..write(':')
+            ..write(entry.column);
+        if (entry.sourceUrlId != null) {
+          buff..write('   -->   ')
+              ..write(sourceRoot)
+              ..write(urls[entry.sourceUrlId])
+              ..write(': ')
+              ..write(entry.sourceLine)
+              ..write(':')
+              ..write(entry.sourceColumn);
+        }
+        if (entry.sourceNameId != null) {
+          buff..write(' (')
+              ..write(names[entry.sourceNameId])
+              ..write(')');
+        }
+        buff.write('\n');
+      }
+    }
+    return buff.toString();
+  }
+}
+
+/// A line entry read from a source map.
+class TargetLineEntry {
+  final int line;
+  List<TargetEntry> entries;
+  TargetLineEntry(this.line, this.entries);
+
+  String toString() => '$runtimeType: $line $entries';
+}
+
+/// A target segment entry read from a source map
+class TargetEntry {
+  final int column;
+  final int sourceUrlId;
+  final int sourceLine;
+  final int sourceColumn;
+  final int sourceNameId;
+
+  TargetEntry(this.column, [this.sourceUrlId, this.sourceLine,
+      this.sourceColumn, this.sourceNameId]);
+
+  String toString() => '$runtimeType: '
+      '($column, $sourceUrlId, $sourceLine, $sourceColumn, $sourceNameId)';
+}
+
+/** A character iterator over a string that can peek one character ahead. */
+class _MappingTokenizer implements Iterator<String> {
+  final String _internal;
+  final int _length;
+  int index = -1;
+  _MappingTokenizer(String internal)
+      : _internal = internal,
+        _length = internal.length;
+
+  // Iterator API is used by decodeVlq to consume VLQ entries.
+  bool moveNext() => ++index < _length;
+  String get current =>
+      (index >= 0 && index < _length) ?  _internal[index] : null;
+
+  bool get hasTokens => index < _length - 1 && _length > 0;
+
+  _TokenKind get nextKind {
+    if (!hasTokens) return _TokenKind.EOF;
+    var next = _internal[index + 1];
+    if (next == ';') return _TokenKind.LINE;
+    if (next == ',') return _TokenKind.SEGMENT;
+    return _TokenKind.VALUE;
+  }
+
+  int _consumeValue() => decodeVlq(this);
+  void _consumeNewLine() { ++index; }
+  void _consumeNewSegment() { ++index; }
+
+  // Print the state of the iterator, with colors indicating the current
+  // position.
+  String toString() {
+    var buff = new StringBuffer();
+    for (int i = 0; i < index; i++) {
+      buff.write(_internal[i]);
+    }
+    buff.write('[31m');
+    buff.write(current == null ? '' : current);
+    buff.write('[0m');
+    for (int i = index + 1; i < _internal.length; i++) {
+      buff.write(_internal[i]);
+    }
+    buff.write(' ($index)');
+    return buff.toString();
+  }
+}
+
+class _TokenKind {
+  static const _TokenKind LINE = const _TokenKind(isNewLine: true);
+  static const _TokenKind SEGMENT = const _TokenKind(isNewSegment: true);
+  static const _TokenKind EOF = const _TokenKind(isEof: true);
+  static const _TokenKind VALUE = const _TokenKind();
+  final bool isNewLine;
+  final bool isNewSegment;
+  final bool isEof;
+  bool get isValue => !isNewLine && !isNewSegment && !isEof;
+
+  const _TokenKind(
+      {this.isNewLine: false, this.isNewSegment: false, this.isEof: false});
+}
diff --git a/mojo/public/dart/third_party/source_maps/lib/printer.dart b/mojo/public/dart/third_party/source_maps/lib/printer.dart
new file mode 100644
index 0000000..906e260
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/lib/printer.dart
@@ -0,0 +1,252 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Contains a code printer that generates code by recording the source maps.
+library source_maps.printer;
+
+import 'package:source_span/source_span.dart';
+
+import 'builder.dart';
+import 'src/source_map_span.dart';
+
+const int _LF = 10;
+const int _CR = 13;
+
+/// A simple printer that keeps track of offset locations and records source
+/// maps locations.
+class Printer {
+  final String filename;
+  final StringBuffer _buff = new StringBuffer();
+  final SourceMapBuilder _maps = new SourceMapBuilder();
+  String get text => _buff.toString();
+  String get map => _maps.toJson(filename);
+
+  /// Current source location mapping.
+  SourceLocation _loc;
+
+  /// Current line in the buffer;
+  int _line = 0;
+
+  /// Current column in the buffer.
+  int _column = 0;
+
+  Printer(this.filename);
+
+  /// Add [str] contents to the output, tracking new lines to track correct
+  /// positions for span locations. When [projectMarks] is true, this method
+  /// adds a source map location on each new line, projecting that every new
+  /// line in the target file (printed here) corresponds to a new line in the
+  /// source file.
+  void add(String str, {projectMarks: false}) {
+    var chars = str.runes.toList();
+    var length = chars.length;
+    for (int i = 0; i < length; i++) {
+      var c = chars[i];
+      if (c == _LF || (c == _CR && (i + 1 == length || chars[i + 1] != _LF))) {
+        // Return not followed by line-feed is treated as a new line.
+        _line++;
+        _column = 0;
+        if (projectMarks && _loc != null) {
+          if (_loc is FileLocation) {
+            var file = (_loc as FileLocation).file;
+            mark(file.location(file.getOffset(_loc.line + 1)));
+          } else {
+            mark(new SourceLocation(0,
+                sourceUrl: _loc.sourceUrl, line: _loc.line + 1, column: 0));
+          }
+        }
+      } else {
+        _column++;
+      }
+    }
+    _buff.write(str);
+  }
+
+
+  /// Append a [total] number of spaces in the target file. Typically used for
+  /// formatting indentation.
+  void addSpaces(int total) {
+    for (int i = 0; i < total; i++) _buff.write(' ');
+    _column += total;
+  }
+
+  /// Marks that the current point in the target file corresponds to the [mark]
+  /// in the source file, which can be either a [SourceLocation] or a
+  /// [SourceSpan]. When the mark is a [SourceMapSpan] with `isIdentifier` set,
+  /// this also records the name of the identifier in the source map
+  /// information.
+  void mark(mark) {
+    var loc;
+    var identifier = null;
+    if (mark is SourceLocation) {
+      loc = mark;
+    } else if (mark is SourceSpan) {
+      loc = mark.start;
+      if (mark is SourceMapSpan && mark.isIdentifier) identifier = mark.text;
+    }
+    _maps.addLocation(
+        loc,
+        new SourceLocation(_buff.length, line: _line, column: _column),
+        identifier);
+    _loc = loc;
+  }
+}
+
+/// A more advanced printer that keeps track of offset locations to record
+/// source maps, but additionally allows nesting of different kind of items,
+/// including [NestedPrinter]s, and it let's you automatically indent text.
+///
+/// This class is especially useful when doing code generation, where different
+/// peices of the code are generated independently on separate printers, and are
+/// finally put together in the end.
+class NestedPrinter implements NestedItem {
+
+  /// Items recoded by this printer, which can be [String] literals,
+  /// [NestedItem]s, and source map information like [SourceLocation] and
+  /// [SourceSpan].
+  List _items = [];
+
+  /// Internal buffer to merge consecutive strings added to this printer.
+  StringBuffer _buff;
+
+  /// Current indentation, which can be updated from outside this class.
+  int indent;
+
+  /// Item used to indicate that the following item is copied from the original
+  /// source code, and hence we should preserve source-maps on every new line.
+  static final _ORIGINAL = new Object();
+
+  NestedPrinter([this.indent = 0]);
+
+  /// Adds [object] to this printer. [object] can be a [String],
+  /// [NestedPrinter], or anything implementing [NestedItem]. If [object] is a
+  /// [String], the value is appended directly, without doing any formatting
+  /// changes. If you wish to add a line of code with automatic indentation, use
+  /// [addLine] instead.  [NestedPrinter]s and [NestedItem]s are not processed
+  /// until [build] gets called later on. We ensure that [build] emits every
+  /// object in the order that they were added to this printer.
+  ///
+  /// The [location] and [span] parameters indicate the corresponding source map
+  /// location of [object] in the original input. Only one, [location] or
+  /// [span], should be provided at a time.
+  ///
+  /// Indicate [isOriginal] when [object] is copied directly from the user code.
+  /// Setting [isOriginal] will make this printer propagate source map locations
+  /// on every line-break.
+  void add(object, {SourceLocation location, SourceSpan span,
+      bool isOriginal: false}) {
+    if (object is! String || location != null || span != null || isOriginal) {
+      _flush();
+      assert(location == null || span == null);
+      if (location != null) _items.add(location);
+      if (span != null) _items.add(span);
+      if (isOriginal) _items.add(_ORIGINAL);
+    }
+
+    if (object is String) {
+      _appendString(object);
+    } else {
+      _items.add(object);
+    }
+  }
+
+  /// Append `2 * indent` spaces to this printer.
+  void insertIndent() => _indent(indent);
+
+  /// Add a [line], autoindenting to the current value of [indent]. Note,
+  /// indentation is not inferred from the contents added to this printer. If a
+  /// line starts or ends an indentation block, you need to also update [indent]
+  /// accordingly. Also, indentation is not adapted for nested printers. If
+  /// you add a [NestedPrinter] to this printer, its indentation is set
+  /// separately and will not include any the indentation set here.
+  ///
+  /// The [location] and [span] parameters indicate the corresponding source map
+  /// location of [object] in the original input. Only one, [location] or
+  /// [span], should be provided at a time.
+  void addLine(String line, {SourceLocation location, SourceSpan span}) {
+    if (location != null || span != null) {
+      _flush();
+      assert(location == null || span == null);
+      if (location != null) _items.add(location);
+      if (span != null) _items.add(span);
+    }
+    if (line == null) return;
+    if (line != '') {
+      // We don't indent empty lines.
+      _indent(indent);
+      _appendString(line);
+    }
+    _appendString('\n');
+  }
+
+  /// Appends a string merging it with any previous strings, if possible.
+  void _appendString(String s) {
+    if (_buff == null) _buff = new StringBuffer();
+    _buff.write(s);
+  }
+
+  /// Adds all of the current [_buff] contents as a string item.
+  void _flush() {
+    if (_buff != null) {
+      _items.add(_buff.toString());
+      _buff = null;
+    }
+  }
+
+  void _indent(int indent) {
+    for (int i = 0; i < indent; i++) _appendString('  ');
+  }
+
+  /// Returns a string representation of all the contents appended to this
+  /// printer, including source map location tokens.
+  String toString() {
+    _flush();
+    return (new StringBuffer()..writeAll(_items)).toString();
+  }
+
+  /// [Printer] used during the last call to [build], if any.
+  Printer printer;
+
+  /// Returns the text produced after calling [build].
+  String get text => printer.text;
+
+  /// Returns the source-map information produced after calling [build].
+  String get map => printer.map;
+
+  /// Builds the output of this printer and source map information. After
+  /// calling this function, you can use [text] and [map] to retrieve the
+  /// geenrated code and source map information, respectively.
+  void build(String filename) {
+    writeTo(printer = new Printer(filename));
+  }
+
+  /// Implements the [NestedItem] interface.
+  void writeTo(Printer printer) {
+    _flush();
+    bool propagate = false;
+    for (var item in _items) {
+      if (item is NestedItem) {
+        item.writeTo(printer);
+      } else if (item is String) {
+        printer.add(item, projectMarks: propagate);
+        propagate = false;
+      } else if (item is SourceLocation || item is SourceSpan) {
+        printer.mark(item);
+      } else if (item == _ORIGINAL) {
+        // we insert booleans when we are about to quote text that was copied
+        // from the original source. In such case, we will propagate marks on
+        // every new-line.
+        propagate = true;
+      } else {
+        throw new UnsupportedError('Unknown item type: $item');
+      }
+    }
+  }
+}
+
+/// An item added to a [NestedPrinter].
+abstract class NestedItem {
+  /// Write the contents of this item into [printer].
+  void writeTo(Printer printer);
+}
diff --git a/mojo/public/dart/third_party/source_maps/lib/refactor.dart b/mojo/public/dart/third_party/source_maps/lib/refactor.dart
new file mode 100644
index 0000000..a33b86b
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/lib/refactor.dart
@@ -0,0 +1,133 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Tools to help implement refactoring like transformations to Dart code.
+///
+/// [TextEditTransaction] supports making a series of changes to a text buffer.
+/// [guessIndent] helps to guess the appropriate indentiation for the new code.
+library source_maps.refactor;
+
+import 'package:source_span/source_span.dart';
+
+import 'printer.dart';
+
+/// Editable text transaction.
+///
+/// Applies a series of edits using original location
+/// information, and composes them into the edited string.
+class TextEditTransaction {
+  final SourceFile file;
+  final String original;
+  final _edits = <_TextEdit>[];
+
+  /// Creates a new transaction.
+  TextEditTransaction(this.original, this.file);
+
+  bool get hasEdits => _edits.length > 0;
+
+  /// Edit the original text, replacing text on the range [begin] and [end]
+  /// with the [replacement]. [replacement] can be either a string or a
+  /// [NestedPrinter].
+  void edit(int begin, int end, replacement) {
+    _edits.add(new _TextEdit(begin, end, replacement));
+  }
+
+  /// Create a source map [SourceLocation] for [offset].
+  SourceLocation _loc(int offset) =>
+      file != null ? file.location(offset) : null;
+
+  /// Applies all pending [edit]s and returns a [NestedPrinter] containing the
+  /// rewritten string and source map information. [filename] is given to the
+  /// underlying printer to indicate the name of the generated file that will
+  /// contains the source map information.
+  /// 
+  /// Throws [UnsupportedError] if the edits were overlapping. If no edits were
+  /// made, the printer simply contains the original string.
+  NestedPrinter commit() {
+    var printer = new NestedPrinter();
+    if (_edits.length == 0) {
+      return printer..add(original, location: _loc(0), isOriginal: true);
+    }
+
+    // Sort edits by start location.
+    _edits.sort();
+
+    int consumed = 0;
+    for (var edit in _edits) {
+      if (consumed > edit.begin) {
+        var sb = new StringBuffer();
+        sb..write(file.location(edit.begin).toolString)
+            ..write(': overlapping edits. Insert at offset ')
+            ..write(edit.begin)
+            ..write(' but have consumed ')
+            ..write(consumed)
+            ..write(' input characters. List of edits:');
+        for (var e in _edits) sb..write('\n    ')..write(e);
+        throw new UnsupportedError(sb.toString());
+      }
+
+      // Add characters from the original string between this edit and the last
+      // one, if any.
+      var betweenEdits = original.substring(consumed, edit.begin);
+      printer..add(betweenEdits, location: _loc(consumed), isOriginal: true)
+             ..add(edit.replace, location: _loc(edit.begin));
+      consumed = edit.end;
+    }
+
+    // Add any text from the end of the original string that was not replaced.
+    printer.add(original.substring(consumed),
+        location: _loc(consumed), isOriginal: true);
+    return printer;
+  }
+}
+
+class _TextEdit implements Comparable<_TextEdit> {
+  final int begin;
+  final int end;
+
+  /// The replacement used by the edit, can be a string or a [NestedPrinter].
+  final replace;
+
+  _TextEdit(this.begin, this.end, this.replace);
+
+  int get length => end - begin;
+
+  String toString() => '(Edit @ $begin,$end: "$replace")';
+
+  int compareTo(_TextEdit other) {
+    int diff = begin - other.begin;
+    if (diff != 0) return diff;
+    return end - other.end;
+  }
+}
+
+/// Returns all whitespace characters at the start of [charOffset]'s line.
+String guessIndent(String code, int charOffset) {
+  // Find the beginning of the line
+  int lineStart = 0;
+  for (int i = charOffset - 1; i >= 0; i--) {
+    var c = code.codeUnitAt(i);
+    if (c == _LF || c == _CR) {
+      lineStart = i + 1;
+      break;
+    }
+  }
+
+  // Grab all the whitespace
+  int whitespaceEnd = code.length;
+  for (int i = lineStart; i < code.length; i++) {
+    var c = code.codeUnitAt(i);
+    if (c != _SPACE && c != _TAB) {
+      whitespaceEnd = i;
+      break;
+    }
+  }
+
+  return code.substring(lineStart, whitespaceEnd);
+}
+
+const int _CR = 13;
+const int _LF = 10;
+const int _TAB = 9;
+const int _SPACE = 32;
diff --git a/mojo/public/dart/third_party/source_maps/lib/source_maps.dart b/mojo/public/dart/third_party/source_maps/lib/source_maps.dart
new file mode 100644
index 0000000..9531903
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/lib/source_maps.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Library to create and parse source maps.
+///
+/// Create a source map using [SourceMapBuilder]. For example:
+///     var json = (new SourceMapBuilder()
+///         ..add(inputSpan1, outputSpan1)
+///         ..add(inputSpan2, outputSpan2)
+///         ..add(inputSpan3, outputSpan3)
+///         .toJson(outputFile);
+///
+/// Use the source_span package's [SourceSpan] and [SourceFile] classes to
+/// specify span locations.
+///
+/// Parse a source map using [parse], and call `spanFor` on the returned mapping
+/// object. For example:
+///     var mapping = parse(json);
+///     mapping.spanFor(outputSpan1.line, outputSpan1.column)
+///
+/// ## Getting the code ##
+///
+/// This library is distributed as a [pub][] package. To install this package,
+/// add the following to your `pubspec.yaml` file:
+///
+///     dependencies:
+///       source_maps: any
+///
+/// After you run `pub install`, you should be able to access this library by
+/// importing `package:source_maps/source_maps.dart`.
+///
+/// For more information, see the
+/// [source_maps package on pub.dartlang.org][pkg].
+///
+/// [pub]: http://pub.dartlang.org
+/// [pkg]: http://pub.dartlang.org/packages/source_maps
+library source_maps;
+
+export "builder.dart";
+export "parser.dart";
+export "printer.dart";
+export "refactor.dart";
+export 'src/source_map_span.dart';
diff --git a/mojo/public/dart/third_party/source_maps/lib/src/source_map_span.dart b/mojo/public/dart/third_party/source_maps/lib/src/source_map_span.dart
new file mode 100644
index 0000000..b70bdfe
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/lib/src/source_map_span.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library source_maps.source_map_span;
+
+import 'package:source_span/source_span.dart';
+
+/// A [SourceSpan] for spans coming from or being written to source maps.
+///
+/// These spans have an extra piece of metadata: whether or not they represent
+/// an identifier (see [isIdentifier]).
+class SourceMapSpan extends SourceSpanBase {
+  /// Whether this span represents an identifier.
+  ///
+  /// If this is `true`, [text] is the value of the identifier.
+  final bool isIdentifier;
+
+  SourceMapSpan(SourceLocation start, SourceLocation end, String text,
+          {this.isIdentifier: false})
+      : super(start, end, text);
+
+  /// Creates a [SourceMapSpan] for an identifier with value [text] starting at
+  /// [start].
+  ///
+  /// The [end] location is determined by adding [text] to [start].
+  SourceMapSpan.identifier(SourceLocation start, String text)
+      : this(
+          start,
+          new SourceLocation(start.offset + text.length,
+              sourceUrl: start.sourceUrl,
+              line: start.line,
+              column: start.column + text.length),
+          text,
+          isIdentifier: true);
+}
+
+/// A wrapper aruond a [FileSpan] that implements [SourceMapSpan].
+class SourceMapFileSpan implements SourceMapSpan, FileSpan {
+  final FileSpan _inner;
+  final bool isIdentifier;
+
+  SourceFile get file => _inner.file;
+  FileLocation get start => _inner.start;
+  FileLocation get end => _inner.end;
+  String get text => _inner.text;
+  String get context => _inner.context;
+  Uri get sourceUrl => _inner.sourceUrl;
+  int get length => _inner.length;
+
+  SourceMapFileSpan(this._inner, {this.isIdentifier: false});
+
+  int compareTo(SourceSpan other) => _inner.compareTo(other);
+  SourceSpan union(SourceSpan other) => _inner.union(other);
+  FileSpan expand(FileSpan other) => _inner.expand(other);
+  String message(String message, {color}) =>
+      _inner.message(message, color: color);
+  String toString() => _inner.toString()
+      .replaceAll("FileSpan", "SourceMapFileSpan");
+}
diff --git a/mojo/public/dart/third_party/source_maps/lib/src/utils.dart b/mojo/public/dart/third_party/source_maps/lib/src/utils.dart
new file mode 100644
index 0000000..78f098e
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/lib/src/utils.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Utilities that shouldn't be in this package.
+library source_maps.utils;
+
+/// Find the first entry in a sorted [list] that matches a monotonic predicate.
+/// Given a result `n`, that all items before `n` will not match, `n` matches,
+/// and all items after `n` match too. The result is -1 when there are no
+/// items, 0 when all items match, and list.length when none does.
+// TODO(sigmund): remove this function after dartbug.com/5624 is fixed.
+int binarySearch(List list, bool matches(item)) {
+  if (list.length == 0) return -1;
+  if (matches(list.first)) return 0;
+  if (!matches(list.last)) return list.length;
+
+  int min = 0;
+  int max = list.length - 1;
+  while (min < max) {
+    var half = min + ((max - min) ~/ 2);
+    if (matches(list[half])) {
+      max = half;
+    } else {
+      min = half + 1;
+    }
+  }
+  return max;
+}
diff --git a/mojo/public/dart/third_party/source_maps/lib/src/vlq.dart b/mojo/public/dart/third_party/source_maps/lib/src/vlq.dart
new file mode 100644
index 0000000..e4ab4eb
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/lib/src/vlq.dart
@@ -0,0 +1,103 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+/// Utilities to encode and decode VLQ values used in source maps.
+///
+/// Sourcemaps are encoded with variable length numbers as base64 encoded
+/// strings with the least significant digit coming first. Each base64 digit
+/// encodes a 5-bit value (0-31) and a continuation bit. Signed values can be
+/// represented by using the least significant bit of the value as the sign bit.
+///
+/// For more details see the source map [version 3 documentation][spec].
+/// [spec]: https://docs.google.com/a/google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit
+library source_maps.src.vlq;
+
+import 'dart:math';
+
+const int VLQ_BASE_SHIFT = 5;
+
+const int VLQ_BASE_MASK = (1 << 5) - 1;
+
+const int VLQ_CONTINUATION_BIT = 1 << 5;
+
+const int VLQ_CONTINUATION_MASK = 1 << 5;
+
+const String BASE64_DIGITS =
+    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+
+final Map<String, int> _digits = () {
+  var map = <String, int>{};
+  for (int i = 0; i < 64; i++) {
+    map[BASE64_DIGITS[i]] = i;
+  }
+  return map;
+}();
+
+final int MAX_INT32 = pow(2, 31) - 1;
+final int MIN_INT32 = -pow(2, 31);
+
+/// Creates the VLQ encoding of [value] as a sequence of characters
+Iterable<String> encodeVlq(int value) {
+  if (value < MIN_INT32 || value > MAX_INT32) {
+    throw new ArgumentError('expected 32 bit int, got: $value');
+  }
+  var res = <String>[];
+  int signBit = 0;
+  if (value < 0) {
+    signBit = 1;
+    value = -value;
+  }
+  value = (value << 1) | signBit;
+  do {
+    int digit = value & VLQ_BASE_MASK;
+    value >>= VLQ_BASE_SHIFT;
+    if (value > 0) {
+      digit |= VLQ_CONTINUATION_BIT;
+    }
+    res.add(BASE64_DIGITS[digit]);
+  } while (value > 0);
+  return res;
+}
+
+/// Decodes a value written as a sequence of VLQ characters. The first input
+/// character will be `chars.current` after calling `chars.moveNext` once. The
+/// iterator is advanced until a stop character is found (a character without
+/// the [VLQ_CONTINUATION_BIT]).
+int decodeVlq(Iterator<String> chars) {
+  int result = 0;
+  bool stop = false;
+  int shift = 0;
+  while (!stop) {
+    if (!chars.moveNext()) throw new StateError('incomplete VLQ value');
+    var char = chars.current;
+    if (!_digits.containsKey(char)) {
+      throw new FormatException('invalid character in VLQ encoding: $char');
+    }
+    var digit = _digits[char];
+    stop = (digit & VLQ_CONTINUATION_BIT) == 0;
+    digit &= VLQ_BASE_MASK;
+    result += (digit << shift);
+    shift += VLQ_BASE_SHIFT;
+  }
+
+  // Result uses the least significant bit as a sign bit. We convert it into a
+  // two-complement value. For example,
+  //   2 (10 binary) becomes 1
+  //   3 (11 binary) becomes -1
+  //   4 (100 binary) becomes 2
+  //   5 (101 binary) becomes -2
+  //   6 (110 binary) becomes 3
+  //   7 (111 binary) becomes -3
+  bool negate = (result & 1) == 1;
+  result = result >> 1;
+  result = negate ? -result : result;
+
+  // TODO(sigmund): can we detect this earlier?
+  if (result < MIN_INT32 || result > MAX_INT32) {
+    throw new FormatException(
+        'expected an encoded 32 bit int, but we got: $result');
+  }
+  return result;
+}
diff --git a/mojo/public/dart/third_party/source_maps/pubspec.yaml b/mojo/public/dart/third_party/source_maps/pubspec.yaml
new file mode 100644
index 0000000..fc0fe9b
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/pubspec.yaml
@@ -0,0 +1,12 @@
+name: source_maps
+version: 0.10.1
+author: Dart Team <misc@dartlang.org>
+description: Library to programmatically manipulate source map files.
+homepage: http://github.com/dart-lang/source_maps
+dependencies:
+  path: ^1.2.0
+  source_span: ^1.1.1
+environment:
+  sdk: '>=1.8.0 <2.0.0'
+dev_dependencies:
+  unittest: '>=0.9.0 <0.12.0'
diff --git a/mojo/public/dart/third_party/source_maps/test/builder_test.dart b/mojo/public/dart/third_party/source_maps/test/builder_test.dart
new file mode 100644
index 0000000..ca0ca8d
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/test/builder_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.source_maps_test;
+
+import 'dart:convert';
+import 'package:unittest/unittest.dart';
+import 'package:source_maps/source_maps.dart';
+import 'common.dart';
+
+main() {
+  test('builder - with span', () {
+    var map = (new SourceMapBuilder()
+        ..addSpan(inputVar1, outputVar1)
+        ..addSpan(inputFunction, outputFunction)
+        ..addSpan(inputVar2, outputVar2)
+        ..addSpan(inputExpr, outputExpr))
+        .build(output.url.toString());
+    expect(map, equals(EXPECTED_MAP));
+  });
+
+  test('builder - with location', () {
+    var str = (new SourceMapBuilder()
+        ..addLocation(inputVar1.start, outputVar1.start, 'longVar1')
+        ..addLocation(inputFunction.start, outputFunction.start, 'longName')
+        ..addLocation(inputVar2.start, outputVar2.start, 'longVar2')
+        ..addLocation(inputExpr.start, outputExpr.start, null))
+        .toJson(output.url.toString());
+    expect(str, JSON.encode(EXPECTED_MAP));
+  });
+}
diff --git a/mojo/public/dart/third_party/source_maps/test/common.dart b/mojo/public/dart/third_party/source_maps/test/common.dart
new file mode 100644
index 0000000..73a8d40
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/test/common.dart
@@ -0,0 +1,107 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Common input/output used by builder, parser and end2end tests
+library test.common;
+
+import 'package:source_maps/source_maps.dart';
+import 'package:source_span/source_span.dart';
+import 'package:unittest/unittest.dart';
+
+/// Content of the source file
+const String INPUT = '''
+/** this is a comment. */
+int longVar1 = 3;
+
+// this is a comment too
+int longName(int longVar2) {
+  return longVar1 + longVar2;
+}
+''';
+var input = new SourceFile(INPUT, url: 'input.dart');
+
+/// A span in the input file
+SourceMapSpan ispan(int start, int end, [bool isIdentifier = false]) =>
+    new SourceMapFileSpan(input.span(start, end), isIdentifier: isIdentifier);
+
+SourceMapSpan inputVar1 = ispan(30, 38, true);
+SourceMapSpan inputFunction = ispan(74, 82, true);
+SourceMapSpan inputVar2 = ispan(87, 95, true);
+
+SourceMapSpan inputVar1NoSymbol = ispan(30, 38);
+SourceMapSpan inputFunctionNoSymbol = ispan(74, 82);
+SourceMapSpan inputVar2NoSymbol = ispan(87, 95);
+
+SourceMapSpan inputExpr = ispan(108, 127);
+
+/// Content of the target file
+const String OUTPUT = '''
+var x = 3;
+f(y) => x + y;
+''';
+var output = new SourceFile(OUTPUT, url: 'output.dart');
+
+/// A span in the output file
+SourceMapSpan ospan(int start, int end, [bool isIdentifier = false]) =>
+    new SourceMapFileSpan(output.span(start, end), isIdentifier: isIdentifier);
+
+SourceMapSpan outputVar1 = ospan(4, 5, true);
+SourceMapSpan outputFunction = ospan(11, 12, true);
+SourceMapSpan outputVar2 = ospan(13, 14, true);
+SourceMapSpan outputVar1NoSymbol = ospan(4, 5);
+SourceMapSpan outputFunctionNoSymbol = ospan(11, 12);
+SourceMapSpan outputVar2NoSymbol = ospan(13, 14);
+SourceMapSpan outputExpr = ospan(19, 24);
+
+/// Expected output mapping when recording the following four mappings:
+///      inputVar1       <=   outputVar1
+///      inputFunction   <=   outputFunction
+///      inputVar2       <=   outputVar2
+///      inputExpr       <=   outputExpr
+///
+/// This mapping is stored in the tests so we can independently test the builder
+/// and parser algorithms without relying entirely on end2end tests.
+const Map<String, dynamic> EXPECTED_MAP = const {
+    'version': 3,
+    'sourceRoot': '',
+    'sources': const ['input.dart'],
+    'names': const ['longVar1','longName','longVar2'],
+    'mappings': 'IACIA;AAGAC,EAAaC,MACR',
+    'file': 'output.dart'
+};
+
+check(SourceSpan outputSpan, Mapping mapping, SourceMapSpan inputSpan,
+    bool realOffsets) {
+  var line = outputSpan.start.line;
+  var column = outputSpan.start.column;
+  var files = realOffsets ? {'input.dart': input} : null; 
+  var span = mapping.spanFor(line, column, files: files);
+  var span2 = mapping.spanForLocation(outputSpan.start, files: files);
+
+  // Both mapping APIs are equivalent.
+  expect(span.start.offset, span2.start.offset);
+  expect(span.start.line, span2.start.line);
+  expect(span.start.column, span2.start.column);
+  expect(span.end.offset, span2.end.offset);
+  expect(span.end.line, span2.end.line);
+  expect(span.end.column, span2.end.column);
+
+  // Mapping matches our input location (modulo using real offsets)
+  expect(span.start.line, inputSpan.start.line);
+  expect(span.start.column, inputSpan.start.column);
+  expect(span.sourceUrl, inputSpan.sourceUrl);
+  expect(span.start.offset, realOffsets ? inputSpan.start.offset : 0);
+
+  // Mapping includes the identifier, if any
+  if (inputSpan.isIdentifier) {
+    expect(span.end.line, inputSpan.end.line);
+    expect(span.end.column, inputSpan.end.column);
+    expect(span.end.offset, span.start.offset + inputSpan.text.length);
+    if (realOffsets) expect(span.end.offset, inputSpan.end.offset);
+  } else {
+    expect(span.end.offset, span.start.offset);
+    expect(span.end.line, span.start.line);
+    expect(span.end.column, span.start.column);
+  }
+}
diff --git a/mojo/public/dart/third_party/source_maps/test/end2end_test.dart b/mojo/public/dart/third_party/source_maps/test/end2end_test.dart
new file mode 100644
index 0000000..7dbc6bd
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/test/end2end_test.dart
@@ -0,0 +1,162 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.end2end_test;
+
+import 'package:unittest/unittest.dart';
+import 'package:source_maps/source_maps.dart';
+import 'package:source_span/source_span.dart';
+import 'common.dart';
+
+main() {
+  test('end-to-end setup', () {
+    expect(inputVar1.text, 'longVar1');
+    expect(inputFunction.text, 'longName');
+    expect(inputVar2.text, 'longVar2');
+    expect(inputVar1NoSymbol.text, 'longVar1');
+    expect(inputFunctionNoSymbol.text, 'longName');
+    expect(inputVar2NoSymbol.text, 'longVar2');
+    expect(inputExpr.text, 'longVar1 + longVar2');
+
+    expect(outputVar1.text, 'x');
+    expect(outputFunction.text, 'f');
+    expect(outputVar2.text, 'y');
+    expect(outputVar1NoSymbol.text, 'x');
+    expect(outputFunctionNoSymbol.text, 'f');
+    expect(outputVar2NoSymbol.text, 'y');
+    expect(outputExpr.text, 'x + y');
+  });
+
+  test('build + parse', () {
+    var map = (new SourceMapBuilder()
+        ..addSpan(inputVar1, outputVar1)
+        ..addSpan(inputFunction, outputFunction)
+        ..addSpan(inputVar2, outputVar2)
+        ..addSpan(inputExpr, outputExpr))
+        .build(output.url.toString());
+    var mapping = parseJson(map);
+    check(outputVar1, mapping, inputVar1, false);
+    check(outputVar2, mapping, inputVar2, false);
+    check(outputFunction, mapping, inputFunction, false);
+    check(outputExpr, mapping, inputExpr, false);
+  });
+
+  test('build + parse - no symbols', () {
+    var map = (new SourceMapBuilder()
+        ..addSpan(inputVar1NoSymbol, outputVar1NoSymbol)
+        ..addSpan(inputFunctionNoSymbol, outputFunctionNoSymbol)
+        ..addSpan(inputVar2NoSymbol, outputVar2NoSymbol)
+        ..addSpan(inputExpr, outputExpr))
+        .build(output.url.toString());
+    var mapping = parseJson(map);
+    check(outputVar1NoSymbol, mapping, inputVar1NoSymbol, false);
+    check(outputVar2NoSymbol, mapping, inputVar2NoSymbol, false);
+    check(outputFunctionNoSymbol, mapping, inputFunctionNoSymbol, false);
+    check(outputExpr, mapping, inputExpr, false);
+  });
+
+  test('build + parse, repeated entries', () {
+    var map = (new SourceMapBuilder()
+        ..addSpan(inputVar1, outputVar1)
+        ..addSpan(inputVar1, outputVar1)
+        ..addSpan(inputFunction, outputFunction)
+        ..addSpan(inputFunction, outputFunction)
+        ..addSpan(inputVar2, outputVar2)
+        ..addSpan(inputVar2, outputVar2)
+        ..addSpan(inputExpr, outputExpr)
+        ..addSpan(inputExpr, outputExpr))
+        .build(output.url.toString());
+    var mapping = parseJson(map);
+    check(outputVar1, mapping, inputVar1, false);
+    check(outputVar2, mapping, inputVar2, false);
+    check(outputFunction, mapping, inputFunction, false);
+    check(outputExpr, mapping, inputExpr, false);
+  });
+
+  test('build + parse - no symbols, repeated entries', () {
+    var map = (new SourceMapBuilder()
+        ..addSpan(inputVar1NoSymbol, outputVar1NoSymbol)
+        ..addSpan(inputVar1NoSymbol, outputVar1NoSymbol)
+        ..addSpan(inputFunctionNoSymbol, outputFunctionNoSymbol)
+        ..addSpan(inputFunctionNoSymbol, outputFunctionNoSymbol)
+        ..addSpan(inputVar2NoSymbol, outputVar2NoSymbol)
+        ..addSpan(inputVar2NoSymbol, outputVar2NoSymbol)
+        ..addSpan(inputExpr, outputExpr))
+        .build(output.url.toString());
+    var mapping = parseJson(map);
+    check(outputVar1NoSymbol, mapping, inputVar1NoSymbol, false);
+    check(outputVar2NoSymbol, mapping, inputVar2NoSymbol, false);
+    check(outputFunctionNoSymbol, mapping, inputFunctionNoSymbol, false);
+    check(outputExpr, mapping, inputExpr, false);
+  });
+
+  test('build + parse with file', () {
+    var json = (new SourceMapBuilder()
+        ..addSpan(inputVar1, outputVar1)
+        ..addSpan(inputFunction, outputFunction)
+        ..addSpan(inputVar2, outputVar2)
+        ..addSpan(inputExpr, outputExpr))
+        .toJson(output.url.toString());
+    var mapping = parse(json);
+    check(outputVar1, mapping, inputVar1, true);
+    check(outputVar2, mapping, inputVar2, true);
+    check(outputFunction, mapping, inputFunction, true);
+    check(outputExpr, mapping, inputExpr, true);
+  });
+
+  test('printer projecting marks + parse', () {
+    var out = INPUT.replaceAll('long', '_s');
+    var file = new SourceFile(out, url: 'output2.dart');
+    var printer = new Printer('output2.dart');
+    printer.mark(ispan(0, 0));
+
+    bool first = true;
+    var segments = INPUT.split('long');
+    expect(segments.length, 6);
+    printer.add(segments[0], projectMarks: true);
+    printer.mark(inputVar1);
+    printer.add('_s');
+    printer.add(segments[1], projectMarks: true);
+    printer.mark(inputFunction);
+    printer.add('_s');
+    printer.add(segments[2], projectMarks: true);
+    printer.mark(inputVar2);
+    printer.add('_s');
+    printer.add(segments[3], projectMarks: true);
+    printer.mark(inputExpr);
+    printer.add('_s');
+    printer.add(segments[4], projectMarks: true);
+    printer.add('_s');
+    printer.add(segments[5], projectMarks: true);
+
+    expect(printer.text, out);
+
+    var mapping = parse(printer.map);
+    checkHelper(SourceMapSpan inputSpan, int adjustment) {
+      var start = inputSpan.start.offset - adjustment;
+      var end = (inputSpan.end.offset - adjustment) - 2;
+      var span = new SourceMapFileSpan(file.span(start, end),
+          isIdentifier: inputSpan.isIdentifier);
+      check(span, mapping, inputSpan, true);
+    }
+
+    checkHelper(inputVar1, 0);
+    checkHelper(inputFunction, 2);
+    checkHelper(inputVar2, 4);
+    checkHelper(inputExpr, 6);
+
+    // We projected correctly lines that have no mappings
+    check(file.span(66, 66), mapping, ispan(45, 45), true);
+    check(file.span(63, 64), mapping, ispan(45, 45), true);
+    check(file.span(68, 68), mapping, ispan(70, 70), true);
+    check(file.span(71, 71), mapping, ispan(70, 70), true);
+
+    // Start of the last line
+    var oOffset = out.length - 2;
+    var iOffset = INPUT.length - 2;
+    check(file.span(oOffset, oOffset), mapping, ispan(iOffset, iOffset), true);
+    check(file.span(oOffset + 1, oOffset + 1), mapping,
+        ispan(iOffset, iOffset), true);
+  });
+}
diff --git a/mojo/public/dart/third_party/source_maps/test/parser_test.dart b/mojo/public/dart/third_party/source_maps/test/parser_test.dart
new file mode 100644
index 0000000..b14fdf4
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/test/parser_test.dart
@@ -0,0 +1,135 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.parser_test;
+
+import 'dart:convert';
+import 'package:unittest/unittest.dart';
+import 'package:source_maps/source_maps.dart';
+import 'common.dart';
+
+const Map<String, dynamic> MAP_WITH_NO_SOURCE_LOCATION = const {
+    'version': 3,
+    'sourceRoot': '',
+    'sources': const ['input.dart'],
+    'names': const [],
+    'mappings': 'A',
+    'file': 'output.dart'
+};
+
+const Map<String, dynamic> MAP_WITH_SOURCE_LOCATION = const {
+    'version': 3,
+    'sourceRoot': '',
+    'sources': const ['input.dart'],
+    'names': const [],
+    'mappings': 'AAAA',
+    'file': 'output.dart'
+};
+
+const Map<String, dynamic> MAP_WITH_SOURCE_LOCATION_AND_NAME = const {
+    'version': 3,
+    'sourceRoot': '',
+    'sources': const ['input.dart'],
+    'names': const ['var'],
+    'mappings': 'AAAAA',
+    'file': 'output.dart'
+};
+
+main() {
+  test('parse', () {
+    var mapping = parseJson(EXPECTED_MAP);
+    check(outputVar1, mapping, inputVar1, false);
+    check(outputVar2, mapping, inputVar2, false);
+    check(outputFunction, mapping, inputFunction, false);
+    check(outputExpr, mapping, inputExpr, false);
+  });
+
+  test('parse + json', () {
+    var mapping = parse(JSON.encode(EXPECTED_MAP));
+    check(outputVar1, mapping, inputVar1, false);
+    check(outputVar2, mapping, inputVar2, false);
+    check(outputFunction, mapping, inputFunction, false);
+    check(outputExpr, mapping, inputExpr, false);
+  });
+
+  test('parse with file', () {
+    var mapping = parseJson(EXPECTED_MAP);
+    check(outputVar1, mapping, inputVar1, true);
+    check(outputVar2, mapping, inputVar2, true);
+    check(outputFunction, mapping, inputFunction, true);
+    check(outputExpr, mapping, inputExpr, true);
+  });
+
+  test('parse with no source location', () {
+    SingleMapping map = parse(JSON.encode(MAP_WITH_NO_SOURCE_LOCATION));
+    expect(map.lines.length, 1);
+    expect(map.lines.first.entries.length, 1);
+    TargetEntry entry = map.lines.first.entries.first;
+
+    expect(entry.column, 0);
+    expect(entry.sourceUrlId, null);
+    expect(entry.sourceColumn, null);
+    expect(entry.sourceLine, null);
+    expect(entry.sourceNameId, null);
+  });
+
+  test('parse with source location and no name', () {
+    SingleMapping map = parse(JSON.encode(MAP_WITH_SOURCE_LOCATION));
+    expect(map.lines.length, 1);
+    expect(map.lines.first.entries.length, 1);
+    TargetEntry entry = map.lines.first.entries.first;
+
+    expect(entry.column, 0);
+    expect(entry.sourceUrlId, 0);
+    expect(entry.sourceColumn, 0);
+    expect(entry.sourceLine, 0);
+    expect(entry.sourceNameId, null);
+  });
+
+  test('parse with source location and name', () {
+    SingleMapping map = parse(JSON.encode(MAP_WITH_SOURCE_LOCATION_AND_NAME));
+    expect(map.lines.length, 1);
+    expect(map.lines.first.entries.length, 1);
+    TargetEntry entry = map.lines.first.entries.first;
+
+    expect(entry.sourceUrlId, 0);
+    expect(entry.sourceUrlId, 0);
+    expect(entry.sourceColumn, 0);
+    expect(entry.sourceLine, 0);
+    expect(entry.sourceNameId, 0);
+  });
+
+  test('parse with source root', () {
+    var inputMap = new Map.from(MAP_WITH_SOURCE_LOCATION);
+    inputMap['sourceRoot'] = '/pkg/';
+    var mapping = parseJson(inputMap);
+    expect(mapping.spanFor(0, 0).sourceUrl, Uri.parse("/pkg/input.dart"));
+
+    var newSourceRoot = '/new/';
+
+    mapping.sourceRoot = newSourceRoot;
+    inputMap["sourceRoot"] = newSourceRoot;
+
+    expect(mapping.toJson(), equals(inputMap));
+  });
+
+  test('parse with map URL', () {
+    var inputMap = new Map.from(MAP_WITH_SOURCE_LOCATION);
+    inputMap['sourceRoot'] = 'pkg/';
+    var mapping = parseJson(inputMap, mapUrl: "file:///path/to/map");
+    expect(mapping.spanFor(0, 0).sourceUrl,
+        Uri.parse("file:///path/to/pkg/input.dart"));
+  });
+
+  test('parse and re-emit', () {
+    for (var expected in [
+        EXPECTED_MAP,
+        MAP_WITH_NO_SOURCE_LOCATION,
+        MAP_WITH_SOURCE_LOCATION,
+        MAP_WITH_SOURCE_LOCATION_AND_NAME]) {
+      var mapping = parseJson(expected);
+      expect(mapping.toJson(), equals(expected));
+    }
+  });
+}
diff --git a/mojo/public/dart/third_party/source_maps/test/printer_test.dart b/mojo/public/dart/third_party/source_maps/test/printer_test.dart
new file mode 100644
index 0000000..e55ca9f
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/test/printer_test.dart
@@ -0,0 +1,121 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.printer_test;
+
+import 'dart:convert';
+import 'package:unittest/unittest.dart';
+import 'package:source_maps/source_maps.dart';
+import 'package:source_span/source_span.dart';
+import 'common.dart';
+
+main() {
+  test('printer', () {
+    var printer = new Printer('output.dart');
+    printer..add('var ')
+           ..mark(inputVar1)
+           ..add('x = 3;\n')
+           ..mark(inputFunction)
+           ..add('f(')
+           ..mark(inputVar2)
+           ..add('y) => ')
+           ..mark(inputExpr)
+           ..add('x + y;\n');
+    expect(printer.text, OUTPUT);
+    expect(printer.map, JSON.encode(EXPECTED_MAP));
+  });
+
+  test('printer projecting marks', () {
+    var out = INPUT.replaceAll('long', '_s');
+    var printer = new Printer('output2.dart');
+
+    var segments = INPUT.split('long');
+    expect(segments.length, 6);
+    printer..mark(ispan(0, 0))
+        ..add(segments[0], projectMarks: true)
+        ..mark(inputVar1)
+        ..add('_s')
+        ..add(segments[1], projectMarks: true)
+        ..mark(inputFunction)
+        ..add('_s')
+        ..add(segments[2], projectMarks: true)
+        ..mark(inputVar2)
+        ..add('_s')
+        ..add(segments[3], projectMarks: true)
+        ..mark(inputExpr)
+        ..add('_s')
+        ..add(segments[4], projectMarks: true)
+        ..add('_s')
+        ..add(segments[5], projectMarks: true);
+
+    expect(printer.text, out);
+    // 8 new lines in the source map:
+    expect(printer.map.split(';').length, 8);
+
+    asFixed(SourceMapSpan s) => new SourceMapSpan(s.start, s.end, s.text,
+        isIdentifier: s.isIdentifier);
+
+    // The result is the same if we use fixed positions
+    var printer2 = new Printer('output2.dart');
+    printer2..mark(new SourceLocation(0, sourceUrl: 'input.dart').pointSpan())
+        ..add(segments[0], projectMarks: true)
+        ..mark(asFixed(inputVar1))
+        ..add('_s')
+        ..add(segments[1], projectMarks: true)
+        ..mark(asFixed(inputFunction))
+        ..add('_s')
+        ..add(segments[2], projectMarks: true)
+        ..mark(asFixed(inputVar2))
+        ..add('_s')
+        ..add(segments[3], projectMarks: true)
+        ..mark(asFixed(inputExpr))
+        ..add('_s')
+        ..add(segments[4], projectMarks: true)
+        ..add('_s')
+        ..add(segments[5], projectMarks: true);
+
+    expect(printer2.text, out);
+    expect(printer2.map, printer.map);
+  });
+
+  group('nested printer', () {
+    test('simple use', () {
+      var printer = new NestedPrinter();
+      printer..add('var ')
+             ..add('x = 3;\n', span: inputVar1)
+             ..add('f(', span: inputFunction)
+             ..add('y) => ', span: inputVar2)
+             ..add('x + y;\n', span: inputExpr)
+             ..build('output.dart');
+      expect(printer.text, OUTPUT);
+      expect(printer.map, JSON.encode(EXPECTED_MAP));
+    });
+
+    test('nested use', () {
+      var printer = new NestedPrinter();
+      printer..add('var ')
+             ..add(new NestedPrinter()..add('x = 3;\n', span: inputVar1))
+             ..add('f(', span: inputFunction)
+             ..add(new NestedPrinter()..add('y) => ', span: inputVar2))
+             ..add('x + y;\n', span: inputExpr)
+             ..build('output.dart');
+      expect(printer.text, OUTPUT);
+      expect(printer.map, JSON.encode(EXPECTED_MAP));
+    });
+
+    test('add indentation', () {
+      var out = INPUT.replaceAll('long', '_s');
+      var lines = INPUT.trim().split('\n');
+      expect(lines.length, 7);
+      var printer = new NestedPrinter();
+      for (int i = 0; i < lines.length; i++) {
+        if (i == 5) printer.indent++;
+        printer.addLine(lines[i].replaceAll('long', '_s').trim());
+        if (i == 5) printer.indent--;
+      }
+      printer.build('output.dart');
+      expect(printer.text, out);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/source_maps/test/refactor_test.dart b/mojo/public/dart/third_party/source_maps/test/refactor_test.dart
new file mode 100644
index 0000000..08b8965
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/test/refactor_test.dart
@@ -0,0 +1,149 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library polymer.test.refactor_test;
+
+import 'package:unittest/unittest.dart';
+import 'package:source_maps/refactor.dart';
+import 'package:source_maps/parser.dart' show parse, Mapping;
+import 'package:source_span/source_span.dart';
+
+main() {
+  group('conflict detection', () {
+    var original = "0123456789abcdefghij";
+    var file = new SourceFile(original);
+
+    test('no conflict, in order', () {
+      var txn = new TextEditTransaction(original, file);
+      txn.edit(2, 4, '.');
+      txn.edit(5, 5, '|');
+      txn.edit(6, 6, '-');
+      txn.edit(6, 7, '_');
+      expect((txn.commit()..build('')).text, "01.4|5-_789abcdefghij");
+    });
+
+    test('no conflict, out of order', () {
+      var txn = new TextEditTransaction(original, file);
+      txn.edit(2, 4, '.');
+      txn.edit(5, 5, '|');
+
+      // Regresion test for issue #404: there is no conflict/overlap for edits
+      // that don't remove any of the original code.
+      txn.edit(6, 7, '_');
+      txn.edit(6, 6, '-');
+      expect((txn.commit()..build('')).text, "01.4|5-_789abcdefghij");
+
+    });
+
+    test('conflict', () {
+      var txn = new TextEditTransaction(original, file);
+      txn.edit(2, 4, '.');
+      txn.edit(3, 3, '-');
+      expect(() => txn.commit(), throwsA(predicate(
+            (e) => e.toString().contains('overlapping edits'))));
+    });
+  });
+
+  test('generated source maps', () {
+    var original =
+        "0123456789\n0*23456789\n01*3456789\nabcdefghij\nabcd*fghij\n";
+    var file = new SourceFile(original);
+    var txn = new TextEditTransaction(original, file);
+    txn.edit(27, 29, '__\n    ');
+    txn.edit(34, 35, '___');
+    var printer = (txn.commit()..build(''));
+    var output = printer.text;
+    var map = parse(printer.map);
+    expect(output,
+        "0123456789\n0*23456789\n01*34__\n    789\na___cdefghij\nabcd*fghij\n");
+
+    // Line 1 and 2 are unmodified: mapping any column returns the beginning
+    // of the corresponding line:
+    expect(_span(1, 1, map, file),
+        "line 1, column 1: \n"
+        "0123456789\n"
+        "^");
+    expect(_span(1, 5, map, file),
+        "line 1, column 1: \n"
+        "0123456789\n"
+        "^");
+    expect(_span(2, 1, map, file),
+        "line 2, column 1: \n"
+        "0*23456789\n"
+        "^");
+    expect(_span(2, 8, map, file),
+        "line 2, column 1: \n"
+        "0*23456789\n"
+        "^");
+
+    // Line 3 is modified part way: mappings before the edits have the right
+    // mapping, after the edits the mapping is null.
+    expect(_span(3, 1, map, file),
+        "line 3, column 1: \n"
+        "01*3456789\n"
+        "^");
+    expect(_span(3, 5, map, file),
+        "line 3, column 1: \n"
+        "01*3456789\n"
+        "^");
+
+    // Start of edits map to beginning of the edit secion:
+    expect(_span(3, 6, map, file),
+        "line 3, column 6: \n"
+        "01*3456789\n"
+        "     ^");
+    expect(_span(3, 7, map, file),
+        "line 3, column 6: \n"
+        "01*3456789\n"
+        "     ^");
+
+    // Lines added have no mapping (they should inherit the last mapping),
+    // but the end of the edit region continues were we left off:
+    expect(_span(4, 1, map, file), isNull);
+    expect(_span(4, 5, map, file),
+        "line 3, column 8: \n"
+        "01*3456789\n"
+        "       ^");
+
+    // Subsequent lines are still mapped correctly:
+    // a (in a___cd...)
+    expect(_span(5, 1, map, file),
+        "line 4, column 1: \n"
+        "abcdefghij\n"
+        "^");
+    // _ (in a___cd...)
+    expect(_span(5, 2, map, file),
+        "line 4, column 2: \n"
+        "abcdefghij\n"
+        " ^");
+    // _ (in a___cd...)
+    expect(_span(5, 3, map, file),
+        "line 4, column 2: \n"
+        "abcdefghij\n"
+        " ^");
+    // _ (in a___cd...)
+    expect(_span(5, 4, map, file),
+        "line 4, column 2: \n"
+        "abcdefghij\n"
+        " ^");
+    // c (in a___cd...)
+    expect(_span(5, 5, map, file),
+        "line 4, column 3: \n"
+        "abcdefghij\n"
+        "  ^");
+    expect(_span(6, 1, map, file),
+        "line 5, column 1: \n"
+        "abcd*fghij\n"
+        "^");
+    expect(_span(6, 8, map, file),
+        "line 5, column 1: \n"
+        "abcd*fghij\n"
+        "^");
+  });
+}
+
+String _span(int line, int column, Mapping map, SourceFile file) {
+  var span = map.spanFor(line - 1, column - 1, files: {'': file});
+  return span == null ? null : span.message('').trim();
+}
diff --git a/mojo/public/dart/third_party/source_maps/test/run.dart b/mojo/public/dart/third_party/source_maps/test/run.dart
new file mode 100755
index 0000000..ec3c3ab
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/test/run.dart
@@ -0,0 +1,37 @@
+#!/usr/bin/env dart
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.run;
+
+import 'package:unittest/compact_vm_config.dart';
+import 'package:unittest/unittest.dart';
+import 'dart:io' show Options;
+
+import 'builder_test.dart' as builder_test;
+import 'end2end_test.dart' as end2end_test;
+import 'parser_test.dart' as parser_test;
+import 'printer_test.dart' as printer_test;
+import 'refactor_test.dart' as refactor_test;
+import 'utils_test.dart' as utils_test;
+import 'vlq_test.dart' as vlq_test;
+
+main(List<String> arguments) {
+  var pattern = new RegExp(arguments.length > 0 ? arguments[0] : '.');
+  useCompactVMConfiguration();
+
+  void addGroup(testFile, testMain) {
+    if (pattern.hasMatch(testFile)) {
+      group(testFile.replaceAll('_test.dart', ':'), testMain);
+    }
+  }
+
+  addGroup('builder_test.dart', builder_test.main);
+  addGroup('end2end_test.dart', end2end_test.main);
+  addGroup('parser_test.dart', parser_test.main);
+  addGroup('printer_test.dart', printer_test.main);
+  addGroup('refactor_test.dart', refactor_test.main);
+  addGroup('utils_test.dart', utils_test.main);
+  addGroup('vlq_test.dart', vlq_test.main);
+}
diff --git a/mojo/public/dart/third_party/source_maps/test/utils_test.dart b/mojo/public/dart/third_party/source_maps/test/utils_test.dart
new file mode 100644
index 0000000..79a7de7
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/test/utils_test.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Tests for the binary search utility algorithm.
+library test.utils_test;
+
+import 'package:unittest/unittest.dart';
+import 'package:source_maps/src/utils.dart';
+
+main() {
+  group('binary search', () {
+    test('empty', () {
+      expect(binarySearch([], (x) => true), -1);
+    });
+
+    test('single element', () {
+      expect(binarySearch([1], (x) => true), 0);
+      expect(binarySearch([1], (x) => false), 1);
+    });
+
+    test('no matches', () {
+      var list = [1, 2, 3, 4, 5, 6, 7];
+      expect(binarySearch(list, (x) => false), list.length);
+    });
+
+    test('all match', () {
+      var list = [1, 2, 3, 4, 5, 6, 7];
+      expect(binarySearch(list, (x) => true), 0);
+    });
+
+    test('compare with linear search', () {
+      for (int size = 0; size < 100; size++) {
+        var list = [];
+        for (int i = 0; i < size; i++) {
+          list.add(i);
+        }
+        for (int pos = 0; pos <= size; pos++) {
+          expect(binarySearch(list, (x) => x >= pos),
+              _linearSearch(list, (x) => x >= pos));
+        }
+      }
+    });
+  });
+}
+
+_linearSearch(list, predicate) {
+  if (list.length == 0) return -1;
+  for (int i = 0; i < list.length; i++) {
+    if (predicate(list[i])) return i;
+  }
+  return list.length;
+}
+
diff --git a/mojo/public/dart/third_party/source_maps/test/vlq_test.dart b/mojo/public/dart/third_party/source_maps/test/vlq_test.dart
new file mode 100644
index 0000000..0abdc47
--- /dev/null
+++ b/mojo/public/dart/third_party/source_maps/test/vlq_test.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.vlq_test;
+
+import 'dart:math';
+import 'package:unittest/unittest.dart';
+import 'package:source_maps/src/vlq.dart';
+
+main() {
+  test('encode and decode - simple values', () {
+    expect(encodeVlq(1).join(''), 'C');
+    expect(encodeVlq(2).join(''), 'E');
+    expect(encodeVlq(3).join(''), 'G');
+    expect(encodeVlq(100).join(''), 'oG');
+    expect(decodeVlq('C'.split('').iterator), 1);
+    expect(decodeVlq('E'.split('').iterator), 2);
+    expect(decodeVlq('G'.split('').iterator), 3);
+    expect(decodeVlq('oG'.split('').iterator), 100);
+  });
+
+  test('encode and decode', () {
+    for (int i = -10000; i < 10000; i++) {
+      _checkEncodeDecode(i);
+    }
+  });
+
+  test('only 32-bit ints allowed', () {
+    var max_int = pow(2, 31) - 1;
+    var min_int = -pow(2, 31);
+    _checkEncodeDecode(max_int - 1);
+    _checkEncodeDecode(min_int + 1);
+    _checkEncodeDecode(max_int);
+    _checkEncodeDecode(min_int);
+
+    expect(encodeVlq(min_int).join(''), 'hgggggE');
+    expect(decodeVlq('hgggggE'.split('').iterator), min_int);
+
+    expect(() => encodeVlq(max_int + 1), throws);
+    expect(() => encodeVlq(max_int + 2), throws);
+    expect(() => encodeVlq(min_int - 1), throws);
+    expect(() => encodeVlq(min_int - 2), throws);
+
+
+    // if we allowed more than 32 bits, these would be the expected encodings
+    // for the large numbers above.
+    expect(() => decodeVlq('ggggggE'.split('').iterator), throws);
+    expect(() => decodeVlq('igggggE'.split('').iterator), throws);
+    expect(() => decodeVlq('jgggggE'.split('').iterator), throws);
+    expect(() => decodeVlq('lgggggE'.split('').iterator), throws);
+  });
+}
+
+_checkEncodeDecode(int value) {
+  var encoded = encodeVlq(value);
+  expect(decodeVlq(encoded.iterator), value);
+  expect(decodeVlq(encoded.join('').split('').iterator), value);
+}
diff --git a/mojo/public/dart/third_party/source_span/.gitignore b/mojo/public/dart/third_party/source_span/.gitignore
new file mode 100644
index 0000000..7dbf035
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/.gitignore
@@ -0,0 +1,15 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.pub/
+build/
+packages
+.packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/source_span/.test_config b/mojo/public/dart/third_party/source_span/.test_config
new file mode 100644
index 0000000..412fc5c
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/.test_config
@@ -0,0 +1,3 @@
+{
+  "test_package": true
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/source_span/CHANGELOG.md b/mojo/public/dart/third_party/source_span/CHANGELOG.md
new file mode 100644
index 0000000..ab13bda
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/CHANGELOG.md
@@ -0,0 +1,92 @@
+# 1.2.0
+
+* **Deprecated:** Extending `SourceLocation` directly is deprecated. Instead,
+  extend the new `SourceLocationBase` class or mix in the new
+  `SourceLocationMixin` mixin.
+
+* Dramatically improve the performance of `FileLocation`.
+
+# 1.1.6
+
+* Optimize `getLine()` in `SourceFile` when repeatedly called.
+
+# 1.1.5
+
+* Fixed another case in which `FileSpan.union` could throw an exception for
+  external implementations of `FileSpan`.
+
+# 1.1.4
+
+* Eliminated dart2js warning about overriding `==`, but not `hashCode`.
+
+# 1.1.3
+
+* `FileSpan.compareTo`, `FileSpan.==`, `FileSpan.union`, and `FileSpan.expand`
+  no longer throw exceptions for external implementations of `FileSpan`.
+
+* `FileSpan.hashCode` now fully agrees with `FileSpan.==`.
+
+# 1.1.2
+
+* Fixed validation in `SourceSpanWithContext` to allow multiple occurrences of
+  `text` within `context`.
+
+# 1.1.1
+
+* Fixed `FileSpan`'s context to include the full span text, not just the first
+  line of it.
+
+# 1.1.0
+
+* Added `SourceSpanWithContext`: a span that also includes the full line of text
+  that contains the span.
+
+# 1.0.3
+
+* Cleanup equality operator to accept any Object rather than just a
+  `SourceLocation`.
+
+# 1.0.2
+
+* Avoid unintentionally allocating extra objects for internal `FileSpan`
+  operations.
+
+* Ensure that `SourceSpan.operator==` works on arbitrary `Object`s.
+
+# 1.0.1
+
+* Use a more compact internal representation for `FileSpan`.
+
+# 1.0.0
+
+This package was extracted from the
+[`source_maps`](http://pub.dartlang.org/packages/source_maps) package, but the
+API has many differences. Among them:
+
+* `Span` has been renamed to `SourceSpan` and `Location` has been renamed to
+  `SourceLocation` to clarify their purpose and maintain consistency with the
+  package name. Likewise, `SpanException` is now `SourceSpanException` and
+  `SpanFormatException` is not `SourceSpanFormatException`.
+
+* `FixedSpan` and `FixedLocation` have been rolled into the `Span` and
+  `Location` classes, respectively.
+
+* `SourceFile` is more aggressive about validating its arguments. Out-of-bounds
+  lines, columns, and offsets will now throw errors rather than be silently
+  clamped.
+
+* `SourceSpan.sourceUrl`, `SourceLocation.sourceUrl`, and `SourceFile.url` now
+  return `Uri` objects rather than `String`s. The constructors allow either
+  `String`s or `Uri`s.
+
+* `Span.getLocationMessage` and `SourceFile.getLocationMessage` are now
+  `SourceSpan.message` and `SourceFile.message`, respectively. Rather than
+  taking both a `useColor` and a `color` parameter, they now take a single
+  `color` parameter that controls both whether and which color is used.
+
+* `Span.isIdentifier` has been removed. This property doesn't make sense outside
+  of a source map context.
+
+* `SourceFileSegment` has been removed. This class wasn't widely used and was
+  inconsistent in its choice of which parameters were considered relative and
+  which absolute.
diff --git a/mojo/public/dart/third_party/source_span/LICENSE b/mojo/public/dart/third_party/source_span/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/source_span/README.md b/mojo/public/dart/third_party/source_span/README.md
new file mode 100644
index 0000000..4e2547e
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/README.md
@@ -0,0 +1,15 @@
+`source_span` is a library for tracking locations in source code. It's designed
+to provide a standard representation for source code locations and spans so that
+disparate packages can easily pass them among one another, and to make it easy
+to generate human-friendly messages associated with a given piece of code.
+
+The most commonly-used class is the package's namesake, `SourceSpan`. It
+represents a span of characters in some source file, and is often attached to an
+object that has been parsed to indicate where it was parsed from. It provides
+access to the text of the span via `SourceSpan.text` and can be used to produce
+human-friendly messages using `SourceSpan.message()`.
+
+When parsing code from a file, `SourceFile` is useful. Not only does it provide
+an efficient means of computing line and column numbers, `SourceFile.span()`
+returns special `FileSpan`s that are able to provide more context for their
+error messages.
diff --git a/mojo/public/dart/third_party/source_span/codereview.settings b/mojo/public/dart/third_party/source_span/codereview.settings
new file mode 100644
index 0000000..6cae815
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: http://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/source_span/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/source_span/lib/source_span.dart b/mojo/public/dart/third_party/source_span/lib/source_span.dart
new file mode 100644
index 0000000..9666dc2
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/lib/source_span.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library source_span;
+
+export "src/file.dart";
+export "src/location.dart";
+export "src/location_mixin.dart";
+export "src/span.dart";
+export "src/span_exception.dart";
+export "src/span_mixin.dart";
+export "src/span_with_context.dart";
diff --git a/mojo/public/dart/third_party/source_span/lib/src/colors.dart b/mojo/public/dart/third_party/source_span/lib/src/colors.dart
new file mode 100644
index 0000000..274fc92
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/lib/src/colors.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Color constants used for generating messages.
+library source_span.colors;
+
+const String RED = '\u001b[31m';
+
+const String YELLOW = '\u001b[33m';
+
+const String NONE = '\u001b[0m';
+
diff --git a/mojo/public/dart/third_party/source_span/lib/src/file.dart b/mojo/public/dart/third_party/source_span/lib/src/file.dart
new file mode 100644
index 0000000..95fa92c
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/lib/src/file.dart
@@ -0,0 +1,355 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library source_span.file;
+
+import 'dart:math' as math;
+import 'dart:typed_data';
+
+import 'location.dart';
+import 'location_mixin.dart';
+import 'span.dart';
+import 'span_mixin.dart';
+import 'span_with_context.dart';
+
+// Constants to determine end-of-lines.
+const int _LF = 10;
+const int _CR = 13;
+
+/// A class representing a source file.
+///
+/// This doesn't necessarily have to correspond to a file on disk, just a chunk
+/// of text usually with a URL associated with it.
+class SourceFile {
+  /// The URL where the source file is located.
+  ///
+  /// This may be null, indicating that the URL is unknown or unavailable.
+  final Uri url;
+
+  /// An array of offsets for each line beginning in the file.
+  ///
+  /// Each offset refers to the first character *after* the newline. If the
+  /// source file has a trailing newline, the final offset won't actually be in
+  /// the file.
+  final _lineStarts = <int>[0];
+
+  /// The code points of the characters in the file.
+  final Uint32List _decodedChars;
+
+  /// The length of the file in characters.
+  int get length => _decodedChars.length;
+
+  /// The number of lines in the file.
+  int get lines => _lineStarts.length;
+
+  /// The line that the offset fell on the last time [getLine] was called.
+  ///
+  /// In many cases, sequential calls to getLine() are for nearby, usually
+  /// increasing offsets. In that case, we can find the line for an offset
+  /// quickly by first checking to see if the offset is on the same line as the
+  /// previous result.
+  int _cachedLine;
+
+  /// Creates a new source file from [text].
+  ///
+  /// [url] may be either a [String], a [Uri], or `null`.
+  SourceFile(String text, {url})
+      : this.decoded(text.runes, url: url);
+
+  /// Creates a new source file from a list of decoded characters.
+  ///
+  /// [url] may be either a [String], a [Uri], or `null`.
+  SourceFile.decoded(Iterable<int> decodedChars, {url})
+      : url = url is String ? Uri.parse(url) : url,
+        _decodedChars = new Uint32List.fromList(decodedChars.toList()) {
+    for (var i = 0; i < _decodedChars.length; i++) {
+      var c = _decodedChars[i];
+      if (c == _CR) {
+        // Return not followed by newline is treated as a newline
+        var j = i + 1;
+        if (j >= _decodedChars.length || _decodedChars[j] != _LF) c = _LF;
+      }
+      if (c == _LF) _lineStarts.add(i + 1);
+    }
+  }
+
+  /// Returns a span in [this] from [start] to [end] (exclusive).
+  ///
+  /// If [end] isn't passed, it defaults to the end of the file.
+  FileSpan span(int start, [int end]) {
+    if (end == null) end = length - 1;
+    return new _FileSpan(this, start, end);
+  }
+
+  /// Returns a location in [this] at [offset].
+  FileLocation location(int offset) => new FileLocation._(this, offset);
+
+  /// Gets the 0-based line corresponding to [offset].
+  int getLine(int offset) {
+    if (offset < 0) {
+      throw new RangeError("Offset may not be negative, was $offset.");
+    } else if (offset > length) {
+      throw new RangeError("Offset $offset must not be greater than the number "
+          "of characters in the file, $length.");
+    }
+
+    if (offset < _lineStarts.first) return -1;
+    if (offset >= _lineStarts.last) return _lineStarts.length - 1;
+
+    if (_isNearCachedLine(offset)) return _cachedLine;
+
+    _cachedLine = _binarySearch(offset) - 1;
+    return _cachedLine;
+  }
+
+  /// Returns `true` if [offset] is near [_cachedLine].
+  ///
+  /// Checks on [_cachedLine] and the next line. If it's on the next line, it
+  /// updates [_cachedLine] to point to that.
+  bool _isNearCachedLine(int offset) {
+    if (_cachedLine == null) return false;
+
+    // See if it's before the cached line.
+    if (offset < _lineStarts[_cachedLine]) return false;
+
+    // See if it's on the cached line.
+    if (_cachedLine >= _lineStarts.length - 1 ||
+        offset < _lineStarts[_cachedLine + 1]) {
+      return true;
+    }
+
+    // See if it's on the next line.
+    if (_cachedLine >= _lineStarts.length - 2 ||
+        offset < _lineStarts[_cachedLine + 2]) {
+      _cachedLine++;
+      return true;
+    }
+
+    return false;
+  }
+
+  /// Binary search through [_lineStarts] to find the line containing [offset].
+  ///
+  /// Returns the index of the line in [_lineStarts].
+  int _binarySearch(int offset) {
+    int min = 0;
+    int max = _lineStarts.length - 1;
+    while (min < max) {
+      var half = min + ((max - min) ~/ 2);
+      if (_lineStarts[half] > offset) {
+        max = half;
+      } else {
+        min = half + 1;
+      }
+    }
+
+    return max;
+  }
+
+  /// Gets the 0-based column corresponding to [offset].
+  ///
+  /// If [line] is passed, it's assumed to be the line containing [offset] and
+  /// is used to more efficiently compute the column.
+  int getColumn(int offset, {int line}) {
+    if (offset < 0) {
+      throw new RangeError("Offset may not be negative, was $offset.");
+    } else if (offset > length) {
+      throw new RangeError("Offset $offset must be not be greater than the "
+          "number of characters in the file, $length.");
+    }
+
+    if (line == null) {
+      line = getLine(offset);
+    } else if (line < 0) {
+      throw new RangeError("Line may not be negative, was $line.");
+    } else if (line >= lines) {
+      throw new RangeError("Line $line must be less than the number of "
+          "lines in the file, $lines.");
+    }
+
+    var lineStart = _lineStarts[line];
+    if (lineStart > offset) {
+      throw new RangeError("Line $line comes after offset $offset.");
+    }
+
+    return offset - lineStart;
+  }
+
+  /// Gets the offset for a [line] and [column].
+  ///
+  /// [column] defaults to 0.
+  int getOffset(int line, [int column]) {
+    if (column == null) column = 0;
+
+    if (line < 0) {
+      throw new RangeError("Line may not be negative, was $line.");
+    } else if (line >= lines) {
+      throw new RangeError("Line $line must be less than the number of "
+          "lines in the file, $lines.");
+    } else if (column < 0) {
+      throw new RangeError("Column may not be negative, was $column.");
+    }
+
+    var result = _lineStarts[line] + column;
+    if (result > length ||
+        (line + 1 < lines && result >= _lineStarts[line + 1])) {
+      throw new RangeError("Line $line doesn't have $column columns.");
+    }
+
+    return result;
+  }
+
+  /// Returns the text of the file from [start] to [end] (exclusive).
+  ///
+  /// If [end] isn't passed, it defaults to the end of the file.
+  String getText(int start, [int end]) =>
+      new String.fromCharCodes(_decodedChars.sublist(start, end));
+}
+
+/// A [SourceLocation] within a [SourceFile].
+///
+/// Unlike the base [SourceLocation], [FileLocation] lazily computes its line
+/// and column values based on its offset and the contents of [file].
+///
+/// A [FileLocation] can be created using [SourceFile.location].
+class FileLocation extends SourceLocationMixin implements SourceLocation {
+  /// The [file] that [this] belongs to.
+  final SourceFile file;
+
+  final int offset;
+  Uri get sourceUrl => file.url;
+  int get line => file.getLine(offset);
+  int get column => file.getColumn(offset);
+
+  FileLocation._(this.file, this.offset) {
+    if (offset < 0) {
+      throw new RangeError("Offset may not be negative, was $offset.");
+    } else if (offset > file.length) {
+      throw new RangeError("Offset $offset must not be greater than the number "
+          "of characters in the file, ${file.length}.");
+    }
+  }
+
+  FileSpan pointSpan() => new _FileSpan(file, offset, offset);
+}
+
+/// A [SourceSpan] within a [SourceFile].
+///
+/// Unlike the base [SourceSpan], [FileSpan] lazily computes its line and column
+/// values based on its offset and the contents of [file]. [FileSpan.message] is
+/// also able to provide more context then [SourceSpan.message], and
+/// [FileSpan.union] will return a [FileSpan] if possible.
+///
+/// A [FileSpan] can be created using [SourceFile.span].
+abstract class FileSpan implements SourceSpanWithContext {
+  /// The [file] that [this] belongs to.
+  SourceFile get file;
+
+  /// Returns a new span that covers both [this] and [other].
+  ///
+  /// Unlike [union], [other] may be disjoint from [this]. If it is, the text
+  /// between the two will be covered by the returned span.
+  FileSpan expand(FileSpan other);
+}
+
+/// The implementation of [FileSpan].
+///
+/// This is split into a separate class so that `is _FileSpan` checks can be run
+/// to make certain operations more efficient. If we used `is FileSpan`, that
+/// would break if external classes implemented the interface.
+class _FileSpan extends SourceSpanMixin implements FileSpan {
+  final SourceFile file;
+
+  /// The offset of the beginning of the span.
+  ///
+  /// [start] is lazily generated from this to avoid allocating unnecessary
+  /// objects.
+  final int _start;
+
+  /// The offset of the end of the span.
+  ///
+  /// [end] is lazily generated from this to avoid allocating unnecessary
+  /// objects.
+  final int _end;
+
+  Uri get sourceUrl => file.url;
+  int get length => _end - _start;
+  FileLocation get start => new FileLocation._(file, _start);
+  FileLocation get end => new FileLocation._(file, _end);
+  String get text => file.getText(_start, _end);
+  String get context => file.getText(file.getOffset(start.line),
+      end.line == file.lines - 1 ? null : file.getOffset(end.line + 1));
+
+  _FileSpan(this.file, this._start, this._end) {
+    if (_end < _start) {
+      throw new ArgumentError('End $_end must come after start $_start.');
+    } else if (_end > file.length) {
+      throw new RangeError("End $_end must not be greater than the number "
+          "of characters in the file, ${file.length}.");
+    } else if (_start < 0) {
+      throw new RangeError("Start may not be negative, was $_start.");
+    }
+  }
+
+  int compareTo(SourceSpan other) {
+    if (other is! _FileSpan) return super.compareTo(other);
+
+    _FileSpan otherFile = other;
+    var result = _start.compareTo(otherFile._start);
+    return result == 0 ? _end.compareTo(otherFile._end) : result;
+  }
+
+  SourceSpan union(SourceSpan other) {
+    if (other is! FileSpan) return super.union(other);
+
+    
+    _FileSpan span = expand(other);
+
+    if (other is _FileSpan) {
+      if (this._start > other._end || other._start > this._end) {
+        throw new ArgumentError("Spans $this and $other are disjoint.");
+      }
+    } else {
+      if (this._start > other.end.offset || other.start.offset > this._end) {
+        throw new ArgumentError("Spans $this and $other are disjoint.");
+      }
+    }
+
+    return span;
+  }
+
+  bool operator ==(other) {
+    if (other is! FileSpan) return super == other;
+    if (other is! _FileSpan) {
+      return super == other && sourceUrl == other.sourceUrl;
+    }
+
+    return _start == other._start && _end == other._end &&
+        sourceUrl == other.sourceUrl;
+  }
+
+  // Eliminates dart2js warning about overriding `==`, but not `hashCode`
+  int get hashCode => super.hashCode;
+
+  /// Returns a new span that covers both [this] and [other].
+  ///
+  /// Unlike [union], [other] may be disjoint from [this]. If it is, the text
+  /// between the two will be covered by the returned span.
+  FileSpan expand(FileSpan other) {
+    if (sourceUrl != other.sourceUrl) {
+      throw new ArgumentError("Source URLs \"${sourceUrl}\" and "
+          " \"${other.sourceUrl}\" don't match.");
+    }
+
+    if (other is _FileSpan) {
+      var start = math.min(this._start, other._start);
+      var end = math.max(this._end, other._end);
+      return new _FileSpan(file, start, end);
+    } else {
+      var start = math.min(this._start, other.start.offset);
+      var end = math.max(this._end, other.end.offset);
+      return new _FileSpan(file, start, end);
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/source_span/lib/src/location.dart b/mojo/public/dart/third_party/source_span/lib/src/location.dart
new file mode 100644
index 0000000..afb37c7
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/lib/src/location.dart
@@ -0,0 +1,100 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library source_span.location;
+
+import 'span.dart';
+
+// TODO(nweiz): Use SourceLocationMixin once we decide to cut a release with
+// breaking changes. See SourceLocationMixin for details.
+
+/// A class that describes a single location within a source file.
+///
+/// This class should not be extended. Instead, [SourceLocationBase] should be
+/// extended instead.
+class SourceLocation implements Comparable<SourceLocation> {
+  /// URL of the source containing this location.
+  ///
+  /// This may be null, indicating that the source URL is unknown or
+  /// unavailable.
+  final Uri sourceUrl;
+
+  /// The 0-based offset of this location in the source.
+  final int offset;
+
+  /// The 0-based line of this location in the source.
+  final int line;
+
+  /// The 0-based column of this location in the source
+  final int column;
+
+  /// Returns a representation of this location in the `source:line:column`
+  /// format used by text editors.
+  ///
+  /// This prints 1-based lines and columns.
+  String get toolString {
+    var source = sourceUrl == null ? 'unknown source' : sourceUrl;
+    return '$source:${line + 1}:${column + 1}';
+  }
+
+  /// Creates a new location indicating [offset] within [sourceUrl].
+  ///
+  /// [line] and [column] default to assuming the source is a single line. This
+  /// means that [line] defaults to 0 and [column] defaults to [offset].
+  ///
+  /// [sourceUrl] may be either a [String], a [Uri], or `null`.
+  SourceLocation(int offset, {sourceUrl, int line, int column})
+      : sourceUrl = sourceUrl is String ? Uri.parse(sourceUrl) : sourceUrl,
+        offset = offset,
+        line = line == null ? 0 : line,
+        column = column == null ? offset : column {
+    if (offset < 0) {
+      throw new RangeError("Offset may not be negative, was $offset.");
+    } else if (line != null && line < 0) {
+      throw new RangeError("Line may not be negative, was $line.");
+    } else if (column != null && column < 0) {
+      throw new RangeError("Column may not be negative, was $column.");
+    }
+  }
+
+  /// Returns the distance in characters between [this] and [other].
+  ///
+  /// This always returns a non-negative value.
+  int distance(SourceLocation other) {
+    if (sourceUrl != other.sourceUrl) {
+      throw new ArgumentError("Source URLs \"${sourceUrl}\" and "
+          "\"${other.sourceUrl}\" don't match.");
+    }
+    return (offset - other.offset).abs();
+  }
+
+  /// Returns a span that covers only a single point: this location.
+  SourceSpan pointSpan() => new SourceSpan(this, this, "");
+
+  /// Compares two locations.
+  ///
+  /// [other] must have the same source URL as [this].
+  int compareTo(SourceLocation other) {
+    if (sourceUrl != other.sourceUrl) {
+      throw new ArgumentError("Source URLs \"${sourceUrl}\" and "
+          "\"${other.sourceUrl}\" don't match.");
+    }
+    return offset - other.offset;
+  }
+
+  bool operator ==(other) =>
+      other is SourceLocation && sourceUrl == other.sourceUrl &&
+      offset == other.offset;
+
+  int get hashCode => sourceUrl.hashCode + offset;
+
+  String toString() => '<$runtimeType: $offset $toolString>';
+}
+
+/// A base class for source locations with [offset], [line], and [column] known
+/// at construction time.
+class SourceLocationBase extends SourceLocation {
+  SourceLocationBase(int offset, {sourceUrl, int line, int column})
+      : super(offset, sourceUrl: sourceUrl, line: line, column: column);
+}
diff --git a/mojo/public/dart/third_party/source_span/lib/src/location_mixin.dart b/mojo/public/dart/third_party/source_span/lib/src/location_mixin.dart
new file mode 100644
index 0000000..5aa0de5
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/lib/src/location_mixin.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library source_span.location_mixin;
+
+import 'location.dart';
+import 'span.dart';
+
+// Note: this class duplicates a lot of functionality of [SourceLocation]. This
+// is because in order for SourceLocation to use SourceLocationMixin,
+// SourceLocationMixin couldn't implement SourceLocation. In SourceSpan we
+// handle this by making the class itself non-extensible, but that would be a
+// breaking change for SourceLocation. So until we want to endure the pain of
+// cutting a release with breaking changes, we duplicate the code here.
+
+/// A mixin for easily implementing [SourceLocation].
+abstract class SourceLocationMixin implements SourceLocation {
+  String get toolString {
+    var source = sourceUrl == null ? 'unknown source' : sourceUrl;
+    return '$source:${line + 1}:${column + 1}';
+  }
+
+  int distance(SourceLocation other) {
+    if (sourceUrl != other.sourceUrl) {
+      throw new ArgumentError("Source URLs \"${sourceUrl}\" and "
+          "\"${other.sourceUrl}\" don't match.");
+    }
+    return (offset - other.offset).abs();
+  }
+
+  SourceSpan pointSpan() => new SourceSpan(this, this, "");
+
+  int compareTo(SourceLocation other) {
+    if (sourceUrl != other.sourceUrl) {
+      throw new ArgumentError("Source URLs \"${sourceUrl}\" and "
+          "\"${other.sourceUrl}\" don't match.");
+    }
+    return offset - other.offset;
+  }
+
+  bool operator ==(other) =>
+      other is SourceLocation &&
+      sourceUrl == other.sourceUrl &&
+      offset == other.offset;
+
+  int get hashCode => sourceUrl.hashCode + offset;
+
+  String toString() => '<$runtimeType: $offset $toolString>';
+}
+
diff --git a/mojo/public/dart/third_party/source_span/lib/src/span.dart b/mojo/public/dart/third_party/source_span/lib/src/span.dart
new file mode 100644
index 0000000..9f15048
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/lib/src/span.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library source_span.span;
+
+import 'location.dart';
+import 'span_mixin.dart';
+
+/// A class that describes a segment of source text.
+abstract class SourceSpan implements Comparable<SourceSpan> {
+  /// The start location of this span.
+  final SourceLocation start;
+
+  /// The end location of this span, exclusive.
+  final SourceLocation end;
+
+  /// The source text for this span.
+  final String text;
+
+  /// The URL of the source (typically a file) of this span.
+  ///
+  /// This may be null, indicating that the source URL is unknown or
+  /// unavailable.
+  final Uri sourceUrl;
+
+  /// The length of this span, in characters.
+  final int length;
+
+  /// Creates a new span from [start] to [end] (exclusive) containing [text].
+  ///
+  /// [start] and [end] must have the same source URL and [start] must come
+  /// before [end]. [text] must have a number of characters equal to the
+  /// distance between [start] and [end].
+  factory SourceSpan(SourceLocation start, SourceLocation end, String text) =>
+      new SourceSpanBase(start, end, text);
+
+  /// Creates a new span that's the union of [this] and [other].
+  ///
+  /// The two spans must have the same source URL and may not be disjoint.
+  /// [text] is computed by combining [this.text] and [other.text].
+  SourceSpan union(SourceSpan other);
+
+  /// Compares two spans.
+  ///
+  /// [other] must have the same source URL as [this]. This orders spans by
+  /// [start] then [length].
+  int compareTo(SourceSpan other);
+
+  /// Formats [message] in a human-friendly way associated with this span.
+  ///
+  /// [color] may either be a [String], a [bool], or `null`. If it's a string,
+  /// it indicates an ANSII terminal color escape that should be used to
+  /// highlight the span's text. If it's `true`, it indicates that the text
+  /// should be highlighted using the default color. If it's `false` or `null`,
+  /// it indicates that the text shouldn't be highlighted.
+  String message(String message, {color});
+}
+
+/// A base class for source spans with [start], [end], and [text] known at
+/// construction time.
+class SourceSpanBase extends SourceSpanMixin {
+  final SourceLocation start;
+  final SourceLocation end;
+  final String text;
+
+  SourceSpanBase(this.start, this.end, this.text) {
+    if (end.sourceUrl != start.sourceUrl) {
+      throw new ArgumentError("Source URLs \"${start.sourceUrl}\" and "
+          " \"${end.sourceUrl}\" don't match.");
+    } else if (end.offset < start.offset) {
+      throw new ArgumentError('End $end must come after start $start.');
+    } else if (text.length != start.distance(end)) {
+      throw new ArgumentError('Text "$text" must be ${start.distance(end)} '
+          'characters long.');
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/source_span/lib/src/span_exception.dart b/mojo/public/dart/third_party/source_span/lib/src/span_exception.dart
new file mode 100644
index 0000000..36f2488
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/lib/src/span_exception.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library source_span.span_exception;
+
+import 'span.dart';
+
+/// A class for exceptions that have source span information attached.
+class SourceSpanException implements Exception {
+  /// A message describing the exception.
+  final String message;
+
+  /// The span associated with this exception.
+  ///
+  /// This may be `null` if the source location can't be determined.
+  final SourceSpan span;
+
+  SourceSpanException(this.message, this.span);
+
+  /// Returns a string representation of [this].
+  ///
+  /// [color] may either be a [String], a [bool], or `null`. If it's a string,
+  /// it indicates an ANSII terminal color escape that should be used to
+  /// highlight the span's text. If it's `true`, it indicates that the text
+  /// should be highlighted using the default color. If it's `false` or `null`,
+  /// it indicates that the text shouldn't be highlighted.
+  String toString({color}) {
+    if (span == null) return message;
+    return "Error on " + span.message(message, color: color);
+  }
+}
+
+/// A [SourceSpanException] that's also a [FormatException].
+class SourceSpanFormatException extends SourceSpanException
+    implements FormatException {
+  final source;
+
+  int get offset => span == null ? null : span.start.offset;
+
+  SourceSpanFormatException(String message, SourceSpan span, [this.source])
+      : super(message, span);
+}
diff --git a/mojo/public/dart/third_party/source_span/lib/src/span_mixin.dart b/mojo/public/dart/third_party/source_span/lib/src/span_mixin.dart
new file mode 100644
index 0000000..b4503fa
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/lib/src/span_mixin.dart
@@ -0,0 +1,106 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library source_span.span_mixin;
+
+import 'dart:math' as math;
+import 'package:path/path.dart' as p;
+
+import 'colors.dart' as colors;
+import 'span.dart';
+import 'span_with_context.dart';
+import 'utils.dart';
+
+/// A mixin for easily implementing [SourceSpan].
+///
+/// This implements the [SourceSpan] methods in terms of [start], [end], and
+/// [text]. This assumes that [start] and [end] have the same source URL, that
+/// [start] comes before [end], and that [text] has a number of characters equal
+/// to the distance between [start] and [end].
+abstract class SourceSpanMixin implements SourceSpan {
+  Uri get sourceUrl => start.sourceUrl;
+  int get length => end.offset - start.offset;
+
+  int compareTo(SourceSpan other) {
+    var result = start.compareTo(other.start);
+    return result == 0 ? end.compareTo(other.end) : result;
+  }
+
+  SourceSpan union(SourceSpan other) {
+    if (sourceUrl != other.sourceUrl) {
+      throw new ArgumentError("Source URLs \"${sourceUrl}\" and "
+          " \"${other.sourceUrl}\" don't match.");
+    }
+
+    var start = min(this.start, other.start);
+    var end = max(this.end, other.end);
+    var beginSpan = start == this.start ? this : other;
+    var endSpan = end == this.end ? this : other;
+
+    if (beginSpan.end.compareTo(endSpan.start) < 0) {
+      throw new ArgumentError("Spans $this and $other are disjoint.");
+    }
+
+    var text = beginSpan.text +
+        endSpan.text.substring(beginSpan.end.distance(endSpan.start));
+    return new SourceSpan(start, end, text);
+  }
+
+  String message(String message, {color}) {
+    if (color == true) color = colors.RED;
+    if (color == false) color = null;
+
+    var line = start.line;
+    var column = start.column;
+
+    var buffer = new StringBuffer();
+    buffer.write('line ${line + 1}, column ${column + 1}');
+    if (sourceUrl != null) buffer.write(' of ${p.prettyUri(sourceUrl)}');
+    buffer.write(': $message');
+
+    if (length == 0 && this is! SourceSpanWithContext) return buffer.toString();
+    buffer.write("\n");
+
+    var textLine;
+    if (this is SourceSpanWithContext) {
+      var context = (this as SourceSpanWithContext).context;
+      var lineStart = findLineStart(context, text, column);
+      if (lineStart != null && lineStart > 0) {
+        buffer.write(context.substring(0, lineStart));
+        context = context.substring(lineStart);
+      }
+      var endIndex = context.indexOf('\n');
+      textLine = endIndex == -1 ? context : context.substring(0, endIndex + 1);
+      column = math.min(column, textLine.length - 1);
+    } else {
+      textLine = text.split("\n").first;
+      column = 0;
+    }
+
+    var toColumn =
+        math.min(column + end.offset - start.offset, textLine.length);
+    if (color != null) {
+      buffer.write(textLine.substring(0, column));
+      buffer.write(color);
+      buffer.write(textLine.substring(column, toColumn));
+      buffer.write(colors.NONE);
+      buffer.write(textLine.substring(toColumn));
+    } else {
+      buffer.write(textLine);
+    }
+    if (!textLine.endsWith('\n')) buffer.write('\n');
+    buffer.write(' ' * column);
+    if (color != null) buffer.write(color);
+    buffer.write('^' * math.max(toColumn - column, 1));
+    if (color != null) buffer.write(colors.NONE);
+    return buffer.toString();
+  }
+
+  bool operator ==(other) => other is SourceSpan &&
+      start == other.start && end == other.end;
+
+  int get hashCode => start.hashCode + (31 * end.hashCode);
+
+  String toString() => '<$runtimeType: from $start to $end "$text">';
+}
diff --git a/mojo/public/dart/third_party/source_span/lib/src/span_with_context.dart b/mojo/public/dart/third_party/source_span/lib/src/span_with_context.dart
new file mode 100644
index 0000000..0012e3f
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/lib/src/span_with_context.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library source_span.span_with_context;
+
+import 'location.dart';
+import 'span.dart';
+import 'utils.dart';
+
+/// A class that describes a segment of source text with additional context.
+class SourceSpanWithContext extends SourceSpanBase {
+  /// Text around the span, which includes the line containing this span.
+  final String context;
+
+  /// Creates a new span from [start] to [end] (exclusive) containing [text], in
+  /// the given [context].
+  ///
+  /// [start] and [end] must have the same source URL and [start] must come
+  /// before [end]. [text] must have a number of characters equal to the
+  /// distance between [start] and [end]. [context] must contain [text], and
+  /// [text] should start at `start.column` from the beginning of a line in
+  /// [context].
+  SourceSpanWithContext(
+      SourceLocation start, SourceLocation end, String text, this.context)
+      : super(start, end, text) {
+    if (!context.contains(text)) {
+      throw new ArgumentError(
+          'The context line "$context" must contain "$text".');
+    }
+
+    if (findLineStart(context, text, start.column) == null) {
+      throw new ArgumentError('The span text "$text" must start at '
+          'column ${start.column + 1} in a line within "$context".');
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/source_span/lib/src/utils.dart b/mojo/public/dart/third_party/source_span/lib/src/utils.dart
new file mode 100644
index 0000000..fa08957
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/lib/src/utils.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library source_span.utils;
+
+/// Returns the minimum of [obj1] and [obj2] according to
+/// [Comparable.compareTo].
+Comparable min(Comparable obj1, Comparable obj2) =>
+    obj1.compareTo(obj2) > 0 ? obj2 : obj1;
+
+/// Returns the maximum of [obj1] and [obj2] according to
+/// [Comparable.compareTo].
+Comparable max(Comparable obj1, Comparable obj2) =>
+    obj1.compareTo(obj2) > 0 ? obj1 : obj2;
+
+/// Finds a line in [context] containing [text] at the specified [column].
+///
+/// Returns the index in [context] where that line begins, or null if none
+/// exists.
+int findLineStart(String context, String text, int column) {
+  var isEmpty = text == '';
+  var index = context.indexOf(text);
+  while (index != -1) {
+    var lineStart = context.lastIndexOf('\n', index) + 1;
+    var textColumn = index - lineStart;
+    if (column == textColumn || (isEmpty && column == textColumn + 1)) {
+      return lineStart;
+    }
+    index = context.indexOf(text, index + 1);
+  }
+  return null;
+}
diff --git a/mojo/public/dart/third_party/source_span/pubspec.yaml b/mojo/public/dart/third_party/source_span/pubspec.yaml
new file mode 100644
index 0000000..25de799
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/pubspec.yaml
@@ -0,0 +1,11 @@
+name: source_span
+version: 1.2.0
+author: Dart Team <misc@dartlang.org>
+description: A library for identifying source spans and locations.
+homepage: https://github.com/dart-lang/source_span
+dependencies:
+  path: '>=1.2.0 <2.0.0'
+environment:
+  sdk: '>=0.8.10+6 <2.0.0'
+dev_dependencies:
+  test: '>=0.12.0 <0.13.0'
diff --git a/mojo/public/dart/third_party/source_span/test/file_message_test.dart b/mojo/public/dart/third_party/source_span/test/file_message_test.dart
new file mode 100644
index 0000000..5935c58
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/test/file_message_test.dart
@@ -0,0 +1,100 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:source_span/source_span.dart';
+import 'package:source_span/src/colors.dart' as colors;
+
+main() {
+  var file;
+  setUp(() {
+    file = new SourceFile("""
+foo bar baz
+whiz bang boom
+zip zap zop
+""", url: "foo.dart");
+  });
+
+  test("points to the span in the source", () {
+    expect(file.span(4, 7).message("oh no"), equals("""
+line 1, column 5 of foo.dart: oh no
+foo bar baz
+    ^^^"""));
+  });
+
+  test("gracefully handles a missing source URL", () {
+    var span = new SourceFile("foo bar baz").span(4, 7);
+    expect(span.message("oh no"), equals("""
+line 1, column 5: oh no
+foo bar baz
+    ^^^"""));
+  });
+
+  test("highlights the first line of a multiline span", () {
+    expect(file.span(4, 20).message("oh no"), equals("""
+line 1, column 5 of foo.dart: oh no
+foo bar baz
+    ^^^^^^^^"""));
+  });
+
+  test("works for a point span", () {
+    expect(file.location(4).pointSpan().message("oh no"), equals("""
+line 1, column 5 of foo.dart: oh no
+foo bar baz
+    ^"""));
+  });
+
+  test("works for a point span at the end of a line", () {
+    expect(file.location(11).pointSpan().message("oh no"), equals("""
+line 1, column 12 of foo.dart: oh no
+foo bar baz
+           ^"""));
+  });
+
+  test("works for a point span at the end of the file", () {
+    expect(file.location(38).pointSpan().message("oh no"), equals("""
+line 3, column 12 of foo.dart: oh no
+zip zap zop
+           ^"""));
+  });
+
+  test("works for a point span in an empty file", () {
+    expect(new SourceFile("").location(0).pointSpan().message("oh no"),
+        equals("""
+line 1, column 1: oh no
+
+^"""));
+  });
+
+  test("works for a single-line file without a newline", () {
+    expect(new SourceFile("foo bar").span(0, 7).message("oh no"),
+        equals("""
+line 1, column 1: oh no
+foo bar
+^^^^^^^"""));
+  });
+
+  group("colors", () {
+    test("doesn't colorize if color is false", () {
+      expect(file.span(4, 7).message("oh no", color: false), equals("""
+line 1, column 5 of foo.dart: oh no
+foo bar baz
+    ^^^"""));
+    });
+
+    test("colorizes if color is true", () {
+      expect(file.span(4, 7).message("oh no", color: true), equals("""
+line 1, column 5 of foo.dart: oh no
+foo ${colors.RED}bar${colors.NONE} baz
+    ${colors.RED}^^^${colors.NONE}"""));
+    });
+
+    test("uses the given color if it's passed", () {
+      expect(file.span(4, 7).message("oh no", color: colors.YELLOW), equals("""
+line 1, column 5 of foo.dart: oh no
+foo ${colors.YELLOW}bar${colors.NONE} baz
+    ${colors.YELLOW}^^^${colors.NONE}"""));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/source_span/test/file_test.dart b/mojo/public/dart/third_party/source_span/test/file_test.dart
new file mode 100644
index 0000000..54bc3d3
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/test/file_test.dart
@@ -0,0 +1,376 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:source_span/source_span.dart';
+
+main() {
+  var file;
+  setUp(() {
+    file = new SourceFile("""
+foo bar baz
+whiz bang boom
+zip zap zop""", url: "foo.dart");
+  });
+
+  group("errors", () {
+    group("for span()", () {
+      test("end must come after start", () {
+        expect(() => file.span(10, 5), throwsArgumentError);
+      });
+
+      test("start may not be negative", () {
+        expect(() => file.span(-1, 5), throwsRangeError);
+      });
+
+      test("end may not be outside the file", () {
+        expect(() => file.span(10, 100), throwsRangeError);
+      });
+    });
+
+    group("for location()", () {
+      test("offset may not be negative", () {
+        expect(() => file.location(-1), throwsRangeError);
+      });
+
+      test("offset may not be outside the file", () {
+        expect(() => file.location(100), throwsRangeError);
+      });
+    });
+
+    group("for getLine()", () {
+      test("offset may not be negative", () {
+        expect(() => file.getLine(-1), throwsRangeError);
+      });
+
+      test("offset may not be outside the file", () {
+        expect(() => file.getLine(100), throwsRangeError);
+      });
+    });
+
+    group("for getColumn()", () {
+      test("offset may not be negative", () {
+        expect(() => file.getColumn(-1), throwsRangeError);
+      });
+
+      test("offset may not be outside the file", () {
+        expect(() => file.getColumn(100), throwsRangeError);
+      });
+
+      test("line may not be negative", () {
+        expect(() => file.getColumn(1, line: -1), throwsRangeError);
+      });
+
+      test("line may not be outside the file", () {
+        expect(() => file.getColumn(1, line: 100), throwsRangeError);
+      });
+
+      test("line must be accurate", () {
+        expect(() => file.getColumn(1, line: 1), throwsRangeError);
+      });
+    });
+
+    group("getOffset()", () {
+      test("line may not be negative", () {
+        expect(() => file.getOffset(-1), throwsRangeError);
+      });
+
+      test("column may not be negative", () {
+        expect(() => file.getOffset(1, -1), throwsRangeError);
+      });
+
+      test("line may not be outside the file", () {
+        expect(() => file.getOffset(100), throwsRangeError);
+      });
+
+      test("column may not be outside the file", () {
+        expect(() => file.getOffset(2, 100), throwsRangeError);
+      });
+ 
+      test("column may not be outside the line", () {
+        expect(() => file.getOffset(1, 20), throwsRangeError);
+      });
+    });
+
+    group("for getText()", () {
+      test("end must come after start", () {
+        expect(() => file.getText(10, 5), throwsArgumentError);
+      });
+
+      test("start may not be negative", () {
+        expect(() => file.getText(-1, 5), throwsRangeError);
+      });
+
+      test("end may not be outside the file", () {
+        expect(() => file.getText(10, 100), throwsRangeError);
+      });
+    });
+
+    group("for span().union()", () {
+      test("source URLs must match", () {
+        var other = new SourceSpan(
+            new SourceLocation(10), new SourceLocation(11), "_");
+
+        expect(() => file.span(9, 10).union(other), throwsArgumentError);
+      });
+
+      test("spans may not be disjoint", () {
+        expect(() => file.span(9, 10).union(file.span(11, 12)),
+            throwsArgumentError);
+      });
+    });
+
+    test("for span().expand() source URLs must match", () {
+      var other = new SourceFile("""
+foo bar baz
+whiz bang boom
+zip zap zop""", url: "bar.dart").span(10, 11);
+
+      expect(() => file.span(9, 10).expand(other), throwsArgumentError);
+    });
+  });
+
+  test('fields work correctly', () {
+    expect(file.url, equals(Uri.parse("foo.dart")));
+    expect(file.lines, equals(3));
+    expect(file.length, equals(38));
+  });
+
+  group("new SourceFile()", () {
+    test("handles CRLF correctly", () {
+      expect(new SourceFile("foo\r\nbar").getLine(6), equals(1));
+    });
+
+    test("handles a lone CR correctly", () {
+      expect(new SourceFile("foo\rbar").getLine(5), equals(1));
+    });
+  });
+
+  group("span()", () {
+    test("returns a span between the given offsets", () {
+      var span = file.span(5, 10);
+      expect(span.start, equals(file.location(5)));
+      expect(span.end, equals(file.location(10)));
+    });
+
+    test("end defaults to the end of the file", () {
+      var span = file.span(5);
+      expect(span.start, equals(file.location(5)));
+      expect(span.end, equals(file.location(file.length - 1)));
+    });
+  });
+
+  group("getLine()", () {
+    test("works for a middle character on the line", () {
+      expect(file.getLine(15), equals(1));
+    });
+
+    test("works for the first character of a line", () {
+      expect(file.getLine(12), equals(1));
+    });
+
+    test("works for a newline character", () {
+      expect(file.getLine(11), equals(0));
+    });
+
+    test("works for the last offset", () {
+      expect(file.getLine(file.length), equals(2));
+    });
+  });
+
+  group("getColumn()", () {
+    test("works for a middle character on the line", () {
+      expect(file.getColumn(15), equals(3));
+    });
+
+    test("works for the first character of a line", () {
+      expect(file.getColumn(12), equals(0));
+    });
+
+    test("works for a newline character", () {
+      expect(file.getColumn(11), equals(11));
+    });
+
+    test("works when line is passed as well", () {
+      expect(file.getColumn(12, line: 1), equals(0));
+    });
+
+    test("works for the last offset", () {
+      expect(file.getColumn(file.length), equals(11));
+    });
+  });
+
+  group("getOffset()", () {
+    test("works for a middle character on the line", () {
+      expect(file.getOffset(1, 3), equals(15));
+    });
+
+    test("works for the first character of a line", () {
+      expect(file.getOffset(1), equals(12));
+    });
+
+    test("works for a newline character", () {
+      expect(file.getOffset(0, 11), equals(11));
+    });
+
+    test("works for the last offset", () {
+      expect(file.getOffset(2, 11), equals(file.length));
+    });
+  });
+
+  group("getText()", () {
+    test("returns a substring of the source", () {
+      expect(file.getText(8, 15), equals("baz\nwhi"));
+    });
+
+    test("end defaults to the end of the file", () {
+      expect(file.getText(20), equals("g boom\nzip zap zop"));
+    });
+  });
+
+  group("FileLocation", () {
+    test("reports the correct line number", () {
+      expect(file.location(15).line, equals(1));
+    });
+
+    test("reports the correct column number", () {
+      expect(file.location(15).column, equals(3));
+    });
+
+    test("pointSpan() returns a FileSpan", () {
+      var location = file.location(15);
+      var span = location.pointSpan();
+      expect(span, new isInstanceOf<FileSpan>());
+      expect(span.start, equals(location));
+      expect(span.end, equals(location));
+      expect(span.text, isEmpty);
+    });
+  });
+
+  group("FileSpan", () {
+    test("text returns a substring of the source", () {
+      expect(file.span(8, 15).text, equals("baz\nwhi"));
+    });
+
+    test("context contains the span's text", () {
+      var span = file.span(8, 15);
+      expect(span.context.contains(span.text), isTrue);
+      expect(span.context, equals('foo bar baz\nwhiz bang boom\n'));
+    });
+
+    group("union()", () {
+      var span;
+      setUp(() {
+        span = file.span(5, 12);
+      });
+
+      test("works with a preceding adjacent span", () {
+        var other = file.span(0, 5);
+        var result = span.union(other);
+        expect(result.start, equals(other.start));
+        expect(result.end, equals(span.end));
+        expect(result.text, equals("foo bar baz\n"));
+      });
+
+      test("works with a preceding overlapping span", () {
+        var other = file.span(0, 8);
+        var result = span.union(other);
+        expect(result.start, equals(other.start));
+        expect(result.end, equals(span.end));
+        expect(result.text, equals("foo bar baz\n"));
+      });
+
+      test("works with a following adjacent span", () {
+        var other = file.span(12, 16);
+        var result = span.union(other);
+        expect(result.start, equals(span.start));
+        expect(result.end, equals(other.end));
+        expect(result.text, equals("ar baz\nwhiz"));
+      });
+
+      test("works with a following overlapping span", () {
+        var other = file.span(9, 16);
+        var result = span.union(other);
+        expect(result.start, equals(span.start));
+        expect(result.end, equals(other.end));
+        expect(result.text, equals("ar baz\nwhiz"));
+      });
+
+      test("works with an internal overlapping span", () {
+        var other = file.span(7, 10);
+        expect(span.union(other), equals(span));
+      });
+
+      test("works with an external overlapping span", () {
+        var other = file.span(0, 16);
+        expect(span.union(other), equals(other));
+      });
+
+      test("returns a FileSpan for a FileSpan input", () {
+        expect(span.union(file.span(0, 5)), new isInstanceOf<FileSpan>());
+      });
+
+      test("returns a base SourceSpan for a SourceSpan input", () {
+        var other = new SourceSpan(
+            new SourceLocation(0, sourceUrl: "foo.dart"),
+            new SourceLocation(5, sourceUrl: "foo.dart"),
+            "hey, ");
+        var result = span.union(other);
+        expect(result, isNot(new isInstanceOf<FileSpan>()));
+        expect(result.start, equals(other.start));
+        expect(result.end, equals(span.end));
+        expect(result.text, equals("hey, ar baz\n"));
+      });
+    });
+
+    group("expand()", () {
+      var span;
+      setUp(() {
+        span = file.span(5, 12);
+      });
+
+      test("works with a preceding nonadjacent span", () {
+        var other = file.span(0, 3);
+        var result = span.expand(other);
+        expect(result.start, equals(other.start));
+        expect(result.end, equals(span.end));
+        expect(result.text, equals("foo bar baz\n"));
+      });
+
+      test("works with a preceding overlapping span", () {
+        var other = file.span(0, 8);
+        var result = span.expand(other);
+        expect(result.start, equals(other.start));
+        expect(result.end, equals(span.end));
+        expect(result.text, equals("foo bar baz\n"));
+      });
+
+      test("works with a following nonadjacent span", () {
+        var other = file.span(14, 16);
+        var result = span.expand(other);
+        expect(result.start, equals(span.start));
+        expect(result.end, equals(other.end));
+        expect(result.text, equals("ar baz\nwhiz"));
+      });
+
+      test("works with a following overlapping span", () {
+        var other = file.span(9, 16);
+        var result = span.expand(other);
+        expect(result.start, equals(span.start));
+        expect(result.end, equals(other.end));
+        expect(result.text, equals("ar baz\nwhiz"));
+      });
+
+      test("works with an internal overlapping span", () {
+        var other = file.span(7, 10);
+        expect(span.expand(other), equals(span));
+      });
+
+      test("works with an external overlapping span", () {
+        var other = file.span(0, 16);
+        expect(span.expand(other), equals(other));
+      });
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/source_span/test/location_test.dart b/mojo/public/dart/third_party/source_span/test/location_test.dart
new file mode 100644
index 0000000..dcd497a
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/test/location_test.dart
@@ -0,0 +1,101 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:source_span/source_span.dart';
+
+main() {
+  var location;
+  setUp(() {
+    location = new SourceLocation(15,
+        line: 2, column: 6, sourceUrl: "foo.dart");
+  });
+
+  group('errors', () {
+    group('for new SourceLocation()', () {
+      test('offset may not be negative', () {
+        expect(() => new SourceLocation(-1), throwsRangeError);
+      });
+
+      test('line may not be negative', () {
+        expect(() => new SourceLocation(0, line: -1), throwsRangeError);
+      });
+
+      test('column may not be negative', () {
+        expect(() => new SourceLocation(0, column: -1), throwsRangeError);
+      });
+    });
+
+    test('for distance() source URLs must match', () {
+      expect(() => location.distance(new SourceLocation(0)),
+          throwsArgumentError);
+    });
+
+    test('for compareTo() source URLs must match', () {
+      expect(() => location.compareTo(new SourceLocation(0)),
+          throwsArgumentError);
+    });
+  });
+
+  test('fields work correctly', () {
+    expect(location.sourceUrl, equals(Uri.parse("foo.dart")));
+    expect(location.offset, equals(15));
+    expect(location.line, equals(2));
+    expect(location.column, equals(6));
+  });
+
+  group('toolString', () {
+    test('returns a computer-readable representation', () {
+      expect(location.toolString, equals('foo.dart:3:7'));
+    });
+
+    test('gracefully handles a missing source URL', () {
+      var location = new SourceLocation(15, line: 2, column: 6);
+      expect(location.toolString, equals('unknown source:3:7'));
+    });
+  });
+
+  test("distance returns the absolute distance between locations", () {
+    var other = new SourceLocation(10, sourceUrl: "foo.dart");
+    expect(location.distance(other), equals(5));
+    expect(other.distance(location), equals(5));
+  });
+
+  test("pointSpan returns an empty span at location", () {
+    var span = location.pointSpan();
+    expect(span.start, equals(location));
+    expect(span.end, equals(location));
+    expect(span.text, isEmpty);
+  });
+
+  group("compareTo()", () {
+    test("sorts by offset", () {
+      var other = new SourceLocation(20, sourceUrl: "foo.dart");
+      expect(location.compareTo(other), lessThan(0));
+      expect(other.compareTo(location), greaterThan(0));
+    });
+
+    test("considers equal locations equal", () {
+      expect(location.compareTo(location), equals(0));
+    });
+  });
+
+
+  group("equality", () {
+    test("two locations with the same offset and source are equal", () {
+      var other = new SourceLocation(15, sourceUrl: "foo.dart");
+      expect(location, equals(other));
+    });
+
+    test("a different offset isn't equal", () {
+      var other = new SourceLocation(10, sourceUrl: "foo.dart");
+      expect(location, isNot(equals(other)));
+    });
+
+    test("a different source isn't equal", () {
+      var other = new SourceLocation(15, sourceUrl: "bar.dart");
+      expect(location, isNot(equals(other)));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/source_span/test/span_test.dart b/mojo/public/dart/third_party/source_span/test/span_test.dart
new file mode 100644
index 0000000..113848a
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/test/span_test.dart
@@ -0,0 +1,347 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:source_span/source_span.dart';
+import 'package:source_span/src/colors.dart' as colors;
+
+main() {
+  var span;
+  setUp(() {
+    span = new SourceSpan(
+        new SourceLocation(5, sourceUrl: "foo.dart"),
+        new SourceLocation(12, sourceUrl: "foo.dart"),
+        "foo bar");
+  });
+
+  group('errors', () {
+    group('for new SourceSpan()', () {
+      test('source URLs must match', () {
+        var start = new SourceLocation(0, sourceUrl: "foo.dart");
+        var end = new SourceLocation(1, sourceUrl: "bar.dart");
+        expect(() => new SourceSpan(start, end, "_"), throwsArgumentError);
+      });
+
+      test('end must come after start', () {
+        var start = new SourceLocation(1);
+        var end = new SourceLocation(0);
+        expect(() => new SourceSpan(start, end, "_"), throwsArgumentError);
+      });
+
+      test('text must be the right length', () {
+        var start = new SourceLocation(0);
+        var end = new SourceLocation(1);
+        expect(() => new SourceSpan(start, end, "abc"), throwsArgumentError);
+      });
+    });
+
+    group('for new SourceSpanWithContext()', () {
+      test('context must contain text', () {
+        var start = new SourceLocation(2);
+        var end = new SourceLocation(5);
+        expect(() => new SourceSpanWithContext(
+              start, end, "abc", "--axc--"), throwsArgumentError);
+      });
+
+      test('text starts at start.column in context', () {
+        var start = new SourceLocation(3);
+        var end = new SourceLocation(5);
+        expect(() => new SourceSpanWithContext(
+              start, end, "abc", "--abc--"), throwsArgumentError);
+      });
+
+      test('text starts at start.column of line in multi-line context', () {
+        var start = new SourceLocation(4, line: 55, column: 3);
+        var end = new SourceLocation(7, line: 55, column: 6);
+        expect(() => new SourceSpanWithContext(
+              start, end, "abc", "\n--abc--"), throwsArgumentError);
+        expect(() => new SourceSpanWithContext(
+              start, end, "abc", "\n----abc--"), throwsArgumentError);
+        expect(() => new SourceSpanWithContext(
+              start, end, "abc", "\n\n--abc--"), throwsArgumentError);
+
+        // However, these are valid:
+        new SourceSpanWithContext(start, end, "abc", "\n---abc--");
+        new SourceSpanWithContext(start, end, "abc", "\n\n---abc--");
+      });
+
+      test('text can occur multiple times in context', () {
+        var start1 = new SourceLocation(4, line: 55, column: 2);
+        var end1 = new SourceLocation(7, line: 55, column: 5);
+        var start2 = new SourceLocation(4, line: 55, column: 8);
+        var end2 = new SourceLocation(7, line: 55, column: 11);
+        new SourceSpanWithContext(start1, end1, "abc", "--abc---abc--\n");
+        new SourceSpanWithContext(start1, end1, "abc", "--abc--abc--\n");
+        new SourceSpanWithContext(start2, end2, "abc", "--abc---abc--\n");
+        new SourceSpanWithContext(start2, end2, "abc", "---abc--abc--\n");
+        expect(() => new SourceSpanWithContext(
+              start1, end1, "abc", "---abc--abc--\n"), throwsArgumentError);
+        expect(() => new SourceSpanWithContext(
+              start2, end2, "abc", "--abc--abc--\n"), throwsArgumentError);
+      });
+    });
+
+    group('for union()', () {
+      test('source URLs must match', () {
+        var other = new SourceSpan(
+            new SourceLocation(12, sourceUrl: "bar.dart"),
+            new SourceLocation(13, sourceUrl: "bar.dart"),
+            "_");
+
+        expect(() => span.union(other), throwsArgumentError);
+      });
+
+      test('spans may not be disjoint', () {
+        var other = new SourceSpan(
+            new SourceLocation(13, sourceUrl: 'foo.dart'),
+            new SourceLocation(14, sourceUrl: 'foo.dart'),
+            "_");
+
+        expect(() => span.union(other), throwsArgumentError);
+      });
+    });
+
+    test('for compareTo() source URLs must match', () {
+      var other = new SourceSpan(
+          new SourceLocation(12, sourceUrl: "bar.dart"),
+          new SourceLocation(13, sourceUrl: "bar.dart"),
+          "_");
+
+      expect(() => span.compareTo(other), throwsArgumentError);
+    });
+  });
+
+  test('fields work correctly', () {
+    expect(span.start, equals(new SourceLocation(5, sourceUrl: "foo.dart")));
+    expect(span.end, equals(new SourceLocation(12, sourceUrl: "foo.dart")));
+    expect(span.sourceUrl, equals(Uri.parse("foo.dart")));
+    expect(span.length, equals(7));
+  });
+
+  group("union()", () {
+    test("works with a preceding adjacent span", () {
+      var other = new SourceSpan(
+          new SourceLocation(0, sourceUrl: "foo.dart"),
+          new SourceLocation(5, sourceUrl: "foo.dart"),
+          "hey, ");
+
+      var result = span.union(other);
+      expect(result.start, equals(other.start));
+      expect(result.end, equals(span.end));
+      expect(result.text, equals("hey, foo bar"));
+    });
+
+    test("works with a preceding overlapping span", () {
+      var other = new SourceSpan(
+          new SourceLocation(0, sourceUrl: "foo.dart"),
+          new SourceLocation(8, sourceUrl: "foo.dart"),
+          "hey, foo");
+
+      var result = span.union(other);
+      expect(result.start, equals(other.start));
+      expect(result.end, equals(span.end));
+      expect(result.text, equals("hey, foo bar"));
+    });
+
+    test("works with a following adjacent span", () {
+      var other = new SourceSpan(
+          new SourceLocation(12, sourceUrl: "foo.dart"),
+          new SourceLocation(16, sourceUrl: "foo.dart"),
+          " baz");
+
+      var result = span.union(other);
+      expect(result.start, equals(span.start));
+      expect(result.end, equals(other.end));
+      expect(result.text, equals("foo bar baz"));
+    });
+
+    test("works with a following overlapping span", () {
+      var other = new SourceSpan(
+          new SourceLocation(9, sourceUrl: "foo.dart"),
+          new SourceLocation(16, sourceUrl: "foo.dart"),
+          "bar baz");
+
+      var result = span.union(other);
+      expect(result.start, equals(span.start));
+      expect(result.end, equals(other.end));
+      expect(result.text, equals("foo bar baz"));
+    });
+
+    test("works with an internal overlapping span", () {
+      var other = new SourceSpan(
+          new SourceLocation(7, sourceUrl: "foo.dart"),
+          new SourceLocation(10, sourceUrl: "foo.dart"),
+          "o b");
+
+      expect(span.union(other), equals(span));
+    });
+
+    test("works with an external overlapping span", () {
+      var other = new SourceSpan(
+          new SourceLocation(0, sourceUrl: "foo.dart"),
+          new SourceLocation(16, sourceUrl: "foo.dart"),
+          "hey, foo bar baz");
+
+      expect(span.union(other), equals(other));
+    });
+  });
+
+  group("message()", () {
+    test("prints the text being described", () {
+      expect(span.message("oh no"), equals("""
+line 1, column 6 of foo.dart: oh no
+foo bar
+^^^^^^^"""));
+    });
+
+    test("gracefully handles a missing source URL", () {
+      var span = new SourceSpan(
+          new SourceLocation(5), new SourceLocation(12), "foo bar");
+
+      expect(span.message("oh no"), equalsIgnoringWhitespace("""
+line 1, column 6: oh no
+foo bar
+^^^^^^^"""));
+    });
+
+    test("gracefully handles empty text", () {
+      var span = new SourceSpan(
+          new SourceLocation(5), new SourceLocation(5), "");
+
+      expect(span.message("oh no"),
+          equals("line 1, column 6: oh no"));
+    });
+
+    test("doesn't colorize if color is false", () {
+      expect(span.message("oh no", color: false), equals("""
+line 1, column 6 of foo.dart: oh no
+foo bar
+^^^^^^^"""));
+    });
+
+    test("colorizes if color is true", () {
+      expect(span.message("oh no", color: true),
+          equals("""
+line 1, column 6 of foo.dart: oh no
+${colors.RED}foo bar${colors.NONE}
+${colors.RED}^^^^^^^${colors.NONE}"""));
+    });
+
+    test("uses the given color if it's passed", () {
+      expect(span.message("oh no", color: colors.YELLOW), equals("""
+line 1, column 6 of foo.dart: oh no
+${colors.YELLOW}foo bar${colors.NONE}
+${colors.YELLOW}^^^^^^^${colors.NONE}"""));
+    });
+  });
+
+  group("message() with context", () {
+    var spanWithContext;
+    setUp(() {
+      spanWithContext = new SourceSpanWithContext(
+          new SourceLocation(5, sourceUrl: "foo.dart"),
+          new SourceLocation(12, sourceUrl: "foo.dart"),
+          "foo bar",
+          "-----foo bar-----");
+    });
+
+    test("underlines under the right column", () {
+      expect(spanWithContext.message("oh no", color: colors.YELLOW), equals("""
+line 1, column 6 of foo.dart: oh no
+-----${colors.YELLOW}foo bar${colors.NONE}-----
+     ${colors.YELLOW}^^^^^^^${colors.NONE}"""));
+    });
+
+    test("underlines correctly when text appears twice", () {
+      var span = new SourceSpanWithContext(
+          new SourceLocation(9, column: 9, sourceUrl: "foo.dart"),
+          new SourceLocation(12, column: 12, sourceUrl: "foo.dart"),
+          "foo",
+          "-----foo foo-----");
+      expect(span.message("oh no", color: colors.YELLOW), equals("""
+line 1, column 10 of foo.dart: oh no
+-----foo ${colors.YELLOW}foo${colors.NONE}-----
+         ${colors.YELLOW}^^^${colors.NONE}"""));
+  });
+
+    test("supports lines of preceeding context", () {
+      var span = new SourceSpanWithContext(
+          new SourceLocation(5, line: 3, column: 5, sourceUrl: "foo.dart"),
+          new SourceLocation(12, line: 3, column: 12, sourceUrl: "foo.dart"),
+          "foo bar",
+          "previous\nlines\n-----foo bar-----\nfollowing line\n");
+
+      expect(span.message("oh no", color: colors.YELLOW), equals("""
+line 4, column 6 of foo.dart: oh no
+previous
+lines
+-----${colors.YELLOW}foo bar${colors.NONE}-----
+     ${colors.YELLOW}^^^^^^^${colors.NONE}"""));
+    });
+  });
+
+  group("compareTo()", () {
+    test("sorts by start location first", () {
+      var other = new SourceSpan(
+          new SourceLocation(6, sourceUrl: "foo.dart"),
+          new SourceLocation(14, sourceUrl: "foo.dart"),
+          "oo bar b");
+
+      expect(span.compareTo(other), lessThan(0));
+      expect(other.compareTo(span), greaterThan(0));
+    });
+
+    test("sorts by length second", () {
+      var other = new SourceSpan(
+          new SourceLocation(5, sourceUrl: "foo.dart"),
+          new SourceLocation(14, sourceUrl: "foo.dart"),
+          "foo bar b");
+
+      expect(span.compareTo(other), lessThan(0));
+      expect(other.compareTo(span), greaterThan(0));
+    });
+
+    test("considers equal spans equal", () {
+      expect(span.compareTo(span), equals(0));
+    });
+  });
+
+  group("equality", () {
+    test("two spans with the same locations are equal", () {
+      var other = new SourceSpan(
+          new SourceLocation(5, sourceUrl: "foo.dart"),
+          new SourceLocation(12, sourceUrl: "foo.dart"),
+          "foo bar");
+
+      expect(span, equals(other));
+    });
+
+    test("a different start isn't equal", () {
+      var other = new SourceSpan(
+          new SourceLocation(0, sourceUrl: "foo.dart"),
+          new SourceLocation(12, sourceUrl: "foo.dart"),
+          "hey, foo bar");
+
+      expect(span, isNot(equals(other)));
+    });
+
+    test("a different end isn't equal", () {
+      var other = new SourceSpan(
+          new SourceLocation(5, sourceUrl: "foo.dart"),
+          new SourceLocation(16, sourceUrl: "foo.dart"),
+          "foo bar baz");
+
+      expect(span, isNot(equals(other)));
+    });
+
+    test("a different source URL isn't equal", () {
+      var other = new SourceSpan(
+          new SourceLocation(5, sourceUrl: "bar.dart"),
+          new SourceLocation(12, sourceUrl: "bar.dart"),
+          "foo bar");
+
+      expect(span, isNot(equals(other)));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/source_span/test/utils_test.dart b/mojo/public/dart/third_party/source_span/test/utils_test.dart
new file mode 100644
index 0000000..5d973f5
--- /dev/null
+++ b/mojo/public/dart/third_party/source_span/test/utils_test.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:source_span/src/utils.dart';
+
+main() {
+  group('find line start', () {
+    test('skip entries in wrong column', () {
+      var context = '0_bb\n1_bbb\n2b____\n3bbb\n';
+      var index = findLineStart(context, 'b', 1);
+      expect(index, 11);
+      expect(context.substring(index - 1, index + 3), '\n2b_');
+    });
+
+    test('end of line column for empty text', () {
+      var context = '0123\n56789\nabcdefgh\n';
+      var index = findLineStart(context, '', 5);
+      expect(index, 5);
+      expect(context[index], '5');
+    });
+
+    test('column at the end of the file for empty text', () {
+      var context = '0\n2\n45\n';
+      var index = findLineStart(context, '', 2);
+      expect(index, 4);
+      expect(context[index], '4');
+
+      context = '0\n2\n45';
+      index = findLineStart(context, '', 2);
+      expect(index, 4);
+    });
+
+    test('found on the first line', () {
+      var context = '0\n2\n45\n';
+      var index = findLineStart(context, '0', 0);
+      expect(index, 0);
+    });
+
+    test('not found', () {
+      var context = '0\n2\n45\n';
+      var index = findLineStart(context, '0', 1);
+      expect(index, isNull);
+    });
+  });
+}
+
+_linearSearch(list, predicate) {
+  if (list.length == 0) return -1;
+  for (int i = 0; i < list.length; i++) {
+    if (predicate(list[i])) return i;
+  }
+  return list.length;
+}
diff --git a/mojo/public/dart/third_party/stack_trace/.gitignore b/mojo/public/dart/third_party/stack_trace/.gitignore
new file mode 100644
index 0000000..7dbf035
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/.gitignore
@@ -0,0 +1,15 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.pub/
+build/
+packages
+.packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/stack_trace/.test_config b/mojo/public/dart/third_party/stack_trace/.test_config
new file mode 100644
index 0000000..412fc5c
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/.test_config
@@ -0,0 +1,3 @@
+{
+  "test_package": true
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/stack_trace/CHANGELOG.md b/mojo/public/dart/third_party/stack_trace/CHANGELOG.md
new file mode 100644
index 0000000..dae0db6
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/CHANGELOG.md
@@ -0,0 +1,145 @@
+## 1.4.2
+
+* Improve the display of `data:` URIs in stack traces.
+
+## 1.4.1
+
+* Fix a crashing bug in `UnparsedFrame.toString()`.
+
+## 1.4.0
+
+* `new Trace.parse()` and related constructors will no longer throw an exception
+  if they encounter an unparseable stack frame. Instead, they will generate an
+  `UnparsedFrame`, which exposes no metadata but preserves the frame's original
+  text.
+
+* Properly parse native-code V8 frames.
+
+## 1.3.5
+
+* Properly shorten library names for pathnames of folded frames on Windows.
+
+## 1.3.4
+
+* No longer say that stack chains aren't supported on dart2js now that
+  [sdk#15171][] is fixed. Note that this fix only applies to Dart 1.12.
+
+[sdk#15171]: https://github.com/dart-lang/sdk/issues/15171
+
+## 1.3.3
+
+* When a `null` stack trace is passed to a completer or stream controller in
+  nested `Chain.capture()` blocks, substitute the inner block's chain rather
+  than the outer block's.
+
+* Add support for empty chains and chains of empty traces to `Chain.parse()`.
+
+* Don't crash when parsing stack traces from Dart VM stack overflows.
+
+## 1.3.2
+
+* Don't crash when running `Trace.terse` on empty stack traces.
+
+## 1.3.1
+
+* Support more types of JavaScriptCore stack frames.
+
+## 1.3.0
+
+* Support stack traces generated by JavaScriptCore. They can be explicitly
+  parsed via `new Trace.parseJSCore` and `new Frame.parseJSCore`.
+
+## 1.2.4
+
+* Fix a type annotation in `LazyTrace`.
+
+## 1.2.3
+
+* Fix a crash in `Chain.parse`.
+
+## 1.2.2
+
+* Don't print the first folded frame of terse stack traces. This frame
+  is always just an internal isolate message handler anyway. This
+  improves the readability of stack traces, especially in stack chains.
+
+* Remove the line numbers and specific files in all terse folded frames, not
+  just those from core libraries.
+
+* Make padding consistent across all stack traces for `Chain.toString()`.
+
+## 1.2.1
+
+* Add `terse` to `LazyTrace.foldFrames()`.
+
+* Further improve stack chains when using the VM's async/await implementation.
+
+## 1.2.0
+
+* Add a `terse` argument to `Trace.foldFrames()` and `Chain.foldFrames()`. This
+  allows them to inherit the behavior of `Trace.terse` and `Chain.terse` without
+  having to duplicate the logic.
+
+## 1.1.3
+
+* Produce nicer-looking stack chains when using the VM's async/await
+  implementation.
+
+## 1.1.2
+
+* Support VM frames without line *or* column numbers, which async/await programs
+  occasionally generate.
+
+* Replace `<<anonymous closure>_async_body>` in VM frames' members with the
+  terser `<async>`.
+
+## 1.1.1
+
+* Widen the SDK constraint to include 1.7.0-dev.4.0.
+
+## 1.1.0
+
+* Unify the parsing of Safari and Firefox stack traces. This fixes an error in
+  Firefox trace parsing.
+
+* Deprecate `Trace.parseSafari6_0`, `Trace.parseSafari6_1`,
+  `Frame.parseSafari6_0`, and `Frame.parseSafari6_1`.
+
+* Add `Frame.parseSafari`.
+
+## 1.0.3
+
+* Use `Zone.errorCallback` to attach stack chains to all errors without the need
+  for `Chain.track`, which is now deprecated.
+
+## 1.0.2
+
+* Remove a workaround for [issue 17083][].
+
+[issue 17083]: http://code.google.com/p/dart/issues/detail?id=17083
+
+## 1.0.1
+
+* Synchronous errors in the [Chain.capture] callback are now handled correctly.
+
+## 1.0.0
+
+* No API changes, just declared stable.
+
+## 0.9.3+2
+
+* Update the dependency on path.
+
+* Improve the formatting of library URIs in stack traces.
+
+## 0.9.3+1
+
+* If an error is thrown in `Chain.capture`'s `onError` handler, that error is
+  handled by the parent zone. This matches the behavior of `runZoned` in
+  `dart:async`.
+
+## 0.9.3
+
+* Add a `Chain.foldFrames` method that parallels `Trace.foldFrames`.
+
+* Record anonymous method frames in IE10 as "<fn>".
diff --git a/mojo/public/dart/third_party/stack_trace/LICENSE b/mojo/public/dart/third_party/stack_trace/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/stack_trace/README.md b/mojo/public/dart/third_party/stack_trace/README.md
new file mode 100644
index 0000000..fe85adb
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/README.md
@@ -0,0 +1,205 @@
+This library provides the ability to parse, inspect, and manipulate stack traces
+produced by the underlying Dart implementation. It also provides functions to
+produce string representations of stack traces in a more readable format than
+the native [StackTrace] implementation.
+
+`Trace`s can be parsed from native [StackTrace]s using `Trace.from`, or captured
+using `Trace.current`. Native [StackTrace]s can also be directly converted to
+human-readable strings using `Trace.format`.
+
+[StackTrace]: http://api.dartlang.org/docs/releases/latest/dart_core/StackTrace.html
+
+Here's an example native stack trace from debugging this library:
+
+    #0      Object.noSuchMethod (dart:core-patch:1884:25)
+    #1      Trace.terse.<anonymous closure> (file:///usr/local/google-old/home/goog/dart/dart/pkg/stack_trace/lib/src/trace.dart:47:21)
+    #2      IterableMixinWorkaround.reduce (dart:collection:29:29)
+    #3      List.reduce (dart:core-patch:1247:42)
+    #4      Trace.terse (file:///usr/local/google-old/home/goog/dart/dart/pkg/stack_trace/lib/src/trace.dart:40:35)
+    #5      format (file:///usr/local/google-old/home/goog/dart/dart/pkg/stack_trace/lib/stack_trace.dart:24:28)
+    #6      main.<anonymous closure> (file:///usr/local/google-old/home/goog/dart/dart/test.dart:21:29)
+    #7      _CatchErrorFuture._sendError (dart:async:525:24)
+    #8      _FutureImpl._setErrorWithoutAsyncTrace (dart:async:393:26)
+    #9      _FutureImpl._setError (dart:async:378:31)
+    #10     _ThenFuture._sendValue (dart:async:490:16)
+    #11     _FutureImpl._handleValue.<anonymous closure> (dart:async:349:28)
+    #12     Timer.run.<anonymous closure> (dart:async:2402:21)
+    #13     Timer.Timer.<anonymous closure> (dart:async-patch:15:15)
+
+and its human-readable representation:
+
+    dart:core-patch                             Object.noSuchMethod
+    pkg/stack_trace/lib/src/trace.dart 47:21    Trace.terse.<fn>
+    dart:collection                             IterableMixinWorkaround.reduce
+    dart:core-patch                             List.reduce
+    pkg/stack_trace/lib/src/trace.dart 40:35    Trace.terse
+    pkg/stack_trace/lib/stack_trace.dart 24:28  format
+    test.dart 21:29                             main.<fn>
+    dart:async                                  _CatchErrorFuture._sendError
+    dart:async                                  _FutureImpl._setErrorWithoutAsyncTrace
+    dart:async                                  _FutureImpl._setError
+    dart:async                                  _ThenFuture._sendValue
+    dart:async                                  _FutureImpl._handleValue.<fn>
+    dart:async                                  Timer.run.<fn>
+    dart:async-patch                            Timer.Timer.<fn>
+
+You can further clean up the stack trace using `Trace.terse`. This folds
+together multiple stack frames from the Dart core libraries, so that only the
+core library method that was directly called from user code is visible. For
+example:
+
+    dart:core                                   Object.noSuchMethod
+    pkg/stack_trace/lib/src/trace.dart 47:21    Trace.terse.<fn>
+    dart:core                                   List.reduce
+    pkg/stack_trace/lib/src/trace.dart 40:35    Trace.terse
+    pkg/stack_trace/lib/stack_trace.dart 24:28  format
+    test.dart 21:29                             main.<fn>
+
+## Stack Chains
+
+This library also provides the ability to capture "stack chains" with the
+`Chain` class. When writing asynchronous code, a single stack trace isn't very
+useful, since the call stack is unwound every time something async happens. A
+stack chain tracks stack traces through asynchronous calls, so that you can see
+the full path from `main` down to the error.
+
+To use stack chains, just wrap the code that you want to track in
+`Chain.capture`. This will create a new [Zone][] in which stack traces are
+recorded and woven into chains every time an asynchronous call occurs. Zones are
+sticky, too, so any asynchronous operations started in the `Chain.capture`
+callback will have their chains tracked, as will asynchronous operations they
+start and so on.
+
+Here's an example of some code that doesn't capture its stack chains:
+
+```dart
+import 'dart:async';
+
+void main() {
+  scheduleAsync();
+}
+
+void scheduleAsync() {
+  return new Future.delayed(new Duration(seconds: 1))
+      .then((_) => runAsync());
+}
+
+void runAsync() {
+  throw 'oh no!';
+}
+```
+
+If we run this, it prints the following:
+
+    Uncaught Error: oh no!
+    Stack Trace: 
+    #0      runAsync (file:///usr/local/google-old/home/goog/dart/dart/test.dart:13:3)
+    #1      scheduleAsync.<anonymous closure> (file:///usr/local/google-old/home/goog/dart/dart/test.dart:9:28)
+    #2      _rootRunUnary (dart:async/zone.dart:717)
+    #3      _RootZone.runUnary (dart:async/zone.dart:854)
+    #4      _Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:488)
+    #5      _Future._propagateToListeners (dart:async/future_impl.dart:571)
+    #6      _Future._complete (dart:async/future_impl.dart:317)
+    #7      _SyncCompleter.complete (dart:async/future_impl.dart:44)
+    #8      Future.Future.delayed.<anonymous closure> (dart:async/future.dart:219)
+    #9      _createTimer.<anonymous closure> (dart:async-patch/timer_patch.dart:11)
+    #10     _handleTimeout (dart:io/timer_impl.dart:292)
+    #11     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:115)
+
+Notice how there's no mention of `main` in that stack trace. All we know is that
+the error was in `runAsync`; we don't know why `runAsync` was called.
+
+Now let's look at the same code with stack chains captured:
+
+```dart
+import 'dart:async';
+
+import 'package:stack_trace/stack_trace.dart';
+
+void main() {
+  Chain.capture(() {
+    scheduleAsync();
+  });
+}
+
+void scheduleAsync() {
+  new Future.delayed(new Duration(seconds: 1))
+      .then((_) => runAsync());
+}
+
+void runAsync() {
+  throw 'oh no!';
+}
+```
+
+Now if we run it, it prints this:
+
+    Uncaught Error: oh no!
+    Stack Trace: 
+    test.dart 17:3                                                runAsync
+    test.dart 13:28                                               scheduleAsync.<fn>
+    package:stack_trace/src/stack_zone_specification.dart 129:26  registerUnaryCallback.<fn>.<fn>
+    package:stack_trace/src/stack_zone_specification.dart 174:15  StackZoneSpecification._run
+    package:stack_trace/src/stack_zone_specification.dart 177:7   StackZoneSpecification._run
+    package:stack_trace/src/stack_zone_specification.dart 175:7   StackZoneSpecification._run
+    package:stack_trace/src/stack_zone_specification.dart 129:18  registerUnaryCallback.<fn>
+    dart:async/zone.dart 717                                      _rootRunUnary
+    dart:async/zone.dart 449                                      _ZoneDelegate.runUnary
+    dart:async/zone.dart 654                                      _CustomizedZone.runUnary
+    dart:async/future_impl.dart 488                               _Future._propagateToListeners.handleValueCallback
+    dart:async/future_impl.dart 571                               _Future._propagateToListeners
+    dart:async/future_impl.dart 317                               _Future._complete
+    dart:async/future_impl.dart 44                                _SyncCompleter.complete
+    dart:async/future.dart 219                                    Future.Future.delayed.<fn>
+    package:stack_trace/src/stack_zone_specification.dart 174:15  StackZoneSpecification._run
+    package:stack_trace/src/stack_zone_specification.dart 119:52  registerCallback.<fn>
+    dart:async/zone.dart 706                                      _rootRun
+    dart:async/zone.dart 440                                      _ZoneDelegate.run
+    dart:async/zone.dart 650                                      _CustomizedZone.run
+    dart:async/zone.dart 561                                      _BaseZone.runGuarded
+    dart:async/zone.dart 586                                      _BaseZone.bindCallback.<fn>
+    package:stack_trace/src/stack_zone_specification.dart 174:15  StackZoneSpecification._run
+    package:stack_trace/src/stack_zone_specification.dart 119:52  registerCallback.<fn>
+    dart:async/zone.dart 710                                      _rootRun
+    dart:async/zone.dart 440                                      _ZoneDelegate.run
+    dart:async/zone.dart 650                                      _CustomizedZone.run
+    dart:async/zone.dart 561                                      _BaseZone.runGuarded
+    dart:async/zone.dart 586                                      _BaseZone.bindCallback.<fn>
+    dart:async-patch/timer_patch.dart 11                          _createTimer.<fn>
+    dart:io/timer_impl.dart 292                                   _handleTimeout
+    dart:isolate-patch/isolate_patch.dart 115                     _RawReceivePortImpl._handleMessage
+    ===== asynchronous gap ===========================
+    dart:async/zone.dart 476                                      _ZoneDelegate.registerUnaryCallback
+    dart:async/zone.dart 666                                      _CustomizedZone.registerUnaryCallback
+    dart:async/future_impl.dart 164                               _Future._Future._then
+    dart:async/future_impl.dart 187                               _Future.then
+    test.dart 13:12                                               scheduleAsync
+    test.dart 7:18                                                main.<fn>
+    dart:async/zone.dart 710                                      _rootRun
+    dart:async/zone.dart 440                                      _ZoneDelegate.run
+    dart:async/zone.dart 650                                      _CustomizedZone.run
+    dart:async/zone.dart 944                                      runZoned
+    package:stack_trace/src/chain.dart 93:20                      Chain.capture
+    test.dart 6:16                                                main
+    dart:isolate-patch/isolate_patch.dart 216                     _startIsolate.isolateStartHandler
+    dart:isolate-patch/isolate_patch.dart 115                     _RawReceivePortImpl._handleMessage
+
+That's a lot of text! If you look closely, though, you can see that `main` is
+listed in the first trace in the chain.
+
+Thankfully, you can call `Chain.terse` just like `Trace.terse` to get rid of all
+the frames you don't care about. The terse version of the stack chain above is
+this:
+
+    test.dart 17:3       runAsync
+    test.dart 13:28      scheduleAsync.<fn>
+    ===== asynchronous gap ===========================
+    dart:async           _Future.then
+    test.dart 13:12      scheduleAsync
+    test.dart 7:18       main.<fn>
+    package:stack_trace  Chain.capture
+    test.dart 6:16       main
+
+That's a lot easier to understand!
+
+[Zone]: https://api.dartlang.org/apidocs/channels/stable/#dart-async.Zone
diff --git a/mojo/public/dart/third_party/stack_trace/codereview.settings b/mojo/public/dart/third_party/stack_trace/codereview.settings
new file mode 100644
index 0000000..aff5c37
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: http://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/stack_trace/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/stack_trace/lib/src/chain.dart b/mojo/public/dart/third_party/stack_trace/lib/src/chain.dart
new file mode 100644
index 0000000..acd17e9
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/lib/src/chain.dart
@@ -0,0 +1,196 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library stack_trace.chain;
+
+import 'dart:async';
+import 'dart:collection';
+import 'dart:math' as math;
+
+import 'frame.dart';
+import 'stack_zone_specification.dart';
+import 'trace.dart';
+import 'utils.dart';
+
+/// A function that handles errors in the zone wrapped by [Chain.capture].
+typedef void ChainHandler(error, Chain chain);
+
+/// The line used in the string representation of stack chains to represent
+/// the gap between traces.
+const _gap = '===== asynchronous gap ===========================\n';
+
+/// A chain of stack traces.
+///
+/// A stack chain is a collection of one or more stack traces that collectively
+/// represent the path from [main] through nested function calls to a particular
+/// code location, usually where an error was thrown. Multiple stack traces are
+/// necessary when using asynchronous functions, since the program's stack is
+/// reset before each asynchronous callback is run.
+///
+/// Stack chains can be automatically tracked using [Chain.capture]. This sets
+/// up a new [Zone] in which the current stack chain is tracked and can be
+/// accessed using [new Chain.current]. Any errors that would be top-leveled in
+/// the zone can be handled, along with their associated chains, with the
+/// `onError` callback. For example:
+///
+///     Chain.capture(() {
+///       // ...
+///     }, onError: (error, stackChain) {
+///       print("Caught error $error\n"
+///             "$stackChain");
+///     });
+class Chain implements StackTrace {
+
+  /// The stack traces that make up this chain.
+  ///
+  /// Like the frames in a stack trace, the traces are ordered from most local
+  /// to least local. The first one is the trace where the actual exception was
+  /// raised, the second one is where that callback was scheduled, and so on.
+  final List<Trace> traces;
+
+  /// The [StackZoneSpecification] for the current zone.
+  static StackZoneSpecification get _currentSpec =>
+    Zone.current[#stack_trace.stack_zone.spec];
+
+  /// Runs [callback] in a [Zone] in which the current stack chain is tracked
+  /// and automatically associated with (most) errors.
+  ///
+  /// If [onError] is passed, any error in the zone that would otherwise go
+  /// unhandled is passed to it, along with the [Chain] associated with that
+  /// error. Note that if [callback] produces multiple unhandled errors,
+  /// [onError] may be called more than once. If [onError] isn't passed, the
+  /// parent Zone's `unhandledErrorHandler` will be called with the error and
+  /// its chain.
+  ///
+  /// Note that even if [onError] isn't passed, this zone will still be an error
+  /// zone. This means that any errors that would cross the zone boundary are
+  /// considered unhandled.
+  ///
+  /// If [callback] returns a value, it will be returned by [capture] as well.
+  static capture(callback(), {ChainHandler onError}) {
+    var spec = new StackZoneSpecification(onError);
+    return runZoned(() {
+      try {
+        return callback();
+      } catch (error, stackTrace) {
+        // TODO(nweiz): Don't special-case this when issue 19566 is fixed.
+        return Zone.current.handleUncaughtError(error, stackTrace);
+      }
+    }, zoneSpecification: spec.toSpec(), zoneValues: {
+      #stack_trace.stack_zone.spec: spec
+    });
+  }
+
+  /// Returns [futureOrStream] unmodified.
+  ///
+  /// Prior to Dart 1.7, this was necessary to ensure that stack traces for
+  /// exceptions reported with [Completer.completeError] and
+  /// [StreamController.addError] were tracked correctly.
+  @Deprecated("Chain.track is not necessary in Dart 1.7+.")
+  static track(futureOrStream) => futureOrStream;
+
+  /// Returns the current stack chain.
+  ///
+  /// By default, the first frame of the first trace will be the line where
+  /// [Chain.current] is called. If [level] is passed, the first trace will
+  /// start that many frames up instead.
+  ///
+  /// If this is called outside of a [capture] zone, it just returns a
+  /// single-trace chain.
+  factory Chain.current([int level=0]) {
+    if (_currentSpec != null) return _currentSpec.currentChain(level + 1);
+    return new Chain([new Trace.current(level + 1)]);
+  }
+
+  /// Returns the stack chain associated with [trace].
+  ///
+  /// The first stack trace in the returned chain will always be [trace]
+  /// (converted to a [Trace] if necessary). If there is no chain associated
+  /// with [trace] or if this is called outside of a [capture] zone, this just
+  /// returns a single-trace chain containing [trace].
+  ///
+  /// If [trace] is already a [Chain], it will be returned as-is.
+  factory Chain.forTrace(StackTrace trace) {
+    if (trace is Chain) return trace;
+    if (_currentSpec == null) return new Chain([new Trace.from(trace)]);
+    return _currentSpec.chainFor(trace);
+  }
+
+  /// Parses a string representation of a stack chain.
+  ///
+  /// Specifically, this parses the output of [Chain.toString].
+  factory Chain.parse(String chain) {
+    if (chain.isEmpty) return new Chain([]);
+    return new Chain(
+        chain.split(_gap).map((trace) => new Trace.parseFriendly(trace)));
+  }
+
+  /// Returns a new [Chain] comprised of [traces].
+  Chain(Iterable<Trace> traces)
+      : traces = new UnmodifiableListView<Trace>(traces.toList());
+
+  /// Returns a terser version of [this].
+  ///
+  /// This calls [Trace.terse] on every trace in [traces], and discards any
+  /// trace that contain only internal frames.
+  Chain get terse => foldFrames((_) => false, terse: true);
+
+  /// Returns a new [Chain] based on [this] where multiple stack frames matching
+  /// [predicate] are folded together.
+  ///
+  /// This means that whenever there are multiple frames in a row that match
+  /// [predicate], only the last one is kept. In addition, traces that are
+  /// composed entirely of frames matching [predicate] are omitted.
+  ///
+  /// This is useful for limiting the amount of library code that appears in a
+  /// stack trace by only showing user code and code that's called by user code.
+  ///
+  /// If [terse] is true, this will also fold together frames from the core
+  /// library or from this package, and simplify core library frames as in
+  /// [Trace.terse].
+  Chain foldFrames(bool predicate(Frame frame), {bool terse: false}) {
+    var foldedTraces = traces.map(
+        (trace) => trace.foldFrames(predicate, terse: terse));
+    var nonEmptyTraces = foldedTraces.where((trace) {
+      // Ignore traces that contain only folded frames.
+      if (trace.frames.length > 1) return true;
+
+      // In terse mode, the trace may have removed an outer folded frame,
+      // leaving a single non-folded frame. We can detect a folded frame because
+      // it has no line information.
+      if (!terse) return false;
+      return trace.frames.single.line != null;
+    });
+
+    // If all the traces contain only internal processing, preserve the last
+    // (top-most) one so that the chain isn't empty.
+    if (nonEmptyTraces.isEmpty && foldedTraces.isNotEmpty) {
+      return new Chain([foldedTraces.last]);
+    }
+
+    return new Chain(nonEmptyTraces);
+  }
+
+  /// Converts [this] to a [Trace].
+  ///
+  /// The trace version of a chain is just the concatenation of all the traces
+  /// in the chain.
+  Trace toTrace() => new Trace(flatten(traces.map((trace) => trace.frames)));
+
+  String toString() {
+    // Figure out the longest path so we know how much to pad.
+    var longest = traces.map((trace) {
+      return trace.frames.map((frame) => frame.location.length)
+          .fold(0, math.max);
+    }).fold(0, math.max);
+
+    // Don't call out to [Trace.toString] here because that doesn't ensure that
+    // padding is consistent across all traces.
+    return traces.map((trace) {
+      return trace.frames.map((frame) {
+        return '${padRight(frame.location, longest)}  ${frame.member}\n';
+      }).join();
+    }).join(_gap);
+  }
+}
diff --git a/mojo/public/dart/third_party/stack_trace/lib/src/frame.dart b/mojo/public/dart/third_party/stack_trace/lib/src/frame.dart
new file mode 100644
index 0000000..4077c7c
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/lib/src/frame.dart
@@ -0,0 +1,306 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library frame;
+
+import 'package:path/path.dart' as path;
+
+import 'trace.dart';
+import 'unparsed_frame.dart';
+
+// #1      Foo._bar (file:///home/nweiz/code/stuff.dart:42:21)
+// #1      Foo._bar (file:///home/nweiz/code/stuff.dart:42)
+// #1      Foo._bar (file:///home/nweiz/code/stuff.dart)
+final _vmFrame = new RegExp(r'^#\d+\s+(\S.*) \((.+?)((?::\d+){0,2})\)$');
+
+//     at Object.stringify (native)
+//     at VW.call$0 (http://pub.dartlang.org/stuff.dart.js:560:28)
+//     at VW.call$0 (eval as fn
+//         (http://pub.dartlang.org/stuff.dart.js:560:28), efn:3:28)
+//     at http://pub.dartlang.org/stuff.dart.js:560:28
+final _v8Frame = new RegExp(
+    r'^\s*at (?:(\S.*?)(?: \[as [^\]]+\])? \((.*)\)|(.*))$');
+
+// http://pub.dartlang.org/stuff.dart.js:560:28
+final _v8UrlLocation = new RegExp(r'^(.*):(\d+):(\d+)|native$');
+
+// eval as function (http://pub.dartlang.org/stuff.dart.js:560:28), efn:3:28
+// eval as function (http://pub.dartlang.org/stuff.dart.js:560:28)
+// eval as function (eval as otherFunction
+//     (http://pub.dartlang.org/stuff.dart.js:560:28))
+final _v8EvalLocation = new RegExp(
+    r'^eval at (?:\S.*?) \((.*)\)(?:, .*?:\d+:\d+)?$');
+
+// .VW.call$0@http://pub.dartlang.org/stuff.dart.js:560
+// .VW.call$0("arg")@http://pub.dartlang.org/stuff.dart.js:560
+// .VW.call$0/name<@http://pub.dartlang.org/stuff.dart.js:560
+// .VW.call$0@http://pub.dartlang.org/stuff.dart.js:560:36
+// http://pub.dartlang.org/stuff.dart.js:560
+final _firefoxSafariFrame = new RegExp(
+    r'^'
+    r'(?:' // Member description. Not present in some Safari frames.
+      r'([^@(/]*)' // The actual name of the member.
+      r'(?:\(.*\))?' // Arguments to the member, sometimes captured by Firefox.
+      r'((?:/[^/]*)*)' // Extra characters indicating a nested closure.
+      r'(?:\(.*\))?' // Arguments to the closure.
+      r'@'
+    r')?'
+    r'(.*?)' // The frame's URL.
+    r':'
+    r'(\d*)' // The line number. Empty in Safari if it's unknown.
+    r'(?::(\d*))?' // The column number. Not present in older browsers and
+                   // empty in Safari if it's unknown.
+    r'$');
+
+// foo/bar.dart 10:11 in Foo._bar
+// http://dartlang.org/foo/bar.dart in Foo._bar
+final _friendlyFrame = new RegExp(
+    r'^(\S+)(?: (\d+)(?::(\d+))?)?\s+([^\d]\S*)$');
+
+/// A regular expression that matches asynchronous member names generated by the
+/// VM.
+final _asyncBody = new RegExp(r'<(<anonymous closure>|[^>]+)_async_body>');
+
+final _initialDot = new RegExp(r"^\.");
+
+/// A single stack frame. Each frame points to a precise location in Dart code.
+class Frame {
+  /// The URI of the file in which the code is located.
+  ///
+  /// This URI will usually have the scheme `dart`, `file`, `http`, or `https`.
+  final Uri uri;
+
+  /// The line number on which the code location is located.
+  ///
+  /// This can be null, indicating that the line number is unknown or
+  /// unimportant.
+  final int line;
+
+  /// The column number of the code location.
+  ///
+  /// This can be null, indicating that the column number is unknown or
+  /// unimportant.
+  final int column;
+
+  /// The name of the member in which the code location occurs.
+  ///
+  /// Anonymous closures are represented as `<fn>` in this member string.
+  final String member;
+
+  /// Whether this stack frame comes from the Dart core libraries.
+  bool get isCore => uri.scheme == 'dart';
+
+  /// Returns a human-friendly description of the library that this stack frame
+  /// comes from.
+  ///
+  /// This will usually be the string form of [uri], but a relative URI will be
+  /// used if possible. Data URIs will be truncated.
+  String get library {
+    if (uri.scheme == 'data') return "data:...";
+    return path.prettyUri(uri);
+  }
+
+  /// Returns the name of the package this stack frame comes from, or `null` if
+  /// this stack frame doesn't come from a `package:` URL.
+  String get package {
+    if (uri.scheme != 'package') return null;
+    return uri.path.split('/').first;
+  }
+
+  /// A human-friendly description of the code location.
+  String get location {
+    if (line == null) return library;
+    if (column == null) return '$library $line';
+    return '$library $line:$column';
+  }
+
+  /// Returns a single frame of the current stack.
+  ///
+  /// By default, this will return the frame above the current method. If
+  /// [level] is `0`, it will return the current method's frame; if [level] is
+  /// higher than `1`, it will return higher frames.
+  factory Frame.caller([int level=1]) {
+    if (level < 0) {
+      throw new ArgumentError("Argument [level] must be greater than or equal "
+          "to 0.");
+    }
+
+    return new Trace.current(level + 1).frames.first;
+  }
+
+  /// Parses a string representation of a Dart VM stack frame.
+  factory Frame.parseVM(String frame) => _catchFormatException(frame, () {
+    // The VM sometimes folds multiple stack frames together and replaces them
+    // with "...".
+    if (frame == '...') {
+      return new Frame(new Uri(), null, null, '...');
+    }
+
+    var match = _vmFrame.firstMatch(frame);
+    if (match == null) return new UnparsedFrame(frame);
+
+    // Get the pieces out of the regexp match. Function, URI and line should
+    // always be found. The column is optional.
+    var member = match[1]
+        .replaceAll(_asyncBody, "<async>")
+        .replaceAll("<anonymous closure>", "<fn>");
+    var uri = Uri.parse(match[2]);
+
+    var lineAndColumn = match[3].split(':');
+    var line = lineAndColumn.length > 1 ? int.parse(lineAndColumn[1]) : null;
+    var column = lineAndColumn.length > 2 ? int.parse(lineAndColumn[2]) : null;
+    return new Frame(uri, line, column, member);
+  });
+
+  /// Parses a string representation of a Chrome/V8 stack frame.
+  factory Frame.parseV8(String frame) => _catchFormatException(frame, () {
+    var match = _v8Frame.firstMatch(frame);
+    if (match == null) return new UnparsedFrame(frame);
+
+    // v8 location strings can be arbitrarily-nested, since it adds a layer of
+    // nesting for each eval performed on that line.
+    parseLocation(location, member) {
+      var evalMatch = _v8EvalLocation.firstMatch(location);
+      while (evalMatch != null) {
+        location = evalMatch[1];
+        evalMatch = _v8EvalLocation.firstMatch(location);
+      }
+
+      if (location == 'native') {
+        return new Frame(Uri.parse('native'), null, null, member);
+      }
+
+      var urlMatch = _v8UrlLocation.firstMatch(location);
+      if (urlMatch == null) return new UnparsedFrame(frame);
+
+      return new Frame(
+          _uriOrPathToUri(urlMatch[1]),
+          int.parse(urlMatch[2]),
+          int.parse(urlMatch[3]),
+          member);
+    }
+
+    // V8 stack frames can be in two forms.
+    if (match[2] != null) {
+      // The first form looks like " at FUNCTION (LOCATION)". V8 proper lists
+      // anonymous functions within eval as "<anonymous>", while IE10 lists them
+      // as "Anonymous function".
+      return parseLocation(match[2],
+          match[1].replaceAll("<anonymous>", "<fn>")
+                  .replaceAll("Anonymous function", "<fn>"));
+    } else {
+      // The second form looks like " at LOCATION", and is used for anonymous
+      // functions.
+      return parseLocation(match[3], "<fn>");
+    }
+  });
+
+  /// Parses a string representation of a JavaScriptCore stack trace.
+  factory Frame.parseJSCore(String frame) => new Frame.parseV8(frame);
+
+  /// Parses a string representation of an IE stack frame.
+  ///
+  /// IE10+ frames look just like V8 frames. Prior to IE10, stack traces can't
+  /// be retrieved.
+  factory Frame.parseIE(String frame) => new Frame.parseV8(frame);
+
+  /// Parses a string representation of a Firefox stack frame.
+  factory Frame.parseFirefox(String frame) => _catchFormatException(frame, () {
+    var match = _firefoxSafariFrame.firstMatch(frame);
+    if (match == null) return new UnparsedFrame(frame);
+
+    // Normally this is a URI, but in a jsshell trace it can be a path.
+    var uri = _uriOrPathToUri(match[3]);
+
+    var member;
+    if (match[1] != null) {
+      member = match[1];
+      member +=
+          new List.filled('/'.allMatches(match[2]).length, ".<fn>").join();
+      if (member == '') member = '<fn>';
+
+      // Some Firefox members have initial dots. We remove them for consistency
+      // with other platforms.
+      member = member.replaceFirst(_initialDot, '');
+    } else {
+      member = '<fn>';
+    }
+
+    var line = match[4] == '' ? null : int.parse(match[4]);
+    var column = match[5] == null || match[5] == '' ?
+        null : int.parse(match[5]);
+    return new Frame(uri, line, column, member);
+  });
+
+  /// Parses a string representation of a Safari 6.0 stack frame.
+  @Deprecated("Use Frame.parseSafari instead.")
+  factory Frame.parseSafari6_0(String frame) => new Frame.parseFirefox(frame);
+
+  /// Parses a string representation of a Safari 6.1+ stack frame.
+  @Deprecated("Use Frame.parseSafari instead.")
+  factory Frame.parseSafari6_1(String frame) => new Frame.parseFirefox(frame);
+
+  /// Parses a string representation of a Safari stack frame.
+  factory Frame.parseSafari(String frame) => new Frame.parseFirefox(frame);
+
+  /// Parses this package's string representation of a stack frame.
+  factory Frame.parseFriendly(String frame) => _catchFormatException(frame, () {
+    var match = _friendlyFrame.firstMatch(frame);
+    if (match == null) {
+      throw new FormatException(
+          "Couldn't parse package:stack_trace stack trace line '$frame'.");
+    }
+
+    var uri = Uri.parse(match[1]);
+    // If there's no scheme, this is a relative URI. We should interpret it as
+    // relative to the current working directory.
+    if (uri.scheme == '') {
+      uri = path.toUri(path.absolute(path.fromUri(uri)));
+    }
+
+    var line = match[2] == null ? null : int.parse(match[2]);
+    var column = match[3] == null ? null : int.parse(match[3]);
+    return new Frame(uri, line, column, match[4]);
+  });
+
+  /// A regular expression matching an absolute URI.
+  static final _uriRegExp = new RegExp(r'^[a-zA-Z][-+.a-zA-Z\d]*://');
+
+  /// A regular expression matching a Windows path.
+  static final _windowsRegExp = new RegExp(r'^([a-zA-Z]:[\\/]|\\\\)');
+
+  /// Converts [uriOrPath], which can be a URI, a Windows path, or a Posix path,
+  /// to a URI (absolute if possible).
+  static Uri _uriOrPathToUri(String uriOrPath) {
+    if (uriOrPath.contains(_uriRegExp)) {
+      return Uri.parse(uriOrPath);
+    } else if (uriOrPath.contains(_windowsRegExp)) {
+      return new Uri.file(uriOrPath, windows: true);
+    } else if (uriOrPath.startsWith('/')) {
+      return new Uri.file(uriOrPath, windows: false);
+    }
+
+    // As far as I've seen, Firefox and V8 both always report absolute paths in
+    // their stack frames. However, if we do get a relative path, we should
+    // handle it gracefully.
+    if (uriOrPath.contains('\\')) return path.windows.toUri(uriOrPath);
+    return Uri.parse(uriOrPath);
+  }
+
+  /// Runs [body] and returns its result.
+  ///
+  /// If [body] throws a [FormatException], returns an [UnparsedFrame] with
+  /// [text] instead.
+  static Frame _catchFormatException(String text, Frame body()) {
+    try {
+      return body();
+    } on FormatException catch (_) {
+      return new UnparsedFrame(text);
+    }
+  }
+
+  Frame(this.uri, this.line, this.column, this.member);
+
+  String toString() => '$location in $member';
+}
diff --git a/mojo/public/dart/third_party/stack_trace/lib/src/lazy_trace.dart b/mojo/public/dart/third_party/stack_trace/lib/src/lazy_trace.dart
new file mode 100644
index 0000000..6bfe51c
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/lib/src/lazy_trace.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library lazy_trace;
+
+import 'frame.dart';
+import 'trace.dart';
+
+/// A thunk for lazily constructing a [Trace].
+typedef Trace TraceThunk();
+
+/// A wrapper around a [TraceThunk]. This works around issue 9579 by avoiding
+/// the conversion of native [StackTrace]s to strings until it's absolutely
+/// necessary.
+class LazyTrace implements Trace {
+  final TraceThunk _thunk;
+  Trace _inner;
+
+  LazyTrace(this._thunk);
+
+  Trace get _trace {
+    if (_inner == null) _inner = _thunk();
+    return _inner;
+  }
+
+  List<Frame> get frames => _trace.frames;
+  StackTrace get vmTrace => _trace.vmTrace;
+  Trace get terse => new LazyTrace(() => _trace.terse);
+  Trace foldFrames(bool predicate(Frame frame), {bool terse: false}) =>
+    new LazyTrace(() => _trace.foldFrames(predicate, terse: terse));
+  String toString() => _trace.toString();
+
+  // Work around issue 14075.
+  set frames(_) => throw new UnimplementedError();
+}
diff --git a/mojo/public/dart/third_party/stack_trace/lib/src/stack_zone_specification.dart b/mojo/public/dart/third_party/stack_trace/lib/src/stack_zone_specification.dart
new file mode 100644
index 0000000..25d9642
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/lib/src/stack_zone_specification.dart
@@ -0,0 +1,236 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library stack_trace.stack_zone_specification;
+
+import 'dart:async';
+
+import 'trace.dart';
+import 'chain.dart';
+
+/// A class encapsulating the zone specification for a [Chain.capture] zone.
+///
+/// Until they're materialized and exposed to the user, stack chains are tracked
+/// as linked lists of [Trace]s using the [_Node] class. These nodes are stored
+/// in three distinct ways:
+///
+/// * When a callback is registered, a node is created and stored as a captured
+///   local variable until the callback is run.
+///
+/// * When a callback is run, its captured node is set as the [_currentNode] so
+///   it can be available to [Chain.current] and to be linked into additional
+///   chains when more callbacks are scheduled.
+///
+/// * When a callback throws an error or a Future or Stream emits an error, the
+///   current node is associated with that error's stack trace using the
+///   [_chains] expando.
+///
+/// Since [ZoneSpecification] can't be extended or even implemented, in order to
+/// get a real [ZoneSpecification] instance it's necessary to call [toSpec].
+class StackZoneSpecification {
+  /// The expando that associates stack chains with [StackTrace]s.
+  ///
+  /// The chains are associated with stack traces rather than errors themselves
+  /// because it's a common practice to throw strings as errors, which can't be
+  /// used with expandos.
+  ///
+  /// The chain associated with a given stack trace doesn't contain a node for
+  /// that stack trace.
+  final _chains = new Expando<_Node>("stack chains");
+
+  /// The error handler for the zone.
+  ///
+  /// If this is null, that indicates that any unhandled errors should be passed
+  /// to the parent zone.
+  final ChainHandler _onError;
+
+  /// The most recent node of the current stack chain.
+  _Node _currentNode;
+
+  StackZoneSpecification([this._onError]);
+
+  /// Converts [this] to a real [ZoneSpecification].
+  ZoneSpecification toSpec() {
+    return new ZoneSpecification(
+        handleUncaughtError: handleUncaughtError,
+        registerCallback: registerCallback,
+        registerUnaryCallback: registerUnaryCallback,
+        registerBinaryCallback: registerBinaryCallback,
+        errorCallback: errorCallback);
+  }
+
+  /// Returns the current stack chain.
+  ///
+  /// By default, the first frame of the first trace will be the line where
+  /// [currentChain] is called. If [level] is passed, the first trace will start
+  /// that many frames up instead.
+  Chain currentChain([int level=0]) => _createNode(level + 1).toChain();
+
+  /// Returns the stack chain associated with [trace], if one exists.
+  ///
+  /// The first stack trace in the returned chain will always be [trace]
+  /// (converted to a [Trace] if necessary). If there is no chain associated
+  /// with [trace], this just returns a single-trace chain containing [trace].
+  Chain chainFor(StackTrace trace) {
+    if (trace is Chain) return trace;
+    var previous = trace == null ? null : _chains[trace];
+    return new _Node(trace, previous).toChain();
+  }
+
+  /// Ensures that an error emitted by [future] has the correct stack
+  /// information associated with it.
+  ///
+  /// By default, the first frame of the first trace will be the line where
+  /// [trackFuture] is called. If [level] is passed, the first trace will start
+  /// that many frames up instead.
+  Future trackFuture(Future future, [int level=0]) {
+    var completer = new Completer.sync();
+    var node = _createNode(level + 1);
+    future.then(completer.complete).catchError((e, stackTrace) {
+      if (stackTrace == null) stackTrace = new Trace.current();
+      if (stackTrace is! Chain && _chains[stackTrace] == null) {
+        _chains[stackTrace] = node;
+      }
+      completer.completeError(e, stackTrace);
+    });
+    return completer.future;
+  }
+
+  /// Ensures that any errors emitted by [stream] have the correct stack
+  /// information associated with them.
+  ///
+  /// By default, the first frame of the first trace will be the line where
+  /// [trackStream] is called. If [level] is passed, the first trace will start
+  /// that many frames up instead.
+  Stream trackStream(Stream stream, [int level=0]) {
+    var node = _createNode(level + 1);
+    return stream.transform(new StreamTransformer.fromHandlers(
+        handleError: (error, stackTrace, sink) {
+      if (stackTrace == null) stackTrace = new Trace.current();
+      if (stackTrace is! Chain && _chains[stackTrace] == null) {
+        _chains[stackTrace] = node;
+      }
+      sink.addError(error, stackTrace);
+    }));
+  }
+
+  /// Tracks the current stack chain so it can be set to [_currentChain] when
+  /// [f] is run.
+  ZoneCallback registerCallback(Zone self, ZoneDelegate parent, Zone zone,
+      Function f) {
+    if (f == null) return parent.registerCallback(zone, null);
+    var node = _createNode(1);
+    return parent.registerCallback(zone, () => _run(f, node));
+  }
+
+  /// Tracks the current stack chain so it can be set to [_currentChain] when
+  /// [f] is run.
+  ZoneUnaryCallback registerUnaryCallback(Zone self, ZoneDelegate parent,
+      Zone zone, Function f) {
+    if (f == null) return parent.registerUnaryCallback(zone, null);
+    var node = _createNode(1);
+    return parent.registerUnaryCallback(zone, (arg) {
+      return _run(() => f(arg), node);
+    });
+  }
+
+  /// Tracks the current stack chain so it can be set to [_currentChain] when
+  /// [f] is run.
+  ZoneBinaryCallback registerBinaryCallback(Zone self, ZoneDelegate parent,
+      Zone zone, Function f) {
+    if (f == null) return parent.registerBinaryCallback(zone, null);
+    var node = _createNode(1);
+    return parent.registerBinaryCallback(zone, (arg1, arg2) {
+      return _run(() => f(arg1, arg2), node);
+    });
+  }
+
+  /// Looks up the chain associated with [stackTrace] and passes it either to
+  /// [_onError] or [parent]'s error handler.
+  handleUncaughtError(Zone self, ZoneDelegate parent, Zone zone, error,
+      StackTrace stackTrace) {
+    var stackChain = chainFor(stackTrace);
+    if (_onError == null) {
+      return parent.handleUncaughtError(zone, error, stackChain);
+    }
+
+    // TODO(nweiz): Currently this copies a lot of logic from [runZoned]. Just
+    // allow [runBinary] to throw instead once issue 18134 is fixed.
+    try {
+      return parent.runBinary(zone, _onError, error, stackChain);
+    } catch (newError, newStackTrace) {
+      if (identical(newError, error)) {
+        return parent.handleUncaughtError(zone, error, stackChain);
+      } else {
+        return parent.handleUncaughtError(zone, newError, newStackTrace);
+      }
+    }
+  }
+
+  /// Attaches the current stack chain to [stackTrace], replacing it if
+  /// necessary.
+  AsyncError errorCallback(Zone self, ZoneDelegate parent, Zone zone,
+      Object error, StackTrace stackTrace) {
+    // Go up two levels to get through [_CustomZone.errorCallback].
+    if (stackTrace == null) {
+      stackTrace = _createNode(2).toChain();
+    } else {
+      if (_chains[stackTrace] == null) _chains[stackTrace] = _createNode(2);
+    }
+
+    var asyncError = parent.errorCallback(zone, error, stackTrace);
+    return asyncError == null ? new AsyncError(error, stackTrace) : asyncError;
+  }
+
+  /// Creates a [_Node] with the current stack trace and linked to
+  /// [_currentNode].
+  ///
+  /// By default, the first frame of the first trace will be the line where
+  /// [_createNode] is called. If [level] is passed, the first trace will start
+  /// that many frames up instead.
+  _Node _createNode([int level=0]) =>
+    new _Node(new Trace.current(level + 1), _currentNode);
+
+  // TODO(nweiz): use a more robust way of detecting and tracking errors when
+  // issue 15105 is fixed.
+  /// Runs [f] with [_currentNode] set to [node].
+  ///
+  /// If [f] throws an error, this associates [node] with that error's stack
+  /// trace.
+  _run(Function f, _Node node) {
+    var previousNode = _currentNode;
+    _currentNode = node;
+    try {
+      return f();
+    } catch (e, stackTrace) {
+      _chains[stackTrace] = node;
+      rethrow;
+    } finally {
+      _currentNode = previousNode;
+    }
+  }
+}
+
+/// A linked list node representing a single entry in a stack chain.
+class _Node {
+  /// The stack trace for this link of the chain.
+  final Trace trace;
+
+  /// The previous node in the chain.
+  final _Node previous;
+
+  _Node(StackTrace trace, [this.previous])
+      : trace = trace == null ? new Trace.current() : new Trace.from(trace);
+
+  /// Converts this to a [Chain].
+  Chain toChain() {
+    var nodes = <Trace>[];
+    var node = this;
+    while (node != null) {
+      nodes.add(node.trace);
+      node = node.previous;
+    }
+    return new Chain(nodes);
+  }
+}
diff --git a/mojo/public/dart/third_party/stack_trace/lib/src/trace.dart b/mojo/public/dart/third_party/stack_trace/lib/src/trace.dart
new file mode 100644
index 0000000..f615cd2
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/lib/src/trace.dart
@@ -0,0 +1,298 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library trace;
+
+import 'dart:collection';
+import 'dart:math' as math;
+
+import 'chain.dart';
+import 'frame.dart';
+import 'lazy_trace.dart';
+import 'unparsed_frame.dart';
+import 'utils.dart';
+import 'vm_trace.dart';
+
+final _terseRegExp = new RegExp(r"(-patch)?([/\\].*)?$");
+
+/// A RegExp to match V8's stack traces.
+///
+/// V8's traces start with a line that's either just "Error" or else is a
+/// description of the exception that occurred. That description can be multiple
+/// lines, so we just look for any line other than the first that begins with
+/// three or four spaces and "at".
+final _v8Trace = new RegExp(r"\n    ?at ");
+
+/// A RegExp to match indidual lines of V8's stack traces.
+///
+/// This is intended to filter out the leading exception details of the trace
+/// though it is possible for the message to match this as well.
+final _v8TraceLine = new RegExp(r"    ?at ");
+
+/// A RegExp to match Firefox and Safari's stack traces.
+///
+/// Firefox and Safari have very similar stack trace formats, so we use the same
+/// logic for parsing them.
+///
+/// Firefox's trace frames start with the name of the function in which the
+/// error occurred, possibly including its parameters inside `()`. For example,
+/// `.VW.call$0("arg")@http://pub.dartlang.org/stuff.dart.js:560`.
+///
+/// Safari traces occasionally don't include the initial method name followed by
+/// "@", and they always have both the line and column number (or just a
+/// trailing colon if no column number is available). They can also contain
+/// empty lines or lines consisting only of `[native code]`.
+final _firefoxSafariTrace = new RegExp(
+    r"^"
+    r"(" // Member description. Not present in some Safari frames.
+      r"([.0-9A-Za-z_$/<]|\(.*\))*" // Member name and arguments.
+      r"@"
+    r")?"
+    r"[^\s]*" // Frame URL.
+    r":\d*" // Line or column number. Some older frames only have a line number.
+    r"$", multiLine: true);
+
+/// A RegExp to match this package's stack traces.
+final _friendlyTrace = new RegExp(r"^[^\s]+( \d+(:\d+)?)?[ \t]+[^\s]+$",
+    multiLine: true);
+
+/// A stack trace, comprised of a list of stack frames.
+class Trace implements StackTrace {
+  /// The stack frames that comprise this stack trace.
+  final List<Frame> frames;
+
+  /// Returns a human-readable representation of [stackTrace]. If [terse] is
+  /// set, this folds together multiple stack frames from the Dart core
+  /// libraries, so that only the core library method directly called from user
+  /// code is visible (see [Trace.terse]).
+  static String format(StackTrace stackTrace, {bool terse: true}) {
+    var trace = new Trace.from(stackTrace);
+    if (terse) trace = trace.terse;
+    return trace.toString();
+  }
+
+  /// Returns the current stack trace.
+  ///
+  /// By default, the first frame of this trace will be the line where
+  /// [Trace.current] is called. If [level] is passed, the trace will start that
+  /// many frames up instead.
+  factory Trace.current([int level=0]) {
+    if (level < 0) {
+      throw new ArgumentError("Argument [level] must be greater than or equal "
+          "to 0.");
+    }
+
+    try {
+      throw '';
+    } catch (_, nativeTrace) {
+      var trace = new Trace.from(nativeTrace);
+      return new LazyTrace(() => new Trace(trace.frames.skip(level + 1)));
+    }
+  }
+
+  /// Returns a new stack trace containing the same data as [trace].
+  ///
+  /// If [trace] is a native [StackTrace], its data will be parsed out; if it's
+  /// a [Trace], it will be returned as-is.
+  factory Trace.from(StackTrace trace) {
+    // Normally explicitly validating null arguments is bad Dart style, but here
+    // the natural failure will only occur when the LazyTrace is materialized,
+    // and we want to provide an error that's more local to the actual problem.
+    if (trace == null) {
+      throw new ArgumentError("Cannot create a Trace from null.");
+    }
+
+    if (trace is Trace) return trace;
+    if (trace is Chain) return trace.toTrace();
+    return new LazyTrace(() => new Trace.parse(trace.toString()));
+  }
+
+  /// Parses a string representation of a stack trace.
+  ///
+  /// [trace] should be formatted in the same way as a Dart VM or browser stack
+  /// trace.
+  factory Trace.parse(String trace) {
+    try {
+      if (trace.isEmpty) return new Trace(<Frame>[]);
+      if (trace.contains(_v8Trace)) return new Trace.parseV8(trace);
+      if (trace.contains("\tat ")) return new Trace.parseJSCore(trace);
+      if (trace.contains(_firefoxSafariTrace)) {
+        return new Trace.parseFirefox(trace);
+      }
+      if (trace.contains(_friendlyTrace)) {
+        return new Trace.parseFriendly(trace);
+      }
+
+      // Default to parsing the stack trace as a VM trace. This is also hit on
+      // IE and Safari, where the stack trace is just an empty string (issue
+      // 11257).
+      return new Trace.parseVM(trace);
+    } on FormatException catch (error) {
+      throw new FormatException('${error.message}\nStack trace:\n$trace');
+    }
+  }
+
+  /// Parses a string representation of a Dart VM stack trace.
+  Trace.parseVM(String trace)
+      : this(_parseVM(trace));
+
+  static List<Frame> _parseVM(String trace) {
+    var lines = trace.trim().split("\n");
+    var frames = lines.take(lines.length - 1)
+        .map((line) => new Frame.parseVM(line))
+        .toList();
+
+    // TODO(nweiz): Remove this when issue 23614 is fixed.
+    if (!lines.last.endsWith(".da")) {
+      frames.add(new Frame.parseVM(lines.last));
+    }
+
+    return frames;
+  }
+
+  /// Parses a string representation of a Chrome/V8 stack trace.
+  Trace.parseV8(String trace)
+      : this(trace.split("\n").skip(1)
+          // It's possible that an Exception's description contains a line that
+          // looks like a V8 trace line, which will screw this up.
+          // Unfortunately, that's impossible to detect.
+          .skipWhile((line) => !line.startsWith(_v8TraceLine))
+          .map((line) => new Frame.parseV8(line)));
+
+  /// Parses a string representation of a JavaScriptCore stack trace.
+  Trace.parseJSCore(String trace)
+      : this(trace.split("\n")
+            .where((line) => line != "\tat ")
+            .map((line) => new Frame.parseV8(line)));
+
+  /// Parses a string representation of an Internet Explorer stack trace.
+  ///
+  /// IE10+ traces look just like V8 traces. Prior to IE10, stack traces can't
+  /// be retrieved.
+  Trace.parseIE(String trace)
+      : this.parseV8(trace);
+
+  /// Parses a string representation of a Firefox stack trace.
+  Trace.parseFirefox(String trace)
+      : this(trace.trim().split("\n")
+          .where((line) => line.isNotEmpty && line != '[native code]')
+          .map((line) => new Frame.parseFirefox(line)));
+
+  /// Parses a string representation of a Safari stack trace.
+  Trace.parseSafari(String trace)
+      : this.parseFirefox(trace);
+
+  /// Parses a string representation of a Safari 6.1+ stack trace.
+  @Deprecated("Use Trace.parseSafari instead.")
+  Trace.parseSafari6_1(String trace)
+      : this.parseSafari(trace);
+
+  /// Parses a string representation of a Safari 6.0 stack trace.
+  @Deprecated("Use Trace.parseSafari instead.")
+  Trace.parseSafari6_0(String trace)
+      : this(trace.trim().split("\n")
+          .where((line) => line != '[native code]')
+          .map((line) => new Frame.parseFirefox(line)));
+
+  /// Parses this package's string representation of a stack trace.
+  ///
+  /// This also parses string representations of [Chain]s. They parse to the
+  /// same trace that [Chain.toTrace] would return.
+  Trace.parseFriendly(String trace)
+      : this(trace.isEmpty
+            ? []
+            : trace.trim().split("\n")
+                // Filter out asynchronous gaps from [Chain]s.
+                .where((line) => !line.startsWith('====='))
+                .map((line) => new Frame.parseFriendly(line)));
+
+  /// Returns a new [Trace] comprised of [frames].
+  Trace(Iterable<Frame> frames)
+      : frames = new UnmodifiableListView<Frame>(frames.toList());
+
+  /// Returns a VM-style [StackTrace] object.
+  ///
+  /// The return value's [toString] method will always return a string
+  /// representation in the Dart VM's stack trace format, regardless of what
+  /// platform is being used.
+  StackTrace get vmTrace => new VMTrace(frames);
+
+  /// Returns a terser version of [this].
+  ///
+  /// This is accomplished by folding together multiple stack frames from the
+  /// core library or from this package, as in [foldFrames]. Remaining core
+  /// library frames have their libraries, "-patch" suffixes, and line numbers
+  /// removed. If the outermost frame of the stack trace is a core library
+  /// frame, it's removed entirely.
+  ///
+  /// For custom folding, see [foldFrames].
+  Trace get terse => foldFrames((_) => false, terse: true);
+
+  /// Returns a new [Trace] based on [this] where multiple stack frames matching
+  /// [predicate] are folded together.
+  ///
+  /// This means that whenever there are multiple frames in a row that match
+  /// [predicate], only the last one is kept. This is useful for limiting the
+  /// amount of library code that appears in a stack trace by only showing user
+  /// code and code that's called by user code.
+  ///
+  /// If [terse] is true, this will also fold together frames from the core
+  /// library or from this package, simplify core library frames, and
+  /// potentially remove the outermost frame as in [Trace.terse].
+  Trace foldFrames(bool predicate(Frame frame), {bool terse: false}) {
+    if (terse) {
+      var oldPredicate = predicate;
+      predicate = (frame) {
+        if (oldPredicate(frame)) return true;
+
+        if (frame.isCore) return true;
+        if (frame.package == 'stack_trace') return true;
+
+        // Ignore async stack frames without any line or column information.
+        // These come from the VM's async/await implementation and represent
+        // internal frames. They only ever show up in stack chains and are
+        // always surrounded by other traces that are actually useful, so we can
+        // just get rid of them.
+        // TODO(nweiz): Get rid of this logic some time after issue 22009 is
+        // fixed.
+        if (!frame.member.contains('<async>')) return false;
+        return frame.line == null;
+      };
+    }
+
+    var newFrames = [];
+    for (var frame in frames.reversed) {
+      if (frame is UnparsedFrame || !predicate(frame)) {
+        newFrames.add(frame);
+      } else if (newFrames.isEmpty || !predicate(newFrames.last)) {
+        newFrames.add(new Frame(
+            frame.uri, frame.line, frame.column, frame.member));
+      }
+    }
+
+    if (terse) {
+      newFrames = newFrames.map((frame) {
+        if (frame is UnparsedFrame || !predicate(frame)) return frame;
+        var library = frame.library.replaceAll(_terseRegExp, '');
+        return new Frame(Uri.parse(library), null, null, frame.member);
+      }).toList();
+      if (newFrames.length > 1 && newFrames.first.isCore) newFrames.removeAt(0);
+    }
+
+    return new Trace(newFrames.reversed);
+  }
+
+  /// Returns a human-readable string representation of [this].
+  String toString() {
+    // Figure out the longest path so we know how much to pad.
+    var longest = frames.map((frame) => frame.location.length)
+        .fold(0, math.max);
+
+    // Print out the stack trace nicely formatted.
+    return frames.map((frame) {
+      if (frame is UnparsedFrame) return "$frame\n";
+      return '${padRight(frame.location, longest)}  ${frame.member}\n';
+    }).join();
+  }
+}
diff --git a/mojo/public/dart/third_party/stack_trace/lib/src/unparsed_frame.dart b/mojo/public/dart/third_party/stack_trace/lib/src/unparsed_frame.dart
new file mode 100644
index 0000000..f037c8a
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/lib/src/unparsed_frame.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library stack_trace.unparsed_frame;
+
+import 'frame.dart';
+
+/// A frame that failed to parse.
+///
+/// The [member] property contains the original frame's contents.
+class UnparsedFrame implements Frame {
+  final Uri uri = new Uri(path: "unparsed");
+  final int line = null;
+  final int column = null;
+  final bool isCore = false;
+  final String library = "unparsed";
+  final String package = null;
+  final String location = "unparsed";
+
+  final String member;
+
+  UnparsedFrame(this.member);
+
+  String toString() => member;
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/stack_trace/lib/src/utils.dart b/mojo/public/dart/third_party/stack_trace/lib/src/utils.dart
new file mode 100644
index 0000000..62a2820
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/lib/src/utils.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library stack_trace.src.utils;
+
+/// Returns [string] with enough spaces added to the end to make it [length]
+/// characters long.
+String padRight(String string, int length) {
+  if (string.length >= length) return string;
+
+  var result = new StringBuffer();
+  result.write(string);
+  for (var i = 0; i < length - string.length; i++) {
+    result.write(' ');
+  }
+
+  return result.toString();
+}
+
+/// Flattens nested lists inside an iterable into a single list containing only
+/// non-list elements.
+List flatten(Iterable nested) {
+  var result = [];
+  helper(list) {
+    for (var element in list) {
+      if (element is List) {
+        helper(element);
+      } else {
+        result.add(element);
+      }
+    }
+  }
+  helper(nested);
+  return result;
+}
diff --git a/mojo/public/dart/third_party/stack_trace/lib/src/vm_trace.dart b/mojo/public/dart/third_party/stack_trace/lib/src/vm_trace.dart
new file mode 100644
index 0000000..7991160
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/lib/src/vm_trace.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library vm_trace;
+
+import 'frame.dart';
+import 'utils.dart';
+
+/// An implementation of [StackTrace] that emulates the behavior of the VM's
+/// implementation.
+///
+/// In particular, when [toString] is called, this returns a string in the VM's
+/// stack trace format.
+class VMTrace implements StackTrace {
+  /// The stack frames that comprise this stack trace.
+  final List<Frame> frames;
+
+  VMTrace(this.frames);
+
+  String toString() {
+    var i = 1;
+    return frames.map((frame) {
+      var number = padRight("#${i++}", 8);
+      var member = frame.member
+          .replaceAllMapped(new RegExp(r"[^.]+\.<async>"),
+              (match) => "${match[1]}.<${match[1]}_async_body>")
+          .replaceAll("<fn>", "<anonymous closure>");
+      var line = frame.line == null ? 0 : frame.line;
+      var column = frame.column == null ? 0 : frame.column;
+      return "$number$member (${frame.uri}:$line:$column)\n";
+    }).join();
+  }
+}
diff --git a/mojo/public/dart/third_party/stack_trace/lib/stack_trace.dart b/mojo/public/dart/third_party/stack_trace/lib/stack_trace.dart
new file mode 100644
index 0000000..6bba635
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/lib/stack_trace.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Stack trace generation and parsing.
+ *
+ * ## Installing ##
+ *
+ * Use [pub][] to install this package. Add the following to your `pubspec.yaml`
+ * file.
+ *
+ *     dependencies:
+ *       stack_trace: any
+ *
+ * Then run `pub install`.
+ *
+ * For more information, see the
+ * [stack_trace package on pub.dartlang.org][pkg].
+ *
+ * [pub]: http://pub.dartlang.org
+ * [pkg]: http://pub.dartlang.org/packages/stack_trace
+ */
+library stack_trace;
+
+export 'src/chain.dart';
+export 'src/frame.dart';
+export 'src/trace.dart';
+export 'src/unparsed_frame.dart';
diff --git a/mojo/public/dart/third_party/stack_trace/pubspec.yaml b/mojo/public/dart/third_party/stack_trace/pubspec.yaml
new file mode 100644
index 0000000..5c8b720
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/pubspec.yaml
@@ -0,0 +1,22 @@
+name: stack_trace
+
+# Note! This version number is referenced directly in the pub source code in
+# lib/src/barback.dart. Pub implicitly places a version constraint on
+# stack_trace to ensure users only select a version of stack_trace that works
+# with their current version of pub.
+#
+# When the major version is upgraded, you *must* update that version constraint
+# in pub to stay in sync with this.
+version: 1.4.2
+author: "Dart Team <misc@dartlang.org>"
+homepage: http://github.com/dart-lang/stack_trace
+description: >
+  A package for manipulating stack traces and printing them readably.
+
+dependencies:
+  path: "^1.2.0"
+
+dev_dependencies:
+  test: "^0.12.0"
+environment:
+  sdk: ">=1.8.0 <2.0.0"
diff --git a/mojo/public/dart/third_party/stack_trace/test/chain/chain_test.dart b/mojo/public/dart/third_party/stack_trace/test/chain/chain_test.dart
new file mode 100644
index 0000000..0eb3f00
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/test/chain/chain_test.dart
@@ -0,0 +1,282 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:path/path.dart' as p;
+import 'package:stack_trace/stack_trace.dart';
+import 'package:test/test.dart';
+
+import 'utils.dart';
+
+void main() {
+  group('Chain.parse()', () {
+    test('parses a real Chain', () {
+      return captureFuture(() => inMicrotask(() => throw 'error'))
+          .then((chain) {
+        expect(new Chain.parse(chain.toString()).toString(),
+            equals(chain.toString()));
+      });
+    });
+
+    test('parses an empty string', () {
+      var chain = new Chain.parse('');
+      expect(chain.traces, isEmpty);
+    });
+
+    test('parses a chain containing empty traces', () {
+      var chain = new Chain.parse(
+          '===== asynchronous gap ===========================\n'
+          '===== asynchronous gap ===========================\n');
+      expect(chain.traces, hasLength(3));
+      expect(chain.traces[0].frames, isEmpty);
+      expect(chain.traces[1].frames, isEmpty);
+      expect(chain.traces[2].frames, isEmpty);
+    });
+  });
+
+  test("toString() ensures that all traces are aligned", () {
+    var chain = new Chain([
+      new Trace.parse('short 10:11  Foo.bar\n'),
+      new Trace.parse('loooooooooooong 10:11  Zop.zoop')
+    ]);
+
+    expect(chain.toString(), equals(
+        'short 10:11            Foo.bar\n'
+        '===== asynchronous gap ===========================\n'
+        'loooooooooooong 10:11  Zop.zoop\n'));
+  });
+
+  var userSlashCode = p.join('user', 'code.dart');
+  group('Chain.terse', () {
+    test('makes each trace terse', () {
+      var chain = new Chain([
+        new Trace.parse(
+            'dart:core 10:11       Foo.bar\n'
+            'dart:core 10:11       Bar.baz\n'
+            'user/code.dart 10:11  Bang.qux\n'
+            'dart:core 10:11       Zip.zap\n'
+            'dart:core 10:11       Zop.zoop'),
+        new Trace.parse(
+            'user/code.dart 10:11                        Bang.qux\n'
+            'dart:core 10:11                             Foo.bar\n'
+            'package:stack_trace/stack_trace.dart 10:11  Bar.baz\n'
+            'dart:core 10:11                             Zip.zap\n'
+            'user/code.dart 10:11                        Zop.zoop')
+      ]);
+
+      expect(chain.terse.toString(), equals(
+          'dart:core             Bar.baz\n'
+          '$userSlashCode 10:11  Bang.qux\n'
+          '===== asynchronous gap ===========================\n'
+          '$userSlashCode 10:11  Bang.qux\n'
+          'dart:core             Zip.zap\n'
+          '$userSlashCode 10:11  Zop.zoop\n'));
+    });
+
+    test('eliminates internal-only traces', () {
+      var chain = new Chain([
+        new Trace.parse(
+            'user/code.dart 10:11  Foo.bar\n'
+            'dart:core 10:11       Bar.baz'),
+        new Trace.parse(
+            'dart:core 10:11                             Foo.bar\n'
+            'package:stack_trace/stack_trace.dart 10:11  Bar.baz\n'
+            'dart:core 10:11                             Zip.zap'),
+        new Trace.parse(
+            'user/code.dart 10:11  Foo.bar\n'
+            'dart:core 10:11       Bar.baz')
+      ]);
+
+      expect(chain.terse.toString(), equals(
+          '$userSlashCode 10:11  Foo.bar\n'
+          '===== asynchronous gap ===========================\n'
+          '$userSlashCode 10:11  Foo.bar\n'));
+    });
+
+    test("doesn't return an empty chain", () {
+      var chain = new Chain([
+        new Trace.parse(
+            'dart:core 10:11                             Foo.bar\n'
+            'package:stack_trace/stack_trace.dart 10:11  Bar.baz\n'
+            'dart:core 10:11                             Zip.zap'),
+        new Trace.parse(
+            'dart:core 10:11                             A.b\n'
+            'package:stack_trace/stack_trace.dart 10:11  C.d\n'
+            'dart:core 10:11                             E.f')
+      ]);
+
+      expect(chain.terse.toString(), equals('dart:core  E.f\n'));
+    });
+  });
+
+  group('Chain.foldFrames', () {
+    test('folds each trace', () {
+      var chain = new Chain([
+        new Trace.parse(
+            'a.dart 10:11  Foo.bar\n'
+            'a.dart 10:11  Bar.baz\n'
+            'b.dart 10:11  Bang.qux\n'
+            'a.dart 10:11  Zip.zap\n'
+            'a.dart 10:11  Zop.zoop'),
+        new Trace.parse(
+            'a.dart 10:11  Foo.bar\n'
+            'a.dart 10:11  Bar.baz\n'
+            'a.dart 10:11  Bang.qux\n'
+            'a.dart 10:11  Zip.zap\n'
+            'b.dart 10:11  Zop.zoop')
+      ]);
+
+      var folded = chain.foldFrames((frame) => frame.library == 'a.dart');
+      expect(folded.toString(), equals(
+          'a.dart 10:11  Bar.baz\n'
+          'b.dart 10:11  Bang.qux\n'
+          'a.dart 10:11  Zop.zoop\n'
+          '===== asynchronous gap ===========================\n'
+          'a.dart 10:11  Zip.zap\n'
+          'b.dart 10:11  Zop.zoop\n'));
+    });
+
+    test('with terse: true, folds core frames as well', () {
+      var chain = new Chain([
+        new Trace.parse(
+            'a.dart 10:11                        Foo.bar\n'
+            'dart:async-patch/future.dart 10:11  Zip.zap\n'
+            'b.dart 10:11                        Bang.qux\n'
+            'dart:core 10:11                     Bar.baz\n'
+            'a.dart 10:11                        Zop.zoop'),
+        new Trace.parse(
+            'a.dart 10:11  Foo.bar\n'
+            'a.dart 10:11  Bar.baz\n'
+            'a.dart 10:11  Bang.qux\n'
+            'a.dart 10:11  Zip.zap\n'
+            'b.dart 10:11  Zop.zoop')
+      ]);
+
+      var folded = chain.foldFrames((frame) => frame.library == 'a.dart',
+          terse: true);
+      expect(folded.toString(), equals(
+          'dart:async    Zip.zap\n'
+          'b.dart 10:11  Bang.qux\n'
+          'a.dart        Zop.zoop\n'
+          '===== asynchronous gap ===========================\n'
+          'a.dart        Zip.zap\n'
+          'b.dart 10:11  Zop.zoop\n'));
+    });
+
+    test('eliminates completely-folded traces', () {
+      var chain = new Chain([
+        new Trace.parse(
+            'a.dart 10:11  Foo.bar\n'
+            'b.dart 10:11  Bang.qux'),
+        new Trace.parse(
+            'a.dart 10:11  Foo.bar\n'
+            'a.dart 10:11  Bang.qux'),
+        new Trace.parse(
+            'a.dart 10:11  Zip.zap\n'
+            'b.dart 10:11  Zop.zoop')
+      ]);
+
+      var folded = chain.foldFrames((frame) => frame.library == 'a.dart');
+      expect(folded.toString(), equals(
+          'a.dart 10:11  Foo.bar\n'
+          'b.dart 10:11  Bang.qux\n'
+          '===== asynchronous gap ===========================\n'
+          'a.dart 10:11  Zip.zap\n'
+          'b.dart 10:11  Zop.zoop\n'));
+    });
+
+    test("doesn't return an empty trace", () {
+      var chain = new Chain([
+        new Trace.parse(
+            'a.dart 10:11  Foo.bar\n'
+            'a.dart 10:11  Bang.qux')
+      ]);
+
+      var folded = chain.foldFrames((frame) => frame.library == 'a.dart');
+      expect(folded.toString(), equals('a.dart 10:11  Bang.qux\n'));
+    });
+  });
+
+  test('Chain.toTrace eliminates asynchronous gaps', () {
+    var trace = new Chain([
+      new Trace.parse(
+          'user/code.dart 10:11  Foo.bar\n'
+          'dart:core 10:11       Bar.baz'),
+      new Trace.parse(
+          'user/code.dart 10:11  Foo.bar\n'
+          'dart:core 10:11       Bar.baz')
+    ]).toTrace();
+
+    expect(trace.toString(), equals(
+        '$userSlashCode 10:11  Foo.bar\n'
+        'dart:core 10:11       Bar.baz\n'
+        '$userSlashCode 10:11  Foo.bar\n'
+        'dart:core 10:11       Bar.baz\n'));
+  });
+
+  group('Chain.track(Future)', () {
+    test('forwards the future value within Chain.capture()', () {
+      Chain.capture(() {
+        expect(Chain.track(new Future.value('value')),
+            completion(equals('value')));
+
+        var trace = new Trace.current();
+        expect(Chain.track(new Future.error('error', trace))
+            .catchError((e, stackTrace) {
+          expect(e, equals('error'));
+          expect(stackTrace.toString(), equals(trace.toString()));
+        }), completes);
+      });
+    });
+
+    test('forwards the future value outside of Chain.capture()', () {
+      expect(Chain.track(new Future.value('value')),
+          completion(equals('value')));
+
+      var trace = new Trace.current();
+      expect(Chain.track(new Future.error('error', trace))
+          .catchError((e, stackTrace) {
+        expect(e, equals('error'));
+        expect(stackTrace.toString(), equals(trace.toString()));
+      }), completes);
+    });
+  });
+
+  group('Chain.track(Stream)', () {
+    test('forwards stream values within Chain.capture()', () {
+      Chain.capture(() {
+        var controller = new StreamController()
+            ..add(1)..add(2)..add(3)..close();
+        expect(Chain.track(controller.stream).toList(),
+            completion(equals([1, 2, 3])));
+
+        var trace = new Trace.current();
+        controller = new StreamController()..addError('error', trace);
+        expect(Chain.track(controller.stream).toList()
+            .catchError((e, stackTrace) {
+          expect(e, equals('error'));
+          expect(stackTrace.toString(), equals(trace.toString()));
+        }), completes);
+      });
+    });
+
+    test('forwards stream values outside of Chain.capture()', () {
+      Chain.capture(() {
+        var controller = new StreamController()
+            ..add(1)..add(2)..add(3)..close();
+        expect(Chain.track(controller.stream).toList(),
+            completion(equals([1, 2, 3])));
+
+        var trace = new Trace.current();
+        controller = new StreamController()..addError('error', trace);
+        expect(Chain.track(controller.stream).toList()
+            .catchError((e, stackTrace) {
+          expect(e, equals('error'));
+          expect(stackTrace.toString(), equals(trace.toString()));
+        }), completes);
+      });
+    });
+  });
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/stack_trace/test/chain/dart2js_test.dart b/mojo/public/dart/third_party/stack_trace/test/chain/dart2js_test.dart
new file mode 100644
index 0000000..afb27fa
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/test/chain/dart2js_test.dart
@@ -0,0 +1,338 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// dart2js chain tests are separated out because dart2js stack traces are
+// inconsistent due to inlining and browser differences. These tests don't
+// assert anything about the content of the traces, just the number of traces in
+// a chain.
+@TestOn('js')
+
+import 'dart:async';
+
+import 'package:stack_trace/stack_trace.dart';
+import 'package:test/test.dart';
+
+import 'utils.dart';
+
+void main() {
+  group('capture() with onError catches exceptions', () {
+    test('thrown synchronously', () async {
+      var chain = await captureFuture(() => throw 'error');
+      expect(chain.traces, hasLength(1));
+    });
+
+    test('thrown in a microtask', () async {
+      var chain = await captureFuture(() => inMicrotask(() => throw 'error'));
+      expect(chain.traces, hasLength(2));
+    });
+
+    test('thrown in a one-shot timer', () async {
+      var chain = await captureFuture(
+          () => inOneShotTimer(() => throw 'error'));
+      expect(chain.traces, hasLength(2));
+    });
+
+    test('thrown in a periodic timer', () async {
+      var chain = await captureFuture(
+          () => inPeriodicTimer(() => throw 'error'));
+      expect(chain.traces, hasLength(2));
+    });
+
+    test('thrown in a nested series of asynchronous operations', () async {
+      var chain = await captureFuture(() {
+        inPeriodicTimer(() {
+          inOneShotTimer(() => inMicrotask(() => throw 'error'));
+        });
+      });
+
+      expect(chain.traces, hasLength(4));
+    });
+
+    test('thrown in a long future chain', () async {
+      var chain = await captureFuture(() => inFutureChain(() => throw 'error'));
+
+      // Despite many asynchronous operations, there's only one level of
+      // nested calls, so there should be only two traces in the chain. This
+      // is important; programmers expect stack trace memory consumption to be
+      // O(depth of program), not O(length of program).
+      expect(chain.traces, hasLength(2));
+    });
+
+    test('thrown in new Future()', () async {
+      var chain = await captureFuture(() => inNewFuture(() => throw 'error'));
+      expect(chain.traces, hasLength(3));
+    });
+
+    test('thrown in new Future.sync()', () async {
+      var chain = await captureFuture(() {
+        inMicrotask(() => inSyncFuture(() => throw 'error'));
+      });
+
+      expect(chain.traces, hasLength(3));
+    });
+
+    test('multiple times', () {
+      var completer = new Completer();
+      var first = true;
+
+      Chain.capture(() {
+        inMicrotask(() => throw 'first error');
+        inPeriodicTimer(() => throw 'second error');
+      }, onError: (error, chain) {
+        try {
+          if (first) {
+            expect(error, equals('first error'));
+            expect(chain.traces, hasLength(2));
+            first = false;
+          } else {
+            expect(error, equals('second error'));
+            expect(chain.traces, hasLength(2));
+            completer.complete();
+          }
+        } catch (error, stackTrace) {
+          completer.completeError(error, stackTrace);
+        }
+      });
+
+      return completer.future;
+    });
+
+    test('passed to a completer', () async {
+      var trace = new Trace.current();
+      var chain = await captureFuture(() {
+        inMicrotask(() => completerErrorFuture(trace));
+      });
+
+      expect(chain.traces, hasLength(3));
+
+      // The first trace is the trace that was manually reported for the
+      // error.
+      expect(chain.traces.first.toString(), equals(trace.toString()));
+    });
+
+    test('passed to a completer with no stack trace', () async {
+      var chain = await captureFuture(() {
+        inMicrotask(() => completerErrorFuture());
+      });
+
+      expect(chain.traces, hasLength(2));
+    });
+
+    test('passed to a stream controller', () async {
+      var trace = new Trace.current();
+      var chain = await captureFuture(() {
+        inMicrotask(() => controllerErrorStream(trace).listen(null));
+      });
+
+      expect(chain.traces, hasLength(3));
+      expect(chain.traces.first.toString(), equals(trace.toString()));
+    });
+
+    test('passed to a stream controller with no stack trace', () async {
+      var chain = await captureFuture(() {
+        inMicrotask(() => controllerErrorStream().listen(null));
+      });
+
+      expect(chain.traces, hasLength(2));
+    });
+
+    test('and relays them to the parent zone', () {
+      var completer = new Completer();
+
+      runZoned(() {
+        Chain.capture(() {
+          inMicrotask(() => throw 'error');
+        }, onError: (error, chain) {
+          expect(error, equals('error'));
+          expect(chain.traces, hasLength(2));
+          throw error;
+        });
+      }, onError: (error, chain) {
+        try {
+          expect(error, equals('error'));
+          expect(chain, new isInstanceOf<Chain>());
+          expect(chain.traces, hasLength(2));
+          completer.complete();
+        } catch (error, stackTrace) {
+          completer.completeError(error, stackTrace);
+        }
+      });
+
+      return completer.future;
+    });
+  });
+
+  test('capture() without onError passes exceptions to parent zone', () {
+    var completer = new Completer();
+
+    runZoned(() {
+      Chain.capture(() => inMicrotask(() => throw 'error'));
+    }, onError: (error, chain) {
+      try {
+        expect(error, equals('error'));
+        expect(chain, new isInstanceOf<Chain>());
+        expect(chain.traces, hasLength(2));
+        completer.complete();
+      } catch (error, stackTrace) {
+        completer.completeError(error, stackTrace);
+      }
+    });
+
+    return completer.future;
+  });
+
+  group('current() within capture()', () {
+    test('called in a microtask', () async {
+      var completer = new Completer();
+      Chain.capture(() {
+        inMicrotask(() => completer.complete(new Chain.current()));
+      });
+
+      var chain = await completer.future;
+      expect(chain.traces, hasLength(2));
+    });
+
+    test('called in a one-shot timer', () async {
+      var completer = new Completer();
+      Chain.capture(() {
+        inOneShotTimer(() => completer.complete(new Chain.current()));
+      });
+
+      var chain = await completer.future;
+      expect(chain.traces, hasLength(2));
+    });
+
+    test('called in a periodic timer', () async {
+      var completer = new Completer();
+      Chain.capture(() {
+        inPeriodicTimer(() => completer.complete(new Chain.current()));
+      });
+
+      var chain = await completer.future;
+      expect(chain.traces, hasLength(2));
+    });
+
+    test('called in a nested series of asynchronous operations', () async {
+      var completer = new Completer();
+      Chain.capture(() {
+        inPeriodicTimer(() {
+          inOneShotTimer(() {
+            inMicrotask(() => completer.complete(new Chain.current()));
+          });
+        });
+      });
+
+      var chain = await completer.future;
+      expect(chain.traces, hasLength(4));
+    });
+
+    test('called in a long future chain', () async {
+      var completer = new Completer();
+      Chain.capture(() {
+        inFutureChain(() => completer.complete(new Chain.current()));
+      });
+
+      var chain = await completer.future;
+      expect(chain.traces, hasLength(2));
+    });
+  });
+
+  test('current() outside of capture() returns a chain wrapping the current '
+      'trace', () {
+    // The test runner runs all tests with chains enabled, so to test without we
+    // have to do some zone munging.
+    return runZoned(() async {
+      var completer = new Completer();
+      inMicrotask(() => completer.complete(new Chain.current()));
+
+      var chain = await completer.future;
+      // Since the chain wasn't loaded within [Chain.capture], the full stack
+      // chain isn't available and it just returns the current stack when
+      // called.
+      expect(chain.traces, hasLength(1));
+    }, zoneValues: {#stack_trace.stack_zone.spec: null});
+  });
+
+  group('forTrace() within capture()', () {
+    test('called for a stack trace from a microtask', () async {
+      var chain = await Chain.capture(() {
+        return chainForTrace(inMicrotask, () => throw 'error');
+      });
+
+      // Because [chainForTrace] has to set up a future chain to capture the
+      // stack trace while still showing it to the zone specification, it adds
+      // an additional level of async nesting and so an additional trace.
+      expect(chain.traces, hasLength(3));
+    });
+
+    test('called for a stack trace from a one-shot timer', () async {
+      var chain = await Chain.capture(() {
+        return chainForTrace(inOneShotTimer, () => throw 'error');
+      });
+
+      expect(chain.traces, hasLength(3));
+    });
+
+    test('called for a stack trace from a periodic timer', () async {
+      var chain = await Chain.capture(() {
+        return chainForTrace(inPeriodicTimer, () => throw 'error');
+      });
+
+      expect(chain.traces, hasLength(3));
+    });
+
+    test('called for a stack trace from a nested series of asynchronous '
+        'operations', () async {
+      var chain = await Chain.capture(() {
+        return chainForTrace((callback) {
+          inPeriodicTimer(() => inOneShotTimer(() => inMicrotask(callback)));
+        }, () => throw 'error');
+      });
+
+      expect(chain.traces, hasLength(5));
+    });
+
+    test('called for a stack trace from a long future chain', () async {
+      var chain = await Chain.capture(() {
+        return chainForTrace(inFutureChain, () => throw 'error');
+      });
+
+      expect(chain.traces, hasLength(3));
+    });
+
+    test('called for an unregistered stack trace returns a chain wrapping that '
+        'trace', () {
+      var trace;
+      var chain = Chain.capture(() {
+        try {
+          throw 'error';
+        } catch (_, stackTrace) {
+          trace = stackTrace;
+          return new Chain.forTrace(stackTrace);
+        }
+      });
+
+      expect(chain.traces, hasLength(1));
+      expect(chain.traces.first.toString(),
+          equals(new Trace.from(trace).toString()));
+    });
+  });
+
+  test('forTrace() outside of capture() returns a chain wrapping the given '
+      'trace', () {
+    var trace;
+    var chain = Chain.capture(() {
+      try {
+        throw 'error';
+      } catch (_, stackTrace) {
+        trace = stackTrace;
+        return new Chain.forTrace(stackTrace);
+      }
+    });
+
+    expect(chain.traces, hasLength(1));
+    expect(chain.traces.first.toString(),
+        equals(new Trace.from(trace).toString()));
+  });
+}
diff --git a/mojo/public/dart/third_party/stack_trace/test/chain/utils.dart b/mojo/public/dart/third_party/stack_trace/test/chain/utils.dart
new file mode 100644
index 0000000..1e19eeb
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/test/chain/utils.dart
@@ -0,0 +1,93 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library stack_trace.test.chain.utils;
+
+import 'dart:async';
+
+import 'package:stack_trace/stack_trace.dart';
+import 'package:test/test.dart';
+
+/// Runs [callback] in a microtask callback.
+void inMicrotask(callback()) => scheduleMicrotask(callback);
+
+/// Runs [callback] in a one-shot timer callback.
+void inOneShotTimer(callback()) => Timer.run(callback);
+
+/// Runs [callback] once in a periodic timer callback.
+void inPeriodicTimer(callback()) {
+  var count = 0;
+  new Timer.periodic(new Duration(milliseconds: 1), (timer) {
+    count++;
+    if (count != 5) return;
+    timer.cancel();
+    callback();
+  });
+}
+
+/// Runs [callback] within a long asynchronous Future chain.
+void inFutureChain(callback()) {
+  new Future(() {})
+      .then((_) => new Future(() {}))
+      .then((_) => new Future(() {}))
+      .then((_) => new Future(() {}))
+      .then((_) => new Future(() {}))
+      .then((_) => callback())
+      .then((_) => new Future(() {}));
+}
+
+void inNewFuture(callback()) {
+  new Future(callback);
+}
+
+void inSyncFuture(callback()) {
+  new Future.sync(callback);
+}
+
+/// Returns a Future that completes to an error using a completer.
+///
+/// If [trace] is passed, it's used as the stack trace for the error.
+Future completerErrorFuture([StackTrace trace]) {
+  var completer = new Completer();
+  completer.completeError('error', trace);
+  return completer.future;
+}
+
+/// Returns a Stream that emits an error using a controller.
+///
+/// If [trace] is passed, it's used as the stack trace for the error.
+Stream controllerErrorStream([StackTrace trace]) {
+  var controller = new StreamController();
+  controller.addError('error', trace);
+  return controller.stream;
+}
+
+/// Runs [callback] within [asyncFn], then converts any errors raised into a
+/// [Chain] with [Chain.forTrace].
+Future<Chain> chainForTrace(asyncFn(callback()), callback()) {
+  var completer = new Completer();
+  asyncFn(() {
+    // We use `new Future.value().then(...)` here as opposed to [new Future] or
+    // [new Future.sync] because those methods don't pass the exception through
+    // the zone specification before propagating it, so there's no chance to
+    // attach a chain to its stack trace. See issue 15105.
+    new Future.value().then((_) => callback())
+        .catchError(completer.completeError);
+  });
+  return completer.future
+      .catchError((_, stackTrace) => new Chain.forTrace(stackTrace));
+}
+
+/// Runs [callback] in a [Chain.capture] zone and returns a Future that
+/// completes to the stack chain for an error thrown by [callback].
+///
+/// [callback] is expected to throw the string `"error"`.
+Future<Chain> captureFuture(callback()) {
+  var completer = new Completer<Chain>();
+  Chain.capture(callback, onError: (error, chain) {
+    expect(error, equals('error'));
+    completer.complete(chain);
+  });
+  return completer.future;
+}
diff --git a/mojo/public/dart/third_party/stack_trace/test/chain/vm_test.dart b/mojo/public/dart/third_party/stack_trace/test/chain/vm_test.dart
new file mode 100644
index 0000000..70635b7
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/test/chain/vm_test.dart
@@ -0,0 +1,481 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VM chain tests can rely on stronger guarantees about the contents of the
+// stack traces than dart2js.
+@TestOn('dart-vm')
+
+import 'dart:async';
+
+import 'package:stack_trace/stack_trace.dart';
+import 'package:test/test.dart';
+
+import '../utils.dart';
+import 'utils.dart';
+
+void main() {
+  group('capture() with onError catches exceptions', () {
+    test('thrown synchronously', () {
+      return captureFuture(() => throw 'error')
+          .then((chain) {
+        expect(chain.traces, hasLength(1));
+        expect(chain.traces.single.frames.first,
+            frameMember(startsWith('main')));
+      });
+    });
+
+    test('thrown in a microtask', () {
+      return captureFuture(() => inMicrotask(() => throw 'error'))
+          .then((chain) {
+        // Since there was only one asynchronous operation, there should be only
+        // two traces in the chain.
+        expect(chain.traces, hasLength(2));
+
+        // The first frame of the first trace should be the line on which the
+        // actual error was thrown.
+        expect(chain.traces[0].frames.first, frameMember(startsWith('main')));
+
+        // The second trace should describe the stack when the error callback
+        // was scheduled.
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('inMicrotask'))));
+      });
+    });
+
+    test('thrown in a one-shot timer', () {
+      return captureFuture(() => inOneShotTimer(() => throw 'error'))
+          .then((chain) {
+        expect(chain.traces, hasLength(2));
+        expect(chain.traces[0].frames.first, frameMember(startsWith('main')));
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('inOneShotTimer'))));
+      });
+    });
+
+    test('thrown in a periodic timer', () {
+      return captureFuture(() => inPeriodicTimer(() => throw 'error'))
+          .then((chain) {
+        expect(chain.traces, hasLength(2));
+        expect(chain.traces[0].frames.first, frameMember(startsWith('main')));
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('inPeriodicTimer'))));
+      });
+    });
+
+    test('thrown in a nested series of asynchronous operations', () {
+      return captureFuture(() {
+        inPeriodicTimer(() {
+          inOneShotTimer(() => inMicrotask(() => throw 'error'));
+        });
+      }).then((chain) {
+        expect(chain.traces, hasLength(4));
+        expect(chain.traces[0].frames.first, frameMember(startsWith('main')));
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('inMicrotask'))));
+        expect(chain.traces[2].frames,
+            contains(frameMember(startsWith('inOneShotTimer'))));
+        expect(chain.traces[3].frames,
+            contains(frameMember(startsWith('inPeriodicTimer'))));
+      });
+    });
+
+    test('thrown in a long future chain', () {
+      return captureFuture(() => inFutureChain(() => throw 'error'))
+          .then((chain) {
+        // Despite many asynchronous operations, there's only one level of
+        // nested calls, so there should be only two traces in the chain. This
+        // is important; programmers expect stack trace memory consumption to be
+        // O(depth of program), not O(length of program).
+        expect(chain.traces, hasLength(2));
+
+        expect(chain.traces[0].frames.first, frameMember(startsWith('main')));
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('inFutureChain'))));
+      });
+    });
+
+    test('thrown in new Future()', () {
+      return captureFuture(() => inNewFuture(() => throw 'error'))
+          .then((chain) {
+        expect(chain.traces, hasLength(3));
+        expect(chain.traces[0].frames.first, frameMember(startsWith('main')));
+
+        // The second trace is the one captured by
+        // [StackZoneSpecification.errorCallback]. Because that runs
+        // asynchronously within [new Future], it doesn't actually refer to the
+        // source file at all.
+        expect(chain.traces[1].frames,
+            everyElement(frameLibrary(isNot(contains('chain_test')))));
+
+        expect(chain.traces[2].frames,
+            contains(frameMember(startsWith('inNewFuture'))));
+      });
+    });
+
+    test('thrown in new Future.sync()', () {
+      return captureFuture(() {
+        inMicrotask(() => inSyncFuture(() => throw 'error'));
+      }).then((chain) {
+        expect(chain.traces, hasLength(3));
+        expect(chain.traces[0].frames.first, frameMember(startsWith('main')));
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('inSyncFuture'))));
+        expect(chain.traces[2].frames,
+            contains(frameMember(startsWith('inMicrotask'))));
+      });
+    });
+
+    test('multiple times', () {
+      var completer = new Completer();
+      var first = true;
+
+      Chain.capture(() {
+        inMicrotask(() => throw 'first error');
+        inPeriodicTimer(() => throw 'second error');
+      }, onError: (error, chain) {
+        try {
+          if (first) {
+            expect(error, equals('first error'));
+            expect(chain.traces[1].frames,
+                contains(frameMember(startsWith('inMicrotask'))));
+            first = false;
+          } else {
+            expect(error, equals('second error'));
+            expect(chain.traces[1].frames,
+                contains(frameMember(startsWith('inPeriodicTimer'))));
+            completer.complete();
+          }
+        } catch (error, stackTrace) {
+          completer.completeError(error, stackTrace);
+        }
+      });
+
+      return completer.future;
+    });
+
+    test('passed to a completer', () {
+      var trace = new Trace.current();
+      return captureFuture(() {
+        inMicrotask(() => completerErrorFuture(trace));
+      }).then((chain) {
+        expect(chain.traces, hasLength(3));
+
+        // The first trace is the trace that was manually reported for the
+        // error.
+        expect(chain.traces.first.toString(), equals(trace.toString()));
+
+        // The second trace is the trace that was captured when
+        // [Completer.addError] was called.
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('completerErrorFuture'))));
+
+        // The third trace is the automatically-captured trace from when the
+        // microtask was scheduled.
+        expect(chain.traces[2].frames,
+            contains(frameMember(startsWith('inMicrotask'))));
+      });
+    });
+
+    test('passed to a completer with no stack trace', () {
+      return captureFuture(() {
+        inMicrotask(() => completerErrorFuture());
+      }).then((chain) {
+        expect(chain.traces, hasLength(2));
+
+        // The first trace is the one captured when [Completer.addError] was
+        // called.
+        expect(chain.traces[0].frames,
+            contains(frameMember(startsWith('completerErrorFuture'))));
+
+        // The second trace is the automatically-captured trace from when the
+        // microtask was scheduled.
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('inMicrotask'))));
+      });
+    });
+
+    test('passed to a stream controller', () {
+      var trace = new Trace.current();
+      return captureFuture(() {
+        inMicrotask(() => controllerErrorStream(trace).listen(null));
+      }).then((chain) {
+        expect(chain.traces, hasLength(3));
+        expect(chain.traces.first.toString(), equals(trace.toString()));
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('controllerErrorStream'))));
+        expect(chain.traces[2].frames,
+            contains(frameMember(startsWith('inMicrotask'))));
+      });
+    });
+
+    test('passed to a stream controller with no stack trace', () {
+      return captureFuture(() {
+        inMicrotask(() => controllerErrorStream().listen(null));
+      }).then((chain) {
+        expect(chain.traces, hasLength(2));
+        expect(chain.traces[0].frames,
+            contains(frameMember(startsWith('controllerErrorStream'))));
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('inMicrotask'))));
+      });
+    });
+
+    test('and relays them to the parent zone', () {
+      var completer = new Completer();
+
+      runZoned(() {
+        Chain.capture(() {
+          inMicrotask(() => throw 'error');
+        }, onError: (error, chain) {
+          expect(error, equals('error'));
+          expect(chain.traces[1].frames,
+              contains(frameMember(startsWith('inMicrotask'))));
+          throw error;
+        });
+      }, onError: (error, chain) {
+        try {
+          expect(error, equals('error'));
+          expect(chain, new isInstanceOf<Chain>());
+          expect(chain.traces[1].frames,
+              contains(frameMember(startsWith('inMicrotask'))));
+          completer.complete();
+        } catch (error, stackTrace) {
+          completer.completeError(error, stackTrace);
+        }
+      });
+
+      return completer.future;
+    });
+  });
+
+  test('capture() without onError passes exceptions to parent zone', () {
+    var completer = new Completer();
+
+    runZoned(() {
+      Chain.capture(() => inMicrotask(() => throw 'error'));
+    }, onError: (error, chain) {
+      try {
+        expect(error, equals('error'));
+        expect(chain, new isInstanceOf<Chain>());
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('inMicrotask'))));
+        completer.complete();
+      } catch (error, stackTrace) {
+        completer.completeError(error, stackTrace);
+      }
+    });
+
+    return completer.future;
+  });
+
+  group('current() within capture()', () {
+    test('called in a microtask', () {
+      var completer = new Completer();
+      Chain.capture(() {
+        inMicrotask(() => completer.complete(new Chain.current()));
+      });
+
+      return completer.future.then((chain) {
+        expect(chain.traces, hasLength(2));
+        expect(chain.traces[0].frames.first, frameMember(startsWith('main')));
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('inMicrotask'))));
+      });
+    });
+
+    test('called in a one-shot timer', () {
+      var completer = new Completer();
+      Chain.capture(() {
+        inOneShotTimer(() => completer.complete(new Chain.current()));
+      });
+
+      return completer.future.then((chain) {
+        expect(chain.traces, hasLength(2));
+        expect(chain.traces[0].frames.first, frameMember(startsWith('main')));
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('inOneShotTimer'))));
+      });
+    });
+
+    test('called in a periodic timer', () {
+      var completer = new Completer();
+      Chain.capture(() {
+        inPeriodicTimer(() => completer.complete(new Chain.current()));
+      });
+
+      return completer.future.then((chain) {
+        expect(chain.traces, hasLength(2));
+        expect(chain.traces[0].frames.first, frameMember(startsWith('main')));
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('inPeriodicTimer'))));
+      });
+    });
+
+    test('called in a nested series of asynchronous operations', () {
+      var completer = new Completer();
+      Chain.capture(() {
+        inPeriodicTimer(() {
+          inOneShotTimer(() {
+            inMicrotask(() => completer.complete(new Chain.current()));
+          });
+        });
+      });
+
+      return completer.future.then((chain) {
+        expect(chain.traces, hasLength(4));
+        expect(chain.traces[0].frames.first, frameMember(startsWith('main')));
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('inMicrotask'))));
+        expect(chain.traces[2].frames,
+            contains(frameMember(startsWith('inOneShotTimer'))));
+        expect(chain.traces[3].frames,
+            contains(frameMember(startsWith('inPeriodicTimer'))));
+      });
+    });
+
+    test('called in a long future chain', () {
+      var completer = new Completer();
+      Chain.capture(() {
+        inFutureChain(() => completer.complete(new Chain.current()));
+      });
+
+      return completer.future.then((chain) {
+        expect(chain.traces, hasLength(2));
+        expect(chain.traces[0].frames.first, frameMember(startsWith('main')));
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('inFutureChain'))));
+      });
+    });
+  });
+
+  test('current() outside of capture() returns a chain wrapping the current '
+      'trace', () {
+    // The test runner runs all tests with chains enabled, so to test without we
+    // have to do some zone munging.
+    return runZoned(() {
+      var completer = new Completer();
+      inMicrotask(() => completer.complete(new Chain.current()));
+
+      return completer.future.then((chain) {
+        // Since the chain wasn't loaded within [Chain.capture], the full stack
+        // chain isn't available and it just returns the current stack when
+        // called.
+        expect(chain.traces, hasLength(1));
+        expect(chain.traces.first.frames.first,
+            frameMember(startsWith('main')));
+      });
+    }, zoneValues: {#stack_trace.stack_zone.spec: null});
+  });
+
+  group('forTrace() within capture()', () {
+    test('called for a stack trace from a microtask', () {
+      return Chain.capture(() {
+        return chainForTrace(inMicrotask, () => throw 'error');
+      }).then((chain) {
+        // Because [chainForTrace] has to set up a future chain to capture the
+        // stack trace while still showing it to the zone specification, it adds
+        // an additional level of async nesting and so an additional trace.
+        expect(chain.traces, hasLength(3));
+        expect(chain.traces[0].frames.first, frameMember(startsWith('main')));
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('chainForTrace'))));
+        expect(chain.traces[2].frames,
+            contains(frameMember(startsWith('inMicrotask'))));
+      });
+    });
+
+    test('called for a stack trace from a one-shot timer', () {
+      return Chain.capture(() {
+        return chainForTrace(inOneShotTimer, () => throw 'error');
+      }).then((chain) {
+        expect(chain.traces, hasLength(3));
+        expect(chain.traces[0].frames.first, frameMember(startsWith('main')));
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('chainForTrace'))));
+        expect(chain.traces[2].frames,
+            contains(frameMember(startsWith('inOneShotTimer'))));
+      });
+    });
+
+    test('called for a stack trace from a periodic timer', () {
+      return Chain.capture(() {
+        return chainForTrace(inPeriodicTimer, () => throw 'error');
+      }).then((chain) {
+        expect(chain.traces, hasLength(3));
+        expect(chain.traces[0].frames.first, frameMember(startsWith('main')));
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('chainForTrace'))));
+        expect(chain.traces[2].frames,
+            contains(frameMember(startsWith('inPeriodicTimer'))));
+      });
+    });
+
+    test('called for a stack trace from a nested series of asynchronous '
+        'operations', () {
+      return Chain.capture(() {
+        return chainForTrace((callback) {
+          inPeriodicTimer(() => inOneShotTimer(() => inMicrotask(callback)));
+        }, () => throw 'error');
+      }).then((chain) {
+        expect(chain.traces, hasLength(5));
+        expect(chain.traces[0].frames.first, frameMember(startsWith('main')));
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('chainForTrace'))));
+        expect(chain.traces[2].frames,
+            contains(frameMember(startsWith('inMicrotask'))));
+        expect(chain.traces[3].frames,
+            contains(frameMember(startsWith('inOneShotTimer'))));
+        expect(chain.traces[4].frames,
+            contains(frameMember(startsWith('inPeriodicTimer'))));
+      });
+    });
+
+    test('called for a stack trace from a long future chain', () {
+      return Chain.capture(() {
+        return chainForTrace(inFutureChain, () => throw 'error');
+      }).then((chain) {
+        expect(chain.traces, hasLength(3));
+        expect(chain.traces[0].frames.first, frameMember(startsWith('main')));
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('chainForTrace'))));
+        expect(chain.traces[2].frames,
+            contains(frameMember(startsWith('inFutureChain'))));
+      });
+    });
+
+    test('called for an unregistered stack trace returns a chain wrapping that '
+        'trace', () {
+      var trace;
+      var chain = Chain.capture(() {
+        try {
+          throw 'error';
+        } catch (_, stackTrace) {
+          trace = stackTrace;
+          return new Chain.forTrace(stackTrace);
+        }
+      });
+
+      expect(chain.traces, hasLength(1));
+      expect(chain.traces.first.toString(),
+          equals(new Trace.from(trace).toString()));
+    });
+  });
+
+  test('forTrace() outside of capture() returns a chain wrapping the given '
+      'trace', () {
+    var trace;
+    var chain = Chain.capture(() {
+      try {
+        throw 'error';
+      } catch (_, stackTrace) {
+        trace = stackTrace;
+        return new Chain.forTrace(stackTrace);
+      }
+    });
+
+    expect(chain.traces, hasLength(1));
+    expect(chain.traces.first.toString(),
+        equals(new Trace.from(trace).toString()));
+  });
+}
diff --git a/mojo/public/dart/third_party/stack_trace/test/frame_test.dart b/mojo/public/dart/third_party/stack_trace/test/frame_test.dart
new file mode 100644
index 0000000..63035e0
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/test/frame_test.dart
@@ -0,0 +1,573 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library frame_test;
+
+import 'package:path/path.dart' as path;
+import 'package:stack_trace/stack_trace.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group('.parseVM', () {
+    test('parses a stack frame with column correctly', () {
+      var frame = new Frame.parseVM("#1      Foo._bar "
+          "(file:///home/nweiz/code/stuff.dart:42:21)");
+      expect(frame.uri,
+          equals(Uri.parse("file:///home/nweiz/code/stuff.dart")));
+      expect(frame.line, equals(42));
+      expect(frame.column, equals(21));
+      expect(frame.member, equals('Foo._bar'));
+    });
+
+    test('parses a stack frame without column correctly', () {
+      var frame = new Frame.parseVM("#1      Foo._bar "
+          "(file:///home/nweiz/code/stuff.dart:24)");
+      expect(frame.uri,
+          equals(Uri.parse("file:///home/nweiz/code/stuff.dart")));
+      expect(frame.line, equals(24));
+      expect(frame.column, null);
+      expect(frame.member, equals('Foo._bar'));
+    });
+
+    // This can happen with async stack traces. See issue 22009.
+    test('parses a stack frame without line or column correctly', () {
+      var frame = new Frame.parseVM("#1      Foo._bar "
+          "(file:///home/nweiz/code/stuff.dart)");
+      expect(frame.uri,
+          equals(Uri.parse("file:///home/nweiz/code/stuff.dart")));
+      expect(frame.line, isNull);
+      expect(frame.column, isNull);
+      expect(frame.member, equals('Foo._bar'));
+    });
+
+    test('converts "<anonymous closure>" to "<fn>"', () {
+      String parsedMember(String member) =>
+          new Frame.parseVM('#0 $member (foo:0:0)').member;
+
+      expect(parsedMember('Foo.<anonymous closure>'), equals('Foo.<fn>'));
+      expect(parsedMember('<anonymous closure>.<anonymous closure>.bar'),
+          equals('<fn>.<fn>.bar'));
+    });
+
+    test('converts "<<anonymous closure>_async_body>" to "<async>"', () {
+      var frame = new Frame.parseVM(
+          '#0 Foo.<<anonymous closure>_async_body> (foo:0:0)');
+      expect(frame.member, equals('Foo.<async>'));
+    });
+
+    test('converts "<function_name_async_body>" to "<async>"', () {
+      var frame = new Frame.parseVM(
+          '#0 Foo.<function_name_async_body> (foo:0:0)');
+      expect(frame.member, equals('Foo.<async>'));
+    });
+
+    test('parses a folded frame correctly', () {
+      var frame = new Frame.parseVM('...');
+
+      expect(frame.member, equals('...'));
+      expect(frame.uri, equals(new Uri()));
+      expect(frame.line, isNull);
+      expect(frame.column, isNull);
+    });
+
+    test('returns an UnparsedFrame for malformed frames', () {
+      expectIsUnparsed((text) => new Frame.parseV8(text), '');
+      expectIsUnparsed((text) => new Frame.parseV8(text), '#1');
+      expectIsUnparsed((text) => new Frame.parseV8(text), '#1      Foo');
+      expectIsUnparsed((text) => new Frame.parseV8(text),
+          '#1      (dart:async/future.dart:10:15)');
+      expectIsUnparsed((text) => new Frame.parseV8(text),
+          'Foo (dart:async/future.dart:10:15)');
+    });
+  });
+
+  group('.parseV8', () {
+    test('parses a stack frame correctly', () {
+      var frame = new Frame.parseV8("    at VW.call\$0 "
+          "(http://pub.dartlang.org/stuff.dart.js:560:28)");
+      expect(frame.uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, equals(28));
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses a stack frame with an absolute POSIX path correctly', () {
+      var frame = new Frame.parseV8("    at VW.call\$0 "
+          "(/path/to/stuff.dart.js:560:28)");
+      expect(frame.uri, equals(Uri.parse("file:///path/to/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, equals(28));
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses a stack frame with an absolute Windows path correctly', () {
+      var frame = new Frame.parseV8("    at VW.call\$0 "
+          r"(C:\path\to\stuff.dart.js:560:28)");
+      expect(frame.uri, equals(Uri.parse("file:///C:/path/to/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, equals(28));
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses a stack frame with a Windows UNC path correctly', () {
+      var frame = new Frame.parseV8("    at VW.call\$0 "
+          r"(\\mount\path\to\stuff.dart.js:560:28)");
+      expect(frame.uri,
+          equals(Uri.parse("file://mount/path/to/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, equals(28));
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses a stack frame with a relative POSIX path correctly', () {
+      var frame = new Frame.parseV8("    at VW.call\$0 "
+          "(path/to/stuff.dart.js:560:28)");
+      expect(frame.uri, equals(Uri.parse("path/to/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, equals(28));
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses a stack frame with a relative Windows path correctly', () {
+      var frame = new Frame.parseV8("    at VW.call\$0 "
+          r"(path\to\stuff.dart.js:560:28)");
+      expect(frame.uri, equals(Uri.parse("path/to/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, equals(28));
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses an anonymous stack frame correctly', () {
+      var frame = new Frame.parseV8(
+          "    at http://pub.dartlang.org/stuff.dart.js:560:28");
+      expect(frame.uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, equals(28));
+      expect(frame.member, equals('<fn>'));
+    });
+
+    test('parses a native stack frame correctly', () {
+      var frame = new Frame.parseV8(
+          "    at Object.stringify (native)");
+      expect(frame.uri, Uri.parse('native'));
+      expect(frame.line, isNull);
+      expect(frame.column, isNull);
+      expect(frame.member, equals('Object.stringify'));
+    });
+
+    test('parses a stack frame with [as ...] correctly', () {
+      // Ignore "[as ...]", since other stack trace formats don't support a
+      // similar construct.
+      var frame = new Frame.parseV8("    at VW.call\$0 [as call\$4] "
+          "(http://pub.dartlang.org/stuff.dart.js:560:28)");
+      expect(frame.uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, equals(28));
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses a basic eval stack frame correctly', () {
+      var frame = new Frame.parseV8("    at eval (eval at <anonymous> "
+          "(http://pub.dartlang.org/stuff.dart.js:560:28))");
+      expect(frame.uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, equals(28));
+      expect(frame.member, equals('eval'));
+    });
+
+    test('parses an IE10 eval stack frame correctly', () {
+      var frame = new Frame.parseV8("    at eval (eval at Anonymous function "
+          "(http://pub.dartlang.org/stuff.dart.js:560:28))");
+      expect(frame.uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, equals(28));
+      expect(frame.member, equals('eval'));
+    });
+
+    test('parses an eval stack frame with inner position info correctly', () {
+      var frame = new Frame.parseV8("    at eval (eval at <anonymous> "
+          "(http://pub.dartlang.org/stuff.dart.js:560:28), <anonymous>:3:28)");
+      expect(frame.uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, equals(28));
+      expect(frame.member, equals('eval'));
+    });
+
+    test('parses a nested eval stack frame correctly', () {
+      var frame = new Frame.parseV8("    at eval (eval at <anonymous> "
+          "(eval at sub (http://pub.dartlang.org/stuff.dart.js:560:28)))");
+      expect(frame.uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, equals(28));
+      expect(frame.member, equals('eval'));
+    });
+
+    test('converts "<anonymous>" to "<fn>"', () {
+      String parsedMember(String member) =>
+          new Frame.parseV8('    at $member (foo:0:0)').member;
+
+      expect(parsedMember('Foo.<anonymous>'), equals('Foo.<fn>'));
+      expect(parsedMember('<anonymous>.<anonymous>.bar'),
+          equals('<fn>.<fn>.bar'));
+    });
+
+    test('returns an UnparsedFrame for malformed frames', () {
+      expectIsUnparsed((text) => new Frame.parseV8(text), '');
+      expectIsUnparsed((text) => new Frame.parseV8(text), '    at');
+      expectIsUnparsed((text) => new Frame.parseV8(text), '    at Foo');
+      expectIsUnparsed((text) => new Frame.parseV8(text),
+          '    at Foo (dart:async/future.dart)');
+      expectIsUnparsed((text) => new Frame.parseV8(text),
+          '    at (dart:async/future.dart:10:15)');
+      expectIsUnparsed((text) => new Frame.parseV8(text),
+          'Foo (dart:async/future.dart:10:15)');
+      expectIsUnparsed((text) => new Frame.parseV8(text),
+          '    at dart:async/future.dart');
+      expectIsUnparsed((text) => new Frame.parseV8(text),
+          '    at dart:async/future.dart:10');
+      expectIsUnparsed((text) => new Frame.parseV8(text),
+          'dart:async/future.dart:10:15');
+    });
+  });
+
+  group('.parseFirefox/.parseSafari', () {
+    test('parses a simple stack frame correctly', () {
+      var frame = new Frame.parseFirefox(
+          ".VW.call\$0@http://pub.dartlang.org/stuff.dart.js:560");
+      expect(frame.uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, isNull);
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses a stack frame with an absolute POSIX path correctly', () {
+      var frame = new Frame.parseFirefox(
+          ".VW.call\$0@/path/to/stuff.dart.js:560");
+      expect(frame.uri, equals(Uri.parse("file:///path/to/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, isNull);
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses a stack frame with an absolute Windows path correctly', () {
+      var frame = new Frame.parseFirefox(
+          r".VW.call$0@C:\path\to\stuff.dart.js:560");
+      expect(frame.uri, equals(Uri.parse("file:///C:/path/to/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, isNull);
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses a stack frame with a Windows UNC path correctly', () {
+      var frame = new Frame.parseFirefox(
+          r".VW.call$0@\\mount\path\to\stuff.dart.js:560");
+      expect(frame.uri,
+          equals(Uri.parse("file://mount/path/to/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, isNull);
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses a stack frame with a relative POSIX path correctly', () {
+      var frame = new Frame.parseFirefox(
+          ".VW.call\$0@path/to/stuff.dart.js:560");
+      expect(frame.uri, equals(Uri.parse("path/to/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, isNull);
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses a stack frame with a relative Windows path correctly', () {
+      var frame = new Frame.parseFirefox(
+          r".VW.call$0@path\to\stuff.dart.js:560");
+      expect(frame.uri, equals(Uri.parse("path/to/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, isNull);
+      expect(frame.member, equals('VW.call\$0'));
+    });
+
+    test('parses a simple anonymous stack frame correctly', () {
+      var frame = new Frame.parseFirefox(
+          "@http://pub.dartlang.org/stuff.dart.js:560");
+      expect(frame.uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, isNull);
+      expect(frame.member, equals("<fn>"));
+    });
+
+    test('parses a nested anonymous stack frame correctly', () {
+      var frame = new Frame.parseFirefox(
+          ".foo/<@http://pub.dartlang.org/stuff.dart.js:560");
+      expect(frame.uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, isNull);
+      expect(frame.member, equals("foo.<fn>"));
+
+      frame = new Frame.parseFirefox(
+          ".foo/@http://pub.dartlang.org/stuff.dart.js:560");
+      expect(frame.uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, isNull);
+      expect(frame.member, equals("foo.<fn>"));
+    });
+
+    test('parses a named nested anonymous stack frame correctly', () {
+      var frame = new Frame.parseFirefox(
+          ".foo/.name<@http://pub.dartlang.org/stuff.dart.js:560");
+      expect(frame.uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, isNull);
+      expect(frame.member, equals("foo.<fn>"));
+
+      frame = new Frame.parseFirefox(
+          ".foo/.name@http://pub.dartlang.org/stuff.dart.js:560");
+      expect(frame.uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, isNull);
+      expect(frame.member, equals("foo.<fn>"));
+    });
+
+    test('parses a stack frame with parameters correctly', () {
+      var frame = new Frame.parseFirefox(
+          '.foo(12, "@)()/<")@http://pub.dartlang.org/stuff.dart.js:560');
+      expect(frame.uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, isNull);
+      expect(frame.member, equals("foo"));
+    });
+
+    test('parses a nested anonymous stack frame with parameters correctly', () {
+      var frame = new Frame.parseFirefox(
+          '.foo(12, "@)()/<")/.fn<@'
+          'http://pub.dartlang.org/stuff.dart.js:560');
+      expect(frame.uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, isNull);
+      expect(frame.member, equals("foo.<fn>"));
+    });
+
+    test('parses a deeply-nested anonymous stack frame with parameters '
+        'correctly', () {
+      var frame = new Frame.parseFirefox(
+          '.convertDartClosureToJS/\$function</<@'
+          'http://pub.dartlang.org/stuff.dart.js:560');
+      expect(frame.uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.dart.js")));
+      expect(frame.line, equals(560));
+      expect(frame.column, isNull);
+      expect(frame.member, equals("convertDartClosureToJS.<fn>.<fn>"));
+    });
+
+    test('returns an UnparsedFrame for malformed frames', () {
+      expectIsUnparsed((text) => new Frame.parseFirefox(text), '');
+      expectIsUnparsed((text) => new Frame.parseFirefox(text), '.foo');
+      expectIsUnparsed((text) => new Frame.parseFirefox(text),
+          '.foo@dart:async/future.dart');
+      expectIsUnparsed((text) => new Frame.parseFirefox(text),
+          '.foo(@dart:async/future.dart:10');
+      expectIsUnparsed((text) => new Frame.parseFirefox(text),
+          '@dart:async/future.dart');
+    });
+
+    test('parses a simple stack frame correctly', () {
+      var frame = new Frame.parseFirefox(
+          "foo\$bar@http://dartlang.org/foo/bar.dart:10:11");
+      expect(frame.uri, equals(Uri.parse("http://dartlang.org/foo/bar.dart")));
+      expect(frame.line, equals(10));
+      expect(frame.column, equals(11));
+      expect(frame.member, equals('foo\$bar'));
+    });
+
+    test('parses an anonymous stack frame correctly', () {
+      var frame = new Frame.parseFirefox(
+          "http://dartlang.org/foo/bar.dart:10:11");
+      expect(frame.uri, equals(Uri.parse("http://dartlang.org/foo/bar.dart")));
+      expect(frame.line, equals(10));
+      expect(frame.column, equals(11));
+      expect(frame.member, equals('<fn>'));
+    });
+
+    test('parses a stack frame with no line correctly', () {
+      var frame = new Frame.parseFirefox(
+          "foo\$bar@http://dartlang.org/foo/bar.dart::11");
+      expect(frame.uri, equals(Uri.parse("http://dartlang.org/foo/bar.dart")));
+      expect(frame.line, isNull);
+      expect(frame.column, equals(11));
+      expect(frame.member, equals('foo\$bar'));
+    });
+
+    test('parses a stack frame with no column correctly', () {
+      var frame = new Frame.parseFirefox(
+          "foo\$bar@http://dartlang.org/foo/bar.dart:10:");
+      expect(frame.uri, equals(Uri.parse("http://dartlang.org/foo/bar.dart")));
+      expect(frame.line, equals(10));
+      expect(frame.column, isNull);
+      expect(frame.member, equals('foo\$bar'));
+    });
+
+    test('parses a stack frame with no line or column correctly', () {
+      var frame = new Frame.parseFirefox(
+          "foo\$bar@http://dartlang.org/foo/bar.dart:10:11");
+      expect(frame.uri, equals(Uri.parse("http://dartlang.org/foo/bar.dart")));
+      expect(frame.line, equals(10));
+      expect(frame.column, equals(11));
+      expect(frame.member, equals('foo\$bar'));
+    });
+  });
+
+  group('.parseFriendly', () {
+    test('parses a simple stack frame correctly', () {
+      var frame = new Frame.parseFriendly(
+          "http://dartlang.org/foo/bar.dart 10:11  Foo.<fn>.bar");
+      expect(frame.uri, equals(Uri.parse("http://dartlang.org/foo/bar.dart")));
+      expect(frame.line, equals(10));
+      expect(frame.column, equals(11));
+      expect(frame.member, equals('Foo.<fn>.bar'));
+    });
+
+    test('parses a stack frame with no line or column correctly', () {
+      var frame = new Frame.parseFriendly(
+          "http://dartlang.org/foo/bar.dart  Foo.<fn>.bar");
+      expect(frame.uri, equals(Uri.parse("http://dartlang.org/foo/bar.dart")));
+      expect(frame.line, isNull);
+      expect(frame.column, isNull);
+      expect(frame.member, equals('Foo.<fn>.bar'));
+    });
+
+    test('parses a stack frame with no line correctly', () {
+      var frame = new Frame.parseFriendly(
+          "http://dartlang.org/foo/bar.dart 10  Foo.<fn>.bar");
+      expect(frame.uri, equals(Uri.parse("http://dartlang.org/foo/bar.dart")));
+      expect(frame.line, equals(10));
+      expect(frame.column, isNull);
+      expect(frame.member, equals('Foo.<fn>.bar'));
+    });
+
+    test('parses a stack frame with a relative path correctly', () {
+      var frame = new Frame.parseFriendly("foo/bar.dart 10:11    Foo.<fn>.bar");
+      expect(frame.uri, equals(
+          path.toUri(path.absolute(path.join('foo', 'bar.dart')))));
+      expect(frame.line, equals(10));
+      expect(frame.column, equals(11));
+      expect(frame.member, equals('Foo.<fn>.bar'));
+    });
+
+    test('returns an UnparsedFrame for malformed frames', () {
+      expectIsUnparsed((text) => new Frame.parseFriendly(text), '');
+      expectIsUnparsed((text) => new Frame.parseFriendly(text), 'foo/bar.dart');
+      expectIsUnparsed((text) => new Frame.parseFriendly(text),
+          'foo/bar.dart 10:11');
+    });
+  });
+
+  test('only considers dart URIs to be core', () {
+    bool isCore(String library) =>
+      new Frame.parseVM('#0 Foo ($library:0:0)').isCore;
+
+    expect(isCore('dart:core'), isTrue);
+    expect(isCore('dart:async'), isTrue);
+    expect(isCore('dart:core/uri.dart'), isTrue);
+    expect(isCore('dart:async/future.dart'), isTrue);
+    expect(isCore('bart:core'), isFalse);
+    expect(isCore('sdart:core'), isFalse);
+    expect(isCore('darty:core'), isFalse);
+    expect(isCore('bart:core/uri.dart'), isFalse);
+  });
+
+  group('.library', () {
+    test('returns the URI string for non-file URIs', () {
+      expect(new Frame.parseVM('#0 Foo (dart:async/future.dart:0:0)').library,
+          equals('dart:async/future.dart'));
+      expect(new Frame.parseVM('#0 Foo '
+              '(http://dartlang.org/stuff/thing.dart:0:0)').library,
+          equals('http://dartlang.org/stuff/thing.dart'));
+    });
+
+    test('returns the relative path for file URIs', () {
+      expect(new Frame.parseVM('#0 Foo (foo/bar.dart:0:0)').library,
+          equals(path.join('foo', 'bar.dart')));
+    });
+
+    test('truncates data: URIs', () {
+      var frame = new Frame.parseVM(
+          '#0 Foo (data:application/dart;charset=utf-8,blah:0:0)');
+      expect(frame.library, equals('data:...'));
+    });
+  });
+
+  group('.location', () {
+    test('returns the library and line/column numbers for non-core '
+        'libraries', () {
+      expect(new Frame.parseVM('#0 Foo '
+              '(http://dartlang.org/thing.dart:5:10)').location,
+          equals('http://dartlang.org/thing.dart 5:10'));
+      expect(new Frame.parseVM('#0 Foo (foo/bar.dart:1:2)').location,
+          equals('${path.join('foo', 'bar.dart')} 1:2'));
+    });
+  });
+
+  group('.package', () {
+    test('returns null for non-package URIs', () {
+      expect(new Frame.parseVM('#0 Foo (dart:async/future.dart:0:0)').package,
+          isNull);
+      expect(new Frame.parseVM('#0 Foo '
+              '(http://dartlang.org/stuff/thing.dart:0:0)').package,
+          isNull);
+    });
+
+    test('returns the package name for package: URIs', () {
+      expect(new Frame.parseVM('#0 Foo (package:foo/foo.dart:0:0)').package,
+          equals('foo'));
+      expect(new Frame.parseVM('#0 Foo (package:foo/zap/bar.dart:0:0)').package,
+          equals('foo'));
+    });
+  });
+
+  group('.toString()', () {
+    test('returns the library and line/column numbers for non-core '
+        'libraries', () {
+      expect(new Frame.parseVM('#0 Foo (http://dartlang.org/thing.dart:5:10)')
+              .toString(),
+          equals('http://dartlang.org/thing.dart 5:10 in Foo'));
+    });
+
+    test('converts "<anonymous closure>" to "<fn>"', () {
+      expect(new Frame.parseVM('#0 Foo.<anonymous closure> '
+              '(dart:core/uri.dart:5:10)').toString(),
+          equals('dart:core/uri.dart 5:10 in Foo.<fn>'));
+    });
+
+    test('prints a frame without a column correctly', () {
+      expect(new Frame.parseVM('#0 Foo (dart:core/uri.dart:5)').toString(),
+          equals('dart:core/uri.dart 5 in Foo'));
+    });
+
+    test('prints relative paths as relative', () {
+      var relative = path.normalize('relative/path/to/foo.dart');
+      expect(new Frame.parseFriendly('$relative 5:10  Foo').toString(),
+          equals('$relative 5:10 in Foo'));
+    });
+  });
+}
+
+void expectIsUnparsed(Frame constructor(String text), String text) {
+  var frame = constructor(text);
+  expect(frame, new isInstanceOf<UnparsedFrame>());
+  expect(frame.toString(), equals(text));
+}
diff --git a/mojo/public/dart/third_party/stack_trace/test/trace_test.dart b/mojo/public/dart/third_party/stack_trace/test/trace_test.dart
new file mode 100644
index 0000000..d12bc71
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/test/trace_test.dart
@@ -0,0 +1,430 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library trace_test;
+
+import 'package:path/path.dart' as path;
+import 'package:stack_trace/stack_trace.dart';
+import 'package:test/test.dart';
+
+String getStackTraceString() {
+  try {
+    throw '';
+  } catch (_, stackTrace) {
+    return stackTrace.toString();
+  }
+}
+
+StackTrace getStackTraceObject() {
+  try {
+    throw '';
+  } catch (_, stackTrace) {
+    return stackTrace;
+  }
+}
+
+Trace getCurrentTrace([int level]) => new Trace.current(level);
+
+Trace nestedGetCurrentTrace(int level) => getCurrentTrace(level);
+
+void main() {
+  // This just shouldn't crash.
+  test('a native stack trace is parseable', () => new Trace.current());
+
+  group('.parse', () {
+    test('.parse parses a VM stack trace correctly', () {
+      var trace = new Trace.parse(
+          '#0      Foo._bar (file:///home/nweiz/code/stuff.dart:42:21)\n'
+          '#1      zip.<anonymous closure>.zap (dart:async/future.dart:0:2)\n'
+          '#2      zip.<anonymous closure>.zap (http://pub.dartlang.org/thing.'
+              'dart:1:100)');
+
+      expect(trace.frames[0].uri,
+          equals(Uri.parse("file:///home/nweiz/code/stuff.dart")));
+      expect(trace.frames[1].uri, equals(Uri.parse("dart:async/future.dart")));
+      expect(trace.frames[2].uri,
+          equals(Uri.parse("http://pub.dartlang.org/thing.dart")));
+    });
+
+    test('parses a V8 stack trace correctly', () {
+      var trace = new Trace.parse(
+          'Error\n'
+          '    at Foo._bar (http://pub.dartlang.org/stuff.js:42:21)\n'
+          '    at http://pub.dartlang.org/stuff.js:0:2\n'
+          '    at zip.<anonymous>.zap '
+              '(http://pub.dartlang.org/thing.js:1:100)');
+
+      expect(trace.frames[0].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[1].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[2].uri,
+          equals(Uri.parse("http://pub.dartlang.org/thing.js")));
+
+      trace = new Trace.parse(
+          "Exception: foo\n"
+          '    at Foo._bar (http://pub.dartlang.org/stuff.js:42:21)\n'
+          '    at http://pub.dartlang.org/stuff.js:0:2\n'
+          '    at zip.<anonymous>.zap '
+              '(http://pub.dartlang.org/thing.js:1:100)');
+
+      expect(trace.frames[0].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[1].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[2].uri,
+          equals(Uri.parse("http://pub.dartlang.org/thing.js")));
+
+      trace = new Trace.parse(
+          'Exception: foo\n'
+          '    bar\n'
+          '    at Foo._bar (http://pub.dartlang.org/stuff.js:42:21)\n'
+          '    at http://pub.dartlang.org/stuff.js:0:2\n'
+          '    at zip.<anonymous>.zap '
+              '(http://pub.dartlang.org/thing.js:1:100)');
+
+      expect(trace.frames[0].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[1].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[2].uri,
+          equals(Uri.parse("http://pub.dartlang.org/thing.js")));
+    });
+
+    // JavaScriptCore traces are just like V8, except that it doesn't have a
+    // header and it starts with a tab rather than spaces.
+    test('parses a JavaScriptCore stack trace correctly', () {
+      var trace = new Trace.parse(
+          '\tat Foo._bar (http://pub.dartlang.org/stuff.js:42:21)\n'
+          '\tat http://pub.dartlang.org/stuff.js:0:2\n'
+          '\tat zip.<anonymous>.zap '
+              '(http://pub.dartlang.org/thing.js:1:100)');
+
+      expect(trace.frames[0].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[1].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[2].uri,
+          equals(Uri.parse("http://pub.dartlang.org/thing.js")));
+
+      trace = new Trace.parse(
+          '\tat Foo._bar (http://pub.dartlang.org/stuff.js:42:21)\n'
+          '\tat \n'
+          '\tat zip.<anonymous>.zap '
+              '(http://pub.dartlang.org/thing.js:1:100)');
+
+      expect(trace.frames[0].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[1].uri,
+          equals(Uri.parse("http://pub.dartlang.org/thing.js")));
+    });
+
+    test('parses a Firefox/Safari stack trace correctly', () {
+      var trace = new Trace.parse(
+          'Foo._bar@http://pub.dartlang.org/stuff.js:42\n'
+          'zip/<@http://pub.dartlang.org/stuff.js:0\n'
+          'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1');
+
+      expect(trace.frames[0].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[1].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[2].uri,
+          equals(Uri.parse("http://pub.dartlang.org/thing.js")));
+
+      trace = new Trace.parse(
+          'zip/<@http://pub.dartlang.org/stuff.js:0\n'
+          'Foo._bar@http://pub.dartlang.org/stuff.js:42\n'
+          'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1');
+
+      expect(trace.frames[0].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[1].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[2].uri,
+          equals(Uri.parse("http://pub.dartlang.org/thing.js")));
+
+      trace = new Trace.parse(
+          'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1\n'
+          'zip/<@http://pub.dartlang.org/stuff.js:0\n'
+          'Foo._bar@http://pub.dartlang.org/stuff.js:42');
+
+      expect(trace.frames[0].uri,
+          equals(Uri.parse("http://pub.dartlang.org/thing.js")));
+      expect(trace.frames[1].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[2].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+    });
+
+    test('parses a Firefox/Safari stack trace containing native code correctly',
+        () {
+      var trace = new Trace.parse(
+          'Foo._bar@http://pub.dartlang.org/stuff.js:42\n'
+          'zip/<@http://pub.dartlang.org/stuff.js:0\n'
+          'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1\n'
+          '[native code]');
+
+      expect(trace.frames[0].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[1].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[2].uri,
+          equals(Uri.parse("http://pub.dartlang.org/thing.js")));
+      expect(trace.frames.length, equals(3));
+    });
+
+    test('parses a Firefox/Safari stack trace without a method name correctly',
+        () {
+      var trace = new Trace.parse(
+          'http://pub.dartlang.org/stuff.js:42\n'
+          'zip/<@http://pub.dartlang.org/stuff.js:0\n'
+          'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1');
+
+      expect(trace.frames[0].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[0].member, equals('<fn>'));
+      expect(trace.frames[1].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[2].uri,
+          equals(Uri.parse("http://pub.dartlang.org/thing.js")));
+    });
+
+    test('parses a Firefox/Safari stack trace with an empty line correctly',
+        () {
+      var trace = new Trace.parse(
+          'Foo._bar@http://pub.dartlang.org/stuff.js:42\n'
+          '\n'
+          'zip/<@http://pub.dartlang.org/stuff.js:0\n'
+          'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1');
+
+      expect(trace.frames[0].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[1].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[2].uri,
+          equals(Uri.parse("http://pub.dartlang.org/thing.js")));
+    });
+
+    test('parses a Firefox/Safari stack trace with a column number correctly',
+        () {
+      var trace = new Trace.parse(
+          'Foo._bar@http://pub.dartlang.org/stuff.js:42:2\n'
+          'zip/<@http://pub.dartlang.org/stuff.js:0\n'
+          'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1');
+
+      expect(trace.frames[0].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[0].line, equals(42));
+      expect(trace.frames[0].column, equals(2));
+      expect(trace.frames[1].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[2].uri,
+          equals(Uri.parse("http://pub.dartlang.org/thing.js")));
+    });
+
+    test('parses a package:stack_trace stack trace correctly', () {
+      var trace = new Trace.parse(
+          'http://dartlang.org/foo/bar.dart 10:11  Foo.<fn>.bar\n'
+          'http://dartlang.org/foo/baz.dart        Foo.<fn>.bar');
+
+      expect(trace.frames[0].uri,
+          equals(Uri.parse("http://dartlang.org/foo/bar.dart")));
+      expect(trace.frames[1].uri,
+          equals(Uri.parse("http://dartlang.org/foo/baz.dart")));
+    });
+
+    test('parses a package:stack_trace stack chain correctly', () {
+      var trace = new Trace.parse(
+          'http://dartlang.org/foo/bar.dart 10:11  Foo.<fn>.bar\n'
+          'http://dartlang.org/foo/baz.dart        Foo.<fn>.bar\n'
+          '===== asynchronous gap ===========================\n'
+          'http://dartlang.org/foo/bang.dart 10:11  Foo.<fn>.bar\n'
+          'http://dartlang.org/foo/quux.dart        Foo.<fn>.bar');
+
+      expect(trace.frames[0].uri,
+          equals(Uri.parse("http://dartlang.org/foo/bar.dart")));
+      expect(trace.frames[1].uri,
+          equals(Uri.parse("http://dartlang.org/foo/baz.dart")));
+      expect(trace.frames[2].uri,
+          equals(Uri.parse("http://dartlang.org/foo/bang.dart")));
+      expect(trace.frames[3].uri,
+          equals(Uri.parse("http://dartlang.org/foo/quux.dart")));
+    });
+
+    test('parses a real package:stack_trace stack trace correctly', () {
+      var traceString = new Trace.current().toString();
+      expect(new Trace.parse(traceString).toString(), equals(traceString));
+    });
+
+    test('parses an empty string correctly', () {
+      var trace = new Trace.parse('');
+      expect(trace.frames, isEmpty);
+      expect(trace.toString(), equals(''));
+    });
+  });
+
+  test('.toString() nicely formats the stack trace', () {
+    var trace = new Trace.parse('''
+#0      Foo._bar (foo/bar.dart:42:21)
+#1      zip.<anonymous closure>.zap (dart:async/future.dart:0:2)
+#2      zip.<anonymous closure>.zap (http://pub.dartlang.org/thing.dart:1:100)
+''');
+
+    expect(trace.toString(), equals('''
+${path.join('foo', 'bar.dart')} 42:21                        Foo._bar
+dart:async/future.dart 0:2                zip.<fn>.zap
+http://pub.dartlang.org/thing.dart 1:100  zip.<fn>.zap
+'''));
+  });
+
+  test('.vmTrace returns a native-style trace', () {
+    var uri = path.toUri(path.absolute('foo'));
+    var trace = new Trace([
+      new Frame(uri, 10, 20, 'Foo.<fn>'),
+      new Frame(Uri.parse('http://dartlang.org/foo.dart'), null, null, 'bar'),
+      new Frame(Uri.parse('dart:async'), 15, null, 'baz'),
+    ]);
+
+    expect(trace.vmTrace.toString(), equals(
+        '#1      Foo.<anonymous closure> ($uri:10:20)\n'
+        '#2      bar (http://dartlang.org/foo.dart:0:0)\n'
+        '#3      baz (dart:async:15:0)\n'));
+  });
+
+  group("folding", () {
+    test('.terse folds core frames together bottom-up', () {
+      var trace = new Trace.parse('''
+#1 top (dart:async/future.dart:0:2)
+#2 bottom (dart:core/uri.dart:1:100)
+#0 notCore (foo.dart:42:21)
+#3 top (dart:io:5:10)
+#4 bottom (dart:async-patch/future.dart:9:11)
+#5 alsoNotCore (bar.dart:10:20)
+''');
+
+      expect(trace.terse.toString(), equals('''
+dart:core       bottom
+foo.dart 42:21  notCore
+dart:async      bottom
+bar.dart 10:20  alsoNotCore
+'''));
+    });
+
+    test('.terse folds empty async frames', () {
+      var trace = new Trace.parse('''
+#0 top (dart:async/future.dart:0:2)
+#1 empty.<<anonymous closure>_async_body> (bar.dart)
+#2 bottom (dart:async-patch/future.dart:9:11)
+#3 notCore (foo.dart:42:21)
+''');
+
+      expect(trace.terse.toString(), equals('''
+dart:async      bottom
+foo.dart 42:21  notCore
+'''));
+    });
+
+    test('.terse removes the bottom-most async frame', () {
+      var trace = new Trace.parse('''
+#0 notCore (foo.dart:42:21)
+#1 top (dart:async/future.dart:0:2)
+#2 bottom (dart:core/uri.dart:1:100)
+#3 top (dart:io:5:10)
+#4 bottom (dart:async-patch/future.dart:9:11)
+''');
+
+      expect(trace.terse.toString(), equals('''
+foo.dart 42:21  notCore
+'''));
+    });
+
+    test(".terse won't make a trace empty", () {
+      var trace = new Trace.parse('''
+#1 top (dart:async/future.dart:0:2)
+#2 bottom (dart:core/uri.dart:1:100)
+''');
+
+      expect(trace.terse.toString(), equals('''
+dart:core  bottom
+'''));
+    });
+
+    test(".terse won't panic on an empty trace", () {
+      expect(new Trace.parse("").terse.toString(), equals(""));
+    });
+
+    test('.foldFrames folds frames together bottom-up', () {
+      var trace = new Trace.parse('''
+#0 notFoo (foo.dart:42:21)
+#1 fooTop (bar.dart:0:2)
+#2 fooBottom (foo.dart:1:100)
+#3 alsoNotFoo (bar.dart:10:20)
+#4 fooTop (dart:io/socket.dart:5:10)
+#5 fooBottom (dart:async-patch/future.dart:9:11)
+''');
+
+      var folded = trace.foldFrames((frame) => frame.member.startsWith('foo'));
+      expect(folded.toString(), equals('''
+foo.dart 42:21                     notFoo
+foo.dart 1:100                     fooBottom
+bar.dart 10:20                     alsoNotFoo
+dart:async-patch/future.dart 9:11  fooBottom
+'''));
+    });
+
+    test('.foldFrames with terse: true folds core frames as well', () {
+      var trace = new Trace.parse('''
+#0 notFoo (foo.dart:42:21)
+#1 fooTop (bar.dart:0:2)
+#2 coreBottom (dart:async/future.dart:0:2)
+#3 alsoNotFoo (bar.dart:10:20)
+#4 fooTop (foo.dart:9:11)
+#5 coreBottom (dart:async-patch/future.dart:9:11)
+''');
+
+      var folded = trace.foldFrames((frame) => frame.member.startsWith('foo'),
+          terse: true);
+      expect(folded.toString(), equals('''
+foo.dart 42:21  notFoo
+dart:async      coreBottom
+bar.dart 10:20  alsoNotFoo
+'''));
+    });
+
+    test('.foldFrames with terse: true shortens folded frames', () {
+      var trace = new Trace.parse('''
+#0 notFoo (foo.dart:42:21)
+#1 fooTop (bar.dart:0:2)
+#2 fooBottom (package:foo/bar.dart:0:2)
+#3 alsoNotFoo (bar.dart:10:20)
+#4 fooTop (foo.dart:9:11)
+#5 fooBottom (foo/bar.dart:9:11)
+''');
+
+      var folded = trace.foldFrames((frame) => frame.member.startsWith('foo'),
+          terse: true);
+      expect(folded.toString(), equals('''
+foo.dart 42:21  notFoo
+package:foo     fooBottom
+bar.dart 10:20  alsoNotFoo
+foo             fooBottom
+'''));
+    });
+
+    test('.foldFrames will never fold unparsed frames', () {
+      var trace = new Trace.parse(r'''
+.g"cs$#:b";a#>sw{*{ul$"$xqwr`p
+%+j-?uppx<([j@#nu{{>*+$%x-={`{
+!e($b{nj)zs?cgr%!;bmw.+$j+pfj~
+''');
+
+      expect(trace.foldFrames((frame) => true).toString(), equals(r'''
+.g"cs$#:b";a#>sw{*{ul$"$xqwr`p
+%+j-?uppx<([j@#nu{{>*+$%x-={`{
+!e($b{nj)zs?cgr%!;bmw.+$j+pfj~
+'''));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/stack_trace/test/utils.dart b/mojo/public/dart/third_party/stack_trace/test/utils.dart
new file mode 100644
index 0000000..912f8f4
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/test/utils.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library stack_trace.test.utils;
+
+import 'package:test/test.dart';
+
+/// Returns a matcher that runs [matcher] against a [Frame]'s `member` field.
+Matcher frameMember(matcher) =>
+  transform((frame) => frame.member, matcher, 'member');
+
+/// Returns a matcher that runs [matcher] against a [Frame]'s `library` field.
+Matcher frameLibrary(matcher) =>
+  transform((frame) => frame.library, matcher, 'library');
+
+/// Returns a matcher that runs [transformation] on its input, then matches
+/// the output against [matcher].
+///
+/// [description] should be a noun phrase that describes the relation of the
+/// output of [transformation] to its input.
+Matcher transform(transformation(value), matcher, String description) =>
+  new _TransformMatcher(transformation, wrapMatcher(matcher), description);
+
+class _TransformMatcher extends Matcher {
+  final Function _transformation;
+  final Matcher _matcher;
+  final String _description;
+
+  _TransformMatcher(this._transformation, this._matcher, this._description);
+
+  bool matches(item, Map matchState) =>
+    _matcher.matches(_transformation(item), matchState);
+
+  Description describe(Description description) =>
+    description.add(_description).add(' ').addDescriptionOf(_matcher);
+}
diff --git a/mojo/public/dart/third_party/stack_trace/test/vm_test.dart b/mojo/public/dart/third_party/stack_trace/test/vm_test.dart
new file mode 100644
index 0000000..947f14b
--- /dev/null
+++ b/mojo/public/dart/third_party/stack_trace/test/vm_test.dart
@@ -0,0 +1,121 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// This file tests stack_trace's ability to parse live stack traces. It's a
+/// dual of dartium_test.dart, since method names can differ somewhat from
+/// platform to platform. No similar file exists for dart2js since the specific
+/// method names there are implementation details.
+@TestOn('vm')
+
+import 'package:path/path.dart' as path;
+import 'package:stack_trace/stack_trace.dart';
+import 'package:test/test.dart';
+
+String getStackTraceString() {
+  try {
+    throw '';
+  } catch (_, stackTrace) {
+    return stackTrace.toString();
+  }
+}
+
+StackTrace getStackTraceObject() {
+  try {
+    throw '';
+  } catch (_, stackTrace) {
+    return stackTrace;
+  }
+}
+
+Frame getCaller([int level]) {
+  if (level == null) return new Frame.caller();
+  return new Frame.caller(level);
+}
+
+Frame nestedGetCaller(int level) => getCaller(level);
+
+Trace getCurrentTrace([int level]) => new Trace.current(level);
+
+Trace nestedGetCurrentTrace(int level) => getCurrentTrace(level);
+
+void main() {
+  group('Trace', () {
+    test('.parse parses a real stack trace correctly', () {
+      var string = getStackTraceString();
+      var trace = new Trace.parse(string);
+      expect(path.url.basename(trace.frames.first.uri.path),
+          equals('vm_test.dart'));
+      expect(trace.frames.first.member, equals('getStackTraceString'));
+    });
+
+    test('converts from a native stack trace correctly', () {
+      var trace = new Trace.from(getStackTraceObject());
+      expect(path.url.basename(trace.frames.first.uri.path),
+          equals('vm_test.dart'));
+      expect(trace.frames.first.member, equals('getStackTraceObject'));
+    });
+
+    test('.from handles a stack overflow trace correctly', () {
+      overflow() => overflow();
+
+      var trace;
+      try {
+        overflow();
+      } catch (_, stackTrace) {
+        trace = new Trace.from(stackTrace);
+      }
+
+      expect(trace.frames.first.member, equals('main.<fn>.<fn>.overflow'));
+    });
+
+    group('.current()', () {
+      test('with no argument returns a trace starting at the current frame',
+          () {
+        var trace = new Trace.current();
+        expect(trace.frames.first.member, equals('main.<fn>.<fn>.<fn>'));
+      });
+
+      test('at level 0 returns a trace starting at the current frame', () {
+        var trace = new Trace.current(0);
+        expect(trace.frames.first.member, equals('main.<fn>.<fn>.<fn>'));
+      });
+
+      test('at level 1 returns a trace starting at the parent frame', () {
+        var trace = getCurrentTrace(1);
+        expect(trace.frames.first.member, equals('main.<fn>.<fn>.<fn>'));
+      });
+
+      test('at level 2 returns a trace starting at the grandparent frame', () {
+        var trace = nestedGetCurrentTrace(2);
+        expect(trace.frames.first.member, equals('main.<fn>.<fn>.<fn>'));
+      });
+
+      test('throws an ArgumentError for negative levels', () {
+        expect(() => new Trace.current(-1), throwsArgumentError);
+      });
+    });
+  });
+
+  group('Frame.caller()', () {
+    test('with no argument returns the parent frame', () {
+      expect(getCaller().member, equals('main.<fn>.<fn>'));
+    });
+
+    test('at level 0 returns the current frame', () {
+      expect(getCaller(0).member, equals('getCaller'));
+    });
+
+    test('at level 1 returns the current frame', () {
+      expect(getCaller(1).member, equals('main.<fn>.<fn>'));
+    });
+
+    test('at level 2 returns the grandparent frame', () {
+      expect(nestedGetCaller(2).member, equals('main.<fn>.<fn>'));
+    });
+
+    test('throws an ArgumentError for negative levels', () {
+      expect(() => new Frame.caller(-1), throwsArgumentError);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/string_scanner/.gitignore b/mojo/public/dart/third_party/string_scanner/.gitignore
new file mode 100644
index 0000000..7dbf035
--- /dev/null
+++ b/mojo/public/dart/third_party/string_scanner/.gitignore
@@ -0,0 +1,15 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.pub/
+build/
+packages
+.packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/string_scanner/.test_config b/mojo/public/dart/third_party/string_scanner/.test_config
new file mode 100644
index 0000000..412fc5c
--- /dev/null
+++ b/mojo/public/dart/third_party/string_scanner/.test_config
@@ -0,0 +1,3 @@
+{
+  "test_package": true
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/string_scanner/CHANGELOG.md b/mojo/public/dart/third_party/string_scanner/CHANGELOG.md
new file mode 100644
index 0000000..23f911c
--- /dev/null
+++ b/mojo/public/dart/third_party/string_scanner/CHANGELOG.md
@@ -0,0 +1,70 @@
+## 0.1.4
+
+* Add `new SpanScanner.eager()` for creating a `SpanScanner` that eagerly
+  computes its current line and column numbers.
+
+## 0.1.3+2
+
+* Fix `LineScanner`'s handling of carriage returns to match that of
+  `SpanScanner`.
+
+## 0.1.3+1
+
+* Fixed the homepage URL.
+
+## 0.1.3
+
+* Add an optional `endState` argument to `SpanScanner.spanFrom`.
+
+## 0.1.2
+
+* Add `StringScanner.substring`, which returns a substring of the source string.
+
+## 0.1.1
+
+* Declare `SpanScanner`'s exposed `SourceSpan`s and `SourceLocation`s to be
+  `FileSpan`s and `FileLocation`s. They always were underneath, but callers may
+  now rely on it.
+
+* Add `SpanScanner.location`, which returns the scanner's current
+  `SourceLocation`.
+
+## 0.1.0
+
+* Switch from `source_maps`' `Span` class to `source_span`'s `SourceSpan` class.
+
+* `new StringScanner()`'s `sourceUrl` parameter is now named to make it clear
+  that it can be safely `null`.
+
+* `new StringScannerException()` takes different arguments in a different order
+  to match `SpanFormatException`.
+
+* `StringScannerException.string` has been renamed to
+  `StringScannerException.source` to match the `FormatException` interface.
+
+## 0.0.3
+
+* Make `StringScannerException` inherit from source_map's
+  [`SpanFormatException`][].
+
+[SpanFormatException]: (http://www.dartdocs.org/documentation/source_maps/0.9.2/index.html#source_maps/source_maps.SpanFormatException)
+
+## 0.0.2
+
+* `new StringScanner()` now takes an optional `sourceUrl` argument that provides
+  the URL of the source file. This is used for error reporting.
+
+* Add `StringScanner.readChar()` and `StringScanner.peekChar()` methods for
+  doing character-by-character scanning.
+
+* Scanners now throw `StringScannerException`s which provide more detailed
+  access to information about the errors that were thrown and can provide
+  terminal-colored messages.
+
+* Add a `LineScanner` subclass of `StringScanner` that automatically tracks line
+  and column information of the text being scanned.
+
+* Add a `SpanScanner` subclass of `LineScanner` that exposes matched ranges as
+  [source map][] `Span` objects.
+
+[source_map]: http://pub.dartlang.org/packages/source_maps
diff --git a/mojo/public/dart/third_party/string_scanner/LICENSE b/mojo/public/dart/third_party/string_scanner/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/mojo/public/dart/third_party/string_scanner/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/string_scanner/README.md b/mojo/public/dart/third_party/string_scanner/README.md
new file mode 100644
index 0000000..90660fc
--- /dev/null
+++ b/mojo/public/dart/third_party/string_scanner/README.md
@@ -0,0 +1,37 @@
+This package exposes a `StringScanner` type that makes it easy to parse a string
+using a series of `Pattern`s. For example:
+
+```dart
+import 'dart:math';
+
+import 'package:string_scanner/string_scanner.dart';
+
+num parseNumber(String source) {
+  // Scan a number ("1", "1.5", "-3").
+  var scanner = new StringScanner(source);
+
+  // [Scanner.scan] tries to consume a [Pattern] and returns whether or not it
+  // succeeded. It will move the scan pointer past the end of the pattern.
+  var negative = scanner.scan("-");
+
+  // [Scanner.expect] consumes a [Pattern] and throws a [FormatError] if it
+  // fails. Like [Scanner.scan], it will move the scan pointer forward.
+  scanner.expect(new RegExp(r"\d+"));
+
+  // [Scanner.lastMatch] holds the [MatchData] for the most recent call to
+  // [Scanner.scan], [Scanner.expect], or [Scanner.matches].
+  var number = int.parse(scanner.lastMatch[0]);
+
+  if (scanner.scan(".")) {
+    scanner.expect(new RegExp(r"\d+"));
+    var decimal = scanner.lastMatch[0];
+    number += int.parse(decimal) / math.pow(10, decimal.length);
+  }
+
+  // [Scanner.expectDone] will throw a [FormatError] if there's any input that
+  // hasn't yet been consumed.
+  scanner.expectDone();
+
+  return (negative ? -1 : 1) * number;
+}
+```
diff --git a/mojo/public/dart/third_party/string_scanner/codereview.settings b/mojo/public/dart/third_party/string_scanner/codereview.settings
new file mode 100644
index 0000000..31c557f
--- /dev/null
+++ b/mojo/public/dart/third_party/string_scanner/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: http://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/string_scanner/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/string_scanner/lib/src/eager_span_scanner.dart b/mojo/public/dart/third_party/string_scanner/lib/src/eager_span_scanner.dart
new file mode 100644
index 0000000..3fae5cc
--- /dev/null
+++ b/mojo/public/dart/third_party/string_scanner/lib/src/eager_span_scanner.dart
@@ -0,0 +1,115 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library string_scanner.eager_span_scanner;
+
+import 'package:charcode/ascii.dart';
+
+import 'line_scanner.dart';
+import 'span_scanner.dart';
+
+// TODO(nweiz): Currently this duplicates code in line_scanner.dart. Once
+// sdk#23770 is fully complete, we should move the shared code into a mixin.
+
+/// A regular expression matching newlines across platforms.
+final _newlineRegExp = new RegExp(r"\r\n?|\n");
+
+/// A [SpanScanner] that tracks the line and column eagerly, like [LineScanner].
+class EagerSpanScanner extends SpanScanner {
+  int get line => _line;
+  int _line = 0;
+
+  int get column => _column;
+  int _column = 0;
+
+  LineScannerState get state =>
+      new _EagerSpanScannerState(this, position, line, column);
+
+  bool get _betweenCRLF => peekChar(-1) == $cr && peekChar() == $lf;
+
+  set state(LineScannerState state) {
+    if (state is! _EagerSpanScannerState ||
+        !identical((state as _EagerSpanScannerState)._scanner, this)) {
+      throw new ArgumentError("The given LineScannerState was not returned by "
+          "this LineScanner.");
+    }
+
+    super.position = state.position;
+    _line = state.line;
+    _column = state.column;
+  }
+
+  set position(int newPosition) {
+    var oldPosition = position;
+    super.position = newPosition;
+
+    if (newPosition > oldPosition) {
+      var newlines = _newlinesIn(string.substring(oldPosition, newPosition));
+      _line += newlines.length;
+      if (newlines.isEmpty) {
+        _column += newPosition - oldPosition;
+      } else {
+        _column = newPosition - newlines.last.end;
+      }
+    } else {
+      var newlines = _newlinesIn(string.substring(newPosition, oldPosition));
+      if (_betweenCRLF) newlines.removeLast();
+
+      _line -= newlines.length;
+      if (newlines.isEmpty) {
+        _column -= oldPosition - newPosition;
+      } else {
+        _column = newPosition -
+            string.lastIndexOf(_newlineRegExp, newPosition) - 1;
+      }
+    }
+  }
+
+  EagerSpanScanner(String string, {sourceUrl, int position})
+      : super(string, sourceUrl: sourceUrl, position: position);
+
+  int readChar() {
+    var char = super.readChar();
+    if (char == $lf || (char == $cr && peekChar() != $lf)) {
+      _line += 1;
+      _column = 0;
+    } else {
+      _column += 1;
+    }
+    return char;
+  }
+
+  bool scan(Pattern pattern) {
+    if (!super.scan(pattern)) return false;
+
+    var newlines = _newlinesIn(lastMatch[0]);
+    _line += newlines.length;
+    if (newlines.isEmpty) {
+      _column += lastMatch[0].length;
+    } else {
+      _column = lastMatch[0].length - newlines.last.end;
+    }
+
+    return true;
+  }
+
+  /// Returns a list of [Match]es describing all the newlines in [text], which
+  /// is assumed to end at [position].
+  List<Match> _newlinesIn(String text) {
+    var newlines = _newlineRegExp.allMatches(text).toList();
+    if (_betweenCRLF) newlines.removeLast();
+    return newlines;
+  }
+}
+
+/// A class representing the state of an [EagerSpanScanner].
+class _EagerSpanScannerState implements LineScannerState {
+  final EagerSpanScanner _scanner;
+  final int position;
+  final int line;
+  final int column;
+
+  _EagerSpanScannerState(this._scanner, this.position, this.line, this.column);
+}
+
diff --git a/mojo/public/dart/third_party/string_scanner/lib/src/exception.dart b/mojo/public/dart/third_party/string_scanner/lib/src/exception.dart
new file mode 100644
index 0000000..50177d6
--- /dev/null
+++ b/mojo/public/dart/third_party/string_scanner/lib/src/exception.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library string_scanner.exception;
+
+import 'package:source_span/source_span.dart';
+
+/// An exception thrown by a [StringScanner] that failed to parse a string.
+class StringScannerException extends SourceSpanFormatException {
+  String get source => super.source;
+
+  /// The URL of the source file being parsed.
+  ///
+  /// This may be `null`, indicating that the source URL is unknown.
+  Uri get sourceUrl => span.sourceUrl;
+
+  StringScannerException(String message, SourceSpan span, String source)
+      : super(message, span, source);
+}
diff --git a/mojo/public/dart/third_party/string_scanner/lib/src/line_scanner.dart b/mojo/public/dart/third_party/string_scanner/lib/src/line_scanner.dart
new file mode 100644
index 0000000..66d7575
--- /dev/null
+++ b/mojo/public/dart/third_party/string_scanner/lib/src/line_scanner.dart
@@ -0,0 +1,127 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library string_scanner.line_scanner;
+
+import 'package:charcode/ascii.dart';
+
+import 'string_scanner.dart';
+
+// Note that much of this code is duplicated in eager_span_scanner.dart.
+
+/// A regular expression matching newlines across platforms.
+final _newlineRegExp = new RegExp(r"\r\n?|\n");
+
+/// A subclass of [StringScanner] that tracks line and column information.
+class LineScanner extends StringScanner {
+  /// The scanner's current (zero-based) line number.
+  int get line => _line;
+  int _line = 0;
+
+  /// The scanner's current (zero-based) column number.
+  int get column => _column;
+  int _column = 0;
+
+  /// The scanner's state, including line and column information.
+  ///
+  /// This can be used to efficiently save and restore the state of the scanner
+  /// when backtracking. A given [LineScannerState] is only valid for the
+  /// [LineScanner] that created it.
+  LineScannerState get state =>
+      new LineScannerState._(this, position, line, column);
+
+  /// Whether the current position is between a CR character and an LF
+  /// charactet.
+  bool get _betweenCRLF => peekChar(-1) == $cr && peekChar() == $lf;
+
+  set state(LineScannerState state) {
+    if (!identical(state._scanner, this)) {
+      throw new ArgumentError("The given LineScannerState was not returned by "
+          "this LineScanner.");
+    }
+
+    super.position = state.position;
+    _line = state.line;
+    _column = state.column;
+  }
+
+  set position(int newPosition) {
+    var oldPosition = position;
+    super.position = newPosition;
+
+    if (newPosition > oldPosition) {
+      var newlines = _newlinesIn(string.substring(oldPosition, newPosition));
+      _line += newlines.length;
+      if (newlines.isEmpty) {
+        _column += newPosition - oldPosition;
+      } else {
+        _column = newPosition - newlines.last.end;
+      }
+    } else {
+      var newlines = _newlinesIn(string.substring(newPosition, oldPosition));
+      if (_betweenCRLF) newlines.removeLast();
+
+      _line -= newlines.length;
+      if (newlines.isEmpty) {
+        _column -= oldPosition - newPosition;
+      } else {
+        _column = newPosition -
+            string.lastIndexOf(_newlineRegExp, newPosition) - 1;
+      }
+    }
+  }
+
+  LineScanner(String string, {sourceUrl, int position})
+      : super(string, sourceUrl: sourceUrl, position: position);
+
+  int readChar() {
+    var char = super.readChar();
+    if (char == $lf || (char == $cr && peekChar() != $lf)) {
+      _line += 1;
+      _column = 0;
+    } else {
+      _column += 1;
+    }
+    return char;
+  }
+
+  bool scan(Pattern pattern) {
+    if (!super.scan(pattern)) return false;
+
+    var newlines = _newlinesIn(lastMatch[0]);
+    _line += newlines.length;
+    if (newlines.isEmpty) {
+      _column += lastMatch[0].length;
+    } else {
+      _column = lastMatch[0].length - newlines.last.end;
+    }
+
+    return true;
+  }
+
+  /// Returns a list of [Match]es describing all the newlines in [text], which
+  /// is assumed to end at [position].
+  List<Match> _newlinesIn(String text) {
+    var newlines = _newlineRegExp.allMatches(text).toList();
+    if (_betweenCRLF) newlines.removeLast();
+    return newlines;
+  }
+}
+
+/// A class representing the state of a [LineScanner].
+class LineScannerState {
+  /// The [LineScanner] that created this.
+  final LineScanner _scanner;
+
+  /// The position of the scanner in this state.
+  final int position;
+
+  /// The zero-based line number of the scanner in this state.
+  final int line;
+
+  /// The zero-based column number of the scanner in this state.
+  final int column;
+
+  LineScannerState._(this._scanner, this.position, this.line, this.column);
+}
diff --git a/mojo/public/dart/third_party/string_scanner/lib/src/span_scanner.dart b/mojo/public/dart/third_party/string_scanner/lib/src/span_scanner.dart
new file mode 100644
index 0000000..ebe230d
--- /dev/null
+++ b/mojo/public/dart/third_party/string_scanner/lib/src/span_scanner.dart
@@ -0,0 +1,115 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library string_scanner.span_scanner;
+
+import 'package:source_span/source_span.dart';
+
+import 'eager_span_scanner.dart';
+import 'exception.dart';
+import 'line_scanner.dart';
+import 'string_scanner.dart';
+import 'utils.dart';
+
+/// A subclass of [LineScanner] that exposes matched ranges as source map
+/// [Span]s.
+class SpanScanner extends StringScanner implements LineScanner {
+  /// The source of the scanner.
+  ///
+  /// This caches line break information and is used to generate [Span]s.
+  final SourceFile _sourceFile;
+
+  int get line => _sourceFile.getLine(position);
+  int get column => _sourceFile.getColumn(position);
+
+  LineScannerState get state => new _SpanScannerState(this, position);
+
+  set state(LineScannerState state) {
+    if (state is! _SpanScannerState ||
+        !identical((state as _SpanScannerState)._scanner, this)) {
+      throw new ArgumentError("The given LineScannerState was not returned by "
+          "this LineScanner.");
+    }
+
+    this.position = state.position;
+  }
+
+  /// The [FileSpan] for [lastMatch].
+  ///
+  /// This is the span for the entire match. There's no way to get spans for
+  /// subgroups since [Match] exposes no information about their positions.
+  FileSpan get lastSpan => _lastSpan;
+  FileSpan _lastSpan;
+
+  /// The current location of the scanner.
+  FileLocation get location => _sourceFile.location(position);
+
+  /// Returns an empty span at the current location.
+  FileSpan get emptySpan => location.pointSpan();
+
+  /// Creates a new [SpanScanner] that starts scanning from [position].
+  ///
+  /// [sourceUrl] is used as [SourceLocation.sourceUrl] for the returned
+  /// [FileSpan]s as well as for error reporting. It can be a [String], a
+  /// [Uri], or `null`.
+  SpanScanner(String string, {sourceUrl, int position})
+      : _sourceFile = new SourceFile(string, url: sourceUrl),
+        super(string, sourceUrl: sourceUrl, position: position);
+
+  /// Creates a new [SpanScanner] that eagerly computes line and column numbers.
+  ///
+  /// In general [new SpanScanner] will be more efficient, since it avoids extra
+  /// computation on every scan. However, eager scanning can be useful for
+  /// situations where the normal course of parsing frequently involves
+  /// accessing the current line and column numbers.
+  ///
+  /// Note that *only* the `line` and `column` fields on the `SpanScanner`
+  /// itself and its `LineScannerState` are eagerly computed. To limit their
+  /// memory footprint, returned spans and locations will still lazily compute
+  /// their line and column numbers.
+  factory SpanScanner.eager(String string, {sourceUrl, int position}) =
+      EagerSpanScanner;
+
+  /// Creates a [FileSpan] representing the source range between [startState]
+  /// and the current position.
+  FileSpan spanFrom(LineScannerState startState, [LineScannerState endState]) {
+    var endPosition = endState == null ? position : endState.position;
+    return _sourceFile.span(startState.position, endPosition);
+  }
+
+  bool matches(Pattern pattern) {
+    if (!super.matches(pattern)) {
+      _lastSpan = null;
+      return false;
+    }
+
+    _lastSpan = _sourceFile.span(position, lastMatch.end);
+    return true;
+  }
+
+  void error(String message, {Match match, int position, int length}) {
+    validateErrorArgs(string, match, position, length);
+
+    if (match == null && position == null && length == null) match = lastMatch;
+    if (position == null) {
+      position = match == null ? this.position : match.start;
+    }
+    if (length == null) length = match == null ? 1 : match.end - match.start;
+
+    var span = _sourceFile.span(position, position + length);
+    throw new StringScannerException(message, span, string);
+  }
+}
+
+/// A class representing the state of a [SpanScanner].
+class _SpanScannerState implements LineScannerState {
+  /// The [SpanScanner] that created this.
+  final SpanScanner _scanner;
+
+  final int position;
+  int get line => _scanner._sourceFile.getLine(position);
+  int get column => _scanner._sourceFile.getColumn(position);
+
+  _SpanScannerState(this._scanner, this.position);
+}
diff --git a/mojo/public/dart/third_party/string_scanner/lib/src/string_scanner.dart b/mojo/public/dart/third_party/string_scanner/lib/src/string_scanner.dart
new file mode 100644
index 0000000..d9c1c2f
--- /dev/null
+++ b/mojo/public/dart/third_party/string_scanner/lib/src/string_scanner.dart
@@ -0,0 +1,176 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library string_scanner.string_scanner;
+
+import 'package:source_span/source_span.dart';
+
+import 'exception.dart';
+import 'utils.dart';
+
+/// When compiled to JS, forward slashes are always escaped in [RegExp.pattern].
+///
+/// See issue 17998.
+final _slashAutoEscape = new RegExp("/").pattern == "\\/";
+
+/// A class that scans through a string using [Pattern]s.
+class StringScanner {
+  /// The URL of the source of the string being scanned.
+  ///
+  /// This is used for error reporting. It may be `null`, indicating that the
+  /// source URL is unknown or unavailable.
+  final Uri sourceUrl;
+
+  /// The string being scanned through.
+  final String string;
+
+  /// The current position of the scanner in the string, in characters.
+  int get position => _position;
+  set position(int position) {
+    if (position < 0 || position > string.length) {
+      throw new ArgumentError("Invalid position $position");
+    }
+
+    _position = position;
+  }
+  int _position = 0;
+
+  /// The data about the previous match made by the scanner.
+  ///
+  /// If the last match failed, this will be `null`.
+  Match get lastMatch => _lastMatch;
+  Match _lastMatch;
+
+  /// The portion of the string that hasn't yet been scanned.
+  String get rest => string.substring(position);
+
+  /// Whether the scanner has completely consumed [string].
+  bool get isDone => position == string.length;
+
+  /// Creates a new [StringScanner] that starts scanning from [position].
+  ///
+  /// [position] defaults to 0, the beginning of the string. [sourceUrl] is the
+  /// URL of the source of the string being scanned, if available. It can be
+  /// a [String], a [Uri], or `null`.
+  StringScanner(this.string, {sourceUrl, int position})
+      : sourceUrl = sourceUrl is String ? Uri.parse(sourceUrl) : sourceUrl {
+    if (position != null) this.position = position;
+  }
+
+  /// Consumes a single character and returns its character code.
+  ///
+  /// This throws a [FormatException] if the string has been fully consumed. It
+  /// doesn't affect [lastMatch].
+  int readChar() {
+    if (isDone) _fail("more input");
+    return string.codeUnitAt(_position++);
+  }
+
+  /// Returns the character code of the character [offset] away from [position].
+  ///
+  /// [offset] defaults to zero, and may be negative to inspect already-consumed
+  /// characters.
+  ///
+  /// This returns `null` if [offset] points outside the string. It doesn't
+  /// affect [lastMatch].
+  int peekChar([int offset]) {
+    if (offset == null) offset = 0;
+    var index = position + offset;
+    if (index < 0 || index >= string.length) return null;
+    return string.codeUnitAt(index);
+  }
+
+  /// If [pattern] matches at the current position of the string, scans forward
+  /// until the end of the match.
+  ///
+  /// Returns whether or not [pattern] matched.
+  bool scan(Pattern pattern) {
+    var success = matches(pattern);
+    if (success) _position = _lastMatch.end;
+    return success;
+  }
+
+  /// If [pattern] matches at the current position of the string, scans forward
+  /// until the end of the match.
+  ///
+  /// If [pattern] did not match, throws a [FormatException] describing the
+  /// position of the failure. [name] is used in this error as the expected name
+  /// of the pattern being matched; if it's `null`, the pattern itself is used
+  /// instead.
+  void expect(Pattern pattern, {String name}) {
+    if (scan(pattern)) return;
+
+    if (name == null) {
+      if (pattern is RegExp) {
+        var source = pattern.pattern;
+        if (!_slashAutoEscape) source = source.replaceAll("/", "\\/");
+        name = "/$source/";
+      } else {
+        name =
+            pattern.toString().replaceAll("\\", "\\\\").replaceAll('"', '\\"');
+        name = '"$name"';
+      }
+    }
+    _fail(name);
+  }
+
+  /// If the string has not been fully consumed, this throws a
+  /// [FormatException].
+  void expectDone() {
+    if (isDone) return;
+    _fail("no more input");
+  }
+
+  /// Returns whether or not [pattern] matches at the current position of the
+  /// string.
+  ///
+  /// This doesn't move the scan pointer forward.
+  bool matches(Pattern pattern) {
+    _lastMatch = pattern.matchAsPrefix(string, position);
+    return _lastMatch != null;
+  }
+
+  /// Returns the substring of [string] between [start] and [end].
+  ///
+  /// Unlike [String.substring], [end] defaults to [position] rather than the
+  /// end of the string.
+  String substring(int start, [int end]) {
+    if (end == null) end = position;
+    return string.substring(start, end);
+  }
+
+  /// Throws a [FormatException] with [message] as well as a detailed
+  /// description of the location of the error in the string.
+  ///
+  /// [match] is the match information for the span of the string with which the
+  /// error is associated. This should be a match returned by this scanner's
+  /// [lastMatch] property. By default, the error is associated with the last
+  /// match.
+  ///
+  /// If [position] and/or [length] are passed, they are used as the error span
+  /// instead. If only [length] is passed, [position] defaults to the current
+  /// position; if only [position] is passed, [length] defaults to 1.
+  ///
+  /// It's an error to pass [match] at the same time as [position] or [length].
+  void error(String message, {Match match, int position, int length}) {
+    validateErrorArgs(string, match, position, length);
+
+    if (match == null && position == null && length == null) match = lastMatch;
+    if (position == null) {
+      position = match == null ? this.position : match.start;
+    }
+    if (length == null) length = match == null ? 1 : match.end - match.start;
+
+    var sourceFile = new SourceFile(string, url: sourceUrl);
+    var span = sourceFile.span(position, position + length);
+    throw new StringScannerException(message, span, string);
+  }
+
+  // TODO(nweiz): Make this handle long lines more gracefully.
+  /// Throws a [FormatException] describing that [name] is expected at the
+  /// current position in the string.
+  void _fail(String name) {
+    error("expected $name.", position: this.position, length: 0);
+  }
+}
diff --git a/mojo/public/dart/third_party/string_scanner/lib/src/utils.dart b/mojo/public/dart/third_party/string_scanner/lib/src/utils.dart
new file mode 100644
index 0000000..107c4c5
--- /dev/null
+++ b/mojo/public/dart/third_party/string_scanner/lib/src/utils.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library string_scanner.utils;
+
+/// Validates the arguments passed to [StringScanner.error].
+void validateErrorArgs(String string, Match match, int position, int length) {
+  if (match != null && (position != null || length != null)) {
+    throw new ArgumentError("Can't pass both match and position/length.");
+  }
+
+  if (position != null) {
+    if (position < 0) {
+      throw new RangeError("position must be greater than or equal to 0.");
+    } else if (position > string.length) {
+      throw new RangeError("position must be less than or equal to the "
+          "string length.");
+    }
+  }
+
+  if (length != null && length < 0) {
+    throw new RangeError("length must be greater than or equal to 0.");
+  }
+
+  if (position != null && length != null && position + length > string.length) {
+    throw new RangeError("position plus length must not go beyond the end of "
+        "the string.");
+  }
+}
diff --git a/mojo/public/dart/third_party/string_scanner/lib/string_scanner.dart b/mojo/public/dart/third_party/string_scanner/lib/string_scanner.dart
new file mode 100644
index 0000000..be294f4
--- /dev/null
+++ b/mojo/public/dart/third_party/string_scanner/lib/string_scanner.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A library for parsing strings using a sequence of patterns.
+library string_scanner;
+
+export 'src/exception.dart';
+export 'src/line_scanner.dart';
+export 'src/span_scanner.dart';
+export 'src/string_scanner.dart';
diff --git a/mojo/public/dart/third_party/string_scanner/pubspec.yaml b/mojo/public/dart/third_party/string_scanner/pubspec.yaml
new file mode 100644
index 0000000..35b3fe0
--- /dev/null
+++ b/mojo/public/dart/third_party/string_scanner/pubspec.yaml
@@ -0,0 +1,14 @@
+name: string_scanner
+version: 0.1.4
+author: "Dart Team <misc@dartlang.org>"
+homepage: https://github.com/dart-lang/string_scanner
+description: >
+  A class for parsing strings using a sequence of patterns.
+dependencies:
+  charcode: "^1.1.0"
+  path: "^1.2.0"
+  source_span: "^1.0.0"
+dev_dependencies:
+  test: ">=0.12.0 <0.13.0"
+environment:
+  sdk: ">=1.8.0 <2.0.0"
diff --git a/mojo/public/dart/third_party/string_scanner/test/error_test.dart b/mojo/public/dart/third_party/string_scanner/test/error_test.dart
new file mode 100644
index 0000000..9c485e5
--- /dev/null
+++ b/mojo/public/dart/third_party/string_scanner/test/error_test.dart
@@ -0,0 +1,149 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library string_scanner.error_test;
+
+import 'package:string_scanner/string_scanner.dart';
+import 'package:test/test.dart';
+
+import 'utils.dart';
+
+void main() {
+  test('defaults to the last match', () {
+    var scanner = new StringScanner('foo bar baz');
+    scanner.expect('foo ');
+    scanner.expect('bar');
+    expect(() => scanner.error('oh no!'), throwsStringScannerException('bar'));
+  });
+
+  group("with match", () {
+    test('supports an earlier match', () {
+      var scanner = new StringScanner('foo bar baz');
+      scanner.expect('foo ');
+      var match = scanner.lastMatch;
+      scanner.expect('bar');
+      expect(() => scanner.error('oh no!', match: match),
+          throwsStringScannerException('foo '));
+    });
+
+    test('supports a match on a previous line', () {
+      var scanner =
+          new StringScanner('foo bar baz\ndo re mi\nearth fire water');
+      scanner.expect('foo bar baz\ndo ');
+      scanner.expect('re');
+      var match = scanner.lastMatch;
+      scanner.expect(' mi\nearth ');
+      expect(() => scanner.error('oh no!', match: match),
+          throwsStringScannerException('re'));
+    });
+
+    test('supports a multiline match', () {
+      var scanner =
+          new StringScanner('foo bar baz\ndo re mi\nearth fire water');
+      scanner.expect('foo bar ');
+      scanner.expect('baz\ndo');
+      var match = scanner.lastMatch;
+      scanner.expect(' re mi');
+      expect(() => scanner.error('oh no!', match: match),
+          throwsStringScannerException('baz\ndo'));
+    });
+
+    test('supports a match after position', () {
+      var scanner = new StringScanner('foo bar baz');
+      scanner.expect('foo ');
+      scanner.expect('bar');
+      var match = scanner.lastMatch;
+      scanner.position = 0;
+      expect(() => scanner.error('oh no!', match: match),
+          throwsStringScannerException('bar'));
+    });
+  });
+
+  group("with position and/or length", () {
+    test('defaults to length 1', () {
+      var scanner = new StringScanner('foo bar baz');
+      scanner.expect('foo ');
+      expect(() => scanner.error('oh no!', position: 1),
+          throwsStringScannerException('o'));
+    });
+
+    test('defaults to the current position', () {
+      var scanner = new StringScanner('foo bar baz');
+      scanner.expect('foo ');
+      expect(() => scanner.error('oh no!', length: 3),
+          throwsStringScannerException('bar'));
+    });
+
+    test('supports an earlier position', () {
+      var scanner = new StringScanner('foo bar baz');
+      scanner.expect('foo ');
+      expect(() => scanner.error('oh no!', position: 1, length: 2),
+          throwsStringScannerException('oo'));
+    });
+
+    test('supports a position on a previous line', () {
+      var scanner =
+          new StringScanner('foo bar baz\ndo re mi\nearth fire water');
+      scanner.expect('foo bar baz\ndo re mi\nearth');
+      expect(() => scanner.error('oh no!', position: 15, length: 2),
+          throwsStringScannerException('re'));
+    });
+
+    test('supports a multiline length', () {
+      var scanner =
+          new StringScanner('foo bar baz\ndo re mi\nearth fire water');
+      scanner.expect('foo bar baz\ndo re mi\nearth');
+      expect(() => scanner.error('oh no!', position: 8, length: 8),
+          throwsStringScannerException('baz\ndo r'));
+    });
+
+    test('supports a position after the current one', () {
+      var scanner = new StringScanner('foo bar baz');
+      expect(() => scanner.error('oh no!', position: 4, length: 3),
+          throwsStringScannerException('bar'));
+    });
+
+    test('supports a length of zero', () {
+      var scanner = new StringScanner('foo bar baz');
+      expect(() => scanner.error('oh no!', position: 4, length: 0),
+          throwsStringScannerException(''));
+    });
+  });
+
+  group("argument errors", () {
+    var scanner;
+    setUp(() {
+      scanner = new StringScanner('foo bar baz');
+      scanner.scan('foo');
+    });
+
+    test("if match is passed with position", () {
+      expect(
+          () => scanner.error("oh no!", match: scanner.lastMatch, position: 1),
+          throwsArgumentError);
+    });
+
+    test("if match is passed with length", () {
+      expect(() => scanner.error("oh no!", match: scanner.lastMatch, length: 1),
+          throwsArgumentError);
+    });
+
+    test("if position is negative", () {
+      expect(() => scanner.error("oh no!", position: -1), throwsArgumentError);
+    });
+
+    test("if position is outside the string", () {
+      expect(() => scanner.error("oh no!", position: 100), throwsArgumentError);
+    });
+
+    test("if position + length is outside the string", () {
+      expect(() => scanner.error("oh no!", position: 7, length: 7),
+          throwsArgumentError);
+    });
+
+    test("if length is negative", () {
+      expect(() => scanner.error("oh no!", length: -1), throwsArgumentError);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/string_scanner/test/line_scanner_test.dart b/mojo/public/dart/third_party/string_scanner/test/line_scanner_test.dart
new file mode 100644
index 0000000..68e5c38
--- /dev/null
+++ b/mojo/public/dart/third_party/string_scanner/test/line_scanner_test.dart
@@ -0,0 +1,136 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library string_scanner.line_scanner_test;
+
+import 'package:string_scanner/string_scanner.dart';
+import 'package:test/test.dart';
+
+void main() {
+  var scanner;
+  setUp(() {
+    scanner = new LineScanner('foo\nbar\r\nbaz');
+  });
+
+  test('begins with line and column 0', () {
+    expect(scanner.line, equals(0));
+    expect(scanner.column, equals(0));
+  });
+
+  group("scan()", () {
+    test("consuming no newlines increases the column but not the line", () {
+      scanner.scan('foo');
+      expect(scanner.line, equals(0));
+      expect(scanner.column, equals(3));
+    });
+
+    test("consuming a newline resets the column and increases the line", () {
+      scanner.expect('foo\nba');
+      expect(scanner.line, equals(1));
+      expect(scanner.column, equals(2));
+    });
+
+    test("consuming multiple newlines resets the column and increases the line",
+        () {
+      scanner.expect('foo\nbar\r\nb');
+      expect(scanner.line, equals(2));
+      expect(scanner.column, equals(1));
+    });
+
+    test("consuming halfway through a CR LF doesn't count as a line", () {
+      scanner.expect('foo\nbar\r');
+      expect(scanner.line, equals(1));
+      expect(scanner.column, equals(4));
+
+      scanner.expect('\nb');
+      expect(scanner.line, equals(2));
+      expect(scanner.column, equals(1));
+    });
+  });
+
+  group("readChar()", () {
+    test("on a non-newline character increases the column but not the line",
+        () {
+      scanner.readChar();
+      expect(scanner.line, equals(0));
+      expect(scanner.column, equals(1));
+    });
+
+    test("consuming a newline resets the column and increases the line", () {
+      scanner.expect('foo');
+      expect(scanner.line, equals(0));
+      expect(scanner.column, equals(3));
+
+      scanner.readChar();
+      expect(scanner.line, equals(1));
+      expect(scanner.column, equals(0));
+    });
+
+    test("consuming halfway through a CR LF doesn't count as a line", () {
+      scanner.expect('foo\nbar');
+      expect(scanner.line, equals(1));
+      expect(scanner.column, equals(3));
+
+      scanner.readChar();
+      expect(scanner.line, equals(1));
+      expect(scanner.column, equals(4));
+
+      scanner.readChar();
+      expect(scanner.line, equals(2));
+      expect(scanner.column, equals(0));
+    });
+  });
+
+  group("position=", () {
+    test("forward through newlines sets the line and column", () {
+      scanner.position = 10; // "foo\nbar\r\nb"
+      expect(scanner.line, equals(2));
+      expect(scanner.column, equals(1));
+    });
+
+    test("forward through no newlines sets the column", () {
+      scanner.position = 2; // "fo"
+      expect(scanner.line, equals(0));
+      expect(scanner.column, equals(2));
+    });
+
+    test("backward through newlines sets the line and column", () {
+      scanner.scan("foo\nbar\r\nbaz");
+      scanner.position = 2; // "fo"
+      expect(scanner.line, equals(0));
+      expect(scanner.column, equals(2));
+    });
+
+    test("backward through no newlines sets the column", () {
+      scanner.scan("foo\nbar\r\nbaz");
+      scanner.position = 10; // "foo\nbar\r\nb"
+      expect(scanner.line, equals(2));
+      expect(scanner.column, equals(1));
+    });
+
+    test("forward halfway through a CR LF doesn't count as a line", () {
+      scanner.position = 8; // "foo\nbar\r"
+      expect(scanner.line, equals(1));
+      expect(scanner.column, equals(4));
+    });
+  });
+
+  test("state= restores the line, column, and position", () {
+    scanner.scan('foo\nb');
+    var state = scanner.state;
+
+    scanner.scan('ar\nba');
+    scanner.state = state;
+    expect(scanner.rest, equals('ar\r\nbaz'));
+    expect(scanner.line, equals(1));
+    expect(scanner.column, equals(1));
+  });
+
+  test("state= rejects a foreign state", () {
+    scanner.scan('foo\nb');
+
+    expect(() => new LineScanner(scanner.string).state = scanner.state,
+        throwsArgumentError);
+  });
+}
diff --git a/mojo/public/dart/third_party/string_scanner/test/span_scanner_test.dart b/mojo/public/dart/third_party/string_scanner/test/span_scanner_test.dart
new file mode 100644
index 0000000..114bff7
--- /dev/null
+++ b/mojo/public/dart/third_party/string_scanner/test/span_scanner_test.dart
@@ -0,0 +1,70 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library string_scanner.span_scanner_test;
+
+import 'package:string_scanner/string_scanner.dart';
+import 'package:test/test.dart';
+
+void main() {
+  testForImplementation("lazy", () {
+    return new SpanScanner('foo\nbar\nbaz', sourceUrl: 'source');
+  });
+
+  testForImplementation("eager", () {
+    return new SpanScanner.eager('foo\nbar\nbaz', sourceUrl: 'source');
+  });
+}
+
+void testForImplementation(String name, SpanScanner create()) {
+  group("for a $name scanner", () {
+    var scanner;
+    setUp(() => scanner = create());
+
+    test("tracks the span for the last match", () {
+      scanner.scan('fo');
+      scanner.scan('o\nba');
+
+      var span = scanner.lastSpan;
+      expect(span.start.offset, equals(2));
+      expect(span.start.line, equals(0));
+      expect(span.start.column, equals(2));
+      expect(span.start.sourceUrl, equals(Uri.parse('source')));
+
+      expect(span.end.offset, equals(6));
+      expect(span.end.line, equals(1));
+      expect(span.end.column, equals(2));
+      expect(span.start.sourceUrl, equals(Uri.parse('source')));
+
+      expect(span.text, equals('o\nba'));
+    });
+
+    test(".spanFrom() returns a span from a previous state", () {
+      scanner.scan('fo');
+      var state = scanner.state;
+      scanner.scan('o\nba');
+      scanner.scan('r\nba');
+
+      var span = scanner.spanFrom(state);
+      expect(span.text, equals('o\nbar\nba'));
+    });
+
+    test(".emptySpan returns an empty span at the current location", () {
+      scanner.scan('foo\nba');
+
+      var span = scanner.emptySpan;
+      expect(span.start.offset, equals(6));
+      expect(span.start.line, equals(1));
+      expect(span.start.column, equals(2));
+      expect(span.start.sourceUrl, equals(Uri.parse('source')));
+
+      expect(span.end.offset, equals(6));
+      expect(span.end.line, equals(1));
+      expect(span.end.column, equals(2));
+      expect(span.start.sourceUrl, equals(Uri.parse('source')));
+
+      expect(span.text, equals(''));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/string_scanner/test/string_scanner_test.dart b/mojo/public/dart/third_party/string_scanner/test/string_scanner_test.dart
new file mode 100644
index 0000000..c8e43a5
--- /dev/null
+++ b/mojo/public/dart/third_party/string_scanner/test/string_scanner_test.dart
@@ -0,0 +1,337 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library string_scanner.string_scanner_test;
+
+import 'package:string_scanner/string_scanner.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group('with an empty string', () {
+    var scanner;
+    setUp(() {
+      scanner = new StringScanner('');
+    });
+
+    test('is done', () {
+      expect(scanner.isDone, isTrue);
+      expect(scanner.expectDone, isNot(throwsFormatException));
+    });
+
+    test('rest is empty', () {
+      expect(scanner.rest, isEmpty);
+    });
+
+    test('lastMatch is null', () {
+      expect(scanner.lastMatch, isNull);
+    });
+
+    test('position is zero', () {
+      expect(scanner.position, equals(0));
+    });
+
+    test("readChar fails and doesn't change the state", () {
+      expect(scanner.readChar, throwsFormatException);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
+    test("peekChar returns null and doesn't change the state", () {
+      expect(scanner.peekChar(), isNull);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
+    test("scan returns false and doesn't change the state", () {
+      expect(scanner.scan(new RegExp('.')), isFalse);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
+    test("expect throws a FormatException and doesn't change the state", () {
+      expect(() => scanner.expect(new RegExp('.')), throwsFormatException);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
+    test("matches returns false and doesn't change the state", () {
+      expect(scanner.matches(new RegExp('.')), isFalse);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
+    test("substring returns the empty string", () {
+      expect(scanner.substring(0), isEmpty);
+    });
+
+    test('setting position to 1 throws an ArgumentError', () {
+      expect(() {
+        scanner.position = 1;
+      }, throwsArgumentError);
+    });
+
+    test('setting position to -1 throws an ArgumentError', () {
+      expect(() {
+        scanner.position = -1;
+      }, throwsArgumentError);
+    });
+  });
+
+  group('at the beginning of a string', () {
+    var scanner;
+    setUp(() {
+      scanner = new StringScanner('foo bar');
+    });
+
+    test('is not done', () {
+      expect(scanner.isDone, isFalse);
+      expect(scanner.expectDone, throwsFormatException);
+    });
+
+    test('rest is the whole string', () {
+      expect(scanner.rest, equals('foo bar'));
+    });
+
+    test('lastMatch is null', () {
+      expect(scanner.lastMatch, isNull);
+    });
+
+    test('position is zero', () {
+      expect(scanner.position, equals(0));
+    });
+
+    test('readChar returns the first character and moves forward', () {
+      expect(scanner.readChar(), equals(0x66));
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(1));
+    });
+
+    test('peekChar returns the first character', () {
+      expect(scanner.peekChar(), equals(0x66));
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
+    test('peekChar with an argument returns the nth character', () {
+      expect(scanner.peekChar(4), equals(0x62));
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
+    test("a matching scan returns true and changes the state", () {
+      expect(scanner.scan(new RegExp('f(..)')), isTrue);
+      expect(scanner.lastMatch[1], equals('oo'));
+      expect(scanner.position, equals(3));
+      expect(scanner.rest, equals(' bar'));
+    });
+
+    test("a non-matching scan returns false and sets lastMatch to null", () {
+      expect(scanner.matches(new RegExp('f(..)')), isTrue);
+      expect(scanner.lastMatch, isNotNull);
+
+      expect(scanner.scan(new RegExp('b(..)')), isFalse);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+      expect(scanner.rest, equals('foo bar'));
+    });
+
+    test("a matching expect changes the state", () {
+      scanner.expect(new RegExp('f(..)'));
+      expect(scanner.lastMatch[1], equals('oo'));
+      expect(scanner.position, equals(3));
+      expect(scanner.rest, equals(' bar'));
+    });
+
+    test("a non-matching expect throws a FormatException and sets lastMatch to "
+        "null", () {
+      expect(scanner.matches(new RegExp('f(..)')), isTrue);
+      expect(scanner.lastMatch, isNotNull);
+
+      expect(() => scanner.expect(new RegExp('b(..)')), throwsFormatException);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+      expect(scanner.rest, equals('foo bar'));
+    });
+
+    test("a matching matches returns true and only changes lastMatch", () {
+      expect(scanner.matches(new RegExp('f(..)')), isTrue);
+      expect(scanner.lastMatch[1], equals('oo'));
+      expect(scanner.position, equals(0));
+      expect(scanner.rest, equals('foo bar'));
+    });
+
+    test("a non-matching matches returns false and doesn't change the state",
+        () {
+      expect(scanner.matches(new RegExp('b(..)')), isFalse);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+      expect(scanner.rest, equals('foo bar'));
+    });
+
+    test("substring from the beginning returns the empty string", () {
+      expect(scanner.substring(0), isEmpty);
+    });
+
+    test("substring with a custom end returns the substring", () {
+      expect(scanner.substring(0, 3), equals('foo'));
+    });
+
+    test("substring with the string length returns the whole string", () {
+      expect(scanner.substring(0, 7), equals('foo bar'));
+    });
+
+    test('setting position to 1 moves the cursor forward', () {
+      scanner.position = 1;
+      expect(scanner.position, equals(1));
+      expect(scanner.rest, equals('oo bar'));
+
+      expect(scanner.scan(new RegExp('oo.')), isTrue);
+      expect(scanner.lastMatch[0], equals('oo '));
+      expect(scanner.position, equals(4));
+      expect(scanner.rest, equals('bar'));
+    });
+
+    test('setting position beyond the string throws an ArgumentError', () {
+      expect(() {
+        scanner.position = 8;
+      }, throwsArgumentError);
+    });
+
+    test('setting position to -1 throws an ArgumentError', () {
+      expect(() {
+        scanner.position = -1;
+      }, throwsArgumentError);
+    });
+
+    test('scan accepts any Pattern', () {
+      expect(scanner.scan('foo'), isTrue);
+      expect(scanner.lastMatch[0], equals('foo'));
+      expect(scanner.position, equals(3));
+      expect(scanner.rest, equals(' bar'));
+    });
+
+    test('scans multiple times', () {
+      expect(scanner.scan(new RegExp('f(..)')), isTrue);
+      expect(scanner.lastMatch[1], equals('oo'));
+      expect(scanner.position, equals(3));
+      expect(scanner.rest, equals(' bar'));
+
+      expect(scanner.scan(new RegExp(' b(..)')), isTrue);
+      expect(scanner.lastMatch[1], equals('ar'));
+      expect(scanner.position, equals(7));
+      expect(scanner.rest, equals(''));
+      expect(scanner.isDone, isTrue);
+      expect(scanner.expectDone, isNot(throwsFormatException));
+    });
+  });
+
+  group('at the end of a string', () {
+    var scanner;
+    setUp(() {
+      scanner = new StringScanner('foo bar');
+      expect(scanner.scan('foo bar'), isTrue);
+    });
+
+    test('is done', () {
+      expect(scanner.isDone, isTrue);
+      expect(scanner.expectDone, isNot(throwsFormatException));
+    });
+
+    test('rest is empty', () {
+      expect(scanner.rest, isEmpty);
+    });
+
+    test('position is zero', () {
+      expect(scanner.position, equals(7));
+    });
+
+    test("readChar fails and doesn't change the state", () {
+      expect(scanner.readChar, throwsFormatException);
+      expect(scanner.lastMatch, isNotNull);
+      expect(scanner.position, equals(7));
+    });
+
+    test("peekChar returns null and doesn't change the state", () {
+      expect(scanner.peekChar(), isNull);
+      expect(scanner.lastMatch, isNotNull);
+      expect(scanner.position, equals(7));
+    });
+
+    test("scan returns false and sets lastMatch to null", () {
+      expect(scanner.scan(new RegExp('.')), isFalse);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(7));
+    });
+
+    test("expect throws a FormatException and sets lastMatch to null", () {
+      expect(() => scanner.expect(new RegExp('.')), throwsFormatException);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(7));
+    });
+
+    test("matches returns false sets lastMatch to null", () {
+      expect(scanner.matches(new RegExp('.')), isFalse);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(7));
+    });
+
+    test("substring from the beginning returns the whole string", () {
+      expect(scanner.substring(0), equals('foo bar'));
+    });
+
+    test("substring with a custom start returns a substring from there", () {
+      expect(scanner.substring(4), equals('bar'));
+    });
+
+    test("substring with a custom start and end returns that substring", () {
+      expect(scanner.substring(3, 5), equals(' b'));
+    });
+
+    test('setting position to 1 moves the cursor backward', () {
+      scanner.position = 1;
+      expect(scanner.position, equals(1));
+      expect(scanner.rest, equals('oo bar'));
+
+      expect(scanner.scan(new RegExp('oo.')), isTrue);
+      expect(scanner.lastMatch[0], equals('oo '));
+      expect(scanner.position, equals(4));
+      expect(scanner.rest, equals('bar'));
+    });
+
+    test('setting position beyond the string throws an ArgumentError', () {
+      expect(() {
+        scanner.position = 8;
+      }, throwsArgumentError);
+    });
+
+    test('setting position to -1 throws an ArgumentError', () {
+      expect(() {
+        scanner.position = -1;
+      }, throwsArgumentError);
+    });
+  });
+
+  group('a scanner constructed with a custom position', () {
+    test('starts scanning from that position', () {
+      var scanner = new StringScanner('foo bar', position: 1);
+      expect(scanner.position, equals(1));
+      expect(scanner.rest, equals('oo bar'));
+
+      expect(scanner.scan(new RegExp('oo.')), isTrue);
+      expect(scanner.lastMatch[0], equals('oo '));
+      expect(scanner.position, equals(4));
+      expect(scanner.rest, equals('bar'));
+    });
+
+    test('throws an ArgumentError if the position is -1', () {
+      expect(() => new StringScanner('foo bar', position: -1),
+          throwsArgumentError);
+    });
+
+    test('throws an ArgumentError if the position is beyond the string', () {
+      expect(
+          () => new StringScanner('foo bar', position: 8), throwsArgumentError);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/string_scanner/test/utils.dart b/mojo/public/dart/third_party/string_scanner/test/utils.dart
new file mode 100644
index 0000000..8df4b51
--- /dev/null
+++ b/mojo/public/dart/third_party/string_scanner/test/utils.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library string_scanner.test.utils;
+
+import 'package:string_scanner/string_scanner.dart';
+import 'package:test/test.dart';
+
+/// Returns a matcher that asserts that a closure throws a [FormatException]
+/// with the given [message].
+Matcher throwsStringScannerException(String text) {
+  return throwsA(predicate((error) {
+    expect(error, new isInstanceOf<StringScannerException>());
+    expect(error.span.text, equals(text));
+    return true;
+  }));
+}
diff --git a/mojo/public/dart/third_party/test/.gitignore b/mojo/public/dart/third_party/test/.gitignore
new file mode 100644
index 0000000..80a5bb9
--- /dev/null
+++ b/mojo/public/dart/third_party/test/.gitignore
@@ -0,0 +1,15 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.pub/
+build/
+packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
+.packages
diff --git a/mojo/public/dart/third_party/test/.status b/mojo/public/dart/third_party/test/.status
new file mode 100644
index 0000000..870ef8a
--- /dev/null
+++ b/mojo/public/dart/third_party/test/.status
@@ -0,0 +1,43 @@
+# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Skip non-test files ending with "_test".
+packages/*: SkipByDesign
+*/packages/*: SkipByDesign
+*/*/packages/*: SkipByDesign
+*/*/*/packages/*: SkipByDesign
+*/*/*/*packages/*: SkipByDesign
+*/*/*/*/*packages/*: SkipByDesign
+
+# Only run tests from the test directory, since we don't care about the
+# difference between transformed an untransformed code.
+build/test/*: SkipByDesign
+build/test/*/*: SkipByDesign
+build/test/*/*/*: SkipByDesign
+build/test/*/*/*/*: SkipByDesign
+
+# Don't run library files as tests
+lib/*: SkipByDesign
+lib/*/*: SkipByDesign
+lib/*/*/*: SkipByDesign
+lib/*/*/*/*: SkipByDesign
+
+# PhantomJS isn't supported on the bots (issue 23195).
+test/runner/browser/phantom_js: Skip
+
+test/runner/browser/loader_test: Pass, Slow
+
+[ $system != windows ]
+test/runner/browser/internet_explorer: SkipByDesign
+
+[ $system != macos ]
+test/runner/browser/safari: SkipByDesign
+
+# The test harness for browser tests doesn't play nicely with the new way of
+# doing browser tests.
+[ $browser ]
+test/*: SkipByDesign
+test/*/*: SkipByDesign
+test/*/*/*: SkipByDesign
+test/*/*/*/*: SkipByDesign
diff --git a/mojo/public/dart/third_party/test/CHANGELOG.md b/mojo/public/dart/third_party/test/CHANGELOG.md
new file mode 100644
index 0000000..cc9005b
--- /dev/null
+++ b/mojo/public/dart/third_party/test/CHANGELOG.md
@@ -0,0 +1,301 @@
+## 0.12.4+7
+
+* Support `http_parser` 1.0.0.
+
+## 0.12.4+6
+
+* Fix a broken link in the README.
+
+## 0.12.4+5
+
+* Internal changes only.
+
+## 0.12.4+4
+
+* Widen the Dart SDK constraint to include `1.13.0`.
+
+## 0.12.4+3
+
+* Make source maps work properly in the browser when not using `--pub-serve`.
+
+## 0.12.4+2
+
+* Fix a memory leak when running many browser tests where old test suites failed
+  to be unloaded when they were supposed to.
+
+## 0.12.4+1
+
+* Require Dart SDK >= `1.11.0` and `shelf` >= `0.6.0`, allowing `test` to remove
+  various hacks and workarounds.
+
+## 0.12.4
+
+* Add a `--pause-after-load` flag that pauses the test runner after each suite
+  is loaded so that breakpoints and other debugging annotations can be added.
+  Currently this is only supported on browsers.
+
+* Add a `Timeout.none` value indicating that a test should never time out.
+
+* The `dart-vm` platform selector variable is now `true` for Dartium and content
+  shell.
+
+* The compact reporter no longer prints status lines that only update the clock
+  if they would get in the way of messages or errors from a test.
+
+* The expanded reporter no longer double-prints the descriptions of skipped
+  tests.
+
+## 0.12.3+9
+
+* Widen the constraint on `analyzer` to include `0.26.0`.
+
+## 0.12.3+8
+
+* Fix an uncaught error that could crop up when killing the test runner process
+  at the wrong time.
+
+## 0.12.3+7
+
+* Add a missing dependency on the `collection` package.
+
+## 0.12.3+6
+
+**This version was unpublished due to [issue 287][].**
+
+* Properly report load errors caused by failing to start browsers.
+
+* Substantially increase browser timeouts. These timeouts are the cause of a lot
+  of flakiness, and now that they don't block test running there's less harm in
+  making them longer.
+
+## 0.12.3+5
+
+**This version was unpublished due to [issue 287][].**
+
+* Fix a crash when skipping tests because their platforms don't match.
+
+## 0.12.3+4
+
+**This version was unpublished due to [issue 287][].**
+
+* The compact reporter will update the timer every second, rather than only
+  updating it occasionally.
+
+* The compact reporter will now print the full, untruncated test name before any
+  errors or prints emitted by a test.
+
+* The expanded reporter will now *always* print the full, untruncated test name.
+
+## 0.12.3+3
+
+**This version was unpublished due to [issue 287][].**
+
+* Limit the number of test suites loaded at once. This helps ensure that the
+  test runner won't run out of memory when running many test suites that each
+  load a large amount of code.
+
+## 0.12.3+2
+
+**This version was unpublished due to [issue 287][].**
+
+[issue 287]: https://github.com/dart-lang/test/issues/287
+
+* Improve the display of syntax errors in VM tests.
+
+* Work around a [Firefox bug][]. Computed styles now work in tests on Firefox.
+
+[Firefox bug]: https://bugzilla.mozilla.org/show_bug.cgi?id=548397
+
+* Fix a bug where VM tests would be loaded from the wrong URLs on Windows (or in
+  special circumstances on other operating systems).
+
+## 0.12.3+1
+
+* Fix a bug that caused the test runner to crash on Windows because symlink
+  resolution failed.
+
+## 0.12.3
+
+* If a future matched against the `completes` or `completion()` matcher throws
+  an error, that error is printed directly rather than being wrapped in a
+  string. This allows such errors to be captured using the Zone API and improves
+  formatting.
+
+* Improve support for Polymer tests. This fixes a flaky time-out error and adds
+  support for Dartifying JavaScript stack traces when running Polymer tests via
+  `pub serve`.
+
+* In order to be more extensible, all exception handling within tests now uses
+  the Zone API.
+
+* Add a heartbeat to reset a test's timeout whenever the test interacts with the
+  test infrastructure.
+
+* `expect()`, `expectAsync()`, and `expectAsyncUntil()` throw more useful errors
+  if called outside a test body.
+
+## 0.12.2
+
+* Convert JavaScript stack traces into Dart stack traces using source maps. This
+  can be disabled with the new `--js-trace` flag.
+
+* Improve the browser test suite timeout logic to avoid timeouts when running
+  many browser suites at once.
+
+## 0.12.1
+
+* Add a `--verbose-trace` flag to include core library frames in stack traces.
+
+## 0.12.0
+
+### Test Runner
+
+`0.12.0` adds support for a test runner, which can be run via `pub run
+test:test` (or `pub run test` in Dart 1.10). By default it runs all files
+recursively in the `test/` directory that end in `_test.dart` and aren't in a
+`packages/` directory.
+
+The test runner supports running tests on the Dart VM and many different
+browsers. Test files can use the `@TestOn` annotation to declare which platforms
+they support. For more information on this and many more new features, see [the
+README](README).
+
+[README]: https://github.com/dart-lang/test/blob/master/README.md
+
+### Removed and Changed APIs
+
+As part of moving to a runner-based model, most test configuration is moving out
+of the test file and into the runner. As such, many ancillary APIs have been
+removed. These APIs include `skip_` and `solo_` functions, `Configuration` and
+all its subclasses, `TestCase`, `TestFunction`, `testConfiguration`,
+`formatStacks`, `filterStacks`, `groupSep`, `logMessage`, `testCases`,
+`BREATH_INTERVAL`, `currentTestCase`, `PASS`, `FAIL`, `ERROR`, `filterTests`,
+`runTests`, `ensureInitialized`, `setSoloTest`, `enableTest`, `disableTest`, and
+`withTestEnvironment`.
+
+`FailureHandler`, `DefaultFailureHandler`, `configureExpectFailureHandler`, and
+`getOrCreateExpectFailureHandler` which used to be exported from the `matcher`
+package have also been removed. They existed to enable integration between
+`test` and `matcher` that has been streamlined.
+
+A number of APIs from `matcher` have been into `test`, including: `completes`,
+`completion`, `ErrorFormatter`, `expect`,`fail`, `prints`, `TestFailure`,
+`Throws`, and all of the `throws` methods. Some of these have changed slightly:
+
+* `expect` no longer has a named `failureHandler` argument.
+
+* `expect` added an optional `formatter` argument.
+
+* `completion` argument `id` renamed to `description`.
+
+##0.11.5+1
+
+* Internal code cleanups and documentation improvements.
+
+##0.11.5
+
+* Bumped the version constraint for `matcher`.
+
+##0.11.4
+
+* Bump the version constraint for `matcher`.
+
+##0.11.3
+
+* Narrow the constraint on matcher to ensure that new features are reflected in
+  unittest's version.
+
+##0.11.2
+
+* Prints a warning instead of throwing an error when setting the test
+  configuration after it has already been set. The first configuration is always
+  used.
+
+##0.11.1+1
+
+* Fix bug in withTestEnvironment where test cases were not reinitialized if
+  called multiple times.
+
+##0.11.1
+
+* Add `reason` named argument to `expectAsync` and `expectAsyncUntil`, which has
+  the same definition as `expect`'s `reason` argument.
+* Added support for private test environments.
+
+##0.11.0+6
+
+* Refactored package tests.
+
+##0.11.0+5
+
+* Release test functions after each test is run.
+
+##0.11.0+4
+
+* Fix for [20153](https://code.google.com/p/dart/issues/detail?id=20153)
+
+##0.11.0+3
+
+* Updated maximum `matcher` version.
+
+##0.11.0+2
+
+*  Removed unused files from tests and standardized remaining test file names.
+
+##0.11.0+1
+
+* Widen the version constraint for `stack_trace`.
+
+##0.11.0
+
+* Deprecated methods have been removed:
+    * `expectAsync0`, `expectAsync1`, and `expectAsync2` - use `expectAsync`
+      instead
+    * `expectAsyncUntil0`, `expectAsyncUntil1`, and `expectAsyncUntil2` - use
+      `expectAsyncUntil` instead
+    * `guardAsync` - no longer needed
+    * `protectAsync0`, `protectAsync1`, and `protectAsync2` - no longer needed
+* `matcher.dart` and `mirror_matchers.dart` have been removed. They are now in
+  the `matcher` package.
+* `mock.dart` has been removed. It is now in the `mock` package.
+
+##0.10.1+2
+
+* Fixed deprecation message for `mock`.
+
+##0.10.1+1
+
+* Fixed CHANGELOG
+* Moved to triple-slash for all doc comments.
+
+##0.10.1
+
+* **DEPRECATED**
+    * `matcher.dart` and `mirror_matchers.dart` are now in the `matcher`
+      package.
+    * `mock.dart` is now in the `mock` package.
+* `equals` now allows a nested matcher as an expected list element or map value
+  when doing deep matching.
+* `expectAsync` and `expectAsyncUntil` now support up to 6 positional arguments
+  and correctly handle functions with optional positional arguments with default
+  values.
+
+##0.10.0
+
+* Each test is run in a separate `Zone`. This ensures that any exceptions that
+occur is async operations are reported back to the source test case.
+* **DEPRECATED** `guardAsync`, `protectAsync0`, `protectAsync1`,
+and `protectAsync2`
+    * Running each test in a `Zone` addresses the need for these methods.
+* **NEW!** `expectAsync` replaces the now deprecated `expectAsync0`,
+    `expectAsync1` and `expectAsync2`
+* **NEW!** `expectAsyncUntil` replaces the now deprecated `expectAsyncUntil0`,
+    `expectAsyncUntil1` and `expectAsyncUntil2`
+* `TestCase`:
+    * Removed properties: `setUp`, `tearDown`, `testFunction`
+    * `enabled` is now get-only
+    * Removed methods: `pass`, `fail`, `error`
+* `interactive_html_config.dart` has been removed.
+* `runTests`, `tearDown`, `setUp`, `test`, `group`, `solo_test`, and
+  `solo_group` now throw a `StateError` if called while tests are running.
+* `rerunTests` has been removed.
diff --git a/mojo/public/dart/third_party/test/CONTRIBUTING.md b/mojo/public/dart/third_party/test/CONTRIBUTING.md
new file mode 100644
index 0000000..ffe7d49
--- /dev/null
+++ b/mojo/public/dart/third_party/test/CONTRIBUTING.md
@@ -0,0 +1,50 @@
+Want to contribute? Great! First, read this page (including the small print at
+the end).
+
+### When you file a bug
+
+Please include the following information.
+
+* The version of Dart on your system.
+  You can do this by running `dart --version`.
+* The operation system you are running.
+* The version of the `test` package you are using.
+  You can get this by looking at the `pubspec.lock` file.
+
+```yaml
+  test:
+    description: test
+    source: hosted
+    version: "X.Y.Z"
+```
+
+### Before you contribute
+Before we can use your code, you must sign the
+[Google Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual)
+(CLA), which you can do online. The CLA is necessary mainly because you own the
+copyright to your changes, even after your contribution becomes part of our
+codebase, so we need your permission to use and distribute your code. We also
+need to be sure of various other things—for instance that you'll tell us if you
+know that your code infringes on other people's patents. You don't have to sign
+the CLA until after you've submitted your code for review and a member has
+approved it, but you must do it before we can put your code into our codebase.
+
+Before you start working on a larger contribution, you should get in touch with
+us first through the issue tracker with your idea so that we can help out and
+possibly guide you. Coordinating up front makes it much easier to avoid
+frustration later on.
+
+### Code reviews
+All submissions, including submissions by project members, require review.
+
+### File headers
+All files in the project must start with the following header.
+
+    // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+    // for details. All rights reserved. Use of this source code is governed by a
+    // BSD-style license that can be found in the LICENSE file.
+
+### The small print
+Contributions made by corporations are covered by a different agreement than the
+one above, the
+[Software Grant and Corporate Contributor License Agreement](https://developers.google.com/open-source/cla/corporate).
diff --git a/mojo/public/dart/third_party/test/LICENSE b/mojo/public/dart/third_party/test/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/mojo/public/dart/third_party/test/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/test/README.md b/mojo/public/dart/third_party/test/README.md
new file mode 100644
index 0000000..a1f9a36
--- /dev/null
+++ b/mojo/public/dart/third_party/test/README.md
@@ -0,0 +1,493 @@
+`test` provides a standard way of writing and running tests in Dart.
+
+## Writing Tests
+
+Tests are specified using the top-level [`test()`][test] function, and test
+assertions are made using [`expect()`][expect]:
+
+[test]: http://www.dartdocs.org/documentation/test/latest/index.html#test/test@id_test
+[expect]: http://www.dartdocs.org/documentation/test/latest/index.html#test/test@id_expect
+
+```dart
+import "package:test/test.dart";
+
+void main() {
+  test("String.split() splits the string on the delimiter", () {
+    var string = "foo,bar,baz";
+    expect(string.split(","), equals(["foo", "bar", "baz"]));
+  });
+
+  test("String.trim() removes surrounding whitespace", () {
+    var string = "  foo ";
+    expect(string.trim(), equals("foo"));
+  });
+}
+```
+
+Tests can be grouped together using the [`group()`] function. Each group's
+description is added to the beginning of its test's descriptions.
+
+```dart
+import "package:test/test.dart";
+
+void main() {
+  group("String", () {
+    test(".split() splits the string on the delimiter", () {
+      var string = "foo,bar,baz";
+      expect(string.split(","), equals(["foo", "bar", "baz"]));
+    });
+
+    test(".trim() removes surrounding whitespace", () {
+      var string = "  foo ";
+      expect(string.trim(), equals("foo"));
+    });
+  });
+
+  group("int", () {
+    test(".remainder() returns the remainder of division", () {
+      expect(11.remainder(3), equals(2));
+    });
+
+    test(".toRadixString() returns a hex string", () {
+      expect(11.toRadixString(16), equals("b"));
+    });
+  });
+}
+```
+
+Any matchers from the [`matcher`][matcher] package can be used with `expect()`
+to do complex validations:
+
+[matcher]: http://www.dartdocs.org/documentation/matcher/latest/index.html#matcher/matcher
+
+```dart
+import "package:test/test.dart";
+
+void main() {
+  test(".split() splits the string on the delimiter", () {
+    expect("foo,bar,baz", allOf([
+      contains("foo"),
+      isNot(startsWith("bar")),
+      endsWith("baz")
+    ]));
+  });
+}
+```
+
+## Running Tests
+
+A single test file can be run just using `pub run test:test path/to/test.dart`
+(on Dart 1.10, this can be shortened to `pub run test path/to/test.dart`).
+
+![Single file being run via pub run"](https://raw.githubusercontent.com/dart-lang/test/master/image/test1.gif)
+
+Many tests can be run at a time using `pub run test:test path/to/dir`.
+
+![Directory being run via "pub run".](https://raw.githubusercontent.com/dart-lang/test/master/image/test2.gif)
+
+It's also possible to run a test on the Dart VM only by invoking it using `dart
+path/to/test.dart`, but this doesn't load the full test runner and will be
+missing some features.
+
+The test runner considers any file that ends with `_test.dart` to be a test
+file. If you don't pass any paths, it will run all the test files in your
+`test/` directory, making it easy to test your entire application at once.
+
+By default, tests are run in the Dart VM, but you can run them in the browser as
+well by passing `pub run test:test -p chrome path/to/test.dart`.
+`test` will take care of starting the browser and loading the tests, and all
+the results will be reported on the command line just like for VM tests. In
+fact, you can even run tests on both platforms with a single command: `pub run
+test:test -p "chrome,vm" path/to/test.dart`.
+
+### Restricting Tests to Certain Platforms
+
+Some test files only make sense to run on particular platforms. They may use
+`dart:html` or `dart:io`, they might test Windows' particular filesystem
+behavior, or they might use a feature that's only available in Chrome. The
+[`@TestOn`][TestOn] annotation makes it easy to declare exactly which platforms
+a test file should run on. Just put it at the top of your file, before any
+`library` or `import` declarations:
+
+```dart
+@TestOn("vm")
+
+import "dart:io";
+
+import "package:test/test.dart";
+
+void main() {
+  // ...
+}
+```
+
+[TestOn]: http://www.dartdocs.org/documentation/test/latest/index.html#test/test.TestOn
+
+The string you pass to `@TestOn` is what's called a "platform selector", and it
+specifies exactly which platforms a test can run on. It can be as simple as the
+name of a platform, or a more complex Dart-like boolean expression involving
+these platform names.
+
+### Platform Selector Syntax
+
+Platform selectors can contain identifiers, parentheses, and operators. When
+loading a test, each identifier is set to `true` or `false` based on the current
+platform, and the test is only loaded if the platform selector returns `true`.
+The operators `||`, `&&`, `!`, and `? :` all work just like they do in Dart. The
+valid identifiers are:
+
+* `vm`: Whether the test is running on the command-line Dart VM.
+
+* `dartium`: Whether the test is running on Dartium.
+
+* `content-shell`: Whether the test is running on the headless Dartium content
+  shell.
+
+* `chrome`: Whether the test is running on Google Chrome.
+
+* `phantomjs`: Whether the test is running on
+  [PhantomJS](http://phantomjs.org/).
+
+* `firefox`: Whether the test is running on Mozilla Firefox.
+
+* `safari`: Whether the test is running on Apple Safari.
+
+* `ie`: Whether the test is running on Microsoft Internet Explorer.
+
+* `dart-vm`: Whether the test is running on the Dart VM in any context,
+  including Dartium. It's identical to `!js`.
+
+* `browser`: Whether the test is running in any browser.
+
+* `js`: Whether the test has been compiled to JS. This is identical to
+  `!dart-vm`.
+
+* `blink`: Whether the test is running in a browser that uses the Blink
+  rendering engine.
+
+* `windows`: Whether the test is running on Windows. If `vm` is false, this will
+  be `false` as well.
+
+* `mac-os`: Whether the test is running on Mac OS. If `vm` is false, this will
+  be `false` as well.
+
+* `linux`: Whether the test is running on Linux. If `vm` is false, this will be
+  `false` as well.
+
+* `android`: Whether the test is running on Android. If `vm` is false, this will
+  be `false` as well, which means that this *won't* be true if the test is
+  running on an Android browser.
+
+* `posix`: Whether the test is running on a POSIX operating system. This is
+  equivalent to `!windows`.
+
+For example, if you wanted to run a test on every browser but Chrome, you would
+write `@TestOn("browser && !chrome")`.
+
+### Running Tests on Dartium
+
+Tests can be run on [Dartium][] by passing the `-p dartium` flag. If you're
+using the Dart Editor, the test runner will be able to find Dartium
+automatically. On Mac OS, you can also [install it using Homebrew][homebrew].
+Otherwise, make sure there's an executable called `dartium` (on Mac OS or Linux)
+or `dartium.exe` (on Windows) on your system path.
+
+[Dartium]: https://www.dartlang.org/tools/dartium/
+[homebrew]: https://github.com/dart-lang/homebrew-dart
+
+Similarly, tests can be run on the headless Dartium content shell by passing `-p
+content-shell`. The content shell is installed along with Dartium when using
+Homebrew. Otherwise, you can downloaded it manually [from this
+page][content_shell]; if you do, make sure the executable named `content_shell`
+(on Mac OS or Linux) or `content_shell.exe` (on Windows) is on your system path.
+
+[content_shell]: http://gsdview.appspot.com/dart-archive/channels/stable/release/latest/dartium/
+
+[In the future][issue 63], there will be a more explicit way to configure the
+location of both the Dartium and content shell executables.
+
+[issue 63]: https://github.com/dart-lang/test/issues/63
+
+## Asynchronous Tests
+
+Tests written with `async`/`await` will work automatically. The test runner
+won't consider the test finished until the returned `Future` completes.
+
+```dart
+import "dart:async";
+
+import "package:test/test.dart";
+
+void main() {
+  test("new Future.value() returns the value", () async {
+    var value = await new Future.value(10);
+    expect(value, equals(10));
+  });
+}
+```
+
+There are also a number of useful functions and matchers for more advanced
+asynchrony. The [`completion()`][completion] matcher can be used to test
+`Futures`; it ensures that the test doesn't finish until the `Future` completes,
+and runs a matcher against that `Future`'s value.
+
+[completion]: http://www.dartdocs.org/documentation/test/latest/index.html#test/test@id_completion
+
+```dart
+import "dart:async";
+
+import "package:test/test.dart";
+
+void main() {
+  test("new Future.value() returns the value", () {
+    expect(new Future.value(10), completion(equals(10)));
+  });
+}
+```
+
+The [`throwsA()`][throwsA] matcher and the various `throwsExceptionType`
+matchers work with both synchronous callbacks and asynchronous `Future`s. They
+ensure that a particular type of exception is thrown:
+
+[throwsA]: http://www.dartdocs.org/documentation/test/latest/index.html#test/test@id_throwsA
+
+```dart
+import "dart:async";
+
+import "package:test/test.dart";
+
+void main() {
+  test("new Future.error() throws the error", () {
+    expect(new Future.error("oh no"), throwsA(equals("oh no")));
+    expect(new Future.error(new StateError("bad state")), throwsStateError);
+  });
+}
+```
+
+The [`expectAsync()`][expectAsync] function wraps another function and has two
+jobs. First, it asserts that the wrapped function is called a certain number of
+times, and will cause the test to fail if it's called too often; second, it
+keeps the test from finishing until the function is called the requisite number
+of times.
+
+```dart
+import "dart:async";
+
+import "package:test/test.dart";
+
+void main() {
+  test("Stream.fromIterable() emits the values in the iterable", () {
+    var stream = new Stream.fromIterable([1, 2, 3]);
+
+    stream.listen(expectAsync((number) {
+      expect(number, inInclusiveRange(1, 3));
+    }, count: 3));
+  });
+}
+```
+
+[expectAsync]: http://www.dartdocs.org/documentation/test/latest/index.html#test/test@id_expectAsync
+
+## Running Tests with Custom HTML
+
+By default, the test runner will generate its own empty HTML file for browser
+tests. However, tests that need custom HTML can create their own files. These
+files have three requirements:
+
+* They must have the same name as the test, with `.dart` replaced by `.html`.
+
+* They must contain a `link` tag with `rel="x-dart-test"` and an `href`
+  attribute pointing to the test script.
+
+* They must contain `<script src="packages/test/dart.js"></script>`.
+
+For example, if you had a test called `custom_html_test.dart`, you might write
+the following HTML file:
+
+```html
+<!doctype html>
+<!-- custom_html_test.html -->
+<html>
+  <head>
+    <title>Custom HTML Test</title>
+    <link rel="x-dart-test" href="custom_html_test.dart">
+    <script src="packages/test/dart.js"></script>
+  </head>
+  <body>
+    // ...
+  </body>
+</html>
+```
+
+## Configuring Tests
+
+### Skipping Tests
+
+If a test, group, or entire suite isn't working yet and you just want it to stop
+complaining, you can mark it as "skipped". The test or tests won't be run, and,
+if you supply a reason why, that reason will be printed. In general, skipping
+tests indicates that they should run but is temporarily not working. If they're
+is fundamentally incompatible with a platform, [`@TestOn`/`testOn`][TestOn]
+should be used instead.
+
+[TestOn]: #restricting-tests-to-certain-platforms
+
+To skip a test suite, put a `@Skip` annotation at the top of the file:
+
+```dart
+@Skip("currently failing (see issue 1234)")
+
+import "package:test/test.dart";
+
+void main() {
+  // ...
+}
+```
+
+The string you pass should describe why the test is skipped. You don't have to
+include it, but it's a good idea to document why the test isn't running.
+
+Groups and individual tests can be skipped by passing the `skip` parameter. This
+can be either `true` or a String describing why the test is skipped. For example:
+
+```dart
+import "package:test/test.dart";
+
+void main() {
+  group("complicated algorithm tests", () {
+    // ...
+  }, skip: "the algorithm isn't quite right");
+
+  test("error-checking test", () {
+    // ...
+  }, skip: "TODO: add error-checking.");
+}
+```
+
+### Timeouts
+
+By default, tests will time out after 30 seconds of inactivity. However, this
+can be configured on a per-test, -group, or -suite basis. To change the timeout
+for a test suite, put a `@Timeout` annotation at the top of the file:
+
+```dart
+@Timeout(const Duration(seconds: 45))
+
+import "package:test/test.dart";
+
+void main() {
+  // ...
+}
+```
+
+In addition to setting an absolute timeout, you can set the timeout relative to
+the default using `@Timeout.factor`. For example, `@Timeout.factor(1.5)` will
+set the timeout to one and a half times as long as the default—45 seconds.
+
+Timeouts can be set for tests and groups using the `timeout` parameter. This
+parameter takes a `Timeout` object just like the annotation. For example:
+
+```dart
+import "package:test/test.dart";
+
+void main() {
+  group("slow tests", () {
+    // ...
+
+    test("even slower test", () {
+      // ...
+    }, timeout: new Timeout.factor(2))
+  }, timeout: new Timeout(new Duration(minutes: 1)));
+}
+```
+
+Nested timeouts apply in order from outermost to innermost. That means that
+"even slower test" will take two minutes to time out, since it multiplies the
+group's timeout by 2.
+
+### Platform-Specific Configuration
+
+Sometimes a test may need to be configured differently for different platforms.
+Windows might run your code slower than other platforms, or your DOM
+manipulation might not work right on Safari yet. For these cases, you can use
+the `@OnPlatform` annotation and the `onPlatform` named parameter to `test()`
+and `group()`. For example:
+
+```dart
+@OnPlatform(const {
+  // Give Windows some extra wiggle-room before timing out.
+  "windows": const Timeout.factor(2)
+})
+
+import "package:test/test.dart";
+
+void main() {
+  test("do a thing", () {
+    // ...
+  }, onPlatform: {
+    "safari": new Skip("Safari is currently broken (see #1234)")
+  });
+}
+```
+
+Both the annotation and the parameter take a map. The map's keys are [platform
+selectors](#platform-selector-syntax) which describe the platforms for which the
+specialized configuration applies. Its values are instances of some of the same
+annotation classes that can be used for a suite: `Skip` and `Timeout`. A value
+can also be a list of these values.
+
+If multiple platforms match, the configuration is applied in order from first to
+last, just as they would in nested groups. This means that for configuration
+like duration-based timeouts, the last matching value wins.
+
+## Testing With `barback`
+
+Packages using the `barback` transformer system may need to test code that's
+created or modified using transformers. The test runner handles this using the
+`--pub-serve` option, which tells it to load the test code from a `pub serve`
+instance rather than from the filesystem.
+
+Before using the `--pub-serve` option, add the `test/pub_serve` transformer to
+your `pubspec.yaml`. This transformer adds the necessary bootstrapping code that
+allows the test runner to load your tests properly:
+
+```yaml
+transformers:
+- test/pub_serve:
+    $include: test/**_test{.*,}.dart
+```
+
+Note that if you're using the test runner along with [`polymer`][polymer], you
+have to make sure that the `test/pub_serve` transformer comes *after* the
+`polymer` transformer:
+
+[polymer]: https://www.dartlang.org/polymer/
+
+```yaml
+transformers:
+- polymer
+- test/pub_serve:
+    $include: test/**_test{.*,}.dart
+```
+
+Then, start up `pub serve`. Make sure to pay attention to which port it's using
+to serve your `test/` directory:
+
+```shell
+$ pub serve
+Loading source assets...
+Loading test/pub_serve transformers...
+Serving my_app web on http://localhost:8080
+Serving my_app test on http://localhost:8081
+Build completed successfully
+```
+
+In this case, the port is `8081`. In another terminal, pass this port to
+`--pub-serve` and otherwise invoke `pub run test:test` as normal:
+
+```shell
+$ pub run test:test --pub-serve=8081 -p chrome
+"pub serve" is compiling test/my_app_test.dart...
+"pub serve" is compiling test/utils_test.dart...
+00:00 +42: All tests passed!
+```
diff --git a/mojo/public/dart/third_party/test/bin/test.dart b/mojo/public/dart/third_party/test/bin/test.dart
new file mode 100644
index 0000000..0b40282
--- /dev/null
+++ b/mojo/public/dart/third_party/test/bin/test.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+export 'package:test/src/executable.dart';
diff --git a/mojo/public/dart/third_party/test/codereview.settings b/mojo/public/dart/third_party/test/codereview.settings
new file mode 100644
index 0000000..ce6ed75
--- /dev/null
+++ b/mojo/public/dart/third_party/test/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: https://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/test/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/test/image/test1.gif b/mojo/public/dart/third_party/test/image/test1.gif
new file mode 100644
index 0000000..5d09eed
--- /dev/null
+++ b/mojo/public/dart/third_party/test/image/test1.gif
Binary files differ
diff --git a/mojo/public/dart/third_party/test/image/test2.gif b/mojo/public/dart/third_party/test/image/test2.gif
new file mode 100644
index 0000000..cbd83b0
--- /dev/null
+++ b/mojo/public/dart/third_party/test/image/test2.gif
Binary files differ
diff --git a/mojo/public/dart/third_party/test/lib/dart.js b/mojo/public/dart/third_party/test/lib/dart.js
new file mode 100644
index 0000000..be430d0
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/dart.js
@@ -0,0 +1,69 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This script runs in HTML files and loads the corresponding test scripts for
+// either Dartium or a JS browser. It's used by "pub serve" and user-authored
+// HTML files; when running without "pub serve", the default HTML file manually
+// chooses between serving a Dart or JS script tag.
+window.onload = function() {
+
+// Sends an error message to the server indicating that the script failed to
+// load.
+//
+// This mimics a MultiChannel-formatted message.
+var sendLoadException = function(message) {
+  window.parent.postMessage({
+    "href": window.location.href,
+    "data": [0, {"type": "loadException", "message": message}]
+  }, window.location.origin);
+}
+
+// The basename of the current page.
+var name = window.location.href.replace(/.*\//, '').replace(/#.*/, '');
+
+// Find <link rel="x-dart-test">.
+var links = document.getElementsByTagName("link");
+var testLinks = [];
+var length = links.length;
+for (var i = 0; i < length; ++i) {
+  if (links[i].rel == "x-dart-test") testLinks.push(links[i]);
+}
+
+if (testLinks.length != 1) {
+  sendLoadException(
+      'Expected exactly 1 <link rel="x-dart-test"> in ' + name + ', found ' +
+          testLinks.length + '.');
+  return;
+}
+
+var link = testLinks[0];
+
+if (link.href == '') {
+  sendLoadException(
+      'Expected <link rel="x-dart-test"> in ' + name + ' to have an "href" ' +
+          'attribute.');
+  return;
+}
+
+var script = document.createElement('script');
+
+// Load the compiled JS for a normal browser, and the Dart code for Dartium.
+if (navigator.userAgent.indexOf('(Dart)') === -1) {
+  script.src = link.href + '.browser_test.dart.js';
+} else {
+  script.src = link.href + '.browser_test.dart';
+  script.type = 'application/dart';
+}
+
+script.onerror = function(event) {
+  var message = "Failed to load script at " + script.src +
+      (event.message ? ": " + event.message : ".");
+  sendLoadException(message);
+}
+
+var parent = link.parentNode;
+document.currentScript = script;
+parent.replaceChild(script, link);
+
+};
diff --git a/mojo/public/dart/third_party/test/lib/pub_serve.dart b/mojo/public/dart/third_party/test/lib/pub_serve.dart
new file mode 100644
index 0000000..cf96c13
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/pub_serve.dart
@@ -0,0 +1,72 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as p;
+
+/// A transformer that injects bootstrapping code used by the test runner to run
+/// tests against a "pub serve" instance.
+///
+/// This doesn't modify existing code at all, it just adds wrapper files that
+/// can be used to load isolates or iframes.
+class PubServeTransformer extends Transformer implements DeclaringTransformer {
+  final allowedExtensions = ".dart";
+
+  PubServeTransformer.asPlugin();
+
+  void declareOutputs(DeclaringTransform transform) {
+    var id = transform.primaryId;
+    transform.declareOutput(id.addExtension('.vm_test.dart'));
+    transform.declareOutput(id.addExtension('.browser_test.dart'));
+  }
+
+  Future apply(Transform transform) async {
+    var id = transform.primaryInput.id;
+
+    transform.addOutput(
+        new Asset.fromString(id.addExtension('.vm_test.dart'), '''
+import "package:test/src/backend/metadata.dart";
+import "package:test/src/runner/vm/isolate_listener.dart";
+
+import "${p.url.basename(id.path)}" as test;
+
+void main(_, Map message) {
+  var sendPort = message['reply'];
+  var metadata = new Metadata.deserialize(message['metadata']);
+  IsolateListener.start(sendPort, metadata, () => test.main);
+}
+'''));
+
+    transform.addOutput(
+        new Asset.fromString(id.addExtension('.browser_test.dart'), '''
+import "package:test/src/runner/browser/iframe_listener.dart";
+
+import "${p.url.basename(id.path)}" as test;
+
+void main() {
+  IframeListener.start(() => test.main);
+}
+'''));
+
+    // If the user has their own HTML file for the test, let that take
+    // precedence. Otherwise, create our own basic file.
+    var htmlId = id.changeExtension('.html');
+    if (await transform.hasInput(htmlId)) return;
+
+    transform.addOutput(
+        new Asset.fromString(htmlId, '''
+<!DOCTYPE html>
+<html>
+<head>
+  <title>${HTML_ESCAPE.convert(id.path)} Test</title>
+  <link rel="x-dart-test" href="${HTML_ESCAPE.convert(p.url.basename(id.path))}">
+  <script src="packages/test/dart.js"></script>
+</head>
+</html>
+'''));
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/backend/closed_exception.dart b/mojo/public/dart/third_party/test/lib/src/backend/closed_exception.dart
new file mode 100644
index 0000000..0c9dcca
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/backend/closed_exception.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.backend.closed_exception;
+
+/// An exception thrown by various front-end methods when the test framework has
+/// been closed and a test must shut down as soon as possible.
+class ClosedException implements Exception {
+  ClosedException();
+
+  String toString() => "This test has been closed.";
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/backend/declarer.dart b/mojo/public/dart/third_party/test/lib/src/backend/declarer.dart
new file mode 100644
index 0000000..d2e2c4f
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/backend/declarer.dart
@@ -0,0 +1,93 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.backend.declarer;
+
+import 'dart:collection';
+
+import '../frontend/timeout.dart';
+import 'group.dart';
+import 'invoker.dart';
+import 'metadata.dart';
+import 'test.dart';
+
+/// A class that manages the state of tests as they're declared.
+///
+/// This is in charge of tracking the current group, set-up, and tear-down
+/// functions. It produces a list of runnable [tests].
+class Declarer {
+  /// The current group.
+  var _group = new Group.root();
+
+  /// The list of tests that have been defined.
+  List<Test> get tests => new UnmodifiableListView<Test>(_tests);
+  final _tests = new List<Test>();
+
+  Declarer();
+
+  /// Defines a test case with the given description and body.
+  void test(String description, body(), {String testOn, Timeout timeout,
+      skip, Map<String, dynamic> onPlatform}) {
+    // TODO(nweiz): Once tests have begun running, throw an error if [test] is
+    // called.
+    var prefix = _group.description;
+    if (prefix != null) description = "$prefix $description";
+
+    var metadata = _group.metadata.merge(new Metadata.parse(
+        testOn: testOn, timeout: timeout, skip: skip, onPlatform: onPlatform));
+
+    var group = _group;
+    _tests.add(new LocalTest(description, metadata, () {
+      // TODO(nweiz): It might be useful to throw an error here if a test starts
+      // running while other tests from the same declarer are also running,
+      // since they might share closurized state.
+
+      // TODO(nweiz): Use async/await here once issue 23497 has been fixed in
+      // two stable versions.
+      return group.runSetUp().then((_) => body());
+    }, tearDown: group.runTearDown));
+  }
+
+  /// Creates a group of tests.
+  void group(String description, void body(), {String testOn,
+      Timeout timeout, skip, Map<String, dynamic> onPlatform}) {
+    var oldGroup = _group;
+
+    var metadata = new Metadata.parse(
+        testOn: testOn, timeout: timeout, skip: skip, onPlatform: onPlatform);
+
+    // Don' load the tests for a skipped group.
+    if (metadata.skip) {
+      _tests.add(new LocalTest(description, metadata, () {}));
+      return;
+    }
+
+    _group = new Group(oldGroup, description, metadata);
+    try {
+      body();
+    } finally {
+      _group = oldGroup;
+    }
+  }
+
+  /// Registers a function to be run before tests.
+  void setUp(callback()) {
+    if (_group.setUp != null) {
+      throw new StateError("setUp() may not be called multiple times for the "
+          "same group.");
+    }
+
+    _group.setUp = callback;
+  }
+
+  /// Registers a function to be run after tests.
+  void tearDown(callback()) {
+    if (_group.tearDown != null) {
+      throw new StateError("tearDown() may not be called multiple times for "
+          "the same group.");
+    }
+
+    _group.tearDown = callback;
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/backend/group.dart b/mojo/public/dart/third_party/test/lib/src/backend/group.dart
new file mode 100644
index 0000000..69144c6
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/backend/group.dart
@@ -0,0 +1,88 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.backend.group;
+
+import 'dart:async';
+
+import '../utils.dart';
+import 'metadata.dart';
+
+/// A group contains multiple tests and subgroups.
+///
+/// A group has a description that is prepended to that of all nested tests and
+/// subgroups. It also has [setUp] and [tearDown] functions which are scoped to
+/// the tests and groups it contains.
+class Group {
+  /// The parent group, or `null` if this is the root group.
+  final Group parent;
+
+  /// The description of the current test group, or `null` if this is the root
+  /// group.
+  final String _description;
+
+  /// The metadata for this group, including the metadata of any parent groups.
+  Metadata get metadata {
+    if (parent == null) return _metadata;
+    return parent.metadata.merge(_metadata);
+  }
+  final Metadata _metadata;
+
+  /// The set-up function for this group, or `null`.
+  AsyncFunction setUp;
+
+  /// The tear-down function for this group, or `null`.
+  AsyncFunction tearDown;
+
+  /// Returns the description for this group, including the description of any
+  /// parent groups.
+  ///
+  /// If this is the root group, returns `null`.
+  String get description {
+    if (parent == null || parent.description == null) return _description;
+    return "${parent.description} $_description";
+  }
+
+  /// Creates a new root group.
+  ///
+  /// This is the implicit group that exists outside of any calls to `group()`.
+  Group.root()
+      : this(null, null, new Metadata());
+
+  Group(this.parent, this._description, this._metadata);
+
+  /// Run the set-up functions for this and any parent groups.
+  ///
+  /// If no set-up functions are declared, this returns a [Future] that
+  /// completes immediately.
+  Future runSetUp() {
+    // TODO(nweiz): Use async/await here once issue 23497 has been fixed in two
+    // stable versions.
+    if (parent != null) {
+      return parent.runSetUp().then((_) {
+        if (setUp != null) return setUp();
+      });
+    }
+
+    if (setUp != null) return new Future.sync(setUp);
+    return new Future.value();
+  }
+
+  /// Run the tear-up functions for this and any parent groups.
+  ///
+  /// If no set-up functions are declared, this returns a [Future] that
+  /// completes immediately.
+  Future runTearDown() {
+    // TODO(nweiz): Use async/await here once issue 23497 has been fixed in two
+    // stable versions.
+    if (parent != null) {
+      return new Future.sync(() {
+        if (tearDown != null) return tearDown();
+      }).then((_) => parent.runTearDown());
+    }
+
+    if (tearDown != null) return new Future.sync(tearDown);
+    return new Future.value();
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/backend/invoker.dart b/mojo/public/dart/third_party/test/lib/src/backend/invoker.dart
new file mode 100644
index 0000000..86b5a0c
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/backend/invoker.dart
@@ -0,0 +1,266 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.backend.invoker;
+
+import 'dart:async';
+
+import 'package:stack_trace/stack_trace.dart';
+
+import '../frontend/expect.dart';
+import '../utils.dart';
+import 'closed_exception.dart';
+import 'live_test.dart';
+import 'live_test_controller.dart';
+import 'metadata.dart';
+import 'outstanding_callback_counter.dart';
+import 'state.dart';
+import 'suite.dart';
+import 'test.dart';
+
+/// A test in this isolate.
+class LocalTest implements Test {
+  final String name;
+  final Metadata metadata;
+
+  /// The test body.
+  final AsyncFunction _body;
+
+  /// The callback used to clean up after the test.
+  ///
+  /// This is separated out from [_body] because it needs to run once the test's
+  /// asynchronous computation has finished, even if that's different from the
+  /// completion of the main body of the test.
+  final AsyncFunction _tearDown;
+
+  LocalTest(this.name, this.metadata, body(), {tearDown()})
+      : _body = body,
+        _tearDown = tearDown;
+
+  /// Loads a single runnable instance of this test.
+  LiveTest load(Suite suite) {
+    var invoker = new Invoker._(suite, this);
+    return invoker.liveTest;
+  }
+
+  Test change({String name, Metadata metadata}) {
+    if (name == name && metadata == this.metadata) return this;
+    if (name == null) name = this.name;
+    if (metadata == null) metadata = this.metadata;
+    return new LocalTest(name, metadata, _body, tearDown: _tearDown);
+  }
+}
+
+/// The class responsible for managing the lifecycle of a single local test.
+///
+/// The current invoker is accessible within the zone scope of the running test
+/// using [Invoker.current]. It's used to track asynchronous callbacks and
+/// report asynchronous errors.
+class Invoker {
+  /// The live test being driven by the invoker.
+  ///
+  /// This provides a view into the state of the test being executed.
+  LiveTest get liveTest => _controller.liveTest;
+  LiveTestController _controller;
+
+  /// Whether the test has been closed.
+  ///
+  /// Once the test is closed, [expect] and [expectAsync] will throw
+  /// [ClosedException]s whenever accessed to help the test stop executing as
+  /// soon as possible.
+  bool get closed => _onCloseCompleter.isCompleted;
+
+  /// A future that completes once the test has been closed.
+  Future get onClose => _onCloseCompleter.future;
+  final _onCloseCompleter = new Completer();
+
+  /// The test being run.
+  LocalTest get _test => liveTest.test as LocalTest;
+
+  /// The test metadata merged with the suite metadata.
+  final Metadata metadata;
+
+  /// The outstanding callback counter for the current zone.
+  OutstandingCallbackCounter get _outstandingCallbacks {
+    var counter = Zone.current[this];
+    if (counter != null) return counter;
+    throw new StateError("Can't add or remove outstanding callbacks outside "
+        "of a test body.");
+  }
+
+  /// The current invoker, or `null` if none is defined.
+  ///
+  /// An invoker is only set within the zone scope of a running test.
+  static Invoker get current {
+    // TODO(nweiz): Use a private symbol when dart2js supports it (issue 17526).
+    return Zone.current[#test.invoker];
+  }
+
+  /// The zone that the top level of [_test.body] is running in.
+  ///
+  /// Tracking this ensures that [_timeoutTimer] isn't created in a
+  /// timer-mocking zone created by the test.
+  Zone _invokerZone;
+
+  /// The timer for tracking timeouts.
+  ///
+  /// This will be `null` until the test starts running.
+  Timer _timeoutTimer;
+
+  Invoker._(Suite suite, LocalTest test)
+      : metadata = suite.metadata.merge(test.metadata) {
+    _controller = new LiveTestController(
+        suite, test, _onRun, _onCloseCompleter.complete);
+  }
+
+  /// Tells the invoker that there's a callback running that it should wait for
+  /// before considering the test successful.
+  ///
+  /// Each call to [addOutstandingCallback] should be followed by a call to
+  /// [removeOutstandingCallback] once the callbak is no longer running. Note
+  /// that only successful tests wait for outstanding callbacks; as soon as a
+  /// test experiences an error, any further calls to [addOutstandingCallback]
+  /// or [removeOutstandingCallback] will do nothing.
+  ///
+  /// Throws a [ClosedException] if this test has been closed.
+  void addOutstandingCallback() {
+    if (closed) throw new ClosedException();
+    _outstandingCallbacks.addOutstandingCallback();
+  }
+
+  /// Tells the invoker that a callback declared with [addOutstandingCallback]
+  /// is no longer running.
+  void removeOutstandingCallback() {
+    heartbeat();
+    _outstandingCallbacks.removeOutstandingCallback();
+  }
+
+  /// Removes all outstanding callbacks, for example when an error occurs.
+  ///
+  /// Future calls to [addOutstandingCallback] and [removeOutstandingCallback]
+  /// will be ignored.
+  void removeAllOutstandingCallbacks() =>
+      _outstandingCallbacks.removeAllOutstandingCallbacks();
+
+  /// Runs [fn] and returns once all (registered) outstanding callbacks it
+  /// transitively invokes have completed.
+  ///
+  /// If [fn] itself returns a future, this will automatically wait until that
+  /// future completes as well.
+  ///
+  /// Note that outstanding callbacks registered within [fn] will *not* be
+  /// registered as outstanding callback outside of [fn].
+  Future waitForOutstandingCallbacks(fn()) {
+    heartbeat();
+
+    var counter = new OutstandingCallbackCounter();
+    runZoned(() {
+      // TODO(nweiz): Use async/await here once issue 23497 has been fixed in
+      // two stable versions.
+      new Future.sync(fn).then((_) => counter.removeOutstandingCallback());
+    }, zoneValues: {
+      // Use the invoker as a key so that multiple invokers can have different
+      // outstanding callback counters at once.
+      this: counter
+    });
+
+    return counter.noOutstandingCallbacks;
+  }
+
+  /// Notifies the invoker that progress is being made.
+  ///
+  /// Each heartbeat resets the timeout timer. This helps ensure that
+  /// long-running tests that still make progress don't time out.
+  void heartbeat() {
+    if (liveTest.isComplete) return;
+    if (_timeoutTimer != null) _timeoutTimer.cancel();
+
+    var timeout = metadata.timeout.apply(new Duration(seconds: 30));
+    if (timeout == null) return;
+    _timeoutTimer = _invokerZone.createTimer(timeout,
+        Zone.current.bindCallback(() {
+      if (liveTest.isComplete) return;
+      _handleError(
+          new TimeoutException(
+              "Test timed out after ${niceDuration(timeout)}.", timeout));
+    }));
+  }
+
+  /// Notifies the invoker of an asynchronous error.
+  void _handleError(error, [StackTrace stackTrace]) {
+    if (stackTrace == null) stackTrace = new Chain.current();
+
+    var afterSuccess = liveTest.isComplete &&
+        liveTest.state.result == Result.success;
+
+    if (error is! TestFailure) {
+      _controller.setState(const State(Status.complete, Result.error));
+    } else if (liveTest.state.result != Result.error) {
+      _controller.setState(const State(Status.complete, Result.failure));
+    }
+
+    _controller.addError(error, stackTrace);
+    removeAllOutstandingCallbacks();
+
+    // If a test was marked as success but then had an error, that indicates
+    // that it was poorly-written and could be flaky.
+    if (!afterSuccess) return;
+    _handleError(
+        "This test failed after it had already completed. Make sure to use "
+            "[expectAsync]\n"
+        "or the [completes] matcher when testing async code.",
+        stackTrace);
+  }
+
+  /// The method that's run when the test is started.
+  void _onRun() {
+    _controller.setState(const State(Status.running, Result.success));
+
+    var outstandingCallbacksForBody = new OutstandingCallbackCounter();
+
+    // TODO(nweiz): Use async/await here once issue 23497 has been fixed in two
+    // stable versions.
+    Chain.capture(() {
+      runZonedWithValues(() {
+        _invokerZone = Zone.current;
+
+        heartbeat();
+
+        // Run the test asynchronously so that the "running" state change has
+        // a chance to hit its event handler(s) before the test produces an
+        // error. If an error is emitted before the first state change is
+        // handled, we can end up with [onError] callbacks firing before the
+        // corresponding [onStateChange], which violates the timing
+        // guarantees.
+        new Future(_test._body)
+            .then((_) => removeOutstandingCallback());
+
+        _outstandingCallbacks.noOutstandingCallbacks.then((_) {
+          if (_test._tearDown == null) return null;
+
+          // Reset the outstanding callback counter to wait for callbacks from
+          // the test's `tearDown` to complete.
+          return waitForOutstandingCallbacks(() =>
+              runZoned(_test._tearDown, onError: _handleError));
+        }).then((_) {
+          if (_timeoutTimer != null) _timeoutTimer.cancel();
+          _controller.setState(
+              new State(Status.complete, liveTest.state.result));
+
+          // Use [Timer.run] here to avoid starving the DOM or other
+          // non-microtask events.
+          Timer.run(_controller.completer.complete);
+        });
+      }, zoneValues: {
+        #test.invoker: this,
+        // Use the invoker as a key so that multiple invokers can have different
+        // outstanding callback counters at once.
+        this: outstandingCallbacksForBody
+      },
+          zoneSpecification: new ZoneSpecification(
+              print: (self, parent, zone, line) => _controller.print(line)),
+          onError: _handleError);
+    });
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/backend/live_test.dart b/mojo/public/dart/third_party/test/lib/src/backend/live_test.dart
new file mode 100644
index 0000000..4cc917a
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/backend/live_test.dart
@@ -0,0 +1,126 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.backend.live_test;
+
+import 'dart:async';
+
+import 'state.dart';
+import 'suite.dart';
+import 'test.dart';
+
+/// A runnable instance of a test.
+///
+/// This is distinct from [Test] in order to keep [Test]. Running a test
+/// requires state, and [LiveTest] provides a view of the state of the test as
+/// it runs.
+///
+/// If the state changes, [state] will be updated before [onStateChange] fires.
+/// Likewise, if an error is caught, it will be added to [errors] before being
+/// emitted via [onError]. If an error causes a state change, [onStateChange]
+/// will fire before [onError]. If an error or other state change causes the
+/// test to complete, [onComplete] will complete after [onStateChange] and
+/// [onError] fire.
+abstract class LiveTest {
+  /// The suite within which this test is being run.
+  Suite get suite;
+
+  /// The running test.
+  Test get test;
+
+  /// The current state of the running test.
+  ///
+  /// This starts as [Status.pending] and [Result.success]. It will be updated
+  /// before [onStateChange] fires.
+  ///
+  /// Note that even if this is marked [Status.complete], the test may still be
+  /// running code asynchronously. A test is considered complete either once it
+  /// hits its first error or when all [expectAsync] callbacks have been called
+  /// and any returned [Future] has completed, but it's possible for further
+  /// processing to happen, which may cause further errors. It's even possible
+  /// for a test that was marked [Status.complete] and [Result.success] to be
+  /// marked as [Result.error] later.
+  State get state;
+
+  /// Returns whether this test has completed.
+  ///
+  /// This is equivalent to [state.status] being [Status.complete].
+  ///
+  /// Note that even if this returns `true`, the test may still be
+  /// running code asynchronously. A test is considered complete either once it
+  /// hits its first error or when all [expectAsync] callbacks have been called
+  /// and any returned [Future] has completed, but it's possible for further
+  /// processing to happen, which may cause further errors.
+  bool get isComplete => state.status == Status.complete;
+
+  // A stream that emits a new [State] whenever [state] changes.
+  //
+  // This will only ever emit a [State] if it's different than the previous
+  // [state]. It will emit an event after [state] has been updated. Note that
+  // since this is an asynchronous stream, it's possible for [state] not to
+  // match the [State] that it emits within the [Stream.listen] callback.
+  Stream<State> get onStateChange;
+
+  /// An unmodifiable list of all errors that have been caught while running
+  /// this test.
+  ///
+  /// This will be updated before [onError] fires. These errors are not
+  /// guaranteed to have the same types as when they were thrown; for example,
+  /// they may need to be serialized across isolate boundaries. The stack traces
+  /// will be [Chain]s.
+  List<AsyncError> get errors;
+
+  /// A stream that emits a new [AsyncError] whenever an error is caught.
+  ///
+  /// This will be emit an event after [errors] is updated. These errors are not
+  /// guaranteed to have the same types as when they were thrown; for example,
+  /// they may need to be serialized across isolate boundaries. The stack traces
+  /// will be [Chain]s.
+  Stream<AsyncError> get onError;
+
+  /// A stream that emits lines printed by the test.
+  Stream<String> onPrint;
+
+  /// A [Future] that completes once the test is complete.
+  ///
+  /// This will complete after [onStateChange] has fired, and after [onError]
+  /// has fired if the test completes because of an error. It's the same as the
+  /// [Future] returned by [run].
+  ///
+  /// Note that even once this completes, the test may still be running code
+  /// asynchronously. A test is considered complete either once it hits its
+  /// first error or when all [expectAsync] callbacks have been called and any
+  /// returned [Future] has completed, but it's possible for further processing
+  /// to happen, which may cause further errors.
+  Future get onComplete;
+
+  /// Signals that this test should start running as soon as possible.
+  ///
+  /// A test may not start running immediately for various reasons specific to
+  /// the means by which it's defined. Until it starts running, [state] will
+  /// continue to be marked [Status.pending].
+  ///
+  /// This returns the same [Future] as [onComplete]. It may not be called more
+  /// than once.
+  Future run();
+
+  /// Signals that this test should stop emitting events and release any
+  /// resources it may have allocated.
+  ///
+  /// Once [close] is called, [onComplete] will complete if it hasn't already
+  /// and [onStateChange] and [onError] will close immediately. This means that,
+  /// if the test was running at the time [close] is called, it will never emit
+  /// a [Status.complete] state-change event. Once a test is closed, [expect]
+  /// and [expectAsync] will throw a [ClosedException] to help the test
+  /// terminate as quickly as possible.
+  ///
+  /// This doesn't automatically happen after the test completes because there
+  /// may be more asynchronous work going on in the background that could
+  /// produce new errors.
+  ///
+  /// Returns a [Future] that completes once all resources are released *and*
+  /// the test has completed. This allows the caller to wait until the test's
+  /// tear-down logic has run.
+  Future close();
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/backend/live_test_controller.dart b/mojo/public/dart/third_party/test/lib/src/backend/live_test_controller.dart
new file mode 100644
index 0000000..f562c8e
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/backend/live_test_controller.dart
@@ -0,0 +1,194 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.backend.live_test_controller;
+
+import 'dart:async';
+import 'dart:collection';
+
+import 'package:stack_trace/stack_trace.dart';
+
+import 'live_test.dart';
+import 'state.dart';
+import 'suite.dart';
+import 'test.dart';
+
+/// An implementation of [LiveTest] that's controlled by a [LiveTestController].
+class _LiveTest extends LiveTest {
+  final LiveTestController _controller;
+
+  Suite get suite => _controller._suite;
+
+  Test get test => _controller._test;
+
+  State get state => _controller._state;
+
+  Stream<State> get onStateChange =>
+      _controller._onStateChangeController.stream;
+
+  List<AsyncError> get errors => new UnmodifiableListView(_controller._errors);
+
+  Stream<AsyncError> get onError => _controller._onErrorController.stream;
+
+  Stream<String> get onPrint => _controller._onPrintController.stream;
+
+  Future get onComplete => _controller.completer.future;
+
+  Future run() => _controller._run();
+
+  Future close() => _controller._close();
+
+  _LiveTest(this._controller);
+}
+
+/// A controller that drives a [LiveTest].
+///
+/// This is a utility class to make it easier for implementors of [Test] to
+/// create the [LiveTest] returned by [Test.load]. The [LiveTest] is accessible
+/// through [LiveTestController.liveTest].
+///
+/// This automatically handles some of [LiveTest]'s guarantees, but for the most
+/// part it's the caller's responsibility to make sure everything gets
+/// dispatched in the correct order.
+class LiveTestController {
+  /// The [LiveTest] controlled by [this].
+  LiveTest get liveTest => _liveTest;
+  LiveTest _liveTest;
+
+  /// The test suite that's running [this].
+  final Suite _suite;
+
+  /// The test that's being run.
+  final Test _test;
+
+  /// The function that will actually start the test running.
+  final Function _onRun;
+
+  /// A function to run when the test is closed.
+  ///
+  /// This may be `null`.
+  final Function _onClose;
+
+  /// The list of errors caught by the test.
+  final _errors = new List<AsyncError>();
+
+  /// The current state of the test.
+  var _state = const State(Status.pending, Result.success);
+
+  /// The controller for [LiveTest.onStateChange].
+  ///
+  /// This is synchronous to ensure that events are well-ordered across multiple
+  /// streams.
+  final _onStateChangeController = new StreamController<State>
+      .broadcast(sync: true);
+
+  /// The controller for [LiveTest.onError].
+  ///
+  /// This is synchronous to ensure that events are well-ordered across multiple
+  /// streams.
+  final _onErrorController = new StreamController<AsyncError>
+      .broadcast(sync: true);
+
+  /// The controller for [LiveTest.onPrint].
+  ///
+  /// This is synchronous to ensure that events are well-ordered across multiple
+  /// streams.
+  final _onPrintController = new StreamController<String>.broadcast(sync: true);
+
+  /// The completer for [LiveTest.onComplete];
+  final completer = new Completer();
+
+  /// Whether [run] has been called.
+  var _runCalled = false;
+
+  /// Whether [close] has been called.
+  bool get _isClosed => _onErrorController.isClosed;
+
+  /// Creates a new controller for a [LiveTest].
+  ///
+  /// [test] is the test being run; [suite] is the suite that contains it.
+  ///
+  /// [onRun] is a function that's called from [LiveTest.run]. It should start
+  /// the test running. The controller takes care of ensuring that
+  /// [LiveTest.run] isn't called more than once and that [LiveTest.onComplete]
+  /// is returned.
+  ///
+  /// [onClose] is a function that's called the first time [LiveTest.close] is
+  /// called. It should clean up any resources that have been allocated for the
+  /// test and ensure that the test finishes quickly if it's still running. It
+  /// will only be called if [onRun] has been called first.
+  LiveTestController(this._suite, this._test, void onRun(), void onClose())
+      : _onRun = onRun,
+        _onClose = onClose {
+    _liveTest = new _LiveTest(this);
+  }
+
+  /// Adds an error to the [LiveTest].
+  ///
+  /// This both adds the error to [LiveTest.errors] and emits it via
+  /// [LiveTest.onError]. [stackTrace] is automatically converted into a [Chain]
+  /// if it's not one already.
+  void addError(error, StackTrace stackTrace) {
+    if (_isClosed) return;
+
+    var asyncError = new AsyncError(error, new Chain.forTrace(stackTrace));
+    _errors.add(asyncError);
+    _onErrorController.add(asyncError);
+  }
+
+  /// Sets the current state of the [LiveTest] to [newState].
+  ///
+  /// If [newState] is different than the old state, this both sets
+  /// [LiveTest.state] and emits the new state via [LiveTest.onStateChanged]. If
+  /// it's not different, this does nothing.
+  void setState(State newState) {
+    if (_isClosed) return;
+    if (_state == newState) return;
+
+    _state = newState;
+    _onStateChangeController.add(newState);
+  }
+
+  /// Emits a line printed by the test over [LiveTest.onPrint].
+  void print(String line) {
+    if (_onPrintController.hasListener) {
+      _onPrintController.add(line);
+    } else {
+      // Make sure all prints get surfaced one way or another to aid in
+      // debugging.
+      Zone.ROOT.print(line);
+    }
+  }
+
+  /// A wrapper for [_onRun] that ensures that it follows the guarantees for
+  /// [LiveTest.run].
+  Future _run() {
+    if (_runCalled) {
+      throw new StateError("LiveTest.run() may not be called more than once.");
+    } else if (_isClosed) {
+      throw new StateError("LiveTest.run() may not be called for a closed "
+          "test.");
+    }
+    _runCalled = true;
+
+    _onRun();
+    return liveTest.onComplete;
+  }
+
+  /// A wrapper for [_onClose] that ensures that all controllers are closed.
+  Future _close() {
+    if (_isClosed) return completer.future;
+
+    _onStateChangeController.close();
+    _onErrorController.close();
+
+    if (_runCalled) {
+      _onClose();
+    } else {
+      completer.complete();
+    }
+
+    return completer.future;
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/backend/metadata.dart b/mojo/public/dart/third_party/test/lib/src/backend/metadata.dart
new file mode 100644
index 0000000..e6be71e
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/backend/metadata.dart
@@ -0,0 +1,209 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.backend.metadata;
+
+import 'dart:collection';
+
+import '../backend/operating_system.dart';
+import '../backend/test_platform.dart';
+import '../frontend/skip.dart';
+import '../frontend/timeout.dart';
+import '../utils.dart';
+import 'platform_selector.dart';
+
+/// Metadata for a test or test suite.
+///
+/// This metadata comes from declarations on the test itself; it doesn't include
+/// configuration from the user.
+class Metadata {
+  /// The selector indicating which platforms the suite supports.
+  final PlatformSelector testOn;
+
+  /// The modification to the timeout for the test or suite.
+  final Timeout timeout;
+
+  /// Whether the test or suite should be skipped.
+  final bool skip;
+
+  /// Whether to use verbose stack traces.
+  final bool verboseTrace;
+
+  /// The reason the test or suite should be skipped, if given.
+  final String skipReason;
+
+  /// Platform-specific metadata.
+  ///
+  /// Each key identifies a platform, and its value identifies the specific
+  /// metadata for that platform. These can be applied by calling [forPlatform].
+  final Map<PlatformSelector, Metadata> onPlatform;
+
+  /// Parses a user-provided map into the value for [onPlatform].
+  static Map<PlatformSelector, Metadata> _parseOnPlatform(
+      Map<String, dynamic> onPlatform) {
+    if (onPlatform == null) return {};
+
+    var result = {};
+    onPlatform.forEach((platform, metadata) {
+      if (metadata is Timeout || metadata is Skip) {
+        metadata = [metadata];
+      } else if (metadata is! List) {
+        throw new ArgumentError('Metadata for platform "$platform" must be a '
+            'Timeout, Skip, or List of those; was "$metadata".');
+      }
+
+      var selector = new PlatformSelector.parse(platform);
+
+      var timeout;
+      var skip;
+      for (var metadatum in metadata) {
+        if (metadatum is Timeout) {
+          if (timeout != null) {
+            throw new ArgumentError('Only a single Timeout may be declared for '
+                '"$platform".');
+          }
+
+          timeout = metadatum;
+        } else if (metadatum is Skip) {
+          if (skip != null) {
+            throw new ArgumentError('Only a single Skip may be declared for '
+                '"$platform".');
+          }
+
+          skip = metadatum.reason == null ? true : metadatum.reason;
+        } else {
+          throw new ArgumentError('Metadata for platform "$platform" must be a '
+              'Timeout, Skip, or List of those; was "$metadata".');
+        }
+      }
+
+      result[selector] = new Metadata.parse(timeout: timeout, skip: skip);
+    });
+    return result;
+  }
+
+  /// Creates new Metadata.
+  ///
+  /// [testOn] defaults to [PlatformSelector.all].
+  Metadata({PlatformSelector testOn, Timeout timeout, bool skip: false,
+          this.verboseTrace: false, this.skipReason,
+          Map<PlatformSelector, Metadata> onPlatform})
+      : testOn = testOn == null ? PlatformSelector.all : testOn,
+        timeout = timeout == null ? const Timeout.factor(1) : timeout,
+        skip = skip,
+        onPlatform = onPlatform == null
+            ? const {}
+            : new UnmodifiableMapView(onPlatform);
+
+  /// Creates a new Metadata, but with fields parsed from caller-friendly values
+  /// where applicable.
+  ///
+  /// Throws a [FormatException] if any field is invalid.
+  Metadata.parse({String testOn, Timeout timeout, skip,
+          this.verboseTrace: false, Map<String, dynamic> onPlatform})
+      : testOn = testOn == null
+            ? PlatformSelector.all
+            : new PlatformSelector.parse(testOn),
+        timeout = timeout == null ? const Timeout.factor(1) : timeout,
+        skip = skip != null && skip != false,
+        skipReason = skip is String ? skip : null,
+        onPlatform = _parseOnPlatform(onPlatform) {
+    if (skip != null && skip is! String && skip is! bool) {
+      throw new ArgumentError(
+          '"skip" must be a String or a bool, was "$skip".');
+    }
+  }
+
+  /// Dezerializes the result of [Metadata.serialize] into a new [Metadata].
+  Metadata.deserialize(serialized)
+      : testOn = serialized['testOn'] == null
+            ? PlatformSelector.all
+            : new PlatformSelector.parse(serialized['testOn']),
+        timeout = _deserializeTimeout(serialized['timeout']),
+        skip = serialized['skip'],
+        skipReason = serialized['skipReason'],
+        verboseTrace = serialized['verboseTrace'],
+        onPlatform = new Map.fromIterable(serialized['onPlatform'],
+            key: (pair) => new PlatformSelector.parse(pair.first),
+            value: (pair) => new Metadata.deserialize(pair.last));
+
+  /// Deserializes timeout from the format returned by [_serializeTimeout].
+  static _deserializeTimeout(serialized) {
+    if (serialized == 'none') return Timeout.none;
+    var scaleFactor = serialized['scaleFactor'];
+    if (scaleFactor != null) return new Timeout.factor(scaleFactor);
+    return new Timeout(
+        new Duration(microseconds: serialized['duration']));
+  }
+
+  /// Return a new [Metadata] that merges [this] with [other].
+  ///
+  /// If the two [Metadata]s have conflicting properties, [other] wins.
+  Metadata merge(Metadata other) =>
+      new Metadata(
+          testOn: testOn.intersect(other.testOn),
+          timeout: timeout.merge(other.timeout),
+          skip: skip || other.skip,
+          verboseTrace: verboseTrace || other.verboseTrace,
+          skipReason: other.skipReason == null ? skipReason : other.skipReason,
+          onPlatform: mergeMaps(onPlatform, other.onPlatform));
+
+  /// Returns a copy of [this] with the given fields changed.
+  Metadata change({PlatformSelector testOn, Timeout timeout, bool skip,
+      bool verboseTrace, String skipReason,
+      Map<PlatformSelector, Metadata> onPlatform}) {
+    if (testOn == null) testOn = this.testOn;
+    if (timeout == null) timeout = this.timeout;
+    if (skip == null) skip = this.skip;
+    if (verboseTrace == null) verboseTrace = this.verboseTrace;
+    if (skipReason == null) skipReason = this.skipReason;
+    if (onPlatform == null) onPlatform = this.onPlatform;
+    return new Metadata(testOn: testOn, timeout: timeout, skip: skip,
+        verboseTrace: verboseTrace, skipReason: skipReason,
+        onPlatform: onPlatform);
+  }
+
+  /// Returns a copy of [this] with all platform-specific metadata from
+  /// [onPlatform] resolved.
+  Metadata forPlatform(TestPlatform platform, {OperatingSystem os}) {
+    if (onPlatform.isEmpty) return this;
+
+    var metadata = this;
+    onPlatform.forEach((platformSelector, platformMetadata) {
+      if (!platformSelector.evaluate(platform, os: os)) return;
+      metadata = metadata.merge(platformMetadata);
+    });
+    return metadata.change(onPlatform: {});
+  }
+
+  /// Serializes [this] into a JSON-safe object that can be deserialized using
+  /// [new Metadata.deserialize].
+  serialize() {
+    // Make this a list to guarantee that the order is preserved.
+    var serializedOnPlatform = [];
+    onPlatform.forEach((key, value) {
+      serializedOnPlatform.add([key.toString(), value.serialize()]);
+    });
+
+    return {
+      'testOn': testOn == PlatformSelector.all ? null : testOn.toString(),
+      'timeout': _serializeTimeout(timeout),
+      'skip': skip,
+      'skipReason': skipReason,
+      'verboseTrace': verboseTrace,
+      'onPlatform': serializedOnPlatform
+    };
+  }
+
+  /// Serializes timeout into a JSON-safe object.
+  _serializeTimeout(Timeout timeout) {
+    if (timeout == Timeout.none) return 'none';
+    return {
+      'duration': timeout.duration == null
+          ? null
+          : timeout.duration.inMicroseconds,
+      'scaleFactor': timeout.scaleFactor
+    };
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/backend/operating_system.dart b/mojo/public/dart/third_party/test/lib/src/backend/operating_system.dart
new file mode 100644
index 0000000..d88358b
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/backend/operating_system.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.backend.operating_system;
+
+/// An enum of all operating systems supported by Dart.
+///
+/// This is used for selecting which operating systems a test can run on. Even
+/// for browser tests, this indicates the operating system of the machine
+/// running the test runner.
+class OperatingSystem {
+  /// Microsoft Windows.
+  static const windows = const OperatingSystem._("windows");
+
+  /// Mac OS X.
+  static const macOS = const OperatingSystem._("mac-os");
+
+  /// GNU/Linux.
+  static const linux = const OperatingSystem._("linux");
+
+  /// Android.
+  ///
+  /// Since this is the operating system the test runner is running on, this
+  /// won't be true when testing remotely on an Android browser.
+  static const android = const OperatingSystem._("android");
+
+  /// No operating system.
+  ///
+  /// This is used when running in the browser, or if an unrecognized operating
+  /// system is used. It can't be referenced by name in platform selectors.
+  static const none = const OperatingSystem._("none");
+
+  /// A list of all instances of [OperatingSystem] other than [none].
+  static const all = const [windows, macOS, linux, android];
+
+  /// Finds an operating system by its name.
+  ///
+  /// If no operating system is found, returns [none].
+  static OperatingSystem find(String name) =>
+      all.firstWhere((platform) => platform.name == name, orElse: () => null);
+
+  /// Finds an operating system by the return value from `dart:io`'s
+  /// `Platform.operatingSystem`.
+  ///
+  /// If no operating system is found, returns [none].
+  static OperatingSystem findByIoName(String name) {
+    switch (name) {
+      case "windows": return windows;
+      case "macos": return macOS;
+      case "linux": return linux;
+      case "android": return android;
+      default: return none;
+    }
+  }
+
+  /// The name of the operating system.
+  final String name;
+
+  /// Whether this is a POSIX-ish operating system.
+  bool get isPosix => this != windows && this != none;
+
+  const OperatingSystem._(this.name);
+
+  String toString() => name;
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/backend/outstanding_callback_counter.dart b/mojo/public/dart/third_party/test/lib/src/backend/outstanding_callback_counter.dart
new file mode 100644
index 0000000..ba4ba42
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/backend/outstanding_callback_counter.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.backend.outstanding_callback_counter;
+
+import 'dart:async';
+
+/// A class that counts outstanding callbacks for a test and fires a future once
+/// they reach zero.
+///
+/// The outstanding callback count automatically starts at 1.
+class OutstandingCallbackCounter {
+  /// The number of outstanding callbacks.
+  var _count = 1;
+
+  /// A future that fires when the oustanding callback count reaches 0.
+  Future get noOutstandingCallbacks => _completer.future;
+  final _completer = new Completer();
+
+  /// Adds an outstanding callback.
+  void addOutstandingCallback() {
+    _count++;
+  }
+
+  /// Removes an outstanding callback.
+  void removeOutstandingCallback() {
+    _count--;
+    if (_count != 0) return;
+    if (_completer.isCompleted) return;
+    _completer.complete();
+  }
+
+  /// Removes all outstanding callbacks, forcing [noOutstandingCallbacks] to
+  /// fire.
+  ///
+  /// Future calls to [addOutstandingCallback] and [removeOutstandingCallback]
+  /// will be ignored.
+  void removeAllOutstandingCallbacks() {
+    if (!_completer.isCompleted) _completer.complete();
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/backend/platform_selector.dart b/mojo/public/dart/third_party/test/lib/src/backend/platform_selector.dart
new file mode 100644
index 0000000..fab603b
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/backend/platform_selector.dart
@@ -0,0 +1,103 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.backend.platform_selector;
+
+import 'package:source_span/source_span.dart';
+
+import 'operating_system.dart';
+import 'platform_selector/ast.dart';
+import 'platform_selector/evaluator.dart';
+import 'platform_selector/parser.dart';
+import 'platform_selector/visitor.dart';
+import 'test_platform.dart';
+
+/// The set of all valid variable names.
+final _validVariables =
+    new Set<String>.from(["posix", "dart-vm", "browser", "js", "blink"])
+        ..addAll(TestPlatform.all.map((platform) => platform.identifier))
+        ..addAll(OperatingSystem.all.map((os) => os.name));
+
+/// An expression for selecting certain platforms, including operating systems
+/// and browsers.
+///
+/// The syntax is mostly Dart's expression syntax restricted to boolean
+/// operations. See [the README][] for full details.
+///
+/// [the README]: https://github.com/dart-lang/test/#platform-selector-syntax
+abstract class PlatformSelector {
+  /// A selector that declares that a test can be run on all platforms.
+  ///
+  /// This isn't representable in the platform selector syntax but it is the
+  /// default selector.
+  static const all = const _AllPlatforms();
+
+  /// Parses [selector].
+  ///
+  /// This will throw a [SourceSpanFormatException] if the selector is
+  /// malformed or if it uses an undefined variable.
+  factory PlatformSelector.parse(String selector) =>
+      new _PlatformSelector.parse(selector);
+
+  /// Returns whether the selector matches the given [platform] and [os].
+  ///
+  /// [os] defaults to [OperatingSystem.none].
+  bool evaluate(TestPlatform platform, {OperatingSystem os});
+
+  /// Returns a new [PlatformSelector] that matches only platforms matched by
+  /// both [this] and [other].
+  PlatformSelector intersect(PlatformSelector other);
+}
+
+/// The concrete implementation of a [PlatformSelector] parsed from a string.
+///
+/// This is separate from [PlatformSelector] so that [_AllPlatforms] can
+/// implement [PlatformSelector] without having to implement private members.
+class _PlatformSelector implements PlatformSelector{
+  /// The parsed AST.
+  final Node _selector;
+
+  _PlatformSelector.parse(String selector)
+      : _selector = new Parser(selector).parse() {
+    _selector.accept(const _VariableValidator());
+  }
+
+  _PlatformSelector(this._selector);
+
+  bool evaluate(TestPlatform platform, {OperatingSystem os}) =>
+      _selector.accept(new Evaluator(platform, os: os));
+
+  PlatformSelector intersect(PlatformSelector other) {
+    if (other == PlatformSelector.all) return this;
+    return new _PlatformSelector(new AndNode(
+        _selector, (other as _PlatformSelector)._selector));
+  }
+
+  String toString() => _selector.toString();
+}
+
+/// A selector that matches all platforms.
+class _AllPlatforms implements PlatformSelector {
+  const _AllPlatforms();
+
+  bool evaluate(TestPlatform platform, {OperatingSystem os}) => true;
+
+  PlatformSelector intersect(PlatformSelector other) => other;
+
+  String toString() => "*";
+}
+
+/// An AST visitor that ensures that all variables are valid.
+///
+/// This isn't done when evaluating to ensure that errors are eagerly detected,
+/// and it isn't done when parsing to avoid coupling the syntax too tightly to
+/// the semantics.
+class _VariableValidator extends RecursiveVisitor {
+  const _VariableValidator();
+
+  void visitVariable(VariableNode node) {
+    if (_validVariables.contains(node.name)) return;
+    throw new SourceSpanFormatException("Undefined variable.", node.span);
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/backend/platform_selector/ast.dart b/mojo/public/dart/third_party/test/lib/src/backend/platform_selector/ast.dart
new file mode 100644
index 0000000..1deb067
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/backend/platform_selector/ast.dart
@@ -0,0 +1,139 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.backend.platform_selector.ast;
+
+import 'package:source_span/source_span.dart';
+
+import 'visitor.dart';
+
+/// The superclass of nodes in the platform selector abstract syntax tree.
+abstract class Node {
+  /// The span indicating where this node came from.
+  ///
+  /// This is a [FileSpan] because the nodes are parsed from a single continuous
+  /// string, but the string itself isn't actually a file. It might come from a
+  /// statically-parsed annotation or from a parameter.
+  ///
+  /// This may be `null` for nodes without source information.
+  FileSpan get span;
+
+  /// Calls the appropriate [Visitor] method on [this] and returns the result.
+  accept(Visitor visitor);
+}
+
+/// A single variable.
+class VariableNode implements Node {
+  final FileSpan span;
+
+  /// The variable name.
+  final String name;
+
+  VariableNode(this.name, [this.span]);
+
+  accept(Visitor visitor) => visitor.visitVariable(this);
+
+  String toString() => name;
+}
+
+/// A negation expression.
+class NotNode implements Node {
+  final FileSpan span;
+
+  /// The expression being negated.
+  final Node child;
+
+  NotNode(this.child, [this.span]);
+
+  accept(Visitor visitor) => visitor.visitNot(this);
+
+  String toString() => child is VariableNode || child is NotNode
+      ? "!$child"
+      : "!($child)";
+}
+
+/// An or expression.
+class OrNode implements Node {
+  FileSpan get span => _expandSafe(left.span, right.span);
+
+  /// The left-hand branch of the expression.
+  final Node left;
+
+  /// The right-hand branch of the expression.
+  final Node right;
+
+  OrNode(this.left, this.right);
+
+  accept(Visitor visitor) => visitor.visitOr(this);
+
+  String toString() {
+    var string1 = left is AndNode || left is ConditionalNode
+        ? "($left)"
+        : left;
+    var string2 = right is AndNode || right is ConditionalNode
+        ? "($right)"
+        : right;
+
+    return "$string1 || $string2";
+  }
+}
+
+/// An and expression.
+class AndNode implements Node {
+  FileSpan get span => _expandSafe(left.span, right.span);
+
+  /// The left-hand branch of the expression.
+  final Node left;
+
+  /// The right-hand branch of the expression.
+  final Node right;
+
+  AndNode(this.left, this.right);
+
+  accept(Visitor visitor) => visitor.visitAnd(this);
+
+  String toString() {
+    var string1 = left is OrNode || left is ConditionalNode
+        ? "($left)"
+        : left;
+    var string2 = right is OrNode || right is ConditionalNode
+        ? "($right)"
+        : right;
+
+    return "$string1 && $string2";
+  }
+}
+
+/// A ternary conditional expression.
+class ConditionalNode implements Node {
+  FileSpan get span => _expandSafe(condition.span, whenFalse.span);
+
+  /// The condition expression to check.
+  final Node condition;
+
+  /// The branch to run if the condition is true.
+  final Node whenTrue;
+
+  /// The branch to run if the condition is false.
+  final Node whenFalse;
+
+  ConditionalNode(this.condition, this.whenTrue, this.whenFalse);
+
+  accept(Visitor visitor) => visitor.visitConditional(this);
+
+  String toString() {
+    var conditionString =
+        condition is ConditionalNode ? "($condition)" : condition;
+    var trueString = whenTrue is ConditionalNode ? "($whenTrue)" : whenTrue;
+    return "$conditionString ? $trueString : $whenFalse";
+  }
+}
+
+/// Like [FileSpan.expand], except if [start] and [end] are `null` or from
+/// different files it returns `null` rather than throwing an error.
+FileSpan _expandSafe(FileSpan start, FileSpan end) {
+  if (start == null || end == null) return null;
+  if (start.file != end.file) return null;
+  return start.expand(end);
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/backend/platform_selector/evaluator.dart b/mojo/public/dart/third_party/test/lib/src/backend/platform_selector/evaluator.dart
new file mode 100644
index 0000000..7078e18
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/backend/platform_selector/evaluator.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.backend.platform_selector.evaluator;
+
+import '../operating_system.dart';
+import '../test_platform.dart';
+import 'ast.dart';
+import 'visitor.dart';
+
+/// A visitor for evaluating platform selectors against a specific
+/// [TestPlatform] and [OperatingSystem].
+class Evaluator implements Visitor<bool> {
+  /// The platform to test against.
+  final TestPlatform _platform;
+
+  /// The operating system to test against.
+  final OperatingSystem _os;
+
+  Evaluator(this._platform, {OperatingSystem os})
+      : _os = os == null ? OperatingSystem.none : os;
+
+  bool visitVariable(VariableNode node) {
+    if (node.name == _platform.identifier) return true;
+    if (node.name == _os.name) return true;
+
+    switch (node.name) {
+      case "dart-vm": return _platform.isDartVM;
+      case "browser": return _platform.isBrowser;
+      case "js": return _platform.isJS;
+      case "blink": return _platform.isBlink;
+      case "posix": return _os.isPosix;
+      default: return false;
+    }
+  }
+
+  bool visitNot(NotNode node) => !node.child.accept(this);
+
+  bool visitOr(OrNode node) =>
+      node.left.accept(this) || node.right.accept(this);
+
+  bool visitAnd(AndNode node) =>
+      node.left.accept(this) && node.right.accept(this);
+
+  bool visitConditional(ConditionalNode node) => node.condition.accept(this)
+      ? node.whenTrue.accept(this)
+      : node.whenFalse.accept(this);
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/backend/platform_selector/parser.dart b/mojo/public/dart/third_party/test/lib/src/backend/platform_selector/parser.dart
new file mode 100644
index 0000000..6bdf629
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/backend/platform_selector/parser.dart
@@ -0,0 +1,107 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.backend.platform_selector.parser;
+
+import 'package:source_span/source_span.dart';
+
+import 'ast.dart';
+import 'scanner.dart';
+import 'token.dart';
+
+/// A class for parsing a platform selector.
+///
+/// Platform selectors use a stripped-down version of the Dart expression
+/// syntax that only contains variables, parentheses, and boolean operators.
+/// Variables may also contain dashes, contrary to Dart's syntax; this allows
+/// consistency with command-line arguments.
+class Parser {
+  /// The scanner that tokenizes the selector.
+  final Scanner _scanner;
+
+  Parser(String selector)
+      : _scanner = new Scanner(selector);
+
+  /// Parses the selector.
+  ///
+  /// This must only be called once per parser.
+  Node parse() {
+    var selector = _conditional();
+
+    if (_scanner.peek().type != TokenType.endOfFile) {
+      throw new SourceSpanFormatException(
+          "Expected end of input.", _scanner.peek().span);
+    }
+
+    return selector;
+  }
+
+  /// Parses a conditional:
+  ///
+  ///     conditionalExpression:
+  ///       logicalOrExpression ("?" conditionalExpression ":"
+  ///           conditionalExpression)?
+  Node _conditional() {
+    var condition = _or();
+    if (!_scanner.scan(TokenType.questionMark)) return condition;
+
+    var whenTrue = _conditional();
+    if (!_scanner.scan(TokenType.colon)) {
+      throw new SourceSpanFormatException(
+          'Expected ":".', _scanner.peek().span);
+    }
+
+    var whenFalse = _conditional();
+    return new ConditionalNode(condition, whenTrue, whenFalse);
+  }
+
+  /// Parses a logical or:
+  ///
+  ///     logicalOrExpression:
+  ///       logicalAndExpression ("||" logicalOrExpression)?
+  Node _or() {
+    var left = _and();
+    if (!_scanner.scan(TokenType.or)) return left;
+    return new OrNode(left, _or());
+  }
+
+  /// Parses a logical and:
+  ///
+  ///     logicalAndExpression:
+  ///       simpleExpression ("&&" logicalAndExpression)?
+  Node _and() {
+    var left = _simpleExpression();
+    if (!_scanner.scan(TokenType.and)) return left;
+    return new AndNode(left, _and());
+  }
+
+  /// Parses a simple expression:
+  ///
+  ///     simpleExpression:
+  ///       "!" simpleExpression |
+  ///           "(" conditionalExpression ")" |
+  ///           IDENTIFIER
+  Node _simpleExpression() {
+    var token = _scanner.next();
+    switch (token.type) {
+      case TokenType.not:
+        var child = _simpleExpression();
+        return new NotNode(child, token.span.expand(child.span));
+
+      case TokenType.leftParen:
+        var child = _conditional();
+        if (!_scanner.scan(TokenType.rightParen)) {
+          throw new SourceSpanFormatException(
+              'Expected ")".', _scanner.peek().span);
+        }
+        return child;
+
+      case TokenType.identifier:
+        return new VariableNode(token.name, token.span);
+
+      default:
+        throw new SourceSpanFormatException("Expected expression.", token.span);
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/backend/platform_selector/scanner.dart b/mojo/public/dart/third_party/test/lib/src/backend/platform_selector/scanner.dart
new file mode 100644
index 0000000..0a79c49
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/backend/platform_selector/scanner.dart
@@ -0,0 +1,153 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.backend.platform_selector.scanner;
+
+import 'package:string_scanner/string_scanner.dart';
+
+import 'token.dart';
+
+/// A regular expression matching both whitespace and single-line comments.
+///
+/// This will only match if consumes at least one character.
+final _whitespaceAndSingleLineComments =
+    new RegExp(r"([ \t\n]+|//[^\n]*(\n|$))+");
+
+/// A regular expression matching the body of a multi-line comment, after `/*`
+/// but before `*/` or a nested `/*`.
+///
+/// This will only match if it consumes at least one character.
+final _multiLineCommentBody = new RegExp(r"([^/*]|/[^*]|\*[^/])+");
+
+/// A regular expression matching an identifier.
+///
+/// Unlike standard Dart identifiers, platform selector identifiers may
+/// contain dashes for consistency with command-line arguments.
+final _identifier = new RegExp(r"[a-zA-Z_-][a-zA-Z0-9_-]*");
+
+/// A scanner that converts a platform selector string into a stream of
+/// tokens.
+class Scanner {
+  /// The underlying string scanner.
+  final SpanScanner _scanner;
+
+  /// The next token to emit.
+  Token _next;
+
+  /// Whether the scanner has emitted a [TokenType.endOfFile] token.
+  bool _endOfFileEmitted = false;
+
+  Scanner(String selector)
+      : _scanner = new SpanScanner(selector);
+
+  /// Returns the next token that will be returned by [next].
+  ///
+  /// Throws a [StateError] if a [TokenType.endOfFile] token has already been
+  /// consumed.
+  Token peek() {
+    if (_next == null) _next = _getNext();
+    return _next;
+  }
+
+  /// Consumes and returns the next token in the stream.
+  ///
+  /// Throws a [StateError] if a [TokenType.endOfFile] token has already been
+  /// consumed.
+  Token next() {
+    var token = _next == null ? _getNext() : _next;
+    _endOfFileEmitted = token.type == TokenType.endOfFile;
+    _next = null;
+    return token;
+  }
+
+  /// If the next token matches [type], consumes it and returns `true`;
+  /// otherwise, returns `false`.
+  ///
+  /// Throws a [StateError] if a [TokenType.endOfFile] token has already been
+  /// consumed.
+  bool scan(TokenType type) {
+    if (peek().type != type) return false;
+    next();
+    return true;
+  }
+
+  /// Scan and return the next token in the stream.
+  Token _getNext() {
+    if (_endOfFileEmitted) throw new StateError("No more tokens.");
+
+    _consumeWhitespace();
+    if (_scanner.isDone) {
+      return new Token(
+          TokenType.endOfFile, _scanner.spanFrom(_scanner.state));
+    }
+
+    switch (_scanner.peekChar()) {
+      case 0x28 /* ( */: return _scanOperator(TokenType.leftParen);
+      case 0x29 /* ) */: return _scanOperator(TokenType.rightParen);
+      case 0x3F /* ? */: return _scanOperator(TokenType.questionMark);
+      case 0x3A /* : */: return _scanOperator(TokenType.colon);
+      case 0x21 /* ! */: return _scanOperator(TokenType.not);
+      case 0x7C /* | */: return _scanOr();
+      case 0x26 /* & */: return _scanAnd();
+      default: return _scanIdentifier();
+    }
+  }
+
+  /// Scans a single-character operator and returns a token of type [type].
+  ///
+  /// This assumes that the caller has already verified that the next character
+  /// is correct for the given operator.
+  Token _scanOperator(TokenType type) {
+    var start = _scanner.state;
+    _scanner.readChar();
+    return new Token(type, _scanner.spanFrom(start));
+  }
+
+  /// Scans a `||` operator and returns the appropriate token.
+  ///
+  /// This validates that the next two characters are `||`.
+  Token _scanOr() {
+    var start = _scanner.state;
+    _scanner.expect("||");
+    return new Token(TokenType.or, _scanner.spanFrom(start));
+  }
+
+  /// Scans a `&&` operator and returns the appropriate token.
+  ///
+  /// This validates that the next two characters are `&&`.
+  Token _scanAnd() {
+    var start = _scanner.state;
+    _scanner.expect("&&");
+    return new Token(TokenType.and, _scanner.spanFrom(start));
+  }
+
+  /// Scans and returns an identifier token.
+  Token _scanIdentifier() {
+    _scanner.expect(_identifier, name: "expression");
+    return new IdentifierToken(_scanner.lastMatch[0], _scanner.lastSpan);
+  }
+
+  /// Consumes all whitespace and comments immediately following the cursor's
+  /// current position.
+  void _consumeWhitespace() {
+    while (_scanner.scan(_whitespaceAndSingleLineComments) ||
+        _multiLineComment()) {
+      // Do nothing.
+    }
+  }
+
+  /// Consumes a single multi-line comment.
+  ///
+  /// Returns whether or not a comment was consumed.
+  bool _multiLineComment() {
+    if (!_scanner.scan("/*")) return false;
+
+    while (_scanner.scan(_multiLineCommentBody) || _multiLineComment()) {
+      // Do nothing.
+    }
+    _scanner.expect("*/");
+
+    return true;
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/backend/platform_selector/token.dart b/mojo/public/dart/third_party/test/lib/src/backend/platform_selector/token.dart
new file mode 100644
index 0000000..c1e3d08
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/backend/platform_selector/token.dart
@@ -0,0 +1,72 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.backend.platform_selector.token;
+
+import 'package:source_span/source_span.dart';
+
+/// A token in a platform selector.
+class Token {
+  /// The type of the token.
+  final TokenType type;
+
+  /// The span indicating where this token came from.
+  ///
+  /// This is a [FileSpan] because the tokens are parsed from a single
+  /// continuous string, but the string itself isn't actually a file. It might
+  /// come from a statically-parsed annotation or from a parameter.
+  final FileSpan span;
+
+  Token(this.type, this.span);
+}
+
+/// A token representing an identifier.
+class IdentifierToken implements Token {
+  final type = TokenType.identifier;
+  final FileSpan span;
+
+  /// The name of the identifier.
+  final String name;
+
+  IdentifierToken(this.name, this.span);
+
+  String toString() => 'identifier "$name"';
+}
+
+/// An enumeration of types of tokens.
+class TokenType {
+  /// A `(` character.
+  static const leftParen = const TokenType._("left paren");
+
+  /// A `)` character.
+  static const rightParen = const TokenType._("right paren");
+
+  /// A `||` sequence.
+  static const or = const TokenType._("or");
+
+  /// A `&&` sequence.
+  static const and = const TokenType._("and");
+
+  /// A `!` character.
+  static const not = const TokenType._("not");
+
+  /// A `?` character.
+  static const questionMark = const TokenType._("question mark");
+
+  /// A `:` character.
+  static const colon = const TokenType._("colon");
+
+  /// A named identifier.
+  static const identifier = const TokenType._("identifier");
+
+  /// The end of the selector.
+  static const endOfFile = const TokenType._("end of file");
+
+  /// The name of the token type.
+  final String name;
+
+  const TokenType._(this.name);
+
+  String toString() => name;
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/backend/platform_selector/visitor.dart b/mojo/public/dart/third_party/test/lib/src/backend/platform_selector/visitor.dart
new file mode 100644
index 0000000..67d95b9
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/backend/platform_selector/visitor.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.backend.platform_selector.visitor;
+
+import 'ast.dart';
+
+/// The interface for visitors of the platform selector AST.
+abstract class Visitor<T> {
+  T visitVariable(VariableNode node);
+  T visitNot(NotNode node);
+  T visitOr(OrNode node);
+  T visitAnd(AndNode node);
+  T visitConditional(ConditionalNode node);
+}
+
+/// An abstract superclass for side-effect-based visitors.
+///
+/// The default implementations of this visitor's methods just traverse the AST
+/// and do nothing with it.
+abstract class RecursiveVisitor implements Visitor {
+  const RecursiveVisitor();
+
+  void visitVariable(VariableNode node) {}
+
+  void visitNot(NotNode node) {
+    node.child.accept(this);
+  }
+
+  void visitOr(OrNode node) {
+    node.left.accept(this);
+    node.right.accept(this);
+  }
+
+  void visitAnd(AndNode node) {
+    node.left.accept(this);
+    node.right.accept(this);
+  }
+
+  void visitConditional(ConditionalNode node) {
+    node.condition.accept(this);
+    node.whenTrue.accept(this);
+    node.whenFalse.accept(this);
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/backend/state.dart b/mojo/public/dart/third_party/test/lib/src/backend/state.dart
new file mode 100644
index 0000000..6d95458
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/backend/state.dart
@@ -0,0 +1,106 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.backend.state;
+
+/// The state of a [LiveTest].
+///
+/// A test's state is made up of two components, its [status] and its [result].
+/// The [status] represents where the test is in its process of running; the
+/// [result] represents the outcome as far as its known.
+class State {
+  /// Where the test is in its process of running.
+  final Status status;
+
+  /// The outcome of the test, as far as it's known.
+  ///
+  /// Note that if [status] is [Status.pending], [result] will always be
+  /// [Result.success] since the test hasn't yet had a chance to fail.
+  final Result result;
+
+  const State(this.status, this.result);
+
+  bool operator==(other) => other is State && status == other.status &&
+      result == other.result;
+
+  int get hashCode => status.hashCode ^ (7 * result.hashCode);
+
+  String toString() {
+    if (status == Status.pending) return "pending";
+    if (status == Status.complete) return result.toString();
+    if (result == Result.success) return "running";
+    return "running with $result";
+  }
+}
+
+/// Where the test is in its process of running.
+class Status {
+  /// The test has not yet begun running.
+  static const pending = const Status._("pending");
+
+  /// The test is currently running.
+  static const running = const Status._("running");
+
+  /// The test has finished running.
+  ///
+  /// Note that even if the test is marked [complete], it may still be running
+  /// code asynchronously. A test is considered complete either once it hits its
+  /// first error or when all [expectAsync] callbacks have been called and any
+  /// returned [Future] has completed, but it's possible for further processing
+  /// to happen, which may cause further errors.
+  static const complete = const Status._("complete");
+
+  /// The name of the status.
+  final String name;
+
+  factory Status.parse(String name) {
+    switch (name) {
+      case "pending": return Status.pending;
+      case "running": return Status.running;
+      case "complete": return Status.complete;
+      default:
+        throw new ArgumentError('Invalid status name "$name".');
+    }
+  }
+
+  const Status._(this.name);
+
+  String toString() => name;
+}
+
+/// The outcome of the test, as far as it's known.
+class Result {
+  /// The test has not yet failed in any way.
+  ///
+  /// Note that this doesn't mean that the test won't fail in the future.
+  static const success = const Result._("success");
+
+  /// The test has failed.
+  ///
+  /// A failure is specifically caused by a [TestFailure] being thrown; any
+  /// other exception causes an error.
+  static const failure = const Result._("failure");
+
+  /// The test has crashed.
+  ///
+  /// Any exception other than a [TestFailure] is considered to be an error.
+  static const error = const Result._("error");
+
+  /// The name of the result.
+  final String name;
+
+  factory Result.parse(String name) {
+    switch (name) {
+      case "success": return Result.success;
+      case "failure": return Result.failure;
+      case "error": return Result.error;
+      default:
+        throw new ArgumentError('Invalid result name "$name".');
+    }
+  }
+
+  const Result._(this.name);
+
+  String toString() => name;
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/backend/suite.dart b/mojo/public/dart/third_party/test/lib/src/backend/suite.dart
new file mode 100644
index 0000000..4b6fbc9
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/backend/suite.dart
@@ -0,0 +1,92 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.backend.suite;
+
+import 'dart:collection';
+
+import 'metadata.dart';
+import 'operating_system.dart';
+import 'test.dart';
+import 'test_platform.dart';
+
+/// A test suite.
+///
+/// A test suite is a set of tests that are intended to be run together and that
+/// share default configuration.
+class Suite {
+  /// The platform on which the suite is running, or `null` if that platform is
+  /// unknown.
+  final TestPlatform platform;
+
+  /// The operating system on which the suite is running, or `null` if that
+  /// operating system is unknown.
+  ///
+  /// This will always be `null` if [platform] is `null`.
+  final OperatingSystem os;
+
+  /// The path to the Dart test suite, or `null` if that path is unknown.
+  final String path;
+
+  /// The metadata associated with this test suite.
+  final Metadata metadata;
+
+  /// The tests in the test suite.
+  final List<Test> tests;
+
+  /// Creates a new suite containing [tests].
+  ///
+  /// If [platform] and/or [os] are passed, [tests] and [metadata] are filtered
+  /// to match that platform information.
+  ///
+  /// If [os] is passed without [platform], throws an [ArgumentError].
+  Suite(Iterable<Test> tests, {this.path, TestPlatform platform,
+          OperatingSystem os, Metadata metadata})
+      : platform = platform,
+        os = os,
+        metadata = _filterMetadata(metadata, platform, os),
+        tests = new UnmodifiableListView<Test>(
+            _filterTests(tests, platform, os));
+
+  /// Returns [metadata] filtered according to [platform] and [os].
+  ///
+  /// Gracefully handles either [metadata] or [platform] being null.
+  static Metadata _filterMetadata(Metadata metadata, TestPlatform platform,
+      OperatingSystem os) {
+    if (platform == null && os != null) {
+      throw new ArgumentError.value(null, "os",
+          "If os is passed, platform must be passed as well");
+    }
+
+    if (metadata == null) return new Metadata();
+    if (platform == null) return metadata;
+    return metadata.forPlatform(platform, os: os);
+  }
+
+  /// Returns [tests] filtered according to [platform] and [os].
+  ///
+  /// Gracefully handles [platform] being null.
+  static List<Test> _filterTests(Iterable<Test> tests,
+      TestPlatform platform, OperatingSystem os) {
+    if (platform == null) return tests.toList();
+
+    return tests.where((test) {
+      return test.metadata.testOn.evaluate(platform, os: os);
+    }).map((test) {
+      return test.change(metadata: test.metadata.forPlatform(platform, os: os));
+    }).toList();
+  }
+
+  /// Returns a new suite with the given fields updated.
+  ///
+  /// In the new suite, [metadata] and [tests] will be filtered according to
+  /// [platform] and [os].
+  Suite change({String path, Metadata metadata, Iterable<Test> tests}) {
+    if (path == null) path = this.path;
+    if (metadata == null) metadata = this.metadata;
+    if (tests == null) tests = this.tests;
+    return new Suite(tests, platform: platform, os: os, path: path,
+        metadata: metadata);
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/backend/test.dart b/mojo/public/dart/third_party/test/lib/src/backend/test.dart
new file mode 100644
index 0000000..0334a8f
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/backend/test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.backend.test;
+
+import 'live_test.dart';
+import 'metadata.dart';
+import 'suite.dart';
+
+/// A single test.
+///
+/// A test is immutable and stateless, which means that it can't be run
+/// directly. To run one, load a live version using [Test.load] and run it using
+/// [LiveTest.run].
+abstract class Test {
+  /// The name of the test.
+  String get name;
+
+  /// The metadata for the test.
+  Metadata get metadata;
+
+  /// Loads a live version of this test, which can be used to run it a single
+  /// time.
+  ///
+  /// [suite] is the suite within which this test is being run.
+  LiveTest load(Suite suite);
+
+  /// Returns a new copy of this Test with the given [name] and [metadata], if
+  /// passed.
+  Test change({String name, Metadata metadata});
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/backend/test_platform.dart b/mojo/public/dart/third_party/test/lib/src/backend/test_platform.dart
new file mode 100644
index 0000000..731bbd5
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/backend/test_platform.dart
@@ -0,0 +1,93 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.backend.test_platform;
+
+// TODO(nweiz): support pluggable platforms.
+/// An enum of all platforms on which tests can run.
+class TestPlatform {
+  // When adding new platforms, be sure to update the baseline and derived
+  // variable tests in test/backend/platform_selector/evaluate_test.
+
+  /// The command-line Dart VM.
+  static const TestPlatform vm =
+      const TestPlatform._("VM", "vm", isDartVM: true);
+
+  /// Dartium.
+  static const TestPlatform dartium = const TestPlatform._("Dartium", "dartium",
+      isBrowser: true, isBlink: true, isDartVM: true);
+
+  /// Dartium content shell.
+  static const TestPlatform contentShell = const TestPlatform._(
+      "Dartium Content Shell", "content-shell",
+      isBrowser: true, isBlink: true, isDartVM: true, isHeadless: true);
+
+  /// Google Chrome.
+  static const TestPlatform chrome = const TestPlatform._("Chrome", "chrome",
+      isBrowser: true, isJS: true, isBlink: true);
+
+  /// PhantomJS.
+  static const TestPlatform phantomJS = const TestPlatform._(
+      "PhantomJS", "phantomjs",
+      isBrowser: true, isJS: true, isBlink: true, isHeadless: true);
+
+  /// Mozilla Firefox.
+  static const TestPlatform firefox = const TestPlatform._("Firefox", "firefox",
+      isBrowser: true, isJS: true);
+
+  /// Apple Safari.
+  static const TestPlatform safari = const TestPlatform._("Safari", "safari",
+      isBrowser: true, isJS: true);
+
+  /// Microsoft Internet Explorer.
+  static const TestPlatform internetExplorer = const TestPlatform._(
+      "Internet Explorer", "ie",
+      isBrowser: true, isJS: true);
+
+  /// A list of all instances of [TestPlatform].
+  static const List<TestPlatform> all = const [
+    vm,
+    dartium,
+    contentShell,
+    chrome,
+    phantomJS,
+    firefox,
+    safari,
+    internetExplorer
+  ];
+
+  /// Finds a platform by its identifier string.
+  ///
+  /// If no platform is found, returns `null`.
+  static TestPlatform find(String identifier) =>
+      all.firstWhere((platform) => platform.identifier == identifier,
+          orElse: () => null);
+
+  /// The human-friendly name of the platform.
+  final String name;
+
+  /// The identifier used to look up the platform.
+  final String identifier;
+
+  /// Whether this platform runs the Dart VM in any capacity.
+  final bool isDartVM;
+
+  /// Whether this platform is a browser.
+  final bool isBrowser;
+
+  /// Whether this platform runs Dart compiled to JavaScript.
+  final bool isJS;
+
+  /// Whether this platform uses the Blink rendering engine.
+  final bool isBlink;
+
+  /// Whether this platform has no visible window.
+  final bool isHeadless;
+
+  const TestPlatform._(this.name, this.identifier, {this.isDartVM: false,
+      this.isBrowser: false, this.isJS: false, this.isBlink: false,
+      this.isHeadless: false});
+
+  String toString() => name;
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/executable.dart b/mojo/public/dart/third_party/test/lib/src/executable.dart
new file mode 100644
index 0000000..29c4dd3
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/executable.dart
@@ -0,0 +1,214 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// TODO(nweiz): This is under lib so that it can be used by the unittest dummy
+// package. Once that package is no longer being updated, move this back into
+// bin.
+library test.executable;
+
+import 'dart:io';
+
+import 'package:stack_trace/stack_trace.dart';
+import 'package:yaml/yaml.dart';
+
+import 'runner.dart';
+import 'runner/application_exception.dart';
+import 'runner/configuration.dart';
+import 'util/exit_codes.dart' as exit_codes;
+import 'util/io.dart';
+import 'utils.dart';
+
+/// A merged stream of all signals that tell the test runner to shut down
+/// gracefully.
+///
+/// Signals will only be captured as long as this has an active subscription.
+/// Otherwise, they'll be handled by Dart's default signal handler, which
+/// terminates the program immediately.
+final _signals = Platform.isWindows
+    ? ProcessSignal.SIGINT.watch()
+    : mergeStreams([
+        ProcessSignal.SIGTERM.watch(),
+        ProcessSignal.SIGINT.watch()
+      ]);
+
+/// Returns whether the current package has a pubspec which uses the
+/// `test/pub_serve` transformer.
+bool get _usesTransformer {
+  if (!new File('pubspec.yaml').existsSync()) return false;
+  var contents = new File('pubspec.yaml').readAsStringSync();
+
+  var yaml;
+  try {
+    yaml = loadYaml(contents);
+  } on FormatException {
+    return false;
+  }
+
+  if (yaml is! Map) return false;
+
+  var transformers = yaml['transformers'];
+  if (transformers == null) return false;
+  if (transformers is! List) return false;
+
+  return transformers.any((transformer) {
+    if (transformer is String) return transformer == 'test/pub_serve';
+    if (transformer is! Map) return false;
+    if (transformer.keys.length != 1) return false;
+    return transformer.keys.single == 'test/pub_serve';
+  });
+}
+
+main(List<String> args) async {
+  var configuration;
+  try {
+    configuration = new Configuration.parse(args);
+  } on FormatException catch (error) {
+    _printUsage(error.message);
+    exitCode = exit_codes.usage;
+    return;
+  }
+
+  if (configuration.help) {
+    _printUsage();
+    return;
+  }
+
+  if (configuration.version) {
+    if (!_printVersion()) {
+      stderr.writeln("Couldn't find version number.");
+      exitCode = exit_codes.data;
+    }
+    return;
+  }
+
+  if (configuration.pubServeUrl != null && !_usesTransformer) {
+    stderr.write('''
+When using --pub-serve, you must include the "test/pub_serve" transformer in
+your pubspec:
+
+transformers:
+- test/pub_serve:
+    \$include: test/**_test.dart
+''');
+    exitCode = exit_codes.data;
+    return;
+  }
+
+  if (!configuration.explicitPaths &&
+      !new Directory(configuration.paths.single).existsSync()) {
+    _printUsage('No test files were passed and the default "test/" '
+        "directory doesn't exist.");
+    exitCode = exit_codes.data;
+    return;
+  }
+
+  var runner = new Runner(configuration);
+
+  var signalSubscription;
+  close() async {
+    if (signalSubscription == null) return;
+    signalSubscription.cancel();
+    signalSubscription = null;
+    stdinLines.cancel(immediate: true);
+    await runner.close();
+  }
+
+  signalSubscription = _signals.listen((_) => close());
+
+  try {
+    exitCode = (await runner.run()) ? 0 : 1;
+  } on ApplicationException catch (error) {
+    stderr.writeln(error.message);
+    exitCode = exit_codes.data;
+  } catch (error, stackTrace) {
+    stderr.writeln(getErrorMessage(error));
+    stderr.writeln(new Trace.from(stackTrace).terse);
+    stderr.writeln(
+        "This is an unexpected error. Please file an issue at "
+            "http://github.com/dart-lang/test\n"
+        "with the stack trace and instructions for reproducing the error.");
+    exitCode = exit_codes.software;
+  } finally {
+    await close();
+  }
+}
+
+/// Print usage information for this command.
+///
+/// If [error] is passed, it's used in place of the usage message and the whole
+/// thing is printed to stderr instead of stdout.
+void _printUsage([String error]) {
+  var output = stdout;
+
+  var message = "Runs tests in this package.";
+  if (error != null) {
+    message = error;
+    output = stderr;
+  }
+
+  output.write("""$message
+
+Usage: pub run test:test [files or directories...]
+
+${Configuration.usage}
+""");
+}
+
+/// Prints the version number of the test package.
+///
+/// This loads the version number from the current package's lockfile. It
+/// returns true if it successfully printed the version number and false if it
+/// couldn't be loaded.
+bool _printVersion() {
+  var lockfile;
+  try {
+    lockfile = loadYaml(new File("pubspec.lock").readAsStringSync());
+  } on FormatException catch (_) {
+    return false;
+  } on IOException catch (_) {
+    return false;
+  }
+
+  if (lockfile is! Map) return false;
+  var packages = lockfile["packages"];
+  if (packages is! Map) return false;
+  var package = packages["test"];
+  if (package is! Map) return false;
+
+  var source = package["source"];
+  if (source is! String) return false;
+
+  switch (source) {
+    case "hosted":
+      var version = package["version"];
+      if (version is! String) return false;
+
+      print(version);
+      return true;
+
+    case "git":
+      var version = package["version"];
+      if (version is! String) return false;
+      var description = package["description"];
+      if (description is! Map) return false;
+      var ref = description["resolved-ref"];
+      if (ref is! String) return false;
+
+      print("$version (${ref.substring(0, 7)})");
+      return true;
+
+    case "path":
+      var version = package["version"];
+      if (version is! String) return false;
+      var description = package["description"];
+      if (description is! Map) return false;
+      var path = description["path"];
+      if (path is! String) return false;
+
+      print("$version (from $path)");
+      return true;
+
+    default: return false;
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/frontend/expect.dart b/mojo/public/dart/third_party/test/lib/src/frontend/expect.dart
new file mode 100644
index 0000000..3059b2f
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/frontend/expect.dart
@@ -0,0 +1,80 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.frontend.expect;
+
+import 'package:matcher/matcher.dart';
+
+import '../backend/closed_exception.dart';
+import '../backend/invoker.dart';
+
+/// An exception thrown when a test assertion fails.
+class TestFailure {
+  final String message;
+
+  TestFailure(this.message);
+
+  String toString() => message;
+}
+
+/// The type used for functions that can be used to build up error reports
+/// upon failures in [expect].
+typedef String ErrorFormatter(
+    actual, Matcher matcher, String reason, Map matchState, bool verbose);
+
+/// Assert that [actual] matches [matcher].
+///
+/// This is the main assertion function. [reason] is optional and is typically
+/// not supplied, as a reason is generated from [matcher]; if [reason]
+/// is included it is appended to the reason generated by the matcher.
+///
+/// [matcher] can be a value in which case it will be wrapped in an
+/// [equals] matcher.
+///
+/// If the assertion fails a [TestFailure] is thrown.
+///
+/// In some cases extra diagnostic info can be produced on failure (for
+/// example, stack traces on mismatched exceptions). To enable these,
+/// [verbose] should be specified as `true`.
+void expect(actual, matcher,
+    {String reason, bool verbose: false, ErrorFormatter formatter}) {
+  if (Invoker.current == null) {
+    throw new StateError("expect() may only be called within a test.");
+  }
+
+  if (Invoker.current.closed) throw new ClosedException();
+
+  matcher = wrapMatcher(matcher);
+  var matchState = {};
+  try {
+    if (matcher.matches(actual, matchState)) return;
+  } catch (e, trace) {
+    if (reason == null) {
+      reason = '${(e is String) ? e : e.toString()} at $trace';
+    }
+  }
+  if (formatter == null) formatter = _defaultFailFormatter;
+  fail(formatter(actual, matcher, reason, matchState, verbose));
+}
+
+/// Convenience method for throwing a new [TestFailure] with the provided
+/// [message].
+void fail(String message) => throw new TestFailure(message);
+
+// The default error formatter.
+String _defaultFailFormatter(
+    actual, Matcher matcher, String reason, Map matchState, bool verbose) {
+  var description = new StringDescription();
+  description.add('Expected: ').addDescriptionOf(matcher).add('\n');
+  description.add('  Actual: ').addDescriptionOf(actual).add('\n');
+
+  var mismatchDescription = new StringDescription();
+  matcher.describeMismatch(actual, mismatchDescription, matchState, verbose);
+
+  if (mismatchDescription.length > 0) {
+    description.add('   Which: ${mismatchDescription}\n');
+  }
+  if (reason != null) description.add(reason).add('\n');
+  return description.toString();
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/frontend/expect_async.dart b/mojo/public/dart/third_party/test/lib/src/frontend/expect_async.dart
new file mode 100644
index 0000000..696fae7
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/frontend/expect_async.dart
@@ -0,0 +1,252 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.frontend.expect_async;
+
+import 'dart:async';
+
+import '../backend/invoker.dart';
+import '../backend/state.dart';
+import 'expect.dart';
+
+/// An object used to detect unpassed arguments.
+const _PLACEHOLDER = const Object();
+
+// Functions used to check how many arguments a callback takes.
+typedef _Func0();
+typedef _Func1(a);
+typedef _Func2(a, b);
+typedef _Func3(a, b, c);
+typedef _Func4(a, b, c, d);
+typedef _Func5(a, b, c, d, e);
+typedef _Func6(a, b, c, d, e, f);
+
+typedef bool _IsDoneCallback();
+
+/// A wrapper for a function that ensures that it's called the appropriate
+/// number of times.
+///
+/// The containing test won't be considered to have completed successfully until
+/// this function has been called the appropriate number of times.
+///
+/// The wrapper function is accessible via [func]. It supports up to six
+/// optional and/or required positional arguments, but no named arguments.
+class _ExpectedFunction {
+  /// The wrapped callback.
+  final Function _callback;
+
+  /// The minimum number of calls that are expected to be made to the function.
+  ///
+  /// If fewer calls than this are made, the test will fail.
+  final int _minExpectedCalls;
+
+  /// The maximum number of calls that are expected to be made to the function.
+  ///
+  /// If more calls than this are made, the test will fail.
+  final int _maxExpectedCalls;
+
+  /// A callback that should return whether the function is not expected to have
+  /// any more calls.
+  ///
+  /// This will be called after every time the function is run. The test case
+  /// won't be allowed to terminate until it returns `true`.
+  ///
+  /// This may be `null`. If so, the function is considered to be done after
+  /// it's been run once.
+  final _IsDoneCallback _isDone;
+
+  /// A descriptive name for the function.
+  final String _id;
+
+  /// An optional description of why the function is expected to be called.
+  ///
+  /// If not passed, this will be an empty string.
+  final String _reason;
+
+  /// The number of times the function has been called.
+  int _actualCalls = 0;
+
+  /// The test invoker in which this function was wrapped.
+  Invoker get _invoker => _zone[#test.invoker];
+
+  /// The zone in which this function was wrapped.
+  final Zone _zone;
+
+  /// Whether this function has been called the requisite number of times.
+  bool _complete;
+
+  /// Wraps [callback] in a function that asserts that it's called at least
+  /// [minExpected] times and no more than [maxExpected] times.
+  ///
+  /// If passed, [id] is used as a descriptive name fo the function and [reason]
+  /// as a reason it's expected to be called. If [isDone] is passed, the test
+  /// won't be allowed to complete until it returns `true`.
+  _ExpectedFunction(Function callback, int minExpected, int maxExpected,
+      {String id, String reason, bool isDone()})
+      : this._callback = callback,
+        _minExpectedCalls = minExpected,
+        _maxExpectedCalls = (maxExpected == 0 && minExpected > 0)
+            ? minExpected
+            : maxExpected,
+        this._isDone = isDone,
+        this._reason = reason == null ? '' : '\n$reason',
+        this._zone = Zone.current,
+        this._id = _makeCallbackId(id, callback) {
+    if (_invoker == null) {
+      throw new StateError("[expectAsync] was called outside of a test.");
+    } else if (maxExpected > 0 && minExpected > maxExpected) {
+      throw new ArgumentError("max ($maxExpected) may not be less than count "
+          "($minExpected).");
+    }
+
+    if (isDone != null || minExpected > 0) {
+      _invoker.addOutstandingCallback();
+      _complete = false;
+    } else {
+      _complete = true;
+    }
+  }
+
+  /// Tries to find a reasonable name for [callback].
+  ///
+  /// If [id] is passed, uses that. Otherwise, tries to determine a name from
+  /// calling `toString`. If no name can be found, returns the empty string.
+  static String _makeCallbackId(String id, Function callback) {
+    if (id != null) return "$id ";
+
+    // If the callback is not an anonymous closure, try to get the
+    // name.
+    var toString = callback.toString();
+    var prefix = "Function '";
+    var start = toString.indexOf(prefix);
+    if (start == -1) return '';
+
+    start += prefix.length;
+    var end = toString.indexOf("'", start);
+    if (end == -1) return '';
+    return "${toString.substring(start, end)} ";
+  }
+
+  /// Returns a function that has the same number of positional arguments as the
+  /// wrapped function (up to a total of 6).
+  Function get func {
+    if (_callback is _Func6) return _max6;
+    if (_callback is _Func5) return _max5;
+    if (_callback is _Func4) return _max4;
+    if (_callback is _Func3) return _max3;
+    if (_callback is _Func2) return _max2;
+    if (_callback is _Func1) return _max1;
+    if (_callback is _Func0) return _max0;
+
+    _invoker.removeOutstandingCallback();
+    throw new ArgumentError(
+        'The wrapped function has more than 6 required arguments');
+  }
+
+  // This indirection is critical. It ensures the returned function has an
+  // argument count of zero.
+  _max0() => _max6();
+
+  _max1([a0 = _PLACEHOLDER]) => _max6(a0);
+
+  _max2([a0 = _PLACEHOLDER, a1 = _PLACEHOLDER]) => _max6(a0, a1);
+
+  _max3([a0 = _PLACEHOLDER, a1 = _PLACEHOLDER, a2 = _PLACEHOLDER]) =>
+      _max6(a0, a1, a2);
+
+  _max4([a0 = _PLACEHOLDER, a1 = _PLACEHOLDER, a2 = _PLACEHOLDER,
+      a3 = _PLACEHOLDER]) => _max6(a0, a1, a2, a3);
+
+  _max5([a0 = _PLACEHOLDER, a1 = _PLACEHOLDER, a2 = _PLACEHOLDER,
+      a3 = _PLACEHOLDER, a4 = _PLACEHOLDER]) => _max6(a0, a1, a2, a3, a4);
+
+  _max6([a0 = _PLACEHOLDER, a1 = _PLACEHOLDER, a2 = _PLACEHOLDER,
+      a3 = _PLACEHOLDER, a4 = _PLACEHOLDER, a5 = _PLACEHOLDER]) =>
+      _run([a0, a1, a2, a3, a4, a5].where((a) => a != _PLACEHOLDER));
+
+  /// Runs the wrapped function with [args] and returns its return value.
+  _run(Iterable args) {
+    // Note that in the old test, this returned `null` if it encountered an
+    // error, where now it just re-throws that error because Zone machinery will
+    // pass it to the invoker anyway.
+    try {
+      _actualCalls++;
+      if (_invoker.liveTest.isComplete &&
+          _invoker.liveTest.state.result == Result.success) {
+        throw 'Callback ${_id}called ($_actualCalls) after test case '
+              '${_invoker.liveTest.test.name} had already completed.$_reason';
+      } else if (_maxExpectedCalls >= 0 && _actualCalls > _maxExpectedCalls) {
+        throw new TestFailure('Callback ${_id}called more times than expected '
+                              '($_maxExpectedCalls).$_reason');
+      }
+
+      return Function.apply(_callback, args.toList());
+    } catch (error, stackTrace) {
+      _zone.handleUncaughtError(error, stackTrace);
+      return null;
+    } finally {
+      _afterRun();
+    }
+  }
+
+  /// After each time the function is run, check to see if it's complete.
+  void _afterRun() {
+    if (_complete) return;
+    if (_minExpectedCalls > 0 && _actualCalls < _minExpectedCalls) return;
+    if (_isDone != null && !_isDone()) return;
+
+    // Mark this callback as complete and remove it from the test case's
+    // oustanding callback count; if that hits zero the test is done.
+    _complete = true;
+    _invoker.removeOutstandingCallback();
+  }
+}
+
+/// Indicate that [callback] is expected to be called [count] number of times
+/// (by default 1).
+///
+/// The test framework will wait for the callback to run the [count] times
+/// before it considers the current test to be complete. [callback] may take up
+/// to six optional or required positional arguments; named arguments are not
+/// supported.
+///
+/// [max] can be used to specify an upper bound on the number of calls; if this
+/// is exceeded the test will fail. If [max] is `0` (the default), the callback
+/// is expected to be called exactly [count] times. If [max] is `-1`, the
+/// callback is allowed to be called any number of times greater than [count].
+///
+/// Both [id] and [reason] are optional and provide extra information about the
+/// callback when debugging. [id] should be the name of the callback, while
+/// [reason] should be the reason the callback is expected to be called.
+Function expectAsync(Function callback,
+        {int count: 1, int max: 0, String id, String reason}) {
+  if (Invoker.current == null) {
+    throw new StateError("expectAsync() may only be called within a test.");
+  }
+
+  return new _ExpectedFunction(callback, count, max, id: id, reason: reason)
+      .func;
+}
+
+/// Indicate that [callback] is expected to be called until [isDone] returns
+/// true.
+///
+/// [isDone] is called after each time the function is run. Only when it returns
+/// true will the callback be considered complete. [callback] may take up to six
+/// optional or required positional arguments; named arguments are not
+/// supported.
+///
+/// Both [id] and [reason] are optional and provide extra information about the
+/// callback when debugging. [id] should be the name of the callback, while
+/// [reason] should be the reason the callback is expected to be called.
+Function expectAsyncUntil(Function callback, bool isDone(),
+    {String id, String reason}) {
+  if (Invoker.current == null) {
+    throw new StateError(
+        "expectAsyncUntil() may only be called within a test.");
+  }
+
+  return new _ExpectedFunction(callback, 0, -1,
+      id: id, reason: reason, isDone: isDone).func;
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/frontend/future_matchers.dart b/mojo/public/dart/third_party/test/lib/src/frontend/future_matchers.dart
new file mode 100644
index 0000000..129a995
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/frontend/future_matchers.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.frontend.future_matchers;
+
+import 'dart:async';
+
+import 'package:matcher/matcher.dart' hide throws, throwsA, expect, fail;
+
+import '../backend/invoker.dart';
+import 'expect.dart';
+
+/// Matches a [Future] that completes successfully with a value.
+///
+/// Note that this creates an asynchronous expectation. The call to `expect()`
+/// that includes this will return immediately and execution will continue.
+/// Later, when the future completes, the actual expectation will run.
+///
+/// To test that a Future completes with an exception, you can use [throws] and
+/// [throwsA].
+final Matcher completes = const _Completes(null);
+
+/// Matches a [Future] that completes succesfully with a value that matches
+/// [matcher].
+///
+/// Note that this creates an asynchronous expectation. The call to
+/// `expect()` that includes this will return immediately and execution will
+/// continue. Later, when the future completes, the actual expectation will run.
+///
+/// To test that a Future completes with an exception, you can use [throws] and
+/// [throwsA].
+///
+/// The [description] parameter is deprecated and shouldn't be used.
+Matcher completion(matcher, [@deprecated String description]) =>
+    new _Completes(wrapMatcher(matcher));
+
+class _Completes extends Matcher {
+  final Matcher _matcher;
+
+  const _Completes(this._matcher);
+
+  bool matches(item, Map matchState) {
+    if (item is! Future) return false;
+    Invoker.current.addOutstandingCallback();
+
+    item.then((value) {
+      if (_matcher != null) expect(value, _matcher);
+      Invoker.current.removeOutstandingCallback();
+    });
+
+    return true;
+  }
+
+  Description describe(Description description) {
+    if (_matcher == null) {
+      description.add('completes successfully');
+    } else {
+      description.add('completes to a value that ').addDescriptionOf(_matcher);
+    }
+    return description;
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/frontend/on_platform.dart b/mojo/public/dart/third_party/test/lib/src/frontend/on_platform.dart
new file mode 100644
index 0000000..9da2901
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/frontend/on_platform.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.frontend.on_platform;
+
+/// An annotation for platform-specific customizations for a test suite.
+///
+/// See [the README][onPlatform].
+///
+/// [onPlatform]: https://github.com/dart-lang/test/blob/master/README.md#platform-specific-configuration
+class OnPlatform {
+  final Map<String, dynamic> annotationsByPlatform;
+
+  const OnPlatform(this.annotationsByPlatform);
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/frontend/prints_matcher.dart b/mojo/public/dart/third_party/test/lib/src/frontend/prints_matcher.dart
new file mode 100644
index 0000000..008f20e
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/frontend/prints_matcher.dart
@@ -0,0 +1,81 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.frontend.prints_matcher;
+
+import 'dart:async';
+
+import 'package:matcher/matcher.dart' hide completes, expect;
+
+import 'expect.dart';
+import 'future_matchers.dart';
+
+/// Matches a [Function] that prints text that matches [matcher].
+///
+/// [matcher] may be a String or a [Matcher].
+///
+/// If the function this runs against returns a [Future], all text printed by
+/// the function (using [Zone] scoping) until that Future completes is matched.
+///
+/// This only tracks text printed using the [print] function.
+Matcher prints(matcher) => new _Prints(wrapMatcher(matcher));
+
+class _Prints extends Matcher {
+  final Matcher _matcher;
+
+  _Prints(this._matcher);
+
+  bool matches(item, Map matchState) {
+    if (item is! Function) return false;
+
+    var buffer = new StringBuffer();
+    var result = runZoned(item,
+        zoneSpecification: new ZoneSpecification(print: (_, __, ____, line) {
+      buffer.writeln(line);
+    }));
+
+    if (result is! Future) {
+      var actual = buffer.toString();
+      matchState['prints.actual'] = actual;
+      return _matcher.matches(actual, matchState);
+    }
+
+    return completes.matches(result.then((_) {
+      // Re-run expect() so we get the same formatting as we would without being
+      // asynchronous.
+      expect(() {
+        var actual = buffer.toString();
+        if (actual.isEmpty) return;
+
+        // Strip off the final newline because [print] will re-add it.
+        actual = actual.substring(0, actual.length - 1);
+        print(actual);
+      }, this);
+    }), matchState);
+  }
+
+  Description describe(Description description) =>
+      description.add('prints ').addDescriptionOf(_matcher);
+
+  Description describeMismatch(
+      item, Description description, Map matchState, bool verbose) {
+    var actual = matchState.remove('prints.actual');
+    if (actual == null) return description;
+    if (actual.isEmpty) return description.add("printed nothing.");
+
+    description.add('printed ').addDescriptionOf(actual);
+
+    // Create a new description for the matcher because at least
+    // [_StringEqualsMatcher] replaces the previous contents of the description.
+    var innerMismatch = _matcher
+        .describeMismatch(actual, new StringDescription(), matchState, verbose)
+        .toString();
+
+    if (innerMismatch.isNotEmpty) {
+      description.add('\n   Which: ').add(innerMismatch.toString());
+    }
+
+    return description;
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/frontend/skip.dart b/mojo/public/dart/third_party/test/lib/src/frontend/skip.dart
new file mode 100644
index 0000000..aaac280
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/frontend/skip.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.frontend.skip;
+
+/// An annotation for marking a test suite as skipped.
+class Skip {
+  /// The reason the test suite is skipped, or `null` if no reason is given.
+  final String reason;
+
+  /// Marks a suite as skipped.
+  ///
+  /// If [reason] is passed, it's included in the test output as the reason the
+  /// test is skipped.
+  const Skip([this.reason]);
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/frontend/test_on.dart b/mojo/public/dart/third_party/test/lib/src/frontend/test_on.dart
new file mode 100644
index 0000000..74d9749
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/frontend/test_on.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.frontend.test_on;
+
+/// An annotation indicating which platforms a test suite supports.
+///
+/// For the full syntax of [expression], see [the README][].
+///
+/// [the README]: https://github.com/dart-lang/test/#platform-selector-syntax
+class TestOn {
+  /// The expression specifying the platform.
+  final String expression;
+
+  const TestOn(this.expression);
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/frontend/throws_matcher.dart b/mojo/public/dart/third_party/test/lib/src/frontend/throws_matcher.dart
new file mode 100644
index 0000000..7ca469e
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/frontend/throws_matcher.dart
@@ -0,0 +1,113 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.frontend.throws_matcher;
+
+import 'dart:async';
+
+import 'package:matcher/matcher.dart' hide fail, expect;
+
+import '../backend/invoker.dart';
+import '../utils.dart';
+import 'expect.dart';
+
+/// This can be used to match two kinds of objects:
+///
+/// * A [Function] that throws an exception when called. The function cannot
+///   take any arguments. If you want to test that a function expecting
+///   arguments throws, wrap it in another zero-argument function that calls
+///   the one you want to test.
+///
+/// * A [Future] that completes with an exception. Note that this creates an
+///   asynchronous expectation. The call to `expect()` that includes this will
+///   return immediately and execution will continue. Later, when the future
+///   completes, the actual expectation will run.
+const Matcher throws = const Throws();
+
+/// This can be used to match two kinds of objects:
+///
+/// * A [Function] that throws an exception when called. The function cannot
+///   take any arguments. If you want to test that a function expecting
+///   arguments throws, wrap it in another zero-argument function that calls
+///   the one you want to test.
+///
+/// * A [Future] that completes with an exception. Note that this creates an
+///   asynchronous expectation. The call to `expect()` that includes this will
+///   return immediately and execution will continue. Later, when the future
+///   completes, the actual expectation will run.
+///
+/// In both cases, when an exception is thrown, this will test that the
+/// exception object matches [matcher]. If [matcher] is not an instance of
+/// [Matcher], it will implicitly be treated as `equals(matcher)`.
+Matcher throwsA(matcher) => new Throws(wrapMatcher(matcher));
+
+class Throws extends Matcher {
+  final Matcher _matcher;
+
+  const Throws([Matcher matcher]) : this._matcher = matcher;
+
+  bool matches(item, Map matchState) {
+    if (item is! Function && item is! Future) return false;
+    if (item is Future) {
+      Invoker.current.addOutstandingCallback();
+      // Queue up an asynchronous expectation that validates when the future
+      // completes.
+      item.then((value) {
+        fail("Expected future to fail, but succeeded with '$value'.");
+      }, onError: (error, trace) {
+        if (_matcher == null) return;
+
+        var reason;
+        if (trace != null) {
+        var stackTrace = terseChain(trace,
+            verbose: Invoker.current.metadata.verboseTrace);
+          stackTrace = "  ${stackTrace.toString().replaceAll("\n", "\n  ")}";
+          reason = "Actual exception trace:\n$stackTrace";
+        }
+
+        // Re-run [expect] to get the proper formatting.
+        expect(() => throw error, this, reason: reason);
+      }).then((_) => Invoker.current.removeOutstandingCallback());
+      // It hasn't failed yet.
+      return true;
+    }
+
+    try {
+      item();
+      return false;
+    } catch (e, s) {
+      if (_matcher == null || _matcher.matches(e, matchState)) {
+        return true;
+      } else {
+        addStateInfo(matchState, {'exception': e, 'stack': s});
+        return false;
+      }
+    }
+  }
+
+  Description describe(Description description) {
+    if (_matcher == null) {
+      return description.add("throws");
+    } else {
+      return description.add('throws ').addDescriptionOf(_matcher);
+    }
+  }
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (item is! Function && item is! Future) {
+      return mismatchDescription.add('is not a Function or Future');
+    } else if (_matcher == null || matchState['exception'] == null) {
+      return mismatchDescription.add('did not throw');
+    } else {
+      mismatchDescription
+          .add('threw ')
+          .addDescriptionOf(matchState['exception']);
+      if (verbose) {
+        mismatchDescription.add(' at ').add(matchState['stack'].toString());
+      }
+      return mismatchDescription;
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/frontend/throws_matchers.dart b/mojo/public/dart/third_party/test/lib/src/frontend/throws_matchers.dart
new file mode 100644
index 0000000..65fabeb
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/frontend/throws_matchers.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.frontend.throws_matchers;
+
+import 'package:matcher/matcher.dart' hide Throws;
+
+import 'throws_matcher.dart';
+
+/// A matcher for functions that throw ArgumentError.
+const Matcher throwsArgumentError = const Throws(isArgumentError);
+
+/// A matcher for functions that throw ConcurrentModificationError.
+const Matcher throwsConcurrentModificationError =
+    const Throws(isConcurrentModificationError);
+
+/// A matcher for functions that throw CyclicInitializationError.
+const Matcher throwsCyclicInitializationError =
+    const Throws(isCyclicInitializationError);
+
+/// A matcher for functions that throw Exception.
+const Matcher throwsException = const Throws(isException);
+
+/// A matcher for functions that throw FormatException.
+const Matcher throwsFormatException = const Throws(isFormatException);
+
+/// A matcher for functions that throw NoSuchMethodError.
+const Matcher throwsNoSuchMethodError = const Throws(isNoSuchMethodError);
+
+/// A matcher for functions that throw NullThrownError.
+const Matcher throwsNullThrownError = const Throws(isNullThrownError);
+
+/// A matcher for functions that throw RangeError.
+const Matcher throwsRangeError = const Throws(isRangeError);
+
+/// A matcher for functions that throw StateError.
+const Matcher throwsStateError = const Throws(isStateError);
+
+/// A matcher for functions that throw Exception.
+const Matcher throwsUnimplementedError = const Throws(isUnimplementedError);
+
+/// A matcher for functions that throw UnsupportedError.
+const Matcher throwsUnsupportedError = const Throws(isUnsupportedError);
diff --git a/mojo/public/dart/third_party/test/lib/src/frontend/timeout.dart b/mojo/public/dart/third_party/test/lib/src/frontend/timeout.dart
new file mode 100644
index 0000000..78fea38
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/frontend/timeout.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.frontend.timeout;
+
+/// A class representing a modification to the default timeout for a test.
+///
+/// By default, a test will time out after 30 seconds. With [new Timeout], that
+/// can be overridden entirely; with [new Timeout.factor], it can be scaled
+/// relative to the default.
+class Timeout {
+  /// A constant indicating that a test should never time out.
+  static const none = const Timeout._none();
+
+  /// The timeout duration.
+  ///
+  /// If set, this overrides the default duration entirely. It's `null` for
+  /// timeouts with a non-null [scaleFactor] and for [Timeout.none].
+  final Duration duration;
+
+  /// The timeout factor.
+  ///
+  /// The default timeout will be multiplied by this to get the new timeout.
+  /// Thus a factor of 2 means that the test will take twice as long to time
+  /// out, and a factor of 0.5 means that it will time out twice as quickly.
+  ///
+  /// This is `null` for timeouts with a non-null [duration] and for
+  /// [Timeout.none].
+  final num scaleFactor;
+
+  /// Declares an absolute timeout that overrides the default.
+  const Timeout(this.duration)
+      : scaleFactor = null;
+
+  /// Declares a relative timeout that scales the default.
+  const Timeout.factor(this.scaleFactor)
+      : duration = null;
+
+  const Timeout._none()
+      : scaleFactor = null,
+        duration = null;
+
+  /// Returns a new [Timeout] that merges [this] with [other].
+  ///
+  /// If [other] declares a [duration], that takes precedence. Otherwise, this
+  /// timeout's [duration] or [factor] are multiplied by [other]'s [factor].
+  Timeout merge(Timeout other) {
+    if (this == none || other == none) return none;
+    if (other.duration != null) return new Timeout(other.duration);
+    if (duration != null) return new Timeout(duration * other.scaleFactor);
+    return new Timeout.factor(scaleFactor * other.scaleFactor);
+  }
+
+  /// Returns a new [Duration] from applying [this] to [base].
+  ///
+  /// If this is [none], returns `null`.
+  Duration apply(Duration base) {
+    if (this == none) return null;
+    return duration == null ? base * scaleFactor : duration;
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner.dart b/mojo/public/dart/third_party/test/lib/src/runner.dart
new file mode 100644
index 0000000..9a5756b
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner.dart
@@ -0,0 +1,256 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:async/async.dart';
+
+import 'backend/test_platform.dart';
+import 'runner/application_exception.dart';
+import 'runner/configuration.dart';
+import 'runner/engine.dart';
+import 'runner/load_exception.dart';
+import 'runner/load_suite.dart';
+import 'runner/loader.dart';
+import 'runner/reporter.dart';
+import 'runner/reporter/compact.dart';
+import 'runner/reporter/expanded.dart';
+import 'runner/runner_suite.dart';
+import 'util/io.dart';
+import 'utils.dart';
+
+/// A class that loads and runs tests based on a [Configuration].
+///
+/// This maintains a [Loader] and an [Engine] and passes test suites from one to
+/// the other, as well as printing out tests with a [CompactReporter] or an
+/// [ExpandedReporter].
+class Runner {
+  /// The configuration for the runner.
+  final Configuration _config;
+
+  /// The loader that loads the test suites from the filesystem.
+  final Loader _loader;
+
+  /// The engine that runs the test suites.
+  final Engine _engine;
+
+  /// The reporter that's emitting the test runner's results.
+  final Reporter _reporter;
+
+  /// The subscription to the stream returned by [_loadSuites].
+  StreamSubscription _suiteSubscription;
+
+  /// The memoizer for ensuring [close] only runs once.
+  final _closeMemo = new AsyncMemoizer();
+  bool get _closed => _closeMemo.hasRun;
+
+  /// Creates a new runner based on [configuration].
+  factory Runner(Configuration config) {
+    var loader = new Loader(config);
+    var engine = new Engine(concurrency: config.concurrency);
+
+    var watch = config.reporter == "compact"
+        ? CompactReporter.watch
+        : ExpandedReporter.watch;
+
+    var reporter = watch(
+        engine,
+        color: config.color,
+        verboseTrace: config.verboseTrace,
+        printPath: config.paths.length > 1 ||
+            new Directory(config.paths.single).existsSync(),
+        printPlatform: config.platforms.length > 1);
+
+    return new Runner._(config, loader, engine, reporter);
+  }
+
+  Runner._(this._config, this._loader, this._engine, this._reporter);
+
+  /// Starts the runner.
+  ///
+  /// This starts running tests and printing their progress. It returns whether
+  /// or not they ran successfully.
+  Future<bool> run() async {
+    if (_closed) {
+      throw new StateError("run() may not be called on a closed Runner.");
+    }
+
+    var suites = _loadSuites();
+
+    var success;
+    if (_config.pauseAfterLoad) {
+      success = await _loadThenPause(suites);
+    } else {
+      _suiteSubscription = suites.listen(_engine.suiteSink.add);
+      var results = await Future.wait([
+        _suiteSubscription.asFuture().then((_) => _engine.suiteSink.close()),
+        _engine.run()
+      ], eagerError: true);
+      success = results.last;
+    }
+
+    if (_closed) return false;
+
+    if (_engine.passed.length == 0 && _engine.failed.length == 0 &&
+        _engine.skipped.length == 0 && _config.pattern != null) {
+      var message = 'No tests match ';
+
+      if (_config.pattern is RegExp) {
+        var pattern = (_config.pattern as RegExp).pattern;
+        message += 'regular expression "$pattern".';
+      } else {
+        message += '"${_config.pattern}".';
+      }
+      throw new ApplicationException(message);
+    }
+
+    // Explicitly check "== true" here because [Engine.run] can return `null`
+    // if the engine was closed prematurely.
+    return success == true;
+  }
+
+  /// Closes the runner.
+  ///
+  /// This stops any future test suites from running. It will wait for any
+  /// currently-running VM tests, in case they have stuff to clean up on the
+  /// filesystem.
+  Future close() => _closeMemo.runOnce(() async {
+    var timer;
+    if (!_engine.isIdle) {
+      // Wait a bit to print this message, since printing it eagerly looks weird
+      // if the tests then finish immediately.
+      timer = new Timer(new Duration(seconds: 1), () {
+        // Pause the reporter while we print to ensure that we don't interfere
+        // with its output.
+        _reporter.pause();
+        print("Waiting for current test(s) to finish.");
+        print("Press Control-C again to terminate immediately.");
+        _reporter.resume();
+      });
+    }
+
+    if (_suiteSubscription != null) _suiteSubscription.cancel();
+    _suiteSubscription = null;
+
+    // Make sure we close the engine *before* the loader. Otherwise,
+    // LoadSuites provided by the loader may get into bad states.
+    await _engine.close();
+    if (timer != null) timer.cancel();
+    await _loader.close();
+  });
+
+  /// Return a stream of [LoadSuite]s in [_config.paths].
+  ///
+  /// Only tests that match [_config.pattern] will be included in the
+  /// suites once they're loaded.
+  Stream<LoadSuite> _loadSuites() {
+    return mergeStreams(_config.paths.map((path) {
+      if (new Directory(path).existsSync()) return _loader.loadDir(path);
+      if (new File(path).existsSync()) return _loader.loadFile(path);
+
+      return new Stream.fromIterable([
+        new LoadSuite("loading $path", () =>
+            throw new LoadException(path, 'Does not exist.'))
+      ]);
+    })).map((loadSuite) {
+      return loadSuite.changeSuite((suite) {
+        if (_config.pattern == null) return suite;
+        return suite.change(tests: suite.tests.where((test) =>
+            test.name.contains(_config.pattern)));
+      });
+    });
+  }
+
+  /// Loads each suite in [suites] in order, pausing after load for platforms
+  /// that support debugging.
+  Future<bool> _loadThenPause(Stream<LoadSuite> suites) async {
+    if (_config.platforms.contains(TestPlatform.vm)) {
+      warn("Debugging is currently unsupported on the Dart VM.",
+          color: _config.color);
+    }
+
+    _suiteSubscription = suites.asyncMap((loadSuite) async {
+      // Make the underlying suite null so that the engine doesn't start running
+      // it immediately.
+      _engine.suiteSink.add(loadSuite.changeSuite((_) => null));
+
+      var suite = await loadSuite.suite;
+      if (suite == null) return;
+
+      await _pause(suite);
+      if (_closed) return;
+
+      _engine.suiteSink.add(suite);
+      await _engine.onIdle.first;
+    }).listen(null);
+
+    var results = await Future.wait([
+      _suiteSubscription.asFuture().then((_) => _engine.suiteSink.close()),
+      _engine.run()
+    ]);
+    return results.last;
+  }
+
+  /// Pauses the engine and the reporter so that the user can set breakpoints as
+  /// necessary.
+  ///
+  /// This is a no-op for test suites that aren't on platforms where debugging
+  /// is supported.
+  Future _pause(RunnerSuite suite) async {
+    if (suite.platform == null) return;
+    if (suite.platform == TestPlatform.vm) return;
+
+    try {
+      _reporter.pause();
+
+      var bold = _config.color ? '\u001b[1m' : '';
+      var yellow = _config.color ? '\u001b[33m' : '';
+      var noColor = _config.color ? '\u001b[0m' : '';
+      print('');
+
+      if (suite.platform.isDartVM) {
+        var url = suite.environment.observatoryUrl;
+        if (url == null) {
+          print("${yellow}Observatory URL not found. Make sure you're using "
+              "${suite.platform.name} 1.11 or later.$noColor");
+        } else {
+          print("Observatory URL: $bold$url$noColor");
+        }
+      }
+
+      if (suite.platform.isHeadless) {
+        var url = suite.environment.remoteDebuggerUrl;
+        if (url == null) {
+          print("${yellow}Remote debugger URL not found.$noColor");
+        } else {
+          print("Remote debugger URL: $bold$url$noColor");
+        }
+      }
+
+      var buffer = new StringBuffer(
+          "${bold}The test runner is paused.${noColor} ");
+      if (!suite.platform.isHeadless) {
+        buffer.write("Open the dev console in ${suite.platform} ");
+      } else {
+        buffer.write("Open the remote debugger ");
+      }
+      if (suite.platform.isDartVM) buffer.write("or the Observatory ");
+
+      buffer.write("and set breakpoints. Once you're finished, return to this "
+          "terminal and press Enter.");
+
+      print(wordWrap(buffer.toString()));
+
+      await inCompletionOrder([
+        suite.environment.displayPause(),
+        cancelableNext(stdinLines)
+      ]).first;
+    } finally {
+      _reporter.resume();
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/application_exception.dart b/mojo/public/dart/third_party/test/lib/src/runner/application_exception.dart
new file mode 100644
index 0000000..2dc4469
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/application_exception.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.application_exception;
+
+/// An expected exception caused by user-controllable circumstances.
+class ApplicationException implements Exception {
+  final String message;
+
+  ApplicationException(this.message);
+
+  String toString() => message;
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/browser/browser.dart b/mojo/public/dart/third_party/test/lib/src/runner/browser/browser.dart
new file mode 100644
index 0000000..bdb67fd
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/browser/browser.dart
@@ -0,0 +1,121 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.browser.browser;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:stack_trace/stack_trace.dart';
+
+import '../../utils.dart';
+import '../application_exception.dart';
+
+typedef Future<Process> StartBrowserFn();
+
+/// An interface for running browser instances.
+///
+/// This is intentionally coarse-grained: browsers are controlled primary from
+/// inside a single tab. Thus this interface only provides support for closing
+/// the browser and seeing if it closes itself.
+///
+/// Any errors starting or running the browser process are reported through
+/// [onExit].
+abstract class Browser {
+  String get name;
+
+  /// The Observatory URL for this browser.
+  ///
+  /// This will throw an [UnsupportedError] for browsers that aren't running the
+  /// Dart VM, and return `null` if the Observatory URL can't be found.
+  Future<Uri> get observatoryUrl =>
+      throw new UnsupportedError("$name doesn't support Observatory.");
+
+  /// The remote debugger URL for this browser.
+  ///
+  /// This will throw an [UnsupportedError] for browsers that don't support
+  /// remote debugging, and return `null` if the remote debugging URL can't be
+  /// found.
+  Future<Uri> get remoteDebuggerUrl =>
+      throw new UnsupportedError("$name doesn't support remote debugging.");
+
+  /// The underlying process.
+  ///
+  /// This will fire once the process has started successfully.
+  Future<Process> get _process => _processCompleter.future;
+  final _processCompleter = new Completer<Process>();
+
+  /// Whether [close] has been called.
+  var _closed = false;
+
+  /// A future that completes when the browser exits.
+  ///
+  /// If there's a problem starting or running the browser, this will complete
+  /// with an error.
+  Future get onExit => _onExitCompleter.future;
+  final _onExitCompleter = new Completer();
+
+  /// Creates a new browser.
+  ///
+  /// This is intended to be called by subclasses. They pass in [startBrowser],
+  /// which asynchronously returns the browser process. Any errors in
+  /// [startBrowser] (even those raised asynchronously after it returns) are
+  /// piped to [onExit] and will cause the browser to be killed.
+  Browser(Future<Process> startBrowser()) {
+    // Don't return a Future here because there's no need for the caller to wait
+    // for the process to actually start. They should just wait for the HTTP
+    // request instead.
+    runZoned(() async {
+      var process = await startBrowser();
+      _processCompleter.complete(process);
+
+      var exitCode = await process.exitCode;
+
+      // This hack dodges an otherwise intractable race condition. When the user
+      // presses Control-C, the signal is sent to the browser and the test
+      // runner at the same time. It's possible for the browser to exit before
+      // the [Browser.close] is called, which would trigger the error below.
+      //
+      // A negative exit code signals that the process exited due to a signal.
+      // However, it's possible that this signal didn't come from the user's
+      // Control-C, in which case we do want to throw the error. The only way to
+      // resolve the ambiguity is to wait a brief amount of time and see if this
+      // browser is actually closed.
+      if (!_closed && exitCode < 0) {
+        await new Future.delayed(new Duration(milliseconds: 200));
+      }
+
+      if (!_closed && exitCode != 0) {
+        throw new ApplicationException(
+            "$name failed with exit code $exitCode.");
+      }
+
+      _onExitCompleter.complete();
+    }, onError: (error, stackTrace) {
+      // Ignore any errors after the browser has been closed.
+      if (_closed) return;
+
+      // Make sure the process dies even if the error wasn't fatal.
+      _process.then((process) => process.kill());
+
+      if (stackTrace == null) stackTrace = new Trace.current();
+      _onExitCompleter.completeError(
+          new ApplicationException(
+              "Failed to run $name: ${getErrorMessage(error)}."),
+          stackTrace);
+    });
+  }
+
+  /// Kills the browser process.
+  ///
+  /// Returns the same [Future] as [onExit], except that it won't emit
+  /// exceptions.
+  Future close() {
+    _closed = true;
+    _process.then((process) => process.kill());
+
+    // Swallow exceptions. The user should explicitly use [onExit] for these.
+    return onExit.catchError((_) {});
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/browser/browser_manager.dart b/mojo/public/dart/third_party/test/lib/src/runner/browser/browser_manager.dart
new file mode 100644
index 0000000..7498efa
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/browser/browser_manager.dart
@@ -0,0 +1,300 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.browser.browser_manager;
+
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:async/async.dart';
+import 'package:http_parser/http_parser.dart';
+import 'package:pool/pool.dart';
+
+import '../../backend/metadata.dart';
+import '../../backend/test_platform.dart';
+import '../../util/cancelable_future.dart';
+import '../../util/multi_channel.dart';
+import '../../util/remote_exception.dart';
+import '../../util/stack_trace_mapper.dart';
+import '../../utils.dart';
+import '../application_exception.dart';
+import '../environment.dart';
+import '../load_exception.dart';
+import '../runner_suite.dart';
+import 'browser.dart';
+import 'chrome.dart';
+import 'content_shell.dart';
+import 'dartium.dart';
+import 'firefox.dart';
+import 'iframe_test.dart';
+import 'internet_explorer.dart';
+import 'phantom_js.dart';
+import 'safari.dart';
+
+/// A class that manages the connection to a single running browser.
+///
+/// This is in charge of telling the browser which test suites to load and
+/// converting its responses into [Suite] objects.
+class BrowserManager {
+  /// The browser instance that this is connected to via [_channel].
+  final Browser _browser;
+
+  // TODO(nweiz): Consider removing the duplication between this and
+  // [_browser.name].
+  /// The [TestPlatform] for [_browser].
+  final TestPlatform _platform;
+
+  /// The channel used to communicate with the browser.
+  ///
+  /// This is connected to a page running `static/host.dart`.
+  final MultiChannel _channel;
+
+  /// A pool that ensures that limits the number of initial connections the
+  /// manager will wait for at once.
+  ///
+  /// This isn't the *total* number of connections; any number of iframes may be
+  /// loaded in the same browser. However, the browser can only load so many at
+  /// once, and we want a timeout in case they fail so we only wait for so many
+  /// at once.
+  final _pool = new Pool(8);
+
+  /// The ID of the next suite to be loaded.
+  ///
+  /// This is used to ensure that the suites can be referred to consistently
+  /// across the client and server.
+  int _suiteId = 0;
+
+  /// Whether the channel to the browser has closed.
+  bool _closed = false;
+
+  /// The completer for [_BrowserEnvironment.displayPause].
+  ///
+  /// This will be `null` as long as the browser isn't displaying a pause
+  /// screen.
+  CancelableCompleter _pauseCompleter;
+
+  /// The environment to attach to each suite.
+  Future<_BrowserEnvironment> _environment;
+
+  /// Starts the browser identified by [platform] and has it connect to [url].
+  ///
+  /// [url] should serve a page that establishes a WebSocket connection with
+  /// this process. That connection, once established, should be emitted via
+  /// [future]. If [debug] is true, starts the browser in debug mode, with its
+  /// debugger interfaces on and detected.
+  ///
+  /// Returns the browser manager, or throws an [ApplicationException] if a
+  /// connection fails to be established.
+  static Future<BrowserManager> start(TestPlatform platform, Uri url,
+      Future<CompatibleWebSocket> future, {bool debug: false}) {
+    var browser = _newBrowser(url, platform, debug: debug);
+
+    var completer = new Completer();
+
+    // TODO(nweiz): Gracefully handle the browser being killed before the
+    // tests complete.
+    browser.onExit.then((_) {
+      throw new ApplicationException(
+          "${platform.name} exited before connecting.");
+    }).catchError((error, stackTrace) {
+      if (completer.isCompleted) return;
+      completer.completeError(error, stackTrace);
+    });
+
+    future.then((webSocket) {
+      if (completer.isCompleted) return;
+      completer.complete(new BrowserManager._(browser, platform, webSocket));
+    }).catchError((error, stackTrace) {
+      browser.close();
+      if (completer.isCompleted) return;
+      completer.completeError(error, stackTrace);
+    });
+
+    return completer.future.timeout(new Duration(seconds: 30), onTimeout: () {
+      browser.close();
+      throw new ApplicationException(
+          "Timed out waiting for ${platform.name} to connect.");
+    });
+  }
+
+  /// Starts the browser identified by [browser] and has it load [url].
+  ///
+  /// If [debug] is true, starts the browser in debug mode.
+  static Browser _newBrowser(Uri url, TestPlatform browser,
+      {bool debug: false}) {
+    switch (browser) {
+      case TestPlatform.dartium: return new Dartium(url, debug: debug);
+      case TestPlatform.contentShell:
+        return new ContentShell(url, debug: debug);
+      case TestPlatform.chrome: return new Chrome(url);
+      case TestPlatform.phantomJS: return new PhantomJS(url, debug: debug);
+      case TestPlatform.firefox: return new Firefox(url);
+      case TestPlatform.safari: return new Safari(url);
+      case TestPlatform.internetExplorer: return new InternetExplorer(url);
+      default:
+        throw new ArgumentError("$browser is not a browser.");
+    }
+  }
+
+  /// Creates a new BrowserManager that communicates with [browser] over
+  /// [webSocket].
+  BrowserManager._(this._browser, this._platform, CompatibleWebSocket webSocket)
+      : _channel = new MultiChannel(
+          webSocket.map(JSON.decode),
+          mapSink(webSocket, JSON.encode)) {
+    _environment = _loadBrowserEnvironment();
+    _channel.stream.listen(_onMessage, onDone: close);
+  }
+
+  /// Loads [_BrowserEnvironment].
+  Future<_BrowserEnvironment> _loadBrowserEnvironment() async {
+    var observatoryUrl;
+    if (_platform.isDartVM) observatoryUrl = await _browser.observatoryUrl;
+
+    var remoteDebuggerUrl;
+    if (_platform.isHeadless) {
+      remoteDebuggerUrl = await _browser.remoteDebuggerUrl;
+    }
+
+    return new _BrowserEnvironment(this, observatoryUrl, remoteDebuggerUrl);
+  }
+
+  /// Tells the browser the load a test suite from the URL [url].
+  ///
+  /// [url] should be an HTML page with a reference to the JS-compiled test
+  /// suite. [path] is the path of the original test suite file, which is used
+  /// for reporting. [metadata] is the parsed metadata for the test suite.
+  ///
+  /// If [mapper] is passed, it's used to map stack traces for errors coming
+  /// from this test suite.
+  Future<RunnerSuite> loadSuite(String path, Uri url, Metadata metadata,
+      {StackTraceMapper mapper}) async {
+    url = url.replace(fragment: Uri.encodeFull(JSON.encode({
+      "metadata": metadata.serialize(),
+      "browser": _platform.identifier
+    })));
+
+    // The stream may close before emitting a value if the browser is killed
+    // prematurely (e.g. via Control-C).
+    var suiteVirtualChannel = _channel.virtualChannel();
+    var suiteId = _suiteId++;
+    var suiteChannel;
+
+    closeIframe() {
+      if (_closed) return;
+      suiteChannel.sink.close();
+      _channel.sink.add({
+        "command": "closeSuite",
+        "id": suiteId
+      });
+    }
+
+    var response = await _pool.withResource(() {
+      _channel.sink.add({
+        "command": "loadSuite",
+        "url": url.toString(),
+        "id": suiteId,
+        "channel": suiteVirtualChannel.id
+      });
+
+      // Create a nested MultiChannel because the iframe will be using a channel
+      // wrapped within the host's channel.
+      suiteChannel = new MultiChannel(
+          suiteVirtualChannel.stream, suiteVirtualChannel.sink);
+
+      var completer = new Completer();
+      suiteChannel.stream.listen((response) {
+        if (response["type"] == "print") {
+          print(response["line"]);
+        } else {
+          completer.complete(response);
+        }
+      }, onDone: () {
+        if (!completer.isCompleted) completer.complete();
+      });
+
+      return completer.future.timeout(new Duration(minutes: 1), onTimeout: () {
+        throw new LoadException(
+            path,
+            "Timed out waiting for the test suite to connect on "
+                "${_platform.name}.");
+      });
+    });
+
+    if (response == null) {
+      closeIframe();
+      throw new LoadException(
+          path, "Connection closed before test suite loaded.");
+    }
+
+    if (response["type"] == "loadException") {
+      closeIframe();
+      throw new LoadException(path, response["message"]);
+    }
+
+    if (response["type"] == "error") {
+      closeIframe();
+      var asyncError = RemoteException.deserialize(response["error"]);
+      await new Future.error(
+          new LoadException(path, asyncError.error),
+          asyncError.stackTrace);
+    }
+
+    return new RunnerSuite(await _environment, response["tests"].map((test) {
+      var testMetadata = new Metadata.deserialize(test['metadata']);
+      var testChannel = suiteChannel.virtualChannel(test['channel']);
+      return new IframeTest(test['name'], testMetadata, testChannel,
+          mapper: mapper);
+    }), platform: _platform, metadata: metadata, path: path,
+        onClose: () => closeIframe());
+  }
+
+  /// An implementation of [Environment.displayPause].
+  CancelableFuture _displayPause() {
+    if (_pauseCompleter != null) return _pauseCompleter.future;
+
+    _pauseCompleter = new CancelableCompleter(() {
+      _channel.sink.add({"command": "resume"});
+      _pauseCompleter = null;
+    });
+
+    _channel.sink.add({"command": "displayPause"});
+    return _pauseCompleter.future.whenComplete(() {
+      _pauseCompleter = null;
+    });
+  }
+
+  /// The callback for handling messages received from the host page.
+  void _onMessage(Map message) {
+    assert(message["command"] == "resume");
+    if (_pauseCompleter == null) return;
+    _pauseCompleter.complete();
+  }
+
+  /// Closes the manager and releases any resources it owns, including closing
+  /// the browser.
+  Future close() => _closeMemoizer.runOnce(() {
+    _closed = true;
+    if (_pauseCompleter != null) _pauseCompleter.complete();
+    _pauseCompleter = null;
+    return _browser.close();
+  });
+  final _closeMemoizer = new AsyncMemoizer();
+}
+
+/// An implementation of [Environment] for the browser.
+///
+/// All methods forward directly to [BrowserManager].
+class _BrowserEnvironment implements Environment {
+  final BrowserManager _manager;
+
+  final Uri observatoryUrl;
+
+  final Uri remoteDebuggerUrl;
+
+  _BrowserEnvironment(this._manager, this.observatoryUrl,
+      this.remoteDebuggerUrl);
+
+  CancelableFuture displayPause() => _manager._displayPause();
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/browser/chrome.dart b/mojo/public/dart/third_party/test/lib/src/runner/browser/chrome.dart
new file mode 100644
index 0000000..351c490
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/browser/chrome.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.browser.chrome;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+
+import '../../util/io.dart';
+import 'browser.dart';
+
+// TODO(nweiz): move this into its own package?
+/// A class for running an instance of Chrome.
+///
+/// Most of the communication with the browser is expected to happen via HTTP,
+/// so this exposes a bare-bones API. The browser starts as soon as the class is
+/// constructed, and is killed when [close] is called.
+///
+/// Any errors starting or running the process are reported through [onExit].
+class Chrome extends Browser {
+  final name = "Chrome";
+
+  /// Starts a new instance of Chrome open to the given [url], which may be a
+  /// [Uri] or a [String].
+  ///
+  /// If [executable] is passed, it's used as the Chrome executable. Otherwise
+  /// the default executable name for the current OS will be used.
+  Chrome(url, {String executable})
+      : super(() => _startBrowser(url, executable));
+
+  static Future<Process> _startBrowser(url, [String executable]) async {
+    if (executable == null) executable = _defaultExecutable();
+
+    var dir = createTempDir();
+    var process = await Process.start(executable, [
+      "--user-data-dir=$dir",
+      url.toString(),
+      "--disable-extensions",
+      "--disable-popup-blocking",
+      "--bwsi",
+      "--no-first-run",
+      "--no-default-browser-check",
+      "--disable-default-apps",
+      "--disable-translate"
+    ]);
+
+    process.exitCode
+        .then((_) => new Directory(dir).deleteSync(recursive: true));
+
+    return process;
+  }
+
+  /// Return the default executable for the current operating system.
+  static String _defaultExecutable() {
+    if (Platform.isMacOS) {
+      return '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome';
+    }
+    if (!Platform.isWindows) return 'google-chrome';
+
+    // Chrome could be installed in several places on Windows. The only way to
+    // find it is to check.
+    var prefixes = [
+      Platform.environment['LOCALAPPDATA'],
+      Platform.environment['PROGRAMFILES'],
+      Platform.environment['PROGRAMFILES(X86)']
+    ];
+    var suffix = r'Google\Chrome\Application\chrome.exe';
+
+    for (var prefix in prefixes) {
+      if (prefix == null) continue;
+
+      var path = p.join(prefix, suffix);
+      if (new File(p.join(prefix, suffix)).existsSync()) return path;
+    }
+
+    // Fall back on looking it up on the path. This probably won't work, but at
+    // least it will fail with a useful error message.
+    return "chrome.exe";
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/browser/compiler_pool.dart b/mojo/public/dart/third_party/test/lib/src/runner/browser/compiler_pool.dart
new file mode 100644
index 0000000..edc41bf
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/browser/compiler_pool.dart
@@ -0,0 +1,152 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.util.compiler_pool;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:async/async.dart';
+import 'package:path/path.dart' as p;
+import 'package:pool/pool.dart';
+
+import '../../util/io.dart';
+import '../load_exception.dart';
+
+/// A pool of `dart2js` instances.
+///
+/// This limits the number of compiler instances running concurrently.
+class CompilerPool {
+  /// The internal pool that controls the number of process running at once.
+  final Pool _pool;
+
+  /// Whether to enable colors on dart2js.
+  final bool _color;
+
+  /// The currently-active dart2js processes.
+  final _processes = new Set<Process>();
+
+  /// Whether [close] has been called.
+  bool get _closed => _closeMemo.hasRun;
+
+  /// The memoizer for running [close] exactly once.
+  final _closeMemo = new AsyncMemoizer();
+
+  /// Creates a compiler pool that runs up to [concurrency] instances of
+  /// `dart2js` at once.
+  ///
+  /// If [concurrency] isn't provided, it defaults to 4.
+  ///
+  /// If [color] is true, `dart2js` will be run with colors enabled.
+  CompilerPool({int concurrency, bool color: false})
+      : _pool = new Pool(concurrency == null ? 4 : concurrency),
+        _color = color;
+
+  /// Compile the Dart code at [dartPath] to [jsPath].
+  ///
+  /// This wraps the Dart code in the standard browser-testing wrapper. If
+  /// [packageRoot] is provided, it's used as the package root for the
+  /// compilation.
+  ///
+  /// The returned [Future] will complete once the `dart2js` process completes
+  /// *and* all its output has been printed to the command line.
+  Future compile(String dartPath, String jsPath, {String packageRoot}) {
+    return _pool.withResource(() {
+      if (_closed) return null;
+
+      return withTempDir((dir) async {
+        var wrapperPath = p.join(dir, "runInBrowser.dart");
+        new File(wrapperPath).writeAsStringSync('''
+import "package:test/src/runner/browser/iframe_listener.dart";
+
+import "${p.toUri(p.absolute(dartPath))}" as test;
+
+void main(_) {
+  IframeListener.start(() => test.main);
+}
+''');
+
+        var dart2jsPath = p.join(sdkDir, 'bin', 'dart2js');
+        if (Platform.isWindows) dart2jsPath += '.bat';
+
+        var args = ["--checked", wrapperPath, "--out=$jsPath", "--show-package-warnings"];
+
+        if (packageRoot != null) {
+          args.add("--package-root=${p.toUri(p.absolute(packageRoot))}");
+        }
+
+        if (_color) args.add("--enable-diagnostic-colors");
+
+        var process = await Process.start(dart2jsPath, args);
+        if (_closed) {
+          process.kill();
+          return;
+        }
+
+        _processes.add(process);
+
+        /// Wait until the process is entirely done to print out any output.
+        /// This can produce a little extra time for users to wait with no
+        /// update, but it also avoids some really nasty-looking interleaved
+        /// output. Write both stdout and stderr to the same buffer in case
+        /// they're intended to be printed in order.
+        var buffer = new StringBuffer();
+
+        await Future.wait([
+          _printOutputStream(process.stdout, buffer),
+          _printOutputStream(process.stderr, buffer),
+        ]);
+
+        var exitCode = await process.exitCode;
+        _processes.remove(process);
+        if (_closed) return;
+
+        if (buffer.isNotEmpty) print(buffer);
+
+        if (exitCode != 0) throw new LoadException(dartPath, "dart2js failed.");
+
+        _fixSourceMap(jsPath + '.map');
+      });
+    });
+  }
+
+  // TODO(nweiz): Remove this when sdk#17544 is fixed.
+  /// Fix up the source map at [mapPath] so that it points to absolute file:
+  /// URIs that are resolvable by the browser.
+  void _fixSourceMap(String mapPath) {
+    var map = JSON.decode(new File(mapPath).readAsStringSync());
+    var root = map['sourceRoot'];
+
+    map['sources'] = map['sources'].map((source) {
+      var url = Uri.parse(root + source);
+      if (url.scheme != '' && url.scheme != 'file') return source;
+      if (url.path.endsWith("/runInBrowser.dart")) return "";
+      return p.toUri(mapPath).resolveUri(url).toString();
+    }).toList();
+
+    new File(mapPath).writeAsStringSync(JSON.encode(map));
+  }
+
+  /// Sanitizes the bytes emitted by [stream], converts them to text, and writes
+  /// them to [buffer].
+  Future _printOutputStream(Stream<List<int>> stream, StringBuffer buffer) {
+    return sanitizeForWindows(stream)
+        .listen((data) => buffer.write(UTF8.decode(data))).asFuture();
+  }
+
+  /// Closes the compiler pool.
+  ///
+  /// This kills all currently-running compilers and ensures that no more will
+  /// be started. It returns a [Future] that completes once all the compilers
+  /// have been killed and all resources released.
+  Future close() {
+    return _closeMemo.runOnce(() async {
+      await Future.wait(_processes.map((process) async {
+        process.kill();
+        await process.exitCode;
+      }));
+    });
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/browser/content_shell.dart b/mojo/public/dart/third_party/test/lib/src/runner/browser/content_shell.dart
new file mode 100644
index 0000000..acab425
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/browser/content_shell.dart
@@ -0,0 +1,126 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.browser.content_shell;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import '../../util/io.dart';
+import '../../utils.dart';
+import '../application_exception.dart';
+import 'browser.dart';
+
+final _observatoryRegExp = new RegExp(r"^Observatory listening on ([^ ]+)");
+
+/// A class for running an instance of the Dartium content shell.
+///
+/// Most of the communication with the browser is expected to happen via HTTP,
+/// so this exposes a bare-bones API. The browser starts as soon as the class is
+/// constructed, and is killed when [close] is called.
+///
+/// Any errors starting or running the process are reported through [onExit].
+class ContentShell extends Browser {
+  final name = "Content Shell";
+
+  final Future<Uri> observatoryUrl;
+
+  final Future<Uri> remoteDebuggerUrl;
+
+  factory ContentShell(url, {String executable, bool debug: false}) {
+    var observatoryCompleter = new Completer.sync();
+    var remoteDebuggerCompleter = new Completer.sync();
+    return new ContentShell._(() {
+      if (executable == null) executable = _defaultExecutable();
+
+      tryPort([port]) async {
+        var args = ["--dump-render-tree", url.toString()];
+        if (port != null) args.add("--remote-debugging-port=$port");
+
+        var process = await Process.start(executable, args,
+            environment: {"DART_FLAGS": "--checked"});
+
+        if (debug) {
+          observatoryCompleter.complete(lineSplitter.bind(process.stdout)
+              .map((line) {
+            var match = _observatoryRegExp.firstMatch(line);
+            if (match == null) return null;
+            return Uri.parse(match[1]);
+          }).where((uri) => uri != null).first);
+        } else {
+          observatoryCompleter.complete(null);
+        }
+
+        var stderr = new StreamIterator(lineSplitter.bind(process.stderr));
+
+        // Before we can consider content_shell started successfully, we have to
+        // make sure it's not expired and that the remote debugging port worked.
+        // Any errors from this will always come before the "Running without
+        // renderer sanxbox" message.
+        while (await stderr.moveNext() &&
+            !stderr.current.endsWith("Running without renderer sandbox")) {
+          if (stderr.current == "[dartToStderr]: Dartium build has expired") {
+            stderr.cancel();
+            process.kill();
+            // TODO(nweiz): link to dartlang.org once it has download links for
+            // content shell
+            // (https://github.com/dart-lang/www.dartlang.org/issues/1164).
+            throw new ApplicationException(
+                "You're using an expired content_shell. Upgrade to the latest "
+                    "version:\n"
+                "http://gsdview.appspot.com/dart-archive/channels/stable/"
+                    "release/latest/dartium/");
+          } else if (stderr.current.contains("bind() returned an error")) {
+            // If we failed to bind to the port, return null to tell
+            // getUnusedPort to try another one.
+            stderr.cancel();
+            process.kill();
+            return null;
+          }
+        }
+
+        if (port != null) {
+          remoteDebuggerCompleter.complete(
+              _getRemoteDebuggerUrl(Uri.parse("http://localhost:$port")));
+        } else {
+          remoteDebuggerCompleter.complete(null);
+        }
+
+        stderr.cancel();
+        return process;
+      }
+
+      if (!debug) return tryPort();
+      return getUnusedPort(tryPort);
+    }, observatoryCompleter.future, remoteDebuggerCompleter.future);
+  }
+
+  /// Returns the full URL of the remote debugger for the host page.
+  ///
+  /// This takes the base remote debugger URL (which points to a browser-wide
+  /// page) and uses its JSON API to find the resolved URL for debugging the
+  /// host page.
+  static Future<Uri> _getRemoteDebuggerUrl(Uri base) async {
+    try {
+      var client = new HttpClient();
+      var request = await client.getUrl(base.resolve("/json/list"));
+      var response = await request.close();
+      var json = await JSON.fuse(UTF8).decoder.bind(response).single;
+      return base.resolve(json.first["devtoolsFrontendUrl"]);
+    } catch (_) {
+      // If we fail to talk to the remote debugger protocol, give up and return
+      // the raw URL rather than crashing.
+      return base;
+    }
+  }
+
+  ContentShell._(Future<Process> startBrowser(), this.observatoryUrl,
+          this.remoteDebuggerUrl)
+      : super(startBrowser);
+
+  /// Return the default executable for the current operating system.
+  static String _defaultExecutable() =>
+      Platform.isWindows ? "content_shell.exe" : "content_shell";
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/browser/dartium.dart b/mojo/public/dart/third_party/test/lib/src/runner/browser/dartium.dart
new file mode 100644
index 0000000..b7ae86f
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/browser/dartium.dart
@@ -0,0 +1,253 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.browser.dartium;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:async/async.dart';
+import 'package:path/path.dart' as p;
+
+import '../../util/cancelable_future.dart';
+import '../../util/io.dart';
+import '../../utils.dart';
+import 'browser.dart';
+
+final _observatoryRegExp = new RegExp(r"^Observatory listening on ([^ ]+)");
+
+/// A class for running an instance of Dartium.
+///
+/// Most of the communication with the browser is expected to happen via HTTP,
+/// so this exposes a bare-bones API. The browser starts as soon as the class is
+/// constructed, and is killed when [close] is called.
+///
+/// Any errors starting or running the process are reported through [onExit].
+class Dartium extends Browser {
+  final name = "Dartium";
+
+  final Future<Uri> observatoryUrl;
+
+  factory Dartium(url, {String executable, bool debug: false}) {
+    var completer = new Completer.sync();
+    return new Dartium._(() async {
+      if (executable == null) executable = _defaultExecutable();
+
+      var dir = createTempDir();
+      var process = await Process.start(executable, [
+        "--user-data-dir=$dir",
+        url.toString(),
+        "--disable-extensions",
+        "--disable-popup-blocking",
+        "--bwsi",
+        "--no-first-run",
+        "--no-default-browser-check",
+        "--disable-default-apps",
+        "--disable-translate"
+      ], environment: {"DART_FLAGS": "--checked"});
+
+      if (debug) {
+        completer.complete(_getObservatoryUrl(process.stdout));
+      } else {
+        completer.complete(null);
+      }
+
+      process.exitCode
+          .then((_) => new Directory(dir).deleteSync(recursive: true));
+
+      return process;
+    }, completer.future);
+  }
+
+  Dartium._(Future<Process> startBrowser(), this.observatoryUrl)
+      : super(startBrowser);
+
+  /// Starts a new instance of Dartium open to the given [url], which may be a
+  /// [Uri] or a [String].
+  ///
+  /// If [executable] is passed, it's used as the Dartium executable. Otherwise
+  /// the default executable name for the current OS will be used.
+
+  /// Return the default executable for the current operating system.
+  static String _defaultExecutable() {
+    var dartium = _executableInEditor();
+    if (dartium != null) return dartium;
+    return Platform.isWindows ? "dartium.exe" : "dartium";
+  }
+
+  static String _executableInEditor() {
+    var dir = p.dirname(sdkDir);
+
+    if (Platform.isWindows) {
+      if (!new File(p.join(dir, "DartEditor.exe")).existsSync()) return null;
+
+      var dartium = p.join(dir, "chromium\\chrome.exe");
+      return new File(dartium).existsSync() ? dartium : null;
+    }
+
+    if (Platform.isMacOS) {
+      if (!new File(p.join(dir, "DartEditor.app/Contents/MacOS/DartEditor"))
+          .existsSync()) {
+        return null;
+      }
+
+      var dartium = p.join(
+          dir, "chromium/Chromium.app/Contents/MacOS/Chromium");
+      return new File(dartium).existsSync() ? dartium : null;
+    }
+
+    assert(Platform.isLinux);
+    if (!new File(p.join(dir, "DartEditor")).existsSync()) return null;
+
+    var dartium = p.join(dir, "chromium", "chrome");
+    return new File(dartium).existsSync() ? dartium : null;
+  }
+
+  // TODO(nweiz): simplify this when sdk#23923 is fixed.
+  /// Returns the Observatory URL for the Dartium executable with the given
+  /// [stdout] stream, or `null` if the correct one couldn't be found.
+  ///
+  /// Dartium prints out three different Observatory URLs when it starts. Only
+  /// one of them is connected to the VM instance running the host page, and the
+  /// ordering isn't guaranteed, so we need to figure out which one is correct.
+  /// We do so by connecting to the VM service via WebSockets and looking for
+  /// the Observatory instance that actually contains an isolate, and returning
+  /// the corresponding URI.
+  static Future<Uri> _getObservatoryUrl(Stream<List<int>> stdout) async {
+    var urlQueue = new StreamQueue(lineSplitter.bind(stdout).map((line) {
+      var match = _observatoryRegExp.firstMatch(line);
+      return match == null ? null : Uri.parse(match[1]);
+    }).where((line) => line != null));
+
+    var futures = [
+      urlQueue.next,
+      urlQueue.next,
+      urlQueue.next
+    ].map(_checkObservatoryUrl);
+
+    urlQueue.cancel();
+
+    /// Dartium will print three possible observatory URLs. For each one, we
+    /// check whether it's actually connected to an isolate, indicating that
+    /// it's the observatory for the main page. Once we find the one that is, we
+    /// cancel the other requests and return it.
+    return inCompletionOrder(futures)
+        .firstWhere((url) => url != null, defaultValue: () => null);
+  }
+
+  /// If the URL returned by [future] corresponds to the correct Observatory
+  /// instance, returns it. Otherwise, returns `null`.
+  ///
+  /// If the returned future is canceled before it fires, the WebSocket
+  /// connection with the given Observatory will be closed immediately.
+  static CancelableFuture<Uri> _checkObservatoryUrl(Future<Uri> future) {
+    var webSocket;
+    var canceled = false;
+    var completer = new CancelableCompleter(() {
+      canceled = true;
+      if (webSocket != null) webSocket.close();
+    });
+
+    // We've encountered a format we don't understand. Close the web socket and
+    // complete to null.
+    giveUp() {
+      webSocket.close();
+      if (!completer.isCompleted) completer.complete();
+    }
+
+    future.then((url) async {
+      try {
+        webSocket = await WebSocket.connect(
+            url.replace(scheme: 'ws', path: '/ws').toString());
+        if (canceled) {
+          webSocket.close();
+          return null;
+        }
+
+        webSocket.add(JSON.encode({
+          "jsonrpc": "2.0",
+          "method": "streamListen",
+          "params": {"streamId": "Isolate"},
+          "id": "0"
+        }));
+
+        webSocket.add(JSON.encode({
+          "jsonrpc": "2.0",
+          "method": "getVM",
+          "params": {},
+          "id": "1"
+        }));
+
+        webSocket.listen((response) {
+          try {
+            response = JSON.decode(response);
+          } on FormatException catch (_) {
+            giveUp();
+            return;
+          }
+
+          // If there's a "response" key, we're probably talking to the pre-1.0
+          // VM service protocol, in which case we should just give up.
+          if (response is! Map || response.containsKey("response")) {
+            giveUp();
+            return;
+          }
+
+          if (response["id"] == "0") return;
+
+          if (response["id"] == "1") {
+            var result = response["result"];
+            if (result is! Map) {
+              giveUp();
+              return;
+            }
+
+            var isolates = result["isolates"];
+            if (isolates is! List) {
+              giveUp();
+              return;
+            }
+
+            if (isolates.isNotEmpty) {
+              webSocket.close();
+              if (!completer.isCompleted) completer.complete(url);
+            }
+            return;
+          }
+
+          // The 1.0 protocol used a raw "event" key, while the 2.0 protocol
+          // wraps it in JSON-RPC method params.
+          var event;
+          if (response.containsKey("event")) {
+            event = response["event"];
+          } else {
+            var params = response["params"];
+            if (params is Map) event = params["event"];
+          }
+
+          if (event is! Map) {
+            giveUp();
+            return;
+          }
+
+          if (event["kind"] != "IsolateStart") return;
+          webSocket.close();
+          if (completer.isCompleted) return;
+
+          // TODO(nweiz): include the isolate ID in the URL?
+          completer.complete(url);
+        });
+      } on IOException catch (_) {
+        // IO exceptions are probably caused by connecting to an
+        // incorrect WebSocket that already closed.
+        return null;
+      }
+    }).catchError((error, stackTrace) {
+      if (!completer.isCompleted) completer.completeError(error, stackTrace);
+    });
+
+    return completer.future;
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/browser/firefox.dart b/mojo/public/dart/third_party/test/lib/src/runner/browser/firefox.dart
new file mode 100644
index 0000000..4406cbd
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/browser/firefox.dart
@@ -0,0 +1,85 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.browser.firefox;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+
+import '../../util/io.dart';
+import 'browser.dart';
+
+final _preferences = '''
+user_pref("browser.shell.checkDefaultBrowser", false);
+user_pref("dom.disable_open_during_load", false);
+user_pref("dom.max_script_run_time", 0);
+''';
+
+/// A class for running an instance of Firefox.
+///
+/// Most of the communication with the browser is expected to happen via HTTP,
+/// so this exposes a bare-bones API. The browser starts as soon as the class is
+/// constructed, and is killed when [close] is called.
+///
+/// Any errors starting or running the process are reported through [onExit].
+class Firefox extends Browser {
+  final name = "Firefox";
+
+  Firefox(url, {String executable})
+      : super(() => _startBrowser(url, executable));
+
+  /// Starts a new instance of Firefox open to the given [url], which may be a
+  /// [Uri] or a [String].
+  ///
+  /// If [executable] is passed, it's used as the Firefox executable.
+  /// Otherwise the default executable name for the current OS will be used.
+  static Future<Process> _startBrowser(url, [String executable]) async {
+    if (executable == null) executable = _defaultExecutable();
+
+    var dir = createTempDir();
+    new File(p.join(dir, 'prefs.js')).writeAsStringSync(_preferences);
+
+    var process = await Process.start(executable, [
+      "--profile", "$dir",
+      url.toString(),
+      "--no-remote"
+    ], environment: {
+      "MOZ_CRASHREPORTER_DISABLE": "1"
+    });
+
+    process.exitCode
+        .then((_) => new Directory(dir).deleteSync(recursive: true));
+
+    return process;
+  }
+
+  /// Return the default executable for the current operating system.
+  static String _defaultExecutable() {
+    if (Platform.isMacOS) {
+      return '/Applications/Firefox.app/Contents/MacOS/firefox-bin';
+    }
+    if (!Platform.isWindows) return 'firefox';
+
+    // Firefox could be installed in several places on Windows. The only way to
+    // find it is to check.
+    var prefixes = [
+      Platform.environment['PROGRAMFILES'],
+      Platform.environment['PROGRAMFILES(X86)']
+    ];
+    var suffix = r'Mozilla Firefox\firefox.exe';
+
+    for (var prefix in prefixes) {
+      if (prefix == null) continue;
+
+      var path = p.join(prefix, suffix);
+      if (new File(p.join(prefix, suffix)).existsSync()) return path;
+    }
+
+    // Fall back on looking it up on the path. This probably won't work, but at
+    // least it will fail with a useful error message.
+    return "firefox.exe";
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/browser/iframe_listener.dart b/mojo/public/dart/third_party/test/lib/src/runner/browser/iframe_listener.dart
new file mode 100644
index 0000000..9da6577
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/browser/iframe_listener.dart
@@ -0,0 +1,182 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.browser.iframe_listener;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:html' hide Metadata;
+
+import '../../backend/declarer.dart';
+import '../../backend/metadata.dart';
+import '../../backend/suite.dart';
+import '../../backend/test.dart';
+import '../../backend/test_platform.dart';
+import '../../util/multi_channel.dart';
+import '../../util/remote_exception.dart';
+import '../../utils.dart';
+
+/// A class that runs tests in a separate iframe.
+///
+/// This indirectly communicates with the test server. It uses `postMessage` to
+/// relay communication through the host page, which has a WebSocket connection
+/// to the test server.
+class IframeListener {
+  /// The test suite to run.
+  final Suite _suite;
+
+  /// Extracts metadata about all the tests in the function returned by
+  /// [getMain] and sends information about them over the `postMessage`
+  /// connection.
+  ///
+  /// The main function is wrapped in a closure so that we can handle it being
+  /// undefined here rather than in the generated code.
+  ///
+  /// Once that's done, this starts listening for commands about which tests to
+  /// run.
+  static Future start(Function getMain()) async {
+    var channel = _postMessageChannel();
+
+    var main;
+    try {
+      main = getMain();
+    } on NoSuchMethodError catch (_) {
+      _sendLoadException(channel, "No top-level main() function defined.");
+      return;
+    }
+
+    if (main is! Function) {
+      _sendLoadException(channel, "Top-level main getter is not a function.");
+      return;
+    } else if (main is! AsyncFunction) {
+      _sendLoadException(channel, "Top-level main() function takes arguments.");
+      return;
+    }
+
+    var declarer;
+    try {
+      declarer = new Declarer();
+      await runZoned(() => new Future.sync(main), zoneValues: {
+        #test.declarer: declarer
+      }, zoneSpecification: new ZoneSpecification(print: (_, __, ___, line) {
+        channel.sink.add({"type": "print", "line": line});
+      }));
+    } catch (error, stackTrace) {
+      channel.sink.add({
+        "type": "error",
+        "error": RemoteException.serialize(error, stackTrace)
+      });
+      return;
+    }
+
+    var url = Uri.parse(window.location.href);
+    var message = JSON.decode(Uri.decodeFull(url.fragment));
+    var metadata = new Metadata.deserialize(message['metadata']);
+    var browser = TestPlatform.find(message['browser']);
+
+    var suite = new Suite(
+        declarer.tests, platform: browser, metadata: metadata);
+    new IframeListener._(suite)._listen(channel);
+
+    return;
+  }
+
+  /// Constructs a [MultiChannel] wrapping the `postMessage` communication with
+  /// the host page.
+  ///
+  /// This [MultiChannel] corresponds to a [MultiChannel] in the server's
+  /// [IframeTest] class.
+  static MultiChannel _postMessageChannel() {
+    var inputController = new StreamController(sync: true);
+    var outputController = new StreamController(sync: true);
+
+    window.onMessage.listen((message) {
+      // A message on the Window can theoretically come from any website. It's
+      // very unlikely that a malicious site would care about hacking someone's
+      // unit tests, let alone be able to find the test server while it's
+      // running, but it's good practice to check the origin anyway.
+      if (message.origin != window.location.origin) return;
+      message.stopPropagation();
+      inputController.add(message.data);
+    });
+
+    outputController.stream.listen((data) {
+      // TODO(nweiz): Stop manually adding href here once issue 22554 is
+      // fixed.
+      window.parent.postMessage({
+        "href": window.location.href,
+        "data": data
+      }, window.location.origin);
+    });
+
+    return new MultiChannel(inputController.stream, outputController.sink);
+  }
+
+  /// Sends a message over [channel] indicating that the tests failed to load.
+  ///
+  /// [message] should describe the failure.
+  static void _sendLoadException(MultiChannel channel, String message) {
+    channel.sink.add({"type": "loadException", "message": message});
+  }
+
+  IframeListener._(this._suite);
+
+  /// Send information about [_suite] across [channel] and start listening for
+  /// commands to run the tests.
+  void _listen(MultiChannel channel) {
+    var tests = [];
+    for (var i = 0; i < _suite.tests.length; i++) {
+      var test = _suite.tests[i];
+      var testChannel = channel.virtualChannel();
+      tests.add({
+        "name": test.name,
+        "metadata": test.metadata.serialize(),
+        "channel": testChannel.id
+      });
+
+      testChannel.stream.listen((message) {
+        assert(message['command'] == 'run');
+        _runTest(test, channel.virtualChannel(message['channel']));
+      });
+    }
+
+    channel.sink.add({
+      "type": "success",
+      "tests": tests
+    });
+  }
+
+  /// Runs [test] and sends the results across [sendPort].
+  void _runTest(Test test, MultiChannel channel) {
+    var liveTest = test.load(_suite);
+
+    channel.stream.listen((message) {
+      assert(message['command'] == 'close');
+      liveTest.close();
+    });
+
+    liveTest.onStateChange.listen((state) {
+      channel.sink.add({
+        "type": "state-change",
+        "status": state.status.name,
+        "result": state.result.name
+      });
+    });
+
+    liveTest.onError.listen((asyncError) {
+      channel.sink.add({
+        "type": "error",
+        "error": RemoteException.serialize(
+            asyncError.error, asyncError.stackTrace)
+      });
+    });
+
+    liveTest.onPrint.listen((line) {
+      print(line);
+      channel.sink.add({"type": "print", "line": line});
+    });
+
+    liveTest.run().then((_) => channel.sink.add({"type": "complete"}));
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/browser/iframe_test.dart b/mojo/public/dart/third_party/test/lib/src/runner/browser/iframe_test.dart
new file mode 100644
index 0000000..0341645
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/browser/iframe_test.dart
@@ -0,0 +1,80 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.browser.iframe_test;
+
+import '../../backend/live_test.dart';
+import '../../backend/live_test_controller.dart';
+import '../../backend/metadata.dart';
+import '../../backend/state.dart';
+import '../../backend/suite.dart';
+import '../../backend/test.dart';
+import '../../util/multi_channel.dart';
+import '../../util/remote_exception.dart';
+import '../../util/stack_trace_mapper.dart';
+
+/// A test in a running iframe.
+class IframeTest implements Test {
+  final String name;
+  final Metadata metadata;
+
+  /// The mapper used to map stack traces for errors coming from this test, or
+  /// `null`.
+  final StackTraceMapper _mapper;
+
+  /// The channel used to communicate with the test's [IframeListener].
+  final MultiChannel _channel;
+
+  IframeTest(this.name, this.metadata, this._channel, {StackTraceMapper mapper})
+      : _mapper = mapper;
+
+  LiveTest load(Suite suite) {
+    var controller;
+    var testChannel;
+    controller = new LiveTestController(suite, this, () {
+      controller.setState(const State(Status.running, Result.success));
+
+      testChannel = _channel.virtualChannel();
+      _channel.sink.add({
+        'command': 'run',
+        'channel': testChannel.id
+      });
+
+      testChannel.stream.listen((message) {
+        if (message['type'] == 'error') {
+          var asyncError = RemoteException.deserialize(message['error']);
+
+          var stackTrace = asyncError.stackTrace;
+          if (_mapper != null) stackTrace = _mapper.mapStackTrace(stackTrace);
+
+          controller.addError(asyncError.error, stackTrace);
+        } else if (message['type'] == 'state-change') {
+          controller.setState(
+              new State(
+                  new Status.parse(message['status']),
+                  new Result.parse(message['result'])));
+        } else if (message['type'] == 'print') {
+          controller.print(message['line']);
+        } else {
+          assert(message['type'] == 'complete');
+          controller.completer.complete();
+        }
+      });
+    }, () {
+      // Ignore all future messages from the test and complete it immediately.
+      // We don't need to tell it to run its tear-down because there's nothing a
+      // browser test needs to clean up on the file system anyway.
+      testChannel.sink.close();
+      if (!controller.completer.isCompleted) controller.completer.complete();
+    });
+    return controller.liveTest;
+  }
+
+  Test change({String name, Metadata metadata}) {
+    if (name == name && metadata == this.metadata) return this;
+    if (name == null) name = this.name;
+    if (metadata == null) metadata = this.metadata;
+    return new IframeTest(name, metadata, _channel);
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/browser/internet_explorer.dart b/mojo/public/dart/third_party/test/lib/src/runner/browser/internet_explorer.dart
new file mode 100644
index 0000000..0d034b1
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/browser/internet_explorer.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.browser.internet_explorer;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+
+import 'browser.dart';
+
+/// A class for running an instance of Internet Explorer.
+///
+/// Any errors starting or running the process are reported through [onExit].
+class InternetExplorer extends Browser {
+  final name = "Internet Explorer";
+
+  InternetExplorer(url, {String executable})
+      : super(() => _startBrowser(url, executable));
+
+  /// Starts a new instance of Internet Explorer open to the given [url], which
+  /// may be a [Uri] or a [String].
+  ///
+  /// If [executable] is passed, it's used as the Internet Explorer executable.
+  /// Otherwise the default executable name for the current OS will be used.
+  static Future<Process> _startBrowser(url, [String executable]) {
+    if (executable == null) executable = _defaultExecutable();
+    return Process.start(executable, ['-extoff', url.toString()]);
+  }
+
+  /// Return the default executable for the current operating system.
+  static String _defaultExecutable() {
+    // Internet Explorer could be installed in several places on Windows. The
+    // only way to find it is to check.
+    var prefixes = [
+      Platform.environment['PROGRAMW6432'],
+      Platform.environment['PROGRAMFILES'],
+      Platform.environment['PROGRAMFILES(X86)']
+    ];
+    var suffix = r'Internet Explorer\iexplore.exe';
+
+    for (var prefix in prefixes) {
+      if (prefix == null) continue;
+
+      var path = p.join(prefix, suffix);
+      if (new File(p.join(prefix, suffix)).existsSync()) return path;
+    }
+
+    // Fall back on looking it up on the path. This probably won't work, but at
+    // least it will fail with a useful error message.
+    return "iexplore.exe";
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/browser/phantom_js.dart b/mojo/public/dart/third_party/test/lib/src/runner/browser/phantom_js.dart
new file mode 100644
index 0000000..8083bdd
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/browser/phantom_js.dart
@@ -0,0 +1,93 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.browser.phantom_js;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+
+import '../../util/exit_codes.dart' as exit_codes;
+import '../../util/io.dart';
+import '../application_exception.dart';
+import 'browser.dart';
+
+/// The PhantomJS script that opens the host page.
+final _script = """
+var system = require('system');
+var page = require('webpage').create();
+
+// PhantomJS versions older than 2.0.0 don't support the latest WebSocket spec.
+if (phantom.version.major < 2) phantom.exit(${exit_codes.protocol});
+
+// Pipe browser messages to the process's stdout. This isn't used by default,
+// but it can be useful for debugging.
+page.onConsoleMessage = function(message) {
+  console.log(message);
+}
+
+page.open(system.args[1], function(status) {
+  if (status !== "success") phantom.exit(1);
+});
+""";
+
+/// A class for running an instance of PhantomJS.
+///
+/// Any errors starting or running the process are reported through [onExit].
+class PhantomJS extends Browser {
+  final name = "PhantomJS";
+
+  final Future<Uri> remoteDebuggerUrl;
+
+  factory PhantomJS(url, {String executable, bool debug: false}) {
+    var remoteDebuggerCompleter = new Completer.sync();
+    return new PhantomJS._(() async {
+      if (executable == null) {
+        executable = Platform.isWindows ? "phantomjs.exe" : "phantomjs";
+      }
+
+      var dir = createTempDir();
+      var script = p.join(dir, "script.js");
+      new File(script).writeAsStringSync(_script);
+
+      var port = debug ? await getUnsafeUnusedPort() : null;
+
+      var args = [];
+      if (debug) {
+        args.addAll([
+          "--remote-debugger-port=$port",
+          "--remote-debugger-autorun=yes"
+        ]);
+      }
+      args.addAll([script, url.toString()]);
+      var process = await Process.start(executable, args);
+
+      // PhantomJS synchronously emits standard output, which means that if we
+      // don't drain its stdout stream it can deadlock.
+      process.stdout.listen((_) {});
+
+      process.exitCode.then((exitCode) {
+        new Directory(dir).deleteSync(recursive: true);
+
+        if (exitCode == exit_codes.protocol) {
+          throw new ApplicationException(
+              "Only PhantomJS version 2.0.0 or greater is supported");
+        }
+      });
+
+      if (port != null) {
+        remoteDebuggerCompleter.complete(Uri.parse(
+            "http://localhost:$port/webkit/inspector/inspector.html?page=2"));
+      } else {
+        remoteDebuggerCompleter.complete(null);
+      }
+
+      return process;
+    }, remoteDebuggerCompleter.future);
+  }
+
+  PhantomJS._(Future<Process> startBrowser(), this.remoteDebuggerUrl)
+      : super(startBrowser);
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/browser/polymer.dart b/mojo/public/dart/third_party/test/lib/src/runner/browser/polymer.dart
new file mode 100644
index 0000000..e22d27a
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/browser/polymer.dart
@@ -0,0 +1,107 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.browser.polymer;
+
+import 'dart:io';
+
+import 'package:glob/glob.dart';
+import 'package:path/path.dart' as p;
+import 'package:yaml/yaml.dart';
+
+/// Whether the package being tested uses the Polymer transforemrs at all.
+///
+/// This will be `null` until [_initialize] is called.
+bool _usesPolymer;
+
+/// The set of entry points passed in to the polymer transformer's config.
+///
+/// This will be `null` if no entrypoints are declared, indicating that all
+/// entrypoints are supported.
+Set<String> _entrypoints;
+
+/// The $includes for the polymer transformer.
+Set<Glob> _includes;
+
+/// The $excludes for the polymer transformer.
+Set<Glob> _excludes;
+
+/// Returns whether [path] is an entrypoint transformed by the Polymer
+/// transformer.
+///
+/// The Polymer transformer creates a bootstrapping wrapper script around the
+/// entrypoints it's run on, so we need to know that so we can fetch the correct
+/// source map file.
+bool isPolymerEntrypoint(String path) {
+  if (_usesPolymer == null) _initialize();
+  if (!_usesPolymer) return false;
+
+  if (_excludes != null) {
+    // If there are any excludes, it must not match any of them.
+    for (var exclude in _excludes) {
+      if (exclude.matches(path)) return false;
+    }
+  }
+
+  // If there are any includes, it must match one of them.
+  if (_includes != null && !_includes.any((include) => include.matches(path))) {
+    return false;
+  }
+
+  if (_entrypoints == null) return true;
+  return _entrypoints.contains(path);
+}
+
+/// Initializes [_usesPolymer], [_entrypoints], [_includes], and [_excludes]
+/// based on the contents of the pubspec.
+///
+/// This doesn't need to do any validation of the pubspec, since pub itself does
+/// that before running the test executable.
+void _initialize() {
+  _usesPolymer = false;
+
+  var pubspec = loadYaml(new File("pubspec.yaml").readAsStringSync());
+
+  var transformers = pubspec['transformers'];
+  if (transformers == null) {
+    return;
+  }
+
+  for (var phase in transformers) {
+    var phases = phase is List ? phase : [phase];
+    for (var transformer in phases) {
+      if (transformer is String) {
+        if (transformer != "polymer") continue;
+        _usesPolymer = true;
+        return;
+      }
+
+      if (transformer.keys.single != "polymer") continue;
+      _usesPolymer = true;
+
+      var configuration = transformer.values.single;
+
+      var entrypoints = configuration["entry_points"];
+      if (entrypoints != null) _entrypoints = entrypoints.toSet();
+
+      _includes = _parseGlobField(configuration, r"$includes");
+      _excludes = _parseGlobField(configuration, r"$excludes");
+      return;
+    }
+  }
+}
+
+/// Parses a glob field (either `$include` or `$exclude`).
+Set<Glob> _parseGlobField(YamlMap configuration, String name) {
+  if (!configuration.containsKey(name)) return null;
+  var field = configuration[name];
+
+  if (field is String) {
+    return new Set.from([new Glob(field, context: p.url, recursive: true)]);
+  }
+
+  return new Set.from(field.map((node) {
+    return new Glob(node, context: p.url, recursive: true);
+  }));
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/browser/safari.dart b/mojo/public/dart/third_party/test/lib/src/runner/browser/safari.dart
new file mode 100644
index 0000000..e600e00
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/browser/safari.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.browser.safari;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+
+import '../../util/io.dart';
+import 'browser.dart';
+
+/// A class for running an instance of Safari.
+///
+/// Any errors starting or running the process are reported through [onExit].
+class Safari extends Browser {
+  final name = "Safari";
+
+  Safari(url, {String executable})
+      : super(() => _startBrowser(url, executable));
+
+  /// Starts a new instance of Safari open to the given [url], which may be a
+  /// [Uri] or a [String].
+  ///
+  /// If [executable] is passed, it's used as the content shell executable.
+  /// Otherwise the default executable name for the current OS will be used.
+  static Future<Process> _startBrowser(url, [String executable]) async {
+    if (executable == null) {
+      executable = '/Applications/Safari.app/Contents/MacOS/Safari';
+    }
+
+    var dir = createTempDir();
+
+    // Safari will only open files (not general URLs) via the command-line
+    // API, so we create a dummy file to redirect it to the page we actually
+    // want it to load.
+    var redirect = p.join(dir, 'redirect.html');
+    new File(redirect).writeAsStringSync(
+        "<script>location = " + JSON.encode(url.toString()) + "</script>");
+
+    var process = await Process.start(executable, [redirect]);
+
+    process.exitCode
+        .then((_) => new Directory(dir).deleteSync(recursive: true));
+
+    return process;
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/browser/server.dart b/mojo/public/dart/third_party/test/lib/src/runner/browser/server.dart
new file mode 100644
index 0000000..658236b
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/browser/server.dart
@@ -0,0 +1,415 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.browser.server;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:async/async.dart';
+import 'package:http_multi_server/http_multi_server.dart';
+import 'package:path/path.dart' as p;
+import 'package:pool/pool.dart';
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:shelf/shelf_io.dart' as shelf_io;
+import 'package:shelf_static/shelf_static.dart';
+import 'package:shelf_web_socket/shelf_web_socket.dart';
+
+import '../../backend/metadata.dart';
+import '../../backend/suite.dart';
+import '../../backend/test_platform.dart';
+import '../../util/io.dart';
+import '../../util/one_off_handler.dart';
+import '../../util/path_handler.dart';
+import '../../util/stack_trace_mapper.dart';
+import '../../utils.dart';
+import '../configuration.dart';
+import '../load_exception.dart';
+import 'browser_manager.dart';
+import 'compiler_pool.dart';
+import 'polymer.dart';
+
+/// A server that serves JS-compiled tests to browsers.
+///
+/// A test suite may be loaded for a given file using [loadSuite].
+class BrowserServer {
+  /// Starts the server.
+  ///
+  /// [root] is the root directory that the server should serve. It defaults to
+  /// the working directory.
+  static Future<BrowserServer> start(Configuration config, {String root})
+      async {
+    var server = new BrowserServer._(root, config);
+    await server._load();
+    return server;
+  }
+
+  /// The underlying HTTP server.
+  HttpServer _server;
+
+  /// A randomly-generated secret.
+  ///
+  /// This is used to ensure that other users on the same system can't snoop
+  /// on data being served through this server.
+  final _secret = randomBase64(24, urlSafe: true);
+
+  /// The URL for this server.
+  Uri get url => baseUrlForAddress(_server.address, _server.port)
+      .resolve(_secret + "/");
+
+  /// The test runner configuration.
+  Configuration _config;
+
+  /// A [OneOffHandler] for servicing WebSocket connections for
+  /// [BrowserManager]s.
+  ///
+  /// This is one-off because each [BrowserManager] can only connect to a single
+  /// WebSocket,
+  final _webSocketHandler = new OneOffHandler();
+
+  /// A [PathHandler] used to serve compiled JS.
+  final _jsHandler = new PathHandler();
+
+  /// The [CompilerPool] managing active instances of `dart2js`.
+  ///
+  /// This is `null` if tests are loaded from `pub serve`.
+  final CompilerPool _compilers;
+
+  /// The temporary directory in which compiled JS is emitted.
+  final String _compiledDir;
+
+  /// The root directory served statically by this server.
+  final String _root;
+
+  /// The pool of active `pub serve` compilations.
+  ///
+  /// Pub itself ensures that only one compilation runs at a time; we just use
+  /// this pool to make sure that the output is nice and linear.
+  final _pubServePool = new Pool(1);
+
+  /// The HTTP client to use when caching JS files in `pub serve`.
+  final HttpClient _http;
+
+  /// Whether [close] has been called.
+  bool get _closed => _closeMemo.hasRun;
+
+  /// The memoizer for running [close] exactly once.
+  final _closeMemo = new AsyncMemoizer();
+
+  /// A map from browser identifiers to futures that will complete to the
+  /// [BrowserManager]s for those browsers, or the errors that occurred when
+  /// trying to load those managers.
+  ///
+  /// This should only be accessed through [_browserManagerFor].
+  final _browserManagers =
+      new Map<TestPlatform, Future<Result<BrowserManager>>>();
+
+  /// A map from test suite paths to Futures that will complete once those
+  /// suites are finished compiling.
+  ///
+  /// This is used to make sure that a given test suite is only compiled once
+  /// per run, rather than once per browser per run.
+  final _compileFutures = new Map<String, Future>();
+
+  final _mappers = new Map<String, StackTraceMapper>();
+
+  BrowserServer._(String root, Configuration config)
+      : _root = root == null ? p.current : root,
+        _config = config,
+        _compiledDir = config.pubServeUrl == null ? createTempDir() : null,
+        _http = config.pubServeUrl == null ? null : new HttpClient(),
+        _compilers = new CompilerPool(color: config.color);
+
+  /// Starts the underlying server.
+  Future _load() async {
+    var cascade = new shelf.Cascade()
+        .add(_webSocketHandler.handler);
+
+    if (_config.pubServeUrl == null) {
+      cascade = cascade
+          .add(_createPackagesHandler())
+          .add(_jsHandler.handler)
+          .add(createStaticHandler(_root))
+          .add(_wrapperHandler);
+    }
+
+    var pipeline = new shelf.Pipeline()
+      .addMiddleware(nestingMiddleware(_secret))
+      .addHandler(cascade.handler);
+
+    _server = await HttpMultiServer.loopback(0);
+    shelf_io.serveRequests(_server, pipeline);
+  }
+
+  /// Returns a handler that serves the contents of the "packages/" directory
+  /// for any URL that contains "packages/".
+  ///
+  /// This is a factory so it can wrap a static handler.
+  shelf.Handler _createPackagesHandler() {
+    var staticHandler =
+      createStaticHandler(_config.packageRoot, serveFilesOutsidePath: true);
+
+    return (request) {
+      var segments = p.url.split(request.url.path);
+
+      for (var i = 0; i < segments.length; i++) {
+        if (segments[i] != "packages") continue;
+        return staticHandler(
+            request.change(path: p.url.joinAll(segments.take(i + 1))));
+      }
+
+      return new shelf.Response.notFound("Not found.");
+    };
+  }
+
+  /// A handler that serves wrapper files used to bootstrap tests.
+  shelf.Response _wrapperHandler(shelf.Request request) {
+    var path = p.fromUri(request.url);
+
+    if (path.endsWith(".browser_test.dart")) {
+      return new shelf.Response.ok('''
+import "package:test/src/runner/browser/iframe_listener.dart";
+
+import "${p.basename(p.withoutExtension(p.withoutExtension(path)))}" as test;
+
+void main() {
+  IframeListener.start(() => test.main);
+}
+''', headers: {'Content-Type': 'application/dart'});
+    }
+
+    if (path.endsWith(".html")) {
+      var test = p.withoutExtension(path) + ".dart";
+
+      // Link to the Dart wrapper on Dartium and the compiled JS version
+      // elsewhere.
+      var scriptBase =
+          "${HTML_ESCAPE.convert(p.basename(test))}.browser_test.dart";
+      var script = request.headers['user-agent'].contains('(Dart)')
+          ? 'type="application/dart" src="$scriptBase"'
+          : 'src="$scriptBase.js"';
+
+      return new shelf.Response.ok('''
+<!DOCTYPE html>
+<html>
+<head>
+  <title>${HTML_ESCAPE.convert(test)} Test</title>
+  <script $script></script>
+</head>
+</html>
+''', headers: {'Content-Type': 'text/html'});
+    }
+
+    return new shelf.Response.notFound('Not found.');
+  }
+
+  /// Loads the test suite at [path] on the browser [browser].
+  ///
+  /// This will start a browser to load the suite if one isn't already running.
+  /// Throws an [ArgumentError] if [browser] isn't a browser platform.
+  Future<Suite> loadSuite(String path, TestPlatform browser,
+      Metadata metadata) async {
+    if (!browser.isBrowser) {
+      throw new ArgumentError("$browser is not a browser.");
+    }
+
+    var htmlPath = p.withoutExtension(path) + '.html';
+    if (new File(htmlPath).existsSync() &&
+        !new File(htmlPath).readAsStringSync()
+            .contains('packages/test/dart.js')) {
+      throw new LoadException(
+          path,
+          '"${htmlPath}" must contain <script src="packages/test/dart.js">'
+              '</script>.');
+    }
+
+    var suiteUrl;
+    if (_config.pubServeUrl != null) {
+      var suitePrefix = p.withoutExtension(
+          p.relative(path, from: p.join(_root, 'test')));
+
+      var jsUrl;
+      // Polymer generates a bootstrap entrypoint that wraps the entrypoint we
+      // see on disk, and modifies the HTML file to point to the bootstrap
+      // instead. To make sure we get the right source maps and wait for the
+      // right file to compile, we have some Polymer-specific logic here to load
+      // the boostrap instead of the unwrapped file.
+      if (isPolymerEntrypoint(path)) {
+        jsUrl = _config.pubServeUrl.resolve(
+            "$suitePrefix.html.polymer.bootstrap.dart.browser_test.dart.js");
+      } else {
+        jsUrl = _config.pubServeUrl.resolve(
+          '$suitePrefix.dart.browser_test.dart.js');
+      }
+
+      await _pubServeSuite(path, jsUrl);
+      suiteUrl = _config.pubServeUrl.resolveUri(p.toUri('$suitePrefix.html'));
+    } else {
+      if (browser.isJS) await _compileSuite(path);
+      if (_closed) return null;
+      suiteUrl = url.resolveUri(p.toUri(
+          p.withoutExtension(p.relative(path, from: _root)) + ".html"));
+    }
+
+    if (_closed) return null;
+
+    // TODO(nweiz): Don't start the browser until all the suites are compiled.
+    var browserManager = await _browserManagerFor(browser);
+    if (_closed) return null;
+
+    var suite = await browserManager.loadSuite(path, suiteUrl, metadata,
+        mapper: browser.isJS ? _mappers[path] : null);
+    if (_closed) return null;
+    return suite;
+  }
+
+  /// Loads a test suite at [path] from the `pub serve` URL [jsUrl].
+  ///
+  /// This ensures that only one suite is loaded at a time, and that any errors
+  /// are exposed as [LoadException]s.
+  Future _pubServeSuite(String path, Uri jsUrl) {
+    return _pubServePool.withResource(() async {
+      var timer = new Timer(new Duration(seconds: 1), () {
+        print('"pub serve" is compiling $path...');
+      });
+
+      var mapUrl = jsUrl.replace(path: jsUrl.path + '.map');
+      var response;
+      try {
+        // Get the source map here for two reasons. We want to verify that the
+        // server's dart2js compiler is running on the Dart code, and also load
+        // the StackTraceMapper.
+        var request = await _http.getUrl(mapUrl);
+        response = await request.close();
+
+        if (response.statusCode != 200) {
+          // We don't care about the response body, but we have to drain it or
+          // else the process can't exit.
+          response.listen((_) {});
+
+          throw new LoadException(path,
+              "Error getting $mapUrl: ${response.statusCode} "
+                  "${response.reasonPhrase}\n"
+              'Make sure "pub serve" is serving the test/ directory.');
+        }
+
+        if (_config.jsTrace) {
+          // Drain the response stream.
+          response.listen((_) {});
+          return;
+        }
+
+        _mappers[path] = new StackTraceMapper(
+            await UTF8.decodeStream(response),
+            mapUrl: mapUrl,
+            packageRoot: _config.pubServeUrl.resolve('packages'),
+            sdkRoot: _config.pubServeUrl.resolve('packages/\$sdk'));
+      } on IOException catch (error) {
+        var message = getErrorMessage(error);
+        if (error is SocketException) {
+          message = "${error.osError.message} "
+              "(errno ${error.osError.errorCode})";
+        }
+
+        throw new LoadException(path,
+            "Error getting $mapUrl: $message\n"
+            'Make sure "pub serve" is running.');
+      } finally {
+        timer.cancel();
+      }
+    });
+  }
+
+  /// Compile the test suite at [dartPath] to JavaScript.
+  ///
+  /// Once the suite has been compiled, it's added to [_jsHandler] so it can be
+  /// served.
+  Future _compileSuite(String dartPath) {
+    return _compileFutures.putIfAbsent(dartPath, () async {
+      var dir = new Directory(_compiledDir).createTempSync('test_').path;
+      var jsPath = p.join(dir, p.basename(dartPath) + ".browser_test.dart.js");
+
+      await _compilers.compile(dartPath, jsPath,
+          packageRoot: _config.packageRoot);
+      if (_closed) return;
+
+      var jsUrl = p.toUri(p.relative(dartPath, from: _root)).path +
+          '.browser_test.dart.js';
+      _jsHandler.add(jsUrl, (request) {
+        return new shelf.Response.ok(new File(jsPath).readAsStringSync(),
+            headers: {'Content-Type': 'application/javascript'});
+      });
+
+      var mapUrl = p.toUri(p.relative(dartPath, from: _root)).path +
+          '.browser_test.dart.js.map';
+      _jsHandler.add(mapUrl, (request) {
+        return new shelf.Response.ok(
+            new File(jsPath + '.map').readAsStringSync(),
+            headers: {'Content-Type': 'application/json'});
+      });
+
+      if (_config.jsTrace) return;
+      var mapPath = jsPath + '.map';
+      _mappers[dartPath] = new StackTraceMapper(
+          new File(mapPath).readAsStringSync(),
+          mapUrl: p.toUri(mapPath),
+          packageRoot: p.toUri(_config.packageRoot),
+          sdkRoot: p.toUri(sdkDir));
+    });
+  }
+
+  /// Returns the [BrowserManager] for [platform], which should be a browser.
+  ///
+  /// If no browser manager is running yet, starts one.
+  Future<BrowserManager> _browserManagerFor(TestPlatform platform) {
+    var manager = _browserManagers[platform];
+    if (manager != null) return Result.release(manager);
+
+    var completer = new Completer.sync();
+    var path = _webSocketHandler.create(webSocketHandler(completer.complete));
+    var webSocketUrl = url.replace(scheme: 'ws').resolve(path);
+    var hostUrl = (_config.pubServeUrl == null ? url : _config.pubServeUrl)
+        .resolve('packages/test/src/runner/browser/static/index.html')
+        .replace(queryParameters: {'managerUrl': webSocketUrl.toString()});
+
+    var future = BrowserManager.start(platform, hostUrl, completer.future,
+        debug: _config.pauseAfterLoad);
+
+    // Capture errors and release them later to avoid Zone issues. This call to
+    // [_browserManagerFor] is running in a different [LoadSuite] than future
+    // calls, which means they're also running in different error zones so
+    // errors can't be freely passed between them. Storing the error or value as
+    // an explicit [Result] fixes that.
+    _browserManagers[platform] = Result.capture(future);
+
+    return future;
+  }
+
+  /// Closes the server and releases all its resources.
+  ///
+  /// Returns a [Future] that completes once the server is closed and its
+  /// resources have been fully released.
+  Future close() {
+    return _closeMemo.runOnce(() async {
+      var futures = _browserManagers.values.map((future) async {
+        var result = await future;
+        if (result.isError) return;
+
+        await result.asValue.value.close();
+      }).toList();
+
+      futures.add(_server.close());
+      futures.add(_compilers.close());
+
+      await Future.wait(futures);
+
+      if (_config.pubServeUrl == null) {
+        new Directory(_compiledDir).deleteSync(recursive: true);
+      } else {
+        _http.close();
+      }
+    });
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/browser/static/host.css b/mojo/public/dart/third_party/test/lib/src/runner/browser/static/host.css
new file mode 100644
index 0000000..6a7bcc3
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/browser/static/host.css
@@ -0,0 +1,298 @@
+/* Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+ * for details. All rights reserved. Use of this source code is governed by a
+ * BSD-style license that can be found in the LICENSE file. */
+
+iframe {
+  /* We would use display: none here, but then Firefox fails to properly compute
+   * styles. See #274 */
+  visibility: hidden;
+}
+
+#play {
+  display: none;
+  cursor: pointer;
+}
+
+#dark {
+  display: none;
+}
+
+.paused #play {
+  display: block;
+}
+
+.paused #dark {
+  display: block;
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  top: 0;
+  right: 0;
+  background-color: rgba(0, 0, 0, 0.5);
+}
+
+.paused #right-flank, .paused #right-ear, .paused #right-paw,
+.paused #left-flank,  .paused #left-ear,  .paused #left-paw {
+  -webkit-animation-play-state: paused;
+          animation-play-state: paused;
+}
+
+/* Compiled output from
+ * http://codepen.io/mknadler/pen/11b75cb014a3c382f54abf527655af21. */
+
+svg {
+  position: absolute;
+  margin: auto;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  top: 0;
+}
+
+#right-flank {
+  fill: #0074C1;
+  stroke-color: #0074C1;
+  -webkit-animation: right-flank 8s ease infinite alternate;
+          animation: right-flank 8s ease infinite alternate;
+}
+
+#right-ear {
+  fill: #00B5AB;
+  stroke-color: #00B5AB;
+  -webkit-animation: right-ear 8s ease-in infinite alternate;
+          animation: right-ear 8s ease-in infinite alternate;
+}
+
+#right-paw {
+  fill: #00A6E4;
+  stroke-color: #00A6E4;
+  -webkit-animation: right-paw 8s ease-out infinite alternate;
+          animation: right-paw 8s ease-out infinite alternate;
+}
+
+#left-flank {
+  fill: #00B5AB;
+  stroke-color: #00B5AB;
+  -webkit-animation: left-flank 8s ease-in-out infinite alternate;
+          animation: left-flank 8s ease-in-out infinite alternate;
+}
+
+#left-ear {
+  fill: #0074C1;
+  stroke-color: #0074C1;
+  -webkit-animation: left-ear 8s linear infinite alternate;
+          animation: left-ear 8s linear infinite alternate;
+}
+
+#left-paw {
+  fill: #41C1BC;
+  stroke-color: #41C1BC;
+  -webkit-animation: left-paw 8s ease infinite alternate;
+          animation: left-paw 8s ease infinite alternate;
+}
+
+@-webkit-keyframes left-ear {
+  20% {
+    -webkit-transform: translate(250px, 150px) rotateY(180deg) scale(0.6);
+            transform: translate(250px, 150px) rotateY(180deg) scale(0.6);
+    fill: #00A6E4;
+  }
+  50% {
+    -webkit-transform: translate(100px, 75px) rotateY(80deg) scale(1.1);
+            transform: translate(100px, 75px) rotateY(80deg) scale(1.1);
+    fill: #41C1BC;
+  }
+  80% {
+    -webkit-transform: translate(0px, 0px) scale(1);
+            transform: translate(0px, 0px) scale(1);
+    fill: #0074C1;
+  }
+}
+
+@keyframes left-ear {
+  20% {
+    -webkit-transform: translate(250px, 150px) rotateY(180deg) scale(0.6);
+            transform: translate(250px, 150px) rotateY(180deg) scale(0.6);
+    fill: #00A6E4;
+  }
+  50% {
+    -webkit-transform: translate(100px, 75px) rotateY(80deg) scale(1.1);
+            transform: translate(100px, 75px) rotateY(80deg) scale(1.1);
+    fill: #41C1BC;
+  }
+  80% {
+    -webkit-transform: translate(0px, 0px) scale(1);
+            transform: translate(0px, 0px) scale(1);
+    fill: #0074C1;
+  }
+}
+@-webkit-keyframes right-ear {
+  20% {
+    -webkit-transform: translate(200px, 250px) rotateX(180deg) scale(0.6);
+            transform: translate(200px, 250px) rotateX(180deg) scale(0.6);
+    fill: #41C1BC;
+  }
+  50% {
+    -webkit-transform: translate(75px, 100px) rotateX(80deg) scale(1.1);
+            transform: translate(75px, 100px) rotateX(80deg) scale(1.1);
+    fill: #00A6E4;
+  }
+  80% {
+    -webkit-transform: translate(0px, 0px) scale(1);
+            transform: translate(0px, 0px) scale(1);
+    fill: #00B5AB;
+  }
+}
+@keyframes right-ear {
+  20% {
+    -webkit-transform: translate(200px, 250px) rotateX(180deg) scale(0.6);
+            transform: translate(200px, 250px) rotateX(180deg) scale(0.6);
+    fill: #41C1BC;
+  }
+  50% {
+    -webkit-transform: translate(75px, 100px) rotateX(80deg) scale(1.1);
+            transform: translate(75px, 100px) rotateX(80deg) scale(1.1);
+    fill: #00A6E4;
+  }
+  80% {
+    -webkit-transform: translate(0px, 0px) scale(1);
+            transform: translate(0px, 0px) scale(1);
+    fill: #00B5AB;
+  }
+}
+@-webkit-keyframes left-paw {
+  20% {
+    -webkit-transform: translate(200px, 200px) rotate3d(-1, 0, 0.5, 60deg) scale(0.6);
+            transform: translate(200px, 200px) rotate3d(-1, 0, 0.5, 60deg) scale(0.6);
+    fill: #00B5AB;
+  }
+  50% {
+    -webkit-transform: translate(150px, 250px) rotate3d(-1, 0, 0.5, 90deg) scale(0.6);
+            transform: translate(150px, 250px) rotate3d(-1, 0, 0.5, 90deg) scale(0.6);
+    fill: #00B5AB;
+  }
+  80% {
+    -webkit-transform: translate(0px, 0px) scale(1);
+            transform: translate(0px, 0px) scale(1);
+    fill: #41C1BC;
+  }
+}
+@keyframes left-paw {
+  20% {
+    -webkit-transform: translate(200px, 200px) rotate3d(-1, 0, 0.5, 60deg) scale(0.6);
+            transform: translate(200px, 200px) rotate3d(-1, 0, 0.5, 60deg) scale(0.6);
+    fill: #00B5AB;
+  }
+  50% {
+    -webkit-transform: translate(150px, 250px) rotate3d(-1, 0, 0.5, 90deg) scale(0.6);
+            transform: translate(150px, 250px) rotate3d(-1, 0, 0.5, 90deg) scale(0.6);
+    fill: #00B5AB;
+  }
+  80% {
+    -webkit-transform: translate(0px, 0px) scale(1);
+            transform: translate(0px, 0px) scale(1);
+    fill: #41C1BC;
+  }
+}
+@-webkit-keyframes right-paw {
+  20% {
+    -webkit-transform: translate(200px, 200px) rotate3d(-1, 0, 0.5, -60deg) scale(0.6);
+            transform: translate(200px, 200px) rotate3d(-1, 0, 0.5, -60deg) scale(0.6);
+    fill: #41C1BC;
+  }
+  50% {
+    -webkit-transform: translate(100px, 250px) rotate3d(-1, 0, 0.5, -90deg) scale(0.6);
+            transform: translate(100px, 250px) rotate3d(-1, 0, 0.5, -90deg) scale(0.6);
+    fill: #41C1BC;
+  }
+  80% {
+    -webkit-transform: translate(0px, 0px) scale(1);
+            transform: translate(0px, 0px) scale(1);
+    fill: #00A6E4;
+  }
+}
+@keyframes right-paw {
+  20% {
+    -webkit-transform: translate(200px, 200px) rotate3d(-1, 0, 0.5, -60deg) scale(0.6);
+            transform: translate(200px, 200px) rotate3d(-1, 0, 0.5, -60deg) scale(0.6);
+    fill: #41C1BC;
+  }
+  50% {
+    -webkit-transform: translate(100px, 250px) rotate3d(-1, 0, 0.5, -90deg) scale(0.6);
+            transform: translate(100px, 250px) rotate3d(-1, 0, 0.5, -90deg) scale(0.6);
+    fill: #41C1BC;
+  }
+  80% {
+    -webkit-transform: translate(0px, 0px) scale(1);
+            transform: translate(0px, 0px) scale(1);
+    fill: #00A6E4;
+  }
+}
+@-webkit-keyframes left-flank {
+  20% {
+    -webkit-transform: translate(0px, 100px) scale(0.6);
+            transform: translate(0px, 100px) scale(0.6);
+    fill: #00A6E4;
+  }
+  50% {
+    -webkit-transform: translate(0px, 100px) scale(0.4);
+            transform: translate(0px, 100px) scale(0.4);
+    fill: #00A6E4;
+  }
+  80% {
+    -webkit-transform: translate(0px, 0px) scale(1);
+            transform: translate(0px, 0px) scale(1);
+    fill: #00B5AB;
+  }
+}
+@keyframes left-flank {
+  20% {
+    -webkit-transform: translate(0px, 100px) scale(0.6);
+            transform: translate(0px, 100px) scale(0.6);
+    fill: #00A6E4;
+  }
+  50% {
+    -webkit-transform: translate(0px, 100px) scale(0.4);
+            transform: translate(0px, 100px) scale(0.4);
+    fill: #00A6E4;
+  }
+  80% {
+    -webkit-transform: translate(0px, 0px) scale(1);
+            transform: translate(0px, 0px) scale(1);
+    fill: #00B5AB;
+  }
+}
+@-webkit-keyframes right-flank {
+  20% {
+    -webkit-transform: translate(100px, -25px) scale(0.6);
+            transform: translate(100px, -25px) scale(0.6);
+    fill: #41C1BC;
+  }
+  50% {
+    -webkit-transform: translate(110px, 0px) scale(0.4);
+            transform: translate(110px, 0px) scale(0.4);
+    fill: #00A6E4;
+  }
+  80% {
+    -webkit-transform: translate(0px, 0px) scale(1);
+            transform: translate(0px, 0px) scale(1);
+    fill: #0074C1;
+  }
+}
+@keyframes right-flank {
+  20% {
+    -webkit-transform: translate(100px, -25px) scale(0.6);
+            transform: translate(100px, -25px) scale(0.6);
+    fill: #41C1BC;
+  }
+  50% {
+    -webkit-transform: translate(110px, 0px) scale(0.4);
+            transform: translate(110px, 0px) scale(0.4);
+    fill: #00A6E4;
+  }
+  80% {
+    -webkit-transform: translate(0px, 0px) scale(1);
+            transform: translate(0px, 0px) scale(1);
+    fill: #0074C1;
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/browser/static/host.dart b/mojo/public/dart/third_party/test/lib/src/runner/browser/static/host.dart
new file mode 100644
index 0000000..09cc32d
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/browser/static/host.dart
@@ -0,0 +1,165 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.browser.host;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:html';
+import 'dart:js' as js;
+
+import 'package:stack_trace/stack_trace.dart';
+import 'package:test/src/util/multi_channel.dart';
+import 'package:test/src/util/stream_channel.dart';
+
+/// The iframes created for each loaded test suite, indexed by the suite id.
+final _iframes = new Map<int, IFrameElement>();
+
+// TODO(nweiz): test this once we can run browser tests.
+/// Code that runs in the browser and loads test suites at the server's behest.
+///
+/// One instance of this runs for each browser. When the server tells it to load
+/// a test, it starts an iframe pointing at that test's code; from then on, it
+/// just relays messages between the two.
+///
+/// The browser uses two layers of [MultiChannel]s when communicating with the
+/// server:
+///
+///                                       server
+///                                         │
+///                                    (WebSocket)
+///                                         │
+///                    ┏━ host.html ━━━━━━━━┿━━━━━━━━━━━━━━━━━┓
+///                    ┃                    │                 ┃
+///                    ┃    ┌──────┬───MultiChannel─────┐     ┃
+///                    ┃    │      │      │      │      │     ┃
+///                    ┃   host  suite  suite  suite  suite   ┃
+///                    ┃           │      │      │      │     ┃
+///                    ┗━━━━━━━━━━━┿━━━━━━┿━━━━━━┿━━━━━━┿━━━━━┛
+///                                │      │      │      │
+///                                │     ...    ...    ...
+///                                │
+///                          (postMessage)
+///                                │
+///      ┏━ suite.html (in iframe) ┿━━━━━━━━━━━━━━━━━━━━━━━━━━┓
+///      ┃                         │                          ┃
+///      ┃         ┌──────────MultiChannel┬─────────┐         ┃
+///      ┃         │          │     │     │         │         ┃
+///      ┃   IframeListener  test  test  test  running test   ┃
+///      ┃                                                    ┃
+///      ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
+///
+/// The host (this code) has a [MultiChannel] that splits the WebSocket
+/// connection with the server. One connection is used for the host itself to
+/// receive messages like "load a suite at this URL", and the rest are connected
+/// to each test suite's iframe via `postMessage`.
+///
+/// Each iframe then has its own [MultiChannel] which takes its `postMessage`
+/// connection and splits it again. One connection is used for the
+/// [IframeListener], which sends messages like "here are all the tests in this
+/// suite". The rest are used for each test, receiving messages like "start
+/// running". A new connection is also created whenever a test begins running to
+/// send status messages about its progress.
+///
+/// It's of particular note that the suite's [MultiChannel] connection uses the
+/// host's purely as a transport layer; neither is aware that the other is also
+/// using [MultiChannel]. This is necessary, since the host doesn't share memory
+/// with the suites and thus can't share its [MultiChannel] with them, but it
+/// does mean that the server needs to be sure to nest its [MultiChannel]s at
+/// the same place the client does.
+void main() {
+  // This tells content_shell not to close immediately after the page has
+  // rendered.
+  var testRunner = js.context['testRunner'];
+  if (testRunner != null) testRunner.callMethod('waitUntilDone', []);
+
+  runZoned(() {
+    var serverChannel = _connectToServer();
+    serverChannel.stream.listen((message) {
+      if (message['command'] == 'loadSuite') {
+        var suiteChannel = serverChannel.virtualChannel(message['channel']);
+        var iframeChannel = _connectToIframe(message['url'], message['id']);
+        suiteChannel.pipe(iframeChannel);
+      } else if (message['command'] == 'displayPause') {
+        document.body.classes.add('paused');
+      } else if (message['command'] == 'resume') {
+        document.body.classes.remove('paused');
+      } else {
+        assert(message['command'] == 'closeSuite');
+        _iframes[message['id']].remove();
+      }
+    });
+
+    var play = document.querySelector("#play");
+    play.onClick.listen((_) {
+      document.body.classes.remove('paused');
+      serverChannel.sink.add({"command": "resume"});
+    });
+  }, onError: (error, stackTrace) {
+    print("$error\n${new Trace.from(stackTrace).terse}");
+  });
+}
+
+/// Creates a [MultiChannel] connection to the server, using a [WebSocket] as
+/// the underlying protocol.
+MultiChannel _connectToServer() {
+  // The `managerUrl` query parameter contains the WebSocket URL of the remote
+  // [BrowserManager] with which this communicates.
+  var currentUrl = Uri.parse(window.location.href);
+  var webSocket = new WebSocket(currentUrl.queryParameters['managerUrl']);
+
+  var inputController = new StreamController(sync: true);
+  webSocket.onMessage.listen((message) {
+    inputController.add(JSON.decode(message.data));
+  });
+
+  var outputController = new StreamController(sync: true);
+  outputController.stream.listen(
+      (message) => webSocket.send(JSON.encode(message)));
+
+  return new MultiChannel(inputController.stream, outputController.sink);
+}
+
+/// Creates an iframe with `src` [url] and establishes a connection to it using
+/// `postMessage`.
+///
+/// [id] identifies the suite loaded in this iframe.
+StreamChannel _connectToIframe(String url, int id) {
+  var iframe = new IFrameElement();
+  _iframes[id] = iframe;
+  iframe.src = url;
+  document.body.children.add(iframe);
+
+  var inputController = new StreamController(sync: true);
+  var outputController = new StreamController(sync: true);
+
+  // Use this to avoid sending a message to the iframe before it's sent a
+  // message to us. This ensures that no messages get dropped on the floor.
+  var readyCompleter = new Completer();
+
+  // TODO(nweiz): use MessageChannel once Firefox supports it
+  // (http://caniuse.com/#search=MessageChannel).
+  window.onMessage.listen((message) {
+    // A message on the Window can theoretically come from any website. It's
+    // very unlikely that a malicious site would care about hacking someone's
+    // unit tests, let alone be able to find the test server while it's
+    // running, but it's good practice to check the origin anyway.
+    if (message.origin != window.location.origin) return;
+
+    // TODO(nweiz): Stop manually checking href here once issue 22554 is
+    // fixed.
+    if (message.data["href"] != iframe.src) return;
+
+    message.stopPropagation();
+    inputController.add(message.data["data"]);
+    if (!readyCompleter.isCompleted) readyCompleter.complete();
+  });
+
+  outputController.stream.listen((message) async {
+    await readyCompleter.future;
+    iframe.contentWindow.postMessage(message, window.location.origin);
+  });
+
+  return new StreamChannel(inputController.stream, outputController.sink);
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/browser/static/index.html b/mojo/public/dart/third_party/test/lib/src/runner/browser/static/index.html
new file mode 100644
index 0000000..c0da83e
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/browser/static/index.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <title>test Browser Host</title>
+  <link rel="stylesheet" type="text/css" href="host.css" />
+</head>
+<body>
+  <svg version="1.1" x="0px" y="0px" width="400px" height="400px"
+      viewBox="0 0 400 400">
+    <path id="right-flank" fill="#0083C9" d="M249.379,226.486l-6.676,15.572L166.174,166h58.82c0,0,2.807-0.409,3.645,1.966L249.379,226.486z"/>
+    <path id="right-ear"   fill="#00D2B8" d="M201.84,141.906L166.174,166h58.82c0,0,2.168-0.25,2.645,0.566l-2.694-8.848l-15.024-14.68C207.555,140.329,203.578,140.744,201.84,141.906z"/>
+    <path id="left-flank"  fill="#00D2B8" d="M242.616,241.856l-15.022,6.799l-60.493-21.429c-1.035-0.395-1.101-3.696-1.101-3.696v-57.932L242.616,241.856z"/>
+    <path id="left-paw"    fill="#55DECA" d="M167.003,227.098l60.636,21.558l15.064-6.799L237.224,259h-43.856c0,0-14.077-13.929-18.141-17.993C171.162,236.943,169.162,233.989,167.003,227.098z"/>
+    <path id="right-paw"   fill="#00A4E4" d="M227.676,166.365c0.963,1.401,1.361,2.473,1.361,2.473l20.352,57.648l-6.711,15.37L259,236.463v-44.854c0,0-13.678-13.965-17.741-17.882C237.193,169.811,231.466,166.319,227.676,166.365z"/>
+    <path id="left-ear"    fill="#0083C9" d="M166.769,227.098c0,0-0.769-1.104-0.769-4.355v-57.144l-23.115,34.877c-1.626,1.774-1.567,6.538,1.595,9.755l13.636,13.892L166.769,227.098z"/>
+  </svg>
+  <div id="dark"></div>
+  <svg id="play" version="1.1" x="0px" y="0px" width="80px" height="80px" viewBox="0 0 25 25">
+    <defs><filter id="blur"><feGaussianBlur stdDeviation="0.3" id="feGaussianBlur5097" /></filter></defs>
+    <path d="M 3.777014,1.3715789 A 1.1838119,1.1838119 0 0 0 2.693923,2.5488509 V 22.444746 a 1.1838119,1.1838119 0 0 0 1.765908,1.035999 l 17.235259,-9.95972 a 1.1838119,1.1838119 0 0 0 0,-2.071998 L 4.459831,1.5128519 A 1.1838119,1.1838119 0 0 0 3.777014,1.3715789 z" style="opacity:0.5;stroke:#000000;stroke-width:1;filter:url(#blur)" />
+    <path style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.32722104" d="M 3.4770491,1.0714664 A 1.1838119,1.1838119 0 0 0 2.3939589,2.2487382 V 22.144633 a 1.1838119,1.1838119 0 0 0 1.7659079,1.035999 l 17.2352602,-9.95972 a 1.1838119,1.1838119 0 0 0 0,-2.071998 L 4.1598668,1.2127389 A 1.1838119,1.1838119 0 0 0 3.4770491,1.0714664 z" />
+  </svg>
+  <script src="host.dart.js"></script>
+</body>
+</html>
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/configuration.dart b/mojo/public/dart/third_party/test/lib/src/runner/configuration.dart
new file mode 100644
index 0000000..329470f
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/configuration.dart
@@ -0,0 +1,210 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.configuration;
+
+import 'dart:io';
+import 'dart:math' as math;
+
+import 'package:args/args.dart';
+import 'package:path/path.dart' as p;
+
+import '../frontend/timeout.dart';
+import '../backend/metadata.dart';
+import '../backend/test_platform.dart';
+import '../util/io.dart';
+
+/// The default number of test suites to run at once.
+///
+/// This defaults to half the available processors, since presumably some of
+/// them will be used for the OS and other processes.
+final _defaultConcurrency = math.max(1, Platform.numberOfProcessors ~/ 2);
+
+/// A class that encapsulates the command-line configuration of the test runner.
+class Configuration {
+  /// The parser used to parse the command-line arguments.
+  static final ArgParser _parser = (() {
+    var parser = new ArgParser(allowTrailingOptions: true);
+
+    var allPlatforms = TestPlatform.all.toList();
+    if (!Platform.isMacOS) allPlatforms.remove(TestPlatform.safari);
+    if (!Platform.isWindows) allPlatforms.remove(TestPlatform.internetExplorer);
+
+    parser.addFlag("help", abbr: "h", negatable: false,
+        help: "Shows this usage information.");
+    parser.addFlag("version", negatable: false,
+        help: "Shows the package's version.");
+    parser.addOption("package-root", hide: true);
+    parser.addOption("name",
+        abbr: 'n',
+        help: 'A substring of the name of the test to run.\n'
+            'Regular expression syntax is supported.');
+    parser.addOption("plain-name",
+        abbr: 'N',
+        help: 'A plain-text substring of the name of the test to run.');
+    parser.addOption("platform",
+        abbr: 'p',
+        help: 'The platform(s) on which to run the tests.',
+        allowed: allPlatforms.map((platform) => platform.identifier).toList(),
+        defaultsTo: 'vm',
+        allowMultiple: true);
+    parser.addOption("concurrency",
+        abbr: 'j',
+        help: 'The number of concurrent test suites run.\n'
+            '(defaults to $_defaultConcurrency)',
+        valueHelp: 'threads');
+    parser.addOption("pub-serve",
+        help: 'The port of a pub serve instance serving "test/".',
+        valueHelp: 'port');
+    parser.addFlag("pause-after-load",
+        help: 'Pauses for debugging before any tests execute.\n'
+            'Implies --concurrency=1.\n'
+            'Currently only supported for browser tests.',
+        negatable: false);
+    parser.addOption("reporter",
+        abbr: 'r',
+        help: 'The runner used to print test results.',
+        allowed: ['compact', 'expanded'],
+        defaultsTo: Platform.isWindows ? 'expanded' : 'compact',
+        allowedHelp: {
+      'compact': 'A single line, updated continuously.',
+      'expanded': 'A separate line for each update.'
+    });
+    parser.addFlag("verbose-trace", negatable: false,
+        help: 'Whether to emit stack traces with core library frames.');
+    parser.addFlag("js-trace", negatable: false,
+        help: 'Whether to emit raw JavaScript stack traces for browser tests.');
+    parser.addFlag("color", defaultsTo: null,
+        help: 'Whether to use terminal colors.\n(auto-detected by default)');
+
+    return parser;
+  })();
+
+  /// The usage string for the command-line arguments.
+  static String get usage => _parser.usage;
+
+  /// Whether `--help` was passed.
+  final bool help;
+
+  /// Whether `--version` was passed.
+  final bool version;
+
+  /// Whether stack traces should be presented as-is or folded to remove
+  /// irrelevant packages.
+  final bool verboseTrace;
+
+  /// Whether JavaScript stack traces should be left as-is or converted to
+  /// Dart-like traces.
+  final bool jsTrace;
+
+  /// Whether to pause for debugging after loading each test suite.
+  final bool pauseAfterLoad;
+
+  /// The package root for resolving "package:" URLs.
+  final String packageRoot;
+
+  /// The name of the reporter to use to display results.
+  final String reporter;
+
+  /// The URL for the `pub serve` instance from which to load tests, or `null`
+  /// if tests should be loaded from the filesystem.
+  final Uri pubServeUrl;
+
+  /// Whether to use command-line color escapes.
+  final bool color;
+
+  /// How many tests to run concurrently.
+  final int concurrency;
+
+  /// The from which to load tests.
+  final List<String> paths;
+
+  /// Whether the load paths were passed explicitly or the default was used.
+  final bool explicitPaths;
+
+  /// The pattern to match against test names to decide which to run, or `null`
+  /// if all tests should be run.
+  final Pattern pattern;
+
+  /// The set of platforms on which to run tests.
+  final List<TestPlatform> platforms;
+
+  /// The global test metadata derived from this configuration.
+  Metadata get metadata =>
+      new Metadata(
+          timeout: pauseAfterLoad ? Timeout.none : null,
+          verboseTrace: verboseTrace);
+
+  /// Parses the configuration from [args].
+  ///
+  /// Throws a [FormatException] if [args] are invalid.
+  factory Configuration.parse(List<String> args) {
+    var options = _parser.parse(args);
+
+    var pattern;
+    if (options['name'] != null) {
+      if (options["plain-name"] != null) {
+        throw new FormatException(
+            "--name and --plain-name may not both be passed.");
+      }
+
+      pattern = _wrapFormatException(
+          options, 'name', (value) => new RegExp(value));
+    } else if (options['plain-name'] != null) {
+      pattern = options['plain-name'];
+    }
+
+    return new Configuration(
+        help: options['help'],
+        version: options['version'],
+        verboseTrace: options['verbose-trace'],
+        jsTrace: options['js-trace'],
+        pauseAfterLoad: options['pause-after-load'],
+        color: options['color'],
+        packageRoot: options['package-root'],
+        reporter: options['reporter'],
+        pubServePort: _wrapFormatException(options, 'pub-serve', int.parse),
+        concurrency: _wrapFormatException(options, 'concurrency', int.parse,
+            orElse: () => _defaultConcurrency),
+        pattern: pattern,
+        platforms: options['platform'].map(TestPlatform.find),
+        paths: options.rest.isEmpty ? null : options.rest);
+  }
+
+  /// Runs [parse] on the value of the option [name], and wraps any
+  /// [FormatException] it throws with additional information.
+  static _wrapFormatException(ArgResults options, String name, parse(value),
+      {orElse()}) {
+    var value = options[name];
+    if (value == null) return orElse == null ? null : orElse();
+
+    try {
+      return parse(value);
+    } on FormatException catch (error) {
+      throw new FormatException('Couldn\'t parse --$name "${options[name]}": '
+          '${error.message}');
+    }
+  }
+
+  Configuration({this.help: false, this.version: false,
+          this.verboseTrace: false, this.jsTrace: false,
+          bool pauseAfterLoad: false, bool color, String packageRoot,
+          String reporter, int pubServePort, int concurrency, this.pattern,
+          Iterable<TestPlatform> platforms, Iterable<String> paths})
+      : pauseAfterLoad = pauseAfterLoad,
+        color = color == null ? canUseSpecialChars : color,
+        packageRoot = packageRoot == null
+            ? p.join(p.current, 'packages')
+            : packageRoot,
+        reporter = reporter == null ? 'compact' : reporter,
+        pubServeUrl = pubServePort == null
+            ? null
+            : Uri.parse("http://localhost:$pubServePort"),
+        concurrency = pauseAfterLoad
+            ? 1
+            : (concurrency == null ? _defaultConcurrency : concurrency),
+        platforms = platforms == null ? [TestPlatform.vm] : platforms.toList(),
+        paths = paths == null ? ["test"] : paths.toList(),
+        explicitPaths = paths != null;
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/engine.dart b/mojo/public/dart/third_party/test/lib/src/runner/engine.dart
new file mode 100644
index 0000000..c93e793
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/engine.dart
@@ -0,0 +1,334 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.engine;
+
+import 'dart:async';
+import 'dart:collection';
+
+import 'package:async/async.dart' hide Result;
+import 'package:collection/collection.dart';
+import 'package:pool/pool.dart';
+
+import '../backend/live_test.dart';
+import '../backend/live_test_controller.dart';
+import '../backend/state.dart';
+import '../backend/test.dart';
+import 'load_suite.dart';
+import 'runner_suite.dart';
+
+/// An [Engine] manages a run that encompasses multiple test suites.
+///
+/// Test suites are provided by passing them into [suiteSink]. Once all suites
+/// have been provided, the user should close [suiteSink] to indicate this.
+/// [run] won't terminate until [suiteSink] is closed. Suites will be run in the
+/// order they're provided to [suiteSink]. Tests within those suites will
+/// likewise be run in the order of [Suite.tests].
+///
+/// The current status of every test is visible via [liveTests]. [onTestStarted]
+/// can also be used to be notified when a test is about to be run.
+///
+/// The engine has some special logic for [LoadSuite]s and the tests they
+/// contain, referred to as "load tests". Load tests exist to provide visibility
+/// into the process of loading test files, but as long as that process is
+/// proceeding normally users usually don't care about it, so the engine only
+/// surfaces running load tests (that is, includes them in [liveTests] and other
+/// collections) under specific circumstances.
+///
+/// If only load tests are running, exactly one load test will be in [active]
+/// and [liveTests]. If this test passes, it will be removed from both [active]
+/// and [liveTests] and *will not* be added to [passed]. If at any point a load
+/// test fails, it will be added to [failed] and [liveTests].
+///
+/// The test suite loaded by a load suite will be automatically be run by the
+/// engine; it doesn't need to be added to [suiteSink] manually.
+///
+/// Load tests will always be emitted through [onTestStarted] so users can watch
+/// their event streams once they start running.
+class Engine {
+  /// Whether [run] has been called yet.
+  var _runCalled = false;
+
+  /// Whether [close] has been called.
+  var _closed = false;
+
+  /// Whether [close] was called before all the tests finished running.
+  ///
+  /// This is `null` if close hasn't been called and the tests are still
+  /// running, `true` if close was called before the tests finished running, and
+  /// `false` if the tests finished running before close was called.
+  var _closedBeforeDone;
+
+  /// A pool that limits the number of test suites running concurrently.
+  final Pool _runPool;
+
+  /// A pool that limits the number of test suites loaded concurrently.
+  ///
+  /// Once this reaches its limit, loading any additional test suites will cause
+  /// previous suites to be unloaded in the order they completed.
+  final Pool _loadPool;
+
+  /// Whether all tests passed.
+  ///
+  /// This fires once all tests have completed and [suiteSink] has been closed.
+  /// This will be `null` if [close] was called before all the tests finished
+  /// running.
+  Future<bool> get success async {
+    await _group.future;
+    if (_closedBeforeDone) return null;
+    return liveTests.every((liveTest) =>
+        liveTest.state.result == Result.success);
+  }
+
+  /// A group of futures for each test suite.
+  final _group = new FutureGroup();
+
+  /// A sink used to pass [RunnerSuite]s in to the engine to run.
+  ///
+  /// Suites may be added as quickly as they're available; the Engine will only
+  /// run as many as necessary at a time based on its concurrency settings.
+  ///
+  /// Suites added to the sink will be closed by the engine based on its
+  /// internal logic.
+  Sink<RunnerSuite> get suiteSink => new DelegatingSink(_suiteController.sink);
+  final _suiteController = new StreamController<RunnerSuite>();
+
+  /// All the currently-known tests that have run, are running, or will run.
+  ///
+  /// These are [LiveTest]s, representing the in-progress state of each test.
+  /// Tests that have not yet begun running are marked [Status.pending]; tests
+  /// that have finished are marked [Status.complete].
+  ///
+  /// This is guaranteed to contain the same tests as the union of [passed],
+  /// [skipped], [failed], and [active].
+  ///
+  /// [LiveTest.run] must not be called on these tests.
+  List<LiveTest> get liveTests => new UnmodifiableListView(_liveTests);
+  final _liveTests = new List<LiveTest>();
+
+  /// A stream that emits each [LiveTest] as it's about to start running.
+  ///
+  /// This is guaranteed to fire before [LiveTest.onStateChange] first fires.
+  Stream<LiveTest> get onTestStarted => _onTestStartedController.stream;
+  final _onTestStartedController = new StreamController<LiveTest>.broadcast();
+
+  /// The set of tests that have completed and been marked as passing.
+  Set<LiveTest> get passed => new UnmodifiableSetView(_passed);
+  final _passed = new Set<LiveTest>();
+
+  /// The set of tests that have completed and been marked as skipped.
+  Set<LiveTest> get skipped => new UnmodifiableSetView(_skipped);
+  final _skipped = new Set<LiveTest>();
+
+  /// The set of tests that have completed and been marked as failing or error.
+  Set<LiveTest> get failed => new UnmodifiableSetView(_failed);
+  final _failed = new Set<LiveTest>();
+
+  /// The tests that are still running, in the order they begain running.
+  List<LiveTest> get active => new UnmodifiableListView(_active);
+  final _active = new QueueList<LiveTest>();
+
+  /// The tests from [LoadSuite]s that are still running, in the order they
+  /// began running.
+  ///
+  /// This is separate from [active] because load tests aren't always surfaced.
+  final _activeLoadTests = new List<LiveTest>();
+
+  /// Whether this engine is idle—that is, not currently executing a test.
+  bool get isIdle => _group.isIdle;
+
+  /// A broadcast stream that fires an event whenever [isIdle] switches from
+  /// `false` to `true`.
+  Stream get onIdle => _group.onIdle;
+
+  /// Creates an [Engine] that will run all tests provided via [suiteSink].
+  ///
+  /// [concurrency] controls how many suites are run at once, and defaults to 1.
+  /// [maxSuites] controls how many suites are *loaded* at once, and defaults to
+  /// four times [concurrency].
+  Engine({int concurrency, int maxSuites})
+      : _runPool = new Pool(concurrency == null ? 1 : concurrency),
+        _loadPool = new Pool(maxSuites == null
+            ? (concurrency == null ? 2 : concurrency * 2)
+            : maxSuites) {
+    _group.future.then((_) {
+      if (_closedBeforeDone == null) _closedBeforeDone = false;
+    }).catchError((_) {
+      // Don't top-level errors. They'll be thrown via [success] anyway.
+    });
+  }
+
+  /// Creates an [Engine] that will run all tests in [suites].
+  ///
+  /// [concurrency] controls how many suites are run at once. An engine
+  /// constructed this way will automatically close its [suiteSink], meaning
+  /// that no further suites may be provided.
+  factory Engine.withSuites(List<RunnerSuite> suites, {int concurrency}) {
+    var engine = new Engine(concurrency: concurrency);
+    for (var suite in suites) engine.suiteSink.add(suite);
+    engine.suiteSink.close();
+    return engine;
+  }
+
+  /// Runs all tests in all suites defined by this engine.
+  ///
+  /// This returns `true` if all tests succeed, and `false` otherwise. It will
+  /// only return once all tests have finished running and [suiteSink] has been
+  /// closed.
+  Future<bool> run() {
+    if (_runCalled) {
+      throw new StateError("Engine.run() may not be called more than once.");
+    }
+    _runCalled = true;
+
+    _suiteController.stream.listen((suite) {
+      _group.add(new Future.sync(() async {
+        var loadResource = await _loadPool.request();
+
+        if (suite is LoadSuite) {
+          suite = await _addLoadSuite(suite);
+          if (suite == null) {
+            loadResource.release();
+            return;
+          }
+        }
+
+        await _runPool.withResource(() async {
+          if (_closed) return null;
+
+          // TODO(nweiz): Use a real for loop when issue 23394 is fixed.
+          await Future.forEach(suite.tests, (test) async {
+            if (_closed) return;
+
+            var liveTest = test.metadata.skip
+                ? _skippedTest(suite, test)
+                : test.load(suite);
+            _liveTests.add(liveTest);
+            _active.add(liveTest);
+
+            // If there were no active non-load tests, the current active test
+            // would have been a load test. In that case, remove it, since now we
+            // have a non-load test to add.
+            if (_active.isNotEmpty && _active.first.suite is LoadSuite) {
+              _liveTests.remove(_active.removeFirst());
+            }
+
+            liveTest.onStateChange.listen((state) {
+              if (state.status != Status.complete) return;
+              _active.remove(liveTest);
+
+              // If we're out of non-load tests, surface a load test.
+              if (_active.isEmpty && _activeLoadTests.isNotEmpty) {
+                _active.add(_activeLoadTests.first);
+                _liveTests.add(_activeLoadTests.first);
+              }
+
+              if (state.result != Result.success) {
+                _passed.remove(liveTest);
+                _failed.add(liveTest);
+              } else if (liveTest.test.metadata.skip) {
+                _skipped.add(liveTest);
+              } else {
+                _passed.add(liveTest);
+              }
+            });
+
+            _onTestStartedController.add(liveTest);
+
+            // First, schedule a microtask to ensure that [onTestStarted] fires
+            // before the first [LiveTest.onStateChange] event. Once the test
+            // finishes, use [new Future] to do a coarse-grained event loop pump
+            // to avoid starving non-microtask events.
+            await new Future.microtask(liveTest.run);
+            await new Future(() {});
+          });
+
+          loadResource.allowRelease(() => suite.close());
+        });
+      }));
+    }, onDone: _group.close);
+
+    return success;
+  }
+
+  /// Returns a dummy [LiveTest] for a test marked as "skip".
+  LiveTest _skippedTest(RunnerSuite suite, Test test) {
+    var controller;
+    controller = new LiveTestController(suite, test, () {
+      controller.setState(const State(Status.running, Result.success));
+      controller.setState(const State(Status.complete, Result.success));
+      controller.completer.complete();
+    }, () {});
+    return controller.liveTest;
+  }
+
+  /// Adds listeners for [suite].
+  ///
+  /// Load suites have specific logic apart from normal test suites.
+  Future<RunnerSuite> _addLoadSuite(LoadSuite suite) async {
+    var liveTest = await suite.tests.single.load(suite);
+
+    _activeLoadTests.add(liveTest);
+
+    // Only surface the load test if there are no other tests currently running.
+    if (_active.isEmpty) {
+      _liveTests.add(liveTest);
+      _active.add(liveTest);
+    }
+
+    liveTest.onStateChange.listen((state) {
+      if (state.status != Status.complete) return;
+      _activeLoadTests.remove(liveTest);
+
+      // Only one load test will be active at any given time, and it will always
+      // be the only active test. Remove it and, if possible, surface another
+      // load test.
+      if (_active.isNotEmpty && _active.first.suite == suite) {
+        _active.remove(liveTest);
+        _liveTests.remove(liveTest);
+
+        if (_activeLoadTests.isNotEmpty) {
+          _active.add(_activeLoadTests.last);
+          _liveTests.add(_activeLoadTests.last);
+        }
+      }
+
+      // Surface the load test if it fails so that the user can see the failure.
+      if (state.result == Result.success) return;
+      _failed.add(liveTest);
+      _liveTests.add(liveTest);
+    });
+
+    // Run the test immediately. We don't want loading to be blocked on suites
+    // that are already running.
+    _onTestStartedController.add(liveTest);
+    await liveTest.run();
+
+    return suite.suite;
+  }
+
+  /// Signals that the caller is done paying attention to test results and the
+  /// engine should release any resources it has allocated.
+  ///
+  /// Any actively-running tests are also closed. VM tests are allowed to finish
+  /// running so that any modifications they've made to the filesystem can be
+  /// cleaned up.
+  ///
+  /// **Note that closing the engine is not the same as closing [suiteSink].**
+  /// Closing [suiteSink] indicates that no more input will be provided, closing
+  /// the engine indicates that no more output should be emitted.
+  Future close() async {
+    _closed = true;
+    if (_closedBeforeDone == null) _closedBeforeDone = true;
+    _suiteController.close();
+
+    // Close the running tests first so that we're sure to wait for them to
+    // finish before we close their suites and cause them to become unloaded.
+    var allLiveTests = liveTests.toSet()..addAll(_activeLoadTests);
+    await Future.wait(allLiveTests.map((liveTest) => liveTest.close()));
+
+    var allSuites = allLiveTests.map((liveTest) => liveTest.suite).toSet();
+    await Future.wait(allSuites.map((suite) => suite.close()));
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/environment.dart b/mojo/public/dart/third_party/test/lib/src/runner/environment.dart
new file mode 100644
index 0000000..33911c4
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/environment.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.environment;
+
+import '../util/cancelable_future.dart';
+
+/// The abstract class of environments in which test suites are
+/// loaded—specifically, browsers and the Dart VM.
+abstract class Environment {
+  /// The URL of the Dart VM Observatory for this environment, or `null` if this
+  /// environment doesn't run the Dart VM or the URL couldn't be detected.
+  Uri get observatoryUrl;
+
+  /// The URL of the remote debugger for this environment, or `null` if it isn't
+  /// enabled.
+  Uri get remoteDebuggerUrl;
+
+  /// Displays information indicating that the test runner is paused.
+  ///
+  /// The returned future will complete when the user takes action within the
+  /// environment that should unpause the runner. If the runner is unpaused
+  /// elsewhere, the future should be canceled.
+  CancelableFuture displayPause();
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/hack_load_vm_file_hook.dart b/mojo/public/dart/third_party/test/lib/src/runner/hack_load_vm_file_hook.dart
new file mode 100644
index 0000000..4043257
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/hack_load_vm_file_hook.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.hack_load_vm_file_hook;
+
+import 'dart:async';
+
+import '../backend/metadata.dart';
+import 'configuration.dart';
+import 'runner_suite.dart';
+
+typedef Future<RunnerSuite> LoadVMFileHook(String path, Metadata metadata,
+    Configuration config);
+
+/// **Do not set or use this function without express permission from the test
+/// package authors**.
+///
+/// A function that overrides the loader's default behavior for loading test
+/// suites on the Dart VM. This function takes the path to the file, the
+/// file's metadata, and the test runner's configuration and returns a
+/// [RunnerSuite] for that file.
+LoadVMFileHook loadVMFileHook;
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/load_exception.dart b/mojo/public/dart/third_party/test/lib/src/runner/load_exception.dart
new file mode 100644
index 0000000..dc740c3
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/load_exception.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.load_exception;
+
+import 'dart:isolate';
+
+import 'package:path/path.dart' as p;
+import 'package:source_span/source_span.dart';
+
+import '../utils.dart';
+
+/// A regular expression for matching filename annotations in
+/// [IsolateSpawnException] messages.
+final _isolateFileRegExp =
+    new RegExp(r"^'(file:/[^']+)': (error|warning): ", multiLine: true);
+
+class LoadException implements Exception {
+  final String path;
+
+  final innerError;
+
+  LoadException(this.path, this.innerError);
+
+  String toString({bool color: false}) {
+    var buffer = new StringBuffer();
+    if (color) buffer.write('\u001b[31m'); // red
+    buffer.write('Failed to load "$path":');
+    if (color) buffer.write('\u001b[0m'); // no color
+
+    var innerString = getErrorMessage(innerError);
+    if (innerError is IsolateSpawnException) {
+      // If this is a parse error, clean up the noisy filename annotations.
+      innerString = innerString.replaceAllMapped(_isolateFileRegExp, (match) {
+        if (p.fromUri(match[1]) == p.absolute(path)) return "";
+        return "${p.prettyUri(match[1])}: ";
+      });
+
+      // If this is a file system error, get rid of both the preamble and the
+      // useless stack trace.
+
+      // This message was used prior to 1.11.0-dev.3.0.
+      innerString = innerString.replaceFirst(
+          "Unhandled exception:\n"
+          "Uncaught Error: Load Error: ",
+          "");
+
+      // This message was used after 1.11.0-dev.3.0.
+      innerString = innerString.replaceFirst(
+          "Unhandled exception:\n"
+          "Load Error for ",
+          "");
+
+      innerString = innerString.replaceFirst("FileSystemException: ", "");
+      innerString = innerString.split("Stack Trace:\n").first.trim();
+    } if (innerError is SourceSpanException) {
+      innerString = innerError.toString(color: color)
+          .replaceFirst(" of $path", "");
+    }
+
+    buffer.write(innerString.contains("\n") ? "\n" : " ");
+    buffer.write(innerString);
+    return buffer.toString();
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/load_exception_suite.dart b/mojo/public/dart/third_party/test/lib/src/runner/load_exception_suite.dart
new file mode 100644
index 0000000..40589bb
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/load_exception_suite.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.load_exception_suite;
+
+import 'dart:async';
+
+import '../backend/invoker.dart';
+import '../backend/metadata.dart';
+import '../backend/suite.dart';
+import 'load_exception.dart';
+
+/// A test suite generated from a load exception.
+///
+/// Load exceptions are exposed as test suites so that they can be presented
+/// alongside successful tests.
+class LoadExceptionSuite extends Suite {
+  /// The exception that this suite exposes.
+  final LoadException exception;
+  final StackTrace stackTrace;
+
+  LoadExceptionSuite(LoadException exception, stackTrace)
+      : exception = exception,
+        stackTrace = stackTrace,
+        super([
+          new LocalTest("load error", new Metadata(),
+              () => new Future.error(exception, stackTrace))
+        ], path: exception.path);
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/load_suite.dart b/mojo/public/dart/third_party/test/lib/src/runner/load_suite.dart
new file mode 100644
index 0000000..0c1dabc
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/load_suite.dart
@@ -0,0 +1,139 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.load_suite;
+
+import 'dart:async';
+
+import 'package:stack_trace/stack_trace.dart';
+
+import '../../test.dart';
+import '../backend/invoker.dart';
+import '../backend/metadata.dart';
+import '../backend/test_platform.dart';
+import '../utils.dart';
+import 'load_exception.dart';
+import 'runner_suite.dart';
+import 'vm/environment.dart';
+
+/// A [Suite] emitted by a [Loader] that provides a test-like interface for
+/// loading a test file.
+///
+/// This is used to expose the current status of test loading to the user. It's
+/// important to provide users visibility into what's taking a long time and
+/// where failures occur. And since some tests may be loaded at the same time as
+/// others are run, it's useful to provide that visibility in the form of a test
+/// suite so that it can integrate well into the existing reporting interface
+/// without too much extra logic.
+///
+/// A suite is constructed with logic necessary to produce a test suite. As with
+/// a normal test body, this logic isn't run until [LiveTest.run] is called. The
+/// suite itself is returned by [suite] once it's avaialble, but any errors or
+/// prints will be emitted through the running [LiveTest].
+class LoadSuite extends RunnerSuite {
+  /// A future that completes to the loaded suite once the suite's test has been
+  /// run and completed successfully.
+  ///
+  /// This will return `null` if the suite is unavailable for some reason (for
+  /// example if an error occurred while loading it).
+  final Future<RunnerSuite> suite;
+
+  /// Creates a load suite named [name] on [platform].
+  ///
+  /// [body] may return either a [RunnerSuite] or a [Future] that completes to a
+  /// [RunnerSuite]. Its return value is forwarded through [suite], although if
+  /// it throws an error that will be forwarded through the suite's test.
+  ///
+  /// If the the load test is closed before [body] is complete, it will close
+  /// the suite returned by [body] once it completes.
+  factory LoadSuite(String name, body(), {TestPlatform platform}) {
+    var completer = new Completer.sync();
+    return new LoadSuite._(name, () {
+      var invoker = Invoker.current;
+      invoker.addOutstandingCallback();
+
+      invoke(() async {
+        try {
+          var suite = await body();
+          if (completer.isCompleted) {
+            // If the load test has already been closed, close the suite it
+            // generated.
+            suite.close();
+            return;
+          }
+
+          completer.complete(suite);
+          invoker.removeOutstandingCallback();
+        } catch (error, stackTrace) {
+          registerException(error, stackTrace);
+          if (!completer.isCompleted) completer.complete();
+        }
+      });
+
+      // If the test is forcibly closed, exit immediately. It doesn't have any
+      // cleanup to do that won't be handled by Loader.close.
+      invoker.onClose.then((_) {
+        if (completer.isCompleted) return;
+        completer.complete();
+        invoker.removeOutstandingCallback();
+      });
+    }, completer.future, platform: platform);
+  }
+
+  /// A utility constructor for a load suite that just throws [exception].
+  ///
+  /// The suite's name will be based on [exception]'s path.
+  factory LoadSuite.forLoadException(LoadException exception,
+      {StackTrace stackTrace, TestPlatform platform}) {
+    if (stackTrace == null) stackTrace = new Trace.current();
+
+    return new LoadSuite("loading ${exception.path}", () {
+      return new Future.error(exception, stackTrace);
+    }, platform: platform);
+  }
+
+  /// A utility constructor for a load suite that just emits [suite].
+  factory LoadSuite.forSuite(RunnerSuite suite) {
+    return new LoadSuite("loading ${suite.path}", () => suite,
+        platform: suite.platform);
+  }
+
+  LoadSuite._(String name, void body(), this.suite, {TestPlatform platform})
+      : super(const VMEnvironment(), [
+        new LocalTest(name,
+            new Metadata(timeout: new Timeout(new Duration(minutes: 5))),
+            body)
+      ], platform: platform);
+
+  /// A constructor used by [changeSuite].
+  LoadSuite._changeSuite(LoadSuite old, Future<RunnerSuite> this.suite)
+      : super(const VMEnvironment(), old.tests, platform: old.platform);
+
+  /// Creates a new [LoadSuite] that's identical to this one, but that
+  /// transforms [suite] once it's loaded.
+  ///
+  /// If [suite] completes to `null`, [change] won't be run.
+  LoadSuite changeSuite(RunnerSuite change(RunnerSuite suite)) {
+    return new LoadSuite._changeSuite(this, suite.then((loadedSuite) {
+      if (loadedSuite == null) return null;
+      return change(loadedSuite);
+    }));
+  }
+
+  /// Runs the test and returns the suite.
+  ///
+  /// Rather than emitting errors through a [LiveTest], this just pipes them
+  /// through the return value.
+  Future<RunnerSuite> getSuite() async {
+    var liveTest = await tests.single.load(this);
+    liveTest.onPrint.listen(print);
+    await liveTest.run();
+
+    if (liveTest.errors.isEmpty) return await suite;
+
+    var error = liveTest.errors.first;
+    await new Future.error(error.error, error.stackTrace);
+    throw 'unreachable';
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/loader.dart b/mojo/public/dart/third_party/test/lib/src/runner/loader.dart
new file mode 100644
index 0000000..abf22b9
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/loader.dart
@@ -0,0 +1,254 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.loader;
+
+import 'dart:async';
+import 'dart:io';
+import 'dart:isolate';
+
+import 'package:analyzer/analyzer.dart';
+import 'package:async/async.dart';
+import 'package:path/path.dart' as p;
+import 'package:stack_trace/stack_trace.dart';
+
+import '../backend/invoker.dart';
+import '../backend/metadata.dart';
+import '../backend/test_platform.dart';
+import '../util/dart.dart' as dart;
+import '../util/io.dart';
+import '../util/remote_exception.dart';
+import '../utils.dart';
+import 'browser/server.dart';
+import 'configuration.dart';
+import 'hack_load_vm_file_hook.dart';
+import 'load_exception.dart';
+import 'load_suite.dart';
+import 'parse_metadata.dart';
+import 'runner_suite.dart';
+import 'vm/environment.dart';
+import 'vm/isolate_test.dart';
+
+/// A class for finding test files and loading them into a runnable form.
+class Loader {
+  /// The test runner configuration.
+  final Configuration _config;
+
+  /// The root directory that will be served for browser tests.
+  final String _root;
+
+  /// All suites that have been created by the loader.
+  final _suites = new Set<RunnerSuite>();
+
+  /// The server that serves browser test pages.
+  ///
+  /// This is lazily initialized the first time it's accessed.
+  Future<BrowserServer> get _browserServer {
+    return _browserServerMemo.runOnce(() {
+      return BrowserServer.start(_config, root: _root);
+    });
+  }
+  final _browserServerMemo = new AsyncMemoizer<BrowserServer>();
+
+  /// The memoizer for running [close] exactly once.
+  final _closeMemo = new AsyncMemoizer();
+
+  /// Creates a new loader that loads tests on platforms defined in [_config].
+  ///
+  /// [root] is the root directory that will be served for browser tests. It
+  /// defaults to the working directory.
+  Loader(this._config, {String root})
+      : _root = root == null ? p.current : root;
+
+  /// Loads all test suites in [dir].
+  ///
+  /// This will load tests from files that end in "_test.dart". Any tests that
+  /// fail to load will be emitted as [LoadException]s.
+  ///
+  /// This emits [LoadSuite]s that must then be run to emit the actual
+  /// [RunnerSuite]s defined in the file.
+  Stream<LoadSuite> loadDir(String dir) {
+    return mergeStreams(new Directory(dir).listSync(recursive: true)
+        .map((entry) {
+      if (entry is! File) return new Stream.fromIterable([]);
+
+      if (!entry.path.endsWith("_test.dart")) {
+        return new Stream.fromIterable([]);
+      }
+
+      if (p.split(entry.path).contains('packages')) {
+         return new Stream.fromIterable([]);
+      }
+
+      return loadFile(entry.path);
+    }));
+  }
+
+  /// Loads a test suite from the file at [path].
+  ///
+  /// This emits [LoadSuite]s that must then be run to emit the actual
+  /// [RunnerSuite]s defined in the file.
+  ///
+  /// This will emit a [LoadException] if the file fails to load.
+  Stream<LoadSuite> loadFile(String path) async* {
+    var suiteMetadata;
+    try {
+      suiteMetadata = parseMetadata(path);
+    } on AnalyzerErrorGroup catch (_) {
+      // Ignore the analyzer's error, since its formatting is much worse than
+      // the VM's or dart2js's.
+      suiteMetadata = new Metadata();
+    } on FormatException catch (error, stackTrace) {
+      yield new LoadSuite.forLoadException(
+          new LoadException(path, error), stackTrace: stackTrace);
+      return;
+    }
+    suiteMetadata = _config.metadata.merge(suiteMetadata);
+
+    if (_config.pubServeUrl != null && !p.isWithin('test', path)) {
+      yield new LoadSuite.forLoadException(new LoadException(
+          path, 'When using "pub serve", all test files must be in test/.'));
+      return;
+    }
+
+    for (var platform in _config.platforms) {
+      if (!suiteMetadata.testOn.evaluate(platform, os: currentOS)) continue;
+
+      var metadata = suiteMetadata.forPlatform(platform, os: currentOS);
+
+      // Don't load a skipped suite.
+      if (metadata.skip) {
+        yield new LoadSuite.forSuite(new RunnerSuite(const VMEnvironment(), [
+          new LocalTest(path, metadata, () {})
+        ], path: path, platform: platform, metadata: metadata));
+        continue;
+      }
+
+      var name = (platform.isJS ? "compiling " : "loading ") + path;
+      yield new LoadSuite(name, () {
+        return platform == TestPlatform.vm
+            ? _loadVmFile(path, metadata)
+            : _loadBrowserFile(path, platform, metadata);
+      }, platform: platform);
+    }
+  }
+
+  /// Load the test suite at [path] in [platform].
+  ///
+  /// [metadata] is the suite-level metadata for the test.
+  Future<RunnerSuite> _loadBrowserFile(String path, TestPlatform platform,
+        Metadata metadata) async =>
+      (await _browserServer).loadSuite(path, platform, metadata);
+
+  /// Load the test suite at [path] in VM isolate.
+  ///
+  /// [metadata] is the suite-level metadata for the test.
+  Future<RunnerSuite> _loadVmFile(String path, Metadata metadata) async {
+    if (loadVMFileHook != null) {
+      var suite = await loadVMFileHook(path, metadata, _config);
+      _suites.add(suite);
+      return suite;
+    }
+
+    var receivePort = new ReceivePort();
+
+    var isolate;
+    try {
+      if (_config.pubServeUrl != null) {
+        var url = _config.pubServeUrl.resolveUri(
+            p.toUri(p.relative(path, from: 'test') + '.vm_test.dart'));
+
+        try {
+          isolate = await Isolate.spawnUri(url, [], {
+            'reply': receivePort.sendPort,
+            'metadata': metadata.serialize()
+          }, checked: true);
+        } on IsolateSpawnException catch (error) {
+          if (error.message.contains("OS Error: Connection refused") ||
+              error.message.contains("The remote computer refused")) {
+            throw new LoadException(path,
+                "Error getting $url: Connection refused\n"
+                'Make sure "pub serve" is running.');
+          } else if (error.message.contains("404 Not Found")) {
+            throw new LoadException(path,
+                "Error getting $url: 404 Not Found\n"
+                'Make sure "pub serve" is serving the test/ directory.');
+          }
+
+          throw new LoadException(path, error);
+        }
+      } else {
+        isolate = await dart.runInIsolate('''
+import "package:test/src/backend/metadata.dart";
+import "package:test/src/runner/vm/isolate_listener.dart";
+
+import "${p.toUri(p.absolute(path))}" as test;
+
+void main(_, Map message) {
+  var sendPort = message['reply'];
+  var metadata = new Metadata.deserialize(message['metadata']);
+  IsolateListener.start(sendPort, metadata, () => test.main);
+}
+''', {
+          'reply': receivePort.sendPort,
+          'metadata': metadata.serialize()
+        }, packageRoot: p.toUri(_config.packageRoot), checked: true);
+      }
+    } catch (error, stackTrace) {
+      receivePort.close();
+      if (error is LoadException) rethrow;
+      await new Future.error(new LoadException(path, error), stackTrace);
+    }
+
+    var completer = new Completer();
+
+    var subscription = receivePort.listen((response) {
+      if (response["type"] == "print") {
+        print(response["line"]);
+      } else if (response["type"] == "loadException") {
+        isolate.kill();
+        completer.completeError(
+            new LoadException(path, response["message"]),
+            new Trace.current());
+      } else if (response["type"] == "error") {
+        isolate.kill();
+        var asyncError = RemoteException.deserialize(response["error"]);
+        completer.completeError(
+            new LoadException(path, asyncError.error),
+            asyncError.stackTrace);
+      } else {
+        assert(response["type"] == "success");
+        completer.complete(response["tests"]);
+      }
+    });
+
+    try {
+      var suite = new RunnerSuite(const VMEnvironment(),
+          (await completer.future).map((test) {
+        var testMetadata = new Metadata.deserialize(test['metadata']);
+        return new IsolateTest(test['name'], testMetadata, test['sendPort']);
+      }),
+          metadata: metadata,
+          path: path,
+          platform: TestPlatform.vm,
+          os: currentOS,
+          onClose: isolate.kill);
+      _suites.add(suite);
+      return suite;
+    } finally {
+      subscription.cancel();
+    }
+  }
+
+  /// Closes the loader and releases all resources allocated by it.
+  Future close() {
+    return _closeMemo.runOnce(() async {
+      await Future.wait(_suites.map((suite) => suite.close()));
+      _suites.clear();
+
+      if (!_browserServerMemo.hasRun) return;
+      await (await _browserServer).close();
+    });
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/parse_metadata.dart b/mojo/public/dart/third_party/test/lib/src/runner/parse_metadata.dart
new file mode 100644
index 0000000..fb84f4a
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/parse_metadata.dart
@@ -0,0 +1,520 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.parse_metadata;
+
+import 'dart:io';
+
+import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:path/path.dart' as p;
+import 'package:source_span/source_span.dart';
+
+import '../backend/metadata.dart';
+import '../backend/platform_selector.dart';
+import '../frontend/timeout.dart';
+import '../util/dart.dart';
+import '../utils.dart';
+
+/// Parse the test metadata for the test file at [path].
+///
+/// Throws an [AnalysisError] if parsing fails or a [FormatException] if the
+/// test annotations are incorrect.
+Metadata parseMetadata(String path) => new _Parser(path).parse();
+
+/// A parser for test suite metadata.
+class _Parser {
+  /// The path to the test suite.
+  final String _path;
+
+  /// All annotations at the top of the file.
+  List<Annotation> _annotations;
+
+  /// All prefixes defined by imports in this file.
+  Set<String> _prefixes;
+
+  _Parser(String path)
+      : _path = path {
+    var contents = new File(path).readAsStringSync();
+    var directives = parseDirectives(contents, name: path).directives;
+    _annotations = directives.isEmpty ? [] : directives.first.metadata;
+
+    // We explicitly *don't* just look for "package:test" imports here,
+    // because it could be re-exported from another library.
+    _prefixes = directives.map((directive) {
+      if (directive is! ImportDirective) return null;
+      if (directive.prefix == null) return null;
+      return directive.prefix.name;
+    }).where((prefix) => prefix != null).toSet();
+  }
+
+  /// Parses the metadata.
+  Metadata parse() {
+    var timeout;
+    var testOn;
+    var skip;
+    var onPlatform;
+
+    for (var annotation in _annotations) {
+      var pair = _resolveConstructor(
+          annotation.name, annotation.constructorName);
+      var name = pair.first;
+      var constructorName = pair.last;
+
+      if (name == 'TestOn') {
+        _assertSingle(testOn, 'TestOn', annotation);
+        testOn = _parseTestOn(annotation, constructorName);
+      } else if (name == 'Timeout') {
+        _assertSingle(timeout, 'Timeout', annotation);
+        timeout = _parseTimeout(annotation, constructorName);
+      } else if (name == 'Skip') {
+        _assertSingle(skip, 'Skip', annotation);
+        skip = _parseSkip(annotation, constructorName);
+      } else if (name == 'OnPlatform') {
+        _assertSingle(onPlatform, 'OnPlatform', annotation);
+        onPlatform = _parseOnPlatform(annotation, constructorName);
+      }
+    }
+
+    return new Metadata(
+        testOn: testOn,
+        timeout: timeout,
+        skip: skip != null,
+        skipReason: skip is String ? skip : null,
+        onPlatform: onPlatform);
+  }
+
+  /// Parses a `@TestOn` annotation.
+  ///
+  /// [annotation] is the annotation. [constructorName] is the name of the named
+  /// constructor for the annotation, if any.
+  PlatformSelector _parseTestOn(Annotation annotation, String constructorName) {
+    _assertConstructorName(constructorName, 'TestOn', annotation);
+    _assertArguments(annotation.arguments, 'TestOn', annotation, positional: 1);
+    var literal = _parseString(annotation.arguments.arguments.first);
+    return _contextualize(literal,
+        () => new PlatformSelector.parse(literal.stringValue));
+  }
+
+  /// Parses a `@Timeout` annotation.
+  ///
+  /// [annotation] is the annotation. [constructorName] is the name of the named
+  /// constructor for the annotation, if any.
+  Timeout _parseTimeout(Annotation annotation, String constructorName) {
+    _assertConstructorName(constructorName, 'Timeout', annotation,
+        validNames: [null, 'factor', 'none']);
+
+    var description = 'Timeout';
+    if (constructorName != null) description += '.$constructorName'; 
+
+    if (constructorName == 'none') {
+      _assertNoArguments(annotation, description);
+      return Timeout.none;
+    }
+
+    _assertArguments(annotation.arguments, description, annotation,
+        positional: 1);
+
+    var args = annotation.arguments.arguments;
+    if (constructorName == null) return new Timeout(_parseDuration(args.first));
+    return new Timeout.factor(_parseNum(args.first));
+  }
+
+  /// Parses a `Timeout` constructor.
+  Timeout _parseTimeoutConstructor(InstanceCreationExpression constructor) {
+    var name = _parseConstructor(constructor, 'Timeout',
+        validNames: [null, 'factor']);
+
+    var description = 'Timeout';
+    if (name != null) description += '.$name';
+
+    _assertArguments(constructor.argumentList, description, constructor,
+        positional: 1);
+
+    var args = constructor.argumentList.arguments;
+    if (name == null) return new Timeout(_parseDuration(args.first));
+    return new Timeout.factor(_parseNum(args.first));
+  }
+
+  /// Parses a `@Skip` annotation.
+  ///
+  /// [annotation] is the annotation. [constructorName] is the name of the named
+  /// constructor for the annotation, if any.
+  ///
+  /// Returns either `true` or a reason string.
+  _parseSkip(Annotation annotation, String constructorName) {
+    _assertConstructorName(constructorName, 'Skip', annotation);
+    _assertArguments(annotation.arguments, 'Skip', annotation, optional: 1);
+
+    var args = annotation.arguments.arguments;
+    return args.isEmpty ? true : _parseString(args.first).stringValue;
+  }
+
+  /// Parses a `Skip` constructor.
+  ///
+  /// Returns either `true` or a reason string.
+  _parseSkipConstructor(InstanceCreationExpression constructor) {
+    _parseConstructor(constructor, 'Skip');
+    _assertArguments(constructor.argumentList, 'Skip', constructor,
+        optional: 1);
+
+    var args = constructor.argumentList.arguments;
+    return args.isEmpty ? true : _parseString(args.first).stringValue;
+  }
+
+  /// Parses an `@OnPlatform` annotation.
+  ///
+  /// [annotation] is the annotation. [constructorName] is the name of the named
+  /// constructor for the annotation, if any.
+  Map<PlatformSelector, Metadata> _parseOnPlatform(Annotation annotation,
+      String constructorName) {
+    _assertConstructorName(constructorName, 'OnPlatform', annotation);
+    _assertArguments(annotation.arguments, 'OnPlatform', annotation,
+        positional: 1);
+
+    return _parseMap(annotation.arguments.arguments.first, key: (key) {
+      var selector = _parseString(key);
+      return _contextualize(selector,
+          () => new PlatformSelector.parse(selector.stringValue));
+    }, value: (value) {
+      var expressions = [];
+      if (value is ListLiteral) {
+        expressions = _parseList(value);
+      } else if (value is InstanceCreationExpression ||
+                 value is PrefixedIdentifier) {
+        expressions = [value];
+      } else {
+        throw new SourceSpanFormatException(
+            'Expected a Timeout, Skip, or List of those.',
+            _spanFor(value));
+      }
+
+      var timeout;
+      var skip;
+      for (var expression in expressions) {
+        if (expression is InstanceCreationExpression) {
+          var className = _resolveConstructor(
+              expression.constructorName.type.name,
+              expression.constructorName.name).first;
+
+          if (className == 'Timeout') {
+            _assertSingle(timeout, 'Timeout', expression);
+            timeout = _parseTimeoutConstructor(expression);
+            continue;
+          } else if (className == 'Skip') {
+            _assertSingle(skip, 'Skip', expression);
+            skip = _parseSkipConstructor(expression);
+            continue;
+          }
+        } else if (expression is PrefixedIdentifier &&
+            expression.prefix.name == 'Timeout') {
+          if (expression.identifier.name != 'none') {
+            throw new SourceSpanFormatException(
+                'Undefined value.', _spanFor(expression));
+          }
+
+          _assertSingle(timeout, 'Timeout', expression);
+          timeout = Timeout.none;
+          continue;
+        }
+
+        throw new SourceSpanFormatException(
+            'Expected a Timeout or Skip.',
+            _spanFor(expression));
+      }
+
+      return new Metadata.parse(timeout: timeout, skip: skip);
+    });
+  }
+
+  /// Parses a `const Duration` expression.
+  Duration _parseDuration(Expression expression) {
+    _parseConstructor(expression, 'Duration');
+
+    var constructor = expression as InstanceCreationExpression;
+    var values = _assertArguments(
+        constructor.argumentList, 'Duration', constructor, named: [
+      'days', 'hours', 'minutes', 'seconds', 'milliseconds', 'microseconds'
+    ]);
+
+    for (var key in values.keys.toList()) {
+      if (values.containsKey(key)) values[key] = _parseInt(values[key]);
+    }
+
+    return new Duration(
+        days: values["days"] == null ? 0 : values["days"],
+        hours: values["hours"] == null ? 0 : values["hours"],
+        minutes: values["minutes"] == null ? 0 : values["minutes"],
+        seconds: values["seconds"] == null ? 0 : values["seconds"],
+        milliseconds: values["milliseconds"] == null ? 0 : values["milliseconds"],
+        microseconds:
+            values["microseconds"] == null ? 0 : values["microseconds"]);
+  }
+
+  /// Asserts that [existing] is null.
+  ///
+  /// [name] is the name of the annotation and [node] is its location, used for
+  /// error reporting.
+  void _assertSingle(Object existing, String name, AstNode node) {
+    if (existing == null) return;
+    throw new SourceSpanFormatException(
+        "Only a single $name may be used.", _spanFor(node));
+  }
+
+  /// Resolves a constructor name from its type [identifier] and its
+  /// [constructorName].
+  ///
+  /// Since the parsed file isn't fully resolved, this is necessary to
+  /// disambiguate between prefixed names and named constructors.
+  Pair<String, String> _resolveConstructor(Identifier identifier,
+      SimpleIdentifier constructorName) {
+    // The syntax is ambiguous between named constructors and prefixed
+    // annotations, so we need to resolve that ambiguity using the known
+    // prefixes. The analyzer parses "new x.y()" as prefix "x", annotation "y",
+    // and named constructor null. It parses "new x.y.z()" as prefix "x",
+    // annotation "y", and named constructor "z".
+    var className;
+    var namedConstructor;
+    if (identifier is PrefixedIdentifier &&
+        !_prefixes.contains(identifier.prefix.name) &&
+        constructorName == null) {
+      className = identifier.prefix.name;
+      namedConstructor = identifier.identifier.name;
+    } else {
+      className = identifier is PrefixedIdentifier
+          ? identifier.identifier.name
+          : identifier.name;
+      if (constructorName != null) namedConstructor = constructorName.name;
+    }
+    return new Pair(className, namedConstructor);
+  }
+
+  /// Asserts that [constructorName] is a valid constructor name for an AST
+  /// node.
+  ///
+  /// [nodeName] is the name of the class being constructed, and [node] is the
+  /// AST node for that class. [validNames], if passed, is the set of valid
+  /// constructor names; if an unnamed constructor is valid, it should include
+  /// `null`. By default, only an unnamed constructor is allowed.
+  void _assertConstructorName(String constructorName, String nodeName,
+      AstNode node, {Iterable<String> validNames}) {
+    if (validNames == null) validNames = [null];
+    if (validNames.contains(constructorName)) return;
+
+    if (constructorName == null) {
+      throw new SourceSpanFormatException(
+          "$nodeName doesn't have an unnamed constructor.",
+          _spanFor(node));
+    } else {
+      throw new SourceSpanFormatException(
+          '$nodeName doesn\'t have a constructor named "$constructorName".',
+          _spanFor(node));
+    }
+  }
+
+  /// Parses a constructor invocation for [className].
+  ///
+  /// [validNames], if passed, is the set of valid constructor names; if an
+  /// unnamed constructor is valid, it should include `null`. By default, only
+  /// an unnamed constructor is allowed.
+  ///
+  /// Returns the name of the named constructor, if any.
+  String _parseConstructor(Expression expression, String className,
+      {Iterable<String> validNames}) {
+    if (validNames == null) validNames = [null];
+
+    if (expression is! InstanceCreationExpression) {
+      throw new SourceSpanFormatException(
+          "Expected a $className.", _spanFor(expression));
+    }
+
+    var constructor = expression as InstanceCreationExpression;
+    var pair = _resolveConstructor(
+        constructor.constructorName.type.name,
+        constructor.constructorName.name);
+    var actualClassName = pair.first;
+    var constructorName = pair.last;
+
+    if (actualClassName != className) {
+      throw new SourceSpanFormatException(
+          "Expected a $className.", _spanFor(constructor));
+    }
+
+    if (constructor.keyword.lexeme != "const") {
+      throw new SourceSpanFormatException(
+          "$className must use a const constructor.", _spanFor(constructor));
+    }
+
+    _assertConstructorName(constructorName, className, expression,
+        validNames: validNames);
+    return constructorName;
+  }
+
+  /// Assert that [arguments] is a valid argument list.
+  ///
+  /// [name] describes the function and [node] is its AST node. [positional] is
+  /// the number of required positional arguments, [optional] the number of
+  /// optional positional arguments, and [named] the set of valid argument
+  /// names.
+  ///
+  /// The set of parsed named arguments is returned.
+  Map<String, Expression> _assertArguments(ArgumentList arguments, String name,
+      AstNode node, {int positional, int optional, Iterable<String> named}) {
+    if (positional == null) positional = 0;
+    if (optional == null) optional = 0;
+    if (named == null) named = new Set();
+
+    if (arguments == null) {
+      throw new SourceSpanFormatException(
+          '$name takes arguments.', _spanFor(node));
+    }
+
+    var actualNamed = arguments.arguments
+        .where((arg) => arg is NamedExpression).toList();
+    if (!actualNamed.isEmpty && named.isEmpty) {
+      throw new SourceSpanFormatException(
+          "$name doesn't take named arguments.", _spanFor(actualNamed.first));
+    }
+
+    var namedValues = {};
+    for (var argument in actualNamed) {
+      var argumentName = argument.name.label.name;
+      if (!named.contains(argumentName)) {
+        throw new SourceSpanFormatException(
+            '$name doesn\'t take an argument named "$argumentName".',
+            _spanFor(argument));
+      } else if (namedValues.containsKey(argumentName)) {
+        throw new SourceSpanFormatException(
+            'An argument named "$argumentName" was already passed.',
+            _spanFor(argument));
+      } else {
+        namedValues[argumentName] = argument.expression;
+      }
+    }
+
+    var actualPositional = arguments.arguments.length - actualNamed.length;
+    if (actualPositional < positional) {
+      var buffer = new StringBuffer("$name takes ");
+      if (optional != 0) buffer.write("at least ");
+      buffer.write("$positional argument");
+      if (positional > 1) buffer.write("s");
+      buffer.write(".");
+      throw new SourceSpanFormatException(
+          buffer.toString(), _spanFor(arguments));
+    }
+
+    if (actualPositional > positional + optional) {
+      if (optional + positional == 0) {
+        var buffer = new StringBuffer("$name doesn't take ");
+        if (!named.isEmpty) buffer.write("positional ");
+        buffer.write("arguments.");
+        throw new SourceSpanFormatException(
+            buffer.toString(), _spanFor(arguments));
+      }
+
+      var buffer = new StringBuffer("$name takes ");
+      if (optional != 0) buffer.write("at most ");
+      buffer.write("${positional + optional} argument");
+      if (positional > 1) buffer.write("s");
+      buffer.write(".");
+      throw new SourceSpanFormatException(
+          buffer.toString(), _spanFor(arguments));
+    }
+
+    return namedValues;
+  }
+
+  /// Assert that [annotation] (described by [name]) has no argument list.
+  void _assertNoArguments(Annotation annotation, String name) {
+    if (annotation.arguments == null) return;
+    throw new SourceSpanFormatException(
+        "$name doesn't take arguments.", _spanFor(annotation));
+  }
+
+  /// Parses a Map literal.
+  ///
+  /// By default, returns [Expression] keys and values. These can be overridden
+  /// with the [key] and [value] parameters.
+  Map _parseMap(Expression expression, {key(Expression expression),
+      value(Expression expression)}) {
+    if (key == null) key = (expression) => expression;
+    if (value == null) value = (expression) => expression;
+
+    if (expression is! MapLiteral) {
+      throw new SourceSpanFormatException(
+          "Expected a Map.", _spanFor(expression));
+    }
+
+    var map = expression as MapLiteral;
+    if (map.constKeyword == null) {
+      throw new SourceSpanFormatException(
+          "Map literals must be const.", _spanFor(map));
+    }
+
+    return new Map.fromIterable(map.entries,
+        key: (entry) => key(entry.key),
+        value: (entry) => value(entry.value));
+  }
+
+  /// Parses a List literal.
+  List<Expression> _parseList(Expression expression) {
+    if (expression is! ListLiteral) {
+      throw new SourceSpanFormatException(
+          "Expected a List.", _spanFor(expression));
+    }
+
+    var list = expression as ListLiteral;
+    if (list.constKeyword == null) {
+      throw new SourceSpanFormatException(
+          "List literals must be const.", _spanFor(list));
+    }
+
+    return list.elements;
+  }
+
+  /// Parses a constant number literal.
+  num _parseNum(Expression expression) {
+    if (expression is IntegerLiteral) return expression.value;
+    if (expression is DoubleLiteral) return expression.value;
+    throw new SourceSpanFormatException(
+        "Expected a number.", _spanFor(expression));
+  }
+
+  /// Parses a constant int literal.
+  int _parseInt(Expression expression) {
+    if (expression is IntegerLiteral) return expression.value;
+    throw new SourceSpanFormatException(
+        "Expected an integer.", _spanFor(expression));
+  }
+
+  /// Parses a constant String literal.
+  StringLiteral _parseString(Expression expression) {
+    if (expression is StringLiteral) return expression;
+    throw new SourceSpanFormatException(
+        "Expected a String.", _spanFor(expression));
+  }
+
+  /// Creates a [SourceSpan] for [node].
+  SourceSpan _spanFor(AstNode node) {
+    // Load a SourceFile from scratch here since we're only ever going to emit
+    // one error per file anyway.
+    var contents = new File(_path).readAsStringSync();
+    return new SourceFile(contents, url: p.toUri(_path))
+        .span(node.offset, node.end);
+  }
+
+  /// Runs [fn] and contextualizes any [SourceSpanFormatException]s that occur
+  /// in it relative to [literal].
+  _contextualize(StringLiteral literal, fn()) {
+    try {
+      return fn();
+    } on SourceSpanFormatException catch (error) {
+      var file = new SourceFile(new File(_path).readAsStringSync(),
+          url: p.toUri(_path));
+      var span = contextualizeSpan(error.span, literal, file);
+      if (span == null) rethrow;
+      throw new SourceSpanFormatException(error.message, span);
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/reporter.dart b/mojo/public/dart/third_party/test/lib/src/runner/reporter.dart
new file mode 100644
index 0000000..a3f7126
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/reporter.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.reporter;
+
+/// An interface for classes that watch the progress of an Engine and report it
+/// to the user.
+///
+/// A reporter should subscribe to the Engine's events as soon as it's created.
+abstract class Reporter {
+  /// Pauses the reporter's output.
+  ///
+  /// Subclasses should buffer any events from the engine while they're paused.
+  /// They should also ensure that this does nothing if the reporter is already
+  /// paused.
+  void pause();
+
+  /// Resumes the reporter's output after being [paused].
+  ///
+  /// Subclasses should ensure that this does nothing if the reporter isn't
+  /// paused.
+  void resume();
+
+  /// Cancels the reporter's output.
+  void cancel();
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/reporter/compact.dart b/mojo/public/dart/third_party/test/lib/src/runner/reporter/compact.dart
new file mode 100644
index 0000000..61fe908
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/reporter/compact.dart
@@ -0,0 +1,392 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.reporter.compact;
+
+import 'dart:async';
+import 'dart:io';
+import 'dart:isolate';
+
+import '../../backend/live_test.dart';
+import '../../backend/state.dart';
+import '../../utils.dart';
+import '../../utils.dart' as utils;
+import '../engine.dart';
+import '../load_exception.dart';
+import '../load_suite.dart';
+import '../reporter.dart';
+
+/// The maximum console line length.
+///
+/// Lines longer than this will be cropped.
+const _lineLength = 100;
+
+/// A reporter that prints test results to the console in a single
+/// continuously-updating line.
+class CompactReporter implements Reporter {
+  /// Whether the reporter should emit terminal color escapes.
+  final bool _color;
+
+  /// The terminal escape for green text, or the empty string if this is Windows
+  /// or not outputting to a terminal.
+  final String _green;
+
+  /// The terminal escape for red text, or the empty string if this is Windows
+  /// or not outputting to a terminal.
+  final String _red;
+
+  /// The terminal escape for yellow text, or the empty string if this is
+  /// Windows or not outputting to a terminal.
+  final String _yellow;
+
+  /// The terminal escape for gray text, or the empty string if this is
+  /// Windows or not outputting to a terminal.
+  final String _gray;
+
+  /// The terminal escape for bold text, or the empty string if this is
+  /// Windows or not outputting to a terminal.
+  final String _bold;
+
+  /// The terminal escape for removing test coloring, or the empty string if
+  /// this is Windows or not outputting to a terminal.
+  final String _noColor;
+
+  /// Whether to use verbose stack traces.
+  final bool _verboseTrace;
+
+  /// The engine used to run the tests.
+  final Engine _engine;
+
+  /// Whether the path to each test's suite should be printed.
+  final bool _printPath;
+
+  /// Whether the platform each test is running on should be printed.
+  final bool _printPlatform;
+
+  /// A stopwatch that tracks the duration of the full run.
+  final _stopwatch = new Stopwatch();
+
+  /// Whether we've started [_stopwatch].
+  ///
+  /// We can't just use `_stopwatch.isRunning` because the stopwatch is stopped
+  /// when the reporter is paused.
+  var _stopwatchStarted = false;
+
+  /// The size of `_engine.passed` last time a progress notification was
+  /// printed.
+  int _lastProgressPassed;
+
+  /// The size of `_engine.skipped` last time a progress notification was printed.
+  int _lastProgressSkipped;
+
+  /// The size of `_engine.failed` last time a progress notification was
+  /// printed.
+  int _lastProgressFailed;
+
+  /// The duration of the test run in seconds last time a progress notification
+  /// was printed.
+  int _lastProgressElapsed;
+
+  /// The message printed for the last progress notification.
+  String _lastProgressMessage;
+
+  /// Whether the message printed for the last progress notification was
+  /// truncated.
+  bool _lastProgressTruncated;
+
+  // Whether a newline has been printed since the last progress line.
+  var _printedNewline = true;
+
+  /// Whether the reporter is paused.
+  var _paused = false;
+
+  /// The set of all subscriptions to various streams.
+  final _subscriptions = new Set<StreamSubscription>();
+
+  /// Watches the tests run by [engine] and prints their results to the
+  /// terminal.
+  ///
+  /// If [color] is `true`, this will use terminal colors; if it's `false`, it
+  /// won't. If [verboseTrace] is `true`, this will print core library frames.
+  /// If [printPath] is `true`, this will print the path name as part of the
+  /// test description. Likewise, if [printPlatform] is `true`, this will print
+  /// the platform as part of the test description.
+  static CompactReporter watch(Engine engine, {bool color: true,
+      bool verboseTrace: false, bool printPath: true,
+      bool printPlatform: true}) {
+    return new CompactReporter._(
+        engine,
+        color: color,
+        verboseTrace: verboseTrace,
+        printPath: printPath,
+        printPlatform: printPlatform);
+  }
+
+  CompactReporter._(this._engine, {bool color: true, bool verboseTrace: false,
+          bool printPath: true, bool printPlatform: true})
+      : _verboseTrace = verboseTrace,
+        _printPath = printPath,
+        _printPlatform = printPlatform,
+        _color = color,
+        _green = color ? '\u001b[32m' : '',
+        _red = color ? '\u001b[31m' : '',
+        _yellow = color ? '\u001b[33m' : '',
+        _gray = color ? '\u001b[1;30m' : '',
+        _bold = color ? '\u001b[1m' : '',
+        _noColor = color ? '\u001b[0m' : '' {
+    _subscriptions.add(_engine.onTestStarted.listen(_onTestStarted));
+
+    /// Convert the future to a stream so that the subscription can be paused or
+    /// canceled.
+    _subscriptions.add(_engine.success.asStream().listen(_onDone));
+  }
+
+  void pause() {
+    if (_paused) return;
+    _paused = true;
+
+    if (!_printedNewline) print('');
+    _printedNewline = true;
+    _stopwatch.stop();
+
+    for (var subscription in _subscriptions) {
+      subscription.pause();
+    }
+  }
+
+  void resume() {
+    if (!_paused) return;
+    _paused = false;
+
+    if (_stopwatchStarted) _stopwatch.start();
+
+    for (var subscription in _subscriptions) {
+      subscription.resume();
+    }
+  }
+
+  void cancel() {
+    for (var subscription in _subscriptions) {
+      subscription.cancel();
+    }
+    _subscriptions.clear();
+  }
+
+  /// A callback called when the engine begins running [liveTest].
+  void _onTestStarted(LiveTest liveTest) {
+    if (!_stopwatchStarted) {
+      _stopwatchStarted = true;
+      _stopwatch.start();
+      /// Keep updating the time even when nothing else is happening.
+      _subscriptions.add(new Stream.periodic(new Duration(seconds: 1))
+          .listen((_) => _progressLine(_lastProgressMessage)));
+    }
+
+    // If this is the first test to start, print a progress line so the user
+    // knows what's running. It's possible that the active test may not be
+    // [liveTest] because the engine doesn't always surface load tests.
+    if (_engine.active.length == 1 && _engine.active.first == liveTest) {
+      _progressLine(_description(liveTest));
+    }
+
+    _subscriptions.add(liveTest.onStateChange
+        .listen((state) => _onStateChange(liveTest, state)));
+
+    _subscriptions.add(liveTest.onError.listen((error) =>
+        _onError(liveTest, error.error, error.stackTrace)));
+
+    _subscriptions.add(liveTest.onPrint.listen((line) {
+      _progressLine(_description(liveTest), truncate: false);
+      if (!_printedNewline) print('');
+      _printedNewline = true;
+
+      print(line);
+    }));
+  }
+
+  /// A callback called when [liveTest]'s state becomes [state].
+  void _onStateChange(LiveTest liveTest, State state) {
+    if (state.status != Status.complete) return;
+
+    if (liveTest.test.metadata.skip &&
+        liveTest.test.metadata.skipReason != null) {
+      _progressLine(_description(liveTest));
+      print('');
+      print(indent('${_yellow}Skip: ${liveTest.test.metadata.skipReason}'
+          '$_noColor'));
+    } else {
+      // Always display the name of the oldest active test, unless testing
+      // is finished in which case display the last test to complete.
+      if (_engine.active.isEmpty) {
+        _progressLine(_description(liveTest));
+      } else {
+        _progressLine(_description(_engine.active.first));
+      }
+    }
+  }
+
+  /// A callback called when [liveTest] throws [error].
+  void _onError(LiveTest liveTest, error, StackTrace stackTrace) {
+    if (liveTest.state.status != Status.complete) return;
+
+    _progressLine(_description(liveTest), truncate: false);
+    if (!_printedNewline) print('');
+    _printedNewline = true;
+
+    if (error is! LoadException) {
+      print(indent(error.toString()));
+      var chain = terseChain(stackTrace, verbose: _verboseTrace);
+      print(indent(chain.toString()));
+      return;
+    }
+
+    print(indent(error.toString(color: _color)));
+
+    // Only print stack traces for load errors that come from the user's code.
+    if (error.innerError is! IOException &&
+        error.innerError is! IsolateSpawnException &&
+        error.innerError is! FormatException &&
+        error.innerError is! String) {
+      print(indent(terseChain(stackTrace).toString()));
+    }
+  }
+
+  /// A callback called when the engine is finished running tests.
+  ///
+  /// [success] will be `true` if all tests passed, `false` if some tests
+  /// failed, and `null` if the engine was closed prematurely.
+  void _onDone(bool success) {
+    cancel();
+    _stopwatch.stop();
+
+    // A null success value indicates that the engine was closed before the
+    // tests finished running, probably because of a signal from the user. We
+    // shouldn't print summary information, we should just make sure the
+    // terminal cursor is on its own line.
+    if (success == null) {
+      if (!_printedNewline) print("");
+      _printedNewline = true;
+      return;
+    }
+
+    if (_engine.liveTests.isEmpty) {
+      if (!_printedNewline) stdout.write("\r");
+      var message = "No tests ran.";
+      stdout.write(message);
+
+      // Add extra padding to overwrite any load messages.
+      if (!_printedNewline) stdout.write(" " * (_lineLength - message.length));
+      stdout.writeln();
+    } else if (!success) {
+      _progressLine('Some tests failed.', color: _red);
+      print('');
+    } else if (_engine.passed.isEmpty) {
+      _progressLine("All tests skipped.");
+      print('');
+    } else {
+      _progressLine("All tests passed!");
+      print('');
+    }
+  }
+
+  /// Prints a line representing the current state of the tests.
+  ///
+  /// [message] goes after the progress report, and may be truncated to fit the
+  /// entire line within [_lineLength]. If [color] is passed, it's used as the
+  /// color for [message].
+  bool _progressLine(String message, {String color, bool truncate: true}) {
+    var elapsed = _stopwatch.elapsed.inSeconds;
+
+    // Print nothing if nothing has changed since the last progress line.
+    if (_engine.passed.length == _lastProgressPassed &&
+        _engine.skipped.length == _lastProgressSkipped &&
+        _engine.failed.length == _lastProgressFailed &&
+        message == _lastProgressMessage &&
+        // Don't re-print just because the message became re-truncated, because
+        // that doesn't add information.
+        (truncate || !_lastProgressTruncated) &&
+        // If we printed a newline, that means the last line *wasn't* a progress
+        // line. In that case, we don't want to print a new progress line just
+        // because the elapsed time changed.
+        (_printedNewline || elapsed == _lastProgressElapsed)) {
+      return false;
+    }
+
+    _lastProgressPassed = _engine.passed.length;
+    _lastProgressSkipped = _engine.skipped.length;
+    _lastProgressFailed = _engine.failed.length;
+    _lastProgressElapsed = elapsed;
+    _lastProgressMessage = message;
+    _lastProgressTruncated = truncate;
+
+    if (color == null) color = '';
+    var duration = _stopwatch.elapsed;
+    var buffer = new StringBuffer();
+
+    // \r moves back to the beginning of the current line.
+    buffer.write('\r${_timeString(duration)} ');
+    buffer.write(_green);
+    buffer.write('+');
+    buffer.write(_engine.passed.length);
+    buffer.write(_noColor);
+
+    if (_engine.skipped.isNotEmpty) {
+      buffer.write(_yellow);
+      buffer.write(' ~');
+      buffer.write(_engine.skipped.length);
+      buffer.write(_noColor);
+    }
+
+    if (_engine.failed.isNotEmpty) {
+      buffer.write(_red);
+      buffer.write(' -');
+      buffer.write(_engine.failed.length);
+      buffer.write(_noColor);
+    }
+
+    buffer.write(': ');
+    buffer.write(color);
+
+    // Ensure the line fits within [_lineLength]. [buffer] includes the color
+    // escape sequences too. Because these sequences are not visible characters,
+    // we make sure they are not counted towards the limit.
+    var length = withoutColors(buffer.toString()).length;
+    if (truncate) message = utils.truncate(message, _lineLength - length);
+    buffer.write(message);
+    buffer.write(_noColor);
+
+    // Pad the rest of the line so that it looks erased.
+    buffer.write(' ' * (_lineLength - withoutColors(buffer.toString()).length));
+    stdout.write(buffer.toString());
+
+    _printedNewline = false;
+    return true;
+  }
+
+  /// Returns a representation of [duration] as `MM:SS`.
+  String _timeString(Duration duration) {
+    return "${duration.inMinutes.toString().padLeft(2, '0')}:"
+        "${(duration.inSeconds % 60).toString().padLeft(2, '0')}";
+  }
+
+  /// Returns a description of [liveTest].
+  ///
+  /// This differs from the test's own description in that it may also include
+  /// the suite's name.
+  String _description(LiveTest liveTest) {
+    var name = liveTest.test.name;
+
+    if (_printPath && liveTest.suite.path != null) {
+      name = "${liveTest.suite.path}: $name";
+    }
+
+    if (_printPlatform && liveTest.suite.platform != null) {
+      name = "[${liveTest.suite.platform.name}] $name";
+    }
+
+    if (liveTest.suite is LoadSuite) name = "$_bold$_gray$name$_noColor";
+
+    return name;
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/reporter/expanded.dart b/mojo/public/dart/third_party/test/lib/src/runner/reporter/expanded.dart
new file mode 100644
index 0000000..2d586dc
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/reporter/expanded.dart
@@ -0,0 +1,331 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.reporter.no_io_compact;
+
+import 'dart:async';
+import 'dart:isolate';
+
+import '../../backend/live_test.dart';
+import '../../backend/state.dart';
+import '../../utils.dart';
+import '../engine.dart';
+import '../load_exception.dart';
+import '../load_suite.dart';
+import '../reporter.dart';
+
+/// The maximum console line length.
+///
+/// Lines longer than this will be cropped.
+const _lineLength = 100;
+
+/// A reporter that prints each test on its own line.
+///
+/// This is currently used in place of [CompactReporter] by `lib/test.dart`,
+/// which can't transitively import `dart:io` but still needs access to a runner
+/// so that test files can be run directly. This means that until issue 6943 is
+/// fixed, this must not import `dart:io`.
+class ExpandedReporter implements Reporter {
+  /// Whether the reporter should emit terminal color escapes.
+  final bool _color;
+
+  /// The terminal escape for green text, or the empty string if this is Windows
+  /// or not outputting to a terminal.
+  final String _green;
+
+  /// The terminal escape for red text, or the empty string if this is Windows
+  /// or not outputting to a terminal.
+  final String _red;
+
+  /// The terminal escape for yellow text, or the empty string if this is
+  /// Windows or not outputting to a terminal.
+  final String _yellow;
+
+  /// The terminal escape for gray text, or the empty string if this is
+  /// Windows or not outputting to a terminal.
+  final String _gray;
+
+  /// The terminal escape for bold text, or the empty string if this is
+  /// Windows or not outputting to a terminal.
+  final String _bold;
+
+  /// The terminal escape for removing test coloring, or the empty string if
+  /// this is Windows or not outputting to a terminal.
+  final String _noColor;
+
+  /// Whether to use verbose stack traces.
+  final bool _verboseTrace;
+
+  /// The engine used to run the tests.
+  final Engine _engine;
+
+  /// Whether the path to each test's suite should be printed.
+  final bool _printPath;
+
+  /// Whether the platform each test is running on should be printed.
+  final bool _printPlatform;
+
+  /// A stopwatch that tracks the duration of the full run.
+  final _stopwatch = new Stopwatch();
+
+  /// Whether we've started [_stopwatch].
+  ///
+  /// We can't just use `_stopwatch.isRunning` because the stopwatch is stopped
+  /// when the reporter is paused.
+  var _stopwatchStarted = false;
+
+  /// The size of `_engine.passed` last time a progress notification was
+  /// printed.
+  int _lastProgressPassed;
+
+  /// The size of `_engine.skipped` last time a progress notification was
+  /// printed.
+  int _lastProgressSkipped;
+
+  /// The size of `_engine.failed` last time a progress notification was
+  /// printed.
+  int _lastProgressFailed;
+
+  /// The message printed for the last progress notification.
+  String _lastProgressMessage;
+
+  /// Whether the reporter is paused.
+  var _paused = false;
+
+  /// The set of all subscriptions to various streams.
+  final _subscriptions = new Set<StreamSubscription>();
+
+  /// Watches the tests run by [engine] and prints their results to the
+  /// terminal.
+  ///
+  /// If [color] is `true`, this will use terminal colors; if it's `false`, it
+  /// won't. If [verboseTrace] is `true`, this will print core library frames.
+  /// If [printPath] is `true`, this will print the path name as part of the
+  /// test description. Likewise, if [printPlatform] is `true`, this will print
+  /// the platform as part of the test description.
+  static ExpandedReporter watch(Engine engine, {bool color: true,
+      bool verboseTrace: false, bool printPath: true,
+      bool printPlatform: true}) {
+    return new ExpandedReporter._(
+        engine,
+        color: color,
+        verboseTrace: verboseTrace,
+        printPath: printPath,
+        printPlatform: printPlatform);
+  }
+
+  ExpandedReporter._(this._engine, {bool color: true, bool verboseTrace: false,
+          bool printPath: true, bool printPlatform: true})
+      : _verboseTrace = verboseTrace,
+        _printPath = printPath,
+        _printPlatform = printPlatform,
+        _color = color,
+        _green = color ? '\u001b[32m' : '',
+        _red = color ? '\u001b[31m' : '',
+        _yellow = color ? '\u001b[33m' : '',
+        _gray = color ? '\u001b[1;30m' : '',
+        _bold = color ? '\u001b[1m' : '',
+        _noColor = color ? '\u001b[0m' : '' {
+    _subscriptions.add(_engine.onTestStarted.listen(_onTestStarted));
+
+    /// Convert the future to a stream so that the subscription can be paused or
+    /// canceled.
+    _subscriptions.add(_engine.success.asStream().listen(_onDone));
+  }
+
+  void pause() {
+    if (_paused) return;
+    _paused = true;
+
+    _stopwatch.stop();
+
+    for (var subscription in _subscriptions) {
+      subscription.pause();
+    }
+  }
+
+  void resume() {
+    if (!_paused) return;
+    if (_stopwatchStarted) _stopwatch.start();
+
+    for (var subscription in _subscriptions) {
+      subscription.resume();
+    }
+  }
+
+  void cancel() {
+    for (var subscription in _subscriptions) {
+      subscription.cancel();
+    }
+    _subscriptions.clear();
+  }
+
+  /// A callback called when the engine begins running [liveTest].
+  void _onTestStarted(LiveTest liveTest) {
+    if (liveTest.suite is! LoadSuite) {
+      if (!_stopwatch.isRunning) _stopwatch.start();
+
+      // If this is the first non-load test to start, print a progress line so
+      // the user knows what's running.
+      if (_engine.active.length == 1) _progressLine(_description(liveTest));
+
+      // The engine surfaces load tests when there are no other tests running,
+      // but because the expanded reporter's output is always visible, we don't
+      // emit information about them unless they fail.
+      _subscriptions.add(liveTest.onStateChange
+          .listen((state) => _onStateChange(liveTest, state)));
+    } else if (_engine.active.length == 1 &&
+        _engine.active.first == liveTest &&
+        liveTest.test.name.startsWith("compiling ")) {
+      // Print a progress line for load tests that come from compiling JS, since
+      // that takes a long time.
+      _progressLine(_description(liveTest));
+    }
+
+    _subscriptions.add(liveTest.onError.listen((error) =>
+        _onError(liveTest, error.error, error.stackTrace)));
+
+    _subscriptions.add(liveTest.onPrint.listen((line) {
+      _progressLine(_description(liveTest));
+      print(line);
+    }));
+  }
+
+  /// A callback called when [liveTest]'s state becomes [state].
+  void _onStateChange(LiveTest liveTest, State state) {
+    if (state.status != Status.complete) return;
+
+    if (liveTest.test.metadata.skip &&
+        liveTest.test.metadata.skipReason != null) {
+      print(indent('${_yellow}Skip: ${liveTest.test.metadata.skipReason}'
+          '$_noColor'));
+    } else if (_engine.active.isNotEmpty) {
+      // If any tests are running, display the name of the oldest active
+      // test.
+      _progressLine(_description(_engine.active.first));
+    }
+  }
+
+  /// A callback called when [liveTest] throws [error].
+  void _onError(LiveTest liveTest, error, StackTrace stackTrace) {
+    if (liveTest.state.status != Status.complete) return;
+
+    _progressLine(_description(liveTest));
+
+    if (error is! LoadException) {
+      print(indent(error.toString()));
+      var chain = terseChain(stackTrace, verbose: _verboseTrace);
+      print(indent(chain.toString()));
+      return;
+    }
+
+    print(indent(error.toString(color: _color)));
+
+    // Only print stack traces for load errors that come from the user's code.
+    if (error.innerError is! IsolateSpawnException &&
+        error.innerError is! FormatException &&
+        error.innerError is! String) {
+      print(indent(terseChain(stackTrace).toString()));
+    }
+  }
+
+  /// A callback called when the engine is finished running tests.
+  ///
+  /// [success] will be `true` if all tests passed, `false` if some tests
+  /// failed, and `null` if the engine was closed prematurely.
+  void _onDone(bool success) {
+    // A null success value indicates that the engine was closed before the
+    // tests finished running, probably because of a signal from the user, in
+    // which case we shouldn't print summary information.
+    if (success == null) return;
+
+    if (_engine.liveTests.isEmpty) {
+      print("No tests ran.");
+    } else if (!success) {
+      _progressLine('Some tests failed.', color: _red);
+    } else if (_engine.passed.isEmpty) {
+      _progressLine("All tests skipped.");
+    } else {
+      _progressLine("All tests passed!");
+    }
+  }
+
+  /// Prints a line representing the current state of the tests.
+  ///
+  /// [message] goes after the progress report, and may be truncated to fit the
+  /// entire line within [_lineLength]. If [color] is passed, it's used as the
+  /// color for [message].
+  void _progressLine(String message, {String color}) {
+    // Print nothing if nothing has changed since the last progress line.
+    if (_engine.passed.length == _lastProgressPassed &&
+        _engine.skipped.length == _lastProgressSkipped &&
+        _engine.failed.length == _lastProgressFailed &&
+        message == _lastProgressMessage) {
+      return;
+    }
+
+    _lastProgressPassed = _engine.passed.length;
+    _lastProgressSkipped = _engine.skipped.length;
+    _lastProgressFailed = _engine.failed.length;
+    _lastProgressMessage = message;
+
+    if (color == null) color = '';
+    var duration = _stopwatch.elapsed;
+    var buffer = new StringBuffer();
+
+    // \r moves back to the beginning of the current line.
+    buffer.write('${_timeString(duration)} ');
+    buffer.write(_green);
+    buffer.write('+');
+    buffer.write(_engine.passed.length);
+    buffer.write(_noColor);
+
+    if (_engine.skipped.isNotEmpty) {
+      buffer.write(_yellow);
+      buffer.write(' ~');
+      buffer.write(_engine.skipped.length);
+      buffer.write(_noColor);
+    }
+
+    if (_engine.failed.isNotEmpty) {
+      buffer.write(_red);
+      buffer.write(' -');
+      buffer.write(_engine.failed.length);
+      buffer.write(_noColor);
+    }
+
+    buffer.write(': ');
+    buffer.write(color);
+    buffer.write(message);
+    buffer.write(_noColor);
+
+    print(buffer.toString());
+  }
+
+  /// Returns a representation of [duration] as `MM:SS`.
+  String _timeString(Duration duration) {
+    return "${duration.inMinutes.toString().padLeft(2, '0')}:"
+        "${(duration.inSeconds % 60).toString().padLeft(2, '0')}";
+  }
+
+  /// Returns a description of [liveTest].
+  ///
+  /// This differs from the test's own description in that it may also include
+  /// the suite's name.
+  String _description(LiveTest liveTest) {
+    var name = liveTest.test.name;
+
+    if (_printPath && liveTest.suite.path != null) {
+      name = "${liveTest.suite.path}: $name";
+    }
+
+    if (_printPlatform && liveTest.suite.platform != null) {
+      name = "[${liveTest.suite.platform.name}] $name";
+    }
+
+    if (liveTest.suite is LoadSuite) name = "$_bold$_gray$name$_noColor";
+
+    return name;
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/runner_suite.dart b/mojo/public/dart/third_party/test/lib/src/runner/runner_suite.dart
new file mode 100644
index 0000000..2407f69
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/runner_suite.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.runner_suite;
+
+import 'dart:async';
+
+import 'package:async/async.dart';
+
+import '../backend/metadata.dart';
+import '../backend/operating_system.dart';
+import '../backend/suite.dart';
+import '../backend/test.dart';
+import '../backend/test_platform.dart';
+import '../utils.dart';
+import 'environment.dart';
+
+/// A suite produced and consumed by the test runner that has runner-specific
+/// logic and lifecycle management.
+///
+/// This is separated from [Suite] because the backend library (which will
+/// eventually become its own package) is primarily for test code itself to use,
+/// for which the [RunnerSuite] APIs don't make sense.
+class RunnerSuite extends Suite {
+  final Environment environment;
+
+  /// The memoizer for running [close] exactly once.
+  final _closeMemo = new AsyncMemoizer();
+
+  /// The function to call when the suite is closed.
+  final AsyncFunction _onClose;
+
+  RunnerSuite(this.environment, Iterable<Test> tests, {String path,
+          TestPlatform platform, OperatingSystem os, Metadata metadata,
+          AsyncFunction onClose})
+      : super(tests,
+          path: path, platform: platform, os: os, metadata: metadata),
+        _onClose = onClose;
+
+  RunnerSuite change({String path, Metadata metadata, Iterable<Test> tests}) {
+    if (path == null) path = this.path;
+    if (metadata == null) metadata = this.metadata;
+    if (tests == null) tests = this.tests;
+    return new RunnerSuite(environment, tests, platform: platform, os: os,
+        path: path, metadata: metadata, onClose: close);
+  }
+
+  /// Closes the suite and releases any resources associated with it.
+  Future close() {
+    return _closeMemo.runOnce(() async {
+      if (_onClose != null) await _onClose();
+    });
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/vm/environment.dart b/mojo/public/dart/third_party/test/lib/src/runner/vm/environment.dart
new file mode 100644
index 0000000..b7480ea
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/vm/environment.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.vm.environment;
+
+import '../environment.dart';
+import '../../util/cancelable_future.dart';
+
+/// The environment for test suites loaded in an isolate in this Dart VM.
+class VMEnvironment implements Environment {
+  const VMEnvironment();
+
+  Uri get observatoryUrl => throw new UnsupportedError(
+      "VMEnvironment.observatoryUrl is not currently supported.");
+
+  Uri get remoteDebuggerUrl => throw new UnsupportedError(
+      "VMEnvironment.observatoryUrl is not supported.");
+
+  CancelableFuture displayPause() =>
+      throw new UnsupportedError(
+          "The VM doesn't yet support Environment.displayPause.");
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/vm/isolate_listener.dart b/mojo/public/dart/third_party/test/lib/src/runner/vm/isolate_listener.dart
new file mode 100644
index 0000000..06e2d6a
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/vm/isolate_listener.dart
@@ -0,0 +1,162 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.vm.isolate_listener;
+
+import 'dart:isolate';
+import 'dart:async';
+
+import 'package:stack_trace/stack_trace.dart';
+
+import '../../backend/declarer.dart';
+import '../../backend/metadata.dart';
+import '../../backend/suite.dart';
+import '../../backend/test.dart';
+import '../../backend/test_platform.dart';
+import '../../util/io.dart';
+import '../../util/remote_exception.dart';
+import '../../utils.dart';
+
+/// A class that runs tests in a separate isolate and communicates the results
+/// back to the main isolate.
+class IsolateListener {
+  /// The test suite to run.
+  final Suite _suite;
+
+  /// Extracts metadata about all the tests in the function returned by
+  /// [getMain] and sends information about them over [sendPort].
+  ///
+  /// The main function is wrapped in a closure so that we can handle it being
+  /// undefined here rather than in the generated code.
+  ///
+  /// Once that's done, this starts listening for commands about which tests to
+  /// run.
+  ///
+  /// [metadata] is the suite-level metadata defined at the top of the file.
+  static Future start(SendPort sendPort, Metadata metadata, Function getMain())
+      async {
+    // Capture any top-level errors (mostly lazy syntax errors, since other are
+    // caught below) and report them to the parent isolate. We set errors
+    // non-fatal because otherwise they'll be double-printed.
+    var errorPort = new ReceivePort();
+    Isolate.current.setErrorsFatal(false);
+    Isolate.current.addErrorListener(errorPort.sendPort);
+    errorPort.listen((message) {
+      // Masquerade as an IsoalteSpawnException because that's what this would
+      // be if the error had been detected statically.
+      var error = new IsolateSpawnException(message[0]);
+      var stackTrace =
+          message[1] == null ? new Trace([]) : new Trace.parse(message[1]);
+      sendPort.send({
+        "type": "error",
+        "error": RemoteException.serialize(error, stackTrace)
+      });
+    });
+
+    var main;
+    try {
+      main = getMain();
+    } on NoSuchMethodError catch (_) {
+      _sendLoadException(sendPort, "No top-level main() function defined.");
+      return;
+    }
+
+    if (main is! Function) {
+      _sendLoadException(sendPort, "Top-level main getter is not a function.");
+      return;
+    } else if (main is! AsyncFunction) {
+      _sendLoadException(
+          sendPort, "Top-level main() function takes arguments.");
+      return;
+    }
+
+    var declarer = new Declarer();
+    try {
+      await runZoned(() => new Future.sync(main), zoneValues: {
+        #test.declarer: declarer
+      }, zoneSpecification: new ZoneSpecification(print: (_, __, ___, line) {
+        sendPort.send({"type": "print", "line": line});
+      }));
+    } catch (error, stackTrace) {
+      sendPort.send({
+        "type": "error",
+        "error": RemoteException.serialize(error, stackTrace)
+      });
+      return;
+    }
+
+    var suite = new Suite(declarer.tests,
+        platform: TestPlatform.vm, os: currentOS, metadata: metadata);
+    new IsolateListener._(suite)._listen(sendPort);
+  }
+
+  /// Sends a message over [sendPort] indicating that the tests failed to load.
+  ///
+  /// [message] should describe the failure.
+  static void _sendLoadException(SendPort sendPort, String message) {
+    sendPort.send({"type": "loadException", "message": message});
+  }
+
+  IsolateListener._(this._suite);
+
+  /// Send information about [_suite] across [sendPort] and start listening for
+  /// commands to run the tests.
+  void _listen(SendPort sendPort) {
+    var tests = [];
+    for (var i = 0; i < _suite.tests.length; i++) {
+      var test = _suite.tests[i];
+      var receivePort = new ReceivePort();
+      tests.add({
+        "name": test.name,
+        "metadata": test.metadata.serialize(),
+        "sendPort": receivePort.sendPort
+      });
+
+      receivePort.listen((message) {
+        assert(message['command'] == 'run');
+        _runTest(test, message['reply']);
+      });
+    }
+
+    sendPort.send({
+      "type": "success",
+      "tests": tests
+    });
+  }
+
+  /// Runs [test] and sends the results across [sendPort].
+  void _runTest(Test test, SendPort sendPort) {
+    var liveTest = test.load(_suite);
+
+    var receivePort = new ReceivePort();
+    sendPort.send({"type": "started", "reply": receivePort.sendPort});
+
+    receivePort.listen((message) {
+      assert(message['command'] == 'close');
+      receivePort.close();
+      liveTest.close();
+    });
+
+    liveTest.onStateChange.listen((state) {
+      sendPort.send({
+        "type": "state-change",
+        "status": state.status.name,
+        "result": state.result.name
+      });
+    });
+
+    liveTest.onError.listen((asyncError) {
+      sendPort.send({
+        "type": "error",
+        "error": RemoteException.serialize(
+            asyncError.error, asyncError.stackTrace)
+      });
+    });
+
+    liveTest.onPrint.listen((line) =>
+        sendPort.send({"type": "print", "line": line}));
+
+    liveTest.run().then((_) => sendPort.send({"type": "complete"}));
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/vm/isolate_test.dart b/mojo/public/dart/third_party/test/lib/src/runner/vm/isolate_test.dart
new file mode 100644
index 0000000..ecdf7eb
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/runner/vm/isolate_test.dart
@@ -0,0 +1,94 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.runner.vm.isolate_test;
+
+import 'dart:async';
+import 'dart:isolate';
+
+import '../../backend/live_test.dart';
+import '../../backend/live_test_controller.dart';
+import '../../backend/metadata.dart';
+import '../../backend/state.dart';
+import '../../backend/suite.dart';
+import '../../backend/test.dart';
+import '../../util/remote_exception.dart';
+import '../../utils.dart';
+
+/// A test in another isolate.
+class IsolateTest implements Test {
+  final String name;
+  final Metadata metadata;
+
+  /// The port on which to communicate with the remote test.
+  final SendPort _sendPort;
+
+  IsolateTest(this.name, this.metadata, this._sendPort);
+
+  /// Loads a single runnable instance of this test.
+  LiveTest load(Suite suite) {
+    var controller;
+
+    // We get a new send port for communicating with the live test, since
+    // [_sendPort] is only for communicating with the non-live test. This will
+    // be non-null once the test starts running.
+    var sendPortCompleter;
+
+    var receivePort;
+    controller = new LiveTestController(suite, this, () {
+      controller.setState(const State(Status.running, Result.success));
+
+      sendPortCompleter = new Completer();
+      receivePort = new ReceivePort();
+      _sendPort.send({
+        'command': 'run',
+        'reply': receivePort.sendPort
+      });
+
+      receivePort.listen((message) {
+        if (message['type'] == 'started') {
+          sendPortCompleter.complete(message['reply']);
+        } else if (message['type'] == 'error') {
+          var asyncError = RemoteException.deserialize(message['error']);
+          controller.addError(asyncError.error, asyncError.stackTrace);
+        } else if (message['type'] == 'state-change') {
+          controller.setState(
+              new State(
+                  new Status.parse(message['status']),
+                  new Result.parse(message['result'])));
+        } else if (message['type'] == 'print') {
+          controller.print(message['line']);
+        } else {
+          assert(message['type'] == 'complete');
+          controller.completer.complete();
+        }
+      });
+    }, () {
+      // If the test has finished running, just disconnect the receive port. The
+      // Dart process won't terminate if there are any live receive ports open.
+      if (controller.completer.isCompleted) {
+        receivePort.close();
+        return;
+      }
+
+      invoke(() async {
+        // If the test is still running, send it a message telling it to shut
+        // down ASAP. This causes the [Invoker] to eagerly throw exceptions
+        // whenever the test touches it.
+        var sendPort = await sendPortCompleter.future;
+        sendPort.send({'command': 'close'});
+        await controller.completer.future;
+        receivePort.close();
+      });
+    });
+    return controller.liveTest;
+  }
+
+  Test change({String name, Metadata metadata}) {
+    if (name == name && metadata == this.metadata) return this;
+    if (name == null) name = this.name;
+    if (metadata == null) metadata = this.metadata;
+    return new IsolateTest(name, metadata, _sendPort);
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/util/cancelable_future.dart b/mojo/public/dart/third_party/test/lib/src/util/cancelable_future.dart
new file mode 100644
index 0000000..e9f858d
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/util/cancelable_future.dart
@@ -0,0 +1,217 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// TODO(nweiz): Use this from the async package when
+// https://codereview.chromium.org/1266603005/ lands.
+library test.util.cancelable_future;
+
+import 'dart:async';
+
+import 'package:async/async.dart';
+
+/// A [Future] that can be cancelled.
+///
+/// When this is cancelled, that means it won't complete either successfully or
+/// with an error.
+///
+/// In general it's a good idea to only have a single non-branching chain of
+/// cancellable futures. If there are multiple branches, any of them that aren't
+/// closed explicitly will throw a [CancelException] once one of them is
+/// cancelled.
+class CancelableFuture<T> implements Future<T> {
+  /// The completer that produced this future.
+  ///
+  /// This is canceled when [cancel] is called.
+  final CancelableCompleter<T> _completer;
+
+  /// The future wrapped by [this].
+  Future<T> _inner;
+
+  /// Whether this future has been canceled.
+  ///
+  /// This is tracked individually for each future because a canceled future
+  /// shouldn't emit events, but the completer will throw a [CancelException].
+  bool _canceled = false;
+
+  CancelableFuture._(this._completer, Future<T> inner) {
+    // Once this future is canceled, it should never complete.
+    _inner = inner.whenComplete(() {
+      if (_canceled) return new Completer().future;
+    });
+  }
+
+  /// Creates a [CancelableFuture] wrapping [inner].
+  ///
+  /// When this future is canceled, [onCancel] will be called. The callback may
+  /// return a Future to indicate that asynchronous work has to be done to
+  /// cancel the future; this Future will be returned by [cancel].
+  factory CancelableFuture.fromFuture(Future<T> inner, [onCancel()]) {
+    var completer = new CancelableCompleter<T>(onCancel);
+    completer.complete(inner);
+    return completer.future;
+  }
+
+  /// Creates a [Stream] containing the result of this future.
+  ///
+  /// If this Future is canceled, the Stream will not produce any events. If a
+  /// subscription to the stream is canceled, this is as well.
+  Stream<T> asStream() {
+    var controller = new StreamController<T>(
+        sync: true, onCancel: _completer._cancel);
+
+    _inner.then((value) {
+      controller.add(value);
+      controller.close();
+    }, onError: (error, stackTrace) {
+      controller.addError(error, stackTrace);
+      controller.close();
+    });
+    return controller.stream;
+  }
+
+  /// Returns [this] as a normal future.
+  ///
+  /// The returned future is different from this one in the following ways:
+  ///
+  /// * Its methods don't return [CancelableFuture]s.
+  ///
+  /// * It doesn't support [cancel] or [asFuture].
+  ///
+  /// * The [Stream] returned by [asStream] won't cancel the future if it's
+  ///   canceled.
+  ///
+  /// * If a [timeout] times out, it won't cancel the future.
+  Future asFuture() => _inner;
+
+  CancelableFuture catchError(Function onError, {bool test(error)}) =>
+      new CancelableFuture._(
+          _completer, _inner.catchError(onError, test: test));
+
+  CancelableFuture then(onValue(T value), {Function onError}) =>
+      new CancelableFuture._(
+          _completer, _inner.then(onValue, onError: onError));
+
+  CancelableFuture<T> whenComplete(action()) =>
+      new CancelableFuture<T>._(_completer, _inner.whenComplete(action));
+
+  /// Time-out the future computation after [timeLimit] has passed.
+  ///
+  /// When the future times out, it will be canceled. Note that the return value
+  /// of the completer's `onCancel` callback will be ignored by default, and any
+  /// errors it produces silently dropped. To avoid this, call [cancel]
+  /// explicitly in [onTimeout].
+  CancelableFuture timeout(Duration timeLimit, {onTimeout()}) {
+    var wrappedOnTimeout = () {
+      // Ignore errors here because there's no good way to pipe them to the
+      // caller without screwing up [onTimeout].
+      _completer._cancel().catchError((_) {});
+      if (onTimeout != null) return onTimeout();
+      throw new TimeoutException("Future not completed", timeLimit);
+    };
+
+    return new CancelableFuture._(
+        _completer, _inner.timeout(timeLimit, onTimeout: wrappedOnTimeout));
+  }
+
+  /// Cancels this future.
+  ///
+  /// This returns the [Future] returned by the [CancelableCompleter]'s
+  /// `onCancel` callback. Unlike [Stream.cancel], it never returns `null`.
+  Future cancel() {
+    _canceled = true;
+    return _completer._cancel();
+  }
+}
+
+/// A completer for a [CancelableFuture].
+class CancelableCompleter<T> implements Completer<T> {
+  /// The completer for the wrapped future.
+  final Completer<T> _inner;
+
+  /// The callback to call if the future is canceled.
+  final ZoneCallback _onCancel;
+
+  CancelableFuture<T> get future => _future;
+  CancelableFuture<T> _future;
+
+  bool get isCompleted => _isCompleted;
+  bool _isCompleted = false;
+
+  /// Whether the completer was canceled before being completed.
+  bool get isCanceled => _isCanceled;
+  bool _isCanceled = false;
+
+  /// Whether the completer has fired.
+  ///
+  /// This is distinct from [isCompleted] when a [Future] is passed to
+  /// [complete]; this won't be `true` until that [Future] fires.
+  bool _fired = false;
+
+  /// Creates a new completer for a [CancelableFuture].
+  ///
+  /// When the future is canceled, as long as the completer hasn't yet
+  /// completed, [onCancel] is called. The callback may return a [Future]; if
+  /// so, that [Future] is returned by [CancelableFuture.cancel].
+  CancelableCompleter([this._onCancel])
+      : _inner = new Completer<T>() {
+    _future = new CancelableFuture<T>._(this, _inner.future);
+  }
+
+  void complete([value]) {
+    if (_isCompleted) throw new StateError("Future already completed");
+    _isCompleted = true;
+
+    if (_isCanceled) return;
+    if (value is! Future) {
+      _fired = true;
+      _inner.complete(value);
+      return;
+    }
+
+    value.then((result) {
+      if (_isCanceled) return;
+      _fired = true;
+      _inner.complete(result);
+    }, onError: (error, stackTrace) {
+      if (_isCanceled) return;
+      _fired = true;
+      _inner.completeError(error, stackTrace);
+    });
+  }
+
+  void completeError(Object error, [StackTrace stackTrace]) {
+    if (_isCompleted) throw new StateError("Future already completed");
+    _isCompleted = true;
+
+    if (_isCanceled) return;
+    _fired = true;
+    _inner.completeError(error, stackTrace);
+  }
+
+  /// Cancel the completer.
+  Future _cancel() => _cancelMemo.runOnce(() {
+    if (_fired) return null;
+    _isCanceled = true;
+
+    // Throw an catch to get access to the current stack trace.
+    try {
+      throw new CancelException();
+    } catch (error, stackTrace) {
+      _inner.completeError(error, stackTrace);
+    }
+
+    if (_onCancel != null) return _onCancel();
+  });
+  final _cancelMemo = new AsyncMemoizer();
+}
+
+/// An exception thrown when a [CancelableFuture] is canceled.
+///
+/// Since a canceled [CancelableFuture] doesn't receive any more events, this
+/// will only be passed to other branches of the future chain.
+class CancelException implements Exception {
+  CancelException();
+
+  String toString() => "This Future has been canceled.";
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/util/dart.dart b/mojo/public/dart/third_party/test/lib/src/util/dart.dart
new file mode 100644
index 0000000..560241c
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/util/dart.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.util.dart;
+
+import 'dart:async';
+import 'dart:isolate';
+
+import 'package:analyzer/analyzer.dart';
+import 'package:source_span/source_span.dart';
+
+import 'string_literal_iterator.dart';
+
+/// Runs [code] in an isolate.
+///
+/// [code] should be the contents of a Dart entrypoint. It may contain imports;
+/// they will be resolved in the same context as the host isolate. [message] is
+/// passed to the [main] method of the code being run; the caller is responsible
+/// for using this to establish communication with the isolate.
+///
+/// [packageRoot] controls the package root of the isolate. It may be either a
+/// [String] or a [Uri].
+Future<Isolate> runInIsolate(String code, message, {packageRoot,
+    bool checked}) async {
+  if (packageRoot is String) packageRoot = Uri.parse(packageRoot);
+
+  return await Isolate.spawnUri(
+      Uri.parse('data:application/dart;charset=utf-8,' + Uri.encodeFull(code)),
+      [],
+      message,
+      packageRoot: packageRoot,
+      checked: checked);
+}
+
+// TODO(nweiz): Move this into the analyzer once it starts using SourceSpan
+// (issue 22977).
+/// Takes a span whose source is the value of a string that has been parsed from
+/// a Dart file and returns the corresponding span from within that Dart file.
+///
+/// For example, suppose a Dart file contains `@Eval("1 + a")`. The
+/// [StringLiteral] `"1 + a"` is extracted; this is [context]. Its contents are
+/// then parsed, producing an error pointing to [span]:
+///
+///     line 1, column 5:
+///     1 + a
+///         ^
+///
+/// This span isn't very useful, since it only shows the location within the
+/// [StringLiteral]'s value. So it's passed to [contextualizeSpan] along with
+/// [context] and [file] (which contains the source of the entire Dart file),
+/// which then returns:
+///
+///     line 4, column 12 of file.dart:
+///     @Eval("1 + a")
+///                ^
+///
+/// This properly handles multiline literals, adjacent literals, and literals
+/// containing escape sequences. It does not support interpolated literals.
+///
+/// This will return `null` if [context] contains an invalid string or does not
+/// contain [span].
+SourceSpan contextualizeSpan(SourceSpan span, StringLiteral context,
+    SourceFile file) {
+  var contextRunes = new StringLiteralIterator(context)..moveNext();
+
+  for (var i = 0; i < span.start.offset; i++) {
+    if (!contextRunes.moveNext()) return null;
+  }
+
+  var start = contextRunes.offset;
+  for (var spanRune in span.text.runes) {
+    if (spanRune != contextRunes.current) return null;
+    contextRunes.moveNext();
+  }
+
+  return file.span(start, contextRunes.offset);
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/util/exit_codes.dart b/mojo/public/dart/third_party/test/lib/src/util/exit_codes.dart
new file mode 100644
index 0000000..30ed3f9
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/util/exit_codes.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Exit code constants.
+///
+/// From [the BSD sysexits manpage][manpage]. Not every constant here is used.
+///
+/// [manpage]: http://www.freebsd.org/cgi/man.cgi?query=sysexits
+library test.util.exit_codes;
+
+/// The command completely successfully.
+const success = 0;
+
+/// The command was used incorrectly.
+const usage = 64;
+
+/// The input data was incorrect.
+const data = 65;
+
+/// An input file did not exist or was unreadable.
+const noInput = 66;
+
+/// The user specified did not exist.
+const noUser = 67;
+
+/// The host specified did not exist.
+const noHost = 68;
+
+/// A service is unavailable.
+const unavailable = 69;
+
+/// An internal software error has been detected.
+const software = 70;
+
+/// An operating system error has been detected.
+const os = 71;
+
+/// Some system file did not exist or was unreadable.
+const osFile = 72;
+
+/// A user-specified output file cannot be created.
+const cantCreate = 73;
+
+/// An error occurred while doing I/O on some file.
+const io = 74;
+
+/// Temporary failure, indicating something that is not really an error.
+const tempFail = 75;
+
+/// The remote system returned something invalid during a protocol exchange.
+const protocol = 76;
+
+/// The user did not have sufficient permissions.
+const noPerm = 77;
+
+/// Something was unconfigured or mis-configured.
+const config = 78;
diff --git a/mojo/public/dart/third_party/test/lib/src/util/forkable_stream.dart b/mojo/public/dart/third_party/test/lib/src/util/forkable_stream.dart
new file mode 100644
index 0000000..033d498
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/util/forkable_stream.dart
@@ -0,0 +1,168 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// TODO(nweiz): Get rid of this when https://codereview.chromium.org/1241723003/
+// lands.
+library test.util.forkable_stream;
+
+import 'dart:async';
+
+import 'package:async/async.dart' hide ForkableStream;
+
+/// A single-subscription stream from which other streams may be forked off at
+/// the current position.
+///
+/// This adds an operation, [fork], which produces a new stream that
+/// independently emits the same events as this stream. Unlike the branches
+/// produced by [StreamSplitter], a fork only emits events that arrive *after*
+/// the call to [fork].
+///
+/// Each fork can be paused or canceled independently of one another and of this
+/// stream. The underlying stream will be listened to once any branch is
+/// listened to. It will be paused when all branches are paused or not yet
+/// listened to. It will be canceled when all branches have been listened to and
+/// then canceled.
+class ForkableStream<T> extends StreamView<T> {
+  /// The underlying stream.
+  final Stream _sourceStream;
+
+  /// The subscription to [_sourceStream].
+  ///
+  /// This will be `null` until this stream or any of its forks are listened to.
+  StreamSubscription _subscription;
+
+  /// Whether this has been cancelled and no more forks may be created.
+  bool _isCanceled = false;
+
+  /// The controllers for any branches that have not yet been canceled.
+  ///
+  /// This includes a controller for this stream, until that has been cancelled.
+  final _controllers = new Set<StreamController<T>>();
+
+  /// Creates a new forkable stream wrapping [sourceStream].
+  ForkableStream(Stream sourceStream)
+      // Use a completer here so that we can provide its stream to the
+      // superclass constructor while also adding the stream controller to
+      // [_controllers].
+      : this._(sourceStream, new StreamCompleter());
+
+  ForkableStream._(this._sourceStream, StreamCompleter completer)
+      : super(completer.stream) {
+    completer.setSourceStream(_fork(primary: true));
+  }
+
+  /// Creates a new fork of this stream.
+  ///
+  /// From this point forward, the fork will emit the same events as this
+  /// stream. It will *not* emit any events that have already been emitted by
+  /// this stream. The fork is independent of this stream, which means each one
+  /// may be paused or canceled without affecting the other.
+  ///
+  /// If this stream is done or its subscription has been canceled, this returns
+  /// an empty stream.
+  Stream<T> fork() => _fork(primary: false);
+
+  /// Creates a stream forwarding [_sourceStream].
+  ///
+  /// If [primary] is true, this is the stream underlying this object;
+  /// otherwise, it's a fork. The only difference is that when the primary
+  /// stream is canceled, [fork] starts throwing [StateError]s.
+  Stream<T> _fork({bool primary: false}) {
+    if (_isCanceled) {
+      var controller = new StreamController<T>()..close();
+      return controller.stream;
+    }
+
+    var controller;
+    controller = new StreamController<T>(
+        onListen: () => _onListenOrResume(controller),
+        onCancel: () => _onCancel(controller, primary: primary),
+        onPause: () => _onPause(controller),
+        onResume: () => _onListenOrResume(controller),
+        sync: true);
+
+    _controllers.add(controller);
+
+    return controller.stream;
+  }
+
+  /// The callback called when `onListen` or `onResume` is called for the branch
+  /// managed by [controller].
+  ///
+  /// This ensures that we're subscribed to [_sourceStream] and that the
+  /// subscription isn't paused.
+  void _onListenOrResume(StreamController<T> controller) {
+    if (controller.isClosed) return;
+    if (_subscription == null) {
+      _subscription =
+          _sourceStream.listen(_onData, onError: _onError, onDone: _onDone);
+    } else {
+      _subscription.resume();
+    }
+  }
+
+  /// The callback called when `onCancel` is called for the branch managed by
+  /// [controller].
+  ///
+  /// This cancels or pauses the underlying subscription as necessary. If
+  /// [primary] is true, it also ensures that future calls to [fork] throw
+  /// [StateError]s.
+  Future _onCancel(StreamController<T> controller, {bool primary: false}) {
+    if (primary) _isCanceled = true;
+
+    if (controller.isClosed) return null;
+    _controllers.remove(controller);
+
+    if (_controllers.isEmpty) return _subscription.cancel();
+
+    _onPause(controller);
+    return null;
+  }
+
+  /// The callback called when `onPause` is called for the branch managed by
+  /// [controller].
+  ///
+  /// This pauses the underlying subscription if necessary.
+  void _onPause(StreamController<T> controller) {
+    if (controller.isClosed) return;
+    if (_subscription.isPaused) return;
+    if (_controllers.any((controller) =>
+        controller.hasListener && !controller.isPaused)) {
+      return;
+    }
+
+    _subscription.pause();
+  }
+
+  /// Forwards data events to all branches.
+  void _onData(value) {
+    // Don't iterate directly over the set because [controller.add] might cause
+    // it to be modified synchronously.
+    for (var controller in _controllers.toList()) {
+      controller.add(value);
+    }
+  }
+
+  /// Forwards error events to all branches.
+  void _onError(error, StackTrace stackTrace) {
+    // Don't iterate directly over the set because [controller.addError] might
+    // cause it to be modified synchronously.
+    for (var controller in _controllers.toList()) {
+      controller.addError(error, stackTrace);
+    }
+  }
+
+  /// Forwards close events to all branches.
+  void _onDone() {
+    _isCanceled = true;
+
+    // Don't iterate directly over the set because [controller.close] might
+    // cause it to be modified synchronously.
+    for (var controller in _controllers.toList()) {
+      controller.close();
+    }
+    _controllers.clear();
+  }
+}
+
diff --git a/mojo/public/dart/third_party/test/lib/src/util/io.dart b/mojo/public/dart/third_party/test/lib/src/util/io.dart
new file mode 100644
index 0000000..ceb8da6
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/util/io.dart
@@ -0,0 +1,201 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.util.io;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+import 'dart:mirrors';
+
+import 'package:path/path.dart' as p;
+import 'package:pub_semver/pub_semver.dart';
+
+import '../backend/operating_system.dart';
+import '../runner/application_exception.dart';
+import '../util/stream_queue.dart';
+import '../utils.dart';
+
+/// The ASCII code for a newline character.
+const _newline = 0xA;
+
+/// The ASCII code for a carriage return character.
+const _carriageReturn = 0xD;
+
+/// The root directory of the Dart SDK.
+final String sdkDir = p.dirname(p.dirname(Platform.resolvedExecutable));
+
+/// The version of the Dart SDK currently in use.
+final Version _sdkVersion = new Version.parse(
+    new File(p.join(sdkDir, 'version'))
+        .readAsStringSync().trim());
+
+/// Returns the current operating system.
+final OperatingSystem currentOS = (() {
+  var name = Platform.operatingSystem;
+  var os = OperatingSystem.findByIoName(name);
+  if (os != null) return os;
+
+  throw new UnsupportedError('Unsupported operating system "$name".');
+})();
+
+/// A queue of lines of standard input.
+final stdinLines = new StreamQueue(
+    UTF8.decoder.fuse(const LineSplitter()).bind(stdin));
+
+/// The root directory below which to nest temporary directories created by the
+/// test runner.
+///
+/// This is configurable so that the test code can validate that the runner
+/// cleans up after itself fully.
+final _tempDir = Platform.environment.containsKey("_UNITTEST_TEMP_DIR")
+    ? Platform.environment["_UNITTEST_TEMP_DIR"]
+    : Directory.systemTemp.path;
+
+/// The path to the `lib` directory of the `test` package.
+String libDir({String packageRoot}) {
+  var pathToIo = libraryPath(#test.util.io, packageRoot: packageRoot);
+  return p.dirname(p.dirname(p.dirname(pathToIo)));
+}
+
+// TODO(nweiz): Make this check [stdioType] once that works within "pub run".
+/// Whether "special" strings such as Unicode characters or color escapes are
+/// safe to use.
+///
+/// On Windows or when not printing to a terminal, only printable ASCII
+/// characters should be used.
+bool get canUseSpecialChars =>
+    Platform.operatingSystem != 'windows' &&
+    Platform.environment["_UNITTEST_USE_COLOR"] != "false";
+
+/// Creates a temporary directory and returns its path.
+String createTempDir() =>
+    new Directory(_tempDir).createTempSync('dart_test_').path;
+
+/// Creates a temporary directory and passes its path to [fn].
+///
+/// Once the [Future] returned by [fn] completes, the temporary directory and
+/// all its contents are deleted. [fn] can also return `null`, in which case
+/// the temporary directory is deleted immediately afterwards.
+///
+/// Returns a future that completes to the value that the future returned from
+/// [fn] completes to.
+Future withTempDir(Future fn(String path)) {
+  return new Future.sync(() {
+    var tempDir = createTempDir();
+    return new Future.sync(() => fn(tempDir))
+        .whenComplete(() => new Directory(tempDir).deleteSync(recursive: true));
+  });
+}
+
+/// Return a transformation of [input] with all null bytes removed.
+///
+/// This works around the combination of issue 23295 and 22667 by removing null
+/// bytes. This workaround can be removed when either of those are fixed in the
+/// oldest supported SDK.
+///
+/// It also somewhat works around issue 23303 by removing any carriage returns
+/// that are followed by newlines, to ensure that carriage returns aren't
+/// doubled up in the output. This can be removed when the issue is fixed in the
+/// oldest supported SDk.
+Stream<List<int>> sanitizeForWindows(Stream<List<int>> input) {
+  if (!Platform.isWindows) return input;
+
+  return input.map((list) {
+    var previous;
+    return list.reversed.where((byte) {
+      if (byte == 0) return false;
+      if (byte == _carriageReturn && previous == _newline) return false;
+      previous = byte;
+      return true;
+    }).toList().reversed.toList();
+  });
+}
+
+/// Print a warning containing [message].
+///
+/// This automatically wraps lines if they get too long. If [color] is passed,
+/// it controls whether the warning header is color; otherwise, it defaults to
+/// [canUseSpecialChars].
+void warn(String message, {bool color}) {
+  if (color == null) color = canUseSpecialChars;
+  var header = color
+      ? "\u001b[33mWarning:\u001b[0m"
+      : "Warning:";
+  stderr.writeln(wordWrap("$header $message\n"));
+}
+
+/// Creates a URL string for [address]:[port].
+///
+/// Handles properly formatting IPv6 addresses.
+Uri baseUrlForAddress(InternetAddress address, int port) {
+  if (address.isLoopback) {
+    return new Uri(scheme: "http", host: "localhost", port: port);
+  }
+
+  // IPv6 addresses in URLs need to be enclosed in square brackets to avoid
+  // URL ambiguity with the ":" in the address.
+  if (address.type == InternetAddressType.IP_V6) {
+    return new Uri(scheme: "http", host: "[${address.address}]", port: port);
+  }
+
+  return new Uri(scheme: "http", host: address.address, port: port);
+}
+
+/// Returns the package root at [root].
+///
+/// If [override] is passed, that's used. If the package root doesn't exist, an
+/// [ApplicationException] is thrown.
+String packageRootFor(String root, [String override]) {
+  if (root == null) root = p.current;
+  var packageRoot = override == null ? p.join(root, 'packages') : override;
+
+  if (!new Directory(packageRoot).existsSync()) {
+    throw new ApplicationException(
+        "Directory ${p.prettyUri(p.toUri(packageRoot))} does not exist.");
+  }
+
+  return packageRoot;
+}
+
+/// The library name must be globally unique, or the wrong library path may be
+/// returned.
+String libraryPath(Symbol libraryName, {String packageRoot}) {
+  var lib = currentMirrorSystem().findLibrary(libraryName);
+  if (lib.uri.scheme != 'package') return p.fromUri(lib.uri);
+
+  // TODO(nweiz): is there a way to avoid assuming this is being run next to a
+  // packages directory?.
+  if (packageRoot == null) packageRoot = p.absolute('packages');
+  return p.join(packageRoot, p.fromUri(lib.uri.path));
+}
+
+/// Repeatedly finds a probably-unused port on localhost and passes it to
+/// [tryPort] until it binds successfully.
+///
+/// [tryPort] should return a non-`null` value or a Future completing to a
+/// non-`null` value once it binds successfully. This value will be returned
+/// by [getUnusedPort] in turn.
+///
+/// This is necessary for ensuring that our port binding isn't flaky for
+/// applications that don't print out the bound port.
+Future getUnusedPort(tryPort(int port)) {
+  var value;
+  return Future.doWhile(() async {
+    value = await tryPort(await getUnsafeUnusedPort());
+    return value == null;
+  }).then((_) => value);
+}
+
+/// Returns a port that is probably, but not definitely, not in use.
+///
+/// This has a built-in race condition: another process may bind this port at
+/// any time after this call has returned. If at all possible, callers should
+/// use [getUnusedPort] instead.
+Future<int> getUnsafeUnusedPort() async {
+  var socket = await RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0);
+  var port = socket.port;
+  await socket.close();
+  return port;
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/util/multi_channel.dart b/mojo/public/dart/third_party/test/lib/src/util/multi_channel.dart
new file mode 100644
index 0000000..f897de9
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/util/multi_channel.dart
@@ -0,0 +1,245 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.multi_channel;
+
+import 'dart:async';
+
+import 'stream_channel.dart';
+
+/// A class that multiplexes multiple virtual channels across a single
+/// underlying transport layer.
+///
+/// This should be connected to another [MultiChannel] on the other end of the
+/// underlying channel. It starts with a single default virtual channel,
+/// accessible via [stream] and [sink]. Additional virtual channels can be
+/// created with [virtualChannel].
+///
+/// When a virtual channel is created by one endpoint, the other must connect to
+/// it before messages may be sent through it. The first endpoint passes its
+/// [VirtualChannel.id] to the second, which then creates a channel from that id
+/// also using [virtualChannel]. For example:
+///
+/// ```dart
+/// // First endpoint
+/// var virtual = multiChannel.virtualChannel();
+/// multiChannel.sink.add({
+///   "channel": virtual.id
+/// });
+///
+/// // Second endpoint
+/// multiChannel.stream.listen((message) {
+///   var virtual = multiChannel.virtualChannel(message["channel"]);
+///   // ...
+/// });
+/// ```
+///
+/// Sending errors across a [MultiChannel] is not supported. Any errors from the
+/// underlying stream will be reported only via the default
+/// [MultiChannel.stream].
+///
+/// Each virtual channel may be closed individually. When all of them are
+/// closed, the underlying [StreamSink] is closed automatically.
+abstract class MultiChannel implements StreamChannel {
+  /// The default input stream.
+  ///
+  /// This connects to the remote [sink].
+  Stream get stream;
+
+  /// The default output stream.
+  ///
+  /// This connects to the remote [stream]. If this is closed, the remote
+  /// [stream] will close, but other virtual channels will remain open and new
+  /// virtual channels may be opened.
+  StreamSink get sink;
+
+  /// Creates a new [MultiChannel] that sends messages over [innerStream] and
+  /// [innerSink].
+  ///
+  /// The inner streams must take JSON-like objects.
+  factory MultiChannel(Stream innerStream, StreamSink innerSink) =>
+      new _MultiChannel(innerStream, innerSink);
+
+  /// Creates a new virtual channel.
+  ///
+  /// If [id] is not passed, this creates a virtual channel from scratch. Before
+  /// it's used, its [VirtualChannel.id] must be sent to the remote endpoint
+  /// where [virtualChannel] should be called with that id.
+  ///
+  /// If [id] is passed, this creates a virtual channel corresponding to the
+  /// channel with that id on the remote channel.
+  ///
+  /// Throws an [ArgumentError] if a virtual channel already exists for [id].
+  /// Throws a [StateError] if the underlying channel is closed.
+  VirtualChannel virtualChannel([id]);
+}
+
+/// The implementation of [MultiChannel].
+///
+/// This is private so that [VirtualChannel] can inherit from [MultiChannel]
+/// without having to implement all the private members.
+class _MultiChannel extends StreamChannelMixin implements MultiChannel {
+  /// The inner stream over which all communication is received.
+  ///
+  /// This will be `null` if the underlying communication channel is closed.
+  Stream _innerStream;
+
+  /// The inner sink over which all communication is sent.
+  ///
+  /// This will be `null` if the underlying communication channel is closed.
+  StreamSink _innerSink;
+
+  /// The subscription to [_innerStream].
+  StreamSubscription _innerStreamSubscription;
+
+  Stream get stream => _streamController.stream;
+  final _streamController = new StreamController(sync: true);
+
+  StreamSink get sink => _sinkController.sink;
+  final _sinkController = new StreamController(sync: true);
+
+  /// A map from virtual channel ids to [StreamController]s that should be used
+  /// to write messages received from those channels.
+  final _streamControllers = new Map<int, StreamController>();
+
+  /// A map from virtual channel ids to [StreamControllers]s that are used
+  /// to receive messages to write to those channels.
+  ///
+  /// Note that this uses the same keys as [_streamControllers].
+  final _sinkControllers = new Map<int, StreamController>();
+
+  /// The next id to use for a local virtual channel.
+  ///
+  /// Ids are used to identify virtual channels. Each message is tagged with an
+  /// id; the receiving [MultiChannel] uses this id to look up which
+  /// [VirtualChannel] the message should be dispatched to.
+  ///
+  /// The id scheme for virtual channels is somewhat complicated. This is
+  /// necessary to ensure that there are no conflicts even when both endpoints
+  /// have virtual channels with the same id; since both endpoints can send and
+  /// receive messages across each virtual channel, a naïve scheme would make it
+  /// impossible to tell whether a message was from a channel that originated in
+  /// the remote endpoint or a reply on a channel that originated in the local
+  /// endpoint.
+  ///
+  /// The trick is that each endpoint only uses odd ids for its own channels.
+  /// When sending a message over a channel that was created by the remote
+  /// endpoint, the channel's id plus one is used. This way each [MultiChannel]
+  /// knows that if an incoming message has an odd id, it's using the local id
+  /// scheme, but if it has an even id, it's using the remote id scheme.
+  var _nextId = 1;
+
+  _MultiChannel(this._innerStream, this._innerSink) {
+    // The default connection is a special case which has id 0 on both ends.
+    // This allows it to begin connected without having to send over an id.
+    _streamControllers[0] = _streamController;
+    _sinkControllers[0] = _sinkController;
+    _sinkController.stream.listen(
+        (message) => _innerSink.add([0, message]),
+        onDone: () => _closeChannel(0, 0));
+
+    _innerStreamSubscription = _innerStream.listen((message) {
+      var id = message[0];
+      var sink = _streamControllers[id];
+
+      // A sink might not exist if the channel was closed before an incoming
+      // message was processed.
+      if (sink == null) return;
+      if (message.length > 1) {
+        sink.add(message[1]);
+        return;
+      }
+
+      // A message without data indicates that the channel has been closed.
+      _sinkControllers[id].close();
+    }, onDone: _closeInnerChannel,
+        onError: _streamController.addError);
+  }
+
+  VirtualChannel virtualChannel([id]) {
+    if (_innerStream == null) {
+      throw new StateError("The underlying channel is closed.");
+    }
+
+    var inputId;
+    var outputId;
+    if (id != null) {
+      // Since the user is passing in an id, we're connected to a remote
+      // VirtualChannel. This means messages they send over this channel will
+      // have the original odd id, but our replies will have an even id.
+      inputId = id;
+      outputId = (id as int) + 1;
+    } else {
+      // Since we're generating an id, we originated this VirtualChannel. This
+      // means messages we send over this channel will have the original odd id,
+      // but the remote channel's replies will have an even id.
+      inputId = _nextId + 1;
+      outputId = _nextId;
+      _nextId += 2;
+    }
+
+    if (_streamControllers.containsKey(inputId)) {
+      throw new ArgumentError("A virtual channel with id $id already exists.");
+    }
+
+    var streamController = new StreamController(sync: true);
+    var sinkController = new StreamController(sync: true);
+    _streamControllers[inputId] = streamController;
+    _sinkControllers[inputId] = sinkController;
+    sinkController.stream.listen(
+        (message) => _innerSink.add([outputId, message]),
+        onDone: () => _closeChannel(inputId, outputId));
+
+    return new VirtualChannel._(
+        this, outputId, streamController.stream, sinkController.sink);
+  }
+
+  /// Closes the virtual channel for which incoming messages have [inputId] and
+  /// outgoing messages have [outputId].
+  void _closeChannel(int inputId, int outputId) {
+    // A message without data indicates that the virtual channel has been
+    // closed.
+    _streamControllers.remove(inputId).close();
+    _sinkControllers.remove(inputId).close();
+
+    if (_innerSink == null) return;
+    _innerSink.add([outputId]);
+    if (_streamControllers.isEmpty) _closeInnerChannel();
+  }
+
+  /// Closes the underlying communication channel.
+  void _closeInnerChannel() {
+    _innerSink.close();
+    _innerStreamSubscription.cancel();
+    _innerStream = null;
+    _innerSink = null;
+    for (var controller in _sinkControllers.values.toList()) {
+      controller.close();
+    }
+  }
+}
+
+/// A virtual channel created by [MultiChannel].
+///
+/// This implements [MultiChannel] for convenience.
+/// [VirtualChannel.virtualChannel] is semantically identical to the parent's
+/// [MultiChannel.virtualChannel].
+class VirtualChannel extends StreamChannelMixin implements MultiChannel {
+  /// The [MultiChannel] that created this.
+  final MultiChannel _parent;
+
+  /// The identifier for this channel.
+  ///
+  /// This can be sent across the [MultiChannel] to provide the remote endpoint
+  /// a means to connect to this channel. Nothing about this is guaranteed
+  /// except that it will be JSON-serializable.
+  final id;
+
+  final Stream stream;
+  final StreamSink sink;
+
+  VirtualChannel._(this._parent, this.id, this.stream, this.sink);
+
+  VirtualChannel virtualChannel([id]) => _parent.virtualChannel(id);
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/util/one_off_handler.dart b/mojo/public/dart/third_party/test/lib/src/util/one_off_handler.dart
new file mode 100644
index 0000000..661dd91
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/util/one_off_handler.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.util.one_off_handler;
+
+import 'package:path/path.dart' as p;
+import 'package:shelf/shelf.dart' as shelf;
+
+/// A Shelf handler that provides support for one-time handlers.
+///
+/// This is useful for handlers that only expect to be hit once before becoming
+/// invalid and don't need to have a persistent URL.
+class OneOffHandler {
+  /// A map from URL paths to handlers.
+  final _handlers = new Map<String, shelf.Handler>();
+
+  /// The counter of handlers that have been activated.
+  var _counter = 0;
+
+  /// The actual [shelf.Handler] that dispatches requests.
+  shelf.Handler get handler => _onRequest;
+
+  /// Creates a new one-off handler that forwards to [handler].
+  ///
+  /// Returns a string that's the URL path for hitting this handler, relative to
+  /// the URL for the one-off handler itself.
+  ///
+  /// [handler] will be unmounted as soon as it receives a request.
+  String create(shelf.Handler handler) {
+    var path = _counter.toString();
+    _handlers[path] = handler;
+    _counter++;
+    return path;
+  }
+
+  /// Dispatches [request] to the appropriate handler.
+  _onRequest(shelf.Request request) {
+    var components = p.url.split(request.url.path);
+    if (components.isEmpty) return new shelf.Response.notFound(null);
+
+    var path = components.removeAt(0);
+    var handler = _handlers.remove(path);
+    if (handler == null) return new shelf.Response.notFound(null);
+    return handler(request.change(path: path));
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/util/path_handler.dart b/mojo/public/dart/third_party/test/lib/src/util/path_handler.dart
new file mode 100644
index 0000000..9a7312f
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/util/path_handler.dart
@@ -0,0 +1,56 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.util.path_handler;
+
+import 'package:path/path.dart' as p;
+import 'package:shelf/shelf.dart' as shelf;
+
+/// A handler that routes to sub-handlers based on exact path prefixes.
+class PathHandler {
+  /// A trie of path components to handlers.
+  final _paths = new _Node();
+
+  /// The shelf handler.
+  shelf.Handler get handler => _onRequest;
+
+  PathHandler();
+
+  /// Routes requests at or under [path] to [handler].
+  ///
+  /// If [path] is a parent or child directory of another path in this handler,
+  /// the longest matching prefix wins.
+  void add(String path, shelf.Handler handler) {
+    var node = _paths;
+    for (var component in p.url.split(path)) {
+      node = node.children.putIfAbsent(component, () => new _Node());
+    }
+    node.handler = handler;
+  }
+
+  _onRequest(shelf.Request request) {
+    var handler;
+    var handlerIndex;
+    var node = _paths;
+    var components = p.url.split(request.url.path);
+    for (var i = 0; i < components.length; i++ ) {
+      node = node.children[components[i]];
+      if (node == null) break;
+      if (node.handler == null) continue;
+      handler = node.handler;
+      handlerIndex = i;
+    }
+
+    if (handler == null) return new shelf.Response.notFound("Not found.");
+
+    return handler(request.change(
+        path: p.url.joinAll(components.take(handlerIndex + 1))));
+  }
+}
+
+/// A trie node.
+class _Node {
+  shelf.Handler handler;
+  final children = new Map<String, _Node>();
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/util/remote_exception.dart b/mojo/public/dart/third_party/test/lib/src/util/remote_exception.dart
new file mode 100644
index 0000000..da0f525
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/util/remote_exception.dart
@@ -0,0 +1,111 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.util.remote_exception;
+
+import 'dart:async';
+import 'dart:isolate';
+
+import 'package:stack_trace/stack_trace.dart';
+
+import '../frontend/expect.dart';
+
+/// An exception that was thrown remotely.
+///
+/// This could be an exception thrown in a different isolate, a different
+/// process, or on an entirely different computer.
+class RemoteException implements Exception {
+  /// The original exception's message, if it had one.
+  ///
+  /// If the original exception was a plain string, this will contain that
+  /// string.
+  final String message;
+
+  /// The value of the original exception's `runtimeType.toString()`.
+  final String type;
+
+  /// The value of the original exception's `toString()`.
+  final String _toString;
+
+  /// Serializes [error] and [stackTrace] into a JSON-safe object.
+  ///
+  /// Other than JSON- and isolate-safety, no guarantees are made about the
+  /// serialized format.
+  static serialize(error, StackTrace stackTrace) {
+    var message;
+    if (error is String) {
+      message = error;
+    } else {
+      try {
+        message = error.message.toString();
+      } on NoSuchMethodError catch (_) {
+        // Do nothing.
+      }
+    }
+
+    // It's possible (although unlikely) for a user-defined class to have
+    // multiple of these supertypes. That's fine, though, since we only care
+    // about core-library-raised IsolateSpawnExceptions anyway.
+    var supertype;
+    if (error is TestFailure) {
+      supertype = 'TestFailure';
+    } else if (error is IsolateSpawnException) {
+      supertype = 'IsolateSpawnException';
+    }
+
+    return {
+      'message': message,
+      'type': error.runtimeType.toString(),
+      'supertype': supertype,
+      'toString': error.toString(),
+      'stackChain': new Chain.forTrace(stackTrace).toString()
+    };
+  }
+
+  /// Deserializes an exception serialized with [RemoteException.serialize].
+  ///
+  /// The returned [AsyncError] is guaranteed to have a [RemoteException] as its
+  /// error and a [Chain] as its stack trace.
+  static AsyncError deserialize(serialized) {
+    return new AsyncError(
+        _deserializeException(serialized),
+        new Chain.parse(serialized['stackChain']));
+  }
+
+  /// Deserializes the exception portion of [serialized].
+  static RemoteException _deserializeException(serialized) {
+    var message = serialized['message'];
+    var type = serialized['type'];
+    var toString = serialized['toString'];
+
+    switch (serialized['supertype']) {
+      case 'TestFailure':
+        return new _RemoteTestFailure(message, type, toString);
+      case 'IsolateSpawnException':
+        return new _RemoteIsolateSpawnException(message, type, toString);
+      default:
+        return new RemoteException._(message, type, toString);
+    }
+  }
+
+  RemoteException._(this.message, this.type, this._toString);
+
+  String toString() => _toString;
+}
+
+/// A subclass of [RemoteException] that implements [TestFailure].
+///
+/// It's important to preserve [TestFailure]-ness, because tests have different
+/// results depending on whether an exception was a failure or an error.
+class _RemoteTestFailure extends RemoteException implements TestFailure {
+  _RemoteTestFailure(String message, String type, String toString)
+      : super._(message, type, toString);
+}
+
+/// A subclass of [RemoteException] that implements [IsolateSpawnException].
+class _RemoteIsolateSpawnException extends RemoteException
+    implements IsolateSpawnException {
+  _RemoteIsolateSpawnException(String message, String type, String toString)
+      : super._(message, type, toString);
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/util/stack_trace_mapper.dart b/mojo/public/dart/third_party/test/lib/src/util/stack_trace_mapper.dart
new file mode 100644
index 0000000..30d6e75
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/util/stack_trace_mapper.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.util.stack_trace_mapper;
+
+import 'package:source_map_stack_trace/source_map_stack_trace.dart' as mapper;
+import 'package:source_maps/source_maps.dart';
+
+/// A class for mapping JS stack traces to Dart stack traces using source maps.
+class StackTraceMapper {
+  /// The parsed source map.
+  final Mapping _mapping;
+
+  /// The URI of the package root, as passed to dart2js.
+  final Uri _packageRoot;
+
+  /// The URI of the SDK root from which dart2js loaded its sources.
+  final Uri _sdkRoot;
+
+  StackTraceMapper(String contents, {Uri mapUrl, Uri packageRoot, Uri sdkRoot})
+    : _mapping = parse(contents, mapUrl: mapUrl),
+      _packageRoot = packageRoot,
+      _sdkRoot = sdkRoot;
+
+  /// Converts [trace] into a Dart stack trace.
+  StackTrace mapStackTrace(StackTrace trace) =>
+      mapper.mapStackTrace(_mapping, trace,
+          packageRoot: _packageRoot, sdkRoot: _sdkRoot);
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/util/stream_channel.dart b/mojo/public/dart/third_party/test/lib/src/util/stream_channel.dart
new file mode 100644
index 0000000..66c1d8e
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/util/stream_channel.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.stream_channel;
+
+import 'dart:async';
+
+/// An abstract class representing a two-way communication channel.
+///
+/// Subclasses can mix in [StreamChannelMixin] to get default implementations of
+/// the various instance methods.
+abstract class StreamChannel<T> {
+  /// The stream that emits values from the other endpoint.
+  Stream<T> get stream;
+
+  /// The sink for sending values to the other endpoint.
+  StreamSink<T> get sink;
+
+  /// Creates a new [StreamChannel] that communicates over [stream] and [sink].
+  factory StreamChannel(Stream<T> stream, StreamSink<T> sink) =>
+      new _StreamChannel<T>(stream, sink);
+
+  /// Connects [this] to [other], so that any values emitted by either are sent
+  /// directly to the other.
+  void pipe(StreamChannel<T> other);
+}
+
+/// An implementation of [StreamChannel] that simply takes a stream and a sink
+/// as parameters.
+///
+/// This is distinct from [StreamChannel] so that it can use
+/// [StreamChannelMixin].
+class _StreamChannel<T> extends StreamChannelMixin<T> {
+  final Stream<T> stream;
+  final StreamSink<T> sink;
+
+  _StreamChannel(this.stream, this.sink);
+}
+
+/// A mixin that implements the instance methods of [StreamChannel] in terms of
+/// [stream] and [sink].
+abstract class StreamChannelMixin<T> implements StreamChannel<T> {
+  void pipe(StreamChannel<T> other) {
+    stream.pipe(other.sink);
+    other.stream.pipe(sink);
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/util/stream_queue.dart b/mojo/public/dart/third_party/test/lib/src/util/stream_queue.dart
new file mode 100644
index 0000000..dc7c784
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/util/stream_queue.dart
@@ -0,0 +1,699 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// TODO(nweiz): Get rid of this when https://codereview.chromium.org/1241723003/
+// lands.
+library test.util.forkable_stream_queue;
+
+import 'dart:async';
+import 'dart:collection';
+
+import "package:async/async.dart" hide ForkableStream, StreamQueue;
+
+import "forkable_stream.dart";
+
+/// An asynchronous pull-based interface for accessing stream events.
+///
+/// Wraps a stream and makes individual events available on request.
+///
+/// You can request (and reserve) one or more events from the stream,
+/// and after all previous requests have been fulfilled, stream events
+/// go towards fulfilling your request.
+///
+/// For example, if you ask for [next] two times, the returned futures
+/// will be completed by the next two unrequested events from the stream.
+///
+/// The stream subscription is paused when there are no active
+/// requests.
+///
+/// Some streams, including broadcast streams, will buffer
+/// events while paused, so waiting too long between requests may
+/// cause memory bloat somewhere else.
+///
+/// This is similar to, but more convenient than, a [StreamIterator].
+/// A `StreamIterator` requires you to manually check when a new event is
+/// available and you can only access the value of that event until you
+/// check for the next one. A `StreamQueue` allows you to request, for example,
+/// three events at a time, either individually, as a group using [take]
+/// or [skip], or in any combination.
+///
+/// You can also ask to have the [rest] of the stream provided as
+/// a new stream. This allows, for example, taking the first event
+/// out of a stream and continuing to use the rest of the stream as a stream.
+///
+/// Example:
+///
+///     var events = new StreamQueue<String>(someStreamOfLines);
+///     var first = await events.next;
+///     while (first.startsWith('#')) {
+///       // Skip comments.
+///       first = await events.next;
+///     }
+///
+///     if (first.startsWith(MAGIC_MARKER)) {
+///       var headerCount =
+///           first.parseInt(first.substring(MAGIC_MARKER.length + 1));
+///       handleMessage(headers: await events.take(headerCount),
+///                     body: events.rest);
+///       return;
+///     }
+///     // Error handling.
+///
+/// When you need no further events the `StreamQueue` should be closed
+/// using [cancel]. This releases the underlying stream subscription.
+class StreamQueue<T> {
+  // This class maintains two queues: one of events and one of requests.
+  // The active request (the one in front of the queue) is called with
+  // the current event queue when it becomes active.
+  //
+  // If the request returns true, it's complete and will be removed from the
+  // request queue.
+  // If the request returns false, it needs more events, and will be called
+  // again when new events are available.
+  // The request can remove events that it uses, or keep them in the event
+  // queue until it has all that it needs.
+  //
+  // This model is very flexible and easily extensible.
+  // It allows requests that don't consume events (like [hasNext]) or
+  // potentially a request that takes either five or zero events, determined
+  // by the content of the fifth event.
+
+  /// Source of events.
+  final ForkableStream _sourceStream;
+
+  /// Subscription on [_sourceStream] while listening for events.
+  ///
+  /// Set to subscription when listening, and set to `null` when the
+  /// subscription is done (and [_isDone] is set to true).
+  StreamSubscription _subscription;
+
+  /// Whether we have listened on [_sourceStream] and the subscription is done.
+  bool _isDone = false;
+
+  /// Whether a closing operation has been performed on the stream queue.
+  ///
+  /// Closing operations are [cancel] and [rest].
+  bool _isClosed = false;
+
+  /// Queue of events not used by a request yet.
+  final Queue<Result> _eventQueue = new Queue();
+
+  /// Queue of pending requests.
+  ///
+  /// Access through methods below to ensure consistency.
+  final Queue<_EventRequest> _requestQueue = new Queue();
+
+  /// Create a `StreamQueue` of the events of [source].
+  StreamQueue(Stream source)
+      : _sourceStream = source is ForkableStream
+          ? source
+          : new ForkableStream(source);
+
+  /// Asks if the stream has any more events.
+  ///
+  /// Returns a future that completes with `true` if the stream has any
+  /// more events, whether data or error.
+  /// If the stream closes without producing any more events, the returned
+  /// future completes with `false`.
+  ///
+  /// Can be used before using [next] to avoid getting an error in the
+  /// future returned by `next` in the case where there are no more events.
+  Future<bool> get hasNext {
+    if (!_isClosed) {
+      var hasNextRequest = new _HasNextRequest();
+      _addRequest(hasNextRequest);
+      return hasNextRequest.future;
+    }
+    throw _failClosed();
+  }
+
+  /// Requests the next (yet unrequested) event from the stream.
+  ///
+  /// When the requested event arrives, the returned future is completed with
+  /// the event.
+  /// If the event is a data event, the returned future completes
+  /// with its value.
+  /// If the event is an error event, the returned future completes with
+  /// its error and stack trace.
+  /// If the stream closes before an event arrives, the returned future
+  /// completes with a [StateError].
+  ///
+  /// It's possible to have several pending [next] calls (or other requests),
+  /// and they will be completed in the order they were requested, by the
+  /// first events that were not consumed by previous requeusts.
+  Future<T> get next {
+    if (!_isClosed) {
+      var nextRequest = new _NextRequest<T>();
+      _addRequest(nextRequest);
+      return nextRequest.future;
+    }
+    throw _failClosed();
+  }
+
+  /// Returns a stream of all the remaning events of the source stream.
+  ///
+  /// All requested [next], [skip] or [take] operations are completed
+  /// first, and then any remaining events are provided as events of
+  /// the returned stream.
+  ///
+  /// Using `rest` closes this stream queue. After getting the
+  /// `rest` the caller may no longer request other events, like
+  /// after calling [cancel].
+  Stream<T> get rest {
+    if (_isClosed) {
+      throw _failClosed();
+    }
+    var request = new _RestRequest<T>(this);
+    _isClosed = true;
+    _addRequest(request);
+    return request.stream;
+  }
+
+  /// Skips the next [count] *data* events.
+  ///
+  /// The [count] must be non-negative.
+  ///
+  /// When successful, this is equivalent to using [take]
+  /// and ignoring the result.
+  ///
+  /// If an error occurs before `count` data events have been skipped,
+  /// the returned future completes with that error instead.
+  ///
+  /// If the stream closes before `count` data events,
+  /// the remaining unskipped event count is returned.
+  /// If the returned future completes with the integer `0`,
+  /// then all events were succssfully skipped. If the value
+  /// is greater than zero then the stream ended early.
+  Future<int> skip(int count) {
+    if (count < 0) throw new RangeError.range(count, 0, null, "count");
+    if (!_isClosed) {
+      var request = new _SkipRequest(count);
+      _addRequest(request);
+      return request.future;
+    }
+    throw _failClosed();
+  }
+
+  /// Requests the next [count] data events as a list.
+  ///
+  /// The [count] must be non-negative.
+  ///
+  /// Equivalent to calling [next] `count` times and
+  /// storing the data values in a list.
+  ///
+  /// If an error occurs before `count` data events has
+  /// been collected, the returned future completes with
+  /// that error instead.
+  ///
+  /// If the stream closes before `count` data events,
+  /// the returned future completes with the list
+  /// of data collected so far. That is, the returned
+  /// list may have fewer than [count] elements.
+  Future<List<T>> take(int count) {
+    if (count < 0) throw new RangeError.range(count, 0, null, "count");
+    if (!_isClosed) {
+      var request = new _TakeRequest<T>(count);
+      _addRequest(request);
+      return request.future;
+    }
+    throw _failClosed();
+  }
+
+  /// Creates a new stream queue in the same position as this one.
+  ///
+  /// The fork is subscribed to the same underlying stream as this queue, but
+  /// it's otherwise wholly independent. If requests are made on one, they don't
+  /// move the other forward; if one is closed, the other is still open.
+  ///
+  /// The underlying stream will only be paused when all forks have no
+  /// outstanding requests, and only canceled when all forks are canceled.
+  StreamQueue<T> fork() {
+    if (_isClosed) throw _failClosed();
+
+    var request = new _ForkRequest<T>(this);
+    _addRequest(request);
+    return request.queue;
+  }
+
+  /// Cancels the underlying stream subscription.
+  ///
+  /// If [immediate] is `false` (the default), the cancel operation waits until
+  /// all previously requested events have been processed, then it cancels the
+  /// subscription providing the events.
+  ///
+  /// If [immediate] is `true`, the subscription is instead canceled
+  /// immediately. Any pending events complete with a 'closed'-event, as though
+  /// the stream had closed by itself.
+  ///
+  /// The returned future completes with the result of calling
+  /// `cancel`.
+  ///
+  /// After calling `cancel`, no further events can be requested.
+  /// None of [next], [rest], [skip], [take] or [cancel] may be
+  /// called again.
+  Future cancel({bool immediate: false}) {
+    if (_isClosed) throw _failClosed();
+    _isClosed = true;
+
+    if (_isDone) return new Future.value();
+    if (_subscription == null) _subscription = _sourceStream.listen(null);
+
+    if (!immediate) {
+      var request = new _CancelRequest(this);
+      _addRequest(request);
+      return request.future;
+    }
+
+    var future = _subscription.cancel();
+    _onDone();
+    return future;
+  }
+
+  /// Returns an error for when a request is made after cancel.
+  ///
+  /// Returns a [StateError] with a message saying that either
+  /// [cancel] or [rest] have already been called.
+  Error _failClosed() {
+    return new StateError("Already cancelled");
+  }
+
+  // Callbacks receiving the events of the source stream.
+
+  void _onData(T data) {
+    _eventQueue.add(new Result.value(data));
+    _checkQueues();
+  }
+
+  void _onError(error, StackTrace stack) {
+    _eventQueue.add(new Result.error(error, stack));
+    _checkQueues();
+  }
+
+  void _onDone() {
+    _subscription = null;
+    _isDone = true;
+    _closeAllRequests();
+  }
+
+  // Request queue management.
+
+  /// Adds a new request to the queue.
+  void _addRequest(_EventRequest request) {
+    if (_isDone) {
+      assert(_requestQueue.isEmpty);
+      if (!request.addEvents(_eventQueue)) {
+        request.close(_eventQueue);
+      }
+      return;
+    }
+    if (_requestQueue.isEmpty) {
+      if (request.addEvents(_eventQueue)) return;
+      _ensureListening();
+    }
+    _requestQueue.add(request);
+  }
+
+  /// Ensures that we are listening on events from [_sourceStream].
+  ///
+  /// Resumes subscription on [_sourceStream], or creates it if necessary.
+  void _ensureListening() {
+    assert(!_isDone);
+    if (_subscription == null) {
+      _subscription =
+          _sourceStream.listen(_onData, onError: _onError, onDone: _onDone);
+    } else {
+      _subscription.resume();
+    }
+  }
+
+  /// Removes all requests and closes them.
+  ///
+  /// Used when the source stream is done.
+  /// After this, no further requests will be added to the queue,
+  /// requests are immediately served entirely by events already in the event
+  /// queue, if any.
+  void _closeAllRequests() {
+    assert(_isDone);
+    while (_requestQueue.isNotEmpty) {
+      var request = _requestQueue.removeFirst();
+      if (!request.addEvents(_eventQueue)) {
+        request.close(_eventQueue);
+      }
+    }
+  }
+
+  /// Matches events with requests.
+  ///
+  /// Called after receiving an event.
+  void _checkQueues() {
+    while (_requestQueue.isNotEmpty) {
+      if (_requestQueue.first.addEvents(_eventQueue)) {
+        _requestQueue.removeFirst();
+      } else {
+        return;
+      }
+    }
+
+    if (!_isDone) {
+      _subscription.pause();
+    }
+  }
+
+  /// Extracts the subscription and makes this stream queue unusable.
+  ///
+  /// Can only be used by the very last request.
+  StreamSubscription _dispose() {
+    assert(_isClosed);
+    var subscription = _subscription;
+    _subscription = null;
+    _isDone = true;
+    return subscription;
+  }
+}
+
+/// Request object that receives events when they arrive, until fulfilled.
+///
+/// Each request that cannot be fulfilled immediately is represented by
+/// an `_EventRequest` object in the request queue.
+///
+/// Events from the source stream are sent to the first request in the
+/// queue until it reports itself as [isComplete].
+///
+/// When the first request in the queue `isComplete`, either when becoming
+/// the first request or after receiving an event, its [close] methods is
+/// called.
+///
+/// The [close] method is also called immediately when the source stream
+/// is done.
+abstract class _EventRequest {
+  /// Handle available events.
+  ///
+  /// The available events are provided as a queue. The `addEvents` function
+  /// should only remove events from the front of the event queue, e.g.,
+  /// using [removeFirst].
+  ///
+  /// Returns `true` if the request is completed, or `false` if it needs
+  /// more events.
+  /// The call may keep events in the queue until the requeust is complete,
+  /// or it may remove them immediately.
+  ///
+  /// If the method returns true, the request is considered fulfilled, and
+  /// will never be called again.
+  ///
+  /// This method is called when a request reaches the front of the request
+  /// queue, and if it returns `false`, it's called again every time a new event
+  /// becomes available, or when the stream closes.
+  bool addEvents(Queue<Result> events);
+
+  /// Complete the request.
+  ///
+  /// This is called when the source stream is done before the request
+  /// had a chance to receive all its events. That is, after a call
+  /// to [addEvents] has returned `false`.
+  /// If there are any unused events available, they are in the [events] queue.
+  /// No further events will become available.
+  ///
+  /// The queue should only remove events from the front of the event queue,
+  /// e.g., using [removeFirst].
+  ///
+  /// If the request kept events in the queue after an [addEvents] call,
+  /// this is the last chance to use them.
+  void close(Queue<Result> events);
+}
+
+/// Request for a [StreamQueue.next] call.
+///
+/// Completes the returned future when receiving the first event,
+/// and is then complete.
+class _NextRequest<T> implements _EventRequest {
+  /// Completer for the future returned by [StreamQueue.next].
+  final Completer _completer;
+
+  _NextRequest() : _completer = new Completer<T>();
+
+  Future<T> get future => _completer.future;
+
+  bool addEvents(Queue<Result> events) {
+    if (events.isEmpty) return false;
+    events.removeFirst().complete(_completer);
+    return true;
+  }
+
+  void close(Queue<Result> events) {
+    var errorFuture =
+        new Future.sync(() => throw new StateError("No elements"));
+    _completer.complete(errorFuture);
+  }
+}
+
+/// Request for a [StreamQueue.skip] call.
+class _SkipRequest implements _EventRequest {
+  /// Completer for the future returned by the skip call.
+  final Completer _completer = new Completer<int>();
+
+  /// Number of remaining events to skip.
+  ///
+  /// The request [isComplete] when the values reaches zero.
+  ///
+  /// Decremented when an event is seen.
+  /// Set to zero when an error is seen since errors abort the skip request.
+  int _eventsToSkip;
+
+  _SkipRequest(this._eventsToSkip);
+
+  /// The future completed when the correct number of events have been skipped.
+  Future get future => _completer.future;
+
+  bool addEvents(Queue<Result> events) {
+    while (_eventsToSkip > 0) {
+      if (events.isEmpty) return false;
+      _eventsToSkip--;
+      var event = events.removeFirst();
+      if (event.isError) {
+        event.complete(_completer);
+        return true;
+      }
+    }
+    _completer.complete(0);
+    return true;
+  }
+
+  void close(Queue<Result> events) {
+    _completer.complete(_eventsToSkip);
+  }
+}
+
+/// Request for a [StreamQueue.take] call.
+class _TakeRequest<T> implements _EventRequest {
+  /// Completer for the future returned by the take call.
+  final Completer _completer;
+
+  /// List collecting events until enough have been seen.
+  final List _list = <T>[];
+
+  /// Number of events to capture.
+  ///
+  /// The request [isComplete] when the length of [_list] reaches
+  /// this value.
+  final int _eventsToTake;
+
+  _TakeRequest(this._eventsToTake) : _completer = new Completer<List<T>>();
+
+  /// The future completed when the correct number of events have been captured.
+  Future get future => _completer.future;
+
+  bool addEvents(Queue<Result> events) {
+    while (_list.length < _eventsToTake) {
+      if (events.isEmpty) return false;
+      var result = events.removeFirst();
+      if (result.isError) {
+        result.complete(_completer);
+        return true;
+      }
+      _list.add(result.asValue.value);
+    }
+    _completer.complete(_list);
+    return true;
+  }
+
+  void close(Queue<Result> events) {
+    _completer.complete(_list);
+  }
+}
+
+/// Request for a [StreamQueue.cancel] call.
+///
+/// The request needs no events, it just waits in the request queue
+/// until all previous events are fulfilled, then it cancels the stream queue
+/// source subscription.
+class _CancelRequest implements _EventRequest {
+  /// Completer for the future returned by the `cancel` call.
+  final Completer _completer = new Completer();
+
+  /// The [StreamQueue] object that has this request queued.
+  ///
+  /// When the event is completed, it needs to cancel the active subscription
+  /// of the `StreamQueue` object, if any.
+  final StreamQueue _streamQueue;
+
+  _CancelRequest(this._streamQueue);
+
+  /// The future completed when the cancel request is completed.
+  Future get future => _completer.future;
+
+  bool addEvents(Queue<Result> events) {
+    _shutdown();
+    return true;
+  }
+
+  void close(_) {
+    _shutdown();
+  }
+
+  void _shutdown() {
+    if (_streamQueue._isDone) {
+      _completer.complete();
+    } else {
+      _streamQueue._ensureListening();
+      _completer.complete(_streamQueue._dispose().cancel());
+    }
+  }
+}
+
+/// Request for a [StreamQueue.rest] call.
+///
+/// The request is always complete, it just waits in the request queue
+/// until all previous events are fulfilled, then it takes over the
+/// stream events subscription and creates a stream from it.
+class _RestRequest<T> implements _EventRequest {
+  /// Completer for the stream returned by the `rest` call.
+  final StreamCompleter _completer = new StreamCompleter<T>();
+
+  /// The [StreamQueue] object that has this request queued.
+  ///
+  /// When the event is completed, it needs to cancel the active subscription
+  /// of the `StreamQueue` object, if any.
+  final StreamQueue _streamQueue;
+
+  _RestRequest(this._streamQueue);
+
+  /// The stream which will contain the remaining events of [_streamQueue].
+  Stream<T> get stream => _completer.stream;
+
+  bool addEvents(Queue<Result> events) {
+    _completeStream(events);
+    return true;
+  }
+
+  void close(Queue<Result> events) {
+    _completeStream(events);
+  }
+
+  void _completeStream(Queue<Result> events) {
+    if (events.isEmpty) {
+      if (_streamQueue._isDone) {
+        _completer.setEmpty();
+      } else {
+        _completer.setSourceStream(_getRestStream());
+      }
+    } else {
+      // There are prefetched events which needs to be added before the
+      // remaining stream.
+      var controller = new StreamController<T>();
+      for (var event in events) {
+        event.addTo(controller);
+      }
+      controller.addStream(_getRestStream(), cancelOnError: false)
+                .whenComplete(controller.close);
+      _completer.setSourceStream(controller.stream);
+    }
+  }
+
+  /// Create a stream from the rest of [_streamQueue]'s subscription.
+  Stream _getRestStream() {
+    if (_streamQueue._isDone) {
+      var controller = new StreamController<T>()..close();
+      return controller.stream;
+      // TODO(lrn). Use the following when 1.11 is released.
+      // return new Stream<T>.empty();
+    }
+    if (_streamQueue._subscription == null) {
+      return _streamQueue._sourceStream;
+    }
+    var subscription = _streamQueue._dispose();
+    subscription.resume();
+    return new SubscriptionStream<T>(subscription);
+  }
+}
+
+/// Request for a [StreamQueue.hasNext] call.
+///
+/// Completes the [future] with `true` if it sees any event,
+/// but doesn't consume the event.
+/// If the request is closed without seeing an event, then
+/// the [future] is completed with `false`.
+class _HasNextRequest<T> implements _EventRequest {
+  final Completer _completer = new Completer<bool>();
+
+  Future<bool> get future => _completer.future;
+
+  bool addEvents(Queue<Result> events) {
+    if (events.isNotEmpty) {
+      _completer.complete(true);
+      return true;
+    }
+    return false;
+  }
+
+  void close(_) {
+    _completer.complete(false);
+  }
+}
+
+/// Request for a [StreamQueue.fork] call.
+class _ForkRequest<T> implements _EventRequest {
+  /// Completer for the stream used by the queue by the `fork` call.
+  StreamCompleter _completer;
+
+  StreamQueue<T> queue;
+
+  /// The [StreamQueue] object that has this request queued.
+  final StreamQueue _streamQueue;
+
+  _ForkRequest(this._streamQueue) {
+    _completer = new StreamCompleter<T>();
+    queue = new StreamQueue<T>(_completer.stream);
+  }
+
+  bool addEvents(Queue<Result> events) {
+    _completeStream(events);
+    return true;
+  }
+
+  void close(Queue<Result> events) {
+    _completeStream(events);
+  }
+
+  void _completeStream(Queue<Result> events) {
+    if (events.isEmpty) {
+      if (_streamQueue._isDone) {
+        _completer.setEmpty();
+      } else {
+        _completer.setSourceStream(_streamQueue._sourceStream.fork());
+      }
+    } else {
+      // There are prefetched events which need to be added before the
+      // remaining stream.
+      var controller = new StreamController<T>();
+      for (var event in events) {
+        event.addTo(controller);
+      }
+
+      var fork = _streamQueue._sourceStream.fork();
+      controller.addStream(fork, cancelOnError: false)
+          .whenComplete(controller.close);
+      _completer.setSourceStream(controller.stream);
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/util/string_literal_iterator.dart b/mojo/public/dart/third_party/test/lib/src/util/string_literal_iterator.dart
new file mode 100644
index 0000000..59f0372
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/util/string_literal_iterator.dart
@@ -0,0 +1,245 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection';
+
+import 'package:analyzer/src/generated/ast.dart';
+
+// ASCII character codes.
+
+const _zero = 0x30;
+const _nine = 0x39;
+const _backslash = 0x5C;
+const _openCurly = 0x7B;
+const _closeCurly = 0x7D;
+const _capitalA = 0x41;
+const _capitalZ = 0x5A;
+const _a = 0x61;
+const _n = 0x6E;
+const _r = 0x72;
+const _f = 0x66;
+const _b = 0x62;
+const _t = 0x74;
+const _u = 0x75;
+const _v = 0x76;
+const _x = 0x78;
+const _z = 0x7A;
+const _newline = 0xA;
+const _carriageReturn = 0xD;
+const _formFeed = 0xC;
+const _backspace = 0x8;
+const _tab = 0x9;
+const _verticalTab = 0xB;
+
+/// An iterator over the runes in the value of a [StringLiteral].
+///
+/// In addition to exposing the values of the runes themselves, this also
+/// exposes the offset of the current rune in the Dart source file.
+class StringLiteralIterator extends Iterator<int> {
+  int get current => _current;
+  int _current;
+
+  /// The offset of the beginning of [current] in the Dart source file that
+  /// contains the string literal.
+  ///
+  /// Before iteration begins, this points to the character before the first
+  /// rune.
+  int get offset => _offset;
+  int _offset;
+
+  /// The offset of the next rune.
+  ///
+  /// This isn't necessarily just `offset + 1`, since a single rune may be
+  /// represented by multiple characters in the source file, or a string literal
+  /// may be composed of several adjacent string literals.
+  int _nextOffset;
+
+  /// All [SimpleStringLiteral]s that compose the input literal.
+  ///
+  /// If the input literal is itself a [SimpleStringLiteral], this just contains
+  /// that literal; otherwise, the literal is an [AdjacentStrings], and this
+  /// contains its component literals.
+  final _strings = new Queue<SimpleStringLiteral>();
+
+  /// Whether this is a raw string that begins with `r`.
+  ///
+  /// This is necessary for knowing how to parse escape sequences.
+  bool _isRaw;
+
+  /// The iterator over the runes in the Dart source file.
+  ///
+  /// When switching to a new string in [_strings], this is updated to point to
+  /// that string's component runes.
+  Iterator<int> _runes;
+
+  /// Whether this has finished iterating.
+  bool _done = false;
+
+  /// Creates a new [StringLiteralIterator] iterating over the contents of
+  /// [literal].
+  ///
+  /// Throws an [ArgumentError] if [literal] contains interpolated strings.
+  StringLiteralIterator(StringLiteral literal) {
+    if (literal is StringInterpolation) {
+      throw new ArgumentError("Can't iterate over an interpolated string.");
+    } else if (literal is SimpleStringLiteral) {
+      _strings.add(literal);
+    } else {
+      assert(literal is AdjacentStrings);
+
+      for (var string in (literal as AdjacentStrings).strings) {
+        if (string is StringInterpolation) {
+          throw new ArgumentError("Can't iterate over an interpolated string.");
+        }
+        assert(string is SimpleStringLiteral);
+        _strings.add(string);
+      }
+    }
+
+    _offset = _strings.first.contentsOffset - 1;
+  }
+
+  bool moveNext() {
+    if (_done) return false;
+
+    // If we're at beginning of a [SimpleStringLiteral], move forward until
+    // there's actually text to consume.
+    while (_runes == null || _runes.current == null) {
+      if (_strings.isEmpty) {
+        // Move the offset past the end of the text.
+        _offset = _nextOffset;
+        _current = null;
+        return false;
+      }
+
+      var string = _strings.removeFirst();
+      var start = string.contentsOffset - string.offset;
+
+      // Compensate for the opening and closing quotes.
+      var end = start + string.literal.lexeme.length -
+          2 * (string.isMultiline ? 3 : 1) -
+          (string.isRaw ? 1 : 0);
+      var text = string.literal.lexeme.substring(start, end);
+
+      _nextOffset = string.contentsOffset;
+      _isRaw = string.isRaw;
+      _runes = text.runes.iterator;
+      _runes.moveNext();
+    }
+
+    _offset = _nextOffset;
+    _current = _nextRune();
+    if (_current != null) return true;
+
+    // If we encounter a parse failure, stop moving forward immediately.
+    _strings.clear();
+    return false;
+  }
+
+  /// Consume and return the next rune.
+  int _nextRune() {
+    if (_isRaw || _runes.current != _backslash) {
+      var rune = _runes.current;
+      _moveRunesNext();
+      return rune;
+    }
+
+    if (!_moveRunesNext()) return null;
+    return _parseEscapeSequence();
+  }
+
+  /// Parse an escape sequence in the underlying Dart text.
+  ///
+  /// This assumes that a backslash has already been consumed. It leaves the
+  /// [_runes] cursor on the first character after the escape sequence.
+  int _parseEscapeSequence() {
+    switch (_runes.current) {
+      case _n:
+        _moveRunesNext();
+        return _newline;
+      case _r:
+        _moveRunesNext();
+        return _carriageReturn;
+      case _f:
+        _moveRunesNext();
+        return _formFeed;
+      case _b:
+        _moveRunesNext();
+        return _backspace;
+      case _t:
+        _moveRunesNext();
+        return _tab;
+      case _v:
+        _moveRunesNext();
+        return _verticalTab;
+      case _x:
+        if (!_moveRunesNext()) return null;
+        return _parseHex(2);
+      case _u:
+        if (!_moveRunesNext()) return null;
+        if (_runes.current != _openCurly) return _parseHex(4);
+        if (!_moveRunesNext()) return null;
+
+        var number = _parseHexSequence();
+        if (_runes.current != _closeCurly) return null;
+        if (!_moveRunesNext()) return null;
+        return number;
+      default:
+        var rune = _runes.current;
+        _moveRunesNext();
+        return rune;
+    }
+  }
+
+  /// Parse a variable-length sequence of hexadecimal digits and returns their
+  /// value as an [int].
+  ///
+  /// This parses digits as they appear in a unicode escape sequence: one to six
+  /// hex digits.
+  int _parseHexSequence() {
+    var number = _parseHexDigit(_runes.current);
+    if (number == null) return null;
+    if (!_moveRunesNext()) return null;
+
+    for (var i = 0; i < 5; i++) {
+      var digit = _parseHexDigit(_runes.current);
+      if (digit == null) break;
+      number = number * 16 + digit;
+      if (!_moveRunesNext()) return null;
+    }
+
+    return number;
+  }
+
+  /// Parses [digits] hexadecimal digits and returns their value as an [int].
+  int _parseHex(int digits) {
+    var number = 0;
+    for (var i = 0; i < digits; i++) {
+      if (_runes.current == null) return null;
+      var digit = _parseHexDigit(_runes.current);
+      if (digit == null) return null;
+      number = number * 16 + digit;
+      _moveRunesNext();
+    }
+    return number;
+  }
+
+  /// Parses a single hexadecimal digit.
+  int _parseHexDigit(int rune) {
+    if (rune < _zero) return null;
+    if (rune <= _nine) return rune - _zero;
+    if (rune < _capitalA) return null;
+    if (rune <= _capitalZ) return 10 + rune - _capitalA;
+    if (rune < _a) return null;
+    if (rune <= _z) return 10 + rune - _a;
+    return null;
+  }
+
+  /// Move [_runes] to the next rune and update [_nextOffset].
+  bool _moveRunesNext() {
+    var result = _runes.moveNext();
+    _nextOffset++;
+    return result;
+  }
+}
diff --git a/mojo/public/dart/third_party/test/lib/src/utils.dart b/mojo/public/dart/third_party/test/lib/src/utils.dart
new file mode 100644
index 0000000..7793d30
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/src/utils.dart
@@ -0,0 +1,405 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.utils;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:math' as math;
+
+import 'package:crypto/crypto.dart';
+import 'package:path/path.dart' as p;
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:stack_trace/stack_trace.dart';
+
+import 'backend/operating_system.dart';
+import 'util/cancelable_future.dart';
+import 'util/path_handler.dart';
+import 'util/stream_queue.dart';
+
+/// The maximum console line length.
+const _lineLength = 100;
+
+/// A typedef for a possibly-asynchronous function.
+///
+/// The return type should only ever by [Future] or void.
+typedef AsyncFunction();
+
+/// A typedef for a zero-argument callback function.
+typedef void Callback();
+
+/// A converter that decodes bytes using UTF-8 and splits them on newlines.
+final lineSplitter = UTF8.decoder.fuse(const LineSplitter());
+
+/// A regular expression to match the exception prefix that some exceptions'
+/// [Object.toString] values contain.
+final _exceptionPrefix = new RegExp(r'^([A-Z][a-zA-Z]*)?(Exception|Error): ');
+
+/// Directories that are specific to OS X.
+///
+/// This is used to try to distinguish OS X and Linux in [currentOSGuess].
+final _macOSDirectories = new Set<String>.from([
+  "/Applications",
+  "/Library",
+  "/Network",
+  "/System",
+  "/Users"
+]);
+
+/// Returns the best guess for the current operating system without using
+/// `dart:io`.
+///
+/// This is useful for running test files directly and skipping tests as
+/// appropriate. The only OS-specific information we have is the current path,
+/// which we try to use to figure out the OS.
+final OperatingSystem currentOSGuess = (() {
+  if (p.style == p.Style.url) return OperatingSystem.none;
+  if (p.style == p.Style.windows) return OperatingSystem.windows;
+  if (_macOSDirectories.any(p.current.startsWith)) return OperatingSystem.macOS;
+  return OperatingSystem.linux;
+})();
+
+/// A pair of values.
+class Pair<E, F> {
+  E first;
+  F last;
+
+  Pair(this.first, this.last);
+
+  String toString() => '($first, $last)';
+
+  bool operator==(other) {
+    if (other is! Pair) return false;
+    return other.first == first && other.last == last;
+  }
+
+  int get hashCode => first.hashCode ^ last.hashCode;
+}
+
+/// Get a string description of an exception.
+///
+/// Many exceptions include the exception class name at the beginning of their
+/// [toString], so we remove that if it exists.
+String getErrorMessage(error) =>
+  error.toString().replaceFirst(_exceptionPrefix, '');
+
+/// Indent each line in [str] by two spaces.
+String indent(String str) =>
+    str.replaceAll(new RegExp("^", multiLine: true), "  ");
+
+/// Returns a sentence fragment listing the elements of [iter].
+///
+/// This converts each element of [iter] to a string and separates them with
+/// commas and/or "and" where appropriate.
+String toSentence(Iterable iter) {
+  if (iter.length == 1) return iter.first.toString();
+  var result = iter.take(iter.length - 1).join(", ");
+  if (iter.length > 2) result += ",";
+  return "$result and ${iter.last}";
+}
+
+/// Wraps [text] so that it fits within [lineLength], which defaults to 100
+/// characters.
+///
+/// This preserves existing newlines and doesn't consider terminal color escapes
+/// part of a word's length.
+String wordWrap(String text, {int lineLength}) {
+  if (lineLength == null) lineLength = _lineLength;
+  return text.split("\n").map((originalLine) {
+    var buffer = new StringBuffer();
+    var lengthSoFar = 0;
+    for (var word in originalLine.split(" ")) {
+      var wordLength = withoutColors(word).length;
+      if (wordLength > lineLength) {
+        if (lengthSoFar != 0) buffer.writeln();
+        buffer.writeln(word);
+      } else if (lengthSoFar == 0) {
+        buffer.write(word);
+        lengthSoFar = wordLength;
+      } else if (lengthSoFar + 1 + wordLength > lineLength) {
+        buffer.writeln();
+        buffer.write(word);
+        lengthSoFar = wordLength;
+      } else {
+        buffer.write(" $word");
+        lengthSoFar += 1 + wordLength;
+      }
+    }
+    return buffer.toString();
+  }).join("\n");
+}
+
+/// A regular expression matching terminal color codes.
+final _colorCode = new RegExp('\u001b\\[[0-9;]+m');
+
+/// Returns [str] without any color codes.
+String withoutColors(String str) => str.replaceAll(_colorCode, '');
+
+/// A regular expression matching the path to a temporary file used to start an
+/// isolate.
+///
+/// These paths aren't relevant and are removed from stack traces.
+final _isolatePath =
+    new RegExp(r"/test_[A-Za-z0-9]{6}/runInIsolate\.dart$");
+
+/// Returns [stackTrace] converted to a [Chain] with all irrelevant frames
+/// folded together.
+///
+/// If [verbose] is `true`, returns the chain for [stackTrace] unmodified.
+Chain terseChain(StackTrace stackTrace, {bool verbose: false}) {
+  if (verbose) return new Chain.forTrace(stackTrace);
+  return new Chain.forTrace(stackTrace).foldFrames((frame) {
+    if (frame.package == 'test') return true;
+
+    // Filter out frames from our isolate bootstrap as well.
+    if (frame.uri.scheme != 'file') return false;
+    return frame.uri.path.contains(_isolatePath);
+  }, terse: true);
+}
+
+/// Flattens nested [Iterable]s inside an [Iterable] into a single [List]
+/// containing only non-[Iterable] elements.
+List flatten(Iterable nested) {
+  var result = [];
+  helper(iter) {
+    for (var element in iter) {
+      if (element is Iterable) {
+        helper(element);
+      } else {
+        result.add(element);
+      }
+    }
+  }
+  helper(nested);
+  return result;
+}
+
+/// Returns a new map with all values in both [map1] and [map2].
+///
+/// If there are conflicting keys, [map2]'s value wins.
+Map mergeMaps(Map map1, Map map2) {
+  var result = {};
+  map1.forEach((key, value) {
+    result[key] = value;
+  });
+  map2.forEach((key, value) {
+    result[key] = value;
+  });
+  return result;
+}
+
+/// Returns a sink that maps events sent to [original] using [fn].
+StreamSink mapSink(StreamSink original, fn(event)) {
+  var controller = new StreamController(sync: true);
+  controller.stream.listen(
+      (event) => original.add(fn(event)),
+      onError: (error, stackTrace) => original.addError(error, stackTrace),
+      onDone: () => original.close());
+  return controller.sink;
+}
+
+/// Like [runZoned], but [zoneValues] are set for the callbacks in
+/// [zoneSpecification] and [onError].
+runZonedWithValues(body(), {Map zoneValues,
+    ZoneSpecification zoneSpecification, Function onError}) {
+  return runZoned(() {
+    return runZoned(body,
+        zoneSpecification: zoneSpecification, onError: onError);
+  }, zoneValues: zoneValues);
+}
+
+/// Truncates [text] to fit within [maxLength].
+///
+/// This will try to truncate along word boundaries and preserve words both at
+/// the beginning and the end of [text].
+String truncate(String text, int maxLength) {
+  // Return the full message if it fits.
+  if (text.length <= maxLength) return text;
+
+  // If we can fit the first and last three words, do so.
+  var words = text.split(' ');
+  if (words.length > 1) {
+    var i = words.length;
+    var length = words.first.length + 4;
+    do {
+      i--;
+      length += 1 + words[i].length;
+    } while (length <= maxLength && i > 0);
+    if (length > maxLength || i == 0) i++;
+    if (i < words.length - 4) {
+      // Require at least 3 words at the end.
+      var buffer = new StringBuffer();
+      buffer.write(words.first);
+      buffer.write(' ...');
+      for ( ; i < words.length; i++) {
+        buffer.write(' ');
+        buffer.write(words[i]);
+      }
+      return buffer.toString();
+    }
+  }
+
+  // Otherwise truncate to return the trailing text, but attempt to start at
+  // the beginning of a word.
+  var result = text.substring(text.length - maxLength + 4);
+  var firstSpace = result.indexOf(' ');
+  if (firstSpace > 0) {
+    result = result.substring(firstSpace);
+  }
+  return '...$result';
+}
+
+/// Returns a human-friendly representation of [duration].
+String niceDuration(Duration duration) {
+  var minutes = duration.inMinutes;
+  var seconds = duration.inSeconds % 59;
+  var decaseconds = (duration.inMilliseconds % 1000) ~/ 100;
+
+  var buffer = new StringBuffer();
+  if (minutes != 0) buffer.write("$minutes minutes");
+
+  if (minutes == 0 || seconds != 0) {
+    if (minutes != 0) buffer.write(", ");
+    buffer.write(seconds);
+    if (decaseconds != 0) buffer.write(".$decaseconds");
+    buffer.write(" seconds");
+  }
+
+  return buffer.toString();
+}
+
+/// Merges [streams] into a single stream that emits events from all sources.
+Stream mergeStreams(Iterable<Stream> streamIter) {
+  var streams = streamIter.toList();
+
+  var subscriptions = new Set();
+  var controller;
+  controller = new StreamController(sync: true, onListen: () {
+    for (var stream in streams) {
+      var subscription;
+      subscription = stream.listen(
+          controller.add,
+          onError: controller.addError,
+          onDone: () {
+        subscriptions.remove(subscription);
+        if (subscriptions.isEmpty) controller.close();
+      });
+      subscriptions.add(subscription);
+    }
+  }, onPause: () {
+    for (var subscription in subscriptions) {
+      subscription.pause();
+    }
+  }, onResume: () {
+    for (var subscription in subscriptions) {
+      subscription.resume();
+    }
+  }, onCancel: () {
+    for (var subscription in subscriptions) {
+      subscription.cancel();
+    }
+  });
+
+  return controller.stream;
+}
+
+/// Returns the first value [stream] emits, or `null` if [stream] closes before
+/// emitting a value.
+Future maybeFirst(Stream stream) {
+  var completer = new Completer();
+
+  var subscription;
+  subscription = stream.listen((data) {
+    completer.complete(data);
+    subscription.cancel();
+  }, onError: (error, stackTrace) {
+    completer.completeError(error, stackTrace);
+    subscription.cancel();
+  }, onDone: () {
+    completer.complete();
+  });
+
+  return completer.future;
+}
+
+/// Returns a [CancelableFuture] that returns the next value of [queue] unless
+/// it's canceled.
+///
+/// If the future is canceled, [queue] is not moved forward at all. Note that
+/// it's not safe to call further methods on [queue] until this future has
+/// either completed or been canceled.
+CancelableFuture cancelableNext(StreamQueue queue) {
+  var fork = queue.fork();
+  var completer = new CancelableCompleter(() => fork.cancel(immediate: true));
+  completer.complete(fork.next.then((_) {
+    fork.cancel();
+    return queue.next;
+  }));
+  return completer.future;
+}
+
+/// Returns a single-subscription stream that emits the results of [futures] in
+/// the order they complete.
+///
+/// If any futures in [futures] are [CancelableFuture]s, this will cancel them
+/// if the subscription is canceled.
+Stream inCompletionOrder(Iterable<Future> futures) {
+  var futureSet = futures.toSet();
+  var controller = new StreamController(sync: true, onCancel: () {
+    return Future.wait(futureSet.map((future) {
+      return future is CancelableFuture ? future.cancel() : null;
+    }).where((future) => future != null));
+  });
+
+  for (var future in futureSet) {
+    future.then(controller.add).catchError(controller.addError)
+        .whenComplete(() {
+      futureSet.remove(future);
+      if (futureSet.isEmpty) controller.close();
+    });
+  }
+
+  return controller.stream;
+}
+
+/// Returns a stream that emits [error] and [stackTrace], then closes.
+///
+/// This is useful for adding errors to streams defined via `async*`.
+Stream errorStream(error, StackTrace stackTrace) {
+  var controller = new StreamController();
+  controller.addError(error, stackTrace);
+  controller.close();
+  return controller.stream;
+}
+
+/// Runs [fn] and discards its return value.
+///
+/// This is useful for making a block of code async without forcing the
+/// containing method to return a future.
+void invoke(fn()) {
+  fn();
+}
+
+/// Returns a random base64 string containing [bytes] bytes of data.
+///
+/// [seed] is passed to [math.Random]; [urlSafe] and [addLineSeparator] are
+/// passed to [CryptoUtils.bytesToBase64].
+String randomBase64(int bytes, {int seed, bool urlSafe: false,
+    bool addLineSeparator: false}) {
+  var random = new math.Random(seed);
+  var data = [];
+  for (var i = 0; i < bytes; i++) {
+    data.add(random.nextInt(256));
+  }
+  return CryptoUtils.bytesToBase64(data,
+      urlSafe: urlSafe, addLineSeparator: addLineSeparator);
+}
+
+/// Returns middleware that nests all requests beneath the URL prefix [beneath].
+shelf.Middleware nestingMiddleware(String beneath) {
+  return (handler) {
+    var pathHandler = new PathHandler()..add(beneath, handler);
+    return pathHandler.handler;
+  };
+}
diff --git a/mojo/public/dart/third_party/test/lib/test.dart b/mojo/public/dart/third_party/test/lib/test.dart
new file mode 100644
index 0000000..c74ac9a
--- /dev/null
+++ b/mojo/public/dart/third_party/test/lib/test.dart
@@ -0,0 +1,189 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test;
+
+import 'dart:async';
+
+import 'package:path/path.dart' as p;
+
+import 'src/backend/declarer.dart';
+import 'src/backend/test_platform.dart';
+import 'src/frontend/timeout.dart';
+import 'src/runner/engine.dart';
+import 'src/runner/reporter/expanded.dart';
+import 'src/runner/runner_suite.dart';
+import 'src/runner/vm/environment.dart';
+import 'src/utils.dart';
+
+export 'package:matcher/matcher.dart';
+
+export 'src/frontend/expect.dart';
+export 'src/frontend/expect_async.dart';
+export 'src/frontend/future_matchers.dart';
+export 'src/frontend/on_platform.dart';
+export 'src/frontend/prints_matcher.dart';
+export 'src/frontend/skip.dart';
+export 'src/frontend/test_on.dart';
+export 'src/frontend/throws_matcher.dart';
+export 'src/frontend/throws_matchers.dart';
+export 'src/frontend/timeout.dart';
+
+/// The global declarer.
+///
+/// This is used if a test file is run directly, rather than through the runner.
+Declarer _globalDeclarer;
+
+/// Gets the declarer for the current scope.
+///
+/// When using the runner, this returns the [Zone]-scoped declarer that's set by
+/// [IsolateListener] or [IframeListener]. If the test file is run directly,
+/// this returns [_globalDeclarer] (and sets it up on the first call).
+Declarer get _declarer {
+  var declarer = Zone.current[#test.declarer];
+  if (declarer != null) return declarer;
+  if (_globalDeclarer != null) return _globalDeclarer;
+
+  // Since there's no Zone-scoped declarer, the test file is being run directly.
+  // In order to run the tests, we set up our own Declarer via
+  // [_globalDeclarer], and schedule a microtask to run the tests once they're
+  // finished being defined.
+  _globalDeclarer = new Declarer();
+  scheduleMicrotask(() async {
+    var suite = new RunnerSuite(
+        // TODO(nweiz): Use a different environment if VM environment starts
+        // import dart:io before cross-platform libraries exist.
+        const VMEnvironment(),
+        _globalDeclarer.tests,
+        path: p.prettyUri(Uri.base),
+        platform: TestPlatform.vm,
+        os: currentOSGuess);
+
+    var engine = new Engine();
+    engine.suiteSink.add(suite);
+    engine.suiteSink.close();
+    ExpandedReporter.watch(engine,
+        color: true, printPath: false, printPlatform: false);
+
+    var success = await engine.run();
+    // TODO(nweiz): Set the exit code on the VM when issue 6943 is fixed.
+    if (success) return;
+    print('');
+    new Future.error("Dummy exception to set exit code.");
+  });
+  return _globalDeclarer;
+}
+
+// TODO(nweiz): This and other top-level functions should throw exceptions if
+// they're called after the declarer has finished declaring.
+/// Creates a new test case with the given description and body.
+///
+/// The description will be added to the descriptions of any surrounding
+/// [group]s. If [testOn] is passed, it's parsed as a [platform selector][]; the
+/// test will only be run on matching platforms.
+///
+/// [platform selector]: https://github.com/dart-lang/test/#platform-selector-syntax
+///
+/// If [timeout] is passed, it's used to modify or replace the default timeout
+/// of 30 seconds. Timeout modifications take precedence in suite-group-test
+/// order, so [timeout] will also modify any timeouts set on the group or suite.
+///
+/// If [skip] is a String or `true`, the test is skipped. If it's a String, it
+/// should explain why the test is skipped; this reason will be printed instead
+/// of running the test.
+///
+/// [onPlatform] allows tests to be configured on a platform-by-platform
+/// basis. It's a map from strings that are parsed as [PlatformSelector]s to
+/// annotation classes: [Timeout], [Skip], or lists of those. These
+/// annotations apply only on the given platforms. For example:
+///
+///     test("potentially slow test", () {
+///       // ...
+///     }, onPlatform: {
+///       // This test is especially slow on Windows.
+///       "windows": new Timeout.factor(2),
+///       "browser": [
+///         new Skip("TODO: add browser support"),
+///         // This will be slow on browsers once it works on them.
+///         new Timeout.factor(2)
+///       ]
+///     });
+///
+/// If multiple platforms match, the annotations apply in order as through
+/// they were in nested groups.
+void test(String description, body(), {String testOn, Timeout timeout,
+        skip, Map<String, dynamic> onPlatform}) =>
+    _declarer.test(description, body,
+        testOn: testOn, timeout: timeout, skip: skip, onPlatform: onPlatform);
+
+/// Creates a group of tests.
+///
+/// A group's description is included in the descriptions of any tests or
+/// sub-groups it contains. [setUp] and [tearDown] are also scoped to the
+/// containing group.
+///
+/// If [testOn] is passed, it's parsed as a [platform selector][]; the test will
+/// only be run on matching platforms.
+///
+/// [platform selector]: https://github.com/dart-lang/test/#platform-selector-syntax
+///
+/// If [timeout] is passed, it's used to modify or replace the default timeout
+/// of 30 seconds. Timeout modifications take precedence in suite-group-test
+/// order, so [timeout] will also modify any timeouts set on the suite, and will
+/// be modified by any timeouts set on individual tests.
+///
+/// If [skip] is a String or `true`, the group is skipped. If it's a String, it
+/// should explain why the group is skipped; this reason will be printed instead
+/// of running the group's tests.
+///
+/// [onPlatform] allows groups to be configured on a platform-by-platform
+/// basis. It's a map from strings that are parsed as [PlatformSelector]s to
+/// annotation classes: [Timeout], [Skip], or lists of those. These
+/// annotations apply only on the given platforms. For example:
+///
+///     group("potentially slow tests", () {
+///       // ...
+///     }, onPlatform: {
+///       // These tests are especially slow on Windows.
+///       "windows": new Timeout.factor(2),
+///       "browser": [
+///         new Skip("TODO: add browser support"),
+///         // They'll be slow on browsers once it works on them.
+///         new Timeout.factor(2)
+///       ]
+///     });
+///
+/// If multiple platforms match, the annotations apply in order as through
+/// they were in nested groups.
+void group(String description, void body(), {String testOn, Timeout timeout,
+        skip, Map<String, dynamic> onPlatform}) =>
+    _declarer.group(description, body,
+        testOn: testOn, timeout: timeout, skip: skip);
+
+/// Registers a function to be run before tests.
+///
+/// This function will be called before each test is run. [callback] may be
+/// asynchronous; if so, it must return a [Future].
+///
+/// If this is called within a test group, it applies only to tests in that
+/// group. [callback] will be run after any set-up callbacks in parent groups or
+/// at the top level.
+void setUp(callback()) => _declarer.setUp(callback);
+
+/// Registers a function to be run after tests.
+///
+/// This function will be called after each test is run. [callback] may be
+/// asynchronous; if so, it must return a [Future].
+///
+/// If this is called within a test group, it applies only to tests in that
+/// group. [callback] will be run before any tear-down callbacks in parent
+/// groups or at the top level.
+void tearDown(callback()) => _declarer.tearDown(callback);
+
+/// Registers an exception that was caught for the current test.
+void registerException(error, [StackTrace stackTrace]) {
+  // This will usually forward directly to [Invoker.current.handleError], but
+  // going through the zone API allows other zones to consistently see errors.
+  Zone.current.handleUncaughtError(error, stackTrace);
+}
diff --git a/mojo/public/dart/third_party/test/pubspec.yaml b/mojo/public/dart/third_party/test/pubspec.yaml
new file mode 100644
index 0000000..b917983
--- /dev/null
+++ b/mojo/public/dart/third_party/test/pubspec.yaml
@@ -0,0 +1,36 @@
+name: test
+version: 0.12.4+7
+author: Dart Team <misc@dartlang.org>
+description: A library for writing dart unit tests.
+homepage: https://github.com/dart-lang/test
+environment:
+  sdk: '>=1.11.0 <1.14.0'
+dependencies:
+  analyzer: '>=0.23.0 <0.27.0'
+  args: '>=0.12.1 <0.14.0'
+  async: '>=1.3.0 <2.0.0'
+  barback: '>=0.14.0 <0.16.0'
+  collection: '^1.1.0'
+  crypto: '^0.9.0'
+  glob: '^1.0.0'
+  http_multi_server: '^1.0.0'
+  http_parser: '>=0.0.2 <2.0.0'
+  path: '^1.2.0'
+  pool: '^1.1.0'
+  pub_semver: '^1.0.0'
+  shelf: '>=0.6.0 <0.7.0'
+  shelf_static: '^0.2.0'
+  shelf_web_socket: '^0.0.1'
+  source_map_stack_trace: '^1.0.0'
+  source_maps: '^0.10.1'
+  source_span: '^1.0.0'
+  stack_trace: '^1.2.1'
+  string_scanner: '^0.1.1'
+  yaml: '>=0.9.0 <3.0.0'
+
+  # Use a tight version constraint to ensure that a constraint on matcher
+  # properly constrains all features it provides.
+  matcher: '>=0.12.0 <0.12.1'
+dev_dependencies:
+  fake_async: '^0.1.2'
+  scheduled_test: '^0.12.2'
diff --git a/mojo/public/dart/third_party/test/test/backend/declarer_test.dart b/mojo/public/dart/third_party/test/test/backend/declarer_test.dart
new file mode 100644
index 0000000..91a806e
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/backend/declarer_test.dart
@@ -0,0 +1,359 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:test/src/backend/declarer.dart';
+import 'package:test/src/backend/suite.dart';
+import 'package:test/src/frontend/timeout.dart';
+import 'package:test/test.dart';
+
+Declarer _declarer;
+Suite _suite;
+
+void main() {
+  setUp(() {
+    _declarer = new Declarer();
+    _suite = new Suite([]);
+  });
+
+  group(".test()", () {
+    test("declares a test with a description and body", () async {
+      var bodyRun = false;
+      _declarer.test("description", () {
+        bodyRun = true;
+      });
+
+      expect(_declarer.tests, hasLength(1));
+      expect(_declarer.tests.single.name, equals("description"));
+
+      await _runTest(0);
+      expect(bodyRun, isTrue);
+    });
+
+    test("declares multiple tests", () {
+      _declarer.test("description 1", () {});
+      _declarer.test("description 2", () {});
+      _declarer.test("description 3", () {});
+
+      expect(_declarer.tests, hasLength(3));
+      expect(_declarer.tests[0].name, equals("description 1"));
+      expect(_declarer.tests[1].name, equals("description 2"));
+      expect(_declarer.tests[2].name, equals("description 3"));
+    });
+  });
+
+  group(".setUp()", () {
+    test("is run before all tests", () async {
+      var setUpRun = false;
+      _declarer.setUp(() => setUpRun = true);
+
+      _declarer.test("description 1", expectAsync(() {
+        expect(setUpRun, isTrue);
+        setUpRun = false;
+      }, max: 1));
+
+      _declarer.test("description 2", expectAsync(() {
+        expect(setUpRun, isTrue);
+        setUpRun = false;
+      }, max: 1));
+
+      await _runTest(0);
+      await _runTest(1);
+    });
+
+    test("can return a Future", () {
+      var setUpRun = false;
+      _declarer.setUp(() {
+        return new Future(() => setUpRun = true);
+      });
+
+      _declarer.test("description", expectAsync(() {
+        expect(setUpRun, isTrue);
+      }, max: 1));
+
+      return _runTest(0);
+    });
+
+    test("can't be called multiple times", () {
+      _declarer.setUp(() {});
+      expect(() => _declarer.setUp(() {}), throwsStateError);
+    });
+  });
+
+  group(".tearDown()", () {
+    test("is run after all tests", () async {
+      var tearDownRun;
+      _declarer.setUp(() => tearDownRun = false);
+      _declarer.tearDown(() => tearDownRun = true);
+
+      _declarer.test("description 1", expectAsync(() {
+        expect(tearDownRun, isFalse);
+      }, max: 1));
+
+      _declarer.test("description 2", expectAsync(() {
+        expect(tearDownRun, isFalse);
+      }, max: 1));
+
+      await _runTest(0);
+      expect(tearDownRun, isTrue);
+      await _runTest(1);
+      expect(tearDownRun, isTrue);
+    });
+
+    test("can return a Future", () async {
+      var tearDownRun = false;
+      _declarer.tearDown(() {
+        return new Future(() => tearDownRun = true);
+      });
+
+      _declarer.test("description", expectAsync(() {
+        expect(tearDownRun, isFalse);
+      }, max: 1));
+
+      await _runTest(0);
+      expect(tearDownRun, isTrue);
+    });
+
+    test("can't be called multiple times", () {
+      _declarer.tearDown(() {});
+      expect(() => _declarer.tearDown(() {}), throwsStateError);
+    });
+  });
+
+  group("in a group,", () {
+    test("tests inherit the group's description", () {
+      _declarer.group("group", () {
+        _declarer.test("description", () {});
+      });
+
+      expect(_declarer.tests, hasLength(1));
+      expect(_declarer.tests.single.name, "group description");
+    });
+
+    test("a test's timeout factor is applied to the group's", () {
+      _declarer.group("group", () {
+        _declarer.test("test", () {},
+            timeout: new Timeout.factor(3));
+      }, timeout: new Timeout.factor(2));
+
+      expect(_declarer.tests, hasLength(1));
+      expect(_declarer.tests.single.metadata.timeout.scaleFactor, equals(6));
+    });
+
+    test("a test's timeout factor is applied to the group's duration", () {
+      _declarer.group("group", () {
+        _declarer.test("test", () {},
+            timeout: new Timeout.factor(2));
+      }, timeout: new Timeout(new Duration(seconds: 10)));
+
+      expect(_declarer.tests, hasLength(1));
+      expect(_declarer.tests.single.metadata.timeout.duration,
+          equals(new Duration(seconds: 20)));
+    });
+
+    test("a test's timeout duration is applied over the group's", () {
+      _declarer.group("group", () {
+        _declarer.test("test", () {},
+            timeout: new Timeout(new Duration(seconds: 15)));
+      }, timeout: new Timeout(new Duration(seconds: 10)));
+
+      expect(_declarer.tests, hasLength(1));
+      expect(_declarer.tests.single.metadata.timeout.duration,
+          equals(new Duration(seconds: 15)));
+    });
+
+    group(".setUp()", () {
+      test("is scoped to the group", () async {
+        var setUpRun = false;
+        _declarer.group("group", () {
+          _declarer.setUp(() => setUpRun = true);
+
+          _declarer.test("description 1", expectAsync(() {
+            expect(setUpRun, isTrue);
+            setUpRun = false;
+          }, max: 1));
+        });
+
+        _declarer.test("description 2", expectAsync(() {
+          expect(setUpRun, isFalse);
+          setUpRun = false;
+        }, max: 1));
+
+        await _runTest(0);
+        await _runTest(1);
+      });
+
+      test("runs from the outside in", () {
+        var outerSetUpRun = false;
+        var middleSetUpRun = false;
+        var innerSetUpRun = false;
+        _declarer.setUp(expectAsync(() {
+          expect(middleSetUpRun, isFalse);
+          expect(innerSetUpRun, isFalse);
+          outerSetUpRun = true;
+        }, max: 1));
+
+        _declarer.group("middle", () {
+          _declarer.setUp(expectAsync(() {
+            expect(outerSetUpRun, isTrue);
+            expect(innerSetUpRun, isFalse);
+            middleSetUpRun = true;
+          }, max: 1));
+
+          _declarer.group("inner", () {
+            _declarer.setUp(expectAsync(() {
+              expect(outerSetUpRun, isTrue);
+              expect(middleSetUpRun, isTrue);
+              innerSetUpRun = true;
+            }, max: 1));
+
+            _declarer.test("description", expectAsync(() {
+              expect(outerSetUpRun, isTrue);
+              expect(middleSetUpRun, isTrue);
+              expect(innerSetUpRun, isTrue);
+            }, max: 1));
+          });
+        });
+
+        return _runTest(0);
+      });
+
+      test("handles Futures when chained", () {
+        var outerSetUpRun = false;
+        var innerSetUpRun = false;
+        _declarer.setUp(expectAsync(() {
+          expect(innerSetUpRun, isFalse);
+          return new Future(() => outerSetUpRun = true);
+        }, max: 1));
+
+        _declarer.group("inner", () {
+          _declarer.setUp(expectAsync(() {
+            expect(outerSetUpRun, isTrue);
+            return new Future(() => innerSetUpRun = true);
+          }, max: 1));
+
+          _declarer.test("description", expectAsync(() {
+            expect(outerSetUpRun, isTrue);
+            expect(innerSetUpRun, isTrue);
+          }, max: 1));
+        });
+
+        return _runTest(0);
+      });
+
+      test("can't be called multiple times", () {
+        _declarer.group("group", () {
+          _declarer.setUp(() {});
+          expect(() => _declarer.setUp(() {}), throwsStateError);
+        });
+      });
+    });
+
+    group(".tearDown()", () {
+      test("is scoped to the group", () async {
+        var tearDownRun;
+        _declarer.setUp(() => tearDownRun = false);
+
+        _declarer.group("group", () {
+          _declarer.tearDown(() => tearDownRun = true);
+
+          _declarer.test("description 1", expectAsync(() {
+            expect(tearDownRun, isFalse);
+          }, max: 1));
+        });
+
+        _declarer.test("description 2", expectAsync(() {
+          expect(tearDownRun, isFalse);
+        }, max: 1));
+
+        await _runTest(0);
+        expect(tearDownRun, isTrue);
+        await _runTest(1);
+        expect(tearDownRun, isFalse);
+      });
+
+      test("runs from the inside out", () async {
+        var innerTearDownRun = false;
+        var middleTearDownRun = false;
+        var outerTearDownRun = false;
+        _declarer.tearDown(expectAsync(() {
+          expect(innerTearDownRun, isTrue);
+          expect(middleTearDownRun, isTrue);
+          outerTearDownRun = true;
+        }, max: 1));
+
+        _declarer.group("middle", () {
+          _declarer.tearDown(expectAsync(() {
+            expect(innerTearDownRun, isTrue);
+            expect(outerTearDownRun, isFalse);
+            middleTearDownRun = true;
+          }, max: 1));
+
+          _declarer.group("inner", () {
+            _declarer.tearDown(expectAsync(() {
+              expect(outerTearDownRun, isFalse);
+              expect(middleTearDownRun, isFalse);
+              innerTearDownRun = true;
+            }, max: 1));
+
+            _declarer.test("description", expectAsync(() {
+              expect(outerTearDownRun, isFalse);
+              expect(middleTearDownRun, isFalse);
+              expect(innerTearDownRun, isFalse);
+            }, max: 1));
+          });
+        });
+
+        await _runTest(0);
+        expect(innerTearDownRun, isTrue);
+        expect(middleTearDownRun, isTrue);
+        expect(outerTearDownRun, isTrue);
+      });
+
+      test("handles Futures when chained", () async {
+        var outerTearDownRun = false;
+        var innerTearDownRun = false;
+        _declarer.tearDown(expectAsync(() {
+          expect(innerTearDownRun, isTrue);
+          return new Future(() => outerTearDownRun = true);
+        }, max: 1));
+
+        _declarer.group("inner", () {
+          _declarer.tearDown(expectAsync(() {
+            expect(outerTearDownRun, isFalse);
+            return new Future(() => innerTearDownRun = true);
+          }, max: 1));
+
+          _declarer.test("description", expectAsync(() {
+            expect(outerTearDownRun, isFalse);
+            expect(innerTearDownRun, isFalse);
+          }, max: 1));
+        });
+
+        await _runTest(0);
+        expect(innerTearDownRun, isTrue);
+        expect(outerTearDownRun, isTrue);
+      });
+
+      test("can't be called multiple times", () {
+        _declarer.group("group", () {
+          _declarer.tearDown(() {});
+          expect(() => _declarer.tearDown(() {}), throwsStateError);
+        });
+      });
+    });
+  });
+}
+
+/// Runs the test at [index] defined on [_declarer].
+///
+/// This automatically sets up an `onError` listener to ensure that the test
+/// doesn't throw any invisible exceptions.
+Future _runTest(int index) {
+  var liveTest = _declarer.tests[index].load(_suite);
+  liveTest.onError.listen(expectAsync((_) {},
+      count: 0, reason: "No errors expected for test #$index."));
+  return liveTest.run();
+}
diff --git a/mojo/public/dart/third_party/test/test/backend/invoker_test.dart b/mojo/public/dart/third_party/test/test/backend/invoker_test.dart
new file mode 100644
index 0000000..1cc014d
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/backend/invoker_test.dart
@@ -0,0 +1,700 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:fake_async/fake_async.dart';
+import 'package:test/src/backend/invoker.dart';
+import 'package:test/src/backend/metadata.dart';
+import 'package:test/src/backend/state.dart';
+import 'package:test/src/backend/suite.dart';
+import 'package:test/test.dart';
+
+import '../utils.dart';
+
+void main() {
+  var suite;
+  setUp(() {
+    lastState = null;
+    suite = new Suite([]);
+  });
+
+  group("Invoker.current", () {
+    var invoker = Invoker.current;
+    test("returns null outside of a test body", () {
+      expect(invoker, isNull);
+    });
+
+    test("returns the current invoker in a test body", () async {
+      var invoker;
+      var liveTest = _localTest(() {
+        invoker = Invoker.current;
+      }).load(suite);
+      liveTest.onError.listen(expectAsync((_) {}, count: 0));
+
+      await liveTest.run();
+      expect(invoker.liveTest, equals(liveTest));
+    });
+
+    test("returns the current invoker in a test body after the test completes",
+        () async {
+      var status;
+      var completer = new Completer();
+      var liveTest = _localTest(() {
+        // Use [new Future] in particular to wait longer than a microtask for
+        // the test to complete.
+        new Future(() {
+          status = Invoker.current.liveTest.state.status;
+          completer.complete(Invoker.current);
+        });
+      }).load(suite);
+      liveTest.onError.listen(expectAsync((_) {}, count: 0));
+
+      expect(liveTest.run(), completes);
+      var invoker = await completer.future;
+      expect(invoker.liveTest, equals(liveTest));
+      expect(status, equals(Status.complete));
+    });
+
+    test("returns the current invoker in a tearDown body", () async {
+      var invoker;
+      var liveTest = _localTest(() {}, tearDown: () {
+        invoker = Invoker.current;
+      }).load(suite);
+      liveTest.onError.listen(expectAsync((_) {}, count: 0));
+
+      await liveTest.run();
+      expect(invoker.liveTest, equals(liveTest));
+    });
+
+    test("returns the current invoker in a tearDown body after the test "
+        "completes", () async {
+      var status;
+      var completer = new Completer();
+      var liveTest = _localTest(() {}, tearDown: () {
+        // Use [new Future] in particular to wait longer than a microtask for
+        // the test to complete.
+        new Future(() {
+          status = Invoker.current.liveTest.state.status;
+          completer.complete(Invoker.current);
+        });
+      }).load(suite);
+      liveTest.onError.listen(expectAsync((_) {}, count: 0));
+
+      expect(liveTest.run(), completes);
+      var invoker = await completer.future;
+      expect(invoker.liveTest, equals(liveTest));
+      expect(status, equals(Status.complete));
+    });
+  });
+
+  group("in a successful test,", () {
+    test("the state changes from pending to running to complete", () async {
+      var stateInTest;
+      var stateInTearDown;
+      var liveTest;
+      liveTest = _localTest(() {
+        stateInTest = liveTest.state;
+      }, tearDown: () {
+        stateInTearDown = liveTest.state;
+      }).load(suite);
+      liveTest.onError.listen(expectAsync((_) {}, count: 0));
+
+      expect(liveTest.state.status, equals(Status.pending));
+      expect(liveTest.state.result, equals(Result.success));
+
+      var future = liveTest.run();
+
+      expect(liveTest.state.status, equals(Status.running));
+      expect(liveTest.state.result, equals(Result.success));
+
+      await future;
+
+      expect(stateInTest.status, equals(Status.running));
+      expect(stateInTest.result, equals(Result.success));
+
+      expect(stateInTearDown.status, equals(Status.running));
+      expect(stateInTearDown.result, equals(Result.success));
+
+      expect(liveTest.state.status, equals(Status.complete));
+      expect(liveTest.state.result, equals(Result.success));
+    });
+
+    test("onStateChange fires for each state change", () {
+      var liveTest = _localTest(() {}).load(suite);
+      liveTest.onError.listen(expectAsync((_) {}, count: 0));
+
+      var first = true;
+      liveTest.onStateChange.listen(expectAsync((state) {
+        if (first) {
+          expect(state.status, equals(Status.running));
+          first = false;
+        } else {
+          expect(state.status, equals(Status.complete));
+        }
+        expect(state.result, equals(Result.success));
+      }, count: 2, max: 2));
+
+      return liveTest.run();
+    });
+
+    test("onComplete completes once the test body and tearDown are done", () {
+      var testRun = false;
+      var tearDownRun = false;
+      var liveTest = _localTest(() {
+        testRun = true;
+      }, tearDown: () {
+        tearDownRun = true;
+      }).load(suite);
+
+      expect(liveTest.onComplete.then((_) {
+        expect(testRun, isTrue);
+        expect(tearDownRun, isTrue);
+      }), completes);
+
+      return liveTest.run();
+    });
+  });
+
+  group("in a test with failures,", () {
+    test("a synchronous throw is reported and causes the test to fail", () {
+      var liveTest = _localTest(() {
+        throw new TestFailure('oh no');
+      }).load(suite);
+
+      expectSingleFailure(liveTest);
+      return liveTest.run();
+    });
+
+    test("a synchronous reported failure causes the test to fail", () {
+      var liveTest = _localTest(() {
+        registerException(new TestFailure("oh no"));
+      }).load(suite);
+
+      expectSingleFailure(liveTest);
+      return liveTest.run();
+    });
+
+    test("a failure reported asynchronously during the test causes it to fail",
+        () {
+      var liveTest = _localTest(() {
+        Invoker.current.addOutstandingCallback();
+        new Future(() => registerException(new TestFailure("oh no")));
+      }).load(suite);
+
+      expectSingleFailure(liveTest);
+      return liveTest.run();
+    });
+
+    test("a failure thrown asynchronously during the test causes it to fail",
+        () {
+      var liveTest = _localTest(() {
+        Invoker.current.addOutstandingCallback();
+        new Future(() => throw new TestFailure("oh no"));
+      }).load(suite);
+
+      expectSingleFailure(liveTest);
+      return liveTest.run();
+    });
+
+    test("a failure reported asynchronously after the test causes it to error",
+        () {
+      var liveTest = _localTest(() {
+        new Future(() => registerException(new TestFailure("oh no")));
+      }).load(suite);
+
+      expectStates(liveTest, [
+        const State(Status.running, Result.success),
+        const State(Status.complete, Result.success),
+        const State(Status.complete, Result.failure),
+        const State(Status.complete, Result.error)
+      ]);
+
+      expectErrors(liveTest, [(error) {
+        expect(lastState, equals(const State(Status.complete, Result.failure)));
+        expect(error, isTestFailure("oh no"));
+      }, (error) {
+        expect(lastState, equals(const State(Status.complete, Result.error)));
+        expect(error, equals(
+             "This test failed after it had already completed. Make sure to "
+                 "use [expectAsync]\n"
+             "or the [completes] matcher when testing async code."));
+      }]);
+
+      return liveTest.run();
+    });
+
+    test("multiple asynchronous failures are reported", () {
+      var liveTest = _localTest(() {
+        Invoker.current.addOutstandingCallback();
+        new Future(() => throw new TestFailure("one"));
+        new Future(() => throw new TestFailure("two"));
+        new Future(() => throw new TestFailure("three"));
+        new Future(() => throw new TestFailure("four"));
+      }).load(suite);
+
+      expectStates(liveTest, [
+        const State(Status.running, Result.success),
+        const State(Status.complete, Result.failure)
+      ]);
+
+      expectErrors(liveTest, [(error) {
+        expect(lastState.status, equals(Status.complete));
+        expect(error, isTestFailure("one"));
+      }, (error) {
+        expect(error, isTestFailure("two"));
+      }, (error) {
+        expect(error, isTestFailure("three"));
+      }, (error) {
+        expect(error, isTestFailure("four"));
+      }]);
+
+      return liveTest.run();
+    });
+
+    test("a failure after an error doesn't change the state of the test", () {
+      var liveTest = _localTest(() {
+        new Future(() => throw new TestFailure("fail"));
+        throw "error";
+      }).load(suite);
+
+      expectStates(liveTest, [
+        const State(Status.running, Result.success),
+        const State(Status.complete, Result.error)
+      ]);
+
+      expectErrors(liveTest, [(error) {
+        expect(lastState, equals(const State(Status.complete, Result.error)));
+        expect(error, equals("error"));
+      }, (error) {
+        expect(error, isTestFailure("fail"));
+      }]);
+
+      return liveTest.run();
+    });
+
+    test("tearDown is run after an asynchronous failure", () async {
+      var stateDuringTearDown;
+      var liveTest;
+      liveTest = _localTest(() {
+        Invoker.current.addOutstandingCallback();
+        new Future(() => throw new TestFailure("oh no"));
+      }, tearDown: () {
+        stateDuringTearDown = liveTest.state;
+      }).load(suite);
+
+      expectSingleFailure(liveTest);
+      await liveTest.run();
+      expect(stateDuringTearDown,
+          equals(const State(Status.complete, Result.failure)));
+    });
+  });
+
+  group("in a test with errors,", () {
+    test("a synchronous throw is reported and causes the test to error", () {
+      var liveTest = _localTest(() {
+        throw 'oh no';
+      }).load(suite);
+
+      expectSingleError(liveTest);
+      return liveTest.run();
+    });
+
+    test("a synchronous reported error causes the test to error", () {
+      var liveTest = _localTest(() {
+        registerException("oh no");
+      }).load(suite);
+
+      expectSingleError(liveTest);
+      return liveTest.run();
+    });
+
+    test("an error reported asynchronously during the test causes it to error",
+        () {
+      var liveTest = _localTest(() {
+        Invoker.current.addOutstandingCallback();
+        new Future(() => registerException("oh no"));
+      }).load(suite);
+
+      expectSingleError(liveTest);
+      return liveTest.run();
+    });
+
+    test("an error thrown asynchronously during the test causes it to error",
+        () {
+      var liveTest = _localTest(() {
+        Invoker.current.addOutstandingCallback();
+        new Future(() => throw "oh no");
+      }).load(suite);
+
+      expectSingleError(liveTest);
+      return liveTest.run();
+    });
+
+    test("an error reported asynchronously after the test causes it to error",
+        () {
+      var liveTest = _localTest(() {
+        new Future(() => registerException("oh no"));
+      }).load(suite);
+
+      expectStates(liveTest, [
+        const State(Status.running, Result.success),
+        const State(Status.complete, Result.success),
+        const State(Status.complete, Result.error)
+      ]);
+
+      expectErrors(liveTest, [(error) {
+        expect(lastState, equals(const State(Status.complete, Result.error)));
+        expect(error, equals("oh no"));
+      }, (error) {
+        expect(error, equals(
+             "This test failed after it had already completed. Make sure to "
+                 "use [expectAsync]\n"
+             "or the [completes] matcher when testing async code."));
+      }]);
+
+      return liveTest.run();
+    });
+
+    test("multiple asynchronous errors are reported", () {
+      var liveTest = _localTest(() {
+        Invoker.current.addOutstandingCallback();
+        new Future(() => throw "one");
+        new Future(() => throw "two");
+        new Future(() => throw "three");
+        new Future(() => throw "four");
+      }).load(suite);
+
+      expectStates(liveTest, [
+        const State(Status.running, Result.success),
+        const State(Status.complete, Result.error)
+      ]);
+
+      expectErrors(liveTest, [(error) {
+        expect(lastState.status, equals(Status.complete));
+        expect(error, equals("one"));
+      }, (error) {
+        expect(error, equals("two"));
+      }, (error) {
+        expect(error, equals("three"));
+      }, (error) {
+        expect(error, equals("four"));
+      }]);
+
+      return liveTest.run();
+    });
+
+    test("an error after a failure changes the state of the test", () {
+      var liveTest = _localTest(() {
+        new Future(() => throw "error");
+        throw new TestFailure("fail");
+      }).load(suite);
+
+      expectStates(liveTest, [
+        const State(Status.running, Result.success),
+        const State(Status.complete, Result.failure),
+        const State(Status.complete, Result.error)
+      ]);
+
+      expectErrors(liveTest, [(error) {
+        expect(lastState, equals(const State(Status.complete, Result.failure)));
+        expect(error, isTestFailure("fail"));
+      }, (error) {
+        expect(lastState, equals(const State(Status.complete, Result.error)));
+        expect(error, equals("error"));
+      }]);
+
+      return liveTest.run();
+    });
+
+    test("tearDown is run after an asynchronous error", () async {
+      var stateDuringTearDown;
+      var liveTest;
+      liveTest = _localTest(() {
+        Invoker.current.addOutstandingCallback();
+        new Future(() => throw "oh no");
+      }, tearDown: () {
+        stateDuringTearDown = liveTest.state;
+      }).load(suite);
+
+      expectSingleError(liveTest);
+      await liveTest.run();
+      expect(stateDuringTearDown,
+          equals(const State(Status.complete, Result.error)));
+    });
+
+    test("an asynchronous error in tearDown causes the test to error", () {
+      var liveTest = _localTest(() {}, tearDown: () {
+        Invoker.current.addOutstandingCallback();
+        new Future(() => throw "oh no");
+      }).load(suite);
+
+      expectSingleError(liveTest);
+      return liveTest.run();
+    });
+
+    test("an error reported in the test body after tearDown begins running "
+        "doesn't stop tearDown", () async {
+      var tearDownComplete = false;;
+      var completer = new Completer();
+
+      var liveTest;
+      liveTest = _localTest(() {
+        completer.future.then((_) => throw "not again");
+        throw "oh no";
+      }, tearDown: () {
+        completer.complete();
+
+        // Pump the event queue so that we will run the following code after the
+        // test body has thrown a second error.
+        Invoker.current.addOutstandingCallback();
+        pumpEventQueue().then((_) {
+          Invoker.current.removeOutstandingCallback();
+          tearDownComplete = true;
+        });
+      }).load(suite);
+
+      expectStates(liveTest, [
+        const State(Status.running, Result.success),
+        const State(Status.complete, Result.error)
+      ]);
+
+      expectErrors(liveTest, [
+        (error) {
+          expect(lastState.status, equals(Status.complete));
+          expect(error, equals("oh no"));
+        },
+        (error) => expect(error, equals("not again"))
+      ]);
+
+      await liveTest.run();
+      expect(tearDownComplete, isTrue);
+    });
+  });
+
+  test("a test doesn't complete until there are no outstanding callbacks",
+      () async {
+    var outstandingCallbackRemoved = false;
+    var liveTest = _localTest(() {
+      Invoker.current.addOutstandingCallback();
+
+      // Pump the event queue to make sure the test isn't coincidentally
+      // completing after the outstanding callback is removed.
+      pumpEventQueue().then((_) {
+        outstandingCallbackRemoved = true;
+        Invoker.current.removeOutstandingCallback();
+      });
+    }).load(suite);
+
+    liveTest.onError.listen(expectAsync((_) {}, count: 0));
+
+    await liveTest.run();
+    expect(outstandingCallbackRemoved, isTrue);
+  });
+
+  test("a test's tearDown isn't run until there are no outstanding callbacks",
+      () async {
+    var outstandingCallbackRemoved = false;
+    var outstandingCallbackRemovedBeforeTeardown = false;
+    var liveTest = _localTest(() {
+      Invoker.current.addOutstandingCallback();
+      pumpEventQueue().then((_) {
+        outstandingCallbackRemoved = true;
+        Invoker.current.removeOutstandingCallback();
+      });
+    }, tearDown: () {
+      outstandingCallbackRemovedBeforeTeardown = outstandingCallbackRemoved;
+    }).load(suite);
+
+    liveTest.onError.listen(expectAsync((_) {}, count: 0));
+
+    await liveTest.run();
+    expect(outstandingCallbackRemovedBeforeTeardown, isTrue);
+  });
+
+  test("a test's tearDown doesn't complete until there are no outstanding "
+      "callbacks", () async {
+    var outstandingCallbackRemoved = false;
+    var liveTest = _localTest(() {}, tearDown: () {
+      Invoker.current.addOutstandingCallback();
+
+      // Pump the event queue to make sure the test isn't coincidentally
+      // completing after the outstanding callback is removed.
+      pumpEventQueue().then((_) {
+        outstandingCallbackRemoved = true;
+        Invoker.current.removeOutstandingCallback();
+      });
+    }).load(suite);
+
+    liveTest.onError.listen(expectAsync((_) {}, count: 0));
+
+    await liveTest.run();
+    expect(outstandingCallbackRemoved, isTrue);
+  });
+
+  test("a test body's outstanding callbacks can't complete its tearDown",
+      () async {
+    var outstandingCallbackRemoved = false;
+    var completer = new Completer();
+    var liveTest = _localTest(() {
+      // Once the tearDown runs, remove an outstanding callback to see if it
+      // causes the tearDown to complete.
+      completer.future.then((_) {
+        Invoker.current.removeOutstandingCallback();
+      });
+    }, tearDown: () {
+      Invoker.current.addOutstandingCallback();
+
+      // This will cause the test BODY to remove an outstanding callback, which
+      // shouldn't cause the test to complete.
+      completer.complete();
+
+      pumpEventQueue().then((_) {
+        outstandingCallbackRemoved = true;
+        Invoker.current.removeOutstandingCallback();
+      });
+    }).load(suite);
+
+    liveTest.onError.listen(expectAsync((_) {}, count: 0));
+
+    await liveTest.run();
+    expect(outstandingCallbackRemoved, isTrue);
+  });
+
+  test("a test's prints are captured and reported", () {
+    expect(() {
+      var liveTest = _localTest(() {
+        print("Hello,");
+        return new Future(() => print("world!"));
+      }).load(suite);
+
+      expect(liveTest.onPrint.take(2).toList(),
+          completion(equals(["Hello,", "world!"])));
+
+      return liveTest.run();
+    }, prints(isEmpty));
+  });
+
+  group("timeout:", () {
+    test("a test times out after 30 seconds by default", () {
+      new FakeAsync().run((async) {
+        var liveTest = _localTest(() {
+          Invoker.current.addOutstandingCallback();
+        }).load(suite);
+
+        expectStates(liveTest, [
+          const State(Status.running, Result.success),
+          const State(Status.complete, Result.error)
+        ]);
+
+        expectErrors(liveTest, [(error) {
+          expect(lastState.status, equals(Status.complete));
+          expect(error, new isInstanceOf<TimeoutException>());
+        }]);
+
+        liveTest.run();
+        async.elapse(new Duration(seconds: 30));
+      });
+    });
+
+    test("a test's custom timeout takes precedence", () {
+      new FakeAsync().run((async) {
+        var liveTest = _localTest(() {
+          Invoker.current.addOutstandingCallback();
+        }, metadata: new Metadata(
+            timeout: new Timeout(new Duration(seconds: 15)))).load(suite);
+
+        expectStates(liveTest, [
+          const State(Status.running, Result.success),
+          const State(Status.complete, Result.error)
+        ]);
+
+        expectErrors(liveTest, [(error) {
+          expect(lastState.status, equals(Status.complete));
+          expect(error, new isInstanceOf<TimeoutException>());
+        }]);
+
+        liveTest.run();
+        async.elapse(new Duration(seconds: 15));
+      });
+    });
+
+    test("a timeout factor is applied on top of the 30s default", () {
+      new FakeAsync().run((async) {
+        var liveTest = _localTest(() {
+          Invoker.current.addOutstandingCallback();
+        }, metadata: new Metadata(timeout: new Timeout.factor(0.5)))
+            .load(suite);
+
+        expectStates(liveTest, [
+          const State(Status.running, Result.success),
+          const State(Status.complete, Result.error)
+        ]);
+
+        expectErrors(liveTest, [(error) {
+          expect(lastState.status, equals(Status.complete));
+          expect(error, new isInstanceOf<TimeoutException>());
+        }]);
+
+        liveTest.run();
+        async.elapse(new Duration(seconds: 15));
+      });
+    });
+
+    test("a test with Timeout.none never times out", () {
+      new FakeAsync().run((async) {
+        var liveTest = _localTest(() {
+          Invoker.current.addOutstandingCallback();
+        }, metadata: new Metadata(timeout: Timeout.none)).load(suite);
+
+        expectStates(liveTest, [const State(Status.running, Result.success)]);
+
+        liveTest.run();
+        async.elapse(new Duration(hours: 10));
+        expect(liveTest.state.status, equals(Status.running));
+      });
+    });
+  });
+
+  group("waitForOutstandingCallbacks:", () {
+    test("waits for the wrapped function to complete", () async {
+      var functionCompleted = false;
+      await Invoker.current.waitForOutstandingCallbacks(() async {
+        await pumpEventQueue();
+        functionCompleted = true;
+      });
+
+      expect(functionCompleted, isTrue);
+    });
+
+    test("waits for registered callbacks in the wrapped function to run",
+        () async {
+      var callbackRun = false;
+      await Invoker.current.waitForOutstandingCallbacks(() {
+        pumpEventQueue().then(expectAsync((_) {
+          callbackRun = true;
+        }));
+      });
+
+      expect(callbackRun, isTrue);
+    });
+
+    test("doesn't automatically block the enclosing context", () async {
+      var innerFunctionCompleted = false;
+      await Invoker.current.waitForOutstandingCallbacks(() {
+        Invoker.current.waitForOutstandingCallbacks(() async {
+          await pumpEventQueue();
+          innerFunctionCompleted = true;
+        });
+      });
+
+      expect(innerFunctionCompleted, isFalse);
+    });
+  });
+}
+
+LocalTest _localTest(body(), {tearDown(), Metadata metadata}) {
+  if (metadata == null) metadata = new Metadata();
+  return new LocalTest("test", metadata, body, tearDown: tearDown);
+}
diff --git a/mojo/public/dart/third_party/test/test/backend/metadata_test.dart b/mojo/public/dart/third_party/test/test/backend/metadata_test.dart
new file mode 100644
index 0000000..ab14a74
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/backend/metadata_test.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/src/backend/metadata.dart';
+import 'package:test/src/backend/test_platform.dart';
+import 'package:test/src/frontend/timeout.dart';
+import 'package:test/src/frontend/skip.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group("onPlatform", () {
+    test("parses a valid map", () {
+      var metadata = new Metadata.parse(onPlatform: {
+        "chrome": new Timeout.factor(2),
+        "vm": [new Skip(), new Timeout.factor(3)]
+      });
+
+      var key = metadata.onPlatform.keys.first;
+      expect(key.evaluate(TestPlatform.chrome), isTrue);
+      expect(key.evaluate(TestPlatform.vm), isFalse);
+      var value = metadata.onPlatform.values.first;
+      expect(value.timeout.scaleFactor, equals(2));
+
+      key = metadata.onPlatform.keys.last;
+      expect(key.evaluate(TestPlatform.vm), isTrue);
+      expect(key.evaluate(TestPlatform.chrome), isFalse);
+      value = metadata.onPlatform.values.last;
+      expect(value.skip, isTrue);
+      expect(value.timeout.scaleFactor, equals(3));
+    });
+
+    test("refuses an invalid value", () {
+      expect(() {
+        new Metadata.parse(onPlatform: {"chrome": new TestOn("chrome")});
+      }, throwsArgumentError);
+    });
+
+    test("refuses an invalid value in a list", () {
+      expect(() {
+        new Metadata.parse(onPlatform: {"chrome": [new TestOn("chrome")]});
+      }, throwsArgumentError);
+    });
+
+    test("refuses an invalid platform selector", () {
+      expect(() {
+        new Metadata.parse(onPlatform: {"invalid": new Skip()});
+      }, throwsFormatException);
+    });
+
+    test("refuses multiple Timeouts", () {
+      expect(() {
+        new Metadata.parse(onPlatform: {
+          "chrome": [new Timeout.factor(2), new Timeout.factor(3)]
+        });
+      }, throwsArgumentError);
+    });
+
+    test("refuses multiple Skips", () {
+      expect(() {
+        new Metadata.parse(onPlatform: {"chrome": [new Skip(), new Skip()]});
+      }, throwsArgumentError);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/backend/platform_selector/ast_test.dart b/mojo/public/dart/third_party/test/test/backend/platform_selector/ast_test.dart
new file mode 100644
index 0000000..876f7dc
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/backend/platform_selector/ast_test.dart
@@ -0,0 +1,82 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:test/src/backend/platform_selector/parser.dart';
+
+void main() {
+  group("toString() for", () {
+    test("a variable is its name", () {
+      _expectToString("foo");
+      _expectToString("a-b");
+    });
+
+    group("not", () {
+      test("doesn't parenthesize a variable", () => _expectToString("!a"));
+      test("doesn't parenthesize a nested not", () => _expectToString("!!a"));
+      test("parenthesizes an or", () => _expectToString("!(a || b)"));
+      test("parenthesizes an and", () => _expectToString("!(a && b)"));
+      test("parenthesizes a condition", () => _expectToString("!(a ? b : c)"));
+    });
+
+    group("or", () {
+      test("doesn't parenthesize variables", () => _expectToString("a || b"));
+      test("doesn't parenthesize nots", () => _expectToString("!a || !b"));
+
+      test("doesn't parenthesize ors", () {
+        _expectToString("a || b || c || d");
+        _expectToString("((a || b) || c) || d", "a || b || c || d");
+      });
+
+      test("parenthesizes ands", () =>
+          _expectToString("a && b || c && d", "(a && b) || (c && d)"));
+
+      test("parenthesizes conditions", () =>
+          _expectToString("(a ? b : c) || (e ? f : g)"));
+    });
+
+    group("and", () {
+      test("doesn't parenthesize variables", () => _expectToString("a && b"));
+      test("doesn't parenthesize nots", () => _expectToString("!a && !b"));
+
+      test("parenthesizes ors", () =>
+          _expectToString("(a || b) && (c || d)", "(a || b) && (c || d)"));
+
+      test("doesn't parenthesize ands", () {
+        _expectToString("a && b && c && d");
+        _expectToString("((a && b) && c) && d", "a && b && c && d");
+      });
+
+      test("parenthesizes conditions", () =>
+          _expectToString("(a ? b : c) && (e ? f : g)"));
+    });
+
+    group("conditional", () {
+      test("doesn't parenthesize variables", () =>
+          _expectToString("a ? b : c"));
+
+      test("doesn't parenthesize nots", () => _expectToString("!a ? !b : !c"));
+
+      test("doesn't parenthesize ors", () =>
+          _expectToString("a || b ? c || d : e || f"));
+
+      test("doesn't parenthesize ands", () =>
+          _expectToString("a && b ? c && d : e && f"));
+
+      test("parenthesizes non-trailing conditions", () {
+        _expectToString("(a ? b : c) ? (e ? f : g) : h ? i : j");
+        _expectToString("(a ? b : c) ? (e ? f : g) : (h ? i : j)",
+            "(a ? b : c) ? (e ? f : g) : h ? i : j");
+      });
+    });
+  });
+}
+
+void _expectToString(String selector, [String result]) {
+  if (result == null) result = selector;
+  expect(_toString(selector), equals(result),
+      reason: 'Expected toString of "$selector" to be "$result".');
+}
+
+String _toString(String selector) => new Parser(selector).parse().toString();
diff --git a/mojo/public/dart/third_party/test/test/backend/platform_selector/evaluate_test.dart b/mojo/public/dart/third_party/test/test/backend/platform_selector/evaluate_test.dart
new file mode 100644
index 0000000..4f81d1b
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/backend/platform_selector/evaluate_test.dart
@@ -0,0 +1,142 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'dart:io';
+
+import 'package:test/test.dart';
+import 'package:test/src/backend/operating_system.dart';
+import 'package:test/src/backend/platform_selector.dart';
+import 'package:test/src/backend/test_platform.dart';
+
+void main() {
+  test("new PlatformSelector.parse() disallows invalid variables", () {
+    expect(() => new PlatformSelector.parse("undefined"),
+        throwsFormatException);
+  });
+
+  group("operator:", () {
+    test("conditional", () {
+      _expectEval("vm ? vm : browser", true);
+      _expectEval("vm ? browser : vm", false);
+      _expectEval("browser ? vm : browser", false);
+      _expectEval("browser ? browser : vm", true);
+    });
+
+    test("or", () {
+      _expectEval("vm || vm", true);
+      _expectEval("vm || browser", true);
+      _expectEval("browser || vm", true);
+      _expectEval("browser || browser", false);
+    });
+
+    test("and", () {
+      _expectEval("vm && vm", true);
+      _expectEval("vm && browser", false);
+      _expectEval("browser && vm", false);
+      _expectEval("browser && browser", false);
+    });
+
+    test("not", () {
+      _expectEval("!vm", false);
+      _expectEval("!browser", true);
+    });
+  });
+
+  group("baseline variable:", () {
+    test("vm", () {
+      _expectEval("vm", true, platform: TestPlatform.vm);
+      _expectEval("vm", false, platform: TestPlatform.chrome);
+    });
+
+    test("chrome", () {
+      _expectEval("chrome", true, platform: TestPlatform.chrome);
+      _expectEval("chrome", false, platform: TestPlatform.vm);
+    });
+
+    test("windows", () {
+      _expectEval("windows", true, os: OperatingSystem.windows);
+      _expectEval("windows", false, os: OperatingSystem.linux);
+      _expectEval("windows", false, os: OperatingSystem.none);
+    });
+
+    test("mac-os", () {
+      _expectEval("mac-os", true, os: OperatingSystem.macOS);
+      _expectEval("mac-os", false, os: OperatingSystem.linux);
+      _expectEval("mac-os", false, os: OperatingSystem.none);
+    });
+
+    test("linux", () {
+      _expectEval("linux", true, os: OperatingSystem.linux);
+      _expectEval("linux", false, os: OperatingSystem.android);
+      _expectEval("linux", false, os: OperatingSystem.none);
+    });
+
+    test("android", () {
+      _expectEval("android", true, os: OperatingSystem.android);
+      _expectEval("android", false, os: OperatingSystem.linux);
+      _expectEval("android", false, os: OperatingSystem.none);
+    });
+  });
+
+  group("derived variable:", () {
+    test("dart-vm", () {
+      _expectEval("dart-vm", true, platform: TestPlatform.vm);
+      _expectEval("dart-vm", false, platform: TestPlatform.chrome);
+    });
+
+    test("browser", () {
+      _expectEval("browser", true, platform: TestPlatform.chrome);
+      _expectEval("browser", false, platform: TestPlatform.vm);
+    });
+
+    test("js", () {
+      _expectEval("js", true, platform: TestPlatform.chrome);
+      _expectEval("js", false, platform: TestPlatform.vm);
+    });
+
+    test("blink", () {
+      _expectEval("blink", true, platform: TestPlatform.chrome);
+      _expectEval("blink", false, platform: TestPlatform.vm);
+    });
+
+    test("posix", () {
+      _expectEval("posix", false, os: OperatingSystem.windows);
+      _expectEval("posix", true, os: OperatingSystem.macOS);
+      _expectEval("posix", true, os: OperatingSystem.linux);
+      _expectEval("posix", true, os: OperatingSystem.android);
+      _expectEval("posix", false, os: OperatingSystem.none);
+    });
+  });
+}
+
+/// Asserts that [expression] evaluates to [result] on [platform] and [os].
+///
+/// [platform] defaults to [TestPlatform.vm]; [os] defaults to the current
+/// operating system.
+void _expectEval(String expression, bool result, {TestPlatform platform,
+    OperatingSystem os}) {
+
+  var reason = 'Expected "$expression" to evaluate to $result';
+  if (platform != null && os != null) {
+    reason += ' on $platform and $os.';
+  } else if (platform != null || os != null) {
+    reason += ' on ${platform == null ? os : platform}';
+  }
+
+  expect(_eval(expression, platform: platform, os: os), equals(result),
+      reason: '$reason.');
+}
+
+/// Returns the result of evaluating [expression] on [platform] and [os].
+///
+/// [platform] defaults to [TestPlatform.vm]; [os] defaults to the current
+/// operating system.
+bool _eval(String expression, {TestPlatform platform, OperatingSystem os}) {
+  if (platform == null) platform = TestPlatform.vm;
+  if (os == null) os = OperatingSystem.findByIoName(Platform.operatingSystem);
+  var selector = new PlatformSelector.parse(expression);
+  return selector.evaluate(platform, os: os);
+}
diff --git a/mojo/public/dart/third_party/test/test/backend/platform_selector/parser_test.dart b/mojo/public/dart/third_party/test/test/backend/platform_selector/parser_test.dart
new file mode 100644
index 0000000..04f356c
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/backend/platform_selector/parser_test.dart
@@ -0,0 +1,266 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:test/src/backend/platform_selector/ast.dart';
+import 'package:test/src/backend/platform_selector/parser.dart';
+
+/// A matcher that asserts that a value is a [ConditionalNode].
+Matcher _isConditionalNode = new isInstanceOf<ConditionalNode>();
+
+/// A matcher that asserts that a value is an [OrNode].
+Matcher _isOrNode = new isInstanceOf<OrNode>();
+
+/// A matcher that asserts that a value is an [AndNode].
+Matcher _isAndNode = new isInstanceOf<AndNode>();
+
+/// A matcher that asserts that a value is a [NotNode].
+Matcher _isNotNode = new isInstanceOf<NotNode>();
+
+void main() {
+  group("parses a conditional expression", () {
+    test("with identifiers", () {
+      var node = _parse("  a ? b : c   ");
+      expect(node.toString(), equals("a ? b : c"));
+
+      expect(node.span.text, equals("a ? b : c"));
+      expect(node.span.start.offset, equals(2));
+      expect(node.span.end.offset, equals(11));
+    });
+
+    test("with nested ors", () {
+      // Should parse as "(a || b) ? (c || d) : (e || f)".
+      // Should not parse as "a || (b ? (c || d) : (e || f))".
+      // Should not parse as "((a || b) ? (c || d) : e) || f".
+      // Should not parse as "a || (b ? (c || d) : e) || f".
+      _expectToString("a || b ? c || d : e || f",
+          "a || b ? c || d : e || f");
+    });
+
+    test("with a conditional expression as branch 1", () {
+      // Should parse as "a ? (b ? c : d) : e".
+      var node = _parse("a ? b ? c : d : e");
+      expect(node, _isConditionalNode);
+      expect(node.condition, _isVar("a"));
+      expect(node.whenFalse, _isVar("e"));
+
+      expect(node.whenTrue, _isConditionalNode);
+      expect(node.whenTrue.condition, _isVar("b"));
+      expect(node.whenTrue.whenTrue, _isVar("c"));
+      expect(node.whenTrue.whenFalse, _isVar("d"));
+    });
+
+    test("with a conditional expression as branch 2", () {
+      // Should parse as "a ? b : (c ? d : e)".
+      // Should not parse as "(a ? b : c) ? d : e".
+      var node = _parse("a ? b : c ? d : e");
+      expect(node, _isConditionalNode);
+      expect(node.condition, _isVar("a"));
+      expect(node.whenTrue, _isVar("b"));
+
+      expect(node.whenFalse, _isConditionalNode);
+      expect(node.whenFalse.condition, _isVar("c"));
+      expect(node.whenFalse.whenTrue, _isVar("d"));
+      expect(node.whenFalse.whenFalse, _isVar("e"));
+    });
+
+    group("which must have", () {
+      test("an expression after the ?", () {
+        expect(() => _parse("a ?"), throwsFormatException);
+        expect(() => _parse("a ? && b"), throwsFormatException);
+      });
+
+      test("a :", () {
+        expect(() => _parse("a ? b"), throwsFormatException);
+        expect(() => _parse("a ? b && c"), throwsFormatException);
+      });
+
+      test("an expression after the :", () {
+        expect(() => _parse("a ? b :"), throwsFormatException);
+        expect(() => _parse("a ? b : && c"), throwsFormatException);
+      });
+    });
+  });
+
+  group("parses an or expression", () {
+    test("with identifiers", () {
+      var node = _parse("  a || b   ");
+      expect(node, _isOrNode);
+      expect(node.left, _isVar("a"));
+      expect(node.right, _isVar("b"));
+
+      expect(node.span.text, equals("a || b"));
+      expect(node.span.start.offset, equals(2));
+      expect(node.span.end.offset, equals(8));
+    });
+
+    test("with nested ands", () {
+      // Should parse as "(a && b) || (c && d)".
+      // Should not parse as "a && (b || c) && d".
+      var node = _parse("a && b || c && d");
+      expect(node, _isOrNode);
+
+      expect(node.left, _isAndNode);
+      expect(node.left.left, _isVar("a"));
+      expect(node.left.right, _isVar("b"));
+
+      expect(node.right, _isAndNode);
+      expect(node.right.left, _isVar("c"));
+      expect(node.right.right, _isVar("d"));
+    });
+
+    test("with trailing ors", () {
+      // Should parse as "a || (b || (c || d))", although it doesn't affect the
+      // semantics.
+      var node = _parse("a || b || c || d");
+
+      for (var variable in ["a", "b", "c"]) {
+        expect(node, _isOrNode);
+        expect(node.left, _isVar(variable));
+        node = node.right;
+      }
+      expect(node, _isVar("d"));
+    });
+
+    test("which must have an expression after the ||", () {
+      expect(() => _parse("a ||"), throwsFormatException);
+      expect(() => _parse("a || && b"), throwsFormatException);
+    });
+  });
+
+  group("parses an and expression", () {
+    test("with identifiers", () {
+      var node = _parse("  a && b   ");
+      expect(node, _isAndNode);
+      expect(node.left, _isVar("a"));
+      expect(node.right, _isVar("b"));
+
+      expect(node.span.text, equals("a && b"));
+      expect(node.span.start.offset, equals(2));
+      expect(node.span.end.offset, equals(8));
+    });
+
+    test("with nested nots", () {
+      // Should parse as "(!a) && (!b)", obviously.
+      // Should not parse as "!(a && (!b))".
+      var node = _parse("!a && !b");
+      expect(node, _isAndNode);
+
+      expect(node.left, _isNotNode);
+      expect(node.left.child, _isVar("a"));
+
+      expect(node.right, _isNotNode);
+      expect(node.right.child, _isVar("b"));
+    });
+
+    test("with trailing ands", () {
+      // Should parse as "a && (b && (c && d))", although it doesn't affect the
+      // semantics since .
+      var node = _parse("a && b && c && d");
+
+      for (var variable in ["a", "b", "c"]) {
+        expect(node, _isAndNode);
+        expect(node.left, _isVar(variable));
+        node = node.right;
+      }
+      expect(node, _isVar("d"));
+    });
+
+    test("which must have an expression after the &&", () {
+      expect(() => _parse("a &&"), throwsFormatException);
+      expect(() => _parse("a && && b"), throwsFormatException);
+    });
+  });
+
+  group("parses a not expression", () {
+    test("with an identifier", () {
+      var node = _parse("  ! a    ");
+      expect(node, _isNotNode);
+      expect(node.child, _isVar("a"));
+
+      expect(node.span.text, equals("! a"));
+      expect(node.span.start.offset, equals(2));
+      expect(node.span.end.offset, equals(5));
+    });
+
+    test("with a parenthesized expression", () {
+      var node = _parse("!(a || b)");
+      expect(node, _isNotNode);
+
+      expect(node.child, _isOrNode);
+      expect(node.child.left, _isVar("a"));
+      expect(node.child.right, _isVar("b"));
+    });
+
+    test("with a nested not", () {
+      var node = _parse("!!a");
+      expect(node, _isNotNode);
+      expect(node.child, _isNotNode);
+      expect(node.child.child, _isVar("a"));
+    });
+
+    test("which must have an expression after the !", () {
+      expect(() => _parse("!"), throwsFormatException);
+      expect(() => _parse("! && a"), throwsFormatException);
+    });
+  });
+
+  group("parses a parenthesized expression", () {
+    test("with an identifier", () {
+      var node = _parse("(a)");
+      expect(node, _isVar("a"));
+    });
+
+    test("controls precedence", () {
+      // Without parentheses, this would parse as "(a || b) ? c : d".
+      var node = _parse("a || (b ? c : d)");
+
+      expect(node, _isOrNode);
+      expect(node.left, _isVar("a"));
+
+      expect(node.right, _isConditionalNode);
+      expect(node.right.condition, _isVar("b"));
+      expect(node.right.whenTrue, _isVar("c"));
+      expect(node.right.whenFalse, _isVar("d"));
+    });
+
+    group("which must have", () {
+      test("an expression within the ()", () {
+        expect(() => _parse("()"), throwsFormatException);
+        expect(() => _parse("( && a )"), throwsFormatException);
+      });
+
+      test("a matching )", () {
+        expect(() => _parse("( a"), throwsFormatException);
+      });
+    });
+  });
+
+  group("disallows", () {
+    test("an empty selector", () {
+      expect(() => _parse(""), throwsFormatException);
+    });
+
+    test("too many expressions", () {
+      expect(() => _parse("a b"), throwsFormatException);
+    });
+  });
+}
+
+/// Parses [selector] and returns its root node.
+Node _parse(String selector) => new Parser(selector).parse();
+
+/// A matcher that asserts that a value is a [VariableNode] with the given
+/// [name].
+Matcher _isVar(String name) => predicate(
+    (value) => value is VariableNode && value.name == name,
+    'is a variable named "$name"');
+
+void _expectToString(String selector, [String result]) {
+  if (result == null) result = selector;
+  expect(_toString(selector), equals(result),
+      reason: 'Expected toString of "$selector" to be "$result".');
+}
+
+String _toString(String selector) => new Parser(selector).parse().toString();
diff --git a/mojo/public/dart/third_party/test/test/backend/platform_selector/scanner_test.dart b/mojo/public/dart/third_party/test/test/backend/platform_selector/scanner_test.dart
new file mode 100644
index 0000000..6ba9aeb
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/backend/platform_selector/scanner_test.dart
@@ -0,0 +1,266 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:test/src/backend/platform_selector/scanner.dart';
+import 'package:test/src/backend/platform_selector/token.dart';
+
+void main() {
+  group("peek()", () {
+    test("returns the next token without consuming it", () {
+      var scanner = new Scanner("( )");
+      expect(scanner.peek().type, equals(TokenType.leftParen));
+      expect(scanner.peek().type, equals(TokenType.leftParen));
+      expect(scanner.peek().type, equals(TokenType.leftParen));
+    });
+
+    test("returns an end-of-file token at the end of a file", () {
+      var scanner = new Scanner("( )");
+      scanner.next();
+      scanner.next();
+
+      var token = scanner.peek();
+      expect(token.type, equals(TokenType.endOfFile));
+      expect(token.span.start.offset, equals(3));
+      expect(token.span.end.offset, equals(3));
+    });
+
+    test("throws a StateError if called after end-of-file was consumed", () {
+      var scanner = new Scanner("( )");
+      scanner.next();
+      scanner.next();
+      scanner.next();
+      expect(() => scanner.peek(), throwsStateError);
+    });
+  });
+
+  group("next()", () {
+    test("consumes and returns the next token", () {
+      var scanner = new Scanner("( )");
+      expect(scanner.next().type, equals(TokenType.leftParen));
+      expect(scanner.peek().type, equals(TokenType.rightParen));
+      expect(scanner.next().type, equals(TokenType.rightParen));
+    });
+
+    test("returns an end-of-file token at the end of a file", () {
+      var scanner = new Scanner("( )");
+      scanner.next();
+      scanner.next();
+
+      var token = scanner.next();
+      expect(token.type, equals(TokenType.endOfFile));
+      expect(token.span.start.offset, equals(3));
+      expect(token.span.end.offset, equals(3));
+    });
+
+    test("throws a StateError if called after end-of-file was consumed", () {
+      var scanner = new Scanner("( )");
+      scanner.next();
+      scanner.next();
+      scanner.next();
+      expect(() => scanner.next(), throwsStateError);
+    });
+  });
+
+  group("scan()", () {
+    test("consumes a matching token and returns true", () {
+      var scanner = new Scanner("( )");
+      expect(scanner.scan(TokenType.leftParen), isTrue);
+      expect(scanner.peek().type, equals(TokenType.rightParen));
+    });
+
+    test("doesn't consume a matching token and returns false", () {
+      var scanner = new Scanner("( )");
+      expect(scanner.scan(TokenType.questionMark), isFalse);
+      expect(scanner.peek().type, equals(TokenType.leftParen));
+    });
+
+    test("throws a StateError called after end-of-file was consumed", () {
+      var scanner = new Scanner("( )");
+      scanner.next();
+      scanner.next();
+      scanner.next();
+      expect(() => scanner.scan(TokenType.endOfFile), throwsStateError);
+    });
+  });
+
+  group("scans a simple token:", () {
+    test("left paren", () => _expectSimpleScan("(", TokenType.leftParen));
+    test("right paren", () => _expectSimpleScan(")", TokenType.rightParen));
+    test("or", () => _expectSimpleScan("||", TokenType.or));
+    test("and", () => _expectSimpleScan("&&", TokenType.and));
+    test("not", () => _expectSimpleScan("!", TokenType.not));
+    test("question mark", () => _expectSimpleScan("?", TokenType.questionMark));
+    test("colon", () => _expectSimpleScan(":", TokenType.colon));
+  });
+
+  group("scans an identifier that", () {
+    test("is simple", () {
+      var token = _scan("   foo  ");
+      expect(token.name, equals("foo"));
+      expect(token.span.text, equals("foo"));
+      expect(token.span.start.offset, equals(3));
+      expect(token.span.end.offset, equals(6));
+    });
+
+    test("is a single character", () {
+      var token = _scan("f");
+      expect(token.name, equals("f"));
+    });
+
+    test("has a leading underscore", () {
+      var token = _scan("_foo");
+      expect(token.name, equals("_foo"));
+    });
+
+    test("has a leading dash", () {
+      var token = _scan("-foo");
+      expect(token.name, equals("-foo"));
+    });
+
+    test("contains an underscore", () {
+      var token = _scan("foo_bar");
+      expect(token.name, equals("foo_bar"));
+    });
+
+    test("contains a dash", () {
+      var token = _scan("foo-bar");
+      expect(token.name, equals("foo-bar"));
+    });
+
+    test("is capitalized", () {
+      var token = _scan("FOO");
+      expect(token.name, equals("FOO"));
+    });
+
+    test("contains numbers", () {
+      var token = _scan("foo123");
+      expect(token.name, equals("foo123"));
+    });
+  });
+
+  test("scans an empty selector", () {
+    expect(_scan("").type, equals(TokenType.endOfFile));
+  });
+
+  test("scans multiple tokens", () {
+    var scanner = new Scanner("(foo && bar)");
+
+    var token = scanner.next();
+    expect(token.type, equals(TokenType.leftParen));
+    expect(token.span.start.offset, equals(0));
+    expect(token.span.end.offset, equals(1));
+
+    token = scanner.next();
+    expect(token.type, equals(TokenType.identifier));
+    expect(token.name, equals("foo"));
+    expect(token.span.start.offset, equals(1));
+    expect(token.span.end.offset, equals(4));
+
+    token = scanner.next();
+    expect(token.type, equals(TokenType.and));
+    expect(token.span.start.offset, equals(5));
+    expect(token.span.end.offset, equals(7));
+
+    token = scanner.next();
+    expect(token.type, equals(TokenType.identifier));
+    expect(token.name, equals("bar"));
+    expect(token.span.start.offset, equals(8));
+    expect(token.span.end.offset, equals(11));
+
+    token = scanner.next();
+    expect(token.type, equals(TokenType.rightParen));
+    expect(token.span.start.offset, equals(11));
+    expect(token.span.end.offset, equals(12));
+
+    token = scanner.next();
+    expect(token.type, equals(TokenType.endOfFile));
+    expect(token.span.start.offset, equals(12));
+    expect(token.span.end.offset, equals(12));
+  });
+
+  group("ignores", () {
+    test("a single-line comment", () {
+      var scanner = new Scanner("( // &&\n// ||\n)");
+      expect(scanner.next().type, equals(TokenType.leftParen));
+      expect(scanner.next().type, equals(TokenType.rightParen));
+      expect(scanner.next().type, equals(TokenType.endOfFile));
+    });
+
+    test("a single-line comment without a trailing newline", () {
+      var scanner = new Scanner("( // &&");
+      expect(scanner.next().type, equals(TokenType.leftParen));
+      expect(scanner.next().type, equals(TokenType.endOfFile));
+    });
+
+    test("a multi-line comment", () {
+      var scanner = new Scanner("( /* && * /\n|| */\n)");
+      expect(scanner.next().type, equals(TokenType.leftParen));
+      expect(scanner.next().type, equals(TokenType.rightParen));
+      expect(scanner.next().type, equals(TokenType.endOfFile));
+    });
+
+    test("a multi-line nested comment", () {
+      var scanner = new Scanner("(/* && /* ? /* || */ : */ ! */)");
+      expect(scanner.next().type, equals(TokenType.leftParen));
+      expect(scanner.next().type, equals(TokenType.rightParen));
+      expect(scanner.next().type, equals(TokenType.endOfFile));
+    });
+
+    test("Dart's notion of whitespace", () {
+      var scanner = new Scanner("( \t \n)");
+      expect(scanner.next().type, equals(TokenType.leftParen));
+      expect(scanner.next().type, equals(TokenType.rightParen));
+      expect(scanner.next().type, equals(TokenType.endOfFile));
+    });
+  });
+
+  group("disallows", () {
+    test("a single |", () {
+      expect(() => _scan("|"), throwsFormatException);
+    });
+
+    test('"| |"', () {
+      expect(() => _scan("| |"), throwsFormatException);
+    });
+
+    test("a single &", () {
+      expect(() => _scan("&"), throwsFormatException);
+    });
+
+    test('"& &"', () {
+      expect(() => _scan("& &"), throwsFormatException);
+    });
+
+    test("an unknown operator", () {
+      expect(() => _scan("=="), throwsFormatException);
+    });
+
+    test("unicode", () {
+      expect(() => _scan("öh"), throwsFormatException);
+    });
+
+    test("an unclosed multi-line comment", () {
+      expect(() => _scan("/*"), throwsFormatException);
+    });
+
+    test("an unopened multi-line comment", () {
+      expect(() => _scan("*/"), throwsFormatException);
+    });
+  });
+}
+
+/// Asserts that the first token scanned from [selector] has type [type],
+/// and that that token's span is exactly [selector].
+void _expectSimpleScan(String selector, TokenType type) {
+  // Complicate the selector to test that the span covers it correctly.
+  var token = _scan("   $selector  ");
+  expect(token.type, equals(type));
+  expect(token.span.text, equals(selector));
+  expect(token.span.start.offset, equals(3));
+  expect(token.span.end.offset, equals(3 + selector.length));
+}
+
+/// Scans a single token from [selector].
+Token _scan(String selector) => new Scanner(selector).next();
diff --git a/mojo/public/dart/third_party/test/test/frontend/expect_async_test.dart b/mojo/public/dart/third_party/test/test/frontend/expect_async_test.dart
new file mode 100644
index 0000000..2c118f8
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/frontend/expect_async_test.dart
@@ -0,0 +1,332 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:test/src/backend/state.dart';
+import 'package:test/test.dart';
+
+import '../utils.dart';
+
+void main() {
+  group("supports a function with this many arguments:", () {
+    test("0", () async {
+      var callbackRun = false;
+      var liveTest = await runTestBody(() {
+        expectAsync(() {
+          callbackRun = true;
+        })();
+      });
+
+      expectTestPassed(liveTest);
+      expect(callbackRun, isTrue);
+    });
+
+    test("1", () async {
+      var callbackRun = false;
+      var liveTest = await runTestBody(() {
+        expectAsync((arg) {
+          expect(arg, equals(1));
+          callbackRun = true;
+        })(1);
+      });
+
+      expectTestPassed(liveTest);
+      expect(callbackRun, isTrue);
+    });
+
+    test("2", () async {
+      var callbackRun = false;
+      var liveTest = await runTestBody(() {
+        expectAsync((arg1, arg2) {
+          expect(arg1, equals(1));
+          expect(arg2, equals(2));
+          callbackRun = true;
+        })(1, 2);
+      });
+
+      expectTestPassed(liveTest);
+      expect(callbackRun, isTrue);
+    });
+
+    test("3", () async {
+      var callbackRun = false;
+      var liveTest = await runTestBody(() {
+        expectAsync((arg1, arg2, arg3) {
+          expect(arg1, equals(1));
+          expect(arg2, equals(2));
+          expect(arg3, equals(3));
+          callbackRun = true;
+        })(1, 2, 3);
+      });
+
+      expectTestPassed(liveTest);
+      expect(callbackRun, isTrue);
+    });
+
+    test("4", () async {
+      var callbackRun = false;
+      var liveTest = await runTestBody(() {
+        expectAsync((arg1, arg2, arg3, arg4) {
+          expect(arg1, equals(1));
+          expect(arg2, equals(2));
+          expect(arg3, equals(3));
+          expect(arg4, equals(4));
+          callbackRun = true;
+        })(1, 2, 3, 4);
+      });
+
+      expectTestPassed(liveTest);
+      expect(callbackRun, isTrue);
+    });
+
+    test("5", () async {
+      var callbackRun = false;
+      var liveTest = await runTestBody(() {
+        expectAsync((arg1, arg2, arg3, arg4, arg5) {
+          expect(arg1, equals(1));
+          expect(arg2, equals(2));
+          expect(arg3, equals(3));
+          expect(arg4, equals(4));
+          expect(arg5, equals(5));
+          callbackRun = true;
+        })(1, 2, 3, 4, 5);
+      });
+
+      expectTestPassed(liveTest);
+      expect(callbackRun, isTrue);
+    });
+
+    test("6", () async {
+      var callbackRun = false;
+      var liveTest = await runTestBody(() {
+        expectAsync((arg1, arg2, arg3, arg4, arg5, arg6) {
+          expect(arg1, equals(1));
+          expect(arg2, equals(2));
+          expect(arg3, equals(3));
+          expect(arg4, equals(4));
+          expect(arg5, equals(5));
+          expect(arg6, equals(6));
+          callbackRun = true;
+        })(1, 2, 3, 4, 5, 6);
+      });
+
+      expectTestPassed(liveTest);
+      expect(callbackRun, isTrue);
+    });
+  });
+
+  group("with optional arguments", () {
+    test("allows them to be passed", () async {
+      var callbackRun = false;
+      var liveTest = await runTestBody(() {
+        expectAsync(([arg = 1]) {
+          expect(arg, equals(2));
+          callbackRun = true;
+        })(2);
+      });
+
+      expectTestPassed(liveTest);
+      expect(callbackRun, isTrue);
+    });
+
+    test("allows them not to be passed", () async {
+      var callbackRun = false;
+      var liveTest = await runTestBody(() {
+        expectAsync(([arg = 1]) {
+          expect(arg, equals(1));
+          callbackRun = true;
+        })();
+      });
+
+      expectTestPassed(liveTest);
+      expect(callbackRun, isTrue);
+    });
+  });
+
+  test("doesn't support a function with 7 arguments", () {
+    expect(() => expectAsync((_1, _2, _3, _4, _5, _6, _7) {}),
+        throwsArgumentError);
+  });
+
+  group("by default", () {
+    test("won't allow the test to complete until it's called", () {
+      return expectTestBlocks(
+          () => expectAsync(() {}),
+          (callback) => callback());
+    });
+
+    test("may only be called once", () async {
+      var liveTest = await runTestBody(() {
+        var callback = expectAsync(() {});
+        callback();
+        callback();
+      });
+
+      expectTestFailed(liveTest,
+          "Callback called more times than expected (1).");
+    });
+  });
+
+  group("with count", () {
+    test("won't allow the test to complete until it's called at least that "
+        "many times", () async {
+      var liveTest;
+      var future;
+      liveTest = createTest(() {
+        var callback = expectAsync(() {}, count: 3);
+
+        future = new Future.sync(() async {
+          await pumpEventQueue();
+          expect(liveTest.state.status, equals(Status.running));
+          callback();
+
+          await pumpEventQueue();
+          expect(liveTest.state.status, equals(Status.running));
+          callback();
+
+          await pumpEventQueue();
+          expect(liveTest.state.status, equals(Status.running));
+          callback();
+        });
+      });
+
+      await liveTest.run();
+      expectTestPassed(liveTest);
+      // Ensure that the outer test doesn't complete until the inner future
+      // completes.
+      await future;
+    });
+
+    test("will throw an error if it's called more than that many times", () async {
+      var liveTest = await runTestBody(() {
+        var callback = expectAsync(() {}, count: 3);
+        callback();
+        callback();
+        callback();
+        callback();
+      });
+
+      expectTestFailed(
+          liveTest, "Callback called more times than expected (3).");
+    });
+
+    group("0,", () {
+      test("won't block the test's completion", () {
+        expectAsync(() {}, count: 0);
+      });
+
+      test("will throw an error if it's ever called", () async {
+        var liveTest = await runTestBody(() {
+          expectAsync(() {}, count: 0)();
+        });
+
+        expectTestFailed(
+            liveTest, "Callback called more times than expected (0).");
+      });
+    });
+  });
+
+  group("with max", () {
+    test("will allow the callback to be called that many times", () {
+      var callback = expectAsync(() {}, max: 3);
+      callback();
+      callback();
+      callback();
+    });
+
+    test("will allow the callback to be called fewer than that many times", () {
+      var callback = expectAsync(() {}, max: 3);
+      callback();
+    });
+
+    test("will throw an error if it's called more than that many times",
+        () async {
+      var liveTest = await runTestBody(() {
+        var callback = expectAsync(() {}, max: 3);
+        callback();
+        callback();
+        callback();
+        callback();
+      });
+
+      expectTestFailed(
+          liveTest, "Callback called more times than expected (3).");
+    });
+
+    test("-1, will allow the callback to be called any number of times", () {
+      var callback = expectAsync(() {}, max: -1);
+      for (var i = 0; i < 20; i++) {
+        callback();
+      }
+    });
+  });
+
+  test("will throw an error if max is less than count", () {
+    expect(() => expectAsync(() {}, max: 1, count: 2),
+        throwsArgumentError);
+  });
+
+  group("expectAsyncUntil()", () {
+    test("won't allow the test to complete until isDone returns true",
+        () async {
+      var liveTest;
+      var future;
+      liveTest = createTest(() {
+        var done = false;
+        var callback = expectAsyncUntil(() {}, () => done);
+
+        future = new Future.sync(() async {
+          await pumpEventQueue();
+          expect(liveTest.state.status, equals(Status.running));
+          callback();
+          await pumpEventQueue();
+          expect(liveTest.state.status, equals(Status.running));
+          done = true;
+          callback();
+        });
+      });
+
+      await liveTest.run();
+      expectTestPassed(liveTest);
+      // Ensure that the outer test doesn't complete until the inner future
+      // completes.
+      await future;
+    });
+
+    test("doesn't call isDone until after the callback is called", () {
+      var callbackRun = false;
+      expectAsyncUntil(() => callbackRun = true, () {
+        expect(callbackRun, isTrue);
+        return true;
+      })();
+    });
+  });
+
+  group("with errors", () {
+    test("reports them to the current test", () async {
+      var liveTest = await runTestBody(() {
+        expectAsync(() => throw new TestFailure('oh no'))();
+      });
+
+      expectTestFailed(liveTest, 'oh no');
+    });
+
+    test("swallows them and returns null", () async {
+      var returnValue;
+      var caughtError = false;
+      var liveTest = await runTestBody(() {
+        try {
+          returnValue = expectAsync(() => throw new TestFailure('oh no'))();
+        } on TestFailure catch (_) {
+          caughtError = true;
+        }
+      });
+
+      expectTestFailed(liveTest, 'oh no');
+      expect(returnValue, isNull);
+      expect(caughtError, isFalse);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/frontend/matcher/completion_test.dart b/mojo/public/dart/third_party/test/test/frontend/matcher/completion_test.dart
new file mode 100644
index 0000000..e5c73b5
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/frontend/matcher/completion_test.dart
@@ -0,0 +1,105 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:test/test.dart';
+import 'package:test/src/backend/state.dart';
+
+import '../../utils.dart';
+
+void main() {
+  group("[completes]", () {
+    test("blocks the test until the Future completes", () {
+      return expectTestBlocks(() {
+        var completer = new Completer();
+        expect(completer.future, completes);
+        return completer;
+      }, (completer) => completer.complete());
+    });
+
+    test("with an error", () async {
+      var liveTest = await runTestBody(() {
+        expect(new Future.error('X'), completes);
+      });
+
+      expect(liveTest.state.status, equals(Status.complete));
+      expect(liveTest.state.result, equals(Result.error));
+      expect(liveTest.errors, hasLength(1));
+      expect(liveTest.errors.first.error, equals('X'));
+    });
+
+    test("with a failure", () async {
+      var liveTest = await runTestBody(() {
+        expect(new Future.error(new TestFailure('oh no')), completes);
+      });
+
+      expectTestFailed(liveTest, "oh no");
+    });
+
+    test("with a non-function", () async {
+      var liveTest = await runTestBody(() {
+        expect(10, completes);
+      });
+
+      expectTestFailed(liveTest,
+          "Expected: completes successfully\n"
+          "  Actual: <10>\n");
+    });
+
+    test("with a successful future", () {
+      expect(new Future.value('1'), completes);
+    });
+  });
+
+  group("[completion]", () {
+    test("blocks the test until the Future completes", () {
+      return expectTestBlocks(() {
+        var completer = new Completer();
+        expect(completer.future, completion(isNull));
+        return completer;
+      }, (completer) => completer.complete());
+    });
+
+    test("with an error", () async {
+      var liveTest = await runTestBody(() {
+        expect(new Future.error('X'), completion(isNull));
+      });
+
+      expect(liveTest.state.status, equals(Status.complete));
+      expect(liveTest.state.result, equals(Result.error));
+      expect(liveTest.errors, hasLength(1));
+      expect(liveTest.errors.first.error, equals('X'));
+    });
+
+    test("with a failure", () async {
+      var liveTest = await runTestBody(() {
+        expect(new Future.error(new TestFailure('oh no')), completion(isNull));
+      });
+
+      expectTestFailed(liveTest, "oh no");
+    });
+
+    test("with a non-function", () async {
+      var liveTest = await runTestBody(() {
+        expect(10, completion(equals(10)));
+      });
+
+      expectTestFailed(liveTest,
+          "Expected: completes to a value that <10>\n"
+          "  Actual: <10>\n");
+    });
+
+    test("with an incorrect value", () async {
+      var liveTest = await runTestBody(() {
+        expect(new Future.value('a'), completion(equals('b')));
+      });
+
+      expectTestFailed(liveTest, startsWith(
+          "Expected: 'b'\n"
+          "  Actual: 'a'\n"
+          "   Which: is different."));;
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/frontend/matcher/prints_test.dart b/mojo/public/dart/third_party/test/test/frontend/matcher/prints_test.dart
new file mode 100644
index 0000000..11eac47
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/frontend/matcher/prints_test.dart
@@ -0,0 +1,171 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+import '../../utils.dart';
+
+void main() {
+  group("synchronous", () {
+    test("passes with an expected print", () {
+      expect(() => print("Hello, world!"), prints("Hello, world!\n"));
+    });
+
+    test("combines multiple prints", () {
+      expect(() {
+        print("Hello");
+        print("World!");
+      }, prints("Hello\nWorld!\n"));
+    });
+
+    test("works with a Matcher", () {
+      expect(() => print("Hello, world!"), prints(contains("Hello")));
+    });
+
+    test("describes a failure nicely", () async {
+      var closure = () => print("Hello, world!");
+      var liveTest = await runTestBody(() {
+        expect(closure, prints("Goodbye, world!\n"));
+      });
+
+      expectTestFailed(liveTest, allOf([
+        startsWith(
+            "Expected: prints 'Goodbye, world!\\n'\n"
+            "  ''\n"
+            "  Actual: <"),
+        endsWith(">\n"
+            "   Which: printed 'Hello, world!\\n'\n"
+            "  ''\n"
+            "   Which: is different.\n"
+            "Expected: Goodbye, w ...\n"
+            "  Actual: Hello, wor ...\n"
+            "          ^\n"
+            " Differ at offset 0\n")
+      ]));
+    });
+
+    test("describes a failure with a non-descriptive Matcher nicely", () async {
+      var closure = () => print("Hello, world!");
+      var liveTest = await runTestBody(() {
+        expect(closure, prints(contains("Goodbye")));
+      });
+
+      expectTestFailed(liveTest, allOf([
+        startsWith(
+            "Expected: prints contains 'Goodbye'\n"
+            "  Actual: <"),
+        endsWith(">\n"
+            "   Which: printed 'Hello, world!\\n'\n"
+            "  ''\n")
+      ]));
+    });
+
+    test("describes a failure with no text nicely", () async {
+      var closure = () {};
+      var liveTest = await runTestBody(() {
+        expect(closure, prints(contains("Goodbye")));
+      });
+
+      expectTestFailed(liveTest, allOf([
+        startsWith(
+            "Expected: prints contains 'Goodbye'\n"
+            "  Actual: <"),
+        endsWith(">\n"
+            "   Which: printed nothing.\n")
+      ]));
+    });
+
+    test("with a non-function", () async {
+      var liveTest = await runTestBody(() {
+        expect(10, prints(contains("Goodbye")));
+      });
+
+      expectTestFailed(liveTest,
+          "Expected: prints contains 'Goodbye'\n"
+          "  Actual: <10>\n");
+    });
+  });
+
+  group('asynchronous', () {
+    test("passes with an expected print", () {
+      expect(() => new Future(() => print("Hello, world!")),
+          prints("Hello, world!\n"));
+    });
+
+    test("combines multiple prints", () {
+      expect(() => new Future(() {
+        print("Hello");
+        print("World!");
+      }), prints("Hello\nWorld!\n"));
+    });
+
+    test("works with a Matcher", () {
+      expect(() => new Future(() => print("Hello, world!")),
+          prints(contains("Hello")));
+    });
+
+    test("describes a failure nicely", () async {
+      var closure = () => new Future(() => print("Hello, world!"));
+      var liveTest = await runTestBody(() {
+        expect(closure, prints("Goodbye, world!\n"));
+      });
+
+      expectTestFailed(liveTest, allOf([
+        startsWith(
+            "Expected: prints 'Goodbye, world!\\n'\n"
+            "  ''\n"
+            "  Actual: <"),
+        contains(">\n"
+            "   Which: printed 'Hello, world!\\n'\n"
+            "  ''\n"
+            "   Which: is different.\n"
+            "Expected: Goodbye, w ...\n"
+            "  Actual: Hello, wor ...\n"
+            "          ^\n"
+            " Differ at offset 0")
+      ]));
+    });
+
+    test("describes a failure with a non-descriptive Matcher nicely", () async {
+      var closure = () => new Future(() => print("Hello, world!"));
+      var liveTest = await runTestBody(() {
+        expect(closure, prints(contains("Goodbye")));
+      });
+
+      expectTestFailed(liveTest, allOf([
+        startsWith(
+            "Expected: prints contains 'Goodbye'\n"
+            "  Actual: <"),
+        contains(">\n"
+            "   Which: printed 'Hello, world!\\n'\n"
+            "  ''")
+      ]));
+    });
+
+    test("describes a failure with no text nicely", () async {
+      var closure = () => new Future.value();
+      var liveTest = await runTestBody(() {
+        expect(closure, prints(contains("Goodbye")));
+      });
+
+      expectTestFailed(liveTest, allOf([
+        startsWith(
+            "Expected: prints contains 'Goodbye'\n"
+            "  Actual: <"),
+        contains(">\n"
+            "   Which: printed nothing.")
+      ]));
+    });
+
+    test("won't let the test end until the Future completes", () {
+      return expectTestBlocks(() {
+        var completer = new Completer();
+        expect(() => completer.future, prints(isEmpty));
+        return completer;
+      }, (completer) => completer.complete());
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/frontend/matcher/throws_test.dart b/mojo/public/dart/third_party/test/test/frontend/matcher/throws_test.dart
new file mode 100644
index 0000000..5b3e099
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/frontend/matcher/throws_test.dart
@@ -0,0 +1,163 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+import '../../utils.dart';
+
+void main() {
+  group("synchronous", () {
+    group("[throws]", () {
+      test("with a function that throws an error", () {
+        expect(() => throw 'oh no', throws);
+      });
+
+      test("with a function that doesn't throw", () async {
+        var closure = () {};
+        var liveTest = await runTestBody(() {
+          expect(closure, throws);
+        });
+
+        expectTestFailed(liveTest, allOf([
+          startsWith(
+              "Expected: throws\n"
+              "  Actual: <"),
+          endsWith(">\n"
+              "   Which: did not throw\n")
+        ]));
+      });
+
+      test("with a non-function", () async {
+        var liveTest = await runTestBody(() {
+          expect(10, throws);
+        });
+
+        expectTestFailed(liveTest,
+            "Expected: throws\n"
+            "  Actual: <10>\n"
+            "   Which: is not a Function or Future\n");
+      });
+    });
+
+    group("[throwsA]", () {
+      test("with a function that throws an identical error", () {
+        expect(() => throw 'oh no', throwsA('oh no'));
+      });
+
+      test("with a function that throws a matching error", () {
+        expect(() => throw new FormatException("bad"),
+            throwsA(isFormatException));
+      });
+
+      test("with a function that doesn't throw", () async {
+        var closure = () {};
+        var liveTest = await runTestBody(() {
+          expect(closure, throwsA('oh no'));
+        });
+
+        expectTestFailed(liveTest, allOf([
+          startsWith(
+              "Expected: throws 'oh no'\n"
+              "  Actual: <"),
+          endsWith(">\n"
+              "   Which: did not throw\n")
+        ]));
+      });
+
+      test("with a non-function", () async {
+        var liveTest = await runTestBody(() {
+          expect(10, throwsA('oh no'));
+        });
+
+        expectTestFailed(liveTest,
+            "Expected: throws 'oh no'\n"
+            "  Actual: <10>\n"
+            "   Which: is not a Function or Future\n");
+      });
+
+      test("with a function that throws the wrong error", () async {
+        var liveTest = await runTestBody(() {
+          expect(() => throw 'aw dang', throwsA('oh no'));
+        });
+
+        expectTestFailed(liveTest, allOf([
+          startsWith(
+              "Expected: throws 'oh no'\n"
+              "  Actual: <"),
+          endsWith(">\n"
+              "   Which: threw 'aw dang'\n")
+        ]));
+      });
+    });
+  });
+
+  group("asynchronous", () {
+    group("[throws]", () {
+      test("with a Future that throws an error", () {
+        expect(new Future.error('oh no'), throws);
+      });
+
+      test("with a Future that doesn't throw", () async {
+        var liveTest = await runTestBody(() {
+          expect(new Future.value(), throws);
+        });
+
+        expectTestFailed(liveTest,
+            "Expected future to fail, but succeeded with 'null'.");
+      });
+
+      test("won't let the test end until the Future completes", () {
+        return expectTestBlocks(() {
+          var completer = new Completer();
+          expect(completer.future, throws);
+          return completer;
+        }, (completer) => completer.completeError('oh no'));
+      });
+    });
+
+    group("[throwsA]", () {
+      test("with a Future that throws an identical error", () {
+        expect(new Future.error('oh no'), throwsA('oh no'));
+      });
+
+      test("with a Future that throws a matching error", () {
+        expect(new Future.error(new FormatException("bad")),
+            throwsA(isFormatException));
+      });
+
+      test("with a Future that doesn't throw", () async {
+        var liveTest = await runTestBody(() {
+          expect(new Future.value(), throwsA('oh no'));
+        });
+
+        expectTestFailed(liveTest,
+            "Expected future to fail, but succeeded with 'null'.");
+      });
+
+      test("with a Future that throws the wrong error", () async {
+        var liveTest = await runTestBody(() {
+          expect(new Future.error('aw dang'), throwsA('oh no'));
+        });
+
+        expectTestFailed(liveTest, allOf([
+          startsWith(
+              "Expected: throws 'oh no'\n"
+              "  Actual: <"),
+          contains(">\n"
+              "   Which: threw 'aw dang'\n")
+        ]));
+      });
+
+      test("won't let the test end until the Future completes", () {
+        return expectTestBlocks(() {
+          var completer = new Completer();
+          expect(completer.future, throwsA('oh no'));
+          return completer;
+        }, (completer) => completer.completeError('oh no'));
+      });
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/frontend/matcher/throws_type_test.dart b/mojo/public/dart/third_party/test/test/frontend/matcher/throws_type_test.dart
new file mode 100644
index 0000000..ff34ae3
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/frontend/matcher/throws_type_test.dart
@@ -0,0 +1,178 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+
+import '../../utils.dart';
+
+void main() {
+  group('[throwsArgumentError]', () {
+    test("passes when a ArgumentError is thrown", () {
+      expect(() => throw new ArgumentError(''), throwsArgumentError);
+    });
+
+    test("fails when a non-ArgumentError is thrown", () async {
+      var liveTest = await runTestBody(() {
+        expect(() => throw new Exception(), throwsArgumentError);
+      });
+
+      expectTestFailed(liveTest,
+          startsWith("Expected: throws ArgumentError"));
+    });
+  });
+
+  group('[throwsConcurrentModificationError]', () {
+    test("passes when a ConcurrentModificationError is thrown", () {
+      expect(() => throw new ConcurrentModificationError(''),
+          throwsConcurrentModificationError);
+    });
+
+    test("fails when a non-ConcurrentModificationError is thrown", () async {
+      var liveTest = await runTestBody(() {
+        expect(() => throw new Exception(), throwsConcurrentModificationError);
+      });
+
+      expectTestFailed(liveTest,
+          startsWith("Expected: throws ConcurrentModificationError"));
+    });
+  });
+
+  group('[throwsCyclicInitializationError]', () {
+    test("passes when a CyclicInitializationError is thrown", () {
+      expect(() => throw new CyclicInitializationError(''),
+          throwsCyclicInitializationError);
+    });
+
+    test("fails when a non-CyclicInitializationError is thrown", () async {
+      var liveTest = await runTestBody(() {
+        expect(() => throw new Exception(), throwsCyclicInitializationError);
+      });
+
+      expectTestFailed(liveTest,
+          startsWith("Expected: throws CyclicInitializationError"));
+    });
+  });
+
+  group('[throwsException]', () {
+    test("passes when a Exception is thrown", () {
+      expect(() => throw new Exception(''), throwsException);
+    });
+
+    test("fails when a non-Exception is thrown", () async {
+      var liveTest = await runTestBody(() {
+        expect(() => throw 'oh no', throwsException);
+      });
+
+      expectTestFailed(liveTest,
+          startsWith("Expected: throws Exception"));
+    });
+  });
+
+  group('[throwsFormatException]', () {
+    test("passes when a FormatException is thrown", () {
+      expect(() => throw new FormatException(''), throwsFormatException);
+    });
+
+    test("fails when a non-FormatException is thrown", () async {
+      var liveTest = await runTestBody(() {
+        expect(() => throw new Exception(), throwsFormatException);
+      });
+
+      expectTestFailed(liveTest,
+          startsWith("Expected: throws FormatException"));
+    });
+  });
+
+  group('[throwsNoSuchMethodError]', () {
+    test("passes when a NoSuchMethodError is thrown", () {
+      expect(() {
+        throw new NoSuchMethodError(null, #name, null, null);
+      }, throwsNoSuchMethodError);
+    });
+
+    test("fails when a non-NoSuchMethodError is thrown", () async {
+      var liveTest = await runTestBody(() {
+        expect(() => throw new Exception(), throwsNoSuchMethodError);
+      });
+
+      expectTestFailed(liveTest,
+          startsWith("Expected: throws NoSuchMethodError"));
+    });
+  });
+
+  group('[throwsNullThrownError]', () {
+    test("passes when a NullThrownError is thrown", () {
+      expect(() => throw null, throwsNullThrownError);
+    });
+
+    test("fails when a non-NullThrownError is thrown", () async {
+      var liveTest = await runTestBody(() {
+        expect(() => throw new Exception(), throwsNullThrownError);
+      });
+
+      expectTestFailed(liveTest,
+          startsWith("Expected: throws NullThrownError"));
+    });
+  });
+
+  group('[throwsRangeError]', () {
+    test("passes when a RangeError is thrown", () {
+      expect(() => throw new RangeError(''), throwsRangeError);
+    });
+
+    test("fails when a non-RangeError is thrown", () async {
+      var liveTest = await runTestBody(() {
+        expect(() => throw new Exception(), throwsRangeError);
+      });
+
+      expectTestFailed(liveTest,
+          startsWith("Expected: throws RangeError"));
+    });
+  });
+
+  group('[throwsStateError]', () {
+    test("passes when a StateError is thrown", () {
+      expect(() => throw new StateError(''), throwsStateError);
+    });
+
+    test("fails when a non-StateError is thrown", () async {
+      var liveTest = await runTestBody(() {
+        expect(() => throw new Exception(), throwsStateError);
+      });
+
+      expectTestFailed(liveTest,
+          startsWith("Expected: throws StateError"));
+    });
+  });
+
+  group('[throwsUnimplementedError]', () {
+    test("passes when a UnimplementedError is thrown", () {
+      expect(() => throw new UnimplementedError(''), throwsUnimplementedError);
+    });
+
+    test("fails when a non-UnimplementedError is thrown", () async {
+      var liveTest = await runTestBody(() {
+        expect(() => throw new Exception(), throwsUnimplementedError);
+      });
+
+      expectTestFailed(liveTest,
+          startsWith("Expected: throws UnimplementedError"));
+    });
+  });
+
+  group('[throwsUnsupportedError]', () {
+    test("passes when a UnsupportedError is thrown", () {
+      expect(() => throw new UnsupportedError(''), throwsUnsupportedError);
+    });
+
+    test("fails when a non-UnsupportedError is thrown", () async {
+      var liveTest = await runTestBody(() {
+        expect(() => throw new Exception(), throwsUnsupportedError);
+      });
+
+      expectTestFailed(liveTest,
+          startsWith("Expected: throws UnsupportedError"));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/io.dart b/mojo/public/dart/third_party/test/test/io.dart
new file mode 100644
index 0000000..fc727e3
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/io.dart
@@ -0,0 +1,169 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.test.io;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_process.dart';
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:test/src/util/io.dart';
+
+/// The path to the root directory of the `test` package.
+final String packageDir = p.dirname(p.dirname(libraryPath(#test.test.io)));
+
+/// The path to the `pub` executable in the current Dart SDK.
+final _pubPath = p.absolute(p.join(
+    p.dirname(Platform.resolvedExecutable),
+    Platform.isWindows ? 'pub.bat' : 'pub'));
+
+/// The platform-specific message emitted when a nonexistent file is loaded.
+final String noSuchFileMessage = Platform.isWindows
+    ? "The system cannot find the file specified."
+    : "No such file or directory";
+
+/// A regular expression that matches the output of "pub serve".
+final _servingRegExp =
+    new RegExp(r'^Serving myapp [a-z]+ on http://localhost:(\d+)$');
+
+/// A future that will return the port of a pub serve instance run via
+/// [runPubServe].
+///
+/// This should only be called after [runPubServe].
+Future<int> get pubServePort => _pubServePortCompleter.future;
+Completer<int> _pubServePortCompleter;
+
+/// The path to the sandbox directory.
+///
+/// This is only set in tests for which [useSandbox] is active.
+String get sandbox => _sandbox;
+String _sandbox;
+
+/// Declares a [setUp] function that creates a sandbox diretory and sets it as
+/// the default for scheduled_test's directory descriptors.
+///
+/// This should be called outside of any tests. If [additionalSetup] is passed,
+/// it's run after the sandbox creation has been scheduled.
+void useSandbox([void additionalSetup()]) {
+  setUp(() {
+    _sandbox = createTempDir();
+    d.defaultRoot = _sandbox;
+
+    currentSchedule.onComplete.schedule(() {
+      try {
+        new Directory(_sandbox).deleteSync(recursive: true);
+      } on IOException catch (_) {
+        // Silently swallow exceptions on Windows. If the test failed, there may
+        // still be lingering processes that have files in the sandbox open,
+        // which will cause this to fail on Windows.
+        if (!Platform.isWindows) rethrow;
+      }
+    }, 'deleting the sandbox directory');
+
+    if (additionalSetup != null) additionalSetup();
+  });
+}
+
+/// Expects that the entire stdout stream of [test] equals [expected].
+void expectStdoutEquals(ScheduledProcess test, String expected) =>
+    _expectStreamEquals(test.stdoutStream(), expected);
+
+/// Expects that the entire stderr stream of [test] equals [expected].
+void expectStderrEquals(ScheduledProcess test, String expected) =>
+    _expectStreamEquals(test.stderrStream(), expected);
+
+/// Expects that the entirety of the line stream [stream] equals [expected].
+void _expectStreamEquals(Stream<String> stream, String expected) {
+  expect((() async {
+    var lines = await stream.toList();
+    expect(lines.join("\n").trim(), equals(expected.trim()));
+  })(), completes);
+}
+
+/// Returns a [StreamMatcher] that asserts that the stream emits strings
+/// containing each string in [strings] in order.
+///
+/// This expects each string in [strings] to match a different string in the
+/// stream.
+StreamMatcher containsInOrder(Iterable<String> strings) =>
+    inOrder(strings.map((string) => consumeThrough(contains(string))));
+
+/// Runs the test executable with the package root set properly.
+ScheduledProcess runTest(List args, {bool compact: false,
+    int concurrency, Map<String, String> environment}) {
+  if (concurrency == null) concurrency = 1;
+
+  var allArgs = [
+    p.absolute(p.join(packageDir, 'bin/test.dart')),
+    "--package-root=${p.join(packageDir, 'packages')}",
+    "--concurrency=$concurrency"
+  ];
+
+  if (!compact) allArgs.addAll(["-r", "expanded"]);
+  allArgs.addAll(args);
+
+  if (environment == null) environment = {};
+  environment.putIfAbsent("_UNITTEST_USE_COLOR", () => "false");
+
+  return runDart(allArgs,
+      environment: environment,
+      description: "dart bin/test.dart");
+}
+
+/// Runs Dart.
+ScheduledProcess runDart(List args, {Map<String, String> environment,
+    String description}) {
+  var allArgs = Platform.executableArguments.map((arg) {
+    // The package root might be relative, so we need to make it absolute if
+    // we're going to run in a different working directory.
+    if (!arg.startsWith("--package-root=")) return arg;
+    return "--package-root=" +
+        p.absolute(p.fromUri(arg.substring("--package-root=".length)));
+  }).toList()..addAll(args);
+
+  return new ScheduledProcess.start(
+      p.absolute(Platform.resolvedExecutable), allArgs,
+      workingDirectory: _sandbox,
+      environment: environment,
+      description: description);
+}
+
+/// Runs Pub.
+ScheduledProcess runPub(List args, {Map<String, String> environment}) {
+  return new ScheduledProcess.start(
+      _pubPath, args,
+      workingDirectory: _sandbox,
+      environment: environment,
+      description: "pub ${args.first}");
+}
+
+/// Runs "pub serve".
+///
+/// This returns assigns [_pubServePort] to a future that will complete to the
+/// port of the "pub serve" instance.
+ScheduledProcess runPubServe({List args, String workingDirectory,
+    Map<String, String> environment}) {
+  _pubServePortCompleter = new Completer();
+  currentSchedule.onComplete.schedule(() => _pubServePortCompleter = null);
+
+  var allArgs = ['serve', '--port', '0'];
+  if (args != null) allArgs.addAll(args);
+
+  var pub = runPub(allArgs, environment: environment);
+
+  schedule(() async {
+    var match;
+    while (match == null) {
+      var line = await pub.stdout.next();
+      match = _servingRegExp.firstMatch(line);
+    }
+    _pubServePortCompleter.complete(int.parse(match[1]));
+  }, "waiting for pub serve to emit its port number");
+
+  return pub;
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/browser/chrome_test.dart b/mojo/public/dart/third_party/test/test/runner/browser/chrome_test.dart
new file mode 100644
index 0000000..3011670
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/browser/chrome_test.dart
@@ -0,0 +1,87 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:test/src/runner/browser/chrome.dart';
+
+import '../../io.dart';
+import '../../utils.dart';
+import 'code_server.dart';
+
+void main() {
+  useSandbox();
+
+  test("starts Chrome with the given URL", () {
+    var server = new CodeServer();
+
+    schedule(() async {
+      var chrome = new Chrome(await server.url);
+      currentSchedule.onComplete.schedule(() async => (await chrome).close());
+    });
+
+    server.handleJavaScript('''
+var webSocket = new WebSocket(window.location.href.replace("http://", "ws://"));
+webSocket.addEventListener("open", function() {
+  webSocket.send("loaded!");
+});
+''');
+
+    var webSocket = server.handleWebSocket();
+
+    schedule(() async {
+      expect(await (await webSocket).first, equals("loaded!"));
+    });
+  },
+      // It's not clear why, but this test in particular seems to time out
+      // when run in parallel with many other tests.
+      timeout: new Timeout.factor(2));
+
+  test("a process can be killed synchronously after it's started", () async {
+    var server = new CodeServer();
+
+    schedule(() async {
+      var chrome = new Chrome(await server.url);
+      await chrome.close();
+    });
+  });
+
+  test("reports an error in onExit", () {
+    var chrome = new Chrome("http://dart-lang.org",
+        executable: "_does_not_exist");
+    expect(chrome.onExit, throwsA(isApplicationException(startsWith(
+        "Failed to run Chrome: $noSuchFileMessage"))));
+  });
+
+  test("can run successful tests", () {
+    d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {});
+}
+""").create();
+
+    var test = runTest(["-p", "chrome", "test.dart"]);
+    test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+    test.shouldExit(0);
+  });
+
+  test("can run failing tests", () {
+    d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  test("failure", () => throw new TestFailure("oh no"));
+}
+""").create();
+
+    var test = runTest(["-p", "chrome", "test.dart"]);
+    test.stdout.expect(consumeThrough(contains("-1: Some tests failed.")));
+    test.shouldExit(1);
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/browser/code_server.dart b/mojo/public/dart/third_party/test/test/runner/browser/code_server.dart
new file mode 100644
index 0000000..9b114cd
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/browser/code_server.dart
@@ -0,0 +1,87 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:shelf_web_socket/shelf_web_socket.dart';
+import 'package:scheduled_test/scheduled_server.dart';
+
+/// A class that schedules a server to serve Dart and/or JS code and receive
+/// WebSocket connections.
+///
+/// This uses [ScheduledServer] under the hood, and has similar semantics: its
+/// `handle*` methods all schedule a handler that must be hit before the
+/// schedule will continue.
+class CodeServer {
+  /// The underlying server.
+  final ScheduledServer _server;
+
+  /// The URL of the server (including the port), once it's actually
+  /// instantiated.
+  Future<Uri> get url => _server.url;
+
+  /// The port of the server, once it's actually instantiated.
+  Future<int> get port => _server.port;
+
+  CodeServer()
+      : _server = new ScheduledServer("code server") {
+    _server.handleUnscheduled("GET", "/favicon.ico",
+        (_) => new shelf.Response.notFound(null));
+  }
+
+  /// Sets up a handler for the root of the server, "/", that serves a basic
+  /// HTML page with a script tag that will run [dart].
+  void handleDart(String dart) {
+    _server.handle("GET", "/", (_) {
+      return new shelf.Response.ok("""
+<!doctype html>
+<html>
+<head>
+  <script type="application/dart" src="index.dart"></script>
+</head>
+</html>
+""", headers: {'content-type': 'text/html'});
+    });
+
+    _server.handle("GET", "/index.dart", (_) {
+      return new shelf.Response.ok('''
+import "dart:html";
+
+main() async {
+  $dart
+}
+''', headers: {'content-type': 'application/dart'});
+    });
+  }
+
+  /// Sets up a handler for the root of the server, "/", that serves a basic
+  /// HTML page with a script tag that will run [javaScript].
+  void handleJavaScript(String javaScript) {
+    _server.handle("GET", "/", (_) {
+      return new shelf.Response.ok("""
+<!doctype html>
+<html>
+<head>
+  <script src="index.js"></script>
+</head>
+</html>
+""", headers: {'content-type': 'text/html'});
+    });
+
+    _server.handle("GET", "/index.js", (_) {
+      return new shelf.Response.ok(javaScript,
+          headers: {'content-type': 'application/javascript'});
+    });
+  }
+
+  /// Handles a WebSocket connection to the root of the server, and returns a
+  /// future that will complete to the WebSocket.
+  Future<WebSocket> handleWebSocket() {
+    var completer = new Completer();
+    _server.handle("GET", "/", webSocketHandler(completer.complete));
+    return completer.future;
+  }
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/browser/compact_reporter_test.dart b/mojo/public/dart/third_party/test/test/runner/browser/compact_reporter_test.dart
new file mode 100644
index 0000000..30d402b
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/browser/compact_reporter_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../io.dart';
+
+void main() {
+  useSandbox();
+
+  test("prints the platform name when running on multiple platforms", () {
+    d.file("test.dart", """
+import 'dart:async';
+
+import 'package:path/path.dart' as p;
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {});
+}
+""").create();
+
+    var test = runTest([
+      "-r", "compact",
+      "-p", "content-shell",
+      "-p", "vm",
+      "-j", "1",
+      "test.dart"
+    ], compact: true);
+
+    test.stdout.expect(containsInOrder(["[VM]", "[Dartium Content Shell]"]));
+
+    test.shouldExit(0);
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/browser/content_shell_test.dart b/mojo/public/dart/third_party/test/test/runner/browser/content_shell_test.dart
new file mode 100644
index 0000000..afe6415
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/browser/content_shell_test.dart
@@ -0,0 +1,85 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:test/src/runner/browser/content_shell.dart';
+
+import '../../io.dart';
+import '../../utils.dart';
+import 'code_server.dart';
+
+void main() {
+  useSandbox();
+
+  test("starts content shell with the given URL", () {
+    var server = new CodeServer();
+
+    schedule(() async {
+      var contentShell = new ContentShell(await server.url);
+      currentSchedule.onComplete.schedule(
+          () async => (await contentShell).close());
+    });
+
+    server.handleDart('''
+var webSocket = new WebSocket(
+    window.location.href.replaceFirst("http://", "ws://"));
+await webSocket.onOpen.first;
+webSocket.send("loaded!");
+''');
+
+    var webSocket = server.handleWebSocket();
+
+    schedule(() async {
+      expect(await (await webSocket).first, equals("loaded!"));
+    });
+  }, skip: "Failing with mysterious WebSocket issues.");
+
+  test("a process can be killed synchronously after it's started", () async {
+    var server = new CodeServer();
+
+    schedule(() async {
+      var contentShell = new ContentShell(await server.url);
+      await contentShell.close();
+    });
+  });
+
+  test("reports an error in onExit", () {
+    var contentShell = new ContentShell("http://dart-lang.org",
+        executable: "_does_not_exist");
+    expect(contentShell.onExit, throwsA(isApplicationException(startsWith(
+        "Failed to run Content Shell: $noSuchFileMessage"))));
+  });
+
+  test("can run successful tests", () {
+    d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {});
+}
+""").create();
+
+    var test = runTest(["-p", "content-shell", "test.dart"]);
+    test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+    test.shouldExit(0);
+  });
+
+  test("can run failing tests", () {
+    d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  test("failure", () => throw new TestFailure("oh no"));
+}
+""").create();
+
+    var test = runTest(["-p", "content-shell", "test.dart"]);
+    test.stdout.expect(consumeThrough(contains("-1: Some tests failed.")));
+    test.shouldExit(1);
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/browser/dartium_test.dart b/mojo/public/dart/third_party/test/test/runner/browser/dartium_test.dart
new file mode 100644
index 0000000..cb51c39
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/browser/dartium_test.dart
@@ -0,0 +1,85 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:test/src/runner/browser/dartium.dart';
+
+import '../../io.dart';
+import '../../utils.dart';
+import 'code_server.dart';
+
+void main() {
+  useSandbox();
+
+  test("starts Dartium with the given URL", () {
+    var server = new CodeServer();
+
+    schedule(() async {
+      var dartium = new Dartium(await server.url);
+      currentSchedule.onComplete.schedule(() async => (await dartium).close());
+    });
+
+    server.handleDart('''
+var webSocket = new WebSocket(
+    window.location.href.replaceFirst("http://", "ws://"));
+await webSocket.onOpen.first;
+webSocket.send("loaded!");
+''');
+
+    var webSocket = server.handleWebSocket();
+
+    schedule(() async {
+      expect(await (await webSocket).first, equals("loaded!"));
+    });
+  });
+
+  test("a process can be killed synchronously after it's started", () async {
+    var server = new CodeServer();
+
+    schedule(() async {
+      var dartium = new Dartium(await server.url);
+      await dartium.close();
+    });
+  });
+
+  test("reports an error in onExit", () {
+    var dartium = new Dartium("http://dart-lang.org",
+        executable: "_does_not_exist");
+    expect(dartium.onExit, throwsA(isApplicationException(startsWith(
+        "Failed to run Dartium: $noSuchFileMessage"))));
+  });
+
+  test("can run successful tests", () {
+    d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {});
+}
+""").create();
+
+    var test = runTest(["-p", "dartium", "test.dart"]);
+    test.stdout.fork().expect(never(contains("Compiling")));
+    test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+    test.shouldExit(0);
+  });
+
+  test("can run failing tests", () {
+    d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  test("failure", () => throw new TestFailure("oh no"));
+}
+""").create();
+
+    var test = runTest(["-p", "dartium", "test.dart"]);
+    test.stdout.expect(consumeThrough(contains("-1: Some tests failed.")));
+    test.shouldExit(1);
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/browser/expanded_reporter_test.dart b/mojo/public/dart/third_party/test/test/runner/browser/expanded_reporter_test.dart
new file mode 100644
index 0000000..06ca547
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/browser/expanded_reporter_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../io.dart';
+
+void main() {
+  useSandbox();
+
+  test("prints the platform name when running on multiple platforms", () {
+    d.file("test.dart", """
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {});
+}
+""").create();
+
+    var test = runTest([
+      "-r", "expanded",
+      "-p", "content-shell",
+      "-p", "vm",
+      "-j", "1",
+      "test.dart"
+    ]);
+
+    test.stdout.fork().expect(consumeThrough(contains("[VM]")));
+    test.stdout.expect(consumeThrough(contains("[Dartium Content Shell]")));
+    test.shouldExit(0);
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/browser/firefox_html_test.dart b/mojo/public/dart/third_party/test/test/runner/browser/firefox_html_test.dart
new file mode 100644
index 0000000..5b5f8be
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/browser/firefox_html_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("firefox")
+
+import 'dart:html';
+
+import 'package:test/test.dart';
+
+void main() {
+  // Regression test for #274. Firefox doesn't compute styles within hidden
+  // iframes (https://bugzilla.mozilla.org/show_bug.cgi?id=548397), so we have
+  // to do some special stuff to make sure tests that care about that work.
+  test("getComputedStyle() works", () {
+    expect(document.body.getComputedStyle(), isNotNull);
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/browser/firefox_test.dart b/mojo/public/dart/third_party/test/test/runner/browser/firefox_test.dart
new file mode 100644
index 0000000..f123679
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/browser/firefox_test.dart
@@ -0,0 +1,84 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:test/src/runner/browser/firefox.dart';
+
+import '../../io.dart';
+import '../../utils.dart';
+import 'code_server.dart';
+
+void main() {
+  useSandbox();
+
+  test("starts Firefox with the given URL", () {
+    var server = new CodeServer();
+
+    schedule(() async {
+      var firefox = new Firefox(await server.url);
+      currentSchedule.onComplete.schedule(() async => (await firefox).close());
+    });
+
+    server.handleJavaScript('''
+var webSocket = new WebSocket(window.location.href.replace("http://", "ws://"));
+webSocket.addEventListener("open", function() {
+  webSocket.send("loaded!");
+});
+''');
+
+    var webSocket = server.handleWebSocket();
+
+    schedule(() async {
+      expect(await (await webSocket).first, equals("loaded!"));
+    });
+  });
+
+  test("a process can be killed synchronously after it's started", () async {
+    var server = new CodeServer();
+
+    schedule(() async {
+      var firefox = new Firefox(await server.url);
+      await firefox.close();
+    });
+  });
+
+  test("reports an error in onExit", () {
+    var firefox = new Firefox("http://dart-lang.org",
+        executable: "_does_not_exist");
+    expect(firefox.onExit, throwsA(isApplicationException(startsWith(
+        "Failed to run Firefox: $noSuchFileMessage"))));
+  });
+
+  test("can run successful tests", () {
+    d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {});
+}
+""").create();
+
+    var test = runTest(["-p", "firefox", "test.dart"]);
+    test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+    test.shouldExit(0);
+  });
+
+  test("can run failing tests", () {
+    d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  test("failure", () => throw new TestFailure("oh no"));
+}
+""").create();
+
+    var test = runTest(["-p", "firefox", "test.dart"]);
+    test.stdout.expect(consumeThrough(contains("-1: Some tests failed.")));
+    test.shouldExit(1);
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/browser/internet_explorer_test.dart b/mojo/public/dart/third_party/test/test/runner/browser/internet_explorer_test.dart
new file mode 100644
index 0000000..f363f44
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/browser/internet_explorer_test.dart
@@ -0,0 +1,84 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm && windows")
+
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:test/src/runner/browser/internet_explorer.dart';
+
+import '../../io.dart';
+import '../../utils.dart';
+import 'code_server.dart';
+
+void main() {
+  useSandbox();
+
+  test("starts IE with the given URL", () async {
+    var server = new CodeServer();
+
+    schedule(() async {
+      var ie = new InternetExplorer(await server.url);
+      currentSchedule.onComplete.schedule(() async => (await ie).close());
+    });
+
+    server.handleJavaScript('''
+var webSocket = new WebSocket(window.location.href.replace("http://", "ws://"));
+webSocket.addEventListener("open", function() {
+  webSocket.send("loaded!");
+});
+''');
+
+    var webSocket = server.handleWebSocket();
+
+    schedule(() async {
+      expect(await (await webSocket).first, equals("loaded!"));
+    });
+  });
+
+  test("a process can be killed synchronously after it's started", () async {
+    var server = new CodeServer();
+
+    schedule(() async {
+      var ie = new InternetExplorer(await server.url);
+      await ie.close();
+    });
+  });
+
+  test("reports an error in onExit", () {
+    var ie = new InternetExplorer("http://dart-lang.org",
+        executable: "_does_not_exist");
+    expect(ie.onExit, throwsA(isApplicationException(startsWith(
+        "Failed to run Internet Explorer: $noSuchFileMessage"))));
+  });
+
+  test("can run successful tests", () {
+    d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {});
+}
+""").create();
+
+    var test = runTest(["-p", "ie", "test.dart"]);
+    test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+    test.shouldExit(0);
+  });
+
+  test("can run failing tests", () {
+    d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  test("failure", () => throw new TestFailure("oh no"));
+}
+""").create();
+
+    var test = runTest(["-p", "ie", "test.dart"]);
+    test.stdout.expect(consumeThrough(contains("-1: Some tests failed.")));
+    test.shouldExit(1);
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/browser/loader_test.dart b/mojo/public/dart/third_party/test/test/runner/browser/loader_test.dart
new file mode 100644
index 0000000..6d2a0a6
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/browser/loader_test.dart
@@ -0,0 +1,170 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:test/src/backend/state.dart';
+import 'package:test/src/backend/test_platform.dart';
+import 'package:test/src/runner/configuration.dart';
+import 'package:test/src/runner/loader.dart';
+import 'package:test/src/util/io.dart';
+import 'package:test/test.dart';
+
+import '../../io.dart';
+import '../../utils.dart';
+
+Loader _loader;
+String _sandbox;
+
+final _tests = """
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {});
+  test("failure", () => throw new TestFailure('oh no'));
+  test("error", () => throw 'oh no');
+}
+""";
+
+void main() {
+  setUp(() {
+    _sandbox = createTempDir();
+    _loader = new Loader(new Configuration(
+            platforms: [TestPlatform.chrome],
+            packageRoot: p.join(packageDir, 'packages')),
+        root: _sandbox);
+    /// TODO(nweiz): Use scheduled_test for this once it's compatible with this
+    /// version of test.
+    new File(p.join(_sandbox, 'a_test.dart')).writeAsStringSync(_tests);
+  });
+
+  tearDown(() {
+    new Directory(_sandbox).deleteSync(recursive: true);
+    return _loader.close();
+  });
+
+  group(".loadFile()", () {
+    var suite;
+    setUp(() async {
+      var suites = await _loader.loadFile(p.join(_sandbox, 'a_test.dart'))
+          .toList();
+
+      expect(suites, hasLength(1));
+      var loadSuite = suites.first;
+      suite = await loadSuite.getSuite();
+    });
+
+    test("returns a suite with the file path and platform", () {
+      expect(suite.path, equals(p.join(_sandbox, 'a_test.dart')));
+      expect(suite.platform, equals(TestPlatform.chrome));
+    });
+
+    test("returns tests with the correct names", () {
+      expect(suite.tests, hasLength(3));
+      expect(suite.tests[0].name, equals("success"));
+      expect(suite.tests[1].name, equals("failure"));
+      expect(suite.tests[2].name, equals("error"));
+    });
+
+    test("can load and run a successful test", () {
+      var liveTest = suite.tests[0].load(suite);
+
+      expectStates(liveTest, [
+        const State(Status.running, Result.success),
+        const State(Status.complete, Result.success)
+      ]);
+      expectErrors(liveTest, []);
+
+      return liveTest.run().whenComplete(() => liveTest.close());
+    });
+
+    test("can load and run a failing test", () {
+      var liveTest = suite.tests[1].load(suite);
+      expectSingleFailure(liveTest);
+      return liveTest.run().whenComplete(() => liveTest.close());
+    });
+  });
+
+
+  test("loads tests that are defined asynchronously", () async {
+    new File(p.join(_sandbox, 'a_test.dart')).writeAsStringSync("""
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+Future main() {
+  return new Future(() {
+    test("success", () {});
+
+    return new Future(() {
+      test("failure", () => throw new TestFailure('oh no'));
+
+      return new Future(() {
+        test("error", () => throw 'oh no');
+      });
+    });
+  });
+}
+""");
+
+    var suites = await _loader.loadFile(p.join(_sandbox, 'a_test.dart'))
+        .toList();
+    expect(suites, hasLength(1));
+    var loadSuite = suites.first;
+    var suite = await loadSuite.getSuite();
+    expect(suite.tests, hasLength(3));
+    expect(suite.tests[0].name, equals("success"));
+    expect(suite.tests[1].name, equals("failure"));
+    expect(suite.tests[2].name, equals("error"));
+  });
+
+  test("loads a suite both in the browser and the VM", () async {
+    var loader = new Loader(
+        new Configuration(
+            platforms: [TestPlatform.vm, TestPlatform.chrome],
+            packageRoot: p.join(packageDir, 'packages')),
+        root: _sandbox);
+    var path = p.join(_sandbox, 'a_test.dart');
+
+    try {
+      var suites = await loader.loadFile(path)
+          .asyncMap((loadSuite) => loadSuite.getSuite()).toList();
+      expect(suites[0].platform, equals(TestPlatform.vm));
+      expect(suites[0].path, equals(path));
+      expect(suites[1].platform, equals(TestPlatform.chrome));
+      expect(suites[1].path, equals(path));
+
+      for (var suite in suites) {
+        expect(suite.tests, hasLength(3));
+        expect(suite.tests[0].name, equals("success"));
+        expect(suite.tests[1].name, equals("failure"));
+        expect(suite.tests[2].name, equals("error"));
+      }
+    } finally {
+      await loader.close();
+    }
+  });
+
+  test("a print in a loaded file is piped through the LoadSuite", () async {
+    new File(p.join(_sandbox, 'a_test.dart')).writeAsStringSync("""
+void main() {
+  print('print within test');
+}
+""");
+    var suites = await _loader.loadFile(p.join(_sandbox, 'a_test.dart'))
+        .toList();
+    expect(suites, hasLength(1));
+    var loadSuite = suites.first;
+
+    var liveTest = await loadSuite.tests.single.load(loadSuite);
+    expect(liveTest.onPrint.first, completion(equals("print within test")));
+    await liveTest.run();
+    expectTestPassed(liveTest);
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/browser/phantom_js_test.dart b/mojo/public/dart/third_party/test/test/runner/browser/phantom_js_test.dart
new file mode 100644
index 0000000..1e915a3
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/browser/phantom_js_test.dart
@@ -0,0 +1,85 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:test/src/runner/browser/phantom_js.dart';
+
+import '../../io.dart';
+import '../../utils.dart';
+import 'code_server.dart';
+
+void main() {
+  useSandbox();
+
+  test("starts PhantomJS with the given URL", () {
+    var server = new CodeServer();
+
+    schedule(() async {
+      var phantomJS = new PhantomJS(await server.url);
+      currentSchedule.onComplete.schedule(
+          () async => (await phantomJS).close());
+    });
+
+    server.handleJavaScript('''
+var webSocket = new WebSocket(window.location.href.replace("http://", "ws://"));
+webSocket.addEventListener("open", function() {
+  webSocket.send("loaded!");
+});
+''');
+
+    var webSocket = server.handleWebSocket();
+
+    schedule(() async {
+      expect(await (await webSocket).first, equals("loaded!"));
+    });
+  });
+
+  test("a process can be killed synchronously after it's started", () async {
+    var server = new CodeServer();
+
+    schedule(() async {
+      var phantomJS = new PhantomJS(await server.url);
+      await phantomJS.close();
+    });
+  });
+
+  test("reports an error in onExit", () {
+    var phantomJS = new PhantomJS("http://dart-lang.org",
+        executable: "_does_not_exist");
+    expect(phantomJS.onExit, throwsA(isApplicationException(startsWith(
+        "Failed to run PhantomJS: $noSuchFileMessage"))));
+  });
+
+  test("can run successful tests", () {
+    d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {});
+}
+""").create();
+
+    var test = runTest(["-p", "phantomjs", "test.dart"]);
+    test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+    test.shouldExit(0);
+  });
+
+  test("can run failing tests", () {
+    d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  test("failure", () => throw new TestFailure("oh no"));
+}
+""").create();
+
+    var test = runTest(["-p", "phantomjs", "test.dart"]);
+    test.stdout.expect(consumeThrough(contains("-1: Some tests failed.")));
+    test.shouldExit(1);
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/browser/runner_test.dart b/mojo/public/dart/third_party/test/test/runner/browser/runner_test.dart
new file mode 100644
index 0000000..14ad58d
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/browser/runner_test.dart
@@ -0,0 +1,619 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../io.dart';
+
+final _success = """
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {});
+}
+""";
+
+final _failure = """
+import 'package:test/test.dart';
+
+void main() {
+  test("failure", () => throw new TestFailure("oh no"));
+}
+""";
+
+void main() {
+  useSandbox();
+
+  group("fails gracefully if", () {
+    test("a test file fails to compile", () {
+      d.file("test.dart", "invalid Dart file").create();
+      var test = runTest(["-p", "chrome", "test.dart"]);
+
+      test.stdout.expect(containsInOrder([
+        "Expected a declaration, but got 'invalid'",
+        '-1: compiling test.dart',
+        'Failed to load "test.dart": dart2js failed.'
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("a test file throws", () {
+      d.file("test.dart", "void main() => throw 'oh no';").create();
+
+      var test = runTest(["-p", "chrome", "test.dart"]);
+      test.stdout.expect(containsInOrder([
+        '-1: compiling test.dart',
+        'Failed to load "test.dart": oh no'
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("a test file doesn't have a main defined", () {
+      d.file("test.dart", "void foo() {}").create();
+
+      var test = runTest(["-p", "chrome", "test.dart"]);
+      test.stdout.expect(containsInOrder([
+        '-1: compiling test.dart',
+        'Failed to load "test.dart": No top-level main() function defined.'
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("a test file has a non-function main", () {
+      d.file("test.dart", "int main;").create();
+
+      var test = runTest(["-p", "chrome", "test.dart"]);
+      test.stdout.expect(containsInOrder([
+        '-1: compiling test.dart',
+        'Failed to load "test.dart": Top-level main getter is not a function.'
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("a test file has a main with arguments", () {
+      d.file("test.dart", "void main(arg) {}").create();
+
+      var test = runTest(["-p", "chrome", "test.dart"]);
+      test.stdout.expect(containsInOrder([
+        '-1: compiling test.dart',
+        'Failed to load "test.dart": Top-level main() function takes arguments.'
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("a custom HTML file has no script tag", () {
+      d.file("test.dart", "void main() {}").create();
+
+      d.file("test.html", """
+<html>
+<head>
+  <link rel="x-dart-test" href="test.dart">
+</head>
+</html>
+""").create();
+
+      var test = runTest(["-p", "content-shell", "test.dart"]);
+      test.stdout.expect(containsInOrder([
+        '-1: loading test.dart',
+        'Failed to load "test.dart": "test.html" must contain '
+            '<script src="packages/test/dart.js"></script>.'
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("a custom HTML file has no link", () {
+      d.file("test.dart", "void main() {}").create();
+
+      d.file("test.html", """
+<html>
+<head>
+  <script src="packages/test/dart.js"></script>
+</head>
+</html>
+""").create();
+
+      var test = runTest(["-p", "content-shell", "test.dart"]);
+      test.stdout.expect(containsInOrder([
+        '-1: loading test.dart',
+        'Failed to load "test.dart": Expected exactly 1 '
+            '<link rel="x-dart-test"> in test.html, found 0.'
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("a custom HTML file has too many links", () {
+      d.file("test.dart", "void main() {}").create();
+
+      d.file("test.html", """
+<html>
+<head>
+  <link rel='x-dart-test' href='test.dart'>
+  <link rel='x-dart-test' href='test.dart'>
+  <script src="packages/test/dart.js"></script>
+</head>
+</html>
+""").create();
+
+      var test = runTest(["-p", "content-shell", "test.dart"]);
+      test.stdout.expect(containsInOrder([
+        '-1: loading test.dart',
+        'Failed to load "test.dart": Expected exactly 1 '
+            '<link rel="x-dart-test"> in test.html, found 2.'
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("a custom HTML file has no href in the link", () {
+      d.file("test.dart", "void main() {}").create();
+
+      d.file("test.html", """
+<html>
+<head>
+  <link rel='x-dart-test'>
+  <script src="packages/test/dart.js"></script>
+</head>
+</html>
+""").create();
+
+      var test = runTest(["-p", "content-shell", "test.dart"]);
+      test.stdout.expect(containsInOrder([
+        '-1: loading test.dart',
+        'Failed to load "test.dart": Expected <link rel="x-dart-test"> in '
+            'test.html to have an "href" attribute.'
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("a custom HTML file has an invalid test URL", () {
+      d.file("test.dart", "void main() {}").create();
+
+      d.file("test.html", """
+<html>
+<head>
+  <link rel='x-dart-test' href='wrong.dart'>
+  <script src="packages/test/dart.js"></script>
+</head>
+</html>
+""").create();
+
+      var test = runTest(["-p", "content-shell", "test.dart"]);
+      test.stdout.expect(containsInOrder([
+        '-1: loading test.dart',
+        'Failed to load "test.dart": Failed to load script at '
+      ]));
+      test.shouldExit(1);
+    });
+
+    // TODO(nweiz): test what happens when a test file is unreadable once issue
+    // 15078 is fixed.
+  });
+
+  group("runs successful tests", () {
+    test("on a JS and non-JS browser", () {
+      d.file("test.dart", _success).create();
+      var test = runTest(["-p", "content-shell", "-p", "chrome", "test.dart"]);
+
+      test.stdout.fork().expect(consumeThrough(contains("[Chrome] compiling")));
+      test.stdout.expect(never(contains("[Dartium Content Shell] compiling")));
+      test.shouldExit(0);
+    });
+
+    test("on a browser and the VM", () {
+      d.file("test.dart", _success).create();
+      var test = runTest(["-p", "content-shell", "-p", "vm", "test.dart"]);
+
+      test.stdout.expect(consumeThrough(contains("+2: All tests passed!")));
+      test.shouldExit(0);
+    });
+
+    // Regression test; this broke in 0.12.0-beta.9.
+    test("on a file in a subdirectory", () {
+      d.dir("dir", [d.file("test.dart", _success)]).create();
+
+      var test = runTest(["-p", "chrome", "dir/test.dart"]);
+      test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+      test.shouldExit(0);
+    });
+
+    group("with a custom HTML file", () {
+      setUp(() {
+        d.file("test.dart", """
+import 'dart:html';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {
+    expect(document.query('#foo'), isNotNull);
+  });
+}
+""").create();
+
+        d.file("test.html", """
+<html>
+<head>
+  <link rel='x-dart-test' href='test.dart'>
+  <script src="packages/test/dart.js"></script>
+</head>
+<body>
+  <div id="foo"></div>
+</body>
+</html>
+""").create();
+      });
+
+      test("on content shell", () {
+        var test = runTest(["-p", "content-shell", "test.dart"]);
+        test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+        test.shouldExit(0);
+      });
+
+      test("on Chrome", () {
+        var test = runTest(["-p", "chrome", "test.dart"]);
+        test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+        test.shouldExit(0);
+      });
+
+      // Regression test for https://github.com/dart-lang/test/issues/82.
+      test("ignores irrelevant link tags", () {
+        d.file("test.html", """
+<html>
+<head>
+  <link rel='x-dart-test-not'>
+  <link rel='other' href='test.dart'>
+  <link rel='x-dart-test' href='test.dart'>
+  <script src="packages/test/dart.js"></script>
+</head>
+<body>
+  <div id="foo"></div>
+</body>
+</html>
+""").create();
+
+        var test = runTest(["-p", "content-shell", "test.dart"]);
+        test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+        test.shouldExit(0);
+      });
+    });
+  });
+
+  group("runs failing tests", () {
+    test("that fail only on the browser", () {
+      d.file("test.dart", """
+import 'dart:async';
+
+import 'package:path/path.dart' as p;
+import 'package:test/test.dart';
+
+void main() {
+  test("test", () {
+    if (p.style == p.Style.url) throw new TestFailure("oh no");
+  });
+}
+""").create();
+
+      var test = runTest(["-p", "content-shell", "-p", "vm", "test.dart"]);
+      test.stdout.expect(consumeThrough(contains("+1 -1: Some tests failed.")));
+      test.shouldExit(1);
+    });
+
+    test("that fail only on the VM", () {
+      d.file("test.dart", """
+import 'dart:async';
+
+import 'package:path/path.dart' as p;
+import 'package:test/test.dart';
+
+void main() {
+  test("test", () {
+    if (p.style != p.Style.url) throw new TestFailure("oh no");
+  });
+}
+""").create();
+
+      var test = runTest(["-p", "content-shell", "-p", "vm", "test.dart"]);
+      test.stdout.expect(consumeThrough(contains("+1 -1: Some tests failed.")));
+      test.shouldExit(1);
+    });
+
+    group("with a custom HTML file", () {
+      setUp(() {
+        d.file("test.dart", """
+import 'dart:html';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("failure", () {
+    expect(document.query('#foo'), isNull);
+  });
+}
+""").create();
+
+        d.file("test.html", """
+<html>
+<head>
+  <link rel='x-dart-test' href='test.dart'>
+  <script src="packages/test/dart.js"></script>
+</head>
+<body>
+  <div id="foo"></div>
+</body>
+</html>
+""").create();
+      });
+
+      test("on content shell", () {
+        var test = runTest(["-p", "content-shell", "test.dart"]);
+        test.stdout.expect(consumeThrough(contains("-1: Some tests failed.")));
+        test.shouldExit(1);
+      });
+
+      test("on Chrome", () {
+        var test = runTest(["-p", "chrome", "test.dart"]);
+        test.stdout.expect(consumeThrough(contains("-1: Some tests failed.")));
+        test.shouldExit(1);
+      });
+    });
+  });
+
+  test("the compiler uses colors if the test runner uses colors", () {
+    d.file("test.dart", "String main() => 12;\n").create();
+
+    var test = runTest(["--color", "-p", "chrome", "test.dart"]);
+    test.stdout.expect(consumeThrough(contains('\u001b[35m')));
+    test.shouldExit(1);
+  });
+
+  test("forwards prints from the browser test", () {
+    d.file("test.dart", """
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("test", () {
+    print("Hello,");
+    return new Future(() => print("world!"));
+  });
+}
+""").create();
+
+    var test = runTest(["-p", "content-shell", "test.dart"]);
+    test.stdout.expect(inOrder([
+      consumeThrough("Hello,"),
+      "world!"
+    ]));
+    test.shouldExit(0);
+  });
+
+  test("dartifies stack traces for JS-compiled tests by default", () {
+    d.file("test.dart", _failure).create();
+
+    var test = runTest(["-p", "chrome", "--verbose-trace", "test.dart"]);
+    test.stdout.expect(containsInOrder([
+      " main.<fn>",
+      "package:test",
+      "dart:async/zone.dart"
+    ]));
+    test.shouldExit(1);
+  });
+
+  test("doesn't dartify stack traces for JS-compiled tests with --js-trace", () {
+    d.file("test.dart", _failure).create();
+
+    var test = runTest(
+        ["-p", "chrome", "--verbose-trace", "--js-trace", "test.dart"]);
+    test.stdout.fork().expect(never(endsWith(" main.<fn>")));
+    test.stdout.fork().expect(never(contains("package:test")));
+    test.stdout.fork().expect(never(contains("dart:async/zone.dart")));
+    test.stdout.expect(consumeThrough(contains("-1: Some tests failed.")));
+    test.shouldExit(1);
+  });
+
+  test("respects top-level @Timeout declarations", () {
+    d.file("test.dart", '''
+@Timeout(const Duration(seconds: 0))
+
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("timeout", () {});
+}
+''').create();
+
+    var test = runTest(["-p", "content-shell", "test.dart"]);
+    test.stdout.expect(containsInOrder([
+      "Test timed out after 0 seconds.",
+      "-1: Some tests failed."
+    ]));
+    test.shouldExit(1);
+  });
+
+  group("with onPlatform", () {
+    test("respects matching Skips", () {
+      d.file("test.dart", '''
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("fail", () => throw 'oh no', onPlatform: {"browser": new Skip()});
+}
+''').create();
+
+      var test = runTest(["-p", "content-shell", "test.dart"]);
+      test.stdout.expect(consumeThrough(contains("+0 ~1: All tests skipped.")));
+      test.shouldExit(0);
+    });
+
+    test("ignores non-matching Skips", () {
+      d.file("test.dart", '''
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {}, onPlatform: {"vm": new Skip()});
+}
+''').create();
+
+      var test = runTest(["-p", "content-shell", "test.dart"]);
+      test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+      test.shouldExit(0);
+    });
+
+    test("respects matching Timeouts", () {
+      d.file("test.dart", '''
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("fail", () => throw 'oh no', onPlatform: {
+    "browser": new Timeout(new Duration(seconds: 0))
+  });
+}
+''').create();
+
+      var test = runTest(["-p", "content-shell", "test.dart"]);
+      test.stdout.expect(containsInOrder([
+        "Test timed out after 0 seconds.",
+        "-1: Some tests failed."
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("ignores non-matching Timeouts", () {
+      d.file("test.dart", '''
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {}, onPlatform: {
+    "vm": new Timeout(new Duration(seconds: 0))
+  });
+}
+''').create();
+
+      var test = runTest(["-p", "content-shell", "test.dart"]);
+      test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+      test.shouldExit(0);
+    });
+
+    test("applies matching platforms in order", () {
+      d.file("test.dart", '''
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {}, onPlatform: {
+    "browser": new Skip("first"),
+    "browser || windows": new Skip("second"),
+    "browser || linux": new Skip("third"),
+    "browser || mac-os": new Skip("fourth"),
+    "browser || android": new Skip("fifth")
+  });
+}
+''').create();
+
+      var test = runTest(["-p", "content-shell", "test.dart"]);
+      test.stdout.fork().expect(never(contains("Skip: first")));
+      test.stdout.fork().expect(never(contains("Skip: second")));
+      test.stdout.fork().expect(never(contains("Skip: third")));
+      test.stdout.fork().expect(never(contains("Skip: fourth")));
+      test.stdout.expect(consumeThrough(contains("Skip: fifth")));
+      test.shouldExit(0);
+    });
+  });
+
+  group("with an @OnPlatform annotation", () {
+    test("respects matching Skips", () {
+      d.file("test.dart", '''
+@OnPlatform(const {"browser": const Skip()})
+
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("fail", () => throw 'oh no');
+}
+''').create();
+
+      var test = runTest(["-p", "content-shell", "test.dart"]);
+      test.stdout.expect(consumeThrough(contains("~1: All tests skipped.")));
+      test.shouldExit(0);
+    });
+
+    test("ignores non-matching Skips", () {
+      d.file("test.dart", '''
+@OnPlatform(const {"vm": const Skip()})
+
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {});
+}
+''').create();
+
+      var test = runTest(["-p", "content-shell", "test.dart"]);
+      test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+      test.shouldExit(0);
+    });
+
+    test("respects matching Timeouts", () {
+      d.file("test.dart", '''
+@OnPlatform(const {
+  "browser": const Timeout(const Duration(seconds: 0))
+})
+
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("fail", () => throw 'oh no');
+}
+''').create();
+
+      var test = runTest(["-p", "content-shell", "test.dart"]);
+      test.stdout.expect(containsInOrder([
+        "Test timed out after 0 seconds.",
+        "-1: Some tests failed."
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("ignores non-matching Timeouts", () {
+      d.file("test.dart", '''
+@OnPlatform(const {
+  "vm": const Timeout(const Duration(seconds: 0))
+})
+
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {});
+}
+''').create();
+
+      var test = runTest(["-p", "content-shell", "test.dart"]);
+      test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+      test.shouldExit(0);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/browser/safari_test.dart b/mojo/public/dart/third_party/test/test/runner/browser/safari_test.dart
new file mode 100644
index 0000000..85d4f56
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/browser/safari_test.dart
@@ -0,0 +1,85 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm && mac-os")
+
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:test/src/runner/browser/safari.dart';
+
+import '../../io.dart';
+import '../../utils.dart';
+import 'code_server.dart';
+
+void main() {
+  useSandbox();
+
+  test("starts Safari with the given URL", () {
+    var server = new CodeServer();
+
+    schedule(() async {
+      var safari = new Safari(await server.url);
+      currentSchedule.onComplete.schedule(
+          () async => (await safari).close());
+    });
+
+    server.handleJavaScript('''
+var webSocket = new WebSocket(window.location.href.replace("http://", "ws://"));
+webSocket.addEventListener("open", function() {
+  webSocket.send("loaded!");
+});
+''');
+
+    var webSocket = server.handleWebSocket();
+
+    schedule(() async {
+      expect(await (await webSocket).first, equals("loaded!"));
+    });
+  });
+
+  test("a process can be killed synchronously after it's started", () async {
+    var server = new CodeServer();
+
+    schedule(() async {
+      var safari = new Safari(await server.url);
+      await safari.close();
+    });
+  });
+
+  test("reports an error in onExit", () {
+    var safari = new Safari("http://dart-lang.org",
+        executable: "_does_not_exist");
+    expect(safari.onExit, throwsA(isApplicationException(startsWith(
+        "Failed to run Safari: $noSuchFileMessage"))));
+  });
+
+  test("can run successful tests", () {
+    d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {});
+}
+""").create();
+
+    var test = runTest(["-p", "safari", "test.dart"]);
+    test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+    test.shouldExit(0);
+  });
+
+  test("can run failing tests", () {
+    d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  test("failure", () => throw new TestFailure("oh no"));
+}
+""").create();
+
+    var test = runTest(["-p", "safari", "test.dart"]);
+    test.stdout.expect(consumeThrough(contains("-1: Some tests failed.")));
+    test.shouldExit(1);
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/compact_reporter_test.dart b/mojo/public/dart/third_party/test/test/runner/compact_reporter_test.dart
new file mode 100644
index 0000000..5380d85
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/compact_reporter_test.dart
@@ -0,0 +1,440 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../io.dart';
+
+void main() {
+  useSandbox();
+
+  test("reports when no tests are run", () {
+    d.file("test.dart", "void main() {}").create();
+
+    var test = runTest(["test.dart"], compact: true);
+    test.stdout.expect(consumeThrough(contains("No tests ran.")));
+    test.shouldExit(0);
+  });
+
+  test("runs several successful tests and reports when each completes", () {
+    _expectReport("""
+        test('success 1', () {});
+        test('success 2', () {});
+        test('success 3', () {});""",
+        """
+        +0: loading test.dart
+        +0: success 1
+        +1: success 1
+        +1: success 2
+        +2: success 2
+        +2: success 3
+        +3: success 3
+        +3: All tests passed!""");
+  });
+
+  test("runs several failing tests and reports when each fails", () {
+    _expectReport("""
+        test('failure 1', () => throw new TestFailure('oh no'));
+        test('failure 2', () => throw new TestFailure('oh no'));
+        test('failure 3', () => throw new TestFailure('oh no'));""",
+        """
+        +0: loading test.dart
+        +0: failure 1
+        +0 -1: failure 1
+          oh no
+          test.dart 6:33  main.<fn>
+
+
+        +0 -1: failure 2
+        +0 -2: failure 2
+          oh no
+          test.dart 7:33  main.<fn>
+
+
+        +0 -2: failure 3
+        +0 -3: failure 3
+          oh no
+          test.dart 8:33  main.<fn>
+
+
+        +0 -3: Some tests failed.""");
+  });
+
+  test("includes the full stack trace with --verbose-trace", () {
+    d.file("test.dart", """
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("failure", () => throw "oh no");
+}
+""").create();
+
+    var test = runTest(["--verbose-trace", "test.dart"], compact: true);
+    test.stdout.expect(consumeThrough(contains("dart:isolate-patch")));
+    test.shouldExit(1);
+  });
+
+  test("runs failing tests along with successful tests", () {
+    _expectReport("""
+        test('failure 1', () => throw new TestFailure('oh no'));
+        test('success 1', () {});
+        test('failure 2', () => throw new TestFailure('oh no'));
+        test('success 2', () {});""",
+        """
+        +0: loading test.dart
+        +0: failure 1
+        +0 -1: failure 1
+          oh no
+          test.dart 6:33  main.<fn>
+
+
+        +0 -1: success 1
+        +1 -1: success 1
+        +1 -1: failure 2
+        +1 -2: failure 2
+          oh no
+          test.dart 8:33  main.<fn>
+
+
+        +1 -2: success 2
+        +2 -2: success 2
+        +2 -2: Some tests failed.""");
+  });
+
+  test("gracefully handles multiple test failures in a row", () {
+    _expectReport("""
+        // This completer ensures that the test isolate isn't killed until all
+        // errors have been thrown.
+        var completer = new Completer();
+        test('failures', () {
+          new Future.microtask(() => throw 'first error');
+          new Future.microtask(() => throw 'second error');
+          new Future.microtask(() => throw 'third error');
+          new Future.microtask(completer.complete);
+        });
+        test('wait', () => completer.future);""",
+        """
+        +0: loading test.dart
+        +0: failures
+        +0 -1: failures
+          first error
+          test.dart 10:38  main.<fn>.<fn>
+          ===== asynchronous gap ===========================
+          dart:async       Future.Future.microtask
+          test.dart 10:15  main.<fn>
+
+          second error
+          test.dart 11:38  main.<fn>.<fn>
+          ===== asynchronous gap ===========================
+          dart:async       Future.Future.microtask
+          test.dart 11:15  main.<fn>
+
+          third error
+          test.dart 12:38  main.<fn>.<fn>
+          ===== asynchronous gap ===========================
+          dart:async       Future.Future.microtask
+          test.dart 12:15  main.<fn>
+
+
+        +0 -1: wait
+        +1 -1: wait
+        +1 -1: Some tests failed.""");
+  });
+
+  test("prints the full test name before an error", () {
+    _expectReport("""
+        test(
+           'really gosh dang long test name. Even longer than that. No, yet '
+               'longer. A little more... okay, that should do it.',
+           () => throw new TestFailure('oh no'));""",
+        """
+        +0: loading test.dart
+        +0: really ... longer than that. No, yet longer. A little more... okay, that should do it.
+        +0 -1: really ... longer than that. No, yet longer. A little more... okay, that should do it.
+        +0 -1: really gosh dang long test name. Even longer than that. No, yet longer. A little more... okay, that should do it.
+          oh no
+          test.dart 9:18  main.<fn>
+
+
+        +0 -1: Some tests failed.""");
+  });
+
+  group("print:", () {
+    test("handles multiple prints", () {
+      _expectReport("""
+        test('test', () {
+          print("one");
+          print("two");
+          print("three");
+          print("four");
+        });""",
+        """
+        +0: loading test.dart
+        +0: test
+        one
+        two
+        three
+        four
+
+        +1: test
+        +1: All tests passed!""");
+    });
+
+    test("handles a print after the test completes", () {
+      _expectReport("""
+        // This completer ensures that the test isolate isn't killed until all
+        // prints have happened.
+        var testDone = new Completer();
+        var waitStarted = new Completer();
+        test('test', () {
+          waitStarted.future.then((_) {
+            new Future(() => print("one"));
+            new Future(() => print("two"));
+            new Future(() => print("three"));
+            new Future(() => print("four"));
+            new Future(testDone.complete);
+          });
+        });
+
+        test('wait', () {
+          waitStarted.complete();
+          return testDone.future;
+        });""", """
+        +0: loading test.dart
+        +0: test
+        +1: test
+        +1: wait
+        +1: test
+        one
+        two
+        three
+        four
+
+        +2: wait
+        +2: All tests passed!""");
+    });
+
+    test("interleaves prints and errors", () {
+      _expectReport("""
+        // This completer ensures that the test isolate isn't killed until all
+        // prints have happened.
+        var completer = new Completer();
+        test('test', () {
+          scheduleMicrotask(() {
+            print("three");
+            print("four");
+            throw "second error";
+          });
+
+          scheduleMicrotask(() {
+            print("five");
+            print("six");
+            completer.complete();
+          });
+
+          print("one");
+          print("two");
+          throw "first error";
+        });
+
+        test('wait', () => completer.future);""",
+        """
+        +0: loading test.dart
+        +0: test
+        one
+        two
+
+        +0 -1: test
+          first error
+          test.dart 24:11  main.<fn>
+
+        three
+        four
+          second error
+          test.dart 13:13  main.<fn>.<fn>
+          ===== asynchronous gap ===========================
+          dart:async       scheduleMicrotask
+          test.dart 10:11  main.<fn>
+
+        five
+        six
+
+        +0 -1: wait
+        +1 -1: wait
+        +1 -1: Some tests failed.""");
+    });
+
+    test("prints the full test name before a print", () {
+      _expectReport("""
+          test(
+             'really gosh dang long test name. Even longer than that. No, yet '
+                 'longer. A little more... okay, that should do it.',
+             () => print('hello'));""",
+          """
+          +0: loading test.dart
+          +0: really ... longer than that. No, yet longer. A little more... okay, that should do it.
+          +0: really gosh dang long test name. Even longer than that. No, yet longer. A little more... okay, that should do it.
+          hello
+
+          +1: really ... longer than that. No, yet longer. A little more... okay, that should do it.
+          +1: All tests passed!""");
+    });
+
+    test("doesn't print a clock update between two prints", () {
+      _expectReport("""
+          test('slow', () async {
+            print('hello');
+            await new Future.delayed(new Duration(seconds: 3));
+            print('goodbye');
+          });""",
+          """
+          +0: loading test.dart
+          +0: slow
+          hello
+          goodbye
+
+          +1: slow
+          +1: All tests passed!""");
+    });
+  });
+
+  group("skip:", () {
+    test("displays skipped tests separately", () {
+      _expectReport("""
+          test('skip 1', () {}, skip: true);
+          test('skip 2', () {}, skip: true);
+          test('skip 3', () {}, skip: true);""",
+          """
+          +0: loading test.dart
+          +0: skip 1
+          +0 ~1: skip 1
+          +0 ~1: skip 2
+          +0 ~2: skip 2
+          +0 ~2: skip 3
+          +0 ~3: skip 3
+          +0 ~3: All tests skipped.""");
+    });
+
+    test("runs skipped tests along with successful tests", () {
+      _expectReport("""
+          test('skip 1', () {}, skip: true);
+          test('success 1', () {});
+          test('skip 2', () {}, skip: true);
+          test('success 2', () {});""",
+          """
+          +0: loading test.dart
+          +0: skip 1
+          +0 ~1: skip 1
+          +0 ~1: success 1
+          +1 ~1: success 1
+          +1 ~1: skip 2
+          +1 ~2: skip 2
+          +1 ~2: success 2
+          +2 ~2: success 2
+          +2 ~2: All tests passed!""");
+    });
+
+    test("runs skipped tests along with successful and failing tests", () {
+      _expectReport("""
+          test('failure 1', () => throw new TestFailure('oh no'));
+          test('skip 1', () {}, skip: true);
+          test('success 1', () {});
+          test('failure 2', () => throw new TestFailure('oh no'));
+          test('skip 2', () {}, skip: true);
+          test('success 2', () {});""",
+          """
+          +0: loading test.dart
+          +0: failure 1
+          +0 -1: failure 1
+            oh no
+            test.dart 6:35  main.<fn>
+
+
+          +0 -1: skip 1
+          +0 ~1 -1: skip 1
+          +0 ~1 -1: success 1
+          +1 ~1 -1: success 1
+          +1 ~1 -1: failure 2
+          +1 ~1 -2: failure 2
+            oh no
+            test.dart 9:35  main.<fn>
+
+
+          +1 ~1 -2: skip 2
+          +1 ~2 -2: skip 2
+          +1 ~2 -2: success 2
+          +2 ~2 -2: success 2
+          +2 ~2 -2: Some tests failed.""");
+    });
+
+    test("displays the skip reason if available", () {
+      _expectReport("""
+          test('skip 1', () {}, skip: 'some reason');
+          test('skip 2', () {}, skip: 'or another');""",
+          """
+          +0: loading test.dart
+          +0: skip 1
+          +0 ~1: skip 1
+            Skip: some reason
+
+          +0 ~1: skip 2
+          +0 ~2: skip 2
+            Skip: or another
+
+          +0 ~2: All tests skipped.""");
+    });
+  });
+}
+
+void _expectReport(String tests, String expected) {
+  var dart = """
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+$tests
+}
+""";
+
+  d.file("test.dart", dart).create();
+
+  var test = runTest(["test.dart"], compact: true);
+  test.shouldExit();
+
+  schedule(() async {
+    var stdoutLines = await test.stdoutStream().toList();
+
+    // Skip the first CR, remove excess trailing whitespace, and trim off
+    // timestamps.
+    var lastLine;
+    var actual = stdoutLines.skip(1).map((line) {
+      if (line.startsWith("  ") || line.isEmpty) return line.trimRight();
+
+      var trimmed = line.trim()
+          .replaceFirst(new RegExp("^[0-9]{2}:[0-9]{2} "), "");
+
+      // Trim identical lines so the test isn't dependent on how fast each test
+      // runs.
+      if (trimmed == lastLine) return null;
+      lastLine = trimmed;
+      return trimmed;
+    }).where((line) => line != null).join("\n");
+
+    // Un-indent the expected string.
+    var indentation = expected.indexOf(new RegExp("[^ ]"));
+    expected = expected.split("\n").map((line) {
+      if (line.isEmpty) return line;
+      return line.substring(indentation);
+    }).join("\n");
+
+    expect(actual, equals(expected));
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/engine_test.dart b/mojo/public/dart/third_party/test/test/runner/engine_test.dart
new file mode 100644
index 0000000..584d2cd
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/engine_test.dart
@@ -0,0 +1,155 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/src/backend/declarer.dart';
+import 'package:test/src/backend/state.dart';
+import 'package:test/src/runner/engine.dart';
+import 'package:test/src/runner/runner_suite.dart';
+import 'package:test/src/runner/vm/environment.dart';
+import 'package:test/test.dart';
+
+void main() {
+  var declarer;
+  setUp(() => declarer = new Declarer());
+
+  test("runs each test in each suite in order", () async {
+    var testsRun = 0;
+    for (var i = 0; i < 4; i++) {
+      declarer.test("test ${i + 1}", expectAsync(() {
+        expect(testsRun, equals(i));
+        testsRun++;
+      }, max: 1));
+    }
+
+    var engine = new Engine.withSuites([
+      new RunnerSuite(const VMEnvironment(), declarer.tests.take(2)),
+      new RunnerSuite(const VMEnvironment(), declarer.tests.skip(2))
+    ]);
+
+    await engine.run();
+    expect(testsRun, equals(4));
+  });
+
+  test("runs tests in a suite added after run() was called", () {
+    var testsRun = 0;
+    for (var i = 0; i < 4; i++) {
+      declarer.test("test ${i + 1}", expectAsync(() {
+        expect(testsRun, equals(i));
+        testsRun++;
+      }, max: 1));
+    }
+
+    var engine = new Engine();
+    expect(engine.run().then((_) {
+      expect(testsRun, equals(4));
+    }), completes);
+
+    engine.suiteSink.add(
+        new RunnerSuite(const VMEnvironment(), declarer.tests));
+    engine.suiteSink.close();
+  });
+
+  test("emits each test before it starts running and after the previous test "
+      "finished", () {
+    var testsRun = 0;
+    for (var i = 0; i < 3; i++) {
+      declarer.test("test ${i + 1}", expectAsync(() => testsRun++, max: 1));
+    }
+
+    var engine = new Engine.withSuites([
+      new RunnerSuite(const VMEnvironment(), declarer.tests)
+    ]);
+
+    engine.onTestStarted.listen(expectAsync((liveTest) {
+      // [testsRun] should be one less than the test currently running.
+      expect(liveTest.test.name, equals("test ${testsRun + 1}"));
+
+      // [Engine.onTestStarted] is guaranteed to fire before the first
+      // [LiveTest.onStateChange].
+      expect(liveTest.onStateChange.first,
+          completion(equals(const State(Status.running, Result.success))));
+    }, count: 3, max: 3));
+
+    return engine.run();
+  });
+
+  test(".run() returns true if every test passes", () {
+    for (var i = 0; i < 2; i++) {
+      declarer.test("test ${i + 1}", () {});
+    }
+
+    var engine = new Engine.withSuites([
+      new RunnerSuite(const VMEnvironment(), declarer.tests)
+    ]);
+    expect(engine.run(), completion(isTrue));
+  });
+
+  test(".run() returns false if any test fails", () {
+    for (var i = 0; i < 2; i++) {
+      declarer.test("test ${i + 1}", () {});
+    }
+    declarer.test("failure", () => throw new TestFailure("oh no"));
+
+    var engine = new Engine.withSuites([
+      new RunnerSuite(const VMEnvironment(), declarer.tests)
+    ]);
+    expect(engine.run(), completion(isFalse));
+  });
+
+  test(".run() returns false if any test errors", () {
+    for (var i = 0; i < 2; i++) {
+      declarer.test("test ${i + 1}", () {});
+    }
+    declarer.test("failure", () => throw "oh no");
+
+    var engine = new Engine.withSuites([
+      new RunnerSuite(const VMEnvironment(), declarer.tests)
+    ]);
+    expect(engine.run(), completion(isFalse));
+  });
+
+  test(".run() may not be called more than once", () {
+    var engine = new Engine.withSuites([]);
+    expect(engine.run(), completes);
+    expect(engine.run, throwsStateError);
+  });
+
+  group("for a skipped test", () {
+    test("doesn't run the test's body", () async {
+      var bodyRun = false;
+      declarer.test("test", () => bodyRun = true, skip: true);
+
+      var engine = new Engine.withSuites([
+        new RunnerSuite(const VMEnvironment(), declarer.tests)
+      ]);
+      await engine.run();
+      expect(bodyRun, isFalse);
+    });
+
+    test("exposes a LiveTest that emits the correct states", () {
+      declarer.test("test", () {}, skip: true);
+
+      var engine = new Engine.withSuites([
+        new RunnerSuite(const VMEnvironment(), declarer.tests)
+      ]);
+
+      engine.onTestStarted.listen(expectAsync((liveTest) {
+        expect(liveTest, same(engine.liveTests.single));
+        expect(liveTest.test, equals(declarer.tests.single));
+
+        var first = true;
+        liveTest.onStateChange.listen(expectAsync((state) {
+          expect(state, equals(first
+              ? const State(Status.running, Result.success)
+              : const State(Status.complete, Result.success)));
+          first = false;
+        }, count: 2));
+
+        expect(liveTest.onComplete, completes);
+      }));
+
+      return engine.run();
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/expanded_reporter_test.dart b/mojo/public/dart/third_party/test/test/runner/expanded_reporter_test.dart
new file mode 100644
index 0000000..c245cb9
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/expanded_reporter_test.dart
@@ -0,0 +1,342 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../io.dart';
+
+void main() {
+  useSandbox();
+
+  test("reports when no tests are run", () {
+    d.file("test.dart", "void main() {}").create();
+
+    var test = runTest(["test.dart"], compact: true);
+    test.stdout.expect(consumeThrough(contains("No tests ran.")));
+    test.shouldExit(0);
+  });
+
+  test("runs several successful tests and reports when each completes", () {
+    _expectReport("""
+        test('success 1', () {});
+        test('success 2', () {});
+        test('success 3', () {});""",
+        """
+        +0: success 1
+        +1: success 2
+        +2: success 3
+        +3: All tests passed!""");
+  });
+
+  test("runs several failing tests and reports when each fails", () {
+    _expectReport("""
+        test('failure 1', () => throw new TestFailure('oh no'));
+        test('failure 2', () => throw new TestFailure('oh no'));
+        test('failure 3', () => throw new TestFailure('oh no'));""",
+        """
+        +0: failure 1
+        +0 -1: failure 1
+          oh no
+          test.dart 6:33  main.<fn>
+
+        +0 -1: failure 2
+        +0 -2: failure 2
+          oh no
+          test.dart 7:33  main.<fn>
+
+        +0 -2: failure 3
+        +0 -3: failure 3
+          oh no
+          test.dart 8:33  main.<fn>
+
+        +0 -3: Some tests failed.""");
+  });
+
+  test("includes the full stack trace with --verbose-trace", () {
+    d.file("test.dart", """
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("failure", () => throw "oh no");
+}
+""").create();
+
+    var test = runTest(["--verbose-trace", "test.dart"], compact: true);
+    test.stdout.expect(consumeThrough(contains("dart:isolate-patch")));
+    test.shouldExit(1);
+  });
+
+  test("runs failing tests along with successful tests", () {
+    _expectReport("""
+        test('failure 1', () => throw new TestFailure('oh no'));
+        test('success 1', () {});
+        test('failure 2', () => throw new TestFailure('oh no'));
+        test('success 2', () {});""",
+        """
+        +0: failure 1
+        +0 -1: failure 1
+          oh no
+          test.dart 6:33  main.<fn>
+
+        +0 -1: success 1
+        +1 -1: failure 2
+        +1 -2: failure 2
+          oh no
+          test.dart 8:33  main.<fn>
+
+        +1 -2: success 2
+        +2 -2: Some tests failed.""");
+  });
+
+  test("always prints the full test name", () {
+    _expectReport("""
+        test(
+           'really gosh dang long test name. Even longer than that. No, yet '
+               'longer. A little more... okay, that should do it.',
+           () {});""",
+        """
+        +0: really gosh dang long test name. Even longer than that. No, yet longer. A little more... okay, that should do it.
+        +1: All tests passed!""");
+  });
+
+  test("gracefully handles multiple test failures in a row", () {
+    _expectReport("""
+        // This completer ensures that the test isolate isn't killed until all
+        // errors have been thrown.
+        var completer = new Completer();
+        test('failures', () {
+          new Future.microtask(() => throw 'first error');
+          new Future.microtask(() => throw 'second error');
+          new Future.microtask(() => throw 'third error');
+          new Future.microtask(completer.complete);
+        });
+        test('wait', () => completer.future);""",
+        """
+        +0: failures
+        +0 -1: failures
+          first error
+          test.dart 10:38  main.<fn>.<fn>
+          ===== asynchronous gap ===========================
+          dart:async       Future.Future.microtask
+          test.dart 10:15  main.<fn>
+
+          second error
+          test.dart 11:38  main.<fn>.<fn>
+          ===== asynchronous gap ===========================
+          dart:async       Future.Future.microtask
+          test.dart 11:15  main.<fn>
+
+          third error
+          test.dart 12:38  main.<fn>.<fn>
+          ===== asynchronous gap ===========================
+          dart:async       Future.Future.microtask
+          test.dart 12:15  main.<fn>
+
+        +0 -1: wait
+        +1 -1: Some tests failed.""");
+  });
+
+  group("print:", () {
+    test("handles multiple prints", () {
+      _expectReport("""
+        test('test', () {
+          print("one");
+          print("two");
+          print("three");
+          print("four");
+        });""",
+        """
+        +0: test
+        one
+        two
+        three
+        four
+        +1: All tests passed!""");
+    });
+
+    test("handles a print after the test completes", () {
+      _expectReport("""
+        // This completer ensures that the test isolate isn't killed until all
+        // prints have happened.
+        var testDone = new Completer();
+        var waitStarted = new Completer();
+        test('test', () async {
+          waitStarted.future.then((_) {
+            new Future(() => print("one"));
+            new Future(() => print("two"));
+            new Future(() => print("three"));
+            new Future(() => print("four"));
+            new Future(testDone.complete);
+          });
+        });
+
+        test('wait', () {
+          waitStarted.complete();
+          return testDone.future;
+        });""", """
+        +0: test
+        +1: wait
+        +1: test
+        one
+        two
+        three
+        four
+        +2: All tests passed!""");
+    });
+
+    test("interleaves prints and errors", () {
+      _expectReport("""
+        // This completer ensures that the test isolate isn't killed until all
+        // prints have happened.
+        var completer = new Completer();
+        test('test', () {
+          scheduleMicrotask(() {
+            print("three");
+            print("four");
+            throw "second error";
+          });
+
+          scheduleMicrotask(() {
+            print("five");
+            print("six");
+            completer.complete();
+          });
+
+          print("one");
+          print("two");
+          throw "first error";
+        });
+
+        test('wait', () => completer.future);""",
+        """
+        +0: test
+        one
+        two
+        +0 -1: test
+          first error
+          test.dart 24:11  main.<fn>
+
+        three
+        four
+          second error
+          test.dart 13:13  main.<fn>.<fn>
+          ===== asynchronous gap ===========================
+          dart:async       scheduleMicrotask
+          test.dart 10:11  main.<fn>
+
+        five
+        six
+        +0 -1: wait
+        +1 -1: Some tests failed.""");
+    });
+  });
+
+  group("skip:", () {
+    test("displays skipped tests separately", () {
+      _expectReport("""
+          test('skip 1', () {}, skip: true);
+          test('skip 2', () {}, skip: true);
+          test('skip 3', () {}, skip: true);""",
+          """
+          +0: skip 1
+          +0 ~1: skip 2
+          +0 ~2: skip 3
+          +0 ~3: All tests skipped.""");
+    });
+
+    test("runs skipped tests along with successful tests", () {
+      _expectReport("""
+          test('skip 1', () {}, skip: true);
+          test('success 1', () {});
+          test('skip 2', () {}, skip: true);
+          test('success 2', () {});""",
+          """
+          +0: skip 1
+          +0 ~1: success 1
+          +1 ~1: skip 2
+          +1 ~2: success 2
+          +2 ~2: All tests passed!""");
+    });
+
+    test("runs skipped tests along with successful and failing tests", () {
+      _expectReport("""
+          test('failure 1', () => throw new TestFailure('oh no'));
+          test('skip 1', () {}, skip: true);
+          test('success 1', () {});
+          test('failure 2', () => throw new TestFailure('oh no'));
+          test('skip 2', () {}, skip: true);
+          test('success 2', () {});""",
+          """
+          +0: failure 1
+          +0 -1: failure 1
+            oh no
+            test.dart 6:35  main.<fn>
+
+          +0 -1: skip 1
+          +0 ~1 -1: success 1
+          +1 ~1 -1: failure 2
+          +1 ~1 -2: failure 2
+            oh no
+            test.dart 9:35  main.<fn>
+
+          +1 ~1 -2: skip 2
+          +1 ~2 -2: success 2
+          +2 ~2 -2: Some tests failed.""");
+    });
+
+    test("displays the skip reason if available", () {
+      _expectReport("""
+          test('skip 1', () {}, skip: 'some reason');
+          test('skip 2', () {}, skip: 'or another');""",
+          """
+          +0: skip 1
+            Skip: some reason
+          +0 ~1: skip 2
+            Skip: or another
+          +0 ~2: All tests skipped.""");
+    });
+  });
+}
+
+void _expectReport(String tests, String expected) {
+  var dart = """
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+$tests
+}
+""";
+
+  d.file("test.dart", dart).create();
+
+  var test = runTest(["test.dart"]);
+  test.shouldExit();
+
+  schedule(() async {
+    var stdoutLines = await test.stdoutStream().toList();
+
+    // Remove excess trailing whitespace and trim off timestamps.
+    var actual = stdoutLines.map((line) {
+      if (line.startsWith("  ") || line.isEmpty) return line.trimRight();
+      return line.trim().replaceFirst(new RegExp("^[0-9]{2}:[0-9]{2} "), "");
+    }).join("\n");
+
+    // Un-indent the expected string.
+    var indentation = expected.indexOf(new RegExp("[^ ]"));
+    expected = expected.split("\n").map((line) {
+      if (line.isEmpty) return line;
+      return line.substring(indentation);
+    }).join("\n");
+
+    expect(actual, equals(expected));
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/isolate_listener_test.dart b/mojo/public/dart/third_party/test/test/runner/isolate_listener_test.dart
new file mode 100644
index 0000000..2853725
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/isolate_listener_test.dart
@@ -0,0 +1,403 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'dart:async';
+import 'dart:isolate';
+
+import 'package:test/src/backend/invoker.dart';
+import 'package:test/src/backend/live_test.dart';
+import 'package:test/src/backend/metadata.dart';
+import 'package:test/src/backend/state.dart';
+import 'package:test/src/backend/suite.dart';
+import 'package:test/src/runner/vm/isolate_listener.dart';
+import 'package:test/src/runner/vm/isolate_test.dart';
+import 'package:test/src/util/remote_exception.dart';
+import 'package:test/test.dart';
+
+import '../utils.dart';
+
+/// An isolate that's been spun up for the current test.
+///
+/// This is tracked so that it can be killed once the test is done.
+Isolate _isolate;
+
+/// A live test that's running for the current test.
+///
+/// This is tracked so that it can be closed once the test is done.
+LiveTest _liveTest;
+
+void main() {
+  tearDown(() {
+    if (_isolate != null) _isolate.kill();
+    _isolate = null;
+
+    if (_liveTest != null) _liveTest.close();
+    _liveTest = null;
+  });
+
+  test("sends a list of available tests on startup", () async {
+    var response = await (await _spawnIsolate(_successfulTests)).first;
+    expect(response, containsPair("type", "success"));
+    expect(response, contains("tests"));
+
+    var tests = response["tests"];
+    expect(tests, hasLength(3));
+    expect(tests[0], containsPair("name", "successful 1"));
+    expect(tests[1], containsPair("name", "successful 2"));
+    expect(tests[2], containsPair("name", "successful 3"));
+  });
+
+  test("waits for a returned future sending a response", () async {
+    var response = await (await _spawnIsolate(_asyncTests)).first;
+    expect(response, containsPair("type", "success"));
+    expect(response, contains("tests"));
+
+    var tests = response["tests"];
+    expect(tests, hasLength(3));
+    expect(tests[0], containsPair("name", "successful 1"));
+    expect(tests[1], containsPair("name", "successful 2"));
+    expect(tests[2], containsPair("name", "successful 3"));
+  });
+
+  test("sends an error response if loading fails", () async {
+    var response = await (await _spawnIsolate(_loadError)).first;
+    expect(response, containsPair("type", "error"));
+    expect(response, contains("error"));
+
+    var error = RemoteException.deserialize(response["error"]).error;
+    expect(error.message, equals("oh no"));
+    expect(error.type, equals("String"));
+  });
+
+  test("sends an error response on a NoSuchMethodError", () async {
+    var response = await (await _spawnIsolate(_noSuchMethodError)).first;
+    expect(response, containsPair("type", "loadException"));
+    expect(response,
+        containsPair("message", "No top-level main() function defined."));
+  });
+
+  test("sends an error response on non-function main", () async {
+    var response = await (await _spawnIsolate(_nonFunction)).first;
+    expect(response, containsPair("type", "loadException"));
+    expect(response,
+        containsPair("message", "Top-level main getter is not a function."));
+  });
+
+  test("sends an error response on wrong-arity main", () async {
+    var response = await (await _spawnIsolate(_wrongArity)).first;
+    expect(response, containsPair("type", "loadException"));
+    expect(
+        response,
+        containsPair(
+            "message",
+            "Top-level main() function takes arguments."));
+  });
+
+  group("in a successful test", () {
+    test("the state changes from pending to running to complete", () async {
+      var liveTest = await _isolateTest(_successfulTests);
+      liveTest.onError.listen(expectAsync((_) {}, count: 0));
+
+      expect(liveTest.state,
+          equals(const State(Status.pending, Result.success)));
+
+      var future = liveTest.run();
+      expect(liveTest.state,
+          equals(const State(Status.running, Result.success)));
+
+      await future;
+      expect(liveTest.state,
+          equals(const State(Status.complete, Result.success)));
+    });
+
+    test("onStateChange fires for each state change", () async {
+      var liveTest = await _isolateTest(_successfulTests);
+      liveTest.onError.listen(expectAsync((_) {}, count: 0));
+
+      var first = true;
+      liveTest.onStateChange.listen(expectAsync((state) {
+        if (first) {
+          expect(state.status, equals(Status.running));
+          first = false;
+        } else {
+          expect(state.status, equals(Status.complete));
+        }
+        expect(state.result, equals(Result.success));
+      }, count: 2, max: 2));
+
+      await liveTest.run();
+    });
+  });
+
+  group("in a test with failures", () {
+    test("a failure reported causes the test to fail", () async {
+      var liveTest = await _isolateTest(_failingTest);
+      expectSingleFailure(liveTest);
+      await liveTest.run();
+    });
+
+    test("a failure reported asynchronously after the test causes it to error",
+        () async {
+      var liveTest = await _isolateTest(_failAfterSucceedTest);
+      expectStates(liveTest, [
+        const State(Status.running, Result.success),
+        const State(Status.complete, Result.success),
+        const State(Status.complete, Result.failure),
+        const State(Status.complete, Result.error)
+      ]);
+
+      expectErrors(liveTest, [(error) {
+        expect(lastState,
+            equals(const State(Status.complete, Result.failure)));
+        expect(error, isTestFailure("oh no"));
+      }, (error) {
+        expect(lastState, equals(const State(Status.complete, Result.error)));
+        expect(error, isRemoteException(
+             "This test failed after it had already completed. Make sure to "
+                 "use [expectAsync]\n"
+             "or the [completes] matcher when testing async code."));
+      }]);
+
+      await liveTest.run();
+    });
+
+    test("multiple asynchronous failures are reported", () async {
+      var liveTest = await _isolateTest(_multiFailTest);
+      expectStates(liveTest, [
+        const State(Status.running, Result.success),
+        const State(Status.complete, Result.failure)
+      ]);
+
+      expectErrors(liveTest, [(error) {
+        expect(lastState.status, equals(Status.complete));
+        expect(error, isTestFailure("one"));
+      }, (error) {
+        expect(error, isTestFailure("two"));
+      }, (error) {
+        expect(error, isTestFailure("three"));
+      }, (error) {
+        expect(error, isTestFailure("four"));
+      }]);
+
+      await liveTest.run();
+    });
+  });
+
+  group("in a test with errors", () {
+    test("an error reported causes the test to error", () async {
+      var liveTest = await _isolateTest(_errorTest);
+      expectStates(liveTest, [
+        const State(Status.running, Result.success),
+        const State(Status.complete, Result.error)
+      ]);
+
+      expectErrors(liveTest, [(error) {
+        expect(lastState.status, equals(Status.complete));
+        expect(error, isRemoteException("oh no"));
+      }]);
+
+      await liveTest.run();
+    });
+
+    test("an error reported asynchronously after the test causes it to error",
+        () async {
+      var liveTest = await _isolateTest(_errorAfterSucceedTest);
+      expectStates(liveTest, [
+        const State(Status.running, Result.success),
+        const State(Status.complete, Result.success),
+        const State(Status.complete, Result.error)
+      ]);
+
+      expectErrors(liveTest, [(error) {
+        expect(lastState,
+            equals(const State(Status.complete, Result.error)));
+        expect(error, isRemoteException("oh no"));
+      }, (error) {
+        expect(error, isRemoteException(
+             "This test failed after it had already completed. Make sure to "
+                 "use [expectAsync]\n"
+             "or the [completes] matcher when testing async code."));
+      }]);
+
+      await liveTest.run();
+    });
+
+    test("multiple asynchronous errors are reported", () async {
+      var liveTest = await _isolateTest(_multiErrorTest);
+      expectStates(liveTest, [
+        const State(Status.running, Result.success),
+        const State(Status.complete, Result.error)
+      ]);
+
+      expectErrors(liveTest, [(error) {
+        expect(lastState.status, equals(Status.complete));
+        expect(error, isRemoteException("one"));
+      }, (error) {
+        expect(error, isRemoteException("two"));
+      }, (error) {
+        expect(error, isRemoteException("three"));
+      }, (error) {
+        expect(error, isRemoteException("four"));
+      }]);
+
+      await liveTest.run();
+    });
+  });
+
+  test("forwards a test's prints", () async {
+    var liveTest = await _isolateTest(_printTest);
+    expect(liveTest.onPrint.take(2).toList(),
+        completion(equals(["Hello,", "world!"])));
+
+    await liveTest.run();
+  });
+}
+
+/// Loads the first test defined in [entryPoint] in another isolate.
+///
+/// This test will be automatically closed when the test is finished.
+Future<LiveTest> _isolateTest(void entryPoint(SendPort sendPort)) async {
+  var response = await (await _spawnIsolate(entryPoint)).first;
+  expect(response, containsPair("type", "success"));
+
+  var testMap = response["tests"].first;
+  var metadata = new Metadata.deserialize(testMap["metadata"]);
+  var test = new IsolateTest(testMap["name"], metadata, testMap["sendPort"]);
+  var suite = new Suite([test]);
+  _liveTest = test.load(suite);
+  return _liveTest;
+}
+
+/// Spawns an isolate from [entryPoint], sends it a new [SendPort], and returns
+/// the corresponding [ReceivePort].
+///
+/// This isolate will be automatically killed when the test is finished.
+Future<ReceivePort> _spawnIsolate(void entryPoint(SendPort sendPort)) async {
+  var receivePort = new ReceivePort();
+  var isolate = await Isolate.spawn(entryPoint, receivePort.sendPort);
+  _isolate = isolate;
+  return receivePort;
+}
+
+/// An isolate entrypoint that throws immediately.
+void _loadError(SendPort sendPort) {
+  IsolateListener.start(sendPort, new Metadata(), () => () => throw 'oh no');
+}
+
+/// An isolate entrypoint that throws a NoSuchMethodError.
+void _noSuchMethodError(SendPort sendPort) {
+  IsolateListener.start(sendPort, new Metadata(), () =>
+      throw new NoSuchMethodError(null, #main, [], {}));
+}
+
+/// An isolate entrypoint that returns a non-function.
+void _nonFunction(SendPort sendPort) {
+  IsolateListener.start(sendPort, new Metadata(), () => null);
+}
+
+/// An isolate entrypoint that returns a function with the wrong arity.
+void _wrongArity(SendPort sendPort) {
+  IsolateListener.start(sendPort, new Metadata(), () => (_) {});
+}
+
+/// An isolate entrypoint that defines three tests that succeed.
+void _successfulTests(SendPort sendPort) {
+  IsolateListener.start(sendPort, new Metadata(), () => () {
+    test("successful 1", () {});
+    test("successful 2", () {});
+    test("successful 3", () {});
+  });
+}
+
+/// An isolate entrypoint that defines three tests asynchronously.
+void _asyncTests(SendPort sendPort) {
+  IsolateListener.start(sendPort, new Metadata(), () => () {
+    return new Future(() {
+      test("successful 1", () {});
+
+      return new Future(() {
+        test("successful 2", () {});
+
+        return new Future(() {
+          test("successful 3", () {});
+        });
+      });
+    });
+  });
+}
+
+/// An isolate entrypoint that defines a test that fails.
+void _failingTest(SendPort sendPort) {
+  IsolateListener.start(sendPort, new Metadata(), () => () {
+    test("failure", () => throw new TestFailure('oh no'));
+  });
+}
+
+/// An isolate entrypoint that defines a test that fails after succeeding.
+void _failAfterSucceedTest(SendPort sendPort) {
+  IsolateListener.start(sendPort, new Metadata(), () => () {
+    test("fail after succeed", () {
+      pumpEventQueue().then((_) {
+        throw new TestFailure('oh no');
+      });
+    });
+  });
+}
+
+/// An isolate entrypoint that defines a test that fails multiple times.
+void _multiFailTest(SendPort sendPort) {
+  IsolateListener.start(sendPort, new Metadata(), () => () {
+    test("multiple failures", () {
+      Invoker.current.addOutstandingCallback();
+      new Future(() => throw new TestFailure("one"));
+      new Future(() => throw new TestFailure("two"));
+      new Future(() => throw new TestFailure("three"));
+      new Future(() => throw new TestFailure("four"));
+    });
+  });
+}
+
+/// An isolate entrypoint that defines a test that errors.
+void _errorTest(SendPort sendPort) {
+  IsolateListener.start(sendPort, new Metadata(), () => () {
+    test("error", () => throw 'oh no');
+  });
+}
+
+/// An isolate entrypoint that defines a test that errors after succeeding.
+void _errorAfterSucceedTest(SendPort sendPort) {
+  IsolateListener.start(sendPort, new Metadata(), () => () {
+    test("error after succeed", () {
+      pumpEventQueue().then((_) {
+        throw 'oh no';
+      });
+    });
+  });
+}
+
+/// An isolate entrypoint that defines a test that errors multiple times.
+void _multiErrorTest(SendPort sendPort) {
+  IsolateListener.start(sendPort, new Metadata(), () => () {
+    test("multiple errors", () {
+      Invoker.current.addOutstandingCallback();
+      new Future(() => throw "one");
+      new Future(() => throw "two");
+      new Future(() => throw "three");
+      new Future(() => throw "four");
+    });
+  });
+}
+
+/// An isolate entrypoint that defines a test that prints twice.
+void _printTest(SendPort sendPort) {
+  IsolateListener.start(sendPort, new Metadata(), () => () {
+    test("prints", () {
+      print("Hello,");
+      return new Future(() => print("world!"));
+    });
+  });
+}
+
diff --git a/mojo/public/dart/third_party/test/test/runner/load_suite_test.dart b/mojo/public/dart/third_party/test/test/runner/load_suite_test.dart
new file mode 100644
index 0000000..9af9075
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/load_suite_test.dart
@@ -0,0 +1,161 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'dart:async';
+
+import 'package:test/src/backend/state.dart';
+import 'package:test/src/backend/test_platform.dart';
+import 'package:test/src/runner/load_exception.dart';
+import 'package:test/src/runner/load_suite.dart';
+import 'package:test/src/runner/runner_suite.dart';
+import 'package:test/src/runner/vm/environment.dart';
+import 'package:test/test.dart';
+
+import '../utils.dart';
+
+void main() {
+  var innerSuite;
+  setUp(() => innerSuite = new RunnerSuite(const VMEnvironment(), []));
+
+  test("running a load test causes LoadSuite.suite to emit a suite", () async {
+    var suite = new LoadSuite("name", () => new Future.value(innerSuite));
+    expect(suite.tests, hasLength(1));
+
+    expect(suite.suite, completion(equals(innerSuite)));
+    var liveTest = await suite.tests.single.load(suite);
+    await liveTest.run();
+    expectTestPassed(liveTest);
+  });
+
+  test("running a load suite's body may be synchronous", () async {
+    var suite = new LoadSuite("name", () => innerSuite);
+    expect(suite.tests, hasLength(1));
+
+    expect(suite.suite, completion(equals(innerSuite)));
+    var liveTest = await suite.tests.single.load(suite);
+    await liveTest.run();
+    expectTestPassed(liveTest);
+  });
+
+  test("a load test doesn't complete until the body returns", () async {
+    var completer = new Completer();
+    var suite = new LoadSuite("name", () => completer.future);
+    expect(suite.tests, hasLength(1));
+
+    var liveTest = await suite.tests.single.load(suite);
+    expect(liveTest.run(), completes);
+    await new Future.delayed(Duration.ZERO);
+    expect(liveTest.state.status, equals(Status.running));
+
+    completer.complete(innerSuite);
+    await new Future.delayed(Duration.ZERO);
+    expectTestPassed(liveTest);
+  });
+
+  test("a load test forwards errors and completes LoadSuite.suite to null",
+      () async {
+    var suite = new LoadSuite("name", () => fail("error"));
+    expect(suite.tests, hasLength(1));
+
+    expect(suite.suite, completion(isNull));
+
+    var liveTest = await suite.tests.single.load(suite);
+    await liveTest.run();
+    expectTestFailed(liveTest, "error");
+  });
+
+  test("a load test completes early if it's closed", () async {
+    var suite = new LoadSuite("name", () => new Completer().future);
+    expect(suite.tests, hasLength(1));
+
+    var liveTest = await suite.tests.single.load(suite);
+    expect(liveTest.run(), completes);
+    await new Future.delayed(Duration.ZERO);
+    expect(liveTest.state.status, equals(Status.running));
+
+    expect(liveTest.close(), completes);
+  });
+
+  test("forLoadException() creates a suite that completes to a LoadException",
+      () async {
+    var exception = new LoadException("path", "error");
+    var suite = new LoadSuite.forLoadException(exception);
+    expect(suite.tests, hasLength(1));
+
+    expect(suite.suite, completion(isNull));
+
+    var liveTest = await suite.tests.single.load(suite);
+    await liveTest.run();
+    expect(liveTest.state.status, equals(Status.complete));
+    expect(liveTest.state.result, equals(Result.error));
+    expect(liveTest.errors, hasLength(1));
+    expect(liveTest.errors.first.error, equals(exception));
+  });
+
+  test("forSuite() creates a load suite that completes to a test suite",
+      () async {
+    var suite = new LoadSuite.forSuite(innerSuite);
+    expect(suite.tests, hasLength(1));
+
+    expect(suite.suite, completion(equals(innerSuite)));
+    var liveTest = await suite.tests.single.load(suite);
+    await liveTest.run();
+    expectTestPassed(liveTest);
+  });
+
+  group("changeSuite()", () {
+    test("returns a new load suite with the same properties", () {
+      var suite = new LoadSuite("name", () => innerSuite,
+          platform: TestPlatform.vm);
+      expect(suite.tests, hasLength(1));
+
+      var newSuite = suite.changeSuite((suite) => suite);
+      expect(newSuite.platform, equals(TestPlatform.vm));
+      expect(newSuite.tests, equals(suite.tests));
+    });
+
+    test("changes the inner suite", () async {
+      var suite = new LoadSuite("name", () => innerSuite);
+      expect(suite.tests, hasLength(1));
+
+      var newInnerSuite = new RunnerSuite(const VMEnvironment(), []);
+      var newSuite = suite.changeSuite((suite) => newInnerSuite);
+      expect(newSuite.suite, completion(equals(newInnerSuite)));
+
+      var liveTest = await suite.tests.single.load(suite);
+      await liveTest.run();
+      expectTestPassed(liveTest);
+    });
+
+    test("doesn't run change() if the suite is null", () async {
+      var suite = new LoadSuite("name", () => null);
+      expect(suite.tests, hasLength(1));
+
+      var newSuite = suite.changeSuite(expectAsync((_) {}, count: 0));
+      expect(newSuite.suite, completion(isNull));
+
+      var liveTest = await suite.tests.single.load(suite);
+      await liveTest.run();
+      expectTestPassed(liveTest);
+    });
+  });
+
+  group("getSuite()", () {
+    test("runs the test and returns the suite", () {
+      var suite = new LoadSuite.forSuite(innerSuite);
+      expect(suite.tests, hasLength(1));
+
+      expect(suite.getSuite(), completion(equals(innerSuite)));
+    });
+
+    test("forwards errors to the future", () {
+      var suite = new LoadSuite("name", () => throw "error");
+      expect(suite.tests, hasLength(1));
+
+      expect(suite.getSuite(), throwsA("error"));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/loader_test.dart b/mojo/public/dart/third_party/test/test/runner/loader_test.dart
new file mode 100644
index 0000000..01057b2
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/loader_test.dart
@@ -0,0 +1,163 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:test/src/backend/state.dart';
+import 'package:test/src/backend/test_platform.dart';
+import 'package:test/src/runner/configuration.dart';
+import 'package:test/src/runner/loader.dart';
+import 'package:test/src/util/io.dart';
+import 'package:test/test.dart';
+
+import '../io.dart';
+import '../utils.dart';
+
+Loader _loader;
+String _sandbox;
+
+final _tests = """
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {});
+  test("failure", () => throw new TestFailure('oh no'));
+  test("error", () => throw 'oh no');
+}
+""";
+
+void main() {
+  setUp(() {
+    _sandbox = createTempDir();
+    _loader = new Loader(
+        new Configuration(packageRoot: p.join(packageDir, 'packages')),
+        root: _sandbox);
+  });
+
+  tearDown(() {
+    new Directory(_sandbox).deleteSync(recursive: true);
+    return _loader.close();
+  });
+
+  group(".loadFile()", () {
+    var suite;
+    setUp(() async {
+      /// TODO(nweiz): Use scheduled_test for this once it's compatible with
+      /// this version of test.
+      new File(p.join(_sandbox, 'a_test.dart')).writeAsStringSync(_tests);
+      var suites = await _loader.loadFile(p.join(_sandbox, 'a_test.dart'))
+          .toList();
+      expect(suites, hasLength(1));
+      var loadSuite = suites.first;
+      suite = await loadSuite.getSuite();
+    });
+
+    test("returns a suite with the file path and platform", () {
+      expect(suite.path, equals(p.join(_sandbox, 'a_test.dart')));
+      expect(suite.platform, equals(TestPlatform.vm));
+    });
+
+    test("returns tests with the correct names and platforms", () {
+      expect(suite.tests, hasLength(3));
+      expect(suite.tests[0].name, equals("success"));
+      expect(suite.tests[1].name, equals("failure"));
+      expect(suite.tests[2].name, equals("error"));
+    });
+
+    test("can load and run a successful test", () {
+      var liveTest = suite.tests[0].load(suite);
+
+      expectStates(liveTest, [
+        const State(Status.running, Result.success),
+        const State(Status.complete, Result.success)
+      ]);
+      expectErrors(liveTest, []);
+
+      return liveTest.run().whenComplete(() => liveTest.close());
+    });
+
+    test("can load and run a failing test", () {
+      var liveTest = suite.tests[1].load(suite);
+      expectSingleFailure(liveTest);
+      return liveTest.run().whenComplete(() => liveTest.close());
+    });
+  });
+
+  group(".loadDir()", () {
+    test("ignores non-Dart files", () {
+      new File(p.join(_sandbox, 'a_test.txt')).writeAsStringSync(_tests);
+      expect(_loader.loadDir(_sandbox).toList(), completion(isEmpty));
+    });
+
+    test("ignores files in packages/ directories", () {
+      var dir = p.join(_sandbox, 'packages');
+      new Directory(dir).createSync();
+      new File(p.join(dir, 'a_test.dart')).writeAsStringSync(_tests);
+      expect(_loader.loadDir(_sandbox).toList(), completion(isEmpty));
+    });
+
+    test("ignores files that don't end in _test.dart", () {
+      new File(p.join(_sandbox, 'test.dart')).writeAsStringSync(_tests);
+      expect(_loader.loadDir(_sandbox).toList(), completion(isEmpty));
+    });
+
+    group("with suites loaded from a directory", () {
+      var suites;
+      setUp(() async {
+        /// TODO(nweiz): Use scheduled_test for this once it's compatible with
+        /// this version of test.
+        new File(p.join(_sandbox, 'a_test.dart')).writeAsStringSync(_tests);
+        new File(p.join(_sandbox, 'another_test.dart'))
+            .writeAsStringSync(_tests);
+        new Directory(p.join(_sandbox, 'dir')).createSync();
+        new File(p.join(_sandbox, 'dir/sub_test.dart'))
+            .writeAsStringSync(_tests);
+
+        suites = await _loader.loadDir(_sandbox)
+            .asyncMap((loadSuite) => loadSuite.getSuite())
+            .toList();
+      });
+
+      test("gives those suites the correct paths", () {
+        expect(suites.map((suite) => suite.path), unorderedEquals([
+          p.join(_sandbox, 'a_test.dart'),
+          p.join(_sandbox, 'another_test.dart'),
+          p.join(_sandbox, 'dir', 'sub_test.dart')
+        ]));
+      });
+
+      test("can run tests in those suites", () {
+        var suite = suites.firstWhere((suite) => suite.path.contains("a_test"));
+        var liveTest = suite.tests[1].load(suite);
+        expectSingleFailure(liveTest);
+        return liveTest.run().whenComplete(() => liveTest.close());
+      });
+    });
+  });
+
+  test("a print in a loaded file is piped through the LoadSuite", () async {
+    new File(p.join(_sandbox, 'a_test.dart')).writeAsStringSync("""
+void main() {
+  print('print within test');
+}
+""");
+    var suites = await _loader.loadFile(p.join(_sandbox, 'a_test.dart'))
+        .toList();
+    expect(suites, hasLength(1));
+    var loadSuite = suites.first;
+
+    var liveTest = await loadSuite.tests.single.load(loadSuite);
+    expect(liveTest.onPrint.first, completion(equals("print within test")));
+    await liveTest.run();
+    expectTestPassed(liveTest);
+  });
+
+  // TODO: Test load suites. Don't forget to test that prints in loaded files
+  // are piped through the suite. Also for browser tests!
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/parse_metadata_test.dart b/mojo/public/dart/third_party/test/test/runner/parse_metadata_test.dart
new file mode 100644
index 0000000..5e682d4
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/parse_metadata_test.dart
@@ -0,0 +1,404 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:test/test.dart';
+import 'package:test/src/backend/platform_selector.dart';
+import 'package:test/src/backend/test_platform.dart';
+import 'package:test/src/runner/parse_metadata.dart';
+import 'package:test/src/util/io.dart';
+
+String _sandbox;
+String _path;
+
+void main() {
+  setUp(() {
+    _sandbox = createTempDir();
+    _path = p.join(_sandbox, "test.dart");
+  });
+
+  tearDown(() {
+    new Directory(_sandbox).deleteSync(recursive: true);
+  });
+
+  test("returns empty metadata for an empty file", () {
+    new File(_path).writeAsStringSync("");
+    var metadata = parseMetadata(_path);
+    expect(metadata.testOn, equals(PlatformSelector.all));
+    expect(metadata.timeout.scaleFactor, equals(1));
+  });
+
+  test("ignores irrelevant annotations", () {
+    new File(_path).writeAsStringSync("@Fblthp\n@Fblthp.foo\nlibrary foo;");
+    var metadata = parseMetadata(_path);
+    expect(metadata.testOn, equals(PlatformSelector.all));
+  });
+  
+  test("parses a prefixed annotation", () {
+    new File(_path).writeAsStringSync(
+        "@foo.TestOn('vm')\n"
+        "import 'package:test/test.dart' as foo;");
+    var metadata = parseMetadata(_path);
+    expect(metadata.testOn.evaluate(TestPlatform.vm), isTrue);
+    expect(metadata.testOn.evaluate(TestPlatform.chrome), isFalse);
+  });
+
+  group("@TestOn:", () {
+    test("parses a valid annotation", () {
+      new File(_path).writeAsStringSync("@TestOn('vm')\nlibrary foo;");
+      var metadata = parseMetadata(_path);
+      expect(metadata.testOn.evaluate(TestPlatform.vm), isTrue);
+      expect(metadata.testOn.evaluate(TestPlatform.chrome), isFalse);
+    });
+
+    test("ignores a constructor named TestOn", () {
+      new File(_path).writeAsStringSync("@foo.TestOn('foo')\nlibrary foo;");
+      var metadata = parseMetadata(_path);
+      expect(metadata.testOn, equals(PlatformSelector.all));
+    });
+
+    group("throws an error for", () {
+      test("a named constructor", () {
+        new File(_path).writeAsStringSync("@TestOn.name('foo')\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("no argument list", () {
+        new File(_path).writeAsStringSync("@TestOn\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("an empty argument list", () {
+        new File(_path).writeAsStringSync("@TestOn()\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("a named argument", () {
+        new File(_path).writeAsStringSync(
+            "@TestOn(expression: 'foo')\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("multiple arguments", () {
+        new File(_path).writeAsStringSync("@TestOn('foo', 'bar')\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("a non-string argument", () {
+        new File(_path).writeAsStringSync("@TestOn(123)\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("multiple @TestOns", () {
+        new File(_path).writeAsStringSync(
+            "@TestOn('foo')\n@TestOn('bar')\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+    });
+  });
+
+  group("@Timeout:", () {
+    test("parses a valid duration annotation", () {
+      new File(_path).writeAsStringSync("""
+@Timeout(const Duration(
+    hours: 1,
+    minutes: 2,
+    seconds: 3,
+    milliseconds: 4,
+    microseconds: 5))
+
+library foo;
+""");
+      var metadata = parseMetadata(_path);
+      expect(metadata.timeout.duration,
+          equals(new Duration(
+              hours: 1,
+              minutes: 2,
+              seconds: 3,
+              milliseconds: 4,
+              microseconds: 5)));
+    });
+
+    test("parses a valid int factor annotation", () {
+      new File(_path).writeAsStringSync("""
+@Timeout.factor(1)
+
+library foo;
+""");
+      var metadata = parseMetadata(_path);
+      expect(metadata.timeout.scaleFactor, equals(1));
+    });
+
+    test("parses a valid double factor annotation", () {
+      new File(_path).writeAsStringSync("""
+@Timeout.factor(0.5)
+
+library foo;
+""");
+      var metadata = parseMetadata(_path);
+      expect(metadata.timeout.scaleFactor, equals(0.5));
+    });
+
+    test("parses a valid Timeout.none annotation", () {
+      new File(_path).writeAsStringSync("""
+@Timeout.none
+
+library foo;
+""");
+      var metadata = parseMetadata(_path);
+      expect(metadata.timeout, same(Timeout.none));
+    });
+
+    test("ignores a constructor named Timeout", () {
+      new File(_path).writeAsStringSync("@foo.Timeout('foo')\nlibrary foo;");
+      var metadata = parseMetadata(_path);
+      expect(metadata.timeout.scaleFactor, equals(1));
+    });
+
+    group("throws an error for", () {
+      test("an unknown named constructor", () {
+        new File(_path).writeAsStringSync("@Timeout.name('foo')\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("no argument list", () {
+        new File(_path).writeAsStringSync("@Timeout\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("an empty argument list", () {
+        new File(_path).writeAsStringSync("@Timeout()\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("an argument list for Timeout.none", () {
+        new File(_path).writeAsStringSync("@Timeout.none()\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("a named argument", () {
+        new File(_path).writeAsStringSync(
+            "@Timeout(duration: const Duration(seconds: 1))\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("multiple arguments", () {
+        new File(_path).writeAsStringSync(
+            "@Timeout.factor(1, 2)\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("a non-Duration argument", () {
+        new File(_path).writeAsStringSync("@Timeout(10)\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("a non-num argument", () {
+        new File(_path).writeAsStringSync(
+            "@Timeout.factor('foo')\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("multiple @Timeouts", () {
+        new File(_path).writeAsStringSync(
+            "@Timeout.factor(1)\n@Timeout.factor(2)\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      group("a Duration with", () {
+        test("a non-const constructor", () {
+          new File(_path).writeAsStringSync(
+              "@Timeout(new Duration(1))\nlibrary foo;");
+          expect(() => parseMetadata(_path), throwsFormatException);
+        });
+ 
+        test("a named constructor", () {
+          new File(_path).writeAsStringSync(
+              "@Timeout(const Duration.name(seconds: 1))\nlibrary foo;");
+          expect(() => parseMetadata(_path), throwsFormatException);
+        });
+
+        test("a positional argument", () {
+          new File(_path).writeAsStringSync(
+              "@Timeout(const Duration(1))\nlibrary foo;");
+          expect(() => parseMetadata(_path), throwsFormatException);
+        });
+
+        test("an unknown named argument", () {
+          new File(_path).writeAsStringSync(
+              "@Timeout(const Duration(name: 1))\nlibrary foo;");
+          expect(() => parseMetadata(_path), throwsFormatException);
+        });
+
+        test("a duplicate named argument", () {
+          new File(_path).writeAsStringSync(
+              "@Timeout(const Duration(seconds: 1, seconds: 1))\nlibrary foo;");
+          expect(() => parseMetadata(_path), throwsFormatException);
+        });
+      });
+    });
+  });
+
+  group("@Skip:", () {
+    test("parses a valid annotation", () {
+      new File(_path).writeAsStringSync("@Skip()\nlibrary foo;");
+      var metadata = parseMetadata(_path);
+      expect(metadata.skip, isTrue);
+      expect(metadata.skipReason, isNull);
+    });
+
+    test("parses a valid annotation with a reason", () {
+      new File(_path).writeAsStringSync("@Skip('reason')\nlibrary foo;");
+      var metadata = parseMetadata(_path);
+      expect(metadata.skip, isTrue);
+      expect(metadata.skipReason, equals('reason'));
+    });
+
+    test("ignores a constructor named Skip", () {
+      new File(_path).writeAsStringSync("@foo.Skip('foo')\nlibrary foo;");
+      var metadata = parseMetadata(_path);
+      expect(metadata.skip, isFalse);
+    });
+
+    group("throws an error for", () {
+      test("a named constructor", () {
+        new File(_path).writeAsStringSync("@Skip.name('foo')\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("no argument list", () {
+        new File(_path).writeAsStringSync("@Skip\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("a named argument", () {
+        new File(_path).writeAsStringSync(
+            "@Skip(reason: 'foo')\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("multiple arguments", () {
+        new File(_path).writeAsStringSync("@Skip('foo', 'bar')\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("a non-string argument", () {
+        new File(_path).writeAsStringSync("@Skip(123)\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("multiple @Skips", () {
+        new File(_path).writeAsStringSync(
+            "@Skip('foo')\n@Skip('bar')\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+    });
+  });
+
+  group("@OnPlatform:", () {
+    test("parses a valid annotation", () {
+      new File(_path).writeAsStringSync("""
+@OnPlatform(const {
+  'chrome': const Timeout.factor(2),
+  'vm': const [const Skip(), const Timeout.factor(3)]
+})
+library foo;""");
+      var metadata = parseMetadata(_path);
+
+      var key = metadata.onPlatform.keys.first;
+      expect(key.evaluate(TestPlatform.chrome), isTrue);
+      expect(key.evaluate(TestPlatform.vm), isFalse);
+      var value = metadata.onPlatform.values.first;
+      expect(value.timeout.scaleFactor, equals(2));
+
+      key = metadata.onPlatform.keys.last;
+      expect(key.evaluate(TestPlatform.vm), isTrue);
+      expect(key.evaluate(TestPlatform.chrome), isFalse);
+      value = metadata.onPlatform.values.last;
+      expect(value.skip, isTrue);
+      expect(value.timeout.scaleFactor, equals(3));
+    });
+
+    test("ignores a constructor named OnPlatform", () {
+      new File(_path).writeAsStringSync("@foo.OnPlatform('foo')\nlibrary foo;");
+      var metadata = parseMetadata(_path);
+      expect(metadata.testOn, equals(PlatformSelector.all));
+    });
+
+    group("throws an error for", () {
+      test("a named constructor", () {
+        new File(_path).writeAsStringSync(
+            "@OnPlatform.name(const {})\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("no argument list", () {
+        new File(_path).writeAsStringSync("@OnPlatform\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("an empty argument list", () {
+        new File(_path).writeAsStringSync("@OnPlatform()\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("a named argument", () {
+        new File(_path).writeAsStringSync(
+            "@OnPlatform(map: const {})\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("multiple arguments", () {
+        new File(_path).writeAsStringSync(
+            "@OnPlatform(const {}, const {})\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("a non-map argument", () {
+        new File(_path).writeAsStringSync(
+            "@OnPlatform(const Skip())\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("a non-const map", () {
+        new File(_path).writeAsStringSync("@OnPlatform({})\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("a map with a non-String key", () {
+        new File(_path).writeAsStringSync(
+            "@OnPlatform(const {1: const Skip()})\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("a map with a unparseable key", () {
+        new File(_path).writeAsStringSync(
+            "@OnPlatform(const {'invalid': const Skip()})\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("a map with an invalid value", () {
+        new File(_path).writeAsStringSync(
+            "@OnPlatform(const {'vm': const TestOn('vm')})\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("a map with an invalid value in a list", () {
+        new File(_path).writeAsStringSync(
+            "@OnPlatform(const {'vm': [const TestOn('vm')]})\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+
+      test("multiple @OnPlatforms", () {
+        new File(_path).writeAsStringSync(
+            "@OnPlatform(const {})\n@OnPlatform(const {})\nlibrary foo;");
+        expect(() => parseMetadata(_path), throwsFormatException);
+      });
+    });
+  });
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/test/test/runner/pause_after_load_test.dart b/mojo/public/dart/third_party/test/test/runner/pause_after_load_test.dart
new file mode 100644
index 0000000..a67ea85
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/pause_after_load_test.dart
@@ -0,0 +1,322 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../io.dart';
+
+void main() {
+  useSandbox();
+
+  test("pauses the test runner for each file until the user presses enter", () {
+    d.file("test1.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  print('loaded test 1!');
+
+  test("success", () {});
+}
+""").create();
+
+    d.file("test2.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  print('loaded test 2!');
+
+  test("success", () {});
+}
+""").create();
+
+    var test = runTest(
+        ["--pause-after-load", "-p", "dartium", "test1.dart", "test2.dart"]);
+    test.stdout.expect(consumeThrough("loaded test 1!"));
+    test.stdout.expect(consumeThrough(inOrder([
+      startsWith("Observatory URL: "),
+      "The test runner is paused. Open the dev console in Dartium or the "
+          "Observatory and set breakpoints.",
+      "Once you're finished, return to this terminal and press Enter."
+    ])));
+
+    schedule(() async {
+      var nextLineFired = false;
+      test.stdout.next().then(expectAsync((line) {
+        expect(line, contains("+0: test1.dart: success"));
+        nextLineFired = true;
+      }));
+
+      // Wait a little bit to be sure that the tests don't start running without
+      // our input.
+      await new Future.delayed(new Duration(seconds: 2));
+      expect(nextLineFired, isFalse);
+    });
+
+    test.writeLine('');
+
+    test.stdout.expect(consumeThrough("loaded test 2!"));
+    test.stdout.expect(consumeThrough(inOrder([
+      startsWith("Observatory URL: "),
+      "The test runner is paused. Open the dev console in Dartium or the "
+          "Observatory and set breakpoints.",
+      "Once you're finished, return to this terminal and press Enter."
+    ])));
+
+    schedule(() async {
+      var nextLineFired = false;
+      test.stdout.next().then(expectAsync((line) {
+        expect(line, contains("+1: test2.dart: success"));
+        nextLineFired = true;
+      }));
+
+      // Wait a little bit to be sure that the tests don't start running without
+      // our input.
+      await new Future.delayed(new Duration(seconds: 2));
+      expect(nextLineFired, isFalse);
+    });
+
+    test.writeLine('');
+    test.stdout.expect(consumeThrough(contains("+2: All tests passed!")));
+    test.shouldExit(0);
+  });
+
+  test("pauses the test runner for each platform until the user presses enter",
+      () {
+    d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  print('loaded test!');
+
+  test("success", () {});
+}
+""").create();
+
+    var test = runTest(
+        ["--pause-after-load", "-p", "dartium", "-p", "chrome", "test.dart"]);
+    test.stdout.expect(consumeThrough("loaded test!"));
+    test.stdout.expect(consumeThrough(inOrder([
+      startsWith("Observatory URL: "),
+      "The test runner is paused. Open the dev console in Dartium or the "
+          "Observatory and set breakpoints.",
+      "Once you're finished, return to this terminal and press Enter."
+    ])));
+
+    schedule(() async {
+      var nextLineFired = false;
+      test.stdout.next().then(expectAsync((line) {
+        expect(line, contains("+0: [Dartium] success"));
+        nextLineFired = true;
+      }));
+
+      // Wait a little bit to be sure that the tests don't start running without
+      // our input.
+      await new Future.delayed(new Duration(seconds: 2));
+      expect(nextLineFired, isFalse);
+    });
+
+    test.writeLine('');
+
+    test.stdout.expect(consumeThrough("loaded test!"));
+    test.stdout.expect(consumeThrough(inOrder([
+      "The test runner is paused. Open the dev console in Chrome and set "
+          "breakpoints. Once you're finished,",
+      "return to this terminal and press Enter."
+    ])));
+
+    schedule(() async {
+      var nextLineFired = false;
+      test.stdout.next().then(expectAsync((line) {
+        expect(line, contains("+1: [Chrome] success"));
+        nextLineFired = true;
+      }));
+
+      // Wait a little bit to be sure that the tests don't start running without
+      // our input.
+      await new Future.delayed(new Duration(seconds: 2));
+      expect(nextLineFired, isFalse);
+    });
+
+    test.writeLine('');
+    test.stdout.expect(consumeThrough(contains("+2: All tests passed!")));
+    test.shouldExit(0);
+  });
+
+  test("prints a warning and doesn't pause for unsupported platforms", () {
+    d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {});
+}
+""").create();
+
+    var test = runTest(
+        ["--pause-after-load", "-p", "vm", "test.dart"]);
+    test.stderr.expect(
+        "Warning: Debugging is currently unsupported on the Dart VM.");
+    test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+    test.shouldExit(0);
+  });
+
+  test("can mix supported and unsupported platforms", () {
+    d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  print('loaded test!');
+
+  test("success", () {});
+}
+""").create();
+
+    var test = runTest(
+        ["--pause-after-load", "-p", "dartium", "-p", "vm", "test.dart"]);
+    test.stderr.expect(
+        "Warning: Debugging is currently unsupported on the Dart VM.");
+
+    test.stdout.expect(consumeThrough("loaded test!"));
+    test.stdout.expect(consumeThrough(inOrder([
+      startsWith("Observatory URL: "),
+      "The test runner is paused. Open the dev console in Dartium or the "
+          "Observatory and set breakpoints.",
+      "Once you're finished, return to this terminal and press Enter."
+    ])));
+
+    schedule(() async {
+      var nextLineFired = false;
+      test.stdout.next().then(expectAsync((line) {
+        expect(line, contains("+0: [Dartium] success"));
+        nextLineFired = true;
+      }));
+
+      // Wait a little bit to be sure that the tests don't start running without
+      // our input.
+      await new Future.delayed(new Duration(seconds: 2));
+      expect(nextLineFired, isFalse);
+    });
+
+    test.writeLine('');
+
+    test.stdout.expect(containsInOrder([
+      "loaded test!",
+      "+1: [VM] success",
+      "+2: All tests passed!"
+    ]));
+    test.shouldExit(0);
+  });
+
+  test("stops immediately if killed while paused", () {
+    d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  print('loaded test!');
+
+  test("success", () {});
+}
+""").create();
+
+    var test = runTest(["--pause-after-load", "-p", "dartium", "test.dart"]);
+    test.stdout.expect(consumeThrough("loaded test!"));
+    test.stdout.expect(consumeThrough(inOrder([
+      startsWith("Observatory URL: "),
+      "The test runner is paused. Open the dev console in Dartium or the "
+          "Observatory and set breakpoints.",
+      "Once you're finished, return to this terminal and press Enter."
+    ])));
+
+    test.signal(ProcessSignal.SIGTERM);
+    test.shouldExit();
+    test.stderr.expect(isDone);
+  }, testOn: "!windows");
+
+  test("disables timeouts", () {
+    d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  print('loaded test 1!');
+
+  test("success", () {}, timeout: new Timeout(Duration.ZERO));
+}
+""").create();
+
+    var test = runTest(
+        ["--pause-after-load", "-p", "dartium", "-n", "success", "test.dart"]);
+    test.stdout.expect(consumeThrough("loaded test 1!"));
+    test.stdout.expect(consumeThrough(inOrder([
+      startsWith("Observatory URL: "),
+      "The test runner is paused. Open the dev console in Dartium or the "
+          "Observatory and set breakpoints.",
+      "Once you're finished, return to this terminal and press Enter."
+    ])));
+
+    schedule(() async {
+      var nextLineFired = false;
+      test.stdout.next().then(expectAsync((line) {
+        expect(line, contains("+0: success"));
+        nextLineFired = true;
+      }));
+
+      // Wait a little bit to be sure that the tests don't start running without
+      // our input.
+      await new Future.delayed(new Duration(seconds: 2));
+      expect(nextLineFired, isFalse);
+    });
+
+    test.writeLine('');
+    test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+    test.shouldExit(0);
+  });
+
+  // Regression test for #304.
+  test("supports test name patterns", () {
+    d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  print('loaded test 1!');
+
+  test("failure 1", () {});
+  test("success", () {});
+  test("failure 2", () {});
+}
+""").create();
+
+    var test = runTest(
+        ["--pause-after-load", "-p", "dartium", "-n", "success", "test.dart"]);
+    test.stdout.expect(consumeThrough("loaded test 1!"));
+    test.stdout.expect(consumeThrough(inOrder([
+      startsWith("Observatory URL: "),
+      "The test runner is paused. Open the dev console in Dartium or the "
+          "Observatory and set breakpoints.",
+      "Once you're finished, return to this terminal and press Enter."
+    ])));
+
+    schedule(() async {
+      var nextLineFired = false;
+      test.stdout.next().then(expectAsync((line) {
+        expect(line, contains("+0: success"));
+        nextLineFired = true;
+      }));
+
+      // Wait a little bit to be sure that the tests don't start running without
+      // our input.
+      await new Future.delayed(new Duration(seconds: 2));
+      expect(nextLineFired, isFalse);
+    });
+
+    test.writeLine('');
+    test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+    test.shouldExit(0);
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/pub_serve_test.dart b/mojo/public/dart/third_party/test/test/runner/pub_serve_test.dart
new file mode 100644
index 0000000..505c04b
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/pub_serve_test.dart
@@ -0,0 +1,297 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:test/src/util/exit_codes.dart' as exit_codes;
+
+import '../io.dart';
+
+/// The `--pub-serve` argument for the test process, based on [pubServePort].
+Future<String> get _pubServeArg =>
+    pubServePort.then((port) => '--pub-serve=$port');
+
+void main() {
+  useSandbox(() {
+    d.file("pubspec.yaml", """
+name: myapp
+dependencies:
+  barback: any
+  test: {path: ${p.current}}
+transformers:
+- myapp:
+    \$include: test/**_test.dart
+- test/pub_serve:
+    \$include: test/**_test.dart
+dependency_overrides:
+  matcher: '0.12.0-alpha.0'
+""").create();
+
+    d.dir("test", [
+      d.file("my_test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  test("test", () => expect(true, isTrue));
+}
+""")
+    ]).create();
+
+    d.dir("lib", [
+      d.file("myapp.dart", """
+import 'package:barback/barback.dart';
+
+class MyTransformer extends Transformer {
+  final allowedExtensions = '.dart';
+
+  MyTransformer.asPlugin();
+
+  Future apply(Transform transform) async {
+    var contents = await transform.primaryInput.readAsString();
+    transform.addOutput(new Asset.fromString(
+        transform.primaryInput.id,
+        contents.replaceAll("isFalse", "isTrue")));
+  }
+}
+""")
+    ]).create();
+
+    runPub(['get']).shouldExit(0);
+  });
+
+  group("with transformed tests", () {
+    setUp(() {
+      // Give the test a failing assertion that the transformer will convert to
+      // a passing assertion.
+      d.file("test/my_test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  test("test", () => expect(true, isFalse));
+}
+""").create();
+    });
+
+    test("runs those tests in the VM", () {
+      var pub = runPubServe();
+      var test = runTest([_pubServeArg]);
+      test.stdout.expect(consumeThrough(contains('+1: All tests passed!')));
+      test.shouldExit(0);
+      pub.kill();
+    });
+
+    test("runs those tests on Chrome", () {
+      var pub = runPubServe();
+      var test = runTest([_pubServeArg, '-p', 'chrome']);
+      test.stdout.expect(consumeThrough(contains('+1: All tests passed!')));
+      test.shouldExit(0);
+      pub.kill();
+    });
+
+    test("runs those tests on content shell", () {
+      var pub = runPubServe();
+      var test = runTest([_pubServeArg, '-p', 'content-shell']);
+      test.stdout.expect(consumeThrough(contains('+1: All tests passed!')));
+      test.shouldExit(0);
+      pub.kill();
+    });
+
+    test("gracefully handles pub serve running on the wrong directory for "
+        "VM tests", () {
+      d.dir("web").create();
+
+      var pub = runPubServe(args: ['web']);
+      var test = runTest([_pubServeArg]);
+      test.stdout.expect(containsInOrder([
+        '-1: loading ${p.join("test", "my_test.dart")}',
+        'Failed to load "${p.join("test", "my_test.dart")}":',
+        '404 Not Found',
+        'Make sure "pub serve" is serving the test/ directory.'
+      ]));
+      test.shouldExit(1);
+
+      pub.kill();
+    });
+
+    test("gracefully handles pub serve running on the wrong directory for "
+        "browser tests", () {
+      d.dir("web").create();
+
+      var pub = runPubServe(args: ['web']);
+      var test = runTest([_pubServeArg, '-p', 'chrome']);
+      test.stdout.expect(containsInOrder([
+        '-1: compiling ${p.join("test", "my_test.dart")}',
+        'Failed to load "${p.join("test", "my_test.dart")}":',
+        '404 Not Found',
+        'Make sure "pub serve" is serving the test/ directory.'
+      ]));
+      test.shouldExit(1);
+
+      pub.kill();
+    });
+
+    test("gracefully handles unconfigured transformers", () {
+      d.file("pubspec.yaml", """
+name: myapp
+dependencies:
+  barback: any
+  test: {path: ${p.current}}
+""").create();
+
+      var pub = runPubServe();
+      var test = runTest([_pubServeArg]);
+      expectStderrEquals(test, '''
+When using --pub-serve, you must include the "test/pub_serve" transformer in
+your pubspec:
+
+transformers:
+- test/pub_serve:
+    \$include: test/**_test.dart
+''');
+      test.shouldExit(exit_codes.data);
+
+      pub.kill();
+    });
+  });
+
+  group("uses a custom HTML file", () {
+    setUp(() {
+      d.dir("test", [
+        d.file("test.dart", """
+import 'dart:html';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("failure", () {
+    expect(document.query('#foo'), isNull);
+  });
+}
+"""),
+
+      d.file("test.html", """
+<html>
+<head>
+  <link rel='x-dart-test' href='test.dart'>
+  <script src="packages/test/dart.js"></script>
+</head>
+<body>
+  <div id="foo"></div>
+</body>
+""")
+      ]).create();
+    });
+
+    test("on Chrome", () {
+      var pub = runPubServe();
+      var test = runTest([_pubServeArg, '-p', 'chrome']);
+      test.stdout.expect(consumeThrough(contains('+1: All tests passed!')));
+      test.shouldExit(0);
+      pub.kill();
+    });
+
+    test("on content shell", () {
+      var pub = runPubServe();
+      var test = runTest([_pubServeArg, '-p', 'content-shell']);
+      test.stdout.expect(consumeThrough(contains('+1: All tests passed!')));
+      test.shouldExit(0);
+      pub.kill();
+    });
+  });
+
+  group("with a failing test", () {
+    setUp(() {
+      d.file("test/my_test.dart", """
+import 'dart:html';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("failure", () => throw 'oh no');
+}
+""").create();
+    });
+
+    test("dartifies stack traces for JS-compiled tests by default", () {
+      var pub = runPubServe();
+      var test = runTest([_pubServeArg, '-p', 'chrome', '--verbose-trace']);
+      test.stdout.expect(containsInOrder([
+        " main.<fn>",
+        "package:test",
+        "dart:async/zone.dart"
+      ]));
+      test.shouldExit(1);
+      pub.kill();
+    });
+
+    test("doesn't dartify stack traces for JS-compiled tests with --js-trace",
+        () {
+      var pub = runPubServe();
+      var test = runTest([
+        _pubServeArg,
+        '-p', 'chrome',
+        '--js-trace',
+        '--verbose-trace'
+      ]);
+
+      test.stdout.fork().expect(never(endsWith(" main.<fn>")));
+      test.stdout.fork().expect(never(contains("package:test")));
+      test.stdout.fork().expect(never(contains("dart:async/zone.dart")));
+      test.stdout.expect(consumeThrough(contains("-1: Some tests failed.")));
+      test.shouldExit(1);
+
+      pub.kill();
+    });
+  });
+
+  test("gracefully handles pub serve not running for VM tests", () {
+    var test = runTest(['--pub-serve=54321']);
+    test.stdout.expect(containsInOrder([
+      '-1: loading ${p.join("test", "my_test.dart")}',
+      'Failed to load "${p.join("test", "my_test.dart")}":',
+      'Error getting http://localhost:54321/my_test.dart.vm_test.dart: '
+          'Connection refused',
+      'Make sure "pub serve" is running.'
+    ]));
+    test.shouldExit(1);
+  });
+
+  test("gracefully handles pub serve not running for browser tests", () {
+    var test = runTest(['--pub-serve=54321', '-p', 'chrome']);
+    var message = Platform.isWindows
+        ? 'The remote computer refused the network connection.'
+        : 'Connection refused (errno ';
+
+    test.stdout.expect(containsInOrder([
+      '-1: compiling ${p.join("test", "my_test.dart")}',
+      'Failed to load "${p.join("test", "my_test.dart")}":',
+      'Error getting http://localhost:54321/my_test.dart.browser_test.dart.js'
+          '.map: $message',
+      'Make sure "pub serve" is running.'
+    ]));
+    test.shouldExit(1);
+  });
+
+  test("gracefully handles a test file not being in test/", () {
+    schedule(() {
+      new File(p.join(sandbox, 'test/my_test.dart'))
+          .copySync(p.join(sandbox, 'my_test.dart'));
+    });
+
+    var test = runTest(['--pub-serve=54321', 'my_test.dart']);
+    test.stdout.expect(containsInOrder([
+      '-1: loading my_test.dart',
+      'Failed to load "my_test.dart": When using "pub serve", all test files '
+          'must be in test/.'
+    ]));
+    test.shouldExit(1);
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/runner_test.dart b/mojo/public/dart/third_party/test/test/runner/runner_test.dart
new file mode 100644
index 0000000..8817b8b
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/runner_test.dart
@@ -0,0 +1,682 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'dart:io';
+import 'dart:math' as math;
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:test/src/util/exit_codes.dart' as exit_codes;
+
+import '../io.dart';
+
+final _success = """
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {});
+}
+""";
+
+final _failure = """
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("failure", () => throw new TestFailure("oh no"));
+}
+""";
+
+final _defaultConcurrency = math.max(1, Platform.numberOfProcessors ~/ 2);
+
+final _browsers =
+    "[vm (default), dartium, content-shell, chrome, phantomjs, firefox" +
+        (Platform.isMacOS ? ", safari" : "") +
+        (Platform.isWindows ? ", ie" : "") + "]";
+
+final _usage = """
+Usage: pub run test:test [files or directories...]
+
+-h, --help                     Shows this usage information.
+    --version                  Shows the package's version.
+-n, --name                     A substring of the name of the test to run.
+                               Regular expression syntax is supported.
+
+-N, --plain-name               A plain-text substring of the name of the test to run.
+-p, --platform                 The platform(s) on which to run the tests.
+                               $_browsers
+
+-j, --concurrency=<threads>    The number of concurrent test suites run.
+                               (defaults to $_defaultConcurrency)
+
+    --pub-serve=<port>         The port of a pub serve instance serving "test/".
+    --pause-after-load         Pauses for debugging before any tests execute.
+                               Implies --concurrency=1.
+                               Currently only supported for browser tests.
+
+-r, --reporter                 The runner used to print test results.
+
+          [compact]            A single line, updated continuously.
+          [expanded]           A separate line for each update.
+
+    --verbose-trace            Whether to emit stack traces with core library frames.
+    --js-trace                 Whether to emit raw JavaScript stack traces for browser tests.
+    --[no-]color               Whether to use terminal colors.
+                               (auto-detected by default)
+""";
+
+void main() {
+  useSandbox();
+
+  test("prints help information", () {
+    var test = runTest(["--help"]);
+    expectStdoutEquals(test, """
+Runs tests in this package.
+
+$_usage""");
+    test.shouldExit(0);
+  });
+
+  group("fails gracefully if", () {
+    test("an invalid option is passed", () {
+      var test = runTest(["--asdf"]);
+      expectStderrEquals(test, """
+Could not find an option named "asdf".
+
+$_usage""");
+      test.shouldExit(exit_codes.usage);
+    });
+
+    test("a non-existent file is passed", () {
+      var test = runTest(["file"]);
+      test.stdout.expect(containsInOrder([
+        '-1: loading file',
+        'Failed to load "file": Does not exist.'
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("the default directory doesn't exist", () {
+      var test = runTest([]);
+      expectStderrEquals(test, """
+No test files were passed and the default "test/" directory doesn't exist.
+
+$_usage""");
+      test.shouldExit(exit_codes.data);
+    });
+
+    test("a test file fails to load", () {
+      d.file("test.dart", "invalid Dart file").create();
+      var test = runTest(["test.dart"]);
+
+      test.stdout.expect(containsInOrder([
+        '-1: loading test.dart',
+        'Failed to load "test.dart":',
+        "line 1 pos 1: unexpected token 'invalid'",
+        "invalid Dart file",
+        "^"
+      ]));
+      test.shouldExit(1);
+    });
+
+    // This syntax error is detected lazily, and so requires some extra
+    // machinery to support.
+    test("a test file fails to parse due to a missing semicolon", () {
+      d.file("test.dart", "void main() {foo}").create();
+      var test = runTest(["test.dart"]);
+
+      test.stdout.expect(containsInOrder([
+        '-1: loading test.dart',
+        'Failed to load "test.dart":',
+        'line 1 pos 17: semicolon expected',
+        'void main() {foo}',
+        '                ^'
+      ]));
+      test.shouldExit(1);
+    });
+
+    // This is slightly different from the above test because it's an error
+    // that's caught first by the analyzer when it's used to parse the file.
+    test("a test file fails to parse", () {
+      d.file("test.dart", "@TestOn)").create();
+      var test = runTest(["test.dart"]);
+
+      test.stdout.expect(containsInOrder([
+        '-1: loading test.dart',
+        'Failed to load "test.dart":',
+        "line 1 pos 8: unexpected token ')'",
+        "@TestOn)",
+        "       ^"
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("an annotation's structure is invalid", () {
+      d.file("test.dart", "@TestOn()\nlibrary foo;").create();
+      var test = runTest(["test.dart"]);
+
+      test.stdout.expect(containsInOrder([
+        '-1: loading test.dart',
+        'Failed to load "test.dart":',
+        "Error on line 1, column 8: TestOn takes 1 argument.",
+        "@TestOn()",
+        "       ^^"
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("an annotation's contents are invalid", () {
+      d.file("test.dart", "@TestOn('zim')\nlibrary foo;").create();
+      var test = runTest(["test.dart"]);
+
+      test.stdout.expect(containsInOrder([
+        '-1: loading test.dart',
+        'Failed to load "test.dart":',
+        "Error on line 1, column 10: Undefined variable.",
+        "@TestOn('zim')",
+        "         ^^^"
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("a test file throws", () {
+      d.file("test.dart", "void main() => throw 'oh no';").create();
+      var test = runTest(["test.dart"]);
+
+      test.stdout.expect(containsInOrder([
+        '-1: loading test.dart',
+        'Failed to load "test.dart": oh no'
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("a test file doesn't have a main defined", () {
+      d.file("test.dart", "void foo() {}").create();
+      var test = runTest(["test.dart"]);
+
+      test.stdout.expect(containsInOrder([
+        '-1: loading test.dart',
+        'Failed to load "test.dart": No top-level main() function defined.'
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("a test file has a non-function main", () {
+      d.file("test.dart", "int main;").create();
+      var test = runTest(["test.dart"]);
+
+      test.stdout.expect(containsInOrder([
+        '-1: loading test.dart',
+        'Failed to load "test.dart": Top-level main getter is not a function.'
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("a test file has a main with arguments", () {
+      d.file("test.dart", "void main(arg) {}").create();
+      var test = runTest(["test.dart"]);
+
+      test.stdout.expect(containsInOrder([
+        '-1: loading test.dart',
+        'Failed to load "test.dart": Top-level main() function takes arguments.'
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("multiple load errors occur", () {
+      d.file("test.dart", "invalid Dart file").create();
+      var test = runTest(["test.dart", "nonexistent.dart"]);
+
+      test.stdout.expect(containsInOrder([
+        'loading nonexistent.dart',
+        'Failed to load "nonexistent.dart": Does not exist.',
+        'loading test.dart',
+        'Failed to load "test.dart":',
+        "line 1 pos 1: unexpected token 'invalid'",
+        "invalid Dart file",
+        "^"
+      ]));
+      test.shouldExit(1);
+    });
+
+    // TODO(nweiz): test what happens when a test file is unreadable once issue
+    // 15078 is fixed.
+  });
+
+  group("runs successful tests", () {
+    test("defined in a single file", () {
+      d.file("test.dart", _success).create();
+      var test = runTest(["test.dart"]);
+      test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+      test.shouldExit(0);
+    });
+
+    test("defined in a directory", () {
+      for (var i = 0; i < 3; i++) {
+        d.file("${i}_test.dart", _success).create();
+      }
+
+      var test = runTest(["."]);
+      test.stdout.expect(consumeThrough(contains("+3: All tests passed!")));
+      test.shouldExit(0);
+    });
+
+    test("defaulting to the test directory", () {
+      d.dir("test", new Iterable.generate(3, (i) {
+        return d.file("${i}_test.dart", _success);
+      })).create();
+
+      var test = runTest([]);
+      test.stdout.expect(consumeThrough(contains("+3: All tests passed!")));
+      test.shouldExit(0);
+    });
+
+    test("directly", () {
+      d.file("test.dart", _success).create();
+      var test = runDart([
+        "--package-root=${p.join(packageDir, 'packages')}",
+        "test.dart"
+      ]);
+
+      test.stdout.expect(consumeThrough(contains("All tests passed!")));
+      test.shouldExit(0);
+    });
+
+    // Regression test; this broke in 0.12.0-beta.9.
+    test("on a file in a subdirectory", () {
+      d.dir("dir", [d.file("test.dart", _success)]).create();
+
+      var test = runTest(["dir/test.dart"]);
+      test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+      test.shouldExit(0);
+    });
+  });
+
+  group("runs failing tests", () {
+    test("defined in a single file", () {
+      d.file("test.dart", _failure).create();
+
+      var test = runTest(["test.dart"]);
+      test.stdout.expect(consumeThrough(contains("-1: Some tests failed.")));
+      test.shouldExit(1);
+    });
+
+    test("defined in a directory", () {
+      for (var i = 0; i < 3; i++) {
+        d.file("${i}_test.dart", _failure).create();
+      }
+
+      var test = runTest(["."]);
+      test.stdout.expect(consumeThrough(contains("-3: Some tests failed.")));
+      test.shouldExit(1);
+    });
+
+    test("defaulting to the test directory", () {
+      d.dir("test", new Iterable.generate(3, (i) {
+        return d.file("${i}_test.dart", _failure);
+      })).create();
+
+      var test = runTest([]);
+      test.stdout.expect(consumeThrough(contains("-3: Some tests failed.")));
+      test.shouldExit(1);
+    });
+
+    test("directly", () {
+      d.file("test.dart", _failure).create();
+      var test = runDart([
+        "--package-root=${p.join(packageDir, 'packages')}",
+        "test.dart"
+      ]);
+      test.stdout.expect(consumeThrough(contains("Some tests failed.")));
+      test.shouldExit(255);
+    });
+  });
+
+  test("runs tests even when a file fails to load", () {
+    d.file("test.dart", _success).create();
+
+    var test = runTest(["test.dart", "nonexistent.dart"]);
+    test.stdout.expect(consumeThrough(contains("+1 -1: Some tests failed.")));
+    test.shouldExit(1);
+  });
+
+  test("respects top-level @Timeout declarations", () {
+    d.file("test.dart", '''
+@Timeout(const Duration(seconds: 0))
+
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("timeout", () {});
+}
+''').create();
+
+    var test = runTest(["test.dart"]);
+    test.stdout.expect(containsInOrder([
+      "Test timed out after 0 seconds.",
+      "-1: Some tests failed."
+    ]));
+    test.shouldExit(1);
+  });
+
+  test("respects top-level @Skip declarations", () {
+    d.file("test.dart", '''
+@Skip()
+
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("fail", () => throw 'oh no');
+}
+''').create();
+
+    var test = runTest(["test.dart"]);
+    test.stdout.expect(consumeThrough(contains("+0 ~1: All tests skipped.")));
+    test.shouldExit(0);
+  });
+
+  group("with onPlatform", () {
+    test("respects matching Skips", () {
+      d.file("test.dart", '''
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("fail", () => throw 'oh no', onPlatform: {"vm": new Skip()});
+}
+''').create();
+
+      var test = runTest(["test.dart"]);
+      test.stdout.expect(consumeThrough(contains("+0 ~1: All tests skipped.")));
+      test.shouldExit(0);
+    });
+
+    test("ignores non-matching Skips", () {
+      d.file("test.dart", '''
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {}, onPlatform: {"chrome": new Skip()});
+}
+''').create();
+
+      var test = runTest(["test.dart"]);
+      test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+      test.shouldExit(0);
+    });
+
+    test("respects matching Timeouts", () {
+      d.file("test.dart", '''
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("fail", () => throw 'oh no', onPlatform: {
+    "vm": new Timeout(new Duration(seconds: 0))
+  });
+}
+''').create();
+
+      var test = runTest(["test.dart"]);
+      test.stdout.expect(containsInOrder([
+        "Test timed out after 0 seconds.",
+        "-1: Some tests failed."
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("ignores non-matching Timeouts", () {
+      d.file("test.dart", '''
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {}, onPlatform: {
+    "chrome": new Timeout(new Duration(seconds: 0))
+  });
+}
+''').create();
+
+      var test = runTest(["test.dart"]);
+      test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+      test.shouldExit(0);
+    });
+
+    test("applies matching platforms in order", () {
+      d.file("test.dart", '''
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {}, onPlatform: {
+    "vm": new Skip("first"),
+    "vm || windows": new Skip("second"),
+    "vm || linux": new Skip("third"),
+    "vm || mac-os": new Skip("fourth"),
+    "vm || android": new Skip("fifth")
+  });
+}
+''').create();
+
+      var test = runTest(["test.dart"]);
+      test.stdout.fork().expect(never(contains("Skip: first")));
+      test.stdout.fork().expect(never(contains("Skip: second")));
+      test.stdout.fork().expect(never(contains("Skip: third")));
+      test.stdout.fork().expect(never(contains("Skip: fourth")));
+      test.stdout.expect(consumeThrough(contains("Skip: fifth")));
+      test.shouldExit(0);
+    });
+  });
+
+  group("with an @OnPlatform annotation", () {
+    test("respects matching Skips", () {
+      d.file("test.dart", '''
+@OnPlatform(const {"vm": const Skip()})
+
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("fail", () => throw 'oh no');
+}
+''').create();
+
+      var test = runTest(["test.dart"]);
+      test.stdout.expect(consumeThrough(contains("+0 ~1: All tests skipped.")));
+      test.shouldExit(0);
+    });
+
+    test("ignores non-matching Skips", () {
+      d.file("test.dart", '''
+@OnPlatform(const {"chrome": const Skip()})
+
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {});
+}
+''').create();
+
+      var test = runTest(["test.dart"]);
+      test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+      test.shouldExit(0);
+    });
+
+    test("respects matching Timeouts", () {
+      d.file("test.dart", '''
+@OnPlatform(const {
+  "vm": const Timeout(const Duration(seconds: 0))
+})
+
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("fail", () => throw 'oh no');
+}
+''').create();
+
+      var test = runTest(["test.dart"]);
+      test.stdout.expect(containsInOrder([
+        "Test timed out after 0 seconds.",
+        "-1: Some tests failed."
+      ]));
+      test.shouldExit(1);
+    });
+
+    test("ignores non-matching Timeouts", () {
+      d.file("test.dart", '''
+@OnPlatform(const {
+  "chrome": const Timeout(const Duration(seconds: 0))
+})
+
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("success", () {});
+}
+''').create();
+
+      var test = runTest(["test.dart"]);
+      test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+      test.shouldExit(0);
+    });
+  });
+
+  group("flags:", () {
+    test("with the --color flag, uses colors", () {
+      d.file("test.dart", _failure).create();
+      var test = runTest(["--color", "test.dart"]);
+      // This is the color code for red.
+      test.stdout.expect(consumeThrough(contains("\u001b[31m")));
+      test.shouldExit();
+    });
+
+    group("with the --name flag,", () {
+      test("selects tests with matching names", () {
+        d.file("test.dart", """
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("selected 1", () {});
+  test("nope", () => throw new TestFailure("oh no"));
+  test("selected 2", () {});
+}
+""").create();
+
+        var test = runTest(["--name", "selected", "test.dart"]);
+        test.stdout.expect(consumeThrough(contains("+2: All tests passed!")));
+        test.shouldExit(0);
+      });
+
+      test("supports RegExp syntax", () {
+        d.file("test.dart", """
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("test 1", () {});
+  test("test 2", () => throw new TestFailure("oh no"));
+  test("test 3", () {});
+}
+""").create();
+
+        var test = runTest(["--name", "test [13]", "test.dart"]);
+        test.stdout.expect(consumeThrough(contains("+2: All tests passed!")));
+        test.shouldExit(0);
+      });
+
+      test("produces an error when no tests match", () {
+        d.file("test.dart", _success).create();
+
+        var test = runTest(["--name", "no match", "test.dart"]);
+        test.stderr.expect(consumeThrough(
+            contains('No tests match regular expression "no match".')));
+        test.shouldExit(exit_codes.data);
+      });
+
+      test("doesn't filter out load exceptions", () {
+        var test = runTest(["--name", "name", "file"]);
+        test.stdout.expect(containsInOrder([
+          '-1: loading file',
+          '  Failed to load "file": Does not exist.'
+        ]));
+        test.shouldExit(1);
+      });
+    });
+
+    group("with the --plain-name flag,", () {
+      test("selects tests with matching names", () {
+        d.file("test.dart", """
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("selected 1", () {});
+  test("nope", () => throw new TestFailure("oh no"));
+  test("selected 2", () {});
+}
+""").create();
+
+        var test = runTest(["--plain-name", "selected", "test.dart"]);
+        test.stdout.expect(consumeThrough(contains("+2: All tests passed!")));
+        test.shouldExit(0);
+      });
+
+      test("doesn't support RegExp syntax", () {
+        d.file("test.dart", """
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("test 1", () => throw new TestFailure("oh no"));
+  test("test 2", () => throw new TestFailure("oh no"));
+  test("test [12]", () {});
+}
+""").create();
+
+        var test = runTest(["--plain-name", "test [12]", "test.dart"]);
+        test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
+        test.shouldExit(0);
+      });
+
+      test("produces an error when no tests match", () {
+        d.file("test.dart", _success).create();
+
+        var test = runTest(["--plain-name", "no match", "test.dart"]);
+        test.stderr.expect(
+            consumeThrough(contains('No tests match "no match".')));
+        test.shouldExit(exit_codes.data);
+      });
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/signal_test.dart b/mojo/public/dart/third_party/test/test/runner/signal_test.dart
new file mode 100644
index 0000000..5397d07
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/signal_test.dart
@@ -0,0 +1,235 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Windows doesn't support sending signals.
+@TestOn("vm && !windows")
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_process.dart';
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../io.dart';
+
+String get _tempDir => p.join(sandbox, "tmp");
+
+// This test is inherently prone to race conditions. If it fails, it will likely
+// do so flakily, but if it succeeds, it will succeed consistently. The tests
+// represent a best effort to kill the test runner at certain times during its
+// execution.
+void main() {
+  useSandbox(() => d.dir("tmp").create());
+
+  group("during loading,", () {
+    test("cleans up if killed while loading a VM test", () {
+      d.file("test.dart", """
+void main() {
+  print("in test.dart");
+  // Spin for a long time so the test is probably killed while still loading.
+  for (var i = 0; i < 100000000; i++) {}
+}
+""").create();
+
+      var test = _runTest(["test.dart"]);
+      test.stdout.expect(consumeThrough("in test.dart"));
+      signalAndQuit(test);
+
+      expectTempDirEmpty();
+    });
+
+    test("cleans up if killed while loading a browser test", () {
+      d.file("test.dart", "void main() {}").create();
+
+      var test = _runTest(["-p", "chrome", "test.dart"]);
+      test.stdout.expect(consumeThrough(endsWith("compiling test.dart")));
+      signalAndQuit(test);
+
+      expectTempDirEmpty();
+    });
+
+    test("exits immediately if ^C is sent twice", () {
+      d.file("test.dart", """
+void main() {
+  print("in test.dart");
+  while (true) {}
+}
+""").create();
+
+      var test = _runTest(["test.dart"]);
+      test.stdout.expect(consumeThrough("in test.dart"));
+      test.signal(ProcessSignal.SIGTERM);
+
+      // TODO(nweiz): Sending two signals in close succession can cause the
+      // second one to be ignored, so we wait a bit before the second
+      // one. Remove this hack when issue 23047 is fixed.
+      schedule(() => new Future.delayed(new Duration(seconds: 1)));
+
+      signalAndQuit(test);
+    });
+  });
+
+  group("during test running", () {
+    test("waits for a VM test to finish running", () {
+      d.file("test.dart", """
+import 'dart:async';
+import 'dart:io';
+
+import 'package:test/test.dart';
+
+void main() {
+  tearDown(() => new File("output").writeAsStringSync("ran teardown"));
+
+  test("test", () {
+    print("running test");
+    return new Future.delayed(new Duration(seconds: 1));
+  });
+}
+""").create();
+
+      var test = _runTest(["test.dart"]);
+      test.stdout.expect(consumeThrough("running test"));
+      signalAndQuit(test);
+
+      d.file("output", "ran teardown").validate();
+      expectTempDirEmpty();
+    });
+
+    test("kills a browser test immediately", () {
+      d.file("test.dart", """
+import 'dart:async';
+
+import 'package:test/test.dart';
+
+void main() {
+  test("test", () {
+    print("running test");
+
+    // Allow an event loop to pass so the preceding print can be handled.
+    return new Future(() {
+      // Loop forever so that if the test isn't stopped while running, it never
+      // stops.
+      while (true) {}
+    });
+  });
+}
+""").create();
+
+      var test = _runTest(["-p", "content-shell", "test.dart"]);
+      test.stdout.expect(consumeThrough("running test"));
+      signalAndQuit(test);
+
+      expectTempDirEmpty();
+    });
+
+    test("kills a VM test immediately if ^C is sent twice", () {
+      d.file("test.dart", """
+import 'package:test/test.dart';
+
+void main() {
+  test("test", () {
+    print("running test");
+    while (true) {}
+  });
+}
+""").create();
+
+      var test = _runTest(["test.dart"]);
+      test.stdout.expect(consumeThrough("running test"));
+      test.signal(ProcessSignal.SIGTERM);
+
+      // TODO(nweiz): Sending two signals in close succession can cause the
+      // second one to be ignored, so we wait a bit before the second
+      // one. Remove this hack when issue 23047 is fixed.
+      schedule(() => new Future.delayed(new Duration(seconds: 1)));
+      signalAndQuit(test);
+    });
+
+    test("causes expect() to always throw an error immediately", () {
+      d.file("test.dart", """
+import 'dart:async';
+import 'dart:io';
+
+import 'package:test/test.dart';
+
+void main() {
+  var expectThrewError = false;
+
+  tearDown(() {
+    new File("output").writeAsStringSync(expectThrewError.toString());
+  });
+
+  test("test", () async {
+    print("running test");
+
+    await new Future.delayed(new Duration(seconds: 1));
+    try {
+      expect(true, isTrue);
+    } catch (_) {
+      expectThrewError = true;
+    }
+  });
+}
+""").create();
+
+      var test = _runTest(["test.dart"]);
+      test.stdout.expect(consumeThrough("running test"));
+      signalAndQuit(test);
+
+      d.file("output", "true").validate();
+      expectTempDirEmpty();
+    });
+
+    test("causes expectAsync() to always throw an error immediately", () {
+      d.file("test.dart", """
+import 'dart:async';
+import 'dart:io';
+
+import 'package:test/test.dart';
+
+void main() {
+  var expectAsyncThrewError = false;
+
+  tearDown(() {
+    new File("output").writeAsStringSync(expectAsyncThrewError.toString());
+  });
+
+  test("test", () async {
+    print("running test");
+
+    await new Future.delayed(new Duration(seconds: 1));
+    try {
+      expectAsync(() {});
+    } catch (_) {
+      expectAsyncThrewError = true;
+    }
+  });
+}
+""").create();
+
+      var test = _runTest(["test.dart"]);
+      test.stdout.expect(consumeThrough("running test"));
+      signalAndQuit(test);
+
+      d.file("output", "true").validate();
+      expectTempDirEmpty();
+    });
+  });
+}
+
+ScheduledProcess _runTest(List<String> args) =>
+    runTest(args, environment: {"_UNITTEST_TEMP_DIR": _tempDir});
+
+void signalAndQuit(ScheduledProcess test) {
+  test.signal(ProcessSignal.SIGTERM);
+  test.shouldExit();
+  test.stderr.expect(isDone);
+}
+
+void expectTempDirEmpty() {
+  schedule(() => expect(new Directory(_tempDir).listSync(), isEmpty));
+}
diff --git a/mojo/public/dart/third_party/test/test/runner/test_on_test.dart b/mojo/public/dart/third_party/test/test/runner/test_on_test.dart
new file mode 100644
index 0000000..8c34a10
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/runner/test_on_test.dart
@@ -0,0 +1,209 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'dart:io';
+
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:test/src/util/io.dart';
+
+import '../io.dart';
+
+final _otherOS = Platform.isWindows ? "mac-os" : "windows";
+
+void main() {
+  useSandbox();
+
+  group("for suite", () {
+    test("runs a test suite on a matching platform", () {
+      _writeTestFile("vm_test.dart", suiteTestOn: "vm");
+
+      var test = runTest(["vm_test.dart"]);
+      test.stdout.expect(consumeThrough(contains("All tests passed!")));
+      test.shouldExit(0);
+    });
+
+    test("doesn't run a test suite on a non-matching platform", () {
+      _writeTestFile("vm_test.dart", suiteTestOn: "vm");
+
+      var test = runTest(["--platform", "content-shell", "vm_test.dart"]);
+      test.stdout.expect(consumeThrough(contains("No tests ran.")));
+      test.shouldExit(0);
+    });
+
+    test("runs a test suite on a matching operating system", () {
+      _writeTestFile("os_test.dart", suiteTestOn: currentOS.name);
+
+      var test = runTest(["os_test.dart"]);
+      test.stdout.expect(consumeThrough(contains("All tests passed!")));
+      test.shouldExit(0);
+    });
+
+    test("doesn't run a test suite on a non-matching operating system", () {
+      _writeTestFile("os_test.dart", suiteTestOn: _otherOS,
+          loadable: false);
+
+      var test = runTest(["os_test.dart"]);
+      test.stdout.expect(consumeThrough(contains("No tests ran.")));
+      test.shouldExit(0);
+    });
+
+    test("only loads matching files when loading as a group", () {
+      _writeTestFile("vm_test.dart", suiteTestOn: "vm");
+      _writeTestFile("browser_test.dart",
+          suiteTestOn: "browser", loadable: false);
+      _writeTestFile("this_os_test.dart", suiteTestOn: currentOS.name);
+      _writeTestFile("other_os_test.dart",
+          suiteTestOn: _otherOS, loadable: false);
+
+      var test = runTest(["."]);
+      test.stdout.expect(consumeThrough(contains("+2: All tests passed!")));
+      test.shouldExit(0);
+    });
+  });
+
+  group("for group", () {
+    test("runs a VM group on the VM", () {
+      _writeTestFile("vm_test.dart", groupTestOn: "vm");
+
+      var test = runTest(["vm_test.dart"]);
+      test.stdout.expect(consumeThrough(contains("All tests passed!")));
+      test.shouldExit(0);
+    });
+
+    test("doesn't run a Browser group on the VM", () {
+      _writeTestFile("browser_test.dart", groupTestOn: "browser");
+
+      var test = runTest(["browser_test.dart"]);
+      test.stdout.expect(consumeThrough(contains("No tests ran.")));
+      test.shouldExit(0);
+    });
+
+    test("runs a browser group on a browser", () {
+      _writeTestFile("browser_test.dart", groupTestOn: "browser");
+
+      var test = runTest(
+          ["--platform", "content-shell", "browser_test.dart"]);
+      test.stdout.expect(consumeThrough(contains("All tests passed!")));
+      test.shouldExit(0);
+    });
+
+    test("doesn't run a VM group on a browser", () {
+      _writeTestFile("vm_test.dart", groupTestOn: "vm");
+
+      var test = runTest(["--platform", "content-shell", "vm_test.dart"]);
+      test.stdout.expect(consumeThrough(contains("No tests ran.")));
+      test.shouldExit(0);
+    });
+  });
+
+  group("for test", () {
+    test("runs a VM test on the VM", () {
+      _writeTestFile("vm_test.dart", testTestOn: "vm");
+
+      var test = runTest(["vm_test.dart"]);
+      test.stdout.expect(consumeThrough(contains("All tests passed!")));
+      test.shouldExit(0);
+    });
+
+    test("doesn't run a browser test on the VM", () {
+      _writeTestFile("browser_test.dart", testTestOn: "browser");
+
+      var test = runTest(["browser_test.dart"]);
+      test.stdout.expect(consumeThrough(contains("No tests ran.")));
+      test.shouldExit(0);
+    });
+
+    test("runs a browser test on a browser", () {
+      _writeTestFile("browser_test.dart", testTestOn: "browser");
+
+      var test = runTest(
+          ["--platform", "content-shell", "browser_test.dart"]);
+      test.stdout.expect(consumeThrough(contains("All tests passed!")));
+      test.shouldExit(0);
+    });
+
+    test("doesn't run a VM test on a browser", () {
+      _writeTestFile("vm_test.dart", testTestOn: "vm");
+
+      var test = runTest(["--platform", "content-shell", "vm_test.dart"]);
+      test.stdout.expect(consumeThrough(contains("No tests ran.")));
+      test.shouldExit(0);
+    });
+  });
+
+  group("with suite, group, and test selectors", () {
+    test("runs the test if all selectors match", () {
+      _writeTestFile("vm_test.dart", suiteTestOn: "!browser",
+          groupTestOn: "!js", testTestOn: "vm");
+
+      var test = runTest(["vm_test.dart"]);
+      test.stdout.expect(consumeThrough(contains("All tests passed!")));
+      test.shouldExit(0);
+    });
+
+    test("doesn't runs the test if the suite doesn't match", () {
+      _writeTestFile("vm_test.dart", suiteTestOn: "browser",
+          groupTestOn: "!js", testTestOn: "vm");
+
+      var test = runTest(["vm_test.dart"]);
+      test.stdout.expect(consumeThrough(contains("No tests ran.")));
+      test.shouldExit(0);
+    });
+
+    test("doesn't runs the test if the group doesn't match", () {
+      _writeTestFile("vm_test.dart", suiteTestOn: "!browser",
+          groupTestOn: "browser", testTestOn: "vm");
+
+      var test = runTest(["vm_test.dart"]);
+      test.stdout.expect(consumeThrough(contains("No tests ran.")));
+      test.shouldExit(0);
+    });
+
+    test("doesn't runs the test if the test doesn't match", () {
+      _writeTestFile("vm_test.dart", suiteTestOn: "!browser",
+          groupTestOn: "!js", testTestOn: "browser");
+
+      var test = runTest(["vm_test.dart"]);
+      test.stdout.expect(consumeThrough(contains("No tests ran.")));
+      test.shouldExit(0);
+    });
+  });
+}
+
+/// Writes a test file with some platform selectors to [filename].
+///
+/// Each of [suiteTestOn], [groupTestOn], and [testTestOn] is a platform
+/// selector that's suite-, group-, and test-level respectively. If [loadable]
+/// is `false`, the test file will be made unloadable on the Dart VM.
+void _writeTestFile(String filename, {String suiteTestOn, String groupTestOn,
+    String testTestOn, bool loadable: true}) {
+  var buffer = new StringBuffer();
+  if (suiteTestOn != null) buffer.writeln("@TestOn('$suiteTestOn')");
+  if (!loadable) buffer.writeln("import 'dart:html';");
+
+  buffer
+      ..writeln("import 'package:test/test.dart';")
+      ..writeln("void main() {")
+      ..writeln("  group('group', () {");
+
+  if (testTestOn != null) {
+    buffer.writeln("    test('test', () {}, testOn: '$testTestOn');");
+  } else {
+    buffer.writeln("    test('test', () {});");
+  }
+
+  if (groupTestOn != null) {
+    buffer.writeln("  }, testOn: '$groupTestOn');");
+  } else {
+    buffer.writeln("  });");
+  }
+
+  buffer.writeln("}");
+
+  d.file(filename, buffer.toString()).create();
+}
diff --git a/mojo/public/dart/third_party/test/test/util/cancelable_future_test.dart b/mojo/public/dart/third_party/test/test/util/cancelable_future_test.dart
new file mode 100644
index 0000000..9bed0ba
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/util/cancelable_future_test.dart
@@ -0,0 +1,255 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:async/async.dart';
+import 'package:test/src/util/cancelable_future.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group("without being canceled", () {
+    var completer;
+    setUp(() {
+      completer = new CancelableCompleter(expectAsync(() {}, count: 0));
+    });
+
+    test("sends values to the future", () {
+      expect(completer.future, completion(equals(1)));
+      expect(completer.isCompleted, isFalse);
+      completer.complete(1);
+      expect(completer.isCompleted, isTrue);
+    });
+
+    test("sends errors to the future", () {
+      expect(completer.future, throwsA("error"));
+      expect(completer.isCompleted, isFalse);
+      completer.completeError("error");
+      expect(completer.isCompleted, isTrue);
+    });
+
+    test("sends values in a future to the future", () {
+      expect(completer.future, completion(equals(1)));
+      expect(completer.isCompleted, isFalse);
+      completer.complete(new Future.value(1));
+      expect(completer.isCompleted, isTrue);
+    });
+
+    test("sends errors in a future to the future", () {
+      expect(completer.future, throwsA("error"));
+      expect(completer.isCompleted, isFalse);
+      completer.complete(new Future.error("error"));
+      expect(completer.isCompleted, isTrue);
+    });
+
+    group("throws a StateError if completed", () {
+      test("successfully twice", () {
+        completer.complete(1);
+        expect(() => completer.complete(1), throwsStateError);
+      });
+
+      test("successfully then unsuccessfully", () {
+        completer.complete(1);
+        expect(() => completer.completeError("error"), throwsStateError);
+      });
+
+      test("unsuccessfully twice", () {
+        expect(completer.future, throwsA("error"));
+        completer.completeError("error");
+        expect(() => completer.completeError("error"), throwsStateError);
+      });
+
+      test("successfully then with a future", () {
+        completer.complete(1);
+        expect(() => completer.complete(new Completer().future),
+            throwsStateError);
+      });
+
+      test("with a future then successfully", () {
+        completer.complete(new Completer().future);
+        expect(() => completer.complete(1), throwsStateError);
+      });
+
+      test("with a future twice", () {
+        completer.complete(new Completer().future);
+        expect(() => completer.complete(new Completer().future),
+            throwsStateError);
+      });
+    });
+
+    group("CancelableFuture.fromFuture", () {
+      test("forwards values", () {
+        expect(new CancelableFuture.fromFuture(new Future.value(1)),
+            completion(equals(1)));
+      });
+
+      test("forwards errors", () {
+        expect(new CancelableFuture.fromFuture(new Future.error("error")),
+            throwsA("error"));
+      });
+    });
+  });
+
+  group("when canceled", () {
+    test("causes the future never to fire", () async {
+      var completer = new CancelableCompleter();
+      completer.future.whenComplete(expectAsync(() {}, count: 0));
+      completer.future.cancel();
+
+      // Give the future plenty of time to fire if it's going to.
+      await flushMicrotasks();
+      completer.complete();
+      await flushMicrotasks();
+    });
+
+    test("fires onCancel", () {
+      var canceled = false;
+      var completer;
+      completer = new CancelableCompleter(expectAsync(() {
+        expect(completer.isCanceled, isTrue);
+        canceled = true;
+      }));
+
+      expect(canceled, isFalse);
+      expect(completer.isCanceled, isFalse);
+      expect(completer.isCompleted, isFalse);
+      completer.future.cancel();
+      expect(canceled, isTrue);
+      expect(completer.isCanceled, isTrue);
+      expect(completer.isCompleted, isFalse);
+    });
+
+    test("returns the onCancel future each time cancel is called", () {
+      var completer = new CancelableCompleter(expectAsync(() {
+        return new Future.value(1);
+      }));
+      expect(completer.future.cancel(), completion(equals(1)));
+      expect(completer.future.cancel(), completion(equals(1)));
+      expect(completer.future.cancel(), completion(equals(1)));
+    });
+
+    test("returns a future even if onCancel doesn't", () {
+      var completer = new CancelableCompleter(expectAsync(() {}));
+      expect(completer.future.cancel(), completes);
+    });
+
+    test("doesn't call onCancel if the completer has completed", () {
+      var completer = new CancelableCompleter(expectAsync(() {}, count: 0));
+      completer.complete(1);
+      completer.future.whenComplete(expectAsync(() {}, count: 0));
+      expect(completer.future.cancel(), completes);
+    });
+
+    test("does call onCancel if the completer has completed to an unfired "
+        "Future", () {
+      var completer = new CancelableCompleter(expectAsync(() {}));
+      completer.complete(new Completer().future);
+      expect(completer.future.cancel(), completes);
+    });
+
+    test("doesn't call onCancel if the completer has completed to a fired "
+        "Future", () async {
+      var completer = new CancelableCompleter(expectAsync(() {}, count: 0));
+      completer.complete(new Future.value(1));
+      await completer.future;
+      expect(completer.future.cancel(), completes);
+    });
+
+    test("can be completed once after being canceled", () async {
+      var completer = new CancelableCompleter();
+      completer.future.whenComplete(expectAsync(() {}, count: 0));
+      await completer.future.cancel();
+      completer.complete(1);
+      expect(() => completer.complete(1), throwsStateError);
+    });
+
+    test("throws a CancelException along non-canceled branches", () {
+      var completer = new CancelableCompleter();
+      expect(completer.future.then((_) {}), throwsCancelException);
+      completer.future.then((_) {}).cancel();
+    });
+
+    test("doesn't throw a CancelException further along the canceled chain",
+        () async {
+      var completer = new CancelableCompleter();
+      completer.future.then((_) {}).whenComplete(expectAsync((_) {}, count: 0));
+      completer.future.cancel();
+      await flushMicrotasks();
+    });
+  });
+
+  group("asStream()", () {
+    test("emits a value and then closes", () {
+      var completer = new CancelableCompleter();
+      expect(completer.future.asStream().toList(), completion(equals([1])));
+      completer.complete(1);
+    });
+
+    test("emits an error and then closes", () {
+      var completer = new CancelableCompleter();
+      var queue = new StreamQueue(completer.future.asStream());
+      expect(queue.next, throwsA("error"));
+      expect(queue.hasNext, completion(isFalse));
+      completer.completeError("error");
+    });
+
+    test("cancels the completer when the subscription is canceled", () {
+      var completer = new CancelableCompleter(expectAsync(() {}));
+      var sub = completer.future.asStream()
+          .listen(expectAsync((_) {}, count: 0));
+      expect(completer.future, throwsCancelException);
+      sub.cancel();
+      expect(completer.isCanceled, isTrue);
+    });
+  });
+
+  group("timeout()", () {
+    test("emits a value if one arrives before timeout", () {
+      var completer = new CancelableCompleter();
+      expect(
+          completer.future.timeout(
+              new Duration(hours: 1),
+              onTimeout: expectAsync(() {}, count: 0)),
+          completion(equals(1)));
+      completer.complete(1);
+    });
+
+    test("emits an error if one arrives before timeout", () {
+      var completer = new CancelableCompleter();
+      expect(
+          completer.future.timeout(
+              new Duration(hours: 1),
+              onTimeout: expectAsync(() {}, count: 0)),
+          throwsA("error"));
+      completer.completeError("error");
+    });
+
+    test("cancels the completer when the future times out", () async {
+      var completer = new CancelableCompleter(expectAsync(() {}));
+      expect(completer.future.timeout(Duration.ZERO),
+          throwsA(new isInstanceOf<TimeoutException>()));
+      expect(completer.future, throwsCancelException);
+      await flushMicrotasks();
+      expect(completer.isCanceled, isTrue);
+    });
+
+    test("runs the user's onTimeout function when the future times out",
+        () async {
+      var completer = new CancelableCompleter(expectAsync(() {}));
+      expect(
+          completer.future.timeout(
+              Duration.ZERO,
+              onTimeout: expectAsync(() => 1)),
+          completion(equals(1)));
+      expect(completer.future, throwsCancelException);
+      await flushMicrotasks();
+      expect(completer.isCanceled, isTrue);
+    });
+  });
+}
+
+const Matcher throwsCancelException =
+    const Throws(const isInstanceOf<CancelException>());
+
+Future flushMicrotasks() => new Future.delayed(Duration.ZERO);
diff --git a/mojo/public/dart/third_party/test/test/util/forkable_stream_test.dart b/mojo/public/dart/third_party/test/test/util/forkable_stream_test.dart
new file mode 100644
index 0000000..c08df9d
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/util/forkable_stream_test.dart
@@ -0,0 +1,417 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// TODO(nweiz): Get rid of this when https://codereview.chromium.org/1241723003/
+// lands.
+
+import 'dart:async';
+
+import 'package:test/test.dart';
+import 'package:test/src/util/forkable_stream.dart';
+import 'package:test/src/util/stream_queue.dart';
+
+void main() {
+  var controller;
+  var stream;
+  setUp(() {
+    var cancelFuture = new Future.value(42);
+    controller = new StreamController<int>(onCancel: () => cancelFuture);
+    stream = new ForkableStream<int>(controller.stream);
+  });
+
+  group("with no forks", () {
+    test("forwards events, errors, and close", () async {
+      var queue = new StreamQueue(stream);
+
+      controller.add(1);
+      expect(await queue.next, equals(1));
+
+      controller.add(2);
+      expect(await queue.next, equals(2));
+
+      controller.addError("error");
+      expect(queue.next, throwsA("error"));
+      await flushMicrotasks();
+
+      controller.add(3);
+      expect(await queue.next, equals(3));
+
+      controller.close();
+      expect(await queue.hasNext, isFalse);
+    });
+
+    test("listens to, pauses, and cancels the controller", () {
+      expect(controller.hasListener, isFalse);
+
+      var sub = stream.listen(null);
+      expect(controller.hasListener, isTrue);
+
+      sub.pause();
+      expect(controller.isPaused, isTrue);
+
+      sub.resume();
+      expect(controller.isPaused, isFalse);
+
+      sub.cancel();
+      expect(controller.hasListener, isFalse);
+    });
+
+    test("unpauses the controller when a fork is listened", () {
+      stream.listen(null).pause();
+      expect(controller.isPaused, isTrue);
+
+      var fork = stream.fork();
+      expect(controller.isPaused, isTrue);
+
+      fork.listen(null);
+      expect(controller.isPaused, isFalse);
+    });
+  });
+
+  group("with a fork created before the stream was listened", () {
+    var fork;
+    setUp(() {
+      fork = stream.fork();
+    });
+
+    test("forwards events, errors, and close to both branches", () async {
+      var queue = new StreamQueue(stream);
+      var forkQueue = new StreamQueue(fork);
+
+      controller.add(1);
+      expect(await queue.next, equals(1));
+      expect(await forkQueue.next, equals(1));
+
+      controller.add(2);
+      expect(await queue.next, equals(2));
+      expect(await forkQueue.next, equals(2));
+
+      controller.addError("error");
+      expect(queue.next, throwsA("error"));
+      expect(forkQueue.next, throwsA("error"));
+      await flushMicrotasks();
+
+      controller.add(3);
+      expect(await queue.next, equals(3));
+      expect(await forkQueue.next, equals(3));
+
+      controller.close();
+      expect(await queue.hasNext, isFalse);
+      expect(await forkQueue.hasNext, isFalse);
+    });
+
+    test('listens to the source when the original is listened', () {
+      expect(controller.hasListener, isFalse);
+      stream.listen(null);
+      expect(controller.hasListener, isTrue);
+    });
+
+    test('listens to the source when the fork is listened', () {
+      expect(controller.hasListener, isFalse);
+      fork.listen(null);
+      expect(controller.hasListener, isTrue);
+    });
+  });
+
+  test("with a fork created after the stream emitted a few events, forwards "
+      "future events, errors, and close to both branches", () async {
+    var queue = new StreamQueue(stream);
+
+    controller.add(1);
+    expect(await queue.next, equals(1));
+
+    controller.add(2);
+    expect(await queue.next, equals(2));
+
+    var fork = stream.fork();
+    var forkQueue = new StreamQueue(fork);
+
+    controller.add(3);
+    expect(await queue.next, equals(3));
+    expect(await forkQueue.next, equals(3));
+
+    controller.addError("error");
+    expect(queue.next, throwsA("error"));
+    expect(forkQueue.next, throwsA("error"));
+    await flushMicrotasks();
+
+    controller.close();
+    expect(await queue.hasNext, isFalse);
+    expect(await forkQueue.hasNext, isFalse);
+  });
+
+  group("with multiple forks", () {
+    var fork1;
+    var fork2;
+    var fork3;
+    var fork4;
+    setUp(() {
+      fork1 = stream.fork();
+      fork2 = stream.fork();
+      fork3 = stream.fork();
+      fork4 = stream.fork();
+    });
+
+    test("forwards events, errors, and close to all branches", () async {
+      var queue1 = new StreamQueue(stream);
+      var queue2 = new StreamQueue(fork1);
+      var queue3 = new StreamQueue(fork2);
+      var queue4 = new StreamQueue(fork3);
+      var queue5 = new StreamQueue(fork4);
+
+      controller.add(1);
+      expect(await queue1.next, equals(1));
+      expect(await queue2.next, equals(1));
+      expect(await queue3.next, equals(1));
+      expect(await queue4.next, equals(1));
+      expect(await queue5.next, equals(1));
+
+      controller.add(2);
+      expect(await queue1.next, equals(2));
+      expect(await queue2.next, equals(2));
+      expect(await queue3.next, equals(2));
+      expect(await queue4.next, equals(2));
+      expect(await queue5.next, equals(2));
+
+      controller.addError("error");
+      expect(queue1.next, throwsA("error"));
+      expect(queue2.next, throwsA("error"));
+      expect(queue3.next, throwsA("error"));
+      expect(queue4.next, throwsA("error"));
+      expect(queue5.next, throwsA("error"));
+      await flushMicrotasks();
+
+      controller.add(3);
+      expect(await queue1.next, equals(3));
+      expect(await queue2.next, equals(3));
+      expect(await queue3.next, equals(3));
+      expect(await queue4.next, equals(3));
+      expect(await queue5.next, equals(3));
+
+      controller.close();
+      expect(await queue1.hasNext, isFalse);
+      expect(await queue2.hasNext, isFalse);
+      expect(await queue3.hasNext, isFalse);
+      expect(await queue4.hasNext, isFalse);
+      expect(await queue5.hasNext, isFalse);
+    });
+
+    test("forwards events in order of forking", () async {
+      var queue1 = new StreamQueue(stream);
+      var queue2 = new StreamQueue(fork1);
+      var queue3 = new StreamQueue(fork2);
+      var queue4 = new StreamQueue(fork3);
+      var queue5 = new StreamQueue(fork4);
+
+      for (var i = 0; i < 4; i++) {
+        controller.add(i);
+
+        var queue1Fired = false;
+        var queue2Fired = false;
+        var queue3Fired = false;
+        var queue4Fired = false;
+        var queue5Fired = false;
+
+        queue5.next.then(expectAsync((_) {
+          queue5Fired = true;
+          expect(queue1Fired, isTrue);
+          expect(queue2Fired, isTrue);
+          expect(queue3Fired, isTrue);
+          expect(queue4Fired, isTrue);
+        }));
+
+        queue1.next.then(expectAsync((_) {
+          queue1Fired = true;
+          expect(queue2Fired, isFalse);
+          expect(queue3Fired, isFalse);
+          expect(queue4Fired, isFalse);
+          expect(queue5Fired, isFalse);
+        }));
+
+        queue4.next.then(expectAsync((_) {
+          queue4Fired = true;
+          expect(queue1Fired, isTrue);
+          expect(queue2Fired, isTrue);
+          expect(queue3Fired, isTrue);
+          expect(queue5Fired, isFalse);
+        }));
+
+        queue2.next.then(expectAsync((_) {
+          queue2Fired = true;
+          expect(queue1Fired, isTrue);
+          expect(queue3Fired, isFalse);
+          expect(queue4Fired, isFalse);
+          expect(queue5Fired, isFalse);
+        }));
+
+        queue3.next.then(expectAsync((_) {
+          queue3Fired = true;
+          expect(queue1Fired, isTrue);
+          expect(queue2Fired, isTrue);
+          expect(queue4Fired, isFalse);
+          expect(queue5Fired, isFalse);
+        }));
+      }
+    });
+
+    test("pauses the source when all forks are paused and/or not listening",
+        () {
+      var sub1 = stream.listen(null);
+      var sub2 = fork1.listen(null);
+      expect(controller.isPaused, isFalse);
+
+      sub1.pause();
+      expect(controller.isPaused, isFalse);
+
+      sub2.pause();
+      expect(controller.isPaused, isTrue);
+
+      var sub3 = fork2.listen(null);
+      expect(controller.isPaused, isFalse);
+
+      sub3.pause();
+      expect(controller.isPaused, isTrue);
+
+      sub2.resume();
+      expect(controller.isPaused, isFalse);
+
+      sub2.cancel();
+      expect(controller.isPaused, isTrue);
+    });
+
+    test("cancels the source when all forks are canceled", () async {
+      var sub1 = stream.listen(null);
+      expect(controller.hasListener, isTrue);
+
+      var sub2 = fork1.listen(null);
+      expect(controller.hasListener, isTrue);
+
+      expect(sub1.cancel(), isNull);
+      await flushMicrotasks();
+      expect(controller.hasListener, isTrue);
+
+      expect(sub2.cancel(), isNull);
+      await flushMicrotasks();
+      expect(controller.hasListener, isTrue);
+
+      expect(fork2.listen(null).cancel(), isNull);
+      await flushMicrotasks();
+      expect(controller.hasListener, isTrue);
+
+      expect(fork3.listen(null).cancel(), isNull);
+      await flushMicrotasks();
+      expect(controller.hasListener, isTrue);
+
+      expect(fork4.listen(null).cancel(), completion(equals(42)));
+      await flushMicrotasks();
+      expect(controller.hasListener, isFalse);
+    });
+  });
+
+  group("modification during dispatch:", () {
+    test("forking during onCancel", () {
+      controller = new StreamController<int>(onCancel: expectAsync(() {
+        expect(stream.fork().toList(), completion(isEmpty));
+      }));
+      stream = new ForkableStream<int>(controller.stream);
+
+      stream.listen(null).cancel();
+    });
+
+    test("forking during onPause", () {
+      controller = new StreamController<int>(onPause: expectAsync(() {
+        stream.fork().listen(null);
+      }));
+      stream = new ForkableStream<int>(controller.stream);
+
+      stream.listen(null).pause();
+
+      // The fork created in onPause should have resumed the stream.
+      expect(controller.isPaused, isFalse);
+    });
+
+    test("forking during onData", () {
+      var sub;
+      sub = stream.listen(expectAsync((value1) {
+        expect(value1, equals(1));
+        stream.fork().listen(expectAsync((value2) {
+          expect(value2, equals(2));
+        }));
+        sub.cancel();
+      }));
+
+      controller.add(1);
+      controller.add(2);
+    });
+
+    test("canceling a fork during onData", () {
+      var fork = stream.fork();
+      var forkSub = fork.listen(expectAsync((_) {}, count: 0));
+
+      stream.listen(expectAsync((_) => forkSub.cancel()));
+      controller.add(null);
+    });
+
+    test("forking during onError", () {
+      var sub;
+      sub = stream.listen(null, onError: expectAsync((error1) {
+        expect(error1, equals("error 1"));
+        stream.fork().listen(null, onError: expectAsync((error2) {
+          expect(error2, equals("error 2"));
+        }));
+        sub.cancel();
+      }));
+
+      controller.addError("error 1");
+      controller.addError("error 2");
+    });
+
+    test("canceling a fork during onError", () {
+      var fork = stream.fork();
+      var forkSub = fork.listen(expectAsync((_) {}, count: 0));
+
+      stream.listen(null, onError: expectAsync((_) => forkSub.cancel()));
+      controller.addError("error");
+    });
+
+    test("forking during onDone", () {
+      stream.listen(null, onDone: expectAsync(() {
+        expect(stream.fork().toList(), completion(isEmpty));
+      }));
+
+      controller.close();
+    });
+
+    test("canceling a fork during onDone", () {
+      var fork = stream.fork();
+      var forkSub = fork.listen(null, onDone: expectAsync(() {}, count: 0));
+
+      stream.listen(null, onDone: expectAsync(() => forkSub.cancel()));
+      controller.close();
+    });
+  });
+
+  group("throws an error when", () {
+    test("a cancelled stream is forked", () {
+      stream.listen(null).cancel();
+      expect(stream.fork().toList(), completion(isEmpty));
+    });
+
+    test("a cancelled stream is forked even when other forks are alive", () {
+      stream.fork().listen(null);
+      stream.listen(null).cancel();
+
+      expect(controller.hasListener, isTrue);
+      expect(stream.fork().toList(), completion(isEmpty));
+    });
+
+    test("a closed stream is forked", () async {
+      controller.close();
+      await stream.listen(null).asFuture();
+      expect(stream.fork().toList(), completion(isEmpty));
+    });
+  });
+}
+
+Future flushMicrotasks() => new Future.delayed(Duration.ZERO);
diff --git a/mojo/public/dart/third_party/test/test/util/multi_channel_test.dart b/mojo/public/dart/third_party/test/test/util/multi_channel_test.dart
new file mode 100644
index 0000000..164030e
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/util/multi_channel_test.dart
@@ -0,0 +1,310 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:test/src/util/multi_channel.dart';
+import 'package:test/test.dart';
+
+import '../utils.dart';
+
+void main() {
+  var oneToTwo;
+  var twoToOne;
+  var channel1;
+  var channel2;
+  setUp(() {
+    oneToTwo = new StreamController();
+    twoToOne = new StreamController();
+    channel1 = new MultiChannel(twoToOne.stream, oneToTwo.sink);
+    channel2 = new MultiChannel(oneToTwo.stream, twoToOne.sink);
+  });
+
+  group("the default virtual channel", () {
+    test("begins connected", () {
+      var first = true;
+      channel2.stream.listen(expectAsync((message) {
+        if (first) {
+          expect(message, equals("hello"));
+          first = false;
+        } else {
+          expect(message, equals("world"));
+        }
+      }, count: 2));
+
+      channel1.sink.add("hello");
+      channel1.sink.add("world");
+    });
+
+    test("closes the remote virtual channel when it closes", () {
+      expect(channel2.stream.toList(), completion(isEmpty));
+      expect(channel2.sink.done, completes);
+
+      channel1.sink.close();
+    });
+
+    test("closes the local virtual channel when it closes", () {
+      expect(channel1.stream.toList(), completion(isEmpty));
+      expect(channel1.sink.done, completes);
+
+      channel1.sink.close();
+    });
+
+    test("doesn't closes the local virtual channel when the stream "
+        "subscription is canceled", () {
+      channel1.sink.done.then(expectAsync((_) {}, count: 0));
+
+      channel1.stream.listen((_) {}).cancel();
+
+      // Ensure that there's enough time for the channel to close if it's going
+      // to.
+      return pumpEventQueue();
+    });
+
+    test("closes the underlying channel when it closes without any other "
+        "virtual channels", () {
+      expect(oneToTwo.done, completes);
+      expect(twoToOne.done, completes);
+
+      channel1.sink.close();
+    });
+
+    test("doesn't close the underlying channel when it closes with other "
+        "virtual channels", () {
+      oneToTwo.done.then(expectAsync((_) {}, count: 0));
+      twoToOne.done.then(expectAsync((_) {}, count: 0));
+
+      // Establish another virtual connection which should keep the underlying
+      // connection open.
+      channel2.virtualChannel(channel1.virtualChannel().id);
+      channel1.sink.close();
+
+      // Ensure that there's enough time for the underlying channel to complete
+      // if it's going to.
+      return pumpEventQueue();
+    });
+  });
+
+  group("a locally-created virtual channel", () {
+    var virtual1;
+    var virtual2;
+    setUp(() {
+      virtual1 = channel1.virtualChannel();
+      virtual2 = channel2.virtualChannel(virtual1.id);
+    });
+
+    test("sends messages only to the other virtual channel", () {
+      var first = true;
+      virtual2.stream.listen(expectAsync((message) {
+        if (first) {
+          expect(message, equals("hello"));
+          first = false;
+        } else {
+          expect(message, equals("world"));
+        }
+      }, count: 2));
+
+      // No other virtual channels should receive the message.
+      for (var i = 0; i < 10; i++) {
+        var virtual = channel2.virtualChannel(channel1.virtualChannel().id);
+        virtual.stream.listen(expectAsync((_) {}, count: 0));
+      }
+      channel2.stream.listen(expectAsync((_) {}, count: 0));
+
+      virtual1.sink.add("hello");
+      virtual1.sink.add("world");
+    });
+
+    test("closes the remote virtual channel when it closes", () {
+      expect(virtual2.stream.toList(), completion(isEmpty));
+      expect(virtual2.sink.done, completes);
+
+      virtual1.sink.close();
+    });
+
+    test("closes the local virtual channel when it closes", () {
+      expect(virtual1.stream.toList(), completion(isEmpty));
+      expect(virtual1.sink.done, completes);
+
+      virtual1.sink.close();
+    });
+
+    test("doesn't closes the local virtual channel when the stream "
+        "subscription is canceled", () {
+      virtual1.sink.done.then(expectAsync((_) {}, count: 0));
+      virtual1.stream.listen((_) {}).cancel();
+
+      // Ensure that there's enough time for the channel to close if it's going
+      // to.
+      return pumpEventQueue();
+    });
+
+    test("closes the underlying channel when it closes without any other "
+        "virtual channels", () async {
+      // First close the default channel so we can test the new channel as the
+      // last living virtual channel.
+      channel1.sink.close();
+
+      await channel2.stream.toList();
+      expect(oneToTwo.done, completes);
+      expect(twoToOne.done, completes);
+
+      virtual1.sink.close();
+    });
+
+    test("doesn't close the underlying channel when it closes with other "
+        "virtual channels", () {
+      oneToTwo.done.then(expectAsync((_) {}, count: 0));
+      twoToOne.done.then(expectAsync((_) {}, count: 0));
+
+      virtual1.sink.close();
+
+      // Ensure that there's enough time for the underlying channel to complete
+      // if it's going to.
+      return pumpEventQueue();
+    });
+
+    test("doesn't conflict with a remote virtual channel", () {
+      var virtual3 = channel2.virtualChannel();
+      var virtual4 = channel1.virtualChannel(virtual3.id);
+
+      // This is an implementation detail, but we assert it here to make sure
+      // we're properly testing two channels with the same id.
+      expect(virtual1.id, equals(virtual3.id));
+
+      virtual2.stream.listen(
+          expectAsync((message) => expect(message, equals("hello"))));
+      virtual4.stream.listen(
+          expectAsync((message) => expect(message, equals("goodbye"))));
+
+      virtual1.sink.add("hello");
+      virtual3.sink.add("goodbye");
+    });
+  });
+
+  group("a remotely-created virtual channel", () {
+    var virtual1;
+    var virtual2;
+    setUp(() {
+      virtual1 = channel1.virtualChannel();
+      virtual2 = channel2.virtualChannel(virtual1.id);
+    });
+
+    test("sends messages only to the other virtual channel", () {
+      var first = true;
+      virtual1.stream.listen(expectAsync((message) {
+        if (first) {
+          expect(message, equals("hello"));
+          first = false;
+        } else {
+          expect(message, equals("world"));
+        }
+      }, count: 2));
+
+      // No other virtual channels should receive the message.
+      for (var i = 0; i < 10; i++) {
+        var virtual = channel2.virtualChannel(channel1.virtualChannel().id);
+        virtual.stream.listen(expectAsync((_) {}, count: 0));
+      }
+      channel1.stream.listen(expectAsync((_) {}, count: 0));
+
+      virtual2.sink.add("hello");
+      virtual2.sink.add("world");
+    });
+
+    test("closes the remote virtual channel when it closes", () {
+      expect(virtual1.stream.toList(), completion(isEmpty));
+      expect(virtual1.sink.done, completes);
+
+      virtual2.sink.close();
+    });
+
+    test("closes the local virtual channel when it closes", () {
+      expect(virtual2.stream.toList(), completion(isEmpty));
+      expect(virtual2.sink.done, completes);
+
+      virtual2.sink.close();
+    });
+
+    test("doesn't closes the local virtual channel when the stream "
+        "subscription is canceled", () {
+      virtual2.sink.done.then(expectAsync((_) {}, count: 0));
+      virtual2.stream.listen((_) {}).cancel();
+
+      // Ensure that there's enough time for the channel to close if it's going
+      // to.
+      return pumpEventQueue();
+    });
+
+    test("closes the underlying channel when it closes without any other "
+        "virtual channels", () async {
+      // First close the default channel so we can test the new channel as the
+      // last living virtual channel.
+      channel2.sink.close();
+
+      await channel1.stream.toList();
+      expect(oneToTwo.done, completes);
+      expect(twoToOne.done, completes);
+
+      virtual2.sink.close();
+    });
+
+    test("doesn't close the underlying channel when it closes with other "
+        "virtual channels", () {
+      oneToTwo.done.then(expectAsync((_) {}, count: 0));
+      twoToOne.done.then(expectAsync((_) {}, count: 0));
+
+      virtual2.sink.close();
+
+      // Ensure that there's enough time for the underlying channel to complete
+      // if it's going to.
+      return pumpEventQueue();
+    });
+
+    test("doesn't allow another virtual channel with the same id", () {
+      expect(() => channel2.virtualChannel(virtual1.id),
+          throwsArgumentError);
+    });
+  });
+
+  group("when the underlying stream", () {
+    var virtual1;
+    var virtual2;
+    setUp(() {
+      virtual1 = channel1.virtualChannel();
+      virtual2 = channel2.virtualChannel(virtual1.id);
+    });
+
+    test("closes, all virtual channels close", () {
+      expect(channel1.stream.toList(), completion(isEmpty));
+      expect(channel1.sink.done, completes);
+      expect(channel2.stream.toList(), completion(isEmpty));
+      expect(channel2.sink.done, completes);
+      expect(virtual1.stream.toList(), completion(isEmpty));
+      expect(virtual1.sink.done, completes);
+      expect(virtual2.stream.toList(), completion(isEmpty));
+      expect(virtual2.sink.done, completes);
+
+      oneToTwo.close();
+    });
+
+    test("closes, no more virtual channels may be created", () {
+      expect(channel1.sink.done.then((_) => channel1.virtualChannel()),
+          throwsStateError);
+      expect(channel2.sink.done.then((_) => channel2.virtualChannel()),
+          throwsStateError);
+
+      oneToTwo.close();
+    });
+
+    test("emits an error, the error is sent only to the default channel", () {
+      channel1.stream.listen(expectAsync((_) {}, count: 0),
+          onError: expectAsync((error) => expect(error, equals("oh no"))));
+      virtual1.stream.listen(expectAsync((_) {}, count: 0),
+          onError: expectAsync((_) {}, count: 0));
+
+      twoToOne.addError("oh no");
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/util/one_off_handler_test.dart b/mojo/public/dart/third_party/test/test/util/one_off_handler_test.dart
new file mode 100644
index 0000000..44c2e4c
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/util/one_off_handler_test.dart
@@ -0,0 +1,74 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:test/src/util/one_off_handler.dart';
+import 'package:test/test.dart';
+
+void main() {
+  var handler;
+  setUp(() => handler = new OneOffHandler());
+
+  _handle(request) => new Future.sync(() => handler.handler(request));
+
+  test("returns a 404 for a root URL", () async {
+    var request = new shelf.Request("GET", Uri.parse("http://localhost/"));
+    expect((await _handle(request)).statusCode, equals(404));
+  });
+
+  test("returns a 404 for an unhandled URL", () async {
+    var request = new shelf.Request("GET", Uri.parse("http://localhost/1"));
+    expect((await _handle(request)).statusCode, equals(404));
+  });
+
+  test("passes a request to a handler only once", () async {
+    var path = handler.create(expectAsync((request) {
+      expect(request.method, equals("GET"));
+      return new shelf.Response.ok("good job!");
+    }));
+
+    var request = new shelf.Request("GET", Uri.parse("http://localhost/$path"));
+    var response = await _handle(request);
+    expect(response.statusCode, equals(200));
+    expect(response.readAsString(), completion(equals("good job!")));
+
+    request = new shelf.Request("GET", Uri.parse("http://localhost/$path"));
+    expect((await _handle(request)).statusCode, equals(404));
+  });
+
+  test("passes requests to the correct handlers", () async {
+    var path1 = handler.create(expectAsync((request) {
+      expect(request.method, equals("GET"));
+      return new shelf.Response.ok("one");
+    }));
+
+    var path2 = handler.create(expectAsync((request) {
+      expect(request.method, equals("GET"));
+      return new shelf.Response.ok("two");
+    }));
+
+    var path3 = handler.create(expectAsync((request) {
+      expect(request.method, equals("GET"));
+      return new shelf.Response.ok("three");
+    }));
+
+    var request = new shelf.Request(
+        "GET", Uri.parse("http://localhost/$path2"));
+    var response = await _handle(request);
+    expect(response.statusCode, equals(200));
+    expect(response.readAsString(), completion(equals("two")));
+
+    request = new shelf.Request("GET", Uri.parse("http://localhost/$path1"));
+    response = await _handle(request);
+    expect(response.statusCode, equals(200));
+    expect(response.readAsString(), completion(equals("one")));
+
+    request = new shelf.Request("GET", Uri.parse("http://localhost/$path3"));
+    response = await _handle(request);
+    expect(response.statusCode, equals(200));
+    expect(response.readAsString(), completion(equals("three")));
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/util/path_handler_test.dart b/mojo/public/dart/third_party/test/test/util/path_handler_test.dart
new file mode 100644
index 0000000..4ac0835
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/util/path_handler_test.dart
@@ -0,0 +1,70 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:test/src/util/path_handler.dart';
+import 'package:test/test.dart';
+
+void main() {
+  var handler;
+  setUp(() => handler = new PathHandler());
+
+  _handle(request) => new Future.sync(() => handler.handler(request));
+
+  test("returns a 404 for a root URL", () async {
+    var request = new shelf.Request("GET", Uri.parse("http://localhost/"));
+    expect((await _handle(request)).statusCode, equals(404));
+  });
+
+  test("returns a 404 for an unregistered URL", () async {
+    var request = new shelf.Request("GET", Uri.parse("http://localhost/foo"));
+    expect((await _handle(request)).statusCode, equals(404));
+  });
+
+  test("runs a handler for an exact URL", () async {
+    var request = new shelf.Request("GET", Uri.parse("http://localhost/foo"));
+    handler.add("foo", expectAsync((request) {
+      expect(request.handlerPath, equals('/foo'));
+      expect(request.url.path, isEmpty);
+      return new shelf.Response.ok("good job!");
+    }));
+
+    var response = await _handle(request);
+    expect(response.statusCode, equals(200));
+    expect(response.readAsString(), completion(equals("good job!")));
+  });
+
+  test("runs a handler for a suffix", () async {
+    var request = new shelf.Request(
+        "GET", Uri.parse("http://localhost/foo/bar"));
+    handler.add("foo", expectAsync((request) {
+      expect(request.handlerPath, equals('/foo/'));
+      expect(request.url.path, 'bar');
+      return new shelf.Response.ok("good job!");
+    }));
+
+    var response = await _handle(request);
+    expect(response.statusCode, equals(200));
+    expect(response.readAsString(), completion(equals("good job!")));
+  });
+
+  test("runs the longest matching handler", () async {
+    var request = new shelf.Request(
+        "GET", Uri.parse("http://localhost/foo/bar/baz"));
+
+    handler.add("foo", expectAsync((_) {}, count: 0));
+    handler.add("foo/bar", expectAsync((request) {
+      expect(request.handlerPath, equals('/foo/bar/'));
+      expect(request.url.path, 'baz');
+      return new shelf.Response.ok("good job!");
+    }));
+    handler.add("foo/bar/baz/bang", expectAsync((_) {}, count: 0));
+
+    var response = await _handle(request);
+    expect(response.statusCode, equals(200));
+    expect(response.readAsString(), completion(equals("good job!")));
+  });
+}
diff --git a/mojo/public/dart/third_party/test/test/util/stream_queue_test.dart b/mojo/public/dart/third_party/test/test/util/stream_queue_test.dart
new file mode 100644
index 0000000..7cc1557
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/util/stream_queue_test.dart
@@ -0,0 +1,1134 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE filevents.
+
+// TODO(nweiz): Get rid of this when https://codereview.chromium.org/1241723003/
+// lands.
+
+import "dart:async";
+
+import "package:test/src/util/stream_queue.dart";
+import "package:test/test.dart";
+
+main() {
+  group("source stream", () {
+    test("is listened to on first request, paused between requests", () async {
+      var controller = new StreamController();
+      var events = new StreamQueue<int>(controller.stream);
+      await flushMicrotasks();
+      expect(controller.hasListener, isFalse);
+
+      var next = events.next;
+      expect(controller.hasListener, isTrue);
+      expect(controller.isPaused, isFalse);
+
+      controller.add(1);
+
+      expect(await next, 1);
+      expect(controller.hasListener, isTrue);
+      expect(controller.isPaused, isTrue);
+
+      next = events.next;
+      expect(controller.hasListener, isTrue);
+      expect(controller.isPaused, isFalse);
+
+      controller.add(2);
+
+      expect(await next, 2);
+      expect(controller.hasListener, isTrue);
+      expect(controller.isPaused, isTrue);
+
+      events.cancel();
+      expect(controller.hasListener, isFalse);
+    });
+  });
+
+  group("next operation", () {
+    test("simple sequence of requests", () async {
+      var events = new StreamQueue<int>(createStream());
+      for (int i = 1; i <= 4; i++) {
+        expect(await events.next, i);
+      }
+      expect(events.next, throwsStateError);
+    });
+
+    test("multiple requests at the same time", () async {
+      var events = new StreamQueue<int>(createStream());
+      var result = await Future.wait(
+          [events.next, events.next, events.next, events.next]);
+      expect(result, [1, 2, 3, 4]);
+      await events.cancel();
+    });
+
+    test("sequence of requests with error", () async {
+      var events = new StreamQueue<int>(createErrorStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(events.next, throwsA("To err is divine!"));
+      expect(await events.next, 4);
+      await events.cancel();
+    });
+  });
+
+  group("skip operation", () {
+    test("of two elements in the middle of sequence", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.skip(2), 0);
+      expect(await events.next, 4);
+      await events.cancel();
+    });
+
+    test("with negative/bad arguments throws", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(() => events.skip(-1), throwsArgumentError);
+      // A non-int throws either a type error or an argument error,
+      // depending on whether it's checked mode or not.
+      expect(await events.next, 1);  // Did not consume event.
+      expect(() => events.skip(-1), throwsArgumentError);
+      expect(await events.next, 2);  // Did not consume event.
+      await events.cancel();
+    });
+
+    test("of 0 elements works", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(events.skip(0), completion(0));
+      expect(events.next, completion(1));
+      expect(events.skip(0), completion(0));
+      expect(events.next, completion(2));
+      expect(events.skip(0), completion(0));
+      expect(events.next, completion(3));
+      expect(events.skip(0), completion(0));
+      expect(events.next, completion(4));
+      expect(events.skip(0), completion(0));
+      expect(events.skip(5), completion(5));
+      expect(events.next, throwsStateError);
+      await events.cancel();
+    });
+
+    test("of too many events ends at stream start", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.skip(6), 2);
+      await events.cancel();
+    });
+
+    test("of too many events after some events", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(await events.skip(6), 4);
+      await events.cancel();
+    });
+
+    test("of too many events ends at stream end", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(await events.next, 3);
+      expect(await events.next, 4);
+      expect(await events.skip(2), 2);
+      await events.cancel();
+    });
+
+    test("of events with error", () async {
+      var events = new StreamQueue<int>(createErrorStream());
+      expect(events.skip(4), throwsA("To err is divine!"));
+      expect(await events.next, 4);
+      await events.cancel();
+    });
+
+    test("of events with error, and skip again after", () async {
+      var events = new StreamQueue<int>(createErrorStream());
+      expect(events.skip(4), throwsA("To err is divine!"));
+      expect(events.skip(2), completion(1));
+      await events.cancel();
+    });
+    test("multiple skips at same time complete in order.", () async {
+      var events = new StreamQueue<int>(createStream());
+      var skip1 = events.skip(1);
+      var skip2 = events.skip(0);
+      var skip3 = events.skip(4);
+      var skip4 = events.skip(1);
+      var index = 0;
+      // Check that futures complete in order.
+      sequence(expectedValue, sequenceIndex) => (value) {
+        expect(value, expectedValue);
+        expect(index, sequenceIndex);
+        index++;
+      };
+      await Future.wait([skip1.then(sequence(0, 0)),
+                         skip2.then(sequence(0, 1)),
+                         skip3.then(sequence(1, 2)),
+                         skip4.then(sequence(1, 3))]);
+      await events.cancel();
+    });
+  });
+
+  group("take operation", () {
+    test("as simple take of events", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.take(2), [2, 3]);
+      expect(await events.next, 4);
+      await events.cancel();
+    });
+
+    test("of 0 events", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(events.take(0), completion([]));
+      expect(events.next, completion(1));
+      expect(events.take(0), completion([]));
+      expect(events.next, completion(2));
+      expect(events.take(0), completion([]));
+      expect(events.next, completion(3));
+      expect(events.take(0), completion([]));
+      expect(events.next, completion(4));
+      expect(events.take(0), completion([]));
+      expect(events.take(5), completion([]));
+      expect(events.next, throwsStateError);
+      await events.cancel();
+    });
+
+    test("with bad arguments throws", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(() => events.take(-1), throwsArgumentError);
+      expect(await events.next, 1);  // Did not consume event.
+      expect(() => events.take(-1), throwsArgumentError);
+      expect(await events.next, 2);  // Did not consume event.
+      await events.cancel();
+    });
+
+    test("of too many arguments", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.take(6), [1, 2, 3, 4]);
+      await events.cancel();
+    });
+
+    test("too large later", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(await events.take(6), [3, 4]);
+      await events.cancel();
+    });
+
+    test("error", () async {
+      var events = new StreamQueue<int>(createErrorStream());
+      expect(events.take(4), throwsA("To err is divine!"));
+      expect(await events.next, 4);
+      await events.cancel();
+    });
+  });
+
+  group("rest operation", () {
+    test("after single next", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.rest.toList(), [2, 3, 4]);
+    });
+
+    test("at start", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.rest.toList(), [1, 2, 3, 4]);
+    });
+
+    test("at end", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(await events.next, 3);
+      expect(await events.next, 4);
+      expect(await events.rest.toList(), isEmpty);
+    });
+
+    test("after end", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(await events.next, 3);
+      expect(await events.next, 4);
+      expect(events.next, throwsStateError);
+      expect(await events.rest.toList(), isEmpty);
+    });
+
+    test("after receiving done requested before", () async {
+      var events = new StreamQueue<int>(createStream());
+      var next1 = events.next;
+      var next2 = events.next;
+      var next3 = events.next;
+      var rest = events.rest;
+      for (int i = 0; i < 10; i++) {
+        await flushMicrotasks();
+      }
+      expect(await next1, 1);
+      expect(await next2, 2);
+      expect(await next3, 3);
+      expect(await rest.toList(), [4]);
+    });
+
+    test("with an error event error", () async {
+      var events = new StreamQueue<int>(createErrorStream());
+      expect(await events.next, 1);
+      var rest = events.rest;
+      var events2 = new StreamQueue(rest);
+      expect(await events2.next, 2);
+      expect(events2.next, throwsA("To err is divine!"));
+      expect(await events2.next, 4);
+    });
+
+    test("closes the events, prevents other operations", () async {
+      var events = new StreamQueue<int>(createStream());
+      var stream = events.rest;
+      expect(() => events.next, throwsStateError);
+      expect(() => events.skip(1), throwsStateError);
+      expect(() => events.take(1), throwsStateError);
+      expect(() => events.rest, throwsStateError);
+      expect(() => events.cancel(), throwsStateError);
+      expect(stream.toList(), completion([1, 2, 3, 4]));
+    });
+
+    test("forwards to underlying stream", () async {
+      var cancel = new Completer();
+      var controller = new StreamController(onCancel: () => cancel.future);
+      var events = new StreamQueue<int>(controller.stream);
+      expect(controller.hasListener, isFalse);
+      var next = events.next;
+      expect(controller.hasListener, isTrue);
+      expect(controller.isPaused, isFalse);
+
+      controller.add(1);
+      expect(await next, 1);
+      expect(controller.isPaused, isTrue);
+
+      var rest = events.rest;
+      var subscription = rest.listen(null);
+      expect(controller.hasListener, isTrue);
+      expect(controller.isPaused, isFalse);
+
+      var lastEvent;
+      subscription.onData((value) => lastEvent = value);
+
+      controller.add(2);
+
+      await flushMicrotasks();
+      expect(lastEvent, 2);
+      expect(controller.hasListener, isTrue);
+      expect(controller.isPaused, isFalse);
+
+      subscription.pause();
+      expect(controller.isPaused, isTrue);
+
+      controller.add(3);
+
+      await flushMicrotasks();
+      expect(lastEvent, 2);
+      subscription.resume();
+
+      await flushMicrotasks();
+      expect(lastEvent, 3);
+
+      var cancelFuture = subscription.cancel();
+      expect(controller.hasListener, isFalse);
+      cancel.complete(42);
+      expect(cancelFuture, completion(42));
+    });
+  });
+
+  group("cancel operation", () {
+    test("closes the events, prevents any other operation", () async {
+      var events = new StreamQueue<int>(createStream());
+      await events.cancel();
+      expect(() => events.next, throwsStateError);
+      expect(() => events.skip(1), throwsStateError);
+      expect(() => events.take(1), throwsStateError);
+      expect(() => events.rest, throwsStateError);
+      expect(() => events.cancel(), throwsStateError);
+    });
+
+    test("cancels underlying subscription when called before any event",
+        () async {
+      var cancelFuture = new Future.value(42);
+      var controller = new StreamController(onCancel: () => cancelFuture);
+      var events = new StreamQueue<int>(controller.stream);
+      expect(await events.cancel(), 42);
+    });
+
+    test("cancels underlying subscription, returns result", () async {
+      var cancelFuture = new Future.value(42);
+      var controller = new StreamController(onCancel: () => cancelFuture);
+      var events = new StreamQueue<int>(controller.stream);
+      controller.add(1);
+      expect(await events.next, 1);
+      expect(await events.cancel(), 42);
+    });
+
+    group("with immediate: true", () {
+      test("closes the events, prevents any other operation", () async {
+        var events = new StreamQueue<int>(createStream());
+        await events.cancel(immediate: true);
+        expect(() => events.next, throwsStateError);
+        expect(() => events.skip(1), throwsStateError);
+        expect(() => events.take(1), throwsStateError);
+        expect(() => events.rest, throwsStateError);
+        expect(() => events.cancel(), throwsStateError);
+      });
+
+      test("cancels the underlying subscription immediately", () async {
+        var controller = new StreamController();
+        controller.add(1);
+
+        var events = new StreamQueue<int>(controller.stream);
+        expect(await events.next, 1);
+        expect(controller.hasListener, isTrue);
+
+        events.cancel(immediate: true);
+        await expect(controller.hasListener, isFalse);
+      });
+
+      test("cancels the underlying subscription when called before any event",
+          () async {
+        var cancelFuture = new Future.value(42);
+        var controller = new StreamController(onCancel: () => cancelFuture);
+
+        var events = new StreamQueue<int>(controller.stream);
+        expect(await events.cancel(immediate: true), 42);
+      });
+
+      test("closes pending requests", () async {
+        var events = new StreamQueue<int>(createStream());
+        expect(await events.next, 1);
+        expect(events.next, throwsStateError);
+        expect(events.hasNext, completion(isFalse));
+
+        await events.cancel(immediate: true);
+      });
+
+      test("returns the result of closing the underlying subscription",
+          () async {
+        var controller = new StreamController(
+            onCancel: () => new Future.value(42));
+        var events = new StreamQueue<int>(controller.stream);
+        expect(await events.cancel(immediate: true), 42);
+      });
+
+      test("listens and then cancels a stream that hasn't been listened to yet",
+          () async {
+        var wasListened = false;
+        var controller = new StreamController(
+            onListen: () => wasListened = true);
+        var events = new StreamQueue<int>(controller.stream);
+        expect(wasListened, isFalse);
+        expect(controller.hasListener, isFalse);
+
+        await events.cancel(immediate: true);
+        expect(wasListened, isTrue);
+        expect(controller.hasListener, isFalse);
+      });
+    });
+  });
+
+  group("hasNext operation", () {
+    test("true at start", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.hasNext, isTrue);
+    });
+
+    test("true after start", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.hasNext, isTrue);
+    });
+
+    test("true at end", () async {
+      var events = new StreamQueue<int>(createStream());
+      for (int i = 1; i <= 4; i++) {
+        expect(await events.next, i);
+      }
+      expect(await events.hasNext, isFalse);
+    });
+
+    test("true when enqueued", () async {
+      var events = new StreamQueue<int>(createStream());
+      var values = [];
+      for (int i = 1; i <= 3; i++) {
+        events.next.then(values.add);
+      }
+      expect(values, isEmpty);
+      expect(await events.hasNext, isTrue);
+      expect(values, [1, 2, 3]);
+    });
+
+    test("false when enqueued", () async {
+      var events = new StreamQueue<int>(createStream());
+      var values = [];
+      for (int i = 1; i <= 4; i++) {
+        events.next.then(values.add);
+      }
+      expect(values, isEmpty);
+      expect(await events.hasNext, isFalse);
+      expect(values, [1, 2, 3, 4]);
+    });
+
+    test("true when data event", () async {
+      var controller = new StreamController();
+      var events = new StreamQueue<int>(controller.stream);
+
+      var hasNext;
+      events.hasNext.then((result) { hasNext = result; });
+      await flushMicrotasks();
+      expect(hasNext, isNull);
+      controller.add(42);
+      expect(hasNext, isNull);
+      await flushMicrotasks();
+      expect(hasNext, isTrue);
+    });
+
+    test("true when error event", () async {
+      var controller = new StreamController();
+      var events = new StreamQueue<int>(controller.stream);
+
+      var hasNext;
+      events.hasNext.then((result) { hasNext = result; });
+      await flushMicrotasks();
+      expect(hasNext, isNull);
+      controller.addError("BAD");
+      expect(hasNext, isNull);
+      await flushMicrotasks();
+      expect(hasNext, isTrue);
+      expect(events.next, throwsA("BAD"));
+    });
+
+    test("- hasNext after hasNext", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.hasNext, true);
+      expect(await events.hasNext, true);
+      expect(await events.next, 1);
+      expect(await events.hasNext, true);
+      expect(await events.hasNext, true);
+      expect(await events.next, 2);
+      expect(await events.hasNext, true);
+      expect(await events.hasNext, true);
+      expect(await events.next, 3);
+      expect(await events.hasNext, true);
+      expect(await events.hasNext, true);
+      expect(await events.next, 4);
+      expect(await events.hasNext, false);
+      expect(await events.hasNext, false);
+    });
+
+    test("- next after true", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.hasNext, true);
+      expect(await events.next, 2);
+      expect(await events.next, 3);
+    });
+
+    test("- next after true, enqueued", () async {
+      var events = new StreamQueue<int>(createStream());
+      var responses = [];
+      events.next.then(responses.add);
+      events.hasNext.then(responses.add);
+      events.next.then(responses.add);
+      do {
+        await flushMicrotasks();
+      } while (responses.length < 3);
+      expect(responses, [1, true, 2]);
+    });
+
+    test("- skip 0 after true", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.hasNext, true);
+      expect(await events.skip(0), 0);
+      expect(await events.next, 2);
+    });
+
+    test("- skip 1 after true", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.hasNext, true);
+      expect(await events.skip(1), 0);
+      expect(await events.next, 3);
+    });
+
+    test("- skip 2 after true", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.hasNext, true);
+      expect(await events.skip(2), 0);
+      expect(await events.next, 4);
+    });
+
+    test("- take 0 after true", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.hasNext, true);
+      expect(await events.take(0), isEmpty);
+      expect(await events.next, 2);
+    });
+
+    test("- take 1 after true", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.hasNext, true);
+      expect(await events.take(1), [2]);
+      expect(await events.next, 3);
+    });
+
+    test("- take 2 after true", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.hasNext, true);
+      expect(await events.take(2), [2, 3]);
+      expect(await events.next, 4);
+    });
+
+    test("- rest after true", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.hasNext, true);
+      var stream = events.rest;
+      expect(await stream.toList(), [2, 3, 4]);
+    });
+
+    test("- rest after true, at last", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(await events.next, 3);
+      expect(await events.hasNext, true);
+      var stream = events.rest;
+      expect(await stream.toList(), [4]);
+    });
+
+    test("- rest after false", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(await events.next, 3);
+      expect(await events.next, 4);
+      expect(await events.hasNext, false);
+      var stream = events.rest;
+      expect(await stream.toList(), isEmpty);
+    });
+
+    test("- cancel after true on data", () async {
+      var events = new StreamQueue<int>(createStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(await events.hasNext, true);
+      expect(await events.cancel(), null);
+    });
+
+    test("- cancel after true on error", () async {
+      var events = new StreamQueue<int>(createErrorStream());
+      expect(await events.next, 1);
+      expect(await events.next, 2);
+      expect(await events.hasNext, true);
+      expect(await events.cancel(), null);
+    });
+  });
+
+  group("fork operation", () {
+    test("produces a stream queue with the same events", () async {
+      var queue1 = new StreamQueue<int>(createStream());
+      var queue2 = queue1.fork();
+
+      expect(await queue1.next, 1);
+      expect(await queue1.next, 2);
+      expect(await queue1.next, 3);
+      expect(await queue1.next, 4);
+      expect(await queue1.hasNext, isFalse);
+
+      expect(await queue2.next, 1);
+      expect(await queue2.next, 2);
+      expect(await queue2.next, 3);
+      expect(await queue2.next, 4);
+      expect(await queue2.hasNext, isFalse);
+    });
+
+    test("produces a stream queue with the same errors", () async {
+      var queue1 = new StreamQueue<int>(createErrorStream());
+      var queue2 = queue1.fork();
+
+      expect(await queue1.next, 1);
+      expect(await queue1.next, 2);
+      expect(queue1.next, throwsA("To err is divine!"));
+      expect(await queue1.next, 4);
+      expect(await queue1.hasNext, isFalse);
+
+      expect(await queue2.next, 1);
+      expect(await queue2.next, 2);
+      expect(queue2.next, throwsA("To err is divine!"));
+      expect(await queue2.next, 4);
+      expect(await queue2.hasNext, isFalse);
+    });
+
+    test("forks at the current point in the source queue", () {
+      var queue1 = new StreamQueue<int>(createStream());
+
+      expect(queue1.next, completion(1));
+      expect(queue1.next, completion(2));
+
+      var queue2 = queue1.fork();
+
+      expect(queue1.next, completion(3));
+      expect(queue1.next, completion(4));
+      expect(queue1.hasNext, completion(isFalse));
+
+      expect(queue2.next, completion(3));
+      expect(queue2.next, completion(4));
+      expect(queue2.hasNext, completion(isFalse));
+    });
+
+    test("can be created after there are pending values", () async {
+      var queue1 = new StreamQueue<int>(createStream());
+      await flushMicrotasks();
+
+      var queue2 = queue1.fork();
+      expect(await queue2.next, 1);
+      expect(await queue2.next, 2);
+      expect(await queue2.next, 3);
+      expect(await queue2.next, 4);
+      expect(await queue2.hasNext, isFalse);
+    });
+
+    test("multiple forks can be created at different points", () async {
+      var queue1 = new StreamQueue<int>(createStream());
+
+      var queue2 = queue1.fork();
+      expect(await queue1.next, 1);
+      expect(await queue2.next, 1);
+
+      var queue3 = queue1.fork();
+      expect(await queue1.next, 2);
+      expect(await queue2.next, 2);
+      expect(await queue3.next, 2);
+
+      var queue4 = queue1.fork();
+      expect(await queue1.next, 3);
+      expect(await queue2.next, 3);
+      expect(await queue3.next, 3);
+      expect(await queue4.next, 3);
+
+      var queue5 = queue1.fork();
+      expect(await queue1.next, 4);
+      expect(await queue2.next, 4);
+      expect(await queue3.next, 4);
+      expect(await queue4.next, 4);
+      expect(await queue5.next, 4);
+
+      var queue6 = queue1.fork();
+      expect(await queue1.hasNext, isFalse);
+      expect(await queue2.hasNext, isFalse);
+      expect(await queue3.hasNext, isFalse);
+      expect(await queue4.hasNext, isFalse);
+      expect(await queue5.hasNext, isFalse);
+      expect(await queue6.hasNext, isFalse);
+    });
+
+    test("same-level forks receive data in the order they were created",
+        () async {
+      var queue1 = new StreamQueue<int>(createStream());
+      var queue2 = queue1.fork();
+      var queue3 = queue1.fork();
+      var queue4 = queue1.fork();
+      var queue5 = queue1.fork();
+
+      for (var i = 0; i < 4; i++) {
+        var queue1Fired = false;
+        var queue2Fired = false;
+        var queue3Fired = false;
+        var queue4Fired = false;
+        var queue5Fired = false;
+
+        queue5.next.then(expectAsync((_) {
+          queue5Fired = true;
+          expect(queue1Fired, isTrue);
+          expect(queue2Fired, isTrue);
+          expect(queue3Fired, isTrue);
+          expect(queue4Fired, isTrue);
+        }));
+
+        queue1.next.then(expectAsync((_) {
+          queue1Fired = true;
+          expect(queue2Fired, isFalse);
+          expect(queue3Fired, isFalse);
+          expect(queue4Fired, isFalse);
+          expect(queue5Fired, isFalse);
+        }));
+
+        queue4.next.then(expectAsync((_) {
+          queue4Fired = true;
+          expect(queue1Fired, isTrue);
+          expect(queue2Fired, isTrue);
+          expect(queue3Fired, isTrue);
+          expect(queue5Fired, isFalse);
+        }));
+
+        queue2.next.then(expectAsync((_) {
+          queue2Fired = true;
+          expect(queue1Fired, isTrue);
+          expect(queue3Fired, isFalse);
+          expect(queue4Fired, isFalse);
+          expect(queue5Fired, isFalse);
+        }));
+
+        queue3.next.then(expectAsync((_) {
+          queue3Fired = true;
+          expect(queue1Fired, isTrue);
+          expect(queue2Fired, isTrue);
+          expect(queue4Fired, isFalse);
+          expect(queue5Fired, isFalse);
+        }));
+      }
+    });
+
+    test("forks can be created from forks", () async {
+      var queue1 = new StreamQueue<int>(createStream());
+
+      var queue2 = queue1.fork();
+      expect(await queue1.next, 1);
+      expect(await queue2.next, 1);
+
+      var queue3 = queue2.fork();
+      expect(await queue1.next, 2);
+      expect(await queue2.next, 2);
+      expect(await queue3.next, 2);
+
+      var queue4 = queue3.fork();
+      expect(await queue1.next, 3);
+      expect(await queue2.next, 3);
+      expect(await queue3.next, 3);
+      expect(await queue4.next, 3);
+
+      var queue5 = queue4.fork();
+      expect(await queue1.next, 4);
+      expect(await queue2.next, 4);
+      expect(await queue3.next, 4);
+      expect(await queue4.next, 4);
+      expect(await queue5.next, 4);
+
+      var queue6 = queue5.fork();
+      expect(await queue1.hasNext, isFalse);
+      expect(await queue2.hasNext, isFalse);
+      expect(await queue3.hasNext, isFalse);
+      expect(await queue4.hasNext, isFalse);
+      expect(await queue5.hasNext, isFalse);
+      expect(await queue6.hasNext, isFalse);
+    });
+
+    group("canceling:", () {
+      test("cancelling a fork doesn't cancel its source", () async {
+        var queue1 = new StreamQueue<int>(createStream());
+        var queue2 = queue1.fork();
+
+        queue2.cancel();
+        expect(() => queue2.next, throwsStateError);
+
+        expect(await queue1.next, 1);
+        expect(await queue1.next, 2);
+        expect(await queue1.next, 3);
+        expect(await queue1.next, 4);
+        expect(await queue1.hasNext, isFalse);
+      });
+
+      test("cancelling a source doesn't cancel its unmaterialized fork",
+          () async {
+        var queue1 = new StreamQueue<int>(createStream());
+        var queue2 = queue1.fork();
+
+        queue1.cancel();
+        expect(() => queue1.next, throwsStateError);
+
+        expect(await queue2.next, 1);
+        expect(await queue2.next, 2);
+        expect(await queue2.next, 3);
+        expect(await queue2.next, 4);
+        expect(await queue2.hasNext, isFalse);
+      });
+
+      test("cancelling a source doesn't cancel its materialized fork",
+          () async {
+        var queue1 = new StreamQueue<int>(createStream());
+        var queue2 = queue1.fork();
+
+        expect(await queue1.next, 1);
+
+        queue1.cancel();
+        expect(() => queue1.next, throwsStateError);
+
+        expect(await queue2.next, 1);
+        expect(await queue2.next, 2);
+        expect(await queue2.next, 3);
+        expect(await queue2.next, 4);
+        expect(await queue2.hasNext, isFalse);
+      });
+
+      test("the underlying stream is only canceled once all forks are canceled",
+          () async {
+        var controller = new StreamController();
+        var queue1 = new StreamQueue<int>(controller.stream);
+        var queue2 = queue1.fork();
+
+        await flushMicrotasks();
+        expect(controller.hasListener, isFalse);
+
+        expect(queue1.next, completion(1));
+        await flushMicrotasks();
+        expect(controller.hasListener, isTrue);
+
+        queue2.cancel();
+        await flushMicrotasks();
+        expect(controller.hasListener, isTrue);
+
+        controller.add(1);
+        queue1.cancel();
+        await flushMicrotasks();
+        expect(controller.hasListener, isFalse);
+      });
+
+      group("with immediate,", () {
+        test("cancelling a fork doesn't cancel its source", () async {
+          var queue1 = new StreamQueue<int>(createStream());
+          var queue2 = queue1.fork();
+
+          queue2.cancel(immediate: true);
+          expect(() => queue2.next, throwsStateError);
+
+          expect(await queue1.next, 1);
+          expect(await queue1.next, 2);
+          expect(await queue1.next, 3);
+          expect(await queue1.next, 4);
+          expect(await queue1.hasNext, isFalse);
+        });
+
+        test("cancelling a source doesn't cancel its unmaterialized fork",
+            () async {
+          var queue1 = new StreamQueue<int>(createStream());
+          var queue2 = queue1.fork();
+
+          queue1.cancel(immediate: true);
+          expect(() => queue1.next, throwsStateError);
+
+          expect(await queue2.next, 1);
+          expect(await queue2.next, 2);
+          expect(await queue2.next, 3);
+          expect(await queue2.next, 4);
+          expect(await queue2.hasNext, isFalse);
+        });
+
+        test("cancelling a source doesn't cancel its materialized fork",
+            () async {
+          var queue1 = new StreamQueue<int>(createStream());
+          var queue2 = queue1.fork();
+
+          expect(await queue1.next, 1);
+
+          queue1.cancel(immediate: true);
+          expect(() => queue1.next, throwsStateError);
+
+          expect(await queue2.next, 1);
+          expect(await queue2.next, 2);
+          expect(await queue2.next, 3);
+          expect(await queue2.next, 4);
+          expect(await queue2.hasNext, isFalse);
+        });
+
+        test("the underlying stream is only canceled once all forks are "
+            "canceled", () async {
+          var controller = new StreamController();
+          var queue1 = new StreamQueue<int>(controller.stream);
+          var queue2 = queue1.fork();
+
+          await flushMicrotasks();
+          expect(controller.hasListener, isFalse);
+
+          expect(queue1.next, throwsStateError);
+          await flushMicrotasks();
+          expect(controller.hasListener, isTrue);
+
+          queue2.cancel(immediate: true);
+          await flushMicrotasks();
+          expect(controller.hasListener, isTrue);
+
+          queue1.cancel(immediate: true);
+          await flushMicrotasks();
+          expect(controller.hasListener, isFalse);
+        });
+      });
+    });
+
+    group("pausing:", () {
+      test("the underlying stream is only implicitly paused when no forks are "
+          "awaiting input", () async {
+        var controller = new StreamController();
+        var queue1 = new StreamQueue<int>(controller.stream);
+        var queue2 = queue1.fork();
+
+        controller.add(1);
+        expect(await queue1.next, 1);
+        expect(controller.hasListener, isTrue);
+        expect(controller.isPaused, isTrue);
+
+        expect(queue1.next, completion(2));
+        await flushMicrotasks();
+        expect(controller.isPaused, isFalse);
+
+        controller.add(2);
+        await flushMicrotasks();
+        expect(controller.isPaused, isTrue);
+
+        expect(queue2.next, completion(1));
+        expect(queue2.next, completion(2));
+        expect(queue2.next, completion(3));
+        await flushMicrotasks();
+        expect(controller.isPaused, isFalse);
+
+        controller.add(3);
+        await flushMicrotasks();
+        expect(controller.isPaused, isTrue);
+      });
+
+      test("pausing a fork doesn't pause its source", () async {
+        var queue1 = new StreamQueue<int>(createStream());
+        var queue2 = queue1.fork();
+
+        queue2.rest.listen(expectAsync((_) {}, count: 0)).pause();
+
+        expect(await queue1.next, 1);
+        expect(await queue1.next, 2);
+        expect(await queue1.next, 3);
+        expect(await queue1.next, 4);
+        expect(await queue1.hasNext, isFalse);
+      });
+
+      test("pausing a source doesn't pause its fork", () async {
+        var queue1 = new StreamQueue<int>(createStream());
+        var queue2 = queue1.fork();
+
+        queue1.rest.listen(expectAsync((_) {}, count: 0)).pause();
+
+        expect(await queue2.next, 1);
+        expect(await queue2.next, 2);
+        expect(await queue2.next, 3);
+        expect(await queue2.next, 4);
+        expect(await queue2.hasNext, isFalse);
+      });
+
+      test("the underlying stream is only paused when all forks are paused",
+          () async {
+        var controller = new StreamController();
+        var queue1 = new StreamQueue<int>(controller.stream);
+        var queue2 = queue1.fork();
+
+        await flushMicrotasks();
+        expect(controller.hasListener, isFalse);
+
+        var sub1 = queue1.rest.listen(null);
+        await flushMicrotasks();
+        expect(controller.hasListener, isTrue);
+        expect(controller.isPaused, isFalse);
+
+        sub1.pause();
+        await flushMicrotasks();
+        expect(controller.isPaused, isTrue);
+
+        expect(queue2.next, completion(1));
+        await flushMicrotasks();
+        expect(controller.isPaused, isFalse);
+
+        controller.add(1);
+        await flushMicrotasks();
+        expect(controller.isPaused, isTrue);
+
+        var sub2 = queue2.rest.listen(null);
+        await flushMicrotasks();
+        expect(controller.isPaused, isFalse);
+
+        sub2.pause();
+        await flushMicrotasks();
+        expect(controller.isPaused, isTrue);
+
+        sub1.resume();
+        await flushMicrotasks();
+        expect(controller.isPaused, isFalse);
+      });
+    });
+  });
+
+  test("all combinations sequential skip/next/take operations", () async {
+    // Takes all combinations of two of next, skip and take, then ends with
+    // doing rest. Each of the first rounds do 10 events of each type,
+    // the rest does 20 elements.
+    var eventCount = 20 * (3 * 3 + 1);
+    var events = new StreamQueue<int>(createLongStream(eventCount));
+
+    // Test expecting [startIndex .. startIndex + 9] as events using
+    // `next`.
+    nextTest(startIndex) {
+      for (int i = 0; i < 10; i++) {
+        expect(events.next, completion(startIndex + i));
+      }
+    }
+
+    // Test expecting 10 events to be skipped.
+    skipTest(startIndex) {
+      expect(events.skip(10), completion(0));
+    }
+
+    // Test expecting [startIndex .. startIndex + 9] as events using
+    // `take(10)`.
+    takeTest(startIndex) {
+      expect(events.take(10),
+             completion(new List.generate(10, (i) => startIndex + i)));
+    }
+    var tests = [nextTest, skipTest, takeTest];
+
+    int counter = 0;
+    // Run through all pairs of two tests and run them.
+    for (int i = 0; i < tests.length; i++) {
+      for (int j = 0; j < tests.length; j++) {
+        tests[i](counter);
+        tests[j](counter + 10);
+        counter += 20;
+      }
+    }
+    // Then expect 20 more events as a `rest` call.
+    expect(events.rest.toList(),
+           completion(new List.generate(20, (i) => counter + i)));
+  });
+}
+
+Stream<int> createStream() async* {
+  yield 1;
+  await flushMicrotasks();
+  yield 2;
+  await flushMicrotasks();
+  yield 3;
+  await flushMicrotasks();
+  yield 4;
+}
+
+Stream<int> createErrorStream() {
+  StreamController controller = new StreamController<int>();
+  () async {
+    controller.add(1);
+    await flushMicrotasks();
+    controller.add(2);
+    await flushMicrotasks();
+    controller.addError("To err is divine!");
+    await flushMicrotasks();
+    controller.add(4);
+    await flushMicrotasks();
+    controller.close();
+  }();
+  return controller.stream;
+}
+
+Stream<int> createLongStream(int eventCount) async* {
+  for (int i = 0; i < eventCount; i++) yield i;
+}
+
+Future flushMicrotasks() => new Future.delayed(Duration.ZERO);
diff --git a/mojo/public/dart/third_party/test/test/util/string_literal_iterator_test.dart b/mojo/public/dart/third_party/test/test/util/string_literal_iterator_test.dart
new file mode 100644
index 0000000..4b243dc
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/util/string_literal_iterator_test.dart
@@ -0,0 +1,246 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn("vm")
+
+import 'package:analyzer/analyzer.dart';
+import 'package:test/test.dart';
+import 'package:test/src/util/string_literal_iterator.dart';
+
+final _offset = "final str = ".length;
+
+void main() {
+  group("returns simple characters in", () {
+    test("a single simple string", () {
+      var iter = _parse('"abc"');
+
+      expect(iter.current, isNull);
+      expect(iter.offset, equals(_offset));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("a"));
+      expect(iter.offset, equals(_offset + 1));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("b"));
+      expect(iter.offset, equals(_offset + 2));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("c"));
+      expect(iter.offset, equals(_offset + 3));
+
+      expect(iter.moveNext(), isFalse);
+      expect(iter.current, isNull);
+      expect(iter.offset, equals(_offset + 4));
+    });
+
+    test("a raw string", () {
+      var iter = _parse('r"abc"');
+
+      expect(iter.current, isNull);
+      expect(iter.offset, equals(_offset + 1));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("a"));
+      expect(iter.offset, equals(_offset + 2));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("b"));
+      expect(iter.offset, equals(_offset + 3));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("c"));
+      expect(iter.offset, equals(_offset + 4));
+
+      expect(iter.moveNext(), isFalse);
+      expect(iter.current, isNull);
+      expect(iter.offset, equals(_offset + 5));
+    });
+
+    test("a multiline string", () {
+      var iter = _parse('"""ab\ncd"""');
+
+      expect(iter.current, isNull);
+      expect(iter.offset, equals(_offset + 2));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("a"));
+      expect(iter.offset, equals(_offset + 3));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("b"));
+      expect(iter.offset, equals(_offset + 4));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("\n"));
+      expect(iter.offset, equals(_offset + 5));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("c"));
+      expect(iter.offset, equals(_offset + 6));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("d"));
+      expect(iter.offset, equals(_offset + 7));
+
+      expect(iter.moveNext(), isFalse);
+      expect(iter.current, isNull);
+      expect(iter.offset, equals(_offset + 8));
+    });
+
+    test("a raw multiline string", () {
+      var iter = _parse('r"""ab\ncd"""');
+
+      expect(iter.current, isNull);
+      expect(iter.offset, equals(_offset + 3));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("a"));
+      expect(iter.offset, equals(_offset + 4));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("b"));
+      expect(iter.offset, equals(_offset + 5));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("\n"));
+      expect(iter.offset, equals(_offset + 6));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("c"));
+      expect(iter.offset, equals(_offset + 7));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("d"));
+      expect(iter.offset, equals(_offset + 8));
+
+      expect(iter.moveNext(), isFalse);
+      expect(iter.current, isNull);
+      expect(iter.offset, equals(_offset + 9));
+    });
+
+    test("adjacent strings", () {
+      var iter = _parse('"ab" r"cd" """ef\ngh"""');
+
+      expect(iter.current, isNull);
+      expect(iter.offset, equals(_offset));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("a"));
+      expect(iter.offset, equals(_offset + 1));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("b"));
+      expect(iter.offset, equals(_offset + 2));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("c"));
+      expect(iter.offset, equals(_offset + 7));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("d"));
+      expect(iter.offset, equals(_offset + 8));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("e"));
+      expect(iter.offset, equals(_offset + 14));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("f"));
+      expect(iter.offset, equals(_offset + 15));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("\n"));
+      expect(iter.offset, equals(_offset + 16));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("g"));
+      expect(iter.offset, equals(_offset + 17));
+
+      expect(iter.moveNext(), isTrue);
+      expect(iter.current, _isRune("h"));
+      expect(iter.offset, equals(_offset + 18));
+
+      expect(iter.moveNext(), isFalse);
+      expect(iter.current, isNull);
+      expect(iter.offset, equals(_offset + 19));
+    });
+  });
+
+  group("parses an escape sequence for", () {
+    test("a newline", () => _expectEscape(r"\n", "\n"));
+    test("a carriage return", () => _expectEscape(r"\r", "\r"));
+    test("a form feed", () => _expectEscape(r"\f", "\f"));
+    test("a backspace", () => _expectEscape(r"\b", "\b"));
+    test("a tab", () => _expectEscape(r"\t", "\t"));
+    test("a vertical tab", () => _expectEscape(r"\v", "\v"));
+    test("a quote", () => _expectEscape(r'\"', '"'));
+    test("a backslash", () => _expectEscape(r"\\", "\\"));
+
+    test("a hex character", () {
+      _expectEscape(r"\x62", "b");
+      _expectEscape(r"\x7A", "z");
+      _expectEscape(r"\x7a", "z");
+    });
+
+    test("a fixed-length unicode character",
+        () => _expectEscape(r"\u0062", "b"));
+
+    test("a short variable-length unicode character",
+        () => _expectEscape(r"\u{62}", "b"));
+
+    test("a long variable-length unicode character",
+        () => _expectEscape(r"\u{000062}", "b"));
+  });
+
+  group("throws an ArgumentError for", () {
+    test("interpolation", () {
+      expect(() => _parse(r'"$foo"'), throwsArgumentError);
+    });
+
+    test("interpolation in an adjacent string", () {
+      expect(() => _parse(r'"foo" "$bar" "baz"'), throwsArgumentError);
+    });
+  });
+}
+
+/// Asserts that [escape] is parsed as [value].
+void _expectEscape(String escape, String value) {
+  var iter = _parse('"a${escape}b"');
+
+  expect(iter.current, isNull);
+  expect(iter.offset, equals(_offset));
+
+  expect(iter.moveNext(), isTrue);
+  expect(iter.current, _isRune("a"));
+  expect(iter.offset, equals(_offset + 1));
+
+  expect(iter.moveNext(), isTrue);
+  expect(iter.current, _isRune(value));
+  expect(iter.offset, equals(_offset + 2));
+
+  expect(iter.moveNext(), isTrue);
+  expect(iter.current, _isRune("b"));
+  expect(iter.offset, equals(_offset + escape.length + 2));
+
+  expect(iter.moveNext(), isFalse);
+  expect(iter.current, isNull);
+  expect(iter.offset, equals(_offset + escape.length + 3));
+}
+
+/// Returns a matcher that asserts that the given rune is the rune for [char].
+Matcher _isRune(String char) {
+  return predicate((rune) {
+    return rune is int && new String.fromCharCode(rune) == char;
+  }, 'is the rune "$char"');
+}
+
+/// Parses [dart], which should be a string literal, into a
+/// [StringLiteralIterator].
+StringLiteralIterator _parse(String dart) {
+  var declaration =
+      parseCompilationUnit("final str = $dart;").declarations.single;
+  var literal = declaration.variables.variables.single.initializer;
+  return new StringLiteralIterator(literal);
+}
diff --git a/mojo/public/dart/third_party/test/test/utils.dart b/mojo/public/dart/third_party/test/test/utils.dart
new file mode 100644
index 0000000..5880149
--- /dev/null
+++ b/mojo/public/dart/third_party/test/test/utils.dart
@@ -0,0 +1,282 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.test.utils;
+
+import 'dart:async';
+import 'dart:collection';
+
+import 'package:test/src/backend/invoker.dart';
+import 'package:test/src/backend/live_test.dart';
+import 'package:test/src/backend/metadata.dart';
+import 'package:test/src/backend/state.dart';
+import 'package:test/src/backend/suite.dart';
+import 'package:test/src/runner/application_exception.dart';
+import 'package:test/src/runner/load_exception.dart';
+import 'package:test/src/util/remote_exception.dart';
+import 'package:test/test.dart';
+
+/// The string representation of an untyped closure with no arguments.
+///
+/// This differs between dart2js and the VM.
+final String closureString = (() {}).toString();
+
+// The last state change detected via [expectStates].
+State lastState;
+
+/// Asserts that exactly [states] will be emitted via [liveTest.onStateChange].
+///
+/// The most recent emitted state is stored in [_lastState].
+void expectStates(LiveTest liveTest, Iterable<State> statesIter) {
+  var states = new Queue.from(statesIter);
+  liveTest.onStateChange.listen(expectAsync((state) {
+    lastState = state;
+    expect(state, equals(states.removeFirst()));
+  }, count: states.length, max: states.length));
+}
+
+/// Asserts that errors will be emitted via [liveTest.onError] that match
+/// [validators], in order.
+void expectErrors(LiveTest liveTest, Iterable<Function> validatorsIter) {
+  var validators = new Queue.from(validatorsIter);
+  liveTest.onError.listen(expectAsync((error) {
+    validators.removeFirst()(error.error);
+  }, count: validators.length, max: validators.length));
+}
+
+/// Asserts that [liveTest] will have a single failure with message `"oh no"`.
+void expectSingleFailure(LiveTest liveTest) {
+  expectStates(liveTest, [
+    const State(Status.running, Result.success),
+    const State(Status.complete, Result.failure)
+  ]);
+
+  expectErrors(liveTest, [(error) {
+    expect(lastState.status, equals(Status.complete));
+    expect(error, isTestFailure("oh no"));
+  }]);
+}
+
+/// Asserts that [liveTest] will have a single error, the string `"oh no"`.
+void expectSingleError(LiveTest liveTest) {
+  expectStates(liveTest, [
+    const State(Status.running, Result.success),
+    const State(Status.complete, Result.error)
+  ]);
+
+  expectErrors(liveTest, [(error) {
+    expect(lastState.status, equals(Status.complete));
+    expect(error, equals("oh no"));
+  }]);
+}
+
+/// Returns a matcher that matches a [TestFailure] with the given [message].
+///
+/// [message] can be a string or a [Matcher].
+Matcher isTestFailure(message) => new _IsTestFailure(wrapMatcher(message));
+
+class _IsTestFailure extends Matcher {
+  final Matcher _message;
+
+  _IsTestFailure(this._message);
+
+  bool matches(item, Map matchState) =>
+      item is TestFailure && _message.matches(item.message, matchState);
+
+  Description describe(Description description) =>
+      description.add('a TestFailure with message ').addDescriptionOf(_message);
+
+  Description describeMismatch(item, Description mismatchDescription,
+                               Map matchState, bool verbose) {
+    if (item is! TestFailure) {
+      return mismatchDescription.addDescriptionOf(item)
+          .add('is not a TestFailure');
+    } else {
+      return mismatchDescription
+          .add('message ')
+          .addDescriptionOf(item.message)
+          .add(' is not ')
+          .addDescriptionOf(_message);
+    }
+  }
+}
+
+/// Returns a matcher that matches a [RemoteException] with the given [message].
+///
+/// [message] can be a string or a [Matcher].
+Matcher isRemoteException(message) =>
+    new _IsRemoteException(wrapMatcher(message));
+
+class _IsRemoteException extends Matcher {
+  final Matcher _message;
+
+  _IsRemoteException(this._message);
+
+  bool matches(item, Map matchState) =>
+      item is RemoteException && _message.matches(item.message, matchState);
+
+  Description describe(Description description) =>
+      description.add('a RemoteException with message ')
+          .addDescriptionOf(_message);
+
+  Description describeMismatch(item, Description mismatchDescription,
+                               Map matchState, bool verbose) {
+    if (item is! RemoteException) {
+      return mismatchDescription.addDescriptionOf(item)
+          .add('is not a RemoteException');
+    } else {
+      return mismatchDescription
+          .add('message ')
+          .addDescriptionOf(item)
+          .add(' is not ')
+          .addDescriptionOf(_message);
+    }
+  }
+}
+
+/// Returns a matcher that matches a [LoadException] with the given
+/// [innerError].
+///
+/// [innerError] can be a string or a [Matcher].
+Matcher isLoadException(innerError) =>
+    new _IsLoadException(wrapMatcher(innerError));
+
+class _IsLoadException extends Matcher {
+  final Matcher _innerError;
+
+  _IsLoadException(this._innerError);
+
+  bool matches(item, Map matchState) =>
+      item is LoadException && _innerError.matches(item.innerError, matchState);
+
+  Description describe(Description description) =>
+      description.add('a LoadException with message ')
+          .addDescriptionOf(_innerError);
+
+  Description describeMismatch(item, Description mismatchDescription,
+                               Map matchState, bool verbose) {
+    if (item is! LoadException) {
+      return mismatchDescription.addDescriptionOf(item)
+          .add('is not a LoadException');
+    } else {
+      return mismatchDescription
+          .add('inner error ')
+          .addDescriptionOf(item)
+          .add(' is not ')
+          .addDescriptionOf(_innerError);
+    }
+  }
+}
+
+/// Returns a matcher that matches a [ApplicationException] with the given
+/// [message].
+///
+/// [message] can be a string or a [Matcher].
+Matcher isApplicationException(message) =>
+    new _IsApplicationException(wrapMatcher(message));
+
+class _IsApplicationException extends Matcher {
+  final Matcher _message;
+
+  _IsApplicationException(this._message);
+
+  bool matches(item, Map matchState) =>
+      item is ApplicationException && _message.matches(item.message, matchState);
+
+  Description describe(Description description) =>
+      description.add('a ApplicationException with message ')
+          .addDescriptionOf(_message);
+
+  Description describeMismatch(item, Description mismatchDescription,
+                               Map matchState, bool verbose) {
+    if (item is! ApplicationException) {
+      return mismatchDescription.addDescriptionOf(item)
+          .add('is not a ApplicationException');
+    } else {
+      return mismatchDescription
+          .add('message ')
+          .addDescriptionOf(item)
+          .add(' is not ')
+          .addDescriptionOf(_message);
+    }
+  }
+}
+
+/// Returns a [Future] that completes after pumping the event queue [times]
+/// times.
+///
+/// By default, this should pump the event queue enough times to allow any code
+/// to run, as long as it's not waiting on some external event.
+Future pumpEventQueue([int times=20]) {
+  if (times == 0) return new Future.value();
+  // Use [new Future] future to allow microtask events to finish. The [new
+  // Future.value] constructor uses scheduleMicrotask itself and would therefore
+  // not wait for microtask callbacks that are scheduled after invoking this
+  // method.
+  return new Future(() => pumpEventQueue(times - 1));
+}
+
+/// Returns a local [LiveTest] that runs [body].
+LiveTest createTest(body()) {
+  var test = new LocalTest("test", new Metadata(), body);
+  var suite = new Suite([test]);
+  return test.load(suite);
+}
+
+/// Runs [body] as a test.
+///
+/// Once it completes, returns the [LiveTest] used to run it.
+Future<LiveTest> runTestBody(body()) async {
+  var liveTest = createTest(body);
+  await liveTest.run();
+  return liveTest;
+}
+
+/// Asserts that [liveTest] has completed and passed.
+///
+/// If the test had any errors, they're surfaced nicely into the outer test.
+void expectTestPassed(LiveTest liveTest) {
+  // Since the test is expected to pass, we forward any current or future errors
+  // to the outer test, because they're definitely unexpected.
+  for (var error in liveTest.errors) {
+    registerException(error.error, error.stackTrace);
+  }
+  liveTest.onError.listen((error) {
+    registerException(error.error, error.stackTrace);
+  });
+
+  expect(liveTest.state.status, equals(Status.complete));
+  expect(liveTest.state.result, equals(Result.success));
+}
+
+/// Asserts that [liveTest] failed with a single [TestFailure] whose message
+/// matches [message].
+void expectTestFailed(LiveTest liveTest, message) {
+  expect(liveTest.state.status, equals(Status.complete));
+  expect(liveTest.state.result, equals(Result.failure));
+  expect(liveTest.errors, hasLength(1));
+  expect(liveTest.errors.first.error, isTestFailure(message));
+}
+
+/// Assert that the [test] callback causes a test to block until [stopBlocking]
+/// is called at some later time.
+///
+/// [stopBlocking] is passed the return value of [test].
+Future expectTestBlocks(test(), stopBlocking(value)) async {
+  var liveTest;
+  var future;
+  liveTest = createTest(() {
+    var value = test();
+    future = pumpEventQueue().then((_) {
+      expect(liveTest.state.status, equals(Status.running));
+      stopBlocking(value);
+    });
+  });
+
+  await liveTest.run();
+  expectTestPassed(liveTest);
+  // Ensure that the outer test doesn't complete until the inner future
+  // completes.
+  return future;
+}
diff --git a/mojo/public/dart/third_party/unittest/.gitignore b/mojo/public/dart/third_party/unittest/.gitignore
new file mode 100644
index 0000000..388eff0
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/.gitignore
@@ -0,0 +1,14 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.pub/
+build/
+packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/unittest/.status b/mojo/public/dart/third_party/unittest/.status
new file mode 100644
index 0000000..c5c82bb
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/.status
@@ -0,0 +1,51 @@
+# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Skip non-test files ending with "_test".
+packages/*: Skip
+*/packages/*: Skip
+*/*/packages/*: Skip
+*/*/*/packages/*: Skip
+*/*/*/*packages/*: Skip
+*/*/*/*/*packages/*: Skip
+
+# Only run tests from the build directory, since we don't care about the
+# difference between transformed an untransformed code.
+test/*: Skip
+
+[ $runtime == jsshell ]
+build/test/missing_tick_test: Fail # Timer interface not supported: dartbug.com/7728
+build/test/nested_groups_setup_teardown_test: RuntimeError # http://dartbug.com/10109
+
+[ $compiler == none && ( $runtime == dartium || $runtime == drt || $runtime == ContentShellOnAndroid) ]
+# Skip serialization test that explicitly has no library declaration in the
+# test on Dartium, which requires all tests to have a library.
+build/test/async_exception_test: RuntimeError # 13921
+build/test/async_exception_with_future_test: RuntimeError # 13921
+build/test/async_setup_teardown_test: RuntimeError # 13921
+build/test/completion_test: RuntimeError # 13921
+build/test/correct_callback_test: RuntimeError # 13921
+build/test/exception_test: RuntimeError # 13921
+build/test/excess_callback_test: RuntimeError # 13921
+build/test/expect_async_args_test: RuntimeError # 13921
+build/test/expect_async_test: RuntimeError # 13921
+build/test/group_name_test: RuntimeError # 13921
+build/test/invalid_ops_test: RuntimeError # 13921
+build/test/late_exception_test: RuntimeError # 13921
+build/test/middle_exception_test: RuntimeError # 13921
+build/test/nested_groups_setup_teardown_test: RuntimeError # 13921
+build/test/protect_async_test: RuntimeError # 13921
+build/test/returning_future_test: RuntimeError # 13921
+build/test/returning_future_using_runasync_test: RuntimeError # 13921
+build/test/runtests_without_tests_test: RuntimeError # 13921
+build/test/setup_and_teardown_test: RuntimeError # 13921
+build/test/setup_test: RuntimeError # 13921
+build/test/single_correct_test: RuntimeError # 13921
+build/test/single_failing_test: RuntimeError # 13921
+build/test/skipped_soloed_nested_test: RuntimeError # 13921
+build/test/teardown_test: RuntimeError # 13921
+build/test/testcases_immutable_test: RuntimeError # 13921
+
+[ $compiler == none && $browser ]
+build/test/missing_tick_test: RuntimeError # Expected to fail, due to timeout.
diff --git a/mojo/public/dart/third_party/unittest/CHANGELOG.md b/mojo/public/dart/third_party/unittest/CHANGELOG.md
new file mode 100644
index 0000000..8e45401
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/CHANGELOG.md
@@ -0,0 +1,136 @@
+##0.11.6+1
+
+* Give tests more time to start running.
+
+##0.11.6
+
+* Merge in the last `0.11.x` release of `matcher` to allow projects to use both
+  `test` and `unittest` without conflicts.
+
+* Fix running individual tests with `HtmlIndividualConfiguration` when the test
+  name contains URI-escaped values and is provided with the `group` query
+  parameter.
+
+##0.11.5+4
+
+* Improved the output of `TestCase` failures in `HtmlConfig`.
+
+##0.11.5+3
+
+* Fixed issue with handling exceptions.
+
+##0.11.5+2
+
+* Properly detect when tests are finished being run on content shell.
+
+##0.11.5+1
+
+* Internal code cleanups and documentation improvements.
+
+##0.11.5
+
+* Bumped the version constraint for `matcher`.
+
+##0.11.4
+
+* Bump the version constraint for `matcher`.
+
+##0.11.3
+
+* Narrow the constraint on matcher to ensure that new features are reflected in
+  unittest's version.
+
+##0.11.2
+
+* Prints a warning instead of throwing an error when setting the test
+  configuration after it has already been set. The first configuration is always
+  used.
+
+##0.11.1+1
+
+* Fix bug in withTestEnvironment where test cases were not reinitialized if
+  called multiple times.
+
+##0.11.1
+
+* Add `reason` named argument to `expectAsync` and `expectAsyncUntil`, which has
+  the same definition as `expect`'s `reason` argument.
+* Added support for private test environments.
+
+##0.11.0+6
+
+* Refactored package tests.
+
+##0.11.0+5
+
+* Release test functions after each test is run.
+
+##0.11.0+4
+
+* Fix for [20153](https://code.google.com/p/dart/issues/detail?id=20153)
+
+##0.11.0+3
+
+* Updated maximum `matcher` version.
+
+##0.11.0+2
+
+*  Removed unused files from tests and standardized remaining test file names.
+
+##0.11.0+1
+
+* Widen the version constraint for `stack_trace`.
+
+##0.11.0
+
+* Deprecated methods have been removed:
+    * `expectAsync0`, `expectAsync1`, and `expectAsync2` - use `expectAsync`
+      instead
+    * `expectAsyncUntil0`, `expectAsyncUntil1`, and `expectAsyncUntil2` - use
+      `expectAsyncUntil` instead
+    * `guardAsync` - no longer needed
+    * `protectAsync0`, `protectAsync1`, and `protectAsync2` - no longer needed
+* `matcher.dart` and `mirror_matchers.dart` have been removed. They are now in
+  the `matcher` package.
+* `mock.dart` has been removed. It is now in the `mock` package.
+
+##0.10.1+2
+
+* Fixed deprecation message for `mock`.
+
+##0.10.1+1
+
+* Fixed CHANGELOG
+* Moved to triple-slash for all doc comments.
+
+##0.10.1
+
+* **DEPRECATED**
+    * `matcher.dart` and `mirror_matchers.dart` are now in the `matcher`
+      package.
+    * `mock.dart` is now in the `mock` package.
+* `equals` now allows a nested matcher as an expected list element or map value
+  when doing deep matching.
+* `expectAsync` and `expectAsyncUntil` now support up to 6 positional arguments
+  and correctly handle functions with optional positional arguments with default
+  values.
+
+##0.10.0
+
+* Each test is run in a separate `Zone`. This ensures that any exceptions that
+occur is async operations are reported back to the source test case.
+* **DEPRECATED** `guardAsync`, `protectAsync0`, `protectAsync1`,
+and `protectAsync2`
+    * Running each test in a `Zone` addresses the need for these methods.
+* **NEW!** `expectAsync` replaces the now deprecated `expectAsync0`,
+    `expectAsync1` and `expectAsync2`
+* **NEW!** `expectAsyncUntil` replaces the now deprecated `expectAsyncUntil0`,
+    `expectAsyncUntil1` and `expectAsyncUntil2`
+* `TestCase`:
+    * Removed properties: `setUp`, `tearDown`, `testFunction`
+    * `enabled` is now get-only
+    * Removed methods: `pass`, `fail`, `error`
+* `interactive_html_config.dart` has been removed.
+* `runTests`, `tearDown`, `setUp`, `test`, `group`, `solo_test`, and
+  `solo_group` now throw a `StateError` if called while tests are running.
+* `rerunTests` has been removed.
diff --git a/mojo/public/dart/third_party/unittest/LICENSE b/mojo/public/dart/third_party/unittest/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/unittest/README.md b/mojo/public/dart/third_party/unittest/README.md
new file mode 100644
index 0000000..faad9a8
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/README.md
@@ -0,0 +1,5 @@
+The `unittest` package has been renamed [`test`][test]. It will export `test`'s
+API through the `0.12.x` branch, but it is deprecated and `test` should be used
+instead.
+
+[test]: https://pub.dartlang.org/packages/test
diff --git a/mojo/public/dart/third_party/unittest/codereview.settings b/mojo/public/dart/third_party/unittest/codereview.settings
new file mode 100644
index 0000000..bd401b1
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: https://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/unittest/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/unittest/lib/compact_vm_config.dart b/mojo/public/dart/third_party/unittest/lib/compact_vm_config.dart
new file mode 100644
index 0000000..1fadfc1
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/compact_vm_config.dart
@@ -0,0 +1,214 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A test configuration that generates a compact 1-line progress bar. The bar
+/// is updated in-place before and after each test is executed. If all tests
+/// pass, only a couple of lines are printed in the terminal. If a test fails,
+/// the failure is shown and the progress bar continues to be updated below it.
+library unittest.compact_vm_config;
+
+import 'dart:async';
+import 'dart:io';
+import 'dart:isolate';
+
+import 'unittest.dart';
+import 'src/utils.dart';
+import 'vm_config.dart';
+
+const String _GREEN = '\u001b[32m';
+const String _RED = '\u001b[31m';
+const String _NONE = '\u001b[0m';
+
+const int MAX_LINE = 80;
+
+class CompactVMConfiguration extends VMConfiguration {
+  // The VM won't shut down if a receive port is open. Use this to make sure
+  // we correctly wait for asynchronous tests.
+  ReceivePort _receivePort;
+
+  DateTime _start;
+  Set<int> _passing = new Set();
+  Set<int> _failing = new Set();
+  int get _pass => _passing.length;
+  int get _fail => _failing.length;
+
+  void onInit() {
+    _receivePort = new ReceivePort();
+    // Override and don't call the superclass onInit() to avoid printing the
+    // "unittest-suite-..." boilerplate.
+  }
+
+  void onStart() {
+    _start = new DateTime.now();
+  }
+
+  void onTestStart(TestCase test) {
+    super.onTestStart(test);
+    _progressLine(test.description);
+  }
+
+  void onTestResult(TestCase test) {
+    super.onTestResult(test);
+    if (test.result == PASS) {
+      _passing.add(test.id);
+      _progressLine(test.description);
+    } else {
+      _failing.add(test.id);
+      _progressLine(test.description);
+      _print();
+      if (test.message != '') {
+        _print(indent(test.message));
+      }
+
+      if (test.stackTrace != null) {
+        _print(indent(test.stackTrace.toString()));
+      }
+    }
+  }
+
+  void onTestResultChanged(TestCase test) {
+    _passing.remove(test.id);
+    _failing.add(test.id);
+    _progressLine(test.description);
+    _print();
+    if (test.message != '') {
+      _print(indent(test.message));
+    }
+
+    if (test.stackTrace != null) {
+      _print(indent(test.stackTrace.toString()));
+    }
+  }
+
+  void onDone(bool success) {
+    // Override and don't call the superclass onDone() to avoid printing the
+    // "unittest-suite-..." boilerplate.
+    Future.wait([stdout.close(), stderr.close()]).then((_) {
+      _receivePort.close();
+      exit(success ? 0 : 1);
+    });
+  }
+
+  void onSummary(int passed, int failed, int errors, List<TestCase> results,
+      String uncaughtError) {
+    if (passed == 0 && failed == 0 && errors == 0 && uncaughtError == null) {
+      _print('\nNo tests ran.');
+    } else if (failed == 0 && errors == 0 && uncaughtError == null) {
+      _progressLine('All tests passed!', _NONE);
+      _print();
+    } else {
+      _progressLine('Some tests failed.', _RED);
+      _print();
+      if (uncaughtError != null) {
+        _print('Top-level uncaught error: $uncaughtError');
+      }
+      _print('$passed PASSED, $failed FAILED, $errors ERRORS');
+    }
+  }
+
+  int _lastLength = 0;
+
+  final int _nonVisiblePrefix = 1 + _GREEN.length + _NONE.length;
+
+  void _progressLine(String message, [String color = _NONE]) {
+    var duration = (new DateTime.now()).difference(_start);
+    var buffer = new StringBuffer();
+    // \r moves back to the beginning of the current line.
+    buffer.write('\r${_timeString(duration)} ');
+    buffer.write(_GREEN);
+    buffer.write('+');
+    buffer.write(_pass);
+    buffer.write(_NONE);
+    if (_fail != 0) {
+      buffer.write(_RED);
+      buffer.write(' -');
+      buffer.write(_fail);
+      buffer.write(_NONE);
+    }
+    buffer.write(': ');
+    buffer.write(color);
+
+    // Ensure the line fits under MAX_LINE. [buffer] includes the color escape
+    // sequences too. Because these sequences are not visible characters, we
+    // make sure they are not counted towards the limit.
+    int nonVisible = _nonVisiblePrefix +
+        color.length +
+        (_fail != 0 ? (_RED.length + _NONE.length) : 0);
+    int len = buffer.length - nonVisible;
+    buffer.write(_snippet(message, MAX_LINE - len));
+    buffer.write(_NONE);
+
+    // Pad the rest of the line so that it looks erased.
+    len = buffer.length - nonVisible - _NONE.length;
+    if (len > _lastLength) {
+      _lastLength = len;
+    } else {
+      while (len < _lastLength) {
+        buffer.write(' ');
+        _lastLength--;
+      }
+    }
+    stdout.write(buffer.toString());
+  }
+
+  String _padTime(int time) =>
+      (time == 0) ? '00' : ((time < 10) ? '0$time' : '$time');
+
+  String _timeString(Duration duration) {
+    var min = duration.inMinutes;
+    var sec = duration.inSeconds % 60;
+    return '${_padTime(min)}:${_padTime(sec)}';
+  }
+
+  String _snippet(String text, int maxLength) {
+    // Return the full message if it fits
+    if (text.length <= maxLength) return text;
+
+    // If we can fit the first and last three words, do so.
+    var words = text.split(' ');
+    if (words.length > 1) {
+      int i = words.length;
+      var len = words.first.length + 4;
+      do {
+        len += 1 + words[--i].length;
+      } while (len <= maxLength && i > 0);
+      if (len > maxLength || i == 0) i++;
+      if (i < words.length - 4) {
+        // Require at least 3 words at the end.
+        var buffer = new StringBuffer();
+        buffer.write(words.first);
+        buffer.write(' ...');
+        for ( ; i < words.length; i++) {
+          buffer.write(' ');
+          buffer.write(words[i]);
+        }
+        return buffer.toString();
+      }
+    }
+
+    // Otherwise truncate to return the trailing text, but attempt to start at
+    // the beginning of a word.
+    var res = text.substring(text.length - maxLength + 4);
+    var firstSpace = res.indexOf(' ');
+    if (firstSpace > 0) {
+      res = res.substring(firstSpace);
+    }
+    return '...$res';
+  }
+}
+
+// TODO(sigmund): delete when dartbug.com/17269 is fixed (use `print` instead).
+_print([value = '']) => stdout.write('$value\n');
+
+void useCompactVMConfiguration() {
+  // If the test is running on the Dart buildbots, we don't want to use this
+  // config since it's output may not be what the bots expect.
+  if (Platform.environment['LOGNAME'] == 'chrome-bot') {
+    return;
+  }
+
+  unittestConfiguration = _singleton;
+}
+
+final _singleton = new CompactVMConfiguration();
diff --git a/mojo/public/dart/third_party/unittest/lib/coverage_controller.js b/mojo/public/dart/third_party/unittest/lib/coverage_controller.js
new file mode 100644
index 0000000..1cf21ae
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/coverage_controller.js
@@ -0,0 +1,31 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Coverage controller logic - used by coverage test harness to embed tests in
+ * content shell and extract coverage information.
+ */
+
+var LONG_LINE = 60000;
+
+function onReceive(e) {
+  if (e.data == 'unittest-suite-done') {
+    var s = JSON.stringify(top._$jscoverage);
+    var res = '';
+    // conent shell has a bug on lines longer than 2^16, so we split them
+    while (s.length > LONG_LINE) {
+      res += s.substr(0, LONG_LINE) + '<br>\n';
+      s = s.substr(LONG_LINE);
+    }
+    res += s;
+    window.document.body.innerHTML = res;
+    window.layoutTestController.notifyDone();
+  }
+}
+
+if (window.layoutTestController) {
+  window.layoutTestController.dumpAsText();
+  window.layoutTestController.waitUntilDone();
+  window.addEventListener("message", onReceive, false);
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/html_config.dart b/mojo/public/dart/third_party/unittest/lib/html_config.dart
new file mode 100644
index 0000000..c472d58
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/html_config.dart
@@ -0,0 +1,184 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A simple unit test library for running tests in a browser.
+library unittest.html_config;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:html';
+import 'dart:js' as js;
+import 'unittest.dart';
+
+/// Creates a table showing tests results in HTML.
+void _showResultsInPage(int passed, int failed, int errors,
+    List<TestCase> results, bool isLayoutTest, String uncaughtError) {
+  if (isLayoutTest && (passed == results.length) && uncaughtError == null) {
+    document.body.innerHtml = "PASS";
+  } else {
+    var newBody = new StringBuffer();
+    newBody.write("<table class='unittest-table'><tbody>");
+    newBody.write(passed == results.length && uncaughtError == null
+        ? "<tr><td colspan='3' class='unittest-pass'>PASS</td></tr>"
+        : "<tr><td colspan='3' class='unittest-fail'>FAIL</td></tr>");
+
+    for (final test_ in results) {
+      newBody.write(_toHtml(test_));
+    }
+
+    if (uncaughtError != null) {
+      newBody.write('''<tr>
+          <td>--</td>
+          <td class="unittest-error">ERROR</td>
+          <td>Uncaught error: $uncaughtError</td>
+        </tr>''');
+    }
+
+    if (passed == results.length && uncaughtError == null) {
+      newBody.write("""
+          <tr><td colspan='3' class='unittest-pass'>
+            All ${passed} tests passed
+          </td></tr>""");
+    } else {
+      newBody.write("""
+          <tr><td colspan='3'>Total
+            <span class='unittest-pass'>${passed} passed</span>,
+            <span class='unittest-fail'>${failed} failed</span>
+            <span class='unittest-error'>
+            ${errors + (uncaughtError == null ? 0 : 1)} errors</span>
+          </td></tr>""");
+    }
+    newBody.write("</tbody></table>");
+    document.body.innerHtml = newBody.toString();
+
+    window.onHashChange.listen((_) {
+      // Location may change from individual tests setting the hash tag.
+      if (window.location.hash != null &&
+          window.location.hash.contains('testFilter')) {
+        window.location.reload();
+      }
+    });
+  }
+}
+
+String _toHtml(TestCase testCase) {
+  if (!testCase.isComplete) {
+    return '''
+        <tr>
+          <td>${testCase.id}</td>
+          <td class="unittest-error">NO STATUS</td>
+          <td>Test did not complete</td>
+        </tr>''';
+  }
+
+  var html = '''
+      <tr>
+        <td>${testCase.id}</td>
+        <td class="unittest-${testCase.result}">
+          ${testCase.result.toUpperCase()}
+        </td>
+        <td>
+          <p>Expectation: 
+            <a href="#testFilter=${testCase.description}">
+              ${testCase.description}
+            </a>.
+          </p>
+          <pre>${HTML_ESCAPE.convert(testCase.message)}</pre>
+        </td>
+      </tr>''';
+
+  if (testCase.stackTrace != null) {
+    html = '$html<tr><td></td><td colspan="2"><pre>' +
+        HTML_ESCAPE.convert(testCase.stackTrace.toString()) +
+        '</pre></td></tr>';
+  }
+
+  return html;
+}
+
+class HtmlConfiguration extends SimpleConfiguration {
+  /// Whether this is run within dartium layout tests.
+  final bool _isLayoutTest;
+  HtmlConfiguration(this._isLayoutTest);
+
+  StreamSubscription<Event> _onErrorSubscription;
+  StreamSubscription<Event> _onMessageSubscription;
+
+  void _installHandlers() {
+    if (_onErrorSubscription == null) {
+      _onErrorSubscription = window.onError.listen((e) {
+        // Some tests may expect this and have no way to suppress the error.
+        if (js.context['testExpectsGlobalError'] != true) {
+          handleExternalError(e, '(DOM callback has errors)');
+        }
+      });
+    }
+    if (_onMessageSubscription == null) {
+      _onMessageSubscription =
+          window.onMessage.listen((e) => processMessage(e));
+    }
+  }
+
+  void _uninstallHandlers() {
+    if (_onErrorSubscription != null) {
+      _onErrorSubscription.cancel();
+      _onErrorSubscription = null;
+    }
+    if (_onMessageSubscription != null) {
+      _onMessageSubscription.cancel();
+      _onMessageSubscription = null;
+    }
+  }
+
+  void processMessage(e) {
+    if ('unittest-suite-external-error' == e.data) {
+      handleExternalError('<unknown>', '(external error detected)');
+    }
+  }
+
+  void onInit() {
+    // For Dart internal tests, we want to turn off stack frame
+    // filtering, which we do with this meta-header.
+    var meta = querySelector('meta[name="dart.unittest"]');
+    filterStacks =
+        meta == null ? true : !meta.content.contains('full-stack-traces');
+    _installHandlers();
+    window.postMessage('unittest-suite-wait-for-done', '*');
+  }
+
+  void onStart() {
+    // If the URL has a #testFilter=testName then filter tests to that.
+    // This is used to make it easy to run a single test- but is only intended
+    // for interactive debugging scenarios.
+    var hash = window.location.hash;
+    if (hash != null && hash.length > 1) {
+      var params = hash.substring(1).split('&');
+      for (var param in params) {
+        var parts = param.split('=');
+        if (parts.length == 2 && parts[0] == 'testFilter') {
+          filterTests('^${parts[1]}');
+        }
+      }
+    }
+    super.onStart();
+  }
+
+  void onSummary(int passed, int failed, int errors, List<TestCase> results,
+      String uncaughtError) {
+    _showResultsInPage(
+        passed, failed, errors, results, _isLayoutTest, uncaughtError);
+  }
+
+  void onDone(bool success) {
+    _uninstallHandlers();
+    window.postMessage('unittest-suite-done', '*');
+  }
+}
+
+void useHtmlConfiguration([bool isLayoutTest = false]) {
+  unittestConfiguration = isLayoutTest ? _singletonLayout : _singletonNotLayout;
+}
+
+final _singletonLayout = new HtmlConfiguration(true);
+final _singletonNotLayout = new HtmlConfiguration(false);
diff --git a/mojo/public/dart/third_party/unittest/lib/html_enhanced_config.dart b/mojo/public/dart/third_party/unittest/lib/html_enhanced_config.dart
new file mode 100644
index 0000000..0178ccb
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/html_enhanced_config.dart
@@ -0,0 +1,405 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A simple unit test library for running tests in a browser.
+///
+/// Provides enhanced HTML output with collapsible group headers
+/// and other at-a-glance information about the test results.
+library unittest.html_enhanced_config;
+
+import 'dart:collection' show LinkedHashMap;
+import 'dart:convert';
+import 'dart:html';
+import 'unittest.dart';
+
+class HtmlEnhancedConfiguration extends SimpleConfiguration {
+  /// Whether this is run within dartium layout tests.
+  final bool _isLayoutTest;
+  HtmlEnhancedConfiguration(this._isLayoutTest);
+
+  var _onErrorSubscription = null;
+  var _onMessageSubscription = null;
+
+  void _installOnErrorHandler() {
+    if (_onErrorSubscription == null) {
+      // Listen for uncaught errors.
+      _onErrorSubscription = window.onError
+          .listen((e) => handleExternalError(e, '(DOM callback has errors)'));
+    }
+  }
+
+  void _installOnMessageHandler() {
+    if (_onMessageSubscription == null) {
+      // Listen for errors from JS.
+      _onMessageSubscription =
+          window.onMessage.listen((e) => processMessage(e));
+    }
+  }
+
+  void _installHandlers() {
+    _installOnErrorHandler();
+    _installOnMessageHandler();
+  }
+
+  void _uninstallHandlers() {
+    if (_onErrorSubscription != null) {
+      _onErrorSubscription.cancel();
+      _onErrorSubscription = null;
+    }
+    if (_onMessageSubscription != null) {
+      _onMessageSubscription.cancel();
+      _onMessageSubscription = null;
+    }
+  }
+
+  void processMessage(e) {
+    if ('unittest-suite-external-error' == e.data) {
+      handleExternalError('<unknown>', '(external error detected)');
+    }
+  }
+
+  void onInit() {
+    _installHandlers();
+    //initialize and load CSS
+    final String _CSSID = '_unittestcss_';
+
+    var cssElement = document.head.querySelector('#${_CSSID}');
+    if (cssElement == null) {
+      cssElement = new StyleElement();
+      cssElement.id = _CSSID;
+      document.head.append(cssElement);
+    }
+
+    cssElement.text = _htmlTestCSS;
+    window.postMessage('unittest-suite-wait-for-done', '*');
+  }
+
+  void onStart() {
+    // Listen for uncaught errors.
+    _installOnErrorHandler();
+  }
+
+  void onSummary(int passed, int failed, int errors, List<TestCase> results,
+      String uncaughtError) {
+    _showInteractiveResultsInPage(
+        passed, failed, errors, results, _isLayoutTest, uncaughtError);
+  }
+
+  void onDone(bool success) {
+    _uninstallHandlers();
+    window.postMessage('unittest-suite-done', '*');
+  }
+
+  void _showInteractiveResultsInPage(int passed, int failed, int errors,
+      List<TestCase> results, bool isLayoutTest, String uncaughtError) {
+    if (isLayoutTest && passed == results.length) {
+      document.body.innerHtml = "PASS";
+    } else {
+      // changed the StringBuffer to an Element fragment
+      Element te = new Element.html('<div class="unittest-table"></div>');
+
+      te.children.add(new Element.html(passed == results.length
+          ? "<div class='unittest-overall unittest-pass'>PASS</div>"
+          : "<div class='unittest-overall unittest-fail'>FAIL</div>"));
+
+      // moved summary to the top since web browsers
+      // don't auto-scroll to the bottom like consoles typically do.
+      if (passed == results.length && uncaughtError == null) {
+        te.children.add(new Element.html("""
+          <div class='unittest-pass'>All ${passed} tests passed</div>"""));
+      } else {
+        if (uncaughtError != null) {
+          te.children.add(new Element.html("""
+            <div class='unittest-summary'>
+              <span class='unittest-error'>Uncaught error: $uncaughtError</span>
+            </div>"""));
+        }
+
+        te.children.add(new Element.html("""
+          <div class='unittest-summary'>
+            <span class='unittest-pass'>Total ${passed} passed</span>,
+            <span class='unittest-fail'>${failed} failed</span>,
+            <span class='unittest-error'>
+            ${errors + (uncaughtError == null ? 0 : 1)} errors</span>
+          </div>"""));
+      }
+
+      te.children.add(new Element.html("""
+        <div><button id='btnCollapseAll'>Collapse All</button></div>
+       """));
+
+      // handle the click event for the collapse all button
+      te.querySelector('#btnCollapseAll').onClick.listen((_) {
+        document
+            .querySelectorAll('.unittest-row')
+            .forEach((el) => el.attributes['class'] = el.attributes['class']
+                .replaceAll('unittest-row ', 'unittest-row-hidden '));
+      });
+
+      var previousGroup = '';
+      var groupPassFail = true;
+
+      // order by group and sort numerically within each group
+      var groupedBy = new LinkedHashMap<String, List<TestCase>>();
+
+      for (final t in results) {
+        if (!groupedBy.containsKey(t.currentGroup)) {
+          groupedBy[t.currentGroup] = new List<TestCase>();
+        }
+
+        groupedBy[t.currentGroup].add(t);
+      }
+
+      // flatten the list again with tests ordered
+      List<TestCase> flattened = new List<TestCase>();
+
+      groupedBy.values.forEach((tList) {
+        tList.sort((tcA, tcB) => tcA.id - tcB.id);
+        flattened.addAll(tList);
+      });
+
+      var nonAlphanumeric = new RegExp('[^a-z0-9A-Z]');
+
+      // output group headers and test rows
+      for (final test_ in flattened) {
+
+        // replace everything but numbers and letters from the group name with
+        // '_' so we can use in id and class properties.
+        var safeGroup = test_.currentGroup.replaceAll(nonAlphanumeric, '_');
+
+        if (test_.currentGroup != previousGroup) {
+          previousGroup = test_.currentGroup;
+
+          var testsInGroup = results
+              .where((TestCase t) => t.currentGroup == previousGroup)
+              .toList();
+          var groupTotalTestCount = testsInGroup.length;
+          var groupTestPassedCount =
+              testsInGroup.where((TestCase t) => t.result == 'pass').length;
+          groupPassFail = groupTotalTestCount == groupTestPassedCount;
+          var passFailClass = "unittest-group-status unittest-group-"
+              "status-${groupPassFail ? 'pass' : 'fail'}";
+
+          te.children.add(new Element.html("""
+            <div>
+              <div id='${safeGroup}'
+                   class='unittest-group ${safeGroup} test${safeGroup}'>
+                <div ${_isIE ? "style='display:inline-block' ": ""}
+                     class='unittest-row-status'>
+                  <div class='$passFailClass'></div>
+                </div>
+                <div ${_isIE ? "style='display:inline-block' ": ""}>
+                    ${test_.currentGroup}</div>
+                &nbsp;
+                <div ${_isIE ? "style='display:inline-block' ": ""}>
+                    (${groupTestPassedCount}/${groupTotalTestCount})</div>
+              </div>
+            </div>"""));
+
+          // 'safeGroup' could be empty
+          var grp =
+              (safeGroup == '') ? null : te.querySelector('#${safeGroup}');
+          if (grp != null) {
+            grp.onClick.listen((_) {
+              var row = document.querySelector('.unittest-row-${safeGroup}');
+              if (row.attributes['class'].contains('unittest-row ')) {
+                document.querySelectorAll('.unittest-row-${safeGroup}').forEach(
+                    (e) => e.attributes['class'] = e.attributes['class']
+                        .replaceAll('unittest-row ', 'unittest-row-hidden '));
+              } else {
+                document.querySelectorAll('.unittest-row-${safeGroup}').forEach(
+                    (e) => e.attributes['class'] = e.attributes['class']
+                        .replaceAll('unittest-row-hidden', 'unittest-row'));
+              }
+            });
+          }
+        }
+
+        _buildRow(test_, te, safeGroup, !groupPassFail);
+      }
+
+      document.body.children.clear();
+      document.body.children.add(te);
+    }
+  }
+
+  void _buildRow(TestCase test_, Element te, String groupID, bool isVisible) {
+    var background = 'unittest-row-${test_.id % 2 == 0 ? "even" : "odd"}';
+    var display = '${isVisible ? "unittest-row" : "unittest-row-hidden"}';
+
+    addRowElement(id, status, description) {
+      te.children.add(new Element.html(''' <div>
+                <div class='$display unittest-row-${groupID} $background'>
+                  <div ${_isIE ? "style='display:inline-block' ": ""}
+                       class='unittest-row-id'>$id</div>
+                  <div ${_isIE ? "style='display:inline-block' ": ""}
+                       class="unittest-row-status unittest-${test_.result}">
+                       $status</div>
+                  <div ${_isIE ? "style='display:inline-block' ": ""}
+                       class='unittest-row-description'>$description</div>
+                </div>
+              </div>'''));
+    }
+
+    if (!test_.isComplete) {
+      addRowElement('${test_.id}', 'NO STATUS', 'Test did not complete.');
+      return;
+    }
+
+    addRowElement('${test_.id}', '${test_.result.toUpperCase()}',
+        '${test_.description}. ${HTML_ESCAPE.convert(test_.message)}');
+
+    if (test_.stackTrace != null) {
+      addRowElement('', '',
+          '<pre>${HTML_ESCAPE.convert(test_.stackTrace.toString())}</pre>');
+    }
+  }
+
+  static bool get _isIE => window.navigator.userAgent.contains('MSIE');
+
+  String get _htmlTestCSS => '''
+  body{
+    font-size: 14px;
+    font-family: 'Open Sans', 'Lucida Sans Unicode', 'Lucida Grande','''
+      ''' sans-serif;
+    background: WhiteSmoke;
+  }
+
+  .unittest-group
+  {
+    background: rgb(75,75,75);
+    width:98%;
+    color: WhiteSmoke;
+    font-weight: bold;
+    padding: 6px;
+    cursor: pointer;
+
+    /* Provide some visual separation between groups for IE */
+    ${_isIE ? "border-bottom:solid black 1px;": ""}
+    ${_isIE ? "border-top:solid #777777 1px;": ""}
+
+    background-image: -webkit-linear-gradient(bottom, rgb(50,50,50) 0%, '''
+      '''rgb(100,100,100) 100%);
+    background-image: -moz-linear-gradient(bottom, rgb(50,50,50) 0%, '''
+      '''rgb(100,100,100) 100%);
+    background-image: -ms-linear-gradient(bottom, rgb(50,50,50) 0%, '''
+      '''rgb(100,100,100) 100%);
+    background-image: linear-gradient(bottom, rgb(50,50,50) 0%, '''
+      '''rgb(100,100,100) 100%);
+
+    display: -webkit-box;
+    display: -moz-box;
+    display: -ms-box;
+    display: box;
+
+    -webkit-box-orient: horizontal;
+    -moz-box-orient: horizontal;
+    -ms-box-orient: horizontal;
+    box-orient: horizontal;
+
+    -webkit-box-align: center;
+    -moz-box-align: center;
+    -ms-box-align: center;
+    box-align: center;
+   }
+
+  .unittest-group-status
+  {
+    width: 20px;
+    height: 20px;
+    border-radius: 20px;
+    margin-left: 10px;
+  }
+
+  .unittest-group-status-pass{
+    background: Green;
+    background: '''
+      '''-webkit-radial-gradient(center, ellipse cover, #AAFFAA 0%,Green 100%);
+    background: '''
+      '''-moz-radial-gradient(center, ellipse cover, #AAFFAA 0%,Green 100%);
+    background: '''
+      '''-ms-radial-gradient(center, ellipse cover, #AAFFAA 0%,Green 100%);
+    background: '''
+      '''radial-gradient(center, ellipse cover, #AAFFAA 0%,Green 100%);
+  }
+
+  .unittest-group-status-fail{
+    background: Red;
+    background: '''
+      '''-webkit-radial-gradient(center, ellipse cover, #FFAAAA 0%,Red 100%);
+    background: '''
+      '''-moz-radial-gradient(center, ellipse cover, #FFAAAA 0%,Red 100%);
+    background: '''
+      '''-ms-radial-gradient(center, ellipse cover, #AAFFAA 0%,Green 100%);
+    background: radial-gradient(center, ellipse cover, #FFAAAA 0%,Red 100%);
+  }
+
+  .unittest-overall{
+    font-size: 20px;
+  }
+
+  .unittest-summary{
+    font-size: 18px;
+  }
+
+  .unittest-pass{
+    color: Green;
+  }
+
+  .unittest-fail, .unittest-error
+  {
+    color: Red;
+  }
+
+  .unittest-row
+  {
+    display: -webkit-box;
+    display: -moz-box;
+    display: -ms-box;
+    display: box;
+    -webkit-box-orient: horizontal;
+    -moz-box-orient: horizontal;
+    -ms-box-orient: horizontal;
+    box-orient: horizontal;
+    width: 100%;
+  }
+
+  .unittest-row-hidden
+  {
+    display: none;
+  }
+
+  .unittest-row-odd
+  {
+    background: WhiteSmoke;
+  }
+
+  .unittest-row-even
+  {
+    background: #E5E5E5;
+  }
+
+  .unittest-row-id
+  {
+    width: 3em;
+  }
+
+  .unittest-row-status
+  {
+    width: 4em;
+  }
+
+  .unittest-row-description
+  {
+  }
+
+  ''';
+}
+
+void useHtmlEnhancedConfiguration([bool isLayoutTest = false]) {
+  unittestConfiguration = isLayoutTest ? _singletonLayout : _singletonNotLayout;
+}
+
+final _singletonLayout = new HtmlEnhancedConfiguration(true);
+final _singletonNotLayout = new HtmlEnhancedConfiguration(false);
diff --git a/mojo/public/dart/third_party/unittest/lib/html_individual_config.dart b/mojo/public/dart/third_party/unittest/lib/html_individual_config.dart
new file mode 100644
index 0000000..b9ec4e6
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/html_individual_config.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A unit test library for running groups of tests in a browser, instead of the
+/// entire test file. This is especially used for large tests files that have
+/// many subtests, so we can mark groups as failing at a finer granularity than
+/// the entire test file.
+///
+/// To use, import this file, and call [useHtmlIndividualConfiguration] at the
+/// start of your set sequence. Important constraint: your group descriptions
+/// MUST NOT contain spaces.
+library unittest.html_individual_config;
+
+import 'dart:html';
+import 'unittest.dart' as unittest;
+import 'html_config.dart' as htmlconfig;
+
+class HtmlIndividualConfiguration extends htmlconfig.HtmlConfiguration {
+  HtmlIndividualConfiguration(bool isLayoutTest) : super(isLayoutTest);
+
+  void onStart() {
+    var uri = Uri.parse(window.location.href);
+
+    var groups = 'group='.allMatches(uri.query).toList();
+
+    if (groups.length > 1) {
+      throw new ArgumentError('More than one "group" parameter provided.');
+    }
+
+    var testGroupName = uri.queryParameters['group'];
+
+    if (testGroupName != null) {
+      var startsWith = "$testGroupName${unittest.groupSep}";
+      unittest.filterTests(
+          (unittest.TestCase tc) => tc.description.startsWith(startsWith));
+    }
+    super.onStart();
+  }
+}
+
+void useHtmlIndividualConfiguration([bool isLayoutTest = false]) {
+  unittest.unittestConfiguration =
+      isLayoutTest ? _singletonLayout : _singletonNotLayout;
+}
+
+final _singletonLayout = new HtmlIndividualConfiguration(true);
+final _singletonNotLayout = new HtmlIndividualConfiguration(false);
diff --git a/mojo/public/dart/third_party/unittest/lib/src/configuration.dart b/mojo/public/dart/third_party/unittest/lib/src/configuration.dart
new file mode 100644
index 0000000..1aef043
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/configuration.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.configuration;
+
+import 'simple_configuration.dart';
+import 'test_case.dart';
+
+/// Describes the interface used by the unit test system for communicating the
+/// results of a test run.
+abstract class Configuration {
+  /// Creates an instance of [SimpleConfiguration].
+  factory Configuration() => new SimpleConfiguration();
+
+  /// Creates an [Configuration] instances that does nothing.
+  ///
+  /// For use by subclasses which wish to implement only a subset of features.
+  Configuration.blank();
+
+  /// If `true`, tests are started automatically once they're finished being defined.
+  ///
+  /// Otherwise, [runTests] must be called explicitly after tests are set up.
+  final autoStart = true;
+
+  /// How long a [TestCase] can run before it is considered an error.
+  /// A [timeout] value of [:null:] means that the limit is infinite.
+  Duration timeout = const Duration(minutes: 2);
+
+  /// Called as soon as the unittest framework becomes initialized.
+  ///
+  /// This is done even before tests are added to the test framework. It might
+  /// be used to determine/debug errors that occur before the test harness
+  /// starts executing. It is also used to tell the vm or browser that tests are
+  /// going to be run asynchronously and that the process should wait until they
+  /// are done.
+  void onInit() {}
+
+  /// Called as soon as the unittest framework starts running.
+  void onStart() {}
+
+  /// Called when each test starts. Useful to show intermediate progress on
+  /// a test suite.
+  void onTestStart(TestCase testCase) {}
+
+  /// Called when each test is first completed. Useful to show intermediate
+  /// progress on a test suite.
+  void onTestResult(TestCase testCase) {}
+
+  /// Called when an already completed test changes state. For example: a test
+  /// that was marked as passing may later be marked as being in error because
+  /// it still had callbacks being invoked.
+  void onTestResultChanged(TestCase testCase) {}
+
+  /// Handles the logging of messages by a test case.
+  void onLogMessage(TestCase testCase, String message) {}
+
+  /// Called when the unittest framework is done running. [success] indicates
+  /// whether all tests passed successfully.
+  void onDone(bool success) {}
+
+  /// Called with the result of all test cases. Browser tests commonly override
+  /// this to reformat the output.
+  ///
+  /// When [uncaughtError] is not null, it contains an error that occured outside
+  /// of tests (e.g. setting up the test).
+  void onSummary(int passed, int failed, int errors, List<TestCase> results,
+      String uncaughtError) {}
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/src/expected_function.dart b/mojo/public/dart/third_party/unittest/lib/src/expected_function.dart
new file mode 100644
index 0000000..7373c75
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/expected_function.dart
@@ -0,0 +1,203 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.expected_function;
+
+import '../unittest.dart';
+
+import 'internal_test_case.dart';
+
+/// An object used to detect unpassed arguments.
+const _PLACEHOLDER = const Object();
+
+// Functions used to check how many arguments a callback takes.
+typedef _Func0();
+typedef _Func1(a);
+typedef _Func2(a, b);
+typedef _Func3(a, b, c);
+typedef _Func4(a, b, c, d);
+typedef _Func5(a, b, c, d, e);
+typedef _Func6(a, b, c, d, e, f);
+
+typedef bool _IsDoneCallback();
+
+/// A wrapper for a function that ensures that it's called the appropriate
+/// number of times.
+///
+/// The containing test won't be considered to have completed successfully until
+/// this function has been called the appropriate number of times.
+///
+/// The wrapper function is accessible via [func]. It supports up to six
+/// optional and/or required positional arguments, but no named arguments.
+class ExpectedFunction {
+  /// The wrapped callback.
+  final Function _callback;
+
+  /// The minimum number of calls that are expected to be made to the function.
+  ///
+  /// If fewer calls than this are made, the test will fail.
+  final int _minExpectedCalls;
+
+  /// The maximum number of calls that are expected to be made to the function.
+  ///
+  /// If more calls than this are made, the test will fail.
+  final int _maxExpectedCalls;
+
+  /// A callback that should return whether the function is not expected to have
+  /// any more calls.
+  ///
+  /// This will be called after every time the function is run. The test case
+  /// won't be allowed to terminate until it returns `true`.
+  ///
+  /// This may be `null`. If so, the function is considered to be done after
+  /// it's been run once.
+  final _IsDoneCallback _isDone;
+
+  /// A descriptive name for the function.
+  final String _id;
+
+  /// An optional description of why the function is expected to be called.
+  ///
+  /// If not passed, this will be an empty string.
+  final String _reason;
+
+  /// The number of times the function has been called.
+  int _actualCalls = 0;
+
+  /// The test case in which this function was wrapped.
+  final InternalTestCase _testCase;
+
+  /// Whether this function has been called the requisite number of times.
+  bool _complete;
+
+  /// Wraps [callback] in a function that asserts that it's called at least
+  /// [minExpected] times and no more than [maxExpected] times.
+  ///
+  /// If passed, [id] is used as a descriptive name fo the function and [reason]
+  /// as a reason it's expected to be called. If [isDone] is passed, the test
+  /// won't be allowed to complete until it returns `true`.
+  ExpectedFunction(Function callback, int minExpected, int maxExpected,
+      {String id, String reason, bool isDone()})
+      : this._callback = callback,
+        _minExpectedCalls = minExpected,
+        _maxExpectedCalls = (maxExpected == 0 && minExpected > 0)
+            ? minExpected
+            : maxExpected,
+        this._isDone = isDone,
+        this._reason = reason == null ? '' : '\n$reason',
+        this._testCase = currentTestCase as InternalTestCase,
+        this._id = _makeCallbackId(id, callback) {
+    ensureInitialized();
+    if (_testCase == null) {
+      throw new StateError("No valid test. Did you forget to run your test "
+          "inside a call to test()?");
+    }
+
+    if (isDone != null || minExpected > 0) {
+      _testCase.callbackFunctionsOutstanding++;
+      _complete = false;
+    } else {
+      _complete = true;
+    }
+  }
+
+  /// Tries to find a reasonable name for [callback].
+  ///
+  /// If [id] is passed, uses that. Otherwise, tries to determine a name from
+  /// calling `toString`. If no name can be found, returns the empty string.
+  static String _makeCallbackId(String id, Function callback) {
+    if (id != null) return "$id ";
+
+    // If the callback is not an anonymous closure, try to get the
+    // name.
+    var toString = callback.toString();
+    var prefix = "Function '";
+    var start = toString.indexOf(prefix);
+    if (start == -1) return '';
+
+    start += prefix.length;
+    var end = toString.indexOf("'", start);
+    if (end == -1) return '';
+    return "${toString.substring(start, end)} ";
+  }
+
+  /// Returns a function that has the same number of positional arguments as the
+  /// wrapped function (up to a total of 6).
+  Function get func {
+    if (_callback is _Func6) return _max6;
+    if (_callback is _Func5) return _max5;
+    if (_callback is _Func4) return _max4;
+    if (_callback is _Func3) return _max3;
+    if (_callback is _Func2) return _max2;
+    if (_callback is _Func1) return _max1;
+    if (_callback is _Func0) return _max0;
+
+    throw new ArgumentError(
+        'The wrapped function has more than 6 required arguments');
+  }
+
+  // This indirection is critical. It ensures the returned function has an
+  // argument count of zero.
+  _max0() => _max6();
+
+  _max1([a0 = _PLACEHOLDER]) => _max6(a0);
+
+  _max2([a0 = _PLACEHOLDER, a1 = _PLACEHOLDER]) => _max6(a0, a1);
+
+  _max3([a0 = _PLACEHOLDER, a1 = _PLACEHOLDER, a2 = _PLACEHOLDER]) =>
+      _max6(a0, a1, a2);
+
+  _max4([a0 = _PLACEHOLDER, a1 = _PLACEHOLDER, a2 = _PLACEHOLDER,
+      a3 = _PLACEHOLDER]) => _max6(a0, a1, a2, a3);
+
+  _max5([a0 = _PLACEHOLDER, a1 = _PLACEHOLDER, a2 = _PLACEHOLDER,
+      a3 = _PLACEHOLDER, a4 = _PLACEHOLDER]) => _max6(a0, a1, a2, a3, a4);
+
+  _max6([a0 = _PLACEHOLDER, a1 = _PLACEHOLDER, a2 = _PLACEHOLDER,
+      a3 = _PLACEHOLDER, a4 = _PLACEHOLDER, a5 = _PLACEHOLDER]) =>
+      _run([a0, a1, a2, a3, a4, a5].where((a) => a != _PLACEHOLDER));
+
+  /// Runs the wrapped function with [args] and returns its return value.
+  ///
+  /// This will pass any errors on to [_testCase] and return `null`.
+  _run(Iterable args) {
+    try {
+      _actualCalls++;
+      if (_testCase.isComplete) {
+        // Don't run the callback if the test is done. We don't throw here as
+        // this is not the current test, but we do mark the old test as having
+        // an error if it previously passed.
+        if (_testCase.result == PASS) {
+          _testCase.error(
+              'Callback ${_id}called ($_actualCalls) after test case '
+              '${_testCase.description} had already been marked as '
+              '${_testCase.result}.$_reason');
+        }
+        return null;
+      } else if (_maxExpectedCalls >= 0 && _actualCalls > _maxExpectedCalls) {
+        throw new TestFailure('Callback ${_id}called more times than expected '
+                              '($_maxExpectedCalls).$_reason');
+      }
+
+      return Function.apply(_callback, args.toList());
+    } catch (error, stackTrace) {
+      _testCase.registerException(error, stackTrace);
+      return null;
+    } finally {
+      _afterRun();
+    }
+  }
+
+  /// After each time the function is run, check to see if it's complete.
+  void _afterRun() {
+    if (_complete) return;
+    if (_minExpectedCalls > 0 && _actualCalls < _minExpectedCalls) return;
+    if (_isDone != null && !_isDone()) return;
+
+    // Mark this callback as complete and remove it from the test case's
+    // oustanding callback count; if that hits zero the test is done.
+    _complete = true;
+    _testCase.markCallbackComplete();
+  }
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/src/group_context.dart b/mojo/public/dart/third_party/unittest/lib/src/group_context.dart
new file mode 100644
index 0000000..78f347b
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/group_context.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.group_context;
+
+import 'dart:async';
+
+import '../unittest.dart';
+
+/// Setup and teardown functions for a group and its parents, the latter
+/// for chaining.
+class GroupContext {
+  /// The parent context, or `null`.
+  final GroupContext parent;
+
+  /// Whether this is the root context.
+  bool get isRoot => parent == null;
+
+  /// Description text of the current test group.
+  final String _name;
+
+  /// The set-up function called before each test in a group.
+  Function get testSetUp => _testSetUp;
+  Function _testSetUp;
+
+  set testSetUp(Function setUp) {
+    if (parent == null || parent.testSetUp == null) {
+      _testSetUp = setUp;
+      return;
+    }
+
+    _testSetUp = () {
+      var f = parent.testSetUp();
+      if (f is Future) {
+        return f.then((_) => setUp());
+      } else {
+        return setUp();
+      }
+    };
+  }
+
+  /// The tear-down function called after each test in a group.
+  Function get testTearDown => _testTearDown;
+  Function _testTearDown;
+
+  set testTearDown(Function tearDown) {
+    if (parent == null || parent.testTearDown == null) {
+      _testTearDown = tearDown;
+      return;
+    }
+
+    _testTearDown = () {
+      var f = tearDown();
+      if (f is Future) {
+        return f.then((_) => parent.testTearDown());
+      } else {
+        return parent.testTearDown();
+      }
+    };
+  }
+
+  /// Returns the fully-qualified name of this context.
+  String get fullName =>
+      (isRoot || parent.isRoot) ? _name : "${parent.fullName}$groupSep$_name";
+
+  GroupContext.root()
+      : parent = null,
+        _name = '';
+
+  GroupContext(this.parent, this._name) {
+    _testSetUp = parent.testSetUp;
+    _testTearDown = parent.testTearDown;
+  }
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/src/internal_test_case.dart b/mojo/public/dart/third_party/unittest/lib/src/internal_test_case.dart
new file mode 100644
index 0000000..9763666
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/internal_test_case.dart
@@ -0,0 +1,227 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.internal_test_case;
+
+import 'dart:async';
+
+import '../unittest.dart';
+import 'test_environment.dart';
+import 'utils.dart';
+
+/// An implementation of [TestCase] that exposes internal properties for other
+/// unittest use.
+class InternalTestCase implements TestCase {
+  final int id;
+  final String description;
+
+  /// The setup function to call before the test, if any.
+  Function _setUp;
+
+  /// The teardown function to call after the test, if any.
+  Function _tearDown;
+
+  /// The body of the test case.
+  TestFunction _testFunction;
+
+  /// Remaining number of callback functions that must reach a 'done' state
+  /// before the test completes.
+  int callbackFunctionsOutstanding = 0;
+
+  /// The error or failure message for the tests.
+  ///
+  /// Initially an empty string.
+  String message = '';
+
+  /// The result of the test case.
+  ///
+  /// If the test case has is completed, this will be one of [PASS], [FAIL], or
+  /// [ERROR]. Otherwise, it will be `null`.
+  String result;
+
+  /// Returns whether this test case passed.
+  bool get passed => result == PASS;
+
+  /// The stack trace for the error that caused this test case to fail, or
+  /// `null` if it succeeded.
+  StackTrace stackTrace;
+
+  /// The name of the group within which this test is running.
+  final String currentGroup;
+
+  /// The time the test case started running.
+  ///
+  /// `null` if the test hasn't yet begun running.
+  DateTime get startTime => _startTime;
+  DateTime _startTime;
+
+  /// The amount of time the test case took.
+  ///
+  /// `null` if the test hasn't finished running.
+  Duration get runningTime => _runningTime;
+  Duration _runningTime;
+
+  /// Whether this test is enabled.
+  ///
+  /// Disabled tests won't be run.
+  bool enabled = true;
+
+  /// A completer that will complete when the test is finished.
+  ///
+  /// This is only non-`null` when outstanding callbacks exist.
+  Completer _testComplete;
+
+  /// Whether this test case has finished running.
+  bool get isComplete => !enabled || result != null;
+
+  InternalTestCase(this.id, this.description, this._testFunction)
+      : currentGroup = environment.currentContext.fullName,
+        _setUp = environment.currentContext.testSetUp,
+        _tearDown = environment.currentContext.testTearDown;
+
+  /// A function that returns another function to handle errors from [Future]s.
+  ///
+  /// [stage] is a string description of the stage of testing that failed.
+  Function _errorHandler(String stage) => (e, stack) {
+    if (stack == null && e is Error) {
+      stack = e.stackTrace;
+    }
+    if (result == null || result == PASS) {
+      if (e is TestFailure) {
+        fail("$e", stack);
+      } else {
+        error("$stage failed: Caught $e", stack);
+      }
+    }
+  };
+
+  /// Performs any associated [_setUp] function and runs the test.
+  ///
+  /// Returns a [Future] that can be used to schedule the next test. If the test
+  /// runs to completion synchronously, or is disabled, null is returned, to
+  /// tell unittest to schedule the next test immediately.
+  Future run() {
+    if (!enabled) return new Future.value();
+
+    result = stackTrace = null;
+    message = '';
+
+    // Avoid calling [new Future] to avoid issue 11911.
+    return new Future.value().then((_) {
+      if (_setUp != null) return _setUp();
+    }).catchError(_errorHandler('Setup')).then((_) {
+      // Skip the test if setup failed.
+      if (result != null) return new Future.value();
+      config.onTestStart(this);
+      _startTime = new DateTime.now();
+      _runningTime = null;
+      callbackFunctionsOutstanding++;
+      var testReturn = _testFunction();
+      // If _testFunction() returned a future, we want to wait for it like we
+      // would a callback, so if a failure occurs while waiting, we can abort.
+      if (testReturn is Future) {
+        callbackFunctionsOutstanding++;
+        testReturn
+            .catchError(_errorHandler('Test'))
+            .whenComplete(markCallbackComplete);
+      }
+    }).catchError(_errorHandler('Test')).then((_) {
+      markCallbackComplete();
+      if (result == null) {
+        // Outstanding callbacks exist; we need to return a Future.
+        _testComplete = new Completer();
+        return _testComplete.future.whenComplete(() {
+          if (_tearDown != null) {
+            return _tearDown();
+          }
+        }).catchError(_errorHandler('Teardown'));
+      } else if (_tearDown != null) {
+        return _tearDown();
+      }
+    }).catchError(_errorHandler('Teardown')).whenComplete(() {
+      _setUp = null;
+      _tearDown = null;
+      _testFunction = null;
+    });
+  }
+
+  /// Marks the test as having completed with [testResult], which should be one
+  /// of [PASS], [FAIL], or [ERROR].
+  void _complete(String testResult,
+      [String messageText = '', StackTrace stack]) {
+    if (runningTime == null) {
+      // The startTime can be `null` if an error happened during setup. In this
+      // case we simply report a running time of 0.
+      if (startTime != null) {
+        _runningTime = new DateTime.now().difference(startTime);
+      } else {
+        _runningTime = const Duration(seconds: 0);
+      }
+    }
+    _setResult(testResult, messageText, stack);
+    if (_testComplete != null) {
+      var t = _testComplete;
+      _testComplete = null;
+      t.complete(this);
+    }
+  }
+
+  // Sets [this]'s fields to reflect the test result, and notifies the current
+  // configuration that the test has completed.
+  //
+  // Returns true if this is the first time the result has been set.
+  void _setResult(String testResult, String messageText, StackTrace stack) {
+    message = messageText;
+    stackTrace = getTrace(stack, formatStacks, filterStacks);
+    if (stackTrace == null) stackTrace = stack;
+    if (result == null) {
+      result = testResult;
+      config.onTestResult(this);
+    } else {
+      result = testResult;
+      config.onTestResultChanged(this);
+    }
+  }
+
+  /// Marks the test as having passed.
+  void pass() {
+    _complete(PASS);
+  }
+
+  void registerException(error, [StackTrace stackTrace]) {
+    var message = error is TestFailure ? error.message : 'Caught $error';
+    if (result == null) {
+      fail(message, stackTrace);
+    } else {
+      this.error(message, stackTrace);
+    }
+  }
+
+  /// Marks the test as having failed.
+  void fail(String messageText, [StackTrace stack]) {
+    if (result != null) {
+      var newMessage = result == PASS
+          ? 'Test failed after initially passing: $messageText'
+          : 'Test failed more than once: $messageText';
+      // TODO(gram): Should we combine the stack with the old one?
+      _complete(ERROR, newMessage, stack);
+    } else {
+      _complete(FAIL, messageText, stack);
+    }
+  }
+
+  /// Marks the test as having had an unexpected error.
+  void error(String messageText, [StackTrace stack]) {
+    _complete(ERROR, messageText, stack);
+  }
+
+  /// Indicates that an asynchronous callback has completed, and marks the test
+  /// as passing if all outstanding callbacks are complete.
+  void markCallbackComplete() {
+    callbackFunctionsOutstanding--;
+    if (callbackFunctionsOutstanding == 0 && !isComplete) pass();
+  }
+
+  String toString() => result != null ? "$description: $result" : description;
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/src/matcher.dart b/mojo/public/dart/third_party/unittest/lib/src/matcher.dart
new file mode 100644
index 0000000..cfd5857
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/matcher.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Support for specifying test expectations, such as for unit tests.
+library unittest.matcher;
+
+export 'matcher/core_matchers.dart';
+export 'matcher/description.dart';
+export 'matcher/error_matchers.dart';
+export 'matcher/expect.dart';
+export 'matcher/future_matchers.dart';
+export 'matcher/interfaces.dart';
+export 'matcher/iterable_matchers.dart';
+export 'matcher/map_matchers.dart';
+export 'matcher/numeric_matchers.dart';
+export 'matcher/operator_matchers.dart';
+export 'matcher/prints_matcher.dart';
+export 'matcher/string_matchers.dart';
+export 'matcher/throws_matcher.dart';
+export 'matcher/throws_matchers.dart';
+export 'matcher/util.dart';
diff --git a/mojo/public/dart/third_party/unittest/lib/src/matcher/core_matchers.dart b/mojo/public/dart/third_party/unittest/lib/src/matcher/core_matchers.dart
new file mode 100644
index 0000000..dbba367
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/matcher/core_matchers.dart
@@ -0,0 +1,645 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.core_matchers;
+
+import 'description.dart';
+import 'interfaces.dart';
+import 'util.dart';
+
+/// Returns a matcher that matches the isEmpty property.
+const Matcher isEmpty = const _Empty();
+
+class _Empty extends Matcher {
+  const _Empty();
+
+  bool matches(item, Map matchState) => item.isEmpty;
+
+  Description describe(Description description) => description.add('empty');
+}
+
+/// Returns a matcher that matches the isNotEmpty property.
+const Matcher isNotEmpty = const _NotEmpty();
+
+class _NotEmpty extends Matcher {
+  const _NotEmpty();
+
+  bool matches(item, Map matchState) => item.isNotEmpty;
+
+  Description describe(Description description) => description.add('non-empty');
+}
+
+/// A matcher that matches any null value.
+const Matcher isNull = const _IsNull();
+
+/// A matcher that matches any non-null value.
+const Matcher isNotNull = const _IsNotNull();
+
+class _IsNull extends Matcher {
+  const _IsNull();
+  bool matches(item, Map matchState) => item == null;
+  Description describe(Description description) => description.add('null');
+}
+
+class _IsNotNull extends Matcher {
+  const _IsNotNull();
+  bool matches(item, Map matchState) => item != null;
+  Description describe(Description description) => description.add('not null');
+}
+
+/// A matcher that matches the Boolean value true.
+const Matcher isTrue = const _IsTrue();
+
+/// A matcher that matches anything except the Boolean value true.
+const Matcher isFalse = const _IsFalse();
+
+class _IsTrue extends Matcher {
+  const _IsTrue();
+  bool matches(item, Map matchState) => item == true;
+  Description describe(Description description) => description.add('true');
+}
+
+class _IsFalse extends Matcher {
+  const _IsFalse();
+  bool matches(item, Map matchState) => item == false;
+  Description describe(Description description) => description.add('false');
+}
+
+/// A matcher that matches the numeric value NaN.
+const Matcher isNaN = const _IsNaN();
+
+/// A matcher that matches any non-NaN value.
+const Matcher isNotNaN = const _IsNotNaN();
+
+class _IsNaN extends Matcher {
+  const _IsNaN();
+  bool matches(item, Map matchState) => double.NAN.compareTo(item) == 0;
+  Description describe(Description description) => description.add('NaN');
+}
+
+class _IsNotNaN extends Matcher {
+  const _IsNotNaN();
+  bool matches(item, Map matchState) => double.NAN.compareTo(item) != 0;
+  Description describe(Description description) => description.add('not NaN');
+}
+
+/// Returns a matches that matches if the value is the same instance
+/// as [expected], using [identical].
+Matcher same(expected) => new _IsSameAs(expected);
+
+class _IsSameAs extends Matcher {
+  final _expected;
+  const _IsSameAs(this._expected);
+  bool matches(item, Map matchState) => identical(item, _expected);
+  // If all types were hashable we could show a hash here.
+  Description describe(Description description) =>
+      description.add('same instance as ').addDescriptionOf(_expected);
+}
+
+/// Returns a matcher that matches if the value is structurally equal to
+/// [expected].
+///
+/// If [expected] is a [Matcher], then it matches using that. Otherwise it tests
+/// for equality using `==` on the expected value.
+///
+/// For [Iterable]s and [Map]s, this will recursively match the elements. To
+/// handle cyclic structures a recursion depth [limit] can be provided. The
+/// default limit is 100. [Set]s will be compared order-independently.
+Matcher equals(expected, [int limit = 100]) => expected is String
+    ? new _StringEqualsMatcher(expected)
+    : new _DeepMatcher(expected, limit);
+
+class _DeepMatcher extends Matcher {
+  final _expected;
+  final int _limit;
+  var count;
+
+  _DeepMatcher(this._expected, [int limit = 1000]) : this._limit = limit;
+
+  // Returns a pair (reason, location)
+  List _compareIterables(expected, actual, matcher, depth, location) {
+    if (actual is! Iterable) return ['is not Iterable', location];
+
+    var expectedIterator = expected.iterator;
+    var actualIterator = actual.iterator;
+    for (var index = 0; ; index++) {
+      // Advance in lockstep.
+      var expectedNext = expectedIterator.moveNext();
+      var actualNext = actualIterator.moveNext();
+
+      // If we reached the end of both, we succeeded.
+      if (!expectedNext && !actualNext) return null;
+
+      // Fail if their lengths are different.
+      var newLocation = '${location}[${index}]';
+      if (!expectedNext) return ['longer than expected', newLocation];
+      if (!actualNext) return ['shorter than expected', newLocation];
+
+      // Match the elements.
+      var rp = matcher(
+          expectedIterator.current, actualIterator.current, newLocation, depth);
+      if (rp != null) return rp;
+    }
+  }
+
+  List _compareSets(Set expected, actual, matcher, depth, location) {
+    if (actual is! Iterable) return ['is not Iterable', location];
+    actual = actual.toSet();
+
+    for (var expectedElement in expected) {
+      if (actual.every((actualElement) =>
+          matcher(expectedElement, actualElement, location, depth) != null)) {
+        return ['does not contain $expectedElement', location];
+      }
+    }
+
+    if (actual.length > expected.length) {
+      return ['larger than expected', location];
+    } else if (actual.length < expected.length) {
+      return ['smaller than expected', location];
+    } else {
+      return null;
+    }
+  }
+
+  List _recursiveMatch(expected, actual, String location, int depth) {
+    // If the expected value is a matcher, try to match it.
+    if (expected is Matcher) {
+      var matchState = {};
+      if (expected.matches(actual, matchState)) return null;
+
+      var description = new StringDescription();
+      expected.describe(description);
+      return ['does not match $description', location];
+    } else {
+      // Otherwise, test for equality.
+      try {
+        if (expected == actual) return null;
+      } catch (e) {
+        // TODO(gram): Add a test for this case.
+        return ['== threw "$e"', location];
+      }
+    }
+
+    if (depth > _limit) return ['recursion depth limit exceeded', location];
+
+    // If _limit is 1 we can only recurse one level into object.
+    if (depth == 0 || _limit > 1) {
+      if (expected is Set) {
+        return _compareSets(
+            expected, actual, _recursiveMatch, depth + 1, location);
+      } else if (expected is Iterable) {
+        return _compareIterables(
+            expected, actual, _recursiveMatch, depth + 1, location);
+      } else if (expected is Map) {
+        if (actual is! Map) return ['expected a map', location];
+
+        var err = (expected.length == actual.length)
+            ? ''
+            : 'has different length and ';
+        for (var key in expected.keys) {
+          if (!actual.containsKey(key)) {
+            return ["${err}is missing map key '$key'", location];
+          }
+        }
+
+        for (var key in actual.keys) {
+          if (!expected.containsKey(key)) {
+            return ["${err}has extra map key '$key'", location];
+          }
+        }
+
+        for (var key in expected.keys) {
+          var rp = _recursiveMatch(
+              expected[key], actual[key], "${location}['${key}']", depth + 1);
+          if (rp != null) return rp;
+        }
+
+        return null;
+      }
+    }
+
+    var description = new StringDescription();
+
+    // If we have recursed, show the expected value too; if not, expect() will
+    // show it for us.
+    if (depth > 0) {
+      description
+          .add('was ')
+          .addDescriptionOf(actual)
+          .add(' instead of ')
+          .addDescriptionOf(expected);
+      return [description.toString(), location];
+    }
+
+    // We're not adding any value to the actual value.
+    return ["", location];
+  }
+
+  String _match(expected, actual, Map matchState) {
+    var rp = _recursiveMatch(expected, actual, '', 0);
+    if (rp == null) return null;
+    var reason;
+    if (rp[0].length > 0) {
+      if (rp[1].length > 0) {
+        reason = "${rp[0]} at location ${rp[1]}";
+      } else {
+        reason = rp[0];
+      }
+    } else {
+      reason = '';
+    }
+    // Cache the failure reason in the matchState.
+    addStateInfo(matchState, {'reason': reason});
+    return reason;
+  }
+
+  bool matches(item, Map matchState) =>
+      _match(_expected, item, matchState) == null;
+
+  Description describe(Description description) =>
+      description.addDescriptionOf(_expected);
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    var reason = matchState['reason'];
+    // If we didn't get a good reason, that would normally be a
+    // simple 'is <value>' message. We only add that if the mismatch
+    // description is non empty (so we are supplementing the mismatch
+    // description).
+    if (reason.length == 0 && mismatchDescription.length > 0) {
+      mismatchDescription.add('is ').addDescriptionOf(item);
+    } else {
+      mismatchDescription.add(reason);
+    }
+    return mismatchDescription;
+  }
+}
+
+/// A special equality matcher for strings.
+class _StringEqualsMatcher extends Matcher {
+  final String _value;
+
+  _StringEqualsMatcher(this._value);
+
+  bool get showActualValue => true;
+
+  bool matches(item, Map matchState) => _value == item;
+
+  Description describe(Description description) =>
+      description.addDescriptionOf(_value);
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (item is! String) {
+      return mismatchDescription.addDescriptionOf(item).add('is not a string');
+    } else {
+      var buff = new StringBuffer();
+      buff.write('is different.');
+      var escapedItem = escape(item);
+      var escapedValue = escape(_value);
+      int minLength = escapedItem.length < escapedValue.length
+          ? escapedItem.length
+          : escapedValue.length;
+      int start;
+      for (start = 0; start < minLength; start++) {
+        if (escapedValue.codeUnitAt(start) != escapedItem.codeUnitAt(start)) {
+          break;
+        }
+      }
+      if (start == minLength) {
+        if (escapedValue.length < escapedItem.length) {
+          buff.write(' Both strings start the same, but the given value also'
+              ' has the following trailing characters: ');
+          _writeTrailing(buff, escapedItem, escapedValue.length);
+        } else {
+          buff.write(' Both strings start the same, but the given value is'
+              ' missing the following trailing characters: ');
+          _writeTrailing(buff, escapedValue, escapedItem.length);
+        }
+      } else {
+        buff.write('\nExpected: ');
+        _writeLeading(buff, escapedValue, start);
+        _writeTrailing(buff, escapedValue, start);
+        buff.write('\n  Actual: ');
+        _writeLeading(buff, escapedItem, start);
+        _writeTrailing(buff, escapedItem, start);
+        buff.write('\n          ');
+        for (int i = (start > 10 ? 14 : start); i > 0; i--) buff.write(' ');
+        buff.write('^\n Differ at offset $start');
+      }
+
+      return mismatchDescription.replace(buff.toString());
+    }
+  }
+
+  static void _writeLeading(StringBuffer buff, String s, int start) {
+    if (start > 10) {
+      buff.write('... ');
+      buff.write(s.substring(start - 10, start));
+    } else {
+      buff.write(s.substring(0, start));
+    }
+  }
+
+  static void _writeTrailing(StringBuffer buff, String s, int start) {
+    if (start + 10 > s.length) {
+      buff.write(s.substring(start));
+    } else {
+      buff.write(s.substring(start, start + 10));
+      buff.write(' ...');
+    }
+  }
+}
+
+/// A matcher that matches any value.
+const Matcher anything = const _IsAnything();
+
+class _IsAnything extends Matcher {
+  const _IsAnything();
+  bool matches(item, Map matchState) => true;
+  Description describe(Description description) => description.add('anything');
+}
+
+/// Returns a matcher that matches if an object is an instance
+/// of [type] (or a subtype).
+///
+/// As types are not first class objects in Dart we can only
+/// approximate this test by using a generic wrapper class.
+///
+/// For example, to test whether 'bar' is an instance of type
+/// 'Foo', we would write:
+///
+///     expect(bar, new isInstanceOf<Foo>());
+class isInstanceOf<T> extends Matcher {
+  /// The [name] parameter does nothing; it's deprecated and will be removed in
+  /// future version of [matcher].
+  const isInstanceOf([@deprecated String name]);
+
+  bool matches(obj, Map matchState) => obj is T;
+
+  Description describe(Description description) =>
+      description.add('an instance of $T');
+}
+
+/// A matcher that matches a function call against no exception.
+///
+/// The function will be called once. Any exceptions will be silently swallowed.
+/// The value passed to expect() should be a reference to the function.
+/// Note that the function cannot take arguments; to handle this
+/// a wrapper will have to be created.
+const Matcher returnsNormally = const _ReturnsNormally();
+
+class _ReturnsNormally extends Matcher {
+  const _ReturnsNormally();
+
+  bool matches(f, Map matchState) {
+    try {
+      f();
+      return true;
+    } catch (e, s) {
+      addStateInfo(matchState, {'exception': e, 'stack': s});
+      return false;
+    }
+  }
+
+  Description describe(Description description) =>
+      description.add("return normally");
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    mismatchDescription.add('threw ').addDescriptionOf(matchState['exception']);
+    if (verbose) {
+      mismatchDescription.add(' at ').add(matchState['stack'].toString());
+    }
+    return mismatchDescription;
+  }
+}
+
+/*
+ * Matchers for different exception types. Ideally we should just be able to
+ * use something like:
+ *
+ * final Matcher throwsException =
+ *     const _Throws(const isInstanceOf<Exception>());
+ *
+ * Unfortunately instanceOf is not working with dart2js.
+ *
+ * Alternatively, if static functions could be used in const expressions,
+ * we could use:
+ *
+ * bool _isException(x) => x is Exception;
+ * final Matcher isException = const _Predicate(_isException, "Exception");
+ * final Matcher throwsException = const _Throws(isException);
+ *
+ * But currently using static functions in const expressions is not supported.
+ * For now the only solution for all platforms seems to be separate classes
+ * for each exception type.
+ */
+
+abstract class TypeMatcher extends Matcher {
+  final String _name;
+  const TypeMatcher(this._name);
+  Description describe(Description description) => description.add(_name);
+}
+
+/// A matcher for Map types.
+const Matcher isMap = const _IsMap();
+
+class _IsMap extends TypeMatcher {
+  const _IsMap() : super("Map");
+  bool matches(item, Map matchState) => item is Map;
+}
+
+/// A matcher for List types.
+const Matcher isList = const _IsList();
+
+class _IsList extends TypeMatcher {
+  const _IsList() : super("List");
+  bool matches(item, Map matchState) => item is List;
+}
+
+/// Returns a matcher that matches if an object has a length property
+/// that matches [matcher].
+Matcher hasLength(matcher) => new _HasLength(wrapMatcher(matcher));
+
+class _HasLength extends Matcher {
+  final Matcher _matcher;
+  const _HasLength([Matcher matcher = null]) : this._matcher = matcher;
+
+  bool matches(item, Map matchState) {
+    try {
+      // This is harmless code that will throw if no length property
+      // but subtle enough that an optimizer shouldn't strip it out.
+      if (item.length * item.length >= 0) {
+        return _matcher.matches(item.length, matchState);
+      }
+    } catch (e) {}
+    return false;
+  }
+
+  Description describe(Description description) =>
+      description.add('an object with length of ').addDescriptionOf(_matcher);
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    try {
+      // We want to generate a different description if there is no length
+      // property; we use the same trick as in matches().
+      if (item.length * item.length >= 0) {
+        return mismatchDescription
+            .add('has length of ')
+            .addDescriptionOf(item.length);
+      }
+    } catch (e) {}
+    return mismatchDescription.add('has no length property');
+  }
+}
+
+/// Returns a matcher that matches if the match argument contains the expected
+/// value.
+///
+/// For [String]s this means substring matching;
+/// for [Map]s it means the map has the key, and for [Iterable]s
+/// it means the iterable has a matching element. In the case of iterables,
+/// [expected] can itself be a matcher.
+Matcher contains(expected) => new _Contains(expected);
+
+class _Contains extends Matcher {
+  final _expected;
+
+  const _Contains(this._expected);
+
+  bool matches(item, Map matchState) {
+    if (item is String) {
+      return item.indexOf(_expected) >= 0;
+    } else if (item is Iterable) {
+      if (_expected is Matcher) {
+        return item.any((e) => _expected.matches(e, matchState));
+      } else {
+        return item.contains(_expected);
+      }
+    } else if (item is Map) {
+      return item.containsKey(_expected);
+    }
+    return false;
+  }
+
+  Description describe(Description description) =>
+      description.add('contains ').addDescriptionOf(_expected);
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (item is String || item is Iterable || item is Map) {
+      return super.describeMismatch(
+          item, mismatchDescription, matchState, verbose);
+    } else {
+      return mismatchDescription.add('is not a string, map or iterable');
+    }
+  }
+}
+
+/// Returns a matcher that matches if the match argument is in
+/// the expected value. This is the converse of [contains].
+Matcher isIn(expected) => new _In(expected);
+
+class _In extends Matcher {
+  final _expected;
+
+  const _In(this._expected);
+
+  bool matches(item, Map matchState) {
+    if (_expected is String) {
+      return _expected.indexOf(item) >= 0;
+    } else if (_expected is Iterable) {
+      return _expected.any((e) => e == item);
+    } else if (_expected is Map) {
+      return _expected.containsKey(item);
+    }
+    return false;
+  }
+
+  Description describe(Description description) =>
+      description.add('is in ').addDescriptionOf(_expected);
+}
+
+/// Returns a matcher that uses an arbitrary function that returns
+/// true or false for the actual value.
+///
+/// For example:
+///
+///     expect(v, predicate((x) => ((x % 2) == 0), "is even"))
+Matcher predicate(bool f(value), [String description = 'satisfies function']) =>
+    new _Predicate(f, description);
+
+typedef bool _PredicateFunction(value);
+
+class _Predicate extends Matcher {
+  final _PredicateFunction _matcher;
+  final String _description;
+
+  const _Predicate(this._matcher, this._description);
+
+  bool matches(item, Map matchState) => _matcher(item);
+
+  Description describe(Description description) =>
+      description.add(_description);
+}
+
+/// A useful utility class for implementing other matchers through inheritance.
+/// Derived classes should call the base constructor with a feature name and
+/// description, and an instance matcher, and should implement the
+/// [featureValueOf] abstract method.
+///
+/// The feature description will typically describe the item and the feature,
+/// while the feature name will just name the feature. For example, we may
+/// have a Widget class where each Widget has a price; we could make a
+/// [CustomMatcher] that can make assertions about prices with:
+///
+///     class HasPrice extends CustomMatcher {
+///       const HasPrice(matcher) :
+///           super("Widget with price that is", "price", matcher);
+///       featureValueOf(actual) => actual.price;
+///     }
+///
+/// and then use this for example like:
+///
+///      expect(inventoryItem, new HasPrice(greaterThan(0)));
+class CustomMatcher extends Matcher {
+  final String _featureDescription;
+  final String _featureName;
+  final Matcher _matcher;
+
+  CustomMatcher(this._featureDescription, this._featureName, matcher)
+      : this._matcher = wrapMatcher(matcher);
+
+  /// Override this to extract the interesting feature.
+  featureValueOf(actual) => actual;
+
+  bool matches(item, Map matchState) {
+    var f = featureValueOf(item);
+    if (_matcher.matches(f, matchState)) return true;
+    addStateInfo(matchState, {'feature': f});
+    return false;
+  }
+
+  Description describe(Description description) =>
+      description.add(_featureDescription).add(' ').addDescriptionOf(_matcher);
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    mismatchDescription
+        .add('has ')
+        .add(_featureName)
+        .add(' with value ')
+        .addDescriptionOf(matchState['feature']);
+    var innerDescription = new StringDescription();
+    _matcher.describeMismatch(
+        matchState['feature'], innerDescription, matchState['state'], verbose);
+    if (innerDescription.length > 0) {
+      mismatchDescription.add(' which ').add(innerDescription.toString());
+    }
+    return mismatchDescription;
+  }
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/src/matcher/description.dart b/mojo/public/dart/third_party/unittest/lib/src/matcher/description.dart
new file mode 100644
index 0000000..3f2862f
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/matcher/description.dart
@@ -0,0 +1,68 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.description;
+
+import 'interfaces.dart';
+import 'pretty_print.dart';
+
+/// The default implementation of [Description]. This should rarely need
+/// substitution, although conceivably it is a place where other languages
+/// could be supported.
+class StringDescription implements Description {
+  final StringBuffer _out = new StringBuffer();
+
+  /// Initialize the description with initial contents [init].
+  StringDescription([String init = '']) {
+    _out.write(init);
+  }
+
+  int get length => _out.length;
+
+  /// Get the description as a string.
+  String toString() => _out.toString();
+
+  /// Append [text] to the description.
+  Description add(String text) {
+    _out.write(text);
+    return this;
+  }
+
+  /// Change the value of the description.
+  Description replace(String text) {
+    _out.clear();
+    return add(text);
+  }
+
+  /// Appends a description of [value]. If it is an IMatcher use its
+  /// describe method; if it is a string use its literal value after
+  /// escaping any embedded control characters; otherwise use its
+  /// toString() value and wrap it in angular "quotes".
+  Description addDescriptionOf(value) {
+    if (value is Matcher) {
+      value.describe(this);
+    } else {
+      add(prettyPrint(value, maxLineLength: 80, maxItems: 25));
+    }
+    return this;
+  }
+
+  /// Append an [Iterable] [list] of objects to the description, using the
+  /// specified [separator] and framing the list with [start]
+  /// and [end].
+  Description addAll(
+      String start, String separator, String end, Iterable list) {
+    var separate = false;
+    add(start);
+    for (var item in list) {
+      if (separate) {
+        add(separator);
+      }
+      addDescriptionOf(item);
+      separate = true;
+    }
+    add(end);
+    return this;
+  }
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/src/matcher/error_matchers.dart b/mojo/public/dart/third_party/unittest/lib/src/matcher/error_matchers.dart
new file mode 100644
index 0000000..503f32d
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/matcher/error_matchers.dart
@@ -0,0 +1,97 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.error_matchers;
+
+import 'core_matchers.dart';
+import 'interfaces.dart';
+
+/// A matcher for ArgumentErrors.
+const Matcher isArgumentError = const _ArgumentError();
+
+class _ArgumentError extends TypeMatcher {
+  const _ArgumentError() : super("ArgumentError");
+  bool matches(item, Map matchState) => item is ArgumentError;
+}
+
+/// A matcher for ConcurrentModificationError.
+const Matcher isConcurrentModificationError =
+    const _ConcurrentModificationError();
+
+class _ConcurrentModificationError extends TypeMatcher {
+  const _ConcurrentModificationError() : super("ConcurrentModificationError");
+  bool matches(item, Map matchState) => item is ConcurrentModificationError;
+}
+
+/// A matcher for CyclicInitializationError.
+const Matcher isCyclicInitializationError = const _CyclicInitializationError();
+
+class _CyclicInitializationError extends TypeMatcher {
+  const _CyclicInitializationError() : super("CyclicInitializationError");
+  bool matches(item, Map matchState) => item is CyclicInitializationError;
+}
+
+/// A matcher for Exceptions.
+const Matcher isException = const _Exception();
+
+class _Exception extends TypeMatcher {
+  const _Exception() : super("Exception");
+  bool matches(item, Map matchState) => item is Exception;
+}
+
+/// A matcher for FormatExceptions.
+const Matcher isFormatException = const _FormatException();
+
+class _FormatException extends TypeMatcher {
+  const _FormatException() : super("FormatException");
+  bool matches(item, Map matchState) => item is FormatException;
+}
+
+/// A matcher for NoSuchMethodErrors.
+const Matcher isNoSuchMethodError = const _NoSuchMethodError();
+
+class _NoSuchMethodError extends TypeMatcher {
+  const _NoSuchMethodError() : super("NoSuchMethodError");
+  bool matches(item, Map matchState) => item is NoSuchMethodError;
+}
+
+/// A matcher for NullThrownError.
+const Matcher isNullThrownError = const _NullThrownError();
+
+class _NullThrownError extends TypeMatcher {
+  const _NullThrownError() : super("NullThrownError");
+  bool matches(item, Map matchState) => item is NullThrownError;
+}
+
+/// A matcher for RangeErrors.
+const Matcher isRangeError = const _RangeError();
+
+class _RangeError extends TypeMatcher {
+  const _RangeError() : super("RangeError");
+  bool matches(item, Map matchState) => item is RangeError;
+}
+
+/// A matcher for StateErrors.
+const Matcher isStateError = const _StateError();
+
+class _StateError extends TypeMatcher {
+  const _StateError() : super("StateError");
+  bool matches(item, Map matchState) => item is StateError;
+}
+
+/// A matcher for UnimplementedErrors.
+const Matcher isUnimplementedError = const _UnimplementedError();
+
+class _UnimplementedError extends TypeMatcher {
+  const _UnimplementedError() : super("UnimplementedError");
+  bool matches(item, Map matchState) => item is UnimplementedError;
+}
+
+/// A matcher for UnsupportedError.
+const Matcher isUnsupportedError = const _UnsupportedError();
+
+class _UnsupportedError extends TypeMatcher {
+  const _UnsupportedError() : super("UnsupportedError");
+  bool matches(item, Map matchState) => item is UnsupportedError;
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/src/matcher/expect.dart b/mojo/public/dart/third_party/unittest/lib/src/matcher/expect.dart
new file mode 100644
index 0000000..eeeeeff
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/matcher/expect.dart
@@ -0,0 +1,177 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.expect;
+
+import 'core_matchers.dart';
+import 'description.dart';
+import 'interfaces.dart';
+import 'util.dart';
+
+/// The objects thrown by the default failure handler.
+class TestFailure extends Error {
+  final String message;
+
+  TestFailure(this.message);
+
+  String toString() => message;
+}
+
+/// Failed matches are reported using a default IFailureHandler.
+/// The default implementation simply throws [TestFailure]s;
+/// this can be replaced by some other implementation of
+/// IFailureHandler by calling configureExpectHandler.
+abstract class FailureHandler {
+  /// This handles failures given a textual decription
+  void fail(String reason);
+
+  /// This handles failures given the actual [value], the [matcher]
+  /// the [reason] (argument from [expect]), some additonal [matchState]
+  /// generated by the [matcher], and a verbose flag which controls in
+  /// some cases how much [matchState] information is used. It will use
+  /// these to create a detailed error message (typically by calling
+  /// an [ErrorFormatter]) and then call [fail] with this message.
+  void failMatch(
+      actual, Matcher matcher, String reason, Map matchState, bool verbose);
+}
+
+/// The ErrorFormatter type is used for functions that
+/// can be used to build up error reports upon [expect] failures.
+/// There is one built-in implementation ([defaultErrorFormatter])
+/// which is used by the default failure handler. If the failure handler
+/// is replaced it may be desirable to replace the [stringDescription]
+/// error formatter with another.
+typedef String ErrorFormatter(
+    actual, Matcher matcher, String reason, Map matchState, bool verbose);
+
+/// This Function is used by certain Matchers to catch certain exceptions.
+///
+/// Some matchers, like those for Futures and exception testing,
+/// can fail in asynchronous sections, and throw exceptions.
+/// A user of this library will typically want to catch and handle
+/// such exceptions. The [wrapAsync] property is a function that
+/// can wrap callbacks used by these Matchers so that they can be
+/// used safely. For example, the unittest library will set this
+/// to be `expectAsync`. By default this is an identity function.
+Function wrapAsync = (Function f, [id]) => f;
+
+/// Assert that [actual] matches [matcher].
+///
+/// This is the main assertion function. [reason] is optional and is typically
+/// not supplied, as a reason is generated from the matcher; if [reason]
+/// is included it is appended to the reason generated by the matcher.
+///
+/// [matcher] can be a value in which case it will be wrapped in an
+/// [equals] matcher.
+///
+/// If the assertion fails, then the default behavior is to throw a
+/// [TestFailure], but this behavior can be changed by calling
+/// [configureExpectFailureHandler] and providing an alternative handler that
+/// implements the [IFailureHandler] interface. It is also possible to
+/// pass a [failureHandler] to [expect] as a final parameter for fine-
+/// grained control.
+///
+/// In some cases extra diagnostic info can be produced on failure (for
+/// example, stack traces on mismatched exceptions). To enable these,
+/// [verbose] should be specified as true;
+void expect(actual, matcher,
+    {String reason, FailureHandler failureHandler, bool verbose: false}) {
+  matcher = wrapMatcher(matcher);
+  bool doesMatch;
+  var matchState = {};
+  try {
+    doesMatch = matcher.matches(actual, matchState);
+  } catch (e, trace) {
+    doesMatch = false;
+    if (reason == null) {
+      reason = '${(e is String) ? e : e.toString()} at $trace';
+    }
+  }
+  if (!doesMatch) {
+    if (failureHandler == null) {
+      failureHandler = getOrCreateExpectFailureHandler();
+    }
+    failureHandler.failMatch(actual, matcher, reason, matchState, verbose);
+  }
+}
+
+void fail(String message, {FailureHandler failureHandler}) {
+  if (failureHandler == null) {
+    failureHandler = getOrCreateExpectFailureHandler();
+  }
+  failureHandler.fail(message);
+}
+
+// The handler for failed asserts.
+FailureHandler _assertFailureHandler = null;
+
+// The default failure handler that throws [TestFailure]s.
+class DefaultFailureHandler implements FailureHandler {
+  DefaultFailureHandler() {
+    if (_assertErrorFormatter == null) {
+      _assertErrorFormatter = _defaultErrorFormatter;
+    }
+  }
+  void fail(String reason) {
+    throw new TestFailure(reason);
+  }
+  void failMatch(
+      actual, Matcher matcher, String reason, Map matchState, bool verbose) {
+    fail(_assertErrorFormatter(actual, matcher, reason, matchState, verbose));
+  }
+}
+
+/// Changes the default failure handler for [expect].
+///
+/// [handler] is a reference to the new handler; if this is omitted
+/// or null then the failure handler is reset to the default, which
+/// throws [TestFailure]s on [expect] assertion failures.
+void configureExpectFailureHandler([FailureHandler handler = null]) {
+  if (handler == null) {
+    handler = new DefaultFailureHandler();
+  }
+  _assertFailureHandler = handler;
+}
+
+FailureHandler getOrCreateExpectFailureHandler() {
+  if (_assertFailureHandler == null) {
+    configureExpectFailureHandler();
+  }
+  return _assertFailureHandler;
+}
+
+// The error message formatter for failed asserts.
+ErrorFormatter _assertErrorFormatter = null;
+
+// The default error formatter implementation.
+String _defaultErrorFormatter(
+    actual, Matcher matcher, String reason, Map matchState, bool verbose) {
+  var description = new StringDescription();
+  description.add('Expected: ').addDescriptionOf(matcher).add('\n');
+  description.add('  Actual: ').addDescriptionOf(actual).add('\n');
+
+  var mismatchDescription = new StringDescription();
+  matcher.describeMismatch(actual, mismatchDescription, matchState, verbose);
+
+  if (mismatchDescription.length > 0) {
+    description.add('   Which: ${mismatchDescription}\n');
+  }
+  if (reason != null) {
+    description.add(reason).add('\n');
+  }
+  return description.toString();
+}
+
+/// Changes the failure message formatter for expect().
+///
+/// [formatter] is a reference to the new formatter; if this is omitted or
+/// null then the failure formatter is reset to the default. The new
+/// formatter is returned; this allows custom expect handlers to easily
+/// get a reference to the default formatter.
+ErrorFormatter configureExpectFormatter([ErrorFormatter formatter = null]) {
+  if (formatter == null) {
+    formatter = _defaultErrorFormatter;
+  }
+  return _assertErrorFormatter = formatter;
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/src/matcher/future_matchers.dart b/mojo/public/dart/third_party/unittest/lib/src/matcher/future_matchers.dart
new file mode 100644
index 0000000..9b6319b
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/matcher/future_matchers.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.future_matchers;
+
+import 'dart:async';
+
+import 'expect.dart';
+import 'interfaces.dart';
+import 'util.dart';
+
+/// Matches a [Future] that completes successfully with a value.
+///
+/// Note that this creates an asynchronous expectation. The call to `expect()`
+/// that includes this will return immediately and execution will continue.
+/// Later, when the future completes, the actual expectation will run.
+///
+/// To test that a Future completes with an exception, you can use [throws] and
+/// [throwsA].
+final Matcher completes = const _Completes(null, '');
+
+/// Matches a [Future] that completes succesfully with a value that matches
+/// [matcher].
+///
+/// Note that this creates an asynchronous expectation. The call to
+/// `expect()` that includes this will return immediately and execution will
+/// continue. Later, when the future completes, the actual expectation will run.
+///
+/// To test that a Future completes with an exception, you can use [throws] and
+/// [throwsA].
+///
+/// [id] is an optional tag that can be used to identify the completion matcher
+/// in error messages.
+Matcher completion(matcher, [String id = '']) =>
+    new _Completes(wrapMatcher(matcher), id);
+
+class _Completes extends Matcher {
+  final Matcher _matcher;
+  final String _id;
+
+  const _Completes(this._matcher, this._id);
+
+  bool matches(item, Map matchState) {
+    if (item is! Future) return false;
+    var done = wrapAsync((fn) => fn(), _id);
+
+    item.then((value) {
+      done(() {
+        if (_matcher != null) expect(value, _matcher);
+      });
+    }, onError: (error, trace) {
+      var id = _id == '' ? '' : '${_id} ';
+      var reason = 'Expected future ${id}to complete successfully, '
+          'but it failed with ${error}';
+      if (trace != null) {
+        var stackTrace = trace.toString();
+        stackTrace = '  ${stackTrace.replaceAll('\n', '\n  ')}';
+        reason = '$reason\nStack trace:\n$stackTrace';
+      }
+      done(() => fail(reason));
+    });
+
+    return true;
+  }
+
+  Description describe(Description description) {
+    if (_matcher == null) {
+      description.add('completes successfully');
+    } else {
+      description.add('completes to a value that ').addDescriptionOf(_matcher);
+    }
+    return description;
+  }
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/src/matcher/interfaces.dart b/mojo/public/dart/third_party/unittest/lib/src/matcher/interfaces.dart
new file mode 100644
index 0000000..3e68d2d
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/matcher/interfaces.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.interfaces;
+
+// To decouple the reporting of errors, and allow for extensibility of
+// matchers, we make use of some interfaces.
+
+/// Matchers build up their error messages by appending to
+/// Description objects. This interface is implemented by
+/// StringDescription. This interface is unlikely to need
+/// other implementations, but could be useful to replace in
+/// some cases - e.g. language conversion.
+abstract class Description {
+  int get length;
+
+  /// Change the value of the description.
+  Description replace(String text);
+
+  /// This is used to add arbitrary text to the description.
+  Description add(String text);
+
+  /// This is used to add a meaningful description of a value.
+  Description addDescriptionOf(value);
+
+  /// This is used to add a description of an [Iterable] [list],
+  /// with appropriate [start] and [end] markers and inter-element [separator].
+  Description addAll(String start, String separator, String end, Iterable list);
+}
+
+/// [expect] Matchers must implement/extend the Matcher class.
+/// The base Matcher class has a generic implementation of [describeMismatch]
+/// so this does not need to be provided unless a more clear description is
+/// required. The other two methods ([matches] and [describe])
+/// must always be provided as they are highly matcher-specific.
+abstract class Matcher {
+  const Matcher();
+
+  /// This does the matching of the actual vs expected values.
+  /// [item] is the actual value. [matchState] can be supplied
+  /// and may be used to add details about the mismatch that are too
+  /// costly to determine in [describeMismatch].
+  bool matches(item, Map matchState);
+
+  /// This builds a textual description of the matcher.
+  Description describe(Description description);
+
+  /// This builds a textual description of a specific mismatch. [item]
+  /// is the value that was tested by [matches]; [matchState] is
+  /// the [Map] that was passed to and supplemented by [matches]
+  /// with additional information about the mismatch, and [mismatchDescription]
+  /// is the [Description] that is being built to decribe the mismatch.
+  /// A few matchers make use of the [verbose] flag to provide detailed
+  /// information that is not typically included but can be of help in
+  /// diagnosing failures, such as stack traces.
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) =>
+      mismatchDescription;
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/src/matcher/iterable_matchers.dart b/mojo/public/dart/third_party/unittest/lib/src/matcher/iterable_matchers.dart
new file mode 100644
index 0000000..6a759ec
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/matcher/iterable_matchers.dart
@@ -0,0 +1,267 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.iterable_matchers;
+
+import 'core_matchers.dart';
+import 'description.dart';
+import 'interfaces.dart';
+import 'util.dart';
+
+/// Returns a matcher which matches [Iterable]s in which all elements
+/// match the given [matcher].
+Matcher everyElement(matcher) => new _EveryElement(wrapMatcher(matcher));
+
+class _EveryElement extends _IterableMatcher {
+  final Matcher _matcher;
+
+  _EveryElement(Matcher this._matcher);
+
+  bool matches(item, Map matchState) {
+    if (item is! Iterable) {
+      return false;
+    }
+    var i = 0;
+    for (var element in item) {
+      if (!_matcher.matches(element, matchState)) {
+        addStateInfo(matchState, {'index': i, 'element': element});
+        return false;
+      }
+      ++i;
+    }
+    return true;
+  }
+
+  Description describe(Description description) =>
+      description.add('every element(').addDescriptionOf(_matcher).add(')');
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (matchState['index'] != null) {
+      var index = matchState['index'];
+      var element = matchState['element'];
+      mismatchDescription
+          .add('has value ')
+          .addDescriptionOf(element)
+          .add(' which ');
+      var subDescription = new StringDescription();
+      _matcher.describeMismatch(
+          element, subDescription, matchState['state'], verbose);
+      if (subDescription.length > 0) {
+        mismatchDescription.add(subDescription.toString());
+      } else {
+        mismatchDescription.add("doesn't match ");
+        _matcher.describe(mismatchDescription);
+      }
+      mismatchDescription.add(' at index $index');
+      return mismatchDescription;
+    }
+    return super.describeMismatch(
+        item, mismatchDescription, matchState, verbose);
+  }
+}
+
+/// Returns a matcher which matches [Iterable]s in which at least one
+/// element matches the given [matcher].
+Matcher anyElement(matcher) => new _AnyElement(wrapMatcher(matcher));
+
+class _AnyElement extends _IterableMatcher {
+  final Matcher _matcher;
+
+  _AnyElement(this._matcher);
+
+  bool matches(item, Map matchState) {
+    return item.any((e) => _matcher.matches(e, matchState));
+  }
+
+  Description describe(Description description) =>
+      description.add('some element ').addDescriptionOf(_matcher);
+}
+
+/// Returns a matcher which matches [Iterable]s that have the same
+/// length and the same elements as [expected], in the same order.
+///
+/// This is equivalent to [equals] but does not recurse.
+Matcher orderedEquals(Iterable expected) => new _OrderedEquals(expected);
+
+class _OrderedEquals extends Matcher {
+  final Iterable _expected;
+  Matcher _matcher;
+
+  _OrderedEquals(this._expected) {
+    _matcher = equals(_expected, 1);
+  }
+
+  bool matches(item, Map matchState) =>
+      (item is Iterable) && _matcher.matches(item, matchState);
+
+  Description describe(Description description) =>
+      description.add('equals ').addDescriptionOf(_expected).add(' ordered');
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (item is! Iterable) {
+      return mismatchDescription.add('is not an Iterable');
+    } else {
+      return _matcher.describeMismatch(
+          item, mismatchDescription, matchState, verbose);
+    }
+  }
+}
+
+/// Returns a matcher which matches [Iterable]s that have the same length and
+/// the same elements as [expected], but not necessarily in the same order.
+///
+/// Note that this is O(n^2) so should only be used on small objects.
+Matcher unorderedEquals(Iterable expected) => new _UnorderedEquals(expected);
+
+class _UnorderedEquals extends _UnorderedMatches {
+  final List _expectedValues;
+
+  _UnorderedEquals(Iterable expected)
+      : super(expected.map(equals)),
+        _expectedValues = expected.toList();
+
+  Description describe(Description description) => description
+      .add('equals ')
+      .addDescriptionOf(_expectedValues)
+      .add(' unordered');
+}
+
+/// Iterable matchers match against [Iterable]s. We add this intermediate
+/// class to give better mismatch error messages than the base Matcher class.
+abstract class _IterableMatcher extends Matcher {
+  const _IterableMatcher();
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (item is! Iterable) {
+      return mismatchDescription.addDescriptionOf(item).add(' not an Iterable');
+    } else {
+      return super.describeMismatch(
+          item, mismatchDescription, matchState, verbose);
+    }
+  }
+}
+
+/// Returns a matcher which matches [Iterable]s whose elements match the
+/// matchers in [expected], but not necessarily in the same order.
+///
+///  Note that this is `O(n^2)` and so should only be used on small objects.
+Matcher unorderedMatches(Iterable expected) => new _UnorderedMatches(expected);
+
+class _UnorderedMatches extends Matcher {
+  final List<Matcher> _expected;
+
+  _UnorderedMatches(Iterable expected)
+      : _expected = expected.map(wrapMatcher).toList();
+
+  String _test(item) {
+    if (item is! Iterable) return 'not iterable';
+    item = item.toList();
+
+    // Check the lengths are the same.
+    if (_expected.length > item.length) {
+      return 'has too few elements (${item.length} < ${_expected.length})';
+    } else if (_expected.length < item.length) {
+      return 'has too many elements (${item.length} > ${_expected.length})';
+    }
+
+    var matched = new List<bool>.filled(item.length, false);
+    var expectedPosition = 0;
+    for (var expectedMatcher in _expected) {
+      var actualPosition = 0;
+      var gotMatch = false;
+      for (var actualElement in item) {
+        if (!matched[actualPosition]) {
+          if (expectedMatcher.matches(actualElement, {})) {
+            matched[actualPosition] = gotMatch = true;
+            break;
+          }
+        }
+        ++actualPosition;
+      }
+
+      if (!gotMatch) {
+        return new StringDescription()
+            .add('has no match for ')
+            .addDescriptionOf(expectedMatcher)
+            .add(' at index ${expectedPosition}')
+            .toString();
+      }
+
+      ++expectedPosition;
+    }
+    return null;
+  }
+
+  bool matches(item, Map mismatchState) => _test(item) == null;
+
+  Description describe(Description description) => description
+      .add('matches ')
+      .addAll('[', ', ', ']', _expected)
+      .add(' unordered');
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) =>
+      mismatchDescription.add(_test(item));
+}
+
+/// A pairwise matcher for [Iterable]s.
+///
+/// The [comparator] function, taking an expected and an actual argument, and
+/// returning whether they match, will be applied to each pair in order.
+/// [description] should be a meaningful name for the comparator.
+Matcher pairwiseCompare(
+    Iterable expected, bool comparator(a, b), String description) =>
+        new _PairwiseCompare(expected, comparator, description);
+
+typedef bool _Comparator(a, b);
+
+class _PairwiseCompare extends _IterableMatcher {
+  final Iterable _expected;
+  final _Comparator _comparator;
+  final String _description;
+
+  _PairwiseCompare(this._expected, this._comparator, this._description);
+
+  bool matches(item, Map matchState) {
+    if (item is! Iterable) return false;
+    if (item.length != _expected.length) return false;
+    var iterator = item.iterator;
+    var i = 0;
+    for (var e in _expected) {
+      iterator.moveNext();
+      if (!_comparator(e, iterator.current)) {
+        addStateInfo(matchState, {
+          'index': i,
+          'expected': e,
+          'actual': iterator.current
+        });
+        return false;
+      }
+      i++;
+    }
+    return true;
+  }
+
+  Description describe(Description description) =>
+      description.add('pairwise $_description ').addDescriptionOf(_expected);
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (item is! Iterable) {
+      return mismatchDescription.add('is not an Iterable');
+    } else if (item.length != _expected.length) {
+      return mismatchDescription
+          .add('has length ${item.length} instead of ${_expected.length}');
+    } else {
+      return mismatchDescription
+          .add('has ')
+          .addDescriptionOf(matchState["actual"])
+          .add(' which is not $_description ')
+          .addDescriptionOf(matchState["expected"])
+          .add(' at index ${matchState["index"]}');
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/src/matcher/map_matchers.dart b/mojo/public/dart/third_party/unittest/lib/src/matcher/map_matchers.dart
new file mode 100644
index 0000000..98e89af
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/matcher/map_matchers.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.map_matchers;
+
+import 'interfaces.dart';
+import 'util.dart';
+
+/// Returns a matcher which matches maps containing the given [value].
+Matcher containsValue(value) => new _ContainsValue(value);
+
+class _ContainsValue extends Matcher {
+  final _value;
+
+  const _ContainsValue(this._value);
+
+  bool matches(item, Map matchState) => item.containsValue(_value);
+  Description describe(Description description) =>
+      description.add('contains value ').addDescriptionOf(_value);
+}
+
+/// Returns a matcher which matches maps containing the key-value pair
+/// with [key] => [value].
+Matcher containsPair(key, value) =>
+    new _ContainsMapping(key, wrapMatcher(value));
+
+class _ContainsMapping extends Matcher {
+  final _key;
+  final Matcher _valueMatcher;
+
+  const _ContainsMapping(this._key, Matcher this._valueMatcher);
+
+  bool matches(item, Map matchState) =>
+      item.containsKey(_key) && _valueMatcher.matches(item[_key], matchState);
+
+  Description describe(Description description) {
+    return description
+        .add('contains pair ')
+        .addDescriptionOf(_key)
+        .add(' => ')
+        .addDescriptionOf(_valueMatcher);
+  }
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (!item.containsKey(_key)) {
+      return mismatchDescription
+          .add(" doesn't contain key ")
+          .addDescriptionOf(_key);
+    } else {
+      mismatchDescription
+          .add(' contains key ')
+          .addDescriptionOf(_key)
+          .add(' but with value ');
+      _valueMatcher.describeMismatch(
+          item[_key], mismatchDescription, matchState, verbose);
+      return mismatchDescription;
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/src/matcher/numeric_matchers.dart b/mojo/public/dart/third_party/unittest/lib/src/matcher/numeric_matchers.dart
new file mode 100644
index 0000000..18c498e
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/matcher/numeric_matchers.dart
@@ -0,0 +1,202 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.numeric_matchers;
+
+import 'interfaces.dart';
+
+/// Returns a matcher which matches if the match argument is greater
+/// than the given [value].
+Matcher greaterThan(value) =>
+    new _OrderingComparison(value, false, false, true, 'a value greater than');
+
+/// Returns a matcher which matches if the match argument is greater
+/// than or equal to the given [value].
+Matcher greaterThanOrEqualTo(value) => new _OrderingComparison(
+    value, true, false, true, 'a value greater than or equal to');
+
+/// Returns a matcher which matches if the match argument is less
+/// than the given [value].
+Matcher lessThan(value) =>
+    new _OrderingComparison(value, false, true, false, 'a value less than');
+
+/// Returns a matcher which matches if the match argument is less
+/// than or equal to the given [value].
+Matcher lessThanOrEqualTo(value) => new _OrderingComparison(
+    value, true, true, false, 'a value less than or equal to');
+
+/// A matcher which matches if the match argument is zero.
+const Matcher isZero =
+    const _OrderingComparison(0, true, false, false, 'a value equal to');
+
+/// A matcher which matches if the match argument is non-zero.
+const Matcher isNonZero =
+    const _OrderingComparison(0, false, true, true, 'a value not equal to');
+
+/// A matcher which matches if the match argument is positive.
+const Matcher isPositive =
+    const _OrderingComparison(0, false, false, true, 'a positive value', false);
+
+/// A matcher which matches if the match argument is zero or negative.
+const Matcher isNonPositive = const _OrderingComparison(
+    0, true, true, false, 'a non-positive value', false);
+
+/// A matcher which matches if the match argument is negative.
+const Matcher isNegative =
+    const _OrderingComparison(0, false, true, false, 'a negative value', false);
+
+/// A matcher which matches if the match argument is zero or positive.
+const Matcher isNonNegative = const _OrderingComparison(
+    0, true, false, true, 'a non-negative value', false);
+
+bool _isNumeric(value) {
+  return value is num;
+}
+
+// TODO(kevmoo) Note that matchers that use _OrderingComparison only use
+// `==` and `<` operators to evaluate the match. Or change the matcher.
+class _OrderingComparison extends Matcher {
+  /// Expected value.
+  final _value;
+  /// What to return if actual == expected
+  final bool _equalValue;
+  /// What to return if actual < expected
+  final bool _lessThanValue;
+  /// What to return if actual > expected
+  final bool _greaterThanValue;
+  /// Textual name of the inequality
+  final String _comparisonDescription;
+  /// Whether to include the expected value in the description
+  final bool _valueInDescription;
+
+  const _OrderingComparison(this._value, this._equalValue, this._lessThanValue,
+      this._greaterThanValue, this._comparisonDescription,
+      [bool valueInDescription = true])
+      : this._valueInDescription = valueInDescription;
+
+  bool matches(item, Map matchState) {
+    if (item == _value) {
+      return _equalValue;
+    } else if (item < _value) {
+      return _lessThanValue;
+    } else {
+      return _greaterThanValue;
+    }
+  }
+
+  Description describe(Description description) {
+    if (_valueInDescription) {
+      return description
+          .add(_comparisonDescription)
+          .add(' ')
+          .addDescriptionOf(_value);
+    } else {
+      return description.add(_comparisonDescription);
+    }
+  }
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    mismatchDescription.add('is not ');
+    return describe(mismatchDescription);
+  }
+}
+
+/// Returns a matcher which matches if the match argument is within [delta]
+/// of some [value].
+///
+/// In other words, this matches if the match argument is greater than
+/// than or equal [value]-[delta] and less than or equal to [value]+[delta].
+Matcher closeTo(num value, num delta) => new _IsCloseTo(value, delta);
+
+class _IsCloseTo extends Matcher {
+  final num _value, _delta;
+
+  const _IsCloseTo(this._value, this._delta);
+
+  bool matches(item, Map matchState) {
+    if (!_isNumeric(item)) {
+      return false;
+    }
+    var diff = item - _value;
+    if (diff < 0) diff = -diff;
+    return (diff <= _delta);
+  }
+
+  Description describe(Description description) => description
+      .add('a numeric value within ')
+      .addDescriptionOf(_delta)
+      .add(' of ')
+      .addDescriptionOf(_value);
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (item is! num) {
+      return mismatchDescription.add(' not numeric');
+    } else {
+      var diff = item - _value;
+      if (diff < 0) diff = -diff;
+      return mismatchDescription.add(' differs by ').addDescriptionOf(diff);
+    }
+  }
+}
+
+/// Returns a matcher which matches if the match argument is greater
+/// than or equal to [low] and less than or equal to [high].
+Matcher inInclusiveRange(num low, num high) =>
+    new _InRange(low, high, true, true);
+
+/// Returns a matcher which matches if the match argument is greater
+/// than [low] and less than [high].
+Matcher inExclusiveRange(num low, num high) =>
+    new _InRange(low, high, false, false);
+
+/// Returns a matcher which matches if the match argument is greater
+/// than [low] and less than or equal to [high].
+Matcher inOpenClosedRange(num low, num high) =>
+    new _InRange(low, high, false, true);
+
+/// Returns a matcher which matches if the match argument is greater
+/// than or equal to a [low] and less than [high].
+Matcher inClosedOpenRange(num low, num high) =>
+    new _InRange(low, high, true, false);
+
+class _InRange extends Matcher {
+  final num _low, _high;
+  final bool _lowMatchValue, _highMatchValue;
+
+  const _InRange(
+      this._low, this._high, this._lowMatchValue, this._highMatchValue);
+
+  bool matches(value, Map matchState) {
+    if (value is! num) {
+      return false;
+    }
+    if (value < _low || value > _high) {
+      return false;
+    }
+    if (value == _low) {
+      return _lowMatchValue;
+    }
+    if (value == _high) {
+      return _highMatchValue;
+    }
+    return true;
+  }
+
+  Description describe(Description description) => description.add(
+      "be in range from "
+      "$_low (${_lowMatchValue ? 'inclusive' : 'exclusive'}) to "
+      "$_high (${_highMatchValue ? 'inclusive' : 'exclusive'})");
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (item is! num) {
+      return mismatchDescription.addDescriptionOf(item).add(' not numeric');
+    } else {
+      return super.describeMismatch(
+          item, mismatchDescription, matchState, verbose);
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/src/matcher/operator_matchers.dart b/mojo/public/dart/third_party/unittest/lib/src/matcher/operator_matchers.dart
new file mode 100644
index 0000000..432f905
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/matcher/operator_matchers.dart
@@ -0,0 +1,113 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.operator_matchers;
+
+import 'interfaces.dart';
+import 'util.dart';
+
+/// This returns a matcher that inverts [matcher] to its logical negation.
+Matcher isNot(matcher) => new _IsNot(wrapMatcher(matcher));
+
+class _IsNot extends Matcher {
+  final Matcher _matcher;
+
+  const _IsNot(this._matcher);
+
+  bool matches(item, Map matchState) => !_matcher.matches(item, matchState);
+
+  Description describe(Description description) =>
+      description.add('not ').addDescriptionOf(_matcher);
+}
+
+/// This returns a matcher that matches if all of the matchers passed as
+/// arguments (up to 7) match.
+///
+/// Instead of passing the matchers separately they can be passed as a single
+/// List argument. Any argument that is not a matcher is implicitly wrapped in a
+/// Matcher to check for equality.
+Matcher allOf(arg0, [arg1, arg2, arg3, arg4, arg5, arg6]) {
+  return new _AllOf(_wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6));
+}
+
+class _AllOf extends Matcher {
+  final List<Matcher> _matchers;
+
+  const _AllOf(this._matchers);
+
+  bool matches(item, Map matchState) {
+    for (var matcher in _matchers) {
+      if (!matcher.matches(item, matchState)) {
+        addStateInfo(matchState, {'matcher': matcher});
+        return false;
+      }
+    }
+    return true;
+  }
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    var matcher = matchState['matcher'];
+    matcher.describeMismatch(
+        item, mismatchDescription, matchState['state'], verbose);
+    return mismatchDescription;
+  }
+
+  Description describe(Description description) =>
+      description.addAll('(', ' and ', ')', _matchers);
+}
+
+/// Matches if any of the given matchers evaluate to true.
+///
+/// The arguments can be a set of matchers as separate parameters
+/// (up to 7), or a List of matchers.
+///
+/// The matchers are evaluated from left to right using short-circuit
+/// evaluation, so evaluation stops as soon as a matcher returns true.
+///
+/// Any argument that is not a matcher is implicitly wrapped in a
+/// Matcher to check for equality.
+Matcher anyOf(arg0, [arg1, arg2, arg3, arg4, arg5, arg6]) {
+  return new _AnyOf(_wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6));
+}
+
+class _AnyOf extends Matcher {
+  final List<Matcher> _matchers;
+
+  const _AnyOf(this._matchers);
+
+  bool matches(item, Map matchState) {
+    for (var matcher in _matchers) {
+      if (matcher.matches(item, matchState)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  Description describe(Description description) =>
+      description.addAll('(', ' or ', ')', _matchers);
+}
+
+List<Matcher> _wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6) {
+  Iterable<Matcher> matchers;
+  if (arg0 is List) {
+    if (arg1 != null ||
+        arg2 != null ||
+        arg3 != null ||
+        arg4 != null ||
+        arg5 != null ||
+        arg6 != null) {
+      throw new ArgumentError('If arg0 is a List, all other arguments must be'
+          ' null.');
+    }
+
+    matchers = arg0;
+  } else {
+    matchers =
+        [arg0, arg1, arg2, arg3, arg4, arg5, arg6].where((e) => e != null);
+  }
+
+  return matchers.map((e) => wrapMatcher(e)).toList();
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/src/matcher/pretty_print.dart b/mojo/public/dart/third_party/unittest/lib/src/matcher/pretty_print.dart
new file mode 100644
index 0000000..8e96c04
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/matcher/pretty_print.dart
@@ -0,0 +1,136 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.pretty_print;
+
+import 'description.dart';
+import 'interfaces.dart';
+import 'util.dart';
+
+/// Returns a pretty-printed representation of [object].
+///
+/// If [maxLineLength] is passed, this will attempt to ensure that each line is
+/// no longer than [maxLineLength] characters long. This isn't guaranteed, since
+/// individual objects may have string representations that are too long, but
+/// most lines will be less than [maxLineLength] long.
+///
+/// If [maxItems] is passed, [Iterable]s and [Map]s will only print their first
+/// [maxItems] members or key/value pairs, respectively.
+String prettyPrint(object, {int maxLineLength, int maxItems}) {
+  String _prettyPrint(object, int indent, Set seen, bool top) {
+    // If the object is a matcher, use its description.
+    if (object is Matcher) {
+      var description = new StringDescription();
+      object.describe(description);
+      return "<$description>";
+    }
+
+    // Avoid looping infinitely on recursively-nested data structures.
+    if (seen.contains(object)) return "(recursive)";
+    seen = seen.union(new Set.from([object]));
+    String pp(child) => _prettyPrint(child, indent + 2, seen, false);
+
+    if (object is Iterable) {
+      // Print the type name for non-List iterables.
+      var type = object is List ? "" : _typeName(object) + ":";
+
+      // Truncate the list of strings if it's longer than [maxItems].
+      var strings = object.map(pp).toList();
+      if (maxItems != null && strings.length > maxItems) {
+        strings.replaceRange(maxItems - 1, strings.length, ['...']);
+      }
+
+      // If the printed string is short and doesn't contain a newline, print it
+      // as a single line.
+      var singleLine = "$type[${strings.join(', ')}]";
+      if ((maxLineLength == null ||
+              singleLine.length + indent <= maxLineLength) &&
+          !singleLine.contains("\n")) {
+        return singleLine;
+      }
+
+      // Otherwise, print each member on its own line.
+      return "$type[\n" + strings.map((string) {
+        return _indent(indent + 2) + string;
+      }).join(",\n") + "\n" + _indent(indent) + "]";
+    } else if (object is Map) {
+      // Convert the contents of the map to string representations.
+      var strings = object.keys.map((key) {
+        return '${pp(key)}: ${pp(object[key])}';
+      }).toList();
+
+      // Truncate the list of strings if it's longer than [maxItems].
+      if (maxItems != null && strings.length > maxItems) {
+        strings.replaceRange(maxItems - 1, strings.length, ['...']);
+      }
+
+      // If the printed string is short and doesn't contain a newline, print it
+      // as a single line.
+      var singleLine = "{${strings.join(", ")}}";
+      if ((maxLineLength == null ||
+              singleLine.length + indent <= maxLineLength) &&
+          !singleLine.contains("\n")) {
+        return singleLine;
+      }
+
+      // Otherwise, print each key/value pair on its own line.
+      return "{\n" + strings.map((string) {
+        return _indent(indent + 2) + string;
+      }).join(",\n") + "\n" + _indent(indent) + "}";
+    } else if (object is String) {
+      // Escape strings and print each line on its own line.
+      var lines = object.split("\n");
+      return "'" +
+          lines.map(_escapeString).join("\\n'\n${_indent(indent + 2)}'") +
+          "'";
+    } else {
+      var value = object.toString().replaceAll("\n", _indent(indent) + "\n");
+      var defaultToString = value.startsWith("Instance of ");
+
+      // If this is the top-level call to [prettyPrint], wrap the value on angle
+      // brackets to set it apart visually.
+      if (top) value = "<$value>";
+
+      // Print the type of objects with custom [toString] methods. Primitive
+      // objects and objects that don't implement a custom [toString] don't need
+      // to have their types printed.
+      if (object is num ||
+          object is bool ||
+          object is Function ||
+          object == null ||
+          defaultToString) {
+        return value;
+      } else {
+        return "${_typeName(object)}:$value";
+      }
+    }
+  }
+
+  return _prettyPrint(object, 0, new Set(), true);
+}
+
+String _indent(int length) => new List.filled(length, ' ').join('');
+
+/// Returns the name of the type of [x], or "Unknown" if the type name can't be
+/// determined.
+String _typeName(x) {
+  // dart2js blows up on some objects (e.g. window.navigator).
+  // So we play safe here.
+  try {
+    if (x == null) return "null";
+    var type = x.runtimeType.toString();
+    // TODO(nweiz): if the object's type is private, find a public superclass to
+    // display once there's a portable API to do that.
+    return type.startsWith("_") ? "?" : type;
+  } catch (e) {
+    return "?";
+  }
+}
+
+/// Returns [source] with any control characters replaced by their escape
+/// sequences.
+///
+/// This doesn't add quotes to the string, but it does escape single quote
+/// characters so that single quotes can be applied externally.
+String _escapeString(String source) => escape(source).replaceAll("'", r"\'");
diff --git a/mojo/public/dart/third_party/unittest/lib/src/matcher/prints_matcher.dart b/mojo/public/dart/third_party/unittest/lib/src/matcher/prints_matcher.dart
new file mode 100644
index 0000000..03c0eaf
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/matcher/prints_matcher.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.prints_matcher;
+
+import 'dart:async';
+
+import 'description.dart';
+import 'expect.dart';
+import 'interfaces.dart';
+import 'future_matchers.dart';
+import 'util.dart';
+
+/// Matches a [Function] that prints text that matches [matcher].
+///
+/// [matcher] may be a String or a [Matcher].
+///
+/// If the function this runs against returns a [Future], all text printed by
+/// the function (using [Zone] scoping) until that Future completes is matched.
+///
+/// This only tracks text printed using the [print] function.
+Matcher prints(matcher) => new _Prints(wrapMatcher(matcher));
+
+class _Prints extends Matcher {
+  final Matcher _matcher;
+
+  _Prints(this._matcher);
+
+  bool matches(item, Map matchState) {
+    if (item is! Function) return false;
+
+    var buffer = new StringBuffer();
+    var result = runZoned(item,
+        zoneSpecification: new ZoneSpecification(print: (_, __, ____, line) {
+      buffer.writeln(line);
+    }));
+
+    if (result is! Future) {
+      var actual = buffer.toString();
+      matchState['prints.actual'] = actual;
+      return _matcher.matches(actual, matchState);
+    }
+
+    return completes.matches(result.then(wrapAsync((_) {
+      expect(buffer.toString(), _matcher);
+    }, 'prints')), matchState);
+  }
+
+  Description describe(Description description) =>
+      description.add('prints ').addDescriptionOf(_matcher);
+
+  Description describeMismatch(
+      item, Description description, Map matchState, bool verbose) {
+    var actual = matchState.remove('prints.actual');
+    if (actual == null) return description;
+    if (actual.isEmpty) return description.add("printed nothing.");
+
+    description.add('printed ').addDescriptionOf(actual);
+
+    // Create a new description for the matcher because at least
+    // [_StringEqualsMatcher] replaces the previous contents of the description.
+    var innerMismatch = _matcher
+        .describeMismatch(actual, new StringDescription(), matchState, verbose)
+        .toString();
+
+    if (innerMismatch.isNotEmpty) {
+      description.add('\n   Which: ').add(innerMismatch.toString());
+    }
+
+    return description;
+  }
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/src/matcher/string_matchers.dart b/mojo/public/dart/third_party/unittest/lib/src/matcher/string_matchers.dart
new file mode 100644
index 0000000..bf26e5b
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/matcher/string_matchers.dart
@@ -0,0 +1,201 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.string_matchers;
+
+import 'interfaces.dart';
+
+/// Returns a matcher which matches if the match argument is a string and
+/// is equal to [value] when compared case-insensitively.
+Matcher equalsIgnoringCase(String value) => new _IsEqualIgnoringCase(value);
+
+class _IsEqualIgnoringCase extends _StringMatcher {
+  final String _value;
+  final String _matchValue;
+
+  _IsEqualIgnoringCase(String value)
+      : _value = value,
+        _matchValue = value.toLowerCase();
+
+  bool matches(item, Map matchState) =>
+      item is String && _matchValue == item.toLowerCase();
+
+  Description describe(Description description) =>
+      description.addDescriptionOf(_value).add(' ignoring case');
+}
+
+/// Returns a matcher which matches if the match argument is a string and
+/// is equal to [value], ignoring whitespace.
+///
+/// In this matcher, "ignoring whitespace" means comparing with all runs of
+/// whitespace collapsed to single space characters and leading and trailing
+/// whitespace removed.
+///
+/// For example, the following will all match successfully:
+///
+///     expect("hello   world", equalsIgnoringWhitespace("hello world"));
+///     expect("  hello world", equalsIgnoringWhitespace("hello world"));
+///     expect("hello world  ", equalsIgnoringWhitespace("hello world"));
+///
+/// The following will not match:
+///
+///     expect("helloworld", equalsIgnoringWhitespace("hello world"));
+///     expect("he llo world", equalsIgnoringWhitespace("hello world"));
+Matcher equalsIgnoringWhitespace(String value) =>
+    new _IsEqualIgnoringWhitespace(value);
+
+class _IsEqualIgnoringWhitespace extends _StringMatcher {
+  final String _value;
+  final String _matchValue;
+
+  _IsEqualIgnoringWhitespace(String value)
+      : _value = value,
+        _matchValue = collapseWhitespace(value);
+
+  bool matches(item, Map matchState) =>
+      item is String && _matchValue == collapseWhitespace(item);
+
+  Description describe(Description description) =>
+      description.addDescriptionOf(_matchValue).add(' ignoring whitespace');
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (item is String) {
+      return mismatchDescription
+          .add('is ')
+          .addDescriptionOf(collapseWhitespace(item))
+          .add(' with whitespace compressed');
+    } else {
+      return super.describeMismatch(
+          item, mismatchDescription, matchState, verbose);
+    }
+  }
+}
+
+/// Returns a matcher that matches if the match argument is a string and
+/// starts with [prefixString].
+Matcher startsWith(String prefixString) => new _StringStartsWith(prefixString);
+
+class _StringStartsWith extends _StringMatcher {
+  final String _prefix;
+
+  const _StringStartsWith(this._prefix);
+
+  bool matches(item, Map matchState) =>
+      item is String && item.startsWith(_prefix);
+
+  Description describe(Description description) =>
+      description.add('a string starting with ').addDescriptionOf(_prefix);
+}
+
+/// Returns a matcher that matches if the match argument is a string and
+/// ends with [suffixString].
+Matcher endsWith(String suffixString) => new _StringEndsWith(suffixString);
+
+class _StringEndsWith extends _StringMatcher {
+  final String _suffix;
+
+  const _StringEndsWith(this._suffix);
+
+  bool matches(item, Map matchState) =>
+      item is String && item.endsWith(_suffix);
+
+  Description describe(Description description) =>
+      description.add('a string ending with ').addDescriptionOf(_suffix);
+}
+
+/// Returns a matcher that matches if the match argument is a string and
+/// contains a given list of [substrings] in relative order.
+///
+/// For example, `stringContainsInOrder(["a", "e", "i", "o", "u"])` will match
+/// "abcdefghijklmnopqrstuvwxyz".
+
+Matcher stringContainsInOrder(List<String> substrings) =>
+    new _StringContainsInOrder(substrings);
+
+class _StringContainsInOrder extends _StringMatcher {
+  final List<String> _substrings;
+
+  const _StringContainsInOrder(this._substrings);
+
+  bool matches(item, Map matchState) {
+    if (!(item is String)) {
+      return false;
+    }
+    var from_index = 0;
+    for (var s in _substrings) {
+      from_index = item.indexOf(s, from_index);
+      if (from_index < 0) return false;
+    }
+    return true;
+  }
+
+  Description describe(Description description) => description.addAll(
+      'a string containing ', ', ', ' in order', _substrings);
+}
+
+/// Returns a matcher that matches if the match argument is a string and
+/// matches the regular expression given by [re].
+///
+/// [re] can be a [RegExp] instance or a [String]; in the latter case it will be
+/// used to create a RegExp instance.
+Matcher matches(re) => new _MatchesRegExp(re);
+
+class _MatchesRegExp extends _StringMatcher {
+  RegExp _regexp;
+
+  _MatchesRegExp(re) {
+    if (re is String) {
+      _regexp = new RegExp(re);
+    } else if (re is RegExp) {
+      _regexp = re;
+    } else {
+      throw new ArgumentError('matches requires a regexp or string');
+    }
+  }
+
+  bool matches(item, Map matchState) =>
+      item is String ? _regexp.hasMatch(item) : false;
+
+  Description describe(Description description) =>
+      description.add("match '${_regexp.pattern}'");
+}
+
+// String matchers match against a string. We add this intermediate
+// class to give better mismatch error messages than the base Matcher class.
+abstract class _StringMatcher extends Matcher {
+  const _StringMatcher();
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (!(item is String)) {
+      return mismatchDescription.addDescriptionOf(item).add(' not a string');
+    } else {
+      return super.describeMismatch(
+          item, mismatchDescription, matchState, verbose);
+    }
+  }
+}
+
+/// Utility function to collapse whitespace runs to single spaces
+/// and strip leading/trailing whitespace.
+String collapseWhitespace(String string) {
+  var result = new StringBuffer();
+  var skipSpace = true;
+  for (var i = 0; i < string.length; i++) {
+    var character = string[i];
+    if (_isWhitespace(character)) {
+      if (!skipSpace) {
+        result.write(' ');
+        skipSpace = true;
+      }
+    } else {
+      result.write(character);
+      skipSpace = false;
+    }
+  }
+  return result.toString().trim();
+}
+
+bool _isWhitespace(String ch) =>
+    ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t';
diff --git a/mojo/public/dart/third_party/unittest/lib/src/matcher/throws_matcher.dart b/mojo/public/dart/third_party/unittest/lib/src/matcher/throws_matcher.dart
new file mode 100644
index 0000000..72f726d
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/matcher/throws_matcher.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.throws_matcher;
+
+import 'dart:async';
+
+import 'expect.dart';
+import 'interfaces.dart';
+import 'util.dart';
+
+/// This can be used to match two kinds of objects:
+///
+///   * A [Function] that throws an exception when called. The function cannot
+///     take any arguments. If you want to test that a function expecting
+///     arguments throws, wrap it in another zero-argument function that calls
+///     the one you want to test.
+///
+///   * A [Future] that completes with an exception. Note that this creates an
+///     asynchronous expectation. The call to `expect()` that includes this will
+///     return immediately and execution will continue. Later, when the future
+///     completes, the actual expectation will run.
+const Matcher throws = const Throws();
+
+/// This can be used to match two kinds of objects:
+///
+///   * A [Function] that throws an exception when called. The function cannot
+///     take any arguments. If you want to test that a function expecting
+///     arguments throws, wrap it in another zero-argument function that calls
+///     the one you want to test.
+///
+///   * A [Future] that completes with an exception. Note that this creates an
+///     asynchronous expectation. The call to `expect()` that includes this will
+///     return immediately and execution will continue. Later, when the future
+///     completes, the actual expectation will run.
+///
+/// In both cases, when an exception is thrown, this will test that the exception
+/// object matches [matcher]. If [matcher] is not an instance of [Matcher], it
+/// will implicitly be treated as `equals(matcher)`.
+Matcher throwsA(matcher) => new Throws(wrapMatcher(matcher));
+
+class Throws extends Matcher {
+  final Matcher _matcher;
+
+  const Throws([Matcher matcher]) : this._matcher = matcher;
+
+  bool matches(item, Map matchState) {
+    if (item is! Function && item is! Future) return false;
+    if (item is Future) {
+      var done = wrapAsync((fn) => fn());
+
+      // Queue up an asynchronous expectation that validates when the future
+      // completes.
+      item.then((value) {
+        done(() {
+          fail("Expected future to fail, but succeeded with '$value'.");
+        });
+      }, onError: (error, trace) {
+        done(() {
+          if (_matcher == null) return;
+          var reason;
+          if (trace != null) {
+            var stackTrace = trace.toString();
+            stackTrace = "  ${stackTrace.replaceAll("\n", "\n  ")}";
+            reason = "Actual exception trace:\n$stackTrace";
+          }
+          expect(error, _matcher, reason: reason);
+        });
+      });
+      // It hasn't failed yet.
+      return true;
+    }
+
+    try {
+      item();
+      return false;
+    } catch (e, s) {
+      if (_matcher == null || _matcher.matches(e, matchState)) {
+        return true;
+      } else {
+        addStateInfo(matchState, {'exception': e, 'stack': s});
+        return false;
+      }
+    }
+  }
+
+  Description describe(Description description) {
+    if (_matcher == null) {
+      return description.add("throws");
+    } else {
+      return description.add('throws ').addDescriptionOf(_matcher);
+    }
+  }
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (item is! Function && item is! Future) {
+      return mismatchDescription.add('is not a Function or Future');
+    } else if (_matcher == null || matchState['exception'] == null) {
+      return mismatchDescription.add('did not throw');
+    } else {
+      mismatchDescription
+          .add('threw ')
+          .addDescriptionOf(matchState['exception']);
+      if (verbose) {
+        mismatchDescription.add(' at ').add(matchState['stack'].toString());
+      }
+      return mismatchDescription;
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/src/matcher/throws_matchers.dart b/mojo/public/dart/third_party/unittest/lib/src/matcher/throws_matchers.dart
new file mode 100644
index 0000000..92accfd
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/matcher/throws_matchers.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.throws_matchers;
+
+import 'error_matchers.dart';
+import 'interfaces.dart';
+import 'throws_matcher.dart';
+
+/// A matcher for functions that throw ArgumentError.
+const Matcher throwsArgumentError = const Throws(isArgumentError);
+
+/// A matcher for functions that throw ConcurrentModificationError.
+const Matcher throwsConcurrentModificationError =
+    const Throws(isConcurrentModificationError);
+
+/// A matcher for functions that throw CyclicInitializationError.
+const Matcher throwsCyclicInitializationError =
+    const Throws(isCyclicInitializationError);
+
+/// A matcher for functions that throw Exception.
+const Matcher throwsException = const Throws(isException);
+
+/// A matcher for functions that throw FormatException.
+const Matcher throwsFormatException = const Throws(isFormatException);
+
+/// A matcher for functions that throw NoSuchMethodError.
+const Matcher throwsNoSuchMethodError = const Throws(isNoSuchMethodError);
+
+/// A matcher for functions that throw NullThrownError.
+const Matcher throwsNullThrownError = const Throws(isNullThrownError);
+
+/// A matcher for functions that throw RangeError.
+const Matcher throwsRangeError = const Throws(isRangeError);
+
+/// A matcher for functions that throw StateError.
+const Matcher throwsStateError = const Throws(isStateError);
+
+/// A matcher for functions that throw Exception.
+const Matcher throwsUnimplementedError = const Throws(isUnimplementedError);
+
+/// A matcher for functions that throw UnsupportedError.
+const Matcher throwsUnsupportedError = const Throws(isUnsupportedError);
diff --git a/mojo/public/dart/third_party/unittest/lib/src/matcher/util.dart b/mojo/public/dart/third_party/unittest/lib/src/matcher/util.dart
new file mode 100644
index 0000000..b98c1a8
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/matcher/util.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.util;
+
+import 'core_matchers.dart';
+import 'interfaces.dart';
+
+/// A [Map] between whitespace characters and their escape sequences.
+const _escapeMap = const {
+  '\n': r'\n',
+  '\r': r'\r',
+  '\f': r'\f',
+  '\b': r'\b',
+  '\t': r'\t',
+  '\v': r'\v',
+  '\x7F': r'\x7F', // delete
+};
+
+/// A [RegExp] that matches whitespace characters that should be escaped.
+final _escapeRegExp = new RegExp(
+    "[\\x00-\\x07\\x0E-\\x1F${_escapeMap.keys.map(_getHexLiteral).join()}]");
+
+/// Useful utility for nesting match states.
+void addStateInfo(Map matchState, Map values) {
+  var innerState = new Map.from(matchState);
+  matchState.clear();
+  matchState['state'] = innerState;
+  matchState.addAll(values);
+}
+
+/// Takes an argument and returns an equivalent [Matcher].
+///
+/// If the argument is already a matcher this does nothing,
+/// else if the argument is a function, it generates a predicate
+/// function matcher, else it generates an equals matcher.
+Matcher wrapMatcher(x) {
+  if (x is Matcher) {
+    return x;
+  } else if (x is Function) {
+    return predicate(x);
+  } else {
+    return equals(x);
+  }
+}
+
+/// Returns [str] with all whitespace characters represented as their escape
+/// sequences.
+///
+/// Backslash characters are escaped as `\\`
+String escape(String str) {
+  str = str.replaceAll('\\', r'\\');
+  return str.replaceAllMapped(_escapeRegExp, (match) {
+    var mapped = _escapeMap[match[0]];
+    if (mapped != null) return mapped;
+    return _getHexLiteral(match[0]);
+  });
+}
+
+/// Given single-character string, return the hex-escaped equivalent.
+String _getHexLiteral(String input) {
+  int rune = input.runes.single;
+  return r'\x' + rune.toRadixString(16).toUpperCase().padLeft(2, '0');
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/src/simple_configuration.dart b/mojo/public/dart/third_party/unittest/lib/src/simple_configuration.dart
new file mode 100644
index 0000000..8eac371
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/simple_configuration.dart
@@ -0,0 +1,207 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.simple_configuration;
+
+import 'dart:isolate';
+
+import 'matcher.dart'
+    show DefaultFailureHandler, configureExpectFailureHandler, TestFailure;
+
+import '../unittest.dart';
+import 'internal_test_case.dart';
+import 'utils.dart';
+
+// A custom failure handler for [expect] that routes failures to the
+// [SimpleConfiguration].
+class _ExpectFailureHandler extends DefaultFailureHandler {
+  final SimpleConfiguration _config;
+
+  _ExpectFailureHandler(this._config);
+
+  void fail(String reason) {
+    _config.onExpectFailure(reason);
+  }
+}
+
+/// A configuration that provides hooks to configure the unittest library for
+/// different platforms.
+///
+/// This class implements the [Configuration] API in a platform-independent way.
+/// Tests that want to take advantage of the platform can create a subclass and
+/// override methods from this class.
+class SimpleConfiguration extends Configuration {
+  /// A port that keeps the VM alive while we wait for asynchronous tests to
+  /// finish.
+  ///
+  /// The VM won't shut down as long as there's an open receive port.
+  ReceivePort _receivePort;
+
+  /// The name of the configuration.
+  ///
+  /// Subclasses can override this with something useful for diagnostics. It's
+  /// particularly useful for parent/child configurations such as layout tests.
+  final name = 'Configuration';
+
+  /// If true (the default), throw an exception once all tests have run if any failed.
+  bool throwOnTestFailures = true;
+
+  /// If true (the default), then tests will stop after the first failed
+  /// [expect].
+  ///
+  /// If false, failed [expect]s will not cause the test to stop. Other
+  /// exceptions will still terminate the test.
+  bool stopTestOnExpectFailure = true;
+
+  // If [stopTestOnExpectFailure] is false, the list of failed [expect]s.
+  final _testLogBuffer = <Pair<String, StackTrace>>[];
+
+  /// The constructor sets up a failure handler for [expect] that redirects
+  /// [expect] failures to [onExpectFailure].
+  SimpleConfiguration() : super.blank() {
+    configureExpectFailureHandler(new _ExpectFailureHandler(this));
+  }
+
+  void onInit() {
+    // For Dart internal tests, we don't want stack frame filtering.
+    // We turn it off here in the default config, but by default turn
+    // it back on in the vm and html configs.
+    filterStacks = false;
+    _receivePort = new ReceivePort();
+    _postMessage('unittest-suite-wait-for-done');
+  }
+
+  /// Called when a test starts.
+  ///
+  /// Derived classes should call this first before their own override code.
+  void onTestStart(TestCase testCase) => _testLogBuffer.clear();
+
+  /// Called when a test completes.
+  ///
+  /// Derived classes should call this first before their own override code.
+  void onTestResult(TestCase externalTestCase) {
+    if (stopTestOnExpectFailure || _testLogBuffer.isEmpty) return;
+
+    var testCase = externalTestCase as InternalTestCase;
+
+    // Write the message/stack pairs up to the last pairs.
+    var reason = new StringBuffer();
+    for (var reasonAndTrace in _testLogBuffer.take(_testLogBuffer.length - 1)) {
+      reason.write(reasonAndTrace.first);
+      reason.write('\n');
+      reason.write(reasonAndTrace.last);
+      reason.write('\n');
+    }
+
+    var lastReasonAndTrace = _testLogBuffer.last;
+    // Write the last message.
+    reason.write(lastReasonAndTrace.first);
+    if (testCase.result == PASS) {
+      testCase.result = FAIL;
+      testCase.message = reason.toString();
+      // Use the last stack as the overall failure stack.
+      testCase.stackTrace = lastReasonAndTrace.last;
+    } else {
+      // Add the last stack to the message; we have a further stack
+      // caused by some other failure.
+      reason.write(lastReasonAndTrace.last);
+      reason.write('\n');
+      // Add the existing reason to the end of the expect log to
+      // create the final message.
+      testCase.message = '${reason.toString()}\n${testCase.message}';
+    }
+  }
+
+  /// Handles the logging of messages by a test case.
+  ///
+  /// The default in this base configuration is to call [print].
+  void onLogMessage(TestCase testCase, String message) {
+    print(message);
+  }
+
+  /// Handles failures from [expect].
+  ///
+  /// If [stopTestOnExpectFailure] is true, this throws a [TestFailure].
+  /// Otherwise, this stores the error.
+  void onExpectFailure(String reason) {
+    if (stopTestOnExpectFailure) throw new TestFailure(reason);
+
+    try {
+      throw '';
+    } catch (_, stack) {
+      var trace = getTrace(stack, formatStacks, filterStacks);
+      if (trace == null) trace = stack;
+      _testLogBuffer.add(new Pair<String, StackTrace>(reason, trace));
+    }
+  }
+
+  /// Returns a formatted string description of a test result.
+  String formatResult(TestCase testCase) {
+    var result = new StringBuffer();
+    result.write(testCase.result.toUpperCase());
+    result.write(": ");
+    result.write(testCase.description);
+    result.write("\n");
+
+    if (testCase.message != '') {
+      result.write(indent(testCase.message));
+      result.write("\n");
+    }
+
+    if (testCase.stackTrace != null) {
+      result.write(indent(testCase.stackTrace.toString()));
+      result.write("\n");
+    }
+    return result.toString();
+  }
+
+  /// Called with the result of all test cases.
+  ///
+  /// The default implementation prints the result summary using [print],
+  /// formatted with [formatResult]. Browser tests commonly override this to
+  /// reformat the output.
+  ///
+  /// When [uncaughtError] is not null, it contains an error that occured
+  /// outside of tests (e.g. setting up the test).
+  void onSummary(int passed, int failed, int errors, List<TestCase> results,
+      String uncaughtError) {
+    // Print each test's result.
+    for (var test in results) {
+      print(formatResult(test).trim());
+    }
+
+    // Show the summary.
+    print('');
+
+    if (passed == 0 && failed == 0 && errors == 0 && uncaughtError == null) {
+      print('No tests found.');
+      // This is considered a failure too.
+    } else if (failed == 0 && errors == 0 && uncaughtError == null) {
+      print('All $passed tests passed.');
+    } else {
+      if (uncaughtError != null) {
+        print('Top-level uncaught error: $uncaughtError');
+      }
+      print('$passed PASSED, $failed FAILED, $errors ERRORS');
+    }
+  }
+
+  void onDone(bool success) {
+    if (success) {
+      _postMessage('unittest-suite-success');
+      _receivePort.close();
+    } else {
+      _receivePort.close();
+      if (throwOnTestFailures) {
+        throw new Exception('Some tests failed.');
+      }
+    }
+  }
+
+  void _postMessage(String message) {
+    // In dart2js browser tests, the JavaScript-based test controller
+    // intercepts calls to print and listens for "secret" messages.
+    print(message);
+  }
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/src/test_case.dart b/mojo/public/dart/third_party/unittest/lib/src/test_case.dart
new file mode 100644
index 0000000..37596ff
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/test_case.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.test_case;
+
+import '../unittest.dart';
+
+/// An individual unit test.
+abstract class TestCase {
+  /// A unique numeric identifier for this test case.
+  int get id;
+
+  /// A description of what the test is specifying.
+  String get description;
+
+  /// The error or failure message for the tests.
+  ///
+  /// Initially an empty string.
+  String get message;
+
+  /// The result of the test case.
+  ///
+  /// If the test case has is completed, this will be one of [PASS], [FAIL], or
+  /// [ERROR]. Otherwise, it will be `null`.
+  String get result;
+
+  /// Returns whether this test case passed.
+  bool get passed;
+
+  /// The stack trace for the error that caused this test case to fail, or
+  /// `null` if it succeeded.
+  StackTrace get stackTrace;
+
+  /// The name of the group within which this test is running.
+  String get currentGroup;
+
+  /// The time the test case started running.
+  ///
+  /// `null` if the test hasn't yet begun running.
+  DateTime get startTime;
+
+  /// The amount of time the test case took.
+  ///
+  /// `null` if the test hasn't finished running.
+  Duration get runningTime;
+
+  /// Whether this test is enabled.
+  ///
+  /// Disabled tests won't be run.
+  bool get enabled;
+
+  /// Whether this test case has finished running.
+  bool get isComplete => !enabled || result != null;
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/src/test_environment.dart b/mojo/public/dart/third_party/unittest/lib/src/test_environment.dart
new file mode 100644
index 0000000..6c205a9
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/test_environment.dart
@@ -0,0 +1,74 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.test_environment;
+
+import 'dart:async';
+
+import 'configuration.dart';
+import 'group_context.dart';
+import 'internal_test_case.dart';
+
+/// The default unittest environment.
+final _defaultEnvironment = new TestEnvironment();
+
+/// The current unittest environment.
+TestEnvironment get environment {
+  var environment = Zone.current[#unittest.environment];
+  return environment == null ? _defaultEnvironment : environment;
+}
+
+// The current environment's configuration.
+Configuration get config => environment.config;
+
+/// Encapsulates the state of the test environment.
+///
+/// This is used by the [withTestEnvironment] method to support multiple
+/// invocations of the unittest library within the same application
+/// instance.
+class TestEnvironment {
+  /// The environment's configuration.
+  Configuration config;
+
+  /// The top-level group context.
+  ///
+  /// We use a 'dummy' context for the top level to eliminate null checks when
+  /// querying the context. This allows us to easily support top-level
+  /// [setUp]/[tearDown] functions as well.
+  final rootContext = new GroupContext.root();
+
+  /// The current group context.
+  GroupContext currentContext;
+
+  /// The [currentTestCaseIndex] represents the index of the currently running
+  /// test case.
+  ///
+  /// If this is -1 it implies the test system is not running.
+  /// It will be set to [number of test cases] as a short-lived state flagging
+  /// that the last test has completed.
+  int currentTestCaseIndex = -1;
+
+  /// The [initialized] variable specifies whether the framework
+  /// has been initialized.
+  bool initialized = false;
+
+  /// The time since we last gave asynchronous code a chance to be scheduled.
+  int lastBreath = new DateTime.now().millisecondsSinceEpoch;
+
+  /// The number of [solo_group]s deep we are currently.
+  int soloNestingLevel = 0;
+
+  /// Whether we've seen a [solo_test].
+  bool soloTestSeen = false;
+
+  /// The list of test cases to run.
+  final testCases = new List<InternalTestCase>();
+
+  /// The error message that is printed in the test summary.
+  String uncaughtErrorMessage;
+
+  TestEnvironment() {
+    currentContext = rootContext;
+  }
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/src/utils.dart b/mojo/public/dart/third_party/unittest/lib/src/utils.dart
new file mode 100644
index 0000000..ea1e92e
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/src/utils.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.utils;
+
+import 'package:stack_trace/stack_trace.dart';
+
+/// Indent each line in [str] by two spaces.
+String indent(String str) =>
+    str.replaceAll(new RegExp("^", multiLine: true), "  ");
+
+/// A pair of values.
+class Pair<E, F> {
+  final E first;
+  final F last;
+
+  Pair(this.first, this.last);
+
+  String toString() => '($first, $last)';
+
+  bool operator ==(other) {
+    if (other is! Pair) return false;
+    return other.first == first && other.last == last;
+  }
+
+  int get hashCode => first.hashCode ^ last.hashCode;
+}
+
+/// Returns a Trace object from a StackTrace object or a String, or the
+/// unchanged input if formatStacks is false;
+Trace getTrace(stack, bool formatStacks, bool filterStacks) {
+  Trace trace;
+  if (stack == null || !formatStacks) return null;
+  if (stack is String) {
+    trace = new Trace.parse(stack);
+  } else if (stack is StackTrace) {
+    trace = new Trace.from(stack);
+  } else {
+    throw new Exception('Invalid stack type ${stack.runtimeType} for $stack.');
+  }
+
+  if (!filterStacks) return trace;
+
+  // Format the stack trace by removing everything above TestCase._runTest,
+  // which is usually going to be irrelevant. Also fold together unittest and
+  // core library calls so only the function the user called is visible.
+  return new Trace(trace.frames.takeWhile((frame) {
+    return frame.package != 'unittest' || frame.member != 'TestCase._runTest';
+  })).terse.foldFrames((frame) => frame.package == 'unittest' || frame.isCore);
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/test_controller.js b/mojo/public/dart/third_party/unittest/lib/test_controller.js
new file mode 100644
index 0000000..8a62d6a
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/test_controller.js
@@ -0,0 +1,233 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Test controller logic - used by unit test harness to embed tests in
+ * conent shell.
+ */
+
+// Clear the console before every test run - this is Firebug specific code.
+if (typeof console == "object" && typeof console.clear == "function") {
+  console.clear();
+}
+
+// Some tests may expect and have no way to suppress global errors.
+var testExpectsGlobalError = false;
+var testSuppressedGlobalErrors = [];
+
+// Set window onerror to make sure that we catch test harness errors across all
+// browsers.
+window.onerror = function (message, url, lineNumber) {
+  if (testExpectsGlobalError) {
+    testSuppressedGlobalErrors.push({
+      message: message
+    });
+    return;
+  }
+  if (url) {
+    showErrorAndExit(
+        "\n\n" + url + ":" + lineNumber + ":\n" + message + "\n\n");
+  } else {
+    showErrorAndExit(message);
+  }
+  window.postMessage('unittest-suite-external-error', '*');
+};
+
+// Start Dartium/content_shell, unless we are waiting for HTML Imports to load.
+// HTML Imports allows a document to link to other HTMLs documents via
+// <link rel=import>. It also allows for those other documents to contain
+// <script> tags, which must be run before scripts on the main page.
+// We have package:web_components to polyfill this feature, and it will handle
+// starting Dartium/content_shell in that case. HTML Imports is used by Polymer,
+// but it could be used by itself too. See the specification:
+// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/imports/index.html
+if (navigator.webkitStartDart && !window.HTMLImports) {
+  navigator.webkitStartDart();
+}
+
+// testRunner is provided by content shell.
+// It is not available in browser tests.
+var testRunner = window.testRunner || window.layoutTestController;
+
+var waitForDone = false;
+
+// Returns the driving window object if available
+function getDriverWindow() {
+  if (window != window.parent) {
+    // We're running in an iframe.
+    return window.parent;
+  } else if (window.opener) {
+    // We were opened by another window.
+    return window.opener;
+  }
+  return null;
+}
+
+function notifyStart() {
+  var driver = getDriverWindow();
+  if (driver) {
+    driver.postMessage("STARTING", "*");
+  }
+}
+// We call notifyStart here to notify the encapsulating browser.
+notifyStart();
+
+function notifyDone() {
+  if (testRunner) testRunner.notifyDone();
+
+  // TODO(ricow): REMOVE, debug info, see issue 13292
+  if (!testRunner) {
+    printMessage('Calling notifyDone()');
+  }
+  // To support in browser launching of tests we post back start and result
+  // messages to the window.opener.
+  var driver = getDriverWindow();
+  if (driver) {
+    driver.postMessage(window.document.body.innerHTML, "*");
+  }
+}
+
+function processMessage(msg) {
+  if (typeof msg != 'string') return;
+  // TODO(ricow): REMOVE, debug info, see issue 13292
+  if (!testRunner) {
+    // Filter out ShadowDOM polyfill messages which are random floats.
+    if (msg != parseFloat(msg)) {
+      printMessage('processMessage(): ' + msg);
+    }
+  }
+  if (msg == 'unittest-suite-done') {
+    notifyDone();
+  } else if (msg == 'unittest-suite-wait-for-done') {
+    waitForDone = true;
+    if (testRunner) {
+      testRunner.startedDartTest = true;
+    }
+  } else if (msg == 'dart-calling-main') {
+    if (testRunner) {
+      testRunner.startedDartTest = true;
+    }
+  } else if (msg == 'dart-main-done') {
+    if (!waitForDone) {
+      printMessage('PASS');
+      notifyDone();
+    }
+  } else if (msg == 'unittest-suite-success') {
+    printMessage('PASS');
+    notifyDone();
+  } else if (msg == 'unittest-suite-fail') {
+    showErrorAndExit('Some tests failed.');
+  }
+}
+
+function onReceive(e) {
+  processMessage(e.data);
+}
+
+if (testRunner) {
+  testRunner.dumpAsText();
+  testRunner.waitUntilDone();
+}
+window.addEventListener("message", onReceive, false);
+
+function showErrorAndExit(message) {
+  if (message) {
+    printMessage('Error: ' + String(message));
+  }
+  // dart/tools/testing/test_runner.dart is looking for either PASS or
+  // FAIL in a browser test's output.
+  printMessage('FAIL');
+  notifyDone();
+}
+
+function onLoad(e) {
+  // needed for dartium compilation errors.
+  if (window.compilationError) {
+    showErrorAndExit(window.compilationError);
+  }
+}
+
+window.addEventListener("DOMContentLoaded", onLoad, false);
+
+// Note: before renaming this function, note that it is also included in an
+// inlined error handler in the HTML files that wrap DRT tests.
+// See: tools/testing/dart/browser_test.dart
+function externalError(e) {
+  // needed for dartium compilation errors.
+  showErrorAndExit(e && e.message);
+  window.postMessage('unittest-suite-external-error', '*');
+}
+
+document.addEventListener('readystatechange', function () {
+  if (document.readyState != "loaded") return;
+  // If 'startedDartTest' is not set, that means that the test did not have
+  // a chance to load. This will happen when a load error occurs in the VM.
+  // Give the machine time to start up.
+  setTimeout(function() {
+    // A window.postMessage might have been enqueued after this timeout.
+    // Just sleep another time to give the browser the time to process the
+    // posted message.
+    setTimeout(function() {
+      if (testRunner && !testRunner.startedDartTest) {
+        notifyDone();
+      }
+    }, 0);
+  }, 50);
+});
+
+// dart2js will generate code to call this function to handle the Dart
+// [print] method.
+//
+// dartium will invoke this method for [print] calls if the environment variable
+// "DART_FORWARDING_PRINT" was set when launching dartium.
+//
+// Our tests will be wrapped, so we can detect when [main] is called and when
+// it has ended.
+// The wrapping happens either via "dartMainRunner" (for dart2js) or wrapped
+// tests for dartium.
+//
+// The following messages are handled specially:
+//   dart-calling-main:  signals that the dart [main] function will be invoked
+//   dart-main-done:  signals that the dart [main] function has finished
+//   unittest-suite-wait-for-done:  signals the start of an asynchronous test
+//   unittest-suite-success:  signals the end of an asynchrounous test
+//
+// These messages are used to communicate with the test and will be posted so
+// [processMessage] above can see it.
+function dartPrint(msg) {
+  if ((msg === 'unittest-suite-success')
+      || (msg === 'unittest-suite-done')
+      || (msg === 'unittest-suite-wait-for-done')
+      || (msg === 'dart-calling-main')
+      || (msg === 'dart-main-done')) {
+    window.postMessage(msg, '*');
+    return;
+  }
+  printMessage(msg);
+}
+
+// Prints 'msg' to the console (if available) and to the body of the html
+// document.
+function printMessage(msg) {
+  if (typeof console === 'object') console.warn(msg);
+  var pre = document.createElement('pre');
+  pre.appendChild(document.createTextNode(String(msg)));
+  document.body.appendChild(pre);
+  document.body.appendChild(document.createTextNode('\n'));
+}
+
+// dart2js will generate code to call this function instead of calling
+// Dart [main] directly. The argument is a closure that invokes main.
+function dartMainRunner(main) {
+  dartPrint('dart-calling-main');
+  try {
+    main();
+  } catch (e) {
+    dartPrint(e);
+    if (e.stack) dartPrint(e.stack);
+    window.postMessage('unittest-suite-fail', '*');
+    return;
+  }
+  dartPrint('dart-main-done');
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/unittest.dart b/mojo/public/dart/third_party/unittest/lib/unittest.dart
new file mode 100644
index 0000000..51ccff4
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/unittest.dart
@@ -0,0 +1,440 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest;
+
+import 'dart:async';
+import 'dart:collection';
+
+import 'src/configuration.dart';
+import 'src/expected_function.dart';
+import 'src/group_context.dart';
+import 'src/internal_test_case.dart';
+import 'src/matcher.dart' show TestFailure, wrapAsync;
+import 'src/test_case.dart';
+import 'src/test_environment.dart';
+
+export 'src/configuration.dart';
+export 'src/matcher.dart';
+export 'src/simple_configuration.dart';
+export 'src/test_case.dart';
+
+/// The signature for a function passed to [test].
+typedef dynamic TestFunction();
+
+/// [Configuration] used by the unittest library.
+///
+/// Note that if a configuration has not been set, calling this getter will
+/// create a default configuration.
+Configuration get unittestConfiguration {
+  if (config == null) environment.config = new Configuration();
+  return config;
+}
+
+/// If `true`, stack traces are reformatted to be more readable.
+bool formatStacks = true;
+
+/// If `true`, irrelevant frames are filtered from the stack trace.
+///
+/// This does nothing if [formatStacks] is false.
+bool filterStacks = true;
+
+/// Separator used between group names and test names.
+String groupSep = ' ';
+
+/// Sets the [Configuration] used by the unittest library.
+///
+/// Throws a [StateError] if there is an existing, incompatible value.
+void set unittestConfiguration(Configuration value) {
+  if (identical(config, value)) return;
+  if (config != null) {
+    logMessage('Warning: The unittestConfiguration has already been set. New '
+        'unittestConfiguration ignored.');
+  } else {
+    environment.config = value;
+  }
+}
+
+/// Logs [message] associated with the current test case.
+///
+/// Tests should use this instead of [print].
+void logMessage(String message) =>
+    config.onLogMessage(currentTestCase, message);
+
+/// The test cases that have been defined so far.
+List<TestCase> get testCases =>
+    new UnmodifiableListView<TestCase>(environment.testCases);
+
+/// The interval (in milliseconds) after which a non-microtask asynchronous
+/// delay will be scheduled between tests.
+///
+/// This is used to avoid starving the DOM or other non-microtask events.
+const int BREATH_INTERVAL = 200;
+
+/// The [TestCase] currently being executed.
+TestCase get currentTestCase => (environment.currentTestCaseIndex >= 0 &&
+        environment.currentTestCaseIndex < testCases.length)
+    ? testCases[environment.currentTestCaseIndex]
+    : null;
+
+/// The same as [currentTestCase], but typed as an [InternalTestCase].
+InternalTestCase get _currentTestCase => currentTestCase as InternalTestCase;
+
+/// The result string for a passing test case.
+const PASS = 'pass';
+
+/// The result string for a failing test case.
+const FAIL = 'fail';
+
+/// The result string for an test case with an error.
+const ERROR = 'error';
+
+/// Creates a new test case with the given description and body.
+///
+/// The description will be added to the descriptions of any surrounding
+/// [group]s.
+void test(String description, TestFunction body) {
+  _requireNotRunning();
+  ensureInitialized();
+
+  if (environment.soloTestSeen && environment.soloNestingLevel == 0) return;
+  var testCase = new InternalTestCase(
+      testCases.length + 1, _fullDescription(description), body);
+  environment.testCases.add(testCase);
+}
+
+/// Returns [description] with all of its group prefixes prepended.
+String _fullDescription(String description) {
+  var group = environment.currentContext.fullName;
+  if (description == null) return group;
+  return group != '' ? '$group$groupSep$description' : description;
+}
+
+/// A convenience function for skipping a test.
+void skip_test(String spec, TestFunction body) {}
+
+/// Creates a new test case with the given description and body.
+///
+/// If [solo_test] is used instead of [test], then all non-solo tests will be
+/// disabled. Note that if [solo_group] is used as well, all tests in the group
+/// will be enabled, regardless of whether they use [test] or [solo_test], or
+/// whether they are in a nested [group] versus [solo_group]. Put another way,
+/// if there are any calls to [solo_test] or [solo_group] in a test file, all
+/// tests that are not inside a [solo_group] will be disabled unless they are
+/// [solo_test]s.
+void solo_test(String spec, TestFunction body) {
+  _requireNotRunning();
+  ensureInitialized();
+  if (!environment.soloTestSeen) {
+    environment.soloTestSeen = true;
+    // This is the first solo-ed test. Discard all tests up to now.
+    environment.testCases.clear();
+  }
+  environment.soloNestingLevel++;
+  try {
+    test(spec, body);
+  } finally {
+    environment.soloNestingLevel--;
+  }
+}
+
+/// Indicate that [callback] is expected to be called [count] number of times
+/// (by default 1).
+///
+/// The unittest framework will wait for the callback to run the [count] times
+/// before it considers the current test to be complete. Using [expectAsync]
+/// will also ensure that errors that occur within [callback] are tracked and
+/// reported. [callback] may take up to six optional or required positional
+/// arguments; named arguments are not supported.
+///
+/// [max] can be used to specify an upper bound on the number of calls; if this
+/// is exceeded the test will fail. If [max] is `0` (the default), the callback
+/// is expected to be called exactly [count] times. If [max] is `-1`, the
+/// callback is allowed to be called any number of times greater than [count].
+///
+/// Both [id] and [reason] are optional and provide extra information about the
+/// callback when debugging. [id] should be the name of the callback, while
+/// [reason] should be the reason the callback is expected to be called.
+Function expectAsync(Function callback,
+    {int count: 1, int max: 0, String id, String reason}) =>
+        new ExpectedFunction(callback, count, max, id: id, reason: reason).func;
+
+/// Indicate that [callback] is expected to be called until [isDone] returns
+/// true.
+///
+/// [isDone] is called after each time the function is run. Only when it returns
+/// true will the callback be considered complete. Using [expectAsyncUntil] will
+/// also ensure that errors that occur within [callback] are tracked and
+/// reported. [callback] may take up to six optional or required positional
+/// arguments; named arguments are not supported.
+///
+/// Both [id] and [reason] are optional and provide extra information about the
+/// callback when debugging. [id] should be the name of the callback, while
+/// [reason] should be the reason the callback is expected to be called.
+Function expectAsyncUntil(Function callback, bool isDone(),
+    {String id, String reason}) => new ExpectedFunction(callback, 0, -1,
+        id: id, reason: reason, isDone: isDone).func;
+
+/// Creates a group of tests.
+///
+/// A group's description is included in the descriptions of any tests or
+/// sub-groups it contains. [setUp] and [tearDown] are also scoped to the
+/// containing group.
+void group(String description, void body()) {
+  ensureInitialized();
+  _requireNotRunning();
+  environment.currentContext =
+      new GroupContext(environment.currentContext, description);
+  try {
+    body();
+  } catch (e, trace) {
+    var stack = (trace == null) ? '' : ': ${trace.toString()}';
+    environment.uncaughtErrorMessage = "${e.toString()}$stack";
+  } finally {
+    // Now that the group is over, restore the previous one.
+    environment.currentContext = environment.currentContext.parent;
+  }
+}
+
+/// A convenience function for skipping a group of tests.
+void skip_group(String description, void body()) {}
+
+/// Creates a group of tests.
+///
+/// If [solo_group] is used instead of [group], then all tests not declared with
+/// [solo_test] or in a [solo_group] will be disabled. Note that all tests in a
+/// [solo_group] will be run, regardless of whether they're declared with [test]
+/// or [solo_test].
+///
+/// [skip_test] and [skip_group] take precedence over [solo_group].
+void solo_group(String description, void body()) {
+  _requireNotRunning();
+  ensureInitialized();
+  if (!environment.soloTestSeen) {
+    environment.soloTestSeen = true;
+    // This is the first solo-ed group. Discard all tests up to now.
+    environment.testCases.clear();
+  }
+  ++environment.soloNestingLevel;
+  try {
+    group(description, body);
+  } finally {
+    --environment.soloNestingLevel;
+  }
+}
+
+/// Registers a function to be run before tests.
+///
+/// This function will be called before each test is run. [callback] may be
+/// asynchronous; if so, it must return a [Future].
+///
+/// If this is called within a test group, it applies only to tests in that
+/// group. [callback] will be run after any set-up callbacks in parent groups or
+/// at the top level.
+void setUp(Function callback) {
+  _requireNotRunning();
+  environment.currentContext.testSetUp = callback;
+}
+
+/// Registers a function to be run after tests.
+///
+/// This function will be called after each test is run. [callback] may be
+/// asynchronous; if so, it must return a [Future].
+///
+/// If this is called within a test group, it applies only to tests in that
+/// group. [callback] will be run before any tear-down callbacks in parent groups or
+/// at the top level.
+void tearDown(Function callback) {
+  _requireNotRunning();
+  environment.currentContext.testTearDown = callback;
+}
+
+/// Advance to the next test case.
+void _nextTestCase() {
+  environment.currentTestCaseIndex++;
+  _runTest();
+}
+
+/// Handle an error that occurs outside of any test.
+void handleExternalError(e, String message, [stackTrace]) {
+  var msg = '$message\nCaught $e';
+
+  if (currentTestCase != null) {
+    _currentTestCase.error(msg, stackTrace);
+  } else {
+    environment.uncaughtErrorMessage = "$msg: $stackTrace";
+  }
+}
+
+/// Remove any tests that match [testFilter].
+///
+/// [testFilter] can be a predicate function, a [RegExp], or a [String]. If it's
+/// a function, it's called with each [TestCase]. If it's a [String], it's
+/// parsed as a [RegExp] and matched against each [TestCase.description].
+///
+/// This is different from enabling or disabling tests in that it removes the
+/// tests completely.
+void filterTests(testFilter) {
+  var filterFunction;
+  if (testFilter is String) {
+    var re = new RegExp(testFilter);
+    filterFunction = (t) => re.hasMatch(t.description);
+  } else if (testFilter is RegExp) {
+    filterFunction = (t) => testFilter.hasMatch(t.description);
+  } else if (testFilter is Function) {
+    filterFunction = testFilter;
+  }
+  environment.testCases.retainWhere(filterFunction);
+}
+
+/// Runs all queued tests, one at a time.
+void runTests() {
+  _requireNotRunning();
+  _ensureInitialized(false);
+  environment.currentTestCaseIndex = 0;
+  config.onStart();
+  _runTest();
+}
+
+/// Registers an exception that was caught for the current test.
+void registerException(error, [StackTrace stackTrace]) =>
+    _currentTestCase.registerException(error, stackTrace);
+
+/// Runs the next test.
+void _runTest() {
+  if (environment.currentTestCaseIndex >= testCases.length) {
+    assert(environment.currentTestCaseIndex == testCases.length);
+    _completeTests();
+    return;
+  }
+
+  var testCase = _currentTestCase;
+  var f = runZoned(testCase.run, onError: (error, stack) {
+    // TODO(kevmoo) Do a better job of flagging these are async errors.
+    // https://code.google.com/p/dart/issues/detail?id=16530
+    testCase.registerException(error, stack);
+  });
+
+  var timer;
+  var timeout = unittestConfiguration.timeout;
+  if (timeout != null) {
+    try {
+      timer = new Timer(timeout, () {
+        testCase.error("Test timed out after ${timeout.inSeconds} seconds.");
+        _nextTestCase();
+      });
+    } on UnsupportedError catch (e) {
+      if (e.message != "Timer greater than 0.") rethrow;
+      // Support running on d8 and jsshell which don't support timers.
+    }
+  }
+
+  f.whenComplete(() {
+    if (timer != null) timer.cancel();
+    var now = new DateTime.now().millisecondsSinceEpoch;
+    if (now - environment.lastBreath >= BREATH_INTERVAL) {
+      environment.lastBreath = now;
+      Timer.run(_nextTestCase);
+    } else {
+      scheduleMicrotask(_nextTestCase); // Schedule the next test.
+    }
+  });
+}
+
+/// Notify the configuration that the testing has finished.
+void _completeTests() {
+  if (!environment.initialized) return;
+
+  var passed = 0;
+  var failed = 0;
+  var errors = 0;
+  for (var testCase in testCases) {
+    switch (testCase.result) {
+      case PASS:
+        passed++;
+        break;
+      case FAIL:
+        failed++;
+        break;
+      case ERROR:
+        errors++;
+        break;
+    }
+  }
+
+  config.onSummary(
+      passed, failed, errors, testCases, environment.uncaughtErrorMessage);
+  config.onDone(passed > 0 &&
+      failed == 0 &&
+      errors == 0 &&
+      environment.uncaughtErrorMessage == null);
+  environment.initialized = false;
+  environment.currentTestCaseIndex = -1;
+}
+
+/// Initializes the test environment if it hasn't already been initialized.
+void ensureInitialized() {
+  _ensureInitialized(true);
+}
+
+/// Initializes the test environment.
+///
+/// If [configAutoStart] is `true`, schedule a microtask to run the tests. This
+/// microtask is expected to run after all the tests are defined.
+void _ensureInitialized(bool configAutoStart) {
+  if (environment.initialized) return;
+
+  environment.initialized = true;
+  // Hook our async guard into the matcher library.
+  wrapAsync = (f, [id]) => expectAsync(f, id: id);
+
+  environment.uncaughtErrorMessage = null;
+
+  unittestConfiguration.onInit();
+
+  // Immediately queue the suite up. It will run after a timeout (i.e. after
+  // main() has returned).
+  if (configAutoStart && config.autoStart) scheduleMicrotask(runTests);
+}
+
+/// Remove all tests other than the one identified by [id].
+void setSoloTest(int id) =>
+    environment.testCases.retainWhere((t) => t.id == id);
+
+/// Enable the test identified by [id].
+void enableTest(int id) => _setTestEnabledState(id, enable: true);
+
+/// Disable the test by [id].
+void disableTest(int id) => _setTestEnabledState(id, enable: false);
+
+/// Enable or disable the test identified by [id].
+void _setTestEnabledState(int id, {bool enable: true}) {
+  // Try fast path first.
+  if (testCases.length > id && testCases[id].id == id) {
+    environment.testCases[id].enabled = enable;
+  } else {
+    for (var i = 0; i < testCases.length; i++) {
+      if (testCases[i].id != id) continue;
+      environment.testCases[i].enabled = enable;
+      break;
+    }
+  }
+}
+
+/// Throws a [StateError] if tests are running.
+void _requireNotRunning() {
+  if (environment.currentTestCaseIndex == -1) return;
+  throw new StateError('Not allowed when tests are running.');
+}
+
+/// Creates a test environment running in its own zone scope.
+///
+/// This allows for multiple invocations of the unittest library in the same
+/// application instance. This is useful when, for example, creating a test
+/// runner application which needs to create a new pristine test environment on
+/// each invocation to run a given set of tests.
+withTestEnvironment(callback()) {
+  return runZoned(callback,
+      zoneValues: {#unittest.environment: new TestEnvironment()});
+}
diff --git a/mojo/public/dart/third_party/unittest/lib/vm_config.dart b/mojo/public/dart/third_party/unittest/lib/vm_config.dart
new file mode 100644
index 0000000..77e91e3
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/lib/vm_config.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A simple unit test library for running tests on the VM.
+library unittest.vm_config;
+
+import 'dart:async';
+import 'dart:io';
+import 'unittest.dart';
+
+class VMConfiguration extends SimpleConfiguration {
+  // Color constants used for generating messages.
+  final String GREEN_COLOR = '\u001b[32m';
+  final String RED_COLOR = '\u001b[31m';
+  final String MAGENTA_COLOR = '\u001b[35m';
+  final String NO_COLOR = '\u001b[0m';
+
+  // We make this public so the user can turn it off if they want.
+  bool useColor;
+
+  VMConfiguration()
+      : super(),
+        useColor = stdioType(stdout) == StdioType.TERMINAL;
+
+  String formatResult(TestCase testCase) {
+    String result = super.formatResult(testCase);
+    if (useColor) {
+      if (testCase.result == PASS) {
+        return "${GREEN_COLOR}${result}${NO_COLOR}";
+      } else if (testCase.result == FAIL) {
+        return "${RED_COLOR}${result}${NO_COLOR}";
+      } else if (testCase.result == ERROR) {
+        return "${MAGENTA_COLOR}${result}${NO_COLOR}";
+      }
+    }
+    return result;
+  }
+
+  void onInit() {
+    super.onInit();
+    filterStacks = formatStacks = true;
+  }
+
+  void onDone(bool success) {
+    int status;
+    try {
+      super.onDone(success);
+      status = 0;
+    } catch (ex) {
+      // A non-zero exit code is used by the test infrastructure to detect
+      // failure.
+      status = 1;
+    }
+    Future.wait([stdout.close(), stderr.close()]).then((_) {
+      exit(status);
+    });
+  }
+}
+
+void useVMConfiguration() {
+  unittestConfiguration = _singleton;
+}
+
+final _singleton = new VMConfiguration();
diff --git a/mojo/public/dart/third_party/unittest/out.js b/mojo/public/dart/third_party/unittest/out.js
new file mode 100644
index 0000000..925e952
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/out.js
@@ -0,0 +1,5440 @@
+// Generated by dart2js, the Dart to JavaScript compiler version: 1.11.0-edge.131474.
+// The code supports the following hooks:
+// dartPrint(message):
+//    if this function is defined it is called instead of the Dart [print]
+//    method.
+//
+// dartMainRunner(main, args):
+//    if this function is defined, the Dart [main] method will not be invoked
+//    directly. Instead, a closure that will invoke [main], and its arguments
+//    [args] is passed to [dartMainRunner].
+//
+// dartDeferredLibraryLoader(uri, successCallback, errorCallback):
+//    if this function is defined, it will be called when a deferered library
+//    is loaded. It should load and eval the javascript of `uri`, and call
+//    successCallback. If it fails to do so, it should call errorCallback with
+//    an error.
+(function($) {
+var supportsDirectProtoAccess = function() {
+  var cls = function() {
+  };
+  cls.prototype = {p: {}};
+  var object = new cls();
+  return object.__proto__ && object.__proto__.p === cls.prototype.p;
+}();
+;
+function map(x) {
+  x = Object.create(null);
+  x.x = 0;
+  delete x.x;
+  return x;
+}
+var A = map();
+var B = map();
+var C = map();
+var D = map();
+var E = map();
+var F = map();
+var G = map();
+var H = map();
+var J = map();
+var K = map();
+var L = map();
+var M = map();
+var N = map();
+var O = map();
+var P = map();
+var Q = map();
+var R = map();
+var S = map();
+var T = map();
+var U = map();
+var V = map();
+var W = map();
+var X = map();
+var Y = map();
+var Z = map();
+function Isolate() {}
+init();
+
+$ = Isolate.$isolateProperties;
+$.functionThatReturnsNull = function() {
+};
+;
+function setupProgram(programData, typesOffset) {
+  "use strict";
+  function generateAccessor(fieldDescriptor, accessors, cls) {
+    var fieldInformation = fieldDescriptor.split("-");
+    var field = fieldInformation[0];
+    var len = field.length;
+    var code = field.charCodeAt(len - 1);
+    var reflectable;
+    if (fieldInformation.length > 1)
+      reflectable = true;
+    else
+      reflectable = false;
+    code = code >= 60 && code <= 64 ? code - 59 : code >= 123 && code <= 126 ? code - 117 : code >= 37 && code <= 43 ? code - 27 : 0;
+    if (code) {
+      var getterCode = code & 3;
+      var setterCode = code >> 2;
+      var accessorName = field = field.substring(0, len - 1);
+      var divider = field.indexOf(":");
+      if (divider > 0) {
+        accessorName = field.substring(0, divider);
+        field = field.substring(divider + 1);
+      }
+      if (getterCode) {
+        var args = getterCode & 2 ? "receiver" : "";
+        var receiver = getterCode & 1 ? "this" : "receiver";
+        var body = "return " + receiver + "." + field;
+        var property = cls + ".prototype.get$" + accessorName + "=";
+        var fn = "function(" + args + "){" + body + "}";
+        if (reflectable)
+          accessors.push(property + "$reflectable(" + fn + ");\n");
+        else
+          accessors.push(property + fn + ";\n");
+      }
+      if (setterCode) {
+        var args = setterCode & 2 ? "receiver, value" : "value";
+        var receiver = setterCode & 1 ? "this" : "receiver";
+        var body = receiver + "." + field + " = value";
+        var property = cls + ".prototype.set$" + accessorName + "=";
+        var fn = "function(" + args + "){" + body + "}";
+        if (reflectable)
+          accessors.push(property + "$reflectable(" + fn + ");\n");
+        else
+          accessors.push(property + fn + ";\n");
+      }
+    }
+    return field;
+  }
+  function defineClass(name, fields) {
+    var accessors = [];
+    var str = "function " + name + "(";
+    var body = "";
+    var fieldNames = "";
+    for (var i = 0; i < fields.length; i++) {
+      if (i != 0)
+        str += ", ";
+      var field = generateAccessor(fields[i], accessors, name);
+      fieldNames += "'" + field + "',";
+      var parameter = "p_" + field;
+      str += parameter;
+      body += "this." + field + " = " + parameter + ";\n";
+    }
+    if (supportsDirectProtoAccess)
+      body += "this." + "$deferredAction" + "();";
+    str += ") {\n" + body + "}\n";
+    str += name + ".builtin$cls=\"" + name + "\";\n";
+    str += "$desc=$collectedClasses." + name + "[1];\n";
+    str += name + ".prototype = $desc;\n";
+    if (typeof defineClass.name != "string")
+      str += name + ".name=\"" + name + "\";\n";
+    str += name + "." + "$__fields__" + "=[" + fieldNames + "];\n";
+    str += accessors.join("");
+    return str;
+  }
+  init.createNewIsolate = function() {
+    return new Isolate();
+  };
+  init.classIdExtractor = function(o) {
+    return o.constructor.name;
+  };
+  init.classFieldsExtractor = function(o) {
+    var fieldNames = o.constructor.$__fields__;
+    if (!fieldNames)
+      return [];
+    var result = [];
+    result.length = fieldNames.length;
+    for (var i = 0; i < fieldNames.length; i++)
+      result[i] = o[fieldNames[i]];
+    return result;
+  };
+  init.instanceFromClassId = function(name) {
+    return new init.allClasses[name]();
+  };
+  init.initializeEmptyInstance = function(name, o, fields) {
+    init.allClasses[name].apply(o, fields);
+    return o;
+  };
+  var inheritFrom = supportsDirectProtoAccess ? function(constructor, superConstructor) {
+    var prototype = constructor.prototype;
+    prototype.__proto__ = superConstructor.prototype;
+    prototype.constructor = constructor;
+    prototype["$is" + constructor.name] = constructor;
+    return convertToFastObject(prototype);
+  } : function() {
+    function tmp() {
+    }
+    return function(constructor, superConstructor) {
+      tmp.prototype = superConstructor.prototype;
+      var object = new tmp();
+      convertToSlowObject(object);
+      var properties = constructor.prototype;
+      var members = Object.keys(properties);
+      for (var i = 0; i < members.length; i++) {
+        var member = members[i];
+        object[member] = properties[member];
+      }
+      object["$is" + constructor.name] = constructor;
+      object.constructor = constructor;
+      constructor.prototype = object;
+      return object;
+    };
+  }();
+  function finishClasses(processedClasses) {
+    var allClasses = init.allClasses;
+    processedClasses.combinedConstructorFunction += "return [\n" + processedClasses.constructorsList.join(",\n  ") + "\n]";
+    var constructors = new Function("$collectedClasses", processedClasses.combinedConstructorFunction)(processedClasses.collected);
+    processedClasses.combinedConstructorFunction = null;
+    for (var i = 0; i < constructors.length; i++) {
+      var constructor = constructors[i];
+      var cls = constructor.name;
+      var desc = processedClasses.collected[cls];
+      var globalObject = desc[0];
+      desc = desc[1];
+      allClasses[cls] = constructor;
+      globalObject[cls] = constructor;
+    }
+    constructors = null;
+    var finishedClasses = init.finishedClasses;
+    function finishClass(cls) {
+      if (finishedClasses[cls])
+        return;
+      finishedClasses[cls] = true;
+      var superclass = processedClasses.pending[cls];
+      if (!superclass || typeof superclass != "string") {
+        var constructor = allClasses[cls];
+        var prototype = constructor.prototype;
+        prototype.constructor = constructor;
+        prototype.$isObject = constructor;
+        prototype.$deferredAction = function() {
+        };
+        return;
+      }
+      finishClass(superclass);
+      var superConstructor = allClasses[superclass];
+      if (!superConstructor)
+        superConstructor = existingIsolateProperties[superclass];
+      var constructor = allClasses[cls];
+      var prototype = inheritFrom(constructor, superConstructor);
+      if (prototype.$isInterceptor)
+        prototype.$deferredAction();
+    }
+    var properties = Object.keys(processedClasses.pending);
+    for (var i = 0; i < properties.length; i++)
+      finishClass(properties[i]);
+  }
+  function finishAddStubsHelper() {
+    var prototype = this;
+    while (!prototype.hasOwnProperty("$deferredAction"))
+      prototype = prototype.__proto__;
+    delete prototype.$deferredAction;
+    var properties = Object.keys(prototype);
+    for (var index = 0; index < properties.length; index++) {
+      var property = properties[index];
+      var firstChar = property.charCodeAt(0);
+      var elem;
+      if (property !== "^" && property !== "$reflectable" && firstChar !== 43 && firstChar !== 42 && (elem = prototype[property]) != null && elem.constructor === Array && property !== "<>")
+        addStubs(prototype, elem, property, false, []);
+    }
+    convertToFastObject(prototype);
+    prototype = prototype.__proto__;
+    prototype.$deferredAction();
+  }
+  function processClassData(cls, descriptor, processedClasses) {
+    descriptor = convertToSlowObject(descriptor);
+    var previousProperty;
+    var properties = Object.keys(descriptor);
+    var hasDeferredWork = false;
+    var shouldDeferWork = supportsDirectProtoAccess && cls != "Object";
+    for (var i = 0; i < properties.length; i++) {
+      var property = properties[i];
+      var firstChar = property.charCodeAt(0);
+      if (property === "static") {
+        processStatics(init.statics[cls] = descriptor.static, processedClasses);
+        delete descriptor.static;
+      } else if (firstChar === 43) {
+        mangledNames[previousProperty] = property.substring(1);
+        var flag = descriptor[property];
+        if (flag > 0)
+          descriptor[previousProperty].$reflectable = flag;
+      } else if (firstChar === 42) {
+        descriptor[previousProperty].$defaultValues = descriptor[property];
+        var optionalMethods = descriptor.$methodsWithOptionalArguments;
+        if (!optionalMethods)
+          descriptor.$methodsWithOptionalArguments = optionalMethods = {};
+        optionalMethods[property] = previousProperty;
+      } else {
+        var elem = descriptor[property];
+        if (property !== "^" && elem != null && elem.constructor === Array && property !== "<>")
+          if (shouldDeferWork)
+            hasDeferredWork = true;
+          else
+            addStubs(descriptor, elem, property, false, []);
+        else
+          previousProperty = property;
+      }
+    }
+    if (hasDeferredWork)
+      descriptor.$deferredAction = finishAddStubsHelper;
+    var classData = descriptor["^"], split, supr, fields = classData;
+    var s = fields.split(";");
+    fields = s[1] == "" ? [] : s[1].split(",");
+    supr = s[0];
+    split = supr.split(":");
+    if (split.length == 2) {
+      supr = split[0];
+      var functionSignature = split[1];
+      if (functionSignature)
+        descriptor.$signature = function(s) {
+          return function() {
+            return init.types[s];
+          };
+        }(functionSignature);
+    }
+    if (supr)
+      processedClasses.pending[cls] = supr;
+    processedClasses.combinedConstructorFunction += defineClass(cls, fields);
+    processedClasses.constructorsList.push(cls);
+    processedClasses.collected[cls] = [globalObject, descriptor];
+    classes.push(cls);
+  }
+  function processStatics(descriptor, processedClasses) {
+    var properties = Object.keys(descriptor);
+    for (var i = 0; i < properties.length; i++) {
+      var property = properties[i];
+      if (property === "^")
+        continue;
+      var element = descriptor[property];
+      var firstChar = property.charCodeAt(0);
+      var previousProperty;
+      if (firstChar === 43) {
+        mangledGlobalNames[previousProperty] = property.substring(1);
+        var flag = descriptor[property];
+        if (flag > 0)
+          descriptor[previousProperty].$reflectable = flag;
+        if (element && element.length)
+          init.typeInformation[previousProperty] = element;
+      } else if (firstChar === 42) {
+        globalObject[previousProperty].$defaultValues = element;
+        var optionalMethods = descriptor.$methodsWithOptionalArguments;
+        if (!optionalMethods)
+          descriptor.$methodsWithOptionalArguments = optionalMethods = {};
+        optionalMethods[property] = previousProperty;
+      } else if (typeof element === "function") {
+        globalObject[previousProperty = property] = element;
+        functions.push(property);
+        init.globalFunctions[property] = element;
+      } else if (element.constructor === Array)
+        addStubs(globalObject, element, property, true, functions);
+      else {
+        previousProperty = property;
+        processClassData(property, element, processedClasses);
+      }
+    }
+  }
+  function addStubs(prototype, array, name, isStatic, functions) {
+    var index = 0, alias = array[index], f;
+    if (typeof alias == "string")
+      f = array[++index];
+    else {
+      f = alias;
+      alias = name;
+    }
+    var funcs = [prototype[name] = prototype[alias] = f];
+    f.$stubName = name;
+    functions.push(name);
+    for (index++; index < array.length; index++) {
+      f = array[index];
+      if (typeof f != "function")
+        break;
+      if (!isStatic)
+        f.$stubName = array[++index];
+      funcs.push(f);
+      if (f.$stubName) {
+        prototype[f.$stubName] = f;
+        functions.push(f.$stubName);
+      }
+    }
+    for (var i = 0; i < funcs.length; index++, i++)
+      funcs[i].$callName = array[index];
+    var getterStubName = array[index];
+    array = array.slice(++index);
+    var requiredParameterInfo = array[0];
+    var requiredParameterCount = requiredParameterInfo >> 1;
+    var isAccessor = (requiredParameterInfo & 1) === 1;
+    var isSetter = requiredParameterInfo === 3;
+    var isGetter = requiredParameterInfo === 1;
+    var optionalParameterInfo = array[1];
+    var optionalParameterCount = optionalParameterInfo >> 1;
+    var optionalParametersAreNamed = (optionalParameterInfo & 1) === 1;
+    var isIntercepted = requiredParameterCount + optionalParameterCount != funcs[0].length;
+    var functionTypeIndex = array[2];
+    if (typeof functionTypeIndex == "number")
+      array[2] = functionTypeIndex + typesOffset;
+    var unmangledNameIndex = 2 * optionalParameterCount + requiredParameterCount + 3;
+    if (getterStubName) {
+      f = tearOff(funcs, array, isStatic, name, isIntercepted);
+      prototype[name].$getter = f;
+      f.$getterStub = true;
+      if (isStatic) {
+        init.globalFunctions[name] = f;
+        functions.push(getterStubName);
+      }
+      prototype[getterStubName] = f;
+      funcs.push(f);
+      f.$stubName = getterStubName;
+      f.$callName = null;
+    }
+  }
+  function tearOffGetter(funcs, reflectionInfo, name, isIntercepted) {
+    return isIntercepted ? new Function("funcs", "reflectionInfo", "name", "H", "c", "return function tearOff_" + name + functionCounter++ + "(x) {" + "if (c === null) c = H.closureFromTearOff(" + "this, funcs, reflectionInfo, false, [x], name);" + "return new c(this, funcs[0], x, name);" + "}")(funcs, reflectionInfo, name, H, null) : new Function("funcs", "reflectionInfo", "name", "H", "c", "return function tearOff_" + name + functionCounter++ + "() {" + "if (c === null) c = H.closureFromTearOff(" + "this, funcs, reflectionInfo, false, [], name);" + "return new c(this, funcs[0], null, name);" + "}")(funcs, reflectionInfo, name, H, null);
+  }
+  function tearOff(funcs, reflectionInfo, isStatic, name, isIntercepted) {
+    var cache;
+    return isStatic ? function() {
+      if (cache === void 0)
+        cache = H.closureFromTearOff(this, funcs, reflectionInfo, true, [], name).prototype;
+      return cache;
+    } : tearOffGetter(funcs, reflectionInfo, name, isIntercepted);
+  }
+  var functionCounter = 0;
+  if (!init.libraries)
+    init.libraries = [];
+  if (!init.mangledNames)
+    init.mangledNames = map();
+  if (!init.mangledGlobalNames)
+    init.mangledGlobalNames = map();
+  if (!init.statics)
+    init.statics = map();
+  if (!init.typeInformation)
+    init.typeInformation = map();
+  if (!init.globalFunctions)
+    init.globalFunctions = map();
+  var libraries = init.libraries;
+  var mangledNames = init.mangledNames;
+  var mangledGlobalNames = init.mangledGlobalNames;
+  var hasOwnProperty = Object.prototype.hasOwnProperty;
+  var length = programData.length;
+  var processedClasses = map();
+  processedClasses.collected = map();
+  processedClasses.pending = map();
+  processedClasses.constructorsList = [];
+  processedClasses.combinedConstructorFunction = "function $reflectable(fn){fn.$reflectable=1;return fn};\n" + "var $desc;\n";
+  for (var i = 0; i < length; i++) {
+    var data = programData[i];
+    var name = data[0];
+    var uri = data[1];
+    var metadata = data[2];
+    var globalObject = data[3];
+    var descriptor = data[4];
+    var isRoot = !!data[5];
+    var fields = descriptor && descriptor["^"];
+    if (fields instanceof Array)
+      fields = fields[0];
+    var classes = [];
+    var functions = [];
+    processStatics(descriptor, processedClasses);
+    libraries.push([name, uri, classes, functions, metadata, fields, isRoot, globalObject]);
+  }
+  finishClasses(processedClasses);
+}
+var dart =[["_foreign_helper", "dart:_foreign_helper",, H, {
+  "^": "",
+  JS_CONST: {
+    "^": "Object;code"
+  }
+}], ["_interceptors", "dart:_interceptors",, J, {
+  "^": "",
+  getInterceptor: function(object) {
+    return void 0;
+  },
+  Interceptor: {
+    "^": "Object;",
+    $eq: function(receiver, other) {
+      return receiver === other;
+    },
+    get$hashCode: function(receiver) {
+      return H.Primitives_objectHashCode(receiver);
+    },
+    toString$0: function(receiver) {
+      return H.Primitives_objectToString(receiver);
+    }
+  },
+  JSBool: {
+    "^": "Interceptor;",
+    toString$0: function(receiver) {
+      return String(receiver);
+    },
+    get$hashCode: function(receiver) {
+      return receiver ? 519018 : 218159;
+    },
+    $isbool: 1
+  },
+  JSNull: {
+    "^": "Interceptor;",
+    $eq: function(receiver, other) {
+      return null == other;
+    },
+    toString$0: function(receiver) {
+      return "null";
+    },
+    get$hashCode: function(receiver) {
+      return 0;
+    }
+  },
+  JavaScriptObject: {
+    "^": "Interceptor;",
+    get$hashCode: function(_) {
+      return 0;
+    },
+    $isJSObject: 1
+  },
+  PlainJavaScriptObject: {
+    "^": "JavaScriptObject;"
+  },
+  UnknownJavaScriptObject: {
+    "^": "JavaScriptObject;",
+    toString$0: function(receiver) {
+      return String(receiver);
+    }
+  },
+  JSArray: {
+    "^": "Interceptor;",
+    checkMutable$1: function(receiver, reason) {
+      if (!!receiver.immutable$list)
+        throw H.wrapException(new P.UnsupportedError(reason));
+    },
+    checkGrowable$1: function(receiver, reason) {
+      if (!!receiver.fixed$length)
+        throw H.wrapException(new P.UnsupportedError(reason));
+    },
+    forEach$1: function(receiver, f) {
+      var end, i;
+      end = receiver.length;
+      for (i = 0; i < end; ++i) {
+        f.call$1(receiver[i]);
+        if (receiver.length !== end)
+          throw H.wrapException(new P.ConcurrentModificationError(receiver));
+      }
+    },
+    map$1: function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(receiver, f), [null, null]);
+    },
+    elementAt$1: function(receiver, index) {
+      if (index < 0 || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    get$first: function(receiver) {
+      if (receiver.length > 0)
+        return receiver[0];
+      throw H.wrapException(H.IterableElementError_noElement());
+    },
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      var $length, i, t1;
+      this.checkMutable$1(receiver, "set range");
+      P.RangeError_checkValidRange(start, end, receiver.length, null, null, null);
+      $length = end - start;
+      if ($length === 0)
+        return;
+      if (skipCount + $length > iterable.length)
+        throw H.wrapException(new P.StateError("Too few elements"));
+      if (skipCount < start)
+        for (i = $length - 1; i >= 0; --i) {
+          t1 = skipCount + i;
+          if (t1 >= iterable.length)
+            return H.ioore(iterable, t1);
+          receiver[start + i] = iterable[t1];
+        }
+      else
+        for (i = 0; i < $length; ++i) {
+          t1 = skipCount + i;
+          if (t1 >= iterable.length)
+            return H.ioore(iterable, t1);
+          receiver[start + i] = iterable[t1];
+        }
+    },
+    toString$0: function(receiver) {
+      return P.IterableBase_iterableToFullString(receiver, "[", "]");
+    },
+    get$iterator: function(receiver) {
+      return new J.ArrayIterator(receiver, receiver.length, 0, null);
+    },
+    get$hashCode: function(receiver) {
+      return H.Primitives_objectHashCode(receiver);
+    },
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    set$length: function(receiver, newLength) {
+      this.checkGrowable$1(receiver, "set length");
+      if (newLength < 0)
+        throw H.wrapException(P.RangeError$value(newLength, null, null));
+      receiver.length = newLength;
+    },
+    $index: function(receiver, index) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index >= receiver.length || index < 0)
+        throw H.wrapException(P.RangeError$value(index, null, null));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      this.checkMutable$1(receiver, "indexed set");
+      if (index >= receiver.length || false)
+        throw H.wrapException(P.RangeError$value(index, null, null));
+      receiver[index] = value;
+    },
+    $isJSIndexable: 1,
+    $isList: 1,
+    $isEfficientLengthIterable: 1
+  },
+  JSUnmodifiableArray: {
+    "^": "JSArray;"
+  },
+  ArrayIterator: {
+    "^": "Object;_iterable,_length,_index,__interceptors$_current",
+    get$current: function() {
+      return this.__interceptors$_current;
+    },
+    moveNext$0: function() {
+      var t1, $length, t2;
+      t1 = this._iterable;
+      $length = t1.length;
+      if (this._length !== $length)
+        throw H.wrapException(new P.ConcurrentModificationError(t1));
+      t2 = this._index;
+      if (t2 >= $length) {
+        this.__interceptors$_current = null;
+        return false;
+      }
+      this.__interceptors$_current = t1[t2];
+      this._index = t2 + 1;
+      return true;
+    }
+  },
+  JSNumber: {
+    "^": "Interceptor;",
+    remainder$1: function(receiver, b) {
+      return receiver % b;
+    },
+    toInt$0: function(receiver) {
+      var t1;
+      if (receiver >= -2147483648 && receiver <= 2147483647)
+        return receiver | 0;
+      if (isFinite(receiver)) {
+        t1 = receiver < 0 ? Math.ceil(receiver) : Math.floor(receiver);
+        return t1 + 0;
+      }
+      throw H.wrapException(new P.UnsupportedError("" + receiver));
+    },
+    toString$0: function(receiver) {
+      if (receiver === 0 && 1 / receiver < 0)
+        return "-0.0";
+      else
+        return "" + receiver;
+    },
+    get$hashCode: function(receiver) {
+      return receiver & 0x1FFFFFFF;
+    },
+    $add: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver + other;
+    },
+    _tdivFast$1: function(receiver, other) {
+      return (receiver | 0) === receiver ? receiver / other | 0 : this.toInt$0(receiver / other);
+    },
+    _shrOtherPositive$1: function(receiver, other) {
+      var t1;
+      if (receiver > 0)
+        t1 = other > 31 ? 0 : receiver >>> other;
+      else {
+        t1 = other > 31 ? 31 : other;
+        t1 = receiver >> t1 >>> 0;
+      }
+      return t1;
+    },
+    $lt: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver < other;
+    },
+    $isnum: 1
+  },
+  JSInt: {
+    "^": "JSNumber;",
+    $isnum: 1,
+    $is$int: 1
+  },
+  JSDouble: {
+    "^": "JSNumber;",
+    $isnum: 1
+  },
+  JSString: {
+    "^": "Interceptor;",
+    codeUnitAt$1: function(receiver, index) {
+      if (index >= receiver.length)
+        throw H.wrapException(P.RangeError$value(index, null, null));
+      return receiver.charCodeAt(index);
+    },
+    $add: function(receiver, other) {
+      if (typeof other !== "string")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver + other;
+    },
+    substring$2: function(receiver, startIndex, endIndex) {
+      H.checkInt(startIndex);
+      if (endIndex == null)
+        endIndex = receiver.length;
+      H.checkInt(endIndex);
+      if (startIndex < 0)
+        throw H.wrapException(P.RangeError$value(startIndex, null, null));
+      if (typeof endIndex !== "number")
+        return H.iae(endIndex);
+      if (startIndex > endIndex)
+        throw H.wrapException(P.RangeError$value(startIndex, null, null));
+      if (endIndex > receiver.length)
+        throw H.wrapException(P.RangeError$value(endIndex, null, null));
+      return receiver.substring(startIndex, endIndex);
+    },
+    substring$1: function($receiver, startIndex) {
+      return this.substring$2($receiver, startIndex, null);
+    },
+    get$isEmpty: function(receiver) {
+      return receiver.length === 0;
+    },
+    toString$0: function(receiver) {
+      return receiver;
+    },
+    get$hashCode: function(receiver) {
+      var t1, hash, i;
+      for (t1 = receiver.length, hash = 0, i = 0; i < t1; ++i) {
+        hash = 536870911 & hash + receiver.charCodeAt(i);
+        hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+        hash ^= hash >> 6;
+      }
+      hash = 536870911 & hash + ((67108863 & hash) << 3 >>> 0);
+      hash ^= hash >> 11;
+      return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+    },
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index >= receiver.length || index < 0)
+        throw H.wrapException(P.RangeError$value(index, null, null));
+      return receiver[index];
+    },
+    $isJSIndexable: 1,
+    $isString: 1
+  }
+}], ["_isolate_helper", "dart:_isolate_helper",, H, {
+  "^": "",
+  _callInIsolate: function(isolate, $function) {
+    var result = isolate.eval$1($function);
+    if (!init.globalState.currentContext._isExecutingEvent)
+      init.globalState.topEventLoop.run$0();
+    return result;
+  },
+  leaveJsAsync: function() {
+    --init.globalState.topEventLoop._activeJsAsyncCount;
+  },
+  startRootIsolate: function(entry, args) {
+    var t1, t2, t3, t4, t5, rootContext;
+    t1 = {};
+    t1._captured_args_0 = args;
+    args = args;
+    t1._captured_args_0 = args;
+    if (args == null) {
+      args = [];
+      t1._captured_args_0 = args;
+      t2 = args;
+    } else
+      t2 = args;
+    if (!J.getInterceptor(t2).$isList)
+      throw H.wrapException(P.ArgumentError$("Arguments to main must be a List: " + H.S(t2)));
+    t2 = new H._Manager(0, 0, 1, null, null, null, null, null, null, null, null, null, entry);
+    t2._nativeDetectEnvironment$0();
+    t2.topEventLoop = new H._EventLoop(P.ListQueue$(null, H._IsolateEvent), 0);
+    t2.isolates = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H._IsolateContext);
+    t2.managers = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, null);
+    if (t2.isWorker === true) {
+      t2.mainManager = new H._MainManagerStub();
+      t2._nativeInitWorkerMessageHandler$0();
+    }
+    init.globalState = t2;
+    if (init.globalState.isWorker === true)
+      return;
+    t2 = init.globalState.nextIsolateId++;
+    t3 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H.RawReceivePortImpl);
+    t4 = P.LinkedHashSet_LinkedHashSet(null, null, null, P.$int);
+    t5 = new H.RawReceivePortImpl(0, null, false);
+    rootContext = new H._IsolateContext(t2, t3, t4, init.createNewIsolate(), t5, new H.CapabilityImpl(H.random64()), new H.CapabilityImpl(H.random64()), false, false, [], P.LinkedHashSet_LinkedHashSet(null, null, null, null), null, null, false, true, P.LinkedHashSet_LinkedHashSet(null, null, null, null));
+    t4.add$1(0, 0);
+    rootContext._addRegistration$2(0, t5);
+    init.globalState.rootContext = rootContext;
+    init.globalState.currentContext = rootContext;
+    t2 = H.getDynamicRuntimeType();
+    t3 = H.buildFunctionType(t2, [t2])._isTest$1(entry);
+    if (t3)
+      rootContext.eval$1(new H.startRootIsolate_closure(t1, entry));
+    else {
+      t2 = H.buildFunctionType(t2, [t2, t2])._isTest$1(entry);
+      if (t2)
+        rootContext.eval$1(new H.startRootIsolate_closure0(t1, entry));
+      else
+        rootContext.eval$1(entry);
+    }
+    init.globalState.topEventLoop.run$0();
+  },
+  IsolateNatives_computeThisScript: function() {
+    var currentScript = init.currentScript;
+    if (currentScript != null)
+      return String(currentScript.src);
+    if (init.globalState.isWorker === true)
+      return H.IsolateNatives_computeThisScriptFromTrace();
+    return;
+  },
+  IsolateNatives_computeThisScriptFromTrace: function() {
+    var stack, matches;
+    stack = new Error().stack;
+    if (stack == null) {
+      stack = function() {
+        try {
+          throw new Error();
+        } catch (e) {
+          return e.stack;
+        }
+      }();
+      if (stack == null)
+        throw H.wrapException(new P.UnsupportedError("No stack trace"));
+    }
+    matches = stack.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$", "m"));
+    if (matches != null)
+      return matches[1];
+    matches = stack.match(new RegExp("^[^@]*@(.*):[0-9]*$", "m"));
+    if (matches != null)
+      return matches[1];
+    throw H.wrapException(new P.UnsupportedError("Cannot extract URI from \"" + H.S(stack) + "\""));
+  },
+  IsolateNatives__processWorkerMessage: function(sender, e) {
+    var msg, t1, functionName, entryPoint, args, message, isSpawnUri, startPaused, replyTo, t2, t3, t4, context;
+    msg = new H._Deserializer(true, []).deserialize$1(e.data);
+    t1 = J.getInterceptor$as(msg);
+    switch (t1.$index(msg, "command")) {
+      case "start":
+        init.globalState.currentManagerId = t1.$index(msg, "id");
+        functionName = t1.$index(msg, "functionName");
+        entryPoint = functionName == null ? init.globalState.entry : H.IsolateNatives__getJSFunctionFromName(functionName);
+        args = t1.$index(msg, "args");
+        message = new H._Deserializer(true, []).deserialize$1(t1.$index(msg, "msg"));
+        isSpawnUri = t1.$index(msg, "isSpawnUri");
+        startPaused = t1.$index(msg, "startPaused");
+        replyTo = new H._Deserializer(true, []).deserialize$1(t1.$index(msg, "replyTo"));
+        t1 = init.globalState.nextIsolateId++;
+        t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H.RawReceivePortImpl);
+        t3 = P.LinkedHashSet_LinkedHashSet(null, null, null, P.$int);
+        t4 = new H.RawReceivePortImpl(0, null, false);
+        context = new H._IsolateContext(t1, t2, t3, init.createNewIsolate(), t4, new H.CapabilityImpl(H.random64()), new H.CapabilityImpl(H.random64()), false, false, [], P.LinkedHashSet_LinkedHashSet(null, null, null, null), null, null, false, true, P.LinkedHashSet_LinkedHashSet(null, null, null, null));
+        t3.add$1(0, 0);
+        context._addRegistration$2(0, t4);
+        init.globalState.topEventLoop.events._add$1(new H._IsolateEvent(context, new H.IsolateNatives__processWorkerMessage_closure(entryPoint, args, message, isSpawnUri, startPaused, replyTo), "worker-start"));
+        init.globalState.currentContext = context;
+        init.globalState.topEventLoop.run$0();
+        break;
+      case "spawn-worker":
+        break;
+      case "message":
+        if (t1.$index(msg, "port") != null)
+          t1.$index(msg, "port").send$1(t1.$index(msg, "msg"));
+        init.globalState.topEventLoop.run$0();
+        break;
+      case "close":
+        init.globalState.managers.remove$1(0, $.get$IsolateNatives_workerIds().$index(0, sender));
+        sender.terminate();
+        init.globalState.topEventLoop.run$0();
+        break;
+      case "log":
+        H.IsolateNatives__log(t1.$index(msg, "msg"));
+        break;
+      case "print":
+        if (init.globalState.isWorker === true) {
+          t1 = init.globalState.mainManager;
+          t2 = P.LinkedHashMap__makeLiteral(["command", "print", "msg", msg]);
+          t2 = new H._Serializer(true, P.LinkedHashMap_LinkedHashMap$identity(null, P.$int)).serialize$1(t2);
+          t1.toString;
+          self.postMessage(t2);
+        } else
+          P.print(t1.$index(msg, "msg"));
+        break;
+      case "error":
+        throw H.wrapException(t1.$index(msg, "msg"));
+    }
+  },
+  IsolateNatives__log: function(msg) {
+    var trace, t1, t2, exception;
+    if (init.globalState.isWorker === true) {
+      t1 = init.globalState.mainManager;
+      t2 = P.LinkedHashMap__makeLiteral(["command", "log", "msg", msg]);
+      t2 = new H._Serializer(true, P.LinkedHashMap_LinkedHashMap$identity(null, P.$int)).serialize$1(t2);
+      t1.toString;
+      self.postMessage(t2);
+    } else
+      try {
+        self.console.log(msg);
+      } catch (exception) {
+        H.unwrapException(exception);
+        trace = H.getTraceFromException(exception);
+        throw H.wrapException(P.Exception_Exception(trace));
+      }
+  },
+  IsolateNatives__getJSFunctionFromName: function(functionName) {
+    return init.globalFunctions[functionName]();
+  },
+  IsolateNatives__startIsolate: function(topLevel, args, message, isSpawnUri, startPaused, replyTo) {
+    var context, t1, t2, t3;
+    context = init.globalState.currentContext;
+    t1 = context.id;
+    $.Primitives_mirrorFunctionCacheName = $.Primitives_mirrorFunctionCacheName + ("_" + t1);
+    $.Primitives_mirrorInvokeCacheName = $.Primitives_mirrorInvokeCacheName + ("_" + t1);
+    t1 = context.controlPort;
+    t2 = init.globalState.currentContext.id;
+    t3 = context.pauseCapability;
+    replyTo.send$1(["spawned", new H._NativeJsSendPort(t1, t2), t3, context.terminateCapability]);
+    t2 = new H.IsolateNatives__startIsolate_runStartFunction(topLevel, args, message, isSpawnUri, context);
+    if (startPaused === true) {
+      context.addPause$2(t3, t3);
+      init.globalState.topEventLoop.events._add$1(new H._IsolateEvent(context, t2, "start isolate"));
+    } else
+      t2.call$0();
+  },
+  _clone: function(message) {
+    return new H._Deserializer(true, []).deserialize$1(new H._Serializer(false, P.LinkedHashMap_LinkedHashMap$identity(null, P.$int)).serialize$1(message));
+  },
+  startRootIsolate_closure: {
+    "^": "Closure:0;__isolate_helper$_box_0,_captured_entry_1",
+    call$0: function() {
+      this._captured_entry_1.call$1(this.__isolate_helper$_box_0._captured_args_0);
+    }
+  },
+  startRootIsolate_closure0: {
+    "^": "Closure:0;__isolate_helper$_box_0,_captured_entry_2",
+    call$0: function() {
+      this._captured_entry_2.call$2(this.__isolate_helper$_box_0._captured_args_0, null);
+    }
+  },
+  _Manager: {
+    "^": "Object;nextIsolateId,currentManagerId,nextManagerId,currentContext,rootContext,topEventLoop,fromCommandLine,isWorker,supportsWorkers,isolates,mainManager,managers,entry",
+    _nativeDetectEnvironment$0: function() {
+      var t1, t2, t3;
+      t1 = self.window == null;
+      t2 = self.Worker;
+      t3 = t1 && !!self.postMessage;
+      this.isWorker = t3;
+      if (!t3)
+        t2 = t2 != null && $.get$IsolateNatives_thisScript() != null;
+      else
+        t2 = true;
+      this.supportsWorkers = t2;
+      this.fromCommandLine = t1 && !t3;
+    },
+    _nativeInitWorkerMessageHandler$0: function() {
+      self.onmessage = function(f, a) {
+        return function(e) {
+          f(a, e);
+        };
+      }(H.IsolateNatives__processWorkerMessage, this.mainManager);
+      self.dartPrint = self.dartPrint || function(serialize) {
+        return function(object) {
+          if (self.console && self.console.log)
+            self.console.log(object);
+          else
+            self.postMessage(serialize(object));
+        };
+      }(H._Manager__serializePrintMessage);
+    },
+    static: {_Manager__serializePrintMessage: function(object) {
+        var t1 = P.LinkedHashMap__makeLiteral(["command", "print", "msg", object]);
+        return new H._Serializer(true, P.LinkedHashMap_LinkedHashMap$identity(null, P.$int)).serialize$1(t1);
+      }}
+  },
+  _IsolateContext: {
+    "^": "Object;id,ports,weakPorts,isolateStatics<,controlPort<,pauseCapability,terminateCapability,initialized,isPaused,delayedEvents,pauseTokens,doneHandlers,_scheduledControlEvents,_isExecutingEvent,errorsAreFatal,errorPorts",
+    addPause$2: function(authentification, resume) {
+      if (!this.pauseCapability.$eq(0, authentification))
+        return;
+      if (this.pauseTokens.add$1(0, resume) && !this.isPaused)
+        this.isPaused = true;
+      this._updateGlobalState$0();
+    },
+    removePause$1: function(resume) {
+      var t1, t2, $event, t3, t4, t5;
+      if (!this.isPaused)
+        return;
+      t1 = this.pauseTokens;
+      t1.remove$1(0, resume);
+      if (t1._collection$_length === 0) {
+        for (t1 = this.delayedEvents; t2 = t1.length, t2 !== 0;) {
+          if (0 >= t2)
+            return H.ioore(t1, 0);
+          $event = t1.pop();
+          t2 = init.globalState.topEventLoop.events;
+          t3 = t2._head;
+          t4 = t2._table;
+          t5 = t4.length;
+          t3 = (t3 - 1 & t5 - 1) >>> 0;
+          t2._head = t3;
+          if (t3 < 0 || t3 >= t5)
+            return H.ioore(t4, t3);
+          t4[t3] = $event;
+          if (t3 === t2._tail)
+            t2._grow$0();
+          ++t2._modificationCount;
+        }
+        this.isPaused = false;
+      }
+      this._updateGlobalState$0();
+    },
+    addDoneListener$2: function(responsePort, response) {
+      var t1, i, t2;
+      if (this.doneHandlers == null)
+        this.doneHandlers = [];
+      for (t1 = J.getInterceptor(responsePort), i = 0; t2 = this.doneHandlers, i < t2.length; i += 2)
+        if (t1.$eq(responsePort, t2[i])) {
+          t1 = this.doneHandlers;
+          t2 = i + 1;
+          if (t2 >= t1.length)
+            return H.ioore(t1, t2);
+          t1[t2] = response;
+          return;
+        }
+      t2.push(responsePort);
+      this.doneHandlers.push(response);
+    },
+    removeDoneListener$1: function(responsePort) {
+      var t1, i, t2;
+      if (this.doneHandlers == null)
+        return;
+      for (t1 = J.getInterceptor(responsePort), i = 0; t2 = this.doneHandlers, i < t2.length; i += 2)
+        if (t1.$eq(responsePort, t2[i])) {
+          t1 = this.doneHandlers;
+          t2 = i + 2;
+          t1.toString;
+          if (typeof t1 !== "object" || t1 === null || !!t1.fixed$length)
+            H.throwExpression(new P.UnsupportedError("removeRange"));
+          P.RangeError_checkValidRange(i, t2, t1.length, null, null, null);
+          t1.splice(i, t2 - i);
+          return;
+        }
+    },
+    setErrorsFatal$2: function(authentification, errorsAreFatal) {
+      if (!this.terminateCapability.$eq(0, authentification))
+        return;
+      this.errorsAreFatal = errorsAreFatal;
+    },
+    handlePing$3: function(responsePort, pingType, response) {
+      var t1 = J.getInterceptor(pingType);
+      if (!t1.$eq(pingType, 0))
+        t1 = t1.$eq(pingType, 1) && !this._isExecutingEvent;
+      else
+        t1 = true;
+      if (t1) {
+        responsePort.send$1(response);
+        return;
+      }
+      t1 = this._scheduledControlEvents;
+      if (t1 == null) {
+        t1 = P.ListQueue$(null, null);
+        this._scheduledControlEvents = t1;
+      }
+      t1._add$1(new H._IsolateContext_handlePing_respond(responsePort, response));
+    },
+    handleKill$2: function(authentification, priority) {
+      var t1;
+      if (!this.terminateCapability.$eq(0, authentification))
+        return;
+      t1 = J.getInterceptor(priority);
+      if (!t1.$eq(priority, 0))
+        t1 = t1.$eq(priority, 1) && !this._isExecutingEvent;
+      else
+        t1 = true;
+      if (t1) {
+        this.kill$0();
+        return;
+      }
+      t1 = this._scheduledControlEvents;
+      if (t1 == null) {
+        t1 = P.ListQueue$(null, null);
+        this._scheduledControlEvents = t1;
+      }
+      t1._add$1(this.get$kill());
+    },
+    handleUncaughtError$2: function(error, stackTrace) {
+      var t1, message, t2;
+      t1 = this.errorPorts;
+      if (t1._collection$_length === 0) {
+        if (this.errorsAreFatal === true && this === init.globalState.rootContext)
+          return;
+        if (self.console && self.console.error)
+          self.console.error(error, stackTrace);
+        else {
+          P.print(error);
+          if (stackTrace != null)
+            P.print(stackTrace);
+        }
+        return;
+      }
+      message = Array(2);
+      message.fixed$length = Array;
+      message[0] = J.toString$0(error);
+      message[1] = stackTrace == null ? null : J.toString$0(stackTrace);
+      for (t2 = new P.LinkedHashSetIterator(t1, t1._collection$_modifications, null, null), t2._cell = t1._collection$_first; t2.moveNext$0();)
+        t2._collection$_current.send$1(message);
+    },
+    eval$1: function(code) {
+      var old, result, oldIsExecutingEvent, e, s, exception, t1;
+      old = init.globalState.currentContext;
+      init.globalState.currentContext = this;
+      $ = this.isolateStatics;
+      result = null;
+      oldIsExecutingEvent = this._isExecutingEvent;
+      this._isExecutingEvent = true;
+      try {
+        result = code.call$0();
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = H.getTraceFromException(exception);
+        this.handleUncaughtError$2(e, s);
+        if (this.errorsAreFatal === true) {
+          this.kill$0();
+          if (this === init.globalState.rootContext)
+            throw exception;
+        }
+      } finally {
+        this._isExecutingEvent = oldIsExecutingEvent;
+        init.globalState.currentContext = old;
+        if (old != null)
+          $ = old.get$isolateStatics();
+        if (this._scheduledControlEvents != null)
+          for (; t1 = this._scheduledControlEvents, !t1.get$isEmpty(t1);)
+            this._scheduledControlEvents.removeFirst$0().call$0();
+      }
+      return result;
+    },
+    lookup$1: function(portId) {
+      return this.ports.$index(0, portId);
+    },
+    _addRegistration$2: function(portId, port) {
+      var t1 = this.ports;
+      if (t1.containsKey$1(portId))
+        throw H.wrapException(P.Exception_Exception("Registry: ports must be registered only once."));
+      t1.$indexSet(0, portId, port);
+    },
+    _updateGlobalState$0: function() {
+      if (this.ports.__js_helper$_length - this.weakPorts._collection$_length > 0 || this.isPaused || !this.initialized)
+        init.globalState.isolates.$indexSet(0, this.id, this);
+      else
+        this.kill$0();
+    },
+    kill$0: [function() {
+      var t1, t2, i, responsePort, t3;
+      t1 = this._scheduledControlEvents;
+      if (t1 != null)
+        t1.clear$0(0);
+      for (t1 = this.ports, t2 = t1.get$values(), t2 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$a(t2.__internal$_iterable), t2._f), [H.getTypeArgumentByIndex(t2, 0), H.getTypeArgumentByIndex(t2, 1)]); t2.moveNext$0();)
+        t2.__internal$_current._close$0();
+      if (t1.__js_helper$_length > 0) {
+        t1._last = null;
+        t1._first = null;
+        t1._rest = null;
+        t1._nums = null;
+        t1._strings = null;
+        t1.__js_helper$_length = 0;
+        t1._modifications = t1._modifications + 1 & 67108863;
+      }
+      this.weakPorts.clear$0(0);
+      init.globalState.isolates.remove$1(0, this.id);
+      this.errorPorts.clear$0(0);
+      if (this.doneHandlers != null) {
+        for (i = 0; t1 = this.doneHandlers, t2 = t1.length, i < t2; i += 2) {
+          responsePort = t1[i];
+          t3 = i + 1;
+          if (t3 >= t2)
+            return H.ioore(t1, t3);
+          responsePort.send$1(t1[t3]);
+        }
+        this.doneHandlers = null;
+      }
+    }, "call$0", "get$kill", 0, 0, 1]
+  },
+  _IsolateContext_handlePing_respond: {
+    "^": "Closure:1;_captured_responsePort_0,_captured_response_1",
+    call$0: function() {
+      this._captured_responsePort_0.send$1(this._captured_response_1);
+    }
+  },
+  _EventLoop: {
+    "^": "Object;events,_activeJsAsyncCount",
+    dequeue$0: function() {
+      var t1 = this.events;
+      if (t1._head === t1._tail)
+        return;
+      return t1.removeFirst$0();
+    },
+    runIteration$0: function() {
+      var $event, t1, t2;
+      $event = this.dequeue$0();
+      if ($event == null) {
+        if (init.globalState.rootContext != null && init.globalState.isolates.containsKey$1(init.globalState.rootContext.id) && init.globalState.fromCommandLine === true && init.globalState.rootContext.ports.__js_helper$_length === 0)
+          H.throwExpression(P.Exception_Exception("Program exited with open ReceivePorts."));
+        t1 = init.globalState;
+        if (t1.isWorker === true && t1.isolates.__js_helper$_length === 0 && t1.topEventLoop._activeJsAsyncCount === 0) {
+          t1 = t1.mainManager;
+          t2 = P.LinkedHashMap__makeLiteral(["command", "close"]);
+          t2 = new H._Serializer(true, P.LinkedHashMap_LinkedHashMap$identity(null, P.$int)).serialize$1(t2);
+          t1.toString;
+          self.postMessage(t2);
+        }
+        return false;
+      }
+      $event.process$0();
+      return true;
+    },
+    _runHelper$0: function() {
+      if (self.window != null)
+        new H._EventLoop__runHelper_next(this).call$0();
+      else
+        for (; this.runIteration$0();)
+          ;
+    },
+    run$0: function() {
+      var e, trace, exception, t1, t2;
+      if (init.globalState.isWorker !== true)
+        this._runHelper$0();
+      else
+        try {
+          this._runHelper$0();
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e = t1;
+          trace = H.getTraceFromException(exception);
+          t1 = init.globalState.mainManager;
+          t2 = P.LinkedHashMap__makeLiteral(["command", "error", "msg", H.S(e) + "\n" + H.S(trace)]);
+          t2 = new H._Serializer(true, P.LinkedHashMap_LinkedHashMap$identity(null, P.$int)).serialize$1(t2);
+          t1.toString;
+          self.postMessage(t2);
+        }
+    }
+  },
+  _EventLoop__runHelper_next: {
+    "^": "Closure:1;_captured_this_0",
+    call$0: function() {
+      if (!this._captured_this_0.runIteration$0())
+        return;
+      P.Timer_Timer(C.Duration_0, this);
+    }
+  },
+  _IsolateEvent: {
+    "^": "Object;isolate,fn,message",
+    process$0: function() {
+      var t1 = this.isolate;
+      if (t1.isPaused) {
+        t1.delayedEvents.push(this);
+        return;
+      }
+      t1.eval$1(this.fn);
+    }
+  },
+  _MainManagerStub: {
+    "^": "Object;"
+  },
+  IsolateNatives__processWorkerMessage_closure: {
+    "^": "Closure:0;_captured_entryPoint_0,_captured_args_1,_captured_message_2,_captured_isSpawnUri_3,_captured_startPaused_4,_captured_replyTo_5",
+    call$0: function() {
+      H.IsolateNatives__startIsolate(this._captured_entryPoint_0, this._captured_args_1, this._captured_message_2, this._captured_isSpawnUri_3, this._captured_startPaused_4, this._captured_replyTo_5);
+    }
+  },
+  IsolateNatives__startIsolate_runStartFunction: {
+    "^": "Closure:1;_captured_topLevel_0,_captured_args_1,_captured_message_2,_captured_isSpawnUri_3,_captured_context_4",
+    call$0: function() {
+      var t1, t2, t3;
+      this._captured_context_4.initialized = true;
+      if (this._captured_isSpawnUri_3 !== true)
+        this._captured_topLevel_0.call$1(this._captured_message_2);
+      else {
+        t1 = this._captured_topLevel_0;
+        t2 = H.getDynamicRuntimeType();
+        t3 = H.buildFunctionType(t2, [t2, t2])._isTest$1(t1);
+        if (t3)
+          t1.call$2(this._captured_args_1, this._captured_message_2);
+        else {
+          t2 = H.buildFunctionType(t2, [t2])._isTest$1(t1);
+          if (t2)
+            t1.call$1(this._captured_args_1);
+          else
+            t1.call$0();
+        }
+      }
+    }
+  },
+  _BaseSendPort: {
+    "^": "Object;"
+  },
+  _NativeJsSendPort: {
+    "^": "_BaseSendPort;_receivePort,_isolateId",
+    send$1: function(message) {
+      var isolate, t1, msg, t2;
+      isolate = init.globalState.isolates.$index(0, this._isolateId);
+      if (isolate == null)
+        return;
+      t1 = this._receivePort;
+      if (t1.get$_isClosed())
+        return;
+      msg = H._clone(message);
+      if (isolate.get$controlPort() === t1) {
+        t1 = J.getInterceptor$as(msg);
+        switch (t1.$index(msg, 0)) {
+          case "pause":
+            isolate.addPause$2(t1.$index(msg, 1), t1.$index(msg, 2));
+            break;
+          case "resume":
+            isolate.removePause$1(t1.$index(msg, 1));
+            break;
+          case "add-ondone":
+            isolate.addDoneListener$2(t1.$index(msg, 1), t1.$index(msg, 2));
+            break;
+          case "remove-ondone":
+            isolate.removeDoneListener$1(t1.$index(msg, 1));
+            break;
+          case "set-errors-fatal":
+            isolate.setErrorsFatal$2(t1.$index(msg, 1), t1.$index(msg, 2));
+            break;
+          case "ping":
+            isolate.handlePing$3(t1.$index(msg, 1), t1.$index(msg, 2), t1.$index(msg, 3));
+            break;
+          case "kill":
+            isolate.handleKill$2(t1.$index(msg, 1), t1.$index(msg, 2));
+            break;
+          case "getErrors":
+            t1 = t1.$index(msg, 1);
+            isolate.errorPorts.add$1(0, t1);
+            break;
+          case "stopErrors":
+            t1 = t1.$index(msg, 1);
+            isolate.errorPorts.remove$1(0, t1);
+            break;
+        }
+        return;
+      }
+      t1 = init.globalState.topEventLoop;
+      t2 = "receive " + H.S(message);
+      t1.events._add$1(new H._IsolateEvent(isolate, new H._NativeJsSendPort_send_closure(this, msg), t2));
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof H._NativeJsSendPort && J.$eq(this._receivePort, other._receivePort);
+    },
+    get$hashCode: function(_) {
+      return this._receivePort.get$_id();
+    }
+  },
+  _NativeJsSendPort_send_closure: {
+    "^": "Closure:0;_captured_this_0,_captured_msg_1",
+    call$0: function() {
+      var t1 = this._captured_this_0._receivePort;
+      if (!t1.get$_isClosed())
+        t1.__isolate_helper$_add$1(this._captured_msg_1);
+    }
+  },
+  _WorkerSendPort: {
+    "^": "_BaseSendPort;_workerId,_receivePortId,_isolateId",
+    send$1: function(message) {
+      var t1, workerMessage, manager;
+      t1 = P.LinkedHashMap__makeLiteral(["command", "message", "port", this, "msg", message]);
+      workerMessage = new H._Serializer(true, P.LinkedHashMap_LinkedHashMap$identity(null, P.$int)).serialize$1(t1);
+      if (init.globalState.isWorker === true) {
+        init.globalState.mainManager.toString;
+        self.postMessage(workerMessage);
+      } else {
+        manager = init.globalState.managers.$index(0, this._workerId);
+        if (manager != null)
+          manager.postMessage(workerMessage);
+      }
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return other instanceof H._WorkerSendPort && J.$eq(this._workerId, other._workerId) && J.$eq(this._isolateId, other._isolateId) && J.$eq(this._receivePortId, other._receivePortId);
+    },
+    get$hashCode: function(_) {
+      var t1, t2, t3;
+      t1 = this._workerId;
+      if (typeof t1 !== "number")
+        return t1.$shl();
+      t2 = this._isolateId;
+      if (typeof t2 !== "number")
+        return t2.$shl();
+      t3 = this._receivePortId;
+      if (typeof t3 !== "number")
+        return H.iae(t3);
+      return (t1 << 16 ^ t2 << 8 ^ t3) >>> 0;
+    }
+  },
+  RawReceivePortImpl: {
+    "^": "Object;_id<,_handler,_isClosed<",
+    _close$0: function() {
+      this._isClosed = true;
+      this._handler = null;
+    },
+    __isolate_helper$_add$1: function(dataEvent) {
+      if (this._isClosed)
+        return;
+      this._handler$1(dataEvent);
+    },
+    _handler$1: function(arg0) {
+      return this._handler.call$1(arg0);
+    },
+    $isRawReceivePort: 1
+  },
+  TimerImpl: {
+    "^": "Object;_once,_inEventLoop,_handle",
+    TimerImpl$2: function(milliseconds, callback) {
+      var t1, t2;
+      if (milliseconds === 0)
+        t1 = self.setTimeout == null || init.globalState.isWorker === true;
+      else
+        t1 = false;
+      if (t1) {
+        this._handle = 1;
+        t1 = init.globalState.topEventLoop;
+        t2 = init.globalState.currentContext;
+        t1.events._add$1(new H._IsolateEvent(t2, new H.TimerImpl_internalCallback(this, callback), "timer"));
+        this._inEventLoop = true;
+      } else if (self.setTimeout != null) {
+        ++init.globalState.topEventLoop._activeJsAsyncCount;
+        this._handle = self.setTimeout(H.convertDartClosureToJS(new H.TimerImpl_internalCallback0(this, callback), 0), milliseconds);
+      } else
+        throw H.wrapException(new P.UnsupportedError("Timer greater than 0."));
+    },
+    static: {TimerImpl$: function(milliseconds, callback) {
+        var t1 = new H.TimerImpl(true, false, null);
+        t1.TimerImpl$2(milliseconds, callback);
+        return t1;
+      }}
+  },
+  TimerImpl_internalCallback: {
+    "^": "Closure:1;_captured_this_0,_captured_callback_1",
+    call$0: function() {
+      this._captured_this_0._handle = null;
+      this._captured_callback_1.call$0();
+    }
+  },
+  TimerImpl_internalCallback0: {
+    "^": "Closure:1;_captured_this_2,_captured_callback_3",
+    call$0: function() {
+      this._captured_this_2._handle = null;
+      H.leaveJsAsync();
+      this._captured_callback_3.call$0();
+    }
+  },
+  CapabilityImpl: {
+    "^": "Object;_id<",
+    get$hashCode: function(_) {
+      var hash = this._id;
+      hash = C.JSInt_methods._shrOtherPositive$1(hash, 0) ^ C.JSInt_methods._tdivFast$1(hash, 4294967296);
+      hash = (~hash >>> 0) + (hash << 15 >>> 0) & 4294967295;
+      hash = ((hash ^ hash >>> 12) >>> 0) * 5 & 4294967295;
+      hash = ((hash ^ hash >>> 4) >>> 0) * 2057 & 4294967295;
+      return (hash ^ hash >>> 16) >>> 0;
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (other === this)
+        return true;
+      if (other instanceof H.CapabilityImpl)
+        return this._id === other._id;
+      return false;
+    }
+  },
+  _Serializer: {
+    "^": "Object;_serializeSendPorts,serializedObjectIds",
+    serialize$1: [function(x) {
+      var t1, serializationId, serializeTearOff, t2, $name;
+      if (x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean")
+        return x;
+      t1 = this.serializedObjectIds;
+      serializationId = t1.$index(0, x);
+      if (serializationId != null)
+        return ["ref", serializationId];
+      t1.$indexSet(0, x, t1.__js_helper$_length);
+      t1 = J.getInterceptor(x);
+      if (!!t1.$isJSIndexable)
+        return this.serializeJSIndexable$1(x);
+      if (!!t1.$isInternalMap) {
+        serializeTearOff = this.get$serialize();
+        t1 = x.get$keys();
+        t1 = H.MappedIterable_MappedIterable(t1, serializeTearOff, H.getRuntimeTypeArgument(t1, "Iterable", 0), null);
+        t1 = P.List_List$from(t1, true, H.getRuntimeTypeArgument(t1, "Iterable", 0));
+        t2 = x.get$values();
+        t2 = H.MappedIterable_MappedIterable(t2, serializeTearOff, H.getRuntimeTypeArgument(t2, "Iterable", 0), null);
+        return ["map", t1, P.List_List$from(t2, true, H.getRuntimeTypeArgument(t2, "Iterable", 0))];
+      }
+      if (!!t1.$isJSObject)
+        return this.serializeJSObject$1(x);
+      if (!!t1.$isInterceptor)
+        this.unsupported$1(x);
+      if (!!t1.$isRawReceivePort)
+        this.unsupported$2(x, "RawReceivePorts can't be transmitted:");
+      if (!!t1.$is_NativeJsSendPort)
+        return this.serializeJsSendPort$1(x);
+      if (!!t1.$is_WorkerSendPort)
+        return this.serializeWorkerSendPort$1(x);
+      if (!!t1.$isClosure) {
+        $name = x.$name;
+        if ($name == null)
+          this.unsupported$2(x, "Closures can't be transmitted:");
+        return ["function", $name];
+      }
+      return ["dart", init.classIdExtractor(x), this.serializeArrayInPlace$1(init.classFieldsExtractor(x))];
+    }, "call$1", "get$serialize", 2, 0, 2],
+    unsupported$2: function(x, message) {
+      throw H.wrapException(new P.UnsupportedError(H.S(message == null ? "Can't transmit:" : message) + " " + H.S(x)));
+    },
+    unsupported$1: function(x) {
+      return this.unsupported$2(x, null);
+    },
+    serializeJSIndexable$1: function(indexable) {
+      var serialized = this.serializeArray$1(indexable);
+      if (!!indexable.fixed$length)
+        return ["fixed", serialized];
+      if (!indexable.fixed$length)
+        return ["extendable", serialized];
+      if (!indexable.immutable$list)
+        return ["mutable", serialized];
+      if (indexable.constructor === Array)
+        return ["const", serialized];
+      this.unsupported$2(indexable, "Can't serialize indexable: ");
+    },
+    serializeArray$1: function(x) {
+      var serialized, i, t1;
+      serialized = [];
+      C.JSArray_methods.set$length(serialized, x.length);
+      for (i = 0; i < x.length; ++i) {
+        t1 = this.serialize$1(x[i]);
+        if (i >= serialized.length)
+          return H.ioore(serialized, i);
+        serialized[i] = t1;
+      }
+      return serialized;
+    },
+    serializeArrayInPlace$1: function(x) {
+      var i;
+      for (i = 0; i < x.length; ++i)
+        C.JSArray_methods.$indexSet(x, i, this.serialize$1(x[i]));
+      return x;
+    },
+    serializeJSObject$1: function(x) {
+      var keys, values, i, t1;
+      if (!!x.constructor && x.constructor !== Object)
+        this.unsupported$2(x, "Only plain JS Objects are supported:");
+      keys = Object.keys(x);
+      values = [];
+      C.JSArray_methods.set$length(values, keys.length);
+      for (i = 0; i < keys.length; ++i) {
+        t1 = this.serialize$1(x[keys[i]]);
+        if (i >= values.length)
+          return H.ioore(values, i);
+        values[i] = t1;
+      }
+      return ["js-object", keys, values];
+    },
+    serializeWorkerSendPort$1: function(x) {
+      if (this._serializeSendPorts)
+        return ["sendport", x._workerId, x._isolateId, x._receivePortId];
+      return ["raw sendport", x];
+    },
+    serializeJsSendPort$1: function(x) {
+      if (this._serializeSendPorts)
+        return ["sendport", init.globalState.currentManagerId, x._isolateId, x._receivePort.get$_id()];
+      return ["raw sendport", x];
+    }
+  },
+  _Deserializer: {
+    "^": "Object;_adjustSendPorts,deserializedObjects",
+    deserialize$1: [function(x) {
+      var serializationId, t1, result, classId, fields, emptyInstance;
+      if (x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean")
+        return x;
+      if (typeof x !== "object" || x === null || x.constructor !== Array)
+        throw H.wrapException(P.ArgumentError$("Bad serialized message: " + H.S(x)));
+      switch (C.JSArray_methods.get$first(x)) {
+        case "ref":
+          if (1 >= x.length)
+            return H.ioore(x, 1);
+          serializationId = x[1];
+          t1 = this.deserializedObjects;
+          if (serializationId >>> 0 !== serializationId || serializationId >= t1.length)
+            return H.ioore(t1, serializationId);
+          return t1[serializationId];
+        case "buffer":
+          if (1 >= x.length)
+            return H.ioore(x, 1);
+          result = x[1];
+          this.deserializedObjects.push(result);
+          return result;
+        case "typed":
+          if (1 >= x.length)
+            return H.ioore(x, 1);
+          result = x[1];
+          this.deserializedObjects.push(result);
+          return result;
+        case "fixed":
+          if (1 >= x.length)
+            return H.ioore(x, 1);
+          result = x[1];
+          this.deserializedObjects.push(result);
+          t1 = this.deserializeArrayInPlace$1(result);
+          t1.$builtinTypeInfo = [null];
+          t1.fixed$length = Array;
+          return t1;
+        case "extendable":
+          if (1 >= x.length)
+            return H.ioore(x, 1);
+          result = x[1];
+          this.deserializedObjects.push(result);
+          t1 = this.deserializeArrayInPlace$1(result);
+          t1.$builtinTypeInfo = [null];
+          return t1;
+        case "mutable":
+          if (1 >= x.length)
+            return H.ioore(x, 1);
+          result = x[1];
+          this.deserializedObjects.push(result);
+          return this.deserializeArrayInPlace$1(result);
+        case "const":
+          if (1 >= x.length)
+            return H.ioore(x, 1);
+          result = x[1];
+          this.deserializedObjects.push(result);
+          t1 = this.deserializeArrayInPlace$1(result);
+          t1.$builtinTypeInfo = [null];
+          t1.fixed$length = Array;
+          return t1;
+        case "map":
+          return this.deserializeMap$1(x);
+        case "sendport":
+          return this.deserializeSendPort$1(x);
+        case "raw sendport":
+          if (1 >= x.length)
+            return H.ioore(x, 1);
+          result = x[1];
+          this.deserializedObjects.push(result);
+          return result;
+        case "js-object":
+          return this.deserializeJSObject$1(x);
+        case "function":
+          if (1 >= x.length)
+            return H.ioore(x, 1);
+          result = init.globalFunctions[x[1]]();
+          this.deserializedObjects.push(result);
+          return result;
+        case "dart":
+          t1 = x.length;
+          if (1 >= t1)
+            return H.ioore(x, 1);
+          classId = x[1];
+          if (2 >= t1)
+            return H.ioore(x, 2);
+          fields = x[2];
+          emptyInstance = init.instanceFromClassId(classId);
+          this.deserializedObjects.push(emptyInstance);
+          this.deserializeArrayInPlace$1(fields);
+          return init.initializeEmptyInstance(classId, emptyInstance, fields);
+        default:
+          throw H.wrapException("couldn't deserialize: " + H.S(x));
+      }
+    }, "call$1", "get$deserialize", 2, 0, 2],
+    deserializeArrayInPlace$1: function(x) {
+      var t1, i, t2;
+      t1 = J.getInterceptor$as(x);
+      i = 0;
+      while (true) {
+        t2 = t1.get$length(x);
+        if (typeof t2 !== "number")
+          return H.iae(t2);
+        if (!(i < t2))
+          break;
+        t1.$indexSet(x, i, this.deserialize$1(t1.$index(x, i)));
+        ++i;
+      }
+      return x;
+    },
+    deserializeMap$1: function(x) {
+      var t1, keys, values, result, t2, i;
+      t1 = x.length;
+      if (1 >= t1)
+        return H.ioore(x, 1);
+      keys = x[1];
+      if (2 >= t1)
+        return H.ioore(x, 2);
+      values = x[2];
+      result = P.LinkedHashMap__makeEmpty();
+      this.deserializedObjects.push(result);
+      keys = J.map$1$a(keys, this.get$deserialize()).toList$0(0);
+      for (t1 = J.getInterceptor$as(keys), t2 = J.getInterceptor$as(values), i = 0; i < t1.get$length(keys); ++i) {
+        if (i >= keys.length)
+          return H.ioore(keys, i);
+        result.$indexSet(0, keys[i], this.deserialize$1(t2.$index(values, i)));
+      }
+      return result;
+    },
+    deserializeSendPort$1: function(x) {
+      var t1, managerId, isolateId, receivePortId, isolate, receivePort, result;
+      t1 = x.length;
+      if (1 >= t1)
+        return H.ioore(x, 1);
+      managerId = x[1];
+      if (2 >= t1)
+        return H.ioore(x, 2);
+      isolateId = x[2];
+      if (3 >= t1)
+        return H.ioore(x, 3);
+      receivePortId = x[3];
+      if (J.$eq(managerId, init.globalState.currentManagerId)) {
+        isolate = init.globalState.isolates.$index(0, isolateId);
+        if (isolate == null)
+          return;
+        receivePort = isolate.lookup$1(receivePortId);
+        if (receivePort == null)
+          return;
+        result = new H._NativeJsSendPort(receivePort, isolateId);
+      } else
+        result = new H._WorkerSendPort(managerId, receivePortId, isolateId);
+      this.deserializedObjects.push(result);
+      return result;
+    },
+    deserializeJSObject$1: function(x) {
+      var t1, keys, values, o, t2, i, t3;
+      t1 = x.length;
+      if (1 >= t1)
+        return H.ioore(x, 1);
+      keys = x[1];
+      if (2 >= t1)
+        return H.ioore(x, 2);
+      values = x[2];
+      o = {};
+      this.deserializedObjects.push(o);
+      t1 = J.getInterceptor$as(keys);
+      t2 = J.getInterceptor$as(values);
+      i = 0;
+      while (true) {
+        t3 = t1.get$length(keys);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        o[t1.$index(keys, i)] = this.deserialize$1(t2.$index(values, i));
+        ++i;
+      }
+      return o;
+    }
+  }
+}], ["_js_helper", "dart:_js_helper",, H, {
+  "^": "",
+  getType: function(index) {
+    return init.types[index];
+  },
+  S: function(value) {
+    var res;
+    if (typeof value === "string")
+      return value;
+    if (typeof value === "number") {
+      if (value !== 0)
+        return "" + value;
+    } else if (true === value)
+      return "true";
+    else if (false === value)
+      return "false";
+    else if (value == null)
+      return "null";
+    res = J.toString$0(value);
+    if (typeof res !== "string")
+      throw H.wrapException(H._argumentError(value));
+    return res;
+  },
+  Primitives_objectHashCode: function(object) {
+    var hash = object.$identityHash;
+    if (hash == null) {
+      hash = Math.random() * 0x3fffffff | 0;
+      object.$identityHash = hash;
+    }
+    return hash;
+  },
+  Primitives_objectTypeName: function(object) {
+    var $name, decompiled;
+    $name = C.JS_CONST_8ZY(J.getInterceptor(object));
+    if ($name === "Object") {
+      decompiled = String(object.constructor).match(/^\s*function\s*([\w$]*)\s*\(/)[1];
+      if (typeof decompiled === "string")
+        $name = /^\w+$/.test(decompiled) ? decompiled : $name;
+    }
+    if ($name.length > 1 && C.JSString_methods.codeUnitAt$1($name, 0) === 36)
+      $name = C.JSString_methods.substring$1($name, 1);
+    return ($name + H.joinArguments(H.getRuntimeTypeInfo(object), 0, null)).replace(/[^<,> ]+/g, function(m) {
+      return init.mangledGlobalNames[m] || m;
+    });
+  },
+  Primitives_objectToString: function(object) {
+    return "Instance of '" + H.Primitives_objectTypeName(object) + "'";
+  },
+  Primitives_getProperty: function(object, key) {
+    if (object == null || typeof object === "boolean" || typeof object === "number" || typeof object === "string")
+      throw H.wrapException(H._argumentError(object));
+    return object[key];
+  },
+  Primitives_setProperty: function(object, key, value) {
+    if (object == null || typeof object === "boolean" || typeof object === "number" || typeof object === "string")
+      throw H.wrapException(H._argumentError(object));
+    object[key] = value;
+  },
+  iae: function(argument) {
+    throw H.wrapException(H._argumentError(argument));
+  },
+  ioore: function(receiver, index) {
+    if (receiver == null)
+      J.get$length$as(receiver);
+    if (typeof index !== "number" || Math.floor(index) !== index)
+      H.iae(index);
+    throw H.wrapException(P.RangeError$value(index, null, null));
+  },
+  _argumentError: function(object) {
+    return new P.ArgumentError(true, object, null, null);
+  },
+  checkInt: function(value) {
+    if (typeof value !== "number" || Math.floor(value) !== value)
+      throw H.wrapException(H._argumentError(value));
+    return value;
+  },
+  wrapException: function(ex) {
+    var wrapper;
+    if (ex == null)
+      ex = new P.NullThrownError();
+    wrapper = new Error();
+    wrapper.dartException = ex;
+    if ("defineProperty" in Object) {
+      Object.defineProperty(wrapper, "message", {get: H.toStringWrapper});
+      wrapper.name = "";
+    } else
+      wrapper.toString = H.toStringWrapper;
+    return wrapper;
+  },
+  toStringWrapper: function() {
+    return J.toString$0(this.dartException);
+  },
+  throwExpression: function(ex) {
+    throw H.wrapException(ex);
+  },
+  unwrapException: function(ex) {
+    var t1, message, number, ieErrorCode, t2, t3, t4, nullLiteralCall, t5, t6, t7, t8, t9, match;
+    t1 = new H.unwrapException_saveStackTrace(ex);
+    if (ex == null)
+      return;
+    if (ex instanceof H.ExceptionAndStackTrace)
+      return t1.call$1(ex.dartException);
+    if (typeof ex !== "object")
+      return ex;
+    if ("dartException" in ex)
+      return t1.call$1(ex.dartException);
+    else if (!("message" in ex))
+      return ex;
+    message = ex.message;
+    if ("number" in ex && typeof ex.number == "number") {
+      number = ex.number;
+      ieErrorCode = number & 65535;
+      if ((C.JSInt_methods._shrOtherPositive$1(number, 16) & 8191) === 10)
+        switch (ieErrorCode) {
+          case 438:
+            return t1.call$1(H.JsNoSuchMethodError$(H.S(message) + " (Error " + ieErrorCode + ")", null));
+          case 445:
+          case 5007:
+            t2 = H.S(message) + " (Error " + ieErrorCode + ")";
+            return t1.call$1(new H.NullError(t2, null));
+        }
+    }
+    if (ex instanceof TypeError) {
+      t2 = $.get$TypeErrorDecoder_noSuchMethodPattern();
+      t3 = $.get$TypeErrorDecoder_notClosurePattern();
+      t4 = $.get$TypeErrorDecoder_nullCallPattern();
+      nullLiteralCall = $.get$TypeErrorDecoder_nullLiteralCallPattern();
+      t5 = $.get$TypeErrorDecoder_undefinedCallPattern();
+      t6 = $.get$TypeErrorDecoder_undefinedLiteralCallPattern();
+      t7 = $.get$TypeErrorDecoder_nullPropertyPattern();
+      $.get$TypeErrorDecoder_nullLiteralPropertyPattern();
+      t8 = $.get$TypeErrorDecoder_undefinedPropertyPattern();
+      t9 = $.get$TypeErrorDecoder_undefinedLiteralPropertyPattern();
+      match = t2.matchTypeError$1(message);
+      if (match != null)
+        return t1.call$1(H.JsNoSuchMethodError$(message, match));
+      else {
+        match = t3.matchTypeError$1(message);
+        if (match != null) {
+          match.method = "call";
+          return t1.call$1(H.JsNoSuchMethodError$(message, match));
+        } else {
+          match = t4.matchTypeError$1(message);
+          if (match == null) {
+            match = nullLiteralCall.matchTypeError$1(message);
+            if (match == null) {
+              match = t5.matchTypeError$1(message);
+              if (match == null) {
+                match = t6.matchTypeError$1(message);
+                if (match == null) {
+                  match = t7.matchTypeError$1(message);
+                  if (match == null) {
+                    match = nullLiteralCall.matchTypeError$1(message);
+                    if (match == null) {
+                      match = t8.matchTypeError$1(message);
+                      if (match == null) {
+                        match = t9.matchTypeError$1(message);
+                        t2 = match != null;
+                      } else
+                        t2 = true;
+                    } else
+                      t2 = true;
+                  } else
+                    t2 = true;
+                } else
+                  t2 = true;
+              } else
+                t2 = true;
+            } else
+              t2 = true;
+          } else
+            t2 = true;
+          if (t2)
+            return t1.call$1(new H.NullError(message, match == null ? null : match.method));
+        }
+      }
+      return t1.call$1(new H.UnknownJsTypeError(typeof message === "string" ? message : ""));
+    }
+    if (ex instanceof RangeError) {
+      if (typeof message === "string" && message.indexOf("call stack") !== -1)
+        return new P.StackOverflowError();
+      return t1.call$1(new P.ArgumentError(false, null, null, null));
+    }
+    if (typeof InternalError == "function" && ex instanceof InternalError)
+      if (typeof message === "string" && message === "too much recursion")
+        return new P.StackOverflowError();
+    return ex;
+  },
+  getTraceFromException: function(exception) {
+    if (exception instanceof H.ExceptionAndStackTrace)
+      return exception.stackTrace;
+    return new H._StackTrace(exception, null);
+  },
+  objectHashCode: function(object) {
+    if (object == null || typeof object != 'object')
+      return J.get$hashCode$(object);
+    else
+      return H.Primitives_objectHashCode(object);
+  },
+  fillLiteralMap: function(keyValuePairs, result) {
+    var $length, index, index0, index1;
+    $length = keyValuePairs.length;
+    for (index = 0; index < $length; index = index1) {
+      index0 = index + 1;
+      index1 = index0 + 1;
+      result.$indexSet(0, keyValuePairs[index], keyValuePairs[index0]);
+    }
+    return result;
+  },
+  invokeClosure: function(closure, isolate, numberOfArguments, arg1, arg2, arg3, arg4) {
+    var t1 = J.getInterceptor(numberOfArguments);
+    if (t1.$eq(numberOfArguments, 0))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure(closure));
+    else if (t1.$eq(numberOfArguments, 1))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure0(closure, arg1));
+    else if (t1.$eq(numberOfArguments, 2))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure1(closure, arg1, arg2));
+    else if (t1.$eq(numberOfArguments, 3))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure2(closure, arg1, arg2, arg3));
+    else if (t1.$eq(numberOfArguments, 4))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure3(closure, arg1, arg2, arg3, arg4));
+    else
+      throw H.wrapException(P.Exception_Exception("Unsupported number of arguments for wrapped closure"));
+  },
+  convertDartClosureToJS: function(closure, arity) {
+    var $function = closure.$identity;
+    if (!!$function)
+      return $function;
+    $function = function(closure, arity, context, invoke) {
+      return function(a1, a2, a3, a4) {
+        return invoke(closure, context, arity, a1, a2, a3, a4);
+      };
+    }(closure, arity, init.globalState.currentContext, H.invokeClosure);
+    closure.$identity = $function;
+    return $function;
+  },
+  Closure_fromTearOff: function(receiver, functions, reflectionInfo, isStatic, jsArguments, propertyName) {
+    var $function, callName, functionType, $prototype, $constructor, t1, isIntercepted, trampoline, signatureFunction, getReceiver, i, stub, stubCallName, t2;
+    $function = functions[0];
+    callName = $function.$callName;
+    if (!!J.getInterceptor(reflectionInfo).$isList) {
+      $function.$reflectionInfo = reflectionInfo;
+      functionType = H.ReflectionInfo_ReflectionInfo($function).functionType;
+    } else
+      functionType = reflectionInfo;
+    $prototype = isStatic ? Object.create(new H.StaticClosure().constructor.prototype) : Object.create(new H.BoundClosure(null, null, null, null).constructor.prototype);
+    $prototype.$initialize = $prototype.constructor;
+    if (isStatic)
+      $constructor = function() {
+        this.$initialize();
+      };
+    else {
+      t1 = $.Closure_functionCounter;
+      $.Closure_functionCounter = J.$add$ns(t1, 1);
+      t1 = new Function("a,b,c,d", "this.$initialize(a,b,c,d);" + t1);
+      $constructor = t1;
+    }
+    $prototype.constructor = $constructor;
+    $constructor.prototype = $prototype;
+    t1 = !isStatic;
+    if (t1) {
+      isIntercepted = jsArguments.length == 1 && true;
+      trampoline = H.Closure_forwardCallTo(receiver, $function, isIntercepted);
+      trampoline.$reflectionInfo = reflectionInfo;
+    } else {
+      $prototype.$name = propertyName;
+      trampoline = $function;
+      isIntercepted = false;
+    }
+    if (typeof functionType == "number")
+      signatureFunction = function(t) {
+        return function() {
+          return H.getType(t);
+        };
+      }(functionType);
+    else if (t1 && typeof functionType == "function") {
+      getReceiver = isIntercepted ? H.BoundClosure_receiverOf : H.BoundClosure_selfOf;
+      signatureFunction = function(f, r) {
+        return function() {
+          return f.apply({$receiver: r(this)}, arguments);
+        };
+      }(functionType, getReceiver);
+    } else
+      throw H.wrapException("Error in reflectionInfo.");
+    $prototype.$signature = signatureFunction;
+    $prototype[callName] = trampoline;
+    for (t1 = functions.length, i = 1; i < t1; ++i) {
+      stub = functions[i];
+      stubCallName = stub.$callName;
+      if (stubCallName != null) {
+        t2 = isStatic ? stub : H.Closure_forwardCallTo(receiver, stub, isIntercepted);
+        $prototype[stubCallName] = t2;
+      }
+    }
+    $prototype["call*"] = trampoline;
+    $prototype.$requiredArgCount = $function.$requiredArgCount;
+    $prototype.$defaultValues = $function.$defaultValues;
+    return $constructor;
+  },
+  Closure_cspForwardCall: function(arity, isSuperCall, stubName, $function) {
+    var getSelf = H.BoundClosure_selfOf;
+    switch (isSuperCall ? -1 : arity) {
+      case 0:
+        return function(n, S) {
+          return function() {
+            return S(this)[n]();
+          };
+        }(stubName, getSelf);
+      case 1:
+        return function(n, S) {
+          return function(a) {
+            return S(this)[n](a);
+          };
+        }(stubName, getSelf);
+      case 2:
+        return function(n, S) {
+          return function(a, b) {
+            return S(this)[n](a, b);
+          };
+        }(stubName, getSelf);
+      case 3:
+        return function(n, S) {
+          return function(a, b, c) {
+            return S(this)[n](a, b, c);
+          };
+        }(stubName, getSelf);
+      case 4:
+        return function(n, S) {
+          return function(a, b, c, d) {
+            return S(this)[n](a, b, c, d);
+          };
+        }(stubName, getSelf);
+      case 5:
+        return function(n, S) {
+          return function(a, b, c, d, e) {
+            return S(this)[n](a, b, c, d, e);
+          };
+        }(stubName, getSelf);
+      default:
+        return function(f, s) {
+          return function() {
+            return f.apply(s(this), arguments);
+          };
+        }($function, getSelf);
+    }
+  },
+  Closure_forwardCallTo: function(receiver, $function, isIntercepted) {
+    var stubName, arity, lookedUpFunction, t1, t2, $arguments;
+    if (isIntercepted)
+      return H.Closure_forwardInterceptedCallTo(receiver, $function);
+    stubName = $function.$stubName;
+    arity = $function.length;
+    lookedUpFunction = receiver[stubName];
+    t1 = $function == null ? lookedUpFunction == null : $function === lookedUpFunction;
+    t2 = !t1 || arity >= 27;
+    if (t2)
+      return H.Closure_cspForwardCall(arity, !t1, stubName, $function);
+    if (arity === 0) {
+      t1 = $.BoundClosure_selfFieldNameCache;
+      if (t1 == null) {
+        t1 = H.BoundClosure_computeFieldNamed("self");
+        $.BoundClosure_selfFieldNameCache = t1;
+      }
+      t1 = "return function(){return this." + H.S(t1) + "." + H.S(stubName) + "();";
+      t2 = $.Closure_functionCounter;
+      $.Closure_functionCounter = J.$add$ns(t2, 1);
+      return new Function(t1 + H.S(t2) + "}")();
+    }
+    $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity).join(",");
+    t1 = "return function(" + $arguments + "){return this.";
+    t2 = $.BoundClosure_selfFieldNameCache;
+    if (t2 == null) {
+      t2 = H.BoundClosure_computeFieldNamed("self");
+      $.BoundClosure_selfFieldNameCache = t2;
+    }
+    t2 = t1 + H.S(t2) + "." + H.S(stubName) + "(" + $arguments + ");";
+    t1 = $.Closure_functionCounter;
+    $.Closure_functionCounter = J.$add$ns(t1, 1);
+    return new Function(t2 + H.S(t1) + "}")();
+  },
+  Closure_cspForwardInterceptedCall: function(arity, isSuperCall, $name, $function) {
+    var getSelf, getReceiver;
+    getSelf = H.BoundClosure_selfOf;
+    getReceiver = H.BoundClosure_receiverOf;
+    switch (isSuperCall ? -1 : arity) {
+      case 0:
+        throw H.wrapException(new H.RuntimeError("Intercepted function with no arguments."));
+      case 1:
+        return function(n, s, r) {
+          return function() {
+            return s(this)[n](r(this));
+          };
+        }($name, getSelf, getReceiver);
+      case 2:
+        return function(n, s, r) {
+          return function(a) {
+            return s(this)[n](r(this), a);
+          };
+        }($name, getSelf, getReceiver);
+      case 3:
+        return function(n, s, r) {
+          return function(a, b) {
+            return s(this)[n](r(this), a, b);
+          };
+        }($name, getSelf, getReceiver);
+      case 4:
+        return function(n, s, r) {
+          return function(a, b, c) {
+            return s(this)[n](r(this), a, b, c);
+          };
+        }($name, getSelf, getReceiver);
+      case 5:
+        return function(n, s, r) {
+          return function(a, b, c, d) {
+            return s(this)[n](r(this), a, b, c, d);
+          };
+        }($name, getSelf, getReceiver);
+      case 6:
+        return function(n, s, r) {
+          return function(a, b, c, d, e) {
+            return s(this)[n](r(this), a, b, c, d, e);
+          };
+        }($name, getSelf, getReceiver);
+      default:
+        return function(f, s, r, a) {
+          return function() {
+            a = [r(this)];
+            Array.prototype.push.apply(a, arguments);
+            return f.apply(s(this), a);
+          };
+        }($function, getSelf, getReceiver);
+    }
+  },
+  Closure_forwardInterceptedCallTo: function(receiver, $function) {
+    var selfField, t1, stubName, arity, lookedUpFunction, t2, t3, $arguments;
+    selfField = H.BoundClosure_selfFieldName();
+    t1 = $.BoundClosure_receiverFieldNameCache;
+    if (t1 == null) {
+      t1 = H.BoundClosure_computeFieldNamed("receiver");
+      $.BoundClosure_receiverFieldNameCache = t1;
+    }
+    stubName = $function.$stubName;
+    arity = $function.length;
+    lookedUpFunction = receiver[stubName];
+    t2 = $function == null ? lookedUpFunction == null : $function === lookedUpFunction;
+    t3 = !t2 || arity >= 28;
+    if (t3)
+      return H.Closure_cspForwardInterceptedCall(arity, !t2, stubName, $function);
+    if (arity === 1) {
+      t1 = "return function(){return this." + H.S(selfField) + "." + H.S(stubName) + "(this." + H.S(t1) + ");";
+      t2 = $.Closure_functionCounter;
+      $.Closure_functionCounter = J.$add$ns(t2, 1);
+      return new Function(t1 + H.S(t2) + "}")();
+    }
+    $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity - 1).join(",");
+    t1 = "return function(" + $arguments + "){return this." + H.S(selfField) + "." + H.S(stubName) + "(this." + H.S(t1) + ", " + $arguments + ");";
+    t2 = $.Closure_functionCounter;
+    $.Closure_functionCounter = J.$add$ns(t2, 1);
+    return new Function(t1 + H.S(t2) + "}")();
+  },
+  closureFromTearOff: function(receiver, functions, reflectionInfo, isStatic, jsArguments, $name) {
+    var t1;
+    functions.fixed$length = Array;
+    if (!!J.getInterceptor(reflectionInfo).$isList) {
+      reflectionInfo.fixed$length = Array;
+      t1 = reflectionInfo;
+    } else
+      t1 = reflectionInfo;
+    return H.Closure_fromTearOff(receiver, functions, t1, !!isStatic, jsArguments, $name);
+  },
+  throwCyclicInit: function(staticName) {
+    throw H.wrapException(new P.CyclicInitializationError("Cyclic initialization for static " + H.S(staticName)));
+  },
+  buildFunctionType: function(returnType, parameterTypes, optionalParameterTypes) {
+    return new H.RuntimeFunctionType(returnType, parameterTypes, optionalParameterTypes, null);
+  },
+  getDynamicRuntimeType: function() {
+    return C.C_DynamicRuntimeType;
+  },
+  random64: function() {
+    return (Math.random() * 0x100000000 >>> 0) + (Math.random() * 0x100000000 >>> 0) * 4294967296;
+  },
+  asyncHelper: function(object, bodyFunctionOrErrorCode, completer) {
+    var future;
+    if (bodyFunctionOrErrorCode === 0) {
+      completer.complete$1(object);
+      return;
+    } else if (bodyFunctionOrErrorCode === 1) {
+      completer.completeError$2(H.unwrapException(object), H.getTraceFromException(object));
+      return;
+    }
+    if (!!J.getInterceptor(object).$isFuture)
+      future = object;
+    else {
+      future = H.setRuntimeTypeInfo(new P._Future(0, $.Zone__current, null), [null]);
+      future._asyncComplete$1(object);
+    }
+    future.then$2$onError(H._wrapJsFunctionForAsync(bodyFunctionOrErrorCode, 0), new H.asyncHelper_closure(bodyFunctionOrErrorCode));
+    return completer.get$future();
+  },
+  _wrapJsFunctionForAsync: function($function, errorCode) {
+    return new H._wrapJsFunctionForAsync_closure(errorCode, function(errorCode, result) {
+      while (true)
+        try {
+          $function(errorCode, result);
+          break;
+        } catch (error) {
+          result = error;
+          errorCode = 1;
+        }
+    });
+  },
+  setRuntimeTypeInfo: function(target, typeInfo) {
+    if (target != null)
+      target.$builtinTypeInfo = typeInfo;
+    return target;
+  },
+  getRuntimeTypeInfo: function(target) {
+    if (target == null)
+      return;
+    return target.$builtinTypeInfo;
+  },
+  getRuntimeTypeArguments: function(target, substitutionName) {
+    return H.substitute(target["$as" + H.S(substitutionName)], H.getRuntimeTypeInfo(target));
+  },
+  getRuntimeTypeArgument: function(target, substitutionName, index) {
+    var $arguments = H.getRuntimeTypeArguments(target, substitutionName);
+    return $arguments == null ? null : $arguments[index];
+  },
+  getTypeArgumentByIndex: function(target, index) {
+    var rti = H.getRuntimeTypeInfo(target);
+    return rti == null ? null : rti[index];
+  },
+  runtimeTypeToString: function(type, onTypeVariable) {
+    if (type == null)
+      return "dynamic";
+    else if (typeof type === "object" && type !== null && type.constructor === Array)
+      return type[0].builtin$cls + H.joinArguments(type, 1, onTypeVariable);
+    else if (typeof type == "function")
+      return type.builtin$cls;
+    else if (typeof type === "number" && Math.floor(type) === type)
+      return C.JSInt_methods.toString$0(type);
+    else
+      return;
+  },
+  joinArguments: function(types, startIndex, onTypeVariable) {
+    var buffer, index, firstArgument, allDynamic, t1, argument;
+    if (types == null)
+      return "";
+    buffer = new P.StringBuffer("");
+    for (index = startIndex, firstArgument = true, allDynamic = true, t1 = ""; index < types.length; ++index) {
+      if (firstArgument)
+        firstArgument = false;
+      else
+        buffer._contents = t1 + ", ";
+      argument = types[index];
+      if (argument != null)
+        allDynamic = false;
+      t1 = buffer._contents += H.S(H.runtimeTypeToString(argument, onTypeVariable));
+    }
+    return allDynamic ? "" : "<" + H.S(buffer) + ">";
+  },
+  substitute: function(substitution, $arguments) {
+    if (typeof substitution == "function") {
+      substitution = H.invokeOn(substitution, null, $arguments);
+      if (substitution == null || typeof substitution === "object" && substitution !== null && substitution.constructor === Array)
+        $arguments = substitution;
+      else if (typeof substitution == "function")
+        $arguments = H.invokeOn(substitution, null, $arguments);
+    }
+    return $arguments;
+  },
+  areSubtypes: function(s, t) {
+    var len, i;
+    if (s == null || t == null)
+      return true;
+    len = s.length;
+    for (i = 0; i < len; ++i)
+      if (!H.isSubtype(s[i], t[i]))
+        return false;
+    return true;
+  },
+  computeSignature: function(signature, context, contextName) {
+    return H.invokeOn(signature, context, H.getRuntimeTypeArguments(context, contextName));
+  },
+  isSubtype: function(s, t) {
+    var t1, typeOfS, t2, typeOfT, substitution;
+    if (s === t)
+      return true;
+    if (s == null || t == null)
+      return true;
+    if ('func' in t)
+      return H.isFunctionSubtype(s, t);
+    if ('func' in s)
+      return t.builtin$cls === "Function";
+    t1 = typeof s === "object" && s !== null && s.constructor === Array;
+    typeOfS = t1 ? s[0] : s;
+    t2 = typeof t === "object" && t !== null && t.constructor === Array;
+    typeOfT = t2 ? t[0] : t;
+    if (typeOfT !== typeOfS) {
+      if (!('$is' + H.runtimeTypeToString(typeOfT, null) in typeOfS.prototype))
+        return false;
+      substitution = typeOfS.prototype["$as" + H.S(H.runtimeTypeToString(typeOfT, null))];
+    } else
+      substitution = null;
+    if (!t1 && substitution == null || !t2)
+      return true;
+    t1 = t1 ? s.slice(1) : null;
+    t2 = t2 ? t.slice(1) : null;
+    return H.areSubtypes(H.substitute(substitution, t1), t2);
+  },
+  areAssignable: function(s, t, allowShorter) {
+    var t1, sLength, tLength, i, t2;
+    t1 = t == null;
+    if (t1 && s == null)
+      return true;
+    if (t1)
+      return allowShorter;
+    if (s == null)
+      return false;
+    sLength = s.length;
+    tLength = t.length;
+    if (allowShorter) {
+      if (sLength < tLength)
+        return false;
+    } else if (sLength !== tLength)
+      return false;
+    for (i = 0; i < tLength; ++i) {
+      t1 = s[i];
+      t2 = t[i];
+      if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
+        return false;
+    }
+    return true;
+  },
+  areAssignableMaps: function(s, t) {
+    var t1, names, i, $name, tType, sType;
+    if (t == null)
+      return true;
+    if (s == null)
+      return false;
+    t1 = Object.getOwnPropertyNames(t);
+    t1.fixed$length = Array;
+    names = t1;
+    for (t1 = names.length, i = 0; i < t1; ++i) {
+      $name = names[i];
+      if (!Object.hasOwnProperty.call(s, $name))
+        return false;
+      tType = t[$name];
+      sType = s[$name];
+      if (!(H.isSubtype(tType, sType) || H.isSubtype(sType, tType)))
+        return false;
+    }
+    return true;
+  },
+  isFunctionSubtype: function(s, t) {
+    var sReturnType, tReturnType, sParameterTypes, tParameterTypes, sOptionalParameterTypes, tOptionalParameterTypes, sParametersLen, tParametersLen, sOptionalParametersLen, tOptionalParametersLen, pos, t1, t2, tPos, sPos;
+    if (!('func' in s))
+      return false;
+    if ("void" in s) {
+      if (!("void" in t) && "ret" in t)
+        return false;
+    } else if (!("void" in t)) {
+      sReturnType = s.ret;
+      tReturnType = t.ret;
+      if (!(H.isSubtype(sReturnType, tReturnType) || H.isSubtype(tReturnType, sReturnType)))
+        return false;
+    }
+    sParameterTypes = s.args;
+    tParameterTypes = t.args;
+    sOptionalParameterTypes = s.opt;
+    tOptionalParameterTypes = t.opt;
+    sParametersLen = sParameterTypes != null ? sParameterTypes.length : 0;
+    tParametersLen = tParameterTypes != null ? tParameterTypes.length : 0;
+    sOptionalParametersLen = sOptionalParameterTypes != null ? sOptionalParameterTypes.length : 0;
+    tOptionalParametersLen = tOptionalParameterTypes != null ? tOptionalParameterTypes.length : 0;
+    if (sParametersLen > tParametersLen)
+      return false;
+    if (sParametersLen + sOptionalParametersLen < tParametersLen + tOptionalParametersLen)
+      return false;
+    if (sParametersLen === tParametersLen) {
+      if (!H.areAssignable(sParameterTypes, tParameterTypes, false))
+        return false;
+      if (!H.areAssignable(sOptionalParameterTypes, tOptionalParameterTypes, true))
+        return false;
+    } else {
+      for (pos = 0; pos < sParametersLen; ++pos) {
+        t1 = sParameterTypes[pos];
+        t2 = tParameterTypes[pos];
+        if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
+          return false;
+      }
+      for (tPos = pos, sPos = 0; tPos < tParametersLen; ++sPos, ++tPos) {
+        t1 = sOptionalParameterTypes[sPos];
+        t2 = tParameterTypes[tPos];
+        if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
+          return false;
+      }
+      for (tPos = 0; tPos < tOptionalParametersLen; ++sPos, ++tPos) {
+        t1 = sOptionalParameterTypes[sPos];
+        t2 = tOptionalParameterTypes[tPos];
+        if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
+          return false;
+      }
+    }
+    return H.areAssignableMaps(s.named, t.named);
+  },
+  invokeOn: function($function, receiver, $arguments) {
+    return $function.apply(receiver, $arguments);
+  },
+  ReflectionInfo: {
+    "^": "Object;jsFunction,data,isAccessor,requiredParameterCount,optionalParameterCount,areOptionalParametersNamed,functionType,cachedSortedIndices",
+    static: {ReflectionInfo_ReflectionInfo: function(jsFunction) {
+        var data, requiredParametersInfo, optionalParametersInfo;
+        data = jsFunction.$reflectionInfo;
+        if (data == null)
+          return;
+        data.fixed$length = Array;
+        data = data;
+        requiredParametersInfo = data[0];
+        optionalParametersInfo = data[1];
+        return new H.ReflectionInfo(jsFunction, data, (requiredParametersInfo & 1) === 1, requiredParametersInfo >> 1, optionalParametersInfo >> 1, (optionalParametersInfo & 1) === 1, data[2], null);
+      }}
+  },
+  TypeErrorDecoder: {
+    "^": "Object;_pattern,_arguments,_argumentsExpr,_expr,_method,_receiver",
+    matchTypeError$1: function(message) {
+      var match, result, t1;
+      match = new RegExp(this._pattern).exec(message);
+      if (match == null)
+        return;
+      result = Object.create(null);
+      t1 = this._arguments;
+      if (t1 !== -1)
+        result.arguments = match[t1 + 1];
+      t1 = this._argumentsExpr;
+      if (t1 !== -1)
+        result.argumentsExpr = match[t1 + 1];
+      t1 = this._expr;
+      if (t1 !== -1)
+        result.expr = match[t1 + 1];
+      t1 = this._method;
+      if (t1 !== -1)
+        result.method = match[t1 + 1];
+      t1 = this._receiver;
+      if (t1 !== -1)
+        result.receiver = match[t1 + 1];
+      return result;
+    },
+    static: {TypeErrorDecoder_extractPattern: function(message) {
+        var match, $arguments, argumentsExpr, expr, method, receiver;
+        message = message.replace(String({}), '$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]", 'g'), '\\$&');
+        match = message.match(/\\\$[a-zA-Z]+\\\$/g);
+        if (match == null)
+          match = [];
+        $arguments = match.indexOf("\\$arguments\\$");
+        argumentsExpr = match.indexOf("\\$argumentsExpr\\$");
+        expr = match.indexOf("\\$expr\\$");
+        method = match.indexOf("\\$method\\$");
+        receiver = match.indexOf("\\$receiver\\$");
+        return new H.TypeErrorDecoder(message.replace('\\$arguments\\$', '((?:x|[^x])*)').replace('\\$argumentsExpr\\$', '((?:x|[^x])*)').replace('\\$expr\\$', '((?:x|[^x])*)').replace('\\$method\\$', '((?:x|[^x])*)').replace('\\$receiver\\$', '((?:x|[^x])*)'), $arguments, argumentsExpr, expr, method, receiver);
+      }, TypeErrorDecoder_provokeCallErrorOn: function(expression) {
+        return function($expr$) {
+          var $argumentsExpr$ = '$arguments$';
+          try {
+            $expr$.$method$($argumentsExpr$);
+          } catch (e) {
+            return e.message;
+          }
+        }(expression);
+      }, TypeErrorDecoder_provokePropertyErrorOn: function(expression) {
+        return function($expr$) {
+          try {
+            $expr$.$method$;
+          } catch (e) {
+            return e.message;
+          }
+        }(expression);
+      }}
+  },
+  NullError: {
+    "^": "Error;_message,_method",
+    toString$0: function(_) {
+      var t1 = this._method;
+      if (t1 == null)
+        return "NullError: " + H.S(this._message);
+      return "NullError: method not found: '" + H.S(t1) + "' on null";
+    }
+  },
+  JsNoSuchMethodError: {
+    "^": "Error;_message,_method,_receiver",
+    toString$0: function(_) {
+      var t1, t2;
+      t1 = this._method;
+      if (t1 == null)
+        return "NoSuchMethodError: " + H.S(this._message);
+      t2 = this._receiver;
+      if (t2 == null)
+        return "NoSuchMethodError: method not found: '" + H.S(t1) + "' (" + H.S(this._message) + ")";
+      return "NoSuchMethodError: method not found: '" + H.S(t1) + "' on '" + H.S(t2) + "' (" + H.S(this._message) + ")";
+    },
+    static: {JsNoSuchMethodError$: function(_message, match) {
+        var t1, t2;
+        t1 = match == null;
+        t2 = t1 ? null : match.method;
+        return new H.JsNoSuchMethodError(_message, t2, t1 ? null : match.receiver);
+      }}
+  },
+  UnknownJsTypeError: {
+    "^": "Error;_message",
+    toString$0: function(_) {
+      var t1 = this._message;
+      return C.JSString_methods.get$isEmpty(t1) ? "Error" : "Error: " + t1;
+    }
+  },
+  unwrapException_saveStackTrace: {
+    "^": "Closure:2;_captured_ex_0",
+    call$1: function(error) {
+      if (!!J.getInterceptor(error).$isError)
+        if (error.$thrownJsError == null)
+          error.$thrownJsError = this._captured_ex_0;
+      return error;
+    }
+  },
+  _StackTrace: {
+    "^": "Object;_exception,_trace",
+    toString$0: function(_) {
+      var t1, trace;
+      t1 = this._trace;
+      if (t1 != null)
+        return t1;
+      t1 = this._exception;
+      trace = t1 !== null && typeof t1 === "object" ? t1.stack : null;
+      t1 = trace == null ? "" : trace;
+      this._trace = t1;
+      return t1;
+    }
+  },
+  invokeClosure_closure: {
+    "^": "Closure:0;_captured_closure_0",
+    call$0: function() {
+      return this._captured_closure_0.call$0();
+    }
+  },
+  invokeClosure_closure0: {
+    "^": "Closure:0;_captured_closure_1,_captured_arg1_2",
+    call$0: function() {
+      return this._captured_closure_1.call$1(this._captured_arg1_2);
+    }
+  },
+  invokeClosure_closure1: {
+    "^": "Closure:0;_captured_closure_3,_captured_arg1_4,_captured_arg2_5",
+    call$0: function() {
+      return this._captured_closure_3.call$2(this._captured_arg1_4, this._captured_arg2_5);
+    }
+  },
+  invokeClosure_closure2: {
+    "^": "Closure:0;_captured_closure_6,_captured_arg1_7,_captured_arg2_8,_captured_arg3_9",
+    call$0: function() {
+      return this._captured_closure_6.call$3(this._captured_arg1_7, this._captured_arg2_8, this._captured_arg3_9);
+    }
+  },
+  invokeClosure_closure3: {
+    "^": "Closure:0;_captured_closure_10,_captured_arg1_11,_captured_arg2_12,_captured_arg3_13,_captured_arg4_14",
+    call$0: function() {
+      return this._captured_closure_10.call$4(this._captured_arg1_11, this._captured_arg2_12, this._captured_arg3_13, this._captured_arg4_14);
+    }
+  },
+  Closure: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "Closure '" + H.Primitives_objectTypeName(this) + "'";
+    },
+    get$$call: function() {
+      return this;
+    },
+    get$$call: function() {
+      return this;
+    }
+  },
+  TearOffClosure: {
+    "^": "Closure;"
+  },
+  StaticClosure: {
+    "^": "TearOffClosure;",
+    toString$0: function(_) {
+      var $name = this.$name;
+      if ($name == null)
+        return "Closure of unknown static method";
+      return "Closure '" + $name + "'";
+    }
+  },
+  BoundClosure: {
+    "^": "TearOffClosure;_self,_target,_receiver,_name",
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (this === other)
+        return true;
+      if (!(other instanceof H.BoundClosure))
+        return false;
+      return this._self === other._self && this._target === other._target && this._receiver === other._receiver;
+    },
+    get$hashCode: function(_) {
+      var t1, receiverHashCode;
+      t1 = this._receiver;
+      if (t1 == null)
+        receiverHashCode = H.Primitives_objectHashCode(this._self);
+      else
+        receiverHashCode = typeof t1 !== "object" ? J.get$hashCode$(t1) : H.Primitives_objectHashCode(t1);
+      return (receiverHashCode ^ H.Primitives_objectHashCode(this._target)) >>> 0;
+    },
+    toString$0: function(_) {
+      var receiver = this._receiver;
+      if (receiver == null)
+        receiver = this._self;
+      return "Closure '" + H.S(this._name) + "' of " + H.Primitives_objectToString(receiver);
+    },
+    static: {BoundClosure_selfOf: function(closure) {
+        return closure._self;
+      }, BoundClosure_receiverOf: function(closure) {
+        return closure._receiver;
+      }, BoundClosure_selfFieldName: function() {
+        var t1 = $.BoundClosure_selfFieldNameCache;
+        if (t1 == null) {
+          t1 = H.BoundClosure_computeFieldNamed("self");
+          $.BoundClosure_selfFieldNameCache = t1;
+        }
+        return t1;
+      }, BoundClosure_computeFieldNamed: function(fieldName) {
+        var template, t1, names, i, $name;
+        template = new H.BoundClosure("self", "target", "receiver", "name");
+        t1 = Object.getOwnPropertyNames(template);
+        t1.fixed$length = Array;
+        names = t1;
+        for (t1 = names.length, i = 0; i < t1; ++i) {
+          $name = names[i];
+          if (template[$name] === fieldName)
+            return $name;
+        }
+      }}
+  },
+  RuntimeError: {
+    "^": "Error;message",
+    toString$0: function(_) {
+      return "RuntimeError: " + this.message;
+    }
+  },
+  RuntimeType: {
+    "^": "Object;"
+  },
+  RuntimeFunctionType: {
+    "^": "RuntimeType;returnType,parameterTypes,optionalParameterTypes,namedParameters",
+    _isTest$1: function(expression) {
+      var functionTypeObject = this._extractFunctionTypeObjectFrom$1(expression);
+      return functionTypeObject == null ? false : H.isFunctionSubtype(functionTypeObject, this.toRti$0());
+    },
+    _extractFunctionTypeObjectFrom$1: function(o) {
+      var interceptor = J.getInterceptor(o);
+      return "$signature" in interceptor ? interceptor.$signature() : null;
+    },
+    toRti$0: function() {
+      var result, t1, t2, namedRti, keys, i, $name;
+      result = {func: "dynafunc"};
+      t1 = this.returnType;
+      t2 = J.getInterceptor(t1);
+      if (!!t2.$isVoidRuntimeType)
+        result.void = true;
+      else if (!t2.$isDynamicRuntimeType)
+        result.ret = t1.toRti$0();
+      t1 = this.parameterTypes;
+      if (t1 != null && t1.length !== 0)
+        result.args = H.RuntimeFunctionType_listToRti(t1);
+      t1 = this.optionalParameterTypes;
+      if (t1 != null && t1.length !== 0)
+        result.opt = H.RuntimeFunctionType_listToRti(t1);
+      t1 = this.namedParameters;
+      if (t1 != null) {
+        namedRti = Object.create(null);
+        keys = H.extractKeys(t1);
+        for (t2 = keys.length, i = 0; i < t2; ++i) {
+          $name = keys[i];
+          namedRti[$name] = t1[$name].toRti$0();
+        }
+        result.named = namedRti;
+      }
+      return result;
+    },
+    toString$0: function(_) {
+      var t1, t2, result, needsComma, i, type, keys, $name;
+      t1 = this.parameterTypes;
+      if (t1 != null)
+        for (t2 = t1.length, result = "(", needsComma = false, i = 0; i < t2; ++i, needsComma = true) {
+          type = t1[i];
+          if (needsComma)
+            result += ", ";
+          result += H.S(type);
+        }
+      else {
+        result = "(";
+        needsComma = false;
+      }
+      t1 = this.optionalParameterTypes;
+      if (t1 != null && t1.length !== 0) {
+        result = (needsComma ? result + ", " : result) + "[";
+        for (t2 = t1.length, needsComma = false, i = 0; i < t2; ++i, needsComma = true) {
+          type = t1[i];
+          if (needsComma)
+            result += ", ";
+          result += H.S(type);
+        }
+        result += "]";
+      } else {
+        t1 = this.namedParameters;
+        if (t1 != null) {
+          result = (needsComma ? result + ", " : result) + "{";
+          keys = H.extractKeys(t1);
+          for (t2 = keys.length, needsComma = false, i = 0; i < t2; ++i, needsComma = true) {
+            $name = keys[i];
+            if (needsComma)
+              result += ", ";
+            result += H.S(t1[$name].toRti$0()) + " " + $name;
+          }
+          result += "}";
+        }
+      }
+      return result + (") -> " + H.S(this.returnType));
+    },
+    static: {RuntimeFunctionType_listToRti: function(list) {
+        var result, t1, i;
+        list = list;
+        result = [];
+        for (t1 = list.length, i = 0; i < t1; ++i)
+          result.push(list[i].toRti$0());
+        return result;
+      }}
+  },
+  DynamicRuntimeType: {
+    "^": "RuntimeType;",
+    toString$0: function(_) {
+      return "dynamic";
+    },
+    toRti$0: function() {
+      return;
+    }
+  },
+  ExceptionAndStackTrace: {
+    "^": "Object;dartException,stackTrace<"
+  },
+  asyncHelper_closure: {
+    "^": "Closure:3;_captured_bodyFunctionOrErrorCode_0",
+    call$2: function(error, stackTrace) {
+      H._wrapJsFunctionForAsync(this._captured_bodyFunctionOrErrorCode_0, 1).call$1(new H.ExceptionAndStackTrace(error, stackTrace));
+    }
+  },
+  _wrapJsFunctionForAsync_closure: {
+    "^": "Closure:2;_captured_errorCode_0,_captured_protected_1",
+    call$1: function(result) {
+      this._captured_protected_1(this._captured_errorCode_0, result);
+    }
+  },
+  JsLinkedHashMap: {
+    "^": "Object;__js_helper$_length,_strings,_nums,_rest,_first,_last,_modifications",
+    get$length: function(_) {
+      return this.__js_helper$_length;
+    },
+    get$keys: function() {
+      return H.setRuntimeTypeInfo(new H.LinkedHashMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]);
+    },
+    get$values: function() {
+      return H.MappedIterable_MappedIterable(H.setRuntimeTypeInfo(new H.LinkedHashMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]), new H.JsLinkedHashMap_values_closure(this), H.getTypeArgumentByIndex(this, 0), H.getTypeArgumentByIndex(this, 1));
+    },
+    containsKey$1: function(key) {
+      var nums;
+      if ((key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null)
+          return false;
+        return this._containsTableEntry$2(nums, key);
+      } else
+        return this.internalContainsKey$1(key);
+    },
+    internalContainsKey$1: function(key) {
+      var rest = this._rest;
+      if (rest == null)
+        return false;
+      return this.internalFindBucketIndex$2(this._getTableEntry$2(rest, this.internalComputeHashCode$1(key)), key) >= 0;
+    },
+    $index: function(_, key) {
+      var strings, cell, nums;
+      if (typeof key === "string") {
+        strings = this._strings;
+        if (strings == null)
+          return;
+        cell = this._getTableEntry$2(strings, key);
+        return cell == null ? null : cell.get$hashMapCellValue();
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null)
+          return;
+        cell = this._getTableEntry$2(nums, key);
+        return cell == null ? null : cell.get$hashMapCellValue();
+      } else
+        return this.internalGet$1(key);
+    },
+    internalGet$1: function(key) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = this._getTableEntry$2(rest, this.internalComputeHashCode$1(key));
+      index = this.internalFindBucketIndex$2(bucket, key);
+      if (index < 0)
+        return;
+      return bucket[index].get$hashMapCellValue();
+    },
+    $indexSet: function(_, key, value) {
+      var strings, nums;
+      if (typeof key === "string") {
+        strings = this._strings;
+        if (strings == null) {
+          strings = this._newHashTable$0();
+          this._strings = strings;
+        }
+        this.__js_helper$_addHashTableEntry$3(strings, key, value);
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null) {
+          nums = this._newHashTable$0();
+          this._nums = nums;
+        }
+        this.__js_helper$_addHashTableEntry$3(nums, key, value);
+      } else
+        this.internalSet$2(key, value);
+    },
+    internalSet$2: function(key, value) {
+      var rest, hash, bucket, index;
+      rest = this._rest;
+      if (rest == null) {
+        rest = this._newHashTable$0();
+        this._rest = rest;
+      }
+      hash = this.internalComputeHashCode$1(key);
+      bucket = this._getTableEntry$2(rest, hash);
+      if (bucket == null)
+        this._setTableEntry$3(rest, hash, [this.__js_helper$_newLinkedCell$2(key, value)]);
+      else {
+        index = this.internalFindBucketIndex$2(bucket, key);
+        if (index >= 0)
+          bucket[index].set$hashMapCellValue(value);
+        else
+          bucket.push(this.__js_helper$_newLinkedCell$2(key, value));
+      }
+    },
+    remove$1: function(_, key) {
+      if (typeof key === "string")
+        return this._removeHashTableEntry$2(this._strings, key);
+      else if (typeof key === "number" && (key & 0x3ffffff) === key)
+        return this._removeHashTableEntry$2(this._nums, key);
+      else
+        return this.internalRemove$1(key);
+    },
+    internalRemove$1: function(key) {
+      var rest, bucket, index, cell;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = this._getTableEntry$2(rest, this.internalComputeHashCode$1(key));
+      index = this.internalFindBucketIndex$2(bucket, key);
+      if (index < 0)
+        return;
+      cell = bucket.splice(index, 1)[0];
+      this._unlinkCell$1(cell);
+      return cell.get$hashMapCellValue();
+    },
+    forEach$1: function(_, action) {
+      var cell, modifications;
+      cell = this._first;
+      modifications = this._modifications;
+      for (; cell != null;) {
+        action.call$2(cell.hashMapCellKey, cell.hashMapCellValue);
+        if (modifications !== this._modifications)
+          throw H.wrapException(new P.ConcurrentModificationError(this));
+        cell = cell.__js_helper$_next;
+      }
+    },
+    __js_helper$_addHashTableEntry$3: function(table, key, value) {
+      var cell = this._getTableEntry$2(table, key);
+      if (cell == null)
+        this._setTableEntry$3(table, key, this.__js_helper$_newLinkedCell$2(key, value));
+      else
+        cell.set$hashMapCellValue(value);
+    },
+    _removeHashTableEntry$2: function(table, key) {
+      var cell;
+      if (table == null)
+        return;
+      cell = this._getTableEntry$2(table, key);
+      if (cell == null)
+        return;
+      this._unlinkCell$1(cell);
+      this._deleteTableEntry$2(table, key);
+      return cell.get$hashMapCellValue();
+    },
+    __js_helper$_newLinkedCell$2: function(key, value) {
+      var cell, last;
+      cell = new H.LinkedHashMapCell(key, value, null, null);
+      if (this._first == null) {
+        this._last = cell;
+        this._first = cell;
+      } else {
+        last = this._last;
+        cell.__js_helper$_previous = last;
+        last.__js_helper$_next = cell;
+        this._last = cell;
+      }
+      ++this.__js_helper$_length;
+      this._modifications = this._modifications + 1 & 67108863;
+      return cell;
+    },
+    _unlinkCell$1: function(cell) {
+      var previous, next;
+      previous = cell.get$__js_helper$_previous();
+      next = cell.__js_helper$_next;
+      if (previous == null)
+        this._first = next;
+      else
+        previous.__js_helper$_next = next;
+      if (next == null)
+        this._last = previous;
+      else
+        next.__js_helper$_previous = previous;
+      --this.__js_helper$_length;
+      this._modifications = this._modifications + 1 & 67108863;
+    },
+    internalComputeHashCode$1: function(key) {
+      return J.get$hashCode$(key) & 0x3ffffff;
+    },
+    internalFindBucketIndex$2: function(bucket, key) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; ++i)
+        if (J.$eq(bucket[i].get$hashMapCellKey(), key))
+          return i;
+      return -1;
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    _getTableEntry$2: function(table, key) {
+      return table[key];
+    },
+    _setTableEntry$3: function(table, key, value) {
+      table[key] = value;
+    },
+    _deleteTableEntry$2: function(table, key) {
+      delete table[key];
+    },
+    _containsTableEntry$2: function(table, key) {
+      return this._getTableEntry$2(table, key) != null;
+    },
+    _newHashTable$0: function() {
+      var table = Object.create(null);
+      this._setTableEntry$3(table, "<non-identifier-key>", table);
+      this._deleteTableEntry$2(table, "<non-identifier-key>");
+      return table;
+    },
+    $isInternalMap: 1
+  },
+  JsLinkedHashMap_values_closure: {
+    "^": "Closure:2;__js_helper$_captured_this_0",
+    call$1: function(each) {
+      return this.__js_helper$_captured_this_0.$index(0, each);
+    }
+  },
+  LinkedHashMapCell: {
+    "^": "Object;hashMapCellKey<,hashMapCellValue@,__js_helper$_next,__js_helper$_previous<"
+  },
+  LinkedHashMapKeyIterable: {
+    "^": "Iterable;_map",
+    get$length: function(_) {
+      return this._map.__js_helper$_length;
+    },
+    get$iterator: function(_) {
+      var t1, t2;
+      t1 = this._map;
+      t2 = new H.LinkedHashMapKeyIterator(t1, t1._modifications, null, null);
+      t2.__js_helper$_cell = t1._first;
+      return t2;
+    },
+    forEach$1: function(_, f) {
+      var t1, cell, modifications;
+      t1 = this._map;
+      cell = t1._first;
+      modifications = t1._modifications;
+      for (; cell != null;) {
+        f.call$1(cell.hashMapCellKey);
+        if (modifications !== t1._modifications)
+          throw H.wrapException(new P.ConcurrentModificationError(t1));
+        cell = cell.__js_helper$_next;
+      }
+    },
+    $isEfficientLengthIterable: 1
+  },
+  LinkedHashMapKeyIterator: {
+    "^": "Object;_map,_modifications,__js_helper$_cell,__js_helper$_current",
+    get$current: function() {
+      return this.__js_helper$_current;
+    },
+    moveNext$0: function() {
+      var t1 = this._map;
+      if (this._modifications !== t1._modifications)
+        throw H.wrapException(new P.ConcurrentModificationError(t1));
+      else {
+        t1 = this.__js_helper$_cell;
+        if (t1 == null) {
+          this.__js_helper$_current = null;
+          return false;
+        } else {
+          this.__js_helper$_current = t1.hashMapCellKey;
+          this.__js_helper$_cell = t1.__js_helper$_next;
+          return true;
+        }
+      }
+    }
+  }
+}], ["dart._internal", "dart:_internal",, H, {
+  "^": "",
+  IterableElementError_noElement: function() {
+    return new P.StateError("No element");
+  },
+  Symbol_getName: function(symbol) {
+    return symbol.get$__internal$_name();
+  },
+  ListIterable: {
+    "^": "Iterable;",
+    get$iterator: function(_) {
+      return new H.ListIterator(this, this.get$length(this), 0, null);
+    },
+    forEach$1: function(_, action) {
+      var $length, i;
+      $length = this.get$length(this);
+      for (i = 0; i < $length; ++i) {
+        action.call$1(this.elementAt$1(0, i));
+        if ($length !== this.get$length(this))
+          throw H.wrapException(new P.ConcurrentModificationError(this));
+      }
+    },
+    map$1: function(_, f) {
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(this, f), [null, null]);
+    },
+    toList$1$growable: function(_, growable) {
+      var result, i, t1;
+      if (growable) {
+        result = H.setRuntimeTypeInfo([], [H.getRuntimeTypeArgument(this, "ListIterable", 0)]);
+        C.JSArray_methods.set$length(result, this.get$length(this));
+      } else
+        result = H.setRuntimeTypeInfo(Array(this.get$length(this)), [H.getRuntimeTypeArgument(this, "ListIterable", 0)]);
+      for (i = 0; i < this.get$length(this); ++i) {
+        t1 = this.elementAt$1(0, i);
+        if (i >= result.length)
+          return H.ioore(result, i);
+        result[i] = t1;
+      }
+      return result;
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    $isEfficientLengthIterable: 1
+  },
+  ListIterator: {
+    "^": "Object;__internal$_iterable,__internal$_length,__internal$_index,__internal$_current",
+    get$current: function() {
+      return this.__internal$_current;
+    },
+    moveNext$0: function() {
+      var t1, $length, t2;
+      t1 = this.__internal$_iterable;
+      $length = t1.get$length(t1);
+      if (this.__internal$_length !== $length)
+        throw H.wrapException(new P.ConcurrentModificationError(t1));
+      t2 = this.__internal$_index;
+      if (t2 >= $length) {
+        this.__internal$_current = null;
+        return false;
+      }
+      this.__internal$_current = t1.elementAt$1(0, t2);
+      ++this.__internal$_index;
+      return true;
+    }
+  },
+  MappedIterable: {
+    "^": "Iterable;__internal$_iterable,_f",
+    get$iterator: function(_) {
+      var t1 = new H.MappedIterator(null, J.get$iterator$a(this.__internal$_iterable), this._f);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    get$length: function(_) {
+      return J.get$length$as(this.__internal$_iterable);
+    },
+    $asIterable: function($S, $T) {
+      return [$T];
+    },
+    static: {MappedIterable_MappedIterable: function(iterable, $function, $S, $T) {
+        if (!!J.getInterceptor(iterable).$isEfficientLengthIterable)
+          return H.setRuntimeTypeInfo(new H.EfficientLengthMappedIterable(iterable, $function), [$S, $T]);
+        return H.setRuntimeTypeInfo(new H.MappedIterable(iterable, $function), [$S, $T]);
+      }}
+  },
+  EfficientLengthMappedIterable: {
+    "^": "MappedIterable;__internal$_iterable,_f",
+    $isEfficientLengthIterable: 1,
+    $asEfficientLengthIterable: function($S, $T) {
+      return [$T];
+    }
+  },
+  MappedIterator: {
+    "^": "Iterator;__internal$_current,_iterator,_f",
+    moveNext$0: function() {
+      var t1 = this._iterator;
+      if (t1.moveNext$0()) {
+        this.__internal$_current = this._f$1(t1.get$current());
+        return true;
+      }
+      this.__internal$_current = null;
+      return false;
+    },
+    get$current: function() {
+      return this.__internal$_current;
+    },
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    }
+  },
+  MappedListIterable: {
+    "^": "ListIterable;_source,_f",
+    get$length: function(_) {
+      return J.get$length$as(this._source);
+    },
+    elementAt$1: function(_, index) {
+      return this._f$1(J.elementAt$1$a(this._source, index));
+    },
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    $asListIterable: function($S, $T) {
+      return [$T];
+    },
+    $asIterable: function($S, $T) {
+      return [$T];
+    },
+    $asEfficientLengthIterable: function($S, $T) {
+      return [$T];
+    }
+  }
+}], ["dart._js_names", "dart:_js_names",, H, {
+  "^": "",
+  extractKeys: function(victim) {
+    var t1 = H.setRuntimeTypeInfo(victim ? Object.keys(victim) : [], [null]);
+    t1.fixed$length = Array;
+    return t1;
+  }
+}], ["dart.async", "dart:async",, P, {
+  "^": "",
+  _AsyncRun__initializeScheduleImmediate: function() {
+    var t1, div, span;
+    t1 = {};
+    if (self.scheduleImmediate != null)
+      return P._AsyncRun__scheduleImmediateJsOverride$closure();
+    if (self.MutationObserver != null && self.document != null) {
+      div = self.document.createElement("div");
+      span = self.document.createElement("span");
+      t1._captured_storedCallback_0 = null;
+      new self.MutationObserver(H.convertDartClosureToJS(new P._AsyncRun__initializeScheduleImmediate_internalCallback(t1), 1)).observe(div, {childList: true});
+      return new P._AsyncRun__initializeScheduleImmediate_closure(t1, div, span);
+    } else if (self.setImmediate != null)
+      return P._AsyncRun__scheduleImmediateWithSetImmediate$closure();
+    return P._AsyncRun__scheduleImmediateWithTimer$closure();
+  },
+  _AsyncRun__scheduleImmediateJsOverride: [function(callback) {
+    ++init.globalState.topEventLoop._activeJsAsyncCount;
+    self.scheduleImmediate(H.convertDartClosureToJS(new P._AsyncRun__scheduleImmediateJsOverride_internalCallback(callback), 0));
+  }, "call$1", "_AsyncRun__scheduleImmediateJsOverride$closure", 2, 0, 11],
+  _AsyncRun__scheduleImmediateWithSetImmediate: [function(callback) {
+    ++init.globalState.topEventLoop._activeJsAsyncCount;
+    self.setImmediate(H.convertDartClosureToJS(new P._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback(callback), 0));
+  }, "call$1", "_AsyncRun__scheduleImmediateWithSetImmediate$closure", 2, 0, 11],
+  _AsyncRun__scheduleImmediateWithTimer: [function(callback) {
+    P.Timer__createTimer(C.Duration_0, callback);
+  }, "call$1", "_AsyncRun__scheduleImmediateWithTimer$closure", 2, 0, 11],
+  _registerErrorHandler: function(errorHandler, zone) {
+    var t1 = H.getDynamicRuntimeType();
+    t1 = H.buildFunctionType(t1, [t1, t1])._isTest$1(errorHandler);
+    if (t1) {
+      zone.toString;
+      return errorHandler;
+    } else {
+      zone.toString;
+      return errorHandler;
+    }
+  },
+  Completer_Completer: function($T) {
+    return H.setRuntimeTypeInfo(new P._AsyncCompleter(H.setRuntimeTypeInfo(new P._Future(0, $.Zone__current, null), [$T])), [$T]);
+  },
+  _microtaskLoop: function() {
+    var t1, t2;
+    for (; t1 = $._nextCallback, t1 != null;) {
+      $._lastPriorityCallback = null;
+      t2 = t1.next;
+      $._nextCallback = t2;
+      if (t2 == null)
+        $._lastCallback = null;
+      $.Zone__current = t1.zone;
+      t1.callback$0();
+    }
+  },
+  _microtaskLoopEntry: [function() {
+    $._isInCallbackLoop = true;
+    try {
+      P._microtaskLoop();
+    } finally {
+      $.Zone__current = C.C__RootZone;
+      $._lastPriorityCallback = null;
+      $._isInCallbackLoop = false;
+      if ($._nextCallback != null)
+        $.get$_AsyncRun_scheduleImmediateClosure().call$1(P._microtaskLoopEntry$closure());
+    }
+  }, "call$0", "_microtaskLoopEntry$closure", 0, 0, 1],
+  _scheduleAsyncCallback: function(newEntry) {
+    if ($._nextCallback == null) {
+      $._lastCallback = newEntry;
+      $._nextCallback = newEntry;
+      if (!$._isInCallbackLoop)
+        $.get$_AsyncRun_scheduleImmediateClosure().call$1(P._microtaskLoopEntry$closure());
+    } else {
+      $._lastCallback.next = newEntry;
+      $._lastCallback = newEntry;
+    }
+  },
+  scheduleMicrotask: function(callback) {
+    var currentZone, t1;
+    currentZone = $.Zone__current;
+    if (C.C__RootZone === currentZone) {
+      P._rootScheduleMicrotask(null, null, C.C__RootZone, callback);
+      return;
+    }
+    currentZone.toString;
+    if (C.C__RootZone.get$errorZone() === currentZone) {
+      P._rootScheduleMicrotask(null, null, currentZone, callback);
+      return;
+    }
+    t1 = $.Zone__current;
+    P._rootScheduleMicrotask(null, null, t1, t1.bindCallback$2$runGuarded(callback, true));
+  },
+  StreamIterator_StreamIterator: function(stream, $T) {
+    var t1, t2, t3;
+    t1 = H.setRuntimeTypeInfo(new P._StreamIteratorImpl(null, null, null, 0), [$T]);
+    t2 = t1.get$_onData();
+    t3 = t1.get$_onError();
+    t1._subscription = stream.listen$4$cancelOnError$onDone$onError(t2, true, t1.get$_onDone(), t3);
+    return t1;
+  },
+  Timer_Timer: function(duration, callback) {
+    var t1 = $.Zone__current;
+    if (t1 === C.C__RootZone) {
+      t1.toString;
+      return P.Timer__createTimer(duration, callback);
+    }
+    return P.Timer__createTimer(duration, t1.bindCallback$2$runGuarded(callback, true));
+  },
+  Timer__createTimer: function(duration, callback) {
+    var milliseconds = C.JSInt_methods._tdivFast$1(duration._duration, 1000);
+    return H.TimerImpl$(milliseconds < 0 ? 0 : milliseconds, callback);
+  },
+  Zone__enter: function(zone) {
+    var previous = $.Zone__current;
+    $.Zone__current = zone;
+    return previous;
+  },
+  _rootHandleUncaughtError: function($self, $parent, zone, error, stackTrace) {
+    var entry, t1, t2;
+    entry = new P._AsyncCallbackEntry(new P._rootHandleUncaughtError_closure(error, stackTrace), C.C__RootZone, null);
+    t1 = $._nextCallback;
+    if (t1 == null) {
+      P._scheduleAsyncCallback(entry);
+      $._lastPriorityCallback = $._lastCallback;
+    } else {
+      t2 = $._lastPriorityCallback;
+      if (t2 == null) {
+        entry.next = t1;
+        $._lastPriorityCallback = entry;
+        $._nextCallback = entry;
+      } else {
+        entry.next = t2.next;
+        t2.next = entry;
+        $._lastPriorityCallback = entry;
+        if (entry.next == null)
+          $._lastCallback = entry;
+      }
+    }
+  },
+  _rootRun: function($self, $parent, zone, f) {
+    var old, t1;
+    if ($.Zone__current === zone)
+      return f.call$0();
+    old = P.Zone__enter(zone);
+    try {
+      t1 = f.call$0();
+      return t1;
+    } finally {
+      $.Zone__current = old;
+    }
+  },
+  _rootRunUnary: function($self, $parent, zone, f, arg) {
+    var old, t1;
+    if ($.Zone__current === zone)
+      return f.call$1(arg);
+    old = P.Zone__enter(zone);
+    try {
+      t1 = f.call$1(arg);
+      return t1;
+    } finally {
+      $.Zone__current = old;
+    }
+  },
+  _rootRunBinary: function($self, $parent, zone, f, arg1, arg2) {
+    var old, t1;
+    if ($.Zone__current === zone)
+      return f.call$2(arg1, arg2);
+    old = P.Zone__enter(zone);
+    try {
+      t1 = f.call$2(arg1, arg2);
+      return t1;
+    } finally {
+      $.Zone__current = old;
+    }
+  },
+  _rootScheduleMicrotask: function($self, $parent, zone, f) {
+    var t1 = C.C__RootZone !== zone;
+    if (t1) {
+      f = zone.bindCallback$2$runGuarded(f, !(!t1 || C.C__RootZone.get$errorZone() === zone));
+      zone = C.C__RootZone;
+    }
+    P._scheduleAsyncCallback(new P._AsyncCallbackEntry(f, zone, null));
+  },
+  _AsyncRun__initializeScheduleImmediate_internalCallback: {
+    "^": "Closure:2;_box_0",
+    call$1: function(_) {
+      var t1, f;
+      H.leaveJsAsync();
+      t1 = this._box_0;
+      f = t1._captured_storedCallback_0;
+      t1._captured_storedCallback_0 = null;
+      f.call$0();
+    }
+  },
+  _AsyncRun__initializeScheduleImmediate_closure: {
+    "^": "Closure:4;_box_0,_captured_div_1,_captured_span_2",
+    call$1: function(callback) {
+      var t1, t2;
+      ++init.globalState.topEventLoop._activeJsAsyncCount;
+      this._box_0._captured_storedCallback_0 = callback;
+      t1 = this._captured_div_1;
+      t2 = this._captured_span_2;
+      t1.firstChild ? t1.removeChild(t2) : t1.appendChild(t2);
+    }
+  },
+  _AsyncRun__scheduleImmediateJsOverride_internalCallback: {
+    "^": "Closure:0;_captured_callback_0",
+    call$0: function() {
+      H.leaveJsAsync();
+      this._captured_callback_0.call$0();
+    }
+  },
+  _AsyncRun__scheduleImmediateWithSetImmediate_internalCallback: {
+    "^": "Closure:0;_captured_callback_0",
+    call$0: function() {
+      H.leaveJsAsync();
+      this._captured_callback_0.call$0();
+    }
+  },
+  _UncaughtAsyncError: {
+    "^": "AsyncError;error,stackTrace",
+    toString$0: function(_) {
+      var result, t1;
+      result = "Uncaught Error: " + H.S(this.error);
+      t1 = this.stackTrace;
+      return t1 != null ? result + ("\nStack Trace:\n" + H.S(t1)) : result;
+    },
+    static: {_UncaughtAsyncError__getBestStackTrace: function(error, stackTrace) {
+        if (stackTrace != null)
+          return stackTrace;
+        if (!!J.getInterceptor(error).$isError)
+          return error.get$stackTrace();
+        return;
+      }}
+  },
+  Future: {
+    "^": "Object;"
+  },
+  _Completer: {
+    "^": "Object;future<",
+    completeError$2: function(error, stackTrace) {
+      error = error != null ? error : new P.NullThrownError();
+      if (this.future._state !== 0)
+        throw H.wrapException(new P.StateError("Future already completed"));
+      $.Zone__current.toString;
+      this._completeError$2(error, stackTrace);
+    }
+  },
+  _AsyncCompleter: {
+    "^": "_Completer;future",
+    complete$1: function(value) {
+      var t1 = this.future;
+      if (t1._state !== 0)
+        throw H.wrapException(new P.StateError("Future already completed"));
+      t1._asyncComplete$1(value);
+    },
+    _completeError$2: function(error, stackTrace) {
+      this.future._asyncCompleteError$2(error, stackTrace);
+    }
+  },
+  _FutureListener: {
+    "^": "Object;_nextListener<,result<,state,callback,errorCallback",
+    get$_zone: function() {
+      return this.result._zone;
+    },
+    get$handlesValue: function() {
+      return (this.state & 1) !== 0;
+    },
+    get$hasErrorTest: function() {
+      return this.state === 6;
+    },
+    get$handlesComplete: function() {
+      return this.state === 8;
+    },
+    get$_onValue: function() {
+      return this.callback;
+    },
+    get$_whenCompleteAction: function() {
+      return this.callback;
+    }
+  },
+  _Future: {
+    "^": "Object;_state?,_zone<,_resultOrListeners",
+    get$_hasError: function() {
+      return this._state === 8;
+    },
+    set$_isChained: function(value) {
+      if (value)
+        this._state = 2;
+      else
+        this._state = 0;
+    },
+    then$2$onError: function(f, onError) {
+      var result, t1;
+      result = H.setRuntimeTypeInfo(new P._Future(0, $.Zone__current, null), [null]);
+      t1 = result._zone;
+      if (t1 !== C.C__RootZone) {
+        t1.toString;
+        if (onError != null)
+          onError = P._registerErrorHandler(onError, t1);
+      }
+      this._addListener$1(new P._FutureListener(null, result, onError == null ? 1 : 3, f, onError));
+      return result;
+    },
+    _markPendingCompletion$0: function() {
+      if (this._state !== 0)
+        throw H.wrapException(new P.StateError("Future already completed"));
+      this._state = 1;
+    },
+    get$_value: function() {
+      return this._resultOrListeners;
+    },
+    get$_error: function() {
+      return this._resultOrListeners;
+    },
+    _setValue$1: function(value) {
+      this._state = 4;
+      this._resultOrListeners = value;
+    },
+    _setErrorObject$1: function(error) {
+      this._state = 8;
+      this._resultOrListeners = error;
+    },
+    _setError$2: function(error, stackTrace) {
+      this._setErrorObject$1(new P.AsyncError(error, stackTrace));
+    },
+    _addListener$1: function(listener) {
+      var t1;
+      if (this._state >= 4) {
+        t1 = this._zone;
+        t1.toString;
+        P._rootScheduleMicrotask(null, null, t1, new P._Future__addListener_closure(this, listener));
+      } else {
+        listener._nextListener = this._resultOrListeners;
+        this._resultOrListeners = listener;
+      }
+    },
+    _removeListeners$0: function() {
+      var current, prev, next;
+      current = this._resultOrListeners;
+      this._resultOrListeners = null;
+      for (prev = null; current != null; prev = current, current = next) {
+        next = current.get$_nextListener();
+        current._nextListener = prev;
+      }
+      return prev;
+    },
+    _complete$1: function(value) {
+      var t1, listeners;
+      t1 = J.getInterceptor(value);
+      if (!!t1.$isFuture)
+        if (!!t1.$is_Future)
+          P._Future__chainCoreFuture(value, this);
+        else
+          P._Future__chainForeignFuture(value, this);
+      else {
+        listeners = this._removeListeners$0();
+        this._setValue$1(value);
+        P._Future__propagateToListeners(this, listeners);
+      }
+    },
+    _completeWithValue$1: function(value) {
+      var listeners = this._removeListeners$0();
+      this._setValue$1(value);
+      P._Future__propagateToListeners(this, listeners);
+    },
+    _completeError$2: function(error, stackTrace) {
+      var listeners = this._removeListeners$0();
+      this._setErrorObject$1(new P.AsyncError(error, stackTrace));
+      P._Future__propagateToListeners(this, listeners);
+    },
+    _asyncComplete$1: function(value) {
+      var t1;
+      if (value == null)
+        ;
+      else {
+        t1 = J.getInterceptor(value);
+        if (!!t1.$isFuture) {
+          if (!!t1.$is_Future) {
+            t1 = value._state;
+            if (t1 >= 4 && t1 === 8) {
+              this._markPendingCompletion$0();
+              t1 = this._zone;
+              t1.toString;
+              P._rootScheduleMicrotask(null, null, t1, new P._Future__asyncComplete_closure(this, value));
+            } else
+              P._Future__chainCoreFuture(value, this);
+          } else
+            P._Future__chainForeignFuture(value, this);
+          return;
+        }
+      }
+      this._markPendingCompletion$0();
+      t1 = this._zone;
+      t1.toString;
+      P._rootScheduleMicrotask(null, null, t1, new P._Future__asyncComplete_closure0(this, value));
+    },
+    _asyncCompleteError$2: function(error, stackTrace) {
+      var t1;
+      this._markPendingCompletion$0();
+      t1 = this._zone;
+      t1.toString;
+      P._rootScheduleMicrotask(null, null, t1, new P._Future__asyncCompleteError_closure(this, error, stackTrace));
+    },
+    $isFuture: 1,
+    static: {_Future__chainForeignFuture: function(source, target) {
+        var e, s, exception, t1;
+        target.set$_state(2);
+        try {
+          source.then$2$onError(new P._Future__chainForeignFuture_closure(target), new P._Future__chainForeignFuture_closure0(target));
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e = t1;
+          s = H.getTraceFromException(exception);
+          P.scheduleMicrotask(new P._Future__chainForeignFuture_closure1(target, e, s));
+        }
+      }, _Future__chainCoreFuture: function(source, target) {
+        var listener;
+        target._state = 2;
+        listener = new P._FutureListener(null, target, 0, null, null);
+        if (source._state >= 4)
+          P._Future__propagateToListeners(source, listener);
+        else
+          source._addListener$1(listener);
+      }, _Future__propagateToListeners: function(source, listeners) {
+        var t1, t2, t3, hasError, asyncError, t4, listeners0, sourceValue, zone, oldZone, chainSource, result;
+        t1 = {};
+        t1._captured_source_4 = source;
+        for (t2 = source; true;) {
+          t3 = {};
+          hasError = t2.get$_hasError();
+          if (listeners == null) {
+            if (hasError) {
+              asyncError = t1._captured_source_4.get$_error();
+              t2 = t1._captured_source_4.get$_zone();
+              t3 = asyncError.get$error();
+              t4 = asyncError.get$stackTrace();
+              t2.toString;
+              P._rootHandleUncaughtError(null, null, t2, t3, t4);
+            }
+            return;
+          }
+          for (; listeners.get$_nextListener() != null; listeners = listeners0) {
+            listeners0 = listeners._nextListener;
+            listeners._nextListener = null;
+            P._Future__propagateToListeners(t1._captured_source_4, listeners);
+          }
+          t3._captured_listenerHasValue_1 = true;
+          sourceValue = hasError ? null : t1._captured_source_4.get$_value();
+          t3._captured_listenerValueOrError_2 = sourceValue;
+          t3._captured_isPropagationAborted_3 = false;
+          t2 = !hasError;
+          if (!t2 || listeners.get$handlesValue() || listeners.state === 8) {
+            zone = listeners.get$_zone();
+            if (hasError) {
+              t4 = t1._captured_source_4.get$_zone();
+              t4.toString;
+              if (t4 == null ? zone != null : t4 !== zone) {
+                t4 = t4.get$errorZone();
+                zone.toString;
+                t4 = t4 === zone;
+              } else
+                t4 = true;
+              t4 = !t4;
+            } else
+              t4 = false;
+            if (t4) {
+              asyncError = t1._captured_source_4.get$_error();
+              t2 = t1._captured_source_4.get$_zone();
+              t3 = asyncError.get$error();
+              t4 = asyncError.get$stackTrace();
+              t2.toString;
+              P._rootHandleUncaughtError(null, null, t2, t3, t4);
+              return;
+            }
+            oldZone = $.Zone__current;
+            if (oldZone == null ? zone != null : oldZone !== zone)
+              $.Zone__current = zone;
+            else
+              oldZone = null;
+            if (t2) {
+              if (listeners.get$handlesValue())
+                t3._captured_listenerHasValue_1 = new P._Future__propagateToListeners_handleValueCallback(t3, listeners, sourceValue, zone).call$0();
+            } else
+              new P._Future__propagateToListeners_handleError(t1, t3, listeners, zone).call$0();
+            if (listeners.get$handlesComplete())
+              new P._Future__propagateToListeners_handleWhenCompleteCallback(t1, t3, hasError, listeners, zone).call$0();
+            if (oldZone != null)
+              $.Zone__current = oldZone;
+            if (t3._captured_isPropagationAborted_3)
+              return;
+            if (t3._captured_listenerHasValue_1 === true) {
+              t2 = t3._captured_listenerValueOrError_2;
+              t2 = (sourceValue == null ? t2 != null : sourceValue !== t2) && !!J.getInterceptor(t2).$isFuture;
+            } else
+              t2 = false;
+            if (t2) {
+              chainSource = t3._captured_listenerValueOrError_2;
+              result = listeners.result;
+              if (chainSource instanceof P._Future)
+                if (chainSource._state >= 4) {
+                  result._state = 2;
+                  t1._captured_source_4 = chainSource;
+                  listeners = new P._FutureListener(null, result, 0, null, null);
+                  t2 = chainSource;
+                  continue;
+                } else
+                  P._Future__chainCoreFuture(chainSource, result);
+              else
+                P._Future__chainForeignFuture(chainSource, result);
+              return;
+            }
+          }
+          result = listeners.result;
+          listeners = result._removeListeners$0();
+          t2 = t3._captured_listenerHasValue_1;
+          t3 = t3._captured_listenerValueOrError_2;
+          if (t2 === true) {
+            result._state = 4;
+            result._resultOrListeners = t3;
+          } else {
+            result._state = 8;
+            result._resultOrListeners = t3;
+          }
+          t1._captured_source_4 = result;
+          t2 = result;
+        }
+      }}
+  },
+  _Future__addListener_closure: {
+    "^": "Closure:0;_async$_captured_this_0,_captured_listener_1",
+    call$0: function() {
+      P._Future__propagateToListeners(this._async$_captured_this_0, this._captured_listener_1);
+    }
+  },
+  _Future__chainForeignFuture_closure: {
+    "^": "Closure:2;_captured_target_0",
+    call$1: function(value) {
+      this._captured_target_0._completeWithValue$1(value);
+    }
+  },
+  _Future__chainForeignFuture_closure0: {
+    "^": "Closure:5;_captured_target_1",
+    call$2: function(error, stackTrace) {
+      this._captured_target_1._completeError$2(error, stackTrace);
+    },
+    call$1: function(error) {
+      return this.call$2(error, null);
+    }
+  },
+  _Future__chainForeignFuture_closure1: {
+    "^": "Closure:0;_captured_target_2,_captured_e_3,_captured_s_4",
+    call$0: function() {
+      this._captured_target_2._completeError$2(this._captured_e_3, this._captured_s_4);
+    }
+  },
+  _Future__asyncComplete_closure: {
+    "^": "Closure:0;_async$_captured_this_0,_captured_coreFuture_1",
+    call$0: function() {
+      P._Future__chainCoreFuture(this._captured_coreFuture_1, this._async$_captured_this_0);
+    }
+  },
+  _Future__asyncComplete_closure0: {
+    "^": "Closure:0;_async$_captured_this_2,_captured_value_3",
+    call$0: function() {
+      this._async$_captured_this_2._completeWithValue$1(this._captured_value_3);
+    }
+  },
+  _Future__asyncCompleteError_closure: {
+    "^": "Closure:0;_async$_captured_this_0,_captured_error_1,_captured_stackTrace_2",
+    call$0: function() {
+      this._async$_captured_this_0._completeError$2(this._captured_error_1, this._captured_stackTrace_2);
+    }
+  },
+  _Future__propagateToListeners_handleValueCallback: {
+    "^": "Closure:6;_box_1,_captured_listener_3,_captured_sourceValue_4,_captured_zone_5",
+    call$0: function() {
+      var e, s, exception, t1;
+      try {
+        this._box_1._captured_listenerValueOrError_2 = this._captured_zone_5.runUnary$2(this._captured_listener_3.get$_onValue(), this._captured_sourceValue_4);
+        return true;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = H.getTraceFromException(exception);
+        this._box_1._captured_listenerValueOrError_2 = new P.AsyncError(e, s);
+        return false;
+      }
+    }
+  },
+  _Future__propagateToListeners_handleError: {
+    "^": "Closure:1;_box_2,_box_1,_captured_listener_6,_captured_zone_7",
+    call$0: function() {
+      var asyncError, matchesTest, test, e, s, errorCallback, e0, s0, t1, exception, t2, listenerValueOrError, t3, t4;
+      asyncError = this._box_2._captured_source_4.get$_error();
+      matchesTest = true;
+      t1 = this._captured_listener_6;
+      if (t1.get$hasErrorTest()) {
+        test = t1.callback;
+        try {
+          matchesTest = this._captured_zone_7.runUnary$2(test, asyncError.get$error());
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e = t1;
+          s = H.getTraceFromException(exception);
+          t1 = asyncError.get$error();
+          t2 = e;
+          listenerValueOrError = (t1 == null ? t2 == null : t1 === t2) ? asyncError : new P.AsyncError(e, s);
+          t1 = this._box_1;
+          t1._captured_listenerValueOrError_2 = listenerValueOrError;
+          t1._captured_listenerHasValue_1 = false;
+          return;
+        }
+      }
+      errorCallback = t1.errorCallback;
+      if (matchesTest === true && errorCallback != null) {
+        try {
+          t1 = errorCallback;
+          t2 = H.getDynamicRuntimeType();
+          t2 = H.buildFunctionType(t2, [t2, t2])._isTest$1(t1);
+          t3 = this._captured_zone_7;
+          t4 = this._box_1;
+          if (t2)
+            t4._captured_listenerValueOrError_2 = t3.runBinary$3(errorCallback, asyncError.get$error(), asyncError.get$stackTrace());
+          else
+            t4._captured_listenerValueOrError_2 = t3.runUnary$2(errorCallback, asyncError.get$error());
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e0 = t1;
+          s0 = H.getTraceFromException(exception);
+          t1 = asyncError.get$error();
+          t2 = e0;
+          listenerValueOrError = (t1 == null ? t2 == null : t1 === t2) ? asyncError : new P.AsyncError(e0, s0);
+          t1 = this._box_1;
+          t1._captured_listenerValueOrError_2 = listenerValueOrError;
+          t1._captured_listenerHasValue_1 = false;
+          return;
+        }
+        this._box_1._captured_listenerHasValue_1 = true;
+      } else {
+        t1 = this._box_1;
+        t1._captured_listenerValueOrError_2 = asyncError;
+        t1._captured_listenerHasValue_1 = false;
+      }
+    }
+  },
+  _Future__propagateToListeners_handleWhenCompleteCallback: {
+    "^": "Closure:1;_box_2,_box_1,_captured_hasError_8,_captured_listener_9,_captured_zone_10",
+    call$0: function() {
+      var t1, e, s, completeResult, t2, exception, result;
+      t1 = {};
+      t1._captured_completeResult_0 = null;
+      try {
+        completeResult = this._captured_zone_10.run$1(this._captured_listener_9.get$_whenCompleteAction());
+        t1._captured_completeResult_0 = completeResult;
+        t2 = completeResult;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = H.getTraceFromException(exception);
+        if (this._captured_hasError_8) {
+          t1 = this._box_2._captured_source_4.get$_error().get$error();
+          t2 = e;
+          t2 = t1 == null ? t2 == null : t1 === t2;
+          t1 = t2;
+        } else
+          t1 = false;
+        t2 = this._box_1;
+        if (t1)
+          t2._captured_listenerValueOrError_2 = this._box_2._captured_source_4.get$_error();
+        else
+          t2._captured_listenerValueOrError_2 = new P.AsyncError(e, s);
+        t2._captured_listenerHasValue_1 = false;
+        return;
+      }
+      if (!!J.getInterceptor(t2).$isFuture) {
+        result = this._captured_listener_9.get$result();
+        result.set$_isChained(true);
+        this._box_1._captured_isPropagationAborted_3 = true;
+        t2.then$2$onError(new P._Future__propagateToListeners_handleWhenCompleteCallback_closure(this._box_2, result), new P._Future__propagateToListeners_handleWhenCompleteCallback_closure0(t1, result));
+      }
+    }
+  },
+  _Future__propagateToListeners_handleWhenCompleteCallback_closure: {
+    "^": "Closure:2;_box_2,_captured_result_11",
+    call$1: function(ignored) {
+      P._Future__propagateToListeners(this._box_2._captured_source_4, new P._FutureListener(null, this._captured_result_11, 0, null, null));
+    }
+  },
+  _Future__propagateToListeners_handleWhenCompleteCallback_closure0: {
+    "^": "Closure:5;_box_0,_captured_result_12",
+    call$2: function(error, stackTrace) {
+      var t1, completeResult;
+      t1 = this._box_0;
+      if (!(t1._captured_completeResult_0 instanceof P._Future)) {
+        completeResult = H.setRuntimeTypeInfo(new P._Future(0, $.Zone__current, null), [null]);
+        t1._captured_completeResult_0 = completeResult;
+        completeResult._setError$2(error, stackTrace);
+      }
+      P._Future__propagateToListeners(t1._captured_completeResult_0, new P._FutureListener(null, this._captured_result_12, 0, null, null));
+    },
+    call$1: function(error) {
+      return this.call$2(error, null);
+    }
+  },
+  _AsyncCallbackEntry: {
+    "^": "Object;callback,zone,next",
+    callback$0: function() {
+      return this.callback.call$0();
+    }
+  },
+  StreamSubscription: {
+    "^": "Object;"
+  },
+  _EventSink: {
+    "^": "Object;"
+  },
+  _DelayedEvent: {
+    "^": "Object;"
+  },
+  _StreamIteratorImpl: {
+    "^": "Object;_subscription,_current,_futureOrPrefetch,_state?",
+    _clear$0: function() {
+      this._subscription = null;
+      this._futureOrPrefetch = null;
+      this._current = null;
+      this._state = 1;
+    },
+    _onData$1: [function(data) {
+      var hasNext;
+      if (this._state === 2) {
+        this._current = data;
+        hasNext = this._futureOrPrefetch;
+        this._futureOrPrefetch = null;
+        this._state = 0;
+        hasNext._complete$1(true);
+        return;
+      }
+      this._subscription.pause$0();
+      this._futureOrPrefetch = data;
+      this._state = 3;
+    }, "call$1", "get$_onData", 2, 0, function() {
+      return H.computeSignature(function(T) {
+        return {func: 1, void: true, args: [T]};
+      }, this.$receiver, "_StreamIteratorImpl");
+    }],
+    _onError$2: [function(error, stackTrace) {
+      var hasNext;
+      if (this._state === 2) {
+        hasNext = this._futureOrPrefetch;
+        this._clear$0();
+        hasNext._completeError$2(error, stackTrace);
+        return;
+      }
+      this._subscription.pause$0();
+      this._futureOrPrefetch = new P.AsyncError(error, stackTrace);
+      this._state = 4;
+    }, function(error) {
+      return this._onError$2(error, null);
+    }, "_onError$1", "call$2", "call$1", "get$_onError", 2, 2, 7, 0],
+    _onDone$0: [function() {
+      if (this._state === 2) {
+        var hasNext = this._futureOrPrefetch;
+        this._clear$0();
+        hasNext._complete$1(false);
+        return;
+      }
+      this._subscription.pause$0();
+      this._futureOrPrefetch = null;
+      this._state = 5;
+    }, "call$0", "get$_onDone", 0, 0, 1]
+  },
+  AsyncError: {
+    "^": "Object;error<,stackTrace<",
+    toString$0: function(_) {
+      return H.S(this.error);
+    },
+    $isError: 1
+  },
+  _Zone: {
+    "^": "Object;"
+  },
+  _rootHandleUncaughtError_closure: {
+    "^": "Closure:0;_captured_error_0,_captured_stackTrace_1",
+    call$0: function() {
+      var t1 = this._captured_error_0;
+      throw H.wrapException(new P._UncaughtAsyncError(t1, P._UncaughtAsyncError__getBestStackTrace(t1, this._captured_stackTrace_1)));
+    }
+  },
+  _RootZone: {
+    "^": "_Zone;",
+    get$errorZone: function() {
+      return this;
+    },
+    runGuarded$1: function(f) {
+      var e, s, t1, exception;
+      try {
+        if (C.C__RootZone === $.Zone__current) {
+          t1 = f.call$0();
+          return t1;
+        }
+        t1 = P._rootRun(null, null, this, f);
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = H.getTraceFromException(exception);
+        return P._rootHandleUncaughtError(null, null, this, e, s);
+      }
+    },
+    bindCallback$2$runGuarded: function(f, runGuarded) {
+      if (runGuarded)
+        return new P._RootZone_bindCallback_closure(this, f);
+      else
+        return new P._RootZone_bindCallback_closure0(this, f);
+    },
+    $index: function(_, key) {
+      return;
+    },
+    run$1: function(f) {
+      if ($.Zone__current === C.C__RootZone)
+        return f.call$0();
+      return P._rootRun(null, null, this, f);
+    },
+    runUnary$2: function(f, arg) {
+      if ($.Zone__current === C.C__RootZone)
+        return f.call$1(arg);
+      return P._rootRunUnary(null, null, this, f, arg);
+    },
+    runBinary$3: function(f, arg1, arg2) {
+      if ($.Zone__current === C.C__RootZone)
+        return f.call$2(arg1, arg2);
+      return P._rootRunBinary(null, null, this, f, arg1, arg2);
+    }
+  },
+  _RootZone_bindCallback_closure: {
+    "^": "Closure:0;_async$_captured_this_0,_captured_f_1",
+    call$0: function() {
+      return this._async$_captured_this_0.runGuarded$1(this._captured_f_1);
+    }
+  },
+  _RootZone_bindCallback_closure0: {
+    "^": "Closure:0;_async$_captured_this_2,_captured_f_3",
+    call$0: function() {
+      return this._async$_captured_this_2.run$1(this._captured_f_3);
+    }
+  }
+}], ["dart.collection", "dart:collection",, P, {
+  "^": "",
+  LinkedHashMap__makeEmpty: function() {
+    return H.setRuntimeTypeInfo(new H.JsLinkedHashMap(0, null, null, null, null, null, 0), [null, null]);
+  },
+  LinkedHashMap__makeLiteral: function(keyValuePairs) {
+    return H.fillLiteralMap(keyValuePairs, H.setRuntimeTypeInfo(new H.JsLinkedHashMap(0, null, null, null, null, null, 0), [null, null]));
+  },
+  _defaultEquals: [function(a, b) {
+    return J.$eq(a, b);
+  }, "call$2", "_defaultEquals$closure", 4, 0, 12],
+  _defaultHashCode: [function(a) {
+    return J.get$hashCode$(a);
+  }, "call$1", "_defaultHashCode$closure", 2, 0, 13],
+  IterableBase_iterableToShortString: function(iterable, leftDelimiter, rightDelimiter) {
+    var parts, t1;
+    if (P._isToStringVisiting(iterable)) {
+      if (leftDelimiter === "(" && rightDelimiter === ")")
+        return "(...)";
+      return leftDelimiter + "..." + rightDelimiter;
+    }
+    parts = [];
+    t1 = $.get$_toStringVisiting();
+    t1.push(iterable);
+    try {
+      P._iterablePartsToStrings(iterable, parts);
+    } finally {
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1.pop();
+    }
+    t1 = P.StringBuffer__writeAll(leftDelimiter, parts, ", ") + rightDelimiter;
+    return t1.charCodeAt(0) == 0 ? t1 : t1;
+  },
+  IterableBase_iterableToFullString: function(iterable, leftDelimiter, rightDelimiter) {
+    var buffer, t1, t2;
+    if (P._isToStringVisiting(iterable))
+      return leftDelimiter + "..." + rightDelimiter;
+    buffer = new P.StringBuffer(leftDelimiter);
+    t1 = $.get$_toStringVisiting();
+    t1.push(iterable);
+    try {
+      t2 = buffer;
+      t2._contents = P.StringBuffer__writeAll(t2.get$_contents(), iterable, ", ");
+    } finally {
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1.pop();
+    }
+    t1 = buffer;
+    t1._contents = t1.get$_contents() + rightDelimiter;
+    t1 = buffer.get$_contents();
+    return t1.charCodeAt(0) == 0 ? t1 : t1;
+  },
+  _isToStringVisiting: function(o) {
+    var i, t1;
+    for (i = 0; t1 = $.get$_toStringVisiting(), i < t1.length; ++i)
+      if (o === t1[i])
+        return true;
+    return false;
+  },
+  _iterablePartsToStrings: function(iterable, parts) {
+    var it, $length, count, next, ultimateString, penultimateString, penultimate, ultimate, ultimate0, elision;
+    it = iterable.get$iterator(iterable);
+    $length = 0;
+    count = 0;
+    while (true) {
+      if (!($length < 80 || count < 3))
+        break;
+      if (!it.moveNext$0())
+        return;
+      next = H.S(it.get$current());
+      parts.push(next);
+      $length += next.length + 2;
+      ++count;
+    }
+    if (!it.moveNext$0()) {
+      if (count <= 5)
+        return;
+      if (0 >= parts.length)
+        return H.ioore(parts, 0);
+      ultimateString = parts.pop();
+      if (0 >= parts.length)
+        return H.ioore(parts, 0);
+      penultimateString = parts.pop();
+    } else {
+      penultimate = it.get$current();
+      ++count;
+      if (!it.moveNext$0()) {
+        if (count <= 4) {
+          parts.push(H.S(penultimate));
+          return;
+        }
+        ultimateString = H.S(penultimate);
+        if (0 >= parts.length)
+          return H.ioore(parts, 0);
+        penultimateString = parts.pop();
+        $length += ultimateString.length + 2;
+      } else {
+        ultimate = it.get$current();
+        ++count;
+        for (; it.moveNext$0(); penultimate = ultimate, ultimate = ultimate0) {
+          ultimate0 = it.get$current();
+          ++count;
+          if (count > 100) {
+            while (true) {
+              if (!($length > 75 && count > 3))
+                break;
+              if (0 >= parts.length)
+                return H.ioore(parts, 0);
+              $length -= parts.pop().length + 2;
+              --count;
+            }
+            parts.push("...");
+            return;
+          }
+        }
+        penultimateString = H.S(penultimate);
+        ultimateString = H.S(ultimate);
+        $length += ultimateString.length + penultimateString.length + 4;
+      }
+    }
+    if (count > parts.length + 2) {
+      $length += 5;
+      elision = "...";
+    } else
+      elision = null;
+    while (true) {
+      if (!($length > 80 && parts.length > 3))
+        break;
+      if (0 >= parts.length)
+        return H.ioore(parts, 0);
+      $length -= parts.pop().length + 2;
+      if (elision == null) {
+        $length += 5;
+        elision = "...";
+      }
+    }
+    if (elision != null)
+      parts.push(elision);
+    parts.push(penultimateString);
+    parts.push(ultimateString);
+  },
+  LinkedHashMap_LinkedHashMap: function(equals, hashCode, isValidKey, $K, $V) {
+    return H.setRuntimeTypeInfo(new H.JsLinkedHashMap(0, null, null, null, null, null, 0), [$K, $V]);
+  },
+  LinkedHashMap_LinkedHashMap$identity: function($K, $V) {
+    return H.setRuntimeTypeInfo(new P._LinkedIdentityHashMap(0, null, null, null, null, null, 0), [$K, $V]);
+  },
+  LinkedHashSet_LinkedHashSet: function(equals, hashCode, isValidKey, $E) {
+    return H.setRuntimeTypeInfo(new P._LinkedHashSet(0, null, null, null, null, null, 0), [$E]);
+  },
+  Maps_mapToString: function(m) {
+    var t1, result, t2;
+    t1 = {};
+    if (P._isToStringVisiting(m))
+      return "{...}";
+    result = new P.StringBuffer("");
+    try {
+      $.get$_toStringVisiting().push(m);
+      t2 = result;
+      t2._contents = t2.get$_contents() + "{";
+      t1._captured_first_0 = true;
+      J.forEach$1$a(m, new P.Maps_mapToString_closure(t1, result));
+      t1 = result;
+      t1._contents = t1.get$_contents() + "}";
+    } finally {
+      t1 = $.get$_toStringVisiting();
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1.pop();
+    }
+    t1 = result.get$_contents();
+    return t1.charCodeAt(0) == 0 ? t1 : t1;
+  },
+  _LinkedIdentityHashMap: {
+    "^": "JsLinkedHashMap;__js_helper$_length,_strings,_nums,_rest,_first,_last,_modifications",
+    internalComputeHashCode$1: function(key) {
+      return H.objectHashCode(key) & 0x3ffffff;
+    },
+    internalFindBucketIndex$2: function(bucket, key) {
+      var $length, i, t1;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; ++i) {
+        t1 = bucket[i].get$hashMapCellKey();
+        if (t1 == null ? key == null : t1 === key)
+          return i;
+      }
+      return -1;
+    }
+  },
+  _LinkedHashSet: {
+    "^": "_HashSetBase;_collection$_length,_collection$_strings,_collection$_nums,_collection$_rest,_collection$_first,_collection$_last,_collection$_modifications",
+    get$iterator: function(_) {
+      var t1 = new P.LinkedHashSetIterator(this, this._collection$_modifications, null, null);
+      t1._cell = this._collection$_first;
+      return t1;
+    },
+    get$length: function(_) {
+      return this._collection$_length;
+    },
+    contains$1: function(_, object) {
+      var strings, nums;
+      if (typeof object === "string" && object !== "__proto__") {
+        strings = this._collection$_strings;
+        if (strings == null)
+          return false;
+        return strings[object] != null;
+      } else if (typeof object === "number" && (object & 0x3ffffff) === object) {
+        nums = this._collection$_nums;
+        if (nums == null)
+          return false;
+        return nums[object] != null;
+      } else
+        return this._contains$1(object);
+    },
+    _contains$1: function(object) {
+      var rest = this._collection$_rest;
+      if (rest == null)
+        return false;
+      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
+    },
+    lookup$1: function(object) {
+      var t1;
+      if (!(typeof object === "string" && object !== "__proto__"))
+        t1 = typeof object === "number" && (object & 0x3ffffff) === object;
+      else
+        t1 = true;
+      if (t1)
+        return this.contains$1(0, object) ? object : null;
+      else
+        return this._lookup$1(object);
+    },
+    _lookup$1: function(object) {
+      var rest, bucket, index;
+      rest = this._collection$_rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(object)];
+      index = this._findBucketIndex$2(bucket, object);
+      if (index < 0)
+        return;
+      return J.$index$as(bucket, index).get$_element();
+    },
+    forEach$1: function(_, action) {
+      var cell, modifications;
+      cell = this._collection$_first;
+      modifications = this._collection$_modifications;
+      for (; cell != null;) {
+        action.call$1(cell._element);
+        if (modifications !== this._collection$_modifications)
+          throw H.wrapException(new P.ConcurrentModificationError(this));
+        cell = cell._next;
+      }
+    },
+    add$1: function(_, element) {
+      var strings, nums;
+      if (typeof element === "string" && element !== "__proto__") {
+        strings = this._collection$_strings;
+        if (strings == null) {
+          strings = P._LinkedHashSet__newHashTable();
+          this._collection$_strings = strings;
+        }
+        return this._addHashTableEntry$2(strings, element);
+      } else if (typeof element === "number" && (element & 0x3ffffff) === element) {
+        nums = this._collection$_nums;
+        if (nums == null) {
+          nums = P._LinkedHashSet__newHashTable();
+          this._collection$_nums = nums;
+        }
+        return this._addHashTableEntry$2(nums, element);
+      } else
+        return this._add$1(element);
+    },
+    _add$1: function(element) {
+      var rest, hash, bucket;
+      rest = this._collection$_rest;
+      if (rest == null) {
+        rest = P._LinkedHashSet__newHashTable();
+        this._collection$_rest = rest;
+      }
+      hash = this._computeHashCode$1(element);
+      bucket = rest[hash];
+      if (bucket == null)
+        rest[hash] = [this._newLinkedCell$1(element)];
+      else {
+        if (this._findBucketIndex$2(bucket, element) >= 0)
+          return false;
+        bucket.push(this._newLinkedCell$1(element));
+      }
+      return true;
+    },
+    remove$1: function(_, object) {
+      if (typeof object === "string" && object !== "__proto__")
+        return this._collection$_removeHashTableEntry$2(this._collection$_strings, object);
+      else if (typeof object === "number" && (object & 0x3ffffff) === object)
+        return this._collection$_removeHashTableEntry$2(this._collection$_nums, object);
+      else
+        return this._remove$1(object);
+    },
+    _remove$1: function(object) {
+      var rest, bucket, index;
+      rest = this._collection$_rest;
+      if (rest == null)
+        return false;
+      bucket = rest[this._computeHashCode$1(object)];
+      index = this._findBucketIndex$2(bucket, object);
+      if (index < 0)
+        return false;
+      this._collection$_unlinkCell$1(bucket.splice(index, 1)[0]);
+      return true;
+    },
+    clear$0: function(_) {
+      if (this._collection$_length > 0) {
+        this._collection$_last = null;
+        this._collection$_first = null;
+        this._collection$_rest = null;
+        this._collection$_nums = null;
+        this._collection$_strings = null;
+        this._collection$_length = 0;
+        this._collection$_modifications = this._collection$_modifications + 1 & 67108863;
+      }
+    },
+    _addHashTableEntry$2: function(table, element) {
+      if (table[element] != null)
+        return false;
+      table[element] = this._newLinkedCell$1(element);
+      return true;
+    },
+    _collection$_removeHashTableEntry$2: function(table, element) {
+      var cell;
+      if (table == null)
+        return false;
+      cell = table[element];
+      if (cell == null)
+        return false;
+      this._collection$_unlinkCell$1(cell);
+      delete table[element];
+      return true;
+    },
+    _newLinkedCell$1: function(element) {
+      var cell, last;
+      cell = new P.LinkedHashSetCell(element, null, null);
+      if (this._collection$_first == null) {
+        this._collection$_last = cell;
+        this._collection$_first = cell;
+      } else {
+        last = this._collection$_last;
+        cell._previous = last;
+        last._next = cell;
+        this._collection$_last = cell;
+      }
+      ++this._collection$_length;
+      this._collection$_modifications = this._collection$_modifications + 1 & 67108863;
+      return cell;
+    },
+    _collection$_unlinkCell$1: function(cell) {
+      var previous, next;
+      previous = cell.get$_previous();
+      next = cell._next;
+      if (previous == null)
+        this._collection$_first = next;
+      else
+        previous._next = next;
+      if (next == null)
+        this._collection$_last = previous;
+      else
+        next._previous = previous;
+      --this._collection$_length;
+      this._collection$_modifications = this._collection$_modifications + 1 & 67108863;
+    },
+    _computeHashCode$1: function(element) {
+      return J.get$hashCode$(element) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, element) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; ++i)
+        if (J.$eq(bucket[i].get$_element(), element))
+          return i;
+      return -1;
+    },
+    $isEfficientLengthIterable: 1,
+    static: {_LinkedHashSet__newHashTable: function() {
+        var table = Object.create(null);
+        table["<non-identifier-key>"] = table;
+        delete table["<non-identifier-key>"];
+        return table;
+      }}
+  },
+  LinkedHashSetCell: {
+    "^": "Object;_element<,_next,_previous<"
+  },
+  LinkedHashSetIterator: {
+    "^": "Object;_set,_collection$_modifications,_cell,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var t1 = this._set;
+      if (this._collection$_modifications !== t1._collection$_modifications)
+        throw H.wrapException(new P.ConcurrentModificationError(t1));
+      else {
+        t1 = this._cell;
+        if (t1 == null) {
+          this._collection$_current = null;
+          return false;
+        } else {
+          this._collection$_current = t1._element;
+          this._cell = t1._next;
+          return true;
+        }
+      }
+    }
+  },
+  _HashSetBase: {
+    "^": "SetBase;"
+  },
+  Maps_mapToString_closure: {
+    "^": "Closure:8;_collection$_box_0,_captured_result_1",
+    call$2: function(k, v) {
+      var t1, t2;
+      t1 = this._collection$_box_0;
+      if (!t1._captured_first_0)
+        this._captured_result_1._contents += ", ";
+      t1._captured_first_0 = false;
+      t1 = this._captured_result_1;
+      t2 = t1._contents += H.S(k);
+      t1._contents = t2 + ": ";
+      t1._contents += H.S(v);
+    }
+  },
+  ListQueue: {
+    "^": "Iterable;_table,_head,_tail,_modificationCount",
+    get$iterator: function(_) {
+      return new P._ListQueueIterator(this, this._tail, this._modificationCount, this._head, null);
+    },
+    forEach$1: function(_, action) {
+      var modificationCount, i, t1;
+      modificationCount = this._modificationCount;
+      for (i = this._head; i !== this._tail; i = (i + 1 & this._table.length - 1) >>> 0) {
+        t1 = this._table;
+        if (i < 0 || i >= t1.length)
+          return H.ioore(t1, i);
+        action.call$1(t1[i]);
+        if (modificationCount !== this._modificationCount)
+          H.throwExpression(new P.ConcurrentModificationError(this));
+      }
+    },
+    get$isEmpty: function(_) {
+      return this._head === this._tail;
+    },
+    get$length: function(_) {
+      return (this._tail - this._head & this._table.length - 1) >>> 0;
+    },
+    clear$0: function(_) {
+      var i, t1, t2, t3, t4;
+      i = this._head;
+      t1 = this._tail;
+      if (i !== t1) {
+        for (t2 = this._table, t3 = t2.length, t4 = t3 - 1; i !== t1; i = (i + 1 & t4) >>> 0) {
+          if (i < 0 || i >= t3)
+            return H.ioore(t2, i);
+          t2[i] = null;
+        }
+        this._tail = 0;
+        this._head = 0;
+        ++this._modificationCount;
+      }
+    },
+    toString$0: function(_) {
+      return P.IterableBase_iterableToFullString(this, "{", "}");
+    },
+    removeFirst$0: function() {
+      var t1, t2, t3, result;
+      t1 = this._head;
+      if (t1 === this._tail)
+        throw H.wrapException(H.IterableElementError_noElement());
+      ++this._modificationCount;
+      t2 = this._table;
+      t3 = t2.length;
+      if (t1 >= t3)
+        return H.ioore(t2, t1);
+      result = t2[t1];
+      t2[t1] = null;
+      this._head = (t1 + 1 & t3 - 1) >>> 0;
+      return result;
+    },
+    _add$1: function(element) {
+      var t1, t2, t3;
+      t1 = this._table;
+      t2 = this._tail;
+      t3 = t1.length;
+      if (t2 >= t3)
+        return H.ioore(t1, t2);
+      t1[t2] = element;
+      t3 = (t2 + 1 & t3 - 1) >>> 0;
+      this._tail = t3;
+      if (this._head === t3)
+        this._grow$0();
+      ++this._modificationCount;
+    },
+    _grow$0: function() {
+      var t1, newTable, t2, split;
+      t1 = Array(this._table.length * 2);
+      t1.fixed$length = Array;
+      newTable = H.setRuntimeTypeInfo(t1, [H.getTypeArgumentByIndex(this, 0)]);
+      t1 = this._table;
+      t2 = this._head;
+      split = t1.length - t2;
+      C.JSArray_methods.setRange$4(newTable, 0, split, t1, t2);
+      C.JSArray_methods.setRange$4(newTable, split, split + this._head, this._table, 0);
+      this._head = 0;
+      this._tail = this._table.length;
+      this._table = newTable;
+    },
+    ListQueue$1: function(initialCapacity, $E) {
+      var t1 = Array(8);
+      t1.fixed$length = Array;
+      this._table = H.setRuntimeTypeInfo(t1, [$E]);
+    },
+    $isEfficientLengthIterable: 1,
+    static: {ListQueue$: function(initialCapacity, $E) {
+        var t1 = H.setRuntimeTypeInfo(new P.ListQueue(null, 0, 0, 0), [$E]);
+        t1.ListQueue$1(initialCapacity, $E);
+        return t1;
+      }}
+  },
+  _ListQueueIterator: {
+    "^": "Object;_queue,_end,_modificationCount,_position,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var t1, t2, t3;
+      t1 = this._queue;
+      if (this._modificationCount !== t1._modificationCount)
+        H.throwExpression(new P.ConcurrentModificationError(t1));
+      t2 = this._position;
+      if (t2 === this._end) {
+        this._collection$_current = null;
+        return false;
+      }
+      t1 = t1._table;
+      t3 = t1.length;
+      if (t2 >= t3)
+        return H.ioore(t1, t2);
+      this._collection$_current = t1[t2];
+      this._position = (t2 + 1 & t3 - 1) >>> 0;
+      return true;
+    }
+  },
+  SetMixin: {
+    "^": "Object;",
+    map$1: function(_, f) {
+      return H.setRuntimeTypeInfo(new H.EfficientLengthMappedIterable(this, f), [H.getTypeArgumentByIndex(this, 0), null]);
+    },
+    toString$0: function(_) {
+      return P.IterableBase_iterableToFullString(this, "{", "}");
+    },
+    forEach$1: function(_, f) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        f.call$1(t1._collection$_current);
+    },
+    $isEfficientLengthIterable: 1
+  },
+  SetBase: {
+    "^": "SetMixin;"
+  }
+}], ["dart.core", "dart:core",, P, {
+  "^": "",
+  _symbolToString: function(symbol) {
+    return H.Symbol_getName(symbol);
+  },
+  Error_safeToString: function(object) {
+    if (typeof object === "number" || typeof object === "boolean" || null == object)
+      return J.toString$0(object);
+    if (typeof object === "string")
+      return JSON.stringify(object);
+    return P.Error__objectToString(object);
+  },
+  Error__objectToString: function(object) {
+    var t1 = J.getInterceptor(object);
+    if (!!t1.$isClosure)
+      return t1.toString$0(object);
+    return H.Primitives_objectToString(object);
+  },
+  Exception_Exception: function(message) {
+    return new P._ExceptionImplementation(message);
+  },
+  identical: [function(a, b) {
+    return a == null ? b == null : a === b;
+  }, "call$2", "identical$closure", 4, 0, 14],
+  identityHashCode: [function(object) {
+    return H.objectHashCode(object);
+  }, "call$1", "identityHashCode$closure", 2, 0, 15],
+  List_List$from: function(elements, growable, $E) {
+    var list, t1;
+    list = H.setRuntimeTypeInfo([], [$E]);
+    for (t1 = J.get$iterator$a(elements); t1.moveNext$0();)
+      list.push(t1.get$current());
+    if (growable)
+      return list;
+    list.fixed$length = Array;
+    return list;
+  },
+  print: function(object) {
+    var line = H.S(object);
+    H.printString(line);
+  },
+  NoSuchMethodError_toString_closure: {
+    "^": "Closure:9;_core$_box_0,_captured_sb_1",
+    call$2: function(key, value) {
+      this._captured_sb_1._contents += this._core$_box_0._captured_comma_0;
+      P._symbolToString(key);
+    }
+  },
+  bool: {
+    "^": "Object;"
+  },
+  "+bool": 0,
+  $double: {
+    "^": "num;"
+  },
+  "+double": 0,
+  Duration: {
+    "^": "Object;_duration",
+    $add: function(_, other) {
+      return new P.Duration(C.JSInt_methods.$add(this._duration, other.get$_duration()));
+    },
+    $lt: function(_, other) {
+      return C.JSInt_methods.$lt(this._duration, other.get$_duration());
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (!(other instanceof P.Duration))
+        return false;
+      return this._duration === other._duration;
+    },
+    get$hashCode: function(_) {
+      return this._duration & 0x1FFFFFFF;
+    },
+    toString$0: function(_) {
+      var t1, t2, twoDigitMinutes, twoDigitSeconds, sixDigitUs;
+      t1 = new P.Duration_toString_twoDigits();
+      t2 = this._duration;
+      if (t2 < 0)
+        return "-" + new P.Duration(-t2).toString$0(0);
+      twoDigitMinutes = t1.call$1(C.JSInt_methods.remainder$1(C.JSInt_methods._tdivFast$1(t2, 60000000), 60));
+      twoDigitSeconds = t1.call$1(C.JSInt_methods.remainder$1(C.JSInt_methods._tdivFast$1(t2, 1000000), 60));
+      sixDigitUs = new P.Duration_toString_sixDigits().call$1(C.JSInt_methods.remainder$1(t2, 1000000));
+      return "" + C.JSInt_methods._tdivFast$1(t2, 3600000000) + ":" + H.S(twoDigitMinutes) + ":" + H.S(twoDigitSeconds) + "." + H.S(sixDigitUs);
+    }
+  },
+  Duration_toString_sixDigits: {
+    "^": "Closure:10;",
+    call$1: function(n) {
+      if (n >= 100000)
+        return "" + n;
+      if (n >= 10000)
+        return "0" + n;
+      if (n >= 1000)
+        return "00" + n;
+      if (n >= 100)
+        return "000" + n;
+      if (n >= 10)
+        return "0000" + n;
+      return "00000" + n;
+    }
+  },
+  Duration_toString_twoDigits: {
+    "^": "Closure:10;",
+    call$1: function(n) {
+      if (n >= 10)
+        return "" + n;
+      return "0" + n;
+    }
+  },
+  Error: {
+    "^": "Object;",
+    get$stackTrace: function() {
+      return H.getTraceFromException(this.$thrownJsError);
+    }
+  },
+  NullThrownError: {
+    "^": "Error;",
+    toString$0: function(_) {
+      return "Throw of null.";
+    }
+  },
+  ArgumentError: {
+    "^": "Error;_hasValue,invalidValue,name,message",
+    get$_errorName: function() {
+      return "Invalid argument" + (!this._hasValue ? "(s)" : "");
+    },
+    get$_errorExplanation: function() {
+      return "";
+    },
+    toString$0: function(_) {
+      var t1, nameString, message, prefix, explanation, errorValue;
+      t1 = this.name;
+      nameString = t1 != null ? " (" + H.S(t1) + ")" : "";
+      t1 = this.message;
+      message = t1 == null ? "" : ": " + H.S(t1);
+      prefix = this.get$_errorName() + nameString + message;
+      if (!this._hasValue)
+        return prefix;
+      explanation = this.get$_errorExplanation();
+      errorValue = P.Error_safeToString(this.invalidValue);
+      return prefix + explanation + ": " + H.S(errorValue);
+    },
+    static: {ArgumentError$: function(message) {
+        return new P.ArgumentError(false, null, null, message);
+      }}
+  },
+  RangeError: {
+    "^": "ArgumentError;start,end,_hasValue,invalidValue,name,message",
+    get$_errorName: function() {
+      return "RangeError";
+    },
+    get$_errorExplanation: function() {
+      var t1, explanation, t2;
+      t1 = this.start;
+      if (t1 == null) {
+        t1 = this.end;
+        explanation = t1 != null ? ": Not less than or equal to " + H.S(t1) : "";
+      } else {
+        t2 = this.end;
+        if (t2 == null)
+          explanation = ": Not greater than or equal to " + H.S(t1);
+        else {
+          if (typeof t2 !== "number")
+            return t2.$gt();
+          if (typeof t1 !== "number")
+            return H.iae(t1);
+          if (t2 > t1)
+            explanation = ": Not in range " + t1 + ".." + t2 + ", inclusive";
+          else
+            explanation = t2 < t1 ? ": Valid value range is empty" : ": Only valid value is " + t1;
+        }
+      }
+      return explanation;
+    },
+    static: {RangeError$value: function(value, $name, message) {
+        return new P.RangeError(null, null, true, value, $name, "Value not in range");
+      }, RangeError$range: function(invalidValue, minValue, maxValue, $name, message) {
+        return new P.RangeError(minValue, maxValue, true, invalidValue, $name, "Invalid value");
+      }, RangeError_checkValidRange: function(start, end, $length, startName, endName, message) {
+        if (0 > start || start > $length)
+          throw H.wrapException(P.RangeError$range(start, 0, $length, "start", message));
+        if (start > end || end > $length)
+          throw H.wrapException(P.RangeError$range(end, start, $length, "end", message));
+        return end;
+      }}
+  },
+  IndexError: {
+    "^": "ArgumentError;indexable,length>,_hasValue,invalidValue,name,message",
+    get$_errorName: function() {
+      return "RangeError";
+    },
+    get$_errorExplanation: function() {
+      P.Error_safeToString(this.indexable);
+      var explanation = ": index should be less than " + H.S(this.length);
+      return J.$lt$n(this.invalidValue, 0) ? ": index must not be negative" : explanation;
+    },
+    static: {IndexError$: function(invalidValue, indexable, $name, message, $length) {
+        var t1 = $length != null ? $length : J.get$length$as(indexable);
+        return new P.IndexError(indexable, t1, true, invalidValue, $name, "Index out of range");
+      }}
+  },
+  UnsupportedError: {
+    "^": "Error;message",
+    toString$0: function(_) {
+      return "Unsupported operation: " + this.message;
+    }
+  },
+  StateError: {
+    "^": "Error;message",
+    toString$0: function(_) {
+      return "Bad state: " + this.message;
+    }
+  },
+  ConcurrentModificationError: {
+    "^": "Error;modifiedObject",
+    toString$0: function(_) {
+      var t1 = this.modifiedObject;
+      if (t1 == null)
+        return "Concurrent modification during iteration.";
+      return "Concurrent modification during iteration: " + H.S(P.Error_safeToString(t1)) + ".";
+    }
+  },
+  StackOverflowError: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "Stack Overflow";
+    },
+    get$stackTrace: function() {
+      return;
+    },
+    $isError: 1
+  },
+  CyclicInitializationError: {
+    "^": "Error;variableName",
+    toString$0: function(_) {
+      return "Reading static variable '" + this.variableName + "' during its initialization";
+    }
+  },
+  _ExceptionImplementation: {
+    "^": "Object;message",
+    toString$0: function(_) {
+      var t1 = this.message;
+      if (t1 == null)
+        return "Exception";
+      return "Exception: " + H.S(t1);
+    }
+  },
+  Expando: {
+    "^": "Object;name",
+    toString$0: function(_) {
+      return "Expando:" + H.S(this.name);
+    },
+    $index: function(_, object) {
+      var values = H.Primitives_getProperty(object, "expando$values");
+      return values == null ? null : H.Primitives_getProperty(values, this._getKey$0());
+    },
+    $indexSet: function(_, object, value) {
+      var values = H.Primitives_getProperty(object, "expando$values");
+      if (values == null) {
+        values = new P.Object();
+        H.Primitives_setProperty(object, "expando$values", values);
+      }
+      H.Primitives_setProperty(values, this._getKey$0(), value);
+    },
+    _getKey$0: function() {
+      var key, t1;
+      key = H.Primitives_getProperty(this, "expando$key");
+      if (key == null) {
+        t1 = $.Expando__keyCount;
+        $.Expando__keyCount = t1 + 1;
+        key = "expando$key$" + t1;
+        H.Primitives_setProperty(this, "expando$key", key);
+      }
+      return key;
+    }
+  },
+  $int: {
+    "^": "num;"
+  },
+  "+int": 0,
+  Iterable: {
+    "^": "Object;",
+    map$1: function(_, f) {
+      return H.MappedIterable_MappedIterable(this, f, H.getRuntimeTypeArgument(this, "Iterable", 0), null);
+    },
+    forEach$1: function(_, f) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        f.call$1(t1.get$current());
+    },
+    toList$1$growable: function(_, growable) {
+      return P.List_List$from(this, growable, H.getRuntimeTypeArgument(this, "Iterable", 0));
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    get$length: function(_) {
+      var it, count;
+      it = this.get$iterator(this);
+      for (count = 0; it.moveNext$0();)
+        ++count;
+      return count;
+    },
+    elementAt$1: function(_, index) {
+      var t1, elementIndex, element;
+      if (index < 0)
+        H.throwExpression(P.RangeError$range(index, 0, null, "index", null));
+      for (t1 = this.get$iterator(this), elementIndex = 0; t1.moveNext$0();) {
+        element = t1.get$current();
+        if (index === elementIndex)
+          return element;
+        ++elementIndex;
+      }
+      throw H.wrapException(P.IndexError$(index, this, "index", null, elementIndex));
+    },
+    toString$0: function(_) {
+      return P.IterableBase_iterableToShortString(this, "(", ")");
+    }
+  },
+  Iterator: {
+    "^": "Object;"
+  },
+  List: {
+    "^": "Object;",
+    $isEfficientLengthIterable: 1
+  },
+  "+List": 0,
+  Null: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "null";
+    }
+  },
+  "+Null": 0,
+  num: {
+    "^": "Object;"
+  },
+  "+num": 0,
+  Object: {
+    "^": ";",
+    $eq: function(_, other) {
+      return this === other;
+    },
+    get$hashCode: function(_) {
+      return H.Primitives_objectHashCode(this);
+    },
+    toString$0: function(_) {
+      return H.Primitives_objectToString(this);
+    }
+  },
+  StackTrace: {
+    "^": "Object;"
+  },
+  String: {
+    "^": "Object;"
+  },
+  "+String": 0,
+  StringBuffer: {
+    "^": "Object;_contents<",
+    get$length: function(_) {
+      return this._contents.length;
+    },
+    toString$0: function(_) {
+      var t1 = this._contents;
+      return t1.charCodeAt(0) == 0 ? t1 : t1;
+    },
+    static: {StringBuffer__writeAll: function(string, objects, separator) {
+        var iterator = J.get$iterator$a(objects);
+        if (!iterator.moveNext$0())
+          return string;
+        if (separator.length === 0) {
+          do
+            string += H.S(iterator.get$current());
+          while (iterator.moveNext$0());
+        } else {
+          string += H.S(iterator.get$current());
+          for (; iterator.moveNext$0();)
+            string = string + separator + H.S(iterator.get$current());
+        }
+        return string;
+      }}
+  },
+  Symbol: {
+    "^": "Object;"
+  }
+}], ["dart.isolate", "dart:isolate",, P, {
+  "^": "",
+  Capability: {
+    "^": "Object;"
+  }
+}], ["dart2js._js_primitives", "dart:_js_primitives",, H, {
+  "^": "",
+  printString: function(string) {
+    if (typeof dartPrint == "function") {
+      dartPrint(string);
+      return;
+    }
+    if (typeof console == "object" && typeof console.log != "undefined") {
+      console.log(string);
+      return;
+    }
+    if (typeof window == "object")
+      return;
+    if (typeof print == "function") {
+      print(string);
+      return;
+    }
+    throw "Unable to print message: " + String(string);
+  }
+}], ["", "test.dart",, V, {
+  "^": "",
+  main: [function() {
+    var $goto = 0, completer = new P.Completer_Completer(), $returnValue, handler = 2, currentError;
+    function main(errorCode, result) {
+      if (errorCode === 1) {
+        currentError = result;
+        $goto = handler;
+      }
+      while (true)
+        switch ($goto) {
+          case 0:
+            // Function start
+            // goto return
+            $goto = 1;
+            break;
+          case 1:
+            // return
+            return H.asyncHelper($returnValue, 0, completer, null);
+          case 2:
+            // rethrow
+            return H.asyncHelper(currentError, 1, completer);
+        }
+    }
+    return H.asyncHelper(null, main, completer, null);
+  }, "call$0", "main$closure", 0, 0, 16]
+}, 1]];
+setupProgram(dart, 0);
+// getInterceptor methods
+J.getInterceptor = function(receiver) {
+  if (typeof receiver == "number") {
+    if (Math.floor(receiver) == receiver)
+      return J.JSInt.prototype;
+    return J.JSDouble.prototype;
+  }
+  if (typeof receiver == "string")
+    return J.JSString.prototype;
+  if (receiver == null)
+    return J.JSNull.prototype;
+  if (typeof receiver == "boolean")
+    return J.JSBool.prototype;
+  if (receiver.constructor == Array)
+    return J.JSArray.prototype;
+  if (!(receiver instanceof P.Object))
+    return J.UnknownJavaScriptObject.prototype;
+  return receiver;
+};
+J.getInterceptor$a = function(receiver) {
+  if (receiver == null)
+    return receiver;
+  if (receiver.constructor == Array)
+    return J.JSArray.prototype;
+  if (!(receiver instanceof P.Object))
+    return J.UnknownJavaScriptObject.prototype;
+  return receiver;
+};
+J.getInterceptor$as = function(receiver) {
+  if (typeof receiver == "string")
+    return J.JSString.prototype;
+  if (receiver == null)
+    return receiver;
+  if (receiver.constructor == Array)
+    return J.JSArray.prototype;
+  if (!(receiver instanceof P.Object))
+    return J.UnknownJavaScriptObject.prototype;
+  return receiver;
+};
+J.getInterceptor$n = function(receiver) {
+  if (typeof receiver == "number")
+    return J.JSNumber.prototype;
+  if (receiver == null)
+    return receiver;
+  if (!(receiver instanceof P.Object))
+    return J.UnknownJavaScriptObject.prototype;
+  return receiver;
+};
+J.getInterceptor$ns = function(receiver) {
+  if (typeof receiver == "number")
+    return J.JSNumber.prototype;
+  if (typeof receiver == "string")
+    return J.JSString.prototype;
+  if (receiver == null)
+    return receiver;
+  if (!(receiver instanceof P.Object))
+    return J.UnknownJavaScriptObject.prototype;
+  return receiver;
+};
+J.$add$ns = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver + a0;
+  return J.getInterceptor$ns(receiver).$add(receiver, a0);
+};
+J.$eq = function(receiver, a0) {
+  if (receiver == null)
+    return a0 == null;
+  if (typeof receiver != "object")
+    return a0 != null && receiver === a0;
+  return J.getInterceptor(receiver).$eq(receiver, a0);
+};
+J.$index$as = function(receiver, a0) {
+  if (receiver.constructor == Array || typeof receiver == "string")
+    if (a0 >>> 0 === a0 && a0 < receiver.length)
+      return receiver[a0];
+  return J.getInterceptor$as(receiver).$index(receiver, a0);
+};
+J.$lt$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver < a0;
+  return J.getInterceptor$n(receiver).$lt(receiver, a0);
+};
+J.elementAt$1$a = function(receiver, a0) {
+  return J.getInterceptor$a(receiver).elementAt$1(receiver, a0);
+};
+J.forEach$1$a = function(receiver, a0) {
+  return J.getInterceptor$a(receiver).forEach$1(receiver, a0);
+};
+J.get$hashCode$ = function(receiver) {
+  return J.getInterceptor(receiver).get$hashCode(receiver);
+};
+J.get$iterator$a = function(receiver) {
+  return J.getInterceptor$a(receiver).get$iterator(receiver);
+};
+J.get$length$as = function(receiver) {
+  return J.getInterceptor$as(receiver).get$length(receiver);
+};
+J.map$1$a = function(receiver, a0) {
+  return J.getInterceptor$a(receiver).map$1(receiver, a0);
+};
+J.toString$0 = function(receiver) {
+  return J.getInterceptor(receiver).toString$0(receiver);
+};
+C.JSArray_methods = J.JSArray.prototype;
+C.JSInt_methods = J.JSInt.prototype;
+C.JSString_methods = J.JSString.prototype;
+C.C_DynamicRuntimeType = new H.DynamicRuntimeType();
+C.C__RootZone = new P._RootZone();
+C.Duration_0 = new P.Duration(0);
+C.JS_CONST_8ZY = function getTagFallback(o) {
+  var constructor = o.constructor;
+  if (typeof constructor == "function") {
+    var name = constructor.name;
+    if (typeof name == "string" &&
+        name.length > 2 &&
+        name !== "Object" &&
+        name !== "Function.prototype") {
+      return name;
+    }
+  }
+  var s = Object.prototype.toString.call(o);
+  return s.substring(8, s.length - 1);
+};
+{
+  init.isHunkLoaded = function(hunkHash) {
+    return !!$dart_deferred_initializers[hunkHash];
+  };
+  init.deferredInitialized = new Object(null);
+  init.isHunkInitialized = function(hunkHash) {
+    return init.deferredInitialized[hunkHash];
+  };
+  init.initializeLoadedHunk = function(hunkHash) {
+    $dart_deferred_initializers[hunkHash](globalsHolder, $);
+    init.deferredInitialized[hunkHash] = true;
+  };
+}
+init.deferredLibraryUris = {};
+init.deferredLibraryHashes = {};
+$.Primitives_mirrorFunctionCacheName = "$cachedFunction";
+$.Primitives_mirrorInvokeCacheName = "$cachedInvocation";
+$.Closure_functionCounter = 0;
+$.BoundClosure_selfFieldNameCache = null;
+$.BoundClosure_receiverFieldNameCache = null;
+$._nextCallback = null;
+$._lastCallback = null;
+$._lastPriorityCallback = null;
+$._isInCallbackLoop = false;
+$.Zone__current = C.C__RootZone;
+$.Expando__keyCount = 0;
+(function(lazies) {
+  var descriptorLength = 4;
+  for (var i = 0; i < lazies.length; i += descriptorLength) {
+    var fieldName = lazies[i];
+    var getterName = lazies[i + 1];
+    var lazyValue = lazies[i + 2];
+    var staticName = lazies[i + 3];
+    Isolate.$lazy(fieldName, getterName, lazyValue, staticName);
+  }
+})(["IsolateNatives_thisScript", "get$IsolateNatives_thisScript", function() {
+  return H.IsolateNatives_computeThisScript();
+}, "thisScript", "IsolateNatives_workerIds", "get$IsolateNatives_workerIds", function() {
+  return new P.Expando(null);
+}, "workerIds", "TypeErrorDecoder_noSuchMethodPattern", "get$TypeErrorDecoder_noSuchMethodPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({toString: function() {
+      return "$receiver$";
+    }}));
+}, "noSuchMethodPattern", "TypeErrorDecoder_notClosurePattern", "get$TypeErrorDecoder_notClosurePattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({$method$: null, toString: function() {
+      return "$receiver$";
+    }}));
+}, "notClosurePattern", "TypeErrorDecoder_nullCallPattern", "get$TypeErrorDecoder_nullCallPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn(null));
+}, "nullCallPattern", "TypeErrorDecoder_nullLiteralCallPattern", "get$TypeErrorDecoder_nullLiteralCallPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(function() {
+    var $argumentsExpr$ = '$arguments$';
+    try {
+      null.$method$($argumentsExpr$);
+    } catch (e) {
+      return e.message;
+    }
+  }());
+}, "nullLiteralCallPattern", "TypeErrorDecoder_undefinedCallPattern", "get$TypeErrorDecoder_undefinedCallPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn(void 0));
+}, "undefinedCallPattern", "TypeErrorDecoder_undefinedLiteralCallPattern", "get$TypeErrorDecoder_undefinedLiteralCallPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(function() {
+    var $argumentsExpr$ = '$arguments$';
+    try {
+      (void 0).$method$($argumentsExpr$);
+    } catch (e) {
+      return e.message;
+    }
+  }());
+}, "undefinedLiteralCallPattern", "TypeErrorDecoder_nullPropertyPattern", "get$TypeErrorDecoder_nullPropertyPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokePropertyErrorOn(null));
+}, "nullPropertyPattern", "TypeErrorDecoder_nullLiteralPropertyPattern", "get$TypeErrorDecoder_nullLiteralPropertyPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(function() {
+    try {
+      null.$method$;
+    } catch (e) {
+      return e.message;
+    }
+  }());
+}, "nullLiteralPropertyPattern", "TypeErrorDecoder_undefinedPropertyPattern", "get$TypeErrorDecoder_undefinedPropertyPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokePropertyErrorOn(void 0));
+}, "undefinedPropertyPattern", "TypeErrorDecoder_undefinedLiteralPropertyPattern", "get$TypeErrorDecoder_undefinedLiteralPropertyPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(function() {
+    try {
+      (void 0).$method$;
+    } catch (e) {
+      return e.message;
+    }
+  }());
+}, "undefinedLiteralPropertyPattern", "_AsyncRun_scheduleImmediateClosure", "get$_AsyncRun_scheduleImmediateClosure", function() {
+  return P._AsyncRun__initializeScheduleImmediate();
+}, "scheduleImmediateClosure", "_toStringVisiting", "get$_toStringVisiting", function() {
+  return [];
+}, "_toStringVisiting"]);
+;
+
+{
+  init.metadata = [null];
+  init.types = [{func: 1}, {func: 1, void: true}, {func: 1, args: [,]}, {func: 1, args: [, P.StackTrace]}, {func: 1, args: [{func: 1, void: true}]}, {func: 1, args: [,], opt: [,]}, {func: 1, ret: P.bool}, {func: 1, void: true, args: [P.Object], opt: [P.StackTrace]}, {func: 1, args: [,,]}, {func: 1, args: [P.Symbol,,]}, {func: 1, ret: P.String, args: [P.$int]}, {func: 1, void: true, args: [{func: 1, void: true}]}, {func: 1, ret: P.bool, args: [,,]}, {func: 1, ret: P.$int, args: [,]}, {func: 1, ret: P.bool, args: [P.Object, P.Object]}, {func: 1, ret: P.$int, args: [P.Object]}, {func: 1, ret: P.Future}];
+}
+
+$ = null;
+Isolate = Isolate.$finishIsolateConstructor(Isolate);
+$ = new Isolate();
+function convertToFastObject(properties) {
+  function MyClass() {
+  }
+  MyClass.prototype = properties;
+  new MyClass();
+  return properties;
+}
+;
+function convertToSlowObject(properties) {
+  properties.__MAGIC_SLOW_PROPERTY = 1;
+  delete properties.__MAGIC_SLOW_PROPERTY;
+  return properties;
+}
+;
+A = convertToFastObject(A);
+B = convertToFastObject(B);
+C = convertToFastObject(C);
+D = convertToFastObject(D);
+E = convertToFastObject(E);
+F = convertToFastObject(F);
+G = convertToFastObject(G);
+H = convertToFastObject(H);
+J = convertToFastObject(J);
+K = convertToFastObject(K);
+L = convertToFastObject(L);
+M = convertToFastObject(M);
+N = convertToFastObject(N);
+O = convertToFastObject(O);
+P = convertToFastObject(P);
+Q = convertToFastObject(Q);
+R = convertToFastObject(R);
+S = convertToFastObject(S);
+T = convertToFastObject(T);
+U = convertToFastObject(U);
+V = convertToFastObject(V);
+W = convertToFastObject(W);
+X = convertToFastObject(X);
+Y = convertToFastObject(Y);
+Z = convertToFastObject(Z);
+function init() {
+  Isolate.$isolateProperties = Object.create(null);
+  init.allClasses = Object.create(null);
+  init.getTypeFromName = function(name) {
+    return init.allClasses[name];
+  };
+  init.interceptorsByTag = Object.create(null);
+  init.leafTags = Object.create(null);
+  init.finishedClasses = Object.create(null);
+  Isolate.$lazy = function(fieldName, getterName, lazyValue, staticName, prototype) {
+    if (!init.lazies)
+      init.lazies = Object.create(null);
+    init.lazies[fieldName] = getterName;
+    prototype = prototype || Isolate.$isolateProperties;
+    var sentinelUndefined = {};
+    var sentinelInProgress = {};
+    prototype[fieldName] = sentinelUndefined;
+    prototype[getterName] = function() {
+      var result = this[fieldName];
+      try {
+        if (result === sentinelUndefined) {
+          this[fieldName] = sentinelInProgress;
+          try {
+            result = this[fieldName] = lazyValue();
+          } finally {
+            if (result === sentinelUndefined)
+              this[fieldName] = null;
+          }
+        } else
+          if (result === sentinelInProgress)
+            H.throwCyclicInit(staticName || fieldName);
+        return result;
+      } finally {
+        this[getterName] = function() {
+          return this[fieldName];
+        };
+      }
+    };
+  };
+  Isolate.$finishIsolateConstructor = function(oldIsolate) {
+    var isolateProperties = oldIsolate.$isolateProperties;
+    function Isolate() {
+      var staticNames = Object.keys(isolateProperties);
+      for (var i = 0; i < staticNames.length; i++) {
+        var staticName = staticNames[i];
+        this[staticName] = isolateProperties[staticName];
+      }
+      var lazies = init.lazies;
+      var lazyInitializers = lazies ? Object.keys(lazies) : [];
+      for (var i = 0; i < lazyInitializers.length; i++)
+        this[lazies[lazyInitializers[i]]] = null;
+      function ForceEfficientMap() {
+      }
+      ForceEfficientMap.prototype = this;
+      new ForceEfficientMap();
+      for (var i = 0; i < lazyInitializers.length; i++) {
+        var lazyInitName = lazies[lazyInitializers[i]];
+        this[lazyInitName] = isolateProperties[lazyInitName];
+      }
+    }
+    Isolate.prototype = oldIsolate.prototype;
+    Isolate.prototype.constructor = Isolate;
+    Isolate.$isolateProperties = isolateProperties;
+    return Isolate;
+  };
+}
+;// BEGIN invoke [main].
+(function(callback) {
+  if (typeof document === "undefined") {
+    callback(null);
+    return;
+  }
+  if (document.currentScript) {
+    callback(document.currentScript);
+    return;
+  }
+  var scripts = document.scripts;
+  function onLoad(event) {
+    for (var i = 0; i < scripts.length; ++i)
+      scripts[i].removeEventListener("load", onLoad, false);
+    callback(event.target);
+  }
+  for (var i = 0; i < scripts.length; ++i)
+    scripts[i].addEventListener("load", onLoad, false);
+})(function(currentScript) {
+  init.currentScript = currentScript;
+  if (typeof dartMainRunner === "function")
+    dartMainRunner(function(a) {
+      H.startRootIsolate(V.main$closure(), a);
+    }, []);
+  else
+    (function(a) {
+      H.startRootIsolate(V.main$closure(), a);
+    })([]);
+});
+;
+// END invoke [main].
+})()
+
+//# sourceMappingURL=out.js.map
diff --git a/mojo/public/dart/third_party/unittest/pubspec.yaml b/mojo/public/dart/third_party/unittest/pubspec.yaml
new file mode 100644
index 0000000..0f971d2
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/pubspec.yaml
@@ -0,0 +1,11 @@
+name: unittest
+version: 0.11.6+1
+author: Dart Team <misc@dartlang.org>
+description: A library for writing dart unit tests.
+homepage: https://github.com/dart-lang/old_unittest
+environment:
+  sdk: '>=1.0.0 <2.0.0'
+dependencies:
+  stack_trace: '>=0.9.0 <2.0.0'
+dev_dependencies:
+  metatest: '>=0.1.0 <0.2.0'
diff --git a/mojo/public/dart/third_party/unittest/test.dart b/mojo/public/dart/third_party/unittest/test.dart
new file mode 100644
index 0000000..f1bc9a8
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test.dart
@@ -0,0 +1,15 @@
+import 'dart:async';
+
+main() async {
+  try {
+    try {
+      await new Future.error('error');
+    } catch (error) {
+      print("caught once");
+      throw 'error';
+    }
+  } catch (error) {
+    print("caught twice");
+    throw 'error';
+  }
+}
diff --git a/mojo/public/dart/third_party/unittest/test/async_exception_test.dart b/mojo/public/dart/third_party/unittest/test/async_exception_test.dart
new file mode 100644
index 0000000..d81e7de
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/async_exception_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.async_exception_test;
+
+import 'dart:async';
+
+import 'package:metatest/metatest.dart';
+import 'package:unittest/unittest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestsFail('async errors cause tests to fail', () {
+    test('async', () {
+      expectAsync(() {});
+      new Future(() {
+        throw "an error!";
+      });
+    });
+
+    test('sync', () {
+      expectAsync(() {});
+      new Future(() {
+        throw "an error!";
+      });
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/async_exception_with_future_test.dart b/mojo/public/dart/third_party/unittest/test/async_exception_with_future_test.dart
new file mode 100644
index 0000000..c5c445e
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/async_exception_with_future_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.async_exception_with_future_test;
+
+import 'dart:async';
+
+import 'package:metatest/metatest.dart';
+import 'package:unittest/unittest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestResults('async exception with future test', () {
+    var tearDownHappened = false;
+
+    tearDown(() {
+      tearDownHappened = true;
+    });
+
+    test('test', () {
+      expect(tearDownHappened, isFalse);
+      // The "throw" statement below should terminate the test immediately.
+      // The framework should not wait for the future to complete.
+      // tearDown should still execute.
+      new Future.sync(() {
+        throw "error!";
+      });
+      return new Completer().future;
+    });
+
+    test('follow up', () {
+      expect(tearDownHappened, isTrue);
+    });
+  }, [
+    {'description': 'test', 'message': 'Caught error!', 'result': 'fail',},
+    {'description': 'follow up', 'result': 'pass',}
+  ]);
+}
diff --git a/mojo/public/dart/third_party/unittest/test/async_setup_teardown_test.dart b/mojo/public/dart/third_party/unittest/test/async_setup_teardown_test.dart
new file mode 100644
index 0000000..1068ee7
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/async_setup_teardown_test.dart
@@ -0,0 +1,71 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.async_setup_teardown;
+
+import 'dart:async';
+
+import 'package:metatest/metatest.dart';
+import 'package:unittest/unittest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestsPass('good setup/good teardown', () {
+    setUp(() {
+      return new Future.value(0);
+    });
+    tearDown(() {
+      return new Future.value(0);
+    });
+    test('foo1', () {});
+  });
+
+  expectTestResults('good setup/bad teardown', () {
+    setUp(() {
+      return new Future.value(0);
+    });
+    tearDown(() {
+      return new Future.error("Failed to complete tearDown");
+    });
+    test('foo2', () {});
+  }, [
+    {
+      'result': 'error',
+      'message': 'Teardown failed: Caught Failed to complete tearDown'
+    }
+  ]);
+
+  expectTestResults('bad setup/good teardown', () {
+    setUp(() {
+      return new Future.error("Failed to complete setUp");
+    });
+    tearDown(() {
+      return new Future.value(0);
+    });
+    test('foo3', () {});
+  }, [
+    {
+      'result': 'error',
+      'message': 'Setup failed: Caught Failed to complete setUp'
+    }
+  ]);
+
+  expectTestResults('bad setup/bad teardown', () {
+    setUp(() {
+      return new Future.error("Failed to complete setUp");
+    });
+    tearDown(() {
+      return new Future.error("Failed to complete tearDown");
+    });
+    test('foo4', () {});
+  }, [
+    {
+      'result': 'error',
+      'message': 'Setup failed: Caught Failed to complete setUp'
+    }
+  ]);
+}
diff --git a/mojo/public/dart/third_party/unittest/test/breath_test.dart b/mojo/public/dart/third_party/unittest/test/breath_test.dart
new file mode 100644
index 0000000..244d2d2
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/breath_test.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.breath_test;
+
+import 'dart:async';
+
+import 'package:unittest/unittest.dart';
+
+void main() {
+  // Test the sync test 'breath' feature of unittest.
+
+  // We use the testStartStopwatch to determine if the 'starve'
+  // test was executed within a small enough time interval from
+  // the first test that we are guaranteed the second test is
+  // running in a microtask. If the second test is running as a
+  // microtask we are guaranteed the timer scheduled in the
+  // first test has not been run yet.
+  var testStartStopwatch = new Stopwatch()..start();
+
+  group('breath', () {
+    var sentinel = 0;
+
+    test('initial', () {
+      Timer.run(() {
+        sentinel = 1;
+      });
+    });
+
+    test('starve', () {
+      // If less than BREATH_INTERVAL time has passed since before
+      // we started the test group then the previous test's timer
+      // has not been run (at least this is what we are testing).
+      if (testStartStopwatch.elapsed.inMilliseconds <= BREATH_INTERVAL) {
+        expect(sentinel, 0);
+      }
+
+      // Next we wait for at least BREATH_INTERVAL to guaranteed the
+      // next (third) test is run using a timer which means it will
+      // run after the timer scheduled in the first test and hence
+      // the sentinel should have been set to 1.
+      var sw = new Stopwatch()..start();
+      while (sw.elapsed.inMilliseconds < BREATH_INTERVAL);
+    });
+
+    test('breathed', () {
+      expect(sentinel, 1);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/completion_test.dart b/mojo/public/dart/third_party/unittest/test/completion_test.dart
new file mode 100644
index 0000000..6803e68
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/completion_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.completion_test;
+
+import 'dart:async';
+
+import 'package:metatest/metatest.dart';
+import 'package:unittest/unittest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestsPass('completion test', () {
+    var count = 0;
+    test('test', () {
+      var _callback;
+      _callback = expectAsyncUntil(() {
+        if (++count < 10) {
+          new Future.sync(_callback);
+        }
+      }, () => (count == 10));
+      new Future.sync(_callback);
+    });
+
+    test('verify count', () {
+      expect(count, 10);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/core_matchers_test.dart b/mojo/public/dart/third_party/unittest/test/core_matchers_test.dart
new file mode 100644
index 0000000..3e16882
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/core_matchers_test.dart
@@ -0,0 +1,191 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.core_matchers_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'test_utils.dart';
+
+void main() {
+  initUtils();
+
+  test('isTrue', () {
+    shouldPass(true, isTrue);
+    shouldFail(false, isTrue, "Expected: true Actual: <false>");
+  });
+
+  test('isFalse', () {
+    shouldPass(false, isFalse);
+    shouldFail(10, isFalse, "Expected: false Actual: <10>");
+    shouldFail(true, isFalse, "Expected: false Actual: <true>");
+  });
+
+  test('isNull', () {
+    shouldPass(null, isNull);
+    shouldFail(false, isNull, "Expected: null Actual: <false>");
+  });
+
+  test('isNotNull', () {
+    shouldPass(false, isNotNull);
+    shouldFail(null, isNotNull, "Expected: not null Actual: <null>");
+  });
+
+  test('isNaN', () {
+    shouldPass(double.NAN, isNaN);
+    shouldFail(3.1, isNaN, "Expected: NaN Actual: <3.1>");
+  });
+
+  test('isNotNaN', () {
+    shouldPass(3.1, isNotNaN);
+    shouldFail(double.NAN, isNotNaN, "Expected: not NaN Actual: <NaN>");
+  });
+
+  test('same', () {
+    var a = new Map();
+    var b = new Map();
+    shouldPass(a, same(a));
+    shouldFail(b, same(a), "Expected: same instance as {} Actual: {}");
+  });
+
+  test('equals', () {
+    var a = new Map();
+    var b = new Map();
+    shouldPass(a, equals(a));
+    shouldPass(a, equals(b));
+  });
+
+  test('equals with a set', () {
+    var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
+    var set1 = numbers.toSet();
+    numbers.shuffle();
+    var set2 = numbers.toSet();
+
+    shouldPass(set2, equals(set1));
+    shouldPass(numbers, equals(set1));
+    shouldFail([
+      1,
+      2,
+      3,
+      4,
+      5,
+      6,
+      7,
+      8,
+      9
+    ], equals(set1), matches(r"Expected: .*:\[1, 2, 3, 4, 5, 6, 7, 8, 9, 10\]"
+        r"  Actual: \[1, 2, 3, 4, 5, 6, 7, 8, 9\]"
+        r"   Which: does not contain 10"));
+    shouldFail([
+      1,
+      2,
+      3,
+      4,
+      5,
+      6,
+      7,
+      8,
+      9,
+      10,
+      11
+    ], equals(set1), matches(r"Expected: .*:\[1, 2, 3, 4, 5, 6, 7, 8, 9, 10\]"
+        r"  Actual: \[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11\]"
+        r"   Which: larger than expected"));
+  });
+
+  test('anything', () {
+    var a = new Map();
+    shouldPass(0, anything);
+    shouldPass(null, anything);
+    shouldPass(a, anything);
+    shouldFail(a, isNot(anything), "Expected: not anything Actual: {}");
+  });
+
+  test('returnsNormally', () {
+    shouldPass(doesNotThrow, returnsNormally);
+    shouldFail(doesThrow, returnsNormally, matches(r"Expected: return normally"
+        r"  Actual: <Closure(: \(\) => dynamic "
+        r"from Function 'doesThrow': static\.)?>"
+        r"   Which: threw 'X'"));
+  });
+
+  test('hasLength', () {
+    var a = new Map();
+    var b = new List();
+    shouldPass(a, hasLength(0));
+    shouldPass(b, hasLength(0));
+    shouldPass('a', hasLength(1));
+    shouldFail(0, hasLength(0), new PrefixMatcher(
+        "Expected: an object with length of <0> "
+        "Actual: <0> "
+        "Which: has no length property"));
+
+    b.add(0);
+    shouldPass(b, hasLength(1));
+    shouldFail(b, hasLength(2), "Expected: an object with length of <2> "
+        "Actual: [0] "
+        "Which: has length of <1>");
+
+    b.add(0);
+    shouldFail(b, hasLength(1), "Expected: an object with length of <1> "
+        "Actual: [0, 0] "
+        "Which: has length of <2>");
+    shouldPass(b, hasLength(2));
+  });
+
+  test('scalar type mismatch', () {
+    shouldFail('error', equals(5.1), "Expected: <5.1> "
+        "Actual: 'error'");
+  });
+
+  test('nested type mismatch', () {
+    shouldFail(['error'], equals([5.1]), "Expected: [5.1] "
+        "Actual: ['error'] "
+        "Which: was 'error' instead of <5.1> at location [0]");
+  });
+
+  test('doubly-nested type mismatch', () {
+    shouldFail([['error']], equals([[5.1]]), "Expected: [[5.1]] "
+        "Actual: [['error']] "
+        "Which: was 'error' instead of <5.1> at location [0][0]");
+  });
+
+  test('doubly nested inequality', () {
+    var actual1 = [['foo', 'bar'], ['foo'], 3, []];
+    var expected1 = [['foo', 'bar'], ['foo'], 4, []];
+    var reason1 = "Expected: [['foo', 'bar'], ['foo'], 4, []] "
+        "Actual: [['foo', 'bar'], ['foo'], 3, []] "
+        "Which: was <3> instead of <4> at location [2]";
+
+    var actual2 = [['foo', 'barry'], ['foo'], 4, []];
+    var expected2 = [['foo', 'bar'], ['foo'], 4, []];
+    var reason2 = "Expected: [['foo', 'bar'], ['foo'], 4, []] "
+        "Actual: [['foo', 'barry'], ['foo'], 4, []] "
+        "Which: was 'barry' instead of 'bar' at location [0][1]";
+
+    var actual3 = [['foo', 'bar'], ['foo'], 4, {'foo': 'bar'}];
+    var expected3 = [['foo', 'bar'], ['foo'], 4, {'foo': 'barry'}];
+    var reason3 = "Expected: [['foo', 'bar'], ['foo'], 4, {'foo': 'barry'}] "
+        "Actual: [['foo', 'bar'], ['foo'], 4, {'foo': 'bar'}] "
+        "Which: was 'bar' instead of 'barry' at location [3]['foo']";
+
+    shouldFail(actual1, equals(expected1), reason1);
+    shouldFail(actual2, equals(expected2), reason2);
+    shouldFail(actual3, equals(expected3), reason3);
+  });
+
+  test('isInstanceOf', () {
+    shouldFail(0, new isInstanceOf<String>(),
+        "Expected: an instance of String Actual: <0>");
+    shouldPass('cow', new isInstanceOf<String>());
+  });
+
+  group('Predicate Matchers', () {
+    test('isInstanceOf', () {
+      shouldFail(0, predicate((x) => x is String, "an instance of String"),
+          "Expected: an instance of String Actual: <0>");
+      shouldPass('cow', predicate((x) => x is String, "an instance of String"));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/correct_callback_test.dart b/mojo/public/dart/third_party/unittest/test/correct_callback_test.dart
new file mode 100644
index 0000000..f69766e
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/correct_callback_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.correct_callback_test;
+
+import 'dart:async';
+
+import 'package:metatest/metatest.dart';
+import 'package:unittest/unittest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestsPass('correct callback test', () {
+    var count = 0;
+    test('test', () => new Future.sync(expectAsync(() {
+      ++count;
+    })));
+
+    test('verify count', () {
+      expect(count, 1);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/escape_test.dart b/mojo/public/dart/third_party/unittest/test/escape_test.dart
new file mode 100644
index 0000000..f26177f
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/escape_test.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.escape_test;
+
+import 'package:unittest/unittest.dart';
+import 'package:unittest/src/matcher/util.dart';
+
+void main() {
+  group('escaping should work with', () {
+    _testEscaping('no escaped chars', 'Hello, world!', 'Hello, world!');
+    _testEscaping('newline', '\n', r'\n');
+    _testEscaping('carriage return', '\r', r'\r');
+    _testEscaping('form feed', '\f', r'\f');
+    _testEscaping('backspace', '\b', r'\b');
+    _testEscaping('tab', '\t', r'\t');
+    _testEscaping('vertical tab', '\v', r'\v');
+    _testEscaping('null byte', '\x00', r'\x00');
+    _testEscaping('ASCII control character', '\x11', r'\x11');
+    _testEscaping('delete', '\x7F', r'\x7F');
+    _testEscaping('escape combos', r'\n', r'\\n');
+    _testEscaping('All characters',
+        'A new line\nA charriage return\rA form feed\fA backspace\b'
+        'A tab\tA vertical tab\vA slash\\A null byte\x00A control char\x1D'
+        'A delete\x7F',
+        r'A new line\nA charriage return\rA form feed\fA backspace\b'
+        r'A tab\tA vertical tab\vA slash\\A null byte\x00A control char\x1D'
+        r'A delete\x7F');
+  });
+
+  group('unequal strings remain unequal when escaped', () {
+    _testUnequalStrings('with a newline', '\n', r'\n');
+    _testUnequalStrings('with slash literals', '\\', r'\\');
+  });
+}
+
+/// Creates a [test] with name [name] that verifies [source] escapes to value
+/// [target].
+void _testEscaping(String name, String source, String target) {
+  test(name, () {
+    var escaped = escape(source);
+    expect(escaped == target, isTrue,
+        reason: "Expected escaped value: $target\n"
+        "  Actual escaped value: $escaped");
+  });
+}
+
+/// Creates a [test] with name [name] that ensures two different [String] values
+/// [s1] and [s2] remain unequal when escaped.
+void _testUnequalStrings(String name, String s1, String s2) {
+  test(name, () {
+    // Explicitly not using the equals matcher
+    expect(s1 != s2, isTrue, reason: 'The source values should be unequal');
+
+    var escapedS1 = escape(s1);
+    var escapedS2 = escape(s2);
+
+    // Explicitly not using the equals matcher
+    expect(escapedS1 != escapedS2, isTrue,
+        reason: 'Unequal strings, when escaped, should remain unequal.');
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/exception_test.dart b/mojo/public/dart/third_party/unittest/test/exception_test.dart
new file mode 100644
index 0000000..137f0a3
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/exception_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.exception_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'package:metatest/metatest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestResults('good setup/good teardown', () {
+    test('test', () {
+      throw new Exception('Fail.');
+    });
+  }, [{'result': 'error', 'message': 'Test failed: Caught Exception: Fail.'}]);
+}
diff --git a/mojo/public/dart/third_party/unittest/test/excess_callback_test.dart b/mojo/public/dart/third_party/unittest/test/excess_callback_test.dart
new file mode 100644
index 0000000..2679d17
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/excess_callback_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.excess_callback_test;
+
+import 'dart:async';
+
+import 'package:metatest/metatest.dart';
+import 'package:unittest/unittest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  var count = 0;
+
+  expectTestResults('excess callback test', () {
+    test('test', () {
+      var _callback0 = expectAsync(() => ++count);
+      var _callback1 = expectAsync(() => ++count);
+      var _callback2 = expectAsync(() {
+        _callback1();
+        _callback1();
+        _callback0();
+      });
+      new Future.sync(_callback2);
+    });
+
+    test('verify count', () {
+      expect(count, 1);
+    });
+  }, [
+    {
+      'description': 'test',
+      'message': 'Callback called more times than expected (1).',
+      'result': 'fail'
+    },
+    {'description': 'verify count', 'result': 'pass',}
+  ]);
+}
diff --git a/mojo/public/dart/third_party/unittest/test/expect_async_args_test.dart b/mojo/public/dart/third_party/unittest/test/expect_async_args_test.dart
new file mode 100644
index 0000000..8e814dc
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/expect_async_args_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.expect_async_args_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'package:metatest/metatest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestResults('expect async args', () {
+    var count = 0;
+    List<int> _getArgs([a = 0, b = 0, c = 0, d = 0, e = 0, f = 0]) {
+      count++;
+      return [a, b, c, d, e, f];
+    }
+
+    test('expect async args', () {
+      expect(expectAsync(_getArgs)(), [0, 0, 0, 0, 0, 0]);
+      expect(expectAsync(_getArgs)(5), [5, 0, 0, 0, 0, 0]);
+      expect(expectAsync(_getArgs)(1, 2, 3, 4, 5, 6), [1, 2, 3, 4, 5, 6]);
+    });
+
+    test('invoked with too many args', () {
+      expectAsync(_getArgs)(1, 2, 3, 4, 5, 6, 7);
+    });
+
+    test('created with too many args', () {
+      expectAsync((a1, a2, a3, a4, a5, a6, a7) {
+        count++;
+      })();
+    });
+
+    test('verify count', () {
+      expect(count, 3);
+    });
+  }, [
+    {'description': 'expect async args', 'result': 'pass',},
+    {'description': 'invoked with too many args', 'result': 'error',},
+    {'description': 'created with too many args', 'result': 'error',},
+    {'description': 'verify count', 'result': 'pass',}
+  ]);
+}
diff --git a/mojo/public/dart/third_party/unittest/test/expect_async_test.dart b/mojo/public/dart/third_party/unittest/test/expect_async_test.dart
new file mode 100644
index 0000000..844e44b
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/expect_async_test.dart
@@ -0,0 +1,100 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.expect_async_test;
+
+import 'dart:async';
+
+import 'package:metatest/metatest.dart';
+import 'package:unittest/unittest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  var count = 0;
+
+  expectTestsPass('expect async test', () {
+    test('expectAsync zero params', () {
+      new Future.sync(expectAsync(() {
+        ++count;
+      }));
+    });
+
+    test('expectAsync 1 param', () {
+      var func = expectAsync((arg) {
+        expect(arg, 0);
+        ++count;
+      });
+      new Future.sync(() => func(0));
+    });
+
+    test('expectAsync 2 param', () {
+      var func = expectAsync((arg0, arg1) {
+        expect(arg0, 0);
+        expect(arg1, 1);
+        ++count;
+      });
+      new Future.sync(() => func(0, 1));
+    });
+
+    test('single arg to Future.catchError', () {
+      var func = expectAsync((error) {
+        expect(error, isStateError);
+        ++count;
+      });
+
+      new Future(() {
+        throw new StateError('test');
+      }).catchError(func);
+    });
+
+    test('2 args to Future.catchError', () {
+      var func = expectAsync((error, stack) {
+        expect(error, isStateError);
+        expect(stack is StackTrace, isTrue);
+        ++count;
+      });
+
+      new Future(() {
+        throw new StateError('test');
+      }).catchError(func);
+    });
+
+    test('zero of two optional positional args', () {
+      var func = expectAsync(([arg0 = true, arg1 = true]) {
+        expect(arg0, isTrue);
+        expect(arg1, isTrue);
+        ++count;
+      });
+
+      new Future.sync(() => func());
+    });
+
+    test('one of two optional positional args', () {
+      var func = expectAsync(([arg0 = true, arg1 = true]) {
+        expect(arg0, isFalse);
+        expect(arg1, isTrue);
+        ++count;
+      });
+
+      new Future.sync(() => func(false));
+    });
+
+    test('two of two optional positional args', () {
+      var func = expectAsync(([arg0 = true, arg1 = true]) {
+        expect(arg0, isFalse);
+        expect(arg1, isNull);
+        ++count;
+      });
+
+      new Future.sync(() => func(false, null));
+    });
+
+    test('verify count', () {
+      expect(count, 8);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/future_matchers_test.dart b/mojo/public/dart/third_party/unittest/test/future_matchers_test.dart
new file mode 100644
index 0000000..5a9a605
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/future_matchers_test.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.future_matchers_test;
+
+import 'dart:async';
+
+import 'package:unittest/unittest.dart';
+
+import 'test_utils.dart';
+
+void main() {
+  initUtils();
+
+  test('completes - unexpected error', () {
+    var completer = new Completer();
+    completer.completeError('X');
+    shouldFail(completer.future, completes, contains(
+        'Expected future to complete successfully, '
+        'but it failed with X'), isAsync: true);
+  });
+
+  test('completes - successfully', () {
+    var completer = new Completer();
+    completer.complete('1');
+    shouldPass(completer.future, completes, isAsync: true);
+  });
+
+  test('throws - unexpected to see normal completion', () {
+    var completer = new Completer();
+    completer.complete('1');
+    shouldFail(completer.future, throws,
+        contains("Expected future to fail, but succeeded with '1'"),
+        isAsync: true);
+  });
+
+  test('throws - expected to see exception', () {
+    var completer = new Completer();
+    completer.completeError('X');
+    shouldPass(completer.future, throws, isAsync: true);
+  });
+
+  test('throws - expected to see exception thrown later on', () {
+    var completer = new Completer();
+    var chained = completer.future.then((_) {
+      throw 'X';
+    });
+    shouldPass(chained, throws, isAsync: true);
+    completer.complete('1');
+  });
+
+  test('throwsA - unexpected normal completion', () {
+    var completer = new Completer();
+    completer.complete('1');
+    shouldFail(completer.future, throwsA(equals('X')),
+        contains("Expected future to fail, but succeeded with '1'"),
+        isAsync: true);
+  });
+
+  test('throwsA - correct error', () {
+    var completer = new Completer();
+    completer.completeError('X');
+    shouldPass(completer.future, throwsA(equals('X')), isAsync: true);
+  });
+
+  test('throwsA - wrong error', () {
+    var completer = new Completer();
+    completer.completeError('X');
+    shouldFail(completer.future, throwsA(equals('Y')),
+        "Expected: 'Y' Actual: 'X' "
+        "Which: is different. "
+        "Expected: Y Actual: X ^ Differ at offset 0", isAsync: true);
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/group_name_test.dart b/mojo/public/dart/third_party/unittest/test/group_name_test.dart
new file mode 100644
index 0000000..3184ffc
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/group_name_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.group_name_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'package:metatest/metatest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestResults('group name test', () {
+    group('a', () {
+      test('a', () {});
+      group('b', () {
+        test('b', () {});
+      });
+    });
+  }, [{'description': 'a a'}, {'description': 'a b b'}]);
+}
diff --git a/mojo/public/dart/third_party/unittest/test/invalid_ops_test.dart b/mojo/public/dart/third_party/unittest/test/invalid_ops_test.dart
new file mode 100644
index 0000000..d9e05e7
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/invalid_ops_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.invalid_ops_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'package:metatest/metatest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestsPass('testcases immutable', () {
+    test('test', () {
+      expect(() => test('test', () {}), throwsStateError);
+      expect(() => solo_test('test', () {}), throwsStateError);
+      expect(() => group('test', () {}), throwsStateError);
+      expect(() => solo_group('test', () {}), throwsStateError);
+      expect(() => setUp(() {}), throwsStateError);
+      expect(() => tearDown(() {}), throwsStateError);
+      expect(() => runTests(), throwsStateError);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/iterable_matchers_test.dart b/mojo/public/dart/third_party/unittest/test/iterable_matchers_test.dart
new file mode 100644
index 0000000..d38f836
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/iterable_matchers_test.dart
@@ -0,0 +1,165 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.iterable_matchers_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'test_utils.dart';
+
+void main() {
+  initUtils();
+
+  test('isEmpty', () {
+    shouldPass([], isEmpty);
+    shouldFail([1], isEmpty, "Expected: empty Actual: [1]");
+  });
+
+  test('isNotEmpty', () {
+    shouldFail([], isNotEmpty, "Expected: non-empty Actual: []");
+    shouldPass([1], isNotEmpty);
+  });
+
+  test('contains', () {
+    var d = [1, 2];
+    shouldPass(d, contains(1));
+    shouldFail(d, contains(0), "Expected: contains <0> "
+        "Actual: [1, 2]");
+  });
+
+  test('equals with matcher element', () {
+    var d = ['foo', 'bar'];
+    shouldPass(d, equals(['foo', startsWith('ba')]));
+    shouldFail(d, equals(['foo', endsWith('ba')]),
+        "Expected: ['foo', <a string ending with 'ba'>] "
+        "Actual: ['foo', 'bar'] "
+        "Which: does not match a string ending with 'ba' at location [1]");
+  });
+
+  test('isIn', () {
+    var d = [1, 2];
+    shouldPass(1, isIn(d));
+    shouldFail(0, isIn(d), "Expected: is in [1, 2] Actual: <0>");
+  });
+
+  test('everyElement', () {
+    var d = [1, 2];
+    var e = [1, 1, 1];
+    shouldFail(d, everyElement(1), "Expected: every element(<1>) "
+        "Actual: [1, 2] "
+        "Which: has value <2> which doesn't match <1> at index 1");
+    shouldPass(e, everyElement(1));
+  });
+
+  test('nested everyElement', () {
+    var d = [['foo', 'bar'], ['foo'], []];
+    var e = [['foo', 'bar'], ['foo'], 3, []];
+    shouldPass(d, everyElement(anyOf(isEmpty, contains('foo'))));
+    shouldFail(d, everyElement(everyElement(equals('foo'))),
+        "Expected: every element(every element('foo')) "
+        "Actual: [['foo', 'bar'], ['foo'], []] "
+        "Which: has value ['foo', 'bar'] which has value 'bar' "
+        "which is different. Expected: foo Actual: bar ^ "
+        "Differ at offset 0 at index 1 at index 0");
+    shouldFail(d,
+        everyElement(allOf(hasLength(greaterThan(0)), contains('foo'))),
+        "Expected: every element((an object with length of a value "
+        "greater than <0> and contains 'foo')) "
+        "Actual: [['foo', 'bar'], ['foo'], []] "
+        "Which: has value [] which has length of <0> at index 2");
+    shouldFail(d,
+        everyElement(allOf(contains('foo'), hasLength(greaterThan(0)))),
+        "Expected: every element((contains 'foo' and "
+        "an object with length of a value greater than <0>)) "
+        "Actual: [['foo', 'bar'], ['foo'], []] "
+        "Which: has value [] which doesn't match (contains 'foo' and "
+        "an object with length of a value greater than <0>) at index 2");
+    shouldFail(e,
+        everyElement(allOf(contains('foo'), hasLength(greaterThan(0)))),
+        "Expected: every element((contains 'foo' and an object with "
+        "length of a value greater than <0>)) "
+        "Actual: [['foo', 'bar'], ['foo'], 3, []] "
+        "Which: has value <3> which is not a string, map or iterable "
+        "at index 2");
+  });
+
+  test('anyElement', () {
+    var d = [1, 2];
+    var e = [1, 1, 1];
+    shouldPass(d, anyElement(2));
+    shouldFail(
+        e, anyElement(2), "Expected: some element <2> Actual: [1, 1, 1]");
+  });
+
+  test('orderedEquals', () {
+    shouldPass([null], orderedEquals([null]));
+    var d = [1, 2];
+    shouldPass(d, orderedEquals([1, 2]));
+    shouldFail(d, orderedEquals([2, 1]), "Expected: equals [2, 1] ordered "
+        "Actual: [1, 2] "
+        "Which: was <1> instead of <2> at location [0]");
+  });
+
+  test('unorderedEquals', () {
+    var d = [1, 2];
+    shouldPass(d, unorderedEquals([2, 1]));
+    shouldFail(d, unorderedEquals([1]), "Expected: equals [1] unordered "
+        "Actual: [1, 2] "
+        "Which: has too many elements (2 > 1)");
+    shouldFail(d, unorderedEquals([3, 2, 1]),
+        "Expected: equals [3, 2, 1] unordered "
+        "Actual: [1, 2] "
+        "Which: has too few elements (2 < 3)");
+    shouldFail(d, unorderedEquals([3, 1]), "Expected: equals [3, 1] unordered "
+        "Actual: [1, 2] "
+        "Which: has no match for <3> at index 0");
+  });
+
+  test('unorderedMatchess', () {
+    var d = [1, 2];
+    shouldPass(d, unorderedMatches([2, 1]));
+    shouldPass(d, unorderedMatches([greaterThan(1), greaterThan(0)]));
+    shouldFail(d, unorderedMatches([greaterThan(0)]),
+        "Expected: matches [a value greater than <0>] unordered "
+        "Actual: [1, 2] "
+        "Which: has too many elements (2 > 1)");
+    shouldFail(d, unorderedMatches([3, 2, 1]),
+        "Expected: matches [<3>, <2>, <1>] unordered "
+        "Actual: [1, 2] "
+        "Which: has too few elements (2 < 3)");
+    shouldFail(d, unorderedMatches([3, 1]),
+        "Expected: matches [<3>, <1>] unordered "
+        "Actual: [1, 2] "
+        "Which: has no match for <3> at index 0");
+    shouldFail(d, unorderedMatches([greaterThan(3), greaterThan(0)]),
+        "Expected: matches [a value greater than <3>, a value greater than "
+        "<0>] unordered "
+        "Actual: [1, 2] "
+        "Which: has no match for a value greater than <3> at index 0");
+  });
+
+  test('pairwise compare', () {
+    var c = [1, 2];
+    var d = [1, 2, 3];
+    var e = [1, 4, 9];
+    shouldFail('x', pairwiseCompare(e, (e, a) => a <= e, "less than or equal"),
+        "Expected: pairwise less than or equal [1, 4, 9] "
+        "Actual: 'x' "
+        "Which: is not an Iterable");
+    shouldFail(c, pairwiseCompare(e, (e, a) => a <= e, "less than or equal"),
+        "Expected: pairwise less than or equal [1, 4, 9] "
+        "Actual: [1, 2] "
+        "Which: has length 2 instead of 3");
+    shouldPass(d, pairwiseCompare(e, (e, a) => a <= e, "less than or equal"));
+    shouldFail(d, pairwiseCompare(e, (e, a) => a < e, "less than"),
+        "Expected: pairwise less than [1, 4, 9] "
+        "Actual: [1, 2, 3] "
+        "Which: has <1> which is not less than <1> at index 0");
+    shouldPass(d, pairwiseCompare(e, (e, a) => a * a == e, "square root of"));
+    shouldFail(d, pairwiseCompare(e, (e, a) => a + a == e, "double"),
+        "Expected: pairwise double [1, 4, 9] "
+        "Actual: [1, 2, 3] "
+        "Which: has <1> which is not double <1> at index 0");
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/late_exception_test.dart b/mojo/public/dart/third_party/unittest/test/late_exception_test.dart
new file mode 100644
index 0000000..94ad30b
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/late_exception_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.late_exception_test;
+
+import 'dart:async';
+
+import 'package:metatest/metatest.dart';
+import 'package:unittest/unittest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestResults('late exception test', () {
+    var f;
+    test('testOne', () {
+      f = expectAsync(() {});
+      new Future.sync(f);
+    });
+    test('testTwo', () {
+      new Future.sync(expectAsync(() {
+        f();
+      }));
+    });
+  }, [
+    {
+      'description': 'testOne',
+      'message': 'Callback called (2) after test case testOne had already been '
+          'marked as pass.',
+      'result': 'error',
+    },
+    {'description': 'testTwo', 'result': 'pass',}
+  ]);
+}
diff --git a/mojo/public/dart/third_party/unittest/test/matchers_minified_test.dart b/mojo/public/dart/third_party/unittest/test/matchers_minified_test.dart
new file mode 100644
index 0000000..af12906
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/matchers_minified_test.dart
@@ -0,0 +1,142 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This file is for matcher tests that rely on the names of various Dart types.
+// These tests normally fail when run in minified dart2js, since the names will
+// be mangled. This version of the file is modified to expect minified names.
+
+library unittest.matcher.minified_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'test_common.dart';
+import 'test_utils.dart';
+
+// A regexp fragment matching a minified name.
+const _MINIFIED_NAME = r"[A-Za-z0-9]{1,3}";
+
+void main() {
+  initUtils();
+
+  group('Core matchers', () {
+    test('throwsFormatException', () {
+      shouldPass(() {
+        throw new FormatException('');
+      }, throwsFormatException);
+      shouldFail(() {
+        throw new Exception();
+      }, throwsFormatException, matches(r"Expected: throws FormatException +"
+          r"Actual: <Closure(: \(\) => dynamic)?> +"
+          r"Which: threw " + _MINIFIED_NAME + r":<Exception>"));
+    });
+
+    test('throwsArgumentError', () {
+      shouldPass(() {
+        throw new ArgumentError('');
+      }, throwsArgumentError);
+      shouldFail(() {
+        throw new Exception();
+      }, throwsArgumentError, matches(r"Expected: throws ArgumentError +"
+          r"Actual: <Closure(: \(\) => dynamic)?> +"
+          r"Which: threw " + _MINIFIED_NAME + r":<Exception>"));
+    });
+
+    test('throwsRangeError', () {
+      shouldPass(() {
+        throw new RangeError(0);
+      }, throwsRangeError);
+      shouldFail(() {
+        throw new Exception();
+      }, throwsRangeError, matches(r"Expected: throws RangeError +"
+          r"Actual: <Closure(: \(\) => dynamic)?> +"
+          r"Which: threw " + _MINIFIED_NAME + r":<Exception>"));
+    });
+
+    test('throwsNoSuchMethodError', () {
+      shouldPass(() {
+        throw new NoSuchMethodError(null, const Symbol(''), null, null);
+      }, throwsNoSuchMethodError);
+      shouldFail(() {
+        throw new Exception();
+      }, throwsNoSuchMethodError, matches(
+          r"Expected: throws NoSuchMethodError +"
+              r"Actual: <Closure(: \(\) => dynamic)?> +"
+              r"Which: threw " + _MINIFIED_NAME + r":<Exception>"));
+    });
+
+    test('throwsUnimplementedError', () {
+      shouldPass(() {
+        throw new UnimplementedError('');
+      }, throwsUnimplementedError);
+      shouldFail(() {
+        throw new Exception();
+      }, throwsUnimplementedError, matches(
+          r"Expected: throws UnimplementedError +"
+              r"Actual: <Closure(: \(\) => dynamic)?> +"
+              r"Which: threw " + _MINIFIED_NAME + r":<Exception>"));
+    });
+
+    test('throwsUnsupportedError', () {
+      shouldPass(() {
+        throw new UnsupportedError('');
+      }, throwsUnsupportedError);
+      shouldFail(() {
+        throw new Exception();
+      }, throwsUnsupportedError, matches(r"Expected: throws UnsupportedError +"
+          r"Actual: <Closure(: \(\) => dynamic)?> +"
+          r"Which: threw " + _MINIFIED_NAME + r":<Exception>"));
+    });
+
+    test('throwsStateError', () {
+      shouldPass(() {
+        throw new StateError('');
+      }, throwsStateError);
+      shouldFail(() {
+        throw new Exception();
+      }, throwsStateError, matches(r"Expected: throws StateError +"
+          r"Actual: <Closure(: \(\) => dynamic)?> +"
+          r"Which: threw " + _MINIFIED_NAME + r":<Exception>"));
+    });
+  });
+
+  group('Iterable Matchers', () {
+    test('isEmpty', () {
+      var d = new SimpleIterable(0);
+      var e = new SimpleIterable(1);
+      shouldPass(d, isEmpty);
+      shouldFail(e, isEmpty,
+          matches(r"Expected: empty +Actual: " + _MINIFIED_NAME + r":\[1\]"));
+    });
+
+    test('isNotEmpty', () {
+      var d = new SimpleIterable(0);
+      var e = new SimpleIterable(1);
+      shouldPass(e, isNotEmpty);
+      shouldFail(d, isNotEmpty, matches(
+          r"Expected: non-empty +Actual: " + _MINIFIED_NAME + r":\[\]"));
+    });
+
+    test('contains', () {
+      var d = new SimpleIterable(3);
+      shouldPass(d, contains(2));
+      shouldFail(d, contains(5), matches(r"Expected: contains <5> +"
+          r"Actual: " + _MINIFIED_NAME + r":\[3, 2, 1\]"));
+    });
+  });
+
+  group('Feature Matchers', () {
+    test("Feature Matcher", () {
+      var w = new Widget();
+      w.price = 10;
+      shouldPass(w, new HasPrice(10));
+      shouldPass(w, new HasPrice(greaterThan(0)));
+      shouldFail(w, new HasPrice(greaterThan(10)), matches(
+          r"Expected: Widget with a price that is a value greater than "
+              r"<10> +"
+              r"Actual: <Instance of '" + _MINIFIED_NAME + r"'> +"
+              r"Which: has price with value <10> which is not "
+              r"a value greater than <10>"));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/matchers_unminified_test.dart b/mojo/public/dart/third_party/unittest/test/matchers_unminified_test.dart
new file mode 100644
index 0000000..dc4b2b4
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/matchers_unminified_test.dart
@@ -0,0 +1,139 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This file is for matcher tests that rely on the names of various Dart types.
+// These tests will fail when run in minified dart2js, since the names will be
+// mangled. A version of this file that works in minified dart2js is in
+// matchers_minified_test.dart.
+
+library unittest.matcher.unminified_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'test_common.dart';
+import 'test_utils.dart';
+
+void main() {
+  initUtils();
+
+  group('Core matchers', () {
+    test('throwsFormatException', () {
+      shouldPass(() {
+        throw new FormatException('');
+      }, throwsFormatException);
+      shouldFail(() {
+        throw new Exception();
+      }, throwsFormatException, matches(r"Expected: throws FormatException +"
+          r"Actual: <Closure(: \(\) => dynamic)?> +"
+          r"Which: threw \?:<Exception>"));
+    });
+
+    test('throwsArgumentError', () {
+      shouldPass(() {
+        throw new ArgumentError('');
+      }, throwsArgumentError);
+      shouldFail(() {
+        throw new Exception();
+      }, throwsArgumentError, matches(r"Expected: throws ArgumentError +"
+          r"Actual: <Closure(: \(\) => dynamic)?> +"
+          r"Which: threw \?:<Exception>"));
+    });
+
+    test('throwsRangeError', () {
+      shouldPass(() {
+        throw new RangeError(0);
+      }, throwsRangeError);
+      shouldFail(() {
+        throw new Exception();
+      }, throwsRangeError, matches(r"Expected: throws RangeError +"
+          r"Actual: <Closure(: \(\) => dynamic)?> +"
+          r"Which: threw \?:<Exception>"));
+    });
+
+    test('throwsNoSuchMethodError', () {
+      shouldPass(() {
+        throw new NoSuchMethodError(null, const Symbol(''), null, null);
+      }, throwsNoSuchMethodError);
+      shouldFail(() {
+        throw new Exception();
+      }, throwsNoSuchMethodError, matches(
+          r"Expected: throws NoSuchMethodError +"
+          r"Actual: <Closure(: \(\) => dynamic)?> +"
+          r"Which: threw \?:<Exception>"));
+    });
+
+    test('throwsUnimplementedError', () {
+      shouldPass(() {
+        throw new UnimplementedError('');
+      }, throwsUnimplementedError);
+      shouldFail(() {
+        throw new Exception();
+      }, throwsUnimplementedError, matches(
+          r"Expected: throws UnimplementedError +"
+          r"Actual: <Closure(: \(\) => dynamic)?> +"
+          r"Which: threw \?:<Exception>"));
+    });
+
+    test('throwsUnsupportedError', () {
+      shouldPass(() {
+        throw new UnsupportedError('');
+      }, throwsUnsupportedError);
+      shouldFail(() {
+        throw new Exception();
+      }, throwsUnsupportedError, matches(r"Expected: throws UnsupportedError +"
+          r"Actual: <Closure(: \(\) => dynamic)?> +"
+          r"Which: threw \?:<Exception>"));
+    });
+
+    test('throwsStateError', () {
+      shouldPass(() {
+        throw new StateError('');
+      }, throwsStateError);
+      shouldFail(() {
+        throw new Exception();
+      }, throwsStateError, matches(r"Expected: throws StateError +"
+          r"Actual: <Closure(: \(\) => dynamic)?> +"
+          r"Which: threw \?:<Exception>"));
+    });
+  });
+
+  group('Iterable Matchers', () {
+    test('isEmpty', () {
+      var d = new SimpleIterable(0);
+      var e = new SimpleIterable(1);
+      shouldPass(d, isEmpty);
+      shouldFail(e, isEmpty, "Expected: empty "
+          "Actual: SimpleIterable:[1]");
+    });
+
+    test('isNotEmpty', () {
+      var d = new SimpleIterable(0);
+      var e = new SimpleIterable(1);
+      shouldPass(e, isNotEmpty);
+      shouldFail(d, isNotEmpty, "Expected: non-empty "
+          "Actual: SimpleIterable:[]");
+    });
+
+    test('contains', () {
+      var d = new SimpleIterable(3);
+      shouldPass(d, contains(2));
+      shouldFail(d, contains(5), "Expected: contains <5> "
+          "Actual: SimpleIterable:[3, 2, 1]");
+    });
+  });
+
+  group('Feature Matchers', () {
+    test("Feature Matcher", () {
+      var w = new Widget();
+      w.price = 10;
+      shouldPass(w, new HasPrice(10));
+      shouldPass(w, new HasPrice(greaterThan(0)));
+      shouldFail(w, new HasPrice(greaterThan(10)),
+          "Expected: Widget with a price that is a value greater than <10> "
+          "Actual: <Instance of 'Widget'> "
+          "Which: has price with value <10> which is not "
+          "a value greater than <10>");
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/middle_exception_test.dart b/mojo/public/dart/third_party/unittest/test/middle_exception_test.dart
new file mode 100644
index 0000000..1abd02e
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/middle_exception_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.middle_exception_test;
+
+import 'dart:async';
+
+import 'package:metatest/metatest.dart';
+import 'package:unittest/unittest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestResults('late exception test', () {
+    test('testOne', () {
+      expect(true, isTrue);
+    });
+    test('testTwo', () {
+      expect(true, isFalse);
+    });
+    test('testThree', () {
+      var done = expectAsync(() {});
+      new Future.sync(() {
+        expect(true, isTrue);
+        done();
+      });
+    });
+  }, [{'result': 'pass'}, {'result': 'fail',}, {'result': 'pass'}]);
+}
diff --git a/mojo/public/dart/third_party/unittest/test/missing_tick_test.dart b/mojo/public/dart/third_party/unittest/test/missing_tick_test.dart
new file mode 100644
index 0000000..81b0331
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/missing_tick_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.missing_tick_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'package:metatest/metatest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message, timeout: const Duration(seconds: 1));
+
+  expectTestResults('missing tick', () {
+    test('test that should time out', () {
+      expectAsync(() {});
+    });
+  }, [
+    {
+      'description': 'test that should time out',
+      'message': 'Test timed out after 1 seconds.',
+      'result': 'error',
+    }
+  ]);
+}
diff --git a/mojo/public/dart/third_party/unittest/test/nested_groups_setup_teardown_test.dart b/mojo/public/dart/third_party/unittest/test/nested_groups_setup_teardown_test.dart
new file mode 100644
index 0000000..ca09ec6
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/nested_groups_setup_teardown_test.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.nested_groups_setup_teardown_test;
+
+import 'dart:async';
+
+import 'package:unittest/unittest.dart';
+
+import 'package:metatest/metatest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestsPass('nested groups setup/teardown', () {
+    StringBuffer s = new StringBuffer();
+    group('level 1', () {
+      setUp(makeDelayedSetup(1, s));
+      group('level 2', () {
+        setUp(makeImmediateSetup(2, s));
+        tearDown(makeDelayedTeardown(2, s));
+        group('level 3', () {
+          group('level 4', () {
+            setUp(makeDelayedSetup(4, s));
+            tearDown(makeImmediateTeardown(4, s));
+            group('level 5', () {
+              setUp(makeImmediateSetup(5, s));
+              group('level 6', () {
+                tearDown(makeDelayedTeardown(6, s));
+                test('inner', () {});
+              });
+            });
+          });
+        });
+      });
+    });
+    test('after nest', () {
+      expect(s.toString(), "l1 U l2 U l4 U l5 U l6 D l4 D l2 D ");
+    });
+  });
+}
+
+Function makeDelayedSetup(int index, StringBuffer s) => () {
+  return new Future.delayed(new Duration(milliseconds: 1), () {
+    s.write('l$index U ');
+  });
+};
+
+Function makeDelayedTeardown(int index, StringBuffer s) => () {
+  return new Future.delayed(new Duration(milliseconds: 1), () {
+    s.write('l$index D ');
+  });
+};
+
+Function makeImmediateSetup(int index, StringBuffer s) => () {
+  s.write('l$index U ');
+};
+
+Function makeImmediateTeardown(int index, StringBuffer s) => () {
+  s.write('l$index D ');
+};
diff --git a/mojo/public/dart/third_party/unittest/test/numeric_matchers_test.dart b/mojo/public/dart/third_party/unittest/test/numeric_matchers_test.dart
new file mode 100644
index 0000000..3d1bbe7
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/numeric_matchers_test.dart
@@ -0,0 +1,142 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.numeric_matchers_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'test_utils.dart';
+
+void main() {
+  initUtils();
+
+  test('greaterThan', () {
+    shouldPass(10, greaterThan(9));
+    shouldFail(9, greaterThan(10), "Expected: a value greater than <10> "
+        "Actual: <9> "
+        "Which: is not a value greater than <10>");
+  });
+
+  test('greaterThanOrEqualTo', () {
+    shouldPass(10, greaterThanOrEqualTo(10));
+    shouldFail(9, greaterThanOrEqualTo(10),
+        "Expected: a value greater than or equal to <10> "
+        "Actual: <9> "
+        "Which: is not a value greater than or equal to <10>");
+  });
+
+  test('lessThan', () {
+    shouldFail(10, lessThan(9), "Expected: a value less than <9> "
+        "Actual: <10> "
+        "Which: is not a value less than <9>");
+    shouldPass(9, lessThan(10));
+  });
+
+  test('lessThanOrEqualTo', () {
+    shouldPass(10, lessThanOrEqualTo(10));
+    shouldFail(11, lessThanOrEqualTo(10),
+        "Expected: a value less than or equal to <10> "
+        "Actual: <11> "
+        "Which: is not a value less than or equal to <10>");
+  });
+
+  test('isZero', () {
+    shouldPass(0, isZero);
+    shouldFail(1, isZero, "Expected: a value equal to <0> "
+        "Actual: <1> "
+        "Which: is not a value equal to <0>");
+  });
+
+  test('isNonZero', () {
+    shouldFail(0, isNonZero, "Expected: a value not equal to <0> "
+        "Actual: <0> "
+        "Which: is not a value not equal to <0>");
+    shouldPass(1, isNonZero);
+  });
+
+  test('isPositive', () {
+    shouldFail(-1, isPositive, "Expected: a positive value "
+        "Actual: <-1> "
+        "Which: is not a positive value");
+    shouldFail(0, isPositive, "Expected: a positive value "
+        "Actual: <0> "
+        "Which: is not a positive value");
+    shouldPass(1, isPositive);
+  });
+
+  test('isNegative', () {
+    shouldPass(-1, isNegative);
+    shouldFail(0, isNegative, "Expected: a negative value "
+        "Actual: <0> "
+        "Which: is not a negative value");
+  });
+
+  test('isNonPositive', () {
+    shouldPass(-1, isNonPositive);
+    shouldPass(0, isNonPositive);
+    shouldFail(1, isNonPositive, "Expected: a non-positive value "
+        "Actual: <1> "
+        "Which: is not a non-positive value");
+  });
+
+  test('isNonNegative', () {
+    shouldPass(1, isNonNegative);
+    shouldPass(0, isNonNegative);
+    shouldFail(-1, isNonNegative, "Expected: a non-negative value "
+        "Actual: <-1> "
+        "Which: is not a non-negative value");
+  });
+
+  test('closeTo', () {
+    shouldPass(0, closeTo(0, 1));
+    shouldPass(-1, closeTo(0, 1));
+    shouldPass(1, closeTo(0, 1));
+    shouldFail(1.001, closeTo(0, 1),
+        "Expected: a numeric value within <1> of <0> "
+        "Actual: <1.001> "
+        "Which: differs by <1.001>");
+    shouldFail(-1.001, closeTo(0, 1),
+        "Expected: a numeric value within <1> of <0> "
+        "Actual: <-1.001> "
+        "Which: differs by <1.001>");
+  });
+
+  test('inInclusiveRange', () {
+    shouldFail(-1, inInclusiveRange(0, 2),
+        "Expected: be in range from 0 (inclusive) to 2 (inclusive) "
+        "Actual: <-1>");
+    shouldPass(0, inInclusiveRange(0, 2));
+    shouldPass(1, inInclusiveRange(0, 2));
+    shouldPass(2, inInclusiveRange(0, 2));
+    shouldFail(3, inInclusiveRange(0, 2),
+        "Expected: be in range from 0 (inclusive) to 2 (inclusive) "
+        "Actual: <3>");
+  });
+
+  test('inExclusiveRange', () {
+    shouldFail(0, inExclusiveRange(0, 2),
+        "Expected: be in range from 0 (exclusive) to 2 (exclusive) "
+        "Actual: <0>");
+    shouldPass(1, inExclusiveRange(0, 2));
+    shouldFail(2, inExclusiveRange(0, 2),
+        "Expected: be in range from 0 (exclusive) to 2 (exclusive) "
+        "Actual: <2>");
+  });
+
+  test('inOpenClosedRange', () {
+    shouldFail(0, inOpenClosedRange(0, 2),
+        "Expected: be in range from 0 (exclusive) to 2 (inclusive) "
+        "Actual: <0>");
+    shouldPass(1, inOpenClosedRange(0, 2));
+    shouldPass(2, inOpenClosedRange(0, 2));
+  });
+
+  test('inClosedOpenRange', () {
+    shouldPass(0, inClosedOpenRange(0, 2));
+    shouldPass(1, inClosedOpenRange(0, 2));
+    shouldFail(2, inClosedOpenRange(0, 2),
+        "Expected: be in range from 0 (inclusive) to 2 (exclusive) "
+        "Actual: <2>");
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/operator_matchers_test.dart b/mojo/public/dart/third_party/unittest/test/operator_matchers_test.dart
new file mode 100644
index 0000000..4938917
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/operator_matchers_test.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.operator_matchers_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'test_utils.dart';
+
+void main() {
+  initUtils();
+
+  test('anyOf', () {
+    // with a list
+    shouldFail(
+        0, anyOf([equals(1), equals(2)]), "Expected: (<1> or <2>) Actual: <0>");
+    shouldPass(1, anyOf([equals(1), equals(2)]));
+
+    // with individual items
+    shouldFail(
+        0, anyOf(equals(1), equals(2)), "Expected: (<1> or <2>) Actual: <0>");
+    shouldPass(1, anyOf(equals(1), equals(2)));
+  });
+
+  test('allOf', () {
+    // with a list
+    shouldPass(1, allOf([lessThan(10), greaterThan(0)]));
+    shouldFail(-1, allOf([lessThan(10), greaterThan(0)]),
+        "Expected: (a value less than <10> and a value greater than <0>) "
+        "Actual: <-1> "
+        "Which: is not a value greater than <0>");
+
+    // with individual items
+    shouldPass(1, allOf(lessThan(10), greaterThan(0)));
+    shouldFail(-1, allOf(lessThan(10), greaterThan(0)),
+        "Expected: (a value less than <10> and a value greater than <0>) "
+        "Actual: <-1> "
+        "Which: is not a value greater than <0>");
+
+    // with maximum items
+    shouldPass(1, allOf(lessThan(10), lessThan(9), lessThan(8),
+        lessThan(7), lessThan(6), lessThan(5), lessThan(4)));
+    shouldFail(4, allOf(lessThan(10), lessThan(9), lessThan(8), lessThan(7),
+            lessThan(6), lessThan(5), lessThan(4)),
+        "Expected: (a value less than <10> and a value less than <9> and a "
+        "value less than <8> and a value less than <7> and a value less than "
+        "<6> and a value less than <5> and a value less than <4>) "
+        "Actual: <4> "
+        "Which: is not a value less than <4>");
+  });
+
+  test('If the first argument is a List, the rest must be null', () {
+    expect(() => allOf([], 5), throwsArgumentError);
+    expect(
+        () => anyOf([], null, null, null, null, null, 42), throwsArgumentError);
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/pretty_print_test.dart b/mojo/public/dart/third_party/unittest/test/pretty_print_test.dart
new file mode 100644
index 0000000..6717a56
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/pretty_print_test.dart
@@ -0,0 +1,193 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.pretty_print_test;
+
+import 'package:unittest/unittest.dart';
+import 'package:unittest/src/matcher/pretty_print.dart';
+
+void main() {
+  test('with primitive objects', () {
+    expect(prettyPrint(12), equals('<12>'));
+    expect(prettyPrint(12.13), equals('<12.13>'));
+    expect(prettyPrint(true), equals('<true>'));
+    expect(prettyPrint(null), equals('<null>'));
+    expect(prettyPrint(() => 12), matches(r'<Closure(: \(\) => dynamic)?>'));
+  });
+
+  group('with a string', () {
+    test('containing simple characters', () {
+      expect(prettyPrint('foo'), equals("'foo'"));
+    });
+
+    test('containing newlines', () {
+      expect(prettyPrint('foo\nbar\nbaz'), equals("'foo\\n'\n"
+          "  'bar\\n'\n"
+          "  'baz'"));
+    });
+
+    test('containing escapable characters', () {
+      expect(
+          prettyPrint("foo\rbar\tbaz'qux\v"), equals(r"'foo\rbar\tbaz\'qux\v'"));
+    });
+  });
+
+  group('with an iterable', () {
+    test('containing primitive objects', () {
+      expect(prettyPrint([1, true, 'foo']), equals("[1, true, 'foo']"));
+    });
+
+    test('containing a multiline string', () {
+      expect(prettyPrint(['foo', 'bar\nbaz\nbip', 'qux']), equals("[\n"
+          "  'foo',\n"
+          "  'bar\\n'\n"
+          "    'baz\\n'\n"
+          "    'bip',\n"
+          "  'qux'\n"
+          "]"));
+    });
+
+    test('containing a matcher', () {
+      expect(prettyPrint(['foo', endsWith('qux')]),
+          equals("['foo', <a string ending with 'qux'>]"));
+    });
+
+    test("that's under maxLineLength", () {
+      expect(prettyPrint([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxLineLength: 30),
+          equals("[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]"));
+    });
+
+    test("that's over maxLineLength", () {
+      expect(prettyPrint([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxLineLength: 29),
+          equals("[\n"
+              "  0,\n"
+              "  1,\n"
+              "  2,\n"
+              "  3,\n"
+              "  4,\n"
+              "  5,\n"
+              "  6,\n"
+              "  7,\n"
+              "  8,\n"
+              "  9\n"
+              "]"));
+    });
+
+    test("factors indentation into maxLineLength", () {
+      expect(prettyPrint(["foo\nbar", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],],
+          maxLineLength: 30), equals("[\n"
+          "  'foo\\n'\n"
+          "    'bar',\n"
+          "  [\n"
+          "    0,\n"
+          "    1,\n"
+          "    2,\n"
+          "    3,\n"
+          "    4,\n"
+          "    5,\n"
+          "    6,\n"
+          "    7,\n"
+          "    8,\n"
+          "    9\n"
+          "  ]\n"
+          "]"));
+    });
+
+    test("that's under maxItems", () {
+      expect(prettyPrint([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxItems: 10),
+          equals("[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]"));
+    });
+
+    test("that's over maxItems", () {
+      expect(prettyPrint([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxItems: 9),
+          equals("[0, 1, 2, 3, 4, 5, 6, 7, ...]"));
+    });
+
+    test("that's recursive", () {
+      var list = [1, 2, 3];
+      list.add(list);
+      expect(prettyPrint(list), equals("[1, 2, 3, (recursive)]"));
+    });
+  });
+
+  group("with a map", () {
+    test('containing primitive objects', () {
+      expect(prettyPrint({'foo': 1, 'bar': true}),
+          equals("{'foo': 1, 'bar': true}"));
+    });
+
+    test('containing a multiline string key', () {
+      expect(prettyPrint({'foo\nbar': 1, 'bar': true}), equals("{\n"
+          "  'foo\\n'\n"
+          "    'bar': 1,\n"
+          "  'bar': true\n"
+          "}"));
+    });
+
+    test('containing a multiline string value', () {
+      expect(prettyPrint({'foo': 'bar\nbaz', 'qux': true}), equals("{\n"
+          "  'foo': 'bar\\n'\n"
+          "    'baz',\n"
+          "  'qux': true\n"
+          "}"));
+    });
+
+    test('containing a multiline string key/value pair', () {
+      expect(prettyPrint({'foo\nbar': 'baz\nqux'}), equals("{\n"
+          "  'foo\\n'\n"
+          "    'bar': 'baz\\n'\n"
+          "    'qux'\n"
+          "}"));
+    });
+
+    test('containing a matcher key', () {
+      expect(prettyPrint({endsWith('bar'): 'qux'}),
+          equals("{<a string ending with 'bar'>: 'qux'}"));
+    });
+
+    test('containing a matcher value', () {
+      expect(prettyPrint({'foo': endsWith('qux')}),
+          equals("{'foo': <a string ending with 'qux'>}"));
+    });
+
+    test("that's under maxLineLength", () {
+      expect(prettyPrint({'0': 1, '2': 3, '4': 5, '6': 7}, maxLineLength: 32),
+          equals("{'0': 1, '2': 3, '4': 5, '6': 7}"));
+    });
+
+    test("that's over maxLineLength", () {
+      expect(prettyPrint({'0': 1, '2': 3, '4': 5, '6': 7}, maxLineLength: 31),
+          equals("{\n"
+              "  '0': 1,\n"
+              "  '2': 3,\n"
+              "  '4': 5,\n"
+              "  '6': 7\n"
+              "}"));
+    });
+
+    test("factors indentation into maxLineLength", () {
+      expect(prettyPrint(["foo\nbar", {'0': 1, '2': 3, '4': 5, '6': 7}],
+          maxLineLength: 32), equals("[\n"
+          "  'foo\\n'\n"
+          "    'bar',\n"
+          "  {\n"
+          "    '0': 1,\n"
+          "    '2': 3,\n"
+          "    '4': 5,\n"
+          "    '6': 7\n"
+          "  }\n"
+          "]"));
+    });
+
+    test("that's under maxItems", () {
+      expect(prettyPrint({'0': 1, '2': 3, '4': 5, '6': 7}, maxItems: 4),
+          equals("{'0': 1, '2': 3, '4': 5, '6': 7}"));
+    });
+
+    test("that's over maxItems", () {
+      expect(prettyPrint({'0': 1, '2': 3, '4': 5, '6': 7}, maxItems: 3),
+          equals("{'0': 1, '2': 3, ...}"));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/prints_matcher_test.dart b/mojo/public/dart/third_party/unittest/test/prints_matcher_test.dart
new file mode 100644
index 0000000..f35acf2
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/prints_matcher_test.dart
@@ -0,0 +1,101 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.prints_matchers_test;
+
+import 'dart:async';
+
+import 'package:unittest/unittest.dart';
+
+import 'test_utils.dart';
+
+/// The VM and dart2js have different toStrings for closures.
+final closureToString = (() {}).toString();
+
+void main() {
+  initUtils();
+
+  group('synchronous', () {
+    test("passes with an expected print", () {
+      shouldPass(() => print("Hello, world!"), prints("Hello, world!\n"));
+    });
+
+    test("combines multiple prints", () {
+      shouldPass(() {
+        print("Hello");
+        print("World!");
+      }, prints("Hello\nWorld!\n"));
+    });
+
+    test("works with a Matcher", () {
+      shouldPass(() => print("Hello, world!"), prints(contains("Hello")));
+    });
+
+    test("describes a failure nicely", () {
+      shouldFail(() => print("Hello, world!"), prints("Goodbye, world!\n"),
+          "Expected: prints 'Goodbye, world!\\n' ''"
+          "  Actual: <$closureToString> "
+          "   Which: printed 'Hello, world!\\n' ''"
+          "   Which: is different. "
+          "Expected: Goodbye, w ... "
+          "  Actual: Hello, wor ... "
+          "          ^ Differ at offset 0");
+    });
+
+    test("describes a failure with a non-descriptive Matcher nicely", () {
+      shouldFail(() => print("Hello, world!"), prints(contains("Goodbye")),
+          "Expected: prints contains 'Goodbye'"
+          "  Actual: <$closureToString> "
+          "   Which: printed 'Hello, world!\\n' ''");
+    });
+
+    test("describes a failure with no text nicely", () {
+      shouldFail(() {}, prints(contains("Goodbye")),
+          "Expected: prints contains 'Goodbye'"
+          "  Actual: <$closureToString> "
+          "   Which: printed nothing.");
+    });
+  });
+
+  group('asynchronous', () {
+    test("passes with an expected print", () {
+      shouldPass(() => new Future(() => print("Hello, world!")),
+          prints("Hello, world!\n"));
+    });
+
+    test("combines multiple prints", () {
+      shouldPass(() => new Future(() {
+        print("Hello");
+        print("World!");
+      }), prints("Hello\nWorld!\n"));
+    });
+
+    test("works with a Matcher", () {
+      shouldPass(() => new Future(() => print("Hello, world!")),
+          prints(contains("Hello")));
+    });
+
+    test("describes a failure nicely", () {
+      shouldFail(() => new Future(() => print("Hello, world!")),
+          prints("Goodbye, world!\n"), "Expected: 'Goodbye, world!\\n' ''"
+          "  Actual: 'Hello, world!\\n' ''"
+          "   Which: is different. "
+          "Expected: Goodbye, w ... "
+          "  Actual: Hello, wor ... "
+          "          ^ Differ at offset 0", isAsync: true);
+    });
+
+    test("describes a failure with a non-descriptive Matcher nicely", () {
+      shouldFail(() => new Future(() => print("Hello, world!")),
+          prints(contains("Goodbye")), "Expected: contains 'Goodbye'"
+          "  Actual: 'Hello, world!\\n' ''", isAsync: true);
+    });
+
+    test("describes a failure with no text nicely", () {
+      shouldFail(() => new Future.value(), prints(contains("Goodbye")),
+          "Expected: contains 'Goodbye'"
+          "  Actual: ''", isAsync: true);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/protect_async_test.dart b/mojo/public/dart/third_party/unittest/test/protect_async_test.dart
new file mode 100644
index 0000000..19211f2
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/protect_async_test.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.protect_async_test;
+
+import 'dart:async';
+
+import 'package:unittest/unittest.dart';
+
+import 'package:metatest/metatest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestResults('protectAsync', () {
+    test('protectAsync0', () {
+      var protected = () {
+        throw new StateError('error during protectAsync0');
+      };
+      new Future(protected);
+    });
+
+    test('protectAsync1', () {
+      var protected = (arg) {
+        throw new StateError('error during protectAsync1: $arg');
+      };
+      new Future(() => protected('one arg'));
+    });
+
+    test('protectAsync2', () {
+      var protected = (arg1, arg2) {
+        throw new StateError('error during protectAsync2: $arg1, $arg2');
+      };
+      new Future(() => protected('arg1', 'arg2'));
+    });
+
+    test('throw away 1', () {
+      return new Future(() {});
+    });
+  }, [
+    {
+      'result': 'error',
+      'message': 'Caught Bad state: error during protectAsync0'
+    },
+    {
+      'result': 'error',
+      'message': 'Caught Bad state: error during protectAsync1: one arg'
+    },
+    {
+      'result': 'error',
+      'message': 'Caught Bad state: error during protectAsync2: arg1, arg2'
+    },
+    {'result': 'pass', 'message': ''}
+  ]);
+}
diff --git a/mojo/public/dart/third_party/unittest/test/returning_future_test.dart b/mojo/public/dart/third_party/unittest/test/returning_future_test.dart
new file mode 100644
index 0000000..d59d8c1
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/returning_future_test.dart
@@ -0,0 +1,70 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.returning_future_test;
+
+import 'dart:async';
+
+import 'package:metatest/metatest.dart';
+import 'package:unittest/unittest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestResults('returning futures', () {
+    test("successful", () {
+      return new Future.sync(() {
+        expect(true, true);
+      });
+    });
+    // We repeat the fail and error tests, because during development
+    // I had a situation where either worked fine on their own, and
+    // error/fail worked, but fail/error would time out.
+    test("error1", () {
+      var callback = expectAsync(() {});
+      var excesscallback = expectAsync(() {});
+      return new Future.sync(() {
+        excesscallback();
+        excesscallback();
+        excesscallback();
+        callback();
+      });
+    });
+    test("fail1", () {
+      return new Future.sync(() {
+        expect(true, false);
+      });
+    });
+    test("error2", () {
+      var callback = expectAsync(() {});
+      var excesscallback = expectAsync(() {});
+      return new Future.sync(() {
+        excesscallback();
+        excesscallback();
+        callback();
+      });
+    });
+    test("fail2", () {
+      return new Future.sync(() {
+        fail('failure');
+      });
+    });
+    test('foo5', () {});
+  }, [
+    {'result': 'pass'},
+    {
+      'result': 'fail',
+      'message': 'Callback called more times than expected (1).'
+    },
+    {'result': 'fail', 'message': 'Expected: <false>\n  Actual: <true>\n'},
+    {
+      'result': 'fail',
+      'message': 'Callback called more times than expected (1).'
+    },
+    {'result': 'fail', 'message': 'failure'},
+    {'result': 'pass'}
+  ]);
+}
diff --git a/mojo/public/dart/third_party/unittest/test/returning_future_using_runasync_test.dart b/mojo/public/dart/third_party/unittest/test/returning_future_using_runasync_test.dart
new file mode 100644
index 0000000..3ae13c4
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/returning_future_using_runasync_test.dart
@@ -0,0 +1,87 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.returning_future_using_runasync_test;
+
+import 'dart:async';
+
+import 'package:metatest/metatest.dart';
+import 'package:unittest/unittest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestResults('test returning future using scheduleMicrotask', () {
+    test("successful", () {
+      return new Future.sync(() {
+        scheduleMicrotask(() {
+          expect(true, true);
+        });
+      });
+    });
+    test("fail1", () {
+      var callback = expectAsync(() {});
+      return new Future.sync(() {
+        scheduleMicrotask(() {
+          expect(true, false);
+          callback();
+        });
+      });
+    });
+    test('error1', () {
+      var callback = expectAsync(() {});
+      var excesscallback = expectAsync(() {});
+      return new Future.sync(() {
+        scheduleMicrotask(() {
+          excesscallback();
+          excesscallback();
+          callback();
+        });
+      });
+    });
+    test("fail2", () {
+      var callback = expectAsync(() {});
+      return new Future.sync(() {
+        scheduleMicrotask(() {
+          fail('failure');
+          callback();
+        });
+      });
+    });
+    test('error2', () {
+      var callback = expectAsync(() {});
+      var excesscallback = expectAsync(() {});
+      return new Future.sync(() {
+        scheduleMicrotask(() {
+          excesscallback();
+          excesscallback();
+          excesscallback();
+          callback();
+        });
+      });
+    });
+    test('foo6', () {});
+  }, [
+    {'description': 'successful', 'result': 'pass',},
+    {
+      'description': 'fail1',
+      'message': 'Expected: <false>\n' '  Actual: <true>\n' '',
+      'result': 'fail',
+    },
+    {
+      'description': 'error1',
+      'message': 'Callback called more times than expected (1).',
+      'result': 'fail',
+    },
+    {'description': 'fail2', 'message': 'failure', 'result': 'fail',},
+    {
+      'description': 'error2',
+      'message': 'Callback called more times than expected (1).',
+      'result': 'fail',
+    },
+    {'description': 'foo6', 'result': 'pass',}
+  ]);
+}
diff --git a/mojo/public/dart/third_party/unittest/test/runtests_without_tests_test.dart b/mojo/public/dart/third_party/unittest/test/runtests_without_tests_test.dart
new file mode 100644
index 0000000..4257dda
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/runtests_without_tests_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.runtests_without_tests;
+
+import 'package:unittest/unittest.dart';
+
+import 'package:metatest/metatest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestResults('runTests() without tests', () {
+    group('no tests', () {});
+  }, []);
+}
diff --git a/mojo/public/dart/third_party/unittest/test/setup_and_teardown_test.dart b/mojo/public/dart/third_party/unittest/test/setup_and_teardown_test.dart
new file mode 100644
index 0000000..3712137
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/setup_and_teardown_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.setup_and_teardown_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'package:metatest/metatest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestsPass('setup and teardown test', () {
+    var hasSetup = false;
+    var hasTeardown = false;
+
+    group('a', () {
+      setUp(() {
+        hasSetup = true;
+      });
+      tearDown(() {
+        hasTeardown = true;
+      });
+      test('test', () {});
+    });
+
+    test('verify', () {
+      expect(hasSetup, isTrue);
+      expect(hasTeardown, isTrue);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/setup_test.dart b/mojo/public/dart/third_party/unittest/test/setup_test.dart
new file mode 100644
index 0000000..ba27b44
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/setup_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.setup_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'package:metatest/metatest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestsPass('setup test', () {
+    group('a', () {
+      var hasSetup = false;
+      setUp(() {
+        hasSetup = true;
+      });
+      test('test', () {
+        expect(hasSetup, isTrue);
+      });
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/single_correct_test.dart b/mojo/public/dart/third_party/unittest/test/single_correct_test.dart
new file mode 100644
index 0000000..a6b4155
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/single_correct_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.single_correct_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'package:metatest/metatest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestsPass('single correct test', () {
+    test('test', () => expect(2 + 3, equals(5)));
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/single_failing_test.dart b/mojo/public/dart/third_party/unittest/test/single_failing_test.dart
new file mode 100644
index 0000000..e9c1819
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/single_failing_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.single_failing_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'package:metatest/metatest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestsFail('single failing test', () {
+    test('test', () => expect(2 + 2, equals(5)));
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/skipped_soloed_nested_test.dart b/mojo/public/dart/third_party/unittest/test/skipped_soloed_nested_test.dart
new file mode 100644
index 0000000..1e590e7
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/skipped_soloed_nested_test.dart
@@ -0,0 +1,87 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.skipped_soloed_nested_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'package:metatest/metatest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestResults('skipped/soloed nested groups with setup/teardown', () {
+    StringBuffer s = null;
+    setUp(() {
+      if (s == null) s = new StringBuffer();
+    });
+    test('top level', () {
+      s.write('A');
+    });
+    skip_test('skipped top level', () {
+      s.write('B');
+    });
+    skip_group('skipped top level group', () {
+      setUp(() {
+        s.write('C');
+      });
+      solo_test('skipped solo nested test', () {
+        s.write('D');
+      });
+    });
+    group('non-solo group', () {
+      setUp(() {
+        s.write('E');
+      });
+      test('in non-solo group', () {
+        s.write('F');
+      });
+      solo_test('solo_test in non-solo group', () {
+        s.write('G');
+      });
+    });
+    solo_group('solo group', () {
+      setUp(() {
+        s.write('H');
+      });
+      test('solo group non-solo test', () {
+        s.write('I');
+      });
+      solo_test('solo group solo test', () {
+        s.write('J');
+      });
+      group('nested non-solo group in solo group', () {
+        test('nested non-solo group non-solo test', () {
+          s.write('K');
+        });
+        solo_test('nested non-solo group solo test', () {
+          s.write('L');
+        });
+      });
+    });
+    solo_test('final', () {
+      expect(s.toString(), "EGHIHJHKHL");
+    });
+  }, [
+    {
+      'description': 'non-solo group solo_test in non-solo group',
+      'result': 'pass',
+    },
+    {'description': 'solo group solo group non-solo test', 'result': 'pass',},
+    {'description': 'solo group solo group solo test', 'result': 'pass',},
+    {
+      'description': 'solo group nested non-solo group in solo group '
+          'nested non-solo group non-solo test',
+      'result': 'pass',
+    },
+    {
+      'description': 'solo group nested non-solo group in solo group '
+          'nested non-solo group solo test',
+      'result': 'pass',
+    },
+    {'description': 'final', 'result': 'pass',}
+  ]);
+}
diff --git a/mojo/public/dart/third_party/unittest/test/string_matchers_test.dart b/mojo/public/dart/third_party/unittest/test/string_matchers_test.dart
new file mode 100644
index 0000000..511187d
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/string_matchers_test.dart
@@ -0,0 +1,114 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.string_matchers_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'test_utils.dart';
+
+void main() {
+  initUtils();
+
+  test('Reports mismatches in whitespace and escape sequences', () {
+    shouldFail('before\nafter', equals('before\\nafter'),
+        contains('Differ at offset 7'));
+  });
+
+  test('collapseWhitespace', () {
+    var source = '\t\r\n hello\t\r\n world\r\t \n';
+    expect(collapseWhitespace(source), 'hello world');
+  });
+
+  test('isEmpty', () {
+    shouldPass('', isEmpty);
+    shouldFail(null, isEmpty, startsWith("Expected: empty  Actual: <null>"));
+    shouldFail(0, isEmpty, startsWith("Expected: empty  Actual: <0>"));
+    shouldFail('a', isEmpty, startsWith("Expected: empty  Actual: 'a'"));
+  });
+
+  // Regression test for: https://code.google.com/p/dart/issues/detail?id=21562
+  test('isNot(isEmpty)', () {
+    shouldPass('a', isNot(isEmpty));
+    shouldFail('', isNot(isEmpty), 'Expected: not empty Actual: \'\'');
+    shouldFail(null, isNot(isEmpty),
+        startsWith('Expected: not empty  Actual: <null>'));
+  });
+
+  test('isNotEmpty', () {
+    shouldFail('', isNotEmpty, startsWith("Expected: non-empty  Actual: ''"));
+    shouldFail(
+        null, isNotEmpty, startsWith("Expected: non-empty  Actual: <null>"));
+    shouldFail(0, isNotEmpty, startsWith("Expected: non-empty  Actual: <0>"));
+    shouldPass('a', isNotEmpty);
+  });
+
+  test('equalsIgnoringCase', () {
+    shouldPass('hello', equalsIgnoringCase('HELLO'));
+    shouldFail('hi', equalsIgnoringCase('HELLO'),
+        "Expected: 'HELLO' ignoring case Actual: 'hi'");
+  });
+
+  test('equalsIgnoringWhitespace', () {
+    shouldPass(' hello   world  ', equalsIgnoringWhitespace('hello world'));
+    shouldFail(' helloworld  ', equalsIgnoringWhitespace('hello world'),
+        "Expected: 'hello world' ignoring whitespace "
+        "Actual: ' helloworld ' "
+        "Which: is 'helloworld' with whitespace compressed");
+  });
+
+  test('startsWith', () {
+    shouldPass('hello', startsWith(''));
+    shouldPass('hello', startsWith('hell'));
+    shouldPass('hello', startsWith('hello'));
+    shouldFail('hello', startsWith('hello '),
+        "Expected: a string starting with 'hello ' "
+        "Actual: 'hello'");
+  });
+
+  test('endsWith', () {
+    shouldPass('hello', endsWith(''));
+    shouldPass('hello', endsWith('lo'));
+    shouldPass('hello', endsWith('hello'));
+    shouldFail('hello', endsWith(' hello'),
+        "Expected: a string ending with ' hello' "
+        "Actual: 'hello'");
+  });
+
+  test('contains', () {
+    shouldPass('hello', contains(''));
+    shouldPass('hello', contains('h'));
+    shouldPass('hello', contains('o'));
+    shouldPass('hello', contains('hell'));
+    shouldPass('hello', contains('hello'));
+    shouldFail(
+        'hello', contains(' '), "Expected: contains ' ' Actual: 'hello'");
+  });
+
+  test('stringContainsInOrder', () {
+    shouldPass('goodbye cruel world', stringContainsInOrder(['']));
+    shouldPass('goodbye cruel world', stringContainsInOrder(['goodbye']));
+    shouldPass('goodbye cruel world', stringContainsInOrder(['cruel']));
+    shouldPass('goodbye cruel world', stringContainsInOrder(['world']));
+    shouldPass(
+        'goodbye cruel world', stringContainsInOrder(['good', 'bye', 'world']));
+    shouldPass(
+        'goodbye cruel world', stringContainsInOrder(['goodbye', 'cruel']));
+    shouldPass(
+        'goodbye cruel world', stringContainsInOrder(['cruel', 'world']));
+    shouldPass('goodbye cruel world',
+        stringContainsInOrder(['goodbye', 'cruel', 'world']));
+    shouldFail('goodbye cruel world',
+        stringContainsInOrder(['goo', 'cruel', 'bye']),
+        "Expected: a string containing 'goo', 'cruel', 'bye' in order "
+        "Actual: 'goodbye cruel world'");
+  });
+
+  test('matches', () {
+    shouldPass('c0d', matches('[a-z][0-9][a-z]'));
+    shouldPass('c0d', matches(new RegExp('[a-z][0-9][a-z]')));
+    shouldFail('cOd', matches('[a-z][0-9][a-z]'),
+        "Expected: match '[a-z][0-9][a-z]' Actual: 'cOd'");
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/teardown_test.dart b/mojo/public/dart/third_party/unittest/test/teardown_test.dart
new file mode 100644
index 0000000..b1f6ee0
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/teardown_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.teardown_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'package:metatest/metatest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestsPass('teardown test', () {
+    var tornDown = false;
+
+    group('a', () {
+      tearDown(() {
+        tornDown = true;
+      });
+      test('test', () {});
+    });
+
+    test('expect teardown', () {
+      expect(tornDown, isTrue);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/test_common.dart b/mojo/public/dart/third_party/unittest/test/test_common.dart
new file mode 100644
index 0000000..7d7d70b
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/test_common.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.test_common;
+
+import 'dart:collection';
+
+import 'package:unittest/unittest.dart';
+
+class Widget {
+  int price;
+}
+
+class HasPrice extends CustomMatcher {
+  HasPrice(matcher) : super("Widget with a price that is", "price", matcher);
+  featureValueOf(actual) => actual.price;
+}
+
+class SimpleIterable extends IterableBase<int> {
+  final int count;
+
+  SimpleIterable(this.count);
+
+  bool contains(int val) => count < val ? false : true;
+
+  bool any(bool f(element)) {
+    for (var i = 0; i <= count; i++) {
+      if (f(i)) return true;
+    }
+    return false;
+  }
+
+  String toString() => "<[$count]>";
+
+  Iterator get iterator {
+    return new _SimpleIterator(count);
+  }
+}
+
+class _SimpleIterator implements Iterator<int> {
+  int _count;
+  int _current;
+
+  _SimpleIterator(this._count);
+
+  bool moveNext() {
+    if (_count > 0) {
+      _current = _count;
+      _count--;
+      return true;
+    }
+    _current = null;
+    return false;
+  }
+
+  int get current => _current;
+}
diff --git a/mojo/public/dart/third_party/unittest/test/test_utils.dart b/mojo/public/dart/third_party/unittest/test/test_utils.dart
new file mode 100644
index 0000000..d0adda2
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/test_utils.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.test_utils;
+
+import 'dart:async';
+
+import 'package:unittest/unittest.dart';
+
+int _errorCount;
+String _errorString;
+FailureHandler _testHandler = null;
+
+class MyFailureHandler extends DefaultFailureHandler {
+  void fail(String reason) {
+    ++_errorCount;
+    _errorString = reason;
+  }
+}
+
+void initUtils() {
+  if (_testHandler == null) {
+    _testHandler = new MyFailureHandler();
+  }
+}
+
+void shouldFail(value, Matcher matcher, expected, {bool isAsync: false}) {
+  configureExpectFailureHandler(_testHandler);
+  _errorCount = 0;
+  _errorString = '';
+  expect(value, matcher);
+  afterTest() {
+    configureExpectFailureHandler(null);
+    expect(_errorCount, equals(1));
+    if (expected is String) {
+      expect(_errorString, equalsIgnoringWhitespace(expected));
+    } else {
+      expect(_errorString.replaceAll('\n', ''), expected);
+    }
+  }
+
+  if (isAsync) {
+    Timer.run(expectAsync(afterTest));
+  } else {
+    afterTest();
+  }
+}
+
+void shouldPass(value, Matcher matcher, {bool isAsync: false}) {
+  configureExpectFailureHandler(_testHandler);
+  _errorCount = 0;
+  _errorString = '';
+  expect(value, matcher);
+  afterTest() {
+    configureExpectFailureHandler(null);
+    expect(_errorCount, equals(0));
+  }
+  if (isAsync) {
+    Timer.run(expectAsync(afterTest));
+  } else {
+    afterTest();
+  }
+}
+
+doesNotThrow() {}
+doesThrow() {
+  throw 'X';
+}
+
+class PrefixMatcher extends Matcher {
+  final String _prefix;
+  const PrefixMatcher(this._prefix);
+  bool matches(item, Map matchState) {
+    return item is String &&
+        (collapseWhitespace(item)).startsWith(collapseWhitespace(_prefix));
+  }
+
+  Description describe(Description description) => description
+      .add('a string starting with ')
+      .addDescriptionOf(collapseWhitespace(_prefix))
+      .add(' ignoring whitespace');
+}
diff --git a/mojo/public/dart/third_party/unittest/test/testcases_immutable_test.dart b/mojo/public/dart/third_party/unittest/test/testcases_immutable_test.dart
new file mode 100644
index 0000000..c744fa1
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/testcases_immutable_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.testcases_immutable;
+
+import 'package:unittest/unittest.dart';
+
+import 'package:metatest/metatest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message);
+
+  expectTestsPass('testcases immutable', () {
+    test('test', () {
+      expect(() => testCases.clear(), throwsUnsupportedError);
+      expect(() => testCases.removeLast(), throwsUnsupportedError);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/unittest/test/throws_matchers_test.dart b/mojo/public/dart/third_party/unittest/test/throws_matchers_test.dart
new file mode 100644
index 0000000..7833f9a
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/throws_matchers_test.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.matcher.core_matchers_test;
+
+import 'package:unittest/unittest.dart';
+
+import 'test_utils.dart';
+
+void main() {
+  initUtils();
+
+  test('throws', () {
+    shouldFail(doesNotThrow, throws, matches(r"Expected: throws"
+        r"  Actual: <Closure(: \(\) => dynamic "
+        r"from Function 'doesNotThrow': static\.)?>"
+        r"   Which: did not throw"));
+    shouldPass(doesThrow, throws);
+    shouldFail(true, throws, "Expected: throws"
+        "  Actual: <true>"
+        "   Which: is not a Function or Future");
+  });
+
+  test('throwsA', () {
+    shouldPass(doesThrow, throwsA(equals('X')));
+    shouldFail(doesThrow, throwsA(equals('Y')), matches(r"Expected: throws 'Y'"
+        r"  Actual: <Closure(: \(\) => dynamic "
+        r"from Function 'doesThrow': static\.)?>"
+        r"   Which: threw 'X'"));
+  });
+
+  test('throwsA', () {
+    shouldPass(doesThrow, throwsA(equals('X')));
+    shouldFail(doesThrow, throwsA(equals('Y')), matches("Expected: throws 'Y'.*"
+        "Actual: <Closure.*"
+        "Which: threw 'X'"));
+  });
+
+  group('exception/error matchers', () {
+    test('throwsCyclicInitializationError', () {
+      expect(() => _Bicycle.foo, throwsCyclicInitializationError);
+    });
+
+    test('throwsConcurrentModificationError', () {
+      expect(() {
+        var a = {'foo': 'bar'};
+        for (var k in a.keys) {
+          a.remove(k);
+        }
+      }, throwsConcurrentModificationError);
+    });
+
+    test('throwsNullThrownError', () {
+      expect(() => throw null, throwsNullThrownError);
+    });
+  });
+}
+
+class _Bicycle {
+  static final foo = bar();
+
+  static bar() {
+    return foo + 1;
+  }
+}
diff --git a/mojo/public/dart/third_party/unittest/test/with_test_environment_test.dart b/mojo/public/dart/third_party/unittest/test/with_test_environment_test.dart
new file mode 100644
index 0000000..456384f
--- /dev/null
+++ b/mojo/public/dart/third_party/unittest/test/with_test_environment_test.dart
@@ -0,0 +1,84 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library unittest.with_test_environment_test;
+
+import 'dart:async';
+import 'package:unittest/unittest.dart';
+
+class TestConfiguration extends SimpleConfiguration {
+  final Completer _completer = new Completer();
+  List<TestCase> _results;
+
+  TestConfiguration();
+
+  void onSummary(int passed, int failed, int errors, List<TestCase> results,
+      String uncaughtError) {
+    super.onSummary(passed, failed, errors, results, uncaughtError);
+    _results = results;
+  }
+
+  Future get done => _completer.future;
+
+  onDone(success) {
+    new Future.sync(() => super.onDone(success))
+        .then(_completer.complete)
+        .catchError(_completer.completeError);
+  }
+
+  bool checkIfTestRan(String testName) {
+    return _results.any((test) => test.description == testName);
+  }
+}
+
+Future runUnittests(Function callback) {
+  TestConfiguration config = unittestConfiguration = new TestConfiguration();
+  callback();
+
+  return config.done;
+}
+
+void runTests() {
+  test('test', () => expect(2 + 3, equals(5)));
+}
+
+void runTests1() {
+  test('test1', () => expect(4 + 3, equals(7)));
+}
+
+// Test that we can run two different sets of tests in the same run using the
+// withTestEnvironment method.
+void main() {
+  // Check that setting config a second time does not change the configuration
+  runUnittests(runTests);
+  var config = unittestConfiguration;
+  runUnittests(runTests1);
+  expect(config, unittestConfiguration);
+
+  // Test that we can run both when encapsulating in their own private test
+  // environment. Also test that the tests actually running are the ones
+  // scheduled in the runTests/runTests1 methods.
+  withTestEnvironment(() {
+    runUnittests(runTests).whenComplete(() {
+      TestConfiguration config = unittestConfiguration;
+      expect(config.checkIfTestRan('test'), true);
+      expect(config.checkIfTestRan('test1'), false);
+    });
+  });
+  withTestEnvironment(() {
+    runUnittests(runTests1).whenComplete(() {
+      TestConfiguration config = unittestConfiguration;
+      expect(config.checkIfTestRan('test'), false);
+      expect(config.checkIfTestRan('test1'), true);
+    });
+  });
+
+  // Third test that we can run with two nested test environments.
+  withTestEnvironment(() {
+    runUnittests(runTests);
+    withTestEnvironment(() {
+      runUnittests(runTests1);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/update_packages.py b/mojo/public/dart/third_party/update_packages.py
new file mode 100755
index 0000000..160d2a1
--- /dev/null
+++ b/mojo/public/dart/third_party/update_packages.py
@@ -0,0 +1,72 @@
+#!/usr/bin/env python
+#
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Utility for updating third_party packages used in the Mojo Dart SDK"""
+
+import argparse
+import errno
+import json
+import os
+import shutil
+import subprocess
+import sys
+
+SCRIPT_DIR = os.path.dirname(sys.argv[0])
+
+def check_for_pubspec_yaml():
+  return os.path.exists(os.path.join(SCRIPT_DIR, 'pubspec.yaml'))
+
+def change_directory(directory):
+  return os.chdir(directory)
+
+def remove_existing_packages(base_path):
+  print('Removing all package directories under %s' % base_path)
+  for child in os.listdir(base_path):
+    path = os.path.join(base_path, child)
+    if os.path.isdir(path):
+      print('Removing %s ' % path)
+      shutil.rmtree(path)
+
+def pub_get(pub_exe):
+  return subprocess.check_output([pub_exe, 'get'])
+
+def copy_packages(base_path):
+  packages_path = os.path.join(base_path, 'packages')
+  for package in os.listdir(packages_path):
+    lib_path = os.path.realpath(os.path.join(packages_path, package))
+    package_path = os.path.normpath(os.path.join(lib_path, '..'))
+    destinaton_path = os.path.join(base_path, package)
+    print('Copying %s to %s' % (package_path, destinaton_path))
+    shutil.copytree(package_path, destinaton_path)
+
+def cleanup(base_path):
+  shutil.rmtree(os.path.join(base_path, 'packages'), True)
+  shutil.rmtree(os.path.join(base_path, '.pub'), True)
+  os.remove(os.path.join(base_path, '.packages'))
+
+def main():
+  parser = argparse.ArgumentParser(description='Update third_party packages')
+  parser.add_argument('--pub-exe',
+                      action='store',
+                      metavar='pub_exe',
+                      help='Path to the pub executable',
+                      default='../../../../third_party/dart-sdk/dart-sdk/bin/pub')
+
+  args = parser.parse_args()
+  if not check_for_pubspec_yaml():
+    print('Error could not find pubspec.yaml')
+    return 1
+
+  remove_existing_packages(SCRIPT_DIR)
+  change_directory(SCRIPT_DIR)
+  print('Running pub get')
+  pub_get(args.pub_exe)
+  copy_packages(SCRIPT_DIR)
+  print('Cleaning up')
+  cleanup(SCRIPT_DIR)
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/mojo/public/dart/third_party/utf/LICENSE b/mojo/public/dart/third_party/utf/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/mojo/public/dart/third_party/utf/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/utf/README.md b/mojo/public/dart/third_party/utf/README.md
new file mode 100644
index 0000000..fc68063
--- /dev/null
+++ b/mojo/public/dart/third_party/utf/README.md
@@ -0,0 +1,5 @@
+A Unicode manipulation library for Dart.
+
+The utf package provides common operations for manipulating Unicode sequences.
+In its initial form it is a copy of the `dart:utf` library before that was
+deprecated.
diff --git a/mojo/public/dart/third_party/utf/lib/src/constants.dart b/mojo/public/dart/third_party/utf/lib/src/constants.dart
new file mode 100644
index 0000000..3dfea39
--- /dev/null
+++ b/mojo/public/dart/third_party/utf/lib/src/constants.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library utf.constants;
+
+/**
+ * Invalid codepoints or encodings may be substituted with the value U+fffd.
+ */
+const int UNICODE_REPLACEMENT_CHARACTER_CODEPOINT = 0xfffd;
+const int UNICODE_BOM = 0xfeff;
+const int UNICODE_UTF_BOM_LO = 0xff;
+const int UNICODE_UTF_BOM_HI = 0xfe;
+
+const int UNICODE_BYTE_ZERO_MASK = 0xff;
+const int UNICODE_BYTE_ONE_MASK = 0xff00;
+const int UNICODE_VALID_RANGE_MAX = 0x10ffff;
+const int UNICODE_PLANE_ONE_MAX = 0xffff;
+const int UNICODE_UTF16_RESERVED_LO = 0xd800;
+const int UNICODE_UTF16_RESERVED_HI = 0xdfff;
+const int UNICODE_UTF16_OFFSET = 0x10000;
+const int UNICODE_UTF16_SURROGATE_UNIT_0_BASE = 0xd800;
+const int UNICODE_UTF16_SURROGATE_UNIT_1_BASE = 0xdc00;
+const int UNICODE_UTF16_HI_MASK = 0xffc00;
+const int UNICODE_UTF16_LO_MASK = 0x3ff;
diff --git a/mojo/public/dart/third_party/utf/lib/src/list_range.dart b/mojo/public/dart/third_party/utf/lib/src/list_range.dart
new file mode 100644
index 0000000..2f3b34d
--- /dev/null
+++ b/mojo/public/dart/third_party/utf/lib/src/list_range.dart
@@ -0,0 +1,79 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library utf.list_range;
+
+import 'dart:collection';
+
+/**
+ * _ListRange in an internal type used to create a lightweight Interable on a
+ * range within a source list. DO NOT MODIFY the underlying list while
+ * iterating over it. The results of doing so are undefined.
+ */
+// TODO(floitsch): Consider removing the extend and switch to implements since
+// that's cheaper to allocate.
+class ListRange extends IterableBase {
+  final List _source;
+  final int _offset;
+  final int _length;
+
+  ListRange(source, [offset = 0, length]) :
+      this._source = source,
+      this._offset = offset,
+      this._length = (length == null ? source.length - offset : length) {
+    if (_offset < 0 || _offset > _source.length) {
+      throw new RangeError.value(_offset);
+    }
+    if (_length != null && (_length < 0)) {
+      throw new RangeError.value(_length);
+    }
+    if (_length + _offset > _source.length) {
+      throw new RangeError.value(_length + _offset);
+    }
+  }
+
+  ListRangeIterator get iterator =>
+      new _ListRangeIteratorImpl(_source, _offset, _offset + _length);
+
+  int get length => _length;
+}
+
+/**
+ * The ListRangeIterator provides more capabilities than a standard iterator,
+ * including the ability to get the current position, count remaining items,
+ * and move forward/backward within the iterator.
+ */
+abstract class ListRangeIterator implements Iterator<int> {
+  bool moveNext();
+  int get current;
+  int get position;
+  void backup([int by]);
+  int get remaining;
+  void skip([int count]);
+}
+
+class _ListRangeIteratorImpl implements ListRangeIterator {
+  final List<int> _source;
+  int _offset;
+  final int _end;
+
+  _ListRangeIteratorImpl(this._source, int offset, this._end)
+      : _offset = offset - 1;
+
+  int get current => _source[_offset];
+
+  bool moveNext() => ++_offset < _end;
+
+  int get position => _offset;
+
+  void backup([int by = 1]) {
+    _offset -= by;
+  }
+
+  int get remaining => _end - _offset - 1;
+
+  void skip([int count = 1]) {
+    _offset += count;
+  }
+}
diff --git a/mojo/public/dart/third_party/utf/lib/src/utf/utf16.dart b/mojo/public/dart/third_party/utf/lib/src/utf/utf16.dart
new file mode 100644
index 0000000..8ddd4dd
--- /dev/null
+++ b/mojo/public/dart/third_party/utf/lib/src/utf/utf16.dart
@@ -0,0 +1,361 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of utf;
+
+// TODO(jmesserly): would be nice to have this on String (dartbug.com/6501).
+/**
+ * Provide a list of Unicode codepoints for a given string.
+ */
+List<int> stringToCodepoints(String str) {
+  // Note: str.codeUnits gives us 16-bit code units on all Dart implementations.
+  // So we need to convert.
+  return utf16CodeUnitsToCodepoints(str.codeUnits);
+}
+
+/**
+ * Generate a string from the provided Unicode codepoints.
+ *
+ * *Deprecated* Use [String.fromCharCodes] instead.
+ */
+@deprecated
+String codepointsToString(List<int> codepoints) {
+  return new String.fromCharCodes(codepoints);
+}
+/**
+ * Decodes the UTF-16 bytes as an iterable. Thus, the consumer can only convert
+ * as much of the input as needed. Determines the byte order from the BOM,
+ * or uses big-endian as a default. This method always strips a leading BOM.
+ * Set the [replacementCodepoint] to null to throw an ArgumentError
+ * rather than replace the bad value. The default value for
+ * [replacementCodepoint] is U+FFFD.
+ */
+IterableUtf16Decoder decodeUtf16AsIterable(List<int> bytes, [int offset = 0,
+    int length, int replacementCodepoint =
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+  return new IterableUtf16Decoder._(
+      () => new Utf16BytesToCodeUnitsDecoder(bytes, offset, length,
+      replacementCodepoint), replacementCodepoint);
+}
+
+/**
+ * Decodes the UTF-16BE bytes as an iterable. Thus, the consumer can only
+ * convert as much of the input as needed. This method strips a leading BOM by
+ * default, but can be overridden by setting the optional parameter [stripBom]
+ * to false. Set the [replacementCodepoint] to null to throw an
+ * ArgumentError rather than replace the bad value. The default
+ * value for the [replacementCodepoint] is U+FFFD.
+ */
+IterableUtf16Decoder decodeUtf16beAsIterable(List<int> bytes, [int offset = 0,
+    int length, bool stripBom = true, int replacementCodepoint =
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+  return new IterableUtf16Decoder._(
+      () => new Utf16beBytesToCodeUnitsDecoder(bytes, offset, length, stripBom,
+      replacementCodepoint), replacementCodepoint);
+}
+
+/**
+ * Decodes the UTF-16LE bytes as an iterable. Thus, the consumer can only
+ * convert as much of the input as needed. This method strips a leading BOM by
+ * default, but can be overridden by setting the optional parameter [stripBom]
+ * to false. Set the [replacementCodepoint] to null to throw an
+ * ArgumentError rather than replace the bad value. The default
+ * value for the [replacementCodepoint] is U+FFFD.
+ */
+IterableUtf16Decoder decodeUtf16leAsIterable(List<int> bytes, [int offset = 0,
+    int length, bool stripBom = true, int replacementCodepoint =
+    UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+  return new IterableUtf16Decoder._(
+      () => new Utf16leBytesToCodeUnitsDecoder(bytes, offset, length, stripBom,
+      replacementCodepoint), replacementCodepoint);
+}
+
+/**
+ * Produce a String from a sequence of UTF-16 encoded bytes. This method always
+ * strips a leading BOM. Set the [replacementCodepoint] to null to throw  an
+ * ArgumentError rather than replace the bad value. The default
+ * value for the [replacementCodepoint] is U+FFFD.
+ */
+String decodeUtf16(List<int> bytes, [int offset = 0, int length,
+    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+  Utf16BytesToCodeUnitsDecoder decoder = new Utf16BytesToCodeUnitsDecoder(bytes,
+      offset, length, replacementCodepoint);
+  List<int> codeunits = decoder.decodeRest();
+  return new String.fromCharCodes(
+      utf16CodeUnitsToCodepoints(codeunits, 0, null, replacementCodepoint));
+}
+
+/**
+ * Produce a String from a sequence of UTF-16BE encoded bytes. This method
+ * strips a leading BOM by default, but can be overridden by setting the
+ * optional parameter [stripBom] to false. Set the [replacementCodepoint] to
+ * null to throw an ArgumentError rather than replace the bad value.
+ * The default value for the [replacementCodepoint] is U+FFFD.
+ */
+String decodeUtf16be(List<int> bytes, [int offset = 0, int length,
+    bool stripBom = true,
+    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+  List<int> codeunits = (new Utf16beBytesToCodeUnitsDecoder(bytes, offset,
+      length, stripBom, replacementCodepoint)).decodeRest();
+  return new String.fromCharCodes(
+      utf16CodeUnitsToCodepoints(codeunits, 0, null, replacementCodepoint));
+}
+
+/**
+ * Produce a String from a sequence of UTF-16LE encoded bytes. This method
+ * strips a leading BOM by default, but can be overridden by setting the
+ * optional parameter [stripBom] to false. Set the [replacementCodepoint] to
+ * null to throw an ArgumentError rather than replace the bad value.
+ * The default value for the [replacementCodepoint] is U+FFFD.
+ */
+String decodeUtf16le(List<int> bytes, [int offset = 0, int length,
+    bool stripBom = true,
+    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+  List<int> codeunits = (new Utf16leBytesToCodeUnitsDecoder(bytes, offset,
+      length, stripBom, replacementCodepoint)).decodeRest();
+  return new String.fromCharCodes(
+      utf16CodeUnitsToCodepoints(codeunits, 0, null, replacementCodepoint));
+}
+
+/**
+ * Produce a list of UTF-16 encoded bytes. This method prefixes the resulting
+ * bytes with a big-endian byte-order-marker.
+ */
+List<int> encodeUtf16(String str) =>
+    encodeUtf16be(str, true);
+
+/**
+ * Produce a list of UTF-16BE encoded bytes. By default, this method produces
+ * UTF-16BE bytes with no BOM.
+ */
+List<int> encodeUtf16be(String str, [bool writeBOM = false]) {
+  List<int> utf16CodeUnits = _stringToUtf16CodeUnits(str);
+  List<int> encoding =
+      new List<int>(2 * utf16CodeUnits.length + (writeBOM ? 2 : 0));
+  int i = 0;
+  if (writeBOM) {
+    encoding[i++] = UNICODE_UTF_BOM_HI;
+    encoding[i++] = UNICODE_UTF_BOM_LO;
+  }
+  for (int unit in utf16CodeUnits) {
+    encoding[i++] = (unit & UNICODE_BYTE_ONE_MASK) >> 8;
+    encoding[i++] = unit & UNICODE_BYTE_ZERO_MASK;
+  }
+  return encoding;
+}
+
+/**
+ * Produce a list of UTF-16LE encoded bytes. By default, this method produces
+ * UTF-16LE bytes with no BOM.
+ */
+List<int> encodeUtf16le(String str, [bool writeBOM = false]) {
+  List<int> utf16CodeUnits = _stringToUtf16CodeUnits(str);
+  List<int> encoding =
+      new List<int>(2 * utf16CodeUnits.length + (writeBOM ? 2 : 0));
+  int i = 0;
+  if (writeBOM) {
+    encoding[i++] = UNICODE_UTF_BOM_LO;
+    encoding[i++] = UNICODE_UTF_BOM_HI;
+  }
+  for (int unit in utf16CodeUnits) {
+    encoding[i++] = unit & UNICODE_BYTE_ZERO_MASK;
+    encoding[i++] = (unit & UNICODE_BYTE_ONE_MASK) >> 8;
+  }
+  return encoding;
+}
+
+/**
+ * Identifies whether a List of bytes starts (based on offset) with a
+ * byte-order marker (BOM).
+ */
+bool hasUtf16Bom(List<int> utf32EncodedBytes, [int offset = 0, int length]) {
+  return hasUtf16beBom(utf32EncodedBytes, offset, length) ||
+      hasUtf16leBom(utf32EncodedBytes, offset, length);
+}
+
+/**
+ * Identifies whether a List of bytes starts (based on offset) with a
+ * big-endian byte-order marker (BOM).
+ */
+bool hasUtf16beBom(List<int> utf16EncodedBytes, [int offset = 0, int length]) {
+  int end = length != null ? offset + length : utf16EncodedBytes.length;
+  return (offset + 2) <= end &&
+      utf16EncodedBytes[offset] == UNICODE_UTF_BOM_HI &&
+      utf16EncodedBytes[offset + 1] == UNICODE_UTF_BOM_LO;
+}
+
+/**
+ * Identifies whether a List of bytes starts (based on offset) with a
+ * little-endian byte-order marker (BOM).
+ */
+bool hasUtf16leBom(List<int> utf16EncodedBytes, [int offset = 0, int length]) {
+  int end = length != null ? offset + length : utf16EncodedBytes.length;
+  return (offset + 2) <= end &&
+      utf16EncodedBytes[offset] == UNICODE_UTF_BOM_LO &&
+      utf16EncodedBytes[offset + 1] == UNICODE_UTF_BOM_HI;
+}
+
+List<int> _stringToUtf16CodeUnits(String str) {
+  return codepointsToUtf16CodeUnits(str.codeUnits);
+}
+
+typedef ListRangeIterator _CodeUnitsProvider();
+
+/**
+ * Return type of [decodeUtf16AsIterable] and variants. The Iterable type
+ * provides an iterator on demand and the iterator will only translate bytes
+ * as requested by the user of the iterator. (Note: results are not cached.)
+ */
+// TODO(floitsch): Consider removing the extend and switch to implements since
+// that's cheaper to allocate.
+class IterableUtf16Decoder extends IterableBase<int> {
+  final _CodeUnitsProvider codeunitsProvider;
+  final int replacementCodepoint;
+
+  IterableUtf16Decoder._(this.codeunitsProvider, this.replacementCodepoint);
+
+  Utf16CodeUnitDecoder get iterator =>
+      new Utf16CodeUnitDecoder.fromListRangeIterator(codeunitsProvider(),
+          replacementCodepoint);
+}
+
+/**
+ * Convert UTF-16 encoded bytes to UTF-16 code units by grouping 1-2 bytes
+ * to produce the code unit (0-(2^16)-1). Relies on BOM to determine
+ * endian-ness, and defaults to BE.
+ */
+abstract class Utf16BytesToCodeUnitsDecoder implements ListRangeIterator {
+  // TODO(kevmoo): should this field be private?
+  final ListRangeIterator utf16EncodedBytesIterator;
+  final int replacementCodepoint;
+  int _current = null;
+
+  Utf16BytesToCodeUnitsDecoder._fromListRangeIterator(
+      this.utf16EncodedBytesIterator, this.replacementCodepoint);
+
+  factory Utf16BytesToCodeUnitsDecoder(List<int> utf16EncodedBytes, [
+      int offset = 0, int length,
+      int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+    if (length == null) {
+      length = utf16EncodedBytes.length - offset;
+    }
+    if (hasUtf16beBom(utf16EncodedBytes, offset, length)) {
+      return new Utf16beBytesToCodeUnitsDecoder(utf16EncodedBytes, offset + 2,
+          length - 2, false, replacementCodepoint);
+    } else if (hasUtf16leBom(utf16EncodedBytes, offset, length)) {
+      return new Utf16leBytesToCodeUnitsDecoder(utf16EncodedBytes, offset + 2,
+          length - 2, false, replacementCodepoint);
+    } else {
+      return new Utf16beBytesToCodeUnitsDecoder(utf16EncodedBytes, offset,
+          length, false, replacementCodepoint);
+    }
+  }
+
+  /**
+   * Provides a fast way to decode the rest of the source bytes in a single
+   * call. This method trades memory for improved speed in that it potentially
+   * over-allocates the List containing results.
+   */
+  List<int> decodeRest() {
+    List<int> codeunits = new List<int>(remaining);
+    int i = 0;
+    while (moveNext()) {
+      codeunits[i++] = current;
+    }
+    if (i == codeunits.length) {
+      return codeunits;
+    } else {
+      List<int> truncCodeunits = new List<int>(i);
+      truncCodeunits.setRange(0, i, codeunits);
+      return truncCodeunits;
+    }
+  }
+
+  int get current => _current;
+
+  bool moveNext() {
+    _current = null;
+    int remaining = utf16EncodedBytesIterator.remaining;
+    if (remaining == 0) {
+      _current = null;
+      return false;
+    }
+    if (remaining == 1) {
+      utf16EncodedBytesIterator.moveNext();
+      if (replacementCodepoint != null) {
+        _current = replacementCodepoint;
+        return true;
+      } else {
+        throw new ArgumentError(
+            "Invalid UTF16 at ${utf16EncodedBytesIterator.position}");
+      }
+    }
+    _current = decode();
+    return true;
+  }
+
+  int get position => utf16EncodedBytesIterator.position ~/ 2;
+
+  void backup([int by = 1]) {
+    utf16EncodedBytesIterator.backup(2 * by);
+  }
+
+  int get remaining => (utf16EncodedBytesIterator.remaining + 1) ~/ 2;
+
+  void skip([int count = 1]) {
+    utf16EncodedBytesIterator.skip(2 * count);
+  }
+
+  int decode();
+}
+
+/**
+ * Convert UTF-16BE encoded bytes to utf16 code units by grouping 1-2 bytes
+ * to produce the code unit (0-(2^16)-1).
+ */
+class Utf16beBytesToCodeUnitsDecoder extends Utf16BytesToCodeUnitsDecoder {
+  Utf16beBytesToCodeUnitsDecoder(List<int> utf16EncodedBytes, [
+      int offset = 0, int length, bool stripBom = true,
+      int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
+      super._fromListRangeIterator(
+          (new ListRange(utf16EncodedBytes, offset, length)).iterator,
+          replacementCodepoint) {
+    if (stripBom && hasUtf16beBom(utf16EncodedBytes, offset, length)) {
+      skip();
+    }
+  }
+
+  int decode() {
+    utf16EncodedBytesIterator.moveNext();
+    int hi = utf16EncodedBytesIterator.current;
+    utf16EncodedBytesIterator.moveNext();
+    int lo = utf16EncodedBytesIterator.current;
+    return (hi << 8) + lo;
+  }
+}
+
+/**
+ * Convert UTF-16LE encoded bytes to utf16 code units by grouping 1-2 bytes
+ * to produce the code unit (0-(2^16)-1).
+ */
+class Utf16leBytesToCodeUnitsDecoder extends Utf16BytesToCodeUnitsDecoder {
+  Utf16leBytesToCodeUnitsDecoder(List<int> utf16EncodedBytes, [
+      int offset = 0, int length, bool stripBom = true,
+      int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
+      super._fromListRangeIterator(
+          (new ListRange(utf16EncodedBytes, offset, length)).iterator,
+          replacementCodepoint) {
+    if (stripBom && hasUtf16leBom(utf16EncodedBytes, offset, length)) {
+      skip();
+    }
+  }
+
+  int decode() {
+    utf16EncodedBytesIterator.moveNext();
+    int lo = utf16EncodedBytesIterator.current;
+    utf16EncodedBytesIterator.moveNext();
+    int hi = utf16EncodedBytesIterator.current;
+    return (hi << 8) + lo;
+  }
+}
diff --git a/mojo/public/dart/third_party/utf/lib/src/utf/utf32.dart b/mojo/public/dart/third_party/utf/lib/src/utf/utf32.dart
new file mode 100644
index 0000000..e51009d
--- /dev/null
+++ b/mojo/public/dart/third_party/utf/lib/src/utf/utf32.dart
@@ -0,0 +1,343 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of utf;
+
+/**
+ * Decodes the UTF-32 bytes as an iterable. Thus, the consumer can only convert
+ * as much of the input as needed. Determines the byte order from the BOM,
+ * or uses big-endian as a default. This method always strips a leading BOM.
+ * Set the replacementCharacter to null to throw an ArgumentError
+ * rather than replace the bad value.
+ */
+IterableUtf32Decoder decodeUtf32AsIterable(List<int> bytes, [
+    int offset = 0, int length,
+    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+  return new IterableUtf32Decoder._(
+      () => new Utf32BytesDecoder(bytes, offset, length, replacementCodepoint));
+}
+
+/**
+ * Decodes the UTF-32BE bytes as an iterable. Thus, the consumer can only convert
+ * as much of the input as needed. This method strips a leading BOM by default,
+ * but can be overridden by setting the optional parameter [stripBom] to false.
+ * Set the replacementCharacter to null to throw an ArgumentError
+ * rather than replace the bad value.
+ */
+IterableUtf32Decoder decodeUtf32beAsIterable(List<int> bytes, [
+    int offset = 0, int length, bool stripBom = true,
+    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+  return new IterableUtf32Decoder._(
+      () => new Utf32beBytesDecoder(bytes, offset, length, stripBom,
+          replacementCodepoint));
+}
+
+/**
+ * Decodes the UTF-32LE bytes as an iterable. Thus, the consumer can only convert
+ * as much of the input as needed. This method strips a leading BOM by default,
+ * but can be overridden by setting the optional parameter [stripBom] to false.
+ * Set the replacementCharacter to null to throw an ArgumentError
+ * rather than replace the bad value.
+ */
+IterableUtf32Decoder decodeUtf32leAsIterable(List<int> bytes, [
+    int offset = 0, int length, bool stripBom = true,
+    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+  return new IterableUtf32Decoder._(
+      () => new Utf32leBytesDecoder(bytes, offset, length, stripBom,
+          replacementCodepoint));
+}
+
+/**
+ * Produce a String from a sequence of UTF-32 encoded bytes. The parameters
+ * allow an offset into a list of bytes (as int), limiting the length of the
+ * values be decoded and the ability of override the default Unicode
+ * replacement character. Set the replacementCharacter to null to throw an
+ * ArgumentError rather than replace the bad value.
+ */
+String decodeUtf32(List<int> bytes, [int offset = 0, int length,
+    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+  return new String.fromCharCodes((new Utf32BytesDecoder(bytes, offset, length,
+      replacementCodepoint)).decodeRest());
+}
+/**
+ * Produce a String from a sequence of UTF-32BE encoded bytes. The parameters
+ * allow an offset into a list of bytes (as int), limiting the length of the
+ * values be decoded and the ability of override the default Unicode
+ * replacement character. Set the replacementCharacter to null to throw an
+ * ArgumentError rather than replace the bad value.
+ */
+String decodeUtf32be(
+    List<int> bytes, [int offset = 0, int length, bool stripBom = true,
+    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) =>
+  new String.fromCharCodes((new Utf32beBytesDecoder(bytes, offset, length,
+    stripBom, replacementCodepoint)).decodeRest());
+
+/**
+ * Produce a String from a sequence of UTF-32LE encoded bytes. The parameters
+ * allow an offset into a list of bytes (as int), limiting the length of the
+ * values be decoded and the ability of override the default Unicode
+ * replacement character. Set the replacementCharacter to null to throw an
+ * ArgumentError rather than replace the bad value.
+ */
+String decodeUtf32le(
+    List<int> bytes, [int offset = 0, int length, bool stripBom = true,
+    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) =>
+    new String.fromCharCodes((new Utf32leBytesDecoder(bytes, offset, length,
+      stripBom, replacementCodepoint)).decodeRest());
+
+/**
+ * Produce a list of UTF-32 encoded bytes. This method prefixes the resulting
+ * bytes with a big-endian byte-order-marker.
+ */
+List<int> encodeUtf32(String str) =>
+    encodeUtf32be(str, true);
+
+/**
+ * Produce a list of UTF-32BE encoded bytes. By default, this method produces
+ * UTF-32BE bytes with no BOM.
+ */
+List<int> encodeUtf32be(String str, [bool writeBOM = false]) {
+  List<int> utf32CodeUnits = stringToCodepoints(str);
+  List<int> encoding = new List<int>(4 * utf32CodeUnits.length +
+      (writeBOM ? 4 : 0));
+  int i = 0;
+  if (writeBOM) {
+    encoding[i++] = 0;
+    encoding[i++] = 0;
+    encoding[i++] = UNICODE_UTF_BOM_HI;
+    encoding[i++] = UNICODE_UTF_BOM_LO;
+  }
+  for (int unit in utf32CodeUnits) {
+    encoding[i++] = (unit >> 24) & UNICODE_BYTE_ZERO_MASK;
+    encoding[i++] = (unit >> 16) & UNICODE_BYTE_ZERO_MASK;
+    encoding[i++] = (unit >> 8) & UNICODE_BYTE_ZERO_MASK;
+    encoding[i++] = unit & UNICODE_BYTE_ZERO_MASK;
+  }
+  return encoding;
+}
+
+/**
+ * Produce a list of UTF-32LE encoded bytes. By default, this method produces
+ * UTF-32BE bytes with no BOM.
+ */
+List<int> encodeUtf32le(String str, [bool writeBOM = false]) {
+  List<int> utf32CodeUnits = stringToCodepoints(str);
+  List<int> encoding = new List<int>(4 * utf32CodeUnits.length +
+      (writeBOM ? 4 : 0));
+  int i = 0;
+  if (writeBOM) {
+    encoding[i++] = UNICODE_UTF_BOM_LO;
+    encoding[i++] = UNICODE_UTF_BOM_HI;
+    encoding[i++] = 0;
+    encoding[i++] = 0;
+  }
+  for (int unit in utf32CodeUnits) {
+    encoding[i++] = unit & UNICODE_BYTE_ZERO_MASK;
+    encoding[i++] = (unit >> 8) & UNICODE_BYTE_ZERO_MASK;
+    encoding[i++] = (unit >> 16) & UNICODE_BYTE_ZERO_MASK;
+    encoding[i++] = (unit >> 24) & UNICODE_BYTE_ZERO_MASK;
+  }
+  return encoding;
+}
+
+/**
+ * Identifies whether a List of bytes starts (based on offset) with a
+ * byte-order marker (BOM).
+ */
+bool hasUtf32Bom(
+    List<int> utf32EncodedBytes, [int offset = 0, int length]) {
+  return hasUtf32beBom(utf32EncodedBytes, offset, length) ||
+      hasUtf32leBom(utf32EncodedBytes, offset, length);
+}
+
+/**
+ * Identifies whether a List of bytes starts (based on offset) with a
+ * big-endian byte-order marker (BOM).
+ */
+bool hasUtf32beBom(List<int> utf32EncodedBytes, [int offset = 0, int length]) {
+  int end = length != null ? offset + length : utf32EncodedBytes.length;
+  return (offset + 4) <= end &&
+      utf32EncodedBytes[offset] == 0 && utf32EncodedBytes[offset + 1] == 0 &&
+      utf32EncodedBytes[offset + 2] == UNICODE_UTF_BOM_HI &&
+      utf32EncodedBytes[offset + 3] == UNICODE_UTF_BOM_LO;
+}
+
+/**
+ * Identifies whether a List of bytes starts (based on offset) with a
+ * little-endian byte-order marker (BOM).
+ */
+bool hasUtf32leBom(List<int> utf32EncodedBytes, [int offset = 0, int length]) {
+  int end = length != null ? offset + length : utf32EncodedBytes.length;
+  return (offset + 4) <= end &&
+      utf32EncodedBytes[offset] == UNICODE_UTF_BOM_LO &&
+      utf32EncodedBytes[offset + 1] == UNICODE_UTF_BOM_HI &&
+      utf32EncodedBytes[offset + 2] == 0 && utf32EncodedBytes[offset + 3] == 0;
+}
+
+typedef Utf32BytesDecoder Utf32BytesDecoderProvider();
+
+/**
+ * Return type of [decodeUtf32AsIterable] and variants. The Iterable type
+ * provides an iterator on demand and the iterator will only translate bytes
+ * as requested by the user of the iterator. (Note: results are not cached.)
+ */
+// TODO(floitsch): Consider removing the extend and switch to implements since
+// that's cheaper to allocate.
+class IterableUtf32Decoder extends IterableBase<int> {
+  final Utf32BytesDecoderProvider codeunitsProvider;
+
+  IterableUtf32Decoder._(this.codeunitsProvider);
+
+  Utf32BytesDecoder get iterator => codeunitsProvider();
+}
+
+/**
+ * Abstrace parent class converts encoded bytes to codepoints.
+ */
+abstract class Utf32BytesDecoder implements ListRangeIterator {
+  // TODO(kevmoo): should this field be private?
+  final ListRangeIterator utf32EncodedBytesIterator;
+  final int replacementCodepoint;
+  int _current = null;
+
+  Utf32BytesDecoder._fromListRangeIterator(
+      this.utf32EncodedBytesIterator, this.replacementCodepoint);
+
+  factory Utf32BytesDecoder(List<int> utf32EncodedBytes, [
+      int offset = 0, int length,
+      int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+    if (length == null) {
+      length = utf32EncodedBytes.length - offset;
+    }
+    if (hasUtf32beBom(utf32EncodedBytes, offset, length)) {
+      return new Utf32beBytesDecoder(utf32EncodedBytes, offset + 4, length - 4,
+          false, replacementCodepoint);
+    } else if (hasUtf32leBom(utf32EncodedBytes, offset, length)) {
+      return new Utf32leBytesDecoder(utf32EncodedBytes, offset + 4, length - 4,
+          false, replacementCodepoint);
+    } else {
+      return new Utf32beBytesDecoder(utf32EncodedBytes, offset, length, false,
+          replacementCodepoint);
+    }
+  }
+
+  List<int> decodeRest() {
+    List<int> codeunits = new List<int>(remaining);
+    int i = 0;
+    while (moveNext()) {
+      codeunits[i++] = current;
+    }
+    return codeunits;
+  }
+
+  int get current => _current;
+
+  bool moveNext() {
+    _current = null;
+    int remaining = utf32EncodedBytesIterator.remaining;
+    if (remaining == 0) {
+      _current = null;
+      return false;
+    }
+    if (remaining < 4) {
+      utf32EncodedBytesIterator.skip(utf32EncodedBytesIterator.remaining);
+      if (replacementCodepoint != null) {
+          _current = replacementCodepoint;
+          return true;
+      } else {
+        throw new ArgumentError(
+            "Invalid UTF32 at ${utf32EncodedBytesIterator.position}");
+      }
+    }
+    int codepoint = decode();
+    if (_validCodepoint(codepoint)) {
+      _current = codepoint;
+      return true;
+    } else if (replacementCodepoint != null) {
+      _current = replacementCodepoint;
+      return true;
+    } else {
+      throw new ArgumentError(
+          "Invalid UTF32 at ${utf32EncodedBytesIterator.position}");
+    }
+  }
+
+  int get position => utf32EncodedBytesIterator.position ~/ 4;
+
+  void backup([int by = 1]) {
+    utf32EncodedBytesIterator.backup(4 * by);
+  }
+
+  int get remaining => (utf32EncodedBytesIterator.remaining + 3) ~/ 4;
+
+  void skip([int count = 1]) {
+    utf32EncodedBytesIterator.skip(4 * count);
+  }
+
+  int decode();
+}
+
+/**
+ * Convert UTF-32BE encoded bytes to codepoints by grouping 4 bytes
+ * to produce the unicode codepoint.
+ */
+class Utf32beBytesDecoder extends Utf32BytesDecoder {
+  Utf32beBytesDecoder(List<int> utf32EncodedBytes, [int offset = 0,
+      int length, bool stripBom = true,
+      int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
+      super._fromListRangeIterator(
+          (new ListRange(utf32EncodedBytes, offset, length)).iterator,
+          replacementCodepoint) {
+    if (stripBom && hasUtf32beBom(utf32EncodedBytes, offset, length)) {
+      skip();
+    }
+  }
+
+  int decode() {
+    utf32EncodedBytesIterator.moveNext();
+    int value = utf32EncodedBytesIterator.current;
+    utf32EncodedBytesIterator.moveNext();
+    value = (value << 8) + utf32EncodedBytesIterator.current;
+    utf32EncodedBytesIterator.moveNext();
+    value = (value << 8) + utf32EncodedBytesIterator.current;
+    utf32EncodedBytesIterator.moveNext();
+    value = (value << 8) + utf32EncodedBytesIterator.current;
+    return value;
+  }
+}
+
+/**
+ * Convert UTF-32BE encoded bytes to codepoints by grouping 4 bytes
+ * to produce the unicode codepoint.
+ */
+class Utf32leBytesDecoder extends Utf32BytesDecoder {
+  Utf32leBytesDecoder(List<int> utf32EncodedBytes, [int offset = 0,
+      int length, bool stripBom = true,
+      int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
+      super._fromListRangeIterator(
+          (new ListRange(utf32EncodedBytes, offset, length)).iterator,
+          replacementCodepoint) {
+    if (stripBom && hasUtf32leBom(utf32EncodedBytes, offset, length)) {
+      skip();
+    }
+  }
+
+  int decode() {
+    utf32EncodedBytesIterator.moveNext();
+    int value = utf32EncodedBytesIterator.current;
+    utf32EncodedBytesIterator.moveNext();
+    value += (utf32EncodedBytesIterator.current << 8);
+    utf32EncodedBytesIterator.moveNext();
+    value += (utf32EncodedBytesIterator.current << 16);
+    utf32EncodedBytesIterator.moveNext();
+    value += (utf32EncodedBytesIterator.current << 24);
+    return value;
+  }
+}
+
+bool _validCodepoint(int codepoint) {
+  return (codepoint >= 0 && codepoint < UNICODE_UTF16_RESERVED_LO) ||
+      (codepoint > UNICODE_UTF16_RESERVED_HI &&
+      codepoint < UNICODE_VALID_RANGE_MAX);
+}
diff --git a/mojo/public/dart/third_party/utf/lib/src/utf/utf8.dart b/mojo/public/dart/third_party/utf/lib/src/utf/utf8.dart
new file mode 100644
index 0000000..ff1b1ed
--- /dev/null
+++ b/mojo/public/dart/third_party/utf/lib/src/utf/utf8.dart
@@ -0,0 +1,276 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of utf;
+
+const int _UTF8_ONE_BYTE_MAX = 0x7f;
+const int _UTF8_TWO_BYTE_MAX = 0x7ff;
+const int _UTF8_THREE_BYTE_MAX = 0xffff;
+
+const int _UTF8_LO_SIX_BIT_MASK = 0x3f;
+
+const int _UTF8_FIRST_BYTE_OF_TWO_BASE = 0xc0;
+const int _UTF8_FIRST_BYTE_OF_THREE_BASE = 0xe0;
+const int _UTF8_FIRST_BYTE_OF_FOUR_BASE = 0xf0;
+const int _UTF8_FIRST_BYTE_OF_FIVE_BASE = 0xf8;
+const int _UTF8_FIRST_BYTE_OF_SIX_BASE = 0xfc;
+
+const int _UTF8_FIRST_BYTE_OF_TWO_MASK = 0x1f;
+const int _UTF8_FIRST_BYTE_OF_THREE_MASK = 0xf;
+const int _UTF8_FIRST_BYTE_OF_FOUR_MASK = 0x7;
+
+const int _UTF8_FIRST_BYTE_BOUND_EXCL = 0xfe;
+const int _UTF8_SUBSEQUENT_BYTE_BASE = 0x80;
+
+/**
+ * Decodes the UTF-8 bytes as an iterable. Thus, the consumer can only convert
+ * as much of the input as needed. Set the replacementCharacter to null to
+ * throw an ArgumentError rather than replace the bad value.
+ */
+IterableUtf8Decoder decodeUtf8AsIterable(List<int> bytes, [int offset = 0,
+    int length,
+    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+  return new IterableUtf8Decoder(bytes, offset, length, replacementCodepoint);
+}
+
+/**
+ * Produce a String from a List of UTF-8 encoded bytes. The parameters
+ * can set an offset into a list of bytes (as int), limit the length of the
+ * values to be decoded, and override the default Unicode replacement character.
+ * Set the replacementCharacter to null to throw an ArgumentError
+ * rather than replace the bad value.
+ */
+String decodeUtf8(List<int> bytes, [int offset = 0, int length,
+    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+  return new String.fromCharCodes(
+      (new Utf8Decoder(bytes, offset, length, replacementCodepoint))
+      .decodeRest());
+}
+
+/**
+ * Produce a sequence of UTF-8 encoded bytes from the provided string.
+ */
+List<int> encodeUtf8(String str) =>
+  codepointsToUtf8(stringToCodepoints(str));
+
+int _addToEncoding(int offset, int bytes, int value, List<int> buffer) {
+  while (bytes > 0) {
+    buffer[offset + bytes] = _UTF8_SUBSEQUENT_BYTE_BASE |
+        (value & _UTF8_LO_SIX_BIT_MASK);
+    value = value >> 6;
+    bytes--;
+  }
+  return value;
+}
+
+/**
+ * Encode code points as UTF-8 code units.
+ */
+List<int> codepointsToUtf8(
+    List<int> codepoints, [int offset = 0, int length]) {
+  ListRange source = new ListRange(codepoints, offset, length);
+
+  int encodedLength = 0;
+  for (int value in source) {
+    if (value < 0 || value > UNICODE_VALID_RANGE_MAX) {
+      encodedLength += 3;
+    } else if (value <= _UTF8_ONE_BYTE_MAX) {
+      encodedLength++;
+    } else if (value <= _UTF8_TWO_BYTE_MAX) {
+      encodedLength += 2;
+    } else if (value <= _UTF8_THREE_BYTE_MAX) {
+      encodedLength += 3;
+    } else if (value <= UNICODE_VALID_RANGE_MAX) {
+      encodedLength += 4;
+    }
+  }
+
+  List<int> encoded = new List<int>(encodedLength);
+  int insertAt = 0;
+  for (int value in source) {
+    if (value < 0 || value > UNICODE_VALID_RANGE_MAX) {
+      encoded.setRange(insertAt, insertAt + 3, [0xef, 0xbf, 0xbd]);
+      insertAt += 3;
+    } else if (value <= _UTF8_ONE_BYTE_MAX) {
+      encoded[insertAt] = value;
+      insertAt++;
+    } else if (value <= _UTF8_TWO_BYTE_MAX) {
+      encoded[insertAt] = _UTF8_FIRST_BYTE_OF_TWO_BASE | (
+          _UTF8_FIRST_BYTE_OF_TWO_MASK &
+          _addToEncoding(insertAt, 1, value, encoded));
+      insertAt += 2;
+    } else if (value <= _UTF8_THREE_BYTE_MAX) {
+      encoded[insertAt] = _UTF8_FIRST_BYTE_OF_THREE_BASE | (
+          _UTF8_FIRST_BYTE_OF_THREE_MASK &
+          _addToEncoding(insertAt, 2, value, encoded));
+      insertAt += 3;
+    } else if (value <= UNICODE_VALID_RANGE_MAX) {
+      encoded[insertAt] = _UTF8_FIRST_BYTE_OF_FOUR_BASE | (
+          _UTF8_FIRST_BYTE_OF_FOUR_MASK &
+          _addToEncoding(insertAt, 3, value, encoded));
+      insertAt += 4;
+    }
+  }
+  return encoded;
+}
+
+// Because UTF-8 specifies byte order, we do not have to follow the pattern
+// used by UTF-16 & UTF-32 regarding byte order.
+List<int> utf8ToCodepoints(
+    List<int> utf8EncodedBytes, [int offset = 0, int length,
+    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+  return new Utf8Decoder(utf8EncodedBytes, offset, length,
+      replacementCodepoint).decodeRest();
+}
+
+/**
+ * Return type of [decodeUtf8AsIterable] and variants. The Iterable type
+ * provides an iterator on demand and the iterator will only translate bytes
+ * as requested by the user of the iterator. (Note: results are not cached.)
+ */
+// TODO(floitsch): Consider removing the extend and switch to implements since
+// that's cheaper to allocate.
+class IterableUtf8Decoder extends IterableBase<int> {
+  final List<int> bytes;
+  final int offset;
+  final int length;
+  final int replacementCodepoint;
+
+  IterableUtf8Decoder(this.bytes, [this.offset = 0, this.length = null,
+      this.replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
+
+  Utf8Decoder get iterator =>
+      new Utf8Decoder(bytes, offset, length, replacementCodepoint);
+}
+
+/**
+ * Provides an iterator of Unicode codepoints from UTF-8 encoded bytes. The
+ * parameters can set an offset into a list of bytes (as int), limit the length
+ * of the values to be decoded, and override the default Unicode replacement
+ * character. Set the replacementCharacter to null to throw an
+ * ArgumentError rather than replace the bad value. The return value
+ * from this method can be used as an Iterable (e.g. in a for-loop).
+ */
+class Utf8Decoder implements Iterator<int> {
+  // TODO(kevmoo): should this field be private?
+  final ListRangeIterator utf8EncodedBytesIterator;
+  final int replacementCodepoint;
+  int _current = null;
+
+  Utf8Decoder(List<int> utf8EncodedBytes, [int offset = 0, int length,
+      this.replacementCodepoint =
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
+      utf8EncodedBytesIterator =
+          (new ListRange(utf8EncodedBytes, offset, length)).iterator;
+
+
+  Utf8Decoder._fromListRangeIterator(ListRange source, [
+      this.replacementCodepoint =
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
+      utf8EncodedBytesIterator = source.iterator;
+
+  /** Decode the remaininder of the characters in this decoder
+    * into a [List<int>].
+    */
+  List<int> decodeRest() {
+    List<int> codepoints = new List<int>(utf8EncodedBytesIterator.remaining);
+    int i = 0;
+    while (moveNext()) {
+      codepoints[i++] = current;
+    }
+    if (i == codepoints.length) {
+      return codepoints;
+    } else {
+      List<int> truncCodepoints = new List<int>(i);
+      truncCodepoints.setRange(0, i, codepoints);
+      return truncCodepoints;
+    }
+  }
+
+  int get current => _current;
+
+  bool moveNext() {
+    _current = null;
+
+    if (!utf8EncodedBytesIterator.moveNext()) return false;
+
+    int value = utf8EncodedBytesIterator.current;
+    int additionalBytes = 0;
+
+    if (value < 0) {
+      if (replacementCodepoint != null) {
+        _current = replacementCodepoint;
+        return true;
+      } else {
+        throw new ArgumentError(
+            "Invalid UTF8 at ${utf8EncodedBytesIterator.position}");
+      }
+    } else if (value <= _UTF8_ONE_BYTE_MAX) {
+      _current = value;
+      return true;
+    } else if (value < _UTF8_FIRST_BYTE_OF_TWO_BASE) {
+      if (replacementCodepoint != null) {
+        _current = replacementCodepoint;
+        return true;
+      } else {
+        throw new ArgumentError(
+            "Invalid UTF8 at ${utf8EncodedBytesIterator.position}");
+      }
+    } else if (value < _UTF8_FIRST_BYTE_OF_THREE_BASE) {
+      value -= _UTF8_FIRST_BYTE_OF_TWO_BASE;
+      additionalBytes = 1;
+    } else if (value < _UTF8_FIRST_BYTE_OF_FOUR_BASE) {
+      value -= _UTF8_FIRST_BYTE_OF_THREE_BASE;
+      additionalBytes = 2;
+    } else if (value < _UTF8_FIRST_BYTE_OF_FIVE_BASE) {
+      value -= _UTF8_FIRST_BYTE_OF_FOUR_BASE;
+      additionalBytes = 3;
+    } else if (value < _UTF8_FIRST_BYTE_OF_SIX_BASE) {
+      value -= _UTF8_FIRST_BYTE_OF_FIVE_BASE;
+      additionalBytes = 4;
+    } else if (value < _UTF8_FIRST_BYTE_BOUND_EXCL) {
+      value -= _UTF8_FIRST_BYTE_OF_SIX_BASE;
+      additionalBytes = 5;
+    } else if (replacementCodepoint != null) {
+      _current = replacementCodepoint;
+      return true;
+    } else {
+      throw new ArgumentError(
+          "Invalid UTF8 at ${utf8EncodedBytesIterator.position}");
+    }
+    int j = 0;
+    while (j < additionalBytes && utf8EncodedBytesIterator.moveNext()) {
+      int nextValue = utf8EncodedBytesIterator.current;
+      if (nextValue > _UTF8_ONE_BYTE_MAX &&
+          nextValue < _UTF8_FIRST_BYTE_OF_TWO_BASE) {
+        value = ((value << 6) | (nextValue & _UTF8_LO_SIX_BIT_MASK));
+      } else {
+        // if sequence-starting code unit, reposition cursor to start here
+        if (nextValue >= _UTF8_FIRST_BYTE_OF_TWO_BASE) {
+          utf8EncodedBytesIterator.backup();
+        }
+        break;
+      }
+      j++;
+    }
+    bool validSequence = (j == additionalBytes && (
+        value < UNICODE_UTF16_RESERVED_LO ||
+        value > UNICODE_UTF16_RESERVED_HI));
+    bool nonOverlong =
+        (additionalBytes == 1 && value > _UTF8_ONE_BYTE_MAX) ||
+        (additionalBytes == 2 && value > _UTF8_TWO_BYTE_MAX) ||
+        (additionalBytes == 3 && value > _UTF8_THREE_BYTE_MAX);
+    bool inRange = value <= UNICODE_VALID_RANGE_MAX;
+    if (validSequence && nonOverlong && inRange) {
+      _current = value;
+      return true;
+    } else if (replacementCodepoint != null) {
+      _current = replacementCodepoint;
+      return true;
+    } else {
+      throw new ArgumentError(
+          "Invalid UTF8 at ${utf8EncodedBytesIterator.position - j}");
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/utf/lib/src/utf/utf_stream.dart b/mojo/public/dart/third_party/utf/lib/src/utf/utf_stream.dart
new file mode 100644
index 0000000..0936616
--- /dev/null
+++ b/mojo/public/dart/third_party/utf/lib/src/utf/utf_stream.dart
@@ -0,0 +1,237 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of utf;
+
+// TODO(floitsch): make this transformer reusable.
+abstract class _StringDecoder
+    implements StreamTransformer<List<int>, String>, EventSink<List<int>> {
+  List<int> _carry;
+  List<int> _buffer;
+  int _replacementChar;
+
+  EventSink<String> _outSink;
+
+  _StringDecoder(int this._replacementChar);
+
+  Stream<String> bind(Stream<List<int>> stream) {
+    return new Stream.eventTransformed(
+        stream,
+        (EventSink<String> sink) {
+          if (_outSink != null) {
+            throw new StateError("String decoder already used");
+          }
+          _outSink = sink;
+          return this;
+        });
+  }
+
+  void add(List<int> bytes) {
+    try {
+      _buffer = <int>[];
+      List<int> carry = _carry;
+      _carry = null;
+      int pos = 0;
+      int available = bytes.length;
+      // If we have carry-over data, start from negative index, indicating carry
+      // index.
+      int goodChars = 0;
+      if (carry != null) pos = -carry.length;
+      while (pos < available) {
+        int currentPos = pos;
+        int getNext() {
+          if (pos < 0) {
+            return carry[pos++ + carry.length];
+          } else if (pos < available) {
+            return bytes[pos++];
+          }
+          return null;
+        }
+        int consumed = _processBytes(getNext);
+        if (consumed > 0) {
+          goodChars = _buffer.length;
+        } else if (consumed == 0) {
+          _buffer.length = goodChars;
+          if (currentPos < 0) {
+            _carry = [];
+            _carry.addAll(carry);
+            _carry.addAll(bytes);
+          } else {
+            _carry = bytes.sublist(currentPos);
+          }
+          break;
+        } else {
+          // Invalid byte at position pos - 1
+          _buffer.length = goodChars;
+          _addChar(-1);
+          goodChars = _buffer.length;
+        }
+      }
+      if (_buffer.length > 0) {
+        // Limit to 'goodChars', if lower than actual charCodes in the buffer.
+        _outSink.add(new String.fromCharCodes(_buffer));
+      }
+      _buffer = null;
+    } catch (e, stackTrace) {
+      _outSink.addError(e, stackTrace);
+    }
+  }
+
+  void addError(error, [StackTrace stackTrace]) {
+    _outSink.addError(error, stackTrace);
+  }
+
+  void close() {
+    if (_carry != null) {
+      if (_replacementChar != null) {
+        _outSink.add(new String.fromCharCodes(
+            new List.filled(_carry.length, _replacementChar)));
+      } else {
+        throw new ArgumentError('Invalid codepoint');
+      }
+    }
+    _outSink.close();
+  }
+
+  int _processBytes(int getNext());
+
+  void _addChar(int char) {
+    void error() {
+      if (_replacementChar != null) {
+        char = _replacementChar;
+      } else {
+        throw new ArgumentError('Invalid codepoint');
+      }
+    }
+    if (char < 0) error();
+    if (char >= 0xD800 && char <= 0xDFFF) error();
+    if (char > 0x10FFFF) error();
+    _buffer.add(char);
+  }
+}
+
+/**
+ * StringTransformer that decodes a stream of UTF-8 encoded bytes.
+ */
+class Utf8DecoderTransformer extends _StringDecoder {
+  Utf8DecoderTransformer(
+      [int replacementChar = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT])
+    : super(replacementChar);
+
+  int _processBytes(int getNext()) {
+    int value = getNext();
+    if ((value & 0xFF) != value) return -1;  // Not a byte.
+    if ((value & 0x80) == 0x80) {
+      int additionalBytes;
+      int min;
+      if ((value & 0xe0) == 0xc0) {  // 110xxxxx
+        value = value & 0x1F;
+        additionalBytes = 1;
+        min = 0x80;
+      } else if ((value & 0xf0) == 0xe0) {  // 1110xxxx
+        value = value & 0x0F;
+        additionalBytes = 2;
+        min = 0x800;
+      } else if ((value & 0xf8) == 0xf0) {  // 11110xxx
+        value = value & 0x07;
+        additionalBytes = 3;
+        min = 0x10000;
+      } else if ((value & 0xfc) == 0xf8) {  // 111110xx
+        value = value & 0x03;
+        additionalBytes = 4;
+        min = 0x200000;
+      } else if ((value & 0xfe) == 0xfc) {  // 1111110x
+        value = value & 0x01;
+        additionalBytes = 5;
+        min = 0x4000000;
+      } else {
+        return -1;
+      }
+      for (int i = 0; i < additionalBytes; i++) {
+        int next = getNext();
+        if (next == null) return 0;  // Not enough chars, reset.
+        if ((next & 0xc0) != 0x80 || (next & 0xff) != next) return -1;
+        value = value << 6 | (next & 0x3f);
+        if (additionalBytes >= 3 && i == 0 && value << 12 > 0x10FFFF) {
+          _addChar(-1);
+        }
+      }
+      // Invalid charCode if less then minimum expected.
+      if (value < min) value = -1;
+      _addChar(value);
+      return 1 + additionalBytes;
+    }
+    _addChar(value);
+    return 1;
+  }
+}
+
+
+abstract class _StringEncoder
+    implements StreamTransformer<String, List<int>>, EventSink<String> {
+
+  EventSink<List<int>> _outSink;
+
+  Stream<List<int>> bind(Stream<String> stream) {
+    return new Stream.eventTransformed(
+        stream,
+        (EventSink<List<int>> sink) {
+          if (_outSink != null) {
+            throw new StateError("String encoder already used");
+          }
+          _outSink = sink;
+          return this;
+        });
+  }
+
+  void add(String data) {
+    _outSink.add(_processString(data));
+  }
+
+  void addError(error, [StackTrace stackTrace]) {
+    _outSink.addError(error, stackTrace);
+  }
+
+  void close() { _outSink.close(); }
+
+  List<int> _processString(String string);
+}
+
+/**
+ * StringTransformer that UTF-8 encodes a stream of strings.
+ */
+class Utf8EncoderTransformer extends _StringEncoder {
+  List<int> _processString(String string) {
+    var bytes = <int>[];
+    int pos = 0;
+    List<int> codepoints = utf16CodeUnitsToCodepoints(string.codeUnits);
+    int length = codepoints.length;
+    for (int i = 0; i < length; i++) {
+      int additionalBytes;
+      int charCode = codepoints[i];
+      if (charCode <= 0x007F) {
+        additionalBytes = 0;
+        bytes.add(charCode);
+      } else if (charCode <= 0x07FF) {
+        // 110xxxxx (xxxxx is top 5 bits).
+        bytes.add(((charCode >> 6) & 0x1F) | 0xC0);
+        additionalBytes = 1;
+      } else if (charCode <= 0xFFFF) {
+        // 1110xxxx (xxxx is top 4 bits)
+        bytes.add(((charCode >> 12) & 0x0F)| 0xE0);
+        additionalBytes = 2;
+      } else {
+        // 11110xxx (xxx is top 3 bits)
+        bytes.add(((charCode >> 18) & 0x07) | 0xF0);
+        additionalBytes = 3;
+      }
+      for (int i = additionalBytes; i > 0; i--) {
+        // 10xxxxxx (xxxxxx is next 6 bits from the top).
+        bytes.add(((charCode >> (6 * (i - 1))) & 0x3F) | 0x80);
+      }
+      pos += additionalBytes + 1;
+    }
+    return bytes;
+  }
+}
diff --git a/mojo/public/dart/third_party/utf/lib/src/utf_16_code_unit_decoder.dart b/mojo/public/dart/third_party/utf/lib/src/utf_16_code_unit_decoder.dart
new file mode 100644
index 0000000..a0a4b3c
--- /dev/null
+++ b/mojo/public/dart/third_party/utf/lib/src/utf_16_code_unit_decoder.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library utf.utf_16_code_unit_decoder;
+
+import 'constants.dart';
+import 'list_range.dart';
+
+/**
+ * An Iterator<int> of codepoints built on an Iterator of UTF-16 code units.
+ * The parameters can override the default Unicode replacement character. Set
+ * the replacementCharacter to null to throw an ArgumentError
+ * rather than replace the bad value.
+ */
+class Utf16CodeUnitDecoder implements Iterator<int> {
+  // TODO(kevmoo): should this field be private?
+  final ListRangeIterator utf16CodeUnitIterator;
+  final int replacementCodepoint;
+  int _current = null;
+
+  Utf16CodeUnitDecoder(List<int> utf16CodeUnits, [int offset = 0, int length,
+      int this.replacementCodepoint =
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
+      utf16CodeUnitIterator =
+          (new ListRange(utf16CodeUnits, offset, length)).iterator;
+
+  Utf16CodeUnitDecoder.fromListRangeIterator(
+      ListRangeIterator this.utf16CodeUnitIterator,
+      int this.replacementCodepoint);
+
+  Iterator<int> get iterator => this;
+
+  int get current => _current;
+
+  bool moveNext() {
+    _current = null;
+    if (!utf16CodeUnitIterator.moveNext()) return false;
+
+    int value = utf16CodeUnitIterator.current;
+    if (value < 0) {
+      if (replacementCodepoint != null) {
+        _current = replacementCodepoint;
+      } else {
+        throw new ArgumentError(
+            "Invalid UTF16 at ${utf16CodeUnitIterator.position}");
+      }
+    } else if (value < UNICODE_UTF16_RESERVED_LO ||
+        (value > UNICODE_UTF16_RESERVED_HI && value <= UNICODE_PLANE_ONE_MAX)) {
+      // transfer directly
+      _current = value;
+    } else if (value < UNICODE_UTF16_SURROGATE_UNIT_1_BASE &&
+        utf16CodeUnitIterator.moveNext()) {
+      // merge surrogate pair
+      int nextValue = utf16CodeUnitIterator.current;
+      if (nextValue >= UNICODE_UTF16_SURROGATE_UNIT_1_BASE &&
+          nextValue <= UNICODE_UTF16_RESERVED_HI) {
+        value = (value - UNICODE_UTF16_SURROGATE_UNIT_0_BASE) << 10;
+        value += UNICODE_UTF16_OFFSET +
+            (nextValue - UNICODE_UTF16_SURROGATE_UNIT_1_BASE);
+        _current = value;
+      } else {
+        if (nextValue >= UNICODE_UTF16_SURROGATE_UNIT_0_BASE &&
+           nextValue < UNICODE_UTF16_SURROGATE_UNIT_1_BASE) {
+          utf16CodeUnitIterator.backup();
+        }
+        if (replacementCodepoint != null) {
+          _current = replacementCodepoint;
+        } else {
+          throw new ArgumentError(
+              "Invalid UTF16 at ${utf16CodeUnitIterator.position}");
+        }
+      }
+    } else if (replacementCodepoint != null) {
+      _current = replacementCodepoint;
+    } else {
+      throw new ArgumentError(
+          "Invalid UTF16 at ${utf16CodeUnitIterator.position}");
+    }
+    return true;
+  }
+}
+
diff --git a/mojo/public/dart/third_party/utf/lib/src/util.dart b/mojo/public/dart/third_party/utf/lib/src/util.dart
new file mode 100644
index 0000000..17427d5
--- /dev/null
+++ b/mojo/public/dart/third_party/utf/lib/src/util.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library utf.util;
+
+import 'constants.dart';
+import 'list_range.dart';
+import 'utf_16_code_unit_decoder.dart';
+
+/**
+ * Decodes the utf16 codeunits to codepoints.
+ */
+List<int> utf16CodeUnitsToCodepoints(
+    List<int> utf16CodeUnits, [int offset = 0, int length,
+    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+  ListRangeIterator source =
+      (new ListRange(utf16CodeUnits, offset, length)).iterator;
+  Utf16CodeUnitDecoder decoder = new Utf16CodeUnitDecoder
+      .fromListRangeIterator(source, replacementCodepoint);
+  List<int> codepoints = new List<int>(source.remaining);
+  int i = 0;
+  while (decoder.moveNext()) {
+    codepoints[i++] = decoder.current;
+  }
+  if (i == codepoints.length) {
+    return codepoints;
+  } else {
+    List<int> codepointTrunc = new List<int>(i);
+    codepointTrunc.setRange(0, i, codepoints);
+    return codepointTrunc;
+  }
+}
+
+/**
+ * Encode code points as UTF16 code units.
+ */
+List<int> codepointsToUtf16CodeUnits(
+    List<int> codepoints,
+    [int offset = 0,
+     int length,
+     int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
+
+  ListRange listRange = new ListRange(codepoints, offset, length);
+  int encodedLength = 0;
+  for (int value in listRange) {
+    if ((value >= 0 && value < UNICODE_UTF16_RESERVED_LO) ||
+        (value > UNICODE_UTF16_RESERVED_HI && value <= UNICODE_PLANE_ONE_MAX)) {
+      encodedLength++;
+    } else if (value > UNICODE_PLANE_ONE_MAX &&
+        value <= UNICODE_VALID_RANGE_MAX) {
+      encodedLength += 2;
+    } else {
+      encodedLength++;
+    }
+  }
+
+  List<int> codeUnitsBuffer = new List<int>(encodedLength);
+  int j = 0;
+  for (int value in listRange) {
+    if ((value >= 0 && value < UNICODE_UTF16_RESERVED_LO) ||
+        (value > UNICODE_UTF16_RESERVED_HI && value <= UNICODE_PLANE_ONE_MAX)) {
+      codeUnitsBuffer[j++] = value;
+    } else if (value > UNICODE_PLANE_ONE_MAX &&
+        value <= UNICODE_VALID_RANGE_MAX) {
+      int base = value - UNICODE_UTF16_OFFSET;
+      codeUnitsBuffer[j++] = UNICODE_UTF16_SURROGATE_UNIT_0_BASE +
+          ((base & UNICODE_UTF16_HI_MASK) >> 10);
+      codeUnitsBuffer[j++] = UNICODE_UTF16_SURROGATE_UNIT_1_BASE +
+          (base & UNICODE_UTF16_LO_MASK);
+    } else if (replacementCodepoint != null) {
+      codeUnitsBuffer[j++] = replacementCodepoint;
+    } else {
+      throw new ArgumentError("Invalid encoding");
+    }
+  }
+  return codeUnitsBuffer;
+}
diff --git a/mojo/public/dart/third_party/utf/lib/utf.dart b/mojo/public/dart/third_party/utf/lib/utf.dart
new file mode 100644
index 0000000..30d5db5
--- /dev/null
+++ b/mojo/public/dart/third_party/utf/lib/utf.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Support for encoding and decoding Unicode characters in UTF-8, UTF-16, and
+ * UTF-32.
+ */
+library utf;
+
+import "dart:async";
+import "dart:collection";
+
+import "src/constants.dart";
+import 'src/utf_16_code_unit_decoder.dart';
+import 'src/list_range.dart';
+import 'src/util.dart';
+
+export 'src/constants.dart';
+export 'src/utf_16_code_unit_decoder.dart';
+
+part "src/utf/utf_stream.dart";
+part "src/utf/utf8.dart";
+part "src/utf/utf16.dart";
+part "src/utf/utf32.dart";
diff --git a/mojo/public/dart/third_party/utf/pubspec.yaml b/mojo/public/dart/third_party/utf/pubspec.yaml
new file mode 100644
index 0000000..519bed4
--- /dev/null
+++ b/mojo/public/dart/third_party/utf/pubspec.yaml
@@ -0,0 +1,9 @@
+name: utf
+version: 0.9.0+2
+author: Dart Team <misc@dartlang.org>
+description: >
+ A Unicode library. Intended for advanced use where the built-in facilities
+ are too limiting.
+homepage: https://pub.dartlang.org/packages/utf
+environment:
+  sdk: '>=1.0.0 <2.0.0'
diff --git a/mojo/public/dart/third_party/utf/test/unicode_core_test.dart b/mojo/public/dart/third_party/utf/test/unicode_core_test.dart
new file mode 100644
index 0000000..6e13e96
--- /dev/null
+++ b/mojo/public/dart/third_party/utf/test/unicode_core_test.dart
@@ -0,0 +1,93 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library utf.unicode_core_test;
+
+import 'package:expect/expect.dart';
+
+import 'package:utf/utf.dart';
+import 'package:utf/src/util.dart';
+
+void main() {
+  testCodepointsToUtf16CodeUnits();
+  testUtf16bytesToCodepoints();
+}
+
+void testCodepointsToUtf16CodeUnits() {
+  // boundary conditions
+  Expect.listEquals([], codepointsToUtf16CodeUnits([]), "no input");
+  Expect.listEquals([0x0], codepointsToUtf16CodeUnits([0x0]), "0");
+  Expect.listEquals([0xd800, 0xdc00],
+      codepointsToUtf16CodeUnits([0x10000]), "10000");
+
+  Expect.listEquals([0xffff],
+      codepointsToUtf16CodeUnits([0xffff]), "ffff");
+  Expect.listEquals([0xdbff, 0xdfff],
+      codepointsToUtf16CodeUnits([0x10ffff]), "10ffff");
+
+  Expect.listEquals([0xd7ff],
+      codepointsToUtf16CodeUnits([0xd7ff]), "d7ff");
+  Expect.listEquals([0xe000],
+      codepointsToUtf16CodeUnits([0xe000]), "e000");
+
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      codepointsToUtf16CodeUnits([0xd800]), "d800");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      codepointsToUtf16CodeUnits([0xdfff]), "dfff");
+}
+
+void testUtf16bytesToCodepoints() {
+  // boundary conditions: First possible values
+  Expect.listEquals([], utf16CodeUnitsToCodepoints([]), "no input");
+  Expect.listEquals([0x0], utf16CodeUnitsToCodepoints([0x0]), "0");
+  Expect.listEquals([0x10000],
+      utf16CodeUnitsToCodepoints([0xd800, 0xdc00]), "10000");
+
+  // boundary conditions: Last possible sequence of a certain length
+  Expect.listEquals([0xffff],
+      utf16CodeUnitsToCodepoints([0xffff]), "ffff");
+  Expect.listEquals([0x10ffff],
+      utf16CodeUnitsToCodepoints([0xdbff, 0xdfff]), "10ffff");
+
+  // other boundary conditions
+  Expect.listEquals([0xd7ff],
+      utf16CodeUnitsToCodepoints([0xd7ff]), "d7ff");
+  Expect.listEquals([0xe000],
+      utf16CodeUnitsToCodepoints([0xe000]), "e000");
+
+  // unexpected continuation bytes
+  Expect.listEquals([0xfffd],
+      utf16CodeUnitsToCodepoints([0xdc00]),
+      "dc00 first unexpected continuation byte");
+  Expect.listEquals([0xfffd],
+      utf16CodeUnitsToCodepoints([0xdfff]),
+      "dfff last unexpected continuation byte");
+  Expect.listEquals([0xfffd],
+      utf16CodeUnitsToCodepoints([0xdc00]),
+      "1 unexpected continuation bytes");
+  Expect.listEquals([0xfffd, 0xfffd],
+      utf16CodeUnitsToCodepoints([0xdc00, 0xdc00]),
+      "2 unexpected continuation bytes");
+  Expect.listEquals([0xfffd, 0xfffd ,0xfffd],
+      utf16CodeUnitsToCodepoints([0xdc00, 0xdc00, 0xdc00]),
+      "3 unexpected continuation bytes");
+
+  // incomplete sequences
+  Expect.listEquals([0xfffd], utf16CodeUnitsToCodepoints([0xd800]),
+      "d800 last byte missing");
+  Expect.listEquals([0xfffd], utf16CodeUnitsToCodepoints([0xdbff]),
+      "dbff last byte missing");
+
+  // concatenation of incomplete sequences
+  Expect.listEquals([0xfffd, 0xfffd],
+      utf16CodeUnitsToCodepoints([0xd800, 0xdbff]),
+      "d800 dbff last byte missing");
+
+  // impossible bytes
+  Expect.listEquals([0xfffd], utf16CodeUnitsToCodepoints([0x110000]),
+      "110000 out of bounds");
+
+  // overlong sequences not possible in utf16 (nothing < x10000)
+  // illegal code positions d800-dfff not encodable (< x10000)
+}
diff --git a/mojo/public/dart/third_party/utf/test/utf16_test.dart b/mojo/public/dart/third_party/utf/test/utf16_test.dart
new file mode 100644
index 0000000..43971ca
--- /dev/null
+++ b/mojo/public/dart/third_party/utf/test/utf16_test.dart
@@ -0,0 +1,128 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library utf.utf16_test;
+
+import 'package:expect/expect.dart';
+import 'package:utf/utf.dart';
+
+const String testKoreanCharSubset = """
+가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛
+개객갞갟갠갡갢갣갤갥갦갧갨갩갪갫갬갭갮갯갰갱갲갳갴갵갶갷
+갸갹갺갻갼갽갾갿걀걁걂걃걄걅걆걇걈걉걊걋걌걍걎걏걐걑걒걓""";
+
+const String testHanWater = "水";
+
+const List<int> testKoreanCharSubsetUtf16beBom = const<int>[
+    0xfe, 0xff, 0xac, 0x00, 0xac, 0x01, 0xac, 0x02,
+    0xac, 0x03, 0xac, 0x04, 0xac, 0x05, 0xac, 0x06,
+    0xac, 0x07, 0xac, 0x08, 0xac, 0x09, 0xac, 0x0a,
+    0xac, 0x0b, 0xac, 0x0c, 0xac, 0x0d, 0xac, 0x0e,
+    0xac, 0x0f, 0xac, 0x10, 0xac, 0x11, 0xac, 0x12,
+    0xac, 0x13, 0xac, 0x14, 0xac, 0x15, 0xac, 0x16,
+    0xac, 0x17, 0xac, 0x18, 0xac, 0x19, 0xac, 0x1a,
+    0xac, 0x1b, 0x00, 0x0a, 0xac, 0x1c, 0xac, 0x1d,
+    0xac, 0x1e, 0xac, 0x1f, 0xac, 0x20, 0xac, 0x21,
+    0xac, 0x22, 0xac, 0x23, 0xac, 0x24, 0xac, 0x25,
+    0xac, 0x26, 0xac, 0x27, 0xac, 0x28, 0xac, 0x29,
+    0xac, 0x2a, 0xac, 0x2b, 0xac, 0x2c, 0xac, 0x2d,
+    0xac, 0x2e, 0xac, 0x2f, 0xac, 0x30, 0xac, 0x31,
+    0xac, 0x32, 0xac, 0x33, 0xac, 0x34, 0xac, 0x35,
+    0xac, 0x36, 0xac, 0x37, 0x00, 0x0a, 0xac, 0x38,
+    0xac, 0x39, 0xac, 0x3a, 0xac, 0x3b, 0xac, 0x3c,
+    0xac, 0x3d, 0xac, 0x3e, 0xac, 0x3f, 0xac, 0x40,
+    0xac, 0x41, 0xac, 0x42, 0xac, 0x43, 0xac, 0x44,
+    0xac, 0x45, 0xac, 0x46, 0xac, 0x47, 0xac, 0x48,
+    0xac, 0x49, 0xac, 0x4a, 0xac, 0x4b, 0xac, 0x4c,
+    0xac, 0x4d, 0xac, 0x4e, 0xac, 0x4f, 0xac, 0x50,
+    0xac, 0x51, 0xac, 0x52, 0xac, 0x53];
+
+const List<int> testKoreanCharSubsetUtf16le = const<int>    [
+    0x00, 0xac, 0x01, 0xac, 0x02, 0xac, 0x03, 0xac,
+    0x04, 0xac, 0x05, 0xac, 0x06, 0xac, 0x07, 0xac,
+    0x08, 0xac, 0x09, 0xac, 0x0a, 0xac, 0x0b, 0xac,
+    0x0c, 0xac, 0x0d, 0xac, 0x0e, 0xac, 0x0f, 0xac,
+    0x10, 0xac, 0x11, 0xac, 0x12, 0xac, 0x13, 0xac,
+    0x14, 0xac, 0x15, 0xac, 0x16, 0xac, 0x17, 0xac,
+    0x18, 0xac, 0x19, 0xac, 0x1a, 0xac, 0x1b, 0xac,
+    0x0a, 0x00, 0x1c, 0xac, 0x1d, 0xac, 0x1e, 0xac,
+    0x1f, 0xac, 0x20, 0xac, 0x21, 0xac, 0x22, 0xac,
+    0x23, 0xac, 0x24, 0xac, 0x25, 0xac, 0x26, 0xac,
+    0x27, 0xac, 0x28, 0xac, 0x29, 0xac, 0x2a, 0xac,
+    0x2b, 0xac, 0x2c, 0xac, 0x2d, 0xac, 0x2e, 0xac,
+    0x2f, 0xac, 0x30, 0xac, 0x31, 0xac, 0x32, 0xac,
+    0x33, 0xac, 0x34, 0xac, 0x35, 0xac, 0x36, 0xac,
+    0x37, 0xac, 0x0a, 0x00, 0x38, 0xac, 0x39, 0xac,
+    0x3a, 0xac, 0x3b, 0xac, 0x3c, 0xac, 0x3d, 0xac,
+    0x3e, 0xac, 0x3f, 0xac, 0x40, 0xac, 0x41, 0xac,
+    0x42, 0xac, 0x43, 0xac, 0x44, 0xac, 0x45, 0xac,
+    0x46, 0xac, 0x47, 0xac, 0x48, 0xac, 0x49, 0xac,
+    0x4a, 0xac, 0x4b, 0xac, 0x4c, 0xac, 0x4d, 0xac,
+    0x4e, 0xac, 0x4f, 0xac, 0x50, 0xac, 0x51, 0xac,
+    0x52, 0xac, 0x53, 0xac];
+
+void main() {
+  testEncodeToUtf16();
+  testUtf16BytesToString();
+  testIterableMethods();
+}
+
+void testEncodeToUtf16() {
+  Expect.listEquals([], encodeUtf16be("")); // TODO(dcarlson) should we skip bom if empty?
+  Expect.listEquals(testKoreanCharSubsetUtf16beBom,
+      encodeUtf16(testKoreanCharSubset),
+      "encode UTF-16(BE by default) Korean");
+
+  Expect.listEquals(testKoreanCharSubsetUtf16le,
+      encodeUtf16le(testKoreanCharSubset),
+      "encode UTF-16LE Korean");
+}
+
+void testUtf16BytesToString() {
+  Expect.stringEquals("", decodeUtf16([]));
+  Expect.stringEquals(testHanWater, decodeUtf16([0x6C, 0x34]),
+      "Water variation 1");
+  Expect.stringEquals(testHanWater, decodeUtf16([0xFE, 0xFF, 0x6C, 0x34]),
+      "Water variation 2");
+  Expect.stringEquals(testHanWater, decodeUtf16([0xFF, 0xFE, 0x34, 0x6C]),
+      "Water variation 3");
+
+  Expect.stringEquals(testHanWater, decodeUtf16be([0x6C, 0x34]),
+      "Water variation 4");
+  Expect.stringEquals(testHanWater,
+      decodeUtf16be([0xFE, 0xFF, 0x6C, 0x34]),
+      "Water variation 5");
+
+  Expect.stringEquals(testHanWater, decodeUtf16le([0x34, 0x6C]),
+      "Water variation 6");
+  Expect.stringEquals(testHanWater,
+      decodeUtf16le([0xFF, 0xFE, 0x34, 0x6C]),
+      "Water variation 7");
+
+  Expect.stringEquals(testKoreanCharSubset,
+      decodeUtf16(testKoreanCharSubsetUtf16beBom), "UTF-16BE Korean");
+}
+
+void testIterableMethods() {
+  // empty input
+  Expect.isFalse(decodeUtf16AsIterable([]).iterator.moveNext());
+
+  IterableUtf16Decoder koreanDecoder =
+    decodeUtf16AsIterable(testKoreanCharSubsetUtf16beBom);
+  // get the first character
+  Expect.equals(testKoreanCharSubset.codeUnits[0], koreanDecoder.first);
+  // get the whole translation using the Iterable interface
+  Expect.stringEquals(testKoreanCharSubset,
+      new String.fromCharCodes(new List<int>.from(koreanDecoder)));
+
+  // specify types
+  Expect.equals(44032, (new List<int>
+      .from(decodeUtf16beAsIterable(testKoreanCharSubsetUtf16beBom)))[0]);
+  Expect.equals(44032, (new List<int>
+      .from(decodeUtf16leAsIterable(testKoreanCharSubsetUtf16le)))[0]);
+  bool stripBom = false;
+  Expect.equals(UNICODE_BOM, (new List<int>
+      .from(decodeUtf16beAsIterable(testKoreanCharSubsetUtf16beBom,
+            0, null, stripBom)))[0]);
+}
diff --git a/mojo/public/dart/third_party/utf/test/utf32_test.dart b/mojo/public/dart/third_party/utf/test/utf32_test.dart
new file mode 100644
index 0000000..1a60a6f
--- /dev/null
+++ b/mojo/public/dart/third_party/utf/test/utf32_test.dart
@@ -0,0 +1,179 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library utf.utf32_test;
+
+import 'package:expect/expect.dart';
+import 'package:utf/utf.dart';
+
+const String testKoreanCharSubset = """
+가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛
+개객갞갟갠갡갢갣갤갥갦갧갨갩갪갫갬갭갮갯갰갱갲갳갴갵갶갷
+갸갹갺갻갼갽갾갿걀걁걂걃걄걅걆걇걈걉걊걋걌걍걎걏걐걑걒걓""";
+
+const String testHanTwice = "二";
+
+const List<int> testKoreanCharSubsetUtf32beBom = const<int>[
+    0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xac, 0x00,
+    0x00, 0x00, 0xac, 0x01, 0x00, 0x00, 0xac, 0x02,
+    0x00, 0x00, 0xac, 0x03, 0x00, 0x00, 0xac, 0x04,
+    0x00, 0x00, 0xac, 0x05, 0x00, 0x00, 0xac, 0x06,
+    0x00, 0x00, 0xac, 0x07, 0x00, 0x00, 0xac, 0x08,
+    0x00, 0x00, 0xac, 0x09, 0x00, 0x00, 0xac, 0x0a,
+    0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xac, 0x0c,
+    0x00, 0x00, 0xac, 0x0d, 0x00, 0x00, 0xac, 0x0e,
+    0x00, 0x00, 0xac, 0x0f, 0x00, 0x00, 0xac, 0x10,
+    0x00, 0x00, 0xac, 0x11, 0x00, 0x00, 0xac, 0x12,
+    0x00, 0x00, 0xac, 0x13, 0x00, 0x00, 0xac, 0x14,
+    0x00, 0x00, 0xac, 0x15, 0x00, 0x00, 0xac, 0x16,
+    0x00, 0x00, 0xac, 0x17, 0x00, 0x00, 0xac, 0x18,
+    0x00, 0x00, 0xac, 0x19, 0x00, 0x00, 0xac, 0x1a,
+    0x00, 0x00, 0xac, 0x1b, 0x00, 0x00, 0x00, 0x0a,
+    0x00, 0x00, 0xac, 0x1c, 0x00, 0x00, 0xac, 0x1d,
+    0x00, 0x00, 0xac, 0x1e, 0x00, 0x00, 0xac, 0x1f,
+    0x00, 0x00, 0xac, 0x20, 0x00, 0x00, 0xac, 0x21,
+    0x00, 0x00, 0xac, 0x22, 0x00, 0x00, 0xac, 0x23,
+    0x00, 0x00, 0xac, 0x24, 0x00, 0x00, 0xac, 0x25,
+    0x00, 0x00, 0xac, 0x26, 0x00, 0x00, 0xac, 0x27,
+    0x00, 0x00, 0xac, 0x28, 0x00, 0x00, 0xac, 0x29,
+    0x00, 0x00, 0xac, 0x2a, 0x00, 0x00, 0xac, 0x2b,
+    0x00, 0x00, 0xac, 0x2c, 0x00, 0x00, 0xac, 0x2d,
+    0x00, 0x00, 0xac, 0x2e, 0x00, 0x00, 0xac, 0x2f,
+    0x00, 0x00, 0xac, 0x30, 0x00, 0x00, 0xac, 0x31,
+    0x00, 0x00, 0xac, 0x32, 0x00, 0x00, 0xac, 0x33,
+    0x00, 0x00, 0xac, 0x34, 0x00, 0x00, 0xac, 0x35,
+    0x00, 0x00, 0xac, 0x36, 0x00, 0x00, 0xac, 0x37,
+    0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xac, 0x38,
+    0x00, 0x00, 0xac, 0x39, 0x00, 0x00, 0xac, 0x3a,
+    0x00, 0x00, 0xac, 0x3b, 0x00, 0x00, 0xac, 0x3c,
+    0x00, 0x00, 0xac, 0x3d, 0x00, 0x00, 0xac, 0x3e,
+    0x00, 0x00, 0xac, 0x3f, 0x00, 0x00, 0xac, 0x40,
+    0x00, 0x00, 0xac, 0x41, 0x00, 0x00, 0xac, 0x42,
+    0x00, 0x00, 0xac, 0x43, 0x00, 0x00, 0xac, 0x44,
+    0x00, 0x00, 0xac, 0x45, 0x00, 0x00, 0xac, 0x46,
+    0x00, 0x00, 0xac, 0x47, 0x00, 0x00, 0xac, 0x48,
+    0x00, 0x00, 0xac, 0x49, 0x00, 0x00, 0xac, 0x4a,
+    0x00, 0x00, 0xac, 0x4b, 0x00, 0x00, 0xac, 0x4c,
+    0x00, 0x00, 0xac, 0x4d, 0x00, 0x00, 0xac, 0x4e,
+    0x00, 0x00, 0xac, 0x4f, 0x00, 0x00, 0xac, 0x50,
+    0x00, 0x00, 0xac, 0x51, 0x00, 0x00, 0xac, 0x52,
+    0x00, 0x00, 0xac, 0x53];
+
+const List<int> testKoreanCharSubsetUtf32le = const<int>[
+    0x00, 0xac, 0x00, 0x00, 0x01, 0xac, 0x00, 0x00,
+    0x02, 0xac, 0x00, 0x00, 0x03, 0xac, 0x00, 0x00,
+    0x04, 0xac, 0x00, 0x00, 0x05, 0xac, 0x00, 0x00,
+    0x06, 0xac, 0x00, 0x00, 0x07, 0xac, 0x00, 0x00,
+    0x08, 0xac, 0x00, 0x00, 0x09, 0xac, 0x00, 0x00,
+    0x0a, 0xac, 0x00, 0x00, 0x0b, 0xac, 0x00, 0x00,
+    0x0c, 0xac, 0x00, 0x00, 0x0d, 0xac, 0x00, 0x00,
+    0x0e, 0xac, 0x00, 0x00, 0x0f, 0xac, 0x00, 0x00,
+    0x10, 0xac, 0x00, 0x00, 0x11, 0xac, 0x00, 0x00,
+    0x12, 0xac, 0x00, 0x00, 0x13, 0xac, 0x00, 0x00,
+    0x14, 0xac, 0x00, 0x00, 0x15, 0xac, 0x00, 0x00,
+    0x16, 0xac, 0x00, 0x00, 0x17, 0xac, 0x00, 0x00,
+    0x18, 0xac, 0x00, 0x00, 0x19, 0xac, 0x00, 0x00,
+    0x1a, 0xac, 0x00, 0x00, 0x1b, 0xac, 0x00, 0x00,
+    0x0a, 0x00, 0x00, 0x00, 0x1c, 0xac, 0x00, 0x00,
+    0x1d, 0xac, 0x00, 0x00, 0x1e, 0xac, 0x00, 0x00,
+    0x1f, 0xac, 0x00, 0x00, 0x20, 0xac, 0x00, 0x00,
+    0x21, 0xac, 0x00, 0x00, 0x22, 0xac, 0x00, 0x00,
+    0x23, 0xac, 0x00, 0x00, 0x24, 0xac, 0x00, 0x00,
+    0x25, 0xac, 0x00, 0x00, 0x26, 0xac, 0x00, 0x00,
+    0x27, 0xac, 0x00, 0x00, 0x28, 0xac, 0x00, 0x00,
+    0x29, 0xac, 0x00, 0x00, 0x2a, 0xac, 0x00, 0x00,
+    0x2b, 0xac, 0x00, 0x00, 0x2c, 0xac, 0x00, 0x00,
+    0x2d, 0xac, 0x00, 0x00, 0x2e, 0xac, 0x00, 0x00,
+    0x2f, 0xac, 0x00, 0x00, 0x30, 0xac, 0x00, 0x00,
+    0x31, 0xac, 0x00, 0x00, 0x32, 0xac, 0x00, 0x00,
+    0x33, 0xac, 0x00, 0x00, 0x34, 0xac, 0x00, 0x00,
+    0x35, 0xac, 0x00, 0x00, 0x36, 0xac, 0x00, 0x00,
+    0x37, 0xac, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
+    0x38, 0xac, 0x00, 0x00, 0x39, 0xac, 0x00, 0x00,
+    0x3a, 0xac, 0x00, 0x00, 0x3b, 0xac, 0x00, 0x00,
+    0x3c, 0xac, 0x00, 0x00, 0x3d, 0xac, 0x00, 0x00,
+    0x3e, 0xac, 0x00, 0x00, 0x3f, 0xac, 0x00, 0x00,
+    0x40, 0xac, 0x00, 0x00, 0x41, 0xac, 0x00, 0x00,
+    0x42, 0xac, 0x00, 0x00, 0x43, 0xac, 0x00, 0x00,
+    0x44, 0xac, 0x00, 0x00, 0x45, 0xac, 0x00, 0x00,
+    0x46, 0xac, 0x00, 0x00, 0x47, 0xac, 0x00, 0x00,
+    0x48, 0xac, 0x00, 0x00, 0x49, 0xac, 0x00, 0x00,
+    0x4a, 0xac, 0x00, 0x00, 0x4b, 0xac, 0x00, 0x00,
+    0x4c, 0xac, 0x00, 0x00, 0x4d, 0xac, 0x00, 0x00,
+    0x4e, 0xac, 0x00, 0x00, 0x4f, 0xac, 0x00, 0x00,
+    0x50, 0xac, 0x00, 0x00, 0x51, 0xac, 0x00, 0x00,
+    0x52, 0xac, 0x00, 0x00, 0x53, 0xac, 0x00, 0x00];
+
+void main() {
+  testUtf32BytesToString();
+  testEncodeToUtf32();
+  testIterableMethods();
+}
+
+void testEncodeToUtf32() {
+  Expect.listEquals([], encodeUtf32le(""), "no input"); // TODO(dcarlson) skip bom on empty?
+  Expect.listEquals(testKoreanCharSubsetUtf32beBom,
+      encodeUtf32(testKoreanCharSubset),
+      "encode UTF-32(BE by default) Korean");
+  Expect.listEquals(testKoreanCharSubsetUtf32le,
+      encodeUtf32le(testKoreanCharSubset),
+      "encode UTF-32(LE by default) Korean");
+}
+
+void testUtf32BytesToString() {
+  Expect.stringEquals("", decodeUtf32([]), "no input");
+  Expect.stringEquals("\ufffd", decodeUtf32([0]), "single byte");
+  Expect.stringEquals("\ufffd", decodeUtf32([0, 0, 0x4e]),
+      "short a byte");
+  Expect.stringEquals("\u4e8c\ufffd", decodeUtf32([0, 0, 0x4e, 0x8c, 0]),
+      "extra byte");
+
+  Expect.stringEquals(testHanTwice, decodeUtf32([0, 0, 0x4e, 0x8c]),
+      "twice variation 1");
+  Expect.stringEquals(testHanTwice,
+      decodeUtf32([0, 0, 0xfe, 0xff, 0, 0, 0x4e, 0x8c]),
+      "twice variation 2");
+  Expect.stringEquals(testHanTwice,
+      decodeUtf32([0xff, 0xfe, 0, 0, 0x8c, 0x4e, 0, 0]),
+      "twice variation 3");
+
+  Expect.stringEquals(testHanTwice, decodeUtf32be([0, 0, 0x4e, 0x8c]),
+      "twice variation 4");
+  Expect.stringEquals(testHanTwice,
+      decodeUtf32be([0, 0, 0xfe, 0xff, 0, 0, 0x4e, 0x8c]),
+      "twice variation 5");
+
+  Expect.stringEquals(testHanTwice, decodeUtf32le([0x8c, 0x4e, 0, 0]),
+      "twice variation 6");
+  Expect.stringEquals(testHanTwice,
+      decodeUtf32le([0xff, 0xfe, 0, 0, 0x8c, 0x4e, 0, 0]),
+      "twice variation 7");
+
+  Expect.stringEquals(testKoreanCharSubset,
+      decodeUtf32(testKoreanCharSubsetUtf32beBom),
+      "UTF-32BE Korean");
+}
+
+void testIterableMethods() {
+  // empty input
+  Expect.isFalse(decodeUtf32AsIterable([]).iterator.moveNext());
+
+  IterableUtf32Decoder koreanDecoder =
+    decodeUtf32AsIterable(testKoreanCharSubsetUtf32beBom);
+  // get the first character
+  Expect.equals(testKoreanCharSubset.codeUnits[0], koreanDecoder.first);
+  // get the whole translation using the Iterable interface
+  Expect.stringEquals(testKoreanCharSubset,
+      new String.fromCharCodes(new List<int>.from(koreanDecoder)));
+
+  // specify types
+  Expect.equals(44032, (new List<int>
+      .from(decodeUtf32beAsIterable(testKoreanCharSubsetUtf32beBom)))[0]);
+  Expect.equals(44032, (new List<int>
+      .from(decodeUtf32leAsIterable(testKoreanCharSubsetUtf32le)))[0]);
+  bool stripBom = false;
+  Expect.equals(UNICODE_BOM, (new List<int>
+      .from(decodeUtf32beAsIterable(testKoreanCharSubsetUtf32beBom,
+          0, null, stripBom)))[0]);
+}
diff --git a/mojo/public/dart/third_party/utf/test/utf82_test.dart b/mojo/public/dart/third_party/utf/test/utf82_test.dart
new file mode 100644
index 0000000..7f8cec4
--- /dev/null
+++ b/mojo/public/dart/third_party/utf/test/utf82_test.dart
@@ -0,0 +1,465 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library utf.utf82_test;
+
+import 'package:expect/expect.dart';
+import 'package:utf/utf.dart';
+
+const String testEnglishPhrase =
+    "The quick brown fox jumps over the lazy dog.";
+
+const List<int> testEnglishUtf8 = const<int> [
+    0x54, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63,
+    0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20,
+    0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70,
+    0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74,
+    0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79, 0x20,
+    0x64, 0x6f, 0x67, 0x2e];
+
+const String testDanishPhrase = "Quizdeltagerne spiste jordbær med "
+    "fløde mens cirkusklovnen Wolther spillede på xylofon.";
+
+const List<int> testDanishUtf8 = const<int>[
+    0x51, 0x75, 0x69, 0x7a, 0x64, 0x65, 0x6c, 0x74,
+    0x61, 0x67, 0x65, 0x72, 0x6e, 0x65, 0x20, 0x73,
+    0x70, 0x69, 0x73, 0x74, 0x65, 0x20, 0x6a, 0x6f,
+    0x72, 0x64, 0x62, 0xc3, 0xa6, 0x72, 0x20, 0x6d,
+    0x65, 0x64, 0x20, 0x66, 0x6c, 0xc3, 0xb8, 0x64,
+    0x65, 0x20, 0x6d, 0x65, 0x6e, 0x73, 0x20, 0x63,
+    0x69, 0x72, 0x6b, 0x75, 0x73, 0x6b, 0x6c, 0x6f,
+    0x76, 0x6e, 0x65, 0x6e, 0x20, 0x57, 0x6f, 0x6c,
+    0x74, 0x68, 0x65, 0x72, 0x20, 0x73, 0x70, 0x69,
+    0x6c, 0x6c, 0x65, 0x64, 0x65, 0x20, 0x70, 0xc3,
+    0xa5, 0x20, 0x78, 0x79, 0x6c, 0x6f, 0x66, 0x6f,
+    0x6e, 0x2e];
+
+// unusual formatting due to strange editor interaction w/ text direction.
+const String
+    testHebrewPhrase = "דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה";
+
+const List<int> testHebrewUtf8 = const<int>[
+    0xd7, 0x93, 0xd7, 0x92, 0x20, 0xd7, 0xa1, 0xd7,
+    0xa7, 0xd7, 0xa8, 0xd7, 0x9f, 0x20, 0xd7, 0xa9,
+    0xd7, 0x98, 0x20, 0xd7, 0x91, 0xd7, 0x99, 0xd7,
+    0x9d, 0x20, 0xd7, 0x9e, 0xd7, 0x90, 0xd7, 0x95,
+    0xd7, 0x9b, 0xd7, 0x96, 0xd7, 0x91, 0x20, 0xd7,
+    0x95, 0xd7, 0x9c, 0xd7, 0xa4, 0xd7, 0xaa, 0xd7,
+    0xa2, 0x20, 0xd7, 0x9e, 0xd7, 0xa6, 0xd7, 0x90,
+    0x20, 0xd7, 0x9c, 0xd7, 0x95, 0x20, 0xd7, 0x97,
+    0xd7, 0x91, 0xd7, 0xa8, 0xd7, 0x94, 0x20, 0xd7,
+    0x90, 0xd7, 0x99, 0xd7, 0x9a, 0x20, 0xd7, 0x94,
+    0xd7, 0xa7, 0xd7, 0x9c, 0xd7, 0x99, 0xd7, 0x98,
+    0xd7, 0x94];
+
+const String testRussianPhrase = "Съешь же ещё этих мягких "
+    "французских булок да выпей чаю";
+
+const List<int> testRussianUtf8 = const<int>[
+    0xd0, 0xa1, 0xd1, 0x8a, 0xd0, 0xb5, 0xd1, 0x88,
+    0xd1, 0x8c, 0x20, 0xd0, 0xb6, 0xd0, 0xb5, 0x20,
+    0xd0, 0xb5, 0xd1, 0x89, 0xd1, 0x91, 0x20, 0xd1,
+    0x8d, 0xd1, 0x82, 0xd0, 0xb8, 0xd1, 0x85, 0x20,
+    0xd0, 0xbc, 0xd1, 0x8f, 0xd0, 0xb3, 0xd0, 0xba,
+    0xd0, 0xb8, 0xd1, 0x85, 0x20, 0xd1, 0x84, 0xd1,
+    0x80, 0xd0, 0xb0, 0xd0, 0xbd, 0xd1, 0x86, 0xd1,
+    0x83, 0xd0, 0xb7, 0xd1, 0x81, 0xd0, 0xba, 0xd0,
+    0xb8, 0xd1, 0x85, 0x20, 0xd0, 0xb1, 0xd1, 0x83,
+    0xd0, 0xbb, 0xd0, 0xbe, 0xd0, 0xba, 0x20, 0xd0,
+    0xb4, 0xd0, 0xb0, 0x20, 0xd0, 0xb2, 0xd1, 0x8b,
+    0xd0, 0xbf, 0xd0, 0xb5, 0xd0, 0xb9, 0x20, 0xd1,
+    0x87, 0xd0, 0xb0, 0xd1, 0x8e];
+
+const String testGreekPhrase = "Γαζέες καὶ μυρτιὲς δὲν θὰ βρῶ πιὰ "
+    "στὸ χρυσαφὶ ξέφωτο";
+
+const List<int> testGreekUtf8 = const<int>[
+    0xce, 0x93, 0xce, 0xb1, 0xce, 0xb6, 0xce, 0xad,
+    0xce, 0xb5, 0xcf, 0x82, 0x20, 0xce, 0xba, 0xce,
+    0xb1, 0xe1, 0xbd, 0xb6, 0x20, 0xce, 0xbc, 0xcf,
+    0x85, 0xcf, 0x81, 0xcf, 0x84, 0xce, 0xb9, 0xe1,
+    0xbd, 0xb2, 0xcf, 0x82, 0x20, 0xce, 0xb4, 0xe1,
+    0xbd, 0xb2, 0xce, 0xbd, 0x20, 0xce, 0xb8, 0xe1,
+    0xbd, 0xb0, 0x20, 0xce, 0xb2, 0xcf, 0x81, 0xe1,
+    0xbf, 0xb6, 0x20, 0xcf, 0x80, 0xce, 0xb9, 0xe1,
+    0xbd, 0xb0, 0x20, 0xcf, 0x83, 0xcf, 0x84, 0xe1,
+    0xbd, 0xb8, 0x20, 0xcf, 0x87, 0xcf, 0x81, 0xcf,
+    0x85, 0xcf, 0x83, 0xce, 0xb1, 0xcf, 0x86, 0xe1,
+    0xbd, 0xb6, 0x20, 0xce, 0xbe, 0xce, 0xad, 0xcf,
+    0x86, 0xcf, 0x89, 0xcf, 0x84, 0xce, 0xbf];
+
+const String testKatakanaPhrase = """
+イロハニホヘト チリヌルヲ ワカヨタレソ ツネナラム
+ウヰノオクヤマ ケフコエテ アサキユメミシ ヱヒモセスン""";
+
+const List<int> testKatakanaUtf8 = const<int>[
+    0xe3, 0x82, 0xa4, 0xe3, 0x83, 0xad, 0xe3, 0x83,
+    0x8f, 0xe3, 0x83, 0x8b, 0xe3, 0x83, 0x9b, 0xe3,
+    0x83, 0x98, 0xe3, 0x83, 0x88, 0x20, 0xe3, 0x83,
+    0x81, 0xe3, 0x83, 0xaa, 0xe3, 0x83, 0x8c, 0xe3,
+    0x83, 0xab, 0xe3, 0x83, 0xb2, 0x20, 0xe3, 0x83,
+    0xaf, 0xe3, 0x82, 0xab, 0xe3, 0x83, 0xa8, 0xe3,
+    0x82, 0xbf, 0xe3, 0x83, 0xac, 0xe3, 0x82, 0xbd,
+    0x20, 0xe3, 0x83, 0x84, 0xe3, 0x83, 0x8d, 0xe3,
+    0x83, 0x8a, 0xe3, 0x83, 0xa9, 0xe3, 0x83, 0xa0,
+    0x0a, 0xe3, 0x82, 0xa6, 0xe3, 0x83, 0xb0, 0xe3,
+    0x83, 0x8e, 0xe3, 0x82, 0xaa, 0xe3, 0x82, 0xaf,
+    0xe3, 0x83, 0xa4, 0xe3, 0x83, 0x9e, 0x20, 0xe3,
+    0x82, 0xb1, 0xe3, 0x83, 0x95, 0xe3, 0x82, 0xb3,
+    0xe3, 0x82, 0xa8, 0xe3, 0x83, 0x86, 0x20, 0xe3,
+    0x82, 0xa2, 0xe3, 0x82, 0xb5, 0xe3, 0x82, 0xad,
+    0xe3, 0x83, 0xa6, 0xe3, 0x83, 0xa1, 0xe3, 0x83,
+    0x9f, 0xe3, 0x82, 0xb7, 0x20, 0xe3, 0x83, 0xb1,
+    0xe3, 0x83, 0x92, 0xe3, 0x83, 0xa2, 0xe3, 0x82,
+    0xbb, 0xe3, 0x82, 0xb9, 0xe3, 0x83, 0xb3];
+
+void main() {
+  testUtf8bytesToCodepoints();
+  testUtf8BytesToString();
+  testEncodeToUtf8();
+  testIterableMethods();
+}
+
+void testEncodeToUtf8() {
+  Expect.listEquals(testEnglishUtf8, encodeUtf8(testEnglishPhrase),
+      "english to utf8");
+
+  Expect.listEquals(testDanishUtf8, encodeUtf8(testDanishPhrase),
+      "encode danish to utf8");
+
+  Expect.listEquals(testHebrewUtf8, encodeUtf8(testHebrewPhrase),
+      "Hebrew to utf8");
+
+  Expect.listEquals(testRussianUtf8, encodeUtf8(testRussianPhrase),
+      "Russian to utf8");
+
+  Expect.listEquals(testGreekUtf8, encodeUtf8(testGreekPhrase),
+      "Greek to utf8");
+
+  Expect.listEquals(testKatakanaUtf8, encodeUtf8(testKatakanaPhrase),
+      "Katakana to utf8");
+}
+
+void testUtf8bytesToCodepoints() {
+  Expect.listEquals([954, 972, 963, 956, 949],
+      utf8ToCodepoints([0xce, 0xba, 0xcf, 0x8c, 0xcf,
+      0x83, 0xce, 0xbc, 0xce, 0xb5]), "κόσμε");
+
+  // boundary conditions: First possible sequence of a certain length
+  Expect.listEquals([], utf8ToCodepoints([]), "no input");
+  Expect.listEquals([0x0], utf8ToCodepoints([0x0]), "0");
+  Expect.listEquals([0x80], utf8ToCodepoints([0xc2, 0x80]), "80");
+  Expect.listEquals([0x800],
+      utf8ToCodepoints([0xe0, 0xa0, 0x80]), "800");
+  Expect.listEquals([0x10000],
+      utf8ToCodepoints([0xf0, 0x90, 0x80, 0x80]), "10000");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf8, 0x88, 0x80, 0x80, 0x80]), "200000");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfc, 0x84, 0x80, 0x80, 0x80, 0x80]),
+      "4000000");
+
+  // boundary conditions: Last possible sequence of a certain length
+  Expect.listEquals([0x7f], utf8ToCodepoints([0x7f]), "7f");
+  Expect.listEquals([0x7ff], utf8ToCodepoints([0xdf, 0xbf]), "7ff");
+  Expect.listEquals([0xffff],
+      utf8ToCodepoints([0xef, 0xbf, 0xbf]), "ffff");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf7, 0xbf, 0xbf, 0xbf]), "1fffff");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfb, 0xbf, 0xbf, 0xbf, 0xbf]), "3ffffff");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfd, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf]),
+      "4000000");
+
+  // other boundary conditions
+  Expect.listEquals([0xd7ff],
+      utf8ToCodepoints([0xed, 0x9f, 0xbf]), "d7ff");
+  Expect.listEquals([0xe000],
+      utf8ToCodepoints([0xee, 0x80, 0x80]), "e000");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xef, 0xbf, 0xbd]), "fffd");
+  Expect.listEquals([0x10ffff],
+      utf8ToCodepoints([0xf4, 0x8f, 0xbf, 0xbf]), "10ffff");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf4, 0x90, 0x80, 0x80]), "110000");
+
+  // unexpected continuation bytes
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0x80]), "80 => replacement character");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xbf]), "bf => replacement character");
+
+  List<int> allContinuationBytes = <int>[];
+  List<int> matchingReplacementChars = <int>[];
+  for (int i = 0x80; i < 0xc0; i++) {
+    allContinuationBytes.add(i);
+    matchingReplacementChars.add(UNICODE_REPLACEMENT_CHARACTER_CODEPOINT);
+  }
+  Expect.listEquals(matchingReplacementChars,
+      utf8ToCodepoints(allContinuationBytes),
+      "80 - bf => replacement character x 64");
+
+  List<int> allFirstTwoByteSeq = <int>[];
+  matchingReplacementChars = <int>[];
+  for (int i = 0xc0; i < 0xe0; i++) {
+    allFirstTwoByteSeq.addAll([i, 0x20]);
+    matchingReplacementChars.addAll(
+        [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
+  }
+  Expect.listEquals(matchingReplacementChars,
+      utf8ToCodepoints(allFirstTwoByteSeq),
+      "c0 - df + space => replacement character + space x 32");
+
+  List<int> allFirstThreeByteSeq = <int>[];
+  matchingReplacementChars = <int>[];
+  for (int i = 0xe0; i < 0xf0; i++) {
+    allFirstThreeByteSeq.addAll([i, 0x20]);
+    matchingReplacementChars.addAll(
+        [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
+  }
+  Expect.listEquals(matchingReplacementChars,
+      utf8ToCodepoints(allFirstThreeByteSeq),
+      "e0 - ef + space => replacement character x 16");
+
+  List<int> allFirstFourByteSeq = <int>[];
+  matchingReplacementChars = <int>[];
+  for (int i = 0xf0; i < 0xf8; i++) {
+    allFirstFourByteSeq.addAll([i, 0x20]);
+    matchingReplacementChars.addAll(
+        [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
+  }
+  Expect.listEquals(matchingReplacementChars,
+      utf8ToCodepoints(allFirstFourByteSeq),
+      "f0 - f7 + space => replacement character x 8");
+
+  List<int> allFirstFiveByteSeq = <int>[];
+  matchingReplacementChars = <int>[];
+  for (int i = 0xf8; i < 0xfc; i++) {
+    allFirstFiveByteSeq.addAll([i, 0x20]);
+    matchingReplacementChars.addAll(
+        [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
+  }
+  Expect.listEquals(matchingReplacementChars,
+      utf8ToCodepoints(allFirstFiveByteSeq),
+      "f8 - fb + space => replacement character x 4");
+
+  List<int> allFirstSixByteSeq = <int>[];
+  matchingReplacementChars = <int>[];
+  for (int i = 0xfc; i < 0xfe; i++) {
+    allFirstSixByteSeq.addAll([i, 0x20]);
+    matchingReplacementChars.addAll(
+        [UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]);
+  }
+  Expect.listEquals(matchingReplacementChars,
+      utf8ToCodepoints(allFirstSixByteSeq),
+      "fc - fd + space => replacement character x 2");
+
+  // Sequences with last continuation byte missing
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xc2]),
+      "2-byte sequence with last byte missing");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xe0, 0x80]),
+      "3-byte sequence with last byte missing");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf0, 0x80, 0x80]),
+      "4-byte sequence with last byte missing");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf8, 0x88, 0x80, 0x80]),
+      "5-byte sequence with last byte missing");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfc, 0x80, 0x80, 0x80, 0x80]),
+      "6-byte sequence with last byte missing");
+
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xdf]),
+      "2-byte sequence with last byte missing (hi)");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xef, 0xbf]),
+      "3-byte sequence with last byte missing (hi)");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf7, 0xbf, 0xbf]),
+      "4-byte sequence with last byte missing (hi)");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfb, 0xbf, 0xbf, 0xbf]),
+      "5-byte sequence with last byte missing (hi)");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfd, 0xbf, 0xbf, 0xbf, 0xbf]),
+      "6-byte sequence with last byte missing (hi)");
+
+  // Concatenation of incomplete sequences
+  Expect.listEquals(
+      [ UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+        UNICODE_REPLACEMENT_CHARACTER_CODEPOINT ],
+      utf8ToCodepoints(
+          [ 0xc2,
+            0xe0, 0x80,
+            0xf0, 0x80, 0x80,
+            0xf8, 0x88, 0x80, 0x80,
+            0xfc, 0x80, 0x80, 0x80, 0x80,
+            0xdf,
+            0xef, 0xbf,
+            0xf7, 0xbf, 0xbf,
+            0xfb, 0xbf, 0xbf, 0xbf,
+            0xfd, 0xbf, 0xbf, 0xbf, 0xbf ]),
+          "Concatenation of incomplete sequences");
+
+  // Impossible bytes
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfe]), "fe");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xff]), "ff");
+  Expect.listEquals([
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfe, 0xfe, 0xff, 0xff]), "fe fe ff ff");
+
+  // Overlong sequences
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xc0, 0xaf]), "c0 af");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xe0, 0x80, 0xaf]), "e0 80 af");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf0, 0x80, 0x80, 0xaf]), "f0 80 80 af");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf8, 0x80, 0x80, 0x80, 0xaf]), "f8 80 80 80 af");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfc, 0x80, 0x80, 0x80, 0x80, 0xaf]),
+      "fc 80 80 80 80 af");
+
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xc1, 0xbf]), "c1 bf");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xe0, 0x9f, 0xbf]), "e0 9f bf");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf0, 0x8f, 0xbf, 0xbf]), "f0 8f bf bf");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf8, 0x87, 0xbf, 0xbf, 0xbf]), "f8 87 bf bf bf");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfc, 0x83, 0xbf, 0xbf, 0xbf, 0xbf]),
+      "fc 83 bf bf bf bf");
+
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xc0, 0x80]), "c0 80");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xe0, 0x80, 0x80]), "e0 80 80");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf0, 0x80, 0x80, 0x80]), "f0 80 80 80");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xf8, 0x80, 0x80, 0x80, 0x80]), "f8 80 80 80 80");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xfc, 0x80, 0x80, 0x80, 0x80, 0x80]),
+      "fc 80 80 80 80 80");
+
+  // Illegal code positions
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xa0, 0x80]), "U+D800");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xad, 0xbf]), "U+DB7F");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xae, 0x80]), "U+DB80");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xaf, 0xbf]), "U+DBFF");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xb0, 0x80]), "U+DC00");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xbe, 0x80]), "U+DF80");
+  Expect.listEquals([UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xbf, 0xbf]), "U+DFFF");
+
+  // Paired UTF-16 surrogates
+  Expect.listEquals([
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xa0, 0x80, 0xed, 0xb0, 0x80]),
+      "U+D800 U+DC00");
+  Expect.listEquals([
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xa0, 0x80, 0xed, 0xbf, 0xbf]),
+      "U+D800 U+DFFF");
+  Expect.listEquals([
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xad, 0xbf, 0xed, 0xb0, 0x80]),
+      "U+DB7F U+DC00");
+  Expect.listEquals([
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xad, 0xbf, 0xed, 0xbf, 0xbf]),
+      "U+DB7F U+DFFF");
+  Expect.listEquals([
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xae, 0x80, 0xed, 0xb0, 0x80]),
+      "U+DB80 U+DC00");
+  Expect.listEquals([
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xae, 0x80, 0xed, 0xbf, 0xbf]),
+      "U+DB80 U+DFFF");
+  Expect.listEquals([
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xaf, 0xbf, 0xed, 0xb0, 0x80]),
+      "U+DBFF U+DC00");
+  Expect.listEquals([
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
+      UNICODE_REPLACEMENT_CHARACTER_CODEPOINT],
+      utf8ToCodepoints([0xed, 0xaf, 0xbf, 0xed, 0xbf, 0xbf]),
+      "U+DBFF U+DFFF");
+
+  // Other illegal code positions (???)
+  Expect.listEquals([0xfffe], utf8ToCodepoints([0xef, 0xbf, 0xbe]),
+      "U+FFFE");
+  Expect.listEquals([0xffff], utf8ToCodepoints([0xef, 0xbf, 0xbf]),
+      "U+FFFF");
+}
+
+void testUtf8BytesToString() {
+  Expect.stringEquals(testEnglishPhrase,
+      decodeUtf8(testEnglishUtf8), "English");
+
+  Expect.stringEquals(testDanishPhrase,
+      decodeUtf8(testDanishUtf8), "Danish");
+
+  Expect.stringEquals(testHebrewPhrase,
+      decodeUtf8(testHebrewUtf8), "Hebrew");
+
+  Expect.stringEquals(testRussianPhrase,
+      decodeUtf8(testRussianUtf8), "Russian");
+
+  Expect.stringEquals(testGreekPhrase,
+      decodeUtf8(testGreekUtf8), "Greek");
+
+  Expect.stringEquals(testKatakanaPhrase,
+      decodeUtf8(testKatakanaUtf8), "Katakana");
+}
+
+void testIterableMethods() {
+  IterableUtf8Decoder englishDecoder = decodeUtf8AsIterable(testEnglishUtf8);
+  // get the first character
+  Expect.equals(testEnglishUtf8[0], englishDecoder.first);
+  // get the whole translation using the Iterable interface
+  Expect.stringEquals(testEnglishPhrase,
+      new String.fromCharCodes(new List<int>.from(englishDecoder)));
+
+  IterableUtf8Decoder kataDecoder = decodeUtf8AsIterable(testKatakanaUtf8);
+  // get the first character
+  Expect.equals(testKatakanaPhrase.codeUnits[0], kataDecoder.first);
+  // get the whole translation using the Iterable interface
+  Expect.stringEquals(testKatakanaPhrase,
+      new String.fromCharCodes(new List<int>.from(kataDecoder)));
+}
diff --git a/mojo/public/dart/third_party/utf/test/utf8_test.dart b/mojo/public/dart/third_party/utf/test/utf8_test.dart
new file mode 100644
index 0000000..3e8c87e
--- /dev/null
+++ b/mojo/public/dart/third_party/utf/test/utf8_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library utf.utf8_test;
+
+import "package:expect/expect.dart";
+import "package:utf/utf.dart";
+
+String decode(List<int> bytes) => decodeUtf8(bytes);
+
+main() {
+  // Google favorite: "Îñţérñåţîöñåļîžåţîờñ".
+  String string = decode([0xc3, 0x8e, 0xc3, 0xb1, 0xc5, 0xa3, 0xc3, 0xa9, 0x72,
+                          0xc3, 0xb1, 0xc3, 0xa5, 0xc5, 0xa3, 0xc3, 0xae, 0xc3,
+                          0xb6, 0xc3, 0xb1, 0xc3, 0xa5, 0xc4, 0xbc, 0xc3, 0xae,
+                          0xc5, 0xbe, 0xc3, 0xa5, 0xc5, 0xa3, 0xc3, 0xae, 0xe1,
+                          0xbb, 0x9d, 0xc3, 0xb1]);
+  Expect.stringEquals("Îñţérñåţîöñåļîžåţîờñ", string);
+
+  // Blueberry porridge in Danish: "blåbærgrød".
+  string = decode([0x62, 0x6c, 0xc3, 0xa5, 0x62, 0xc3, 0xa6, 0x72, 0x67, 0x72,
+                   0xc3, 0xb8, 0x64]);
+  Expect.stringEquals("blåbærgrød", string);
+
+  // "சிவா அணாமாைல", that is "Siva Annamalai" in Tamil.
+  string = decode([0xe0, 0xae, 0x9a, 0xe0, 0xae, 0xbf, 0xe0, 0xae, 0xb5, 0xe0,
+                   0xae, 0xbe, 0x20, 0xe0, 0xae, 0x85, 0xe0, 0xae, 0xa3, 0xe0,
+                   0xae, 0xbe, 0xe0, 0xae, 0xae, 0xe0, 0xae, 0xbe, 0xe0, 0xaf,
+                   0x88, 0xe0, 0xae, 0xb2]);
+  Expect.stringEquals("சிவா அணாமாைல", string);
+
+  // "िसवा अणामालै", that is "Siva Annamalai" in Devanagari.
+  string = decode([0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xb5, 0xe0,
+                   0xa4, 0xbe, 0x20, 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0xa3, 0xe0,
+                   0xa4, 0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
+                   0xb2, 0xe0, 0xa5, 0x88]);
+  Expect.stringEquals("िसवा अणामालै", string);
+
+  // DESERET CAPITAL LETTER BEE, unicode 0x10412(0xD801+0xDC12)
+  // UTF-8: F0 90 90 92
+  string = decode([0xf0, 0x90, 0x90, 0x92]);
+  Expect.equals(string.length, 2);
+  Expect.equals("𐐒".length, 2);
+  Expect.stringEquals("𐐒", string);
+
+  // TODO(ahe): Add tests of bad input.
+}
diff --git a/mojo/public/dart/third_party/utf/test/utf_test.dart b/mojo/public/dart/third_party/utf/test/utf_test.dart
new file mode 100644
index 0000000..86d08e4
--- /dev/null
+++ b/mojo/public/dart/third_party/utf/test/utf_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library utf.utf_test;
+
+import "package:expect/expect.dart";
+import "package:utf/utf.dart";
+
+main() {
+  String str = new String.fromCharCodes([0x1d537]);
+  // String.codeUnits gives 16-bit code units, but stringToCodepoints gives
+  // back the original code points.
+  Expect.listEquals([0xd835, 0xdd37], str.codeUnits);
+  Expect.listEquals([0x1d537], stringToCodepoints(str));
+}
diff --git a/mojo/public/dart/third_party/watcher/.gitignore b/mojo/public/dart/third_party/watcher/.gitignore
new file mode 100644
index 0000000..7dbf035
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/.gitignore
@@ -0,0 +1,15 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.pub/
+build/
+packages
+.packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/watcher/.test_config b/mojo/public/dart/third_party/watcher/.test_config
new file mode 100644
index 0000000..531426a
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/.test_config
@@ -0,0 +1,5 @@
+{
+  "test_package": {
+    "platforms": ["vm"]
+  }
+}
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/watcher/CHANGELOG.md b/mojo/public/dart/third_party/watcher/CHANGELOG.md
new file mode 100644
index 0000000..30762a0
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/CHANGELOG.md
@@ -0,0 +1,31 @@
+# 0.9.7
+
+* Fix a bug in `FileWatcher` where events could be added after watchers were
+  closed.
+
+# 0.9.6
+
+* Add a `Watcher` interface that encompasses watching both files and
+  directories.
+
+* Add `FileWatcher` and `PollingFileWatcher` classes for watching changes to
+  individual files.
+
+* Deprecate `DirectoryWatcher.directory`. Use `DirectoryWatcher.path` instead.
+
+# 0.9.5
+
+* Fix bugs where events could be added after watchers were closed.
+
+# 0.9.4
+
+* Treat add events for known files as modifications instead of discarding them
+  on Mac OS.
+
+# 0.9.3
+
+* Improved support for Windows via `WindowsDirectoryWatcher`.
+
+* Simplified `PollingDirectoryWatcher`.
+
+* Fixed bugs in `MacOSDirectoryWatcher`
diff --git a/mojo/public/dart/third_party/watcher/LICENSE b/mojo/public/dart/third_party/watcher/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/watcher/README.md b/mojo/public/dart/third_party/watcher/README.md
new file mode 100644
index 0000000..61cc1f9
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/README.md
@@ -0,0 +1,4 @@
+A file system watcher.
+
+It monitors changes to contents of directories and sends notifications when
+files have been added, removed, or modified.
diff --git a/mojo/public/dart/third_party/watcher/codereview.settings b/mojo/public/dart/third_party/watcher/codereview.settings
new file mode 100644
index 0000000..25367dd
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: http://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/watcher/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/watcher/example/watch.dart b/mojo/public/dart/third_party/watcher/example/watch.dart
new file mode 100644
index 0000000..da3c263
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/example/watch.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Watches the given directory and prints each modification to it.
+library watch;
+
+import 'package:path/path.dart' as p;
+import 'package:watcher/watcher.dart';
+
+main(List<String> arguments) {
+  if (arguments.length != 1) {
+    print("Usage: watch <directory path>");
+    return;
+  }
+
+  var watcher = new DirectoryWatcher(p.absolute(arguments[0]));
+  watcher.events.listen((event) {
+    print(event);
+  });
+}
diff --git a/mojo/public/dart/third_party/watcher/lib/src/async_queue.dart b/mojo/public/dart/third_party/watcher/lib/src/async_queue.dart
new file mode 100644
index 0000000..b83493d
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/lib/src/async_queue.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library watcher.async_queue;
+
+import 'dart:async';
+import 'dart:collection';
+
+typedef Future ItemProcessor<T>(T item);
+
+/// A queue of items that are sequentially, asynchronously processed.
+///
+/// Unlike [Stream.map] or [Stream.forEach], the callback used to process each
+/// item returns a [Future], and it will not advance to the next item until the
+/// current item is finished processing.
+///
+/// Items can be added at any point in time and processing will be started as
+/// needed. When all items are processed, it stops processing until more items
+/// are added.
+class AsyncQueue<T> {
+  final _items = new Queue<T>();
+
+  /// Whether or not the queue is currently waiting on a processing future to
+  /// complete.
+  bool _isProcessing = false;
+
+  /// The callback to invoke on each queued item.
+  ///
+  /// The next item in the queue will not be processed until the [Future]
+  /// returned by this completes.
+  final ItemProcessor<T> _processor;
+
+  /// The handler for errors thrown during processing.
+  ///
+  /// Used to avoid top-leveling asynchronous errors.
+  final Function _errorHandler;
+
+  AsyncQueue(this._processor, {Function onError})
+      : _errorHandler = onError;
+
+  /// Enqueues [item] to be processed and starts asynchronously processing it
+  /// if a process isn't already running.
+  void add(T item) {
+    _items.add(item);
+
+    // Start up the asynchronous processing if not already running.
+    if (_isProcessing) return;
+    _isProcessing = true;
+
+    _processNextItem().catchError(_errorHandler);
+  }
+
+  /// Removes all remaining items to be processed.
+  void clear() {
+    _items.clear();
+  }
+
+  /// Pulls the next item off [_items] and processes it.
+  ///
+  /// When complete, recursively calls itself to continue processing unless
+  /// the process was cancelled.
+  Future _processNextItem() {
+    var item = _items.removeFirst();
+    return _processor(item).then((_) {
+      if (_items.isNotEmpty) return _processNextItem();
+
+      // We have drained the queue, stop processing and wait until something
+      // has been enqueued.
+      _isProcessing = false;
+    });
+  }
+}
diff --git a/mojo/public/dart/third_party/watcher/lib/src/constructable_file_system_event.dart b/mojo/public/dart/third_party/watcher/lib/src/constructable_file_system_event.dart
new file mode 100644
index 0000000..d00a1dc
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/lib/src/constructable_file_system_event.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library watcher.constructable_file_system_event;
+
+import 'dart:io';
+
+abstract class _ConstructableFileSystemEvent implements FileSystemEvent {
+  final bool isDirectory;
+  final String path;
+  int get type;
+
+  _ConstructableFileSystemEvent(this.path, this.isDirectory);
+}
+
+class ConstructableFileSystemCreateEvent extends _ConstructableFileSystemEvent
+    implements FileSystemCreateEvent {
+  final type = FileSystemEvent.CREATE;
+
+  ConstructableFileSystemCreateEvent(String path, bool isDirectory)
+      : super(path, isDirectory);
+
+  String toString() => "FileSystemCreateEvent('$path')";
+}
+
+class ConstructableFileSystemDeleteEvent extends _ConstructableFileSystemEvent
+    implements FileSystemDeleteEvent {
+  final type = FileSystemEvent.DELETE;
+
+  ConstructableFileSystemDeleteEvent(String path, bool isDirectory)
+      : super(path, isDirectory);
+
+  String toString() => "FileSystemDeleteEvent('$path')";
+}
+
+class ConstructableFileSystemModifyEvent extends _ConstructableFileSystemEvent
+    implements FileSystemModifyEvent {
+  final bool contentChanged;
+  final type = FileSystemEvent.MODIFY;
+
+  ConstructableFileSystemModifyEvent(String path, bool isDirectory,
+      this.contentChanged)
+      : super(path, isDirectory);
+
+  String toString() =>
+      "FileSystemModifyEvent('$path', contentChanged=$contentChanged)";
+}
+
+class ConstructableFileSystemMoveEvent extends _ConstructableFileSystemEvent
+    implements FileSystemMoveEvent {
+  final String destination;
+  final type = FileSystemEvent.MOVE;
+
+  ConstructableFileSystemMoveEvent(String path, bool isDirectory,
+      this.destination)
+      : super(path, isDirectory);
+
+  String toString() => "FileSystemMoveEvent('$path', '$destination')";
+}
diff --git a/mojo/public/dart/third_party/watcher/lib/src/directory_watcher.dart b/mojo/public/dart/third_party/watcher/lib/src/directory_watcher.dart
new file mode 100644
index 0000000..8283785
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/lib/src/directory_watcher.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library watcher.directory_watcher;
+
+import 'dart:io';
+
+import 'watch_event.dart';
+import '../watcher.dart';
+import 'directory_watcher/linux.dart';
+import 'directory_watcher/mac_os.dart';
+import 'directory_watcher/windows.dart';
+import 'directory_watcher/polling.dart';
+
+/// Watches the contents of a directory and emits [WatchEvent]s when something
+/// in the directory has changed.
+abstract class DirectoryWatcher implements Watcher {
+  /// The directory whose contents are being monitored.
+  @Deprecated("Expires in 1.0.0. Use DirectoryWatcher.path instead.")
+  String get directory;
+
+  /// Creates a new [DirectoryWatcher] monitoring [directory].
+  ///
+  /// If a native directory watcher is available for this platform, this will
+  /// use it. Otherwise, it will fall back to a [PollingDirectoryWatcher].
+  ///
+  /// If [pollingDelay] is passed, it specifies the amount of time the watcher
+  /// will pause between successive polls of the directory contents. Making this
+  /// shorter will give more immediate feedback at the expense of doing more IO
+  /// and higher CPU usage. Defaults to one second. Ignored for non-polling
+  /// watchers.
+  factory DirectoryWatcher(String directory, {Duration pollingDelay}) {
+    if (FileSystemEntity.isWatchSupported) {
+      if (Platform.isLinux) return new LinuxDirectoryWatcher(directory);
+      if (Platform.isMacOS) return new MacOSDirectoryWatcher(directory);
+      if (Platform.isWindows) return new WindowsDirectoryWatcher(directory);
+    }
+    return new PollingDirectoryWatcher(directory, pollingDelay: pollingDelay);
+  }
+}
diff --git a/mojo/public/dart/third_party/watcher/lib/src/directory_watcher/linux.dart b/mojo/public/dart/third_party/watcher/lib/src/directory_watcher/linux.dart
new file mode 100644
index 0000000..a747839
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/lib/src/directory_watcher/linux.dart
@@ -0,0 +1,311 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library watcher.directory_watcher.linux;
+
+import 'dart:async';
+import 'dart:io';
+
+import '../directory_watcher.dart';
+import '../resubscribable.dart';
+import '../utils.dart';
+import '../watch_event.dart';
+
+/// Uses the inotify subsystem to watch for filesystem events.
+///
+/// Inotify doesn't suport recursively watching subdirectories, nor does
+/// [Directory.watch] polyfill that functionality. This class polyfills it
+/// instead.
+///
+/// This class also compensates for the non-inotify-specific issues of
+/// [Directory.watch] producing multiple events for a single logical action
+/// (issue 14372) and providing insufficient information about move events
+/// (issue 14424).
+class LinuxDirectoryWatcher extends ResubscribableWatcher
+    implements DirectoryWatcher {
+  String get directory => path;
+
+  LinuxDirectoryWatcher(String directory)
+      : super(directory, () => new _LinuxDirectoryWatcher(directory));
+}
+
+class _LinuxDirectoryWatcher
+    implements DirectoryWatcher, ManuallyClosedWatcher {
+  String get directory => path;
+  final String path;
+
+  Stream<WatchEvent> get events => _eventsController.stream;
+  final _eventsController = new StreamController<WatchEvent>.broadcast();
+
+  bool get isReady => _readyCompleter.isCompleted;
+
+  Future get ready => _readyCompleter.future;
+  final _readyCompleter = new Completer();
+
+  /// The last known state for each entry in this directory.
+  ///
+  /// The keys in this map are the paths to the directory entries; the values
+  /// are [_EntryState]s indicating whether the entries are files or
+  /// directories.
+  final _entries = new Map<String, _EntryState>();
+
+  /// The watchers for subdirectories of [directory].
+  final _subWatchers = new Map<String, _LinuxDirectoryWatcher>();
+
+  /// A set of all subscriptions that this watcher subscribes to.
+  ///
+  /// These are gathered together so that they may all be canceled when the
+  /// watcher is closed.
+  final _subscriptions = new Set<StreamSubscription>();
+
+  _LinuxDirectoryWatcher(this.path) {
+    // Batch the inotify changes together so that we can dedup events.
+    var innerStream = new Directory(path).watch()
+        .transform(new BatchedStreamTransformer<FileSystemEvent>());
+    _listen(innerStream, _onBatch,
+        onError: _eventsController.addError,
+        onDone: _onDone);
+
+    _listen(new Directory(path).list(), (entity) {
+      _entries[entity.path] = new _EntryState(entity is Directory);
+      if (entity is! Directory) return;
+      _watchSubdir(entity.path);
+    }, onError: (error, stackTrace) {
+      _eventsController.addError(error, stackTrace);
+      close();
+    }, onDone: () {
+      _waitUntilReady().then((_) => _readyCompleter.complete());
+    }, cancelOnError: true);
+  }
+
+  /// Returns a [Future] that completes once all the subdirectory watchers are
+  /// fully initialized.
+  Future _waitUntilReady() {
+    return Future.wait(_subWatchers.values.map((watcher) => watcher.ready))
+        .then((_) {
+      if (_subWatchers.values.every((watcher) => watcher.isReady)) return null;
+      return _waitUntilReady();
+    });
+  }
+
+  void close() {
+    for (var subscription in _subscriptions) {
+      subscription.cancel();
+    }
+    for (var watcher in _subWatchers.values) {
+      watcher.close();
+    }
+
+    _subWatchers.clear();
+    _subscriptions.clear();
+    _eventsController.close();
+  }
+
+  /// Returns all files (not directories) that this watcher knows of are
+  /// recursively in the watched directory.
+  Set<String> get _allFiles {
+    var files = new Set<String>();
+    _getAllFiles(files);
+    return files;
+  }
+
+  /// Helper function for [_allFiles].
+  ///
+  /// Adds all files that this watcher knows of to [files].
+  void _getAllFiles(Set<String> files) {
+    files.addAll(_entries.keys
+        .where((path) => _entries[path] == _EntryState.FILE).toSet());
+    for (var watcher in _subWatchers.values) {
+      watcher._getAllFiles(files);
+    }
+  }
+
+  /// Watch a subdirectory of [directory] for changes.
+  ///
+  /// If the subdirectory was added after [this] began emitting events, its
+  /// contents will be emitted as ADD events.
+  void _watchSubdir(String path) {
+    if (_subWatchers.containsKey(path)) return;
+    var watcher = new _LinuxDirectoryWatcher(path);
+    _subWatchers[path] = watcher;
+
+    // TODO(nweiz): Catch any errors here that indicate that the directory in
+    // question doesn't exist and silently stop watching it instead of
+    // propagating the errors.
+    _listen(watcher.events, (event) {
+      if (isReady) _eventsController.add(event);
+    }, onError: (error, stackTrace) {
+      _eventsController.addError(error, stackTrace);
+      close();
+    }, onDone: () {
+      if (_subWatchers[path] == watcher) _subWatchers.remove(path);
+
+      // It's possible that a directory was removed and recreated very quickly.
+      // If so, make sure we're still watching it.
+      if (new Directory(path).existsSync()) _watchSubdir(path);
+    });
+
+    // TODO(nweiz): Right now it's possible for the watcher to emit an event for
+    // a file before the directory list is complete. This could lead to the user
+    // seeing a MODIFY or REMOVE event for a file before they see an ADD event,
+    // which is bad. We should handle that.
+    //
+    // One possibility is to provide a general means (e.g.
+    // `DirectoryWatcher.eventsAndExistingFiles`) to tell a watcher to emit
+    // events for all the files that already exist. This would be useful for
+    // top-level clients such as barback as well, and could be implemented with
+    // a wrapper similar to how listening/canceling works now.
+
+    // If a directory is added after we're finished with the initial scan, emit
+    // an event for each entry in it. This gives the user consistently gets an
+    // event for every new file.
+    watcher.ready.then((_) {
+      if (!isReady || _eventsController.isClosed) return;
+      _listen(new Directory(path).list(recursive: true), (entry) {
+        if (entry is Directory) return;
+        _eventsController.add(new WatchEvent(ChangeType.ADD, entry.path));
+      }, onError: (error, stackTrace) {
+        // Ignore an exception caused by the dir not existing. It's fine if it
+        // was added and then quickly removed.
+        if (error is FileSystemException) return;
+
+        _eventsController.addError(error, stackTrace);
+        close();
+      }, cancelOnError: true);
+    });
+  }
+
+  /// The callback that's run when a batch of changes comes in.
+  void _onBatch(List<FileSystemEvent> batch) {
+    var changedEntries = new Set<String>();
+    var oldEntries = new Map.from(_entries);
+
+    // inotify event batches are ordered by occurrence, so we treat them as a
+    // log of what happened to a file.
+    for (var event in batch) {
+      // If the watched directory is deleted or moved, we'll get a deletion
+      // event for it. Ignore it; we handle closing [this] when the underlying
+      // stream is closed.
+      if (event.path == path) continue;
+
+      changedEntries.add(event.path);
+
+      if (event is FileSystemMoveEvent) {
+        changedEntries.add(event.destination);
+        _changeEntryState(event.path, ChangeType.REMOVE, event.isDirectory);
+        _changeEntryState(event.destination, ChangeType.ADD, event.isDirectory);
+      } else {
+        _changeEntryState(event.path, _changeTypeFor(event), event.isDirectory);
+      }
+    }
+
+    for (var path in changedEntries) {
+      emitEvent(ChangeType type) {
+        if (isReady) _eventsController.add(new WatchEvent(type, path));
+      }
+
+      var oldState = oldEntries[path];
+      var newState = _entries[path];
+
+      if (oldState != _EntryState.FILE && newState == _EntryState.FILE) {
+        emitEvent(ChangeType.ADD);
+      } else if (oldState == _EntryState.FILE && newState == _EntryState.FILE) {
+        emitEvent(ChangeType.MODIFY);
+      } else if (oldState == _EntryState.FILE && newState != _EntryState.FILE) {
+        emitEvent(ChangeType.REMOVE);
+      }
+
+      if (oldState == _EntryState.DIRECTORY) {
+        var watcher = _subWatchers.remove(path);
+        if (watcher == null) continue;
+        for (var path in watcher._allFiles) {
+          _eventsController.add(new WatchEvent(ChangeType.REMOVE, path));
+        }
+        watcher.close();
+      }
+
+      if (newState == _EntryState.DIRECTORY) _watchSubdir(path);
+    }
+  }
+
+  /// Changes the known state of the entry at [path] based on [change] and
+  /// [isDir].
+  void _changeEntryState(String path, ChangeType change, bool isDir) {
+    if (change == ChangeType.ADD || change == ChangeType.MODIFY) {
+      _entries[path] = new _EntryState(isDir);
+    } else {
+      assert(change == ChangeType.REMOVE);
+      _entries.remove(path);
+    }
+  }
+
+  /// Determines the [ChangeType] associated with [event].
+  ChangeType _changeTypeFor(FileSystemEvent event) {
+    if (event is FileSystemDeleteEvent) return ChangeType.REMOVE;
+    if (event is FileSystemCreateEvent) return ChangeType.ADD;
+
+    assert(event is FileSystemModifyEvent);
+    return ChangeType.MODIFY;
+  }
+
+  /// Handles the underlying event stream closing, indicating that the directory
+  /// being watched was removed.
+  void _onDone() {
+    // Most of the time when a directory is removed, its contents will get
+    // individual REMOVE events before the watch stream is closed -- in that
+    // case, [_entries] will be empty here. However, if the directory's removal
+    // is caused by a MOVE, we need to manually emit events.
+    if (isReady) {
+      _entries.forEach((path, state) {
+        if (state == _EntryState.DIRECTORY) return;
+        _eventsController.add(new WatchEvent(ChangeType.REMOVE, path));
+      });
+    }
+
+    // The parent directory often gets a close event before the subdirectories
+    // are done emitting events. We wait for them to finish before we close
+    // [events] so that we can be sure to emit a remove event for every file
+    // that used to exist.
+    Future.wait(_subWatchers.values.map((watcher) {
+      try {
+        return watcher.events.toList();
+      } on StateError catch (_) {
+        // It's possible that [watcher.events] is closed but the onDone event
+        // hasn't reached us yet. It's fine if so.
+        return new Future.value();
+      }
+    })).then((_) => close());
+  }
+
+  /// Like [Stream.listen], but automatically adds the subscription to
+  /// [_subscriptions] so that it can be canceled when [close] is called.
+  void _listen(Stream stream, void onData(event), {Function onError,
+      void onDone(), bool cancelOnError}) {
+    var subscription;
+    subscription = stream.listen(onData, onError: onError, onDone: () {
+      _subscriptions.remove(subscription);
+      if (onDone != null) onDone();
+    }, cancelOnError: cancelOnError);
+    _subscriptions.add(subscription);
+  }
+}
+
+/// An enum for the possible states of entries in a watched directory.
+class _EntryState {
+  final String _name;
+
+  /// The entry is a file.
+  static const FILE = const _EntryState._("file");
+
+  /// The entry is a directory.
+  static const DIRECTORY = const _EntryState._("directory");
+
+  const _EntryState._(this._name);
+
+  /// Returns [DIRECTORY] if [isDir] is true, and [FILE] otherwise.
+  factory _EntryState(bool isDir) =>
+      isDir ? _EntryState.DIRECTORY : _EntryState.FILE;
+
+  String toString() => _name;
+}
diff --git a/mojo/public/dart/third_party/watcher/lib/src/directory_watcher/mac_os.dart b/mojo/public/dart/third_party/watcher/lib/src/directory_watcher/mac_os.dart
new file mode 100644
index 0000000..487225e
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/lib/src/directory_watcher/mac_os.dart
@@ -0,0 +1,399 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library watcher.directory_watcher.mac_os;
+
+import 'dart:async';
+import 'dart:io';
+
+import '../directory_watcher.dart';
+import '../constructable_file_system_event.dart';
+import '../path_set.dart';
+import '../resubscribable.dart';
+import '../utils.dart';
+import '../watch_event.dart';
+
+/// Uses the FSEvents subsystem to watch for filesystem events.
+///
+/// FSEvents has two main idiosyncrasies that this class works around. First, it
+/// will occasionally report events that occurred before the filesystem watch
+/// was initiated. Second, if multiple events happen to the same file in close
+/// succession, it won't report them in the order they occurred. See issue
+/// 14373.
+///
+/// This also works around issues 16003 and 14849 in the implementation of
+/// [Directory.watch].
+class MacOSDirectoryWatcher extends ResubscribableWatcher
+    implements DirectoryWatcher {
+  String get directory => path;
+
+  MacOSDirectoryWatcher(String directory)
+      : super(directory, () => new _MacOSDirectoryWatcher(directory));
+}
+
+class _MacOSDirectoryWatcher
+    implements DirectoryWatcher, ManuallyClosedWatcher {
+  String get directory => path;
+  final String path;
+
+  Stream<WatchEvent> get events => _eventsController.stream;
+  final _eventsController = new StreamController<WatchEvent>.broadcast();
+
+  bool get isReady => _readyCompleter.isCompleted;
+
+  Future get ready => _readyCompleter.future;
+  final _readyCompleter = new Completer();
+
+  /// The set of files that are known to exist recursively within the watched
+  /// directory.
+  ///
+  /// The state of files on the filesystem is compared against this to determine
+  /// the real change that occurred when working around issue 14373. This is
+  /// also used to emit REMOVE events when subdirectories are moved out of the
+  /// watched directory.
+  final PathSet _files;
+
+  /// The subscription to the stream returned by [Directory.watch].
+  ///
+  /// This is separate from [_subscriptions] because this stream occasionally
+  /// needs to be resubscribed in order to work around issue 14849.
+  StreamSubscription<FileSystemEvent> _watchSubscription;
+
+  /// The subscription to the [Directory.list] call for the initial listing of
+  /// the directory to determine its initial state.
+  StreamSubscription<FileSystemEntity> _initialListSubscription;
+
+  /// The subscriptions to [Directory.list] calls for listing the contents of a
+  /// subdirectory that was moved into the watched directory.
+  final _listSubscriptions = new Set<StreamSubscription<FileSystemEntity>>();
+
+  /// The timer for tracking how long we wait for an initial batch of bogus
+  /// events (see issue 14373).
+  Timer _bogusEventTimer;
+
+  _MacOSDirectoryWatcher(String path)
+      : path = path,
+        _files = new PathSet(path) {
+    _startWatch();
+
+    // Before we're ready to emit events, wait for [_listDir] to complete and
+    // for enough time to elapse that if bogus events (issue 14373) would be
+    // emitted, they will be.
+    //
+    // If we do receive a batch of events, [_onBatch] will ensure that these
+    // futures don't fire and that the directory is re-listed.
+    Future.wait([
+      _listDir(),
+      _waitForBogusEvents()
+    ]).then((_) => _readyCompleter.complete());
+  }
+
+  void close() {
+    if (_watchSubscription != null) _watchSubscription.cancel();
+    if (_initialListSubscription != null) _initialListSubscription.cancel();
+    _watchSubscription = null;
+    _initialListSubscription = null;
+
+    for (var subscription in _listSubscriptions) {
+      subscription.cancel();
+    }
+    _listSubscriptions.clear();
+
+    _eventsController.close();
+  }
+
+  /// The callback that's run when [Directory.watch] emits a batch of events.
+  void _onBatch(List<FileSystemEvent> batch) {
+    // If we get a batch of events before we're ready to begin emitting events,
+    // it's probable that it's a batch of pre-watcher events (see issue 14373).
+    // Ignore those events and re-list the directory.
+    if (!isReady) {
+      // Cancel the timer because bogus events only occur in the first batch, so
+      // we can fire [ready] as soon as we're done listing the directory.
+      _bogusEventTimer.cancel();
+      _listDir().then((_) => _readyCompleter.complete());
+      return;
+    }
+
+    _sortEvents(batch).forEach((path, events) {
+      var canonicalEvent = _canonicalEvent(events);
+      events = canonicalEvent == null ?
+          _eventsBasedOnFileSystem(path) : [canonicalEvent];
+
+      for (var event in events) {
+        if (event is FileSystemCreateEvent) {
+          if (!event.isDirectory) {
+            // If we already know about the file, treat it like a modification.
+            // This can happen if a file is copied on top of an existing one.
+            // We'll see an ADD event for the latter file when from the user's
+            // perspective, the file's contents just changed.
+            var type = _files.contains(path)
+                ? ChangeType.MODIFY
+                : ChangeType.ADD;
+
+            _emitEvent(type, path);
+            _files.add(path);
+            continue;
+          }
+
+          if (_files.containsDir(path)) continue;
+
+          var subscription;
+          subscription = new Directory(path).list(recursive: true)
+              .listen((entity) {
+            if (entity is Directory) return;
+            if (_files.contains(path)) return;
+
+            _emitEvent(ChangeType.ADD, entity.path);
+            _files.add(entity.path);
+          }, onError: (e, stackTrace) {
+            _emitError(e, stackTrace);
+          }, onDone: () {
+            _listSubscriptions.remove(subscription);
+          }, cancelOnError: true);
+          _listSubscriptions.add(subscription);
+        } else if (event is FileSystemModifyEvent) {
+          assert(!event.isDirectory);
+          _emitEvent(ChangeType.MODIFY, path);
+        } else {
+          assert(event is FileSystemDeleteEvent);
+          for (var removedPath in _files.remove(path)) {
+            _emitEvent(ChangeType.REMOVE, removedPath);
+          }
+        }
+      }
+    });
+  }
+
+  /// Sort all the events in a batch into sets based on their path.
+  ///
+  /// A single input event may result in multiple events in the returned map;
+  /// for example, a MOVE event becomes a DELETE event for the source and a
+  /// CREATE event for the destination.
+  ///
+  /// The returned events won't contain any [FileSystemMoveEvent]s, nor will it
+  /// contain any events relating to [path].
+  Map<String, Set<FileSystemEvent>> _sortEvents(List<FileSystemEvent> batch) {
+    var eventsForPaths = {};
+
+    // FSEvents can report past events, including events on the root directory
+    // such as it being created. We want to ignore these. If the directory is
+    // really deleted, that's handled by [_onDone].
+    batch = batch.where((event) => event.path != path).toList();
+
+    // Events within directories that already have events are superfluous; the
+    // directory's full contents will be examined anyway, so we ignore such
+    // events. Emitting them could cause useless or out-of-order events.
+    var directories = unionAll(batch.map((event) {
+      if (!event.isDirectory) return new Set();
+      if (event is! FileSystemMoveEvent) return new Set.from([event.path]);
+      return new Set.from([event.path, event.destination]);
+    }));
+
+    isInModifiedDirectory(path) =>
+        directories.any((dir) => path != dir && path.startsWith(dir));
+
+    addEvent(path, event) {
+      if (isInModifiedDirectory(path)) return;
+      var set = eventsForPaths.putIfAbsent(path, () => new Set());
+      set.add(event);
+    }
+
+    for (var event in batch) {
+      // The Mac OS watcher doesn't emit move events. See issue 14806.
+      assert(event is! FileSystemMoveEvent);
+      addEvent(event.path, event);
+    }
+
+    return eventsForPaths;
+  }
+
+  /// Returns the canonical event from a batch of events on the same path, if
+  /// one exists.
+  ///
+  /// If [batch] doesn't contain any contradictory events (e.g. DELETE and
+  /// CREATE, or events with different values for [isDirectory]), this returns a
+  /// single event that describes what happened to the path in question.
+  ///
+  /// If [batch] does contain contradictory events, this returns `null` to
+  /// indicate that the state of the path on the filesystem should be checked to
+  /// determine what occurred.
+  FileSystemEvent _canonicalEvent(Set<FileSystemEvent> batch) {
+    // An empty batch indicates that we've learned earlier that the batch is
+    // contradictory (e.g. because of a move).
+    if (batch.isEmpty) return null;
+
+    var type = batch.first.type;
+    var isDir = batch.first.isDirectory;
+    var hadModifyEvent = false;
+
+    for (var event in batch.skip(1)) {
+      // If one event reports that the file is a directory and another event
+      // doesn't, that's a contradiction.
+      if (isDir != event.isDirectory) return null;
+
+      // Modify events don't contradict either CREATE or REMOVE events. We can
+      // safely assume the file was modified after a CREATE or before the
+      // REMOVE; otherwise there will also be a REMOVE or CREATE event
+      // (respectively) that will be contradictory.
+      if (event is FileSystemModifyEvent) {
+        hadModifyEvent = true;
+        continue;
+      }
+      assert(event is FileSystemCreateEvent || event is FileSystemDeleteEvent);
+
+      // If we previously thought this was a MODIFY, we now consider it to be a
+      // CREATE or REMOVE event. This is safe for the same reason as above.
+      if (type == FileSystemEvent.MODIFY) {
+        type = event.type;
+        continue;
+      }
+
+      // A CREATE event contradicts a REMOVE event and vice versa.
+      assert(type == FileSystemEvent.CREATE || type == FileSystemEvent.DELETE);
+      if (type != event.type) return null;
+    }
+
+    // If we got a CREATE event for a file we already knew about, that comes
+    // from FSEvents reporting an add that happened prior to the watch
+    // beginning. If we also received a MODIFY event, we want to report that,
+    // but not the CREATE.
+    if (type == FileSystemEvent.CREATE && hadModifyEvent &&
+        _files.contains(batch.first.path)) {
+      type = FileSystemEvent.MODIFY;
+    }
+
+    switch (type) {
+      case FileSystemEvent.CREATE:
+        // Issue 16003 means that a CREATE event for a directory can indicate
+        // that the directory was moved and then re-created.
+        // [_eventsBasedOnFileSystem] will handle this correctly by producing a
+        // DELETE event followed by a CREATE event if the directory exists.
+        if (isDir) return null;
+        return new ConstructableFileSystemCreateEvent(batch.first.path, false);
+      case FileSystemEvent.DELETE:
+        return new ConstructableFileSystemDeleteEvent(batch.first.path, isDir);
+      case FileSystemEvent.MODIFY:
+        return new ConstructableFileSystemModifyEvent(
+            batch.first.path, isDir, false);
+      default: throw 'unreachable';
+    }
+  }
+
+  /// Returns one or more events that describe the change between the last known
+  /// state of [path] and its current state on the filesystem.
+  ///
+  /// This returns a list whose order should be reflected in the events emitted
+  /// to the user, unlike the batched events from [Directory.watch]. The
+  /// returned list may be empty, indicating that no changes occurred to [path]
+  /// (probably indicating that it was created and then immediately deleted).
+  List<FileSystemEvent> _eventsBasedOnFileSystem(String path) {
+    var fileExisted = _files.contains(path);
+    var dirExisted = _files.containsDir(path);
+    var fileExists = new File(path).existsSync();
+    var dirExists = new Directory(path).existsSync();
+
+    var events = [];
+    if (fileExisted) {
+      if (fileExists) {
+        events.add(new ConstructableFileSystemModifyEvent(path, false, false));
+      } else {
+        events.add(new ConstructableFileSystemDeleteEvent(path, false));
+      }
+    } else if (dirExisted) {
+      if (dirExists) {
+        // If we got contradictory events for a directory that used to exist and
+        // still exists, we need to rescan the whole thing in case it was
+        // replaced with a different directory.
+        events.add(new ConstructableFileSystemDeleteEvent(path, true));
+        events.add(new ConstructableFileSystemCreateEvent(path, true));
+      } else {
+        events.add(new ConstructableFileSystemDeleteEvent(path, true));
+      }
+    }
+
+    if (!fileExisted && fileExists) {
+      events.add(new ConstructableFileSystemCreateEvent(path, false));
+    } else if (!dirExisted && dirExists) {
+      events.add(new ConstructableFileSystemCreateEvent(path, true));
+    }
+
+    return events;
+  }
+
+  /// The callback that's run when the [Directory.watch] stream is closed.
+  void _onDone() {
+    _watchSubscription = null;
+
+    // If the directory still exists and we're still expecting bogus events,
+    // this is probably issue 14849 rather than a real close event. We should
+    // just restart the watcher.
+    if (!isReady && new Directory(path).existsSync()) {
+      _startWatch();
+      return;
+    }
+
+    // FSEvents can fail to report the contents of the directory being removed
+    // when the directory itself is removed, so we need to manually mark the
+    // files as removed.
+    for (var file in _files.toSet()) {
+      _emitEvent(ChangeType.REMOVE, file);
+    }
+    _files.clear();
+    close();
+  }
+
+  /// Start or restart the underlying [Directory.watch] stream.
+  void _startWatch() {
+    // Batch the FSEvent changes together so that we can dedup events.
+    var innerStream = new Directory(path).watch(recursive: true)
+        .transform(new BatchedStreamTransformer<FileSystemEvent>());
+    _watchSubscription = innerStream.listen(_onBatch,
+        onError: _eventsController.addError,
+        onDone: _onDone);
+  }
+
+  /// Starts or restarts listing the watched directory to get an initial picture
+  /// of its state.
+  Future _listDir() {
+    assert(!isReady);
+    if (_initialListSubscription != null) _initialListSubscription.cancel();
+
+    _files.clear();
+    var completer = new Completer();
+    var stream = new Directory(path).list(recursive: true);
+    _initialListSubscription = stream.listen((entity) {
+      if (entity is! Directory) _files.add(entity.path);
+    },
+        onError: _emitError,
+        onDone: completer.complete,
+        cancelOnError: true);
+    return completer.future;
+  }
+
+  /// Wait 200ms for a batch of bogus events (issue 14373) to come in.
+  ///
+  /// 200ms is short in terms of human interaction, but longer than any Mac OS
+  /// watcher tests take on the bots, so it should be safe to assume that any
+  /// bogus events will be signaled in that time frame.
+  Future _waitForBogusEvents() {
+    var completer = new Completer();
+    _bogusEventTimer = new Timer(
+        new Duration(milliseconds: 200),
+        completer.complete);
+    return completer.future;
+  }
+
+  /// Emit an event with the given [type] and [path].
+  void _emitEvent(ChangeType type, String path) {
+    if (!isReady) return;
+    _eventsController.add(new WatchEvent(type, path));
+  }
+
+  /// Emit an error, then close the watcher.
+  void _emitError(error, StackTrace stackTrace) {
+    _eventsController.addError(error, stackTrace);
+    close();
+  }
+}
diff --git a/mojo/public/dart/third_party/watcher/lib/src/directory_watcher/polling.dart b/mojo/public/dart/third_party/watcher/lib/src/directory_watcher/polling.dart
new file mode 100644
index 0000000..7f417d6
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/lib/src/directory_watcher/polling.dart
@@ -0,0 +1,182 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library watcher.directory_watcher.polling;
+
+import 'dart:async';
+import 'dart:io';
+
+import '../async_queue.dart';
+import '../directory_watcher.dart';
+import '../resubscribable.dart';
+import '../stat.dart';
+import '../utils.dart';
+import '../watch_event.dart';
+
+/// Periodically polls a directory for changes.
+class PollingDirectoryWatcher extends ResubscribableWatcher
+    implements DirectoryWatcher {
+  String get directory => path;
+
+  /// Creates a new polling watcher monitoring [directory].
+  ///
+  /// If [_pollingDelay] is passed, it specifies the amount of time the watcher
+  /// will pause between successive polls of the directory contents. Making this
+  /// shorter will give more immediate feedback at the expense of doing more IO
+  /// and higher CPU usage. Defaults to one second.
+  PollingDirectoryWatcher(String directory, {Duration pollingDelay})
+      : super(directory, () {
+        return new _PollingDirectoryWatcher(directory,
+            pollingDelay != null ? pollingDelay : new Duration(seconds: 1));
+      });
+}
+
+class _PollingDirectoryWatcher
+    implements DirectoryWatcher, ManuallyClosedWatcher {
+  String get directory => path;
+  final String path;
+
+  Stream<WatchEvent> get events => _events.stream;
+  final _events = new StreamController<WatchEvent>.broadcast();
+
+  bool get isReady => _ready.isCompleted;
+
+  Future get ready => _ready.future;
+  final _ready = new Completer();
+
+  /// The amount of time the watcher pauses between successive polls of the
+  /// directory contents.
+  final Duration _pollingDelay;
+
+  /// The previous modification times of the files in the directory.
+  ///
+  /// Used to tell which files have been modified.
+  final _lastModifieds = new Map<String, DateTime>();
+
+  /// The subscription used while [directory] is being listed.
+  ///
+  /// Will be `null` if a list is not currently happening.
+  StreamSubscription<FileSystemEntity> _listSubscription;
+
+  /// The queue of files waiting to be processed to see if they have been
+  /// modified.
+  ///
+  /// Processing a file is asynchronous, as is listing the directory, so the
+  /// queue exists to let each of those proceed at their own rate. The lister
+  /// will enqueue files as quickly as it can. Meanwhile, files are dequeued
+  /// and processed sequentially.
+  AsyncQueue<String> _filesToProcess;
+
+  /// The set of files that have been seen in the current directory listing.
+  ///
+  /// Used to tell which files have been removed: files that are in [_statuses]
+  /// but not in here when a poll completes have been removed.
+  final _polledFiles = new Set<String>();
+
+  _PollingDirectoryWatcher(this.path, this._pollingDelay) {
+    _filesToProcess = new AsyncQueue<String>(_processFile,
+        onError: (e, stackTrace) {
+      if (!_events.isClosed) _events.addError(e, stackTrace);
+    });
+
+    _poll();
+  }
+
+  void close() {
+    _events.close();
+
+    // If we're in the middle of listing the directory, stop.
+    if (_listSubscription != null) _listSubscription.cancel();
+
+    // Don't process any remaining files.
+    _filesToProcess.clear();
+    _polledFiles.clear();
+    _lastModifieds.clear();
+  }
+
+  /// Scans the contents of the directory once to see which files have been
+  /// added, removed, and modified.
+  void _poll() {
+    _filesToProcess.clear();
+    _polledFiles.clear();
+
+    endListing() {
+      assert(!_events.isClosed);
+      _listSubscription = null;
+
+      // Null tells the queue consumer that we're done listing.
+      _filesToProcess.add(null);
+    }
+
+    var stream = new Directory(path).list(recursive: true);
+    _listSubscription = stream.listen((entity) {
+      assert(!_events.isClosed);
+
+      if (entity is! File) return;
+      _filesToProcess.add(entity.path);
+    }, onError: (error, stackTrace) {
+      if (!isDirectoryNotFoundException(error)) {
+        // It's some unknown error. Pipe it over to the event stream so the
+        // user can see it.
+        _events.addError(error, stackTrace);
+      }
+
+      // When an error occurs, we end the listing normally, which has the
+      // desired effect of marking all files that were in the directory as
+      // being removed.
+      endListing();
+    }, onDone: endListing, cancelOnError: true);
+  }
+
+  /// Processes [file] to determine if it has been modified since the last
+  /// time it was scanned.
+  Future _processFile(String file) {
+    // `null` is the sentinel which means the directory listing is complete.
+    if (file == null) return _completePoll();
+
+    return getModificationTime(file).then((modified) {
+      if (_events.isClosed) return null;
+
+      var lastModified = _lastModifieds[file];
+
+      // If its modification time hasn't changed, assume the file is unchanged.
+      if (lastModified != null && lastModified == modified) {
+        // The file is still here.
+        _polledFiles.add(file);
+        return null;
+      }
+
+      if (_events.isClosed) return null;
+
+      _lastModifieds[file] = modified;
+      _polledFiles.add(file);
+
+      // Only notify if we're ready to emit events.
+      if (!isReady) return null;
+
+      var type = lastModified == null ? ChangeType.ADD : ChangeType.MODIFY;
+      _events.add(new WatchEvent(type, file));
+    });
+  }
+
+  /// After the directory listing is complete, this determines which files were
+  /// removed and then restarts the next poll.
+  Future _completePoll() {
+    // Any files that were not seen in the last poll but that we have a
+    // status for must have been removed.
+    var removedFiles = _lastModifieds.keys.toSet().difference(_polledFiles);
+    for (var removed in removedFiles) {
+      if (isReady) _events.add(new WatchEvent(ChangeType.REMOVE, removed));
+      _lastModifieds.remove(removed);
+    }
+
+    if (!isReady) _ready.complete();
+
+    // Wait and then poll again.
+    return new Future.delayed(_pollingDelay).then((_) {
+      if (_events.isClosed) return;
+      _poll();
+    });
+  }
+}
diff --git a/mojo/public/dart/third_party/watcher/lib/src/directory_watcher/windows.dart b/mojo/public/dart/third_party/watcher/lib/src/directory_watcher/windows.dart
new file mode 100644
index 0000000..0899519
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/lib/src/directory_watcher/windows.dart
@@ -0,0 +1,408 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// TODO(rnystrom): Merge with mac_os version.
+
+library watcher.directory_watcher.windows;
+
+import 'dart:async';
+import 'dart:collection';
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+
+import '../constructable_file_system_event.dart';
+import '../directory_watcher.dart';
+import '../path_set.dart';
+import '../resubscribable.dart';
+import '../utils.dart';
+import '../watch_event.dart';
+
+class WindowsDirectoryWatcher extends ResubscribableWatcher
+    implements DirectoryWatcher {
+  String get directory => path;
+
+  WindowsDirectoryWatcher(String directory)
+      : super(directory, () => new _WindowsDirectoryWatcher(directory));
+}
+
+class _EventBatcher {
+  static const Duration _BATCH_DELAY = const Duration(milliseconds: 100);
+  final List<FileSystemEvent> events = [];
+  Timer timer;
+
+  void addEvent(FileSystemEvent event, void callback()) {
+    events.add(event);
+    if (timer != null) {
+      timer.cancel();
+    }
+    timer = new Timer(_BATCH_DELAY, callback);
+  }
+
+  void cancelTimer() {
+    timer.cancel();
+  }
+}
+
+class _WindowsDirectoryWatcher
+    implements DirectoryWatcher, ManuallyClosedWatcher {
+  String get directory => path;
+  final String path;
+
+  Stream<WatchEvent> get events => _eventsController.stream;
+  final _eventsController = new StreamController<WatchEvent>.broadcast();
+
+  bool get isReady => _readyCompleter.isCompleted;
+
+  Future get ready => _readyCompleter.future;
+  final _readyCompleter = new Completer();
+
+  final Map<String, _EventBatcher> _eventBatchers =
+      new HashMap<String, _EventBatcher>();
+
+  /// The set of files that are known to exist recursively within the watched
+  /// directory.
+  ///
+  /// The state of files on the filesystem is compared against this to determine
+  /// the real change that occurred. This is also used to emit REMOVE events
+  /// when subdirectories are moved out of the watched directory.
+  final PathSet _files;
+
+  /// The subscription to the stream returned by [Directory.watch].
+  StreamSubscription<FileSystemEvent> _watchSubscription;
+
+  /// The subscription to the stream returned by [Directory.watch] of the
+  /// parent directory to [directory]. This is needed to detect changes to
+  /// [directory], as they are not included on Windows.
+  StreamSubscription<FileSystemEvent> _parentWatchSubscription;
+
+  /// The subscription to the [Directory.list] call for the initial listing of
+  /// the directory to determine its initial state.
+  StreamSubscription<FileSystemEntity> _initialListSubscription;
+
+  /// The subscriptions to the [Directory.list] calls for listing the contents
+  /// of subdirectories that were moved into the watched directory.
+  final Set<StreamSubscription<FileSystemEntity>> _listSubscriptions
+      = new HashSet<StreamSubscription<FileSystemEntity>>();
+
+  _WindowsDirectoryWatcher(String path)
+      : path = path,
+        _files = new PathSet(path) {
+    // Before we're ready to emit events, wait for [_listDir] to complete.
+    _listDir().then((_) {
+      _startWatch();
+      _startParentWatcher();
+      _readyCompleter.complete();
+    });
+  }
+
+  void close() {
+    if (_watchSubscription != null) _watchSubscription.cancel();
+    if (_parentWatchSubscription != null) _parentWatchSubscription.cancel();
+    if (_initialListSubscription != null) _initialListSubscription.cancel();
+    for (var sub in _listSubscriptions) {
+      sub.cancel();
+    }
+    _listSubscriptions.clear();
+    for (var batcher in _eventBatchers.values) {
+      batcher.cancelTimer();
+    }
+    _eventBatchers.clear();
+    _watchSubscription = null;
+    _parentWatchSubscription = null;
+    _initialListSubscription = null;
+    _eventsController.close();
+  }
+
+  /// On Windows, if [directory] is deleted, we will not receive any event.
+  ///
+  /// Instead, we add a watcher on the parent folder (if any), that can notify
+  /// us about [path]. This also includes events such as moves.
+  void _startParentWatcher() {
+    var absoluteDir = p.absolute(path);
+    var parent = p.dirname(absoluteDir);
+    // Check if [path] is already the root directory.
+    if (FileSystemEntity.identicalSync(parent, path)) return;
+    var parentStream = new Directory(parent).watch(recursive: false);
+    _parentWatchSubscription = parentStream.listen((event) {
+      // Only look at events for 'directory'.
+      if (p.basename(event.path) != p.basename(absoluteDir)) return;
+      // Test if the directory is removed. FileSystemEntity.typeSync will
+      // return NOT_FOUND if it's unable to decide upon the type, including
+      // access denied issues, which may happen when the directory is deleted.
+      // FileSystemMoveEvent and FileSystemDeleteEvent events will always mean
+      // the directory is now gone.
+      if (event is FileSystemMoveEvent ||
+          event is FileSystemDeleteEvent ||
+          (FileSystemEntity.typeSync(path) ==
+           FileSystemEntityType.NOT_FOUND)) {
+        for (var path in _files.toSet()) {
+          _emitEvent(ChangeType.REMOVE, path);
+        }
+        _files.clear();
+        close();
+      }
+    }, onError: (error) {
+      // Ignore errors, simply close the stream. The user listens on
+      // [directory], and while it can fail to listen on the parent, we may
+      // still be able to listen on the path requested.
+      _parentWatchSubscription.cancel();
+      _parentWatchSubscription = null;
+    });
+  }
+
+  void _onEvent(FileSystemEvent event) {
+    assert(isReady);
+    final batcher = _eventBatchers.putIfAbsent(
+        event.path, () => new _EventBatcher());
+    batcher.addEvent(event, () {
+      _eventBatchers.remove(event.path);
+      _onBatch(batcher.events);
+    });
+  }
+
+  /// The callback that's run when [Directory.watch] emits a batch of events.
+  void _onBatch(List<FileSystemEvent> batch) {
+    _sortEvents(batch).forEach((path, events) {
+
+      var canonicalEvent = _canonicalEvent(events);
+      events = canonicalEvent == null ?
+          _eventsBasedOnFileSystem(path) : [canonicalEvent];
+
+      for (var event in events) {
+        if (event is FileSystemCreateEvent) {
+          if (!event.isDirectory) {
+            if (_files.contains(path)) continue;
+
+            _emitEvent(ChangeType.ADD, path);
+            _files.add(path);
+            continue;
+          }
+
+          if (_files.containsDir(path)) continue;
+
+          var stream = new Directory(path).list(recursive: true);
+          var sub;
+          sub = stream.listen((entity) {
+            if (entity is Directory) return;
+            if (_files.contains(path)) return;
+
+            _emitEvent(ChangeType.ADD, entity.path);
+            _files.add(entity.path);
+          }, onDone: () {
+            _listSubscriptions.remove(sub);
+          }, onError: (e, stackTrace) {
+            _listSubscriptions.remove(sub);
+            _emitError(e, stackTrace);
+          }, cancelOnError: true);
+          _listSubscriptions.add(sub);
+        } else if (event is FileSystemModifyEvent) {
+          if (!event.isDirectory) {
+            _emitEvent(ChangeType.MODIFY, path);
+          }
+        } else {
+          assert(event is FileSystemDeleteEvent);
+          for (var removedPath in _files.remove(path)) {
+            _emitEvent(ChangeType.REMOVE, removedPath);
+          }
+        }
+      }
+    });
+  }
+
+  /// Sort all the events in a batch into sets based on their path.
+  ///
+  /// A single input event may result in multiple events in the returned map;
+  /// for example, a MOVE event becomes a DELETE event for the source and a
+  /// CREATE event for the destination.
+  ///
+  /// The returned events won't contain any [FileSystemMoveEvent]s, nor will it
+  /// contain any events relating to [path].
+  Map<String, Set<FileSystemEvent>> _sortEvents(List<FileSystemEvent> batch) {
+    var eventsForPaths = {};
+
+    // Events within directories that already have events are superfluous; the
+    // directory's full contents will be examined anyway, so we ignore such
+    // events. Emitting them could cause useless or out-of-order events.
+    var directories = unionAll(batch.map((event) {
+      if (!event.isDirectory) return new Set();
+      if (event is! FileSystemMoveEvent) return new Set.from([event.path]);
+      return new Set.from([event.path, event.destination]);
+    }));
+
+    isInModifiedDirectory(path) =>
+        directories.any((dir) => path != dir && path.startsWith(dir));
+
+    addEvent(path, event) {
+      if (isInModifiedDirectory(path)) return;
+      var set = eventsForPaths.putIfAbsent(path, () => new Set());
+      set.add(event);
+    }
+
+    for (var event in batch) {
+      if (event is FileSystemMoveEvent) {
+        addEvent(event.destination, event);
+      }
+      addEvent(event.path, event);
+    }
+
+    return eventsForPaths;
+  }
+
+  /// Returns the canonical event from a batch of events on the same path, if
+  /// one exists.
+  ///
+  /// If [batch] doesn't contain any contradictory events (e.g. DELETE and
+  /// CREATE, or events with different values for [isDirectory]), this returns a
+  /// single event that describes what happened to the path in question.
+  ///
+  /// If [batch] does contain contradictory events, this returns `null` to
+  /// indicate that the state of the path on the filesystem should be checked to
+  /// determine what occurred.
+  FileSystemEvent _canonicalEvent(Set<FileSystemEvent> batch) {
+    // An empty batch indicates that we've learned earlier that the batch is
+    // contradictory (e.g. because of a move).
+    if (batch.isEmpty) return null;
+
+    var type = batch.first.type;
+    var isDir = batch.first.isDirectory;
+
+    for (var event in batch.skip(1)) {
+      // If one event reports that the file is a directory and another event
+      // doesn't, that's a contradiction.
+      if (isDir != event.isDirectory) return null;
+
+      // Modify events don't contradict either CREATE or REMOVE events. We can
+      // safely assume the file was modified after a CREATE or before the
+      // REMOVE; otherwise there will also be a REMOVE or CREATE event
+      // (respectively) that will be contradictory.
+      if (event is FileSystemModifyEvent) continue;
+      assert(event is FileSystemCreateEvent ||
+             event is FileSystemDeleteEvent ||
+             event is FileSystemMoveEvent);
+
+      // If we previously thought this was a MODIFY, we now consider it to be a
+      // CREATE or REMOVE event. This is safe for the same reason as above.
+      if (type == FileSystemEvent.MODIFY) {
+        type = event.type;
+        continue;
+      }
+
+      // A CREATE event contradicts a REMOVE event and vice versa.
+      assert(type == FileSystemEvent.CREATE ||
+             type == FileSystemEvent.DELETE ||
+             type == FileSystemEvent.MOVE);
+      if (type != event.type) return null;
+    }
+
+    switch (type) {
+      case FileSystemEvent.CREATE:
+        return new ConstructableFileSystemCreateEvent(batch.first.path, isDir);
+      case FileSystemEvent.DELETE:
+        return new ConstructableFileSystemDeleteEvent(batch.first.path, isDir);
+      case FileSystemEvent.MODIFY:
+        return new ConstructableFileSystemModifyEvent(
+            batch.first.path, isDir, false);
+      case FileSystemEvent.MOVE:
+        return null;
+      default: throw 'unreachable';
+    }
+  }
+
+  /// Returns one or more events that describe the change between the last known
+  /// state of [path] and its current state on the filesystem.
+  ///
+  /// This returns a list whose order should be reflected in the events emitted
+  /// to the user, unlike the batched events from [Directory.watch]. The
+  /// returned list may be empty, indicating that no changes occurred to [path]
+  /// (probably indicating that it was created and then immediately deleted).
+  List<FileSystemEvent> _eventsBasedOnFileSystem(String path) {
+    var fileExisted = _files.contains(path);
+    var dirExisted = _files.containsDir(path);
+    var fileExists = new File(path).existsSync();
+    var dirExists = new Directory(path).existsSync();
+
+    var events = [];
+    if (fileExisted) {
+      if (fileExists) {
+        events.add(new ConstructableFileSystemModifyEvent(path, false, false));
+      } else {
+        events.add(new ConstructableFileSystemDeleteEvent(path, false));
+      }
+    } else if (dirExisted) {
+      if (dirExists) {
+        // If we got contradictory events for a directory that used to exist and
+        // still exists, we need to rescan the whole thing in case it was
+        // replaced with a different directory.
+        events.add(new ConstructableFileSystemDeleteEvent(path, true));
+        events.add(new ConstructableFileSystemCreateEvent(path, true));
+      } else {
+        events.add(new ConstructableFileSystemDeleteEvent(path, true));
+      }
+    }
+
+    if (!fileExisted && fileExists) {
+      events.add(new ConstructableFileSystemCreateEvent(path, false));
+    } else if (!dirExisted && dirExists) {
+      events.add(new ConstructableFileSystemCreateEvent(path, true));
+    }
+
+    return events;
+  }
+
+  /// The callback that's run when the [Directory.watch] stream is closed.
+  /// Note that this is unlikely to happen on Windows, unless the system itself
+  /// closes the handle.
+  void _onDone() {
+    _watchSubscription = null;
+
+    // Emit remove events for any remaining files.
+    for (var file in _files.toSet()) {
+      _emitEvent(ChangeType.REMOVE, file);
+    }
+    _files.clear();
+    close();
+  }
+
+  /// Start or restart the underlying [Directory.watch] stream.
+  void _startWatch() {
+    // Batch the events together so that we can dedup events.
+    var innerStream = new Directory(path).watch(recursive: true);
+    _watchSubscription = innerStream.listen(_onEvent,
+        onError: _eventsController.addError,
+        onDone: _onDone);
+  }
+
+  /// Starts or restarts listing the watched directory to get an initial picture
+  /// of its state.
+  Future _listDir() {
+    assert(!isReady);
+    if (_initialListSubscription != null) _initialListSubscription.cancel();
+
+    _files.clear();
+    var completer = new Completer();
+    var stream = new Directory(path).list(recursive: true);
+    void handleEntity(entity) {
+      if (entity is! Directory) _files.add(entity.path);
+    }
+    _initialListSubscription = stream.listen(
+        handleEntity,
+        onError: _emitError,
+        onDone: completer.complete,
+        cancelOnError: true);
+    return completer.future;
+  }
+
+  /// Emit an event with the given [type] and [path].
+  void _emitEvent(ChangeType type, String path) {
+    if (!isReady) return;
+
+    _eventsController.add(new WatchEvent(type, path));
+  }
+
+  /// Emit an error, then close the watcher.
+  void _emitError(error, StackTrace stackTrace) {
+    _eventsController.addError(error, stackTrace);
+    close();
+  }
+}
diff --git a/mojo/public/dart/third_party/watcher/lib/src/file_watcher.dart b/mojo/public/dart/third_party/watcher/lib/src/file_watcher.dart
new file mode 100644
index 0000000..9b31537
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/lib/src/file_watcher.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library watcher.file_watcher;
+
+import 'dart:io';
+
+import 'watch_event.dart';
+import '../watcher.dart';
+import 'file_watcher/native.dart';
+import 'file_watcher/polling.dart';
+
+/// Watches a file and emits [WatchEvent]s when the file has changed.
+///
+/// Note that since each watcher only watches a single file, it will only emit
+/// [ChangeType.MODIFY] events, except when the file is deleted at which point
+/// it will emit a single [ChangeType.REMOVE] event and then close the stream.
+///
+/// If the file is deleted and quickly replaced (when a new file is moved in its
+/// place, for example) this will emit a [ChangeTime.MODIFY] event.
+abstract class FileWatcher implements Watcher {
+  /// Creates a new [FileWatcher] monitoring [file].
+  ///
+  /// If a native file watcher is available for this platform, this will use it.
+  /// Otherwise, it will fall back to a [PollingFileWatcher]. Notably, native
+  /// file watching is *not* supported on Windows.
+  ///
+  /// If [pollingDelay] is passed, it specifies the amount of time the watcher
+  /// will pause between successive polls of the directory contents. Making this
+  /// shorter will give more immediate feedback at the expense of doing more IO
+  /// and higher CPU usage. Defaults to one second. Ignored for non-polling
+  /// watchers.
+  factory FileWatcher(String file, {Duration pollingDelay}) {
+    // [File.watch] doesn't work on Windows, but
+    // [FileSystemEntity.isWatchSupported] is still true because directory
+    // watching does work.
+    if (FileSystemEntity.isWatchSupported && !Platform.isWindows) {
+      return new NativeFileWatcher(file);
+    }
+    return new PollingFileWatcher(file, pollingDelay: pollingDelay);
+  }
+}
diff --git a/mojo/public/dart/third_party/watcher/lib/src/file_watcher/native.dart b/mojo/public/dart/third_party/watcher/lib/src/file_watcher/native.dart
new file mode 100644
index 0000000..1862e7b
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/lib/src/file_watcher/native.dart
@@ -0,0 +1,87 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library watcher.file_watcher.native;
+
+import 'dart:async';
+import 'dart:io';
+
+import '../file_watcher.dart';
+import '../resubscribable.dart';
+import '../utils.dart';
+import '../watch_event.dart';
+
+/// Uses the native file system notifications to watch for filesystem events.
+///
+/// Single-file notifications are much simpler than those for multiple files, so
+/// this doesn't need to be split out into multiple OS-specific classes.
+class NativeFileWatcher extends ResubscribableWatcher implements FileWatcher {
+  NativeFileWatcher(String path)
+      : super(path, () => new _NativeFileWatcher(path));
+}
+
+class _NativeFileWatcher implements FileWatcher, ManuallyClosedWatcher {
+  final String path;
+
+  Stream<WatchEvent> get events => _eventsController.stream;
+  final _eventsController = new StreamController<WatchEvent>.broadcast();
+
+  bool get isReady => _readyCompleter.isCompleted;
+
+  Future get ready => _readyCompleter.future;
+  final _readyCompleter = new Completer();
+
+  StreamSubscription _subscription;
+
+  _NativeFileWatcher(this.path) {
+    _listen();
+
+    // We don't need to do any initial set-up, so we're ready immediately after
+    // being listened to.
+    _readyCompleter.complete();
+  }
+
+  void _listen() {
+    // Batch the events together so that we can dedup them.
+    _subscription = new File(path).watch()
+        .transform(new BatchedStreamTransformer<FileSystemEvent>())
+        .listen(_onBatch, onError: _eventsController.addError, onDone: _onDone);
+  }
+
+  void _onBatch(List<FileSystemEvent> batch) {
+    if (batch.any((event) => event.type == FileSystemEvent.DELETE)) {
+      // If the file is deleted, the underlying stream will close. We handle
+      // emitting our own REMOVE event in [_onDone].
+      return;
+    }
+
+    _eventsController.add(new WatchEvent(ChangeType.MODIFY, path));
+  }
+
+  _onDone() async {
+    var fileExists = await new File(path).exists();
+
+    // Check for this after checking whether the file exists because it's
+    // possible that [close] was called between [File.exists] being called and
+    // it completing.
+    if (_eventsController.isClosed) return;
+
+    if (fileExists) {
+      // If the file exists now, it was probably removed and quickly replaced;
+      // this can happen for example when another file is moved on top of it.
+      // Re-subscribe and report a modify event.
+      _eventsController.add(new WatchEvent(ChangeType.MODIFY, path));
+      _listen();
+    } else {
+      _eventsController.add(new WatchEvent(ChangeType.REMOVE, path));
+      close();
+    }
+  }
+
+  void close() {
+    if (_subscription != null) _subscription.cancel();
+    _subscription = null;
+    _eventsController.close();
+  }
+}
diff --git a/mojo/public/dart/third_party/watcher/lib/src/file_watcher/polling.dart b/mojo/public/dart/third_party/watcher/lib/src/file_watcher/polling.dart
new file mode 100644
index 0000000..3480ae2
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/lib/src/file_watcher/polling.dart
@@ -0,0 +1,93 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library watcher.file_watcher.polling;
+
+import 'dart:async';
+import 'dart:io';
+
+import '../file_watcher.dart';
+import '../resubscribable.dart';
+import '../stat.dart';
+import '../watch_event.dart';
+
+/// Periodically polls a file for changes.
+class PollingFileWatcher extends ResubscribableWatcher implements FileWatcher {
+  PollingFileWatcher(String path, {Duration pollingDelay})
+      : super(path, () {
+        return new _PollingFileWatcher(path,
+            pollingDelay != null ? pollingDelay : new Duration(seconds: 1));
+      });
+}
+
+class _PollingFileWatcher implements FileWatcher, ManuallyClosedWatcher {
+  final String path;
+
+  Stream<WatchEvent> get events => _eventsController.stream;
+  final _eventsController = new StreamController<WatchEvent>.broadcast();
+
+  bool get isReady => _readyCompleter.isCompleted;
+
+  Future get ready => _readyCompleter.future;
+  final _readyCompleter = new Completer();
+
+  /// The timer that controls polling.
+  Timer _timer;
+
+  /// The previous modification time of the file.
+  ///
+  /// Used to tell when the file was modified. This is `null` before the file's
+  /// mtime has first been checked.
+  DateTime _lastModified;
+
+  _PollingFileWatcher(this.path, Duration pollingDelay) {
+    _timer = new Timer.periodic(pollingDelay, (_) => _poll());
+    _poll();
+  }
+
+  /// Checks the mtime of the file and whether it's been removed.
+  Future _poll() async {
+    // We don't mark the file as removed if this is the first poll (indicated by
+    // [_lastModified] being null). Instead, below we forward the dart:io error
+    // that comes from trying to read the mtime below.
+    var pathExists = await new File(path).exists();
+    if (_eventsController.isClosed) return;
+
+    if (_lastModified != null && !pathExists) {
+      _eventsController.add(new WatchEvent(ChangeType.REMOVE, path));
+      close();
+      return;
+    }
+
+    var modified;
+    try {
+      try {
+        modified = await getModificationTime(path);
+      } finally {
+        if (_eventsController.isClosed) return;
+      }
+    } on FileSystemException catch (error, stackTrace) {
+      _eventsController.addError(error, stackTrace);
+      close();
+      return;
+    }
+
+    if (_lastModified == modified) return;
+
+    if (_lastModified == null) {
+      // If this is the first poll, don't emit an event, just set the last mtime
+      // and complete the completer.
+      _lastModified = modified;
+      _readyCompleter.complete();
+    } else {
+      _lastModified = modified;
+      _eventsController.add(new WatchEvent(ChangeType.MODIFY, path));
+    }
+  }
+
+  void close() {
+    _timer.cancel();
+    _eventsController.close();
+  }
+}
diff --git a/mojo/public/dart/third_party/watcher/lib/src/path_set.dart b/mojo/public/dart/third_party/watcher/lib/src/path_set.dart
new file mode 100644
index 0000000..e9f7d32
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/lib/src/path_set.dart
@@ -0,0 +1,168 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library watcher.path_dart;
+
+import 'dart:collection';
+
+import 'package:path/path.dart' as p;
+
+/// A set of paths, organized into a directory hierarchy.
+///
+/// When a path is [add]ed, it creates an implicit directory structure above
+/// that path. Directories can be inspected using [containsDir] and removed
+/// using [remove]. If they're removed, their contents are removed as well.
+///
+/// The paths in the set are normalized so that they all begin with [root].
+class PathSet {
+  /// The root path, which all paths in the set must be under.
+  final String root;
+
+  /// The path set's directory hierarchy.
+  ///
+  /// Each level of this hierarchy has the same structure: a map from strings to
+  /// other maps, which are further levels of the hierarchy. A map with no
+  /// elements indicates a path that was added to the set that has no paths
+  /// beneath it. Such a path should not be treated as a directory by
+  /// [containsDir].
+  final _entries = new Map<String, Map>();
+
+  /// The set of paths that were explicitly added to this set.
+  ///
+  /// This is needed to disambiguate a directory that was explicitly added to
+  /// the set from a directory that was implicitly added by adding a path
+  /// beneath it.
+  final _paths = new Set<String>();
+
+  PathSet(this.root);
+
+  /// Adds [path] to the set.
+  void add(String path) {
+    path = _normalize(path);
+    _paths.add(path);
+
+    var parts = _split(path);
+    var dir = _entries;
+    for (var part in parts) {
+      dir = dir.putIfAbsent(part, () => {});
+    }
+  }
+
+  /// Removes [path] and any paths beneath it from the set and returns the
+  /// removed paths.
+  ///
+  /// Even if [path] itself isn't in the set, if it's a directory containing
+  /// paths that are in the set those paths will be removed and returned.
+  ///
+  /// If neither [path] nor any paths beneath it are in the set, returns an
+  /// empty set.
+  Set<String> remove(String path) {
+    path = _normalize(path);
+    var parts = new Queue.from(_split(path));
+
+    // Remove the children of [dir], as well as [dir] itself if necessary.
+    //
+    // [partialPath] is the path to [dir], and a prefix of [path]; the remaining
+    // components of [path] are in [parts].
+    recurse(dir, partialPath) {
+      if (parts.length > 1) {
+        // If there's more than one component left in [path], recurse down to
+        // the next level.
+        var part = parts.removeFirst();
+        var entry = dir[part];
+        if (entry == null || entry.isEmpty) return new Set();
+
+        partialPath = p.join(partialPath, part);
+        var paths = recurse(entry, partialPath);
+        // After removing this entry's children, if it has no more children and
+        // it's not in the set in its own right, remove it as well.
+        if (entry.isEmpty && !_paths.contains(partialPath)) dir.remove(part);
+        return paths;
+      }
+
+      // If there's only one component left in [path], we should remove it.
+      var entry = dir.remove(parts.first);
+      if (entry == null) return new Set();
+
+      if (entry.isEmpty) {
+        _paths.remove(path);
+        return new Set.from([path]);
+      }
+
+      var set = _removePathsIn(entry, path);
+      if (_paths.contains(path)) {
+        _paths.remove(path);
+        set.add(path);
+      }
+      return set;
+    }
+
+    return recurse(_entries, root);
+  }
+
+  /// Recursively removes and returns all paths in [dir].
+  ///
+  /// [root] should be the path to [dir].
+  Set<String> _removePathsIn(Map dir, String root) {
+    var removedPaths = new Set();
+    recurse(dir, path) {
+      dir.forEach((name, entry) {
+        var entryPath = p.join(path, name);
+        if (_paths.remove(entryPath)) removedPaths.add(entryPath);
+        recurse(entry, entryPath);
+      });
+    }
+
+    recurse(dir, root);
+    return removedPaths;
+  }
+
+  /// Returns whether [this] contains [path].
+  ///
+  /// This only returns true for paths explicitly added to [this].
+  /// Implicitly-added directories can be inspected using [containsDir].
+  bool contains(String path) => _paths.contains(_normalize(path));
+
+  /// Returns whether [this] contains paths beneath [path].
+  bool containsDir(String path) {
+    path = _normalize(path);
+    var dir = _entries;
+
+    for (var part in _split(path)) {
+      dir = dir[part];
+      if (dir == null) return false;
+    }
+
+    return !dir.isEmpty;
+  }
+
+  /// Returns a [Set] of all paths in [this].
+  Set<String> toSet() => _paths.toSet();
+
+  /// Removes all paths from [this].
+  void clear() {
+    _paths.clear();
+    _entries.clear();
+  }
+
+  String toString() => _paths.toString();
+
+  /// Returns a normalized version of [path].
+  ///
+  /// This removes any extra ".." or "."s and ensure that the returned path
+  /// begins with [root]. It's an error if [path] isn't within [root].
+  String _normalize(String path) {
+    var relative = p.relative(p.normalize(path), from: root);
+    var parts = p.split(relative);
+    // TODO(nweiz): replace this with [p.isWithin] when that exists (issue
+    // 14980).
+    if (!p.isRelative(relative) || parts.first == '..' || parts.first == '.') {
+      throw new ArgumentError('Path "$path" is not inside "$root".');
+    }
+    return p.join(root, relative);
+  }
+
+  /// Returns the segments of [path] beneath [root].
+  List<String> _split(String path) => p.split(p.relative(path, from: root));
+}
diff --git a/mojo/public/dart/third_party/watcher/lib/src/resubscribable.dart b/mojo/public/dart/third_party/watcher/lib/src/resubscribable.dart
new file mode 100644
index 0000000..2844c1e
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/lib/src/resubscribable.dart
@@ -0,0 +1,77 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library watcher.resubscribable;
+
+import 'dart:async';
+
+import '../watcher.dart';
+import 'watch_event.dart';
+
+typedef ManuallyClosedWatcher WatcherFactory();
+
+/// A wrapper for [ManuallyClosedWatcher] that encapsulates support for closing
+/// the watcher when it has no subscribers and re-opening it when it's
+/// re-subscribed.
+///
+/// It's simpler to implement watchers without worrying about this behavior.
+/// This class wraps a watcher class which can be written with the simplifying
+/// assumption that it can continue emitting events until an explicit `close`
+/// method is called, at which point it will cease emitting events entirely. The
+/// [ManuallyClosedWatcher] interface is used for these watchers.
+///
+/// This would be more cleanly implemented as a function that takes a class and
+/// emits a new class, but Dart doesn't support that sort of thing. Instead it
+/// takes a factory function that produces instances of the inner class.
+abstract class ResubscribableWatcher implements Watcher {
+  /// The factory function that produces instances of the inner class.
+  final WatcherFactory _factory;
+
+  final String path;
+
+  Stream<WatchEvent> get events => _eventsController.stream;
+  StreamController<WatchEvent> _eventsController;
+
+  bool get isReady => _readyCompleter.isCompleted;
+
+  Future get ready => _readyCompleter.future;
+  var _readyCompleter = new Completer();
+
+  /// Creates a new [ResubscribableWatcher] wrapping the watchers
+  /// emitted by [_factory].
+  ResubscribableWatcher(this.path, this._factory) {
+    var watcher;
+    var subscription;
+
+    _eventsController = new StreamController<WatchEvent>.broadcast(
+        onListen: () {
+      watcher = _factory();
+      subscription = watcher.events.listen(_eventsController.add,
+          onError: _eventsController.addError,
+          onDone: _eventsController.close);
+
+      // It's important that we complete the value of [_readyCompleter] at the
+      // time [onListen] is called, as opposed to the value when [watcher.ready]
+      // fires. A new completer may be created by that time.
+      watcher.ready.then(_readyCompleter.complete);
+    }, onCancel: () {
+      // Cancel the subscription before closing the watcher so that the
+      // watcher's `onDone` event doesn't close [events].
+      subscription.cancel();
+      watcher.close();
+      _readyCompleter = new Completer();
+    }, sync: true);
+  }
+}
+
+/// An interface for watchers with an explicit, manual [close] method.
+///
+/// See [ResubscribableWatcher].
+abstract class ManuallyClosedWatcher implements Watcher {
+  /// Closes the watcher.
+  ///
+  /// Subclasses should close their [events] stream and release any internal
+  /// resources.
+  void close();
+}
diff --git a/mojo/public/dart/third_party/watcher/lib/src/stat.dart b/mojo/public/dart/third_party/watcher/lib/src/stat.dart
new file mode 100644
index 0000000..d36eff3
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/lib/src/stat.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library watcher.stat;
+
+import 'dart:async';
+import 'dart:io';
+
+/// A function that takes a file path and returns the last modified time for
+/// the file at that path.
+typedef DateTime MockTimeCallback(String path);
+
+MockTimeCallback _mockTimeCallback;
+
+/// Overrides the default behavior for accessing a file's modification time
+/// with [callback].
+///
+/// The OS file modification time has pretty rough granularity (like a few
+/// seconds) which can make for slow tests that rely on modtime. This lets you
+/// replace it with something you control.
+void mockGetModificationTime(MockTimeCallback callback) {
+  _mockTimeCallback = callback;
+}
+
+/// Gets the modification time for the file at [path].
+Future<DateTime> getModificationTime(String path) {
+  if (_mockTimeCallback != null) {
+    return new Future.value(_mockTimeCallback(path));
+  }
+
+  return FileStat.stat(path).then((stat) => stat.modified);
+}
diff --git a/mojo/public/dart/third_party/watcher/lib/src/utils.dart b/mojo/public/dart/third_party/watcher/lib/src/utils.dart
new file mode 100644
index 0000000..007c84c
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/lib/src/utils.dart
@@ -0,0 +1,117 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library watcher.utils;
+
+import 'dart:async';
+import 'dart:io';
+import 'dart:collection';
+
+/// Returns `true` if [error] is a [FileSystemException] for a missing
+/// directory.
+bool isDirectoryNotFoundException(error) {
+  if (error is! FileSystemException) return false;
+
+  // See dartbug.com/12461 and tests/standalone/io/directory_error_test.dart.
+  var notFoundCode = Platform.operatingSystem == "windows" ? 3 : 2;
+  return error.osError.errorCode == notFoundCode;
+}
+
+/// Returns the union of all elements in each set in [sets].
+Set unionAll(Iterable<Set> sets) =>
+    sets.fold(new Set(), (union, set) => union.union(set));
+
+/// Returns a buffered stream that will emit the same values as the stream
+/// returned by [future] once [future] completes.
+///
+/// If [future] completes to an error, the return value will emit that error and
+/// then close.
+///
+/// If [broadcast] is true, a broadcast stream is returned. This assumes that
+/// the stream returned by [future] will be a broadcast stream as well.
+/// [broadcast] defaults to false.
+Stream futureStream(Future<Stream> future, {bool broadcast: false}) {
+  var subscription;
+  var controller;
+
+  future = future.catchError((e, stackTrace) {
+    // Since [controller] is synchronous, it's likely that emitting an error
+    // will cause it to be cancelled before we call close.
+    if (controller != null) controller.addError(e, stackTrace);
+    if (controller != null) controller.close();
+    controller = null;
+  });
+
+  onListen() {
+    future.then((stream) {
+      if (controller == null) return;
+      subscription = stream.listen(
+          controller.add,
+          onError: controller.addError,
+          onDone: controller.close);
+    });
+  }
+
+  onCancel() {
+    if (subscription != null) subscription.cancel();
+    subscription = null;
+    controller = null;
+  }
+
+  if (broadcast) {
+    controller = new StreamController.broadcast(
+        sync: true, onListen: onListen, onCancel: onCancel);
+  } else {
+    controller = new StreamController(
+        sync: true, onListen: onListen, onCancel: onCancel);
+  }
+  return controller.stream;
+}
+
+/// Like [new Future], but avoids around issue 11911 by using [new Future.value]
+/// under the covers.
+Future newFuture(callback()) => new Future.value().then((_) => callback());
+
+/// Returns a [Future] that completes after pumping the event queue [times]
+/// times. By default, this should pump the event queue enough times to allow
+/// any code to run, as long as it's not waiting on some external event.
+Future pumpEventQueue([int times = 20]) {
+  if (times == 0) return new Future.value();
+  // We use a delayed future to allow microtask events to finish. The
+  // Future.value or Future() constructors use scheduleMicrotask themselves and
+  // would therefore not wait for microtask callbacks that are scheduled after
+  // invoking this method.
+  return new Future.delayed(Duration.ZERO, () => pumpEventQueue(times - 1));
+}
+
+/// A stream transformer that batches all events that are sent at the same time.
+///
+/// When multiple events are synchronously added to a stream controller, the
+/// [StreamController] implementation uses [scheduleMicrotask] to schedule the
+/// asynchronous firing of each event. In order to recreate the synchronous
+/// batches, this collates all the events that are received in "nearby"
+/// microtasks.
+class BatchedStreamTransformer<T> implements StreamTransformer<T, List<T>> {
+  Stream<List<T>> bind(Stream<T> input) {
+    var batch = new Queue();
+    return new StreamTransformer<T, List<T>>.fromHandlers(
+        handleData: (event, sink) {
+      batch.add(event);
+
+      // [Timer.run] schedules an event that runs after any microtasks that have
+      // been scheduled.
+      Timer.run(() {
+        if (batch.isEmpty) return;
+        sink.add(batch.toList());
+        batch.clear();
+      });
+    }, handleDone: (sink) {
+      if (batch.isNotEmpty) {
+        sink.add(batch.toList());
+        batch.clear();
+      }
+      sink.close();
+    }).bind(input);
+  }
+}
diff --git a/mojo/public/dart/third_party/watcher/lib/src/watch_event.dart b/mojo/public/dart/third_party/watcher/lib/src/watch_event.dart
new file mode 100644
index 0000000..be6d70c
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/lib/src/watch_event.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library watcher.watch_event;
+
+/// An event describing a single change to the file system.
+class WatchEvent {
+  /// The manner in which the file at [path] has changed.
+  final ChangeType type;
+
+  /// The path of the file that changed.
+  final String path;
+
+  WatchEvent(this.type, this.path);
+
+  String toString() => "$type $path";
+}
+
+/// Enum for what kind of change has happened to a file.
+class ChangeType {
+  /// A new file has been added.
+  static const ADD = const ChangeType("add");
+
+  /// A file has been removed.
+  static const REMOVE = const ChangeType("remove");
+
+  /// The contents of a file have changed.
+  static const MODIFY = const ChangeType("modify");
+
+  final String _name;
+  const ChangeType(this._name);
+
+  String toString() => _name;
+}
diff --git a/mojo/public/dart/third_party/watcher/lib/watcher.dart b/mojo/public/dart/third_party/watcher/lib/watcher.dart
new file mode 100644
index 0000000..79dcc0d
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/lib/watcher.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library watcher;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'src/watch_event.dart';
+import 'src/directory_watcher.dart';
+import 'src/file_watcher.dart';
+
+export 'src/watch_event.dart';
+export 'src/directory_watcher.dart';
+export 'src/directory_watcher/polling.dart';
+export 'src/file_watcher.dart';
+export 'src/file_watcher/polling.dart';
+
+abstract class Watcher {
+  /// The path to the file or directory whose contents are being monitored.
+  String get path;
+
+  /// The broadcast [Stream] of events that have occurred to the watched file or
+  /// files in the watched directory.
+  ///
+  /// Changes will only be monitored while this stream has subscribers. Any
+  /// changes that occur during periods when there are no subscribers will not
+  /// be reported the next time a subscriber is added.
+  Stream<WatchEvent> get events;
+
+  /// Whether the watcher is initialized and watching for changes.
+  ///
+  /// This is true if and only if [ready] is complete.
+  bool get isReady;
+
+  /// A [Future] that completes when the watcher is initialized and watching for
+  /// changes.
+  ///
+  /// If the watcher is not currently monitoring the file or directory (because
+  /// there are no subscribers to [events]), this returns a future that isn't
+  /// complete yet. It will complete when a subscriber starts listening and the
+  /// watcher finishes any initialization work it needs to do.
+  ///
+  /// If the watcher is already monitoring, this returns an already complete
+  /// future.
+  Future get ready;
+
+  /// Creates a new [DirectoryWatcher] or [FileWatcher] monitoring [path],
+  /// depending on whether it's a file or directory.
+  ///
+  /// If a native watcher is available for this platform, this will use it.
+  /// Otherwise, it will fall back to a polling watcher. Notably, watching
+  /// individual files is not natively supported on Windows, although watching
+  /// directories is.
+  ///
+  /// If [pollingDelay] is passed, it specifies the amount of time the watcher
+  /// will pause between successive polls of the contents of [path]. Making this
+  /// shorter will give more immediate feedback at the expense of doing more IO
+  /// and higher CPU usage. Defaults to one second. Ignored for non-polling
+  /// watchers.
+  factory Watcher(String path, {Duration pollingDelay}) {
+    if (new File(path).existsSync()) {
+      return new FileWatcher(path, pollingDelay: pollingDelay);
+    } else {
+      return new DirectoryWatcher(path, pollingDelay: pollingDelay);
+    }
+  }
+}
diff --git a/mojo/public/dart/third_party/watcher/pubspec.yaml b/mojo/public/dart/third_party/watcher/pubspec.yaml
new file mode 100644
index 0000000..2e033f1
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/pubspec.yaml
@@ -0,0 +1,14 @@
+name: watcher
+version: 0.9.7
+author: Dart Team <misc@dartlang.org>
+homepage: http://github.com/dart-lang/watcher
+description: >
+  A file system watcher. It monitors changes to contents of directories and
+  sends notifications when files have been added, removed, or modified.
+environment:
+  sdk: '>=1.9.0 <2.0.0'
+dependencies:
+  path: '>=0.9.0 <2.0.0'
+dev_dependencies:
+  scheduled_test: '^0.12.0'
+  test: '^0.12.0'
diff --git a/mojo/public/dart/third_party/watcher/test/directory_watcher/linux_test.dart b/mojo/public/dart/third_party/watcher/test/directory_watcher/linux_test.dart
new file mode 100644
index 0000000..897b130
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/test/directory_watcher/linux_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn('linux')
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/src/directory_watcher/linux.dart';
+import 'package:watcher/watcher.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+void main() {
+  watcherFactory = (dir) => new LinuxDirectoryWatcher(dir);
+
+  setUp(createSandbox);
+
+  sharedTests();
+
+  test('DirectoryWatcher creates a LinuxDirectoryWatcher on Linux', () {
+    expect(new DirectoryWatcher('.'),
+        new isInstanceOf<LinuxDirectoryWatcher>());
+  });
+
+  test('emits events for many nested files moved out then immediately back in',
+      () {
+    withPermutations((i, j, k) =>
+        writeFile("dir/sub/sub-$i/sub-$j/file-$k.txt"));
+    startWatcher(path: "dir");
+
+    renameDir("dir/sub", "sub");
+    renameDir("sub", "dir/sub");
+
+    allowEither(() {
+      inAnyOrder(withPermutations((i, j, k) =>
+          isRemoveEvent("dir/sub/sub-$i/sub-$j/file-$k.txt")));
+
+      inAnyOrder(withPermutations((i, j, k) =>
+          isAddEvent("dir/sub/sub-$i/sub-$j/file-$k.txt")));
+    }, () {
+      inAnyOrder(withPermutations((i, j, k) =>
+          isModifyEvent("dir/sub/sub-$i/sub-$j/file-$k.txt")));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/watcher/test/directory_watcher/mac_os_test.dart b/mojo/public/dart/third_party/watcher/test/directory_watcher/mac_os_test.dart
new file mode 100644
index 0000000..2c82f34
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/test/directory_watcher/mac_os_test.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn('mac-os')
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/src/directory_watcher/mac_os.dart';
+import 'package:watcher/watcher.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+void main() {
+  watcherFactory = (dir) => new MacOSDirectoryWatcher(dir);
+
+  setUp(createSandbox);
+
+  sharedTests();
+
+  test('DirectoryWatcher creates a MacOSDirectoryWatcher on Mac OS', () {
+    expect(new DirectoryWatcher('.'),
+        new isInstanceOf<MacOSDirectoryWatcher>());
+  });
+
+  test('does not notify about the watched directory being deleted and '
+      'recreated immediately before watching', () {
+    createDir("dir");
+    writeFile("dir/old.txt");
+    deleteDir("dir");
+    createDir("dir");
+
+    startWatcher(path: "dir");
+    writeFile("dir/newer.txt");
+    expectAddEvent("dir/newer.txt");
+  });
+
+  test('emits events for many nested files moved out then immediately back in',
+      () {
+    withPermutations((i, j, k) =>
+        writeFile("dir/sub/sub-$i/sub-$j/file-$k.txt"));
+
+    startWatcher(path: "dir");
+
+    renameDir("dir/sub", "sub");
+    renameDir("sub", "dir/sub");
+
+    allowEither(() {
+      inAnyOrder(withPermutations((i, j, k) =>
+          isRemoveEvent("dir/sub/sub-$i/sub-$j/file-$k.txt")));
+
+      inAnyOrder(withPermutations((i, j, k) =>
+          isAddEvent("dir/sub/sub-$i/sub-$j/file-$k.txt")));
+    }, () {
+      inAnyOrder(withPermutations((i, j, k) =>
+          isModifyEvent("dir/sub/sub-$i/sub-$j/file-$k.txt")));
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/watcher/test/directory_watcher/polling_test.dart b/mojo/public/dart/third_party/watcher/test/directory_watcher/polling_test.dart
new file mode 100644
index 0000000..0192b25
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/test/directory_watcher/polling_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/watcher.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+void main() {
+  // Use a short delay to make the tests run quickly.
+  watcherFactory = (dir) => new PollingDirectoryWatcher(dir,
+      pollingDelay: new Duration(milliseconds: 100));
+
+  setUp(createSandbox);
+
+  sharedTests();
+
+  test('does not notify if the modification time did not change', () {
+    writeFile("a.txt", contents: "before");
+    writeFile("b.txt", contents: "before");
+    startWatcher();
+    writeFile("a.txt", contents: "after", updateModified: false);
+    writeFile("b.txt", contents: "after");
+    expectModifyEvent("b.txt");
+  });
+}
diff --git a/mojo/public/dart/third_party/watcher/test/directory_watcher/shared.dart b/mojo/public/dart/third_party/watcher/test/directory_watcher/shared.dart
new file mode 100644
index 0000000..ff48cb2
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/test/directory_watcher/shared.dart
@@ -0,0 +1,310 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/src/utils.dart';
+
+import '../utils.dart';
+
+void sharedTests() {
+  test('does not notify for files that already exist when started', () {
+    // Make some pre-existing files.
+    writeFile("a.txt");
+    writeFile("b.txt");
+
+    startWatcher();
+
+    // Change one after the watcher is running.
+    writeFile("b.txt", contents: "modified");
+
+    // We should get a modify event for the changed file, but no add events
+    // for them before this.
+    expectModifyEvent("b.txt");
+  });
+
+  test('notifies when a file is added', () {
+    startWatcher();
+    writeFile("file.txt");
+    expectAddEvent("file.txt");
+  });
+
+  test('notifies when a file is modified', () {
+    writeFile("file.txt");
+    startWatcher();
+    writeFile("file.txt", contents: "modified");
+    expectModifyEvent("file.txt");
+  });
+
+  test('notifies when a file is removed', () {
+    writeFile("file.txt");
+    startWatcher();
+    deleteFile("file.txt");
+    expectRemoveEvent("file.txt");
+  });
+
+  test('notifies when a file is modified multiple times', () {
+    writeFile("file.txt");
+    startWatcher();
+    writeFile("file.txt", contents: "modified");
+    expectModifyEvent("file.txt");
+    writeFile("file.txt", contents: "modified again");
+    expectModifyEvent("file.txt");
+  });
+
+  test('notifies even if the file contents are unchanged', () {
+    writeFile("a.txt", contents: "same");
+    writeFile("b.txt", contents: "before");
+    startWatcher();
+
+    writeFile("a.txt", contents: "same");
+    writeFile("b.txt", contents: "after");
+    inAnyOrder([
+      isModifyEvent("a.txt"),
+      isModifyEvent("b.txt")
+    ]);
+  });
+
+  test('when the watched directory is deleted, removes all files', () {
+    writeFile("dir/a.txt");
+    writeFile("dir/b.txt");
+
+    startWatcher(path: "dir");
+
+    deleteDir("dir");
+    inAnyOrder([
+      isRemoveEvent("dir/a.txt"),
+      isRemoveEvent("dir/b.txt")
+    ]);
+  });
+
+  test('when the watched directory is moved, removes all files', () {
+    writeFile("dir/a.txt");
+    writeFile("dir/b.txt");
+
+    startWatcher(path: "dir");
+
+    renameDir("dir", "moved_dir");
+    createDir("dir");
+    inAnyOrder([
+      isRemoveEvent("dir/a.txt"),
+      isRemoveEvent("dir/b.txt")
+    ]);
+  });
+
+  group("moves", () {
+    test('notifies when a file is moved within the watched directory', () {
+      writeFile("old.txt");
+      startWatcher();
+      renameFile("old.txt", "new.txt");
+
+      inAnyOrder([
+        isAddEvent("new.txt"),
+        isRemoveEvent("old.txt")
+      ]);
+    });
+
+    test('notifies when a file is moved from outside the watched directory',
+        () {
+      writeFile("old.txt");
+      createDir("dir");
+      startWatcher(path: "dir");
+
+      renameFile("old.txt", "dir/new.txt");
+      expectAddEvent("dir/new.txt");
+    });
+
+    test('notifies when a file is moved outside the watched directory', () {
+      writeFile("dir/old.txt");
+      startWatcher(path: "dir");
+
+      renameFile("dir/old.txt", "new.txt");
+      expectRemoveEvent("dir/old.txt");
+    });
+
+    test('notifies when a file is moved onto an existing one', () {
+      writeFile("from.txt");
+      writeFile("to.txt");
+      startWatcher();
+
+      renameFile("from.txt", "to.txt");
+      inAnyOrder([
+        isRemoveEvent("from.txt"),
+        isModifyEvent("to.txt")
+      ]);
+    });
+  });
+
+  // Most of the time, when multiple filesystem actions happen in sequence,
+  // they'll be batched together and the watcher will see them all at once.
+  // These tests verify that the watcher normalizes and combine these events
+  // properly. However, very occasionally the events will be reported in
+  // separate batches, and the watcher will report them as though they occurred
+  // far apart in time, so each of these tests has a "backup case" to allow for
+  // that as well.
+  group("clustered changes", () {
+    test("doesn't notify when a file is created and then immediately removed",
+        () {
+      startWatcher();
+      writeFile("file.txt");
+      deleteFile("file.txt");
+
+      // Backup case.
+      startClosingEventStream();
+      allowEvents(() {
+        expectAddEvent("file.txt");
+        expectRemoveEvent("file.txt");
+      });
+    });
+
+    test("reports a modification when a file is deleted and then immediately "
+        "recreated", () {
+      writeFile("file.txt");
+      startWatcher();
+
+      deleteFile("file.txt");
+      writeFile("file.txt", contents: "re-created");
+
+      allowEither(() {
+        expectModifyEvent("file.txt");
+      }, () {
+        // Backup case.
+        expectRemoveEvent("file.txt");
+        expectAddEvent("file.txt");
+      });
+    });
+
+    test("reports a modification when a file is moved and then immediately "
+        "recreated", () {
+      writeFile("old.txt");
+      startWatcher();
+
+      renameFile("old.txt", "new.txt");
+      writeFile("old.txt", contents: "re-created");
+
+      allowEither(() {
+        inAnyOrder([
+          isModifyEvent("old.txt"),
+          isAddEvent("new.txt")
+        ]);
+      }, () {
+        // Backup case.
+        expectRemoveEvent("old.txt");
+        expectAddEvent("new.txt");
+        expectAddEvent("old.txt");
+      });
+    });
+
+    test("reports a removal when a file is modified and then immediately "
+        "removed", () {
+      writeFile("file.txt");
+      startWatcher();
+
+      writeFile("file.txt", contents: "modified");
+      deleteFile("file.txt");
+
+      // Backup case.
+      allowModifyEvent("file.txt");
+
+      expectRemoveEvent("file.txt");
+    });
+
+    test("reports an add when a file is added and then immediately modified",
+        () {
+      startWatcher();
+
+      writeFile("file.txt");
+      writeFile("file.txt", contents: "modified");
+
+      expectAddEvent("file.txt");
+
+      // Backup case.
+      startClosingEventStream();
+      allowModifyEvent("file.txt");
+    });
+  });
+
+  group("subdirectories", () {
+    test('watches files in subdirectories', () {
+      startWatcher();
+      writeFile("a/b/c/d/file.txt");
+      expectAddEvent("a/b/c/d/file.txt");
+    });
+
+    test('notifies when a subdirectory is moved within the watched directory '
+        'and then its contents are modified', () {
+      writeFile("old/file.txt");
+      startWatcher();
+
+      renameDir("old", "new");
+      inAnyOrder([
+        isRemoveEvent("old/file.txt"),
+        isAddEvent("new/file.txt")
+      ]);
+
+      writeFile("new/file.txt", contents: "modified");
+      expectModifyEvent("new/file.txt");
+    });
+
+    test('emits events for many nested files added at once', () {
+      withPermutations((i, j, k) =>
+          writeFile("sub/sub-$i/sub-$j/file-$k.txt"));
+
+      createDir("dir");
+      startWatcher(path: "dir");
+      renameDir("sub", "dir/sub");
+
+      inAnyOrder(withPermutations((i, j, k)  =>
+          isAddEvent("dir/sub/sub-$i/sub-$j/file-$k.txt")));
+    });
+
+    test('emits events for many nested files removed at once', () {
+      withPermutations((i, j, k) =>
+          writeFile("dir/sub/sub-$i/sub-$j/file-$k.txt"));
+
+      createDir("dir");
+      startWatcher(path: "dir");
+
+      // Rename the directory rather than deleting it because native watchers
+      // report a rename as a single DELETE event for the directory, whereas
+      // they report recursive deletion with DELETE events for every file in the
+      // directory.
+      renameDir("dir/sub", "sub");
+
+      inAnyOrder(withPermutations((i, j, k) =>
+          isRemoveEvent("dir/sub/sub-$i/sub-$j/file-$k.txt")));
+    });
+
+    test('emits events for many nested files moved at once', () {
+      withPermutations((i, j, k) =>
+          writeFile("dir/old/sub-$i/sub-$j/file-$k.txt"));
+
+      createDir("dir");
+      startWatcher(path: "dir");
+      renameDir("dir/old", "dir/new");
+
+      inAnyOrder(unionAll(withPermutations((i, j, k) {
+        return new Set.from([
+          isRemoveEvent("dir/old/sub-$i/sub-$j/file-$k.txt"),
+          isAddEvent("dir/new/sub-$i/sub-$j/file-$k.txt")
+        ]);
+      })));
+    });
+
+    test("emits events for many files added at once in a subdirectory with the "
+        "same name as a removed file", () {
+      writeFile("dir/sub");
+      withPermutations((i, j, k) =>
+          writeFile("old/sub-$i/sub-$j/file-$k.txt"));
+      startWatcher(path: "dir");
+
+      deleteFile("dir/sub");
+      renameDir("old", "dir/sub");
+
+      var events = withPermutations((i, j, k)  =>
+          isAddEvent("dir/sub/sub-$i/sub-$j/file-$k.txt"));
+      events.add(isRemoveEvent("dir/sub"));
+      inAnyOrder(events);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/watcher/test/directory_watcher/windows_test.dart b/mojo/public/dart/third_party/watcher/test/directory_watcher/windows_test.dart
new file mode 100644
index 0000000..4c77ced
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/test/directory_watcher/windows_test.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn('windows')
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/src/directory_watcher/windows.dart';
+import 'package:watcher/watcher.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+void main() {
+  watcherFactory = (dir) => new WindowsDirectoryWatcher(dir);
+
+  setUp(createSandbox);
+
+  sharedTests();
+
+  test('DirectoryWatcher creates a WindowsDirectoryWatcher on Windows', () {
+    expect(new DirectoryWatcher('.'),
+        new isInstanceOf<WindowsDirectoryWatcher>());
+  });
+}
diff --git a/mojo/public/dart/third_party/watcher/test/file_watcher/native_test.dart b/mojo/public/dart/third_party/watcher/test/file_watcher/native_test.dart
new file mode 100644
index 0000000..30d0eca
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/test/file_watcher/native_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn('linux || mac-os')
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/src/file_watcher/native.dart';
+import 'package:watcher/watcher.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+void main() {
+  watcherFactory = (file) => new NativeFileWatcher(file);
+
+  setUp(() {
+    createSandbox();
+    writeFile("file.txt");
+  });
+
+  sharedTests();
+}
diff --git a/mojo/public/dart/third_party/watcher/test/file_watcher/polling_test.dart b/mojo/public/dart/third_party/watcher/test/file_watcher/polling_test.dart
new file mode 100644
index 0000000..e502544
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/test/file_watcher/polling_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn('linux || mac-os')
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/watcher.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+void main() {
+  watcherFactory = (file) => new PollingFileWatcher(file,
+      pollingDelay: new Duration(milliseconds: 100));
+
+  setUp(() {
+    createSandbox();
+    writeFile("file.txt");
+  });
+
+  sharedTests();
+}
diff --git a/mojo/public/dart/third_party/watcher/test/file_watcher/shared.dart b/mojo/public/dart/third_party/watcher/test/file_watcher/shared.dart
new file mode 100644
index 0000000..9a4965c
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/test/file_watcher/shared.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/src/utils.dart';
+
+import '../utils.dart';
+
+void sharedTests() {
+  test("doesn't notify if the file isn't modified", () {
+    startWatcher(path: "file.txt");
+    // Give the watcher time to fire events if it's going to.
+    schedule(() => pumpEventQueue());
+    deleteFile("file.txt");
+    expectRemoveEvent("file.txt");
+  });
+
+  test("notifies when a file is modified", () {
+    startWatcher(path: "file.txt");
+    writeFile("file.txt", contents: "modified");
+    expectModifyEvent("file.txt");
+  });
+
+  test("notifies when a file is removed", () {
+    startWatcher(path: "file.txt");
+    deleteFile("file.txt");
+    expectRemoveEvent("file.txt");
+  });
+
+  test("notifies when a file is modified multiple times", () {
+    startWatcher(path: "file.txt");
+    writeFile("file.txt", contents: "modified");
+    expectModifyEvent("file.txt");
+    writeFile("file.txt", contents: "modified again");
+    expectModifyEvent("file.txt");
+  });
+
+  test("notifies even if the file contents are unchanged", () {
+    startWatcher(path: "file.txt");
+    writeFile("file.txt");
+    expectModifyEvent("file.txt");
+  });
+
+  test("emits a remove event when the watched file is moved away", () {
+    startWatcher(path: "file.txt");
+    renameFile("file.txt", "new.txt");
+    expectRemoveEvent("file.txt");
+  });
+
+  test("emits a modify event when another file is moved on top of the watched "
+      "file", () {
+    writeFile("old.txt");
+    startWatcher(path: "file.txt");
+    renameFile("old.txt", "file.txt");
+    expectModifyEvent("file.txt");
+  });
+
+  // Regression test for a race condition.
+  test("closes the watcher immediately after deleting the file", () {
+    writeFile("old.txt");
+    var watcher = createWatcher(path: "file.txt", waitForReady: false);
+    var sub = schedule(() => watcher.events.listen(null));
+
+    deleteFile("file.txt");
+    schedule(() async {
+      // Reproducing the race condition will always be flaky, but this sleep
+      // helped it reproduce more consistently on my machine.
+      await new Future.delayed(new Duration(milliseconds: 10));
+      (await sub).cancel();
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/watcher/test/no_subscription/linux_test.dart b/mojo/public/dart/third_party/watcher/test/no_subscription/linux_test.dart
new file mode 100644
index 0000000..c8e8ae9
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/test/no_subscription/linux_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn('linux')
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/src/directory_watcher/linux.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+void main() {
+  watcherFactory = (dir) => new LinuxDirectoryWatcher(dir);
+
+  setUp(createSandbox);
+
+  sharedTests();
+}
diff --git a/mojo/public/dart/third_party/watcher/test/no_subscription/mac_os_test.dart b/mojo/public/dart/third_party/watcher/test/no_subscription/mac_os_test.dart
new file mode 100644
index 0000000..d5b1c8e
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/test/no_subscription/mac_os_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn('mac-os')
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/src/directory_watcher/mac_os.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+void main() {
+  watcherFactory = (dir) => new MacOSDirectoryWatcher(dir);
+
+  setUp(createSandbox);
+
+  sharedTests();
+}
diff --git a/mojo/public/dart/third_party/watcher/test/no_subscription/polling_test.dart b/mojo/public/dart/third_party/watcher/test/no_subscription/polling_test.dart
new file mode 100644
index 0000000..5c99bc0
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/test/no_subscription/polling_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/watcher.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+void main() {
+  watcherFactory = (dir) => new PollingDirectoryWatcher(dir);
+
+  setUp(createSandbox);
+
+  sharedTests();
+}
diff --git a/mojo/public/dart/third_party/watcher/test/no_subscription/shared.dart b/mojo/public/dart/third_party/watcher/test/no_subscription/shared.dart
new file mode 100644
index 0000000..52649f1
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/test/no_subscription/shared.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/watcher.dart';
+
+import '../utils.dart';
+
+void sharedTests() {
+  test('does not notify for changes when there are no subscribers', () {
+    // Note that this test doesn't rely as heavily on the test functions in
+    // utils.dart because it needs to be very explicit about when the event
+    // stream is and is not subscribed.
+    var watcher = createWatcher();
+
+    // Subscribe to the events.
+    var completer = new Completer();
+    var subscription = watcher.events.listen(expectAsync((event) {
+      expect(event, isWatchEvent(ChangeType.ADD, "file.txt"));
+      completer.complete();
+    }));
+
+    writeFile("file.txt");
+
+    // Then wait until we get an event for it.
+    schedule(() => completer.future);
+
+    // Unsubscribe.
+    schedule(() {
+      subscription.cancel();
+    });
+
+    // Now write a file while we aren't listening.
+    writeFile("unwatched.txt");
+
+    // Then start listening again.
+    schedule(() {
+      completer = new Completer();
+      subscription = watcher.events.listen(expectAsync((event) {
+        // We should get an event for the third file, not the one added while
+        // we weren't subscribed.
+        expect(event, isWatchEvent(ChangeType.ADD, "added.txt"));
+        completer.complete();
+      }));
+
+      // Wait until the watcher is ready to dispatch events again.
+      return watcher.ready;
+    });
+
+    // And add a third file.
+    writeFile("added.txt");
+
+    // Wait until we get an event for the third file.
+    schedule(() => completer.future);
+
+    schedule(() {
+      subscription.cancel();
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/watcher/test/path_set_test.dart b/mojo/public/dart/third_party/watcher/test/path_set_test.dart
new file mode 100644
index 0000000..13e797c
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/test/path_set_test.dart
@@ -0,0 +1,233 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:path/path.dart' as p;
+import 'package:test/test.dart';
+import 'package:watcher/src/path_set.dart';
+
+import 'utils.dart';
+
+Matcher containsPath(String path) => predicate((set) =>
+    set is PathSet && set.contains(path),
+    'set contains "$path"');
+
+Matcher containsDir(String path) => predicate((set) =>
+    set is PathSet && set.containsDir(path),
+    'set contains directory "$path"');
+
+void main() {
+  var set;
+  setUp(() => set = new PathSet("root"));
+
+  group("adding a path", () {
+    test("stores the path in the set", () {
+      set.add("root/path/to/file");
+      expect(set, containsPath("root/path/to/file"));
+    });
+
+    test("that's a subdir of another path keeps both in the set", () {
+      set.add("root/path");
+      set.add("root/path/to/file");
+      expect(set, containsPath("root/path"));
+      expect(set, containsPath("root/path/to/file"));
+    });
+
+    test("that's not normalized normalizes the path before storing it", () {
+      set.add("root/../root/path/to/../to/././file");
+      expect(set, containsPath("root/path/to/file"));
+    });
+
+    test("that's absolute normalizes the path before storing it", () {
+      set.add(p.absolute("root/path/to/file"));
+      expect(set, containsPath("root/path/to/file"));
+    });
+
+    test("that's not beneath the root throws an error", () {
+      expect(() => set.add("path/to/file"), throwsArgumentError);
+    });
+  });
+
+  group("removing a path", () {
+    test("that's in the set removes and returns that path", () {
+      set.add("root/path/to/file");
+      expect(set.remove("root/path/to/file"),
+          unorderedEquals([p.normalize("root/path/to/file")]));
+      expect(set, isNot(containsPath("root/path/to/file")));
+    });
+
+    test("that's not in the set returns an empty set", () {
+      set.add("root/path/to/file");
+      expect(set.remove("root/path/to/nothing"), isEmpty);
+    });
+
+    test("that's a directory removes and returns all files beneath it", () {
+      set.add("root/outside");
+      set.add("root/path/to/one");
+      set.add("root/path/to/two");
+      set.add("root/path/to/sub/three");
+
+      expect(set.remove("root/path"), unorderedEquals([
+        "root/path/to/one",
+        "root/path/to/two",
+        "root/path/to/sub/three"
+      ].map(p.normalize)));
+
+      expect(set, containsPath("root/outside"));
+      expect(set, isNot(containsPath("root/path/to/one")));
+      expect(set, isNot(containsPath("root/path/to/two")));
+      expect(set, isNot(containsPath("root/path/to/sub/three")));
+    });
+  
+    test("that's a directory in the set removes and returns it and all files "
+        "beneath it", () {
+      set.add("root/path");
+      set.add("root/path/to/one");
+      set.add("root/path/to/two");
+      set.add("root/path/to/sub/three");
+
+      expect(set.remove("root/path"), unorderedEquals([
+        "root/path",
+        "root/path/to/one",
+        "root/path/to/two",
+        "root/path/to/sub/three"
+      ].map(p.normalize)));
+
+      expect(set, isNot(containsPath("root/path")));
+      expect(set, isNot(containsPath("root/path/to/one")));
+      expect(set, isNot(containsPath("root/path/to/two")));
+      expect(set, isNot(containsPath("root/path/to/sub/three")));
+    });
+
+    test("that's not normalized removes and returns the normalized path", () {
+      set.add("root/path/to/file");
+      expect(set.remove("root/../root/path/to/../to/./file"),
+          unorderedEquals([p.normalize("root/path/to/file")]));
+    });
+
+    test("that's absolute removes and returns the normalized path", () {
+      set.add("root/path/to/file");
+      expect(set.remove(p.absolute("root/path/to/file")),
+          unorderedEquals([p.normalize("root/path/to/file")]));
+    });
+
+    test("that's not beneath the root throws an error", () {
+      expect(() => set.remove("path/to/file"), throwsArgumentError);
+    });
+  });
+
+  group("containsPath()", () {
+    test("returns false for a non-existent path", () {
+      set.add("root/path/to/file");
+      expect(set, isNot(containsPath("root/path/to/nothing")));
+    });
+
+    test("returns false for a directory that wasn't added explicitly", () {
+      set.add("root/path/to/file");
+      expect(set, isNot(containsPath("root/path")));
+    });
+
+    test("returns true for a directory that was added explicitly", () {
+      set.add("root/path");
+      set.add("root/path/to/file");
+      expect(set, containsPath("root/path"));
+    });
+
+    test("with a non-normalized path normalizes the path before looking it up",
+        () {
+      set.add("root/path/to/file");
+      expect(set, containsPath("root/../root/path/to/../to/././file"));
+    });
+
+    test("with an absolute path normalizes the path before looking it up", () {
+      set.add("root/path/to/file");
+      expect(set, containsPath(p.absolute("root/path/to/file")));
+    });
+
+    test("with a path that's not beneath the root throws an error", () {
+      expect(() => set.contains("path/to/file"), throwsArgumentError);
+    });
+  });
+
+  group("containsDir()", () {
+    test("returns true for a directory that was added implicitly", () {
+      set.add("root/path/to/file");
+      expect(set, containsDir("root/path"));
+      expect(set, containsDir("root/path/to"));
+    });
+
+    test("returns true for a directory that was added explicitly", () {
+      set.add("root/path");
+      set.add("root/path/to/file");
+      expect(set, containsDir("root/path"));
+    });
+
+    test("returns false for a directory that wasn't added", () {
+      expect(set, isNot(containsDir("root/nothing")));
+    });
+
+    test("returns false for a non-directory path that was added", () {
+      set.add("root/path/to/file");
+      expect(set, isNot(containsDir("root/path/to/file")));
+    });
+
+    test("returns false for a directory that was added implicitly and then "
+        "removed implicitly", () {
+      set.add("root/path/to/file");
+      set.remove("root/path/to/file");
+      expect(set, isNot(containsDir("root/path")));
+    });
+
+    test("returns false for a directory that was added explicitly whose "
+        "children were then removed", () {
+      set.add("root/path");
+      set.add("root/path/to/file");
+      set.remove("root/path/to/file");
+      expect(set, isNot(containsDir("root/path")));
+    });
+
+    test("with a non-normalized path normalizes the path before looking it up",
+        () {
+      set.add("root/path/to/file");
+      expect(set, containsDir("root/../root/path/to/../to/."));
+    });
+
+    test("with an absolute path normalizes the path before looking it up", () {
+      set.add("root/path/to/file");
+      expect(set, containsDir(p.absolute("root/path")));
+    });
+  });
+
+  group("toSet", () {
+    test("returns paths added to the set", () {
+      set.add("root/path");
+      set.add("root/path/to/one");
+      set.add("root/path/to/two");
+
+      expect(set.toSet(), unorderedEquals([
+        "root/path",
+        "root/path/to/one",
+        "root/path/to/two",
+      ].map(p.normalize)));
+    });
+
+    test("doesn't return paths removed from the set", () {
+      set.add("root/path/to/one");
+      set.add("root/path/to/two");
+      set.remove("root/path/to/two");
+
+      expect(set.toSet(), unorderedEquals([p.normalize("root/path/to/one")]));
+    });
+  });
+
+  group("clear", () {
+    test("removes all paths from the set", () {
+      set.add("root/path");
+      set.add("root/path/to/one");
+      set.add("root/path/to/two");
+
+      set.clear();
+      expect(set.toSet(), isEmpty);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/watcher/test/ready/linux_test.dart b/mojo/public/dart/third_party/watcher/test/ready/linux_test.dart
new file mode 100644
index 0000000..c8e8ae9
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/test/ready/linux_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn('linux')
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/src/directory_watcher/linux.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+void main() {
+  watcherFactory = (dir) => new LinuxDirectoryWatcher(dir);
+
+  setUp(createSandbox);
+
+  sharedTests();
+}
diff --git a/mojo/public/dart/third_party/watcher/test/ready/mac_os_test.dart b/mojo/public/dart/third_party/watcher/test/ready/mac_os_test.dart
new file mode 100644
index 0000000..d5b1c8e
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/test/ready/mac_os_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@TestOn('mac-os')
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/src/directory_watcher/mac_os.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+void main() {
+  watcherFactory = (dir) => new MacOSDirectoryWatcher(dir);
+
+  setUp(createSandbox);
+
+  sharedTests();
+}
diff --git a/mojo/public/dart/third_party/watcher/test/ready/polling_test.dart b/mojo/public/dart/third_party/watcher/test/ready/polling_test.dart
new file mode 100644
index 0000000..5c99bc0
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/test/ready/polling_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/watcher.dart';
+
+import 'shared.dart';
+import '../utils.dart';
+
+void main() {
+  watcherFactory = (dir) => new PollingDirectoryWatcher(dir);
+
+  setUp(createSandbox);
+
+  sharedTests();
+}
diff --git a/mojo/public/dart/third_party/watcher/test/ready/shared.dart b/mojo/public/dart/third_party/watcher/test/ready/shared.dart
new file mode 100644
index 0000000..7be4833
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/test/ready/shared.dart
@@ -0,0 +1,98 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../utils.dart';
+
+void sharedTests() {
+  test('ready does not complete until after subscription', () {
+    var watcher = createWatcher(waitForReady: false);
+
+    var ready = false;
+    watcher.ready.then((_) {
+      ready = true;
+    });
+
+    // Should not be ready yet.
+    schedule(() {
+      expect(ready, isFalse);
+    });
+
+    // Subscribe to the events.
+    schedule(() {
+      var subscription = watcher.events.listen((event) {});
+
+      currentSchedule.onComplete.schedule(() {
+        subscription.cancel();
+      });
+    });
+
+    // Should eventually be ready.
+    schedule(() => watcher.ready);
+
+    schedule(() {
+      expect(ready, isTrue);
+    });
+  });
+
+  test('ready completes immediately when already ready', () {
+    var watcher = createWatcher(waitForReady: false);
+
+    // Subscribe to the events.
+    schedule(() {
+      var subscription = watcher.events.listen((event) {});
+
+      currentSchedule.onComplete.schedule(() {
+        subscription.cancel();
+      });
+    });
+
+    // Should eventually be ready.
+    schedule(() => watcher.ready);
+
+    // Now ready should be a future that immediately completes.
+    var ready = false;
+    schedule(() {
+      watcher.ready.then((_) {
+        ready = true;
+      });
+    });
+
+    schedule(() {
+      expect(ready, isTrue);
+    });
+  });
+
+  test('ready returns a future that does not complete after unsubscribing', () {
+    var watcher = createWatcher(waitForReady: false);
+
+    // Subscribe to the events.
+    var subscription;
+    schedule(() {
+      subscription = watcher.events.listen((event) {});
+    });
+
+    var ready = false;
+
+    // Wait until ready.
+    schedule(() => watcher.ready);
+
+    // Now unsubscribe.
+    schedule(() {
+      subscription.cancel();
+
+      // Track when it's ready again.
+      ready = false;
+      watcher.ready.then((_) {
+        ready = true;
+      });
+    });
+
+    // Should be back to not ready.
+    schedule(() {
+      expect(ready, isFalse);
+    });
+  });
+}
diff --git a/mojo/public/dart/third_party/watcher/test/utils.dart b/mojo/public/dart/third_party/watcher/test/utils.dart
new file mode 100644
index 0000000..7dd8332
--- /dev/null
+++ b/mojo/public/dart/third_party/watcher/test/utils.dart
@@ -0,0 +1,363 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library watcher.test.utils;
+
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:watcher/watcher.dart';
+import 'package:watcher/src/stat.dart';
+import 'package:watcher/src/utils.dart';
+
+// TODO(nweiz): remove this when issue 15042 is fixed.
+import 'package:watcher/src/directory_watcher/mac_os.dart';
+
+/// The path to the temporary sandbox created for each test. All file
+/// operations are implicitly relative to this directory.
+String _sandboxDir;
+
+/// The [Watcher] being used for the current scheduled test.
+Watcher _watcher;
+
+/// The mock modification times (in milliseconds since epoch) for each file.
+///
+/// The actual file system has pretty coarse granularity for file modification
+/// times. This means using the real file system requires us to put delays in
+/// the tests to ensure we wait long enough between operations for the mod time
+/// to be different.
+///
+/// Instead, we'll just mock that out. Each time a file is written, we manually
+/// increment the mod time for that file instantly.
+Map<String, int> _mockFileModificationTimes;
+
+typedef Watcher WatcherFactory(String directory);
+
+/// Sets the function used to create the watcher.
+set watcherFactory(WatcherFactory factory) {
+  _watcherFactory = factory;
+}
+WatcherFactory _watcherFactory;
+
+/// Creates the sandbox directory the other functions in this library use and
+/// ensures it's deleted when the test ends.
+///
+/// This should usually be called by [setUp].
+void createSandbox() {
+  var dir = Directory.systemTemp.createTempSync('watcher_test_');
+  _sandboxDir = dir.path;
+
+  _mockFileModificationTimes = new Map<String, int>();
+  mockGetModificationTime((path) {
+    path = p.normalize(p.relative(path, from: _sandboxDir));
+
+    // Make sure we got a path in the sandbox.
+    assert(p.isRelative(path) && !path.startsWith(".."));
+
+    var mtime = _mockFileModificationTimes[path];
+    return new DateTime.fromMillisecondsSinceEpoch(mtime == null ? 0 : mtime);
+  });
+
+  // Delete the sandbox when done.
+  currentSchedule.onComplete.schedule(() {
+    if (_sandboxDir != null) {
+      // TODO(rnystrom): Issue 19155. The watcher should already be closed when
+      // we clean up the sandbox.
+      if (_watcherEvents != null) {
+        _watcherEvents.close();
+      }
+      new Directory(_sandboxDir).deleteSync(recursive: true);
+      _sandboxDir = null;
+    }
+
+    _mockFileModificationTimes = null;
+    mockGetModificationTime(null);
+  }, "delete sandbox");
+}
+
+/// Creates a new [Watcher] that watches a temporary file or directory.
+///
+/// Normally, this will pause the schedule until the watcher is done scanning
+/// and is polling for changes. If you pass `false` for [waitForReady], it will
+/// not schedule this delay.
+///
+/// If [path] is provided, watches a subdirectory in the sandbox with that name.
+Watcher createWatcher({String path, bool waitForReady}) {
+  if (path == null) {
+    path = _sandboxDir;
+  } else {
+    path = p.join(_sandboxDir, path);
+  }
+
+  var watcher = _watcherFactory(path);
+
+  // Wait until the scan is finished so that we don't miss changes to files
+  // that could occur before the scan completes.
+  if (waitForReady != false) {
+    schedule(() => watcher.ready, "wait for watcher to be ready");
+  }
+
+  return watcher;
+}
+
+/// The stream of events from the watcher started with [startWatcher].
+ScheduledStream<WatchEvent> _watcherEvents;
+
+/// Creates a new [Watcher] that watches a temporary file or directory and
+/// starts monitoring it for events.
+///
+/// If [path] is provided, watches a path in the sandbox with that name.
+void startWatcher({String path}) {
+  // We want to wait until we're ready *after* we subscribe to the watcher's
+  // events.
+  _watcher = createWatcher(path: path, waitForReady: false);
+
+  // Schedule [_watcher.events.listen] so that the watcher doesn't start
+  // watching [path] before it exists. Expose [_watcherEvents] immediately so
+  // that it can be accessed synchronously after this.
+  _watcherEvents = new ScheduledStream(futureStream(schedule(() {
+    currentSchedule.onComplete.schedule(() {
+      _watcher = null;
+      if (!_closePending) _watcherEvents.close();
+
+      // If there are already errors, don't add this to the output and make
+      // people think it might be the root cause.
+      if (currentSchedule.errors.isEmpty) {
+        _watcherEvents.expect(isDone);
+      }
+    }, "reset watcher");
+
+    return _watcher.events;
+  }, "create watcher"), broadcast: true));
+
+  schedule(() => _watcher.ready, "wait for watcher to be ready");
+}
+
+/// Whether an event to close [_watcherEvents] has been scheduled.
+bool _closePending = false;
+
+/// Schedule closing the watcher stream after the event queue has been pumped.
+///
+/// This is necessary when events are allowed to occur, but don't have to occur,
+/// at the end of a test. Otherwise, if they don't occur, the test will wait
+/// indefinitely because they might in the future and because the watcher is
+/// normally only closed after the test completes.
+void startClosingEventStream() {
+  schedule(() {
+    _closePending = true;
+    pumpEventQueue().then((_) => _watcherEvents.close()).whenComplete(() {
+      _closePending = false;
+    });
+  }, 'start closing event stream');
+}
+
+/// A list of [StreamMatcher]s that have been collected using
+/// [_collectStreamMatcher].
+List<StreamMatcher> _collectedStreamMatchers;
+
+/// Collects all stream matchers that are registered within [block] into a
+/// single stream matcher.
+///
+/// The returned matcher will match each of the collected matchers in order.
+StreamMatcher _collectStreamMatcher(block()) {
+  var oldStreamMatchers = _collectedStreamMatchers;
+  _collectedStreamMatchers = new List<StreamMatcher>();
+  try {
+    block();
+    return inOrder(_collectedStreamMatchers);
+  } finally {
+    _collectedStreamMatchers = oldStreamMatchers;
+  }
+}
+
+/// Either add [streamMatcher] as an expectation to [_watcherEvents], or collect
+/// it with [_collectStreamMatcher].
+///
+/// [streamMatcher] can be a [StreamMatcher], a [Matcher], or a value.
+void _expectOrCollect(streamMatcher) {
+  if (_collectedStreamMatchers != null) {
+    _collectedStreamMatchers.add(new StreamMatcher.wrap(streamMatcher));
+  } else {
+    _watcherEvents.expect(streamMatcher);
+  }
+}
+
+/// Expects that [matchers] will match emitted events in any order.
+///
+/// [matchers] may be [Matcher]s or values, but not [StreamMatcher]s.
+void inAnyOrder(Iterable matchers) {
+  matchers = matchers.toSet();
+  _expectOrCollect(nextValues(matchers.length, unorderedMatches(matchers)));
+}
+
+/// Expects that the expectations established in either [block1] or [block2]
+/// will match the emitted events.
+///
+/// If both blocks match, the one that consumed more events will be used.
+void allowEither(block1(), block2()) {
+  _expectOrCollect(either(
+      _collectStreamMatcher(block1), _collectStreamMatcher(block2)));
+}
+
+/// Allows the expectations established in [block] to match the emitted events.
+///
+/// If the expectations in [block] don't match, no error will be raised and no
+/// events will be consumed. If this is used at the end of a test,
+/// [startClosingEventStream] should be called before it.
+void allowEvents(block()) {
+  _expectOrCollect(allow(_collectStreamMatcher(block)));
+}
+
+/// Returns a matcher that matches a [WatchEvent] with the given [type] and
+/// [path].
+Matcher isWatchEvent(ChangeType type, String path) {
+  return predicate((e) {
+    return e is WatchEvent && e.type == type &&
+        e.path == p.join(_sandboxDir, p.normalize(path));
+  }, "is $type $path");
+}
+
+/// Returns a [Matcher] that matches a [WatchEvent] for an add event for [path].
+Matcher isAddEvent(String path) => isWatchEvent(ChangeType.ADD, path);
+
+/// Returns a [Matcher] that matches a [WatchEvent] for a modification event for
+/// [path].
+Matcher isModifyEvent(String path) => isWatchEvent(ChangeType.MODIFY, path);
+
+/// Returns a [Matcher] that matches a [WatchEvent] for a removal event for
+/// [path].
+Matcher isRemoveEvent(String path) => isWatchEvent(ChangeType.REMOVE, path);
+
+/// Expects that the next event emitted will be for an add event for [path].
+void expectAddEvent(String path) =>
+    _expectOrCollect(isWatchEvent(ChangeType.ADD, path));
+
+/// Expects that the next event emitted will be for a modification event for
+/// [path].
+void expectModifyEvent(String path) =>
+    _expectOrCollect(isWatchEvent(ChangeType.MODIFY, path));
+
+/// Expects that the next event emitted will be for a removal event for [path].
+void expectRemoveEvent(String path) =>
+    _expectOrCollect(isWatchEvent(ChangeType.REMOVE, path));
+
+/// Consumes an add event for [path] if one is emitted at this point in the
+/// schedule, but doesn't throw an error if it isn't.
+///
+/// If this is used at the end of a test, [startClosingEventStream] should be
+/// called before it.
+void allowAddEvent(String path) =>
+    _expectOrCollect(allow(isWatchEvent(ChangeType.ADD, path)));
+
+/// Consumes a modification event for [path] if one is emitted at this point in
+/// the schedule, but doesn't throw an error if it isn't.
+///
+/// If this is used at the end of a test, [startClosingEventStream] should be
+/// called before it.
+void allowModifyEvent(String path) =>
+    _expectOrCollect(allow(isWatchEvent(ChangeType.MODIFY, path)));
+
+/// Consumes a removal event for [path] if one is emitted at this point in the
+/// schedule, but doesn't throw an error if it isn't.
+///
+/// If this is used at the end of a test, [startClosingEventStream] should be
+/// called before it.
+void allowRemoveEvent(String path) =>
+    _expectOrCollect(allow(isWatchEvent(ChangeType.REMOVE, path)));
+
+/// Schedules writing a file in the sandbox at [path] with [contents].
+///
+/// If [contents] is omitted, creates an empty file. If [updatedModified] is
+/// `false`, the mock file modification time is not changed.
+void writeFile(String path, {String contents, bool updateModified}) {
+  if (contents == null) contents = "";
+  if (updateModified == null) updateModified = true;
+
+  schedule(() {
+    var fullPath = p.join(_sandboxDir, path);
+
+    // Create any needed subdirectories.
+    var dir = new Directory(p.dirname(fullPath));
+    if (!dir.existsSync()) {
+      dir.createSync(recursive: true);
+    }
+
+    new File(fullPath).writeAsStringSync(contents);
+
+    // Manually update the mock modification time for the file.
+    if (updateModified) {
+      // Make sure we always use the same separator on Windows.
+      path = p.normalize(path);
+
+      var milliseconds = _mockFileModificationTimes.putIfAbsent(path, () => 0);
+      _mockFileModificationTimes[path]++;
+    }
+  }, "write file $path");
+}
+
+/// Schedules deleting a file in the sandbox at [path].
+void deleteFile(String path) {
+  schedule(() {
+    new File(p.join(_sandboxDir, path)).deleteSync();
+  }, "delete file $path");
+}
+
+/// Schedules renaming a file in the sandbox from [from] to [to].
+///
+/// If [contents] is omitted, creates an empty file.
+void renameFile(String from, String to) {
+  schedule(() {
+    new File(p.join(_sandboxDir, from)).renameSync(p.join(_sandboxDir, to));
+
+    // Make sure we always use the same separator on Windows.
+    to = p.normalize(to);
+
+    // Manually update the mock modification time for the file.
+    var milliseconds = _mockFileModificationTimes.putIfAbsent(to, () => 0);
+    _mockFileModificationTimes[to]++;
+  }, "rename file $from to $to");
+}
+
+/// Schedules creating a directory in the sandbox at [path].
+void createDir(String path) {
+  schedule(() {
+    new Directory(p.join(_sandboxDir, path)).createSync();
+  }, "create directory $path");
+}
+
+/// Schedules renaming a directory in the sandbox from [from] to [to].
+void renameDir(String from, String to) {
+  schedule(() {
+    new Directory(p.join(_sandboxDir, from))
+        .renameSync(p.join(_sandboxDir, to));
+  }, "rename directory $from to $to");
+}
+
+/// Schedules deleting a directory in the sandbox at [path].
+void deleteDir(String path) {
+  schedule(() {
+    new Directory(p.join(_sandboxDir, path)).deleteSync(recursive: true);
+  }, "delete directory $path");
+}
+
+/// Runs [callback] with every permutation of non-negative [i], [j], and [k]
+/// less than [limit].
+///
+/// Returns a set of all values returns by [callback].
+///
+/// [limit] defaults to 3.
+Set withPermutations(callback(int i, int j, int k), {int limit}) {
+  if (limit == null) limit = 3;
+  var results = new Set();
+  for (var i = 0; i < limit; i++) {
+    for (var j = 0; j < limit; j++) {
+      for (var k = 0; k < limit; k++) {
+        results.add(callback(i, j, k));
+      }
+    }
+  }
+  return results;
+}
diff --git a/mojo/public/dart/third_party/yaml/.gitignore b/mojo/public/dart/third_party/yaml/.gitignore
new file mode 100644
index 0000000..388eff0
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/.gitignore
@@ -0,0 +1,14 @@
+# Don’t commit the following directories created by pub.
+.buildlog
+.pub/
+build/
+packages
+
+# Or the files created by dart2js.
+*.dart.js
+*.js_
+*.js.deps
+*.js.map
+
+# Include when developing application packages.
+pubspec.lock
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/yaml/.status b/mojo/public/dart/third_party/yaml/.status
new file mode 100644
index 0000000..e9f2b00
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/.status
@@ -0,0 +1,3 @@
+# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
diff --git a/mojo/public/dart/third_party/yaml/CHANGELOG.md b/mojo/public/dart/third_party/yaml/CHANGELOG.md
new file mode 100644
index 0000000..5dcd749
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/CHANGELOG.md
@@ -0,0 +1,100 @@
+## 2.1.3
+
+* Add a hint that a colon might be missing when a mapping value is found in the
+  wrong context.
+
+## 2.1.2
+
+* Fix a crashing bug when parsing block scalars.
+
+## 2.1.1
+
+* Properly scope `SourceSpan`s for scalar values surrounded by whitespace.
+
+## 2.1.0
+
+* Rewrite the parser for a 10x speed improvement.
+
+* Support anchors and aliases (`&foo` and `*foo`).
+
+* Support explicit tags (e.g. `!!str`). Note that user-defined tags are still
+  not fully supported.
+
+* `%YAML` and `%TAG` directives are now parsed, although again user-defined tags
+  are not fully supported.
+
+* `YamlScalar`, `YamlList`, and `YamlMap` now expose the styles in which they
+  were written (for example plain vs folded, block vs flow).
+
+* A `yamlWarningCallback` field is exposed. This field can be used to customize
+  how YAML warnings are displayed.
+
+## 2.0.1+1
+
+* Fix an import in a test.
+
+* Widen the version constraint on the `collection` package.
+
+## 2.0.1
+
+* Fix a few lingering references to the old `Span` class in documentation and
+  tests.
+
+## 2.0.0
+
+* Switch from `source_maps`' `Span` class to `source_span`'s `SourceSpan` class.
+
+* For consistency with `source_span` and `string_scanner`, all `sourceName`
+  parameters have been renamed to `sourceUrl`. They now accept Urls as well as
+  Strings.
+
+## 1.1.1
+
+* Fix broken type arguments that caused breakage on dart2js.
+
+* Fix an analyzer warning in `yaml_node_wrapper.dart`.
+
+## 1.1.0
+
+* Add new publicly-accessible constructors for `YamlNode` subclasses. These
+  constructors make it possible to use the same API to access non-YAML data as
+  YAML data.
+
+* Make `YamlException` inherit from source_map's [`SpanFormatException`][]. This
+  improves the error formatting and allows callers access to source range
+  information.
+
+[SpanFormatException]: (http://www.dartdocs.org/documentation/source_maps/0.9.2/index.html#source_maps/source_maps.SpanFormatException)
+
+## 1.0.0+1
+
+* Fix a variable name typo.
+
+## 1.0.0
+
+* **Backwards incompatibility**: The data structures returned by `loadYaml` and
+  `loadYamlStream` are now immutable.
+
+* **Backwards incompatibility**: The interface of the `YamlMap` class has
+  changed substantially in numerous ways. External users may no longer construct
+  their own instances.
+
+* Maps and lists returned by `loadYaml` and `loadYamlStream` now contain
+  information about their source locations.
+
+* A new `loadYamlNode` function returns the source location of top-level scalars
+  as well.
+
+## 0.10.0
+
+* Improve error messages when a file fails to parse.
+
+## 0.9.0+2
+
+* Ensure that maps are order-independent when used as map keys.
+
+## 0.9.0+1
+
+* The `YamlMap` class is deprecated. In a future version, maps returned by
+  `loadYaml` and `loadYamlStream` will be Dart `HashMap`s with a custom equality
+  operation.
diff --git a/mojo/public/dart/third_party/yaml/LICENSE b/mojo/public/dart/third_party/yaml/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/dart/third_party/yaml/README.md b/mojo/public/dart/third_party/yaml/README.md
new file mode 100644
index 0000000..c78dc97
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/README.md
@@ -0,0 +1,26 @@
+A parser for [YAML](http://www.yaml.org/).
+
+Use `loadYaml` to load a single document, or `loadYamlStream` to load a
+stream of documents. For example:
+
+```dart
+import 'package:yaml/yaml.dart';
+
+main() {
+  var doc = loadYaml("YAML: YAML Ain't Markup Language");
+  print(doc['YAML']);
+}
+```
+
+This library currently doesn't support dumping to YAML. You should use
+`JSON.encode` from `dart:convert` instead:
+
+```dart
+import 'dart:convert';
+import 'package:yaml/yaml.dart';
+
+main() {
+  var doc = loadYaml("YAML: YAML Ain't Markup Language");
+  print(JSON.encode(doc));
+}
+```
diff --git a/mojo/public/dart/third_party/yaml/codereview.settings b/mojo/public/dart/third_party/yaml/codereview.settings
new file mode 100644
index 0000000..03b6c27
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/codereview.settings
@@ -0,0 +1,3 @@
+CODE_REVIEW_SERVER: https://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/yaml/commit/
+CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/mojo/public/dart/third_party/yaml/lib/src/equality.dart b/mojo/public/dart/third_party/yaml/lib/src/equality.dart
new file mode 100644
index 0000000..5408135
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/lib/src/equality.dart
@@ -0,0 +1,126 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library yaml.equality;
+
+import 'dart:collection';
+
+import 'package:collection/collection.dart';
+
+import 'yaml_node.dart';
+
+/// Returns a [Map] that compares its keys based on [deepEquals].
+Map deepEqualsMap() => new HashMap(equals: deepEquals, hashCode: deepHashCode);
+
+/// Returns whether two objects are structurally equivalent.
+///
+/// This considers `NaN` values to be equivalent, handles self-referential
+/// structures, and considers [YamlScalar]s to be equal to their values.
+bool deepEquals(obj1, obj2) => new _DeepEquals().equals(obj1, obj2);
+
+/// A class that provides access to the list of parent objects used for loop
+/// detection.
+class _DeepEquals {
+  final _parents1 = [];
+  final _parents2 = [];
+
+  /// Returns whether [obj1] and [obj2] are structurally equivalent.
+  bool equals(obj1, obj2) {
+    if (obj1 is YamlScalar) obj1 = obj1.value;
+    if (obj2 is YamlScalar) obj2 = obj2.value;
+
+    // _parents1 and _parents2 are guaranteed to be the same size.
+    for (var i = 0; i < _parents1.length; i++) {
+      var loop1 = identical(obj1, _parents1[i]);
+      var loop2 = identical(obj2, _parents2[i]);
+      // If both structures loop in the same place, they're equal at that point
+      // in the structure. If one loops and the other doesn't, they're not
+      // equal.
+      if (loop1 && loop2) return true;
+      if (loop1 || loop2) return false;
+    }
+
+    _parents1.add(obj1);
+    _parents2.add(obj2);
+    try {
+      if (obj1 is List && obj2 is List) {
+        return _listEquals(obj1, obj2);
+      } else if (obj1 is Map && obj2 is Map) {
+        return _mapEquals(obj1, obj2);
+      } else if (obj1 is num && obj2 is num) {
+        return _numEquals(obj1, obj2);
+      } else {
+        return obj1 == obj2;
+      }
+    } finally {
+      _parents1.removeLast();
+      _parents2.removeLast();
+    }
+  }
+
+  /// Returns whether [list1] and [list2] are structurally equal. 
+  bool _listEquals(List list1, List list2) {
+    if (list1.length != list2.length) return false;
+
+    for (var i = 0; i < list1.length; i++) {
+      if (!equals(list1[i], list2[i])) return false;
+    }
+
+    return true;
+  }
+
+  /// Returns whether [map1] and [map2] are structurally equal. 
+  bool _mapEquals(Map map1, Map map2) {
+    if (map1.length != map2.length) return false;
+
+    for (var key in map1.keys) {
+      if (!map2.containsKey(key)) return false;
+      if (!equals(map1[key], map2[key])) return false;
+    }
+
+    return true;
+  }
+
+  /// Returns whether two numbers are equivalent.
+  ///
+  /// This differs from `n1 == n2` in that it considers `NaN` to be equal to
+  /// itself.
+  bool _numEquals(num n1, num n2) {
+    if (n1.isNaN && n2.isNaN) return true;
+    return n1 == n2;
+  }
+}
+
+/// Returns a hash code for [obj] such that structurally equivalent objects
+/// will have the same hash code.
+///
+/// This supports deep equality for maps and lists, including those with
+/// self-referential structures, and returns the same hash code for
+/// [YamlScalar]s and their values.
+int deepHashCode(obj) {
+  var parents = [];
+
+  _deepHashCode(value) {
+    if (parents.any((parent) => identical(parent, value))) return -1;
+
+    parents.add(value);
+    try {
+      if (value is Map) {
+        var equality = const UnorderedIterableEquality();
+        return equality.hash(value.keys.map(_deepHashCode)) ^
+            equality.hash(value.values.map(_deepHashCode));
+      } else if (value is Iterable) {
+        return const IterableEquality().hash(value.map(deepHashCode));
+      } else if (value is YamlScalar) {
+        return value.value.hashCode;
+      } else {
+        return value.hashCode;
+      }
+    } finally {
+      parents.removeLast();
+    }
+  }
+
+  return _deepHashCode(obj);
+}
diff --git a/mojo/public/dart/third_party/yaml/lib/src/event.dart b/mojo/public/dart/third_party/yaml/lib/src/event.dart
new file mode 100644
index 0000000..96e2f16
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/lib/src/event.dart
@@ -0,0 +1,157 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library yaml.event;
+
+import 'package:source_span/source_span.dart';
+
+import 'style.dart';
+import 'yaml_document.dart';
+
+/// An event emitted by a [Parser].
+class Event {
+  /// The event type.
+  final EventType type;
+
+  /// The span associated with the event.
+  final FileSpan span;
+
+  Event(this.type, this.span);
+
+  String toString() => type.toString();
+}
+
+/// An event indicating the beginning of a YAML document.
+class DocumentStartEvent implements Event {
+  get type => EventType.DOCUMENT_START;
+  final FileSpan span;
+
+  /// The document's `%YAML` directive, or `null` if there was none.
+  final VersionDirective versionDirective;
+
+  /// The document's `%TAG` directives, if any.
+  final List<TagDirective> tagDirectives;
+
+  /// Whether the document started implicitly (that is, without an explicit
+  /// `===` sequence).
+  final bool isImplicit;
+
+  DocumentStartEvent(this.span, {this.versionDirective,
+          List<TagDirective> tagDirectives, this.isImplicit: true})
+      : tagDirectives = tagDirectives == null ? [] : tagDirectives;
+
+  String toString() => "DOCUMENT_START";
+}
+
+/// An event indicating the end of a YAML document.
+class DocumentEndEvent implements Event {
+  get type => EventType.DOCUMENT_END;
+  final FileSpan span;
+
+  /// Whether the document ended implicitly (that is, without an explicit
+  /// `...` sequence).
+  final bool isImplicit;
+
+  DocumentEndEvent(this.span, {this.isImplicit: true});
+
+  String toString() => "DOCUMENT_END";
+}
+
+/// An event indicating that an alias was referenced.
+class AliasEvent implements Event {
+  get type => EventType.ALIAS;
+  final FileSpan span;
+
+  /// The name of the anchor.
+  final String name;
+
+  AliasEvent(this.span, this.name);
+
+  String toString() => "ALIAS $name";
+}
+
+/// A base class for events that can have anchor and tag properties associated
+/// with them.
+abstract class _ValueEvent implements Event {
+  /// The name of the value's anchor, or `null` if it wasn't anchored.
+  String get anchor;
+
+  /// The text of the value's tag, or `null` if it wasn't tagged.
+  String get tag;
+
+  String toString() {
+    var buffer = new StringBuffer('$type');
+    if (anchor != null) buffer.write(" &$anchor");
+    if (tag != null) buffer.write(" $tag");
+    return buffer.toString();
+  }
+}
+
+/// An event indicating a single scalar value.
+class ScalarEvent extends _ValueEvent {
+  get type => EventType.SCALAR;
+  final FileSpan span;
+  final String anchor;
+  final String tag;
+
+  /// The contents of the scalar.
+  final String value;
+
+  /// The style of the scalar in the original source.
+  final ScalarStyle style;
+
+  ScalarEvent(this.span, this.value, this.style, {this.anchor, this.tag});
+
+  String toString() => "${super.toString()} \"$value\"";
+}
+
+/// An event indicating the beginning of a sequence.
+class SequenceStartEvent extends _ValueEvent {
+  get type => EventType.SEQUENCE_START;
+  final FileSpan span;
+  final String anchor;
+  final String tag;
+
+  /// The style of the collection in the original source.
+  final CollectionStyle style;
+
+  SequenceStartEvent(this.span, this.style, {this.anchor, this.tag});
+}
+
+/// An event indicating the beginning of a mapping.
+class MappingStartEvent extends _ValueEvent {
+  get type => EventType.MAPPING_START;
+  final FileSpan span;
+  final String anchor;
+  final String tag;
+
+  /// The style of the collection in the original source.
+  final CollectionStyle style;
+
+  MappingStartEvent(this.span, this.style, {this.anchor, this.tag});
+}
+
+/// An enum of types of [Event] object.
+class EventType {
+  static const STREAM_START = const EventType._("STREAM_START");
+  static const STREAM_END = const EventType._("STREAM_END");
+
+  static const DOCUMENT_START = const EventType._("DOCUMENT_START");
+  static const DOCUMENT_END = const EventType._("DOCUMENT_END");
+
+  static const ALIAS = const EventType._("ALIAS");
+  static const SCALAR = const EventType._("SCALAR");
+
+  static const SEQUENCE_START = const EventType._("SEQUENCE_START");
+  static const SEQUENCE_END = const EventType._("SEQUENCE_END");
+
+  static const MAPPING_START = const EventType._("MAPPING_START");
+  static const MAPPING_END = const EventType._("MAPPING_END");
+
+  final String name;
+
+  const EventType._(this.name);
+
+  String toString() => name;
+}
diff --git a/mojo/public/dart/third_party/yaml/lib/src/loader.dart b/mojo/public/dart/third_party/yaml/lib/src/loader.dart
new file mode 100644
index 0000000..d80578f
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/lib/src/loader.dart
@@ -0,0 +1,257 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library yaml.loader;
+
+import 'package:source_span/source_span.dart';
+
+import 'equality.dart';
+import 'event.dart';
+import 'parser.dart';
+import 'yaml_document.dart';
+import 'yaml_exception.dart';
+import 'yaml_node.dart';
+
+/// A loader that reads [Event]s emitted by a [Parser] and emits
+/// [YamlDocument]s.
+///
+/// This is based on the libyaml loader, available at
+/// https://github.com/yaml/libyaml/blob/master/src/loader.c. The license for
+/// that is available in ../../libyaml-license.txt.
+class Loader {
+  /// The underlying [Parser] that generates [Event]s.
+  final Parser _parser;
+
+  /// Aliases by the alias name.
+  final _aliases = new Map<String, YamlNode>();
+
+  /// The span of the entire stream emitted so far.
+  FileSpan get span => _span;
+  FileSpan _span;
+
+  /// Creates a loader that loads [source].
+  ///
+  /// [sourceUrl] can be a String or a [Uri].
+  Loader(String source, {sourceUrl})
+      : _parser = new Parser(source, sourceUrl: sourceUrl) {
+    var event = _parser.parse();
+    _span = event.span;
+    assert(event.type == EventType.STREAM_START);
+  }
+
+  /// Loads the next document from the stream.
+  ///
+  /// If there are no more documents, returns `null`.
+  YamlDocument load() {
+    if (_parser.isDone) return null;
+
+    var event = _parser.parse();
+    if (event.type == EventType.STREAM_END) {
+      _span = _span.expand(event.span);
+      return null;
+    }
+
+    var document = _loadDocument(event);
+    _span = _span.expand(document.span);
+    _aliases.clear();
+    return document;
+  }
+
+  /// Composes a document object.
+  YamlDocument _loadDocument(DocumentStartEvent firstEvent) {
+    var contents = _loadNode(_parser.parse());
+
+    var lastEvent = _parser.parse();
+    assert(lastEvent.type == EventType.DOCUMENT_END);
+
+    return new YamlDocument.internal(
+        contents,
+        firstEvent.span.expand(lastEvent.span),
+        firstEvent.versionDirective,
+        firstEvent.tagDirectives,
+        startImplicit: firstEvent.isImplicit,
+        endImplicit: lastEvent.isImplicit);
+  }
+
+  /// Composes a node.
+  YamlNode _loadNode(Event firstEvent) {
+    switch (firstEvent.type) {
+      case EventType.ALIAS: return _loadAlias(firstEvent);
+      case EventType.SCALAR: return _loadScalar(firstEvent);
+      case EventType.SEQUENCE_START: return _loadSequence(firstEvent);
+      case EventType.MAPPING_START: return _loadMapping(firstEvent);
+      default: throw "Unreachable";
+    }
+  }
+
+  /// Registers an anchor.
+  void _registerAnchor(String anchor, YamlNode node) {
+    if (anchor == null) return;
+
+    // libyaml throws an error for duplicate anchors, but example 7.1 makes it
+    // clear that they should be overridden:
+    // http://yaml.org/spec/1.2/spec.html#id2786448.
+
+    _aliases[anchor] = node;
+  }
+
+  /// Composes a node corresponding to an alias.
+  YamlNode _loadAlias(AliasEvent event) {
+    var alias = _aliases[event.name];
+    if (alias != null) return alias;
+
+    throw new YamlException("Undefined alias.", event.span);
+  }
+
+  /// Composes a scalar node.
+  YamlNode _loadScalar(ScalarEvent scalar) {
+    var node;
+    if (scalar.tag == "!") {
+      node = _parseString(scalar);
+    } else if (scalar.tag != null) {
+      node = _parseByTag(scalar);
+    } else {
+      node = _parseNull(scalar);
+      if (node == null) node = _parseBool(scalar);
+      if (node == null) node = _parseInt(scalar);
+      if (node == null) node = _parseFloat(scalar);
+      if (node == null) node = _parseString(scalar);
+    }
+
+    _registerAnchor(scalar.anchor, node);
+    return node;
+  }
+
+  /// Composes a sequence node.
+  YamlNode _loadSequence(SequenceStartEvent firstEvent) {
+    if (firstEvent.tag != "!" && firstEvent.tag != null &&
+        firstEvent.tag != "tag:yaml.org,2002:seq") {
+      throw new YamlException("Invalid tag for sequence.", firstEvent.span);
+    }
+
+    var children = [];
+    var node = new YamlList.internal(
+        children, firstEvent.span, firstEvent.style);
+    _registerAnchor(firstEvent.anchor, node);
+
+    var event = _parser.parse();
+    while (event.type != EventType.SEQUENCE_END) {
+      children.add(_loadNode(event));
+      event = _parser.parse();
+    }
+
+    setSpan(node, firstEvent.span.expand(event.span));
+    return node;
+  }
+
+  /// Composes a mapping node.
+  YamlNode _loadMapping(MappingStartEvent firstEvent) {
+    if (firstEvent.tag != "!" && firstEvent.tag != null &&
+        firstEvent.tag != "tag:yaml.org,2002:map") {
+      throw new YamlException("Invalid tag for mapping.", firstEvent.span);
+    }
+
+    var children = deepEqualsMap();
+    var node = new YamlMap.internal(
+        children, firstEvent.span, firstEvent.style);
+    _registerAnchor(firstEvent.anchor, node);
+
+    var event = _parser.parse();
+    while (event.type != EventType.MAPPING_END) {
+      var key = _loadNode(event);
+      var value = _loadNode(_parser.parse());
+      children[key] = value;
+      event = _parser.parse();
+    }
+
+    setSpan(node, firstEvent.span.expand(event.span));
+    return node;
+  }
+
+  /// Parses a scalar according to its tag name.
+  YamlScalar _parseByTag(ScalarEvent scalar) {
+    switch (scalar.tag) {
+      case "tag:yaml.org,2002:null": return _parseNull(scalar);
+      case "tag:yaml.org,2002:bool": return _parseBool(scalar);
+      case "tag:yaml.org,2002:int": return _parseInt(scalar);
+      case "tag:yaml.org,2002:float": return _parseFloat(scalar);
+      case "tag:yaml.org,2002:str": return _parseString(scalar);
+    }
+    throw new YamlException('Undefined tag: ${scalar.tag}.', scalar.span);
+  }
+
+  /// Parses a null scalar.
+  YamlScalar _parseNull(ScalarEvent scalar) {
+    // TODO(nweiz): stop using regexps.
+    // TODO(nweiz): add ScalarStyle and implicit metadata to the scalars.
+    if (new RegExp(r"^(null|Null|NULL|~|)$").hasMatch(scalar.value)) {
+      return new YamlScalar.internal(null, scalar.span, scalar.style);
+    } else {
+      return null;
+    }
+  }
+
+  /// Parses a boolean scalar.
+  YamlScalar _parseBool(ScalarEvent scalar) {
+    var match = new RegExp(r"^(?:(true|True|TRUE)|(false|False|FALSE))$").
+        firstMatch(scalar.value);
+    if (match == null) return null;
+    return new YamlScalar.internal(
+        match.group(1) != null, scalar.span, scalar.style);
+  }
+
+  /// Parses an integer scalar.
+  YamlScalar _parseInt(ScalarEvent scalar) {
+    var match = new RegExp(r"^[-+]?[0-9]+$").firstMatch(scalar.value);
+    if (match != null) {
+      return new YamlScalar.internal(
+          int.parse(match.group(0)), scalar.span, scalar.style);
+    }
+
+    match = new RegExp(r"^0o([0-7]+)$").firstMatch(scalar.value);
+    if (match != null) {
+      var n = int.parse(match.group(1), radix: 8);
+      return new YamlScalar.internal(n, scalar.span, scalar.style);
+    }
+
+    match = new RegExp(r"^0x[0-9a-fA-F]+$").firstMatch(scalar.value);
+    if (match != null) {
+      return new YamlScalar.internal(
+          int.parse(match.group(0)), scalar.span, scalar.style);
+    }
+
+    return null;
+  }
+
+  /// Parses a floating-point scalar.
+  YamlScalar _parseFloat(ScalarEvent scalar) {
+    var match = new RegExp(
+          r"^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$").
+        firstMatch(scalar.value);
+    if (match != null) {
+      // YAML allows floats of the form "0.", but Dart does not. Fix up those
+      // floats by removing the trailing dot.
+      var matchStr = match.group(0).replaceAll(new RegExp(r"\.$"), "");
+      return new YamlScalar.internal(
+          double.parse(matchStr), scalar.span, scalar.style);
+    }
+
+    match = new RegExp(r"^([+-]?)\.(inf|Inf|INF)$").firstMatch(scalar.value);
+    if (match != null) {
+      var value = match.group(1) == "-" ? -double.INFINITY : double.INFINITY;
+      return new YamlScalar.internal(value, scalar.span, scalar.style);
+    }
+
+    match = new RegExp(r"^\.(nan|NaN|NAN)$").firstMatch(scalar.value);
+    if (match != null) {
+      return new YamlScalar.internal(double.NAN, scalar.span, scalar.style);
+    }
+
+    return null;
+  }
+
+  /// Parses a string scalar.
+  YamlScalar _parseString(ScalarEvent scalar) =>
+      new YamlScalar.internal(scalar.value, scalar.span, scalar.style);
+}
diff --git a/mojo/public/dart/third_party/yaml/lib/src/null_span.dart b/mojo/public/dart/third_party/yaml/lib/src/null_span.dart
new file mode 100644
index 0000000..06b42f0
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/lib/src/null_span.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library yaml.null_span;
+
+import 'package:source_span/source_span.dart';
+
+/// A [SourceSpan] with no location information.
+///
+/// This is used with [YamlMap.wrap] and [YamlList.wrap] to provide means of
+/// accessing a non-YAML map that behaves transparently like a map parsed from
+/// YAML.
+class NullSpan extends SourceSpanMixin {
+  final SourceLocation start;
+  SourceLocation get end => start;
+  final text = "";
+
+  NullSpan(sourceUrl)
+      : start = new SourceLocation(0, sourceUrl: sourceUrl);
+}
diff --git a/mojo/public/dart/third_party/yaml/lib/src/parser.dart b/mojo/public/dart/third_party/yaml/lib/src/parser.dart
new file mode 100644
index 0000000..8bb131f
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/lib/src/parser.dart
@@ -0,0 +1,816 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library yaml.parser;
+
+import 'package:source_span/source_span.dart';
+import 'package:string_scanner/string_scanner.dart';
+
+import 'event.dart';
+import 'scanner.dart';
+import 'style.dart';
+import 'token.dart';
+import 'utils.dart';
+import 'yaml_document.dart';
+import 'yaml_exception.dart';
+
+/// A parser that reads [Token]s emitted by a [Scanner] and emits [Event]s.
+///
+/// This is based on the libyaml parser, available at
+/// https://github.com/yaml/libyaml/blob/master/src/parser.c. The license for
+/// that is available in ../../libyaml-license.txt.
+class Parser {
+  /// The underlying [Scanner] that generates [Token]s.
+  final Scanner _scanner;
+
+  /// The stack of parse states for nested contexts.
+  final _states = new List<_State>();
+
+  /// The current parse state.
+  var _state = _State.STREAM_START;
+
+  /// The custom tag directives, by tag handle.
+  final _tagDirectives = new Map<String, TagDirective>();
+
+  /// Whether the parser has finished parsing.
+  bool get isDone => _state == _State.END;
+
+  /// Creates a parser that parses [source].
+  ///
+  /// [sourceUrl] can be a String or a [Uri].
+  Parser(String source, {sourceUrl})
+      : _scanner = new Scanner(source, sourceUrl: sourceUrl);
+
+  /// Consumes and returns the next event.
+  Event parse() {
+    try {
+      if (isDone) throw new StateError("No more events.");
+      var event = _stateMachine();
+      return event;
+    } on StringScannerException catch (error) {
+      throw new YamlException(error.message, error.span);
+    }
+  }
+
+  /// Dispatches parsing based on the current state.
+  Event _stateMachine() {
+    switch (_state) {
+      case _State.STREAM_START:
+        return _parseStreamStart();
+      case _State.DOCUMENT_START:
+        return _parseDocumentStart();
+      case _State.DOCUMENT_CONTENT:
+        return _parseDocumentContent();
+      case _State.DOCUMENT_END:
+        return _parseDocumentEnd();
+      case _State.BLOCK_NODE:
+        return _parseNode(block: true);
+      case _State.BLOCK_NODE_OR_INDENTLESS_SEQUENCE:
+        return _parseNode(block: true, indentlessSequence: true);
+      case _State.FLOW_NODE:
+        return _parseNode();
+      case _State.BLOCK_SEQUENCE_FIRST_ENTRY:
+        // Scan past the `BLOCK-SEQUENCE-FIRST-ENTRY` token to the
+        // `BLOCK-SEQUENCE-ENTRY` token.
+        _scanner.scan();
+        return _parseBlockSequenceEntry();
+      case _State.BLOCK_SEQUENCE_ENTRY:
+        return _parseBlockSequenceEntry();
+      case _State.INDENTLESS_SEQUENCE_ENTRY:
+        return _parseIndentlessSequenceEntry();
+      case _State.BLOCK_MAPPING_FIRST_KEY:
+        // Scan past the `BLOCK-MAPPING-FIRST-KEY` token to the
+        // `BLOCK-MAPPING-KEY` token.
+        _scanner.scan();
+        return _parseBlockMappingKey();
+      case _State.BLOCK_MAPPING_KEY:
+        return _parseBlockMappingKey();
+      case _State.BLOCK_MAPPING_VALUE:
+        return _parseBlockMappingValue();
+      case _State.FLOW_SEQUENCE_FIRST_ENTRY:
+        return _parseFlowSequenceEntry(first: true);
+      case _State.FLOW_SEQUENCE_ENTRY:
+        return _parseFlowSequenceEntry();
+      case _State.FLOW_SEQUENCE_ENTRY_MAPPING_KEY:
+        return _parseFlowSequenceEntryMappingKey();
+      case _State.FLOW_SEQUENCE_ENTRY_MAPPING_VALUE:
+        return _parseFlowSequenceEntryMappingValue();
+      case _State.FLOW_SEQUENCE_ENTRY_MAPPING_END:
+        return _parseFlowSequenceEntryMappingEnd();
+      case _State.FLOW_MAPPING_FIRST_KEY:
+        return _parseFlowMappingKey(first: true);
+      case _State.FLOW_MAPPING_KEY:
+        return _parseFlowMappingKey();
+      case _State.FLOW_MAPPING_VALUE:
+        return _parseFlowMappingValue();
+      case _State.FLOW_MAPPING_EMPTY_VALUE:
+        return _parseFlowMappingValue(empty: true);
+      default:
+        throw "Unreachable";
+    }
+  }
+
+  /// Parses the production:
+  ///
+  ///     stream ::=
+  ///       STREAM-START implicit_document? explicit_document* STREAM-END
+  ///       ************  
+  Event _parseStreamStart() {
+    var token = _scanner.scan();
+    assert(token.type == TokenType.STREAM_START);
+
+    _state = _State.DOCUMENT_START;
+    return new Event(EventType.STREAM_START, token.span);
+  }
+
+  /// Parses the productions:
+  ///
+  ///     implicit_document    ::= block_node DOCUMENT-END*
+  ///                              *
+  ///     explicit_document    ::=
+  ///       DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
+  ///       *************************
+  Event _parseDocumentStart() {
+    var token = _scanner.peek();
+
+    // libyaml requires any document beyond the first in the stream to have an
+    // explicit document start indicator, but the spec allows it to be omitted
+    // as long as there was an end indicator.
+
+    // Parse extra document end indicators.
+    while (token.type == TokenType.DOCUMENT_END) {
+      token = _scanner.advance();
+    }
+
+    if (token.type != TokenType.VERSION_DIRECTIVE &&
+        token.type != TokenType.TAG_DIRECTIVE &&
+        token.type != TokenType.DOCUMENT_START &&
+        token.type != TokenType.STREAM_END) {
+      // Parse an implicit document.
+      _processDirectives();
+      _states.add(_State.DOCUMENT_END);
+      _state = _State.BLOCK_NODE;
+      return new DocumentStartEvent(token.span.start.pointSpan());
+    }
+
+    if (token.type == TokenType.STREAM_END) {
+      _state = _State.END;
+      _scanner.scan();
+      return new Event(EventType.STREAM_END, token.span);
+    }
+
+    // Parse an explicit document.
+    var start = token.span;
+    var pair = _processDirectives();
+    var versionDirective = pair.first;
+    var tagDirectives = pair.last;
+    token = _scanner.peek();
+    if (token.type != TokenType.DOCUMENT_START) {
+      throw new YamlException("Expected document start.", token.span);
+    }
+
+    _states.add(_State.DOCUMENT_END);
+    _state = _State.DOCUMENT_CONTENT;
+    _scanner.scan();
+    return new DocumentStartEvent(start.expand(token.span),
+        versionDirective: versionDirective,
+        tagDirectives: tagDirectives,
+        isImplicit: false);
+  }
+
+  /// Parses the productions:
+  ///
+  ///     explicit_document    ::=
+  ///       DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
+  ///                                 ***********  
+  Event _parseDocumentContent() {
+    var token = _scanner.peek();
+
+    switch (token.type) {
+      case TokenType.VERSION_DIRECTIVE:
+      case TokenType.TAG_DIRECTIVE:
+      case TokenType.DOCUMENT_START:
+      case TokenType.DOCUMENT_END:
+      case TokenType.STREAM_END:
+        _state = _states.removeLast();
+        return _processEmptyScalar(token.span.start);
+      default:
+        return _parseNode(block: true);
+    }
+  }
+
+  /// Parses the productions:
+  ///
+  ///     implicit_document    ::= block_node DOCUMENT-END*
+  ///                                         *************
+  ///     explicit_document    ::=
+  ///       DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
+  ///                                             *************
+  Event _parseDocumentEnd() {
+    _tagDirectives.clear();
+    _state = _State.DOCUMENT_START;
+
+    var token = _scanner.peek();
+    if (token.type == TokenType.DOCUMENT_END) {
+      _scanner.scan();
+      return new DocumentEndEvent(token.span, isImplicit: false);
+    } else {
+      return new DocumentEndEvent(
+          token.span.start.pointSpan(), isImplicit: true);
+    }
+  }
+
+  /// Parses the productions:
+  ///
+  ///     block_node_or_indentless_sequence    ::=
+  ///       ALIAS
+  ///       *****
+  ///       | properties (block_content | indentless_block_sequence)?
+  ///         **********  *
+  ///       | block_content | indentless_block_sequence
+  ///         *
+  ///     block_node           ::= ALIAS
+  ///                              *****
+  ///                              | properties block_content?
+  ///                                ********** *
+  ///                              | block_content
+  ///                                *
+  ///     flow_node            ::= ALIAS
+  ///                              *****
+  ///                              | properties flow_content?
+  ///                                ********** *
+  ///                              | flow_content
+  ///                                *
+  ///     properties           ::= TAG ANCHOR? | ANCHOR TAG?
+  ///                              *************************
+  ///     block_content        ::= block_collection | flow_collection | SCALAR
+  ///                                                                   ******
+  ///     flow_content         ::= flow_collection | SCALAR
+  ///                                                ******
+  Event _parseNode({bool block: false, bool indentlessSequence: false}) {
+    var token = _scanner.peek();
+
+    if (token is AliasToken) {
+      _scanner.scan();
+      _state = _states.removeLast();
+      return new AliasEvent(token.span, token.name);
+    }
+
+    var anchor;
+    var tagToken;
+    var span = token.span.start.pointSpan();
+    parseAnchor() {
+      anchor = token.name;
+      span = span.expand(token.span);
+      token = _scanner.advance();
+    }
+
+    parseTag() {
+      tagToken = token;
+      span = span.expand(token.span);
+      token = _scanner.advance();
+    }
+
+    if (token is AnchorToken) {
+      parseAnchor();
+      if (token is TagToken) parseTag();
+    } else if (token is TagToken) {
+      parseTag();
+      if (token is AnchorToken) parseAnchor();
+    }
+
+    var tag;
+    if (tagToken != null) {
+      if (tagToken.handle == null) {
+        tag = tagToken.suffix;
+      } else {
+        var tagDirective = _tagDirectives[tagToken.handle];
+        if (tagDirective == null) {
+          throw new YamlException("Undefined tag handle.", tagToken.span);
+        }
+
+        tag = tagDirective.prefix + tagToken.suffix;
+      }
+    }
+
+    if (indentlessSequence && token.type == TokenType.BLOCK_ENTRY) {
+      _state = _State.INDENTLESS_SEQUENCE_ENTRY;
+      return new SequenceStartEvent(
+          span.expand(token.span), CollectionStyle.BLOCK,
+          anchor: anchor, tag: tag);
+    }
+
+    if (token is ScalarToken) {
+      // All non-plain scalars have the "!" tag by default.
+      if (tag == null && token.style != ScalarStyle.PLAIN) tag = "!";
+
+      _state = _states.removeLast();
+      _scanner.scan();
+      return new ScalarEvent(
+          span.expand(token.span), token.value, token.style,
+          anchor: anchor, tag: tag);
+    }
+
+    if (token.type == TokenType.FLOW_SEQUENCE_START) {
+      _state = _State.FLOW_SEQUENCE_FIRST_ENTRY;
+      return new SequenceStartEvent(
+          span.expand(token.span), CollectionStyle.FLOW,
+          anchor: anchor, tag: tag);
+    }
+
+    if (token.type == TokenType.FLOW_MAPPING_START) {
+      _state = _State.FLOW_MAPPING_FIRST_KEY;
+      return new MappingStartEvent(
+          span.expand(token.span), CollectionStyle.FLOW,
+          anchor: anchor, tag: tag);
+    }
+
+    if (block && token.type == TokenType.BLOCK_SEQUENCE_START) {
+      _state = _State.BLOCK_SEQUENCE_FIRST_ENTRY;
+      return new SequenceStartEvent(
+          span.expand(token.span), CollectionStyle.BLOCK,
+          anchor: anchor, tag: tag);
+    }
+
+
+    if (block && token.type == TokenType.BLOCK_MAPPING_START) {
+      _state = _State.BLOCK_MAPPING_FIRST_KEY;
+      return new MappingStartEvent(
+          span.expand(token.span), CollectionStyle.BLOCK,
+          anchor: anchor, tag: tag);
+    }
+
+    if (anchor != null || tag != null) {
+      _state = _states.removeLast();
+      return new ScalarEvent(
+          span, '', ScalarStyle.PLAIN,
+          anchor: anchor, tag: tag);
+    }
+
+    throw new YamlException("Expected node content.", span);
+  }
+
+  /// Parses the productions:
+  ///
+  ///     block_sequence ::=
+  ///       BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
+  ///       ********************  *********** *             *********
+  Event _parseBlockSequenceEntry() {
+    var token = _scanner.peek();
+
+    if (token.type == TokenType.BLOCK_ENTRY) {
+      token = _scanner.advance();
+
+      if (token.type == TokenType.BLOCK_ENTRY ||
+          token.type == TokenType.BLOCK_END) {
+        _state = _State.BLOCK_SEQUENCE_ENTRY;
+        return _processEmptyScalar(token.span.end);
+      } else {
+        _states.add(_State.BLOCK_SEQUENCE_ENTRY);
+        return _parseNode(block: true);
+      }
+    }
+
+    if (token.type == TokenType.BLOCK_END) {
+      _scanner.scan();
+      _state = _states.removeLast();
+      return new Event(EventType.SEQUENCE_END, token.span);
+    }
+
+    throw new YamlException("While parsing a block collection, expected '-'.",
+        token.span.start.pointSpan());
+  }
+
+  /// Parses the productions:
+  ///
+  ///     indentless_sequence  ::= (BLOCK-ENTRY block_node?)+
+  ///                               *********** *
+  Event _parseIndentlessSequenceEntry() {
+    var token = _scanner.peek();
+
+    if (token.type != TokenType.BLOCK_ENTRY) {
+      _state = _states.removeLast();
+      return new Event(EventType.SEQUENCE_END, token.span.start.pointSpan());
+    }
+
+    var start = token.span.start;
+    token = _scanner.advance();
+
+    if (token.type == TokenType.BLOCK_ENTRY ||
+        token.type == TokenType.KEY ||
+        token.type == TokenType.VALUE ||
+        token.type == TokenType.BLOCK_END) {
+      _state = _State.INDENTLESS_SEQUENCE_ENTRY;
+      return _processEmptyScalar(start);
+    } else {
+      _states.add(_State.INDENTLESS_SEQUENCE_ENTRY);
+      return _parseNode(block: true);
+    }
+  }
+
+  /// Parses the productions:
+  ///
+  ///     block_mapping        ::= BLOCK-MAPPING_START
+  ///                              *******************
+  ///                              ((KEY block_node_or_indentless_sequence?)?
+  ///                                *** *
+  ///                              (VALUE block_node_or_indentless_sequence?)?)*
+  ///
+  ///                              BLOCK-END
+  ///                              *********
+  Event _parseBlockMappingKey() {
+    var token = _scanner.peek();
+    if (token.type == TokenType.KEY) {
+      var start = token.span.start;
+      token = _scanner.advance();
+
+      if (token.type == TokenType.KEY ||
+          token.type == TokenType.VALUE ||
+          token.type == TokenType.BLOCK_END) {
+        _state = _State.BLOCK_MAPPING_VALUE;
+        return _processEmptyScalar(start);
+      } else {
+        _states.add(_State.BLOCK_MAPPING_VALUE);
+        return _parseNode(block: true, indentlessSequence: true);
+      }
+    }
+
+    // libyaml doesn't allow empty keys without an explicit key indicator, but
+    // the spec does. See example 8.18:
+    // http://yaml.org/spec/1.2/spec.html#id2798896.
+    if (token.type == TokenType.VALUE) {
+      _state = _State.BLOCK_MAPPING_VALUE;
+      return _processEmptyScalar(token.span.start);
+    }
+
+    if (token.type == TokenType.BLOCK_END) {
+      _scanner.scan();
+      _state = _states.removeLast();
+      return new Event(EventType.MAPPING_END, token.span);
+    }
+
+    throw new YamlException("Expected a key while parsing a block mapping.",
+        token.span.start.pointSpan());
+  }
+
+  /// Parses the productions:
+  ///
+  ///     block_mapping        ::= BLOCK-MAPPING_START
+  ///
+  ///                              ((KEY block_node_or_indentless_sequence?)?
+  ///
+  ///                              (VALUE block_node_or_indentless_sequence?)?)*
+  ///                               ***** *
+  ///                              BLOCK-END  
+  ///
+  Event _parseBlockMappingValue() {
+    var token = _scanner.peek();
+
+    if (token.type != TokenType.VALUE) {
+      _state = _State.BLOCK_MAPPING_KEY;
+      return _processEmptyScalar(token.span.start);
+    }
+
+    var start = token.span.start;
+    token = _scanner.advance();
+    if (token.type == TokenType.KEY ||
+        token.type == TokenType.VALUE ||
+        token.type == TokenType.BLOCK_END) {
+      _state = _State.BLOCK_MAPPING_KEY;
+      return _processEmptyScalar(start);
+    } else {
+      _states.add(_State.BLOCK_MAPPING_KEY);
+      return _parseNode(block: true, indentlessSequence: true);
+    }
+  }
+
+  /// Parses the productions:
+  ///
+  ///     flow_sequence        ::= FLOW-SEQUENCE-START
+  ///                              *******************
+  ///                              (flow_sequence_entry FLOW-ENTRY)*
+  ///                               *                   **********
+  ///                              flow_sequence_entry?
+  ///                              *
+  ///                              FLOW-SEQUENCE-END
+  ///                              *****************
+  ///     flow_sequence_entry  ::=
+  ///       flow_node | KEY flow_node? (VALUE flow_node?)?
+  ///       *
+  Event _parseFlowSequenceEntry({bool first: false}) {
+    if (first) _scanner.scan();
+    var token = _scanner.peek();
+
+    if (token.type != TokenType.FLOW_SEQUENCE_END) {
+      if (!first) {
+        if (token.type != TokenType.FLOW_ENTRY) {
+          throw new YamlException(
+              "While parsing a flow sequence, expected ',' or ']'.",
+              token.span.start.pointSpan());
+        }
+
+        token = _scanner.advance();
+      }
+
+      if (token.type == TokenType.KEY) {
+        _state = _State.FLOW_SEQUENCE_ENTRY_MAPPING_KEY;
+        _scanner.scan();
+        return new MappingStartEvent(
+            token.span, CollectionStyle.FLOW);
+      } else if (token.type != TokenType.FLOW_SEQUENCE_END) {
+        _states.add(_State.FLOW_SEQUENCE_ENTRY);
+        return _parseNode();
+      }
+    }
+
+    _scanner.scan();
+    _state = _states.removeLast();
+    return new Event(EventType.SEQUENCE_END, token.span);
+  }  
+
+  /// Parses the productions:
+  ///
+  ///     flow_sequence_entry  ::=
+  ///       flow_node | KEY flow_node? (VALUE flow_node?)?
+  ///                   *** *
+  Event _parseFlowSequenceEntryMappingKey() {
+    var token = _scanner.peek();
+
+    if (token.type == TokenType.VALUE ||
+        token.type == TokenType.FLOW_ENTRY ||
+        token.type == TokenType.FLOW_SEQUENCE_END) {
+      // libyaml consumes the token here, but that seems like a bug, since it
+      // always causes [_parseFlowSequenceEntryMappingValue] to emit an empty
+      // scalar.
+
+      var start = token.span.start;
+      _state = _State.FLOW_SEQUENCE_ENTRY_MAPPING_VALUE;
+      return _processEmptyScalar(start);
+    } else {
+      _states.add(_State.FLOW_SEQUENCE_ENTRY_MAPPING_VALUE);
+      return _parseNode();
+    }
+  }
+
+  /// Parses the productions:
+  ///
+  ///     flow_sequence_entry  ::=
+  ///       flow_node | KEY flow_node? (VALUE flow_node?)?
+  ///                                   ***** *
+  Event _parseFlowSequenceEntryMappingValue() {
+    var token = _scanner.peek();
+
+    if (token.type == TokenType.VALUE) {
+      token = _scanner.advance();
+      if (token.type != TokenType.FLOW_ENTRY &&
+          token.type != TokenType.FLOW_SEQUENCE_END) {
+        _states.add(_State.FLOW_SEQUENCE_ENTRY_MAPPING_END);
+        return _parseNode();
+      }
+    }
+
+    _state = _State.FLOW_SEQUENCE_ENTRY_MAPPING_END;
+    return _processEmptyScalar(token.span.start);
+  }
+
+  /// Parses the productions:
+  ///
+  ///     flow_sequence_entry  ::=
+  ///       flow_node | KEY flow_node? (VALUE flow_node?)?
+  ///                                                   *
+  Event _parseFlowSequenceEntryMappingEnd() {
+    _state = _State.FLOW_SEQUENCE_ENTRY;
+    return new Event(EventType.MAPPING_END,
+        _scanner.peek().span.start.pointSpan());
+  }
+
+  /// Parses the productions:
+  ///
+  ///     flow_mapping         ::= FLOW-MAPPING-START
+  ///                              ******************
+  ///                              (flow_mapping_entry FLOW-ENTRY)*
+  ///                               *                  **********
+  ///                              flow_mapping_entry?
+  ///                              ******************
+  ///                              FLOW-MAPPING-END
+  ///                              ****************
+  ///     flow_mapping_entry   ::=
+  ///       flow_node | KEY flow_node? (VALUE flow_node?)?
+  ///       *           *** *
+  Event _parseFlowMappingKey({bool first: false}) {
+    if (first) _scanner.scan();
+    var token = _scanner.peek();
+
+    if (token.type != TokenType.FLOW_MAPPING_END) {
+      if (!first) {
+        if (token.type != TokenType.FLOW_ENTRY) {
+          throw new YamlException(
+              "While parsing a flow mapping, expected ',' or '}'.",
+              token.span.start.pointSpan());
+        }
+
+        token = _scanner.advance();
+      }
+
+      if (token.type == TokenType.KEY) {
+        token = _scanner.advance();
+        if (token.type != TokenType.VALUE &&
+            token.type != TokenType.FLOW_ENTRY &&
+            token.type != TokenType.FLOW_MAPPING_END) {
+          _states.add(_State.FLOW_MAPPING_VALUE);
+          return _parseNode();
+        } else {
+          _state = _State.FLOW_MAPPING_VALUE;
+          return _processEmptyScalar(token.span.start);
+        }
+      } else if (token.type != TokenType.FLOW_MAPPING_END) {
+        _states.add(_State.FLOW_MAPPING_EMPTY_VALUE);
+        return _parseNode();
+      }
+    }
+
+    _scanner.scan();
+    _state = _states.removeLast();
+    return new Event(EventType.MAPPING_END, token.span);
+  }
+
+  /// Parses the productions:
+  ///
+  ///     flow_mapping_entry   ::=
+  ///       flow_node | KEY flow_node? (VALUE flow_node?)?
+  ///                *                  ***** *
+  Event _parseFlowMappingValue({bool empty: false}) {
+    var token = _scanner.peek();
+
+    if (empty) {
+      _state = _State.FLOW_MAPPING_KEY;
+      return _processEmptyScalar(token.span.start);
+    }
+
+    if (token.type == TokenType.VALUE) {
+      token = _scanner.advance();
+      if (token.type != TokenType.FLOW_ENTRY &&
+          token.type != TokenType.FLOW_MAPPING_END) {
+        _states.add(_State.FLOW_MAPPING_KEY);
+        return _parseNode();
+      }
+    }
+
+    _state = _State.FLOW_MAPPING_KEY;
+    return _processEmptyScalar(token.span.start);
+  }
+
+  /// Generate an empty scalar event.
+  Event _processEmptyScalar(SourceLocation location) =>
+      new ScalarEvent(location.pointSpan(), '', ScalarStyle.PLAIN);
+
+  /// Parses directives.
+  Pair<VersionDirective, List<TagDirective>> _processDirectives() {
+    var token = _scanner.peek();
+
+    var versionDirective;
+    var tagDirectives = [];
+    while (token.type == TokenType.VERSION_DIRECTIVE ||
+           token.type == TokenType.TAG_DIRECTIVE) {
+      if (token is VersionDirectiveToken) {
+        if (versionDirective != null) {
+          throw new YamlException("Duplicate %YAML directive.", token.span);
+        }
+
+        if (token.major != 1 || token.minor == 0) {
+          throw new YamlException(
+              "Incompatible YAML document. This parser only supports YAML 1.1 "
+                "and 1.2.",
+              token.span);
+        } else if (token.minor > 2) {
+          // TODO(nweiz): Print to stderr when issue 6943 is fixed and dart:io
+          // is available.
+          warn("Warning: this parser only supports YAML 1.1 and 1.2.",
+              token.span);
+        }
+
+        versionDirective = new VersionDirective(token.major, token.minor);
+      } else if (token is TagDirectiveToken) {
+        var tagDirective = new TagDirective(token.handle, token.prefix);
+        _appendTagDirective(tagDirective, token.span);
+        tagDirectives.add(tagDirective);
+      }
+
+      token = _scanner.advance();
+    }
+    
+    _appendTagDirective(
+        new TagDirective("!", "!"),
+        token.span.start.pointSpan(),
+        allowDuplicates: true);
+    _appendTagDirective(
+        new TagDirective("!!", "tag:yaml.org,2002:"),
+        token.span.start.pointSpan(),
+        allowDuplicates: true);
+
+    return new Pair(versionDirective, tagDirectives);
+  }
+
+  /// Adds a tag directive to the directives stack.
+  void _appendTagDirective(TagDirective newDirective, FileSpan span,
+      {bool allowDuplicates: false}) {
+    if (_tagDirectives.containsKey(newDirective.handle)) {
+      if (allowDuplicates) return;
+      throw new YamlException("Duplicate %TAG directive.", span);
+    }
+
+    _tagDirectives[newDirective.handle] = newDirective;
+  }
+}
+
+/// The possible states for the parser.
+class _State {
+  /// Expect [TokenType.STREAM_START].
+  static const STREAM_START = const _State("STREAM_START");
+
+  /// Expect the beginning of an implicit document.
+  static const IMPLICIT_DOCUMENT_START =
+      const _State("IMPLICIT_DOCUMENT_START");
+
+  /// Expect [TokenType.DOCUMENT_START].
+  static const DOCUMENT_START = const _State("DOCUMENT_START");
+
+  /// Expect the content of a document.
+  static const DOCUMENT_CONTENT = const _State("DOCUMENT_CONTENT");
+
+  /// Expect [TokenType.DOCUMENT_END].
+  static const DOCUMENT_END = const _State("DOCUMENT_END");
+
+  /// Expect a block node.
+  static const BLOCK_NODE = const _State("BLOCK_NODE");
+
+  /// Expect a block node or indentless sequence.
+  static const BLOCK_NODE_OR_INDENTLESS_SEQUENCE =
+      const _State("BLOCK_NODE_OR_INDENTLESS_SEQUENCE");
+
+  /// Expect a flow node.
+  static const FLOW_NODE = const _State("FLOW_NODE");
+
+  /// Expect the first entry of a block sequence.
+  static const BLOCK_SEQUENCE_FIRST_ENTRY =
+      const _State("BLOCK_SEQUENCE_FIRST_ENTRY");
+
+  /// Expect an entry of a block sequence.
+  static const BLOCK_SEQUENCE_ENTRY = const _State("BLOCK_SEQUENCE_ENTRY");
+
+  /// Expect an entry of an indentless sequence.
+  static const INDENTLESS_SEQUENCE_ENTRY =
+      const _State("INDENTLESS_SEQUENCE_ENTRY");
+
+  /// Expect the first key of a block mapping.
+  static const BLOCK_MAPPING_FIRST_KEY =
+      const _State("BLOCK_MAPPING_FIRST_KEY");
+
+  /// Expect a block mapping key.
+  static const BLOCK_MAPPING_KEY = const _State("BLOCK_MAPPING_KEY");
+
+  /// Expect a block mapping value.
+  static const BLOCK_MAPPING_VALUE = const _State("BLOCK_MAPPING_VALUE");
+
+  /// Expect the first entry of a flow sequence.
+  static const FLOW_SEQUENCE_FIRST_ENTRY =
+      const _State("FLOW_SEQUENCE_FIRST_ENTRY");
+
+  /// Expect an entry of a flow sequence.
+  static const FLOW_SEQUENCE_ENTRY = const _State("FLOW_SEQUENCE_ENTRY");
+
+  /// Expect a key of an ordered mapping.
+  static const FLOW_SEQUENCE_ENTRY_MAPPING_KEY =
+      const _State("FLOW_SEQUENCE_ENTRY_MAPPING_KEY");
+
+  /// Expect a value of an ordered mapping.
+  static const FLOW_SEQUENCE_ENTRY_MAPPING_VALUE =
+      const _State("FLOW_SEQUENCE_ENTRY_MAPPING_VALUE");
+
+  /// Expect the and of an ordered mapping entry.
+  static const FLOW_SEQUENCE_ENTRY_MAPPING_END =
+      const _State("FLOW_SEQUENCE_ENTRY_MAPPING_END");
+
+  /// Expect the first key of a flow mapping.
+  static const FLOW_MAPPING_FIRST_KEY = const _State("FLOW_MAPPING_FIRST_KEY");
+
+  /// Expect a key of a flow mapping.
+  static const FLOW_MAPPING_KEY = const _State("FLOW_MAPPING_KEY");
+
+  /// Expect a value of a flow mapping.
+  static const FLOW_MAPPING_VALUE = const _State("FLOW_MAPPING_VALUE");
+
+  /// Expect an empty value of a flow mapping.
+  static const FLOW_MAPPING_EMPTY_VALUE =
+      const _State("FLOW_MAPPING_EMPTY_VALUE");
+
+  /// Expect nothing.
+  static const END = const _State("END");
+
+  final String name;
+
+  const _State(this.name);
+
+  String toString() => name;
+}
diff --git a/mojo/public/dart/third_party/yaml/lib/src/scanner.dart b/mojo/public/dart/third_party/yaml/lib/src/scanner.dart
new file mode 100644
index 0000000..512d72e
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/lib/src/scanner.dart
@@ -0,0 +1,1668 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library yaml.scanner;
+
+import 'package:collection/collection.dart';
+import 'package:string_scanner/string_scanner.dart';
+import 'package:source_span/source_span.dart';
+
+import 'style.dart';
+import 'token.dart';
+import 'utils.dart';
+import 'yaml_exception.dart';
+
+/// A scanner that reads a string of Unicode characters and emits [Token]s.
+///
+/// This is based on the libyaml scanner, available at
+/// https://github.com/yaml/libyaml/blob/master/src/scanner.c. The license for
+/// that is available in ../../libyaml-license.txt.
+class Scanner {
+  static const TAB = 0x9;
+  static const LF = 0xA;
+  static const CR = 0xD;
+  static const SP = 0x20;
+  static const DOLLAR = 0x24;
+  static const LEFT_PAREN = 0x28;
+  static const RIGHT_PAREN = 0x29;
+  static const PLUS = 0x2B;
+  static const COMMA = 0x2C;
+  static const HYPHEN = 0x2D;
+  static const PERIOD = 0x2E;
+  static const QUESTION = 0x3F;
+  static const COLON = 0x3A;
+  static const SEMICOLON = 0x3B;
+  static const EQUALS = 0x3D;
+  static const LEFT_SQUARE = 0x5B;
+  static const RIGHT_SQUARE = 0x5D;
+  static const LEFT_CURLY = 0x7B;
+  static const RIGHT_CURLY = 0x7D;
+  static const HASH = 0x23;
+  static const AMPERSAND = 0x26;
+  static const ASTERISK = 0x2A;
+  static const EXCLAMATION = 0x21;
+  static const VERTICAL_BAR = 0x7C;
+  static const LEFT_ANGLE = 0x3C;
+  static const RIGHT_ANGLE = 0x3E;
+  static const SINGLE_QUOTE = 0x27;
+  static const DOUBLE_QUOTE = 0x22;
+  static const PERCENT = 0x25;
+  static const AT = 0x40;
+  static const GRAVE_ACCENT = 0x60;
+  static const TILDE = 0x7E;
+
+  static const NULL = 0x0;
+  static const BELL = 0x7;
+  static const BACKSPACE = 0x8;
+  static const VERTICAL_TAB = 0xB;
+  static const FORM_FEED = 0xC;
+  static const ESCAPE = 0x1B;
+  static const SLASH = 0x2F;
+  static const BACKSLASH = 0x5C;
+  static const UNDERSCORE = 0x5F;
+  static const NEL = 0x85;
+  static const NBSP = 0xA0;
+  static const LINE_SEPARATOR = 0x2028;
+  static const PARAGRAPH_SEPARATOR = 0x2029;
+  static const BOM = 0xFEFF;
+
+  static const NUMBER_0 = 0x30;
+  static const NUMBER_9 = 0x39;
+
+  static const LETTER_A = 0x61;
+  static const LETTER_B = 0x62;
+  static const LETTER_E = 0x65;
+  static const LETTER_F = 0x66;
+  static const LETTER_N = 0x6E;
+  static const LETTER_R = 0x72;
+  static const LETTER_T = 0x74;
+  static const LETTER_U = 0x75;
+  static const LETTER_V = 0x76;
+  static const LETTER_X = 0x78;
+  static const LETTER_Z = 0x7A;
+
+  static const LETTER_CAP_A = 0x41;
+  static const LETTER_CAP_F = 0x46;
+  static const LETTER_CAP_L = 0x4C;
+  static const LETTER_CAP_N = 0x4E;
+  static const LETTER_CAP_P = 0x50;
+  static const LETTER_CAP_U = 0x55;
+  static const LETTER_CAP_X = 0x58;
+  static const LETTER_CAP_Z = 0x5A;
+
+  /// The underlying [SpanScanner] used to read characters from the source text.
+  ///
+  /// This is also used to track line and column information and to generate
+  /// [SourceSpan]s.
+  final SpanScanner _scanner;
+
+  /// Whether this scanner has produced a [TokenType.STREAM_START] token
+  /// indicating the beginning of the YAML stream.
+  var _streamStartProduced = false;
+
+  /// Whether this scanner has produced a [TokenType.STREAM_END] token
+  /// indicating the end of the YAML stream.
+  var _streamEndProduced = false;
+
+  /// The queue of tokens yet to be emitted.
+  ///
+  /// These are queued up in advance so that [TokenType.KEY] tokens can be
+  /// inserted once the scanner determines that a series of tokens represents a
+  /// mapping key.
+  final _tokens = new QueueList<Token>();
+
+  /// The number of tokens that have been emitted.
+  ///
+  /// This doesn't count tokens in [tokens].
+  var _tokensParsed = 0;
+
+  /// Whether the next token in [_tokens] is ready to be returned.
+  ///
+  /// It might not be ready if there may still be a [TokenType.KEY] inserted
+  /// before it.
+  var _tokenAvailable = false;
+
+  /// The stack of indent levels for the current nested block contexts.
+  ///
+  /// The YAML spec specifies that the initial indentation level is -1 spaces.
+  final _indents = <int>[-1];
+
+  /// Whether a simple key is allowed in this context.
+  ///
+  /// A simple key refers to any mapping key that doesn't have an explicit "?".
+  var _simpleKeyAllowed = true;
+
+  /// The stack of potential simple keys for each level of flow nesting.
+  ///
+  /// Entries in this list may be `null`, indicating that there is no valid
+  /// simple key for the associated level of nesting.
+  /// 
+  /// When a ":" is parsed and there's a simple key available, a [TokenType.KEY]
+  /// token is inserted in [_tokens] before that key's token. This allows the
+  /// parser to tell that the key is intended to be a mapping key.
+  final _simpleKeys = <_SimpleKey>[null];
+
+  /// The current indentation level.
+  int get _indent => _indents.last;
+
+  /// Whether the scanner's currently positioned in a block-level structure (as
+  /// opposed to flow-level).
+  bool get _inBlockContext => _simpleKeys.length == 1;
+
+  /// Whether the current character is a line break or the end of the source.
+  bool get _isBreakOrEnd => _scanner.isDone || _isBreak;
+
+  /// Whether the current character is a line break.
+  bool get _isBreak => _isBreakAt(0);
+
+  /// Whether the current character is whitespace or the end of the source.
+  bool get _isBlankOrEnd => _isBlankOrEndAt(0);
+
+  /// Whether the current character is whitespace.
+  bool get _isBlank => _isBlankAt(0);
+
+  /// Whether the current character is a valid tag name character.
+  ///
+  /// See http://yaml.org/spec/1.2/spec.html#ns-tag-name.
+  bool get _isTagChar {
+    var char = _scanner.peekChar();
+    if (char == null) return false;
+    switch (char) {
+      case HYPHEN:
+      case SEMICOLON:
+      case SLASH:
+      case COLON:
+      case AT:
+      case AMPERSAND:
+      case EQUALS:
+      case PLUS:
+      case DOLLAR:
+      case PERIOD:
+      case TILDE:
+      case QUESTION:
+      case ASTERISK:
+      case SINGLE_QUOTE:
+      case LEFT_PAREN:
+      case RIGHT_PAREN:
+      case PERCENT:
+        return true;
+      default:
+        return (char >= NUMBER_0 && char <= NUMBER_9) ||
+               (char >= LETTER_A && char <= LETTER_Z) ||
+               (char >= LETTER_CAP_A && char <= LETTER_CAP_Z);
+    }
+  }
+
+  /// Whether the current character is a valid anchor name character.
+  ///
+  /// See http://yaml.org/spec/1.2/spec.html#ns-anchor-name.
+  bool get _isAnchorChar {
+    if (!_isNonSpace) return false;
+
+    switch (_scanner.peekChar()) {
+      case COMMA:
+      case LEFT_SQUARE:
+      case RIGHT_SQUARE:
+      case LEFT_CURLY:
+      case RIGHT_CURLY:
+        return false;
+      default:
+        return true;
+    }
+  }
+
+  /// Whether the character at the current position is a decimal digit.
+  bool get _isDigit {
+    var char = _scanner.peekChar();
+    return char != null && (char >= NUMBER_0 && char <= NUMBER_9);
+  }
+
+  /// Whether the character at the current position is a hexidecimal
+  /// digit.
+  bool get _isHex {
+    var char = _scanner.peekChar();
+    if (char == null) return false;
+    return (char >= NUMBER_0 && char <= NUMBER_9) ||
+           (char >= LETTER_A && char <= LETTER_F) ||
+           (char >= LETTER_CAP_A && char <= LETTER_CAP_F);
+  }
+
+  /// Whether the character at the current position is a plain character.
+  ///
+  /// See http://yaml.org/spec/1.2/spec.html#ns-plain-char(c).
+  bool get _isPlainChar => _isPlainCharAt(0);
+
+  /// Whether the character at the current position is a printable character
+  /// other than a line break or byte-order mark.
+  ///
+  /// See http://yaml.org/spec/1.2/spec.html#nb-char.
+  bool get _isNonBreak {
+    var char = _scanner.peekChar();
+    if (char == null) return false;
+    switch (char) {
+      case LF:
+      case CR:
+      case BOM:
+        return false;
+      case TAB:
+      case NEL:
+        return true;
+      default:
+        return (char >= 0x00020 && char <= 0x00007E) ||
+               (char >= 0x000A0 && char <= 0x00D7FF) ||
+               (char >= 0x0E000 && char <= 0x00FFFD) ||
+               (char >= 0x10000 && char <= 0x10FFFF);
+    }
+  }
+
+  /// Whether the character at the current position is a printable character
+  /// other than whitespace.
+  ///
+  /// See http://yaml.org/spec/1.2/spec.html#nb-char.
+  bool get _isNonSpace {
+    var char = _scanner.peekChar();
+    if (char == null) return false;
+    switch (char) {
+      case LF:
+      case CR:
+      case BOM:
+      case SP:
+        return false;
+      case NEL:
+        return true;
+      default:
+        return (char >= 0x00020 && char <= 0x00007E) ||
+               (char >= 0x000A0 && char <= 0x00D7FF) ||
+               (char >= 0x0E000 && char <= 0x00FFFD) ||
+               (char >= 0x10000 && char <= 0x10FFFF);
+    }
+  }
+
+  /// Returns Whether or not the current character begins a documentation
+  /// indicator.
+  ///
+  /// If so, this sets the scanner's last match to that indicator.
+  bool get _isDocumentIndicator {
+    return _scanner.column == 0 && _isBlankOrEndAt(3) &&
+        (_scanner.matches('---') || _scanner.matches('...'));
+  }
+
+  /// Creates a scanner that scans [source].
+  ///
+  /// [sourceUrl] can be a String or a [Uri].
+  Scanner(String source, {sourceUrl})
+      : _scanner = new SpanScanner(source, sourceUrl: sourceUrl);
+
+  /// Consumes and returns the next token.
+  Token scan() {
+    if (_streamEndProduced) throw new StateError("Out of tokens.");
+    if (!_tokenAvailable) _fetchMoreTokens();
+
+    var token = _tokens.removeFirst();
+    _tokenAvailable = false;
+    _tokensParsed++;
+    _streamEndProduced = token is Token &&
+        token.type == TokenType.STREAM_END;
+    return token;
+  }
+
+  /// Consumes the next token and returns the one after that.
+  Token advance() {
+    scan();
+    return peek();
+  }
+
+  /// Returns the next token without consuming it.
+  Token peek() {
+    if (_streamEndProduced) return null;
+    if (!_tokenAvailable) _fetchMoreTokens();
+    return _tokens.first;
+  }
+
+  /// Ensures that [_tokens] contains at least one token which can be returned.
+  void _fetchMoreTokens() {
+    while (true) {
+      if (_tokens.isNotEmpty) {
+        _staleSimpleKeys();
+
+        // If the current token could be a simple key, we need to scan more
+        // tokens until we determine whether it is or not. Otherwise we might
+        // not emit the `KEY` token before we emit the value of the key.
+        if (!_simpleKeys.any((key) =>
+            key != null && key.tokenNumber == _tokensParsed)) {
+          break;
+        }
+      }
+
+      _fetchNextToken();
+    }
+    _tokenAvailable = true;
+  }
+
+  /// The dispatcher for token fetchers.
+  void _fetchNextToken() {
+    if (!_streamStartProduced) {
+      _fetchStreamStart();
+      return;
+    }
+
+    _scanToNextToken();
+    _staleSimpleKeys();
+    _unrollIndent(_scanner.column);
+
+    if (_scanner.isDone) {
+      _fetchStreamEnd();
+      return;
+    }
+
+    if (_scanner.column == 0) {
+      if (_scanner.peekChar() == PERCENT) {
+        _fetchDirective();
+        return;
+      }
+
+      if (_isBlankOrEndAt(3)) {
+        if (_scanner.matches('---')) {
+          _fetchDocumentIndicator(TokenType.DOCUMENT_START);
+          return;
+        }
+
+        if (_scanner.matches('...')) {
+          _fetchDocumentIndicator(TokenType.DOCUMENT_END);
+          return;
+        }
+      }
+    }
+
+    switch (_scanner.peekChar()) {
+      case LEFT_SQUARE:
+        _fetchFlowCollectionStart(TokenType.FLOW_SEQUENCE_START);
+        return;
+      case LEFT_CURLY:
+        _fetchFlowCollectionStart(TokenType.FLOW_MAPPING_START);
+        return;
+      case RIGHT_SQUARE:
+        _fetchFlowCollectionEnd(TokenType.FLOW_SEQUENCE_END);
+        return;
+      case RIGHT_CURLY:
+        _fetchFlowCollectionEnd(TokenType.FLOW_MAPPING_END);
+        return;
+      case COMMA:
+        _fetchFlowEntry();
+        return;
+      case ASTERISK:
+        _fetchAnchor(anchor: false);
+        return;
+      case AMPERSAND:
+        _fetchAnchor(anchor: true);
+        return;
+      case EXCLAMATION:
+        _fetchTag();
+        return;
+      case SINGLE_QUOTE:
+        _fetchFlowScalar(singleQuote: true);
+        return;
+      case DOUBLE_QUOTE:
+        _fetchFlowScalar(singleQuote: false);
+        return;
+      case VERTICAL_BAR:
+        if (!_inBlockContext) _invalidScalarCharacter();
+        _fetchBlockScalar(literal: true);
+        return;
+      case RIGHT_ANGLE:
+        if (!_inBlockContext) _invalidScalarCharacter();
+        _fetchBlockScalar(literal: false);
+        return;
+      case PERCENT:
+      case AT:
+      case GRAVE_ACCENT:
+        _invalidScalarCharacter();
+        return;
+
+      // These characters may sometimes begin plain scalars.
+      case HYPHEN:
+        if (_isPlainCharAt(1)) {
+          _fetchPlainScalar();
+        } else {
+          _fetchBlockEntry();
+        }
+        return;
+      case QUESTION:
+        if (_isPlainCharAt(1)) {
+          _fetchPlainScalar();
+        } else {
+          _fetchKey();
+        }
+        return;
+      case COLON:
+        if (!_inBlockContext && _tokens.isNotEmpty) {
+          // If a colon follows a "JSON-like" value (an explicit map or list, or
+          // a quoted string) it isn't required to have whitespace after it
+          // since it unambiguously describes a map.
+          var token = _tokens.last;
+          if (token.type == TokenType.FLOW_SEQUENCE_END ||
+              token.type == TokenType.FLOW_MAPPING_END ||
+              (token.type == TokenType.SCALAR && token.style.isQuoted)) {
+            _fetchValue();
+            return;
+          }
+        }
+
+        if (_isPlainCharAt(1)) {
+          _fetchPlainScalar();
+        } else {
+          _fetchValue();
+        }
+        return;
+      default:
+        if (!_isNonBreak) _invalidScalarCharacter();
+
+        _fetchPlainScalar();
+        return;
+    }
+
+    throw 'Inaccessible';
+  }
+
+  /// Throws an error about a disallowed character.
+  void _invalidScalarCharacter() =>
+      _scanner.error("Unexpected character.", length: 1);
+
+  /// Checks the list of potential simple keys and remove the positions that
+  /// cannot contain simple keys anymore.
+  void _staleSimpleKeys() {
+    for (var i = 0; i < _simpleKeys.length; i++) {
+      var key = _simpleKeys[i];
+      if (key == null) continue;
+
+      // libyaml requires that all simple keys be a single line and no longer
+      // than 1024 characters. However, in section 7.4.2 of the spec
+      // (http://yaml.org/spec/1.2/spec.html#id2790832), these restrictions are
+      // only applied when the curly braces are omitted. It's difficult to
+      // retain enough context to know which keys need to have the restriction
+      // placed on them, so for now we go the other direction and allow
+      // everything but multiline simple keys in a block context.
+      if (!_inBlockContext) continue;
+
+      if (key.location.line == _scanner.line) continue;
+
+      if (key.required) {
+        throw new YamlException("Expected ':'.", _scanner.emptySpan);
+      }
+
+      _simpleKeys[i] = null;
+    }
+  }
+
+  /// Checks if a simple key may start at the current position and saves it if
+  /// so.
+  void _saveSimpleKey() {
+    // A simple key is required at the current position if the scanner is in the
+    // block context and the current column coincides with the indentation
+    // level.
+    var required = _inBlockContext && _indent == _scanner.column;
+
+    // A simple key is required only when it is the first token in the current
+    // line. Therefore it is always allowed. But we add a check anyway.
+    assert(_simpleKeyAllowed || !required);
+
+    if (!_simpleKeyAllowed) return;
+
+    // If the current position may start a simple key, save it.
+    _removeSimpleKey();
+    _simpleKeys[_simpleKeys.length - 1] = new _SimpleKey(
+        _tokensParsed + _tokens.length,
+        _scanner.location,
+        required: required);
+  }
+
+  /// Removes a potential simple key at the current flow level.
+  void _removeSimpleKey() {
+    var key = _simpleKeys.last;
+    if (key != null && key.required) {
+      throw new YamlException("Could not find expected ':' for simple key.",
+          key.location.pointSpan());
+    }
+
+    _simpleKeys[_simpleKeys.length - 1] = null;
+  }
+
+  /// Increases the flow level and resizes the simple key list.
+  void _increaseFlowLevel() {
+    _simpleKeys.add(null);
+  }
+
+  /// Decreases the flow level.
+  void _decreaseFlowLevel() {
+    if (_inBlockContext) return;
+    _simpleKeys.removeLast();
+  }
+
+  /// Pushes the current indentation level to the stack and sets the new level
+  /// if [column] is greater than [_indent].
+  ///
+  /// If it is, appends or inserts the specified token into [_tokens]. If
+  /// [tokenNumber] is provided, the corresponding token will be replaced;
+  /// otherwise, the token will be added at the end.
+  void _rollIndent(int column, TokenType type, SourceLocation location,
+      {int tokenNumber}) {
+    if (!_inBlockContext) return;
+    if (_indent != -1 && _indent >= column) return;
+
+    // Push the current indentation level to the stack and set the new
+    // indentation level.
+    _indents.add(column);
+
+    // Create a token and insert it into the queue.
+    var token = new Token(type, location.pointSpan());
+    if (tokenNumber == null) {
+      _tokens.add(token);
+    } else {
+      _tokens.insert(tokenNumber - _tokensParsed, token);
+    }
+  }
+
+  /// Pops indentation levels from [_indents] until the current level becomes
+  /// less than or equal to [column].
+  ///
+  /// For each indentation level, appends a [TokenType.BLOCK_END] token.
+  void _unrollIndent(int column) {
+    if (!_inBlockContext) return;
+
+    while (_indent > column) {
+      _tokens.add(new Token(TokenType.BLOCK_END, _scanner.emptySpan));
+      _indents.removeLast();
+    }
+  }
+
+  /// Pops indentation levels from [_indents] until the current level resets to
+  /// -1.
+  ///
+  /// For each indentation level, appends a [TokenType.BLOCK_END] token.
+  void _resetIndent() => _unrollIndent(-1);
+
+  /// Produces a [TokenType.STREAM_START] token.
+  void _fetchStreamStart() {
+    // Much of libyaml's initialization logic here is done in variable
+    // initializers instead.
+    _streamStartProduced = true;
+    _tokens.add(new Token(TokenType.STREAM_START, _scanner.emptySpan));
+  }
+
+  /// Produces a [TokenType.STREAM_END] token.
+  void _fetchStreamEnd() {
+    _resetIndent();
+    _removeSimpleKey();
+    _simpleKeyAllowed = false;
+    _tokens.add(new Token(TokenType.STREAM_END, _scanner.emptySpan));
+  }
+
+  /// Produces a [TokenType.VERSION_DIRECTIVE] or [TokenType.TAG_DIRECTIVE]
+  /// token.
+  void _fetchDirective() {
+    _resetIndent();
+    _removeSimpleKey();
+    _simpleKeyAllowed = false;
+    var directive = _scanDirective();
+    if (directive != null) _tokens.add(directive);
+  }
+
+  /// Produces a [TokenType.DOCUMENT_START] or [TokenType.DOCUMENT_END] token.
+  void _fetchDocumentIndicator(TokenType type) {
+    _resetIndent();
+    _removeSimpleKey();
+    _simpleKeyAllowed = false;
+
+    // Consume the indicator token.
+    var start = _scanner.state;
+    _scanner.readChar();
+    _scanner.readChar();
+    _scanner.readChar();
+
+    _tokens.add(new Token(type, _scanner.spanFrom(start)));
+  }
+
+  /// Produces a [TokenType.FLOW_SEQUENCE_START] or
+  /// [TokenType.FLOW_MAPPING_START] token.
+  void _fetchFlowCollectionStart(TokenType type) {
+    _saveSimpleKey();
+    _increaseFlowLevel();
+    _simpleKeyAllowed = true;
+    _addCharToken(type);
+  }
+
+  /// Produces a [TokenType.FLOW_SEQUENCE_END] or [TokenType.FLOW_MAPPING_END]
+  /// token.
+  void _fetchFlowCollectionEnd(TokenType type) {
+    _removeSimpleKey();
+    _decreaseFlowLevel();
+    _simpleKeyAllowed = false;
+    _addCharToken(type);
+  }
+
+  /// Produces a [TokenType.FLOW_ENTRY] token.
+  void _fetchFlowEntry() {
+    _removeSimpleKey();
+    _simpleKeyAllowed = true;
+    _addCharToken(TokenType.FLOW_ENTRY);
+  }
+
+  /// Produces a [TokenType.BLOCK_ENTRY] token.
+  void _fetchBlockEntry() {
+    if (_inBlockContext) {
+      if (!_simpleKeyAllowed) {
+        throw new YamlException(
+            "Block sequence entries are not allowed here.",
+            _scanner.emptySpan);
+      }
+
+      _rollIndent(
+          _scanner.column,
+          TokenType.BLOCK_SEQUENCE_START,
+          _scanner.emptySpan.start);
+    } else {
+      // It is an error for the '-' indicator to occur in the flow context, but
+      // we let the Parser detect and report it because it's able to point to
+      // the context.
+    }
+
+    _removeSimpleKey();
+    _simpleKeyAllowed = true;
+    _addCharToken(TokenType.BLOCK_ENTRY);
+  }
+
+  /// Produces the [TokenType.KEY] token.
+  void _fetchKey() {
+    if (_inBlockContext) {
+      if (!_simpleKeyAllowed) {
+        throw new YamlException("Mapping keys are not allowed here.",
+            _scanner.emptySpan);
+      }
+
+      _rollIndent(
+          _scanner.column,
+          TokenType.BLOCK_MAPPING_START,
+          _scanner.emptySpan.start);
+    }
+
+    // Simple keys are allowed after `?` in a block context.
+    _simpleKeyAllowed = _inBlockContext;
+    _addCharToken(TokenType.KEY);
+  }
+
+  /// Produces the [TokenType.VALUE] token.
+  void _fetchValue() {
+    var simpleKey = _simpleKeys.last;
+    if (simpleKey != null) {
+      // Add a [TokenType.KEY] directive before the first token of the simple
+      // key so the parser knows that it's part of a key/value pair.
+      _tokens.insert(simpleKey.tokenNumber - _tokensParsed,
+          new Token(TokenType.KEY, simpleKey.location.pointSpan()));
+
+      // In the block context, we may need to add the
+      // [TokenType.BLOCK_MAPPING_START] token.
+      _rollIndent(
+          simpleKey.location.column,
+          TokenType.BLOCK_MAPPING_START,
+          simpleKey.location,
+          tokenNumber: simpleKey.tokenNumber);
+
+      // Remove the simple key.
+      _simpleKeys[_simpleKeys.length - 1] = null;
+
+      // A simple key cannot follow another simple key.
+      _simpleKeyAllowed = false;
+    } else if (_inBlockContext) {
+      if (!_simpleKeyAllowed) {
+        throw new YamlException(
+            "Mapping values are not allowed here. Did you miss a colon "
+                "earlier?",
+            _scanner.emptySpan);
+      }
+
+      // If we're here, we've found the ':' indicator following a complex key.
+
+      _rollIndent(
+          _scanner.column,
+          TokenType.BLOCK_MAPPING_START,
+          _scanner.location);
+      _simpleKeyAllowed = true;
+    } else if (_simpleKeyAllowed) {
+      // If we're here, we've found the ':' indicator with an empty key. This
+      // behavior differs from libyaml, which disallows empty implicit keys.
+      _simpleKeyAllowed = false;
+      _addCharToken(TokenType.KEY);
+    }
+
+    _addCharToken(TokenType.VALUE);
+  }
+
+  /// Adds a token with [type] to [_tokens].
+  ///
+  /// The span of the new token is the current character.
+  void _addCharToken(TokenType type) {
+    var start = _scanner.state;
+    _scanner.readChar();
+    _tokens.add(new Token(type, _scanner.spanFrom(start)));
+  }
+
+  /// Produces a [TokenType.ALIAS] or [TokenType.ANCHOR] token.
+  void _fetchAnchor({bool anchor: true}) {
+    _saveSimpleKey();
+    _simpleKeyAllowed = false;
+    _tokens.add(_scanAnchor(anchor: anchor));
+  }
+
+  /// Produces a [TokenType.TAG] token.
+  void _fetchTag() {
+    _saveSimpleKey();
+    _simpleKeyAllowed = false;
+    _tokens.add(_scanTag());
+  }
+
+  /// Produces a [TokenType.SCALAR] token with style [ScalarStyle.LITERAL] or
+  /// [ScalarStyle.FOLDED].
+  void _fetchBlockScalar({bool literal: false}) {
+    _removeSimpleKey();
+    _simpleKeyAllowed = true;
+    _tokens.add(_scanBlockScalar(literal: literal));
+  }
+
+  /// Produces a [TokenType.SCALAR] token with style [ScalarStyle.SINGLE_QUOTED]
+  /// or [ScalarStyle.DOUBLE_QUOTED].
+  void _fetchFlowScalar({bool singleQuote: false}) {
+    _saveSimpleKey();
+    _simpleKeyAllowed = false;
+    _tokens.add(_scanFlowScalar(singleQuote: singleQuote));
+  }
+
+  /// Produces a [TokenType.SCALAR] token with style [ScalarStyle.PLAIN].
+  void _fetchPlainScalar() {
+    _saveSimpleKey();
+    _simpleKeyAllowed = false;
+    _tokens.add(_scanPlainScalar());
+  }
+
+  /// Eats whitespace and comments until the next token is found.
+  void _scanToNextToken() {
+    var afterLineBreak = false;
+    while (true) {
+      // Allow the BOM to start a line.
+      if (_scanner.column == 0) _scanner.scan("\uFEFF");
+
+      // Eat whitespace.
+      //
+      // libyaml disallows tabs after "-", "?", or ":", but the spec allows
+      // them. See section 6.2: http://yaml.org/spec/1.2/spec.html#id2778241.
+      while (_scanner.peekChar() == SP ||
+             ((!_inBlockContext || !afterLineBreak) &&
+              _scanner.peekChar() == TAB)) {
+        _scanner.readChar();
+      }
+
+      if (_scanner.peekChar() == TAB) {
+        _scanner.error("Tab characters are not allowed as indentation.",
+            length: 1);
+      }
+
+      // Eat a comment until a line break.
+      _skipComment();
+
+      // If we're at a line break, eat it.
+      if (_isBreak) {
+        _skipLine();
+
+        // In the block context, a new line may start a simple key.
+        if (_inBlockContext) _simpleKeyAllowed = true;
+        afterLineBreak = true;
+      } else {
+        // Otherwise we've found a token.
+        break;
+      }
+    }
+  }
+
+  /// Scans a [TokenType.YAML_DIRECTIVE] or [TokenType.TAG_DIRECTIVE] token.
+  ///
+  ///     %YAML    1.2    # a comment \n
+  ///     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+  ///     %TAG    !yaml!  tag:yaml.org,2002:  \n
+  ///     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
+  Token _scanDirective() {
+    var start = _scanner.state;
+
+    // Eat '%'.
+    _scanner.readChar();
+
+    var token;
+    var name = _scanDirectiveName();
+    if (name == "YAML") {
+      token = _scanVersionDirectiveValue(start);
+    } else if (name == "TAG") {
+      token = _scanTagDirectiveValue(start);
+    } else {
+      warn("Warning: unknown directive.", _scanner.spanFrom(start));
+
+      // libyaml doesn't support unknown directives, but the spec says to ignore
+      // them and warn: http://yaml.org/spec/1.2/spec.html#id2781147.
+      while (!_isBreakOrEnd) {
+        _scanner.readChar();
+      }
+
+      return null;
+    }
+
+    // Eat the rest of the line, including any comments.
+    _skipBlanks();
+    _skipComment();
+
+    if (!_isBreakOrEnd) {
+      throw new YamlException(
+          "Expected comment or line break after directive.",
+          _scanner.spanFrom(start));
+    }
+
+    _skipLine();
+    return token;
+  }
+
+  /// Scans a directive name.
+  ///
+  ///      %YAML   1.2     # a comment \n
+  ///       ^^^^
+  ///      %TAG    !yaml!  tag:yaml.org,2002:  \n
+  ///       ^^^
+  String _scanDirectiveName() {
+    // libyaml only allows word characters in directive names, but the spec
+    // disagrees: http://yaml.org/spec/1.2/spec.html#ns-directive-name.
+    var start = _scanner.position;
+    while (_isNonSpace) {
+      _scanner.readChar();
+    }
+
+    var name = _scanner.substring(start);
+    if (name.isEmpty) {
+      throw new YamlException("Expected directive name.", _scanner.emptySpan);
+    } else if (!_isBlankOrEnd) {
+      throw new YamlException(
+          "Unexpected character in directive name.", _scanner.emptySpan);
+    }
+
+    return name;
+  }
+
+  /// Scans the value of a version directive.
+  ///
+  ///      %YAML   1.2     # a comment \n
+  ///           ^^^^^^
+  Token _scanVersionDirectiveValue(LineScannerState start) {
+    _skipBlanks();
+
+    var major = _scanVersionDirectiveNumber();
+    _scanner.expect('.');
+    var minor = _scanVersionDirectiveNumber();
+
+    return new VersionDirectiveToken(_scanner.spanFrom(start), major, minor);
+  }
+
+  /// Scans the version number of a version directive.
+  ///
+  ///      %YAML   1.2     # a comment \n
+  ///              ^
+  ///      %YAML   1.2     # a comment \n
+  ///                ^
+  int _scanVersionDirectiveNumber() {
+    var start = _scanner.position;
+    while (_isDigit) {
+      _scanner.readChar();
+    }
+
+    var number = _scanner.substring(start);
+    if (number.isEmpty) {
+      throw new YamlException("Expected version number.", _scanner.emptySpan);
+    }
+
+    return int.parse(number);
+  }
+
+  /// Scans the value of a tag directive.
+  ///
+  ///      %TAG    !yaml!  tag:yaml.org,2002:  \n
+  ///          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+  Token _scanTagDirectiveValue(LineScannerState start) {
+    _skipBlanks();
+
+    var handle = _scanTagHandle(directive: true);
+    if (!_isBlank) {
+      throw new YamlException("Expected whitespace.", _scanner.emptySpan);
+    }
+
+    _skipBlanks();
+
+    var prefix = _scanTagUri();
+    if (!_isBlankOrEnd) {
+      throw new YamlException("Expected whitespace.", _scanner.emptySpan);
+    }
+
+    return new TagDirectiveToken(_scanner.spanFrom(start), handle, prefix);
+  }
+
+  /// Scans a [TokenType.ANCHOR] token.
+  Token _scanAnchor({bool anchor: true}) {
+    var start = _scanner.state;
+
+    // Eat the indicator character.
+    _scanner.readChar();
+
+    // libyaml only allows word characters in anchor names, but the spec
+    // disagrees: http://yaml.org/spec/1.2/spec.html#ns-anchor-char.
+    var startPosition = _scanner.position;
+    while (_isAnchorChar) {
+      _scanner.readChar();
+    }
+    var name = _scanner.substring(startPosition);
+
+    var next = _scanner.peekChar();
+    if (name.isEmpty ||
+        (!_isBlankOrEnd  && next != QUESTION     && next != COLON &&
+         next != COMMA   && next != RIGHT_SQUARE && next != RIGHT_CURLY &&
+         next != PERCENT && next != AT           && next != GRAVE_ACCENT)) {
+      throw new YamlException("Expected alphanumeric character.",
+          _scanner.emptySpan);
+    }
+
+    if (anchor) {
+      return new AnchorToken(_scanner.spanFrom(start), name);
+    } else {
+      return new AliasToken(_scanner.spanFrom(start), name);
+    }
+  }
+
+  /// Scans a [TokenType.TAG] token.
+  Token _scanTag() {
+    var handle;
+    var suffix;
+    var start = _scanner.state;
+
+    // Check if the tag is in the canonical form.
+    if (_scanner.peekChar(1) == LEFT_ANGLE) {
+      // Eat '!<'.
+      _scanner.readChar();
+      _scanner.readChar();
+
+      handle = '';
+      suffix = _scanTagUri();
+
+      _scanner.expect('>');
+    } else {
+      // The tag has either the '!suffix' or the '!handle!suffix' form.
+
+      // First, try to scan a handle.
+      handle = _scanTagHandle();
+
+      if (handle.length > 1 && handle.startsWith('!') && handle.endsWith('!')) {
+        suffix = _scanTagUri(flowSeparators: false);
+      } else {
+        suffix = _scanTagUri(head: handle, flowSeparators: false);
+
+        // There was no explicit handle.
+        if (suffix.isEmpty) {
+          // This is the special '!' tag.
+          handle = null;
+          suffix = '!';
+        } else {
+          handle = '!';
+        }
+      }
+    }
+
+    // libyaml insists on whitespace after a tag, but example 7.2 indicates
+    // that it's not required: http://yaml.org/spec/1.2/spec.html#id2786720.
+
+    return new TagToken(_scanner.spanFrom(start), handle, suffix);
+  }
+
+  /// Scans a tag handle.
+  String _scanTagHandle({bool directive: false}) {
+    _scanner.expect('!');
+
+    var buffer = new StringBuffer('!');
+
+    // libyaml only allows word characters in tags, but the spec disagrees:
+    // http://yaml.org/spec/1.2/spec.html#ns-tag-char.
+    var start = _scanner.position;
+    while (_isTagChar) {
+      _scanner.readChar();
+    }
+    buffer.write(_scanner.substring(start));
+
+    if (_scanner.peekChar() == EXCLAMATION) {
+      buffer.writeCharCode(_scanner.readChar());
+    } else {
+      // It's either the '!' tag or not really a tag handle. If it's a %TAG
+      // directive, it's an error. If it's a tag token, it must be part of a
+      // URI.
+      if (directive && buffer.toString() != '!') _scanner.expect('!');
+    }
+
+    return buffer.toString();
+  }
+
+  /// Scans a tag URI.
+  ///
+  /// [head] is the initial portion of the tag that's already been scanned.
+  /// [flowSeparators] indicates whether the tag URI can contain flow
+  /// separators.
+  String _scanTagUri({String head, bool flowSeparators: true}) {
+    var length = head == null ? 0 : head.length;
+    var buffer = new StringBuffer();
+
+    // Copy the head if needed.
+    //
+    // Note that we don't copy the leading '!' character.
+    if (length > 1) buffer.write(head.substring(1));
+
+    // The set of characters that may appear in URI is as follows:
+    //
+    //      '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&',
+    //      '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']',
+    //      '%'.
+    //
+    // In a shorthand tag annotation, the flow separators ',', '[', and ']' are
+    // disallowed.
+    var start = _scanner.position;
+    var char = _scanner.peekChar();
+    while (_isTagChar || (flowSeparators &&
+            (char == COMMA || char == LEFT_SQUARE || char == RIGHT_SQUARE))) {
+      _scanner.readChar();
+      char = _scanner.peekChar();
+    }
+
+    // libyaml manually decodes the URL, but we don't have to do that.
+    return Uri.decodeFull(_scanner.substring(start));
+  }
+
+  /// Scans a block scalar.
+  Token _scanBlockScalar({bool literal: false}) {
+    var start = _scanner.state;
+
+    // Eat the indicator '|' or '>'.
+    _scanner.readChar();
+
+    // Check for a chomping indicator.
+    var chomping = _Chomping.CLIP;
+    var increment = 0;
+    var char = _scanner.peekChar();
+    if (char == PLUS || char == HYPHEN) {
+      chomping = char == PLUS ? _Chomping.KEEP : _Chomping.STRIP;
+      _scanner.readChar();
+
+      // Check for an indentation indicator.
+      if (_isDigit) {
+        // Check that the indentation is greater than 0.
+        if (_scanner.peekChar() == NUMBER_0) {
+          throw new YamlException(
+              "0 may not be used as an indentation indicator.",
+              _scanner.spanFrom(start));
+        }
+
+        increment = _scanner.readChar() - NUMBER_0;
+      }
+    } else if (_isDigit) {
+      // Do the same as above, but in the opposite order.
+      if (_scanner.peekChar() == NUMBER_0) {
+        throw new YamlException(
+            "0 may not be used as an indentation indicator.",
+            _scanner.spanFrom(start));
+      }
+
+      increment = _scanner.readChar() - NUMBER_0;
+
+      char = _scanner.peekChar();
+      if (char == PLUS || char == HYPHEN) {
+        chomping = char == PLUS ? _Chomping.KEEP : _Chomping.STRIP;
+        _scanner.readChar();
+      }
+    }
+
+    // Eat whitespace and comments to the end of the line.
+    _skipBlanks();
+    _skipComment();
+
+    // Check if we're at the end of the line.
+    if (!_isBreakOrEnd) {
+      throw new YamlException("Expected comment or line break.",
+          _scanner.emptySpan);
+    }
+
+    _skipLine();
+
+    // If the block scalar has an explicit indentation indicator, add that to
+    // the current indentation to get the indentation level for the scalar's
+    // contents.
+    var indent = 0;
+    if (increment != 0) {
+      indent = _indent >= 0 ? _indent + increment : increment;
+    }
+
+    // Scan the leading line breaks to determine the indentation level if
+    // needed.
+    var pair = _scanBlockScalarBreaks(indent);
+    indent = pair.first;
+    var trailingBreaks = pair.last;
+
+    // Scan the block scalar contents.
+    var buffer = new StringBuffer();
+    var leadingBreak = '';
+    var leadingBlank = false;
+    var trailingBlank = false;
+    var end = _scanner.state;
+    while (_scanner.column == indent && !_scanner.isDone) {
+      // Check for a document indicator. libyaml doesn't do this, but the spec
+      // mandates it. See example 9.5:
+      // http://yaml.org/spec/1.2/spec.html#id2801606.
+      if (_isDocumentIndicator) break;
+
+      // We are at the beginning of a non-empty line.
+
+      // Is there trailing whitespace?
+      trailingBlank = _isBlank;
+
+      // Check if we need to fold the leading line break.
+      if (!literal && leadingBreak.isNotEmpty && !leadingBlank &&
+          !trailingBlank) {
+        // Do we need to join the lines with a space?
+        if (trailingBreaks.isEmpty) buffer.writeCharCode(SP);
+      } else {
+        buffer.write(leadingBreak);
+      }
+      leadingBreak = '';
+
+      // Append the remaining line breaks.
+      buffer.write(trailingBreaks);
+
+      // Is there leading whitespace?
+      leadingBlank = _isBlank;
+
+      var startPosition = _scanner.position;
+      while (!_isBreakOrEnd) {
+        _scanner.readChar();
+      }
+      buffer.write(_scanner.substring(startPosition));
+      end = _scanner.state;
+
+      // libyaml always reads a line here, but this breaks on block scalars at
+      // the end of the document that end without newlines. See example 8.1:
+      // http://yaml.org/spec/1.2/spec.html#id2793888.
+      if (!_scanner.isDone) leadingBreak = _readLine();
+
+      // Eat the following indentation and spaces.
+      var pair = _scanBlockScalarBreaks(indent);
+      indent = pair.first;
+      trailingBreaks = pair.last;
+    }
+
+    // Chomp the tail.
+    if (chomping != _Chomping.STRIP) buffer.write(leadingBreak);
+    if (chomping == _Chomping.KEEP) buffer.write(trailingBreaks);
+
+    return new ScalarToken(_scanner.spanFrom(start, end), buffer.toString(),
+        literal ? ScalarStyle.LITERAL : ScalarStyle.FOLDED);
+  }
+
+  /// Scans indentation spaces and line breaks for a block scalar.
+  ///
+  /// Determines the intendation level if needed. Returns the new indentation
+  /// level and the text of the line breaks.
+  Pair<int, String> _scanBlockScalarBreaks(int indent) {
+    var maxIndent = 0;
+    var breaks = new StringBuffer();
+
+    while (true) {
+      while ((indent == 0 || _scanner.column < indent) &&
+          _scanner.peekChar() == SP) {
+        _scanner.readChar();
+      }
+
+      if (_scanner.column > maxIndent) maxIndent = _scanner.column;
+
+      // libyaml throws an error here if a tab character is detected, but the
+      // spec treats tabs like any other non-space character. See example 8.2:
+      // http://yaml.org/spec/1.2/spec.html#id2794311.
+
+      if (!_isBreak) break;
+      breaks.write(_readLine());
+    }
+
+    if (indent == 0) {
+      indent = maxIndent;
+      if (indent < _indent + 1) indent = _indent + 1;
+
+      // libyaml forces indent to be at least 1 here, but that doesn't seem to
+      // be supported by the spec.
+    }
+
+    return new Pair(indent, breaks.toString());
+  }
+
+  // Scans a quoted scalar.
+  Token _scanFlowScalar({bool singleQuote: false}) {
+    var start = _scanner.state;
+    var buffer = new StringBuffer();
+
+    // Eat the left quote.
+    _scanner.readChar();
+
+    while (true) {
+      // Check that there are no document indicators at the beginning of the
+      // line.
+      if (_isDocumentIndicator) {
+        _scanner.error("Unexpected document indicator.");
+      }
+
+      if (_scanner.isDone) {
+        throw new YamlException("Unexpected end of file.", _scanner.emptySpan);
+      }
+
+      var leadingBlanks = false;
+      while (!_isBlankOrEnd) {
+        var char = _scanner.peekChar();
+        if (singleQuote && char == SINGLE_QUOTE &&
+            _scanner.peekChar(1) == SINGLE_QUOTE) {
+          // An escaped single quote.
+          _scanner.readChar();
+          _scanner.readChar();
+          buffer.writeCharCode(SINGLE_QUOTE);
+        } else if (char == (singleQuote ? SINGLE_QUOTE : DOUBLE_QUOTE)) {
+          // The closing quote.
+          break;
+        } else if (!singleQuote && char == BACKSLASH && _isBreakAt(1)) {
+          // An escaped newline.
+          _scanner.readChar();
+          _skipLine();
+          leadingBlanks = true;
+          break;
+        } else if (!singleQuote && char == BACKSLASH) {
+          var escapeStart = _scanner.state;
+
+          // An escape sequence.
+          var codeLength = null;
+          switch (_scanner.peekChar(1)) {
+            case NUMBER_0:
+              buffer.writeCharCode(NULL);
+              break;
+            case LETTER_A:
+              buffer.writeCharCode(BELL);
+              break;
+            case LETTER_B:
+              buffer.writeCharCode(BACKSPACE);
+              break;
+            case LETTER_T:
+            case TAB:
+              buffer.writeCharCode(TAB);
+              break;
+            case LETTER_N:
+              buffer.writeCharCode(LF);
+              break;
+            case LETTER_V:
+              buffer.writeCharCode(VERTICAL_TAB);
+              break;
+            case LETTER_F:
+              buffer.writeCharCode(FORM_FEED);
+              break;
+            case LETTER_R:
+              buffer.writeCharCode(CR);
+              break;
+            case LETTER_E:
+              buffer.writeCharCode(ESCAPE);
+              break;
+            case SP:
+            case DOUBLE_QUOTE:
+            case SLASH:
+            case BACKSLASH:
+              // libyaml doesn't support an escaped forward slash, but it was
+              // added in YAML 1.2. See section 5.7:
+              // http://yaml.org/spec/1.2/spec.html#id2776092
+              buffer.writeCharCode(_scanner.peekChar(1));
+              break;
+            case LETTER_CAP_N:
+              buffer.writeCharCode(NEL);
+              break;
+            case UNDERSCORE:
+              buffer.writeCharCode(NBSP);
+              break;
+            case LETTER_CAP_L:
+              buffer.writeCharCode(LINE_SEPARATOR);
+              break;
+            case LETTER_CAP_P:
+              buffer.writeCharCode(PARAGRAPH_SEPARATOR);
+              break;
+            case LETTER_X:
+              codeLength = 2;
+              break;
+            case LETTER_U:
+              codeLength = 4;
+              break;
+            case LETTER_CAP_U:
+              codeLength = 8;
+              break;
+            default:
+              throw new YamlException("Unknown escape character.",
+                  _scanner.spanFrom(escapeStart));
+          }
+
+          _scanner.readChar();
+          _scanner.readChar();
+
+          if (codeLength != null) {
+            var value = 0;
+            for (var i = 0; i < codeLength; i++) {
+              if (!_isHex) {
+                _scanner.readChar();
+                throw new YamlException(
+                    "Expected $codeLength-digit hexidecimal number.",
+                    _scanner.spanFrom(escapeStart));
+              }
+
+              value = (value << 4) + _asHex(_scanner.readChar());
+            }
+
+            // Check the value and write the character.
+            if ((value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF) {
+              throw new YamlException(
+                  "Invalid Unicode character escape code.",
+                  _scanner.spanFrom(escapeStart));
+            }
+
+            buffer.writeCharCode(value);
+          }
+        } else {
+          buffer.writeCharCode(_scanner.readChar());
+        }
+      }
+
+      // Check if we're at the end of a scalar.
+      if (_scanner.peekChar() == (singleQuote ? SINGLE_QUOTE : DOUBLE_QUOTE)) {
+        break;
+      }
+
+      var whitespace = new StringBuffer();
+      var leadingBreak = '';
+      var trailingBreaks = new StringBuffer();
+      while (_isBlank || _isBreak) {
+        if (_isBlank) {
+          // Consume a space or a tab.
+          if (!leadingBlanks) {
+            whitespace.writeCharCode(_scanner.readChar());
+          } else {
+            _scanner.readChar();
+          }
+        } else {
+          // Check if it's a first line break.
+          if (!leadingBlanks) {
+            whitespace.clear();
+            leadingBreak = _readLine();
+            leadingBlanks = true;
+          } else {
+            trailingBreaks.write(_readLine());
+          }
+        }
+      }
+
+      // Join the whitespace or fold line breaks.
+      if (leadingBlanks) {
+        if (leadingBreak.isNotEmpty && trailingBreaks.isEmpty) {
+          buffer.writeCharCode(SP);
+        } else {
+          buffer.write(trailingBreaks);
+        }
+      } else {
+        buffer.write(whitespace);
+        whitespace.clear();
+      }
+    }
+
+    // Eat the right quote.
+    _scanner.readChar();
+
+    return new ScalarToken(_scanner.spanFrom(start), buffer.toString(),
+        singleQuote ? ScalarStyle.SINGLE_QUOTED : ScalarStyle.DOUBLE_QUOTED);
+  }
+
+  /// Scans a plain scalar.
+  Token _scanPlainScalar() {
+    var start = _scanner.state;
+    var end = _scanner.state;
+    var buffer = new StringBuffer();
+    var leadingBreak = '';
+    var trailingBreaks = '';
+    var whitespace = new StringBuffer();
+    var indent = _indent + 1;
+
+    while (true) {
+      // Check for a document indicator.
+      if (_isDocumentIndicator) break;
+
+      // Check for a comment.
+      if (_scanner.peekChar() == HASH) break;
+
+      if (_isPlainChar) {
+        // Join the whitespace or fold line breaks.
+        if (leadingBreak.isNotEmpty) {
+          if (trailingBreaks.isEmpty) {
+            buffer.writeCharCode(SP);
+          } else {
+            buffer.write(trailingBreaks);
+          }
+          leadingBreak = '';
+          trailingBreaks = '';
+        } else {
+          buffer.write(whitespace);
+          whitespace.clear();
+        }
+      }
+
+      // libyaml's notion of valid identifiers differs substantially from YAML
+      // 1.2's. We use [_isPlainChar] instead of libyaml's character here.
+      var startPosition = _scanner.position;
+      while (_isPlainChar) {
+        _scanner.readChar();
+      }
+      buffer.write(_scanner.substring(startPosition));
+      end = _scanner.state;
+
+      // Is it the end?
+      if (!_isBlank && !_isBreak) break;
+
+      while (_isBlank || _isBreak) {
+        if (_isBlank) {
+          // Check for a tab character messing up the intendation.
+          if (leadingBreak.isNotEmpty && _scanner.column < indent &&
+              _scanner.peekChar() == TAB) {
+            _scanner.error("Expected a space but found a tab.", length: 1);
+          }
+
+          if (leadingBreak.isEmpty) {
+            whitespace.writeCharCode(_scanner.readChar());
+          } else {
+            _scanner.readChar();
+          }
+        } else {
+          // Check if it's a first line break.
+          if (leadingBreak.isEmpty) {
+            leadingBreak = _readLine();
+            whitespace.clear();
+          } else {
+            trailingBreaks = _readLine();
+          }
+        }
+      }
+
+      // Check the indentation level.
+      if (_inBlockContext && _scanner.column < indent) break;
+    }
+
+    // Allow a simple key after a plain scalar with leading blanks.
+    if (leadingBreak.isNotEmpty) _simpleKeyAllowed = true;
+
+    return new ScalarToken(_scanner.spanFrom(start, end), buffer.toString(),
+        ScalarStyle.PLAIN);
+  }
+
+  /// Moves past the current line break, if there is one.
+  void _skipLine() {
+    var char = _scanner.peekChar();
+    if (char != CR && char != LF) return;
+    _scanner.readChar();
+    if (char == CR && _scanner.peekChar() == LF) _scanner.readChar();
+  }
+
+  // Moves past the current line break and returns a newline.
+  String _readLine() {
+    var char = _scanner.peekChar();
+
+    // libyaml supports NEL, PS, and LS characters as line separators, but this
+    // is explicitly forbidden in section 5.4 of the YAML spec.
+    if (char != CR && char != LF) {
+      throw new YamlException("Expected newline.", _scanner.emptySpan);
+    }
+
+    _scanner.readChar();
+    // CR LF | CR | LF -> LF
+    if (char == CR && _scanner.peekChar() == LF) _scanner.readChar();
+    return "\n";
+  }
+
+  // Returns whether the character at [offset] is whitespace.
+  bool _isBlankAt(int offset) {
+    var char = _scanner.peekChar(offset);
+    return char == SP || char == TAB;
+  }
+
+  // Returns whether the character at [offset] is a line break.
+  bool _isBreakAt(int offset) {
+    // Libyaml considers NEL, LS, and PS to be line breaks as well, but that's
+    // contrary to the spec.
+    var char = _scanner.peekChar(offset);
+    return char == CR || char == LF;
+  }
+
+  // Returns whether the character at [offset] is whitespace or past the end of
+  // the source.
+  bool _isBlankOrEndAt(int offset) {
+    var char = _scanner.peekChar(offset);
+    return char == null || char == SP || char == TAB || char == CR ||
+        char == LF;
+  }
+
+  /// Returns whether the character at [offset] is a plain character.
+  ///
+  /// See http://yaml.org/spec/1.2/spec.html#ns-plain-char(c).
+  bool _isPlainCharAt(int offset) {
+    switch (_scanner.peekChar(offset)) {
+      case COLON:
+        return _isPlainSafeAt(offset + 1);
+      case HASH:
+        var previous = _scanner.peekChar(offset - 1);
+        return previous != SP && previous != TAB;
+      default:
+        return _isPlainSafeAt(offset);
+    }
+  }
+
+  /// Returns whether the character at [offset] is a plain-safe character.
+  ///
+  /// See http://yaml.org/spec/1.2/spec.html#ns-plain-safe(c).
+  bool _isPlainSafeAt(int offset) {
+    var char = _scanner.peekChar(offset);
+    switch (char) {
+      case COMMA:
+      case LEFT_SQUARE:
+      case RIGHT_SQUARE:
+      case LEFT_CURLY:
+      case RIGHT_CURLY:
+        // These characters are delimiters in a flow context and thus are only
+        // safe in a block context.
+        return _inBlockContext;
+      case SP:
+      case TAB:
+      case LF:
+      case CR:
+      case BOM:
+        return false;
+      case NEL:
+        return true;
+      default:
+        return char != null &&
+          ((char >= 0x00020 && char <= 0x00007E) ||
+           (char >= 0x000A0 && char <= 0x00D7FF) ||
+           (char >= 0x0E000 && char <= 0x00FFFD) ||
+           (char >= 0x10000 && char <= 0x10FFFF));
+    }
+  }
+
+  /// Returns the hexidecimal value of [char].
+  int _asHex(int char) {
+    if (char <= NUMBER_9) return char - NUMBER_0;
+    if (char <= LETTER_CAP_F) return 10 + char - LETTER_CAP_A;
+    return 10 + char - LETTER_A;
+  }
+
+  /// Moves the scanner past any blank characters.
+  void _skipBlanks() {
+    while (_isBlank) {
+      _scanner.readChar();
+    }
+  }
+
+  /// Moves the scanner past a comment, if one starts at the current position.
+  void _skipComment() {
+    if (_scanner.peekChar() != HASH) return;
+    while (!_isBreakOrEnd) {
+      _scanner.readChar();
+    }
+  }
+}
+
+/// A record of the location of a potential simple key.
+class _SimpleKey {
+  /// The index of the token that begins the simple key.
+  ///
+  /// This is the index relative to all tokens emitted, rather than relative to
+  /// [_tokens].
+  final int tokenNumber;
+
+  /// The source location of the beginning of the simple key.
+  ///
+  /// This is used for error reporting and for determining when a simple key is
+  /// no longer on the current line.
+  final SourceLocation location;
+
+  /// Whether this key must exist for the document to be scanned.
+  final bool required;
+
+  _SimpleKey(this.tokenNumber, this.location, {bool required})
+      : required = required;
+}
+
+/// An enum of chomping indicators that describe how to handle trailing
+/// whitespace for a block scalar.
+///
+/// See http://yaml.org/spec/1.2/spec.html#id2794534.
+class _Chomping {
+  /// All trailing whitespace is discarded.
+  static const STRIP = const _Chomping("STRIP");
+
+  /// A single trailing newline is retained.
+  static const CLIP = const _Chomping("CLIP");
+
+  /// All trailing whitespace is preserved.
+  static const KEEP = const _Chomping("KEEP");
+
+  final String name;
+
+  const _Chomping(this.name);
+
+  String toString() => name;
+}
diff --git a/mojo/public/dart/third_party/yaml/lib/src/style.dart b/mojo/public/dart/third_party/yaml/lib/src/style.dart
new file mode 100644
index 0000000..6305fce
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/lib/src/style.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library yaml.style;
+
+/// An enum of source scalar styles.
+class ScalarStyle {
+  /// No source style was specified.
+  ///
+  /// This usually indicates a scalar constructed with [YamlScalar.wrap].
+  static const ANY = const ScalarStyle._("ANY");
+
+  /// The plain scalar style, unquoted and without a prefix.
+  ///
+  /// See http://yaml.org/spec/1.2/spec.html#style/flow/plain.
+  static const PLAIN = const ScalarStyle._("PLAIN");
+
+  /// The literal scalar style, with a `|` prefix.
+  ///
+  /// See http://yaml.org/spec/1.2/spec.html#id2795688.
+  static const LITERAL = const ScalarStyle._("LITERAL");
+
+
+  /// The folded scalar style, with a `>` prefix.
+  ///
+  /// See http://yaml.org/spec/1.2/spec.html#id2796251.
+  static const FOLDED = const ScalarStyle._("FOLDED");
+
+  /// The single-quoted scalar style.
+  ///
+  /// See http://yaml.org/spec/1.2/spec.html#style/flow/single-quoted.
+  static const SINGLE_QUOTED = const ScalarStyle._("SINGLE_QUOTED");
+
+  /// The double-quoted scalar style.
+  ///
+  /// See http://yaml.org/spec/1.2/spec.html#style/flow/double-quoted.
+  static const DOUBLE_QUOTED = const ScalarStyle._("DOUBLE_QUOTED");
+
+  final String name;
+
+  /// Whether this is a quoted style ([SINGLE_QUOTED] or [DOUBLE_QUOTED]).
+  bool get isQuoted => this == SINGLE_QUOTED || this == DOUBLE_QUOTED;
+
+  const ScalarStyle._(this.name);
+
+  String toString() => name;
+}
+
+/// An enum of collection styles.
+class CollectionStyle {
+  /// No source style was specified.
+  ///
+  /// This usually indicates a collection constructed with [YamlList.wrap] or
+  /// [YamlMap.wrap].
+  static const ANY = const CollectionStyle._("ANY");
+
+  /// The indentation-based block style.
+  ///
+  /// See http://yaml.org/spec/1.2/spec.html#id2797293.
+  static const BLOCK = const CollectionStyle._("BLOCK");
+
+  /// The delimiter-based block style.
+  ///
+  /// See http://yaml.org/spec/1.2/spec.html#id2790088.
+  static const FLOW = const CollectionStyle._("FLOW");
+
+  final String name;
+
+  const CollectionStyle._(this.name);
+
+  String toString() => name;
+}
diff --git a/mojo/public/dart/third_party/yaml/lib/src/token.dart b/mojo/public/dart/third_party/yaml/lib/src/token.dart
new file mode 100644
index 0000000..20ae547
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/lib/src/token.dart
@@ -0,0 +1,148 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library yaml.token;
+
+import 'package:source_span/source_span.dart';
+
+import 'style.dart';
+
+/// A token emitted by a [Scanner].
+class Token {
+  /// The token type.
+  final TokenType type;
+
+  /// The span associated with the token.
+  final FileSpan span;
+
+  Token(this.type, this.span);
+
+  String toString() => type.toString();
+}
+
+/// A token representing a `%YAML` directive.
+class VersionDirectiveToken implements Token {
+  get type => TokenType.VERSION_DIRECTIVE;
+  final FileSpan span;
+
+  /// The declared major version of the document.
+  final int major;
+
+  /// The declared minor version of the document.
+  final int minor;
+
+  VersionDirectiveToken(this.span, this.major, this.minor);
+
+  String toString() => "VERSION_DIRECTIVE $major.$minor";
+}
+
+/// A token representing a `%TAG` directive.
+class TagDirectiveToken implements Token {
+  get type => TokenType.TAG_DIRECTIVE;
+  final FileSpan span;
+
+  /// The tag handle used in the document.
+  final String handle;
+
+  /// The tag prefix that the handle maps to.
+  final String prefix;
+
+  TagDirectiveToken(this.span, this.handle, this.prefix);
+
+  String toString() => "TAG_DIRECTIVE $handle $prefix";
+}
+
+/// A token representing an anchor (`&foo`).
+class AnchorToken implements Token {
+  get type => TokenType.ANCHOR;
+  final FileSpan span;
+
+  /// The name of the anchor.
+  final String name;
+
+  AnchorToken(this.span, this.name);
+
+  String toString() => "ANCHOR $name";
+}
+
+/// A token representing an alias (`*foo`).
+class AliasToken implements Token {
+  get type => TokenType.ALIAS;
+  final FileSpan span;
+
+  /// The name of the anchor.
+  final String name;
+
+  AliasToken(this.span, this.name);
+
+  String toString() => "ALIAS $name";
+}
+
+/// A token representing a tag (`!foo`).
+class TagToken implements Token {
+  get type => TokenType.TAG;
+  final FileSpan span;
+
+  /// The tag handle.
+  final String handle;
+
+  /// The tag suffix, or `null`.
+  final String suffix;
+
+  TagToken(this.span, this.handle, this.suffix);
+
+  String toString() => "TAG $handle $suffix";
+}
+
+/// A tkoen representing a scalar value.
+class ScalarToken implements Token {
+  get type => TokenType.SCALAR;
+  final FileSpan span;
+
+  /// The contents of the scalar.
+  final String value;
+
+  /// The style of the scalar in the original source.
+  final ScalarStyle style;
+
+  ScalarToken(this.span, this.value, this.style);
+
+  String toString() => "SCALAR $style \"$value\"";
+}
+
+/// An enum of types of [Token] object.
+class TokenType {
+  static const STREAM_START = const TokenType._("STREAM_START");
+  static const STREAM_END = const TokenType._("STREAM_END");
+
+  static const VERSION_DIRECTIVE = const TokenType._("VERSION_DIRECTIVE");
+  static const TAG_DIRECTIVE = const TokenType._("TAG_DIRECTIVE");
+  static const DOCUMENT_START = const TokenType._("DOCUMENT_START");
+  static const DOCUMENT_END = const TokenType._("DOCUMENT_END");
+
+  static const BLOCK_SEQUENCE_START = const TokenType._("BLOCK_SEQUENCE_START");
+  static const BLOCK_MAPPING_START = const TokenType._("BLOCK_MAPPING_START");
+  static const BLOCK_END = const TokenType._("BLOCK_END");
+
+  static const FLOW_SEQUENCE_START = const TokenType._("FLOW_SEQUENCE_START");
+  static const FLOW_SEQUENCE_END = const TokenType._("FLOW_SEQUENCE_END");
+  static const FLOW_MAPPING_START = const TokenType._("FLOW_MAPPING_START");
+  static const FLOW_MAPPING_END = const TokenType._("FLOW_MAPPING_END");
+
+  static const BLOCK_ENTRY = const TokenType._("BLOCK_ENTRY");
+  static const FLOW_ENTRY = const TokenType._("FLOW_ENTRY");
+  static const KEY = const TokenType._("KEY");
+  static const VALUE = const TokenType._("VALUE");
+
+  static const ALIAS = const TokenType._("ALIAS");
+  static const ANCHOR = const TokenType._("ANCHOR");
+  static const TAG = const TokenType._("TAG");
+  static const SCALAR = const TokenType._("SCALAR");
+
+  final String name;
+
+  const TokenType._(this.name);
+
+  String toString() => name;
+}
diff --git a/mojo/public/dart/third_party/yaml/lib/src/utils.dart b/mojo/public/dart/third_party/yaml/lib/src/utils.dart
new file mode 100644
index 0000000..445221f
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/lib/src/utils.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library yaml.utils;
+
+import 'package:source_span/source_span.dart';
+
+/// A pair of values.
+class Pair<E, F> {
+  final E first;
+  final F last;
+
+  Pair(this.first, this.last);
+
+  String toString() => '($first, $last)';
+}
+
+/// Print a warning.
+///
+/// If [span] is passed, associates the warning with that span.
+void warn(String message, [SourceSpan span]) =>
+    yamlWarningCallback(message, span);
+
+/// A callback for emitting a warning.
+///
+/// [message] is the text of the warning. If [span] is passed, it's the portion
+/// of the document that the warning is associated with and should be included
+/// in the printed warning.
+typedef YamlWarningCallback(String message, [SourceSpan span]);
+
+/// A callback for emitting a warning.
+///
+/// In a very few cases, the YAML spec indicates that an implementation should
+/// emit a warning. To do so, it calls this callback. The default implementation
+/// prints a message using [print].
+YamlWarningCallback yamlWarningCallback = (message, [span]) {
+  // TODO(nweiz): Print to stderr with color when issue 6943 is fixed and
+  // dart:io is available.
+  if (span != null) message = span.message(message);
+  print(message);
+};
+
+
diff --git a/mojo/public/dart/third_party/yaml/lib/src/yaml_document.dart b/mojo/public/dart/third_party/yaml/lib/src/yaml_document.dart
new file mode 100644
index 0000000..4c249a0
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/lib/src/yaml_document.dart
@@ -0,0 +1,67 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library yaml.yaml_document;
+
+import 'dart:collection';
+
+import 'package:source_span/source_span.dart';
+
+import 'yaml_node.dart';
+
+/// A YAML document, complete with metadata.
+class YamlDocument {
+  /// The contents of the document.
+  final YamlNode contents;
+
+  /// The span covering the entire document.
+  final SourceSpan span;
+
+  /// The version directive for the document, if any.
+  final VersionDirective versionDirective;
+
+  /// The tag directives for the document.
+  final List<TagDirective> tagDirectives;
+
+  /// Whether the beginning of the document was implicit (versus explicit via
+  /// `===`).
+  final bool startImplicit;
+
+  /// Whether the end of the document was implicit (versus explicit via `...`).
+  final bool endImplicit;
+
+  /// Users of the library should not use this constructor.
+  YamlDocument.internal(this.contents, this.span, this.versionDirective,
+          List<TagDirective> tagDirectives, {this.startImplicit: false,
+          this.endImplicit: false})
+      : tagDirectives = new UnmodifiableListView(tagDirectives);
+
+  String toString() => contents.toString();
+}
+
+/// A directive indicating which version of YAML a document was written to.
+class VersionDirective {
+  /// The major version number.
+  final int major;
+
+  /// The minor version number.
+  final int minor;
+
+  VersionDirective(this.major, this.minor);
+
+  String toString() => "%YAML $major.$minor";
+}
+
+/// A directive describing a custom tag handle.
+class TagDirective {
+  /// The handle for use in the document.
+  final String handle;
+
+  /// The prefix that the handle maps to.
+  final String prefix;
+
+  TagDirective(this.handle, this.prefix);
+
+  String toString() => "%TAG $handle $prefix";
+}
diff --git a/mojo/public/dart/third_party/yaml/lib/src/yaml_exception.dart b/mojo/public/dart/third_party/yaml/lib/src/yaml_exception.dart
new file mode 100644
index 0000000..8689953
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/lib/src/yaml_exception.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library yaml.exception;
+
+import 'package:source_span/source_span.dart';
+
+/// An error thrown by the YAML processor.
+class YamlException extends SourceSpanFormatException {
+  YamlException(String message, SourceSpan span)
+      : super(message, span);
+}
+
diff --git a/mojo/public/dart/third_party/yaml/lib/src/yaml_node.dart b/mojo/public/dart/third_party/yaml/lib/src/yaml_node.dart
new file mode 100644
index 0000000..027bc1b
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/lib/src/yaml_node.dart
@@ -0,0 +1,178 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library yaml.yaml_node;
+
+import 'dart:collection' as collection;
+
+import 'package:collection/collection.dart';
+import 'package:source_span/source_span.dart';
+
+import 'null_span.dart';
+import 'style.dart';
+import 'yaml_node_wrapper.dart';
+
+/// An interface for parsed nodes from a YAML source tree.
+///
+/// [YamlMap]s and [YamlList]s implement this interface in addition to the
+/// normal [Map] and [List] interfaces, so any maps and lists will be
+/// [YamlNode]s regardless of how they're accessed.
+///
+/// Scalars values like strings and numbers, on the other hand, don't have this
+/// interface by default. Instead, they can be accessed as [YamlScalar]s via
+/// [YamlMap.nodes] or [YamlList.nodes].
+abstract class YamlNode {
+  /// The source span for this node.
+  ///
+  /// [SourceSpan.message] can be used to produce a human-friendly message about
+  /// this node.
+  SourceSpan get span => _span;
+
+  SourceSpan _span;
+
+  /// The inner value of this node.
+  ///
+  /// For [YamlScalar]s, this will return the wrapped value. For [YamlMap] and
+  /// [YamlList], it will return [this], since they already implement [Map] and
+  /// [List], respectively.
+  get value;
+}
+
+/// A read-only [Map] parsed from YAML.
+class YamlMap extends YamlNode with collection.MapMixin, UnmodifiableMapMixin  {
+  /// A view of [this] where the keys and values are guaranteed to be
+  /// [YamlNode]s.
+  ///
+  /// The key type is `dynamic` to allow values to be accessed using
+  /// non-[YamlNode] keys, but [Map.keys] and [Map.forEach] will always expose
+  /// them as [YamlNode]s. For example, for `{"foo": [1, 2, 3]}` [nodes] will be
+  /// a map from a [YamlScalar] to a [YamlList], but since the key type is
+  /// `dynamic` `map.nodes["foo"]` will still work.
+  final Map<dynamic, YamlNode> nodes;
+
+  /// The style used for the map in the original document.
+  final CollectionStyle style;
+
+  Map get value => this;
+
+  Iterable get keys => nodes.keys.map((node) => node.value);
+
+  /// Creates an empty YamlMap.
+  ///
+  /// This map's [span] won't have useful location information. However, it will
+  /// have a reasonable implementation of [SourceSpan.message]. If [sourceUrl]
+  /// is passed, it's used as the [SourceSpan.sourceUrl].
+  ///
+  /// [sourceUrl] may be either a [String], a [Uri], or `null`.
+  factory YamlMap({sourceUrl}) =>
+      new YamlMapWrapper(const {}, sourceUrl);
+
+  /// Wraps a Dart map so that it can be accessed (recursively) like a
+  /// [YamlMap].
+  ///
+  /// Any [SourceSpan]s returned by this map or its children will be dummies
+  /// without useful location information. However, they will have a reasonable
+  /// implementation of [SourceSpan.getLocationMessage]. If [sourceUrl] is
+  /// passed, it's used as the [SourceSpan.sourceUrl].
+  ///
+  /// [sourceUrl] may be either a [String], a [Uri], or `null`.
+  factory YamlMap.wrap(Map dartMap, {sourceUrl}) =>
+      new YamlMapWrapper(dartMap, sourceUrl);
+
+  /// Users of the library should not use this constructor.
+  YamlMap.internal(Map<dynamic, YamlNode> nodes, SourceSpan span, this.style)
+      : nodes = new UnmodifiableMapView<dynamic, YamlNode>(nodes) {
+    _span = span;
+  }
+
+  operator [](key) {
+    var node = nodes[key];
+    return node == null ? null : node.value;
+  }
+}
+
+// TODO(nweiz): Use UnmodifiableListMixin when issue 18970 is fixed.
+/// A read-only [List] parsed from YAML.
+class YamlList extends YamlNode with collection.ListMixin {
+  final List<YamlNode> nodes;
+
+  /// The style used for the list in the original document.
+  final CollectionStyle style;
+
+  List get value => this;
+
+  int get length => nodes.length;
+
+  set length(int index) {
+    throw new UnsupportedError("Cannot modify an unmodifiable List");
+  }
+
+  /// Creates an empty YamlList.
+  ///
+  /// This list's [span] won't have useful location information. However, it
+  /// will have a reasonable implementation of [SourceSpan.message]. If
+  /// [sourceUrl] is passed, it's used as the [SourceSpan.sourceUrl].
+  ///
+  /// [sourceUrl] may be either a [String], a [Uri], or `null`.
+  factory YamlList({sourceUrl}) =>
+      new YamlListWrapper(const [], sourceUrl);
+
+  /// Wraps a Dart list so that it can be accessed (recursively) like a
+  /// [YamlList].
+  ///
+  /// Any [SourceSpan]s returned by this list or its children will be dummies
+  /// without useful location information. However, they will have a reasonable
+  /// implementation of [SourceSpan.getLocationMessage]. If [sourceUrl] is
+  /// passed, it's used as the [SourceSpan.sourceUrl].
+  ///
+  /// [sourceUrl] may be either a [String], a [Uri], or `null`.
+  factory YamlList.wrap(List dartList, {sourceUrl}) =>
+      new YamlListWrapper(dartList, sourceUrl);
+
+  /// Users of the library should not use this constructor.
+  YamlList.internal(List<YamlNode> nodes, SourceSpan span, this.style)
+      : nodes = new UnmodifiableListView<YamlNode>(nodes) {
+    _span = span;
+  }
+
+  operator [](int index) => nodes[index].value;
+
+  operator []=(int index, value) {
+    throw new UnsupportedError("Cannot modify an unmodifiable List");
+  }
+}
+
+/// A wrapped scalar value parsed from YAML.
+class YamlScalar extends YamlNode {
+  final value;
+
+  /// The style used for the scalar in the original document.
+  final ScalarStyle style;
+
+  /// Wraps a Dart value in a [YamlScalar].
+  ///
+  /// This scalar's [span] won't have useful location information. However, it
+  /// will have a reasonable implementation of [SourceSpan.message]. If
+  /// [sourceUrl] is passed, it's used as the [SourceSpan.sourceUrl].
+  ///
+  /// [sourceUrl] may be either a [String], a [Uri], or `null`.
+  YamlScalar.wrap(this.value, {sourceUrl})
+      : style = ScalarStyle.ANY {
+    _span = new NullSpan(sourceUrl);
+  }
+
+  /// Users of the library should not use this constructor.
+  YamlScalar.internal(this.value, SourceSpan span, this.style) {
+    _span = span;
+  }
+
+  String toString() => value.toString();
+}
+
+/// Sets the source span of a [YamlNode].
+///
+/// This method is not exposed publicly.
+void setSpan(YamlNode node, SourceSpan span) {
+  node._span = span;
+}
diff --git a/mojo/public/dart/third_party/yaml/lib/src/yaml_node_wrapper.dart b/mojo/public/dart/third_party/yaml/lib/src/yaml_node_wrapper.dart
new file mode 100644
index 0000000..be96ba4
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/lib/src/yaml_node_wrapper.dart
@@ -0,0 +1,155 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library yaml.yaml_node_wrapper;
+
+import 'dart:collection';
+
+import 'package:collection/collection.dart' as pkg_collection;
+import 'package:source_span/source_span.dart';
+
+import 'null_span.dart';
+import 'style.dart';
+import 'yaml_node.dart';
+
+/// A wrapper that makes a normal Dart map behave like a [YamlMap].
+class YamlMapWrapper extends MapBase
+    with pkg_collection.UnmodifiableMapMixin
+    implements YamlMap {
+  final CollectionStyle style = CollectionStyle.ANY;
+
+  final Map _dartMap;
+
+  final SourceSpan span;
+
+  final Map<dynamic, YamlNode> nodes;
+
+  Map get value => this;
+
+  Iterable get keys => _dartMap.keys;
+
+  YamlMapWrapper(Map dartMap, sourceUrl)
+      : this._(dartMap, new NullSpan(sourceUrl));
+
+  YamlMapWrapper._(Map dartMap, SourceSpan span)
+      : _dartMap = dartMap,
+        span = span,
+        nodes = new _YamlMapNodes(dartMap, span);
+
+  operator [](Object key) {
+    var value = _dartMap[key];
+    if (value is Map) return new YamlMapWrapper._(value, span);
+    if (value is List) return new YamlListWrapper._(value, span);
+    return value;
+  }
+
+  int get hashCode => _dartMap.hashCode;
+
+  operator ==(Object other) =>
+      other is YamlMapWrapper && other._dartMap == _dartMap;
+}
+
+/// The implementation of [YamlMapWrapper.nodes] as a wrapper around the Dart
+/// map.
+class _YamlMapNodes extends MapBase<dynamic, YamlNode>
+    with pkg_collection.UnmodifiableMapMixin<dynamic, YamlNode> {
+  final Map _dartMap;
+
+  final SourceSpan _span;
+
+  Iterable get keys => _dartMap.keys.map((key) =>
+      new YamlScalar.internal(key, _span, ScalarStyle.ANY));
+
+  _YamlMapNodes(this._dartMap, this._span);
+
+  YamlNode operator [](Object key) {
+    // Use "as" here because key being assigned to invalidates type propagation.
+    if (key is YamlScalar) key = (key as YamlScalar).value;
+    if (!_dartMap.containsKey(key)) return null;
+    return _nodeForValue(_dartMap[key], _span);
+  }
+
+  int get hashCode => _dartMap.hashCode;
+
+  operator ==(Object other) =>
+      other is _YamlMapNodes && other._dartMap == _dartMap;
+}
+
+// TODO(nweiz): Use UnmodifiableListMixin when issue 18970 is fixed.
+/// A wrapper that makes a normal Dart list behave like a [YamlList].
+class YamlListWrapper extends ListBase implements YamlList {
+  final CollectionStyle style = CollectionStyle.ANY;
+
+  final List _dartList;
+
+  final SourceSpan span;
+
+  final List<YamlNode> nodes;
+
+  List get value => this;
+
+  int get length => _dartList.length;
+
+  set length(int index) {
+    throw new UnsupportedError("Cannot modify an unmodifiable List.");
+  }
+
+  YamlListWrapper(List dartList, sourceUrl)
+      : this._(dartList, new NullSpan(sourceUrl));
+
+  YamlListWrapper._(List dartList, SourceSpan span)
+      : _dartList = dartList,
+        span = span,
+        nodes = new _YamlListNodes(dartList, span);
+
+  operator [](int index) {
+    var value = _dartList[index];
+    if (value is Map) return new YamlMapWrapper._(value, span);
+    if (value is List) return new YamlListWrapper._(value, span);
+    return value;
+  }
+
+  operator []=(int index, value) {
+    throw new UnsupportedError("Cannot modify an unmodifiable List.");
+  }
+
+  int get hashCode => _dartList.hashCode;
+
+  operator ==(Object other) =>
+      other is YamlListWrapper && other._dartList == _dartList;
+}
+
+// TODO(nweiz): Use UnmodifiableListMixin when issue 18970 is fixed.
+/// The implementation of [YamlListWrapper.nodes] as a wrapper around the Dart
+/// list.
+class _YamlListNodes extends ListBase<YamlNode> {
+  final List _dartList;
+
+  final SourceSpan _span;
+
+  int get length => _dartList.length;
+
+  set length(int index) {
+    throw new UnsupportedError("Cannot modify an unmodifiable List.");
+  }
+
+  _YamlListNodes(this._dartList, this._span);
+
+  YamlNode operator [](int index) => _nodeForValue(_dartList[index], _span);
+
+  operator []=(int index, value) {
+    throw new UnsupportedError("Cannot modify an unmodifiable List.");
+  }
+
+  int get hashCode => _dartList.hashCode;
+
+  operator ==(Object other) =>
+      other is _YamlListNodes && other._dartList == _dartList;
+}
+
+YamlNode _nodeForValue(value, SourceSpan span) {
+  if (value is Map) return new YamlMapWrapper._(value, span);
+  if (value is List) return new YamlListWrapper._(value, span);
+  return new YamlScalar.internal(value, span, ScalarStyle.ANY);
+}
diff --git a/mojo/public/dart/third_party/yaml/lib/yaml.dart b/mojo/public/dart/third_party/yaml/lib/yaml.dart
new file mode 100644
index 0000000..9af329a
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/lib/yaml.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library yaml;
+
+import 'src/loader.dart';
+import 'src/style.dart';
+import 'src/yaml_document.dart';
+import 'src/yaml_exception.dart';
+import 'src/yaml_node.dart';
+
+export 'src/style.dart';
+export 'src/utils.dart' show YamlWarningCallback, yamlWarningCallback;
+export 'src/yaml_document.dart';
+export 'src/yaml_exception.dart';
+export 'src/yaml_node.dart' hide setSpan;
+
+/// Loads a single document from a YAML string.
+///
+/// If the string contains more than one document, this throws a
+/// [YamlException]. In future releases, this will become an [ArgumentError].
+///
+/// The return value is mostly normal Dart objects. However, since YAML mappings
+/// support some key types that the default Dart map implementation doesn't
+/// (NaN, lists, and maps), all maps in the returned document are [YamlMap]s.
+/// These have a few small behavioral differences from the default Map
+/// implementation; for details, see the [YamlMap] class.
+///
+/// In future versions, maps will instead be [HashMap]s with a custom equality
+/// operation.
+///
+/// If [sourceUrl] is passed, it's used as the URL from which the YAML
+/// originated for error reporting. It can be a [String], a [Uri], or `null`.
+loadYaml(String yaml, {sourceUrl}) =>
+    loadYamlNode(yaml, sourceUrl: sourceUrl).value;
+
+/// Loads a single document from a YAML string as a [YamlNode].
+///
+/// This is just like [loadYaml], except that where [loadYaml] would return a
+/// normal Dart value this returns a [YamlNode] instead. This allows the caller
+/// to be confident that the return value will always be a [YamlNode].
+YamlNode loadYamlNode(String yaml, {sourceUrl}) =>
+    loadYamlDocument(yaml, sourceUrl: sourceUrl).contents;
+
+/// Loads a single document from a YAML string as a [YamlDocument].
+///
+/// This is just like [loadYaml], except that where [loadYaml] would return a
+/// normal Dart value this returns a [YamlDocument] instead. This allows the
+/// caller to access document metadata.
+YamlDocument loadYamlDocument(String yaml, {sourceUrl}) {
+  var loader = new Loader(yaml, sourceUrl: sourceUrl);
+  var document = loader.load();
+  if (document == null) {
+    return new YamlDocument.internal(
+        new YamlScalar.internal(null, loader.span, ScalarStyle.ANY),
+        loader.span, null, const []);
+  }
+
+  var nextDocument = loader.load();
+  if (nextDocument != null) {
+    throw new YamlException("Only expected one document.", nextDocument.span);
+  }
+
+  return document;
+}
+
+/// Loads a stream of documents from a YAML string.
+///
+/// The return value is mostly normal Dart objects. However, since YAML mappings
+/// support some key types that the default Dart map implementation doesn't
+/// (NaN, lists, and maps), all maps in the returned document are [YamlMap]s.
+/// These have a few small behavioral differences from the default Map
+/// implementation; for details, see the [YamlMap] class.
+///
+/// In future versions, maps will instead be [HashMap]s with a custom equality
+/// operation.
+///
+/// If [sourceUrl] is passed, it's used as the URL from which the YAML
+/// originated for error reporting. It can be a [String], a [Uri], or `null`.
+YamlList loadYamlStream(String yaml, {sourceUrl}) {
+  var loader = new Loader(yaml, sourceUrl: sourceUrl);
+
+  var documents = [];
+  var document = loader.load();
+  while (document != null) {
+    documents.add(document);
+    document = loader.load();
+  }
+
+  return new YamlList.internal(
+      documents.map((document) => document.contents).toList(),
+      loader.span,
+      CollectionStyle.ANY);
+}
+
+/// Loads a stream of documents from a YAML string.
+///
+/// This is like [loadYamlStream], except that it returns [YamlDocument]s with
+/// metadata wrapping the document contents.
+List<YamlDocument> loadYamlDocuments(String yaml, {sourceUrl}) {
+  var loader = new Loader(yaml, sourceUrl: sourceUrl);
+
+  var documents = [];
+  var document = loader.load();
+  while (document != null) {
+    documents.add(document);
+    document = loader.load();
+  }
+
+  return documents;
+}
diff --git a/mojo/public/dart/third_party/yaml/libyaml-license.txt b/mojo/public/dart/third_party/yaml/libyaml-license.txt
new file mode 100644
index 0000000..050ced2
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/libyaml-license.txt
@@ -0,0 +1,19 @@
+Copyright (c) 2006 Kirill Simonov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/mojo/public/dart/third_party/yaml/pubspec.yaml b/mojo/public/dart/third_party/yaml/pubspec.yaml
new file mode 100644
index 0000000..d00d31f
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/pubspec.yaml
@@ -0,0 +1,14 @@
+name: yaml
+version: 2.1.3
+author: "Dart Team <misc@dartlang.org>"
+homepage: https://github.com/dart-lang/yaml
+description: A parser for YAML.
+dependencies:
+  collection: ">=1.1.0 <2.0.0"
+  path: ">=1.2.0 <2.0.0"
+  string_scanner: ">=0.1.3 <0.2.0"
+  source_span: ">=1.0.0 <2.0.0"
+dev_dependencies:
+  unittest: ">=0.9.0 <0.12.0"
+environment:
+  sdk: '>=1.5.0 <2.0.0'
diff --git a/mojo/public/dart/third_party/yaml/test/utils.dart b/mojo/public/dart/third_party/yaml/test/utils.dart
new file mode 100644
index 0000000..9c96ec1
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/test/utils.dart
@@ -0,0 +1,86 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library yaml.test.utils;
+
+import 'package:unittest/unittest.dart';
+import 'package:yaml/src/equality.dart' as equality;
+import 'package:yaml/yaml.dart';
+
+/// A matcher that validates that a closure or Future throws a [YamlException].
+final Matcher throwsYamlException = throwsA(new isInstanceOf<YamlException>());
+
+/// Returns a matcher that asserts that the value equals [expected].
+///
+/// This handles recursive loops and considers `NaN` to equal itself.
+Matcher deepEquals(expected) => predicate((actual) =>
+    equality.deepEquals(actual, expected), "equals $expected");
+
+/// Constructs a new yaml.YamlMap, optionally from a normal Map.
+Map deepEqualsMap([Map from]) {
+  var map = equality.deepEqualsMap();
+  if (from != null) map.addAll(from);
+  return map;
+}
+
+/// Asserts that a string containing a single YAML document produces a given
+/// value when loaded.
+void expectYamlLoads(expected, String source) {
+  var actual = loadYaml(cleanUpLiteral(source));
+  expect(actual, deepEquals(expected));
+}
+
+/// Asserts that a string containing a stream of YAML documents produces a given
+/// list of values when loaded.
+void expectYamlStreamLoads(List expected, String source) {
+  var actual = loadYamlStream(cleanUpLiteral(source));
+  expect(actual, deepEquals(expected));
+}
+
+/// Asserts that a string containing a single YAML document throws a
+/// [YamlException].
+void expectYamlFails(String source) {
+  expect(() => loadYaml(cleanUpLiteral(source)), throwsYamlException);
+}
+
+/// Removes eight spaces of leading indentation from a multiline string.
+///
+/// Note that this is very sensitive to how the literals are styled. They should
+/// be:
+///     '''
+///     Text starts on own line. Lines up with subsequent lines.
+///     Lines are indented exactly 8 characters from the left margin.
+///     Close is on the same line.'''
+///
+/// This does nothing if text is only a single line.
+String cleanUpLiteral(String text) {
+  var lines = text.split('\n');
+  if (lines.length <= 1) return text;
+
+  for (var j = 0; j < lines.length; j++) {
+    if (lines[j].length > 8) {
+      lines[j] = lines[j].substring(8, lines[j].length);
+    } else {
+      lines[j] = '';
+    }
+  }
+
+  return lines.join('\n');
+}
+
+/// Indents each line of [text] so that, when passed to [cleanUpLiteral], it
+/// will produce output identical to [text].
+///
+/// This is useful for literals that need to include newlines but can't be
+/// conveniently represented as multi-line strings.
+String indentLiteral(String text) {
+  var lines = text.split('\n');
+  if (lines.length <= 1) return text;
+
+  for (var i = 0; i < lines.length; i++) {
+    lines[i] = "        ${lines[i]}";
+  }
+
+  return lines.join("\n");
+}
diff --git a/mojo/public/dart/third_party/yaml/test/yaml_node_wrapper_test.dart b/mojo/public/dart/third_party/yaml/test/yaml_node_wrapper_test.dart
new file mode 100644
index 0000000..2c41a6a
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/test/yaml_node_wrapper_test.dart
@@ -0,0 +1,163 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library yaml.node_wrapper_test;
+
+import 'package:source_span/source_span.dart';
+import 'package:unittest/unittest.dart';
+import 'package:yaml/yaml.dart';
+
+main() {
+  test("YamlMap() with no sourceUrl", () {
+    var map = new YamlMap();
+    expect(map, isEmpty);
+    expect(map.nodes, isEmpty);
+    expect(map.span, isNullSpan(isNull));
+  });
+
+  test("YamlMap() with a sourceUrl", () {
+    var map = new YamlMap(sourceUrl: "source");
+    expect(map.span, isNullSpan(Uri.parse("source")));
+  });
+
+  test("YamlList() with no sourceUrl", () {
+    var list = new YamlList();
+    expect(list, isEmpty);
+    expect(list.nodes, isEmpty);
+    expect(list.span, isNullSpan(isNull));
+  });
+
+  test("YamlList() with a sourceUrl", () {
+    var list = new YamlList(sourceUrl: "source");
+    expect(list.span, isNullSpan(Uri.parse("source")));
+  });
+
+  test("YamlMap.wrap() with no sourceUrl", () {
+    var map = new YamlMap.wrap({
+      "list": [1, 2, 3],
+      "map": {
+        "foo": "bar",
+        "nested": [4, 5, 6]
+      },
+      "scalar": "value"
+    });
+
+    expect(map, equals({
+      "list": [1, 2, 3],
+      "map": {
+        "foo": "bar",
+        "nested": [4, 5, 6]
+      },
+      "scalar": "value"
+    }));
+
+    expect(map.span, isNullSpan(isNull));
+    expect(map["list"], new isInstanceOf<YamlList>());
+    expect(map["list"].nodes[0], new isInstanceOf<YamlScalar>());
+    expect(map["list"].span, isNullSpan(isNull));
+    expect(map["map"], new isInstanceOf<YamlMap>());
+    expect(map["map"].nodes["foo"], new isInstanceOf<YamlScalar>());
+    expect(map["map"]["nested"], new isInstanceOf<YamlList>());
+    expect(map["map"].span, isNullSpan(isNull));
+    expect(map.nodes["scalar"], new isInstanceOf<YamlScalar>());
+    expect(map.nodes["scalar"].value, "value");
+    expect(map.nodes["scalar"].span, isNullSpan(isNull));
+    expect(map["scalar"], "value");
+    expect(map.keys, unorderedEquals(["list", "map", "scalar"]));
+    expect(map.nodes.keys, everyElement(new isInstanceOf<YamlScalar>()));
+    expect(map.nodes[new YamlScalar.wrap("list")], equals([1, 2, 3]));
+  });
+
+  test("YamlMap.wrap() with a sourceUrl", () {
+    var map = new YamlMap.wrap({
+      "list": [1, 2, 3],
+      "map": {
+        "foo": "bar",
+        "nested": [4, 5, 6]
+      },
+      "scalar": "value"
+    }, sourceUrl: "source");
+
+    var source = Uri.parse("source");
+    expect(map.span, isNullSpan(source));
+    expect(map["list"].span, isNullSpan(source));
+    expect(map["map"].span, isNullSpan(source));
+    expect(map.nodes["scalar"].span, isNullSpan(source));
+  });
+
+  test("YamlList.wrap() with no sourceUrl", () {
+    var list = new YamlList.wrap([
+      [1, 2, 3],
+      {
+        "foo": "bar",
+        "nested": [4, 5, 6]
+      },
+      "value"
+    ]);
+
+    expect(list, equals([
+      [1, 2, 3],
+      {
+        "foo": "bar",
+        "nested": [4, 5, 6]
+      },
+      "value"
+    ]));
+
+    expect(list.span, isNullSpan(isNull));
+    expect(list[0], new isInstanceOf<YamlList>());
+    expect(list[0].nodes[0], new isInstanceOf<YamlScalar>());
+    expect(list[0].span, isNullSpan(isNull));
+    expect(list[1], new isInstanceOf<YamlMap>());
+    expect(list[1].nodes["foo"], new isInstanceOf<YamlScalar>());
+    expect(list[1]["nested"], new isInstanceOf<YamlList>());
+    expect(list[1].span, isNullSpan(isNull));
+    expect(list.nodes[2], new isInstanceOf<YamlScalar>());
+    expect(list.nodes[2].value, "value");
+    expect(list.nodes[2].span, isNullSpan(isNull));
+    expect(list[2], "value");
+  });
+
+  test("YamlList.wrap() with a sourceUrl", () {
+    var list = new YamlList.wrap([
+      [1, 2, 3],
+      {
+        "foo": "bar",
+        "nested": [4, 5, 6]
+      },
+      "value"
+    ]);
+
+    expect(list.span, isNullSpan(isNull));
+    expect(list[0].span, isNullSpan(isNull));
+    expect(list[1].span, isNullSpan(isNull));
+    expect(list.nodes[2].span, isNullSpan(isNull));
+  });
+
+  test("re-wrapped objects equal one another", () {
+    var list = new YamlList.wrap([
+      [1, 2, 3],
+      {"foo": "bar"}
+    ]);
+
+    expect(list[0] == list[0], isTrue);
+    expect(list[0].nodes == list[0].nodes, isTrue);
+    expect(list[0] == new YamlList.wrap([1, 2, 3]), isFalse);
+    expect(list[1] == list[1], isTrue);
+    expect(list[1].nodes == list[1].nodes, isTrue);
+    expect(list[1] == new YamlMap.wrap({"foo": "bar"}), isFalse);
+  });
+}
+
+Matcher isNullSpan(sourceUrl) => predicate((span) {
+  expect(span, new isInstanceOf<SourceSpan>());
+  expect(span.length, equals(0));
+  expect(span.text, isEmpty);
+  expect(span.start, equals(span.end));
+  expect(span.start.offset, equals(0));
+  expect(span.start.line, equals(0));
+  expect(span.start.column, equals(0));
+  expect(span.sourceUrl, sourceUrl);
+  return true;
+});
diff --git a/mojo/public/dart/third_party/yaml/test/yaml_test.dart b/mojo/public/dart/third_party/yaml/test/yaml_test.dart
new file mode 100644
index 0000000..2d9a0e8
--- /dev/null
+++ b/mojo/public/dart/third_party/yaml/test/yaml_test.dart
@@ -0,0 +1,1848 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library yaml.test;
+
+import 'package:unittest/unittest.dart';
+import 'package:yaml/yaml.dart';
+
+import 'utils.dart';
+
+main() {
+  var infinity = double.parse("Infinity");
+  var nan = double.parse("NaN");
+
+  group('has a friendly error message for', () {
+    var tabError = predicate((e) =>
+        e.toString().contains('Tab characters are not allowed as indentation'));
+
+    test('using a tab as indentation', () {
+      expect(() => loadYaml('foo:\n\tbar'),
+          throwsA(tabError));
+    });
+
+    test('using a tab not as indentation', () {
+      expect(() => loadYaml('''
+          "foo
+          \tbar"
+          error'''),
+        throwsA(isNot(tabError)));
+    });
+  });
+
+  group("refuses documents that declare version", () {
+    test("1.0", () {
+      expectYamlFails("""
+         %YAML 1.0
+         --- text
+         """);
+    });
+
+    test("1.3", () {
+      expectYamlFails("""
+         %YAML 1.3
+         --- text
+         """);
+    });
+
+    test("2.0", () {
+      expectYamlFails("""
+         %YAML 2.0
+         --- text
+         """);
+    });
+  });
+
+  // The following tests are all taken directly from the YAML spec
+  // (http://www.yaml.org/spec/1.2/spec.html). Most of them are code examples
+  // that are directly included in the spec, but additional tests are derived
+  // from the prose.
+
+  // A few examples from the spec are deliberately excluded, because they test
+  // features that this implementation doesn't intend to support (character
+  // encoding detection and user-defined tags). More tests are commented out,
+  // because they're intended to be supported but not yet implemented.
+
+  // Chapter 2 is just a preview of various Yaml documents. It's probably not
+  // necessary to test its examples, but it would be nice to test everything in
+  // the spec.
+  group('2.1: Collections', () {
+    test('[Example 2.1]', () {
+      expectYamlLoads(["Mark McGwire", "Sammy Sosa", "Ken Griffey"],
+        """
+        - Mark McGwire
+        - Sammy Sosa
+        - Ken Griffey""");
+    });
+
+    test('[Example 2.2]', () {
+      expectYamlLoads({"hr": 65, "avg": 0.278, "rbi": 147},
+        """
+        hr:  65    # Home runs
+        avg: 0.278 # Batting average
+        rbi: 147   # Runs Batted In""");
+    });
+
+    test('[Example 2.3]', () {
+      expectYamlLoads({
+        "american": ["Boston Red Sox", "Detroit Tigers", "New York Yankees"],
+        "national": ["New York Mets", "Chicago Cubs", "Atlanta Braves"],
+      },
+        """
+        american:
+          - Boston Red Sox
+          - Detroit Tigers
+          - New York Yankees
+        national:
+          - New York Mets
+          - Chicago Cubs
+          - Atlanta Braves""");
+    });
+
+    test('[Example 2.4]', () {
+      expectYamlLoads([
+        {"name": "Mark McGwire", "hr": 65, "avg": 0.278},
+        {"name": "Sammy Sosa", "hr": 63, "avg": 0.288},
+      ],
+        """
+        -
+          name: Mark McGwire
+          hr:   65
+          avg:  0.278
+        -
+          name: Sammy Sosa
+          hr:   63
+          avg:  0.288""");
+    });
+
+    test('[Example 2.5]', () {
+      expectYamlLoads([
+        ["name", "hr", "avg"],
+        ["Mark McGwire", 65, 0.278],
+        ["Sammy Sosa", 63, 0.288]
+      ],
+        """
+        - [name        , hr, avg  ]
+        - [Mark McGwire, 65, 0.278]
+        - [Sammy Sosa  , 63, 0.288]""");
+    });
+
+    test('[Example 2.6]', () {
+      expectYamlLoads({
+        "Mark McGwire": {"hr": 65, "avg": 0.278},
+        "Sammy Sosa": {"hr": 63, "avg": 0.288}
+      },
+        """
+        Mark McGwire: {hr: 65, avg: 0.278}
+        Sammy Sosa: {
+            hr: 63,
+            avg: 0.288
+          }""");
+    });
+  });
+
+  group('2.2: Structures', () {
+    test('[Example 2.7]', () {
+      expectYamlStreamLoads([
+        ["Mark McGwire", "Sammy Sosa", "Ken Griffey"],
+        ["Chicago Cubs", "St Louis Cardinals"]
+      ],
+        """
+        # Ranking of 1998 home runs
+        ---
+        - Mark McGwire
+        - Sammy Sosa
+        - Ken Griffey
+
+        # Team ranking
+        ---
+        - Chicago Cubs
+        - St Louis Cardinals""");
+    });
+
+    test('[Example 2.8]', () {
+      expectYamlStreamLoads([
+        {"time": "20:03:20", "player": "Sammy Sosa", "action": "strike (miss)"},
+        {"time": "20:03:47", "player": "Sammy Sosa", "action": "grand slam"},
+      ],
+        """
+        ---
+        time: 20:03:20
+        player: Sammy Sosa
+        action: strike (miss)
+        ...
+        ---
+        time: 20:03:47
+        player: Sammy Sosa
+        action: grand slam
+        ...""");
+    });
+
+    test('[Example 2.9]', () {
+      expectYamlLoads({
+        "hr": ["Mark McGwire", "Sammy Sosa"],
+        "rbi": ["Sammy Sosa", "Ken Griffey"]
+      },
+        """
+        ---
+        hr: # 1998 hr ranking
+          - Mark McGwire
+          - Sammy Sosa
+        rbi:
+          # 1998 rbi ranking
+          - Sammy Sosa
+          - Ken Griffey""");
+    });
+
+    test('[Example 2.10]', () {
+      expectYamlLoads({
+        "hr": ["Mark McGwire", "Sammy Sosa"],
+        "rbi": ["Sammy Sosa", "Ken Griffey"]
+      },
+        """
+        ---
+        hr:
+          - Mark McGwire
+          # Following node labeled SS
+          - &SS Sammy Sosa
+        rbi:
+          - *SS # Subsequent occurrence
+          - Ken Griffey""");
+    });
+
+    test('[Example 2.11]', () {
+      var doc = deepEqualsMap();
+      doc[["Detroit Tigers", "Chicago cubs"]] = ["2001-07-23"];
+      doc[["New York Yankees", "Atlanta Braves"]] =
+        ["2001-07-02", "2001-08-12", "2001-08-14"];
+      expectYamlLoads(doc,
+        """
+        ? - Detroit Tigers
+          - Chicago cubs
+        :
+          - 2001-07-23
+
+        ? [ New York Yankees,
+            Atlanta Braves ]
+        : [ 2001-07-02, 2001-08-12,
+            2001-08-14 ]""");
+    });
+
+    test('[Example 2.12]', () {
+      expectYamlLoads([
+        {"item": "Super Hoop", "quantity": 1},
+        {"item": "Basketball", "quantity": 4},
+        {"item": "Big Shoes", "quantity": 1},
+      ],
+        """
+        ---
+        # Products purchased
+        - item    : Super Hoop
+          quantity: 1
+        - item    : Basketball
+          quantity: 4
+        - item    : Big Shoes
+          quantity: 1""");
+    });
+  });
+
+  group('2.3: Scalars', () {
+    test('[Example 2.13]', () {
+      expectYamlLoads(
+        cleanUpLiteral(
+        """
+        \\//||\\/||
+        // ||  ||__"""),
+        """
+        # ASCII Art
+        --- |
+          \\//||\\/||
+          // ||  ||__""");
+    });
+
+    test('[Example 2.14]', () {
+      expectYamlLoads("Mark McGwire's year was crippled by a knee injury.",
+        """
+        --- >
+          Mark McGwire's
+          year was crippled
+          by a knee injury.""");
+    });
+
+    test('[Example 2.15]', () {
+      expectYamlLoads(
+        cleanUpLiteral(
+        """
+        Sammy Sosa completed another fine season with great stats.
+
+          63 Home Runs
+          0.288 Batting Average
+
+        What a year!"""),
+        """
+        >
+         Sammy Sosa completed another
+         fine season with great stats.
+
+           63 Home Runs
+           0.288 Batting Average
+
+         What a year!""");
+    });
+
+    test('[Example 2.16]', () {
+      expectYamlLoads({
+        "name": "Mark McGwire",
+        "accomplishment": "Mark set a major league home run record in 1998.\n",
+        "stats": "65 Home Runs\n0.278 Batting Average"
+      },
+        """
+        name: Mark McGwire
+        accomplishment: >
+          Mark set a major league
+          home run record in 1998.
+        stats: |
+          65 Home Runs
+          0.278 Batting Average""");
+    });
+
+    test('[Example 2.17]', () {
+      expectYamlLoads({
+        "unicode": "Sosa did fine.\u263A",
+        "control": "\b1998\t1999\t2000\n",
+        "hex esc": "\r\n is \r\n",
+        "single": '"Howdy!" he cried.',
+        "quoted": " # Not a 'comment'.",
+        "tie-fighter": "|\\-*-/|"
+      },
+        """
+        unicode: "Sosa did fine.\\u263A"
+        control: "\\b1998\\t1999\\t2000\\n"
+        hex esc: "\\x0d\\x0a is \\r\\n"
+
+        single: '"Howdy!" he cried.'
+        quoted: ' # Not a ''comment''.'
+        tie-fighter: '|\\-*-/|'""");
+    });
+
+    test('[Example 2.18]', () {
+      expectYamlLoads({
+        "plain": "This unquoted scalar spans many lines.",
+        "quoted": "So does this quoted scalar.\n"
+      },
+        '''
+        plain:
+          This unquoted scalar
+          spans many lines.
+
+        quoted: "So does this
+          quoted scalar.\\n"''');
+    });
+  });
+
+  group('2.4: Tags', () {
+    test('[Example 2.19]', () {
+      expectYamlLoads({
+        "canonical": 12345,
+        "decimal": 12345,
+        "octal": 12,
+        "hexadecimal": 12
+      },
+        """
+        canonical: 12345
+        decimal: +12345
+        octal: 0o14
+        hexadecimal: 0xC""");
+    });
+
+    test('[Example 2.20]', () {
+      expectYamlLoads({
+        "canonical": 1230.15,
+        "exponential": 1230.15,
+        "fixed": 1230.15,
+        "negative infinity": -infinity,
+        "not a number": nan
+      },
+        """
+        canonical: 1.23015e+3
+        exponential: 12.3015e+02
+        fixed: 1230.15
+        negative infinity: -.inf
+        not a number: .NaN""");
+    });
+
+    test('[Example 2.21]', () {
+      var doc = deepEqualsMap({
+        "booleans": [true, false],
+        "string": "012345"
+      });
+      doc[null] = null;
+      expectYamlLoads(doc,
+        """
+        null:
+        booleans: [ true, false ]
+        string: '012345'""");
+    });
+
+    // Examples 2.22 through 2.26 test custom tag URIs, which this
+    // implementation currently doesn't plan to support.
+  });
+
+  group('2.5 Full Length Example', () {
+    // Example 2.27 tests custom tag URIs, which this implementation currently
+    // doesn't plan to support.
+
+    test('[Example 2.28]', () {
+      expectYamlStreamLoads([
+        {
+          "Time": "2001-11-23 15:01:42 -5",
+          "User": "ed",
+          "Warning": "This is an error message for the log file"
+        },
+        {
+          "Time": "2001-11-23 15:02:31 -5",
+          "User": "ed",
+          "Warning": "A slightly different error message."
+        },
+        {
+          "DateTime": "2001-11-23 15:03:17 -5",
+          "User": "ed",
+          "Fatal": 'Unknown variable "bar"',
+          "Stack": [
+            {
+              "file": "TopClass.py",
+              "line": 23,
+              "code": 'x = MoreObject("345\\n")\n'
+            },
+            {"file": "MoreClass.py", "line": 58, "code": "foo = bar"}
+          ]
+        }
+      ],
+        """
+        ---
+        Time: 2001-11-23 15:01:42 -5
+        User: ed
+        Warning:
+          This is an error message
+          for the log file
+        ---
+        Time: 2001-11-23 15:02:31 -5
+        User: ed
+        Warning:
+          A slightly different error
+          message.
+        ---
+        DateTime: 2001-11-23 15:03:17 -5
+        User: ed
+        Fatal:
+          Unknown variable "bar"
+        Stack:
+          - file: TopClass.py
+            line: 23
+            code: |
+              x = MoreObject("345\\n")
+          - file: MoreClass.py
+            line: 58
+            code: |-
+              foo = bar""");
+    });
+  });
+
+  // Chapter 3 just talks about the structure of loading and dumping Yaml.
+  // Chapter 4 explains conventions used in the spec.
+
+  // Chapter 5: Characters
+  group('5.1: Character Set', () {
+    expectAllowsCharacter(int charCode) {
+      var char = new String.fromCharCodes([charCode]);
+      expectYamlLoads('The character "$char" is allowed',
+          'The character "$char" is allowed');
+    }
+
+    expectAllowsQuotedCharacter(int charCode) {
+      var char = new String.fromCharCodes([charCode]);
+      expectYamlLoads("The character '$char' is allowed",
+          '"The character \'$char\' is allowed"');
+    }
+
+    expectDisallowsCharacter(int charCode) {
+      var char = new String.fromCharCodes([charCode]);
+      expectYamlFails('The character "$char" is disallowed');
+    }
+
+    test("doesn't include C0 control characters", () {
+      expectDisallowsCharacter(0x0);
+      expectDisallowsCharacter(0x8);
+      expectDisallowsCharacter(0x1F);
+    });
+
+    test("includes TAB", () => expectAllowsCharacter(0x9));
+    test("doesn't include DEL", () => expectDisallowsCharacter(0x7F));
+
+    test("doesn't include C1 control characters", () {
+      expectDisallowsCharacter(0x80);
+      expectDisallowsCharacter(0x8A);
+      expectDisallowsCharacter(0x9F);
+    });
+
+    test("includes NEL", () => expectAllowsCharacter(0x85));
+
+    group("within quoted strings", () {
+      test("includes DEL", () => expectAllowsQuotedCharacter(0x7F));
+      test("includes C1 control characters", () {
+        expectAllowsQuotedCharacter(0x80);
+        expectAllowsQuotedCharacter(0x8A);
+        expectAllowsQuotedCharacter(0x9F);
+      });
+    });
+  });
+
+  // Skipping section 5.2 (Character Encodings), since at the moment the module
+  // assumes that the client code is providing it with a string of the proper
+  // encoding.
+
+  group('5.3: Indicator Characters', () {
+    test('[Example 5.3]', () {
+      expectYamlLoads({
+        'sequence': ['one', 'two'],
+        'mapping': {'sky': 'blue', 'sea': 'green'}
+      },
+        """
+        sequence:
+        - one
+        - two
+        mapping:
+          ? sky
+          : blue
+          sea : green""");
+    });
+
+    test('[Example 5.4]', () {
+      expectYamlLoads({
+        'sequence': ['one', 'two'],
+        'mapping': {'sky': 'blue', 'sea': 'green'}
+      },
+        """
+        sequence: [ one, two, ]
+        mapping: { sky: blue, sea: green }""");
+    });
+
+    test('[Example 5.5]', () => expectYamlLoads(null, "# Comment only."));
+
+    // Skipping 5.6 because it uses an undefined tag.
+
+    test('[Example 5.7]', () {
+      expectYamlLoads({
+        'literal': "some\ntext\n",
+        'folded': "some text\n"
+      },
+        """
+        literal: |
+          some
+          text
+        folded: >
+          some
+          text
+        """);
+    });
+
+    test('[Example 5.8]', () {
+      expectYamlLoads({
+        'single': "text",
+        'double': "text"
+      },
+        """
+        single: 'text'
+        double: "text"
+        """);
+    });
+
+    test('[Example 5.9]', () {
+      expectYamlLoads("text",
+        """
+        %YAML 1.2
+        --- text""");
+    });
+
+    test('[Example 5.10]', () {
+      expectYamlFails("commercial-at: @text");
+      expectYamlFails("commercial-at: `text");
+    });
+  });
+
+  group('5.4: Line Break Characters', () {
+    group('include', () {
+      test('\\n', () => expectYamlLoads([1, 2], indentLiteral("- 1\n- 2")));
+      test('\\r', () => expectYamlLoads([1, 2], "- 1\r- 2"));
+    });
+
+    group('do not include', () {
+      test('form feed', () => expectYamlFails("- 1\x0C- 2"));
+      test('NEL', () => expectYamlLoads(["1\x85- 2"], "- 1\x85- 2"));
+      test('0x2028', () => expectYamlLoads(["1\u2028- 2"], "- 1\u2028- 2"));
+      test('0x2029', () => expectYamlLoads(["1\u2029- 2"], "- 1\u2029- 2"));
+    });
+
+    group('in a scalar context must be normalized', () {
+      test("from \\r to \\n", () =>
+            expectYamlLoads(["foo\nbar"], indentLiteral('- |\n  foo\r  bar')));
+      test("from \\r\\n to \\n", () =>
+            expectYamlLoads(["foo\nbar"], indentLiteral('- |\n  foo\r\n  bar')));
+    });
+
+    test('[Example 5.11]', () {
+      expectYamlLoads(
+        cleanUpLiteral("""
+        Line break (no glyph)
+        Line break (glyphed)"""),
+        """
+        |
+          Line break (no glyph)
+          Line break (glyphed)""");
+    });
+  });
+
+  group('5.5: White Space Characters', () {
+    test('[Example 5.12]', () {
+      expectYamlLoads({
+        "quoted": "Quoted \t",
+        "block": 'void main() {\n\tprintf("Hello, world!\\n");\n}\n'
+      }, 
+        """
+        # Tabs and spaces
+        quoted: "Quoted \t"
+        block:\t|
+          void main() {
+          \tprintf("Hello, world!\\n");
+          }
+        """);
+    });
+  });
+
+  group('5.7: Escaped Characters', () {
+    test('[Example 5.13]', () {
+      expectYamlLoads(
+        "Fun with \x5C "
+        "\x22 \x07 \x08 \x1B \x0C "
+        "\x0A \x0D \x09 \x0B \x00 "
+        "\x20 \xA0 \x85 \u2028 \u2029 "
+        "A A A",
+        '''
+        "Fun with \\\\
+        \\" \\a \\b \\e \\f \\
+        \\n \\r \\t \\v \\0 \\
+        \\  \\_ \\N \\L \\P \\
+        \\x41 \\u0041 \\U00000041"''');
+    });
+
+    test('[Example 5.14]', () {
+      expectYamlFails('Bad escape: "\\c"');
+      expectYamlFails('Bad escape: "\\xq-"');
+    });
+  });
+
+  // Chapter 6: Basic Structures
+  group('6.1: Indentation Spaces', () {
+    test('may not include TAB characters', () {
+      expectYamlFails(
+        """
+        -
+        \t- foo
+        \t- bar""");
+    });
+
+    test('must be the same for all sibling nodes', () {
+      expectYamlFails(
+        """
+        -
+          - foo
+         - bar""");
+    });
+
+    test('may be different for the children of sibling nodes', () {
+      expectYamlLoads([["foo"], ["bar"]],
+        """
+        -
+          - foo
+        -
+         - bar""");
+    });
+
+    test('[Example 6.1]', () {
+      expectYamlLoads({
+        "Not indented": {
+          "By one space": "By four\n  spaces\n",
+          "Flow style": [
+            "By two",
+            "Also by two",
+            "Still by two"
+          ]
+        }
+      },
+        """
+          # Leading comment line spaces are
+           # neither content nor indentation.
+            
+        Not indented:
+         By one space: |
+            By four
+              spaces
+         Flow style: [    # Leading spaces
+           By two,        # in flow style
+          Also by two,    # are neither
+          \tStill by two   # content nor
+            ]             # indentation.""");
+    });
+
+    test('[Example 6.2]', () {
+      expectYamlLoads({'a': ['b', ['c', 'd']]},
+        """
+        ? a
+        : -\tb
+          -  -\tc
+             - d""");
+    });
+  });
+
+  group('6.2: Separation Spaces', () {
+    test('[Example 6.3]', () {
+      expectYamlLoads([{'foo': 'bar'}, ['baz', 'baz']],
+        """
+        - foo:\t bar
+        - - baz
+          -\tbaz""");
+    });
+  });
+
+  group('6.3: Line Prefixes', () {
+    test('[Example 6.4]', () {
+      expectYamlLoads({
+        "plain": "text lines",
+        "quoted": "text lines",
+        "block": "text\n \tlines\n"
+      }, 
+        """
+        plain: text
+          lines
+        quoted: "text
+          \tlines"
+        block: |
+          text
+           \tlines
+        """);
+    });
+  });
+
+  group('6.4: Empty Lines', () {
+    test('[Example 6.5]', () {
+      expectYamlLoads({
+        "Folding": "Empty line\nas a line feed",
+        "Chomping": "Clipped empty lines\n",
+      },
+        """
+        Folding:
+          "Empty line
+           \t
+          as a line feed"
+        Chomping: |
+          Clipped empty lines
+         """);
+    });
+  });
+
+  group('6.5: Line Folding', () {
+    test('[Example 6.6]', () {
+      expectYamlLoads("trimmed\n\n\nas space",
+        """
+        >-
+          trimmed
+          
+         
+
+          as
+          space
+        """);
+    });
+
+    test('[Example 6.7]', () {
+      expectYamlLoads("foo \n\n\t bar\n\nbaz\n",
+        """
+        >
+          foo 
+         
+          \t bar
+
+          baz
+        """);
+    });
+
+    test('[Example 6.8]', () {
+      expectYamlLoads(" foo\nbar\nbaz ",
+        '''
+        "
+          foo 
+         
+          \t bar
+
+          baz
+        "''');
+    });
+  });
+
+  group('6.6: Comments', () {
+    test('must be separated from other tokens by white space characters', () {
+      expectYamlLoads("foo#bar", "foo#bar");
+      expectYamlLoads("foo:#bar", "foo:#bar");
+      expectYamlLoads("-#bar", "-#bar");
+    });
+
+    test('[Example 6.9]', () {
+      expectYamlLoads({'key': 'value'},
+        """
+        key:    # Comment
+          value""");
+    });
+
+    group('outside of scalar content', () {
+      test('may appear on a line of their own', () {
+        expectYamlLoads([1, 2],
+        """
+        - 1
+        # Comment
+        - 2""");
+      });
+
+      test('are independent of indentation level', () {
+        expectYamlLoads([[1, 2]],
+        """
+        -
+          - 1
+         # Comment
+          - 2""");
+      });
+
+      test('include lines containing only white space characters', () {
+        expectYamlLoads([1, 2],
+        """
+        - 1
+          \t  
+        - 2""");
+      });
+    });
+
+    group('within scalar content', () {
+      test('may not appear on a line of their own', () {
+        expectYamlLoads(["foo\n# not comment\nbar\n"],
+        """
+        - |
+          foo
+          # not comment
+          bar
+        """);
+      });
+
+      test("don't include lines containing only white space characters", () {
+        expectYamlLoads(["foo\n  \t   \nbar\n"],
+        """
+        - |
+          foo
+            \t   
+          bar
+        """);
+      });
+    });
+
+    test('[Example 6.10]', () {
+      expectYamlLoads(null,
+        """
+          # Comment
+           
+        """);
+    });
+
+    test('[Example 6.11]', () {
+      expectYamlLoads({'key': 'value'},
+        """
+        key:    # Comment
+                # lines
+          value
+        """);
+    });
+
+    group('ending a block scalar header', () {
+      test('may not be followed by additional comment lines', () {
+        expectYamlLoads(["# not comment\nfoo\n"],
+        """
+        - | # comment
+            # not comment
+            foo
+        """);
+      });
+    });
+  });
+
+  group('6.7: Separation Lines', () {
+    test('may not be used within implicit keys', () {
+      expectYamlFails(
+        """
+        [1,
+         2]: 3""");
+    });
+
+    test('[Example 6.12]', () {
+      var doc = deepEqualsMap();
+      doc[{'first': 'Sammy', 'last': 'Sosa'}] = {
+        'hr': 65,
+        'avg': 0.278
+      };
+      expectYamlLoads(doc,
+        """
+        { first: Sammy, last: Sosa }:
+        # Statistics:
+          hr:  # Home runs
+             65
+          avg: # Average
+           0.278""");
+    });
+  });
+
+  group('6.8: Directives', () {
+    // TODO(nweiz): assert that this produces a warning
+    test('[Example 6.13]', () {
+      expectYamlLoads("foo",
+        '''
+        %FOO  bar baz # Should be ignored
+                      # with a warning.
+        --- "foo"''');
+    });
+
+    // TODO(nweiz): assert that this produces a warning.
+    test('[Example 6.14]', () {
+      expectYamlLoads("foo",
+        '''
+        %YAML 1.3 # Attempt parsing
+                   # with a warning
+        ---
+        "foo"''');
+    });
+
+    test('[Example 6.15]', () {
+      expectYamlFails(
+        """
+        %YAML 1.2
+        %YAML 1.1
+        foo""");
+    });
+
+    test('[Example 6.16]', () {
+      expectYamlLoads("foo",
+        '''
+        %TAG !yaml! tag:yaml.org,2002:
+        ---
+        !yaml!str "foo"''');
+    });
+
+    test('[Example 6.17]', () {
+      expectYamlFails(
+        """
+        %TAG ! !foo
+        %TAG ! !foo
+        bar""");
+    });
+
+    // Examples 6.18 through 6.22 test custom tag URIs, which this
+    // implementation currently doesn't plan to support.
+  });
+
+  group('6.9: Node Properties', () {
+    test('may be specified in any order', () {
+      expectYamlLoads(["foo", "bar"],
+        """
+        - !!str &a1 foo
+        - &a2 !!str bar""");
+    });
+
+    test('[Example 6.23]', () {
+      expectYamlLoads({
+        "foo": "bar",
+        "baz": "foo"
+      },
+        '''
+        !!str &a1 "foo":
+          !!str bar
+        &a2 baz : *a1''');
+    });
+
+    // Example 6.24 tests custom tag URIs, which this implementation currently
+    // doesn't plan to support.
+
+    test('[Example 6.25]', () {
+      expectYamlFails("- !<!> foo");
+      expectYamlFails("- !<\$:?> foo");
+    });
+
+    // Examples 6.26 and 6.27 test custom tag URIs, which this implementation
+    // currently doesn't plan to support.
+
+    test('[Example 6.28]', () {
+      expectYamlLoads(["12", 12, "12"],
+        '''
+        # Assuming conventional resolution:
+        - "12"
+        - 12
+        - ! 12''');
+    });
+
+    test('[Example 6.29]', () {
+      expectYamlLoads({
+        "First occurrence": "Value",
+        "Second occurrence": "Value"
+      },
+        """
+        First occurrence: &anchor Value
+        Second occurrence: *anchor""");
+    });
+  });
+
+  // Chapter 7: Flow Styles
+  group('7.1: Alias Nodes', () {
+    test("must not use an anchor that doesn't previously occur", () {
+      expectYamlFails(
+        """
+        - *anchor
+        - &anchor foo""");
+    });
+
+    test("don't have to exist for a given anchor node", () {
+      expectYamlLoads(["foo"], "- &anchor foo");
+    });
+
+    group('must not specify', () {
+      test('tag properties', () => expectYamlFails(
+        """
+        - &anchor foo
+        - !str *anchor"""));
+
+      test('anchor properties', () => expectYamlFails(
+        """
+        - &anchor foo
+        - &anchor2 *anchor"""));
+
+      test('content', () => expectYamlFails(
+        """
+        - &anchor foo
+        - *anchor bar"""));
+    });
+
+    test('must preserve structural equality', () {
+      var doc = loadYaml(cleanUpLiteral(
+        """
+        anchor: &anchor [a, b, c]
+        alias: *anchor"""));
+      var anchorList = doc['anchor'];
+      var aliasList = doc['alias'];
+      expect(anchorList, same(aliasList));
+
+      doc = loadYaml(cleanUpLiteral(
+        """
+        ? &anchor [a, b, c]
+        : ? *anchor
+          : bar"""));
+      anchorList = doc.keys.first;
+      aliasList = doc[['a', 'b', 'c']].keys.first;
+      expect(anchorList, same(aliasList));
+    });
+
+    test('[Example 7.1]', () {
+      expectYamlLoads({
+        "First occurrence": "Foo",
+        "Second occurrence": "Foo",
+        "Override anchor": "Bar",
+        "Reuse anchor": "Bar",
+      },
+        """
+        First occurrence: &anchor Foo
+        Second occurrence: *anchor
+        Override anchor: &anchor Bar
+        Reuse anchor: *anchor""");
+    });
+  });
+
+  group('7.2: Empty Nodes', () {
+    test('[Example 7.2]', () {
+      expectYamlLoads({
+        "foo": "",
+        "": "bar"
+      },
+        """
+        {
+          foo : !!str,
+          !!str : bar,
+        }""");
+    });
+
+    test('[Example 7.3]', () {
+      var doc = deepEqualsMap({"foo": null});
+      doc[null] = "bar";
+      expectYamlLoads(doc,
+        """
+        {
+          ? foo :,
+          : bar,
+        }""");
+    });
+  });
+
+  group('7.3: Flow Scalar Styles', () {
+    test('[Example 7.4]', () {
+      expectYamlLoads({
+        "implicit block key": [{"implicit flow key": "value"}]
+      },
+        '''
+        "implicit block key" : [
+          "implicit flow key" : value,
+         ]''');
+    });
+
+    test('[Example 7.5]', () {
+      expectYamlLoads(
+        "folded to a space,\nto a line feed, or \t \tnon-content",
+        '''
+        "folded 
+        to a space,\t
+         
+        to a line feed, or \t\\
+         \\ \tnon-content"''');
+    });
+
+    test('[Example 7.6]', () {
+      expectYamlLoads(" 1st non-empty\n2nd non-empty 3rd non-empty ",
+        '''
+        " 1st non-empty
+
+         2nd non-empty 
+        \t3rd non-empty "''');
+    });
+
+    test('[Example 7.7]', () {
+      expectYamlLoads("here's to \"quotes\"", "'here''s to \"quotes\"'");
+    });
+
+    test('[Example 7.8]', () {
+      expectYamlLoads({
+        "implicit block key": [{"implicit flow key": "value"}]
+      },
+        """
+        'implicit block key' : [
+          'implicit flow key' : value,
+         ]""");
+    });
+
+    test('[Example 7.9]', () {
+      expectYamlLoads(" 1st non-empty\n2nd non-empty 3rd non-empty ",
+        """
+        ' 1st non-empty
+
+         2nd non-empty 
+        \t3rd non-empty '""");
+    });
+
+    test('[Example 7.10]', () {
+      expectYamlLoads([
+        "::vector", ": - ()", "Up, up, and away!", -123,
+        "http://example.com/foo#bar",
+        [
+          "::vector", ": - ()", "Up, up, and away!", -123,
+          "http://example.com/foo#bar"
+        ]
+      ],
+        '''
+        # Outside flow collection:
+        - ::vector
+        - ": - ()"
+        - Up, up, and away!
+        - -123
+        - http://example.com/foo#bar
+        # Inside flow collection:
+        - [ ::vector,
+          ": - ()",
+          "Up, up, and away!",
+          -123,
+          http://example.com/foo#bar ]''');
+    });
+
+    test('[Example 7.11]', () {
+      expectYamlLoads({
+        "implicit block key": [{"implicit flow key": "value"}]
+      },
+        """
+        implicit block key : [
+          implicit flow key : value,
+         ]""");
+    });
+
+    test('[Example 7.12]', () {
+      expectYamlLoads("1st non-empty\n2nd non-empty 3rd non-empty",
+        """
+        1st non-empty
+
+         2nd non-empty 
+        \t3rd non-empty""");
+    });
+  });
+
+  group('7.4: Flow Collection Styles', () {
+    test('[Example 7.13]', () {
+      expectYamlLoads([
+        ['one', 'two'],
+        ['three', 'four']
+      ],
+        """
+        - [ one, two, ]
+        - [three ,four]""");
+    });
+
+    test('[Example 7.14]', () {
+      expectYamlLoads([
+        "double quoted", "single quoted", "plain text", ["nested"],
+        {"single": "pair"}
+      ],
+        """
+        [
+        "double
+         quoted", 'single
+                   quoted',
+        plain
+         text, [ nested ],
+        single: pair,
+        ]""");
+    });
+
+    test('[Example 7.15]', () {
+      expectYamlLoads([
+        {"one": "two", "three": "four"},
+        {"five": "six", "seven": "eight"},
+      ],
+        """
+        - { one : two , three: four , }
+        - {five: six,seven : eight}""");
+    });
+
+    test('[Example 7.16]', () {
+      var doc = deepEqualsMap({
+        "explicit": "entry",
+        "implicit": "entry"
+      });
+      doc[null] = null;
+      expectYamlLoads(doc,
+        """
+        {
+        ? explicit: entry,
+        implicit: entry,
+        ?
+        }""");
+    });
+
+    test('[Example 7.17]', () {
+      var doc = deepEqualsMap({
+        "unquoted": "separate",
+        "http://foo.com": null,
+        "omitted value": null
+      });
+      doc[null] = "omitted key";
+      expectYamlLoads(doc,
+        '''
+        {
+        unquoted : "separate",
+        http://foo.com,
+        omitted value:,
+        : omitted key,
+        }''');
+    });
+
+    test('[Example 7.18]', () {
+      expectYamlLoads({
+        "adjacent": "value",
+        "readable": "value",
+        "empty": null
+      },
+        '''
+        {
+        "adjacent":value,
+        "readable": value,
+        "empty":
+        }''');
+    });
+
+    test('[Example 7.19]', () {
+      expectYamlLoads([{"foo": "bar"}],
+        """
+        [
+        foo: bar
+        ]""");
+    });
+
+    test('[Example 7.20]', () {
+      expectYamlLoads([{"foo bar": "baz"}],
+        """
+        [
+        ? foo
+         bar : baz
+        ]""");
+    });
+
+    test('[Example 7.21]', () {
+      var el1 = deepEqualsMap();
+      el1[null] = "empty key entry";
+
+      var el2 = deepEqualsMap();
+      el2[{"JSON": "like"}] = "adjacent";
+
+      expectYamlLoads([[{"YAML": "separate"}], [el1], [el2]],
+        """
+        - [ YAML : separate ]
+        - [ : empty key entry ]
+        - [ {JSON: like}:adjacent ]""");
+    });
+
+    // TODO(nweiz): enable this when we throw an error for long or multiline
+    // keys.
+    // test('[Example 7.22]', () {
+    //   expectYamlFails(
+    //     """
+    //     [ foo
+    //      bar: invalid ]""");
+    //
+    //   var dotList = new List.filled(1024, ' ');
+    //   var dots = dotList.join();
+    //   expectYamlFails('[ "foo...$dots...bar": invalid ]');
+    // });
+  });
+
+  group('7.5: Flow Nodes', () {
+    test('[Example 7.23]', () {
+      expectYamlLoads([["a", "b"], {"a": "b"}, "a", "b", "c"],
+        """
+        - [ a, b ]
+        - { a: b }
+        - "a"
+        - 'b'
+        - c""");
+    });
+
+    test('[Example 7.24]', () {
+      expectYamlLoads(["a", "b", "c", "c", ""],
+        """
+        - !!str "a"
+        - 'b'
+        - &anchor "c"
+        - *anchor
+        - !!str""");
+    });
+  });
+
+  // Chapter 8: Block Styles
+  group('8.1: Block Scalar Styles', () {
+    test('[Example 8.1]', () {
+      expectYamlLoads(["literal\n", " folded\n", "keep\n\n", " strip"],
+        """
+        - | # Empty header
+         literal
+        - >1 # Indentation indicator
+          folded
+        - |+ # Chomping indicator
+         keep
+
+        - >1- # Both indicators
+          strip""");
+    });
+
+    test('[Example 8.2]', () {
+      // Note: in the spec, the fourth element in this array is listed as
+      // "\t detected\n", not "\t\ndetected\n". However, I'm reasonably
+      // confident that "\t\ndetected\n" is correct when parsed according to the
+      // rest of the spec.
+      expectYamlLoads([
+        "detected\n",
+        "\n\n# detected\n",
+        " explicit\n",
+        "\t\ndetected\n"
+      ],
+        """
+        - |
+         detected
+        - >
+         
+          
+          # detected
+        - |1
+          explicit
+        - >
+         \t
+         detected
+        """);
+    });
+
+    test('[Example 8.3]', () {
+      expectYamlFails(
+        """
+        - |
+          
+         text""");
+
+      expectYamlFails(
+        """
+        - >
+          text
+         text""");
+
+      expectYamlFails(
+        """
+        - |2
+         text""");
+    });
+
+    test('[Example 8.4]', () {
+      expectYamlLoads({"strip": "text", "clip": "text\n", "keep": "text\n"},
+        """
+        strip: |-
+          text
+        clip: |
+          text
+        keep: |+
+          text
+        """);
+    });
+
+    test('[Example 8.5]', () {
+      // This example in the spec only includes a single newline in the "keep"
+      // value, but as far as I can tell that's not how it's supposed to be
+      // parsed according to the rest of the spec.
+      expectYamlLoads({
+        "strip": "# text",
+        "clip": "# text\n",
+        "keep": "# text\n\n"
+      },
+        """
+         # Strip
+          # Comments:
+        strip: |-
+          # text
+          
+         # Clip
+          # comments:
+
+        clip: |
+          # text
+         
+         # Keep
+          # comments:
+
+        keep: |+
+          # text
+
+         # Trail
+          # comments.
+        """);
+    });
+
+    test('[Example 8.6]', () {
+      expectYamlLoads({"strip": "", "clip": "", "keep": "\n"},
+        """
+        strip: >-
+
+        clip: >
+
+        keep: |+
+
+        """);
+    });
+
+    test('[Example 8.7]', () {
+      expectYamlLoads("literal\n\ttext\n",
+        """
+        |
+         literal
+         \ttext
+        """);
+    });
+
+    test('[Example 8.8]', () {
+      expectYamlLoads("\n\nliteral\n \n\ntext\n",
+        """
+        |
+         
+          
+          literal
+           
+          
+          text
+
+         # Comment""");
+    });
+
+    test('[Example 8.9]', () {
+      expectYamlLoads("folded text\n",
+        """
+        >
+         folded
+         text
+        """);
+    });
+
+    test('[Example 8.10]', () {
+      expectYamlLoads(
+        cleanUpLiteral("""
+
+        folded line
+        next line
+          * bullet
+
+          * list
+          * lines
+
+        last line
+        """),
+        """
+        >
+
+         folded
+         line
+
+         next
+         line
+           * bullet
+
+           * list
+           * lines
+
+         last
+         line
+
+        # Comment""");
+    });
+
+    // Examples 8.11 through 8.13 are duplicates of 8.10.
+  });
+
+  group('8.2: Block Collection Styles', () {
+    test('[Example 8.14]', () {
+      expectYamlLoads({"block sequence": ["one", {"two": "three"}]},
+        """
+        block sequence:
+          - one
+          - two : three""");
+    });
+
+    test('[Example 8.15]', () {
+      expectYamlLoads([
+        null, "block node\n", ["one", "two"], {"one": "two"}
+      ],
+        """
+        - # Empty
+        - |
+         block node
+        - - one # Compact
+          - two # sequence
+        - one: two # Compact mapping""");
+    });
+
+    test('[Example 8.16]', () {
+      expectYamlLoads({"block mapping": {"key": "value"}},
+        """
+        block mapping:
+         key: value""");
+    });
+
+    test('[Example 8.17]', () {
+      expectYamlLoads({
+        "explicit key": null,
+        "block key\n": ["one", "two"]
+      },
+        """
+        ? explicit key # Empty value
+        ? |
+          block key
+        : - one # Explicit compact
+          - two # block value""");
+    });
+
+    test('[Example 8.18]', () {
+      var doc = deepEqualsMap({
+        'plain key': 'in-line value',
+        "quoted key": ["entry"]
+      });
+      doc[null] = null;
+      expectYamlLoads(doc,
+        '''
+        plain key: in-line value
+        : # Both empty
+        "quoted key":
+        - entry''');
+    });
+
+    test('[Example 8.19]', () {
+      var el = deepEqualsMap();
+      el[{'earth': 'blue'}] = {'moon': 'white'};
+      expectYamlLoads([{'sun': 'yellow'}, el],
+        """
+        - sun: yellow
+        - ? earth: blue
+          : moon: white""");
+    });
+
+    test('[Example 8.20]', () {
+      expectYamlLoads(["flow in block", "Block scalar\n", {"foo": "bar"}],
+        '''
+        -
+          "flow in block"
+        - >
+         Block scalar
+        - !!map # Block collection
+          foo : bar''');
+    });
+
+    test('[Example 8.21]', () {
+      // The spec doesn't include a newline after "value" in the parsed map, but
+      // the block scalar is clipped so it should be retained.
+      expectYamlLoads({"literal": "value\n", "folded": "value"},
+        """
+        literal: |2
+          value
+        folded:
+           !!str
+          >1
+         value""");
+    });
+
+    test('[Example 8.22]', () {
+      expectYamlLoads({
+        "sequence": ["entry", ["nested"]],
+        "mapping": {"foo": "bar"}
+      },
+        """
+        sequence: !!seq
+        - entry
+        - !!seq
+         - nested
+        mapping: !!map
+         foo: bar""");
+    });
+  });
+
+  // Chapter 9: YAML Character Stream
+  group('9.1: Documents', () {
+    // Example 9.1 tests the use of a BOM, which this implementation currently
+    // doesn't plan to support.
+
+    test('[Example 9.2]', () {
+      expectYamlLoads("Document",
+        """
+        %YAML 1.2
+        ---
+        Document
+        ... # Suffix""");
+    });
+
+    test('[Example 9.3]', () {
+      // The spec example indicates that the comment after "%!PS-Adobe-2.0"
+      // should be stripped, which would imply that that line is not part of the
+      // literal defined by the "|". The rest of the spec is ambiguous on this
+      // point; the allowable indentation for non-indented literal content is
+      // not clearly explained. However, if both the "|" and the text were
+      // indented the same amount, the text would be part of the literal, which
+      // implies that the spec's parse of this document is incorrect.
+      expectYamlStreamLoads(
+        ["Bare document", "%!PS-Adobe-2.0 # Not the first line\n"],
+        """
+        Bare
+        document
+        ...
+        # No document
+        ...
+        |
+        %!PS-Adobe-2.0 # Not the first line
+        """);
+    });
+
+    test('[Example 9.4]', () {
+      expectYamlStreamLoads([{"matches %": 20}, null],
+        """
+        ---
+        { matches
+        % : 20 }
+        ...
+        ---
+        # Empty
+        ...""");
+    });
+
+    test('[Example 9.5]', () {
+      // The spec doesn't have a space between the second
+      // "YAML" and "1.2", but this seems to be a typo.
+      expectYamlStreamLoads(["%!PS-Adobe-2.0\n", null],
+        """
+        %YAML 1.2
+        --- |
+        %!PS-Adobe-2.0
+        ...
+        %YAML 1.2
+        ---
+        # Empty
+        ...""");
+    });
+
+    test('[Example 9.6]', () {
+      expectYamlStreamLoads(["Document", null, {"matches %": 20}],
+        """
+        Document
+        ---
+        # Empty
+        ...
+        %YAML 1.2
+        ---
+        matches %: 20""");
+    });
+  });
+
+  // Chapter 10: Recommended Schemas
+  group('10.1: Failsafe Schema', () {
+    test('[Example 10.1]', () {
+      expectYamlLoads({
+        "Block style": {
+          "Clark": "Evans",
+          "Ingy": "döt Net",
+          "Oren": "Ben-Kiki"
+        },
+        "Flow style": {
+          "Clark": "Evans",
+          "Ingy": "döt Net",
+          "Oren": "Ben-Kiki"
+        }
+      },
+        """
+        Block style: !!map
+          Clark : Evans
+          Ingy  : döt Net
+          Oren  : Ben-Kiki
+
+        Flow style: !!map { Clark: Evans, Ingy: döt Net, Oren: Ben-Kiki }""");
+    });
+
+    test('[Example 10.2]', () {
+      expectYamlLoads({
+        "Block style": ["Clark Evans", "Ingy döt Net", "Oren Ben-Kiki"],
+        "Flow style": ["Clark Evans", "Ingy döt Net", "Oren Ben-Kiki"]
+      },
+        """
+        Block style: !!seq
+        - Clark Evans
+        - Ingy döt Net
+        - Oren Ben-Kiki
+
+        Flow style: !!seq [ Clark Evans, Ingy döt Net, Oren Ben-Kiki ]""");
+    });
+
+    test('[Example 10.3]', () {
+      expectYamlLoads({
+        "Block style": "String: just a theory.",
+        "Flow style": "String: just a theory."
+      },
+        '''
+        Block style: !!str |-
+          String: just a theory.
+
+        Flow style: !!str "String: just a theory."''');
+    });
+  });
+
+  group('10.2: JSON Schema', () {
+    // test('[Example 10.4]', () {
+    //   var doc = deepEqualsMap({"key with null value": null});
+    //   doc[null] = "value for null key";
+    //   expectYamlStreamLoads(doc,
+    //     """
+    //     !!null null: value for null key
+    //     key with null value: !!null null""");
+    // });
+
+    // test('[Example 10.5]', () {
+    //   expectYamlStreamLoads({
+    //     "YAML is a superset of JSON": true,
+    //     "Pluto is a planet": false
+    //   },
+    //     """
+    //     YAML is a superset of JSON: !!bool true
+    //     Pluto is a planet: !!bool false""");
+    // });
+
+    // test('[Example 10.6]', () {
+    //   expectYamlStreamLoads({
+    //     "negative": -12,
+    //     "zero": 0,
+    //     "positive": 34
+    //   },
+    //     """
+    //     negative: !!int -12
+    //     zero: !!int 0
+    //     positive: !!int 34""");
+    // });
+
+    // test('[Example 10.7]', () {
+    //   expectYamlStreamLoads({
+    //     "negative": -1,
+    //     "zero": 0,
+    //     "positive": 23000,
+    //     "infinity": infinity,
+    //     "not a number": nan
+    //   },
+    //     """
+    //     negative: !!float -1
+    //     zero: !!float 0
+    //     positive: !!float 2.3e4
+    //     infinity: !!float .inf
+    //     not a number: !!float .nan""");
+    // });
+
+    // test('[Example 10.8]', () {
+    //   expectYamlStreamLoads({
+    //     "A null": null,
+    //     "Booleans": [true, false],
+    //     "Integers": [0, -0, 3, -19],
+    //     "Floats": [0, 0, 12000, -200000],
+    //     // Despite being invalid in the JSON schema, these values are valid in
+    //     // the core schema which this implementation supports.
+    //     "Invalid": [ true, null, 7, 0x3A, 12.3]
+    //   },
+    //     """
+    //     A null: null
+    //     Booleans: [ true, false ]
+    //     Integers: [ 0, -0, 3, -19 ]
+    //     Floats: [ 0., -0.0, 12e03, -2E+05 ]
+    //     Invalid: [ True, Null, 0o7, 0x3A, +12.3 ]""");
+    // });
+  });
+
+  group('10.3: Core Schema', () {
+    test('[Example 10.9]', () {
+      expectYamlLoads({
+        "A null": null,
+        "Also a null": null,
+        "Not a null": "",
+        "Booleans": [true, true, false, false],
+        "Integers": [0, 7, 0x3A, -19],
+        "Floats": [0, 0, 0.5, 12000, -200000],
+        "Also floats": [infinity, -infinity, infinity, nan]
+      },
+        '''
+        A null: null
+        Also a null: # Empty
+        Not a null: ""
+        Booleans: [ true, True, false, FALSE ]
+        Integers: [ 0, 0o7, 0x3A, -19 ]
+        Floats: [ 0., -0.0, .5, +12e03, -2E+05 ]
+        Also floats: [ .inf, -.Inf, +.INF, .NAN ]''');
+    });
+  });
+}
diff --git a/mojo/public/tools/dart_pkg.py b/mojo/public/tools/dart_pkg.py
index b3e1404..611ef85 100755
--- a/mojo/public/tools/dart_pkg.py
+++ b/mojo/public/tools/dart_pkg.py
@@ -302,15 +302,6 @@
   package_path = os.path.join(args.package_root, args.package_name)
   link(lib_path, package_path)
 
-  # Symlink non-dart-pkg dependent packages
-  dep_packages = os.path.join(common_source_prefix, 'packages')
-  if os.path.exists(dep_packages):
-    for package in os.listdir(dep_packages):
-      source = os.path.join(dep_packages, package)
-      target = os.path.join(args.package_root, package)
-      if not os.path.exists(target):
-        link(source, target)
-
   # TODO(zra): Remove when bindings are generated by the mojom package and
   # checked in.
   # Copy generated bindings back to the source directory.
diff --git a/mojo/public/tools/git/dart_pub_get.py b/mojo/public/tools/git/dart_pub_get.py
deleted file mode 100755
index 8d4106b..0000000
--- a/mojo/public/tools/git/dart_pub_get.py
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/usr/bin/python
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""This script runs "pub get" on all directories within the tree that have
-pubspec.yaml files.
-
-See https://www.dartlang.org/tools/pub/get-started.html for information about
-the pub tool."""
-
-import argparse
-import os
-import subprocess
-import sys
-
-def pub_get(dart_sdk_path, target_directory, upgrade):
-  cmd = [
-    os.path.join(dart_sdk_path, "bin/pub")
-  ]
-  if upgrade:
-    cmd.extend(["upgrade"])
-  else:
-    cmd.extend(["get"])
-
-  # Cache the downloaded pubs inside the repo to avoid the chance of multiple
-  # simultaneous builds in different repos stomping on each other.
-  env = os.environ.copy()
-  env["PUB_CACHE"] = os.path.join(os.getcwd(), "dart-pub-cache")
-  try:
-      subprocess.check_output(cmd, shell=False,
-                              stderr=subprocess.STDOUT,
-                              cwd=target_directory,
-                              env=env)
-  except subprocess.CalledProcessError as e:
-    print('Error running pub get in %s' % target_directory)
-    print(e.output)
-    raise e
-
-
-
-def main(repository_root, dart_sdk_path, dirs_to_ignore, upgrade):
-  os.chdir(repository_root)
-
-  # Relativize dart_sdk_path to repository_root.
-  dart_sdk_path_from_root = os.path.join(repository_root,
-      os.path.relpath(dart_sdk_path, repository_root))
-
-  cmd = ["git", "ls-files", "*/pubspec.yaml"]
-  pubspec_yaml_files = subprocess.check_output(cmd,
-                                               shell=False,
-                                               stderr=subprocess.STDOUT)
-
-  for f in pubspec_yaml_files.split():
-    ignore = reduce(lambda x, y: x or f.startswith(y), dirs_to_ignore, False)
-    if ignore:
-      continue
-    pub_get(dart_sdk_path_from_root, os.path.dirname(f), upgrade)
-
-
-if __name__ == '__main__':
-  parser = argparse.ArgumentParser(
-      description="Run 'pub get' on all directories with checked-in "
-                  "pubspec.yaml files")
-  parser.add_argument("--repository-root",
-                      metavar="<repository-root>",
-                      type=str,
-                      required=True,
-                      help="Path to the root of the Git repository, "
-                           "specified as a relative path from this directory.")
-  parser.add_argument("--dart-sdk-directory",
-                      metavar="<dart-sdk-directory>",
-                      type=str,
-                      required=True,
-                      help="Path to the directory containing the Dart SDK, "
-                           "specified as a relative path from this directory.")
-  parser.add_argument("--dirs-to-ignore",
-                      metavar="<dir>",
-                      nargs="+",
-                      default=[],
-                      type=str,
-                      help="Optional list of directories to ignore, specified "
-                           "relative to the root of the repo. 'pub get' will "
-                           "not be run for any subdirectories of these "
-                           "directories.")
-  parser.add_argument("--upgrade",
-                      action="store_true",
-                      default=False,
-                      help="Upgrade pub package dependencies")
-  args = parser.parse_args()
-  _current_path = os.path.dirname(os.path.realpath(__file__))
-  _repository_root = os.path.join(_current_path, args.repository_root)
-  _dart_sdk_path = os.path.join(_current_path, args.dart_sdk_directory)
-  sys.exit(
-      main(_repository_root, _dart_sdk_path, args.dirs_to_ignore, args.upgrade))
diff --git a/mojo/tools/get_test_list.py b/mojo/tools/get_test_list.py
index c98a3fb..f96ecca 100755
--- a/mojo/tools/get_test_list.py
+++ b/mojo/tools/get_test_list.py
@@ -157,7 +157,7 @@
     AddEntry("Dart mojom package generate tests",
         [os.path.join("third_party", "dart-sdk", "dart-sdk", "bin", "dart"),
          "--checked",
-         "-p", os.path.join("mojo", "public", "dart", "mojom", "packages"),
+         "-p", os.path.join(build_dir, "gen", "dart-pkg", "packages"),
          os.path.join(
            "mojo", "public", "dart", "mojom", "test", "generate_test.dart")])
 
diff --git a/services/dart/dart_apptests/BUILD.gn b/services/dart/dart_apptests/BUILD.gn
index c598b06..bcc247c 100644
--- a/services/dart/dart_apptests/BUILD.gn
+++ b/services/dart/dart_apptests/BUILD.gn
@@ -21,7 +21,6 @@
   deps = [
     "//mojo/dart/mojo_services",
     "//mojo/public/dart",
-    "//third_party/dart-pkg",
     "//mojo/public/interfaces/bindings/tests:versioning_test_client_interfaces",
     "//mojo/public/interfaces/bindings/tests:versioning_test_service_interfaces",
     "//services/dart/test/echo",
diff --git a/third_party/dart-pkg/BUILD.gn b/third_party/dart-pkg/BUILD.gn
deleted file mode 100644
index 8df39ea..0000000
--- a/third_party/dart-pkg/BUILD.gn
+++ /dev/null
@@ -1,70 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//mojo/public/dart/rules.gni")
-
-group("dart-pkg") {
-  deps = [
-    ":archive",
-    ":args",
-    ":box2d",
-    ":cassowary",
-    ":collection",
-    ":crypto",
-    ":path",
-    ":quiver",
-    ":source_span",
-    ":string_scanner",
-    ":vector_math",
-    ":yaml",
-  ]
-}
-
-dart_pkg("archive") {
-  pkg_dir = "//third_party/dart-pkg/archive"
-}
-
-dart_pkg("args") {
-  pkg_dir = "//third_party/dart-pkg/args"
-}
-
-dart_pkg("box2d") {
-  pkg_dir = "//third_party/dart-pkg/box2d"
-}
-
-dart_pkg("cassowary") {
-  pkg_dir = "//third_party/dart-pkg/cassowary"
-}
-
-dart_pkg("collection") {
-  pkg_dir = "//third_party/dart-pkg/collection"
-}
-
-dart_pkg("crypto") {
-  pkg_dir = "//third_party/dart-pkg/crypto"
-}
-
-dart_pkg("path") {
-  pkg_dir = "//third_party/dart-pkg/path"
-}
-
-dart_pkg("quiver") {
-  pkg_dir = "//third_party/dart-pkg/quiver"
-}
-
-dart_pkg("source_span") {
-  pkg_dir = "//third_party/dart-pkg/source_span"
-}
-
-dart_pkg("string_scanner") {
-  pkg_dir = "//third_party/dart-pkg/string_scanner"
-}
-
-dart_pkg("vector_math") {
-  pkg_dir = "//third_party/dart-pkg/vector_math"
-}
-
-dart_pkg("yaml") {
-  pkg_dir = "//third_party/dart-pkg/yaml"
-}
